diff --git a/accessibility-checker-extension/webpack.config.js b/accessibility-checker-extension/webpack.config.js index b0c097010..52d6b977a 100644 --- a/accessibility-checker-extension/webpack.config.js +++ b/accessibility-checker-extension/webpack.config.js @@ -190,7 +190,7 @@ module.exports = { return false; } // Exclude 2023.01.* through 2023.04.* versions - if (/[/\\]2023\.(01|02|03|04)\.[^/\\]*[/\\]/.test(resourcePath)) { + if (/[/\\]2023\.(01|02|03|04|05|06|07)\.[^/\\]*[/\\]/.test(resourcePath)) { return false; } return true; diff --git a/rule-server/src/static/archives.json b/rule-server/src/static/archives.json index 19bf891b9..f2c9970d7 100644 --- a/rule-server/src/static/archives.json +++ b/rule-server/src/static/archives.json @@ -4,6 +4,12 @@ "name": "Latest Deployment", "path": "/archives/latest" }, + { + "id": "13July2026", + "name": "13 July 2026 Deployment (IBM 7.3)", + "version": "4.0.27", + "path": "/archives/2026.07.13" + }, { "id": "19May2026", "name": "19 May 2026 Deployment (IBM 7.3)", @@ -229,19 +235,22 @@ "id": "26July2023", "name": "26 July 2023 Deployment (IBM 7.2)", "version": "3.1.58", - "path": "/archives/2023.07.26" + "path": "/archives/2023.07.26", + "hidden": true }, { "id": "01July2023", "name": "01 July 2023 Deployment (IBM 7.2)", "version": "3.1.51", - "path": "/archives/2023.07.01" + "path": "/archives/2023.07.01", + "hidden": true }, { "id": "26May2023", "name": "26 May 2023 Deployment (IBM 7.2)", "version": "3.1.49", - "path": "/archives/2023.05.26" + "path": "/archives/2023.05.26", + "hidden": true }, { "id": "15May2023", diff --git a/rule-server/src/static/archives/2026.07.13/doc/assets/NeedsReview16.svg b/rule-server/src/static/archives/2026.07.13/doc/assets/NeedsReview16.svg new file mode 100644 index 000000000..917834a38 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/assets/NeedsReview16.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + diff --git a/rule-server/src/static/archives/2026.07.13/doc/assets/Recommendation16.svg b/rule-server/src/static/archives/2026.07.13/doc/assets/Recommendation16.svg new file mode 100644 index 000000000..b57dc73d5 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/assets/Recommendation16.svg @@ -0,0 +1,15 @@ + + + + + + +i + diff --git a/rule-server/src/static/archives/2026.07.13/doc/assets/Violation16.svg b/rule-server/src/static/archives/2026.07.13/doc/assets/Violation16.svg new file mode 100644 index 000000000..5f8c9c710 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/assets/Violation16.svg @@ -0,0 +1,13 @@ + + + + + + + + diff --git a/rule-server/src/static/archives/2026.07.13/doc/common/help.css b/rule-server/src/static/archives/2026.07.13/doc/common/help.css new file mode 100644 index 000000000..813063236 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/common/help.css @@ -0,0 +1,268 @@ +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +@import url("https://1.www.s81c.com/common/carbon-for-ibm-dotcom/tag/v1/latest/plex.css"); +@import url('https://unpkg.com/carbon-components@10.58.15/css/carbon-components.min.css'); +@import url("https://1.www.s81c.com/common/carbon-for-ibm-dotcom/tag/v1/latest/themes.css"); + +bx-list-item>code, p>code, td>code { + background-color: var(--cds-layer); + border-radius: 4px; + bottom: 0.0625em; + color: var(--cds-text-primary); + display: inline; + font-size: .75rem; + font-size: .875em; + font-weight: 400; + letter-spacing: .32px; + line-height: 1.33333; + padding: 0 0.5em; + position: relative; +} + +.toolHelp a { + color: var(--cds-link-primary) +} + +.toolHelp .toolMain p ~ p { + margin-top: .5rem; +} + +.toolHelp .toolHead h3 { + font-family: 'IBM Plex Sans','Helvetica Neue',Arial,sans-serif; + font-style: normal; + font-weight: 600; + font-size: 16px; + line-height: 24px; +} + +.toolHelp .toolHead .issueLevel { + font-family: 'IBM Plex Sans','Helvetica Neue',Arial,sans-serif; + font-style: normal; + font-weight: 400; + font-size: 12px; + line-height: 16px; +} + +.toolHelp .toolHead #ruleMessage { + font-family: 'IBM Plex Sans','Helvetica Neue',Arial,sans-serif; + font-style: normal; + font-weight: 600; + font-size: 16px; + line-height: 24px; + margin-top: .5rem; + margin-bottom: .5rem; +} + +.toolHelp .toolHead #groupLabel { + font-family: 'IBM Plex Sans','Helvetica Neue',Arial,sans-serif; + font-style: normal; + font-weight: 400; + font-size: 12px; + line-height: 16px; +} + +/* productive-heading-03 */ +.toolHelp .toolMain h3 { + font-family: 'IBM Plex Sans','Helvetica Neue',Arial,sans-serif; + font-style: normal; + font-weight: 600; + font-size: 16px; + line-height: 24px; +} + +.toolHelp .toolSide .bx--list__item { + color: black; + font-size: 0.875rem; + line-height: 18px; +} + +/* productive-heading-03 */ +.toolHelp .toolSide h3 { + font-family: 'IBM Plex Sans','Helvetica Neue',Arial,sans-serif; + font-style: normal; + font-weight: 600; + font-size: 16px; + line-height: 24px; +} + +@media (min-width: 42rem) { + html, body, .toolHelp .bx--row:nth-child(2) { + height: 100%; + } +} +body { + font-family: 'IBM Plex Sans','Helvetica Neue',Arial,sans-serif; + color: var(--cds-text-primary); + background-color: var(--cds-ui-background); +} + +.toolHelp { + padding: 0px; + margin: 0px; + max-width: 100%; + background-color: #e8daff; +} + +.toolHelp p { + font-family: 'IBM Plex Sans','Helvetica Neue',Arial,sans-serif; +font-style: normal; +font-weight: 400; +font-size: 14px; +line-height: 20px; +/* or 143% */ + +letter-spacing: 0.16px; +} + +.dds-theme-zone-g90 .toolHelp { + background-color: #31135E; +} + +.toolHelp .bx--row { + margin: 0px; +} + +.toolHelp .toolHead { + margin-bottom: 1rem; + padding-top: 1rem; +} +.toolHelp .toolMain { + background-color: var(--cds-ui-background); + padding-top: 1rem; + padding-bottom: 1rem; + border-top: solid var(--cds-text-primary) 1px; +} +.toolHelp .toolMain h2 { + margin-top: 32px; + margin-bottom: 0.5rem; +} +.toolHelp .toolMain h3 { + margin-top: 1.5rem; + margin-bottom: 0.5rem; +} +.toolHelp .toolMain p { + margin-top: 0px; +} + +.toolHelp .toolSide { + padding: 16px 16px 16px 32px; + background-color: var(--cds-ui-background); + color: var(--cds-text-primary); + border-top: solid var(--cds-text-primary) 1px; +} +@media (min-width: 42rem) { + .toolHelp .toolSide { + border-left: solid var(--cds-text-primary) 1px; + } +} + +.toolHelp .toolSide h2 { + margin-top: 32px; + margin-bottom: 0.5rem; +} +.toolHelp .toolSide h3 { + margin-top: 1.5rem; + margin-bottom: 0.5rem; +} +.toolHelp .toolSide p { + margin-top: 0px; +} +@media (min-width: 66rem) { + .toolHelp .toolMain p, bx-list-item { + max-width: 66.66%; + } +} +cds-code-snippet[type="multi"]::after { + height: 0px; +} + +#ruleInfo { + margin-top: 1rem; +} + +#ruleInfo p { + font-size: 14px; +} + +mark-down table tbody tr:hover { + background: var(--cds-layer-hover); +} +mark-down table tbody tr:hover td, mark-down table tbody tr:hover th { + background: var(--cds-layer-hover); + -webkit-border-after: 1px solid var(--cds-layer-hover); + border-block-end: 1px solid var(--cds-layer-hover); + -webkit-border-before: 1px solid var(--cds-layer-hover); + border-block-start: 1px solid var(--cds-layer-hover); + color: var(--cds-text-primary,#161616); +} + +mark-down table { + margin-top: 1rem; + width: 100%; +} + +@media (min-width: 66rem) { + mark-down table { + max-width: 66.66%; + } +} + +mark-down table thead { + font-size: var(--cds-heading-compact-01-font-size,0.875rem); + font-weight: var(--cds-heading-compact-01-font-weight,600); + line-height: var(--cds-heading-compact-01-line-height,1.28572); + letter-spacing: var(--cds-heading-compact-01-letter-spacing,0.16px); + background-color: var(--cds-layer-accent); +} + +mark-down table tr { + border: none; + block-size: 3rem; + inline-size: 100%; +} + +mark-down table th { + background-color: var(--cds-layer-accent); + color: var(--cds-text-primary,#161616); + -webkit-padding-end: 1rem; + padding-inline-end: 1rem; + -webkit-padding-start: 1rem; + padding-inline-start: 1rem; +} + +mark-down table td, mark-down table th { + text-align: start; + vertical-align: middle; +} + +mark-down table tbody { + font-size: var(--cds-body-compact-01-font-size,0.875rem); + font-weight: var(--cds-body-compact-01-font-weight,400); + line-height: var(--cds-body-compact-01-line-height,1.28572); + letter-spacing: var(--cds-body-compact-01-letter-spacing,0.16px); + background-color: var(--cds-layer); + inline-size: 100%; +} + +mark-down table td, mark-down table tbody th { + background: var(--cds-layer); + -webkit-border-after: 1px solid var(--cds-border-subtle); + border-block-end: 1px solid var(--cds-border-subtle); + -webkit-border-before: 1px solid var(--cds-layer); + border-block-start: 1px solid var(--cds-layer); + color: var(--cds-text-secondary,#525252); + -webkit-padding-end: 1rem; + padding-inline-end: 1rem; + -webkit-padding-start: 1rem; + padding-inline-start: 1rem; +} \ No newline at end of file diff --git a/rule-server/src/static/archives/2026.07.13/doc/common/help.js b/rule-server/src/static/archives/2026.07.13/doc/common/help.js new file mode 100644 index 000000000..e979485ad --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/common/help.js @@ -0,0 +1,225 @@ +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ + +class HTMLBaseElement extends HTMLElement { + constructor(...args) { + const self = super(...args); + self.parsed = false; // guard to make it easy to do certain stuff only once + self.parentNodes = []; + return self; + } + + connectedCallback() { + // collect the parentNodes + let el = this; + while (el.parentNode) { + el = el.parentNode; + this.parentNodes.push(el); + } + // check if the parser has already passed the end tag of the component + // in which case this element, or one of its parents, should have a nextSibling + // if not (no whitespace at all between tags and no nextElementSiblings either) + // resort to DOMContentLoaded or load having triggered + if ([this, ...this.parentNodes].some((el) => el.nextSibling) || document.readyState !== "loading") { + if (this.childrenAvailableCallback) + this.childrenAvailableCallback(); + this.parsed = true; + } else { + this.mutationObserver = new MutationObserver(() => { + if ([this, ...this.parentNodes].some((el) => el.nextSibling) || document.readyState !== "loading") { + if (this.childrenAvailableCallback) + this.childrenAvailableCallback(); + this.parsed = true; + this.mutationObserver.disconnect(); + } + }); + + this.mutationObserver.observe(this, { + childList: true, + }); + } + } +} + +function isDarkMode() { + return (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches); +} + +customElements.define( + "mark-down", + class extends HTMLBaseElement { + constructor() { + super(); + setTimeout(() => { + let converted = marked.parse(this.textContent); + this.innerHTML = converted + .replace(/<(\/?)ul>/g, "<$1cds-unordered-list>") + .replace(/<(\/?)li>/g, "<$1cds-list-item>") + .replace(/[ \r\n]*/g, "") + .replace(/<\/code>[ \r\n]*<\/pre>/g, ""); + }, 0) + } + // childrenAvailableCallback() { + // let converted = marked.parse(this.innerHTML); + // this.innerHTML = converted + // .replace(/<(\/?)ul>/g, "<$1bx-unordered-list>") + // .replace(/<(\/?)li>/g, "<$1bx-list-item>") + // .replace(/[ \r\n]*/g, "") + // .replace(/<\/code>[ \r\n]*<\/pre>/g, ""); + // } + } +); + +customElements.define( + "code-snippet", + class extends HTMLBaseElement { + childrenAvailableCallback() { + let oldCode = this.innerHTML; + this.innerHTML = ""; + // const shadowRoot = this.attachShadow({mode: 'open'}); + const shadowRoot = this; + let snip = document.createElement("cds-code-snippet"); + snip.setAttribute("type", "multi"); + snip.innerHTML = oldCode.replace(/ ruleInfo.msgArgs[matchedNum]); + document.querySelector("#ruleMessage").innerHTML = ruleMessage.replace(/&/g, "&").replace(//g, ">") + } + setTimeout(() => { + if (ruleInfo.snippet) { + let snip = ruleInfo.snippet; + snip = snip.replace(/( [a-zA-Z-]+="[^"]*")/g, "\n $1"); + let snipElem = document.createElement("code-snippet"); + for (let line of snip.split("\n")) { + snipElem.appendChild(document.createTextNode(line+"\n")); + } + let locSnippet = document.querySelector("#locSnippet"); + locSnippet.innerHTML = `

Element location

`; + locSnippet.appendChild(snipElem); + } + }, 0); + if (ruleInfo.value) { + let value = ruleInfo.value; + const val = valueMap[value[0]][value[1]]; + let icon = ""; + if (val === "Violation") icon = ``; + if (val === "Needs review") icon = ``; + if (val === "Recommendation") icon = ``; + let level = document.querySelector("#locLevel"); + let parent = level.parentElement; + level = parent.removeChild(level); + parent.insertBefore(level, parent.firstElementChild); + document.querySelector("#locLevel").innerHTML = `
${val}
`; + } + if (RULE_ID) { + document.querySelector("#ruleInfo").innerHTML = `

Rule ID: ${RULE_ID}${ruleInfo.reasonId ? `
Reason ID: ${ruleInfo.reasonId}

` : ""}`; + } + } +} + +if ("onhashchange" in window) {// does the browser support the hashchange event? + window.onhashchange = function () { + let ruleInfo = JSON.parse(decodeURIComponent(window.location.hash.substring(1))); + updateWithRuleInfo(ruleInfo); + } +} + +window.addEventListener("DOMContentLoaded", (evt) => { + let groupMsg = typeof RULE_MESSAGES !== "undefined" && (RULE_MESSAGES["en-US"].group || RULE_MESSAGES["en-US"][0]) || ""; + groupMsg = groupMsg.replace(/&/g, "&").replace(//g, ">"); + document.querySelector("#groupLabel").innerHTML = groupMsg; + let ruleInfo; + if (window.location.search && window.location.search.length > 0) { + const searchParams = new URLSearchParams(window.location.search); + ruleInfo = JSON.parse(decodeURIComponent(searchParams.get("issue"))); + } else if (window.location.hash && window.location.hash.length > 0) { + ruleInfo = JSON.parse(decodeURIComponent(window.location.hash.substring(1))); + } + updateWithRuleInfo(ruleInfo); + + if (isDarkMode()) { + document.body.setAttribute("class", "dds-theme-zone-g90"); + } else { + document.body.setAttribute("class", "dds-theme-zone-g10"); + } + +}) + diff --git a/rule-server/src/static/archives/2026.07.13/doc/common/rules.css b/rule-server/src/static/archives/2026.07.13/doc/common/rules.css new file mode 100644 index 000000000..d74ec347e --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/common/rules.css @@ -0,0 +1,29 @@ +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +@import url('https://unpkg.com/carbon-components@10.58.15/css/carbon-components.min.css'); + +html, body, .toolHelp .bx--row:nth-child(2) { + height: 100%; +} + +body { + font-family: 'IBM Plex Sans', sans-serif; + padding: 1rem; +} + +h2 { + margin-top: 1rem; + font-size: 16px; + line-height: 24px; + font-weight: 600; +} diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/IBMA_Color_Contrast_WCAG2AA_PV.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/IBMA_Color_Contrast_WCAG2AA_PV.html new file mode 100644 index 000000000..26752ccd5 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/IBMA_Color_Contrast_WCAG2AA_PV.html @@ -0,0 +1,90 @@ + + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/Rpt_Aria_ArticleRoleLabel_Implicit.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/Rpt_Aria_ArticleRoleLabel_Implicit.html new file mode 100644 index 000000000..6268a62d3 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/Rpt_Aria_ArticleRoleLabel_Implicit.html @@ -0,0 +1,95 @@ + + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/Rpt_Aria_GroupRoleLabel_Implicit.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/Rpt_Aria_GroupRoleLabel_Implicit.html new file mode 100644 index 000000000..c0ce87a3f --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/Rpt_Aria_GroupRoleLabel_Implicit.html @@ -0,0 +1,107 @@ + + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/a_target_warning.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/a_target_warning.html new file mode 100644 index 000000000..401cc783e --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/a_target_warning.html @@ -0,0 +1,91 @@ + + + + a_target_warning - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/a_text_purpose.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/a_text_purpose.html new file mode 100644 index 000000000..91669b4be --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/a_text_purpose.html @@ -0,0 +1,108 @@ + + + + a_text_purpose - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/applet_alt_exists.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/applet_alt_exists.html new file mode 100644 index 000000000..c3d9286cb --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/applet_alt_exists.html @@ -0,0 +1,103 @@ + + + + applet_alt_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/application_content_accessible.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/application_content_accessible.html new file mode 100644 index 000000000..a9677444a --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/application_content_accessible.html @@ -0,0 +1,97 @@ + + + + application_content_accessible - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/area_alt_exists.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/area_alt_exists.html new file mode 100644 index 000000000..37ae2cbbf --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/area_alt_exists.html @@ -0,0 +1,101 @@ + + + + area_alt_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_accessiblename_exists.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_accessiblename_exists.html new file mode 100644 index 000000000..91335faae --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_accessiblename_exists.html @@ -0,0 +1,112 @@ + + + + aria_accessiblename_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_activedescendant_tabindex_valid.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_activedescendant_tabindex_valid.html new file mode 100644 index 000000000..2bee6008d --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_activedescendant_tabindex_valid.html @@ -0,0 +1,107 @@ + + + + aria_activedescendant_tabindex_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_activedescendant_valid.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_activedescendant_valid.html new file mode 100644 index 000000000..532651e4f --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_activedescendant_valid.html @@ -0,0 +1,103 @@ + + + + aria_activedescendant_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_application_label_unique.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_application_label_unique.html new file mode 100644 index 000000000..67d10ec6d --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_application_label_unique.html @@ -0,0 +1,103 @@ + + + + aria_application_label_unique - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_application_labelled.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_application_labelled.html new file mode 100644 index 000000000..171f230f3 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_application_labelled.html @@ -0,0 +1,100 @@ + + + + aria_application_labelled - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_article_label_unique.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_article_label_unique.html new file mode 100644 index 000000000..bf8a3d43d --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_article_label_unique.html @@ -0,0 +1,104 @@ + + + + aria_article_label_unique - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_attribute_allowed.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_attribute_allowed.html new file mode 100644 index 000000000..79912adaf --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_attribute_allowed.html @@ -0,0 +1,97 @@ + + + + aria_attribute_allowed - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_attribute_conflict.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_attribute_conflict.html new file mode 100644 index 000000000..092e293ab --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_attribute_conflict.html @@ -0,0 +1,109 @@ + + + + aria_attribute_conflict - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_attribute_deprecated.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_attribute_deprecated.html new file mode 100644 index 000000000..5887d4224 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_attribute_deprecated.html @@ -0,0 +1,103 @@ + + + + aria_attribute_deprecated - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_attribute_exists.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_attribute_exists.html new file mode 100644 index 000000000..f2b4e6257 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_attribute_exists.html @@ -0,0 +1,93 @@ + + + + aria_attribute_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_attribute_redundant.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_attribute_redundant.html new file mode 100644 index 000000000..226b11a32 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_attribute_redundant.html @@ -0,0 +1,98 @@ + + + + aria_attribute_redundant - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_attribute_required.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_attribute_required.html new file mode 100644 index 000000000..377b82900 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_attribute_required.html @@ -0,0 +1,106 @@ + + + + aria_attribute_required - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_attribute_valid.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_attribute_valid.html new file mode 100644 index 000000000..7cd3f832f --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_attribute_valid.html @@ -0,0 +1,102 @@ + + + + aria_attribute_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + + + +
+
+
+ + \ No newline at end of file diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_attribute_value_valid.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_attribute_value_valid.html new file mode 100644 index 000000000..8fd74f9af --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_attribute_value_valid.html @@ -0,0 +1,94 @@ + + + + aria_attribute_value_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + \ No newline at end of file diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_banner_label_unique.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_banner_label_unique.html new file mode 100644 index 000000000..3a484f85d --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_banner_label_unique.html @@ -0,0 +1,104 @@ + + + + aria_banner_label_unique - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_banner_single.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_banner_single.html new file mode 100644 index 000000000..bb68f82c8 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_banner_single.html @@ -0,0 +1,98 @@ + + + + aria_banner_single - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_child_tabbable.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_child_tabbable.html new file mode 100644 index 000000000..2a0c5e3e4 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_child_tabbable.html @@ -0,0 +1,98 @@ + + + + aria_child_tabbable - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_child_valid.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_child_valid.html new file mode 100644 index 000000000..48b81fffa --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_child_valid.html @@ -0,0 +1,121 @@ + + + + aria_child_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_complementary_label_unique.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_complementary_label_unique.html new file mode 100644 index 000000000..87070a0bb --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_complementary_label_unique.html @@ -0,0 +1,103 @@ + + + + aria_complementary_label_unique - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_complementary_label_visible.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_complementary_label_visible.html new file mode 100644 index 000000000..73bd67c37 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_complementary_label_visible.html @@ -0,0 +1,100 @@ + + + + aria_complementary_label_visible - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_complementary_labelled.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_complementary_labelled.html new file mode 100644 index 000000000..cd1390031 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_complementary_labelled.html @@ -0,0 +1,100 @@ + + + + aria_complementary_labelled - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_content_in_landmark.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_content_in_landmark.html new file mode 100644 index 000000000..0374df352 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_content_in_landmark.html @@ -0,0 +1,91 @@ + + + + aria_content_in_landmark - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_contentinfo_label_unique.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_contentinfo_label_unique.html new file mode 100644 index 000000000..5341e0311 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_contentinfo_label_unique.html @@ -0,0 +1,104 @@ + + + + aria_contentinfo_label_unique - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_contentinfo_misuse.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_contentinfo_misuse.html new file mode 100644 index 000000000..ba6718bf6 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_contentinfo_misuse.html @@ -0,0 +1,105 @@ + + + + aria_contentinfo_misuse - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_contentinfo_single.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_contentinfo_single.html new file mode 100644 index 000000000..6aeb1034a --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_contentinfo_single.html @@ -0,0 +1,100 @@ + + + + aria_contentinfo_single - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_descendant_valid.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_descendant_valid.html new file mode 100644 index 000000000..097af8984 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_descendant_valid.html @@ -0,0 +1,101 @@ + + + + aria_descendant_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_document_label_unique.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_document_label_unique.html new file mode 100644 index 000000000..0722eb544 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_document_label_unique.html @@ -0,0 +1,91 @@ + + + + aria_document_label_unique - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_eventhandler_role_valid.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_eventhandler_role_valid.html new file mode 100644 index 000000000..7ee73775f --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_eventhandler_role_valid.html @@ -0,0 +1,92 @@ + + + + aria_eventhandler_role_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_form_label_unique.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_form_label_unique.html new file mode 100644 index 000000000..f607ba24c --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_form_label_unique.html @@ -0,0 +1,112 @@ + + + + aria_form_label_unique - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_graphic_labelled.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_graphic_labelled.html new file mode 100644 index 000000000..b7351e445 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_graphic_labelled.html @@ -0,0 +1,99 @@ + + + + aria_graphic_labelled - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_hidden_nontabbable.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_hidden_nontabbable.html new file mode 100644 index 000000000..400c4fb13 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_hidden_nontabbable.html @@ -0,0 +1,113 @@ + + + + aria_hidden_nontabbable - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_id_unique.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_id_unique.html new file mode 100644 index 000000000..b297b7d37 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_id_unique.html @@ -0,0 +1,98 @@ + + + + aria_id_unique - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_img_labelled.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_img_labelled.html new file mode 100644 index 000000000..fa71286d5 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_img_labelled.html @@ -0,0 +1,100 @@ + + + + aria_img_labelled - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_keyboard_handler_exists.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_keyboard_handler_exists.html new file mode 100644 index 000000000..e3a218788 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_keyboard_handler_exists.html @@ -0,0 +1,103 @@ + + + + aria_keyboard_handler_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_landmark_name_unique.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_landmark_name_unique.html new file mode 100644 index 000000000..653a54a1a --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_landmark_name_unique.html @@ -0,0 +1,110 @@ + + + + aria_landmark_name_unique - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_main_label_unique.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_main_label_unique.html new file mode 100644 index 000000000..2bb38d716 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_main_label_unique.html @@ -0,0 +1,111 @@ + + + + aria_main_label_unique - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_main_label_visible.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_main_label_visible.html new file mode 100644 index 000000000..53a3d8383 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_main_label_visible.html @@ -0,0 +1,102 @@ + + + + aria_main_label_visible - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_navigation_label_unique.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_navigation_label_unique.html new file mode 100644 index 000000000..237c3a36d --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_navigation_label_unique.html @@ -0,0 +1,106 @@ + + + + aria_navigation_label_unique - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_parent_required.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_parent_required.html new file mode 100644 index 000000000..dc9f9721b --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_parent_required.html @@ -0,0 +1,98 @@ + + + + aria_parent_required - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_region_label_unique.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_region_label_unique.html new file mode 100644 index 000000000..37b85a946 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_region_label_unique.html @@ -0,0 +1,102 @@ + + + + aria_region_label_unique - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_region_labelled.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_region_labelled.html new file mode 100644 index 000000000..c30526a1d --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_region_labelled.html @@ -0,0 +1,102 @@ + + + + aria_region_labelled - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_role_allowed.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_role_allowed.html new file mode 100644 index 000000000..0509df7a1 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_role_allowed.html @@ -0,0 +1,105 @@ + + + + aria_role_allowed - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_role_redundant.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_role_redundant.html new file mode 100644 index 000000000..b17cb4d39 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_role_redundant.html @@ -0,0 +1,107 @@ + + + + aria_role_redundant - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_role_valid.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_role_valid.html new file mode 100644 index 000000000..31ad6442a --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_role_valid.html @@ -0,0 +1,90 @@ + + + + aria_role_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_search_label_unique.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_search_label_unique.html new file mode 100644 index 000000000..02979c267 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_search_label_unique.html @@ -0,0 +1,100 @@ + + + + aria_search_label_unique - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_toolbar_label_unique.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_toolbar_label_unique.html new file mode 100644 index 000000000..af0b1f253 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_toolbar_label_unique.html @@ -0,0 +1,102 @@ + + + + aria_toolbar_label_unique - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_widget_labelled.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_widget_labelled.html new file mode 100644 index 000000000..7a051f8b6 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/aria_widget_labelled.html @@ -0,0 +1,102 @@ + + + + aria_widget_labelled - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/asciiart_alt_exists.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/asciiart_alt_exists.html new file mode 100644 index 000000000..c7f4f07db --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/asciiart_alt_exists.html @@ -0,0 +1,91 @@ + + + + asciiart_alt_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/blink_css_review.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/blink_css_review.html new file mode 100644 index 000000000..2cc08e8e1 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/blink_css_review.html @@ -0,0 +1,94 @@ + + + + blink_css_review - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/blink_elem_deprecated.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/blink_elem_deprecated.html new file mode 100644 index 000000000..cdcdc906b --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/blink_elem_deprecated.html @@ -0,0 +1,94 @@ + + + + blink_elem_deprecated - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/blockquote_cite_exists.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/blockquote_cite_exists.html new file mode 100644 index 000000000..a583f938a --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/blockquote_cite_exists.html @@ -0,0 +1,91 @@ + + + + blockquote_cite_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/canvas_content_described.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/canvas_content_described.html new file mode 100644 index 000000000..df4b31924 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/canvas_content_described.html @@ -0,0 +1,115 @@ + + + + canvas_content_described - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/caption_track_exists.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/caption_track_exists.html new file mode 100644 index 000000000..108a60628 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/caption_track_exists.html @@ -0,0 +1,100 @@ + + + + caption_track_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/combobox_active_descendant.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/combobox_active_descendant.html new file mode 100644 index 000000000..2d5d32179 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/combobox_active_descendant.html @@ -0,0 +1,109 @@ + + + + combobox_active_descendant - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/combobox_autocomplete_valid.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/combobox_autocomplete_valid.html new file mode 100644 index 000000000..23e35fa1e --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/combobox_autocomplete_valid.html @@ -0,0 +1,136 @@ + + + + combobox_autocomplete_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/combobox_design_valid.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/combobox_design_valid.html new file mode 100644 index 000000000..e8dd1934a --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/combobox_design_valid.html @@ -0,0 +1,93 @@ + + + + combobox_design_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/combobox_focusable_elements.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/combobox_focusable_elements.html new file mode 100644 index 000000000..bc52cb3c0 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/combobox_focusable_elements.html @@ -0,0 +1,92 @@ + + + + combobox_focusable_elements - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/combobox_haspopup_valid.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/combobox_haspopup_valid.html new file mode 100644 index 000000000..dc7ade53a --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/combobox_haspopup_valid.html @@ -0,0 +1,107 @@ + + + + combobox_haspopup_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/combobox_popup_reference.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/combobox_popup_reference.html new file mode 100644 index 000000000..6e177bda2 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/combobox_popup_reference.html @@ -0,0 +1,109 @@ + + + + combobox_popup_reference - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/dir_attribute_valid.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/dir_attribute_valid.html new file mode 100644 index 000000000..0d0c62e22 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/dir_attribute_valid.html @@ -0,0 +1,89 @@ + + + + dir_attribute_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/download_keyboard_controllable.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/download_keyboard_controllable.html new file mode 100644 index 000000000..ab67dc93d --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/download_keyboard_controllable.html @@ -0,0 +1,92 @@ + + + + download_keyboard_controllable - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/draggable_alternative_exists.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/draggable_alternative_exists.html new file mode 100644 index 000000000..86df2dd70 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/draggable_alternative_exists.html @@ -0,0 +1,105 @@ + + + + draggable_alternative_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/element_accesskey_labelled.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/element_accesskey_labelled.html new file mode 100644 index 000000000..f73590225 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/element_accesskey_labelled.html @@ -0,0 +1,97 @@ + + + + element_accesskey_labelled - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/element_accesskey_unique.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/element_accesskey_unique.html new file mode 100644 index 000000000..a47bd9c16 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/element_accesskey_unique.html @@ -0,0 +1,100 @@ + + + + element_accesskey_unique - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/element_attribute_deprecated.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/element_attribute_deprecated.html new file mode 100644 index 000000000..7c456299c --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/element_attribute_deprecated.html @@ -0,0 +1,103 @@ + + + + element_attribute_deprecated - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/element_id_unique.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/element_id_unique.html new file mode 100644 index 000000000..419e18bf9 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/element_id_unique.html @@ -0,0 +1,102 @@ + + + + element_id_unique - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/element_lang_valid.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/element_lang_valid.html new file mode 100644 index 000000000..a58981480 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/element_lang_valid.html @@ -0,0 +1,108 @@ + + + + element_lang_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/element_mouseevent_keyboard.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/element_mouseevent_keyboard.html new file mode 100644 index 000000000..35f557732 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/element_mouseevent_keyboard.html @@ -0,0 +1,102 @@ + + + + element_mouseevent_keyboard - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/element_orientation_unlocked.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/element_orientation_unlocked.html new file mode 100644 index 000000000..e31347201 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/element_orientation_unlocked.html @@ -0,0 +1,112 @@ + + + + element_orientation_unlocked - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/element_scrollable_tabbable.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/element_scrollable_tabbable.html new file mode 100644 index 000000000..6cadc4110 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/element_scrollable_tabbable.html @@ -0,0 +1,115 @@ + + + + element_scrollable_tabbable - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/element_tabbable_role_valid.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/element_tabbable_role_valid.html new file mode 100644 index 000000000..13c9394b3 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/element_tabbable_role_valid.html @@ -0,0 +1,136 @@ + + + + element_tabbable_role_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/element_tabbable_unobscured.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/element_tabbable_unobscured.html new file mode 100644 index 000000000..06dd1fee0 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/element_tabbable_unobscured.html @@ -0,0 +1,103 @@ + + + + element_tabbable_unobscured - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/element_tabbable_visible.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/element_tabbable_visible.html new file mode 100644 index 000000000..260f1eee1 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/element_tabbable_visible.html @@ -0,0 +1,124 @@ + + + + element_tabbable_visible - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/embed_alt_exists.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/embed_alt_exists.html new file mode 100644 index 000000000..64eb4a692 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/embed_alt_exists.html @@ -0,0 +1,95 @@ + + + + embed_alt_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/emoticons_alt_exists.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/emoticons_alt_exists.html new file mode 100644 index 000000000..648457296 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/emoticons_alt_exists.html @@ -0,0 +1,91 @@ + + + + emoticons_alt_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/error_message_exists.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/error_message_exists.html new file mode 100644 index 000000000..157fb4474 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/error_message_exists.html @@ -0,0 +1,105 @@ + + + + error_message_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/fieldset_label_valid.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/fieldset_label_valid.html new file mode 100644 index 000000000..5ea22a1e3 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/fieldset_label_valid.html @@ -0,0 +1,106 @@ + + + + fieldset_label_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/fieldset_legend_valid.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/fieldset_legend_valid.html new file mode 100644 index 000000000..ca83ceae1 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/fieldset_legend_valid.html @@ -0,0 +1,101 @@ + + + + fieldset_legend_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/figure_label_exists.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/figure_label_exists.html new file mode 100644 index 000000000..1322013a4 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/figure_label_exists.html @@ -0,0 +1,104 @@ + + + + figure_label_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/form_font_color.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/form_font_color.html new file mode 100644 index 000000000..071711881 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/form_font_color.html @@ -0,0 +1,90 @@ + + + + form_font_color - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/form_interaction_review.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/form_interaction_review.html new file mode 100644 index 000000000..551294685 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/form_interaction_review.html @@ -0,0 +1,92 @@ + + + + form_interaction_review - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/form_label_unique.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/form_label_unique.html new file mode 100644 index 000000000..ad8738f1c --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/form_label_unique.html @@ -0,0 +1,90 @@ + + + + form_label_unique - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/form_submit_button_exists.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/form_submit_button_exists.html new file mode 100644 index 000000000..7f44da6ff --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/form_submit_button_exists.html @@ -0,0 +1,92 @@ + + + + form_submit_button_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/form_submit_review.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/form_submit_review.html new file mode 100644 index 000000000..f5d87ee31 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/form_submit_review.html @@ -0,0 +1,93 @@ + + + + form_submit_review - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/frame_src_valid.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/frame_src_valid.html new file mode 100644 index 000000000..73c1f1883 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/frame_src_valid.html @@ -0,0 +1,95 @@ + + + + frame_src_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/frame_title_exists.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/frame_title_exists.html new file mode 100644 index 000000000..fe0bb7a13 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/frame_title_exists.html @@ -0,0 +1,99 @@ + + + + frame_title_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/heading_content_exists.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/heading_content_exists.html new file mode 100644 index 000000000..411805214 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/heading_content_exists.html @@ -0,0 +1,89 @@ + + + + heading_content_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/heading_markup_misuse.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/heading_markup_misuse.html new file mode 100644 index 000000000..6a17c06a1 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/heading_markup_misuse.html @@ -0,0 +1,92 @@ + + + + heading_markup_misuse - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/html_lang_exists.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/html_lang_exists.html new file mode 100644 index 000000000..0f7c9a4e0 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/html_lang_exists.html @@ -0,0 +1,92 @@ + + + + html_lang_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/html_lang_valid.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/html_lang_valid.html new file mode 100644 index 000000000..3a7da2fb6 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/html_lang_valid.html @@ -0,0 +1,111 @@ + + + + html_lang_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/html_skipnav_exists.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/html_skipnav_exists.html new file mode 100644 index 000000000..c39face20 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/html_skipnav_exists.html @@ -0,0 +1,91 @@ + + + + html_skipnav_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/iframe_interactive_tabbable.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/iframe_interactive_tabbable.html new file mode 100644 index 000000000..d38a34621 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/iframe_interactive_tabbable.html @@ -0,0 +1,105 @@ + + + + iframe_interactive_tabbable - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/imagebutton_alt_exists.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/imagebutton_alt_exists.html new file mode 100644 index 000000000..5b560098e --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/imagebutton_alt_exists.html @@ -0,0 +1,90 @@ + + + + imagebutton_alt_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/imagemap_alt_exists.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/imagemap_alt_exists.html new file mode 100644 index 000000000..4e9123086 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/imagemap_alt_exists.html @@ -0,0 +1,101 @@ + + + + imagemap_alt_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/img_alt_background.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/img_alt_background.html new file mode 100644 index 000000000..79f373086 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/img_alt_background.html @@ -0,0 +1,90 @@ + + + + img_alt_background - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/img_alt_decorative.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/img_alt_decorative.html new file mode 100644 index 000000000..3ce9d4ead --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/img_alt_decorative.html @@ -0,0 +1,93 @@ + + + + img_alt_decorative - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/img_alt_misuse.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/img_alt_misuse.html new file mode 100644 index 000000000..e66601164 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/img_alt_misuse.html @@ -0,0 +1,91 @@ + + + + img_alt_misuse - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/img_alt_null.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/img_alt_null.html new file mode 100644 index 000000000..6fd478c3b --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/img_alt_null.html @@ -0,0 +1,94 @@ + + + + img_alt_null - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/img_alt_redundant.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/img_alt_redundant.html new file mode 100644 index 000000000..ce20e884e --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/img_alt_redundant.html @@ -0,0 +1,94 @@ + + + + img_alt_redundant - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/img_alt_valid.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/img_alt_valid.html new file mode 100644 index 000000000..e8a17581d --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/img_alt_valid.html @@ -0,0 +1,99 @@ + + + + img_alt_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/img_ismap_misuse.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/img_ismap_misuse.html new file mode 100644 index 000000000..4e10850a2 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/img_ismap_misuse.html @@ -0,0 +1,91 @@ + + + + img_ismap_misuse - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/img_longdesc_misuse.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/img_longdesc_misuse.html new file mode 100644 index 000000000..67798f054 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/img_longdesc_misuse.html @@ -0,0 +1,98 @@ + + + + img_longdesc_misuse - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/input_autocomplete_valid.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/input_autocomplete_valid.html new file mode 100644 index 000000000..fc7a23d5a --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/input_autocomplete_valid.html @@ -0,0 +1,121 @@ + + + + input_autocomplete_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/input_checkboxes_grouped.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/input_checkboxes_grouped.html new file mode 100644 index 000000000..0380a2aa0 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/input_checkboxes_grouped.html @@ -0,0 +1,90 @@ + + + + input_checkboxes_grouped - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/input_fields_grouped.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/input_fields_grouped.html new file mode 100644 index 000000000..8acfd687e --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/input_fields_grouped.html @@ -0,0 +1,104 @@ + + + + input_fields_grouped - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/input_haspopup_conflict.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/input_haspopup_conflict.html new file mode 100644 index 000000000..5b71da3aa --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/input_haspopup_conflict.html @@ -0,0 +1,120 @@ + + + + input_haspopup_conflict - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/input_label_after.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/input_label_after.html new file mode 100644 index 000000000..a9cae3354 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/input_label_after.html @@ -0,0 +1,98 @@ + + + + input_label_after - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/input_label_before.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/input_label_before.html new file mode 100644 index 000000000..296dddd18 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/input_label_before.html @@ -0,0 +1,99 @@ + + + + input_label_before - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/input_label_exists.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/input_label_exists.html new file mode 100644 index 000000000..4b214ff47 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/input_label_exists.html @@ -0,0 +1,94 @@ + + + + input_label_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/input_label_visible.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/input_label_visible.html new file mode 100644 index 000000000..add9d07ac --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/input_label_visible.html @@ -0,0 +1,128 @@ + + + + input_label_visible - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/input_onchange_review.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/input_onchange_review.html new file mode 100644 index 000000000..f4f544104 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/input_onchange_review.html @@ -0,0 +1,103 @@ + + + + input_onchange_review - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/input_placeholder_label_visible.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/input_placeholder_label_visible.html new file mode 100644 index 000000000..ad52cc5f2 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/input_placeholder_label_visible.html @@ -0,0 +1,107 @@ + + + + input_placeholder_label_visible - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/label_content_exists.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/label_content_exists.html new file mode 100644 index 000000000..128523c7e --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/label_content_exists.html @@ -0,0 +1,90 @@ + + + + label_content_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/label_name_visible.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/label_name_visible.html new file mode 100644 index 000000000..265d1ebe3 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/label_name_visible.html @@ -0,0 +1,97 @@ + + + + label_name_visible - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/label_ref_valid.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/label_ref_valid.html new file mode 100644 index 000000000..b3b72276c --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/label_ref_valid.html @@ -0,0 +1,97 @@ + + + + label_ref_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/list_children_valid.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/list_children_valid.html new file mode 100644 index 000000000..27f0732c8 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/list_children_valid.html @@ -0,0 +1,111 @@ + + + + list_children_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/list_markup_review.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/list_markup_review.html new file mode 100644 index 000000000..55ba2a2b7 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/list_markup_review.html @@ -0,0 +1,91 @@ + + + + list_markup_review - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/list_structure_proper.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/list_structure_proper.html new file mode 100644 index 000000000..3904f03b4 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/list_structure_proper.html @@ -0,0 +1,89 @@ + + + + list_structure_proper - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/marquee_elem_avoid.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/marquee_elem_avoid.html new file mode 100644 index 000000000..b1b7173bd --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/marquee_elem_avoid.html @@ -0,0 +1,94 @@ + + + + marquee_elem_avoid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/media_alt_brief.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/media_alt_brief.html new file mode 100644 index 000000000..eff8ac5a0 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/media_alt_brief.html @@ -0,0 +1,111 @@ + + + + media_alt_brief - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/media_alt_exists.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/media_alt_exists.html new file mode 100644 index 000000000..b132cba78 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/media_alt_exists.html @@ -0,0 +1,95 @@ + + + + media_alt_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/media_audio_transcribed.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/media_audio_transcribed.html new file mode 100644 index 000000000..b17a87a74 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/media_audio_transcribed.html @@ -0,0 +1,97 @@ + + + + media_audio_transcribed - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/media_autostart_controllable.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/media_autostart_controllable.html new file mode 100644 index 000000000..3286a581a --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/media_autostart_controllable.html @@ -0,0 +1,93 @@ + + + + media_autostart_controllable - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/media_keyboard_controllable.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/media_keyboard_controllable.html new file mode 100644 index 000000000..fed317f4a --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/media_keyboard_controllable.html @@ -0,0 +1,111 @@ + + + + media_keyboard_controllable - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/media_live_captioned.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/media_live_captioned.html new file mode 100644 index 000000000..62c0a2411 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/media_live_captioned.html @@ -0,0 +1,91 @@ + + + + media_live_captioned - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/media_track_available.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/media_track_available.html new file mode 100644 index 000000000..d2986ba11 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/media_track_available.html @@ -0,0 +1,96 @@ + + + + media_track_available - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/meta_redirect_optional.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/meta_redirect_optional.html new file mode 100644 index 000000000..480bffc3b --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/meta_redirect_optional.html @@ -0,0 +1,94 @@ + + + + meta_redirect_optional - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/meta_refresh_delay.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/meta_refresh_delay.html new file mode 100644 index 000000000..be777ca26 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/meta_refresh_delay.html @@ -0,0 +1,95 @@ + + + + meta_refresh_delay - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/meta_viewport_zoomable.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/meta_viewport_zoomable.html new file mode 100644 index 000000000..1841c2ce8 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/meta_viewport_zoomable.html @@ -0,0 +1,98 @@ + + + + meta_viewport_zoomable - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/noembed_content_exists.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/noembed_content_exists.html new file mode 100644 index 000000000..dbec45fac --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/noembed_content_exists.html @@ -0,0 +1,100 @@ + + + + noembed_content_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/object_text_exists.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/object_text_exists.html new file mode 100644 index 000000000..99d9a4eab --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/object_text_exists.html @@ -0,0 +1,101 @@ + + + + object_text_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/page_title_exists.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/page_title_exists.html new file mode 100644 index 000000000..e8e7a05db --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/page_title_exists.html @@ -0,0 +1,103 @@ + + + + page_title_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/page_title_valid.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/page_title_valid.html new file mode 100644 index 000000000..c558a524d --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/page_title_valid.html @@ -0,0 +1,105 @@ + + + + page_title_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/script_focus_blur_review.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/script_focus_blur_review.html new file mode 100644 index 000000000..5bf2a1b50 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/script_focus_blur_review.html @@ -0,0 +1,96 @@ + + + + script_focus_blur_review - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/script_onclick_avoid.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/script_onclick_avoid.html new file mode 100644 index 000000000..adc8057f8 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/script_onclick_avoid.html @@ -0,0 +1,92 @@ + + + + script_onclick_avoid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/script_onclick_misuse.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/script_onclick_misuse.html new file mode 100644 index 000000000..1054a86dc --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/script_onclick_misuse.html @@ -0,0 +1,92 @@ + + + + script_onclick_misuse - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/script_select_review.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/script_select_review.html new file mode 100644 index 000000000..d5a32f1cf --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/script_select_review.html @@ -0,0 +1,97 @@ + + + + script_select_review - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/select_options_grouped.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/select_options_grouped.html new file mode 100644 index 000000000..055daa7fe --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/select_options_grouped.html @@ -0,0 +1,90 @@ + + + + select_options_grouped - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/skip_main_described.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/skip_main_described.html new file mode 100644 index 000000000..9e1fd3d48 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/skip_main_described.html @@ -0,0 +1,100 @@ + + + + skip_main_described - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/skip_main_exists.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/skip_main_exists.html new file mode 100644 index 000000000..489966282 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/skip_main_exists.html @@ -0,0 +1,103 @@ + + + + skip_main_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/style_background_decorative.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/style_background_decorative.html new file mode 100644 index 000000000..d10e6c9e2 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/style_background_decorative.html @@ -0,0 +1,93 @@ + + + + style_background_decorative - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/style_before_after_review.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/style_before_after_review.html new file mode 100644 index 000000000..d8b93d13f --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/style_before_after_review.html @@ -0,0 +1,95 @@ + + + + style_before_after_review - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/style_color_misuse.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/style_color_misuse.html new file mode 100644 index 000000000..0db3f77df --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/style_color_misuse.html @@ -0,0 +1,89 @@ + + + + style_color_misuse - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/style_focus_visible.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/style_focus_visible.html new file mode 100644 index 000000000..c3524f860 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/style_focus_visible.html @@ -0,0 +1,97 @@ + + + + style_focus_visible - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/style_highcontrast_visible.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/style_highcontrast_visible.html new file mode 100644 index 000000000..f50b54b71 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/style_highcontrast_visible.html @@ -0,0 +1,100 @@ + + + + style_highcontrast_visible - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/style_hover_persistent.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/style_hover_persistent.html new file mode 100644 index 000000000..9b7cb2b4e --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/style_hover_persistent.html @@ -0,0 +1,118 @@ + + + + style_hover_persistent - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/style_viewport_resizable.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/style_viewport_resizable.html new file mode 100644 index 000000000..72117898a --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/style_viewport_resizable.html @@ -0,0 +1,93 @@ + + + + style_viewport_resizable - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/svg_graphics_labelled.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/svg_graphics_labelled.html new file mode 100644 index 000000000..7afea1f95 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/svg_graphics_labelled.html @@ -0,0 +1,127 @@ + + + + svg_graphics_labelled - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/table_aria_descendants.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/table_aria_descendants.html new file mode 100644 index 000000000..cb8751c31 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/table_aria_descendants.html @@ -0,0 +1,110 @@ + + + + table_aria_descendants - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/table_caption_empty.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/table_caption_empty.html new file mode 100644 index 000000000..713b2cf85 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/table_caption_empty.html @@ -0,0 +1,101 @@ + + + + table_caption_empty - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/table_caption_nested.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/table_caption_nested.html new file mode 100644 index 000000000..70478360b --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/table_caption_nested.html @@ -0,0 +1,98 @@ + + + + table_caption_nested - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/table_headers_exists.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/table_headers_exists.html new file mode 100644 index 000000000..d9c4e39d5 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/table_headers_exists.html @@ -0,0 +1,93 @@ + + + + table_headers_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/table_headers_ref_valid.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/table_headers_ref_valid.html new file mode 100644 index 000000000..e0b6c59ef --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/table_headers_ref_valid.html @@ -0,0 +1,91 @@ + + + + table_headers_ref_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/table_headers_related.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/table_headers_related.html new file mode 100644 index 000000000..012da9f9f --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/table_headers_related.html @@ -0,0 +1,91 @@ + + + + table_headers_related - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/table_layout_linearized.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/table_layout_linearized.html new file mode 100644 index 000000000..e3d73e95b --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/table_layout_linearized.html @@ -0,0 +1,92 @@ + + + + table_layout_linearized - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/table_scope_valid.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/table_scope_valid.html new file mode 100644 index 000000000..8d857bb37 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/table_scope_valid.html @@ -0,0 +1,93 @@ + + + + table_scope_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/table_structure_misuse.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/table_structure_misuse.html new file mode 100644 index 000000000..9e8ed1a47 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/table_structure_misuse.html @@ -0,0 +1,91 @@ + + + + table_structure_misuse - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/table_summary_redundant.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/table_summary_redundant.html new file mode 100644 index 000000000..996fd2293 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/table_summary_redundant.html @@ -0,0 +1,101 @@ + + + + table_summary_redundant - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/target_spacing_sufficient.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/target_spacing_sufficient.html new file mode 100644 index 000000000..4bc998691 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/target_spacing_sufficient.html @@ -0,0 +1,108 @@ + + + + target_spacing_sufficient - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/text_block_heading.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/text_block_heading.html new file mode 100644 index 000000000..0cbce0583 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/text_block_heading.html @@ -0,0 +1,92 @@ + + + + text_block_heading - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/text_contrast_sufficient.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/text_contrast_sufficient.html new file mode 100644 index 000000000..d28530a22 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/text_contrast_sufficient.html @@ -0,0 +1,92 @@ + + + + text_contrast_sufficient - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/text_quoted_correctly.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/text_quoted_correctly.html new file mode 100644 index 000000000..2e998e14f --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/text_quoted_correctly.html @@ -0,0 +1,106 @@ + + + + text_quoted_correctly - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/text_sensory_misuse.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/text_sensory_misuse.html new file mode 100644 index 000000000..5ad0f3cd1 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/text_sensory_misuse.html @@ -0,0 +1,96 @@ + + + + text_sensory_misuse - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/text_spacing_valid.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/text_spacing_valid.html new file mode 100644 index 000000000..8cb7ed469 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/text_spacing_valid.html @@ -0,0 +1,103 @@ + + + + text_spacing_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/text_whitespace_valid.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/text_whitespace_valid.html new file mode 100644 index 000000000..a3ffc456d --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/text_whitespace_valid.html @@ -0,0 +1,93 @@ + + + + text_whitespace_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/widget_tabbable_exists.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/widget_tabbable_exists.html new file mode 100644 index 000000000..6008a6134 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/widget_tabbable_exists.html @@ -0,0 +1,98 @@ + + + + widget_tabbable_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/en-US/widget_tabbable_single.html b/rule-server/src/static/archives/2026.07.13/doc/en-US/widget_tabbable_single.html new file mode 100644 index 000000000..52987aa4c --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/en-US/widget_tabbable_single.html @@ -0,0 +1,96 @@ + + + + widget_tabbable_single - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2026.07.13/doc/rules.csv b/rule-server/src/static/archives/2026.07.13/doc/rules.csv new file mode 100644 index 000000000..4f189025e --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/rules.csv @@ -0,0 +1,434 @@ +Rule ID, Reason Code, Rule message, Reason message, Violation Level, Toolkit Level, WCAG Requirements, ACT mapping +"applet_alt_exists","Pass_0"," elements must provide an 'alt' attribute and an alternative description","Rule Passed","Pass","1","1.1.1","" +"applet_alt_exists","Fail_1"," elements must provide an 'alt' attribute and an alternative description","An element does not have an 'alt' attribute that provides a short text alternative","Violation","1","1.1.1","" +"applet_alt_exists","Fail_2"," elements must provide an 'alt' attribute and an alternative description","The 'alt' attribute value for an element duplicates the 'code' attribute","Violation","1","1.1.1","" +"applet_alt_exists","Fail_3"," elements must provide an 'alt' attribute and an alternative description","An element provides alternative text, but does not provide inner content","Violation","1","1.1.1","" +"img_alt_redundant","Pass_0","The text alternative for an image within a link should not repeat the link text or adjacent link text","Rule Passed","Pass","2","1.1.1,2.4.4","" +"img_alt_redundant","Fail_1","The text alternative for an image within a link should not repeat the link text or adjacent link text","Link text is repeated in an image 'alt' value within the same link","Violation","2","1.1.1,2.4.4","" +"img_alt_redundant","Fail_2","The text alternative for an image within a link should not repeat the link text or adjacent link text","Link text of previous link is repeated in image 'alt' value of a link","Violation","2","1.1.1,2.4.4","" +"img_alt_redundant","Fail_3","The text alternative for an image within a link should not repeat the link text or adjacent link text","Image 'alt' value within a link is repeated in link text of the link after","Violation","2","1.1.1,2.4.4","" +"img_alt_valid","pass","Images must have accessible names unless they are decorative or redundant","The image has an accessible name or is correctly marked as decorative or redundant","Pass","1","1.1.1","23a2a8:pass" +"img_alt_valid","fail_blank_alt","Images must have accessible names unless they are decorative or redundant","Image 'alt' attribute value consists only of blank space(s)","Violation","1","1.1.1","23a2a8:fail" +"img_alt_valid","fail_no_alt","Images must have accessible names unless they are decorative or redundant","The image has neither an accessible name nor is marked as decorative or redundant","Violation","1","1.1.1","23a2a8:fail" +"img_alt_valid","fail_blank_title","Images must have accessible names unless they are decorative or redundant","The image does not have an 'alt' attribute or ARIA label, and the 'title' attribute value consists only of blank space(s)","Violation","1","1.1.1","23a2a8:fail" +"imagebutton_alt_exists","Pass_0","The element of type ""image"" should have a text alternative","Image button provides alternative text using the 'alt' attribute","Pass","1","1.1.1","59796f:pass" +"imagebutton_alt_exists","Pass_1","The element of type ""image"" should have a text alternative","Image button provides alternative text using an ARIA label","Pass","1","1.1.1","59796f:pass" +"imagebutton_alt_exists","Pass_2","The element of type ""image"" should have a text alternative","Image button provides alternative text using the 'title' attribute","Pass","1","1.1.1","59796f:pass" +"imagebutton_alt_exists","Fail","The element of type ""image"" should have a text alternative","The element of type ""image"" has no text alternative","Violation","1","1.1.1","59796f:fail" +"area_alt_exists","Pass_0"," elements in an image map must have a text alternative","Rule Passed","Pass","1","1.1.1","" +"area_alt_exists","Fail_1"," elements in an image map must have a text alternative"," element in an image map has no text alternative","Violation","1","1.1.1","" +"imagemap_alt_exists","Pass_0","An image map and each element in an image map must have text alternative(s)","Rule Passed","Pass","1","1.1.1","" +"imagemap_alt_exists","Fail_1","An image map and each element in an image map must have text alternative(s)","Image map or child has no text alternative","Violation","1","1.1.1","" +"img_alt_decorative","Pass_0","Image designated as decorative must have 'alt=""""","Rule Passed","Pass","1","1.1.1","" +"img_alt_decorative","Fail_1","Image designated as decorative must have 'alt=""""","Image designated as decorative has non-null 'alt' attribute","Violation","1","1.1.1","" +"object_text_exists","pass"," element must have a text alternative for the content rendered by the object"," element has a text alternative","Pass","1","1.1.1","8fc3b6:pass" +"object_text_exists","fail_no_text_alternative"," element must have a text alternative for the content rendered by the object","An element does not have a text alternative","Violation","1","1.1.1","8fc3b6:fail" +"svg_graphics_labelled","pass","A non-decorative SVG element must have an accessible name","The SVG element has an accessible name","Pass","1","1.1.1","7d6734:pass" +"svg_graphics_labelled","fail_acc_name","A non-decorative SVG element must have an accessible name","The SVG element has no accessible name","Violation","1","1.1.1","7d6734:fail" +"img_alt_null","fail_decorative","When the intent is to mark an image as decorative with an empty 'alt' attribute, the 'aria' or 'title' attributes should not be used","The image 'alt' attribute is empty, but the 'title' attribute is not empty","Violation | Violation","1 | 1","1.1.1 | ARIA","" +"application_content_accessible","Pass_0","Non-decorative static text and image content within an element with ""application"" role must be accessible","Rule Passed","Pass","1","1.1.1,2.1.1","" +"application_content_accessible","Potential_1","Non-decorative static text and image content within an element with ""application"" role must be accessible","Verify that the non-decorative static text and image content within an element with ""application"" role are accessible","Violation Potential","1","1.1.1,2.1.1","" +"img_alt_misuse","Pass_0","'alt' attribute value must be a good inline replacement for the image","Rule Passed","Pass","1","1.1.1","" +"img_alt_misuse","Potential_1","'alt' attribute value must be a good inline replacement for the image","Verify that the file name serves as a good inline replacement for the image","Violation Potential","1","1.1.1","" +"img_ismap_misuse","Pass_0","Server-side image map hot-spots must have duplicate text links","Rule Passed","Pass","2","1.1.1","" +"img_ismap_misuse","Potential_1","Server-side image map hot-spots must have duplicate text links","Server-side image map hot-spots do not have duplicate text links","Violation Potential","2","1.1.1","" +"img_longdesc_misuse","Pass_0"," The 'longdesc' attribute must reference HTML content","Rule Passed","Pass","1","1.1.1","" +"img_longdesc_misuse","Potential_1"," The 'longdesc' attribute must reference HTML content","Verify that the file designated by the 'longdesc' attribute contains valid HTML content (file extension not recognized)","Violation Potential","1","1.1.1","" +"media_alt_exists","Pass_0","Audio or video on the page must have a short text alternative that describes the media content","Rule Passed","Pass","2","1.1.1","" +"media_alt_exists","Potential_1","Audio or video on the page must have a short text alternative that describes the media content","Filename used as label for embedded audio or video","Violation Potential","2","1.1.1","" +"style_background_decorative","Pass_0","Images included by using CSS alone must not convey important information","Rule Passed","Pass","1","1.1.1","" +"style_background_decorative","Potential_1","Images included by using CSS alone must not convey important information","Verify the CSS background image does not convey important information","Violation Potential","1","1.1.1","" +"style_highcontrast_visible","Pass_0","Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content","Rule Passed","Pass | Pass","1 | 1","1.1.1,1.3.2,1.4.11 | 1.1.1,1.3.2,1.4.11","" +"style_highcontrast_visible","Manual_1","Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content","Confirm Windows high contrast mode is supported when using CSS to include, position or alter non-decorative content","Violation Manual | Rec Manual","1 | 1","1.1.1,1.3.2,1.4.11 | 1.1.1,1.3.2,1.4.11","" +"figure_label_exists","Pass_0","A
element must have an associated label","Rule Passed","Pass","3","1.1.1","" +"figure_label_exists","Fail_1","A
element must have an associated label","The
element does not have an associated label","Rec","3","1.1.1","" +"embed_alt_exists","Pass_0","Provide alternative content for elements","Rule Passed","Pass","4","1.1.1","" +"embed_alt_exists","Potential_1","Provide alternative content for elements","Verify that the element has alternative content","Rec Potential","4","1.1.1","" +"media_alt_brief","Pass_0","Alternative text in 'alt' attribute should be brief (<150 characters)","Rule Passed","Pass","2","1.1.1","" +"media_alt_brief","Potential_1","Alternative text in 'alt' attribute should be brief (<150 characters)","Text alternative is more than 150 characters","Rec Potential","2","1.1.1","" +"noembed_content_exists","Pass_0"," elements should contain descriptive text","Rule Passed","Pass","4","1.1.1","" +"noembed_content_exists","Potential_1","<noembed> elements should contain descriptive text","Add descriptive text to the <noembed> element","Rec Potential","4","1.1.1","" +"canvas_content_described","Pass_0","The <canvas> element may not be accessible","Rule Passed","Pass","3","1.1.1,2.1.1,4.1.2","" +"canvas_content_described","Manual_1","The <canvas> element may not be accessible","Verify accessibility of the <canvas> element","Rec Manual","3","1.1.1,2.1.1,4.1.2","" +"img_alt_background","Pass_0","Background images that convey important information must have a text alternative that describes the image","Rule Passed","Pass","2","1.1.1","" +"img_alt_background","Manual_1","Background images that convey important information must have a text alternative that describes the image","Verify important background image information has a text alternative in system high contrast mode","Rec Manual","2","1.1.1","" +"media_audio_transcribed","Manual_1","Audio information should also be available in text form","Provide transcripts for audio files","Rec Manual","3","1.2.1","" +"caption_track_exists","Pass_0","A <video> element must have a text alternative for any meaningful audio content","Rule Passed","Pass","1","1.2.2","" +"caption_track_exists","Potential_1","A <video> element must have a text alternative for any meaningful audio content","Verify that captions are available for any meaningful audio or provide a caption track for the <video> element","Violation Potential","1","1.2.2","" +"media_track_available","Manual_1","Pre-recorded media should have an audio track that describes visual information","Verify availability of a user-selectable audio track with description of visual content","Rec Manual","3","1.2.3,1.2.5","" +"media_live_captioned","Manual_1","Live media (streaming video with audio) should have captions for audio content","Verify captions are provided for live media (streaming video with audio)","Rec Manual","1","1.2.4","" +"media_track_available","Manual_1","Pre-recorded media should have an audio track that describes visual information","Verify availability of a user-selectable audio track with description of visual content","Rec Manual","3","1.2.3,1.2.5","" +"input_checkboxes_grouped","pass_lonenogroup","Related sets of radio buttons or checkboxes should be programmatically grouped","{0} grouping not required for a control of this type","Pass","2","1.3.1","" +"input_checkboxes_grouped","pass_grouped","Related sets of radio buttons or checkboxes should be programmatically grouped","{0} input is grouped with other related controls with the same name","Pass","2","1.3.1","" +"input_checkboxes_grouped","pass_radiononame","Related sets of radio buttons or checkboxes should be programmatically grouped","Radio input is not grouped, but passes because it has no name to group with other radio inputs","Pass","2","1.3.1","" +"input_checkboxes_grouped","fail_controlnamemismatch","Related sets of radio buttons or checkboxes should be programmatically grouped","{0} input found that has the same name, ""{2}"" as a {1} input","Violation","2","1.3.1","" +"input_checkboxes_grouped","fail_notgroupedothergrouped","Related sets of radio buttons or checkboxes should be programmatically grouped","{0} input is not in the group with another {0} with the name ""{1}""","Violation","2","1.3.1","" +"input_checkboxes_grouped","fail_notgroupedothernotgrouped","Related sets of radio buttons or checkboxes should be programmatically grouped","{0} input and others with the name ""{1}"" are not grouped together","Violation","2","1.3.1","" +"input_checkboxes_grouped","fail_notsamegroup","Related sets of radio buttons or checkboxes should be programmatically grouped","{0} input is in a different group than another {0} with the name ""{1}""","Violation","2","1.3.1","" +"input_checkboxes_grouped","potential_lonecheckbox","Related sets of radio buttons or checkboxes should be programmatically grouped","Verify that this ungrouped checkbox input is not related to other checkboxes","Violation Potential","2","1.3.1","" +"input_checkboxes_grouped","potential_unnamedcheckbox","Related sets of radio buttons or checkboxes should be programmatically grouped","Verify that this un-named, ungrouped checkbox input is not related to other checkboxes","Violation Potential","2","1.3.1","" +"table_headers_ref_valid","Pass_0","The 'headers' attribute should refer to a valid cell in the same table","Rule Passed","Pass","2","1.3.1","a25f45:pass" +"table_headers_ref_valid","Fail_1","The 'headers' attribute should refer to a valid cell in the same table","The 'headers' attribute value ""{0}"" does not reference a valid 'id' in this document","Violation","2","1.3.1","a25f45:fail" +"table_headers_ref_valid","Fail_2","The 'headers' attribute should refer to a valid cell in the same table","The 'headers' attribute value ""{0}"" refers to itself","Violation","2","1.3.1","a25f45:fail" +"table_headers_ref_valid","Fail_3","The 'headers' attribute should refer to a valid cell in the same table","The 'headers' attribute value ""{0}"" does not refer to a cell in the same table","Violation","2","1.3.1","a25f45:fail" +"table_headers_ref_valid","Fail_4","The 'headers' attribute should refer to a valid cell in the same table","The 'headers' attribute value ""{0}"" does not refer to a cell indicated with <th> or a role of ""columnheader"" or ""rowheader""","Violation","2","1.3.1","a25f45:fail" +"fieldset_label_valid","Pass_1","Groups with nested inputs must have unique accessible name","Group/Fieldset ""{0}"" with an input has a unique name","Pass","3","1.3.1,3.3.2","" +"fieldset_label_valid","Fail_1","Groups with nested inputs must have unique accessible name","Group/Fieldset does not have an accessible name","Violation","3","1.3.1,3.3.2","" +"fieldset_label_valid","Fail_2","Groups with nested inputs must have unique accessible name","Group/Fieldset ""{0}"" has a duplicate name to another group","Violation","3","1.3.1,3.3.2","" +"table_scope_valid","Pass_0","Value for 'scope' attribute must be ""row"", ""col"", ""rowgroup"", or ""colgroup""","Rule Passed","Pass","2","1.3.1","" +"table_scope_valid","Fail_1","Value for 'scope' attribute must be ""row"", ""col"", ""rowgroup"", or ""colgroup""","Value provided is invalid for the 'scope' attribute","Violation","2","1.3.1","" +"table_scope_valid","Fail_2","Value for 'scope' attribute must be ""row"", ""col"", ""rowgroup"", or ""colgroup""","The 'scope' attribute should only be used on a <th> element","Violation","2","1.3.1","" +"aria_banner_label_unique","pass","Each element with ""banner"" role must have a unique label that describes its purpose","The element with ""banner"" role has a unique label that describes its purpose","Pass","3","1.3.1","" +"aria_banner_label_unique","fail_label_not_unique","Each element with ""banner"" role must have a unique label that describes its purpose","Multiple elements with ""banner"" role do not have unique labels","Violation","3","1.3.1","" +"aria_banner_single","Pass_0","A page, document, or application should only have one element with ""banner"" role","Rule Passed","Pass","3","1.3.1","" +"aria_banner_single","Fail_1","A page, document, or application should only have one element with ""banner"" role","Multiple elements with ""banner"" role found on the page","Violation","3","1.3.1","" +"aria_complementary_label_unique","pass","Each element with ""complementary"" role must have a unique label that describes its purpose","The element with ""complementary"" role has a unique label that describes its purpose","Pass","3","1.3.1","" +"aria_complementary_label_unique","fail_label_not_unique","Each element with ""complementary"" role must have a unique label that describes its purpose","Multiple elements with ""complementary"" role do not have unique labels","Violation","3","1.3.1","" +"aria_complementary_labelled","Pass_0","Each element with ""complementary"" role must have a label that describes its purpose","Rule Passed","Pass","3","1.3.1","" +"aria_complementary_labelled","Fail_1","Each element with ""complementary"" role must have a label that describes its purpose","Element with ""complementary"" role does not have a label","Violation","3","1.3.1","" +"aria_content_in_landmark","Pass_0","All content must reside within an element with a landmark role","Rule Passed","Pass | Pass","3 | 3","1.3.1 | 1.3.1","" +"aria_content_in_landmark","Fail_1","All content must reside within an element with a landmark role","Content is not within a landmark element","Violation | Rec","3 | 3","1.3.1 | 1.3.1","" +"aria_contentinfo_label_unique","pass","Each element with ""contentinfo"" role must have a unique label that describes its purpose","The element with ""contentinfo"" role has a unique label that describes its purpose","Pass","3","1.3.1","" +"aria_contentinfo_label_unique","fail_label_not_unique","Each element with ""contentinfo"" role must have a unique label that describes its purpose","Multiple elements with ""contentinfo"" role do not have unique labels","Violation","3","1.3.1","" +"aria_contentinfo_single","Pass_0","A page, document, or application should only have one element with ""contentinfo"" role","Rule Passed","Pass","3","1.3.1","" +"aria_contentinfo_single","Fail_1","A page, document, or application should only have one element with ""contentinfo"" role","Multiple elements with ""contentinfo"" role found on the page","Violation","3","1.3.1","" +"aria_form_label_unique","pass","Each element with ""form"" role must have a unique label that describes its purpose","The element with ""form"" role has a unique label that describes its purpose","Pass","3","1.3.1","" +"aria_form_label_unique","fail_label_not_unique","Each element with ""form"" role must have a unique label that describes its purpose","Multiple elements with ""form"" role do not have unique labels","Violation","3","1.3.1","" +"aria_hidden_nontabbable","Pass_0","A hidden element should not contain any tabbable elements","Rule Passed","Pass","2","1.3.1,4.1.2","6cfa84:pass" +"aria_hidden_nontabbable","Fail_1","A hidden element should not contain any tabbable elements","Element ""{0}"" should not be focusable within the subtree of an element with an 'aria-hidden' attribute with value 'true'","Violation","2","1.3.1,4.1.2","6cfa84:fail" +"aria_landmark_name_unique","pass","Each landmark should have a unique 'aria-labelledby' or 'aria-label' or be nested in a different parent region","Multiple elements with ""{0}"" landmarks within the same parent region are distinguished by unique 'aria-label' or 'aria-labelledby'","Pass | Pass","3 | 3","1.3.1 | 1.3.1","" +"aria_landmark_name_unique","fail_label_not_unique","Each landmark should have a unique 'aria-labelledby' or 'aria-label' or be nested in a different parent region","Multiple elements with ""{0}"" landmarks within the same parent region are not distinguished from one another because they have the same ""{1}"" label","Violation | Rec","3 | 3","1.3.1 | 1.3.1","" +"aria_main_label_unique","Pass_0","Each element with ""main"" role must have unique label that describes its purposes","Rule Passed","Pass","3","1.3.1","" +"aria_main_label_unique","Fail_1","Each element with ""main"" role must have unique label that describes its purposes","Multiple elements with ""main"" role do not have unique labels","Violation","3","1.3.1","" +"aria_navigation_label_unique","pass","Each element with ""navigation"" role must have a unique label that describes its purpose","The element with ""navigation"" role has a unique label that describes its purpose","Pass","3","1.3.1","" +"aria_navigation_label_unique","fail_label_not_unique","Each element with ""navigation"" role must have a unique label that describes its purpose","Multiple elements with ""navigation"" role do not have unique labels","Violation","3","1.3.1","" +"aria_parent_required","Pass_0","Each element with an implicit or explicit role must be contained within a valid element","Rule Passed","Pass","1","1.3.1","ff89c9:pass" +"aria_parent_required","Fail_1","Each element with an implicit or explicit role must be contained within a valid element","Element with ""{0}"" role is not contained in or owned by an element with one of the following roles: ""{1}""","Violation","1","1.3.1","ff89c9:fail" +"aria_region_label_unique","pass","Each element with ""region"" role must have a unique label that describes its purpose","The element with ""region"" role has a unique label that describes its purpose","Pass","3","1.3.1","" +"aria_region_label_unique","fail_label_not_unique","Each element with ""region"" role must have a unique label that describes its purpose","Multiple elements with ""region"" role do not have unique labels","Violation","3","1.3.1","" +"aria_region_labelled","Pass_0","Each element with ""region"" role must have a label that describes its purpose","Rule Passed","Pass","3","1.3.1","" +"aria_region_labelled","Fail_1","Each element with ""region"" role must have a label that describes its purpose","Element with ""region"" role does not have a label","Violation","3","1.3.1","" +"form_label_unique","Pass_0","Form controls should have exactly one label","Rule Passed","Pass","1","1.3.1","" +"form_label_unique","Fail_1","Form controls should have exactly one label","Form control has more than one label","Violation","1","1.3.1","" +"label_ref_valid","pass","The 'for' attribute for a label should reference a non-empty, unique 'id' attribute of a valid element","The 'for' attribute for a label referencea a unique non-empty 'id' attribute of a valid element","Pass","1","1.3.1","" +"label_ref_valid","fail_invalid","The 'for' attribute for a label should reference a non-empty, unique 'id' attribute of a valid element","The value ""{0}"" of the 'for' attribute is not the 'id' of a valid element","Violation","1","1.3.1","" +"table_caption_empty","Pass_0","A <caption> element for a <table> element must contain descriptive text","Rule Passed","Pass","1","1.3.1","" +"table_caption_empty","Fail_1","A <caption> element for a <table> element must contain descriptive text","The <table> element has an empty <caption> element","Violation","1","1.3.1","" +"table_caption_nested","Pass_0","The <caption> element must be nested inside the associated <table> element","Rule Passed","Pass","3","1.3.1","" +"table_caption_nested","Fail_1","The <caption> element must be nested inside the associated <table> element","<caption> element is not nested inside a <table> element","Violation","3","1.3.1","" +"table_headers_exists","Pass_0","Data table must identify headers","Rule Passed","Pass","1","1.3.1","" +"table_headers_exists","Fail_1","Data table must identify headers","Table has no headers identified","Violation","1","1.3.1","" +"table_headers_related","Pass_0","For a complex data table, all <th> and <td> elements must be related via 'header' or 'scope' attributes","Rule Passed","Pass","2","1.3.1","" +"table_headers_related","Fail_1","For a complex data table, all <th> and <td> elements must be related via 'header' or 'scope' attributes","Complex table does not have headers for each cell properly defined with 'header' or 'scope'","Violation","2","1.3.1","" +"table_structure_misuse","Pass_0","Table elements with 'role=""presentation"" or 'role=""none"" should not have structural elements or attributes","Rule Passed","Pass","2","1.3.1","" +"table_structure_misuse","Fail_1","Table elements with 'role=""presentation"" or 'role=""none"" should not have structural elements or attributes","The <{0}> element with ""presentation"" role or ""none"" role has structural element(s) and/or attribute(s) '{1}'","Violation","2","1.3.1","" +"table_summary_redundant","Pass_0","The table summary must not duplicate the caption","Rule Passed","Pass","3","1.3.1","" +"table_summary_redundant","Fail_1","The table summary must not duplicate the caption","The table summary duplicates the caption","Violation","3","1.3.1","" +"blockquote_cite_exists","Pass_0","Use <blockquote> only for quotations, not indentation","Rule Passed","Pass","3","1.3.1","" +"blockquote_cite_exists","Potential_1","Use <blockquote> only for quotations, not indentation","Verify that <blockquote> should have a 'cite' attribute and not be used for indentation only","Violation Potential","3","1.3.1","" +"heading_markup_misuse","Pass_0","Heading elements must not be used for presentation","Rule Passed","Pass","2","1.3.1","" +"heading_markup_misuse","Potential_1","Heading elements must not be used for presentation","Verify that the heading element is a genuine heading","Violation Potential","2","1.3.1","" +"text_quoted_correctly","Pass_0","Quotations should be marked with <q> or <blockquote> elements","Rule Passed","Pass","3","1.3.1","" +"text_quoted_correctly","Potential_1","Quotations should be marked with <q> or <blockquote> elements","If the following text is a quotation, mark it as a <q> or <blockquote> element: {0}","Violation Potential","3","1.3.1","" +"list_markup_review","potential_list","Proper HTML elements should be used to create a list","Verify this is a list and if so, modify to use proper HTML elements for the list","Violation Potential","3","1.3.1","" +"text_block_heading","potential_heading","Heading text should use a heading element or role","Confirm this text '{0}' is used as a heading and if so, modify to use a heading element or role","Violation Potential","1","1.3.1","" +"fieldset_legend_valid","Pass_0"," <fieldset> elements should have a single, non-empty <legend> as a label","Rule Passed","Pass","1","1.3.1","" +"fieldset_legend_valid","Fail_1"," <fieldset> elements should have a single, non-empty <legend> as a label","<fieldset> element does not have a <legend>","Rec","1","1.3.1","" +"fieldset_legend_valid","Fail_2"," <fieldset> elements should have a single, non-empty <legend> as a label","<fieldset> element has more than one <legend>","Rec","1","1.3.1","" +"fieldset_legend_valid","Fail_3"," <fieldset> elements should have a single, non-empty <legend> as a label","<fieldset> element <legend> is empty","Rec","1","1.3.1","" +"aria_child_valid","Pass","An element with an ARIA role must own a required child","An element with an ARIA role owns a required child","Pass","1","1.3.1","bc4a75:pass" +"aria_child_valid","Fail_no_child","An element with an ARIA role must own a required child","The element with role ""{0}"" does not own any child element with any of the following role(s): ""{1}""","Rec","1","1.3.1","bc4a75:fail" +"aria_child_valid","Fail_invalid_child","An element with an ARIA role must own a required child","The element with role ""{0}"" owns the child element with the role ""{1}"" that is not one of the allowed role(s): ""{2}""","Rec","1","1.3.1","bc4a75:fail" +"aria_complementary_label_visible","Pass_0","Each element with ""complementary"" role should have a visible label that describes its purpose","Rule Passed","Pass","3","1.3.1","" +"aria_complementary_label_visible","Fail_1","Each element with ""complementary"" role should have a visible label that describes its purpose","Element with ""complementary"" role does not have a visible label","Rec","3","1.3.1","" +"aria_contentinfo_misuse","Pass_0","Each element with ""contentinfo"" role is only permitted with an element with ""main"" role","Rule Passed","Pass","3","1.3.1","" +"aria_contentinfo_misuse","Fail_1","Each element with ""contentinfo"" role is only permitted with an element with ""main"" role","Element with ""contentinfo"" role is present without an element with ""main"" role","Rec","3","1.3.1","" +"aria_main_label_visible","Pass_0","Each element with ""main"" role should have a unique visible label that describes its purpose","Rule Passed","Pass","3","1.3.1","" +"aria_main_label_visible","Fail_1","Each element with ""main"" role should have a unique visible label that describes its purpose","Multiple elements with ""main"" role do not have unique visible labels","Rec","3","1.3.1","" +"input_fields_grouped","Pass_0","Groups of logically related input elements should be contained within a <fieldset> element","Rule Passed","Pass","2","1.3.1","" +"input_fields_grouped","Potential_1","Groups of logically related input elements should be contained within a <fieldset> element","Use the <fieldset> element to group logically related input elements","Rec Potential","2","1.3.1","" +"list_structure_proper","Pass_0","List elements should only be used for lists of related items","Rule Passed","Pass","3","1.3.1","" +"list_structure_proper","Potential_1","List elements should only be used for lists of related items","List element is missing or improperly structured","Rec Potential","3","1.3.1","" +"select_options_grouped","Pass_0","Groups of related options within a selection list should be grouped with <optgroup>","Rule Passed","Pass","3","1.3.1","" +"select_options_grouped","Potential_1","Groups of related options within a selection list should be grouped with <optgroup>","Group of related options may need <optgroup>","Rec Potential","3","1.3.1","" +"table_layout_linearized","Pass_0","Avoid using tables to format text documents in columns unless the table can be linearized","Rule Passed","Pass","4","1.3.1","" +"table_layout_linearized","Potential_1","Avoid using tables to format text documents in columns unless the table can be linearized","Verify table is not being used to format text content in columns unless the table can be linearized","Rec Potential","4","1.3.1","" +"dir_attribute_valid","Pass_0","'dir' attribute value must be ""ltr"", ""rtl"", or ""auto""","Rule Passed","Pass","3","1.3.2","" +"dir_attribute_valid","Fail_1","'dir' attribute value must be ""ltr"", ""rtl"", or ""auto""","Invalid value used for the 'dir' attribute","Violation","3","1.3.2","" +"text_whitespace_valid","pass","Space characters should not be used to control spacing within a word","Rule Passed","Pass","3","1.3.2","" +"text_whitespace_valid","potential_text","Space characters should not be used to control spacing within a word","Space characters should not be used to create space between the letters of a word","Violation Potential","3","1.3.2","" +"style_highcontrast_visible","Pass_0","Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content","Rule Passed","Pass | Pass","1 | 1","1.1.1,1.3.2,1.4.11 | 1.1.1,1.3.2,1.4.11","" +"style_highcontrast_visible","Manual_1","Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content","Confirm Windows high contrast mode is supported when using CSS to include, position or alter non-decorative content","Violation Manual | Rec Manual","1 | 1","1.1.1,1.3.2,1.4.11 | 1.1.1,1.3.2,1.4.11","" +"text_sensory_misuse","potential_position","Instructions should be meaningful without relying solely on shape, size, or location words","Confirm the word(s) '{0}' of the user instruction is used to indicate a logical rather than visual position","Violation Potential","2","1.3.3","" +"text_sensory_misuse","potential_other","Instructions should be meaningful without relying solely on shape, size, or location words","Confirm the user instruction is still understandable without the word(s) '{0}'","Violation Potential","2","1.3.3","" +"element_orientation_unlocked","pass","Elements should not be restricted to either landscape or portrait orientation using CSS transform property","The element is not restricted to either landscape or portrait orientation using CSS transform property","Pass","2","1.3.4","b33eff:pass" +"element_orientation_unlocked","fail_locked","Elements should not be restricted to either landscape or portrait orientation using CSS transform property","The element <{0}> is restricted to either landscape or portrait orientation using CSS transform property","Violation","2","1.3.4","b33eff:fail" +"input_autocomplete_valid","pass","The 'autocomplete' attribute's token(s) must be appropriate for the input form field","The 'autocomplete' attribute's token(s) is appropriate for the input form field","Pass","3","1.3.5","73f2c2:pass" +"input_autocomplete_valid","fail_inappropriate","The 'autocomplete' attribute's token(s) must be appropriate for the input form field","The 'autocomplete' attribute's token(s) are not appropriate for the input form field","Violation","3","1.3.5","73f2c2:fail" +"input_autocomplete_valid","fail_invalid","The 'autocomplete' attribute's token(s) must be appropriate for the input form field","The 'autocomplete' attribute's token(s) are not appropriate for an input form field of any type","Violation","3","1.3.5","73f2c2:pass" +"input_autocomplete_valid","fail_incorrect","The 'autocomplete' attribute's token(s) must be appropriate for the input form field","The 'autocomplete' attribute has an incorrect value","Violation","3","1.3.5","73f2c2:fail" +"form_font_color","Pass_0","Combine color and descriptive markup to indicate required form fields","Rule Passed","Pass","2","1.4.1","" +"form_font_color","Potential_1","Combine color and descriptive markup to indicate required form fields","Check color is not used as the only visual means to convey which fields are required","Violation Potential","2","1.4.1","" +"style_color_misuse","Pass_0","Combine color and descriptive markup to convey information","Rule Passed","Pass","2","1.4.1","" +"style_color_misuse","Potential_1","Combine color and descriptive markup to convey information","Verify color is not used as the only visual means of conveying information","Violation Potential","2","1.4.1","" +"media_autostart_controllable","Pass_0","Mechanism must be available to pause or stop and control the volume of the audio that plays automatically","Rule Passed","Pass","2","1.4.2","" +"media_autostart_controllable","Potential_1","Mechanism must be available to pause or stop and control the volume of the audio that plays automatically","Verify there is a mechanism to pause or stop and control the volume for the audio that plays automatically","Violation Potential","2","1.4.2","" +"text_contrast_sufficient","pass","The contrast ratio of text with its background must meet WCAG AA requirements","The contrast ratio of text with its background meets WCAG AA requirements","Pass","1","1.4.3","afw4f7:pass" +"text_contrast_sufficient","fail_contrast","The contrast ratio of text with its background must meet WCAG AA requirements","Text contrast of {0} with its background is less than the WCAG AA minimum requirements for text of size {1}px and weight of {2}","Violation","1","1.4.3","afw4f7:fail" +"text_contrast_sufficient","potential_same_color","The contrast ratio of text with its background must meet WCAG AA requirements","The foreground text and its background color are both detected as {3}. Verify the text meets the WCAG AA requirements for minimum contrast","Violation Potential","1","1.4.3","afw4f7:cantTell" +"text_contrast_sufficient","potential_graphic_background","The contrast ratio of text with its background must meet WCAG AA requirements","Verify the contrast ratio of the text against the lightest and the darkest colors of the background meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}","Violation Potential","1","1.4.3","afw4f7:cantTell" +"text_contrast_sufficient","potential_text_shadow","The contrast ratio of text with its background must meet WCAG AA requirements","Verify the contrast ratio of the text with shadow meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}","Violation Potential","1","1.4.3","afw4f7:cantTell" +"style_viewport_resizable","Pass_0","Text must scale up to 200% without loss of content or functionality","Rule Passed","Pass","3","1.4.4,1.4.10","" +"style_viewport_resizable","Potential_1","Text must scale up to 200% without loss of content or functionality","Verify that text sized using viewport units can be resized up to 200%","Violation Potential","3","1.4.4,1.4.10","" +"meta_viewport_zoomable","pass","The 'meta[name=viewport]' should not prevent the browser zooming the content","The 'meta[name=viewport]' does not prevent the browser zooming the content","Pass","3","1.4.4","b4f0c3:pass" +"meta_viewport_zoomable","potential_zoomable","The 'meta[name=viewport]' should not prevent the browser zooming the content","Confirm the 'meta[name=viewport]' with ""{0}"" can be zoomed by user","Rec Potential","3","1.4.4","b4f0c3:fail" +"style_viewport_resizable","Pass_0","Text must scale up to 200% without loss of content or functionality","Rule Passed","Pass","3","1.4.4,1.4.10","" +"style_viewport_resizable","Potential_1","Text must scale up to 200% without loss of content or functionality","Verify that text sized using viewport units can be resized up to 200%","Violation Potential","3","1.4.4,1.4.10","" +"style_highcontrast_visible","Pass_0","Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content","Rule Passed","Pass | Pass","1 | 1","1.1.1,1.3.2,1.4.11 | 1.1.1,1.3.2,1.4.11","" +"style_highcontrast_visible","Manual_1","Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content","Confirm Windows high contrast mode is supported when using CSS to include, position or alter non-decorative content","Violation Manual | Rec Manual","1 | 1","1.1.1,1.3.2,1.4.11 | 1.1.1,1.3.2,1.4.11","" +"text_spacing_valid","pass","CSS !important should not be used in inline style to control letter or word spacing or line height","CSS !important is not used in inline style to control letter or word spacing or line height","Pass","3","1.4.12","9e45ec:pass | 24afc2:pass | 78fd32:pass" +"text_spacing_valid","fail_letter_spacing_style","CSS !important should not be used in inline style to control letter or word spacing or line height","CSS !important should not be used in inline ‘letter-spacing’ style","Violation","3","1.4.12","9e45ec:fail | 24afc2:fail | 78fd32:fail" +"text_spacing_valid","fail_word_spacing_style","CSS !important should not be used in inline style to control letter or word spacing or line height","CSS !important should not be used in inline ‘word-spacing’ style","Violation","3","1.4.12","9e45ec:fail | 24afc2:fail | 78fd32:fail" +"text_spacing_valid","fail_line_height_style","CSS !important should not be used in inline style to control letter or word spacing or line height","CSS !important should not be used in inline ‘line-height’ style","Violation","3","1.4.12","9e45ec:fail | 24afc2:fail | 78fd32:fail" +"style_hover_persistent","Pass_0","The pointer should be able to move over content displayed on hover","the hover: pseudo-class is not used to display content","Pass","2","1.4.13","" +"style_hover_persistent","Pass_2","The pointer should be able to move over content displayed on hover","content displayed via the :hover pseudo-class is the adjacent sibling of the trigger element","Pass","2","1.4.13","" +"style_hover_persistent","Potential_1","The pointer should be able to move over content displayed on hover","Confirm the pointer can be positioned over the displayed element, not just the trigger","Violation Potential","2","1.4.13","" +"style_hover_persistent","Potential_2","The pointer should be able to move over content displayed on hover","Confirm the pointer can be positioned over all the information displayed on hover","Violation Potential","2","1.4.13","" +"style_hover_persistent","Potential_3","The pointer should be able to move over content displayed on hover","Confirm the margin style attribute has not prevented the pointer from hovering over the displayed element, not just the trigger","Violation Potential","2","1.4.13","" +"aria_activedescendant_tabindex_valid","pass","Element using 'aria-activedescendant' property should be tabbable","Rule Passed","Pass","1","2.1.1","" +"aria_activedescendant_tabindex_valid","Fail_1","Element using 'aria-activedescendant' property should be tabbable","The <{0}> element using 'aria-activedescendant' set to ""{1}"" is not tabbable","Violation","1","2.1.1","" +"aria_child_tabbable","pass","UI component must have at least one tabbable descendant for keyboard access","Rule Passed","Pass","1","2.1.1","" +"aria_child_tabbable","fail_missing_child","UI component must have at least one tabbable descendant for keyboard access","None of the descendent elements with ""{1}"" role is tabbable","Violation","1","2.1.1","" +"iframe_interactive_tabbable","pass","Iframe with interactive content should not be excluded from tab order using tabindex","The iframe with interactive content is not excluded from the tab order using tabindex","Pass","1","2.1.1","akn7bn:pass" +"iframe_interactive_tabbable","fail_invalid","Iframe with interactive content should not be excluded from tab order using tabindex","The <iframe> with interactive content is excluded from tab order using tabindex","Violation","1","2.1.1","akn7bn:fail" +"application_content_accessible","Pass_0","Non-decorative static text and image content within an element with ""application"" role must be accessible","Rule Passed","Pass","1","1.1.1,2.1.1","" +"application_content_accessible","Potential_1","Non-decorative static text and image content within an element with ""application"" role must be accessible","Verify that the non-decorative static text and image content within an element with ""application"" role are accessible","Violation Potential","1","1.1.1,2.1.1","" +"aria_keyboard_handler_exists","pass","Interactive WAI_ARIA UI components must provide keyboard access","Rule Passed","Pass","1","2.1.1","" +"aria_keyboard_handler_exists","potential_no_keyboard_access","Interactive WAI_ARIA UI components must provide keyboard access","Verify the <{0}> element with ""{1}"" role has keyboard access","Violation Potential","1","2.1.1","" +"script_focus_blur_review","Pass_0","Scripting must not remove focus from content that normally receives focus","Rule Passed","Pass","1","2.1.1,2.4.7,3.2.1","" +"script_focus_blur_review","Potential_1","Scripting must not remove focus from content that normally receives focus","Verify script does not remove focus from content that normally receives focus","Violation Potential","1","2.1.1,2.4.7,3.2.1","" +"script_onclick_misuse","Pass_0","Scripts should not be used to emulate links","Rule Passed","Pass","1","2.1.1","" +"script_onclick_misuse","Potential_1","Scripts should not be used to emulate links","Possible use of a script to emulate a link","Violation Potential","1","2.1.1","" +"widget_tabbable_exists","pass","Component must have at least one tabbable element","Rule Passed","Pass","1","2.1.1","" +"widget_tabbable_exists","fail_no_tabbable","Component must have at least one tabbable element","Component with ""{0}"" role does not have a tabbable element","Violation Potential","1","2.1.1","" +"widget_tabbable_single","pass","Components with a widget role must have no more than one tabbable element","Components with a widget role should have no more than one tabbable element","Pass","1","2.1.1,2.4.3","" +"widget_tabbable_single","potential_multiple_tabbable","Components with a widget role must have no more than one tabbable element","Component with ""{0}"" role has more than one tabbable element","Violation Potential","1","2.1.1,2.4.3","" +"media_keyboard_controllable","Pass_0","Media using <audio> and/or <video> elements must have keyboard accessible controls","Rule Passed","Pass","2","2.1.1","" +"media_keyboard_controllable","Manual_1","Media using <audio> and/or <video> elements must have keyboard accessible controls","Verify media using <audio> and/or <video> elements have keyboard accessible controls","Violation Manual","2","2.1.1","" +"script_onclick_avoid","Pass_0","Scripts should not be used to emulate links","Rule Passed","Pass","4","2.1.1","" +"script_onclick_avoid","Potential_1","Scripts should not be used to emulate links","Verify that 'onclick' events are not used in script to emulate a link","Rec Potential","4","2.1.1","" +"canvas_content_described","Pass_0","The <canvas> element may not be accessible","Rule Passed","Pass","3","1.1.1,2.1.1,4.1.2","" +"canvas_content_described","Manual_1","The <canvas> element may not be accessible","Verify accessibility of the <canvas> element","Rec Manual","3","1.1.1,2.1.1,4.1.2","" +"element_mouseevent_keyboard","Pass_0","All interactive content with mouse event handlers must have equivalent keyboard access","Rule Passed","Pass","1","2.1.1","" +"element_mouseevent_keyboard","Manual_1","All interactive content with mouse event handlers must have equivalent keyboard access","Confirm the <{0}> element with mouse event handler(s) '{1}' has a corresponding keyboard handler(s)","Rec Manual","1","2.1.1","" +"download_keyboard_controllable","Manual_1","File download mechanisms should be keyboard-operable and preserve page focus location","Verify that the file download mechanism does not cause a keyboard trap","Rec Manual","1","2.1.2","" +"meta_refresh_delay","pass","Pages should not refresh automatically","Pages do not refresh automatically","Pass","3","2.2.1","bc659a:pass" +"meta_refresh_delay","potential_refresh","Pages should not refresh automatically","Verify page is not being caused to refresh automatically","Violation Potential","3","2.2.1","bc659a:cantTell" +"blink_elem_deprecated","Fail_1","Content that blinks persistently must not be used","Content found that blinks persistently","Violation","2","2.2.2","" +"marquee_elem_avoid","Fail_1","The <marquee> element is obsolete and should not be used","Scrolling content found that uses the obsolete <marquee> element","Violation","3","2.2.2","" +"blink_css_review","Pass_0","Do not use the ""blink"" value of the 'text-decoration' property for longer than five seconds","Rule Passed","Pass","2","2.2.2","" +"blink_css_review","Potential_1","Do not use the ""blink"" value of the 'text-decoration' property for longer than five seconds","Check the ""blink"" value of the CSS 'text-decoration' property is not used for more than than five seconds","Violation Potential","2","2.2.2","" +"aria_application_label_unique","pass","Each element with ""application"" role must have a unique label that describes its purpose","The element with ""application"" role has a unique label that describes its purpose","Pass","3","2.4.1","" +"aria_application_label_unique","fail_label_not_unique","Each element with ""application"" role must have a unique label that describes its purpose","Multiple elements with ""application"" role do not have unique labels","Violation","3","2.4.1","" +"aria_application_labelled","pass","Each element with ""application"" role must have a label that describes its purpose","The element with ""application"" role has a label that describes its purpose","Pass","3","2.4.1","" +"aria_application_labelled","fail_no_label","Each element with ""application"" role must have a label that describes its purpose","Element with ""application"" role does not have a label","Violation","3","2.4.1","" +"aria_article_label_unique","pass","Each element with ""article"" role must have a unique label that describes its purpose","The element with ""article"" role has a unique label that describes its purpose","Pass","3","2.4.1","" +"aria_article_label_unique","fail_label_not_unique","Each element with ""article"" role must have a unique label that describes its purpose","Multiple elements with ""article"" role do not have unique labels","Violation","3","2.4.1","" +"aria_document_label_unique","pass","Each element with ""document"" role must have a unique label that describes its purpose","The element with ""document"" role has a unique label that describes its purpose","Pass","3","2.4.1","" +"aria_document_label_unique","fail_label_not_unique","Each element with ""document"" role must have a unique label that describes its purpose","Multiple elements with ""document"" roles do not have unique labels","Violation","3","2.4.1","" +"aria_toolbar_label_unique","Pass_0","Each element with ""toolbar"" role must have a unique label that describes its purpose","Rule Passed","Pass","1","2.4.1","" +"aria_toolbar_label_unique","Fail_1","Each element with ""toolbar"" role must have a unique label that describes its purpose","Multiple elements with ""toolbar"" roles do not have unique labels","Violation","1","2.4.1","" +"skip_main_exists","Pass_0","Pages must provide a way to skip directly to the main content","Rule Passed","Pass","3","2.4.1","" +"skip_main_exists","Fail_1","Pages must provide a way to skip directly to the main content","The page does not provide a way to quickly navigate to the main content (ARIA ""main"" landmark or a skip link)","Violation","3","2.4.1","" +"frame_src_valid","Pass_0","A <frame> containing non-HTML content must be made accessible","Rule Passed","Pass","3","2.4.1","" +"frame_src_valid","Potential_1","A <frame> containing non-HTML content must be made accessible","Verify <frame> content is accessible","Violation Potential","3","2.4.1","" +"html_skipnav_exists","Pass_0","Provide a way to bypass blocks of content that are repeated on multiple Web pages","Rule Passed","Pass","3","2.4.1","" +"html_skipnav_exists","Potential_1","Provide a way to bypass blocks of content that are repeated on multiple Web pages","Verify there is a way to bypass blocks of content that are repeated on multiple Web pages","Violation Potential","3","2.4.1","" +"skip_main_described","Pass_0","The description of a hyperlink used to skip content must communicate where it links to","Rule Passed","Pass","3","2.4.1","" +"skip_main_described","Potential_1","The description of a hyperlink used to skip content must communicate where it links to","Verify that if this hyperlink skips content, the description communicates where it links to","Violation Potential","3","2.4.1","" +"page_title_exists","Pass_0","The page should have a title that correctly identifies the subject of the page","Rule Passed","Pass","1","2.4.2","2779a5:pass" +"page_title_exists","Fail_1","The page should have a title that correctly identifies the subject of the page","Missing <head> element so there can be no <title> element present","Violation","1","2.4.2","2779a5:pass" +"page_title_exists","Fail_2","The page should have a title that correctly identifies the subject of the page","Missing <title> element in <head> element","Violation","1","2.4.2","2779a5:fail" +"page_title_exists","Fail_3","The page should have a title that correctly identifies the subject of the page","The <title> element is empty (no innerHTML)","Violation","1","2.4.2","2779a5:fail" +"page_title_valid","Pass_0","Page <title> should be a descriptive title, rather than a filename","Rule Passed","Pass","1","2.4.2","" +"page_title_valid","Potential_2","Page <title> should be a descriptive title, rather than a filename","Verify that using the filename as the page <title> value is descriptive","Violation Potential","1","2.4.2","" +"widget_tabbable_single","pass","Components with a widget role must have no more than one tabbable element","Components with a widget role should have no more than one tabbable element","Pass","1","2.1.1,2.4.3","" +"widget_tabbable_single","potential_multiple_tabbable","Components with a widget role must have no more than one tabbable element","Component with ""{0}"" role has more than one tabbable element","Violation Potential","1","2.1.1,2.4.3","" +"img_alt_redundant","Pass_0","The text alternative for an image within a link should not repeat the link text or adjacent link text","Rule Passed","Pass","2","1.1.1,2.4.4","" +"img_alt_redundant","Fail_1","The text alternative for an image within a link should not repeat the link text or adjacent link text","Link text is repeated in an image 'alt' value within the same link","Violation","2","1.1.1,2.4.4","" +"img_alt_redundant","Fail_2","The text alternative for an image within a link should not repeat the link text or adjacent link text","Link text of previous link is repeated in image 'alt' value of a link","Violation","2","1.1.1,2.4.4","" +"img_alt_redundant","Fail_3","The text alternative for an image within a link should not repeat the link text or adjacent link text","Image 'alt' value within a link is repeated in link text of the link after","Violation","2","1.1.1,2.4.4","" +"a_text_purpose","pass","Hyperlinks must have an accessible name for their purpose","Hyperlink has a description of its purpose","Pass","2","2.4.4,4.1.2","c487ae:pass" +"a_text_purpose","fail_acc_name","Hyperlinks must have an accessible name for their purpose","Hyperlink has no link text, label or image with a text alternative","Violation","2","2.4.4,4.1.2","c487ae:fail" +"heading_content_exists","Pass_0","Heading elements must provide descriptive text","Heading element has descriptive text","Pass","1","2.4.6","" +"heading_content_exists","Fail_1","Heading elements must provide descriptive text","Heading element has no descriptive content","Rec","1","2.4.6","" +"element_tabbable_visible","pass","A tabbable element should be visible on the screen when it has keyboard focus","The tabbable element is visible on the screen","Pass","1","2.4.7","" +"element_tabbable_visible","potential_visible","A tabbable element should be visible on the screen when it has keyboard focus","Confirm the element should be tabbable and if so, it becomes visible when it has keyboard focus","Violation Potential","1","2.4.7","" +"script_focus_blur_review","Pass_0","Scripting must not remove focus from content that normally receives focus","Rule Passed","Pass","1","2.1.1,2.4.7,3.2.1","" +"script_focus_blur_review","Potential_1","Scripting must not remove focus from content that normally receives focus","Verify script does not remove focus from content that normally receives focus","Violation Potential","1","2.1.1,2.4.7,3.2.1","" +"style_focus_visible","potential_focus_not_visible","The keyboard focus indicator should be visible when default border or outline is modified by CSS","Check the keyboard focus indicator is visible when using CSS declaration for 'border' or 'outline'","Violation Potential","1","2.4.7","" +"style_focus_visible","pass_focus_visible","The keyboard focus indicator should be visible when default border or outline is modified by CSS","The keyboard focus indicator is visible or is not changed from the browser default","Pass","1","2.4.7","" +"element_tabbable_unobscured","pass","When an element receives focus, it is not entirely covered by other content","The element is not entirely covered by other content","Pass","3","2.4.11","" +"element_tabbable_unobscured","potential_obscured","When an element receives focus, it is not entirely covered by other content","Confirm that when the element receives focus, it is not covered or, if covered by user action, can be uncovered without moving focus","Violation Potential","3","2.4.11","" +"label_name_visible","Pass_0","Accessible name must match or contain the visible label text","Accessible name matches or contains the visible label text","Pass","2","2.5.3","2ee8b8:pass" +"label_name_visible","Fail_1","Accessible name must match or contain the visible label text","Accessible name does not match or contain the visible label text","Violation","2","2.5.3","2ee8b8:fail" +"input_label_visible","pass","An input element must have an associated visible label","The input element has an associated visible label","Pass","1","2.5.3,3.3.2","" +"input_label_visible","potential_placeholder_only","An input element must have an associated visible label","The ‘placeholder’ is the only visible label","Violation Potential","1","2.5.3,3.3.2","" +"input_label_visible","potential_no_label","An input element must have an associated visible label","The input element does not have an associated visible label","Violation Potential","1","2.5.3,3.3.2","" +"draggable_alternative_exists","pass_undraggable","A draggable element must have a ""single pointer"" alternative","The element ""{0}"" is not draggable","Pass","3","2.5.7","" +"draggable_alternative_exists","potential_alternative","A draggable element must have a ""single pointer"" alternative","Ensure the draggable element ""{0}"" has a ""single pointer"" alternative","Violation Potential","3","2.5.7","" +"target_spacing_sufficient","pass_spacing","The target must be sufficiently sized or spaced from other targets","The target's spacing from other targets is sufficient","Pass | Pass","3 | 3","2.5.8 | 2.5.8","" +"target_spacing_sufficient","pass_sized","The target must be sufficiently sized or spaced from other targets","The target’s size is more than 24 CSS pixels","Pass | Pass","3 | 3","2.5.8 | 2.5.8","" +"target_spacing_sufficient","pass_inline","The target must be sufficiently sized or spaced from other targets","The target is in a sentence or its size is otherwise constrained by the line-height of non-target text","Pass | Pass","3 | 3","2.5.8 | 2.5.8","" +"target_spacing_sufficient","pass_default","The target must be sufficiently sized or spaced from other targets","The target's size is determined by the user agent and is not modified by the author","Pass | Pass","3 | 3","2.5.8 | 2.5.8","" +"target_spacing_sufficient","violation_spacing","The target must be sufficiently sized or spaced from other targets","Undersized target ""{0}"" does not have sufficient spacing of 12 CSS pixels from another target ""{1}""","Violation | Rec","3 | 3","2.5.8 | 2.5.8","" +"target_spacing_sufficient","potential_overlap","The target must be sufficiently sized or spaced from other targets","Ensure the overlapped target ""{0}"" meets a minimum target size or has sufficient spacing from the overlapping target ""{1}""","Violation Potential | Rec Potential","3 | 3","2.5.8 | 2.5.8","" +"html_lang_exists","Pass_0","Page must identify the default language of the document with a 'lang' attribute","Page language detected as ""{0}""","Pass","1","3.1.1","b5c3f8:pass | 5b7ae0:pass" +"html_lang_exists","Fail_1","Page must identify the default language of the document with a 'lang' attribute","Page detected as XHTML 1.0, but has neither 'lang' nor 'xml:lang' attributes","Violation","1","3.1.1","b5c3f8:inapplicable | 5b7ae0:inapplicable" +"html_lang_exists","Fail_2","Page must identify the default language of the document with a 'lang' attribute","Page detected as XHTML, but does not have an 'xml:lang' attribute","Violation","1","3.1.1","b5c3f8:inapplicable | 5b7ae0:inapplicable" +"html_lang_exists","Fail_3","Page must identify the default language of the document with a 'lang' attribute","Page detected as HTML, but does not have a 'lang' attribute","Violation","1","3.1.1","b5c3f8:fail | 5b7ae0:inapplicable" +"html_lang_exists","Fail_4","Page must identify the default language of the document with a 'lang' attribute","Page detected with 'lang' and 'xml:lang' attributes and primary languages do not match: ""{0}"", ""{1}""","Violation","1","3.1.1","b5c3f8:inapplicable | 5b7ae0:fail" +"html_lang_exists","Fail_5","Page must identify the default language of the document with a 'lang' attribute","Page detected with 'lang' and 'xml:lang' attributes that do not match: ""{0}"", ""{1}""","Violation","1","3.1.1","b5c3f8:inapplicable | 5b7ae0:pass" +"html_lang_exists","Potential_5","Page must identify the default language of the document with a 'lang' attribute","Page detected as XHTML 1.0 with only a 'lang' attribute. Confirm that page is only delivered via text/html mime type","Violation Potential","1","3.1.1","b5c3f8:inapplicable | 5b7ae0:inapplicable" +"html_lang_exists","Potential_6","Page must identify the default language of the document with a 'lang' attribute","Page detected as XHTML 1.0 with only an 'xml:lang' attribute. Confirm that page is only delivered via xml mime type","Violation Potential","1","3.1.1","b5c3f8:inapplicable | 5b7ae0:inapplicable" +"html_lang_valid","Pass_0","The default human language of the page must be valid and specified in accordance with BCP 47","Lang has a valid primary lang and conforms to BCP 47","Pass","1","3.1.1","b5c3f8:pass | bf051a:pass" +"html_lang_valid","Fail_1","The default human language of the page must be valid and specified in accordance with BCP 47","Specified 'lang' attribute does not include a valid primary language","Violation","1","3.1.1","b5c3f8:fail | bf051a:fail" +"html_lang_valid","Fail_2","The default human language of the page must be valid and specified in accordance with BCP 47","Specified 'lang' attribute does not conform to BCP 47","Violation","1","3.1.1","b5c3f8:inapplicable | bf051a:pass" +"html_lang_valid","Fail_3","The default human language of the page must be valid and specified in accordance with BCP 47","Specified 'xml:lang' attribute does not include a valid primary language","Violation","1","3.1.1","b5c3f8:inapplicable | bf051a:fail" +"html_lang_valid","Fail_4","The default human language of the page must be valid and specified in accordance with BCP 47","Specified 'xml:lang' attribute does not conform to BCP 47","Violation","1","3.1.1","b5c3f8:inapplicable | bf051a:inapplicable" +"element_lang_valid","Pass_0","The change in language of specific content must be valid and specified in accordance with BCP 47","Lang has a valid primary lang and conforms to BCP 47","Pass","3","3.1.2","de46e4:pass" +"element_lang_valid","Fail_1","The change in language of specific content must be valid and specified in accordance with BCP 47","Specified 'lang' attribute does not include a valid primary language","Violation","3","3.1.2","de46e4:fail" +"element_lang_valid","Fail_2","The change in language of specific content must be valid and specified in accordance with BCP 47","Specified 'lang' attribute does not conform to BCP 47","Violation","3","3.1.2","de46e4:pass" +"element_lang_valid","Fail_3","The change in language of specific content must be valid and specified in accordance with BCP 47","Specified 'xml:lang' attribute does not include a valid primary language","Violation","3","3.1.2","de46e4:inapplicable" +"element_lang_valid","Fail_4","The change in language of specific content must be valid and specified in accordance with BCP 47","Specified 'xml:lang' attribute does not conform to BCP 47","Violation","3","3.1.2","de46e4:inapplicable" +"script_focus_blur_review","Pass_0","Scripting must not remove focus from content that normally receives focus","Rule Passed","Pass","1","2.1.1,2.4.7,3.2.1","" +"script_focus_blur_review","Potential_1","Scripting must not remove focus from content that normally receives focus","Verify script does not remove focus from content that normally receives focus","Violation Potential","1","2.1.1,2.4.7,3.2.1","" +"script_select_review","Pass_0","No changes of context should occur when a selection value receives focus","Rule Passed","Pass","3","3.2.1","" +"script_select_review","Potential_1","No changes of context should occur when a selection value receives focus","Verify that no change of context or action occurs when selection options in this component receive focus","Violation Potential","3","3.2.1","" +"form_interaction_review","Pass_0","User should be informed in advance when interacting with content causes a change of context","Rule Passed","Pass","3","3.2.2","" +"form_interaction_review","Potential_1","User should be informed in advance when interacting with content causes a change of context","Verify that interacting with content will not open pop-up windows or change the active window without informing the user","Violation Potential","3","3.2.2","" +"form_submit_button_exists","Pass_0","A <form> element should have a submit button or an image button","Rule Passed","Pass","3","3.2.2","" +"form_submit_button_exists","Potential_1","A <form> element should have a submit button or an image button","Verify the <form> element has a submit button or an image button","Violation Potential","3","3.2.2","" +"input_onchange_review","potential_warning","Users must be advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs","Confirm that the user is advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs","Violation Potential","3","3.2.2","" +"a_target_warning","pass","Users should be warned in advance if their input action will open a new window","The user is warned in advance that the input action opens a new window","Pass","3","3.2.2","" +"a_target_warning","potential_warn","Users should be warned in advance if their input action will open a new window","Inform the user when their input action will open a new window","Rec Potential","3","3.2.2","" +"error_message_exists","Pass_0","A custom error message must reference a valid 'id' value and when triggered the message must be appropriately exposed","Rule Passed","Pass","1","3.3.1","" +"error_message_exists","Fail_1","A custom error message must reference a valid 'id' value and when triggered the message must be appropriately exposed","Custom error message has invalid reference 'id' value","Violation","1","3.3.1","" +"error_message_exists","Fail_2","A custom error message must reference a valid 'id' value and when triggered the message must be appropriately exposed","Custom error message is not visible","Violation","1","3.3.1","" +"fieldset_label_valid","Pass_1","Groups with nested inputs must have unique accessible name","Group/Fieldset ""{0}"" with an input has a unique name","Pass","3","1.3.1,3.3.2","" +"fieldset_label_valid","Fail_1","Groups with nested inputs must have unique accessible name","Group/Fieldset does not have an accessible name","Violation","3","1.3.1,3.3.2","" +"fieldset_label_valid","Fail_2","Groups with nested inputs must have unique accessible name","Group/Fieldset ""{0}"" has a duplicate name to another group","Violation","3","1.3.1,3.3.2","" +"input_label_after","Pass_0","Checkboxes and radio buttons must have a label after the input control","Rule Passed","Pass","1","3.3.2","" +"input_label_after","Fail_1","Checkboxes and radio buttons must have a label after the input control","Checkbox or radio button is nested in label, so label is not after the input control","Violation","1","3.3.2","" +"input_label_after","Fail_2","Checkboxes and radio buttons must have a label after the input control","Label text is located before its associated checkbox or radio button element","Violation","1","3.3.2","" +"input_label_before","Pass_0","Text inputs and <select> elements must have a label before the input control","Rule Passed","Pass","1","3.3.2","" +"input_label_before","Fail_1","Text inputs and <select> elements must have a label before the input control","Text input is nested in label such that input precedes the label text","Violation","1","3.3.2","" +"input_label_before","Fail_2","Text inputs and <select> elements must have a label before the input control","Label text is located after its associated text input or <select> element","Violation","1","3.3.2","" +"input_label_visible","pass","An input element must have an associated visible label","The input element has an associated visible label","Pass","1","2.5.3,3.3.2","" +"input_label_visible","potential_placeholder_only","An input element must have an associated visible label","The ‘placeholder’ is the only visible label","Violation Potential","1","2.5.3,3.3.2","" +"input_label_visible","potential_no_label","An input element must have an associated visible label","The input element does not have an associated visible label","Violation Potential","1","2.5.3,3.3.2","" +"element_accesskey_labelled","Pass_0","An element with an assigned 'accesskey' attribute must have an associated label","Rule Passed","Pass","1","3.3.2","" +"element_accesskey_labelled","Potential_1","An element with an assigned 'accesskey' attribute must have an associated label","The element with an assigned 'accesskey' attribute does not have an associated label","Rec Potential","1","3.3.2","" +"combobox_popup_reference","Pass_1.0_expanded","The 'aria-controls' (for ARIA 1.2) or the 'aria-owns' (for ARIA 1.0) attribute of the expanded combobox must reference a valid popup 'id' value","The combobox popup referenced by 'aria-owns' (ARIA 1.0) exists and is visible","Pass","1","4.1.2","4e8ab6:fail" +"combobox_popup_reference","Pass_1.0_collapsed","The 'aria-controls' (for ARIA 1.2) or the 'aria-owns' (for ARIA 1.0) attribute of the expanded combobox must reference a valid popup 'id' value","The combobox popup in its collapsed state does not reference any visible popup as required","Pass","1","4.1.2","4e8ab6:fail" +"combobox_popup_reference","Pass_1.2_expanded","The 'aria-controls' (for ARIA 1.2) or the 'aria-owns' (for ARIA 1.0) attribute of the expanded combobox must reference a valid popup 'id' value","The combobox popup referenced by 'aria-controls' (ARIA 1.2) exists and is visible","Pass","1","4.1.2","4e8ab6:pass" +"combobox_popup_reference","Pass_1.2_collapsed","The 'aria-controls' (for ARIA 1.2) or the 'aria-owns' (for ARIA 1.0) attribute of the expanded combobox must reference a valid popup 'id' value","The combobox popup in its collapsed state does not reference any visible popup as required","Pass","1","4.1.2","4e8ab6:pass" +"combobox_popup_reference","Fail_1.0_missing_owns","The 'aria-controls' (for ARIA 1.2) or the 'aria-owns' (for ARIA 1.0) attribute of the expanded combobox must reference a valid popup 'id' value","The 'aria-owns' attribute of the expanded combobox is missing","Violation","1","4.1.2","4e8ab6:inapplicable" +"combobox_popup_reference","Fail_1.2_missing_controls","The 'aria-controls' (for ARIA 1.2) or the 'aria-owns' (for ARIA 1.0) attribute of the expanded combobox must reference a valid popup 'id' value","The 'aria-controls' attribute of the expanded combobox is missing","Violation","1","4.1.2","4e8ab6:fail" +"combobox_popup_reference","Fail_1.0_popup_reference_missing","The 'aria-controls' (for ARIA 1.2) or the 'aria-owns' (for ARIA 1.0) attribute of the expanded combobox must reference a valid popup 'id' value","The 'aria-owns' attribute ""{0}"" of the expanded combobox does not reference a valid popup 'id' value","Violation","1","4.1.2","4e8ab6:inapplicable" +"combobox_popup_reference","Fail_1.2_popup_reference_missing","The 'aria-controls' (for ARIA 1.2) or the 'aria-owns' (for ARIA 1.0) attribute of the expanded combobox must reference a valid popup 'id' value","The 'aria-controls' attribute ""{0}"" of the expanded combobox does not reference a valid popup 'id' value","Violation","1","4.1.2","4e8ab6:fail" +"combobox_popup_reference","Fail_combobox_expanded_hidden","The 'aria-controls' (for ARIA 1.2) or the 'aria-owns' (for ARIA 1.0) attribute of the expanded combobox must reference a valid popup 'id' value","The combobox 'aria-expanded' attribute is true, but the combobox popup is not visible","Violation","1","4.1.2","4e8ab6:inapplicable" +"combobox_popup_reference","Fail_combobox_collapsed_visible","The 'aria-controls' (for ARIA 1.2) or the 'aria-owns' (for ARIA 1.0) attribute of the expanded combobox must reference a valid popup 'id' value","The combobox 'aria-expanded' attribute is false, but the combobox popup is visible","Violation","1","4.1.2","4e8ab6:inapplicable" +"combobox_active_descendant","Pass","'aria-activedescendant' must be used to define focus within the combobox popup, except when using a dialog popup","'aria-activedescendant' is used appropriately for this combobox","Pass","1","4.1.2","" +"combobox_active_descendant","Fail_missing","'aria-activedescendant' must be used to define focus within the combobox popup, except when using a dialog popup","The element referenced by 'aria-activedescendant' ""{0}"" does not exist","Violation","1","4.1.2","" +"combobox_active_descendant","Fail_not_in_popup","'aria-activedescendant' must be used to define focus within the combobox popup, except when using a dialog popup","The element referenced by 'aria-activedescendant' ""{0}"" does not exist within the popup referenced by 'id' ""{1}""","Pass","1","4.1.2","" +"combobox_active_descendant","Fail_active_role_invalid","'aria-activedescendant' must be used to define focus within the combobox popup, except when using a dialog popup","The 'aria-activedescendant' ""{0}"" references an element with the roles ""{1}"", which does not have a valid ARIA role of 'option', 'gridcell', 'row', or 'treeitem'","Violation","1","4.1.2","" +"combobox_active_descendant","Fail_active_not_selected","'aria-activedescendant' must be used to define focus within the combobox popup, except when using a dialog popup","The 'aria-activedescendant' ""{0}"" references an element that does not have 'aria-selected' set to true","Violation","1","4.1.2","" +"aria_activedescendant_valid","Pass_0","The 'aria-activedescendant' property must reference the 'id' of a non-empty, non-hidden active child element","Rule Passed","Pass","1","4.1.2","" +"aria_activedescendant_valid","Fail_1","The 'aria-activedescendant' property must reference the 'id' of a non-empty, non-hidden active child element","The 'aria-activedescendant' property is empty","Violation","1","4.1.2","" +"aria_activedescendant_valid","Fail_2","The 'aria-activedescendant' property must reference the 'id' of a non-empty, non-hidden active child element","The 'aria-activedescendant' property references a hidden node","Violation","1","4.1.2","" +"aria_activedescendant_valid","Fail_3","The 'aria-activedescendant' property must reference the 'id' of a non-empty, non-hidden active child element","Element is not a combobox, and the referenced active-descendant element is not a valid descendant","Violation","1","4.1.2","" +"input_haspopup_conflict","potential_type_misuse","<input> element with a 'list' attribute should not use an explicit 'aria-haspopup' attribute","The <input> element with type ""{0}"" and 'list' attribute uses an explicit 'aria-haspopup' attribute","Violation Potential","1","4.1.2","" +"input_haspopup_conflict","potential_misuse","<input> element with a 'list' attribute should not use an explicit 'aria-haspopup' attribute","The <input> element with a missing or invalid type and 'list' attribute uses an explicit 'aria-haspopup' attribute","Violation Potential","1","4.1.2","" +"input_haspopup_conflict","potential_list_notexist","<input> element with a 'list' attribute should not use an explicit 'aria-haspopup' attribute","The list attribute for the <input> element is invalid","Violation Potential","1","4.1.2","" +"input_haspopup_conflict","fail_invalid_list_type","<input> element with a 'list' attribute should not use an explicit 'aria-haspopup' attribute","The list attribute for the <input> element with the type ""{0}"" is invalid","Violation","1","4.1.2","" +"input_haspopup_conflict","fail_invalid_list_elem","<input> element with a 'list' attribute should not use an explicit 'aria-haspopup' attribute","The list attribute for the <input> element does not reference a datalist element","Violation","1","4.1.2","" +"aria_role_valid","Pass_0","ARIA roles must be valid for the element to which they are assigned","Rule Passed","Pass","1","4.1.2","" +"aria_role_valid","Fail_1","ARIA roles must be valid for the element to which they are assigned","The ARIA role '{0}' is not valid for the element <{1}>","Violation","1","4.1.2","" +"aria_role_valid","Fail_2","ARIA roles must be valid for the element to which they are assigned","The ARIA role '{0}' is not valid for the element <{1}> and may be ignored by the browser since the element is focusable","Violation","1","4.1.2","" +"combobox_autocomplete_valid","Pass","A combobox that supports autocompletion behavior must have the 'aria-autocomplete' attribute only on its text input element with a valid value; a value of '""inline""' is not supported","The combobox does not use 'aria-autocomplete' value '""inline""' nor does it have 'aria-autocomplete' defined within the popup","Pass","1","4.1.2","" +"combobox_autocomplete_valid","Fail_1","A combobox that supports autocompletion behavior must have the 'aria-autocomplete' attribute only on its text input element with a valid value; a value of '""inline""' is not supported","The combobox has the 'aria-autocomplete' attribute incorrectly set on an element within the popup referenced by ""{0}""","Violation","1","4.1.2","" +"combobox_autocomplete_valid","Fail_inline","A combobox that supports autocompletion behavior must have the 'aria-autocomplete' attribute only on its text input element with a valid value; a value of '""inline""' is not supported","The combobox does not support an 'aria-autocomplete' attribute value set to '""inline""' ","Violation","1","4.1.2","" +"combobox_focusable_elements","Pass","Tabbable focus for the combobox must be allowed only on the text input, except when using a dialog popup","DOM focus is allowed only on the combobox element as required","Pass","1","4.1.2","" +"combobox_focusable_elements","Fail_not_tabbable","Tabbable focus for the combobox must be allowed only on the text input, except when using a dialog popup","The combobox element does not allow DOM focus as required","Violation","1","4.1.2","" +"combobox_focusable_elements","Fail_tabbable_child","Tabbable focus for the combobox must be allowed only on the text input, except when using a dialog popup","The popup of the combobox has DOM focus or has 'aria-activedescendant' defined, which is not allowed","Violation","1","4.1.2","" +"combobox_haspopup_valid","Pass","The combobox attribute 'aria-haspopup' value must be appropriate for the role of the element referenced by 'aria-controls' (ARIA 1.2) or 'aria-owns' (ARIA 1.0)","The 'aria-controls' (ARIA 1.2) or 'aria-owns' (ARIA 1.0) appropriately references a valid popup 'id' value","Pass","1","4.1.2","" +"combobox_haspopup_valid","Fail_popup_role_invalid","The combobox attribute 'aria-haspopup' value must be appropriate for the role of the element referenced by 'aria-controls' (ARIA 1.2) or 'aria-owns' (ARIA 1.0)","The 'role' value ""{0}"" of the popup element ""{1}"" should be one of ""listbox"", ""grid"", ""tree"" or ""dialog""","Violation","1","4.1.2","" +"combobox_haspopup_valid","Fail_combobox_popup_role_mismatch","The combobox attribute 'aria-haspopup' value must be appropriate for the role of the element referenced by 'aria-controls' (ARIA 1.2) or 'aria-owns' (ARIA 1.0)","The value of the combobox 'aria-haspopup' attribute ""{0}"" does not match the 'role' value of the popup element ""{1}""","Violation","1","4.1.2","" +"element_tabbable_role_valid","pass","A tabbable element must have a valid widget role","The tabbable element has a widget role","Pass | Pass","1 | 1","4.1.2 | 4.1.2","" +"element_tabbable_role_valid","fail_invalid_role","A tabbable element must have a valid widget role","The tabbable element's role '{0}' is not a widget role","Violation | Rec","1 | 1","4.1.2 | 4.1.2","" +"element_tabbable_role_valid","fail_no_valid_role","A tabbable element must have a valid widget role","The tabbable element does not have a valid widget role","Violation | Rec","1 | 1","4.1.2 | 4.1.2","" +"input_label_exists","Pass_0","Each form control must have an associated label","Rule Passed","Pass","1","4.1.2","97a4e1:pass | e086e5:pass" +"input_label_exists","Fail_1","Each form control must have an associated label","Form control element <{0}> has no associated label","Violation","1","4.1.2","97a4e1:fail | e086e5:fail" +"input_label_exists","Fail_2","Each form control must have an associated label","Form control with ""{0}"" role has no associated label","Violation","1","4.1.2","97a4e1:fail | e086e5:fail" +"aria_descendant_valid","pass","Browsers ignore the explicit and implicit ARIA roles of the descendants of certain elements","The element contains valid descendants","Pass | Pass","1 | 1","4.1.2 | 4.1.2","307n5z:pass" +"aria_descendant_valid","potential_child_implicit_role","Browsers ignore the explicit and implicit ARIA roles of the descendants of certain elements","The element with role ""{0}"" contains descendants with implicit roles ""{1}"" which are ignored by browsers","Violation Potential | Rec Potential","1 | 1","4.1.2 | 4.1.2","307n5z:cantTell" +"aria_descendant_valid","fail_child_explicit_role","Browsers ignore the explicit and implicit ARIA roles of the descendants of certain elements","The element with role ""{0}"" contains descendants with roles ""{1}"" which are ignored by browsers","Violation | Rec","1 | 1","4.1.2 | 4.1.2","307n5z:fail" +"aria_role_allowed","Pass_0","Elements must have a valid 'role' per ARIA specification","Rule Passed","Pass","1","4.1.2","674b10:pass" +"aria_role_allowed","Fail_2","Elements must have a valid 'role' per ARIA specification","The role '{0}' defined on the element is not valid per ARIA specification","Violation","1","4.1.2","674b10:fail" +"aria_role_allowed","Potential_1","Elements must have a valid 'role' per ARIA specification","Some of the roles, '{0}', defined on the element are not valid per ARIA specification","Violation Potential","1","4.1.2","674b10:cantTell" +"label_content_exists","Pass_Regular","A <label> element must have non-empty descriptive text that identifies the purpose of the interactive component","<label> element has accessible name with inner content","Pass","1","4.1.2","" +"label_content_exists","Pass_AriaLabel","A <label> element must have non-empty descriptive text that identifies the purpose of the interactive component","<label> element has accessible name via 'aria-label'","Pass","1","4.1.2","" +"label_content_exists","Pass_LabelledBy","A <label> element must have non-empty descriptive text that identifies the purpose of the interactive component","<label> element has accessible name via 'aria-labelledby'","Pass","1","4.1.2","" +"label_content_exists","Fail_1","A <label> element must have non-empty descriptive text that identifies the purpose of the interactive component","The <label> element does not have descriptive text that identifies the expected input","Violation","1","4.1.2","" +"combobox_design_valid","Pass_1.0","The combobox design pattern must be valid for ARIA 1.2","The combobox design pattern is detected as ARIA 1.0, which is allowed by ARIA 1.2","Pass","1","4.1.2","" +"combobox_design_valid","Fail_1.1","The combobox design pattern must be valid for ARIA 1.2","The combobox design pattern is detected as ARIA 1.1, which is not allowed by ARIA 1.2","Violation","1","4.1.2","" +"combobox_design_valid","Pass_1.2","The combobox design pattern must be valid for ARIA 1.2","The combobox design pattern is detected as ARIA 1.2","Pass","1","4.1.2","" +"a_text_purpose","pass","Hyperlinks must have an accessible name for their purpose","Hyperlink has a description of its purpose","Pass","2","2.4.4,4.1.2","c487ae:pass" +"a_text_purpose","fail_acc_name","Hyperlinks must have an accessible name for their purpose","Hyperlink has no link text, label or image with a text alternative","Violation","2","2.4.4,4.1.2","c487ae:fail" +"aria_attribute_allowed","Pass_0","ARIA attributes must be valid for the element's role","Rule Passed","Pass","1","4.1.2","5f99a7:pass" +"aria_attribute_allowed","Fail_1","ARIA attributes must be valid for the element's role","The attribute(s) '{0}' referenced by the element <{1}> is not a valid ARIA state or property","Violation","1","4.1.2","5f99a7:fail" +"aria_attribute_exists","pass","When specifying a required ARIA attribute, the value must not be empty","Rule Passed","Pass","1","4.1.2","6a7281:pass" +"aria_attribute_exists","fail_empty_attribute","When specifying a required ARIA attribute, the value must not be empty","The element attribute(s): '{0}' value is empty","Violation","1","4.1.2","6a7281:fail" +"aria_attribute_required","pass","The required attributes for the element with a role must be defined","The required attributes for the element with the role are defined","Pass","1","4.1.2","4e8ab6:pass" +"aria_attribute_required","fail_missing","The required attributes for the element with a role must be defined","Element with '{0}' role does not have the required ARIA attribute(s): '{1}'","Violation","1","4.1.2","4e8ab6:fail" +"aria_attribute_value_valid","Pass_0","ARIA property values must be valid","Rule Passed","Pass","1","4.1.2","6a7281:pass" +"aria_attribute_value_valid","Fail_1","ARIA property values must be valid","The value ""{0}"" specified for attribute '{1}' on element <{2}> is not valid","Violation","1","4.1.2","6a7281:fail" +"aria_eventhandler_role_valid","Pass_0","Elements with event handlers must have a valid ARIA role","Rule Passed","Pass","1","4.1.2","" +"aria_eventhandler_role_valid","Fail_1","Elements with event handlers must have a valid ARIA role","The <{0}> element with '{1}' does not have a valid ARIA role specified","Violation","1","4.1.2","" +"aria_hidden_nontabbable","Pass_0","A hidden element should not contain any tabbable elements","Rule Passed","Pass","2","1.3.1,4.1.2","6cfa84:pass" +"aria_hidden_nontabbable","Fail_1","A hidden element should not contain any tabbable elements","Element ""{0}"" should not be focusable within the subtree of an element with an 'aria-hidden' attribute with value 'true'","Violation","2","1.3.1,4.1.2","6cfa84:fail" +"aria_id_unique","Pass_0","The ARIA property must reference a non-empty unique id of an existing element that is visible","Rule Passed","Pass","1","4.1.2","59796f:pass | 6a7281:pass" +"aria_id_unique","Fail_1","The ARIA property must reference a non-empty unique id of an existing element that is visible","The 'id' ""{0}"" specified for the ARIA property '{1}' value is not valid","Violation","1","4.1.2","59796f:fail | 6a7281:fail" +"aria_widget_labelled","Pass_0","Interactive component must have a programmatically associated name","Rule Passed","Pass","1","4.1.2","m6b1q3:pass" +"aria_widget_labelled","Fail_1","Interactive component must have a programmatically associated name","Interactive component with ARIA role '{0}' does not have a programmatically associated name","Violation","1","4.1.2","m6b1q3:fail" +"frame_title_exists","Pass_0","Inline frames must have a unique, non-empty 'title' attribute","Rule Passed","Pass","3","4.1.2","cae760:pass" +"frame_title_exists","Fail_1","Inline frames must have a unique, non-empty 'title' attribute","Inline frame does not have a 'title' attribute","Violation","3","4.1.2","cae760:fail" +"list_children_valid","Pass_0","List component with ""group"" role must limit children to <listitem> elements","Rule Passed","Pass","1","4.1.2","" +"list_children_valid","Fail_1","List component with ""group"" role must limit children to <listitem> elements","List component with ""group"" role has children that are not <listitem> elements","Violation","1","4.1.2","" +"aria_attribute_conflict","fail_conflict","An ARIA attribute must not conflict with the corresponding HTML attribute","The ARIA attribute ""{0}"" is in conflict with the corresponding HTML attribute ""{1}""","Violation","1","4.1.2","" +"table_aria_descendants","explicit_role","Table structure elements cannot specify an explicit 'role' within table containers","An explicit ARIA 'role' is not valid for <{0}> element within an ARIA role '{1}' per the ARIA in HTML specification","Violation","1","4.1.2","" +"aria_attribute_redundant","pass","An ARIA attribute should not be redundant with a corresponding HTML attribute","The ARIA attribute is not redundant with a corresponding HTML attribute","Pass","1","4.1.2","" +"aria_attribute_redundant","fail_redundant","An ARIA attribute should not be redundant with a corresponding HTML attribute","The ARIA attribute ""{0}"" is redundant with the HTML attribute ""{1}""","Rec","1","4.1.2","" +"aria_accessiblename_exists","fail_no_accessible_name","Elements with certain roles should have accessible names","Element <{0}> with ""{1}"" role has no accessible name","Rec | Rec","1 | 1","4.1.2 | ARIA","" +"canvas_content_described","Pass_0","The <canvas> element may not be accessible","Rule Passed","Pass","3","1.1.1,2.1.1,4.1.2","" +"canvas_content_described","Manual_1","The <canvas> element may not be accessible","Verify accessibility of the <canvas> element","Rec Manual","3","1.1.1,2.1.1,4.1.2","" +"element_accesskey_unique","Pass_0","'accesskey' attribute values on each element must be unique for the page","Rule Passed","Pass","3","HTML","" +"element_accesskey_unique","Fail_1","'accesskey' attribute values on each element must be unique for the page","'accesskey' attribute value on the element is not unique","Violation","3","HTML","" +"element_id_unique","pass","Element 'id' attribute values must be unique within a document","Rule Passed","Pass","3","HTML","3ea0c8:pass" +"element_id_unique","potential_empty","Element 'id' attribute values must be unique within a document","The <{0}> element has the id ""{1}"" that is empty","Violation Potential","3","HTML","3ea0c8:pass" +"element_id_unique","potential_in_use","Element 'id' attribute values must be unique within a document","The <{0}> element has the id ""{1}"" that is already in use","Violation Potential","3","HTML","3ea0c8:fail" +"element_attribute_deprecated","pass","Avoid use of obsolete features if possible","Rule Passed","Pass","3","HTML","" +"element_attribute_deprecated","fail_elem","Avoid use of obsolete features if possible","The <{0}> element is deprecated in HTML 5","Rec","3","HTML","" +"element_attribute_deprecated","fail_attr","Avoid use of obsolete features if possible","The HTML attribute(s) ""{0}"" is deprecated in HTML 5","Rec","3","HTML","" +"element_attribute_deprecated","fail_elem_attr","Avoid use of obsolete features if possible","The HTML attribute(s) ""{0}"" is deprecated for the <{1}> element in HTML 5","Rec","3","HTML","" +"aria_attribute_valid","Pass","ARIA attributes should be valid for the element and ARIA role to which they are assigned","ARIA attributes are valid for the element and ARIA role","Pass","1","ARIA","5c01ea:pass | 46ca7f:pass" +"aria_attribute_valid","Fail_invalid_role_attr","ARIA attributes should be valid for the element and ARIA role to which they are assigned","The ARIA attributes ""{0}"" are not valid for the element <{1}> with ARIA role ""{2}""","Violation","1","ARIA","5c01ea:fail | 46ca7f:fail" +"aria_attribute_valid","Fail_invalid_implicit_role_attr","ARIA attributes should be valid for the element and ARIA role to which they are assigned","The ARIA attributes ""{0}"" are not valid for the element <{1}> with implicit ARIA role ""{2}""","Violation","1","ARIA","5c01ea:fail | 46ca7f:fail" +"img_alt_null","potential_aria_override","When the intent is to mark an image as decorative with an empty 'alt' attribute, the 'aria' or 'title' attributes should not be used","The image 'alt' attribute is empty, but the 'aria' label is not empty and overrides the 'alt' attribute","Violation Potential | Violation Potential","1 | 1","1.1.1 | ARIA","46ca7f:fail" +"aria_attribute_deprecated","fail_aria_role","No deprecated ARIA role or attribute should be used","The ARIA role ""{0}"" is deprecated in the ARIA specification","Rec","3","ARIA","" +"aria_attribute_deprecated","fail_aria_attr","No deprecated ARIA role or attribute should be used","The ARIA attributes ""{0}"" are deprecated in the ARIA specification","Rec","3","ARIA","" +"aria_attribute_deprecated","fail_role_attr","No deprecated ARIA role or attribute should be used","The ARIA attributes ""{0}"" are deprecated for the role ""{1}"" in the ARIA specification","Rec","3","ARIA","" +"aria_role_redundant","pass","An explicitly-assigned ARIA role should not be redundant with the implicit role of the element","An explicitly-assigned ARIA role is not redundant with the implicit role of the element","Pass","3","ARIA","" +"aria_role_redundant","fail_redundant","An explicitly-assigned ARIA role should not be redundant with the implicit role of the element","The explicitly-assigned ARIA role ""{0}"" is redundant with the implicit role of the element <{1}>","Rec","3","ARIA","" +"aria_accessiblename_exists","fail_no_accessible_name_image","Elements with certain roles should have accessible names","Element <{0}> with ""{1}"" role has no accessible name","Rec | Rec","1 | 1","4.1.2 | ARIA","23a2a8:fail" diff --git a/rule-server/src/static/archives/2026.07.13/doc/rules.html b/rule-server/src/static/archives/2026.07.13/doc/rules.html new file mode 100644 index 000000000..617538b86 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/doc/rules.html @@ -0,0 +1,19973 @@ +<html lang="en-US"> + <head> + <title>Accessibility Checker Rules</title> + <link rel="icon" href="https://ibm.com/able/favicon-32x32.png" type="image/png"> + <link rel="icon" href="https://ibm.com/able/favicon.svg" type="image/svg+xml"> + <link rel="stylesheet" href="./common/rules.css" /> + <script type="module"> + import "https://1.www.s81c.com/common/carbon/web-components/version/v1.35.0/code-snippet.min.js"; + import "https://1.www.s81c.com/common/carbon/web-components/version/v1.35.0/list.min.js"; + import "https://1.www.s81c.com/common/carbon/web-components/version/v1.35.0/content-switcher.min.js"; + </script> + <script src="https://cdn.jsdelivr.net/npm/marked/marked.min.js"></script> + <script> + function hookEvents() { + let mainSwitcher = document.getElementById("rsSwitcher"); + mainSwitcher.addEventListener("bx-content-switcher-selected", (evt) => { + let oldValue = mainSwitcher.getAttribute("value") || "IBM_Accessibility"; + let newValue = mainSwitcher.value; + document.getElementById(oldValue).style.display="none"; + document.getElementById(newValue).style.display="block"; + }) + } + </script> + <head> + <body onload="hookEvents();"> + <main> + <bx-content-switcher value="IBM_Accessibility" id="rsSwitcher"> + <bx-content-switcher-item value="IBM_Accessibility">IBM Accessibility 7.3</bx-content-switcher-item><bx-content-switcher-item value="IBM_Accessibility_next">IBM Accessibility next</bx-content-switcher-item><bx-content-switcher-item value="WCAG_2_2">WCAG 2.2 (A, AA)</bx-content-switcher-item><bx-content-switcher-item value="WCAG_2_1">WCAG 2.1 (A, AA)</bx-content-switcher-item><bx-content-switcher-item value="WCAG_2_0">WCAG 2.0 (A, AA)</bx-content-switcher-item> + </bx-content-switcher> + <div id="IBM_Accessibility" style="padding: 1rem; display:block"> +<div> + <h2>1.1.1 Non-text Content [A]</h2> + <div>All non-text content that is presented to the user has a text alternative that serves the equivalent purpose.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>applet_alt_exists</strong>: &lt;applet&gt; elements must provide an 'alt' attribute and an alternative description + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/applet_alt_exists.html#%7B%22message%22%3A%22An%20%3Capplet%3E%20element%20does%20not%20have%20an%20'alt'%20attribute%20that%20provides%20a%20short%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">An &lt;applet&gt; element does not have an 'alt' attribute that provides a short text alternative</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/applet_alt_exists.html#%7B%22message%22%3A%22The%20'alt'%20attribute%20value%20for%20an%20%3Capplet%3E%20element%20duplicates%20the%20'code'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The 'alt' attribute value for an &lt;applet&gt; element duplicates the 'code' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/applet_alt_exists.html#%7B%22message%22%3A%22An%20%3Capplet%3E%20element%20provides%20alternative%20text%2C%20but%20does%20not%20provide%20inner%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">An &lt;applet&gt; element provides alternative text, but does not provide inner content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_redundant</strong>: The text alternative for an image within a link should not repeat the link text or adjacent link text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Link%20text%20is%20repeated%20in%20an%20image%20'alt'%20value%20within%20the%20same%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Link text is repeated in an image 'alt' value within the same link</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Link%20text%20of%20previous%20link%20is%20repeated%20in%20image%20'alt'%20value%20of%20a%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Link text of previous link is repeated in image 'alt' value of a link</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Image%20'alt'%20value%20within%20a%20link%20is%20repeated%20in%20link%20text%20of%20the%20link%20after%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Image 'alt' value within a link is repeated in link text of the link after</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_valid</strong>: Images must have accessible names unless they are decorative or redundant + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_valid.html#%7B%22message%22%3A%22Image%20'alt'%20attribute%20value%20consists%20only%20of%20blank%20space(s)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_blank_alt%22%7D">Image 'alt' attribute value consists only of blank space(s)</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_valid.html#%7B%22message%22%3A%22The%20image%20has%20neither%20an%20accessible%20name%20nor%20is%20marked%20as%20decorative%20or%20redundant%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_alt%22%7D">The image has neither an accessible name nor is marked as decorative or redundant</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_valid.html#%7B%22message%22%3A%22The%20image%20does%20not%20have%20an%20'alt'%20attribute%20or%20ARIA%20label%2C%20and%20the%20'title'%20attribute%20value%20consists%20only%20of%20blank%20space(s)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_blank_title%22%7D">The image does not have an 'alt' attribute or ARIA label, and the 'title' attribute value consists only of blank space(s)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>area_alt_exists</strong>: &lt;area&gt; elements in an image map must have a text alternative + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/area_alt_exists.html#%7B%22message%22%3A%22%3Carea%3E%20element%20in%20an%20image%20map%20has%20no%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">&lt;area&gt; element in an image map has no text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>imagebutton_alt_exists</strong>: The &lt;input&gt; element of type "image" should have a text alternative + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/imagebutton_alt_exists.html#%7B%22message%22%3A%22The%20%3Cinput%3E%20element%20of%20type%20%5C%22image%5C%22%20has%20no%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail%22%7D">The &lt;input&gt; element of type "image" has no text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>imagemap_alt_exists</strong>: An image map and each &lt;area&gt; element in an image map must have text alternative(s) + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/imagemap_alt_exists.html#%7B%22message%22%3A%22Image%20map%20or%20child%20%3Carea%3E%20has%20no%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Image map or child &lt;area&gt; has no text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_decorative</strong>: Image designated as decorative must have 'alt="" + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_decorative.html#%7B%22message%22%3A%22Image%20designated%20as%20decorative%20has%20non-null%20'alt'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Image designated as decorative has non-null 'alt' attribute</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_null</strong>: When the intent is to mark an image as decorative with an empty 'alt' attribute, the 'aria' or 'title' attributes should not be used + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_null.html#%7B%22message%22%3A%22The%20image%20'alt'%20attribute%20is%20empty%2C%20but%20the%20'title'%20attribute%20is%20not%20empty%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_decorative%22%7D">The image 'alt' attribute is empty, but the 'title' attribute is not empty</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>object_text_exists</strong>: &lt;object&gt; element must have a text alternative for the content rendered by the object + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/object_text_exists.html#%7B%22message%22%3A%22An%20%3Cobject%3E%20element%20does%20not%20have%20a%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_text_alternative%22%7D">An &lt;object&gt; element does not have a text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>svg_graphics_labelled</strong>: A non-decorative SVG element must have an accessible name + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/svg_graphics_labelled.html#%7B%22message%22%3A%22The%20SVG%20element%20has%20no%20accessible%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_acc_name%22%7D">The SVG element has no accessible name</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>application_content_accessible</strong>: Non-decorative static text and image content within an element with "application" role must be accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/application_content_accessible.html#%7B%22message%22%3A%22Verify%20that%20the%20non-decorative%20static%20text%20and%20image%20content%20within%20an%20element%20with%20%5C%22application%5C%22%20role%20are%20accessible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the non-decorative static text and image content within an element with "application" role are accessible</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_misuse</strong>: 'alt' attribute value must be a good inline replacement for the image + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_misuse.html#%7B%22message%22%3A%22Verify%20that%20the%20file%20name%20serves%20as%20a%20good%20inline%20replacement%20for%20the%20image%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the file name serves as a good inline replacement for the image</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_ismap_misuse</strong>: Server-side image map hot-spots must have duplicate text links + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_ismap_misuse.html#%7B%22message%22%3A%22Server-side%20image%20map%20hot-spots%20do%20not%20have%20duplicate%20text%20links%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Server-side image map hot-spots do not have duplicate text links</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_longdesc_misuse</strong>: The 'longdesc' attribute must reference HTML content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_longdesc_misuse.html#%7B%22message%22%3A%22Verify%20that%20the%20file%20designated%20by%20the%20'longdesc'%20attribute%20contains%20valid%20HTML%20content%20(file%20extension%20not%20recognized)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the file designated by the 'longdesc' attribute contains valid HTML content (file extension not recognized)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>media_alt_exists</strong>: Audio or video on the page must have a short text alternative that describes the media content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_alt_exists.html#%7B%22message%22%3A%22Filename%20used%20as%20label%20for%20embedded%20audio%20or%20video%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Filename used as label for embedded audio or video</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>style_background_decorative</strong>: Images included by using CSS alone must not convey important information + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_background_decorative.html#%7B%22message%22%3A%22Verify%20the%20CSS%20background%20image%20does%20not%20convey%20important%20information%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify the CSS background image does not convey important information</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>style_highcontrast_visible</strong>: Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_highcontrast_visible.html#%7B%22message%22%3A%22Confirm%20Windows%20high%20contrast%20mode%20is%20supported%20when%20using%20CSS%20to%20include%2C%20position%20or%20alter%20non-decorative%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Confirm Windows high contrast mode is supported when using CSS to include, position or alter non-decorative content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>figure_label_exists</strong>: A &lt;figure&gt; element must have an associated label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/figure_label_exists.html#%7B%22message%22%3A%22The%20%3Cfigure%3E%20element%20does%20not%20have%20an%20associated%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;figure&gt; element does not have an associated label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>embed_alt_exists</strong>: Provide alternative content for &lt;embed&gt; elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/embed_alt_exists.html#%7B%22message%22%3A%22Verify%20that%20the%20%3Cembed%3E%20element%20has%20alternative%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the &lt;embed&gt; element has alternative content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>media_alt_brief</strong>: Alternative text in 'alt' attribute should be brief (&lt;150 characters) + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_alt_brief.html#%7B%22message%22%3A%22Text%20alternative%20is%20more%20than%20150%20characters%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Text alternative is more than 150 characters</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>noembed_content_exists</strong>: &lt;noembed&gt; elements should contain descriptive text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/noembed_content_exists.html#%7B%22message%22%3A%22Add%20descriptive%20text%20to%20the%20%3Cnoembed%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Add descriptive text to the &lt;noembed&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>canvas_content_described</strong>: The &lt;canvas&gt; element may not be accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/canvas_content_described.html#%7B%22message%22%3A%22Verify%20accessibility%20of%20the%20%3Ccanvas%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify accessibility of the &lt;canvas&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_background</strong>: Background images that convey important information must have a text alternative that describes the image + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_background.html#%7B%22message%22%3A%22Verify%20important%20background%20image%20information%20has%20a%20text%20alternative%20in%20system%20high%20contrast%20mode%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify important background image information has a text alternative in system high contrast mode</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.2.1 Audio-only and Video-only (Prerecorded) [A]</h2> + <div>For prerecorded audio-only or video-only media, an alternative provides equivalent information.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>media_audio_transcribed</strong>: Audio information should also be available in text form + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_audio_transcribed.html#%7B%22message%22%3A%22Provide%20transcripts%20for%20audio%20files%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Provide transcripts for audio files</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.2.2 Captions (Prerecorded) [A]</h2> + <div>Captions are provided for all prerecorded audio content in synchronized media.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>caption_track_exists</strong>: A &lt;video&gt; element must have a text alternative for any meaningful audio content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/caption_track_exists.html#%7B%22message%22%3A%22Verify%20that%20captions%20are%20available%20for%20any%20meaningful%20audio%20or%20provide%20a%20caption%20track%20for%20the%20%3Cvideo%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that captions are available for any meaningful audio or provide a caption track for the &lt;video&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.2.3 Audio Description or Media Alternative (Prerecorded) [A]</h2> + <div>An alternative for time-based media or audio description of the prerecorded video content is provided for synchronized media.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>media_track_available</strong>: Pre-recorded media should have an audio track that describes visual information + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_track_available.html#%7B%22message%22%3A%22Verify%20availability%20of%20a%20user-selectable%20audio%20track%20with%20description%20of%20visual%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify availability of a user-selectable audio track with description of visual content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.2.4 Captions (Live) [AA]</h2> + <div>Captions are provided for all live audio content in synchronized media.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>media_live_captioned</strong>: Live media (streaming video with audio) should have captions for audio content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_live_captioned.html#%7B%22message%22%3A%22Verify%20captions%20are%20provided%20for%20live%20media%20(streaming%20video%20with%20audio)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify captions are provided for live media (streaming video with audio)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.2.5 Audio Description (Prerecorded) [AA]</h2> + <div>Audio description is provided for all prerecorded video content in synchronized media.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>media_track_available</strong>: Pre-recorded media should have an audio track that describes visual information + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_track_available.html#%7B%22message%22%3A%22Verify%20availability%20of%20a%20user-selectable%20audio%20track%20with%20description%20of%20visual%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify availability of a user-selectable audio track with description of visual content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.3.1 Info and Relationships [A]</h2> + <div>Information, structure, and relationships conveyed through presentation can be programmatically determined or are available in text.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>input_checkboxes_grouped</strong>: Related sets of radio buttons or checkboxes should be programmatically grouped + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22%7B0%7D%20input%20found%20that%20has%20the%20same%20name%2C%20%5C%22%7B2%7D%5C%22%20as%20a%20%7B1%7D%20input%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_controlnamemismatch%22%7D">{0} input found that has the same name, "{2}" as a {1} input</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22%7B0%7D%20input%20is%20not%20in%20the%20group%20with%20another%20%7B0%7D%20with%20the%20name%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_notgroupedothergrouped%22%7D">{0} input is not in the group with another {0} with the name "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22%7B0%7D%20input%20and%20others%20with%20the%20name%20%5C%22%7B1%7D%5C%22%20are%20not%20grouped%20together%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_notgroupedothernotgrouped%22%7D">{0} input and others with the name "{1}" are not grouped together</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22%7B0%7D%20input%20is%20in%20a%20different%20group%20than%20another%20%7B0%7D%20with%20the%20name%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_notsamegroup%22%7D">{0} input is in a different group than another {0} with the name "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22Verify%20that%20this%20ungrouped%20checkbox%20input%20is%20not%20related%20to%20other%20checkboxes%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_lonecheckbox%22%7D">Verify that this ungrouped checkbox input is not related to other checkboxes</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22Verify%20that%20this%20un-named%2C%20ungrouped%20checkbox%20input%20is%20not%20related%20to%20other%20checkboxes%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_unnamedcheckbox%22%7D">Verify that this un-named, ungrouped checkbox input is not related to other checkboxes</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_headers_ref_valid</strong>: The 'headers' attribute should refer to a valid cell in the same table + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_ref_valid.html#%7B%22message%22%3A%22The%20'headers'%20attribute%20value%20%5C%22%7B0%7D%5C%22%20does%20not%20reference%20a%20valid%20'id'%20in%20this%20document%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The 'headers' attribute value "{0}" does not reference a valid 'id' in this document</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_ref_valid.html#%7B%22message%22%3A%22The%20'headers'%20attribute%20value%20%5C%22%7B0%7D%5C%22%20refers%20to%20itself%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The 'headers' attribute value "{0}" refers to itself</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_ref_valid.html#%7B%22message%22%3A%22The%20'headers'%20attribute%20value%20%5C%22%7B0%7D%5C%22%20does%20not%20refer%20to%20a%20cell%20in%20the%20same%20table%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">The 'headers' attribute value "{0}" does not refer to a cell in the same table</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_ref_valid.html#%7B%22message%22%3A%22The%20'headers'%20attribute%20value%20%5C%22%7B0%7D%5C%22%20does%20not%20refer%20to%20a%20cell%20indicated%20with%20%3Cth%3E%20or%20a%20role%20of%20%5C%22columnheader%5C%22%20or%20%5C%22rowheader%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_4%22%7D">The 'headers' attribute value "{0}" does not refer to a cell indicated with &lt;th&gt; or a role of "columnheader" or "rowheader"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>fieldset_label_valid</strong>: Groups with nested inputs must have unique accessible name + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_label_valid.html#%7B%22message%22%3A%22Group%2FFieldset%20does%20not%20have%20an%20accessible%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Group/Fieldset does not have an accessible name</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_label_valid.html#%7B%22message%22%3A%22Group%2FFieldset%20%5C%22%7B0%7D%5C%22%20has%20a%20duplicate%20name%20to%20another%20group%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Group/Fieldset "{0}" has a duplicate name to another group</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_scope_valid</strong>: Value for 'scope' attribute must be "row", "col", "rowgroup", or "colgroup" + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_scope_valid.html#%7B%22message%22%3A%22Value%20provided%20is%20invalid%20for%20the%20'scope'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Value provided is invalid for the 'scope' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_scope_valid.html#%7B%22message%22%3A%22The%20'scope'%20attribute%20should%20only%20be%20used%20on%20a%20%3Cth%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The 'scope' attribute should only be used on a &lt;th&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_banner_label_unique</strong>: Each element with "banner" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_banner_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22banner%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "banner" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_banner_single</strong>: A page, document, or application should only have one element with "banner" role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_banner_single.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22banner%5C%22%20role%20found%20on%20the%20page%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "banner" role found on the page</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_complementary_label_unique</strong>: Each element with "complementary" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_complementary_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22complementary%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "complementary" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_complementary_labelled</strong>: Each element with "complementary" role must have a label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_complementary_labelled.html#%7B%22message%22%3A%22Element%20with%20%5C%22complementary%5C%22%20role%20does%20not%20have%20a%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "complementary" role does not have a label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_content_in_landmark</strong>: All content must reside within an element with a landmark role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_content_in_landmark.html#%7B%22message%22%3A%22Content%20is%20not%20within%20a%20landmark%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Content is not within a landmark element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_contentinfo_label_unique</strong>: Each element with "contentinfo" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_contentinfo_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22contentinfo%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "contentinfo" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_contentinfo_single</strong>: A page, document, or application should only have one element with "contentinfo" role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_contentinfo_single.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22contentinfo%5C%22%20role%20found%20on%20the%20page%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "contentinfo" role found on the page</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_form_label_unique</strong>: Each element with "form" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_form_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22form%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "form" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_hidden_nontabbable</strong>: A hidden element should not contain any tabbable elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_hidden_nontabbable.html#%7B%22message%22%3A%22Element%20%5C%22%7B0%7D%5C%22%20should%20not%20be%20focusable%20within%20the%20subtree%20of%20an%20element%20with%20an%20'aria-hidden'%20attribute%20with%20value%20'true'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element "{0}" should not be focusable within the subtree of an element with an 'aria-hidden' attribute with value 'true'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_landmark_name_unique</strong>: Each landmark should have a unique 'aria-labelledby' or 'aria-label' or be nested in a different parent region + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_landmark_name_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22%7B0%7D%5C%22%20landmarks%20within%20the%20same%20parent%20region%20are%20not%20distinguished%20from%20one%20another%20because%20they%20have%20the%20same%20%5C%22%7B1%7D%5C%22%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "{0}" landmarks within the same parent region are not distinguished from one another because they have the same "{1}" label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_main_label_unique</strong>: Each element with "main" role must have unique label that describes its purposes + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_main_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22main%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "main" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_navigation_label_unique</strong>: Each element with "navigation" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_navigation_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22navigation%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "navigation" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_parent_required</strong>: Each element with an implicit or explicit role must be contained within a valid element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_parent_required.html#%7B%22message%22%3A%22Element%20with%20%5C%22%7B0%7D%5C%22%20role%20is%20not%20contained%20in%20or%20owned%20by%20an%20element%20with%20one%20of%20the%20following%20roles%3A%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "{0}" role is not contained in or owned by an element with one of the following roles: "{1}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_region_label_unique</strong>: Each element with "region" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_region_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22region%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "region" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_region_labelled</strong>: Each element with "region" role must have a label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_region_labelled.html#%7B%22message%22%3A%22Element%20with%20%5C%22region%5C%22%20role%20does%20not%20have%20a%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "region" role does not have a label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>form_label_unique</strong>: Form controls should have exactly one label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/form_label_unique.html#%7B%22message%22%3A%22Form%20control%20has%20more%20than%20one%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Form control has more than one label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>label_ref_valid</strong>: The 'for' attribute for a label should reference a non-empty, unique 'id' attribute of a valid element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/label_ref_valid.html#%7B%22message%22%3A%22The%20value%20%5C%22%7B0%7D%5C%22%20of%20the%20'for'%20attribute%20is%20not%20the%20'id'%20of%20a%20valid%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid%22%7D">The value "{0}" of the 'for' attribute is not the 'id' of a valid element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_caption_empty</strong>: A &lt;caption&gt; element for a &lt;table> element must contain descriptive text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_caption_empty.html#%7B%22message%22%3A%22The%20%3Ctable%3E%20element%20has%20an%20empty%20%3Ccaption%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;table&gt; element has an empty &lt;caption> element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_caption_nested</strong>: The &lt;caption&gt; element must be nested inside the associated &lt;table> element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_caption_nested.html#%7B%22message%22%3A%22%3Ccaption%3E%20element%20is%20not%20nested%20inside%20a%20%3Ctable%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">&lt;caption&gt; element is not nested inside a &lt;table> element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_headers_exists</strong>: Data table must identify headers + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_exists.html#%7B%22message%22%3A%22Table%20has%20no%20headers%20identified%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Table has no headers identified</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_headers_related</strong>: For a complex data table, all &lt;th&gt; and &lt;td> elements must be related via 'header' or 'scope' attributes + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_related.html#%7B%22message%22%3A%22Complex%20table%20does%20not%20have%20headers%20for%20each%20cell%20properly%20defined%20with%20'header'%20or%20'scope'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Complex table does not have headers for each cell properly defined with 'header' or 'scope'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_structure_misuse</strong>: Table elements with 'role="presentation" or 'role="none" should not have structural elements or attributes + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_structure_misuse.html#%7B%22message%22%3A%22The%20%3C%7B0%7D%3E%20element%20with%20%5C%22presentation%5C%22%20role%20or%20%5C%22none%5C%22%20role%20has%20structural%20element(s)%20and%2For%20attribute(s)%20'%7B1%7D'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;{0}&gt; element with "presentation" role or "none" role has structural element(s) and/or attribute(s) '{1}'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_summary_redundant</strong>: The table summary must not duplicate the caption + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_summary_redundant.html#%7B%22message%22%3A%22The%20table%20summary%20duplicates%20the%20caption%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The table summary duplicates the caption</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>blockquote_cite_exists</strong>: Use &lt;blockquote&gt; only for quotations, not indentation + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/blockquote_cite_exists.html#%7B%22message%22%3A%22Verify%20that%20%3Cblockquote%3E%20should%20have%20a%20'cite'%20attribute%20and%20not%20be%20used%20for%20indentation%20only%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that &lt;blockquote&gt; should have a 'cite' attribute and not be used for indentation only</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>heading_markup_misuse</strong>: Heading elements must not be used for presentation + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/heading_markup_misuse.html#%7B%22message%22%3A%22Verify%20that%20the%20heading%20element%20is%20a%20genuine%20heading%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the heading element is a genuine heading</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>list_markup_review</strong>: Proper HTML elements should be used to create a list + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/list_markup_review.html#%7B%22message%22%3A%22Verify%20this%20is%20a%20list%20and%20if%20so%2C%20modify%20to%20use%20proper%20HTML%20elements%20for%20the%20list%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_list%22%7D">Verify this is a list and if so, modify to use proper HTML elements for the list</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>text_block_heading</strong>: Heading text should use a heading element or role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_block_heading.html#%7B%22message%22%3A%22Confirm%20this%20text%20'%7B0%7D'%20is%20used%20as%20a%20heading%20and%20if%20so%2C%20modify%20to%20use%20a%20heading%20element%20or%20role%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_heading%22%7D">Confirm this text '{0}' is used as a heading and if so, modify to use a heading element or role</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>text_quoted_correctly</strong>: Quotations should be marked with &lt;q&gt; or &lt;blockquote> elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_quoted_correctly.html#%7B%22message%22%3A%22If%20the%20following%20text%20is%20a%20quotation%2C%20mark%20it%20as%20a%20%3Cq%3E%20or%20%3Cblockquote%3E%20element%3A%20%7B0%7D%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">If the following text is a quotation, mark it as a &lt;q&gt; or &lt;blockquote> element: {0}</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>fieldset_legend_valid</strong>: &lt;fieldset&gt; elements should have a single, non-empty &lt;legend> as a label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_legend_valid.html#%7B%22message%22%3A%22%3Cfieldset%3E%20element%20does%20not%20have%20a%20%3Clegend%3E%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">&lt;fieldset&gt; element does not have a &lt;legend></a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_legend_valid.html#%7B%22message%22%3A%22%3Cfieldset%3E%20element%20has%20more%20than%20one%20%3Clegend%3E%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">&lt;fieldset&gt; element has more than one &lt;legend></a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_legend_valid.html#%7B%22message%22%3A%22%3Cfieldset%3E%20element%20%3Clegend%3E%20is%20empty%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">&lt;fieldset&gt; element &lt;legend> is empty</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_child_valid</strong>: An element with an ARIA role must own a required child + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_child_valid.html#%7B%22message%22%3A%22The%20element%20with%20role%20%5C%22%7B0%7D%5C%22%20does%20not%20own%20any%20child%20element%20with%20any%20of%20the%20following%20role(s)%3A%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_no_child%22%7D">The element with role "{0}" does not own any child element with any of the following role(s): "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_child_valid.html#%7B%22message%22%3A%22The%20element%20with%20role%20%5C%22%7B0%7D%5C%22%20owns%20the%20child%20element%20with%20the%20role%20%5C%22%7B1%7D%5C%22%20that%20is%20not%20one%20of%20the%20allowed%20role(s)%3A%20%5C%22%7B2%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_invalid_child%22%7D">The element with role "{0}" owns the child element with the role "{1}" that is not one of the allowed role(s): "{2}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_complementary_label_visible</strong>: Each element with "complementary" role should have a visible label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_complementary_label_visible.html#%7B%22message%22%3A%22Element%20with%20%5C%22complementary%5C%22%20role%20does%20not%20have%20a%20visible%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "complementary" role does not have a visible label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_contentinfo_misuse</strong>: Each element with "contentinfo" role is only permitted with an element with "main" role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_contentinfo_misuse.html#%7B%22message%22%3A%22Element%20with%20%5C%22contentinfo%5C%22%20role%20is%20present%20without%20an%20element%20with%20%5C%22main%5C%22%20role%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "contentinfo" role is present without an element with "main" role</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_main_label_visible</strong>: Each element with "main" role should have a unique visible label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_main_label_visible.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22main%5C%22%20role%20do%20not%20have%20unique%20visible%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "main" role do not have unique visible labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_fields_grouped</strong>: Groups of logically related input elements should be contained within a &lt;fieldset&gt; element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_fields_grouped.html#%7B%22message%22%3A%22Use%20the%20%3Cfieldset%3E%20element%20to%20group%20logically%20related%20input%20elements%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Use the &lt;fieldset&gt; element to group logically related input elements</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>list_structure_proper</strong>: List elements should only be used for lists of related items + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/list_structure_proper.html#%7B%22message%22%3A%22List%20element%20is%20missing%20or%20improperly%20structured%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">List element is missing or improperly structured</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>select_options_grouped</strong>: Groups of related options within a selection list should be grouped with &lt;optgroup&gt; + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/select_options_grouped.html#%7B%22message%22%3A%22Group%20of%20related%20options%20may%20need%20%3Coptgroup%3E%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Group of related options may need &lt;optgroup&gt;</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_layout_linearized</strong>: Avoid using tables to format text documents in columns unless the table can be linearized + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_layout_linearized.html#%7B%22message%22%3A%22Verify%20table%20is%20not%20being%20used%20to%20format%20text%20content%20in%20columns%20unless%20the%20table%20can%20be%20linearized%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify table is not being used to format text content in columns unless the table can be linearized</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.3.2 Meaningful Sequence [A]</h2> + <div>When the sequence in which content is presented affects its meaning, a correct reading sequence can be programmatically determined.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>dir_attribute_valid</strong>: 'dir' attribute value must be "ltr", "rtl", or "auto" + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/dir_attribute_valid.html#%7B%22message%22%3A%22Invalid%20value%20used%20for%20the%20'dir'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Invalid value used for the 'dir' attribute</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>text_whitespace_valid</strong>: Space characters should not be used to control spacing within a word + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_whitespace_valid.html#%7B%22message%22%3A%22Space%20characters%20should%20not%20be%20used%20to%20create%20space%20between%20the%20letters%20of%20a%20word%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_text%22%7D">Space characters should not be used to create space between the letters of a word</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>style_highcontrast_visible</strong>: Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_highcontrast_visible.html#%7B%22message%22%3A%22Confirm%20Windows%20high%20contrast%20mode%20is%20supported%20when%20using%20CSS%20to%20include%2C%20position%20or%20alter%20non-decorative%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Confirm Windows high contrast mode is supported when using CSS to include, position or alter non-decorative content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.3.3 Sensory Characteristics [A]</h2> + <div>Instructions provided for understanding and operating content do not rely solely on sensory characteristics of components such as shape, size, visual location, orientation, or sound.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>text_sensory_misuse</strong>: Instructions should be meaningful without relying solely on shape, size, or location words + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_sensory_misuse.html#%7B%22message%22%3A%22Confirm%20the%20word(s)%20'%7B0%7D'%20of%20the%20user%20instruction%20is%20used%20to%20indicate%20a%20logical%20rather%20than%20visual%20position%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_position%22%7D">Confirm the word(s) '{0}' of the user instruction is used to indicate a logical rather than visual position</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_sensory_misuse.html#%7B%22message%22%3A%22Confirm%20the%20user%20instruction%20is%20still%20understandable%20without%20the%20word(s)%20'%7B0%7D'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_other%22%7D">Confirm the user instruction is still understandable without the word(s) '{0}'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.3.4 Orientation [AA]</h2> + <div>Content does not restrict its view and operation to a single display orientation, such as portrait or landscape.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>element_orientation_unlocked</strong>: Elements should not be restricted to either landscape or portrait orientation using CSS transform property + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_orientation_unlocked.html#%7B%22message%22%3A%22The%20element%20%3C%7B0%7D%3E%20is%20restricted%20to%20either%20landscape%20or%20portrait%20orientation%20using%20CSS%20transform%20property%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_locked%22%7D">The element &lt;{0}&gt; is restricted to either landscape or portrait orientation using CSS transform property</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.3.5 Identify Input Purpose [AA]</h2> + <div>The purpose of each input field that collects information about the user can be programmatically determined when the field serves a common purpose.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>input_autocomplete_valid</strong>: The 'autocomplete' attribute's token(s) must be appropriate for the input form field + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_autocomplete_valid.html#%7B%22message%22%3A%22The%20'autocomplete'%20attribute's%20token(s)%20are%20not%20appropriate%20for%20the%20input%20form%20field%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_inappropriate%22%7D">The 'autocomplete' attribute's token(s) are not appropriate for the input form field</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_autocomplete_valid.html#%7B%22message%22%3A%22The%20'autocomplete'%20attribute's%20token(s)%20are%20not%20appropriate%20for%20an%20input%20form%20field%20of%20any%20type%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid%22%7D">The 'autocomplete' attribute's token(s) are not appropriate for an input form field of any type</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_autocomplete_valid.html#%7B%22message%22%3A%22The%20'autocomplete'%20attribute%20has%20an%20incorrect%20value%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_incorrect%22%7D">The 'autocomplete' attribute has an incorrect value</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.1 Use of Color [A]</h2> + <div>Color is not used as the only visual means of conveying information, indicating an action, prompting a response, or distinguishing a visual element.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>form_font_color</strong>: Combine color and descriptive markup to indicate required form fields + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/form_font_color.html#%7B%22message%22%3A%22Check%20color%20is%20not%20used%20as%20the%20only%20visual%20means%20to%20convey%20which%20fields%20are%20required%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Check color is not used as the only visual means to convey which fields are required</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>style_color_misuse</strong>: Combine color and descriptive markup to convey information + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_color_misuse.html#%7B%22message%22%3A%22Verify%20color%20is%20not%20used%20as%20the%20only%20visual%20means%20of%20conveying%20information%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify color is not used as the only visual means of conveying information</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.2 Audio Control [A]</h2> + <div>If any audio plays automatically for more than 3 seconds, either a mechanism is available to pause or stop the audio, or a mechanism is available to control audio volume independently from the overall system volume level.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>media_autostart_controllable</strong>: Mechanism must be available to pause or stop and control the volume of the audio that plays automatically + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_autostart_controllable.html#%7B%22message%22%3A%22Verify%20there%20is%20a%20mechanism%20to%20pause%20or%20stop%20and%20control%20the%20volume%20for%20the%20audio%20that%20plays%20automatically%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify there is a mechanism to pause or stop and control the volume for the audio that plays automatically</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.3 Contrast (Minimum) [AA]</h2> + <div>The visual presentation of text and images of text has a contrast ratio of at least 4.5:1, with a 3:1 ratio for large-scale text.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>text_contrast_sufficient</strong>: The contrast ratio of text with its background must meet WCAG AA requirements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_contrast_sufficient.html#%7B%22message%22%3A%22Text%20contrast%20of%20%7B0%7D%20with%20its%20background%20is%20less%20than%20the%20WCAG%20AA%20minimum%20requirements%20for%20text%20of%20size%20%7B1%7Dpx%20and%20weight%20of%20%7B2%7D%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_contrast%22%7D">Text contrast of {0} with its background is less than the WCAG AA minimum requirements for text of size {1}px and weight of {2}</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_contrast_sufficient.html#%7B%22message%22%3A%22The%20foreground%20text%20and%20its%20background%20color%20are%20both%20detected%20as%20%7B3%7D.%20Verify%20the%20text%20meets%20the%20WCAG%20AA%20requirements%20for%20minimum%20contrast%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_same_color%22%7D">The foreground text and its background color are both detected as {3}. Verify the text meets the WCAG AA requirements for minimum contrast</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_contrast_sufficient.html#%7B%22message%22%3A%22Verify%20the%20contrast%20ratio%20of%20the%20text%20against%20the%20lightest%20and%20the%20darkest%20colors%20of%20the%20background%20meets%20the%20WCAG%20AA%20minimum%20requirements%20for%20text%20of%20size%20%7B1%7Dpx%20and%20weight%20of%20%7B2%7D%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_graphic_background%22%7D">Verify the contrast ratio of the text against the lightest and the darkest colors of the background meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_contrast_sufficient.html#%7B%22message%22%3A%22Verify%20the%20contrast%20ratio%20of%20the%20text%20with%20shadow%20meets%20the%20WCAG%20AA%20minimum%20requirements%20for%20text%20of%20size%20%7B1%7Dpx%20and%20weight%20of%20%7B2%7D%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_text_shadow%22%7D">Verify the contrast ratio of the text with shadow meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.4 Resize text [AA]</h2> + <div>Text can be resized without assistive technology up to 200 percent without loss of content or functionality.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>style_viewport_resizable</strong>: Text must scale up to 200% without loss of content or functionality + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_viewport_resizable.html#%7B%22message%22%3A%22Verify%20that%20text%20sized%20using%20viewport%20units%20can%20be%20resized%20up%20to%20200%25%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that text sized using viewport units can be resized up to 200%</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>meta_viewport_zoomable</strong>: The 'meta[name=viewport]' should not prevent the browser zooming the content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/meta_viewport_zoomable.html#%7B%22message%22%3A%22Confirm%20the%20'meta%5Bname%3Dviewport%5D'%20with%20%5C%22%7B0%7D%5C%22%20can%20be%20zoomed%20by%20user%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_zoomable%22%7D">Confirm the 'meta[name=viewport]' with "{0}" can be zoomed by user</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.5 Images of Text [AA]</h2> + <div>If the technologies being used can achieve the visual presentation, text should not be used to convey information rather than images of text.</div> + +</div><div> + <h2>1.4.10 Reflow [AA]</h2> + <div>Content can reflow without loss of information or functionality, and without requiring scrolling in two dimensions.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>style_viewport_resizable</strong>: Text must scale up to 200% without loss of content or functionality + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_viewport_resizable.html#%7B%22message%22%3A%22Verify%20that%20text%20sized%20using%20viewport%20units%20can%20be%20resized%20up%20to%20200%25%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that text sized using viewport units can be resized up to 200%</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.11 Non-text Contrast [AA]</h2> + <div>The parts of graphical objects required to understand the content, and the visual information required to identify UI components and states, have a contrast ratio of at least 3:1 against adjacent colors.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>style_highcontrast_visible</strong>: Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_highcontrast_visible.html#%7B%22message%22%3A%22Confirm%20Windows%20high%20contrast%20mode%20is%20supported%20when%20using%20CSS%20to%20include%2C%20position%20or%20alter%20non-decorative%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Confirm Windows high contrast mode is supported when using CSS to include, position or alter non-decorative content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.12 Text Spacing [AA]</h2> + <div>No loss of content or functionality occurs when users change letter, word and paragraph spacing, as well as line height.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>text_spacing_valid</strong>: CSS !important should not be used in inline style to control letter or word spacing or line height + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_spacing_valid.html#%7B%22message%22%3A%22CSS%20!important%20should%20not%20be%20used%20in%20inline%20%E2%80%98letter-spacing%E2%80%99%20style%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_letter_spacing_style%22%7D">CSS !important should not be used in inline ‘letter-spacing’ style</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_spacing_valid.html#%7B%22message%22%3A%22CSS%20!important%20should%20not%20be%20used%20in%20inline%20%E2%80%98word-spacing%E2%80%99%20style%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_word_spacing_style%22%7D">CSS !important should not be used in inline ‘word-spacing’ style</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_spacing_valid.html#%7B%22message%22%3A%22CSS%20!important%20should%20not%20be%20used%20in%20inline%20%E2%80%98line-height%E2%80%99%20style%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_line_height_style%22%7D">CSS !important should not be used in inline ‘line-height’ style</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.13 Content on Hover or Focus [AA]</h2> + <div>Where hover or focus actions cause additional content to become visible and hidden, the additional content is dismissable, hoverable and persistent.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>style_hover_persistent</strong>: The pointer should be able to move over content displayed on hover + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_hover_persistent.html#%7B%22message%22%3A%22Confirm%20the%20pointer%20can%20be%20positioned%20over%20the%20displayed%20element%2C%20not%20just%20the%20trigger%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Confirm the pointer can be positioned over the displayed element, not just the trigger</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_hover_persistent.html#%7B%22message%22%3A%22Confirm%20the%20pointer%20can%20be%20positioned%20over%20all%20the%20information%20displayed%20on%20hover%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_2%22%7D">Confirm the pointer can be positioned over all the information displayed on hover</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_hover_persistent.html#%7B%22message%22%3A%22Confirm%20the%20margin%20style%20attribute%20has%20not%20prevented%20the%20pointer%20from%20hovering%20over%20the%20displayed%20element%2C%20not%20just%20the%20trigger%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_3%22%7D">Confirm the margin style attribute has not prevented the pointer from hovering over the displayed element, not just the trigger</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.1.1 Keyboard [A]</h2> + <div>All functionality of the content is operable through a keyboard interface without requiring specific timings for individual keystrokes.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>aria_activedescendant_tabindex_valid</strong>: Element using 'aria-activedescendant' property should be tabbable + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_activedescendant_tabindex_valid.html#%7B%22message%22%3A%22The%20%3C%7B0%7D%3E%20element%20using%20'aria-activedescendant'%20set%20to%20%5C%22%7B1%7D%5C%22%20is%20not%20tabbable%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;{0}&gt; element using 'aria-activedescendant' set to "{1}" is not tabbable</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_child_tabbable</strong>: UI component must have at least one tabbable descendant for keyboard access + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_child_tabbable.html#%7B%22message%22%3A%22None%20of%20the%20descendent%20elements%20with%20%5C%22%7B1%7D%5C%22%20role%20is%20tabbable%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_missing_child%22%7D">None of the descendent elements with "{1}" role is tabbable</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>iframe_interactive_tabbable</strong>: Iframe with interactive content should not be excluded from tab order using tabindex + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/iframe_interactive_tabbable.html#%7B%22message%22%3A%22The%20%3Ciframe%3E%20with%20interactive%20content%20is%20excluded%20from%20tab%20order%20using%20tabindex%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid%22%7D">The &lt;iframe&gt; with interactive content is excluded from tab order using tabindex</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>application_content_accessible</strong>: Non-decorative static text and image content within an element with "application" role must be accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/application_content_accessible.html#%7B%22message%22%3A%22Verify%20that%20the%20non-decorative%20static%20text%20and%20image%20content%20within%20an%20element%20with%20%5C%22application%5C%22%20role%20are%20accessible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the non-decorative static text and image content within an element with "application" role are accessible</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_keyboard_handler_exists</strong>: Interactive WAI_ARIA UI components must provide keyboard access + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_keyboard_handler_exists.html#%7B%22message%22%3A%22Verify%20the%20%3C%7B0%7D%3E%20element%20with%20%5C%22%7B1%7D%5C%22%20role%20has%20keyboard%20access%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_no_keyboard_access%22%7D">Verify the &lt;{0}&gt; element with "{1}" role has keyboard access</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>script_focus_blur_review</strong>: Scripting must not remove focus from content that normally receives focus + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_focus_blur_review.html#%7B%22message%22%3A%22Verify%20script%20does%20not%20remove%20focus%20from%20content%20that%20normally%20receives%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify script does not remove focus from content that normally receives focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>script_onclick_misuse</strong>: Scripts should not be used to emulate links + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_onclick_misuse.html#%7B%22message%22%3A%22Possible%20use%20of%20a%20script%20to%20emulate%20a%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Possible use of a script to emulate a link</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>widget_tabbable_exists</strong>: Component must have at least one tabbable element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/widget_tabbable_exists.html#%7B%22message%22%3A%22Component%20with%20%5C%22%7B0%7D%5C%22%20role%20does%20not%20have%20a%20tabbable%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22fail_no_tabbable%22%7D">Component with "{0}" role does not have a tabbable element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>widget_tabbable_single</strong>: Components with a widget role must have no more than one tabbable element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/widget_tabbable_single.html#%7B%22message%22%3A%22Component%20with%20%5C%22%7B0%7D%5C%22%20role%20has%20more%20than%20one%20tabbable%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_multiple_tabbable%22%7D">Component with "{0}" role has more than one tabbable element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>media_keyboard_controllable</strong>: Media using &lt;audio&gt; and/or &lt;video> elements must have keyboard accessible controls + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_keyboard_controllable.html#%7B%22message%22%3A%22Verify%20media%20using%20%3Caudio%3E%20and%2For%20%3Cvideo%3E%20elements%20have%20keyboard%20accessible%20controls%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify media using &lt;audio&gt; and/or &lt;video> elements have keyboard accessible controls</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>script_onclick_avoid</strong>: Scripts should not be used to emulate links + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_onclick_avoid.html#%7B%22message%22%3A%22Verify%20that%20'onclick'%20events%20are%20not%20used%20in%20script%20to%20emulate%20a%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that 'onclick' events are not used in script to emulate a link</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>canvas_content_described</strong>: The &lt;canvas&gt; element may not be accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/canvas_content_described.html#%7B%22message%22%3A%22Verify%20accessibility%20of%20the%20%3Ccanvas%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify accessibility of the &lt;canvas&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>element_mouseevent_keyboard</strong>: All interactive content with mouse event handlers must have equivalent keyboard access + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_mouseevent_keyboard.html#%7B%22message%22%3A%22Confirm%20the%20%3C%7B0%7D%3E%20element%20with%20mouse%20event%20handler(s)%20'%7B1%7D'%20has%20a%20corresponding%20keyboard%20handler(s)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Confirm the &lt;{0}&gt; element with mouse event handler(s) '{1}' has a corresponding keyboard handler(s)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.1.2 No Keyboard Trap [A]</h2> + <div>If keyboard focus can be moved to a component using a keyboard interface, then focus can be moved away from that component using only a keyboard interface, and, if it requires more than unmodified arrow or tab keys or other standard exit methods, the user is advised of the method for moving focus away.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>download_keyboard_controllable</strong>: File download mechanisms should be keyboard-operable and preserve page focus location + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/download_keyboard_controllable.html#%7B%22message%22%3A%22Verify%20that%20the%20file%20download%20mechanism%20does%20not%20cause%20a%20keyboard%20trap%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify that the file download mechanism does not cause a keyboard trap</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.1.4 Character Key Shortcuts [A]</h2> + <div>If a keyboard shortcut is implemented using only letter, punctuation, number or symbol characters, then the shortcut can be turned off, remapped or activated only on focus.</div> + +</div><div> + <h2>2.2.1 Timing Adjustable [A]</h2> + <div>For each time limit that is set by the content, the user can turn off, adjust, or extend the limit.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>meta_refresh_delay</strong>: Pages should not refresh automatically + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/meta_refresh_delay.html#%7B%22message%22%3A%22Verify%20page%20is%20not%20being%20caused%20to%20refresh%20automatically%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_refresh%22%7D">Verify page is not being caused to refresh automatically</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.2.2 Pause, Stop, Hide [A]</h2> + <div>For moving, blinking, scrolling, or auto-updating information, the user can pause, stop, hide or adjust the information.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>blink_elem_deprecated</strong>: Content that blinks persistently must not be used + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/blink_elem_deprecated.html#%7B%22message%22%3A%22Content%20found%20that%20blinks%20persistently%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Content found that blinks persistently</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>marquee_elem_avoid</strong>: The &lt;marquee&gt; element is obsolete and should not be used + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/marquee_elem_avoid.html#%7B%22message%22%3A%22Scrolling%20content%20found%20that%20uses%20the%20obsolete%20%3Cmarquee%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Scrolling content found that uses the obsolete &lt;marquee&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>blink_css_review</strong>: Do not use the "blink" value of the 'text-decoration' property for longer than five seconds + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/blink_css_review.html#%7B%22message%22%3A%22Check%20the%20%5C%22blink%5C%22%20value%20of%20the%20CSS%20'text-decoration'%20property%20is%20not%20used%20for%20more%20than%20than%20five%20seconds%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Check the "blink" value of the CSS 'text-decoration' property is not used for more than than five seconds</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.3.1 Three Flashes or Below Threshold [A]</h2> + <div>Content does not contain anything that flashes more than three times in any one second period, or the flash is below the general flash and red flash thresholds.</div> + +</div><div> + <h2>2.4.1 Bypass Blocks [A]</h2> + <div>A mechanism is available to bypass blocks of content that are repeated on multiple Web pages.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>aria_application_label_unique</strong>: Each element with "application" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_application_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22application%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "application" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_application_labelled</strong>: Each element with "application" role must have a label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_application_labelled.html#%7B%22message%22%3A%22Element%20with%20%5C%22application%5C%22%20role%20does%20not%20have%20a%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_label%22%7D">Element with "application" role does not have a label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_article_label_unique</strong>: Each element with "article" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_article_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22article%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "article" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_document_label_unique</strong>: Each element with "document" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_document_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22document%5C%22%20roles%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "document" roles do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_toolbar_label_unique</strong>: Each element with "toolbar" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_toolbar_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22toolbar%5C%22%20roles%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "toolbar" roles do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>skip_main_exists</strong>: Pages must provide a way to skip directly to the main content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/skip_main_exists.html#%7B%22message%22%3A%22The%20page%20does%20not%20provide%20a%20way%20to%20quickly%20navigate%20to%20the%20main%20content%20(ARIA%20%5C%22main%5C%22%20landmark%20or%20a%20skip%20link)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The page does not provide a way to quickly navigate to the main content (ARIA "main" landmark or a skip link)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>frame_src_valid</strong>: A &lt;frame&gt; containing non-HTML content must be made accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/frame_src_valid.html#%7B%22message%22%3A%22Verify%20%3Cframe%3E%20content%20is%20accessible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify &lt;frame&gt; content is accessible</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>html_skipnav_exists</strong>: Provide a way to bypass blocks of content that are repeated on multiple Web pages + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_skipnav_exists.html#%7B%22message%22%3A%22Verify%20there%20is%20a%20way%20to%20bypass%20blocks%20of%20content%20that%20are%20repeated%20on%20multiple%20Web%20pages%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify there is a way to bypass blocks of content that are repeated on multiple Web pages</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>skip_main_described</strong>: The description of a hyperlink used to skip content must communicate where it links to + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/skip_main_described.html#%7B%22message%22%3A%22Verify%20that%20if%20this%20hyperlink%20skips%20content%2C%20the%20description%20communicates%20where%20it%20links%20to%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that if this hyperlink skips content, the description communicates where it links to</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.2 Page Titled [A]</h2> + <div>Web pages, non-web documents, and software have titles that describe topic or purpose.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>page_title_exists</strong>: The page should have a title that correctly identifies the subject of the page + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/page_title_exists.html#%7B%22message%22%3A%22Missing%20%3Chead%3E%20element%20so%20there%20can%20be%20no%20%3Ctitle%3E%20element%20present%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Missing &lt;head&gt; element so there can be no &lt;title> element present</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/page_title_exists.html#%7B%22message%22%3A%22Missing%20%3Ctitle%3E%20element%20in%20%3Chead%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Missing &lt;title&gt; element in &lt;head> element</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/page_title_exists.html#%7B%22message%22%3A%22The%20%3Ctitle%3E%20element%20is%20empty%20(no%20innerHTML)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">The &lt;title&gt; element is empty (no innerHTML)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>page_title_valid</strong>: Page &lt;title&gt; should be a descriptive title, rather than a filename + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/page_title_valid.html#%7B%22message%22%3A%22Verify%20that%20using%20the%20filename%20as%20the%20page%20%3Ctitle%3E%20value%20is%20descriptive%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_2%22%7D">Verify that using the filename as the page &lt;title&gt; value is descriptive</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.3 Focus Order [A]</h2> + <div>If content can be navigated sequentially and the navigation sequences affect meaning or operation, focusable components receive focus in an order that preserves meaning and operability.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>widget_tabbable_single</strong>: Components with a widget role must have no more than one tabbable element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/widget_tabbable_single.html#%7B%22message%22%3A%22Component%20with%20%5C%22%7B0%7D%5C%22%20role%20has%20more%20than%20one%20tabbable%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_multiple_tabbable%22%7D">Component with "{0}" role has more than one tabbable element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.4 Link Purpose (In Context) [A]</h2> + <div>The purpose of each link can be determined from the link text alone or from the link text together with its programmatically determined link content.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>img_alt_redundant</strong>: The text alternative for an image within a link should not repeat the link text or adjacent link text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Link%20text%20is%20repeated%20in%20an%20image%20'alt'%20value%20within%20the%20same%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Link text is repeated in an image 'alt' value within the same link</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Link%20text%20of%20previous%20link%20is%20repeated%20in%20image%20'alt'%20value%20of%20a%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Link text of previous link is repeated in image 'alt' value of a link</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Image%20'alt'%20value%20within%20a%20link%20is%20repeated%20in%20link%20text%20of%20the%20link%20after%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Image 'alt' value within a link is repeated in link text of the link after</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>a_text_purpose</strong>: Hyperlinks must have an accessible name for their purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/a_text_purpose.html#%7B%22message%22%3A%22Hyperlink%20has%20no%20link%20text%2C%20label%20or%20image%20with%20a%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_acc_name%22%7D">Hyperlink has no link text, label or image with a text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.5 Multiple Ways [AA]</h2> + <div>More than one way is available to locate a Web page within a set of Web pages, except where the Web Page is the result of, or a step in, a process.</div> + +</div><div> + <h2>2.4.6 Headings and Labels [AA]</h2> + <div>Headings and labels describe topic or purpose.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>heading_content_exists</strong>: Heading elements must provide descriptive text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/heading_content_exists.html#%7B%22message%22%3A%22Heading%20element%20has%20no%20descriptive%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Heading element has no descriptive content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.7 Focus Visible [AA]</h2> + <div>Any keyboard operable user interface has a mode of operation where the keyboard focus indicator is visible.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>element_tabbable_visible</strong>: A tabbable element should be visible on the screen when it has keyboard focus + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_tabbable_visible.html#%7B%22message%22%3A%22Confirm%20the%20element%20should%20be%20tabbable%20and%20if%20so%2C%20it%20becomes%20visible%20when%20it%20has%20keyboard%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_visible%22%7D">Confirm the element should be tabbable and if so, it becomes visible when it has keyboard focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>script_focus_blur_review</strong>: Scripting must not remove focus from content that normally receives focus + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_focus_blur_review.html#%7B%22message%22%3A%22Verify%20script%20does%20not%20remove%20focus%20from%20content%20that%20normally%20receives%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify script does not remove focus from content that normally receives focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>style_focus_visible</strong>: The keyboard focus indicator should be visible when default border or outline is modified by CSS + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_focus_visible.html#%7B%22message%22%3A%22Check%20the%20keyboard%20focus%20indicator%20is%20visible%20when%20using%20CSS%20declaration%20for%20'border'%20or%20'outline'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_focus_not_visible%22%7D">Check the keyboard focus indicator is visible when using CSS declaration for 'border' or 'outline'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.11 Focus Not Obscured (Minimum) [AA]</h2> + <div>When an element receives focus, it is not entirely covered by other content.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>element_tabbable_unobscured</strong>: When an element receives focus, it is not entirely covered by other content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_tabbable_unobscured.html#%7B%22message%22%3A%22Confirm%20that%20when%20the%20element%20receives%20focus%2C%20it%20is%20not%20covered%20or%2C%20if%20covered%20by%20user%20action%2C%20can%20be%20uncovered%20without%20moving%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_obscured%22%7D">Confirm that when the element receives focus, it is not covered or, if covered by user action, can be uncovered without moving focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.5.1 Pointer Gestures [A]</h2> + <div>All functionality that uses multipoint or path-based gestures for operation can be operated with a single pointer without a path-based gesture.</div> + +</div><div> + <h2>2.5.2 Pointer Cancellation [A]</h2> + <div>For functionality that can be operated using a single pointer, completion of the function is on the up-event with an ability to abort, undo or reverse the outcome.</div> + +</div><div> + <h2>2.5.3 Label in Name [A]</h2> + <div>For user interface components with labels that include text or images of text, the accessible name contains the text that is presented visually.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>label_name_visible</strong>: Accessible name must match or contain the visible label text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/label_name_visible.html#%7B%22message%22%3A%22Accessible%20name%20does%20not%20match%20or%20contain%20the%20visible%20label%20text%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Accessible name does not match or contain the visible label text</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_label_visible</strong>: An input element must have an associated visible label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_visible.html#%7B%22message%22%3A%22The%20%E2%80%98placeholder%E2%80%99%20is%20the%20only%20visible%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_placeholder_only%22%7D">The ‘placeholder’ is the only visible label</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_visible.html#%7B%22message%22%3A%22The%20input%20element%20does%20not%20have%20an%20associated%20visible%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_no_label%22%7D">The input element does not have an associated visible label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.5.4 Motion Actuation [A]</h2> + <div>Functionality that can be operated by motion can also be operated by user interface components, and the motion trigger can be disabled.</div> + +</div><div> + <h2>2.5.7 Dragging Movement [AA]</h2> + <div>All functionality that uses a dragging movement for operation can be achieved by a single pointer without dragging.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>draggable_alternative_exists</strong>: A draggable element must have a "single pointer" alternative + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/draggable_alternative_exists.html#%7B%22message%22%3A%22Ensure%20the%20draggable%20element%20%5C%22%7B0%7D%5C%22%20has%20a%20%5C%22single%20pointer%5C%22%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_alternative%22%7D">Ensure the draggable element "{0}" has a "single pointer" alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.5.8 Minimum Target Size [AA]</h2> + <div>The size of the target for pointer inputs is at least 24 by 24 CSS pixels.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>target_spacing_sufficient</strong>: The target must be sufficiently sized or spaced from other targets + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/target_spacing_sufficient.html#%7B%22message%22%3A%22Undersized%20target%20%5C%22%7B0%7D%5C%22%20does%20not%20have%20sufficient%20spacing%20of%2012%20CSS%20pixels%20from%20another%20target%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22violation_spacing%22%7D">Undersized target "{0}" does not have sufficient spacing of 12 CSS pixels from another target "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/target_spacing_sufficient.html#%7B%22message%22%3A%22Ensure%20the%20overlapped%20target%20%5C%22%7B0%7D%5C%22%20meets%20a%20minimum%20target%20size%20or%20has%20sufficient%20spacing%20from%20the%20overlapping%20target%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_overlap%22%7D">Ensure the overlapped target "{0}" meets a minimum target size or has sufficient spacing from the overlapping target "{1}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.1.1 Language of Page [A]</h2> + <div>The default human language of Web pages, non-Web documents, or software can be programmatically determined.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>html_lang_exists</strong>: Page must identify the default language of the document with a 'lang' attribute + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20as%20XHTML%201.0%2C%20but%20has%20neither%20'lang'%20nor%20'xml%3Alang'%20attributes%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Page detected as XHTML 1.0, but has neither 'lang' nor 'xml:lang' attributes</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20as%20XHTML%2C%20but%20does%20not%20have%20an%20'xml%3Alang'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Page detected as XHTML, but does not have an 'xml:lang' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20as%20HTML%2C%20but%20does%20not%20have%20a%20'lang'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Page detected as HTML, but does not have a 'lang' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20with%20'lang'%20and%20'xml%3Alang'%20attributes%20and%20primary%20languages%20do%20not%20match%3A%20%5C%22%7B0%7D%5C%22%2C%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_4%22%7D">Page detected with 'lang' and 'xml:lang' attributes and primary languages do not match: "{0}", "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20with%20'lang'%20and%20'xml%3Alang'%20attributes%20that%20do%20not%20match%3A%20%5C%22%7B0%7D%5C%22%2C%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_5%22%7D">Page detected with 'lang' and 'xml:lang' attributes that do not match: "{0}", "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20as%20XHTML%201.0%20with%20only%20a%20'lang'%20attribute.%20Confirm%20that%20page%20is%20only%20delivered%20via%20text%2Fhtml%20mime%20type%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_5%22%7D">Page detected as XHTML 1.0 with only a 'lang' attribute. Confirm that page is only delivered via text/html mime type</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20as%20XHTML%201.0%20with%20only%20an%20'xml%3Alang'%20attribute.%20Confirm%20that%20page%20is%20only%20delivered%20via%20xml%20mime%20type%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_6%22%7D">Page detected as XHTML 1.0 with only an 'xml:lang' attribute. Confirm that page is only delivered via xml mime type</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>html_lang_valid</strong>: The default human language of the page must be valid and specified in accordance with BCP 47 + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_valid.html#%7B%22message%22%3A%22Specified%20'lang'%20attribute%20does%20not%20include%20a%20valid%20primary%20language%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Specified 'lang' attribute does not include a valid primary language</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_valid.html#%7B%22message%22%3A%22Specified%20'lang'%20attribute%20does%20not%20conform%20to%20BCP%2047%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Specified 'lang' attribute does not conform to BCP 47</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_valid.html#%7B%22message%22%3A%22Specified%20'xml%3Alang'%20attribute%20does%20not%20include%20a%20valid%20primary%20language%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Specified 'xml:lang' attribute does not include a valid primary language</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_valid.html#%7B%22message%22%3A%22Specified%20'xml%3Alang'%20attribute%20does%20not%20conform%20to%20BCP%2047%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_4%22%7D">Specified 'xml:lang' attribute does not conform to BCP 47</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.1.2 Language of Parts [AA]</h2> + <div>The human language of each passage or phrase in the content can be programmatically determined.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>element_lang_valid</strong>: The change in language of specific content must be valid and specified in accordance with BCP 47 + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_lang_valid.html#%7B%22message%22%3A%22Specified%20'lang'%20attribute%20does%20not%20include%20a%20valid%20primary%20language%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Specified 'lang' attribute does not include a valid primary language</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_lang_valid.html#%7B%22message%22%3A%22Specified%20'lang'%20attribute%20does%20not%20conform%20to%20BCP%2047%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Specified 'lang' attribute does not conform to BCP 47</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_lang_valid.html#%7B%22message%22%3A%22Specified%20'xml%3Alang'%20attribute%20does%20not%20include%20a%20valid%20primary%20language%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Specified 'xml:lang' attribute does not include a valid primary language</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_lang_valid.html#%7B%22message%22%3A%22Specified%20'xml%3Alang'%20attribute%20does%20not%20conform%20to%20BCP%2047%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_4%22%7D">Specified 'xml:lang' attribute does not conform to BCP 47</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.2.1 On Focus [A]</h2> + <div>When any component receives focus, it does not initiate a change of context.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>script_focus_blur_review</strong>: Scripting must not remove focus from content that normally receives focus + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_focus_blur_review.html#%7B%22message%22%3A%22Verify%20script%20does%20not%20remove%20focus%20from%20content%20that%20normally%20receives%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify script does not remove focus from content that normally receives focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>script_select_review</strong>: No changes of context should occur when a selection value receives focus + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_select_review.html#%7B%22message%22%3A%22Verify%20that%20no%20change%20of%20context%20or%20action%20occurs%20when%20selection%20options%20in%20this%20component%20receive%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that no change of context or action occurs when selection options in this component receive focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.2.2 On Input [A]</h2> + <div>Changing the setting of any user interface component does not automatically cause a change of context unless the user has been advised of the behavior before using the component.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>form_interaction_review</strong>: User should be informed in advance when interacting with content causes a change of context + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/form_interaction_review.html#%7B%22message%22%3A%22Verify%20that%20interacting%20with%20content%20will%20not%20open%20pop-up%20windows%20or%20change%20the%20active%20window%20without%20informing%20the%20user%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that interacting with content will not open pop-up windows or change the active window without informing the user</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>form_submit_button_exists</strong>: A &lt;form&gt; element should have a submit button or an image button + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/form_submit_button_exists.html#%7B%22message%22%3A%22Verify%20the%20%3Cform%3E%20element%20has%20a%20submit%20button%20or%20an%20image%20button%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify the &lt;form&gt; element has a submit button or an image button</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_onchange_review</strong>: Users must be advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_onchange_review.html#%7B%22message%22%3A%22Confirm%20that%20the%20user%20is%20advised%20if%2C%20due%20to%20a%20change%20of%20element%20value%2C%20a%20form%20automatically%20submits%2C%20a%20new%20window%20opens%2C%20or%20a%20change%20in%20focus%20occurs%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_warning%22%7D">Confirm that the user is advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>a_target_warning</strong>: Users should be warned in advance if their input action will open a new window + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/a_target_warning.html#%7B%22message%22%3A%22Inform%20the%20user%20when%20their%20input%20action%20will%20open%20a%20new%20window%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_warn%22%7D">Inform the user when their input action will open a new window</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.2.3 Consistent Navigation [AA]</h2> + <div>Navigational mechanisms that are repeated on multiple Web pages within a set of Web pages occur in the same relative order each time they are repeated, unless a change is initiated by the user.</div> + +</div><div> + <h2>3.2.4 Consistent Identification [AA]</h2> + <div>Components that have the same functionality within a set of Web pages are identified consistently.</div> + +</div><div> + <h2>3.2.6 Consistent Help [AA]</h2> + <div>Make it easier to find help and support. If a Web page contains help mechanisms they occur in the same order relative to other page content, unless a change is initiated by the user.</div> + +</div><div> + <h2>3.3.1 Error Identification [A]</h2> + <div>If an input error is automatically detected, the item that is in error is identified and the error is described to the user in text.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>error_message_exists</strong>: A custom error message must reference a valid 'id' value and when triggered the message must be appropriately exposed + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/error_message_exists.html#%7B%22message%22%3A%22Custom%20error%20message%20has%20invalid%20reference%20'id'%20value%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Custom error message has invalid reference 'id' value</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/error_message_exists.html#%7B%22message%22%3A%22Custom%20error%20message%20is%20not%20visible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Custom error message is not visible</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.3.2 Labels or Instructions [A]</h2> + <div>Labels or instructions are provided when content requires user input.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>fieldset_label_valid</strong>: Groups with nested inputs must have unique accessible name + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_label_valid.html#%7B%22message%22%3A%22Group%2FFieldset%20does%20not%20have%20an%20accessible%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Group/Fieldset does not have an accessible name</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_label_valid.html#%7B%22message%22%3A%22Group%2FFieldset%20%5C%22%7B0%7D%5C%22%20has%20a%20duplicate%20name%20to%20another%20group%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Group/Fieldset "{0}" has a duplicate name to another group</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_label_after</strong>: Checkboxes and radio buttons must have a label after the input control + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_after.html#%7B%22message%22%3A%22Checkbox%20or%20radio%20button%20is%20nested%20in%20label%2C%20so%20label%20is%20not%20after%20the%20input%20control%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Checkbox or radio button is nested in label, so label is not after the input control</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_after.html#%7B%22message%22%3A%22Label%20text%20is%20located%20before%20its%20associated%20checkbox%20or%20radio%20button%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Label text is located before its associated checkbox or radio button element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_label_before</strong>: Text inputs and &lt;select&gt; elements must have a label before the input control + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_before.html#%7B%22message%22%3A%22Text%20input%20is%20nested%20in%20label%20such%20that%20input%20precedes%20the%20label%20text%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Text input is nested in label such that input precedes the label text</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_before.html#%7B%22message%22%3A%22Label%20text%20is%20located%20after%20its%20associated%20text%20input%20or%20%3Cselect%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Label text is located after its associated text input or &lt;select&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_label_visible</strong>: An input element must have an associated visible label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_visible.html#%7B%22message%22%3A%22The%20%E2%80%98placeholder%E2%80%99%20is%20the%20only%20visible%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_placeholder_only%22%7D">The ‘placeholder’ is the only visible label</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_visible.html#%7B%22message%22%3A%22The%20input%20element%20does%20not%20have%20an%20associated%20visible%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_no_label%22%7D">The input element does not have an associated visible label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>element_accesskey_labelled</strong>: An element with an assigned 'accesskey' attribute must have an associated label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_accesskey_labelled.html#%7B%22message%22%3A%22The%20element%20with%20an%20assigned%20'accesskey'%20attribute%20does%20not%20have%20an%20associated%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">The element with an assigned 'accesskey' attribute does not have an associated label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.3.3 Error Suggestion [AA]</h2> + <div>If an input error is automatically detected and suggestions for correction are known, then the suggestions are provided to the user, unless it would jeopardize the security or purpose of the content.</div> + +</div><div> + <h2>3.3.4 Error Prevention (Legal, Financial, Data) [AA]</h2> + <div>For content that cause legal commitments or financial transactions for the user to occur, that modify or delete user-controllable data in data storage systems, or that submit user test responses, the user can reverse, correct, or confirm the action.</div> + +</div><div> + <h2>3.3.7 Redundant Entry [AA]</h2> + <div>Make it easier for users to complete multi-step processes. Don't ask for the same information twice in the same session.</div> + +</div><div> + <h2>3.3.8 Accessible Authentication (Minimum) [AA]</h2> + <div>Make logins possible with less mental effort. Don't make people solve, recall, or transcribe something to log in.</div> + +</div><div> + <h2>4.1.1 Parsing [A]</h2> + <div>(Obsolete and removed) This requirement was originally adopted to address problems that assistive technology (AT) had directly parsing HTML. AT no longer has any need to directly parse HTML. Consequently, these problems either no longer exist or are addressed by other requirements.</div> + +</div><div> + <h2>4.1.2 Name, Role, Value [A]</h2> + <div>For all user interface components (including, but not limited to: form elements, links and components generated by scripts), the name and role can be programmatically determined; states, properties, and values that can be set by the user can be programmatically set; and notification of changes to these items is available to user agents, including assistive technologies.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>combobox_popup_reference</strong>: The 'aria-controls' (for ARIA 1.2) or the 'aria-owns' (for ARIA 1.0) attribute of the expanded combobox must reference a valid popup 'id' value + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20'aria-owns'%20attribute%20of%20the%20expanded%20combobox%20is%20missing%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1.0_missing_owns%22%7D">The 'aria-owns' attribute of the expanded combobox is missing</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20'aria-controls'%20attribute%20of%20the%20expanded%20combobox%20is%20missing%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1.2_missing_controls%22%7D">The 'aria-controls' attribute of the expanded combobox is missing</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20'aria-owns'%20attribute%20%5C%22%7B0%7D%5C%22%20of%20the%20expanded%20combobox%20does%20not%20reference%20a%20valid%20popup%20'id'%20value%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1.0_popup_reference_missing%22%7D">The 'aria-owns' attribute "{0}" of the expanded combobox does not reference a valid popup 'id' value</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20'aria-controls'%20attribute%20%5C%22%7B0%7D%5C%22%20of%20the%20expanded%20combobox%20does%20not%20reference%20a%20valid%20popup%20'id'%20value%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1.2_popup_reference_missing%22%7D">The 'aria-controls' attribute "{0}" of the expanded combobox does not reference a valid popup 'id' value</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20combobox%20'aria-expanded'%20attribute%20is%20true%2C%20but%20the%20combobox%20popup%20is%20not%20visible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_combobox_expanded_hidden%22%7D">The combobox 'aria-expanded' attribute is true, but the combobox popup is not visible</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20combobox%20'aria-expanded'%20attribute%20is%20false%2C%20but%20the%20combobox%20popup%20is%20visible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_combobox_collapsed_visible%22%7D">The combobox 'aria-expanded' attribute is false, but the combobox popup is visible</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_activedescendant_valid</strong>: The 'aria-activedescendant' property must reference the 'id' of a non-empty, non-hidden active child element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_activedescendant_valid.html#%7B%22message%22%3A%22The%20'aria-activedescendant'%20property%20is%20empty%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The 'aria-activedescendant' property is empty</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_activedescendant_valid.html#%7B%22message%22%3A%22The%20'aria-activedescendant'%20property%20references%20a%20hidden%20node%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The 'aria-activedescendant' property references a hidden node</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_activedescendant_valid.html#%7B%22message%22%3A%22Element%20is%20not%20a%20combobox%2C%20and%20the%20referenced%20active-descendant%20element%20is%20not%20a%20valid%20descendant%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Element is not a combobox, and the referenced active-descendant element is not a valid descendant</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>combobox_active_descendant</strong>: 'aria-activedescendant' must be used to define focus within the combobox popup, except when using a dialog popup + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_active_descendant.html#%7B%22message%22%3A%22The%20element%20referenced%20by%20'aria-activedescendant'%20%5C%22%7B0%7D%5C%22%20does%20not%20exist%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_missing%22%7D">The element referenced by 'aria-activedescendant' "{0}" does not exist</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_active_descendant.html#%7B%22message%22%3A%22The%20'aria-activedescendant'%20%5C%22%7B0%7D%5C%22%20references%20an%20element%20with%20the%20roles%20%5C%22%7B1%7D%5C%22%2C%20which%20does%20not%20have%20a%20valid%20ARIA%20role%20of%20'option'%2C%20'gridcell'%2C%20'row'%2C%20or%20'treeitem'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_active_role_invalid%22%7D">The 'aria-activedescendant' "{0}" references an element with the roles "{1}", which does not have a valid ARIA role of 'option', 'gridcell', 'row', or 'treeitem'</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_active_descendant.html#%7B%22message%22%3A%22The%20'aria-activedescendant'%20%5C%22%7B0%7D%5C%22%20references%20an%20element%20that%20does%20not%20have%20'aria-selected'%20set%20to%20true%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_active_not_selected%22%7D">The 'aria-activedescendant' "{0}" references an element that does not have 'aria-selected' set to true</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_haspopup_conflict</strong>: &lt;input&gt; element with a 'list' attribute should not use an explicit 'aria-haspopup' attribute + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_haspopup_conflict.html#%7B%22message%22%3A%22The%20%3Cinput%3E%20element%20with%20type%20%5C%22%7B0%7D%5C%22%20and%20'list'%20attribute%20uses%20an%20explicit%20'aria-haspopup'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_type_misuse%22%7D">The &lt;input&gt; element with type "{0}" and 'list' attribute uses an explicit 'aria-haspopup' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_haspopup_conflict.html#%7B%22message%22%3A%22The%20%3Cinput%3E%20element%20with%20a%20missing%20or%20invalid%20type%20and%20'list'%20attribute%20uses%20an%20explicit%20'aria-haspopup'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_misuse%22%7D">The &lt;input&gt; element with a missing or invalid type and 'list' attribute uses an explicit 'aria-haspopup' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_haspopup_conflict.html#%7B%22message%22%3A%22The%20list%20attribute%20for%20the%20%3Cinput%3E%20element%20is%20invalid%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_list_notexist%22%7D">The list attribute for the &lt;input&gt; element is invalid</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_haspopup_conflict.html#%7B%22message%22%3A%22The%20list%20attribute%20for%20the%20%3Cinput%3E%20element%20with%20the%20type%20%5C%22%7B0%7D%5C%22%20is%20invalid%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid_list_type%22%7D">The list attribute for the &lt;input&gt; element with the type "{0}" is invalid</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_haspopup_conflict.html#%7B%22message%22%3A%22The%20list%20attribute%20for%20the%20%3Cinput%3E%20element%20does%20not%20reference%20a%20datalist%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid_list_elem%22%7D">The list attribute for the &lt;input&gt; element does not reference a datalist element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_role_valid</strong>: ARIA roles must be valid for the element to which they are assigned + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_role_valid.html#%7B%22message%22%3A%22The%20ARIA%20role%20'%7B0%7D'%20is%20not%20valid%20for%20the%20element%20%3C%7B1%7D%3E%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The ARIA role '{0}' is not valid for the element &lt;{1}&gt;</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_role_valid.html#%7B%22message%22%3A%22The%20ARIA%20role%20'%7B0%7D'%20is%20not%20valid%20for%20the%20element%20%3C%7B1%7D%3E%20and%20may%20be%20ignored%20by%20the%20browser%20since%20the%20element%20is%20focusable%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The ARIA role '{0}' is not valid for the element &lt;{1}&gt; and may be ignored by the browser since the element is focusable</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>combobox_autocomplete_valid</strong>: A combobox that supports autocompletion behavior must have the 'aria-autocomplete' attribute only on its text input element with a valid value; a value of '"inline"' is not supported + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_autocomplete_valid.html#%7B%22message%22%3A%22The%20combobox%20has%20the%20'aria-autocomplete'%20attribute%20incorrectly%20set%20on%20an%20element%20within%20the%20popup%20referenced%20by%20%5C%22%7B0%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The combobox has the 'aria-autocomplete' attribute incorrectly set on an element within the popup referenced by "{0}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_autocomplete_valid.html#%7B%22message%22%3A%22The%20combobox%20does%20not%20support%20an%20'aria-autocomplete'%20attribute%20value%20set%20to%20'%5C%22inline%5C%22'%20%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_inline%22%7D">The combobox does not support an 'aria-autocomplete' attribute value set to '"inline"' </a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>combobox_focusable_elements</strong>: Tabbable focus for the combobox must be allowed only on the text input, except when using a dialog popup + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_focusable_elements.html#%7B%22message%22%3A%22The%20combobox%20element%20does%20not%20allow%20DOM%20focus%20as%20required%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_not_tabbable%22%7D">The combobox element does not allow DOM focus as required</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_focusable_elements.html#%7B%22message%22%3A%22The%20popup%20of%20the%20combobox%20has%20DOM%20focus%20or%20has%20'aria-activedescendant'%20defined%2C%20which%20is%20not%20allowed%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_tabbable_child%22%7D">The popup of the combobox has DOM focus or has 'aria-activedescendant' defined, which is not allowed</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>combobox_haspopup_valid</strong>: The combobox attribute 'aria-haspopup' value must be appropriate for the role of the element referenced by 'aria-controls' (ARIA 1.2) or 'aria-owns' (ARIA 1.0) + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_haspopup_valid.html#%7B%22message%22%3A%22The%20'role'%20value%20%5C%22%7B0%7D%5C%22%20of%20the%20popup%20element%20%5C%22%7B1%7D%5C%22%20should%20be%20one%20of%20%5C%22listbox%5C%22%2C%20%5C%22grid%5C%22%2C%20%5C%22tree%5C%22%20or%20%5C%22dialog%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_popup_role_invalid%22%7D">The 'role' value "{0}" of the popup element "{1}" should be one of "listbox", "grid", "tree" or "dialog"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_haspopup_valid.html#%7B%22message%22%3A%22The%20value%20of%20the%20combobox%20'aria-haspopup'%20attribute%20%5C%22%7B0%7D%5C%22%20does%20not%20match%20the%20'role'%20value%20of%20the%20popup%20element%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_combobox_popup_role_mismatch%22%7D">The value of the combobox 'aria-haspopup' attribute "{0}" does not match the 'role' value of the popup element "{1}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>element_tabbable_role_valid</strong>: A tabbable element must have a valid widget role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_tabbable_role_valid.html#%7B%22message%22%3A%22The%20tabbable%20element's%20role%20'%7B0%7D'%20is%20not%20a%20widget%20role%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid_role%22%7D">The tabbable element's role '{0}' is not a widget role</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_tabbable_role_valid.html#%7B%22message%22%3A%22The%20tabbable%20element%20does%20not%20have%20a%20valid%20widget%20role%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_valid_role%22%7D">The tabbable element does not have a valid widget role</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_label_exists</strong>: Each form control must have an associated label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_exists.html#%7B%22message%22%3A%22Form%20control%20element%20%3C%7B0%7D%3E%20has%20no%20associated%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Form control element &lt;{0}&gt; has no associated label</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_exists.html#%7B%22message%22%3A%22Form%20control%20with%20%5C%22%7B0%7D%5C%22%20role%20has%20no%20associated%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Form control with "{0}" role has no associated label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_descendant_valid</strong>: Browsers ignore the explicit and implicit ARIA roles of the descendants of certain elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_descendant_valid.html#%7B%22message%22%3A%22The%20element%20with%20role%20%5C%22%7B0%7D%5C%22%20contains%20descendants%20with%20implicit%20roles%20%5C%22%7B1%7D%5C%22%20which%20are%20ignored%20by%20browsers%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_child_implicit_role%22%7D">The element with role "{0}" contains descendants with implicit roles "{1}" which are ignored by browsers</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_descendant_valid.html#%7B%22message%22%3A%22The%20element%20with%20role%20%5C%22%7B0%7D%5C%22%20contains%20descendants%20with%20roles%20%5C%22%7B1%7D%5C%22%20which%20are%20ignored%20by%20browsers%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_child_explicit_role%22%7D">The element with role "{0}" contains descendants with roles "{1}" which are ignored by browsers</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_role_allowed</strong>: Elements must have a valid 'role' per ARIA specification + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_role_allowed.html#%7B%22message%22%3A%22The%20role%20'%7B0%7D'%20defined%20on%20the%20element%20is%20not%20valid%20per%20ARIA%20specification%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The role '{0}' defined on the element is not valid per ARIA specification</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_role_allowed.html#%7B%22message%22%3A%22Some%20of%20the%20roles%2C%20'%7B0%7D'%2C%20defined%20on%20the%20element%20are%20not%20valid%20per%20ARIA%20specification%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Some of the roles, '{0}', defined on the element are not valid per ARIA specification</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>a_text_purpose</strong>: Hyperlinks must have an accessible name for their purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/a_text_purpose.html#%7B%22message%22%3A%22Hyperlink%20has%20no%20link%20text%2C%20label%20or%20image%20with%20a%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_acc_name%22%7D">Hyperlink has no link text, label or image with a text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_allowed</strong>: ARIA attributes must be valid for the element's role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_allowed.html#%7B%22message%22%3A%22The%20attribute(s)%20'%7B0%7D'%20referenced%20by%20the%20element%20%3C%7B1%7D%3E%20is%20not%20a%20valid%20ARIA%20state%20or%20property%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The attribute(s) '{0}' referenced by the element &lt;{1}&gt; is not a valid ARIA state or property</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_conflict</strong>: An ARIA attribute must not conflict with the corresponding HTML attribute + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_conflict.html#%7B%22message%22%3A%22The%20ARIA%20attribute%20%5C%22%7B0%7D%5C%22%20is%20in%20conflict%20with%20the%20corresponding%20HTML%20attribute%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_conflict%22%7D">The ARIA attribute "{0}" is in conflict with the corresponding HTML attribute "{1}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_exists</strong>: When specifying a required ARIA attribute, the value must not be empty + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_exists.html#%7B%22message%22%3A%22The%20element%20attribute(s)%3A%20'%7B0%7D'%20value%20is%20empty%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_empty_attribute%22%7D">The element attribute(s): '{0}' value is empty</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_required</strong>: The required attributes for the element with a role must be defined + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_required.html#%7B%22message%22%3A%22Element%20with%20'%7B0%7D'%20role%20does%20not%20have%20the%20required%20ARIA%20attribute(s)%3A%20'%7B1%7D'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_missing%22%7D">Element with '{0}' role does not have the required ARIA attribute(s): '{1}'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_value_valid</strong>: ARIA property values must be valid + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_value_valid.html#%7B%22message%22%3A%22The%20value%20%5C%22%7B0%7D%5C%22%20specified%20for%20attribute%20'%7B1%7D'%20on%20element%20%3C%7B2%7D%3E%20is%20not%20valid%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The value "{0}" specified for attribute '{1}' on element &lt;{2}&gt; is not valid</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_eventhandler_role_valid</strong>: Elements with event handlers must have a valid ARIA role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_eventhandler_role_valid.html#%7B%22message%22%3A%22The%20%3C%7B0%7D%3E%20element%20with%20'%7B1%7D'%20does%20not%20have%20a%20valid%20ARIA%20role%20specified%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;{0}&gt; element with '{1}' does not have a valid ARIA role specified</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_hidden_nontabbable</strong>: A hidden element should not contain any tabbable elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_hidden_nontabbable.html#%7B%22message%22%3A%22Element%20%5C%22%7B0%7D%5C%22%20should%20not%20be%20focusable%20within%20the%20subtree%20of%20an%20element%20with%20an%20'aria-hidden'%20attribute%20with%20value%20'true'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element "{0}" should not be focusable within the subtree of an element with an 'aria-hidden' attribute with value 'true'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_id_unique</strong>: The ARIA property must reference a non-empty unique id of an existing element that is visible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_id_unique.html#%7B%22message%22%3A%22The%20'id'%20%5C%22%7B0%7D%5C%22%20specified%20for%20the%20ARIA%20property%20'%7B1%7D'%20value%20is%20not%20valid%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The 'id' "{0}" specified for the ARIA property '{1}' value is not valid</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_widget_labelled</strong>: Interactive component must have a programmatically associated name + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_widget_labelled.html#%7B%22message%22%3A%22Interactive%20component%20with%20ARIA%20role%20'%7B0%7D'%20does%20not%20have%20a%20programmatically%20associated%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Interactive component with ARIA role '{0}' does not have a programmatically associated name</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>combobox_design_valid</strong>: The combobox design pattern must be valid for ARIA 1.2 + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_design_valid.html#%7B%22message%22%3A%22The%20combobox%20design%20pattern%20is%20detected%20as%20ARIA%201.1%2C%20which%20is%20not%20allowed%20by%20ARIA%201.2%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1.1%22%7D">The combobox design pattern is detected as ARIA 1.1, which is not allowed by ARIA 1.2</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>frame_title_exists</strong>: Inline frames must have a unique, non-empty 'title' attribute + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/frame_title_exists.html#%7B%22message%22%3A%22Inline%20frame%20does%20not%20have%20a%20'title'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Inline frame does not have a 'title' attribute</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>label_content_exists</strong>: A &lt;label&gt; element must have non-empty descriptive text that identifies the purpose of the interactive component + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/label_content_exists.html#%7B%22message%22%3A%22The%20%3Clabel%3E%20element%20does%20not%20have%20descriptive%20text%20that%20identifies%20the%20expected%20input%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;label&gt; element does not have descriptive text that identifies the expected input</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>list_children_valid</strong>: List component with "group" role must limit children to &lt;listitem&gt; elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/list_children_valid.html#%7B%22message%22%3A%22List%20component%20with%20%5C%22group%5C%22%20role%20has%20children%20that%20are%20not%20%3Clistitem%3E%20elements%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">List component with "group" role has children that are not &lt;listitem&gt; elements</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_aria_descendants</strong>: Table structure elements cannot specify an explicit 'role' within table containers + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_aria_descendants.html#%7B%22message%22%3A%22An%20explicit%20ARIA%20'role'%20is%20not%20valid%20for%20%3C%7B0%7D%3E%20element%20within%20an%20ARIA%20role%20'%7B1%7D'%20per%20the%20ARIA%20in%20HTML%20specification%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22explicit_role%22%7D">An explicit ARIA 'role' is not valid for &lt;{0}&gt; element within an ARIA role '{1}' per the ARIA in HTML specification</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_accessiblename_exists</strong>: Elements with certain roles should have accessible names + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_accessiblename_exists.html#%7B%22message%22%3A%22Element%20%3C%7B0%7D%3E%20with%20%5C%22%7B1%7D%5C%22%20role%20has%20no%20accessible%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_accessible_name%22%7D">Element &lt;{0}&gt; with "{1}" role has no accessible name</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_redundant</strong>: An ARIA attribute should not be redundant with a corresponding HTML attribute + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_redundant.html#%7B%22message%22%3A%22The%20ARIA%20attribute%20%5C%22%7B0%7D%5C%22%20is%20redundant%20with%20the%20HTML%20attribute%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_redundant%22%7D">The ARIA attribute "{0}" is redundant with the HTML attribute "{1}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>canvas_content_described</strong>: The &lt;canvas&gt; element may not be accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/canvas_content_described.html#%7B%22message%22%3A%22Verify%20accessibility%20of%20the%20%3Ccanvas%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify accessibility of the &lt;canvas&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>4.1.3 Status Messages [AA]</h2> + <div>In content implemented using markup languages, status messages can be programmatically determined through role or properties such that they can be presented to the user by assistive technologies without receiving focus.</div> + +</div><div> + <h2>HTML specification [NA]</h2> + <div>The HTML specification issues that cause accessibility issues may be covered by other rules and will be reported under those accessibility requirements. However, some non-conforming HTML specification issues are still reported.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>element_accesskey_unique</strong>: 'accesskey' attribute values on each element must be unique for the page + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_accesskey_unique.html#%7B%22message%22%3A%22'accesskey'%20attribute%20value%20on%20the%20element%20is%20not%20unique%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">'accesskey' attribute value on the element is not unique</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>element_id_unique</strong>: Element 'id' attribute values must be unique within a document + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_id_unique.html#%7B%22message%22%3A%22The%20%3C%7B0%7D%3E%20element%20has%20the%20id%20%5C%22%7B1%7D%5C%22%20that%20is%20empty%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_empty%22%7D">The &lt;{0}&gt; element has the id "{1}" that is empty</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_id_unique.html#%7B%22message%22%3A%22The%20%3C%7B0%7D%3E%20element%20has%20the%20id%20%5C%22%7B1%7D%5C%22%20that%20is%20already%20in%20use%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_in_use%22%7D">The &lt;{0}&gt; element has the id "{1}" that is already in use</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>element_attribute_deprecated</strong>: Avoid use of obsolete features if possible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_attribute_deprecated.html#%7B%22message%22%3A%22The%20%3C%7B0%7D%3E%20element%20is%20deprecated%20in%20HTML%205%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_elem%22%7D">The &lt;{0}&gt; element is deprecated in HTML 5</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_attribute_deprecated.html#%7B%22message%22%3A%22The%20HTML%20attribute(s)%20%5C%22%7B0%7D%5C%22%20is%20deprecated%20in%20HTML%205%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_attr%22%7D">The HTML attribute(s) "{0}" is deprecated in HTML 5</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_attribute_deprecated.html#%7B%22message%22%3A%22The%20HTML%20attribute(s)%20%5C%22%7B0%7D%5C%22%20is%20deprecated%20for%20the%20%3C%7B1%7D%3E%20element%20in%20HTML%205%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_elem_attr%22%7D">The HTML attribute(s) "{0}" is deprecated for the &lt;{1}&gt; element in HTML 5</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>ARIA specification [NA]</h2> + <div>The ARIA specification issues that cause accessibility issues may be covered by other rules and will be reported under those accessibility requirements. However, some non-conforming ARIA specification issues are still reported.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>aria_attribute_valid</strong>: ARIA attributes should be valid for the element and ARIA role to which they are assigned + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_valid.html#%7B%22message%22%3A%22The%20ARIA%20attributes%20%5C%22%7B0%7D%5C%22%20are%20not%20valid%20for%20the%20element%20%3C%7B1%7D%3E%20with%20ARIA%20role%20%5C%22%7B2%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_invalid_role_attr%22%7D">The ARIA attributes "{0}" are not valid for the element &lt;{1}&gt; with ARIA role "{2}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_valid.html#%7B%22message%22%3A%22The%20ARIA%20attributes%20%5C%22%7B0%7D%5C%22%20are%20not%20valid%20for%20the%20element%20%3C%7B1%7D%3E%20with%20implicit%20ARIA%20role%20%5C%22%7B2%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_invalid_implicit_role_attr%22%7D">The ARIA attributes "{0}" are not valid for the element &lt;{1}&gt; with implicit ARIA role "{2}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_null</strong>: When the intent is to mark an image as decorative with an empty 'alt' attribute, the 'aria' or 'title' attributes should not be used + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_null.html#%7B%22message%22%3A%22The%20image%20'alt'%20attribute%20is%20empty%2C%20but%20the%20'aria'%20label%20is%20not%20empty%20and%20overrides%20the%20'alt'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_aria_override%22%7D">The image 'alt' attribute is empty, but the 'aria' label is not empty and overrides the 'alt' attribute</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_deprecated</strong>: No deprecated ARIA role or attribute should be used + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_deprecated.html#%7B%22message%22%3A%22The%20ARIA%20role%20%5C%22%7B0%7D%5C%22%20is%20deprecated%20in%20the%20ARIA%20specification%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_aria_role%22%7D">The ARIA role "{0}" is deprecated in the ARIA specification</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_deprecated.html#%7B%22message%22%3A%22The%20ARIA%20attributes%20%5C%22%7B0%7D%5C%22%20are%20deprecated%20in%20the%20ARIA%20specification%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_aria_attr%22%7D">The ARIA attributes "{0}" are deprecated in the ARIA specification</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_deprecated.html#%7B%22message%22%3A%22The%20ARIA%20attributes%20%5C%22%7B0%7D%5C%22%20are%20deprecated%20for%20the%20role%20%5C%22%7B1%7D%5C%22%20in%20the%20ARIA%20specification%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_role_attr%22%7D">The ARIA attributes "{0}" are deprecated for the role "{1}" in the ARIA specification</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_accessiblename_exists</strong>: Elements with certain roles should have accessible names + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_accessiblename_exists.html#%7B%22message%22%3A%22Element%20%3C%7B0%7D%3E%20with%20%5C%22%7B1%7D%5C%22%20role%20has%20no%20accessible%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_accessible_name_image%22%7D">Element &lt;{0}&gt; with "{1}" role has no accessible name</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_role_redundant</strong>: An explicitly-assigned ARIA role should not be redundant with the implicit role of the element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_role_redundant.html#%7B%22message%22%3A%22The%20explicitly-assigned%20ARIA%20role%20%5C%22%7B0%7D%5C%22%20is%20redundant%20with%20the%20implicit%20role%20of%20the%20element%20%3C%7B1%7D%3E%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_redundant%22%7D">The explicitly-assigned ARIA role "{0}" is redundant with the implicit role of the element &lt;{1}&gt;</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div> + </div><div id="IBM_Accessibility_next" style="padding: 1rem; display:none"> +<div> + <h2>1.1.1 Non-text Content [A]</h2> + <div>All non-text content that is presented to the user has a text alternative that serves the equivalent purpose.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>applet_alt_exists</strong>: &lt;applet&gt; elements must provide an 'alt' attribute and an alternative description + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/applet_alt_exists.html#%7B%22message%22%3A%22An%20%3Capplet%3E%20element%20does%20not%20have%20an%20'alt'%20attribute%20that%20provides%20a%20short%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">An &lt;applet&gt; element does not have an 'alt' attribute that provides a short text alternative</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/applet_alt_exists.html#%7B%22message%22%3A%22The%20'alt'%20attribute%20value%20for%20an%20%3Capplet%3E%20element%20duplicates%20the%20'code'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The 'alt' attribute value for an &lt;applet&gt; element duplicates the 'code' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/applet_alt_exists.html#%7B%22message%22%3A%22An%20%3Capplet%3E%20element%20provides%20alternative%20text%2C%20but%20does%20not%20provide%20inner%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">An &lt;applet&gt; element provides alternative text, but does not provide inner content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_redundant</strong>: The text alternative for an image within a link should not repeat the link text or adjacent link text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Link%20text%20is%20repeated%20in%20an%20image%20'alt'%20value%20within%20the%20same%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Link text is repeated in an image 'alt' value within the same link</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Link%20text%20of%20previous%20link%20is%20repeated%20in%20image%20'alt'%20value%20of%20a%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Link text of previous link is repeated in image 'alt' value of a link</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Image%20'alt'%20value%20within%20a%20link%20is%20repeated%20in%20link%20text%20of%20the%20link%20after%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Image 'alt' value within a link is repeated in link text of the link after</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_valid</strong>: Images must have accessible names unless they are decorative or redundant + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_valid.html#%7B%22message%22%3A%22Image%20'alt'%20attribute%20value%20consists%20only%20of%20blank%20space(s)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_blank_alt%22%7D">Image 'alt' attribute value consists only of blank space(s)</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_valid.html#%7B%22message%22%3A%22The%20image%20has%20neither%20an%20accessible%20name%20nor%20is%20marked%20as%20decorative%20or%20redundant%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_alt%22%7D">The image has neither an accessible name nor is marked as decorative or redundant</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_valid.html#%7B%22message%22%3A%22The%20image%20does%20not%20have%20an%20'alt'%20attribute%20or%20ARIA%20label%2C%20and%20the%20'title'%20attribute%20value%20consists%20only%20of%20blank%20space(s)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_blank_title%22%7D">The image does not have an 'alt' attribute or ARIA label, and the 'title' attribute value consists only of blank space(s)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>area_alt_exists</strong>: &lt;area&gt; elements in an image map must have a text alternative + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/area_alt_exists.html#%7B%22message%22%3A%22%3Carea%3E%20element%20in%20an%20image%20map%20has%20no%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">&lt;area&gt; element in an image map has no text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>imagebutton_alt_exists</strong>: The &lt;input&gt; element of type "image" should have a text alternative + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/imagebutton_alt_exists.html#%7B%22message%22%3A%22The%20%3Cinput%3E%20element%20of%20type%20%5C%22image%5C%22%20has%20no%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail%22%7D">The &lt;input&gt; element of type "image" has no text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>imagemap_alt_exists</strong>: An image map and each &lt;area&gt; element in an image map must have text alternative(s) + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/imagemap_alt_exists.html#%7B%22message%22%3A%22Image%20map%20or%20child%20%3Carea%3E%20has%20no%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Image map or child &lt;area&gt; has no text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_decorative</strong>: Image designated as decorative must have 'alt="" + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_decorative.html#%7B%22message%22%3A%22Image%20designated%20as%20decorative%20has%20non-null%20'alt'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Image designated as decorative has non-null 'alt' attribute</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_null</strong>: When the intent is to mark an image as decorative with an empty 'alt' attribute, the 'aria' or 'title' attributes should not be used + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_null.html#%7B%22message%22%3A%22The%20image%20'alt'%20attribute%20is%20empty%2C%20but%20the%20'title'%20attribute%20is%20not%20empty%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_decorative%22%7D">The image 'alt' attribute is empty, but the 'title' attribute is not empty</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>object_text_exists</strong>: &lt;object&gt; element must have a text alternative for the content rendered by the object + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/object_text_exists.html#%7B%22message%22%3A%22An%20%3Cobject%3E%20element%20does%20not%20have%20a%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_text_alternative%22%7D">An &lt;object&gt; element does not have a text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>application_content_accessible</strong>: Non-decorative static text and image content within an element with "application" role must be accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/application_content_accessible.html#%7B%22message%22%3A%22Verify%20that%20the%20non-decorative%20static%20text%20and%20image%20content%20within%20an%20element%20with%20%5C%22application%5C%22%20role%20are%20accessible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the non-decorative static text and image content within an element with "application" role are accessible</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_misuse</strong>: 'alt' attribute value must be a good inline replacement for the image + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_misuse.html#%7B%22message%22%3A%22Verify%20that%20the%20file%20name%20serves%20as%20a%20good%20inline%20replacement%20for%20the%20image%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the file name serves as a good inline replacement for the image</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_ismap_misuse</strong>: Server-side image map hot-spots must have duplicate text links + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_ismap_misuse.html#%7B%22message%22%3A%22Server-side%20image%20map%20hot-spots%20do%20not%20have%20duplicate%20text%20links%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Server-side image map hot-spots do not have duplicate text links</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_longdesc_misuse</strong>: The 'longdesc' attribute must reference HTML content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_longdesc_misuse.html#%7B%22message%22%3A%22Verify%20that%20the%20file%20designated%20by%20the%20'longdesc'%20attribute%20contains%20valid%20HTML%20content%20(file%20extension%20not%20recognized)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the file designated by the 'longdesc' attribute contains valid HTML content (file extension not recognized)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>media_alt_exists</strong>: Audio or video on the page must have a short text alternative that describes the media content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_alt_exists.html#%7B%22message%22%3A%22Filename%20used%20as%20label%20for%20embedded%20audio%20or%20video%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Filename used as label for embedded audio or video</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>style_background_decorative</strong>: Images included by using CSS alone must not convey important information + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_background_decorative.html#%7B%22message%22%3A%22Verify%20the%20CSS%20background%20image%20does%20not%20convey%20important%20information%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify the CSS background image does not convey important information</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>style_highcontrast_visible</strong>: Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_highcontrast_visible.html#%7B%22message%22%3A%22Confirm%20Windows%20high%20contrast%20mode%20is%20supported%20when%20using%20CSS%20to%20include%2C%20position%20or%20alter%20non-decorative%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Confirm Windows high contrast mode is supported when using CSS to include, position or alter non-decorative content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>figure_label_exists</strong>: A &lt;figure&gt; element must have an associated label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/figure_label_exists.html#%7B%22message%22%3A%22The%20%3Cfigure%3E%20element%20does%20not%20have%20an%20associated%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;figure&gt; element does not have an associated label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>embed_alt_exists</strong>: Provide alternative content for &lt;embed&gt; elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/embed_alt_exists.html#%7B%22message%22%3A%22Verify%20that%20the%20%3Cembed%3E%20element%20has%20alternative%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the &lt;embed&gt; element has alternative content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>media_alt_brief</strong>: Alternative text in 'alt' attribute should be brief (&lt;150 characters) + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_alt_brief.html#%7B%22message%22%3A%22Text%20alternative%20is%20more%20than%20150%20characters%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Text alternative is more than 150 characters</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>noembed_content_exists</strong>: &lt;noembed&gt; elements should contain descriptive text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/noembed_content_exists.html#%7B%22message%22%3A%22Add%20descriptive%20text%20to%20the%20%3Cnoembed%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Add descriptive text to the &lt;noembed&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>canvas_content_described</strong>: The &lt;canvas&gt; element may not be accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/canvas_content_described.html#%7B%22message%22%3A%22Verify%20accessibility%20of%20the%20%3Ccanvas%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify accessibility of the &lt;canvas&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_background</strong>: Background images that convey important information must have a text alternative that describes the image + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_background.html#%7B%22message%22%3A%22Verify%20important%20background%20image%20information%20has%20a%20text%20alternative%20in%20system%20high%20contrast%20mode%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify important background image information has a text alternative in system high contrast mode</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.2.1 Audio-only and Video-only (Prerecorded) [A]</h2> + <div>For prerecorded audio-only or video-only media, an alternative provides equivalent information.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>media_audio_transcribed</strong>: Audio information should also be available in text form + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_audio_transcribed.html#%7B%22message%22%3A%22Provide%20transcripts%20for%20audio%20files%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Provide transcripts for audio files</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.2.2 Captions (Prerecorded) [A]</h2> + <div>Captions are provided for all prerecorded audio content in synchronized media.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>caption_track_exists</strong>: A &lt;video&gt; element must have a text alternative for any meaningful audio content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/caption_track_exists.html#%7B%22message%22%3A%22Verify%20that%20captions%20are%20available%20for%20any%20meaningful%20audio%20or%20provide%20a%20caption%20track%20for%20the%20%3Cvideo%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that captions are available for any meaningful audio or provide a caption track for the &lt;video&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.2.3 Audio Description or Media Alternative (Prerecorded) [A]</h2> + <div>An alternative for time-based media or audio description of the prerecorded video content is provided for synchronized media.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>media_track_available</strong>: Pre-recorded media should have an audio track that describes visual information + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_track_available.html#%7B%22message%22%3A%22Verify%20availability%20of%20a%20user-selectable%20audio%20track%20with%20description%20of%20visual%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify availability of a user-selectable audio track with description of visual content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.2.4 Captions (Live) [AA]</h2> + <div>Captions are provided for all live audio content in synchronized media.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>media_live_captioned</strong>: Live media (streaming video with audio) should have captions for audio content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_live_captioned.html#%7B%22message%22%3A%22Verify%20captions%20are%20provided%20for%20live%20media%20(streaming%20video%20with%20audio)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify captions are provided for live media (streaming video with audio)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.2.5 Audio Description (Prerecorded) [AA]</h2> + <div>Audio description is provided for all prerecorded video content in synchronized media.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>media_track_available</strong>: Pre-recorded media should have an audio track that describes visual information + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_track_available.html#%7B%22message%22%3A%22Verify%20availability%20of%20a%20user-selectable%20audio%20track%20with%20description%20of%20visual%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify availability of a user-selectable audio track with description of visual content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.3.1 Info and Relationships [A]</h2> + <div>Information, structure, and relationships conveyed through presentation can be programmatically determined or are available in text.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>input_checkboxes_grouped</strong>: Related sets of radio buttons or checkboxes should be programmatically grouped + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22%7B0%7D%20input%20found%20that%20has%20the%20same%20name%2C%20%5C%22%7B2%7D%5C%22%20as%20a%20%7B1%7D%20input%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_controlnamemismatch%22%7D">{0} input found that has the same name, "{2}" as a {1} input</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22%7B0%7D%20input%20is%20not%20in%20the%20group%20with%20another%20%7B0%7D%20with%20the%20name%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_notgroupedothergrouped%22%7D">{0} input is not in the group with another {0} with the name "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22%7B0%7D%20input%20and%20others%20with%20the%20name%20%5C%22%7B1%7D%5C%22%20are%20not%20grouped%20together%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_notgroupedothernotgrouped%22%7D">{0} input and others with the name "{1}" are not grouped together</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22%7B0%7D%20input%20is%20in%20a%20different%20group%20than%20another%20%7B0%7D%20with%20the%20name%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_notsamegroup%22%7D">{0} input is in a different group than another {0} with the name "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22Verify%20that%20this%20ungrouped%20checkbox%20input%20is%20not%20related%20to%20other%20checkboxes%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_lonecheckbox%22%7D">Verify that this ungrouped checkbox input is not related to other checkboxes</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22Verify%20that%20this%20un-named%2C%20ungrouped%20checkbox%20input%20is%20not%20related%20to%20other%20checkboxes%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_unnamedcheckbox%22%7D">Verify that this un-named, ungrouped checkbox input is not related to other checkboxes</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_headers_ref_valid</strong>: The 'headers' attribute should refer to a valid cell in the same table + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_ref_valid.html#%7B%22message%22%3A%22The%20'headers'%20attribute%20value%20%5C%22%7B0%7D%5C%22%20does%20not%20reference%20a%20valid%20'id'%20in%20this%20document%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The 'headers' attribute value "{0}" does not reference a valid 'id' in this document</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_ref_valid.html#%7B%22message%22%3A%22The%20'headers'%20attribute%20value%20%5C%22%7B0%7D%5C%22%20refers%20to%20itself%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The 'headers' attribute value "{0}" refers to itself</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_ref_valid.html#%7B%22message%22%3A%22The%20'headers'%20attribute%20value%20%5C%22%7B0%7D%5C%22%20does%20not%20refer%20to%20a%20cell%20in%20the%20same%20table%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">The 'headers' attribute value "{0}" does not refer to a cell in the same table</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_ref_valid.html#%7B%22message%22%3A%22The%20'headers'%20attribute%20value%20%5C%22%7B0%7D%5C%22%20does%20not%20refer%20to%20a%20cell%20indicated%20with%20%3Cth%3E%20or%20a%20role%20of%20%5C%22columnheader%5C%22%20or%20%5C%22rowheader%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_4%22%7D">The 'headers' attribute value "{0}" does not refer to a cell indicated with &lt;th&gt; or a role of "columnheader" or "rowheader"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>fieldset_label_valid</strong>: Groups with nested inputs must have unique accessible name + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_label_valid.html#%7B%22message%22%3A%22Group%2FFieldset%20does%20not%20have%20an%20accessible%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Group/Fieldset does not have an accessible name</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_label_valid.html#%7B%22message%22%3A%22Group%2FFieldset%20%5C%22%7B0%7D%5C%22%20has%20a%20duplicate%20name%20to%20another%20group%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Group/Fieldset "{0}" has a duplicate name to another group</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_scope_valid</strong>: Value for 'scope' attribute must be "row", "col", "rowgroup", or "colgroup" + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_scope_valid.html#%7B%22message%22%3A%22Value%20provided%20is%20invalid%20for%20the%20'scope'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Value provided is invalid for the 'scope' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_scope_valid.html#%7B%22message%22%3A%22The%20'scope'%20attribute%20should%20only%20be%20used%20on%20a%20%3Cth%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The 'scope' attribute should only be used on a &lt;th&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_banner_label_unique</strong>: Each element with "banner" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_banner_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22banner%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "banner" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_banner_single</strong>: A page, document, or application should only have one element with "banner" role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_banner_single.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22banner%5C%22%20role%20found%20on%20the%20page%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "banner" role found on the page</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_complementary_label_unique</strong>: Each element with "complementary" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_complementary_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22complementary%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "complementary" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_complementary_labelled</strong>: Each element with "complementary" role must have a label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_complementary_labelled.html#%7B%22message%22%3A%22Element%20with%20%5C%22complementary%5C%22%20role%20does%20not%20have%20a%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "complementary" role does not have a label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_content_in_landmark</strong>: All content must reside within an element with a landmark role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_content_in_landmark.html#%7B%22message%22%3A%22Content%20is%20not%20within%20a%20landmark%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Content is not within a landmark element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_contentinfo_label_unique</strong>: Each element with "contentinfo" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_contentinfo_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22contentinfo%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "contentinfo" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_contentinfo_single</strong>: A page, document, or application should only have one element with "contentinfo" role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_contentinfo_single.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22contentinfo%5C%22%20role%20found%20on%20the%20page%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "contentinfo" role found on the page</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_form_label_unique</strong>: Each element with "form" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_form_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22form%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "form" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_hidden_nontabbable</strong>: A hidden element should not contain any tabbable elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_hidden_nontabbable.html#%7B%22message%22%3A%22Element%20%5C%22%7B0%7D%5C%22%20should%20not%20be%20focusable%20within%20the%20subtree%20of%20an%20element%20with%20an%20'aria-hidden'%20attribute%20with%20value%20'true'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element "{0}" should not be focusable within the subtree of an element with an 'aria-hidden' attribute with value 'true'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_landmark_name_unique</strong>: Each landmark should have a unique 'aria-labelledby' or 'aria-label' or be nested in a different parent region + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_landmark_name_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22%7B0%7D%5C%22%20landmarks%20within%20the%20same%20parent%20region%20are%20not%20distinguished%20from%20one%20another%20because%20they%20have%20the%20same%20%5C%22%7B1%7D%5C%22%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "{0}" landmarks within the same parent region are not distinguished from one another because they have the same "{1}" label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_main_label_unique</strong>: Each element with "main" role must have unique label that describes its purposes + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_main_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22main%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "main" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_navigation_label_unique</strong>: Each element with "navigation" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_navigation_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22navigation%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "navigation" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_parent_required</strong>: Each element with an implicit or explicit role must be contained within a valid element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_parent_required.html#%7B%22message%22%3A%22Element%20with%20%5C%22%7B0%7D%5C%22%20role%20is%20not%20contained%20in%20or%20owned%20by%20an%20element%20with%20one%20of%20the%20following%20roles%3A%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "{0}" role is not contained in or owned by an element with one of the following roles: "{1}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_region_label_unique</strong>: Each element with "region" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_region_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22region%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "region" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_region_labelled</strong>: Each element with "region" role must have a label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_region_labelled.html#%7B%22message%22%3A%22Element%20with%20%5C%22region%5C%22%20role%20does%20not%20have%20a%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "region" role does not have a label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>form_label_unique</strong>: Form controls should have exactly one label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/form_label_unique.html#%7B%22message%22%3A%22Form%20control%20has%20more%20than%20one%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Form control has more than one label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>label_ref_valid</strong>: The 'for' attribute for a label should reference a non-empty, unique 'id' attribute of a valid element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/label_ref_valid.html#%7B%22message%22%3A%22The%20value%20%5C%22%7B0%7D%5C%22%20of%20the%20'for'%20attribute%20is%20not%20the%20'id'%20of%20a%20valid%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid%22%7D">The value "{0}" of the 'for' attribute is not the 'id' of a valid element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_caption_empty</strong>: A &lt;caption&gt; element for a &lt;table> element must contain descriptive text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_caption_empty.html#%7B%22message%22%3A%22The%20%3Ctable%3E%20element%20has%20an%20empty%20%3Ccaption%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;table&gt; element has an empty &lt;caption> element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_caption_nested</strong>: The &lt;caption&gt; element must be nested inside the associated &lt;table> element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_caption_nested.html#%7B%22message%22%3A%22%3Ccaption%3E%20element%20is%20not%20nested%20inside%20a%20%3Ctable%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">&lt;caption&gt; element is not nested inside a &lt;table> element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_headers_exists</strong>: Data table must identify headers + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_exists.html#%7B%22message%22%3A%22Table%20has%20no%20headers%20identified%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Table has no headers identified</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_headers_related</strong>: For a complex data table, all &lt;th&gt; and &lt;td> elements must be related via 'header' or 'scope' attributes + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_related.html#%7B%22message%22%3A%22Complex%20table%20does%20not%20have%20headers%20for%20each%20cell%20properly%20defined%20with%20'header'%20or%20'scope'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Complex table does not have headers for each cell properly defined with 'header' or 'scope'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_structure_misuse</strong>: Table elements with 'role="presentation" or 'role="none" should not have structural elements or attributes + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_structure_misuse.html#%7B%22message%22%3A%22The%20%3C%7B0%7D%3E%20element%20with%20%5C%22presentation%5C%22%20role%20or%20%5C%22none%5C%22%20role%20has%20structural%20element(s)%20and%2For%20attribute(s)%20'%7B1%7D'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;{0}&gt; element with "presentation" role or "none" role has structural element(s) and/or attribute(s) '{1}'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_summary_redundant</strong>: The table summary must not duplicate the caption + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_summary_redundant.html#%7B%22message%22%3A%22The%20table%20summary%20duplicates%20the%20caption%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The table summary duplicates the caption</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>blockquote_cite_exists</strong>: Use &lt;blockquote&gt; only for quotations, not indentation + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/blockquote_cite_exists.html#%7B%22message%22%3A%22Verify%20that%20%3Cblockquote%3E%20should%20have%20a%20'cite'%20attribute%20and%20not%20be%20used%20for%20indentation%20only%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that &lt;blockquote&gt; should have a 'cite' attribute and not be used for indentation only</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>heading_markup_misuse</strong>: Heading elements must not be used for presentation + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/heading_markup_misuse.html#%7B%22message%22%3A%22Verify%20that%20the%20heading%20element%20is%20a%20genuine%20heading%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the heading element is a genuine heading</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>list_markup_review</strong>: Proper HTML elements should be used to create a list + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/list_markup_review.html#%7B%22message%22%3A%22Verify%20this%20is%20a%20list%20and%20if%20so%2C%20modify%20to%20use%20proper%20HTML%20elements%20for%20the%20list%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_list%22%7D">Verify this is a list and if so, modify to use proper HTML elements for the list</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>text_block_heading</strong>: Heading text should use a heading element or role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_block_heading.html#%7B%22message%22%3A%22Confirm%20this%20text%20'%7B0%7D'%20is%20used%20as%20a%20heading%20and%20if%20so%2C%20modify%20to%20use%20a%20heading%20element%20or%20role%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_heading%22%7D">Confirm this text '{0}' is used as a heading and if so, modify to use a heading element or role</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>text_quoted_correctly</strong>: Quotations should be marked with &lt;q&gt; or &lt;blockquote> elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_quoted_correctly.html#%7B%22message%22%3A%22If%20the%20following%20text%20is%20a%20quotation%2C%20mark%20it%20as%20a%20%3Cq%3E%20or%20%3Cblockquote%3E%20element%3A%20%7B0%7D%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">If the following text is a quotation, mark it as a &lt;q&gt; or &lt;blockquote> element: {0}</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>fieldset_legend_valid</strong>: &lt;fieldset&gt; elements should have a single, non-empty &lt;legend> as a label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_legend_valid.html#%7B%22message%22%3A%22%3Cfieldset%3E%20element%20does%20not%20have%20a%20%3Clegend%3E%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">&lt;fieldset&gt; element does not have a &lt;legend></a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_legend_valid.html#%7B%22message%22%3A%22%3Cfieldset%3E%20element%20has%20more%20than%20one%20%3Clegend%3E%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">&lt;fieldset&gt; element has more than one &lt;legend></a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_legend_valid.html#%7B%22message%22%3A%22%3Cfieldset%3E%20element%20%3Clegend%3E%20is%20empty%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">&lt;fieldset&gt; element &lt;legend> is empty</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_child_valid</strong>: An element with an ARIA role must own a required child + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_child_valid.html#%7B%22message%22%3A%22The%20element%20with%20role%20%5C%22%7B0%7D%5C%22%20does%20not%20own%20any%20child%20element%20with%20any%20of%20the%20following%20role(s)%3A%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_no_child%22%7D">The element with role "{0}" does not own any child element with any of the following role(s): "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_child_valid.html#%7B%22message%22%3A%22The%20element%20with%20role%20%5C%22%7B0%7D%5C%22%20owns%20the%20child%20element%20with%20the%20role%20%5C%22%7B1%7D%5C%22%20that%20is%20not%20one%20of%20the%20allowed%20role(s)%3A%20%5C%22%7B2%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_invalid_child%22%7D">The element with role "{0}" owns the child element with the role "{1}" that is not one of the allowed role(s): "{2}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_complementary_label_visible</strong>: Each element with "complementary" role should have a visible label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_complementary_label_visible.html#%7B%22message%22%3A%22Element%20with%20%5C%22complementary%5C%22%20role%20does%20not%20have%20a%20visible%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "complementary" role does not have a visible label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_contentinfo_misuse</strong>: Each element with "contentinfo" role is only permitted with an element with "main" role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_contentinfo_misuse.html#%7B%22message%22%3A%22Element%20with%20%5C%22contentinfo%5C%22%20role%20is%20present%20without%20an%20element%20with%20%5C%22main%5C%22%20role%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "contentinfo" role is present without an element with "main" role</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_main_label_visible</strong>: Each element with "main" role should have a unique visible label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_main_label_visible.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22main%5C%22%20role%20do%20not%20have%20unique%20visible%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "main" role do not have unique visible labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_fields_grouped</strong>: Groups of logically related input elements should be contained within a &lt;fieldset&gt; element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_fields_grouped.html#%7B%22message%22%3A%22Use%20the%20%3Cfieldset%3E%20element%20to%20group%20logically%20related%20input%20elements%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Use the &lt;fieldset&gt; element to group logically related input elements</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>list_structure_proper</strong>: List elements should only be used for lists of related items + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/list_structure_proper.html#%7B%22message%22%3A%22List%20element%20is%20missing%20or%20improperly%20structured%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">List element is missing or improperly structured</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>select_options_grouped</strong>: Groups of related options within a selection list should be grouped with &lt;optgroup&gt; + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/select_options_grouped.html#%7B%22message%22%3A%22Group%20of%20related%20options%20may%20need%20%3Coptgroup%3E%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Group of related options may need &lt;optgroup&gt;</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_layout_linearized</strong>: Avoid using tables to format text documents in columns unless the table can be linearized + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_layout_linearized.html#%7B%22message%22%3A%22Verify%20table%20is%20not%20being%20used%20to%20format%20text%20content%20in%20columns%20unless%20the%20table%20can%20be%20linearized%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify table is not being used to format text content in columns unless the table can be linearized</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.3.2 Meaningful Sequence [A]</h2> + <div>When the sequence in which content is presented affects its meaning, a correct reading sequence can be programmatically determined.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>dir_attribute_valid</strong>: 'dir' attribute value must be "ltr", "rtl", or "auto" + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/dir_attribute_valid.html#%7B%22message%22%3A%22Invalid%20value%20used%20for%20the%20'dir'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Invalid value used for the 'dir' attribute</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>text_whitespace_valid</strong>: Space characters should not be used to control spacing within a word + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_whitespace_valid.html#%7B%22message%22%3A%22Space%20characters%20should%20not%20be%20used%20to%20create%20space%20between%20the%20letters%20of%20a%20word%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_text%22%7D">Space characters should not be used to create space between the letters of a word</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>style_highcontrast_visible</strong>: Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_highcontrast_visible.html#%7B%22message%22%3A%22Confirm%20Windows%20high%20contrast%20mode%20is%20supported%20when%20using%20CSS%20to%20include%2C%20position%20or%20alter%20non-decorative%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Confirm Windows high contrast mode is supported when using CSS to include, position or alter non-decorative content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.3.3 Sensory Characteristics [A]</h2> + <div>Instructions provided for understanding and operating content do not rely solely on sensory characteristics of components such as shape, size, visual location, orientation, or sound.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>text_sensory_misuse</strong>: Instructions should be meaningful without relying solely on shape, size, or location words + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_sensory_misuse.html#%7B%22message%22%3A%22Confirm%20the%20word(s)%20'%7B0%7D'%20of%20the%20user%20instruction%20is%20used%20to%20indicate%20a%20logical%20rather%20than%20visual%20position%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_position%22%7D">Confirm the word(s) '{0}' of the user instruction is used to indicate a logical rather than visual position</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_sensory_misuse.html#%7B%22message%22%3A%22Confirm%20the%20user%20instruction%20is%20still%20understandable%20without%20the%20word(s)%20'%7B0%7D'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_other%22%7D">Confirm the user instruction is still understandable without the word(s) '{0}'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.3.4 Orientation [AA]</h2> + <div>Content does not restrict its view and operation to a single display orientation, such as portrait or landscape.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>element_orientation_unlocked</strong>: Elements should not be restricted to either landscape or portrait orientation using CSS transform property + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_orientation_unlocked.html#%7B%22message%22%3A%22The%20element%20%3C%7B0%7D%3E%20is%20restricted%20to%20either%20landscape%20or%20portrait%20orientation%20using%20CSS%20transform%20property%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_locked%22%7D">The element &lt;{0}&gt; is restricted to either landscape or portrait orientation using CSS transform property</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.3.5 Identify Input Purpose [AA]</h2> + <div>The purpose of each input field that collects information about the user can be programmatically determined when the field serves a common purpose.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>input_autocomplete_valid</strong>: The 'autocomplete' attribute's token(s) must be appropriate for the input form field + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_autocomplete_valid.html#%7B%22message%22%3A%22The%20'autocomplete'%20attribute's%20token(s)%20are%20not%20appropriate%20for%20the%20input%20form%20field%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_inappropriate%22%7D">The 'autocomplete' attribute's token(s) are not appropriate for the input form field</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_autocomplete_valid.html#%7B%22message%22%3A%22The%20'autocomplete'%20attribute's%20token(s)%20are%20not%20appropriate%20for%20an%20input%20form%20field%20of%20any%20type%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid%22%7D">The 'autocomplete' attribute's token(s) are not appropriate for an input form field of any type</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_autocomplete_valid.html#%7B%22message%22%3A%22The%20'autocomplete'%20attribute%20has%20an%20incorrect%20value%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_incorrect%22%7D">The 'autocomplete' attribute has an incorrect value</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.1 Use of Color [A]</h2> + <div>Color is not used as the only visual means of conveying information, indicating an action, prompting a response, or distinguishing a visual element.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>form_font_color</strong>: Combine color and descriptive markup to indicate required form fields + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/form_font_color.html#%7B%22message%22%3A%22Check%20color%20is%20not%20used%20as%20the%20only%20visual%20means%20to%20convey%20which%20fields%20are%20required%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Check color is not used as the only visual means to convey which fields are required</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>style_color_misuse</strong>: Combine color and descriptive markup to convey information + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_color_misuse.html#%7B%22message%22%3A%22Verify%20color%20is%20not%20used%20as%20the%20only%20visual%20means%20of%20conveying%20information%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify color is not used as the only visual means of conveying information</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.2 Audio Control [A]</h2> + <div>If any audio plays automatically for more than 3 seconds, either a mechanism is available to pause or stop the audio, or a mechanism is available to control audio volume independently from the overall system volume level.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>media_autostart_controllable</strong>: Mechanism must be available to pause or stop and control the volume of the audio that plays automatically + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_autostart_controllable.html#%7B%22message%22%3A%22Verify%20there%20is%20a%20mechanism%20to%20pause%20or%20stop%20and%20control%20the%20volume%20for%20the%20audio%20that%20plays%20automatically%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify there is a mechanism to pause or stop and control the volume for the audio that plays automatically</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.3 Contrast (Minimum) [AA]</h2> + <div>The visual presentation of text and images of text has a contrast ratio of at least 4.5:1, with a 3:1 ratio for large-scale text.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>text_contrast_sufficient</strong>: The contrast ratio of text with its background must meet WCAG AA requirements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_contrast_sufficient.html#%7B%22message%22%3A%22Text%20contrast%20of%20%7B0%7D%20with%20its%20background%20is%20less%20than%20the%20WCAG%20AA%20minimum%20requirements%20for%20text%20of%20size%20%7B1%7Dpx%20and%20weight%20of%20%7B2%7D%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_contrast%22%7D">Text contrast of {0} with its background is less than the WCAG AA minimum requirements for text of size {1}px and weight of {2}</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_contrast_sufficient.html#%7B%22message%22%3A%22The%20foreground%20text%20and%20its%20background%20color%20are%20both%20detected%20as%20%7B3%7D.%20Verify%20the%20text%20meets%20the%20WCAG%20AA%20requirements%20for%20minimum%20contrast%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_same_color%22%7D">The foreground text and its background color are both detected as {3}. Verify the text meets the WCAG AA requirements for minimum contrast</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_contrast_sufficient.html#%7B%22message%22%3A%22Verify%20the%20contrast%20ratio%20of%20the%20text%20against%20the%20lightest%20and%20the%20darkest%20colors%20of%20the%20background%20meets%20the%20WCAG%20AA%20minimum%20requirements%20for%20text%20of%20size%20%7B1%7Dpx%20and%20weight%20of%20%7B2%7D%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_graphic_background%22%7D">Verify the contrast ratio of the text against the lightest and the darkest colors of the background meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_contrast_sufficient.html#%7B%22message%22%3A%22Verify%20the%20contrast%20ratio%20of%20the%20text%20with%20shadow%20meets%20the%20WCAG%20AA%20minimum%20requirements%20for%20text%20of%20size%20%7B1%7Dpx%20and%20weight%20of%20%7B2%7D%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_text_shadow%22%7D">Verify the contrast ratio of the text with shadow meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.4 Resize text [AA]</h2> + <div>Text can be resized without assistive technology up to 200 percent without loss of content or functionality.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>style_viewport_resizable</strong>: Text must scale up to 200% without loss of content or functionality + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_viewport_resizable.html#%7B%22message%22%3A%22Verify%20that%20text%20sized%20using%20viewport%20units%20can%20be%20resized%20up%20to%20200%25%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that text sized using viewport units can be resized up to 200%</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>meta_viewport_zoomable</strong>: The 'meta[name=viewport]' should not prevent the browser zooming the content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/meta_viewport_zoomable.html#%7B%22message%22%3A%22Confirm%20the%20'meta%5Bname%3Dviewport%5D'%20with%20%5C%22%7B0%7D%5C%22%20can%20be%20zoomed%20by%20user%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_zoomable%22%7D">Confirm the 'meta[name=viewport]' with "{0}" can be zoomed by user</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.5 Images of Text [AA]</h2> + <div>If the technologies being used can achieve the visual presentation, text should not be used to convey information rather than images of text.</div> + +</div><div> + <h2>1.4.10 Reflow [AA]</h2> + <div>Content can reflow without loss of information or functionality, and without requiring scrolling in two dimensions.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>style_viewport_resizable</strong>: Text must scale up to 200% without loss of content or functionality + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_viewport_resizable.html#%7B%22message%22%3A%22Verify%20that%20text%20sized%20using%20viewport%20units%20can%20be%20resized%20up%20to%20200%25%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that text sized using viewport units can be resized up to 200%</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.11 Non-text Contrast [AA]</h2> + <div>The parts of graphical objects required to understand the content, and the visual information required to identify UI components and states, have a contrast ratio of at least 3:1 against adjacent colors.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>style_highcontrast_visible</strong>: Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_highcontrast_visible.html#%7B%22message%22%3A%22Confirm%20Windows%20high%20contrast%20mode%20is%20supported%20when%20using%20CSS%20to%20include%2C%20position%20or%20alter%20non-decorative%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Confirm Windows high contrast mode is supported when using CSS to include, position or alter non-decorative content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.12 Text Spacing [AA]</h2> + <div>No loss of content or functionality occurs when users change letter, word and paragraph spacing, as well as line height.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>text_spacing_valid</strong>: CSS !important should not be used in inline style to control letter or word spacing or line height + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_spacing_valid.html#%7B%22message%22%3A%22CSS%20!important%20should%20not%20be%20used%20in%20inline%20%E2%80%98letter-spacing%E2%80%99%20style%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_letter_spacing_style%22%7D">CSS !important should not be used in inline ‘letter-spacing’ style</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_spacing_valid.html#%7B%22message%22%3A%22CSS%20!important%20should%20not%20be%20used%20in%20inline%20%E2%80%98word-spacing%E2%80%99%20style%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_word_spacing_style%22%7D">CSS !important should not be used in inline ‘word-spacing’ style</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_spacing_valid.html#%7B%22message%22%3A%22CSS%20!important%20should%20not%20be%20used%20in%20inline%20%E2%80%98line-height%E2%80%99%20style%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_line_height_style%22%7D">CSS !important should not be used in inline ‘line-height’ style</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.13 Content on Hover or Focus [AA]</h2> + <div>Where hover or focus actions cause additional content to become visible and hidden, the additional content is dismissable, hoverable and persistent.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>style_hover_persistent</strong>: The pointer should be able to move over content displayed on hover + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_hover_persistent.html#%7B%22message%22%3A%22Confirm%20the%20pointer%20can%20be%20positioned%20over%20the%20displayed%20element%2C%20not%20just%20the%20trigger%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Confirm the pointer can be positioned over the displayed element, not just the trigger</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_hover_persistent.html#%7B%22message%22%3A%22Confirm%20the%20pointer%20can%20be%20positioned%20over%20all%20the%20information%20displayed%20on%20hover%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_2%22%7D">Confirm the pointer can be positioned over all the information displayed on hover</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_hover_persistent.html#%7B%22message%22%3A%22Confirm%20the%20margin%20style%20attribute%20has%20not%20prevented%20the%20pointer%20from%20hovering%20over%20the%20displayed%20element%2C%20not%20just%20the%20trigger%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_3%22%7D">Confirm the margin style attribute has not prevented the pointer from hovering over the displayed element, not just the trigger</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.1.1 Keyboard [A]</h2> + <div>All functionality of the content is operable through a keyboard interface without requiring specific timings for individual keystrokes.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>aria_activedescendant_tabindex_valid</strong>: Element using 'aria-activedescendant' property should be tabbable + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_activedescendant_tabindex_valid.html#%7B%22message%22%3A%22The%20%3C%7B0%7D%3E%20element%20using%20'aria-activedescendant'%20set%20to%20%5C%22%7B1%7D%5C%22%20is%20not%20tabbable%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;{0}&gt; element using 'aria-activedescendant' set to "{1}" is not tabbable</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_child_tabbable</strong>: UI component must have at least one tabbable descendant for keyboard access + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_child_tabbable.html#%7B%22message%22%3A%22None%20of%20the%20descendent%20elements%20with%20%5C%22%7B1%7D%5C%22%20role%20is%20tabbable%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_missing_child%22%7D">None of the descendent elements with "{1}" role is tabbable</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>iframe_interactive_tabbable</strong>: Iframe with interactive content should not be excluded from tab order using tabindex + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/iframe_interactive_tabbable.html#%7B%22message%22%3A%22The%20%3Ciframe%3E%20with%20interactive%20content%20is%20excluded%20from%20tab%20order%20using%20tabindex%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid%22%7D">The &lt;iframe&gt; with interactive content is excluded from tab order using tabindex</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>application_content_accessible</strong>: Non-decorative static text and image content within an element with "application" role must be accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/application_content_accessible.html#%7B%22message%22%3A%22Verify%20that%20the%20non-decorative%20static%20text%20and%20image%20content%20within%20an%20element%20with%20%5C%22application%5C%22%20role%20are%20accessible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the non-decorative static text and image content within an element with "application" role are accessible</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_keyboard_handler_exists</strong>: Interactive WAI_ARIA UI components must provide keyboard access + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_keyboard_handler_exists.html#%7B%22message%22%3A%22Verify%20the%20%3C%7B0%7D%3E%20element%20with%20%5C%22%7B1%7D%5C%22%20role%20has%20keyboard%20access%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_no_keyboard_access%22%7D">Verify the &lt;{0}&gt; element with "{1}" role has keyboard access</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>script_focus_blur_review</strong>: Scripting must not remove focus from content that normally receives focus + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_focus_blur_review.html#%7B%22message%22%3A%22Verify%20script%20does%20not%20remove%20focus%20from%20content%20that%20normally%20receives%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify script does not remove focus from content that normally receives focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>script_onclick_misuse</strong>: Scripts should not be used to emulate links + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_onclick_misuse.html#%7B%22message%22%3A%22Possible%20use%20of%20a%20script%20to%20emulate%20a%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Possible use of a script to emulate a link</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>widget_tabbable_exists</strong>: Component must have at least one tabbable element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/widget_tabbable_exists.html#%7B%22message%22%3A%22Component%20with%20%5C%22%7B0%7D%5C%22%20role%20does%20not%20have%20a%20tabbable%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22fail_no_tabbable%22%7D">Component with "{0}" role does not have a tabbable element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>widget_tabbable_single</strong>: Components with a widget role must have no more than one tabbable element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/widget_tabbable_single.html#%7B%22message%22%3A%22Component%20with%20%5C%22%7B0%7D%5C%22%20role%20has%20more%20than%20one%20tabbable%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_multiple_tabbable%22%7D">Component with "{0}" role has more than one tabbable element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>media_keyboard_controllable</strong>: Media using &lt;audio&gt; and/or &lt;video> elements must have keyboard accessible controls + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_keyboard_controllable.html#%7B%22message%22%3A%22Verify%20media%20using%20%3Caudio%3E%20and%2For%20%3Cvideo%3E%20elements%20have%20keyboard%20accessible%20controls%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify media using &lt;audio&gt; and/or &lt;video> elements have keyboard accessible controls</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>script_onclick_avoid</strong>: Scripts should not be used to emulate links + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_onclick_avoid.html#%7B%22message%22%3A%22Verify%20that%20'onclick'%20events%20are%20not%20used%20in%20script%20to%20emulate%20a%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that 'onclick' events are not used in script to emulate a link</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>canvas_content_described</strong>: The &lt;canvas&gt; element may not be accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/canvas_content_described.html#%7B%22message%22%3A%22Verify%20accessibility%20of%20the%20%3Ccanvas%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify accessibility of the &lt;canvas&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>element_mouseevent_keyboard</strong>: All interactive content with mouse event handlers must have equivalent keyboard access + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_mouseevent_keyboard.html#%7B%22message%22%3A%22Confirm%20the%20%3C%7B0%7D%3E%20element%20with%20mouse%20event%20handler(s)%20'%7B1%7D'%20has%20a%20corresponding%20keyboard%20handler(s)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Confirm the &lt;{0}&gt; element with mouse event handler(s) '{1}' has a corresponding keyboard handler(s)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.1.2 No Keyboard Trap [A]</h2> + <div>If keyboard focus can be moved to a component using a keyboard interface, then focus can be moved away from that component using only a keyboard interface, and, if it requires more than unmodified arrow or tab keys or other standard exit methods, the user is advised of the method for moving focus away.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>download_keyboard_controllable</strong>: File download mechanisms should be keyboard-operable and preserve page focus location + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/download_keyboard_controllable.html#%7B%22message%22%3A%22Verify%20that%20the%20file%20download%20mechanism%20does%20not%20cause%20a%20keyboard%20trap%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify that the file download mechanism does not cause a keyboard trap</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.1.4 Character Key Shortcuts [A]</h2> + <div>If a keyboard shortcut is implemented using only letter, punctuation, number or symbol characters, then the shortcut can be turned off, remapped or activated only on focus.</div> + +</div><div> + <h2>2.2.1 Timing Adjustable [A]</h2> + <div>For each time limit that is set by the content, the user can turn off, adjust, or extend the limit.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>meta_refresh_delay</strong>: Pages should not refresh automatically + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/meta_refresh_delay.html#%7B%22message%22%3A%22Verify%20page%20is%20not%20being%20caused%20to%20refresh%20automatically%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_refresh%22%7D">Verify page is not being caused to refresh automatically</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.2.2 Pause, Stop, Hide [A]</h2> + <div>For moving, blinking, scrolling, or auto-updating information, the user can pause, stop, hide or adjust the information.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>blink_elem_deprecated</strong>: Content that blinks persistently must not be used + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/blink_elem_deprecated.html#%7B%22message%22%3A%22Content%20found%20that%20blinks%20persistently%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Content found that blinks persistently</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>marquee_elem_avoid</strong>: The &lt;marquee&gt; element is obsolete and should not be used + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/marquee_elem_avoid.html#%7B%22message%22%3A%22Scrolling%20content%20found%20that%20uses%20the%20obsolete%20%3Cmarquee%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Scrolling content found that uses the obsolete &lt;marquee&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>blink_css_review</strong>: Do not use the "blink" value of the 'text-decoration' property for longer than five seconds + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/blink_css_review.html#%7B%22message%22%3A%22Check%20the%20%5C%22blink%5C%22%20value%20of%20the%20CSS%20'text-decoration'%20property%20is%20not%20used%20for%20more%20than%20than%20five%20seconds%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Check the "blink" value of the CSS 'text-decoration' property is not used for more than than five seconds</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.3.1 Three Flashes or Below Threshold [A]</h2> + <div>Content does not contain anything that flashes more than three times in any one second period, or the flash is below the general flash and red flash thresholds.</div> + +</div><div> + <h2>2.4.1 Bypass Blocks [A]</h2> + <div>A mechanism is available to bypass blocks of content that are repeated on multiple Web pages.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>aria_application_label_unique</strong>: Each element with "application" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_application_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22application%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "application" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_application_labelled</strong>: Each element with "application" role must have a label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_application_labelled.html#%7B%22message%22%3A%22Element%20with%20%5C%22application%5C%22%20role%20does%20not%20have%20a%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_label%22%7D">Element with "application" role does not have a label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_article_label_unique</strong>: Each element with "article" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_article_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22article%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "article" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_document_label_unique</strong>: Each element with "document" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_document_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22document%5C%22%20roles%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "document" roles do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_toolbar_label_unique</strong>: Each element with "toolbar" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_toolbar_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22toolbar%5C%22%20roles%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "toolbar" roles do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>skip_main_exists</strong>: Pages must provide a way to skip directly to the main content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/skip_main_exists.html#%7B%22message%22%3A%22The%20page%20does%20not%20provide%20a%20way%20to%20quickly%20navigate%20to%20the%20main%20content%20(ARIA%20%5C%22main%5C%22%20landmark%20or%20a%20skip%20link)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The page does not provide a way to quickly navigate to the main content (ARIA "main" landmark or a skip link)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>frame_src_valid</strong>: A &lt;frame&gt; containing non-HTML content must be made accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/frame_src_valid.html#%7B%22message%22%3A%22Verify%20%3Cframe%3E%20content%20is%20accessible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify &lt;frame&gt; content is accessible</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>html_skipnav_exists</strong>: Provide a way to bypass blocks of content that are repeated on multiple Web pages + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_skipnav_exists.html#%7B%22message%22%3A%22Verify%20there%20is%20a%20way%20to%20bypass%20blocks%20of%20content%20that%20are%20repeated%20on%20multiple%20Web%20pages%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify there is a way to bypass blocks of content that are repeated on multiple Web pages</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>skip_main_described</strong>: The description of a hyperlink used to skip content must communicate where it links to + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/skip_main_described.html#%7B%22message%22%3A%22Verify%20that%20if%20this%20hyperlink%20skips%20content%2C%20the%20description%20communicates%20where%20it%20links%20to%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that if this hyperlink skips content, the description communicates where it links to</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.2 Page Titled [A]</h2> + <div>Web pages, non-web documents, and software have titles that describe topic or purpose.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>page_title_exists</strong>: The page should have a title that correctly identifies the subject of the page + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/page_title_exists.html#%7B%22message%22%3A%22Missing%20%3Chead%3E%20element%20so%20there%20can%20be%20no%20%3Ctitle%3E%20element%20present%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Missing &lt;head&gt; element so there can be no &lt;title> element present</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/page_title_exists.html#%7B%22message%22%3A%22Missing%20%3Ctitle%3E%20element%20in%20%3Chead%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Missing &lt;title&gt; element in &lt;head> element</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/page_title_exists.html#%7B%22message%22%3A%22The%20%3Ctitle%3E%20element%20is%20empty%20(no%20innerHTML)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">The &lt;title&gt; element is empty (no innerHTML)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>page_title_valid</strong>: Page &lt;title&gt; should be a descriptive title, rather than a filename + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/page_title_valid.html#%7B%22message%22%3A%22Verify%20that%20using%20the%20filename%20as%20the%20page%20%3Ctitle%3E%20value%20is%20descriptive%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_2%22%7D">Verify that using the filename as the page &lt;title&gt; value is descriptive</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.3 Focus Order [A]</h2> + <div>If content can be navigated sequentially and the navigation sequences affect meaning or operation, focusable components receive focus in an order that preserves meaning and operability.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>widget_tabbable_single</strong>: Components with a widget role must have no more than one tabbable element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/widget_tabbable_single.html#%7B%22message%22%3A%22Component%20with%20%5C%22%7B0%7D%5C%22%20role%20has%20more%20than%20one%20tabbable%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_multiple_tabbable%22%7D">Component with "{0}" role has more than one tabbable element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.4 Link Purpose (In Context) [A]</h2> + <div>The purpose of each link can be determined from the link text alone or from the link text together with its programmatically determined link content.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>img_alt_redundant</strong>: The text alternative for an image within a link should not repeat the link text or adjacent link text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Link%20text%20is%20repeated%20in%20an%20image%20'alt'%20value%20within%20the%20same%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Link text is repeated in an image 'alt' value within the same link</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Link%20text%20of%20previous%20link%20is%20repeated%20in%20image%20'alt'%20value%20of%20a%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Link text of previous link is repeated in image 'alt' value of a link</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Image%20'alt'%20value%20within%20a%20link%20is%20repeated%20in%20link%20text%20of%20the%20link%20after%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Image 'alt' value within a link is repeated in link text of the link after</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>a_text_purpose</strong>: Hyperlinks must have an accessible name for their purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/a_text_purpose.html#%7B%22message%22%3A%22Hyperlink%20has%20no%20link%20text%2C%20label%20or%20image%20with%20a%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_acc_name%22%7D">Hyperlink has no link text, label or image with a text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.5 Multiple Ways [AA]</h2> + <div>More than one way is available to locate a Web page within a set of Web pages, except where the Web Page is the result of, or a step in, a process.</div> + +</div><div> + <h2>2.4.6 Headings and Labels [AA]</h2> + <div>Headings and labels describe topic or purpose.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>heading_content_exists</strong>: Heading elements must provide descriptive text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/heading_content_exists.html#%7B%22message%22%3A%22Heading%20element%20has%20no%20descriptive%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Heading element has no descriptive content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.7 Focus Visible [AA]</h2> + <div>Any keyboard operable user interface has a mode of operation where the keyboard focus indicator is visible.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>element_tabbable_visible</strong>: A tabbable element should be visible on the screen when it has keyboard focus + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_tabbable_visible.html#%7B%22message%22%3A%22Confirm%20the%20element%20should%20be%20tabbable%20and%20if%20so%2C%20it%20becomes%20visible%20when%20it%20has%20keyboard%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_visible%22%7D">Confirm the element should be tabbable and if so, it becomes visible when it has keyboard focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>script_focus_blur_review</strong>: Scripting must not remove focus from content that normally receives focus + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_focus_blur_review.html#%7B%22message%22%3A%22Verify%20script%20does%20not%20remove%20focus%20from%20content%20that%20normally%20receives%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify script does not remove focus from content that normally receives focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>style_focus_visible</strong>: The keyboard focus indicator should be visible when default border or outline is modified by CSS + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_focus_visible.html#%7B%22message%22%3A%22Check%20the%20keyboard%20focus%20indicator%20is%20visible%20when%20using%20CSS%20declaration%20for%20'border'%20or%20'outline'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_focus_not_visible%22%7D">Check the keyboard focus indicator is visible when using CSS declaration for 'border' or 'outline'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.11 Focus Not Obscured (Minimum) [AA]</h2> + <div>When an element receives focus, it is not entirely covered by other content.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>element_tabbable_unobscured</strong>: When an element receives focus, it is not entirely covered by other content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_tabbable_unobscured.html#%7B%22message%22%3A%22Confirm%20that%20when%20the%20element%20receives%20focus%2C%20it%20is%20not%20covered%20or%2C%20if%20covered%20by%20user%20action%2C%20can%20be%20uncovered%20without%20moving%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_obscured%22%7D">Confirm that when the element receives focus, it is not covered or, if covered by user action, can be uncovered without moving focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.5.1 Pointer Gestures [A]</h2> + <div>All functionality that uses multipoint or path-based gestures for operation can be operated with a single pointer without a path-based gesture.</div> + +</div><div> + <h2>2.5.2 Pointer Cancellation [A]</h2> + <div>For functionality that can be operated using a single pointer, completion of the function is on the up-event with an ability to abort, undo or reverse the outcome.</div> + +</div><div> + <h2>2.5.3 Label in Name [A]</h2> + <div>For user interface components with labels that include text or images of text, the accessible name contains the text that is presented visually.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>label_name_visible</strong>: Accessible name must match or contain the visible label text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/label_name_visible.html#%7B%22message%22%3A%22Accessible%20name%20does%20not%20match%20or%20contain%20the%20visible%20label%20text%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Accessible name does not match or contain the visible label text</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_label_visible</strong>: An input element must have an associated visible label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_visible.html#%7B%22message%22%3A%22The%20%E2%80%98placeholder%E2%80%99%20is%20the%20only%20visible%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_placeholder_only%22%7D">The ‘placeholder’ is the only visible label</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_visible.html#%7B%22message%22%3A%22The%20input%20element%20does%20not%20have%20an%20associated%20visible%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_no_label%22%7D">The input element does not have an associated visible label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.5.4 Motion Actuation [A]</h2> + <div>Functionality that can be operated by motion can also be operated by user interface components, and the motion trigger can be disabled.</div> + +</div><div> + <h2>2.5.7 Dragging Movement [AA]</h2> + <div>All functionality that uses a dragging movement for operation can be achieved by a single pointer without dragging.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>draggable_alternative_exists</strong>: A draggable element must have a "single pointer" alternative + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/draggable_alternative_exists.html#%7B%22message%22%3A%22Ensure%20the%20draggable%20element%20%5C%22%7B0%7D%5C%22%20has%20a%20%5C%22single%20pointer%5C%22%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_alternative%22%7D">Ensure the draggable element "{0}" has a "single pointer" alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.5.8 Minimum Target Size [AA]</h2> + <div>The size of the target for pointer inputs is at least 24 by 24 CSS pixels.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>target_spacing_sufficient</strong>: The target must be sufficiently sized or spaced from other targets + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/target_spacing_sufficient.html#%7B%22message%22%3A%22Undersized%20target%20%5C%22%7B0%7D%5C%22%20does%20not%20have%20sufficient%20spacing%20of%2012%20CSS%20pixels%20from%20another%20target%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22violation_spacing%22%7D">Undersized target "{0}" does not have sufficient spacing of 12 CSS pixels from another target "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/target_spacing_sufficient.html#%7B%22message%22%3A%22Ensure%20the%20overlapped%20target%20%5C%22%7B0%7D%5C%22%20meets%20a%20minimum%20target%20size%20or%20has%20sufficient%20spacing%20from%20the%20overlapping%20target%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_overlap%22%7D">Ensure the overlapped target "{0}" meets a minimum target size or has sufficient spacing from the overlapping target "{1}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.1.1 Language of Page [A]</h2> + <div>The default human language of Web pages, non-Web documents, or software can be programmatically determined.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>html_lang_exists</strong>: Page must identify the default language of the document with a 'lang' attribute + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20as%20XHTML%201.0%2C%20but%20has%20neither%20'lang'%20nor%20'xml%3Alang'%20attributes%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Page detected as XHTML 1.0, but has neither 'lang' nor 'xml:lang' attributes</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20as%20XHTML%2C%20but%20does%20not%20have%20an%20'xml%3Alang'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Page detected as XHTML, but does not have an 'xml:lang' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20as%20HTML%2C%20but%20does%20not%20have%20a%20'lang'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Page detected as HTML, but does not have a 'lang' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20with%20'lang'%20and%20'xml%3Alang'%20attributes%20and%20primary%20languages%20do%20not%20match%3A%20%5C%22%7B0%7D%5C%22%2C%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_4%22%7D">Page detected with 'lang' and 'xml:lang' attributes and primary languages do not match: "{0}", "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20with%20'lang'%20and%20'xml%3Alang'%20attributes%20that%20do%20not%20match%3A%20%5C%22%7B0%7D%5C%22%2C%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_5%22%7D">Page detected with 'lang' and 'xml:lang' attributes that do not match: "{0}", "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20as%20XHTML%201.0%20with%20only%20a%20'lang'%20attribute.%20Confirm%20that%20page%20is%20only%20delivered%20via%20text%2Fhtml%20mime%20type%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_5%22%7D">Page detected as XHTML 1.0 with only a 'lang' attribute. Confirm that page is only delivered via text/html mime type</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20as%20XHTML%201.0%20with%20only%20an%20'xml%3Alang'%20attribute.%20Confirm%20that%20page%20is%20only%20delivered%20via%20xml%20mime%20type%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_6%22%7D">Page detected as XHTML 1.0 with only an 'xml:lang' attribute. Confirm that page is only delivered via xml mime type</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>html_lang_valid</strong>: The default human language of the page must be valid and specified in accordance with BCP 47 + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_valid.html#%7B%22message%22%3A%22Specified%20'lang'%20attribute%20does%20not%20include%20a%20valid%20primary%20language%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Specified 'lang' attribute does not include a valid primary language</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_valid.html#%7B%22message%22%3A%22Specified%20'lang'%20attribute%20does%20not%20conform%20to%20BCP%2047%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Specified 'lang' attribute does not conform to BCP 47</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_valid.html#%7B%22message%22%3A%22Specified%20'xml%3Alang'%20attribute%20does%20not%20include%20a%20valid%20primary%20language%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Specified 'xml:lang' attribute does not include a valid primary language</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_valid.html#%7B%22message%22%3A%22Specified%20'xml%3Alang'%20attribute%20does%20not%20conform%20to%20BCP%2047%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_4%22%7D">Specified 'xml:lang' attribute does not conform to BCP 47</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.1.2 Language of Parts [AA]</h2> + <div>The human language of each passage or phrase in the content can be programmatically determined.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>element_lang_valid</strong>: The change in language of specific content must be valid and specified in accordance with BCP 47 + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_lang_valid.html#%7B%22message%22%3A%22Specified%20'lang'%20attribute%20does%20not%20include%20a%20valid%20primary%20language%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Specified 'lang' attribute does not include a valid primary language</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_lang_valid.html#%7B%22message%22%3A%22Specified%20'lang'%20attribute%20does%20not%20conform%20to%20BCP%2047%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Specified 'lang' attribute does not conform to BCP 47</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_lang_valid.html#%7B%22message%22%3A%22Specified%20'xml%3Alang'%20attribute%20does%20not%20include%20a%20valid%20primary%20language%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Specified 'xml:lang' attribute does not include a valid primary language</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_lang_valid.html#%7B%22message%22%3A%22Specified%20'xml%3Alang'%20attribute%20does%20not%20conform%20to%20BCP%2047%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_4%22%7D">Specified 'xml:lang' attribute does not conform to BCP 47</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.2.1 On Focus [A]</h2> + <div>When any component receives focus, it does not initiate a change of context.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>script_focus_blur_review</strong>: Scripting must not remove focus from content that normally receives focus + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_focus_blur_review.html#%7B%22message%22%3A%22Verify%20script%20does%20not%20remove%20focus%20from%20content%20that%20normally%20receives%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify script does not remove focus from content that normally receives focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>script_select_review</strong>: No changes of context should occur when a selection value receives focus + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_select_review.html#%7B%22message%22%3A%22Verify%20that%20no%20change%20of%20context%20or%20action%20occurs%20when%20selection%20options%20in%20this%20component%20receive%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that no change of context or action occurs when selection options in this component receive focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.2.2 On Input [A]</h2> + <div>Changing the setting of any user interface component does not automatically cause a change of context unless the user has been advised of the behavior before using the component.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>form_interaction_review</strong>: User should be informed in advance when interacting with content causes a change of context + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/form_interaction_review.html#%7B%22message%22%3A%22Verify%20that%20interacting%20with%20content%20will%20not%20open%20pop-up%20windows%20or%20change%20the%20active%20window%20without%20informing%20the%20user%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that interacting with content will not open pop-up windows or change the active window without informing the user</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>form_submit_button_exists</strong>: A &lt;form&gt; element should have a submit button or an image button + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/form_submit_button_exists.html#%7B%22message%22%3A%22Verify%20the%20%3Cform%3E%20element%20has%20a%20submit%20button%20or%20an%20image%20button%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify the &lt;form&gt; element has a submit button or an image button</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_onchange_review</strong>: Users must be advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_onchange_review.html#%7B%22message%22%3A%22Confirm%20that%20the%20user%20is%20advised%20if%2C%20due%20to%20a%20change%20of%20element%20value%2C%20a%20form%20automatically%20submits%2C%20a%20new%20window%20opens%2C%20or%20a%20change%20in%20focus%20occurs%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_warning%22%7D">Confirm that the user is advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>a_target_warning</strong>: Users should be warned in advance if their input action will open a new window + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/a_target_warning.html#%7B%22message%22%3A%22Inform%20the%20user%20when%20their%20input%20action%20will%20open%20a%20new%20window%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_warn%22%7D">Inform the user when their input action will open a new window</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.2.3 Consistent Navigation [AA]</h2> + <div>Navigational mechanisms that are repeated on multiple Web pages within a set of Web pages occur in the same relative order each time they are repeated, unless a change is initiated by the user.</div> + +</div><div> + <h2>3.2.4 Consistent Identification [AA]</h2> + <div>Components that have the same functionality within a set of Web pages are identified consistently.</div> + +</div><div> + <h2>3.2.6 Consistent Help [AA]</h2> + <div>Make it easier to find help and support. If a Web page contains help mechanisms they occur in the same order relative to other page content, unless a change is initiated by the user.</div> + +</div><div> + <h2>3.3.1 Error Identification [A]</h2> + <div>If an input error is automatically detected, the item that is in error is identified and the error is described to the user in text.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>error_message_exists</strong>: A custom error message must reference a valid 'id' value and when triggered the message must be appropriately exposed + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/error_message_exists.html#%7B%22message%22%3A%22Custom%20error%20message%20has%20invalid%20reference%20'id'%20value%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Custom error message has invalid reference 'id' value</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/error_message_exists.html#%7B%22message%22%3A%22Custom%20error%20message%20is%20not%20visible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Custom error message is not visible</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.3.2 Labels or Instructions [A]</h2> + <div>Labels or instructions are provided when content requires user input.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>fieldset_label_valid</strong>: Groups with nested inputs must have unique accessible name + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_label_valid.html#%7B%22message%22%3A%22Group%2FFieldset%20does%20not%20have%20an%20accessible%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Group/Fieldset does not have an accessible name</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_label_valid.html#%7B%22message%22%3A%22Group%2FFieldset%20%5C%22%7B0%7D%5C%22%20has%20a%20duplicate%20name%20to%20another%20group%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Group/Fieldset "{0}" has a duplicate name to another group</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_label_after</strong>: Checkboxes and radio buttons must have a label after the input control + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_after.html#%7B%22message%22%3A%22Checkbox%20or%20radio%20button%20is%20nested%20in%20label%2C%20so%20label%20is%20not%20after%20the%20input%20control%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Checkbox or radio button is nested in label, so label is not after the input control</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_after.html#%7B%22message%22%3A%22Label%20text%20is%20located%20before%20its%20associated%20checkbox%20or%20radio%20button%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Label text is located before its associated checkbox or radio button element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_label_before</strong>: Text inputs and &lt;select&gt; elements must have a label before the input control + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_before.html#%7B%22message%22%3A%22Text%20input%20is%20nested%20in%20label%20such%20that%20input%20precedes%20the%20label%20text%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Text input is nested in label such that input precedes the label text</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_before.html#%7B%22message%22%3A%22Label%20text%20is%20located%20after%20its%20associated%20text%20input%20or%20%3Cselect%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Label text is located after its associated text input or &lt;select&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_label_visible</strong>: An input element must have an associated visible label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_visible.html#%7B%22message%22%3A%22The%20%E2%80%98placeholder%E2%80%99%20is%20the%20only%20visible%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_placeholder_only%22%7D">The ‘placeholder’ is the only visible label</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_visible.html#%7B%22message%22%3A%22The%20input%20element%20does%20not%20have%20an%20associated%20visible%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_no_label%22%7D">The input element does not have an associated visible label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>element_accesskey_labelled</strong>: An element with an assigned 'accesskey' attribute must have an associated label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_accesskey_labelled.html#%7B%22message%22%3A%22The%20element%20with%20an%20assigned%20'accesskey'%20attribute%20does%20not%20have%20an%20associated%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">The element with an assigned 'accesskey' attribute does not have an associated label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.3.3 Error Suggestion [AA]</h2> + <div>If an input error is automatically detected and suggestions for correction are known, then the suggestions are provided to the user, unless it would jeopardize the security or purpose of the content.</div> + +</div><div> + <h2>3.3.4 Error Prevention (Legal, Financial, Data) [AA]</h2> + <div>For content that cause legal commitments or financial transactions for the user to occur, that modify or delete user-controllable data in data storage systems, or that submit user test responses, the user can reverse, correct, or confirm the action.</div> + +</div><div> + <h2>3.3.7 Redundant Entry [AA]</h2> + <div>Make it easier for users to complete multi-step processes. Don't ask for the same information twice in the same session.</div> + +</div><div> + <h2>3.3.8 Accessible Authentication (Minimum) [AA]</h2> + <div>Make logins possible with less mental effort. Don't make people solve, recall, or transcribe something to log in.</div> + +</div><div> + <h2>4.1.1 Parsing [A]</h2> + <div>(Obsolete and removed) This requirement was originally adopted to address problems that assistive technology (AT) had directly parsing HTML. AT no longer has any need to directly parse HTML. Consequently, these problems either no longer exist or are addressed by other requirements.</div> + +</div><div> + <h2>4.1.2 Name, Role, Value [A]</h2> + <div>For all user interface components (including, but not limited to: form elements, links and components generated by scripts), the name and role can be programmatically determined; states, properties, and values that can be set by the user can be programmatically set; and notification of changes to these items is available to user agents, including assistive technologies.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>combobox_popup_reference</strong>: The 'aria-controls' (for ARIA 1.2) or the 'aria-owns' (for ARIA 1.0) attribute of the expanded combobox must reference a valid popup 'id' value + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20'aria-owns'%20attribute%20of%20the%20expanded%20combobox%20is%20missing%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1.0_missing_owns%22%7D">The 'aria-owns' attribute of the expanded combobox is missing</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20'aria-controls'%20attribute%20of%20the%20expanded%20combobox%20is%20missing%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1.2_missing_controls%22%7D">The 'aria-controls' attribute of the expanded combobox is missing</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20'aria-owns'%20attribute%20%5C%22%7B0%7D%5C%22%20of%20the%20expanded%20combobox%20does%20not%20reference%20a%20valid%20popup%20'id'%20value%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1.0_popup_reference_missing%22%7D">The 'aria-owns' attribute "{0}" of the expanded combobox does not reference a valid popup 'id' value</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20'aria-controls'%20attribute%20%5C%22%7B0%7D%5C%22%20of%20the%20expanded%20combobox%20does%20not%20reference%20a%20valid%20popup%20'id'%20value%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1.2_popup_reference_missing%22%7D">The 'aria-controls' attribute "{0}" of the expanded combobox does not reference a valid popup 'id' value</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20combobox%20'aria-expanded'%20attribute%20is%20true%2C%20but%20the%20combobox%20popup%20is%20not%20visible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_combobox_expanded_hidden%22%7D">The combobox 'aria-expanded' attribute is true, but the combobox popup is not visible</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20combobox%20'aria-expanded'%20attribute%20is%20false%2C%20but%20the%20combobox%20popup%20is%20visible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_combobox_collapsed_visible%22%7D">The combobox 'aria-expanded' attribute is false, but the combobox popup is visible</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_activedescendant_valid</strong>: The 'aria-activedescendant' property must reference the 'id' of a non-empty, non-hidden active child element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_activedescendant_valid.html#%7B%22message%22%3A%22The%20'aria-activedescendant'%20property%20is%20empty%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The 'aria-activedescendant' property is empty</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_activedescendant_valid.html#%7B%22message%22%3A%22The%20'aria-activedescendant'%20property%20references%20a%20hidden%20node%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The 'aria-activedescendant' property references a hidden node</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_activedescendant_valid.html#%7B%22message%22%3A%22Element%20is%20not%20a%20combobox%2C%20and%20the%20referenced%20active-descendant%20element%20is%20not%20a%20valid%20descendant%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Element is not a combobox, and the referenced active-descendant element is not a valid descendant</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>combobox_active_descendant</strong>: 'aria-activedescendant' must be used to define focus within the combobox popup, except when using a dialog popup + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_active_descendant.html#%7B%22message%22%3A%22The%20element%20referenced%20by%20'aria-activedescendant'%20%5C%22%7B0%7D%5C%22%20does%20not%20exist%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_missing%22%7D">The element referenced by 'aria-activedescendant' "{0}" does not exist</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_active_descendant.html#%7B%22message%22%3A%22The%20'aria-activedescendant'%20%5C%22%7B0%7D%5C%22%20references%20an%20element%20with%20the%20roles%20%5C%22%7B1%7D%5C%22%2C%20which%20does%20not%20have%20a%20valid%20ARIA%20role%20of%20'option'%2C%20'gridcell'%2C%20'row'%2C%20or%20'treeitem'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_active_role_invalid%22%7D">The 'aria-activedescendant' "{0}" references an element with the roles "{1}", which does not have a valid ARIA role of 'option', 'gridcell', 'row', or 'treeitem'</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_active_descendant.html#%7B%22message%22%3A%22The%20'aria-activedescendant'%20%5C%22%7B0%7D%5C%22%20references%20an%20element%20that%20does%20not%20have%20'aria-selected'%20set%20to%20true%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_active_not_selected%22%7D">The 'aria-activedescendant' "{0}" references an element that does not have 'aria-selected' set to true</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_haspopup_conflict</strong>: &lt;input&gt; element with a 'list' attribute should not use an explicit 'aria-haspopup' attribute + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_haspopup_conflict.html#%7B%22message%22%3A%22The%20%3Cinput%3E%20element%20with%20type%20%5C%22%7B0%7D%5C%22%20and%20'list'%20attribute%20uses%20an%20explicit%20'aria-haspopup'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_type_misuse%22%7D">The &lt;input&gt; element with type "{0}" and 'list' attribute uses an explicit 'aria-haspopup' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_haspopup_conflict.html#%7B%22message%22%3A%22The%20%3Cinput%3E%20element%20with%20a%20missing%20or%20invalid%20type%20and%20'list'%20attribute%20uses%20an%20explicit%20'aria-haspopup'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_misuse%22%7D">The &lt;input&gt; element with a missing or invalid type and 'list' attribute uses an explicit 'aria-haspopup' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_haspopup_conflict.html#%7B%22message%22%3A%22The%20list%20attribute%20for%20the%20%3Cinput%3E%20element%20is%20invalid%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_list_notexist%22%7D">The list attribute for the &lt;input&gt; element is invalid</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_haspopup_conflict.html#%7B%22message%22%3A%22The%20list%20attribute%20for%20the%20%3Cinput%3E%20element%20with%20the%20type%20%5C%22%7B0%7D%5C%22%20is%20invalid%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid_list_type%22%7D">The list attribute for the &lt;input&gt; element with the type "{0}" is invalid</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_haspopup_conflict.html#%7B%22message%22%3A%22The%20list%20attribute%20for%20the%20%3Cinput%3E%20element%20does%20not%20reference%20a%20datalist%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid_list_elem%22%7D">The list attribute for the &lt;input&gt; element does not reference a datalist element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_role_valid</strong>: ARIA roles must be valid for the element to which they are assigned + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_role_valid.html#%7B%22message%22%3A%22The%20ARIA%20role%20'%7B0%7D'%20is%20not%20valid%20for%20the%20element%20%3C%7B1%7D%3E%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The ARIA role '{0}' is not valid for the element &lt;{1}&gt;</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_role_valid.html#%7B%22message%22%3A%22The%20ARIA%20role%20'%7B0%7D'%20is%20not%20valid%20for%20the%20element%20%3C%7B1%7D%3E%20and%20may%20be%20ignored%20by%20the%20browser%20since%20the%20element%20is%20focusable%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The ARIA role '{0}' is not valid for the element &lt;{1}&gt; and may be ignored by the browser since the element is focusable</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>combobox_autocomplete_valid</strong>: A combobox that supports autocompletion behavior must have the 'aria-autocomplete' attribute only on its text input element with a valid value; a value of '"inline"' is not supported + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_autocomplete_valid.html#%7B%22message%22%3A%22The%20combobox%20has%20the%20'aria-autocomplete'%20attribute%20incorrectly%20set%20on%20an%20element%20within%20the%20popup%20referenced%20by%20%5C%22%7B0%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The combobox has the 'aria-autocomplete' attribute incorrectly set on an element within the popup referenced by "{0}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_autocomplete_valid.html#%7B%22message%22%3A%22The%20combobox%20does%20not%20support%20an%20'aria-autocomplete'%20attribute%20value%20set%20to%20'%5C%22inline%5C%22'%20%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_inline%22%7D">The combobox does not support an 'aria-autocomplete' attribute value set to '"inline"' </a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>combobox_focusable_elements</strong>: Tabbable focus for the combobox must be allowed only on the text input, except when using a dialog popup + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_focusable_elements.html#%7B%22message%22%3A%22The%20combobox%20element%20does%20not%20allow%20DOM%20focus%20as%20required%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_not_tabbable%22%7D">The combobox element does not allow DOM focus as required</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_focusable_elements.html#%7B%22message%22%3A%22The%20popup%20of%20the%20combobox%20has%20DOM%20focus%20or%20has%20'aria-activedescendant'%20defined%2C%20which%20is%20not%20allowed%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_tabbable_child%22%7D">The popup of the combobox has DOM focus or has 'aria-activedescendant' defined, which is not allowed</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>combobox_haspopup_valid</strong>: The combobox attribute 'aria-haspopup' value must be appropriate for the role of the element referenced by 'aria-controls' (ARIA 1.2) or 'aria-owns' (ARIA 1.0) + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_haspopup_valid.html#%7B%22message%22%3A%22The%20'role'%20value%20%5C%22%7B0%7D%5C%22%20of%20the%20popup%20element%20%5C%22%7B1%7D%5C%22%20should%20be%20one%20of%20%5C%22listbox%5C%22%2C%20%5C%22grid%5C%22%2C%20%5C%22tree%5C%22%20or%20%5C%22dialog%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_popup_role_invalid%22%7D">The 'role' value "{0}" of the popup element "{1}" should be one of "listbox", "grid", "tree" or "dialog"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_haspopup_valid.html#%7B%22message%22%3A%22The%20value%20of%20the%20combobox%20'aria-haspopup'%20attribute%20%5C%22%7B0%7D%5C%22%20does%20not%20match%20the%20'role'%20value%20of%20the%20popup%20element%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_combobox_popup_role_mismatch%22%7D">The value of the combobox 'aria-haspopup' attribute "{0}" does not match the 'role' value of the popup element "{1}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>element_tabbable_role_valid</strong>: A tabbable element must have a valid widget role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_tabbable_role_valid.html#%7B%22message%22%3A%22The%20tabbable%20element's%20role%20'%7B0%7D'%20is%20not%20a%20widget%20role%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid_role%22%7D">The tabbable element's role '{0}' is not a widget role</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_tabbable_role_valid.html#%7B%22message%22%3A%22The%20tabbable%20element%20does%20not%20have%20a%20valid%20widget%20role%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_valid_role%22%7D">The tabbable element does not have a valid widget role</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_label_exists</strong>: Each form control must have an associated label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_exists.html#%7B%22message%22%3A%22Form%20control%20element%20%3C%7B0%7D%3E%20has%20no%20associated%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Form control element &lt;{0}&gt; has no associated label</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_exists.html#%7B%22message%22%3A%22Form%20control%20with%20%5C%22%7B0%7D%5C%22%20role%20has%20no%20associated%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Form control with "{0}" role has no associated label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_descendant_valid</strong>: Browsers ignore the explicit and implicit ARIA roles of the descendants of certain elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_descendant_valid.html#%7B%22message%22%3A%22The%20element%20with%20role%20%5C%22%7B0%7D%5C%22%20contains%20descendants%20with%20implicit%20roles%20%5C%22%7B1%7D%5C%22%20which%20are%20ignored%20by%20browsers%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_child_implicit_role%22%7D">The element with role "{0}" contains descendants with implicit roles "{1}" which are ignored by browsers</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_descendant_valid.html#%7B%22message%22%3A%22The%20element%20with%20role%20%5C%22%7B0%7D%5C%22%20contains%20descendants%20with%20roles%20%5C%22%7B1%7D%5C%22%20which%20are%20ignored%20by%20browsers%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_child_explicit_role%22%7D">The element with role "{0}" contains descendants with roles "{1}" which are ignored by browsers</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_role_allowed</strong>: Elements must have a valid 'role' per ARIA specification + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_role_allowed.html#%7B%22message%22%3A%22The%20role%20'%7B0%7D'%20defined%20on%20the%20element%20is%20not%20valid%20per%20ARIA%20specification%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The role '{0}' defined on the element is not valid per ARIA specification</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_role_allowed.html#%7B%22message%22%3A%22Some%20of%20the%20roles%2C%20'%7B0%7D'%2C%20defined%20on%20the%20element%20are%20not%20valid%20per%20ARIA%20specification%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Some of the roles, '{0}', defined on the element are not valid per ARIA specification</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>a_text_purpose</strong>: Hyperlinks must have an accessible name for their purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/a_text_purpose.html#%7B%22message%22%3A%22Hyperlink%20has%20no%20link%20text%2C%20label%20or%20image%20with%20a%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_acc_name%22%7D">Hyperlink has no link text, label or image with a text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_allowed</strong>: ARIA attributes must be valid for the element's role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_allowed.html#%7B%22message%22%3A%22The%20attribute(s)%20'%7B0%7D'%20referenced%20by%20the%20element%20%3C%7B1%7D%3E%20is%20not%20a%20valid%20ARIA%20state%20or%20property%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The attribute(s) '{0}' referenced by the element &lt;{1}&gt; is not a valid ARIA state or property</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_conflict</strong>: An ARIA attribute must not conflict with the corresponding HTML attribute + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_conflict.html#%7B%22message%22%3A%22The%20ARIA%20attribute%20%5C%22%7B0%7D%5C%22%20is%20in%20conflict%20with%20the%20corresponding%20HTML%20attribute%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_conflict%22%7D">The ARIA attribute "{0}" is in conflict with the corresponding HTML attribute "{1}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_exists</strong>: When specifying a required ARIA attribute, the value must not be empty + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_exists.html#%7B%22message%22%3A%22The%20element%20attribute(s)%3A%20'%7B0%7D'%20value%20is%20empty%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_empty_attribute%22%7D">The element attribute(s): '{0}' value is empty</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_required</strong>: The required attributes for the element with a role must be defined + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_required.html#%7B%22message%22%3A%22Element%20with%20'%7B0%7D'%20role%20does%20not%20have%20the%20required%20ARIA%20attribute(s)%3A%20'%7B1%7D'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_missing%22%7D">Element with '{0}' role does not have the required ARIA attribute(s): '{1}'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_value_valid</strong>: ARIA property values must be valid + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_value_valid.html#%7B%22message%22%3A%22The%20value%20%5C%22%7B0%7D%5C%22%20specified%20for%20attribute%20'%7B1%7D'%20on%20element%20%3C%7B2%7D%3E%20is%20not%20valid%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The value "{0}" specified for attribute '{1}' on element &lt;{2}&gt; is not valid</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_eventhandler_role_valid</strong>: Elements with event handlers must have a valid ARIA role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_eventhandler_role_valid.html#%7B%22message%22%3A%22The%20%3C%7B0%7D%3E%20element%20with%20'%7B1%7D'%20does%20not%20have%20a%20valid%20ARIA%20role%20specified%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;{0}&gt; element with '{1}' does not have a valid ARIA role specified</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_hidden_nontabbable</strong>: A hidden element should not contain any tabbable elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_hidden_nontabbable.html#%7B%22message%22%3A%22Element%20%5C%22%7B0%7D%5C%22%20should%20not%20be%20focusable%20within%20the%20subtree%20of%20an%20element%20with%20an%20'aria-hidden'%20attribute%20with%20value%20'true'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element "{0}" should not be focusable within the subtree of an element with an 'aria-hidden' attribute with value 'true'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_id_unique</strong>: The ARIA property must reference a non-empty unique id of an existing element that is visible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_id_unique.html#%7B%22message%22%3A%22The%20'id'%20%5C%22%7B0%7D%5C%22%20specified%20for%20the%20ARIA%20property%20'%7B1%7D'%20value%20is%20not%20valid%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The 'id' "{0}" specified for the ARIA property '{1}' value is not valid</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_widget_labelled</strong>: Interactive component must have a programmatically associated name + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_widget_labelled.html#%7B%22message%22%3A%22Interactive%20component%20with%20ARIA%20role%20'%7B0%7D'%20does%20not%20have%20a%20programmatically%20associated%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Interactive component with ARIA role '{0}' does not have a programmatically associated name</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>combobox_design_valid</strong>: The combobox design pattern must be valid for ARIA 1.2 + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_design_valid.html#%7B%22message%22%3A%22The%20combobox%20design%20pattern%20is%20detected%20as%20ARIA%201.1%2C%20which%20is%20not%20allowed%20by%20ARIA%201.2%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1.1%22%7D">The combobox design pattern is detected as ARIA 1.1, which is not allowed by ARIA 1.2</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>frame_title_exists</strong>: Inline frames must have a unique, non-empty 'title' attribute + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/frame_title_exists.html#%7B%22message%22%3A%22Inline%20frame%20does%20not%20have%20a%20'title'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Inline frame does not have a 'title' attribute</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>label_content_exists</strong>: A &lt;label&gt; element must have non-empty descriptive text that identifies the purpose of the interactive component + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/label_content_exists.html#%7B%22message%22%3A%22The%20%3Clabel%3E%20element%20does%20not%20have%20descriptive%20text%20that%20identifies%20the%20expected%20input%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;label&gt; element does not have descriptive text that identifies the expected input</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>list_children_valid</strong>: List component with "group" role must limit children to &lt;listitem&gt; elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/list_children_valid.html#%7B%22message%22%3A%22List%20component%20with%20%5C%22group%5C%22%20role%20has%20children%20that%20are%20not%20%3Clistitem%3E%20elements%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">List component with "group" role has children that are not &lt;listitem&gt; elements</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_aria_descendants</strong>: Table structure elements cannot specify an explicit 'role' within table containers + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_aria_descendants.html#%7B%22message%22%3A%22An%20explicit%20ARIA%20'role'%20is%20not%20valid%20for%20%3C%7B0%7D%3E%20element%20within%20an%20ARIA%20role%20'%7B1%7D'%20per%20the%20ARIA%20in%20HTML%20specification%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22explicit_role%22%7D">An explicit ARIA 'role' is not valid for &lt;{0}&gt; element within an ARIA role '{1}' per the ARIA in HTML specification</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_accessiblename_exists</strong>: Elements with certain roles should have accessible names + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_accessiblename_exists.html#%7B%22message%22%3A%22Element%20%3C%7B0%7D%3E%20with%20%5C%22%7B1%7D%5C%22%20role%20has%20no%20accessible%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_accessible_name%22%7D">Element &lt;{0}&gt; with "{1}" role has no accessible name</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_redundant</strong>: An ARIA attribute should not be redundant with a corresponding HTML attribute + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_redundant.html#%7B%22message%22%3A%22The%20ARIA%20attribute%20%5C%22%7B0%7D%5C%22%20is%20redundant%20with%20the%20HTML%20attribute%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_redundant%22%7D">The ARIA attribute "{0}" is redundant with the HTML attribute "{1}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>canvas_content_described</strong>: The &lt;canvas&gt; element may not be accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/canvas_content_described.html#%7B%22message%22%3A%22Verify%20accessibility%20of%20the%20%3Ccanvas%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify accessibility of the &lt;canvas&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>4.1.3 Status Messages [AA]</h2> + <div>In content implemented using markup languages, status messages can be programmatically determined through role or properties such that they can be presented to the user by assistive technologies without receiving focus.</div> + +</div><div> + <h2>HTML specification [NA]</h2> + <div>The HTML specification issues that cause accessibility issues may be covered by other rules and will be reported under those accessibility requirements. However, some non-conforming HTML specification issues are still reported.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>element_accesskey_unique</strong>: 'accesskey' attribute values on each element must be unique for the page + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_accesskey_unique.html#%7B%22message%22%3A%22'accesskey'%20attribute%20value%20on%20the%20element%20is%20not%20unique%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">'accesskey' attribute value on the element is not unique</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>element_id_unique</strong>: Element 'id' attribute values must be unique within a document + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_id_unique.html#%7B%22message%22%3A%22The%20%3C%7B0%7D%3E%20element%20has%20the%20id%20%5C%22%7B1%7D%5C%22%20that%20is%20empty%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_empty%22%7D">The &lt;{0}&gt; element has the id "{1}" that is empty</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_id_unique.html#%7B%22message%22%3A%22The%20%3C%7B0%7D%3E%20element%20has%20the%20id%20%5C%22%7B1%7D%5C%22%20that%20is%20already%20in%20use%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_in_use%22%7D">The &lt;{0}&gt; element has the id "{1}" that is already in use</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>element_attribute_deprecated</strong>: Avoid use of obsolete features if possible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_attribute_deprecated.html#%7B%22message%22%3A%22The%20%3C%7B0%7D%3E%20element%20is%20deprecated%20in%20HTML%205%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_elem%22%7D">The &lt;{0}&gt; element is deprecated in HTML 5</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_attribute_deprecated.html#%7B%22message%22%3A%22The%20HTML%20attribute(s)%20%5C%22%7B0%7D%5C%22%20is%20deprecated%20in%20HTML%205%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_attr%22%7D">The HTML attribute(s) "{0}" is deprecated in HTML 5</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_attribute_deprecated.html#%7B%22message%22%3A%22The%20HTML%20attribute(s)%20%5C%22%7B0%7D%5C%22%20is%20deprecated%20for%20the%20%3C%7B1%7D%3E%20element%20in%20HTML%205%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_elem_attr%22%7D">The HTML attribute(s) "{0}" is deprecated for the &lt;{1}&gt; element in HTML 5</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>ARIA specification [NA]</h2> + <div>The ARIA specification issues that cause accessibility issues may be covered by other rules and will be reported under those accessibility requirements. However, some non-conforming ARIA specification issues are still reported.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>aria_attribute_valid</strong>: ARIA attributes should be valid for the element and ARIA role to which they are assigned + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_valid.html#%7B%22message%22%3A%22The%20ARIA%20attributes%20%5C%22%7B0%7D%5C%22%20are%20not%20valid%20for%20the%20element%20%3C%7B1%7D%3E%20with%20ARIA%20role%20%5C%22%7B2%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_invalid_role_attr%22%7D">The ARIA attributes "{0}" are not valid for the element &lt;{1}&gt; with ARIA role "{2}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_valid.html#%7B%22message%22%3A%22The%20ARIA%20attributes%20%5C%22%7B0%7D%5C%22%20are%20not%20valid%20for%20the%20element%20%3C%7B1%7D%3E%20with%20implicit%20ARIA%20role%20%5C%22%7B2%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_invalid_implicit_role_attr%22%7D">The ARIA attributes "{0}" are not valid for the element &lt;{1}&gt; with implicit ARIA role "{2}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_null</strong>: When the intent is to mark an image as decorative with an empty 'alt' attribute, the 'aria' or 'title' attributes should not be used + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_null.html#%7B%22message%22%3A%22The%20image%20'alt'%20attribute%20is%20empty%2C%20but%20the%20'aria'%20label%20is%20not%20empty%20and%20overrides%20the%20'alt'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_aria_override%22%7D">The image 'alt' attribute is empty, but the 'aria' label is not empty and overrides the 'alt' attribute</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_deprecated</strong>: No deprecated ARIA role or attribute should be used + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_deprecated.html#%7B%22message%22%3A%22The%20ARIA%20role%20%5C%22%7B0%7D%5C%22%20is%20deprecated%20in%20the%20ARIA%20specification%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_aria_role%22%7D">The ARIA role "{0}" is deprecated in the ARIA specification</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_deprecated.html#%7B%22message%22%3A%22The%20ARIA%20attributes%20%5C%22%7B0%7D%5C%22%20are%20deprecated%20in%20the%20ARIA%20specification%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_aria_attr%22%7D">The ARIA attributes "{0}" are deprecated in the ARIA specification</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_deprecated.html#%7B%22message%22%3A%22The%20ARIA%20attributes%20%5C%22%7B0%7D%5C%22%20are%20deprecated%20for%20the%20role%20%5C%22%7B1%7D%5C%22%20in%20the%20ARIA%20specification%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_role_attr%22%7D">The ARIA attributes "{0}" are deprecated for the role "{1}" in the ARIA specification</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_accessiblename_exists</strong>: Elements with certain roles should have accessible names + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_accessiblename_exists.html#%7B%22message%22%3A%22Element%20%3C%7B0%7D%3E%20with%20%5C%22%7B1%7D%5C%22%20role%20has%20no%20accessible%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_accessible_name_image%22%7D">Element &lt;{0}&gt; with "{1}" role has no accessible name</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_role_redundant</strong>: An explicitly-assigned ARIA role should not be redundant with the implicit role of the element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_role_redundant.html#%7B%22message%22%3A%22The%20explicitly-assigned%20ARIA%20role%20%5C%22%7B0%7D%5C%22%20is%20redundant%20with%20the%20implicit%20role%20of%20the%20element%20%3C%7B1%7D%3E%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_redundant%22%7D">The explicitly-assigned ARIA role "{0}" is redundant with the implicit role of the element &lt;{1}&gt;</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div> + </div><div id="WCAG_2_2" style="padding: 1rem; display:none"> +<div> + <h2>1.1.1 Non-text Content [A]</h2> + <div>All non-text content that is presented to the user has a text alternative that serves the equivalent purpose.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>applet_alt_exists</strong>: &lt;applet&gt; elements must provide an 'alt' attribute and an alternative description + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/applet_alt_exists.html#%7B%22message%22%3A%22An%20%3Capplet%3E%20element%20does%20not%20have%20an%20'alt'%20attribute%20that%20provides%20a%20short%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">An &lt;applet&gt; element does not have an 'alt' attribute that provides a short text alternative</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/applet_alt_exists.html#%7B%22message%22%3A%22The%20'alt'%20attribute%20value%20for%20an%20%3Capplet%3E%20element%20duplicates%20the%20'code'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The 'alt' attribute value for an &lt;applet&gt; element duplicates the 'code' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/applet_alt_exists.html#%7B%22message%22%3A%22An%20%3Capplet%3E%20element%20provides%20alternative%20text%2C%20but%20does%20not%20provide%20inner%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">An &lt;applet&gt; element provides alternative text, but does not provide inner content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_redundant</strong>: The text alternative for an image within a link should not repeat the link text or adjacent link text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Link%20text%20is%20repeated%20in%20an%20image%20'alt'%20value%20within%20the%20same%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Link text is repeated in an image 'alt' value within the same link</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Link%20text%20of%20previous%20link%20is%20repeated%20in%20image%20'alt'%20value%20of%20a%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Link text of previous link is repeated in image 'alt' value of a link</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Image%20'alt'%20value%20within%20a%20link%20is%20repeated%20in%20link%20text%20of%20the%20link%20after%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Image 'alt' value within a link is repeated in link text of the link after</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_valid</strong>: Images must have accessible names unless they are decorative or redundant + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_valid.html#%7B%22message%22%3A%22Image%20'alt'%20attribute%20value%20consists%20only%20of%20blank%20space(s)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_blank_alt%22%7D">Image 'alt' attribute value consists only of blank space(s)</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_valid.html#%7B%22message%22%3A%22The%20image%20has%20neither%20an%20accessible%20name%20nor%20is%20marked%20as%20decorative%20or%20redundant%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_alt%22%7D">The image has neither an accessible name nor is marked as decorative or redundant</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_valid.html#%7B%22message%22%3A%22The%20image%20does%20not%20have%20an%20'alt'%20attribute%20or%20ARIA%20label%2C%20and%20the%20'title'%20attribute%20value%20consists%20only%20of%20blank%20space(s)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_blank_title%22%7D">The image does not have an 'alt' attribute or ARIA label, and the 'title' attribute value consists only of blank space(s)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>area_alt_exists</strong>: &lt;area&gt; elements in an image map must have a text alternative + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/area_alt_exists.html#%7B%22message%22%3A%22%3Carea%3E%20element%20in%20an%20image%20map%20has%20no%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">&lt;area&gt; element in an image map has no text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>imagebutton_alt_exists</strong>: The &lt;input&gt; element of type "image" should have a text alternative + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/imagebutton_alt_exists.html#%7B%22message%22%3A%22The%20%3Cinput%3E%20element%20of%20type%20%5C%22image%5C%22%20has%20no%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail%22%7D">The &lt;input&gt; element of type "image" has no text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>imagemap_alt_exists</strong>: An image map and each &lt;area&gt; element in an image map must have text alternative(s) + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/imagemap_alt_exists.html#%7B%22message%22%3A%22Image%20map%20or%20child%20%3Carea%3E%20has%20no%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Image map or child &lt;area&gt; has no text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_decorative</strong>: Image designated as decorative must have 'alt="" + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_decorative.html#%7B%22message%22%3A%22Image%20designated%20as%20decorative%20has%20non-null%20'alt'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Image designated as decorative has non-null 'alt' attribute</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_null</strong>: When the intent is to mark an image as decorative with an empty 'alt' attribute, the 'aria' or 'title' attributes should not be used + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_null.html#%7B%22message%22%3A%22The%20image%20'alt'%20attribute%20is%20empty%2C%20but%20the%20'title'%20attribute%20is%20not%20empty%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_decorative%22%7D">The image 'alt' attribute is empty, but the 'title' attribute is not empty</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>object_text_exists</strong>: &lt;object&gt; element must have a text alternative for the content rendered by the object + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/object_text_exists.html#%7B%22message%22%3A%22An%20%3Cobject%3E%20element%20does%20not%20have%20a%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_text_alternative%22%7D">An &lt;object&gt; element does not have a text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>svg_graphics_labelled</strong>: A non-decorative SVG element must have an accessible name + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/svg_graphics_labelled.html#%7B%22message%22%3A%22The%20SVG%20element%20has%20no%20accessible%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_acc_name%22%7D">The SVG element has no accessible name</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>application_content_accessible</strong>: Non-decorative static text and image content within an element with "application" role must be accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/application_content_accessible.html#%7B%22message%22%3A%22Verify%20that%20the%20non-decorative%20static%20text%20and%20image%20content%20within%20an%20element%20with%20%5C%22application%5C%22%20role%20are%20accessible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the non-decorative static text and image content within an element with "application" role are accessible</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_misuse</strong>: 'alt' attribute value must be a good inline replacement for the image + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_misuse.html#%7B%22message%22%3A%22Verify%20that%20the%20file%20name%20serves%20as%20a%20good%20inline%20replacement%20for%20the%20image%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the file name serves as a good inline replacement for the image</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_ismap_misuse</strong>: Server-side image map hot-spots must have duplicate text links + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_ismap_misuse.html#%7B%22message%22%3A%22Server-side%20image%20map%20hot-spots%20do%20not%20have%20duplicate%20text%20links%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Server-side image map hot-spots do not have duplicate text links</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_longdesc_misuse</strong>: The 'longdesc' attribute must reference HTML content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_longdesc_misuse.html#%7B%22message%22%3A%22Verify%20that%20the%20file%20designated%20by%20the%20'longdesc'%20attribute%20contains%20valid%20HTML%20content%20(file%20extension%20not%20recognized)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the file designated by the 'longdesc' attribute contains valid HTML content (file extension not recognized)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>media_alt_exists</strong>: Audio or video on the page must have a short text alternative that describes the media content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_alt_exists.html#%7B%22message%22%3A%22Filename%20used%20as%20label%20for%20embedded%20audio%20or%20video%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Filename used as label for embedded audio or video</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>style_background_decorative</strong>: Images included by using CSS alone must not convey important information + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_background_decorative.html#%7B%22message%22%3A%22Verify%20the%20CSS%20background%20image%20does%20not%20convey%20important%20information%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify the CSS background image does not convey important information</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>figure_label_exists</strong>: A &lt;figure&gt; element must have an associated label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/figure_label_exists.html#%7B%22message%22%3A%22The%20%3Cfigure%3E%20element%20does%20not%20have%20an%20associated%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;figure&gt; element does not have an associated label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>embed_alt_exists</strong>: Provide alternative content for &lt;embed&gt; elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/embed_alt_exists.html#%7B%22message%22%3A%22Verify%20that%20the%20%3Cembed%3E%20element%20has%20alternative%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the &lt;embed&gt; element has alternative content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>media_alt_brief</strong>: Alternative text in 'alt' attribute should be brief (&lt;150 characters) + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_alt_brief.html#%7B%22message%22%3A%22Text%20alternative%20is%20more%20than%20150%20characters%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Text alternative is more than 150 characters</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>noembed_content_exists</strong>: &lt;noembed&gt; elements should contain descriptive text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/noembed_content_exists.html#%7B%22message%22%3A%22Add%20descriptive%20text%20to%20the%20%3Cnoembed%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Add descriptive text to the &lt;noembed&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>canvas_content_described</strong>: The &lt;canvas&gt; element may not be accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/canvas_content_described.html#%7B%22message%22%3A%22Verify%20accessibility%20of%20the%20%3Ccanvas%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify accessibility of the &lt;canvas&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_background</strong>: Background images that convey important information must have a text alternative that describes the image + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_background.html#%7B%22message%22%3A%22Verify%20important%20background%20image%20information%20has%20a%20text%20alternative%20in%20system%20high%20contrast%20mode%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify important background image information has a text alternative in system high contrast mode</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>style_highcontrast_visible</strong>: Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_highcontrast_visible.html#%7B%22message%22%3A%22Confirm%20Windows%20high%20contrast%20mode%20is%20supported%20when%20using%20CSS%20to%20include%2C%20position%20or%20alter%20non-decorative%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Confirm Windows high contrast mode is supported when using CSS to include, position or alter non-decorative content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.2.1 Audio-only and Video-only (Prerecorded) [A]</h2> + <div>For prerecorded audio-only or video-only media, an alternative provides equivalent information.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>media_audio_transcribed</strong>: Audio information should also be available in text form + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_audio_transcribed.html#%7B%22message%22%3A%22Provide%20transcripts%20for%20audio%20files%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Provide transcripts for audio files</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.2.2 Captions (Prerecorded) [A]</h2> + <div>Captions are provided for all prerecorded audio content in synchronized media.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>caption_track_exists</strong>: A &lt;video&gt; element must have a text alternative for any meaningful audio content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/caption_track_exists.html#%7B%22message%22%3A%22Verify%20that%20captions%20are%20available%20for%20any%20meaningful%20audio%20or%20provide%20a%20caption%20track%20for%20the%20%3Cvideo%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that captions are available for any meaningful audio or provide a caption track for the &lt;video&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.2.3 Audio Description or Media Alternative (Prerecorded) [A]</h2> + <div>An alternative for time-based media or audio description of the prerecorded video content is provided for synchronized media.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>media_track_available</strong>: Pre-recorded media should have an audio track that describes visual information + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_track_available.html#%7B%22message%22%3A%22Verify%20availability%20of%20a%20user-selectable%20audio%20track%20with%20description%20of%20visual%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify availability of a user-selectable audio track with description of visual content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.2.4 Captions (Live) [AA]</h2> + <div>Captions are provided for all live audio content in synchronized media.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>media_live_captioned</strong>: Live media (streaming video with audio) should have captions for audio content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_live_captioned.html#%7B%22message%22%3A%22Verify%20captions%20are%20provided%20for%20live%20media%20(streaming%20video%20with%20audio)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify captions are provided for live media (streaming video with audio)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.2.5 Audio Description (Prerecorded) [AA]</h2> + <div>Audio description is provided for all prerecorded video content in synchronized media.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>media_track_available</strong>: Pre-recorded media should have an audio track that describes visual information + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_track_available.html#%7B%22message%22%3A%22Verify%20availability%20of%20a%20user-selectable%20audio%20track%20with%20description%20of%20visual%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify availability of a user-selectable audio track with description of visual content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.3.1 Info and Relationships [A]</h2> + <div>Information, structure, and relationships conveyed through presentation can be programmatically determined or are available in text.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>input_checkboxes_grouped</strong>: Related sets of radio buttons or checkboxes should be programmatically grouped + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22%7B0%7D%20input%20found%20that%20has%20the%20same%20name%2C%20%5C%22%7B2%7D%5C%22%20as%20a%20%7B1%7D%20input%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_controlnamemismatch%22%7D">{0} input found that has the same name, "{2}" as a {1} input</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22%7B0%7D%20input%20is%20not%20in%20the%20group%20with%20another%20%7B0%7D%20with%20the%20name%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_notgroupedothergrouped%22%7D">{0} input is not in the group with another {0} with the name "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22%7B0%7D%20input%20and%20others%20with%20the%20name%20%5C%22%7B1%7D%5C%22%20are%20not%20grouped%20together%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_notgroupedothernotgrouped%22%7D">{0} input and others with the name "{1}" are not grouped together</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22%7B0%7D%20input%20is%20in%20a%20different%20group%20than%20another%20%7B0%7D%20with%20the%20name%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_notsamegroup%22%7D">{0} input is in a different group than another {0} with the name "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22Verify%20that%20this%20ungrouped%20checkbox%20input%20is%20not%20related%20to%20other%20checkboxes%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_lonecheckbox%22%7D">Verify that this ungrouped checkbox input is not related to other checkboxes</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22Verify%20that%20this%20un-named%2C%20ungrouped%20checkbox%20input%20is%20not%20related%20to%20other%20checkboxes%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_unnamedcheckbox%22%7D">Verify that this un-named, ungrouped checkbox input is not related to other checkboxes</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_headers_ref_valid</strong>: The 'headers' attribute should refer to a valid cell in the same table + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_ref_valid.html#%7B%22message%22%3A%22The%20'headers'%20attribute%20value%20%5C%22%7B0%7D%5C%22%20does%20not%20reference%20a%20valid%20'id'%20in%20this%20document%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The 'headers' attribute value "{0}" does not reference a valid 'id' in this document</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_ref_valid.html#%7B%22message%22%3A%22The%20'headers'%20attribute%20value%20%5C%22%7B0%7D%5C%22%20refers%20to%20itself%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The 'headers' attribute value "{0}" refers to itself</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_ref_valid.html#%7B%22message%22%3A%22The%20'headers'%20attribute%20value%20%5C%22%7B0%7D%5C%22%20does%20not%20refer%20to%20a%20cell%20in%20the%20same%20table%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">The 'headers' attribute value "{0}" does not refer to a cell in the same table</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_ref_valid.html#%7B%22message%22%3A%22The%20'headers'%20attribute%20value%20%5C%22%7B0%7D%5C%22%20does%20not%20refer%20to%20a%20cell%20indicated%20with%20%3Cth%3E%20or%20a%20role%20of%20%5C%22columnheader%5C%22%20or%20%5C%22rowheader%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_4%22%7D">The 'headers' attribute value "{0}" does not refer to a cell indicated with &lt;th&gt; or a role of "columnheader" or "rowheader"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>fieldset_label_valid</strong>: Groups with nested inputs must have unique accessible name + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_label_valid.html#%7B%22message%22%3A%22Group%2FFieldset%20does%20not%20have%20an%20accessible%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Group/Fieldset does not have an accessible name</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_label_valid.html#%7B%22message%22%3A%22Group%2FFieldset%20%5C%22%7B0%7D%5C%22%20has%20a%20duplicate%20name%20to%20another%20group%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Group/Fieldset "{0}" has a duplicate name to another group</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_scope_valid</strong>: Value for 'scope' attribute must be "row", "col", "rowgroup", or "colgroup" + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_scope_valid.html#%7B%22message%22%3A%22Value%20provided%20is%20invalid%20for%20the%20'scope'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Value provided is invalid for the 'scope' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_scope_valid.html#%7B%22message%22%3A%22The%20'scope'%20attribute%20should%20only%20be%20used%20on%20a%20%3Cth%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The 'scope' attribute should only be used on a &lt;th&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_banner_label_unique</strong>: Each element with "banner" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_banner_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22banner%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "banner" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_banner_single</strong>: A page, document, or application should only have one element with "banner" role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_banner_single.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22banner%5C%22%20role%20found%20on%20the%20page%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "banner" role found on the page</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_complementary_label_unique</strong>: Each element with "complementary" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_complementary_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22complementary%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "complementary" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_complementary_labelled</strong>: Each element with "complementary" role must have a label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_complementary_labelled.html#%7B%22message%22%3A%22Element%20with%20%5C%22complementary%5C%22%20role%20does%20not%20have%20a%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "complementary" role does not have a label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_contentinfo_label_unique</strong>: Each element with "contentinfo" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_contentinfo_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22contentinfo%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "contentinfo" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_contentinfo_single</strong>: A page, document, or application should only have one element with "contentinfo" role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_contentinfo_single.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22contentinfo%5C%22%20role%20found%20on%20the%20page%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "contentinfo" role found on the page</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_form_label_unique</strong>: Each element with "form" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_form_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22form%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "form" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_hidden_nontabbable</strong>: A hidden element should not contain any tabbable elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_hidden_nontabbable.html#%7B%22message%22%3A%22Element%20%5C%22%7B0%7D%5C%22%20should%20not%20be%20focusable%20within%20the%20subtree%20of%20an%20element%20with%20an%20'aria-hidden'%20attribute%20with%20value%20'true'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element "{0}" should not be focusable within the subtree of an element with an 'aria-hidden' attribute with value 'true'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_main_label_unique</strong>: Each element with "main" role must have unique label that describes its purposes + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_main_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22main%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "main" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_navigation_label_unique</strong>: Each element with "navigation" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_navigation_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22navigation%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "navigation" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_parent_required</strong>: Each element with an implicit or explicit role must be contained within a valid element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_parent_required.html#%7B%22message%22%3A%22Element%20with%20%5C%22%7B0%7D%5C%22%20role%20is%20not%20contained%20in%20or%20owned%20by%20an%20element%20with%20one%20of%20the%20following%20roles%3A%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "{0}" role is not contained in or owned by an element with one of the following roles: "{1}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_region_label_unique</strong>: Each element with "region" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_region_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22region%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "region" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_region_labelled</strong>: Each element with "region" role must have a label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_region_labelled.html#%7B%22message%22%3A%22Element%20with%20%5C%22region%5C%22%20role%20does%20not%20have%20a%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "region" role does not have a label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>form_label_unique</strong>: Form controls should have exactly one label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/form_label_unique.html#%7B%22message%22%3A%22Form%20control%20has%20more%20than%20one%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Form control has more than one label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>label_ref_valid</strong>: The 'for' attribute for a label should reference a non-empty, unique 'id' attribute of a valid element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/label_ref_valid.html#%7B%22message%22%3A%22The%20value%20%5C%22%7B0%7D%5C%22%20of%20the%20'for'%20attribute%20is%20not%20the%20'id'%20of%20a%20valid%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid%22%7D">The value "{0}" of the 'for' attribute is not the 'id' of a valid element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_caption_empty</strong>: A &lt;caption&gt; element for a &lt;table> element must contain descriptive text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_caption_empty.html#%7B%22message%22%3A%22The%20%3Ctable%3E%20element%20has%20an%20empty%20%3Ccaption%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;table&gt; element has an empty &lt;caption> element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_caption_nested</strong>: The &lt;caption&gt; element must be nested inside the associated &lt;table> element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_caption_nested.html#%7B%22message%22%3A%22%3Ccaption%3E%20element%20is%20not%20nested%20inside%20a%20%3Ctable%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">&lt;caption&gt; element is not nested inside a &lt;table> element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_headers_exists</strong>: Data table must identify headers + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_exists.html#%7B%22message%22%3A%22Table%20has%20no%20headers%20identified%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Table has no headers identified</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_headers_related</strong>: For a complex data table, all &lt;th&gt; and &lt;td> elements must be related via 'header' or 'scope' attributes + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_related.html#%7B%22message%22%3A%22Complex%20table%20does%20not%20have%20headers%20for%20each%20cell%20properly%20defined%20with%20'header'%20or%20'scope'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Complex table does not have headers for each cell properly defined with 'header' or 'scope'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_structure_misuse</strong>: Table elements with 'role="presentation" or 'role="none" should not have structural elements or attributes + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_structure_misuse.html#%7B%22message%22%3A%22The%20%3C%7B0%7D%3E%20element%20with%20%5C%22presentation%5C%22%20role%20or%20%5C%22none%5C%22%20role%20has%20structural%20element(s)%20and%2For%20attribute(s)%20'%7B1%7D'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;{0}&gt; element with "presentation" role or "none" role has structural element(s) and/or attribute(s) '{1}'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_summary_redundant</strong>: The table summary must not duplicate the caption + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_summary_redundant.html#%7B%22message%22%3A%22The%20table%20summary%20duplicates%20the%20caption%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The table summary duplicates the caption</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>blockquote_cite_exists</strong>: Use &lt;blockquote&gt; only for quotations, not indentation + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/blockquote_cite_exists.html#%7B%22message%22%3A%22Verify%20that%20%3Cblockquote%3E%20should%20have%20a%20'cite'%20attribute%20and%20not%20be%20used%20for%20indentation%20only%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that &lt;blockquote&gt; should have a 'cite' attribute and not be used for indentation only</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>heading_markup_misuse</strong>: Heading elements must not be used for presentation + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/heading_markup_misuse.html#%7B%22message%22%3A%22Verify%20that%20the%20heading%20element%20is%20a%20genuine%20heading%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the heading element is a genuine heading</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>list_markup_review</strong>: Proper HTML elements should be used to create a list + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/list_markup_review.html#%7B%22message%22%3A%22Verify%20this%20is%20a%20list%20and%20if%20so%2C%20modify%20to%20use%20proper%20HTML%20elements%20for%20the%20list%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_list%22%7D">Verify this is a list and if so, modify to use proper HTML elements for the list</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>text_block_heading</strong>: Heading text should use a heading element or role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_block_heading.html#%7B%22message%22%3A%22Confirm%20this%20text%20'%7B0%7D'%20is%20used%20as%20a%20heading%20and%20if%20so%2C%20modify%20to%20use%20a%20heading%20element%20or%20role%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_heading%22%7D">Confirm this text '{0}' is used as a heading and if so, modify to use a heading element or role</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>text_quoted_correctly</strong>: Quotations should be marked with &lt;q&gt; or &lt;blockquote> elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_quoted_correctly.html#%7B%22message%22%3A%22If%20the%20following%20text%20is%20a%20quotation%2C%20mark%20it%20as%20a%20%3Cq%3E%20or%20%3Cblockquote%3E%20element%3A%20%7B0%7D%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">If the following text is a quotation, mark it as a &lt;q&gt; or &lt;blockquote> element: {0}</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>fieldset_legend_valid</strong>: &lt;fieldset&gt; elements should have a single, non-empty &lt;legend> as a label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_legend_valid.html#%7B%22message%22%3A%22%3Cfieldset%3E%20element%20does%20not%20have%20a%20%3Clegend%3E%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">&lt;fieldset&gt; element does not have a &lt;legend></a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_legend_valid.html#%7B%22message%22%3A%22%3Cfieldset%3E%20element%20has%20more%20than%20one%20%3Clegend%3E%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">&lt;fieldset&gt; element has more than one &lt;legend></a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_legend_valid.html#%7B%22message%22%3A%22%3Cfieldset%3E%20element%20%3Clegend%3E%20is%20empty%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">&lt;fieldset&gt; element &lt;legend> is empty</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_child_valid</strong>: An element with an ARIA role must own a required child + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_child_valid.html#%7B%22message%22%3A%22The%20element%20with%20role%20%5C%22%7B0%7D%5C%22%20does%20not%20own%20any%20child%20element%20with%20any%20of%20the%20following%20role(s)%3A%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_no_child%22%7D">The element with role "{0}" does not own any child element with any of the following role(s): "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_child_valid.html#%7B%22message%22%3A%22The%20element%20with%20role%20%5C%22%7B0%7D%5C%22%20owns%20the%20child%20element%20with%20the%20role%20%5C%22%7B1%7D%5C%22%20that%20is%20not%20one%20of%20the%20allowed%20role(s)%3A%20%5C%22%7B2%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_invalid_child%22%7D">The element with role "{0}" owns the child element with the role "{1}" that is not one of the allowed role(s): "{2}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_complementary_label_visible</strong>: Each element with "complementary" role should have a visible label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_complementary_label_visible.html#%7B%22message%22%3A%22Element%20with%20%5C%22complementary%5C%22%20role%20does%20not%20have%20a%20visible%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "complementary" role does not have a visible label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_content_in_landmark</strong>: All content must reside within an element with a landmark role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_content_in_landmark.html#%7B%22message%22%3A%22Content%20is%20not%20within%20a%20landmark%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Content is not within a landmark element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_contentinfo_misuse</strong>: Each element with "contentinfo" role is only permitted with an element with "main" role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_contentinfo_misuse.html#%7B%22message%22%3A%22Element%20with%20%5C%22contentinfo%5C%22%20role%20is%20present%20without%20an%20element%20with%20%5C%22main%5C%22%20role%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "contentinfo" role is present without an element with "main" role</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_landmark_name_unique</strong>: Each landmark should have a unique 'aria-labelledby' or 'aria-label' or be nested in a different parent region + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_landmark_name_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22%7B0%7D%5C%22%20landmarks%20within%20the%20same%20parent%20region%20are%20not%20distinguished%20from%20one%20another%20because%20they%20have%20the%20same%20%5C%22%7B1%7D%5C%22%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "{0}" landmarks within the same parent region are not distinguished from one another because they have the same "{1}" label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_main_label_visible</strong>: Each element with "main" role should have a unique visible label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_main_label_visible.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22main%5C%22%20role%20do%20not%20have%20unique%20visible%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "main" role do not have unique visible labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_fields_grouped</strong>: Groups of logically related input elements should be contained within a &lt;fieldset&gt; element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_fields_grouped.html#%7B%22message%22%3A%22Use%20the%20%3Cfieldset%3E%20element%20to%20group%20logically%20related%20input%20elements%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Use the &lt;fieldset&gt; element to group logically related input elements</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>list_structure_proper</strong>: List elements should only be used for lists of related items + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/list_structure_proper.html#%7B%22message%22%3A%22List%20element%20is%20missing%20or%20improperly%20structured%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">List element is missing or improperly structured</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>select_options_grouped</strong>: Groups of related options within a selection list should be grouped with &lt;optgroup&gt; + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/select_options_grouped.html#%7B%22message%22%3A%22Group%20of%20related%20options%20may%20need%20%3Coptgroup%3E%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Group of related options may need &lt;optgroup&gt;</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_layout_linearized</strong>: Avoid using tables to format text documents in columns unless the table can be linearized + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_layout_linearized.html#%7B%22message%22%3A%22Verify%20table%20is%20not%20being%20used%20to%20format%20text%20content%20in%20columns%20unless%20the%20table%20can%20be%20linearized%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify table is not being used to format text content in columns unless the table can be linearized</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.3.2 Meaningful Sequence [A]</h2> + <div>When the sequence in which content is presented affects its meaning, a correct reading sequence can be programmatically determined.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>dir_attribute_valid</strong>: 'dir' attribute value must be "ltr", "rtl", or "auto" + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/dir_attribute_valid.html#%7B%22message%22%3A%22Invalid%20value%20used%20for%20the%20'dir'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Invalid value used for the 'dir' attribute</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>text_whitespace_valid</strong>: Space characters should not be used to control spacing within a word + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_whitespace_valid.html#%7B%22message%22%3A%22Space%20characters%20should%20not%20be%20used%20to%20create%20space%20between%20the%20letters%20of%20a%20word%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_text%22%7D">Space characters should not be used to create space between the letters of a word</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>style_highcontrast_visible</strong>: Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_highcontrast_visible.html#%7B%22message%22%3A%22Confirm%20Windows%20high%20contrast%20mode%20is%20supported%20when%20using%20CSS%20to%20include%2C%20position%20or%20alter%20non-decorative%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Confirm Windows high contrast mode is supported when using CSS to include, position or alter non-decorative content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.3.3 Sensory Characteristics [A]</h2> + <div>Instructions provided for understanding and operating content do not rely solely on sensory characteristics of components such as shape, size, visual location, orientation, or sound.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>text_sensory_misuse</strong>: Instructions should be meaningful without relying solely on shape, size, or location words + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_sensory_misuse.html#%7B%22message%22%3A%22Confirm%20the%20word(s)%20'%7B0%7D'%20of%20the%20user%20instruction%20is%20used%20to%20indicate%20a%20logical%20rather%20than%20visual%20position%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_position%22%7D">Confirm the word(s) '{0}' of the user instruction is used to indicate a logical rather than visual position</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_sensory_misuse.html#%7B%22message%22%3A%22Confirm%20the%20user%20instruction%20is%20still%20understandable%20without%20the%20word(s)%20'%7B0%7D'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_other%22%7D">Confirm the user instruction is still understandable without the word(s) '{0}'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.3.4 Orientation [AA]</h2> + <div>Content does not restrict its view and operation to a single display orientation, such as portrait or landscape.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>element_orientation_unlocked</strong>: Elements should not be restricted to either landscape or portrait orientation using CSS transform property + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_orientation_unlocked.html#%7B%22message%22%3A%22The%20element%20%3C%7B0%7D%3E%20is%20restricted%20to%20either%20landscape%20or%20portrait%20orientation%20using%20CSS%20transform%20property%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_locked%22%7D">The element &lt;{0}&gt; is restricted to either landscape or portrait orientation using CSS transform property</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.3.5 Identify Input Purpose [AA]</h2> + <div>The purpose of each input field that collects information about the user can be programmatically determined when the field serves a common purpose.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>input_autocomplete_valid</strong>: The 'autocomplete' attribute's token(s) must be appropriate for the input form field + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_autocomplete_valid.html#%7B%22message%22%3A%22The%20'autocomplete'%20attribute's%20token(s)%20are%20not%20appropriate%20for%20the%20input%20form%20field%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_inappropriate%22%7D">The 'autocomplete' attribute's token(s) are not appropriate for the input form field</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_autocomplete_valid.html#%7B%22message%22%3A%22The%20'autocomplete'%20attribute's%20token(s)%20are%20not%20appropriate%20for%20an%20input%20form%20field%20of%20any%20type%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid%22%7D">The 'autocomplete' attribute's token(s) are not appropriate for an input form field of any type</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_autocomplete_valid.html#%7B%22message%22%3A%22The%20'autocomplete'%20attribute%20has%20an%20incorrect%20value%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_incorrect%22%7D">The 'autocomplete' attribute has an incorrect value</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.1 Use of Color [A]</h2> + <div>Color is not used as the only visual means of conveying information, indicating an action, prompting a response, or distinguishing a visual element.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>form_font_color</strong>: Combine color and descriptive markup to indicate required form fields + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/form_font_color.html#%7B%22message%22%3A%22Check%20color%20is%20not%20used%20as%20the%20only%20visual%20means%20to%20convey%20which%20fields%20are%20required%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Check color is not used as the only visual means to convey which fields are required</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>style_color_misuse</strong>: Combine color and descriptive markup to convey information + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_color_misuse.html#%7B%22message%22%3A%22Verify%20color%20is%20not%20used%20as%20the%20only%20visual%20means%20of%20conveying%20information%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify color is not used as the only visual means of conveying information</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.2 Audio Control [A]</h2> + <div>If any audio plays automatically for more than 3 seconds, either a mechanism is available to pause or stop the audio, or a mechanism is available to control audio volume independently from the overall system volume level.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>media_autostart_controllable</strong>: Mechanism must be available to pause or stop and control the volume of the audio that plays automatically + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_autostart_controllable.html#%7B%22message%22%3A%22Verify%20there%20is%20a%20mechanism%20to%20pause%20or%20stop%20and%20control%20the%20volume%20for%20the%20audio%20that%20plays%20automatically%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify there is a mechanism to pause or stop and control the volume for the audio that plays automatically</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.3 Contrast (Minimum) [AA]</h2> + <div>The visual presentation of text and images of text has a contrast ratio of at least 4.5:1, with a 3:1 ratio for large-scale text.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>text_contrast_sufficient</strong>: The contrast ratio of text with its background must meet WCAG AA requirements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_contrast_sufficient.html#%7B%22message%22%3A%22Text%20contrast%20of%20%7B0%7D%20with%20its%20background%20is%20less%20than%20the%20WCAG%20AA%20minimum%20requirements%20for%20text%20of%20size%20%7B1%7Dpx%20and%20weight%20of%20%7B2%7D%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_contrast%22%7D">Text contrast of {0} with its background is less than the WCAG AA minimum requirements for text of size {1}px and weight of {2}</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_contrast_sufficient.html#%7B%22message%22%3A%22The%20foreground%20text%20and%20its%20background%20color%20are%20both%20detected%20as%20%7B3%7D.%20Verify%20the%20text%20meets%20the%20WCAG%20AA%20requirements%20for%20minimum%20contrast%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_same_color%22%7D">The foreground text and its background color are both detected as {3}. Verify the text meets the WCAG AA requirements for minimum contrast</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_contrast_sufficient.html#%7B%22message%22%3A%22Verify%20the%20contrast%20ratio%20of%20the%20text%20against%20the%20lightest%20and%20the%20darkest%20colors%20of%20the%20background%20meets%20the%20WCAG%20AA%20minimum%20requirements%20for%20text%20of%20size%20%7B1%7Dpx%20and%20weight%20of%20%7B2%7D%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_graphic_background%22%7D">Verify the contrast ratio of the text against the lightest and the darkest colors of the background meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_contrast_sufficient.html#%7B%22message%22%3A%22Verify%20the%20contrast%20ratio%20of%20the%20text%20with%20shadow%20meets%20the%20WCAG%20AA%20minimum%20requirements%20for%20text%20of%20size%20%7B1%7Dpx%20and%20weight%20of%20%7B2%7D%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_text_shadow%22%7D">Verify the contrast ratio of the text with shadow meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.4 Resize text [AA]</h2> + <div>Text can be resized without assistive technology up to 200 percent without loss of content or functionality.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>style_viewport_resizable</strong>: Text must scale up to 200% without loss of content or functionality + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_viewport_resizable.html#%7B%22message%22%3A%22Verify%20that%20text%20sized%20using%20viewport%20units%20can%20be%20resized%20up%20to%20200%25%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that text sized using viewport units can be resized up to 200%</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>meta_viewport_zoomable</strong>: The 'meta[name=viewport]' should not prevent the browser zooming the content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/meta_viewport_zoomable.html#%7B%22message%22%3A%22Confirm%20the%20'meta%5Bname%3Dviewport%5D'%20with%20%5C%22%7B0%7D%5C%22%20can%20be%20zoomed%20by%20user%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_zoomable%22%7D">Confirm the 'meta[name=viewport]' with "{0}" can be zoomed by user</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.5 Images of Text [AA]</h2> + <div>If the technologies being used can achieve the visual presentation, text should not be used to convey information rather than images of text.</div> + +</div><div> + <h2>1.4.10 Reflow [AA]</h2> + <div>Content can reflow without loss of information or functionality, and without requiring scrolling in two dimensions.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>style_viewport_resizable</strong>: Text must scale up to 200% without loss of content or functionality + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_viewport_resizable.html#%7B%22message%22%3A%22Verify%20that%20text%20sized%20using%20viewport%20units%20can%20be%20resized%20up%20to%20200%25%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that text sized using viewport units can be resized up to 200%</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.11 Non-text Contrast [AA]</h2> + <div>The parts of graphical objects required to understand the content, and the visual information required to identify UI components and states, have a contrast ratio of at least 3:1 against adjacent colors.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>style_highcontrast_visible</strong>: Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_highcontrast_visible.html#%7B%22message%22%3A%22Confirm%20Windows%20high%20contrast%20mode%20is%20supported%20when%20using%20CSS%20to%20include%2C%20position%20or%20alter%20non-decorative%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Confirm Windows high contrast mode is supported when using CSS to include, position or alter non-decorative content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.12 Text Spacing [AA]</h2> + <div>No loss of content or functionality occurs when users change letter, word and paragraph spacing, as well as line height.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>text_spacing_valid</strong>: CSS !important should not be used in inline style to control letter or word spacing or line height + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_spacing_valid.html#%7B%22message%22%3A%22CSS%20!important%20should%20not%20be%20used%20in%20inline%20%E2%80%98letter-spacing%E2%80%99%20style%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_letter_spacing_style%22%7D">CSS !important should not be used in inline ‘letter-spacing’ style</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_spacing_valid.html#%7B%22message%22%3A%22CSS%20!important%20should%20not%20be%20used%20in%20inline%20%E2%80%98word-spacing%E2%80%99%20style%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_word_spacing_style%22%7D">CSS !important should not be used in inline ‘word-spacing’ style</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_spacing_valid.html#%7B%22message%22%3A%22CSS%20!important%20should%20not%20be%20used%20in%20inline%20%E2%80%98line-height%E2%80%99%20style%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_line_height_style%22%7D">CSS !important should not be used in inline ‘line-height’ style</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.13 Content on Hover or Focus [AA]</h2> + <div>Where hover or focus actions cause additional content to become visible and hidden, the additional content is dismissable, hoverable and persistent.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>style_hover_persistent</strong>: The pointer should be able to move over content displayed on hover + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_hover_persistent.html#%7B%22message%22%3A%22Confirm%20the%20pointer%20can%20be%20positioned%20over%20the%20displayed%20element%2C%20not%20just%20the%20trigger%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Confirm the pointer can be positioned over the displayed element, not just the trigger</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_hover_persistent.html#%7B%22message%22%3A%22Confirm%20the%20pointer%20can%20be%20positioned%20over%20all%20the%20information%20displayed%20on%20hover%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_2%22%7D">Confirm the pointer can be positioned over all the information displayed on hover</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_hover_persistent.html#%7B%22message%22%3A%22Confirm%20the%20margin%20style%20attribute%20has%20not%20prevented%20the%20pointer%20from%20hovering%20over%20the%20displayed%20element%2C%20not%20just%20the%20trigger%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_3%22%7D">Confirm the margin style attribute has not prevented the pointer from hovering over the displayed element, not just the trigger</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.1.1 Keyboard [A]</h2> + <div>All functionality of the content is operable through a keyboard interface without requiring specific timings for individual keystrokes.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>aria_activedescendant_tabindex_valid</strong>: Element using 'aria-activedescendant' property should be tabbable + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_activedescendant_tabindex_valid.html#%7B%22message%22%3A%22The%20%3C%7B0%7D%3E%20element%20using%20'aria-activedescendant'%20set%20to%20%5C%22%7B1%7D%5C%22%20is%20not%20tabbable%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;{0}&gt; element using 'aria-activedescendant' set to "{1}" is not tabbable</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_child_tabbable</strong>: UI component must have at least one tabbable descendant for keyboard access + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_child_tabbable.html#%7B%22message%22%3A%22None%20of%20the%20descendent%20elements%20with%20%5C%22%7B1%7D%5C%22%20role%20is%20tabbable%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_missing_child%22%7D">None of the descendent elements with "{1}" role is tabbable</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>iframe_interactive_tabbable</strong>: Iframe with interactive content should not be excluded from tab order using tabindex + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/iframe_interactive_tabbable.html#%7B%22message%22%3A%22The%20%3Ciframe%3E%20with%20interactive%20content%20is%20excluded%20from%20tab%20order%20using%20tabindex%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid%22%7D">The &lt;iframe&gt; with interactive content is excluded from tab order using tabindex</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>application_content_accessible</strong>: Non-decorative static text and image content within an element with "application" role must be accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/application_content_accessible.html#%7B%22message%22%3A%22Verify%20that%20the%20non-decorative%20static%20text%20and%20image%20content%20within%20an%20element%20with%20%5C%22application%5C%22%20role%20are%20accessible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the non-decorative static text and image content within an element with "application" role are accessible</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_keyboard_handler_exists</strong>: Interactive WAI_ARIA UI components must provide keyboard access + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_keyboard_handler_exists.html#%7B%22message%22%3A%22Verify%20the%20%3C%7B0%7D%3E%20element%20with%20%5C%22%7B1%7D%5C%22%20role%20has%20keyboard%20access%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_no_keyboard_access%22%7D">Verify the &lt;{0}&gt; element with "{1}" role has keyboard access</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>script_focus_blur_review</strong>: Scripting must not remove focus from content that normally receives focus + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_focus_blur_review.html#%7B%22message%22%3A%22Verify%20script%20does%20not%20remove%20focus%20from%20content%20that%20normally%20receives%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify script does not remove focus from content that normally receives focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>script_onclick_misuse</strong>: Scripts should not be used to emulate links + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_onclick_misuse.html#%7B%22message%22%3A%22Possible%20use%20of%20a%20script%20to%20emulate%20a%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Possible use of a script to emulate a link</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>widget_tabbable_exists</strong>: Component must have at least one tabbable element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/widget_tabbable_exists.html#%7B%22message%22%3A%22Component%20with%20%5C%22%7B0%7D%5C%22%20role%20does%20not%20have%20a%20tabbable%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22fail_no_tabbable%22%7D">Component with "{0}" role does not have a tabbable element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>widget_tabbable_single</strong>: Components with a widget role must have no more than one tabbable element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/widget_tabbable_single.html#%7B%22message%22%3A%22Component%20with%20%5C%22%7B0%7D%5C%22%20role%20has%20more%20than%20one%20tabbable%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_multiple_tabbable%22%7D">Component with "{0}" role has more than one tabbable element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>media_keyboard_controllable</strong>: Media using &lt;audio&gt; and/or &lt;video> elements must have keyboard accessible controls + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_keyboard_controllable.html#%7B%22message%22%3A%22Verify%20media%20using%20%3Caudio%3E%20and%2For%20%3Cvideo%3E%20elements%20have%20keyboard%20accessible%20controls%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify media using &lt;audio&gt; and/or &lt;video> elements have keyboard accessible controls</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>script_onclick_avoid</strong>: Scripts should not be used to emulate links + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_onclick_avoid.html#%7B%22message%22%3A%22Verify%20that%20'onclick'%20events%20are%20not%20used%20in%20script%20to%20emulate%20a%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that 'onclick' events are not used in script to emulate a link</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>canvas_content_described</strong>: The &lt;canvas&gt; element may not be accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/canvas_content_described.html#%7B%22message%22%3A%22Verify%20accessibility%20of%20the%20%3Ccanvas%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify accessibility of the &lt;canvas&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>element_mouseevent_keyboard</strong>: All interactive content with mouse event handlers must have equivalent keyboard access + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_mouseevent_keyboard.html#%7B%22message%22%3A%22Confirm%20the%20%3C%7B0%7D%3E%20element%20with%20mouse%20event%20handler(s)%20'%7B1%7D'%20has%20a%20corresponding%20keyboard%20handler(s)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Confirm the &lt;{0}&gt; element with mouse event handler(s) '{1}' has a corresponding keyboard handler(s)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.1.2 No Keyboard Trap [A]</h2> + <div>If keyboard focus can be moved to a component using a keyboard interface, then focus can be moved away from that component using only a keyboard interface, and, if it requires more than unmodified arrow or tab keys or other standard exit methods, the user is advised of the method for moving focus away.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>download_keyboard_controllable</strong>: File download mechanisms should be keyboard-operable and preserve page focus location + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/download_keyboard_controllable.html#%7B%22message%22%3A%22Verify%20that%20the%20file%20download%20mechanism%20does%20not%20cause%20a%20keyboard%20trap%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify that the file download mechanism does not cause a keyboard trap</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.1.4 Character Key Shortcuts [A]</h2> + <div>If a keyboard shortcut is implemented using only letter, punctuation, number or symbol characters, then the shortcut can be turned off, remapped or activated only on focus.</div> + +</div><div> + <h2>2.2.1 Timing Adjustable [A]</h2> + <div>For each time limit that is set by the content, the user can turn off, adjust, or extend the limit.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>meta_refresh_delay</strong>: Pages should not refresh automatically + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/meta_refresh_delay.html#%7B%22message%22%3A%22Verify%20page%20is%20not%20being%20caused%20to%20refresh%20automatically%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_refresh%22%7D">Verify page is not being caused to refresh automatically</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.2.2 Pause, Stop, Hide [A]</h2> + <div>For moving, blinking, scrolling, or auto-updating information, the user can pause, stop, hide or adjust the information.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>blink_elem_deprecated</strong>: Content that blinks persistently must not be used + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/blink_elem_deprecated.html#%7B%22message%22%3A%22Content%20found%20that%20blinks%20persistently%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Content found that blinks persistently</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>marquee_elem_avoid</strong>: The &lt;marquee&gt; element is obsolete and should not be used + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/marquee_elem_avoid.html#%7B%22message%22%3A%22Scrolling%20content%20found%20that%20uses%20the%20obsolete%20%3Cmarquee%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Scrolling content found that uses the obsolete &lt;marquee&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>blink_css_review</strong>: Do not use the "blink" value of the 'text-decoration' property for longer than five seconds + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/blink_css_review.html#%7B%22message%22%3A%22Check%20the%20%5C%22blink%5C%22%20value%20of%20the%20CSS%20'text-decoration'%20property%20is%20not%20used%20for%20more%20than%20than%20five%20seconds%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Check the "blink" value of the CSS 'text-decoration' property is not used for more than than five seconds</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.3.1 Three Flashes or Below Threshold [A]</h2> + <div>Content does not contain anything that flashes more than three times in any one second period, or the flash is below the general flash and red flash thresholds.</div> + +</div><div> + <h2>2.4.1 Bypass Blocks [A]</h2> + <div>A mechanism is available to bypass blocks of content that are repeated on multiple Web pages.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>aria_application_label_unique</strong>: Each element with "application" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_application_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22application%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "application" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_application_labelled</strong>: Each element with "application" role must have a label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_application_labelled.html#%7B%22message%22%3A%22Element%20with%20%5C%22application%5C%22%20role%20does%20not%20have%20a%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_label%22%7D">Element with "application" role does not have a label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_article_label_unique</strong>: Each element with "article" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_article_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22article%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "article" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_document_label_unique</strong>: Each element with "document" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_document_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22document%5C%22%20roles%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "document" roles do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_toolbar_label_unique</strong>: Each element with "toolbar" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_toolbar_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22toolbar%5C%22%20roles%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "toolbar" roles do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>skip_main_exists</strong>: Pages must provide a way to skip directly to the main content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/skip_main_exists.html#%7B%22message%22%3A%22The%20page%20does%20not%20provide%20a%20way%20to%20quickly%20navigate%20to%20the%20main%20content%20(ARIA%20%5C%22main%5C%22%20landmark%20or%20a%20skip%20link)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The page does not provide a way to quickly navigate to the main content (ARIA "main" landmark or a skip link)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>frame_src_valid</strong>: A &lt;frame&gt; containing non-HTML content must be made accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/frame_src_valid.html#%7B%22message%22%3A%22Verify%20%3Cframe%3E%20content%20is%20accessible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify &lt;frame&gt; content is accessible</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>html_skipnav_exists</strong>: Provide a way to bypass blocks of content that are repeated on multiple Web pages + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_skipnav_exists.html#%7B%22message%22%3A%22Verify%20there%20is%20a%20way%20to%20bypass%20blocks%20of%20content%20that%20are%20repeated%20on%20multiple%20Web%20pages%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify there is a way to bypass blocks of content that are repeated on multiple Web pages</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>skip_main_described</strong>: The description of a hyperlink used to skip content must communicate where it links to + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/skip_main_described.html#%7B%22message%22%3A%22Verify%20that%20if%20this%20hyperlink%20skips%20content%2C%20the%20description%20communicates%20where%20it%20links%20to%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that if this hyperlink skips content, the description communicates where it links to</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.2 Page Titled [A]</h2> + <div>Web pages, non-web documents, and software have titles that describe topic or purpose.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>page_title_exists</strong>: The page should have a title that correctly identifies the subject of the page + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/page_title_exists.html#%7B%22message%22%3A%22Missing%20%3Chead%3E%20element%20so%20there%20can%20be%20no%20%3Ctitle%3E%20element%20present%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Missing &lt;head&gt; element so there can be no &lt;title> element present</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/page_title_exists.html#%7B%22message%22%3A%22Missing%20%3Ctitle%3E%20element%20in%20%3Chead%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Missing &lt;title&gt; element in &lt;head> element</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/page_title_exists.html#%7B%22message%22%3A%22The%20%3Ctitle%3E%20element%20is%20empty%20(no%20innerHTML)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">The &lt;title&gt; element is empty (no innerHTML)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>page_title_valid</strong>: Page &lt;title&gt; should be a descriptive title, rather than a filename + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/page_title_valid.html#%7B%22message%22%3A%22Verify%20that%20using%20the%20filename%20as%20the%20page%20%3Ctitle%3E%20value%20is%20descriptive%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_2%22%7D">Verify that using the filename as the page &lt;title&gt; value is descriptive</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.3 Focus Order [A]</h2> + <div>If content can be navigated sequentially and the navigation sequences affect meaning or operation, focusable components receive focus in an order that preserves meaning and operability.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>widget_tabbable_single</strong>: Components with a widget role must have no more than one tabbable element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/widget_tabbable_single.html#%7B%22message%22%3A%22Component%20with%20%5C%22%7B0%7D%5C%22%20role%20has%20more%20than%20one%20tabbable%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_multiple_tabbable%22%7D">Component with "{0}" role has more than one tabbable element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.4 Link Purpose (In Context) [A]</h2> + <div>The purpose of each link can be determined from the link text alone or from the link text together with its programmatically determined link content.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>img_alt_redundant</strong>: The text alternative for an image within a link should not repeat the link text or adjacent link text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Link%20text%20is%20repeated%20in%20an%20image%20'alt'%20value%20within%20the%20same%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Link text is repeated in an image 'alt' value within the same link</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Link%20text%20of%20previous%20link%20is%20repeated%20in%20image%20'alt'%20value%20of%20a%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Link text of previous link is repeated in image 'alt' value of a link</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Image%20'alt'%20value%20within%20a%20link%20is%20repeated%20in%20link%20text%20of%20the%20link%20after%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Image 'alt' value within a link is repeated in link text of the link after</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>a_text_purpose</strong>: Hyperlinks must have an accessible name for their purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/a_text_purpose.html#%7B%22message%22%3A%22Hyperlink%20has%20no%20link%20text%2C%20label%20or%20image%20with%20a%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_acc_name%22%7D">Hyperlink has no link text, label or image with a text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.5 Multiple Ways [AA]</h2> + <div>More than one way is available to locate a Web page within a set of Web pages, except where the Web Page is the result of, or a step in, a process.</div> + +</div><div> + <h2>2.4.6 Headings and Labels [AA]</h2> + <div>Headings and labels describe topic or purpose.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>heading_content_exists</strong>: Heading elements must provide descriptive text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/heading_content_exists.html#%7B%22message%22%3A%22Heading%20element%20has%20no%20descriptive%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Heading element has no descriptive content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.7 Focus Visible [AA]</h2> + <div>Any keyboard operable user interface has a mode of operation where the keyboard focus indicator is visible.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>element_tabbable_visible</strong>: A tabbable element should be visible on the screen when it has keyboard focus + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_tabbable_visible.html#%7B%22message%22%3A%22Confirm%20the%20element%20should%20be%20tabbable%20and%20if%20so%2C%20it%20becomes%20visible%20when%20it%20has%20keyboard%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_visible%22%7D">Confirm the element should be tabbable and if so, it becomes visible when it has keyboard focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>script_focus_blur_review</strong>: Scripting must not remove focus from content that normally receives focus + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_focus_blur_review.html#%7B%22message%22%3A%22Verify%20script%20does%20not%20remove%20focus%20from%20content%20that%20normally%20receives%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify script does not remove focus from content that normally receives focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>style_focus_visible</strong>: The keyboard focus indicator should be visible when default border or outline is modified by CSS + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_focus_visible.html#%7B%22message%22%3A%22Check%20the%20keyboard%20focus%20indicator%20is%20visible%20when%20using%20CSS%20declaration%20for%20'border'%20or%20'outline'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_focus_not_visible%22%7D">Check the keyboard focus indicator is visible when using CSS declaration for 'border' or 'outline'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.11 Focus Not Obscured (Minimum) [AA]</h2> + <div>When an element receives focus, it is not entirely covered by other content.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>element_tabbable_unobscured</strong>: When an element receives focus, it is not entirely covered by other content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_tabbable_unobscured.html#%7B%22message%22%3A%22Confirm%20that%20when%20the%20element%20receives%20focus%2C%20it%20is%20not%20covered%20or%2C%20if%20covered%20by%20user%20action%2C%20can%20be%20uncovered%20without%20moving%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_obscured%22%7D">Confirm that when the element receives focus, it is not covered or, if covered by user action, can be uncovered without moving focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.5.1 Pointer Gestures [A]</h2> + <div>All functionality that uses multipoint or path-based gestures for operation can be operated with a single pointer without a path-based gesture.</div> + +</div><div> + <h2>2.5.2 Pointer Cancellation [A]</h2> + <div>For functionality that can be operated using a single pointer, completion of the function is on the up-event with an ability to abort, undo or reverse the outcome.</div> + +</div><div> + <h2>2.5.3 Label in Name [A]</h2> + <div>For user interface components with labels that include text or images of text, the accessible name contains the text that is presented visually.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>label_name_visible</strong>: Accessible name must match or contain the visible label text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/label_name_visible.html#%7B%22message%22%3A%22Accessible%20name%20does%20not%20match%20or%20contain%20the%20visible%20label%20text%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Accessible name does not match or contain the visible label text</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_label_visible</strong>: An input element must have an associated visible label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_visible.html#%7B%22message%22%3A%22The%20%E2%80%98placeholder%E2%80%99%20is%20the%20only%20visible%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_placeholder_only%22%7D">The ‘placeholder’ is the only visible label</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_visible.html#%7B%22message%22%3A%22The%20input%20element%20does%20not%20have%20an%20associated%20visible%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_no_label%22%7D">The input element does not have an associated visible label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.5.4 Motion Actuation [A]</h2> + <div>Functionality that can be operated by motion can also be operated by user interface components, and the motion trigger can be disabled.</div> + +</div><div> + <h2>2.5.7 Dragging Movement [AA]</h2> + <div>All functionality that uses a dragging movement for operation can be achieved by a single pointer without dragging.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>draggable_alternative_exists</strong>: A draggable element must have a "single pointer" alternative + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/draggable_alternative_exists.html#%7B%22message%22%3A%22Ensure%20the%20draggable%20element%20%5C%22%7B0%7D%5C%22%20has%20a%20%5C%22single%20pointer%5C%22%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_alternative%22%7D">Ensure the draggable element "{0}" has a "single pointer" alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.5.8 Minimum Target Size [AA]</h2> + <div>The size of the target for pointer inputs is at least 24 by 24 CSS pixels.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>target_spacing_sufficient</strong>: The target must be sufficiently sized or spaced from other targets + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/target_spacing_sufficient.html#%7B%22message%22%3A%22Undersized%20target%20%5C%22%7B0%7D%5C%22%20does%20not%20have%20sufficient%20spacing%20of%2012%20CSS%20pixels%20from%20another%20target%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22violation_spacing%22%7D">Undersized target "{0}" does not have sufficient spacing of 12 CSS pixels from another target "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/target_spacing_sufficient.html#%7B%22message%22%3A%22Ensure%20the%20overlapped%20target%20%5C%22%7B0%7D%5C%22%20meets%20a%20minimum%20target%20size%20or%20has%20sufficient%20spacing%20from%20the%20overlapping%20target%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_overlap%22%7D">Ensure the overlapped target "{0}" meets a minimum target size or has sufficient spacing from the overlapping target "{1}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.1.1 Language of Page [A]</h2> + <div>The default human language of Web pages, non-Web documents, or software can be programmatically determined.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>html_lang_exists</strong>: Page must identify the default language of the document with a 'lang' attribute + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20as%20XHTML%201.0%2C%20but%20has%20neither%20'lang'%20nor%20'xml%3Alang'%20attributes%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Page detected as XHTML 1.0, but has neither 'lang' nor 'xml:lang' attributes</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20as%20XHTML%2C%20but%20does%20not%20have%20an%20'xml%3Alang'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Page detected as XHTML, but does not have an 'xml:lang' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20as%20HTML%2C%20but%20does%20not%20have%20a%20'lang'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Page detected as HTML, but does not have a 'lang' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20with%20'lang'%20and%20'xml%3Alang'%20attributes%20and%20primary%20languages%20do%20not%20match%3A%20%5C%22%7B0%7D%5C%22%2C%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_4%22%7D">Page detected with 'lang' and 'xml:lang' attributes and primary languages do not match: "{0}", "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20with%20'lang'%20and%20'xml%3Alang'%20attributes%20that%20do%20not%20match%3A%20%5C%22%7B0%7D%5C%22%2C%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_5%22%7D">Page detected with 'lang' and 'xml:lang' attributes that do not match: "{0}", "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20as%20XHTML%201.0%20with%20only%20a%20'lang'%20attribute.%20Confirm%20that%20page%20is%20only%20delivered%20via%20text%2Fhtml%20mime%20type%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_5%22%7D">Page detected as XHTML 1.0 with only a 'lang' attribute. Confirm that page is only delivered via text/html mime type</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20as%20XHTML%201.0%20with%20only%20an%20'xml%3Alang'%20attribute.%20Confirm%20that%20page%20is%20only%20delivered%20via%20xml%20mime%20type%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_6%22%7D">Page detected as XHTML 1.0 with only an 'xml:lang' attribute. Confirm that page is only delivered via xml mime type</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>html_lang_valid</strong>: The default human language of the page must be valid and specified in accordance with BCP 47 + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_valid.html#%7B%22message%22%3A%22Specified%20'lang'%20attribute%20does%20not%20include%20a%20valid%20primary%20language%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Specified 'lang' attribute does not include a valid primary language</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_valid.html#%7B%22message%22%3A%22Specified%20'lang'%20attribute%20does%20not%20conform%20to%20BCP%2047%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Specified 'lang' attribute does not conform to BCP 47</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_valid.html#%7B%22message%22%3A%22Specified%20'xml%3Alang'%20attribute%20does%20not%20include%20a%20valid%20primary%20language%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Specified 'xml:lang' attribute does not include a valid primary language</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_valid.html#%7B%22message%22%3A%22Specified%20'xml%3Alang'%20attribute%20does%20not%20conform%20to%20BCP%2047%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_4%22%7D">Specified 'xml:lang' attribute does not conform to BCP 47</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.1.2 Language of Parts [AA]</h2> + <div>The human language of each passage or phrase in the content can be programmatically determined.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>element_lang_valid</strong>: The change in language of specific content must be valid and specified in accordance with BCP 47 + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_lang_valid.html#%7B%22message%22%3A%22Specified%20'lang'%20attribute%20does%20not%20include%20a%20valid%20primary%20language%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Specified 'lang' attribute does not include a valid primary language</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_lang_valid.html#%7B%22message%22%3A%22Specified%20'lang'%20attribute%20does%20not%20conform%20to%20BCP%2047%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Specified 'lang' attribute does not conform to BCP 47</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_lang_valid.html#%7B%22message%22%3A%22Specified%20'xml%3Alang'%20attribute%20does%20not%20include%20a%20valid%20primary%20language%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Specified 'xml:lang' attribute does not include a valid primary language</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_lang_valid.html#%7B%22message%22%3A%22Specified%20'xml%3Alang'%20attribute%20does%20not%20conform%20to%20BCP%2047%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_4%22%7D">Specified 'xml:lang' attribute does not conform to BCP 47</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.2.1 On Focus [A]</h2> + <div>When any component receives focus, it does not initiate a change of context.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>script_focus_blur_review</strong>: Scripting must not remove focus from content that normally receives focus + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_focus_blur_review.html#%7B%22message%22%3A%22Verify%20script%20does%20not%20remove%20focus%20from%20content%20that%20normally%20receives%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify script does not remove focus from content that normally receives focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>script_select_review</strong>: No changes of context should occur when a selection value receives focus + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_select_review.html#%7B%22message%22%3A%22Verify%20that%20no%20change%20of%20context%20or%20action%20occurs%20when%20selection%20options%20in%20this%20component%20receive%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that no change of context or action occurs when selection options in this component receive focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.2.2 On Input [A]</h2> + <div>Changing the setting of any user interface component does not automatically cause a change of context unless the user has been advised of the behavior before using the component.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>form_interaction_review</strong>: User should be informed in advance when interacting with content causes a change of context + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/form_interaction_review.html#%7B%22message%22%3A%22Verify%20that%20interacting%20with%20content%20will%20not%20open%20pop-up%20windows%20or%20change%20the%20active%20window%20without%20informing%20the%20user%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that interacting with content will not open pop-up windows or change the active window without informing the user</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>form_submit_button_exists</strong>: A &lt;form&gt; element should have a submit button or an image button + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/form_submit_button_exists.html#%7B%22message%22%3A%22Verify%20the%20%3Cform%3E%20element%20has%20a%20submit%20button%20or%20an%20image%20button%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify the &lt;form&gt; element has a submit button or an image button</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_onchange_review</strong>: Users must be advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_onchange_review.html#%7B%22message%22%3A%22Confirm%20that%20the%20user%20is%20advised%20if%2C%20due%20to%20a%20change%20of%20element%20value%2C%20a%20form%20automatically%20submits%2C%20a%20new%20window%20opens%2C%20or%20a%20change%20in%20focus%20occurs%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_warning%22%7D">Confirm that the user is advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>a_target_warning</strong>: Users should be warned in advance if their input action will open a new window + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/a_target_warning.html#%7B%22message%22%3A%22Inform%20the%20user%20when%20their%20input%20action%20will%20open%20a%20new%20window%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_warn%22%7D">Inform the user when their input action will open a new window</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.2.3 Consistent Navigation [AA]</h2> + <div>Navigational mechanisms that are repeated on multiple Web pages within a set of Web pages occur in the same relative order each time they are repeated, unless a change is initiated by the user.</div> + +</div><div> + <h2>3.2.4 Consistent Identification [AA]</h2> + <div>Components that have the same functionality within a set of Web pages are identified consistently.</div> + +</div><div> + <h2>3.2.6 Consistent Help [AA]</h2> + <div>Make it easier to find help and support. If a Web page contains help mechanisms they occur in the same order relative to other page content, unless a change is initiated by the user.</div> + +</div><div> + <h2>3.3.1 Error Identification [A]</h2> + <div>If an input error is automatically detected, the item that is in error is identified and the error is described to the user in text.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>error_message_exists</strong>: A custom error message must reference a valid 'id' value and when triggered the message must be appropriately exposed + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/error_message_exists.html#%7B%22message%22%3A%22Custom%20error%20message%20has%20invalid%20reference%20'id'%20value%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Custom error message has invalid reference 'id' value</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/error_message_exists.html#%7B%22message%22%3A%22Custom%20error%20message%20is%20not%20visible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Custom error message is not visible</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.3.2 Labels or Instructions [A]</h2> + <div>Labels or instructions are provided when content requires user input.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>fieldset_label_valid</strong>: Groups with nested inputs must have unique accessible name + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_label_valid.html#%7B%22message%22%3A%22Group%2FFieldset%20does%20not%20have%20an%20accessible%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Group/Fieldset does not have an accessible name</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_label_valid.html#%7B%22message%22%3A%22Group%2FFieldset%20%5C%22%7B0%7D%5C%22%20has%20a%20duplicate%20name%20to%20another%20group%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Group/Fieldset "{0}" has a duplicate name to another group</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_label_after</strong>: Checkboxes and radio buttons must have a label after the input control + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_after.html#%7B%22message%22%3A%22Checkbox%20or%20radio%20button%20is%20nested%20in%20label%2C%20so%20label%20is%20not%20after%20the%20input%20control%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Checkbox or radio button is nested in label, so label is not after the input control</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_after.html#%7B%22message%22%3A%22Label%20text%20is%20located%20before%20its%20associated%20checkbox%20or%20radio%20button%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Label text is located before its associated checkbox or radio button element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_label_before</strong>: Text inputs and &lt;select&gt; elements must have a label before the input control + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_before.html#%7B%22message%22%3A%22Text%20input%20is%20nested%20in%20label%20such%20that%20input%20precedes%20the%20label%20text%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Text input is nested in label such that input precedes the label text</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_before.html#%7B%22message%22%3A%22Label%20text%20is%20located%20after%20its%20associated%20text%20input%20or%20%3Cselect%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Label text is located after its associated text input or &lt;select&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_label_visible</strong>: An input element must have an associated visible label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_visible.html#%7B%22message%22%3A%22The%20%E2%80%98placeholder%E2%80%99%20is%20the%20only%20visible%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_placeholder_only%22%7D">The ‘placeholder’ is the only visible label</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_visible.html#%7B%22message%22%3A%22The%20input%20element%20does%20not%20have%20an%20associated%20visible%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_no_label%22%7D">The input element does not have an associated visible label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>element_accesskey_labelled</strong>: An element with an assigned 'accesskey' attribute must have an associated label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_accesskey_labelled.html#%7B%22message%22%3A%22The%20element%20with%20an%20assigned%20'accesskey'%20attribute%20does%20not%20have%20an%20associated%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">The element with an assigned 'accesskey' attribute does not have an associated label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.3.3 Error Suggestion [AA]</h2> + <div>If an input error is automatically detected and suggestions for correction are known, then the suggestions are provided to the user, unless it would jeopardize the security or purpose of the content.</div> + +</div><div> + <h2>3.3.4 Error Prevention (Legal, Financial, Data) [AA]</h2> + <div>For content that cause legal commitments or financial transactions for the user to occur, that modify or delete user-controllable data in data storage systems, or that submit user test responses, the user can reverse, correct, or confirm the action.</div> + +</div><div> + <h2>3.3.7 Redundant Entry [AA]</h2> + <div>Make it easier for users to complete multi-step processes. Don't ask for the same information twice in the same session.</div> + +</div><div> + <h2>3.3.8 Accessible Authentication (Minimum) [AA]</h2> + <div>Make logins possible with less mental effort. Don't make people solve, recall, or transcribe something to log in.</div> + +</div><div> + <h2>4.1.1 Parsing [A]</h2> + <div>(Obsolete and removed) This requirement was originally adopted to address problems that assistive technology (AT) had directly parsing HTML. AT no longer has any need to directly parse HTML. Consequently, these problems either no longer exist or are addressed by other requirements.</div> + +</div><div> + <h2>4.1.2 Name, Role, Value [A]</h2> + <div>For all user interface components (including, but not limited to: form elements, links and components generated by scripts), the name and role can be programmatically determined; states, properties, and values that can be set by the user can be programmatically set; and notification of changes to these items is available to user agents, including assistive technologies.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>combobox_popup_reference</strong>: The 'aria-controls' (for ARIA 1.2) or the 'aria-owns' (for ARIA 1.0) attribute of the expanded combobox must reference a valid popup 'id' value + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20'aria-owns'%20attribute%20of%20the%20expanded%20combobox%20is%20missing%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1.0_missing_owns%22%7D">The 'aria-owns' attribute of the expanded combobox is missing</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20'aria-controls'%20attribute%20of%20the%20expanded%20combobox%20is%20missing%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1.2_missing_controls%22%7D">The 'aria-controls' attribute of the expanded combobox is missing</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20'aria-owns'%20attribute%20%5C%22%7B0%7D%5C%22%20of%20the%20expanded%20combobox%20does%20not%20reference%20a%20valid%20popup%20'id'%20value%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1.0_popup_reference_missing%22%7D">The 'aria-owns' attribute "{0}" of the expanded combobox does not reference a valid popup 'id' value</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20'aria-controls'%20attribute%20%5C%22%7B0%7D%5C%22%20of%20the%20expanded%20combobox%20does%20not%20reference%20a%20valid%20popup%20'id'%20value%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1.2_popup_reference_missing%22%7D">The 'aria-controls' attribute "{0}" of the expanded combobox does not reference a valid popup 'id' value</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20combobox%20'aria-expanded'%20attribute%20is%20true%2C%20but%20the%20combobox%20popup%20is%20not%20visible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_combobox_expanded_hidden%22%7D">The combobox 'aria-expanded' attribute is true, but the combobox popup is not visible</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20combobox%20'aria-expanded'%20attribute%20is%20false%2C%20but%20the%20combobox%20popup%20is%20visible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_combobox_collapsed_visible%22%7D">The combobox 'aria-expanded' attribute is false, but the combobox popup is visible</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_activedescendant_valid</strong>: The 'aria-activedescendant' property must reference the 'id' of a non-empty, non-hidden active child element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_activedescendant_valid.html#%7B%22message%22%3A%22The%20'aria-activedescendant'%20property%20is%20empty%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The 'aria-activedescendant' property is empty</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_activedescendant_valid.html#%7B%22message%22%3A%22The%20'aria-activedescendant'%20property%20references%20a%20hidden%20node%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The 'aria-activedescendant' property references a hidden node</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_activedescendant_valid.html#%7B%22message%22%3A%22Element%20is%20not%20a%20combobox%2C%20and%20the%20referenced%20active-descendant%20element%20is%20not%20a%20valid%20descendant%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Element is not a combobox, and the referenced active-descendant element is not a valid descendant</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>combobox_active_descendant</strong>: 'aria-activedescendant' must be used to define focus within the combobox popup, except when using a dialog popup + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_active_descendant.html#%7B%22message%22%3A%22The%20element%20referenced%20by%20'aria-activedescendant'%20%5C%22%7B0%7D%5C%22%20does%20not%20exist%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_missing%22%7D">The element referenced by 'aria-activedescendant' "{0}" does not exist</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_active_descendant.html#%7B%22message%22%3A%22The%20'aria-activedescendant'%20%5C%22%7B0%7D%5C%22%20references%20an%20element%20with%20the%20roles%20%5C%22%7B1%7D%5C%22%2C%20which%20does%20not%20have%20a%20valid%20ARIA%20role%20of%20'option'%2C%20'gridcell'%2C%20'row'%2C%20or%20'treeitem'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_active_role_invalid%22%7D">The 'aria-activedescendant' "{0}" references an element with the roles "{1}", which does not have a valid ARIA role of 'option', 'gridcell', 'row', or 'treeitem'</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_active_descendant.html#%7B%22message%22%3A%22The%20'aria-activedescendant'%20%5C%22%7B0%7D%5C%22%20references%20an%20element%20that%20does%20not%20have%20'aria-selected'%20set%20to%20true%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_active_not_selected%22%7D">The 'aria-activedescendant' "{0}" references an element that does not have 'aria-selected' set to true</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_haspopup_conflict</strong>: &lt;input&gt; element with a 'list' attribute should not use an explicit 'aria-haspopup' attribute + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_haspopup_conflict.html#%7B%22message%22%3A%22The%20%3Cinput%3E%20element%20with%20type%20%5C%22%7B0%7D%5C%22%20and%20'list'%20attribute%20uses%20an%20explicit%20'aria-haspopup'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_type_misuse%22%7D">The &lt;input&gt; element with type "{0}" and 'list' attribute uses an explicit 'aria-haspopup' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_haspopup_conflict.html#%7B%22message%22%3A%22The%20%3Cinput%3E%20element%20with%20a%20missing%20or%20invalid%20type%20and%20'list'%20attribute%20uses%20an%20explicit%20'aria-haspopup'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_misuse%22%7D">The &lt;input&gt; element with a missing or invalid type and 'list' attribute uses an explicit 'aria-haspopup' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_haspopup_conflict.html#%7B%22message%22%3A%22The%20list%20attribute%20for%20the%20%3Cinput%3E%20element%20is%20invalid%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_list_notexist%22%7D">The list attribute for the &lt;input&gt; element is invalid</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_haspopup_conflict.html#%7B%22message%22%3A%22The%20list%20attribute%20for%20the%20%3Cinput%3E%20element%20with%20the%20type%20%5C%22%7B0%7D%5C%22%20is%20invalid%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid_list_type%22%7D">The list attribute for the &lt;input&gt; element with the type "{0}" is invalid</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_haspopup_conflict.html#%7B%22message%22%3A%22The%20list%20attribute%20for%20the%20%3Cinput%3E%20element%20does%20not%20reference%20a%20datalist%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid_list_elem%22%7D">The list attribute for the &lt;input&gt; element does not reference a datalist element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_role_valid</strong>: ARIA roles must be valid for the element to which they are assigned + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_role_valid.html#%7B%22message%22%3A%22The%20ARIA%20role%20'%7B0%7D'%20is%20not%20valid%20for%20the%20element%20%3C%7B1%7D%3E%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The ARIA role '{0}' is not valid for the element &lt;{1}&gt;</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_role_valid.html#%7B%22message%22%3A%22The%20ARIA%20role%20'%7B0%7D'%20is%20not%20valid%20for%20the%20element%20%3C%7B1%7D%3E%20and%20may%20be%20ignored%20by%20the%20browser%20since%20the%20element%20is%20focusable%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The ARIA role '{0}' is not valid for the element &lt;{1}&gt; and may be ignored by the browser since the element is focusable</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>combobox_autocomplete_valid</strong>: A combobox that supports autocompletion behavior must have the 'aria-autocomplete' attribute only on its text input element with a valid value; a value of '"inline"' is not supported + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_autocomplete_valid.html#%7B%22message%22%3A%22The%20combobox%20has%20the%20'aria-autocomplete'%20attribute%20incorrectly%20set%20on%20an%20element%20within%20the%20popup%20referenced%20by%20%5C%22%7B0%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The combobox has the 'aria-autocomplete' attribute incorrectly set on an element within the popup referenced by "{0}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_autocomplete_valid.html#%7B%22message%22%3A%22The%20combobox%20does%20not%20support%20an%20'aria-autocomplete'%20attribute%20value%20set%20to%20'%5C%22inline%5C%22'%20%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_inline%22%7D">The combobox does not support an 'aria-autocomplete' attribute value set to '"inline"' </a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>combobox_focusable_elements</strong>: Tabbable focus for the combobox must be allowed only on the text input, except when using a dialog popup + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_focusable_elements.html#%7B%22message%22%3A%22The%20combobox%20element%20does%20not%20allow%20DOM%20focus%20as%20required%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_not_tabbable%22%7D">The combobox element does not allow DOM focus as required</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_focusable_elements.html#%7B%22message%22%3A%22The%20popup%20of%20the%20combobox%20has%20DOM%20focus%20or%20has%20'aria-activedescendant'%20defined%2C%20which%20is%20not%20allowed%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_tabbable_child%22%7D">The popup of the combobox has DOM focus or has 'aria-activedescendant' defined, which is not allowed</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>combobox_haspopup_valid</strong>: The combobox attribute 'aria-haspopup' value must be appropriate for the role of the element referenced by 'aria-controls' (ARIA 1.2) or 'aria-owns' (ARIA 1.0) + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_haspopup_valid.html#%7B%22message%22%3A%22The%20'role'%20value%20%5C%22%7B0%7D%5C%22%20of%20the%20popup%20element%20%5C%22%7B1%7D%5C%22%20should%20be%20one%20of%20%5C%22listbox%5C%22%2C%20%5C%22grid%5C%22%2C%20%5C%22tree%5C%22%20or%20%5C%22dialog%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_popup_role_invalid%22%7D">The 'role' value "{0}" of the popup element "{1}" should be one of "listbox", "grid", "tree" or "dialog"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_haspopup_valid.html#%7B%22message%22%3A%22The%20value%20of%20the%20combobox%20'aria-haspopup'%20attribute%20%5C%22%7B0%7D%5C%22%20does%20not%20match%20the%20'role'%20value%20of%20the%20popup%20element%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_combobox_popup_role_mismatch%22%7D">The value of the combobox 'aria-haspopup' attribute "{0}" does not match the 'role' value of the popup element "{1}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_label_exists</strong>: Each form control must have an associated label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_exists.html#%7B%22message%22%3A%22Form%20control%20element%20%3C%7B0%7D%3E%20has%20no%20associated%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Form control element &lt;{0}&gt; has no associated label</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_exists.html#%7B%22message%22%3A%22Form%20control%20with%20%5C%22%7B0%7D%5C%22%20role%20has%20no%20associated%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Form control with "{0}" role has no associated label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_descendant_valid</strong>: Browsers ignore the explicit and implicit ARIA roles of the descendants of certain elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_descendant_valid.html#%7B%22message%22%3A%22The%20element%20with%20role%20%5C%22%7B0%7D%5C%22%20contains%20descendants%20with%20implicit%20roles%20%5C%22%7B1%7D%5C%22%20which%20are%20ignored%20by%20browsers%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_child_implicit_role%22%7D">The element with role "{0}" contains descendants with implicit roles "{1}" which are ignored by browsers</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_descendant_valid.html#%7B%22message%22%3A%22The%20element%20with%20role%20%5C%22%7B0%7D%5C%22%20contains%20descendants%20with%20roles%20%5C%22%7B1%7D%5C%22%20which%20are%20ignored%20by%20browsers%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_child_explicit_role%22%7D">The element with role "{0}" contains descendants with roles "{1}" which are ignored by browsers</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_role_allowed</strong>: Elements must have a valid 'role' per ARIA specification + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_role_allowed.html#%7B%22message%22%3A%22The%20role%20'%7B0%7D'%20defined%20on%20the%20element%20is%20not%20valid%20per%20ARIA%20specification%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The role '{0}' defined on the element is not valid per ARIA specification</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_role_allowed.html#%7B%22message%22%3A%22Some%20of%20the%20roles%2C%20'%7B0%7D'%2C%20defined%20on%20the%20element%20are%20not%20valid%20per%20ARIA%20specification%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Some of the roles, '{0}', defined on the element are not valid per ARIA specification</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>a_text_purpose</strong>: Hyperlinks must have an accessible name for their purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/a_text_purpose.html#%7B%22message%22%3A%22Hyperlink%20has%20no%20link%20text%2C%20label%20or%20image%20with%20a%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_acc_name%22%7D">Hyperlink has no link text, label or image with a text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_allowed</strong>: ARIA attributes must be valid for the element's role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_allowed.html#%7B%22message%22%3A%22The%20attribute(s)%20'%7B0%7D'%20referenced%20by%20the%20element%20%3C%7B1%7D%3E%20is%20not%20a%20valid%20ARIA%20state%20or%20property%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The attribute(s) '{0}' referenced by the element &lt;{1}&gt; is not a valid ARIA state or property</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_conflict</strong>: An ARIA attribute must not conflict with the corresponding HTML attribute + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_conflict.html#%7B%22message%22%3A%22The%20ARIA%20attribute%20%5C%22%7B0%7D%5C%22%20is%20in%20conflict%20with%20the%20corresponding%20HTML%20attribute%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_conflict%22%7D">The ARIA attribute "{0}" is in conflict with the corresponding HTML attribute "{1}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_exists</strong>: When specifying a required ARIA attribute, the value must not be empty + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_exists.html#%7B%22message%22%3A%22The%20element%20attribute(s)%3A%20'%7B0%7D'%20value%20is%20empty%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_empty_attribute%22%7D">The element attribute(s): '{0}' value is empty</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_required</strong>: The required attributes for the element with a role must be defined + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_required.html#%7B%22message%22%3A%22Element%20with%20'%7B0%7D'%20role%20does%20not%20have%20the%20required%20ARIA%20attribute(s)%3A%20'%7B1%7D'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_missing%22%7D">Element with '{0}' role does not have the required ARIA attribute(s): '{1}'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_value_valid</strong>: ARIA property values must be valid + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_value_valid.html#%7B%22message%22%3A%22The%20value%20%5C%22%7B0%7D%5C%22%20specified%20for%20attribute%20'%7B1%7D'%20on%20element%20%3C%7B2%7D%3E%20is%20not%20valid%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The value "{0}" specified for attribute '{1}' on element &lt;{2}&gt; is not valid</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_eventhandler_role_valid</strong>: Elements with event handlers must have a valid ARIA role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_eventhandler_role_valid.html#%7B%22message%22%3A%22The%20%3C%7B0%7D%3E%20element%20with%20'%7B1%7D'%20does%20not%20have%20a%20valid%20ARIA%20role%20specified%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;{0}&gt; element with '{1}' does not have a valid ARIA role specified</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_hidden_nontabbable</strong>: A hidden element should not contain any tabbable elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_hidden_nontabbable.html#%7B%22message%22%3A%22Element%20%5C%22%7B0%7D%5C%22%20should%20not%20be%20focusable%20within%20the%20subtree%20of%20an%20element%20with%20an%20'aria-hidden'%20attribute%20with%20value%20'true'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element "{0}" should not be focusable within the subtree of an element with an 'aria-hidden' attribute with value 'true'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_id_unique</strong>: The ARIA property must reference a non-empty unique id of an existing element that is visible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_id_unique.html#%7B%22message%22%3A%22The%20'id'%20%5C%22%7B0%7D%5C%22%20specified%20for%20the%20ARIA%20property%20'%7B1%7D'%20value%20is%20not%20valid%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The 'id' "{0}" specified for the ARIA property '{1}' value is not valid</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_widget_labelled</strong>: Interactive component must have a programmatically associated name + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_widget_labelled.html#%7B%22message%22%3A%22Interactive%20component%20with%20ARIA%20role%20'%7B0%7D'%20does%20not%20have%20a%20programmatically%20associated%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Interactive component with ARIA role '{0}' does not have a programmatically associated name</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>combobox_design_valid</strong>: The combobox design pattern must be valid for ARIA 1.2 + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_design_valid.html#%7B%22message%22%3A%22The%20combobox%20design%20pattern%20is%20detected%20as%20ARIA%201.1%2C%20which%20is%20not%20allowed%20by%20ARIA%201.2%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1.1%22%7D">The combobox design pattern is detected as ARIA 1.1, which is not allowed by ARIA 1.2</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>frame_title_exists</strong>: Inline frames must have a unique, non-empty 'title' attribute + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/frame_title_exists.html#%7B%22message%22%3A%22Inline%20frame%20does%20not%20have%20a%20'title'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Inline frame does not have a 'title' attribute</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>label_content_exists</strong>: A &lt;label&gt; element must have non-empty descriptive text that identifies the purpose of the interactive component + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/label_content_exists.html#%7B%22message%22%3A%22The%20%3Clabel%3E%20element%20does%20not%20have%20descriptive%20text%20that%20identifies%20the%20expected%20input%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;label&gt; element does not have descriptive text that identifies the expected input</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>list_children_valid</strong>: List component with "group" role must limit children to &lt;listitem&gt; elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/list_children_valid.html#%7B%22message%22%3A%22List%20component%20with%20%5C%22group%5C%22%20role%20has%20children%20that%20are%20not%20%3Clistitem%3E%20elements%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">List component with "group" role has children that are not &lt;listitem&gt; elements</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_aria_descendants</strong>: Table structure elements cannot specify an explicit 'role' within table containers + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_aria_descendants.html#%7B%22message%22%3A%22An%20explicit%20ARIA%20'role'%20is%20not%20valid%20for%20%3C%7B0%7D%3E%20element%20within%20an%20ARIA%20role%20'%7B1%7D'%20per%20the%20ARIA%20in%20HTML%20specification%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22explicit_role%22%7D">An explicit ARIA 'role' is not valid for &lt;{0}&gt; element within an ARIA role '{1}' per the ARIA in HTML specification</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>element_tabbable_role_valid</strong>: A tabbable element must have a valid widget role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_tabbable_role_valid.html#%7B%22message%22%3A%22The%20tabbable%20element's%20role%20'%7B0%7D'%20is%20not%20a%20widget%20role%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid_role%22%7D">The tabbable element's role '{0}' is not a widget role</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_tabbable_role_valid.html#%7B%22message%22%3A%22The%20tabbable%20element%20does%20not%20have%20a%20valid%20widget%20role%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_valid_role%22%7D">The tabbable element does not have a valid widget role</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_accessiblename_exists</strong>: Elements with certain roles should have accessible names + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_accessiblename_exists.html#%7B%22message%22%3A%22Element%20%3C%7B0%7D%3E%20with%20%5C%22%7B1%7D%5C%22%20role%20has%20no%20accessible%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_accessible_name%22%7D">Element &lt;{0}&gt; with "{1}" role has no accessible name</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_redundant</strong>: An ARIA attribute should not be redundant with a corresponding HTML attribute + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_redundant.html#%7B%22message%22%3A%22The%20ARIA%20attribute%20%5C%22%7B0%7D%5C%22%20is%20redundant%20with%20the%20HTML%20attribute%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_redundant%22%7D">The ARIA attribute "{0}" is redundant with the HTML attribute "{1}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>canvas_content_described</strong>: The &lt;canvas&gt; element may not be accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/canvas_content_described.html#%7B%22message%22%3A%22Verify%20accessibility%20of%20the%20%3Ccanvas%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify accessibility of the &lt;canvas&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>4.1.3 Status Messages [AA]</h2> + <div>In content implemented using markup languages, status messages can be programmatically determined through role or properties such that they can be presented to the user by assistive technologies without receiving focus.</div> + +</div> + </div><div id="WCAG_2_1" style="padding: 1rem; display:none"> +<div> + <h2>1.1.1 Non-text Content [A]</h2> + <div>All non-text content that is presented to the user has a text alternative that serves the equivalent purpose.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>applet_alt_exists</strong>: &lt;applet&gt; elements must provide an 'alt' attribute and an alternative description + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/applet_alt_exists.html#%7B%22message%22%3A%22An%20%3Capplet%3E%20element%20does%20not%20have%20an%20'alt'%20attribute%20that%20provides%20a%20short%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">An &lt;applet&gt; element does not have an 'alt' attribute that provides a short text alternative</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/applet_alt_exists.html#%7B%22message%22%3A%22The%20'alt'%20attribute%20value%20for%20an%20%3Capplet%3E%20element%20duplicates%20the%20'code'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The 'alt' attribute value for an &lt;applet&gt; element duplicates the 'code' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/applet_alt_exists.html#%7B%22message%22%3A%22An%20%3Capplet%3E%20element%20provides%20alternative%20text%2C%20but%20does%20not%20provide%20inner%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">An &lt;applet&gt; element provides alternative text, but does not provide inner content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_redundant</strong>: The text alternative for an image within a link should not repeat the link text or adjacent link text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Link%20text%20is%20repeated%20in%20an%20image%20'alt'%20value%20within%20the%20same%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Link text is repeated in an image 'alt' value within the same link</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Link%20text%20of%20previous%20link%20is%20repeated%20in%20image%20'alt'%20value%20of%20a%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Link text of previous link is repeated in image 'alt' value of a link</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Image%20'alt'%20value%20within%20a%20link%20is%20repeated%20in%20link%20text%20of%20the%20link%20after%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Image 'alt' value within a link is repeated in link text of the link after</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_valid</strong>: Images must have accessible names unless they are decorative or redundant + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_valid.html#%7B%22message%22%3A%22Image%20'alt'%20attribute%20value%20consists%20only%20of%20blank%20space(s)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_blank_alt%22%7D">Image 'alt' attribute value consists only of blank space(s)</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_valid.html#%7B%22message%22%3A%22The%20image%20has%20neither%20an%20accessible%20name%20nor%20is%20marked%20as%20decorative%20or%20redundant%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_alt%22%7D">The image has neither an accessible name nor is marked as decorative or redundant</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_valid.html#%7B%22message%22%3A%22The%20image%20does%20not%20have%20an%20'alt'%20attribute%20or%20ARIA%20label%2C%20and%20the%20'title'%20attribute%20value%20consists%20only%20of%20blank%20space(s)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_blank_title%22%7D">The image does not have an 'alt' attribute or ARIA label, and the 'title' attribute value consists only of blank space(s)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>area_alt_exists</strong>: &lt;area&gt; elements in an image map must have a text alternative + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/area_alt_exists.html#%7B%22message%22%3A%22%3Carea%3E%20element%20in%20an%20image%20map%20has%20no%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">&lt;area&gt; element in an image map has no text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>imagebutton_alt_exists</strong>: The &lt;input&gt; element of type "image" should have a text alternative + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/imagebutton_alt_exists.html#%7B%22message%22%3A%22The%20%3Cinput%3E%20element%20of%20type%20%5C%22image%5C%22%20has%20no%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail%22%7D">The &lt;input&gt; element of type "image" has no text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>imagemap_alt_exists</strong>: An image map and each &lt;area&gt; element in an image map must have text alternative(s) + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/imagemap_alt_exists.html#%7B%22message%22%3A%22Image%20map%20or%20child%20%3Carea%3E%20has%20no%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Image map or child &lt;area&gt; has no text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_decorative</strong>: Image designated as decorative must have 'alt="" + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_decorative.html#%7B%22message%22%3A%22Image%20designated%20as%20decorative%20has%20non-null%20'alt'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Image designated as decorative has non-null 'alt' attribute</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_null</strong>: When the intent is to mark an image as decorative with an empty 'alt' attribute, the 'aria' or 'title' attributes should not be used + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_null.html#%7B%22message%22%3A%22The%20image%20'alt'%20attribute%20is%20empty%2C%20but%20the%20'title'%20attribute%20is%20not%20empty%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_decorative%22%7D">The image 'alt' attribute is empty, but the 'title' attribute is not empty</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>object_text_exists</strong>: &lt;object&gt; element must have a text alternative for the content rendered by the object + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/object_text_exists.html#%7B%22message%22%3A%22An%20%3Cobject%3E%20element%20does%20not%20have%20a%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_text_alternative%22%7D">An &lt;object&gt; element does not have a text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>svg_graphics_labelled</strong>: A non-decorative SVG element must have an accessible name + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/svg_graphics_labelled.html#%7B%22message%22%3A%22The%20SVG%20element%20has%20no%20accessible%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_acc_name%22%7D">The SVG element has no accessible name</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>application_content_accessible</strong>: Non-decorative static text and image content within an element with "application" role must be accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/application_content_accessible.html#%7B%22message%22%3A%22Verify%20that%20the%20non-decorative%20static%20text%20and%20image%20content%20within%20an%20element%20with%20%5C%22application%5C%22%20role%20are%20accessible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the non-decorative static text and image content within an element with "application" role are accessible</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_misuse</strong>: 'alt' attribute value must be a good inline replacement for the image + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_misuse.html#%7B%22message%22%3A%22Verify%20that%20the%20file%20name%20serves%20as%20a%20good%20inline%20replacement%20for%20the%20image%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the file name serves as a good inline replacement for the image</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_ismap_misuse</strong>: Server-side image map hot-spots must have duplicate text links + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_ismap_misuse.html#%7B%22message%22%3A%22Server-side%20image%20map%20hot-spots%20do%20not%20have%20duplicate%20text%20links%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Server-side image map hot-spots do not have duplicate text links</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_longdesc_misuse</strong>: The 'longdesc' attribute must reference HTML content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_longdesc_misuse.html#%7B%22message%22%3A%22Verify%20that%20the%20file%20designated%20by%20the%20'longdesc'%20attribute%20contains%20valid%20HTML%20content%20(file%20extension%20not%20recognized)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the file designated by the 'longdesc' attribute contains valid HTML content (file extension not recognized)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>media_alt_exists</strong>: Audio or video on the page must have a short text alternative that describes the media content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_alt_exists.html#%7B%22message%22%3A%22Filename%20used%20as%20label%20for%20embedded%20audio%20or%20video%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Filename used as label for embedded audio or video</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>style_background_decorative</strong>: Images included by using CSS alone must not convey important information + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_background_decorative.html#%7B%22message%22%3A%22Verify%20the%20CSS%20background%20image%20does%20not%20convey%20important%20information%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify the CSS background image does not convey important information</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>figure_label_exists</strong>: A &lt;figure&gt; element must have an associated label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/figure_label_exists.html#%7B%22message%22%3A%22The%20%3Cfigure%3E%20element%20does%20not%20have%20an%20associated%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;figure&gt; element does not have an associated label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>embed_alt_exists</strong>: Provide alternative content for &lt;embed&gt; elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/embed_alt_exists.html#%7B%22message%22%3A%22Verify%20that%20the%20%3Cembed%3E%20element%20has%20alternative%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the &lt;embed&gt; element has alternative content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>media_alt_brief</strong>: Alternative text in 'alt' attribute should be brief (&lt;150 characters) + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_alt_brief.html#%7B%22message%22%3A%22Text%20alternative%20is%20more%20than%20150%20characters%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Text alternative is more than 150 characters</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>noembed_content_exists</strong>: &lt;noembed&gt; elements should contain descriptive text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/noembed_content_exists.html#%7B%22message%22%3A%22Add%20descriptive%20text%20to%20the%20%3Cnoembed%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Add descriptive text to the &lt;noembed&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>canvas_content_described</strong>: The &lt;canvas&gt; element may not be accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/canvas_content_described.html#%7B%22message%22%3A%22Verify%20accessibility%20of%20the%20%3Ccanvas%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify accessibility of the &lt;canvas&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_background</strong>: Background images that convey important information must have a text alternative that describes the image + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_background.html#%7B%22message%22%3A%22Verify%20important%20background%20image%20information%20has%20a%20text%20alternative%20in%20system%20high%20contrast%20mode%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify important background image information has a text alternative in system high contrast mode</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>style_highcontrast_visible</strong>: Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_highcontrast_visible.html#%7B%22message%22%3A%22Confirm%20Windows%20high%20contrast%20mode%20is%20supported%20when%20using%20CSS%20to%20include%2C%20position%20or%20alter%20non-decorative%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Confirm Windows high contrast mode is supported when using CSS to include, position or alter non-decorative content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.2.1 Audio-only and Video-only (Prerecorded) [A]</h2> + <div>For prerecorded audio-only or video-only media, an alternative provides equivalent information.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>media_audio_transcribed</strong>: Audio information should also be available in text form + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_audio_transcribed.html#%7B%22message%22%3A%22Provide%20transcripts%20for%20audio%20files%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Provide transcripts for audio files</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.2.2 Captions (Prerecorded) [A]</h2> + <div>Captions are provided for all prerecorded audio content in synchronized media.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>caption_track_exists</strong>: A &lt;video&gt; element must have a text alternative for any meaningful audio content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/caption_track_exists.html#%7B%22message%22%3A%22Verify%20that%20captions%20are%20available%20for%20any%20meaningful%20audio%20or%20provide%20a%20caption%20track%20for%20the%20%3Cvideo%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that captions are available for any meaningful audio or provide a caption track for the &lt;video&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.2.3 Audio Description or Media Alternative (Prerecorded) [A]</h2> + <div>An alternative for time-based media or audio description of the prerecorded video content is provided for synchronized media.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>media_track_available</strong>: Pre-recorded media should have an audio track that describes visual information + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_track_available.html#%7B%22message%22%3A%22Verify%20availability%20of%20a%20user-selectable%20audio%20track%20with%20description%20of%20visual%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify availability of a user-selectable audio track with description of visual content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.2.4 Captions (Live) [AA]</h2> + <div>Captions are provided for all live audio content in synchronized media.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>media_live_captioned</strong>: Live media (streaming video with audio) should have captions for audio content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_live_captioned.html#%7B%22message%22%3A%22Verify%20captions%20are%20provided%20for%20live%20media%20(streaming%20video%20with%20audio)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify captions are provided for live media (streaming video with audio)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.2.5 Audio Description (Prerecorded) [AA]</h2> + <div>Audio description is provided for all prerecorded video content in synchronized media.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>media_track_available</strong>: Pre-recorded media should have an audio track that describes visual information + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_track_available.html#%7B%22message%22%3A%22Verify%20availability%20of%20a%20user-selectable%20audio%20track%20with%20description%20of%20visual%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify availability of a user-selectable audio track with description of visual content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.3.1 Info and Relationships [A]</h2> + <div>Information, structure, and relationships conveyed through presentation can be programmatically determined or are available in text.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>input_checkboxes_grouped</strong>: Related sets of radio buttons or checkboxes should be programmatically grouped + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22%7B0%7D%20input%20found%20that%20has%20the%20same%20name%2C%20%5C%22%7B2%7D%5C%22%20as%20a%20%7B1%7D%20input%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_controlnamemismatch%22%7D">{0} input found that has the same name, "{2}" as a {1} input</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22%7B0%7D%20input%20is%20not%20in%20the%20group%20with%20another%20%7B0%7D%20with%20the%20name%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_notgroupedothergrouped%22%7D">{0} input is not in the group with another {0} with the name "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22%7B0%7D%20input%20and%20others%20with%20the%20name%20%5C%22%7B1%7D%5C%22%20are%20not%20grouped%20together%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_notgroupedothernotgrouped%22%7D">{0} input and others with the name "{1}" are not grouped together</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22%7B0%7D%20input%20is%20in%20a%20different%20group%20than%20another%20%7B0%7D%20with%20the%20name%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_notsamegroup%22%7D">{0} input is in a different group than another {0} with the name "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22Verify%20that%20this%20ungrouped%20checkbox%20input%20is%20not%20related%20to%20other%20checkboxes%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_lonecheckbox%22%7D">Verify that this ungrouped checkbox input is not related to other checkboxes</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22Verify%20that%20this%20un-named%2C%20ungrouped%20checkbox%20input%20is%20not%20related%20to%20other%20checkboxes%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_unnamedcheckbox%22%7D">Verify that this un-named, ungrouped checkbox input is not related to other checkboxes</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_headers_ref_valid</strong>: The 'headers' attribute should refer to a valid cell in the same table + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_ref_valid.html#%7B%22message%22%3A%22The%20'headers'%20attribute%20value%20%5C%22%7B0%7D%5C%22%20does%20not%20reference%20a%20valid%20'id'%20in%20this%20document%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The 'headers' attribute value "{0}" does not reference a valid 'id' in this document</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_ref_valid.html#%7B%22message%22%3A%22The%20'headers'%20attribute%20value%20%5C%22%7B0%7D%5C%22%20refers%20to%20itself%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The 'headers' attribute value "{0}" refers to itself</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_ref_valid.html#%7B%22message%22%3A%22The%20'headers'%20attribute%20value%20%5C%22%7B0%7D%5C%22%20does%20not%20refer%20to%20a%20cell%20in%20the%20same%20table%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">The 'headers' attribute value "{0}" does not refer to a cell in the same table</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_ref_valid.html#%7B%22message%22%3A%22The%20'headers'%20attribute%20value%20%5C%22%7B0%7D%5C%22%20does%20not%20refer%20to%20a%20cell%20indicated%20with%20%3Cth%3E%20or%20a%20role%20of%20%5C%22columnheader%5C%22%20or%20%5C%22rowheader%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_4%22%7D">The 'headers' attribute value "{0}" does not refer to a cell indicated with &lt;th&gt; or a role of "columnheader" or "rowheader"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>fieldset_label_valid</strong>: Groups with nested inputs must have unique accessible name + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_label_valid.html#%7B%22message%22%3A%22Group%2FFieldset%20does%20not%20have%20an%20accessible%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Group/Fieldset does not have an accessible name</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_label_valid.html#%7B%22message%22%3A%22Group%2FFieldset%20%5C%22%7B0%7D%5C%22%20has%20a%20duplicate%20name%20to%20another%20group%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Group/Fieldset "{0}" has a duplicate name to another group</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_scope_valid</strong>: Value for 'scope' attribute must be "row", "col", "rowgroup", or "colgroup" + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_scope_valid.html#%7B%22message%22%3A%22Value%20provided%20is%20invalid%20for%20the%20'scope'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Value provided is invalid for the 'scope' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_scope_valid.html#%7B%22message%22%3A%22The%20'scope'%20attribute%20should%20only%20be%20used%20on%20a%20%3Cth%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The 'scope' attribute should only be used on a &lt;th&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_banner_label_unique</strong>: Each element with "banner" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_banner_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22banner%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "banner" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_banner_single</strong>: A page, document, or application should only have one element with "banner" role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_banner_single.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22banner%5C%22%20role%20found%20on%20the%20page%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "banner" role found on the page</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_complementary_label_unique</strong>: Each element with "complementary" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_complementary_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22complementary%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "complementary" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_complementary_labelled</strong>: Each element with "complementary" role must have a label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_complementary_labelled.html#%7B%22message%22%3A%22Element%20with%20%5C%22complementary%5C%22%20role%20does%20not%20have%20a%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "complementary" role does not have a label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_contentinfo_label_unique</strong>: Each element with "contentinfo" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_contentinfo_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22contentinfo%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "contentinfo" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_contentinfo_single</strong>: A page, document, or application should only have one element with "contentinfo" role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_contentinfo_single.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22contentinfo%5C%22%20role%20found%20on%20the%20page%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "contentinfo" role found on the page</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_form_label_unique</strong>: Each element with "form" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_form_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22form%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "form" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_hidden_nontabbable</strong>: A hidden element should not contain any tabbable elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_hidden_nontabbable.html#%7B%22message%22%3A%22Element%20%5C%22%7B0%7D%5C%22%20should%20not%20be%20focusable%20within%20the%20subtree%20of%20an%20element%20with%20an%20'aria-hidden'%20attribute%20with%20value%20'true'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element "{0}" should not be focusable within the subtree of an element with an 'aria-hidden' attribute with value 'true'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_main_label_unique</strong>: Each element with "main" role must have unique label that describes its purposes + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_main_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22main%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "main" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_navigation_label_unique</strong>: Each element with "navigation" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_navigation_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22navigation%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "navigation" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_parent_required</strong>: Each element with an implicit or explicit role must be contained within a valid element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_parent_required.html#%7B%22message%22%3A%22Element%20with%20%5C%22%7B0%7D%5C%22%20role%20is%20not%20contained%20in%20or%20owned%20by%20an%20element%20with%20one%20of%20the%20following%20roles%3A%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "{0}" role is not contained in or owned by an element with one of the following roles: "{1}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_region_label_unique</strong>: Each element with "region" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_region_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22region%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "region" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_region_labelled</strong>: Each element with "region" role must have a label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_region_labelled.html#%7B%22message%22%3A%22Element%20with%20%5C%22region%5C%22%20role%20does%20not%20have%20a%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "region" role does not have a label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>form_label_unique</strong>: Form controls should have exactly one label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/form_label_unique.html#%7B%22message%22%3A%22Form%20control%20has%20more%20than%20one%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Form control has more than one label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>label_ref_valid</strong>: The 'for' attribute for a label should reference a non-empty, unique 'id' attribute of a valid element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/label_ref_valid.html#%7B%22message%22%3A%22The%20value%20%5C%22%7B0%7D%5C%22%20of%20the%20'for'%20attribute%20is%20not%20the%20'id'%20of%20a%20valid%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid%22%7D">The value "{0}" of the 'for' attribute is not the 'id' of a valid element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_caption_empty</strong>: A &lt;caption&gt; element for a &lt;table> element must contain descriptive text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_caption_empty.html#%7B%22message%22%3A%22The%20%3Ctable%3E%20element%20has%20an%20empty%20%3Ccaption%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;table&gt; element has an empty &lt;caption> element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_caption_nested</strong>: The &lt;caption&gt; element must be nested inside the associated &lt;table> element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_caption_nested.html#%7B%22message%22%3A%22%3Ccaption%3E%20element%20is%20not%20nested%20inside%20a%20%3Ctable%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">&lt;caption&gt; element is not nested inside a &lt;table> element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_headers_exists</strong>: Data table must identify headers + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_exists.html#%7B%22message%22%3A%22Table%20has%20no%20headers%20identified%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Table has no headers identified</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_headers_related</strong>: For a complex data table, all &lt;th&gt; and &lt;td> elements must be related via 'header' or 'scope' attributes + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_related.html#%7B%22message%22%3A%22Complex%20table%20does%20not%20have%20headers%20for%20each%20cell%20properly%20defined%20with%20'header'%20or%20'scope'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Complex table does not have headers for each cell properly defined with 'header' or 'scope'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_structure_misuse</strong>: Table elements with 'role="presentation" or 'role="none" should not have structural elements or attributes + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_structure_misuse.html#%7B%22message%22%3A%22The%20%3C%7B0%7D%3E%20element%20with%20%5C%22presentation%5C%22%20role%20or%20%5C%22none%5C%22%20role%20has%20structural%20element(s)%20and%2For%20attribute(s)%20'%7B1%7D'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;{0}&gt; element with "presentation" role or "none" role has structural element(s) and/or attribute(s) '{1}'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_summary_redundant</strong>: The table summary must not duplicate the caption + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_summary_redundant.html#%7B%22message%22%3A%22The%20table%20summary%20duplicates%20the%20caption%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The table summary duplicates the caption</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>blockquote_cite_exists</strong>: Use &lt;blockquote&gt; only for quotations, not indentation + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/blockquote_cite_exists.html#%7B%22message%22%3A%22Verify%20that%20%3Cblockquote%3E%20should%20have%20a%20'cite'%20attribute%20and%20not%20be%20used%20for%20indentation%20only%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that &lt;blockquote&gt; should have a 'cite' attribute and not be used for indentation only</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>heading_markup_misuse</strong>: Heading elements must not be used for presentation + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/heading_markup_misuse.html#%7B%22message%22%3A%22Verify%20that%20the%20heading%20element%20is%20a%20genuine%20heading%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the heading element is a genuine heading</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>list_markup_review</strong>: Proper HTML elements should be used to create a list + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/list_markup_review.html#%7B%22message%22%3A%22Verify%20this%20is%20a%20list%20and%20if%20so%2C%20modify%20to%20use%20proper%20HTML%20elements%20for%20the%20list%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_list%22%7D">Verify this is a list and if so, modify to use proper HTML elements for the list</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>text_block_heading</strong>: Heading text should use a heading element or role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_block_heading.html#%7B%22message%22%3A%22Confirm%20this%20text%20'%7B0%7D'%20is%20used%20as%20a%20heading%20and%20if%20so%2C%20modify%20to%20use%20a%20heading%20element%20or%20role%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_heading%22%7D">Confirm this text '{0}' is used as a heading and if so, modify to use a heading element or role</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>text_quoted_correctly</strong>: Quotations should be marked with &lt;q&gt; or &lt;blockquote> elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_quoted_correctly.html#%7B%22message%22%3A%22If%20the%20following%20text%20is%20a%20quotation%2C%20mark%20it%20as%20a%20%3Cq%3E%20or%20%3Cblockquote%3E%20element%3A%20%7B0%7D%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">If the following text is a quotation, mark it as a &lt;q&gt; or &lt;blockquote> element: {0}</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>fieldset_legend_valid</strong>: &lt;fieldset&gt; elements should have a single, non-empty &lt;legend> as a label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_legend_valid.html#%7B%22message%22%3A%22%3Cfieldset%3E%20element%20does%20not%20have%20a%20%3Clegend%3E%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">&lt;fieldset&gt; element does not have a &lt;legend></a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_legend_valid.html#%7B%22message%22%3A%22%3Cfieldset%3E%20element%20has%20more%20than%20one%20%3Clegend%3E%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">&lt;fieldset&gt; element has more than one &lt;legend></a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_legend_valid.html#%7B%22message%22%3A%22%3Cfieldset%3E%20element%20%3Clegend%3E%20is%20empty%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">&lt;fieldset&gt; element &lt;legend> is empty</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_child_valid</strong>: An element with an ARIA role must own a required child + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_child_valid.html#%7B%22message%22%3A%22The%20element%20with%20role%20%5C%22%7B0%7D%5C%22%20does%20not%20own%20any%20child%20element%20with%20any%20of%20the%20following%20role(s)%3A%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_no_child%22%7D">The element with role "{0}" does not own any child element with any of the following role(s): "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_child_valid.html#%7B%22message%22%3A%22The%20element%20with%20role%20%5C%22%7B0%7D%5C%22%20owns%20the%20child%20element%20with%20the%20role%20%5C%22%7B1%7D%5C%22%20that%20is%20not%20one%20of%20the%20allowed%20role(s)%3A%20%5C%22%7B2%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_invalid_child%22%7D">The element with role "{0}" owns the child element with the role "{1}" that is not one of the allowed role(s): "{2}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_complementary_label_visible</strong>: Each element with "complementary" role should have a visible label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_complementary_label_visible.html#%7B%22message%22%3A%22Element%20with%20%5C%22complementary%5C%22%20role%20does%20not%20have%20a%20visible%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "complementary" role does not have a visible label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_content_in_landmark</strong>: All content must reside within an element with a landmark role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_content_in_landmark.html#%7B%22message%22%3A%22Content%20is%20not%20within%20a%20landmark%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Content is not within a landmark element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_contentinfo_misuse</strong>: Each element with "contentinfo" role is only permitted with an element with "main" role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_contentinfo_misuse.html#%7B%22message%22%3A%22Element%20with%20%5C%22contentinfo%5C%22%20role%20is%20present%20without%20an%20element%20with%20%5C%22main%5C%22%20role%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "contentinfo" role is present without an element with "main" role</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_landmark_name_unique</strong>: Each landmark should have a unique 'aria-labelledby' or 'aria-label' or be nested in a different parent region + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_landmark_name_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22%7B0%7D%5C%22%20landmarks%20within%20the%20same%20parent%20region%20are%20not%20distinguished%20from%20one%20another%20because%20they%20have%20the%20same%20%5C%22%7B1%7D%5C%22%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "{0}" landmarks within the same parent region are not distinguished from one another because they have the same "{1}" label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_main_label_visible</strong>: Each element with "main" role should have a unique visible label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_main_label_visible.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22main%5C%22%20role%20do%20not%20have%20unique%20visible%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "main" role do not have unique visible labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_fields_grouped</strong>: Groups of logically related input elements should be contained within a &lt;fieldset&gt; element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_fields_grouped.html#%7B%22message%22%3A%22Use%20the%20%3Cfieldset%3E%20element%20to%20group%20logically%20related%20input%20elements%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Use the &lt;fieldset&gt; element to group logically related input elements</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>list_structure_proper</strong>: List elements should only be used for lists of related items + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/list_structure_proper.html#%7B%22message%22%3A%22List%20element%20is%20missing%20or%20improperly%20structured%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">List element is missing or improperly structured</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>select_options_grouped</strong>: Groups of related options within a selection list should be grouped with &lt;optgroup&gt; + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/select_options_grouped.html#%7B%22message%22%3A%22Group%20of%20related%20options%20may%20need%20%3Coptgroup%3E%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Group of related options may need &lt;optgroup&gt;</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_layout_linearized</strong>: Avoid using tables to format text documents in columns unless the table can be linearized + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_layout_linearized.html#%7B%22message%22%3A%22Verify%20table%20is%20not%20being%20used%20to%20format%20text%20content%20in%20columns%20unless%20the%20table%20can%20be%20linearized%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify table is not being used to format text content in columns unless the table can be linearized</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.3.2 Meaningful Sequence [A]</h2> + <div>When the sequence in which content is presented affects its meaning, a correct reading sequence can be programmatically determined.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>dir_attribute_valid</strong>: 'dir' attribute value must be "ltr", "rtl", or "auto" + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/dir_attribute_valid.html#%7B%22message%22%3A%22Invalid%20value%20used%20for%20the%20'dir'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Invalid value used for the 'dir' attribute</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>text_whitespace_valid</strong>: Space characters should not be used to control spacing within a word + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_whitespace_valid.html#%7B%22message%22%3A%22Space%20characters%20should%20not%20be%20used%20to%20create%20space%20between%20the%20letters%20of%20a%20word%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_text%22%7D">Space characters should not be used to create space between the letters of a word</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>style_highcontrast_visible</strong>: Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_highcontrast_visible.html#%7B%22message%22%3A%22Confirm%20Windows%20high%20contrast%20mode%20is%20supported%20when%20using%20CSS%20to%20include%2C%20position%20or%20alter%20non-decorative%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Confirm Windows high contrast mode is supported when using CSS to include, position or alter non-decorative content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.3.3 Sensory Characteristics [A]</h2> + <div>Instructions provided for understanding and operating content do not rely solely on sensory characteristics of components such as shape, size, visual location, orientation, or sound.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>text_sensory_misuse</strong>: Instructions should be meaningful without relying solely on shape, size, or location words + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_sensory_misuse.html#%7B%22message%22%3A%22Confirm%20the%20word(s)%20'%7B0%7D'%20of%20the%20user%20instruction%20is%20used%20to%20indicate%20a%20logical%20rather%20than%20visual%20position%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_position%22%7D">Confirm the word(s) '{0}' of the user instruction is used to indicate a logical rather than visual position</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_sensory_misuse.html#%7B%22message%22%3A%22Confirm%20the%20user%20instruction%20is%20still%20understandable%20without%20the%20word(s)%20'%7B0%7D'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_other%22%7D">Confirm the user instruction is still understandable without the word(s) '{0}'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.3.4 Orientation [AA]</h2> + <div>Content does not restrict its view and operation to a single display orientation, such as portrait or landscape.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>element_orientation_unlocked</strong>: Elements should not be restricted to either landscape or portrait orientation using CSS transform property + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_orientation_unlocked.html#%7B%22message%22%3A%22The%20element%20%3C%7B0%7D%3E%20is%20restricted%20to%20either%20landscape%20or%20portrait%20orientation%20using%20CSS%20transform%20property%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_locked%22%7D">The element &lt;{0}&gt; is restricted to either landscape or portrait orientation using CSS transform property</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.3.5 Identify Input Purpose [AA]</h2> + <div>The purpose of each input field that collects information about the user can be programmatically determined when the field serves a common purpose.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>input_autocomplete_valid</strong>: The 'autocomplete' attribute's token(s) must be appropriate for the input form field + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_autocomplete_valid.html#%7B%22message%22%3A%22The%20'autocomplete'%20attribute's%20token(s)%20are%20not%20appropriate%20for%20the%20input%20form%20field%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_inappropriate%22%7D">The 'autocomplete' attribute's token(s) are not appropriate for the input form field</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_autocomplete_valid.html#%7B%22message%22%3A%22The%20'autocomplete'%20attribute's%20token(s)%20are%20not%20appropriate%20for%20an%20input%20form%20field%20of%20any%20type%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid%22%7D">The 'autocomplete' attribute's token(s) are not appropriate for an input form field of any type</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_autocomplete_valid.html#%7B%22message%22%3A%22The%20'autocomplete'%20attribute%20has%20an%20incorrect%20value%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_incorrect%22%7D">The 'autocomplete' attribute has an incorrect value</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.1 Use of Color [A]</h2> + <div>Color is not used as the only visual means of conveying information, indicating an action, prompting a response, or distinguishing a visual element.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>form_font_color</strong>: Combine color and descriptive markup to indicate required form fields + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/form_font_color.html#%7B%22message%22%3A%22Check%20color%20is%20not%20used%20as%20the%20only%20visual%20means%20to%20convey%20which%20fields%20are%20required%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Check color is not used as the only visual means to convey which fields are required</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>style_color_misuse</strong>: Combine color and descriptive markup to convey information + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_color_misuse.html#%7B%22message%22%3A%22Verify%20color%20is%20not%20used%20as%20the%20only%20visual%20means%20of%20conveying%20information%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify color is not used as the only visual means of conveying information</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.2 Audio Control [A]</h2> + <div>If any audio plays automatically for more than 3 seconds, either a mechanism is available to pause or stop the audio, or a mechanism is available to control audio volume independently from the overall system volume level.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>media_autostart_controllable</strong>: Mechanism must be available to pause or stop and control the volume of the audio that plays automatically + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_autostart_controllable.html#%7B%22message%22%3A%22Verify%20there%20is%20a%20mechanism%20to%20pause%20or%20stop%20and%20control%20the%20volume%20for%20the%20audio%20that%20plays%20automatically%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify there is a mechanism to pause or stop and control the volume for the audio that plays automatically</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.3 Contrast (Minimum) [AA]</h2> + <div>The visual presentation of text and images of text has a contrast ratio of at least 4.5:1, with a 3:1 ratio for large-scale text.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>text_contrast_sufficient</strong>: The contrast ratio of text with its background must meet WCAG AA requirements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_contrast_sufficient.html#%7B%22message%22%3A%22Text%20contrast%20of%20%7B0%7D%20with%20its%20background%20is%20less%20than%20the%20WCAG%20AA%20minimum%20requirements%20for%20text%20of%20size%20%7B1%7Dpx%20and%20weight%20of%20%7B2%7D%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_contrast%22%7D">Text contrast of {0} with its background is less than the WCAG AA minimum requirements for text of size {1}px and weight of {2}</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_contrast_sufficient.html#%7B%22message%22%3A%22The%20foreground%20text%20and%20its%20background%20color%20are%20both%20detected%20as%20%7B3%7D.%20Verify%20the%20text%20meets%20the%20WCAG%20AA%20requirements%20for%20minimum%20contrast%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_same_color%22%7D">The foreground text and its background color are both detected as {3}. Verify the text meets the WCAG AA requirements for minimum contrast</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_contrast_sufficient.html#%7B%22message%22%3A%22Verify%20the%20contrast%20ratio%20of%20the%20text%20against%20the%20lightest%20and%20the%20darkest%20colors%20of%20the%20background%20meets%20the%20WCAG%20AA%20minimum%20requirements%20for%20text%20of%20size%20%7B1%7Dpx%20and%20weight%20of%20%7B2%7D%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_graphic_background%22%7D">Verify the contrast ratio of the text against the lightest and the darkest colors of the background meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_contrast_sufficient.html#%7B%22message%22%3A%22Verify%20the%20contrast%20ratio%20of%20the%20text%20with%20shadow%20meets%20the%20WCAG%20AA%20minimum%20requirements%20for%20text%20of%20size%20%7B1%7Dpx%20and%20weight%20of%20%7B2%7D%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_text_shadow%22%7D">Verify the contrast ratio of the text with shadow meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.4 Resize text [AA]</h2> + <div>Text can be resized without assistive technology up to 200 percent without loss of content or functionality.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>style_viewport_resizable</strong>: Text must scale up to 200% without loss of content or functionality + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_viewport_resizable.html#%7B%22message%22%3A%22Verify%20that%20text%20sized%20using%20viewport%20units%20can%20be%20resized%20up%20to%20200%25%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that text sized using viewport units can be resized up to 200%</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>meta_viewport_zoomable</strong>: The 'meta[name=viewport]' should not prevent the browser zooming the content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/meta_viewport_zoomable.html#%7B%22message%22%3A%22Confirm%20the%20'meta%5Bname%3Dviewport%5D'%20with%20%5C%22%7B0%7D%5C%22%20can%20be%20zoomed%20by%20user%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_zoomable%22%7D">Confirm the 'meta[name=viewport]' with "{0}" can be zoomed by user</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.5 Images of Text [AA]</h2> + <div>If the technologies being used can achieve the visual presentation, text should not be used to convey information rather than images of text.</div> + +</div><div> + <h2>1.4.10 Reflow [AA]</h2> + <div>Content can reflow without loss of information or functionality, and without requiring scrolling in two dimensions.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>style_viewport_resizable</strong>: Text must scale up to 200% without loss of content or functionality + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_viewport_resizable.html#%7B%22message%22%3A%22Verify%20that%20text%20sized%20using%20viewport%20units%20can%20be%20resized%20up%20to%20200%25%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that text sized using viewport units can be resized up to 200%</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.11 Non-text Contrast [AA]</h2> + <div>The parts of graphical objects required to understand the content, and the visual information required to identify UI components and states, have a contrast ratio of at least 3:1 against adjacent colors.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>style_highcontrast_visible</strong>: Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_highcontrast_visible.html#%7B%22message%22%3A%22Confirm%20Windows%20high%20contrast%20mode%20is%20supported%20when%20using%20CSS%20to%20include%2C%20position%20or%20alter%20non-decorative%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Confirm Windows high contrast mode is supported when using CSS to include, position or alter non-decorative content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.12 Text Spacing [AA]</h2> + <div>No loss of content or functionality occurs when users change letter, word and paragraph spacing, as well as line height.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>text_spacing_valid</strong>: CSS !important should not be used in inline style to control letter or word spacing or line height + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_spacing_valid.html#%7B%22message%22%3A%22CSS%20!important%20should%20not%20be%20used%20in%20inline%20%E2%80%98letter-spacing%E2%80%99%20style%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_letter_spacing_style%22%7D">CSS !important should not be used in inline ‘letter-spacing’ style</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_spacing_valid.html#%7B%22message%22%3A%22CSS%20!important%20should%20not%20be%20used%20in%20inline%20%E2%80%98word-spacing%E2%80%99%20style%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_word_spacing_style%22%7D">CSS !important should not be used in inline ‘word-spacing’ style</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_spacing_valid.html#%7B%22message%22%3A%22CSS%20!important%20should%20not%20be%20used%20in%20inline%20%E2%80%98line-height%E2%80%99%20style%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_line_height_style%22%7D">CSS !important should not be used in inline ‘line-height’ style</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.13 Content on Hover or Focus [AA]</h2> + <div>Where hover or focus actions cause additional content to become visible and hidden, the additional content is dismissable, hoverable and persistent.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>style_hover_persistent</strong>: The pointer should be able to move over content displayed on hover + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_hover_persistent.html#%7B%22message%22%3A%22Confirm%20the%20pointer%20can%20be%20positioned%20over%20the%20displayed%20element%2C%20not%20just%20the%20trigger%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Confirm the pointer can be positioned over the displayed element, not just the trigger</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_hover_persistent.html#%7B%22message%22%3A%22Confirm%20the%20pointer%20can%20be%20positioned%20over%20all%20the%20information%20displayed%20on%20hover%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_2%22%7D">Confirm the pointer can be positioned over all the information displayed on hover</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_hover_persistent.html#%7B%22message%22%3A%22Confirm%20the%20margin%20style%20attribute%20has%20not%20prevented%20the%20pointer%20from%20hovering%20over%20the%20displayed%20element%2C%20not%20just%20the%20trigger%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_3%22%7D">Confirm the margin style attribute has not prevented the pointer from hovering over the displayed element, not just the trigger</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.1.1 Keyboard [A]</h2> + <div>All functionality of the content is operable through a keyboard interface without requiring specific timings for individual keystrokes.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>aria_activedescendant_tabindex_valid</strong>: Element using 'aria-activedescendant' property should be tabbable + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_activedescendant_tabindex_valid.html#%7B%22message%22%3A%22The%20%3C%7B0%7D%3E%20element%20using%20'aria-activedescendant'%20set%20to%20%5C%22%7B1%7D%5C%22%20is%20not%20tabbable%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;{0}&gt; element using 'aria-activedescendant' set to "{1}" is not tabbable</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_child_tabbable</strong>: UI component must have at least one tabbable descendant for keyboard access + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_child_tabbable.html#%7B%22message%22%3A%22None%20of%20the%20descendent%20elements%20with%20%5C%22%7B1%7D%5C%22%20role%20is%20tabbable%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_missing_child%22%7D">None of the descendent elements with "{1}" role is tabbable</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>iframe_interactive_tabbable</strong>: Iframe with interactive content should not be excluded from tab order using tabindex + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/iframe_interactive_tabbable.html#%7B%22message%22%3A%22The%20%3Ciframe%3E%20with%20interactive%20content%20is%20excluded%20from%20tab%20order%20using%20tabindex%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid%22%7D">The &lt;iframe&gt; with interactive content is excluded from tab order using tabindex</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>application_content_accessible</strong>: Non-decorative static text and image content within an element with "application" role must be accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/application_content_accessible.html#%7B%22message%22%3A%22Verify%20that%20the%20non-decorative%20static%20text%20and%20image%20content%20within%20an%20element%20with%20%5C%22application%5C%22%20role%20are%20accessible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the non-decorative static text and image content within an element with "application" role are accessible</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_keyboard_handler_exists</strong>: Interactive WAI_ARIA UI components must provide keyboard access + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_keyboard_handler_exists.html#%7B%22message%22%3A%22Verify%20the%20%3C%7B0%7D%3E%20element%20with%20%5C%22%7B1%7D%5C%22%20role%20has%20keyboard%20access%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_no_keyboard_access%22%7D">Verify the &lt;{0}&gt; element with "{1}" role has keyboard access</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>script_focus_blur_review</strong>: Scripting must not remove focus from content that normally receives focus + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_focus_blur_review.html#%7B%22message%22%3A%22Verify%20script%20does%20not%20remove%20focus%20from%20content%20that%20normally%20receives%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify script does not remove focus from content that normally receives focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>script_onclick_misuse</strong>: Scripts should not be used to emulate links + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_onclick_misuse.html#%7B%22message%22%3A%22Possible%20use%20of%20a%20script%20to%20emulate%20a%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Possible use of a script to emulate a link</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>widget_tabbable_exists</strong>: Component must have at least one tabbable element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/widget_tabbable_exists.html#%7B%22message%22%3A%22Component%20with%20%5C%22%7B0%7D%5C%22%20role%20does%20not%20have%20a%20tabbable%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22fail_no_tabbable%22%7D">Component with "{0}" role does not have a tabbable element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>widget_tabbable_single</strong>: Components with a widget role must have no more than one tabbable element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/widget_tabbable_single.html#%7B%22message%22%3A%22Component%20with%20%5C%22%7B0%7D%5C%22%20role%20has%20more%20than%20one%20tabbable%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_multiple_tabbable%22%7D">Component with "{0}" role has more than one tabbable element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>media_keyboard_controllable</strong>: Media using &lt;audio&gt; and/or &lt;video> elements must have keyboard accessible controls + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_keyboard_controllable.html#%7B%22message%22%3A%22Verify%20media%20using%20%3Caudio%3E%20and%2For%20%3Cvideo%3E%20elements%20have%20keyboard%20accessible%20controls%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify media using &lt;audio&gt; and/or &lt;video> elements have keyboard accessible controls</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>script_onclick_avoid</strong>: Scripts should not be used to emulate links + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_onclick_avoid.html#%7B%22message%22%3A%22Verify%20that%20'onclick'%20events%20are%20not%20used%20in%20script%20to%20emulate%20a%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that 'onclick' events are not used in script to emulate a link</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>canvas_content_described</strong>: The &lt;canvas&gt; element may not be accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/canvas_content_described.html#%7B%22message%22%3A%22Verify%20accessibility%20of%20the%20%3Ccanvas%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify accessibility of the &lt;canvas&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>element_mouseevent_keyboard</strong>: All interactive content with mouse event handlers must have equivalent keyboard access + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_mouseevent_keyboard.html#%7B%22message%22%3A%22Confirm%20the%20%3C%7B0%7D%3E%20element%20with%20mouse%20event%20handler(s)%20'%7B1%7D'%20has%20a%20corresponding%20keyboard%20handler(s)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Confirm the &lt;{0}&gt; element with mouse event handler(s) '{1}' has a corresponding keyboard handler(s)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.1.2 No Keyboard Trap [A]</h2> + <div>If keyboard focus can be moved to a component using a keyboard interface, then focus can be moved away from that component using only a keyboard interface, and, if it requires more than unmodified arrow or tab keys or other standard exit methods, the user is advised of the method for moving focus away.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>download_keyboard_controllable</strong>: File download mechanisms should be keyboard-operable and preserve page focus location + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/download_keyboard_controllable.html#%7B%22message%22%3A%22Verify%20that%20the%20file%20download%20mechanism%20does%20not%20cause%20a%20keyboard%20trap%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify that the file download mechanism does not cause a keyboard trap</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.1.4 Character Key Shortcuts [A]</h2> + <div>If a keyboard shortcut is implemented using only letter, punctuation, number or symbol characters, then the shortcut can be turned off, remapped or activated only on focus.</div> + +</div><div> + <h2>2.2.1 Timing Adjustable [A]</h2> + <div>For each time limit that is set by the content, the user can turn off, adjust, or extend the limit.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>meta_refresh_delay</strong>: Pages should not refresh automatically + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/meta_refresh_delay.html#%7B%22message%22%3A%22Verify%20page%20is%20not%20being%20caused%20to%20refresh%20automatically%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_refresh%22%7D">Verify page is not being caused to refresh automatically</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.2.2 Pause, Stop, Hide [A]</h2> + <div>For moving, blinking, scrolling, or auto-updating information, the user can pause, stop, hide or adjust the information.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>blink_elem_deprecated</strong>: Content that blinks persistently must not be used + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/blink_elem_deprecated.html#%7B%22message%22%3A%22Content%20found%20that%20blinks%20persistently%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Content found that blinks persistently</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>marquee_elem_avoid</strong>: The &lt;marquee&gt; element is obsolete and should not be used + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/marquee_elem_avoid.html#%7B%22message%22%3A%22Scrolling%20content%20found%20that%20uses%20the%20obsolete%20%3Cmarquee%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Scrolling content found that uses the obsolete &lt;marquee&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>blink_css_review</strong>: Do not use the "blink" value of the 'text-decoration' property for longer than five seconds + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/blink_css_review.html#%7B%22message%22%3A%22Check%20the%20%5C%22blink%5C%22%20value%20of%20the%20CSS%20'text-decoration'%20property%20is%20not%20used%20for%20more%20than%20than%20five%20seconds%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Check the "blink" value of the CSS 'text-decoration' property is not used for more than than five seconds</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.3.1 Three Flashes or Below Threshold [A]</h2> + <div>Content does not contain anything that flashes more than three times in any one second period, or the flash is below the general flash and red flash thresholds.</div> + +</div><div> + <h2>2.4.1 Bypass Blocks [A]</h2> + <div>A mechanism is available to bypass blocks of content that are repeated on multiple Web pages.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>aria_application_label_unique</strong>: Each element with "application" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_application_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22application%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "application" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_application_labelled</strong>: Each element with "application" role must have a label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_application_labelled.html#%7B%22message%22%3A%22Element%20with%20%5C%22application%5C%22%20role%20does%20not%20have%20a%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_label%22%7D">Element with "application" role does not have a label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_article_label_unique</strong>: Each element with "article" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_article_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22article%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "article" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_document_label_unique</strong>: Each element with "document" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_document_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22document%5C%22%20roles%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "document" roles do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_toolbar_label_unique</strong>: Each element with "toolbar" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_toolbar_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22toolbar%5C%22%20roles%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "toolbar" roles do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>skip_main_exists</strong>: Pages must provide a way to skip directly to the main content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/skip_main_exists.html#%7B%22message%22%3A%22The%20page%20does%20not%20provide%20a%20way%20to%20quickly%20navigate%20to%20the%20main%20content%20(ARIA%20%5C%22main%5C%22%20landmark%20or%20a%20skip%20link)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The page does not provide a way to quickly navigate to the main content (ARIA "main" landmark or a skip link)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>frame_src_valid</strong>: A &lt;frame&gt; containing non-HTML content must be made accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/frame_src_valid.html#%7B%22message%22%3A%22Verify%20%3Cframe%3E%20content%20is%20accessible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify &lt;frame&gt; content is accessible</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>html_skipnav_exists</strong>: Provide a way to bypass blocks of content that are repeated on multiple Web pages + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_skipnav_exists.html#%7B%22message%22%3A%22Verify%20there%20is%20a%20way%20to%20bypass%20blocks%20of%20content%20that%20are%20repeated%20on%20multiple%20Web%20pages%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify there is a way to bypass blocks of content that are repeated on multiple Web pages</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>skip_main_described</strong>: The description of a hyperlink used to skip content must communicate where it links to + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/skip_main_described.html#%7B%22message%22%3A%22Verify%20that%20if%20this%20hyperlink%20skips%20content%2C%20the%20description%20communicates%20where%20it%20links%20to%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that if this hyperlink skips content, the description communicates where it links to</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.2 Page Titled [A]</h2> + <div>Web pages, non-web documents, and software have titles that describe topic or purpose.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>page_title_exists</strong>: The page should have a title that correctly identifies the subject of the page + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/page_title_exists.html#%7B%22message%22%3A%22Missing%20%3Chead%3E%20element%20so%20there%20can%20be%20no%20%3Ctitle%3E%20element%20present%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Missing &lt;head&gt; element so there can be no &lt;title> element present</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/page_title_exists.html#%7B%22message%22%3A%22Missing%20%3Ctitle%3E%20element%20in%20%3Chead%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Missing &lt;title&gt; element in &lt;head> element</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/page_title_exists.html#%7B%22message%22%3A%22The%20%3Ctitle%3E%20element%20is%20empty%20(no%20innerHTML)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">The &lt;title&gt; element is empty (no innerHTML)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>page_title_valid</strong>: Page &lt;title&gt; should be a descriptive title, rather than a filename + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/page_title_valid.html#%7B%22message%22%3A%22Verify%20that%20using%20the%20filename%20as%20the%20page%20%3Ctitle%3E%20value%20is%20descriptive%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_2%22%7D">Verify that using the filename as the page &lt;title&gt; value is descriptive</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.3 Focus Order [A]</h2> + <div>If content can be navigated sequentially and the navigation sequences affect meaning or operation, focusable components receive focus in an order that preserves meaning and operability.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>widget_tabbable_single</strong>: Components with a widget role must have no more than one tabbable element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/widget_tabbable_single.html#%7B%22message%22%3A%22Component%20with%20%5C%22%7B0%7D%5C%22%20role%20has%20more%20than%20one%20tabbable%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_multiple_tabbable%22%7D">Component with "{0}" role has more than one tabbable element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.4 Link Purpose (In Context) [A]</h2> + <div>The purpose of each link can be determined from the link text alone or from the link text together with its programmatically determined link content.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>img_alt_redundant</strong>: The text alternative for an image within a link should not repeat the link text or adjacent link text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Link%20text%20is%20repeated%20in%20an%20image%20'alt'%20value%20within%20the%20same%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Link text is repeated in an image 'alt' value within the same link</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Link%20text%20of%20previous%20link%20is%20repeated%20in%20image%20'alt'%20value%20of%20a%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Link text of previous link is repeated in image 'alt' value of a link</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Image%20'alt'%20value%20within%20a%20link%20is%20repeated%20in%20link%20text%20of%20the%20link%20after%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Image 'alt' value within a link is repeated in link text of the link after</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>a_text_purpose</strong>: Hyperlinks must have an accessible name for their purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/a_text_purpose.html#%7B%22message%22%3A%22Hyperlink%20has%20no%20link%20text%2C%20label%20or%20image%20with%20a%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_acc_name%22%7D">Hyperlink has no link text, label or image with a text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.5 Multiple Ways [AA]</h2> + <div>More than one way is available to locate a Web page within a set of Web pages, except where the Web Page is the result of, or a step in, a process.</div> + +</div><div> + <h2>2.4.6 Headings and Labels [AA]</h2> + <div>Headings and labels describe topic or purpose.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>heading_content_exists</strong>: Heading elements must provide descriptive text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/heading_content_exists.html#%7B%22message%22%3A%22Heading%20element%20has%20no%20descriptive%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Heading element has no descriptive content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.7 Focus Visible [AA]</h2> + <div>Any keyboard operable user interface has a mode of operation where the keyboard focus indicator is visible.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>element_tabbable_visible</strong>: A tabbable element should be visible on the screen when it has keyboard focus + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_tabbable_visible.html#%7B%22message%22%3A%22Confirm%20the%20element%20should%20be%20tabbable%20and%20if%20so%2C%20it%20becomes%20visible%20when%20it%20has%20keyboard%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_visible%22%7D">Confirm the element should be tabbable and if so, it becomes visible when it has keyboard focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>script_focus_blur_review</strong>: Scripting must not remove focus from content that normally receives focus + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_focus_blur_review.html#%7B%22message%22%3A%22Verify%20script%20does%20not%20remove%20focus%20from%20content%20that%20normally%20receives%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify script does not remove focus from content that normally receives focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>style_focus_visible</strong>: The keyboard focus indicator should be visible when default border or outline is modified by CSS + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_focus_visible.html#%7B%22message%22%3A%22Check%20the%20keyboard%20focus%20indicator%20is%20visible%20when%20using%20CSS%20declaration%20for%20'border'%20or%20'outline'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_focus_not_visible%22%7D">Check the keyboard focus indicator is visible when using CSS declaration for 'border' or 'outline'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.5.1 Pointer Gestures [A]</h2> + <div>All functionality that uses multipoint or path-based gestures for operation can be operated with a single pointer without a path-based gesture.</div> + +</div><div> + <h2>2.5.2 Pointer Cancellation [A]</h2> + <div>For functionality that can be operated using a single pointer, completion of the function is on the up-event with an ability to abort, undo or reverse the outcome.</div> + +</div><div> + <h2>2.5.3 Label in Name [A]</h2> + <div>For user interface components with labels that include text or images of text, the accessible name contains the text that is presented visually.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>label_name_visible</strong>: Accessible name must match or contain the visible label text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/label_name_visible.html#%7B%22message%22%3A%22Accessible%20name%20does%20not%20match%20or%20contain%20the%20visible%20label%20text%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Accessible name does not match or contain the visible label text</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_label_visible</strong>: An input element must have an associated visible label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_visible.html#%7B%22message%22%3A%22The%20%E2%80%98placeholder%E2%80%99%20is%20the%20only%20visible%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_placeholder_only%22%7D">The ‘placeholder’ is the only visible label</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_visible.html#%7B%22message%22%3A%22The%20input%20element%20does%20not%20have%20an%20associated%20visible%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_no_label%22%7D">The input element does not have an associated visible label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.5.4 Motion Actuation [A]</h2> + <div>Functionality that can be operated by motion can also be operated by user interface components, and the motion trigger can be disabled.</div> + +</div><div> + <h2>3.1.1 Language of Page [A]</h2> + <div>The default human language of Web pages, non-Web documents, or software can be programmatically determined.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>html_lang_exists</strong>: Page must identify the default language of the document with a 'lang' attribute + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20as%20XHTML%201.0%2C%20but%20has%20neither%20'lang'%20nor%20'xml%3Alang'%20attributes%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Page detected as XHTML 1.0, but has neither 'lang' nor 'xml:lang' attributes</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20as%20XHTML%2C%20but%20does%20not%20have%20an%20'xml%3Alang'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Page detected as XHTML, but does not have an 'xml:lang' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20as%20HTML%2C%20but%20does%20not%20have%20a%20'lang'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Page detected as HTML, but does not have a 'lang' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20with%20'lang'%20and%20'xml%3Alang'%20attributes%20and%20primary%20languages%20do%20not%20match%3A%20%5C%22%7B0%7D%5C%22%2C%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_4%22%7D">Page detected with 'lang' and 'xml:lang' attributes and primary languages do not match: "{0}", "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20with%20'lang'%20and%20'xml%3Alang'%20attributes%20that%20do%20not%20match%3A%20%5C%22%7B0%7D%5C%22%2C%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_5%22%7D">Page detected with 'lang' and 'xml:lang' attributes that do not match: "{0}", "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20as%20XHTML%201.0%20with%20only%20a%20'lang'%20attribute.%20Confirm%20that%20page%20is%20only%20delivered%20via%20text%2Fhtml%20mime%20type%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_5%22%7D">Page detected as XHTML 1.0 with only a 'lang' attribute. Confirm that page is only delivered via text/html mime type</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20as%20XHTML%201.0%20with%20only%20an%20'xml%3Alang'%20attribute.%20Confirm%20that%20page%20is%20only%20delivered%20via%20xml%20mime%20type%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_6%22%7D">Page detected as XHTML 1.0 with only an 'xml:lang' attribute. Confirm that page is only delivered via xml mime type</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>html_lang_valid</strong>: The default human language of the page must be valid and specified in accordance with BCP 47 + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_valid.html#%7B%22message%22%3A%22Specified%20'lang'%20attribute%20does%20not%20include%20a%20valid%20primary%20language%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Specified 'lang' attribute does not include a valid primary language</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_valid.html#%7B%22message%22%3A%22Specified%20'lang'%20attribute%20does%20not%20conform%20to%20BCP%2047%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Specified 'lang' attribute does not conform to BCP 47</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_valid.html#%7B%22message%22%3A%22Specified%20'xml%3Alang'%20attribute%20does%20not%20include%20a%20valid%20primary%20language%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Specified 'xml:lang' attribute does not include a valid primary language</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_valid.html#%7B%22message%22%3A%22Specified%20'xml%3Alang'%20attribute%20does%20not%20conform%20to%20BCP%2047%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_4%22%7D">Specified 'xml:lang' attribute does not conform to BCP 47</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.1.2 Language of Parts [AA]</h2> + <div>The human language of each passage or phrase in the content can be programmatically determined.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>element_lang_valid</strong>: The change in language of specific content must be valid and specified in accordance with BCP 47 + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_lang_valid.html#%7B%22message%22%3A%22Specified%20'lang'%20attribute%20does%20not%20include%20a%20valid%20primary%20language%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Specified 'lang' attribute does not include a valid primary language</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_lang_valid.html#%7B%22message%22%3A%22Specified%20'lang'%20attribute%20does%20not%20conform%20to%20BCP%2047%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Specified 'lang' attribute does not conform to BCP 47</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_lang_valid.html#%7B%22message%22%3A%22Specified%20'xml%3Alang'%20attribute%20does%20not%20include%20a%20valid%20primary%20language%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Specified 'xml:lang' attribute does not include a valid primary language</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_lang_valid.html#%7B%22message%22%3A%22Specified%20'xml%3Alang'%20attribute%20does%20not%20conform%20to%20BCP%2047%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_4%22%7D">Specified 'xml:lang' attribute does not conform to BCP 47</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.2.1 On Focus [A]</h2> + <div>When any component receives focus, it does not initiate a change of context.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>script_focus_blur_review</strong>: Scripting must not remove focus from content that normally receives focus + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_focus_blur_review.html#%7B%22message%22%3A%22Verify%20script%20does%20not%20remove%20focus%20from%20content%20that%20normally%20receives%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify script does not remove focus from content that normally receives focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>script_select_review</strong>: No changes of context should occur when a selection value receives focus + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_select_review.html#%7B%22message%22%3A%22Verify%20that%20no%20change%20of%20context%20or%20action%20occurs%20when%20selection%20options%20in%20this%20component%20receive%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that no change of context or action occurs when selection options in this component receive focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.2.2 On Input [A]</h2> + <div>Changing the setting of any user interface component does not automatically cause a change of context unless the user has been advised of the behavior before using the component.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>form_interaction_review</strong>: User should be informed in advance when interacting with content causes a change of context + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/form_interaction_review.html#%7B%22message%22%3A%22Verify%20that%20interacting%20with%20content%20will%20not%20open%20pop-up%20windows%20or%20change%20the%20active%20window%20without%20informing%20the%20user%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that interacting with content will not open pop-up windows or change the active window without informing the user</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>form_submit_button_exists</strong>: A &lt;form&gt; element should have a submit button or an image button + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/form_submit_button_exists.html#%7B%22message%22%3A%22Verify%20the%20%3Cform%3E%20element%20has%20a%20submit%20button%20or%20an%20image%20button%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify the &lt;form&gt; element has a submit button or an image button</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_onchange_review</strong>: Users must be advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_onchange_review.html#%7B%22message%22%3A%22Confirm%20that%20the%20user%20is%20advised%20if%2C%20due%20to%20a%20change%20of%20element%20value%2C%20a%20form%20automatically%20submits%2C%20a%20new%20window%20opens%2C%20or%20a%20change%20in%20focus%20occurs%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_warning%22%7D">Confirm that the user is advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>a_target_warning</strong>: Users should be warned in advance if their input action will open a new window + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/a_target_warning.html#%7B%22message%22%3A%22Inform%20the%20user%20when%20their%20input%20action%20will%20open%20a%20new%20window%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_warn%22%7D">Inform the user when their input action will open a new window</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.2.3 Consistent Navigation [AA]</h2> + <div>Navigational mechanisms that are repeated on multiple Web pages within a set of Web pages occur in the same relative order each time they are repeated, unless a change is initiated by the user.</div> + +</div><div> + <h2>3.2.4 Consistent Identification [AA]</h2> + <div>Components that have the same functionality within a set of Web pages are identified consistently.</div> + +</div><div> + <h2>3.3.1 Error Identification [A]</h2> + <div>If an input error is automatically detected, the item that is in error is identified and the error is described to the user in text.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>error_message_exists</strong>: A custom error message must reference a valid 'id' value and when triggered the message must be appropriately exposed + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/error_message_exists.html#%7B%22message%22%3A%22Custom%20error%20message%20has%20invalid%20reference%20'id'%20value%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Custom error message has invalid reference 'id' value</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/error_message_exists.html#%7B%22message%22%3A%22Custom%20error%20message%20is%20not%20visible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Custom error message is not visible</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.3.2 Labels or Instructions [A]</h2> + <div>Labels or instructions are provided when content requires user input.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>fieldset_label_valid</strong>: Groups with nested inputs must have unique accessible name + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_label_valid.html#%7B%22message%22%3A%22Group%2FFieldset%20does%20not%20have%20an%20accessible%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Group/Fieldset does not have an accessible name</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_label_valid.html#%7B%22message%22%3A%22Group%2FFieldset%20%5C%22%7B0%7D%5C%22%20has%20a%20duplicate%20name%20to%20another%20group%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Group/Fieldset "{0}" has a duplicate name to another group</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_label_after</strong>: Checkboxes and radio buttons must have a label after the input control + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_after.html#%7B%22message%22%3A%22Checkbox%20or%20radio%20button%20is%20nested%20in%20label%2C%20so%20label%20is%20not%20after%20the%20input%20control%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Checkbox or radio button is nested in label, so label is not after the input control</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_after.html#%7B%22message%22%3A%22Label%20text%20is%20located%20before%20its%20associated%20checkbox%20or%20radio%20button%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Label text is located before its associated checkbox or radio button element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_label_before</strong>: Text inputs and &lt;select&gt; elements must have a label before the input control + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_before.html#%7B%22message%22%3A%22Text%20input%20is%20nested%20in%20label%20such%20that%20input%20precedes%20the%20label%20text%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Text input is nested in label such that input precedes the label text</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_before.html#%7B%22message%22%3A%22Label%20text%20is%20located%20after%20its%20associated%20text%20input%20or%20%3Cselect%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Label text is located after its associated text input or &lt;select&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_label_visible</strong>: An input element must have an associated visible label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_visible.html#%7B%22message%22%3A%22The%20%E2%80%98placeholder%E2%80%99%20is%20the%20only%20visible%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_placeholder_only%22%7D">The ‘placeholder’ is the only visible label</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_visible.html#%7B%22message%22%3A%22The%20input%20element%20does%20not%20have%20an%20associated%20visible%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_no_label%22%7D">The input element does not have an associated visible label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>element_accesskey_labelled</strong>: An element with an assigned 'accesskey' attribute must have an associated label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_accesskey_labelled.html#%7B%22message%22%3A%22The%20element%20with%20an%20assigned%20'accesskey'%20attribute%20does%20not%20have%20an%20associated%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">The element with an assigned 'accesskey' attribute does not have an associated label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.3.3 Error Suggestion [AA]</h2> + <div>If an input error is automatically detected and suggestions for correction are known, then the suggestions are provided to the user, unless it would jeopardize the security or purpose of the content.</div> + +</div><div> + <h2>3.3.4 Error Prevention (Legal, Financial, Data) [AA]</h2> + <div>For content that cause legal commitments or financial transactions for the user to occur, that modify or delete user-controllable data in data storage systems, or that submit user test responses, the user can reverse, correct, or confirm the action.</div> + +</div><div> + <h2>4.1.1 Parsing [A]</h2> + <div>(Obsolete and removed) This requirement was originally adopted to address problems that assistive technology (AT) had directly parsing HTML. AT no longer has any need to directly parse HTML. Consequently, these problems either no longer exist or are addressed by other requirements.</div> + +</div><div> + <h2>4.1.2 Name, Role, Value [A]</h2> + <div>For all user interface components (including, but not limited to: form elements, links and components generated by scripts), the name and role can be programmatically determined; states, properties, and values that can be set by the user can be programmatically set; and notification of changes to these items is available to user agents, including assistive technologies.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>combobox_popup_reference</strong>: The 'aria-controls' (for ARIA 1.2) or the 'aria-owns' (for ARIA 1.0) attribute of the expanded combobox must reference a valid popup 'id' value + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20'aria-owns'%20attribute%20of%20the%20expanded%20combobox%20is%20missing%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1.0_missing_owns%22%7D">The 'aria-owns' attribute of the expanded combobox is missing</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20'aria-controls'%20attribute%20of%20the%20expanded%20combobox%20is%20missing%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1.2_missing_controls%22%7D">The 'aria-controls' attribute of the expanded combobox is missing</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20'aria-owns'%20attribute%20%5C%22%7B0%7D%5C%22%20of%20the%20expanded%20combobox%20does%20not%20reference%20a%20valid%20popup%20'id'%20value%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1.0_popup_reference_missing%22%7D">The 'aria-owns' attribute "{0}" of the expanded combobox does not reference a valid popup 'id' value</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20'aria-controls'%20attribute%20%5C%22%7B0%7D%5C%22%20of%20the%20expanded%20combobox%20does%20not%20reference%20a%20valid%20popup%20'id'%20value%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1.2_popup_reference_missing%22%7D">The 'aria-controls' attribute "{0}" of the expanded combobox does not reference a valid popup 'id' value</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20combobox%20'aria-expanded'%20attribute%20is%20true%2C%20but%20the%20combobox%20popup%20is%20not%20visible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_combobox_expanded_hidden%22%7D">The combobox 'aria-expanded' attribute is true, but the combobox popup is not visible</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20combobox%20'aria-expanded'%20attribute%20is%20false%2C%20but%20the%20combobox%20popup%20is%20visible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_combobox_collapsed_visible%22%7D">The combobox 'aria-expanded' attribute is false, but the combobox popup is visible</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_activedescendant_valid</strong>: The 'aria-activedescendant' property must reference the 'id' of a non-empty, non-hidden active child element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_activedescendant_valid.html#%7B%22message%22%3A%22The%20'aria-activedescendant'%20property%20is%20empty%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The 'aria-activedescendant' property is empty</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_activedescendant_valid.html#%7B%22message%22%3A%22The%20'aria-activedescendant'%20property%20references%20a%20hidden%20node%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The 'aria-activedescendant' property references a hidden node</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_activedescendant_valid.html#%7B%22message%22%3A%22Element%20is%20not%20a%20combobox%2C%20and%20the%20referenced%20active-descendant%20element%20is%20not%20a%20valid%20descendant%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Element is not a combobox, and the referenced active-descendant element is not a valid descendant</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>combobox_active_descendant</strong>: 'aria-activedescendant' must be used to define focus within the combobox popup, except when using a dialog popup + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_active_descendant.html#%7B%22message%22%3A%22The%20element%20referenced%20by%20'aria-activedescendant'%20%5C%22%7B0%7D%5C%22%20does%20not%20exist%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_missing%22%7D">The element referenced by 'aria-activedescendant' "{0}" does not exist</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_active_descendant.html#%7B%22message%22%3A%22The%20'aria-activedescendant'%20%5C%22%7B0%7D%5C%22%20references%20an%20element%20with%20the%20roles%20%5C%22%7B1%7D%5C%22%2C%20which%20does%20not%20have%20a%20valid%20ARIA%20role%20of%20'option'%2C%20'gridcell'%2C%20'row'%2C%20or%20'treeitem'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_active_role_invalid%22%7D">The 'aria-activedescendant' "{0}" references an element with the roles "{1}", which does not have a valid ARIA role of 'option', 'gridcell', 'row', or 'treeitem'</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_active_descendant.html#%7B%22message%22%3A%22The%20'aria-activedescendant'%20%5C%22%7B0%7D%5C%22%20references%20an%20element%20that%20does%20not%20have%20'aria-selected'%20set%20to%20true%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_active_not_selected%22%7D">The 'aria-activedescendant' "{0}" references an element that does not have 'aria-selected' set to true</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_haspopup_conflict</strong>: &lt;input&gt; element with a 'list' attribute should not use an explicit 'aria-haspopup' attribute + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_haspopup_conflict.html#%7B%22message%22%3A%22The%20%3Cinput%3E%20element%20with%20type%20%5C%22%7B0%7D%5C%22%20and%20'list'%20attribute%20uses%20an%20explicit%20'aria-haspopup'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_type_misuse%22%7D">The &lt;input&gt; element with type "{0}" and 'list' attribute uses an explicit 'aria-haspopup' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_haspopup_conflict.html#%7B%22message%22%3A%22The%20%3Cinput%3E%20element%20with%20a%20missing%20or%20invalid%20type%20and%20'list'%20attribute%20uses%20an%20explicit%20'aria-haspopup'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_misuse%22%7D">The &lt;input&gt; element with a missing or invalid type and 'list' attribute uses an explicit 'aria-haspopup' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_haspopup_conflict.html#%7B%22message%22%3A%22The%20list%20attribute%20for%20the%20%3Cinput%3E%20element%20is%20invalid%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_list_notexist%22%7D">The list attribute for the &lt;input&gt; element is invalid</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_haspopup_conflict.html#%7B%22message%22%3A%22The%20list%20attribute%20for%20the%20%3Cinput%3E%20element%20with%20the%20type%20%5C%22%7B0%7D%5C%22%20is%20invalid%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid_list_type%22%7D">The list attribute for the &lt;input&gt; element with the type "{0}" is invalid</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_haspopup_conflict.html#%7B%22message%22%3A%22The%20list%20attribute%20for%20the%20%3Cinput%3E%20element%20does%20not%20reference%20a%20datalist%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid_list_elem%22%7D">The list attribute for the &lt;input&gt; element does not reference a datalist element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_role_valid</strong>: ARIA roles must be valid for the element to which they are assigned + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_role_valid.html#%7B%22message%22%3A%22The%20ARIA%20role%20'%7B0%7D'%20is%20not%20valid%20for%20the%20element%20%3C%7B1%7D%3E%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The ARIA role '{0}' is not valid for the element &lt;{1}&gt;</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_role_valid.html#%7B%22message%22%3A%22The%20ARIA%20role%20'%7B0%7D'%20is%20not%20valid%20for%20the%20element%20%3C%7B1%7D%3E%20and%20may%20be%20ignored%20by%20the%20browser%20since%20the%20element%20is%20focusable%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The ARIA role '{0}' is not valid for the element &lt;{1}&gt; and may be ignored by the browser since the element is focusable</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>combobox_autocomplete_valid</strong>: A combobox that supports autocompletion behavior must have the 'aria-autocomplete' attribute only on its text input element with a valid value; a value of '"inline"' is not supported + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_autocomplete_valid.html#%7B%22message%22%3A%22The%20combobox%20has%20the%20'aria-autocomplete'%20attribute%20incorrectly%20set%20on%20an%20element%20within%20the%20popup%20referenced%20by%20%5C%22%7B0%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The combobox has the 'aria-autocomplete' attribute incorrectly set on an element within the popup referenced by "{0}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_autocomplete_valid.html#%7B%22message%22%3A%22The%20combobox%20does%20not%20support%20an%20'aria-autocomplete'%20attribute%20value%20set%20to%20'%5C%22inline%5C%22'%20%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_inline%22%7D">The combobox does not support an 'aria-autocomplete' attribute value set to '"inline"' </a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>combobox_focusable_elements</strong>: Tabbable focus for the combobox must be allowed only on the text input, except when using a dialog popup + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_focusable_elements.html#%7B%22message%22%3A%22The%20combobox%20element%20does%20not%20allow%20DOM%20focus%20as%20required%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_not_tabbable%22%7D">The combobox element does not allow DOM focus as required</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_focusable_elements.html#%7B%22message%22%3A%22The%20popup%20of%20the%20combobox%20has%20DOM%20focus%20or%20has%20'aria-activedescendant'%20defined%2C%20which%20is%20not%20allowed%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_tabbable_child%22%7D">The popup of the combobox has DOM focus or has 'aria-activedescendant' defined, which is not allowed</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>combobox_haspopup_valid</strong>: The combobox attribute 'aria-haspopup' value must be appropriate for the role of the element referenced by 'aria-controls' (ARIA 1.2) or 'aria-owns' (ARIA 1.0) + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_haspopup_valid.html#%7B%22message%22%3A%22The%20'role'%20value%20%5C%22%7B0%7D%5C%22%20of%20the%20popup%20element%20%5C%22%7B1%7D%5C%22%20should%20be%20one%20of%20%5C%22listbox%5C%22%2C%20%5C%22grid%5C%22%2C%20%5C%22tree%5C%22%20or%20%5C%22dialog%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_popup_role_invalid%22%7D">The 'role' value "{0}" of the popup element "{1}" should be one of "listbox", "grid", "tree" or "dialog"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_haspopup_valid.html#%7B%22message%22%3A%22The%20value%20of%20the%20combobox%20'aria-haspopup'%20attribute%20%5C%22%7B0%7D%5C%22%20does%20not%20match%20the%20'role'%20value%20of%20the%20popup%20element%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_combobox_popup_role_mismatch%22%7D">The value of the combobox 'aria-haspopup' attribute "{0}" does not match the 'role' value of the popup element "{1}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_label_exists</strong>: Each form control must have an associated label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_exists.html#%7B%22message%22%3A%22Form%20control%20element%20%3C%7B0%7D%3E%20has%20no%20associated%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Form control element &lt;{0}&gt; has no associated label</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_exists.html#%7B%22message%22%3A%22Form%20control%20with%20%5C%22%7B0%7D%5C%22%20role%20has%20no%20associated%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Form control with "{0}" role has no associated label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_descendant_valid</strong>: Browsers ignore the explicit and implicit ARIA roles of the descendants of certain elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_descendant_valid.html#%7B%22message%22%3A%22The%20element%20with%20role%20%5C%22%7B0%7D%5C%22%20contains%20descendants%20with%20implicit%20roles%20%5C%22%7B1%7D%5C%22%20which%20are%20ignored%20by%20browsers%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_child_implicit_role%22%7D">The element with role "{0}" contains descendants with implicit roles "{1}" which are ignored by browsers</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_descendant_valid.html#%7B%22message%22%3A%22The%20element%20with%20role%20%5C%22%7B0%7D%5C%22%20contains%20descendants%20with%20roles%20%5C%22%7B1%7D%5C%22%20which%20are%20ignored%20by%20browsers%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_child_explicit_role%22%7D">The element with role "{0}" contains descendants with roles "{1}" which are ignored by browsers</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_role_allowed</strong>: Elements must have a valid 'role' per ARIA specification + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_role_allowed.html#%7B%22message%22%3A%22The%20role%20'%7B0%7D'%20defined%20on%20the%20element%20is%20not%20valid%20per%20ARIA%20specification%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The role '{0}' defined on the element is not valid per ARIA specification</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_role_allowed.html#%7B%22message%22%3A%22Some%20of%20the%20roles%2C%20'%7B0%7D'%2C%20defined%20on%20the%20element%20are%20not%20valid%20per%20ARIA%20specification%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Some of the roles, '{0}', defined on the element are not valid per ARIA specification</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>a_text_purpose</strong>: Hyperlinks must have an accessible name for their purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/a_text_purpose.html#%7B%22message%22%3A%22Hyperlink%20has%20no%20link%20text%2C%20label%20or%20image%20with%20a%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_acc_name%22%7D">Hyperlink has no link text, label or image with a text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_allowed</strong>: ARIA attributes must be valid for the element's role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_allowed.html#%7B%22message%22%3A%22The%20attribute(s)%20'%7B0%7D'%20referenced%20by%20the%20element%20%3C%7B1%7D%3E%20is%20not%20a%20valid%20ARIA%20state%20or%20property%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The attribute(s) '{0}' referenced by the element &lt;{1}&gt; is not a valid ARIA state or property</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_conflict</strong>: An ARIA attribute must not conflict with the corresponding HTML attribute + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_conflict.html#%7B%22message%22%3A%22The%20ARIA%20attribute%20%5C%22%7B0%7D%5C%22%20is%20in%20conflict%20with%20the%20corresponding%20HTML%20attribute%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_conflict%22%7D">The ARIA attribute "{0}" is in conflict with the corresponding HTML attribute "{1}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_exists</strong>: When specifying a required ARIA attribute, the value must not be empty + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_exists.html#%7B%22message%22%3A%22The%20element%20attribute(s)%3A%20'%7B0%7D'%20value%20is%20empty%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_empty_attribute%22%7D">The element attribute(s): '{0}' value is empty</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_required</strong>: The required attributes for the element with a role must be defined + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_required.html#%7B%22message%22%3A%22Element%20with%20'%7B0%7D'%20role%20does%20not%20have%20the%20required%20ARIA%20attribute(s)%3A%20'%7B1%7D'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_missing%22%7D">Element with '{0}' role does not have the required ARIA attribute(s): '{1}'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_value_valid</strong>: ARIA property values must be valid + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_value_valid.html#%7B%22message%22%3A%22The%20value%20%5C%22%7B0%7D%5C%22%20specified%20for%20attribute%20'%7B1%7D'%20on%20element%20%3C%7B2%7D%3E%20is%20not%20valid%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The value "{0}" specified for attribute '{1}' on element &lt;{2}&gt; is not valid</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_eventhandler_role_valid</strong>: Elements with event handlers must have a valid ARIA role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_eventhandler_role_valid.html#%7B%22message%22%3A%22The%20%3C%7B0%7D%3E%20element%20with%20'%7B1%7D'%20does%20not%20have%20a%20valid%20ARIA%20role%20specified%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;{0}&gt; element with '{1}' does not have a valid ARIA role specified</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_hidden_nontabbable</strong>: A hidden element should not contain any tabbable elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_hidden_nontabbable.html#%7B%22message%22%3A%22Element%20%5C%22%7B0%7D%5C%22%20should%20not%20be%20focusable%20within%20the%20subtree%20of%20an%20element%20with%20an%20'aria-hidden'%20attribute%20with%20value%20'true'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element "{0}" should not be focusable within the subtree of an element with an 'aria-hidden' attribute with value 'true'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_id_unique</strong>: The ARIA property must reference a non-empty unique id of an existing element that is visible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_id_unique.html#%7B%22message%22%3A%22The%20'id'%20%5C%22%7B0%7D%5C%22%20specified%20for%20the%20ARIA%20property%20'%7B1%7D'%20value%20is%20not%20valid%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The 'id' "{0}" specified for the ARIA property '{1}' value is not valid</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_widget_labelled</strong>: Interactive component must have a programmatically associated name + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_widget_labelled.html#%7B%22message%22%3A%22Interactive%20component%20with%20ARIA%20role%20'%7B0%7D'%20does%20not%20have%20a%20programmatically%20associated%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Interactive component with ARIA role '{0}' does not have a programmatically associated name</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>combobox_design_valid</strong>: The combobox design pattern must be valid for ARIA 1.2 + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_design_valid.html#%7B%22message%22%3A%22The%20combobox%20design%20pattern%20is%20detected%20as%20ARIA%201.1%2C%20which%20is%20not%20allowed%20by%20ARIA%201.2%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1.1%22%7D">The combobox design pattern is detected as ARIA 1.1, which is not allowed by ARIA 1.2</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>frame_title_exists</strong>: Inline frames must have a unique, non-empty 'title' attribute + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/frame_title_exists.html#%7B%22message%22%3A%22Inline%20frame%20does%20not%20have%20a%20'title'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Inline frame does not have a 'title' attribute</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>label_content_exists</strong>: A &lt;label&gt; element must have non-empty descriptive text that identifies the purpose of the interactive component + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/label_content_exists.html#%7B%22message%22%3A%22The%20%3Clabel%3E%20element%20does%20not%20have%20descriptive%20text%20that%20identifies%20the%20expected%20input%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;label&gt; element does not have descriptive text that identifies the expected input</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>list_children_valid</strong>: List component with "group" role must limit children to &lt;listitem&gt; elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/list_children_valid.html#%7B%22message%22%3A%22List%20component%20with%20%5C%22group%5C%22%20role%20has%20children%20that%20are%20not%20%3Clistitem%3E%20elements%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">List component with "group" role has children that are not &lt;listitem&gt; elements</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_aria_descendants</strong>: Table structure elements cannot specify an explicit 'role' within table containers + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_aria_descendants.html#%7B%22message%22%3A%22An%20explicit%20ARIA%20'role'%20is%20not%20valid%20for%20%3C%7B0%7D%3E%20element%20within%20an%20ARIA%20role%20'%7B1%7D'%20per%20the%20ARIA%20in%20HTML%20specification%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22explicit_role%22%7D">An explicit ARIA 'role' is not valid for &lt;{0}&gt; element within an ARIA role '{1}' per the ARIA in HTML specification</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>element_tabbable_role_valid</strong>: A tabbable element must have a valid widget role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_tabbable_role_valid.html#%7B%22message%22%3A%22The%20tabbable%20element's%20role%20'%7B0%7D'%20is%20not%20a%20widget%20role%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid_role%22%7D">The tabbable element's role '{0}' is not a widget role</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_tabbable_role_valid.html#%7B%22message%22%3A%22The%20tabbable%20element%20does%20not%20have%20a%20valid%20widget%20role%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_valid_role%22%7D">The tabbable element does not have a valid widget role</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_accessiblename_exists</strong>: Elements with certain roles should have accessible names + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_accessiblename_exists.html#%7B%22message%22%3A%22Element%20%3C%7B0%7D%3E%20with%20%5C%22%7B1%7D%5C%22%20role%20has%20no%20accessible%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_accessible_name%22%7D">Element &lt;{0}&gt; with "{1}" role has no accessible name</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_redundant</strong>: An ARIA attribute should not be redundant with a corresponding HTML attribute + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_redundant.html#%7B%22message%22%3A%22The%20ARIA%20attribute%20%5C%22%7B0%7D%5C%22%20is%20redundant%20with%20the%20HTML%20attribute%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_redundant%22%7D">The ARIA attribute "{0}" is redundant with the HTML attribute "{1}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>canvas_content_described</strong>: The &lt;canvas&gt; element may not be accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/canvas_content_described.html#%7B%22message%22%3A%22Verify%20accessibility%20of%20the%20%3Ccanvas%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify accessibility of the &lt;canvas&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>4.1.3 Status Messages [AA]</h2> + <div>In content implemented using markup languages, status messages can be programmatically determined through role or properties such that they can be presented to the user by assistive technologies without receiving focus.</div> + +</div> + </div><div id="WCAG_2_0" style="padding: 1rem; display:none"> +<div> + <h2>1.1.1 Non-text Content [A]</h2> + <div>All non-text content that is presented to the user has a text alternative that serves the equivalent purpose.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>applet_alt_exists</strong>: &lt;applet&gt; elements must provide an 'alt' attribute and an alternative description + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/applet_alt_exists.html#%7B%22message%22%3A%22An%20%3Capplet%3E%20element%20does%20not%20have%20an%20'alt'%20attribute%20that%20provides%20a%20short%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">An &lt;applet&gt; element does not have an 'alt' attribute that provides a short text alternative</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/applet_alt_exists.html#%7B%22message%22%3A%22The%20'alt'%20attribute%20value%20for%20an%20%3Capplet%3E%20element%20duplicates%20the%20'code'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The 'alt' attribute value for an &lt;applet&gt; element duplicates the 'code' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/applet_alt_exists.html#%7B%22message%22%3A%22An%20%3Capplet%3E%20element%20provides%20alternative%20text%2C%20but%20does%20not%20provide%20inner%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">An &lt;applet&gt; element provides alternative text, but does not provide inner content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_redundant</strong>: The text alternative for an image within a link should not repeat the link text or adjacent link text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Link%20text%20is%20repeated%20in%20an%20image%20'alt'%20value%20within%20the%20same%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Link text is repeated in an image 'alt' value within the same link</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Link%20text%20of%20previous%20link%20is%20repeated%20in%20image%20'alt'%20value%20of%20a%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Link text of previous link is repeated in image 'alt' value of a link</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Image%20'alt'%20value%20within%20a%20link%20is%20repeated%20in%20link%20text%20of%20the%20link%20after%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Image 'alt' value within a link is repeated in link text of the link after</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_valid</strong>: Images must have accessible names unless they are decorative or redundant + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_valid.html#%7B%22message%22%3A%22Image%20'alt'%20attribute%20value%20consists%20only%20of%20blank%20space(s)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_blank_alt%22%7D">Image 'alt' attribute value consists only of blank space(s)</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_valid.html#%7B%22message%22%3A%22The%20image%20has%20neither%20an%20accessible%20name%20nor%20is%20marked%20as%20decorative%20or%20redundant%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_alt%22%7D">The image has neither an accessible name nor is marked as decorative or redundant</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_valid.html#%7B%22message%22%3A%22The%20image%20does%20not%20have%20an%20'alt'%20attribute%20or%20ARIA%20label%2C%20and%20the%20'title'%20attribute%20value%20consists%20only%20of%20blank%20space(s)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_blank_title%22%7D">The image does not have an 'alt' attribute or ARIA label, and the 'title' attribute value consists only of blank space(s)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>area_alt_exists</strong>: &lt;area&gt; elements in an image map must have a text alternative + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/area_alt_exists.html#%7B%22message%22%3A%22%3Carea%3E%20element%20in%20an%20image%20map%20has%20no%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">&lt;area&gt; element in an image map has no text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>imagebutton_alt_exists</strong>: The &lt;input&gt; element of type "image" should have a text alternative + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/imagebutton_alt_exists.html#%7B%22message%22%3A%22The%20%3Cinput%3E%20element%20of%20type%20%5C%22image%5C%22%20has%20no%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail%22%7D">The &lt;input&gt; element of type "image" has no text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>imagemap_alt_exists</strong>: An image map and each &lt;area&gt; element in an image map must have text alternative(s) + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/imagemap_alt_exists.html#%7B%22message%22%3A%22Image%20map%20or%20child%20%3Carea%3E%20has%20no%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Image map or child &lt;area&gt; has no text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_decorative</strong>: Image designated as decorative must have 'alt="" + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_decorative.html#%7B%22message%22%3A%22Image%20designated%20as%20decorative%20has%20non-null%20'alt'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Image designated as decorative has non-null 'alt' attribute</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_null</strong>: When the intent is to mark an image as decorative with an empty 'alt' attribute, the 'aria' or 'title' attributes should not be used + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_null.html#%7B%22message%22%3A%22The%20image%20'alt'%20attribute%20is%20empty%2C%20but%20the%20'title'%20attribute%20is%20not%20empty%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_decorative%22%7D">The image 'alt' attribute is empty, but the 'title' attribute is not empty</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>object_text_exists</strong>: &lt;object&gt; element must have a text alternative for the content rendered by the object + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/object_text_exists.html#%7B%22message%22%3A%22An%20%3Cobject%3E%20element%20does%20not%20have%20a%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_text_alternative%22%7D">An &lt;object&gt; element does not have a text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>svg_graphics_labelled</strong>: A non-decorative SVG element must have an accessible name + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/svg_graphics_labelled.html#%7B%22message%22%3A%22The%20SVG%20element%20has%20no%20accessible%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_acc_name%22%7D">The SVG element has no accessible name</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>application_content_accessible</strong>: Non-decorative static text and image content within an element with "application" role must be accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/application_content_accessible.html#%7B%22message%22%3A%22Verify%20that%20the%20non-decorative%20static%20text%20and%20image%20content%20within%20an%20element%20with%20%5C%22application%5C%22%20role%20are%20accessible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the non-decorative static text and image content within an element with "application" role are accessible</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_misuse</strong>: 'alt' attribute value must be a good inline replacement for the image + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_misuse.html#%7B%22message%22%3A%22Verify%20that%20the%20file%20name%20serves%20as%20a%20good%20inline%20replacement%20for%20the%20image%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the file name serves as a good inline replacement for the image</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_ismap_misuse</strong>: Server-side image map hot-spots must have duplicate text links + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_ismap_misuse.html#%7B%22message%22%3A%22Server-side%20image%20map%20hot-spots%20do%20not%20have%20duplicate%20text%20links%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Server-side image map hot-spots do not have duplicate text links</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_longdesc_misuse</strong>: The 'longdesc' attribute must reference HTML content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_longdesc_misuse.html#%7B%22message%22%3A%22Verify%20that%20the%20file%20designated%20by%20the%20'longdesc'%20attribute%20contains%20valid%20HTML%20content%20(file%20extension%20not%20recognized)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the file designated by the 'longdesc' attribute contains valid HTML content (file extension not recognized)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>media_alt_exists</strong>: Audio or video on the page must have a short text alternative that describes the media content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_alt_exists.html#%7B%22message%22%3A%22Filename%20used%20as%20label%20for%20embedded%20audio%20or%20video%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Filename used as label for embedded audio or video</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>style_background_decorative</strong>: Images included by using CSS alone must not convey important information + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_background_decorative.html#%7B%22message%22%3A%22Verify%20the%20CSS%20background%20image%20does%20not%20convey%20important%20information%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify the CSS background image does not convey important information</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>figure_label_exists</strong>: A &lt;figure&gt; element must have an associated label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/figure_label_exists.html#%7B%22message%22%3A%22The%20%3Cfigure%3E%20element%20does%20not%20have%20an%20associated%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;figure&gt; element does not have an associated label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>embed_alt_exists</strong>: Provide alternative content for &lt;embed&gt; elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/embed_alt_exists.html#%7B%22message%22%3A%22Verify%20that%20the%20%3Cembed%3E%20element%20has%20alternative%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the &lt;embed&gt; element has alternative content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>media_alt_brief</strong>: Alternative text in 'alt' attribute should be brief (&lt;150 characters) + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_alt_brief.html#%7B%22message%22%3A%22Text%20alternative%20is%20more%20than%20150%20characters%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Text alternative is more than 150 characters</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>noembed_content_exists</strong>: &lt;noembed&gt; elements should contain descriptive text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/noembed_content_exists.html#%7B%22message%22%3A%22Add%20descriptive%20text%20to%20the%20%3Cnoembed%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Add descriptive text to the &lt;noembed&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>canvas_content_described</strong>: The &lt;canvas&gt; element may not be accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/canvas_content_described.html#%7B%22message%22%3A%22Verify%20accessibility%20of%20the%20%3Ccanvas%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify accessibility of the &lt;canvas&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>img_alt_background</strong>: Background images that convey important information must have a text alternative that describes the image + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_background.html#%7B%22message%22%3A%22Verify%20important%20background%20image%20information%20has%20a%20text%20alternative%20in%20system%20high%20contrast%20mode%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify important background image information has a text alternative in system high contrast mode</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>style_highcontrast_visible</strong>: Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_highcontrast_visible.html#%7B%22message%22%3A%22Confirm%20Windows%20high%20contrast%20mode%20is%20supported%20when%20using%20CSS%20to%20include%2C%20position%20or%20alter%20non-decorative%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Confirm Windows high contrast mode is supported when using CSS to include, position or alter non-decorative content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.2.1 Audio-only and Video-only (Prerecorded) [A]</h2> + <div>For prerecorded audio-only or video-only media, an alternative provides equivalent information.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>media_audio_transcribed</strong>: Audio information should also be available in text form + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_audio_transcribed.html#%7B%22message%22%3A%22Provide%20transcripts%20for%20audio%20files%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Provide transcripts for audio files</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.2.2 Captions (Prerecorded) [A]</h2> + <div>Captions are provided for all prerecorded audio content in synchronized media.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>caption_track_exists</strong>: A &lt;video&gt; element must have a text alternative for any meaningful audio content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/caption_track_exists.html#%7B%22message%22%3A%22Verify%20that%20captions%20are%20available%20for%20any%20meaningful%20audio%20or%20provide%20a%20caption%20track%20for%20the%20%3Cvideo%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that captions are available for any meaningful audio or provide a caption track for the &lt;video&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.2.3 Audio Description or Media Alternative (Prerecorded) [A]</h2> + <div>An alternative for time-based media or audio description of the prerecorded video content is provided for synchronized media.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>media_track_available</strong>: Pre-recorded media should have an audio track that describes visual information + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_track_available.html#%7B%22message%22%3A%22Verify%20availability%20of%20a%20user-selectable%20audio%20track%20with%20description%20of%20visual%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify availability of a user-selectable audio track with description of visual content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.2.4 Captions (Live) [AA]</h2> + <div>Captions are provided for all live audio content in synchronized media.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>media_live_captioned</strong>: Live media (streaming video with audio) should have captions for audio content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_live_captioned.html#%7B%22message%22%3A%22Verify%20captions%20are%20provided%20for%20live%20media%20(streaming%20video%20with%20audio)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify captions are provided for live media (streaming video with audio)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.2.5 Audio Description (Prerecorded) [AA]</h2> + <div>Audio description is provided for all prerecorded video content in synchronized media.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>media_track_available</strong>: Pre-recorded media should have an audio track that describes visual information + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_track_available.html#%7B%22message%22%3A%22Verify%20availability%20of%20a%20user-selectable%20audio%20track%20with%20description%20of%20visual%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify availability of a user-selectable audio track with description of visual content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.3.1 Info and Relationships [A]</h2> + <div>Information, structure, and relationships conveyed through presentation can be programmatically determined or are available in text.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>input_checkboxes_grouped</strong>: Related sets of radio buttons or checkboxes should be programmatically grouped + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22%7B0%7D%20input%20found%20that%20has%20the%20same%20name%2C%20%5C%22%7B2%7D%5C%22%20as%20a%20%7B1%7D%20input%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_controlnamemismatch%22%7D">{0} input found that has the same name, "{2}" as a {1} input</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22%7B0%7D%20input%20is%20not%20in%20the%20group%20with%20another%20%7B0%7D%20with%20the%20name%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_notgroupedothergrouped%22%7D">{0} input is not in the group with another {0} with the name "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22%7B0%7D%20input%20and%20others%20with%20the%20name%20%5C%22%7B1%7D%5C%22%20are%20not%20grouped%20together%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_notgroupedothernotgrouped%22%7D">{0} input and others with the name "{1}" are not grouped together</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22%7B0%7D%20input%20is%20in%20a%20different%20group%20than%20another%20%7B0%7D%20with%20the%20name%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_notsamegroup%22%7D">{0} input is in a different group than another {0} with the name "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22Verify%20that%20this%20ungrouped%20checkbox%20input%20is%20not%20related%20to%20other%20checkboxes%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_lonecheckbox%22%7D">Verify that this ungrouped checkbox input is not related to other checkboxes</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_checkboxes_grouped.html#%7B%22message%22%3A%22Verify%20that%20this%20un-named%2C%20ungrouped%20checkbox%20input%20is%20not%20related%20to%20other%20checkboxes%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_unnamedcheckbox%22%7D">Verify that this un-named, ungrouped checkbox input is not related to other checkboxes</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_headers_ref_valid</strong>: The 'headers' attribute should refer to a valid cell in the same table + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_ref_valid.html#%7B%22message%22%3A%22The%20'headers'%20attribute%20value%20%5C%22%7B0%7D%5C%22%20does%20not%20reference%20a%20valid%20'id'%20in%20this%20document%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The 'headers' attribute value "{0}" does not reference a valid 'id' in this document</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_ref_valid.html#%7B%22message%22%3A%22The%20'headers'%20attribute%20value%20%5C%22%7B0%7D%5C%22%20refers%20to%20itself%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The 'headers' attribute value "{0}" refers to itself</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_ref_valid.html#%7B%22message%22%3A%22The%20'headers'%20attribute%20value%20%5C%22%7B0%7D%5C%22%20does%20not%20refer%20to%20a%20cell%20in%20the%20same%20table%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">The 'headers' attribute value "{0}" does not refer to a cell in the same table</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_ref_valid.html#%7B%22message%22%3A%22The%20'headers'%20attribute%20value%20%5C%22%7B0%7D%5C%22%20does%20not%20refer%20to%20a%20cell%20indicated%20with%20%3Cth%3E%20or%20a%20role%20of%20%5C%22columnheader%5C%22%20or%20%5C%22rowheader%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_4%22%7D">The 'headers' attribute value "{0}" does not refer to a cell indicated with &lt;th&gt; or a role of "columnheader" or "rowheader"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>fieldset_label_valid</strong>: Groups with nested inputs must have unique accessible name + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_label_valid.html#%7B%22message%22%3A%22Group%2FFieldset%20does%20not%20have%20an%20accessible%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Group/Fieldset does not have an accessible name</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_label_valid.html#%7B%22message%22%3A%22Group%2FFieldset%20%5C%22%7B0%7D%5C%22%20has%20a%20duplicate%20name%20to%20another%20group%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Group/Fieldset "{0}" has a duplicate name to another group</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_scope_valid</strong>: Value for 'scope' attribute must be "row", "col", "rowgroup", or "colgroup" + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_scope_valid.html#%7B%22message%22%3A%22Value%20provided%20is%20invalid%20for%20the%20'scope'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Value provided is invalid for the 'scope' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_scope_valid.html#%7B%22message%22%3A%22The%20'scope'%20attribute%20should%20only%20be%20used%20on%20a%20%3Cth%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The 'scope' attribute should only be used on a &lt;th&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_banner_label_unique</strong>: Each element with "banner" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_banner_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22banner%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "banner" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_banner_single</strong>: A page, document, or application should only have one element with "banner" role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_banner_single.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22banner%5C%22%20role%20found%20on%20the%20page%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "banner" role found on the page</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_complementary_label_unique</strong>: Each element with "complementary" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_complementary_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22complementary%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "complementary" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_complementary_labelled</strong>: Each element with "complementary" role must have a label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_complementary_labelled.html#%7B%22message%22%3A%22Element%20with%20%5C%22complementary%5C%22%20role%20does%20not%20have%20a%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "complementary" role does not have a label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_contentinfo_label_unique</strong>: Each element with "contentinfo" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_contentinfo_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22contentinfo%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "contentinfo" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_contentinfo_single</strong>: A page, document, or application should only have one element with "contentinfo" role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_contentinfo_single.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22contentinfo%5C%22%20role%20found%20on%20the%20page%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "contentinfo" role found on the page</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_form_label_unique</strong>: Each element with "form" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_form_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22form%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "form" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_hidden_nontabbable</strong>: A hidden element should not contain any tabbable elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_hidden_nontabbable.html#%7B%22message%22%3A%22Element%20%5C%22%7B0%7D%5C%22%20should%20not%20be%20focusable%20within%20the%20subtree%20of%20an%20element%20with%20an%20'aria-hidden'%20attribute%20with%20value%20'true'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element "{0}" should not be focusable within the subtree of an element with an 'aria-hidden' attribute with value 'true'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_main_label_unique</strong>: Each element with "main" role must have unique label that describes its purposes + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_main_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22main%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "main" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_navigation_label_unique</strong>: Each element with "navigation" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_navigation_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22navigation%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "navigation" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_parent_required</strong>: Each element with an implicit or explicit role must be contained within a valid element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_parent_required.html#%7B%22message%22%3A%22Element%20with%20%5C%22%7B0%7D%5C%22%20role%20is%20not%20contained%20in%20or%20owned%20by%20an%20element%20with%20one%20of%20the%20following%20roles%3A%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "{0}" role is not contained in or owned by an element with one of the following roles: "{1}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_region_label_unique</strong>: Each element with "region" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_region_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22region%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "region" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_region_labelled</strong>: Each element with "region" role must have a label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_region_labelled.html#%7B%22message%22%3A%22Element%20with%20%5C%22region%5C%22%20role%20does%20not%20have%20a%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "region" role does not have a label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>form_label_unique</strong>: Form controls should have exactly one label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/form_label_unique.html#%7B%22message%22%3A%22Form%20control%20has%20more%20than%20one%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Form control has more than one label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>label_ref_valid</strong>: The 'for' attribute for a label should reference a non-empty, unique 'id' attribute of a valid element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/label_ref_valid.html#%7B%22message%22%3A%22The%20value%20%5C%22%7B0%7D%5C%22%20of%20the%20'for'%20attribute%20is%20not%20the%20'id'%20of%20a%20valid%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid%22%7D">The value "{0}" of the 'for' attribute is not the 'id' of a valid element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_caption_empty</strong>: A &lt;caption&gt; element for a &lt;table> element must contain descriptive text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_caption_empty.html#%7B%22message%22%3A%22The%20%3Ctable%3E%20element%20has%20an%20empty%20%3Ccaption%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;table&gt; element has an empty &lt;caption> element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_caption_nested</strong>: The &lt;caption&gt; element must be nested inside the associated &lt;table> element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_caption_nested.html#%7B%22message%22%3A%22%3Ccaption%3E%20element%20is%20not%20nested%20inside%20a%20%3Ctable%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">&lt;caption&gt; element is not nested inside a &lt;table> element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_headers_exists</strong>: Data table must identify headers + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_exists.html#%7B%22message%22%3A%22Table%20has%20no%20headers%20identified%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Table has no headers identified</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_headers_related</strong>: For a complex data table, all &lt;th&gt; and &lt;td> elements must be related via 'header' or 'scope' attributes + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_headers_related.html#%7B%22message%22%3A%22Complex%20table%20does%20not%20have%20headers%20for%20each%20cell%20properly%20defined%20with%20'header'%20or%20'scope'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Complex table does not have headers for each cell properly defined with 'header' or 'scope'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_structure_misuse</strong>: Table elements with 'role="presentation" or 'role="none" should not have structural elements or attributes + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_structure_misuse.html#%7B%22message%22%3A%22The%20%3C%7B0%7D%3E%20element%20with%20%5C%22presentation%5C%22%20role%20or%20%5C%22none%5C%22%20role%20has%20structural%20element(s)%20and%2For%20attribute(s)%20'%7B1%7D'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;{0}&gt; element with "presentation" role or "none" role has structural element(s) and/or attribute(s) '{1}'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_summary_redundant</strong>: The table summary must not duplicate the caption + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_summary_redundant.html#%7B%22message%22%3A%22The%20table%20summary%20duplicates%20the%20caption%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The table summary duplicates the caption</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>blockquote_cite_exists</strong>: Use &lt;blockquote&gt; only for quotations, not indentation + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/blockquote_cite_exists.html#%7B%22message%22%3A%22Verify%20that%20%3Cblockquote%3E%20should%20have%20a%20'cite'%20attribute%20and%20not%20be%20used%20for%20indentation%20only%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that &lt;blockquote&gt; should have a 'cite' attribute and not be used for indentation only</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>heading_markup_misuse</strong>: Heading elements must not be used for presentation + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/heading_markup_misuse.html#%7B%22message%22%3A%22Verify%20that%20the%20heading%20element%20is%20a%20genuine%20heading%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the heading element is a genuine heading</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>list_markup_review</strong>: Proper HTML elements should be used to create a list + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/list_markup_review.html#%7B%22message%22%3A%22Verify%20this%20is%20a%20list%20and%20if%20so%2C%20modify%20to%20use%20proper%20HTML%20elements%20for%20the%20list%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_list%22%7D">Verify this is a list and if so, modify to use proper HTML elements for the list</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>text_block_heading</strong>: Heading text should use a heading element or role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_block_heading.html#%7B%22message%22%3A%22Confirm%20this%20text%20'%7B0%7D'%20is%20used%20as%20a%20heading%20and%20if%20so%2C%20modify%20to%20use%20a%20heading%20element%20or%20role%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_heading%22%7D">Confirm this text '{0}' is used as a heading and if so, modify to use a heading element or role</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>text_quoted_correctly</strong>: Quotations should be marked with &lt;q&gt; or &lt;blockquote> elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_quoted_correctly.html#%7B%22message%22%3A%22If%20the%20following%20text%20is%20a%20quotation%2C%20mark%20it%20as%20a%20%3Cq%3E%20or%20%3Cblockquote%3E%20element%3A%20%7B0%7D%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">If the following text is a quotation, mark it as a &lt;q&gt; or &lt;blockquote> element: {0}</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>fieldset_legend_valid</strong>: &lt;fieldset&gt; elements should have a single, non-empty &lt;legend> as a label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_legend_valid.html#%7B%22message%22%3A%22%3Cfieldset%3E%20element%20does%20not%20have%20a%20%3Clegend%3E%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">&lt;fieldset&gt; element does not have a &lt;legend></a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_legend_valid.html#%7B%22message%22%3A%22%3Cfieldset%3E%20element%20has%20more%20than%20one%20%3Clegend%3E%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">&lt;fieldset&gt; element has more than one &lt;legend></a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_legend_valid.html#%7B%22message%22%3A%22%3Cfieldset%3E%20element%20%3Clegend%3E%20is%20empty%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">&lt;fieldset&gt; element &lt;legend> is empty</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_child_valid</strong>: An element with an ARIA role must own a required child + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_child_valid.html#%7B%22message%22%3A%22The%20element%20with%20role%20%5C%22%7B0%7D%5C%22%20does%20not%20own%20any%20child%20element%20with%20any%20of%20the%20following%20role(s)%3A%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_no_child%22%7D">The element with role "{0}" does not own any child element with any of the following role(s): "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_child_valid.html#%7B%22message%22%3A%22The%20element%20with%20role%20%5C%22%7B0%7D%5C%22%20owns%20the%20child%20element%20with%20the%20role%20%5C%22%7B1%7D%5C%22%20that%20is%20not%20one%20of%20the%20allowed%20role(s)%3A%20%5C%22%7B2%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_invalid_child%22%7D">The element with role "{0}" owns the child element with the role "{1}" that is not one of the allowed role(s): "{2}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_complementary_label_visible</strong>: Each element with "complementary" role should have a visible label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_complementary_label_visible.html#%7B%22message%22%3A%22Element%20with%20%5C%22complementary%5C%22%20role%20does%20not%20have%20a%20visible%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "complementary" role does not have a visible label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_content_in_landmark</strong>: All content must reside within an element with a landmark role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_content_in_landmark.html#%7B%22message%22%3A%22Content%20is%20not%20within%20a%20landmark%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Content is not within a landmark element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_contentinfo_misuse</strong>: Each element with "contentinfo" role is only permitted with an element with "main" role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_contentinfo_misuse.html#%7B%22message%22%3A%22Element%20with%20%5C%22contentinfo%5C%22%20role%20is%20present%20without%20an%20element%20with%20%5C%22main%5C%22%20role%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element with "contentinfo" role is present without an element with "main" role</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_landmark_name_unique</strong>: Each landmark should have a unique 'aria-labelledby' or 'aria-label' or be nested in a different parent region + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_landmark_name_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22%7B0%7D%5C%22%20landmarks%20within%20the%20same%20parent%20region%20are%20not%20distinguished%20from%20one%20another%20because%20they%20have%20the%20same%20%5C%22%7B1%7D%5C%22%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "{0}" landmarks within the same parent region are not distinguished from one another because they have the same "{1}" label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_main_label_visible</strong>: Each element with "main" role should have a unique visible label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_main_label_visible.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22main%5C%22%20role%20do%20not%20have%20unique%20visible%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "main" role do not have unique visible labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_fields_grouped</strong>: Groups of logically related input elements should be contained within a &lt;fieldset&gt; element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_fields_grouped.html#%7B%22message%22%3A%22Use%20the%20%3Cfieldset%3E%20element%20to%20group%20logically%20related%20input%20elements%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Use the &lt;fieldset&gt; element to group logically related input elements</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>list_structure_proper</strong>: List elements should only be used for lists of related items + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/list_structure_proper.html#%7B%22message%22%3A%22List%20element%20is%20missing%20or%20improperly%20structured%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">List element is missing or improperly structured</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>select_options_grouped</strong>: Groups of related options within a selection list should be grouped with &lt;optgroup&gt; + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/select_options_grouped.html#%7B%22message%22%3A%22Group%20of%20related%20options%20may%20need%20%3Coptgroup%3E%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Group of related options may need &lt;optgroup&gt;</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_layout_linearized</strong>: Avoid using tables to format text documents in columns unless the table can be linearized + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_layout_linearized.html#%7B%22message%22%3A%22Verify%20table%20is%20not%20being%20used%20to%20format%20text%20content%20in%20columns%20unless%20the%20table%20can%20be%20linearized%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify table is not being used to format text content in columns unless the table can be linearized</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.3.2 Meaningful Sequence [A]</h2> + <div>When the sequence in which content is presented affects its meaning, a correct reading sequence can be programmatically determined.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>dir_attribute_valid</strong>: 'dir' attribute value must be "ltr", "rtl", or "auto" + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/dir_attribute_valid.html#%7B%22message%22%3A%22Invalid%20value%20used%20for%20the%20'dir'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Invalid value used for the 'dir' attribute</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>text_whitespace_valid</strong>: Space characters should not be used to control spacing within a word + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_whitespace_valid.html#%7B%22message%22%3A%22Space%20characters%20should%20not%20be%20used%20to%20create%20space%20between%20the%20letters%20of%20a%20word%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_text%22%7D">Space characters should not be used to create space between the letters of a word</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>style_highcontrast_visible</strong>: Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_highcontrast_visible.html#%7B%22message%22%3A%22Confirm%20Windows%20high%20contrast%20mode%20is%20supported%20when%20using%20CSS%20to%20include%2C%20position%20or%20alter%20non-decorative%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Confirm Windows high contrast mode is supported when using CSS to include, position or alter non-decorative content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.3.3 Sensory Characteristics [A]</h2> + <div>Instructions provided for understanding and operating content do not rely solely on sensory characteristics of components such as shape, size, visual location, orientation, or sound.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>text_sensory_misuse</strong>: Instructions should be meaningful without relying solely on shape, size, or location words + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_sensory_misuse.html#%7B%22message%22%3A%22Confirm%20the%20word(s)%20'%7B0%7D'%20of%20the%20user%20instruction%20is%20used%20to%20indicate%20a%20logical%20rather%20than%20visual%20position%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_position%22%7D">Confirm the word(s) '{0}' of the user instruction is used to indicate a logical rather than visual position</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_sensory_misuse.html#%7B%22message%22%3A%22Confirm%20the%20user%20instruction%20is%20still%20understandable%20without%20the%20word(s)%20'%7B0%7D'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_other%22%7D">Confirm the user instruction is still understandable without the word(s) '{0}'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.1 Use of Color [A]</h2> + <div>Color is not used as the only visual means of conveying information, indicating an action, prompting a response, or distinguishing a visual element.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>form_font_color</strong>: Combine color and descriptive markup to indicate required form fields + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/form_font_color.html#%7B%22message%22%3A%22Check%20color%20is%20not%20used%20as%20the%20only%20visual%20means%20to%20convey%20which%20fields%20are%20required%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Check color is not used as the only visual means to convey which fields are required</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>style_color_misuse</strong>: Combine color and descriptive markup to convey information + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_color_misuse.html#%7B%22message%22%3A%22Verify%20color%20is%20not%20used%20as%20the%20only%20visual%20means%20of%20conveying%20information%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify color is not used as the only visual means of conveying information</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.2 Audio Control [A]</h2> + <div>If any audio plays automatically for more than 3 seconds, either a mechanism is available to pause or stop the audio, or a mechanism is available to control audio volume independently from the overall system volume level.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>media_autostart_controllable</strong>: Mechanism must be available to pause or stop and control the volume of the audio that plays automatically + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_autostart_controllable.html#%7B%22message%22%3A%22Verify%20there%20is%20a%20mechanism%20to%20pause%20or%20stop%20and%20control%20the%20volume%20for%20the%20audio%20that%20plays%20automatically%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify there is a mechanism to pause or stop and control the volume for the audio that plays automatically</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.3 Contrast (Minimum) [AA]</h2> + <div>The visual presentation of text and images of text has a contrast ratio of at least 4.5:1, with a 3:1 ratio for large-scale text.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>text_contrast_sufficient</strong>: The contrast ratio of text with its background must meet WCAG AA requirements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_contrast_sufficient.html#%7B%22message%22%3A%22Text%20contrast%20of%20%7B0%7D%20with%20its%20background%20is%20less%20than%20the%20WCAG%20AA%20minimum%20requirements%20for%20text%20of%20size%20%7B1%7Dpx%20and%20weight%20of%20%7B2%7D%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_contrast%22%7D">Text contrast of {0} with its background is less than the WCAG AA minimum requirements for text of size {1}px and weight of {2}</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_contrast_sufficient.html#%7B%22message%22%3A%22The%20foreground%20text%20and%20its%20background%20color%20are%20both%20detected%20as%20%7B3%7D.%20Verify%20the%20text%20meets%20the%20WCAG%20AA%20requirements%20for%20minimum%20contrast%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_same_color%22%7D">The foreground text and its background color are both detected as {3}. Verify the text meets the WCAG AA requirements for minimum contrast</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_contrast_sufficient.html#%7B%22message%22%3A%22Verify%20the%20contrast%20ratio%20of%20the%20text%20against%20the%20lightest%20and%20the%20darkest%20colors%20of%20the%20background%20meets%20the%20WCAG%20AA%20minimum%20requirements%20for%20text%20of%20size%20%7B1%7Dpx%20and%20weight%20of%20%7B2%7D%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_graphic_background%22%7D">Verify the contrast ratio of the text against the lightest and the darkest colors of the background meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/text_contrast_sufficient.html#%7B%22message%22%3A%22Verify%20the%20contrast%20ratio%20of%20the%20text%20with%20shadow%20meets%20the%20WCAG%20AA%20minimum%20requirements%20for%20text%20of%20size%20%7B1%7Dpx%20and%20weight%20of%20%7B2%7D%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_text_shadow%22%7D">Verify the contrast ratio of the text with shadow meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.4 Resize text [AA]</h2> + <div>Text can be resized without assistive technology up to 200 percent without loss of content or functionality.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>style_viewport_resizable</strong>: Text must scale up to 200% without loss of content or functionality + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_viewport_resizable.html#%7B%22message%22%3A%22Verify%20that%20text%20sized%20using%20viewport%20units%20can%20be%20resized%20up%20to%20200%25%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that text sized using viewport units can be resized up to 200%</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>meta_viewport_zoomable</strong>: The 'meta[name=viewport]' should not prevent the browser zooming the content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/meta_viewport_zoomable.html#%7B%22message%22%3A%22Confirm%20the%20'meta%5Bname%3Dviewport%5D'%20with%20%5C%22%7B0%7D%5C%22%20can%20be%20zoomed%20by%20user%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_zoomable%22%7D">Confirm the 'meta[name=viewport]' with "{0}" can be zoomed by user</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>1.4.5 Images of Text [AA]</h2> + <div>If the technologies being used can achieve the visual presentation, text should not be used to convey information rather than images of text.</div> + +</div><div> + <h2>2.1.1 Keyboard [A]</h2> + <div>All functionality of the content is operable through a keyboard interface without requiring specific timings for individual keystrokes.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>aria_activedescendant_tabindex_valid</strong>: Element using 'aria-activedescendant' property should be tabbable + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_activedescendant_tabindex_valid.html#%7B%22message%22%3A%22The%20%3C%7B0%7D%3E%20element%20using%20'aria-activedescendant'%20set%20to%20%5C%22%7B1%7D%5C%22%20is%20not%20tabbable%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;{0}&gt; element using 'aria-activedescendant' set to "{1}" is not tabbable</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_child_tabbable</strong>: UI component must have at least one tabbable descendant for keyboard access + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_child_tabbable.html#%7B%22message%22%3A%22None%20of%20the%20descendent%20elements%20with%20%5C%22%7B1%7D%5C%22%20role%20is%20tabbable%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_missing_child%22%7D">None of the descendent elements with "{1}" role is tabbable</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>iframe_interactive_tabbable</strong>: Iframe with interactive content should not be excluded from tab order using tabindex + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/iframe_interactive_tabbable.html#%7B%22message%22%3A%22The%20%3Ciframe%3E%20with%20interactive%20content%20is%20excluded%20from%20tab%20order%20using%20tabindex%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid%22%7D">The &lt;iframe&gt; with interactive content is excluded from tab order using tabindex</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>application_content_accessible</strong>: Non-decorative static text and image content within an element with "application" role must be accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/application_content_accessible.html#%7B%22message%22%3A%22Verify%20that%20the%20non-decorative%20static%20text%20and%20image%20content%20within%20an%20element%20with%20%5C%22application%5C%22%20role%20are%20accessible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that the non-decorative static text and image content within an element with "application" role are accessible</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_keyboard_handler_exists</strong>: Interactive WAI_ARIA UI components must provide keyboard access + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_keyboard_handler_exists.html#%7B%22message%22%3A%22Verify%20the%20%3C%7B0%7D%3E%20element%20with%20%5C%22%7B1%7D%5C%22%20role%20has%20keyboard%20access%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_no_keyboard_access%22%7D">Verify the &lt;{0}&gt; element with "{1}" role has keyboard access</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>script_focus_blur_review</strong>: Scripting must not remove focus from content that normally receives focus + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_focus_blur_review.html#%7B%22message%22%3A%22Verify%20script%20does%20not%20remove%20focus%20from%20content%20that%20normally%20receives%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify script does not remove focus from content that normally receives focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>script_onclick_misuse</strong>: Scripts should not be used to emulate links + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_onclick_misuse.html#%7B%22message%22%3A%22Possible%20use%20of%20a%20script%20to%20emulate%20a%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Possible use of a script to emulate a link</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>widget_tabbable_exists</strong>: Component must have at least one tabbable element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/widget_tabbable_exists.html#%7B%22message%22%3A%22Component%20with%20%5C%22%7B0%7D%5C%22%20role%20does%20not%20have%20a%20tabbable%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22fail_no_tabbable%22%7D">Component with "{0}" role does not have a tabbable element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>widget_tabbable_single</strong>: Components with a widget role must have no more than one tabbable element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/widget_tabbable_single.html#%7B%22message%22%3A%22Component%20with%20%5C%22%7B0%7D%5C%22%20role%20has%20more%20than%20one%20tabbable%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_multiple_tabbable%22%7D">Component with "{0}" role has more than one tabbable element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>media_keyboard_controllable</strong>: Media using &lt;audio&gt; and/or &lt;video> elements must have keyboard accessible controls + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/media_keyboard_controllable.html#%7B%22message%22%3A%22Verify%20media%20using%20%3Caudio%3E%20and%2For%20%3Cvideo%3E%20elements%20have%20keyboard%20accessible%20controls%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify media using &lt;audio&gt; and/or &lt;video> elements have keyboard accessible controls</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>script_onclick_avoid</strong>: Scripts should not be used to emulate links + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_onclick_avoid.html#%7B%22message%22%3A%22Verify%20that%20'onclick'%20events%20are%20not%20used%20in%20script%20to%20emulate%20a%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that 'onclick' events are not used in script to emulate a link</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>canvas_content_described</strong>: The &lt;canvas&gt; element may not be accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/canvas_content_described.html#%7B%22message%22%3A%22Verify%20accessibility%20of%20the%20%3Ccanvas%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify accessibility of the &lt;canvas&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>element_mouseevent_keyboard</strong>: All interactive content with mouse event handlers must have equivalent keyboard access + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_mouseevent_keyboard.html#%7B%22message%22%3A%22Confirm%20the%20%3C%7B0%7D%3E%20element%20with%20mouse%20event%20handler(s)%20'%7B1%7D'%20has%20a%20corresponding%20keyboard%20handler(s)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Confirm the &lt;{0}&gt; element with mouse event handler(s) '{1}' has a corresponding keyboard handler(s)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.1.2 No Keyboard Trap [A]</h2> + <div>If keyboard focus can be moved to a component using a keyboard interface, then focus can be moved away from that component using only a keyboard interface, and, if it requires more than unmodified arrow or tab keys or other standard exit methods, the user is advised of the method for moving focus away.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>download_keyboard_controllable</strong>: File download mechanisms should be keyboard-operable and preserve page focus location + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/download_keyboard_controllable.html#%7B%22message%22%3A%22Verify%20that%20the%20file%20download%20mechanism%20does%20not%20cause%20a%20keyboard%20trap%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify that the file download mechanism does not cause a keyboard trap</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.2.1 Timing Adjustable [A]</h2> + <div>For each time limit that is set by the content, the user can turn off, adjust, or extend the limit.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>meta_refresh_delay</strong>: Pages should not refresh automatically + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/meta_refresh_delay.html#%7B%22message%22%3A%22Verify%20page%20is%20not%20being%20caused%20to%20refresh%20automatically%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_refresh%22%7D">Verify page is not being caused to refresh automatically</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.2.2 Pause, Stop, Hide [A]</h2> + <div>For moving, blinking, scrolling, or auto-updating information, the user can pause, stop, hide or adjust the information.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>blink_elem_deprecated</strong>: Content that blinks persistently must not be used + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/blink_elem_deprecated.html#%7B%22message%22%3A%22Content%20found%20that%20blinks%20persistently%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Content found that blinks persistently</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>marquee_elem_avoid</strong>: The &lt;marquee&gt; element is obsolete and should not be used + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/marquee_elem_avoid.html#%7B%22message%22%3A%22Scrolling%20content%20found%20that%20uses%20the%20obsolete%20%3Cmarquee%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Scrolling content found that uses the obsolete &lt;marquee&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>blink_css_review</strong>: Do not use the "blink" value of the 'text-decoration' property for longer than five seconds + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/blink_css_review.html#%7B%22message%22%3A%22Check%20the%20%5C%22blink%5C%22%20value%20of%20the%20CSS%20'text-decoration'%20property%20is%20not%20used%20for%20more%20than%20than%20five%20seconds%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Check the "blink" value of the CSS 'text-decoration' property is not used for more than than five seconds</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.3.1 Three Flashes or Below Threshold [A]</h2> + <div>Content does not contain anything that flashes more than three times in any one second period, or the flash is below the general flash and red flash thresholds.</div> + +</div><div> + <h2>2.4.1 Bypass Blocks [A]</h2> + <div>A mechanism is available to bypass blocks of content that are repeated on multiple Web pages.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>aria_application_label_unique</strong>: Each element with "application" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_application_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22application%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "application" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_application_labelled</strong>: Each element with "application" role must have a label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_application_labelled.html#%7B%22message%22%3A%22Element%20with%20%5C%22application%5C%22%20role%20does%20not%20have%20a%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_label%22%7D">Element with "application" role does not have a label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_article_label_unique</strong>: Each element with "article" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_article_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22article%5C%22%20role%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "article" role do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_document_label_unique</strong>: Each element with "document" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_document_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22document%5C%22%20roles%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_label_not_unique%22%7D">Multiple elements with "document" roles do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_toolbar_label_unique</strong>: Each element with "toolbar" role must have a unique label that describes its purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_toolbar_label_unique.html#%7B%22message%22%3A%22Multiple%20elements%20with%20%5C%22toolbar%5C%22%20roles%20do%20not%20have%20unique%20labels%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Multiple elements with "toolbar" roles do not have unique labels</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>skip_main_exists</strong>: Pages must provide a way to skip directly to the main content + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/skip_main_exists.html#%7B%22message%22%3A%22The%20page%20does%20not%20provide%20a%20way%20to%20quickly%20navigate%20to%20the%20main%20content%20(ARIA%20%5C%22main%5C%22%20landmark%20or%20a%20skip%20link)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The page does not provide a way to quickly navigate to the main content (ARIA "main" landmark or a skip link)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>frame_src_valid</strong>: A &lt;frame&gt; containing non-HTML content must be made accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/frame_src_valid.html#%7B%22message%22%3A%22Verify%20%3Cframe%3E%20content%20is%20accessible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify &lt;frame&gt; content is accessible</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>html_skipnav_exists</strong>: Provide a way to bypass blocks of content that are repeated on multiple Web pages + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_skipnav_exists.html#%7B%22message%22%3A%22Verify%20there%20is%20a%20way%20to%20bypass%20blocks%20of%20content%20that%20are%20repeated%20on%20multiple%20Web%20pages%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify there is a way to bypass blocks of content that are repeated on multiple Web pages</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>skip_main_described</strong>: The description of a hyperlink used to skip content must communicate where it links to + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/skip_main_described.html#%7B%22message%22%3A%22Verify%20that%20if%20this%20hyperlink%20skips%20content%2C%20the%20description%20communicates%20where%20it%20links%20to%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that if this hyperlink skips content, the description communicates where it links to</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.2 Page Titled [A]</h2> + <div>Web pages, non-web documents, and software have titles that describe topic or purpose.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>page_title_exists</strong>: The page should have a title that correctly identifies the subject of the page + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/page_title_exists.html#%7B%22message%22%3A%22Missing%20%3Chead%3E%20element%20so%20there%20can%20be%20no%20%3Ctitle%3E%20element%20present%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Missing &lt;head&gt; element so there can be no &lt;title> element present</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/page_title_exists.html#%7B%22message%22%3A%22Missing%20%3Ctitle%3E%20element%20in%20%3Chead%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Missing &lt;title&gt; element in &lt;head> element</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/page_title_exists.html#%7B%22message%22%3A%22The%20%3Ctitle%3E%20element%20is%20empty%20(no%20innerHTML)%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">The &lt;title&gt; element is empty (no innerHTML)</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>page_title_valid</strong>: Page &lt;title&gt; should be a descriptive title, rather than a filename + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/page_title_valid.html#%7B%22message%22%3A%22Verify%20that%20using%20the%20filename%20as%20the%20page%20%3Ctitle%3E%20value%20is%20descriptive%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_2%22%7D">Verify that using the filename as the page &lt;title&gt; value is descriptive</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.3 Focus Order [A]</h2> + <div>If content can be navigated sequentially and the navigation sequences affect meaning or operation, focusable components receive focus in an order that preserves meaning and operability.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>widget_tabbable_single</strong>: Components with a widget role must have no more than one tabbable element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/widget_tabbable_single.html#%7B%22message%22%3A%22Component%20with%20%5C%22%7B0%7D%5C%22%20role%20has%20more%20than%20one%20tabbable%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_multiple_tabbable%22%7D">Component with "{0}" role has more than one tabbable element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.4 Link Purpose (In Context) [A]</h2> + <div>The purpose of each link can be determined from the link text alone or from the link text together with its programmatically determined link content.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>img_alt_redundant</strong>: The text alternative for an image within a link should not repeat the link text or adjacent link text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Link%20text%20is%20repeated%20in%20an%20image%20'alt'%20value%20within%20the%20same%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Link text is repeated in an image 'alt' value within the same link</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Link%20text%20of%20previous%20link%20is%20repeated%20in%20image%20'alt'%20value%20of%20a%20link%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Link text of previous link is repeated in image 'alt' value of a link</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/img_alt_redundant.html#%7B%22message%22%3A%22Image%20'alt'%20value%20within%20a%20link%20is%20repeated%20in%20link%20text%20of%20the%20link%20after%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Image 'alt' value within a link is repeated in link text of the link after</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>a_text_purpose</strong>: Hyperlinks must have an accessible name for their purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/a_text_purpose.html#%7B%22message%22%3A%22Hyperlink%20has%20no%20link%20text%2C%20label%20or%20image%20with%20a%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_acc_name%22%7D">Hyperlink has no link text, label or image with a text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.5 Multiple Ways [AA]</h2> + <div>More than one way is available to locate a Web page within a set of Web pages, except where the Web Page is the result of, or a step in, a process.</div> + +</div><div> + <h2>2.4.6 Headings and Labels [AA]</h2> + <div>Headings and labels describe topic or purpose.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>heading_content_exists</strong>: Heading elements must provide descriptive text + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/heading_content_exists.html#%7B%22message%22%3A%22Heading%20element%20has%20no%20descriptive%20content%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Heading element has no descriptive content</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>2.4.7 Focus Visible [AA]</h2> + <div>Any keyboard operable user interface has a mode of operation where the keyboard focus indicator is visible.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>element_tabbable_visible</strong>: A tabbable element should be visible on the screen when it has keyboard focus + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_tabbable_visible.html#%7B%22message%22%3A%22Confirm%20the%20element%20should%20be%20tabbable%20and%20if%20so%2C%20it%20becomes%20visible%20when%20it%20has%20keyboard%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_visible%22%7D">Confirm the element should be tabbable and if so, it becomes visible when it has keyboard focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>script_focus_blur_review</strong>: Scripting must not remove focus from content that normally receives focus + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_focus_blur_review.html#%7B%22message%22%3A%22Verify%20script%20does%20not%20remove%20focus%20from%20content%20that%20normally%20receives%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify script does not remove focus from content that normally receives focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>style_focus_visible</strong>: The keyboard focus indicator should be visible when default border or outline is modified by CSS + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/style_focus_visible.html#%7B%22message%22%3A%22Check%20the%20keyboard%20focus%20indicator%20is%20visible%20when%20using%20CSS%20declaration%20for%20'border'%20or%20'outline'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_focus_not_visible%22%7D">Check the keyboard focus indicator is visible when using CSS declaration for 'border' or 'outline'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.1.1 Language of Page [A]</h2> + <div>The default human language of Web pages, non-Web documents, or software can be programmatically determined.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>html_lang_exists</strong>: Page must identify the default language of the document with a 'lang' attribute + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20as%20XHTML%201.0%2C%20but%20has%20neither%20'lang'%20nor%20'xml%3Alang'%20attributes%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Page detected as XHTML 1.0, but has neither 'lang' nor 'xml:lang' attributes</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20as%20XHTML%2C%20but%20does%20not%20have%20an%20'xml%3Alang'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Page detected as XHTML, but does not have an 'xml:lang' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20as%20HTML%2C%20but%20does%20not%20have%20a%20'lang'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Page detected as HTML, but does not have a 'lang' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20with%20'lang'%20and%20'xml%3Alang'%20attributes%20and%20primary%20languages%20do%20not%20match%3A%20%5C%22%7B0%7D%5C%22%2C%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_4%22%7D">Page detected with 'lang' and 'xml:lang' attributes and primary languages do not match: "{0}", "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20with%20'lang'%20and%20'xml%3Alang'%20attributes%20that%20do%20not%20match%3A%20%5C%22%7B0%7D%5C%22%2C%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_5%22%7D">Page detected with 'lang' and 'xml:lang' attributes that do not match: "{0}", "{1}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20as%20XHTML%201.0%20with%20only%20a%20'lang'%20attribute.%20Confirm%20that%20page%20is%20only%20delivered%20via%20text%2Fhtml%20mime%20type%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_5%22%7D">Page detected as XHTML 1.0 with only a 'lang' attribute. Confirm that page is only delivered via text/html mime type</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_exists.html#%7B%22message%22%3A%22Page%20detected%20as%20XHTML%201.0%20with%20only%20an%20'xml%3Alang'%20attribute.%20Confirm%20that%20page%20is%20only%20delivered%20via%20xml%20mime%20type%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_6%22%7D">Page detected as XHTML 1.0 with only an 'xml:lang' attribute. Confirm that page is only delivered via xml mime type</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>html_lang_valid</strong>: The default human language of the page must be valid and specified in accordance with BCP 47 + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_valid.html#%7B%22message%22%3A%22Specified%20'lang'%20attribute%20does%20not%20include%20a%20valid%20primary%20language%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Specified 'lang' attribute does not include a valid primary language</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_valid.html#%7B%22message%22%3A%22Specified%20'lang'%20attribute%20does%20not%20conform%20to%20BCP%2047%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Specified 'lang' attribute does not conform to BCP 47</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_valid.html#%7B%22message%22%3A%22Specified%20'xml%3Alang'%20attribute%20does%20not%20include%20a%20valid%20primary%20language%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Specified 'xml:lang' attribute does not include a valid primary language</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/html_lang_valid.html#%7B%22message%22%3A%22Specified%20'xml%3Alang'%20attribute%20does%20not%20conform%20to%20BCP%2047%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_4%22%7D">Specified 'xml:lang' attribute does not conform to BCP 47</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.1.2 Language of Parts [AA]</h2> + <div>The human language of each passage or phrase in the content can be programmatically determined.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>element_lang_valid</strong>: The change in language of specific content must be valid and specified in accordance with BCP 47 + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_lang_valid.html#%7B%22message%22%3A%22Specified%20'lang'%20attribute%20does%20not%20include%20a%20valid%20primary%20language%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Specified 'lang' attribute does not include a valid primary language</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_lang_valid.html#%7B%22message%22%3A%22Specified%20'lang'%20attribute%20does%20not%20conform%20to%20BCP%2047%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Specified 'lang' attribute does not conform to BCP 47</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_lang_valid.html#%7B%22message%22%3A%22Specified%20'xml%3Alang'%20attribute%20does%20not%20include%20a%20valid%20primary%20language%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Specified 'xml:lang' attribute does not include a valid primary language</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_lang_valid.html#%7B%22message%22%3A%22Specified%20'xml%3Alang'%20attribute%20does%20not%20conform%20to%20BCP%2047%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_4%22%7D">Specified 'xml:lang' attribute does not conform to BCP 47</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.2.1 On Focus [A]</h2> + <div>When any component receives focus, it does not initiate a change of context.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>script_focus_blur_review</strong>: Scripting must not remove focus from content that normally receives focus + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_focus_blur_review.html#%7B%22message%22%3A%22Verify%20script%20does%20not%20remove%20focus%20from%20content%20that%20normally%20receives%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify script does not remove focus from content that normally receives focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>script_select_review</strong>: No changes of context should occur when a selection value receives focus + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/script_select_review.html#%7B%22message%22%3A%22Verify%20that%20no%20change%20of%20context%20or%20action%20occurs%20when%20selection%20options%20in%20this%20component%20receive%20focus%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that no change of context or action occurs when selection options in this component receive focus</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.2.2 On Input [A]</h2> + <div>Changing the setting of any user interface component does not automatically cause a change of context unless the user has been advised of the behavior before using the component.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>form_interaction_review</strong>: User should be informed in advance when interacting with content causes a change of context + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/form_interaction_review.html#%7B%22message%22%3A%22Verify%20that%20interacting%20with%20content%20will%20not%20open%20pop-up%20windows%20or%20change%20the%20active%20window%20without%20informing%20the%20user%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify that interacting with content will not open pop-up windows or change the active window without informing the user</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>form_submit_button_exists</strong>: A &lt;form&gt; element should have a submit button or an image button + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/form_submit_button_exists.html#%7B%22message%22%3A%22Verify%20the%20%3Cform%3E%20element%20has%20a%20submit%20button%20or%20an%20image%20button%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Verify the &lt;form&gt; element has a submit button or an image button</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_onchange_review</strong>: Users must be advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_onchange_review.html#%7B%22message%22%3A%22Confirm%20that%20the%20user%20is%20advised%20if%2C%20due%20to%20a%20change%20of%20element%20value%2C%20a%20form%20automatically%20submits%2C%20a%20new%20window%20opens%2C%20or%20a%20change%20in%20focus%20occurs%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_warning%22%7D">Confirm that the user is advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>a_target_warning</strong>: Users should be warned in advance if their input action will open a new window + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/a_target_warning.html#%7B%22message%22%3A%22Inform%20the%20user%20when%20their%20input%20action%20will%20open%20a%20new%20window%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_warn%22%7D">Inform the user when their input action will open a new window</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.2.3 Consistent Navigation [AA]</h2> + <div>Navigational mechanisms that are repeated on multiple Web pages within a set of Web pages occur in the same relative order each time they are repeated, unless a change is initiated by the user.</div> + +</div><div> + <h2>3.2.4 Consistent Identification [AA]</h2> + <div>Components that have the same functionality within a set of Web pages are identified consistently.</div> + +</div><div> + <h2>3.3.1 Error Identification [A]</h2> + <div>If an input error is automatically detected, the item that is in error is identified and the error is described to the user in text.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>error_message_exists</strong>: A custom error message must reference a valid 'id' value and when triggered the message must be appropriately exposed + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/error_message_exists.html#%7B%22message%22%3A%22Custom%20error%20message%20has%20invalid%20reference%20'id'%20value%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Custom error message has invalid reference 'id' value</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/error_message_exists.html#%7B%22message%22%3A%22Custom%20error%20message%20is%20not%20visible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Custom error message is not visible</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.3.2 Labels or Instructions [A]</h2> + <div>Labels or instructions are provided when content requires user input.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>fieldset_label_valid</strong>: Groups with nested inputs must have unique accessible name + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_label_valid.html#%7B%22message%22%3A%22Group%2FFieldset%20does%20not%20have%20an%20accessible%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Group/Fieldset does not have an accessible name</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/fieldset_label_valid.html#%7B%22message%22%3A%22Group%2FFieldset%20%5C%22%7B0%7D%5C%22%20has%20a%20duplicate%20name%20to%20another%20group%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Group/Fieldset "{0}" has a duplicate name to another group</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_label_after</strong>: Checkboxes and radio buttons must have a label after the input control + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_after.html#%7B%22message%22%3A%22Checkbox%20or%20radio%20button%20is%20nested%20in%20label%2C%20so%20label%20is%20not%20after%20the%20input%20control%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Checkbox or radio button is nested in label, so label is not after the input control</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_after.html#%7B%22message%22%3A%22Label%20text%20is%20located%20before%20its%20associated%20checkbox%20or%20radio%20button%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Label text is located before its associated checkbox or radio button element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_label_before</strong>: Text inputs and &lt;select&gt; elements must have a label before the input control + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_before.html#%7B%22message%22%3A%22Text%20input%20is%20nested%20in%20label%20such%20that%20input%20precedes%20the%20label%20text%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Text input is nested in label such that input precedes the label text</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_before.html#%7B%22message%22%3A%22Label%20text%20is%20located%20after%20its%20associated%20text%20input%20or%20%3Cselect%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Label text is located after its associated text input or &lt;select&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_label_visible</strong>: An input element must have an associated visible label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_visible.html#%7B%22message%22%3A%22The%20%E2%80%98placeholder%E2%80%99%20is%20the%20only%20visible%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_placeholder_only%22%7D">The ‘placeholder’ is the only visible label</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_visible.html#%7B%22message%22%3A%22The%20input%20element%20does%20not%20have%20an%20associated%20visible%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_no_label%22%7D">The input element does not have an associated visible label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>element_accesskey_labelled</strong>: An element with an assigned 'accesskey' attribute must have an associated label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_accesskey_labelled.html#%7B%22message%22%3A%22The%20element%20with%20an%20assigned%20'accesskey'%20attribute%20does%20not%20have%20an%20associated%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">The element with an assigned 'accesskey' attribute does not have an associated label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div><div> + <h2>3.3.3 Error Suggestion [AA]</h2> + <div>If an input error is automatically detected and suggestions for correction are known, then the suggestions are provided to the user, unless it would jeopardize the security or purpose of the content.</div> + +</div><div> + <h2>3.3.4 Error Prevention (Legal, Financial, Data) [AA]</h2> + <div>For content that cause legal commitments or financial transactions for the user to occur, that modify or delete user-controllable data in data storage systems, or that submit user test responses, the user can reverse, correct, or confirm the action.</div> + +</div><div> + <h2>4.1.1 Parsing [A]</h2> + <div>(Obsolete and removed) This requirement was originally adopted to address problems that assistive technology (AT) had directly parsing HTML. AT no longer has any need to directly parse HTML. Consequently, these problems either no longer exist or are addressed by other requirements.</div> + +</div><div> + <h2>4.1.2 Name, Role, Value [A]</h2> + <div>For all user interface components (including, but not limited to: form elements, links and components generated by scripts), the name and role can be programmatically determined; states, properties, and values that can be set by the user can be programmatically set; and notification of changes to these items is available to user agents, including assistive technologies.</div> + <bx-unordered-list style="margin-top: .5rem"><bx-list-item><strong>combobox_popup_reference</strong>: The 'aria-controls' (for ARIA 1.2) or the 'aria-owns' (for ARIA 1.0) attribute of the expanded combobox must reference a valid popup 'id' value + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20'aria-owns'%20attribute%20of%20the%20expanded%20combobox%20is%20missing%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1.0_missing_owns%22%7D">The 'aria-owns' attribute of the expanded combobox is missing</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20'aria-controls'%20attribute%20of%20the%20expanded%20combobox%20is%20missing%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1.2_missing_controls%22%7D">The 'aria-controls' attribute of the expanded combobox is missing</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20'aria-owns'%20attribute%20%5C%22%7B0%7D%5C%22%20of%20the%20expanded%20combobox%20does%20not%20reference%20a%20valid%20popup%20'id'%20value%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1.0_popup_reference_missing%22%7D">The 'aria-owns' attribute "{0}" of the expanded combobox does not reference a valid popup 'id' value</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20'aria-controls'%20attribute%20%5C%22%7B0%7D%5C%22%20of%20the%20expanded%20combobox%20does%20not%20reference%20a%20valid%20popup%20'id'%20value%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1.2_popup_reference_missing%22%7D">The 'aria-controls' attribute "{0}" of the expanded combobox does not reference a valid popup 'id' value</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20combobox%20'aria-expanded'%20attribute%20is%20true%2C%20but%20the%20combobox%20popup%20is%20not%20visible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_combobox_expanded_hidden%22%7D">The combobox 'aria-expanded' attribute is true, but the combobox popup is not visible</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_popup_reference.html#%7B%22message%22%3A%22The%20combobox%20'aria-expanded'%20attribute%20is%20false%2C%20but%20the%20combobox%20popup%20is%20visible%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_combobox_collapsed_visible%22%7D">The combobox 'aria-expanded' attribute is false, but the combobox popup is visible</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_activedescendant_valid</strong>: The 'aria-activedescendant' property must reference the 'id' of a non-empty, non-hidden active child element + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_activedescendant_valid.html#%7B%22message%22%3A%22The%20'aria-activedescendant'%20property%20is%20empty%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The 'aria-activedescendant' property is empty</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_activedescendant_valid.html#%7B%22message%22%3A%22The%20'aria-activedescendant'%20property%20references%20a%20hidden%20node%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The 'aria-activedescendant' property references a hidden node</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_activedescendant_valid.html#%7B%22message%22%3A%22Element%20is%20not%20a%20combobox%2C%20and%20the%20referenced%20active-descendant%20element%20is%20not%20a%20valid%20descendant%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_3%22%7D">Element is not a combobox, and the referenced active-descendant element is not a valid descendant</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>combobox_active_descendant</strong>: 'aria-activedescendant' must be used to define focus within the combobox popup, except when using a dialog popup + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_active_descendant.html#%7B%22message%22%3A%22The%20element%20referenced%20by%20'aria-activedescendant'%20%5C%22%7B0%7D%5C%22%20does%20not%20exist%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_missing%22%7D">The element referenced by 'aria-activedescendant' "{0}" does not exist</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_active_descendant.html#%7B%22message%22%3A%22The%20'aria-activedescendant'%20%5C%22%7B0%7D%5C%22%20references%20an%20element%20with%20the%20roles%20%5C%22%7B1%7D%5C%22%2C%20which%20does%20not%20have%20a%20valid%20ARIA%20role%20of%20'option'%2C%20'gridcell'%2C%20'row'%2C%20or%20'treeitem'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_active_role_invalid%22%7D">The 'aria-activedescendant' "{0}" references an element with the roles "{1}", which does not have a valid ARIA role of 'option', 'gridcell', 'row', or 'treeitem'</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_active_descendant.html#%7B%22message%22%3A%22The%20'aria-activedescendant'%20%5C%22%7B0%7D%5C%22%20references%20an%20element%20that%20does%20not%20have%20'aria-selected'%20set%20to%20true%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_active_not_selected%22%7D">The 'aria-activedescendant' "{0}" references an element that does not have 'aria-selected' set to true</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_haspopup_conflict</strong>: &lt;input&gt; element with a 'list' attribute should not use an explicit 'aria-haspopup' attribute + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_haspopup_conflict.html#%7B%22message%22%3A%22The%20%3Cinput%3E%20element%20with%20type%20%5C%22%7B0%7D%5C%22%20and%20'list'%20attribute%20uses%20an%20explicit%20'aria-haspopup'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_type_misuse%22%7D">The &lt;input&gt; element with type "{0}" and 'list' attribute uses an explicit 'aria-haspopup' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_haspopup_conflict.html#%7B%22message%22%3A%22The%20%3Cinput%3E%20element%20with%20a%20missing%20or%20invalid%20type%20and%20'list'%20attribute%20uses%20an%20explicit%20'aria-haspopup'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_misuse%22%7D">The &lt;input&gt; element with a missing or invalid type and 'list' attribute uses an explicit 'aria-haspopup' attribute</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_haspopup_conflict.html#%7B%22message%22%3A%22The%20list%20attribute%20for%20the%20%3Cinput%3E%20element%20is%20invalid%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_list_notexist%22%7D">The list attribute for the &lt;input&gt; element is invalid</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_haspopup_conflict.html#%7B%22message%22%3A%22The%20list%20attribute%20for%20the%20%3Cinput%3E%20element%20with%20the%20type%20%5C%22%7B0%7D%5C%22%20is%20invalid%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid_list_type%22%7D">The list attribute for the &lt;input&gt; element with the type "{0}" is invalid</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_haspopup_conflict.html#%7B%22message%22%3A%22The%20list%20attribute%20for%20the%20%3Cinput%3E%20element%20does%20not%20reference%20a%20datalist%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid_list_elem%22%7D">The list attribute for the &lt;input&gt; element does not reference a datalist element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_role_valid</strong>: ARIA roles must be valid for the element to which they are assigned + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_role_valid.html#%7B%22message%22%3A%22The%20ARIA%20role%20'%7B0%7D'%20is%20not%20valid%20for%20the%20element%20%3C%7B1%7D%3E%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The ARIA role '{0}' is not valid for the element &lt;{1}&gt;</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_role_valid.html#%7B%22message%22%3A%22The%20ARIA%20role%20'%7B0%7D'%20is%20not%20valid%20for%20the%20element%20%3C%7B1%7D%3E%20and%20may%20be%20ignored%20by%20the%20browser%20since%20the%20element%20is%20focusable%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The ARIA role '{0}' is not valid for the element &lt;{1}&gt; and may be ignored by the browser since the element is focusable</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>combobox_autocomplete_valid</strong>: A combobox that supports autocompletion behavior must have the 'aria-autocomplete' attribute only on its text input element with a valid value; a value of '"inline"' is not supported + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_autocomplete_valid.html#%7B%22message%22%3A%22The%20combobox%20has%20the%20'aria-autocomplete'%20attribute%20incorrectly%20set%20on%20an%20element%20within%20the%20popup%20referenced%20by%20%5C%22%7B0%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The combobox has the 'aria-autocomplete' attribute incorrectly set on an element within the popup referenced by "{0}"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_autocomplete_valid.html#%7B%22message%22%3A%22The%20combobox%20does%20not%20support%20an%20'aria-autocomplete'%20attribute%20value%20set%20to%20'%5C%22inline%5C%22'%20%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_inline%22%7D">The combobox does not support an 'aria-autocomplete' attribute value set to '"inline"' </a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>combobox_focusable_elements</strong>: Tabbable focus for the combobox must be allowed only on the text input, except when using a dialog popup + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_focusable_elements.html#%7B%22message%22%3A%22The%20combobox%20element%20does%20not%20allow%20DOM%20focus%20as%20required%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_not_tabbable%22%7D">The combobox element does not allow DOM focus as required</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_focusable_elements.html#%7B%22message%22%3A%22The%20popup%20of%20the%20combobox%20has%20DOM%20focus%20or%20has%20'aria-activedescendant'%20defined%2C%20which%20is%20not%20allowed%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_tabbable_child%22%7D">The popup of the combobox has DOM focus or has 'aria-activedescendant' defined, which is not allowed</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>combobox_haspopup_valid</strong>: The combobox attribute 'aria-haspopup' value must be appropriate for the role of the element referenced by 'aria-controls' (ARIA 1.2) or 'aria-owns' (ARIA 1.0) + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_haspopup_valid.html#%7B%22message%22%3A%22The%20'role'%20value%20%5C%22%7B0%7D%5C%22%20of%20the%20popup%20element%20%5C%22%7B1%7D%5C%22%20should%20be%20one%20of%20%5C%22listbox%5C%22%2C%20%5C%22grid%5C%22%2C%20%5C%22tree%5C%22%20or%20%5C%22dialog%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_popup_role_invalid%22%7D">The 'role' value "{0}" of the popup element "{1}" should be one of "listbox", "grid", "tree" or "dialog"</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_haspopup_valid.html#%7B%22message%22%3A%22The%20value%20of%20the%20combobox%20'aria-haspopup'%20attribute%20%5C%22%7B0%7D%5C%22%20does%20not%20match%20the%20'role'%20value%20of%20the%20popup%20element%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_combobox_popup_role_mismatch%22%7D">The value of the combobox 'aria-haspopup' attribute "{0}" does not match the 'role' value of the popup element "{1}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>input_label_exists</strong>: Each form control must have an associated label + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_exists.html#%7B%22message%22%3A%22Form%20control%20element%20%3C%7B0%7D%3E%20has%20no%20associated%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Form control element &lt;{0}&gt; has no associated label</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/input_label_exists.html#%7B%22message%22%3A%22Form%20control%20with%20%5C%22%7B0%7D%5C%22%20role%20has%20no%20associated%20label%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">Form control with "{0}" role has no associated label</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_descendant_valid</strong>: Browsers ignore the explicit and implicit ARIA roles of the descendants of certain elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_descendant_valid.html#%7B%22message%22%3A%22The%20element%20with%20role%20%5C%22%7B0%7D%5C%22%20contains%20descendants%20with%20implicit%20roles%20%5C%22%7B1%7D%5C%22%20which%20are%20ignored%20by%20browsers%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22potential_child_implicit_role%22%7D">The element with role "{0}" contains descendants with implicit roles "{1}" which are ignored by browsers</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_descendant_valid.html#%7B%22message%22%3A%22The%20element%20with%20role%20%5C%22%7B0%7D%5C%22%20contains%20descendants%20with%20roles%20%5C%22%7B1%7D%5C%22%20which%20are%20ignored%20by%20browsers%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_child_explicit_role%22%7D">The element with role "{0}" contains descendants with roles "{1}" which are ignored by browsers</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_role_allowed</strong>: Elements must have a valid 'role' per ARIA specification + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_role_allowed.html#%7B%22message%22%3A%22The%20role%20'%7B0%7D'%20defined%20on%20the%20element%20is%20not%20valid%20per%20ARIA%20specification%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_2%22%7D">The role '{0}' defined on the element is not valid per ARIA specification</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.nrst0{fill:none;} +.nrst1{fill:#F1C21B;} +</style> +<rect class="nrst0" width="16" height="16"/> +<path class="nrst1" d="M14.9,13.3l-6.5-12C8.3,1,8,0.9,7.8,1.1c-0.1,0-0.2,0.1-0.2,0.2l-6.5,12c-0.1,0.1-0.1,0.3,0,0.5 +C1.2,13.9,1.3,14,1.5,14h13c0.2,0,0.3-0.1,0.4-0.2C15,13.6,15,13.4,14.9,13.3z M7.4,4h1.1v5H7.4V4z M8,11.8c-0.4,0-0.8-0.4-0.8-0.8 +s0.4-0.8,0.8-0.8c0.4,0,0.8,0.4,0.8,0.8S8.4,11.8,8,11.8z"/> +<g><g><g> +<rect x="7.45" y="4" width="1.1" height="5"/> +</g></g><g><g> +<circle cx="8" cy="11" r="0.8"/> +</g></g></g> +</svg>&nbsp;Needs review</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_role_allowed.html#%7B%22message%22%3A%22Some%20of%20the%20roles%2C%20'%7B0%7D'%2C%20defined%20on%20the%20element%20are%20not%20valid%20per%20ARIA%20specification%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22POTENTIAL%22%5D%2C%22reasonId%22%3A%22Potential_1%22%7D">Some of the roles, '{0}', defined on the element are not valid per ARIA specification</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>a_text_purpose</strong>: Hyperlinks must have an accessible name for their purpose + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/a_text_purpose.html#%7B%22message%22%3A%22Hyperlink%20has%20no%20link%20text%2C%20label%20or%20image%20with%20a%20text%20alternative%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_acc_name%22%7D">Hyperlink has no link text, label or image with a text alternative</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_allowed</strong>: ARIA attributes must be valid for the element's role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_allowed.html#%7B%22message%22%3A%22The%20attribute(s)%20'%7B0%7D'%20referenced%20by%20the%20element%20%3C%7B1%7D%3E%20is%20not%20a%20valid%20ARIA%20state%20or%20property%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The attribute(s) '{0}' referenced by the element &lt;{1}&gt; is not a valid ARIA state or property</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_conflict</strong>: An ARIA attribute must not conflict with the corresponding HTML attribute + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_conflict.html#%7B%22message%22%3A%22The%20ARIA%20attribute%20%5C%22%7B0%7D%5C%22%20is%20in%20conflict%20with%20the%20corresponding%20HTML%20attribute%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_conflict%22%7D">The ARIA attribute "{0}" is in conflict with the corresponding HTML attribute "{1}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_exists</strong>: When specifying a required ARIA attribute, the value must not be empty + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_exists.html#%7B%22message%22%3A%22The%20element%20attribute(s)%3A%20'%7B0%7D'%20value%20is%20empty%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_empty_attribute%22%7D">The element attribute(s): '{0}' value is empty</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_required</strong>: The required attributes for the element with a role must be defined + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_required.html#%7B%22message%22%3A%22Element%20with%20'%7B0%7D'%20role%20does%20not%20have%20the%20required%20ARIA%20attribute(s)%3A%20'%7B1%7D'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_missing%22%7D">Element with '{0}' role does not have the required ARIA attribute(s): '{1}'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_value_valid</strong>: ARIA property values must be valid + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_value_valid.html#%7B%22message%22%3A%22The%20value%20%5C%22%7B0%7D%5C%22%20specified%20for%20attribute%20'%7B1%7D'%20on%20element%20%3C%7B2%7D%3E%20is%20not%20valid%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The value "{0}" specified for attribute '{1}' on element &lt;{2}&gt; is not valid</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_eventhandler_role_valid</strong>: Elements with event handlers must have a valid ARIA role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_eventhandler_role_valid.html#%7B%22message%22%3A%22The%20%3C%7B0%7D%3E%20element%20with%20'%7B1%7D'%20does%20not%20have%20a%20valid%20ARIA%20role%20specified%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;{0}&gt; element with '{1}' does not have a valid ARIA role specified</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_hidden_nontabbable</strong>: A hidden element should not contain any tabbable elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_hidden_nontabbable.html#%7B%22message%22%3A%22Element%20%5C%22%7B0%7D%5C%22%20should%20not%20be%20focusable%20within%20the%20subtree%20of%20an%20element%20with%20an%20'aria-hidden'%20attribute%20with%20value%20'true'%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Element "{0}" should not be focusable within the subtree of an element with an 'aria-hidden' attribute with value 'true'</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_id_unique</strong>: The ARIA property must reference a non-empty unique id of an existing element that is visible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_id_unique.html#%7B%22message%22%3A%22The%20'id'%20%5C%22%7B0%7D%5C%22%20specified%20for%20the%20ARIA%20property%20'%7B1%7D'%20value%20is%20not%20valid%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The 'id' "{0}" specified for the ARIA property '{1}' value is not valid</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_widget_labelled</strong>: Interactive component must have a programmatically associated name + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_widget_labelled.html#%7B%22message%22%3A%22Interactive%20component%20with%20ARIA%20role%20'%7B0%7D'%20does%20not%20have%20a%20programmatically%20associated%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Interactive component with ARIA role '{0}' does not have a programmatically associated name</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>combobox_design_valid</strong>: The combobox design pattern must be valid for ARIA 1.2 + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/combobox_design_valid.html#%7B%22message%22%3A%22The%20combobox%20design%20pattern%20is%20detected%20as%20ARIA%201.1%2C%20which%20is%20not%20allowed%20by%20ARIA%201.2%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1.1%22%7D">The combobox design pattern is detected as ARIA 1.1, which is not allowed by ARIA 1.2</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>frame_title_exists</strong>: Inline frames must have a unique, non-empty 'title' attribute + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/frame_title_exists.html#%7B%22message%22%3A%22Inline%20frame%20does%20not%20have%20a%20'title'%20attribute%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">Inline frame does not have a 'title' attribute</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>label_content_exists</strong>: A &lt;label&gt; element must have non-empty descriptive text that identifies the purpose of the interactive component + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/label_content_exists.html#%7B%22message%22%3A%22The%20%3Clabel%3E%20element%20does%20not%20have%20descriptive%20text%20that%20identifies%20the%20expected%20input%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">The &lt;label&gt; element does not have descriptive text that identifies the expected input</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>list_children_valid</strong>: List component with "group" role must limit children to &lt;listitem&gt; elements + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/list_children_valid.html#%7B%22message%22%3A%22List%20component%20with%20%5C%22group%5C%22%20role%20has%20children%20that%20are%20not%20%3Clistitem%3E%20elements%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22Fail_1%22%7D">List component with "group" role has children that are not &lt;listitem&gt; elements</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>table_aria_descendants</strong>: Table structure elements cannot specify an explicit 'role' within table containers + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.vst0{fill:none;} +.vst1{fill:#A2191F;} +.vst2{fill:#FFFFFF;fill-opacity:0;} +</style> +<rect class="vst0" width="16" height="16"/> +<path class="vst1" d="M8,1C4.1,1,1,4.1,1,8s3.1,7,7,7s7-3.1,7-7S11.9,1,8,1z M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +<path class="vst2" d="M10.7,11.5L4.5,5.3l0.8-0.8l6.2,6.2L10.7,11.5z"/> +</svg>&nbsp;Violation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/table_aria_descendants.html#%7B%22message%22%3A%22An%20explicit%20ARIA%20'role'%20is%20not%20valid%20for%20%3C%7B0%7D%3E%20element%20within%20an%20ARIA%20role%20'%7B1%7D'%20per%20the%20ARIA%20in%20HTML%20specification%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22VIOLATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22explicit_role%22%7D">An explicit ARIA 'role' is not valid for &lt;{0}&gt; element within an ARIA role '{1}' per the ARIA in HTML specification</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>element_tabbable_role_valid</strong>: A tabbable element must have a valid widget role + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_tabbable_role_valid.html#%7B%22message%22%3A%22The%20tabbable%20element's%20role%20'%7B0%7D'%20is%20not%20a%20widget%20role%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_invalid_role%22%7D">The tabbable element's role '{0}' is not a widget role</a></bx-list-item><bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/element_tabbable_role_valid.html#%7B%22message%22%3A%22The%20tabbable%20element%20does%20not%20have%20a%20valid%20widget%20role%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_valid_role%22%7D">The tabbable element does not have a valid widget role</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_accessiblename_exists</strong>: Elements with certain roles should have accessible names + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_accessiblename_exists.html#%7B%22message%22%3A%22Element%20%3C%7B0%7D%3E%20with%20%5C%22%7B1%7D%5C%22%20role%20has%20no%20accessible%20name%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_no_accessible_name%22%7D">Element &lt;{0}&gt; with "{1}" role has no accessible name</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>aria_attribute_redundant</strong>: An ARIA attribute should not be redundant with a corresponding HTML attribute + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/aria_attribute_redundant.html#%7B%22message%22%3A%22The%20ARIA%20attribute%20%5C%22%7B0%7D%5C%22%20is%20redundant%20with%20the%20HTML%20attribute%20%5C%22%7B1%7D%5C%22%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22FAIL%22%5D%2C%22reasonId%22%3A%22fail_redundant%22%7D">The ARIA attribute "{0}" is redundant with the HTML attribute "{1}"</a></bx-list-item> + </bx-unordered-list> + </bx-list-item><bx-list-item><strong>canvas_content_described</strong>: The &lt;canvas&gt; element may not be accessible + <bx-unordered-list nested> + <bx-list-item><span class="issueLevel"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" +width="16px" height="16px" viewBox="0 0 16 16" style="enable-background:new 0 0 16 16;" xml:space="preserve" aria-hidden="true"> +<style type="text/css"> +.st0{fill:none;} +.st1{fill:#0043CE;} +.st2{fill:#FFFFFF;} +.st3{font-family:'IBMPlexSerif';} +.st4{font-size:12.9996px;} +</style> +<rect class="st0" width="16" height="16"/> +<path class="st1" d="M14,15H2c-0.6,0-1-0.4-1-1V2c0-0.6,0.4-1,1-1h12c0.6,0,1,0.4,1,1v12C15,14.6,14.6,15,14,15z"/> +<text transform="matrix(1 0 0 1 5.9528 12.5044)" class="st2 st3 st4">i</text> +</svg>&nbsp;Recommendation</span> &mdash; + <a target="_blank" rel="noopener noreferrer" href="./en-US/canvas_content_described.html#%7B%22message%22%3A%22Verify%20accessibility%20of%20the%20%3Ccanvas%3E%20element%22%2C%22msgArgs%22%3A%5B%22%7B0%7D%22%2C%22%7B1%7D%22%2C%22%7B3%7D%22%2C%22%7B4%7D%22%5D%2C%22value%22%3A%5B%22RECOMMENDATION%22%2C%22MANUAL%22%5D%2C%22reasonId%22%3A%22Manual_1%22%7D">Verify accessibility of the &lt;canvas&gt; element</a></bx-list-item> + </bx-unordered-list> + </bx-list-item></bx-unordered-list> +</div> + </div> + </main> + </body> +</html> \ No newline at end of file diff --git a/rule-server/src/static/archives/2026.07.13/js/ace-debug.js b/rule-server/src/static/archives/2026.07.13/js/ace-debug.js new file mode 100644 index 000000000..43033b205 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/js/ace-debug.js @@ -0,0 +1,37895 @@ +/*! + * Copyright:: 2016,2017,2019,2020- IBM, Inc + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var ace; +/******/ (() => { // webpackBootstrap +/******/ "use strict"; +/******/ var __webpack_modules__ = ({ + +/***/ "./src/v2/aria/ARIADefinitions.ts" +/*!****************************************!*\ + !*** ./src/v2/aria/ARIADefinitions.ts ***! + \****************************************/ +(__unused_webpack_module, exports) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ARIADefinitions = void 0; +var ARIADefinitions = /** @class */ (function () { + function ARIADefinitions() { + } + ARIADefinitions.nameFromContent = function (role) { + return (role in ARIADefinitions.designPatterns) + && ARIADefinitions.designPatterns[role].nameFrom + && ARIADefinitions.designPatterns[role].nameFrom.includes("contents"); + }; + /* + * array of WAI-ARIA global states and properties + * @see https://www.w3.org/TR/wai-aria-1.2/#global_states + */ + ARIADefinitions.globalProperties = ["aria-atomic", "aria-busy", "aria-controls", "aria-current", "aria-describedby", + "aria-details", "aria-flowto", "aria-hidden", "aria-keyshortcuts", + "aria-label", "aria-labelledby", "aria-live", "aria-owns", "aria-relevant", "aria-roledescription" + // the following are deprecated in ARIA 1.2, will indicate deprecation in individual role + , + 'aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid' + ]; + //properties contains id(s) that refer to other element(s) + ARIADefinitions.referenceProperties = ["aria-owns", "aria-controls", "aria-describedby", "aria-labelledby", "aria-flowto", "aria-activedescendant"]; + // deprecated roles + ARIADefinitions.globalDeprecatedRoles = [ + 'directory', 'doc-biblioentry', 'doc-endnote' + ]; + // the following are deprecated in ARIA 1.1 for all the roles + ARIADefinitions.globalDeprecatedProperties = [ + 'aria-grabbed', 'aria-dropeffect' + ]; + /* + * XSD data types for all WAI-ARIA properties + * along with valid values when the data type is NMTOKEN + * WAI-ARIA properties data types explaned: + * type: Used to identify the type of values allowed for the WAI-ARIA property + * values: Used to identify specific values of an WAI-ARIA property when type is nmtoken + * hiddenIDRefSupported: Used to identify if the WAI-ARIA property supports referencing hidden ID + * true: refers to WAI-ARIA property supports hidden ID references + * false: refers to WAI-ARIA property does not support hidden ID references + * Default value will be set to false, if not specified. + */ + ARIADefinitions.propertyDataTypes = { + "aria-activedescendant": { + type: "http://www.w3.org/2001/XMLSchema#idref", + hiddenIDRefSupported: true + }, + "aria-atomic": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-autocomplete": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["inline", "list", "both", "none", "undefined"] //add undefined to handle value empty + }, + "aria-busy": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-checked": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "mixed", "undefined"] + }, + "aria-colcount": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-colindex": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-colspan": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-controls": { + type: "http://www.w3.org/2001/XMLSchema#idrefs", + hiddenIDRefSupported: true + }, + "aria-current": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["page", "step", "location", "date", "time", "true", "false", "undefined"] //add undefined for empty value + }, + "aria-describedby": { + type: "http://www.w3.org/2001/XMLSchema#idrefs", + hiddenIDRefSupported: true + }, + "aria-details": { + type: "http://www.w3.org/2001/XMLSchema#idrefs" + }, + "aria-disabled": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-dropeffect": { + type: "http://www.w3.org/2001/XMLSchema#nmtokens", + values: ["copy", "move", "link", "execute", "popup", "none"] + }, + "aria-errormessage": { + type: "http://www.w3.org/2001/XMLSchema#idref", + hiddenIDRefSupported: true + }, + "aria-expanded": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "undefined"] + }, + "aria-flowto": { + type: "http://www.w3.org/2001/XMLSchema#idrefs", + hiddenIDRefSupported: false + }, + "aria-grabbed": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "undefined"] + }, + "aria-haspopup": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "menu", "listbox", "tree", "grid", "dialog"] + }, + "aria-hidden": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "undefined"] + }, + "aria-invalid": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "spelling", "grammar", "undefined"] //add undefined for empty value + }, + "aria-keyshortcuts": { + type: "http://www.w3.org/2001/XMLSchema#string" + }, + "aria-label": { + type: "http://www.w3.org/2001/XMLSchema#string" + }, + "aria-labelledby": { + type: "http://www.w3.org/2001/XMLSchema#idrefs", + hiddenIDRefSupported: true + }, + "aria-level": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-live": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["off", "polite", "assertive"] + }, + "aria-modal": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-multiline": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-multiselectable": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-orientation": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["horizontal", "vertical", "undefined"] + }, + "aria-owns": { + type: "http://www.w3.org/2001/XMLSchema#idrefs", + hiddenIDRefSupported: true + }, + "aria-placeholder": { + type: "http://www.w3.org/2001/XMLSchema#string" + }, + "aria-posinset": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-pressed": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "mixed", "undefined"] + }, + "aria-readonly": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-relevant": { + type: "http://www.w3.org/2001/XMLSchema#nmtokens", + values: ["additions", "removals", "text", "all"] + }, + "aria-required": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-roledescription": { + type: "http://www.w3.org/2001/XMLSchema#string" + }, + "aria-rowcount": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-rowindex": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-rowspan": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-selected": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "undefined"] + }, + "aria-setsize": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-sort": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["ascending", "descending", "other", "none"] + }, + "aria-valuemax": { + type: "http://www.w3.org/2001/XMLSchema#decimal" + }, + "aria-valuemin": { + type: "http://www.w3.org/2001/XMLSchema#decimal" + }, + "aria-valuenow": { + type: "http://www.w3.org/2001/XMLSchema#decimal" + }, + "aria-valuetext": { + type: "http://www.w3.org/2001/XMLSchema#string" + } + }; + /* + * design patterns for concrete WAI-ARIA roles + * legitimate keys for each role include: + * + * - container: appropriate container(s) for that role + * - props: states and properties that may be associated with this role (in addition to the global states and properties listed above) + * - reqProps: required states or properties for this role + * - reqChildren: required children for this role + * - htmlEquiv: HTML equivalent for this role + * - roleType: one of widget, structure, landmark, liveRegion, window (as seen in https://www.w3.org/TR/wai-aria-1.2/#roles_categorization) + * - nameRequired: determines whether an accessible name is required for a widget (see ARIA spec.) + * - nameFrom: determines how an accessible name is supplied (author or content - see ARIA spec.) + * - deprecated: if present, indicates that the role is deprecated, and provides a list of alternative role(s) + */ + ARIADefinitions.designPatterns = { + "alert": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "liveRegion", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "alertdialog": { + container: null, + props: ["aria-modal"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "window", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "application": { + container: null, + props: ["aria-activedescendant", "aria-expanded"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: true, + nameFrom: ["author"] + }, + "article": { + container: null, + props: ["aria-posinset", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "banner": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "blockquote": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "button": { + container: null, + props: ["aria-expanded", "aria-pressed"], + reqProps: null, + reqChildren: null, + htmlEquiv: "button | input[@type='button']", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + "caption": { + container: ["figure", "grid", "table", "treegrid"], + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "cell": { + container: ["row"], + props: ["aria-colindex", "aria-colspan", "aria-rowindex", "aria-rowspan"], + reqProps: null, + reqChildren: null, + htmlEquiv: "td", + roleType: "structure", + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "checkbox": { + container: null, + props: ["aria-expanded", "aria-readonly", "aria-required"], + reqProps: ["aria-checked"], + reqChildren: null, + htmlEquiv: "input[@type='checkbox']", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-haspopup'] + }, + "code": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "columnheader": { + container: ["row"], + props: ["aria-colindex", "aria-colspan", "aria-expanded", "aria-readonly", "aria-required", "aria-rowindex", "aria-rowspan", "aria-selected", "aria-sort"], + reqProps: null, + reqChildren: null, + htmlEquiv: "th[@scope='col']", + roleType: "structure", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + "combobox": { + container: null, + props: ["aria-controls", "aria-activedescendant", "aria-autocomplete", "aria-readonly", "aria-required"], + reqProps: ["aria-expanded"], + reqChildren: [], + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"] + }, + "complementary": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "comment": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "contentinfo": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "definition": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "deletion": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "dialog": { + container: null, + props: ["aria-modal"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "window", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "directory": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecated: true, + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "doc-abstract": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-acknowledgments": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-afterword": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-appendix": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-backlink": { + container: null, + props: ["aria-disabled", "aria-expanded", "aria-haspopup"], + reqProps: null, + reqChildren: null, + htmlEquiv: "a | link", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + "doc-biblioentry": { + container: ["list"], + props: ["aria-level", "aria-posinset", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: "li", + roleType: "structure", + nameRequired: true, + nameFrom: ["author"] + }, + "doc-bibliography": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-biblioref": { + container: null, + props: ["aria-disabled", "aria-expanded", "aria-haspopup"], + reqProps: null, + reqChildren: null, + htmlEquiv: "a | link", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + "doc-chapter": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-colophon": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: true, + nameFrom: ["author"] + }, + "doc-conclusion": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-cover": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "img", + roleType: "structure", + nameRequired: false, + nameFrom: ["author"], + presentationalChildren: true + }, + "doc-credit": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-credits": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-dedication": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-endnote": { + container: ["list"], + props: ["aria-level", "aria-posinset", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: "li", + roleType: "structure", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-endnotes": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: true, + nameFrom: ["author"] + }, + "doc-epigraph": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-epilogue": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-errata": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-example": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-footnote": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-foreword": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-glossary": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-glossref": { + container: null, + props: ["aria-disabled", "aria-expanded", "aria-haspopup"], + reqProps: null, + reqChildren: null, + htmlEquiv: "a | link", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + "doc-index": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-introduction": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-noteref": { + container: null, + props: ["aria-disabled", "aria-expanded", "aria-haspopup"], + reqProps: null, + reqChildren: null, + htmlEquiv: "a | link", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + "doc-notice": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-pagebreak": { + container: null, + props: ["aria-orientation"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true + }, + "doc-pagelist": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-pagefooter": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + }, + "doc-pageheader": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + }, + "doc-part": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-preface": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-prologue": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-pullquote": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-qna": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-subtitle": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author", "contents"] + }, + "doc-tip": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-toc": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "document": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "emphasis": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "feed": { + container: null, + props: null, + reqProps: null, + reqChildren: ["article"], + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "figure": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "form": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "form", + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "generic": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "div | span", + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby", "aria-roledescription"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "graphics-document": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + nameRequired: true, + nameFrom: ["author"] + }, + "graphics-object": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + nameRequired: false, + nameFrom: ["author"] + }, + "graphics-symbol": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + nameRequired: true, + nameFrom: ["author"], + presentationalChildren: true + }, + "grid": { + container: null, + props: ["aria-activedescendant", "aria-colcount", "aria-multiselectable", "aria-readonly", "aria-rowcount"], + reqProps: null, + reqChildren: ["row", "rowgroup"], + htmlEquiv: "table", + roleType: "widget", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "gridcell": { + container: ["row"], + props: ["aria-colindex", "aria-colspan", "aria-disabled", "aria-errormessage", "aria-expanded", "aria-haspopup", "aria-invalid", "aria-readonly", "aria-required", "aria-rowindex", "aria-rowspan", "aria-selected"], + reqProps: null, + reqChildren: null, + htmlEquiv: "td", + roleType: "widget", + nameFrom: ["author", "contents"] + }, + "group": { + container: null, + props: ["aria-activedescendant"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "heading": { + container: null, + props: null, + reqProps: ["aria-level"], + reqChildren: null, + htmlEquiv: "h1 | h2 | h3 | h4 | h5 | h6", + roleType: "structure", + nameRequired: true, + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "img": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "img", + roleType: "structure", + nameRequired: true, + nameFrom: ["author"], + presentationalChildren: true, + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "image": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "img", + roleType: "structure", + nameRequired: true, + nameFrom: ["author"], + presentationalChildren: true, + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "insertion": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "link": { + container: null, + props: ["aria-expanded"], + reqProps: null, + reqChildren: null, + htmlEquiv: "a | link", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + "list": { + container: null, + props: null, + reqProps: null, + reqChildren: ["listitem"], + htmlEquiv: "ol | ul", + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "listbox": { + container: null, + props: ["aria-activedescendant", "aria-expanded", "aria-multiselectable", "aria-orientation", "aria-readonly", "aria-required"], + reqProps: null, + reqChildren: ["group", "option"], + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-haspopup'] + }, + "listitem": { + container: ["list"], + props: ["aria-level", "aria-posinset", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: "li", + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "log": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "liveRegion", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "main": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "mark": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "mark", + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "marquee": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "liveRegion", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "math": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + presentationalChildren: false, + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "menu": { + container: null, + props: ["aria-activedescendant", "aria-orientation"], + reqProps: null, + reqChildren: ["group", "menuitem", "menuitemcheckbox", "menuitemradio"], + htmlEquiv: null, + roleType: "widget", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "menubar": { + container: null, + props: ["aria-activedescendant", "aria-orientation"], + reqProps: null, + reqChildren: ["group", "menuitem", "menuitemcheckbox", "menuitemradio"], + htmlEquiv: null, + roleType: "widget", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "menuitem": { + container: ["group", "menu", "menubar"], + props: ["aria-expanded", "aria-posinset", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + "menuitemcheckbox": { + container: ["group", "menu", "menubar"], + props: ["aria-expanded", "aria-posinset", "aria-setsize"], + reqProps: ["aria-checked"], + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + "menuitemradio": { + container: ["group", "menu", "menubar"], + props: ["aria-expanded", "aria-posinset", "aria-setsize"], + reqProps: ["aria-checked"], + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + "meter": { + container: null, + props: ["aria-valuemax", "aria-valuemin", "aria-valuetext"], + reqProps: ["aria-valuenow"], + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: true, + nameFrom: ["author"], + presentationalChildren: true, + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "navigation": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "none": { + container: null, + props: [], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "note": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "option": { + container: ["group", "listbox"], + props: ["aria-selected", "aria-checked", "aria-posinset", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: "option", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "paragraph": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "presentation": { + container: null, + props: [], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "progressbar": { + container: null, + props: ["aria-valuemax", "aria-valuemin", "aria-valuenow", "aria-valuetext"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + presentationalChildren: true, + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "radio": { + container: null, + props: ["aria-posinset", "aria-setsize"], + reqProps: ["aria-checked"], + reqChildren: null, + htmlEquiv: "input[@type='radio']", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "radiogroup": { + container: null, + props: ["aria-activedescendant", "aria-orientation", "aria-readonly", "aria-required"], + reqProps: null, + reqChildren: ["radio"], + htmlEquiv: null, + roleType: "widget", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-haspopup'] + }, + "region": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "row": { + container: ["grid", "rowgroup", "table", "treegrid"], + props: ["aria-activedescendant", "aria-colindex", "aria-expanded", "aria-level", "aria-posinset", "aria-rowindex", "aria-selected", "aria-setsize"], + reqProps: null, + reqChildren: ["cell", "columnheader", "gridcell", "rowheader"], + htmlEquiv: "tr", + roleType: "structure", + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "rowgroup": { + container: ["grid", "table", "treegrid"], + props: [], + reqProps: null, + reqChildren: ["row"], + htmlEquiv: "tbody | tfoot | thead", + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "rowheader": { + container: ["row"], + props: ["aria-colindex", "aria-colspan", "aria-expanded", "aria-readonly", "aria-required", "aria-rowindex", "aria-rowspan", "aria-selected", "aria-sort"], + reqProps: null, + reqChildren: null, + htmlEquiv: "th[@scope='row']", + roleType: "structure", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + "scrollbar": { + container: null, + props: ["aria-orientation", "aria-valuemax", "aria-valuemin", "aria-valuetext"], + reqProps: ["aria-controls", "aria-valuenow"], + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: false, + nameFrom: ["author"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "search": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "searchbox": { + container: null, + props: ["aria-activedescendant", "aria-autocomplete", "aria-multiline", "aria-placeholder", "aria-readonly", "aria-required"], + reqProps: null, + reqChildren: null, + htmlEquiv: "input[@type='search']", + roleType: "widget", + nameRequired: true, + nameFrom: ["author"] + }, + "separator": { + container: null, + props: ["aria-orientation"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "slider": { + container: null, + props: ["aria-orientation", "aria-readonly", "aria-valuemax", "aria-valuemin", "aria-valuetext"], + reqProps: ["aria-valuenow"], + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + presentationalChildren: true + }, + "spinbutton": { + container: null, + props: ["aria-activedescendant", "aria-readonly", "aria-required", "aria-valuemax", "aria-valuemin", "aria-valuenow", "aria-valuetext"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-haspopup'] + }, + "status": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "liveRegion", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "strong": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "subscript": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "suggestion": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "superscript": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "switch": { + container: null, + props: ["aria-expanded", "aria-readonly", "aria-required"], + reqProps: ["aria-checked"], + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-haspopup'] + }, + "tab": { + container: ["tablist"], + props: ["aria-expanded", "aria-posinset", "aria-selected", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + "table": { + container: null, + props: ["aria-colcount", "aria-rowcount"], + reqProps: null, + reqChildren: ["row", "rowgroup", "caption"], + htmlEquiv: "table", + roleType: "structure", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "tablist": { + container: null, + props: ["aria-activedescendant", "aria-multiselectable", "aria-orientation"], + reqProps: null, + reqChildren: ["tab"], + htmlEquiv: null, + roleType: "widget", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "tabpanel": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "term": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "dfn", + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "textbox": { + container: null, + props: ["aria-activedescendant", "aria-autocomplete", "aria-multiline", "aria-placeholder", "aria-readonly", "aria-required"], + reqProps: null, + reqChildren: null, + htmlEquiv: "input[@type='text']", + roleType: "widget", + nameRequired: true, + nameFrom: ["author"] + }, + "time": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "timer": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "liveRegion", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "toolbar": { + container: null, + props: ["aria-activedescendant", "aria-orientation"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "tooltip": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "tree": { + container: null, + props: ["aria-activedescendant", "aria-multiselectable", "aria-orientation", "aria-required"], + reqProps: null, + reqChildren: ["group", "treeitem"], + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-haspopup'] + }, + "treegrid": { + container: null, + props: ["aria-activedescendant", "aria-colcount", "aria-multiselectable", "aria-orientation", "aria-readonly", "aria-required", "aria-rowcount"], + reqProps: null, + reqChildren: ["row", "rowgroup"], + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-haspopup'] + }, + "treeitem": { + container: ["group", "tree"], + props: ["aria-checked", "aria-expanded", "aria-level", "aria-posinset", "aria-selected", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + }; // end designPatterns + // copied from https://html.spec.whatwg.org/multipage/semantics-other.html#disabled-elements + // https://html.spec.whatwg.org/multipage/input.html#input-type-attr-summary + // https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/disabled + /** note: + * if a <fieldset> is disabled, the descendant form controls are all disabled except <legend> + * If an <optgroup> is disabled, the select is still interactive (unless otherwise disabled), but none of the items in the option group are selectable. + * When an element has the disabled attribute applied, the :disabled pseudo-class also applies to it. + */ + ARIADefinitions.elementsAllowedDisabled = ["button", "input", "select", "textarea", "optgroup", "option", "fieldset"]; // also form-associated custom element + ARIADefinitions.elementsAllowedRequired = ["select", "textarea"]; // remove 'input' and add to the individual element, becuase required is not supported on input@type="range", "color", "hidden" or any button types + ARIADefinitions.elementsAllowedReadOnly = ["textarea"]; // remove 'input' and add to the individual element, because readonly is not supported on input@type="checkbox", "radio", "range", "color", "file", hidden" or any button types + /* https://www.w3.org/TR/html-aria/#docconformance + * documentConformanceRequirement contains properties of the tags related to role without any additional attribute value + * documentConformanceRequirementSpecialTags contains those tags that require special considerations + */ + ARIADefinitions.documentConformanceRequirement = { + "abbr": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "address": { + implicitRole: ["group"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "article": { + implicitRole: ["article"], + validRoles: ["application", "document", "feed", "main", "none", "presentation", "region"], + globalAriaAttributesValid: true + }, + "aside": { + implicitRole: ["complementary"], + validRoles: ["doc-dedication", "doc-example", "doc-footnote", "doc-glossary", "doc-pullquote", "doc-tip", "feed", "none", "note", "presentation", "region", "search"], + globalAriaAttributesValid: true + }, + "audio": { + implicitRole: null, + validRoles: ["application"], + globalAriaAttributesValid: true + }, + "b": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "base": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "bdi": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "bdo": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "blockquote": { + implicitRole: ["blockquote"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "body": { + implicitRole: ["generic"], + validRoles: null, + otherDisallowedAriaAttributes: ['aria-hidden'], + globalAriaAttributesValid: true + }, + "br": { + implicitRole: null, + validRoles: ["none", "presentation"], + globalAriaAttributesValid: false, + otherAllowedAriaAttributes: ["aria-hidden"] + }, + "button": { + implicitRole: ["button"], + validRoles: ["checkbox", "combobox", "gridcell", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "separator", "slider", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true + }, + "canvas": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "caption": { + implicitRole: ['caption'], + validRoles: null, + globalAriaAttributesValid: true, + allowAttributesFromImplicitRole: false + }, + "cite": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "code": { + implicitRole: ["code"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "col": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "colgroup": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "data": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "datalist": { + implicitRole: ["listbox"], + validRoles: null, + globalAriaAttributesValid: false, + allowAttributesFromImplicitRole: false + }, + "dd": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true + }, + "del": { + implicitRole: ["deletion"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "details": { + implicitRole: ["group"], + validRoles: null, + globalAriaAttributesValid: true + }, + "dfn": { + implicitRole: ["term"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "dialog": { + implicitRole: ["dialog"], + validRoles: ["alertdialog"], + globalAriaAttributesValid: true + }, + "dl": { + implicitRole: null, + validRoles: ["group", "list", "none", "presentation"], + globalAriaAttributesValid: true + }, + "dt": { + implicitRole: ["term"], + validRoles: ["listitem"], + globalAriaAttributesValid: true + }, + "em": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "embed": { + implicitRole: null, + validRoles: ["application", "document", "img", "none", "presentation"], + globalAriaAttributesValid: true + }, + "fieldset": { + implicitRole: ["group"], + validRoles: ["none", "presentation", "radiogroup"], + globalAriaAttributesValid: true + }, + "figcaption": { + implicitRole: null, + validRoles: ["group", "none", "presentation"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "form": { + implicitRole: ["form"], + validRoles: ["none", "presentation", "search"], + globalAriaAttributesValid: true + }, + "head": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "hgroup": { + implicitRole: ["group"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "h1": { + implicitRole: ["heading"], + validRoles: ["doc-subtitle", "none", "presentation", "tab"], + globalAriaAttributesValid: true + }, + "h2": { + implicitRole: ["heading"], + validRoles: ["doc-subtitle", "none", "presentation", "tab"], + globalAriaAttributesValid: true + }, + "h3": { + implicitRole: ["heading"], + validRoles: ["doc-subtitle", "none", "presentation", "tab"], + globalAriaAttributesValid: true + }, + "h4": { + implicitRole: ["heading"], + validRoles: ["doc-subtitle", "none", "presentation", "tab"], + globalAriaAttributesValid: true + }, + "h5": { + implicitRole: ["heading"], + validRoles: ["doc-subtitle", "none", "presentation", "tab"], + globalAriaAttributesValid: true + }, + "h6": { + implicitRole: ["heading"], + validRoles: ["doc-subtitle", "none", "presentation", "tab"], + globalAriaAttributesValid: true + }, + "hr": { + implicitRole: ["separator"], + validRoles: ["doc-pagebreak", "none", "presentation"], + globalAriaAttributesValid: true + }, + "html": { + implicitRole: ["document"], + validRoles: null, + globalAriaAttributesValid: false, + allowAttributesFromImplicitRole: false + }, + "i": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "iframe": { + implicitRole: null, + validRoles: ["application", "document", "img", "none", "presentation"], + globalAriaAttributesValid: true + }, + "ins": { + implicitRole: ["insertion"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "kbd": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "label": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "legend": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "link": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "main": { + implicitRole: ["main"], + validRoles: null, + globalAriaAttributesValid: true + }, + "map": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "mark": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "math": { + implicitRole: ["math"], + validRoles: null, + globalAriaAttributesValid: true + }, + "menu": { + implicitRole: ["list"], + validRoles: ["group", "listbox", "menu", "menubar", "none", "presentation", "radiogroup", "tablist", "toolbar", "tree"], + globalAriaAttributesValid: true + }, + "meta": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "meter": { + implicitRole: ["meter"], + validRoles: null, + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ['aria-valuemax', 'aria-valuemin'], + allowAttributesFromImplicitRole: false + }, + "nav": { + implicitRole: ["navigation"], + validRoles: ["doc-index", "doc-pagelist", "doc-toc", "menu", "menubar", "tablist", "none", "presentation"], + globalAriaAttributesValid: true + }, + "noscript": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "object": { + implicitRole: null, + validRoles: ["application", "document", "img"], + globalAriaAttributesValid: true + }, + "ol": { + implicitRole: ["list"], + validRoles: ["group", "listbox", "menu", "menubar", "none", "presentation", "radiogroup", "tablist", "toolbar", "tree"], + globalAriaAttributesValid: true + }, + "optgroup": { + implicitRole: ["group"], + validRoles: null, + globalAriaAttributesValid: true + }, + "option": { + implicitRole: ["option"], + validRoles: null, + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-selected"] + }, + "output": { + implicitRole: ["status"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "p": { + implicitRole: ["paragraph"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "param": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "picture": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false, + otherAllowedAriaAttributes: ["aria-hidden"] + }, + "pre": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "progress": { + implicitRole: ["progressbar"], + validRoles: null, + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-valuemax"] + }, + "q": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "rp": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "rt": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "ruby": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "s": { + implicitRole: ["deletion"], + validRoles: ["any"], + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-label", "aria-labelledby"] + }, + "samp": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "script": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "search": { + implicitRole: ['search'], + validRoles: ['search', 'form', 'group', 'none', 'presentation', 'region'], + globalAriaAttributesValid: true + }, + "slot": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "small": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "source": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "span": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "strong": { + implicitRole: ["strong"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "style": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "sub": { + implicitRole: ["subscript"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "sup": { + implicitRole: ["superscript"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "svg": { + implicitRole: ["graphics-document"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "table": { + implicitRole: ["table"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "template": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "textarea": { + implicitRole: ["textbox"], + validRoles: null, + globalAriaAttributesValid: true + }, + "tfoot": { + implicitRole: ["rowgroup"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "thead": { + implicitRole: ["rowgroup"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "time": { + implicitRole: ["time"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "title": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "track": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "u": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "ul": { + implicitRole: ["list"], + validRoles: ["group", "listbox", "menu", "menubar", "none", "presentation", "radiogroup", "tablist", "toolbar", "tree"], + globalAriaAttributesValid: true + }, + "var": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "video": { + implicitRole: null, + validRoles: ["application"], + globalAriaAttributesValid: true + }, + "wbr": { + implicitRole: null, + validRoles: ["none", "presentation"], + globalAriaAttributesValid: false, + otherAllowedAriaAttributes: ["aria-hidden"] + } + }; // end documentConformanceRequirement + ARIADefinitions.documentConformanceRequirementSpecialTags = { + "a": { + "with-href": { + implicitRole: ["link"], + //roleCondition: " when non-empty href attribute is present", + validRoles: ["button", "checkbox", "doc-backlink", "doc-biblioref", "doc-glossref", "doc-noteref", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-disabled=true"] + }, + "without-href": { + implicitRole: ["generic"], + //roleCondition: " when href attribute is not present", + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "area": { + "with-href": { + implicitRole: ["link"], + //roleCondition: " when non-empty href attribute is present", + validRoles: null, + globalAriaAttributesValid: true + }, + "without-href": { + implicitRole: ["generic"], + //roleCondition: " when href attribute is not present", + validRoles: ["button", "link"], + globalAriaAttributesValid: true + } + }, + // TODO + // "autonomous custom element": { + // implicitRole: ["Role exposed from author defined ElementInternals. Otherwise no corresponding role."], + // validRoles: ["If role defined by ElementInternals", "any role", "no role Otherwise"], + // globalAriaAttributesValid: true + // }, + "div": { + "child-dl": { + implicitRole: ["generic"], + validRoles: ["presentation", "none"], + globalAriaAttributesValid: true + }, + "no-child-dl": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "figure": { + "child-figcaption": { + implicitRole: ["figure"], + validRoles: ['doc-example'], + globalAriaAttributesValid: true + }, + "no-child-figcaption": { + implicitRole: ["figure"], + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "footer": { + "des-section-article-aside-main-nav": { + implicitRole: ["generic"], + //roleCondition: " when descendant of an article, aside, main, nav or section element", + validRoles: ["doc-footnote", "group", "none", "presentation"], + globalAriaAttributesValid: true + }, + "other": { + implicitRole: ["contentinfo"], + //roleCondition: " when not a descendant of an article, aside, main, nav or section element", + validRoles: ["doc-footnote", "group", "none", "presentation"], + globalAriaAttributesValid: true + } + }, + // TODO + // "form-associated custom element": { + // implicitRole: ["Role exposed from author defined ElementInternals. Otherwise 'generic'."], + // validRoles: ["If role defined by ElementInternals", "form-related roles: button", "checkbox", "combobox", "group", "listbox", "progressbar", "radio", "radiogroup", "searchbox", "slider", "spinbutton", "switch", "textbox", "no role Otherwise"], + // globalAriaAttributesValid: true + // }, + "header": { + "des-section-article-aside-main-nav": { + implicitRole: ["generic"], + //roleCondition: " when descendant of an article, aside, main, nav or section element", + validRoles: ["group", "none", "presentation"], + globalAriaAttributesValid: true + }, + "other": { + implicitRole: ["banner"], + //roleCondition: " when not a descendant of an article, aside, main, nav or section element", + validRoles: ["group", "none", "presentation"], + globalAriaAttributesValid: true + } + }, + "img": { + "img-with-accname": { + implicitRole: ["img"], + //roleCondition: "when accessible name presents", + validRoles: ["button", "checkbox", "doc-cover", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "meter", "option", "progressbar", "radio", "scrollbar", "separator", "slider", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true + }, + "img-without-accname-empty-alt": { + implicitRole: ["presentation", "none"], + //roleCondition: "when no accessible name presents and alt=''", + validRoles: null, + globalAriaAttributesValid: false, + otherAllowedAriaAttributes: ["aria-hidden=true"] + }, + "img-without-accname-no-alt": { + implicitRole: ["img"], + //roleCondition: "when neither accessible name no alt presents", + validRoles: ["presentation", "none"], + globalAriaAttributesValid: false, + otherAllowedAriaAttributes: ["aria-hidden=true"] + } + }, + "input": { + "button": { + implicitRole: ["button"], + validRoles: ["checkbox", "combobox", "gridcell", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "slider", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true + }, + "checkbox-with-aria-pressed": { + implicitRole: ["checkbox"], + //roleCondition: " with type=checkbox and aria-pressed attribute is present", + validRoles: ["menuitemcheckbox", "option", "switch", "button"], + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-required"], + otherDisallowedAriaAttributes: ["aria-checked"] + }, + "checkbox-without-aria-pressed": { + implicitRole: ["checkbox"], + //roleCondition: " with type=checkbox and aria-pressed attribute is not present", + validRoles: ["menuitemcheckbox", "option", "switch"], + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-required"], + otherDisallowedAriaAttributes: ["aria-checked"] + }, + "color": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true + }, + "date": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-required", "aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "datetime-local": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-required", "aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "email-no-list": { + implicitRole: ["textbox"], + //roleCondition: " with type=email and no list attribute is present", + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "email-with-list": { + implicitRole: ["combobox"], + validRoles: null, + globalAriaAttributesValid: true + }, + "file": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-required"], + }, + "hidden": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "image": { + implicitRole: ["button"], + validRoles: ["checkbox", "gridcell", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "slider", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true + }, + "month": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "number": { + implicitRole: ["spinbutton"], + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"], + }, + "password": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "radio": { + implicitRole: ["radio"], + validRoles: ["menuitemradio"], + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-required"], + otherDisallowedAriaAttributes: ["aria-checked"] + }, + "range": { + implicitRole: ["slider"], + validRoles: null, + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-valuemax", "aria-valuemin"] + }, + "reset": { + implicitRole: ["button"], + validRoles: ["checkbox", "combobox", "gridcell", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "slider", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true + }, + "search-no-list": { + implicitRole: ["searchbox"], + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"] + }, + "search-with-list": { + implicitRole: ["combobox"], + validRoles: null, + globalAriaAttributesValid: true + }, + "submit": { + implicitRole: ["button"], + validRoles: ["checkbox", "combobox", "gridcell", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "slider", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true + }, + "tel-no-list": { + implicitRole: ["textbox"], + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"] + }, + "tel-with-list": { + implicitRole: ["combobox"], + validRoles: null, + globalAriaAttributesValid: true + }, + "text-no-list": { + implicitRole: ["textbox"], + validRoles: ["combobox", "searchbox", "spinbutton"], + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"] + }, + "text-with-list": { + implicitRole: ["combobox"], + validRoles: null, + globalAriaAttributesValid: true + // otherDisallowedAriaAttributes: ["aria-haspopup"] // covered in a different rule + }, + "time": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "url-no-list": { + implicitRole: ["textbox"], + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"] + }, + "url-with-list": { + implicitRole: ["combobox"], + validRoles: null, + globalAriaAttributesValid: true + }, + "week": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "default-with-list": { + // input with a missing or invalid type, with a list attribute + implicitRole: ["combobox"], + validRoles: null, + globalAriaAttributesValid: true + }, + "default-no-list": { + // input with a missing or invalid type, with a list attribute + implicitRole: ["textbox"], + validRoles: null, + globalAriaAttributesValid: true + } + }, + "li": { + "child-of-list-role": { + implicitRole: ['listitem'], + validRoles: null, + globalAriaAttributesValid: true + }, + "no-child-of-list-role": { + implicitRole: ['generic'], + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "section": { + "with-name": { + implicitRole: ["region"], + validRoles: ["alert", "alertdialog", "application", "banner", "complementary", "contentinfo", "dialog", "doc-abstract", "doc-acknowledgments", "doc-afterword", "doc-appendix", "doc-bibliography", "doc-chapter", "doc-colophon", "doc-conclusion", "doc-credit", "doc-credits", "doc-dedication", "doc-endnotes", "doc-epigraph", "doc-epilogue", "doc-errata", "doc-example", "doc-foreword", "doc-glossary", "doc-index", "doc-introduction", "doc-notice", "doc-pagelist", "doc-part", "doc-preface", "doc-prologue", "doc-pullquote", "doc-qna", "doc-toc", "document", "feed", "group", "log", "main", "marquee", "navigation", "none", "note", "presentation", "search", "status", "tabpanel"], + globalAriaAttributesValid: true + }, + "without-name": { + implicitRole: null, + validRoles: ["alert", "alertdialog", "application", "banner", "complementary", "contentinfo", "dialog", "doc-abstract", "doc-acknowledgments", "doc-afterword", "doc-appendix", "doc-bibliography", "doc-chapter", "doc-colophon", "doc-conclusion", "doc-credit", "doc-credits", "doc-dedication", "doc-endnotes", "doc-epigraph", "doc-epilogue", "doc-errata", "doc-example", "doc-foreword", "doc-glossary", "doc-index", "doc-introduction", "doc-notice", "doc-pagelist", "doc-part", "doc-preface", "doc-prologue", "doc-pullquote", "doc-qna", "doc-toc", "document", "feed", "group", "log", "main", "marquee", "navigation", "none", "note", "presentation", "search", "status", "tabpanel"], + globalAriaAttributesValid: true + } + }, + "select": { + "no-multiple-attr-size-gt1": { + //roleCondition: " with a multiple attribute or a size attribute having value greater than 1" + implicitRole: ["combobox"], + validRoles: ["menu"], + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-multiselectable"] + }, + "multiple-attr-size-gt1": { + //roleCondition: " with no multiple attribute and no size attribute having value greater than 1" + implicitRole: ["listbox"], + validRoles: null, + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-multiselectable"] + } + }, + "summary": { + "first-summary-of-detail": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-disabled", "aria-haspopup"] + }, + "no-first-summary-of-detail": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "tbody": { + "des-table": { + implicitRole: ["rowgroup"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "des-grid": { + implicitRole: ["rowgroup"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "des-treegrid": { + implicitRole: ["rowgroup"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "des-other": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "td": { + "des-table": { + implicitRole: ["cell"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-grid": { + implicitRole: ["gridcell"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-treegrid": { + implicitRole: ["gridcell"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-other": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "th": { + "des-table-row-scope": { + implicitRole: ["rowheader", "cell"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-table-column-scope": { + implicitRole: ["columnheader", "cell"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-grid-treegrid-row-scope": { + implicitRole: ["rowheader", "gridcell"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-grid-treegrid-column-scope": { + implicitRole: ["columnheader", "gridcell"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-other": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "tr": { + "des-table": { + implicitRole: ["row"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-grid": { + implicitRole: ["row"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-treegrid": { + implicitRole: ["row"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-other": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "default": { + implicitRole: null, + //roleCondition: "", + validRoles: ["any"], + globalAriaAttributesValid: true + } + }; // end of documentConformanceRequirementSpecialTags + // map aria attribute to the corresponding native attribute, apply to any element applicable + // note this mapping is for the related attributes in the same element without checking the parent tree. + // refer to https://w3c.github.io/html-aria/ + ARIADefinitions.relatedAriaHtmlAttributes = { + "aria-checked": { + conflict: [{ + ariaAttributeValue: "false", + htmlAttributeNames: ["checked"], + htmlAttributeValues: null + }], + overlapping: [{ + ariaAttributeValue: "true", + htmlAttributeNames: ["checked"], + htmlAttributeValues: null + }] + }, + "aria-disabled": { + conflict: [{ + ariaAttributeValue: "false", + htmlAttributeNames: ["disabled"], + htmlAttributeValues: null + }], + overlapping: [{ + ariaAttributeValue: "true", + htmlAttributeNames: ["disabled"], + htmlAttributeValues: null + }] + }, + "aria-hidden": { + conflict: [{ + ariaAttributeValue: "false", + htmlAttributeNames: ["hidden"], + htmlAttributeValues: ["hidden,null"] + }, + { + ariaAttributeValue: "true", + htmlAttributeNames: ["hidden"], + htmlAttributeValues: ["until-found"] + }], + overlapping: [{ + ariaAttributeValue: "true", + htmlAttributeNames: ["hidden"], + htmlAttributeValues: ["hidden,null"] + }] + }, + "aria-placeholder": { + conflict: [{ + ariaAttributeValue: null, + htmlAttributeNames: ["placeholder"], + htmlAttributeValues: null + }] + }, + "aria-valuemax": { + conflict: [{ + ariaAttributeValue: null, + htmlAttributeNames: ["max"], + htmlAttributeValues: null + }] + //overlap case covered in the role definition: Authors SHOULD NOT use aria-valuemax on any element which allows the max attribute. Use the max attribute instead. + }, + "aria-valuemin": { + conflict: [{ + ariaAttributeValue: null, + htmlAttributeNames: ["min"], + htmlAttributeValues: null + }] + ////overlap case covered in the role definition:Authors SHOULD NOT use aria-valuemin on any element which allows the min attribute. Use the min attribute instead. + }, + "aria-readonly": { + conflict: [{ + ariaAttributeValue: "false", + htmlAttributeNames: ["readonly", "contenteditable", "iscontenteditable"], + htmlAttributeValues: [null, "false", "false"] + }], + overlapping: [{ + ariaAttributeValue: "true", + htmlAttributeNames: ["readonly", "contenteditable", "iscontenteditable"], + htmlAttributeValues: [null, "true", "true"] + }] + }, + "aria-required": { + conflict: [{ + ariaAttributeValue: "false", + htmlAttributeNames: ["required"], + htmlAttributeValues: null + }], + overlapping: [{ + ariaAttributeValue: "true", + htmlAttributeNames: ["required"], + htmlAttributeValues: null + }] + }, + "aria-colspan": { + conflict: [{ + // conflict occurs if both values are different + ariaAttributeValue: "VALUE", + htmlAttributeNames: ["colspan"], + htmlAttributeValues: ["VALUE"] + }], + overlapping: [{ + // overlap occurs if both exists + ariaAttributeValue: null, + htmlAttributeNames: ["colspan"], + htmlAttributeValues: null + }] + }, + "aria-rowspan": { + conflict: [{ + // conflict occurs if both values are different + ariaAttributeValue: "VALUE", + htmlAttributeNames: ["rowspan"], + htmlAttributeValues: ["VALUE"] + }], + overlapping: [{ + // overlap occurs if both exists + ariaAttributeValue: null, + htmlAttributeNames: ["rowspan"], + htmlAttributeValues: null + }] + }, + /** "aria-autocomplete": { + conflict: [{ + // conflict occurs if both exists, aria value is only for custom widget, rather than native + ariaAttributeValue: null, + htmlAttributeNames: ["autocomplete"], + htmlAttributeValues: null + }] + } */ + }; + ARIADefinitions.containers = []; + return ARIADefinitions; +}()); +exports.ARIADefinitions = ARIADefinitions; +; +var containerArray = []; +for (var roleDesign in ARIADefinitions.designPatterns) { + var containers = ARIADefinitions.designPatterns[roleDesign].container; + if (containers !== null) { + for (var _i = 0, containers_1 = containers; _i < containers_1.length; _i++) { + var container = containers_1[_i]; + if (containerArray.indexOf(container) == -1) { + containerArray.push(container); + } + } + } +} +ARIADefinitions.containers = containerArray; + + +/***/ }, + +/***/ "./src/v2/aria/ARIAMapper.ts" +/*!***********************************!*\ + !*** ./src/v2/aria/ARIAMapper.ts ***! + \***********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ARIAMapper = void 0; +var ARIADefinitions_1 = __webpack_require__(/*! ./ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var CommonMapper_1 = __webpack_require__(/*! ../common/CommonMapper */ "./src/v2/common/CommonMapper.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../../v4/util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../../v4/util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var ARIAWalker_1 = __webpack_require__(/*! ./ARIAWalker */ "./src/v2/aria/ARIAWalker.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../../v4/util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../../v4/util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var ARIAMapper = /** @class */ (function (_super) { + __extends(ARIAMapper, _super); + function ARIAMapper() { + return _super !== null && _super.apply(this, arguments) || this; + } + ARIAMapper.prototype.childrenCanHaveRole = function (node, role) { + // if (node.nodeType === 1 /* Node.ELEMENT_NODE */) { + // const elem = node as Element; + // if (elem.getAttribute("aria-hidden") === "true") { + // return false; + // } + // } + return !(role in ARIADefinitions_1.ARIADefinitions.designPatterns && ARIADefinitions_1.ARIADefinitions.designPatterns[role].presentationalChildren); + }; + ARIAMapper.prototype.getRole = function (node) { + var role = ARIAMapper.nodeToRole(node); + return role; + }; + ARIAMapper.prototype.getNamespace = function () { + return "aria"; + }; + ARIAMapper.prototype.getAttributes = function (node) { + var retVal = {}; + if (node.nodeType === 1 /* Node.ELEMENT_NODE */) { + var cacheVal = CacheUtil_1.CacheUtil.getCache(node, "ARIAMapper::getAttributes", undefined); + if (typeof cacheVal !== "undefined") + return cacheVal; + var elem = node; + for (var idx = 0; idx < elem.attributes.length; ++idx) { + var attrInfo = elem.attributes[idx]; + var name_1 = attrInfo.name.toLowerCase(); + if (name_1.startsWith("aria-")) { + retVal[name_1.substring(5)] = attrInfo.nodeValue; + } + } + // Optimize: Cache nodeName.toLowerCase() to avoid repeated calls + var nodeName = node.nodeName.toLowerCase(); + // Apply global attributes first + ARIAMapper.applyAttrRole(elem, "global", retVal); + // Apply element-specific attributes + ARIAMapper.applyAttrRole(elem, nodeName, retVal); + CacheUtil_1.CacheUtil.setCache(node, "ARIAMapper::getAttributes", retVal); + } + else if (node.nodeType === 3 /* Node.TEXT_NODE */) { + var calculators = ARIAMapper.textAttrValueCalculators; + for (var attr in calculators) { + var val = calculators[attr](node); + if (typeof val !== "undefined" && val !== null) { + retVal[attr] = val; + } + } + } + return retVal; + }; + // Optimize: Move applyAttrRole outside getAttributes to avoid function recreation + ARIAMapper.applyAttrRole = function (elem, nodeName, retVal) { + var calculators = ARIAMapper.elemAttrValueCalculators; + if (!(nodeName in calculators)) + return; + for (var attr in calculators[nodeName]) { + if (!(attr in retVal)) { + var value = calculators[nodeName][attr]; + if (typeof value !== "undefined" && value !== null) { + if (typeof value !== "string") { + value = value(elem); + } + retVal[attr] = value; + } + } + } + }; + ARIAMapper.getAriaOwnedBy = function (elem) { + var doc = fragment_1.FragmentUtil.getOwnerFragment(elem); + if (!CacheUtil_1.CacheUtil.getCache(doc, "ARIAMapper::precalcOwned", false)) { + var owners = doc.querySelectorAll("[aria-owns]"); + for (var iOwner = 0; iOwner < owners.length; ++iOwner) { + var owner = owners[iOwner]; + var ownIds = owner.getAttribute("aria-owns").split(/ +/g); + var _loop_1 = function (iId) { + var owned = doc.getElementById(ownIds[iId]); + //ignore if the aria-owns point to the element itself + //if (owned && !DOMUtil.sameNode(owner, owned)) { + // CacheUtil.setCache(owned, "aria-owned", owner); + //} + /** + * circular hierarchy check: + * (1) the owned element is neither the same element with the owner nor any ascendant of the owner + * (2) any child with aria-owns cannot point to the owner or any ascendant of the owner + */ + if (owned && !DOMUtil_1.DOMUtil.sameNode(owner, owned)) { + // check if the owned with aria-owns that points to another element + var ownedNodes = []; + var sub_owners = owned.querySelectorAll("[aria-owns]"); + for (var i = 0; i < sub_owners.length; ++i) { + var sub_owner = sub_owners[i]; + var sub_ownIds = sub_owner.getAttribute("aria-owns").split(/ +/g); + for (var j = 0; j < sub_ownIds.length; ++j) { + var ownedNode = doc.getElementById(sub_ownIds[j]); + if (ownedNode) + ownedNodes.push(ownedNode); + } + } + if (ownedNodes.length === 0) { + CacheUtil_1.CacheUtil.setCache(owned, "aria-owned", owner); + return "continue"; + } + // check if any aria-owns points to the element itself or any of it's parent + var parent_1 = owner; + var circular = false; + while (parent_1 !== null) { + var found = ownedNodes.some(function (item) { return DOMUtil_1.DOMUtil.sameNode(parent_1, item); }); + if (!found) + parent_1 = DOMWalker_1.DOMWalker.parentElement(parent_1); + else { + circular = true; + break; + } + } + if (!circular) + CacheUtil_1.CacheUtil.setCache(owned, "aria-owned", owner); + } + }; + for (var iId = 0; iId < ownIds.length; ++iId) { + _loop_1(iId); + } + } + CacheUtil_1.CacheUtil.setCache(doc, "ARIAMapper::precalcOwned", true); + } + return CacheUtil_1.CacheUtil.getCache(elem, "aria-owned", null); + }; + ARIAMapper.prototype.getNodeHierarchy = function (node) { + if (!node) + return []; + if (node.nodeType !== 1) { + var parentHierarchy = this.getNodeHierarchy(DOMWalker_1.DOMWalker.parentElement(node)); + var parentInfo = parentHierarchy.length > 0 ? parentHierarchy[parentHierarchy.length - 1] : { + role: "", + rolePath: "", + roleCount: {}, + childrenCanHaveRole: true + }; + var nodeHierarchy = []; + // Set hierarchy + for (var _i = 0, parentHierarchy_1 = parentHierarchy; _i < parentHierarchy_1.length; _i++) { + var item = parentHierarchy_1[_i]; + nodeHierarchy.push(item); + } + nodeHierarchy.push({ + attributes: {}, + bounds: this.getBounds(node), + namespace: this.getNamespace(), + node: node, + role: this.getRole(node) || null, + rolePath: parentInfo.rolePath + "/" + (this.getRole(node) || null), + roleCount: {}, + childrenCanHaveRole: parentInfo.childrenCanHaveRole + }); + return nodeHierarchy; + } + else { + var elem = node; + var nodeHierarchy = CacheUtil_1.CacheUtil.getCache(elem, "ARIAMapper::getNodeHierarchy", null); + if (!nodeHierarchy) { + // This element hasn't been processed yet - but ::reset processes them all in the right order + // Get details about the correct parent first + var parent_2 = ARIAMapper.getAriaOwnedBy(elem); + if (!parent_2) { + parent_2 = DOMWalker_1.DOMWalker.parentElement(elem); + } + while (parent_2 && parent_2.nodeType !== 1) { + parent_2 = DOMWalker_1.DOMWalker.parentElement(elem); + } + var parentHierarchy = parent_2 ? this.getNodeHierarchy(parent_2) : []; + var parentInfo = parentHierarchy.length > 0 ? parentHierarchy[parentHierarchy.length - 1] : { + role: "", + rolePath: "", + roleCount: {}, + childrenCanHaveRole: true + }; + while (parentInfo.role === null) { + parent_2 = ARIAMapper.getAriaOwnedBy(parent_2) || DOMWalker_1.DOMWalker.parentElement(parent_2); + parentHierarchy = parent_2 ? this.getNodeHierarchy(parent_2) : []; + parentInfo = parentHierarchy[parentHierarchy.length - 1]; + } + // Set initial node info + var nodeInfo = { + attributes: elem.nodeType === 1 ? this.getAttributes(elem) : {}, + bounds: this.getBounds(elem), + namespace: this.getNamespace(), + node: elem, + role: this.getRole(elem) || null, + rolePath: "", + roleCount: {}, + childrenCanHaveRole: true + }; + // Adjust role if we're within a presentational container + var presentationalContainer = !parentInfo.childrenCanHaveRole; + if (presentationalContainer) { + nodeInfo.role = null; + } + else { + nodeInfo.childrenCanHaveRole = parentInfo.childrenCanHaveRole + && this.childrenCanHaveRole(elem, nodeInfo.role); + } + // Set the paths + if (nodeInfo.role !== null) { + parentInfo.roleCount[nodeInfo.role] = (parentInfo.roleCount[nodeInfo.role] || 0) + 1; + nodeInfo.rolePath = parentInfo.rolePath + "/" + nodeInfo.role + "[" + parentInfo.roleCount[nodeInfo.role] + "]"; + } + else { + nodeInfo.rolePath = parentInfo.rolePath; + } + // Set hierarchy + nodeHierarchy = []; + for (var _a = 0, parentHierarchy_2 = parentHierarchy; _a < parentHierarchy_2.length; _a++) { + var item = parentHierarchy_2[_a]; + nodeHierarchy.push(item); + } + nodeHierarchy.push(nodeInfo); + CacheUtil_1.CacheUtil.setCache(elem, "ARIAMapper::getNodeHierarchy", nodeHierarchy); + } + return nodeHierarchy; + } + }; + ARIAMapper.prototype.reset = function (node) { + ARIAMapper.nameComputationId = 0; + this.hierarchyRole = []; + this.hierarchyResults = []; + this.hierarchyPath = [{ + rolePath: "", + roleCount: {} + }]; + // Get to the topmost node + var goodNode = node; + var next; + while (next = DOMWalker_1.DOMWalker.parentNode(goodNode)) { + goodNode = next; + } + ; + // Walk the tree and set the hierarchies in the right order + var ariaWalker = new ARIAWalker_1.ARIAWalker(goodNode, false, goodNode); + do { + if (ariaWalker.node.nodeType === 1) { + this.getNodeHierarchy(ariaWalker.node); + } + } while (ariaWalker.nextNode()); + }; + ARIAMapper.prototype.openScope = function (node) { + if (this.hierarchyRole === null) { + this.reset(node); + } + this.pushHierarchy(node); + for (var idx = 0; idx < this.hierarchyResults.length; ++idx) { + if (this.hierarchyResults[idx].role && this.hierarchyResults[idx].role[0] === "/") { + this.hierarchyResults[idx].role = (this.hierarchyResults[idx].role ? this.hierarchyResults[idx].role.substring(1) : null); + } + } + return this.hierarchyResults; + }; + ARIAMapper.prototype.pushHierarchy = function (node) { + // If we're not an element, no special handling + var nodeHierarchy = []; + // Determine our node info + nodeHierarchy = this.getNodeHierarchy(node); + var nodeInfo = nodeHierarchy[nodeHierarchy.length - 1]; + this.hierarchyRole.push(nodeInfo.role); + if (nodeInfo.role !== null) { + this.hierarchyPath.push(nodeInfo); + } + this.hierarchyResults = nodeHierarchy; + }; + ARIAMapper.prototype.closeScope = function (node) { + var retVal = []; + for (var _i = 0, _a = this.hierarchyResults; _i < _a.length; _i++) { + var res = _a[_i]; + // const temp = res.node; + // res.node = null; + // let cloned = JSON.parse(JSON.stringify(res)); + // cloned.node = res.node = temp; + // retVal.push(cloned); + retVal.push(res); + } + if (retVal.length > 0) { + retVal[retVal.length - 1].role = "/" + retVal[retVal.length - 1].role; + var parent_3 = DOMWalker_1.DOMWalker.parentElement(node); + this.hierarchyResults = parent_3 ? CacheUtil_1.CacheUtil.getCache(parent_3, "ARIAMapper::getNodeInfo", []) : []; + } + return retVal; + }; + /**public static computeName(cur: Node) : string { + ++ARIAMapper.nameComputationId; + return ARIAMapper.computeNameHelp(ARIAMapper.nameComputationId, cur, false, false); + } + + public static computeNameHelp(walkId: number, cur: Node, labelledbyTraverse: boolean, walkTraverse: boolean) : string { + // 2g. None of the other content applies to text nodes, so just do this first + if (cur.nodeType === 3 ) return cur.nodeValue; + if (cur.nodeType === 11) return ""; + if (cur.nodeType !== 1 ) { + if (walkTraverse || labelledbyTraverse) return ""; + throw new Error ("Can only compute name on Element and Text " + cur.nodeType); + } + + const elem = cur as Element; + // We've been here before - prevent recursion + if (CacheUtil.getCache(elem, "data-namewalk", null) === ""+walkId) return ""; + CacheUtil.setCache(elem, "data-namewalk", ""+walkId); + // See https://www.w3.org/TR/html-aam-1.0/#input-type-text-input-type-password-input-type-search-input-type-tel-input-type-url-and-textarea-element + + // 2a. Only show hidden content if it's referenced by a labelledby + if (!labelledbyTraverse && !VisUtil.isNodeVisible(cur)) { + return ""; + } + + // 2b. collect valid id references + if (!labelledbyTraverse && elem.hasAttribute("aria-labelledby")) { + let labelledby = elem.getAttribute("aria-labelledby").split(" "); + let validElems = []; + for (const ref of labelledby) { + const refElem = FragmentUtil.getById(cur, ref); + if (refElem && !DOMUtil.sameNode(elem, refElem)) { + validElems.push(refElem); + } + } + if (validElems.length > 0) { + let accumulated = ""; + for (const elem of validElems) { + accumulated += " " + this.computeNameHelp(walkId, elem, true, false); + } + return accumulated.trim(); + } + } + + // Since nodeToRole calls back here for form and section, we need special casing here to handle those two cases + if (["section", "form"].includes(cur.nodeName.toLowerCase())) { + if (elem.hasAttribute("aria-label") && elem.getAttribute("aria-label").trim().length > 0) { + // If I'm not an embedded control or I'm not recursing, return the aria-label + if (!labelledbyTraverse && !walkTraverse) { + return elem.getAttribute("aria-label").trim(); + } + } + if (elem.hasAttribute("title")) { + return elem.getAttribute("title"); + } + return ""; + } + + // 2c. If label or walk, and this is a control, skip to the value, otherwise provide the label + const role = ARIAMapper.nodeToRole(cur); + let isEmbeddedControl = [ + "textbox", "button", "combobox", "listbox", + "progressbar", "scrollbar", "slider", "spinbutton" + ].includes(role); + if (elem.hasAttribute("aria-label") && elem.getAttribute("aria-label").trim().length > 0) { + // If I'm not an embedded control or I'm not recursing, return the aria-label + if (!labelledbyTraverse && !walkTraverse || !isEmbeddedControl) { + return elem.getAttribute("aria-label").trim(); + } + } + + // 2d. + if (role !== "presentation" && role !== "none") { + if ((cur.nodeName.toLowerCase() === "img" || cur.nodeName.toLowerCase() === "area") && elem.hasAttribute("alt")) { + return DOMUtil.cleanWhitespace(elem.getAttribute("alt")).trim(); + } + + if (cur.nodeName.toLowerCase() === "input" && elem.hasAttribute("id") && elem.getAttribute("id").length > 0) { + let label = elem.ownerDocument.querySelector("label[for='"+elem.getAttribute("id")+"']"); + if (label) { + if (label.hasAttribute("aria-label") || (label.hasAttribute("aria-labelledby") && !CommonUtil.isIdReferToSelf(cur, label.getAttribute("aria-labelledby")))) { + return this.computeNameHelp(walkId, label, false, false); + } else { + return label.textContent; + } + } + } + if (cur.nodeName.toLowerCase() === "fieldset") { + if( (<Element>cur).querySelector("legend")){ + let legend = (<Element>cur).querySelector("legend"); + return legend.innerText; + }else{ + return this.computeNameHelp(walkId, cur, false, false); + } + + } + + } + + // 2e. + if ((walkTraverse || labelledbyTraverse) && isEmbeddedControl) { + // If the embedded control has role textbox, return its value. + if (role === "textbox") { + if (elem.nodeName.toLowerCase() === "input") { + if (elem.hasAttribute("value")) return elem.getAttribute("value"); + } else { + walkTraverse = false; + } + } + + // If the embedded control has role button, return the text alternative of the button. + if (role === "button") { + if (elem.nodeName.toLowerCase() === "input") { + let type = elem.getAttribute("type").toLowerCase(); + if (["button", "submit", "reset"].includes(type)) { + if (elem.hasAttribute("value")) return elem.getAttribute("value"); + if (type === "submit") return "Submit"; + if (type === "reset") return "Reset"; + } + } else { + walkTraverse = false; + } + } + + // TODO: If the embedded control has role combobox or listbox, return the text alternative of the chosen option. + if (role === "combobox") { + if (elem.hasAttribute("aria-activedescendant")) { + let selected = FragmentUtil.getById(elem, "aria-activedescendant"); + if (selected && !DOMUtil.sameNode(elem, selected)) { + return ARIAMapper.computeNameHelp(walkId, selected, false, false); + } + } + } + + // If the embedded control has role range (e.g., a spinbutton or slider): + if (["progressbar", "scrollbar", "slider", "spinbutton"].includes(role)) { + // If the aria-valuetext property is present, return its value, + if (elem.hasAttribute("aria-valuetext")) return elem.getAttribute("aria-valuetext"); + // Otherwise, if the aria-valuenow property is present, return its value, + if (elem.hasAttribute("aria-valuenow")) return elem.getAttribute("aria-valuenow"); + // TODO: Otherwise, use the value as specified by a host language attribute. + } + } + + // 2f. 2h. + if (walkTraverse || ARIADefinitions.nameFromContent(role) || labelledbyTraverse) { + // 2fi. Set the accumulated text to the empty string. + let accumulated = ""; + // 2fii. Check for CSS generated textual content associated with the current node and + // include it in the accumulated text. The CSS :before and :after pseudo elements [CSS2] + // can provide textual content for elements that have a content model. + // For :before pseudo elements, User agents MUST prepend CSS textual content, without + // a space, to the textual content of the current node. + // For :after pseudo elements, User agents MUST append CSS textual content, without a + // space, to the textual content of the current node. + let before = null; + before = elem.ownerDocument.defaultView.getComputedStyle(elem,"before").content; + + if (before && before !== "none") { + before = before.replace(/^"/,"").replace(/"$/,""); + accumulated += before; + } + // 2fiii. For each child node of the current node: + // Set the current node to the child node. + // Compute the text alternative of the current node beginning with step 2. Set the result + // to that text alternative. + // Append the result to the accumulated text. + if (elem.nodeName.toUpperCase() === "SLOT") { + //if no assignedNode, check its own text + if (!(elem as HTMLSlotElement).assignedNodes() || (elem as HTMLSlotElement).assignedNodes().length === 0) { + let innerText = CommonUtil.getInnerText(elem); + if (innerText && innerText !== null && innerText.trim().length > 0) + accumulated += " " + innerText; + } else { + // check text from all assigned nodes + for (const slotChild of (elem as HTMLSlotElement).assignedNodes()) { + let nextChildContent = ARIAMapper.computeNameHelp(walkId, slotChild, labelledbyTraverse, true); + accumulated += " " + nextChildContent; + } + } + } else { + let walkChild = elem.firstChild; + while (walkChild) { + let nextChildContent = ARIAMapper.computeNameHelp(walkId, walkChild, labelledbyTraverse, true); + accumulated += " " + nextChildContent; + walkChild = walkChild.nextSibling; + } + } + + let after = null; + try { + after = elem.ownerDocument.defaultView.getComputedStyle(elem,"after").content; + } catch (e) {} + + if (after && after !== "none") { + after = after.replace(/^"/,"").replace(/"$/,""); + accumulated += after; + } + // 2fiv. Return the accumulated text. + accumulated = accumulated.replace(/\s+/g," ").trim(); + if (accumulated.trim().length > 0) { + return accumulated; + } + } + + // 2i. Otherwise, if the current node has a Tooltip attribute, return its value. + if (elem.hasAttribute("title")) { + return elem.getAttribute("title"); + } + if (elem.tagName.toLowerCase() === "svg") { + let title = elem.querySelector("title"); + if (title) { + return title.textContent || title.innerText; + } + } + + return ""; + } + */ + /* if (role in ARIADefinitions.designPatterns + && ARIADefinitions.designPatterns[role].nameFrom + && ARIADefinitions.designPatterns[role].nameFrom.includes("contents")) + { + name = elem.textContent; + } + if (elem.nodeName.toLowerCase() === "input" && elem.hasAttribute("id") && elem.getAttribute("id").trim().length > 0) { + name = elem.ownerDocument.querySelector("label[for='"+elem.getAttribute("id").trim()+"']").textContent; + } + if (elem.hasAttribute("aria-label")) { + name = elem.getAttribute("aria-label"); + } + if (elem.hasAttribute("aria-labelledby")) { + name = ""; + const ids = elem.getAttribute("aria-labelledby").split(" "); + for (const id of ids) { + name += FragmentUtil.getById(elem, id).textContent + " "; + } + name = name.trim(); + } + return name; + }*/ + ARIAMapper.nodeToRole = function (node) { + if (node.nodeType === 3 /* Node.TEXT_NODE */) { + return "text"; + } + else if (node.nodeType !== 1 /* Node.ELEMENT_NODE */) { + return null; + } + var elem = node; + if (!elem || elem.nodeType !== 1 /* Node.ELEMENT_NODE */) { + return null; + } + // TO DO: use AriaUtil.getResolvedRole(elem) to replace the code following, which uses only the valid roles for the element based on the aria fallback rule + //const role = AriaUtil.getResolvedRole(elem); + //return role === "presentation" || role === "none" ? null : role; + if (elem.hasAttribute("role") && elem.getAttribute("role").trim().length > 0) { + var roleStr = elem.getAttribute("role").trim(); + var roles_2 = roleStr.split(" "); + for (var _i = 0, roles_1 = roles_2; _i < roles_1.length; _i++) { + var role_1 = roles_1[_i]; + if (role_1 === "presentation" || role_1 === "none") { + // If element is focusable, then presentation roles are to be ignored + if (!CommonUtil_1.CommonUtil.isFocusable(elem)) { + return null; + } + } + else if (role_1 in ARIADefinitions_1.ARIADefinitions.designPatterns) { + return role_1; + } + } + } + //return this.elemToImplicitRole(elem); + var roles = AriaUtil_1.AriaUtil.getImplicitRole(elem); + //console.log("node=" + node.nodeName +", role= " + (roles ? roles[0] : null) +", resolved=" + AriaUtil.getResolvedRole(elem)); + var role = !roles || roles.length === 0 ? null : roles[0]; + return role === "presentation" || role === "none" ? null : role; + //return AriaUtil.getResolvedRole(elem); + }; + //////////////////////////////////////////////////////////////////////////// + // Helper functions + //// + // https://www.w3.org/TR/html-aam-1.0/#mapping-html-to-accessibility-apis + ARIAMapper.elemAttrValueCalculators = { + "global": { + "name": function (elem) { var _a; return (_a = AccNameUtil_1.AccNameUtil.computeAccessibleName(elem)) === null || _a === void 0 ? void 0 : _a.name; } //ARIAMapper.computeName + }, + "datalist": { + // set to "true" if the datalist's selection model allows multiple option elements to be + // selected at a time, and "false" otherwise + "multiselectable": function (elem) { + var id = elem.getAttribute("id"); + if (id && id.length > 0) { + var input = elem.ownerDocument.querySelector("input[list='" + id + "']"); + return "" + (elem.getAttribute("multiple") + && (elem.getAttribute("multiple") == "true" || elem.getAttribute("multiple") == "")); + } + return null; + } + }, + "h1": { + "level": "1" + }, + "h2": { + "level": "2" + }, + "h3": { + "level": "3" + }, + "h4": { + "level": "4" + }, + "h5": { + "level": "5" + }, + "h6": { + "level": "6" + }, + "input": { + // - type="checkbox" state set to "mixed" if the element's indeterminate IDL attribute + // is true, or "true" if the element's checkedness is true, or "false" otherwise + // - type="radio" state set to "true" if the element's checkedness is true, or "false" + // otherwise. + "checked": function (elem) { + var type = elem.getAttribute("type"); + if (type === "checkbox" || type === "radio") { + return "" + elem.checked; + } + return null; + } + // - type="radio" and not in menu reflecting number of type=radio input elements + // within the radio button group + , + "setsize": function (elem) { return null; // removed by dead control flow + } + // - type="radio" and not in menu value reflecting the elements position + // within the radio button group." + , + "posinset": function (elem) { return null; // removed by dead control flow + } + // input (type attribute in the Text, Search, Telephone, URL, or E-mail states with a + // suggestions source element) combobox role, with the aria-owns property set to the same + // value as the list attribute + , + "owns": function (elem) { return null; // removed by dead control flow + } + }, + "keygen": { + "multiselectable": "false" + }, + "li": { + // Number of li elements within the ol, ul, menu + "setsize": function (elem) { + var parent = DOMUtil_1.DOMUtil.getAncestor(elem, ["ol", "ul", "menu"]); + if (!parent) + return null; + var lis = CacheUtil_1.CacheUtil.getSetCache(parent, "elemAttrValueCalculators::lis", function () { return parent.querySelectorAll("li"); }); + var otherlis = CacheUtil_1.CacheUtil.getSetCache(parent, "elemAttrValueCalculators::otherlis", function () { return parent.querySelectorAll("ol li, ul li, menu li"); }); + return "" + (lis.length - otherlis.length); + } + // Position of li element within the ol, ul, menu + , + "posinset": function (elem) { + var parent = DOMUtil_1.DOMUtil.getAncestor(elem, ["ol", "ul", "menu"]); + if (!parent) + return null; + var lis = CacheUtil_1.CacheUtil.getSetCache(parent, "elemAttrValueCalculators::lis", function () { return parent.querySelectorAll("li"); }); + var num = 0; + for (var idx = 0; idx < lis.length; ++idx) { + var li = lis[idx]; + if (DOMUtil_1.DOMUtil.sameNode(parent, DOMUtil_1.DOMUtil.getAncestor(li, ["ol", "ul", "menu"]))) { + return "" + num; + } + ++num; + } + return null; + } + }, + "menuitem": { + // type = checkbox or radio, set to "true" if the checked attribute + // is present, and "false" otherwise + "checked": function (elem) { return "" + !!(elem.getAttribute("checked") + && (elem.getAttribute("checked") == "true" || elem.getAttribute("checked") == "")); } + }, + "option": { + // set to "true" if the element's selectedness is true, or "false" otherwise. + "selected": function (elem) { return "" + !!(elem.getAttribute("selected") + && (elem.getAttribute("selected") == "true" || elem.getAttribute("selected") == "")); } + }, + "progress": { + "valuemax": function (elem) { return elem.getAttribute("max") || "1"; }, + "valuemin": function (elem) { return "0"; }, + "valuenow": function (elem) { return elem.getAttribute("value"); } + } + }; + ARIAMapper.textAttrValueCalculators = { + "name": function (node) { return node.nodeValue; } + }; + ARIAMapper.nameComputationId = 0; + return ARIAMapper; +}(CommonMapper_1.CommonMapper)); +exports.ARIAMapper = ARIAMapper; + + +/***/ }, + +/***/ "./src/v2/aria/ARIAWalker.ts" +/*!***********************************!*\ + !*** ./src/v2/aria/ARIAWalker.ts ***! + \***********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ARIAWalker = void 0; +var fragment_1 = __webpack_require__(/*! ../checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var ARIAMapper_1 = __webpack_require__(/*! ./ARIAMapper */ "./src/v2/aria/ARIAMapper.ts"); +var VisUtil_1 = __webpack_require__(/*! ../../v4/util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +/** + * Walks in an ARIA order + * + * See also ../dom/DOMWalker + */ +var ARIAWalker = /** @class */ (function () { + function ARIAWalker(element, bEnd, root) { + this.root = root || element; + if (this.root.nodeType === 9) { + this.root = this.root.documentElement; + } + this.node = element; + // if (this.node.nodeType === 9) { + // this.node = (this.node as Document).documentElement + // } + this.bEndTag = (bEnd == undefined ? false : bEnd == true); + } + ARIAWalker.prototype.atRoot = function () { + if (this.ownerElement) + return false; + if (this.root === this.node) { + return true; + } + else if (this.root.isSameNode) { + return this.root.isSameNode(this.node); + } + else if (this.root.compareDocumentPosition) { + return this.root.compareDocumentPosition(this.node) === 0; + } + else { + // Not supported in this environment - try our best + return this.node.parentNode === null; + } + }; + ARIAWalker.prototype.nextNode = function () { + var skipOwned = false; + do { + skipOwned = false; + // console.log(this.node.nodeName, this.bEndTag?"END":"START", this.node.nodeType === 1 && (this.node as any).getAttribute("id")); + if (!this.bEndTag) { + var iframeNode = this.node; + var elementNode = this.node; + var slotElement = this.node; + if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && this.node.nodeName.toUpperCase() === "IFRAME" + && VisUtil_1.VisUtil.isNodeVisible(iframeNode) + && iframeNode.contentDocument + && iframeNode.contentDocument.documentElement) { + var ownerElement = this.node; + this.node = iframeNode.contentDocument.documentElement; + this.node.ownerElement = ownerElement; + } + else if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && VisUtil_1.VisUtil.isNodeVisible(elementNode) + && elementNode.shadowRoot + && elementNode.shadowRoot.firstChild) { + var ownerElement = this.node; + this.node = elementNode.shadowRoot; + this.node.ownerElement = ownerElement; + DOMWalker_1.DOMWalker.assignSlots(this.node); + } + else if (this.node.nodeType === 1 + && elementNode.nodeName.toLowerCase() === "slot" + && slotElement.assignedNodes().length > 0) { + this.node = slotElement.assignedNodes()[0]; + } + else if ((this.node.nodeType === 1 /* Node.ELEMENT_NODE */ || this.node.nodeType === 11 /* Node.DOCUMENT_FRAGMENT_NODE */) + && DOMWalker_1.DOMWalker.firstChildNotOwnedBySlot(this.node)) { + this.node = DOMWalker_1.DOMWalker.firstChildNotOwnedBySlot(this.node); + } + else { + this.bEndTag = true; + } + } + else { + if (this.atRoot()) { + return false; + } + else if (this.node.slotOwner) { + var slotOwner = this.node.slotOwner; + var nextSlotIndex = this.node.slotIndex + 1; + // delete (this.node as any).slotOwner; + // delete (this.node as any).slotIndex; + if (nextSlotIndex < slotOwner.assignedNodes().length) { + this.node = slotOwner.assignedNodes()[nextSlotIndex]; + this.bEndTag = false; + } + else { + this.node = slotOwner; + this.bEndTag = true; + } + } + else if (this.node.ownerElement) { + this.node = this.node.ownerElement; + this.bEndTag = true; + } + else if (DOMWalker_1.DOMWalker.nextSiblingNotOwnedBySlot(this.node)) { + this.node = DOMWalker_1.DOMWalker.nextSiblingNotOwnedBySlot(this.node); + this.bEndTag = false; + skipOwned = true; + } + else if (this.node.parentNode) { + if (this.node.parentNode.nodeType === 1 && this.node.parentNode.hasAttribute("aria-owns")) { + var ownIds = this.node.parentNode.getAttribute("aria-owns").split(/ +/g); + if (this.node.nodeType !== 1 || !this.node.hasAttribute("id")) { + this.node = fragment_1.FragmentUtil.getOwnerFragment(this.node).getElementById(ownIds[0]); + this.bEndTag = false; + } + else { + var idx = ownIds.indexOf(this.node.getAttribute("id")); + if (idx === ownIds.length - 1) { + // last one + this.node = this.node.parentNode; + this.bEndTag = true; + } + else { + // grab next + this.node = fragment_1.FragmentUtil.getOwnerFragment(this.node).getElementById(ownIds[idx + 1]); + this.bEndTag = false; + } + } + } + this.node = this.node.parentNode; + this.bEndTag = true; + } + else { + return false; + } + } + } while ((this.node.nodeType !== 1 /* Node.ELEMENT_NODE */ && this.node.nodeType !== 11 && this.node.nodeType !== 3 /* Node.TEXT_NODE */) + || (this.node.nodeType === 1 && this.node.getAttribute("aChecker") === "ACE") + || (skipOwned && this.node.nodeType === 1 && !!ARIAMapper_1.ARIAMapper.getAriaOwnedBy(this.node))); + return true; + }; + ARIAWalker.prototype.prevNode = function () { + var skipOwned = false; + do { + skipOwned = false; + if (this.bEndTag) { + var iframeNode = this.node; + var elementNode = this.node; + if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && this.node.nodeName.toUpperCase() === "IFRAME" + && VisUtil_1.VisUtil.isNodeVisible(iframeNode) + && iframeNode.contentDocument + && iframeNode.contentDocument.documentElement) { + var ownerElement = this.node; + this.node = iframeNode.contentDocument.documentElement; + this.node.ownerElement = ownerElement; + } + else if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && VisUtil_1.VisUtil.isNodeVisible(elementNode) + && elementNode.shadowRoot + && elementNode.shadowRoot.lastChild) { + var ownerElement = this.node; + this.node = elementNode.shadowRoot; + this.node.ownerElement = ownerElement; + DOMWalker_1.DOMWalker.assignSlots(this.node); + } + else if ((this.node.nodeType === 1 /* Node.ELEMENT_NODE */ || this.node.nodeType === 11) + && DOMWalker_1.DOMWalker.lastChildNotOwnedBySlot(this.node)) { + this.node = DOMWalker_1.DOMWalker.lastChildNotOwnedBySlot(this.node); + } + else { + this.bEndTag = false; + } + } + else { + if (this.atRoot()) { + return false; + } + else if (DOMWalker_1.DOMWalker.previousSiblingNotOwnedBySlot(this.node)) { + this.node = DOMWalker_1.DOMWalker.previousSiblingNotOwnedBySlot(this.node); + this.bEndTag = true; + } + else if (this.node.ownerElement) { + this.node = this.node.ownerElement; + this.bEndTag = false; + skipOwned = true; + } + else if (this.node.parentNode) { + if (this.node.parentNode.nodeType === 1 && this.node.parentNode.hasAttribute("aria-owns")) { + var ownIds = this.node.parentNode.getAttribute("aria-owns").split(/ +/g); + if (this.node.nodeType !== 1 || !this.node.hasAttribute("id")) { + this.node = fragment_1.FragmentUtil.getOwnerFragment(this.node).getElementById(ownIds[0]); + this.bEndTag = false; + } + else { + var idx = ownIds.indexOf(this.node.getAttribute("id")); + if (idx === ownIds.length - 1) { + // last one + this.node = this.node.parentNode; + this.bEndTag = true; + } + else { + // grab next + this.node = fragment_1.FragmentUtil.getOwnerFragment(this.node).getElementById(ownIds[idx + 1]); + this.bEndTag = false; + } + } + } + this.node = this.node.parentNode; + this.bEndTag = false; + } + else { + return false; + } + } + } while ((this.node.nodeType !== 1 /* Node.ELEMENT_NODE */ && this.node.nodeType !== 11) + || (this.node.nodeType === 1 && this.node.getAttribute("aChecker") === "ACE") + || (skipOwned && this.node.nodeType === 1 && !!ARIAMapper_1.ARIAMapper.getAriaOwnedBy(this.node))); + return true; + }; + return ARIAWalker; +}()); +exports.ARIAWalker = ARIAWalker; + + +/***/ }, + +/***/ "./src/v2/checker/accessibility/util/ancestor.ts" +/*!*******************************************************!*\ + !*** ./src/v2/checker/accessibility/util/ancestor.ts ***! + \*******************************************************/ +(__unused_webpack_module, exports) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.AncestorUtil = void 0; +var AncestorUtil = /** @class */ (function () { + function AncestorUtil() { + } + AncestorUtil.isPresentationFrame = function (contextHierarchy) { + if (contextHierarchy && contextHierarchy.dom) { + // Skip current node because we want ancestry + for (var idx = contextHierarchy.dom.length - 2; idx >= 0; --idx) { + var elem = contextHierarchy.dom[idx].node; + if (elem.nodeType === 1 + && elem.nodeName.toLowerCase() === "iframe" + && (elem.getAttribute("role") === "presentation" || elem.getAttribute("aria-hidden") === "true")) { + return true; + } + } + } + return false; + }; + AncestorUtil.isFrame = function (contextHierarchy) { + if (contextHierarchy && contextHierarchy.dom) { + // Skip current node because we want ancestry + for (var idx = contextHierarchy.dom.length - 2; idx >= 0; --idx) { + var elem = contextHierarchy.dom[idx].node; + if (elem.nodeType === 1 && elem.nodeName.toLowerCase() === "iframe") { + return true; + } + } + } + return false; + }; + return AncestorUtil; +}()); +exports.AncestorUtil = AncestorUtil; + + +/***/ }, + +/***/ "./src/v2/checker/accessibility/util/fragment.ts" +/*!*******************************************************!*\ + !*** ./src/v2/checker/accessibility/util/fragment.ts ***! + \*******************************************************/ +(__unused_webpack_module, exports) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.FragmentUtil = void 0; +var FragmentUtil = /** @class */ (function () { + function FragmentUtil() { + } + FragmentUtil.getOwnerFragment = function (node) { + var n = node; + while (n.parentNode && (n = n.parentNode)) { + if (n.nodeType === 11) { + return n; + } + } + return node.ownerDocument; + }; + FragmentUtil.getById = function (node, id) { + return this.getOwnerFragment(node).getElementById(id); + }; + FragmentUtil.getAncestor = function (hierarchies, elemName) { + var matches = hierarchies["dom"].filter(function (info) { return info.role === elemName; }); + return matches.length > 0 && matches[0].node || null; + }; + FragmentUtil.getAncestorWithRole = function (hierarchies, role) { + var matches = hierarchies["aria"].filter(function (info) { return info.role === role; }); + return matches.length > 0 && matches[0].node || null; + }; + return FragmentUtil; +}()); +exports.FragmentUtil = FragmentUtil; + + +/***/ }, + +/***/ "./src/v2/checker/accessibility/util/lang.ts" +/*!***************************************************!*\ + !*** ./src/v2/checker/accessibility/util/lang.ts ***! + \***************************************************/ +(__unused_webpack_module, exports) { + + +/****************************************************************************** + Copyright:: 2021- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.LangUtil = void 0; +// From https://www.iana.org/assignments/language-subtag-registry/language-subtag-registry +var validPrimaryLangs = [ + ["aa", "ab", "ae", "af", "ak", "am", "an", "ar", "as", "av", "ay", "az", "aaa", "aab", "aac", "aad", "aae", "aaf", "aag", "aah", "aai", "aak", "aal", "aam", "aan", "aao", "aap", "aaq", "aas", "aat", "aau", "aav", "aaw", "aax", "aaz", "aba", "abb", "abc", "abd", "abe", "abf", "abg", "abh", "abi", "abj", "abl", "abm", "abn", "abo", "abp", "abq", "abr", "abs", "abt", "abu", "abv", "abw", "abx", "aby", "abz", "aca", "acb", "acd", "ace", "acf", "ach", "aci", "ack", "acl", "acm", "acn", "acp", "acq", "acr", "acs", "act", "acu", "acv", "acw", "acx", "acy", "acz", "ada", "adb", "add", "ade", "adf", "adg", "adh", "adi", "adj", "adl", "adn", "ado", "adp", "adq", "adr", "ads", "adt", "adu", "adw", "adx", "ady", "adz", "aea", "aeb", "aec", "aed", "aee", "aek", "ael", "aem", "aen", "aeq", "aer", "aes", "aeu", "aew", "aey", "aez", "afa", "afb", "afd", "afe", "afg", "afh", "afi", "afk", "afn", "afo", "afp", "afs", "aft", "afu", "afz", "aga", "agb", "agc", "agd", "age", "agf", "agg", "agh", "agi", "agj", "agk", "agl", "agm", "agn", "ago", "agp", "agq", "agr", "ags", "agt", "agu", "agv", "agw", "agx", "agy", "agz", "aha", "ahb", "ahg", "ahh", "ahi", "ahk", "ahl", "ahm", "ahn", "aho", "ahp", "ahr", "ahs", "aht", "aia", "aib", "aic", "aid", "aie", "aif", "aig", "aih", "aii", "aij", "aik", "ail", "aim", "ain", "aio", "aip", "aiq", "air", "ais", "ait", "aiw", "aix", "aiy", "aja", "ajg", "aji", "ajn", "ajp", "ajt", "aju", "ajw", "ajz", "akb", "akc", "akd", "ake", "akf", "akg", "akh", "aki", "akj", "akk", "akl", "akm", "ako", "akp", "akq", "akr", "aks", "akt", "aku", "akv", "akw", "akx", "aky", "akz", "ala", "alc", "ald", "ale", "alf", "alg", "alh", "ali", "alj", "alk", "all", "alm", "aln", "alo", "alp", "alq", "alr", "als", "alt", "alu", "alv", "alw", "alx", "aly", "alz", "ama", "amb", "amc", "ame", "amf", "amg", "ami", "amj", "amk", "aml", "amm", "amn", "amo", "amp", "amq", "amr", "ams", "amt", "amu", "amv", "amw", "amx", "amy", "amz", "ana", "anb", "anc", "and", "ane", "anf", "ang", "anh", "ani", "anj", "ank", "anl", "anm", "ann", "ano", "anp", "anq", "anr", "ans", "ant", "anu", "anv", "anw", "anx", "any", "anz", "aoa", "aob", "aoc", "aod", "aoe", "aof", "aog", "aoh", "aoi", "aoj", "aok", "aol", "aom", "aon", "aor", "aos", "aot", "aou", "aox", "aoz", "apa", "apb", "apc", "apd", "ape", "apf", "apg", "aph", "api", "apj", "apk", "apl", "apm", "apn", "apo", "app", "apq", "apr", "aps", "apt", "apu", "apv", "apw", "apx", "apy", "apz", "aqa", "aqc", "aqd", "aqg", "aqk", "aql", "aqm", "aqn", "aqp", "aqr", "aqt", "aqz", "arb", "arc", "ard", "are", "arh", "ari", "arj", "ark", "arl", "arn", "aro", "arp", "arq", "arr", "ars", "art", "aru", "arv", "arw", "arx", "ary", "arz", "asa", "asb", "asc", "asd", "ase", "asf", "asg", "ash", "asi", "asj", "ask", "asl", "asn", "aso", "asp", "asq", "asr", "ass", "ast", "asu", "asv", "asw", "asx", "asy", "asz", "ata", "atb", "atc", "atd", "ate", "atg", "ath", "ati", "atj", "atk", "atl", "atm", "atn", "ato", "atp", "atq", "atr", "ats", "att", "atu", "atv", "atw", "atx", "aty", "atz", "aua", "aub", "auc", "aud", "aue", "auf", "aug", "auh", "aui", "auj", "auk", "aul", "aum", "aun", "auo", "aup", "auq", "aur", "aus", "aut", "auu", "auw", "aux", "auy", "auz", "avb", "avd", "avi", "avk", "avl", "avm", "avn", "avo", "avs", "avt", "avu", "avv", "awa", "awb", "awc", "awd", "awe", "awg", "awh", "awi", "awk", "awm", "awn", "awo", "awr", "aws", "awt", "awu", "awv", "aww", "awx", "awy", "axb", "axe", "axg", "axk", "axl", "axm", "axx", "aya", "ayb", "ayc", "ayd", "aye", "ayg", "ayh", "ayi", "ayk", "ayl", "ayn", "ayo", "ayp", "ayq", "ayr", "ays", "ayt", "ayu", "ayx", "ayy", "ayz", "aza", "azb", "azc", "azd", "azg", "azj", "azm", "azn", "azo", "azt", "azz"], + ["ba", "be", "bg", "bh", "bi", "bm", "bn", "bo", "br", "bs", "baa", "bab", "bac", "bad", "bae", "baf", "bag", "bah", "bai", "baj", "bal", "ban", "bao", "bap", "bar", "bas", "bat", "bau", "bav", "baw", "bax", "bay", "baz", "bba", "bbb", "bbc", "bbd", "bbe", "bbf", "bbg", "bbh", "bbi", "bbj", "bbk", "bbl", "bbm", "bbn", "bbo", "bbp", "bbq", "bbr", "bbs", "bbt", "bbu", "bbv", "bbw", "bbx", "bby", "bbz", "bca", "bcb", "bcc", "bcd", "bce", "bcf", "bcg", "bch", "bci", "bcj", "bck", "bcl", "bcm", "bcn", "bco", "bcp", "bcq", "bcr", "bcs", "bct", "bcu", "bcv", "bcw", "bcy", "bcz", "bda", "bdb", "bdc", "bdd", "bde", "bdf", "bdg", "bdh", "bdi", "bdj", "bdk", "bdl", "bdm", "bdn", "bdo", "bdp", "bdq", "bdr", "bds", "bdt", "bdu", "bdv", "bdw", "bdx", "bdy", "bdz", "bea", "beb", "bec", "bed", "bee", "bef", "beg", "beh", "bei", "bej", "bek", "bem", "beo", "bep", "beq", "ber", "bes", "bet", "beu", "bev", "bew", "bex", "bey", "bez", "bfa", "bfb", "bfc", "bfd", "bfe", "bff", "bfg", "bfh", "bfi", "bfj", "bfk", "bfl", "bfm", "bfn", "bfo", "bfp", "bfq", "bfr", "bfs", "bft", "bfu", "bfw", "bfx", "bfy", "bfz", "bga", "bgb", "bgc", "bgd", "bge", "bgf", "bgg", "bgi", "bgj", "bgk", "bgl", "bgm", "bgn", "bgo", "bgp", "bgq", "bgr", "bgs", "bgt", "bgu", "bgv", "bgw", "bgx", "bgy", "bgz", "bha", "bhb", "bhc", "bhd", "bhe", "bhf", "bhg", "bhh", "bhi", "bhj", "bhk", "bhl", "bhm", "bhn", "bho", "bhp", "bhq", "bhr", "bhs", "bht", "bhu", "bhv", "bhw", "bhx", "bhy", "bhz", "bia", "bib", "bic", "bid", "bie", "bif", "big", "bij", "bik", "bil", "bim", "bin", "bio", "bip", "biq", "bir", "bit", "biu", "biv", "biw", "bix", "biy", "biz", "bja", "bjb", "bjc", "bjd", "bje", "bjf", "bjg", "bjh", "bji", "bjj", "bjk", "bjl", "bjm", "bjn", "bjo", "bjp", "bjq", "bjr", "bjs", "bjt", "bju", "bjv", "bjw", "bjx", "bjy", "bjz", "bka", "bkb", "bkc", "bkd", "bkf", "bkg", "bkh", "bki", "bkj", "bkk", "bkl", "bkm", "bkn", "bko", "bkp", "bkq", "bkr", "bks", "bkt", "bku", "bkv", "bkw", "bkx", "bky", "bkz", "bla", "blb", "blc", "bld", "ble", "blf", "blg", "blh", "bli", "blj", "blk", "bll", "blm", "bln", "blo", "blp", "blq", "blr", "bls", "blt", "blv", "blw", "blx", "bly", "blz", "bma", "bmb", "bmc", "bmd", "bme", "bmf", "bmg", "bmh", "bmi", "bmj", "bmk", "bml", "bmm", "bmn", "bmo", "bmp", "bmq", "bmr", "bms", "bmt", "bmu", "bmv", "bmw", "bmx", "bmy", "bmz", "bna", "bnb", "bnc", "bnd", "bne", "bnf", "bng", "bni", "bnj", "bnk", "bnl", "bnm", "bnn", "bno", "bnp", "bnq", "bnr", "bns", "bnt", "bnu", "bnv", "bnw", "bnx", "bny", "bnz", "boa", "bob", "boe", "bof", "bog", "boh", "boi", "boj", "bok", "bol", "bom", "bon", "boo", "bop", "boq", "bor", "bot", "bou", "bov", "bow", "box", "boy", "boz", "bpa", "bpb", "bpd", "bpe", "bpg", "bph", "bpi", "bpj", "bpk", "bpl", "bpm", "bpn", "bpo", "bpp", "bpq", "bpr", "bps", "bpt", "bpu", "bpv", "bpw", "bpx", "bpy", "bpz", "bqa", "bqb", "bqc", "bqd", "bqf", "bqg", "bqh", "bqi", "bqj", "bqk", "bql", "bqm", "bqn", "bqo", "bqp", "bqq", "bqr", "bqs", "bqt", "bqu", "bqv", "bqw", "bqx", "bqy", "bqz", "bra", "brb", "brc", "brd", "brf", "brg", "brh", "bri", "brj", "brk", "brl", "brm", "brn", "bro", "brp", "brq", "brr", "brs", "brt", "bru", "brv", "brw", "brx", "bry", "brz", "bsa", "bsb", "bsc", "bse", "bsf", "bsg", "bsh", "bsi", "bsj", "bsk", "bsl", "bsm", "bsn", "bso", "bsp", "bsq", "bsr", "bss", "bst", "bsu", "bsv", "bsw", "bsx", "bsy", "bta", "btb", "btc", "btd", "bte", "btf", "btg", "bth", "bti", "btj", "btk", "btl", "btm", "btn", "bto", "btp", "btq", "btr", "bts", "btt", "btu", "btv", "btw", "btx", "bty", "btz", "bua", "bub", "buc", "bud", "bue", "buf", "bug", "buh", "bui", "buj", "buk", "bum", "bun", "buo", "bup", "buq", "bus", "but", "buu", "buv", "buw", "bux", "buy", "buz", "bva", "bvb", "bvc", "bvd", "bve", "bvf", "bvg", "bvh", "bvi", "bvj", "bvk", "bvl", "bvm", "bvn", "bvo", "bvp", "bvq", "bvr", "bvt", "bvu", "bvv", "bvw", "bvx", "bvy", "bvz", "bwa", "bwb", "bwc", "bwd", "bwe", "bwf", "bwg", "bwh", "bwi", "bwj", "bwk", "bwl", "bwm", "bwn", "bwo", "bwp", "bwq", "bwr", "bws", "bwt", "bwu", "bww", "bwx", "bwy", "bwz", "bxa", "bxb", "bxc", "bxd", "bxe", "bxf", "bxg", "bxh", "bxi", "bxj", "bxk", "bxl", "bxm", "bxn", "bxo", "bxp", "bxq", "bxr", "bxs", "bxu", "bxv", "bxw", "bxx", "bxz", "bya", "byb", "byc", "byd", "bye", "byf", "byg", "byh", "byi", "byj", "byk", "byl", "bym", "byn", "byo", "byp", "byq", "byr", "bys", "byt", "byv", "byw", "byx", "byy", "byz", "bza", "bzb", "bzc", "bzd", "bze", "bzf", "bzg", "bzh", "bzi", "bzj", "bzk", "bzl", "bzm", "bzn", "bzo", "bzp", "bzq", "bzr", "bzs", "bzt", "bzu", "bzv", "bzw", "bzx", "bzy", "bzz"], + ["ca", "ce", "ch", "co", "cr", "cs", "cu", "cv", "cy", "caa", "cab", "cac", "cad", "cae", "caf", "cag", "cah", "cai", "caj", "cak", "cal", "cam", "can", "cao", "cap", "caq", "car", "cas", "cau", "cav", "caw", "cax", "cay", "caz", "cba", "cbb", "cbc", "cbd", "cbe", "cbg", "cbh", "cbi", "cbj", "cbk", "cbl", "cbn", "cbo", "cbq", "cbr", "cbs", "cbt", "cbu", "cbv", "cbw", "cby", "cca", "ccc", "ccd", "cce", "ccg", "cch", "ccj", "ccl", "ccm", "ccn", "cco", "ccp", "ccq", "ccr", "ccs", "cda", "cdc", "cdd", "cde", "cdf", "cdg", "cdh", "cdi", "cdj", "cdm", "cdn", "cdo", "cdr", "cds", "cdy", "cdz", "cea", "ceb", "ceg", "cek", "cel", "cen", "cet", "cey", "cfa", "cfd", "cfg", "cfm", "cga", "cgc", "cgg", "cgk", "chb", "chc", "chd", "chf", "chg", "chh", "chj", "chk", "chl", "chm", "chn", "cho", "chp", "chq", "chr", "cht", "chw", "chx", "chy", "chz", "cia", "cib", "cic", "cid", "cie", "cih", "cik", "cim", "cin", "cip", "cir", "ciw", "ciy", "cja", "cje", "cjh", "cji", "cjk", "cjm", "cjn", "cjo", "cjp", "cjr", "cjs", "cjv", "cjy", "cka", "ckb", "ckh", "ckl", "ckm", "ckn", "cko", "ckq", "ckr", "cks", "ckt", "cku", "ckv", "ckx", "cky", "ckz", "cla", "clc", "cld", "cle", "clh", "cli", "clj", "clk", "cll", "clm", "clo", "clt", "clu", "clw", "cly", "cma", "cmc", "cme", "cmg", "cmi", "cmk", "cml", "cmm", "cmn", "cmo", "cmr", "cms", "cmt", "cna", "cnb", "cnc", "cng", "cnh", "cni", "cnk", "cnl", "cno", "cnp", "cnr", "cns", "cnt", "cnu", "cnw", "cnx", "coa", "cob", "coc", "cod", "coe", "cof", "cog", "coh", "coj", "cok", "col", "com", "con", "coo", "cop", "coq", "cot", "cou", "cov", "cow", "cox", "coy", "coz", "cpa", "cpb", "cpc", "cpe", "cpf", "cpg", "cpi", "cpn", "cpo", "cpp", "cps", "cpu", "cpx", "cpy", "cqd", "cqu", "cra", "crb", "crc", "crd", "crf", "crg", "crh", "cri", "crj", "crk", "crl", "crm", "crn", "cro", "crp", "crq", "crr", "crs", "crt", "crv", "crw", "crx", "cry", "crz", "csa", "csb", "csc", "csd", "cse", "csf", "csg", "csh", "csi", "csj", "csk", "csl", "csm", "csn", "cso", "csp", "csq", "csr", "css", "cst", "csu", "csv", "csw", "csx", "csy", "csz", "cta", "ctc", "ctd", "cte", "ctg", "cth", "ctl", "ctm", "ctn", "cto", "ctp", "cts", "ctt", "ctu", "cty", "ctz", "cua", "cub", "cuc", "cug", "cuh", "cui", "cuj", "cuk", "cul", "cum", "cuo", "cup", "cuq", "cur", "cus", "cut", "cuu", "cuv", "cuw", "cux", "cuy", "cvg", "cvn", "cwa", "cwb", "cwd", "cwe", "cwg", "cwt", "cya", "cyb", "cyo", "czh", "czk", "czn", "czo", "czt"], + ["da", "de", "dv", "dz", "daa", "dac", "dad", "dae", "daf", "dag", "dah", "dai", "daj", "dak", "dal", "dam", "dao", "dap", "daq", "dar", "das", "dau", "dav", "daw", "dax", "day", "daz", "dba", "dbb", "dbd", "dbe", "dbf", "dbg", "dbi", "dbj", "dbl", "dbm", "dbn", "dbo", "dbp", "dbq", "dbr", "dbt", "dbu", "dbv", "dbw", "dby", "dcc", "dcr", "dda", "ddd", "dde", "ddg", "ddi", "ddj", "ddn", "ddo", "ddr", "dds", "ddw", "dec", "ded", "dee", "def", "deg", "deh", "dei", "dek", "del", "dem", "den", "dep", "deq", "der", "des", "dev", "dez", "dga", "dgb", "dgc", "dgd", "dge", "dgg", "dgh", "dgi", "dgk", "dgl", "dgn", "dgo", "dgr", "dgs", "dgt", "dgu", "dgw", "dgx", "dgz", "dha", "dhd", "dhg", "dhi", "dhl", "dhm", "dhn", "dho", "dhr", "dhs", "dhu", "dhv", "dhw", "dhx", "dia", "dib", "dic", "did", "dif", "dig", "dih", "dii", "dij", "dik", "dil", "dim", "din", "dio", "dip", "diq", "dir", "dis", "dit", "diu", "diw", "dix", "diy", "diz", "dja", "djb", "djc", "djd", "dje", "djf", "dji", "djj", "djk", "djl", "djm", "djn", "djo", "djr", "dju", "djw", "dka", "dkg", "dkk", "dkl", "dkr", "dks", "dkx", "dlg", "dlk", "dlm", "dln", "dma", "dmb", "dmc", "dmd", "dme", "dmf", "dmg", "dmk", "dml", "dmm", "dmn", "dmo", "dmr", "dms", "dmu", "dmv", "dmw", "dmx", "dmy", "dna", "dnd", "dne", "dng", "dni", "dnj", "dnk", "dnn", "dno", "dnr", "dnt", "dnu", "dnv", "dnw", "dny", "doa", "dob", "doc", "doe", "dof", "doh", "doi", "dok", "dol", "don", "doo", "dop", "doq", "dor", "dos", "dot", "dov", "dow", "dox", "doy", "doz", "dpp", "dra", "drb", "drc", "drd", "dre", "drg", "drh", "dri", "drl", "drn", "dro", "drq", "drr", "drs", "drt", "dru", "drw", "dry", "dsb", "dse", "dsh", "dsi", "dsl", "dsn", "dso", "dsq", "dta", "dtb", "dtd", "dth", "dti", "dtk", "dtm", "dtn", "dto", "dtp", "dtr", "dts", "dtt", "dtu", "dty", "dua", "dub", "duc", "dud", "due", "duf", "dug", "duh", "dui", "duj", "duk", "dul", "dum", "dun", "duo", "dup", "duq", "dur", "dus", "duu", "duv", "duw", "dux", "duy", "duz", "dva", "dwa", "dwk", "dwl", "dwr", "dws", "dwu", "dww", "dwy", "dwz", "dya", "dyb", "dyd", "dyg", "dyi", "dym", "dyn", "dyo", "dyu", "dyy", "dza", "dzd", "dze", "dzg", "dzl", "dzn"], + ["ee", "el", "en", "eo", "es", "et", "eu", "eaa", "ebc", "ebg", "ebk", "ebo", "ebr", "ebu", "ecr", "ecs", "ecy", "eee", "efa", "efe", "efi", "ega", "egl", "ego", "egx", "egy", "ehs", "ehu", "eip", "eit", "eiv", "eja", "eka", "ekc", "eke", "ekg", "eki", "ekk", "ekl", "ekm", "eko", "ekp", "ekr", "eky", "ele", "elh", "eli", "elk", "elm", "elo", "elp", "elu", "elx", "ema", "emb", "eme", "emg", "emi", "emk", "emm", "emn", "emo", "emp", "emq", "ems", "emu", "emw", "emx", "emy", "emz", "ena", "enb", "enc", "end", "enf", "enh", "enl", "enm", "enn", "eno", "enq", "enr", "enu", "env", "enw", "enx", "eot", "epi", "era", "erg", "erh", "eri", "erk", "ero", "err", "ers", "ert", "erw", "ese", "esg", "esh", "esi", "esk", "esl", "esm", "esn", "eso", "esq", "ess", "esu", "esx", "esy", "etb", "etc", "eth", "etn", "eto", "etr", "ets", "ett", "etu", "etx", "etz", "euq", "eve", "evh", "evn", "ewo", "ext", "eya", "eyo", "eza", "eze"], + ["fa", "ff", "fi", "fj", "fo", "fr", "fy", "faa", "fab", "fad", "faf", "fag", "fah", "fai", "faj", "fak", "fal", "fam", "fan", "fap", "far", "fat", "fau", "fax", "fay", "faz", "fbl", "fcs", "fer", "ffi", "ffm", "fgr", "fia", "fie", "fif", "fil", "fip", "fir", "fit", "fiu", "fiw", "fkk", "fkv", "fla", "flh", "fli", "fll", "fln", "flr", "fly", "fmp", "fmu", "fnb", "fng", "fni", "fod", "foi", "fom", "fon", "for", "fos", "fox", "fpe", "fqs", "frc", "frd", "frk", "frm", "fro", "frp", "frq", "frr", "frs", "frt", "fse", "fsl", "fss", "fub", "fuc", "fud", "fue", "fuf", "fuh", "fui", "fuj", "fum", "fun", "fuq", "fur", "fut", "fuu", "fuv", "fuy", "fvr", "fwa", "fwe"], + ["ga", "gd", "gl", "gn", "gu", "gv", "gaa", "gab", "gac", "gad", "gae", "gaf", "gag", "gah", "gai", "gaj", "gak", "gal", "gam", "gan", "gao", "gap", "gaq", "gar", "gas", "gat", "gau", "gav", "gaw", "gax", "gay", "gaz", "gba", "gbb", "gbc", "gbd", "gbe", "gbf", "gbg", "gbh", "gbi", "gbj", "gbk", "gbl", "gbm", "gbn", "gbo", "gbp", "gbq", "gbr", "gbs", "gbu", "gbv", "gbw", "gbx", "gby", "gbz", "gcc", "gcd", "gce", "gcf", "gcl", "gcn", "gcr", "gct", "gda", "gdb", "gdc", "gdd", "gde", "gdf", "gdg", "gdh", "gdi", "gdj", "gdk", "gdl", "gdm", "gdn", "gdo", "gdq", "gdr", "gds", "gdt", "gdu", "gdx", "gea", "geb", "gec", "ged", "gef", "geg", "geh", "gei", "gej", "gek", "gel", "gem", "geq", "ges", "gev", "gew", "gex", "gey", "gez", "gfk", "gft", "gfx", "gga", "ggb", "ggd", "gge", "ggg", "ggk", "ggl", "ggn", "ggo", "ggr", "ggt", "ggu", "ggw", "gha", "ghc", "ghe", "ghh", "ghk", "ghl", "ghn", "gho", "ghr", "ghs", "ght", "gia", "gib", "gic", "gid", "gie", "gig", "gih", "gii", "gil", "gim", "gin", "gio", "gip", "giq", "gir", "gis", "git", "giu", "giw", "gix", "giy", "giz", "gji", "gjk", "gjm", "gjn", "gjr", "gju", "gka", "gkd", "gke", "gkn", "gko", "gkp", "gku", "glb", "glc", "gld", "glh", "gli", "glj", "glk", "gll", "glo", "glr", "glu", "glw", "gly", "gma", "gmb", "gmd", "gme", "gmg", "gmh", "gml", "gmm", "gmn", "gmq", "gmr", "gmu", "gmv", "gmw", "gmx", "gmy", "gmz", "gna", "gnb", "gnc", "gnd", "gne", "gng", "gnh", "gni", "gnj", "gnk", "gnl", "gnm", "gnn", "gno", "gnq", "gnr", "gnt", "gnu", "gnw", "gnz", "goa", "gob", "goc", "god", "goe", "gof", "gog", "goh", "goi", "goj", "gok", "gol", "gom", "gon", "goo", "gop", "goq", "gor", "gos", "got", "gou", "gow", "gox", "goy", "goz", "gpa", "gpe", "gpn", "gqa", "gqi", "gqn", "gqr", "gqu", "gra", "grb", "grc", "grd", "grg", "grh", "gri", "grj", "grk", "grm", "gro", "grq", "grr", "grs", "grt", "gru", "grv", "grw", "grx", "gry", "grz", "gse", "gsg", "gsl", "gsm", "gsn", "gso", "gsp", "gss", "gsw", "gta", "gti", "gtu", "gua", "gub", "guc", "gud", "gue", "guf", "gug", "guh", "gui", "guk", "gul", "gum", "gun", "guo", "gup", "guq", "gur", "gus", "gut", "guu", "guv", "guw", "gux", "guz", "gva", "gvc", "gve", "gvf", "gvj", "gvl", "gvm", "gvn", "gvo", "gvp", "gvr", "gvs", "gvy", "gwa", "gwb", "gwc", "gwd", "gwe", "gwf", "gwg", "gwi", "gwj", "gwm", "gwn", "gwr", "gwt", "gwu", "gww", "gwx", "gxx", "gya", "gyb", "gyd", "gye", "gyf", "gyg", "gyi", "gyl", "gym", "gyn", "gyo", "gyr", "gyy", "gyz", "gza", "gzi", "gzn"], + ["ha", "he", "hi", "ho", "hr", "ht", "hu", "hy", "hz", "haa", "hab", "hac", "had", "hae", "haf", "hag", "hah", "hai", "haj", "hak", "hal", "ham", "han", "hao", "hap", "haq", "har", "has", "hav", "haw", "hax", "hay", "haz", "hba", "hbb", "hbn", "hbo", "hbu", "hca", "hch", "hdn", "hds", "hdy", "hea", "hed", "heg", "heh", "hei", "hem", "hgm", "hgw", "hhi", "hhr", "hhy", "hia", "hib", "hid", "hif", "hig", "hih", "hii", "hij", "hik", "hil", "him", "hio", "hir", "hit", "hiw", "hix", "hji", "hka", "hke", "hkh", "hkk", "hkn", "hks", "hla", "hlb", "hld", "hle", "hlt", "hlu", "hma", "hmb", "hmc", "hmd", "hme", "hmf", "hmg", "hmh", "hmi", "hmj", "hmk", "hml", "hmm", "hmn", "hmp", "hmq", "hmr", "hms", "hmt", "hmu", "hmv", "hmw", "hmx", "hmy", "hmz", "hna", "hnd", "hne", "hng", "hnh", "hni", "hnj", "hnn", "hno", "hns", "hnu", "hoa", "hob", "hoc", "hod", "hoe", "hoh", "hoi", "hoj", "hok", "hol", "hom", "hoo", "hop", "hor", "hos", "hot", "hov", "how", "hoy", "hoz", "hpo", "hps", "hra", "hrc", "hre", "hrk", "hrm", "hro", "hrp", "hrr", "hrt", "hru", "hrw", "hrx", "hrz", "hsb", "hsh", "hsl", "hsn", "hss", "hti", "hto", "hts", "htu", "htx", "hub", "huc", "hud", "hue", "huf", "hug", "huh", "hui", "huj", "huk", "hul", "hum", "huo", "hup", "huq", "hur", "hus", "hut", "huu", "huv", "huw", "hux", "huy", "huz", "hvc", "hve", "hvk", "hvn", "hvv", "hwa", "hwc", "hwo", "hya", "hyw", "hyx"], + ["ia", "id", "ie", "ig", "ii", "ik", "in", "io", "is", "it", "iu", "iw", "iai", "ian", "iap", "iar", "iba", "ibb", "ibd", "ibe", "ibg", "ibh", "ibi", "ibl", "ibm", "ibn", "ibr", "ibu", "iby", "ica", "ich", "icl", "icr", "ida", "idb", "idc", "idd", "ide", "idi", "idr", "ids", "idt", "idu", "ifa", "ifb", "ife", "iff", "ifk", "ifm", "ifu", "ify", "igb", "ige", "igg", "igl", "igm", "ign", "igo", "igs", "igw", "ihb", "ihi", "ihp", "ihw", "iin", "iir", "ijc", "ije", "ijj", "ijn", "ijo", "ijs", "ike", "iki", "ikk", "ikl", "iko", "ikp", "ikr", "iks", "ikt", "ikv", "ikw", "ikx", "ikz", "ila", "ilb", "ilg", "ili", "ilk", "ill", "ilm", "ilo", "ilp", "ils", "ilu", "ilv", "ilw", "ima", "ime", "imi", "iml", "imn", "imo", "imr", "ims", "imy", "inb", "inc", "ine", "ing", "inh", "inj", "inl", "inm", "inn", "ino", "inp", "ins", "int", "inz", "ior", "iou", "iow", "ipi", "ipo", "iqu", "iqw", "ira", "ire", "irh", "iri", "irk", "irn", "iro", "irr", "iru", "irx", "iry", "isa", "isc", "isd", "ise", "isg", "ish", "isi", "isk", "ism", "isn", "iso", "isr", "ist", "isu", "itb", "itc", "itd", "ite", "iti", "itk", "itl", "itm", "ito", "itr", "its", "itt", "itv", "itw", "itx", "ity", "itz", "ium", "ivb", "ivv", "iwk", "iwm", "iwo", "iws", "ixc", "ixl", "iya", "iyo", "iyx", "izh", "izi", "izr", "izz"], + ["ja", "ji", "jv", "jw", "jaa", "jab", "jac", "jad", "jae", "jaf", "jah", "jaj", "jak", "jal", "jam", "jan", "jao", "jaq", "jar", "jas", "jat", "jau", "jax", "jay", "jaz", "jbe", "jbi", "jbj", "jbk", "jbm", "jbn", "jbo", "jbr", "jbt", "jbu", "jbw", "jcs", "jct", "jda", "jdg", "jdt", "jeb", "jee", "jeg", "jeh", "jei", "jek", "jel", "jen", "jer", "jet", "jeu", "jgb", "jge", "jgk", "jgo", "jhi", "jhs", "jia", "jib", "jic", "jid", "jie", "jig", "jih", "jii", "jil", "jim", "jio", "jiq", "jit", "jiu", "jiv", "jiy", "jje", "jjr", "jka", "jkm", "jko", "jkp", "jkr", "jks", "jku", "jle", "jls", "jma", "jmb", "jmc", "jmd", "jmi", "jml", "jmn", "jmr", "jms", "jmw", "jmx", "jna", "jnd", "jng", "jni", "jnj", "jnl", "jns", "job", "jod", "jog", "jor", "jos", "jow", "jpa", "jpr", "jpx", "jqr", "jra", "jrb", "jrr", "jrt", "jru", "jsl", "jua", "jub", "juc", "jud", "juh", "jui", "juk", "jul", "jum", "jun", "juo", "jup", "jur", "jus", "jut", "juu", "juw", "juy", "jvd", "jvn", "jwi", "jya", "jye", "jyy"], + ["ka", "kg", "ki", "kj", "kk", "kl", "km", "kn", "ko", "kr", "ks", "ku", "kv", "kw", "ky", "kaa", "kab", "kac", "kad", "kae", "kaf", "kag", "kah", "kai", "kaj", "kak", "kam", "kao", "kap", "kaq", "kar", "kav", "kaw", "kax", "kay", "kba", "kbb", "kbc", "kbd", "kbe", "kbf", "kbg", "kbh", "kbi", "kbj", "kbk", "kbl", "kbm", "kbn", "kbo", "kbp", "kbq", "kbr", "kbs", "kbt", "kbu", "kbv", "kbw", "kbx", "kby", "kbz", "kca", "kcb", "kcc", "kcd", "kce", "kcf", "kcg", "kch", "kci", "kcj", "kck", "kcl", "kcm", "kcn", "kco", "kcp", "kcq", "kcr", "kcs", "kct", "kcu", "kcv", "kcw", "kcx", "kcy", "kcz", "kda", "kdc", "kdd", "kde", "kdf", "kdg", "kdh", "kdi", "kdj", "kdk", "kdl", "kdm", "kdn", "kdo", "kdp", "kdq", "kdr", "kdt", "kdu", "kdv", "kdw", "kdx", "kdy", "kdz", "kea", "keb", "kec", "ked", "kee", "kef", "keg", "keh", "kei", "kej", "kek", "kel", "kem", "ken", "keo", "kep", "keq", "ker", "kes", "ket", "keu", "kev", "kew", "kex", "key", "kez", "kfa", "kfb", "kfc", "kfd", "kfe", "kff", "kfg", "kfh", "kfi", "kfj", "kfk", "kfl", "kfm", "kfn", "kfo", "kfp", "kfq", "kfr", "kfs", "kft", "kfu", "kfv", "kfw", "kfx", "kfy", "kfz", "kga", "kgb", "kgc", "kgd", "kge", "kgf", "kgg", "kgh", "kgi", "kgj", "kgk", "kgl", "kgm", "kgn", "kgo", "kgp", "kgq", "kgr", "kgs", "kgt", "kgu", "kgv", "kgw", "kgx", "kgy", "kha", "lyg", "khb", "khc", "khd", "khe", "khf", "khg", "khh", "khi", "khj", "khk", "khl", "khn", "kho", "khp", "khq", "khr", "khs", "kht", "khu", "khv", "khw", "khx", "khy", "khz", "kia", "kib", "kic", "kid", "kie", "kif", "kig", "kih", "kii", "kij", "kil", "kim", "kio", "kip", "kiq", "kis", "kit", "kiu", "kiv", "kiw", "kix", "kiy", "kiz", "kja", "kjb", "kjc", "kjd", "kje", "kjf", "kjg", "kjh", "kji", "kjj", "kjk", "kjl", "kjm", "kjn", "kjo", "kjp", "kjq", "kjr", "kjs", "kjt", "kju", "kjv", "kjx", "kjy", "kjz", "kka", "kkb", "kkc", "kkd", "kke", "kkf", "kkg", "kkh", "kki", "kkj", "kkk", "kkl", "kkm", "kkn", "kko", "kkp", "kkq", "kkr", "kks", "kkt", "kku", "kkv", "kkw", "kkx", "kky", "kkz", "kla", "klb", "klc", "kld", "kle", "klf", "klg", "klh", "kli", "klj", "klk", "kll", "klm", "kln", "klo", "klp", "klq", "klr", "kls", "klt", "klu", "klv", "klw", "klx", "kly", "klz", "kma", "kmb", "kmc", "kmd", "kme", "kmf", "kmg", "kmh", "kmi", "kmj", "kmk", "kml", "kmm", "kmn", "kmo", "kmp", "kmq", "kmr", "kms", "kmt", "kmu", "kmv", "kmw", "kmx", "kmy", "kmz", "kna", "knb", "knc", "knd", "kne", "knf", "kng", "kni", "knj", "knk", "knl", "knm", "knn", "kno", "knp", "knq", "knr", "kns", "knt", "knu", "knv", "knw", "knx", "kny", "knz", "koa", "koc", "kod", "koe", "kof", "kog", "koh", "koi", "koj", "kok", "kol", "koo", "kop", "koq", "kos", "kot", "kou", "kov", "kow", "kox", "koy", "koz", "kpa", "kpb", "kpc", "kpd", "kpe", "kpf", "kpg", "kph", "kpi", "kpj", "kpk", "kpl", "kpm", "kpn", "kpo", "kpp", "kpq", "kpr", "kps", "kpt", "kpu", "kpv", "kpw", "kpx", "kpy", "kpz", "kqa", "kqb", "kqc", "kqd", "kqe", "kqf", "kqg", "kqh", "kqi", "kqj", "kqk", "kql", "kqm", "kqn", "kqo", "kqp", "kqq", "kqr", "kqs", "kqt", "kqu", "kqv", "kqw", "kqx", "kqy", "kqz", "kra", "krb", "krc", "krd", "kre", "krf", "krh", "kri", "krj", "krk", "krl", "krm", "krn", "kro", "krp", "krr", "krs", "krt", "kru", "krv", "krw", "krx", "kry", "krz", "ksa", "ksb", "ksc", "ksd", "kse", "ksf", "ksg", "ksh", "ksi", "ksj", "ksk", "ksl", "ksm", "ksn", "kso", "ksp", "ksq", "ksr", "kss", "kst", "ksu", "ksv", "ksw", "ksx", "ksy", "ksz", "kta", "ktb", "ktc", "ktd", "kte", "ktf", "ktg", "kth", "kti", "ktj", "ktk", "ktl", "ktm", "ktn", "kto", "ktp", "ktq", "ktr", "kts", "ktt", "ktu", "ktv", "ktw", "ktx", "kty", "ktz", "kub", "kuc", "kud", "kue", "kuf", "kug", "kuh", "kui", "kuj", "kuk", "kul", "kum", "kun", "kuo", "kup", "kuq", "kus", "kut", "kuu", "kuv", "kuw", "kux", "kuy", "kuz", "kva", "kvb", "kvc", "kvd", "kve", "kvf", "kvg", "kvh", "kvi", "kvj", "kvk", "kvl", "kvm", "kvn", "kvo", "kvp", "kvq", "kvr", "kvs", "kvt", "kvu", "kvv", "kvw", "kvx", "kvy", "kvz", "kwa", "kwb", "kwc", "kwd", "kwe", "kwf", "kwg", "kwh", "kwi", "kwj", "kwk", "kwl", "kwm", "kwn", "kwo", "kwp", "kwq", "kwr", "kws", "kwt", "kwu", "kwv", "kww", "kwx", "kwy", "kwz", "kxa", "kxb", "kxc", "kxd", "kxe", "kxf", "kxh", "kxi", "kxj", "kxk", "kxl", "kxm", "kxn", "kxo", "kxp", "kxq", "kxr", "kxs", "kxt", "kxu", "kxv", "kxw", "kxx", "kxy", "kxz", "kya", "kyb", "kyc", "kyd", "kye", "kyf", "kyg", "kyh", "kyi", "kyj", "kyk", "kyl", "kym", "kyn", "kyo", "kyp", "kyq", "kyr", "kys", "kyt", "kyu", "kyv", "kyw", "kyx", "kyy", "kyz", "kza", "kzb", "kzc", "kzd", "kze", "kzf", "kzg", "kzh", "kzi", "kzj", "kzk", "kzl", "kzm", "kzn", "kzo", "kzp", "kzq", "kzr", "kzs", "kzt", "kzu", "kzv", "kzw", "kzx", "kzy", "kzz"], + ["la", "lb", "lg", "li", "ln", "lo", "lt", "lu", "lv", "laa", "lab", "lac", "lad", "lae", "laf", "lag", "lah", "lai", "laj", "lak", "lal", "lam", "lan", "lap", "laq", "lar", "las", "lau", "law", "lax", "lay", "laz", "lba", "lbb", "lbc", "lbe", "lbf", "lbg", "lbi", "lbj", "lbk", "lbl", "lbm", "lbn", "lbo", "lbq", "lbr", "lbs", "lbt", "lbu", "lbv", "lbw", "lbx", "lby", "lbz", "lcc", "lcd", "lce", "lcf", "lch", "lcl", "lcm", "lcp", "lcq", "lcs", "lda", "ldb", "ldd", "ldg", "ldh", "ldi", "ldj", "ldk", "ldl", "ldm", "ldn", "ldo", "ldp", "ldq", "lea", "leb", "lec", "led", "lee", "lef", "leg", "leh", "lei", "lej", "lek", "lel", "lem", "len", "leo", "lep", "leq", "ler", "les", "let", "leu", "lev", "lew", "lex", "ley", "lez", "lfa", "lfn", "lga", "lgb", "lgg", "lgh", "lgi", "lgk", "lgl", "lgm", "lgn", "lgq", "lgr", "lgt", "lgu", "lgz", "lha", "lhh", "lhi", "lhl", "lhm", "lhn", "lhp", "lhs", "lht", "lhu", "lia", "lib", "lic", "lid", "lie", "lif", "lig", "lih", "lii", "lij", "lik", "lil", "lio", "lip", "liq", "lir", "lis", "liu", "liv", "liw", "lix", "liy", "liz", "lja", "lje", "lji", "ljl", "ljp", "ljw", "ljx", "lka", "lkb", "lkc", "lkd", "lke", "lkh", "lki", "lkj", "lkl", "lkm", "lkn", "lko", "lkr", "lks", "lkt", "lku", "lky", "lla", "llb", "llc", "lld", "lle", "llf", "llg", "llh", "lli", "llj", "llk", "lll", "llm", "lln", "llo", "llp", "llq", "lls", "llu", "llx", "lma", "lmb", "lmc", "lmd", "lme", "lmf", "lmg", "lmh", "lmi", "lmj", "lmk", "lml", "lmm", "lmn", "lmo", "lmp", "lmq", "lmr", "lmu", "lmv", "lmw", "lmx", "lmy", "lmz", "lna", "lnb", "lnd", "lng", "lnh", "lni", "lnj", "lnl", "lnm", "lnn", "lno", "lns", "lnu", "lnw", "lnz", "loa", "lob", "loc", "loe", "lof", "log", "loh", "loi", "loj", "lok", "lol", "lom", "lon", "loo", "lop", "loq", "lor", "los", "lot", "lou", "lov", "low", "lox", "loy", "loz", "lpa", "lpe", "lpn", "lpo", "lpx", "lra", "lrc", "lre", "lrg", "lri", "lrk", "lrl", "lrm", "lrn", "lro", "lrr", "lrt", "lrv", "lrz", "lsa", "lsb", "lsd", "lse", "lsg", "lsh", "lsi", "lsl", "lsm", "lsn", "lso", "lsp", "lsr", "lss", "lst", "lsv", "lsy", "ltc", "ltg", "lth", "lti", "ltn", "lto", "lts", "ltu", "lua", "luc", "lud", "lue", "luf", "lui", "luj", "luk", "lul", "lum", "lun", "luo", "lup", "luq", "lur", "lus", "lut", "luu", "luv", "luw", "luy", "luz", "lva", "lvi", "lvk", "lvs", "lvu", "lwa", "lwe", "lwg", "lwh", "lwl", "lwm", "lwo", "lws", "lwt", "lwu", "lww", "lxm", "lya", "lyg", "lyn", "lzh", "lzl", "lzn", "lzz"], + ["mg", "mh", "mi", "mk", "ml", "mn", "mo", "mr", "ms", "mt", "my", "maa", "mab", "mad", "mae", "maf", "mag", "mai", "maj", "mak", "mam", "man", "map", "maq", "mas", "mat", "mau", "mav", "maw", "max", "maz", "mba", "mbb", "mbc", "mbd", "mbe", "mbf", "mbh", "mbi", "mbj", "mbk", "mbl", "mbm", "mbn", "mbo", "mbp", "mbq", "mbr", "mbs", "mbt", "mbu", "mbv", "mbw", "mbx", "mby", "mbz", "mca", "mcb", "mcc", "mcd", "mce", "mcf", "mcg", "mch", "mci", "mcj", "mck", "mcl", "mcm", "mcn", "mco", "mcp", "mcq", "mcr", "mcs", "mct", "mcu", "mcv", "mcw", "mcx", "mcy", "mcz", "mda", "mdb", "mdc", "mdd", "mde", "mdf", "mdg", "mdh", "mdi", "mdj", "mdk", "mdl", "mdm", "mdn", "mdp", "mdq", "mdr", "mds", "mdt", "mdu", "mdv", "mdw", "mdx", "mdy", "mdz", "mea", "meb", "mec", "med", "mee", "mef", "meg", "meh", "mei", "mej", "mek", "mel", "mem", "men", "meo", "mep", "meq", "mer", "mes", "met", "meu", "mev", "mew", "mey", "mez", "mfa", "mfb", "mfc", "mfd", "mfe", "mff", "mfg", "mfh", "mfi", "mfj", "mfk", "mfl", "mfm", "mfn", "mfo", "mfp", "mfq", "mfr", "mfs", "mft", "mfu", "mfv", "mfw", "mfx", "mfy", "mfz", "mga", "mgb", "mgc", "mgd", "mge", "mgf", "mgg", "mgh", "mgi", "mgj", "mgk", "mgl", "mgm", "mgn", "mgo", "mgp", "mgq", "mgr", "mgs", "mgt", "mgu", "mgv", "mgw", "mgx", "mgy", "mgz", "mha", "mhb", "mhc", "mhd", "mhe", "mhf", "mhg", "mhh", "mhi", "mhj", "mhk", "mhl", "mhm", "mhn", "mho", "mhp", "mhq", "mhr", "mhs", "mht", "mhu", "mhw", "mhx", "mhy", "mhz", "mia", "mib", "mic", "mid", "mie", "mif", "mig", "mih", "mii", "mij", "mik", "mil", "mim", "min", "mio", "mip", "miq", "mir", "mis", "mit", "miu", "miw", "mix", "miy", "miz", "mja", "mjb", "mjc", "mjd", "mje", "mjg", "mjh", "mji", "mjj", "mjk", "mjl", "mjm", "mjn", "mjo", "mjp", "mjq", "mjr", "mjs", "mjt", "mju", "mjv", "mjw", "mjx", "mjy", "mjz", "mka", "mkb", "mkc", "mke", "mkf", "mkg", "mkh", "mki", "mkj", "mkk", "mkl", "mkm", "mkn", "mko", "mkp", "mkq", "mkr", "mks", "mkt", "mku", "mkv", "mkw", "mkx", "mky", "mkz", "mla", "mlb", "mlc", "mld", "mle", "mlf", "mlh", "mli", "mlj", "mlk", "mll", "mlm", "mln", "mlo", "mlp", "mlq", "mlr", "mls", "mlu", "mlv", "mlw", "mlx", "mlz", "mma", "mmb", "mmc", "mmd", "mme", "mmf", "mmg", "mmh", "mmi", "mmj", "mmk", "mml", "mmm", "mmn", "mmo", "mmp", "mmq", "mmr", "mmt", "mmu", "mmv", "mmw", "mmx", "mmy", "mmz", "mna", "mnb", "mnc", "mnd", "mne", "mnf", "mng", "mnh", "mni", "mnj", "mnk", "mnl", "mnm", "mnn", "mno", "mnp", "mnq", "mnr", "mns", "mnt", "mnu", "mnv", "mnw", "mnx", "mny", "mnz", "moa", "moc", "mod", "moe", "mof", "mog", "moh", "moi", "moj", "mok", "mom", "moo", "mop", "moq", "mor", "mos", "mot", "mou", "mov", "mow", "mox", "moy", "moz", "mpa", "mpb", "mpc", "mpd", "mpe", "mpg", "mph", "mpi", "mpj", "mpk", "mpl", "mpm", "mpn", "mpo", "mpp", "mpq", "mpr", "mps", "mpt", "mpu", "mpv", "mpw", "mpx", "mpy", "mpz", "mqa", "mqb", "mqc", "mqe", "mqf", "mqg", "mqh", "mqi", "mqj", "mqk", "mql", "mqm", "mqn", "mqo", "mqp", "mqq", "mqr", "mqs", "mqt", "mqu", "mqv", "mqw", "mqx", "mqy", "mqz", "mra", "mrb", "mrc", "mrd", "mre", "mrf", "mrg", "mrh", "mrj", "mrk", "mrl", "mrm", "mrn", "mro", "mrp", "mrq", "mrr", "mrs", "mrt", "mru", "mrv", "mrw", "mrx", "mry", "mrz", "msb", "msc", "msd", "mse", "msf", "msg", "msh", "msi", "msj", "msk", "msl", "msm", "msn", "mso", "msp", "msq", "msr", "mss", "mst", "msu", "msv", "msw", "msx", "msy", "msz", "mta", "mtb", "mtc", "mtd", "mte", "mtf", "mtg", "mth", "mti", "mtj", "mtk", "mtl", "mtm", "mtn", "mto", "mtp", "mtq", "mtr", "mts", "mtt", "mtu", "mtv", "mtw", "mtx", "mty", "mua", "mub", "muc", "mud", "mue", "mug", "muh", "mui", "muj", "muk", "mul", "mum", "mun", "muo", "mup", "muq", "mur", "mus", "mut", "muu", "muv", "mux", "muy", "muz", "mva", "mvb", "mvd", "mve", "mvf", "mvg", "mvh", "mvi", "mvk", "mvl", "mvm", "mvn", "mvo", "mvp", "mvq", "mvr", "mvs", "mvt", "mvu", "mvv", "mvw", "mvx", "mvy", "mvz", "mwa", "mwb", "mwc", "mwd", "mwe", "mwf", "mwg", "mwh", "mwi", "mwj", "mwk", "mwl", "mwm", "mwn", "mwo", "mwp", "mwq", "mwr", "mws", "mwt", "mwu", "mwv", "mww", "mwx", "mwy", "mwz", "mxa", "mxb", "mxc", "mxd", "mxe", "mxf", "mxg", "mxh", "mxi", "mxj", "mxk", "mxl", "mxm", "mxn", "mxo", "mxp", "mxq", "mxr", "mxs", "mxt", "mxu", "mxv", "mxw", "mxx", "mxy", "mxz", "myb", "myc", "myd", "mye", "myf", "myg", "myh", "myi", "myj", "myk", "myl", "mym", "myn", "myo", "myp", "myq", "myr", "mys", "myt", "myu", "myv", "myw", "myx", "myy", "myz", "mza", "mzb", "mzc", "mzd", "mze", "mzg", "mzh", "mzi", "mzj", "mzk", "mzl", "mzm", "mzn", "mzo", "mzp", "mzq", "mzr", "mzs", "mzt", "mzu", "mzv", "mzw", "mzx", "mzy", "mzz"], + ["na", "nb", "nd", "ne", "ng", "nl", "nn", "no", "nr", "nv", "ny", "naa", "nab", "nac", "nad", "nae", "naf", "nag", "nah", "nai", "naj", "nak", "nal", "nam", "nan", "nao", "nap", "naq", "nar", "nas", "nat", "naw", "nax", "nay", "naz", "nba", "nbb", "nbc", "nbd", "nbe", "nbf", "nbg", "nbh", "nbi", "nbj", "nbk", "nbm", "nbn", "nbo", "nbp", "nbq", "nbr", "nbs", "nbt", "nbu", "nbv", "nbw", "nbx", "nby", "nca", "ncb", "ncc", "ncd", "nce", "ncf", "ncg", "nch", "nci", "ncj", "nck", "ncl", "ncm", "ncn", "nco", "ncp", "ncq", "ncr", "ncs", "nct", "ncu", "ncx", "ncz", "nda", "ndb", "ndc", "ndd", "ndf", "ndg", "ndh", "ndi", "ndj", "ndk", "ndl", "ndm", "ndn", "ndp", "ndq", "ndr", "nds", "ndt", "ndu", "ndv", "ndw", "ndx", "ndy", "ndz", "nea", "neb", "nec", "ned", "nee", "nef", "neg", "neh", "nei", "nej", "nek", "nem", "nen", "neo", "neq", "ner", "nes", "net", "neu", "nev", "new", "nex", "ney", "nez", "nfa", "nfd", "nfl", "nfr", "nfu", "nga", "ngb", "ngc", "ngd", "nge", "ngf", "ngg", "ngh", "ngi", "ngj", "ngk", "ngl", "ngm", "ngn", "ngo", "ngp", "ngq", "ngr", "ngs", "ngt", "ngu", "ngv", "ngw", "ngx", "ngy", "ngz", "nha", "nhb", "nhc", "nhd", "nhe", "nhf", "nhg", "nhh", "nhi", "nhk", "nhm", "nhn", "nho", "nhp", "nhq", "nhr", "nht", "nhu", "nhv", "nhw", "nhx", "nhy", "nhz", "nia", "nib", "nic", "nid", "nie", "nif", "nig", "nih", "nii", "nij", "nik", "nil", "nim", "nin", "nio", "niq", "nir", "nis", "nit", "niu", "niv", "niw", "nix", "niy", "niz", "nja", "njb", "njd", "njh", "nji", "njj", "njl", "njm", "njn", "njo", "njr", "njs", "njt", "nju", "njx", "njy", "njz", "nka", "nkb", "nkc", "nkd", "nke", "nkf", "nkg", "nkh", "nki", "nkj", "nkk", "nkm", "nkn", "nko", "nkp", "nkq", "nkr", "nks", "nkt", "nku", "nkv", "nkw", "nkx", "nkz", "nla", "nlc", "nle", "nlg", "nli", "nlj", "nlk", "nll", "nlm", "nln", "nlo", "nlq", "nlr", "nlu", "nlv", "nlw", "nlx", "nly", "nlz", "nma", "nmb", "nmc", "nmd", "nme", "nmf", "nmg", "nmh", "nmi", "nmj", "nmk", "nml", "nmm", "nmn", "nmo", "nmp", "nmq", "nmr", "nms", "nmt", "nmu", "nmv", "nmw", "nmx", "nmy", "nmz", "nna", "nnb", "nnc", "nnd", "nne", "nnf", "nng", "nnh", "nni", "nnj", "nnk", "nnl", "nnm", "nnn", "nnp", "nnq", "nnr", "nns", "nnt", "nnu", "nnv", "nnw", "nnx", "nny", "nnz", "noa", "noc", "nod", "noe", "nof", "nog", "noh", "noi", "noj", "nok", "nol", "nom", "non", "noo", "nop", "noq", "nos", "not", "nou", "nov", "now", "noy", "noz", "npa", "npb", "npg", "nph", "npi", "npl", "npn", "npo", "nps", "npu", "npx", "npy", "nqg", "nqk", "nql", "nqm", "nqn", "nqo", "nqq", "nqt", "nqy", "nra", "nrb", "nrc", "nre", "nrf", "nrg", "nri", "nrk", "nrl", "nrm", "nrn", "nrp", "nrr", "nrt", "nru", "nrx", "nrz", "nsa", "nsb", "nsc", "nsd", "nse", "nsf", "nsg", "nsh", "nsi", "nsk", "nsl", "nsm", "nsn", "nso", "nsp", "nsq", "nsr", "nss", "nst", "nsu", "nsv", "nsw", "nsx", "nsy", "nsz", "ntd", "nte", "ntg", "nti", "ntj", "ntk", "ntm", "nto", "ntp", "ntr", "nts", "ntu", "ntw", "ntx", "nty", "ntz", "nua", "nub", "nuc", "nud", "nue", "nuf", "nug", "nuh", "nui", "nuj", "nuk", "nul", "num", "nun", "nuo", "nup", "nuq", "nur", "nus", "nut", "nuu", "nuv", "nuw", "nux", "nuy", "nuz", "nvh", "nvm", "nvo", "nwa", "nwb", "nwc", "nwe", "nwg", "nwi", "nwm", "nwo", "nwr", "nwx", "nwy", "nxa", "nxd", "nxe", "nxg", "nxi", "nxk", "nxl", "nxm", "nxn", "nxo", "nxq", "nxr", "nxu", "nxx", "nyb", "nyc", "nyd", "nye", "nyf", "nyg", "nyh", "nyi", "nyj", "nyk", "nyl", "nym", "nyn", "nyo", "nyp", "nyq", "nyr", "nys", "nyt", "nyu", "nyv", "nyw", "nyx", "nyy", "nza", "nzb", "nzd", "nzi", "nzk", "nzm", "nzs", "nzu", "nzy", "nzz"], + ["oc", "oj", "om", "or", "os", "oaa", "oac", "oar", "oav", "obi", "obk", "obl", "obm", "obo", "obr", "obt", "obu", "oca", "och", "ocm", "oco", "ocu", "oda", "odk", "odt", "odu", "ofo", "ofs", "ofu", "ogb", "ogc", "oge", "ogg", "ogo", "ogu", "oht", "ohu", "oia", "oin", "ojb", "ojc", "ojg", "ojp", "ojs", "ojv", "ojw", "oka", "okb", "okc", "okd", "oke", "okg", "okh", "oki", "okj", "okk", "okl", "okm", "okn", "oko", "okr", "oks", "oku", "okv", "okx", "okz", "ola", "old", "ole", "olk", "olm", "olo", "olr", "olt", "olu", "oma", "omb", "omc", "ome", "omg", "omi", "omk", "oml", "omn", "omo", "omp", "omq", "omr", "omt", "omu", "omv", "omw", "omx", "omy", "ona", "onb", "one", "ong", "oni", "onj", "onk", "onn", "ono", "onp", "onr", "ons", "ont", "onu", "onw", "onx", "ood", "oog", "oon", "oor", "oos", "opa", "opk", "opm", "opo", "opt", "opy", "ora", "orc", "ore", "org", "orh", "orn", "oro", "orr", "ors", "ort", "oru", "orv", "orw", "orx", "ory", "orz", "osa", "osc", "osi", "osn", "oso", "osp", "ost", "osu", "osx", "ota", "otb", "otd", "ote", "oti", "otk", "otl", "otm", "otn", "oto", "otq", "otr", "ots", "ott", "otu", "otw", "otx", "oty", "otz", "oua", "oub", "oue", "oui", "oum", "oun", "ovd", "owi", "owl", "oyb", "oyd", "oym", "oyy", "ozm"], + ["pa", "pi", "pl", "ps", "pt", "paa", "pab", "pac", "pad", "pae", "paf", "pag", "pah", "pai", "pak", "pal", "pam", "pao", "pap", "paq", "par", "pas", "pat", "pau", "pav", "paw", "pax", "pay", "paz", "pbb", "pbc", "pbe", "pbf", "pbg", "pbh", "pbi", "pbl", "pbm", "pbn", "pbo", "pbp", "pbr", "pbs", "pbt", "pbu", "pbv", "pby", "pbz", "pca", "pcb", "pcc", "pcd", "pce", "pcf", "pcg", "pch", "pci", "pcj", "pck", "pcl", "pcm", "pcn", "pcp", "pcr", "pcw", "pda", "pdc", "pdi", "pdn", "pdo", "pdt", "pdu", "pea", "peb", "ped", "pee", "pef", "peg", "peh", "pei", "pej", "pek", "pel", "pem", "peo", "pep", "peq", "pes", "pev", "pex", "pey", "pez", "pfa", "pfe", "pfl", "pga", "pgd", "pgg", "pgi", "pgk", "pgl", "pgn", "pgs", "pgu", "pgy", "pgz", "pha", "phd", "phg", "phh", "phi", "phk", "phl", "phm", "phn", "pho", "phq", "phr", "pht", "phu", "phv", "phw", "pia", "pib", "pic", "pid", "pie", "pif", "pig", "pih", "pii", "pij", "pil", "pim", "pin", "pio", "pip", "pir", "pis", "pit", "piu", "piv", "piw", "pix", "piy", "piz", "pjt", "pka", "pkb", "pkc", "pkg", "pkh", "pkn", "pko", "pkp", "pkr", "pks", "pkt", "pku", "pla", "plb", "plc", "pld", "ple", "plf", "plg", "plh", "plj", "plk", "pll", "pln", "plo", "plp", "plq", "plr", "pls", "plt", "plu", "plv", "plw", "ply", "plz", "pma", "pmb", "pmc", "pmd", "pme", "pmf", "pmh", "pmi", "pmj", "pmk", "pml", "pmm", "pmn", "pmo", "pmq", "pmr", "pms", "pmt", "pmu", "pmw", "pmx", "pmy", "pmz", "pna", "pnb", "pnc", "pnd", "pne", "png", "pnh", "pni", "pnj", "pnk", "pnl", "pnm", "pnn", "pno", "pnp", "pnq", "pnr", "pns", "pnt", "pnu", "pnv", "pnw", "pnx", "pny", "pnz", "poc", "pod", "poe", "pof", "pog", "poh", "poi", "pok", "pom", "pon", "poo", "pop", "poq", "pos", "pot", "pov", "pow", "pox", "poy", "poz", "ppa", "ppe", "ppi", "ppk", "ppl", "ppm", "ppn", "ppo", "ppp", "ppq", "ppr", "pps", "ppt", "ppu", "pqa", "pqe", "pqm", "pqw", "pra", "prb", "prc", "prd", "pre", "prf", "prg", "prh", "pri", "prk", "prl", "prm", "prn", "pro", "prp", "prq", "prr", "prs", "prt", "pru", "prw", "prx", "pry", "prz", "psa", "psc", "psd", "pse", "psg", "psh", "psi", "psl", "psm", "psn", "pso", "psp", "psq", "psr", "pss", "pst", "psu", "psw", "psy", "pta", "pth", "pti", "ptn", "pto", "ptp", "ptq", "ptr", "ptt", "ptu", "ptv", "ptw", "pty", "pua", "pub", "puc", "pud", "pue", "puf", "pug", "pui", "puj", "puk", "pum", "puo", "pup", "puq", "pur", "put", "puu", "puw", "pux", "puy", "puz", "pwa", "pwb", "pwg", "pwi", "pwm", "pwn", "pwo", "pwr", "pww", "pxm", "pye", "pym", "pyn", "pys", "pyu", "pyx", "pyy", "pzn"], + ["qu", "qua", "qub", "quc", "qud", "quf", "qug", "quh", "qui", "quk", "qul", "qum", "qun", "qup", "quq", "qur", "qus", "quv", "quw", "qux", "quy", "quz", "qva", "qvc", "qve", "qvh", "qvi", "qvj", "qvl", "qvm", "qvn", "qvo", "qvp", "qvs", "qvw", "qvy", "qvz", "qwa", "qwc", "qwe", "qwh", "qwm", "qws", "qwt", "qxa", "qxc", "qxh", "qxl", "qxn", "qxo", "qxp", "qxq", "qxr", "qxs", "qxt", "qxu", "qxw", "qya", "qyp"], + ["rm", "rn", "ro", "ru", "rw", "raa", "rab", "rac", "rad", "raf", "rag", "rah", "rai", "raj", "rak", "ral", "ram", "ran", "rao", "rap", "raq", "rar", "ras", "rat", "rau", "rav", "raw", "rax", "ray", "raz", "rbb", "rbk", "rbl", "rbp", "rcf", "rdb", "rea", "reb", "ree", "reg", "rei", "rej", "rel", "rem", "ren", "rer", "res", "ret", "rey", "rga", "rge", "rgk", "rgn", "rgr", "rgs", "rgu", "rhg", "rhp", "ria", "rie", "rif", "ril", "rim", "rin", "rir", "rit", "riu", "rjg", "rji", "rjs", "rka", "rkb", "rkh", "rki", "rkm", "rkt", "rkw", "rma", "rmb", "rmc", "rmd", "rme", "rmf", "rmg", "rmh", "rmi", "rmk", "rml", "rmm", "rmn", "rmo", "rmp", "rmq", "rmr", "rms", "rmt", "rmu", "rmv", "rmw", "rmx", "rmy", "rmz", "rna", "rnd", "rng", "rnl", "rnn", "rnp", "rnr", "rnw", "roa", "rob", "roc", "rod", "roe", "rof", "rog", "rol", "rom", "roo", "rop", "ror", "rou", "row", "rpn", "rpt", "rri", "rro", "rrt", "rsb", "rsi", "rsl", "rsm", "rtc", "rth", "rtm", "rts", "rtw", "rub", "ruc", "rue", "ruf", "rug", "ruh", "rui", "ruk", "ruo", "rup", "ruq", "rut", "ruu", "ruy", "ruz", "rwa", "rwk", "rwl", "rwm", "rwo", "rwr", "rxd", "rxw", "ryn", "rys", "ryu", "rzh"], + ["sa", "sc", "sd", "se", "sg", "sh", "si", "sk", "sl", "sm", "sn", "so", "sq", "sr", "ss", "st", "su", "sv", "sw", "saa", "sab", "sac", "sad", "sae", "saf", "sah", "sai", "saj", "sak", "sal", "sam", "sao", "sap", "saq", "sar", "sas", "sat", "sau", "sav", "saw", "sax", "say", "saz", "sba", "sbb", "sbc", "sbd", "sbe", "sbf", "sbg", "sbh", "sbi", "sbj", "sbk", "sbl", "sbm", "sbn", "sbo", "sbp", "sbq", "sbr", "sbs", "sbt", "sbu", "sbv", "sbw", "sbx", "sby", "sbz", "sca", "scb", "sce", "scf", "scg", "sch", "sci", "sck", "scl", "scn", "sco", "scp", "scq", "scs", "sct", "scu", "scv", "scw", "scx", "sda", "sdb", "sdc", "sde", "sdf", "sdg", "sdh", "sdj", "sdk", "sdl", "sdm", "sdn", "sdo", "sdp", "sdq", "sdr", "sds", "sdt", "sdu", "sdv", "sdx", "sdz", "sea", "seb", "sec", "sed", "see", "sef", "seg", "seh", "sei", "sej", "sek", "sel", "sem", "sen", "seo", "sep", "seq", "ser", "ses", "set", "seu", "sev", "sew", "sey", "sez", "sfb", "sfe", "sfm", "sfs", "sfw", "sga", "sgb", "sgc", "sgd", "sge", "sgg", "sgh", "sgi", "sgj", "sgk", "sgl", "sgm", "sgn", "sgo", "sgp", "sgr", "sgs", "sgt", "sgu", "sgw", "sgx", "sgy", "sgz", "sha", "shb", "shc", "shd", "she", "shg", "shh", "shi", "shj", "shk", "shl", "shm", "shn", "sho", "shp", "shq", "shr", "shs", "sht", "shu", "shv", "shw", "shx", "shy", "shz", "sia", "sib", "sid", "sie", "sif", "sig", "sih", "sii", "sij", "sik", "sil", "sim", "sio", "sip", "siq", "sir", "sis", "sit", "siu", "siv", "siw", "six", "siy", "siz", "sja", "sjb", "sjd", "sje", "sjg", "sjk", "sjl", "sjm", "sjn", "sjo", "sjp", "sjr", "sjs", "sjt", "sju", "sjw", "ska", "skb", "skc", "skd", "ske", "skf", "skg", "skh", "ski", "skj", "skk", "skm", "skn", "sko", "skp", "skq", "skr", "sks", "skt", "sku", "skv", "skw", "skx", "sky", "skz", "sla", "slc", "sld", "sle", "slf", "slg", "slh", "sli", "slj", "sll", "slm", "sln", "slp", "slq", "slr", "sls", "slt", "slu", "slw", "slx", "sly", "slz", "sma", "smb", "smc", "smd", "smf", "smg", "smh", "smi", "smj", "smk", "sml", "smm", "smn", "smp", "smq", "smr", "sms", "smt", "smu", "smv", "smw", "smx", "smy", "smz", "snb", "snc", "sne", "snf", "sng", "snh", "sni", "snj", "snk", "snl", "snm", "snn", "sno", "snp", "snq", "snr", "sns", "snu", "snv", "snw", "snx", "sny", "snz", "soa", "sob", "soc", "sod", "soe", "sog", "soh", "soi", "soj", "sok", "sol", "son", "soo", "sop", "soq", "sor", "sos", "sou", "sov", "sow", "sox", "soy", "soz", "spb", "spc", "spd", "spe", "spg", "spi", "spk", "spl", "spm", "spn", "spo", "spp", "spq", "spr", "sps", "spt", "spu", "spv", "spx", "spy", "sqa", "sqh", "sqj", "sqk", "sqm", "sqn", "sqo", "sqq", "sqr", "sqs", "sqt", "squ", "sqx", "sra", "srb", "src", "sre", "srf", "srg", "srh", "sri", "srk", "srl", "srm", "srn", "sro", "srq", "srr", "srs", "srt", "sru", "srv", "srw", "srx", "sry", "srz", "ssa", "ssb", "ssc", "ssd", "sse", "ssf", "ssg", "ssh", "ssi", "ssj", "ssk", "ssl", "ssm", "ssn", "sso", "ssp", "ssq", "ssr", "sss", "sst", "ssu", "ssv", "ssx", "ssy", "ssz", "sta", "stb", "std", "ste", "stf", "stg", "sth", "sti", "stj", "stk", "stl", "stm", "stn", "sto", "stp", "stq", "str", "sts", "stt", "stu", "stv", "stw", "sty", "sua", "sub", "suc", "sue", "sug", "sui", "suj", "suk", "sul", "sum", "suo", "suq", "sur", "sus", "sut", "suv", "suw", "sux", "suy", "suz", "sva", "svb", "svc", "sve", "svk", "svm", "svr", "svs", "svx", "swb", "swc", "swf", "swg", "swh", "swi", "swj", "swk", "swl", "swm", "swn", "swo", "swp", "swq", "swr", "sws", "swt", "swu", "swv", "sww", "swx", "swy", "sxb", "sxc", "sxe", "sxg", "sxk", "sxl", "sxm", "sxn", "sxo", "sxr", "sxs", "sxu", "sxw", "sya", "syb", "syc", "syd", "syi", "syk", "syl", "sym", "syn", "syo", "syr", "sys", "syw", "syx", "syy", "sza", "szb", "szc", "szd", "sze", "szg", "szl", "szn", "szp", "szs", "szv", "szw", "szy"], + ["ta", "te", "tg", "th", "ti", "tk", "tl", "tn", "to", "tr", "ts", "tt", "tw", "ty", "taa", "tab", "tac", "tad", "tae", "taf", "tag", "tai", "taj", "tak", "tal", "tan", "tao", "tap", "taq", "tar", "tas", "tau", "tav", "taw", "tax", "tay", "taz", "tba", "tbb", "tbc", "tbd", "tbe", "tbf", "tbg", "tbh", "tbi", "tbj", "tbk", "tbl", "tbm", "tbn", "tbo", "tbp", "tbq", "tbr", "tbs", "tbt", "tbu", "tbv", "tbw", "tbx", "tby", "tbz", "tca", "tcb", "tcc", "tcd", "tce", "tcf", "tcg", "tch", "tci", "tck", "tcl", "tcm", "tcn", "tco", "tcp", "tcq", "tcs", "tct", "tcu", "tcw", "tcx", "tcy", "tcz", "tda", "tdb", "tdc", "tdd", "tde", "tdf", "tdg", "tdh", "tdi", "tdj", "tdk", "tdl", "tdm", "tdn", "tdo", "tdq", "tdr", "tds", "tdt", "tdu", "tdv", "tdx", "tdy", "tea", "teb", "tec", "ted", "tee", "tef", "teg", "teh", "tei", "tek", "tem", "ten", "teo", "tep", "teq", "ter", "tes", "tet", "teu", "tev", "tew", "tex", "tey", "tez", "tfi", "tfn", "tfo", "tfr", "tft", "tga", "tgb", "tgc", "tgd", "tge", "tgf", "tgg", "tgh", "tgi", "tgj", "tgn", "tgo", "tgp", "tgq", "tgr", "tgs", "tgt", "tgu", "tgv", "tgw", "tgx", "tgy", "tgz", "thc", "thd", "the", "thf", "thh", "thi", "thk", "thl", "thm", "thn", "thp", "thq", "thr", "ths", "tht", "thu", "thv", "thw", "thx", "thy", "thz", "tia", "tic", "tid", "tie", "tif", "tig", "tih", "tii", "tij", "tik", "til", "tim", "tin", "tio", "tip", "tiq", "tis", "tit", "tiu", "tiv", "tiw", "tix", "tiy", "tiz", "tja", "tjg", "tji", "tjj", "tjl", "tjm", "tjn", "tjo", "tjp", "tjs", "tju", "tjw", "tka", "tkb", "tkd", "tke", "tkf", "tkg", "tkk", "tkl", "tkm", "tkn", "tkp", "tkq", "tkr", "tks", "tkt", "tku", "tkv", "tkw", "tkx", "tkz", "tla", "tlb", "tlc", "tld", "tlf", "tlg", "tlh", "tli", "tlj", "tlk", "tll", "tlm", "tln", "tlo", "tlp", "tlq", "tlr", "tls", "tlt", "tlu", "tlv", "tlw", "tlx", "tly", "tma", "tmb", "tmc", "tmd", "tme", "tmf", "tmg", "tmh", "tmi", "tmj", "tmk", "tml", "tmm", "tmn", "tmo", "tmp", "tmq", "tmr", "tms", "tmt", "tmu", "tmv", "tmw", "tmy", "tmz", "tna", "tnb", "tnc", "tnd", "tne", "tnf", "tng", "tnh", "tni", "tnk", "tnl", "tnm", "tnn", "tno", "tnp", "tnq", "tnr", "tns", "tnt", "tnu", "tnv", "tnw", "tnx", "tny", "tnz", "tob", "toc", "tod", "toe", "tof", "tog", "toh", "toi", "toj", "tol", "tom", "too", "top", "toq", "tor", "tos", "tou", "tov", "tow", "tox", "toy", "toz", "tpa", "tpc", "tpe", "tpf", "tpg", "tpi", "tpj", "tpk", "tpl", "tpm", "tpn", "tpo", "tpp", "tpq", "tpr", "tpt", "tpu", "tpv", "tpw", "tpx", "tpy", "tpz", "tqb", "tql", "tqm", "tqn", "tqo", "tqp", "tqq", "tqr", "tqt", "tqu", "tqw", "tra", "trb", "trc", "trd", "tre", "trf", "trg", "trh", "tri", "trj", "trk", "trl", "trm", "trn", "tro", "trp", "trq", "trr", "trs", "trt", "tru", "trv", "trw", "trx", "try", "trz", "tsa", "tsb", "tsc", "tsd", "tse", "tsf", "tsg", "tsh", "tsi", "tsj", "tsk", "tsl", "tsm", "tsp", "tsq", "tsr", "tss", "tst", "tsu", "tsv", "tsw", "tsx", "tsy", "tsz", "tta", "ttb", "ttc", "ttd", "tte", "ttf", "ttg", "tth", "tti", "ttj", "ttk", "ttl", "ttm", "ttn", "tto", "ttp", "ttq", "ttr", "tts", "ttt", "ttu", "ttv", "ttw", "tty", "ttz", "tua", "tub", "tuc", "tud", "tue", "tuf", "tug", "tuh", "tui", "tuj", "tul", "tum", "tun", "tuo", "tup", "tuq", "tus", "tut", "tuu", "tuv", "tuw", "tux", "tuy", "tuz", "tva", "tvd", "tve", "tvk", "tvl", "tvm", "tvn", "tvo", "tvs", "tvt", "tvu", "tvw", "tvx", "tvy", "twa", "twb", "twc", "twd", "twe", "twf", "twg", "twh", "twl", "twm", "twn", "two", "twp", "twq", "twr", "twt", "twu", "tww", "twx", "twy", "txa", "txb", "txc", "txe", "txg", "txh", "txi", "txj", "txm", "txn", "txo", "txq", "txr", "txs", "txt", "txu", "txx", "txy", "tya", "tye", "tyh", "tyi", "tyj", "tyl", "tyn", "typ", "tyr", "tys", "tyt", "tyu", "tyv", "tyx", "tyy", "tyz", "tza", "tzh", "tzj", "tzl", "tzm", "tzn", "tzo", "tzx"], + ["ug", "uk", "ur", "uz", "uam", "uan", "uar", "uba", "ubi", "ubl", "ubr", "ubu", "uby", "uda", "ude", "udg", "udi", "udj", "udl", "udm", "udu", "ues", "ufi", "uga", "ugb", "uge", "ugn", "ugo", "ugy", "uha", "uhn", "uis", "uiv", "uji", "uka", "ukg", "ukh", "uki", "ukk", "ukl", "ukp", "ukq", "uks", "uku", "ukv", "ukw", "uky", "ula", "ulb", "ulc", "ule", "ulf", "uli", "ulk", "ull", "ulm", "uln", "ulu", "ulw", "uma", "umb", "umc", "umd", "umg", "umi", "umm", "umn", "umo", "ump", "umr", "ums", "umu", "una", "und", "une", "ung", "uni", "unk", "unm", "unn", "unp", "unr", "unu", "unx", "unz", "uok", "upi", "upv", "ura", "urb", "urc", "ure", "urf", "urg", "urh", "uri", "urj", "urk", "url", "urm", "urn", "uro", "urp", "urr", "urt", "uru", "urv", "urw", "urx", "ury", "urz", "usa", "ush", "usi", "usk", "usp", "uss", "usu", "uta", "ute", "uth", "utp", "utr", "utu", "uum", "uun", "uur", "uuu", "uve", "uvh", "uvl", "uwa", "uya", "uzn", "uzs"], + ["ve", "vi", "vo", "vaa", "vae", "vaf", "vag", "vah", "vai", "vaj", "val", "vam", "van", "vao", "vap", "var", "vas", "vau", "vav", "vay", "vbb", "vbk", "vec", "ved", "vel", "vem", "veo", "vep", "ver", "vgr", "vgt", "vic", "vid", "vif", "vig", "vil", "vin", "vis", "vit", "viv", "vka", "vki", "vkj", "vkk", "vkl", "vkm", "vkn", "vko", "vkp", "vkt", "vku", "vkz", "vlp", "vls", "vma", "vmb", "vmc", "vmd", "vme", "vmf", "vmg", "vmh", "vmi", "vmj", "vmk", "vml", "vmm", "vmp", "vmq", "vmr", "vms", "vmu", "vmv", "vmw", "vmx", "vmy", "vmz", "vnk", "vnm", "vnp", "vor", "vot", "vra", "vro", "vrs", "vrt", "vsi", "vsl", "vsv", "vto", "vum", "vun", "vut", "vwa"], + ["wa", "wo", "waa", "wab", "wac", "wad", "wae", "waf", "wag", "wah", "wai", "waj", "wak", "wal", "wam", "wan", "wao", "wap", "waq", "war", "was", "wat", "wau", "wav", "waw", "wax", "way", "waz", "wba", "wbb", "wbe", "wbf", "wbh", "wbi", "wbj", "wbk", "wbl", "wbm", "wbp", "wbq", "wbr", "wbs", "wbt", "wbv", "wbw", "wca", "wci", "wdd", "wdg", "wdj", "wdk", "wdu", "wdy", "wea", "wec", "wed", "weg", "weh", "wei", "wem", "wen", "weo", "wep", "wer", "wes", "wet", "weu", "wew", "wfg", "wga", "wgb", "wgg", "wgi", "wgo", "wgu", "wgw", "wgy", "wha", "whg", "whk", "whu", "wib", "wic", "wie", "wif", "wig", "wih", "wii", "wij", "wik", "wil", "wim", "win", "wir", "wit", "wiu", "wiv", "wiw", "wiy", "wja", "wji", "wka", "wkb", "wkd", "wkl", "wkr", "wku", "wkw", "wky", "wla", "wlc", "wle", "wlg", "wlh", "wli", "wlk", "wll", "wlm", "wlo", "wlr", "wls", "wlu", "wlv", "wlw", "wlx", "wly", "wma", "wmb", "wmc", "wmd", "wme", "wmg", "wmh", "wmi", "wmm", "wmn", "wmo", "wms", "wmt", "wmw", "wmx", "wnb", "wnc", "wnd", "wne", "wng", "wni", "wnk", "wnm", "wnn", "wno", "wnp", "wnu", "wnw", "wny", "woa", "wob", "woc", "wod", "woe", "wof", "wog", "woi", "wok", "wom", "won", "woo", "wor", "wos", "wow", "woy", "wpc", "wra", "wrb", "wrd", "wrg", "wrh", "wri", "wrk", "wrl", "wrm", "wrn", "wro", "wrp", "wrr", "wrs", "wru", "wrv", "wrw", "wrx", "wry", "wrz", "wsa", "wsg", "wsi", "wsk", "wsr", "wss", "wsu", "wsv", "wtf", "wth", "wti", "wtk", "wtm", "wtw", "wua", "wub", "wud", "wuh", "wul", "wum", "wun", "wur", "wut", "wuu", "wuv", "wux", "wuy", "wwa", "wwb", "wwo", "wwr", "www", "wxa", "wxw", "wya", "wyb", "wyi", "wym", "wyr", "wyy"], + ["xh", "xaa", "xab", "xac", "xad", "xae", "xag", "xai", "xaj", "xak", "xal", "xam", "xan", "xao", "xap", "xaq", "xar", "xas", "xat", "xau", "xav", "xaw", "xay", "xba", "xbb", "xbc", "xbd", "xbe", "xbg", "xbi", "xbj", "xbm", "xbn", "xbo", "xbp", "xbr", "xbw", "xbx", "xby", "xcb", "xcc", "xce", "xcg", "xch", "xcl", "xcm", "xcn", "xco", "xcr", "xct", "xcu", "xcv", "xcw", "xcy", "xda", "xdc", "xdk", "xdm", "xdo", "xdy", "xeb", "xed", "xeg", "xel", "xem", "xep", "xer", "xes", "xet", "xeu", "xfa", "xga", "xgb", "xgd", "xgf", "xgg", "xgi", "xgl", "xgm", "xgn", "xgr", "xgu", "xgw", "xha", "xhc", "xhd", "xhe", "xhr", "xht", "xhu", "xhv", "xia", "xib", "xii", "xil", "xin", "xip", "xir", "xis", "xiv", "xiy", "xjb", "xjt", "xka", "xkb", "xkc", "xkd", "xke", "xkf", "xkg", "xkh", "xki", "xkj", "xkk", "xkl", "xkn", "xko", "xkp", "xkq", "xkr", "xks", "xkt", "xku", "xkv", "xkw", "xkx", "xky", "xkz", "xla", "xlb", "xlc", "xld", "xle", "xlg", "xli", "xln", "xlo", "xlp", "xls", "xlu", "xly", "xma", "xmb", "xmc", "xmd", "xme", "xmf", "xmg", "xmh", "xmj", "xmk", "xml", "xmm", "xmn", "xmo", "xmp", "xmq", "xmr", "xms", "xmt", "xmu", "xmv", "xmw", "xmx", "xmy", "xmz", "xna", "xnb", "xnd", "xng", "xnh", "xni", "xnj", "xnk", "xnm", "xnn", "xno", "xnq", "xnr", "xns", "xnt", "xnu", "xny", "xnz", "xoc", "xod", "xog", "xoi", "xok", "xom", "xon", "xoo", "xop", "xor", "xow", "xpa", "xpb", "xpc", "xpd", "xpe", "xpf", "xpg", "xph", "xpi", "xpj", "xpk", "xpl", "xpm", "xpn", "xpo", "xpp", "xpq", "xpr", "xps", "xpt", "xpu", "xpv", "xpw", "xpx", "xpy", "xpz", "xqa", "xqt", "xra", "xrb", "xrd", "xre", "xrg", "xri", "xrm", "xrn", "xrq", "xrr", "xrt", "xru", "xrw", "xsa", "xsb", "xsc", "xsd", "xse", "xsh", "xsi", "xsj", "xsl", "xsm", "xsn", "xso", "xsp", "xsq", "xsr", "xss", "xsu", "xsv", "xsy", "xta", "xtb", "xtc", "xtd", "xte", "xtg", "xth", "xti", "xtj", "xtl", "xtm", "xtn", "xto", "xtp", "xtq", "xtr", "xts", "xtt", "xtu", "xtv", "xtw", "xty", "xtz", "xua", "xub", "xud", "xug", "xuj", "xul", "xum", "xun", "xuo", "xup", "xur", "xut", "xuu", "xve", "xvi", "xvn", "xvo", "xvs", "xwa", "xwc", "xwd", "xwe", "xwg", "xwj", "xwk", "xwl", "xwo", "xwr", "xwt", "xww", "xxb", "xxk", "xxm", "xxr", "xxt", "xya", "xyb", "xyj", "xyk", "xyl", "xyt", "xyy", "xzh", "xzm", "xzp"], + ["yi", "yo", "yaa", "yab", "yac", "yad", "yae", "yaf", "yag", "yah", "yai", "yaj", "yak", "yal", "yam", "yan", "yao", "yap", "yaq", "yar", "yas", "yat", "yau", "yav", "yaw", "yax", "yay", "yaz", "yba", "ybb", "ybd", "ybe", "ybh", "ybi", "ybj", "ybk", "ybl", "ybm", "ybn", "ybo", "ybx", "yby", "ych", "ycl", "ycn", "ycp", "yda", "ydd", "yde", "ydg", "ydk", "yds", "yea", "yec", "yee", "yei", "yej", "yel", "yen", "yer", "yes", "yet", "yeu", "yev", "yey", "yga", "ygi", "ygl", "ygm", "ygp", "ygr", "ygs", "ygu", "ygw", "yha", "yhd", "yhl", "yhs", "yia", "yif", "yig", "yih", "yii", "yij", "yik", "yil", "yim", "yin", "yip", "yiq", "yir", "yis", "yit", "yiu", "yiv", "yix", "yiy", "yiz", "yka", "ykg", "yki", "ykk", "ykl", "ykm", "ykn", "yko", "ykr", "ykt", "yku", "yky", "yla", "ylb", "yle", "ylg", "yli", "yll", "ylm", "yln", "ylo", "ylr", "ylu", "yly", "yma", "ymb", "ymc", "ymd", "yme", "ymg", "ymh", "ymi", "ymk", "yml", "ymm", "ymn", "ymo", "ymp", "ymq", "ymr", "yms", "ymt", "ymx", "ymz", "yna", "ynd", "yne", "yng", "ynh", "ynk", "ynl", "ynn", "yno", "ynq", "yns", "ynu", "yob", "yog", "yoi", "yok", "yol", "yom", "yon", "yos", "yot", "yox", "yoy", "ypa", "ypb", "ypg", "yph", "ypk", "ypm", "ypn", "ypo", "ypp", "ypz", "yra", "yrb", "yre", "yri", "yrk", "yrl", "yrm", "yrn", "yro", "yrs", "yrw", "yry", "ysc", "ysd", "ysg", "ysl", "ysm", "ysn", "yso", "ysp", "ysr", "yss", "ysy", "yta", "ytl", "ytp", "ytw", "yty", "yua", "yub", "yuc", "yud", "yue", "yuf", "yug", "yui", "yuj", "yuk", "yul", "yum", "yun", "yup", "yuq", "yur", "yut", "yuu", "yuw", "yux", "yuy", "yuz", "yva", "yvt", "ywa", "ywg", "ywl", "ywn", "ywq", "ywr", "ywt", "ywu", "yww", "yxa", "yxg", "yxl", "yxm", "yxu", "yxy", "yyr", "yyu", "yyz", "yzg", "yzk"], + ["za", "zh", "zu", "zaa", "zab", "zac", "zad", "zae", "zaf", "zag", "zah", "zai", "zaj", "zak", "zal", "zam", "zao", "zap", "zaq", "zar", "zas", "zat", "zau", "zav", "zaw", "zax", "zay", "zaz", "zba", "zbc", "zbe", "zbl", "zbt", "zbu", "zbw", "zca", "zch", "zdj", "zea", "zeg", "zeh", "zen", "zga", "zgb", "zgh", "zgm", "zgn", "zgr", "zhb", "zhd", "zhi", "zhn", "zhw", "zhx", "zia", "zib", "zik", "zil", "zim", "zin", "zir", "ziw", "ziz", "zka", "zkb", "zkd", "zkg", "zkh", "zkk", "zkn", "zko", "zkp", "zkr", "zkt", "zku", "zkv", "zkz", "zla", "zle", "zlj", "zlm", "zln", "zlq", "zls", "zlw", "zma", "zmb", "zmc", "zmd", "zme", "zmf", "zmg", "zmh", "zmi", "zmj", "zmk", "zml", "zmm", "zmn", "zmo", "zmp", "zmq", "zmr", "zms", "zmt", "zmu", "zmv", "zmw", "zmx", "zmy", "zmz", "zna", "znd", "zne", "zng", "znk", "zns", "zoc", "zoh", "zom", "zoo", "zoq", "zor", "zos", "zpa", "zpb", "zpc", "zpd", "zpe", "zpf", "zpg", "zph", "zpi", "zpj", "zpk", "zpl", "zpm", "zpn", "zpo", "zpp", "zpq", "zpr", "zps", "zpt", "zpu", "zpv", "zpw", "zpx", "zpy", "zpz", "zqe", "zra", "zrg", "zrn", "zro", "zrp", "zrs", "zsa", "zsk", "zsl", "zsm", "zsr", "zsu", "zte", "ztg", "ztl", "ztm", "ztn", "ztp", "ztq", "zts", "ztt", "ztu", "ztx", "zty", "zua", "zuh", "zum", "zun", "zuy", "zwa", "zxx", "zyb", "zyg", "zyj", "zyn", "zyp", "zza", "zzj"] +]; +var LangUtil = /** @class */ (function () { + function LangUtil() { + } + /* Determine if given string is a valid BCP 47 string */ + LangUtil.isBcp47 = function (langStr) { + return /^(([a-zA-Z]{2,3}(-[a-zA-Z](-[a-zA-Z]{3}){0,2})?|[a-zA-Z]{4}|[a-zA-Z]{5,8})(-[a-zA-Z]{4})?(-([a-zA-Z]{2}|[0-9]{3}))?(-([0-9a-zA-Z]{5,8}|[0-9][a-zA-Z]{3}))*(-[0-9a-wy-zA-WY-Z](-[a-zA-Z0-9]{2,8})+)*(-x(-[a-zA-Z0-9]{1,8})+)?|x(-[a-zA-Z0-9]{1,8})+|(en-GB-oed|i-ami|i-bnn|i-default|i-enochian|i-hak|i-klingon|i-lux|i-mingo|i-navajo|i-pwn|i-tao|i-tay|i-tsu|sgn-BE-FR|sgn-BE-NL|sgn-CH-DE|art-lojban|cel-gaulish|no-bok|no-nyn|zh-guoyu|zh-hakka|zh-min|zh-min-nan|zh-xiang))$/.test(langStr); + }; + LangUtil.validPrimaryLang = function (langStr) { + var primary = langStr.toLowerCase(); + if (primary.includes("-")) { + primary = primary.split("-")[0]; + } + if (!primary.match(/[a-z]{2,3}/)) + return false; + // qaa..qtz + if (primary.length === 3 + && primary.charAt(0) === "q" + && primary.charCodeAt(1) >= 97 && primary.charCodeAt(1) <= 116 + && primary.charCodeAt(2) >= 97 && primary.charCodeAt(2) <= 122) { + } + return validPrimaryLangs[primary.charCodeAt(0) - 97].includes(primary); + }; + LangUtil.matchPrimaryLang = function (lang1, lang2) { + var primary1 = lang1; + if (primary1.includes("-")) { + primary1 = primary1.split("-")[0]; + } + var primary2 = lang2; + if (primary2.includes("-")) { + primary2 = primary2.split("-")[0]; + } + return primary1.toLowerCase() === primary2.toLowerCase(); + }; + return LangUtil; +}()); +exports.LangUtil = LangUtil; + + +/***/ }, + +/***/ "./src/v2/common/CommonMapper.ts" +/*!***************************************!*\ + !*** ./src/v2/common/CommonMapper.ts ***! + \***************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.CommonMapper = void 0; +var DOMWalker_1 = __webpack_require__(/*! ../dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var CommonMapper = /** @class */ (function () { + function CommonMapper() { + this.hierarchyRole = null; + this.hierarchyPath = null; + this.hierarchyResults = null; + } + CommonMapper.prototype.getBounds = function (node) { + return null; + }; + CommonMapper.prototype.reset = function (node) { + this.hierarchyRole = []; + this.hierarchyResults = []; + this.hierarchyPath = [{ + rolePath: "", + roleCount: {} + }]; + var ancestors = []; + var parent = DOMWalker_1.DOMWalker.parentNode(node); + while (parent && parent.nodeType != 9 /* Node.DOCUMENT_NODE */) { + ancestors.push(parent); + parent = DOMWalker_1.DOMWalker.parentNode(parent); + } + ancestors = ancestors.reverse(); + for (var _i = 0, ancestors_1 = ancestors; _i < ancestors_1.length; _i++) { + var ancestor = ancestors_1[_i]; + var siblings = []; + var sibling = ancestor.previousSibling; + while (sibling) { + siblings.push(sibling); + sibling = sibling.previousSibling; + } + siblings = siblings.reverse(); + for (var _a = 0, siblings_1 = siblings; _a < siblings_1.length; _a++) { + var sibling_1 = siblings_1[_a]; + this.pushHierarchy(sibling_1); + this.popHierarchy(); + } + this.pushHierarchy(ancestor); + } + }; + CommonMapper.prototype.pushHierarchy = function (node) { + var role = this.getRole(node) || null; + this.hierarchyRole.push(role); + if (role !== null) { + var parentPathInfo = this.hierarchyPath[this.hierarchyPath.length - 1]; + parentPathInfo.roleCount[role] = (parentPathInfo.roleCount[role] || 0) + 1; + this.hierarchyPath.push({ + "rolePath": parentPathInfo.rolePath + "/" + role + "[" + parentPathInfo.roleCount[role] + "]", + "roleCount": {} + }); + } + var attr = {}; + if (node.nodeType === 1) { + attr = this.getAttributes(node); + } + this.hierarchyResults.push({ + node: node, + namespace: this.getNamespace(), + role: role, + attributes: attr, + rolePath: this.hierarchyPath[this.hierarchyPath.length - 1].rolePath, + bounds: this.getBounds(node) + }); + }; + CommonMapper.prototype.popHierarchy = function () { + var role = this.hierarchyRole.pop(); + if (role !== null) { + this.hierarchyPath.pop(); + } + this.hierarchyResults.pop(); + }; + CommonMapper.prototype.openScope = function (node) { + if (this.hierarchyRole === null) { + this.reset(node); + } + this.pushHierarchy(node); + return this.hierarchyResults; + }; + CommonMapper.prototype.closeScope = function (node) { + var retVal = []; + for (var _i = 0, _a = this.hierarchyResults; _i < _a.length; _i++) { + var res = _a[_i]; + // const temp = res.node; + // res.node = null; + // let cloned = JSON.parse(JSON.stringify(res)); + // cloned.node = res.node = temp; + // retVal.push(cloned); + retVal.push(res); + } + retVal[retVal.length - 1].role = "/" + retVal[retVal.length - 1].role; + this.popHierarchy(); + return retVal; + }; + return CommonMapper; +}()); +exports.CommonMapper = CommonMapper; + + +/***/ }, + +/***/ "./src/v2/common/Context.ts" +/*!**********************************!*\ + !*** ./src/v2/common/Context.ts ***! + \**********************************/ +(__unused_webpack_module, exports) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Context = exports.PartInfo = exports.AttrInfo = void 0; +// Context that will cause this rule to execute. +// Context syntax: +// Triggers: +// aria:role - Triggers on element with ARIA role role +// aria:role[attribute] - Triggers on elements with the equivalent logical +// aria- attribute (e.g., button[disabled] will trigger on +// <button disabled> or <div role="button" aria-disabled="true">) +// role[attribute=value] - Similar to above, with case-sensitive match +// to value +// role[attribute~value] - Similar to above, with case-insensitive match +// dom:element - Triggers on an element with the specified name +// dom:element[attribute] - Triggers on a dom element with the specified attribute +// dom:*[attribute] - Triggers on all elements with the specified attribute +// Combining triggers: +// trigger1 trigger2 - Triggers on elements with trigger2 within an +// element with trigger1 +// !trigger1 trigger2 - Triggers on elements with trigger2 not within +// element with trigger1 +// trigger1>trigger2 - Triggers on elements with trigger2 with an +// an immediate parent with trigger1 +// trigger1+trigger2 - Triggers on elements with trigger2 with an +// immediate previous sibling with trigger1 +// trigger1~trigger2 - Triggers on elements with trigger2 with an +// some earlier sibling with trigger1 +// context,context - Triggers on elements with either context +var AttrInfo = /** @class */ (function () { + function AttrInfo(inclusive, attr, eq, value) { + this.inclusive = inclusive; + this.attr = attr; + this.eq = eq; + this.value = value; + if (!inclusive + && ((typeof eq) !== "undefined" && eq.length > 0)) { + throw new Error("Cannot have !attr" + eq + " context"); + } + if (inclusive && (typeof eq) !== "undefined" && eq.length > 0 && ((typeof value) === "undefined" || value.length === 0)) { + throw new Error("Cannot have equivalence check without a value"); + } + } + AttrInfo.prototype.matches = function (context) { + var ruleAttrPart = this; + var elemAttrs = context.attributes; + if (!(ruleAttrPart.attr in elemAttrs)) { + return !ruleAttrPart.inclusive; + } + else if (!ruleAttrPart.inclusive) { + return false; + } + else if (!ruleAttrPart.eq) { + // inclusive match and I have that attribute and no equivalence defined + return true; + } + else { + // inclusive match and I have that attribute and equivalence defined + var attrValue = elemAttrs[ruleAttrPart.attr]; + if (ruleAttrPart.eq === "=") { + return ruleAttrPart.value === attrValue; + } + else if (ruleAttrPart.eq === "!=") { + return ruleAttrPart.value !== attrValue; + } + else if (ruleAttrPart.eq === "~") { + return ruleAttrPart.value === attrValue; + } + else if (ruleAttrPart.eq === "!~") { + return ruleAttrPart.value !== attrValue; + } + else { + throw new Error("Context equivalence operator not supported"); + } + } + }; + return AttrInfo; +}()); +exports.AttrInfo = AttrInfo; +var PartInfo = /** @class */ (function () { + function PartInfo(inclusive, namespace, role, attrs, connector) { + this.inclusive = inclusive; + this.namespace = namespace; + this.role = role; + this.attrs = attrs; + this.connector = connector; + if (role === "*" && !inclusive) { + throw new Error("!* context not supported"); + } + } + PartInfo.prototype.matches = function (contextHier, hierLevel) { + var rulePart = this; + var ruleRoleMatch = (rulePart.namespace in contextHier) && contextHier[rulePart.namespace][hierLevel] + && (contextHier[rulePart.namespace][hierLevel].role === rulePart.role + || contextHier[rulePart.namespace][hierLevel].role !== "none" && rulePart.role === "*"); + if (ruleRoleMatch + && rulePart.role === "*" + && rulePart.namespace === "dom" + && (contextHier[rulePart.namespace][hierLevel].role === "#text" + || contextHier[rulePart.namespace][hierLevel].role === "/#text")) { + ruleRoleMatch = false; + } + if (rulePart.inclusive && !ruleRoleMatch) + return false; + if (!rulePart.inclusive && !ruleRoleMatch) + return true; + // Match the attributes + var ruleAttrs = rulePart.attrs; + var elemContext = contextHier[rulePart.namespace][hierLevel]; + var match = true; + for (var _i = 0, ruleAttrs_1 = ruleAttrs; _i < ruleAttrs_1.length; _i++) { + var ruleAttrPart = ruleAttrs_1[_i]; + match = match && ruleAttrPart.matches(elemContext); + } + if (!rulePart.inclusive) + match = !match; + return match; + }; + return PartInfo; +}()); +exports.PartInfo = PartInfo; +var Context = /** @class */ (function () { + function Context(context) { + this.contextInfo = []; + var contextHierMatches = context.match(/!?[/a-zA-Z:0-9*\-_]+(\[[^\]]+\])*[ >+~]?/g); + var results = []; + for (var _i = 0, contextHierMatches_1 = contextHierMatches; _i < contextHierMatches_1.length; _i++) { + var part = contextHierMatches_1[_i]; + var parts = part.match(/(!?)([/a-zA-Z:0-9*\-_]+)((\[[^\]]+\])*)([ >+~]?)/); + var attrInfo = []; + for (var _a = 0, _b = parts[3].match(/\[([^\]]+)\]/g) || []; _a < _b.length; _a++) { + var attrPart = _b[_a]; + var attrParts = attrPart.match(/\[(!?)([a-z:A-Z*\-_]+)(!?[=~])?([^\]]+)?\]/); + attrInfo.push(new AttrInfo(attrParts[1] !== "!", attrParts[2].toLowerCase(), attrParts[3], attrParts[4])); + } + parts[2] = parts[2].toLowerCase(); + var nsParts = parts[2].split(":"); + var incl = parts[1] !== "!"; + var ns = nsParts.shift(); + var role = nsParts.join(":"); + var partInfo = new PartInfo(incl, ns, role, attrInfo, parts[parts.length - 1]); + results.push(partInfo); + } + this.contextInfo = results; + } + Context.cleanContext = function (context) { + context = context.toLowerCase().trim(); + context = context.replace(/ +!/g, " !"); + context = context.replace(/ +([>+~,])/g, "$1"); + context = context.replace(/([>+~,]) +/g, "$1"); + context = context.replace(/ +/g, " "); + return context.trim(); + }; + Context.parse = function (context) { + var contexts = Context.splitMultiple(Context.cleanContext(context)); + var retVal = []; + for (var i = 0; i < contexts.length; ++i) { + var ctx = new Context(contexts[i]); + retVal.push(ctx); + } + return retVal; + }; + /** + * Handles initial processing of splitting on comma - context,context + * @param context + */ + Context.splitMultiple = function (context) { + var contexts = []; + if (context) { + if (context.indexOf(",") === -1) { + contexts.push(context); + } + else { + for (var _i = 0, _a = context.split(","); _i < _a.length; _i++) { + var c = _a[_i]; + contexts.push(c); + } + } + } + return contexts; + }; + return Context; +}()); +exports.Context = Context; + + +/***/ }, + +/***/ "./src/v2/common/Engine.ts" +/*!*********************************!*\ + !*** ./src/v2/common/Engine.ts ***! + \*********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Engine = void 0; +var DOMWalker_1 = __webpack_require__(/*! ../dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var Context_1 = __webpack_require__(/*! ./Context */ "./src/v2/common/Context.ts"); +var Config_1 = __webpack_require__(/*! ../config/Config */ "./src/v2/config/Config.ts"); +var DOMMapper_1 = __webpack_require__(/*! ../dom/DOMMapper */ "./src/v2/dom/DOMMapper.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../../v4/util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../../v4/api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../../v4/util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var WrappedRule = /** @class */ (function () { + function WrappedRule(rule, parsedInfo) { + this.rule = rule; + this.parsedInfo = parsedInfo; + this.ns = this.parsedInfo.contextInfo[this.parsedInfo.contextInfo.length - 1].namespace; + Config_1.Config.DEBUG && console.log("Added Rule:", rule.id, JSON.stringify(this.parsedInfo)); + } + /** + * This function is responsible converting the node into a snippet which can be added to report. + * + * Note: This function will take the node and extract the node name and the attributes and build the snippet based on this. + * + * TODO: Future, maybe we can extract more then just single line, add more info or even add closing tags etc... + * + * @param {HTMLElement} node - The html element to convert into element snippet with node name and attributes only. + * + * @return {String} nodeSnippet - return the element snippet of the element that was provided which only contains, + * nodename and attributes. i.e. <table id=\"layout_table1\" role=\"presentation\"> + * + * @memberOf this + */ + WrappedRule.convertNodeToSnippet = function (node) { + // Variable Decleration + var nodeSnippet = ''; + // Extract the node name and add it to the node snippet + nodeSnippet += '<' + node.nodeName.toLowerCase(); + // Extract all the node attributes as an array + var nodeAttributes = node.attributes; + // In the case there are attributes on this node + if (nodeAttributes !== null && typeof nodeAttributes !== 'undefined') { + // Loop over all theses attributes and add the name and value to the nodeSnippet which will be returned + for (var i = nodeAttributes.length - 1; i >= 0; i--) { + if (nodeAttributes[i].name === "data-namewalk") + continue; + // Add the attribute name and value. + nodeSnippet += ' ' + nodeAttributes[i].name + '="' + nodeAttributes[i].value + '"'; + } + } + // Close the node + nodeSnippet += '>'; + // Return the node snippet + return nodeSnippet; + }; + /** + * This function is responsible for finding the source location for a node, which can be added to a report. + * Supports debug directives in the following forms: + * 1. An attribute on the element itself: + * ibm-a11y-debug="file.ts:10:5" + * 2. A comment node preceding the element (as a sibling or ancestor sibling): + * <!-- ibm-a11y-debug: file.ts:10:5 --> + * 3. A wrapper element (e.g. div) whose first non-whitespace child is such a comment node. + * 4. An ancestor element that carries the ibm-a11y-debug attribute. + * + * Traversal: checks the node itself for an inline attribute, then scans previous siblings at + * each ancestor level upward (also checking each ancestor element's own inline attribute), + * stopping if a blank or 'end' marker is found. + * + * @param {Node} node - The DOM node to find source info for + * @return {string | null} - The source location string, or null if not found + * + * @memberOf this + */ + WrappedRule.convertNodeToSource = function (node, enabled) { + if (enabled === void 0) { enabled = false; } + //console.log("Source Map enabled:", enabled); + if (!enabled || !node) + return null; + var DEBUG_DIRECTIVE = "ibm-a11y-debug"; + /** + * Parses a source string into a DirectiveResult. + * The source is the final resolved value — after any ':' separator has already been stripped. + * A blank value or the exact word 'end' (case-insensitive) is a stop marker. + */ + var parseSource = function (source) { + if (!source || source.toLowerCase() === 'end') { + return { found: true, stop: true }; + } + return { found: true, stop: false, source: source }; + }; + /** + * Extracts the debug-directive comment value from a node. + * Handles: + * - A comment node directly + * - A wrapper element (e.g. <div>) whose first non-whitespace child is a comment node + * + * Returns { found: true, stop: true } if the directive is blank or exactly 'end', + * returns { found: true, stop: false, source } if a valid source is found, + * or returns { found: false } if no directive is present on this node. + */ + var extractDirective = function (elem) { + if (!elem) + return { found: false }; + var commentValue = null; + if (elem.nodeType === Node.COMMENT_NODE) { + // Direct comment node + commentValue = elem.nodeValue; + } + else if (elem.nodeType === Node.ELEMENT_NODE) { + // Element wrapper (e.g. <div><!-- ibm-a11y-debug: ... --></div>) + // Find the first non-whitespace child node + var child = elem.firstChild; + while (child) { + if (child.nodeType === Node.TEXT_NODE) { + // Skip pure whitespace text nodes + if (child.nodeValue && child.nodeValue.trim().length > 0) { + // Non-whitespace text before a comment — not a directive wrapper + break; + } + } + else if (child.nodeType === Node.COMMENT_NODE) { + commentValue = child.nodeValue; + break; + } + else { + // Any other node type before a comment — not a directive wrapper + break; + } + child = child.nextSibling; + } + } + if (commentValue !== null) { + var trimmed = commentValue.trim(); + // Match exactly "ibm-a11y-debug" followed by end-of-string, whitespace, or ':' + // This prevents "ibm-a11y-debug-extra" from being treated as a directive. + if (trimmed === DEBUG_DIRECTIVE || + trimmed.startsWith(DEBUG_DIRECTIVE + ':') || + trimmed.startsWith(DEBUG_DIRECTIVE + ' ') || + trimmed.startsWith(DEBUG_DIRECTIVE + '\t')) { + // Strip the directive name and optional leading whitespace + var afterDirective = trimmed.substring(DEBUG_DIRECTIVE.length).trimStart(); + // Strip a single leading ':' separator if present + // (e.g. "ibm-a11y-debug: file.ts:10:5" → afterDirective = ": file.ts:10:5") + var source = afterDirective.startsWith(':') + ? afterDirective.substring(1).trim() + : afterDirective.trim(); + return parseSource(source); + } + } + return { found: false }; + }; + /** + * Returns the ibm-a11y-debug attribute value from an element node as a DirectiveResult, + * or { found: false } if absent. Recognises the 'end' stop marker just like comment directives. + * The attribute value is the source directly (no ':' prefix), e.g. ibm-a11y-debug="file.ts:10:5". + */ + var getInlineAttr = function (n) { + if (n.nodeType !== Node.ELEMENT_NODE) + return { found: false }; + var val = n.getAttribute(DEBUG_DIRECTIVE); + if (val === null) + return { found: false }; + // Attribute value is the source directly — no ':' separator to strip + return parseSource(val.trim()); + }; + /** + * Traverses left (previous siblings) then upward (parent) to find source info. + * Does NOT check the starting element itself — only its preceding siblings and ancestors. + * This avoids misidentifying a content node as its own source directive. + * + * At each ancestor level the function also checks the ancestor element's own inline + * ibm-a11y-debug attribute, so that a parent element can annotate all its descendants. + * + * Sibling scanning stops at the first node that is recognised as a directive (found or stop). + * Non-directive nodes (real content elements, text nodes) are skipped so that a directive + * placed further back in the sibling list is still found even if content nodes intervene. + * However, traversal does NOT cross element boundaries when scanning siblings — only + * comment nodes and dedicated wrapper elements (whose sole first child is a comment) are + * treated as transparent. + * + * Shadow DOM traversal: uses DOMWalker.parentNode() to cross shadow boundaries correctly, + * including slotted content and nested Shadow DOM (shadow-in-shadow). When the parent + * chain reaches a ShadowRoot, DOMWalker.parentNode() automatically resolves it to the + * shadow host element in the outer DOM. A plain DocumentFragment with no host returns + * null from DOMWalker.parentNode(), stopping traversal. + * + * Sibling traversal uses DOMWalker.previousSiblingNotOwnedBySlot() to skip nodes that + * are assigned to slots (and therefore logically belong to a different part of the tree). + * + * Uses an iterative approach (rather than recursion) to safely handle deeply nested + * DOM structures without risk of stack overflow. + * + * @param elem - The node whose context we are searching + * @returns The source location string, or null if not found + */ + var findSource = function (elem) { + var current = elem; + while (current) { + // Scan previous siblings for a debug directive comment or wrapper element. + // Use previousSiblingNotOwnedBySlot to skip nodes assigned to slots, which + // logically belong to a different part of the composed tree. + // Only comment nodes and dedicated wrapper elements are considered directives; + // all other node types are skipped (they do not block further scanning). + var prev = DOMWalker_1.DOMWalker.previousSiblingNotOwnedBySlot(current); + while (prev) { + var result = extractDirective(prev); + if (result.found) { + if (result.stop) + return null; + return result.source; + } + prev = DOMWalker_1.DOMWalker.previousSiblingNotOwnedBySlot(prev); + } + // No directive found among siblings — move up to parent. + // Use DOMWalker.parentNode() instead of node.parentNode directly so that: + // 1. Shadow DOM boundaries are crossed automatically (ShadowRoot → host element), + // supporting both regular and nested Shadow DOM (shadow-in-shadow). + // 2. Slotted nodes are re-parented to their slot owner rather than their + // light-DOM parent, matching the composed (rendered) tree structure. + // 3. Nodes with an ownerElement (e.g. iframe document roots) are re-parented + // to their owner element. + var parent_1 = DOMWalker_1.DOMWalker.parentNode(current); + if (!parent_1 || parent_1.nodeType === Node.DOCUMENT_NODE) { + // Reached the top of the tree (or a plain DocumentFragment with no host) + // without finding a directive. + return null; + } + // Check the parent element's own inline attribute before continuing upward. + // This allows a containing element to annotate all its descendants. + // An 'end' inline attribute on the parent stops traversal entirely. + var parentAttrResult = getInlineAttr(parent_1); + if (parentAttrResult.found) { + if (parentAttrResult.stop) + return null; + return parentAttrResult.source; + } + current = parent_1; + } + return null; + }; + // First, check for an inline attribute directive on the element itself. + // An 'end' attribute on the element itself stops traversal (returns null). + var selfAttrResult = getInlineAttr(node); + if (selfAttrResult.found) { + if (selfAttrResult.stop) + return null; + return selfAttrResult.source; + } + // Then traverse the DOM to find a preceding comment directive or ancestor attribute + return findSource(node); + }; + WrappedRule.prototype.run = function (engine, context, options, contextHierarchies) { + var startTime = new Date().getTime(); + var results; + try { + results = this.rule.run(context, options, contextHierarchies); + } + catch (e) { + var err = e; + console.error("RULE EXCEPTION:", this.rule.id, context.dom.rolePath, err.stack); + throw e; + } + var endTime = new Date().getTime(); + if (!results) + results = []; + if (!(results instanceof Array)) { + results = [results]; + } + var retVal = []; + for (var _i = 0, results_1 = results; _i < results_1.length; _i++) { + var result = results_1[_i]; + var message = engine.getMessage(this.rule.id, result.reasonId, result.messageArgs); + var path = {}; + for (var ns in context) { + path[ns] = context[ns].rolePath; + } + var ruleId = this.rule.id.replace(/^(.*)\$\$\d+$/, "$1"); + retVal.push({ + ruleId: ruleId, + value: result.value, + node: context["dom"].node, + path: path, + ruleTime: endTime - startTime, + reasonId: result.reasonId, + message: message, + messageArgs: result.messageArgs, + apiArgs: result.apiArgs, + bounds: context["dom"].bounds, + snippet: WrappedRule.convertNodeToSnippet(context["dom"].node), + source: WrappedRule.convertNodeToSource(context["dom"].node, engine.isSourceMapEnabled()) + }); + } + return retVal; + }; + return WrappedRule; +}()); +var Engine = /** @class */ (function () { + function Engine() { + this.mappers = {}; + this.ruleMap = {}; + this.wrappedRuleMap = {}; + this.nlsMap = {}; + this.helpMap = {}; + this.sourceMapEnabled = false; + this.inclRules = {}; + this.exclRules = {}; + // Need a DOM Mapper as a minimum + this.addMapper(new DOMMapper_1.DOMMapper()); + } + Engine.getLanguages = function () { + var env = typeof process !== "undefined" && typeof process.nodeType === "undefined" && process.env; + // If all else fails, default to US English + var nodeLang = "en-US"; + if (env) { + nodeLang = env.LANG || env.LANGUAGE || env.LC_ALL || env.LC_MESSAGES; + if (nodeLang && nodeLang.length > 0) { + nodeLang = nodeLang.split(".")[0].replace(/_/g, "-"); + } + else { + nodeLang = "en-US"; + } + } + return typeof navigator !== "undefined" && navigator.languages || [nodeLang]; + }; + Engine.prototype.run = function (root, options) { + if (root === null) { + return Promise.reject("null document"); + } + if (root.nodeType === 9 /* Node.DOCUMENT_NODE */) { + root = root.documentElement; + } + root.ownerDocument && (root.ownerDocument.PT_CHECK_HIDDEN_CONTENT = false); + var numNodesVisited = CacheUtil_1.CacheUtil.clearCaches(root); + var walker = new DOMWalker_1.DOMWalker(root, false, root, true); + var retVal = { + results: [], + numExecuted: 0, + ruleTime: 0, + totalTime: 0 + }; + var start = new Date().getTime(); + // Reset the role mappers + for (var namespace in this.mappers) { + this.mappers[namespace].reset(root); + } + // Initialize the context detector + var currentNodeCount = 0; + var lastReportedPercent = -1; + do { + currentNodeCount++; + // Report progress at each percentage milestone + var currentPercent = Math.floor((currentNodeCount / numNodesVisited) * 100); + if (currentPercent > lastReportedPercent) { + if (numNodesVisited > 10000) { + // if (currentPercent > 6) break; + console.log("Progress: ".concat(currentPercent, "% (").concat(currentNodeCount, "/").concat(numNodesVisited, " nodes)")); + // const ruleTimes = retVal.results.reduce((prev, cur) => { + // prev[cur.ruleId] = (prev[cur.ruleId] || 0)+cur.ruleTime; + // return prev; + // }, {}); + // for (const ruleId in ruleTimes) { + // if (ruleTimes[ruleId] > 10000) { + // console.log(`${ruleId}: ${ruleTimes[ruleId]}`); + // } + // } + // console.groupEnd(); + } + lastReportedPercent = currentPercent; + } + // Get the context information from the rule mappers + var contextHierarchies = {}; + for (var namespace in this.mappers) { + if (!walker.bEndTag) { + contextHierarchies[namespace] = this.mappers[namespace].openScope(walker.node); + // if (namespace === "dom" && walker.node.nodeType === 1 /* Node.ELEMENT_NODE */) { + // const elem = walker.node as Element; + // let id; + // if (elem.hasAttribute("id") && (id = elem.getAttribute("id").trim()).length > 0) { + // if (root.ownerDocument.getElementById(id) === elem) { + // contextHierarchies["dom"][contextHierarchies["dom"].length-1].rolePath = "//*[@id='"+id+"']"; + // } + // } + // } + } + else { + contextHierarchies[namespace] = this.mappers[namespace].closeScope(walker.node); + } + } + if (walker.node.nodeType !== 11 + && (VisUtil_1.VisUtil.isNodeVisible(walker.node) + // || walker.node.nodeName.toLowerCase() === "head" + || walker.node.nodeName.toLowerCase() === "meta" + || walker.node.nodeName.toLowerCase() === "style" + || walker.node.nodeName.toLowerCase() === "datalist" + || walker.node.nodeName.toLowerCase() === "param" + || !DOMUtil_1.DOMUtil.getAncestor(walker.node, ["body"]))) { + var context = {}; + for (var ns in contextHierarchies) { + var nsHier = contextHierarchies[ns]; + var lastHier = nsHier[nsHier.length - 1]; + context[ns] = lastHier; + } + var matchingRules = this.getMatchingRules(contextHierarchies); + var depMatch = {}; + for (var _i = 0, matchingRules_1 = matchingRules; _i < matchingRules_1.length; _i++) { + var matchingRule = matchingRules_1[_i]; + var fulfillsDependencies = true; + for (var _a = 0, _b = matchingRule.rule.dependencies || []; _a < _b.length; _a++) { + var dep = _b[_a]; + if (!depMatch[dep]) + fulfillsDependencies = false; + } + if (fulfillsDependencies) { + var results = []; + var start_1 = new Date().getTime(); + try { + results = matchingRule.run(this, context, options, contextHierarchies); + } + catch (err) { + // Wrapper shows error in console. Skip this rule as N/A + // We don't want to kill the engine + } + // If out of scope, it fulfills the dependency + if (results.length === 0) { + depMatch[matchingRule.rule.id] = true; + } + for (var _c = 0, results_2 = results; _c < results_2.length; _c++) { + var result = results_2[_c]; + retVal.results.push(result); + retVal.ruleTime += result.ruleTime; + retVal.numExecuted++; + if (result.value[1] === IRule_1.eRuleConfidence.PASS) { + depMatch[result.ruleId] = true; + } + } + } + } + } + } while (walker.nextNode()); + CacheUtil_1.CacheUtil.clearCaches(root); + retVal.totalTime = new Date().getTime() - start; + return Promise.resolve(retVal); + }; + Engine.prototype.enableRules = function (ruleIds) { + for (var ruleId in this.ruleMap) { + this.ruleMap[ruleId].enabled = false; + } + for (var _i = 0, _a = ruleIds || []; _i < _a.length; _i++) { + var ruleId = _a[_i]; + if (!(ruleId in this.ruleMap)) { + console.warn("WARNING: Rule Id", ruleId, "could not be enabled."); + } + else { + this.ruleMap[ruleId].enabled = true; + } + } + }; + Engine.prototype.getRule = function (ruleId) { + return this.ruleMap[ruleId]; + }; + Engine.prototype.getRulesIds = function () { + var retVal = []; + for (var ruleId in this.ruleMap) { + retVal.push(ruleId); + } + return retVal; + }; + Engine.prototype.addRules = function (rules) { + for (var _i = 0, rules_1 = rules; _i < rules_1.length; _i++) { + var rule = rules_1[_i]; + this.addRule(rule, true); + } + this._sortRules(); + }; + Engine.prototype.addRule = function (rule, skipSort) { + var ctxs = Context_1.Context.parse(rule.context); + var idx = 0; + var ruleId = rule.id; + if (ruleId in this.ruleMap) { + console.log("WARNING: Rule", ruleId, "already added to engine. Ignoring..."); + return; + } + this.ruleMap[ruleId] = rule; + for (var _i = 0, ctxs_1 = ctxs; _i < ctxs_1.length; _i++) { + var ctx = ctxs_1[_i]; + var wrapId = ruleId; + if (idx >= 1) { + wrapId = ruleId + "$$" + idx; + } + ++idx; + var wrappedRule = new WrappedRule(rule, ctx); + this.wrappedRuleMap[wrapId] = wrappedRule; + var parts = wrappedRule.parsedInfo.contextInfo; + var lastPart = parts[parts.length - 1]; + var triggerRole = lastPart.namespace + ":" + lastPart.role; + if (lastPart.inclusive) { + this.inclRules[triggerRole] = this.inclRules[triggerRole] || []; + this.inclRules[triggerRole].push(wrappedRule); + } + else { + this.exclRules[triggerRole] = this.exclRules[triggerRole] || []; + this.exclRules[triggerRole].push(wrappedRule); + } + } + if (!skipSort) { + this._sortRules(); + } + }; + Engine.prototype.enableSourceMap = function (enable) { + this.sourceMapEnabled = enable; + }; + Engine.prototype.isSourceMapEnabled = function () { + return this.sourceMapEnabled; + }; + Engine.prototype._sortRules = function () { + for (var role in this.inclRules) { + this.inclRules[role].sort(function (ruleA, ruleB) { + var hasDepA = ruleA.rule.dependencies && ruleA.rule.dependencies.length > 0; + var hasDepB = ruleB.rule.dependencies && ruleB.rule.dependencies.length > 0; + // If B depends on A, sort A before B + if (hasDepB && ruleB.rule.dependencies.includes(ruleA.rule.id)) + return -1; + // If A depends on B, sort B before A + if (hasDepA && ruleA.rule.dependencies.includes(ruleB.rule.id)) + return 1; + // Otherwise, doesn't matter + return 0; + }); + } + for (var role in this.exclRules) { + this.exclRules[role].sort(function (ruleA, ruleB) { + var hasDepA = ruleA.rule.dependencies && ruleA.rule.dependencies.length > 0; + var hasDepB = ruleB.rule.dependencies && ruleB.rule.dependencies.length > 0; + // If B depends on A, sort A before B + if (hasDepB && ruleB.rule.dependencies.includes(ruleA.rule.id)) + return -1; + // If A depends on B, sort B before A + if (hasDepA && ruleA.rule.dependencies.includes(ruleB.rule.id)) + return 1; + // Otherwise, doesn't matter + return 0; + }); + } + }; + Engine.prototype.addNlsMap = function (map) { + for (var key in map) { + this.nlsMap[key] = map[key]; + } + }; + Engine.prototype.addHelpMap = function (map) { + for (var key in map) { + this.helpMap[key] = map[key]; + } + }; + Engine.prototype.getMessage = function (ruleId, ruleIdx, msgArgs) { + var splitter = ruleId.indexOf("$$"); + if (splitter >= 0) { + ruleId = ruleId.substring(0, splitter); + } + if (!(ruleId in this.nlsMap)) + return ruleId; + var messageTemplate = this.nlsMap[ruleId][ruleIdx || 0]; + if (!messageTemplate) + return ruleId + "_" + ruleIdx; + return messageTemplate.replace(/\{(\d+)\}/g, function (matchedStr, matchedNum, matchedIndex) { return msgArgs[matchedNum]; }); + }; + Engine.prototype.getHelp = function (ruleId, reasonId, archiveId) { + if (!archiveId) { + // Set to the latest + archiveId = "latest"; + } + return "".concat(Config_1.Config.helpRoot, "/").concat(archiveId, "/doc").concat(this.getHelpRel(ruleId, reasonId)); + }; + Engine.prototype.getHelpRel = function (ruleId, ruleIdx) { + var splitter = ruleId.indexOf("$$"); + if (splitter >= 0) { + ruleId = ruleId.substring(0, splitter); + } + if (!(ruleId in this.helpMap)) + return ruleId; + ruleIdx = ruleIdx || 0; + var helpStr = null; + if (ruleIdx in this.helpMap[ruleId]) { + helpStr = this.helpMap[ruleId][ruleIdx || 0]; + } + else { + helpStr = this.helpMap[ruleId][0]; + } + if (!helpStr) + return ruleId + "_" + ruleIdx; + return helpStr; + }; + Engine.prototype.addMapper = function (mapper) { + this.mappers[mapper.getNamespace()] = mapper; + }; + Engine.match = function (rule, contextHier) { + var ruleParts = rule.parsedInfo.contextInfo; + var partIdx = ruleParts.length - 1; + var curNS = ruleParts[partIdx].namespace; + var curHier = contextHier[curNS][contextHier[curNS].length - 1]; + var contextNode = curHier.node; + // If the end of the rule part doesn't match the end of the hierarchy, we don't have a match + if (!ruleParts[partIdx].matches(contextHier, contextHier[curNS].length - 1)) { + return false; + } + // If there was only one part, we have a match + if (ruleParts.length === 1) { + return true; + } + // Need to deal with parent parts. To walk the hierarchy, these need to be + // all in the same namespace. Confirm that is true. + curNS = ruleParts[0].namespace; + curHier = contextHier[curNS][contextHier[curNS].length - 1]; + --partIdx; + if (ruleParts.slice(0, ruleParts.length - 1).some(function (part) { return part.namespace !== curNS; })) { + console.error("[ERROR] Rule ".concat(rule.rule.id, " has inconsitent parent namespaces")); + return false; + } + // If the target node matches the end of the hierarchy, move up past it, otherwise, start at the end + var hierIdx = contextHier[curNS].length - (curHier.node.isSameNode(contextNode) ? 2 : 1); + while (hierIdx >= 0 && partIdx >= 0) { + var part = ruleParts[partIdx]; + var matchesPart = ruleParts[partIdx].matches(contextHier, hierIdx); + if (part.connector === ">") { + if (!matchesPart) { + // Direct parent check and doesn't match + return false; + } + else { + // Direct parent check and does match + --partIdx; + --hierIdx; + } + } + else if (part.connector === " ") { + if (part.inclusive) { + // inclusive ancestor match + if (matchesPart) { + --partIdx; + } + // If doesn't match, just move up the role hierarchy + --hierIdx; + } + else if (!matchesPart) { + // exclusive ancestor match and current matches + return false; + } + else { + // exclusive ancestor match and current doesn't match - check for other ancestors + var parentMatch = false; + for (var searchIdx = hierIdx - 1; !parentMatch && searchIdx >= 0; --searchIdx) { + parentMatch = !ruleParts[partIdx].matches(contextHier, searchIdx); + } + if (parentMatch) + return false; + else + --partIdx; + } + } + else { + throw new Error("Context connector " + part.connector + " is not supported"); + } + } + return partIdx === -1; + }; + Engine.prototype.getMatchingRules = function (ctxHier) { + var matches = []; + function addMatches(rules) { + for (var _i = 0, rules_2 = rules; _i < rules_2.length; _i++) { + var rule = rules_2[_i]; + if (rule.rule.enabled && Engine.match(rule, ctxHier)) { + matches.push(rule); + } + } + } + for (var ns in ctxHier) { + var role = ns + ":" + (ctxHier[ns].length > 0 ? ctxHier[ns][ctxHier[ns].length - 1].role : "none"); + if (role in this.inclRules) { + addMatches(this.inclRules[role]); + } + for (var xRole in this.exclRules) { + if (xRole !== role) { + addMatches(this.exclRules[xRole]); + } + } + if (role !== ns + ":none") { + if (role.startsWith(ns + ":/")) { + if (ns + ":/*" in this.inclRules) { + addMatches(this.inclRules[ns + ":/*"]); + } + } + else { + if (ns + ":*" in this.inclRules) { + addMatches(this.inclRules[ns + ":*"]); + } + } + } + } + return this.sortDeps(matches); + }; + /** + * Sorts the rules in order to execute dependencies in the correct order + * @param inRules List of wrapped rules to sort + * @returns Sorted list of wrapped rules + */ + Engine.prototype.sortDeps = function (inRules) { + var depRules = []; + for (var _i = 0, inRules_1 = inRules; _i < inRules_1.length; _i++) { + var rule = inRules_1[_i]; + depRules.push(rule); + } + var retVal = []; + var idToRule = {}; + // Iterate through the rules. If that rule's dependencies can be met by rules already in the list, add it to the list + // Repeat until no changes are made to the satisfied list + // If a rule cannot be satisfied, it will never execute, so it can be dropped. + var change = false; + do { + change = false; + for (var idx = 0; idx < depRules.length; ++idx) { + var depRule = depRules[idx]; + if (depRule.rule.id in idToRule) + continue; + var allMatch = true; + if (depRule.rule.dependencies && depRule.rule.dependencies.length > 0) { + for (var _a = 0, _b = depRule.rule.dependencies; _a < _b.length; _a++) { + var depId = _b[_a]; + if (!(depId in idToRule)) { + allMatch = false; + } + } + } + // if (depRule.rule.prereqs && depRule.rule.prereqs.length > 0) { + // for (const depId of depRule.rule.prereqs) { + // if (!(depId in idToRule)) { + // allMatch = false; + // } + // } + // } + if (allMatch) { + change = true; + retVal.push(depRule); + idToRule[depRule.rule.id] = true; + depRules.splice(idx--, 1); + } + } + } while (change); + return retVal; + }; + return Engine; +}()); +exports.Engine = Engine; + + +/***/ }, + +/***/ "./src/v2/config/Config.ts" +/*!*********************************!*\ + !*** ./src/v2/config/Config.ts ***! + \*********************************/ +(__unused_webpack_module, exports) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Config = void 0; +var Config = /** @class */ (function () { + function Config() { + } + Config.DEBUG = false; + Config.helpRoot = "https://able.ibm.com/rules/archives"; + return Config; +}()); +exports.Config = Config; + + +/***/ }, + +/***/ "./src/v2/dom/DOMMapper.ts" +/*!*********************************!*\ + !*** ./src/v2/dom/DOMMapper.ts ***! + \*********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.DOMMapper = void 0; +var CommonMapper_1 = __webpack_require__(/*! ../common/CommonMapper */ "./src/v2/common/CommonMapper.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../../v4/util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var DOMMapper = /** @class */ (function (_super) { + __extends(DOMMapper, _super); + function DOMMapper() { + return _super !== null && _super.apply(this, arguments) || this; + } + DOMMapper.prototype.getRole = function (node) { + return node.nodeName.toLowerCase(); + }; + DOMMapper.prototype.getNamespace = function () { + return "dom"; + }; + DOMMapper.prototype.getAttributes = function (node) { + var retVal = {}; + if (node.nodeType === 1 /* Node.ELEMENT_NODE */) { + var elem = node; + for (var idx = 0; idx < elem.attributes.length; ++idx) { + var attrInfo = elem.attributes[idx]; + retVal[attrInfo.name.toLowerCase()] = attrInfo.nodeValue; + } + } + return retVal; + }; + /** + * get scaled bounds for screenshot etc. adjusted for devicePixelRatio and scroll + * @param node + * @returns + */ + DOMMapper.prototype.getBounds = function (node) { + if (node.nodeType !== 1 /*Node.ELEMENT_NODE*/) + return null; + var cachedBounds = CacheUtil_1.CacheUtil.getCache(node, "DOMMapper_Bounds", undefined); + if (typeof cachedBounds !== "undefined") { + return cachedBounds; + } + var adjustment = 1; + if (node.ownerDocument && node.ownerDocument.defaultView && node.ownerDocument.defaultView.devicePixelRatio) { + adjustment = node.ownerDocument.defaultView.devicePixelRatio; + } + var bounds = node.getBoundingClientRect(); + // Do a check whether bounds has value as we use different tool (htmlUnit, browser) to call this function + if (bounds) { + var scrollX_1 = node && node.ownerDocument && node.ownerDocument.defaultView && node.ownerDocument.defaultView.scrollX || 0; + var scrollY_1 = node && node.ownerDocument && node.ownerDocument.defaultView && node.ownerDocument.defaultView.scrollY || 0; + var ret = { + "left": Math.ceil((bounds.left + scrollX_1) * adjustment), + "top": Math.ceil((bounds.top + scrollY_1) * adjustment), + "height": Math.ceil(bounds.height * adjustment), + "width": Math.ceil(bounds.width * adjustment) + }; + CacheUtil_1.CacheUtil.setCache(node, "DOMMapper_Bounds", ret); + return ret; + } + return null; + }; + /** + * get real CSS bounds in css pixels, adjusted for scroll only + * @param node + * @returns + */ + DOMMapper.prototype.getUnadjustedBounds = function (node) { + if (node.nodeType !== 1 /*Node.ELEMENT_NODE*/) + return null; + var cachedBounds = CacheUtil_1.CacheUtil.getCache(node, "DOMMapper_UnadjustedBounds", undefined); + if (typeof cachedBounds !== "undefined") { + return cachedBounds; + } + var bounds = node.getBoundingClientRect(); + // adjusted for scroll if any + if (bounds) { + var scrollX_2 = node && node.ownerDocument && node.ownerDocument.defaultView && node.ownerDocument.defaultView.scrollX || 0; + var scrollY_2 = node && node.ownerDocument && node.ownerDocument.defaultView && node.ownerDocument.defaultView.scrollY || 0; + var ret = { + "left": Math.ceil(bounds.left + scrollX_2), + "top": Math.ceil(bounds.top + scrollY_2), + "height": Math.ceil(bounds.height), + "width": Math.ceil(bounds.width) + }; + CacheUtil_1.CacheUtil.setCache(node, "DOMMapper_UnadjustedBounds", ret); + return ret; + } + return null; + }; + return DOMMapper; +}(CommonMapper_1.CommonMapper)); +exports.DOMMapper = DOMMapper; + + +/***/ }, + +/***/ "./src/v2/dom/DOMUtil.ts" +/*!*******************************!*\ + !*** ./src/v2/dom/DOMUtil.ts ***! + \*******************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.DOMUtil = void 0; +var DOMWalker_1 = __webpack_require__(/*! ./DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +/** + * Utility class providing helper methods for DOM manipulation and traversal operations. + * Used throughout the accessibility checker engine to navigate and analyze DOM structures. + */ +var DOMUtil = /** @class */ (function () { + function DOMUtil() { + } + /** + * Checks if a given node has an ancestor element with a node name matching any of the provided names. + * Traverses up the DOM tree from the given node until a match is found or the root is reached. + * + * @param node - The starting DOM node to check + * @param names - Array of node names (tag names) to search for in uppercase (e.g., ['TABLE', 'DIV']) + * @returns true if an ancestor with a matching name is found, false otherwise + */ + DOMUtil.hasParent = function (node, names) { + var p = DOMWalker_1.DOMWalker.parentElement(node); + while (p && !names.includes(p.nodeName)) { + p = DOMWalker_1.DOMWalker.parentElement(p); + } + return !!p; + }; + /** + * Retrieves the first ancestor element that matches any of the provided node names (case-insensitive). + * Similar to hasParent but returns the actual element reference and performs case-insensitive comparison. + * + * @param node - The starting DOM node + * @param names - Array of lowercase node names to search for (e.g., ['table', 'div']) + * @returns The matching ancestor element, or null if none found + */ + DOMUtil.getAncestor = function (node, names) { + var p = DOMWalker_1.DOMWalker.parentElement(node); + while (p && !names.includes(p.nodeName.toLowerCase())) { + p = DOMWalker_1.DOMWalker.parentElement(p); + } + return p; + }; + /** + * Determines if two nodes are the same node, with fallback strategies for different browser environments. + * Uses multiple comparison methods for cross-browser compatibility: + * 1. Strict equality (===) + * 2. isSameNode() method if available + * 3. compareDocumentPosition() (returns 0 if same node) + * 4. Returns true as last resort if no comparison method is available + * + * @param a - First node to compare + * @param b - Second node to compare + * @returns true if nodes are the same, false otherwise + */ + DOMUtil.sameNode = function (a, b) { + if (a === b) { + return true; + } + else if (a.isSameNode) { + return a.isSameNode(b); + } + else if (a.compareDocumentPosition) { + return a.compareDocumentPosition(b) === 0; + } + else { + // Not supported in this environment - try our best + return true; + } + }; + /** + * Normalizes whitespace in a string by replacing all whitespace characters + * (spaces, tabs, carriage returns, newlines) with single spaces and collapsing + * multiple consecutive spaces into one. + * + * @param s - The input string to clean + * @returns The cleaned string with normalized whitespace + * @example "Hello\n\t World" → "Hello World" + */ + DOMUtil.cleanWhitespace = function (s) { + var retVal = s.replace(/[ \t\r\n]/g, " ").replace(/ +/g, " "); + return retVal; + }; + /** + * Collapses multiple consecutive spaces into a single space. + * Unlike cleanWhitespace, only handles spaces, not other whitespace characters like tabs or newlines. + * + * @param s - The input string to clean + * @returns The string with collapsed spaces + */ + DOMUtil.cleanSpace = function (s) { + var retVal = s.replace(/ +/g, " "); + return retVal; + }; + /** + * Determines if two elements (typically table cells) belong to the same table element. + * Finds the table ancestor for each element and compares them using sameNode(). + * + * @param element1 - First element to check + * @param element2 - Second element to check + * @returns true if both elements share the same table ancestor, false otherwise + */ + DOMUtil.isInSameTable = function (element1, element2) { + if (element1 && element2) { + var parentName = ['table']; + var parent1 = DOMUtil.getAncestor(element1, parentName); + var parent2 = DOMUtil.getAncestor(element2, parentName); + if (parent1 !== null && parent2 != null && DOMUtil.sameNode(parent1, parent2)) + return true; + } + return false; + }; + /** + * Traverses up the DOM tree to find the shadow root (document fragment) that contains the given node. + * Important for handling Web Components and Shadow DOM structures in accessibility checking. + * + * @param node - The starting node + * @returns The shadow root node (nodeType 11 = DOCUMENT_FRAGMENT_NODE), or null if none found + */ + DOMUtil.shadowRootNode = function (node) { + var nd = node; + while (nd != null && nd.nodeType !== 11 /* Node.DOCUMENT_FRAGMENT_NODE */) + nd = nd.parentNode; + return nd; + }; + /** + * Creates a deep copy of an object while preserving Node references (doesn't clone Node objects). + * Useful when copying data structures that contain DOM node references, as you typically want + * to preserve those references rather than attempting to clone the nodes themselves. + * + * Behavior: + * - Primitive values: Deep copied via JSON serialization + * - Functions: Returned as-is (reference) + * - Node objects: Returned as-is (reference, not cloned) + * - Arrays/Objects: Recursively copied with the same rules + * + * @param rhs - The object to copy (right-hand side) + * @returns A copy of the object with Node references preserved + */ + DOMUtil.objectCopyWithNodeRefs = function (rhs) { + if (!rhs) + return rhs; + if (typeof rhs !== "object") { + if (typeof rhs === "function") { + return rhs; + } + else { + return JSON.parse(JSON.stringify(rhs)); + } + } + else if (rhs instanceof Node || !!rhs.nodeType) { + return rhs; + } + else { + var retVal = void 0; + if (rhs.constructor.name === "Array") { + retVal = []; + for (var _i = 0, rhs_1 = rhs; _i < rhs_1.length; _i++) { + var item = rhs_1[_i]; + retVal.push(this.objectCopyWithNodeRefs(item)); + } + } + else { + retVal = {}; + for (var key in rhs) { + retVal[key] = this.objectCopyWithNodeRefs(rhs[key]); + } + } + return retVal; + } + }; + /** + * Finds the first ancestor element that has a specific attribute with a specific value. + * Traverses up the DOM tree from the given element until a matching ancestor is found. + * + * @param element - The starting element + * @param attrName - The attribute name to search for + * @param attrValue - The expected attribute value + * @returns The matching ancestor element, or null if none found + * @example Finding an ancestor with aria-hidden="true" or data-testid="container" + */ + DOMUtil.getAncestorWithAttribute = function (element, attrName, attrValue) { + var walkNode = DOMWalker_1.DOMWalker.parentNode(element); + while (walkNode !== null) { + if (walkNode.nodeType === 1 /* Node.ELEMENT_NODE */ && walkNode.getAttribute(attrName) === attrValue) + return walkNode; + walkNode = DOMWalker_1.DOMWalker.parentNode(walkNode); + } + return null; + }; + return DOMUtil; +}()); +exports.DOMUtil = DOMUtil; + + +/***/ }, + +/***/ "./src/v2/dom/DOMWalker.ts" +/*!*********************************!*\ + !*** ./src/v2/dom/DOMWalker.ts ***! + \*********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.DOMWalker = void 0; +var VisUtil_1 = __webpack_require__(/*! ../../v4/util/VisUtil */ "./src/v4/util/VisUtil.ts"); +/** + * Walks in a DOM order + * + * Assumption that nodes of shadow DOMs call assignSlots on the shadow root before + * doing other processing in that tree. If you walk into a shadow root, the DOMWalker + * will do it automatically. + * + * See also ../aria/ARIAWalker + */ +var DOMWalker = /** @class */ (function () { + function DOMWalker(element, bEnd, root, considerHidden, DEBUG) { + this.DEBUGIDX = 0; + this.indent = 0; + this.DEBUG = !!DEBUG; + this.root = root || ((element && element.ownerDocument) ? element.ownerDocument.documentElement : element); + if (this.root.nodeType === 9) { + this.root = this.root.documentElement; + } + this.node = element; + if (this.node.nodeType === 9) { + this.node = this.node.documentElement; + } + this.bEndTag = (bEnd == undefined ? false : bEnd == true); + this.considerHidden = considerHidden || false; + } + DOMWalker.prototype.elem = function () { + return this.node.nodeType === 1 && this.node || null; + }; + DOMWalker.parentNode = function (node) { + if (node === null) + return null; + var p = node.parentNode; + if (node.slotOwner) { + p = node.slotOwner; + } + else if (node.ownerElement) { + p = node.ownerElement; + } + else if (p && p.nodeType === 11) { + if (p.host) { + p = p.host; + } + else { + p = null; + } + } + return p; + }; + DOMWalker.parentElement = function (node) { + var elem = node; + do { + elem = DOMWalker.parentNode(elem); + } while (elem && elem.nodeType !== 1); + return elem; + }; + DOMWalker.assignSlots = function (root) { + var slots = root.querySelectorAll("slot"); + for (var iSlot = 0; iSlot < slots.length; ++iSlot) { + var processSlot = slots[iSlot]; + var assignedNodes = processSlot.assignedNodes(); + for (var iAssigned = 0; iAssigned < assignedNodes.length; ++iAssigned) { + assignedNodes[iAssigned].slotOwner = processSlot; + assignedNodes[iAssigned].slotIndex = iAssigned; + } + } + }; + DOMWalker.firstChildNotOwnedBySlot = function (node) { + var retVal = node.firstChild; + while (retVal && retVal.slotOwner) { + retVal = retVal.nextSibling; + } + return retVal; + }; + DOMWalker.lastChildNotOwnedBySlot = function (node) { + var retVal = node.lastChild; + while (retVal && retVal.slotOwner) { + retVal = retVal.previousSibling; + } + return retVal; + }; + DOMWalker.nextSiblingNotOwnedBySlot = function (node) { + var retVal = node.nextSibling; + while (retVal && retVal.slotOwner) { + retVal = retVal.nextSibling; + } + return retVal; + }; + DOMWalker.previousSiblingNotOwnedBySlot = function (node) { + var retVal = node.previousSibling; + while (retVal && retVal.slotOwner) { + retVal = retVal.previousSibling; + } + return retVal; + }; + DOMWalker.prototype.atRoot = function () { + if (this.node.ownerElement) + return false; + if (this.root === this.node) { + return true; + } + else if (this.root.isSameNode) { + return this.root.isSameNode(this.node); + } + else if (this.root.compareDocumentPosition) { + return this.root.compareDocumentPosition(this.node) === 0; + } + else { + // Not supported in this environment - try our best + return this.node.parentNode === null; + } + }; + DOMWalker.prototype.nextNode = function () { + var _this = this; + var indent = function () { + var s = ""; + for (var idx = 0; idx < _this.indent; ++idx) { + s += " "; + } + return s; + }; + var DBG = false; //this.DEBUGIDX >= 7 && this.DEBUGIDX <= 10; + var startName = this.node.nodeName; + if (!this.node) { + this.bEndTag = false; + return false; + } + do { + //console.log(this.node.nodeName, this.bEndTag?"END":"START", this.node.nodeType === 1 && (this.node as any).getAttribute("id")); + if (!this.bEndTag) { + var iframeNode = this.node; + var elementNode = this.node; + var slotElement = this.node; + if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && this.node.nodeName.toUpperCase() === "IFRAME" + && (this.considerHidden ? VisUtil_1.VisUtil.isNodeVisible(iframeNode) : true) + && iframeNode.contentDocument + && iframeNode.contentDocument.documentElement) { + DBG && console.log("!!!Into Frame"); + var ownerElement = this.node; + this.node = iframeNode.contentDocument.documentElement; + this.node.ownerElement = ownerElement; + } + else if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && (this.considerHidden ? VisUtil_1.VisUtil.isNodeVisible(elementNode) : true) + && elementNode.shadowRoot + && elementNode.shadowRoot.firstChild) { + DBG && console.log("!!!Into shadow root"); + var ownerElement = this.node; + this.node = elementNode.shadowRoot; + this.node.ownerElement = ownerElement; + DOMWalker.assignSlots(this.node); + } + else if (this.node.nodeType === 1 + && elementNode.nodeName.toLowerCase() === "slot" + && slotElement.assignedNodes().length > 0) { + DBG && console.log("!!!Into slot"); + this.node = slotElement.assignedNodes()[0]; + } + else if ((this.node.nodeType === 1 /* Node.ELEMENT_NODE */ || this.node.nodeType === 11 /* Node.DOCUMENT_FRAGMENT_NODE */) + && DOMWalker.firstChildNotOwnedBySlot(this.node)) { + DBG && console.log("!!!First child"); + this.node = DOMWalker.firstChildNotOwnedBySlot(this.node); + } + else { + DBG && console.log("!!!Flip to end tag"); + this.bEndTag = true; + } + } + else { + DBG && console.log("!!!1"); + if (this.atRoot()) { + DBG && console.log("!!!Done at root"); + return false; + } + else if (this.node.slotOwner) { + var slotOwner = this.node.slotOwner; + var nextSlotIndex = this.node.slotIndex + 1; + // delete (this.node as any).slotOwner; + // delete (this.node as any).slotIndex; + if (nextSlotIndex < slotOwner.assignedNodes().length) { + DBG && console.log("!!!Next slot child"); + this.node = slotOwner.assignedNodes()[nextSlotIndex]; + this.bEndTag = false; + } + else { + DBG && console.log("!!!Back up to slot owner"); + this.node = slotOwner; + this.bEndTag = true; + } + } + else if (this.node.ownerElement) { + DBG && console.log("!!!Up to frame owner"); + this.node = this.node.ownerElement; + this.bEndTag = true; + } + else if (DOMWalker.nextSiblingNotOwnedBySlot(this.node)) { + DBG && console.log("!!!Next sibling"); + this.node = DOMWalker.nextSiblingNotOwnedBySlot(this.node); + this.bEndTag = false; + } + else if (this.node.parentNode) { + DBG && console.log("!!!Parent"); + this.node = this.node.parentNode; + this.bEndTag = true; + } + else { + DBG && console.log("!!!Done with walk"); + return false; + } + } + if (DBG && ((this.node.nodeType !== 1 && this.node.nodeType !== 11 && this.node.nodeType !== 3) + || (this.node.nodeType === 1 && this.node.getAttribute("aChecker") === "ACE"))) { + this.DEBUG && console.log(indent() + "<".concat(this.bEndTag ? "/" : "").concat(this.node.nodeName, "> (from ").concat(startName, ") ").concat(this.DEBUGIDX++, " SKIPPED")); + } + } while ((this.node.nodeType !== 1 && this.node.nodeType !== 11 && this.node.nodeType !== 3) + || (this.node.nodeType === 1 && this.node.getAttribute("aChecker") === "ACE")); + if (this.bEndTag) + this.indent -= 2; + this.DEBUG && console.log(indent() + "<".concat(this.bEndTag ? "/" : "").concat(this.node.nodeName, "> (from ").concat(startName, ") ").concat(this.DEBUGIDX++)); + this.DEBUG && this.node.slotOwner && console.log(indent() + "slotOwner: ".concat(this.node.slotOwner.nodeName)); + this.DEBUG && this.node.slotIndex && console.log(indent() + "slotIndex: ".concat(this.node.slotIndex)); + this.DEBUG && this.node.ownerElement && console.log(indent() + "ownerElement: ".concat(this.node.ownerElement.nodeName)); + if (!this.bEndTag) + this.indent += 2; + return true; + }; + DOMWalker.prototype.prevNode = function () { + do { + if (this.bEndTag) { + var iframeNode = this.node; + var elementNode = this.node; + if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && this.node.nodeName.toUpperCase() === "IFRAME" + && (this.considerHidden ? VisUtil_1.VisUtil.isNodeVisible(iframeNode) : true) + && iframeNode.contentDocument + && iframeNode.contentDocument.documentElement) { + var ownerElement = this.node; + this.node = iframeNode.contentDocument.documentElement; + this.node.ownerElement = ownerElement; + } + else if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && (this.considerHidden ? VisUtil_1.VisUtil.isNodeVisible(elementNode) : true) + && elementNode.shadowRoot + && elementNode.shadowRoot.lastChild) { + var ownerElement = this.node; + this.node = elementNode.shadowRoot; + this.node.ownerElement = ownerElement; + DOMWalker.assignSlots(this.node); + } + else if (this.node.nodeType === 1 + && elementNode.nodeName.toLowerCase() === "slot" + && elementNode.assignedNodes().length > 0) { + // Enter slot with assigned nodes - go to last assigned node + var slotElement = elementNode; + this.node = slotElement.assignedNodes()[slotElement.assignedNodes().length - 1]; + } + else if ((this.node.nodeType === 1 /* Node.ELEMENT_NODE */ || this.node.nodeType === 11) + && DOMWalker.lastChildNotOwnedBySlot(this.node)) { + this.node = DOMWalker.lastChildNotOwnedBySlot(this.node); + } + else { + this.bEndTag = false; + } + } + else { + if (this.atRoot()) { + return false; + } + else if (this.node.slotOwner) { + var slotOwner = this.node.slotOwner; + var prevSlotIndex = this.node.slotIndex - 1; + if (prevSlotIndex >= 0) { + this.node = slotOwner.assignedNodes()[prevSlotIndex]; + this.bEndTag = true; + } + else { + this.node = slotOwner; + this.bEndTag = false; + } + } + else if (DOMWalker.previousSiblingNotOwnedBySlot(this.node)) { + this.node = DOMWalker.previousSiblingNotOwnedBySlot(this.node); + this.bEndTag = true; + } + else if (this.node.ownerElement) { + this.node = this.node.ownerElement; + this.bEndTag = false; + } + else if (this.node.parentNode) { + this.node = this.node.parentNode; + this.bEndTag = false; + } + else { + return false; + } + } + } while ((this.node.nodeType !== 1 /* Node.ELEMENT_NODE */ && this.node.nodeType !== 11 && this.node.nodeType !== 3) + || (this.node.nodeType === 1 && this.node.getAttribute("aChecker") === "ACE")); + return true; + }; + return DOMWalker; +}()); +exports.DOMWalker = DOMWalker; + + +/***/ }, + +/***/ "./src/v4/api/IGuideline.ts" +/*!**********************************!*\ + !*** ./src/v4/api/IGuideline.ts ***! + \**********************************/ +(__unused_webpack_module, exports) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.eGuidelineType = exports.eGuidelineCategory = exports.eToolkitLevel = void 0; +var eToolkitLevel; +(function (eToolkitLevel) { + eToolkitLevel["LEVEL_ONE"] = "1"; + eToolkitLevel["LEVEL_TWO"] = "2"; + eToolkitLevel["LEVEL_THREE"] = "3"; + eToolkitLevel["LEVEL_FOUR"] = "4"; +})(eToolkitLevel = exports.eToolkitLevel || (exports.eToolkitLevel = {})); +var eGuidelineCategory; +(function (eGuidelineCategory) { + eGuidelineCategory["ACCESSIBILITY"] = "Accessibility"; + eGuidelineCategory["DESIGN"] = "Design"; + eGuidelineCategory["OTHER"] = "Other"; +})(eGuidelineCategory = exports.eGuidelineCategory || (exports.eGuidelineCategory = {})); +var eGuidelineType; +(function (eGuidelineType) { + eGuidelineType["DEFAULT"] = "default"; + eGuidelineType["EXTENSION"] = "extension"; +})(eGuidelineType = exports.eGuidelineType || (exports.eGuidelineType = {})); + + +/***/ }, + +/***/ "./src/v4/api/IRule.ts" +/*!*****************************!*\ + !*** ./src/v4/api/IRule.ts ***! + \*****************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.eRulesetType = exports.eRuleCategory = exports.eToolkitLevel = exports.RuleManual = exports.RulePotential = exports.RuleFail = exports.RuleRender = exports.RulePass = exports.eRulePolicy = exports.eRuleConfidence = void 0; +var eRuleConfidence; +(function (eRuleConfidence) { + eRuleConfidence["PASS"] = "PASS"; + eRuleConfidence["FAIL"] = "FAIL"; + eRuleConfidence["POTENTIAL"] = "POTENTIAL"; + eRuleConfidence["MANUAL"] = "MANUAL"; +})(eRuleConfidence = exports.eRuleConfidence || (exports.eRuleConfidence = {})); +var eRulePolicy; +(function (eRulePolicy) { + eRulePolicy["VIOLATION"] = "VIOLATION"; + eRulePolicy["RECOMMENDATION"] = "RECOMMENDATION"; + eRulePolicy["INFORMATION"] = "INFORMATION"; +})(eRulePolicy = exports.eRulePolicy || (exports.eRulePolicy = {})); +function RulePass(reasonId, messageArgs, apiArgs) { + if (typeof reasonId === "undefined" || reasonId === null) + throw new Error("Reason ID must be defined"); + return { + value: [eRulePolicy.INFORMATION, eRuleConfidence.PASS], + reasonId: reasonId, + messageArgs: messageArgs || [], + apiArgs: apiArgs || [] + }; +} +exports.RulePass = RulePass; +function RuleRender(reasonId, messageArgs, apiArgs) { + if (typeof reasonId === "undefined" || reasonId === null) + throw new Error("Reason ID must be defined"); + return { + value: [eRulePolicy.INFORMATION, eRuleConfidence.PASS], + reasonId: 0, + messageArgs: messageArgs || [], + apiArgs: apiArgs || [] + }; +} +exports.RuleRender = RuleRender; +function RuleFail(reasonId, messageArgs, apiArgs) { + if (typeof reasonId === "undefined" || reasonId === null) + throw new Error("Reason ID must be defined"); + return { + value: [eRulePolicy.INFORMATION, eRuleConfidence.FAIL], + reasonId: reasonId, + messageArgs: messageArgs || [], + apiArgs: apiArgs || [] + }; +} +exports.RuleFail = RuleFail; +function RulePotential(reasonId, messageArgs, apiArgs) { + if (typeof reasonId === "undefined" || reasonId === null) + throw new Error("Reason ID must be defined"); + return { + value: [eRulePolicy.INFORMATION, eRuleConfidence.POTENTIAL], + reasonId: reasonId, + messageArgs: messageArgs || [], + apiArgs: apiArgs || [] + }; +} +exports.RulePotential = RulePotential; +function RuleManual(reasonId, messageArgs, apiArgs) { + if (typeof reasonId === "undefined" || reasonId === null) + throw new Error("Reason ID must be defined"); + return { + value: [eRulePolicy.INFORMATION, eRuleConfidence.MANUAL], + reasonId: reasonId, + messageArgs: messageArgs || [], + apiArgs: apiArgs || [] + }; +} +exports.RuleManual = RuleManual; +/** + * @deprecated See ./IGuideline + */ +var IGuideline_1 = __webpack_require__(/*! ./IGuideline */ "./src/v4/api/IGuideline.ts"); +Object.defineProperty(exports, "eToolkitLevel", ({ enumerable: true, get: function () { return IGuideline_1.eToolkitLevel; } })); +/** + * @deprecated See ./IGuideline:eGuidelineCategory + */ +var IGuideline_2 = __webpack_require__(/*! ./IGuideline */ "./src/v4/api/IGuideline.ts"); +Object.defineProperty(exports, "eRuleCategory", ({ enumerable: true, get: function () { return IGuideline_2.eGuidelineCategory; } })); +/** + * @deprecated See ./IGuideline:eGuidelineType + */ +var IGuideline_3 = __webpack_require__(/*! ./IGuideline */ "./src/v4/api/IGuideline.ts"); +Object.defineProperty(exports, "eRulesetType", ({ enumerable: true, get: function () { return IGuideline_3.eGuidelineType; } })); + + +/***/ }, + +/***/ "./src/v4/checker/Checker.ts" +/*!***********************************!*\ + !*** ./src/v4/checker/Checker.ts ***! + \***********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Checker = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var Engine_1 = __webpack_require__(/*! ../../v2/common/Engine */ "./src/v2/common/Engine.ts"); +var ARIAMapper_1 = __webpack_require__(/*! ../../v2/aria/ARIAMapper */ "./src/v2/aria/ARIAMapper.ts"); +var rulesets_1 = __webpack_require__(/*! ../rulesets */ "./src/v4/rulesets.ts"); +var checkRulesV4 = __importStar(__webpack_require__(/*! ../rules */ "./src/v4/rules/index.ts")); +var IGuideline_1 = __webpack_require__(/*! ../api/IGuideline */ "./src/v4/api/IGuideline.ts"); +var checkRules = []; +var checkNls = {}; +var checkHelp = {}; +function _initialize() { + var langs = JSON.parse(JSON.stringify(Engine_1.Engine.getLanguages())); + // Default lang to en-US if nothing else specified is found + langs.push("en-US"); + // Process V4 rules into the V2 format + for (var rulename in checkRulesV4) { + // Convert rule + var v4Rule = checkRulesV4[rulename]; + checkRules.push(v4Rule); + // Go backwards because the first lang is the preferred, so + // earlier languages will override later languages + for (var idx = langs.length - 1; idx >= 0; --idx) { + var langId = langs[idx]; + if (langId in v4Rule.messages) { + checkNls[v4Rule.id] = v4Rule.messages[langId]; + checkNls[v4Rule.id][0] = checkNls[v4Rule.id].group; + } + if (langId in v4Rule.help) { + checkHelp[v4Rule.id] = {}; + for (var reasonId in v4Rule.help[langId]) { + checkHelp[v4Rule.id][reasonId] = "/".concat(langId, "/").concat(v4Rule.help[langId][reasonId]); + } + checkNls[v4Rule.id][0] = checkNls[v4Rule.id].group; + } + } + // Convert RS + for (var _i = 0, _a = v4Rule.rulesets; _i < _a.length; _i++) { + var rsSection = _a[_i]; + for (var _b = 0, _c = rulesets_1.a11yRulesets; _b < _c.length; _b++) { + var rs = _c[_b]; + var checkRsIds = typeof rsSection.id === "string" ? [rsSection.id] : rsSection.id; + if (checkRsIds.includes(rs.id)) { + for (var _d = 0, _e = rs.checkpoints; _d < _e.length; _d++) { + var cp = _e[_d]; + var checkCPIds = typeof rsSection.num === "string" ? [rsSection.num] : rsSection.num; + if (checkCPIds.includes(cp.num)) { + cp.rules = cp.rules || []; + cp.rules.push({ + id: v4Rule.id, + reasonCodes: rsSection.reasonCodes, + level: rsSection.level, + toolkitLevel: rsSection.toolkitLevel + }); + } + } + } + } + } + } +} +_initialize(); +var Checker = /** @class */ (function () { + function Checker() { + this.guidelines = []; + /** + * @deprecated Use getGuidelines(). + */ + this.rulesets = this.guidelines; + /** + * @deprecated Use getGuidelineIds(). + */ + this.rulesetIds = []; + this.rulesetRules = {}; + this.ruleLevels = {}; + this.ruleReasonLevels = {}; + this.ruleCategory = {}; + var engine = this.engine = new Engine_1.Engine(); + engine.addMapper(new ARIAMapper_1.ARIAMapper()); + engine.addRules(checkRules); + engine.addNlsMap(checkNls); + engine.addHelpMap(checkHelp); + for (var _i = 0, a11yRulesets_1 = rulesets_1.a11yRulesets; _i < a11yRulesets_1.length; _i++) { + var rs = a11yRulesets_1[_i]; + this.addRuleset(rs); + } + } + /** + * Adds a guideline to the engine. If the id already exists, the previous guideline will be replaced. + * @param guideline + */ + Checker.prototype.addGuideline = function (guideline) { + if (guideline.id in this.rulesetRules) { + this.removeGuideline(guideline.id); + } + this.guidelines.push(guideline); + this.rulesetIds.push(guideline.id); + var ruleIds = []; + for (var _i = 0, _a = guideline.checkpoints; _i < _a.length; _i++) { + var cp = _a[_i]; + cp.rules = cp.rules || []; + for (var _b = 0, _c = cp.rules; _b < _c.length; _b++) { + var rule = _c[_b]; + if (rule.enabled !== false) { + ruleIds.push(rule.id); + //this.ruleLevels[rule.id] = this.ruleLevels[rule.id] || {}; + //this.ruleLevels[rule.id][guideline.id] = rule.level; + this.ruleReasonLevels[rule.id] = this.ruleReasonLevels[rule.id] || {}; + this.ruleReasonLevels[rule.id][guideline.id] = this.ruleReasonLevels[rule.id][guideline.id] || {}; + var code = rule.reasonCodes ? rule.reasonCodes.join('--') : "None"; + this.ruleReasonLevels[rule.id][guideline.id][code] = rule.level; + this.ruleCategory[rule.id] = this.ruleCategory[rule.id] || {}; + this.ruleCategory[rule.id][guideline.id] = guideline.category; + } + } + } + this.rulesetRules[guideline.id] = ruleIds; + }; + /** + * Enable a rule for all guidelines + * @param ruleId + */ + Checker.prototype.enableRule = function (ruleId) { + for (var _i = 0, _a = this.getGuidelines(); _i < _a.length; _i++) { + var guideline = _a[_i]; + var updated = false; + for (var _b = 0, _c = guideline.checkpoints; _b < _c.length; _b++) { + var cp = _c[_b]; + for (var _d = 0, _e = cp.rules; _d < _e.length; _d++) { + var rule = _e[_d]; + if (rule.enabled === false) { + updated = true; + delete rule.enabled; + } + } + } + if (updated) { + this.addGuideline(guideline); + } + } + }; + /** + * Disable a rule for all guidelines + * @param ruleId + */ + Checker.prototype.disableRule = function (ruleId) { + for (var _i = 0, _a = this.getGuidelines(); _i < _a.length; _i++) { + var guideline = _a[_i]; + var updated = false; + for (var _b = 0, _c = guideline.checkpoints; _b < _c.length; _b++) { + var cp = _c[_b]; + for (var _d = 0, _e = cp.rules; _d < _e.length; _d++) { + var rule = _e[_d]; + if (rule.enabled !== false) { + updated = true; + rule.enabled = false; + } + } + } + if (updated) { + this.addGuideline(guideline); + } + } + }; + /** + * Remove a guideline from the engine + * + * Generally, there isn't a good reason to do this. Users should just not select the guideline as an option in check + * @param guidelineId + */ + Checker.prototype.removeGuideline = function (guidelineId) { + if (guidelineId in this.rulesetRules) { + delete this.rulesetRules[guidelineId]; + this.rulesets = this.guidelines = this.guidelines.filter(function (guideline) { return guideline.id !== guidelineId; }); + this.rulesetIds = this.getGuidelineIds(); + } + }; + /** + * Get the guidelines available in the engine + * @returns + */ + Checker.prototype.getGuidelines = function () { + return JSON.parse(JSON.stringify(this.guidelines)); + }; + /** + * Get the ids of the guidelines available in the engine + * @returns + */ + Checker.prototype.getGuidelineIds = function () { + return this.guidelines.map(function (guideline) { return guideline.id; }); + }; + /** + * + * @deprecated See addGuideline + */ + Checker.prototype.addRuleset = function (rs) { + this.addGuideline(rs); + }; + Checker.prototype.enableSourceMap = function (enable) { + this.engine.enableSourceMap(enable); + }; + Checker.prototype.isSourceMapEnabled = function () { + return this.engine.isSourceMapEnabled(); + }; + /** + * Perform a check of the specified node/document + * @param node DOMNode or Document on which to run the check + * @param guidelineIds Guideline ids to check with to specify which rules to run + * @returns + */ + Checker.prototype.check = function (node, guidelineIds) { + // Determine which rules to run + var ruleIds = []; + // Fix the input + if (!guidelineIds) { + ruleIds = this.engine.getRulesIds(); + } + else { + if (typeof guidelineIds === "string") { + guidelineIds = [guidelineIds]; + } + for (var _i = 0, guidelineIds_1 = guidelineIds; _i < guidelineIds_1.length; _i++) { + var rsId = guidelineIds_1[_i]; + if (rsId in this.rulesetRules) { + ruleIds = ruleIds.concat(this.rulesetRules[rsId]); + } + } + } + this.engine.enableRules(ruleIds); + // Add the report levels + var myThis = this; + return this.engine.run(node) + .then(function (report) { + report.nls = {}; + for (var _i = 0, _a = report.results; _i < _a.length; _i++) { + var result = _a[_i]; + if (result.ruleId in checkNls) { + report.nls[result.ruleId] = report.nls[result.ruleId] || { + 0: checkNls[result.ruleId][0] + }; + if (result.reasonId in checkNls[result.ruleId]) { + report.nls[result.ruleId][result.reasonId] = checkNls[result.ruleId][result.reasonId]; + } + } + //result.value[0] = myThis.getLevel(guidelineIds as string[], result.ruleId); + var code = result.reasonId ? result.reasonId : "None"; + result.value[0] = myThis.getReasonLevel(guidelineIds, result.ruleId, code); + result.category = myThis.getCategory(guidelineIds, result.ruleId); + delete result.path.css; + } + return report; + }); + }; + Checker.prototype.getLevel = function (rsIds, ruleId) { + if (!rsIds) + return IRule_1.eRulePolicy.INFORMATION; + var rsInfo = this.ruleLevels[ruleId]; + var retVal = null; + if (rsIds) { + if (!(ruleId in this.ruleLevels)) { + throw new Error("Rule triggered for which we have no rule level information: " + ruleId); + } + for (var _i = 0, rsIds_1 = rsIds; _i < rsIds_1.length; _i++) { + var rsId = rsIds_1[_i]; + if (rsId in rsInfo) { + if (rsInfo[rsId] === IRule_1.eRulePolicy.VIOLATION) { + retVal = IRule_1.eRulePolicy.VIOLATION; + } + else if (rsInfo[rsId] === IRule_1.eRulePolicy.RECOMMENDATION && retVal === null) { + retVal = IRule_1.eRulePolicy.RECOMMENDATION; + } + else if (retVal === null) { + retVal = IRule_1.eRulePolicy.INFORMATION; + } + } + } + } + if (retVal === null) { + throw new Error("Rule triggered for which we have no rule level information: " + ruleId); + } + return retVal; + }; + Checker.prototype.getReasonLevel = function (rsIds, ruleId, reasonCode) { + if (!rsIds) + return IRule_1.eRulePolicy.INFORMATION; + var rsInfo = this.ruleReasonLevels[ruleId]; + var retVal = null; + if (rsIds) { + if (!(ruleId in this.ruleReasonLevels)) { + throw new Error("Rule triggered for which we have no rule level information " + ruleId); + } + var _loop_1 = function (rsId) { + if (rsId in rsInfo) { + var reCode_1 = new RegExp("(^|--)".concat(reasonCode, "($|--)")); + Object.keys(rsInfo[rsId]).forEach(function (code) { + var level = null; + if (code === 'None') + level = rsInfo[rsId]["None"]; + else if (reCode_1.test(code)) + level = rsInfo[rsId][code]; + if (level !== null) { + if (level === IRule_1.eRulePolicy.VIOLATION) { + retVal = IRule_1.eRulePolicy.VIOLATION; + } + else if (level === IRule_1.eRulePolicy.RECOMMENDATION && retVal === null) { + retVal = IRule_1.eRulePolicy.RECOMMENDATION; + } + else if (retVal === null) { + retVal = IRule_1.eRulePolicy.INFORMATION; + } + } + }); + if (retVal === null) { + retVal = IRule_1.eRulePolicy.INFORMATION; + } + } + }; + for (var _i = 0, rsIds_2 = rsIds; _i < rsIds_2.length; _i++) { + var rsId = rsIds_2[_i]; + _loop_1(rsId); + } + } + if (retVal === null) { + throw new Error("Rule triggered for which we have no rule level information: " + ruleId); + } + return retVal; + }; + Checker.prototype.getCategory = function (rsIds, ruleId) { + var rsInfo = this.ruleCategory[ruleId]; + var retVal = ""; + if (!(ruleId in this.ruleCategory)) { + return IGuideline_1.eGuidelineCategory.OTHER; + } + if (!rsIds) { + rsIds = this.getGuidelineIds(); + } + for (var _i = 0, rsIds_3 = rsIds; _i < rsIds_3.length; _i++) { + var rsId = rsIds_3[_i]; + if (rsId in rsInfo) { + return rsInfo[rsId]; + } + } + return IGuideline_1.eGuidelineCategory.OTHER; + }; + return Checker; +}()); +exports.Checker = Checker; + + +/***/ }, + +/***/ "./src/v4/rules/a_target_warning.ts" +/*!******************************************!*\ + !*** ./src/v4/rules/a_target_warning.ts ***! + \******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.a_target_warning = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.a_target_warning = { + id: "a_target_warning", + context: "dom:a[target],dom:area[target],dom:base[target]", + refactor: { + "WCAG20_A_TargetAndText": { + "Pass_0": "pass", + "Potential_1": "potential_warn" + } + }, + help: { + "en-US": { + "group": "a_target_warning.html", + "pass": "a_target_warning.html", + "potential_warn": "a_target_warning.html" + } + }, + messages: { + "en-US": { + "group": "Users should be warned in advance if their input action will open a new window", + "pass": "The user is warned in advance that the input action opens a new window", + "potential_warn": "Inform the user when their input action will open a new window" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "3.2.2", + level: IRule_2.eRulePolicy.RECOMMENDATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // skip the rule if it's AT hidden and not tabbable + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) && !CommonUtil_1.CommonUtil.isTabbable(ruleContext)) + return null; + var params = { + paramWinText: { + value: ["new window", "new tab"], + type: "array" + } + }; + var tStr = ruleContext.getAttribute("target"); + var passed = tStr == "_parent" || tStr == "_self" || tStr == "_top" || CommonUtil_1.CommonUtil.getFrameByName(ruleContext, tStr) != null; + if (!passed) { + // Name is not part of this frameset – must have potential to create new window? + // See if a new window is mentioned + var textStr = CommonUtil_1.CommonUtil.getInnerText(ruleContext); + if (ruleContext.hasAttribute("title")) + textStr += " " + ruleContext.getAttribute("title"); + // Check aria-describedby for warning text + if (ruleContext.hasAttribute("aria-describedby")) { + var describedbyIds = ruleContext.getAttribute("aria-describedby").trim().split(/\s+/); + for (var _i = 0, describedbyIds_1 = describedbyIds; _i < describedbyIds_1.length; _i++) { + var id = describedbyIds_1[_i]; + var referencedElem = fragment_1.FragmentUtil.getById(ruleContext, id); + if (referencedElem) { + var describedText = CommonUtil_1.CommonUtil.getInnerText(referencedElem); + if (describedText && describedText.trim().length > 0) { + textStr += " " + describedText; + } + } + } + } + for (var i = 0; !passed && i < params.paramWinText.value.length; ++i) + if (textStr.indexOf(params.paramWinText.value[i]) != -1) + passed = true; + } + return passed ? (0, IRule_1.RulePass)("pass") : (0, IRule_1.RulePotential)("potential_warn"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/a_text_purpose.ts" +/*!****************************************!*\ + !*** ./src/v4/rules/a_text_purpose.ts ***! + \****************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.a_text_purpose = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +exports.a_text_purpose = { + id: "a_text_purpose", + // doc-biblioref is a link + context: "aria:link,aria:doc-biblioref", + refactor: { + "WCAG20_A_HasText": { + "Pass_0": "pass", + "Fail_1": "fail_acc_name" + } + }, + help: { + "en-US": { + "group": "a_text_purpose.html", + "pass": "a_text_purpose.html", + "fail_acc_name": "a_text_purpose.html" + } + }, + messages: { + "en-US": { + "group": "Hyperlinks must have an accessible name for their purpose", + "pass": "Hyperlink has a description of its purpose", + "fail_acc_name": "Hyperlink has no link text, label or image with a text alternative" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: ["2.4.4", "4.1.2"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: "c487ae", + run: function (context, options) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) { + return null; + } + // Rule only passes if an element has inner content, + // in the case that there is only hidden content under the the element it is a violation + var accName_pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + var passed = (accName_pair && accName_pair.name && accName_pair.name.trim().length > 0) + /**ARIAMapper.computeName(ruleContext).trim().length > 0*/ + || CommonUtil_1.CommonUtil.nonTabableChildCheck(ruleContext); + if (!passed) { + return (0, IRule_1.RuleFail)("fail_acc_name"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/applet_alt_exists.ts" +/*!*******************************************!*\ + !*** ./src/v4/rules/applet_alt_exists.ts ***! + \*******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.applet_alt_exists = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.applet_alt_exists = { + id: "applet_alt_exists", + context: "dom:applet", + refactor: { + "WCAG20_Applet_HasAlt": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3" + } + }, + help: { + "en-US": { + "group": "applet_alt_exists.html", + "Pass_0": "applet_alt_exists.html", + "Fail_1": "applet_alt_exists.html", + "Fail_2": "applet_alt_exists.html", + "Fail_3": "applet_alt_exists.html" + } + }, + messages: { + "en-US": { + "group": "<applet> elements must provide an 'alt' attribute and an alternative description", + "Pass_0": "Rule Passed", + "Fail_1": "An <applet> element does not have an 'alt' attribute that provides a short text alternative", + "Fail_2": "The 'alt' attribute value for an <applet> element duplicates the 'code' attribute", + "Fail_3": "An <applet> element provides alternative text, but does not provide inner content" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "1.1.1", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // JCH - NO OUT OF SCOPE hidden in context + if (!CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "alt")) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + var alt = ruleContext.getAttribute("alt").trim(); + if (ruleContext.hasAttribute("code") && alt == ruleContext.getAttribute("code").trim()) { + return (0, IRule_1.RuleFail)("Fail_2"); + } + else if (!CommonUtil_1.CommonUtil.hasInnerContentHidden(ruleContext)) { + return (0, IRule_1.RuleFail)("Fail_3"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/application_content_accessible.ts" +/*!********************************************************!*\ + !*** ./src/v4/rules/application_content_accessible.ts ***! + \********************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.application_content_accessible = void 0; +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.application_content_accessible = { + id: "application_content_accessible", + context: "aria:application", + refactor: { + "HAAC_Application_Role_Text": { + 0: "HAAC_Application_Role_Text.html", + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + 0: "application_content_accessible.html", + "Pass_0": "application_content_accessible.html", + "Potential_1": "application_content_accessible.html" + } + }, + messages: { + "en-US": { + "group": "Non-decorative static text and image content within an element with \"application\" role must be accessible", + "Pass_0": "Rule Passed", + "Potential_1": "Verify that the non-decorative static text and image content within an element with \"application\" role are accessible" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: ["1.1.1", "2.1.1"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = true; + var children = ruleContext.childNodes; + for (var i = 0; passed && i < children.length; i++) { + if (children[i].nodeType === 1) { + if (VisUtil_1.VisUtil.isNodeVisible(children[i])) { + passed = AriaUtil_1.AriaUtil.hasRoleInSemantics(children[i], "document") || AriaUtil_1.AriaUtil.hasRoleInSemantics(children[i], "article"); + } + } + else if (children[i].nodeType === 3) { + passed = children[i].nodeValue.trim().length === 0; + } + } + return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/area_alt_exists.ts" +/*!*****************************************!*\ + !*** ./src/v4/rules/area_alt_exists.ts ***! + \*****************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.area_alt_exists = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.area_alt_exists = { + id: "area_alt_exists", + context: "dom:area", + refactor: { + "WCAG20_Area_HasAlt": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "area_alt_exists.html", + "Pass_0": "area_alt_exists.html", + "Fail_1": "area_alt_exists.html" + } + }, + messages: { + "en-US": { + "group": "<area> elements in an image map must have a text alternative", + "Pass_0": "Rule Passed", + "Fail_1": "<area> element in an image map has no text alternative" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "1.1.1", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // JCH - NO OUT OF SCOPE hidden in context + if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "alt")) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_accessiblename_exists.ts" +/*!****************************************************!*\ + !*** ./src/v4/rules/aria_accessiblename_exists.ts ***! + \****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_accessiblename_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +exports.aria_accessiblename_exists = { + id: "aria_accessiblename_exists", + context: "aria:columnheader, aria:heading, aria:rowheader, aria:graphics-document,aria:graphics-symbol, aria:img,aria:image, doc-backlink, doc-biblioentry, doc-biblioref, doc-glossref, doc-noteref, doc-pagebreak, doc-example", + help: { + "en-US": { + "pass": "aria_accessiblename_exists.html", + "fail_no_accessible_name": "aria_accessiblename_exists.html", + "fail_no_accessible_name_image": "aria_accessiblename_exists.html", + "group": "aria_accessiblename_exists.html" + } + }, + messages: { + "en-US": { + "pass": "An accessible name is provided for the element", + "fail_no_accessible_name": "Element <{0}> with \"{1}\" role has no accessible name", + "fail_no_accessible_name_image": "Element <{0}> with \"{1}\" role has no accessible name", + "group": "Elements with certain roles should have accessible names" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE, + reasonCodes: ["fail_no_accessible_name"] + }, + { + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["ARIA"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE, + reasonCodes: ["fail_no_accessible_name_image"] + }], + act: [{ "23a2a8": { "fail_no_accessible_name_image": "fail" } }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLocaleLowerCase(); + // svg element is handled in svg_graphics_labbelled rule and image rules + if (nodeName === 'svg' || nodeName === 'img') + return; + // when table element with a caption as first child + if (nodeName === 'table' + && ruleContext.firstElementChild && ruleContext.firstElementChild.nodeName.toLowerCase() === 'caption' + && ruleContext.firstElementChild.textContent && ruleContext.firstElementChild.textContent.trim().length > 0) + return (0, IRule_1.RulePass)("pass"); + var invalidRoles = AriaUtil_1.AriaUtil.getRolesUndefinedByAria(ruleContext); + if (invalidRoles && invalidRoles.length > 0) + return null; + var deprecatedRoles = AriaUtil_1.AriaUtil.getDeprecatedAriaRoles(ruleContext); + if (deprecatedRoles && deprecatedRoles.length > 0) + return null; + var deprecatedAttributes = AriaUtil_1.AriaUtil.getDeprecatedAriaAttributes(ruleContext); + if (deprecatedAttributes && deprecatedAttributes.length > 0) + return null; + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + if (!role || !ARIADefinitions_1.ARIADefinitions.designPatterns[role] || !ARIADefinitions_1.ARIADefinitions.designPatterns[role].nameRequired) + return null; + var name_pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + if (!name_pair || !name_pair.name || name_pair.name.trim().length === 0) { + if (role === 'img' || role === 'image') + return (0, IRule_1.RuleFail)("fail_no_accessible_name_image", [ruleContext.nodeName.toLowerCase(), role]); + return (0, IRule_1.RuleFail)("fail_no_accessible_name", [ruleContext.nodeName.toLowerCase(), role]); + } + return (0, IRule_1.RulePass)("pass"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_activedescendant_tabindex_valid.ts" +/*!**************************************************************!*\ + !*** ./src/v4/rules/aria_activedescendant_tabindex_valid.ts ***! + \**************************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_activedescendant_tabindex_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.aria_activedescendant_tabindex_valid = { + id: "aria_activedescendant_tabindex_valid", + context: "dom:*[aria-activedescendant]", + refactor: { + "Rpt_Aria_InvalidTabindexForActivedescendant": { + "pass": "pass", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "pass": "aria_activedescendant_tabindex_valid.html", + "Fail_1": "aria_activedescendant_tabindex_valid.html", + "group": "aria_activedescendant_tabindex_valid.html" + } + }, + messages: { + "en-US": { + "pass": "Rule Passed", + "Fail_1": "The <{0}> element using 'aria-activedescendant' set to \"{1}\" is not tabbable", + "group": "Element using 'aria-activedescendant' property should be tabbable" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = false; + var nodeName = ruleContext.nodeName.toLowerCase(); + // Rule not supported on mobile + if (ruleContext.hasAttribute("class") && ruleContext.getAttribute("class").substring(0, 3) == "mbl") { + return null; + } + // Handle the case where the element is hidden by a disabled HTML5 attribute or aria-disabled: + // 1. In the case that this element has a disabled attribute and the element supports it, we mark this rule as passed. + // 2. In the case that this element has an aria-disabled attribute then, we mark this rule as passed. + // For both of the cases above we do not need to perform any further checks, as the element is disabled in some form or another. + if (CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) { + return null; + } + //ignore if the attribute 'aria-activedescendant' is blank + if (ruleContext.getAttribute("aria-activedescendant").trim().length === 0) + return; + // If the tabindex attribute is provided then verify that it is 0 or -1 + passed = CommonUtil_1.CommonUtil.isTabbable(ruleContext); + // pass if one of the children is tabbable. in this case, the tab will stop on the first tabbable element + if (!passed) + passed = CommonUtil_1.CommonUtil.getTabbableChildren(ruleContext) > 0; + // Build array for node token + var retToken1 = new Array(); + retToken1.push(nodeName); + // Build array for id referenced by aria-activedescendant + var retToken2 = new Array(); + retToken2.push(ruleContext.getAttribute("aria-activedescendant").split(" ").join(", ")); + //return new ValidationResult(passed, [ruleContext], '', '', passed == true ? [] : [retToken1, retToken2]); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", [retToken1.toString(), retToken2.toString()]); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_activedescendant_valid.ts" +/*!*****************************************************!*\ + !*** ./src/v4/rules/aria_activedescendant_valid.ts ***! + \*****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_activedescendant_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +exports.aria_activedescendant_valid = { + id: "aria_activedescendant_valid", + context: "dom:*[aria-activedescendant]", + refactor: { + "HAAC_ActiveDescendantCheck": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3" + // "Fail_4": "Fail_4" + } + }, + help: { + "en-US": { + "Pass_0": "aria_activedescendant_valid.html", + "Fail_1": "aria_activedescendant_valid.html", + "Fail_2": "aria_activedescendant_valid.html", + "Fail_3": "aria_activedescendant_valid.html", + // "Fail_4": "aria_activedescendant_valid.html", + "group": "aria_activedescendant_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The 'aria-activedescendant' property is empty", + "Fail_2": "The 'aria-activedescendant' property references a hidden node", + "Fail_3": "Element is not a combobox, and the referenced active-descendant element is not a valid descendant", + // "Fail_4": "Element is a combobox, and the referenced active-descendant element is not controlled by this component", + "group": "The 'aria-activedescendant' property must reference the 'id' of a non-empty, non-hidden active child element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // combobox active descendants handled by 'combobox_active_descendant' + if (AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "combobox")) { + return null; + } + var descendant_id = AriaUtil_1.AriaUtil.getAriaAttribute(ruleContext, "aria-activedescendant"); + // POF1: The attribute is empty + if (!descendant_id || descendant_id.trim() === "") { + return (0, IRule_1.RuleFail)("Fail_1"); + } + var descendant = fragment_1.FragmentUtil.getById(ruleContext, descendant_id.trim()); + if (!descendant || DOMUtil_1.DOMUtil.sameNode(descendant_id, ruleContext)) { + // The referenced element doesn't exist. We let 1077 to trigger the error + return null; + } + if (!VisUtil_1.VisUtil.isNodeVisible(descendant)) { + // POF2: aria-activedescendant references a hidden node + return (0, IRule_1.RuleFail)("Fail_2"); + } + // 1. The value of aria-activedescendant refers to an element that is either a descendant of + // the element with DOM focus + if (ruleContext.contains(descendant)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + var pofId = 2; + // or is a logical descendant as indicated by the aria-owns attribute. + if (ruleContext.hasAttribute("aria-owns")) { + var owned_ids = CommonUtil_1.CommonUtil.normalizeSpacing(ruleContext.getAttribute("aria-owns").trim()).split(" "); + for (var i = 0; i < owned_ids.length; i++) { + var owned_ele = fragment_1.FragmentUtil.getById(ruleContext, owned_ids[i]); + if (owned_ele && !DOMUtil_1.DOMUtil.sameNode(owned_ele, ruleContext) && owned_ele.contains(descendant)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + } + } + // 2. The element with DOM focus is a textbox with aria-controls referring to an element that + // supports aria-activedescendant, and the value of aria-activedescendant specified for the + // textbox refers to either a descendant of the element controlled by the textbox or is a logical + // descendant of that controlled element as indicated by the aria-owns attribute. + // + if (AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "textbox") && ruleContext.hasAttribute("aria-controls")) { + pofId = 3; + var controlled_ids = CommonUtil_1.CommonUtil.normalizeSpacing(ruleContext.getAttribute("aria-controls").trim()).split(" "); + for (var i = 0; i < controlled_ids.length; i++) { + var controlled_ele = fragment_1.FragmentUtil.getById(ruleContext, controlled_ids[i]); + if (controlled_ele && !DOMUtil_1.DOMUtil.sameNode(controlled_ele, ruleContext) && controlled_ele.contains(descendant)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + if (controlled_ele.hasAttribute("aria-owns")) { + var owns_ids = CommonUtil_1.CommonUtil.normalizeSpacing(controlled_ele.getAttribute("aria-owns").trim()).split(" "); + for (var j = 0; j < owns_ids.length; j++) { + var owned_ele = fragment_1.FragmentUtil.getById(ruleContext, owns_ids[j]); + if (owned_ele && !DOMUtil_1.DOMUtil.sameNode(owned_ele, ruleContext) && owned_ele.contains(descendant)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + } + } + } + } + // POF3: I'm not a combobox, and the referenced active-descendant is not a descendant and not owned by the element + // that referenced it. + if (pofId == 3) { + return (0, IRule_1.RuleFail)("Fail_3"); + } + return null; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_application_label_unique.ts" +/*!*******************************************************!*\ + !*** ./src/v4/rules/aria_application_label_unique.ts ***! + \*******************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_application_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_application_label_unique = { + id: "aria_application_label_unique", + context: "aria:application", + refactor: { + "Rpt_Aria_MultipleApplicationLandmarks": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_application_label_unique.html", + "fail_label_not_unique": "aria_application_label_unique.html", + "group": "aria_application_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"application\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"application\" role do not have unique labels", + "group": "Each element with \"application\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "application"); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_application_labelled.ts" +/*!***************************************************!*\ + !*** ./src/v4/rules/aria_application_labelled.ts ***! + \***************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_application_labelled = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_application_labelled = { + id: "aria_application_labelled", + context: "aria:application", + refactor: { + "Rpt_Aria_ApplicationLandmarkLabel": { + "Pass_0": "pass", + "Fail_1": "fail_no_label" + } + }, + help: { + "en-US": { + "pass": "aria_application_labelled.html", + "fail_no_label": "aria_application_labelled.html", + "group": "aria_application_labelled.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"application\" role has a label that describes its purpose", + "fail_no_label": "Element with \"application\" role does not have a label", + "group": "Each element with \"application\" role must have a label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + if (!pair) { + return (0, IRule_1.RuleFail)("fail_no_label"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_article_label_unique.ts" +/*!***************************************************!*\ + !*** ./src/v4/rules/aria_article_label_unique.ts ***! + \***************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_article_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +exports.aria_article_label_unique = { + id: "aria_article_label_unique", + context: "aria:article", + refactor: { + "Rpt_Aria_MultipleArticleRoles_Implicit": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_article_label_unique.html", + "fail_label_not_unique": "aria_article_label_unique.html", + "group": "aria_article_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"article\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"article\" role do not have unique labels", + "group": "Each element with \"article\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "article"); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_attribute_allowed.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/aria_attribute_allowed.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_allowed = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +exports.aria_attribute_allowed = { + id: "aria_attribute_allowed", + context: "dom:*", + refactor: { + "Rpt_Aria_ValidProperty": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "aria_attribute_allowed.html", + "Pass_0": "aria_attribute_allowed.html", + "Fail_1": "aria_attribute_allowed.html" + } + }, + messages: { + "en-US": { + "group": "ARIA attributes must be valid for the element's role", + "Pass_0": "Rule Passed", + "Fail_1": "The attribute(s) '{0}' referenced by the element <{1}> is not a valid ARIA state or property" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "4.1.2", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: "5f99a7", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var contextAttributes = ruleContext.attributes; + // This gets all elements with attributes so we still have some + // Out of Scope since not all attributes are aria + if (contextAttributes) { + var propertyDataTypes = ARIADefinitions_1.ARIADefinitions.propertyDataTypes; + var failedProperties = ""; + var testedProperties = 0; + for (var i = 0, length_1 = contextAttributes.length; i < length_1; i++) { + var attrName = contextAttributes[i].name; + if (AriaUtil_1.AriaUtil.isDefinedAriaAttribute(ruleContext, attrName)) { + testedProperties++; + // Now we just have aria attributes which can + // pass or fail based on whether there property is valid + var dataTypes = propertyDataTypes[attrName]; + if (!dataTypes) { // if property is not in valid property list + // create failedProperties comma sep list + if (failedProperties.length == 0) { + failedProperties = attrName; + } + else { + failedProperties = failedProperties + ", " + attrName; + } + } + } + } + if (testedProperties == 0) { + return null; + } + else if (failedProperties.length != 0) { + return (0, IRule_1.RuleFail)("Fail_1", [failedProperties, ruleContext.nodeName.toLowerCase()]); + } + else { + //return RulePass(1); + return (0, IRule_1.RulePass)("Pass_0"); + } + } + else { + return null; + } + // JCH - passing is based on all attributes not just aria attributes + // leading to OVER COUNTING so moved pass up + //return RulePass(1); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_attribute_conflict.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/aria_attribute_conflict.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_conflict = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.aria_attribute_conflict = { + id: "aria_attribute_conflict", + context: "dom:*[aria-required], dom:*[aria-autocomplete], dom:*[aria-readonly], dom:*[aria-disabled], dom:*[aria-placeholder]" + + ", dom:*[aria-checked], dom:*[aria-hidden], dom:*[aria-valuemax], dom:*[aria-valuemin], dom:*[aria-colspan]" + + ", dom:*[aria-rowspan]", + help: { + "en-US": { + // "pass": "aria_attribute_conflict.html", + "fail_conflict": "aria_attribute_conflict.html", + "group": "aria_attribute_conflict.html" + } + }, + messages: { + "en-US": { + // "pass": "The ARIA attribute is not conflict with the corresponding HTML attribute", + "fail_conflict": "The ARIA attribute \"{0}\" is in conflict with the corresponding HTML attribute \"{1}\"", + "group": "An ARIA attribute must not conflict with the corresponding HTML attribute" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // dependency check: if the ARIA attribute is completely invalid, skip this check + var invalidAttributes = AriaUtil_1.AriaUtil.getInvalidAriaAttributes(ruleContext); + if (invalidAttributes && invalidAttributes.length > 0) + return null; + var ret = []; + var ariaAttributes = AriaUtil_1.AriaUtil.getUserDefinedAriaAttributes(ruleContext); + if (!ariaAttributes || ariaAttributes.length === 0) + return null; + var conflictAttributes = AriaUtil_1.AriaUtil.getConflictAriaAndHtmlAttributes(ruleContext); + for (var i = 0; i < conflictAttributes.length; i++) { + ret.push((0, IRule_1.RuleFail)("fail_conflict", [conflictAttributes[i]['ariaAttr'], conflictAttributes[i]['htmlAttr']])); + if (ariaAttributes.includes(conflictAttributes[i]['ariaAttr'])) + CommonUtil_1.CommonUtil.reduceArrayItemList([conflictAttributes[i]['ariaAttr']], ariaAttributes); + } + if (ret.length > 0) + return ret; + return null; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_attribute_deprecated.ts" +/*!***************************************************!*\ + !*** ./src/v4/rules/aria_attribute_deprecated.ts ***! + \***************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_deprecated = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +exports.aria_attribute_deprecated = { + id: "aria_attribute_deprecated", + context: "dom:*", + help: { + "en-US": { + // "pass": "aria_attribute_deprecated.html", + "fail_aria_role": "aria_attribute_deprecated.html", + "fail_aria_attr": "aria_attribute_deprecated.html", + "fail_role_attr": "aria_attribute_deprecated.html", + "group": "aria_attribute_deprecated.html" + } + }, + messages: { + "en-US": { + // "pass": "The ARIA roles and attribute are used per specification", + "fail_aria_role": "The ARIA role \"{0}\" is deprecated in the ARIA specification", + "fail_aria_attr": "The ARIA attributes \"{0}\" are deprecated in the ARIA specification", + "fail_role_attr": "The ARIA attributes \"{0}\" are deprecated for the role \"{1}\" in the ARIA specification", + "group": "No deprecated ARIA role or attribute should be used" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["ARIA"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var ret = []; + var deprecatedRoles = AriaUtil_1.AriaUtil.getDeprecatedAriaRoles(ruleContext); + if (deprecatedRoles && deprecatedRoles.length > 0) { + for (var i = 0; i < deprecatedRoles.length; i++) + ret.push((0, IRule_1.RuleFail)('fail_aria_role', [deprecatedRoles[i]])); + } + var deprecatedAttributes = AriaUtil_1.AriaUtil.getDeprecatedAriaAttributes(ruleContext); + if (deprecatedAttributes && deprecatedAttributes.length > 0) { + for (var i = 0; i < deprecatedAttributes.length; i++) { + // "role":"any", "attribute":ariaAttrs[i]} + if (deprecatedAttributes[i].role === 'any') + ret.push((0, IRule_1.RuleFail)('fail_aria_attr', [deprecatedAttributes[i].attribute])); + else + ret.push((0, IRule_1.RuleFail)('fail_role_attr', [deprecatedAttributes[i].attribute, deprecatedAttributes[i].role])); + } + } + if (ret.length > 0) + return ret; + return null; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_attribute_exists.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/aria_attribute_exists.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_attribute_exists = { + id: "aria_attribute_exists", + context: "dom:*[role]", + dependencies: ["aria_role_allowed"], + refactor: { + "Rpt_Aria_EmptyPropertyValue": { + "pass": "pass", + "fail_empty_attribute": "fail_empty_attribute" + } + }, + help: { + "en-US": { + "pass": "aria_attribute_exists.html", + "fail_empty_attribute": "aria_attribute_exists.html", + "group": "aria_attribute_exists.html" + } + }, + messages: { + "en-US": { + "pass": "Rule Passed", + "fail_empty_attribute": "The element attribute(s): '{0}' value is empty", + "group": "When specifying a required ARIA attribute, the value must not be empty" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: ["6a7281"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return; + var attrNameArr = new Array(); + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + var hasAttribute = CommonUtil_1.CommonUtil.hasAttribute; + var testedProperties = 0; + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + if (!role) + return; + if (designPatterns[role] && AriaUtil_1.AriaUtil.getRoleRequiredProperties(role, ruleContext) != null) { + var requiredRoleProps = AriaUtil_1.AriaUtil.getRoleRequiredProperties(role, ruleContext); + for (var i = 0, length_1 = requiredRoleProps.length; i < length_1; i++) { + var attribute = requiredRoleProps[i]; + if (hasAttribute(ruleContext, attribute)) { + testedProperties++; + var nodeValue = CommonUtil_1.CommonUtil.normalizeSpacing(ruleContext.getAttribute(requiredRoleProps[i])); + if (nodeValue.length == 0) + attrNameArr.push(requiredRoleProps[i]); + } + else if (requiredRoleProps[i] == "aria-labelledby") { + if ((role == "radiogroup") && (hasAttribute(ruleContext, "aria-label"))) { + testedProperties++; + var nodeValue = CommonUtil_1.CommonUtil.normalizeSpacing(ruleContext.getAttribute("aria-label")); + if (nodeValue.length == 0) + attrNameArr.push("aria-label"); + } + } + else if (requiredRoleProps[i] == "aria-valuenow") { + if ((role == "progressbar") && (hasAttribute(ruleContext, "aria-valuetext"))) { + testedProperties++; + var nodeValue = CommonUtil_1.CommonUtil.normalizeSpacing(ruleContext.getAttribute("aria-valuetext")); + if (nodeValue.length == 0) + attrNameArr.push("aria-valuetext"); + } + } + } + } + if (designPatterns[role]) { + var tagProperty = AriaUtil_1.AriaUtil.getElementAriaProperty(ruleContext); + var permittedRoles = []; + permittedRoles.push(role); + var allowedAttributes = AriaUtil_1.AriaUtil.getAllowedAriaAttributes(ruleContext, permittedRoles, tagProperty); + for (var i = 0, length_2 = allowedAttributes.length; i < length_2; i++) { + var attribute = allowedAttributes[i]; + if (attribute == "aria-checked" || attribute == "aria-selected" || + attribute == "aria-expanded" || attribute == "aria-orientation" || + attribute == "aria-level") { + if (hasAttribute(ruleContext, attribute)) { + testedProperties++; + var nodeValue = CommonUtil_1.CommonUtil.normalizeSpacing(ruleContext.getAttribute(attribute)); + if (nodeValue.length == 0 && !attrNameArr.includes(attribute)) { + attrNameArr.push(attribute); + } + } + } + } + } + var retMsg = new Array(); + var passed = attrNameArr.length == 0; + retMsg.push(attrNameArr.join(", ")); + //return new ValidationResult(passed, [ruleContext], attrNameArr, '', retMsg); + if (testedProperties == 0) { + return null; + } + else if (!passed) { + return (0, IRule_1.RuleFail)("fail_empty_attribute", retMsg); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_attribute_redundant.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/aria_attribute_redundant.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_redundant = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +exports.aria_attribute_redundant = { + id: "aria_attribute_redundant", + context: "dom:*[aria-required], dom:*[aria-autocomplete], dom:*[aria-readonly], dom:*[aria-disabled], dom:*[aria-placeholder]" + + ", dom:*[aria-checked], dom:*[aria-hidden], dom:*[aria-valuemax], dom:*[aria-valuemin], dom:*[aria-colspan]" + + ", dom:*[aria-rowspan]", + help: { + "en-US": { + "pass": "aria_attribute_redundant.html", + "fail_redundant": "aria_attribute_redundant.html", + "group": "aria_attribute_redundant.html" + } + }, + messages: { + "en-US": { + "pass": "The ARIA attribute is not redundant with a corresponding HTML attribute", + "fail_redundant": "The ARIA attribute \"{0}\" is redundant with the HTML attribute \"{1}\"", + "group": "An ARIA attribute should not be redundant with a corresponding HTML attribute" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // dependency check: if the ARIA attribute is completely invalid, skip this check + var invalidAttributes = AriaUtil_1.AriaUtil.getInvalidAriaAttributes(ruleContext); + if (invalidAttributes && invalidAttributes.length > 0) + return null; + // if conflict already reported, ignore reporting overlap + var conflictAttributes = AriaUtil_1.AriaUtil.getConflictAriaAndHtmlAttributes(ruleContext); + if (conflictAttributes && conflictAttributes.length > 0) + return null; + var domAttributes = ruleContext.attributes; + var ariaAttrs = []; + var htmlAttrs = []; + if (domAttributes) { + for (var i = 0; i < domAttributes.length; i++) { + var attrName = domAttributes[i].name.trim().toLowerCase(); + var attrValue = ruleContext.getAttribute(attrName); + if (attrValue === '') + attrValue = null; + if (attrName.substring(0, 5) === 'aria-') + ariaAttrs.push({ name: attrName, value: attrValue }); + else + htmlAttrs.push({ name: attrName, value: attrValue }); + } + } + var ret = []; + var _loop_1 = function (i) { + var examinedHtmlAtrNames = AriaUtil_1.AriaUtil.getConflictOrOverlappingHtmlAttribute(ariaAttrs[i], htmlAttrs, 'overlapping'); + if (examinedHtmlAtrNames === null) + return "continue"; + examinedHtmlAtrNames.forEach(function (item) { + if (item['result'] === 'Pass') { //pass + ret.push((0, IRule_1.RulePass)("pass")); + } + else if (item['result'] === 'Failed') { //failed + ret.push((0, IRule_1.RuleFail)("fail_redundant", [ariaAttrs[i]['name'], item['attr']])); + } + }); + }; + for (var i = 0; i < ariaAttrs.length; i++) { + _loop_1(i); + } + if (ret.length > 0) + return ret; + return null; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_attribute_required.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/aria_attribute_required.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_required = void 0; +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.aria_attribute_required = { + id: "aria_attribute_required", + context: "dom:*[role]", + dependencies: ["aria_role_allowed"], + refactor: { + "Rpt_Aria_RequiredProperties": { + "Pass_0": "pass", + "Fail_1": "fail_missing" + } + }, + help: { + "en-US": { + "group": "aria_attribute_required.html", + "pass": "aria_attribute_required.html", + "fail_missing": "aria_attribute_required.html" + } + }, + messages: { + "en-US": { + "group": "The required attributes for the element with a role must be defined", + "pass": "The required attributes for the element with the role are defined", + "fail_missing": "Element with '{0}' role does not have the required ARIA attribute(s): '{1}'" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "4.1.2", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: "4e8ab6", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var attrNameArr = new Array(); + var roleNameArr = new Array(); + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + //let implicitRole = ARIAMapper.elemToImplicitRole(ruleContext); + //let implicitRole = AriaUtil.getImplicitRole(ruleContext); + var hasAttribute = CommonUtil_1.CommonUtil.hasAttribute; + var testedRoles = 0; + var tagProperty = AriaUtil_1.AriaUtil.getElementAriaProperty(ruleContext); + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + if (!role) + return; + var requiredRoleProps = AriaUtil_1.AriaUtil.getRoleRequiredProperties(role, ruleContext); + if (designPatterns[role] && requiredRoleProps !== null) { + var allowedRoleProps = AriaUtil_1.AriaUtil.getAllowedAriaAttributes(ruleContext, role, tagProperty); + var roleMissingReqProp = false; + for (var i = 0, propertiesLength = requiredRoleProps.length; i < propertiesLength; i++) { + if (!allowedRoleProps.includes(requiredRoleProps[i])) + continue; + if (!hasAttribute(ruleContext, requiredRoleProps[i])) { + // If an aria-labelledby isn't present, an aria-label will meet the requirement. + if (requiredRoleProps[i] == "aria-labelledby") { + if ((!hasAttribute(ruleContext, "aria-label")) || (role != "radiogroup")) { + attrNameArr.push(requiredRoleProps[i]); + roleMissingReqProp = true; + } + } + else if (requiredRoleProps[i] == "aria-valuenow") { + if ((!hasAttribute(ruleContext, "aria-valuetext")) || (role != "progressbar")) { + attrNameArr.push(requiredRoleProps[i]); + roleMissingReqProp = true; + } + } + else if (requiredRoleProps[i] == "aria-controls" && role == "combobox") { + // Skip this check since aria-controls in the textbox of a combobox is already handled in rule HAAC_Combobox_Must_have_Text_Input + } + else { + attrNameArr.push(requiredRoleProps[i]); + roleMissingReqProp = true; + } + } + } + if (roleMissingReqProp == true) { + roleNameArr.push(role); + } + } + var passed = roleNameArr.length == 0 || attrNameArr.length == 0; // only aria attributes so NO OUT OF SCOPE + if (!passed) { + var retToken = new Array(); + retToken.push(roleNameArr.join(", ")); + retToken.push(attrNameArr.join(", ")); + return (0, IRule_1.RuleFail)("fail_missing", retToken); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_attribute_value_valid.ts" +/*!****************************************************!*\ + !*** ./src/v4/rules/aria_attribute_value_valid.ts ***! + \****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_value_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +exports.aria_attribute_value_valid = { + id: "aria_attribute_value_valid", + context: "dom:*", + dependencies: ["aria_attribute_allowed"], + refactor: { + "Rpt_Aria_ValidPropertyValue": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "aria_attribute_value_valid.html", + "Pass_0": "aria_attribute_value_valid.html", + "Fail_1": "aria_attribute_value_valid.html" + } + }, + messages: { + "en-US": { + "group": "ARIA property values must be valid", + "Pass_0": "Rule Passed", + "Fail_1": "The value \"{0}\" specified for attribute '{1}' on element <{2}> is not valid" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: "6a7281", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var valueArr = new Array(); + var attrNameArr = new Array(); + var dataTypeArr = new Array(); + var propertyDataTypes = ARIADefinitions_1.ARIADefinitions.propertyDataTypes; + var contextAttributes = ruleContext.attributes; + var testedPropertyValues = 0; + if (contextAttributes) { + for (var i = 0, length_1 = contextAttributes.length; i < length_1; i++) { + var attrName = contextAttributes[i].name; + if (AriaUtil_1.AriaUtil.isDefinedAriaAttribute(ruleContext, attrName)) { + var dataTypes = propertyDataTypes[attrName]; + var nodeValue = CommonUtil_1.CommonUtil.normalizeSpacing(contextAttributes[i].nodeValue); + testedPropertyValues++; + if (dataTypes && dataTypes.values) { + if (dataTypes.values.indexOf(nodeValue) == -1) { + if (dataTypes.values.indexOf('undefined') != -1 && nodeValue.length == 0) { + //translate 'undefined' to mean '' + } + else { + // aria-relevant is represented as a space delimited list of the following values: + // additions, removals, text; or a single catch-all value all. + if (dataTypes.type === "http://www.w3.org/2001/XMLSchema#nmtokens") { + var attrValues = contextAttributes[i].nodeValue.trim().split(" "); + // if the value all is specified, it cannot have any other value + if (attrValues.length > 1 && attrValues.includes("all")) { + valueArr.push(contextAttributes[i].nodeValue.split(" ")); + attrNameArr.push(attrName); + dataTypeArr.push(dataTypes.values.toString()); + } + else { + var hash = {}; + for (var j = 0; j < attrValues.length; j++) { + // if the individual value is not in the list of allowed values + if (attrValues[j] != "" && !dataTypes.values.includes(attrValues[j])) { + if (!hash.hasOwnProperty(attrName)) { + hash[attrName] = true; + attrNameArr.push(attrName); + } + valueArr.push(attrValues[j]); + dataTypeArr.push(dataTypes.values.toString()); + } + } + } + } + else { + valueArr.push(contextAttributes[i].nodeValue.split(" ")); + attrNameArr.push(attrName); + dataTypeArr.push(dataTypes.values.toString()); + } + } + } + } + else if (dataTypes && dataTypes.type && dataTypes.type === "http://www.w3.org/2001/XMLSchema#int") { + var iVal = parseInt(nodeValue); + if (isNaN(iVal) || ("" + iVal !== nodeValue)) { + valueArr.push(nodeValue); + attrNameArr.push(attrName); + } + } + else if (dataTypes && dataTypes.type && dataTypes.type == "http://www.w3.org/2001/XMLSchema#decimal") { + var fVal = parseFloat(nodeValue); + if (isNaN(fVal)) { + valueArr.push(nodeValue); + attrNameArr.push(attrName); + } + } + else if (dataTypes && dataTypes.type && (dataTypes.type == "http://www.w3.org/2001/XMLSchema#boolean")) { + var tmpV = nodeValue.trim().toLowerCase(); + if (tmpV !== "true" && tmpV !== "false") { + valueArr.push(nodeValue); + attrNameArr.push(attrName); + } + } + else if (dataTypes && dataTypes.type && (dataTypes.type == "http://www.w3.org/2001/XMLSchema#string")) { + } + else { + testedPropertyValues--; + } + } + } + } + var retMsg = new Array(); + var passed = attrNameArr.length == 0; + retMsg.push(valueArr.join(", ")); + retMsg.push(attrNameArr.join(", ")); + retMsg.push(ruleContext.nodeName.toLowerCase()); + // retMsg.push (dataTypeArr.join(", ")); + //return new ValidationResult(passed, [ruleContext], attrNameArr, '', retMsg); + if (testedPropertyValues == 0) { + return null; + } + else if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", retMsg); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_banner_label_unique.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/aria_banner_label_unique.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_banner_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_banner_label_unique = { + id: "aria_banner_label_unique", + context: "aria:banner", + refactor: { + "Rpt_Aria_MultipleBannerLandmarks_Implicit": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_banner_label_unique.html", + "fail_label_not_unique": "aria_banner_label_unique.html", + "group": "aria_banner_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"banner\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"banner\" role do not have unique labels", + "group": "Each element with \"banner\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "banner", true); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_banner_single.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/aria_banner_single.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_banner_single = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_banner_single = { + id: "aria_banner_single", + context: "dom:*[role], dom:header", + refactor: { + "Rpt_Aria_OneBannerInSiblingSet_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_banner_single.html", + "Fail_1": "aria_banner_single.html", + "group": "aria_banner_single.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Multiple elements with \"banner\" role found on the page", + "group": "A page, document, or application should only have one element with \"banner\" role" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + if (!AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "banner")) { + return null; + } + var passed = AriaUtil_1.AriaUtil.getSiblingWithRoleHidden(ruleContext, "banner", true, true) === null; + //return new ValidationResult(passed, [ruleContext], 'role', '', []); + if (passed) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_child_tabbable.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/aria_child_tabbable.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_child_tabbable = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_child_tabbable = { + id: "aria_child_tabbable", + context: "dom:*[role]", + dependencies: ["aria_role_allowed"], + refactor: { + "Rpt_Aria_MissingFocusableChild": { + "pass": "pass", + "fail_missing_child": "fail_missing_child" + } + }, + help: { + "en-US": { + "pass": "aria_child_tabbable.html", + "fail_missing_child": "aria_child_tabbable.html", + "group": "aria_child_tabbable.html" + } + }, + messages: { + "en-US": { + "pass": "Rule Passed", + "fail_missing_child": "None of the descendent elements with \"{1}\" role is tabbable", + "group": "UI component must have at least one tabbable descendant for keyboard access" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip the check if the element requires presentational children only + if (AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(ruleContext) || AriaUtil_1.AriaUtil.shouldBePresentationalChild(ruleContext)) + return; + // An ARIA list is not interactive + if (AriaUtil_1.AriaUtil.hasRole(ruleContext, { "list": true, "row": true, "rowgroup": true, "table": true, "grid": true })) { + return null; + } + // Not a valid message for mobile because all elements are focusable in iOS when VoiceOver is enabled. + if (ruleContext.hasAttribute("class") && ruleContext.getAttribute("class").substring(0, 3) == "mbl") { + return null; + } + //ignore datalist element check since it will be part of a input element or hidden by default + if (ruleContext.nodeName.toLowerCase() === 'datalist') + return null; + // ignore if the element's navigation is controlled by another element, such as combobox + if (AriaUtil_1.AriaUtil.isNavigationOwnedOrControlled(ruleContext)) + return null; + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + var passed = true; + var doc = ruleContext.ownerDocument; + var hasAttribute = CommonUtil_1.CommonUtil.hasAttribute; + var roleNameArr = new Array(); + var nodeName = ""; + var inScope = false; + if (ARIADefinitions_1.ARIADefinitions.containers.includes(role)) { + var disabled = hasAttribute(ruleContext, 'aria-disabled') ? ruleContext.getAttribute("aria-disabled") : ''; + if (disabled != 'true' && !hasAttribute(ruleContext, 'aria-activedescendant') && !CommonUtil_1.CommonUtil.isTabbable(ruleContext)) { + var reqChildren = ARIADefinitions_1.ARIADefinitions.designPatterns[role].reqChildren; + if (reqChildren) { + inScope = true; + passed = false; + var xp = "descendant::*["; + for (var i = 0; i < reqChildren.length; i++) { + xp += "@role='" + reqChildren[i] + "' or "; + } + xp = xp.substring(0, xp.length - 4) + ']'; + var xpathResult = doc.evaluate(xp, ruleContext, CommonUtil_1.CommonUtil.defaultNSResolver, 0 /* XPathResult.ANY_TYPE */, null); + var r = xpathResult.iterateNext(); + while (r && !passed) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(r)) { + r = xpathResult.iterateNext(); + continue; + } + passed = CommonUtil_1.CommonUtil.isTabbable(r); + // Required child is not focusable via tabindex. See if there is a grandchild that is focusable by default or by tabindex. + if (!passed) { + var xp2 = "descendant::*"; + var xpathResult2 = doc.evaluate(xp2, r, CommonUtil_1.CommonUtil.defaultNSResolver, 0 /* XPathResult.ANY_TYPE */, null); + var r2 = xpathResult2.iterateNext(); + while (r2 && !passed) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(r2)) { + r2 = xpathResult2.iterateNext(); + continue; + } + passed = CommonUtil_1.CommonUtil.isTabbable(r); + r2 = xpathResult2.iterateNext(); + } + } + if (!passed) { + roleNameArr = r.getAttribute("role").trim().split(" "); + nodeName = r.nodeName.toLowerCase(); + } + r = xpathResult.iterateNext(); + } + } + } + } + // Variable Decleration + var retToken1 = new Array(); + var retToken2 = new Array(); + // In the case the arrays/strings are empty, that means that there is no violation so we can reset it back to passed, the reason for this + // is that we are setting passed=false while we perform a loop which causes violation to trigger even if there is no issues. Instead of + // updating the whole rule to switch from using passed in that way simply do the check at this point. + if (nodeName.length > 0 && roleNameArr.length > 0) { + retToken1.push(nodeName); + retToken2.push(roleNameArr.join(", ")); + } + else { + passed = true; + } + //return new ValidationResult(passed, [ruleContext], 'role', '', passed == true ? [] : [retToken1, retToken2]); + if (!inScope) { + return null; + } + else if (!passed) { + return (0, IRule_1.RuleFail)("fail_missing_child", [retToken1.toString(), retToken2.toString()]); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_child_valid.ts" +/*!******************************************!*\ + !*** ./src/v4/rules/aria_child_valid.ts ***! + \******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_child_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_child_valid = { + id: "aria_child_valid", + //context: "dom:*[role]", + //dependencies: ["Rpt_Aria_ValidRole"], + context: "dom:*", + dependencies: ["aria_role_valid", "aria_descendant_valid"], + help: { + "en-US": { + "group": "aria_child_valid.html", + "Pass": "aria_child_valid.html", + "Fail_no_child": "aria_child_valid.html", + "Fail_invalid_child": "aria_child_valid.html" + } + }, + messages: { + "en-US": { + "group": "An element with an ARIA role must own a required child", + "Pass": "An element with an ARIA role owns a required child", + "Fail_no_child": "The element with role \"{0}\" does not own any child element with any of the following role(s): \"{1}\"", + "Fail_invalid_child": "The element with role \"{0}\" owns the child element with the role \"{1}\" that is not one of the allowed role(s): \"{2}\"" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + // TODO: ACT: Verify mapping + act: ["bc4a75"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip the check if the element requires presentational children only + if (AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(ruleContext)) + return; + var roles = AriaUtil_1.AriaUtil.getRoles(ruleContext, false); + // if explicit role doesn't exist, get the implicit one + if (!roles || roles.length === 0) + roles = AriaUtil_1.AriaUtil.getImplicitRole(ruleContext); + //ignore if the element doesn't have any explicit or implicit role, shouldn't happen + if (!roles || roles.length === 0) + return null; + // ignore if the element contains none or presentation role + var presentationRoles = ["none", "presentation"]; + var found = roles.some(function (r) { return presentationRoles.includes(r); }); + if (found) + return null; + // For combobox, we have g1193 ... g1199 to check the values etc. + // We don't want to trigger 1152 again. So, we bypass it here. + if (roles.includes("combobox")) + return null; + var requiredChildRoles = AriaUtil_1.AriaUtil.getRequiredChildRoles(ruleContext, true); + // a 'group' role is allowed but not required for some elements so remove it if exists + if (requiredChildRoles.includes('group')) { + var index = requiredChildRoles.indexOf('group'); + if (index > -1) + requiredChildRoles.splice(index, 1); + } + /** + * ignore if a role doesn't require a child with any specific role + * the reverse might be not true - parent will be checked in Rpt_Aria_RequiredParent_Native_Host_Sematics rule + */ + if (requiredChildRoles.length == 0) + return null; + // get all the children from accessibility tree, + // including ones with aria-owns + var directATChildren = AriaUtil_1.AriaUtil.getDirectATChildren(ruleContext); + if (!directATChildren || directATChildren.length == 0) { + // the element with at least one required role dosen't contain any accessible child + /** + * When a widget is missing required owned elements due to script execution or loading, + * authors MUST mark a containing element with 'aria-busy' equal to true. + */ + var busy = ruleContext.getAttribute("aria-busy"); + if (!busy || busy !== 'true') { + var retToken = new Array(); + retToken.push(roles.join(", ")); + retToken.push(requiredChildRoles.join(", ")); + return (0, IRule_1.RuleFail)("Fail_no_child", retToken); + } + // it's 'busy' loading, ignore it + return null; + } + var violateElemRoles = new Array(); + for (var j = 0; j < directATChildren.length; j++) { + var childRoles = AriaUtil_1.AriaUtil.getRoles(directATChildren[j], false); + // if explicit role doesn't exist, get the implicit one + if (!childRoles || childRoles.length == 0) + childRoles = AriaUtil_1.AriaUtil.getImplicitRole(directATChildren[j]); + if (childRoles && childRoles.length > 0) { + /** + * when multiple roles are specified as required owned elements for a role, at least one instance of one required owned element is expected. + * the specification does not require an instance of each of the listed owned roles. + * therefore, the requirement is met if it has any one of the required roles. + */ + var found_1 = childRoles.some(function (r) { return requiredChildRoles.includes(r); }); + if (!found_1) + violateElemRoles.push(childRoles.join(", ")); + } + else { + // ignore the element since it's not semantic, shouldn't happen + } + } + if (violateElemRoles.length > 0) { + var retValues = []; + for (var i = 0; i < violateElemRoles.length; i++) { + var retToken = new Array(); + retToken.push(roles.join(", ")); + retToken.push(violateElemRoles[i]); + retToken.push(requiredChildRoles.join(", ")); + retValues.push((0, IRule_1.RuleFail)("Fail_invalid_child", retToken)); + } + return retValues; + } + return (0, IRule_1.RulePass)("Pass"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_complementary_label_unique.ts" +/*!*********************************************************!*\ + !*** ./src/v4/rules/aria_complementary_label_unique.ts ***! + \*********************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_complementary_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_complementary_label_unique = { + id: "aria_complementary_label_unique", + context: "aria:complementary", + refactor: { + "Rpt_Aria_MultipleComplementaryLandmarks_Implicit": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_complementary_label_unique.html", + "fail_label_not_unique": "aria_complementary_label_unique.html", + "group": "aria_complementary_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"complementary\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"complementary\" role do not have unique labels", + "group": "Each element with \"complementary\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "complementary"); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_complementary_label_visible.ts" +/*!**********************************************************!*\ + !*** ./src/v4/rules/aria_complementary_label_visible.ts ***! + \**********************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_complementary_label_visible = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_complementary_label_visible = { + id: "aria_complementary_label_visible", + context: "dom:*[role], dom:aside", + dependencies: ["aria_complementary_labelled"], + refactor: { + "Rpt_Aria_ComplementaryLandmarkLabel_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_complementary_label_visible.html", + "Fail_1": "aria_complementary_label_visible.html", + "group": "aria_complementary_label_visible.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Element with \"complementary\" role does not have a visible label", + "group": "Each element with \"complementary\" role should have a visible label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + if (!AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "complementary")) { + return null; + } + var passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "aria-labelledby"); + //return new ValidationResult(passed, [ruleContext], 'role', '', []); + if (passed) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_complementary_labelled.ts" +/*!*****************************************************!*\ + !*** ./src/v4/rules/aria_complementary_labelled.ts ***! + \*****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_complementary_labelled = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_complementary_labelled = { + id: "aria_complementary_labelled", + context: "aria:complementary", + refactor: { + "Rpt_Aria_ComplementaryRequiredLabel_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_complementary_labelled.html", + "Fail_1": "aria_complementary_labelled.html", + "group": "aria_complementary_labelled.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Element with \"complementary\" role does not have a label", + "group": "Each element with \"complementary\" role must have a label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + if (pair) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_content_in_landmark.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/aria_content_in_landmark.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_content_in_landmark = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var TableUtil_1 = __webpack_require__(/*! ../util/TableUtil */ "./src/v4/util/TableUtil.ts"); +exports.aria_content_in_landmark = { + id: "aria_content_in_landmark", + context: "dom:*", + refactor: { + "Rpt_Aria_OrphanedContent_Native_Host_Sematics": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_content_in_landmark.html", + "Fail_1": "aria_content_in_landmark.html", + "group": "aria_content_in_landmark.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Content is not within a landmark element", + "group": "All content must reside within an element with a landmark role" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }, + { + "id": ["WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var params = CacheUtil_1.CacheUtil.getCache(context.dom.node.ownerDocument, "aria_content_in_landmark", null); + if (!params) { + params = { + landmarks: { + value: ["banner", "complementary", "contentinfo", "form", "main", "navigation", "region", "search"], + type: "array" + }, + possibleOrphanedWidgets: { + value: ["button", "combobox", "checkbox", "grid", "heading", "link", "list", + "listbox", "menu", "menubar", "progressbar", "radio", "tablist", "textbox", "toolbar", "tree", + "treegrid" + ], + type: "array" + }, + possibleOrphanedElements: { + value: ["p", "table", "input", "textarea", "select", "button", "a", "ol", "ul", "dl", "h1", "h2", "h3", "h4", "h5", + "h6", "embed", "object", "area" + ], + type: "array" + }, + noLandmarkedRoles: { + // These roles don't require landmarks + value: ["alert", "alertdialog", "dialog", "tooltip"], + type: "array" + }, + mapLandmarks: {}, + mapPossibleOrphanedWidgets: {}, + mapPossibleOrphanedElements: {}, + mapNoLandmarkedRoles: {} + }; + // Convert arrays to maps + params.mapLandmarks = {}; + for (var i = 0; i < params.landmarks.value.length; ++i) { + params.mapLandmarks[params.landmarks.value[i]] = true; + } + params.mapPossibleOrphanedWidgets = {}; + for (var i = 0; i < params.possibleOrphanedWidgets.value.length; ++i) { + params.mapPossibleOrphanedWidgets[params.possibleOrphanedWidgets.value[i]] = true; + } + params.mapPossibleOrphanedElements = {}; + for (var i = 0; i < params.possibleOrphanedElements.value.length; ++i) { + params.mapPossibleOrphanedElements[params.possibleOrphanedElements.value[i]] = true; + } + params.mapNoLandmarkedRoles = {}; + for (var i = 0; i < params.noLandmarkedRoles.value.length; ++i) { + params.mapNoLandmarkedRoles[params.noLandmarkedRoles.value[i]] = true; + } + CacheUtil_1.CacheUtil.setCache(context.dom.node.ownerDocument, "aria_content_in_landmark", params); + } + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || // avoid diagnosing g1157 for non-visible nodes + (VisUtil_1.VisUtil.hiddenByDefaultElements != null && + VisUtil_1.VisUtil.hiddenByDefaultElements != undefined && + VisUtil_1.VisUtil.hiddenByDefaultElements.indexOf(nodeName) > -1)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + var elemsWithoutContent = ["area", "input", "embed", "button", "textarea", "select"]; + if (!CommonUtil_1.CommonUtil.hasInnerContentHidden(ruleContext) && //only trigger the rule on elements that have content + elemsWithoutContent.indexOf(nodeName) === -1) { // a few elems wihout content should not be skipped + return (0, IRule_1.RulePass)("Pass_0"); + } + // Short circuit for layout tables + if (nodeName == "table" && TableUtil_1.TableUtil.isLayoutTable(ruleContext)) { + return null; + } + // Check if it is a possible orphan + var passed = true; + var isPossibleOrphanedWidget = AriaUtil_1.AriaUtil.hasRole(ruleContext, params.mapPossibleOrphanedWidgets, true); + //exclude <link rel="stylesheet" href="xyz.css"> in the <head> and <body>(#608) + //having link in the head could cause lot of violaions + if (nodeName === 'link') { + isPossibleOrphanedWidget = false; + } + var isPossibleOrphanedElement = nodeName in params.mapPossibleOrphanedElements; + if (isPossibleOrphanedWidget || isPossibleOrphanedElement) { + // See if ancestor has landmark roles or implicit land mark roles + var parentRoles = contextHierarchies["aria"].map(function (info) { return info.role; }); + passed = parentRoles.filter(function (role) { return role in params.mapLandmarks; }).length > 0; + if (!passed) { + // Don't fail elements when a parent or sibling has failed - causes too many messages. + var walkElement = DOMWalker_1.DOMWalker.parentElement(ruleContext); + while (!passed && walkElement != null) { + passed = CacheUtil_1.CacheUtil.getCache(walkElement, "Rpt_Aria_OrphanedContent", false); + walkElement = DOMWalker_1.DOMWalker.parentElement(walkElement); + } + walkElement = ruleContext.nextElementSibling; + while (!passed && walkElement != null) { + passed = CacheUtil_1.CacheUtil.getCache(walkElement, "Rpt_Aria_OrphanedContent", false); + walkElement = walkElement.nextElementSibling; + } + walkElement = ruleContext.previousElementSibling; + while (!passed && walkElement != null) { + passed = CacheUtil_1.CacheUtil.getCache(walkElement, "Rpt_Aria_OrphanedContent", false); + walkElement = walkElement.previousElementSibling; + } + if (!passed) { + CacheUtil_1.CacheUtil.setCache(ruleContext, "Rpt_Aria_OrphanedContent", true); + // Don't trigger rule if element is a stand-alone widget + passed = CacheUtil_1.CacheUtil.getCache(ruleContext, "Rpt_Aria_OrphanedContent_NoTrigger", false) || + AriaUtil_1.AriaUtil.hasRole(ruleContext, params.mapNoLandmarkedRoles, true) || + AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, params.mapNoLandmarkedRoles, true); + if (passed) { + CacheUtil_1.CacheUtil.setCache(ruleContext, "Rpt_Aria_OrphanedContent_NoTrigger", true); + return null; + } + } + else { + return null; + } + } + } + else { + return null; + } + //return new ValidationResult(passed, [ruleContext], '', '', []); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_contentinfo_label_unique.ts" +/*!*******************************************************!*\ + !*** ./src/v4/rules/aria_contentinfo_label_unique.ts ***! + \*******************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_contentinfo_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_contentinfo_label_unique = { + id: "aria_contentinfo_label_unique", + context: "aria:contentinfo", + refactor: { + "Rpt_Aria_MultipleContentinfoLandmarks_Implicit": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_contentinfo_label_unique.html", + "fail_label_not_unique": "aria_contentinfo_label_unique.html", + "group": "aria_contentinfo_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"contentinfo\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"contentinfo\" role do not have unique labels", + "group": "Each element with \"contentinfo\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "contentinfo", true); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_contentinfo_misuse.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/aria_contentinfo_misuse.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_contentinfo_misuse = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_contentinfo_misuse = { + id: "aria_contentinfo_misuse", + context: "dom:*[role], dom:footer, dom:address", + refactor: { + "Rpt_Aria_ContentinfoWithNoMain_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_contentinfo_misuse.html", + "Fail_1": "aria_contentinfo_misuse.html", + "group": "aria_contentinfo_misuse.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Element with \"contentinfo\" role is present without an element with \"main\" role", + "group": "Each element with \"contentinfo\" role is only permitted with an element with \"main\" role" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + //consider implicit role + if (!AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "contentinfo")) { + return null; + } + // Consider the Check Hidden Content setting that is set by the rules + var passed = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "main", true, true).length > 0; + //return new ValidationResult(passed, [ruleContext], 'role', '', []); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_contentinfo_single.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/aria_contentinfo_single.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_contentinfo_single = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_contentinfo_single = { + id: "aria_contentinfo_single", + context: "dom:*[role], dom:footer, dom:address", + refactor: { + "Rpt_Aria_MultipleContentinfoInSiblingSet_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_contentinfo_single.html", + "Fail_1": "aria_contentinfo_single.html", + "group": "aria_contentinfo_single.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Multiple elements with \"contentinfo\" role found on the page", + "group": "A page, document, or application should only have one element with \"contentinfo\" role" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + //find out if <footer> element has siblings as <footer> has implicit contentinfo role + if (!AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "contentinfo")) { + return null; + } + var passed = !AriaUtil_1.AriaUtil.getSiblingWithRoleHidden(ruleContext, "contentinfo", true, true); + //return new ValidationResult(passed, [ruleContext], 'role', '', []); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_descendant_valid.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/aria_descendant_valid.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_descendant_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_descendant_valid = { + id: "aria_descendant_valid", + context: "dom:*", + dependencies: ["aria_role_valid"], + help: { + "en-US": { + "group": "aria_descendant_valid.html", + "pass": "aria_descendant_valid.html", + "potential_child_implicit_role": "aria_descendant_valid.html", + "recommendation_no_impact_role": "aria_descendant_valid.html", + "fail_child_explicit_role": "aria_descendant_valid.html" + } + }, + messages: { + "en-US": { + "group": "Browsers ignore the explicit and implicit ARIA roles of the descendants of certain elements", + "pass": "The element contains valid descendants", + "potential_child_implicit_role": "The element with role \"{0}\" contains descendants with implicit roles \"{1}\" which are ignored by browsers", + "recommendation_no_impact_role": "The element with role \"{0}\" contains descendants with roles \"{1}\" which are ignored by browsers", + "fail_child_explicit_role": "The element with role \"{0}\" contains descendants with roles \"{1}\" which are ignored by browsers" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE, + reasonCodes: ["pass", "potential_child_implicit_role", "fail_child_explicit_role"] + }, { + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE, + reasonCodes: ["recommendation_no_impact_role"] + }], + // TODO: ACT: Verify mapping + act: ["307n5z"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip the check if the element doesn't require presentational children only + if (!AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(ruleContext)) + return; + var roles = AriaUtil_1.AriaUtil.getRoles(ruleContext, false); + // if explicit role doesn't exist, get the implicit one + if (!roles || roles.length === 0) + roles = AriaUtil_1.AriaUtil.getImplicitRole(ruleContext); + //ignore if the element doesn't have any explicit or implicit role, shouldn't happen + if (!roles || roles.length === 0) + return null; + // let tagName = ruleContext.tagName.toLowerCase(); + // get all the children from accessibility tree, + // including ones with aria-owns + var directATChildren = AriaUtil_1.AriaUtil.getDirectATChildren(ruleContext); + if (directATChildren && directATChildren.length > 0) { + // the element with at least one non-presentational children + var explicitRoles = new Array(); + var implicitRoles = new Array(); + var noImpactRoles = new Array(); + for (var j = 0; j < directATChildren.length; j++) { + // ignore <img> and <svg> + var tag = directATChildren[j].nodeName.toLowerCase(); + if (tag === 'img' || tag === 'svg') + continue; + // get explicit role if exists + var childRoles = AriaUtil_1.AriaUtil.getRoles(directATChildren[j], false); + if (childRoles && childRoles.length > 0) { + // separate case for role="code" + if (childRoles.includes("code")) { + noImpactRoles.push(childRoles.filter(function (role) { return role === "code"; }).join(", ")); + } + explicitRoles.push(childRoles.filter(function (role) { return role !== "code"; }).join(", ")); + } + else { + // get implicit role if exists + childRoles = AriaUtil_1.AriaUtil.getImplicitRole(directATChildren[j]); + // separate case for role="code" + if (childRoles.includes("code")) { + noImpactRoles.push(childRoles.filter(function (role) { return role === "code"; }).join(", ")); + } + if (childRoles && childRoles.length > 0) + implicitRoles.push(childRoles.filter(function (role) { return role !== "code"; }).join(", ")); + } + } + if (explicitRoles.length > 0) { + var retValues = []; + for (var i = 0; i < explicitRoles.length; i++) { + var retToken = new Array(); + retToken.push(roles.join(", ")); + retToken.push(explicitRoles[i]); + retValues.push((0, IRule_1.RuleFail)("fail_child_explicit_role", retToken)); + } + return retValues; + } + if (implicitRoles.length > 0) { + var retValues = []; + for (var i = 0; i < implicitRoles.length; i++) { + var retToken = new Array(); + retToken.push(roles.join(", ")); + retToken.push(implicitRoles[i]); + retValues.push((0, IRule_1.RulePotential)("potential_child_implicit_role", retToken)); + } + return retValues; + } + if (noImpactRoles.length > 0) { + var retValues = []; + for (var i = 0; i < noImpactRoles.length; i++) { + var retToken = new Array(); + retToken.push(roles.join(", ")); + retToken.push(noImpactRoles[i]); + retValues.push((0, IRule_1.RulePotential)("recommendation_no_impact_role", retToken)); + } + return retValues; + } + } + else + return (0, IRule_1.RulePass)("pass"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_document_label_unique.ts" +/*!****************************************************!*\ + !*** ./src/v4/rules/aria_document_label_unique.ts ***! + \****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_document_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_document_label_unique = { + id: "aria_document_label_unique", + context: "aria:document", + refactor: { + "Rpt_Aria_MultipleDocumentRoles": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_document_label_unique.html", + "fail_label_not_unique": "aria_document_label_unique.html", + "group": "aria_document_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"document\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"document\" roles do not have unique labels", + "group": "Each element with \"document\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "document", true); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_eventhandler_role_valid.ts" +/*!******************************************************!*\ + !*** ./src/v4/rules/aria_eventhandler_role_valid.ts ***! + \******************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_eventhandler_role_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.aria_eventhandler_role_valid = { + id: "aria_eventhandler_role_valid", + context: "dom:*[onclick],dom:*[onblur], dom:*[ondblclick], dom:*[onfocus], dom:*[onkeydown],dom:*[onkeypress], dom:*[onkeyup], dom:*[onmousedown], dom:*[onmouseup], dom:*[onmousemove], dom:*[onmouseout], dom:*[onmouseover], dom:*[onresize], dom:*[onchange]", + refactor: { + "Rpt_Aria_EventHandlerMissingRole_Native_Host_Sematics": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_eventhandler_role_valid.html", + "Fail_1": "aria_eventhandler_role_valid.html", + "group": "aria_eventhandler_role_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The <{0}> element with '{1}' does not have a valid ARIA role specified", + "group": "Elements with event handlers must have a valid ARIA role" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Don't trigger this for SVG element for now until a determination is made (by Rich) + // to support SVG at a point when the SVG a11y spec is ready. + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, "svg")) { + return null; + } + //this rule is passed if a element has attribut role + //also, passed of element has any implicit roles. + if (AriaUtil_1.AriaUtil.hasAnyRole(ruleContext, true)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + //pass if this element is received focus by default + if (CommonUtil_1.CommonUtil.isfocusableByDefault(ruleContext)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + //validate if this element has any of the given event handler's + var retToken1 = new Array(); + retToken1.push(ruleContext.nodeName.toLowerCase()); + var eventArr = new Array(); + // From WCAG20_Script_UseW3CDomFunctions + //let events = ["onblur", "onfocus", "onchange", "onclick", "oncontextmenu", "ondblclick", "onkeydown", + // "onkeypress", "onkeyup", "onload", "onmousedown", "onmouseup", "onmousemove", "onmouseout", + // "onmouseover", "onmousewheel", "onreset", "onpaste", "onresize", "onscroll", + // "onselect", "onsubmit", "onactivate", "ondeactivate", "onmouseenter", "onmouseleave"]; + var events = ["onblur", "onfocus", "onchange", "onclick", "ondblclick", "onkeydown", + "onkeypress", "onkeyup", "onmousedown", "onmouseup", "onmousemove", "onmouseout", + "onmouseover", "onresize" + ]; + for (var i = 0; i < events.length; ++i) { + if (ruleContext.hasAttribute(events[i])) + eventArr.push(events[i]); + } + var retToken2 = new Array(); + retToken2.push(eventArr.join(", ")); + //return new ValidationResult(false, [ruleContext], '', '', [retToken1, retToken2]); + return (0, IRule_1.RuleFail)("Fail_1", [retToken1.toString(), retToken2.toString()]); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_form_label_unique.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/aria_form_label_unique.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_form_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_form_label_unique = { + id: "aria_form_label_unique", + context: "aria:form", + refactor: { + "Rpt_Aria_MultipleFormLandmarks_Implicit": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_form_label_unique.html", + "fail_label_not_unique": "aria_form_label_unique.html", + "group": "aria_form_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"form\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"form\" role do not have unique labels", + "group": "Each element with \"form\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "form", true); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_graphic_labelled.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/aria_graphic_labelled.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_graphic_labelled = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_graphic_labelled = { + id: "aria_graphic_labelled", + context: "aria:graphics-document,aria:graphics-symbol", + refactor: { + "HAAC_Aria_SvgAlt": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3" + } + }, + help: { + "en-US": { + "group": "aria_graphic_labelled.html", + "Pass_0": "aria_graphic_labelled.html", + "Fail_1": "aria_graphic_labelled.html", + "Fail_2": "aria_graphic_labelled.html", + "Fail_3": "aria_graphic_labelled.html" + } + }, + messages: { + "en-US": { + "group": "An element with a graphics role must have a non-empty label", + "Pass_0": "Rule Passed", + "Fail_1": "Element with \"{0}\" graphics role has no label", + "Fail_2": "Element with \"{0}\" graphics role has no label or an empty label", + "Fail_3": "Element with \"{0}\" graphics role missing non-empty 'aria-label' or 'aria-labelledby'" + } + }, + rulesets: [], + act: [{ + "7d6734": { + "Pass_0": "pass", + "Fail_1": "inapplicable", + "Fail_2": "fail", + "Fail_3": "inapplicable" + } + }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + if (!ruleContext.hasAttribute("role") || !ruleContext.getAttribute("role").includes("graphics-")) + return null; + /* removed the role check role= presentation since if an element has role=img, then there needs to be a check for alt attribute regardless of the presecne of role=presentation + if (RPTUtil.hasRole(ruleContext, "presentation") || RPTUtil.hasRole(ruleContext, "none")){ + return RulePass(1); + }*/ + // If role === img, you must use an aria label + //check attributes aria-label and aria-labelledby for other tags (e.g., <div>, <span>, etc) + var passed = AriaUtil_1.AriaUtil.getAriaLabel(ruleContext).length > 0; + if (!passed && ruleContext.nodeName.toLowerCase() === "svg") { + var svgTitle = ruleContext.querySelector("title"); + passed = svgTitle && CommonUtil_1.CommonUtil.hasInnerContent(svgTitle); + } + if (!passed) { + //check title attribute + passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "title"); + // We should guide people to use alt or label - this is just a secondary approach to silence the rule. + // So, we should keep the POF from above. + // if (!passed) POF = "Fail_3"; + } + //return new ValidationResult(passed, [ruleContext], 'role', '', []); + if (passed) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_2", [ruleContext.getAttribute("role")]); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_hidden_nontabbable.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/aria_hidden_nontabbable.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_hidden_nontabbable = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.aria_hidden_nontabbable = { + id: "aria_hidden_nontabbable", + context: "dom:*[aria-hidden=true], dom:*[aria-hidden=true] dom:*", + refactor: { + "aria_hidden_focus_misuse": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "aria_hidden_nontabbable.html", + "Pass_0": "aria_hidden_nontabbable.html", + "Fail_1": "aria_hidden_nontabbable.html" + } + }, + messages: { + "en-US": { + "group": "A hidden element should not contain any tabbable elements", + "Pass_0": "Rule Passed", + "Fail_1": "Element \"{0}\" should not be focusable within the subtree of an element with an 'aria-hidden' attribute with value 'true'" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: ["1.3.1", "4.1.2"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_TWO + }], + // TODO: ACT: Handle testcase with focus jumping away + act: "6cfa84", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (CommonUtil_1.CommonUtil.isTabbable(ruleContext)) { + return (0, IRule_1.RuleFail)("Fail_1", [nodeName]); + } + return (0, IRule_1.RulePass)("Pass_0"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_id_unique.ts" +/*!****************************************!*\ + !*** ./src/v4/rules/aria_id_unique.ts ***! + \****************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_id_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_id_unique = { + id: "aria_id_unique", + context: "dom:*", + refactor: { + "Rpt_Aria_ValidIdRef": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_id_unique.html", + "Fail_1": "aria_id_unique.html", + "group": "aria_id_unique.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The 'id' \"{0}\" specified for the ARIA property '{1}' value is not valid", + "group": "The ARIA property must reference a non-empty unique id of an existing element that is visible" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + // TODO: ACT: 6a7281 - Need a separate reason code when the property is not required. ACT says it's okay to be + // invalid when not required. I think we should still fail, but flag it as a different reason so that we can have a subset + // aligns with ACT. + act: ["59796f", "6a7281"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var pass = true; + var attrNameArr = new Array(); + var nonExistantIDs = new Array(); + var ownerDocument = fragment_1.FragmentUtil.getOwnerFragment(ruleContext); + var contextAttributes = ruleContext.attributes; + var idTokens = new Array(); + var testedReferences = 0; + if (contextAttributes) { + for (var i = 0, attrLength = contextAttributes.length; i < attrLength; i++) { + pass = true; + var attrName = contextAttributes[i].name; + if (AriaUtil_1.AriaUtil.isDefinedAriaAttribute(ruleContext, attrName)) { + var dataTypes = ARIADefinitions_1.ARIADefinitions.propertyDataTypes[attrName]; + if (dataTypes && dataTypes.type) { + var supportsOneIDRef = (dataTypes.type == "http://www.w3.org/2001/XMLSchema#idref") ? true : false; + //If the data type supports one or more id refs do error checking + if (supportsOneIDRef || (dataTypes.type == "http://www.w3.org/2001/XMLSchema#idrefs")) { + testedReferences++; + var nodeValueLength = CommonUtil_1.CommonUtil.normalizeSpacing(contextAttributes[i].nodeValue).length; + var idArray = contextAttributes[i].nodeValue.split(" "); + // Check for an empty ID Ref + if (nodeValueLength < 1) { + pass = false; + idTokens.push("\"" + contextAttributes[i].nodeValue + "\""); + } + // check to see if too many IDRefs + else if (supportsOneIDRef) { + //If has too many IDRefs it is an error + if (nodeValueLength >= 1) { + if (idArray.length > 1) { + pass = false; + // Need to capture all the IDRefs for idTokens + for (var z = 0, length_1 = idArray.length; z < length_1; ++z) { + if (idArray[z] != "") { + idTokens.push(idArray[z]); + } + } + } + } + } + // check to see if id refs are invalid + if (pass && nodeValueLength >= 1) { + for (var j = 0, length_2 = idArray.length; j < length_2; ++j) { + if (idArray[j].length > 0) { // it is an empty string if spaces are one after the other + // Get the element by Id + var elementById = ownerDocument.getElementById(idArray[j]); + // Pass if the element exists + pass = elementById != null; + // If the element exists and this is an aria attribute that doesn't support hidden ID reference + // then perform a isNodeVisible check, in the case the node is not visible then we return + // false and true otherwise. + if (pass && !dataTypes.hiddenIDRefSupported) { + pass = VisUtil_1.VisUtil.isNodeVisible(elementById); + } + if (!pass) { + if (idArray[j] != "") { + idTokens.push(idArray[j]); + } + } + // Only one of the id references need to be valid to mark the rule as passed. + // Therefore if we find a single visible element then stop checking and mark as + // passed. + else { + break; + } + } + } + } + } + } + if (!pass) + attrNameArr.push(attrName); + } + } + } + var passed = attrNameArr.length == 0; + var retToken1 = new Array(); + var retToken2 = new Array(); + var retToken3 = new Array(); + if (!passed) { + retToken2.push(attrNameArr.join(", ")); + retToken3.push(ruleContext.nodeName.toLowerCase()); + if (idTokens.length > 0) { + retToken1.push(idTokens.join(", ")); + } + } + //return new ValidationResult(passed, [ruleContext], attrNameArr, '', passed == true ? [] : [retToken1, retToken2, retToken3]); + if (testedReferences == 0) { + return null; + } + else if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", [retToken1.toString(), retToken2.toString(), retToken3.toString()]); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_img_labelled.ts" +/*!*******************************************!*\ + !*** ./src/v4/rules/aria_img_labelled.ts ***! + \*******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_img_labelled = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_img_labelled = { + id: "aria_img_labelled", + context: "aria:img, aria:image", + refactor: { + "HAAC_Aria_ImgAlt": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3" + } + }, + help: { + "en-US": { + "group": "aria_img_labelled.html", + "Pass_0": "aria_img_labelled.html", + "Fail_1": "aria_img_labelled.html", + "Fail_2": "aria_img_labelled.html", + "Fail_3": "aria_img_labelled.html" + } + }, + messages: { + "en-US": { + "group": "An element with \"img\" role must have a non-empty label", + "Pass_0": "Rule Passed", + "Fail_1": "Element with \"img\" role has no label", + "Fail_2": "Element with \"img\" role has no label or an empty label", + "Fail_3": "Element with \"img\" role missing non-empty 'aria-label' or 'aria-labelledby'" + } + }, + rulesets: [], + act: ["23a2a8", { + "7d6734": { + "Pass_0": "pass", + "Fail_1": "inapplicable", + "Fail_2": "fail", + "Fail_3": "inapplicable" + } + }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + if (!ruleContext.hasAttribute("role")) { + // If no role, this is implicit, and covered by WCAG20_Img_HasAlt + return null; + } + var nodeName = ruleContext.nodeName.toLocaleLowerCase(); + // svg and img elements are handled in svg_graphics_labbelled and img_alt_valid rules + if (nodeName === 'svg' || nodeName === 'img') + return; + /* removed the role check role= presentation since if an element has role=img, then there needs to be a check for alt attribute regardless of the presecne of role=presentation + if (RPTUtil.hasRole(ruleContext, "presentation") || RPTUtil.hasRole(ruleContext, "none")){ + return RulePass(1); + }*/ + /* JCH - Points of failure + * 0. Missing alt attr with value + * 1. Missing aria-label or aria-labelledby + * 2. Missing title attr with value + */ + // If role === img, you must use an aria label + //check attributes aria-label and aria-labelledby for other tags (e.g., <div>, <span>, etc) + var passed = AriaUtil_1.AriaUtil.getAriaLabel(ruleContext).length > 0; + if (!passed && ruleContext.nodeName.toLowerCase() === "svg") { + var svgTitle = ruleContext.querySelector("title"); + passed = svgTitle && CommonUtil_1.CommonUtil.hasInnerContent(svgTitle); + } + if (!passed) { + //check title attribute + passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "title"); + // We should guide people to use alt or label - this is just a secondary approach to silence the rule. + // So, we should keep the POF from above. + // if (!passed) POF = "Fail_3"; + } + //return new ValidationResult(passed, [ruleContext], 'role', '', []); + if (passed) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_2"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_keyboard_handler_exists.ts" +/*!******************************************************!*\ + !*** ./src/v4/rules/aria_keyboard_handler_exists.ts ***! + \******************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_keyboard_handler_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_keyboard_handler_exists = { + id: "aria_keyboard_handler_exists", + context: "dom:*[role]", + dependencies: ["aria_role_allowed"], + refactor: { + "Rpt_Aria_MissingKeyboardHandler": { + "pass": "pass", + "potential_no_keyboard_access": "potential_no_keyboard_access" + } + }, + help: { + "en-US": { + "pass": "aria_keyboard_handler_exists.html", + "potential_no_keyboard_access": "aria_keyboard_handler_exists.html", + "group": "aria_keyboard_handler_exists.html" + } + }, + messages: { + "en-US": { + "pass": "Rule Passed", + "potential_no_keyboard_access": "Verify the <{0}> element with \"{1}\" role has keyboard access", + "group": "Interactive WAI_ARIA UI components must provide keyboard access" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + var passed = true; + var savedPassed = passed; + var doc = ruleContext.ownerDocument; + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + //let roles = ruleContext.getAttribute("role").trim().toLowerCase().split(/\s+/); + //only consider user specified role(s), rather than native containers + var roles = AriaUtil_1.AriaUtil.getRoles(ruleContext, false); + var nodeName = ruleContext.nodeName.toLowerCase(); + //if an explicit role is specified, the 'aria_role_redundant' rule should be triggered and addressed first, + // and the current rule should be ignored + if (nodeName === 'datalist' && roles && roles.includes("listbox")) + return null; + // Composite user interface widget roles. They act as containers that manage other, contained widgets. + var roleContainers = ["combobox", "grid", "listbox", "menu", "menubar", "radiogroup", "tablist", "tree", "treegrid"]; + for (var _i = 0, roleContainers_1 = roleContainers; _i < roleContainers_1.length; _i++) { + var role = roleContainers_1[_i]; + if (AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, role, true) != null) + // it's a descendant of a composite widget already examined + return null; + } + var hasAttribute = CommonUtil_1.CommonUtil.hasAttribute; + var roleNameArr = new Array(); + for (var j = 0; j < roles.length; ++j) { + var pattern = designPatterns[roles[j]]; + if (roleContainers.indexOf(roles[j]) >= 0) { + var disabled = hasAttribute(ruleContext, 'aria-disabled') ? ruleContext.getAttribute("aria-disabled") : ''; + if (!disabled) { + // See if there is a keyboard event handler on the parent element. + passed = (ruleContext.hasAttribute("onkeydown") || ruleContext.hasAttribute("onkeypress") || ruleContext.hasAttribute("onkeyup")); + // No keyboard event handler found on parent. See if keyboard event handlers are on required child elements. + if (!passed) { + if (!hasAttribute(ruleContext, 'aria-activedescendant')) { + var reqChildren = ARIADefinitions_1.ARIADefinitions.designPatterns[roles[j]].reqChildren; + if (reqChildren) { /* SMF TODO menubar does not have any reqChildren */ + for (var i = 0, requiredChildrenLength = reqChildren.length; i < requiredChildrenLength; i++) { + var xp = "*[contains(@role,'" + reqChildren[i] + "')]"; + var xpathResult = doc.evaluate(xp, ruleContext, CommonUtil_1.CommonUtil.defaultNSResolver, 0 /* XPathResult.ANY_TYPE */, null); + var r = xpathResult.iterateNext(); + while (r) { + passed = (r.hasAttribute("onkeydown") || r.hasAttribute("onkeypress")); + if (!passed) { + // Child did not have a key handler. See if any of the grandchildren do. + var xp2 = "descendant::*"; + var xpathResult2 = doc.evaluate(xp2, r, CommonUtil_1.CommonUtil.defaultNSResolver, 0 /* XPathResult.ANY_TYPE */, null); + var r2 = xpathResult2.iterateNext(); + while (r2 && !passed) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(r2)) { + r2 = xpathResult2.iterateNext(); + continue; + } + passed = CommonUtil_1.CommonUtil.isTabbable(r2) && + (r2.hasAttribute("onkeydown") || r2.hasAttribute("onkeypress")); + if (!passed) { + // Is this an action link? + if (r2.nodeName.toLowerCase() == "a" && r2.hasAttribute("href")) { + var href = r2.getAttribute("href"); + // Action link must start with "javascript:", must not contain a "void" and + // must have a function name following "javascript:" (i.e., href.length > 11) + passed = (href.startsWith("javascript:") && href.indexOf("void") == -1 && href.length > 11); + } + } + r2 = xpathResult2.iterateNext(); + } + } + if (!passed) { + // All the required children (or any descendants of the required children) must have keypress/keydown + // If not, it is a failure, no need to keep checking any more. + break; + } + r = xpathResult.iterateNext(); + } + } + } + else { + // The current element failed the keydown/keypress, and it does not have required children, such as menubar. + // Let's check its descendants. + var xp2 = "descendant::*"; + var xpathResult2 = doc.evaluate(xp2, ruleContext, CommonUtil_1.CommonUtil.defaultNSResolver, 0 /* XPathResult.ANY_TYPE */, null); + var r2 = xpathResult2.iterateNext(); + while (r2 && !passed) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(r2)) { + r2 = xpathResult2.iterateNext(); + continue; + } + passed = CommonUtil_1.CommonUtil.isTabbable(r2) && + (r2.hasAttribute("onkeydown") || r2.hasAttribute("onkeypress")); + if (!passed) { + // Is this an action link? + if (r2.nodeName.toLowerCase() == "a" && r2.hasAttribute("href")) { + var href = r2.getAttribute("href"); + // Action link must start with "javascript:", must not contain a "void" and + // must have a function name following "javascript:" (i.e., href.length > 11) + passed = (href.startsWith("javascript:") && href.indexOf("void") == -1 && href.length > 11); + } + } + r2 = xpathResult2.iterateNext(); + } + } + } + else { + // Attribute 'aria-activedescendant' is specified. + passed = true; + } + } + } + } + if (!passed) { + roleNameArr.push(roles[j]); + } + if (!passed && savedPassed) { + savedPassed = passed; + } + } + var retToken1 = new Array(); + retToken1.push(ruleContext.nodeName.toLowerCase()); + var retToken2 = new Array(); + retToken2.push(roleNameArr.join(", ")); + // Determine if this is referenced by a combobox. If so, leave it to the combobox rules to check + var id = ruleContext.getAttribute("id"); + if (id && id.trim().length > 0) { + if (ruleContext.ownerDocument.querySelector("*[aria-controls='".concat(id, "'][role='combobox']"))) { + return null; + } + } + return savedPassed ? (0, IRule_1.RulePass)("pass") : (0, IRule_1.RulePotential)("potential_no_keyboard_access", [retToken1.toString(), retToken2.toString()]); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_landmark_name_unique.ts" +/*!***************************************************!*\ + !*** ./src/v4/rules/aria_landmark_name_unique.ts ***! + \***************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_landmark_name_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var ARIAMapper_1 = __webpack_require__(/*! ../../v2/aria/ARIAMapper */ "./src/v2/aria/ARIAMapper.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +exports.aria_landmark_name_unique = { + id: "aria_landmark_name_unique", + context: "aria:complementary, aria:banner, aria:contentinfo, aria:main, aria:navigation, aria:region, aria:search, aria:form", + refactor: { + "landmark_name_unique": { + "Pass_0": "pass", + "Fail_0": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_landmark_name_unique.html", + "fail_label_not_unique": "aria_landmark_name_unique.html", + "group": "aria_landmark_name_unique.html" + } + }, + messages: { + "en-US": { + "pass": "Multiple elements with \"{0}\" landmarks within the same parent region are distinguished by unique 'aria-label' or 'aria-labelledby'", + "fail_label_not_unique": "Multiple elements with \"{0}\" landmarks within the same parent region are not distinguished from one another because they have the same \"{1}\" label", + "group": "Each landmark should have a unique 'aria-labelledby' or 'aria-label' or be nested in a different parent region" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }, + { + "id": ["WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + // TODO do I need to fiter out bad contentinfo nodes: The footer element is not a contentinfo landmark when it is a descendant of the following HTML5 sectioning elements: https://www.w3.org/TR/2017/NOTE-wai-aria-practices-1.1-20171214/examples/landmarks/HTML5.html + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // Checking if this landmark is inside a dialog element. If it is we are going to skip checking it. + /**var copyOfRuleContext = ruleContext; + var parnetNodesOfRuleContext = []; + while (copyOfRuleContext) { + parnetNodesOfRuleContext.unshift(copyOfRuleContext); + copyOfRuleContext = copyOfRuleContext.parentElement; + } + parnetNodesOfRuleContext.forEach(elem => { + if (elem !== null) { + if (elem.tagName == "DIALOG" || elem.getAttribute('role') == "dialog") { + return null // Skipping checking landmarks that happen to be inside dialog elements + } + } + }) + */ + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["DIALOG"]) !== null || AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, "dialog", true) !== null) + return null; + // Begining formCache work + var ownerDocument = fragment_1.FragmentUtil.getOwnerFragment(ruleContext); + var formCache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "aria_landmark_name_unique", null); + if (!formCache) { + // console.log("---------ENTERING FORM CACHE") + formCache = { + navigationNodes: [], + navigationNodesComputedLabels: [], + navigationNodesParents: [], + navigationNodesMatchFound: [] + }; + var navigationNodesTemp = ownerDocument.querySelectorAll('aside,[role="complementary"], footer,[role="contentinfo"], header,[role="banner"], main,[role="main"], nav,[role="navigation"], form,[role="form"], section,[role="region"],[role="search"]'); + var navigationNodes = Array.from(navigationNodesTemp); + var navigationNodesParents = []; + var navigationNodesMatchFound = []; + // This block of code filters out any nav elements that are under a dialog. As those are not ones we want to test against as we consider dialogs are separate locations from the rest of the main page. + var navigationNodesWithoutDialogs = []; + for (var i = 0; i < navigationNodes.length; i++) { + /**let a = navigationNodes[i]; + + let dialogNodeFoundFlag = false; + while (a) { + a = a.parentElement; + if (a !== null) { + if (a.tagName == "DIALOG" || a.getAttribute('role') == "dialog") { + dialogNodeFoundFlag = true; + } + } + } + if (!dialogNodeFoundFlag) { + navigationNodesWithoutDialogs.push(navigationNodes[i]) + }*/ + // ignore node that is AT hidden or in a dialog + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(navigationNodes[i]) || CommonUtil_1.CommonUtil.getAncestor(navigationNodes[i], ["DIALOG"]) !== null || AriaUtil_1.AriaUtil.getAncestorWithRole(navigationNodes[i], "dialog", true) !== null) + continue; + navigationNodesWithoutDialogs.push(navigationNodes[i]); + } + navigationNodes = navigationNodesWithoutDialogs; + for (var i = 0; i < navigationNodes.length; i++) { + // Loop over all the landmark nodes + var els = []; + var a = navigationNodes[i].parentElement; + while (a) { + els.push(a); + a = a.parentElement; + } + for (var j = 0; j < els.length; j++) { + // Loop over all the parents of the landmark nodes + // Find nearest landmark parent based on the tagName or the role attribute + var tagNameTrigger = [ + "ASIDE", + "FOOTER", + "FORM", + "HEADER", + "MAIN", + "NAV", + "SECTION", + ].includes(els[j].tagName); + var roleNameTrigger = false; + if (els[j].hasAttribute("role")) { + roleNameTrigger = [ + "complementary", + "contentinfo", + "form", + "banner", + "main", + "navigation", + "region", + "search", + ].includes(els[j].getAttribute("role")); // TODO we are not covering the case where a elemenent with multiple roles. e.g., role = "form banner". This is a improvment we might want to add in the future. + } + if (tagNameTrigger || roleNameTrigger) { + // Nearest parent-landmark found + navigationNodesParents.push(els[j]); + break; + } + if (j === els.length - 1) { + // This node is at the head of the file so it does not have a parent + navigationNodesParents.push(null); + break; + } + } + } + var navigationNodesComputedLabels = []; + for (var i = 0; i < navigationNodes.length; i++) { + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(navigationNodes[i]); + // Loop over all the landmark nodes + navigationNodesComputedLabels.push( + /**ARIAMapper.computeName(navigationNodes[i])*/ + pair && pair.name && pair.name.trim().length > 0 ? pair.name.trim() : ""); + } + for (var i = 0; i < navigationNodesParents.length; i++) { + // Loop over all the parents of the landmark nodes to find duplicates + var matchFound = false; + var pass_0_flag = false; + for (var j = 0; j < navigationNodesParents.length; j++) { + if (j === i) { + // We do not want to compare against ourselfs + continue; + } + // This if statement focus on the case where the parent landmark is null + if (navigationNodesParents[i] === null && + navigationNodesParents[j] === null) { + // We are looking at two root nodes, so we should compare them. + if (ARIAMapper_1.ARIAMapper.nodeToRole(navigationNodes[i]) === + ARIAMapper_1.ARIAMapper.nodeToRole(navigationNodes[j])) { + // Both nodes have the same role AND + if (navigationNodesComputedLabels[i] === + navigationNodesComputedLabels[j]) { + // both have the same (computed) aria-label/aria-labelledby + // if (navigationNodesComputedLabels[i] === "") { + navigationNodesMatchFound.push("fail_label_not_unique"); // Fail 0 + matchFound = true; + break; + // } + } + else { + // Same parents && same node roles BUT different computed aria-label/aria-labelledby + // We have at least a Pass_0. But we need to check all nodes to see if another one fails. So set a flag. + pass_0_flag = true; + } + } + else { + // Same parents but different node roles // Not applicable + } + } + else if (navigationNodesParents[i] === null || + navigationNodesParents[j] === null) { + // We are looking at a single root node + continue; + } + // This if statement focus on the case where the parent landmark is NOT null + if (DOMUtil_1.DOMUtil.sameNode(navigationNodesParents[i], navigationNodesParents[j])) { + // We have the same parent-landmark AND + if (ARIAMapper_1.ARIAMapper.nodeToRole(navigationNodes[i]) === + ARIAMapper_1.ARIAMapper.nodeToRole(navigationNodes[j])) { + // Both nodes have the same role AND + if (navigationNodesComputedLabels[i] === + navigationNodesComputedLabels[j]) { + // both have the same (computed) aria-label/aria-labelledby + // if (navigationNodesComputedLabels[i] === "") { + navigationNodesMatchFound.push("fail_label_not_unique"); // Fail 0 + matchFound = true; + break; + // } + } + else { + // Same parents && same node roles BUT different computed aria-label/aria-labelledby + // We have at least a Pass_0. But we need to check all nodes to see if another one fails. So set a flag. + pass_0_flag = true; + } + } + else { + // Same parents but different node roles // Not applicable + } + } + else { + // Different parents // Not applicable + } + } + if (!matchFound) { + if (pass_0_flag) { + navigationNodesMatchFound.push("pass"); + } + else { + navigationNodesMatchFound.push("null"); // This is not the keyword null on purpose. It is a spaceholder in the array so indexes match up. + } + } + } + formCache.navigationNodesComputedLabels = + navigationNodesComputedLabels; + formCache.navigationNodes = navigationNodes; + formCache.navigationNodesParents = navigationNodesParents; + formCache.navigationNodesMatchFound = navigationNodesMatchFound; + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "aria_landmark_name_unique", formCache); + // TODO Add validation that all 3 arrays are the same length + // console.log("-------------End formCache") + } // End formCache + var indexToCheck = -1; + for (var i = 0; i < formCache.navigationNodes.length; i++) { + if (ruleContext.isSameNode(formCache.navigationNodes[i])) { + indexToCheck = i; + } + } + if (indexToCheck === -1) { + return null; + } + if (formCache.navigationNodesMatchFound[indexToCheck] === "pass") { + return (0, IRule_1.RulePass)("pass", [ + ARIAMapper_1.ARIAMapper.nodeToRole(formCache.navigationNodes[indexToCheck]), + ]); + } + else if (formCache.navigationNodesMatchFound[indexToCheck] === "fail_label_not_unique") { + return (0, IRule_1.RuleFail)("fail_label_not_unique", [ + ARIAMapper_1.ARIAMapper.nodeToRole(formCache.navigationNodes[indexToCheck]), + formCache.navigationNodesComputedLabels[indexToCheck], + ]); + } + else { + return null; + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_main_label_unique.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/aria_main_label_unique.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_main_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_main_label_unique = { + id: "aria_main_label_unique", + context: "aria:main", + refactor: { + "Rpt_Aria_MultipleMainsRequireLabel_Implicit_2": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_main_label_unique.html", + "Fail_1": "aria_main_label_unique.html", + "group": "aria_main_label_unique.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Multiple elements with \"main\" role do not have unique labels", + "group": "Each element with \"main\" role must have unique label that describes its purposes" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var contextLabel = AriaUtil_1.AriaUtil.getAriaLabel(ruleContext); + var parentDocRole = AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, "document", true); + var mains = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "main", true, true); + var result = null; + for (var i = 0; i < mains.length; ++i) { + if (mains[i] === ruleContext) + continue; + result = (0, IRule_1.RulePass)("Pass_0"); + var thisParentDocRole = AriaUtil_1.AriaUtil.getAncestorWithRole(mains[i], "document", true); + if (thisParentDocRole === parentDocRole) { + if (AriaUtil_1.AriaUtil.getAriaLabel(mains[i]) === contextLabel) { + result = (0, IRule_1.RuleFail)("Fail_1"); + break; + } + } + } + return result; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_main_label_visible.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/aria_main_label_visible.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_main_label_visible = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_main_label_visible = { + id: "aria_main_label_visible", + context: "dom:body", + refactor: { + "Rpt_Aria_MultipleMainsVisibleLabel_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_main_label_visible.html", + "Fail_1": "aria_main_label_visible.html", + "group": "aria_main_label_visible.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Multiple elements with \"main\" role do not have unique visible labels", + "group": "Each element with \"main\" role should have a unique visible label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // Consider the Check Hidden Content setting that is set by the rules + //call getElementsByRoleHidden with considerImplicit flag as true + //so that the method returs <main> elements + var landmarks = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "main", true, true); + if (landmarks.length === 0 || landmarks.length === 1) { + return null; + } + var passed = AriaUtil_1.AriaUtil.hasUniqueAriaLabelledby(landmarks); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_navigation_label_unique.ts" +/*!******************************************************!*\ + !*** ./src/v4/rules/aria_navigation_label_unique.ts ***! + \******************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_navigation_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_navigation_label_unique = { + id: "aria_navigation_label_unique", + context: "aria:navigation", + refactor: { + "Rpt_Aria_MultipleNavigationLandmarks_Implicit": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_navigation_label_unique.html", + "fail_label_not_unique": "aria_navigation_label_unique.html", + "group": "aria_navigation_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"navigation\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"navigation\" role do not have unique labels", + "group": "Each element with \"navigation\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "navigation", true); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_parent_required.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/aria_parent_required.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_parent_required = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_parent_required = { + id: "aria_parent_required", + context: "dom:*[role]", + dependencies: ["aria_role_allowed"], + refactor: { + "Rpt_Aria_RequiredParent_Native_Host_Sematics": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "aria_parent_required.html", + "Pass_0": "aria_parent_required.html", + "Fail_1": "aria_parent_required.html" + } + }, + messages: { + "en-US": { + "group": "Each element with an implicit or explicit role must be contained within a valid element", + "Pass_0": "Rule Passed", + "Fail_1": "Element with \"{0}\" role is not contained in or owned by an element with one of the following roles: \"{1}\"" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + // TODO: ACT: Check Fail 3 + act: "ff89c9", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip the check if the element should be a presentational child of an element + if (AriaUtil_1.AriaUtil.shouldBePresentationalChild(ruleContext) || VisUtil_1.VisUtil.isNodePresentational(ruleContext)) + return; + var passed = true; + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + var roleNameArr = new Array(); + var containerRoles = new Array(); + var testedContainer = 0; + var ancestorRoles = contextHierarchies["aria"].map(function (info) { return info.role; }); + var parentRole = ancestorRoles[ancestorRoles.length - 2]; + var count = 2; + while (parentRole === 'none') { + count++; + parentRole = ancestorRoles[ancestorRoles.length - count]; + } + /**for (let j = 0, length = roles.length; j < length; ++j) { + if (designPatterns[roles[j]] && designPatterns[roles[j]].container != null) { + testedContainer++; + passed = false; + containerRoles = designPatterns[roles[j]].container; + for (let i = 0, containersLength = containerRoles.length; !passed && i < containersLength; i++) { + passed = parentRole === containerRoles[i]; + if (passed) break; + } + if (passed == false) { + roleNameArr.push(roles[j]); + } + } + } + */ + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + if (designPatterns[role] && designPatterns[role].container != null) { + testedContainer++; + passed = false; + containerRoles = designPatterns[role].container; + for (var i = 0, containersLength = containerRoles.length; !passed && i < containersLength; i++) { + passed = parentRole === containerRoles[i]; + if (passed) + break; + } + if (passed == false) { + roleNameArr.push(role); + } + } + var retToken1 = new Array(); + retToken1.push(roleNameArr.join(", ")); + var retToken2 = new Array(); + retToken2.push(containerRoles.join(", ")); + //return new ValidationResult(passed, [ruleContext], '', '', passed == true ? [] : [retToken1, retToken2]); + if (testedContainer == 0) { + return null; + } + else if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", [retToken1.toString(), retToken2.toString()]); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_region_label_unique.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/aria_region_label_unique.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_region_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_region_label_unique = { + id: "aria_region_label_unique", + context: "aria:region", + refactor: { + "Rpt_Aria_MultipleRegionsUniqueLabel_Implicit": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_region_label_unique.html", + "fail_label_not_unique": "aria_region_label_unique.html", + "group": "aria_region_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"region\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"region\" role do not have unique labels", + "group": "Each element with \"region\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "region"); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_region_labelled.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/aria_region_labelled.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_region_labelled = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_region_labelled = { + id: "aria_region_labelled", + context: "aria:region", + refactor: { + "Rpt_Aria_RegionLabel_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + // "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_0": "aria_region_labelled.html", + "Fail_1": "aria_region_labelled.html", + // "Fail_2": "aria_region_labelled.html", + "group": "aria_region_labelled.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Element with \"region\" role does not have a label", + // "Fail_2": "Element with \"region\" role is not labeled with 'aria-label' or 'aria-labelledby'", + "group": "Each element with \"region\" role must have a label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = AriaUtil_1.AriaUtil.hasAriaLabel(ruleContext) || CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "title"); + if (passed) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_role_allowed.ts" +/*!*******************************************!*\ + !*** ./src/v4/rules/aria_role_allowed.ts ***! + \*******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_role_allowed = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +exports.aria_role_allowed = { + id: "aria_role_allowed", + context: "dom:*[role]", + refactor: { + "Rpt_Aria_ValidRole": { + "Pass_0": "Pass_0", + "Fail_2": "Fail_2", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "group": "aria_role_allowed.html", + "Pass_0": "aria_role_allowed.html", + "Fail_2": "aria_role_allowed.html", + "Potential_1": "aria_role_allowed.html" + } + }, + messages: { + "en-US": { + "group": "Elements must have a valid 'role' per ARIA specification", + "Pass_0": "Rule Passed", + "Fail_2": "The role '{0}' defined on the element is not valid per ARIA specification", + "Potential_1": "Some of the roles, '{0}', defined on the element are not valid per ARIA specification" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "4.1.2", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + // TODO: ACT: Recheck + act: "674b10", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var roleStr = ruleContext.getAttribute("role").trim().toLowerCase(); + if (roleStr.length === 0) { + return null; + } + if (ruleContext.hasAttribute("aria-hidden") && ruleContext.getAttribute("aria-hidden").toLowerCase() === "true") { + return null; + } + var invalidRoles = AriaUtil_1.AriaUtil.getRolesUndefinedByAria(ruleContext); + if (!invalidRoles || invalidRoles.length === 0) + return (0, IRule_1.RulePass)("Pass_0"); + else { + var roles = roleStr.split(/\s+/); + if (invalidRoles.length === roles.length) { + return (0, IRule_1.RuleFail)("Fail_2", [invalidRoles.join(",")]); + } + else if (invalidRoles.length > 0) { + return (0, IRule_1.RulePotential)("Potential_1", [invalidRoles.join(",")]); + } + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_role_redundant.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/aria_role_redundant.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_role_redundant = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +exports.aria_role_redundant = { + id: "aria_role_redundant", + context: "dom:*[role]", + help: { + "en-US": { + "pass": "aria_role_redundant.html", + "fail_redundant": "aria_role_redundant.html", + "group": "aria_role_redundant.html" + } + }, + messages: { + "en-US": { + "pass": "An explicitly-assigned ARIA role is not redundant with the implicit role of the element", + "fail_redundant": "The explicitly-assigned ARIA role \"{0}\" is redundant with the implicit role of the element <{1}>", + "group": "An explicitly-assigned ARIA role should not be redundant with the implicit role of the element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["ARIA"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var elemName = ruleContext.tagName.toLowerCase(); + var ariaRoles = AriaUtil_1.AriaUtil.getRoles(ruleContext, false); + if (!ariaRoles || ariaRoles.length === 0) + return; + // the invalid role case: handled by Rpt_Aria_ValidRole. Ignore to avoid duplicated report + var role_defined = AriaUtil_1.AriaUtil.areRolesDefined(ariaRoles); + if (!role_defined) + return null; + // dependency check: if it's already failed in the parent relation, then skip this check + // comment out to report the redundant role for table element: tr, td & th + /**if (["td", "th", "tr"].includes(elemName)) { + let parentRole = TableUtil.isTableDescendant(contextHierarchies); + if (parentRole !== null && parentRole.length > 0) + return null; + }*/ + var implicitRoles = AriaUtil_1.AriaUtil.getImplicitRole(ruleContext); + if (!implicitRoles || implicitRoles.length === 0) + return (0, IRule_1.RulePass)("pass"); + var ret = []; + for (var i = 0; i < ariaRoles.length; i++) { + if (!implicitRoles.includes(ariaRoles[i])) + ret.push((0, IRule_1.RulePass)("pass")); + else + ret.push((0, IRule_1.RuleFail)("fail_redundant", [ariaRoles[i], elemName])); + } + if (ret.length > 0) + return ret; + return null; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_search_label_unique.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/aria_search_label_unique.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_search_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_search_label_unique = { + id: "aria_search_label_unique", + context: "aria:search", + refactor: { + "Rpt_Aria_MultipleSearchLandmarks": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_search_label_unique.html", + "fail_label_not_unique": "aria_search_label_unique.html", + "group": "aria_search_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"search\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"search\" role do not have unique labels", + "group": "Each element with \"search\" role must have a unique label that describes its purpose" + } + }, + /** + * deprecated the rule on 01/27/2025 + * rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": eRulePolicy.VIOLATION, + "toolkitLevel": eToolkitLevel.LEVEL_THREE + }],*/ + rulesets: [{ + "id": [], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "search", true); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_semantics.ts" +/*!****************************************!*\ + !*** ./src/v4/rules/aria_semantics.ts ***! + \****************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_valid = exports.aria_role_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.aria_role_valid = { + id: "aria_role_valid", + context: "dom:*", + dependencies: ["aria_attribute_allowed"], + refactor: { + "aria_semantics_role": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_0": "aria_role_valid.html", + "Fail_1": "aria_role_valid.html", + "Fail_2": "aria_role_valid.html", + "group": "aria_role_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The ARIA role '{0}' is not valid for the element <{1}>", + "Fail_2": "The ARIA role '{0}' is not valid for the element <{1}> and may be ignored by the browser since the element is focusable", + "group": "ARIA roles must be valid for the element to which they are assigned" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var tagName = ruleContext.tagName.toLowerCase(); + // only chek element (1) and fragment nodes (11) + if (ruleContext.nodeType !== 1 /* Node.ELEMENT_NODE */) + return null; + //skip the rule + // the invalid role case: handled by aria_role_allowed. Ignore to avoid duplicated report + var undefinedRoles = AriaUtil_1.AriaUtil.getRolesUndefinedByAria(ruleContext); + if (undefinedRoles && undefinedRoles.length > 0) + return null; + var deprecatedRoles = AriaUtil_1.AriaUtil.getDeprecatedAriaRoles(ruleContext); + if (deprecatedRoles && deprecatedRoles.length > 0) + return null; + var deprecatedAttributes = AriaUtil_1.AriaUtil.getDeprecatedAriaAttributes(ruleContext); + if (deprecatedAttributes && deprecatedAttributes.length > 0) + return null; + // dependency check: if it's already failed, then skip + if (["td", "th", "tr"].includes(tagName)) { + var parentRole = CommonUtil_1.CommonUtil.isTableDescendant(contextHierarchies); + if (parentRole !== null && parentRole.length > 0) + return null; + } + var domRoles = AriaUtil_1.AriaUtil.getUserDefinedRoles(ruleContext); + if (!domRoles || domRoles.length === 0) + return null; + // check the 'generic' role first + if (domRoles.includes('generic')) + return (0, IRule_1.RuleFail)("Fail_1", ["generic", tagName]); + var invalidRoles = AriaUtil_1.AriaUtil.getInvalidRoles(ruleContext); + if (invalidRoles === null || invalidRoles.length === 0) + return (0, IRule_1.RulePass)("Pass_0", [domRoles.join(", "), tagName]); + if (invalidRoles.includes("presentation") || invalidRoles.includes("none") && CommonUtil_1.CommonUtil.isTabbable(ruleContext)) + return (0, IRule_1.RuleFail)("Fail_2", [invalidRoles.join(", "), tagName]); + if (invalidRoles.length > 0) + return (0, IRule_1.RuleFail)("Fail_1", [invalidRoles.join(", "), tagName]); + if (domRoles.length > 0) + return (0, IRule_1.RulePass)("Pass_0", [domRoles.join(", "), tagName]); + return null; + } +}; +// This rule is in the same file because there is a dependency that aria_role_valid runs first, +// and the info is passed by cache, but there isn't a dependency in the Fail_2 scenario, so regular +// dependency cannot be used +exports.aria_attribute_valid = { + id: "aria_attribute_valid", + context: "dom:*", + // The the ARIA role is completely invalid, skip this check + dependencies: ["aria_attribute_deprecated", "aria_role_valid"], + refactor: { + "aria_attribute_allowed": { + "Pass": "Pass", + "Fail_invalid_role_attr": "Fail_invalid_role_attr", + "Fail_invalid_implicit_role_attr": "Fail_invalid_implicit_role_attr" + } + }, + help: { + "en-US": { + "group": "aria_attribute_valid.html", + "Pass": "aria_attribute_valid.html", + "Fail_invalid_role_attr": "aria_attribute_valid.html", + "Fail_invalid_implicit_role_attr": "aria_attribute_valid.html" + } + }, + messages: { + "en-US": { + "group": "ARIA attributes should be valid for the element and ARIA role to which they are assigned", + "Pass": "ARIA attributes are valid for the element and ARIA role", + "Fail_invalid_role_attr": "The ARIA attributes \"{0}\" are not valid for the element <{1}> with ARIA role \"{2}\"", + "Fail_invalid_implicit_role_attr": "The ARIA attributes \"{0}\" are not valid for the element <{1}> with implicit ARIA role \"{2}\"" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["ARIA"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: ["5c01ea", { "46ca7f": { "Pass": "pass", "Fail_invalid_role_attr": "fail", "Fail_invalid_implicit_role_attr": "fail" } }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // only chek element (1) + if (ruleContext.nodeType !== 1 /* Node.ELEMENT_NODE */) + return null; + // ignore if no aria attribute + var ariaAttributes = AriaUtil_1.AriaUtil.getUserDefinedAriaAttributes(ruleContext); + if (ariaAttributes === null || ariaAttributes.length === 0) + return null; + var roles = AriaUtil_1.AriaUtil.getUserDefinedRoles(ruleContext); + var explicit = true; + if (roles && roles.length > 0) { + // the invalid role case: handled by Rpt_Aria_ValidRole. Ignore to avoid duplicated report + if (!AriaUtil_1.AriaUtil.areRolesDefined(roles)) + return null; + } + else { + //no explicit role defined + roles = AriaUtil_1.AriaUtil.getImplicitRole(ruleContext); + explicit = false; + } + var tagName = ruleContext.tagName.toLowerCase(); + var failedAttributes = AriaUtil_1.AriaUtil.getInvalidAriaAttributes(ruleContext); + if (!failedAttributes || failedAttributes.length === 0) + return (0, IRule_1.RulePass)("Pass", [ariaAttributes.join(", "), tagName, roles.join(", ")]); + if (roles.length > 0) { + if (explicit) + return (0, IRule_1.RuleFail)("Fail_invalid_role_attr", [failedAttributes.join(", "), tagName, roles.join(", ")]); + else + return (0, IRule_1.RuleFail)("Fail_invalid_implicit_role_attr", [failedAttributes.join(", "), tagName, roles.join(", ")]); + } + return (0, IRule_1.RuleFail)("Fail_invalid_role_attr", [failedAttributes.join(", "), tagName, "none"]); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_toolbar_label_unique.ts" +/*!***************************************************!*\ + !*** ./src/v4/rules/aria_toolbar_label_unique.ts ***! + \***************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_toolbar_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +exports.aria_toolbar_label_unique = { + id: "aria_toolbar_label_unique", + context: "aria:toolbar", + refactor: { + "Rpt_Aria_MultipleToolbarUniqueLabel": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_toolbar_label_unique.html", + "Fail_1": "aria_toolbar_label_unique.html", + "group": "aria_toolbar_label_unique.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Multiple elements with \"toolbar\" roles do not have unique labels", + "group": "Each element with \"toolbar\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Consider the Check Hidden Content setting that is set by the rules + // Also, consider Implicit role checking. + var landmarks = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "toolbar", true, true); + if (landmarks.length === 0 || landmarks.length === 1) { + return null; + } + var dupes = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "aria_toolbar_label_unique", null); + if (!dupes) { + dupes = AriaUtil_1.AriaUtil.findAriaLabelDupes(landmarks); + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "aria_toolbar_label_unique", dupes); + } + var myLabel = AriaUtil_1.AriaUtil.getAriaLabel(ruleContext); + var passed = myLabel !== "" && (!(myLabel in dupes) || dupes[myLabel] <= 1); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", [myLabel]); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_widget_labelled.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/aria_widget_labelled.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_widget_labelled = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var ARIAMapper_1 = __webpack_require__(/*! ../../v2/aria/ARIAMapper */ "./src/v2/aria/ARIAMapper.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +exports.aria_widget_labelled = { + id: "aria_widget_labelled", + context: "dom:*", + refactor: { + "Rpt_Aria_WidgetLabels_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "aria_widget_labelled.html", + "Pass_0": "aria_widget_labelled.html", + "Fail_1": "aria_widget_labelled.html" + } + }, + messages: { + "en-US": { + "group": "Interactive component must have a programmatically associated name", + "Pass_0": "Rule Passed", + "Fail_1": "Interactive component with ARIA role '{0}' does not have a programmatically associated name" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: "m6b1q3", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + /* removed the role check role= presentation and role=none since these 2 roles are not in the list of widget type roles */ + if ((ruleContext.hasAttribute("type") && + ruleContext.getAttribute("type") === "hidden") || + (AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, "combobox") && + !(AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "textbox") || + AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "searchbox")))) { + // we need to diagnose that a combobox input textbox has a label(github issue #1104) + return null; + } + var elemRole = ARIAMapper_1.ARIAMapper.nodeToRole(ruleContext); + var tagName = ruleContext.nodeName.toLowerCase(); + // Handled by input_label_exists + var skipRoles = [ + "button", + "checkbox", + "combobox", + "listbox", + "menuitemcheckbox", + "menuitemradio", + "radio", + "searchbox", + "slider", + "spinbutton", + "switch", + "textbox", + "progressbar", + "link", + ]; + if (skipRoles.includes(elemRole)) + return null; + if (tagName === "output" || + (tagName === "input" && + ruleContext.getAttribute("type") === "file")) { + } + if (!ruleContext.hasAttribute("role")) { + // Form/input elements are checked by G41, we skip them from this rule. Github issue 449 + var skipElements = [ + "input", + "textarea", + "select", + "button", + "datalist", + "optgroup", + "option", + "keygen", + "output", + "progress", + "meter", + ]; + if (skipElements.indexOf(ruleContext.nodeName.toLowerCase()) != + -1) { + return null; + } + } + // avoid diagnosing the popup list of a combobox. + var rolesToCheck = ["listbox", "tree", "grid", "dialog"]; + for (var j = 0; j < rolesToCheck.length; j++) { + if (AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, rolesToCheck[j])) { + var comboboxes = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "combobox", true, true); + for (var k = 0; k < comboboxes.length; k++) { + var combobox = comboboxes[k]; + var aria_owns = CommonUtil_1.CommonUtil.getElementAttribute(combobox, "aria-owns"); + if (aria_owns) { + var owns = CommonUtil_1.CommonUtil.normalizeSpacing(aria_owns.trim()).split(" "); + for (var i = 0; i < owns.length; i++) { + var owned = fragment_1.FragmentUtil.getById(ruleContext, owns[i]); + if (owned === ruleContext) { + return null; + } + } + } + } + } + } + var passed = true; + var prohibited = false; + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + //get attribute roles as well as implicit roles. + var roles = AriaUtil_1.AriaUtil.getRoles(ruleContext, true); + var numWidgetsTested = 0; + var interactiveRoleTypes = ["widget", "liveRegion", "window"]; + for (var i = 0, length_1 = roles.length; passed && i < length_1; ++i) { + var pattern = designPatterns[roles[i]]; + if (pattern && + pattern.nameRequired && + pattern.roleType && + interactiveRoleTypes.includes(pattern.roleType)) { + ++numWidgetsTested; + // All widgets may have an author supplied accessible name. + // Title is legal, but don't advertise its use in documentation. + // Encourage use of aria-label, aria-labelledby or html label element. + passed = + AriaUtil_1.AriaUtil.hasAriaLabel(ruleContext) || + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "title") || + CommonUtil_1.CommonUtil.getLabelForElementHidden(ruleContext, true); + if (!passed && + pattern.nameFrom && + pattern.nameFrom.indexOf("contents") >= 0) { + // See if widget's accessible name is supplied by element's inner text + // nameFrom: ["author", "contents"] + passed = CommonUtil_1.CommonUtil.hasInnerContentOrAlt(ruleContext); + } + if (!passed) { + // check if it has implicit label, like <label><input ....>abc </label> + passed = CommonUtil_1.CommonUtil.hasImplicitLabel(ruleContext); + } + if (!passed && + ruleContext.tagName.toLowerCase() === "img" && + !ruleContext.hasAttribute("role") && + ruleContext.hasAttribute("alt")) { + passed = + DOMUtil_1.DOMUtil.cleanWhitespace(ruleContext.getAttribute("alt")).trim().length > 0; + } + if (pattern.nameFrom.indexOf("prohibited") >= 0) { + prohibited = true; + } + } + } + if (numWidgetsTested === 0) { + return null; + } + else if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", [elemRole]); + } + else { + //TODO + // if (prohibited) { + // return RuleFail("Fail_2"); + // } else { + return (0, IRule_1.RulePass)("Pass_0"); + // } + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/asciiart_alt_exists.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/asciiart_alt_exists.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.asciiart_alt_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.asciiart_alt_exists = { + id: "asciiart_alt_exists", + context: "dom:pre, dom:listing, dom:xmp, dom:plaintext", + refactor: { + "RPT_Pre_ASCIIArt": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "asciiart_alt_exists.html", + "Potential_1": "asciiart_alt_exists.html", + "group": "asciiart_alt_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that ASCII art has a text alternative", + "group": "ASCII art must have a text alternative" + } + }, + /** + * Decision in planning 9/7/23 that this rule causes more reviews that we see actual problems in content, so turn these rules off + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": eRulePolicy.VIOLATION, + "toolkitLevel": eToolkitLevel.LEVEL_ONE + }], + */ + rulesets: [], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Fix for IDWB writers. Don't trigger if content is in a code element. The code element is searched for + // in various places because of the weird way various browsers render <code><pre></pre></code. Firefox, + // HtmlUnit and Chrome all render differently. Firefox: <code></code><pre></pre> HtmlUnit: </code><pre><code></code></pre> + // See unit test CodeElementAbovePreElement.html. Don't know how RPT renders, so cover all the bases. + if (ruleContext.nodeName.toLowerCase() == "pre") { + if ((ruleContext.previousSibling && ruleContext.previousSibling.nodeName.toLowerCase() == "code") || + ruleContext.getElementsByTagName("code").length > 0 || + CommonUtil_1.CommonUtil.getAncestor(ruleContext, "code")) { + return (0, IRule_1.RulePass)("Pass_0"); + } + } + var passed = true; + var txtValue = CommonUtil_1.CommonUtil.getInnerText(ruleContext); + var nonAlphaNumericNorSpaceCount = 0; + var alphNumSameCharacterCount = 0; + var lastCharacter = ""; + // Iterate through the text content + for (var idx = 0; passed && (idx < txtValue.length); ++idx) { + var chStr = txtValue.substr(idx, 1); + // Check if it is alphanumeric or punctuation + if (/[\w!@#$%&\*().,?\[\]{}<>=":\/\\-]/.test(chStr)) { + // Detect same character sequence + if (lastCharacter == chStr) { + alphNumSameCharacterCount = alphNumSameCharacterCount + 1; + ; + } + else { + alphNumSameCharacterCount = 0; + } + } + else if (/\s/.test(chStr)) { + alphNumSameCharacterCount = 0; + } + else { + nonAlphaNumericNorSpaceCount = nonAlphaNumericNorSpaceCount + 1; + alphNumSameCharacterCount = 0; + } + lastCharacter = chStr; + // Make the decision + if (nonAlphaNumericNorSpaceCount >= 5 || alphNumSameCharacterCount >= 4) { + passed = false; + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/blink_css_review.ts" +/*!******************************************!*\ + !*** ./src/v4/rules/blink_css_review.ts ***! + \******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.blink_css_review = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.blink_css_review = { + id: "blink_css_review", + context: "dom:style, dom:*[style]", + refactor: { + "RPT_Blink_CSSTrigger1": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "group": "blink_css_review.html", + "Pass_0": "blink_css_review.html", + "Potential_1": "blink_css_review.html" + } + }, + messages: { + "en-US": { + "group": "Do not use the \"blink\" value of the 'text-decoration' property for longer than five seconds", + "Pass_0": "Rule Passed", + "Potential_1": "Check the \"blink\" value of the CSS 'text-decoration' property is not used for more than than five seconds" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "2.2.2", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var textValue = CommonUtil_1.CommonUtil.getInnerText(ruleContext); + if (ruleContext.hasAttribute('style')) { + textValue = ruleContext.getAttribute('style'); + } + var passed = textValue.toLowerCase().indexOf("text-decoration:blink") == -1; + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/blink_elem_deprecated.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/blink_elem_deprecated.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.blink_elem_deprecated = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.blink_elem_deprecated = { + id: "blink_elem_deprecated", + context: "dom:blink", + refactor: { + "WCAG20_Blink_AlwaysTrigger": { + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "blink_elem_deprecated.html", + "Fail_1": "blink_elem_deprecated.html" + } + }, + messages: { + "en-US": { + "group": "Content that blinks persistently must not be used", + "Fail_1": "Content found that blinks persistently" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "2.2.2", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + // const ruleContext = context["dom"].node as Element; + return (0, IRule_1.RuleFail)("Fail_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/blockquote_cite_exists.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/blockquote_cite_exists.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.blockquote_cite_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.blockquote_cite_exists = { + id: "blockquote_cite_exists", + context: "dom:blockquote", + refactor: { + "RPT_Blockquote_HasCite": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "blockquote_cite_exists.html", + "Potential_1": "blockquote_cite_exists.html", + "group": "blockquote_cite_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that <blockquote> should have a 'cite' attribute and not be used for indentation only", + "group": "Use <blockquote> only for quotations, not indentation" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "cite"); + if (!passed) { + var citeElems = CommonUtil_1.CommonUtil.getDocElementsByTag(ruleContext, "cite"); + passed = citeElems != null && citeElems.length > 0; + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/canvas_content_described.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/canvas_content_described.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.canvas_content_described = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.canvas_content_described = { + id: "canvas_content_described", + context: "dom:canvas", + refactor: { + "HAAC_Canvas": { + "Pass_0": "Pass_0", + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Pass_0": "canvas_content_described.html", + "Manual_1": "canvas_content_described.html", + "group": "canvas_content_described.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Manual_1": "Verify accessibility of the <canvas> element", + "group": "The <canvas> element may not be accessible" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1", "2.1.1", "4.1.2"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = ruleContext.innerHTML.trim().length > 0; + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/caption_track_exists.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/caption_track_exists.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.caption_track_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.caption_track_exists = { + id: "caption_track_exists", + context: "dom:video", + refactor: { + "HAAC_Video_HasNoTrack": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "caption_track_exists.html", + "Potential_1": "caption_track_exists.html", + "group": "caption_track_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that captions are available for any meaningful audio or provide a caption track for the <video> element", + "group": "A <video> element must have a text alternative for any meaningful audio content" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.2.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = false; + // ignore decorative video if user uses aria-hidden + if (ruleContext.getAttribute("aria-hidden") === "true") { + return null; + } + var tracks = ruleContext.getElementsByTagName("track"); + for (var i = 0; i < tracks.length; ++i) { + passed = passed || tracks[i].getAttribute("kind") === 'captions'; + } + // checks for addition of dynamic tracks + if (ruleContext.textTracks && ruleContext.textTracks.length > 0) { + for (var i = 0; i < ruleContext.textTracks.length; i++) { + passed = passed || ruleContext.textTracks[i].kind === 'captions'; + } + } + if (passed) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RulePotential)("Potential_1"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/combobox_active_descendant.ts" +/*!****************************************************!*\ + !*** ./src/v4/rules/combobox_active_descendant.ts ***! + \****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.combobox_active_descendant = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.combobox_active_descendant = { + id: "combobox_active_descendant", + context: "aria:combobox", + dependencies: ["combobox_popup_reference"], + help: { + "en-US": { + "Pass": "combobox_active_descendant.html", + "Fail_missing": "combobox_active_descendant.html", + "Fail_not_in_popup": "combobox_active_descendant.html", + "Fail_active_role_invalid": "combobox_active_descendant.html", + "Fail_active_not_selected": "combobox_active_descendant.html", + "group": "combobox_active_descendant.html" + } + }, + messages: { + "en-US": { + "Pass": "'aria-activedescendant' is used appropriately for this combobox", + "Fail_missing": "The element referenced by 'aria-activedescendant' \"{0}\" does not exist", + "Fail_not_in_popup": "The element referenced by 'aria-activedescendant' \"{0}\" does not exist within the popup referenced by 'id' \"{1}\"", + "Fail_active_role_invalid": "The 'aria-activedescendant' \"{0}\" references an element with the roles \"{1}\", which does not have a valid ARIA role of 'option', 'gridcell', 'row', or 'treeitem'", + "Fail_active_not_selected": "The 'aria-activedescendant' \"{0}\" references an element that does not have 'aria-selected' set to true", + "group": "'aria-activedescendant' must be used to define focus within the combobox popup, except when using a dialog popup" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var cache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "combobox", {}); + if (!cache) + return null; + var cachedElem = cache[context["dom"].rolePath]; + if (!cachedElem) + return null; + var popupElement = cachedElem.popupElement, popupId = cachedElem.popupId; + // If this isn't defined, the combobox is probably collapsed. A reference error is + // detected in combobox_popup_reference + if (!popupElement) + return null; + // This rule only applies if the activedescendant is specified + var activeId = ruleContext.getAttribute("aria-activedescendant"); + if (!activeId || activeId.trim().length === 0) { + return null; + } + var activeElem = fragment_1.FragmentUtil.getById(ruleContext, activeId); + if (!activeElem) { + return (0, IRule_1.RuleFail)("Fail_missing", [activeId]); + } + var found = false; + // examine the children + if (popupElement) { + var nw = new DOMWalker_1.DOMWalker(popupElement); + while (!found && nw.nextNode() && nw.node != popupElement && nw.node != popupElement.nextSibling) { + if (nw.node.nodeType === 1 && VisUtil_1.VisUtil.isNodeVisible(nw.node)) { + found = nw.elem().getAttribute("id") === activeId; + } + } + } + var retVal = []; + if (!found) { + retVal.push((0, IRule_1.RulePass)("Fail_not_in_popup", [activeId, popupId])); + } + var activeRoles = AriaUtil_1.AriaUtil.getRoles(activeElem, true); + var validRoles = ["option", "gridcell", "row", "treeitem"].filter(function (validRole) { return activeRoles.includes(validRole); }); + if (validRoles.length === 0) { + retVal.push((0, IRule_1.RuleFail)("Fail_active_role_invalid", [activeId, activeRoles.join(",")])); + } + if (activeElem.getAttribute("aria-selected") !== "true") { + retVal.push((0, IRule_1.RuleFail)("Fail_active_not_selected", [activeId])); + } + if (retVal.length === 0) { + return (0, IRule_1.RulePass)("Pass"); + } + else { + return retVal; + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/combobox_autocomplete_valid.ts" +/*!*****************************************************!*\ + !*** ./src/v4/rules/combobox_autocomplete_valid.ts ***! + \*****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.combobox_autocomplete_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.combobox_autocomplete_valid = { + id: "combobox_autocomplete_valid", + context: "aria:combobox", + dependencies: ["combobox_popup_reference"], + refactor: { + "combobox_autocomplete": { + "Pass": "Pass", + "Fail_1": "Fail_1", + "Fail_inline": "Fail_inline" + } + }, + help: { + "en-US": { + "Pass": "combobox_autocomplete_valid.html", + "Fail_1": "combobox_autocomplete_valid.html", + "Fail_inline": "combobox_autocomplete_valid.html", + "group": "combobox_autocomplete_valid.html" + } + }, + messages: { + "en-US": { + "Pass": "The combobox does not use 'aria-autocomplete' value '\"inline\"' nor does it have 'aria-autocomplete' defined within the popup", + "Fail_1": "The combobox has the 'aria-autocomplete' attribute incorrectly set on an element within the popup referenced by \"{0}\"", + "Fail_inline": "The combobox does not support an 'aria-autocomplete' attribute value set to '\"inline\"' ", + "group": "A combobox that supports autocompletion behavior must have the 'aria-autocomplete' attribute only on its text input element with a valid value; a value of '\"inline\"' is not supported" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var cache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "combobox", {}); + if (!cache) + return null; + var cachedElem = cache[context["dom"].rolePath]; + if (!cachedElem) + return null; + var popupId = cachedElem.popupId, popupElement = cachedElem.popupElement; + var retVal = []; + if (ruleContext.getAttribute("aria-autocomplete") === "inline") { + retVal.push((0, IRule_1.RuleFail)("Fail_inline")); + } + var passed = true; + // examine the children + if (popupElement && VisUtil_1.VisUtil.isNodeVisible(popupElement)) { + // if popupElement itself has "aria-autocomplete" + passed = !popupElement.hasAttribute("aria-autocomplete"); + // if any child of popupElement has "aria-autocomplete" + if (passed && popupElement.children && popupElement.children.length > 0) { + var nw = new DOMWalker_1.DOMWalker(popupElement); + while (passed && nw.nextNode()) { + if (nw.node.nodeType === 1 && VisUtil_1.VisUtil.isNodeVisible(nw.node)) { + passed = !nw.elem().hasAttribute("aria-autocomplete"); + if (nw.bEndTag && nw.node === popupElement.lastElementChild) + break; + } + } + } + } + if (!passed) { + retVal.push((0, IRule_1.RuleFail)("Fail_1", [popupId])); + } + if (retVal.length > 0) { + return retVal; + } + else { + return (0, IRule_1.RulePass)("Pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/combobox_design_valid.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/combobox_design_valid.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.combobox_design_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +function patternDetect(elem) { + // check 'explicit' role combobox and that it is not <select>. + if (elem.tagName.toLowerCase() === "select" && elem.getAttribute("role") !== "combobox") { + return "implicit"; + } + else if (elem.nodeName.toLowerCase() === "input" + && (!elem.hasAttribute("type") || elem.getAttribute("type") === "text") + && elem.hasAttribute("aria-owns") && !elem.hasAttribute("aria-controls")) { + // Looks like this is an ARIA 1.0 pattern, which the ARIA 1.2 spec says to continue to allow + return "1.0"; + } + else if (elem.nodeName.toLowerCase() !== "input" + && elem.hasAttribute("aria-owns") && !elem.hasAttribute("aria-controls")) { + // Looks like this is an ARIA 1.1 pattern, which the ARIA 1.2 spec says is now invalid + return "1.1"; + } + // Assume they're trying to do the latest, 1.2 pattern + return "1.2"; +} +exports.combobox_design_valid = { + id: "combobox_design_valid", + context: "aria:combobox", + refactor: { + "combobox_version": { + "Pass_1.0": "Pass_1.0", + "Fail_1.1": "Fail_1.1", + "Pass_1.2": "Pass_1.2" + } + }, + help: { + "en-US": { + "Pass_1.0": "combobox_design_valid.html", + "Fail_1.1": "combobox_design_valid.html", + "Pass_1.2": "combobox_design_valid.html", + "group": "combobox_design_valid.html" + } + }, + messages: { + "en-US": { + "Pass_1.0": "The combobox design pattern is detected as ARIA 1.0, which is allowed by ARIA 1.2", + "Fail_1.1": "The combobox design pattern is detected as ARIA 1.1, which is not allowed by ARIA 1.2", + "Pass_1.2": "The combobox design pattern is detected as ARIA 1.2", + "group": "The combobox design pattern must be valid for ARIA 1.2" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) { + return null; + } + var pattern = patternDetect(ruleContext); + // We don't assess native select elements here + if (pattern === "implicit") { + return null; + } + var tagName = ruleContext.tagName.toLowerCase(); + var expanded = (AriaUtil_1.AriaUtil.getAriaAttribute(ruleContext, "aria-expanded") || "").trim().toLowerCase() === "true"; + var editable = tagName === "input" && (!ruleContext.hasAttribute("type") || ruleContext.getAttribute("type").toLowerCase() === "text"); + var key = context["dom"].rolePath; + if (key) { + var cache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "combobox", {}); + if (!cache) + return null; + cache[key] = { + "inputElement": editable ? ruleContext : null, + "pattern": pattern, + "expanded": expanded + }; + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "combobox", cache); + } + else { + // No xpath? + return null; + } + if (pattern === "1.0") { + return (0, IRule_1.RulePass)("Pass_1.0"); + } + else if (pattern === "1.1") { + return (0, IRule_1.RuleFail)("Fail_1.1"); + } + else if (pattern === "1.2") { + return (0, IRule_1.RulePass)("Pass_1.2"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/combobox_focusable_elements.ts" +/*!*****************************************************!*\ + !*** ./src/v4/rules/combobox_focusable_elements.ts ***! + \*****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.combobox_focusable_elements = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.combobox_focusable_elements = { + id: "combobox_focusable_elements", + context: "aria:combobox", + dependencies: ["combobox_popup_reference"], + help: { + "en-US": { + "Pass": "combobox_focusable_elements.html", + "Fail_not_tabbable": "combobox_focusable_elements.html", + "Fail_tabbable_child": "combobox_focusable_elements.html", + "group": "combobox_focusable_elements.html" + } + }, + messages: { + "en-US": { + "Pass": "DOM focus is allowed only on the combobox element as required", + "Fail_not_tabbable": "The combobox element does not allow DOM focus as required", + "Fail_tabbable_child": "The popup of the combobox has DOM focus or has 'aria-activedescendant' defined, which is not allowed", + "group": "Tabbable focus for the combobox must be allowed only on the text input, except when using a dialog popup" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var cache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "combobox", {}); + if (!cache) + return null; + var cachedElem = cache[context["dom"].rolePath]; + if (!cachedElem) + return null; + var popupElement = cachedElem.popupElement, expanded = cachedElem.expanded; + // If this isn't defined, the combobox is probably collapsed. A reference error is + // detected in combobox_popup_reference + if (!popupElement) + return null; + var popupRole = AriaUtil_1.AriaUtil.getRoles(popupElement, true)[0]; + var retVal = []; + if (!CommonUtil_1.CommonUtil.isTabbable(ruleContext)) { + retVal.push((0, IRule_1.RuleFail)("Fail_not_tabbable")); + } + // Only makes sense to check the popup when expanded + // this does not apply to dialogs, return pass since the main element was focusable above + if (expanded === false || popupRole === "dialog") { + return (0, IRule_1.RulePass)("Pass"); + } + var passed = true; + // examine the children + if (popupElement && VisUtil_1.VisUtil.isNodeVisible(popupElement)) { + // if popupElement itself has "aria-activedescendant" + passed = !CommonUtil_1.CommonUtil.isTabbable(popupElement) && !AriaUtil_1.AriaUtil.getAriaAttribute(popupElement, "aria-activedescendant"); + ; + // if any child of popupElement has "aria-autocomplete" + if (passed && popupElement.children && popupElement.children.length > 0) { + var nw = new DOMWalker_1.DOMWalker(popupElement); + while (passed && nw.nextNode()) { + if (nw.node.nodeType === 1 && VisUtil_1.VisUtil.isNodeVisible(nw.node)) { + passed = !CommonUtil_1.CommonUtil.isTabbable(nw.node) && + !AriaUtil_1.AriaUtil.getAriaAttribute(nw.node, "aria-activedescendant"); + if (nw.bEndTag && nw.node === popupElement.lastElementChild) + break; + } + } + } + } + if (!passed) { + retVal.push((0, IRule_1.RuleFail)("Fail_tabbable_child")); + } + if (retVal.length === 0) { + return (0, IRule_1.RulePass)("Pass"); + } + else { + return retVal; + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/combobox_haspopup_valid.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/combobox_haspopup_valid.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.combobox_haspopup_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +exports.combobox_haspopup_valid = { + id: "combobox_haspopup_valid", + context: "aria:combobox", + dependencies: ["combobox_popup_reference"], + refactor: { + "combobox_haspopup": { + "Pass": "Pass", + "Fail_popup_role_invalid": "Fail_popup_role_invalid", + "Fail_combobox_popup_role_mismatch": "Fail_combobox_popup_role_mismatch" + } + }, + help: { + "en-US": { + "Pass": "combobox_haspopup_valid.html", + "Fail_popup_role_invalid": "combobox_haspopup_valid.html", + "Fail_combobox_popup_role_mismatch": "combobox_haspopup_valid.html", + "group": "combobox_haspopup_valid.html" + } + }, + messages: { + "en-US": { + "Pass": "The 'aria-controls' (ARIA 1.2) or 'aria-owns' (ARIA 1.0) appropriately references a valid popup 'id' value", + "Fail_popup_role_invalid": "The 'role' value \"{0}\" of the popup element \"{1}\" should be one of \"listbox\", \"grid\", \"tree\" or \"dialog\"", + "Fail_combobox_popup_role_mismatch": "The value of the combobox 'aria-haspopup' attribute \"{0}\" does not match the 'role' value of the popup element \"{1}\"", + "group": "The combobox attribute 'aria-haspopup' value must be appropriate for the role of the element referenced by 'aria-controls' (ARIA 1.2) or 'aria-owns' (ARIA 1.0)" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var cache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "combobox", {}); + if (!cache) + return null; + var cacheKey = context["dom"].rolePath; + var cachedElem = cache[cacheKey]; + if (!cachedElem) + return null; + var popupElement = cachedElem.popupElement, popupId = cachedElem.popupId; + // If this isn't defined, the combobox is probably collapsed. A reference error is + // detected in combobox_popup_reference + if (!popupElement) + return null; + // Check that popup role is listbox, grid, tree, or dialog and that it matches the combobox + var popupRoles = AriaUtil_1.AriaUtil.getRoles(popupElement, true); + var validRoles = ["listbox", "grid", "tree", "dialog"].filter(function (validRole) { return popupRoles.includes(validRole); }); + if (validRoles.length === 0) { + return (0, IRule_1.RuleFail)("Fail_popup_role_invalid", [popupRoles.join(","), popupId]); + } + else { + var popupRole = validRoles[0]; + var haspopupVal = ruleContext.getAttribute("aria-haspopup") || "listbox"; + // Popup role must match aria-haspopup unless popupRole is listbox, then aria-haspopup should not be defined + if (haspopupVal !== popupRole) { + if (popupRole !== "listbox" || ruleContext.hasAttribute("aria-haspopup")) { + return (0, IRule_1.RuleFail)("Fail_combobox_popup_role_mismatch", [haspopupVal, popupRole]); + } + } + } + return (0, IRule_1.RulePass)("Pass"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/combobox_popup_reference.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/combobox_popup_reference.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.combobox_popup_reference = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.combobox_popup_reference = { + id: "combobox_popup_reference", + context: "aria:combobox", + dependencies: ["combobox_design_valid"], + help: { + "en-US": { + "group": "combobox_popup_reference.html", + "Pass_1.0_expanded": "combobox_popup_reference.html", + "Pass_1.0_collapsed": "combobox_popup_reference.html", + "Pass_1.2_expanded": "combobox_popup_reference.html", + "Pass_1.2_collapsed": "combobox_popup_reference.html", + "Fail_1.0_missing_owns": "combobox_popup_reference.html", + "Fail_1.2_missing_controls": "combobox_popup_reference.html", + "Fail_1.0_popup_reference_missing": "combobox_popup_reference.html", + "Fail_1.2_popup_reference_missing": "combobox_popup_reference.html", + "Fail_combobox_expanded_hidden": "combobox_popup_reference.html", + "Fail_combobox_collapsed_visible": "combobox_popup_reference.html" + } + }, + messages: { + "en-US": { + "group": "The 'aria-controls' (for ARIA 1.2) or the 'aria-owns' (for ARIA 1.0) attribute of the expanded combobox must reference a valid popup 'id' value", + "Pass_1.0_expanded": "The combobox popup referenced by 'aria-owns' (ARIA 1.0) exists and is visible", + "Pass_1.0_collapsed": "The combobox popup in its collapsed state does not reference any visible popup as required", + "Pass_1.2_expanded": "The combobox popup referenced by 'aria-controls' (ARIA 1.2) exists and is visible", + "Pass_1.2_collapsed": "The combobox popup in its collapsed state does not reference any visible popup as required", + "Fail_1.0_missing_owns": "The 'aria-owns' attribute of the expanded combobox is missing", + "Fail_1.2_missing_controls": "The 'aria-controls' attribute of the expanded combobox is missing", + "Fail_1.0_popup_reference_missing": "The 'aria-owns' attribute \"{0}\" of the expanded combobox does not reference a valid popup 'id' value", + "Fail_1.2_popup_reference_missing": "The 'aria-controls' attribute \"{0}\" of the expanded combobox does not reference a valid popup 'id' value", + "Fail_combobox_expanded_hidden": "The combobox 'aria-expanded' attribute is true, but the combobox popup is not visible", + "Fail_combobox_collapsed_visible": "The combobox 'aria-expanded' attribute is false, but the combobox popup is visible" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [{ + "4e8ab6": { + "Pass_1.0_expanded": "fail", + "Pass_1.0_collapsed": "fail", + "Pass_1.2_expanded": "pass", + "Pass_1.2_collapsed": "pass", + "Fail_1.0_missing_owns": "inapplicable", + "Fail_1.2_missing_controls": "fail", + "Fail_1.0_popup_reference_missing": "inapplicable", + "Fail_1.2_popup_reference_missing": "fail", + "Fail_combobox_expanded_hidden": "inapplicable", + "Fail_combobox_collapsed_visible": "inapplicable" + } + }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var cache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "combobox", {}); + if (!cache) + return null; + var cacheKey = context["dom"].rolePath; + var cachedElem = cache[cacheKey]; + if (!cachedElem) + return null; + var pattern = cachedElem.pattern, expanded = cachedElem.expanded; + var popupId; + var popupElement; + if (pattern === "1.0") { + if (!ruleContext.hasAttribute("aria-owns")) { + // If the combobox isn't expanded, this attribute isn't required + return !expanded ? null : (0, IRule_1.RuleFail)("Fail_1.0_missing_owns"); + } + popupId = ruleContext.getAttribute("aria-owns"); + popupElement = fragment_1.FragmentUtil.getById(ruleContext, popupId); + if (!popupElement) { + // If the combobox isn't expanded, this attribute isn't required + return !expanded ? null : (0, IRule_1.RuleFail)("Fail_1.0_popup_reference_missing", [popupId]); + } + } + else if (pattern === "1.2") { + if (!ruleContext.hasAttribute("aria-controls")) { + // If the combobox isn't expanded, this attribute isn't required + return !expanded ? null : (0, IRule_1.RuleFail)("Fail_1.2_missing_controls"); + } + popupId = ruleContext.getAttribute("aria-controls"); + popupElement = fragment_1.FragmentUtil.getById(ruleContext, popupId); + if (!popupElement) { + // If the combobox isn't expanded, this attribute isn't required + return !expanded ? null : (0, IRule_1.RuleFail)("Fail_1.2_popup_reference_missing", [popupId]); + } + } + else { + return null; + } + // We have an element, stick it in the cache and then check its role + cachedElem.popupId = popupId; + cachedElem.popupElement = popupElement; + if (expanded && !VisUtil_1.VisUtil.isNodeVisible(popupElement)) { + return (0, IRule_1.RuleFail)("Fail_combobox_expanded_hidden"); + } + else if (!expanded && VisUtil_1.VisUtil.isNodeVisible(popupElement)) { + return (0, IRule_1.RuleFail)("Fail_combobox_collapsed_visible"); + } + if (pattern === "1.0") { + if (expanded) { + return (0, IRule_1.RulePass)("Pass_1.0_expanded"); + } + else { + return (0, IRule_1.RulePass)("Pass_1.0_collapsed"); + } + } + else { + if (expanded) { + return (0, IRule_1.RulePass)("Pass_1.2_expanded"); + } + else { + return (0, IRule_1.RulePass)("Pass_1.2_collapsed"); + } + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/debug_paths.ts" +/*!*************************************!*\ + !*** ./src/v4/rules/debug_paths.ts ***! + \*************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.debug_paths = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.debug_paths = { + id: "debug_paths", + context: "dom:*", + help: { + "en-US": { + "group": "", + "Pass_0": "" + } + }, + messages: { + "en-US": { + "group": "", + "Pass_0": "" + } + }, + rulesets: [{ + id: ["DEBUG"], + num: "1", + level: IRule_1.eRulePolicy.INFORMATION, + toolkitLevel: IRule_1.eToolkitLevel.LEVEL_FOUR + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + ruleContext.setAttribute("domPath", context["dom"].rolePath); + ruleContext.setAttribute("ariaPath", context["aria"].rolePath); + return null; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/detector_tabbable.ts" +/*!*******************************************!*\ + !*** ./src/v4/rules/detector_tabbable.ts ***! + \*******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.detector_tabbable = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.detector_tabbable = { + id: "detector_tabbable", + context: "dom:*", + help: { + "en-US": { + "group": "", + "Pass_0": "" + } + }, + messages: { + "en-US": { + "group": "", + "Pass_0": "" + } + }, + rulesets: [{ + id: ["EXTENSIONS"], + num: "1", + level: IRule_2.eRulePolicy.INFORMATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_FOUR + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (!CommonUtil_1.CommonUtil.isTabbable(ruleContext)) { + return null; + } + var hierContext = contextHierarchies.aria[contextHierarchies.aria.length - 1]; + return (0, IRule_1.RulePass)("Pass_0", [], [{ + name: hierContext.attributes.name, + role: hierContext.role, + tabindex: parseInt(ruleContext.getAttribute("tabindex") || "0") + }]); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/dir_attribute_valid.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/dir_attribute_valid.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.dir_attribute_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.dir_attribute_valid = { + id: "dir_attribute_valid", + context: "dom:*[dir]", + refactor: { + "Valerie_Elem_DirValid": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "dir_attribute_valid.html", + "Fail_1": "dir_attribute_valid.html", + "group": "dir_attribute_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Invalid value used for the 'dir' attribute", + "group": "'dir' attribute value must be \"ltr\", \"rtl\", or \"auto\"" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var dirStr = ruleContext.getAttribute("dir").toLowerCase(); + var passed = dirStr == "ltr" || dirStr == "rtl" || dirStr == "auto"; + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/download_keyboard_controllable.ts" +/*!********************************************************!*\ + !*** ./src/v4/rules/download_keyboard_controllable.ts ***! + \********************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.download_keyboard_controllable = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.download_keyboard_controllable = { + id: "download_keyboard_controllable", + context: "dom:a[href],dom:area[href]", + refactor: { + "HAAC_Media_DocumentTrigger2": { + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Manual_1": "download_keyboard_controllable.html", + "group": "download_keyboard_controllable.html" + } + }, + messages: { + "en-US": { + "Manual_1": "Verify that the file download mechanism does not cause a keyboard trap", + "group": "File download mechanisms should be keyboard-operable and preserve page focus location" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.2"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var href = ruleContext.getAttribute("href"); + var ext = CommonUtil_1.CommonUtil.getFileExt(href); + var passed = ![".docx", ".doc", ".pdf", ".odt"].includes(ext); + if (passed) + return null; + if (!passed) + return (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/draggable_alternative_exists.ts" +/*!******************************************************!*\ + !*** ./src/v4/rules/draggable_alternative_exists.ts ***! + \******************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.draggable_alternative_exists = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.draggable_alternative_exists = { + id: "draggable_alternative_exists", + context: "dom:*[draggable]", + dependencies: [], + help: { + "en-US": { + "group": "draggable_alternative_exists.html", + // "pass_alternative": "draggable_alternative_exists.html", + "pass_undraggable": "draggable_alternative_exists.html", + "potential_alternative": "draggable_alternative_exists.html" + } + }, + messages: { + "en-US": { + "group": "A draggable element must have a \"single pointer\" alternative", + // "pass_alternative": "The draggable element \"{0}\" has a \"single pointer\" alternative", + "pass_undraggable": "The element \"{0}\" is not draggable", + "potential_alternative": "Ensure the draggable element \"{0}\" has a \"single pointer\" alternative" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_2"], + num: ["2.5.7"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLocaleLowerCase(); + //ignore certain elements + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["pre", "code", "script", "meta"]) !== null + || nodeName === "body" || nodeName === "html") + return null; + if (ruleContext.getAttribute("draggable") === 'true') + return (0, IRule_1.RulePotential)("potential_alternative", [nodeName]); + else if (ruleContext.getAttribute("draggable") === 'false') + return (0, IRule_1.RulePass)("pass_undraggable", [nodeName]); + else + return null; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/element_accesskey_labelled.ts" +/*!****************************************************!*\ + !*** ./src/v4/rules/element_accesskey_labelled.ts ***! + \****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_accesskey_labelled = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +exports.element_accesskey_labelled = { + id: "element_accesskey_labelled", + context: "dom:*[accesskey]", + refactor: { + "HAAC_Accesskey_NeedLabel": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "element_accesskey_labelled.html", + "Potential_1": "element_accesskey_labelled.html", + "group": "element_accesskey_labelled.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "The element with an assigned 'accesskey' attribute does not have an associated label", + "group": "An element with an assigned 'accesskey' attribute must have an associated label" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.3.2"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip if the element is tabbable, it's covered by other rules + if (CommonUtil_1.CommonUtil.isTabbable(ruleContext)) + return; + var roles = AriaUtil_1.AriaUtil.getRoles(ruleContext, true); + //skip the native element, mostly text elements + if (!roles || roles.length === 0) + return; + var patterns = ARIADefinitions_1.ARIADefinitions.designPatterns[roles[0]]; + if (!patterns || !patterns.nameFrom) + return; + // ignore if accessble name is required (checked in other rules) or prohibited (text element) + if (patterns.nameRequired || !patterns.nameFrom || patterns.nameFrom.includes("prohibited")) + return; + //special case: legend, as a child of a fieldset, delegate the accesskey command to the field of the fieldset which is covered by other rules + if (ruleContext.parentElement && ruleContext.parentElement.nodeName.toLowerCase() === 'fieldset') + return; + // check if accessible name exists + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + if (pair && pair.name && pair.name.trim().length > 0) + //if (ARIAMapper.computeName(ruleContext).trim().length > 0) + return (0, IRule_1.RulePass)("Pass_0"); + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/element_accesskey_unique.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/element_accesskey_unique.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_accesskey_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +exports.element_accesskey_unique = { + id: "element_accesskey_unique", + context: "dom:*[accesskey]", + refactor: { + "WCAG20_Elem_UniqueAccessKey": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "element_accesskey_unique.html", + "Fail_1": "element_accesskey_unique.html", + "group": "element_accesskey_unique.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "'accesskey' attribute value on the element is not unique", + "group": "'accesskey' attribute values on each element must be unique for the page" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["HTML"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var map = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "element_accesskey_unique", {}); + var key = ruleContext.getAttribute("accesskey"); + var passed = !(key in map); + map[key] = true; + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/element_attribute_deprecated.ts" +/*!******************************************************!*\ + !*** ./src/v4/rules/element_attribute_deprecated.ts ***! + \******************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_attribute_deprecated = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var DEPRECATED_ELEMENTS = [ + /** original */ + "applet", "basefont", "center", "dir", "font", "isindex", "listing", + "plaintext", "spacer", "s", "strike", "u", "xmp", + /** added from https://dev.w3.org/html5/pf-summary/obsolete.html */ + "acronym", "frame", "frameset", "noframes", "noembed", "big", "blink", "marquee", "tt", +]; +var DEPRECATED_HTML_GLOBAL_ATTRIBUTES = [ + /** original */ + "align", "link", "archive", "background", "bgcolor", "clear", "code", "color", + "compact", "face", "hspace", "language", "link", "noshade", "nowrap", "object", + "prompt", "start", "text", "version", "vlink", "vspace" +]; +var DEPRECATED_ELEMENT_ATTRIBUTES = { + /** original */ + "td": ["height", "width", "abbr", "axis", "char", "charoff", "height", "nowrap", "valign", "width", "align", "bgcolor"], + "th": ["height", "width", "abbr", "axis", "charoff", "height", "bgcolor", "align", "nowrap", "char", "valign", "width"], + "li": ["type", "value", "type"], + "ul": ["type", "compact"], + "pre": ["width"], + /** added from https://dev.w3.org/html5/pf-summary/obsolete.html */ + "meta": ["http-equiv"], + "a": ["charset", "coords", "shape", "rev", "scheme"], + "link": ["rev", "charset", "target"], + "img": ["name", "longdesc", "align", "hspace", "vspace", "border"], + "area": ["nohref"], + "head": ["profile"], + "html": ["version"], + "iframe": ["longdesc", "align", "frameborder", "marginheight", "marginwidth", "scrolling"], + "object": ["archive", "code", "codebase", "codetype", "declare", "standby", "align", "hspace", "vspace", "border"], + "param": ["type", "valuetype"], + "script": ["language"], + "body": ["alink", "background", "bgcolor", "link", "text", "vlink"], + "br": ["clear"], + "caption": ["align"], + "col": ["align", "char", "charoff", "valign", "width"], + "div": ["align"], + "dl": ["compact"], + "hr": ["align", "noshade", "size", "width", "align"], + "h2": ["align"], + "h3": ["align"], + "h4": ["align"], + "h5": ["align"], + "h6": ["align"], + "input": ["align", "usemap"], + "legend": ["align"], + "menu": ["compact"], + "ol": ["compact", "type", "type"], + "p": ["align"], + "table": ["bgcolor", "cellpadding", "cellspacing", "frame", "rules", "width", "align"], + "tbody": ["align", "char", "valign", "charoff"], + "tfoot": ["align", "charoff", "char", "valign"], + "thead": ["char", "charoff", "valign", "align"], + "tr": ["align", "bgcolor", "char", "charoff", "valign"] +}; +function arrayToContextStr(obj, type) { + var str = ""; + for (var _i = 0, obj_1 = obj; _i < obj_1.length; _i++) { + var prop = obj_1[_i]; + if (str !== '' && !str.endsWith(', ')) + str += ", "; + if (type === 'HTML_ELEMENTS') + str += 'dom:' + prop; + else if (type === 'HTML_ATTRIBUTES') + str += 'dom:*[' + prop + "]"; + } + return str; +} +function objToContextStr(obj, type) { + var str = ""; + for (var prop in obj) { + if (str !== '' && !str.endsWith(', ')) + str += ", "; + if (type === 'HTML_ELEMENT_ATTRIBUTES') { + for (var _i = 0, _a = obj[prop]; _i < _a.length; _i++) { + var item = _a[_i]; + if (str !== '' && !str.endsWith(", ")) + str += ", "; + str += 'dom:' + prop + '[' + item + ']'; + } + } + } + return str; +} +exports.element_attribute_deprecated = { + id: "element_attribute_deprecated", + context: "dom:applet, dom:basefont, dom:center, dom:dir, dom:font, dom:isindex, dom:listing, dom:menu, dom:plaintext, dom:spacer, dom:s, dom:strike, dom:u, dom:xmp, dom:acronym, dom:frame, dom:frameset, dom:noframes, dom:noembed, dom:big, dom:blink, dom:marquee, dom:ttNaNdom:*[align], dom:*[link], dom:*[archive], dom:*[background], dom:*[bgcolor], dom:*[clear], dom:*[code], dom:*[color], dom:*[compact], dom:*[face], dom:*[hspace], dom:*[language], dom:*[link], dom:*[noshade], dom:*[nowrap], dom:*[object], dom:*[prompt], dom:*[start], dom:*[text], dom:*[version], dom:*[vlink], dom:*[vspace]NaNdom:td[height], dom:td[width], dom:td[abbr], dom:td[axis], dom:td[char], dom:td[charoff], dom:td[height], dom:td[nowrap], dom:td[valign], dom:td[width], dom:td[align], dom:td[bgcolor], dom:th[height], dom:th[width], dom:th[abbr], dom:th[axis], dom:th[charoff], dom:th[height], dom:th[bgcolor], dom:th[align], dom:th[nowrap], dom:th[char], dom:th[valign], dom:th[width], dom:li[type], dom:li[value], dom:li[type], dom:ul[type], dom:ul[compact], dom:pre[width], dom:meta[http-equiv], dom:a[charset], dom:a[coords], dom:a[shape], dom:a[rev], dom:a[scheme], dom:link[rev], dom:link[charset], dom:link[target], dom:img[name], dom:img[longdesc], dom:img[align], dom:img[hspace], dom:img[vspace], dom:img[border], dom:area[nohref], dom:head[profile], dom:html[version], dom:iframe[longdesc], dom:iframe[align], dom:iframe[frameborder], dom:iframe[marginheight], dom:iframe[marginwidth], dom:iframe[scrolling], dom:object[archive], dom:object[code], dom:object[codebase], dom:object[codetype], dom:object[declare], dom:object[standby], dom:object[align], dom:object[hspace], dom:object[vspace], dom:object[border], dom:param[type], dom:param[valuetype], dom:script[language], dom:body[alink], dom:body[background], dom:body[bgcolor], dom:body[link], dom:body[text], dom:body[vlink], dom:br[clear], dom:caption[align], dom:col[align], dom:col[char], dom:col[charoff], dom:col[valign], dom:col[width], dom:div[align], dom:dl[compact], dom:hr[align], dom:hr[noshade], dom:hr[size], dom:hr[width], dom:hr[align], dom:h2[align], dom:h3[align], dom:h4[align], dom:h5[align], dom:h6[align], dom:input[align], dom:input[usemap], dom:legend[align], dom:menu[compact], dom:ol[compact], dom:ol[type], dom:ol[type], dom:p[align], dom:table[bgcolor], dom:table[cellpadding], dom:table[cellspacing], dom:table[frame], dom:table[rules], dom:table[width], dom:table[align], dom:tbody[align], dom:tbody[char], dom:tbody[valign], dom:tbody[charoff], dom:tfoot[align], dom:tfoot[charoff], dom:tfoot[char], dom:tfoot[valign], dom:thead[char], dom:thead[charoff], dom:thead[valign], dom:thead[align], dom:tr[align], dom:tr[bgcolor], dom:tr[char], dom:tr[charoff], dom:tr[valign]", + help: { + "en-US": { + "pass": "element_attribute_deprecated.html", + "fail_elem": "element_attribute_deprecated.html", + "fail_attr": "element_attribute_deprecated.html", + "fail_elem_attr": "element_attribute_deprecated.html", + "group": "element_attribute_deprecated.html" + } + }, + messages: { + "en-US": { + "pass": "Rule Passed", + "fail_elem": "The <{0}> element is deprecated in HTML 5", + "fail_attr": "The HTML attribute(s) \"{0}\" is deprecated in HTML 5", + "fail_elem_attr": "The HTML attribute(s) \"{0}\" is deprecated for the <{1}> element in HTML 5", + "group": "Avoid use of obsolete features if possible" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["HTML"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // HTMLUnit auto adds a tbody[align=left] to tables if tbody is missing! + if (ruleContext.nodeName.toLowerCase() === "tbody" && ruleContext.hasAttribute("align")) { + return (0, IRule_1.RulePass)("pass"); + } + if (ruleContext.nodeName.includes("-")) { + // This is a webcomponent element, HTML doesn't define what's deprecated + return null; + } + var nodeName = ruleContext.nodeName.toLowerCase(); + var ret = []; + // check if it's a deprecated element + if (DEPRECATED_ELEMENTS.includes(nodeName)) { + return (0, IRule_1.RuleFail)("fail_elem", [nodeName]); + } + // check if it's a deprecated HTML global attribute + var attrs = ruleContext.getAttributeNames(); + var violations = ''; + for (var _i = 0, attrs_1 = attrs; _i < attrs_1.length; _i++) { + var attr = attrs_1[_i]; + if (DEPRECATED_HTML_GLOBAL_ATTRIBUTES.includes(attr)) { + if (violations !== '') + violations += ', '; + violations += attr; + } + } + if (violations !== '') { + return (0, IRule_1.RuleFail)("fail_attr", [violations]); + } + // check if it's a deprecated HTML element & attribute + violations = ''; + if (nodeName in DEPRECATED_ELEMENT_ATTRIBUTES) { + for (var _a = 0, attrs_2 = attrs; _a < attrs_2.length; _a++) { + var attr = attrs_2[_a]; + if (DEPRECATED_ELEMENT_ATTRIBUTES[nodeName] && DEPRECATED_ELEMENT_ATTRIBUTES[nodeName].includes(attr)) { + if (violations !== '') + violations += ', '; + violations += attr; + } + } + if (violations !== '') { + return (0, IRule_1.RuleFail)("fail_elem_attr", [violations, nodeName]); + } + } + return (0, IRule_1.RulePass)("pass"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/element_id_unique.ts" +/*!*******************************************!*\ + !*** ./src/v4/rules/element_id_unique.ts ***! + \*******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_id_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +exports.element_id_unique = { + id: "element_id_unique", + context: "dom:*[id]", + refactor: { + "RPT_Elem_UniqueId": { + "Pass_0": "pass", + "Fail_1": "potential_empty", + "Fail_2": "potential_in_use" + } + }, + help: { + "en-US": { + "group": "element_id_unique.html", + "pass": "element_id_unique.html", + "potential_empty": "element_id_unique.html", + "potential_in_use": "element_id_unique.html" + } + }, + messages: { + "en-US": { + "group": "Element 'id' attribute values must be unique within a document", + "pass": "Rule Passed", + "potential_empty": "The <{0}> element has the id \"{1}\" that is empty", + "potential_in_use": "The <{0}> element has the id \"{1}\" that is already in use" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["HTML"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [{ + "3ea0c8": { + "pass": "pass", + "potential_empty": "pass", + "potential_in_use": "fail" + } + }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var id = ruleContext.getAttribute("id"); + // In the case that id is empty we should trigger a violation right away with out checking + // for uniqueness. + if (id === "") { + //return new ValidationResult(false, [ruleContext], '', '', [ruleContext.nodeName.toLowerCase(), id]); + return (0, IRule_1.RulePotential)("potential_empty", [ruleContext.nodeName.toLowerCase(), id]); + } + var element = fragment_1.FragmentUtil.getById(ruleContext, id); + var passed = element === ruleContext; + //return new ValidationResult(passed, [ruleContext], '', '', passed == true ? [] : [ruleContext.nodeName.toLowerCase(), id]); + if (!passed) { + return (0, IRule_1.RulePotential)("potential_in_use", [ruleContext.nodeName.toLowerCase(), id]); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/element_lang_valid.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/element_lang_valid.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_lang_valid = exports.html_lang_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var lang_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/lang */ "./src/v2/checker/accessibility/util/lang.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var validateLang = function (context) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (ruleContext.hasAttribute("lang")) { + if (nodeName !== "html" && ruleContext.getAttribute("lang") === "") { + // It's okay to have a lang="" if not on html + } + else { + var langStr = ruleContext.getAttribute("lang"); + if (!lang_1.LangUtil.validPrimaryLang(langStr)) { + return 1; + } + if (!lang_1.LangUtil.isBcp47(langStr)) { + return 2; + } + } + } + if (ruleContext.hasAttribute("xml:lang")) { + if (nodeName !== "html" && ruleContext.getAttribute("xml:lang") === "") { + // It's okay to have a lang="" if not on html + } + else { + var langStr = ruleContext.getAttribute("xml:lang"); + if (!lang_1.LangUtil.validPrimaryLang(langStr)) { + return 3; + } + if (!lang_1.LangUtil.isBcp47(langStr)) { + return 4; + } + } + } + return 0; +}; +exports.html_lang_valid = { + id: "html_lang_valid", + context: "dom:html[lang], dom:html[xml:lang]", + help: { + "en-US": { + "Pass_0": "html_lang_valid.html", + "Fail_1": "html_lang_valid.html", + "Fail_2": "html_lang_valid.html", + "Fail_3": "html_lang_valid.html", + "Fail_4": "html_lang_valid.html", + "group": "html_lang_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Lang has a valid primary lang and conforms to BCP 47", + "Fail_1": "Specified 'lang' attribute does not include a valid primary language", + "Fail_2": "Specified 'lang' attribute does not conform to BCP 47", + "Fail_3": "Specified 'xml:lang' attribute does not include a valid primary language", + "Fail_4": "Specified 'xml:lang' attribute does not conform to BCP 47", + "group": "The default human language of the page must be valid and specified in accordance with BCP 47" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [{ + "b5c3f8": { + "Pass_0": "pass", + "Fail_1": "fail", + "Fail_2": "inapplicable", + "Fail_3": "inapplicable", + "Fail_4": "inapplicable" + }, + "bf051a": { + "Pass_0": "pass", + "Fail_1": "fail", + "Fail_2": "pass", + "Fail_3": "fail", + "Fail_4": "inapplicable" + }, + // TODO: ACT: Mismatch because they don't check the html element in the same rule + // "de46e4": { + // "Pass_0": "pass", + // "Fail_1": "fail", + // "Fail_2": "pass", + // "Fail_3": "inapplicable", + // "Fail_4": "inapplicable" + // } + }], + run: function (context, options, contextHierarchies) { + var reasonCode = validateLang(context); + // This is done here instead of in validateLang so that the genHelp code will pick it up + var retArr = [ + (0, IRule_1.RulePass)("Pass_0"), + (0, IRule_1.RuleFail)("Fail_1"), + (0, IRule_1.RuleFail)("Fail_2"), + (0, IRule_1.RuleFail)("Fail_3"), + (0, IRule_1.RuleFail)("Fail_4") + ]; + return retArr[reasonCode]; + } +}; +exports.element_lang_valid = { + id: "element_lang_valid", + context: "dom:*[lang], dom:*[xml:lang]", + help: { + "en-US": { + "Pass_0": "element_lang_valid.html", + "Fail_1": "element_lang_valid.html", + "Fail_2": "element_lang_valid.html", + "Fail_3": "element_lang_valid.html", + "Fail_4": "element_lang_valid.html", + "group": "element_lang_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Lang has a valid primary lang and conforms to BCP 47", + "Fail_1": "Specified 'lang' attribute does not include a valid primary language", + "Fail_2": "Specified 'lang' attribute does not conform to BCP 47", + "Fail_3": "Specified 'xml:lang' attribute does not include a valid primary language", + "Fail_4": "Specified 'xml:lang' attribute does not conform to BCP 47", + "group": "The change in language of specific content must be valid and specified in accordance with BCP 47" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [{ + // "b5c3f8": { + // "Pass_0": "pass", + // "Fail_1": "fail", + // "Fail_2": "inapplicable", + // "Fail_3": "inapplicable", + // "Fail_4": "inapplicable" + // }, + // "bf051a": { + // "Pass_0": "pass", + // "Fail_1": "fail", + // "Fail_2": "pass", + // "Fail_3": "fail", + // "Fail_4": "inapplicable" + // }, + // TODO: ACT: Mismatch because they don't check the html element in the same rule + "de46e4": { + "Pass_0": "pass", + "Fail_1": "fail", + "Fail_2": "pass", + "Fail_3": "inapplicable", + "Fail_4": "inapplicable" + } + }], + run: function (context, options, contextHierarchies) { + // If it's the HTML node, that's handled by html_lang_valid + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (nodeName === "html") + return null; + var reasonCode = validateLang(context); + // This is done here instead of in validateLang so that the genHelp code will pick it up + var retArr = [ + (0, IRule_1.RulePass)("Pass_0"), + (0, IRule_1.RuleFail)("Fail_1"), + (0, IRule_1.RuleFail)("Fail_2"), + (0, IRule_1.RuleFail)("Fail_3"), + (0, IRule_1.RuleFail)("Fail_4") + ]; + var retVal = retArr[reasonCode]; + if (retVal.value[1] !== IRule_1.eRuleConfidence.PASS) { + // Ensure that there's actually content of this element - skip subtrees that have other lang attributes + var hasContent = false; + if (ruleContext.firstChild !== null) { + var nw = new DOMWalker_1.DOMWalker(ruleContext, false, ruleContext, true); + while (!hasContent && nw.nextNode()) { + // Skip hidden + if (nw.node.nodeType === 1) { + var element = nw.node; + if (!VisUtil_1.VisUtil.isNodeVisible(element) || element.hasAttribute("lang")) { + nw.bEndTag = true; + } + else { + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(element); + hasContent = hasContent + || element.nodeName.toLowerCase() === "img" && (pair && pair.name && pair.name.trim().length > 0) /**ARIAMapper.computeName(element).trim().length > 0*/; + } + } + else { + hasContent = hasContent + || nw.node.nodeType === 3 && nw.node.nodeValue.trim().length > 0; + } + } + } + if (!hasContent) + return null; + } + return retVal; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/element_mouseevent_keyboard.ts" +/*!*****************************************************!*\ + !*** ./src/v4/rules/element_mouseevent_keyboard.ts ***! + \*****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_mouseevent_keyboard = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.element_mouseevent_keyboard = { + id: "element_mouseevent_keyboard", + context: "dom:*[ondblclick], dom:*[onmousemove], dom:*[onmousedown], dom:*[onmouseup], dom:*[onmouseover], dom:*[onmouseout], dom:*[onclick]", + refactor: { + "RPT_Elem_EventMouseAndKey": { + "Pass_0": "Pass_0", + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Pass_0": "element_mouseevent_keyboard.html", + "Manual_1": "element_mouseevent_keyboard.html", + "group": "element_mouseevent_keyboard.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Manual_1": "Confirm the <{0}> element with mouse event handler(s) '{1}' has a corresponding keyboard handler(s)", + "group": "All interactive content with mouse event handlers must have equivalent keyboard access" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + var passed = ruleContext.hasAttribute("href") || + (!ruleContext.hasAttribute("ondblclick") && + !ruleContext.hasAttribute("onmousemove") && + (!ruleContext.hasAttribute("onmousedown") || ruleContext.hasAttribute("onkeydown")) && + (!ruleContext.hasAttribute("onmouseup") || ruleContext.hasAttribute("onkeyup")) && + (!ruleContext.hasAttribute("onmouseover") || ruleContext.hasAttribute("onfocus")) && + (!ruleContext.hasAttribute("onmouseout") || ruleContext.hasAttribute("onblur")) && + (!ruleContext.hasAttribute("onclick") || ruleContext.hasAttribute("onkeypress") || + nodeName == "a" || nodeName == "button")); + var failedMouseEvents = new Array(); + if (!passed) { + //store and display event name and node name in the tokens + if (ruleContext.hasAttribute("ondblclick")) { + failedMouseEvents.push("ondblclick"); + } + if (ruleContext.hasAttribute("onmousemove")) { + failedMouseEvents.push("onmousemove"); + } + if (ruleContext.hasAttribute("onmousedown") && !ruleContext.hasAttribute("onkeydown")) { + failedMouseEvents.push("onmousedown"); + } + if (ruleContext.hasAttribute("onmouseup") && !ruleContext.hasAttribute("onkeyup")) { + failedMouseEvents.push("onmouseup"); + } + if (ruleContext.hasAttribute("onmouseover") && !ruleContext.hasAttribute("onfocus")) { + failedMouseEvents.push("onmouseover"); + } + if (ruleContext.hasAttribute("onmouseout") && !ruleContext.hasAttribute("onblur")) { + failedMouseEvents.push("onmouseout"); + } + if (ruleContext.hasAttribute("onclick") && !ruleContext.hasAttribute("onkeypress")) { + if (!(nodeName == "a" || nodeName == "button")) + failedMouseEvents.push("onclick"); + } + } + return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RuleManual)("Manual_1", [nodeName, failedMouseEvents.join(", ")]); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/element_orientation_unlocked.ts" +/*!******************************************************!*\ + !*** ./src/v4/rules/element_orientation_unlocked.ts ***! + \******************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_orientation_unlocked = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CSSUtil_1 = __webpack_require__(/*! ../util/CSSUtil */ "./src/v4/util/CSSUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.element_orientation_unlocked = { + id: "element_orientation_unlocked", + context: "dom:*", + help: { + "en-US": { + "pass": "element_orientation_unlocked.html", + "fail_locked": "element_orientation_unlocked.html", + "group": "element_orientation_unlocked.html" + } + }, + messages: { + "en-US": { + "pass": "The element is not restricted to either landscape or portrait orientation using CSS transform property", + "fail_locked": "The element <{0}> is restricted to either landscape or portrait orientation using CSS transform property", + "group": "Elements should not be restricted to either landscape or portrait orientation using CSS transform property" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.4"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: ['b33eff'], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip invisible element + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext)) + return null; + //skip elements + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["script", "meta", "title"])) + return null; + var nodeName = ruleContext.nodeName.toLowerCase(); + // cache the orientation result for all the elements in the page + var doc = fragment_1.FragmentUtil.getOwnerFragment(ruleContext); + var orientationTransforms = CacheUtil_1.CacheUtil.getCache(doc, "RPTUtil_MEDIA_ORIENTATION_TRANSFROM", null); + if (!orientationTransforms) { + orientationTransforms = CSSUtil_1.CSSUtil.getMediaOrientationTransform(doc); + CacheUtil_1.CacheUtil.setCache(doc, "RPTUtil_MEDIA_ORIENTATION_TRANSFROM", orientationTransforms); + } + // find if the element matches orientation selector(s) + var media_transforms = []; + Object.keys(orientationTransforms).forEach(function (key) { + Object.keys(orientationTransforms[key]).forEach(function (tag) { + if (Object.keys(orientationTransforms[key][tag]).length > 0 && CSSUtil_1.CSSUtil.selectorMatchesElem(ruleContext, tag)) { + if (orientationTransforms[key][tag].transform) + media_transforms.push(orientationTransforms[key][tag].transform); + else + media_transforms.push(orientationTransforms[key][tag]); + } + }); + }); + // no match, the element is not in media orientation transform + if (media_transforms.length === 0) + return null; + var ret = []; + var _loop_1 = function (i) { + var media_transform = media_transforms[i]; + if (typeof media_transform === 'object') + for (var key in media_transform) + media_transform = key + "(" + media_transform[key] + ")"; + var containsRotation = false; + ['rotate', 'rotate3d', 'rotateZ', 'matrix', 'matrix3d'].forEach(function (rotation) { + if (media_transform.includes(rotation)) + containsRotation = true; + }); + // no rotation transform, skip + if (!containsRotation) + return "continue"; + var degree = CSSUtil_1.CSSUtil.getRotationDegree(media_transform); + // no or 360n degree rotation + if (degree === 0) { + ret.push((0, IRule_1.RulePass)("pass")); + return "continue"; + } + /** + * calculate the original page rotation transformation, example + * html { transform: rotate(2.5deg); } + */ + var definedStyle = CSSUtil_1.CSSUtil.getDefinedStyles(ruleContext, ["transform"]); + /** + * compensate the media orientation with the page orientation + */ + if (definedStyle['transform']) { + var page_degree = CSSUtil_1.CSSUtil.getRotationDegree(definedStyle['transform']); + // rotate is additive + degree += page_degree; + } + // When degree is 1 turn (360 degree), it is not considered an orientation lock + // allow 1 degree floating range for the right angle + if (Math.abs(degree - 360) % 360 > 1) + ret.push((0, IRule_1.RuleFail)("fail_locked", [nodeName])); + else + ret.push((0, IRule_1.RulePass)("pass")); + }; + for (var i = 0; i < media_transforms.length; i++) { + _loop_1(i); + } + if (ret.length > 0) + return ret; + return null; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/element_scrollable_tabbable.ts" +/*!*****************************************************!*\ + !*** ./src/v4/rules/element_scrollable_tabbable.ts ***! + \*****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_scrollable_tabbable = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +exports.element_scrollable_tabbable = { + id: "element_scrollable_tabbable", + context: "dom:*", + dependencies: [], + help: { + "en-US": { + "group": "element_scrollable_tabbable.html", + "pass_tabbable": "element_scrollable_tabbable.html", + "pass_interactive": "element_scrollable_tabbable.html", + "fail_scrollable": "element_scrollable_tabbable.html" + } + }, + messages: { + "en-US": { + "group": "Scrollable elements should be tabbable or contain tabbable content", + "pass_tabbable": "The scrollable element is tabbable", + "pass_interactive": "The scrollable element has tabbable content", + "fail_scrollable": "The scrollable element <{0}> with non-interactive content is not tabbable" + } + }, + /** + * deprecated on 6/10/2025 due to Browser support for auto-focus of a scrollable element + * rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + num: ["2.1.1"], + level: eRulePolicy.VIOLATION, + toolkitLevel: eToolkitLevel.LEVEL_ONE + }],*/ + rulesets: [], + act: ["0ssw9k"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip elements + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["iframe", "svg", "script", "meta", "style"])) + return null; + //skip if no visible content + if (!CommonUtil_1.CommonUtil.hasInnerContent(ruleContext)) + return null; + // ignore if the element's navigation is controlled or owned by another element + if (AriaUtil_1.AriaUtil.isNavigationOwnedOrControlled(ruleContext)) + return null; + // ignore if the element is not scrollable or content withouting needing a scroll + if (!VisUtil_1.VisUtil.isElementScrollable(ruleContext)) + return null; + // pass if element is tabbable + if (CommonUtil_1.CommonUtil.isTabbable(ruleContext)) + return (0, IRule_1.RulePass)("pass_tabbable"); + // check if element content is tabbable + var count = CommonUtil_1.CommonUtil.getTabbableChildren(ruleContext); + if (count > 0) + return (0, IRule_1.RulePass)("pass_interactive"); + // ignore in Firefox if no tabindex at all (not tested in embedded or any simulator) + if (!ruleContext.hasAttribute("tabindex") && navigator.userAgent.indexOf("Firefox") > -1) + return null; + return (0, IRule_1.RuleFail)("fail_scrollable", [ruleContext.nodeName.toLowerCase()]); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/element_tabbable_role_valid.ts" +/*!*****************************************************!*\ + !*** ./src/v4/rules/element_tabbable_role_valid.ts ***! + \*****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_tabbable_role_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.element_tabbable_role_valid = { + id: "element_tabbable_role_valid", + context: "dom:*", + help: { + "en-US": { + "pass": "element_tabbable_role_valid.html", + "fail_invalid_role": "element_tabbable_role_valid.html", + "fail_no_valid_role": "element_tabbable_role_valid.html", + "group": "element_tabbable_role_valid.html" + } + }, + messages: { + "en-US": { + "pass": "The tabbable element has a widget role", + "fail_invalid_role": "The tabbable element's role '{0}' is not a widget role", + "fail_no_valid_role": "The tabbable element does not have a valid widget role", + "group": "A tabbable element must have a valid widget role" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }, + { + "id": ["WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext) || VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLowerCase(); + // if the element is tabbable by default with or without tabindex, let the other rules (such as widget_tabbable_single) to handle it + if (nodeName in CommonUtil_1.CommonUtil.tabTagMap) { + var value = CommonUtil_1.CommonUtil.tabTagMap[nodeName]; + if (typeof (value) === "function") { + value = value(ruleContext); + } + if (value) + return null; + } + // handle the case: no tabindex or tabindex < 0 + if (!ruleContext.hasAttribute("tabindex") || parseInt(ruleContext.getAttribute("tabindex")) < 0) + return null; + // ignore if the element's navigation is controlled by another element, such as combobox + if (AriaUtil_1.AriaUtil.isNavigationOwnedOrControlled(ruleContext)) + return null; + // ignore if the element is scrollable + if (VisUtil_1.VisUtil.isElementScrollable(ruleContext)) + return null; + // elements whose roles allow no descendants that are interactive or with a tabindex >= 0 + // this case should be handled in widget_tabbable_single and aria_child_tabbable + var roles_no_interactive_child = ["button", "checkbox", "img", "link", "menuitem", "menuitemcheckbox", "menuitemradio", + "option", "radio", "switch", "tab"]; + var parent = DOMWalker_1.DOMWalker.parentNode(ruleContext); + var parent_role = AriaUtil_1.AriaUtil.getResolvedRole(parent); + // ignore if the parent role is in roles_no_interactive_child + if (roles_no_interactive_child.includes(parent_role)) + return null; + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + if (!role) + return (0, IRule_1.RuleFail)("fail_no_valid_role"); + // ignore 'application' role that contains one or more focusable elements that do not follow a standard interaction pattern supported by a widget role:https://www.w3.org/TR/2023/PR-WAI-ARIA-1.2-20230328/#application + if (role === "application") + return null; + // handle the case: tabindex >= 0 to examine whether a widget role is setup or not + // pass if one of the roles is a widget type + // Row is weird. It's structure, but can also be widget + // Focusable separators are widgets + if (role === "row" || role === "separator" || ARIADefinitions_1.ARIADefinitions.designPatterns[role].roleType === 'widget') { + return (0, IRule_1.RulePass)("pass"); + } + return (0, IRule_1.RuleFail)("fail_invalid_role", [role]); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/element_tabbable_unobscured.ts" +/*!*****************************************************!*\ + !*** ./src/v4/rules/element_tabbable_unobscured.ts ***! + \*****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_tabbable_unobscured = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var DOMMapper_1 = __webpack_require__(/*! ../../v2/dom/DOMMapper */ "./src/v2/dom/DOMMapper.ts"); +var ColorUtil_1 = __webpack_require__(/*! ../util/ColorUtil */ "./src/v4/util/ColorUtil.ts"); +exports.element_tabbable_unobscured = { + id: "element_tabbable_unobscured", + context: "dom:*", + dependencies: [], + help: { + "en-US": { + "group": "element_tabbable_unobscured.html", + "pass": "element_tabbable_unobscured.html", + "potential_obscured": "element_tabbable_unobscured.html" + } + }, + messages: { + "en-US": { + "group": "When an element receives focus, it is not entirely covered by other content", + "pass": "The element is not entirely covered by other content", + "potential_obscured": "Confirm that when the element receives focus, it is not covered or, if covered by user action, can be uncovered without moving focus" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_2"], + num: ["2.4.11"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Early exit: check visibility and tabbability first + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || !CommonUtil_1.CommonUtil.isTabbable(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLocaleLowerCase(); + // Early exit: ignore certain elements + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["pre", "code", "script", "meta"]) !== null + || nodeName === "body" || nodeName === "html") + return null; + var doc = ruleContext.ownerDocument; + if (!doc) + return null; + var win = doc.defaultView; + if (!win) + return null; + // Reuse single DOMMapper instance + var mapper = new DOMMapper_1.DOMMapper(); + var bounds = mapper.getUnadjustedBounds(ruleContext); + // Early exit: bounds not available or element has no dimensions + if (!bounds || bounds.height === 0 || bounds.width === 0) + return null; + var cStyle = win.getComputedStyle(ruleContext); + if (!cStyle) + return null; + // Parse z-index once and cache + var zindex = parseInt(cStyle.zIndex === 'auto' || !cStyle.zIndex ? '0' : cStyle.zIndex); + // More specific selector to reduce iteration + var elems = doc.querySelectorAll('body *:not(script):not(style):not(meta):not(link)'); + if (!elems || elems.length === 0) + return null; + var before = true; + var boundsRight = bounds.left + bounds.width; + var boundsBottom = bounds.top + bounds.height; + // Check for obscuring elements + for (var i = 0; i < elems.length; i++) { + var elem = elems[i]; + /** + * The nodes returned from querySelectorAll are in document order. + * If two elements overlap and z-index are not defined, then the node + * rendered earlier will be overlaid by the node rendered later. + */ + // Use compareDocumentPosition to check containment relationships + // Note: compareDocumentPosition returns 0 when comparing a node to itself + var position = ruleContext.compareDocumentPosition(elem); + // DOCUMENT_POSITION_CONTAINED_BY (16): elem is contained by ruleContext + // Also handle self-comparison (position === 0) + if (position === 0 || (position & Node.DOCUMENT_POSITION_CONTAINED_BY)) { + // The next node in elems will be after the target node (ruleContext) + before = false; + continue; + } + // DOCUMENT_POSITION_CONTAINS (8): elem contains ruleContext + // Skip if element contains ruleContext or is not visible + if ((position & Node.DOCUMENT_POSITION_CONTAINS) || !VisUtil_1.VisUtil.isNodeVisible(elem)) + continue; + var bnds = mapper.getUnadjustedBounds(elem); + // Skip if no bounds or zero dimensions + if (!bnds || bnds.height === 0 || bnds.width === 0) + continue; + // Quick bounds check: does elem completely cover ruleContext? + if (bnds.top > bounds.top || bnds.left > bounds.left) + continue; + var bndsRight = bnds.left + bnds.width; + var bndsBottom = bnds.top + bnds.height; + if (bndsRight < boundsRight || bndsBottom < boundsBottom) + continue; + // Check z-index to determine if elem obscures ruleContext + var zStyle = win.getComputedStyle(elem); + if (!zStyle) + continue; + var elemZindex = parseInt(zStyle.zIndex === 'auto' || !zStyle.zIndex || isNaN(Number(zStyle.zIndex)) ? '0' : zStyle.zIndex); + // If before ruleContext in DOM order, elem must have higher z-index to obscure + // If after ruleContext in DOM order, elem can obscure with equal or higher z-index + if ((before && elemZindex > zindex) || (!before && elemZindex >= zindex)) { + // Check if element has opaque background + var hasOpaqueBackground = false; + if (zStyle.background && zStyle.background !== 'none') { + var bgColor = ColorUtil_1.ColorUtil.Color(zStyle.background); + hasOpaqueBackground = bgColor && (bgColor.alpha === undefined || bgColor.alpha > 0); + } + if (!hasOpaqueBackground && zStyle.backgroundColor) { + var bgColor = ColorUtil_1.ColorUtil.Color(zStyle.backgroundColor); + hasOpaqueBackground = bgColor && (bgColor.alpha === undefined || bgColor.alpha > 0); + } + // If element has no content and no opaque background, skip it + if (!CommonUtil_1.CommonUtil.hasInnerContentHidden(elem) && !hasOpaqueBackground) { + continue; + } + return (0, IRule_1.RulePotential)("potential_obscured", []); + } + } + return (0, IRule_1.RulePass)("pass"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/element_tabbable_visible.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/element_tabbable_visible.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_tabbable_visible = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var CSSUtil_1 = __webpack_require__(/*! ../util/CSSUtil */ "./src/v4/util/CSSUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var DOMMapper_1 = __webpack_require__(/*! ../../v2/dom/DOMMapper */ "./src/v2/dom/DOMMapper.ts"); +exports.element_tabbable_visible = { + id: "element_tabbable_visible", + context: "dom:*", + dependencies: [], + help: { + "en-US": { + "group": "element_tabbable_visible.html", + "pass": "element_tabbable_visible.html", + "potential_visible": "element_tabbable_visible.html" + } + }, + messages: { + "en-US": { + "group": "A tabbable element should be visible on the screen when it has keyboard focus", + "pass": "The tabbable element is visible on the screen", + "potential_visible": "Confirm the element should be tabbable and if so, it becomes visible when it has keyboard focus" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + num: ["2.4.7"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (!CommonUtil_1.CommonUtil.isTabbable(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLocaleLowerCase(); + var mapper = new DOMMapper_1.DOMMapper(); + var bounds = mapper.getUnadjustedBounds(ruleContext); + //in case the bounds not available + if (!bounds) + return null; + // Get all needed styles in a single pass through stylesheets + var allStyles = CSSUtil_1.CSSUtil.getDefinedStylesMultiple(ruleContext, ["position", "clip"], ["", ":focus"]); + var defined_styles = allStyles[""]; + var onfocus_styles = allStyles[":focus"]; + if (bounds['height'] === 0 || bounds['width'] === 0) + return (0, IRule_1.RulePotential)("potential_visible", []); + if (defined_styles['position'] === 'absolute' && defined_styles['clip'] && defined_styles['clip'].replaceAll(' ', '') === 'rect(0px,0px,0px,0px)' + && !onfocus_styles['clip']) { + /** + * note that A user can select a checkbox and radio button by selecting the button or the label text. + * When a checkbox or radio button is clipped to 0 size, it is still available to a keyboard or a screen reader. + * The rule should be passed if the label text exists and the button on-focus style is defined by the user, + * which likely incurs the changes of the label style. + */ + if (nodeName === 'input' && (ruleContext.getAttribute('type') === 'checkbox' || ruleContext.getAttribute('type') === 'radio')) { + var label = CommonUtil_1.CommonUtil.getLabelForElement(ruleContext); + if (label && !CommonUtil_1.CommonUtil.isInnerTextEmpty(label)) { + // Get additional pseudo-class styles (reuse onfocus_styles from line 60) + var pseudoStyles = CSSUtil_1.CSSUtil.getDefinedStylesMultiple(ruleContext, null, [":focus-visible", ":focus-within", ":checked", ":focus"]); + var focus_visible_styles = pseudoStyles[":focus-visible"]; + var focus_within_styles = pseudoStyles[":focus-within"]; + var checked_styles = pseudoStyles[":checked"]; + var onfocus_styles_1 = pseudoStyles[":focus"]; + if (onfocus_styles_1 || focus_visible_styles || focus_within_styles || checked_styles) + return (0, IRule_1.RulePass)("pass"); + } + } + return (0, IRule_1.RulePotential)("potential_visible", []); + } + if (bounds['top'] >= 0 && bounds['left'] >= 0) + return (0, IRule_1.RulePass)("pass"); + var default_styles = getComputedStyle(ruleContext); + var top = bounds['top']; + var left = bounds['left']; + if (Object.keys(onfocus_styles).length === 0) { + // no onfocus position change, but could be changed from js + return (0, IRule_1.RulePotential)("potential_visible", []); + } + else { + // with onfocus position change + var positions = ['absolute', 'fixed']; + if (typeof onfocus_styles['top'] !== 'undefined') { + if (positions.includes(onfocus_styles['position']) || (typeof onfocus_styles['position'] === 'undefined' && positions.includes(default_styles['position']))) { + top = onfocus_styles['top'].replace(/\D/g, ''); + } + else { + // the position is undefined and the parent's position is 'relative' + top = Number.MIN_VALUE; + } + } + if (typeof onfocus_styles['left'] !== 'undefined') { + if (positions.includes(onfocus_styles['position']) || (typeof onfocus_styles['position'] === 'undefined' && positions.includes(default_styles['position']))) { + left = onfocus_styles['left'].replace(/\D/g, ''); + } + else { + // the position is undefined and the parent's position is 'relative' + left = Number.MIN_VALUE; + } + } + } + if (top >= 0 && left >= 0) + return (0, IRule_1.RulePass)("pass"); + else + return (0, IRule_1.RulePotential)("potential_visible", []); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/embed_alt_exists.ts" +/*!******************************************!*\ + !*** ./src/v4/rules/embed_alt_exists.ts ***! + \******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.embed_alt_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.embed_alt_exists = { + id: "embed_alt_exists", + context: "dom:embed", + refactor: { + "RPT_Embed_HasAlt": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "embed_alt_exists.html", + "Potential_1": "embed_alt_exists.html", + "group": "embed_alt_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that the <embed> element has alternative content", + "group": "Provide alternative content for <embed> elements" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_FOUR + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "alt"); + return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/emoticons_alt_exists.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/emoticons_alt_exists.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.emoticons_alt_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.emoticons_alt_exists = { + id: "emoticons_alt_exists", + context: "dom:*", + refactor: { + "WCAG20_Text_Emoticons": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "emoticons_alt_exists.html", + "Potential_1": "emoticons_alt_exists.html", + "group": "emoticons_alt_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that emoticons have a text alternative", + "group": "Emoticons must have a short text alternative that describes their purpose" + } + }, + /** + * Decision in planning 9/7/23 that this rule causes more reviews that we see actual problems in content, so turn these rules off + + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": eRulePolicy.VIOLATION, + "toolkitLevel": eToolkitLevel.LEVEL_TWO + }], + */ + rulesets: [], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + emoticons: { + value: [":-)", ":)", ":o)", ":]", ":3", ":c)", ":>", "=]", "8)", "=)", ":D", "C:", + ":-D", ":D", "8D", "XD", "=D", "=3", "<=3", "<=8", "--!--", ":-(", ":(", ":c", ":<", ":[", + "D:", "D8", "D;", "D=", "DX", "v.v", ":-9", ";-)", ";)", "*)", ";]", ";D", ":-P", ":P", + ":-p", ":p", "=p", ":-Þ", ":Þ", ":-b", ":b", ":-O", ":O", "O_O", "o_o", "8O", "OwO", "O-O", + "0_o", "O_o", "O3O", "o0o ;o_o;", "o...o", "0w0", ":-/", ":/", ":\\", "=/", "=\\", ":S", ":|", + "d:-)", "qB-)", ":)~", ":-)>....", ":-X", ":X", ":-#", ":#", "O:-)", "0:3", "O:)", ":'(", ";*(", + "T_T", "TT_TT", "T.T", ":-*", ":*", "^o)", ">:)", ">;)", ">:-)", "B)", "B-)", "8)", "8-)", + "^>.>^", "^<.<^", "^>_>^", "^<_<^", "D:<", ">:(", "D-:<", ">:-(", ":-@[1]", ";(", "`_´", "D<", + "<3", "<333", "=^_^=", "=>.>=", "=<_<=", "=>.<=", "\\,,/", "\\m/", "\\m/\\>.</\\m/", "\\o/", "\\o o/", + "o/\\o", ":&", ":u" + ], + type: "[string]" + } + }; + var ruleContext = context["dom"].node; + var emoticons = validateParams.emoticons.value; + var passed = true; + var testText = ""; + var walkNode = ruleContext.firstChild; + while (walkNode) { + // Comply to the Check Hidden Content setting will be done by default as this rule triggers on each element + // and for each element it only checks that single elements text nodes and nothing else. So all inner elements will be + // covered on their own. Currently for this rule by default Check Hidden Content will work, as we are doing + // a node walk only on siblings so it would not get text nodes from other siblings at all. + // In the case in the future something chnges, just need to add && !RPTUtil.shouldNodeBeSkippedHidden(walkNode) to the below + // if. + if (walkNode.nodeName == "#text") { + testText += " " + walkNode.nodeValue; + } + walkNode = walkNode.nextSibling; + } + if (testText.trim().length > 0) { + for (var j = 0; passed && j < emoticons.length; ++j) { + var emotIdx = testText.indexOf(emoticons[j]); + var eLngth = emoticons[j].length; + while (passed && emotIdx != -1) { + // Passes if: the emoticon is not preceded by whitespace, + // or the emoticon is not followed by whitespace unless it's punctuation, + // or it's in a pre, code, or script + passed = + (emotIdx > 0 && !/\s/.test(testText.substring(emotIdx - 1, emotIdx))) || + (emotIdx < testText.length - eLngth && !/\s/.test(testText.substring(emotIdx + eLngth, emotIdx + eLngth + 1)) && + !/[.,!'"?]/.test(testText.substring(emotIdx + eLngth, emotIdx + eLngth + 1))); + // Allow usage of (: stuff :) since this is a comment in some languages + passed = passed || ((emoticons[j] == ":)" || emoticons[j] == "(:") && /\(\:.*\:\)/.test(testText)); + passed = passed || ((emoticons[j] == ";)" || emoticons[j] == "(;") && /\(\;.*\;\)/.test(testText)); + emotIdx = testText.indexOf(emoticons[j], emotIdx + 1); + } + } + } + if (!passed) { + // Don't trigger if we're not in the body or if we're in a script, pre, code + var checkAncestor = CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["pre", "code", "script", "body"]); + passed = checkAncestor == null || checkAncestor.nodeName.toLowerCase() != "body"; + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/error_message_exists.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/error_message_exists.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.error_message_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.error_message_exists = { + id: "error_message_exists", + context: "dom:*[aria-invalid=true]", + refactor: { + "HAAC_Aria_ErrorMessage": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_0": "error_message_exists.html", + "Fail_1": "error_message_exists.html", + "Fail_2": "error_message_exists.html", + "group": "error_message_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Custom error message has invalid reference 'id' value", + "Fail_2": "Custom error message is not visible", + "group": "A custom error message must reference a valid 'id' value and when triggered the message must be appropriately exposed" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var aria_errMsgId = AriaUtil_1.AriaUtil.getAriaAttribute(ruleContext, "aria-errormessage"); + // If aria-errormessage is not provided, then OUT_OF_SCOPE + if (!aria_errMsgId) { + return null; + } + var msg_ele = fragment_1.FragmentUtil.getById(ruleContext, aria_errMsgId); + // POF0: Invalid id reference + if (!msg_ele) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + // POF1: Referenced element is not visible + if (!VisUtil_1.VisUtil.isNodeVisible(msg_ele)) { + return (0, IRule_1.RuleFail)("Fail_2"); + } + return (0, IRule_1.RulePass)("Pass_0"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/fieldset_label_valid.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/fieldset_label_valid.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.fieldset_label_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +exports.fieldset_label_valid = { + id: "fieldset_label_valid", + context: "aria:group", + refactor: { + "group_withInputs_hasName": { + "Pass_1": "Pass_1", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_1": "fieldset_label_valid.html", + "Fail_1": "fieldset_label_valid.html", + "Fail_2": "fieldset_label_valid.html", + "group": "fieldset_label_valid.html" + } + }, + messages: { + "en-US": { + "Pass_1": "Group/Fieldset \"{0}\" with an input has a unique name", + "Fail_1": "Group/Fieldset does not have an accessible name", + "Fail_2": "Group/Fieldset \"{0}\" has a duplicate name to another group", + "group": "Groups with nested inputs must have unique accessible name" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1", "3.3.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + var ownerDocument = fragment_1.FragmentUtil.getOwnerFragment(ruleContext); + var formCache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "landmark_group_input", null); + if (!formCache) { + formCache = { + groupsWithInputs: [], + groupsWithInputsComputedLabels: [], + }; + var allGroupsTemp = ownerDocument.querySelectorAll('fieldset,[role="group"]'); + var allGroups = Array.from(allGroupsTemp); + var groupsWithInputs = []; + for (var i = 0; i < allGroups.length; i++) { + // Loop over all the group nodes + if (allGroups[i].querySelector("input")) { + groupsWithInputs.push(allGroups[i]); + } + } + var groupsWithInputsComputedLabels = []; + for (var i = 0; i < groupsWithInputs.length; i++) { + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(groupsWithInputs[i]); + // Loop over all the landmark nodes + groupsWithInputsComputedLabels.push( + /**ARIAMapper.computeName(groupsWithInputs[i])*/ + pair && pair.name && pair.name.trim().length > 0 ? pair.name.trim() : ""); + } + formCache.groupsWithInputs = groupsWithInputs; + formCache.groupsWithInputsComputedLabels = + groupsWithInputsComputedLabels; + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "landmark_group_input", formCache); + } + // formCache.groupsWithInputs.forEach(element => { + // console.log("formCache.groupsWithInputs: " +element.id) + // }); + // console.log("formCache.groupsWithInputsComputedLabels: " +formCache.groupsWithInputsComputedLabels) + // console.log("formCache.groupsWithInputsComputedLabels: " +formCache.groupsWithInputsComputedLabels.length) + var ruleContextFoundIngroupsWithInputsFlag = false; + var computedName = ""; + if (!formCache.groupsWithInputs) { + // We do not have any groups with inputs. Therefore we should skip this rule trigger. + return null; + } + for (var i = 0; i < formCache.groupsWithInputs.length; i++) { + if (ruleContext.isSameNode(formCache.groupsWithInputs[i])) { + // We have found our ruleContext in the cache + ruleContextFoundIngroupsWithInputsFlag = true; + if (formCache.groupsWithInputsComputedLabels[i] === "" || + formCache.groupsWithInputsComputedLabels[i] === null) { + // console.log("Fail_1") + return (0, IRule_1.RuleFail)("Fail_1"); + } + var foundSameNameFlag = false; + for (var j = 0; j < formCache.groupsWithInputsComputedLabels.length; j++) { + if (i == j) { + continue; + } // We do not want to compare against ourselfs + if (formCache.groupsWithInputsComputedLabels[i] === + formCache.groupsWithInputsComputedLabels[j]) { + foundSameNameFlag = true; + } + } + if (foundSameNameFlag) { + // console.log("Fail_2") + return (0, IRule_1.RuleFail)("Fail_2", [ + formCache.groupsWithInputsComputedLabels[i], + ]); + } + computedName = formCache.groupsWithInputsComputedLabels[i]; + } + } + if (!ruleContextFoundIngroupsWithInputsFlag) { + // console.log("null return") + return null; + } + // console.log("Pass_1") + return (0, IRule_1.RulePass)("Pass_1", [computedName]); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/fieldset_legend_valid.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/fieldset_legend_valid.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.fieldset_legend_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.fieldset_legend_valid = { + id: "fieldset_legend_valid", + context: "dom:fieldset", + refactor: { + "WCAG20_Fieldset_HasLegend": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3" + } + }, + help: { + "en-US": { + "Pass_0": "fieldset_legend_valid.html", + "Fail_1": "fieldset_legend_valid.html", + "Fail_2": "fieldset_legend_valid.html", + "Fail_3": "fieldset_legend_valid.html", + "group": "fieldset_legend_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "<fieldset> element does not have a <legend>", + "Fail_2": "<fieldset> element has more than one <legend>", + "Fail_3": "<fieldset> element <legend> is empty", + "group": " <fieldset> elements should have a single, non-empty <legend> as a label" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip if the fieldset is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return null; + // In the case a legend is hidden, we should still trigger a violations for this + var legends = CommonUtil_1.CommonUtil.getChildByTagHidden(ruleContext, "legend", true, false); + if (legends.length === 0) { + // Fieldset has NO Legend + return (0, IRule_1.RuleFail)("Fail_1"); + } + else if (legends.length > 1) { + // Fieldset has more than one legend + return (0, IRule_1.RuleFail)("Fail_2"); + } + else if (CommonUtil_1.CommonUtil.getInnerText(legends[0]).trim().length === 0) { + // Fieldset has legend but legend is empty + return (0, IRule_1.RuleFail)("Fail_3"); + } + return (0, IRule_1.RulePass)("Pass_0"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/figure_label_exists.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/figure_label_exists.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.figure_label_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +exports.figure_label_exists = { + id: "figure_label_exists", + context: "dom:figure", + refactor: { + "HAAC_Figure_label": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "figure_label_exists.html", + "Fail_1": "figure_label_exists.html", + "group": "figure_label_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The <figure> element does not have an associated label", + "group": "A <figure> element must have an associated label" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // ignore if an explicit role is specified. this case will be covered in the aria_accessiblename_exists rules + var role = ruleContext.getAttribute("role"); + if (role) { + return null; + } + //let passed = AriaUtil.hasAriaLabel(ruleContext) || CommonUtil.attributeNonEmpty(ruleContext, "title"); + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + var passed = pair && pair.name && pair.name.trim().length > 0; + //return new ValidationResult(passed, [ruleContext], '', '', []); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", []); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/form_font_color.ts" +/*!*****************************************!*\ + !*** ./src/v4/rules/form_font_color.ts ***! + \*****************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.form_font_color = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.form_font_color = { + id: "form_font_color", + context: "dom:form", + refactor: { + "RPT_Font_ColorInForm": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "form_font_color.html", + "Potential_1": "form_font_color.html", + "group": "form_font_color.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Check color is not used as the only visual means to convey which fields are required", + "group": "Combine color and descriptive markup to indicate required form fields" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = true; + var fonts = ruleContext.getElementsByTagName("font"); + if (fonts != null) { + for (var i = 0; i < fonts.length; ++i) { + passed = !fonts[i].hasAttribute("color"); + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/form_interaction_review.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/form_interaction_review.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.form_interaction_review = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.form_interaction_review = { + id: "form_interaction_review", + context: "dom:form[target]", + refactor: { + "WCAG20_Form_TargetAndText": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "form_interaction_review.html", + "Potential_1": "form_interaction_review.html", + "group": "form_interaction_review.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that interacting with content will not open pop-up windows or change the active window without informing the user", + "group": "User should be informed in advance when interacting with content causes a change of context" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.2.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + paramWinText: { + value: ["new window"], + type: "array" + } + }; + var ruleContext = context["dom"].node; + var tStr = ruleContext.getAttribute("target"); + var passed = tStr === "_parent" || tStr === "_self" || tStr === "_top" || CommonUtil_1.CommonUtil.getFrameByName(ruleContext, tStr) != null; + if (!passed) { + // Name is not part of this frameset – must have potential to create new window? + // See if a new window is mentioned + var textStr = CommonUtil_1.CommonUtil.getInnerText(ruleContext); + if (ruleContext.hasAttribute("title")) + textStr += " " + ruleContext.getAttribute("title"); + for (var i = 0; !passed && i < validateParams.paramWinText.value.length; ++i) + if (textStr.indexOf(validateParams.paramWinText.value[i]) != -1) + passed = true; + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/form_label_unique.ts" +/*!*******************************************!*\ + !*** ./src/v4/rules/form_label_unique.ts ***! + \*******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.form_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +exports.form_label_unique = { + id: "form_label_unique", + context: "dom:label[for]", + refactor: { + "RPT_Label_UniqueFor": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "form_label_unique.html", + "Fail_1": "form_label_unique.html", + "group": "form_label_unique.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Form control has more than one label", + "group": "Form controls should have exactly one label" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // JCH - NO OUT OF SCOPE hidden in context + var labelIds = CacheUtil_1.CacheUtil.getCache(fragment_1.FragmentUtil.getOwnerFragment(ruleContext), "RPT_Label_Single", {}); + var id = ruleContext.getAttribute("for"); + var passed = !(id in labelIds); + labelIds[id] = true; + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/form_submit_button_exists.ts" +/*!***************************************************!*\ + !*** ./src/v4/rules/form_submit_button_exists.ts ***! + \***************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.form_submit_button_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +exports.form_submit_button_exists = { + id: "form_submit_button_exists", + context: "dom:form", + refactor: { + "WCAG20_Form_HasSubmit": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "form_submit_button_exists.html", + "Potential_1": "form_submit_button_exists.html", + "group": "form_submit_button_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify the <form> element has a submit button or an image button", + "group": "A <form> element should have a submit button or an image button" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.2.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = false; + if (ruleContext.firstChild) { + // submit buttons are usually at the bottom - walk backwards + var nw = new DOMWalker_1.DOMWalker(ruleContext, true); + while (!passed && nw.prevNode() && nw.node != ruleContext) { + if (!nw.bEndTag) { + var nodeName = nw.node.nodeName.toLowerCase(); + if (nodeName === "input") { + var type = nw.elem().getAttribute("type"); + if (type) { + type = type.toLowerCase(); + } + passed = type === "submit" || type === "image"; + } + else if (nodeName === "button") { + passed = nw.elem().hasAttribute("type") && nw.elem().getAttribute("type").toLowerCase() === "submit"; + } + else if (nw.node.nodeType === 1) { + passed = AriaUtil_1.AriaUtil.hasRole(nw.node, "button"); + } + } + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/form_submit_review.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/form_submit_review.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.form_submit_review = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.form_submit_review = { + id: "form_submit_review", + context: "dom:select[onchange], dom:input[onchange]", + refactor: { + "RPT_Form_ChangeEmpty": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "form_submit_review.html", + "Potential_1": "form_submit_review.html", + "group": "form_submit_review.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Confirm the form does not submit automatically without warning", + "group": "A form should not be submitted automatically without warning the user" + } + }, + /** + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.2.2"], + "level": eRulePolicy.VIOLATION, + "toolkitLevel": eToolkitLevel.LEVEL_THREE + }],*/ + //deprecate the rule on Jun 10, 2024 + rulesets: [], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = ruleContext.getAttribute("onchange").trim().length === 0; + if (passed) + return null; + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/frame_src_valid.ts" +/*!*****************************************!*\ + !*** ./src/v4/rules/frame_src_valid.ts ***! + \*****************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.frame_src_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.frame_src_valid = { + id: "frame_src_valid", + context: "dom:frame, dom:iframe", + refactor: { + "Valerie_Frame_SrcHtml": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "frame_src_valid.html", + "Potential_1": "frame_src_valid.html", + "group": "frame_src_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify <frame> content is accessible", + "group": "A <frame> containing non-HTML content must be made accessible" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "src") && + CommonUtil_1.CommonUtil.isHtmlExt(CommonUtil_1.CommonUtil.getFileExt(ruleContext.getAttribute("src"))); + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/frame_title_exists.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/frame_title_exists.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.frame_title_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.frame_title_exists = { + id: "frame_title_exists", + context: "dom:frame, dom:iframe", + refactor: { + "WCAG20_Frame_HasTitle": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "frame_title_exists.html", + "Pass_0": "frame_title_exists.html", + "Fail_1": "frame_title_exists.html" + } + }, + messages: { + "en-US": { + "group": "Inline frames must have a unique, non-empty 'title' attribute", + "Pass_0": "Rule Passed", + "Fail_1": "Inline frame does not have a 'title' attribute", + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: "cae760", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // ignore if an explicit role is specified. this case will be covered in the aria_accessiblename_exists rules + var role = ruleContext.getAttribute("role"); + if (role) { + return null; + } + var name_pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + if (name_pair && name_pair.name && name_pair.name.trim().length > 0) { + //if (CommonUtil.attributeNonEmpty(ruleContext, "title")) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/heading_content_exists.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/heading_content_exists.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.heading_content_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.heading_content_exists = { + id: "heading_content_exists", + context: "dom:h1, dom:h2, dom:h3, dom:h4, dom:h5, dom:h6", + refactor: { + "RPT_Header_HasContent": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "heading_content_exists.html", + "Fail_1": "heading_content_exists.html", + "group": "heading_content_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Heading element has descriptive text", + "Fail_1": "Heading element has no descriptive content", + "group": "Heading elements must provide descriptive text" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.6"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = CommonUtil_1.CommonUtil.hasInnerContentHidden(ruleContext); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/heading_markup_misuse.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/heading_markup_misuse.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.heading_markup_misuse = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.heading_markup_misuse = { + id: "heading_markup_misuse", + context: "dom:h1, dom:h2, dom:h3, dom:h4, dom:h5, dom:h6", + dependencies: ["heading_content_exists"], + refactor: { + "RPT_Headers_FewWords": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "heading_markup_misuse.html", + "Potential_1": "heading_markup_misuse.html", + "group": "heading_markup_misuse.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that the heading element is a genuine heading", + "group": "Heading elements must not be used for presentation" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + headingLengthThresh: { + value: 20, + type: "integer" + } + }; + var ruleContext = context["dom"].node; + var headingLengthThresh = validateParams.headingLengthThresh.value; + var passed = CommonUtil_1.CommonUtil.wordCount(CommonUtil_1.CommonUtil.getInnerText(ruleContext)) <= headingLengthThresh; + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/html_lang_exists.ts" +/*!******************************************!*\ + !*** ./src/v4/rules/html_lang_exists.ts ***! + \******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.html_lang_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var ancestor_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/ancestor */ "./src/v2/checker/accessibility/util/ancestor.ts"); +var lang_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/lang */ "./src/v2/checker/accessibility/util/lang.ts"); +exports.html_lang_exists = { + id: "html_lang_exists", + context: "dom:html", + refactor: { + "WCAG20_Html_HasLang": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3", + "Fail_4": "Fail_4", + "Fail_5": "Fail_5", + "Potential_5": "Potential_5", + "Potential_6": "Potential_6" + } + }, + help: { + "en-US": { + "group": "html_lang_exists.html", + "Pass_0": "html_lang_exists.html", + "Fail_1": "html_lang_exists.html", + "Fail_2": "html_lang_exists.html", + "Fail_3": "html_lang_exists.html", + "Fail_4": "html_lang_exists.html", + "Fail_5": "html_lang_exists.html", + "Potential_5": "html_lang_exists.html", + "Potential_6": "html_lang_exists.html" + } + }, + messages: { + "en-US": { + "group": "Page must identify the default language of the document with a 'lang' attribute", + "Pass_0": "Page language detected as \"{0}\"", + "Fail_1": "Page detected as XHTML 1.0, but has neither 'lang' nor 'xml:lang' attributes", + "Fail_2": "Page detected as XHTML, but does not have an 'xml:lang' attribute", + "Fail_3": "Page detected as HTML, but does not have a 'lang' attribute", + "Fail_4": "Page detected with 'lang' and 'xml:lang' attributes and primary languages do not match: \"{0}\", \"{1}\"", + "Fail_5": "Page detected with 'lang' and 'xml:lang' attributes that do not match: \"{0}\", \"{1}\"", + "Potential_5": "Page detected as XHTML 1.0 with only a 'lang' attribute. Confirm that page is only delivered via text/html mime type", + "Potential_6": "Page detected as XHTML 1.0 with only an 'xml:lang' attribute. Confirm that page is only delivered via xml mime type" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "3.1.1", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [{ + "b5c3f8": { + "Pass_0": "pass", + "Fail_1": "inapplicable", + "Fail_2": "inapplicable", + "Fail_3": "fail", + "Fail_4": "inapplicable", + "Fail_5": "inapplicable", + "Potential_5": "inapplicable", + "Potential_6": "inapplicable" + }, + "5b7ae0": { + "Pass_0": "pass", + "Fail_1": "inapplicable", + "Fail_2": "inapplicable", + "Fail_3": "inapplicable", + "Fail_4": "fail", + "Fail_5": "pass", + "Potential_5": "inapplicable", + "Potential_6": "inapplicable" + } + }], + run: function (context, options, contextHierarchies) { + // This rule does not apply inside a presentational frame + if (ancestor_1.AncestorUtil.isPresentationFrame(contextHierarchies)) { + return null; + } + var ruleContext = context["dom"].node; + var doctypeString = ruleContext.ownerDocument.doctype ? ruleContext.ownerDocument.doctype.publicId : ""; + if (!doctypeString) + doctypeString = ""; + var lang = ruleContext.getAttribute("lang"); + var langXML = ruleContext.getAttribute("xml:lang"); + if (doctypeString.includes('XHTML') && !doctypeString.includes("1.0")) { + if (!langXML) { + // XHTML != 1.0 (must have xml:lang + return (0, IRule_1.RuleFail)("Fail_2"); + } + else { + return (0, IRule_1.RulePass)("Pass_0", [langXML]); + } + } + else if (doctypeString.includes('XHTML') && doctypeString.includes("1.0")) { + // Handle XHTML 1.0 + // If neither is provided, it's a failure + if (!lang && !langXML) { + // XHTML and no lang + return (0, IRule_1.RuleFail)("Fail_1"); + } + else if (lang && langXML) { + if (lang !== langXML) { + if (!lang_1.LangUtil.validPrimaryLang(lang) || !lang_1.LangUtil.validPrimaryLang(langXML)) { + // Let Elem_Lang_Valid handle this + return null; + } + if (!lang_1.LangUtil.matchPrimaryLang(lang, langXML)) { + // XHTML and lang and xml:lang, but they don't match + return (0, IRule_1.RuleFail)("Fail_4", [lang, langXML], []); + } + else { + return (0, IRule_1.RuleFail)("Fail_5", [lang, langXML], []); + } + } + else { + // XHTML and lang and xml:lang match + return (0, IRule_1.RulePass)("Pass_0", [lang]); + } + } + else if (lang) { + // XHTML and only lang (okay if only delivered via text/html) + return (0, IRule_1.RulePotential)("Potential_5"); + } + else { + // XHTML and only xml:lang (okay if only delivered via xml mime type) + return (0, IRule_1.RulePotential)("Potential_6"); + } + } + else { + if (!lang) { + return (0, IRule_1.RuleFail)("Fail_3"); + } + else if (lang && langXML) { + // HTML5 polyglot documents + if (lang !== langXML) { + if (!lang_1.LangUtil.validPrimaryLang(lang) || !lang_1.LangUtil.validPrimaryLang(langXML)) { + // Let Elem_Lang_Valid handle this + return null; + } + if (!lang_1.LangUtil.matchPrimaryLang(lang, langXML)) { + // XHTML and lang and xml:lang, but they don't match + return (0, IRule_1.RuleFail)("Fail_4", [lang, langXML], []); + } + else { + return (0, IRule_1.RuleFail)("Fail_5", [lang, langXML], []); + } + } + else { + // XHTML and lang and xml:lang match + return (0, IRule_1.RulePass)("Pass_0", [lang]); + } + } + else { + return (0, IRule_1.RulePass)("Pass_0", [lang]); + } + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/html_skipnav_exists.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/html_skipnav_exists.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.html_skipnav_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +exports.html_skipnav_exists = { + id: "html_skipnav_exists", + context: "dom:html", + refactor: { + "RPT_Html_SkipNav": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "group": "html_skipnav_exists.html", + "Pass_0": "html_skipnav_exists.html", + "Potential_1": "html_skipnav_exists.html" + } + }, + messages: { + "en-US": { + "group": "Provide a way to bypass blocks of content that are repeated on multiple Web pages", + "Pass_0": "Rule Passed", + "Potential_1": "Verify there is a way to bypass blocks of content that are repeated on multiple Web pages" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "2.4.1", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = false; + var frames = CommonUtil_1.CommonUtil.getDocElementsByTag(ruleContext, "frame"); + var headers = CommonUtil_1.CommonUtil.getDocElementsByTag(ruleContext, "h1"); + if ((frames != null && frames.length > 0) || (headers != null && headers.length > 0)) { + // If frames or headings are used, pass + passed = true; + } + else { + // Look for skip anchors + var anchors = CommonUtil_1.CommonUtil.getDocElementsByTag(ruleContext, "a"); + var targets = {}; + for (var idx = 0; !passed && idx < anchors.length; ++idx) { + if (anchors[idx].hasAttribute("href")) { + var href = anchors[idx].href; + if (typeof href !== typeof "") { + if (href.baseVal) { + href = href.baseVal; + } + else { + href = ""; + } + } + var tmpLocation = void 0; + if (typeof (ruleContext.ownerDocument.locationFromDAP) != "undefined" && ruleContext.ownerDocument.locationFromDAP != null) { // DAP sets it + tmpLocation = ruleContext.ownerDocument.locationFromDAP; + } + else { // server scan has the location object + tmpLocation = ruleContext.ownerDocument.location; + } + var docHref = ""; + if (tmpLocation) { + docHref = tmpLocation.href; + } + // Fix weird bugs with how various parsers report on file: url's: + if (href.startsWith("file:///")) + href = "file:/" + href.substring("file:///".length); + if (docHref.startsWith("file:///")) + docHref = "file:/" + docHref.substring("file:///".length); + if (href.charAt(0) == "#" || href.startsWith(docHref + "#")) { + var target = CommonUtil_1.CommonUtil.getFileAnchor(href); + if (fragment_1.FragmentUtil.getById(ruleContext, target) != null) + passed = true; + else + targets[target] = true; + } + } + else if (anchors[idx].hasAttribute("name")) { + // Assume forward jumping targets + var name_1 = anchors[idx].getAttribute("name"); + if (name_1.indexOf("#") != -1) + name_1 = CommonUtil_1.CommonUtil.getFileAnchor(name_1); + passed = name_1 in targets; + } + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/iframe_interactive_tabbable.ts" +/*!*****************************************************!*\ + !*** ./src/v4/rules/iframe_interactive_tabbable.ts ***! + \*****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.iframe_interactive_tabbable = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var DOMMapper_1 = __webpack_require__(/*! ../../v2/dom/DOMMapper */ "./src/v2/dom/DOMMapper.ts"); +exports.iframe_interactive_tabbable = { + id: "iframe_interactive_tabbable", + context: "dom:iframe", + dependencies: [], + help: { + "en-US": { + "group": "iframe_interactive_tabbable.html", + "pass": "iframe_interactive_tabbable.html", + "fail_invalid": "iframe_interactive_tabbable.html" + } + }, + messages: { + "en-US": { + "group": "Iframe with interactive content should not be excluded from tab order using tabindex", + "pass": "The iframe with interactive content is not excluded from the tab order using tabindex", + "fail_invalid": "The <iframe> with interactive content is excluded from tab order using tabindex" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + num: ["2.1.1"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: ["akn7bn"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + var mapper = new DOMMapper_1.DOMMapper(); + var bounds = mapper.getUnadjustedBounds(ruleContext); + //in case the bounds not available + if (!bounds) + return null; + // ignore if iframe is too small to be visible on screen + if (Math.max(bounds['height'], bounds['width']) < 30 || Math.min(bounds['height'], bounds['width']) < 15) + return null; + // pass iframe element does not have a tabindex attribute value that is a negative number + if (!ruleContext.hasAttribute("tabindex") || parseInt(ruleContext.getAttribute("tabindex")) >= 0) + return (0, IRule_1.RulePass)("pass"); + // check iframe content + var iframElem = ruleContext; + if (!iframElem || !iframElem.contentDocument || !iframElem.contentDocument.documentElement) + return null; + var count = CommonUtil_1.CommonUtil.getTabbableChildren(ruleContext); + if (count > 0) + return (0, IRule_1.RuleFail)("fail_invalid"); + return null; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/imagebutton_alt_exists.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/imagebutton_alt_exists.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.imagebutton_alt_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.imagebutton_alt_exists = { + id: "imagebutton_alt_exists", + context: "dom:input", + refactor: { + "WCAG20_Input_ExplicitLabelImage": { + "Pass_0": "Pass_0", + "Pass_1": "Pass_1", + "Pass_2": "Pass_2", + "Fail": "Fail" + } + }, + help: { + "en-US": { + "Pass_0": "imagebutton_alt_exists.html", + "Pass_1": "imagebutton_alt_exists.html", + "Pass_2": "imagebutton_alt_exists.html", + "Fail": "imagebutton_alt_exists.html", + "group": "imagebutton_alt_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Image button provides alternative text using the 'alt' attribute", + "Pass_1": "Image button provides alternative text using an ARIA label", + "Pass_2": "Image button provides alternative text using the 'title' attribute", + "Fail": "The <input> element of type \"image\" has no text alternative", + "group": "The <input> element of type \"image\" should have a text alternative" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: "59796f", + run: function (context, options, contextHierarchies) { + // See https://www.w3.org/WAI/WCAG22/Techniques/failures/F65 + var ruleContext = context["dom"].node; + if (!ruleContext.hasAttribute("type") || ruleContext.getAttribute("type").toLowerCase() != "image") { + return null; + } + if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "alt")) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else if (AriaUtil_1.AriaUtil.hasAriaLabel(ruleContext)) { + return (0, IRule_1.RulePass)("Pass_1"); + } + else if (ruleContext.hasAttribute("title") && ruleContext.getAttribute("title").length > 0) { + return (0, IRule_1.RulePass)("Pass_2"); + } + return (0, IRule_1.RuleFail)("Fail"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/imagemap_alt_exists.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/imagemap_alt_exists.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.imagemap_alt_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.imagemap_alt_exists = { + id: "imagemap_alt_exists", + context: "dom:img[usemap], dom:img[ismap]", + refactor: { + "HAAC_Img_UsemapAlt": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "imagemap_alt_exists.html", + "Fail_1": "imagemap_alt_exists.html", + "group": "imagemap_alt_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Image map or child <area> has no text alternative", + "group": "An image map and each <area> element in an image map must have text alternative(s)" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "alt") || + (!ruleContext.hasAttribute("ismap") && !CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "usemap")); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/img_alt_background.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/img_alt_background.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_alt_background = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.img_alt_background = { + id: "img_alt_background", + context: "dom:*", + refactor: { + "HAAC_BackgroundImg_HasTextOrTitle": { + "Pass_0": "Pass_0", + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Pass_0": "img_alt_background.html", + "Manual_1": "img_alt_background.html", + "group": "img_alt_background.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Manual_1": "Verify important background image information has a text alternative in system high contrast mode", + "group": "Background images that convey important information must have a text alternative that describes the image" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var doc = ruleContext.ownerDocument; + var style = doc.defaultView.getComputedStyle(ruleContext); + if (style == null) { + return (0, IRule_1.RulePass)("Pass_0"); + } + var backgroundImgs = style.backgroundImage; + var passed = true; + if (backgroundImgs != null && backgroundImgs != "" && backgroundImgs != 'none' && backgroundImgs != 'inherit') { + if (ruleContext.innerHTML != null && ruleContext.innerHTML.trim().length != 0) { + passed = false; + } + else { + var title = ruleContext.getAttribute('title'); + if (title != null && title.length != 0) + passed = false; + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/img_alt_decorative.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/img_alt_decorative.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_alt_decorative = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.img_alt_decorative = { + id: "img_alt_decorative", + context: "dom:img[alt]", + refactor: { + "WCAG20_Img_PresentationImgHasNonNullAlt": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "img_alt_decorative.html", + "Fail_1": "img_alt_decorative.html", + "group": "img_alt_decorative.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Image designated as decorative has non-null 'alt' attribute", + "group": "Image designated as decorative must have 'alt=\"\"" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = true; + if (AriaUtil_1.AriaUtil.hasRole(ruleContext, "presentation") || AriaUtil_1.AriaUtil.hasRole(ruleContext, "none")) { + passed = ruleContext.getAttribute("alt").length == 0; + } + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/img_alt_misuse.ts" +/*!****************************************!*\ + !*** ./src/v4/rules/img_alt_misuse.ts ***! + \****************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_alt_misuse = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.img_alt_misuse = { + id: "img_alt_misuse", + context: "dom:img, dom:area, dom:input", + refactor: { + "RPT_Img_AltCommonMisuse": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "img_alt_misuse.html", + "Potential_1": "img_alt_misuse.html", + "group": "img_alt_misuse.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that the file name serves as a good inline replacement for the image", + "group": "'alt' attribute value must be a good inline replacement for the image" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + badText: { + value: ["short description"], + type: "[string]" + } + }; + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLowerCase(); + var passed = true; + // Alt text check are elsewhere (See 41, 240, 455) + if (ruleContext.hasAttribute("alt")) { + var altText = ruleContext.getAttribute("alt").trim(); + if (altText.length > 0) { + var badText = validateParams.badText.value; + for (var i = 0; passed && i < badText.length; ++i) { + passed = altText.indexOf(badText[i]) == -1; + } + if (passed) { + var src = ruleContext.getAttribute((nodeName == "area") ? "href" : "src"); + // Allow it to pass if there's no src - can't determine these. + if (src != null) { + // Fail if the alt matches the src exactly + // Also fail if the alt has a . in it and either the src is in the alt or the alt is in the src + passed = src.trim() != altText && + (altText.indexOf(".") == -1 || (altText.indexOf(src) == -1 && src.indexOf(altText) == -1)); + } + } + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/img_alt_null.ts" +/*!**************************************!*\ + !*** ./src/v4/rules/img_alt_null.ts ***! + \**************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_alt_null = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.img_alt_null = { + id: "img_alt_null", + context: "dom:img[alt]", + refactor: { + "WCAG20_Img_TitleEmptyWhenAltNull": { + "Pass_0": "pass", + "Fail_1": "fail_decorative" + } + }, + help: { + "en-US": { + "pass": "img_alt_null.html", + "fail_decorative": "img_alt_null.html", + "potential_aria_override": "img_alt_null.html", + "group": "img_alt_null.html" + } + }, + messages: { + "en-US": { + "pass": "Neither 'aria' nor 'title' attributes are used for the decorative image", + "fail_decorative": "The image 'alt' attribute is empty, but the 'title' attribute is not empty", + "potential_aria_override": "The image 'alt' attribute is empty, but the 'aria' label is not empty and overrides the 'alt' attribute", + "group": "When the intent is to mark an image as decorative with an empty 'alt' attribute, the 'aria' or 'title' attributes should not be used" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE, + reasonCodes: ["fail_decorative"] + }, + { + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["ARIA"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE, + reasonCodes: ["potential_aria_override"] + } + ], + act: [{ "46ca7f": { "potential_aria_override": "fail" } }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + if (ruleContext.getAttribute("alt").trim().length > 0) { + return null; + } + // We have a title, but alt is empty + if (AriaUtil_1.AriaUtil.getAriaLabel(ruleContext).length > 0) { + return (0, IRule_1.RulePotential)("potential_aria_override"); + } + else if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "title")) { + return (0, IRule_1.RuleFail)("fail_decorative"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/img_alt_redundant.ts" +/*!*******************************************!*\ + !*** ./src/v4/rules/img_alt_redundant.ts ***! + \*******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_alt_redundant = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.img_alt_redundant = { + id: "img_alt_redundant", + context: "dom:img[alt]", + refactor: { + "WCAG20_Img_LinkTextNotRedundant": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3" + } + }, + help: { + "en-US": { + "Pass_0": "img_alt_redundant.html", + "Fail_1": "img_alt_redundant.html", + "Fail_2": "img_alt_redundant.html", + "Fail_3": "img_alt_redundant.html", + "group": "img_alt_redundant.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Link text is repeated in an image 'alt' value within the same link", + "Fail_2": "Link text of previous link is repeated in image 'alt' value of a link", + "Fail_3": "Image 'alt' value within a link is repeated in link text of the link after", + "group": "The text alternative for an image within a link should not repeat the link text or adjacent link text" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1", "2.4.4"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var aNode = CommonUtil_1.CommonUtil.getAncestor(ruleContext, "a"); + //If not in an anchor, Out of Scope + if (aNode == null) + return null; + var altText = ruleContext.getAttribute("alt").trim().toLowerCase(); + if (altText.length == 0) { + // If alt text is empty, there's no text to be redundant - let a_text_purpose + // trigger in that case. + // So Out of Scope for this rule + return null; + } + var innerText = aNode.innerText; + var linkText = ""; + if (innerText != null) { + linkText = innerText.trim().toLowerCase(); + } + if (linkText.length > 0) { + if (altText == linkText) { + // Text in link + return (0, IRule_1.RuleFail)("Fail_1"); + } + } + else { + var passed = true; + //alt is non-zero, but no link text - ensure adjacent link text isn't redundant + var walk = new DOMWalker_1.DOMWalker(aNode); + while (passed && walk.prevNode()) { + // Get the node and nodeName + var node = walk.node; + var nodeName = node.nodeName.toLowerCase(); + if ((nodeName == "#text" && node.nodeValue.length > 0) || + (nodeName == "img" && CommonUtil_1.CommonUtil.attributeNonEmpty(node, "alt"))) { + break; + } + // Comply with the Check Hidden Content Setting if the a element should be checked or not + else if (nodeName === "a" && !CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(node)) { + // Text before image link + passed = (node.innerText || node.textContent || "").trim().toLowerCase() != altText; + } + } + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_2"); + } + walk = new DOMWalker_1.DOMWalker(aNode, true); + while (passed && walk.nextNode()) { + // Get the node and nodeName + var node = walk.node; + var nodeName = node.nodeName.toLowerCase(); + if ((nodeName == "#text" && node.nodeValue.length > 0) || + (nodeName == "img" && CommonUtil_1.CommonUtil.attributeNonEmpty(node, "alt"))) { + break; + } + // Comply with the Check Hidden Content Setting if the a element should be checked or not + else if (nodeName == "a" && !CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(node)) { + passed = node.innerText.trim().toLowerCase() != altText; + } + } + if (!passed) { + // Text after image link + return (0, IRule_1.RuleFail)("Fail_3"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/img_alt_valid.ts" +/*!***************************************!*\ + !*** ./src/v4/rules/img_alt_valid.ts ***! + \***************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_alt_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +exports.img_alt_valid = { + id: "img_alt_valid", + context: "dom:img", + refactor: { + "WCAG20_Img_HasAlt": { + "pass": "pass", + "fail_blank_alt": "fail_blank_alt", + "fail_no_alt": "fail_no_alt", + "fail_blank_title": "fail_blank_title" + } + }, + help: { + "en-US": { + "pass": "img_alt_valid.html", + "fail_blank_alt": "img_alt_valid.html", + "fail_no_alt": "img_alt_valid.html", + "fail_blank_title": "img_alt_valid.html", + "group": "img_alt_valid.html" + } + }, + messages: { + "en-US": { + "pass": "The image has an accessible name or is correctly marked as decorative or redundant", + "fail_blank_alt": "Image 'alt' attribute value consists only of blank space(s)", + "fail_no_alt": "The image has neither an accessible name nor is marked as decorative or redundant", + "fail_blank_title": "The image does not have an 'alt' attribute or ARIA label, and the 'title' attribute value consists only of blank space(s)", + "group": "Images must have accessible names unless they are decorative or redundant" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: "23a2a8", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // If not visible to the screen reader, or can be ignored + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || AccNameUtil_1.AccNameUtil.isAccessibleNameIgnorable(ruleContext)) + return null; + if (AriaUtil_1.AriaUtil.getAriaLabel(ruleContext).trim().length !== 0) { + // the img has non-empty aria label + return (0, IRule_1.RulePass)("pass"); + } + var alt = ruleContext.hasAttribute("alt") ? ruleContext.getAttribute("alt") : null; + // check title attribute + if (alt === null) { + // the img has no alt or attribute, examine the title attribute + var title = ruleContext.hasAttribute("title") ? ruleContext.getAttribute("title") : null; + if (title === null || title.length === 0) { + // no title or title is empty, examine alt further + if (alt === null) { + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext, false); + if (role === 'presentation' || role === 'none') + return (0, IRule_1.RulePass)("pass"); + return (0, IRule_1.RuleFail)("fail_no_alt"); + } + if (alt.length === 0) + return (0, IRule_1.RulePass)("pass"); + } + else { + if (title.trim().length === 0) { + // title contains blank space only (title=" ") + return (0, IRule_1.RuleFail)("fail_blank_title"); + } + // title contains some text (title="some text") + return (0, IRule_1.RulePass)("pass"); + } + } + else { + if (alt.length === 0 || alt.trim().length > 0) { + // the img has empty alt (alt="") or non-empty alt (alt="some text") + return (0, IRule_1.RulePass)("pass"); + } + else { + // alt contains blank space only (alt=" ") + return (0, IRule_1.RuleFail)("fail_blank_alt"); + } + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/img_ismap_misuse.ts" +/*!******************************************!*\ + !*** ./src/v4/rules/img_ismap_misuse.ts ***! + \******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_ismap_misuse = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.img_ismap_misuse = { + id: "img_ismap_misuse", + context: "dom:img[ismap]", + refactor: { + "RPT_Img_UsemapValid": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "img_ismap_misuse.html", + "Potential_1": "img_ismap_misuse.html", + "group": "img_ismap_misuse.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Server-side image map hot-spots do not have duplicate text links", + "group": "Server-side image map hot-spots must have duplicate text links" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = false; + if (ruleContext.hasAttribute("usemap")) { + var usemap = ruleContext.getAttribute("usemap"); + usemap = usemap.trim().toLowerCase(); + var idx = usemap.indexOf("#"); + if (idx != -1) + usemap = usemap.substr(idx + 1); + if (usemap.length > 0) { + var maps = CommonUtil_1.CommonUtil.getDocElementsByTag(ruleContext, "map"); + for (var i = 0; !passed && i < maps.length; ++i) { + passed = maps[i].hasAttribute("name") && + maps[i].getAttribute("name").toLowerCase() == usemap; + } + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/img_longdesc_misuse.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/img_longdesc_misuse.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_longdesc_misuse = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.img_longdesc_misuse = { + id: "img_longdesc_misuse", + context: "dom:img[longdesc]", + refactor: { + "RPT_Img_LongDescription2": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "img_longdesc_misuse.html", + "Potential_1": "img_longdesc_misuse.html", + "group": "img_longdesc_misuse.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that the file designated by the 'longdesc' attribute contains valid HTML content (file extension not recognized)", + "group": " The 'longdesc' attribute must reference HTML content" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var longdesc = ruleContext.getAttribute("longdesc"); + // if (longdesc is bad URL) passed = false; + var ext = CommonUtil_1.CommonUtil.getFileExt(longdesc); + var passed = ext.length != 0 && CommonUtil_1.CommonUtil.isHtmlExt(ext) + || longdesc.startsWith("#") + || longdesc.startsWith("http://") + || longdesc.startsWith("https://") + || longdesc.startsWith("data:"); + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/index.ts" +/*!*******************************!*\ + !*** ./src/v4/rules/index.ts ***! + \*******************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +// This file is automatically generated by "npm run prebuild". Do not edit +__exportStar(__webpack_require__(/*! ./a_target_warning */ "./src/v4/rules/a_target_warning.ts"), exports); +__exportStar(__webpack_require__(/*! ./a_text_purpose */ "./src/v4/rules/a_text_purpose.ts"), exports); +__exportStar(__webpack_require__(/*! ./applet_alt_exists */ "./src/v4/rules/applet_alt_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./application_content_accessible */ "./src/v4/rules/application_content_accessible.ts"), exports); +__exportStar(__webpack_require__(/*! ./area_alt_exists */ "./src/v4/rules/area_alt_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_accessiblename_exists */ "./src/v4/rules/aria_accessiblename_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_activedescendant_tabindex_valid */ "./src/v4/rules/aria_activedescendant_tabindex_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_activedescendant_valid */ "./src/v4/rules/aria_activedescendant_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_application_label_unique */ "./src/v4/rules/aria_application_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_application_labelled */ "./src/v4/rules/aria_application_labelled.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_article_label_unique */ "./src/v4/rules/aria_article_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_attribute_allowed */ "./src/v4/rules/aria_attribute_allowed.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_attribute_conflict */ "./src/v4/rules/aria_attribute_conflict.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_attribute_deprecated */ "./src/v4/rules/aria_attribute_deprecated.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_attribute_exists */ "./src/v4/rules/aria_attribute_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_attribute_redundant */ "./src/v4/rules/aria_attribute_redundant.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_attribute_required */ "./src/v4/rules/aria_attribute_required.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_attribute_value_valid */ "./src/v4/rules/aria_attribute_value_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_banner_label_unique */ "./src/v4/rules/aria_banner_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_banner_single */ "./src/v4/rules/aria_banner_single.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_child_tabbable */ "./src/v4/rules/aria_child_tabbable.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_child_valid */ "./src/v4/rules/aria_child_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_complementary_label_unique */ "./src/v4/rules/aria_complementary_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_complementary_label_visible */ "./src/v4/rules/aria_complementary_label_visible.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_complementary_labelled */ "./src/v4/rules/aria_complementary_labelled.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_content_in_landmark */ "./src/v4/rules/aria_content_in_landmark.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_contentinfo_label_unique */ "./src/v4/rules/aria_contentinfo_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_contentinfo_misuse */ "./src/v4/rules/aria_contentinfo_misuse.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_contentinfo_single */ "./src/v4/rules/aria_contentinfo_single.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_descendant_valid */ "./src/v4/rules/aria_descendant_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_document_label_unique */ "./src/v4/rules/aria_document_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_eventhandler_role_valid */ "./src/v4/rules/aria_eventhandler_role_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_form_label_unique */ "./src/v4/rules/aria_form_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_graphic_labelled */ "./src/v4/rules/aria_graphic_labelled.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_hidden_nontabbable */ "./src/v4/rules/aria_hidden_nontabbable.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_id_unique */ "./src/v4/rules/aria_id_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_img_labelled */ "./src/v4/rules/aria_img_labelled.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_keyboard_handler_exists */ "./src/v4/rules/aria_keyboard_handler_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_landmark_name_unique */ "./src/v4/rules/aria_landmark_name_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_main_label_unique */ "./src/v4/rules/aria_main_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_main_label_visible */ "./src/v4/rules/aria_main_label_visible.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_navigation_label_unique */ "./src/v4/rules/aria_navigation_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_parent_required */ "./src/v4/rules/aria_parent_required.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_region_label_unique */ "./src/v4/rules/aria_region_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_region_labelled */ "./src/v4/rules/aria_region_labelled.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_role_allowed */ "./src/v4/rules/aria_role_allowed.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_role_redundant */ "./src/v4/rules/aria_role_redundant.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_search_label_unique */ "./src/v4/rules/aria_search_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_semantics */ "./src/v4/rules/aria_semantics.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_toolbar_label_unique */ "./src/v4/rules/aria_toolbar_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_widget_labelled */ "./src/v4/rules/aria_widget_labelled.ts"), exports); +__exportStar(__webpack_require__(/*! ./asciiart_alt_exists */ "./src/v4/rules/asciiart_alt_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./blink_css_review */ "./src/v4/rules/blink_css_review.ts"), exports); +__exportStar(__webpack_require__(/*! ./blink_elem_deprecated */ "./src/v4/rules/blink_elem_deprecated.ts"), exports); +__exportStar(__webpack_require__(/*! ./blockquote_cite_exists */ "./src/v4/rules/blockquote_cite_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./canvas_content_described */ "./src/v4/rules/canvas_content_described.ts"), exports); +__exportStar(__webpack_require__(/*! ./caption_track_exists */ "./src/v4/rules/caption_track_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./combobox_active_descendant */ "./src/v4/rules/combobox_active_descendant.ts"), exports); +__exportStar(__webpack_require__(/*! ./combobox_autocomplete_valid */ "./src/v4/rules/combobox_autocomplete_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./combobox_design_valid */ "./src/v4/rules/combobox_design_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./combobox_focusable_elements */ "./src/v4/rules/combobox_focusable_elements.ts"), exports); +__exportStar(__webpack_require__(/*! ./combobox_haspopup_valid */ "./src/v4/rules/combobox_haspopup_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./combobox_popup_reference */ "./src/v4/rules/combobox_popup_reference.ts"), exports); +__exportStar(__webpack_require__(/*! ./debug_paths */ "./src/v4/rules/debug_paths.ts"), exports); +__exportStar(__webpack_require__(/*! ./detector_tabbable */ "./src/v4/rules/detector_tabbable.ts"), exports); +__exportStar(__webpack_require__(/*! ./dir_attribute_valid */ "./src/v4/rules/dir_attribute_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./download_keyboard_controllable */ "./src/v4/rules/download_keyboard_controllable.ts"), exports); +__exportStar(__webpack_require__(/*! ./draggable_alternative_exists */ "./src/v4/rules/draggable_alternative_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_accesskey_labelled */ "./src/v4/rules/element_accesskey_labelled.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_accesskey_unique */ "./src/v4/rules/element_accesskey_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_attribute_deprecated */ "./src/v4/rules/element_attribute_deprecated.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_id_unique */ "./src/v4/rules/element_id_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_lang_valid */ "./src/v4/rules/element_lang_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_mouseevent_keyboard */ "./src/v4/rules/element_mouseevent_keyboard.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_orientation_unlocked */ "./src/v4/rules/element_orientation_unlocked.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_scrollable_tabbable */ "./src/v4/rules/element_scrollable_tabbable.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_tabbable_role_valid */ "./src/v4/rules/element_tabbable_role_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_tabbable_unobscured */ "./src/v4/rules/element_tabbable_unobscured.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_tabbable_visible */ "./src/v4/rules/element_tabbable_visible.ts"), exports); +__exportStar(__webpack_require__(/*! ./embed_alt_exists */ "./src/v4/rules/embed_alt_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./emoticons_alt_exists */ "./src/v4/rules/emoticons_alt_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./error_message_exists */ "./src/v4/rules/error_message_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./fieldset_label_valid */ "./src/v4/rules/fieldset_label_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./fieldset_legend_valid */ "./src/v4/rules/fieldset_legend_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./figure_label_exists */ "./src/v4/rules/figure_label_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./form_font_color */ "./src/v4/rules/form_font_color.ts"), exports); +__exportStar(__webpack_require__(/*! ./form_interaction_review */ "./src/v4/rules/form_interaction_review.ts"), exports); +__exportStar(__webpack_require__(/*! ./form_label_unique */ "./src/v4/rules/form_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./form_submit_button_exists */ "./src/v4/rules/form_submit_button_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./form_submit_review */ "./src/v4/rules/form_submit_review.ts"), exports); +__exportStar(__webpack_require__(/*! ./frame_src_valid */ "./src/v4/rules/frame_src_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./frame_title_exists */ "./src/v4/rules/frame_title_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./heading_content_exists */ "./src/v4/rules/heading_content_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./heading_markup_misuse */ "./src/v4/rules/heading_markup_misuse.ts"), exports); +__exportStar(__webpack_require__(/*! ./html_lang_exists */ "./src/v4/rules/html_lang_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./html_skipnav_exists */ "./src/v4/rules/html_skipnav_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./iframe_interactive_tabbable */ "./src/v4/rules/iframe_interactive_tabbable.ts"), exports); +__exportStar(__webpack_require__(/*! ./imagebutton_alt_exists */ "./src/v4/rules/imagebutton_alt_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./imagemap_alt_exists */ "./src/v4/rules/imagemap_alt_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./img_alt_background */ "./src/v4/rules/img_alt_background.ts"), exports); +__exportStar(__webpack_require__(/*! ./img_alt_decorative */ "./src/v4/rules/img_alt_decorative.ts"), exports); +__exportStar(__webpack_require__(/*! ./img_alt_misuse */ "./src/v4/rules/img_alt_misuse.ts"), exports); +__exportStar(__webpack_require__(/*! ./img_alt_null */ "./src/v4/rules/img_alt_null.ts"), exports); +__exportStar(__webpack_require__(/*! ./img_alt_redundant */ "./src/v4/rules/img_alt_redundant.ts"), exports); +__exportStar(__webpack_require__(/*! ./img_alt_valid */ "./src/v4/rules/img_alt_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./img_ismap_misuse */ "./src/v4/rules/img_ismap_misuse.ts"), exports); +__exportStar(__webpack_require__(/*! ./img_longdesc_misuse */ "./src/v4/rules/img_longdesc_misuse.ts"), exports); +__exportStar(__webpack_require__(/*! ./input_autocomplete_valid */ "./src/v4/rules/input_autocomplete_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./input_checkboxes_grouped */ "./src/v4/rules/input_checkboxes_grouped.ts"), exports); +__exportStar(__webpack_require__(/*! ./input_fields_grouped */ "./src/v4/rules/input_fields_grouped.ts"), exports); +__exportStar(__webpack_require__(/*! ./input_haspopup_conflict */ "./src/v4/rules/input_haspopup_conflict.ts"), exports); +__exportStar(__webpack_require__(/*! ./input_label_after */ "./src/v4/rules/input_label_after.ts"), exports); +__exportStar(__webpack_require__(/*! ./input_label_before */ "./src/v4/rules/input_label_before.ts"), exports); +__exportStar(__webpack_require__(/*! ./input_label_exists */ "./src/v4/rules/input_label_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./input_label_visible */ "./src/v4/rules/input_label_visible.ts"), exports); +__exportStar(__webpack_require__(/*! ./input_onchange_review */ "./src/v4/rules/input_onchange_review.ts"), exports); +__exportStar(__webpack_require__(/*! ./input_placeholder_label_visible */ "./src/v4/rules/input_placeholder_label_visible.ts"), exports); +__exportStar(__webpack_require__(/*! ./label_content_exists */ "./src/v4/rules/label_content_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./label_name_visible */ "./src/v4/rules/label_name_visible.ts"), exports); +__exportStar(__webpack_require__(/*! ./label_ref_valid */ "./src/v4/rules/label_ref_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./list_children_valid */ "./src/v4/rules/list_children_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./list_markup_review */ "./src/v4/rules/list_markup_review.ts"), exports); +__exportStar(__webpack_require__(/*! ./list_structure_proper */ "./src/v4/rules/list_structure_proper.ts"), exports); +__exportStar(__webpack_require__(/*! ./marquee_elem_avoid */ "./src/v4/rules/marquee_elem_avoid.ts"), exports); +__exportStar(__webpack_require__(/*! ./media_alt_brief */ "./src/v4/rules/media_alt_brief.ts"), exports); +__exportStar(__webpack_require__(/*! ./media_alt_exists */ "./src/v4/rules/media_alt_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./media_audio_transcribed */ "./src/v4/rules/media_audio_transcribed.ts"), exports); +__exportStar(__webpack_require__(/*! ./media_autostart_controllable */ "./src/v4/rules/media_autostart_controllable.ts"), exports); +__exportStar(__webpack_require__(/*! ./media_keyboard_controllable */ "./src/v4/rules/media_keyboard_controllable.ts"), exports); +__exportStar(__webpack_require__(/*! ./media_live_captioned */ "./src/v4/rules/media_live_captioned.ts"), exports); +__exportStar(__webpack_require__(/*! ./media_track_available */ "./src/v4/rules/media_track_available.ts"), exports); +__exportStar(__webpack_require__(/*! ./meta_redirect_optional */ "./src/v4/rules/meta_redirect_optional.ts"), exports); +__exportStar(__webpack_require__(/*! ./meta_refresh_delay */ "./src/v4/rules/meta_refresh_delay.ts"), exports); +__exportStar(__webpack_require__(/*! ./meta_viewport_zoomable */ "./src/v4/rules/meta_viewport_zoomable.ts"), exports); +__exportStar(__webpack_require__(/*! ./noembed_content_exists */ "./src/v4/rules/noembed_content_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./object_text_exists */ "./src/v4/rules/object_text_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./page_title_exists */ "./src/v4/rules/page_title_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./page_title_valid */ "./src/v4/rules/page_title_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./script_focus_blur_review */ "./src/v4/rules/script_focus_blur_review.ts"), exports); +__exportStar(__webpack_require__(/*! ./script_onclick_avoid */ "./src/v4/rules/script_onclick_avoid.ts"), exports); +__exportStar(__webpack_require__(/*! ./script_onclick_misuse */ "./src/v4/rules/script_onclick_misuse.ts"), exports); +__exportStar(__webpack_require__(/*! ./script_select_review */ "./src/v4/rules/script_select_review.ts"), exports); +__exportStar(__webpack_require__(/*! ./select_options_grouped */ "./src/v4/rules/select_options_grouped.ts"), exports); +__exportStar(__webpack_require__(/*! ./skip_main_described */ "./src/v4/rules/skip_main_described.ts"), exports); +__exportStar(__webpack_require__(/*! ./skip_main_exists */ "./src/v4/rules/skip_main_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./style_background_decorative */ "./src/v4/rules/style_background_decorative.ts"), exports); +__exportStar(__webpack_require__(/*! ./style_before_after_review */ "./src/v4/rules/style_before_after_review.ts"), exports); +__exportStar(__webpack_require__(/*! ./style_color_misuse */ "./src/v4/rules/style_color_misuse.ts"), exports); +__exportStar(__webpack_require__(/*! ./style_focus_visible */ "./src/v4/rules/style_focus_visible.ts"), exports); +__exportStar(__webpack_require__(/*! ./style_highcontrast_visible */ "./src/v4/rules/style_highcontrast_visible.ts"), exports); +__exportStar(__webpack_require__(/*! ./style_hover_persistent */ "./src/v4/rules/style_hover_persistent.ts"), exports); +__exportStar(__webpack_require__(/*! ./style_viewport_resizable */ "./src/v4/rules/style_viewport_resizable.ts"), exports); +__exportStar(__webpack_require__(/*! ./svg_graphics_labelled */ "./src/v4/rules/svg_graphics_labelled.ts"), exports); +__exportStar(__webpack_require__(/*! ./table_aria_descendants */ "./src/v4/rules/table_aria_descendants.ts"), exports); +__exportStar(__webpack_require__(/*! ./table_caption_empty */ "./src/v4/rules/table_caption_empty.ts"), exports); +__exportStar(__webpack_require__(/*! ./table_caption_nested */ "./src/v4/rules/table_caption_nested.ts"), exports); +__exportStar(__webpack_require__(/*! ./table_headers_exists */ "./src/v4/rules/table_headers_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./table_headers_ref_valid */ "./src/v4/rules/table_headers_ref_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./table_headers_related */ "./src/v4/rules/table_headers_related.ts"), exports); +__exportStar(__webpack_require__(/*! ./table_layout_linearized */ "./src/v4/rules/table_layout_linearized.ts"), exports); +__exportStar(__webpack_require__(/*! ./table_scope_valid */ "./src/v4/rules/table_scope_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./table_structure_misuse */ "./src/v4/rules/table_structure_misuse.ts"), exports); +__exportStar(__webpack_require__(/*! ./table_summary_redundant */ "./src/v4/rules/table_summary_redundant.ts"), exports); +__exportStar(__webpack_require__(/*! ./target_spacing_sufficient */ "./src/v4/rules/target_spacing_sufficient.ts"), exports); +__exportStar(__webpack_require__(/*! ./text_block_heading */ "./src/v4/rules/text_block_heading.ts"), exports); +__exportStar(__webpack_require__(/*! ./text_contrast_sufficient */ "./src/v4/rules/text_contrast_sufficient.ts"), exports); +__exportStar(__webpack_require__(/*! ./text_quoted_correctly */ "./src/v4/rules/text_quoted_correctly.ts"), exports); +__exportStar(__webpack_require__(/*! ./text_sensory_misuse */ "./src/v4/rules/text_sensory_misuse.ts"), exports); +__exportStar(__webpack_require__(/*! ./text_spacing_valid */ "./src/v4/rules/text_spacing_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./text_whitespace_valid */ "./src/v4/rules/text_whitespace_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./widget_tabbable_exists */ "./src/v4/rules/widget_tabbable_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./widget_tabbable_single */ "./src/v4/rules/widget_tabbable_single.ts"), exports); + + +/***/ }, + +/***/ "./src/v4/rules/input_autocomplete_valid.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/input_autocomplete_valid.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_autocomplete_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.input_autocomplete_valid = { + id: "input_autocomplete_valid", + context: "dom:input[autocomplete], dom:textarea[autocomplete], dom:select[autocomplete]", + refactor: { + "WCAG21_Input_Autocomplete": { + "Pass_0": "pass", + "Fail_1": "fail_inappropriate", + "Fail_2": "fail_invalid", + "Fail_attribute_incorrect": "fail_incorrect" + } + }, + help: { + "en-US": { + "group": "input_autocomplete_valid.html", + "pass": "input_autocomplete_valid.html", + "fail_inappropriate": "input_autocomplete_valid.html", + "fail_invalid": "input_autocomplete_valid.html", + "fail_incorrect": "input_autocomplete_valid.html" + } + }, + messages: { + "en-US": { + "group": "The 'autocomplete' attribute's token(s) must be appropriate for the input form field", + "pass": "The 'autocomplete' attribute's token(s) is appropriate for the input form field", + "fail_inappropriate": "The 'autocomplete' attribute's token(s) are not appropriate for the input form field", + "fail_invalid": "The 'autocomplete' attribute's token(s) are not appropriate for an input form field of any type", + "fail_incorrect": "The 'autocomplete' attribute has an incorrect value" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.5"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [{ + "73f2c2": { + "pass": "pass", + "fail_inappropriate": "fail", + "fail_invalid": "pass", + "fail_incorrect": "fail" + } + }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) { + return null; + } + var autocompleteAttr = ruleContext.getAttribute("autocomplete").trim().toLowerCase(); + var tokens = autocompleteAttr.split(/\s+/); + if (tokens.length === 0 || autocompleteAttr.length === 0) { + return null; + } + var cache = { + "tokensOnOff": ["on", "off"], + "tokenOptionalSection": "section-", + "tokensOptionalPurpose": ["shipping", "billing"], + "tokensMandatoryGroup1_password": ["new-password", "current-password", "one-time-code"], + "tokensMandatoryGroup1_multiline": ["street-address"], + "tokensMandatoryGroup1_month": ["cc-exp"], + "tokensMandatoryGroup1_numeric": ["cc-exp-month", + "cc-exp-year", + "transaction-amount", + "bday-day", + "bday-month", + "bday-year"], + "tokensMandatoryGroup1_date": ["bday"], + "tokensMandatoryGroup1_url": ["url", "photo"], + "tokensMandatoryGroup1_text": ["name", + "honorific-prefix", + "given-name", + "additional-name", + "family-name", + "honorific-suffix", + "nickname", + "username", + "organization-title", + "organization", + "address-line1", + "address-line2", + "address-line3", + "address-level4", + "address-level3", + "address-level2", + "address-level1", + "country", + "country-name", + "postal-code", + "cc-name", + "cc-given-name", + "cc-additional-name", + "cc-family-name", + "cc-number", + "cc-csc", + "cc-type", + "transaction-currency", + "language", + "sex"], + "tokensMandatoryGroup1_all": ["name", + "honorific-prefix", + "given-name", + "additional-name", + "family-name", + "honorific-suffix", + "nickname", + "username", + "new-password", + "current-password", + "organization-title", + "organization", + "street-address", + "address-line1", + "address-line2", + "address-line3", + "address-level4", + "address-level3", + "address-level2", + "address-level1", + "country", + "country-name", + "postal-code", + "cc-name", + "cc-given-name", + "cc-additional-name", + "cc-family-name", + "cc-number", + "cc-exp", + "cc-exp-month", + "cc-exp-year", + "cc-csc", + "cc-type", + "transaction-currency", + "transaction-amount", + "language", + "bday", + "bday-day", + "bday-month", + "bday-year", + "sex", + "url", + "photo"], + "tokensOptionalGroup2": ["home", + "work", + "mobile", + "fax", + "pager"], + "tokensMandatoryGroup2_tel": ["tel"], + "tokensMandatoryGroup2_email": ["email"], + "tokensMandatoryGroup2_url": ["impp"], + "tokensMandatoryGroup2_text": ["tel-country-code", + "tel-national", + "tel-area-code", + "tel-local", + "tel-local-prefix", + "tel-local-suffix", + "tel-extension"], + "tokensMandatoryGroup2_all": ["tel", + "tel-country-code", + "tel-national", + "tel-area-code", + "tel-local", + "tel-local-prefix", + "tel-local-suffix", + "tel-extension", + "email", + "impp"], + "tokensOptionGroup1_webauthn": ["webauthn"] + }; + var valid_values = []; + for (var key in cache) + valid_values = valid_values.concat(cache[key]); + var foundMandatoryToken = false; + var foundRecognizedToken = true; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (!tokens.every(function (r) { return valid_values.includes(r) || r.startsWith(cache['tokenOptionalSection']); })) + return (0, IRule_1.RuleFail)("fail_incorrect"); + var type = ruleContext.hasAttribute("type") ? ruleContext.getAttribute("type").trim().toLowerCase() : "text"; + var tokensMandatoryGroup1 = []; + var tokensMandatoryGroup2 = []; + var tokensOptionalGroup = []; + if (nodeName === "textarea" || nodeName === "select") { + // accept all tokens + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_all; + tokensMandatoryGroup2 = cache.tokensMandatoryGroup2_all; + if (nodeName === "textarea") + tokensOptionalGroup = cache.tokensOptionGroup1_webauthn; + } + else if (nodeName === "input") { + tokensOptionalGroup = cache.tokensOptionGroup1_webauthn; + // handle the various 'input' types + switch (type) { + // Disable check for input type=hidden for now based on scrum discussion + /* + case "hidden": + // accept all tokens + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_all; + tokensMandatoryGroup2 = cache.tokensMandatoryGroup2_all; + break; + */ + case "text": + case "search": + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_text.concat(cache.tokensMandatoryGroup1_password, cache.tokensMandatoryGroup1_url, cache.tokensMandatoryGroup1_numeric, cache.tokensMandatoryGroup1_month, cache.tokensMandatoryGroup1_date); + tokensMandatoryGroup2 = cache.tokensMandatoryGroup2_all; + break; + case "password": + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_password; + break; + case "url": + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_url; + tokensMandatoryGroup2 = cache.tokensMandatoryGroup2_url; + break; + case "email": + tokensMandatoryGroup2 = cache.tokensMandatoryGroup2_email; + break; + case "tel": + tokensMandatoryGroup2 = cache.tokensMandatoryGroup2_tel; + break; + case "number": + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_numeric; + break; + case "month": + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_month; + break; + case "date": + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_date; + break; + default: + // unsupported type for this rule. + return null; + } + } + else { + // should never get here. + return null; + } + // Disable check for input type=hidden for now based on scrum discussion + var autofillMantle = /* (nodeName==="input" && type==="hidden") ? "anchor" : */ "expectation"; + if (autofillMantle === "expectation") { + // check on|off for expectation mantle. + if (tokens.includes("on") || tokens.includes("off")) { + // on|off should be the only token + if (tokens.length === 1) { + return (0, IRule_1.RulePass)("pass"); + } + else { + return (0, IRule_1.RuleFail)("fail_invalid"); + } + } + } + // check detail autofill tokens + var currIndex = 0; + var currRecognizedIndex = 0; + // check optional 'section-*' tokens + if (tokens[currIndex].startsWith(cache.tokenOptionalSection) && + tokens[currIndex].length > 8) { + currIndex++; // consume token + currRecognizedIndex++; + } + // check optional 'shipping|billing' tokens + if (tokens.length > currIndex && + cache.tokensOptionalPurpose.includes(tokens[currIndex])) { + currIndex++; // consume token + currRecognizedIndex++; + } + // check either mandatory group 1 or 2 tokens + if (tokens.length > currIndex) { + // check mandatory group 1 + if (tokensMandatoryGroup1.includes(tokens[currIndex])) { + foundMandatoryToken = true; + currIndex++; + } + else { + // check optional tokens for group 2 + if (cache.tokensOptionalGroup2.includes(tokens[currIndex])) { + currIndex++; + } + // check mandatory group 2 + if (tokensMandatoryGroup2.includes(tokens[currIndex])) { + foundMandatoryToken = true; + currIndex++; + } + } + } + // check either mandatory group 1 or 2 tokens + if (tokens.length > currRecognizedIndex) { + // check mandatory group 1 + if (cache.tokensMandatoryGroup1_all.includes(tokens[currRecognizedIndex])) { + foundRecognizedToken = true; + currRecognizedIndex++; + } + else { + // check optional tokens for group 2 + if (cache.tokensOptionalGroup2.includes(tokens[currRecognizedIndex])) { + currRecognizedIndex++; + } + // check mandatory group 2 + if (cache.tokensMandatoryGroup2_all.includes(tokens[currRecognizedIndex])) { + foundRecognizedToken = true; + currRecognizedIndex++; + } + } + } + if (tokens.length > currIndex + currRecognizedIndex) { + // check optional tokens webauthn + if (tokensOptionalGroup.includes(tokens[currIndex + currRecognizedIndex])) { + currIndex++; + } + } + if ((tokens.length > currIndex && tokensOptionalGroup.includes(tokens[currIndex])) + || (tokens.length > currRecognizedIndex && tokensOptionalGroup.includes(tokens[currRecognizedIndex]))) { + currIndex++; + currRecognizedIndex++; + } + // Only pass if we have seen either of the mandatory groups and all tokens have been consumed + if (foundMandatoryToken && tokens.length === currIndex) { + return (0, IRule_1.RulePass)("pass"); + } + else if (foundRecognizedToken && tokens.length === currRecognizedIndex) { + return (0, IRule_1.RuleFail)("fail_incorrect"); + } + else { + return (0, IRule_1.RuleFail)("fail_inappropriate"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/input_checkboxes_grouped.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/input_checkboxes_grouped.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_checkboxes_grouped = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var TableUtil_1 = __webpack_require__(/*! ../util/TableUtil */ "./src/v4/util/TableUtil.ts"); +exports.input_checkboxes_grouped = { + id: "input_checkboxes_grouped", + context: "dom:input[type=radio], dom:input[type=checkbox]", + refactor: { + "WCAG20_Input_RadioChkInFieldSet": { + "Pass_LoneNogroup": "pass_lonenogroup", + "Pass_Grouped": "pass_grouped", + "Pass_RadioNoName": "pass_radioNoName", + "Fail_ControlNameMismatch": "fail_controlnamemismatch", + "Fail_NotGroupedOtherGrouped": "fail_notgroupedothergrouped", + "Fail_NotGroupedOtherNotGrouped": "fail_notgroupedothernotgrouped", + "Fail_NotSameGroup": "fail_notsamegroup", + "Potential_LoneCheckbox": "potential_lonecheckbox", + "Potential_UnnamedCheckbox": "potential_unnamedcheckbox" + } + }, + help: { + "en-US": { + "group": "input_checkboxes_grouped.html", + "pass_lonenogroup": "input_checkboxes_grouped.html", + "pass_grouped": "input_checkboxes_grouped.html", + "pass_radiononame": "input_checkboxes_grouped.html", + "fail_controlnamemismatch": "input_checkboxes_grouped.html", + "fail_notgroupedothergrouped": "input_checkboxes_grouped.html", + "fail_notgroupedothernotgrouped": "input_checkboxes_grouped.html", + "fail_notsamegroup": "input_checkboxes_grouped.html", + "potential_lonecheckbox": "input_checkboxes_grouped.html", + "potential_unnamedcheckbox": "input_checkboxes_grouped.html" + } + }, + messages: { + "en-US": { + "group": "Related sets of radio buttons or checkboxes should be programmatically grouped", + "pass_lonenogroup": "{0} grouping not required for a control of this type", + "pass_grouped": "{0} input is grouped with other related controls with the same name", + "pass_radiononame": "Radio input is not grouped, but passes because it has no name to group with other radio inputs", + "fail_controlnamemismatch": "{0} input found that has the same name, \"{2}\" as a {1} input", + "fail_notgroupedothergrouped": "{0} input is not in the group with another {0} with the name \"{1}\"", + "fail_notgroupedothernotgrouped": "{0} input and others with the name \"{1}\" are not grouped together", + "fail_notsamegroup": "{0} input is in a different group than another {0} with the name \"{1}\"", + "potential_lonecheckbox": "Verify that this ungrouped checkbox input is not related to other checkboxes", + "potential_unnamedcheckbox": "Verify that this un-named, ungrouped checkbox input is not related to other checkboxes" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var getGroup = function (e) { + var retVal = CommonUtil_1.CommonUtil.getAncestor(e, "fieldset") + || AriaUtil_1.AriaUtil.getAncestorWithRole(e, "radiogroup") + || AriaUtil_1.AriaUtil.getAncestorWithRole(e, "group") + || AriaUtil_1.AriaUtil.getAncestorWithRole(e, "grid") + || AriaUtil_1.AriaUtil.getAncestorWithRole(e, "table"); + if (!retVal) { + retVal = CommonUtil_1.CommonUtil.getAncestor(e, "table"); + if (retVal && !TableUtil_1.TableUtil.isDataTable(retVal)) { + retVal = null; + } + } + return retVal; + }; + // Only radio buttons and checkboxes are in scope + var ctxType = ruleContext.getAttribute("type").toLowerCase(); + // Determine which form we're in (if any) to determine our scope + var ctxForm = AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, "form") + || CommonUtil_1.CommonUtil.getAncestor(ruleContext, "html") + || ruleContext.ownerDocument.documentElement; + // Get data about all of the visible checkboxes and radios in the scope of this form + // and cache it for all of the other inputs in this scope + var formCache = CacheUtil_1.CacheUtil.getCache(ctxForm, "input_checkboxes_grouped", null); + if (!formCache) { + formCache = { + checkboxByName: {}, + radiosByName: {}, + nameToGroup: {}, + numCheckboxes: 0, + numRadios: 0 + }; + // Get all of the checkboxes in the form or body (but not nested in something else and not hidden) + // And get a mapping of these checkboxes to + var cWalker = new DOMWalker_1.DOMWalker(ctxForm, false, ctxForm, true); + var checkboxQ = []; + var radiosQ = []; + while (cWalker.nextNode()) { + if (!cWalker.bEndTag + && cWalker.node.nodeType === 1 + && cWalker.node.nodeName.toLowerCase() === "input" + && VisUtil_1.VisUtil.isNodeVisible(cWalker.node)) { + var type = cWalker.node.getAttribute("type"); + if (type === "checkbox") { + checkboxQ.push(cWalker.node); + } + else if (type === "radio") { + radiosQ.push(cWalker.node); + } + } + } + // let checkboxQ = ctxForm.querySelectorAll("input[type=checkbox]"); + for (var idx = 0; idx < checkboxQ.length; ++idx) { + var cb = checkboxQ[idx]; + if ((AriaUtil_1.AriaUtil.getAncestorWithRole(cb, "form") + || CommonUtil_1.CommonUtil.getAncestor(ruleContext, "html") + || ruleContext.ownerDocument.documentElement) === ctxForm + && !CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(cb)) { + var name_1 = cb.getAttribute("name") || ""; + (formCache.checkboxByName[name_1] = formCache.checkboxByName[name_1] || []).push(cb); + formCache.nameToGroup[name_1] = formCache.nameToGroup[name_1] || getGroup(cb); + ++formCache.numCheckboxes; + } + } + // Get all of the radios in the form or body (but not nested in something else and not hidden) + // let radiosQ = ctxForm.querySelectorAll("input[type=radio]"); + for (var idx = 0; idx < radiosQ.length; ++idx) { + var r = radiosQ[idx]; + var radCtx = (AriaUtil_1.AriaUtil.getAncestorWithRole(r, "form") + || CommonUtil_1.CommonUtil.getAncestor(ruleContext, "html") + || ruleContext.ownerDocument.documentElement); + if (radCtx === ctxForm + && !CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(r)) { + var name_2 = r.getAttribute("name") || ""; + (formCache.radiosByName[name_2] = formCache.radiosByName[name_2] || []).push(r); + formCache.nameToGroup[name_2] = formCache.nameToGroup[name_2] || getGroup(r); + ++formCache.numRadios; + } + } + CacheUtil_1.CacheUtil.setCache(ctxForm, "input_checkboxes_grouped", formCache); + } + ///////////// Calculated everything, now check the various cases + var ctxName = ruleContext.getAttribute("name"); + var ctxGroup = getGroup(ruleContext); + ctxType = ctxType === "radio" ? "Radio" : "Checkbox"; + if (!ctxName || ctxName === "") { + // First process cases where the control is not named + if (ctxType === "Radio") { + // Radios without names don't act like groups, so don't enforce grouping + if (ctxGroup === null) { + return (0, IRule_1.RulePass)("pass_radiononame", [ctxType]); + } + else { + return (0, IRule_1.RulePass)("pass_grouped", [ctxType]); + } + } + else { + // Must be an unnamed checkbox + if (ctxGroup === null) { + if ((formCache.checkboxByName[""] || []).length > 1) { + return (0, IRule_1.RulePotential)("potential_unnamedcheckbox", [ctxType]); + } + else { + return (0, IRule_1.RulePass)("pass_lonenogroup", [ctxType]); + } + } + else { + return (0, IRule_1.RulePass)("pass_grouped", [ctxType]); + } + } + } + else { + // Considering a named checkbox + var numRadiosWithName = (formCache.radiosByName[ctxName] || []).length; + var numCheckboxesWithName = (formCache.checkboxByName[ctxName] || []).length; + // Capitalize the input type for messages + if (numRadiosWithName > 0 && numCheckboxesWithName > 0) { + // We have a naming mismatch between different controls + return (0, IRule_1.RuleFail)("fail_controlnamemismatch", [ctxType, ctxType === "checkbox" ? "radio" : "checkbox", ctxName]); + } + else if (ctxType === "Radio" && (formCache.numRadios === 1 || numRadiosWithName === 1) + || ctxType === "Checkbox" && formCache.numCheckboxes === 1) { + // This is a lone control (either only control of this type on the page, or a radio button without any others by that name) + // We pass this control in all cases + if (ctxGroup === null) { + return (0, IRule_1.RulePass)("pass_lonenogroup", [ctxType]); + } + else { + return (0, IRule_1.RulePass)("pass_grouped", [ctxType]); + } + } + else if (ctxType === "Checkbox" && formCache.numCheckboxes > 1 && numCheckboxesWithName === 1) { + // We have only one checkbox with this name, but there are other checkboxes in the form. + // If we're not grouped, ask them to examine it + if (ctxGroup === null) { + return (0, IRule_1.RulePotential)("potential_lonecheckbox", [ctxType]); + } + else { + return (0, IRule_1.RulePass)("pass_grouped", [ctxType]); + } + } + else { + // We share a name with another similar control. Are we grouped together? + if (ctxGroup === null) { + if (formCache.nameToGroup[ctxName] !== null) { + // We're not grouped, but some control with the same name is in a group + return (0, IRule_1.RuleFail)("fail_notgroupedothergrouped", [ctxType, ctxName]); + } + else { + // None of us are grouped + return (0, IRule_1.RuleFail)("fail_notgroupedothernotgrouped", [ctxType, ctxName]); + } + } + else if (formCache.nameToGroup[ctxName] !== ctxGroup) { + // We're not in the main group with the others + return (0, IRule_1.RuleFail)("fail_notsamegroup", [ctxType, ctxName]); + } + else { + // We're all grouped up! + return (0, IRule_1.RulePass)("pass_grouped", [ctxType]); + } + } + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/input_fields_grouped.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/input_fields_grouped.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_fields_grouped = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.input_fields_grouped = { + id: "input_fields_grouped", + context: "dom:input, dom:textarea, dom:select", + refactor: { + "WCAG20_Input_InFieldSet": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "input_fields_grouped.html", + "Potential_1": "input_fields_grouped.html", + "group": "input_fields_grouped.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Use the <fieldset> element to group logically related input elements", + "group": "Groups of logically related input elements should be contained within a <fieldset> element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Don't trigger for other input types or if we're in a fieldset + if (ruleContext.nodeName.toLowerCase() == "input" && ruleContext.hasAttribute("type")) { + var type = ruleContext.getAttribute("type").toLowerCase(); + if (type != "text" && type != "file" && type != "password") + return (0, IRule_1.RulePass)("Pass_0"); + } + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, "fieldset") != null) + return (0, IRule_1.RulePass)("Pass_0"); + // No fieldset - see if this input is all by itself - no need to group single inputs + var parent = CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["form", "body"]); + var checkTypes = ["input", "textarea", "select"]; + var passed = true; + for (var i = 0; passed && i < checkTypes.length; ++i) { + var controls = parent.getElementsByTagName(checkTypes[i]); + for (var j = 0; passed && j < controls.length; ++j) { + // Check if the node should be skipped or not based on the Check Hidden Content setting and if the node isVisible or + // not. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(controls[j])) { + continue; + } + // Note that textareas and selects will be called type='text' + var type = controls[j].hasAttribute("type") ? controls[j].getAttribute("type").toLowerCase() : "text"; + // Only fail if this is another control in the form and its type is another text-like input + passed = controls[j] == ruleContext || (type != "text" && type != "password" && type != "file"); + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/input_haspopup_conflict.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/input_haspopup_conflict.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_haspopup_conflict = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.input_haspopup_conflict = { + id: "input_haspopup_conflict", + context: "dom:input[list][aria-haspopup]", + refactor: { + "input_haspopup_invalid": { + // "Pass": "pass", + "Potential_1": "potential_type_misuse", + "Potential_2": "potential_misuse" + } + }, + help: { + "en-US": { + "group": "input_haspopup_conflict.html", + // "pass": "input_haspopup_conflict.html", + "potential_type_misuse": "input_haspopup_conflict.html", + "potential_misuse": "input_haspopup_conflict.html", + "potential_list_notexist": "input_haspopup_conflict.html", + "fail_invalid_list_type": "input_haspopup_conflict.html", + "fail_invalid_list_elem": "input_haspopup_conflict.html" + } + }, + messages: { + "en-US": { + "group": "<input> element with a 'list' attribute should not use an explicit 'aria-haspopup' attribute", + // "pass": "The <input> element with a 'list' attribute does not use an explicit 'aria-haspopup' attribute", + "potential_type_misuse": "The <input> element with type \"{0}\" and 'list' attribute uses an explicit 'aria-haspopup' attribute", + "potential_misuse": "The <input> element with a missing or invalid type and 'list' attribute uses an explicit 'aria-haspopup' attribute", + "potential_list_notexist": "The list attribute for the <input> element is invalid", + "fail_invalid_list_type": "The list attribute for the <input> element with the type \"{0}\" is invalid", + "fail_invalid_list_elem": "The list attribute for the <input> element does not reference a datalist element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip if the fieldset is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return null; + var roles = AriaUtil_1.AriaUtil.getUserDefinedRoles(ruleContext); + // let "aria_role_valid" to handle invalid role. Only allowed role is combobox which is implicit. + if (roles && roles.length > 0 && !roles.includes('combobox')) + return null; + //triggering input types: text, search, tel, url, email, or missing or invalid + var yesTypes = ["text", "search", "tel", "url", "email", "date", "month", "week", "time", "datetime-local", "number", "range", "color"]; + var noTypes = ["file", "password", "checkbox", "radio", "submit", "reset", "image", "hidden", "button"]; + var attrValue = ruleContext.getAttribute("type"); + //missing input type for list but with aria_has_popup + if (!attrValue || attrValue.trim().length === 0) + return (0, IRule_1.RulePotential)("potential_misuse"); + attrValue = attrValue.trim().toLowerCase(); + //invalid input types for list but with aria_has_popup + if (!yesTypes.includes(attrValue) && !noTypes.includes(attrValue)) + return (0, IRule_1.RulePotential)("potential_misuse"); + // the list attribute is used for wrong input type + if (attrValue && noTypes.includes(attrValue)) + return (0, IRule_1.RuleFail)("fail_invalid_list_type"); + var list = ruleContext.getAttribute("list"); + // the list attribute is blank + if (!list || list.trim().length === 0) + return (0, IRule_1.RulePotential)("potential_list_notexist"); + var listElem = ruleContext.ownerDocument.getElementById(list); + // the list element doesn't exist + if (!listElem) + return (0, IRule_1.RuleFail)("potential_list_notexist"); + // the list element is not a datalist element + if (listElem.nodeName.toLowerCase() !== 'datalist') + return (0, IRule_1.RuleFail)("fail_invalid_list_elem"); + // valid input types for list but with aria_has_popup + if (yesTypes.includes(attrValue)) + return (0, IRule_1.RulePotential)("potential_type_misuse", [attrValue]); + // shouldn't get here + return; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/input_label_after.ts" +/*!*******************************************!*\ + !*** ./src/v4/rules/input_label_after.ts ***! + \*******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_label_after = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.input_label_after = { + id: "input_label_after", + context: "dom:input", + refactor: { + "WCAG20_Input_LabelAfter": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_0": "input_label_after.html", + "Fail_1": "input_label_after.html", + "Fail_2": "input_label_after.html", + "group": "input_label_after.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Checkbox or radio button is nested in label, so label is not after the input control", + "Fail_2": "Label text is located before its associated checkbox or radio button element", + "group": "Checkboxes and radio buttons must have a label after the input control" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.3.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var type = ""; + if (ruleContext.hasAttribute("type")) + type = ruleContext.getAttribute("type").toLowerCase(); + if (type != "checkbox" && type != "radio") { + return null; + } + // Get only the non-hidden labels for element + var labelElem = CommonUtil_1.CommonUtil.getLabelForElementHidden(ruleContext, true); + if (labelElem === null || !CommonUtil_1.CommonUtil.hasInnerContentHidden(labelElem)) { + // Due to dependency, label must be done via title - this rule doesn't apply + return null; + } + var value = CommonUtil_1.CommonUtil.compareNodeOrder(labelElem, ruleContext); + var passed; + if (value === -2) { + // input nested in label + passed = false; + var walkNode = new DOMWalker_1.DOMWalker(labelElem); + walkNode.node = ruleContext; + while (!passed && walkNode.nextNode()) { + passed = ((walkNode.node.nodeName.toLowerCase() === "#text" && walkNode.node.nodeValue.trim().length > 0) + || (walkNode.node.nodeName.toLowerCase() === "span" && walkNode.node.textContent.trim().length > 0)); + } + if (!passed) { + // Input nested in label and text before input + return (0, IRule_1.RuleFail)("Fail_1"); + } + } + else { + if (value != 1) { + // label is before input + return (0, IRule_1.RuleFail)("Fail_2"); + } + } + return (0, IRule_1.RulePass)("Pass_0"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/input_label_before.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/input_label_before.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_label_before = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.input_label_before = { + id: "input_label_before", + context: "dom:input, dom:textarea, dom:select", + refactor: { + "WCAG20_Input_LabelBefore": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_0": "input_label_before.html", + "Fail_1": "input_label_before.html", + "Fail_2": "input_label_before.html", + "group": "input_label_before.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Text input is nested in label such that input precedes the label text", + "Fail_2": "Label text is located after its associated text input or <select> element", + "group": "Text inputs and <select> elements must have a label before the input control" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.3.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (ruleContext.nodeName.toLowerCase() == "input" && ruleContext.hasAttribute("type")) { + var type = ruleContext.getAttribute("type").toLowerCase(); + if (type != "text" && type != "file" && type != "password") { + return null; + } + } + // Get only the non-hidden labels for element + var labelElem = CommonUtil_1.CommonUtil.getLabelForElementHidden(ruleContext, true); + if (labelElem == null || !CommonUtil_1.CommonUtil.hasInnerContentHidden(labelElem)) { + // Due to dependency, label must be done via title - this rule doesn't apply + return null; + } + var value = CommonUtil_1.CommonUtil.compareNodeOrder(labelElem, ruleContext); + if (value === -2) { + // ignore if no label or the content for the label is only from the nested input control + var text = CommonUtil_1.CommonUtil.getInnerText(ruleContext); + if (text && text.trim().length > 0 && CommonUtil_1.CommonUtil.getInnerText(ruleContext).trim() === text.trim()) { + // Due to dependency, label must be done via title - this rule doesn't apply + return null; + } + // input nested in label + var passed = false; + var walkNode = ruleContext.previousSibling; + while (!passed && walkNode !== null) { + passed = ((walkNode.nodeName.toLowerCase() == "#text" && walkNode.nodeValue.trim().length > 0) + || (walkNode.nodeName.toLowerCase() == "span" && walkNode.textContent.trim().length > 0)); + walkNode = walkNode.previousSibling; + } + if (!passed) { + // Input nested in label and text after input + return (0, IRule_1.RuleFail)("Fail_1"); + } + } + else { + if (value != -1) { + // label is after input + return (0, IRule_1.RuleFail)("Fail_2"); + } + } + // Haven't returned yet, then I pass + return (0, IRule_1.RulePass)("Pass_0"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/input_label_exists.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/input_label_exists.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_label_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +exports.input_label_exists = { + id: "input_label_exists", + context: "aria:button,aria:checkbox,aria:combobox,aria:listbox,aria:menuitemcheckbox,aria:menuitemradio,aria:radio,aria:searchbox,aria:slider,aria:spinbutton,aria:switch,aria:textbox,aria:progressbar,dom:input[type=file],dom:output,dom:meter,dom:input[type=password]", + //dependencies: ["aria_role_redundant", "aria_role_valid"], + refactor: { + "WCAG20_Input_ExplicitLabel": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_0": "input_label_exists.html", + "Fail_1": "input_label_exists.html", + "Fail_2": "input_label_exists.html", + "group": "input_label_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Form control element <{0}> has no associated label", + "Fail_2": "Form control with \"{0}\" role has no associated label", + "group": "Each form control must have an associated label" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + // TODO: ACT: https://github.com/IBMa/equal-access/issues/756 + act: ["97a4e1", "e086e5"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) { + return null; + } + var nodeName = ruleContext.nodeName.toLowerCase(); + //ignore datalist element check since it will be part of a input element or hidden by default + if (nodeName === 'datalist') + return null; + // Determine the input type + var passed = true; + var type = "text"; + if (nodeName == "input" && ruleContext.hasAttribute("type")) { + type = ruleContext.getAttribute("type").toLowerCase(); + } + else if (nodeName === "button" || AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "button")) { + type = "buttonelem"; + } + if (nodeName == "input" && type == "") { + type = "text"; + } + if (type === "image") { + // Handled by input_label_existsImage + return null; + } + /** + let POF = -1; + let textTypes = CommonUtil.input_text_types; + let buttonTypes = CommonUtil.form_button_types; + + let buttonTypesWithDefaults = ["reset", "submit"]; // 'submit' and 'reset' have visible defaults. + if (textTypes.indexOf(type) !== -1) { // If type is in the list + // Get only the non-hidden labels for elements, in the case that a label is hidden then it is a violation + // Note: label[for] does not work for ARIA defined inputs + let labelElem = ruleContext.hasAttribute("role") ? null : CommonUtil.getLabelForElementHidden(ruleContext, true); + let hasLabelElemContent = false; + if (labelElem) { + if (CommonUtil.hasInnerContentHidden(labelElem)) { + hasLabelElemContent = true; + } else if ((labelElem.getAttribute("aria-label") || "").trim().length > 0) { + hasLabelElemContent = true; + } else if (labelElem.hasAttribute("aria-labelledby")) { + let labelledByElem = FragmentUtil.getById(labelElem, labelElem.getAttribute('aria-labelledby')); + if (labelledByElem && !DOMUtil.sameNode(labelledByElem, labelElem) && CommonUtil.hasInnerContent(labelledByElem)) { + hasLabelElemContent = true; + } + } + } + passed = (!!labelElem && hasLabelElemContent) || + (!labelElem && CommonUtil.attributeNonEmpty(ruleContext, "title") || CommonUtil.attributeNonEmpty(ruleContext, "placeholder")) || + AriaUtil.getAriaLabel(ruleContext).trim().length > 0 || CommonUtil.hasImplicitLabel(ruleContext); + if (!passed) POF = 2 + textTypes.indexOf(type); + + } else if (buttonTypes.indexOf(type) !== -1) { // If type is a button + if (buttonTypesWithDefaults.indexOf(type) !== -1 && !ruleContext.hasAttribute("value")) { + // 'submit' and 'reset' have visible defaults so pass if there is no 'value' attribute + passed = true; + } else { + passed = CommonUtil.attributeNonEmpty(ruleContext, "value") || AriaUtil.hasAriaLabel(ruleContext) || CommonUtil.attributeNonEmpty(ruleContext, "title"); + if (!passed) POF = 2 + textTypes.length + buttonTypes.indexOf(type); + } + } else if (type == "buttonelem") { + // If I am an image and I have alt text - accessibility-web-engine#269 + let bAlt = false; + if (ruleContext.nodeName.toLowerCase() === "img" && ruleContext.hasAttribute("alt")) { + let alt = ruleContext.getAttribute("alt"); + if (alt.trim().length === 0) { + bAlt = false; + } else { + bAlt = true; + } + }; + passed = CommonUtil.hasInnerContentHidden(ruleContext) || AriaUtil.hasAriaLabel(ruleContext) || bAlt || CommonUtil.attributeNonEmpty(ruleContext, "title"); + + if (!passed) POF = 2 + textTypes.length + buttonTypes.length + 1; + } + + //check if a native button is labelled + if (!passed && nodeName == "button") { + if (CommonUtil.hasImplicitLabel(ruleContext)) + passed = true; + else { + let label = CommonUtil.getLabelForElement(ruleContext); + if (label && CommonUtil.hasInnerContentHidden(label)) + passed = true; + } + } + + // Rpt_Aria_ValidIdRef determines if the aria-labelledby id points to a valid element + if (!passed && (buttonTypes.indexOf(type) !== -1)) { + if (ruleContext.hasAttribute("class") && ruleContext.getAttribute("class") == "dijitOffScreen" && DOMWalker.parentElement(ruleContext).hasAttribute("widgetid")) { + // Special handling for dijit buttons + let labelId = DOMWalker.parentElement(ruleContext).getAttribute("widgetid") + "_label"; + let label = FragmentUtil.getById(ruleContext, labelId); + if (label != null) { + passed = CommonUtil.hasInnerContentHidden(label); + // This means I failed above also + if (!passed) POF = 2 + textTypes.length + buttonTypes.length + 4 + buttonTypes.indexOf(type); + } + } + } + + if (!passed && nodeName == "optgroup") { + passed = CommonUtil.attributeNonEmpty(ruleContext, "label"); + if (!passed) POF = 2 + textTypes.length + buttonTypes.length + 2; + } + if (!passed && nodeName == "option") { + // Is a non-empty value attribute also enough for an option element? + passed = CommonUtil.attributeNonEmpty(ruleContext, "label") || ruleContext.innerHTML.trim().length > 0; + if (!passed) POF = 2 + textTypes.length + buttonTypes.length + 3; + } + + if (!passed) + passed = AriaUtil.getAriaLabel(ruleContext).trim().length > 0 || CommonUtil.attributeNonEmpty(ruleContext, "title"); + + if (!passed) { + // check aria role to figure out if the accessible name can be from content + const roles = AriaUtil.getRoles(ruleContext, true); + //when multiple roles specified, only the first valid role (guaranteed by dependencies) is applied, and the others just as fallbacks + if (ARIADefinitions.designPatterns[roles[0]] && ARIADefinitions.designPatterns[roles[0]].nameFrom && ARIADefinitions.designPatterns[roles[0]].nameFrom.includes("contents")) + passed = CommonUtil.hasInnerContentHidden(ruleContext); + } + */ + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + passed = pair && pair.name && pair.name.trim().length > 0; + if (passed) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else if (ruleContext.hasAttribute("role") && ruleContext.getAttribute("role").trim().length > 0) { + return (0, IRule_1.RuleFail)("Fail_2", ruleContext.getAttribute("role").split(" ")); + } + else { + return (0, IRule_1.RuleFail)("Fail_1", [nodeName]); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/input_label_visible.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/input_label_visible.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_label_visible = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +exports.input_label_visible = { + id: "input_label_visible", + context: "aria:button,aria:checkbox,aria:combobox,aria:listbox,aria:menuitemcheckbox,aria:menuitemradio,aria:radio,aria:searchbox,aria:slider,aria:spinbutton,aria:switch,aria:textbox", + dependencies: ["input_label_exists"], + refactor: { + "WCAG20_Input_VisibleLabel": { + "Pass_0": "pass", + "Potential_1": "potential_no_label", + "potential_placeholder_only": "potential_placeholder_only" + } + }, + help: { + "en-US": { + "pass": "input_label_visible.html", + "potential_placeholder_only": "input_label_visible.html", + "potential_no_label": "input_label_visible.html", + "group": "input_label_visible.html" + } + }, + messages: { + "en-US": { + "pass": "The input element has an associated visible label", + "potential_placeholder_only": "The ‘placeholder’ is the only visible label", + "potential_no_label": "The input element does not have an associated visible label", + "group": "An input element must have an associated visible label" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.5.3", "3.3.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + //ignore datalist element check since it will be part of a input element or hidden by default + if (nodeName === 'datalist') + return null; + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return null; + // if a control is in a table cell, the col headers can act as visible label, which is checked in table heading rule + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, "table")) + return null; + // custom widget submission is not in scope for this success criteria (IBMa/equal-access#204) if it is not associated with data entry + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + if (role && role === "button" && nodeName !== 'input' && nodeName !== 'button') { + // likely a custom widget, skip if not associated with data entry + if (!CommonUtil_1.CommonUtil.getAncestor(ruleContext, "form")) + return null; + } + // when in a combobox, only look at the input textbox. + if (AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, "combobox") && + !(AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "textbox") || AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "searchbox") || + nodeName === "input" || (nodeName === "select" && AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "combobox")))) { + return null; + } + // avoid diagnosing the popup list of a combobox. + var rolesToCheck = ["listbox", "tree", "grid", "dialog"]; + for (var j = 0; j < rolesToCheck.length; j++) { + if (AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, rolesToCheck[j])) { + var comboboxes = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "combobox", true, true); + for (var k = 0; k < comboboxes.length; k++) { + var combobox = comboboxes[k]; + var aria_owns = CommonUtil_1.CommonUtil.getElementAttribute(combobox, "aria-owns"); + if (aria_owns) { + var owns = CommonUtil_1.CommonUtil.normalizeSpacing(aria_owns.trim()).split(" "); + for (var i = 0; i < owns.length; i++) { + var owned = fragment_1.FragmentUtil.getById(ruleContext, owns[i]); + if (owned === ruleContext) { + return null; + } + } + } + } + } + } + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + // check visible label for input or button + if (nodeName === 'input' || nodeName === 'button') { + if (pair && pair.name && pair.name.trim().length > 0 && (pair.nameFrom === 'label' || pair.nameFrom === 'internal' || pair.nameFrom === 'alt')) + return (0, IRule_1.RulePass)("pass"); + } + // check if an alternative tooltip exists that can be made visible through mouseover + if (pair && pair.name && pair.name.trim().length > 0 && (pair.nameFrom === 'text' || pair.nameFrom === 'title')) + return (0, IRule_1.RulePass)("pass"); + // check if any visible text from the control. + // note that (1) the text doesn’t need to be associated with the control to form a relationship + // (2) the text doesn't need to follow accessible name requirement (e.g. nameFrom) + var text = CommonUtil_1.CommonUtil.getOnScreenInnerText(ruleContext); + if (text && text.length !== 0) + return (0, IRule_1.RulePass)("pass"); + // check if any descendant with an alternative tooltip that can be made visible through mouseover + // only consider img and svg, and other text content of the descendant is covered in the isInnerText above + var descendants = AriaUtil_1.AriaUtil.getAllDescendantsWithRoles(ruleContext, ["img", "graphics-document", "graphics-object", "graphics-symbol"], false, true); + if (descendants && descendants.length > 0) { + for (var d = 0; d < descendants.length; d++) { + if (CommonUtil_1.CommonUtil.attributeNonEmpty(descendants[d], "title") || CommonUtil_1.CommonUtil.attributeNonEmpty(descendants[d], "alt")) + return (0, IRule_1.RulePass)("pass"); + } + } + // check if there is a visible label pointed to by the aria-labelledby attribute. + if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "aria-labelledby")) { + var theLabel = ruleContext.getAttribute("aria-labelledby"); + var labelValues = theLabel.split(/\s+/); + for (var j = 0; j < labelValues.length; ++j) { + var elementById = fragment_1.FragmentUtil.getById(ruleContext, labelValues[j]); + if (elementById && !DOMUtil_1.DOMUtil.sameNode(elementById, ruleContext) && VisUtil_1.VisUtil.isNodeVisible(elementById) && CommonUtil_1.CommonUtil.hasInnerContentHidden(elementById)) { + return (0, IRule_1.RulePass)("pass"); + } + } + } + if ((nodeName === "optgroup" || nodeName == "option") && (pair && pair.name && pair.name.trim().length > 0 && (pair.nameFrom === 'label' || pair.nameFrom === 'content'))) + return (0, IRule_1.RulePass)("pass"); + // Determine if this is referenced by a combobox. If so, the label belongs to the combobox + var id = ruleContext.getAttribute("id"); + if (id && id.trim().length > 0) { + if (ruleContext.ownerDocument.querySelector("*[aria-controls='".concat(id, "'][role='combobox']"))) { + return null; + } + } + // check if a placeholder exists even though a placeholder text is not sufficient as a visible text + if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "placeholder")) + return (0, IRule_1.RulePotential)("potential_placeholder_only"); + return (0, IRule_1.RulePotential)("potential_no_label"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/input_onchange_review.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/input_onchange_review.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_onchange_review = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.input_onchange_review = { + id: "input_onchange_review", + context: "dom:input[onchange], dom:textarea[onchange], dom:select[onchange]", + refactor: { + "WCAG20_Input_HasOnchange": { + // "Pass_0": "pass", + "Potential_1": "potential_warning" + } + }, + help: { + "en-US": { + // "pass": "input_onchange_review.html", + "potential_warning": "input_onchange_review.html", + "group": "input_onchange_review.html" + } + }, + messages: { + "en-US": { + "group": "Users must be advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs", + // "pass": "The user is advised of the automatic form submission, new window opening, or focus change", + "potential_warning": "Confirm that the user is advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.2.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (ruleContext.nodeName.toLowerCase() == "input" && ruleContext.hasAttribute("type")) { + var type = ruleContext.getAttribute("type").toLowerCase(); + if (type === "hidden" || type === "submit" || type === "image" || type === "button" || type === "reset") + return null; + } + return (0, IRule_1.RulePotential)("potential_warning"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/input_placeholder_label_visible.ts" +/*!*********************************************************!*\ + !*** ./src/v4/rules/input_placeholder_label_visible.ts ***! + \*********************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_placeholder_label_visible = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.input_placeholder_label_visible = { + id: "input_placeholder_label_visible", + context: "dom:input[placeholder], dom:textarea[placeholder]", + refactor: { + "HAAC_Input_Placeholder": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1", + "Potential_2": "Potential_2" + } + }, + help: { + "en-US": { + "Pass_0": "input_placeholder_label_visible.html", + "Potential_1": "input_placeholder_label_visible.html", + "Potential_2": "input_placeholder_label_visible.html", + "group": "input_placeholder_label_visible.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "HTML5 placeholder is the only visible label", + "Potential_2": "Additional visible label referenced by 'aria-labelledby' is not valid", + "group": "HTML5 'placeholder' attribute must not be used as a visible label replacement" + } + }, + /** + * merge the rule into input_label_visible + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.3.2"], + "level": eRulePolicy.VIOLATION, + "toolkitLevel": eToolkitLevel.LEVEL_ONE + }], + */ + rulesets: [], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (ruleContext.hasAttribute("type")) { + var type = ruleContext.getAttribute("type").toLowerCase(); + if (type == "hidden" || type == "button") { + return (0, IRule_1.RulePass)("Pass_0"); + } + } + if (ruleContext.hasAttribute("hidden")) { + var hidden = ruleContext.getAttribute("hidden"); + if (hidden == "" || hidden.toLowerCase() == "hidden") { // when hidden is empty in the element, "" is returned, same as it has a value of "". + return (0, IRule_1.RulePass)("Pass_0"); + } + } + if (ruleContext.hasAttribute("aria-label")) { + return (0, IRule_1.RulePotential)("Potential_1"); + } + if (ruleContext.hasAttribute("aria-labelledby") && ruleContext.hasAttribute("id")) { + var id = ruleContext.getAttribute("id").trim(); + var refIds = ruleContext.getAttribute("aria-labelledby").trim().split(/\s+/); // separated by one or more white spaces + if (!refIds.includes(id)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RulePotential)("Potential_2"); + } + } + return (0, IRule_1.RulePass)("Pass_0"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/label_content_exists.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/label_content_exists.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.label_content_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +exports.label_content_exists = { + id: "label_content_exists", + context: "dom:label", + refactor: { + "Valerie_Label_HasContent": { + "Pass_Regular": "Pass_Regular", + "Pass_AriaLabel": "Pass_AriaLabel", + "Pass_LabelledBy": "Pass_LabelledBy", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_Regular": "label_content_exists.html", + "Pass_AriaLabel": "label_content_exists.html", + "Pass_LabelledBy": "label_content_exists.html", + "Fail_1": "label_content_exists.html", + "group": "label_content_exists.html" + } + }, + messages: { + "en-US": { + "Pass_Regular": "<label> element has accessible name with inner content", + "Pass_AriaLabel": "<label> element has accessible name via 'aria-label'", + "Pass_LabelledBy": "<label> element has accessible name via 'aria-labelledby'", + "Fail_1": "The <label> element does not have descriptive text that identifies the expected input", + "group": "A <label> element must have non-empty descriptive text that identifies the purpose of the interactive component" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (CommonUtil_1.CommonUtil.hasInnerContentHidden(ruleContext)) { + return (0, IRule_1.RulePass)("Pass_Regular"); + } + else if ((ruleContext.getAttribute("aria-label") || "").trim().length > 0) { + return (0, IRule_1.RulePass)("Pass_AriaLabel"); + } + else if (ruleContext.hasAttribute("aria-labelledby")) { + var labelElem = fragment_1.FragmentUtil.getById(ruleContext, ruleContext.getAttribute('aria-labelledby')); + if (labelElem && !DOMUtil_1.DOMUtil.sameNode(labelElem, ruleContext) && CommonUtil_1.CommonUtil.hasInnerContent(labelElem)) { + return (0, IRule_1.RulePass)("Pass_LabelledBy"); + } + } + return (0, IRule_1.RuleFail)("Fail_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/label_name_visible.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/label_name_visible.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.label_name_visible = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var CSSUtil_1 = __webpack_require__(/*! ../util/CSSUtil */ "./src/v4/util/CSSUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +exports.label_name_visible = { + id: "label_name_visible", + context: "aria:button,aria:checkbox,aria:gridcell,aria:link,aria:menuitem,aria:menuitemcheckbox,aria:menuitemradio,aria:option,aria:radio,aria:switch,aria:tab,aria:treeitem,dom:input,dom:textarea,dom:select,dom:output,dom:meter", + refactor: { + "WCAG21_Label_Accessible": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "label_name_visible.html", + "Fail_1": "label_name_visible.html", + "group": "label_name_visible.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Accessible name matches or contains the visible label text", + "Fail_1": "Accessible name does not match or contain the visible label text", + "group": "Accessible name must match or contain the visible label text" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_2"], + "num": ["2.5.3"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + // TODO: ACT: Review https://github.com/act-rules/act-rules.github.io/issues/1618 + // https://www.w3.org/WAI/WCAG21/Techniques/aria/ARIA24 + act: "2ee8b8", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || + CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) { + return null; + } + // pass if the visible text uses Material Icon font + if (CSSUtil_1.CSSUtil.isMaterialIconFont(ruleContext)) + return (0, IRule_1.RulePass)("Pass_0"); + var passed = true; + var nodeName = ruleContext.nodeName.toLowerCase(); + var isInputButton = false; + //let buttonTypes = ["button", "reset", "submit"]; //"image" + var inputType = null; + if (nodeName === "input" && ruleContext.hasAttribute("type")) { + inputType = ruleContext.getAttribute("type").toLowerCase(); + if (CommonUtil_1.CommonUtil.form_button_types.indexOf(inputType) !== -1) { + isInputButton = true; + } + } + var theLabelBy = AriaUtil_1.AriaUtil.getAriaAttribute(ruleContext, "aria-labelledby"); + if (theLabelBy && !CommonUtil_1.CommonUtil.isIdReferToSelf(ruleContext, theLabelBy) && !isInputButton) { + // skip the checks if it has an aria-labelledby since it takes precedence. + } + else { + var theLabel = null; + if (theLabelBy && !CommonUtil_1.CommonUtil.isIdReferToSelf(ruleContext, theLabelBy)) { + var labelValues = theLabelBy.split(/\s+/); + for (var j = 0; j < labelValues.length; ++j) { + var elementById = fragment_1.FragmentUtil.getById(ruleContext, labelValues[j]); + if (elementById) { + theLabel = CommonUtil_1.CommonUtil.getInnerText(elementById); + break; + } + } + } + else { + theLabel = AriaUtil_1.AriaUtil.getAriaAttribute(ruleContext, "aria-label"); + } + if (!theLabel) { + return null; + } + var text = null; + if (isInputButton) { + /* Note: Disable the alt check in images until we get confirmation + if (inputType==="image" && ruleContext.hasAttribute("alt")){ + // use 'alt' attribute as visible text + text = ruleContext.getAttribute("alt"); + }else + */ + if (ruleContext.hasAttribute("value")) { + // use 'value' attribute as visible text + text = ruleContext.getAttribute("value"); + } + else { + // use default value + if (inputType === "submit" /*||inputType==="image"*/) { + text = "submit"; + } + else if (inputType === "reset") { + text = "reset"; + } + } + } + if (!text) { + // look for a <label> element + var labelElem = CommonUtil_1.CommonUtil.getLabelForElementHidden(ruleContext, true); + if (!labelElem) { + var parentNode = DOMWalker_1.DOMWalker.parentNode(ruleContext); + if (parentNode.nodeName.toLowerCase() === "label" /*&& RPTUtil.isFirstFormElement(parentNode, ruleContext)*/) { + var parentClone = parentNode.cloneNode(true); + // exclude all form elements from the label since they might also have inner content + labelElem = CommonUtil_1.CommonUtil.removeAllFormElementsFromLabel(parentClone); + } + } + var element = labelElem ? labelElem : ruleContext; + var elementsToSkipContentCheck = ["meter", "output", "progress", "select", "textarea"]; + if (!labelElem && elementsToSkipContentCheck.indexOf(nodeName) !== -1) { + text = ""; // skip content check for some elements + } + else { + // get the visible text only + text = CommonUtil_1.CommonUtil.getOnScreenInnerText(element); + } + /* Note: Disable this alt check in images for now until we get confirmation + // Look for the alt attribute of an image which is considered visible text. + let hasImgAlt = false; + if (element.firstChild != null) { + let nw = RPTUtil.new NodeWalker(element); + while (!hasImgAlt && nw.nextNode() && nw.node != element && nw.node != element.nextSibling) { + hasImgAlt = (nw.node.nodeName.toLowerCase() == "img" && RPTUtil.attributeNonEmpty(nw.node, "alt")); + if (hasImgAlt) { + text = text ? text + nw.node.getAttribute("alt") : nw.node.getAttribute("alt"); + } + } + } + */ + } + var nonalphanumeric = /[^a-zA-Z0-9]/g; + text = text.replace(nonalphanumeric, " "); // only consider alphanumeric characters + var normalizedText = CommonUtil_1.CommonUtil.normalizeSpacing(text).toLowerCase(); // Leading and trailing whitespace and difference in case sensitivity should be ignored. + theLabel = theLabel.replace(nonalphanumeric, " "); // only consider alphanumeric characters + var normalizedLabel = CommonUtil_1.CommonUtil.normalizeSpacing(theLabel).toLowerCase(); + if (normalizedText.length > 1) { // skip non-text content. e.g., <button aria-label="close">X</button> + var location_1 = normalizedLabel.indexOf(normalizedText); + // Avoid matching partial words.e.g., text "name" should not match 'surname' or 'names' + if (location_1 >= 0 && normalizedLabel.length > normalizedText.length) { + var letters = /^[0-9a-zA-Z]+$/; + if ((location_1 + normalizedText.length) < normalizedLabel.length) { + // check ending + var theChar = normalizedLabel.charAt(location_1 + normalizedText.length); + if (theChar.match(letters)) { + passed = false; + } + } + if (passed && location_1 > 0) { + // check beginning + var theChar = normalizedLabel.charAt(location_1 - 1); + if (theChar.match(letters)) { + passed = false; + } + } + } + if (location_1 === -1) { // check that visible text content of the target is contained within its accessible name. + passed = false; + } + } + } + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/label_ref_valid.ts" +/*!*****************************************!*\ + !*** ./src/v4/rules/label_ref_valid.ts ***! + \*****************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.label_ref_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.label_ref_valid = { + id: "label_ref_valid", + context: "dom:label[for]", + refactor: { + "WCAG20_Label_RefValid": { + "Pass_0": "pass", + "Fail_1": "fail_invalid" + } + }, + help: { + "en-US": { + "pass": "label_ref_valid.html", + "fail_invalid": "label_ref_valid.html", + "group": "label_ref_valid.html" + } + }, + messages: { + "en-US": { + "pass": "The 'for' attribute for a label referencea a unique non-empty 'id' attribute of a valid element", + "fail_invalid": "The value \"{0}\" of the 'for' attribute is not the 'id' of a valid element", + "group": "The 'for' attribute for a label should reference a non-empty, unique 'id' attribute of a valid element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var id = ruleContext.getAttribute("for"); + var passed = false; + var target = fragment_1.FragmentUtil.getById(ruleContext, id); + if (target) { + // ignore if both label and control are invisible + if (!VisUtil_1.VisUtil.isNodeVisible(target) && !VisUtil_1.VisUtil.isNodeVisible(ruleContext)) + return null; + passed = true; + // handles null and undefined + if (!target.hasAttribute("role")) { + // Fail if we're pointing at something that is labelled by another mechanism + var nodeName = target.nodeName.toLowerCase(); + passed = nodeName == "input" || nodeName == "select" || nodeName == "textarea" + || nodeName == "button" || nodeName == "datalist" + || nodeName == "optgroup" || nodeName == "option" + || nodeName == "keygen" || nodeName == "output" + || nodeName == "progress" || nodeName == "meter" + || nodeName == "fieldset" || nodeName == "legend"; + if (target.nodeName.toLowerCase() == "input" && target.hasAttribute("type")) { + var type = target.getAttribute("type").toLowerCase(); + passed = type == "text" || type == "password" || type == "file" || + type == "checkbox" || type == "radio" || + type == "hidden" || type == "search" || type == "tel" || type == "url" || type == "email" || //HTML 5 + type == "date" || type == "number" || type == "range" || type == "image" || //HTML 5 + type == "time" || type == "color" || // HTML 5 + type == "datetime-local" || type == "month" || type == "week"; //HTML5.1 + } + } + // Add one more check to make sure the target element is NOT hidden, in the case the target is hidden + // flag a violation regardless of what the Check Hidden Content setting is. + if (passed && !VisUtil_1.VisUtil.isNodeVisible(target)) { + passed = false; + } + } + var retToken = []; + if (!passed) { + retToken.push(id); + } + //return new ValidationResult(passed, [ruleContext], '', '', passed == true ? [] : [retToken]); + if (!passed) { + return (0, IRule_1.RuleFail)("fail_invalid", retToken); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/list_children_valid.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/list_children_valid.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.list_children_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +exports.list_children_valid = { + id: "list_children_valid", + context: "aria:group", + refactor: { + "HAAC_List_Group_ListItem": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "list_children_valid.html", + "Fail_1": "list_children_valid.html", + "group": "list_children_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "List component with \"group\" role has children that are not <listitem> elements", + "group": "List component with \"group\" role must limit children to <listitem> elements" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var parent = DOMWalker_1.DOMWalker.parentElement(ruleContext); + if (!AriaUtil_1.AriaUtil.hasRoleInSemantics(parent, "list")) { + return null; + } + var passed = true; + var children = ruleContext.children; + for (var i = 0; passed && i < children.length; i++) { + passed = AriaUtil_1.AriaUtil.hasRoleInSemantics(children[i], "listitem"); + } + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/list_markup_review.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/list_markup_review.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.list_markup_review = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.list_markup_review = { + id: "list_markup_review", + context: "dom:*", + refactor: { + "RPT_List_UseMarkup": { + // "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + // "pass": "list_markup_review.html", + "potential_list": "list_markup_review.html", + "group": "list_markup_review.html" + } + }, + messages: { + "en-US": { + // "pass": "Proper HTML elements are used to create a list", + "potential_list": "Verify this is a list and if so, modify to use proper HTML elements for the list", + "group": "Proper HTML elements should be used to create a list" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Extract the nodeName of the context node + var nodeName = ruleContext.nodeName.toLowerCase(); + //skip the check if the element is hidden or disabled + if (CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext) || VisUtil_1.VisUtil.hiddenByDefaultElements.includes(nodeName)) + return null; + // Don't trigger if we're not in the body or if we're in a script + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["body"]) === null) + return null; + // ignore script, label and their child elements + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["script", 'label']) !== null) + return null; + // ignore all widgets and their children, and certain structure roles + var roles = AriaUtil_1.AriaUtil.getRolesWithTypes(ruleContext, ["widget"]); + // add some structure roles + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(["caption", "code", "columnheader", "figure", "list", "listitem", "math", "meter", "columnheader", "rowheader"], roles); + if (AriaUtil_1.AriaUtil.getAncestorWithRoles(ruleContext, roles) !== null) + return null; + var passed = true; + var walkNode = ruleContext.firstChild; + while (passed && walkNode) { + // Comply to the Check Hidden Content setting will be done by default as this rule triggers on each element + // and for each element it only checks that single elements text nodes and nothing else. So all inner elements will be + // covered on their own. Currently for this rule by default Check Hidden Content will work, as we are doing + // a node walk only on siblings so it would not get text nodes from other siblings at all. + // In the case in the future something changes, just need to add && !RPTUtil.shouldNodeBeSkippedHidden(walkNode) to the below + // if. + if (walkNode.nodeName == "#text") { + var txtVal = walkNode.nodeValue; + var failure = /^[ \t\r\n]*[( ]*[1-9]*[\*\-).][ \t][A-Z,a-z]+/.test(txtVal); + passed = !failure; + if (!passed) { + // Ensure that there's some sort of block level element before this + // Avoid failures due to things like <i>Some sentence</i>. New sentence. + var nw = new DOMWalker_1.DOMWalker(walkNode); + while (!passed && nw.prevNode()) { + var nodeName_1 = nw.node.nodeName.toLowerCase(); + if (["blockquote", "center", "dir", "div", "form", "h1", + "h2", "h3", "h4", "h5", "h6", "hr", "br", "menu", "p", + "pre"].includes(nodeName_1)) { + break; + } + if (nodeName_1 == "#text") { + var txt = nw.node.nodeValue; + passed = txt.length > 0 && ![" ", "\t", "\n"].includes(txt.charAt(txt.length - 1)); + } + } + } + } + walkNode = walkNode.nextSibling; + } + if (passed) + return null; + if (!passed) + return (0, IRule_1.RulePotential)("potential_list"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/list_structure_proper.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/list_structure_proper.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.list_structure_proper = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.list_structure_proper = { + id: "list_structure_proper", + context: "dom:dl, dom:ul, dom:ol, dom:dir, dom:menu, dom:li, dom:dd, dom:dt", + refactor: { + "RPT_List_Misuse": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "list_structure_proper.html", + "Potential_1": "list_structure_proper.html", + "group": "list_structure_proper.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "List element is missing or improperly structured", + "group": "List elements should only be used for lists of related items" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed; + var nodeName = ruleContext.nodeName.toLowerCase(); + // Get all the childrens of the ruleContext + var children = ruleContext.children; + if (nodeName == "dl") { + var first = ""; + var last = ""; + var walkChildren = ruleContext.firstChild; + passed = true; + var presentationalFound = false; + // If there are no childrens set as passed, since dl elements can have + // zero or more of: one or more dt elements, followed by one or more dd elements + if (!ruleContext.children || ruleContext.children.length == 0) { + passed = true; + } + else { + while (passed && walkChildren != null) { + if (walkChildren.nodeType == 1) { + var nodeName_1 = walkChildren.nodeName.toLowerCase(); + // While walking through the elements under dl, if we find a + // presentational element we move to the next element as presentational + // elements are allowed under list elements as they are only for + // formatting text nodes. + if (AriaUtil_1.AriaUtil.isPresentationalElement(walkChildren)) { + presentationalFound = true; + walkChildren = walkChildren.nextSibling; + continue; + } + // Only set to pass if we find dd or dt element, in the case of + // an element that is not supported we will catch it here. i.e. img + // element + passed = nodeName_1 == "dd" || nodeName_1 == "dt"; + // Set the first and last node depending on which is found first and last + if (first == "") + first = nodeName_1; + last = nodeName_1; + } + walkChildren = walkChildren.nextSibling; + } + // In the case that we have found dt and dd elements under dl we pass right away. + // In the case that there is no dt or dd element, but bunch of presentational elements we mark this as a + // pass. In the case that there are other elements, such as img we will still trigger a violation. + passed = (passed && first == "dt" && last == "dd") || (passed && presentationalFound); + } + } + else if (nodeName == "li") { + passed = CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["ul", "ol", "dir", "menu"]) != null; + } + else if (nodeName == "dd" || nodeName == "dt") { + passed = CommonUtil_1.CommonUtil.getAncestor(ruleContext, "dl") != null; + } + else { + var walkChildren = ruleContext.firstChild; + // Zero or more li elements are permitted inside of <ol>, <ul> or <menu> elements now as per the html5 spec. This handles the case + // when there are zero elements under the <ol>, <ul> or <menu>. + if ((nodeName == "ul" || nodeName == "ol" || nodeName == "menu") && (!ruleContext.children || ruleContext.children.length == 0)) { + passed = true; + } + else { + var liFound = false; + var presentationalFound = false; + passed = true; + while (passed && walkChildren != null) { + // While walking through the list elements, if we find a + // presentational element we skip checking as presentational + // elements are allowed under list elements as they are only for + // formatting text. + if (AriaUtil_1.AriaUtil.isPresentationalElement(walkChildren)) { + presentationalFound = true; + walkChildren = walkChildren.nextSibling; + continue; + } + // Pass if the node type is anything but 1, or in the case that it is a li element. For any other node + // it will be caught here that element is not allowed under list node. + // Furthermore in the case that there is a template element with the parent being ul/ol don't flag a violation + passed = walkChildren.nodeType != 1 || walkChildren.nodeName.toLowerCase() == "li" || (walkChildren.nodeName.toLowerCase() == "template" && (nodeName == "ul" || nodeName == "ol")); + // Set li found to true if the current element (nodeType=1) is an li element + liFound = liFound || (walkChildren.nodeType == 1 && walkChildren.nodeName.toLowerCase() == "li"); + walkChildren = walkChildren.nextSibling; + } + // In the case that it has passed and also li element is found under list node, we pass right away. + // In the case that there is no li element, but bunch of presentational elements we mark this as a + // pass. In the case that there are other elements, such as img we will still trigger a violation. + passed = (passed && liFound) || (passed && presentationalFound); + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/marquee_elem_avoid.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/marquee_elem_avoid.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.marquee_elem_avoid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.marquee_elem_avoid = { + id: "marquee_elem_avoid", + context: "dom:marquee", + refactor: { + "RPT_Marquee_Trigger": { + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Fail_1": "marquee_elem_avoid.html", + "group": "marquee_elem_avoid.html" + } + }, + messages: { + "en-US": { + "Fail_1": "Scrolling content found that uses the obsolete <marquee> element", + "group": "The <marquee> element is obsolete and should not be used" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.2.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // JCH - NO OUT OF SCOPE hidden in context + return (0, IRule_1.RuleFail)("Fail_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/media_alt_brief.ts" +/*!*****************************************!*\ + !*** ./src/v4/rules/media_alt_brief.ts ***! + \*****************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.media_alt_brief = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.media_alt_brief = { + id: "media_alt_brief", + context: "dom:img[alt], dom:applet[alt], dom:area[alt], dom:embed[alt], dom:input[type][alt]", + refactor: { + "RPT_Media_AltBrief": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "media_alt_brief.html", + "Potential_1": "media_alt_brief.html", + "group": "media_alt_brief.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Text alternative is more than 150 characters", + "group": "Alternative text in 'alt' attribute should be brief (<150 characters)" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + maxAlt: { + value: 150, + type: "integer" + } + }; + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var altLength = ruleContext.getAttribute("alt").trim().length; + var passed = altLength <= validateParams.maxAlt.value; + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/media_alt_exists.ts" +/*!******************************************!*\ + !*** ./src/v4/rules/media_alt_exists.ts ***! + \******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.media_alt_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.media_alt_exists = { + id: "media_alt_exists", + context: "dom:area[alt], dom:embed[alt]", + refactor: { + "RPT_Media_AudioVideoAltFilename": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "media_alt_exists.html", + "Potential_1": "media_alt_exists.html", + "group": "media_alt_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Filename used as label for embedded audio or video", + "group": "Audio or video on the page must have a short text alternative that describes the media content" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var uri = ""; + if (ruleContext.nodeName.toLowerCase() == "area") { + uri = ruleContext.getAttribute("href"); + } + else { + uri = ruleContext.getAttribute("src"); + } + if (uri == null) + uri = ""; + var ext = CommonUtil_1.CommonUtil.getFileExt(uri); + var isAudVid = ext.length != 0 && (CommonUtil_1.CommonUtil.isAudioExt(ext) || CommonUtil_1.CommonUtil.isVideoExt(ext)); + var altText = ruleContext.getAttribute("alt"); + var passed = !isAudVid || (altText.length > 0 && altText.indexOf(ext) == -1); + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/media_audio_transcribed.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/media_audio_transcribed.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.media_audio_transcribed = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.media_audio_transcribed = { + id: "media_audio_transcribed", + context: "dom:bgsound, dom:a[href], dom:area[href], dom:embed, dom:object", + refactor: { + "RPT_Media_AudioTrigger": { + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Manual_1": "media_audio_transcribed.html", + "group": "media_audio_transcribed.html" + } + }, + messages: { + "en-US": { + "Manual_1": "Provide transcripts for audio files", + "group": "Audio information should also be available in text form" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.2.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed; + var thisNode = ruleContext.nodeName.toLowerCase(); + if (thisNode == "bgsound") { + passed = false; + } + else { + passed = !CommonUtil_1.CommonUtil.isAudioObjEmbedLink(ruleContext); + } + if (passed) + return null; // Out of Scope + if (!passed) + return (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/media_autostart_controllable.ts" +/*!******************************************************!*\ + !*** ./src/v4/rules/media_autostart_controllable.ts ***! + \******************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.media_autostart_controllable = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.media_autostart_controllable = { + id: "media_autostart_controllable", + context: "dom:param[name=autoplay], dom:param[name=autostart], dom:embed[flashvars], dom:embed[src], dom:*[autostart=true], dom:*[autostart=1], dom:bgsound", + refactor: { + "RPT_Embed_AutoStart": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "media_autostart_controllable.html", + "Potential_1": "media_autostart_controllable.html", + "group": "media_autostart_controllable.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify there is a mechanism to pause or stop and control the volume for the audio that plays automatically", + "group": "Mechanism must be available to pause or stop and control the volume of the audio that plays automatically" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.4.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + var passed; + if (nodeName == "bgsound") { + passed = false; + } + else if (nodeName == "param") { + var content = ""; + if (ruleContext.hasAttribute("value")) + content = ruleContext.getAttribute("value").toLowerCase(); + passed = content.indexOf("0;") == 0 || + !(content.indexOf("true") != -1 || content.indexOf("1") != -1); + } + else if (nodeName == "embed") { + passed = true; + if (ruleContext.hasAttribute("flashvars")) { + var str = ruleContext.getAttribute("flashvars"); + passed = str.indexOf("autostart=true") == -1 && + str.indexOf("autostart=1") == -1; + } + if (passed && ruleContext.hasAttribute("src")) { + var str = ruleContext.getAttribute("src"); + passed = str.indexOf("autostart=true") == -1 && + str.indexOf("autostart=1") == -1; + } + } + if (passed && ruleContext.hasAttribute("autostart")) { + var val = ruleContext.getAttribute("autostart").toLowerCase(); + passed = val != 'true' && val != '1'; + } + return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/media_keyboard_controllable.ts" +/*!*****************************************************!*\ + !*** ./src/v4/rules/media_keyboard_controllable.ts ***! + \*****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.media_keyboard_controllable = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.media_keyboard_controllable = { + id: "media_keyboard_controllable", + context: "dom:audio, dom:video", + refactor: { + "HAAC_Audio_Video_Trigger": { + "Pass_0": "Pass_0", + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Pass_0": "media_keyboard_controllable.html", + "Manual_1": "media_keyboard_controllable.html", + "group": "media_keyboard_controllable.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Manual_1": "Verify media using <audio> and/or <video> elements have keyboard accessible controls", + "group": "Media using <audio> and/or <video> elements must have keyboard accessible controls" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = true; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (nodeName == "audio" || nodeName === "video") { + passed = false; + } + return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/media_live_captioned.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/media_live_captioned.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.media_live_captioned = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.media_live_captioned = { + id: "media_live_captioned", + context: "dom:embed, dom:object", + refactor: { + "RPT_Media_VideoObjectTrigger": { + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Manual_1": "media_live_captioned.html", + "group": "media_live_captioned.html" + } + }, + messages: { + "en-US": { + "Manual_1": "Verify captions are provided for live media (streaming video with audio)", + "group": "Live media (streaming video with audio) should have captions for audio content" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.2.4"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = !CommonUtil_1.CommonUtil.isVideoObjEmbedLink(ruleContext); + if (passed) + return null; + if (!passed) + return (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/media_track_available.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/media_track_available.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.media_track_available = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.media_track_available = { + id: "media_track_available", + context: "dom:a[href], dom:area[href], dom:applet, dom:embed, dom:object", + refactor: { + "RPT_Media_VideoReferenceTrigger": { + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Manual_1": "media_track_available.html", + "group": "media_track_available.html" + } + }, + messages: { + "en-US": { + "Manual_1": "Verify availability of a user-selectable audio track with description of visual content", + "group": "Pre-recorded media should have an audio track that describes visual information" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.2.3", "1.2.5"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLowerCase(); + var passed = true; + if (nodeName == "applet") { + passed = false; + } + else { + passed = !CommonUtil_1.CommonUtil.isVideoObjEmbedLink(ruleContext); + } + if (passed) + return null; + if (!passed) + return (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/meta_redirect_optional.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/meta_redirect_optional.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.meta_redirect_optional = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +exports.meta_redirect_optional = { + id: "meta_redirect_optional", + context: "dom:meta[http-equiv][content]", + refactor: { + "WCAG20_Meta_RedirectZero": { + "pass": "pass", + "fail": "fail", + "fail_longrefresh": "fail_longrefresh" + } + }, + help: { + "en-US": { + "group": "meta_redirect_optional.html", + "pass": "meta_redirect_optional.html", + "fail": "meta_redirect_optional.html", + "fail_longrefresh": "meta_redirect_optional.html" + } + }, + messages: { + "en-US": { + "group": "Page should not automatically refresh without warning or option to turn it off or adjust the time limit", + "pass": "Rule Passed", + "fail": "Check page does not automatically refresh without warning or options", + "fail_longrefresh": "Check page does not automatically refresh without warning or options" + } + }, + /** + * deprecate WCAG AAA + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.2.4", "3.2.5"], + "level": eRulePolicy.VIOLATION, + "toolkitLevel": eToolkitLevel.LEVEL_THREE + }], + */ + rulesets: [{ + "id": [], + "num": ["2.2.4", "3.2.5"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + // Removed ACT bisz58 AAA + /**act: [{ + "bc659a" : { + "pass": "pass", + "fail": "fail", + "fail_longrefresh": "pass" + } + }],*/ + act: ["bisz58"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (ruleContext.getAttribute("http-equiv").toLowerCase() !== 'refresh') { + return null; + } + var doc = ruleContext.ownerDocument; + if (!doc) + return; + // check if the rule already passed or failed: only the first one tridders if multiple + if (CacheUtil_1.CacheUtil.getCache(doc, "meta_redirect_optional_done", false)) + return null; + var content = ruleContext.getAttribute("content").toLowerCase(); + if (!content || content.trim().length === 0) + return null; + var time = -1; + if (content.match(/^\d+$/)) + time = parseInt(content); + else if (content.match(/^\d+;/)) { + var pos = content.indexOf(";"); + time = parseInt(content.substring(0, pos)); + } + // Invalid content field + if (time === -1) { + return null; + } + CacheUtil_1.CacheUtil.setCache(doc, "meta_redirect_optional_done", true); + if (time === 0) + return (0, IRule_1.RulePass)("pass"); + else if (time < 72001) + return (0, IRule_1.RuleFail)("fail"); + return (0, IRule_1.RuleFail)("fail_longrefresh"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/meta_refresh_delay.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/meta_refresh_delay.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.meta_refresh_delay = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +exports.meta_refresh_delay = { + id: "meta_refresh_delay", + context: "dom:meta[http-equiv][content]", + refactor: { + "RPT_Meta_Refresh": { + "Pass_0": "pass", + "Potential_1": "potential_refresh" + } + }, + help: { + "en-US": { + "group": "meta_refresh_delay.html", + "pass": "meta_refresh_delay.html", + "potential_refresh": "meta_refresh_delay.html" + } + }, + messages: { + "en-US": { + "group": "Pages should not refresh automatically", + "pass": "Pages do not refresh automatically", + "potential_refresh": "Verify page is not being caused to refresh automatically", + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.2.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + //act: [ "bisz58", "bc659a" ], + act: ["bc659a"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (ruleContext.getAttribute("http-equiv").toLowerCase() !== 'refresh') + return null; + var doc = ruleContext.ownerDocument; + if (!doc) + return; + // check if the rule already passed: the first one takes priority + if (CacheUtil_1.CacheUtil.getCache(doc, "meta_refresh_delay_done", false)) + return null; + var content = ruleContext.getAttribute("content").toLowerCase(); + if (!content || content.trim().length === 0) + return null; + var time = -1; + if (content.match(/^\d+$/)) + time = parseInt(content); + else if (content.match(/^\d+;/)) { + var pos = content.indexOf(";"); + time = parseInt(content.substring(0, pos)); + } + // Invalid content field + if (time === -1) { + return null; + } + CacheUtil_1.CacheUtil.setCache(doc, "meta_refresh_delay_done", true); + if (time === 0) + return (0, IRule_1.RulePass)("pass"); + return (0, IRule_1.RulePotential)("potential_refresh"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/meta_viewport_zoomable.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/meta_viewport_zoomable.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.meta_viewport_zoomable = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.meta_viewport_zoomable = { + id: "meta_viewport_zoomable", + context: "dom:meta[name][content]", + refactor: { + "meta_viewport_zoom": { + "Pass_0": "pass", + "Potential_1": "potential_zoomable" + } + }, + help: { + "en-US": { + "group": "meta_viewport_zoomable.html", + "pass": "meta_viewport_zoomable.html", + "potential_zoomable": "meta_viewport_zoomable.html" + } + }, + messages: { + "en-US": { + "group": "The 'meta[name=viewport]' should not prevent the browser zooming the content", + "pass": "The 'meta[name=viewport]' does not prevent the browser zooming the content", + "potential_zoomable": "Confirm the 'meta[name=viewport]' with \"{0}\" can be zoomed by user" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.4.4"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [{ + "b4f0c3": { + "pass": "pass", + "potential_zoomable": "fail" + } + }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (ruleContext.getAttribute("name").toLowerCase() !== 'viewport') + return null; + var content = ruleContext.getAttribute("content").toLowerCase(); + // neither maximum-scale nor user-scalable (default yes) + if (!content || content.trim() === '' || (!content.includes('maximum-scale') && !content.includes('user-scalable'))) + return null; + var user_msg = null; + var max_msg = null; + var props = content.split(","); + var user_scale_value = 'yes'; + var maximum_scale_value = '2.0'; + for (var _i = 0, props_1 = props; _i < props_1.length; _i++) { + var prop = props_1[_i]; + var pieces = prop.trim().split('='); + if (pieces.length < 2) + continue; + if (prop.includes('user-scalable')) { + user_msg = prop; + user_scale_value = pieces[1].trim(); + if (user_scale_value.startsWith("'") || user_scale_value.startsWith('"')) { + user_scale_value = user_scale_value.substring(1, user_scale_value.length - 1); + } + } + else if (prop.includes('maximum-scale')) { + max_msg = prop; + maximum_scale_value = pieces[1].trim(); + if (maximum_scale_value.startsWith("'") || maximum_scale_value.startsWith('"')) { + maximum_scale_value = maximum_scale_value.substring(1, maximum_scale_value.length - 1).trim(); + } + } + } + var value = Number(user_scale_value); + if (!isNaN(value)) { + if (value >= 1 || value <= -1) + user_scale_value = 'yes'; + } + var maximum_scale = 2.0; + value = Number(maximum_scale_value); + if (!isNaN(value)) { + if (value < 0) + maximum_scale = 2.0; + else + maximum_scale = value; + } + else { + if (maximum_scale_value === 'yes') + maximum_scale = 1.0; + else + maximum_scale = 0.1; + } + // user-scalable is not set to 'yes', ignore maximum_scale + if (user_scale_value !== 'yes') { + return (0, IRule_1.RulePotential)("potential_zoomable", [user_msg]); + } + // user-scalable is 'yes', but maximum_scale is too small + if (maximum_scale < 2.0) { + return (0, IRule_1.RulePotential)("potential_zoomable", [max_msg]); + } + return (0, IRule_1.RulePass)("pass"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/noembed_content_exists.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/noembed_content_exists.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.noembed_content_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.noembed_content_exists = { + id: "noembed_content_exists", + context: "dom:noembed", + refactor: { + "Valerie_Noembed_HasContent": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "noembed_content_exists.html", + "Potential_1": "noembed_content_exists.html", + "group": "noembed_content_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Add descriptive text to the <noembed> element", + "group": "<noembed> elements should contain descriptive text" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_FOUR + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = CommonUtil_1.CommonUtil.hasInnerContentHidden(ruleContext); + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/object_text_exists.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/object_text_exists.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.object_text_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +exports.object_text_exists = { + id: "object_text_exists", + context: "dom:object", + refactor: { + "WCAG20_Object_HasText": { + "pass": "pass", + "fail_no_text_alternative": "fail_no_text_alternative" + } + }, + help: { + "en-US": { + "group": "object_text_exists.html", + "pass": "object_text_exists.html", + "fail_no_text_alternative": "object_text_exists.html" + } + }, + messages: { + "en-US": { + "group": "<object> element must have a text alternative for the content rendered by the object", + "pass": "<object> element has a text alternative", + "fail_no_text_alternative": "An <object> element does not have a text alternative" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: "8fc3b6", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // Detect if this object is of type text, by checking the object type in the case it is text then do not trigger this rule + if (ruleContext.hasAttribute("type") && (ruleContext.getAttribute("type")).indexOf("text") !== -1) { + return null; + } + // ignore if an explicit role is specified: including 'presentation', 'none', 'application', 'document' or 'img' + // this case will be covered in other rules + var role = ruleContext.getAttribute("role"); + if (role) { + return null; + } + // Per ACT, ignore embedded HTML files + var data = ruleContext.getAttribute("data"); + var ext = data && typeof data === typeof "" ? data.substring(data.lastIndexOf(".")) : ""; + if (ext === ".html" || ext === ".htm") { + return null; + } + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + var passed = pair && pair.name && pair.name.trim().length > 0; + //let passed = ARIAMapper.computeName(ruleContext).trim().length > 0; + if (passed) { + return (0, IRule_1.RulePass)("pass"); + } + else { + return (0, IRule_1.RuleFail)("fail_no_text_alternative"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/page_title_exists.ts" +/*!*******************************************!*\ + !*** ./src/v4/rules/page_title_exists.ts ***! + \*******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.page_title_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var ancestor_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/ancestor */ "./src/v2/checker/accessibility/util/ancestor.ts"); +exports.page_title_exists = { + id: "page_title_exists", + context: "dom:html", + refactor: { + "WCAG20_Doc_HasTitle": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3" + } + }, + help: { + "en-US": { + "group": "page_title_exists.html", + "Pass_0": "page_title_exists.html", + "Fail_1": "page_title_exists.html", + "Fail_2": "page_title_exists.html", + "Fail_3": "page_title_exists.html" + } + }, + messages: { + "en-US": { + "group": "The page should have a title that correctly identifies the subject of the page", + "Pass_0": "Rule Passed", + "Fail_1": "Missing <head> element so there can be no <title> element present", + "Fail_2": "Missing <title> element in <head> element", + "Fail_3": "The <title> element is empty (no innerHTML)" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [{ + "2779a5": { + "Pass_0": "pass", + "Fail_1": "pass", + "Fail_2": "fail", + "Fail_3": "fail" + } + }], + run: function (context, options, contextHierarchies) { + // This rule does not apply inside a presentational frame + if (ancestor_1.AncestorUtil.isFrame(contextHierarchies)) { + return null; + } + var ruleContext = context["dom"].node; + // First, find the head element + var findHead = ruleContext.firstChild; + var findTitle = null; + while (findHead != null) { + if (findHead.nodeName.toLowerCase() == "head") + break; + findHead = findHead.nextSibling; + } + var possibleTitles = ruleContext.querySelectorAll("title"); + for (var idx = 0; idx < possibleTitles.length; ++idx) { + if (!CommonUtil_1.CommonUtil.getAncestor(possibleTitles[idx], ["svg"])) { + findTitle = possibleTitles[idx]; + break; + } + } + if (findHead === null) { + if (!findTitle) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } + if (findTitle === null) { // don't have title second PoF + return (0, IRule_1.RuleFail)("Fail_2"); + } + // if we get here we have <head> and <title> + if (findTitle != null && CommonUtil_1.CommonUtil.getInnerText(findTitle).trim().length > 0) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { // <title> has no innerHTML third PoF + return (0, IRule_1.RuleFail)("Fail_3"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/page_title_valid.ts" +/*!******************************************!*\ + !*** ./src/v4/rules/page_title_valid.ts ***! + \******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.page_title_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.page_title_valid = { + id: "page_title_valid", + context: "dom:head dom:title", + refactor: { + "RPT_Title_Valid": { + "Pass_0": "Pass_0", + // "Fail_1": "Fail_1", + "Potential_2": "Potential_2" + } + }, + help: { + "en-US": { + "Pass_0": "page_title_valid.html", + // "Fail_1": "page_title_valid.html", + "Potential_2": "page_title_valid.html", + "group": "page_title_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + // "Fail_1": "Page <title> is empty", + "Potential_2": "Verify that using the filename as the page <title> value is descriptive", + "group": "Page <title> should be a descriptive title, rather than a filename" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var titleStr = CommonUtil_1.CommonUtil.getInnerText(ruleContext).trim(); + // allow .com, .net and .org + var titleStrLowercase = titleStr.toLowerCase(); + if (titleStrLowercase.includes(".com") || titleStrLowercase.includes(".net") || titleStrLowercase.includes(".org")) { + return (0, IRule_1.RulePass)("Pass_0", [titleStr]); + } + if (titleStr.length === 0) { + // This is covered by page_title_exists + return null; //RuleFail("Fail_1"); + } + else { + var passed = !/^\S*\.[a-zA-Z]{1,4}(?!.)|^https?:\/\/\S*/i.test(titleStr); + if (!passed) { + return (0, IRule_1.RulePotential)("Potential_2"); + } + else { + return (0, IRule_1.RulePass)("Pass_0", [titleStr]); + } + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/script_focus_blur_review.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/script_focus_blur_review.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.script_focus_blur_review = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.script_focus_blur_review = { + id: "script_focus_blur_review", + context: "dom:*[onfocus]", + refactor: { + "WCAG20_Script_FocusBlurs": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "script_focus_blur_review.html", + "Potential_1": "script_focus_blur_review.html", + "group": "script_focus_blur_review.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify script does not remove focus from content that normally receives focus", + "group": "Scripting must not remove focus from content that normally receives focus" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1", "2.4.7", "3.2.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = ruleContext.getAttribute("onfocus").indexOf(".blur(") == -1; + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/script_onclick_avoid.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/script_onclick_avoid.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.script_onclick_avoid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.script_onclick_avoid = { + id: "script_onclick_avoid", + context: "dom:*[onclick]", + dependencies: ["script_onclick_misuse"], + refactor: { + "RPT_Script_OnclickHTML2": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "script_onclick_avoid.html", + "Potential_1": "script_onclick_avoid.html", + "group": "script_onclick_avoid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that 'onclick' events are not used in script to emulate a link", + "group": "Scripts should not be used to emulate links" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_FOUR + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Don't trigger this for SVG element for now until a determination is made (by Rich) + // to support SVG at a point when the SVG a11y spec is ready. + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, "svg")) { + return (0, IRule_1.RulePass)("Pass_0"); + } + // If there's an aria-role specified, don't trigger this. + if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "role")) + return (0, IRule_1.RulePass)("Pass_0"); + var nodeName = ruleContext.nodeName.toLowerCase(); + var passed = nodeName == "a" || nodeName == "area" || nodeName == "input"; + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/script_onclick_misuse.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/script_onclick_misuse.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.script_onclick_misuse = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.script_onclick_misuse = { + id: "script_onclick_misuse", + context: "dom:*[onclick]", + refactor: { + "RPT_Script_OnclickHTML1": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "script_onclick_misuse.html", + "Potential_1": "script_onclick_misuse.html", + "group": "script_onclick_misuse.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Possible use of a script to emulate a link", + "group": "Scripts should not be used to emulate links" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + failSubstring: { + value: [".asp", ".aspx", ".cfm", ".cfml", ".cgi", ".htm", ".html", ".shtm", + ".shtml", ".php", ".pl", ".py", ".shtm", ".shtml", ".xhtml", + "location.href"], + type: "[string]" + } + }; + var ruleContext = context["dom"].node; + // If there's an aria-role specified, don't trigger this. + var passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "role"); + // If this is an a or area, don't trigger if there's an href. + var nodeName = ruleContext.nodeName.toLowerCase(); + passed = passed || ((nodeName == "a" || nodeName == "area") && CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "href")); + // If the guards failed, check to see if they're looking at links + if (!passed) { + var failSubstring = validateParams.failSubstring.value; + ; + var onclick_1 = ruleContext.getAttribute("onclick").toLowerCase(); + passed = true; + for (var i = 0; passed && i < failSubstring.length; ++i) { + passed = onclick_1.indexOf(failSubstring[i]) == -1; + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/script_select_review.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/script_select_review.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.script_select_review = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.script_select_review = { + id: "script_select_review", + context: "dom:select", + refactor: { + "WCAG20_Select_NoChangeAction": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "script_select_review.html", + "Potential_1": "script_select_review.html", + "group": "script_select_review.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that no change of context or action occurs when selection options in this component receive focus", + "group": "No changes of context should occur when a selection value receives focus" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.2.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = !ruleContext.hasAttribute("onchange") && !ruleContext.hasAttribute("onfocus"); + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/select_options_grouped.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/select_options_grouped.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.select_options_grouped = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.select_options_grouped = { + id: "select_options_grouped", + context: "dom:select", + refactor: { + "WCAG20_Select_HasOptGroup": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "select_options_grouped.html", + "Potential_1": "select_options_grouped.html", + "group": "select_options_grouped.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Group of related options may need <optgroup>", + "group": "Groups of related options within a selection list should be grouped with <optgroup>" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + paramNumOptions: { + value: 10, + type: "integer" + } + }; + var ruleContext = context["dom"].node; + // Handle the cases where optgroup is hidden, which should trigger a violations + // but in the case that Check hidden option is set then should not trigger a violation. + var passed = CommonUtil_1.CommonUtil.getChildByTagHidden(ruleContext, "optgroup", false, true).length > 0 || + CommonUtil_1.CommonUtil.getChildByTagHidden(ruleContext, "option", false, true).length <= + validateParams.paramNumOptions.value; + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/skip_main_described.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/skip_main_described.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.skip_main_described = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.skip_main_described = { + id: "skip_main_described", + context: "dom:body", + dependencies: ["skip_main_exists"], + refactor: { + "WCAG20_Body_FirstAContainsSkipText_Native_Host_Sematics": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "skip_main_described.html", + "Potential_1": "skip_main_described.html", + "group": "skip_main_described.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that if this hyperlink skips content, the description communicates where it links to", + "group": "The description of a hyperlink used to skip content must communicate where it links to" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + paramSkipText: { + value: ["skip", "jump"], + type: "[string]" + } + }; + var ruleContext = context["dom"].node; + // Get the anchors on the page + var doc = ruleContext.ownerDocument; + // Check for landmarks first + var passed; + if (CacheUtil_1.CacheUtil.getCache(ruleContext, "IBM_hasLandmarks_Implicit", null) === null) { + CacheUtil_1.CacheUtil.setCache(ruleContext, "IBM_hasLandmarks_Implicit", CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, ["application", "banner", "complementary", "contentinfo", + "form", "main", "navigation", "search" + ], true, true).length > 0); + } + passed = CacheUtil_1.CacheUtil.getCache(ruleContext, "IBM_hasLandmarks_Implicit", false); + if (!passed) { // No landmarks, check for skip links + var links = doc.links; + // Skip link should be the first one on the page with an href attribute (i.e., links[0]) + // also if the first link is hidden then we should also trigger a violation. + if (links && links.length > 0 && VisUtil_1.VisUtil.isNodeVisible(links[0])) { + var testText = CommonUtil_1.CommonUtil.getInnerText(doc.links[0]).toLowerCase(); + for (var i = 0; !passed && i < validateParams.paramSkipText.value.length; ++i) { + passed = testText.indexOf(validateParams.paramSkipText.value[i]) != -1; + } + } + else + passed = false; + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/skip_main_exists.ts" +/*!******************************************!*\ + !*** ./src/v4/rules/skip_main_exists.ts ***! + \******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.skip_main_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var ancestor_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/ancestor */ "./src/v2/checker/accessibility/util/ancestor.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.skip_main_exists = { + id: "skip_main_exists", + context: "dom:body", + refactor: { + "WCAG20_Body_FirstASkips_Native_Host_Sematics": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "skip_main_exists.html", + "Fail_1": "skip_main_exists.html", + "group": "skip_main_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The page does not provide a way to quickly navigate to the main content (ARIA \"main\" landmark or a skip link)", + "group": "Pages must provide a way to skip directly to the main content" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + // This rule does not apply inside a presentational frame + if (ancestor_1.AncestorUtil.isPresentationFrame(contextHierarchies)) { + return null; + } + var ruleContext = context["dom"].node; + // Get the anchors on the page + var doc = ruleContext.ownerDocument; + // Check for landmarks first + var passed; + if (CacheUtil_1.CacheUtil.getCache(ruleContext, "IBM_hasLandmarks_Implicit", null) === null) { + CacheUtil_1.CacheUtil.setCache(ruleContext, "IBM_hasLandmarks_Implicit", CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, ["application", "banner", "complementary", "contentinfo", + "form", "main", "navigation", "search" + ], true, true).length > 0); + } + passed = CacheUtil_1.CacheUtil.getCache(ruleContext, "IBM_hasLandmarks_Implicit", false); + if (!passed) { // No landmarks, check for skip links + var anchors = CommonUtil_1.CommonUtil.getDocElementsByTag(ruleContext, "a"); + // Skip anchor should be the first one on the page with an href attribute + var testAnchor = null; + for (var i = 0; i < anchors.length; ++i) { + if (anchors[i].hasAttribute("href") && VisUtil_1.VisUtil.isNodeVisible(anchors[i])) { + testAnchor = anchors[i]; + break; + } + } + // Pull out the target id + var targetId = null; + if (testAnchor != null) { + var hrefStr = testAnchor.getAttribute("href"); + var idx = hrefStr.indexOf("#"); + if (idx != -1) { + targetId = hrefStr.substring(idx + 1); + } + } + // Determine if there is an element id or named anchor on the page with this + // target id. + if (targetId != null) { + passed = doc.getElementById(targetId) != null; + for (var i = 0; !passed && i < anchors.length; ++i) { + if (!anchors[i].hasAttribute("href") && + anchors[i].hasAttribute("name") && + anchors[i].getAttribute("name") == targetId) { + passed = true; + } + } + } + } + //return new ValidationResult(passed, [ruleContext], '', '', []); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/style_background_decorative.ts" +/*!*****************************************************!*\ + !*** ./src/v4/rules/style_background_decorative.ts ***! + \*****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.style_background_decorative = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.style_background_decorative = { + id: "style_background_decorative", + context: "dom:style, dom:*[style]", + refactor: { + "RPT_Style_BackgroundImage": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "style_background_decorative.html", + "Potential_1": "style_background_decorative.html", + "group": "style_background_decorative.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify the CSS background image does not convey important information", + "group": "Images included by using CSS alone must not convey important information" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + var passed = true; + if (nodeName === "link" && ruleContext.hasAttribute("rel") && + ruleContext.getAttribute("rel").toLowerCase() === "stylesheet") { + // External stylesheet - trigger + passed = CommonUtil_1.CommonUtil.triggerOnce(ruleContext, "style_background_decorative", false); + } + if (passed && nodeName === "style" || ruleContext.hasAttribute("style")) { + var styleText = void 0; + if (nodeName === "style") + styleText = CommonUtil_1.CommonUtil.getInnerText(ruleContext); + else + styleText = ruleContext.getAttribute("style"); + var bgMatches = styleText.match(/background:[^;]*/g); + if (bgMatches !== null) { + for (var i = 0; passed && i < bgMatches.length; ++i) + passed = bgMatches[i].indexOf("url(") === -1; + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/style_before_after_review.ts" +/*!***************************************************!*\ + !*** ./src/v4/rules/style_before_after_review.ts ***! + \***************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.style_before_after_review = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CSSUtil_1 = __webpack_require__(/*! ../util/CSSUtil */ "./src/v4/util/CSSUtil.ts"); +/** + * Description: Trigger if :before and :after are used in CSS (Internal and External) with content + * Origin: WCAG 2.0 F87 + */ +exports.style_before_after_review = { + id: "style_before_after_review", + context: "dom:style, dom:link", + refactor: { + "WCAG20_Style_BeforeAfter": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "group": "style_before_after_review.html", + "Pass_0": "style_before_after_review.html", + "Potential_1": "style_before_after_review.html" + } + }, + messages: { + "en-US": { + "group": "Do not use CSS '::before' and '::after' pseudo-elements to insert non-decorative content", + "Pass_0": "Rule Passed", + "Potential_1": "Verify the '::before' and '::after' pseudo-elements do not insert non-decorative content" + } + }, + rulesets: [{ + // Turn off the rule due to the obsolete requirement + //id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + id: [], + num: "1.3.1", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = true; + //check Internal styles + if (ruleContext.nodeName.toLowerCase() === "style") { + var css = CSSUtil_1.CSSUtil.getCSSStyle(ruleContext); + for (var i = 0; passed && i < css.length; ++i) { + // Guard against bad CSS + if (css[i].selector) { + passed = (css[i].selector.indexOf(":before") === -1 && css[i].selector.indexOf(":after") === -1) || + !("content" in css[i].values) || css[i].values["content"].trim().length === 0 || css[i].values["content"].trim() === "\"\"" + || css[i].values["content"].trim() === "\'\'" || css[i].values["content"].trim() === "none" || css[i].values["content"].trim() === "attr(x)" + || css[i].values["content"].trim() === "attr(y)"; + } + } + // check special rules in the stylesheets + if (passed) { + for (var sIndex = 0; sIndex < ruleContext.ownerDocument.styleSheets.length; sIndex++) { + var sheet = ruleContext.ownerDocument.styleSheets[sIndex]; + if (sheet.ownerNode === ruleContext) { + try { + var styleRules = sheet.cssRules ? sheet.cssRules : sheet.rules; + if (styleRules) { + for (var styleRuleIndex = 0; passed && styleRuleIndex < styleRules.length; styleRuleIndex++) { + var styleRule = styleRules[styleRuleIndex]; + // check @media rules + // + // The check 'if (styleRule instanceof CSSMediaRule)' doesn't work when run in Karma(but works in DAP) + // so let's access the type directly as a workaround + var styleImportRule = void 0; + if (styleRule.type && styleRule.type === 4 /* CSSRule.MEDIA_RULE */) { + var styleMediaRule = styleRule; + var mediaRules = styleMediaRule.cssRules; + if (mediaRules) { + for (var rIndex = 0; passed && rIndex < mediaRules.length; rIndex++) { + var mRule = mediaRules[rIndex]; // selectorText not recognized + if (mRule.selectorText !== null && mRule.selectorText !== undefined) { + var rule = mRule.selectorText.toLowerCase(); + if (rule.indexOf(":before") !== -1 || rule.indexOf(":after") !== -1) { + var content = mRule.style['content']; + if (content && content.trim().length) { + if (content.trim() !== "\"\"" && + content.trim() !== "\'\'" && + content.trim() !== "none" && + content.trim() !== "attr(x)" && + content.trim() !== "attr(y)") { + passed = false; + } + } + } + } + } + } + } + // check import rules + else if (styleRule.type && styleRule.type === 3 /* CSSRule.IMPORT_RULE */ && (styleImportRule = styleRule).styleSheet) { + var rules = styleImportRule.styleSheet.cssRules ? + styleImportRule.styleSheet.cssRules : + styleImportRule.styleSheet.rules; + if (rules) { + for (var rIndex = 0; passed && rIndex < rules.length; rIndex++) { + var importedRule = rules[rIndex]; + // check @media rules + if (importedRule.type && importedRule.type === 4 /* CSSRule.MEDIA_RULE */) { + var mediaRules = importedRule.cssRules; + if (mediaRules) { + for (var mIndex = 0; mIndex < mediaRules.length; mIndex++) { + var mRule = mediaRules[mIndex]; // selectorText not recognized + if (mRule.selectorText !== null && mRule.selectorText !== undefined) { + var rule = mRule.selectorText.toLowerCase(); + if (rule.indexOf(":before") !== -1 || rule.indexOf(":after") !== -1) { + var content = mRule.style['content']; + if (content && content.trim().length) { + if (content.trim() !== "\"\"" && + content.trim() !== "\'\'" && + content.trim() !== "none" && + content.trim() !== "attr(x)" && + content.trim() !== "attr(y)") { + passed = false; + } + } + } + } + } + } + } + else if (importedRule.selectorText !== null && importedRule.selectorText !== undefined) { + var rule = importedRule.selectorText.toLowerCase(); + //support both single colon (:) and double colon (::) pseudo + if (rule.indexOf(":before") !== -1 || rule.indexOf(":after") !== -1) { + var content = importedRule.style['content']; + if (content && content.trim().length) { + if (content.trim() !== "\"\"" && + content.trim() !== "\'\'" && + content.trim() !== "none" && + content.trim() !== "attr(x)" && + content.trim() !== "attr(y)") { + passed = false; + } + } + } + } + } + } + } + } + } + } + catch (e) { + // Ignore css access issues + } + } + } + } + } + //check external styles + if (ruleContext.nodeName.toLowerCase() === "link" && ruleContext.hasAttribute("rel") && + ruleContext.getAttribute("rel").toLowerCase() === "stylesheet" && + ruleContext.hasAttribute("href") && ruleContext.getAttribute("href").trim().length !== 0) { + for (var sIndex = 0; sIndex < ruleContext.ownerDocument.styleSheets.length; sIndex++) { + var sheet = ruleContext.ownerDocument.styleSheets[sIndex]; + if (sheet && sheet.ownerNode === ruleContext) { + try { + var rules = sheet.cssRules ? sheet.cssRules : sheet.rules; + if (rules) { + for (var rIndex = 0; passed && rIndex < rules.length; rIndex++) { + var ruleFromLink = rules[rIndex]; + // check @media rules + if (ruleFromLink.type && ruleFromLink.type === 4 /* CSSRule.MEDIA_RULE */) { + var mediaRules = ruleFromLink.cssRules; + if (mediaRules) { + for (var mIndex = 0; passed && mIndex < mediaRules.length; mIndex++) { + var mRule = mediaRules[mIndex]; + if (mRule.selectorText !== null && mRule.selectorText !== undefined) { + var ruleSelTxt = mRule.selectorText.toLowerCase(); + if (ruleSelTxt.indexOf(":before") !== -1 || ruleSelTxt.indexOf(":after") !== -1) { + var content = mRule.style['content']; + if (content && content.trim().length) { + if (content.trim() !== "\"\"" && + content.trim() !== "\'\'" && + content.trim() !== "none" && + content.trim() !== "attr(x)" && + content.trim() !== "attr(y)") { + passed = false; + } + } + } + } + } + } + } + else if (rules[rIndex].selectorText !== null && rules[rIndex].selectorText !== undefined) { + var rule = rules[rIndex].selectorText.toLowerCase(); + //support both single colon (:) and double colon (::) pseudo + if (rule.indexOf(":before") !== -1 || rule.indexOf(":after") !== -1) { + var content = rules[rIndex].style['content']; + if (content && content.trim().length) { + if (content.trim() !== "\"\"" && + content.trim() !== "\'\'" && + content.trim() !== "none" && + content.trim() !== "attr(x)" && + content.trim() !== "attr(y)") { + passed = false; + } + } + } + } + } + } + } + catch (e) { + // Ignore css access issues + } + } + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/style_color_misuse.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/style_color_misuse.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.style_color_misuse = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +exports.style_color_misuse = { + id: "style_color_misuse", + context: "dom:style, dom:*[style], dom:font[color], dom:link", + refactor: { + "RPT_Style_ColorSemantics1": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "group": "style_color_misuse.html", + "Pass_0": "style_color_misuse.html", + "Potential_1": "style_color_misuse.html" + } + }, + messages: { + "en-US": { + "group": "Combine color and descriptive markup to convey information", + "Pass_0": "Rule Passed", + "Potential_1": "Verify color is not used as the only visual means of conveying information" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "1.4.1", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + var styleText = ""; + if (nodeName === "style") { + styleText = CommonUtil_1.CommonUtil.getInnerText(ruleContext).toLowerCase(); + // check import + for (var sIndex = 0; sIndex < ruleContext.ownerDocument.styleSheets.length; sIndex++) { + var sheet = ruleContext.ownerDocument.styleSheets[sIndex]; + if (sheet && sheet.ownerNode === ruleContext) { + try { + var styleRules = sheet.cssRules ? sheet.cssRules : sheet.rules; + for (var styleRuleIndex = 0; styleRuleIndex < styleRules.length; styleRuleIndex++) { + var styleRule = styleRules[styleRuleIndex]; + var styleImportRule = void 0; + if (styleRule.type && styleRule.type === 3 /* CSSRule.IMPORT_RULE */ && (styleImportRule = styleRule).styleSheet) { + var importRules = styleImportRule.styleSheet.cssRules ? styleImportRule.styleSheet.cssRules : styleImportRule.styleSheet.rules; + for (var rIndex = 0; rIndex < importRules.length; rIndex++) { + var iRule = importRules[rIndex]; + styleText += iRule.cssText; + } + } + } + } + catch (e) { + // Silence css access issues + } + } + } + } + else if (ruleContext.hasAttribute("style")) { + styleText = ruleContext.getAttribute("style").toLowerCase(); + } + else if (nodeName === "link" && //check external styles + ruleContext.hasAttribute("rel") && + ruleContext.getAttribute("rel").toLowerCase() === "stylesheet" && + ruleContext.hasAttribute("href") && + ruleContext.getAttribute("href").trim().length !== 0) { + for (var sIndex = 0; sIndex < ruleContext.ownerDocument.styleSheets.length; sIndex++) { + var sheet = ruleContext.ownerDocument.styleSheets[sIndex]; + if (sheet && sheet.ownerNode === ruleContext) { + try { + var rules = sheet.cssRules ? sheet.cssRules : sheet.rules; + for (var rIndex = 0; rIndex < rules.length; rIndex++) { + styleText += rules[rIndex].cssText; + } + } + catch (e) { + // Silence css access issues + } + } + } + } + var passed = true; + // Defect 1022: Find uses of 'color' and '*background*' only + var isBgUsed = styleText.match(/\bbackground\b/i); + var theColorStyleToCheck = styleText.replace(/-color/g, ""); + var isColorUsed = theColorStyleToCheck.match(/\bcolor\b/i); + if (ruleContext.hasAttribute("color") || isColorUsed || isBgUsed) { + var goodTagNames = { + "em": "", "strong": "", "cite": "", "dfn": "", + "code": "", "samp": "", "kbd": "", "var": "", "abbr": "", "acronym": "" + }; + // Color used � are there semantics involved? + passed = nodeName in goodTagNames || + CommonUtil_1.CommonUtil.getAncestor(ruleContext, goodTagNames) !== null; + if (!passed && ruleContext.hasChildNodes()) { + var nw = new DOMWalker_1.DOMWalker(ruleContext); + while (!passed && nw.nextNode() && nw.node !== ruleContext) { + passed = nw.node.nodeName.toLowerCase() in goodTagNames; + } + } + } + // Trigger only once + if (!passed) { + var triggered = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "style_color_misuse", false); + passed = triggered; + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "style_color_misuse", true); + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/style_focus_visible.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/style_focus_visible.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.style_focus_visible = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CSSUtil_1 = __webpack_require__(/*! ../util/CSSUtil */ "./src/v4/util/CSSUtil.ts"); +var ColorUtil_1 = __webpack_require__(/*! ../util/ColorUtil */ "./src/v4/util/ColorUtil.ts"); +exports.style_focus_visible = { + id: "style_focus_visible", + context: "dom:*", + refactor: { + "RPT_Style_HinderFocus1": { + "Potential_1": "potential_focus_not_visible" + } + }, + help: { + "en-US": { + "group": "style_focus_visible.html", + "potential_focus_not_visible": "style_focus_visible.html", + "pass_focus_visible": "style_focus_visible.html" + } + }, + messages: { + "en-US": { + "group": "The keyboard focus indicator should be visible when default border or outline is modified by CSS", + "potential_focus_not_visible": "Check the keyboard focus indicator is visible when using CSS declaration for 'border' or 'outline'", + "pass_focus_visible": "The keyboard focus indicator is visible or is not changed from the browser default" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "2.4.7", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + skipNodes: { + value: ["table"], + type: "[string]" + }, + checkParams: { + value: ["border", "border-width", "border-style", + "border-top-width", "border-right-width", "border-bottom-width", "border-left-width", + "border-top-color", "border-right-color", "border-bottom-color", "border-left-color", + "border-top-style", "border-right-style", "border-bottom-style", "border-left-style", + "outline", "outline-width", "outline-color", "outline-style"], + type: "[string]" + } + }; + var ruleContext = context["dom"].node; + if (!CommonUtil_1.CommonUtil.isTabbable(ruleContext) || validateParams.skipNodes.value.includes(ruleContext.nodeName.toLowerCase())) { + return null; + } + // Get all styles in a single pass through stylesheets + var allStyles = CSSUtil_1.CSSUtil.getDefinedStylesMultiple(ruleContext, null, ["", ":focus", ":focus-visible", ":focus-within"]); + var normalStyles = allStyles[""]; // consider both user-defined and browser default + var focusStyles = []; + focusStyles.push(allStyles[":focus"]); + focusStyles.push(allStyles[":focus-visible"]); + focusStyles.push(allStyles[":focus-within"]); + // if focus style is defined + var styleObj = focusStyles[0]; + if (Object.keys(styleObj).length > 0) { + //pass if outline is not defined at all, browser will override + if (((!normalStyles["outline-width"] && !normalStyles["outline-style"]) + || (normalStyles["outline-width"] === '0px' || normalStyles["outline-style"] === 'none')) + && (!styleObj["outline-style"] || styleObj["outline-style"] !== 'none')) + return (0, IRule_1.RulePass)("pass_focus_visible"); + var noneStyle = false; + var numOtherStyle = 0; + for (var focusStyle in styleObj) { + if (validateParams.checkParams.value.includes(focusStyle)) { + /** + * failure case: + * 1. focus outline or border style is none and no other style (color or width) defined + * 2. focus outline or border style is same with the normal + * 3. size in focus is same or smaller than default + * 4. color contrast in focus is better + */ + var focusStyleValue = styleObj[focusStyle]; + var normalStyleValue = normalStyles[focusStyle]; + if (focusStyle.includes("style")) { + if (focusStyleValue === "none") + noneStyle = true; + else + noneStyle = false; + if (normalStyleValue && focusStyleValue !== "none" && focusStyleValue === normalStyleValue) + return (0, IRule_1.RulePotential)("potential_focus_not_visible"); + } + else if (focusStyle.includes("width")) { + numOtherStyle++; + //proximation of the width style + if (focusStyleValue === 'initial') + focusStyleValue = '2px'; + else if (focusStyleValue === 'thin') + focusStyleValue = '1px'; + else if (focusStyleValue === 'medium') + focusStyleValue = '2px'; + else if (focusStyleValue === 'thick') + focusStyleValue = '3px'; + if (normalStyleValue) { + if (normalStyleValue === 'initial') + normalStyleValue = '2px'; + else if (normalStyleValue === 'thin') + normalStyleValue = '1px'; + else if (normalStyleValue === 'medium') + normalStyleValue = '2px'; + else if (normalStyleValue === 'thick') + normalStyleValue = '3px'; + } + focusStyleValue = CSSUtil_1.CSSUtil.getPixelsFromStyle(focusStyleValue, ruleContext); + normalStyleValue = CSSUtil_1.CSSUtil.getPixelsFromStyle(normalStyleValue, ruleContext); + if (focusStyleValue == 0 || focusStyleValue <= normalStyleValue) + return (0, IRule_1.RulePotential)("potential_focus_not_visible"); + } + else if (focusStyle.includes("color")) { + numOtherStyle++; + // get the element bg color + var colorCombo = ColorUtil_1.ColorUtil.ColorCombo(ruleContext); + if (colorCombo === null) + continue; + var bg = colorCombo.bg; + if (!bg) + continue; + //proximation of the width style + if (focusStyleValue === 'initial') + focusStyleValue = 'black'; + if (normalStyleValue && normalStyleValue === 'initial') + normalStyleValue = 'black'; + // get the border/outline color as fg colors + focusStyleValue = ColorUtil_1.ColorUtil.Color(focusStyleValue); + normalStyleValue = ColorUtil_1.ColorUtil.Color(normalStyleValue); + if (focusStyleValue === null || normalStyleValue === null) + continue; + //get the border/outline color contrast ratios + var focusRatio = focusStyleValue.contrastRatio(bg); + var normalRatio = normalStyleValue.contrastRatio(bg); + if (focusRatio < 3.0 || focusRatio <= normalRatio) + return (0, IRule_1.RulePotential)("potential_focus_not_visible"); + } + else { + //other + numOtherStyle++; + if (normalStyleValue != null && focusStyleValue === normalStyleValue) + return (0, IRule_1.RulePotential)("potential_focus_not_visible"); + } + } + } + // warn if a border/outline focus style is 'none' and noe other (color and/or width) is defined + if (noneStyle && numOtherStyle === 0) + return (0, IRule_1.RulePotential)("potential_focus_not_visible"); + } + else { + // no focus style defined + // warn if normal style is defined and is not "none" + for (var normalStyle in normalStyles) { + if (validateParams.checkParams.value.includes(normalStyle)) { + var normalStyleValue = normalStyles[normalStyle]; + // ignore if border or outline style is "none" + if (normalStyleValue !== 'none') + return (0, IRule_1.RulePotential)("potential_focus_not_visible"); + } + } + } + return (0, IRule_1.RulePass)("pass_focus_visible"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/style_highcontrast_visible.ts" +/*!****************************************************!*\ + !*** ./src/v4/rules/style_highcontrast_visible.ts ***! + \****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.style_highcontrast_visible = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +exports.style_highcontrast_visible = { + id: "style_highcontrast_visible", + context: "dom:style, dom:link, dom:*[style]", + refactor: { + "RPT_Style_Trigger2": { + "Pass_0": "Pass_0", + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Pass_0": "style_highcontrast_visible.html", + "Manual_1": "style_highcontrast_visible.html", + "group": "style_highcontrast_visible.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Manual_1": "Confirm Windows high contrast mode is supported when using CSS to include, position or alter non-decorative content", + "group": "Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["1.1.1", "1.3.2", "1.4.11"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }, + { + "id": ["WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1", "1.3.2", "1.4.11"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (nodeName === "link" && + (!ruleContext.hasAttribute("rel") || ruleContext.getAttribute("rel").toLowerCase() !== "stylesheet")) + return (0, IRule_1.RulePass)("Pass_0"); + if (nodeName !== "style" && nodeName !== "link" && + ruleContext.hasAttribute("style") && ruleContext.getAttribute("style").trim().length === 0) + return (0, IRule_1.RulePass)("Pass_0"); + var triggered = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "style_highcontrast_visible", false); + var passed = triggered; + // Packages.java.lang.System.out.println(triggered); + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "style_highcontrast_visible", true); + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/style_hover_persistent.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/style_hover_persistent.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.style_hover_persistent = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.style_hover_persistent = { + id: "style_hover_persistent", + context: "dom:style, dom:*[style], dom:*", + help: { + "en-US": { + "Pass_0": "style_hover_persistent.html", + // "Pass_1": "style_hover_persistent.html", + "Pass_2": "style_hover_persistent.html", + "Potential_1": "style_hover_persistent.html", + "Potential_2": "style_hover_persistent.html", + "Potential_3": "style_hover_persistent.html", + "group": "style_hover_persistent.html" + } + }, + messages: { + "en-US": { + "Pass_0": "the hover: pseudo-class is not used to display content", + // "Pass_1": "content displayed via the :hover pseudo-class is a direct child of the trigger element", + "Pass_2": "content displayed via the :hover pseudo-class is the adjacent sibling of the trigger element", + "Potential_1": "Confirm the pointer can be positioned over the displayed element, not just the trigger", + "Potential_2": "Confirm the pointer can be positioned over all the information displayed on hover", + "Potential_3": "Confirm the margin style attribute has not prevented the pointer from hovering over the displayed element, not just the trigger", + "group": "The pointer should be able to move over content displayed on hover" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_2"], + "num": ["1.4.13"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var pass0 = false; + var pass1 = false; + var pass2 = false; // never happen + var potential1 = false; + var potential2 = false; + var potential3 = false; + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + var styleText = ""; + if (nodeName === "style") { + // console.log("RULE RUN ******************"); + styleText = CommonUtil_1.CommonUtil.getInnerText(ruleContext).toLowerCase(); + // check import + // console.log("ruleContext.ownerDocument.styleSheets.length = "+ruleContext.ownerDocument.styleSheets.length); + for (var sIndex = 0; sIndex < ruleContext.ownerDocument.styleSheets.length; ++sIndex) { + var sheet = ruleContext.ownerDocument.styleSheets[sIndex]; + if (sheet && sheet.ownerNode === ruleContext) { + try { + var styleRules = sheet.cssRules ? sheet.cssRules : sheet.rules; + // console.log("styleRules.length = "+styleRules.length); + for (var styleRuleIndex = 0; styleRuleIndex < styleRules.length; styleRuleIndex++) { + // console.log("**********"); + // console.log("********** FOR LOOP styleRuleIndex = "+styleRuleIndex); + var foundHover = false; + var hoverElement = ""; + var plusCombinator = false; + var tildeCombinator = false; + var afterCombinatorElement = ""; + var afterCombinatorElementDisplay = false; + var afterCombinatorElementDisplayValue = false; + var afterCombinatorElementHover = false; + var supportingElement = false; + var supportingHover = false; + var supportingHoverElementDisplayProperty = false; + var supportingHoverElementDisplayValue = false; + var adjacentPlusSibling = false; + var adjacentTildeMultipleSibling = false; + var styleRule = styleRules[styleRuleIndex]; + var ruleText = styleRules[styleRuleIndex].cssText; + // console.log("styleRules["+styleRuleIndex+"] = "+ruleText); + // 1. Check for :hover + if (ruleText.match(/:hover/g)) { + foundHover = true; + // console.log("1. found :hover = "+ foundHover); + // 2. Get hover element + hoverElement = ruleText.split(":")[0]; + // console.log("2. found element that goes with :hover = "+hoverElement); + } + else { + // console.log("1. No hover on css element so skip this rule"); + continue; // if no :hover skip this rule + } + // 3a. Check for css combinator + + // 4a. if so do we have an after combinator element + var plusTempStr = ruleText.substring(ruleText.indexOf("+") + 1); + plusTempStr = plusTempStr.trim(); + if (ruleText.match(/:hover \+/g) || ruleText.match(/:hover\+/g)) { + plusCombinator = true; + // console.log("3a. Found plusCombinator = "+ plusCombinator); + afterCombinatorElement = plusTempStr.split(" ")[0]; + // console.log("4a. Found plus afterCombinatorElement = "+afterCombinatorElement); + } + // 3b. Check for css combinator + + // 4b. if so do we have an after combinator element + if (ruleText.match(/:hover \~/g) || ruleText.match(/:hover\~/g)) { + // console.log("match = "+ruleText.match(":hover \~")); + tildeCombinator = true; + // console.log("3b. Found tildeCombinator = "+ tildeCombinator); + var plusTempStr_1 = ruleText.substring(ruleText.indexOf("~") + 1); + plusTempStr_1 = plusTempStr_1.trim(); + afterCombinatorElement = plusTempStr_1.split(" ")[0]; + // console.log("4b. Found tilde afterCombinatorElement = "+afterCombinatorElement); + } + if (!plusCombinator && !tildeCombinator) { + // NO plusCombinator or tildeCombinator so skip this rule + // console.log("NO plusCombinator or tildeCombinator so PASS"); + // console.log("**** REPORT PASS 0 HERE"); + return (0, IRule_1.RulePass)("Pass_0"); // JCH: should we have a N/A pass + } + // So now we have a css element with hover - element:hover so we have problems + // to check + // 5. Check if the after combinator element has display: property + // 6. Check if display property is not none + if (afterCombinatorElement) { + // get index of display: + // console.log("plusTempStr = "+plusTempStr); + var index = plusTempStr.indexOf("display:"); + if (index) { + afterCombinatorElementDisplay = true; + // console.log("5. Found afterCombinatorElementDisplay = "+afterCombinatorElementDisplay); + if (plusTempStr.slice(index + 8).trim().split(" ")[0] !== "none;") { + afterCombinatorElementDisplayValue = true; + // console.log("6. Found afterCombinatorElementDisplayValue not none = "+afterCombinatorElementDisplayValue); + } + else { + // console.log("afterCombinatorElementDisplayValue === none"); + // console.log("**** PUT POTENTIAL 0 HERE"); + continue; + } + } + else { + // this is bad css so it won't happen + // console.log("NO afterCombinatorElementDisplay so skip this rule"); + continue; + } + } + else { + // this is bad css so it won't happen + // console.log("NO afterCombinatorElement so skip this rule"); + continue; + } + if (afterCombinatorElementDisplayValue) + if (sheet && sheet.ownerNode === ruleContext) { + // console.log("**** At this point we have verified that we have a css element with a hover of the format span:hover + div { display: block; } with all the proper properties and values"); + // NOTE: At this point we have verified that we have a css element with a hover + // of the format span:hover + div { display: block; } + // with all the proper properties and values + try { + var styleRules2 = sheet.cssRules ? sheet.cssRules : sheet.rules; + // console.log("styleRules2.length = "+styleRules2.length); + for (var styleRuleIndex2 = 0; styleRuleIndex2 < styleRules2.length; styleRuleIndex2++) { + // Check rule for afterCominatorElement:hover + // If find afterCombinatorElement:hover see if rule has property display: value where + // value != none + // console.log("**********"); + // console.log("********** 2nd FOR styleRuleIndex2 = "+styleRuleIndex2); + var ruleText2 = styleRules[styleRuleIndex2].cssText; + // console.log("ruleText2 = ", ruleText2); + // console.log("afterCombinatorElement = "+afterCombinatorElement); + // Check all supporting elements for margin property + // If find margin STOP and REPORT ERROR + var regExString = afterCombinatorElement + " {"; + var trimRuleText2 = ruleText2.trim(); + var regIndex = trimRuleText2.indexOf(regExString); + var afterCombinatorElementProperties = trimRuleText2.slice(regIndex).trim(); + //if (!afterCombinatorElementProperties.match(/margin/g)) { + if (!trimRuleText2.match(/margin/g)) { + // console.log("No margin problem so continue on..."); + // do we have a supporting element css definitions + var supportingHoverElement = ruleText2.split(":")[0]; + supportingHoverElement = supportingHoverElement.split(" ")[0]; + // console.log("supportingHoverElement = "+supportingHoverElement); + // console.log("afterCombinatorElement = "+afterCombinatorElement); + // NEED TO CHECK FOR afterCominatorElement:hover in ONE STEP + if (supportingHoverElement === afterCombinatorElement && ruleText2.match(/:hover/g)) { + // console.log("7. Found supporting hover element same as afterCombinatorElement") + // 7. Found supporting hover element same as afterCombinatorElement + supportingElement = true; + // does supporting element have hover + // console.log("8. Supporting element has hover also = "+ foundHover); + // 8. Supporting element has hover also + supportingHover = true; + var index = ruleText2.indexOf("display:"); + // console.log("index = "+index); + if (index) { + // 9. Found supportingHoverElementDisplayProperty + supportingHoverElementDisplayProperty = true; + // console.log("9. Found supportingHoverElementDisplayProperty = "+supportingHoverElementDisplayProperty); + if (plusTempStr.slice(index + 8).trim().split(" ")[0] !== "none;") { + // 10. Found supportingHoverElementDisplayValue not none + supportingHoverElementDisplayValue = true; + // console.log("10. Found supportingHoverElementDisplayValue not none = "+supportingHoverElementDisplayValue); + // Get list of hover elements and next sibling for + + // For + there must be at least one ADJACENT sibling + if (hoverElement !== "" && plusCombinator) { + var hoverElementList = ruleContext.ownerDocument.getElementsByTagName(hoverElement.toUpperCase()); + // console.log("hoverElementList.length = "+hoverElementList.length); + // console.log("hoverElementList[0].tagName = "+hoverElementList[0].tagName); + // Get adjacent sibling + // console.log("Adjacent sibling = "+hoverElementList[0].nextElementSibling.tagName); + // console.log("afterCombinatorElement.toUpperCase() = "+afterCombinatorElement.toUpperCase()); + if (afterCombinatorElement.toUpperCase() === hoverElementList[0].nextElementSibling.tagName) { + // console.log("11a. Hover with plus has adjacent sibling.") + // 11a. Hover with plus has adjacent sibling. + adjacentPlusSibling = true; + // At this point we have verified a supporting afterCombinatorElement css rule that contains hover and display property that is not equal to none and has a hover element in the body with an adjacent sibling + // console.log("**** REPORT PASS 1 HERE"); + pass0 = true; + continue; + } + } + else if (plusCombinator) { + // console.log("11a. Main hover with + combinator has no adjacent sibling"); + if (!potential1) { + // console.log("**** PUT POTENTIAL 1 HERE"); + potential1 = true; + break; + } + continue; + } + // Get list of hover elements and determine if there are 2 or more adjacent siblings for ~ + // For ~ there must be at least one ADJACENT sibling + if (hoverElement !== "" && tildeCombinator) { + // console.log("hoverElement.toUpperCase() = "+hoverElement.toUpperCase()); + var hoverElementList = ruleContext.ownerDocument.getElementsByTagName(hoverElement.toUpperCase()); + // console.log("hoverElementList.length = "+hoverElementList.length); + // Check for two or more adjacent siblings + var siblings = []; + var sibling = hoverElementList[0].nextElementSibling; + do { + // console.log("sibling.tagName = "+sibling.tagName); + if (sibling.tagName === afterCombinatorElement.toUpperCase()) { + siblings.push(sibling); + } + else { + break; + } + } while ((sibling = sibling.nextElementSibling)); + var siblingCount = siblings.length; + // console.log("siblingCount = "+siblingCount); + // JCH TODO: what if sibling count 0 + if (siblingCount === 1) { + // console.log("11b. Hover with tilde and one adjacent sibling"); + adjacentTildeMultipleSibling = true; + // console.log("**** REPORT PASS 2 HERE"); + return (0, IRule_1.RulePass)("Pass_2"); + } + else if (siblingCount > 1) { + // console.log("Main hover with ~ combinator has two or more siblings"); + if (!potential2) { + // console.log("**** PUT POTENTIAL 2 HERE"); + return (0, IRule_1.RulePotential)("Potential_2"); + } + } + } + } + else if (plusCombinator) { + // supportingHoverElementDisplayValue + // if we make it to the last rule and supportingHoverElementDisplayValue is still false => potential1 + if (styleRuleIndex2 === styleRules2.length - 1 && supportingHoverElementDisplayValue === false) { + // console.log("NO plus supportingHoverElementDisplayProperty"); + // console.log("**** PUT POTENTIAL 1 HERE"); + return (0, IRule_1.RulePotential)("Potential_1"); + } + else { + continue; + } + } + else if (tildeCombinator) { + // if we make it to the last rule and supportingHoverElementDisplayValue is still false => potential2 + if (styleRuleIndex2 === styleRules2.length - 1 && supportingHoverElementDisplayValue === false) { + // console.log("NO plus supportingHoverElementDisplayProperty"); + // console.log("**** PUT POTENTIAL 2 HERE"); + return (0, IRule_1.RulePotential)("Potential_1"); + } + else { + continue; + } + } + // note at least one of the rules must have a display property + } + else if (plusCombinator) { + // if we make it to the last rule and supportingHoverElementDisplayProperty is still false => potential1 + if (styleRuleIndex2 === styleRules2.length - 1 && supportingHoverElementDisplayProperty === false) { + // console.log("NO plus supportingHoverElementDisplayProperty"); + // console.log("**** PUT POTENTIAL 1 HERE"); + return (0, IRule_1.RulePotential)("Potential_1"); + } + else { + continue; + } + } + else if (tildeCombinator) { + // if we make it to the last rule and supportingHoverElementDisplayProperty is still false => potential2 + if (styleRuleIndex2 === styleRules2.length - 1 && supportingHoverElementDisplayProperty === false) { + // console.log("NO tilde supportingHoverElementDisplayProperty"); + // console.log("**** PUT POTENTIAL 2 HERE"); + return (0, IRule_1.RulePotential)("Potential_1"); + } + else { + continue; + } + } + // note at least one of the rules must have a supportingElement:hover + } + else if (plusCombinator) { + // if we make it to the last rule and supportingElement is still false => potential1 + // console.log("styleRuleIndex2 = "+styleRuleIndex2); + // console.log("styleRules2.length = "+styleRules2.length); + // console.log("supportingElement = "+supportingHover); + if (styleRuleIndex2 === styleRules2.length - 1 && supportingHover === false) { + // console.log("NO plus supportingElement:hover"); + // console.log("**** PUT POTENTIAL 1 HERE"); + return (0, IRule_1.RulePotential)("Potential_1"); + } + else { + continue; + } + } + else if (tildeCombinator) { + // if we make it to the last rule and supportingElement is still false => potential2 + // console.log("styleRuleIndex2 = "+styleRuleIndex2); + // console.log("styleRules2.length = "+styleRules2.length); + // console.log("supportingElement = "+supportingHover); + if (styleRuleIndex2 === styleRules2.length - 1 && supportingHover === false) { + // console.log("NO tilde supportingElement:hover"); + // console.log("**** PUT POTENTIAL 2 HERE"); + return (0, IRule_1.RulePotential)("Potential_2"); + } + else { + continue; + } + } + } + else { + // console.log("There is a margin in the supporting element"); + if (!potential3) { + // console.log("**** PUT POTENTIAL 3 HERE"); + potential3 = true; + return (0, IRule_1.RulePotential)("Potential_3"); + } + } + } + } + catch (e) { + // Silence css access issues + } + } + } + } + catch (e) { + // Silence css access issues + } + } + } + } + // console.log("----------------------"); + // console.log("pass0 = "+pass0); + // console.log("pass1 = "+pass1); + // console.log("pass2 = "+pass2); + // console.log("potential1 = "+potential1); + // console.log("potential2 = "+potential2); + // console.log("potential3 = "+potential3); + if (pass0) + return (0, IRule_1.RulePass)("Pass_0"); + // if (pass1) return RulePass("Pass_2"); // Doesn't trigger + // if (pass2) return RulePass("Pass_3"); // Doesn't trigger + if (potential1) + return (0, IRule_1.RulePotential)("Potential_1"); + if (potential2) + return (0, IRule_1.RulePotential)("Potential_2"); + if (potential3) + return (0, IRule_1.RulePotential)("Potential_3"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/style_viewport_resizable.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/style_viewport_resizable.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.style_viewport_resizable = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +/** + * Description: Trigger when viewport units are used for font size. + * Origin: Various + */ +exports.style_viewport_resizable = { + id: "style_viewport_resizable", + context: "dom:link, dom:style, dom:*[style]", + refactor: { + "WCAG21_Style_Viewport": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "group": "style_viewport_resizable.html", + "Pass_0": "style_viewport_resizable.html", + "Potential_1": "style_viewport_resizable.html" + } + }, + messages: { + "en-US": { + "group": "Text must scale up to 200% without loss of content or functionality", + "Pass_0": "Rule Passed", + "Potential_1": "Verify that text sized using viewport units can be resized up to 200%" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: ["1.4.4", "1.4.10"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = true; + var thePattern = /\d+(vw|vh|vmin|vmax)/gi; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (nodeName === "style") { + for (var sIndex = 0; sIndex < ruleContext.ownerDocument.styleSheets.length; sIndex++) { + var sheet = ruleContext.ownerDocument.styleSheets[sIndex]; + if (sheet.ownerNode === ruleContext) { + try { + var styleRules = sheet.cssRules ? sheet.cssRules : sheet.rules; + if (styleRules) { + for (var styleRuleIndex = 0; passed && styleRuleIndex < styleRules.length; styleRuleIndex++) { + var rule = styleRules[styleRuleIndex]; + if (rule.type && rule.type === 1 /* CSSRule.STYLE_RULE */) { + var styleRule = rule; + if (styleRule.style['fontSize']) { + var fontSize = styleRule.style['fontSize'].trim(); + var found = fontSize.match(thePattern); + if (fontSize.length && found) { + passed = false; + } + } + } + // check import rules + else if (rule.type && rule.type === 3 /* CSSRule.IMPORT_RULE */ && rule.styleSheet) { + var importRule = rule; + var rules = importRule.styleSheet.cssRules ? importRule.styleSheet.cssRules : importRule.styleSheet.rules; + if (rules) { + for (var rIndex = 0; passed && rIndex < rules.length; rIndex++) { + var importedRule = rules[rIndex]; + if (importedRule.type && importedRule.type === 1 /* CSSRule.STYLE_RULE */) { + if (importedRule.style['fontSize']) { + var fontSize = importedRule.style['fontSize'].trim(); + var found = fontSize.match(thePattern); + if (fontSize.length && found) { + passed = false; + } + } + } + } + } + } + } + } + } + catch (e) { + // Ignore css access issues + } + } + } + } + else if (nodeName === "link") { + for (var sIndex = 0; sIndex < ruleContext.ownerDocument.styleSheets.length; sIndex++) { + var sheet = ruleContext.ownerDocument.styleSheets[sIndex]; + if (sheet && sheet.ownerNode === ruleContext) { + try { + var rules = sheet.cssRules ? sheet.cssRules : sheet.rules; + if (rules) { + for (var rIndex = 0; passed && rIndex < rules.length; rIndex++) { + var ruleFromLink = rules[rIndex]; + // check rules + if (ruleFromLink.type && ruleFromLink.type === 1 /* CSSRule.STYLE_RULE */) { + if (ruleFromLink.style['fontSize']) { + var fontSize = ruleFromLink.style['fontSize'].trim(); + var found = fontSize.match(thePattern); + if (fontSize.length && found) { + passed = false; + } + } + } + } + } + } + catch (e) { + // Ignore css access issues + } + } + } + } + else { + var styleValue = ruleContext.getAttribute('style'); + if (styleValue) { + var stylePattern = /font-size:\s*\d+(vw|vh|vmin|vmax)/gi; + var found = styleValue.match(stylePattern); + if (found) { + passed = false; + } + } + } + return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/svg_graphics_labelled.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/svg_graphics_labelled.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.svg_graphics_labelled = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.svg_graphics_labelled = { + id: "svg_graphics_labelled", + context: "dom:svg", + help: { + "en-US": { + "group": "svg_graphics_labelled.html", + "pass": "svg_graphics_labelled.html", + "fail_acc_name": "svg_graphics_labelled.html" + } + }, + messages: { + "en-US": { + "group": "A non-decorative SVG element must have an accessible name", + "pass": "The SVG element has an accessible name", + "fail_acc_name": "The SVG element has no accessible name" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [{ + "7d6734": { + "pass": "pass", + "fail_acc_name": "fail" + } + }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || VisUtil_1.VisUtil.isNodePresentational(ruleContext) || AccNameUtil_1.AccNameUtil.isAccessibleNameIgnorable(ruleContext)) + return null; + var name_pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + if (name_pair && name_pair.name && name_pair.name.trim().length > 0) + return (0, IRule_1.RulePass)("pass"); + return (0, IRule_1.RuleFail)("fail_acc_name"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/table_aria_descendants.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/table_aria_descendants.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_aria_descendants = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.table_aria_descendants = { + id: "table_aria_descendants", + context: "aria:table dom:tr[role], aria:table dom:th[role], aria:table dom:td[role], aria:grid dom:tr[role], aria:grid dom:th[role], aria:grid dom:td[role], aria:treegrid dom:tr[role], aria:treegrid dom:th[role], aria:treegrid dom:td[role]", + help: { + "en-US": { + "group": "table_aria_descendants.html", + "explicit_role": "table_aria_descendants.html" + } + }, + messages: { + "en-US": { + "group": "Table structure elements cannot specify an explicit 'role' within table containers", + "explicit_role": "An explicit ARIA 'role' is not valid for <{0}> element within an ARIA role '{1}' per the ARIA in HTML specification" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var parentRole = CommonUtil_1.CommonUtil.isTableDescendant(contextHierarchies); + // cache the result + if (parentRole === null || parentRole.length === 0) + return; + // ignore the redundancy cases: reported in the aria_role_redundant rule + var implicitRoles = AriaUtil_1.AriaUtil.getImplicitRole(ruleContext); + var explicitRoles = AriaUtil_1.AriaUtil.getRoles(ruleContext, false); + ; + if (implicitRoles && implicitRoles.length > 0 && explicitRoles && explicitRoles.length > 0 + && explicitRoles.some(function (item) { return implicitRoles.includes(item); })) + return; + return (0, IRule_1.RuleFail)("explicit_role", [context["dom"].node.nodeName.toLowerCase(), parentRole[0].role]); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/table_caption_empty.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/table_caption_empty.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_caption_empty = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.table_caption_empty = { + id: "table_caption_empty", + context: "dom:caption", + refactor: { + "Valerie_Caption_HasContent": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "table_caption_empty.html", + "Fail_1": "table_caption_empty.html", + "group": "table_caption_empty.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The <table> element has an empty <caption> element", + "group": "A <caption> element for a <table> element must contain descriptive text" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = CommonUtil_1.CommonUtil.hasInnerContentHidden(ruleContext); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/table_caption_nested.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/table_caption_nested.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_caption_nested = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.table_caption_nested = { + id: "table_caption_nested", + context: "dom:caption", + refactor: { + "Valerie_Caption_InTable": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "table_caption_nested.html", + "Fail_1": "table_caption_nested.html", + "group": "table_caption_nested.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "<caption> element is not nested inside a <table> element", + "group": "The <caption> element must be nested inside the associated <table> element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = CommonUtil_1.CommonUtil.getAncestor(ruleContext, "table") != null; + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/table_headers_exists.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/table_headers_exists.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_headers_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var TableUtil_1 = __webpack_require__(/*! ../util/TableUtil */ "./src/v4/util/TableUtil.ts"); +exports.table_headers_exists = { + id: "table_headers_exists", + context: "dom:table", + refactor: { + "RPT_Table_DataHeadingsAria": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "table_headers_exists.html", + "Fail_1": "table_headers_exists.html", + "group": "table_headers_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Table has no headers identified", + "group": "Data table must identify headers" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // If this is a layout table or there are no rows, the rule does not apply. + var rows = ruleContext.rows; + if (!TableUtil_1.TableUtil.isDataTable(ruleContext) || rows === null || rows.length === 0) + return null; + var passed = TableUtil_1.TableUtil.tableHeaderExists(ruleContext); + if (passed === null) + return; + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/table_headers_ref_valid.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/table_headers_ref_valid.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_headers_ref_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var ARIAMapper_1 = __webpack_require__(/*! ../../v2/aria/ARIAMapper */ "./src/v2/aria/ARIAMapper.ts"); +exports.table_headers_ref_valid = { + id: "table_headers_ref_valid", + context: "dom:td[headers], dom:th[headers]", + help: { + "en-US": { + "Pass_0": "table_headers_ref_valid.html", + "Fail_1": "table_headers_ref_valid.html", + "Fail_2": "table_headers_ref_valid.html", + "Fail_3": "table_headers_ref_valid.html", + "Fail_4": "table_headers_ref_valid.html", + "group": "table_headers_ref_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The 'headers' attribute value \"{0}\" does not reference a valid 'id' in this document", + "Fail_2": "The 'headers' attribute value \"{0}\" refers to itself", + "Fail_3": "The 'headers' attribute value \"{0}\" does not refer to a cell in the same table", + "Fail_4": "The 'headers' attribute value \"{0}\" does not refer to a cell indicated with <th> or a role of \"columnheader\" or \"rowheader\"", + "group": "The 'headers' attribute should refer to a valid cell in the same table" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: ["a25f45"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var parentTable = CommonUtil_1.CommonUtil.getAncestor(ruleContext, "table"); + var parentRole = ARIAMapper_1.ARIAMapper.nodeToRole(parentTable); + // If this is a layout table or a simple table the rule does not apply. + if (parentTable == null || !VisUtil_1.VisUtil.isNodeVisible(parentTable) || !["table", "grid"].includes(parentRole)) + return null; + var nodeName = ruleContext.nodeName.toLowerCase(); + var doc = ruleContext.ownerDocument; + var value = ruleContext.getAttribute("headers"); + if (!value) + return null; + var ids = value.split(" "); + var invalidHeaderValues = []; + var sameNodeHeaderValues = []; + var sameTableHeaderValues = []; + var invalidElemHeaderValues = []; + for (var i = 0; i < ids.length; i++) { + var id = ids[i]; + if (id.trim() === '') + continue; + var elem = doc.getElementById(id); + if (!elem) + invalidHeaderValues.push(id); + else if (DOMUtil_1.DOMUtil.sameNode(elem, ruleContext)) + sameNodeHeaderValues.push(id); + else if (!DOMUtil_1.DOMUtil.isInSameTable(elem, ruleContext)) + sameTableHeaderValues.push(id); + else { + var elemName = elem.nodeName.toLowerCase(); + if (elemName !== 'th') { + var roles = AriaUtil_1.AriaUtil.getRoles(elem, true); + if (!roles.includes('columnheader') && !roles.includes('rowheader')) + invalidElemHeaderValues.push(id); + } + } + } + var results = []; + if (invalidHeaderValues.length != 0) + results.push((0, IRule_1.RuleFail)("Fail_1", [invalidHeaderValues.toString()])); + if (sameNodeHeaderValues.length != 0) + results.push((0, IRule_1.RuleFail)("Fail_2", [sameNodeHeaderValues.toString()])); + if (sameTableHeaderValues.length != 0) + results.push((0, IRule_1.RuleFail)("Fail_3", [sameTableHeaderValues.toString()])); + if (invalidElemHeaderValues.length != 0) + results.push((0, IRule_1.RuleFail)("Fail_4", [invalidElemHeaderValues.toString()])); + if (results.length == 0) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return results; + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/table_headers_related.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/table_headers_related.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_headers_related = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var TableUtil_1 = __webpack_require__(/*! ../util/TableUtil */ "./src/v4/util/TableUtil.ts"); +exports.table_headers_related = { + id: "table_headers_related", + context: "dom:td, dom:th", + refactor: { + "Valerie_Table_DataCellRelationships": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "table_headers_related.html", + "Fail_1": "table_headers_related.html", + "group": "table_headers_related.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Complex table does not have headers for each cell properly defined with 'header' or 'scope'", + "group": "For a complex data table, all <th> and <td> elements must be related via 'header' or 'scope' attributes" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var parentTable = CommonUtil_1.CommonUtil.getAncestor(ruleContext, "table"); + // If this is a layout table or a simple table the rule does not apply. + if (parentTable == null || !TableUtil_1.TableUtil.isComplexDataTable(parentTable)) + return null; + // If this table hasn't been preprocessed, process it. + if (CacheUtil_1.CacheUtil.getCache(ruleContext, "table_headers_related", null) === null) { + // Build a grid that's actually usable (rowspan and colspan elements are duplicated) + // This builds a real 2d table array. + var grid = []; + for (var i = 0; i < parentTable.rows.length; ++i) { + var row = parentTable.rows[i]; + if (!grid[i]) + grid[i] = []; + for (var j = 0; j < row.cells.length; ++j) { + var cell = row.cells[j]; + CacheUtil_1.CacheUtil.setCache(cell, "table_headers_related", i + ":" + j); + var width = parseInt(cell.getAttribute("colspan")); + if (!width) + width = 1; + var height = parseInt(cell.getAttribute("rowspan")); + if (!height) + height = 1; + var gX = 0; + while (grid[i][gX]) + gX += 1; + for (var k = 0; k < height; ++k) { + if (!grid[i + k]) + grid[i + k] = []; + for (var l = 0; l < width; ++l) { + grid[i + k][gX + l] = cell; + } + } + } + } + // Iterate through the table grid and record headers that point to cells and + // cells that are pointed to by headers + var doc = ruleContext.ownerDocument; + var lookup = {}; + var scopedCols = {}; + for (var i = 0; i < grid.length; ++i) { + var rowScoped = false; + for (var j = 0; j < grid[i].length; ++j) { + var gridCell = grid[i][j]; + var gridNodeName = gridCell.nodeName.toLowerCase(); + if (gridNodeName == "th") { + if (gridCell.getAttribute("scope") == "row") { + rowScoped = true; + // If there's an axis attribute, it must be referred to by headers, + // scope is not enough. + if (!CommonUtil_1.CommonUtil.attributeNonEmpty(gridCell, "axis")) + lookup[CacheUtil_1.CacheUtil.getCache(gridCell, "table_headers_related", null)] = true; + } + else if (gridCell.getAttribute("scope") == "col") { + scopedCols[j] = true; + // If there's an axis attribute, it must be referred to by headers, + // scope is not enough. + if (!CommonUtil_1.CommonUtil.attributeNonEmpty(gridCell, "axis")) + lookup[CacheUtil_1.CacheUtil.getCache(gridCell, "table_headers_related", null)] = true; + } + // Headers can refer to other headers + if (CommonUtil_1.CommonUtil.attributeNonEmpty(gridCell, "headers")) { + var hdrs = gridCell.getAttribute("headers").split(" "); + for (var k = 0; k < hdrs.length; ++k) { + var headElem = doc.getElementById(hdrs[k].trim()); + if (headElem && CommonUtil_1.CommonUtil.getAncestor(headElem, "table") == parentTable) { + lookup[CacheUtil_1.CacheUtil.getCache(headElem, "table_headers_related", null)] = true; + } + } + } + } + else if (gridNodeName == "td") { + if (rowScoped || scopedCols[j]) { + lookup[CacheUtil_1.CacheUtil.getCache(gridCell, "table_headers_related", null)] = true; + } + else if (CommonUtil_1.CommonUtil.attributeNonEmpty(gridCell, "headers")) { + var hdrs = gridCell.getAttribute("headers").split(" "); + for (var k = 0; k < hdrs.length; ++k) { + var headElem = doc.getElementById(hdrs[k].trim()); + if (headElem && CommonUtil_1.CommonUtil.getAncestor(headElem, "table") == parentTable) { + lookup[CacheUtil_1.CacheUtil.getCache(gridCell, "table_headers_related", null)] = true; + lookup[CacheUtil_1.CacheUtil.getCache(headElem, "table_headers_related", null)] = true; + } + } + } + } + } + } + CacheUtil_1.CacheUtil.setCache(parentTable, "table_headers_related", lookup); + } + var rcInfo = CacheUtil_1.CacheUtil.getCache(ruleContext, "table_headers_related", null); + var tInfo = CacheUtil_1.CacheUtil.getCache(parentTable, "table_headers_related", null); + var passed = rcInfo && tInfo && rcInfo in tInfo; + if (!passed && rcInfo === "0:0" && + CommonUtil_1.CommonUtil.getInnerText(ruleContext).trim().length == 0) { + // We don't test if it's the upper-left cell and it's empty + return null; + } + // If the table has no th's, it may just be that this was supposed to be a layout + // table, which introduces a lot of noise. In that case, only trigger this error + // once per table. + if (!passed && parentTable.getElementsByTagName("th").length == 0) { + if (CacheUtil_1.CacheUtil.getCache(parentTable, "table_headers_related_TrigOnce", false) === true) { + passed = true; + } + else { + CacheUtil_1.CacheUtil.setCache(parentTable, "table_headers_related_TrigOnce", true); + } + } + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/table_layout_linearized.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/table_layout_linearized.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_layout_linearized = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var TableUtil_1 = __webpack_require__(/*! ../util/TableUtil */ "./src/v4/util/TableUtil.ts"); +exports.table_layout_linearized = { + id: "table_layout_linearized", + context: "dom:table", + refactor: { + "RPT_Table_LayoutTrigger": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "table_layout_linearized.html", + "Potential_1": "table_layout_linearized.html", + "group": "table_layout_linearized.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify table is not being used to format text content in columns unless the table can be linearized", + "group": "Avoid using tables to format text documents in columns unless the table can be linearized" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_FOUR + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = !TableUtil_1.TableUtil.isLayoutTable(ruleContext); + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/table_scope_valid.ts" +/*!*******************************************!*\ + !*** ./src/v4/rules/table_scope_valid.ts ***! + \*******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_scope_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.table_scope_valid = { + id: "table_scope_valid", + context: "dom:td[scope], dom:th[scope]", + refactor: { + "WCAG20_Table_Scope_Valid": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_0": "table_scope_valid.html", + "Fail_1": "table_scope_valid.html", + "Fail_2": "table_scope_valid.html", + "group": "table_scope_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Value provided is invalid for the 'scope' attribute", + "Fail_2": "The 'scope' attribute should only be used on a <th> element", + "group": "Value for 'scope' attribute must be \"row\", \"col\", \"rowgroup\", or \"colgroup\"" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (nodeName === 'td') + return (0, IRule_1.RuleFail)("Fail_2"); + //only continue for 'th' + var scopeVal = ruleContext.getAttribute("scope").trim().toLowerCase(); + var passed = /^(row|col|rowgroup|colgroup)$/.test(scopeVal); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/table_structure_misuse.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/table_structure_misuse.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_structure_misuse = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var TableUtil_1 = __webpack_require__(/*! ../util/TableUtil */ "./src/v4/util/TableUtil.ts"); +exports.table_structure_misuse = { + id: "table_structure_misuse", + context: "dom:table", + refactor: { + "WCAG20_Table_Structure": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "table_structure_misuse.html", + "Fail_1": "table_structure_misuse.html", + "group": "table_structure_misuse.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The <{0}> element with \"presentation\" role or \"none\" role has structural element(s) and/or attribute(s) '{1}'", + "group": "Table elements with 'role=\"presentation\" or 'role=\"none\" should not have structural elements or attributes" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // JCH - OUT OF SCOPE hidden in context + if (TableUtil_1.TableUtil.isDataTable(ruleContext)) + return null; + if (AriaUtil_1.AriaUtil.isNodeInGrid(ruleContext)) + return null; + var errorNodes = []; + if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "summary")) + errorNodes.push(ruleContext); + var captionElems = ruleContext.getElementsByTagName("caption"); + for (var i = 0; i < captionElems.length; ++i) { + if (CommonUtil_1.CommonUtil.getAncestor(captionElems[i], "table") == ruleContext) { + // Check if the node should be skipped or not based on the Check Hidden Content setting and if the node isVisible or + // not. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(captionElems[i])) { + continue; + } + // Add the node to the errorNodes + errorNodes.push(captionElems[i]); + // Since we are not actually making use of theses errorNodes even though they are passed along with + // ValidationResult, we do not need to keep looping over and getting every single violating node under + // the rule context. This can be a future enhancenment where we actually make use of the error nodes that + // are passed along. Adding this break to speed up performance at this point. + break; // There is no point to keep adding the error nodes, stop after finding the first one + } + } + var thNodes = ruleContext.getElementsByTagName("th"); + for (var i = 0; i < thNodes.length; ++i) { + if (CommonUtil_1.CommonUtil.getAncestor(thNodes[i], "table") == ruleContext) { + // Check if the node should be skipped or not based on the Check Hidden Content setting and if the node isVisible or + // not. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(thNodes[i])) { + continue; + } + // Add the node to the errorNodes + errorNodes.push(thNodes[i]); + // Since we are not actually making use of theses errorNodes even though they are passed along with + // ValidationResult, we do not need to keep looping over and getting every single violating node under + // the rule context. This can be a future enhancenment where we actually make use of the error nodes that + // are passed along. Adding this break to speed up performance at this point. + break; // There is no point to keep adding the error nodes, stop after finding the first one + } + } + var tdNodes = ruleContext.getElementsByTagName("td"); + for (var i = 0; i < tdNodes.length; ++i) { + if ((tdNodes[i].hasAttribute("scope") || tdNodes[i].hasAttribute("headers")) && + CommonUtil_1.CommonUtil.getAncestor(tdNodes[i], "table") == ruleContext) { + // Check if the node should be skipped or not based on the Check Hidden Content setting and if the node isVisible or + // not. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(tdNodes[i])) { + continue; + } + // Add the node to the errorNodes + errorNodes.push(tdNodes[i]); + // Since we are not actually making use of theses errorNodes even though they are passed along with + // ValidationResult, we do not need to keep looping over and getting every single violating node under + // the rule context. This can be a future enhancenment where we actually make use of the error nodes that + // are passed along. Adding this break to speed up performance at this point. + break; // There is no point to keep adding the error nodes, stop after finding the first one + } + } + // Get the node name for the rule context element in this case it will always be table + var currentElementToken = ruleContext.nodeName.toLowerCase(); + // Construct a new array which will contan only the element tag for the violation elements + var structuralElementTokens = new Array(); + // Construct a seen hash that will keep trask of all the elements that were already added to the token array, to make sure + // we do not duplicate any of the elements. Duplicate element tags in the token message looks bad and confusing. + var seen = {}; + // Loop through all the violating structural elements and extract the element tag to be used as a token + for (var i = 0; i < errorNodes.length; i++) { + // Get the node name (tag name) for the violating structural element + var nodeName = errorNodes[i].nodeName.toLowerCase(); + // Only need to add the violating element once + if (!seen.hasOwnProperty(nodeName)) { + // Since we are adding the token as elements and attributes we need to handle + // the summary attribute on the ruleContext (table). We only add summary once, same as + // for elements to avoid duplication in the message. (Summary should not duplicate, but just in case) + if (nodeName == "table" && !seen.hasOwnProperty["summary"]) { + // Mark this as a new attribute + seen["summary"] = true; + // Since this is a new violating element add it to the structural element tokens array + structuralElementTokens.push("summary"); + } + else { + // Mark this as a new element + seen[nodeName] = true; + // Since this is a new violating element add it to the structural element tokens array + structuralElementTokens.push(nodeName); + } + } + } + // We need to take the array of structural elements and join them with a comma and a space to make grammatical correct in + // the message. + var structuralElementTokensStr = structuralElementTokens.join(", "); + //return new ValidationResult(errorNodes.length == 0, errorNodes, '', '', [currentElementToken, structuralElementTokens]); + if (errorNodes.length == 0) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1", [currentElementToken, structuralElementTokensStr]); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/table_summary_redundant.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/table_summary_redundant.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_summary_redundant = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +exports.table_summary_redundant = { + id: "table_summary_redundant", + context: "dom:table", + refactor: { + "WCAG20_Table_CapSummRedundant": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "table_summary_redundant.html", + "Fail_1": "table_summary_redundant.html", + "group": "table_summary_redundant.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The table summary duplicates the caption", + "group": "The table summary must not duplicate the caption" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var pofId; + var passed = true; + var sumStr; + if (ruleContext.hasAttribute("summary")) { + pofId = 0; + sumStr = ruleContext.getAttribute("summary").trim().toLowerCase(); + } + else if (ruleContext.hasAttribute("aria-describedby")) { + pofId = 1; + var summaryNodeIds = ruleContext.getAttribute("aria-describedby").split(" "); + var summaryNodeConcat = ""; + for (var i = 0; i < summaryNodeIds.length; i++) { + var summaryNodeId = summaryNodeIds[i]; + if (summaryNodeId) { + var summaryNode = fragment_1.FragmentUtil.getById(ruleContext, summaryNodeId); + if (summaryNode && !DOMUtil_1.DOMUtil.sameNode(summaryNode, ruleContext)) { + summaryNodeConcat += " " + CommonUtil_1.CommonUtil.getInnerText(summaryNode).trim().toLowerCase(); + } + } + } + sumStr = summaryNodeConcat; + } + if (!sumStr) { + return null; + } + else { + var capElems = ruleContext.getElementsByTagName("caption"); + if (capElems.length === 0) { + return null; + } + else if (sumStr.length > 0) { + var capStr = CommonUtil_1.CommonUtil.getInnerText(capElems[0]).trim().toLowerCase(); + if (!sumStr.includes(capStr)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/target_spacing_sufficient.ts" +/*!***************************************************!*\ + !*** ./src/v4/rules/target_spacing_sufficient.ts ***! + \***************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.target_spacing_sufficient = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var DOMMapper_1 = __webpack_require__(/*! ../../v2/dom/DOMMapper */ "./src/v2/dom/DOMMapper.ts"); +var CSSUtil_1 = __webpack_require__(/*! ../util/CSSUtil */ "./src/v4/util/CSSUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +exports.target_spacing_sufficient = { + id: "target_spacing_sufficient", + context: "dom:*", + dependencies: [], + help: { + "en-US": { + "group": "target_spacing_sufficient.html", + "pass_spacing": "target_spacing_sufficient.html", + "pass_sized": "target_spacing_sufficient.html", + "pass_inline": "target_spacing_sufficient.html", + "pass_default": "target_spacing_sufficient.html", + "violation_spacing": "target_spacing_sufficient.html", + "recommendation_inline": "target_spacing_sufficient.html", + "potential_overlap": "target_spacing_sufficient.html" + } + }, + messages: { + "en-US": { + "group": "The target must be sufficiently sized or spaced from other targets", + "pass_spacing": "The target's spacing from other targets is sufficient", + "pass_sized": "The target’s size is more than 24 CSS pixels", + "pass_inline": "The target is in a sentence or its size is otherwise constrained by the line-height of non-target text", + "pass_default": "The target's size is determined by the user agent and is not modified by the author", + "violation_spacing": "Undersized target \"{0}\" does not have sufficient spacing of 12 CSS pixels from another target \"{1}\"", + "recommendation_inline": "Confirm the inline target \"{0}\" is sufficiently spaced from another inline target \"{1}\"", + "potential_overlap": "Ensure the overlapped target \"{0}\" meets a minimum target size or has sufficient spacing from the overlapping target \"{1}\"" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_2"], + num: ["2.5.8"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE, + reasonCodes: ["pass_spacing", "pass_sized", "pass_inline", "pass_default", "violation_spacing", "potential_overlap"] + }, + { + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_2"], + num: ["2.5.8"], + level: IRule_2.eRulePolicy.RECOMMENDATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE, + reasonCodes: ["recommendation_inline"] + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLocaleLowerCase(); + var mapper = new DOMMapper_1.DOMMapper(); + var bounds = mapper.getUnadjustedBounds(ruleContext); //context["dom"].bounds; + if (!bounds) + return null; + // ignore hidden, non-target + if (!CommonUtil_1.CommonUtil.isTarget(ruleContext)) + return null; + if (bounds.height >= 24 && bounds.width >= 24) + return (0, IRule_1.RulePass)("pass_sized"); + // check inline element: without text in the same line + var status = CSSUtil_1.CSSUtil.getInlineStatus(ruleContext); + if (status === null) + return null; + if (status.inline) { + if (status.text) { + if (status.violation === null) + return (0, IRule_1.RulePass)("pass_inline"); + else + // case 1: inline element is too close horizontally + return (0, IRule_1.RulePotential)("recommendation_inline", [nodeName, status.violation]); + } + else { + if (status.violation === null) + return (0, IRule_1.RulePass)("pass_default"); + else + // case 1: inline element is too close horizontally + return (0, IRule_1.RulePotential)("recommendation_inline", [nodeName, status.violation]); + } + } + else { + // ignore browser default + if (CSSUtil_1.CSSUtil.isTargetBrowserDefault(ruleContext)) + return (0, IRule_1.RulePass)("pass_default"); + } + var doc = ruleContext.ownerDocument; + if (!doc) { + return null; + } + var cStyle = getComputedStyle(ruleContext); + if (cStyle === null) + return null; + var zindex = cStyle.zIndex; + if (!zindex || isNaN(Number(zindex))) + zindex = "0"; + // Get the list of target elements + var targetElems = CacheUtil_1.CacheUtil.getCache(doc.documentElement, "target_spacing_sufficient::targets", undefined); + if (typeof targetElems === "undefined") { + targetElems = []; + //select all elements except itself and descendants + var elems = doc.querySelectorAll('body *:not(script):not(style)'); + for (var i = 0; i < elems.length; i++) { + var elem = elems[i]; + if (CommonUtil_1.CommonUtil.isTarget(elem)) { + targetElems.push(elem); + } + } + CacheUtil_1.CacheUtil.setCache(doc.documentElement, "target_spacing_sufficient::targets", targetElems); + } + if (!targetElems || targetElems.length === 0) + return; + var before = true; + var minX = 24; + var minY = 24; + var adjacentX = null; + var adjacentY = null; + var checked = []; //contains a list of elements that have been checked so their descendants don't need to be checked again + var _loop_1 = function (i) { + var elem = targetElems[i]; + /** + * the nodes returned from querySelectorAll is in document order + * if two elements overlap and z-index are not defined, then the node rendered earlier will be overlaid by the node rendered later + * filter out the elements that’re descendant or ancestors of the target element, nor descendant of the target element's siblings + */ + // Use compareDocumentPosition to check containment relationships + // Note: compareDocumentPosition returns 0 when comparing a node to itself + var position = ruleContext.compareDocumentPosition(elem); + // DOCUMENT_POSITION_CONTAINED_BY (16): elem is contained by ruleContext + // Also handle self-comparison (position === 0) + if (position === 0 || (position & Node.DOCUMENT_POSITION_CONTAINED_BY)) { + //the next node in elems will be after the target node (ruleContext). + before = false; + return "continue"; + } + // DOCUMENT_POSITION_CONTAINS (8): elem contains ruleContext + // ignore ascendants of the element, or itself or its ascendant already checked + if ((position & Node.DOCUMENT_POSITION_CONTAINS) || checked.some(function (item) { return item.contains(elem); })) + return "continue"; + var bnds = mapper.getUnadjustedBounds(elem); + if (!bnds) + return "continue"; + var zStyle = getComputedStyle(elem); + var z_index = '0'; + if (zStyle) { + z_index = zStyle.zIndex; + if (!z_index || isNaN(Number(z_index))) + z_index = "0"; + } + // case 2: the element overlaps the target entirely + // note when a link is inline with other target, if the link text wraps in another line in a given viewport, + // the bounds of the link may cover and the entire two lines, causing the other tagets to be overlapped, see two links in the test case: element_inline.html + if (bnds.top <= bounds.top && bnds.left <= bounds.left && bnds.top + bnds.height >= bounds.top + bounds.height + && bnds.left + bnds.width >= bounds.left + bounds.width) { + // if the target on top + if (before ? parseInt(zindex) < parseInt(z_index) : parseInt(zindex) <= parseInt(z_index)) { + return { value: null }; + } + else + return { value: (0, IRule_1.RulePotential)("potential_overlap", [nodeName, elem.nodeName.toLowerCase()]) }; + } + // case 3: if the target overlaps the element entirely + if (bounds.top <= bnds.top && bounds.left <= bnds.left && bounds.top + bounds.height >= bnds.top + bnds.height + && bounds.left + bounds.width >= bnds.left + bnds.width) { + // if the element on top + if (before ? parseInt(zindex) < parseInt(z_index) : parseInt(zindex) <= parseInt(z_index)) { + return { value: (0, IRule_1.RulePotential)("potential_overlap", [nodeName, elem.nodeName.toLowerCase()]) }; + } + else // the target on top + return { value: (0, IRule_1.RuleFail)("violation_spacing", [nodeName, elem.nodeName.toLowerCase()]) }; + } + // case 4: the element overlaps partially with the target + if ((((bounds.top >= bnds.top && bounds.top <= bnds.top + bnds.height) || (bounds.top + bounds.height <= bnds.top && bounds.top + bounds.height >= bnds.top + bnds.height)) + && ((bounds.left > bnds.left && bounds.left < bnds.left + bnds.width) || (bnds.left > bounds.left && bnds.left < bounds.left + bounds.width))) + || (((bounds.top > bnds.top && bounds.top < bnds.top + bnds.height) || (bnds.top > bounds.top && bnds.top < bounds.top + bounds.height)) + && ((bounds.left >= bnds.left && bounds.left <= bnds.left + bnds.width) || (bounds.left + bounds.width >= bnds.left && bounds.left + bounds.width <= bnds.left + bnds.width)))) { + return { value: (0, IRule_1.RulePotential)("potential_overlap", [nodeName, elem.nodeName.toLowerCase()]) }; + } + else { // no overlap with the elem, though may overlap withe other elements + var disX = 24; + var disY = 24; + // the element is in the horizontally same row with the target + if (bounds.width < 24 && ((bounds.top >= bnds.top && bounds.top <= bnds.top + bnds.height) || (bounds.top <= bnds.top && bounds.top + bounds.height > bnds.top))) + disX = Math.min(Math.abs(bounds.left - bnds.left), Math.abs(bounds.left - (bnds.left + bnds.width)), Math.abs(bounds.left + bounds.width - (bnds.left + bnds.width)), Math.abs(bounds.left + bounds.width - bnds.left)); + // the element is in the vertically same column with the target + if (bounds.height < 24 && ((bounds.left >= bnds.left && bounds.left <= bnds.left + bnds.width) || (bounds.left <= bnds.left && bounds.left + bounds.width > bnds.left))) + disY = Math.min(Math.abs(bounds.top - bnds.top), Math.abs(bounds.top - (bnds.top + bnds.height)), Math.abs(bounds.top + bounds.height - (bnds.top + bnds.height)), Math.abs(bounds.top + bounds.height - bnds.top)); + if (disX < minX) { + minX = disX; + adjacentX = elem; + } + if (disY < minY) { + minY = disY; + adjacentY = elem; + } + } + checked.push(elem); + }; + for (var i = 0; i < targetElems.length; i++) { + var state_1 = _loop_1(i); + if (typeof state_1 === "object") + return state_1.value; + } + // case 5: no overlap + insufficient target size. check spacing + if (Math.round(bounds.width / 2) + minX < 12 || Math.round(bounds.height / 2) + minY < 12) { + if (Math.round(bounds.width / 2) + minX < Math.round(bounds.height / 2) + minY) + return (0, IRule_1.RuleFail)("violation_spacing", [nodeName, adjacentX.nodeName.toLowerCase()]); + return (0, IRule_1.RuleFail)("violation_spacing", [nodeName, adjacentY.nodeName.toLowerCase()]); + } + else + return (0, IRule_1.RulePass)("pass_spacing"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/text_block_heading.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/text_block_heading.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.text_block_heading = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var CSSUtil_1 = __webpack_require__(/*! ../util/CSSUtil */ "./src/v4/util/CSSUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.text_block_heading = { + id: "text_block_heading", + context: "dom:p, dom:div, dom:br", + refactor: { + "RPT_Block_ShouldBeHeading": { + // "Pass_0": "pass", + "Potential_1": "potential_heading" + } + }, + help: { + "en-US": { + // "pass": "text_block_heading.html", + "potential_heading": "text_block_heading.html", + "group": "text_block_heading.html" + } + }, + messages: { + "en-US": { + // "pass": "Heading text uses a heading element or role", + "potential_heading": "Confirm this text '{0}' is used as a heading and if so, modify to use a heading element or role", + "group": "Heading text should use a heading element or role" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext) || !VisUtil_1.VisUtil.isNodeVisible(ruleContext)) + return null; + // Don't trigger if we're not in the body or if we're in a script + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["body"]) === null || CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["script"]) !== null) + return null; + var validateParams = { + numWords: { + value: 10, + type: "integer" + } + }; + var bodyFont = 0; + var body = ruleContext.ownerDocument.getElementsByTagName("body"); + if (body != null) { + var bodyStyle = getComputedStyle(body[0]); + if (bodyStyle) + bodyFont = CSSUtil_1.CSSUtil.getPixelsFromStyle(bodyStyle['font-size'], body); + } + var numWords = validateParams.numWords.value; + var wordsSeen = 0; + var wordStr = []; + var emphasizedText = false; + var nw = new DOMWalker_1.DOMWalker(ruleContext); + nw.nextNode(); + var passed = false; + while (!passed && + nw.nextNode() && + nw.node !== ruleContext && + nw.node !== DOMWalker_1.DOMWalker.parentNode(ruleContext) && + !["br", "div", "p"].includes(nw.node.nodeName.toLowerCase())) // Don't report twice + { + if (nw.node === ruleContext || CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(nw.node)) + continue; + var nwName = nw.node.nodeName.toLowerCase(); + if (nw.node.nodeType === 3) { + // for text child + if (nw.node.nodeValue.trim().length > 0 && nw.node.parentElement) { + // check it's style if the target element contains text, e.g., <p> fake heading</p> + var style = getComputedStyle(nw.node.parentElement); + if (style && (style['font-weight'] === 'bold' || style['font-weight'] >= 700 + || (style['font-size'] && style['font-size'].includes("large")) + || (style['font-size'] && bodyFont !== 0 && CSSUtil_1.CSSUtil.getPixelsFromStyle(style['font-size'], nw.node.parentElement) > bodyFont))) { + var nextStr = nw.node.nodeValue.trim(); + var wc = CommonUtil_1.CommonUtil.wordCount(nextStr); + if (wc > 0) { + wordStr.push(nextStr); + emphasizedText = true; + wordsSeen += wc; + } + passed = wordsSeen > numWords; + // Skip this node because it's emphasized + nw.bEndTag = true; + } + else { + // the node contain regular text + passed = true; + } + } + } + else if (nw.node.nodeType === 1) { + // for element child + if (nwName === "b" || nwName === "strong" || nwName === "u" || nwName === "font") { + // if the target element contains emphasis child, e.g., <p><strong>fake heading</strong></p> + var nextStr = CommonUtil_1.CommonUtil.getInnerText(nw.node); + var wc = CommonUtil_1.CommonUtil.wordCount(nextStr); + if (wc > 0) { + wordStr.push(nextStr); + emphasizedText = true; + wordsSeen += wc; + } + passed = wordsSeen > numWords; + // Skip this node because it's emphasized + nw.bEndTag = true; + } + else { + // ignore the element which has a role except 'generic', 'paragraph' or 'strong' + // ignore applet element that is deprecated anyway + var role = AriaUtil_1.AriaUtil.getResolvedRole(nw.node); + passed = (role !== null && role !== 'generic' && role !== 'paragraph' && role !== 'strong') || nwName === "applet"; + } + } + } + if (wordsSeen == 0) + passed = true; + //ignore if the string ends with “:” “,” “-” “;” or “.” + if (!passed) + passed = /[:,;\-\.]$/.test(wordStr.join(" ").trim()); + if (passed) { + return null; + } + else { + return (0, IRule_1.RulePotential)("potential_heading", [wordStr.join(" ")]); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/text_contrast_sufficient.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/text_contrast_sufficient.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.text_contrast_sufficient = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var ColorUtil_1 = __webpack_require__(/*! ../util/ColorUtil */ "./src/v4/util/ColorUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CSSUtil_1 = __webpack_require__(/*! ../util/CSSUtil */ "./src/v4/util/CSSUtil.ts"); +exports.text_contrast_sufficient = { + id: "text_contrast_sufficient", + context: "dom:*", + refactor: { + "IBMA_Color_Contrast_WCAG2AA": { + "Pass_0": "pass", + "Fail_1": "fail_contrast", + "Potential_1": "potential_same_color" + }, + "IBMA_Color_Contrast_WCAG2AA_PV": { + "pass_0": "pass", + "potential_1": "potential_graphic_background" + } + }, + help: { + "en-US": { + "group": "text_contrast_sufficient.html", + "pass": "text_contrast_sufficient.html", + "fail_contrast": "text_contrast_sufficient.html", + "potential_same_color": "text_contrast_sufficient.html", + "potential_graphic_background": "text_contrast_sufficient.html", + "potential_text_shadow": "text_contrast_sufficient.html" + } + }, + messages: { + "en-US": { + "group": "The contrast ratio of text with its background must meet WCAG AA requirements", + "pass": "The contrast ratio of text with its background meets WCAG AA requirements", + "fail_contrast": "Text contrast of {0} with its background is less than the WCAG AA minimum requirements for text of size {1}px and weight of {2}", + "potential_same_color": "The foreground text and its background color are both detected as {3}. Verify the text meets the WCAG AA requirements for minimum contrast", + "potential_graphic_background": "Verify the contrast ratio of the text against the lightest and the darkest colors of the background meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}", + "potential_text_shadow": "Verify the contrast ratio of the text with shadow meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "1.4.3", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: ['afw4f7'], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + // avoid diagnosing elements that are not visible + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || + (VisUtil_1.VisUtil.hiddenByDefaultElements != null && + VisUtil_1.VisUtil.hiddenByDefaultElements != undefined && + VisUtil_1.VisUtil.hiddenByDefaultElements.indexOf(nodeName) > -1)) { + return null; + } + //TODO ? should only consider native disabled, ignore aria-disabled + //skip disabled element + if (CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return null; + //skip elements + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["svg", "script", "meta", "style"])) + return null; + var doc = ruleContext.ownerDocument; + if (!doc) { + return null; + } + var win = doc.defaultView; + if (!win) { + return null; + } + // Ensure that this element has children with actual text. + var childStr = CommonUtil_1.CommonUtil.getNodeText(ruleContext); + if (!CommonUtil_1.CommonUtil.isShadowHostElement(ruleContext) || (CommonUtil_1.CommonUtil.isShadowHostElement(ruleContext) && CommonUtil_1.CommonUtil.getNodeText(ruleContext.shadowRoot) === '')) { + if (childStr.trim().length == 0) + return null; + // ignore if the text does not convey anything in human language + /** + * (1) ignore non-alphanumeric or special characters in ASCI: ^(a-zA-Z\d\s) + * (2) ignore non-printable unicode characters: \u0000-\u0008\u000B-\u001F\u007F-\u009F\u2000-\u200F\u2028-\u202F\u205F-\u206F\u3000\uFEFF + * see https://stackoverflow.com/questions/3770117/what-is-the-range-of-unicode-printable-characters + * (3) for now not consider unicode special characters that are different in different languages + */ + //let regex = /[^(a-zA-Z\d\s)\u0000-\u0008\u000B-\u001F\u007F-\u009F\u2000-\u200F\u2028-\u202F\u205F-\u206F\u3000\uFEFF]+/g; + var regex = /[^(a-zA-Z\d\s)\^(\u4e00-\u9fff\u3400-\u4dbf)\u0000-\u0008\u000B-\u001F\u007F-\u009F\u2000-\u200F\u2028-\u202F\u205F-\u206F\u3000\uFEFF]+/g; + childStr = childStr.trim().replace(regex, ''); + if (childStr.trim().length === 0) + return null; + } + var elem = ruleContext; + // the child elements (rather than shadow root) of a shadow host is either re-assigned to the shadow slot if the slot exists + // or not displayed, so shouldn't be checked from the light DOM, rather it should be checked as reassginged slot element(s) in the shadow DOM. + if (CommonUtil_1.CommonUtil.isShadowHostElement(ruleContext)) { + // if it's direct text of a shadow host + if (ruleContext.shadowRoot) { + for (var node = ruleContext.firstChild; node; node = node.nextSibling) { + if (node.nodeType == 3) { + //if multiple texts exist, only need to check one + elem = node.assignedSlot; + break; + } + } + } + if (elem === null) + return; + } + var style = win.getComputedStyle(elem); + // JCH clip INFO: + // The clip property lets you specify a rectangle to clip an absolutely positioned element. + // The rectangle specified as four coordinates, all from the top-left corner of the element to be clipped. + // Property values: + // none This is default. No clipping is done + // auto No clipping will be done + // shape The only valid value is: rect (top, right, bottom, left) + // e.g., clip: rect(10px, 20px, 30px, 40px); + // Note: the four values are in the same order as margin/padding + // The rect values are positive pixel values, e.g., 10px, etc. + // margin-box Uses the margin box as the reference box + // border-box Uses the border box as the reference box + // padding-box Uses the padding box as the reference box + // content-box + // fill-box + // stroke-box + // NOTE: the CSS clip property is deprecated + // Also: clip only works if the element is absolutely positioned and can only do rectangles + // check if element visible + var visible = true; + if (style.width !== "0" && + style.height !== "0" && + style.opacity !== "0" && + style.display !== 'none' && + style.visibility !== 'hidden' && + style.overflow !== 'hidden' && + // left and right work with all absolute units + (style.left === "auto" || (style.position === 'absolute' && parseInt(style.left.replace(/[^0-9.+-]/, '')) > 0)) && + (style.left === "auto" || (style.position === 'absolute' && parseInt(style.top.replace(/[^0-9.+-]/, '')) > 0))) { + visible = true; + // console.log("element IS visible"); + // console.log("CHECK COLOR CONTRAST unless to small"); + } + else { + visible = false; + // console.log("element NOT visible"); + } + if (visible === false) { + // console.log("DO NOT CHECK COLOR CONTRAST"); + return null; + } + var clipHeight = -1; + if (style.clip !== "auto") { + var clipString = style.clip.toString(); + if (clipString.includes("rect")) { + var reBrackets = /\((.*)\)/g; + var listOfText = []; + var found = reBrackets.exec(clipString); + var foundArr = found[1].split(', '); + for (var i = 0; i < foundArr.length; i++) { + // console.log("foundArr[",i,"] = ",foundArr[i]); + listOfText.push(foundArr[i]); + } + ; + } + // console.log("listOfText = ",listOfText); + clipHeight = parseInt(listOfText[0].replace(/px/g, '')) - parseInt(listOfText[2].replace(/px/g, '')); + clipHeight = Math.abs(clipHeight); + } + // JCH clip-path INFO: + // Excellent article on clip-path: https://ishadeed.com/article/clip-path/ + // clip-path is a totally different animal with many, many different variations + // The goal was for it to not be as limited as clip + // The syntax is more complicated (as it does more) and it is different from clip, + // e.g., the above clip rectangle would be clip-path: inset(10px 20px 30px 40px); + // Note: there are no commas + // Also, it can take single values to make all sides the same, or 2 values (vert/hori). + // or 3 values (top/hori/bottom) + // And percentages can works as well as px + // + // Although there are five different shapes: inset (term used for rectangle), circle, + // ellipse, polygon, path - we will only concern ourselves with inset + // There are 7 box values: margin-box, border-box, padding-box, content-box, fill-box, stroke-box, view-box + // Box and shape values may be combined: clip-path: padding-box circle(50px at 0 100px); + // NOTE: the box values are NOT intuitive, see: https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Shapes/From_box_values#margin-box + // + // So the key question is what amount of effort do we want to invest into clip-path + // + // JCH don't do clip-path now + var clipPathHeight = -1; + // if (style.clipPath !== "auto") { + // console.log("style.clipPath = ",style.clipPath); + // console.log("style.clipPath.toString = ",style.clipPath.toString()); + // let clipString = style.clipPath.toString(); + // if (clipString.includes("inset")) { + // var reBrackets = /\((.*)\)/g; + // var listOfText = []; + // var found = reBrackets.exec(clipString); + // var foundArr = found[1].split(' '); + // for (let i=0; i<foundArr.length; i++) { + // console.log("foundArr[",i,"] = ",foundArr[i]); + // listOfText.push(foundArr[i]); + // }; + // } + // console.log("listOfText = ",listOfText); + // clipPathHeight = parseInt(listOfText[0].replace(/px/g, '')) - parseInt(listOfText[2].replace(/px/g, '')); + // clipPathHeight = Math.abs(clipHeight); + // } + // console.log("clipPathHeight = ", clipPathHeight); + // if (style.position === "absolute" && style.clip === "rect(0px, 0px, 0px, 0px)" && style.overflow !== "visible") { + // JCH arbitrarily use less that 7px for clipHeight + if (style.position === "absolute" && clipHeight < 7 && clipHeight !== -1) { + // console.log("DO NOT CHECK COLOR CONTRAST because too small"); + // Corner case where item is hidden (accessibility hiding technique) + return null; + } + // First determine the color contrast ratio + var colorCombo = ColorUtil_1.ColorUtil.ColorCombo(elem); + if (colorCombo === null) { + //some exception occurred, or not able to get color combo for some reason + console.log("unable to get color combo for element: " + elem.nodeName); + return; + } + var fg = colorCombo.fg; + var bg = colorCombo.bg; + var ratio = fg.contrastRatio(bg); + var weight = CSSUtil_1.CSSUtil.getWeightNumber(style.fontWeight); + var size = CSSUtil_1.CSSUtil.getFontInPixels(style.fontSize, elem); + var isLargeScale = size >= 24 || size >= 18.6 && weight >= 700; + if (CSSUtil_1.CSSUtil.containsCKJ(childStr)) { + // https://github.com/act-rules/act-rules.github.io/pull/2121/files + // for CJK, 22 pt or 18 pt with font-weight >= 700, 1pt = 1.333 px + isLargeScale = size >= 29.3 || size >= 24 && weight >= 700; + } + var passed = ratio >= 4.5 || (ratio >= 3 && isLargeScale); + var hasBackground = colorCombo.hasBGImage || colorCombo.hasGradient; + var textShadow = colorCombo.textShadow; + var isDisabled = CommonUtil_1.CommonUtil.isNodeDisabled(elem); + if (!isDisabled) { + var control = CommonUtil_1.CommonUtil.getControlOfLabel(elem); + if (control) { + isDisabled = CommonUtil_1.CommonUtil.isNodeDisabled(control); + } + } + if (!isDisabled && nodeName === 'label' && CommonUtil_1.CommonUtil.isDisabledByFirstChildFormElement(elem)) { + isDisabled = true; + } + if (!isDisabled && ruleContext.hasAttribute("id") && CommonUtil_1.CommonUtil.isDisabledByReferringElement(elem)) { + isDisabled = true; + } + /**setCache(ruleContext, "EXT_Color_Contrast_WCAG2AA", { + "ratio": ratio, + "isLargeScale": isLargeScale, + "weight": weight, + "size": size, + "hasBackground": hasBackground, + "isDisabled": isDisabled + });*/ + // If element or parent is disabled, this rule does not apply (but may be 3:1 in future) + if (!passed && isDisabled) { + passed = true; + } + if (!passed) { + if (hasBackground) { + // fire potential since a text on an image or gradient may be still viewable, depending on the text location on the gradient or image + return (0, IRule_1.RulePotential)("potential_graphic_background", [ratio.toFixed(2), size, weight]); + // removed by dead control flow + + } + else if (textShadow) { + // fire potential since a text with shadow may be still viewable, depending on the shadow efffects + return (0, IRule_1.RulePotential)("potential_text_shadow", [ratio.toFixed(2), size, weight]); + // removed by dead control flow + + } + else { + if (fg.toHex() === bg.toHex()) { + return (0, IRule_1.RulePotential)("potential_same_color", [ratio.toFixed(2), size, weight, fg.toHex(), bg.toHex(), colorCombo.hasBGImage, colorCombo.hasGradient]); + } + else { + return (0, IRule_1.RuleFail)("fail_contrast", [ratio.toFixed(2), size, weight, fg.toHex(), bg.toHex(), colorCombo.hasBGImage, colorCombo.hasGradient]); + } + } + } + else { + return (0, IRule_1.RulePass)("pass", [ratio.toFixed(2), size, weight, fg.toHex(), bg.toHex(), colorCombo.hasBGImage, colorCombo.hasGradient]); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/text_quoted_correctly.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/text_quoted_correctly.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.text_quoted_correctly = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.text_quoted_correctly = { + id: "text_quoted_correctly", + context: "dom:*", + help: { + "en-US": { + "Pass_0": "text_quoted_correctly.html", + "Potential_1": "text_quoted_correctly.html", + "group": "text_quoted_correctly.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "If the following text is a quotation, mark it as a <q> or <blockquote> element: {0}", + "group": "Quotations should be marked with <q> or <blockquote> elements" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // ignore the check if the node is hidden + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext)) + return null; + // Don't trigger if the element is not in the body + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["body"]) === null) + return null; + var validateParams = { + minWords: { + value: 3, + type: "integer" + } + }; + var minWords = validateParams.minWords.value; + var passed = true; + var walkNode = ruleContext.firstChild; + var violatedtext = null; + // ignore the check for the text of the following elements + var ignored = ["blockquote", "q", "script", "style", "pre", "code", "ruby", "samp"]; + while (passed && walkNode) { + // Comply to the Check Hidden Content setting will be done by default as this rule triggers on each element + // and for each element it only checks that single elements text nodes and nothing else. So all inner elements will be + // covered on their own. Currently for this rule by default Check Hidden Content will work, as we are doing + // a node walk only on siblings so it would not get text nodes from other siblings at all. + // In the case in the future something chnges, just need to add && !RPTUtil.shouldNodeBeSkippedHidden(walkNode) to the below + // if. + if (walkNode.nodeName === "#text") { + var txtVal = walkNode.nodeValue; + // Do the regex tests first - should be fast + // Remove apostrophe's + txtVal = txtVal.replace(/(\S)'(\S)/g, "$1$2"); + var dblQuotes = txtVal.match(/("[^"]+")/g); + var snglQuotes = txtVal.match(/('[^']+')/g); + // Walk the parents - only continue testing if we found a quote, but + // we're not already marked up + // Also skip if we're in a script - there's lots of quotes used in scripts + if ((dblQuotes !== null || snglQuotes !== null) && + CommonUtil_1.CommonUtil.getAncestor(walkNode, ignored) === null) { + if (dblQuotes != null) { + for (var i = 0; passed && i < dblQuotes.length; ++i) + passed = CommonUtil_1.CommonUtil.wordCount(dblQuotes[i]) < minWords; + } + if (snglQuotes != null) { + for (var i = 0; passed && i < snglQuotes.length; ++i) + passed = CommonUtil_1.CommonUtil.wordCount(snglQuotes[i]) < minWords; + } + // Remove any linefeed inside the quote + // violatedtext = txtVal.replace(new RegExp("\\r?\\n|\\r","g"),""); + if (dblQuotes === null) { + violatedtext = snglQuotes.join(", ").replace(new RegExp("\\r?\\n|\\r", "g"), ""); + } + else if (snglQuotes === null) { + violatedtext = dblQuotes.join(", ").replace(new RegExp("\\r?\\n|\\r", "g"), ""); + } + else { + violatedtext = dblQuotes.concat(snglQuotes).join(", ").replace(new RegExp("\\r?\\n|\\r", "g"), ""); + } + } + } + walkNode = walkNode.nextSibling; + } + //if the violatedtext is longer than 69 chars, only keep the first 32, the " ... ", and the last 32 chars + if (!passed && violatedtext.length && violatedtext.length > 69) { + violatedtext = violatedtext.substring(0, 32) + " ... " + violatedtext.substring(violatedtext.length - 32); + } + return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RulePotential)("Potential_1", [violatedtext]); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/text_sensory_misuse.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/text_sensory_misuse.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.text_sensory_misuse = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.text_sensory_misuse = { + id: "text_sensory_misuse", + context: "dom:body, dom:body dom:*", + refactor: { + "RPT_Text_SensoryReference": { + // "Pass_0": "pass", + "Potential_1": "potential_position, potential_other" + } + }, + help: { + "en-US": { + // "pass": "text_sensory_misuse.html", + "potential_position": "text_sensory_misuse.html", + "potential_other": "text_sensory_misuse.html", + "group": "text_sensory_misuse.html" + } + }, + messages: { + "en-US": { + // "pass": "Instructions are meaningful without relying solely on shape, size, or location words", + "potential_position": "Confirm the word(s) '{0}' of the user instruction is used to indicate a logical rather than visual position", + "potential_other": "Confirm the user instruction is still understandable without the word(s) '{0}'", + "group": "Instructions should be meaningful without relying solely on shape, size, or location words" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.3"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Extract the nodeName of the context node + var nodeName = ruleContext.nodeName.toLowerCase(); + //skip the check if the element is hidden or disabled + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext) || VisUtil_1.VisUtil.hiddenByDefaultElements.includes(nodeName)) + return null; + // Don't trigger if we're not in the body or if we're in a script + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["body"]) === null) + return null; + // ignore script, link, label and their child elements + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["script", "a", 'label']) !== null) + return null; + // ignore text on landmark roles, but not on their children (e.g., section, main) + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + if (role) { + var lmRoles = AriaUtil_1.AriaUtil.getRolesWithTypes(ruleContext, ["landmark"]); + if (lmRoles && lmRoles.includes(role)) + return null; + } + // ignore all widgets and headings, and their children, and certain structure roles + var roles = AriaUtil_1.AriaUtil.getRolesWithTypes(ruleContext, ["widget", "heading"]); + // add some structure roles + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(["caption", "cell", "code", "columnheader", "definition", "figure", "list", "listitem", "math", "meter", "row", "rowgroup", "rowheader", "term"], roles); + if (AriaUtil_1.AriaUtil.getAncestorWithRoles(ruleContext, roles) !== null) + return null; + var violatedPositionText = ""; + var violatedOtherText = ""; + var walkNode = ruleContext.firstChild; + var txtVal = ""; + while (walkNode) { + // for each element it only checks that single elements text nodes and nothing else. + // all inner elements will be covered on their own. + // whitespace characters (space, newline, tab) between elements are considered a node too. + if (walkNode.nodeName === "#text") { + var txt = walkNode.nodeValue.trim(); + if (txt.length > 0) + txtVal += (txtVal.length > 0 ? ", " + txt : txt); + } + walkNode = walkNode.nextSibling; + } + if (txtVal.length > 0) { + // first to remove each exempt word with a single space in the text + var exemptRegex = getRegex(ruleContext.ownerDocument, "exemptText"); + txtVal = txtVal.replace(exemptRegex, " "); + violatedPositionText = getViolatedText(ruleContext.ownerDocument, "positionText", txtVal); + violatedOtherText = getViolatedText(ruleContext.ownerDocument, "otherText", txtVal); + } + var ret = []; + if (violatedPositionText) + ret.push((0, IRule_1.RulePotential)("potential_position", [violatedPositionText])); + if (violatedOtherText) + ret.push((0, IRule_1.RulePotential)("potential_other", [violatedOtherText])); + return ret.length == 0 ? null : ret; + } +}; +var validateParams = { + positionText: { + value: ["top-left", "top-right", "bottom-right", "bottom-left", + "top-to-bottom", "left-to-right", "bottom-to-top", "right-to-left", + "right", "left", "above", "below", "top", "bottom", + "upper", "lower", "corner", "beside" + ], + type: "[string]" + }, + otherText: { + value: ["round", "square", "shape", "rectangle", "triangle", + "size", "large", "small", "medium", "big", "huge", "tiny", "extra", + "larger", "smaller", "bigger", "little", "largest", "smallest", "biggest" + ], + type: "[string]" + }, + exemptText: { + value: ["right-click", "left-click", "right-clicking", "right-clicks", + "left-clicking", "left-clicks", "square root", "right now", "off the top" //append as needed + ], + type: "[string]" + } +}; +function getRegex(doc, type) { + if (!validateParams[type]) + return ""; + var sensoryRegex = CacheUtil_1.CacheUtil.getCache(doc, type + "_sensory_misuse", null); + if (sensoryRegex == null) { + var sensoryText = validateParams[type].value; + var regexStr = "(\s\s+|" + sensoryText[0]; + for (var j = 1; j < sensoryText.length; ++j) { + var words = sensoryText[j].trim().split(" "); + regexStr += "|" + words[0]; + if (words.length > 1) { + for (var c = 1; c < words.length; ++c) + regexStr += " +" + words[c]; + } + } + //regexStr += ")\\W"; + regexStr += ")"; + sensoryRegex = new RegExp(regexStr, "gi"); + CacheUtil_1.CacheUtil.setCache(doc, type + "_sensory_misuse", sensoryRegex); + } + return sensoryRegex; +} +function getViolatedText(doc, type, txtVal) { + if (!txtVal) + return ""; + var sensoryTextArr = validateParams[type].value; + var hash = {}, result = []; + // split the string into words + var counts = txtVal.split(/\s+/).reduce(function (map, word) { + var wordWoTrailingPunc = word.replace(/[.?!:;()'",`\]]+$/, ""); + var lcWordWoPunc = word.toLowerCase().replace(/[.?!:;()'",`\]]/g, ""); + for (var counter = 0; counter < sensoryTextArr.length; counter++) { + var a = lcWordWoPunc.indexOf(sensoryTextArr[counter]); + var sensoryWordLen = sensoryTextArr[counter].length; + var charFollowSensoryText = lcWordWoPunc.charAt(sensoryWordLen + a); + // If the word does not contains substring of sensoryTextArr[counter] + // proceed to the next loop iteration for next sensoryText. + if (a < 0) { + continue; + } + //check the following and proceeding punctuations + //let isPuncfollowing = ((charFollowSensoryText == '\-') || + var isPuncfollowing = ((charFollowSensoryText == '\.') || + (charFollowSensoryText == '\?') || (charFollowSensoryText == '\!') || + (charFollowSensoryText == '\:') || (charFollowSensoryText == '\;') || + (charFollowSensoryText == '\(') || (charFollowSensoryText == '\)') || + (charFollowSensoryText == '\'') || (charFollowSensoryText == '\"') || + (charFollowSensoryText == '\,') || (charFollowSensoryText == '.\`') || + (charFollowSensoryText == '\\') || (charFollowSensoryText == '\]')); + var isPuncPreceding = false; + if (a > 0) { + var charPrecedeSensoryText = lcWordWoPunc.charAt(a - 1); + isPuncPreceding = ((charPrecedeSensoryText == '\-') || + (charPrecedeSensoryText == '\.') || + (charPrecedeSensoryText == '\?') || (charPrecedeSensoryText == '\!') || + (charPrecedeSensoryText == '\:') || (charPrecedeSensoryText == '\;') || + (charPrecedeSensoryText == '\(') || (charPrecedeSensoryText == '\)') || + (charPrecedeSensoryText == '\'') || (charPrecedeSensoryText == '\"') || + (charPrecedeSensoryText == '\,') || (charPrecedeSensoryText == '.\`') || + (charPrecedeSensoryText == '\\') || (charPrecedeSensoryText == '\]')); + } + if (((lcWordWoPunc.length == sensoryWordLen) || (isPuncfollowing == true) || (isPuncPreceding == true))) { + if (!hash.hasOwnProperty(wordWoTrailingPunc)) { + hash[wordWoTrailingPunc] = true; + result.push(wordWoTrailingPunc); + } + counter = sensoryTextArr.length; + } + } + map[wordWoTrailingPunc] = (map[wordWoTrailingPunc] || 0) + 1; + return map; + }, Object.create(null)); + return result.join(", "); +} + + +/***/ }, + +/***/ "./src/v4/rules/text_spacing_valid.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/text_spacing_valid.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.text_spacing_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var CSSUtil_1 = __webpack_require__(/*! ../util/CSSUtil */ "./src/v4/util/CSSUtil.ts"); +var DOMMapper_1 = __webpack_require__(/*! ../../v2/dom/DOMMapper */ "./src/v2/dom/DOMMapper.ts"); +// Module-level constants +var STYLE_VALUE_REGEX = /(-?[\d.]+)([a-z%]*)/; +var MIN_WORD_SPACING_RATIO = 0.16; +var MIN_LETTER_SPACING_RATIO = 0.12; +var MIN_LINE_HEIGHT_RATIO = 1.5; +var IMPORTANT_SUFFIX = "!important"; +var IMPORTANT_SUFFIX_LENGTH = IMPORTANT_SUFFIX.length + 1; // +1 for the space before !important +/** + * Resolves inherited or unset style values by traversing up the DOM tree + * @param element - The element to resolve the style for + * @param property - The CSS property name + * @param currentValue - The current style value + * @returns The resolved style value + */ +function resolveInheritedStyle(element, property, currentValue) { + var _a; + if (currentValue.startsWith('inherit') || currentValue.startsWith('unset')) { + var ancestor = CSSUtil_1.CSSUtil.getAncestorWithStyles(element.parentElement, (_a = {}, _a[property] = ["*"], _a), ['inherit', 'unset']); + if (ancestor !== null) { + return CSSUtil_1.CSSUtil.getDefinedStyles(ancestor, [property])[property]; + } + else if (currentValue.startsWith('unset')) { + return "initial"; + } + } + return currentValue; +} +/** + * Removes the !important suffix from a style value + * @param styleValue - The style value potentially containing !important + * @returns The style value without !important + */ +function removeImportantSuffix(styleValue) { + return styleValue.substring(0, styleValue.length - IMPORTANT_SUFFIX_LENGTH); +} +/** + * Checks if a spacing property violates accessibility requirements + * @param element - The HTML element being checked + * @param property - The CSS property name (word-spacing, letter-spacing, line-height) + * @param styleValue - The current style value + * @param fontSize - The computed font size in pixels + * @param minRatio - The minimum ratio threshold + * @param allowUnitless - Whether unitless values are allowed (for line-height) + * @returns RuleResult indicating pass or fail + */ +function checkSpacingProperty(element, property, styleValue, fontSize, minRatio, allowUnitless) { + if (allowUnitless === void 0) { allowUnitless = false; } + // Check if !important is used + if (element.style.getPropertyPriority(property) !== 'important') { + return true; + } + // Remove !important suffix + var cleanValue = removeImportantSuffix(styleValue); + // Check for initial or normal values (computed space is 0) + if (cleanValue === 'initial' || cleanValue === 'normal') { + return false; + } + // Parse the numeric value + var numericValue = parseFloat(cleanValue); + if (isNaN(numericValue)) { + return true; + } + // Match value and unit + var parsedValue = cleanValue.trim().match(STYLE_VALUE_REGEX); + if (!parsedValue) { + return true; + } + var value = parsedValue[1], unit = parsedValue[2]; + // Handle unitless values (only for line-height) + if (unit === '') { + if (allowUnitless) { + return parseFloat(value) < minRatio ? false : true; + } + // For other properties, zero value without unit is ignored + if (parseFloat(value) === 0) { + return null; + } + } + // Skip if no unit and non-zero (error case, inapplicable) + if (unit === '' && parseFloat(value) !== 0) { + return null; + } + // Convert to pixels and check ratio + var pixels = CSSUtil_1.CSSUtil.convertValue2Pixels(unit, value, element); + if (pixels !== null && pixels / fontSize < minRatio) { + return false; + } + return true; +} +exports.text_spacing_valid = { + id: "text_spacing_valid", + context: "dom:*", + help: { + "en-US": { + "pass": "text_spacing_valid.html", + "group": "text_spacing_valid.html", + "fail_letter_spacing_style": "text_spacing_valid.html", + "fail_word_spacing_style": "text_spacing_valid.html", + "fail_line_height_style": "text_spacing_valid.html" + } + }, + messages: { + "en-US": { + "pass": "CSS !important is not used in inline style to control letter or word spacing or line height", + "group": "CSS !important should not be used in inline style to control letter or word spacing or line height", + "fail_letter_spacing_style": "CSS !important should not be used in inline ‘letter-spacing’ style", + "fail_word_spacing_style": "CSS !important should not be used in inline ‘word-spacing’ style", + "fail_line_height_style": "CSS !important should not be used in inline ‘line-height’ style" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.4.12"], + "level": IRule_1.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_1.eToolkitLevel.LEVEL_THREE + }], + act: ['9e45ec', '24afc2', '78fd32'], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Ensure that this element has children with actual text + var childStr = ""; + var childNodes = ruleContext.childNodes; + for (var i = 0; i < childNodes.length; ++i) { + if (childNodes[i].nodeType === 3) { // Text node + childStr += childNodes[i].nodeValue; + } + } + if (childStr.trim().length === 0) { + return null; + } + // Skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) { + return null; + } + // Skip the check if the element is off screen + var mapper = new DOMMapper_1.DOMMapper(); + var bounds = mapper.getUnadjustedBounds(ruleContext); + if (!bounds || bounds['top'] < 0 || bounds['left'] < 0) { + return null; + } + // Skip non-HTML elements (e.g., SVG) + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, "svg")) { + return null; + } + // Font size always resolved to 'px' + var computedStyle = getComputedStyle(ruleContext); + var fontSize = parseFloat(computedStyle.getPropertyValue('font-size')); + // Early exit optimization: Check if computed styles already pass + // If all three properties have passing values, we can skip the expensive getDefinedStyles call + var computedWordSpacing = computedStyle.getPropertyValue('word-spacing'); + var computedLetterSpacing = computedStyle.getPropertyValue('letter-spacing'); + var computedLineHeight = computedStyle.getPropertyValue('line-height'); + // Check if computed values pass the requirements + var wordSpacingPasses = true; + var letterSpacingPasses = true; + var lineHeightPasses = true; + // Check word-spacing (ignore 0px which represents default/normal) + if (computedWordSpacing) { + var wordValue = parseFloat(computedWordSpacing); + if (!isNaN(wordValue)) { + var wordPixels = CSSUtil_1.CSSUtil.convertValue2Pixels('px', wordValue.toString(), ruleContext); + if (wordPixels !== null && wordPixels / fontSize < MIN_WORD_SPACING_RATIO) { + wordSpacingPasses = false; + } + } + } + // Check letter-spacing (ignore 0px which represents default/normal) + if (computedLetterSpacing) { + var letterValue = parseFloat(computedLetterSpacing); + if (!isNaN(letterValue)) { + var letterPixels = CSSUtil_1.CSSUtil.convertValue2Pixels('px', letterValue.toString(), ruleContext); + if (letterPixels !== null && letterPixels / fontSize < MIN_LETTER_SPACING_RATIO) { + letterSpacingPasses = false; + } + } + } + // Check line-height + if (computedLineHeight) { + var lineValue = parseFloat(computedLineHeight); + if (!isNaN(lineValue)) { + // Line height can be unitless or in pixels + var match = computedLineHeight.match(STYLE_VALUE_REGEX); + if (match) { + var value = match[1], unit = match[2]; + if (unit === '' || unit === 'px') { + var ratio = unit === '' ? parseFloat(value) : parseFloat(value) / fontSize; + if (ratio < MIN_LINE_HEIGHT_RATIO) { + lineHeightPasses = false; + } + } + } + } + } + // If all computed values pass, we can skip the expensive getDefinedStyles check + if (wordSpacingPasses && letterSpacingPasses && lineHeightPasses) { + return null; + } + // Get defined styles to check for !important declarations + var styles = CSSUtil_1.CSSUtil.getDefinedStyles(ruleContext, ["word-spacing", "letter-spacing", "line-height"]); + if (Object.keys(styles).length === 0) { + return null; + } + var results = []; + // Check word-spacing + var wordStyle = styles['word-spacing']; + if (wordStyle) { + wordStyle = resolveInheritedStyle(ruleContext, 'word-spacing', wordStyle); + var result = checkSpacingProperty(ruleContext, 'word-spacing', wordStyle, fontSize, MIN_WORD_SPACING_RATIO); + results.push(result ? (0, IRule_1.RulePass)("pass") : (0, IRule_1.RuleFail)('fail_word_spacing_style')); + } + // Check letter-spacing + var letterStyle = styles['letter-spacing']; + if (letterStyle) { + letterStyle = resolveInheritedStyle(ruleContext, 'letter-spacing', letterStyle); + var result = checkSpacingProperty(ruleContext, 'letter-spacing', letterStyle, fontSize, MIN_LETTER_SPACING_RATIO); + results.push(result ? (0, IRule_1.RulePass)("pass") : (0, IRule_1.RuleFail)('fail_letter_spacing_style')); + } + // Check line-height (only if no scrollable ancestor) + var lineStyle = styles['line-height']; + var overflowStyles = { + "overflow": ['auto', 'scroll'], + "overflow-x": ['auto', 'scroll'], + "overflow-y": ['auto', 'scroll'] + }; + if (lineStyle && CSSUtil_1.CSSUtil.getAncestorWithStyles(ruleContext, overflowStyles) === null) { + lineStyle = resolveInheritedStyle(ruleContext, 'line-height', lineStyle); + var result = checkSpacingProperty(ruleContext, 'line-height', lineStyle, fontSize, MIN_LINE_HEIGHT_RATIO, true // Allow unitless values for line-height + ); + results.push(result ? (0, IRule_1.RulePass)("pass") : (0, IRule_1.RuleFail)('fail_line_height_style')); + } + return results.length > 0 ? results : null; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/text_whitespace_valid.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/text_whitespace_valid.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.text_whitespace_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.text_whitespace_valid = { + id: "text_whitespace_valid", + context: "dom:*", + help: { + "en-US": { + "pass": "text_whitespace_valid.html", + "potential_text": "text_whitespace_valid.html", + "group": "text_whitespace_valid.html" + } + }, + messages: { + "en-US": { + "pass": "Rule Passed", + "potential_text": "Space characters should not be used to create space between the letters of a word", + "group": "Space characters should not be used to control spacing within a word" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Don't trigger if we're not in the body or if we're in a script + var checkAncestor = CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["body", "script", "code"]); + if (checkAncestor == null || checkAncestor.nodeName.toLowerCase() != "body") + return null; + var passed = true; + var walkNode = ruleContext.firstChild; + while (passed && walkNode) { + // Comply to the Check Hidden Content setting will be done by default as this rule triggers on each element + // and for each element it only checks that single elements text nodes and nothing else. So all inner elements will be + // covered on their own. Currently for this rule by default Check Hidden Content will work, as we are doing + // a node walk only on siblings so it would not get text nodes from other siblings at all. + // In the case in the future something chnges, just need to add && !RPTUtil.shouldNodeBeSkippedHidden(walkNode) to the below + // if. + if (walkNode.nodeName == "#text") { + var txtVal = walkNode.nodeValue; + passed = !(/(^|\s)[a-zA-Z] [a-zA-Z] [a-zA-Z]($|\s)/.test(txtVal)); + } + walkNode = walkNode.nextSibling; + } + if (passed) + return (0, IRule_1.RulePass)("pass"); + return (0, IRule_1.RulePotential)("potential_text"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/widget_tabbable_exists.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/widget_tabbable_exists.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.widget_tabbable_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var ARIAMapper_1 = __webpack_require__(/*! ../../v2/aria/ARIAMapper */ "./src/v2/aria/ARIAMapper.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.widget_tabbable_exists = { + id: "widget_tabbable_exists", + context: "aria:button,aria:link,aria:spinbutton,aria:tablist,aria:combobox,aria:listbox,aria:menu,aria:radiogroup,aria:tree,aria:menubar, aria:grid, aria:treegrid, aria:checkbox,aria:slider,aria:spinbutton,aria:textbox,aria:scrollbar,aria:slider,aria:spinbutton", + refactor: { + "IBMA_Focus_Tabbable": { + "pass": "pass", + "fail_no_tabbable": "fail_no_tabbable" + } + }, + help: { + "en-US": { + "pass": "widget_tabbable_exists.html", + "fail_no_tabbable": "widget_tabbable_exists.html", + "group": "widget_tabbable_exists.html" + } + }, + messages: { + "en-US": { + "pass": "Rule Passed", + "fail_no_tabbable": "Component with \"{0}\" role does not have a tabbable element", + "group": "Component must have at least one tabbable element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip the check if the element should be a presentational child of an element + if (AriaUtil_1.AriaUtil.shouldBePresentationalChild(ruleContext)) + return; + var nodeName = ruleContext.nodeName.toLowerCase(); + //ignore datalist element check since it will be part of a input element or hidden by default + if (nodeName === 'datalist') + return null; + // Composite user interface widget roles. They act as containers that manage other, contained widgets. + var roleContainers = ["combobox", "grid", "listbox", "menu", "menubar", "radiogroup", "tablist", "tree", "treegrid"]; + for (var _i = 0, roleContainers_1 = roleContainers; _i < roleContainers_1.length; _i++) { + var role_1 = roleContainers_1[_i]; + if (AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, role_1, true) != null) + // it's a descendant of a composite widget already examined + return null; + } + var role = ARIAMapper_1.ARIAMapper.nodeToRole(ruleContext); + var count = 0; + if (CommonUtil_1.CommonUtil.isTabbable(ruleContext)) { + ++count; + } + // If node has children, look for tab stops in the children + // skip the count if the element requires presentational children only + if (count < 1 && !AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(ruleContext) && ruleContext.firstChild) { + var nw = new DOMWalker_1.DOMWalker(ruleContext); + while (count < 1 && nw.nextNode() && nw.node != ruleContext) { + if (nw.node.nodeType == 1 && !nw.bEndTag && CommonUtil_1.CommonUtil.isTabbable(nw.node)) { + ++count; + } + } + } + var passed = count >= 1; + return passed ? (0, IRule_1.RulePass)("pass") : (0, IRule_1.RulePotential)("fail_no_tabbable", [role]); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/widget_tabbable_single.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/widget_tabbable_single.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.widget_tabbable_single = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var ARIAMapper_1 = __webpack_require__(/*! ../../v2/aria/ARIAMapper */ "./src/v2/aria/ARIAMapper.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.widget_tabbable_single = { + id: "widget_tabbable_single", + context: "aria:button,aria:link,aria:menuitem,aria:spinbutton,aria:tablist,aria:combobox,aria:listbox,aria:menu,aria:radiogroup,aria:tree,aria:checkbox,aria:option,aria:radio,aria:slider,aria:spinbutton,aria:textbox,aria:columnheader,aria:rowheader,aria:slider,aria:tab", + refactor: { + "IBMA_Focus_MultiTab": { + "pass": "pass", + "potential_multiple_tabbable": "potential_multiple_tabbable" + } + }, + help: { + "en-US": { + "pass": "widget_tabbable_single.html", + "potential_multiple_tabbable": "widget_tabbable_single.html", + "group": "widget_tabbable_single.html" + } + }, + messages: { + "en-US": { + "pass": "Components with a widget role should have no more than one tabbable element", + "potential_multiple_tabbable": "Component with \"{0}\" role has more than one tabbable element", + "group": "Components with a widget role must have no more than one tabbable element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1", "2.4.3"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip the check if the element should be a presentational child of an element + if (AriaUtil_1.AriaUtil.shouldBePresentationalChild(ruleContext)) + return; + var role = ARIAMapper_1.ARIAMapper.nodeToRole(ruleContext); + var count = 0; + if (CommonUtil_1.CommonUtil.isTabbable(ruleContext)) { + ++count; + } + // If node has children, look for tab stops in the children + //skip the count if the element requires presentational children only + var name = []; + if (count < 2 && !AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(ruleContext) && ruleContext.firstChild) { + var nw = new DOMWalker_1.DOMWalker(ruleContext); + while (count < 2 && nw.nextNode() && nw.node != ruleContext) { + if (nw.node.nodeType == 1 && !nw.bEndTag && CommonUtil_1.CommonUtil.isTabbable(nw.node)) { + // Radio inputs with the same name natively are only one tab stop + /**if (nw.node.nodeName.toLowerCase() === 'input' && (nw.node as Element).getAttribute("type") === 'radio') { + let curName = (nw.node as Element).getAttribute("name"); + if (name.includes(curName)) + continue; + else + name.push(curName); + }*/ + ++count; + } + } + } + var passed = count < 2; + if (!passed) + CacheUtil_1.CacheUtil.setCache(ruleContext, "widget_tabbable_single", "potential_multiple_tabbable"); + return passed ? (0, IRule_1.RulePass)("pass") : (0, IRule_1.RulePotential)("potential_multiple_tabbable", [role]); + } +}; + + +/***/ }, + +/***/ "./src/v4/rulesets.ts" +/*!****************************!*\ + !*** ./src/v4/rulesets.ts ***! + \****************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.a11yRulesets = void 0; +// This file comes from https://raw.githubusercontent.com/act-rules/act-tools/main/src/data/sc-urls.json +var SCURLs = __importStar(__webpack_require__(/*! ./sc-urls.json */ "./src/v4/sc-urls.json")); +var IGuideline_1 = __webpack_require__(/*! ./api/IGuideline */ "./src/v4/api/IGuideline.ts"); +var SCs = []; +for (var key in SCURLs) { + SCs.push(SCURLs[key]); +} +var summaries = { + "1.1.1": "All non-text content that is presented to the user has a text alternative that serves the equivalent purpose.", + "1.2.1": "For prerecorded audio-only or video-only media, an alternative provides equivalent information.", + "1.2.2": "Captions are provided for all prerecorded audio content in synchronized media.", + "1.2.3": "An alternative for time-based media or audio description of the prerecorded video content is provided for synchronized media.", + "1.2.4": "Captions are provided for all live audio content in synchronized media.", + "1.2.5": "Audio description is provided for all prerecorded video content in synchronized media.", + "1.3.1": "Information, structure, and relationships conveyed through presentation can be programmatically determined or are available in text.", + "1.3.2": "When the sequence in which content is presented affects its meaning, a correct reading sequence can be programmatically determined.", + "1.3.3": "Instructions provided for understanding and operating content do not rely solely on sensory characteristics of components such as shape, size, visual location, orientation, or sound.", + "1.3.4": "Content does not restrict its view and operation to a single display orientation, such as portrait or landscape.", + "1.3.5": "The purpose of each input field that collects information about the user can be programmatically determined when the field serves a common purpose.", + "1.4.1": "Color is not used as the only visual means of conveying information, indicating an action, prompting a response, or distinguishing a visual element.", + "1.4.2": "If any audio plays automatically for more than 3 seconds, either a mechanism is available to pause or stop the audio, or a mechanism is available to control audio volume independently from the overall system volume level.", + "1.4.3": "The visual presentation of text and images of text has a contrast ratio of at least 4.5:1, with a 3:1 ratio for large-scale text.", + "1.4.4": "Text can be resized without assistive technology up to 200 percent without loss of content or functionality.", + "1.4.5": "If the technologies being used can achieve the visual presentation, text should not be used to convey information rather than images of text.", + "1.4.10": "Content can reflow without loss of information or functionality, and without requiring scrolling in two dimensions.", + "1.4.11": "The parts of graphical objects required to understand the content, and the visual information required to identify UI components and states, have a contrast ratio of at least 3:1 against adjacent colors.", + "1.4.12": "No loss of content or functionality occurs when users change letter, word and paragraph spacing, as well as line height.", + "1.4.13": "Where hover or focus actions cause additional content to become visible and hidden, the additional content is dismissable, hoverable and persistent.", + "2.1.1": "All functionality of the content is operable through a keyboard interface without requiring specific timings for individual keystrokes.", + "2.1.2": "If keyboard focus can be moved to a component using a keyboard interface, then focus can be moved away from that component using only a keyboard interface, and, if it requires more than unmodified arrow or tab keys or other standard exit methods, the user is advised of the method for moving focus away.", + "2.1.4": "If a keyboard shortcut is implemented using only letter, punctuation, number or symbol characters, then the shortcut can be turned off, remapped or activated only on focus.", + "2.2.1": "For each time limit that is set by the content, the user can turn off, adjust, or extend the limit.", + "2.2.2": "For moving, blinking, scrolling, or auto-updating information, the user can pause, stop, hide or adjust the information.", + "2.3.1": "Content does not contain anything that flashes more than three times in any one second period, or the flash is below the general flash and red flash thresholds.", + "2.4.1": "A mechanism is available to bypass blocks of content that are repeated on multiple Web pages.", + "2.4.2": "Web pages, non-web documents, and software have titles that describe topic or purpose.", + "2.4.3": "If content can be navigated sequentially and the navigation sequences affect meaning or operation, focusable components receive focus in an order that preserves meaning and operability.", + "2.4.4": "The purpose of each link can be determined from the link text alone or from the link text together with its programmatically determined link content.", + "2.4.5": "More than one way is available to locate a Web page within a set of Web pages, except where the Web Page is the result of, or a step in, a process.", + "2.4.6": "Headings and labels describe topic or purpose.", + "2.4.7": "Any keyboard operable user interface has a mode of operation where the keyboard focus indicator is visible.", + "2.4.11": "When an element receives focus, it is not entirely covered by other content.", + "2.5.1": "All functionality that uses multipoint or path-based gestures for operation can be operated with a single pointer without a path-based gesture.", + "2.5.2": "For functionality that can be operated using a single pointer, completion of the function is on the up-event with an ability to abort, undo or reverse the outcome.", + "2.5.3": "For user interface components with labels that include text or images of text, the accessible name contains the text that is presented visually.", + "2.5.4": "Functionality that can be operated by motion can also be operated by user interface components, and the motion trigger can be disabled.", + "2.5.8": "The size of the target for pointer inputs is at least 24 by 24 CSS pixels.", + "2.5.7": "All functionality that uses a dragging movement for operation can be achieved by a single pointer without dragging.", + "3.1.1": "The default human language of Web pages, non-Web documents, or software can be programmatically determined.", + "3.1.2": "The human language of each passage or phrase in the content can be programmatically determined.", + "3.2.1": "When any component receives focus, it does not initiate a change of context.", + "3.2.2": "Changing the setting of any user interface component does not automatically cause a change of context unless the user has been advised of the behavior before using the component.", + "3.2.3": "Navigational mechanisms that are repeated on multiple Web pages within a set of Web pages occur in the same relative order each time they are repeated, unless a change is initiated by the user.", + "3.2.4": "Components that have the same functionality within a set of Web pages are identified consistently.", + "3.2.6": "Make it easier to find help and support. If a Web page contains help mechanisms they occur in the same order relative to other page content, unless a change is initiated by the user.", + "3.3.1": "If an input error is automatically detected, the item that is in error is identified and the error is described to the user in text.", + "3.3.2": "Labels or instructions are provided when content requires user input.", + "3.3.3": "If an input error is automatically detected and suggestions for correction are known, then the suggestions are provided to the user, unless it would jeopardize the security or purpose of the content.", + "3.3.4": "For content that cause legal commitments or financial transactions for the user to occur, that modify or delete user-controllable data in data storage systems, or that submit user test responses, the user can reverse, correct, or confirm the action.", + "3.3.7": "Make it easier for users to complete multi-step processes. Don't ask for the same information twice in the same session.", + "3.3.8": "Make logins possible with less mental effort. Don't make people solve, recall, or transcribe something to log in.", + "4.1.1": "(Obsolete and removed) This requirement was originally adopted to address problems that assistive technology (AT) had directly parsing HTML. AT no longer has any need to directly parse HTML. Consequently, these problems either no longer exist or are addressed by other requirements.", + "4.1.2": "For all user interface components (including, but not limited to: form elements, links and components generated by scripts), the name and role can be programmatically determined; states, properties, and values that can be set by the user can be programmatically set; and notification of changes to these items is available to user agents, including assistive technologies.", + "4.1.3": "In content implemented using markup languages, status messages can be programmatically determined through role or properties such that they can be presented to the user by assistive technologies without receiving focus.", + "HTML": "The HTML specification issues that cause accessibility issues may be covered by other rules and will be reported under those accessibility requirements. However, some non-conforming HTML specification issues are still reported.", + "ARIA": "The ARIA specification issues that cause accessibility issues may be covered by other rules and will be reported under those accessibility requirements. However, some non-conforming ARIA specification issues are still reported.", +}; +exports.a11yRulesets = [ + // { + // id: "DEBUG", + // name: "DEBUG Rules", + // category: eRuleCategory.ACCESSIBILITY, + // description: "Rules for debugging", + // checkpoints: [{ + // num: "1", + // name: "Debug CP 1", + // wcagLevel: "A", + // summary: "Rules for Debug" + // }] + // }, + { + id: "EXTENSIONS", + name: "Extension Rules", + category: IGuideline_1.eGuidelineCategory.ACCESSIBILITY, + description: "Rules for enabling the browser extensions", + type: IGuideline_1.eGuidelineType.EXTENSION, + checkpoints: [{ + num: "1", + name: "Extension CP 1", + wcagLevel: "A", + summary: "Rules for Extension" + }] + }, + { + id: "IBM_Accessibility", + name: "IBM Accessibility 7.3", + category: IGuideline_1.eGuidelineCategory.ACCESSIBILITY, + description: "Rules for WCAG 2.0, 2.1, 2.2 A and AA plus additional IBM supplemental requirements.", + // This ruleset has all 2.0 and 2.1 checkpoints that are A or AA + checkpoints: SCs + .filter(function (sc) { return (sc.level === "A" || sc.level === "AA" || sc.level === "NA") && (sc.wcagType === "2.0" || sc.wcagType === "2.1" || sc.wcagType === "2.2" || sc.wcagType === "NA"); }) + .map(function (sc) { return ({ + num: sc.num, + scId: sc.scId, + name: sc.handle, + wcagLevel: sc.level, + summary: summaries[sc.num] + }); }) + }, + { + id: "IBM_Accessibility_next", + name: "IBM Accessibility next", + category: IGuideline_1.eGuidelineCategory.ACCESSIBILITY, + description: "Rules for WCAG 2.0, 2.1, 2.2 A and AA plus additional IBM supplemental requirements.", + // This ruleset has all 2.0 and 2.1 checkpoints that are A or AA + checkpoints: SCs + .filter(function (sc) { return (sc.level === "A" || sc.level === "AA" || sc.level === "NA") && (sc.wcagType === "2.0" || sc.wcagType === "2.1" || sc.wcagType === "2.2" || sc.wcagType === "NA"); }) + .map(function (sc) { return ({ + num: sc.num, + scId: sc.scId, + name: sc.handle, + wcagLevel: sc.level, + summary: summaries[sc.num] + }); }) + }, + { + id: "WCAG_2_2", + name: "WCAG 2.2 (A, AA)", + category: IGuideline_1.eGuidelineCategory.ACCESSIBILITY, + description: "Rules for WCAG 2.2 A & AA. This is the current W3C recommendation (specification). Content that conforms to WCAG 2.2 also conforms to WCAG 2.1.", + // This ruleset has all 2.0 and 2.1 checkpoints that are A or AA + checkpoints: SCs + .filter(function (sc) { return (sc.level === "A" || sc.level === "AA") && (sc.wcagType === "2.0" || sc.wcagType === "2.1" || sc.wcagType === "2.2"); }) + .map(function (sc) { return ({ + num: sc.num, + scId: sc.scId, + name: sc.handle, + wcagLevel: sc.level, + summary: summaries[sc.num] + }); }) + }, + { + id: "WCAG_2_1", + name: "WCAG 2.1 (A, AA)", + category: IGuideline_1.eGuidelineCategory.ACCESSIBILITY, + description: "Rules for WCAG 2.1 A & AA. Content that conforms to WCAG 2.1 also conforms to WCAG 2.0.", + // This ruleset has all 2.0 and 2.1 checkpoints that are A or AA + checkpoints: SCs + .filter(function (sc) { return (sc.level === "A" || sc.level === "AA") && (sc.wcagType === "2.0" || sc.wcagType === "2.1"); }) + .map(function (sc) { return ({ + num: sc.num, + scId: sc.scId, + name: sc.handle, + wcagLevel: sc.level, + summary: summaries[sc.num] + }); }) + }, + { + id: "WCAG_2_0", + name: "WCAG 2.0 (A, AA)", + category: IGuideline_1.eGuidelineCategory.ACCESSIBILITY, + description: "Rules for WCAG 2.0 A & AA. Referenced by US Section 508, but not the latest W3C recommendation.", + // This ruleset has all 2.0 checkpoints that are A or AA + checkpoints: SCs + .filter(function (sc) { return (sc.level === "A" || sc.level === "AA") && (sc.wcagType === "2.0"); }) + .map(function (sc) { return ({ + num: sc.num, + scId: sc.scId, + name: sc.handle, + wcagLevel: sc.level, + summary: summaries[sc.num] + }); }) + } +]; + + +/***/ }, + +/***/ "./src/v4/simulator/SRController.ts" +/*!******************************************!*\ + !*** ./src/v4/simulator/SRController.ts ***! + \******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SRController = void 0; +var SRCursor_1 = __webpack_require__(/*! ./SRCursor */ "./src/v4/simulator/SRCursor.ts"); +var SRRenderer_1 = __webpack_require__(/*! ./SRRenderer */ "./src/v4/simulator/SRRenderer.ts"); +var SRNavigator_1 = __webpack_require__(/*! ./SRNavigator */ "./src/v4/simulator/SRNavigator.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var SRUtil_1 = __webpack_require__(/*! ./SRUtil */ "./src/v4/simulator/SRUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +/** + * SRController class for managing screen reader simulation + * Maintains a point of regard and provides navigation functions + */ +var SRController = /** @class */ (function () { + /** + * Creates a new SRController + * @param rootElement The root element to start from (defaults to document.body) + */ + function SRController(rootElement) { + if (rootElement === void 0) { rootElement = document.body; } + this.rootElement = rootElement; + this.liveListeners = []; + this.ctrlDoc = rootElement.ownerDocument; + this.setPointOfRegard(rootElement); + this.setupMutationTracking(); + console.info("[WARNING] The SRController is a new feature that is not yet \"stable\". What this means:\n* API subject to change, even between minor versions of the checker\n* Results should be considered experimental. There are a variety of known issues, but making this available for early experimentation / feedback."); + } + SRController.getController = function (ctrlDoc) { + if (ctrlDoc === void 0) { ctrlDoc = document; } + if (!this.singleton) { + this.singleton = new SRController(ctrlDoc.body); + } + return this.singleton; + }; + SRController.prototype.disconnect = function () { + if (this.mutationObserver) { + this.mutationObserver.disconnect(); + } + }; + SRController.prototype.findAllShadowRoots = function (root) { + if (root === void 0) { root = document; } + var shadowRoots = []; + // Get all elements in the current root + var walker = this.ctrlDoc.createTreeWalker(root, NodeFilter.SHOW_ELEMENT, null); + var node; + while (node = walker.nextNode()) { + var element = node; + // Check if this element has an open shadow root + if (element.shadowRoot) { + shadowRoots.push(element.shadowRoot); + // Recursively search inside this shadow root + var nestedShadowRoots = this.findAllShadowRoots(element.shadowRoot); + shadowRoots.push.apply(shadowRoots, nestedShadowRoots); + } + } + return shadowRoots; + }; + /** + * Set up mutation tracking + * + * In the event that the point of regard is removed from the DOM, we need to get up to the nearest parent that's not being removed + */ + SRController.prototype.setupMutationTracking = function () { + var _this = this; + if (this.mutationObserver) { + this.mutationObserver.disconnect(); + } + var myThis = this; + var observer = new MutationObserver(function (mutations) { + var porNode = myThis.pointOfRegard.getNode(); + var _loop_1 = function (removalMutation) { + removalMutation.removedNodes.forEach(function (removedNode) { + if (removedNode.isSameNode(porNode) || removedNode.contains(porNode)) { + console.info("Adjusting PoR due to DOM mutation removing PoR"); //, removalMutation.target, removedNode, porNode) + porNode = removalMutation.target; + } + }); + }; + for (var _i = 0, _a = mutations.filter(function (mutation) { var _a; return ((_a = mutation.removedNodes) === null || _a === void 0 ? void 0 : _a.length) > 0; }); _i < _a.length; _i++) { + var removalMutation = _a[_i]; + _loop_1(removalMutation); + } + ; + _this.setPointOfRegard(porNode); + var _loop_2 = function (mutation) { + if (mutation.addedNodes) { + mutation.addedNodes.forEach(function (addedNode) { + // Add observation of new shadow roots + var allRoots = _this.findAllShadowRoots(addedNode); + for (var _i = 0, allRoots_2 = allRoots; _i < allRoots_2.length; _i++) { + var root = allRoots_2[_i]; + observer.observe(root, { + childList: true, + subtree: true, + characterData: true + }); + } + }); + } + var node = mutation.target; + var elem = node.nodeType === 1 ? node : node.parentElement; + if (elem + && !elem.closest("[aria-busy=\"true\"]") + && elem.getAttribute("aria-busy") !== "true") { + // Identify the live region container + var liveRegionElem = + // The element itself is a live region container + ((["polite", "assertive"].includes(elem.getAttribute("aria-live")) + || elem.nodeName.toUpperCase() === "OUTPUT" + || ["status", "log", "progressbar", "alert", "timer"].includes(elem.getAttribute("role"))) && elem) + // Or get the nearest ancestor + || elem.closest("[aria-live=\"polite\"],[aria-live=\"assertive\"],output,[role=\"status\"],[role=\"log\"],[role=\"progressbar\"],[role=\"alert\"],[role=\"timer\"]"); + var isMutationRelevant = false; + var relevance_1 = ["additions", "text"]; + if (liveRegionElem) { + // Determine what kinds of changes are 'relevant' + var relevantElem = elem.closest("[aria-relevant]"); + if (relevantElem) { + relevance_1 = relevantElem.getAttribute("aria-relevant").split(/ +/g); + } + if (liveRegionElem.getAttribute("role") === "log") { + relevance_1 = ["additions"]; + } + if (liveRegionElem.hasAttribute("aria-relevant")) { + relevance_1 = liveRegionElem.getAttribute("aria-relevant").split(/ +/g); + } + if (relevance_1.includes("all")) { + relevance_1 = ["additions", "removals", "text"]; + } + isMutationRelevant = (mutation.target.nodeType === 3 && relevance_1.includes("text")) + || (mutation.addedNodes.length > 0 && relevance_1.includes("additions")) + || (mutation.removedNodes.length > 0 && relevance_1.includes("removals")); + } + if (liveRegionElem && isMutationRelevant) { + var isAtomic_1 = liveRegionElem.getAttribute("aria-atomic") === "true" || ["alert", "status", "timer", "marquee"].includes(liveRegionElem.getAttribute("role")); + // Read the whole region if atomic + if (!isAtomic_1 && mutation.type === "characterData" && mutation.target.nodeType === 3 && !VisUtil_1.VisUtil.isNodeHiddenFromAT(mutation.target.parentElement)) { + for (var _c = 0, _d = _this.liveListeners; _c < _d.length; _c++) { + var liveListener = _d[_c]; + liveListener(mutation.target.nodeValue); + } + } + else { + var liveTarget_1 = isAtomic_1 ? liveRegionElem : mutation.target; + if (liveTarget_1.liveAnnounce) { + clearTimeout(liveTarget_1.liveAnnounce); + } + liveTarget_1.liveAnnounce = setTimeout(function () { + var results = []; + var isRemoval = (relevance_1.includes("removals") && mutation.removedNodes.length > 0); + if (isAtomic_1 || isRemoval) { + var liveCursor = new SRCursor_1.SRCursor(liveTarget_1, false); + var liveCursorEnd = new SRCursor_1.SRCursor(liveTarget_1, true); + liveCursorEnd.next(function () { return true; }); + results.push((isRemoval ? "[removed] " : "") + SRRenderer_1.SRRenderer.renderRange("item", liveCursor, liveCursorEnd)); + } + else if (relevance_1.includes("additions") && mutation.addedNodes.length > 0) { + mutation.addedNodes.forEach(function (addedNode) { + // Just render the additions + var liveCursor = new SRCursor_1.SRCursor(addedNode, false); + var liveCursorEnd = new SRCursor_1.SRCursor(addedNode, true); + liveCursorEnd.next(function () { return true; }); + results.push(SRRenderer_1.SRRenderer.renderRange("item", liveCursor, liveCursorEnd)); + }); + } + for (var _i = 0, _a = _this.liveListeners; _i < _a.length; _i++) { + var liveListener = _a[_i]; + liveListener(results.join("\n")); + } + }, 100); + } + } + } + }; + for (var _b = 0, mutations_1 = mutations; _b < mutations_1.length; _b++) { + var mutation = mutations_1[_b]; + _loop_2(mutation); + } + }); + // Need to observe all of the shadow roots + var allRoots = this.findAllShadowRoots(this.ctrlDoc.documentElement); + allRoots.push(this.ctrlDoc.documentElement); + for (var _i = 0, allRoots_1 = allRoots; _i < allRoots_1.length; _i++) { + var root = allRoots_1[_i]; + observer.observe(root, { + childList: true, + subtree: true, + characterData: true + }); + } + }; + SRController.prototype.addLiveListener = function (listener) { + this.liveListeners.push(listener); + }; + SRController.prototype.removeLiveListener = function (removeListener) { + this.liveListeners = this.liveListeners.filter(function (listener) { return listener !== removeListener; }); + }; + /** + * Get the current point of regard + * @returns The current SRCursor representing the point of regard + */ + SRController.prototype.getPointOfRegard = function () { + return this.pointOfRegard; + }; + /** + * Set the point of regard to a specific DOM node + * @param node The node to set as the point of regard + * @returns NavigationResult indicating success or failure + */ + SRController.prototype.setPointOfRegard = function (node) { + var _a; + var DEBUG = false; + DEBUG && console.group("setPointOfRegard"); + try { + this.pointOfRegard = new SRCursor_1.SRCursor(node); + // Update container state + var containerChanges = SRController.diffContainers("focus", this.pointOfRegard); + var role = this.pointOfRegard.getRole(); + var name_1 = (_a = this.pointOfRegard.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name; + return { + success: true, + renderingResult: SRRenderer_1.SRRenderer.renderCurrent("focus", this.pointOfRegard, containerChanges), + role: role, + name: name_1 + }; + } + catch (error) { + return { + success: false, + renderingResult: { + start: this.pointOfRegard.clone(), + end: this.pointOfRegard.clone(), + message: "Failed to set point of regard: ".concat(error.message) + } + }; + } + finally { + DEBUG && console.groupEnd(); + } + }; + /** + * Jump to the next element by the specified mode + * @param mode The navigation mode to use + * @returns NavigationResult indicating success or failure + */ + SRController.prototype.jumpNext = function (mode) { + var _a; + CacheUtil_1.CacheUtil.clearCaches(this.ctrlDoc.documentElement); + var oldPointOfRegard = this.pointOfRegard.clone(); + var DEBUG = false; + DEBUG && console.group("jumpNext"); + try { + var bContinue = true; + var nextJump = this.pointOfRegard.clone(); + var renderingResult = void 0; + while (bContinue && nextJump) { + var lastJump = nextJump.clone(); + nextJump = SRNavigator_1.SRNavigator.jumpNext(mode, nextJump); + if (nextJump) { + var containerChanges = SRController.diffContainers(mode, nextJump, lastJump); + if (mode === "item" && !SRNavigator_1.SRNavigator.getStartFunc(mode)(nextJump.getRole(), !nextJump.isEndTag(), nextJump.getNode())) { + containerChanges = { + entering: [], + leaving: [] + }; + } + renderingResult = SRRenderer_1.SRRenderer.renderCurrent(mode, nextJump, containerChanges); + // Keep going if the landing point is empty, unless it's certain nav modes (e.g., region) + bContinue = renderingResult.message.trim().length === 0 && !["region"].includes(mode); + } + } + if (!nextJump) { + // Restore the original point of regard + this.pointOfRegard = oldPointOfRegard; + var currentResult = SRRenderer_1.SRRenderer.renderCurrent(mode, oldPointOfRegard, { leaving: [], entering: [] }); + return { + success: false, + renderingResult: { + start: oldPointOfRegard.clone(), + end: oldPointOfRegard.clone(), + message: "No next ".concat(mode, ". ").concat((currentResult === null || currentResult === void 0 ? void 0 : currentResult.message) || "") + } + }; + } + else { + this.pointOfRegard = nextJump; + var role = this.pointOfRegard.getRole(); + var name_2 = (_a = this.pointOfRegard.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name; + // Check for container changes + DEBUG && console.log("New POR:", this.pointOfRegard.getNode(), renderingResult); + return { + success: true, + renderingResult: renderingResult, + role: role, + name: name_2 + }; + } + } + catch (error) { + console.error(error); + // Restore the original point of regard + this.pointOfRegard = oldPointOfRegard; + return { + success: false, + renderingResult: { + start: oldPointOfRegard.clone(), + end: oldPointOfRegard.clone(), + message: "Navigation error: ".concat(error.message) + } + }; + } + finally { + console.groupEnd(); + } + }; + /** + * Jump to the previous element by the specified mode + * @param mode The navigation mode to use + * @returns NavigationResult indicating success or failure + */ + SRController.prototype.jumpPrevious = function (mode) { + var _a; + CacheUtil_1.CacheUtil.clearCaches(this.ctrlDoc.documentElement); + var oldPointOfRegard = this.pointOfRegard.clone(); + try { + var bContinue = true; + var prevJump = this.pointOfRegard.clone(); + var renderingResult = void 0; + while (bContinue && prevJump) { + var lastJump = prevJump.clone(); + prevJump = SRNavigator_1.SRNavigator.jumpPrevious(mode, prevJump); + if (prevJump) { + var containerChanges = SRController.diffContainers(mode, prevJump, lastJump); + if (mode === "item" && !SRNavigator_1.SRNavigator.getStartFunc(mode)(prevJump.getRole(), !prevJump.isEndTag(), prevJump.getNode())) { + containerChanges = { + entering: [], + leaving: [] + }; + } + renderingResult = SRRenderer_1.SRRenderer.renderCurrent(mode, prevJump, containerChanges); + // Keep going if the landing point is empty, unless it's certain nav modes (e.g., region) + bContinue = renderingResult.message.trim().length === 0 && !["region"].includes(mode); + } + } + if (!prevJump) { + // Restore the original point of regard + this.pointOfRegard = oldPointOfRegard; + var currentResult = SRRenderer_1.SRRenderer.renderCurrent(mode, oldPointOfRegard, { leaving: [], entering: [] }); + return { + success: false, + renderingResult: { + start: oldPointOfRegard.clone(), + end: oldPointOfRegard.clone(), + message: "No previous ".concat(mode, ". ").concat((currentResult === null || currentResult === void 0 ? void 0 : currentResult.message) || "") + } + }; + } + else { + this.pointOfRegard = prevJump; + var role = this.pointOfRegard.getRole(); + var name_3 = (_a = this.pointOfRegard.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name; + // // Check for container changes + // const containerChanges = SRController.diffContainers(mode, this.pointOfRegard, oldPointOfRegard); + // let s = SRRenderer.renderEnter(mode, this.pointOfRegard); + // if (containerChanges.entering[containerChanges.entering.length-1] !== s) { + // containerChanges.entering.push(s); + // } + return { + success: true, + renderingResult: renderingResult, + role: role, + name: name_3 + }; + } + } + catch (error) { + console.error(error); + // Restore the original point of regard + this.pointOfRegard = oldPointOfRegard; + return { + success: false, + renderingResult: { + start: oldPointOfRegard.clone(), + end: oldPointOfRegard.clone(), + message: "Navigation error: ".concat(error.message) + } + }; + } + }; + /** + * Determine the different in containers between the two nodes + * @param newWalker The new node we're navigating to + * @param oldWalker The previous node we were at + * @returns Array of container change messages + */ + SRController.diffContainers = function (mode, newWalker, oldWalker) { + var DEBUG = false; + DEBUG && console.log("-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-"); + DEBUG && console.log("A)", oldWalker.getNode().nodeName, newWalker.getNode().nodeName); + var leaving = []; + var entering = []; + try { + var docRoot = newWalker ? + (newWalker.getNode().ownerDocument.body || newWalker.getNode().ownerDocument.documentElement) : + oldWalker ? + (oldWalker.getNode().ownerDocument.body || oldWalker.getNode().ownerDocument.documentElement) : + document.body || document.documentElement; + var walkNew = newWalker ? newWalker.clone() : (new SRCursor_1.SRCursor(docRoot)); + var walkOld = oldWalker ? oldWalker.clone() : (new SRCursor_1.SRCursor(docRoot)); + if (!walkNew.getNode().isSameNode(walkOld.getNode())) { + var commonParent = SRController.commonParent(walkNew, walkOld); + if (commonParent) { + DEBUG && console.log("B)", commonParent.getNode().nodeName); + while (commonParent.contains(walkNew)) { + DEBUG && console.log("Entering:", walkNew.getNode().nodeName); + entering.push(SRRenderer_1.SRRenderer.renderEnter(mode, walkNew, walkOld)); + walkNew.parent(); + } + entering.reverse(); + entering = entering.filter(function (s) { return s && s.trim().length > 0; }).map(function (s) { return s.trim(); }); + ; + while (commonParent.contains(walkOld)) { + DEBUG && console.log("Leaving:", walkOld.getNode().nodeName); + leaving.push(SRRenderer_1.SRRenderer.renderLeave(mode, walkOld, walkOld)); + walkOld.parent(); + } + leaving = leaving.filter(function (s) { return s && s.trim().length > 0; }).map(function (s) { return s.trim(); }); + } + } + } + catch (err) { + console.error(err); + } + DEBUG && console.log(leaving, entering); + return { + leaving: leaving, + entering: entering + }; + }; + SRController.commonParent = function (walkerOne, walkerTwo) { + if (walkerOne.contains(walkerTwo)) { + return walkerOne.clone(); + } + else if (walkerTwo.contains(walkerOne)) { + return walkerTwo.clone(); + } + else { + var commonParent = walkerOne.clone(); + while (!commonParent.contains(walkerTwo) && commonParent.parent()) + ; + if (!commonParent.contains(walkerOne) || !commonParent.contains(walkerTwo)) { + return null; + } + return commonParent; + } + }; + SRController.renderAll = function (mode) { + var ctrl = SRController.getController(); + var dialogs = ctrl.ctrlDoc.body.querySelectorAll("dialog,[role='dialog']"); + dialogs.forEach(function (dialog) { + if (SRUtil_1.SRUtil.isModalDialogElement(dialog)) { + ctrl.setPointOfRegard(dialog); + } + }); + var results = []; + // Handle the initial item first (if there is one) + var starterMsg = SRRenderer_1.SRRenderer.renderCurrent(mode, ctrl.getPointOfRegard(), { entering: [], leaving: [] }); + if (starterMsg) { + results.push(starterMsg.message); + } + var bContinue = true; + while (bContinue) { + var nextVal = ctrl.jumpNext(mode); + if (nextVal.success) { + results.push(nextVal.renderingResult.message); + } + else { + bContinue = false; + } + } + return results; + }; + SRController.renderAllDetail = function (doc, mode) { + var ctrl = SRController.getController(doc); + ctrl.setPointOfRegard(doc.body); + var dialogs = doc.body.querySelectorAll("dialog,[role='dialog']"); + dialogs.forEach(function (dialog) { + if (SRUtil_1.SRUtil.isModalDialogElement(dialog)) { + ctrl.setPointOfRegard(dialog); + } + }); + var results = []; + // Handle the initial item first (if there is one) + var starterMsg = SRRenderer_1.SRRenderer.renderCurrent(mode, ctrl.getPointOfRegard(), { entering: [], leaving: [] }); + if (starterMsg) { + results.push(starterMsg); + } + var bContinue = true; + while (bContinue) { + var nextVal = ctrl.jumpNext(mode); + if (nextVal.success) { + // mode === "item" && console.log(nextVal); + results.push(nextVal.renderingResult); + } + else { + bContinue = false; + } + } + return results; + }; + SRController.renderStructure = function (doc) { + var _a; + var modes = ["region", "heading", "item", "tab_focus", "image"]; + var details = modes.map(function (modeLabel) { return SRController.renderAllDetail(doc, modeLabel); }); + var retVal = []; + var _loop_3 = function () { + var next = (_a = details[0][0]) === null || _a === void 0 ? void 0 : _a.start; + modes.forEach(function (mode, idx) { + if (details[idx].length > 0) { + if (!next || SRCursor_1.SRCursor.compare(details[idx][0].start, next) < 0) { + next = details[idx][0].start; + } + } + }); + var nextItem = {}; + var hasValue = false; + modes.forEach(function (mode, idx) { + nextItem[mode] = ""; + if (details[idx].length > 0 && SRCursor_1.SRCursor.compare(details[idx][0].start, next) === 0) { + nextItem[mode] = details[idx].shift().message; + hasValue = nextItem[mode] !== ""; + } + }); + if (hasValue) { + var elem = next.getElement(); + var selector = elem && SRUtil_1.SRUtil.getUniqueSelector(elem); + if (selector && doc.querySelector(selector)) { + nextItem.selector = selector; + } + retVal.push(nextItem); + } + }; + while (details.some(function (detail) { return detail.length > 0; })) { + _loop_3(); + } + return retVal; + }; + return SRController; +}()); +exports.SRController = SRController; + + +/***/ }, + +/***/ "./src/v4/simulator/SRCursor.ts" +/*!**************************************!*\ + !*** ./src/v4/simulator/SRCursor.ts ***! + \**************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SRCursor = void 0; +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var SRUtil_1 = __webpack_require__(/*! ./SRUtil */ "./src/v4/simulator/SRUtil.ts"); +/** + * SRCursor (Screen Reader Cursor) class + * + * This class provides a cursor-like interface for navigating the DOM in a way that + * simulates how screen readers process and navigate content. It tracks: + * - The current node position + * - Whether it's at a start or end tag + * - The ARIA role of the current node + * - The accessible name of the current node + */ +var SRCursor = /** @class */ (function () { + /** + * Creates a new SRCursor positioned at the specified element + * @param element - The DOM node to position the cursor at + * @param bEnd - Whether to position at the end tag (true) or start tag (false) + */ + function SRCursor(element, bEnd) { + // Use DOMWalker with considerHidden=false to process all content (including hidden elements) + // This is important for screen reader simulation which needs to see all content + this.walker = new DOMWalker_1.DOMWalker(element, bEnd, undefined, false); + if (element) { + this.refreshName(); + } + } + /** + * Creates a copy of this cursor at the same position + * @returns A new SRCursor instance with the same position and properties + */ + SRCursor.prototype.clone = function () { + var retVal = new SRCursor(this.walker.node, this.walker.bEndTag); + retVal.role = this.role; + retVal.name = this.name; + return retVal; + }; + /** + * Updates the role and accessible name properties based on the current node + * This is called whenever the cursor position changes + * @private + */ + SRCursor.prototype.refreshName = function () { + if (this.walker.node.nodeType === 1) { + // Element node + this.role = AriaUtil_1.AriaUtil.getResolvedRole(this.walker.node, true); + this.name = AccNameUtil_1.AccNameUtil.computeAccessibleName(this.walker.node); + } + else if (this.walker.node.nodeType === 3) { + // Text node + this.role = "text"; + this.name = { name: this.walker.node.textContent, nameFrom: "text" }; + } + else { + // Other node types + this.role = undefined; + this.name = undefined; + } + }; + /** + * Moves the cursor to the next node that matches the provided criteria + * @param matchingFunc - Function that determines if a node matches the search criteria + * @returns true if a matching node was found, false otherwise + */ + SRCursor.prototype.next = function (matchingFunc, skipFunc) { + var _a; + var DEBUG = false; + // const DEBUG = false; + var foundNext = false; + // Get the skip info for the current spot + this.refreshName(); + DEBUG && console.group("next function"); + DEBUG && console.log(this.isEndTag() ? "/" : "", this.getNode()); + var _b = (skipFunc && skipFunc(this)) || { skipCurrent: false, skipChildren: false }, skipCurrent = _b.skipCurrent, skipChildren = _b.skipChildren; + DEBUG && console.log("skipCurrent:", skipCurrent, "skipChildren:", skipChildren); + do { + // Move as appropriate from the current spot + if (skipChildren && !this.walker.bEndTag) { + this.walker.bEndTag = true; + } + else if (!this.walker.nextNode()) { + break; + } + // Update the skip info for the new spot + this.refreshName(); + DEBUG && console.log(this.isEndTag() ? "/" : "", this.getNode()); + (_a = (skipFunc && skipFunc(this)) || { skipCurrent: false, skipChildren: false }, skipCurrent = _a.skipCurrent, skipChildren = _a.skipChildren); + DEBUG && console.log("skipCurrent:", skipCurrent, "skipChildren:", skipChildren); + // Update role based on node type + if (this.walker.node.nodeType === 1) { + this.role = AriaUtil_1.AriaUtil.getResolvedRole(this.walker.node, true); + } + else if (this.walker.node.nodeType === 3) { + this.role = "text"; + } + if (SRUtil_1.SRUtil.isModalDialogElement(this.getNode()) && this.isEndTag()) { + break; + } + if (!skipCurrent) { + // Check if this node matches our criteria + foundNext = matchingFunc(this.role, !this.walker.bEndTag, this.walker.node); + } + } while (!foundNext); + DEBUG && console.log("foundNext:", foundNext, this.isEndTag() ? "/" : "", this.getNode()); + DEBUG && console.groupEnd(); + if (foundNext) { + this.refreshName(); + } + else { + // Reset properties if no match was found + this.role = undefined; + this.name = undefined; + } + return foundNext; + }; + /** + * Moves the cursor to the previous node that matches the provided criteria + * @param matchingFunc - Function that determines if a node matches the search criteria + * @returns true if a matching node was found, false otherwise + */ + SRCursor.prototype.previous = function (matchingFunc, skipFunc) { + var _a; + var DEBUG = false; + var foundPrevious = false; + // Get the skip info for the current spot + this.refreshName(); + DEBUG && console.group("previous function"); + DEBUG && console.log(this.isEndTag(), this.getNode()); + var _b = (skipFunc && skipFunc(this)) || { skipCurrent: false, skipChildren: false }, skipCurrent = _b.skipCurrent, skipChildren = _b.skipChildren; + DEBUG && console.log(skipCurrent, skipChildren); + do { + // Move as appropriate from the current spot + if (skipChildren && this.walker.bEndTag) { + DEBUG && console.log("Skipping node"); + this.walker.bEndTag = false; + } + else if (!this.walker.prevNode()) { + break; + } + // Update the skip info for the new spot + this.refreshName(); + DEBUG && console.log(this.isEndTag(), this.getNode()); + (_a = (skipFunc && skipFunc(this)) || { skipCurrent: false, skipChildren: false }, skipCurrent = _a.skipCurrent, skipChildren = _a.skipChildren); + DEBUG && console.log(skipCurrent, skipChildren); + // Update role based on node type + if (this.walker.node.nodeType === 1) { + this.role = AriaUtil_1.AriaUtil.getResolvedRole(this.walker.node, true); + } + else if (this.walker.node.nodeType === 3) { + this.role = "text"; + } + if (SRUtil_1.SRUtil.isModalDialogElement(this.getNode()) && !this.isEndTag()) { + break; + } + if (!skipCurrent) { + // Check if this node matches our criteria + foundPrevious = matchingFunc(this.role, !this.walker.bEndTag, this.walker.node); + } + } while (!foundPrevious); + DEBUG && console.log(this.isEndTag(), this.getNode()); + DEBUG && console.groupEnd(); + if (foundPrevious) { + this.refreshName(); + } + else { + // Reset properties if no match was found + this.role = undefined; + this.name = undefined; + } + return foundPrevious; + }; + /** + * Moves the cursor to the parent node of the current node + * @param endTag - Whether to position at the end tag (true) or start tag (false) + * @returns true if successfully moved to parent, false if no parent exists + */ + SRCursor.prototype.parent = function (endTag) { + if (!this.walker.node.parentNode) + return false; + this.walker.node = this.walker.node.parentNode; + this.walker.bEndTag = endTag === true; + if (this.walker.node.nodeType === 1) { + this.role = AriaUtil_1.AriaUtil.getResolvedRole(this.walker.node, true); + this.name = AccNameUtil_1.AccNameUtil.computeAccessibleName(this.walker.node); + } + else if (this.walker.node.nodeType === 3) { + this.role = "text"; + this.name = { name: this.walker.node.textContent, nameFrom: "text" }; + } + else { + this.role = undefined; + this.name = undefined; + } + return true; + }; + /** + * Moves the cursor up the DOM tree until finding a node with a matching role or element name + * @param roles - Array of ARIA roles to match + * @param elems - Optional array of element names to match + * @returns true if a matching node was found, false otherwise + */ + SRCursor.prototype.getCurrentOrParentByRole = function (roles, elems) { + var _this = this; + var uppElems = elems ? elems.map(function (elem) { return elem.toUpperCase(); }) : []; + var matches = function (walker) { + var elem = walker.getElement(); + return roles.includes(_this.getRole()) + || (elem && !elem.hasAttribute("role") && uppElems.includes(elem.nodeName.toUpperCase())); + }; + while (!matches(this) && this.parent()) + ; + return matches(this); + }; + /** + * Creates a new cursor and moves it up the DOM tree until finding a node with a matching role or element name + * @param roles - Array of ARIA roles to match + * @param elems - Optional array of element names to match + * @returns A new cursor at the matching node, or null if no match found + */ + SRCursor.prototype.getCurrentOrParentByRoleClone = function (roles, elems) { + var retVal = this.clone(); + if (retVal.getCurrentOrParentByRole(roles, elems)) { + return retVal; + } + return null; + }; + SRCursor.prototype.getCurrentOrParentTabbableClone = function () { + var retVal = this.clone(); + while (retVal) { + var elem = retVal.getElement(); + if (retVal.isStartTag() && elem && CommonUtil_1.CommonUtil.isTabbable(elem)) { + return retVal; + } + if (!retVal.parent(false)) { + break; + } + } + return null; + }; + /** + * Gets the ARIA role of the current node + * @returns The ARIA role as a string, or undefined if not available + */ + SRCursor.prototype.getRole = function () { + return this.role; + }; + /** + * Gets the accessible name info for the current node + * @returns The AccessibleNameResult object, or undefined if not available + */ + SRCursor.prototype.getNameInfo = function () { + return this.name; + }; + /** + * Get the accessible name of the current node + */ + SRCursor.prototype.getName = function () { + // Handle one-off quirks in the name calculation + var nameInfo = this.getNameInfo(); + if (nameInfo && nameInfo.name) { + return nameInfo.name; + } + var elem = this.getElement(); + if (elem) { + var labelElem = CommonUtil_1.CommonUtil.getLabelForElementHidden(elem, true); + if (labelElem) { + return labelElem.innerText || labelElem.textContent; + } + } + }; + /** + * Sets whether the cursor is at an end tag or start tag + * @param val - True for end tag, false for start tag + */ + SRCursor.prototype.setEndTag = function (val) { + this.walker.bEndTag = val; + }; + /** + * Gets the DOM node at the current cursor position + * @returns The current DOM node + */ + SRCursor.prototype.getNode = function () { + return this.walker.node; + }; + /** + * Gets the current node as an HTMLElement if it is an element node + * @returns The current node as HTMLElement, or undefined if not an element + */ + SRCursor.prototype.getElement = function () { + if (!this.walker.node) + return undefined; + if (this.walker.node.nodeType !== 1) + return undefined; + return this.walker.node; + }; + SRCursor.prototype.getParentElement = function () { + if (!this.walker.node) + return null; + var retVal = this.clone(); + retVal.walker.node = DOMWalker_1.DOMWalker.parentElement(retVal.walker.node); + return retVal; + }; + /** + * Checks if the cursor is positioned at an end tag + * @returns true if at an end tag, false if at a start tag + */ + SRCursor.prototype.isEndTag = function () { + return this.walker.bEndTag; + }; + /** + * Checks if the cursor is positioned at an end tag + * @returns true if at an end tag, false if at a start tag + */ + SRCursor.prototype.isStartTag = function () { + return !this.walker.bEndTag; + }; + /** + * Compares the document position of two cursors + * @param one - First cursor to compare + * @param two - Second cursor to compare + * @returns 0 if equal, -1 if one is before two, 1 if one is after two + */ + SRCursor.compare = function (one, two) { + var _a, _b; + var nodeOne = (_a = one === null || one === void 0 ? void 0 : one.walker) === null || _a === void 0 ? void 0 : _a.node; + var nodeTwo = (_b = two === null || two === void 0 ? void 0 : two.walker) === null || _b === void 0 ? void 0 : _b.node; + if (!nodeOne && !nodeTwo) + return 0; + if (!nodeOne) + return 1; + if (!nodeTwo) + return -1; + var docPosition = nodeOne.compareDocumentPosition(nodeTwo); + // Handle disconnected nodes (different documents or shadow DOMs) + if (docPosition & 0x1) { + // Nodes are disconnected - they're in different trees (iframe or shadow DOM) + // Build ancestor chains using DOMWalker.parentNode (handles shadow DOM & iframes) + var ancestorsOne = [nodeOne]; + var ancestorsTwo = [nodeTwo]; + var current = nodeOne; + while (current = DOMWalker_1.DOMWalker.parentNode(current)) { + ancestorsOne.push(current); + } + current = nodeTwo; + while (current = DOMWalker_1.DOMWalker.parentNode(current)) { + ancestorsTwo.push(current); + } + // Reverse so root is first + ancestorsOne.reverse(); + ancestorsTwo.reverse(); + // Find where the paths diverge + var commonDepth = 0; + while (commonDepth < ancestorsOne.length && + commonDepth < ancestorsTwo.length && + ancestorsOne[commonDepth] === ancestorsTwo[commonDepth]) { + commonDepth++; + } + // If one path is a prefix of the other, handle containment + if (commonDepth === ancestorsOne.length) { + // nodeOne is an ancestor of nodeTwo + return one.walker.bEndTag ? 1 : -1; + } + if (commonDepth === ancestorsTwo.length) { + // nodeTwo is an ancestor of nodeOne + return two.walker.bEndTag ? -1 : 1; + } + // Compare the nodes where paths diverge + if (commonDepth > 0) { + var childOne = ancestorsOne[commonDepth]; + var childTwo = ancestorsTwo[commonDepth]; + var childPosition = childOne.compareDocumentPosition(childTwo); + if (childPosition & 0x2) + return 1; // childTwo precedes childOne + if (childPosition & 0x4) + return -1; // childOne precedes childTwo + } + // No common ancestor found - shouldn't happen in a well-formed document + return 0; + } + if (docPosition & 0x8) { + // one is contained within two + // if two is an end tag, one is before, otherwise, one is after + return two.walker.bEndTag ? -1 : 1; + } + else if (docPosition & 0x10) { + // two is contained within one + // if one is an end tag, one is after, otherwise, one is before + return one.walker.bEndTag ? 1 : -1; + } + else if (docPosition & 0x2) { + // two precedes one in the document + return 1; + } + else if (docPosition & 0x4) { + // one precedes two in the document + return -1; + } + return 0; + }; + /** + * Checks if this cursor's node contains another cursor's node + * @param other - The other cursor to check + * @returns true if this cursor contains (is a parent/ancestor of) the other cursor's node + */ + SRCursor.prototype.contains = function (other) { + return this.getNode().contains(other.getNode()) + && !this.isSameNode(other); + }; + /** + * Checks if this cursor points to the same node as another cursor + * @param other - The other cursor to compare with + * @returns true if both cursors point to the same node + */ + SRCursor.prototype.isSameNode = function (other) { + if (!other) + return false; + return this.getNode().isSameNode(other.getNode()); + }; + /** + * Checks if the current node has a non-empty accessible name + * @returns true if the node has a non-empty accessible name + */ + SRCursor.prototype.hasNonEmptyName = function () { + var _a; + return (((_a = this.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) || "").trim().length > 0; + }; + return SRCursor; +}()); +exports.SRCursor = SRCursor; + + +/***/ }, + +/***/ "./src/v4/simulator/SRNavigator.ts" +/*!*****************************************!*\ + !*** ./src/v4/simulator/SRNavigator.ts ***! + \*****************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SRNavigator = void 0; +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var SRCursor_1 = __webpack_require__(/*! ./SRCursor */ "./src/v4/simulator/SRCursor.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var SRNavigator; +(function (SRNavigator) { + /** + * Determine if a node is a block-level element based on its display property + * @param node The DOM node to check + * @returns true if the node is a block-level element, false otherwise + */ + function isBlockElement(node) { + var _a; + if (node.nodeType !== 1) + return false; + if (node.nodeName.toLowerCase() === "br") + return true; + var elem = node; + var mywin = elem.ownerDocument.defaultView; + var disp = (_a = mywin.getComputedStyle(elem)) === null || _a === void 0 ? void 0 : _a.display; + if (disp && disp.startsWith("table")) + return true; + if (disp === "block" && elem.style.display !== "block") { + // Is this block because it's a flex elem? + if (elem.parentElement && mywin.getComputedStyle(elem.parentElement).display === "flex") { + return false; + } + } + if (AriaUtil_1.AriaUtil.getResolvedRole(elem, true) === "link") { + var temp = new DOMWalker_1.DOMWalker(node, false, undefined, false); + temp.prevNode(); + if (!isBlockElement(temp.node)) { + return true; + } + } + return ["block", "flex", "grid", "list-item"].includes(disp); + } + function getExplicitTabindex(node) { + if (!node || node.nodeType !== 1) + return null; + var elem = node; + if (!elem.hasAttribute("tabindex")) + return null; + var tabindexValue = parseInt(elem.getAttribute("tabindex"), 10); + return Number.isNaN(tabindexValue) ? null : tabindexValue; + } + function isPositiveTabFocus(node) { + if (!node || node.nodeType !== 1) + return false; + var elem = node; + var explicitTabindex = getExplicitTabindex(elem); + return explicitTabindex !== null && explicitTabindex > 0 && CommonUtil_1.CommonUtil.isTabbable(elem); + } + function isDefaultOrZeroTabFocus(node) { + if (!node || node.nodeType !== 1) + return false; + var elem = node; + var explicitTabindex = getExplicitTabindex(elem); + return (explicitTabindex === null || explicitTabindex === 0) && CommonUtil_1.CommonUtil.isTabbable(elem); + } + function getTabFocusStartFunc(includePositiveTabindex) { + if (includePositiveTabindex === void 0) { includePositiveTabindex = true; } + return function (_role, bStartTag, node) { + if (!(node && node.nodeType === 1 && bStartTag && CommonUtil_1.CommonUtil.isTabbable(node))) + return false; + return includePositiveTabindex || isDefaultOrZeroTabFocus(node); + }; + } + /** + * Collect all tabbable elements in tab order (positive tabindex first, then document order) + * @param matchFunc Function to match tabbable elements + * @param rootNode Optional root node to start collection from (defaults to document body) + * @returns Array of cursors pointing to tabbable elements in tab order + */ + function collectTabFocusCursors(matchFunc, rootNode) { + var root = ((rootNode === null || rootNode === void 0 ? void 0 : rootNode.ownerDocument) || document).body || rootNode; + if (!root) + return []; + var walker = new SRCursor_1.SRCursor(root, false); + var skipFunc = getSkipFunc("tab_focus"); + var positiveResults = []; + var normalResults = []; + var addCursor = function (cursor) { + if (!matchFunc(cursor.getRole(), !cursor.isEndTag(), cursor.getNode())) + return; + if (isPositiveTabFocus(cursor.getNode())) { + positiveResults.push(cursor.clone()); + } + else if (isDefaultOrZeroTabFocus(cursor.getNode())) { + normalResults.push(cursor.clone()); + } + }; + addCursor(walker); + while (walker.next(function () { return true; }, skipFunc)) { + addCursor(walker); + } + positiveResults.sort(function (a, b) { + var aElem = a.getElement(); + var bElem = b.getElement(); + var aTabindex = getExplicitTabindex(aElem) || 0; + var bTabindex = getExplicitTabindex(bElem) || 0; + if (aTabindex !== bTabindex) + return bTabindex - aTabindex; + return SRCursor_1.SRCursor.compare(a, b); + }); + return positiveResults.concat(normalResults); + } + /** + * Find the index of a cursor in an array of tab focus cursors + * @param cursors Array of cursors to search + * @param walker The cursor to find + * @returns The index of the cursor, or -1 if not found + */ + function findTabFocusIndex(cursors, walker) { + return cursors.findIndex(function (cursor) { return SRCursor_1.SRCursor.compare(cursor, walker) === 0; }); + } + /** + * Get the match function for identifying start positions in a given navigation mode + * @param mode The navigation mode (e.g., "link", "heading", "button", etc.) + * @returns A function that matches elements appropriate for the navigation mode + */ + function getStartFunc(mode) { + switch (mode) { + case "link": + return function (role, bStartTag) { return (bStartTag && role === "link"); }; + case "tab_focus": + return getTabFocusStartFunc(false); + case "heading": + return function (role, bStartTag) { return (bStartTag && role === "heading"); }; + case "h1": + return function (role, bStartTag, node) { return (bStartTag && role === "heading" && node.ariaLevel === "1"); }; + case "h2": + return function (role, bStartTag, node) { return (bStartTag && role === "heading" && node.ariaLevel === "2"); }; + case "h3": + return function (role, bStartTag, node) { return (bStartTag && role === "heading" && node.ariaLevel === "3"); }; + case "h4": + return function (role, bStartTag, node) { return (bStartTag && role === "heading" && node.ariaLevel === "4"); }; + case "h5": + return function (role, bStartTag, node) { return (bStartTag && role === "heading" && node.ariaLevel === "5"); }; + case "h6": + return function (role, bStartTag, node) { return (bStartTag && role === "heading" && node.ariaLevel === "6"); }; + case "image": + return function (role, bStartTag) { return (bStartTag && ["img", "graphics-document"].includes(role)); }; + case "radio": + return function (role, bStartTag) { return (bStartTag && role === "radio"); }; + case "button": + return function (role, bStartTag) { return (bStartTag && role === "button"); }; + case "checkbox": + return function (role, bStartTag) { return (bStartTag && role === "checkbox"); }; + case "combo": + return function (role, bStartTag) { return (bStartTag && role === "combobox"); }; + case "list": + return function (role, bStartTag) { return (bStartTag && role === "list"); }; + case "listitem": + return function (role, bStartTag) { return (bStartTag && role === "listitem"); }; + case "article": + return function (role, bStartTag) { return (bStartTag && role === "article"); }; + case "table": + return function (role, bStartTag) { return (bStartTag && role === "table"); }; + case "paragraph": + return function (_role, bStartTag, node) { return (bStartTag && node.nodeName.toUpperCase() === "P"); }; + case "dom": + return function () { return true; }; + case "item": + return function (_role, bStartTag, node) { + if (!bStartTag) + return false; + if (isBlockElement(node)) + return true; + var temp = new DOMWalker_1.DOMWalker(node, !bStartTag); + if (temp.prevNode() && temp.bEndTag) { + return isBlockElement(temp.node); + } + return false; + }; + case "region": + return function (role, bStartTag, node) { + var _a, _b; + if (!bStartTag) + return false; + if (["main", "navigation", "form", "banner", "search", "contentinfo"].includes(role)) + return true; + if (role !== "region" || (node === null || node === void 0 ? void 0 : node.nodeType) !== 1) + return false; + return !!((_b = (_a = AccNameUtil_1.AccNameUtil.computeAccessibleName(node)) === null || _a === void 0 ? void 0 : _a.name) === null || _b === void 0 ? void 0 : _b.trim()); + }; + case "formcontrol": + case "editbox": + case "graphic": + case "frame": + case "division": + case "tabcontrol": + case "separator": + case "clickable": + case "mouseover": + throw new Error("NOT_IMPLEMENTED"); + } + } + SRNavigator.getStartFunc = getStartFunc; + /** + * Check if an element is within a Shadow DOM + * @param element The element to check + * @returns true if the element is in a Shadow DOM, false otherwise + */ + var isInShadowDOM = function (element) { + var root = element.getRootNode(); + return root instanceof ShadowRoot; + }; + /** + * Determine skip behavior for item navigation mode + * Handles complex visibility rules including hidden content in headings/links + * @param cursor The cursor at the current position + * @returns Object indicating whether to skip current node and/or its children, or null for default behavior + */ + var SKIP_ITEM_BEHAVIOR = function (cursor) { + var DEBUG = false; + DEBUG && console.group("SKIP_ITEM_BEHAVIOR"); + var retVal = null; + try { + var nodeType = cursor.getNode().nodeType; + var elem = cursor.getElement(); + var cursorStart = cursor.clone(); + cursorStart.setEndTag(false); + DEBUG && console.log(nodeType); + // Skip CDATA and comments completely + if ([4, 8].includes(nodeType)) + return retVal = { skipCurrent: true, skipChildren: true }; + // Only process elements and text + if (![1, 3].includes(nodeType)) + return retVal = { skipCurrent: true, skipChildren: false }; + // For text elements, Consider with relation to their parent element + if (nodeType === 3) { + elem = cursor.getNode().parentElement; + if (!elem) + return retVal = VisUtil_1.VisUtil.isNodeHiddenFromAT(elem) ? { skipCurrent: true, skipChildren: false } : null; + } + // if (!elem) console.log(cursor.getNode()); + // We have an element + // Make sure we're within the body element + if (!elem.closest("body") && !isInShadowDOM(elem)) + return retVal = { skipCurrent: true, skipChildren: false }; + // Make sure we're not in a script or style + if (elem.closest("script,style")) + return retVal = { skipCurrent: true, skipChildren: true }; + // For text nodes, we need to check visibility in context of parent heading/link + // So we'll handle text node visibility checks below with the element visibility checks + // Skip things hidden from the AT, UNLESS we're inside a heading or link + // (headings and links should include their full accessible name, including hidden parts) + // BUT only if the heading/link uses nameFrom="content" (not aria-label/aria-labelledby) + var parentHeadingOrLink = cursorStart.getCurrentOrParentByRoleClone(["heading", "link"]); + // Special case: if current element itself is a heading or link AND we're NOT inside another heading/link, + // apply normal skip rules + var currentRole = AriaUtil_1.AriaUtil.getResolvedRole(elem); + var isCurrentHeadingOrLink = currentRole === "heading" || currentRole === "link"; + if (!parentHeadingOrLink) { + // Not inside any heading/link - apply normal skip rules + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(elem)) + return retVal = { skipCurrent: true, skipChildren: nodeType === 1 }; + if (!VisUtil_1.VisUtil.isNodeVisible(elem)) + return retVal = { skipCurrent: true, skipChildren: nodeType === 1 }; + } + else { + // Check if the parent heading/link uses aria-label or aria-labelledby + var parentElem = parentHeadingOrLink.getElement(); + var nameInfo = parentHeadingOrLink.getNameInfo(); + // If nameFrom is NOT "content" or "text", skip all content (it's using aria-label/aria-labelledby) + if (nameInfo && !["content", "text"].includes(nameInfo.nameFrom)) { + // Parent uses aria-label/aria-labelledby - skip all content including nested headings/links + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(elem)) + return retVal = { skipCurrent: true, skipChildren: true }; + if (!VisUtil_1.VisUtil.isNodeVisible(elem)) + return retVal = { skipCurrent: true, skipChildren: true }; + } + else if (isCurrentHeadingOrLink) { + // Current element is a heading/link inside another heading/link with content-based name + // Don't skip it - let it through so its content can be read + // (The logic at line 183 will handle whether to skip its children) + } + else { + // nameFrom is "content", so include hidden content but skip hidden images/graphics + var role_1 = AriaUtil_1.AriaUtil.getResolvedRole(elem); + if ((role_1 === "img" || role_1 === "graphics-document") && VisUtil_1.VisUtil.isNodeHiddenFromAT(elem)) { + return retVal = { skipCurrent: true, skipChildren: true }; + } + // Don't skip other hidden content - it should be included in the accessible name + } + } + if (elem.nodeName.toUpperCase() === "BODY") + return retVal = { skipCurrent: false, skipChildren: false }; + // Skip labels that are associated with controls - they'll be read with the related input. + // Keep children so interactive content (e.g. links) inside the label still appears in + // reading/tab order. + if (elem.nodeName.toUpperCase() === "LABEL") { + if (elem.hasAttribute("for") + && document.getElementById(elem.getAttribute("for")) + && document.getElementById(elem.getAttribute("for")).getAttribute("type") !== "hidden") { + return retVal = { skipCurrent: true, skipChildren: false }; + } + else { + var nestedControl = elem.querySelector("input, select, textarea, button, [role='checkbox'], [role='combobox'], [role='listbox'], [role='menuitemcheckbox'], [role='menuitemradio'], [role='radio'], [role='searchbox'], [role='slider'], [role='spinbutton'], [role='switch'], [role='textbox']"); + if (nestedControl && nestedControl.getAttribute("type") !== "hidden") { + return retVal = { skipCurrent: true, skipChildren: false }; + } + } + } + // Skip non-interactive content that is a descendant of a for-linked label. + // Such content is already surfaced as part of the associated control's announcement. + // Interactive descendants (links, buttons, etc.) are allowed through. + { + var labelFor = elem.closest("label[for]"); + var labelForTarget = labelFor && labelFor.getAttribute("for"); + if (labelFor + && labelForTarget + && document.getElementById(labelForTarget) + && document.getElementById(labelForTarget).getAttribute("type") !== "hidden" + && !elem.closest("a[href], [role='link'], button, [role='button']")) { + return retVal = { skipCurrent: true, skipChildren: nodeType === 1 }; + } + } + var role = cursorStart.getRole(); + // If we have presentational children, read the element, skip the children + if (AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(elem)) { + return retVal = { skipCurrent: false, skipChildren: true }; + } + // Skip children of headings/links that don't use content-based names + // UNLESS we're inside another heading/link that DOES use content-based names + if (["link", "heading"].includes(role) && (!cursorStart.getName() || (!["content", "text"].includes(cursorStart.getNameInfo().nameFrom)))) { + // Check if we're inside a parent heading/link with content-based name + if (parentHeadingOrLink && parentHeadingOrLink.getNameInfo() && ["content", "text"].includes(parentHeadingOrLink.getNameInfo().nameFrom)) { + // Don't skip children - we're nested inside a content-based heading/link + } + else { + return retVal = { skipCurrent: false, skipChildren: true }; + } + } + if (elem.nodeName.toUpperCase() === "LEGEND") { + var parent_1 = DOMWalker_1.DOMWalker.parentElement(cursor.getNode()); + while (parent_1) { + if (parent_1.nodeName.toUpperCase() === 'FIELDSET') { + // Legend is within a fieldset, suppress output + return retVal = { skipCurrent: false, skipChildren: true }; + } + parent_1 = DOMWalker_1.DOMWalker.parentElement(parent_1); + } + } + if (elem && elem.nodeName.toUpperCase() === "MSUP") { + return retVal = { skipCurrent: false, skipChildren: true }; + } + if (elem.closest(".ibma-sr-overlay")) { + return retVal = { skipCurrent: true, skipChildren: true }; + } + return retVal = null; + } + finally { + DEBUG && console.log("SKIP_ITEM retVal:", retVal); + DEBUG && console.groupEnd(); + } + }; + /** + * Determine skip behavior for nested navigation modes (link, heading, image, etc.) + * Simpler than SKIP_ITEM_BEHAVIOR as it doesn't need complex heading/link content rules + * @param cursor The cursor at the current position + * @returns Object indicating whether to skip current node and/or its children, or null for default behavior + */ + var SKIP_NESTED_BEHAVIOR = function (cursor) { + var nodeType = cursor.getNode().nodeType; + var elem = cursor.getElement(); + // Only visit elements and text nodes + if (nodeType !== 1 && nodeType !== 3) + return { skipCurrent: true, skipChildren: false }; + if (nodeType === 3) + return VisUtil_1.VisUtil.isNodeHiddenFromAT(elem) ? { skipCurrent: true, skipChildren: false } : null; + // We have an elemenet + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(elem)) + return { skipCurrent: true, skipChildren: true }; + // Skip label fors - they'll be read with the related input. + // Keep children so interactive content (e.g. links) inside the label still appears in + // reading/tab order. + if (elem.nodeName.toUpperCase() === "LABEL" + && elem.hasAttribute("for") + && document.getElementById(elem.getAttribute("for")) + && document.getElementById(elem.getAttribute("for")).getAttribute("type") !== "hidden") { + return { skipCurrent: true, skipChildren: false }; + } + // Skip non-interactive content that is a descendant of a for-linked label. + // Such content is already surfaced as part of the associated control's announcement. + // Interactive descendants (links, buttons, etc.) are allowed through. + { + var labelFor = elem.closest("label[for]"); + var labelForTarget = labelFor && labelFor.getAttribute("for"); + if (labelFor + && labelForTarget + && document.getElementById(labelForTarget) + && document.getElementById(labelForTarget).getAttribute("type") !== "hidden" + && !elem.closest("a[href], [role='link'], button, [role='button']")) { + return { skipCurrent: true, skipChildren: nodeType === 1 }; + } + } + var role = cursor.getRole(); + // If we have presentational children, read the element, skip the children + if (AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(elem)) { + return { skipCurrent: false, skipChildren: true }; + } + if (elem && elem.nodeName.toUpperCase() === "MSUP") { + return { skipCurrent: true, skipChildren: true }; + } + if (elem.closest(".ibma-sr-overlay")) { + return { skipCurrent: true, skipChildren: true }; + } + return null; + }; + /** + * Get the skip function for a given navigation mode + * @param mode The navigation mode + * @returns A function that determines which nodes to skip during navigation + */ + function getSkipFunc(mode) { + switch (mode) { + case "region": + case "item": + return SKIP_ITEM_BEHAVIOR; + case "link": + case "tab_focus": + case "heading": + case "h1": + case "h2": + case "h3": + case "h4": + case "h5": + case "h6": + case "image": + return SKIP_NESTED_BEHAVIOR; + case "radio": + case "button": + case "checkbox": + case "combo": + case "list": + case "listitem": + case "article": + case "table": + case "paragraph": + case "dom": + case "formcontrol": + case "editbox": + case "graphic": + case "frame": + case "division": + case "tabcontrol": + case "separator": + case "clickable": + case "mouseover": + throw new Error("NOT_IMPLEMENTED"); + } + } + SRNavigator.getSkipFunc = getSkipFunc; + /** + * Jump to the current position or the previous matching element if current doesn't match + * @param mode The navigation mode + * @param walker The cursor at the current position + * @returns A cursor at the current or previous matching position + */ + function jumpCurrent(mode, walker) { + var matchFunc = mode === "tab_focus" ? getTabFocusStartFunc(true) : getStartFunc(mode); + if (matchFunc(walker.getRole(), !walker.isEndTag(), walker.getNode())) { + return walker.clone(); + } + else { + return jumpPrevious(mode, walker); + } + } + SRNavigator.jumpCurrent = jumpCurrent; + /** + * Jump to the end of the current element and return all intermediate item positions + * @param mode The navigation mode + * @param walker The cursor at the current position + * @returns Array of cursors representing positions from current to end + */ + function jumpCurrentEnd(mode, walker) { + if (mode === "item") { + var itemEnd = jumpNext(mode, walker); + return itemEnd ? [itemEnd] : []; + } + else { + var nameInfo = walker.getNameInfo(); + var retVal = walker.clone(); + if (nameInfo && !["content", "text"].includes(nameInfo.nameFrom)) { + // Name is just from the item itself + retVal.next(function () { return true; }); + } + else { + // Name is from the content + retVal.setEndTag(true); + retVal.next(function () { return true; }); + } + var endCursors = []; + var itemEnd = jumpNext("item", walker); + while (itemEnd && SRCursor_1.SRCursor.compare(itemEnd, retVal) < 0) { + endCursors.push(itemEnd); + itemEnd = jumpNext("item", itemEnd); + } + endCursors.push(retVal); + return mode === "tab_focus" && walker.getRole() === "link" ? [endCursors[endCursors.length - 1]] : endCursors; + } + } + SRNavigator.jumpCurrentEnd = jumpCurrentEnd; + /** + * Jump to the next matching element in the given navigation mode + * @param mode The navigation mode + * @param walker The cursor at the current position + * @returns A cursor at the next matching position, or null if none found + */ + function jumpNext(mode, walker) { + var DEBUG = false; + DEBUG && console.group("SRNavigator::jumpNext", walker.isEndTag() ? "/" : "", walker.getNode()); + try { + if (mode === "tab_focus") { + var tabFocusMatchFunc = getTabFocusStartFunc(true); + var tabFocusCursors = collectTabFocusCursors(tabFocusMatchFunc, walker.getNode()); + if (tabFocusCursors.length > 0) { + // console.log(tabFocusCursors.map(c => c.getNode())); + var currentTabFocusParentCursor = walker.getCurrentOrParentTabbableClone(); + var currentTabFocusCursor = currentTabFocusParentCursor && findTabFocusIndex(tabFocusCursors, currentTabFocusParentCursor) >= 0 ? currentTabFocusParentCursor : walker.clone(); + var currentIndex = findTabFocusIndex(tabFocusCursors, currentTabFocusCursor); + if (currentIndex >= 0) { + if (currentIndex + 1 < tabFocusCursors.length) { + return tabFocusCursors[currentIndex + 1].clone(); + } + return null; + } + return tabFocusCursors[0].clone(); + } + } + var retVal = walker.clone(); + var matchFunc = getStartFunc(mode); + var skipFunc = getSkipFunc(mode); + if (retVal.next(matchFunc, skipFunc)) { + DEBUG && console.log("SRNavigator::jumpNext result", retVal); + return retVal; + } + else { + return null; + } + } + finally { + console.groupEnd(); + } + } + SRNavigator.jumpNext = jumpNext; + /** + * Navigates to the previous element in screen reader navigation based on the specified mode. + * + * For tab_focus mode, this function attempts to move to the previous tabbable element by: + * 1. First trying to move backward using the mode's match and skip functions + * 2. If that fails, collecting all tab focus cursors and finding the previous one in the tab order + * + * @param mode - The navigation mode (e.g., "tab_focus") that determines how to navigate + * @param walker - The current cursor position in the screen reader navigation + * @returns A new cursor positioned at the previous element, or null if no previous element exists + */ + function jumpPrevious(mode, walker) { + if (mode === "tab_focus") { + var retVal_1 = walker.clone(); + var matchFunc_1 = getStartFunc(mode); + var skipFunc_1 = getSkipFunc(mode); + if (retVal_1.previous(matchFunc_1, skipFunc_1)) { + return retVal_1; + } + var tabFocusMatchFunc = getTabFocusStartFunc(true); + var tabFocusCursors = collectTabFocusCursors(tabFocusMatchFunc, walker.getNode()); + if (tabFocusCursors.length > 0) { + var currentTabFocusParentCursor = walker.getCurrentOrParentTabbableClone(); + var currentTabFocusCursor = currentTabFocusParentCursor && findTabFocusIndex(tabFocusCursors, currentTabFocusParentCursor) >= 0 ? currentTabFocusParentCursor : walker.clone(); + var currentIndex = findTabFocusIndex(tabFocusCursors, currentTabFocusCursor); + if (currentIndex > 0) { + return tabFocusCursors[currentIndex - 1].clone(); + } + } + return null; + } + var retVal = walker.clone(); + var matchFunc = getStartFunc(mode); + var skipFunc = getSkipFunc(mode); + if (retVal.previous(matchFunc, skipFunc)) { + return retVal; + } + else { + return null; + } + } + SRNavigator.jumpPrevious = jumpPrevious; +})(SRNavigator = exports.SRNavigator || (exports.SRNavigator = {})); + + +/***/ }, + +/***/ "./src/v4/simulator/SRRenderer.ts" +/*!****************************************!*\ + !*** ./src/v4/simulator/SRRenderer.ts ***! + \****************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SRRenderer = void 0; +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var SRNavigator_1 = __webpack_require__(/*! ./SRNavigator */ "./src/v4/simulator/SRNavigator.ts"); +var SRCursor_1 = __webpack_require__(/*! ./SRCursor */ "./src/v4/simulator/SRCursor.ts"); +var render_rules_1 = __webpack_require__(/*! ./render_rules */ "./src/v4/simulator/render_rules/index.ts"); +var common_1 = __webpack_require__(/*! ./render_rules/common */ "./src/v4/simulator/render_rules/common.ts"); +/** + * SRRenderer namespace provides functionality for simulating how screen readers + * announce content to users. It contains rules for rendering different types of + * elements and ARIA roles in various navigation modes. + * + * The renderer uses a rule-based system to determine what text should be announced + * when navigating to, within, or away from elements based on their roles and properties. + */ +var SRRenderer; +(function (SRRenderer) { + /** + * Generates the announcement text when entering an element + * + * This function looks up the appropriate rule based on the element's role or tag name + * and applies it to generate the announcement text. + * + * @param mode - The current navigation mode + * @param walker - Cursor at the current position + * @param oldWalker - Optional cursor at the previous position + * @returns Announcement text for entering the element, or null if no rule applies + */ + function renderEnter(mode, walker, oldWalker) { + var DEBUG = false; + for (var _i = 0, CONTAINER_ENTER_RULES_1 = render_rules_1.CONTAINER_ENTER_RULES; _i < CONTAINER_ENTER_RULES_1.length; _i++) { + var rule = CONTAINER_ENTER_RULES_1[_i]; + var s = rule.test(mode, walker, oldWalker); + DEBUG && console.log(mode, walker, rule, s); + if (typeof s !== "undefined" && s !== null) { + return s; + } + } + return null; + } + SRRenderer.renderEnter = renderEnter; + /** + * Generates the announcement text when leaving an element + * + * Similar to renderEnter, but applies rules for leaving elements instead. + * + * @param mode - The current navigation mode + * @param walker - Cursor at the current position + * @param oldWalker - Optional cursor at the previous position + * @returns Announcement text for leaving the element, or null if no rule applies + */ + function renderLeave(mode, walker, oldWalker) { + for (var _i = 0, CONTAINER_EXIT_RULES_1 = render_rules_1.CONTAINER_EXIT_RULES; _i < CONTAINER_EXIT_RULES_1.length; _i++) { + var rule = CONTAINER_EXIT_RULES_1[_i]; + var s = rule.test(mode, walker, oldWalker); + if (typeof s !== "undefined" && s !== null) { + return s; + } + } + return null; + } + SRRenderer.renderLeave = renderLeave; + /** + * Renders the current element and any container changes + * + * This function combines announcements for: + * - Containers being left + * - Containers being entered + * - The current element itself + * + * @param mode - The current navigation mode + * @param walker - Cursor at the current position + * @param containerChanges - Information about containers being entered or left + * @returns Combined announcement text + */ + function renderCurrent(mode, walker, containerChanges) { + var DEBUG = false; //mode === "tab_focus" && document.getElementById("fixture")?.getAttribute("class") === "tomtest"; + var startOfRender = SRNavigator_1.SRNavigator.jumpCurrent(mode, walker); + if (!startOfRender) + return null; + var endOfRenders = SRNavigator_1.SRNavigator.jumpCurrentEnd(mode, startOfRender); + if (!endOfRenders || endOfRenders.length === 0) { + endOfRenders = [null]; + } + DEBUG && console.log("AAAA", startOfRender.isStartTag(), startOfRender.getNode()); + DEBUG && console.log("BBBB", endOfRenders.map(function (val) { return val && val.isStartTag(); }), endOfRenders.map(function (val) { return val && val.getNode(); })); + var endOfRender = endOfRenders[endOfRenders.length - 1]; + var renderStr = ""; + for (var _i = 0, endOfRenders_1 = endOfRenders; _i < endOfRenders_1.length; _i++) { + var candidateEnd = endOfRenders_1[_i]; + var candidateRenderStr = SRRenderer.renderRange(mode, startOfRender, candidateEnd); + if (candidateRenderStr.trim().length > 0) { + endOfRender = candidateEnd; + renderStr = candidateRenderStr; + break; + } + } + if (renderStr === "") { + renderStr = SRRenderer.renderRange(mode, startOfRender, endOfRender); + } + DEBUG && console.log("CCCC", renderStr); + return { + start: startOfRender, + end: endOfRender, + message: (containerChanges.leaving || []).concat(containerChanges.entering || []).concat([renderStr]).join(" ").replace(/\s+/g, " ") + }; + } + SRRenderer.renderCurrent = renderCurrent; + /** + * Renders a range of elements between two cursors + * + * This function traverses the DOM from startOfRender to endOfRender, + * applying rendering rules to each element and combining the results. + * + * @param mode - The current navigation mode + * @param startOfRender - Cursor at the start of the range + * @param endOfRender - Cursor at the end of the range + * @returns Combined announcement text for the entire range + */ + function renderRange(mode, startOfRender, endOfRender) { + var _a; + var iterWalker = startOfRender.clone(); + var elemStrs = []; + var bContinue = true; + var currentLink = null; + while (bContinue) { + var elem = iterWalker.getElement(); + var node = iterWalker.getNode(); + var nodeType = node.nodeType; + var renderStrs = []; + var linkParent = AriaUtil_1.AriaUtil.getAncestorWithRole(node, "link", true); + if (linkParent && !["content", "text"].includes((_a = new SRCursor_1.SRCursor(linkParent).getNameInfo()) === null || _a === void 0 ? void 0 : _a.nameFrom)) { + // We don't consider links that announce themselves + linkParent = null; + } + for (var _i = 0, SR_RULES_1 = render_rules_1.SR_RULES; _i < SR_RULES_1.length; _i++) { + var rule = SR_RULES_1[_i]; + var s = rule.test(mode, iterWalker); + if (typeof s !== "undefined" && s !== null && s.trim().length > 0) { + if (nodeType === 1 && !iterWalker.isEndTag() && elem.getAttribute("aria-haspopup") === "menu") { + s = "[subMenu] " + s; + } + // Handle links + if (mode === "tab_focus") { + // We're in link mode + if (currentLink && (!linkParent || (linkParent && currentLink !== linkParent))) { + // We've added a string within a link (currentLink), but now we've left the link or moved to a new link + s = "".concat(s, " ").concat((0, common_1.getLinkAnnouncement)(new SRCursor_1.SRCursor(currentLink, false))); + } + } + else { + if (linkParent && (!currentLink || (currentLink !== linkParent))) { + // We're in a link, and we haven't announced this link, or we've moved to a new link + s = "".concat((0, common_1.getLinkAnnouncement)(new SRCursor_1.SRCursor(linkParent, false)), " ").concat(s); + } + } + if (s !== "") { + currentLink = linkParent; + elemStrs.push(s); + } + break; + } + } + elemStrs.push(renderStrs.filter(function (s) { return s.trim().length > 0; }).join(" ")); + bContinue = iterWalker.next(function () { return true; }, SRNavigator_1.SRNavigator.getSkipFunc(mode)) && SRCursor_1.SRCursor.compare(iterWalker, endOfRender) < 0; + } + if (mode === "tab_focus" && currentLink) { + elemStrs.push("".concat((0, common_1.getLinkAnnouncement)(new SRCursor_1.SRCursor(currentLink, false)))); + } + var retVal = elemStrs.filter(function (s) { return s.trim().length > 0; }).join(" "); + retVal = retVal.replace(/, \u0001([^\u0002]+)\u0002/g, function (match, describedByText) { + var quotedText = "\"".concat(describedByText, "\""); + var unmarkedRetVal = retVal.replace(match, ""); + return unmarkedRetVal.includes(quotedText) || unmarkedRetVal.includes(describedByText) ? "" : ", ".concat(quotedText); + }); + retVal = retVal.replace(/[\u0001\u0002]/g, ""); + return retVal; + } + SRRenderer.renderRange = renderRange; +})(SRRenderer = exports.SRRenderer || (exports.SRRenderer = {})); + + +/***/ }, + +/***/ "./src/v4/simulator/SRRendererRule.ts" +/*!********************************************!*\ + !*** ./src/v4/simulator/SRRendererRule.ts ***! + \********************************************/ +(__unused_webpack_module, exports) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SRRendererRule = void 0; +var SRRendererRule = /** @class */ (function () { + function SRRendererRule(ruleDefinition) { + this.ruleDefinition = ruleDefinition; + } + SRRendererRule.prototype.test = function (mode, cursor, oldCursor) { + if (this.ruleDefinition.modes.includes(mode) + && (this.ruleDefinition.roles.includes(cursor.getRole()) + || this.ruleDefinition.elems.includes(cursor.getNode().nodeName.toUpperCase()))) { + for (var _i = 0, _a = this.ruleDefinition.tests; _i < _a.length; _i++) { + var test_1 = _a[_i]; + var s = test_1(cursor, oldCursor, mode); + if (typeof s === "string") + return s; + } + } + return null; + }; + return SRRendererRule; +}()); +exports.SRRendererRule = SRRendererRule; + + +/***/ }, + +/***/ "./src/v4/simulator/SRTableUtil.ts" +/*!*****************************************!*\ + !*** ./src/v4/simulator/SRTableUtil.ts ***! + \*****************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SRTableUtil = void 0; +var SRCursor_1 = __webpack_require__(/*! ./SRCursor */ "./src/v4/simulator/SRCursor.ts"); +/** + * TableUtil namespace provides utility functions for handling HTML tables in the accessibility simulator. + * These functions help determine cell positions, relationships, and extract header information + * to simulate how screen readers would announce table navigation. + */ +var SRTableUtil; +(function (SRTableUtil) { + /** + * Determines if the cursor is pointing to a cell element (TD or TH) + * or has a cell-related ARIA role + * @param cursor - The SRCursor to check + * @returns true if the cursor is on a cell, false otherwise + */ + function isCursorCellRole(cursor) { + if (!cursor.getElement()) + return false; + if (["cell", "rowheader", "columnheader"].includes(cursor.getRole())) { + return true; + } + return !cursor.getElement().hasAttribute("role") && ["TH", "TD"].includes(cursor.getElement().nodeName.toUpperCase()); + } + SRTableUtil.isCursorCellRole = isCursorCellRole; + /** + * Gets a cursor pointing to the current cell or the parent cell if the cursor + * is inside a cell's content + * @param cursor - The SRCursor to check + * @returns A new SRCursor pointing to the cell or null if not in a cell + */ + function getCurrentOrParentCellCursor(cursor) { + return cursor.getCurrentOrParentByRoleClone(["cell", "rowheader", "columnheader"], ["TD", "TH"]); + } + SRTableUtil.getCurrentOrParentCellCursor = getCurrentOrParentCellCursor; + /** + * Get the colspan of a cell at a given location + * @param cursor The cursor to get the colspan from + * @returns The colspan of the cell at the cursor's location or 0 if not in a column + */ + function getColSpan(cursor) { + if (!isCursorCellRole(cursor)) + return 0; + var colSpan = cursor.getElement().getAttribute("colspan"); + if (colSpan) { + return parseInt(colSpan); + } + return 1; + } + SRTableUtil.getColSpan = getColSpan; + /** + * Get the rowspan of a cell at a given location + * @param cursor The cursor to get the rowspan from + * @returns The rowspan of the cell at the cursor's location or 0 if not in a column + */ + function getRowSpan(cursor) { + if (!isCursorCellRole(cursor)) + return 0; + var rowSpan = cursor.getElement().getAttribute("rowspan"); + if (rowSpan) { + return parseInt(rowSpan); + } + return 1; + } + SRTableUtil.getRowSpan = getRowSpan; + /** + * Builds a complete model of a table's structure, accounting for rowspan and colspan + * + * This function traverses the entire table and creates a data structure that represents + * the logical grid of cells, properly handling cells that span multiple rows or columns. + * The resulting model makes it easier to determine cell relationships and positions. + * + * @param inTableCursor - A cursor within the table + * @returns A TableModel representing the complete table structure, or null if not in a table + */ + function getTableModel(inTableCursor) { + // Get a cursor pointing to the table element + var tableCursor = inTableCursor.getCurrentOrParentByRoleClone(["table"]); + if (!tableCursor) + return null; + var walkTableCursor = tableCursor.clone(); + var retVal = []; // The complete table model we're building + var curRow = []; // The current row being processed + var prevRow; // The previous row (needed for rowspan handling) + // Walk through the table's DOM structure + while (walkTableCursor.next(function () { return true; }) && !walkTableCursor.getNode().isSameNode(tableCursor.getNode())) { + if (walkTableCursor.isEndTag() && walkTableCursor.getRole() === "row") { + // Reached the end of the row, push what we have and reset + retVal.push(curRow); + prevRow = curRow; + curRow = []; + // Handle cells with rowspan from previous rows that affect this row + // This ensures cells spanning multiple rows are properly represented in the model + while (prevRow && curRow.length < prevRow.length && + ((prevRow[curRow.length].rowIndexStart + prevRow[curRow.length].rowspan - 1) >= retVal.length)) { + curRow.push(prevRow[curRow.length]); + } + } + // Process each cell in the row + if (!walkTableCursor.isEndTag() && isCursorCellRole(walkTableCursor)) { + var colspan = getColSpan(walkTableCursor); + // Create a cell model with position and spanning information + var cellInfo = { + rowIndexStart: retVal.length, + colIndexStart: curRow.length, + rowspan: getRowSpan(walkTableCursor), + colspan: colspan, + cellCursor: walkTableCursor.clone() + }; + // For cells with colspan, add the same cell info to multiple columns + for (var idx = 0; idx < colspan; ++idx) { + curRow.push(cellInfo); + } + // Continue handling cells with rowspan from previous rows + while (prevRow && curRow.length < prevRow.length && + ((prevRow[curRow.length].rowIndexStart + prevRow[curRow.length].rowspan - 1) >= retVal.length)) { + curRow.push(prevRow[curRow.length]); + } + } + } + return retVal; + } + SRTableUtil.getTableModel = getTableModel; + /** + * Gets the cell model for a specific cell in the table + * + * This function finds the CellModel object that represents a specific cell, + * which contains information about its position and spanning. + * + * @param inCellCursor - A cursor pointing to a cell or its contents + * @param tableModel - Optional pre-built table model (will be created if not provided) + * @returns The CellModel for the specified cell, or null if not found + */ + function getCellModel(inCellCursor, tableModel) { + var cellCursor = getCurrentOrParentCellCursor(inCellCursor); + if (!tableModel) { + tableModel = getTableModel(inCellCursor); + } + // Search through the table model to find the matching cell + for (var rowIndex = 0; rowIndex < tableModel.length; ++rowIndex) { + for (var colIndex = 0; colIndex < tableModel[rowIndex].length; ++colIndex) { + if (tableModel[rowIndex][colIndex].cellCursor.isSameNode(cellCursor)) { + return tableModel[rowIndex][colIndex]; + } + } + } + return null; + } + SRTableUtil.getCellModel = getCellModel; + /** + * Checks if a cell spans a specific column + * + * @param cellModel - The cell model to check + * @param colIdx - The column index to check + * @returns True if the cell contains the specified column + */ + function cellModelContainsColumn(cellModel, colIdx) { + return colIdx >= cellModel.colIndexStart && colIdx < cellModel.colIndexStart + cellModel.colspan; + } + SRTableUtil.cellModelContainsColumn = cellModelContainsColumn; + /** + * Checks if a cell spans a specific row + * + * @param cellModel - The cell model to check + * @param rowIdx - The row index to check + * @returns True if the cell contains the specified row + */ + function cellModelContainsRow(cellModel, rowIdx) { + return rowIdx >= cellModel.rowIndexStart && rowIdx < cellModel.rowIndexStart + cellModel.rowspan; + } + SRTableUtil.cellModelContainsRow = cellModelContainsRow; + /** + * Gets the row headers associated with a cell + * First checks for explicit headers attribute, then looks for row headers in the same row + * @param cursor - The SRCursor pointing to a cell + * @returns A string containing the concatenated header names + */ + function getRowHeaders(cursor) { + return ""; + } + SRTableUtil.getRowHeaders = getRowHeaders; + /** + * Gets the column headers associated with a cell + * First checks for explicit headers attribute, then looks for column headers in the same column + * @param cursor - The SRCursor pointing to a cell + * @returns A string containing the concatenated header names + */ + function getColumnHeadersForCursor(inCellCursor, tableModel) { + if (!tableModel) { + tableModel = getTableModel(inCellCursor); + if (!tableModel) + return ""; + } + var cellModel = getCellModel(inCellCursor, tableModel); + if (!cellModel) + return ""; + var cellCursor = cellModel.cellCursor; + if (!cellCursor) + return ""; + var cellElem = cellCursor.getElement(); + if (!cellElem) + return ""; + var colDatas = []; + for (var colIdx = cellModel.colIndexStart; colIdx < cellModel.colIndexStart + cellModel.colspan; ++colIdx) { + colDatas.push({ + potentialColHeaders: [], + existsDataCell: false, + colIdx: colIdx + }); + } + var potentialHeaders = []; + if (cellElem.hasAttribute("headers")) { + potentialHeaders = cellElem.getAttribute("headers") + // Split the header attribute into ids + .split(" ") + // Get the node for each id + .map(function (id) { return document.getElementById(id); }) + // Get rid of bad mappings + .filter(function (node) { return !!node; }) + // Convert to SRCursors to that we can get accessible names + .map(function (node) { return new SRCursor_1.SRCursor(node); }) + // Remove headers that aren't in the same column (ignore column headers) + .filter(function (cursor) { return colDatas.some(function (colData) { return cellModelContainsColumn(SRTableUtil.getCellModel(cursor, tableModel), colData.colIdx); }); }); + } + else { + // Get all cells in this column + // Note - if everything in this column is empty or a header cell, this is probably not a heading + for (var rowIdx = 0; rowIdx < tableModel.length; ++rowIdx) { + var _loop_1 = function (colData) { + var colIdx = colData.colIdx; + var checkInfo = tableModel[rowIdx][colIdx]; + var checkCursor = checkInfo.cellCursor; + var checkCursorElem = checkCursor.getElement(); + // If this row/col isn't found, or is the same cursor as our original cell model, or already in our list, skip, but check if it's a data cell + if (!checkInfo || !checkCursor || checkCursor.isSameNode(cellCursor) || potentialHeaders.some(function (c) { return checkCursor.isSameNode(c); })) { + colData.existsDataCell = colData.existsDataCell || (isDataCell(checkCursor) && (checkCursor.hasNonEmptyName() || colData.potentialColHeaders.length > 0)); + return "continue"; + } + var c = checkCursor.clone(); + if (checkCursor.getRole() === "columnheader") { + potentialHeaders.push(c); + colData.potentialColHeaders.push(c); + } + else if (!checkCursorElem.hasAttribute("role") && checkCursorElem.nodeName.toUpperCase() === "TH") { + if (checkCursorElem.getAttribute("scope") === "col" || checkCursorElem.getAttribute("scope") === "axis") { + potentialHeaders.push(c); + colData.potentialColHeaders.push(c); + } + else if (!checkCursorElem.hasAttribute("scope") && checkCursor.hasNonEmptyName()) { + potentialHeaders.push(c); + colData.potentialColHeaders.push(c); + } + } + else { + colData.existsDataCell = colData.existsDataCell || (isDataCell(checkCursor) && (checkCursor.hasNonEmptyName() || colData.potentialColHeaders.length > 0)); + } + }; + for (var _i = 0, colDatas_1 = colDatas; _i < colDatas_1.length; _i++) { + var colData = colDatas_1[_i]; + _loop_1(colData); + } + } + for (var _a = 0, colDatas_2 = colDatas; _a < colDatas_2.length; _a++) { + var colData = colDatas_2[_a]; + if (!colData.existsDataCell) { + colData.potentialColHeaders = []; + } + } + potentialHeaders = potentialHeaders.filter(function (one) { return colDatas.some(function (colData) { return colData.potentialColHeaders.some(function (two) { return two.isSameNode(one); }); }); }); + } + return potentialHeaders + // And then return the names of the headers + .map(function (cursor) { var _a; return ((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) || ""; }) + .map(function (s) { return s.trim(); }) + .filter(function (s) { return s.length > 0; }) + .join(", "); + } + SRTableUtil.getColumnHeadersForCursor = getColumnHeadersForCursor; + /** + * Gets the row headers associated with a cell + * First checks for explicit headers attribute, then looks for row headers in the same row + * @param cursor - The SRCursor pointing to a cell + * @returns A string containing the concatenated header names + */ + function getRowHeadersForCursor(inCellCursor, tableModel) { + if (!tableModel) { + tableModel = getTableModel(inCellCursor); + if (!tableModel) + return ""; + } + var cellModel = getCellModel(inCellCursor, tableModel); + if (!cellModel) + return ""; + var cellCursor = cellModel.cellCursor; + if (!cellCursor) + return ""; + var cellElem = cellCursor.getElement(); + if (!cellElem) + return ""; + var rowDatas = []; + for (var rowIdx = cellModel.rowIndexStart; rowIdx < cellModel.rowIndexStart + cellModel.rowspan; ++rowIdx) { + rowDatas.push({ + potentialRowHeaders: [], + existsDataCell: false, + rowIdx: rowIdx + }); + } + var potentialHeaders = []; + if (cellElem.hasAttribute("headers")) { + potentialHeaders = cellElem.getAttribute("headers") + // Split the header attribute into ids + .split(" ") + // Get the node for each id + .map(function (id) { return document.getElementById(id); }) + // Get rid of bad mappings + .filter(function (node) { return !!node; }) + // Convert to SRCursors to that we can get accessible names + .map(function (node) { return new SRCursor_1.SRCursor(node); }) + // Remove headers that aren't in the same row (ignore column headers) + .filter(function (cursor) { return rowDatas.some(function (rowData) { return cellModelContainsRow(SRTableUtil.getCellModel(cursor, tableModel), rowData.rowIdx); }); }); + } + else { + // Get all cells in the rows + // Note - if everything in the row is empty or a header cell, this is probably not a heading + var longestRow = rowDatas.reduce(function (prev, cur) { return Math.max(prev, tableModel[cur.rowIdx].length); }, 0); + for (var colIdx = 0; colIdx < longestRow; ++colIdx) { + var _loop_2 = function (rowData) { + var rowIdx = rowData.rowIdx; + if (colIdx >= tableModel[rowIdx].length) + return "continue"; + var checkInfo = tableModel[rowIdx][colIdx]; + var checkCursor = checkInfo.cellCursor; + var checkCursorElem = checkCursor.getElement(); + // If this row/col isn't found, or is the same cursor as our original cell model, or already in our list, skip, but check if it's a data cell + if (!checkInfo || !checkCursor || checkCursor.isSameNode(cellCursor) || potentialHeaders.some(function (c) { return checkCursor.isSameNode(c); })) { + rowData.existsDataCell = rowData.existsDataCell || (isDataCell(checkCursor) && (checkCursor.hasNonEmptyName() || rowData.potentialRowHeaders.length > 0)); + return "continue"; + } + var c = checkCursor.clone(); + if (checkCursor.getRole() === "rowheader") { + potentialHeaders.push(c); + rowData.potentialRowHeaders.push(c); + } + else if (!checkCursorElem.hasAttribute("role") && checkCursorElem.nodeName.toUpperCase() === "TH") { + if (checkCursorElem.getAttribute("scope") === "row" || checkCursorElem.getAttribute("scope") === "axis") { + potentialHeaders.push(c); + rowData.potentialRowHeaders.push(c); + } + else if (!checkCursorElem.hasAttribute("scope") && checkCursor.hasNonEmptyName()) { + potentialHeaders.push(c); + rowData.potentialRowHeaders.push(c); + } + } + else { + rowData.existsDataCell = rowData.existsDataCell || (isDataCell(checkCursor) && (checkCursor.hasNonEmptyName() || rowData.potentialRowHeaders.length > 0)); + } + }; + for (var _i = 0, rowDatas_1 = rowDatas; _i < rowDatas_1.length; _i++) { + var rowData = rowDatas_1[_i]; + _loop_2(rowData); + } + } + for (var _a = 0, rowDatas_2 = rowDatas; _a < rowDatas_2.length; _a++) { + var rowData = rowDatas_2[_a]; + if (!rowData.existsDataCell) { + rowData.potentialRowHeaders = []; + } + } + potentialHeaders = potentialHeaders.filter(function (one) { return rowDatas.some(function (rowData) { return rowData.potentialRowHeaders.some(function (two) { return two.isSameNode(one); }); }); }); + } + return potentialHeaders + // And then return the names of the headers + .map(function (cursor) { var _a; return ((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) || ""; }) + .map(function (s) { return s.trim(); }) + .filter(function (s) { return s.length > 0; }) + .join(", "); + } + SRTableUtil.getRowHeadersForCursor = getRowHeadersForCursor; + /** + * Determines if a cell is a data cell (not a header cell) + * + * A data cell is one with either: + * - An explicit ARIA role of "cell" + * - A TD element without an overriding role attribute + * + * @param checkCursor - The cursor to check + * @returns True if the cursor points to a data cell + */ + function isDataCell(checkCursor) { + var checkCursorElem = checkCursor.getElement(); + if (!checkCursorElem) + return false; + return checkCursor.getRole() === "cell" || (!checkCursorElem.hasAttribute("role") && checkCursorElem.nodeName.toUpperCase() === "TD"); + } + SRTableUtil.isDataCell = isDataCell; +})(SRTableUtil = exports.SRTableUtil || (exports.SRTableUtil = {})); + + +/***/ }, + +/***/ "./src/v4/simulator/SRUtil.ts" +/*!************************************!*\ + !*** ./src/v4/simulator/SRUtil.ts ***! + \************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SRUtil = void 0; +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var SRUtil; +(function (SRUtil) { + function isModalDialogElement(node) { + if (node.nodeType !== 1) + return false; + var elem = node; + var role = AriaUtil_1.AriaUtil.getResolvedRole(elem, true); + return role === "dialog" && elem.getAttribute("aria-modal") === "true" && VisUtil_1.VisUtil.isNodeVisible(node); + } + SRUtil.isModalDialogElement = isModalDialogElement; + /** + * Generates a unique CSS selector for a specific HTML element + * The selector is built using a combination of: + * 1. Element tag name + * 2. ID (if available) + * 3. Classes (if available) + * 4. Attributes (if needed) + * 5. nth-child selectors for position in parent + * + * @param element The HTML element to generate a selector for + * @param optimized If true, creates a shorter but possibly less robust selector + * @return A CSS selector string that uniquely identifies the element + */ + function getUniqueSelector(element, optimized) { + if (optimized === void 0) { optimized = false; } + // If the element has an ID, that's the most direct way to select it + if (element.id) { + return "#".concat(CSS.escape(element.id)); + } + // If we're at the root or document element, return the tag name + if (element.isSameNode(document.documentElement) || element.isSameNode(document.body)) { + return element.tagName.toLowerCase(); + } + // Start building the selector with the tag name + var selector = element.tagName.toLowerCase(); + // Add classes if available and we're not optimizing for brevity + if (element.classList.length && !optimized) { + // Take up to 3 classes to avoid overly specific selectors + var classes = Array.from(element.classList).slice(0, 3); + selector += classes.map(function (cls) { return ".".concat(CSS.escape(cls)); }).join(''); + } + // Add distinguishing attributes if needed and not optimizing + if (!optimized) { + // Consider adding role, aria-label, or other distinctive attributes + if (element.hasAttribute('role')) { + selector += "[role=\"".concat(CSS.escape(element.getAttribute('role') || ''), "\"]"); + } + if (element.hasAttribute('aria-label')) { + var label = element.getAttribute('aria-label') || ''; + if (label.length <= 20) { // Avoid overly long selectors + selector += "[aria-label=\"".concat(CSS.escape(label), "\"]"); + } + } + // For inputs, add type attribute + if (element.tagName.toLowerCase() === 'input' && element.hasAttribute('type')) { + selector += "[type=\"".concat(CSS.escape(element.getAttribute('type') || ''), "\"]"); + } + } + // If we have a parent node, determine position among siblings + if (element.parentElement) { + // Find all siblings with the same tag + var siblings = Array.from(element.parentElement.children) + .filter(function (child) { return child.tagName === element.tagName; }); + // If there's more than one sibling with the same tag, add nth-child + if (siblings.length > 1) { + var index = siblings.indexOf(element) + 1; + selector += ":nth-of-type(".concat(index, ")"); + } + // If we're not at the root, recursively build the parent selector + // but use optimized selectors for ancestors to keep the overall selector manageable + return "".concat(getUniqueSelector(element.parentElement, true), " > ").concat(selector); + } + return selector; + } + SRUtil.getUniqueSelector = getUniqueSelector; +})(SRUtil = exports.SRUtil || (exports.SRUtil = {})); + + +/***/ }, + +/***/ "./src/v4/simulator/SRViewer.ts" +/*!**************************************!*\ + !*** ./src/v4/simulator/SRViewer.ts ***! + \**************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SRViewer = exports.SROverlay = void 0; +var SRController_1 = __webpack_require__(/*! ./SRController */ "./src/v4/simulator/SRController.ts"); +/** + * SROverlay class for creating a UI widget to control screen reader simulation + * Provides buttons for navigation and displays results + */ +var SROverlay = /** @class */ (function () { + /** + * Creates a new SROverlay + * @param controller The SRController instance to use for navigation + */ + function SROverlay(srViewer) { + this.srViewer = srViewer; + /** Navigation modes available in the UI */ + this.navigationModes = [ + { mode: "item", label: "Item" }, + { mode: "tab_focus", label: "Tabbable" }, + { mode: "heading", label: "Heading" }, + { mode: "region", label: "Region" } + ]; + this.createOverlay(); + } + SROverlay.prototype.createDOMElement = function (elemName, attrs, styles) { + var retVal = this.srViewer.viewerDoc.createElement(elemName); + if (attrs) { + for (var key in attrs) { + retVal[key] = attrs[key]; + } + } + if (styles) { + for (var key in styles) { + retVal.style[key] = styles[key]; + } + } + return retVal; + }; + /** + * Creates the overlay UI elements and adds them to the DOM + */ + SROverlay.prototype.createOverlay = function () { + var _this = this; + // Create main container + this.container = this.createDOMElement("div", { + className: "ibma-sr-overlay" + }, { + position: 'fixed', + bottom: '0', + left: '0', + width: '100%', + backgroundColor: 'rgba(0, 0, 0, 0.8)', + color: 'white', + padding: '10px', + zIndex: '10000', + display: 'flex', + flexDirection: 'column', + gap: '10px' + }); + // Create controls container + var controlsContainer = this.createDOMElement("div", {}, { + display: "flex", flexWrap: "wrap", gap: "10px" + }); + // Create navigation mode groups + this.navigationModes.forEach(function (navMode) { + var modeGroup = _this.createDOMElement('div', {}, { + display: "flex", + alignItems: 'center', + gap: '5px', + margin: '0 10px' + }); + modeGroup.appendChild(_this.createDOMElement('span', { + textContent: navMode.label + ":" + }, {})); + // Previous button + var prevButton = _this.createDOMElement('button', { + textContent: '◀ Prev' + }, { + padding: '5px 10px', + backgroundColor: '#444', + color: 'white', + border: 'none', + borderRadius: '3px', + cursor: 'pointer' + }); + prevButton.addEventListener('click', function () { return _this.srViewer.navigatePrevious(navMode.mode); }); + modeGroup.appendChild(prevButton); + // Next button + var nextButton = _this.createDOMElement('button', { + textContent: 'Next ▶' + }, { + padding: '5px 10px', + backgroundColor: '#444', + color: 'white', + border: 'none', + borderRadius: '3px', + cursor: 'pointer' + }); + nextButton.addEventListener('click', function () { return _this.srViewer.navigateNext(navMode.mode); }); + modeGroup.appendChild(nextButton); + controlsContainer.appendChild(modeGroup); + }); + var otherButtonGroup = this.createDOMElement('div', {}, { + display: "flex", + alignItems: 'center', + gap: '5px', + margin: '0 10px' + }); + // Show all button + var showAllButton = this.createDOMElement('button', { + textContent: 'Show all' + }, { + padding: '5px 10px', + backgroundColor: '#444', + color: 'white', + border: 'none', + borderRadius: '3px', + cursor: 'pointer' + }); + showAllButton.addEventListener('click', function () { return _this.srViewer.showAll(true); }); + otherButtonGroup.appendChild(showAllButton); + // Toggle Speech Button + var toggleSpeech = this.createDOMElement('button', { + textContent: 'Toggle speech' + }, { + padding: '5px 10px', + backgroundColor: '#444', + color: 'white', + border: 'none', + borderRadius: '3px', + cursor: 'pointer' + }); + toggleSpeech.addEventListener('click', function () { return _this.srViewer.toggleSpeech(); }); + otherButtonGroup.appendChild(toggleSpeech); + controlsContainer.appendChild(otherButtonGroup); + // Create results display + this.resultsDisplay = this.createDOMElement('div', { + textContent: 'Screen reader simulation results will appear here.' + }, { + padding: '10px', + backgroundColor: 'rgba(255, 255, 255, 0.1)', + borderRadius: '3px', + minHeight: '100px', + maxHeight: '50vh', + fontFamily: 'monospace', + overflow: 'auto' + }); + // Add elements to container + this.container.appendChild(controlsContainer); + this.container.appendChild(this.resultsDisplay); + // Add to document + this.srViewer.viewerDoc.body.appendChild(this.container); + }; + /** + * Display the navigation result in the overlay + * @param result The navigation result + * @param mode The navigation mode used + * @param direction The navigation direction ('next', 'previous', or 'focus') + */ + SROverlay.prototype.displayResult = function (result, mode, direction) { + var _a, _b, _c, _d; + var displayText = ''; + if (result.success) { + // console.log("???", result); + displayText = "".concat(direction.toUpperCase(), " ").concat(mode, ": ").concat(result.renderingResult.message); + } + else { + displayText = "".concat(direction.toUpperCase(), " ").concat(mode, ": ").concat(result.renderingResult.message); + } + (_b = (_a = result.renderingResult.end) === null || _a === void 0 ? void 0 : _a.getElement()) === null || _b === void 0 ? void 0 : _b.scrollIntoView(); + (_d = (_c = result.renderingResult.start) === null || _c === void 0 ? void 0 : _c.getElement()) === null || _d === void 0 ? void 0 : _d.scrollIntoView(); + window.scrollBy(0, -200); + this.resultsDisplay.innerHTML = ""; + this.resultsDisplay.textContent = displayText; + var inspectButton = this.createDOMElement("button", { + innerText: "Debug" + }, {}); + inspectButton.addEventListener("click", function () { + var _a, _b; + console.log((_a = result.renderingResult.start) === null || _a === void 0 ? void 0 : _a.getNode(), (_b = result.renderingResult.end) === null || _b === void 0 ? void 0 : _b.getNode()); + }); + this.resultsDisplay.appendChild(inspectButton); + }; + SROverlay.prototype.displayAll = function (result) { + var _this = this; + var table = this.createDOMElement("table", {}, {}); + var headerRow = this.createDOMElement("tr", {}, {}); + var headingLabels = ["Region", "Heading", "Item", "Tabbable"]; + var headingFields = ["region", "heading", "item", "tab_focus"]; + for (var _i = 0, headingLabels_1 = headingLabels; _i < headingLabels_1.length; _i++) { + var headingLabel = headingLabels_1[_i]; + headerRow.appendChild(this.createDOMElement("th", { + scope: "col", + innerText: headingLabel + }, { + textAlign: "left", + padding: ".25rem", + margin: "0rem", + color: "white" + })); + table.appendChild(headerRow); + } + var _loop_1 = function (line) { + var dataRow = this_1.createDOMElement("tr", {}, {}); + headingFields.forEach(function (field) { + dataRow.appendChild(_this.createDOMElement("td", { + innerText: line[field] + }, { + verticalAlign: "top", + border: "solid white 1px", + padding: ".25rem", + margin: "0rem", + color: "white" + })); + }); + table.appendChild(dataRow); + }; + var this_1 = this; + for (var _a = 0, result_1 = result; _a < result_1.length; _a++) { + var line = result_1[_a]; + _loop_1(line); + } + this.resultsDisplay.innerHTML = ""; + this.resultsDisplay.appendChild(table); + }; + /** + * Remove the overlay from the DOM + */ + SROverlay.prototype.destroy = function () { + if (this.container && this.container.parentNode) { + this.container.parentNode.removeChild(this.container); + } + }; + return SROverlay; +}()); +exports.SROverlay = SROverlay; +/** + * SRViewer class for managing screen reader simulation with UI controls + */ +var SRViewer = /** @class */ (function () { + /** + * Creates a new SRViewer + * @param rootElement The root element to start from (defaults to document.body) + */ + function SRViewer(rootElement) { + if (rootElement === void 0) { rootElement = document.body; } + /** Flag to track if speech is active */ + this.isStreaming = false; + /** Flag to set if showing all */ + this.isShowingAll = false; + /** Flag to set if it should be speaking */ + this.speechEnabled = false; + this.viewerDoc = rootElement.ownerDocument; + // Create controller for the document body + this.controller = SRController_1.SRController.getController(this.viewerDoc); + // Create overlay UI + this.overlay = new SROverlay(this); + // Set up keyboard handlers + this.setupKeyboardHandlers(); + // Set up focus tracking + this.setupFocusTracking(); + // Set up mutation tracking + this.setupMutationTracking(); + } + SRViewer.prototype.showAll = function (bEnableAllMode) { + if (bEnableAllMode) { + this.isShowingAll = true; + } + var result = SRController_1.SRController.renderStructure(this.viewerDoc); + this.overlay.displayAll(result); + }; + SRViewer.prototype.toggleSpeech = function () { + this.speechEnabled = !this.speechEnabled; + }; + /** + * Navigate to the next element using the specified mode + * @param mode The navigation mode to use + */ + SRViewer.prototype.navigateNext = function (mode) { + this.isShowingAll = false; + var result = this.controller.jumpNext(mode); + this.overlay.displayResult(result, mode, 'next'); + this.speakResult(result); + }; + /** + * Navigate to the previous element using the specified mode + * @param mode The navigation mode to use + */ + SRViewer.prototype.navigatePrevious = function (mode) { + this.isShowingAll = false; + var result = this.controller.jumpPrevious(mode); + this.overlay.displayResult(result, mode, 'previous'); + this.speakResult(result); + }; + /** + * Set up keyboard event handlers for screen reader navigation + */ + SRViewer.prototype.setupKeyboardHandlers = function () { + var _this = this; + this.keyboardHandler = function (e) { + // Don't capture keyboard events when focus is in form controls + var target = e.target; + if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.tagName === 'SELECT') { + return; + } + // Handle keyboard shortcuts + if (e.ctrlKey) { + // Ctrl key stops speech + _this.stopSpeech(); + return; + } + if (e.altKey || e.metaKey) + return; + // console.log(e.key); + switch (e.key) { + case 'ArrowUp': + e.preventDefault(); + _this.navigatePrevious('item'); + break; + case ' ': + _this.isStreaming = true; + case 'ArrowDown': + e.preventDefault(); + _this.navigateNext('item'); + break; + case 'Enter': + e.preventDefault(); + _this.activateCurrentElement(); + _this.controller.setPointOfRegard(_this.viewerDoc.activeElement); + break; + case 'H': + case 'h': + if (e.shiftKey) { + e.preventDefault(); + _this.navigatePrevious('heading'); + } + else { + e.preventDefault(); + _this.navigateNext('heading'); + } + break; + case 'R': + case 'r': + if (e.shiftKey) { + e.preventDefault(); + _this.navigatePrevious('region'); + } + else { + e.preventDefault(); + _this.navigateNext('region'); + } + break; + case 'Tab': + if (e.shiftKey) { + e.preventDefault(); + _this.navigatePrevious('tab_focus'); + } + else { + e.preventDefault(); + _this.navigateNext('tab_focus'); + } + break; + } + }; + // Add the event listener + this.viewerDoc.addEventListener('keydown', this.keyboardHandler); + }; + SRViewer.prototype.speakResult = function (result) { + var _this = this; + if (!this.speechEnabled) + return; + var utterance = new SpeechSynthesisUtterance(result.renderingResult.message); + utterance.rate = 1.5; + var myThis = this; + utterance.addEventListener("end", function (event) { + if (myThis.isStreaming) { + _this.navigateNext('item'); + } + }); + speechSynthesis.cancel(); + speechSynthesis.speak(utterance); + }; + /** + * Stop speech output + */ + SRViewer.prototype.stopSpeech = function () { + this.isStreaming = false; + // Cancel any active speech synthesis + speechSynthesis.cancel(); + }; + /** + * Set up mutation tracking + */ + SRViewer.prototype.setupMutationTracking = function () { + var _this = this; + var observer = new MutationObserver(function (mutations) { + // console.log(this.isShowingAll, mutations.length); + if (_this.isShowingAll) { + var outsideOverlay = mutations.filter(function (mutation) { return mutation.target.nodeType === 1 + && !mutation.target.closest(".ibma-sr-overlay"); }); + if (outsideOverlay.length > 0) { + // console.log("Mutations",outsideOverlay); + observer.disconnect(); + var myThis_1 = _this; + myThis_1.showAll(); + setTimeout(function () { + myThis_1.showAll(); + observer.observe(_this.viewerDoc.documentElement, { + attributes: true, + childList: true, + subtree: true + }); + }, 1000); + } + } + }); + observer.observe(this.viewerDoc.documentElement, { + attributes: true, + childList: true, + subtree: true + }); + }; + /** + * Set up focus tracking to update the point of regard when focus changes + */ + SRViewer.prototype.setupFocusTracking = function () { + var _this = this; + this.focusHandler = function (e) { + // Skip if the focus is on the overlay itself + if (e.target instanceof HTMLElement) { + var target = e.target; + if (_this.overlay && target.closest('.ibma-sr-overlay')) { + return; + } + console.group("focusHandler"); + // Update the point of regard to the newly focused element + var result = _this.controller.setPointOfRegard(target); + // Announce the focus change + if (result.success) { + _this.overlay.displayResult(result, 'focus', 'focus'); + _this.speakResult(result); + } + console.groupEnd(); + } + }; + // Add the focus event listener to the document + this.viewerDoc.addEventListener('focusin', this.focusHandler); + }; + /** + * Activate (click) the element at the current point of regard + */ + SRViewer.prototype.activateCurrentElement = function () { + var currentElement = this.controller.getPointOfRegard().getElement(); + if (currentElement) { + // Announce that we're activating the element + var result = { + success: true, + renderingResult: { + message: "Activating: ".concat(currentElement.textContent || currentElement.nodeName), + start: this.controller.getPointOfRegard(), + end: this.controller.getPointOfRegard() + } + }; + this.overlay.displayResult(result, 'focus', 'focus'); + this.speakResult(result); + // Focus the element first + if (currentElement.focus) { + currentElement.focus(); + } + // Simulate a click on the element + currentElement.click(); + } + }; + /** + * Get the controller instance + * @returns The SRController instance + */ + SRViewer.prototype.getController = function () { + return this.controller; + }; + /** + * Destroy the viewer and clean up resources + */ + SRViewer.prototype.destroy = function () { + // Remove event listeners + this.viewerDoc.removeEventListener('keydown', this.keyboardHandler); + this.viewerDoc.removeEventListener('focusin', this.focusHandler); + // Stop any active speech + this.stopSpeech(); + // Destroy overlay + this.overlay.destroy(); + }; + return SRViewer; +}()); +exports.SRViewer = SRViewer; + + +/***/ }, + +/***/ "./src/v4/simulator/render_rules/common.ts" +/*!*************************************************!*\ + !*** ./src/v4/simulator/render_rules/common.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.RULES = exports.getLinkAnnouncement = exports.getRoleDescription = exports.quoteName = exports.quoteNamePadBefore = exports.quoteNamePadAfter = void 0; +var SRCursor_1 = __webpack_require__(/*! ../SRCursor */ "./src/v4/simulator/SRCursor.ts"); +var SRRendererRule_1 = __webpack_require__(/*! ../SRRendererRule */ "./src/v4/simulator/SRRendererRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var VisUtil_1 = __webpack_require__(/*! ../../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +/** + * Provide the name, surrounded by the quoteCharBefore and quoteCharAfter and followed by the padding if the name exists + * @param cursor The cursor for which to fetch the name + * @param padding String to add after, if the name exists + * @param quoteCharBefore The string to use as the leading quote, if the name exists + * @param quoteCharBefore The string to use as the trailing quote, if the name exists + * @returns + */ +function quoteNamePadAfter(cursor, padding, quoteCharBefore, quoteCharAfter) { + return cursor.getName() + ? "".concat(quoteName(cursor)).concat(padding || ", ") + : ""; +} +exports.quoteNamePadAfter = quoteNamePadAfter; +/** + * Provide the name, surrounded by quotes and preceded by the padding if the name exists + * @param cursor The cursor for which to fetch the name + * @param padding String to add before, if the name exists (defaults to ", ") + * @returns The quoted name with leading padding, or empty string if no name exists + */ +function quoteNamePadBefore(cursor, padding) { + return cursor.getName() + ? "".concat(padding || ", ").concat(quoteName(cursor)) + : ""; +} +exports.quoteNamePadBefore = quoteNamePadBefore; +/** + * Provide the name surrounded by quote characters + * @param cursor The cursor for which to fetch the name + * @param quoteCharBefore The string to use as the leading quote (defaults to ") + * @param quoteCharAfter The string to use as the trailing quote (defaults to ") + * @returns The quoted name, or empty string if no name exists + */ +function quoteName(cursor, quoteCharBefore, quoteCharAfter) { + return cursor.getName() + ? "".concat(quoteCharBefore || '"').concat(cursor.getName()).concat(quoteCharAfter || '"') + : ""; +} +exports.quoteName = quoteName; +/** + * Get the role description for an element, using aria-roledescription if present + * Falls back to the provided default role name if aria-roledescription is not specified or empty + * @param cursor The cursor positioned at the element + * @param defaultRole The default role name to use if aria-roledescription is not present + * @returns The role description (either custom or default) + */ +function getRoleDescription(cursor, defaultRole) { + var elem = cursor.getElement(); + if (!elem) + return defaultRole; + var roleDescription = elem.getAttribute("aria-roledescription"); + if (roleDescription && roleDescription.trim().length > 0) { + return roleDescription.trim(); + } + return defaultRole; +} +exports.getRoleDescription = getRoleDescription; +/** + * Generate the screen reader announcement for a link element + * Distinguishes between same-page links (anchors) and regular links + * @param cursor The cursor positioned at the link element + * @param mode The navigation mode (affects announcement order) + * @returns The formatted link announcement string + */ +function getLinkAnnouncement(cursor, mode) { + var href = (cursor.getNode().href) || ""; + var announceStr = ""; + if (href.startsWith(document.location.href) && href.charAt(document.location.href.length) === "#") { + announceStr = "same page link"; + } + else { + announceStr = "link"; + } + var nameInfo = cursor.getNameInfo(); + if (nameInfo && !["content", "text"].includes(nameInfo.nameFrom)) { + if (mode === "tab_focus") { + return "[".concat(quoteNamePadAfter(cursor)).concat(announceStr, "]"); + } + else { + return "[".concat(announceStr).concat(quoteNamePadBefore(cursor), "]"); + } + } + return "[".concat(announceStr, "]"); +} +exports.getLinkAnnouncement = getLinkAnnouncement; +/** + * Get the description text from aria-describedby references + * Resolves all IDs in aria-describedby and concatenates their text content + * @param elem The element with aria-describedby attribute + * @param mode The navigation mode (returns empty string in "item" mode) + * @returns The formatted description text with leading comma and quotes, or empty string + */ +function getDescribedByAnnouncements(elem, mode) { + var describedBy = elem.getAttribute("aria-describedby"); + if (!describedBy) + return ""; + var descriptionElems = describedBy + .split(/\s+/) + .map(function (id) { return document.getElementById(id); }) + .filter(function (descElem) { return !!descElem; }); + var descriptionText = descriptionElems + .map(function (descElem) { var _a; return (_a = descElem.textContent) === null || _a === void 0 ? void 0 : _a.trim(); }) + .filter(function (text) { return !!text; }) + .join(" "); + if (!descriptionText || descriptionText.length === 0) + return ""; + if (mode === "item") + return ", \u0001".concat(descriptionText, "\u0002"); + return ", \"".concat(descriptionText, "\""); +} +/** + * Get state announcements for disabled, readonly, required, and invalid attributes + * @param elem The element to check for state attributes + * @returns A string with state announcements (e.g., ", disabled", ", read only", ", required", ", invalid") + */ +function getStateAnnouncements(elem) { + var states = ""; + // Check for disabled state (both attribute and aria-disabled) + if (elem.hasAttribute("disabled") || elem.getAttribute("aria-disabled") === "true") { + states += ", disabled"; + } + // Check for readonly state (both attribute and aria-readonly) + if (elem.hasAttribute("readonly") || elem.getAttribute("aria-readonly") === "true") { + states += ", read only"; + } + // Check for required state (both attribute and aria-required) + if (elem.hasAttribute("required") || elem.getAttribute("aria-required") === "true") { + states += ", required"; + } + // Check for invalid state (aria-invalid) + if (elem.getAttribute("aria-invalid") === "true") { + states += ", invalid"; + } + return states; +} +/** + * Check if a listitem contains interactive/widget elements + * Screen readers typically don't read the accessible name of a listitem when it contains interactive elements + * Uses DOMWalker to properly traverse shadow DOM and other complex structures + */ +function listitemContainsInteractiveElement(cursor) { + var elem = cursor.getElement(); + if (!elem) + return false; + // Use DOMWalker to traverse the entire subtree including shadow DOM + var walker = new DOMWalker_1.DOMWalker(elem, false, elem, false); + // Walk through all descendants + while (walker.nextNode()) { + // Only check element nodes at start tags + if (walker.node.nodeType === 1 && !walker.bEndTag) { + var role = AriaUtil_1.AriaUtil.getResolvedRole(walker.node); + if (role && ARIADefinitions_1.ARIADefinitions.designPatterns[role] && ARIADefinitions_1.ARIADefinitions.designPatterns[role].roleType === 'widget') { + return true; + } + } + } + return false; +} +/** + * Check if an iframe's content can be accessed (not cross-origin) + * Attempts to access the iframe's document to determine if it's accessible + * @param iframe The iframe element to check + * @returns true if the iframe content is accessible, false if cross-origin or blocked + */ +function canAccessFrame(iframe) { + try { + // This throws a DOMException for cross-origin frames + var doc = iframe.contentDocument || iframe.contentWindow.document; + return doc !== null; + } + catch (e) { + return false; + // if (e instanceof DOMException && e.name === 'SecurityError') { + // return false; // Cross-origin, access blocked + // } + // throw e; // Re-throw unexpected errors + } +} +exports.RULES = [ + // Single role rules - alphabetically sorted + // Button role + new SRRendererRule_1.SRRendererRule({ + roles: ["button"], + elems: [], + modes: ["item", "button", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (!cursor.isStartTag()) + return null; + var elem = cursor.getNode(); + var roleDesc = getRoleDescription(cursor, "button"); + if (elem.getAttribute("aria-pressed") === "true") { + return "[toggle ".concat(roleDesc, ", pressed").concat(quoteNamePadBefore(cursor)).concat(getDescribedByAnnouncements(elem, mode), "]"); + } + return null; + }, + function (cursor, _oldCursor, mode) { + if (!cursor.isStartTag()) + return null; + var elem = cursor.getNode(); + var roleDesc = getRoleDescription(cursor, "button"); + if (elem.getAttribute("aria-pressed") === "false") { + return "[toggle ".concat(roleDesc, ", not pressed").concat(quoteNamePadBefore(cursor)).concat(getDescribedByAnnouncements(elem, mode), "]"); + } + return null; + }, + function (cursor, _oldCursor, mode) { + if (cursor.isEndTag()) + return undefined; + var expandStr = ""; + var elem = cursor.getElement(); + var roleDesc = getRoleDescription(cursor, "button"); + if (["menu", "true"].includes(elem.getAttribute("aria-haspopup"))) { + expandStr += ", menu"; + } + if (elem.hasAttribute("aria-expanded")) { + expandStr += ", ".concat(elem.getAttribute("aria-expanded") === "true" ? "expanded" : "collapsed"); + } + expandStr += getStateAnnouncements(elem); + return "[".concat(quoteNamePadAfter(cursor)).concat(roleDesc).concat(expandStr).concat(getDescribedByAnnouncements(elem, mode), "]"); + }, + function (cursor) { if (cursor.isEndTag()) + return ""; } + ] + }), + // Checkbox role + new SRRendererRule_1.SRRendererRule({ + roles: ["checkbox"], + elems: [], + modes: ["item", "checkbox", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (cursor.isStartTag()) { + var elem = cursor.getNode(); + var roleDesc = getRoleDescription(cursor, "checkbox"); + var stateStr = ""; + if (elem.getAttribute("aria-checked") === "mixed") { + stateStr = "half checked"; + } + else { + var bChecked = false; + if (elem.hasAttribute("aria-checked")) { + bChecked = elem.getAttribute("aria-checked") === "true"; + } + else { + bChecked = elem.checked; + } + stateStr = bChecked ? "checked" : "not checked"; + } + stateStr += getStateAnnouncements(cursor.getElement()); + return "[".concat(roleDesc, ", ").concat(stateStr).concat(quoteNamePadBefore(cursor)).concat(getDescribedByAnnouncements(cursor.getElement(), mode), "]"); + } + else { + return ""; + } + } + ] + }), + // Cell, Columnheader, and Rowheader roles + new SRRendererRule_1.SRRendererRule({ + roles: ["cell", "columnheader", "rowheader"], + elems: [], + modes: ["item", "table"], + tests: [ + function (cursor) { + var _a; + if (!cursor.isStartTag()) + return null; + // Get the cell element + var cellElem = cursor.getElement(); + if (!cellElem) + return null; + // Check if the cell has any visible content by checking: + // 1. Text content (trimmed) + // 2. Child elements with roles (buttons, links, etc.) + // 3. Images with alt text + var textContent = ((_a = cellElem.textContent) === null || _a === void 0 ? void 0 : _a.trim()) || ""; + // Check for child elements with interactive roles or content + var walker = new DOMWalker_1.DOMWalker(cellElem, false, cellElem, false); + var hasContent = textContent.length > 0; + if (!hasContent) { + // Check for elements that would have content (buttons, links, images, etc.) + while (walker.nextNode()) { + if (walker.node.nodeType === 1 && !walker.bEndTag) { + var elem = walker.node; + var role = AriaUtil_1.AriaUtil.getResolvedRole(elem); + // Check for interactive elements or elements with accessible names + if (role && ARIADefinitions_1.ARIADefinitions.designPatterns[role]) { + hasContent = true; + break; + } + // Check for images with alt text + if (elem.nodeName.toUpperCase() === "IMG" && elem.hasAttribute("alt")) { + hasContent = true; + break; + } + } + } + } + // If the cell is empty, return "[blank]" + if (!hasContent) { + return "[blank]"; + } + // Otherwise, return null to let default rendering continue + return null; + } + ] + }), + // Combobox role + new SRRendererRule_1.SRRendererRule({ + roles: ["combobox"], + elems: [], + modes: ["item", "combo", "tab_focus"], + tests: [ + function (cursor) { + if (cursor.isEndTag()) + return ""; + var roleDesc = getRoleDescription(cursor, "combo box"); + var elem = cursor.getElement(); + var state = ""; + if (cursor.getNode().nodeName.toUpperCase() === "SELECT") { + state = ", collapsed"; + var selectElem = cursor.getElement(); + var valueElem = selectElem.selectedIndex >= 0 ? selectElem.options[selectElem.selectedIndex] : null; + var valueStr = ""; + if (valueElem) { + var temp = new SRCursor_1.SRCursor(valueElem, false); + valueStr = quoteNamePadBefore(temp, ", "); + } + state += getStateAnnouncements(elem); + return "[".concat(quoteNamePadAfter(cursor)).concat(roleDesc).concat(state).concat(valueStr, "]"); + } + else if (cursor.getNode().nodeName.toUpperCase() === "INPUT" && !cursor.getElement().hasAttribute("role")) { + state = getStateAnnouncements(elem); + return "[".concat(quoteNamePadAfter(cursor)).concat(roleDesc, ", has auto complete, editable, opens list").concat(state, "]"); + } + else { + if (elem.hasAttribute("aria-expanded")) { + state = ", ".concat(elem.getAttribute("aria-expanded") === "true" ? "expanded" : "collapsed"); + if (elem.hasAttribute("aria-autocomplete")) { + state += ", has auto complete"; + } + state += ", editable, opens list"; + } + state += getStateAnnouncements(elem); + return "[".concat(quoteNamePadAfter(cursor)).concat(roleDesc).concat(state, "]"); + } + } + ] + }), + // Default role (fallback) + new SRRendererRule_1.SRRendererRule({ + roles: ["default"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var _a; + return cursor.isStartTag() ? + "!!<".concat(cursor.getRole(), ">").concat((((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) + ""), "!!") : + "!!</".concat(cursor.getRole(), ">!!"); + } + ] + }), + // Deletion role + new SRRendererRule_1.SRRendererRule({ + roles: ["deletion"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { return (cursor.isStartTag() && "[deleted]" || ""); } + ] + }), + // Dialog role + new SRRendererRule_1.SRRendererRule({ + roles: ["dialog"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + return cursor.isEndTag() ? "[End of dialog]" : "[Start of dialog".concat(quoteNamePadBefore(cursor)); + } + ] + }), + // Document role + new SRRendererRule_1.SRRendererRule({ + roles: ["document", "generic"], + elems: [], + modes: ["item"], + tests: [ + function () { return ""; } + ] + }), + // Graphics document role + new SRRendererRule_1.SRRendererRule({ + roles: ["graphics-document"], + elems: [], + modes: ["item", "image"], + tests: [ + function (cursor) { + var _a, _b; + if (cursor.isStartTag() && !((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) && ((_b = cursor.getNameInfo()) === null || _b === void 0 ? void 0 : _b.name) !== "") { + // Don't announce unlabeled graphics that are hidden inside links or headings + var parentHeadingOrLink = cursor.getCurrentOrParentByRoleClone(["heading", "link"]); + if (parentHeadingOrLink && VisUtil_1.VisUtil.isNodeHiddenFromAT(cursor.getElement())) { + return ""; + } + return "[Unlabeled graphic]"; + } + return null; + }, + function (cursor) { var _a; return (cursor.isStartTag() && (((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) === "")) ? "" : null; }, + function (cursor) { var _a; return (cursor.isStartTag() && ((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) && "[graphic".concat(quoteNamePadBefore(cursor), "]")) || null; }, + function (cursor) { return (cursor.isEndTag()) ? "" : null; } + ] + }), + // Heading role + new SRRendererRule_1.SRRendererRule({ + roles: ["heading"], + elems: [], + modes: ["item", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (mode === "tab_focus" && cursor.isStartTag()) + return ""; + if (mode === "item" && cursor.isEndTag()) + return ""; + var level; + var node = cursor.getElement(); + if (node.ariaLevel) { + // Explicit aria-level attribute + level = node.ariaLevel; + } + else if (node.getAttribute('role') === 'heading') { + // role="heading" without aria-level defaults to 2 + level = '2'; + } + else { + // Native heading element (h1-h6), extract number from tag name + level = node.nodeName.substring(1); + } + var nameInfo = cursor.getNameInfo(); + if ((!nameInfo || ["content", "text"].includes(nameInfo.nameFrom)) && !(node.textContent || "").trim()) { + return ""; + } + if (nameInfo && !["content", "text"].includes(nameInfo.nameFrom)) { + return "[heading level ".concat(level).concat(quoteNamePadBefore(cursor), "]"); + } + else { + return "[heading level ".concat(level, "]"); + } + } + ] + }), + // -- in heading mode + new SRRendererRule_1.SRRendererRule({ + roles: ["heading"], + elems: [], + modes: ["heading", "h1", "h2", "h3", "h4", "h5", "h6"], + tests: [ + function (cursor) { + if (cursor.isStartTag()) { + var node = cursor.getNode(); + var level = void 0; + if (node.ariaLevel) { + // Explicit aria-level attribute + level = node.ariaLevel; + } + else if (node.getAttribute('role') === 'heading') { + // role="heading" without aria-level defaults to 2 + level = '2'; + } + else { + // Native heading element (h1-h6), extract number from tag name + level = node.nodeName.substring(1); + } + var nameInfo = cursor.getNameInfo(); + if ((!nameInfo || ["content", "text"].includes(nameInfo.nameFrom)) && !(node.textContent || "").trim()) { + return ""; + } + return "[".concat(quoteNamePadAfter(cursor), "heading level ").concat(level, "]"); + } + return ""; + } + ] + }), + // Image role + new SRRendererRule_1.SRRendererRule({ + roles: ["img"], + elems: [], + modes: ["item", "image"], + tests: [ + function (cursor) { + var _a, _b, _c; + if (cursor.isEndTag()) { + return ""; + } + else { + if (!((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) && ((_b = cursor.getNameInfo()) === null || _b === void 0 ? void 0 : _b.name) !== "") { + // Don't announce unlabeled graphics that are hidden inside links or headings + // (these were only included because of the SKIP_ITEM_BEHAVIOR change) + var parentHeadingOrLink = cursor.getCurrentOrParentByRoleClone(["heading", "link"]); + if (parentHeadingOrLink && VisUtil_1.VisUtil.isNodeHiddenFromAT(cursor.getElement())) { + return ""; + } + return "[Unlabeled graphic]"; + } + else if (((_c = cursor.getNameInfo()) === null || _c === void 0 ? void 0 : _c.name) === "") { + return ""; + } + else { + return "[graphic".concat(quoteNamePadBefore(cursor), "]"); + } + } + } + ] + }), + // Insertion role + new SRRendererRule_1.SRRendererRule({ + roles: ["insertion"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { return (cursor.isStartTag() && "[inserted]" || ""); } + ] + }), + // Link role + new SRRendererRule_1.SRRendererRule({ + roles: ["link"], + elems: [], + modes: ["item", "region", "link", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + var _a; + if (cursor.isStartTag() && !["content", "text"].includes((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.nameFrom)) { + return getLinkAnnouncement(cursor, mode); + } + return null; + } + ] + }), + // Listitem role + new SRRendererRule_1.SRRendererRule({ + roles: ["listitem"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var _a; + var isOrdered; + var parentListElem; + var walkParents = DOMWalker_1.DOMWalker.parentNode(cursor.getNode()); + while (typeof isOrdered === "undefined" && walkParents) { + if (walkParents.nodeType === 1) { + var elem = walkParents; + if (elem.hasAttribute("role")) { + if (elem.getAttribute("role") === "list") { + isOrdered = false; + parentListElem = elem; + } + } + else if (elem.nodeName.toUpperCase() === "UL") { + isOrdered = false; + parentListElem = elem; + } + else if (elem.nodeName.toUpperCase() === "OL") { + isOrdered = true; + parentListElem = elem; + } + } + walkParents = DOMWalker_1.DOMWalker.parentNode(walkParents); + } + // Check if listitem contains interactive elements + // Screen readers don't read the accessible name when interactive elements are present + var hasInteractiveContent = listitemContainsInteractiveElement(cursor); + var nameToUse = hasInteractiveContent ? "" : (((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) || ""); + var retStr = ""; + if (!isOrdered) { + var elem = cursor.getElement(); + if ((elem.nodeName.toUpperCase() === "LI" && window.getComputedStyle(elem).listStyleType === "none") + || elem.nodeName.toUpperCase() !== "LI") { + retStr = cursor.isStartTag() ? "".concat(nameToUse) : ""; + } + else { + retStr = cursor.isStartTag() ? "[bullet] ".concat(nameToUse) : ""; + } + } + else { + // For ordered lists, count sibling listitems and account for start attribute + var count = 1; // Start at 1 by default + // Get the start attribute if it exists on the <ol> element + if (parentListElem && parentListElem.nodeName.toUpperCase() === 'OL' && + parentListElem.hasAttribute('start')) { + var startValue = parseInt(parentListElem.getAttribute('start') || '1', 10); + count = isNaN(startValue) ? 1 : startValue; + } + // Count previous sibling listitems at the same level using DOMWalker + var currentElem = cursor.getElement(); + var sibling = DOMWalker_1.DOMWalker.previousSiblingNotOwnedBySlot(currentElem); + while (sibling) { + // Only count direct siblings that are listitems (element nodes only) + if (sibling.nodeType === 1) { + var siblingElem = sibling; + if (siblingElem.getAttribute('role') === 'listitem' || + siblingElem.nodeName.toUpperCase() === 'LI') { + count++; + } + } + sibling = DOMWalker_1.DOMWalker.previousSiblingNotOwnedBySlot(sibling); + } + retStr = cursor.isStartTag() ? "".concat(count, ". ").concat(nameToUse) : ""; + } + return retStr; + } + ] + }), + // Math role + new SRRendererRule_1.SRRendererRule({ + roles: ["math"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { return cursor.isEndTag() ? "[math content]" : ""; } + ] + }), + // Link role + new SRRendererRule_1.SRRendererRule({ + roles: ["menuitem"], + elems: [], + modes: ["item", "tab_focus", "region"], + tests: [ + function (cursor) { + var retVal = ""; + if (cursor.isStartTag()) { + // let isSubMenuContainer = false; + // for (let checkChildren=cursor.getNode().firstChild; !isSubMenuContainer && checkChildren !== null; checkChildren = checkChildren.nextSibling) { + // isSubMenuContainer = checkChildren.nodeName.toUpperCase() === "UL"; + // } + // if (isSubMenuContainer) return "[????menu]"; + var expandStr = ""; + var elem = cursor.getElement(); + if (elem.getAttribute("aria-haspopup") === "true") { + expandStr += ", sub-menu"; + } + if (elem.hasAttribute("aria-expanded")) { + expandStr += ", ".concat(elem.getAttribute("aria-expanded") === "true" ? "expanded" : "collapsed"); + } + retVal = "[menu".concat(expandStr); + var nameInfo = cursor.getNameInfo(); + if (nameInfo && !["content", "text"].includes(nameInfo.nameFrom)) { + retVal += quoteNamePadBefore(cursor); + } + retVal += "]"; + } + return retVal; + } + ] + }), + // Meter role + new SRRendererRule_1.SRRendererRule({ + roles: ["meter"], + elems: [], + modes: ["item", "tab_focus"], + tests: [ + function (cursor) { return cursor.isStartTag() ? "[progress bar, ".concat((cursor.getNode().value), "]") : ""; } + ] + }), + // Progressbar role + new SRRendererRule_1.SRRendererRule({ + roles: ["progressbar"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { return cursor.isStartTag() ? "[progress bar, ".concat((cursor.getNode().value), "]") : ""; } + ] + }), + // Radio role + new SRRendererRule_1.SRRendererRule({ + roles: ["radio"], + elems: [], + modes: ["item", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (cursor.isStartTag()) { + var roleDesc = getRoleDescription(cursor, "radio button"); + var bChecked = false; + if (cursor.getElement().hasAttribute("aria-checked")) { + bChecked = cursor.getElement().getAttribute("aria-checked") === "true"; + } + else { + bChecked = cursor.getNode().checked; + } + var stateStr = getStateAnnouncements(cursor.getElement()); + return "[".concat(roleDesc, ", ").concat(bChecked ? "checked" : "not checked").concat(stateStr).concat(quoteNamePadBefore(cursor)).concat(getDescribedByAnnouncements(cursor.getElement(), mode), "]"); + } + else { + return ""; + } + } + ] + }), + // Searchbox role + new SRRendererRule_1.SRRendererRule({ + roles: ["searchbox"], + elems: [], + modes: ["item", "tab_focus"], + tests: [ + function (cursor) { return cursor.isStartTag() ? "[".concat(quoteNamePadAfter(cursor), "edit]") : ""; } + ] + }), + // Separator role + new SRRendererRule_1.SRRendererRule({ + roles: ["separator"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { return (cursor.isStartTag() && "[separator]" || ""); } + ] + }), + // Slider role + new SRRendererRule_1.SRRendererRule({ + roles: ["slider"], + elems: [], + modes: ["item", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (!cursor.isStartTag()) + return ""; + var roleDesc = getRoleDescription(cursor, "slider"); + var elem = cursor.getElement(); + // Check for aria-valuenow first, then fall back to native value property + var value = elem.hasAttribute("aria-valuenow") + ? elem.getAttribute("aria-valuenow") + : cursor.getNode().value; + return "[".concat(quoteNamePadAfter(cursor)).concat(roleDesc, ", ").concat(value).concat(getDescribedByAnnouncements(cursor.getElement(), mode), "]"); + } + ] + }), + // Spinbutton role + new SRRendererRule_1.SRRendererRule({ + roles: ["spinbutton"], + elems: [], + modes: ["item", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (!cursor.isStartTag()) + return ""; + var roleDesc = getRoleDescription(cursor, "spinbutton"); + return "[".concat(quoteNamePadAfter(cursor)).concat(roleDesc, ", editable").concat(getDescribedByAnnouncements(cursor.getElement(), mode), "]"); + } + ] + }), + // Tab role + new SRRendererRule_1.SRRendererRule({ + roles: ["tab"], + elems: [], + modes: ["item", "tab_focus"], + tests: [ + function (cursor) { + if (!cursor.isStartTag()) + return ""; + var roleDesc = getRoleDescription(cursor, "tab"); + return "[".concat(roleDesc).concat(cursor.getNode().getAttribute("aria-selected") === "true" ? ", selected" : "").concat(quoteNamePadBefore(cursor), "]"); + } + ] + }), + // Tablist role + new SRRendererRule_1.SRRendererRule({ + roles: ["tablist"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + if (cursor.getNameInfo() === null) + return null; + if (cursor.isStartTag()) { + return "[group start".concat(quoteNamePadBefore(cursor), "]"); + } + else { + return "[group end".concat(quoteNamePadBefore(cursor), "]"); + } + } + ] + }), + // Tabpanel role + new SRRendererRule_1.SRRendererRule({ + roles: ["tabpanel"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + if (cursor.getNameInfo() === null) + return null; + if (cursor.isStartTag()) { + return "[Tab panel start".concat(quoteNamePadBefore(cursor), "]"); + } + else { + return "[Tab panel end".concat(quoteNamePadBefore(cursor), "]"); + } + } + ] + }), + // Text role + new SRRendererRule_1.SRRendererRule({ + roles: ["text"], + elems: [], + modes: ["item", "link", "tab_focus", "region"], + tests: [ + function (cursor) { + var _a, _b, _c, _d; + if (cursor.isEndTag() || !((_a = cursor.getParentElement()) === null || _a === void 0 ? void 0 : _a.getElement())) + return null; + var elem = (_b = cursor.getParentElement()) === null || _b === void 0 ? void 0 : _b.getElement(); + if (elem.ownerDocument.defaultView.getComputedStyle(elem).textDecorationLine === "line-through") { + return "[strikethrough] ".concat((((_c = cursor.getNameInfo()) === null || _c === void 0 ? void 0 : _c.name) + ""), " [end strikethrough]"); + } + return "".concat((((_d = cursor.getNameInfo()) === null || _d === void 0 ? void 0 : _d.name) + "")); + } + ] + }), + // -- in heading mode + new SRRendererRule_1.SRRendererRule({ + roles: ["text"], + elems: [], + modes: ["heading"], + tests: [ + function (cursor) { return ""; } + ] + }), + // Textbox role + new SRRendererRule_1.SRRendererRule({ + roles: ["textbox"], + elems: [], + modes: ["item", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + var _a; + var elem = cursor.getElement(); + if (cursor.isEndTag()) { + return mode === "item" && elem.nodeName.toUpperCase() === "TEXTAREA" ? "[out of edit]" : ""; + } + if (!cursor.isStartTag()) { + return ""; + } + var attributes = ""; + if (elem.hasAttribute("placeholder") && elem.getAttribute("placeholder").trim().length > 0) { + attributes += ", placeholder: ".concat(elem.getAttribute("placeholder")); + } + attributes += getStateAnnouncements(elem); + var isMultiline = elem.nodeName.toUpperCase() === "TEXTAREA" || elem.getAttribute("aria-multiline") === "true"; + var describedBy = getDescribedByAnnouncements(elem, mode); + if (isMultiline) { + var textContent = mode === "tab_focus" ? (_a = elem.textContent) === null || _a === void 0 ? void 0 : _a.trim() : ""; + var contentSuffix = textContent ? " ".concat(textContent) : ""; + return "[".concat(quoteNamePadAfter(cursor), "edit, multiline").concat(attributes).concat(describedBy, "]").concat(contentSuffix); + } + return "[".concat(quoteNamePadAfter(cursor), "edit").concat(attributes).concat(describedBy, "]"); + } + ] + }), + // Treeitem role + new SRRendererRule_1.SRRendererRule({ + roles: ["treeitem"], + elems: [], + modes: ["item", "tab_focus"], + tests: [ + function (cursor) { + if (cursor.isEndTag()) + return ""; + var elem = cursor.getElement(); + // Build the announcement string without the name (let content render separately) + var announcement = "[treeview item"; + // Add selected state if present + if (elem.getAttribute("aria-selected") === "true") { + announcement += ", selected"; + } + // Add expanded/collapsed state if present + if (elem.hasAttribute("aria-expanded")) { + announcement += elem.getAttribute("aria-expanded") === "true" ? ", expanded" : ", collapsed"; + } + // Add level if explicitly set or calculate from nesting + var level = elem.getAttribute("aria-level"); + if (level) { + announcement += ", level ".concat(level); + } + else { + // Calculate level by counting parent treeitems or groups using DOMWalker for shadow DOM support + var calculatedLevel = 1; + var parent_1 = DOMWalker_1.DOMWalker.parentElement(elem); + while (parent_1) { + var parentRole = AriaUtil_1.AriaUtil.getResolvedRole(parent_1); + if (parentRole === "group" || parentRole === "tree") { + // Check if this group is inside a treeitem + var groupParent = DOMWalker_1.DOMWalker.parentElement(parent_1); + while (groupParent) { + var groupParentRole = AriaUtil_1.AriaUtil.getResolvedRole(groupParent); + if (groupParentRole === "treeitem") { + calculatedLevel++; + break; + } + else if (groupParentRole === "tree") { + break; + } + groupParent = DOMWalker_1.DOMWalker.parentElement(groupParent); + } + } + parent_1 = DOMWalker_1.DOMWalker.parentElement(parent_1); + } + if (calculatedLevel > 1) { + announcement += ", level ".concat(calculatedLevel); + } + } + // Add position information (aria-posinset/aria-setsize or calculate) + var position = elem.getAttribute("aria-posinset"); + var setSize = elem.getAttribute("aria-setsize"); + if (!position || !setSize) { + // Calculate position by counting siblings with same role using DOMWalker for shadow DOM support + var pos = 0; + var total = 0; + var parent_2 = DOMWalker_1.DOMWalker.parentElement(elem); + if (parent_2) { + // Iterate through children to count treeitems + var child = DOMWalker_1.DOMWalker.firstChildNotOwnedBySlot(parent_2); + while (child) { + if (child.nodeType === 1) { // Element node + var childElem = child; + if (AriaUtil_1.AriaUtil.getResolvedRole(childElem) === "treeitem") { + total++; + if (childElem === elem) { + pos = total; + } + } + } + child = child.nextSibling; + } + } + position = pos.toString(); + setSize = total.toString(); + } + announcement += ", ".concat(position, " of ").concat(setSize, "] "); + return announcement; + } + ] + }), + // HTML Element rules + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["BODY"], + modes: ["item", "tab_focus"], + tests: [ + function (cursor) { + var titleStr = cursor.getNode().ownerDocument.title; + return cursor.isEndTag() ? "[End of document".concat(titleStr.trim().length > 0 ? ": " + titleStr.trim() : "", "]") : "[Start of document".concat(titleStr.trim().length > 0 ? ": " + titleStr.trim() : "", "]"); + } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["IFRAME"], + modes: ["item", "tab_focus"], + tests: [ + function (cursor) { + var accessWarning = canAccessFrame(cursor.getNode()) ? "" : "{Emulator unable to access frame}"; + return cursor.isEndTag() ? "" : accessWarning; + } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["BR"], + modes: ["item"], + tests: [ + function (cursor) { + try { + var walk = cursor.clone(); + // Walk until we hit the beginning of the page, find another BR, or find something with a name + while (walk.previous(function () { return true; }) && walk.getNode().nodeName.toUpperCase() !== "BR" && walk.getNameInfo() && walk.getNameInfo().name.trim().length === 0) + ; + return walk.getNode().nodeName.toUpperCase() === "BR" ? "[blank]" : null; + } + catch (err) { + console.error(err); + } + } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["DL"], + modes: ["item"], + tests: [ + function (cursor) { return ""; } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["INPUT"], + modes: ["item", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { var _a; return (cursor.isStartTag() && ((_a = cursor.getElement()) === null || _a === void 0 ? void 0 : _a.getAttribute("type")) === "password" && "[".concat(quoteNamePadAfter(cursor), "edit, protected").concat(getDescribedByAnnouncements(cursor.getElement(), mode), "]")) || null; }, + function (cursor, _oldCursor, mode) { + var _a, _b; + if (cursor.isStartTag() && ((_a = cursor.getElement()) === null || _a === void 0 ? void 0 : _a.getAttribute("type")) === "file") { + var value = ((_b = cursor.getElement()) === null || _b === void 0 ? void 0 : _b.value) || ""; + value = value === "" ? "No file chosen" : value.substring("C:\\fakepath\\".length); + return "[".concat(quoteNamePadAfter(cursor), "button").concat(getDescribedByAnnouncements(cursor.getElement(), mode), "] [").concat(quoteNamePadAfter(cursor)).concat(value, "]"); + } + return null; + }, + function (cursor, _oldCursor, mode) { + var _a; + if (cursor.isStartTag() && ((_a = cursor.getElement()) === null || _a === void 0 ? void 0 : _a.getAttribute("type")) === "color") { + var val = cursor.getElement().value; + var r = (Number("0x".concat(val.substring(1, 3))) * 100.0 / Number("0xff")).toFixed(0); + var g = (Number("0x".concat(val.substring(3, 5))) * 100.0 / Number("0xff")).toFixed(0); + var b = (Number("0x".concat(val.substring(5))) * 100.0 / Number("0xff")).toFixed(0); + return "[".concat(quoteNamePadAfter(cursor), "clickable").concat(getDescribedByAnnouncements(cursor.getElement(), mode), "] [").concat(r, "% red ").concat(g, "% green ").concat(b, "% blue]"); + } + return null; + }, + function (cursor, _oldCursor, mode) { + var _a; + if (cursor.isStartTag() && ((_a = cursor.getElement()) === null || _a === void 0 ? void 0 : _a.getAttribute("type")) === "month") { + var val = cursor.getElement().value; + var y = "0"; + var m = "0"; + if (val.trim().length > 0) { + var date = new Date(val); + y = "" + date.getFullYear(); + m = "" + (date.getMonth() + 1); + } + return "[".concat(quoteNamePadAfter(cursor), "clickable").concat(getDescribedByAnnouncements(cursor.getElement(), mode), "] [spin button, ").concat(m, "] [spin button, ").concat(y, "] [menu button] [subMenu] Show month picker"); + } + return null; + }, + function (cursor, _oldCursor, mode) { + var _a; + if (cursor.isStartTag() && ((_a = cursor.getElement()) === null || _a === void 0 ? void 0 : _a.getAttribute("type")) === "date") { + var val = cursor.getElement().value; + var y = "0"; + var m = "0"; + var day = "0"; + if (val.trim().length > 0) { + var date = new Date(val); + y = "" + date.getFullYear(); + m = "" + (date.getMonth() + 1); + day = "" + (date.getDate()); + } + return "[".concat(quoteNamePadAfter(cursor), "clickable").concat(getDescribedByAnnouncements(cursor.getElement(), mode), "] [spin button, ").concat(m, "] / [spin button, ").concat(day, "] / [spin button, ").concat(y, "] [menu button] [subMenu] Show date picker"); + } + return null; + }, + function (cursor, _oldCursor, mode) { + var _a; + if (cursor.isStartTag() && ((_a = cursor.getElement()) === null || _a === void 0 ? void 0 : _a.getAttribute("type")) === "datetime-local") { + var val = cursor.getElement().value; // 2025-09-12T04:20 + var y = "0"; + var m = "0"; + var day = "0"; + var hour = "0"; + var min = "0"; + var ampm = "0"; + if (val.trim().length > 0) { + var date = new Date(val); + y = "" + date.getFullYear(); + m = "" + (date.getMonth() + 1); + day = "" + (date.getDate()); + if (date.getHours() === 0 || date.getHours() === 12) { + hour = "12"; + } + else if (date.getHours() < 12) { + hour = "" + date.getHours(); + } + else { + hour = "" + (date.getHours() - 12); + } + min = "" + date.getMinutes(); + ampm = date.getHours() >= 12 ? "pm" : "am"; + } + return "[".concat(quoteNamePadAfter(cursor), "clickable").concat(getDescribedByAnnouncements(cursor.getElement(), mode), "] [spin button, ").concat(m, "] / [spin button, ").concat(day, "] / [spin button, ").concat(y, "] [spin button, ").concat(hour, "] : [spin button, ").concat(min, "] [spin button, ").concat(ampm, "] [menu button] [subMenu] Show local date and time picker"); + } + return null; + }, + function (cursor, _oldCursor, mode) { + var _a; + if (cursor.isStartTag() && ((_a = cursor.getElement()) === null || _a === void 0 ? void 0 : _a.getAttribute("type")) === "time") { + var val = cursor.getElement().value; // 2025-09-12T04:20 + var hour = "0"; + var min = "0"; + var ampm = "0"; + if (val.trim().length > 0) { + var date = val.split(":"); + var hours = parseInt(date[0]); + if (hours === 0 || hours === 12) { + hour = "12"; + } + else if (hours < 12) { + hour = "" + hours; + } + else { + hour = "" + (hours - 12); + } + min = date[1]; + ampm = hours >= 12 ? "pm" : "am"; + } + return "[".concat(quoteNamePadAfter(cursor), "grouping clickable").concat(getDescribedByAnnouncements(cursor.getElement(), mode), " [spin button, ").concat(hour, "] : [spin button, ").concat(min, "] [spin button, ").concat(ampm, "] [menu button] [subMenu] Show time picker [out of grouping]"); + } + return null; + }, + function (cursor, _oldCursor, mode) { + var _a; + if (cursor.isStartTag() && ((_a = cursor.getElement()) === null || _a === void 0 ? void 0 : _a.getAttribute("type")) === "week") { + var val = cursor.getElement().value; // 2025-W38 + var year = "0"; + var week = "0"; + if (val.trim().length > 0) { + var date = val.split(/-W/); + year = date[0]; + week = date[1]; + } + return "[".concat(quoteNamePadAfter(cursor), "clickable").concat(getDescribedByAnnouncements(cursor.getElement(), mode), "] [spin button, ").concat(week, "], [spin button, ").concat(year, "] [menu button] [subMenu] Show week picker"); + } + return null; + }, + function (cursor) { var _a; return ((_a = cursor.getElement()) === null || _a === void 0 ? void 0 : _a.getAttribute("type")) === "hidden" ? "" : null; }, + function (cursor) { return (cursor.isStartTag() && "!![".concat(quoteNamePadAfter(cursor), "input!!]").concat(cursor.getElement().outerHTML)) || null; } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["LI"], + modes: ["item"], + tests: [ + function (cursor) { + var _a; + // Check if listitem contains interactive elements + // Screen readers don't read the accessible name when interactive elements are present + var hasInteractiveContent = listitemContainsInteractiveElement(cursor); + var nameToUse = hasInteractiveContent ? "" : (((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) || ""); + var elem = cursor.getElement(); + if (window.getComputedStyle(elem).listStyleType === "none") { + return cursor.isStartTag() ? "".concat(nameToUse) : ""; + } + else { + return cursor.isStartTag() ? "[bullet] ".concat(nameToUse) : ""; + } + } + ] + }), + // MathML elements + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["MFRAC"], + modes: ["item"], + tests: [ + function (cursor) { return cursor.isStartTag() ? "[fraction]" : "[end fraction]"; } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["MROW"], + modes: ["item"], + tests: [ + function (cursor) { + var _a; + // Only announce over on the end tag + if (cursor.isStartTag()) + return undefined; + var fraction = cursor.getCurrentOrParentByRoleClone([], ["mfrac"]); + if (fraction && ((_a = fraction.getElement().querySelectorAll("mrow")[0]) === null || _a === void 0 ? void 0 : _a.isSameNode(cursor.getNode()))) { + return "[over]"; + } + } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["MSQRT"], + modes: ["item"], + tests: [ + function (cursor) { return cursor.isStartTag() ? "[square root]" : "[end root]"; } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["MSUP"], + modes: ["item"], + tests: [ + function (cursor) { + var _a, _b; + if (cursor.isEndTag()) + return undefined; + var mi = ((_a = cursor.getElement().querySelector("mi")) === null || _a === void 0 ? void 0 : _a.innerHTML) || ""; + var mn = ((_b = cursor.getElement().querySelector("mn")) === null || _b === void 0 ? void 0 : _b.innerHTML) || ""; + if (mn === "2") + return "".concat(mi, " [squared]"); + if (mn === "3") + return "".concat(mi, " [cubed]"); + return "".concat(mi, " [to the ").concat(mn, "]"); + } + ] + }), + // Multiple roles rules - placed at the bottom + // Default mode rules - Container elements (multiple roles) + new SRRendererRule_1.SRRendererRule({ + roles: ["article", "banner", "blockquote", "caption", "cell", "code", "columnheader", + "complementary", "contentinfo", "figure", "form", "group", "list", "main", + "mark", "navigation", "region", "row", "rowheader", "search", "table", "toolbar"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { return ""; } + ] + }), + // Default mode rules - Elements that screen readers typically ignore (multiple roles) + new SRRendererRule_1.SRRendererRule({ + roles: ["paragraph", "rowgroup", "status", "strong", "subscript", "superscript", + "term", "time", "none", "presentation"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { return ""; } + ] + }), +]; + + +/***/ }, + +/***/ "./src/v4/simulator/render_rules/container_enter.ts" +/*!**********************************************************!*\ + !*** ./src/v4/simulator/render_rules/container_enter.ts ***! + \**********************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.RULES = void 0; +var SRRendererRule_1 = __webpack_require__(/*! ../SRRendererRule */ "./src/v4/simulator/SRRendererRule.ts"); +var SRTableUtil_1 = __webpack_require__(/*! ../SRTableUtil */ "./src/v4/simulator/SRTableUtil.ts"); +var common_1 = __webpack_require__(/*! ./common */ "./src/v4/simulator/render_rules/common.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +/** + * Generates the announcement text when entering a table cell + */ +function renderEnterTableCell(newCursor, oldCursor) { + var _a; + // We seem to be at the newline text node after the cell + if (oldCursor && ((_a = oldCursor.getNode()) === null || _a === void 0 ? void 0 : _a.nodeName) === "#text") { + oldCursor = oldCursor.clone(); + oldCursor.previous(function () { return true; }); + } + var newTableModel = SRTableUtil_1.SRTableUtil.getTableModel(newCursor); + var oldCellInfo = SRTableUtil_1.SRTableUtil.getCellModel(oldCursor, newTableModel); + var newCellInfo = SRTableUtil_1.SRTableUtil.getCellModel(newCursor, newTableModel); + if (!newCellInfo) + return ""; + var retVal = []; + // Announce row information if we've moved to a different row or the rowspan has changed + if (!oldCellInfo || oldCellInfo.rowIndexStart !== newCellInfo.rowIndexStart || oldCellInfo.rowspan !== newCellInfo.rowspan) { + // If a change in row or a change in rowSpan + var rowHeaders = SRTableUtil_1.SRTableUtil.getRowHeadersForCursor(newCursor, newTableModel); + var headerInfoStr = rowHeaders && rowHeaders.trim().length > 0 ? "\"".concat(rowHeaders, "\", ") : ""; + retVal.push("[".concat(headerInfoStr, "row ").concat((newCellInfo.rowIndexStart + 1)).concat(newCellInfo.rowspan > 1 ? " through " + (newCellInfo.rowIndexStart + newCellInfo.rowspan) : "", "]")); + } + // Announce column information if we've moved to a different column or the colspan has changed + if (!oldCellInfo || oldCellInfo.colIndexStart !== newCellInfo.colIndexStart || oldCellInfo.colspan !== newCellInfo.colspan) { + // If a change in column or a change in colspan + var columnHeaders = SRTableUtil_1.SRTableUtil.getColumnHeadersForCursor(newCursor, newTableModel); + var headerInfoStr = columnHeaders && columnHeaders.trim().length > 0 ? "\"".concat(columnHeaders, "\", ") : ""; + retVal.push("[".concat(headerInfoStr, "column ").concat((newCellInfo.colIndexStart + 1)).concat(newCellInfo.colspan > 1 ? " through " + (newCellInfo.colIndexStart + newCellInfo.colspan) : "", "]")); + } + return retVal.join(" "); +} +exports.RULES = [ + // Single role rules - alphabetically sorted + // Article role + new SRRendererRule_1.SRRendererRule({ + roles: ["article"], + elems: [], + modes: ["item", "article", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (mode === "tab_focus" && !CommonUtil_1.CommonUtil.isTabbable(cursor.getNode())) + return null; + var roleDesc = (0, common_1.getRoleDescription)(cursor, "article"); + return "[".concat((0, common_1.quoteNamePadAfter)(cursor)).concat(roleDesc, "]"); + } + ] + }), + // Banner role + new SRRendererRule_1.SRRendererRule({ + roles: ["banner"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (mode === "tab_focus" && !CommonUtil_1.CommonUtil.isTabbable(cursor.getNode())) + return null; + var roleDesc = (0, common_1.getRoleDescription)(cursor, "banner region"); + return "[".concat((0, common_1.quoteNamePadAfter)(cursor)).concat(roleDesc, "]"); + } + ] + }), + // Blockquote role + new SRRendererRule_1.SRRendererRule({ + roles: ["blockquote"], + elems: [], + modes: ["item", "region"], + tests: [ + function (_cursor) { return "[blockquote]"; } + ] + }), + // Caption role + new SRRendererRule_1.SRRendererRule({ + roles: ["caption"], + elems: [], + modes: ["item", "region"], + tests: [ + function (_cursor) { return "[caption]"; } + ] + }), + // Cell role + new SRRendererRule_1.SRRendererRule({ + roles: ["cell"], + elems: [], + modes: ["item", "table"], + tests: [ + renderEnterTableCell + ] + }), + // Columnheader role + new SRRendererRule_1.SRRendererRule({ + roles: ["columnheader"], + elems: [], + modes: ["item", "table"], + tests: [ + renderEnterTableCell + ] + }), + // Complementary role + new SRRendererRule_1.SRRendererRule({ + roles: ["complementary"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (mode === "tab_focus" && !CommonUtil_1.CommonUtil.isTabbable(cursor.getNode())) + return null; + return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "complementary region]"); + } + ] + }), + // Contentinfo role + new SRRendererRule_1.SRRendererRule({ + roles: ["contentinfo"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (mode === "tab_focus" && !CommonUtil_1.CommonUtil.isTabbable(cursor.getNode())) + return null; + return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "content info region]"); + } + ] + }), + // Figure role + new SRRendererRule_1.SRRendererRule({ + roles: ["figure"], + elems: [], + modes: ["item", "region"], + tests: [ + function (_cursor) { return "[figure]"; } + ] + }), + // Form role + new SRRendererRule_1.SRRendererRule({ + roles: ["form"], + elems: [], + modes: ["item", "region", "formcontrol"], + tests: [ + function (cursor) { + if (cursor.getNameInfo() === null) { + return "[section]"; + } + else { + return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "form region]"); + } + } + ] + }), + // Group role + new SRRendererRule_1.SRRendererRule({ + roles: ["group"], + elems: [], + modes: ["item", "region"], + tests: [ + function (cursor) { + var _a; + if (cursor.getNameInfo() === null) + return null; + if (((_a = cursor.getCurrentOrParentByRoleClone(["combobox"], ["select"])) === null || _a === void 0 ? void 0 : _a.getNode().nodeName.toUpperCase()) === "SELECT") { + return ""; + } + if (cursor.getNode().nodeName.toUpperCase() === "DETAILS") { + return "[button, ".concat(cursor.getElement().hasAttribute("open") ? "expanded" : "collapsed", "]"); + } + else { + return "[grouping".concat((0, common_1.quoteNamePadBefore)(cursor), "]"); + } + } + ] + }), + // -- tab_focus + new SRRendererRule_1.SRRendererRule({ + roles: ["group"], + elems: [], + modes: ["tab_focus"], + tests: [ + function (cursor) { + var _a; + if (cursor.getNameInfo() === null) + return null; + if (((_a = cursor.getCurrentOrParentByRoleClone(["combobox"], ["select"])) === null || _a === void 0 ? void 0 : _a.getNode().nodeName.toUpperCase()) === "SELECT") { + return ""; + } + if (cursor.getNode().nodeName.toUpperCase() === "DETAILS") { + return "[button, ".concat(cursor.getElement().hasAttribute("open") ? "expanded" : "collapsed", "]"); + } + else { + return ""; + } + } + ] + }), + // List role + new SRRendererRule_1.SRRendererRule({ + roles: ["list"], + elems: [], + modes: ["item", "list"], + tests: [ + function (cursor) { + var _a; + var node = cursor.getNode(); + var descendantListItems = document.evaluate(".//li | .//*[@role='listitem']", node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + // Count items, excluding those in other lists or within presentational containers + var numItems = 0; + for (var i = 0; i < descendantListItems.snapshotLength; i++) { + var item = descendantListItems.snapshotItem(i); + // Walk up ancestors to check for both nested lists and presentational containers + var isInOtherList = false; + var hasPresentationalAncestor = false; + var ancestor = item.parentElement; + while (ancestor && ancestor !== node) { + // Check if ancestor is another list + var ancestorRole = AriaUtil_1.AriaUtil.getResolvedRole(ancestor); + if (ancestorRole === "list" || + ancestor.nodeName.toUpperCase() === "UL" || + ancestor.nodeName.toUpperCase() === "OL") { + isInOtherList = true; + break; + } + // Check if ancestor has presentational children + if (ancestorRole && ((_a = ARIADefinitions_1.ARIADefinitions.designPatterns[ancestorRole]) === null || _a === void 0 ? void 0 : _a.presentationalChildren)) { + hasPresentationalAncestor = true; + break; + } + ancestor = ancestor.parentElement; + } + if (!isInOtherList && !hasPresentationalAncestor) { + numItems++; + } + } + if (numItems === 0) + return null; + return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "list of ").concat(numItems, " items]"); + } + ] + }), + // Main role + new SRRendererRule_1.SRRendererRule({ + roles: ["main"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (mode === "tab_focus" && !CommonUtil_1.CommonUtil.isTabbable(cursor.getNode())) + return null; + return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "main region]"); + } + ] + }), + // menubar role + new SRRendererRule_1.SRRendererRule({ + roles: ["menubar"], + elems: [], + modes: ["item", "list"], + tests: [ + function (cursor) { + var node = cursor.getNode(); + var descendantListItems = document.evaluate(".//*[@role='menuitem']", node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + var descendantListItemsInOtherLists = document.evaluate(".//*[@role='menubar']//*[@role='menuitem']|.//*[@role='menu']//*[@role='menuitem']", node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + // const descendantContainers = document.evaluate(".//*[@role='menuitem']/*[@role='menu']", node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + // const descendantContainers2 = document.evaluate(".//*[@role='menubar']//*[@role='menuitem']/*[@role='menu']|.//*[@role='menu']//*[@role='menuitem']/*[@role='menu']", node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + console.log("MENUBAR", cursor.isEndTag() ? "/" : "", cursor.getNode()); + console.log(descendantListItems, descendantListItemsInOtherLists); //, descendantContainers, descendantContainers2) + var numItems = descendantListItems.snapshotLength - descendantListItemsInOtherLists.snapshotLength; //-descendantContainers.snapshotLength+descendantContainers2.snapshotLength; + if (numItems === 0) + return null; + return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "menubar with ").concat(numItems, " items]"); + } + ] + }), + // Navigation role + new SRRendererRule_1.SRRendererRule({ + roles: ["navigation"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (mode === "tab_focus" && !CommonUtil_1.CommonUtil.isTabbable(cursor.getNode())) + return null; + var roleDesc = (0, common_1.getRoleDescription)(cursor, "navigation region"); + return "[".concat((0, common_1.quoteNamePadAfter)(cursor)).concat(roleDesc, "]"); + } + ] + }), + // Radio group role + new SRRendererRule_1.SRRendererRule({ + roles: ["radiogroup"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (cursor) { + if (cursor.getNameInfo() === null) + return null; + return "[grouping".concat((0, common_1.quoteNamePadBefore)(cursor), "]"); + } + ] + }), + // Region role + new SRRendererRule_1.SRRendererRule({ + roles: ["region"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (cursor.getNameInfo() === null) + return null; + if (mode === "tab_focus" && !CommonUtil_1.CommonUtil.isTabbable(cursor.getNode())) + return null; + var roleDesc = (0, common_1.getRoleDescription)(cursor, "region"); + return "[".concat((0, common_1.quoteNamePadAfter)(cursor)).concat(roleDesc, "]"); + } + ] + }), + // Row role + new SRRendererRule_1.SRRendererRule({ + roles: ["row"], + elems: [], + modes: ["item", "table"], + tests: [ + function () { return ""; } + ] + }), + // Rowheader role + new SRRendererRule_1.SRRendererRule({ + roles: ["rowheader"], + elems: [], + modes: ["item", "table"], + tests: [ + renderEnterTableCell + ] + }), + // Search role + new SRRendererRule_1.SRRendererRule({ + roles: ["search"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (mode === "tab_focus" && !CommonUtil_1.CommonUtil.isTabbable(cursor.getNode())) + return null; + var roleDesc = (0, common_1.getRoleDescription)(cursor, "search region"); + return "[".concat((0, common_1.quoteNamePadAfter)(cursor)).concat(roleDesc, "]"); + } + ] + }), + // Table role + new SRRendererRule_1.SRRendererRule({ + roles: ["table"], + elems: [], + modes: ["item", "table"], + tests: [ + function (cursor) { + var tableWalker = cursor.clone(); + // Get to the start of the table + while (tableWalker.getRole() !== "table" && tableWalker.previous(function () { return true; })) + ; + // Set an end to the table + var tableNode = tableWalker.getNode(); + var rows = 0; + var cols = 0; + // Sanity check that the table has content + if (tableWalker.getNode().firstChild) { + var firstRowComplete = false; + while (tableWalker.next(function () { return true; }) && !tableWalker.getNode().isSameNode(tableNode)) { + var role = tableWalker.getRole(); + if (tableWalker.isStartTag()) { + if (role === "row") { + ++rows; + } + else { + if (!firstRowComplete && ["cell", "rowheader", "columnheader"].includes(role)) { + var elem = tableWalker.getNode(); + cols += parseInt(elem.getAttribute("colspan") || "1"); + } + } + } + else if (role === "row") { + firstRowComplete = true; + } + } + } + return "[table with ".concat(rows, " ").concat(rows === 1 ? "row" : "rows", " and ").concat(cols, " ").concat(cols === 1 ? "column" : "columns").concat((0, common_1.quoteNamePadBefore)(cursor), "]"); + } + ] + }), + // Toolbar role + new SRRendererRule_1.SRRendererRule({ + roles: ["toolbar"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (mode === "tab_focus" && !CommonUtil_1.CommonUtil.isTabbable(cursor.getNode())) + return null; + return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "toolbar]"); + } + ] + }), + // HTML Element rules + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["DL"], + modes: ["item", "list"], + tests: [ + function (cursor) { + var node = cursor.getNode(); + var descendantListItems = document.evaluate(".//dt", node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + var numItems = descendantListItems.snapshotLength; + return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "definition list of ").concat(numItems, " terms]"); + } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["FIGCAPTION"], + modes: ["item"], + tests: [ + function (_cursor) { return "[caption]"; } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["MARK"], + modes: ["item"], + tests: [ + function (_cursor) { return "[highlighted]"; } + ] + }), + // Multiple roles rules - placed at the bottom + // Heading mode rules - ignore container elements in heading mode (multiple roles) + new SRRendererRule_1.SRRendererRule({ + roles: ["article", "banner", "blockquote", "caption", "cell", "columnheader", + "complementary", "contentinfo", "figure", "form", "group", "region", + "row", "rowheader", "search", "toolbar", "list", "main", "navigation", "table"], + elems: [], + modes: ["heading"], + tests: [ + function () { return ""; } + ] + }) +]; + + +/***/ }, + +/***/ "./src/v4/simulator/render_rules/containter_exit.ts" +/*!**********************************************************!*\ + !*** ./src/v4/simulator/render_rules/containter_exit.ts ***! + \**********************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.RULES = void 0; +var SRRendererRule_1 = __webpack_require__(/*! ../SRRendererRule */ "./src/v4/simulator/SRRendererRule.ts"); +var common_1 = __webpack_require__(/*! ./common */ "./src/v4/simulator/render_rules/common.ts"); +exports.RULES = [ + // Single role rules - alphabetically sorted + // Article role + new SRRendererRule_1.SRRendererRule({ + roles: ["article"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var roleDesc = (0, common_1.getRoleDescription)(cursor, "article"); + return "[out of ".concat(roleDesc, "]"); + } + ] + }), + // Banner role + new SRRendererRule_1.SRRendererRule({ + roles: ["banner"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var roleDesc = (0, common_1.getRoleDescription)(cursor, "banner region"); + return "[out of ".concat(roleDesc, "]"); + } + ] + }), + // Blockquote role + new SRRendererRule_1.SRRendererRule({ + roles: ["blockquote"], + elems: [], + modes: ["item"], + tests: [ + function (_cursor) { return "[out of blockquote]"; } + ] + }), + // Caption role + new SRRendererRule_1.SRRendererRule({ + roles: ["caption"], + elems: [], + modes: ["item"], + tests: [ + function (_cursor) { return "[out of caption]"; } + ] + }), + // Complementary role + new SRRendererRule_1.SRRendererRule({ + roles: ["complementary"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var roleDesc = (0, common_1.getRoleDescription)(cursor, "complementary region"); + return "[out of ".concat(roleDesc, "]"); + } + ] + }), + // Contentinfo role + new SRRendererRule_1.SRRendererRule({ + roles: ["contentinfo"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var roleDesc = (0, common_1.getRoleDescription)(cursor, "content info region"); + return "[out of ".concat(roleDesc, "]"); + } + ] + }), + // Figure role + new SRRendererRule_1.SRRendererRule({ + roles: ["figure"], + elems: [], + modes: ["item", "region"], + tests: [ + function (_cursor) { return "[out of figure]"; } + ] + }), + // Form role + new SRRendererRule_1.SRRendererRule({ + roles: ["form"], + elems: [], + modes: ["item", "region", "formcontrol"], + tests: [ + function (cursor) { + if (cursor.getNameInfo() === null) { + return "[out of section]"; + } + else { + return "[out of form]"; + } + } + ] + }), + // Group role + new SRRendererRule_1.SRRendererRule({ + roles: ["group"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var _a; + if (cursor.getNameInfo() === null) + return null; + if (((_a = cursor.getCurrentOrParentByRoleClone(["combobox"], ["select"])) === null || _a === void 0 ? void 0 : _a.getNode().nodeName.toUpperCase()) === "SELECT") { + return ""; + } + else + return "[out of grouping]"; + } + ] + }), + // List role + new SRRendererRule_1.SRRendererRule({ + roles: ["list"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var node = cursor.getNode(); + var descendantListItems = document.evaluate(".//li | .//*[@role='listitem']", node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + var descendantListItemsInOtherLists = document.evaluate(".//ul//li|.//ul//*[@role='listitem']|.//ol//li|.//ol//*[@role='listitem']|.//*[@role='list']//li|.//*[@role='list']//*[@role='listitem']", node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + var numItems = descendantListItems.snapshotLength - descendantListItemsInOtherLists.snapshotLength; + if (numItems === 0) + return null; + return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "out of list]"); + } + ] + }), + // Main role + new SRRendererRule_1.SRRendererRule({ + roles: ["main"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var roleDesc = (0, common_1.getRoleDescription)(cursor, "main region"); + return "[out of ".concat(roleDesc, "]"); + } + ] + }), + // menubar role + new SRRendererRule_1.SRRendererRule({ + roles: ["menubar"], + elems: [], + modes: ["item", "list"], + tests: [ + function (_cursor) { return "[out of menubar]"; } + ] + }), + // Navigation role + new SRRendererRule_1.SRRendererRule({ + roles: ["navigation"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var roleDesc = (0, common_1.getRoleDescription)(cursor, "navigation region"); + return "[out of ".concat(roleDesc, "]"); + } + ] + }), + // radiogroup role + new SRRendererRule_1.SRRendererRule({ + roles: ["radiogroup"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (_cursor) { return "[out of grouping]"; } + ] + }), + // Region role + new SRRendererRule_1.SRRendererRule({ + roles: ["region"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + if (cursor.getNameInfo() === null) + return null; + var roleDesc = (0, common_1.getRoleDescription)(cursor, "region"); + return "[out of ".concat(roleDesc, "]"); + } + ] + }), + // Search role + new SRRendererRule_1.SRRendererRule({ + roles: ["search"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var roleDesc = (0, common_1.getRoleDescription)(cursor, "search region"); + return "[out of ".concat(roleDesc, "]"); + } + ] + }), + // Table role + new SRRendererRule_1.SRRendererRule({ + roles: ["table"], + elems: [], + modes: ["item"], + tests: [ + function (_cursor) { return "[out of table]"; } + ] + }), + // Toolbar role + new SRRendererRule_1.SRRendererRule({ + roles: ["toolbar"], + elems: [], + modes: ["item"], + tests: [ + function (_cursor) { return "[out of toolbar]"; } + ] + }), + // HTML Element rules + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["ABBR"], + modes: ["item"], + tests: [ + function (cursor) { return cursor.getElement().hasAttribute("title") ? + "[".concat(cursor.getElement().getAttribute("title"), "]") : null; } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["DL"], + modes: ["item"], + tests: [ + function (_cursor) { return "[out of definition list]"; } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["FIGCAPTION"], + modes: ["item"], + tests: [ + function (_cursor) { return "[out of caption]"; } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["MARK"], + modes: ["item"], + tests: [ + function (_cursor) { return "[out of highlighted]"; } + ] + }), + // Multiple roles rules - placed at the bottom + // Region mode rules - ignore container elements in region and heading mode + new SRRendererRule_1.SRRendererRule({ + roles: ["group", "article", "banner", "blockquote", "caption", "complementary", + "contentinfo", "figure", "form", "list", "region", "main", "navigation", + "search", "table", "toolbar"], + elems: [], + modes: ["region", "heading"], + tests: [ + function () { return ""; } + ] + }), +]; + + +/***/ }, + +/***/ "./src/v4/simulator/render_rules/index.ts" +/*!************************************************!*\ + !*** ./src/v4/simulator/render_rules/index.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.CONTAINER_EXIT_RULES = exports.CONTAINER_ENTER_RULES = exports.SR_RULES = void 0; +var common_1 = __webpack_require__(/*! ./common */ "./src/v4/simulator/render_rules/common.ts"); +var container_enter_1 = __webpack_require__(/*! ./container_enter */ "./src/v4/simulator/render_rules/container_enter.ts"); +var containter_exit_1 = __webpack_require__(/*! ./containter_exit */ "./src/v4/simulator/render_rules/containter_exit.ts"); +exports.SR_RULES = common_1.RULES; +exports.CONTAINER_ENTER_RULES = container_enter_1.RULES; +exports.CONTAINER_EXIT_RULES = containter_exit_1.RULES; + + +/***/ }, + +/***/ "./src/v4/util/AccNameUtil.ts" +/*!************************************!*\ + !*** ./src/v4/util/AccNameUtil.ts ***! + \************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.AccNameUtil = void 0; +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var CommonUtil_1 = __webpack_require__(/*! ./CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var AriaUtil_1 = __webpack_require__(/*! ./AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ./VisUtil */ "./src/v4/util/VisUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ./CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +var AccNameUtil = /** @class */ (function () { + function AccNameUtil() { + } + /** + * Computes the accessible name for an SVG element according to W3C specification + * Following the Accessible Name and Description Computation 1.1 algorithm + * https://www.w3.org/TR/accname-1.1/ + * + * @param elem The SVG element + * @returns The accessible name result or null if no accessible name is found + */ + AccNameUtil.computeAccessibleNameForSVGElementW3C = function (elem) { + if (!elem || elem.nodeName.toLowerCase() !== 'svg') + return null; + // Step 1: Check for aria-labelledby (already handled by main computeAccessibleName function) + // Step 2: Check for aria-label (already handled by main computeAccessibleName function) + // Step 3: Check for title element + var svgTitles = elem.querySelectorAll(":scope > title"); + if (svgTitles && svgTitles.length > 0) { + var text_1 = ""; + svgTitles.forEach(function (svgTitle) { + if (svgTitle && !VisUtil_1.VisUtil.isNodeHiddenFromAT(svgTitle) && !VisUtil_1.VisUtil.isNodePresentational(svgTitle)) { + var title = svgTitle.textContent; + if (title && title.trim() !== '') + text_1 += title.trim(); + } + }); + if (text_1 && text_1.trim() !== '') + return { "name": text_1.trim(), "nameFrom": "svgTitle" }; + } + // Step 4: Check for text content in SVG text elements + var textContent = ""; + var textElements = elem.querySelectorAll("text, textPath, tspan"); + if (textElements && textElements.length > 0) { + textElements.forEach(function (textElement) { + if (!VisUtil_1.VisUtil.isNodeHiddenFromAT(textElement) && !VisUtil_1.VisUtil.isNodePresentational(textElement)) { + var content = textElement.textContent; + if (content && content.trim() !== '') + textContent += " " + content.trim(); + } + }); + if (textContent.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(textContent.trim()), "nameFrom": "svgText" }; + } + // Step 5: Check for xlink:title attribute on links within SVG + var links = elem.querySelectorAll("a"); + for (var i = 0; i < links.length; i++) { + var link = links[i]; + if (!VisUtil_1.VisUtil.isNodeHiddenFromAT(link) && !VisUtil_1.VisUtil.isNodePresentational(link)) { + var xlinkTitle = link.getAttribute("xlink:title"); + if (xlinkTitle && xlinkTitle.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(xlinkTitle), "nameFrom": "svglinkTitle" }; + } + } + // Step 6: Check for aria-describedby or aria-description + var description = AriaUtil_1.AriaUtil.getAriaDescription(elem); + if (description && description.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(description), "nameFrom": "aria-description" }; + // Step 7: Check for desc element + var descElements = elem.querySelectorAll(":scope > desc"); + if (descElements && descElements.length > 0) { + var descText_1 = ""; + descElements.forEach(function (descElement) { + if (!VisUtil_1.VisUtil.isNodeHiddenFromAT(descElement) && !VisUtil_1.VisUtil.isNodePresentational(descElement)) { + var desc = descElement.textContent; + if (desc && desc.trim() !== '') + descText_1 += " " + desc.trim(); + } + }); + if (descText_1.trim() !== '') + return { "name": descText_1.trim(), "nameFrom": "svgDesc" }; + } + // Step 8: Check for title attribute + if (elem.hasAttribute("title")) { + var title = elem.getAttribute("title"); + if (title && title.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(title), "nameFrom": "title" }; + } + // No accessible name found + return null; + }; + // calculate accessible name for a given node + AccNameUtil.computeAccessibleName = function (elem) { + if (!elem) + return null; + var nodeName = elem.nodeName.toLowerCase(); + var name_pair = CacheUtil_1.CacheUtil.getCache(elem, "ELEMENT_ACCESSBLE_NAME", undefined); + if (name_pair !== undefined) + return name_pair; + // 1. name from author, or elements without a role but with aria-labelledby or aria-label + // get aria label even for the role where the name is prohibited or is 'presentation' or 'none' + var accName = AriaUtil_1.AriaUtil.getAriaLabel(elem); + if (accName && accName.trim() !== "") { + CacheUtil_1.CacheUtil.setCache(elem, "ELEMENT_ACCESSBLE_NAME", { "name": CommonUtil_1.CommonUtil.truncateText(accName), "nameFrom": "ariaLabel" }); + return { "name": CommonUtil_1.CommonUtil.truncateText(accName), "nameFrom": "ariaLabel" }; + } + // 2. accessible name mapping for native html elements + name_pair = AccNameUtil.computeAccessibleNameForNativeElement(elem); + if (name_pair) { + CacheUtil_1.CacheUtil.setCache(elem, "ELEMENT_ACCESSBLE_NAME", name_pair); + return name_pair; + } + // 3. name from native or aria attribute + /**name_pair = AccNameUtil.computeAccessibleNameFromAttribute(elem); + if (name_pair) { + CacheUtil.setCache(elem, "ELEMENT_ACCESSBLE_NAME", name_pair); + return name_pair; + }*/ + // 4. name from content for custom elements with a role + var role = AriaUtil_1.AriaUtil.getResolvedRole(elem); + if (ARIADefinitions_1.ARIADefinitions.designPatterns[role] && ARIADefinitions_1.ARIADefinitions.designPatterns[role].nameFrom.includes("contents")) { + name_pair = AccNameUtil.computeAccessibleNameFromContent(elem); + if (name_pair) { + CacheUtil_1.CacheUtil.setCache(elem, "ELEMENT_ACCESSBLE_NAME", name_pair); + return name_pair; + } + } + // 5. name from the global attribute "title" + if (elem.hasAttribute("title")) { + var title = elem.getAttribute("title").trim(); + if (title && title.trim().length > 0) { + title = CommonUtil_1.CommonUtil.truncateText(title); + CacheUtil_1.CacheUtil.setCache(elem, "ELEMENT_ACCESSBLE_NAME", { "name": title, "nameFrom": "title" }); + return { "name": title, "nameFrom": "title" }; + } + } + // 6. name from the attribute "placeholder" + if (nodeName === 'textarea' || (nodeName === 'input' && (!elem.hasAttribute("type") || CommonUtil_1.CommonUtil.input_type_with_placeholder.includes(elem.getAttribute("type"))))) { + var placeholder = elem.getAttribute("placeholder"); + if (placeholder && placeholder.trim().length > 0) { + placeholder = CommonUtil_1.CommonUtil.truncateText(placeholder); + CacheUtil_1.CacheUtil.setCache(elem, "ELEMENT_ACCESSBLE_NAME", { "name": placeholder, "nameFrom": "placeholder" }); + return { "name": placeholder, "nameFrom": "placeholder" }; + } + } + CacheUtil_1.CacheUtil.setCache(elem, "ELEMENT_ACCESSBLE_NAME", null); + return null; + }; + // calculate accessible name for native elements + AccNameUtil.computeAccessibleNameForNativeElement = function (elem) { + var nodeName = elem.nodeName.toLowerCase(); + // labellable fields + if (CommonUtil_1.CommonUtil.form_labelable_elements.includes(nodeName)) { + // Get only the non-hidden labels for element + var label = CommonUtil_1.CommonUtil.getFormFieldLabel(elem); + if (label && label.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(label), "nameFrom": "label" }; + } + // input types: button, reset, submit, image + if (nodeName === "input" && elem.hasAttribute("type")) { + if (CommonUtil_1.CommonUtil.form_button_types.includes(elem.getAttribute("type"))) { + // input types: button, reset, submit + // Get the "value" attribute for the element + var value = CommonUtil_1.CommonUtil.getElementAttribute(elem, "value"); + if (value && value.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(value), "nameFrom": "value" }; + // input 'submit' and 'reset' have visible defaults so pass if there is no explicit 'value' attribute + var type = elem.getAttribute("type"); + if (type === 'submit' || type === 'reset') + return { "name": type, "nameFrom": "internal" }; + } + else if (elem.getAttribute("type") === 'image') { + // input type = 'image' + // note that though HTML 5 spec indicates "The element's [value] attribute must be omitted", Chrome uses the value. + // Get the accessible name for the alt attribute + var alt = CommonUtil_1.CommonUtil.getElementAttribute(elem, "alt"); + if (alt && alt.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(alt), "nameFrom": "alt" }; + ; + // the visible default text for type "image" is "Submit" same with the type "submit" + //return {"name":elem.getAttribute("type"), "nameFrom": "internal"}; + } + } + // button + // note button may have a value attribute, but it's not a visible text + if (nodeName === "button") { + // first use the button text + var text = elem.innerText; + if (text && text.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "text" }; + // for image button: get the first image if exists + var image = elem.querySelector('img'); + if (image && !VisUtil_1.VisUtil.isNodeHiddenFromAT(image) && !VisUtil_1.VisUtil.isNodePresentational(image)) { + var pair = AccNameUtil.computeAccessibleName(image); + if (pair && pair.name && pair.name.trim().length > 0) + return pair; + } + // for a button with a svg image + var svg = elem.querySelector('svg'); + if (svg && !VisUtil_1.VisUtil.isNodeHiddenFromAT(svg) && !VisUtil_1.VisUtil.isNodePresentational(svg)) { + var pair = AccNameUtil.computeAccessibleName(svg); + if (pair && pair.name && pair.name.trim().length > 0) + return pair; + } + } + // fieldset + if (nodeName === "fieldset") { + // if the fieldset element's first child is a legend element, then use the subtree of the legend + var first = elem.firstElementChild; + if (first && first.nodeName.toLowerCase() === 'legend') { + // legend can be mixed text + var text = first.innerText; + if (text && text.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "legend" }; + } + } + // output + if (nodeName === "output") { + // if the associated label element exists, use concatenated accessible name(s) from labelled elements. + if (elem.hasAttribute("for")) { + var labelIDs = elem.getAttribute("for").trim().split(" "); + if (labelIDs && labelIDs.length > 0) { + var label = ""; + for (var j = 0; j < labelIDs.length; j++) { + var labelNode = elem.ownerDocument.getElementById(labelIDs[j]); + if (labelNode && !DOMUtil_1.DOMUtil.sameNode(labelNode, elem) && !VisUtil_1.VisUtil.isNodeHiddenFromAT(labelNode) && !VisUtil_1.VisUtil.isNodePresentational(labelNode)) { + var pair = AccNameUtil.computeAccessibleName(labelNode); + if (pair && pair.name && pair.name.trim().length > 0) + label += " " + CommonUtil_1.CommonUtil.normalizeSpacing(pair.name); + } + } + if (label.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(label), "nameFrom": "label" }; + } + } + } + // summary + if (nodeName === "summary") { + // use summary element subtree + var text = elem.innerText; + if (text && text.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "legend" }; + } + // details + if (nodeName === "details") { + var first = elem.firstElementChild; + if (first && first.nodeName.toLowerCase() === 'summary') { + // get accessible name from summary + var pair = AccNameUtil.computeAccessibleName(first); + if (pair && pair.name && pair.name.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(pair.name.trim()), "nameFrom": "summary" }; + } + // If no summary element as a direct child of the details element, + // the user agent should provide one with a subtree containing a localized string of the word "details". + return { "name": "details", "nameFrom": "internal" }; + } + // figure + if (nodeName === "figure") { + // if the figure element has a figcaption as a child + var caption = CommonUtil_1.CommonUtil.getChildByTagHidden(elem, "figcaption", true, false); + if (caption && caption.length > 0) { + // figcaption can be mixed text + var text = caption[0].innerText; + if (text && text.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "figcaption" }; + } + } + // img elements: use attribute "alt" + if (nodeName === "img") { + if (elem.hasAttribute("alt")) { + var alt = elem.getAttribute("alt"); + return { "name": CommonUtil_1.CommonUtil.truncateText(alt), "nameFrom": "alt" }; + } + } + // area elements: use attribute "alt" + if (nodeName === "area") { + if (elem.hasAttribute("alt")) { + var alt = elem.getAttribute("alt"); + if (alt && alt.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(alt), "nameFrom": "alt" }; + } + } + // table element + if (nodeName === "table") { + // if the figure element has a caption as the first child + var captionElem = elem.firstElementChild; + if (captionElem && captionElem.nodeName.toLowerCase() === 'caption') { + // caption can be mixed text + var caption = captionElem.innerText; + if (caption && caption.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(caption), "nameFrom": "caption" }; + } + } + // a element + if (nodeName === "a") { + // first use the link text + var text = elem.innerText; + if (text && text.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "text" }; + //for image link: get the image or svg if exists + var images = elem.querySelectorAll(":scope > img, :scope > svg"); + if (images && images.length > 0) { + var text_2 = ""; + images.forEach(function (image) { + if (!VisUtil_1.VisUtil.isNodeHiddenFromAT(image) && !VisUtil_1.VisUtil.isNodePresentational(image)) { + var pair = AccNameUtil.computeAccessibleName(image); + if (pair && pair.name && pair.name.trim().length > 0) + text_2 += " " + pair.name.trim(); + } + }); + if (text_2.trim() !== '') + return { "name": text_2.trim(), "nameFrom": "alt" }; + } + } + // optgroup + // label participate in accessible name calculation: https://www.w3.org/TR/html-aam-1.0/#att-label + // The label attribute must be specified. Its value gives the name of the group + // the value is disabled in the interface + if (nodeName === "optgroup" || nodeName === "option" || nodeName === "track") { + var label = elem.getAttribute("label"); + if (label && label.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(label), "nameFrom": "label" }; + } + // svg + if (nodeName === "svg") { + var pair = AccNameUtil.computeAccessibleNameForSVGElementW3C(elem); + if (pair && pair.name && pair.name.trim().length > 0) + return pair; + } + return null; + }; + // calculate accessible name for native elements + AccNameUtil.computeAccessibleNameForSVGElement = function (elem) { + // 1. a direct child or descendant title element + var svgTitles = elem.querySelectorAll(":scope > title"); + if (svgTitles && svgTitles.length > 0) { + var text_3 = ""; + svgTitles.forEach(function (svgTitle) { + if (svgTitle && !VisUtil_1.VisUtil.isNodeHiddenFromAT(svgTitle) && !VisUtil_1.VisUtil.isNodePresentational(svgTitle)) { + var title = svgTitle.textContent; + if (title && title.trim() !== '') + text_3 += title.trim(); + } + }); + if (text_3 && text_3.trim() !== '') + return { "name": text_3.trim(), "nameFrom": "svgTitle" }; + } + // 2. xlink:title attribute on a link + var linkTitle = elem.querySelector("a"); + if (linkTitle && !VisUtil_1.VisUtil.isNodeHiddenFromAT(linkTitle) && !VisUtil_1.VisUtil.isNodePresentational(linkTitle)) { + var link = linkTitle.getAttribute("xlink:title"); + if (link && link.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(link), "nameFrom": "svglinkTitle" }; + } + /** 3. for text container elements, the text content. + * note the SVG text content elements are: ‘text’, ‘textPath’ and ‘tspan’. + * svg element can be nested. One of the purposes is to to group SVG shapes together as a collection for responsive design. + * + * select text content excluded the text from the nested svg elements and their children + */ + var text = ""; + elem.querySelectorAll(":scope > *").forEach(function (element) { + if (element.nodeName.toLowerCase() !== 'svg' && !VisUtil_1.VisUtil.isNodeHiddenFromAT(element) && !VisUtil_1.VisUtil.isNodePresentational(element)) { + var value = CommonUtil_1.CommonUtil.getInnerText(element); + if (value && value.trim().length > 0) + text += value; + } + }); + if (text.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "svgText" }; + // 4. from aria-describedby or aria-description + var descby = AriaUtil_1.AriaUtil.getAriaDescription(elem); + if (descby && descby.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(descby), "nameFrom": "aria-description" }; + // 5. a direct child or descendant desc element + var descElems = elem.querySelectorAll(":scope > desc"); + if (descElems && descElems.length > 0) { + var text_4 = ""; + descElems.forEach(function (descElem) { + if (descElem && !VisUtil_1.VisUtil.isNodeHiddenFromAT(descElem) && !VisUtil_1.VisUtil.isNodePresentational(descElem)) { + var desc = descElem.textContent; + if (desc && desc.trim() !== '') + text_4 += desc.trim(); + } + }); + if (text_4 && text_4.trim() !== '') + return { "name": text_4.trim(), "nameFrom": "svgDesc" }; + } + }; + // calculate accessible name for custom elements marked with aria + AccNameUtil.computeAccessibleNameFromContent = function (elem) { + var nodeName = elem.nodeName.toLowerCase(); + var role = AriaUtil_1.AriaUtil.getResolvedRole(elem); + /** for acc name from content, the content from CSS pseudo-elements + * :before and :after pseudo elements [CSS2] can provide textual content for elements that have a content model. + * For :before or :after pseudo elements, user agents must prepend CSS textual content, without a space, + * to the textual content of the current node. + */ + var pair = AccNameUtil.computeAccessibleNameForCSSPseudoElement(elem, "before"); + if (pair !== null && pair.name && pair.name.trim().length > 0) + return pair; + pair = AccNameUtil.computeAccessibleNameForCSSPseudoElement(elem, "after"); + if (pair && pair.name && pair.name.trim().length > 0) + return pair; + // shadow host + if (elem.shadowRoot) { + pair = AccNameUtil.computeAccessibleNameForShadowHost(elem); + if (pair && pair.name && pair.name.trim().length > 0) + return { "name": pair.name, "nameFrom": "shadow" }; + ; + } + // slot element + if (nodeName === "slot") { + pair = AccNameUtil.computeAccessibleNameForSlotElement(elem); + if (pair && pair.name && pair.name.trim().length > 0) + return { "name": pair.name, "nameFrom": "slot" }; + } + // otherwise: get the value from the element + pair = AccNameUtil.computeAccessibleNameFromChildren(elem); + if (pair && pair.name && pair.name.trim().length > 0) + return { "name": pair.name, "nameFrom": "content" }; + // no accessible name exists + return null; + }; + // calculate accessible name from CSS generated content + AccNameUtil.computeAccessibleNameForCSSPseudoElement = function (elem, type) { + var contentElem = elem.ownerDocument.defaultView.getComputedStyle(elem, type); + if (contentElem) { + var content = contentElem.content; + if (content && content !== "none" && content !== "no" && content !== "normal") { + content = content.replace(/^"/, "").replace(/"$/, ""); + if (content.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(content), "nameFrom": "css-" + type }; + } + } + return null; + }; + // calculate accessible name for SLOT element + AccNameUtil.computeAccessibleNameForShadowHost = function (elem) { + var text = ""; + var shadowRoot = elem.shadowRoot; + if (shadowRoot) { + var children = shadowRoot.querySelectorAll('*'); + // check text from all the children elements + children.forEach(function (child) { + var pair = AccNameUtil.computeAccessibleName(child); + if (pair && pair.name && pair.name.trim().length > 0) + text += " " + pair.name.trim(); + }); + } + if (text.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "shadow-host" }; + return null; + }; + // calculate accessible name for SLOT element + AccNameUtil.computeAccessibleNameForSlotElement = function (elem) { + //if no assignedNode, check its own text + var text = ""; + if (!elem.assignedNodes() || elem.assignedNodes().length === 0) { + var pair = AccNameUtil.computeAccessibleName(elem); + if (pair && pair.name && pair.name.trim().length > 0) + text += " " + pair.name.trim(); + } + else { + // check text from all assigned nodes + for (var _i = 0, _a = elem.assignedNodes(); _i < _a.length; _i++) { + var slotChild = _a[_i]; + var pair = AccNameUtil.computeAccessibleName(slotChild); + if (pair && pair.name && pair.name.length > 0) + text += " " + pair.name.trim(); + } + } + if (text.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "content-slot" }; + return null; + }; + // calculate accessible name from children content + AccNameUtil.computeAccessibleNameFromChildren = function (elem) { + var text = ""; + //let walkChild = elem.firstChild; + var nw = new DOMWalker_1.DOMWalker(elem); + // Loop over all the childrens of the element to get the text + while (nw.nextNode() && nw.node !== elem && nw.node !== elem.parentNode) { + if (nw.bEndTag) + continue; + //while (walkChild) { + var walkChild = nw.node; + if (walkChild.nodeType === 3) { + // for the text node, get the parentnode to check visibility + var parent_1 = walkChild.parentElement; + if (!VisUtil_1.VisUtil.isNodeHiddenFromAT(parent_1) && !VisUtil_1.VisUtil.isNodePresentational(parent_1) && walkChild.nodeValue && walkChild.nodeValue.trim().length > 0) { + text += " " + walkChild.nodeValue.trim(); + } + } + else if (walkChild.nodeType === 1 && !VisUtil_1.VisUtil.isNodeHiddenFromAT(walkChild) && !VisUtil_1.VisUtil.isNodePresentational(walkChild)) { + var pair = AccNameUtil.computeAccessibleName(walkChild); + if (pair && pair.name && pair.name.length > 0) { + text += " " + pair.name.trim(); + nw.bEndTag = true; + } + // Skip children if this element only has presentational children + else if (AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(nw.node)) { + nw.bEndTag = true; + } + } + } + if (text.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "content" }; + return null; + }; + // if accessible name can be ignored for image or svg + AccNameUtil.isAccessibleNameIgnorable = function (elem) { + if (!elem) + return false; + var nodeName = elem.nodeName.toLowerCase(); + if (nodeName !== 'img' && nodeName !== 'svg') + return false; + var parent = elem.parentElement; + if (parent) { + // if the parent is a widget and has an aria label, then image/svg label is not necessary + if ((AriaUtil_1.AriaUtil.isWidget(parent) || AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(parent)) && AriaUtil_1.AriaUtil.hasAriaLabel(parent)) + return true; + } + return false; + }; + return AccNameUtil; +}()); +exports.AccNameUtil = AccNameUtil; + + +/***/ }, + +/***/ "./src/v4/util/AriaUtil.ts" +/*!*********************************!*\ + !*** ./src/v4/util/AriaUtil.ts ***! + \*********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.AriaUtil = void 0; +var CacheUtil_1 = __webpack_require__(/*! ./CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var ARIAMapper_1 = __webpack_require__(/*! ../../v2/aria/ARIAMapper */ "./src/v2/aria/ARIAMapper.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var VisUtil_1 = __webpack_require__(/*! ./VisUtil */ "./src/v4/util/VisUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ./CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ./AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +var AriaUtil = /** @class */ (function () { + function AriaUtil() { + } + AriaUtil.isDefinedAriaAttributeAtIndex = function (ele, index) { + var attrName = ele.attributes[index].name; + return AriaUtil.isDefinedAriaAttribute(ele, attrName); + }; + /** + * this method returns user-defined aria attribute name from dom + * @param ele element + * @returns user defined aria attributes + */ + AriaUtil.getUserDefinedAriaAttributes = function (elem) { + var ariaAttributes = []; + var domAttributes = elem.attributes; + if (domAttributes) { + for (var i = 0; i < domAttributes.length; i++) { + var attrName = domAttributes[i].name.trim().toLowerCase(); + var isAria = attrName.substring(0, 5) === 'aria-'; + if (isAria) + ariaAttributes.push(attrName); + } + } + return ariaAttributes; + }; + /** + * this method returns user-defined html attribute name from dom + * @param ele element + * @returns user defined html attributes + */ + AriaUtil.getUserDefinedHtmlAttributes = function (elem) { + var htmlAttributes = []; + var domAttributes = elem.attributes; + if (domAttributes) { + for (var i = 0; i < domAttributes.length; i++) { + var attrName = domAttributes[i].name.trim().toLowerCase(); + var isAria = attrName.substring(0, 5) === 'aria-'; + if (!isAria) + htmlAttributes.push(attrName); + } + } + return htmlAttributes; + }; + /** + * this method returns user-defined aria attribute name-value pair from dom + * @param ele element + * @returns user defined aria attributes + */ + AriaUtil.getUserDefinedAriaAttributeNameValuePairs = function (elem) { + var ariaAttributes = []; + var domAttributes = elem.attributes; + if (domAttributes) { + for (var i = 0; i < domAttributes.length; i++) { + var attrName = domAttributes[i].name.trim().toLowerCase(); + var attrValue = elem.getAttribute(attrName); + if (attrValue === '') + attrValue = null; + var isAria = attrName.substring(0, 5) === 'aria-'; + if (isAria) + ariaAttributes.push({ name: attrName, value: attrValue }); + } + } + return ariaAttributes; + }; + /** + * this method returns user-defined html attribute name-value pair from dom + * @param ele element + * @returns user defined html attributes + */ + AriaUtil.getUserDefinedHtmlAttributeNameValuePairs = function (elem) { + var htmlAttributes = []; + var domAttributes = elem.attributes; + if (domAttributes) { + for (var i = 0; i < domAttributes.length; i++) { + var attrName = domAttributes[i].name.trim().toLowerCase(); + var attrValue = elem.getAttribute(attrName); + if (attrValue === '') + attrValue = null; + var isAria = attrName.substring(0, 5) === 'aria-'; + if (!isAria) + htmlAttributes.push({ name: attrName, value: attrValue }); + } + } + return htmlAttributes; + }; + /** + * This method handles implicit aria definitions, for example, an input with checked is equivalent to aria-checked="true" + */ + AriaUtil.getAriaAttribute = function (ele, attributeName) { + // If the attribute is defined, it takes precedence + var retVal = ele.getAttribute(attributeName); + if (ele.hasAttribute(attributeName) && retVal.trim() === "") { //"" is treated as false, so we need return it before the below check + return retVal; + } + // Then determine implicit values from other attributes + if (!retVal) { + var tag = ele.nodeName.toLowerCase(); + if (attributeName in AriaUtil.ariaAttributeImplicitMappings) { + if (tag in AriaUtil.ariaAttributeImplicitMappings[attributeName]) { + retVal = AriaUtil.ariaAttributeImplicitMappings[attributeName][tag]; + if (typeof (retVal) === "function") { + retVal = retVal(ele); + } + } + else if ("*" in AriaUtil.ariaAttributeImplicitMappings[attributeName]) { + retVal = AriaUtil.ariaAttributeImplicitMappings[attributeName]["*"]; + if (typeof (retVal) === "function") { + retVal = retVal(ele); + } + } + } + } + // Check role-based defaults + if (!retVal) { + var role = ARIAMapper_1.ARIAMapper.nodeToRole(ele); + if (role in AriaUtil.ariaAttributeRoleDefaults && attributeName in AriaUtil.ariaAttributeRoleDefaults[role]) { + retVal = AriaUtil.ariaAttributeRoleDefaults[role][attributeName]; + if (typeof (retVal) === "function") { + retVal = retVal(ele); + } + } + } + // Still not defined? Check global defaults + if (!retVal && attributeName in AriaUtil.ariaAttributeGlobalDefaults) { + retVal = AriaUtil.ariaAttributeGlobalDefaults[attributeName]; + } + return retVal; + }; + AriaUtil.isDefinedAriaAttribute = function (ele, attrName) { + var isDefinedAriaAttribute = false; + if (attrName.substring(0, 5) === 'aria-') { + // User agents SHOULD treat state and property attributes with a value of "" the same as they treat an absent attribute. + isDefinedAriaAttribute = ele.hasAttribute && ele.hasAttribute(attrName) && ele.getAttribute(attrName).length > 0; + } + return isDefinedAriaAttribute; + }; + /** + * WAI-ARIA’s role attribute may have a list of values, but only the first valid and supported WAI-ARIA role is used + * https://www.w3.org/TR/wai-aria-implementation/#mapping_role_table + * This function is responsible for retrieving the resoled role for an element. + * @parm {HTMLElement} ele - element for which to find role. + * + * @return string - resolved role for the element: + * explicit role: resoled from the list of values + * implicit role: if not explicitely specified, or none of the specified role values is allowed for the element + * null: if none of the specified role values is allowed for the element, neither implicit role exists + * + * @memberOf AriaUtil + */ + AriaUtil.getResolvedRole = function (elem, considerImplicitRoles) { + if (considerImplicitRoles === void 0) { considerImplicitRoles = true; } + if (!elem) + return null; + var role = CacheUtil_1.CacheUtil.getCache(elem, "RPTUTIL_ELEMENT_RESOLVED_ROLE", null); + if (role === null) { + var roles = AriaUtil.getUserDefinedRoles(elem); + var tagProperty = AriaUtil.getElementAriaProperty(elem); + var allowedRoles = AriaUtil.getAllowedAriaRoles(elem, tagProperty); + var containsGeneric = false; + if (roles && roles.length > 0 && allowedRoles && allowedRoles.length > 0) { + for (var i = 0; i < roles.length; i++) { + if (allowedRoles.includes("any") || allowedRoles.includes(roles[i])) { + if (allowedRoles.includes("any") && roles[i] === 'generic') { + containsGeneric = true; + continue; + } + role = roles[i]; + if (role === "presentation" || role === "none") { + // If element is focusable, then presentation roles are to be ignored + if (CommonUtil_1.CommonUtil.isFocusable(elem)) { + //reset rule to null + role = null; + continue; + } + } + break; + } + } + if (containsGeneric) + role = 'generic'; + } + if (role === null && considerImplicitRoles) { + var implicitRole = AriaUtil.getImplicitRole(elem); + role = implicitRole && implicitRole.length > 0 ? implicitRole[0] : undefined; + } + CacheUtil_1.CacheUtil.setCache(elem, "RPTUTIL_ELEMENT_RESOLVED_ROLE", role); + } + return role !== undefined ? role : null; + }; + /** + * This function is responsible for retrieving user defined element's roles from dom. + * @parm {HTMLElement} ele - element for which to find role. + * + * @return {List} roles - list of user defined roles in the element role attribute. + * + * @memberOf AriaUtil + */ + AriaUtil.getUserDefinedRoles = function (ele) { + return AriaUtil.getRoles(ele, false); + }; + /** + * This function is responsible for retrieving element's roles. + * This function also finds implicit roles. + * @parm {HTMLElement} ele - element for which to find role. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {List} roles - list of attribute roles and implicit roles. + * + * @memberOf AriaUtil + */ + AriaUtil.getRoles = function (ele, considerImplicitRoles) { + var roles = []; + if (ele && ele.hasAttribute && ele.hasAttribute("role")) { + var attrRoles = CommonUtil_1.CommonUtil.normalizeSpacing(ele.getAttribute("role").trim()).split(" "); + for (var i = 0; i < attrRoles.length; ++i) { + roles.push(attrRoles[i]); + } + } + //check if implicit roles exist. + //Note: element can have multiple implicit roles + if (considerImplicitRoles) { + var implicitRole = AriaUtil.getImplicitRole(ele); + if (implicitRole !== null && implicitRole.length > 0) { + //add implicit roles to the attributes roles. + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(implicitRole, roles); + } + } + return roles; + }; + /** + * Returns the implicit role of the elemement + * @parm {HTMLElement} ele - element for which to find role. + * + * @return the implicit role or [] if doesn't exist + * + * @memberOf AriaUtil + */ + AriaUtil.getImplicitRole = function (ele) { + if (!ele || ele.nodeType !== 1) + return null; + var implicitRoles = CacheUtil_1.CacheUtil.getCache(ele, "AriaUtil_ImplicitRole", null); + if (!implicitRoles) { + var tagProperty = AriaUtil.getElementAriaProperty(ele); + // check if there are any implicit roles for this element. + if (tagProperty && tagProperty.implicitRole) { + if (tagProperty.implicitRole.includes("generic")) { + // the 'generic' role is only allowed if a valid aria attribute exists. + var domAriaAttributes_1 = AriaUtil.getUserDefinedAriaAttributes(ele); + if (domAriaAttributes_1.length === 0) { + CacheUtil_1.CacheUtil.setCache(ele, "AriaUtil_ImplicitRole", []); + return []; + } + var roleAttributes = []; + var pattern = ARIADefinitions_1.ARIADefinitions.designPatterns['generic']; + if (pattern.reqProps && pattern.reqProps.length > 0) + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(pattern.reqProps, roleAttributes); + if (tagProperty.globalAriaAttributesValid) + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(ARIADefinitions_1.ARIADefinitions.globalProperties, roleAttributes); + if (pattern.deprecatedProps && pattern.deprecatedProps.length > 0) + CommonUtil_1.CommonUtil.reduceArrayItemList(pattern.deprecatedProps, roleAttributes); + // remove 'generic' role if roleAttributes doesn't contain any of domAriaAttributes + if (roleAttributes.length > 0 && !roleAttributes.some(function (attr) { return domAriaAttributes_1.includes(attr); })) { + var implicit = CommonUtil_1.CommonUtil.reduceArrayItemList(['generic'], tagProperty.implicitRole); + CacheUtil_1.CacheUtil.setCache(ele, "AriaUtil_ImplicitRole", implicit); + return implicit; + } + } + CacheUtil_1.CacheUtil.setCache(ele, "AriaUtil_ImplicitRole", tagProperty.implicitRole); + return tagProperty.implicitRole; + } + CacheUtil_1.CacheUtil.setCache(ele, "AriaUtil_ImplicitRole", []); + return []; + } + return implicitRoles; + }; + /** + * Returns the required properties of the role + * @parm {string} role - the role + * @parm {HTMLElement} ele - element for which to find role. + * + * @return {List} properties - list of properties that are required by the role + * + * @memberOf AriaUtil + */ + AriaUtil.getRoleRequiredProperties = function (role, ele) { + if (role === null) { + return null; + } + if (ARIADefinitions_1.ARIADefinitions.designPatterns[role]) { + var requiredAttributes = ARIADefinitions_1.ARIADefinitions.designPatterns[role].reqProps; + // handle special case of separator + if (role.toLowerCase() === "separator" && ele && CommonUtil_1.CommonUtil.isFocusable(ele)) { + requiredAttributes = CommonUtil_1.CommonUtil.concatUniqueArrayItemList(["aria-valuenow"], requiredAttributes || []); + } + return requiredAttributes; + } + else { + return null; + } + }; + /** + * This function is responsible for finding if a element has given role. + * This function aslo finds if element has given roles as implicit role. + * @parm {HTMLElement} ele - element for which to find role. + * @parm {list or string} roles - List or single role for which to find if element has these roles. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {List} retVal - true or false based on if th element has the specified role. + * + * @memberOf AriaUtil + * + * Consider to use hasRoleInSemantics() instead. + */ + AriaUtil.hasRole = function (ele, role, considerImplicitRoles) { + var retVal = false; + if (ele && ele.hasAttribute && ele.hasAttribute("role")) { + if (typeof (role) != typeof ("")) { + var roles = ele.getAttribute("role").trim().split(" "); + for (var i = 0; !retVal && i < roles.length; ++i) { + retVal = roles[i] in role; + } + } + else { + var roles = ele.getAttribute("role").trim().split(" "); + for (var i = 0; !retVal && i < roles.length; ++i) { + retVal = roles[i] === role; + } + } + } + //if none of the the attribute roles matched with given role + //check if implicit roles matches. + //Note: element can have multiple implicit roles + if (!retVal && considerImplicitRoles) { + var wRoles = []; + //check if there are any implicit roles for this element. + var implicitRole = AriaUtil.getImplicitRole(ele); + if (implicitRole !== null && implicitRole.length > 0) { + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(implicitRole, wRoles); + //if role is array loop thru and see if any of the implicit role present in the array + if (typeof (role) != typeof ("")) { + for (var i = 0; !retVal && i < wRoles.length; ++i) { + retVal = wRoles[i] in role; + } + } + else { + for (var i = 0; !retVal && i < wRoles.length; ++i) { + retVal = wRoles[i] === role; + } + } + } + } + return retVal; + }; + /** + * Checks if the element has the role, including the implied role if role is not explicitly specified. + * + * This function is replacing the hasRole function + * + * @parm {HTMLElement} ele - element for which to find role. + * @parm {list or string} roles - List or single role for which to find if element has these roles. + * + * @return {List} retVal - true or false based on if the element has the specified role. + * + * @memberOf AriaUtil + */ + AriaUtil.hasRoleInSemantics = function (ele, role) { + var retVal = false; + var roleSpecified = false; + if (ele && ele.hasAttribute && ele.hasAttribute("role")) { + if (typeof (role) != typeof ("")) { + var roles = ele.getAttribute("role").trim().toLowerCase().split(/\s+/); + for (var i = 0; !retVal && i < roles.length; ++i) { + roleSpecified = true; + retVal = roles[i] in role; + } + } + else { + var roles = ele.getAttribute("role").trim().toLowerCase().split(/\s+/); + for (var i = 0; !retVal && i < roles.length; ++i) { + roleSpecified = true; + retVal = roles[i] === role; + } + } + } + if (roleSpecified) { + return retVal; + } + //check if implicit roles matches. + //Note: element can have multiple implicit roles + //check if there are any implicit roles for this element. + var impRoles = AriaUtil.getImplicitRole(ele); + if (impRoles !== null && impRoles.length > 0) { + //if role is array loop thru and see if any of the implicit role present in the array + if (typeof (role) != typeof ("")) { + for (var i = 0; !retVal && i < impRoles.length; ++i) { + retVal = impRoles[i] in role; + } + } + else { + for (var i = 0; !retVal && i < impRoles.length; ++i) { + retVal = impRoles[i] === role; + } + } + } + return retVal; + }; + /** + * This function is responsible for finding if a element has given role. + * This function also checks if element has given roles as implicit roles. + * @parm {HTMLElement} ele - element for which to find role. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {bool} retVal - true or false based on if the element has the specified role. + * + * @memberOf AriaUtil + */ + AriaUtil.hasAnyRole = function (ele, considerImplicitRoles) { + var retVal = false; + if (ele && ele.hasAttribute && ele.hasAttribute("role")) { + retVal = true; + } + //check if implicit roles exist. + //Note: element can have multiple implicit roles + if (!retVal && considerImplicitRoles) { + //check if there are any implicit roles for this element. + var impRoles = AriaUtil.getImplicitRole(ele); + if (impRoles !== null && impRoles.length > 0) + retVal = true; + } + return retVal; + }; + AriaUtil.isPresentationalElement = function (node) { + // Elements extracted from https://developer.mozilla.org/en/docs/Web/HTML/Element#Inline_text_semantics, + // http://dev.w3.org/html5/html-author/#text-level-semantics and https://wiki.whatwg.org/wiki/Presentational_elements_and_attributes + var presentationalElements = ["abbr", "b", "bdi", "bdo", "br", "cite", "code", "data", "dfn", + "em", "i", "kbd", "mark", "q", "rp", "rt", "rtc", "ruby", "s", + "samp", "small", "span", "strong", "sub", "sup", "time", "u", + "var", "wbr", "a", "progress", "meter", "basefont", "big", "center", + "strike", "tt", "font", "blink", "h1", "h2", "h3", "h4", "h5", "h6", + "hr", "blockquote", "p" + ]; + return CommonUtil_1.CommonUtil.valInArray(node.nodeName.toLowerCase(), presentationalElements); + }; + /** + * return the ancestor of the given element and role. + * + * @parm {element} element - The element to start the node walk on to find parent node + * @parm {string} role - The role to search for on an element under the provided element + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {node} walkNode - A parent node of the element passed in, which has the provided role + * + * @memberOf AriaUtil + */ + AriaUtil.getAncestorWithRole = function (element, roleName, considerImplicitRoles) { + var walkNode = DOMWalker_1.DOMWalker.parentNode(element); + while (walkNode !== null) { + if (considerImplicitRoles) { + if (AriaUtil.hasRoleInSemantics(walkNode, roleName)) { + break; + } + } + else { + if (AriaUtil.hasRole(walkNode, roleName, false)) { + break; + } + } + walkNode = DOMWalker_1.DOMWalker.parentNode(walkNode); + } + return walkNode; + }; + /** + * return the ancestor of the given element and roles. + * + * @parm {element} element - The element to start the node walk on to find parent node + * @parm {array} roles - the role names to search for + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {node} walkNode - A parent node of the element passed in, which has the provided role + * + * @memberOf AriaUtil + */ + AriaUtil.getAncestorWithRoles = function (element, roleNames) { + if (!element || !roleNames || !roleNames.length || roleNames.length === 0) + return null; + var walkNode = element; + while (walkNode !== null) { + var role = AriaUtil.getResolvedRole(walkNode); + if (role !== null && + (roleNames.includes(role) || + (roleNames.includes("*") && !["presentation", "none"].includes(role)))) + return walkNode; + walkNode = DOMWalker_1.DOMWalker.parentNode(walkNode); + } + return null; + }; + /** + * return the roles with given role type. + * + * @parm {element} element - The element to start the node walk on to find parent node + * @parm {array} roleTyples - role types, such as 'widget', 'structure' etc. + * + * @return {array} roles - A parent node of the element passed in, which has the provided role + * + * @memberOf AriaUtil + */ + AriaUtil.getRolesWithTypes = function (element, types) { + if (!element || !types || !types.length || types.length === 0) + return null; + var roles = CacheUtil_1.CacheUtil.getCache(element.ownerDocument, "roles_with_given_types", null); + if (!roles || roles.length === 0) { + roles = []; + Object.entries(ARIADefinitions_1.ARIADefinitions.designPatterns).forEach(function (_a) { + var key = _a[0], value = _a[1]; + if (types.includes(value.roleType)) + roles.push(key); + }); + CacheUtil_1.CacheUtil.setCache(element.ownerDocument, "roles_with_given_types", roles); + } + return roles; + }; + /** + * return the roles with given role type. + * + * @parm {element} element - The element to start the node walk on to find parent node + * @parm {array} roleTyples - role types, such as 'widget', 'structure' etc. + * + * @return {array} roles - A parent node of the element passed in, which has the provided role + * + * @memberOf AriaUtil + */ + AriaUtil.isWidget = function (element) { + if (!element) + return false; + var widget = CacheUtil_1.CacheUtil.getCache(element.ownerDocument, "is_element_widget", null); + if (widget === null) { + var ret = false; + var role = AriaUtil.getResolvedRole(element); + if (role && ARIADefinitions_1.ARIADefinitions.designPatterns[role] && ARIADefinitions_1.ARIADefinitions.designPatterns[role].roleType === 'widget') + ret = true; + CacheUtil_1.CacheUtil.setCache(element.ownerDocument, "is_element_widget", ret); + return ret; + } + return widget; + }; + /** + * return if the element is owned or controlled by another element. + * If an ancestor of an element is owned or controlled by another element, then the element is also considered as owned or controlled. + * an element can be owned or controlled by another element through aria-owns or aria-controls + * when the DOM hierarchy cannot be used to represent the relationship. + * aria-owns attribute is used to define contextual relationship with a owning parent + * aria-controls attribute is used to associate an element with the controlling element. + * example elements with roles: combobox, scrollbar, tab, button, listbox, menu, menubar, radiogroup, tree, treegrid + * + * when an element is owned or controlled by another element, its navigation may be controlled by the parent + * through aria-activedescendants attribute or roving tabindex + * + * Note navigation with native combobox (input with a datalist) is in native focus navigation, not considered here + * + * @parm {element} element - The element to inspect + * @return {boolean} + * + * @memberOf AriaUtil + */ + AriaUtil.isNavigationOwnedOrControlled = function (element) { + if (!element) + return false; + var ownerElems = CacheUtil_1.CacheUtil.getCache(element.ownerDocument, "AriaUtil_NavigationOwnedOrControlled", null); + if (ownerElems !== null && ownerElems.length > 0) { + if (CommonUtil_1.CommonUtil.getAncestor(element, ownerElems)) + return true; + } + var role = AriaUtil.getResolvedRole(element); + if (!role) + return false; + var id = element.getAttribute("id"); + if (!id || id.trim().length === 0) + return false; + var elem = element.ownerDocument.querySelector("*[aria-controls~='".concat(id, "'], *[aria-owns~='").concat(id, "']")); + if (!elem) + return false; + var containers = ['combobox', 'scrollbar', 'button', 'tab', 'listbox', 'menu', 'menubar', 'radiogroup', 'tree', 'treegrid']; + if (containers.includes(role)) { + if (ownerElems === null) + ownerElems = []; + ownerElems.push(element); + CacheUtil_1.CacheUtil.setCache(element.ownerDocument, "AriaUtil_NavigationOwnedOrControlled", ownerElems); + return true; + } + return false; + }; + /** + * This function is responsible for finding a node which matches the role and is a sibling of the + * provided element. + * + * This function by default will not consider Check Hidden Setting at all. + * + * Note: This is a wrapper function to: AriaUtil.getSiblingWithRoleHidden + * + * @parm {element} element - The element to start the node walk on to find sibling node + * @parm {string} role - The role to search for on an element under the provided element + * + * @return {node} walkNode - A sibling node of the element passed in, which has the provided role + * + * @memberOf AriaUtil + */ + AriaUtil.getSiblingWithRole = function (element, role) { + return AriaUtil.getSiblingWithRoleHidden(element, role, false); + }; + /** + * This function is responsible for finding a node which matches the role and is a sibling of the + * provided element. + * + * This function also considers implicit roles for the elements. + * + * This function will also consider elements that are hidden based on the if the Check + * Hidden Content settings should be considered or not. + * + * @parm {element} element - The element to start the node walk on to find sibling node + * @parm {string} role - The role to search for on an element under the provided element + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * @parm {bool} considerImplicit - true or false based on if Implicit roles should be considered. + * + * @return {node} walkNode - A sibling node of the element passed in, which has the provided role + * + * @memberOf AriaUtil + */ + AriaUtil.getSiblingWithRoleHidden = function (element, role, considerHiddenSetting, considerImplicitRole) { + // Variable Declaration + var walkNode = null; + var hasRole = false; + // Only perform the check if element and role are both provided + if (element && role) { + // Fetch the next sibling element + walkNode = element.nextSibling; + // Keep looping over the next siblings to find element which matches + // the provided role. + while (walkNode !== null && !hasRole) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (considerHiddenSetting && CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(walkNode)) { + // Move on to the next node + walkNode = walkNode.nextSibling; + continue; + } + // Check if this node has the role that we need to check exists + if (considerImplicitRole) { + hasRole = AriaUtil.hasRoleInSemantics(walkNode, role); + } + else { + hasRole = AriaUtil.hasRole(walkNode, role, false); + } + // Move on to the next node + walkNode = walkNode.nextSibling; + } + // If we still have not found a node that matches the role, start a reverse look up + if (!walkNode) { + // Fetch the previous Sibling of this element + walkNode = element.previousSibling; + // Keep looping over all the previous siblings to search for an element which + // matches the provided role. + while (walkNode !== null && !hasRole) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (considerHiddenSetting && CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(walkNode)) { + // Move on to the next node + walkNode = walkNode.previousSibling; + continue; + } + // Check if this node has the role that we need to check exists + hasRole = AriaUtil.hasRole(walkNode, role, considerImplicitRole); + // Move on to the next node + walkNode = walkNode.previousSibling; + } + } + } + return walkNode; + }; + /** + * This function is responsible for getting a descendant element with the specified role, under + * the element that was provided. + * + * Note by default this function will not consider the Check Hidden Content Setting. + * + * Note: This is a wrapper function to: AriaUtil.getDescendantWithRoleHidden + * + * @parm {element} element - parent element for which we will be checking descendants for + * @parm {string} roleName - The role to look for on the descendant's elements + * + * @return {node} - The descendant element that matches the role specified (only one) + * + * @memberOf AriaUtil + */ + AriaUtil.getDescendantWithRole = function (element, roleName) { + return AriaUtil.getDescendantWithRoleHidden(element, roleName, false); + }; + /** + * This function is responsible for getting a descendant element with the specified role, under + * the element that was provided. This function aslo finds elements with implicit roles. + * + * @parm {element} element - parent element for which we will be checking descendants for + * @parm {string} roleName - The role to look for on the descendant's elements + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {node} - The descendant element that matches the role specified (only one) + * + * @memberOf AriaUtil + */ + AriaUtil.getDescendantWithRoleHidden = function (element, roleName, considerHiddenSetting, considerImplicitRoles) { + // Variable Decleration + var descendant = null; + var nw = new DOMWalker_1.DOMWalker(element); + // Loop over all the childrens of the element provided and check if the rolename provided exists + while (nw.nextNode() && nw.node != element && nw.node != element.nextSibling) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (considerHiddenSetting && CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(nw.node)) { + continue; + } + // Check if this node has the role specified, if it does then set this as the descendant and stop checking the rest of the + // nodes. + // Check if this node has the implicit roles, if it does then set this as the descendant and stop checking the rest of the + // nodes. + if (considerImplicitRoles ? AriaUtil.hasRoleInSemantics(nw.node, roleName) : AriaUtil.hasRole(nw.node, roleName, false)) { + descendant = nw.node; + break; + } + } + return descendant; + }; + /** + * This function is responsible for getting All descendant elements with the specified roles, under + * the element that was provided. This function aslo finds elements with implicit roles. + * + * @parm {element} element - parent element for which we will be checking descendants for + * @parm {string[]} roleNames - The roles to look for on the descendant's elements + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {node[]} - all descendant elements that match the roles specified + * + * @memberOf AriaUtil + */ + AriaUtil.getAllDescendantsWithRoles = function (element, roleNames, considerHiddenSetting, considerImplicitRoles) { + if (!roleNames || roleNames.length === 0) + return; + // Variable Decleration + var descendants = []; + roleNames.forEach(function (roleName) { + var kids = AriaUtil.getAllDescendantsWithRoleHidden(element, roleName, considerHiddenSetting, considerImplicitRoles); + if (kids && kids.length > 0) + descendants = descendants.concat(kids); + }); + return descendants; + }; + /** + * This function is responsible for getting All descendant elements with the specified role, under + * the element that was provided. This function aslo finds elements with implicit roles. + * + * @parm {element} element - parent element for which we will be checking descendants for + * @parm {string} roleName - The role to look for on the descendant's elements + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {node[]} - The descendant elements that match the role specified + * + * @memberOf AriaUtil + */ + AriaUtil.getAllDescendantsWithRoleHidden = function (element, roleName, considerHiddenSetting, considerImplicitRoles) { + // Variable Decleration + var descendants = []; + var nw = new DOMWalker_1.DOMWalker(element); + // Loop over all the childrens of the element provided and check if the rolename provided exists + while (nw.nextNode() && nw.node != element && nw.node != element.nextSibling) { + if (nw.bEndTag) { + continue; + } + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (considerHiddenSetting && CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(nw.node)) { + continue; + } + // Check if this node has the role specified, if it does then set this as the descendant and stop checking the rest of the + // nodes. + // Check if this node has the implicit roles, if it does then set this as the descendant and stop checking the rest of the + // nodes. + if (AriaUtil.hasRole(nw.node, roleName, considerImplicitRoles)) { + descendants.push(nw.node); + } + } + return descendants; + }; + /** + * This function is responsible for getting All direct children in AT tree with a role (exclude none and presentation) + * + * @parm {element} element - parent element for which we will be checking children for + * @return {node} - The direct child elements in AT tree that has a role + * + * @memberOf AriaUtil + */ + AriaUtil.getDirectATChildren = function (element) { + var requiredChildRoles = AriaUtil.getRequiredChildRoles(element, true); + var direct = []; + AriaUtil.retrieveDirectATChildren(element, requiredChildRoles, direct); + return direct; + }; + /** + * This function is responsible for recursively any child path till either no child or a child with a role is found (exclude none and presentation) + * + * @parm {element} element - parent element for which we will be checking children for + * @return {node} - The direct child elements in AT tree + * + * @memberOf AriaUtil + */ + AriaUtil.retrieveDirectATChildren = function (element, requiredChildRoles, direct) { + var children = []; + if (element.children !== null && element.children.length > 0) { + for (var i = 0; i < element.children.length; i++) { + children.push(element.children[i]); + } + } + // if the element contains "aria-own" attribute, then the aria-owned children need to be included too + var owned = element.getAttribute("aria-owns"); + if (owned) { + var doc = element.ownerDocument; + if (doc) { + var ownedIds = owned.split(" "); + for (var i = 0; i < ownedIds.length; i++) { + var ownedElem = doc.getElementById(ownedIds[i]); + if (ownedElem) { + children.push(ownedElem); + } + } + } + } + if (children.length > 0) { + for (var i = 0; i < children.length; i++) { + //ignore hidden and invisible child + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(children[i]) || !VisUtil_1.VisUtil.isNodeVisible(children[i])) + continue; + var roles = AriaUtil.getRoles(children[i], false); + if (roles === null || roles.length === 0) { + roles = AriaUtil.getImplicitRole(children[i]); + } + if (roles && roles !== null && roles.length > 0) { + //remove 'none' and 'presentation' + roles = roles.filter(function (role) { + return role !== "none" && role !== "presentation"; + }); + // a 'group' role is allowed but not required for some elements so remove it if exists + if (roles.includes("group") && requiredChildRoles && requiredChildRoles.includes('group')) { + roles = roles.filter(function (role) { + return role !== 'group'; + }); + } + } + if (roles && roles !== null && roles.length > 0) { + direct.push(children[i]); + } + else { + // recursive until get a return value, + AriaUtil.retrieveDirectATChildren(children[i], requiredChildRoles, direct); + } + } + return null; + } + else + return null; + }; + /** + * this function returns null or required child roles for a given element with one more roles, + * return null if the role is 'none' or 'presentation' + * @param element + * @param includeImplicit include implicit roles if no role is explicitly provided + * @returns + */ + AriaUtil.getRequiredChildRoles = function (element, includeImplicit) { + var roles = AriaUtil.getRoles(element, false); + // if explicit role doesn't exist, get the implicit one + if ((!roles || roles.length === 0) && includeImplicit) { + roles = AriaUtil.getImplicitRole(element); + } + /** + * ignore if the element doesn't have any explicit or implicit role + */ + if (!roles || roles.length === 0) { + return null; + } + /** + * ignore if the element contains none or presentation role + */ + var presentationRoles = ["none", "presentation"]; + var found = roles.some(function (r) { return presentationRoles.includes(r); }); + if (found) + return null; + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + var requiredChildRoles = new Array(); + for (var j = 0; j < roles.length; ++j) { + if (designPatterns[roles[j]] && designPatterns[roles[j]].reqChildren !== null) { + requiredChildRoles = CommonUtil_1.CommonUtil.concatUniqueArrayItemList(designPatterns[roles[j]].reqChildren, requiredChildRoles); + } + } + return requiredChildRoles; + }; + /** + * This function is responsible for getting an element referenced by aria-owns and has the + * role that was specified. + * + * Note by default this function will not consider the Check Hidden Content Setting. + * + * Note: This is a wrapper function to: AriaUtil.getAriaOwnsWithRoleHidden + * + * @parm {element} element - Element to check for aria-owns + * @parm {string} roleName - The role to look for on the aria-owns element + * + * @return {node} - The element that is referenced by aria-owns and has role specified. + * + * @memberOf AriaUtil + */ + AriaUtil.getAriaOwnsWithRole = function (element, roleName) { + return AriaUtil.getAriaOwnsWithRoleHidden(element, roleName, false); + }; + /** + * This function is responsible for getting an element referenced by aria-owns and has the + * role that was specified. This function aslo finds elements with implicit roles. + * + * @parm {element} element - Element to check for aria-owns + * @parm {string} roleName - The role to look for on the aria-owns element + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {node} - The element that is referenced by aria-owns and has role specified. + * + * @memberOf AriaUtil + */ + AriaUtil.getAriaOwnsWithRoleHidden = function (element, roleName, considerHiddenSetting, considerImplicitRoles) { + // Variable Decleration + var referencedElement = null; + var referencedElemHasRole = false; + // In the case aria-owns is not on the element just break out of this function with null + if (CommonUtil_1.CommonUtil.attributeNonEmpty(element, "aria-owns")) { + // Get the reference ID + var referenceID = element.getAttribute("aria-owns"); + // Get the element for the reference ID + referencedElement = fragment_1.FragmentUtil.getById(element, referenceID); + //ignore if the aria-owns point to the element itself + if (DOMUtil_1.DOMUtil.sameNode(element, referencedElement)) + return null; + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + if (considerHiddenSetting && referencedElement != null && CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(referencedElement)) { + referencedElemHasRole = null; + } + else { + referencedElemHasRole = AriaUtil.hasRole(referencedElement, roleName, considerImplicitRoles); + } + } + return referencedElemHasRole ? referencedElement : null; + }; + // Return true if the element has an ARIA label + AriaUtil.hasAriaLabel = function (element) { + // Rpt_Aria_ValidIdRef determines if the aria-labelledby id points to a valid element + return CommonUtil_1.CommonUtil.attributeNonEmpty(element, "aria-label") || CommonUtil_1.CommonUtil.attributeNonEmpty(element, "aria-labelledby"); + }; + // Given an array of elements, return true if the elements have unique ARIA labels + AriaUtil.hasUniqueAriaLabelsLocally = function (elements, isGlobal) { + if (elements.length === 0) + return false; + var doc = elements[0].ownerDocument; + var hasDuplicateLabels = false; + var uniqueAriaLabels = null; + if (isGlobal) { + uniqueAriaLabels = CacheUtil_1.CacheUtil.getCache(doc, "AriaUtil_HAS_UNIQUE_ARIA_LABELS", null); + } + if (uniqueAriaLabels === null) { + uniqueAriaLabels = {}; + } + for (var i = 0; !hasDuplicateLabels && i < elements.length; ++i) { + if (elements[i].hasAttribute) { + if (elements[i].hasAttribute("aria-label")) { + var ariaLabel = CommonUtil_1.CommonUtil.normalizeSpacing(elements[i].getAttribute("aria-label")).toLowerCase(); + hasDuplicateLabels = ariaLabel in uniqueAriaLabels; + uniqueAriaLabels[ariaLabel] = true; + } + else if (elements[i].hasAttribute("aria-labelledby")) { + var labelID = elements[i].getAttribute("aria-labelledby"); + var labelNode = fragment_1.FragmentUtil.getById(elements[i], labelID); + var label = ""; + if (labelNode && !DOMUtil_1.DOMUtil.sameNode(labelNode, elements[i])) { + label = AriaUtil.getTextContentExcludingScripts(labelNode); + } + var normalizedLabel = CommonUtil_1.CommonUtil.normalizeSpacing(label).toLowerCase(); + hasDuplicateLabels = normalizedLabel in uniqueAriaLabels; + uniqueAriaLabels[normalizedLabel] = true; + } + else { + // Has no label at all + hasDuplicateLabels = true; + } + } + } + if (isGlobal) { + CacheUtil_1.CacheUtil.setCache(doc, "AriaUtil_HAS_UNIQUE_ARIA_LABELS", uniqueAriaLabels); + } + return !hasDuplicateLabels; + }; + /** + * Get text content from an element, excluding script and style elements + * This is a simplified version that doesn't go through full accessible name computation + * to avoid circular dependencies when called from getAriaLabel + * + * Note: When an element is referenced by aria-labelledby, its content is included + * even if the element is hidden (per ARIA spec) + */ + AriaUtil.getTextContentExcludingScripts = function (elem) { + if (!elem) + return ""; + var text = ""; + var nw = new DOMWalker_1.DOMWalker(elem); + while (nw.nextNode() && nw.node !== elem && nw.node !== elem.parentNode) { + if (nw.bEndTag) + continue; + var node = nw.node; + var nodeName = node.nodeName ? node.nodeName.toLowerCase() : ""; + // Skip script and style elements + if (nodeName === 'script' || nodeName === 'style') { + nw.bEndTag = true; // Skip children + continue; + } + if (node.nodeType === 3) { // Text node + // Include text even from hidden elements when referenced by aria-labelledby + if (node.nodeValue && node.nodeValue.trim().length > 0) { + text += " " + node.nodeValue.trim(); + } + } + else if (node.nodeType === 1) { // Element node + // Handle images - get alt text + if (nodeName === 'img' && node.hasAttribute('alt')) { + text += " " + node.getAttribute('alt').trim(); + nw.bEndTag = true; // Skip children of img + } + // Handle input with type="image" - get alt text + else if (nodeName === 'input' && node.getAttribute('type') === 'image' && node.hasAttribute('alt')) { + text += " " + node.getAttribute('alt').trim(); + nw.bEndTag = true; // Skip children + } + } + } + return text.trim(); + }; + AriaUtil.getAriaLabel = function (ele) { + if (ele.hasAttribute) { + if (ele.hasAttribute("aria-labelledby")) { + var labelIDs = ele.getAttribute("aria-labelledby").trim().split(" "); + var normalizedLabel = ""; + for (var j = 0, length_1 = labelIDs.length; j < length_1; ++j) { + var labelID = labelIDs[j]; + var labelNode = fragment_1.FragmentUtil.getById(ele, labelID); + if (labelNode && !DOMUtil_1.DOMUtil.sameNode(labelNode, ele)) { + // Use our helper to get text content without circular dependency + var label = AriaUtil.getTextContentExcludingScripts(labelNode); + normalizedLabel += CommonUtil_1.CommonUtil.normalizeSpacing(label); + } + } + return normalizedLabel.trim(); + } + else if (ele.hasAttribute("aria-label")) { + return CommonUtil_1.CommonUtil.normalizeSpacing(ele.getAttribute("aria-label")).trim(); + } + } + return ""; + }; + AriaUtil.getAriaDescription = function (ele) { + if (!ele) + return ""; + var normalizedLabel = ""; + var desc = ele.getAttribute("aria-labelledby"); + if (desc && desc.trim().length > 0) { + var labelIDs = desc.trim().split(" "); + for (var j = 0, length_2 = labelIDs.length; j < length_2; ++j) { + var labelID = labelIDs[j]; + var labelNode = fragment_1.FragmentUtil.getById(ele, labelID); + if (labelNode && !DOMUtil_1.DOMUtil.sameNode(labelNode, ele)) { + var label = AriaUtil.getTextContentExcludingScripts(labelNode); + if (label && label.trim().length > 0) + normalizedLabel += CommonUtil_1.CommonUtil.normalizeSpacing(label).toLowerCase(); + } + } + if (normalizedLabel.trim().length > 0) + return normalizedLabel.trim(); + } + desc = ele.getAttribute("aria-description"); + if (desc && desc.trim().length > 0) + return desc.trim().toLowerCase(); + return ""; + }; + AriaUtil.findAriaLabelDupes = function (elements) { + var dupeMap = {}; + elements.forEach(function (ele) { + dupeMap[AriaUtil.getAriaLabel(ele)] = (dupeMap[AriaUtil.getAriaLabel(ele)] || 0) + 1; + }); + return dupeMap; + }; + /** + * return accessible names for all AT visible landmark elements + * @param doc + * @returns + */ + AriaUtil.getLandmarkAccNames = function (doc) { + var nameMap = CacheUtil_1.CacheUtil.getCache(doc, "AriaUtil_Landmark_AccNames", null); + if (nameMap && nameMap.length !== 0) + return nameMap; + nameMap = []; + var landmarkElems = doc.querySelectorAll('aside,[role="complementary"], footer,[role="contentinfo"], header,[role="banner"], main,[role="main"], nav,[role="navigation"], form,[role="form"], section,[role="region"], article,[role="article"], [role="search"],[role="application"],[role="document"]'); + if (landmarkElems.length === 0) { + CacheUtil_1.CacheUtil.setCache(doc, "AriaUtil_Landmark_AccNames", nameMap); + return nameMap; + } + landmarkElems.forEach(function (elem) { + // ignore node that is AT hidden or in a dialog that is considered as a separate location from the rest of the main page + if (!VisUtil_1.VisUtil.isNodeHiddenFromAT(elem) && CommonUtil_1.CommonUtil.getAncestor(elem, ["DIALOG"]) === null && AriaUtil.getAncestorWithRole(elem, "dialog", true) === null) { + var name_1 = ""; + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(elem); + if (pair && pair.name && pair.name.trim().length > 0) + name_1 = pair.name.trim(); + // check neested landmark to calculate the accessible name + var ancestors = __spreadArray([], landmarkElems, true).filter(function (e) { return e.contains(elem) && e !== elem; }); + if (ancestors.length > 1) { + ancestors.forEach(function (ancestor) { + var ancestor_pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ancestor); + if (ancestor_pair && ancestor_pair.name && ancestor_pair.name.trim().length > 0) + name_1 = ancestor_pair.name.trim() + " " + name_1; + }); + } + var role = AriaUtil.getResolvedRole(elem); + nameMap.push({ "elem": elem, "role": role, "name": name_1 }); + } + }); + CacheUtil_1.CacheUtil.setCache(doc, "AriaUtil_Landmark_AccNames", nameMap); + return nameMap; + }; + /** + * check if the given element with the landmark rolw is unique + * @param element + * @param role: a specific landmark role, or "any" for all landmark role + * @param considerNoneLabel: if consider the landmarks without a label + * @returns + */ + AriaUtil.isLandmarkNameUnique = function (element, role, considerNoneLabel) { + if (considerNoneLabel === void 0) { considerNoneLabel = false; } + var nameMap = AriaUtil.getLandmarkAccNames(element.ownerDocument); + var exist = null; + if (role === 'any') + exist = nameMap.find(function (entry) { return entry.elem === element; }); + else + exist = nameMap.find(function (entry) { return entry.elem === element && entry.role === role; }); + if (!exist) + return null; + var name = exist.name; + if (!considerNoneLabel && name === '') + return null; + for (var i = 0; i < nameMap.length; i++) { + if (nameMap[i].elem === element) + continue; + if (name === nameMap[i].name) { + if (role === 'any') + return true; + else if (nameMap[i].role === role) + return true; + } + } + return false; + }; + // Given an array of elements, return true if the elements have unique ARIA labels globally + AriaUtil.hasUniqueAriaLabels = function (elements) { + return AriaUtil.hasUniqueAriaLabelsLocally(elements, true); + }; + // Given an array of elements, return true if the elements have unique ARIA labels + AriaUtil.hasDuplicateAriaLabelsLocally = function (elements, isGlobal) { + if (elements.length === 0) + return false; + var doc = elements[0].ownerDocument; + var hasDuplicateLabels = false; + var uniqueAriaLabels = null; + var duplicateLabelNameArray = new Array(); + if (isGlobal) { + uniqueAriaLabels = CacheUtil_1.CacheUtil.getCache(doc, "AriaUtil_HAS_UNIQUE_ARIA_LABELS", null); + } + if (uniqueAriaLabels === null) { + uniqueAriaLabels = {}; + } + for (var i = 0; i < elements.length; ++i) { + if (elements[i].hasAttribute) { + if (elements[i].hasAttribute("aria-label")) { + var ariaLabel = CommonUtil_1.CommonUtil.normalizeSpacing(elements[i].getAttribute("aria-label")).toLowerCase(); + hasDuplicateLabels = ariaLabel in uniqueAriaLabels; + uniqueAriaLabels[ariaLabel] = true; + if (!(ariaLabel in duplicateLabelNameArray)) { + duplicateLabelNameArray[ariaLabel] = new Array(); + } + duplicateLabelNameArray[ariaLabel].push(elements[i].nodeName.toLowerCase()); + } + else if (elements[i].hasAttribute("aria-labelledby")) { + var labelIDs = elements[i].getAttribute("aria-labelledby").trim().split(" "); + var normalizedLabel = ""; + for (var j = 0, length_3 = labelIDs.length; j < length_3; ++j) { + var labelID = labelIDs[j]; + var labelNode = fragment_1.FragmentUtil.getById(elements[i], labelID); + if (labelNode && !DOMUtil_1.DOMUtil.sameNode(labelNode, elements[i])) { + var label = AriaUtil.getTextContentExcludingScripts(labelNode); + normalizedLabel += CommonUtil_1.CommonUtil.normalizeSpacing(label).toLowerCase(); + } + } + hasDuplicateLabels = normalizedLabel in uniqueAriaLabels; + uniqueAriaLabels[normalizedLabel] = true; + if (!(normalizedLabel in duplicateLabelNameArray)) { + duplicateLabelNameArray[normalizedLabel] = new Array(); + } + duplicateLabelNameArray[normalizedLabel].push(elements[i].nodeName.toLowerCase()); + } + } + } + if (isGlobal) { + CacheUtil_1.CacheUtil.setCache(doc, "AriaUtil_HAS_UNIQUE_ARIA_LABELS", uniqueAriaLabels); + } + return duplicateLabelNameArray; + }; + // Given an array of elements, return true if the elements have unique ARIA labels globally + AriaUtil.hasDuplicateAriaLabels = function (elements) { + return AriaUtil.hasDuplicateAriaLabelsLocally(elements, true); + }; + // Given an array of elements, return true if the elements have unique aria-labelledby attributes + AriaUtil.hasUniqueAriaLabelledby = function (elements) { + var hasDuplicateLabels = false; + var labelRefs = {}; + for (var i = 0; !hasDuplicateLabels && i < elements.length; ++i) { + if (elements[i].hasAttribute && elements[i].hasAttribute("aria-labelledby") && !CommonUtil_1.CommonUtil.isIdReferToSelf(elements[i], elements[i].getAttribute("aria-labelledby"))) { + var labelRef = CommonUtil_1.CommonUtil.normalizeSpacing(elements[i].getAttribute("aria-labelledby")); + hasDuplicateLabels = labelRef in labelRefs; + labelRefs[labelRef] = true; + } + else { + hasDuplicateLabels = true; + } + } + return !hasDuplicateLabels; + }; + /** + * this function is responsible for resolving ARIA requirements for an HTML element per ARIA in HTML + * @param ruleContext the HTML element to be examined + * @returns + */ + AriaUtil.getElementAriaProperty = function (ruleContext) { + var tagProperty = CacheUtil_1.CacheUtil.getCache(ruleContext, "AriaUtil_ElementAriaProperty", null); + if (!tagProperty) { + var tagName = null; + var name_2 = null; + if (ruleContext.tagName) { + tagName = ruleContext.tagName.toLowerCase(); + } + else if (ruleContext.nodeName) { + tagName = ruleContext.nodeName.toLowerCase(); + } + // check if the tagProperty exists in the documentConformanceRequirement hash. + tagProperty = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirement[tagName]; + // The tag needs to check some special attributes + if (tagProperty === null || tagProperty === undefined) { + var specialTagProperties = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirementSpecialTags[tagName]; + switch (tagName) { // special cases + case "a": + ruleContext.hasAttribute("href") ? tagProperty = specialTagProperties["with-href"] : tagProperty = specialTagProperties["without-href"]; + break; + case "area": + ruleContext.hasAttribute("href") ? tagProperty = specialTagProperties["with-href"] : tagProperty = specialTagProperties["without-href"]; + break; + case "figure": { + var fcs = CommonUtil_1.CommonUtil.getChildByTag(ruleContext, "figcaption"); + fcs !== null && fcs.length > 0 ? tagProperty = specialTagProperties["child-figcaption"] : tagProperty = specialTagProperties["no-child-figcaption"]; + break; + } + case "footer": + case "header": + if (AriaUtil.getAncestorWithRole(ruleContext, "article", true) !== null || AriaUtil.getAncestorWithRole(ruleContext, "complementary", true) !== null + || AriaUtil.getAncestorWithRole(ruleContext, "navigation", true) !== null || AriaUtil.getAncestorWithRole(ruleContext, "region", true) !== null + || CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["article", "aside", "main", "nav", "section"]) !== null) + tagProperty = specialTagProperties["des-section-article-aside-main-nav"]; + else + tagProperty = specialTagProperties["other"]; + break; + case "img": + var alt = ruleContext.hasAttribute("alt") ? ruleContext.getAttribute("alt") : null; + var title = ruleContext.hasAttribute("title") ? ruleContext.getAttribute("title") : null; + if (AriaUtil.getAriaLabel(ruleContext).trim().length !== 0 || (alt !== null && alt.length > 0) || (title !== null && title.length > 0)) { + // If the img has non-empty alt (alt="some text" or alt=" ") or an accessible name is provided + tagProperty = specialTagProperties["img-with-accname"]; + } + else { + if (alt !== null) { + // If the img has an empty alt (alt="") + tagProperty = specialTagProperties["img-without-accname-empty-alt"]; + } + else { + // If the img lacks an alt attribute + tagProperty = specialTagProperties["img-without-accname-no-alt"]; + } + } + break; + case "input": + if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "type")) { + var type = ruleContext.getAttribute("type").trim().toLowerCase(); + tagProperty = specialTagProperties[type]; + if (tagProperty === null || tagProperty === undefined) { + switch (type) { + case "checkbox": + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "aria-pressed") ? tagProperty = specialTagProperties["checkbox-with-aria-pressed"] : tagProperty = specialTagProperties["checkbox-without-aria-pressed"]; + break; + case "email": + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["email-with-list"] : tagProperty = specialTagProperties["email-no-list"]; + break; + case "search": + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["search-with-list"] : tagProperty = specialTagProperties["search-no-list"]; + break; + case "tel": + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["tel-with-list"] : tagProperty = specialTagProperties["tel-no-list"]; + break; + case "text": + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["text-with-list"] : tagProperty = specialTagProperties["text-no-list"]; + break; + case "url": + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["url-with-list"] : tagProperty = specialTagProperties["url-no-list"]; + break; + default: + // default + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["default-with-list"] : tagProperty = specialTagProperties["default-no-list"]; + break; + } + } + } + else { + // default type is the same as type=text + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["text-with-list"] : tagProperty = specialTagProperties["text-no-list"]; + } + break; + case "li": + specialTagProperties = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirementSpecialTags["li"]; + if (ruleContext.parentElement && AriaUtil.hasRoleInSemantics(ruleContext.parentElement, "list")) + tagProperty = specialTagProperties["child-of-list-role"]; + else + tagProperty = specialTagProperties["no-child-of-list-role"]; + break; + case "section": + //name = ARIAMapper.computeName(ruleContext); + //if (name && name.trim().length > 0) { + var label = AriaUtil.getAriaLabel(ruleContext); + if ((label && label.trim().length > 0) || CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "title")) { + tagProperty = specialTagProperties["with-name"]; + } + else { + tagProperty = specialTagProperties["without-name"]; + } + break; + case "select": + specialTagProperties = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirementSpecialTags["select"]; + if (ruleContext.hasAttribute("multiple") || + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "size") && ruleContext.getAttribute("size") > 1) + tagProperty = specialTagProperties["multiple-attr-size-gt1"]; + else + tagProperty = specialTagProperties["no-multiple-attr-size-gt1"]; + break; + case "summary": + specialTagProperties = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirementSpecialTags["summary"]; + if (ruleContext.parentElement && ruleContext.parentElement.nodeName.toLowerCase() === 'details' + && DOMUtil_1.DOMUtil.sameNode(__spreadArray([], ruleContext.parentElement.children, true).filter(function (elem) { return elem.nodeName.toLowerCase() === 'summary'; })[0], ruleContext)) + tagProperty = specialTagProperties["first-summary-of-detail"]; + else + tagProperty = specialTagProperties["no-first-summary-of-detail"]; + break; + case "tbody": + case "td": + case "tr": + if (AriaUtil.getAncestorWithRole(ruleContext, "table", true) !== null) { + tagProperty = specialTagProperties["des-table"]; + } + else { + AriaUtil.getAncestorWithRole(ruleContext, "grid", true) || AriaUtil.getAncestorWithRole(ruleContext, "treegrid", true) ? tagProperty = specialTagProperties["des-grid"] : tagProperty = specialTagProperties["des-other"]; + } + break; + case "th": + var scope = CommonUtil_1.CommonUtil.getScopeForTh(ruleContext); + if (AriaUtil.getAncestorWithRole(ruleContext, "table", true) !== null) { + if (scope === 'column') + tagProperty = specialTagProperties["des-table-column-scope"]; + else + tagProperty = specialTagProperties["des-table-row-scope"]; + } + else if (AriaUtil.getAncestorWithRole(ruleContext, "grid", true) !== null || AriaUtil.getAncestorWithRole(ruleContext, "treegrid", true) !== null) { + if (scope === 'column') + tagProperty = specialTagProperties["des-grid-treegrid-column-scope"]; + else + tagProperty = specialTagProperties["des-grid-treegrid-row-scope"]; + } + else + tagProperty = specialTagProperties["des-other"]; + break; + case "div": + var prt = ruleContext.parentElement; + prt !== null && prt.nodeName.toLowerCase() === 'dl' ? tagProperty = specialTagProperties["child-dl"] : tagProperty = specialTagProperties["no-child-dl"]; + break; + default: + tagProperty = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirementSpecialTags["default"]; + } //switch + } + } + CacheUtil_1.CacheUtil.setCache(ruleContext, "AriaUtil_ElementAriaProperty", tagProperty); + return tagProperty || null; + }; + AriaUtil.getAllowedAriaRoles = function (ruleContext, properties) { + var allowedRoles = CacheUtil_1.CacheUtil.getCache(ruleContext, "AriaUtil_AllowedAriaRoles", null); + if (!allowedRoles) { + allowedRoles = []; + var tagProperty = null; + if (properties !== null && properties !== undefined) { + tagProperty = properties; + } + else { + tagProperty = AriaUtil.getElementAriaProperty(ruleContext); + } + if (tagProperty !== null && tagProperty !== undefined) { + if (tagProperty.implicitRole !== null) { + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(tagProperty.implicitRole, allowedRoles); + } + if (tagProperty.validRoles !== null) { + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(tagProperty.validRoles, allowedRoles); + } + var implicitRoles = AriaUtil.getImplicitRole(ruleContext); + if (implicitRoles && implicitRoles.length > 0) { + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(tagProperty.validRoles, allowedRoles); + } + } + CacheUtil_1.CacheUtil.setCache(ruleContext, "AriaUtil_AllowedAriaRoles", allowedRoles); + } + return allowedRoles; + }; + AriaUtil.getAllowedAriaAttributes = function (ruleContext, roles, properties) { + var allowedAttributes = CacheUtil_1.CacheUtil.getCache(ruleContext, "AriaUtil_AllowedAriaAttributes", null); + if (!allowedAttributes) { + allowedAttributes = []; + var permittedRoles = __spreadArray([], roles, true); + var tagName = ruleContext.tagName.toLowerCase(); + var prohibitedAttributes = []; + // Element with a disabled attribute https://www.w3.org/TR/html5/disabled-elements.html + if (ARIADefinitions_1.ARIADefinitions.elementsAllowedDisabled.indexOf(tagName) > -1) { + // Use the aria-disabled attribute on any element that is allowed the disabled attribute in HTML5. + allowedAttributes = CommonUtil_1.CommonUtil.concatUniqueArrayItem("aria-disabled", allowedAttributes); + } + // Element with a required attribute http://www.the-art-of-web.com/html/html5-form-validation/ + if (ARIADefinitions_1.ARIADefinitions.elementsAllowedRequired.indexOf(tagName) > -1) { + // Use the aria-required attribute on any element that is allowed the required attribute in HTML5. + allowedAttributes = CommonUtil_1.CommonUtil.concatUniqueArrayItem("aria-required", allowedAttributes); + } + if (ARIADefinitions_1.ARIADefinitions.elementsAllowedReadOnly.indexOf(tagName) > -1) { + // Use the aria-readonly attribute on any element that is allowed the readonly attribute in HTML5. + allowedAttributes = CommonUtil_1.CommonUtil.concatUniqueArrayItem("aria-readonly", allowedAttributes); + } + var tagProperty = null; + if (properties != null && properties !== undefined) + tagProperty = properties; + else + tagProperty = AriaUtil.getElementAriaProperty(ruleContext); + if (tagProperty !== null && tagProperty !== undefined) { + // add the implicit role allowed attributes to the allowed role list if there is no specified role + // ignore if the element doesn't allow the attributes from the implicit roles + if (tagProperty.implicitRole !== null && + (permittedRoles === null || permittedRoles === undefined || permittedRoles.length === 0) + && tagProperty.allowAttributesFromImplicitRole === undefined) { + for (var i = 0; i < tagProperty.implicitRole.length; i++) { + var roleProperty = ARIADefinitions_1.ARIADefinitions.designPatterns[tagProperty.implicitRole[i]]; + if (roleProperty !== null && roleProperty !== undefined) { + var properties_1 = roleProperty.props; + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(properties_1, allowedAttributes); + properties_1 = AriaUtil.getRoleRequiredProperties(tagProperty.implicitRole[i], ruleContext); + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(properties_1, allowedAttributes); + var prohibitedProps = roleProperty.prohibitedProps; + if (prohibitedProps && prohibitedProps.length > 0) + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(prohibitedProps, prohibitedAttributes); + // special case of separator + if (tagProperty.implicitRole[i] === "separator" && CommonUtil_1.CommonUtil.isFocusable(ruleContext)) { + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(["aria-disabled", "aria-valuenow", "aria-valuemax", "aria-valuemin", "aria-valuetext"], allowedAttributes); + } + } + } + } + // Adding the global properties to the valid attribute list + if (tagProperty.globalAriaAttributesValid) { + var properties_2 = ARIADefinitions_1.ARIADefinitions.globalProperties; // global properties + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(properties_2, allowedAttributes); + } + } + // adding the other role to the allowed roles for the attributes + if (tagProperty && tagProperty.otherRolesForAttributes && tagProperty.otherRolesForAttributes.length > 0) + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(tagProperty.otherRolesForAttributes, permittedRoles); + // adding the specified role properties to the allowed attribute list + for (var i = 0; permittedRoles !== null && i < permittedRoles.length; i++) { + var roleProperties = ARIADefinitions_1.ARIADefinitions.designPatterns[permittedRoles[i]]; + if (roleProperties !== null && roleProperties !== undefined) { + // ignore the properties if the element doesn't allow attributes from the implicit role + if (!tagProperty || tagProperty.implicitRole === null || !tagProperty.implicitRole.includes(permittedRoles[i]) || (tagProperty.implicitRole.includes(permittedRoles[i]) && tagProperty.allowAttributesFromImplicitRole === undefined)) { + var properties_3 = roleProperties.props; // allowed properties + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(properties_3, allowedAttributes); + properties_3 = AriaUtil.getRoleRequiredProperties(permittedRoles[i], ruleContext); // required properties + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(properties_3, allowedAttributes); + } + var prohibitedProps = roleProperties.prohibitedProps; + if (prohibitedProps && prohibitedProps.length > 0) + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(prohibitedProps, prohibitedAttributes); + // special case for separator + if (permittedRoles[i] === "separator" && CommonUtil_1.CommonUtil.isFocusable(ruleContext)) { + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(["aria-disabled", "aria-valuemax", "aria-valuemin", "aria-valuetext"], allowedAttributes); + } + } + } + // ignore aria-level, aria-setsize or aria-posinset if "row" is not in treegrid + if (permittedRoles.includes("row") && AriaUtil.getAncestorWithRole(ruleContext, "treegrid", true) == null) { + var index = -1; + if ((index = allowedAttributes.indexOf("aria-level")) > -1) + allowedAttributes.splice(index, 1); + if ((index = allowedAttributes.indexOf("aria-setsize")) > -1) + allowedAttributes.splice(index, 1); + if ((index = allowedAttributes.indexOf("aria-posinset")) > -1) + allowedAttributes.splice(index, 1); + } + // add the other allowed attributes for the element + if (tagProperty && tagProperty.otherAllowedAriaAttributes && tagProperty.otherAllowedAriaAttributes.length > 0) { + // check attribute-value pair if exists + var allowed = []; + for (var p = 0; p < tagProperty.otherAllowedAriaAttributes.length; p++) { + var attr = tagProperty.otherAllowedAriaAttributes[p]; + if (attr.includes("=")) { + var pair = attr.split("="); + if (ruleContext.getAttribute(pair[0]) === pair[1]) + allowed.push(pair[0]); + } + else + allowed.push(attr); + } + if (allowed.length > 0) + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(allowed, allowedAttributes); + } + // add the other prohibitted attributes for the element + if (tagProperty && tagProperty.otherDisallowedAriaAttributes && tagProperty.otherDisallowedAriaAttributes.length > 0) { + // check attribute-value pair if exists + var disallowed = []; + for (var p = 0; p < tagProperty.otherDisallowedAriaAttributes.length; p++) { + var attr = tagProperty.otherDisallowedAriaAttributes[p]; + if (attr.includes("=")) { + var pair = attr.split("="); + if (ruleContext.getAttribute(pair[0]) === pair[1]) + disallowed.push(pair[0]); + } + else + disallowed.push(attr); + } + if (disallowed.length > 0) + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(disallowed, prohibitedAttributes); + } + //exclude the prohibitedAttributes from the allowedAttributes + allowedAttributes = CommonUtil_1.CommonUtil.reduceArrayItemList(prohibitedAttributes, allowedAttributes); + //exclude aria attribute for elements without implicit role and with 'Naming Prohibited' + if ((!roles || roles.length === 0) && tagProperty.implicitRole === null && tagProperty.prohibitedAriaAttributesWhenNoImplicitRole) + allowedAttributes = CommonUtil_1.CommonUtil.reduceArrayItemList(tagProperty.prohibitedAriaAttributesWhenNoImplicitRole, allowedAttributes); + CacheUtil_1.CacheUtil.setCache(ruleContext, "AriaUtil_AllowedAriaAttributes", allowedAttributes); + } + return allowedAttributes; + }; + /** + * + * @param ariaAttr + * @param htmlAttrs + * @type: conflict or overlapping + * @returns htmlAttrName, 'Pass' or null + * htmlAttrName that conflicts with the ariaAttr, + * 'Pass' with no conflict with the ariaAttr, + * or null where ariaAttr won't cause conflict + */ + AriaUtil.getConflictOrOverlappingHtmlAttribute = function (ariaAttr, htmlAttrs, type) { + var exist = ARIADefinitions_1.ARIADefinitions.relatedAriaHtmlAttributes[ariaAttr['name']]; + if (exist) { + if (!ariaAttr || ariaAttr.length == 0 || !htmlAttrs || htmlAttrs.length == 0) + return []; + var examinedHtmlAtrNames = []; + var concernTypes = null; + if (type === 'conflict') { + if (!exist.conflict || Object.keys(exist.conflict).length === 0) + return null; + concernTypes = exist.conflict; + } + else if (type === 'overlapping') { + if (!exist.overlapping || Object.keys(exist.overlapping).length === 0) + return null; + concernTypes = exist.overlapping; + } + else + return null; + var applicable = false; + var fail_1 = false; + for (var k = 0; k < concernTypes.length; k++) { + var concernAriaValue = concernTypes[k].ariaAttributeValue; + var concernHtmlNames = concernTypes[k].htmlAttributeNames; + var concernHtmlValues = concernTypes[k].htmlAttributeValues; + for (var i = 0; i < htmlAttrs.length; i++) { + var index = concernHtmlNames.indexOf(htmlAttrs[i]['name']); + if (index !== -1) { + applicable = true; + var htmlValuesInConcern = (concernHtmlValues === null || concernHtmlValues[index] === null) ? null : concernHtmlValues[index].split(","); + if (concernAriaValue === null) { + if (htmlValuesInConcern === null) { + examinedHtmlAtrNames.push({ result: 'Failed', 'attr': htmlAttrs[i]['name'] }); + fail_1 = true; + } + else if (htmlValuesInConcern.includes(htmlAttrs[i]['value'])) { + examinedHtmlAtrNames.push({ result: 'Failed', 'attr': htmlAttrs[i]['name'] }); + fail_1 = true; + } + } + else if (htmlValuesInConcern === null) { + if (concernAriaValue === ariaAttr['value']) { + examinedHtmlAtrNames.push({ result: 'Failed', 'attr': htmlAttrs[i]['name'] }); + fail_1 = true; + } + } + else if (concernAriaValue === 'VALUE' && htmlValuesInConcern.includes('VALUE') && htmlValuesInConcern[0] !== ariaAttr['value']) { + examinedHtmlAtrNames.push({ result: 'Failed', 'attr': htmlAttrs[i]['name'] }); + fail_1 = true; + } + else if (concernAriaValue === ariaAttr['value'] && htmlValuesInConcern.includes(htmlAttrs[i]['value'])) { + examinedHtmlAtrNames.push({ result: 'Failed', 'attr': htmlAttrs[i]['name'] }); + fail_1 = true; + } + } + } + } + if (applicable && !fail_1) + examinedHtmlAtrNames.push({ result: 'Pass', 'attr': '' }); + return examinedHtmlAtrNames; + } + else + return null; + }; + AriaUtil.containsPresentationalChildrenOnly = function (elem) { + var roles = AriaUtil.getRoles(elem, false); + // if explicit role doesn't exist, get the implicit one + if (!roles || roles.length === 0) + roles = AriaUtil.getImplicitRole(elem); + //ignore if the element doesn't have any explicit or implicit role, shouldn't happen + if (!roles || roles.length === 0) + return false; + for (var i = 0; roles !== null && i < roles.length; i++) { + var roleProperties = ARIADefinitions_1.ARIADefinitions.designPatterns[roles[i]]; + if (roleProperties !== null && roleProperties !== undefined) { + var presentional = roleProperties.presentationalChildren; + if (presentional === true) + return true; + } + } + return false; + }; + AriaUtil.shouldBePresentationalChild = function (element) { + var walkNode = DOMWalker_1.DOMWalker.parentElement(element); + while (walkNode) { + if (AriaUtil.containsPresentationalChildrenOnly(walkNode)) + return true; + //aria-own case: if the element is referred by an aria-won + walkNode = ARIAMapper_1.ARIAMapper.getAriaOwnedBy(walkNode) || DOMWalker_1.DOMWalker.parentElement(walkNode); + } + return false; + }; + /* + * check if any explicit role specified for the element is a valid ARIA role + * return: null if no explicit role is defined, + * true if the role(s) are defined in ARIA + * false if any role is not defined in ARIA +*/ + AriaUtil.areRolesDefined = function (roles) { + if (!roles || roles.length === 0) + return null; + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + for (var _i = 0, roles_1 = roles; _i < roles_1.length; _i++) { + var role = roles_1[_i]; + if (!(role.toLowerCase() in designPatterns)) + return false; + } + return true; + }; + /* + * check if any explicit role specified for the element is a valid ARIA role + * return: null if no explicit role is defined, + * true if the role(s) are defined in ARIA + * false if any role is not defined in ARIA + */ + AriaUtil.getInvalidRoles = function (ruleContext) { + var domRoles = AriaUtil.getUserDefinedRoles(ruleContext); + if (!domRoles || domRoles.length === 0) + return null; + // check the 'generic' role first + if (domRoles && domRoles.includes('generic')) + return ["generic"]; + // Failing roles + var failRoleTokens = []; + // Passing roles + var passRoleTokens = []; + var tagProperty = AriaUtil.getElementAriaProperty(ruleContext); + var allowedRoles = AriaUtil.getAllowedAriaRoles(ruleContext, tagProperty); + if (!allowedRoles || allowedRoles.length === 0) + return domRoles; + var invalidRoles = []; + if (allowedRoles.includes('any')) + return []; + for (var i = 0; i < domRoles.length; i++) + if (!allowedRoles.includes(domRoles[i]) && !invalidRoles.includes(domRoles[i])) + invalidRoles.push(domRoles[i]); + return invalidRoles; + }; + /* + * check if any explicit role specified for the element is not defined in ARIA + * return: list of specified roles not defined in ARIA + */ + AriaUtil.getRolesUndefinedByAria = function (element) { + if (!element) + return null; + var roles = AriaUtil.getRoles(element, false); + var undefinedRoles = []; + if (roles && roles.length > 0) { + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + for (var i = 0; i < roles.length; i++) { + if (!(roles[i] in designPatterns)) { + undefinedRoles.push(roles[i]); + } + } + } + return undefinedRoles; + }; + /* + * this method first checks explicit roles, if no explicit role, it will check the implicit role + * return: null if any explicit role is invalid, + * a list of invalid attributes + * empty list if all attributes are valid, or no aria attributes are specified + */ + AriaUtil.getInvalidAriaAttributes = function (ruleContext) { + var roles = AriaUtil.getUserDefinedRoles(ruleContext); + // the invalid role case: handled by Rpt_Aria_ValidRole. Ignore to avoid duplicated report + // for mutiple roles, skip if any role is invalid + var defined = AriaUtil.areRolesDefined(roles); + if (defined !== null && !defined) + return null; + var attrs = []; + if (!roles || roles.length == 0) + roles = AriaUtil.getImplicitRole(ruleContext); + var aria_attrs = AriaUtil.getUserDefinedAriaAttributes(ruleContext); + var tagProperty = AriaUtil.getElementAriaProperty(ruleContext); + // Attributes allowed on this node + var allowedAttributes = AriaUtil.getAllowedAriaAttributes(ruleContext, roles, tagProperty); + if (aria_attrs) { + for (var i = 0; i < aria_attrs.length; i++) { + var attrName = aria_attrs[i].trim().toLowerCase(); + if (!allowedAttributes.includes(attrName) && !attrs.includes(attrName)) + attrs.push(attrName); + } + } + return attrs; + }; + /* + * get conflict Aria and Html attributes + * return: a list of Aria and Html attribute pairs that are conflict + */ + AriaUtil.getConflictAriaAndHtmlAttributes = function (elem) { + var ariaAttrs = AriaUtil.getUserDefinedAriaAttributeNameValuePairs(elem); + var htmlAttrs = AriaUtil.getUserDefinedHtmlAttributeNameValuePairs(elem); + var ret = []; + if (ariaAttrs && ariaAttrs.length > 0 && htmlAttrs && htmlAttrs.length > 0) { + var _loop_1 = function (i) { + var examinedHtmlAtrNames = AriaUtil.getConflictOrOverlappingHtmlAttribute(ariaAttrs[i], htmlAttrs, 'conflict'); + if (examinedHtmlAtrNames === null) + return "continue"; + examinedHtmlAtrNames.forEach(function (item) { + if (item['result'] === 'Failed') //failed + ret.push({ 'ariaAttr': ariaAttrs[i]['name'], 'htmlAttr': item['attr'] }); + }); + }; + for (var i = 0; i < ariaAttrs.length; i++) { + _loop_1(i); + } + } + return ret; + }; + /* + * get deprecated Aria roles + * return: a list of deprecated Aria roles + */ + AriaUtil.getDeprecatedAriaRoles = function (element) { + if (!element) + return null; + var roles = AriaUtil.getRoles(element, false); + var ret = []; + if (roles && roles.length > 0) { + var globalDeprecatedRoles = ARIADefinitions_1.ARIADefinitions.globalDeprecatedRoles; + for (var i = 0; i < roles.length; i++) { + if (globalDeprecatedRoles.includes(roles[i])) + ret.push(roles[i]); + } + } + return ret; + }; + /* + * get deprecated Aria role-attributes + * return: a list of deprecated Aria role-attributes paris + * for global the role is marked as 'any' + */ + AriaUtil.getDeprecatedAriaAttributes = function (element) { + if (!element) + return null; + var domAttributes = element.attributes; + var ariaAttrs = []; + if (domAttributes) { + for (var i = 0; i < domAttributes.length; i++) { + var attrName = domAttributes[i].name; + if (attrName.substring(0, 5) === 'aria-') + ariaAttrs.push(attrName); + } + } + if (ariaAttrs.length === 0) + return []; + var ret = []; + var globalDeprecatedAttributes = ARIADefinitions_1.ARIADefinitions.globalDeprecatedProperties; + for (var i = 0; i < ariaAttrs.length; i++) { + if (globalDeprecatedAttributes.includes(ariaAttrs[i])) + ret.push({ "role": "any", "attribute": ariaAttrs[i] }); + } + var roles = AriaUtil.getRoles(element, false); + if (roles && roles.length > 0) { + for (var i = 0; i < roles.length; i++) { + var roleWithDeprecatedAttributes = ARIADefinitions_1.ARIADefinitions.designPatterns[roles[i]]; + if (roleWithDeprecatedAttributes) { + var deprecatedAttriNames = roleWithDeprecatedAttributes['deprecatedProps']; + if (deprecatedAttriNames && deprecatedAttriNames.length > 0) { + for (var j = 0; j < ariaAttrs.length; j++) { + if (deprecatedAttriNames.includes(ariaAttrs[j])) + ret.push({ "role": roles[i], "attribute": ariaAttrs[j] }); + } + } + } + } + } + return ret; + }; + AriaUtil.isNodeInGrid = function (node) { + return AriaUtil.getAncestorWithRole(node, "grid") != null; + }; + // This list contains a list of elements tags which have display: none by default, since we have rules triggering + AriaUtil.navLinkKeywords = ['start', 'next', 'prev', 'previous', 'contents', 'index']; + // This list contains a list of rule ids for the rules that have to check for hidden content regardless of the Check Hidden + // Content Setting. This means that when the engine is actually determine which elements to mass to the rules, it will always + // pass theses rules no matter what the Check Hidden Content Setting is. + AriaUtil.rulesThatHaveToCheckHidden = ['RPT_Elem_UniqueId']; + // https://www.w3.org/TR/wai-aria-1.1/#introstates + AriaUtil.ariaAttributeRoleDefaults = { + "alert": { + "aria-live": "assertive", + "aria-atomic": "true" + }, + "combobox": { + "aria-haspopup": "listbox" + }, + "listbox": { + "aria-orientation": "vertical" + }, + "log": { + "aria-live": "polite" + }, + "menu": { + "aria-orientation": "vertical" + }, + "menubar": { + "aria-orientation": "horizontal" + }, + "meter": { + "aria-valuemin": "0", + "aria-valuemax": "100" + }, + "option": { + "aria-selected": "false" + }, + "progressbar": { + "aria-valuemin": "0", + "aria-valuemax": "100" + }, + "scrollbar": { + "aria-orientation": "vertical", + "aria-valuemin": "0", + "aria-valuemax": "100" + }, + "separator": { + "aria-orientation": "horizontal", + "aria-valuemin": "0", + "aria-valuemax": "100" + }, + "slider": { + "aria-orientation": "horizontal", + "aria-valuemin": "0", + "aria-valuemax": "100" + }, + "spinbutton": { + // Not sure how to encode min/max (or now in 1.2 - "has no value") + //"aria-valuenow": "0" TODO: at risk: maybe delete after ARIA 1.2 reaches proposed rec + // Probably just delete spinbutton from this list completely and let user agents handle "defaults" + }, + "status": { + "aria-live": "polite", + "aria-atomic": "true" + }, + "tab": { + "aria-selected": "false" + }, + "tablist": { + "aria-orientation": "horizontal" + }, + "toolbar": { + "aria-orientation": "horizontal" + }, + "tree": { + "aria-orientation": "vertical" + } + }; + // https://www.w3.org/TR/wai-aria-1.1/#aria-atomic + AriaUtil.ariaAttributeGlobalDefaults = { + "aria-atomic": "false", + "aria-autocomplete": "none", + "aria-busy": "false", + "aria-checked": undefined, + "aria-current": "false", + "aria-disabled": "false", + "aria-dropeffect": "none", + "aria-expanded": undefined, + "aria-grabbed": undefined, + "aria-haspopup": "false", + "aria-hidden": undefined, + "aria-invalid": "false", + "aria-live": "off", + "aria-modal": "false", + "aria-multiline": "false", + "aria-multiselectable": "false", + "aria-orientation": undefined, + "aria-pressed": undefined, + "aria-readonly": "false", + //"aria-relevant": "additions text", TODO: are multiple values supported? + "aria-required": "false", + "aria-selected": undefined, + "aria-sort": "none" + }; + // https://www.w3.org/TR/html-aam-1.0/#html-attribute-state-and-property-mappings + AriaUtil.ariaAttributeImplicitMappings = { + "aria-autocomplete": { + "form": function (e) { + return "off" === e.getAttribute("autocomplete") ? "none" : "both"; + }, + "input": function (e) { + return "off" === e.getAttribute("autocomplete") ? "none" : "both"; + }, + "select": function (e) { + return "off" === e.getAttribute("autocomplete") ? "none" : "both"; + }, + "textarea": function (e) { + return "off" === e.getAttribute("autocomplete") ? "none" : "both"; + } + }, + "aria-checked": { + "input": function (e) { + if (e.hasAttribute("indeterminate")) + return "mixed"; + return "" + e.hasAttribute("checked"); + }, + "menuitem": function (e) { + if (e.hasAttribute("indeterminate")) + return "mixed"; + return "" + e.hasAttribute("checked"); + }, + "*": function (e) { + if (e.hasAttribute("indeterminate")) + return "mixed"; + }, + }, + "aria-disabled": { + "button": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + }, + "fieldset": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + }, + "input": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + }, + "optgroup": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + }, + "option": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + }, + "select": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + }, + "textarea": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + } + }, + "aria-expanded": { + "details": function (e) { + return e.getAttribute("open"); + }, + "dialog": function (e) { + return e.getAttribute("open"); + } + }, + "aria-multiselectable": { + "select": function (e) { + if (e.hasAttribute("multiple")) + return "true"; + return; + } + }, + "aria-placeholder": { + "input": function (e) { + return e.getAttribute("placeholder"); + }, + "textarea": function (e) { + return e.getAttribute("placeholder"); + } + }, + "aria-required": { + "input": function (e) { + return e.getAttribute("required"); + }, + "select": function (e) { + return e.getAttribute("required"); + }, + "textarea": function (e) { + return e.getAttribute("required"); + } + } + }; + return AriaUtil; +}()); +exports.AriaUtil = AriaUtil; + + +/***/ }, + +/***/ "./src/v4/util/CSSUtil.ts" +/*!********************************!*\ + !*** ./src/v4/util/CSSUtil.ts ***! + \********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.CSSUtil = void 0; +var CacheUtil_1 = __webpack_require__(/*! ./CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ./CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var AriaUtil_1 = __webpack_require__(/*! ./AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var DOMMapper_1 = __webpack_require__(/*! ../../v2/dom/DOMMapper */ "./src/v2/dom/DOMMapper.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var CSSUtil = /** @class */ (function () { + function CSSUtil() { + } + CSSUtil.selectorMatchesElem = function (element, selector) { + // Early return for empty selector (before try-catch for performance) + if (!selector || selector.length === 0 || selector.trim() === "") + return false; + try { + // Modern standard method + if (typeof element.matches === "function") { + return element.matches(selector); + } + // Vendor-prefixed fallbacks (older browsers) + if (typeof element.webkitMatchesSelector === "function") { + return element.webkitMatchesSelector(selector); + } + if (typeof element.msMatchesSelector === "function") { + return element.msMatchesSelector(selector); + } + // Legacy method (deprecated but kept for compatibility) + if (typeof element.matchesSelector === "function") { + return element.matchesSelector(selector); + } + // Fallback: use querySelectorAll and check if element is in results + var doc = element.ownerDocument || element.document; + if (!doc) + return false; + var matches = doc.querySelectorAll(selector); + // Use Array.from for better performance with modern engines + return Array.from(matches).includes(element); + } + catch (err) { + // Bad selector? Doesn't match then... + return false; + } + }; + /** + * Returns the style computed for this element + * @param elem + */ + CSSUtil.getComputedStyle = function (elem, pseudoElt) { + if (!elem) + return null; + var doc = elem.ownerDocument; + var win = doc.defaultView; + return win.getComputedStyle(elem, pseudoElt); + }; + /** + * Parse and cache all stylesheet rules at the document level + * Returns an array of parsed rule objects with selector and style information + */ + CSSUtil.getParsedStylesheetRules = function (ownerDoc) { + // Check if we already have cached parsed rules for this document + var cachedRules = CacheUtil_1.CacheUtil.getCache(ownerDoc, "RPTUtil_ParsedStylesheetRules", null); + if (cachedRules) { + return cachedRules; + } + var parsedRules = []; + // Iterate through all of the stylesheets and rules + for (var ssIndex = 0; ssIndex < ownerDoc.styleSheets.length; ++ssIndex) { + var sheet = ownerDoc.styleSheets[ssIndex]; + try { + if (sheet && sheet.cssRules) { + for (var rIndex = 0; rIndex < sheet.cssRules.length; ++rIndex) { + var rule = sheet.cssRules[rIndex]; + var fullRuleSelector = rule.selectorText; + if (fullRuleSelector) { + var pseudoMatch = fullRuleSelector.match(/^(.*)(:[a-zA-Z-]*)$/); + var hasPseudoClass = !!pseudoMatch; + var selMain = hasPseudoClass ? pseudoMatch[1] : fullRuleSelector; + var selPseudo = hasPseudoClass ? pseudoMatch[2] : ""; + parsedRules.push({ + fullRuleSelector: fullRuleSelector, + hasPseudoClass: hasPseudoClass, + selMain: selMain, + selPseudo: selPseudo, + style: rule.style + }); + } + } + } + } + catch (err) { + if (!err.toString().includes("Cannot access rules") && + !err.toString().includes("SecurityError:")) { + throw err; + } + } + } + // Cache the parsed rules at the document level + CacheUtil_1.CacheUtil.setCache(ownerDoc, "RPTUtil_ParsedStylesheetRules", parsedRules); + return parsedRules; + }; + /** + * Private helper method to fill style maps from a CSSStyleDeclaration + * Handles CSS property priorities and the "all" shorthand property + */ + CSSUtil.fillStyle = function (maps, style) { + for (var sIndex = 0; sIndex < style.length; ++sIndex) { + if (style[sIndex] === "all" && style[style[sIndex]]) { + for (var _i = 0, maps_1 = maps; _i < maps_1.length; _i++) { + var map = maps_1[_i]; + for (var key in map) { + delete map[key]; + } + } + break; + } + else { + var key = style[sIndex]; + for (var _a = 0, maps_2 = maps; _a < maps_2.length; _a++) { + var map = maps_2[_a]; + var priority = style.getPropertyPriority(key); + if (key in map && map[key].endsWith("!important")) { + if (priority === "important" && + !map[key].startsWith("inherit") && + !map[key].startsWith("unset")) + map[key] = style[key] + " !important"; + else + continue; + } + else + map[key] = + style[key] + + (priority === "important" ? " !important" : ""); + } + } + } + }; + /** + * Private helper method that consolidates the logic for getting defined styles + * Used by both getDefinedStyles and getDefinedStylesMultiple + */ + CSSUtil.getDefinedStylesInternal = function (elem, props, pseudoClasses) { + var results = {}; + var definedStylesMap = {}; + var definedStylePseudoMap = {}; + // Initialize result objects for all pseudo-classes + for (var _i = 0, pseudoClasses_1 = pseudoClasses; _i < pseudoClasses_1.length; _i++) { + var pseudoClass = pseudoClasses_1[_i]; + definedStylesMap[pseudoClass] = {}; + definedStylePseudoMap[pseudoClass] = {}; + } + // Get pre-parsed stylesheet rules from cache + var parsedRules = CSSUtil.getParsedStylesheetRules(elem.ownerDocument); + // Check once if we need to handle :focus pseudo-class + var hasFocusPseudo = pseudoClasses.includes(":focus"); + var _loop_1 = function (parsedRule) { + if (props !== null && !props.some(function (prop) { return !!parsedRule.style[prop]; })) { + return "continue"; + } + var selPseudo = parsedRule.selPseudo; + var hasPseudoClass = parsedRule.hasPseudoClass; + // Handle :focus-within replacement once per rule if needed + var selMain = parsedRule.selMain; + if (hasFocusPseudo && selPseudo === ":focus") { + // If this element has focus, remove focus-within from parents + selMain = selMain.replace(/([ >][^+~ >]+):focus-within/g, "$1"); + } + // Cache selector matching result (only once per rule, not per pseudo-class) + var selectorMatches = CSSUtil.selectorMatchesElem(elem, selMain); + // Only process if selector matches + if (selectorMatches) { + // Process for each pseudo-class + for (var _c = 0, pseudoClasses_3 = pseudoClasses; _c < pseudoClasses_3.length; _c++) { + var pseudoClass = pseudoClasses_3[_c]; + // Cache map references to avoid repeated lookups + var styleMap = definedStylesMap[pseudoClass]; + var pseudoMap = definedStylePseudoMap[pseudoClass]; + // Get styles of non-pseudo selectors + if (!hasPseudoClass) { + CSSUtil.fillStyle([styleMap, pseudoMap], parsedRule.style); + } + // Get styles for matching pseudo-class + if (selPseudo === pseudoClass) { + CSSUtil.fillStyle([pseudoMap], parsedRule.style); + } + } + } + }; + // Process each cached rule + for (var _a = 0, parsedRules_1 = parsedRules; _a < parsedRules_1.length; _a++) { + var parsedRule = parsedRules_1[_a]; + _loop_1(parsedRule); + } + // Handle element styles and build results in one pass + for (var _b = 0, pseudoClasses_2 = pseudoClasses; _b < pseudoClasses_2.length; _b++) { + var pseudoClass = pseudoClasses_2[_b]; + var styleMap = definedStylesMap[pseudoClass]; + var pseudoMap = definedStylePseudoMap[pseudoClass]; + // Add element's inline styles + CSSUtil.fillStyle([styleMap, pseudoMap], elem.style); + // Build results + if (pseudoClass === "") { + results[pseudoClass] = styleMap; + } + else { + // For pseudo-classes, return only styles that differ from default + var diffStyles = {}; + var keys = Object.keys(pseudoMap); + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + if (pseudoMap[key] !== styleMap[key]) { + diffStyles[key] = pseudoMap[key]; + } + } + results[pseudoClass] = diffStyles; + } + } + return results; + }; + /** + * Returns the style defined for this element for multiple pseudo-classes in a single pass + * + * This is more efficient than calling getDefinedStyles multiple times as it only + * iterates through stylesheets once. + * + * @param {HTMLElement} elem + * @param {string[]} props Properties for which we are looking for (allows us to skip elem matching unnecessarily) + * @param {string[]} pseudoClasses - Array of pseudo-classes to retrieve. Use "" for default (no pseudo-class). + * @returns {Object} Object mapping each pseudo-class to its defined styles + */ + CSSUtil.getDefinedStylesMultiple = function (elem, props, pseudoClasses) { + if (!elem) + return null; + var results = {}; + // Create cache key that includes props filter + // Use "all" for null props, or sorted comma-separated list for specific props + var propsKey = props === null ? "all" : props.slice().sort().join(","); + // Check cache first - see if we have all requested pseudo-classes cached + var allCachedStyles = CacheUtil_1.CacheUtil.getCache(elem, "RPTUtil_DefinedStyles", null); + if (!allCachedStyles) { + allCachedStyles = {}; + } + // Get or create the cache bucket for this props filter + var cachedStyles = allCachedStyles[propsKey]; + var missingPseudoClasses = []; + if (cachedStyles) { + // Check which pseudo-classes are already cached + for (var _i = 0, pseudoClasses_4 = pseudoClasses; _i < pseudoClasses_4.length; _i++) { + var pseudoClass = pseudoClasses_4[_i]; + if (cachedStyles[pseudoClass] !== undefined) { + results[pseudoClass] = cachedStyles[pseudoClass]; + } + else { + missingPseudoClasses.push(pseudoClass); + } + } + // If all are cached, return immediately + if (missingPseudoClasses.length === 0) { + return results; + } + } + else { + cachedStyles = {}; + missingPseudoClasses = pseudoClasses; + } + // Only process missing pseudo-classes using the internal helper + if (missingPseudoClasses.length > 0) { + var newResults = CSSUtil.getDefinedStylesInternal(elem, props, missingPseudoClasses); + // Merge new results with cached results + for (var _a = 0, missingPseudoClasses_1 = missingPseudoClasses; _a < missingPseudoClasses_1.length; _a++) { + var pseudoClass = missingPseudoClasses_1[_a]; + results[pseudoClass] = newResults[pseudoClass]; + cachedStyles[pseudoClass] = newResults[pseudoClass]; + } + // Update cache with all styles (existing + new) + allCachedStyles[propsKey] = cachedStyles; + CacheUtil_1.CacheUtil.setCache(elem, "RPTUtil_DefinedStyles", allCachedStyles); + } + return results; + }; + /** + * Returns the style defined for this element + * + * This differs from the computed style in that the computed style will return + * styles defined by the user agent. This will only return styles defined by the + * application + * if rotation transform is used, the computed style returns the resolved matrix + * while the defined style return the transform function(s) + * for example, for 'transform: rotate(2.5deg);', the computed style returns 'matrix(-0.0436194, 0.999048, -0.999048, -0.0436194, 0, 0)' + * and the defined style returns 'rotate(2.5deg)' + * + * change the type of the parameter pseudoClass from PseudoClass to string to include both pseudo classes (e.g., :focus, :checked) + * and pseudo elements (e.g., ::before, ::after). + * + * @param {HTMLElement} elem + * @param {string[]} props Properties for which we are looking for (allows us to skip elem matching unnecessarily) + * @param {string} [pseudoClass] If specified, will return values that are different + * than when the pseudoClass does not match. + */ + CSSUtil.getDefinedStyles = function (elem, props, pseudoClass) { + if (!elem) + return null; + // Create cache key that includes props filter + // Use "all" for null props, or sorted comma-separated list for specific props + var propsKey = props === null ? "all" : props.slice().sort().join(","); + var pseudoKey = pseudoClass || ""; + // Check cache first - use shared cache structure with getDefinedStylesMultiple + var allCachedStyles = CacheUtil_1.CacheUtil.getCache(elem, "RPTUtil_DefinedStyles", null); + if (!allCachedStyles) { + allCachedStyles = {}; + } + // Get or create the cache bucket for this props filter + var cachedStyles = allCachedStyles[propsKey]; + if (!cachedStyles) { + cachedStyles = {}; + } + if (cachedStyles[pseudoKey] !== undefined) { + return cachedStyles[pseudoKey]; + } + // Use the internal helper method with a single pseudo-class + var results = CSSUtil.getDefinedStylesInternal(elem, props, [pseudoKey]); + var result = results[pseudoKey]; + // Cache the result + cachedStyles[pseudoKey] = result; + allCachedStyles[propsKey] = cachedStyles; + CacheUtil_1.CacheUtil.setCache(elem, "RPTUtil_DefinedStyles", allCachedStyles); + return result; + }; + /** + * Returns the media query defined for the document + * Get media orientation transforms from stylesheets with caching + * Returns transform/rotate properties for elements within media queries + * + * @param {Document} doc + */ + CSSUtil.getMediaOrientationTransform = function (doc) { + // Check if we already have cached media orientation transforms for this document + var cachedTransforms = CacheUtil_1.CacheUtil.getCache(doc, "RPTUtil_MediaOrientationTransforms", null); + if (cachedTransforms) { + return cachedTransforms; + } + var orientationTransforms = {}; + // Iterate through all of the stylesheets and rules + for (var ssIndex = 0; ssIndex < doc.styleSheets.length; ++ssIndex) { + var sheet = doc.styleSheets[ssIndex]; + try { + if (sheet && sheet.cssRules) { + for (var rIndex = 0; rIndex < sheet.cssRules.length; ++rIndex) { + var sheetRule = sheet.cssRules[rIndex]; + if (4 /* CSSRule.MEDIA_RULE */ === sheetRule.MEDIA_RULE) { + var rule = sheetRule; + if (rule && rule.media) { + var mediaList = rule.media; + for (var i = 0; i < mediaList.length; i++) { + if (!mediaList.item(i)) + continue; + var mediaKey = mediaList.item(i).toLocaleLowerCase(); + var elem_transforms = orientationTransforms[mediaKey]; + if (!elem_transforms) + elem_transforms = {}; + var styleRules = rule.cssRules; + for (var j = 0; j < styleRules.length; ++j) { + if (1 /* CSSRule.STYLE_RULE */ === styleRules[j].STYLE_RULE) { + var styleRule = styleRules[j]; + var selector = styleRule.selectorText; + if (selector) { + var transforms = {}; + var styles = styleRule.style; + for (var s = 0; s < styles.length; ++s) { + var key = styles[s]; + var keyLower = key.toLocaleLowerCase(); + if (keyLower === "transform") { + if (key === "all" && styles[key]) { + transforms = {}; + break; + } + else { + transforms[key] = styles[key]; + } + } + else if (keyLower === "rotate") { + transforms[key] = styles[key]; + } + } + if (Object.keys(transforms).length > 0) { + elem_transforms[selector] = transforms; + } + } + } + } + if (Object.keys(elem_transforms).length > 0) { + orientationTransforms[mediaKey] = elem_transforms; + } + } + } + } + } + } + } + catch (err) { + if (!err.toString().includes("Cannot access rules") && + !err.toString().includes("SecurityError:")) { + throw err; + } + } + } + // Cache the media orientation transforms at the document level + CacheUtil_1.CacheUtil.setCache(doc, "RPTUtil_MediaOrientationTransforms", orientationTransforms); + return orientationTransforms; + }; + /** + * convert given rotation transform functions to the degree transformed. + * If multiple functions are given, then the functions are applied linearly in the order. + * rotation_transform function example: rotate(45deg), rotate(2turn), rotate(2rad), rotate3d(1, 1, 1, 45deg), + * rotate(2rad) rotate3d(1, 1, 1, 45deg) + * @param rotation_transform + */ + CSSUtil.getRotationDegree = function (rotation_transform) { + var degree = 0; + try { + if (!rotation_transform) + return degree; + // normalize the rotation_transform + rotation_transform = rotation_transform.replaceAll(", ", ","); + var transform_functions = rotation_transform.split(" "); + for (var i = 0; i < transform_functions.length; i++) { + var transform_function = transform_functions[i].trim(); + if (transform_function === "") + continue; + if (transform_function.startsWith("rotate3d")) { + // example: rotate3d(1, 1, 1, 45deg); + var left = transform_function.indexOf("("); + var right = transform_function.indexOf(")"); + if (left !== -1 && right !== -1) { + var matrix = transform_function.substring(left + 1, right); + var values = void 0; + if (matrix) + values = matrix.split(","); + if (values && values.length === 4) { + var rotation = values[3]; + if (!rotation) + continue; + rotation = rotation.trim(); + if (rotation.endsWith("turn")) { + var num = rotation.substring(0, rotation.length - 4); + num = parseFloat(num); + if (!isNaN(num)) + degree = num * 360; + } + else if (rotation.endsWith("rad")) { + var num = rotation.substring(0, rotation.length - 3); + num = parseFloat(num); + if (!isNaN(num)) + degree = (num * 180) / Math.PI; + } + else if (rotation.endsWith("deg")) { + var num = rotation.substring(0, rotation.length - 3); + num = parseFloat(num); + if (!isNaN(num)) + degree += num; + } + } + } + } + else if (transform_function.startsWith("rotate") || + transform_function.startsWith("rotateZ")) { + // example: rotate(45deg); + var left = transform_function.indexOf("("); + var right = transform_function.indexOf(")"); + if (left !== -1 && right !== -1) { + var rotation = transform_function.substring(left + 1, right); + if (!rotation) + continue; + rotation = rotation.trim(); + if (rotation.endsWith("turn")) { + var num = rotation.substring(0, rotation.length - 4); + num = parseFloat(num); + if (!isNaN(num)) + degree = num * 360; + } + else if (rotation.endsWith("rad")) { + var num = rotation.substring(0, rotation.length - 3); + num = parseFloat(num); + if (!isNaN(num)) + degree = (num * 180) / Math.PI; + } + else if (rotation.endsWith("deg")) { + var num = rotation.substring(0, rotation.length - 3); + num = parseFloat(num); + if (!isNaN(num)) + degree += num; + } + } + } + else if (transform_function.startsWith("matrix3d")) { + // calculate the three Euler angles + var left = transform_function.indexOf("("); + var right = transform_function.indexOf(")"); + if (left !== -1 && right !== -1) { + var matrix = transform_function.substring(left + 1, right); + var values = null; + if (matrix) + values = matrix.split(","); + if (values !== null) { + var z_angle = Math.atan2(values[4], values[5]); + degree += Math.round(Math.round((z_angle * 180) / Math.PI)); + } + } + } + else if (transform_function.startsWith("matrix")) { + // calculate the three Euler angles + var left = transform_function.indexOf("("); + var right = transform_function.indexOf(")"); + if (left !== -1 && right !== -1) { + var matrix = transform_function.substring(left + 1, right); + var values = null; + if (matrix) + values = matrix.split(","); + if (values !== null) { + var z_angle = Math.atan2(values[1], values[0]); + degree += Math.round(Math.round((z_angle * 180) / Math.PI)); + } + } + } + } + while (degree >= 360) + degree -= 360; + } + catch (err) { + console.log("Cannot retrieve rotation degree: " + err); + throw err; + } + return degree; + }; + /** + * Convert CSS style string values to pixels. + * + * @param value style value in string, such as 3rem, 230px etc. + * @param target element. + * @return value in pixels + */ + CSSUtil.getPixelsFromStyle = function (value, elem) { + if (!value) + return 0; + var regex = /(-?[\d.]+)([a-z%]*)/; + var parsed = value.trim().match(regex); + if (parsed === null) + return 0; + if (parsed[2] === "" || parsed[1] === 0) + //no zero value without unit which is considered as error, so implicable + return 0; + var pixels = CSSUtil.convertValue2Pixels(parsed[2], parsed[1], elem); + return pixels === null ? pixels : parseFloat(pixels); + }; + /** + * Convert absolute CSS numerical values to pixels. + * + * @param unitValue in string + * @param target element. + * @return value in pixels + */ + CSSUtil.convertValue2Pixels = function (unit, unitValue, elem) { + if (unitValue === 0) + return 0; + if (!unit) + unit = "px"; + var supportedUnits = { + // absolute unit + px: function (value) { return value; }, + cm: function (value) { return value * 37.8; }, + mm: function (value) { return value * 3.78; }, + q: function (value) { return value * 0.95; }, + in: function (value) { return value * 96; }, + pc: function (value) { return value * 16; }, + pt: function (value) { return value * 1.33; }, + // relative unit + rem: function (value) { + return value * + parseFloat(getComputedStyle(elem.ownerDocument.documentElement).getPropertyValue("font-size")); + }, + em: function (value) { + return value * + parseFloat(getComputedStyle(elem).getPropertyValue("font-size")); + }, + vw: function (value) { + return (value / 100) * elem.ownerDocument.defaultView.innerWidth; + }, + vh: function (value) { + return (value / 100) * elem.ownerDocument.defaultView.innerHeight; + }, + "%": function (value) { + return (value / 100) * + parseFloat(getComputedStyle(elem).getPropertyValue("font-size")); + }, + }; + if (unit in supportedUnits) + return supportedUnits[unit](unitValue); + return null; + }; + /* + * Returns if the font for visible text of the element is defined by material icons + * + * @param {HTMLElement} elem + */ + CSSUtil.isMaterialIconFont = function (elem) { + // TODO: check the existence material icons using fetch in node 18+ + // for now (node 16) just dertermine if the stylesheet for the 'Material Icons' exists statically. note that the loading of the font stylesheet occurs at run time. + //list of known material icons and stylesheet link + var known_icons = { + "Material Icons": "https://fonts.googleapis.com/icon?family=Material+Icons", + }; + var known_css_classes = { + "material-icons": "https://fonts.googleapis.com/icon?family=Material+Icons", + }; + // material icon font can be defined either by font-family: 'Material Icons' or by class="material-icons" + var styles = CSSUtil.getDefinedStyles(elem, ["font-family"]); + var fontFamily = styles["font-family"]; + var found = false; + // font-family specifies a prioritized list of one or more font family names + if (fontFamily && + fontFamily.split(",")[0].replace(/['"]+/g, "").trim() in known_icons) + found = true; + if (!found) { + var list = elem.classList; + for (var css_class in known_css_classes) { + if (list.contains(css_class)) { + found = true; + break; + } + } + } + if (!found) + return false; + var passed = false; + // check if the stylesheet for the 'Material Icons' exists statically + var sheets = elem.ownerDocument.styleSheets; + for (var s = 0; s < sheets.length; s++) { + if (sheets && + sheets.length > 0 && + Object.values(known_icons).indexOf(sheets[s].href) > -1) { + passed = true; + break; + } + } + return passed; + }; + CSSUtil.getWeightNumber = function (styleVal) { + var map = { + light: 100, + bold: 700, + }; + var retVal = parseInt(styleVal); + if (retVal) + return retVal; + if (styleVal in map) + return map[styleVal]; + return 400; + }; + CSSUtil.getFontInPixels = function (styleVal, elem) { + var map = { + "xx-small": 16, + "x-small": 10, + small: 13, + medium: 16, + large: 18, + "x-large": 24, + "xx-large": 32, + }; + var value = parseFloat(styleVal); + if (!value) { + return map[styleVal]; + } + var units = styleVal.substring(("" + value).length); + /** + if (units === "" || units === "px") return value; + if (units === "em") return value * 16; + if (units === "%") return value / 100 * 16; + if (units === "pt") return value * 4 / 3; + return Math.round(value); + */ + return CSSUtil.convertValue2Pixels(units, value, elem); + }; + CSSUtil.getCSSStyle = function (element) { + var styleText = ""; + if (element === null) + return []; + if (element.IBM_CSS_THB) + return element.IBM_CSS_THB; + var nodeName = element.nodeName.toLowerCase(); + if (nodeName === "style") { + styleText = element.innerText; + if (styleText === undefined || styleText.trim() === "") + styleText = element.textContent; + } + else if (element.hasAttribute("style")) { + styleText = element.getAttribute("style"); + } + else + return []; + if (styleText === null || styleText.trim().length === 0) + return []; + //remove comment blocks + var re = /(\/\*+(?:(?:(?:[^\*])+)|(?:[\*]+(?!\/)))[*]+\/)|\/\/.*/g; + var subst = " "; + styleText = styleText.replace(re, subst); + // Find all "key : val;" pairs with various whitespace inbetween + var rKeyVals = /\s*([^:\s]+)\s*:\s*([^;$}]+)\s*(;|$)/g; + // Find all "selector { csskeyvals } with various whitespace inbetween + var rSelectors = /\s*([^{]*){([^}]*)}/g; + if (styleText.indexOf("{") === -1) { + var keyVals = {}; + var m = void 0; + while ((m = rKeyVals.exec(styleText)) != null) { + keyVals[m[1]] = m[2].trim().toLowerCase(); + } + var retVal = [ + { + selector: null, + values: keyVals, + }, + ]; + element.IBM_CSS_THB = retVal; + return retVal; + } + else { + var retVal = []; + var m = void 0; + var m2 = void 0; + while ((m = rSelectors.exec(styleText)) != null) { + var keyVals = {}; + var selKey = m[1]; + var selVal = m[2]; + while ((m2 = rKeyVals.exec(selVal)) != null) { + keyVals[m2[1]] = m2[2].trim().toLowerCase(); + } + retVal.push({ + selector: selKey, + values: keyVals, + }); + } + element.IBM_CSS_THB = retVal; + return retVal; + } + }; + /** + * an "inline" CSS display property tells the element to fit itself on the same line. An 'inline' element's width and height are ignored. + * some element has default inline property, such as <span>, <a> + * most formatting elements inherent inline property, such as <em>, <strong>, <i>, <small> + * other inline elements: <abbr> <acronym> <b> <bdo> <big> <br> <cite> <code> <dfn> <em> <i> <input> <kbd> <label> + * <map> <object> <output> <q> <samp> <script> <select> <small> <span> <strong> <sub> <sup> <textarea> <time> <tt> <var> + * an "inline-block" element still place element in the same line without breaking the line, but the element's width and height are applied. + * inline-block elements: img, button, select, meter, progress, marguee, also in Chrome: textarea, input + * A block-level element always starts on a new line, and the browsers automatically add some space (a margin) before and after the element. + * block-level elements: <address> <article> <aside> <blockquote> <canvas> <dd> <div> <dl> <dt> <fieldset> <figcaption> <figure> <footer> <form> + * <h1>-<h6> <header> <hr> <li> <main> <nav> <noscript> <ol> <p> <pre> <section> <table> <tfoot> <ul> <video> + * + * return: if it's inline element and { inline: true | false, text: true | false, violation: null | {node} } + */ + CSSUtil.getInlineStatus = function (element) { + if (!element) + return null; + var elem_styl = getComputedStyle(element); + if (!elem_styl) + return null; + var status = { inline: false, text: false, violation: null }; + var udisplay = elem_styl.getPropertyValue("display"); + // inline element only + if (udisplay !== "inline") + return status; + status.inline = true; + var parent = element.parentElement; + if (!parent) + return status; + var mapper = new DOMMapper_1.DOMMapper(); + var bounds = mapper.getUnadjustedBounds(element); + var style = getComputedStyle(parent); + var display = style.getPropertyValue("display"); + // an inline element is inside a block. note <body> is a block element too + if (display !== "block" && display !== "inline-block") { + //parent is inline element + if (!CommonUtil_1.CommonUtil.isInnerTextOnlyEmpty(parent)) + status.text = true; + return status; + } + /** + * @returns "yes"": inline with text, "no": inline without text, + * "violation": not spacing enough to neiboring inline target + * "block": block element, + */ + function isInlineWithText(node, before) { + // note browsers insert Text nodes to represent whitespaces. + if (node.nodeType === Node.TEXT_NODE) { + if (node.nodeValue && node.nodeValue.trim().length > 0) + return "yes"; + else + return "no"; + } + else if (node.nodeType === Node.ELEMENT_NODE) { + // special case: <br> is styled 'inline' by default, but change the line + if (node.nodeName.toLowerCase() === "br") + return "block"; + var cStyle = getComputedStyle(node); + var cDisplay = cStyle.getPropertyValue("display"); + if (cDisplay === "inline") { + if (CommonUtil_1.CommonUtil.isTarget(node)) { + if (bounds.width < 24) { + // check if the horizontal spacing is sufficient + var bnds = mapper.getUnadjustedBounds(node); + if ((before && (Math.round(bounds.width / 2) + bounds.left - bnds.left < 24)) + || (!before && (Math.round(bounds.width / 2) + bounds.left - (bnds.left + bnds.width) < 24))) { + status.violation = node.nodeName.toLowerCase(); + return "violation"; + } + else + return "no"; + } + } + if (!CommonUtil_1.CommonUtil.isInnerTextOnlyEmpty(node)) + return "yes"; + return "no"; + } + else + return "block"; + } + else + return "block"; + } + // an inline element is inside a block. note <body> is a block element too + // one or more inline elements with text in the same line: <target>, text<target>, <target>text, <inline>+text<target>, <target><inline>+text, text<target><inline>+ + var walkNode = element.nextSibling; + while (walkNode) { + var inlineText = isInlineWithText(walkNode, true); + if (inlineText === "yes") { + status.text = true; + break; + } + if (inlineText === "block") { + break; + } + walkNode = walkNode.nextSibling; + } + walkNode = element.previousSibling; + while (walkNode) { + var inlineText = isInlineWithText(walkNode, false); + if (inlineText === "yes") { + status.text = true; + break; + } + if (inlineText === "block") { + break; + } + walkNode = walkNode.previousSibling; + } + return status; + }; + /** + * a target is en element that accept a pointer action (click or touch) + * a target is a browser default if it's a native widget (no user defined role) without user style + */ + CSSUtil.isTargetBrowserDefault = function (element) { + if (!element) + return false; + // user defined widget + var roles = AriaUtil_1.AriaUtil.getRoles(element, false); + if (roles && roles.length > 0) + return false; + // no user style to space control size, including use of font + var styles = CSSUtil.getDefinedStyles(element, [ + "line-height", "height", "width", "min-height", "min-width", + "font-size", "margin-top", "margin-bottom", "margin-left", "margin-right" + ]); + if (styles["line-height"] || + styles["height"] || + styles["width"] || + styles["min-height"] || + styles["min-width"] || + styles["font-size"] || + styles["margin-top"] || + styles["margin-bottom"] || + styles["margin-left"] || + styles["margin-right"]) + return false; + return true; + }; + /* + * string contains CJK (chinese, japaneses, or korea) + * return: boolean + */ + CSSUtil.containsCKJ = function (text) { + if (!text) + return false; + // https://en.wikipedia.org/wiki/CJK_Unified_Ideographs https://ayaka.shn.hk/hanregex/ + var regex = /(?:[\u4e00-\u9fff\u3400-\u4dbf])+/g; + var replaced = text.trim().replace(regex, ""); + if (replaced.length === text.trim().length) + return false; + return true; + }; + /** + * Return the ancestor with the given style properties. + * Searches up the DOM tree to find an ancestor that has ALL specified style properties + * with values matching the criteria. + * + * @param {element} elem - The element to start the node walk on to find parent node + * @param {Object} styleProps - The style properties and values of the parent to search for. + * such as {"overflow":['auto', 'scroll'], "overflow-x":['auto', 'scroll']} + * or {"overflow":['*'], "overflow-x":['*']}, The '*' for any value to check the existence of the style prop. + * @param {Array} excludedValues - style values that should be ignored. + * @return {Element|null} - An ancestor element that has all the specified style properties, or null if none found + * @memberOf CSSUtil + */ + CSSUtil.getAncestorWithStyles = function (elem, styleProps, excludedValues) { + if (excludedValues === void 0) { excludedValues = []; } + // Create a cache key that includes the style properties being searched for + var cacheKey = "AriaUtil_AncestorWithStyles_" + JSON.stringify(styleProps) + "_" + JSON.stringify(excludedValues); + // Check if we already have a cached result for this specific query + var cachedResult = CacheUtil_1.CacheUtil.getCache(elem, cacheKey, null); + if (cachedResult !== null) { + return cachedResult === "NOT_FOUND" ? null : cachedResult; + } + // Start with the element itself (not just parent) to maintain backward compatibility + var walkNode = elem; + while (walkNode !== null) { + // Skip if not an HTMLElement (e.g., SVGElement) + // Use nodeType check instead of instanceof to work across different document contexts + if (walkNode.nodeType !== 1 || walkNode.namespaceURI === "http://www.w3.org/2000/svg") { + walkNode = DOMWalker_1.DOMWalker.parentElement(walkNode); + continue; + } + var styles = CSSUtil.getDefinedStyles(walkNode, Object.keys(styleProps)); + // Check if ANY specified style property matches the criteria (OR logic) + for (var styleProp in styleProps) { + var value = styles[styleProp]; + if (!value) { + // Property not defined on this element, try next property + continue; + } + // Remove !important suffix for comparison + value = value.split(" ")[0]; + // Check if value should be excluded + if (excludedValues.includes(value)) { + continue; + } + // Check if value matches the criteria + var acceptedValues = styleProps[styleProp]; + if (acceptedValues.includes('*')) { + // Any value is acceptable (just checking existence) + CacheUtil_1.CacheUtil.setCache(elem, cacheKey, walkNode); + return walkNode; + } + else if (acceptedValues.includes(value)) { + // Value matches one of the accepted values + CacheUtil_1.CacheUtil.setCache(elem, cacheKey, walkNode); + return walkNode; + } + } + walkNode = DOMWalker_1.DOMWalker.parentElement(walkNode); + } + // No matching element or ancestor found - cache this result to avoid re-searching + CacheUtil_1.CacheUtil.setCache(elem, cacheKey, "NOT_FOUND"); + return null; + }; + /** + * return an array [value, Unit] from a value-unit combo string + * @param valueUnitCombo, such as 20px, 2rem + * @returns + */ + CSSUtil.getValueUnitPair = function (valueUnitCombo) { + if (!valueUnitCombo) + return null; + if (Number.isInteger(valueUnitCombo)) + return ["px", valueUnitCombo]; + var value = parseInt(valueUnitCombo); + if (isNaN(value)) + return null; + valueUnitCombo = valueUnitCombo.trim().toLowerCase(); + var match = valueUnitCombo.trim().match(/([a-z]+)$/); + var unit = 'px'; + if (match) + unit = match[1]; + return [unit, value]; + }; + return CSSUtil; +}()); +exports.CSSUtil = CSSUtil; + + +/***/ }, + +/***/ "./src/v4/util/CacheUtil.ts" +/*!**********************************!*\ + !*** ./src/v4/util/CacheUtil.ts ***! + \**********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.CacheUtil = void 0; +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var CacheUtil = /** @class */ (function () { + function CacheUtil() { + } + /* Return a pointer to the given global variable + * with its initial value as given */ + CacheUtil.getCache = function (cacheSpot, keyName, initValue) { + if (!cacheSpot) + return undefined; + var cacheObj = (cacheSpot.nodeType === 9 /* Node.DOCUMENT_NODE */ || cacheSpot.nodeType === 11 /* Node.DOCUMENT_FRAGMENT_NODE */) ? cacheSpot : cacheSpot; + if (cacheObj.aceCache === undefined) { + cacheObj.aceCache = {}; + } + if (cacheObj.aceCache[keyName] === undefined) { + cacheObj.aceCache[keyName] = initValue; + } + return cacheObj.aceCache[keyName]; + }; + CacheUtil.setCache = function (cacheSpot, globalName, value) { + if (!cacheSpot) + return undefined; + var cacheObj = (cacheSpot.nodeType === 9 /* Node.DOCUMENT_NODE */ || cacheSpot.nodeType === 11 /* Node.DOCUMENT_FRAGMENT_NODE */) ? cacheSpot : cacheSpot; + if (cacheObj.aceCache === undefined) { + cacheObj.aceCache = {}; + } + cacheObj.aceCache[globalName] = value; + return value; + }; + CacheUtil.getSetCache = function (cacheSpot, keyName, initFunc) { + if (!cacheSpot) + return undefined; + var cacheObj = (cacheSpot.nodeType === 9 /* Node.DOCUMENT_NODE */ || cacheSpot.nodeType === 11 /* Node.DOCUMENT_FRAGMENT_NODE */) ? cacheSpot : cacheSpot; + if (cacheObj.aceCache === undefined) { + cacheObj.aceCache = {}; + } + if (cacheObj.aceCache[keyName] === undefined || typeof cacheObj.aceCache[keyName] === "undefined") { + cacheObj.aceCache[keyName] = initFunc(); + } + return cacheObj.aceCache[keyName]; + }; + CacheUtil.clearCaches = function (cacheRoot) { + var numNodesVisited = 0; + delete cacheRoot.ownerDocument.aceCache; + var nw = new DOMWalker_1.DOMWalker(cacheRoot, false, cacheRoot, true); + do { + ++numNodesVisited; + delete nw.node.aceCache; + nw.node.ownerDocument && delete nw.node.ownerDocument.aceCache; + } while (nw.nextNode()); + return numNodesVisited; + }; + return CacheUtil; +}()); +exports.CacheUtil = CacheUtil; + + +/***/ }, + +/***/ "./src/v4/util/ClipPathUtil.ts" +/*!*************************************!*\ + !*** ./src/v4/util/ClipPathUtil.ts ***! + \*************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ClipPathUtil = void 0; +var CacheUtil_1 = __webpack_require__(/*! ./CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var CSSUtil_1 = __webpack_require__(/*! ./CSSUtil */ "./src/v4/util/CSSUtil.ts"); +var ClipPathUtil = /** @class */ (function () { + function ClipPathUtil() { + } + /** + * This function is responsible for checking if the node that is visually hidden by css clip-path: + * + * Note 1: If either current node or any of the parent nodes are visually hidden then this + * function will return true (node is not visually hidden). + * + * Note 2: nodes with CSS properties clip-path, the content is not considered hidden to an AT. Text hidden with these methods + * can still be reedable by screen readers. + * Note 3: if a link, form control, or other focusable element is given this style, the element would be focusable but not visible, + * keyboard users might be confused. + * + * @parm {Node} node The node which should be checked if it is visually hidden or not. + * @return {bool} true if the node is visually hidden, false otherwise + * + * @memberOf VisUtil + */ + ClipPathUtil.isNodeVisuallyHiddenByClipPath = function (node) { + if (!node || node.nodeType !== 1) + return false; + var elem = node; + var hidden = CacheUtil_1.CacheUtil.getCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", undefined); + if (hidden !== undefined) + return hidden; + var style = CSSUtil_1.CSSUtil.getComputedStyle(elem); + var width = parseInt(style.width); //always in px + var height = parseInt(style.height); //always in px + var path = style['clip-path']; + if (!path || path.trim() === 'none' || path.trim() === '') { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + path = path.trim().replace(/\s+/g, ' ').toLowerCase(); + var index = path.indexOf("inset("); + if (index !== -1) { + var round_index = path.indexOf("round"); + var str = path.substring(path.indexOf("(") + 1, path.indexOf(")")); + if (round_index !== -1) + str = path.substring(path.indexOf("(") + 1, round_index); + var numbers = str.trim().split(" "); + // When one value is specified, it applies the same inset to all four sides + if (numbers.length === 1) { + var ret = ClipPathUtil.isClippedByInset(elem, numbers[0], numbers[0], numbers[0], numbers[0]); + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", ret); + return ret; + } + // When two values are specified, the first value applies to the top and bottom, the second to the left and right. + if (numbers.length === 2) { + var ret = ClipPathUtil.isClippedByInset(elem, numbers[0], numbers[1], numbers[0], numbers[1]); + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", ret); + return ret; + } + // When three values are specified, the first applies to the top, the second to the right and left, the third to the bottom. + if (numbers.length === 3) { + var ret = ClipPathUtil.isClippedByInset(elem, numbers[0], numbers[1], numbers[1], numbers[2]); + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", ret); + return ret; + } + // When four values are specified, the values apply to the top, right, bottom, and left in that order (clockwise). + if (numbers.length === 4) { + var ret = ClipPathUtil.isClippedByInset(elem, numbers[0], numbers[1], numbers[2], numbers[3]); + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", ret); + return ret; + } + } + index = path.indexOf("rect("); + if (index !== -1) { + var round_index = path.indexOf("round"); + var str = path.substring(path.indexOf("(") + 1, path.indexOf(")")); + if (round_index !== -1) + str = path.substring(path.indexOf("(") + 1, round_index); + var numbers = str.trim().split(" "); + /** + * The first (top) and third (bottom) values are distances from the top edge of the containing block, + * and the second (right) and fourth (left) values are distances from the left edge of the containing block. + * The second (right) and third (bottom) values are clamped by the fourth (left) and first (top) values, respectively, + * + * If auto is used for the first (top) or fourth (left) value, the value of auto is 0, + * and if used for the second (right) or third (bottom) value, the value of auto is 100%. + */ + if (numbers[0] === 'auto') + numbers[0] = '0px'; + if (numbers[3] === 'auto') + numbers[3] = '0px'; + if (numbers[1] === 'auto') + numbers[1] = '100%'; + if (numbers[2] === 'auto') + numbers[2] = '100%'; + // to prevent the bottom edge from crossing over the top edge and right edge from crossing over the left edge. + // for example, rect(10px 0 0 20px) is clamped to rect(10px 20px 10px 20px) + numbers[2] = Math.max(numbers[0], numbers[2]); + numbers[1] = Math.max(numbers[1], numbers[3]); + var top_1 = parseInt(numbers[0]); + if (isNaN(top_1)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + if (numbers[0].endsWith("%")) + top_1 = top_1 * height / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(top_1); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + top_1 = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (top_1 >= height) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + var left = parseInt(numbers[3]); + if (isNaN(left)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + if (numbers[3].endsWith("%")) + left = left * width / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(left); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + left = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (left >= width) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + var right = parseInt(numbers[1]); + if (isNaN(right)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + if (numbers[1].endsWith("%")) + right = right * width / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(right); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + right = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + var bottom = parseInt(numbers[2]); + if (isNaN(bottom)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + if (numbers[2].endsWith("%")) + bottom = bottom * height / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(bottom); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + bottom = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if ((bottom - top_1) <= ClipPathUtil.THRESHOLD || (right - left) <= ClipPathUtil.THRESHOLD) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + index = path.indexOf("xywh("); + if (index !== -1) { + var round_index = path.indexOf("round"); + var str = path.substring(path.indexOf("(") + 1, path.indexOf(")")); + if (round_index !== -1) + str = path.substring(path.indexOf("(") + 1, round_index); + var numbers = str.trim().split(" "); + var x = parseInt(numbers[0]); + if (isNaN(x)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + if (numbers[0].endsWith("%")) + x = x * width / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(top); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + x = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (x >= width) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + var y = parseInt(numbers[1]); + if (isNaN(y)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + if (numbers[1].endsWith("%")) + y = y * height / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(y); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + scrollY = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (y >= height) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + var w = parseInt(numbers[2]); + if (isNaN(w)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + if (numbers[2].endsWith("%")) + w = w * width / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(w); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + w = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (w <= ClipPathUtil.THRESHOLD) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", true); + return true; + } + var h = parseInt(numbers[3]); + if (isNaN(h)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + if (numbers[3].endsWith("%")) + h = h * height / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(h); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + h = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (h <= ClipPathUtil.THRESHOLD) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + index = path.indexOf("circle("); + if (index !== -1) { + var str = path.substring(path.indexOf("(") + 1, path.indexOf(")")); + var numbers = str.trim().split(" "); + var radius = parseInt(numbers[0]); + if (isNaN(radius)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + if (numbers[0].endsWith("%")) { + var short = width > height ? height : width; + radius = radius * short / 100; + } + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(radius); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + radius = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (radius <= ClipPathUtil.THRESHOLD) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + index = path.indexOf("ellipse("); + if (index !== -1) { + var str = path.substring(path.indexOf("(") + 1, path.indexOf(")")); + var numbers = str.trim().split(" "); + // ellipse(closest-side farthest-side at 30% 40%); + if (numbers.length > 3 && numbers[0] === 'closest-side' && numbers[1] === 'farthest-side' && numbers[2] === 'at') { + var radius = parseInt(numbers[3]); + if (numbers.length === 4) { + if (numbers[3].endsWith("%")) { + var value = width > height ? height : width; + radius = radius * value / 100; + } + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(radius); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + radius = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (radius <= ClipPathUtil.THRESHOLD) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + else if (numbers.length === 5) { + for (var i = 3; i < numbers.length; i++) { + var radius_1 = parseInt(numbers[i]); + if (numbers[i].endsWith("%")) { + var value = (i === 3) ? width : height; + radius_1 = radius_1 * value / 100; + } + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(radius_1); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + radius_1 = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (radius_1 <= ClipPathUtil.THRESHOLD) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + // ellipse(40% 50% at left); + var at_index = path.indexOf("at"); + str = path.substring(path.indexOf("(") + 1, path.indexOf(")")); + if (at_index !== -1) + str = path.substring(path.indexOf("(") + 1, at_index); + numbers = str.trim().split(" "); + if (numbers.length !== 2) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + for (var i = 0; i < numbers.length; i++) { + var radius = parseInt(numbers[i]); + if (numbers[i].endsWith("%")) { + var value = (i === 0) ? width : height; + radius = radius * value / 100; + } + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(radius); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + radius = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (radius <= ClipPathUtil.THRESHOLD) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + index = path.indexOf("polygon("); + if (index !== -1) { + var str = path.substring(path.indexOf("(") + 1, path.indexOf(")")); + var numbers = str.trim().split(","); + // polygon(nonzero|evenodd, 0% 0%, 50% 50%, 0% 100%) + if (numbers[0] === 'nonzero' || numbers[0] === 'evenodd') + numbers.shift(); + var y = 0; + var x = 0; + var changed_x = false; + var changed_y = false; + for (var i = 0; i < numbers.length; i++) { + var coordinates = numbers[i].trim().split(" "); + if (coordinates.length != 2) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + var coordinate_xy = [0, 0]; + for (var i_1 = 0; i_1 < 2; i_1++) { + var value = parseInt(coordinates[i_1]); + if (isNaN(value)) + return false; + if (coordinates[i_1].endsWith("%")) + coordinate_xy[i_1] = (i_1 === 0) ? value * width / 100 : value * height / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(coordinates[i_1]); + if (!pair) + return false; + coordinate_xy[i_1] = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + } + if (i === 0) { + x = coordinate_xy[0]; + y = coordinate_xy[1]; + } + if (Math.abs(coordinate_xy[0] - x) >= ClipPathUtil.THRESHOLD) + changed_x = true; + if (Math.abs(coordinate_xy[1] - y) >= ClipPathUtil.THRESHOLD) + changed_y = true; + } + if (changed_x && changed_y) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + }; + ClipPathUtil.isClippedByInset = function (elem, top, right, bottom, left) { + if (right === void 0) { right = '0px'; } + if (bottom === void 0) { bottom = '0px'; } + if (left === void 0) { left = '0px'; } + var style = CSSUtil_1.CSSUtil.getComputedStyle(elem); + var width = parseInt(style.width); //always in px + var height = parseInt(style.height); //always in px + // top + var top_value = parseInt(top); + if (isNaN(top_value)) + return false; + if (top.endsWith("%")) + top_value = top_value * height / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(top); + if (!pair) + return false; + top_value = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + //inset outside of the container + if (top_value > height) + return false; + // right + var right_value = parseInt(right); + if (isNaN(right_value)) + return false; + if (right.endsWith("%")) + right_value = right_value * width / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(right); + if (!pair) + return false; + right_value = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + //inset outside of the container + if (right_value > width) + return false; + // bottom + var bottom_value = parseInt(bottom); + if (isNaN(bottom_value)) + return false; + if (bottom.endsWith("%")) + bottom_value = bottom_value * height / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(bottom); + if (!pair) + return false; + bottom_value = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + //inset outside of the container + if (bottom_value > height) + return false; + // left + var left_value = parseInt(left); + if (isNaN(left_value)) + return false; + if (left.endsWith("%")) + left_value = left_value * width / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(left); + if (!pair) + return false; + left_value = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + //inset outside of the container + if (left_value > width) + return false; + if (height - (top_value + bottom_value) <= ClipPathUtil.THRESHOLD || width - (right_value + left_value) <= ClipPathUtil.THRESHOLD) + return true; + return false; + }; + ClipPathUtil.THRESHOLD = 5; // 5px + return ClipPathUtil; +}()); +exports.ClipPathUtil = ClipPathUtil; + + +/***/ }, + +/***/ "./src/v4/util/ColorUtil.ts" +/*!**********************************!*\ + !*** ./src/v4/util/ColorUtil.ts ***! + \**********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ColorObj = exports.ColorUtil = void 0; +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var ColorUtil = /** @class */ (function () { + function ColorUtil() { + } + // Rewrite the color object to account for alpha + ColorUtil.Color = function (cssStyleColor) { + if (!cssStyleColor) + return null; + cssStyleColor = cssStyleColor.toLowerCase(); + if (cssStyleColor === "transparent") + return new ColorObj(255, 255, 255, 0); + if (cssStyleColor in ColorUtil.CSSColorLookup) + cssStyleColor = ColorUtil.CSSColorLookup[cssStyleColor]; + if (cssStyleColor.startsWith("rgb(")) { + var rgbRegex = /\s*rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/; + var m = cssStyleColor.match(rgbRegex); + if (m === null) + return null; + else { + return new ColorObj(m[1], m[2], m[3]); + } + } + else if (cssStyleColor.startsWith("rgba(")) { + var rgbRegex = /\s*rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(.+)\s*\)/; + var m = cssStyleColor.match(rgbRegex); + if (m === null) + return null; + else { + return new ColorObj(m[1], m[2], m[3], m[4]); + } + } + else if (cssStyleColor.charAt(0) != "#") { + return null; + } + else { + if (cssStyleColor.length === 4) { + // The three-digit RGB (#rgb) is converted to six-digit form (#rrggbb) by replicating digits + // (https://www.w3.org/TR/css-color-3/#rgb-color) + cssStyleColor = "#" + cssStyleColor.charAt(1).repeat(2) + + cssStyleColor.charAt(2).repeat(2) + + cssStyleColor.charAt(3).repeat(2); + } + var thisRed = parseInt(cssStyleColor.substring(1, 3), 16); + var thisGreen = parseInt(cssStyleColor.substring(3, 5), 16); + var thisBlue = parseInt(cssStyleColor.substring(5, 7), 16); + return new ColorObj(thisRed, thisGreen, thisBlue); + } + // return null; // Unreachable + }; + ; + ColorUtil.ColorCombo = function (ruleContext) { + try { + var doc = ruleContext.ownerDocument; + if (!doc) { + return null; + } + var win = doc.defaultView; + if (!win) { + return null; + } + var ancestors = []; + var walkNode = ruleContext; + while (walkNode) { + if (walkNode.nodeType === 1) + ancestors.push(walkNode); + walkNode = DOMWalker_1.DOMWalker.parentElement(walkNode); + } + var retVal = { + "hasGradient": false, + "hasBGImage": false, + "textShadow": false, + "fg": null, + "bg": null + }; + // start + var cStyle = win.getComputedStyle(ruleContext); + var compStyleColor = cStyle.color; + if (!compStyleColor) + compStyleColor = "black"; + var fg = ColorUtil.Color(compStyleColor); + var reColor = /transparent|rgba?\([^)]+\)/gi; + var guessGradColor = function (gradList, bgColor, fgColor) { + try { + // If there's only one color, return that + if (typeof gradList.length === "undefined") + return gradList; + var overallWorst = null; + var overallWorstRatio = null; + for (var iGrad = 1; iGrad < gradList.length; ++iGrad) { + var worstColor = gradList[iGrad - 1]; + var worstRatio = fgColor.contrastRatio(gradList[iGrad - 1]); + var step = .1; + var idx = 0; + while (step > .0001) { + while (idx + step <= 1 && worstRatio > fgColor.contrastRatio(gradList[iGrad].mix(gradList[iGrad - 1], idx + step).getOverlayColor(bgColor))) { + worstColor = gradList[iGrad].mix(gradList[iGrad - 1], idx + step).getOverlayColor(bgColor); + worstRatio = fgColor.contrastRatio(worstColor); + idx = idx + step; + } + while (idx - step >= 0 && worstRatio > fgColor.contrastRatio(gradList[iGrad].mix(gradList[iGrad - 1], idx - step).getOverlayColor(bgColor))) { + worstColor = gradList[iGrad].mix(gradList[iGrad - 1], idx - step).getOverlayColor(bgColor); + worstRatio = fgColor.contrastRatio(worstColor); + idx = idx - step; + } + step = step / 10; + } + if (overallWorstRatio === null || overallWorstRatio > worstRatio) { + overallWorstRatio = worstRatio; + overallWorst = worstColor; + } + } + return overallWorst; // return the darkest color + } + catch (e) { + console.log(e); + } + return bgColor; + }; + var priorStackBG = ColorUtil.Color("white"); + var thisStackOpacity = null; + var thisStackAlpha = null; + var thisStackBG = null; + // Ancestors processed from the topmost parent toward the child + while (ancestors.length > 0) { + var procNext = ancestors.pop(); + //var procNext = ancestors.splice(0, 1)[0]; + // cStyle is the computed style of this layer + var cStyle = win.getComputedStyle(procNext); + if (cStyle === null) + continue; + // thisBgColor is the color of this layer or null if the layer is transparent + var thisBgColor = null; + if (cStyle.backgroundColor && cStyle.backgroundColor != "transparent" && cStyle.backgroundColor != "rgba(0, 0, 0, 0)") { + thisBgColor = ColorUtil.Color(cStyle.backgroundColor); + } + // If there is a gradient involved, set thisBgColor to the worst color combination available against the foreground + if (cStyle.backgroundImage && cStyle.backgroundImage.indexOf && cStyle.backgroundImage.indexOf("gradient") != -1) { + var gradColors = cStyle.backgroundImage.match(reColor); + if (gradColors) { + var gradColorComp = []; + for (var i = 0; i < gradColors.length; ++i) { + if (!gradColors[i].length) { + gradColors.splice(i--, 1); + } + else { + var colorComp = ColorUtil.Color(gradColors[i]); + if (colorComp.alpha !== undefined && colorComp.alpha < 1) { + // mix the grdient bg color wit parent bg if alpha < 1 + var compStackBg = thisStackBG || priorStackBG; + colorComp = colorComp.getOverlayColor(compStackBg); + } + gradColorComp.push(colorComp); + } + } + thisBgColor = guessGradColor(gradColorComp, thisStackBG || priorStackBG, fg); + } + } + // Handle non-solid opacity + if (thisStackOpacity === null || (cStyle.opacity && cStyle.opacity.length > 0 && parseFloat(cStyle.opacity) < 1)) { + // New stack, reset + if (thisStackBG != null) { + // Overlay + thisStackBG.alpha = thisStackOpacity * thisStackAlpha; + priorStackBG = thisStackBG.getOverlayColor(priorStackBG); + } + thisStackOpacity = 1.0; + thisStackAlpha = null; + thisStackBG = null; + if (cStyle.opacity && cStyle.opacity.length > 0) { + thisStackOpacity = parseFloat(cStyle.opacity); + } + if (thisBgColor != null) { + thisStackBG = thisBgColor; + thisStackAlpha = thisStackBG.alpha || 1.0; + delete thisStackBG.alpha; + if (thisStackOpacity === 1.0 && thisStackAlpha === 1.0) { + retVal.hasBGImage = false; + retVal.hasGradient = false; + } + } + } + // Handle solid color backgrounds and gradient color backgrounds + else if (thisBgColor != null) { + // If this stack already has a background color, blend it + if (thisStackBG === null) { + thisStackBG = thisBgColor; + thisStackAlpha = thisStackBG.alpha || 1.0; + delete thisStackBG.alpha; + } + else { + thisStackBG = thisBgColor.getOverlayColor(thisStackBG); + //thisStackAlpha = thisBgColor.alpha || 1.0; + thisStackAlpha = thisStackBG.alpha || 1.0; + } + // #526: If thisBgColor had an alpha value, it may not expose through thisStackBG in the above code + // We can't wipe out the gradient info if this layer was transparent + if (thisStackOpacity === 1.0 && thisStackAlpha === 1.0 && (thisStackBG.alpha || 1.0) === 1.0 && (thisBgColor.alpha || 1.0) === 0) // removed by dead control flow +{} + } + if (cStyle.backgroundImage && cStyle.backgroundImage != "none") { + if (cStyle.backgroundImage.indexOf && cStyle.backgroundImage.indexOf("gradient") != -1) { + retVal.hasGradient = true; + } + else { + retVal.hasBGImage = true; + } + } + } + if (thisStackBG != null) { + fg = fg.getOverlayColor(thisStackBG); + delete fg.alpha; + } + fg.alpha = (fg.alpha || 1) * thisStackOpacity; + fg = fg.getOverlayColor(priorStackBG); + if (thisStackBG != null) { + thisStackBG.alpha = thisStackOpacity * thisStackAlpha; + priorStackBG = thisStackBG.getOverlayColor(priorStackBG); + } + retVal.fg = fg; + retVal.bg = priorStackBG; + if (cStyle.textShadow && cStyle.textShadow !== 'none') + retVal.textShadow = true; + return retVal; + } + catch (err) { + // something happened, then... + return null; + } + }; + ; + ColorUtil.CSSColorLookup = { + "aliceblue": "#f0f8ff", + "antiquewhite": "#faebd7", + "aqua": "#00ffff", + "aquamarine": "#7fffd4", + "azure": "#f0ffff", + "beige": "#f5f5dc", + "bisque": "#ffe4c4", + "black": "#000000", + "blanchedalmond": "#ffebcd", + "blue": "#0000ff", + "blueviolet": "#8a2be2", + "brown": "#a52a2a", + "burlywood": "#deb887", + "cadetblue": "#5f9ea0", + "chartreuse": "#7fff00", + "chocolate": "#d2691e", + "coral": "#ff7f50", + "cornflowerblue": "#6495ed", + "cornsilk": "#fff8dc", + "crimson": "#dc143c", + "cyan": "#00ffff", + "darkblue": "#00008b", + "darkcyan": "#008b8b", + "darkgoldenrod": "#b8860b", + "darkgray": "#a9a9a9", + "darkgreen": "#006400", + "darkkhaki": "#bdb76b", + "darkmagenta": "#8b008b", + "darkolivegreen": "#556b2f", + "darkorange": "#ff8c00", + "darkorchid": "#9932cc", + "darkred": "#8b0000", + "darksalmon": "#e9967a", + "darkseagreen": "#8fbc8f", + "darkslateblue": "#483d8b", + "darkslategray": "#2f4f4f", + "darkturquoise": "#00ced1", + "darkviolet": "#9400d3", + "deeppink": "#ff1493", + "deepskyblue": "#00bfff", + "dimgray": "#696969", + "dodgerblue": "#1e90ff", + "firebrick": "#b22222", + "floralwhite": "#fffaf0", + "forestgreen": "#228b22", + "fuchsia": "#ff00ff", + "gainsboro": "#dcdcdc", + "ghostwhite": "#f8f8ff", + "gold": "#ffd700", + "goldenrod": "#daa520", + "gray": "#808080", + "green": "#008000", + "greenyellow": "#adff2f", + "honeydew": "#f0fff0", + "hotpink": "#ff69b4", + "indianred": "#cd5c5c", + "indigo": "#4b0082", + "ivory": "#fffff0", + "khaki": "#f0e68c", + "lavender": "#e6e6fa", + "lavenderblush": "#fff0f5", + "lawngreen": "#7cfc00", + "lemonchiffon": "#fffacd", + "lightblue": "#add8e6", + "lightcoral": "#f08080", + "lightcyan": "#e0ffff", + "lightgoldenrodyellow": "#fafad2", + "lightgrey": "#d3d3d3", + "lightgreen": "#90ee90", + "lightpink": "#ffb6c1", + "lightsalmon": "#ffa07a", + "lightseagreen": "#20b2aa", + "lightskyblue": "#87cefa", + "lightslategray": "#778899", + "lightsteelblue": "#b0c4de", + "lightyellow": "#ffffe0", + "lime": "#00ff00", + "limegreen": "#32cd32", + "linen": "#faf0e6", + "magenta": "#ff00ff", + "maroon": "#800000", + "mediumaquamarine": "#66cdaa", + "mediumblue": "#0000cd", + "mediumorchid": "#ba55d3", + "mediumpurple": "#9370d8", + "mediumseagreen": "#3cb371", + "mediumslateblue": "#7b68ee", + "mediumspringgreen": "#00fa9a", + "mediumturquoise": "#48d1cc", + "mediumvioletred": "#c71585", + "midnightblue": "#191970", + "mintcream": "#f5fffa", + "mistyrose": "#ffe4e1", + "moccasin": "#ffe4b5", + "navajowhite": "#ffdead", + "navy": "#000080", + "oldlace": "#fdf5e6", + "olive": "#808000", + "olivedrab": "#6b8e23", + "orange": "#ffa500", + "orangered": "#ff4500", + "orchid": "#da70d6", + "palegoldenrod": "#eee8aa", + "palegreen": "#98fb98", + "paleturquoise": "#afeeee", + "palevioletred": "#d87093", + "papayawhip": "#ffefd5", + "peachpuff": "#ffdab9", + "peru": "#cd853f", + "pink": "#ffc0cb", + "plum": "#dda0dd", + "powderblue": "#b0e0e6", + "purple": "#800080", + "red": "#ff0000", + "rosybrown": "#bc8f8f", + "royalblue": "#4169e1", + "saddlebrown": "#8b4513", + "salmon": "#fa8072", + "sandybrown": "#f4a460", + "seagreen": "#2e8b57", + "seashell": "#fff5ee", + "sienna": "#a0522d", + "silver": "#c0c0c0", + "skyblue": "#87ceeb", + "slateblue": "#6a5acd", + "slategray": "#708090", + "snow": "#fffafa", + "springgreen": "#00ff7f", + "steelblue": "#4682b4", + "tan": "#d2b48c", + "teal": "#008080", + "thistle": "#d8bfd8", + "tomato": "#ff6347", + "turquoise": "#40e0d0", + "violet": "#ee82ee", + "wheat": "#f5deb3", + "white": "#ffffff", + "whitesmoke": "#f5f5f5", + "yellow": "#ffff00", + "yellowgreen": "#9acd32", + "buttontext": "rgba(0, 0, 0, 0.847)", + "buttonface": "#ffffff", + "graytext": "rgba(0, 0, 0, 0.247)" + }; + return ColorUtil; +}()); +exports.ColorUtil = ColorUtil; +var ColorObj = /** @class */ (function () { + function ColorObj(red, green, blue, alpha) { + function fixComponent(comp) { + if (typeof (comp) != typeof ("")) + return comp; + var compStr = comp; + compStr = compStr.trim(); + if (compStr[compStr.length - 1] != "%") + return parseInt(compStr); + return Math.round(parseFloat(compStr.substring(0, compStr.length - 1)) * 2.55); + } + this.red = fixComponent(red); + this.green = fixComponent(green); + this.blue = fixComponent(blue); + if (typeof (alpha) != "undefined") { + this.alpha = (typeof (alpha) === typeof ("")) ? parseFloat(alpha) : alpha; + } + } + ColorObj.prototype.toHexHelp = function (value) { + var retVal = Math.round(value).toString(16); + if (retVal.length === 1) + return "0" + retVal; + return retVal; + }; + ; + ColorObj.prototype.toHex = function () { + return "#" + this.toHexHelp(this.red) + this.toHexHelp(this.green) + this.toHexHelp(this.blue); + }; + ; + ColorObj.prototype.contrastRatio = function (bgColor) { + var fgColor = this; + if (typeof (this.alpha) != "undefined") + fgColor = this.getOverlayColor(bgColor); + var lum1 = fgColor.relativeLuminance(); + if (!bgColor.relativeLuminance) { + var s = ""; + for (var key in bgColor) { + s += key + "\n"; + } + alert(bgColor); + alert(s); + } + var lum2 = bgColor.relativeLuminance(); + var ratio = (lum1 > lum2) ? (lum1 + .05) / (lum2 + .05) : (lum2 + .05) / (lum1 + .05); + return ratio; + }; + ; + ColorObj.prototype.relativeLuminance = function () { + var R = this.red / 255.0; + var G = this.green / 255.0; + var B = this.blue / 255.0; + R = R <= .04045 ? R / 12.92 : Math.pow((R + .055) / 1.055, 2.4); + G = G <= .04045 ? G / 12.92 : Math.pow((G + .055) / 1.055, 2.4); + B = B <= .04045 ? B / 12.92 : Math.pow((B + .055) / 1.055, 2.4); + return 0.2126 * R + 0.7152 * G + 0.0722 * B; + }; + ; + ColorObj.prototype.mix = function (color2, percThis) { + if (typeof (this.alpha) === "undefined" && typeof (color2.alpha) === "undefined") { + return new ColorObj(percThis * this.red + (1 - percThis) * color2.red, percThis * this.green + (1 - percThis) * color2.green, percThis * this.blue + (1 - percThis) * color2.blue); + } + else { + var alphaThis = this.alpha ? this.alpha : 1; + var alphaOther = color2.alpha ? color2.alpha : 1; + return new ColorObj(percThis * this.red + (1 - percThis) * color2.red, percThis * this.green + (1 - percThis) * color2.green, percThis * this.blue + (1 - percThis) * color2.blue, percThis * alphaThis + (1 - percThis) * alphaOther); + } + }; + ; + ColorObj.prototype.getOverlayColor = function (bgColor) { + if (typeof (this.alpha) === "undefined" || this.alpha >= 1) { + // No mixing required - it's opaque + return this; + } + if (this.alpha < 0) { + // Haac.Error.logError("Invalid alpha value"); + return null; + } + if (typeof (bgColor.alpha) != "undefined" && bgColor.alpha < 1) { + // Haac.Error.logError("Cannot mix with a background alpha"); + return null; + } + var retVal = this.mix(bgColor, this.alpha); + delete retVal.alpha; + return retVal; + }; + ColorObj.fromCSSColor = function (cssStyleColor) { + var thisRed = -1; + var thisGreen = -1; + var thisBlue = -1; + cssStyleColor = cssStyleColor.toLowerCase(); + if (cssStyleColor.startsWith("rgb(")) { + var rgbRegex = /\s*rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/; + var m = cssStyleColor.match(rgbRegex); + if (m === null) + return null; + else { + thisRed = m[1]; + thisGreen = m[2]; + thisBlue = m[3]; + } + } + else if (cssStyleColor.startsWith("rgba(")) { + var rgbRegex = /\s*rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(.+)\s*\)/; + var m = cssStyleColor.match(rgbRegex); + if (m === null) + return null; + else { + thisRed = m[1]; + thisGreen = m[2]; + thisBlue = m[3]; + } + } + else { + if (cssStyleColor.charAt(0) != "#") { + if (cssStyleColor in ColorUtil.CSSColorLookup) + cssStyleColor = ColorUtil.CSSColorLookup[cssStyleColor]; + else + return null; + } + var fromHex = function (val) { + var lookup = { + "a": 10, + "b": 11, + "c": 12, + "d": 13, + "e": 14, + "f": 15 + }; + var retVal = 0; + for (var i = 0; i < val.length; ++i) { + retVal = retVal * 16 + + parseInt(val.charAt(i) in lookup ? lookup[val.charAt(i)] : val.charAt(i)); + } + return retVal; + }; + if (cssStyleColor.length === 4) { + // The three-digit RGB (#rgb) is converted to six-digit form (#rrggbb) by replicating digits + // (https://www.w3.org/TR/css-color-3/#rgb-color) + cssStyleColor = "#" + cssStyleColor.charAt(1).repeat(2) + + cssStyleColor.charAt(2).repeat(2) + + cssStyleColor.charAt(3).repeat(2); + } + thisRed = fromHex(cssStyleColor.substring(1, 3)); + thisGreen = fromHex(cssStyleColor.substring(3, 5)); + thisBlue = fromHex(cssStyleColor.substring(5, 7)); + } + return new ColorObj(thisRed, thisGreen, thisBlue); + }; + return ColorObj; +}()); +exports.ColorObj = ColorObj; + + +/***/ }, + +/***/ "./src/v4/util/CommonUtil.ts" +/*!***********************************!*\ + !*** ./src/v4/util/CommonUtil.ts ***! + \***********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.CommonUtil = void 0; +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var CacheUtil_1 = __webpack_require__(/*! ./CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var AriaUtil_1 = __webpack_require__(/*! ./AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ./AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ./VisUtil */ "./src/v4/util/VisUtil.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var CommonUtil = /** @class */ (function () { + function CommonUtil() { + } + CommonUtil.wordCount = function (str) { + str = str.trim(); + if (str.length === 0) + return 0; + return str.split(/\s+/g).length; + }; + /** + * Note that this only detects if the element itself is in the tab order. + * However, this element may delegate focus to another element via aria-activedescendant. + * Also, focus varies by browser... sticking to things that are focusable on Chrome and Firefox. + */ + CommonUtil.isTabbable = function (element) { + // Using https://allyjs.io/data-tables/focusable.html + // Handle the explicit cases first + if (!VisUtil_1.VisUtil.isNodeVisible(element)) + return false; + if (element.hasAttribute("inert") || DOMUtil_1.DOMUtil.getAncestorWithAttribute(element, "inert", "")) + return false; + if (element.hasAttribute("tabindex")) { + return parseInt(element.getAttribute("tabindex")) >= 0; + } + // Explicit cases handled - now the implicit + var nodeName = element.nodeName.toLowerCase(); + if (nodeName in CommonUtil.tabTagMap) { + var retVal = CommonUtil.tabTagMap[nodeName]; + if (typeof (retVal) === "function") { + retVal = retVal(element); + } + return retVal; + } + else { + if (element.hasAttribute("contenteditable")) + return true; + return false; + } + }; + /** + * Test if the ele node is focusable + */ + CommonUtil.isFocusable = function (ele) { + if (ele === "undefined" || ele === null) { + return false; + } + return CommonUtil.isTabbable(ele); + }; + /** + * Note that this only detects if the element itself is interactive, but not onclick event. + */ + CommonUtil.isClickable = function (element) { + if (!VisUtil_1.VisUtil.isNodeVisible(element)) + return false; + // native focusable element + var nodeName = element.nodeName.toLowerCase(); + if (nodeName in CommonUtil.tabTagMap) { + var retVal = CommonUtil.tabTagMap[nodeName]; + if (typeof (retVal) === "function") { + retVal = retVal(element); + } + return retVal; + } + else { + //custom widget + if (AriaUtil_1.AriaUtil.isWidget(element) && element.hasAttribute("tabindex")) { + return true; + } + } + return false; + }; + /* + * get conflict Aria and Html attributes + * return: a list of Aria and Html attribute pairs that are conflict + */ + CommonUtil.isTableDescendant = function (contextHierarchies) { + if (!contextHierarchies) + return null; + return contextHierarchies["aria"].filter(function (hier) { return ["table", "grid", "treegrid"].includes(hier.role); }); + }; + CommonUtil.tabIndexLEZero = function (elem) { + if (CommonUtil.hasAttribute(elem, "tabindex")) { + if (elem.getAttribute("tabindex").match(/^-?\d+$/)) { + var tabindexValue = parseInt(elem.getAttribute("tabindex")); + return tabindexValue === 0 || tabindexValue === -1; + } + } + return false; + }; + /** + * get number of tabbable children + * @param element + */ + CommonUtil.getTabbableChildren = function (element) { + var count = 0; + // If node has children, look for tab stops in the children + if (element.firstChild || element.nodeName.toUpperCase() === "IFRAME") { + var nw = new DOMWalker_1.DOMWalker(element); + while (nw.nextNode() && nw.node != element) { + if (nw.node.nodeType == 1 && !nw.bEndTag && CommonUtil.isTabbable(nw.node)) { + ++count; + } + } + } + return count; + }; + CommonUtil.normalizeSpacing = function (s) { + if (!s) + return ''; + return s.trim().replace(/\s+/g, ' '); + }; + ; + //TODO: function does not handle equivalents for roles: row, link, header, button + // But it may not have to. Bug reports have been about radio buttons and checkboxes. + CommonUtil.isHtmlEquiv = function (node, htmlEquiv) { + var retVal = false; + if (node) { + var nodeName = node.nodeName.toLowerCase(); + if (nodeName === "input") { + var type = node.getAttribute("type").toLowerCase(); + if (type) { + if (htmlEquiv.indexOf("checkbox") != -1) { + retVal = type === "checkbox"; + } + else if (htmlEquiv.indexOf("radio") != -1) { + retVal = type === "radio"; + } + } + } + } + return retVal; + }; + CommonUtil.nonExistantIDs = function (node, targetids) { + var returnnotfoundids = ''; + if (CommonUtil.normalizeSpacing(targetids).length < 1) + return returnnotfoundids; + var targetArray = targetids.split(" "); + var doc = node.ownerDocument; + for (var i = 0; i < targetArray.length; i++) { + var xp = "//*[@id='" + targetArray[i] + "']"; + var xpathResult = doc.evaluate(xp, node, doc.defaultNSResolver, 0 /* XPathResult.ANY_TYPE */, null); + var r = xpathResult.iterateNext(); + if (!r) + returnnotfoundids += targetArray[i] + ', '; + } + if (CommonUtil.normalizeSpacing(returnnotfoundids).length >= 2) + returnnotfoundids = returnnotfoundids.substring(0, returnnotfoundids.length - 2); + else + returnnotfoundids = ''; + return returnnotfoundids; + }; + CommonUtil.getDocElementsByTag = function (elem, tagName) { + var doc = fragment_1.FragmentUtil.getOwnerFragment(elem); + tagName = tagName.toLowerCase(); + var cache = CacheUtil_1.CacheUtil.getCache(doc, "RPT_DOCELEMSBYTAG", {}); + if (!(tagName in cache)) { + cache[tagName] = doc.querySelectorAll(tagName); + CacheUtil_1.CacheUtil.setCache(doc, "RPT_DOCELEMSBYTAG", cache); + } + return cache[tagName]; + }; + /** + * This function is responsible for get a list of all the child elemnts which match the tag + * name provided. + * + * Note: This is a wrapper function to: AriaUtil.getChildByTagHidden + * + * @parm {element} parentElem - The parent element + * @parm {string} tagName - The tag to search for under the parent element + * @parm {boolean} ignoreHidden - true if hidden elements with the tag should ignored from the list + * false if the hidden elements should be added + * + * @return {List} retVal - list of all the elements which matched the tag under the parent that were provided. + * + * @memberOf AriaUtil + */ + CommonUtil.getChildByTag = function (parentElem, tagName) { + return CommonUtil.getChildByTagHidden(parentElem, tagName, false, false); + }; + /** + * This function is responsible for get a list of all the child elemnts which match the tag + * name provided. + * + * @parm {element} parentElem - The parent element + * @parm {string} tagName - The tag to search for under the parent element + * @parm {boolean} ignoreHidden - true if hidden elements with the tag should ignored from the list + * false if the hidden elements should be added + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * + * @return {List} retVal - list of all the elements which matched the tag under the parent that were provided. + * + * @memberOf AriaUtil + */ + CommonUtil.getChildByTagHidden = function (parentElem, tagName, ignoreHidden, considerHiddenSetting) { + // Variable Decleration + var retVal = []; + var child = parentElem.firstChild; + // Loop over all the child elements of the parent to build a list of all the elements that + // match the tagName provided + while (child != null) { + // Only include the children into the return array if they match with tagname. + if (child.nodeName.toLowerCase() === tagName) { + // In the case that ignorehidden was set to true, then perform a isNodeVisible check + // and in the case the node is not visilble we more to theses then move to the next node. + // Perform a couple of checks to determine if hidden elements should be ignored or not. + // 1. When ignoreHidden is set to true upfront, then perform a isNodeVisible + // 2. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2.1. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + if ((ignoreHidden || (considerHiddenSetting && !CommonUtil.shouldCheckHiddenContent(child))) && !VisUtil_1.VisUtil.isNodeVisible(child)) { + // Move on to the next element + child = child.nextSibling; + continue; + } + // Push the element + retVal.push(child); + } + // Move to the next sibling element + child = child.nextSibling; + } + return retVal; + }; + /** + * This function is responsible for finding a list of elements that match given roles(s). + * This function by defauly will not consider Check Hidden Setting at all. + * This function by defauly will not consider implicit roles. + * Note: This is a wrapper function to: AriaUtil.getElementsByRoleHidden + * + * @parm {document} doc - The document node + * @parm {list or string} roles - List or single role for which to return elements based on. + * + * @return {List} retVal - list of all the elements which matched the role(s) that were provided. + * + * @memberOf AriaUtil + */ + CommonUtil.getElementsByRole = function (doc, roles) { + return CommonUtil.getElementsByRoleHidden(doc, roles, false, false); + }; + /** + * This function is responsible for finding a list of elements that match given roles(s). + * This function aslo finds elements with implicit roles. + * This function will also consider elements that are hidden based on the if the Check + * Hidden Content settings should be considered or not. + * + * @parm {document} doc - The document node + * @parm {list or string} roles - List or single role for which to return elements based on. + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {List} retVal - list of all the elements which matched the role(s) that were provided. + * + * @memberOf AriaUtil + */ + CommonUtil.getElementsByRoleHidden = function (doc, roles, considerHiddenSetting, considerImplicitRoles) { + // In the case that the role to element assoication is already made, and available in the global hasAttribute + // we can just use that one instead of building a new one. + var roleToElems = null; + if (considerImplicitRoles) { + roleToElems = CacheUtil_1.CacheUtil.getCache(doc, "AriaUtil_GETELEMENTSBY_ROLE_IMPLICIT", null); + } + else { + roleToElems = CacheUtil_1.CacheUtil.getCache(doc, "AriaUtil_GETELEMENTSBY_ROLE", null); + } + // Build the new role to element, this is where we loop through all the elements and extract all the + // elements bsaed on roles. + if (roleToElems === null) { + // Re-initialize the roleToElems hash + roleToElems = {}; + // Get the body of the doc + var root = doc.body; + // Keep looping until we are at the very parent node of the entire page, so that we can loop through + // all the nodes. + while (DOMWalker_1.DOMWalker.parentNode(root) !== null) { + // Get the parentNode + root = DOMWalker_1.DOMWalker.parentNode(root); + } + // Build a nodewalter based of the root node, this node walter will be use loop over all the nodes + // and build the roles to Element coralation + var nw = new DOMWalker_1.DOMWalker(root); + // Loop over the entire doc/list of nodes to build the role to element map + // Note: This will build an roleToElems hash which is in the following format. + // roleToElems = { + // document: [{div},{abbr},{var}], + // main: [{div}], + // navigation: [{div}] + // } + while (nw.nextNode()) { + if (!nw.elem()) + continue; + // Only check the elements which have the role attribute assiciated to them + if (!nw.bEndTag) { + var wRoles = []; + //check if the node has role attributes + if (nw.elem() && nw.elem().hasAttribute("role")) { + // Extract all the roles that are assigned to this element, can have multiple roles on one + // element split by space, so we need to extract all of them into an array. + wRoles = nw.elem().getAttribute("role").split(" "); + } + if (nw.elem() && wRoles.length === 0 && considerImplicitRoles) { + //check if there are any implicit roles for this element. + var implicitRole = AriaUtil_1.AriaUtil.getImplicitRole(nw.node); + if (implicitRole !== null && implicitRole.length > 0) + wRoles = implicitRole; + } + if (wRoles.length === 0) { + continue; + } + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (considerHiddenSetting && CommonUtil.shouldNodeBeSkippedHidden(nw.node)) { + continue; + } + // Loop through all the roles and assigned this node to all thes roles + for (var i = 0; i < wRoles.length; ++i) { + // In the case that the role key is not already in the roleToElems hash, construct the + // add the key and assign empty array. + if (!(wRoles[i] in roleToElems)) { + roleToElems[wRoles[i]] = []; + } + // Add the node to the array for the role + roleToElems[wRoles[i]].push(nw.node); + } + } + } + // Set the roleToElems hash map as a global variable + if (considerImplicitRoles) { + CacheUtil_1.CacheUtil.setCache(doc, "AriaUtil_GETELEMENTSBY_ROLE_IMPLICIT", roleToElems); + } + else { + CacheUtil_1.CacheUtil.setCache(doc, "AriaUtil_GETELEMENTSBY_ROLE", roleToElems); + } + } + // Initilize the return value + var retVal = []; + // Handle the cases where the provided role is a string and not an array, + // for this case we take the string and put it into an array + if (typeof (roles) === "string") { + var role = roles; + roles = []; + roles.push(role); + } + // Loop through the roles that were provided and find the list of elements for this roles + // and add them to the return value. + if (roles.length) { + // loop over all the roles + for (var i = 0; i < roles.length; ++i) { + // Extract the role from the array + var nextRole = roles[i]; + // Fetch the list of all the elements for this role + var copyRoles = roleToElems[nextRole]; + // If there are elements to copy to another array, then perform the copy + if (copyRoles) { + // Loop over all the elements which are to be copied + for (var j = 0; j < copyRoles.length; ++j) { + // Add this element to the return val + retVal.push(copyRoles[j]); + } + } + } + } + return retVal; + }; + /** + * a target is en element that accept a pointer action (click or touch) + * + */ + CommonUtil.isTarget = function (element) { + if (!element || element.nodeType !== 1 + || ["html", "body"].includes(element.nodeName.toLowerCase()) + || CommonUtil.getAncestor(element, ["svg", "pre", "code", "script", "meta", 'head']) !== null + || !VisUtil_1.VisUtil.isNodeVisible(element) || VisUtil_1.VisUtil.isNodeVisuallyHidden(element) + || CommonUtil.isNodeDisabled(element) || VisUtil_1.VisUtil.isElementOffscreen(element)) + return false; + if (CommonUtil.isClickable(element)) + return true; + var role = AriaUtil_1.AriaUtil.getResolvedRole(element); + if (!role) + return false; + var target_roles = ["listitem", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "switch", "treeitem"]; + if (target_roles.includes(role)) { + // find the proper parent elements + var parent_1 = element.parentElement; + if (parent_1) { + var parent_role = AriaUtil_1.AriaUtil.getResolvedRole(parent_1); + // datalist, fieldset, optgroup, etc. may be just used for grouping purpose, so go up to the parent + if (parent_role === 'group') + parent_1 = parent_1.parentElement; + } + if (parent_1 && CommonUtil.isTarget(parent_1)) + return true; + } + return false; + }; + CommonUtil.getFileExt = function (url) { + var m = url.match(/\.(([^;?#\.]|^$)+)([;?#]|$)/); + if (m != null && m.length >= 2) { + return "." + m[1]; + } + return ""; + }; + CommonUtil.getFileAnchor = function (url) { + var m = url.match(/#(([^;?\.]|^$)+)([;?]|$)/); + if (m != null && m.length >= 2) { + return m[1]; + } + return ""; + }; + CommonUtil.checkObjEmbed = function (node, extTest, mimeTest) { + var nodeName = node.nodeName.toLowerCase(); + if (nodeName != "object" && nodeName != "embed" && + nodeName != "a" && nodeName != "area") + return false; + var retVal = false; + // Check mime type + if (!retVal && node.hasAttribute("type")) { + var mime = node.getAttribute("type").toLowerCase(); + retVal = mimeTest(mime); + } + if (!retVal && node.hasAttribute("codetype")) { + var mime = node.getAttribute("codetype"); + retVal = mimeTest(mime); + } + // Check the filename + if (!retVal) { + var filename = ""; + if (nodeName === "embed") { + filename = node.getAttribute("src"); + } + else if (nodeName === "a" || nodeName === "area") { + filename = node.getAttribute("href"); + } + else if (node.hasAttribute("data")) { + filename = node.getAttribute("data"); + } + if (filename === null) + filename = ""; + var ext = CommonUtil.getFileExt(filename); + retVal = extTest(ext); + } + // Check for filenames in the params + if (!retVal && nodeName === "object") { + // In the case that Check Hidden Option is set then comply with that setting + var params = CommonUtil.getChildByTagHidden(node, "param", false, true); + for (var i = 0; !retVal && params != null && i < params.length; ++i) { + retVal = params[i].hasAttribute("value") && + extTest(CommonUtil.getFileExt(params[i].getAttribute("value"))); + } + } + return retVal; + }; + CommonUtil.isAudioObjEmbedLink = function (node) { + return CommonUtil.checkObjEmbed(node, CommonUtil.isAudioExt, function (mime) { + return mime.startsWith("audio"); + }); + }; + CommonUtil.isAudioExt = function (ext) { + var audio_extensions = [".aif", ".aifc", ".aiff", ".air", ".asf", ".au", ".cda", + ".dsm", ".dss", ".dwd", ".iff", ".kar", ".m1a", ".med", + ".mp2", ".mp3", ".mpa", ".pcm", ".ra", ".ram", ".rm", + ".sam", ".sf", ".sf2", ".smp", ".snd", ".svx", ".ul", + ".voc", ".wav", ".wma", ".wve" + ]; + return CommonUtil.valInArray(ext.toLowerCase(), audio_extensions); + }; + CommonUtil.isVideoObjEmbedLink = function (node) { + return CommonUtil.checkObjEmbed(node, CommonUtil.isVideoExt, function (mime) { + return mime.startsWith("video") || + mime.startsWith("application/x-shockwave-flash"); + }); + }; + CommonUtil.isVideoExt = function (ext) { + var video_extensions = [".asf", ".avi", ".divx", ".dv", ".m1v", ".m2p", ".m2v", ".moov", + ".mov", ".mp4", ".mpeg", ".mpg", ".mpv", ".ogm", ".omf", ".qt", + ".rm", ".rv", ".smi", ".smil", ".swf", ".vob", ".wmv", ".rmvb", + ".mvb" + ]; + return CommonUtil.valInArray(ext.toLowerCase(), video_extensions); + }; + CommonUtil.isImageObjEmbedLink = function (node) { + return CommonUtil.checkObjEmbed(node, CommonUtil.isImgExt, function (mime) { + return mime.startsWith("image"); + }); + }; + CommonUtil.isImgExt = function (ext) { + return CommonUtil.valInArray(ext.toLowerCase(), CommonUtil.image_extensions); + }; + CommonUtil.isHtmlExt = function (ext) { + var html_extensions = [".asp", ".aspx", ".cfm", ".cfml", ".cgi", ".htm", ".html", ".shtm", + ".shtml", ".php", ".pl", ".py", ".shtm", ".shtml", ".xhtml" + ]; + return CommonUtil.valInArray(ext.toLowerCase(), html_extensions); + }; + CommonUtil.hasTriggered = function (doc, id) { + return CacheUtil_1.CacheUtil.getCache(doc, id, false); + }; + CommonUtil.triggerOnce = function (doc, id, passed) { + if (passed) + return true; + var triggered = CacheUtil_1.CacheUtil.getCache(doc, id, false); + CacheUtil_1.CacheUtil.setCache(doc, id, true); + return triggered; + }; + /* determine if the given value exists in the given array */ + CommonUtil.valInArray = function (value, arr) { + for (var idx in arr) { + if (arr[idx] === value) + return true; + } + return false; + }; + /** + * return the ancestor of the given element + * @param tagNames string, array, or dictionary containing the tags to search for + */ + CommonUtil.getAncestor = function (element, tagNames) { + var walkNode = element; + while (walkNode !== null) { + var thisTag = walkNode.nodeName.toLowerCase(); + if (typeof (tagNames) === "string") { + if (thisTag === tagNames.toLowerCase()) { + break; + } + } + else if (tagNames.length) { + for (var idx in tagNames) { + if (tagNames[idx] === thisTag) + return walkNode; + } + } + else if (thisTag in tagNames) { + break; + } + walkNode = DOMWalker_1.DOMWalker.parentNode(walkNode); + } + return walkNode; + }; + // return true if element1 and element2 are siblings + CommonUtil.isSibling = function (element1, element2) { + if (element1 && element2) { + var node = null; + if (DOMWalker_1.DOMWalker.parentNode(element1) && DOMWalker_1.DOMWalker.parentNode(element1).firstChild) { + node = DOMWalker_1.DOMWalker.parentNode(element1).firstChild; + } + while (node) { + if (node === element2) + return true; + node = node.nextSibling; + } + } + return false; + }; + CommonUtil.isDescendant = function (parent, child) { + var node = DOMWalker_1.DOMWalker.parentNode(child); + while (node != null) { + if (node === parent) { + return true; + } + node = DOMWalker_1.DOMWalker.parentNode(node); + } + return false; + }; + //check if the first form control child is disabled + CommonUtil.isDisabledByFirstChildFormElement = function (element) { + var formElements = ["input", "textarea", "select", "keygen", "progress", "meter", "output"]; + if (element.firstChild != null) { + var nw = new DOMWalker_1.DOMWalker(element); + while (nw.nextNode()) { + if (formElements.includes(nw.node.nodeName.toLowerCase())) { + if (CommonUtil.isNodeDisabled(nw.node)) + return true; + return false; + } + } + } + return false; + }; + CommonUtil.isDisabledByReferringElement = function (element) { + var id = element.getAttribute("id"); + var doc = element.ownerDocument; + var root = doc.body; + while (DOMWalker_1.DOMWalker.parentNode(root) !== null) { + // Get the parentNode + root = DOMWalker_1.DOMWalker.parentNode(root); + } + var nw = new DOMWalker_1.DOMWalker(root); + while (nw.nextNode()) { + // check the element whose 'aria-describedby' equals to the id + if (nw.node && nw.node.nodeType === 1 && nw.elem()) { + var AriaDescribedbyIDArray = (nw.elem().getAttribute("aria-describedby") || "").split(" "); + if (AriaDescribedbyIDArray.includes(id) && CommonUtil.isNodeDisabled(nw.node)) { + return true; + } + } + } + }; + /** get element containing label for the given element + * @deprecated Deprecated because the function name is misleading. Use getLabelForElement(element) instead + */ + CommonUtil.getInputLabel = function (element) { + return CommonUtil.getLabelForElement(element); + }; + /** + * This function is responsible for getting the element containing the label for the given element. + * + * Note: This is a wrapper function to: AriaUtil.getLabelForElementHidden + * + * @parm {element} element - The element for which to get the label element for. + * + * @return {element} element - return the element for the label, otherwise null + * + * @memberOf AriaUtil + */ + CommonUtil.getLabelForElement = function (element) { + return CommonUtil.getLabelForElementHidden(element, false); + }; + /** + * This function is responsible for getting the element containing the label for the given element. + * + * This function will return null if the containing lable element is hidden, when the ignoreHidden option + * is set to true. + * + * @parm {element} element - The element for which to get the label element for. + * @parm {boolean} ignoreHidden - true if hidden elements with label should be ignored from the list + * false if the hidden elements should be added + * + * @return {element} element - return the element for the label, otherwise null + * + * @memberOf AriaUtil + */ + CommonUtil.getLabelForElementHidden = function (element, ignoreHidden) { + // Check if the global AriaUtil_LABELS hash is available, as this will contain the label nodes based on + // for attribute. + //if (!getCache(element.ownerDocument,"AriaUtil_LABELS", null)) { + var root = element.getRootNode(); + if (!CacheUtil_1.CacheUtil.getCache((root.nodeType === 11) ? root : root, "AriaUtil_LABELS", null)) { + // Variable Decleration + var idToLabel = {}; + // Get all the label elements in the entire doc + var labelNodes = CommonUtil.getDocElementsByTag(element, "label"); + // Loop over all the label nodes, in the case the label node has a for attribute, + // extract that attribute and add this node to the hash if it is visible. + for (var i = 0; i < labelNodes.length; ++i) { + if (labelNodes[i].hasAttribute("for")) { + // If ignore hidden is specified and the node is not visible we do not add it to the + // labelNodes hash. + if (ignoreHidden && !VisUtil_1.VisUtil.isNodeVisible(labelNodes[i])) { + continue; + } + idToLabel[labelNodes[i].getAttribute("for")] = labelNodes[i]; + } + } + // Add the built hash to the ownerDocument (document), to be used later to fast retrival + //setCache(element.ownerDocument, "AriaUtil_LABELS", idToLabel); + CacheUtil_1.CacheUtil.setCache((root.nodeType === 11) ? root : root, "AriaUtil_LABELS", idToLabel); + } + // If this element has an id attribute, get the corosponding label element + if (element.hasAttribute("id")) { + // Fetch the id attribute + var ctrlId = element.getAttribute("id"); + // Return the corosponding label element. + // Note: in the case that the the id is not found in the hash that means, it does not exists or is hidden + if (ctrlId.trim().length > 0) { + //return getCache(element.getRootNode().ownerDocument,"AriaUtil_LABELS",{})[ctrlId]; + return CacheUtil_1.CacheUtil.getCache((root.nodeType === 11) ? root : root, "AriaUtil_LABELS", {})[ctrlId]; + } + } + return null; + }; + /* Return specified element attribute if present else return null */ + CommonUtil.getElementAttribute = function (element, attr) { + //return (element && element.hasAttribute && element.hasAttribute(attr)) ? element.getAttribute(attr) : null; + if (!attr || !element || !element.hasAttribute || !element.hasAttribute(attr)) + return null; + var atrValue = element.getAttribute(attr); + if (!ARIADefinitions_1.ARIADefinitions.referenceProperties.includes(attr)) + return atrValue; + //attr is a reference to other elements(s) + var values = atrValue.split(/ +/g); + //ignore if none of the referred element(s) exist or all point to the element itself + var exist = false; + for (var id = 0; values < values.length; ++id) { + var referred = document.getElementById(values[id]); + if (referred && !DOMUtil_1.DOMUtil.sameNode(referred, element)) { + exist = true; + break; + } + } + return exist ? atrValue : null; + }; + // Return true if element has valid implicit label + CommonUtil.hasImplicitLabel = function (element) { + var parentNode = CommonUtil.getAncestor(element, "label"); + // Test a) if the parent is a label which is the implicit label + // b) if the form element is the first child of the label + // c) if the form element requires an implicit or explicit label : "input", "textarea", "select", "keygen", "progress", "meter", "output" + // d) form elements which may have a label: button + // form elements that do not require implicit or explicit label element are: + // "optgroup", "option", "datalist"(added later). These were handled differently in the main rule, might need to refactor the code later + if (parentNode && parentNode.tagName.toLowerCase() === "label" && CommonUtil.isFirstFormElement(parentNode, element)) { + var parentClone = parentNode.cloneNode(true); + // exclude all form elements from the label since they might also have inner content + parentClone = CommonUtil.removeAllFormElementsFromLabel(parentClone); + return CommonUtil.hasInnerContentHidden(parentClone); + } + else { + return false; + } + }; + // Return the implicit label of the given form field + CommonUtil.getImplicitLabel = function (element) { + var parentNode = CommonUtil.getAncestor(element, "label"); + // Test a) if the parent is a label which is the implicit label + // b) if the form element is the first child of the label + // c) if the form element requires an implicit or explicit label : "input", "textarea", "select", "keygen", "progress", "meter", "output" + // d) form elements which may have a label: button + // form elements that do not require implicit or explicit label element are: + // "optgroup", "option", "datalist"(added later). These were handled differently in the main rule, might need to refactor the code later + if (parentNode && parentNode.tagName.toLowerCase() === "label" && CommonUtil.isFirstFormElement(parentNode, element)) { + var parentClone = parentNode.cloneNode(true); + // exclude all form elements from the label since they might also have inner content + parentClone = CommonUtil.removeAllFormElementsFromLabel(parentClone); + var label = CommonUtil.getInnerText(parentClone); + return label && label.trim() !== '' ? label.trim() : null; + } + else + return null; + }; + /** + * This function is responsible for getting the label for a form field element. + * + * + * @parm {element} element - The element from which to get the label. + * + * @return {string} text - return the label text or null + * + * @memberOf AriaUtil + */ + CommonUtil.getFormFieldLabel = function (elem) { + // get the label from the attribute "for" of the label element + // Get only the non-hidden labels for element + var value = ""; + var label = null; + var labelElem = CommonUtil.getLabelForElementHidden(elem, true); + if (labelElem) { + // value directly from element text + label = labelElem.innerText; // ignore hidden text + } + else { + /** if it's not label with for attribute, then find implicit label + * cases for explict label: + * <label for='my'></label><input id='my'/> + * <label for='my'><input id='my'/></label> + * cases for implicit label: + * <label><input /></label> + */ + labelElem = CommonUtil.getAncestor(elem, "label"); + if (labelElem && labelElem.tagName.toLowerCase() === "label" && CommonUtil.isFirstFormElement(labelElem, elem)) { + var parentClone = labelElem.cloneNode(true); + // exclude all the text from the first form element since they might also + // have inner content that is part of innerText + parentClone = CommonUtil.removeAllFormElementsFromLabel(parentClone); + label = CommonUtil.getInnerText(parentClone); + } + else + return null; + } + if (label && label.trim() !== "") + value += label.trim(); + // value from child element attribute + label = CommonUtil.getLabelTextFromAttribute(labelElem, true); + if (label && label.trim() !== "") + value += label.trim(); + // wired case: get aria label from label element itself just in case (though name prohibited from aria in html) + label = AriaUtil_1.AriaUtil.getAriaLabel(labelElem); + if (label && label.trim() !== "") + value += label.trim(); + return value.trim(); + }; + /** + * calculate label from embedded control: https://w3c.github.io/accname/ + * @param {element} labelElem label element + * @param {boolean} ignoreHidden - true if hidden elements with label should be ignored from the list + * false if the hidden elements should be added + * @returns label text or '' + * + * note the assumption is the labelElem refers either to a labelled element by 'for' attribute + * or its first form field is labbelled element + */ + CommonUtil.getLabelTextFromAttribute = function (labelElem, ignoreHidden) { + // label either points to a labelable element by its for attribute or the first element child + // get the labelled elment if it's an implicit label + var labeledElem = null; + for (var i = 0; i < labelElem.children.length; i++) { + var child = labelElem.children.item(i); + if (CommonUtil.form_labelable_elements.includes(child.nodeName.toLowerCase())) { + labeledElem = child; + break; + } + } + var nw = new DOMWalker_1.DOMWalker(labelElem); + var text = ''; + while (nw.nextNode() && nw.node !== labelElem) { + // only check element children + if (nw.node && nw.node.nodeType === 1 && nw.elem()) { + var elem = nw.elem(); + // ignore if it's hidden, or labelled element, or first form element if not labeled by for attribute + if ((ignoreHidden && (VisUtil_1.VisUtil.isNodeHiddenFromAT(elem) || VisUtil_1.VisUtil.isNodePresentational(elem))) + || (labeledElem && labeledElem.contains(elem))) + continue; + var role = AriaUtil_1.AriaUtil.getResolvedRole(elem); + // textbox etc. return its text value + if (role === "textbox") { + var name_1 = elem.getAttribute("value"); + if (name_1 && name_1.trim().length > 0) + text += ' ' + name_1.trim(); + } + else if (role === "combobox" || role === "listbox") { + // for combobox or listbox roles, return the text alternative of the chosen option. + var selectedId = elem.getAttribute("aria-activedescendant") || elem.getAttribute("aria-selected") || elem.getAttribute("aria-checked"); + if (selectedId) { + var selectedOption = elem.ownerDocument.getElementById(selectedId); + if (selectedOption && !DOMUtil_1.DOMUtil.sameNode(elem, selectedOption)) { + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(selectedOption); + if (pair && pair.name) + text += ' ' + pair.name.trim(); + } + } + } + else if (["progressbar", "scrollbar", "slider", "spinbutton", "meter"].includes(role)) { + // for range role type, including "progressbar", "scrollbar", "slider", "spinbutton" roles + // If the aria-valuetext property is present, return its value + var value_1 = elem.getAttribute("aria-valuetext"); + if (value_1 && value_1.trim().length > 0) + text += ' ' + value_1.trim(); + // Otherwise, if the aria-valuenow property is present, return its value, + value_1 = elem.getAttribute("aria-valuenow"); + if (value_1 && value_1.trim().length > 0) + text += ' ' + value_1.trim(); + // finally use native value attribute + value_1 = elem.getAttribute("value"); + if (value_1 && value_1.trim().length > 0) + text += ' ' + value_1.trim(); + } + // get aria label from the element + var value = AriaUtil_1.AriaUtil.getAriaLabel(elem); + if (value && value.trim() !== "") + text += ' ' + value.trim(); + } + } + return text.trim(); + }; + CommonUtil.isFirstFormElement = function (parentNode, element) { + //let formElementsRequiringLabel = ["input", "textarea", "select", "keygen", "progress", "meter", "output"]; + if (parentNode.firstChild != null) { + var nw = new DOMWalker_1.DOMWalker(parentNode); + while (nw.nextNode()) { + if (CommonUtil.form_labelable_elements.indexOf(nw.node.nodeName.toLowerCase()) !== -1) { + return nw.node === element; + } + } + } + return false; + }; + // check if the element is a shadow host or descendant of a shadow host, but not a descedant of the shadow root of the host (to be assigned to shadow slot or ignored) + CommonUtil.isShadowHostElement = function (element) { + if (CommonUtil.isShadowElement(element)) + return false; + var walkNode = element; + while (walkNode) { + if (walkNode.shadowRoot) + return true; + walkNode = DOMWalker_1.DOMWalker.parentElement(walkNode); + } + return false; + }; + //check if an element is in a shadow tree + CommonUtil.isShadowElement = function (element) { + var root = element.getRootNode(); + if (root.toString() === "[object ShadowRoot]") + return true; + return false; + }; + CommonUtil.removeAllFormElementsFromLabel = function (element) { + var formElements = ["input", "textarea", "select", "button", "datalist", "optgroup", "option", "keygen", "output", "progress", "meter"]; + var childNodes = element.childNodes; + for (var i = 0; i < childNodes.length; i++) { + if (formElements.indexOf(childNodes[i].nodeName.toLowerCase()) > -1) { + element.removeChild(childNodes[i]); + } + } + return element; + }; + /** + * @param element + * @param idStr + * @returns true if any one (if multiple Ids) id points to itself + */ + CommonUtil.isIdReferToSelf = function (element, idStr) { + if (!idStr || idStr.trim() === '') + return false; + var ids = idStr.trim().split(" "); + for (var j = 0, length_1 = ids.length; j < length_1; ++j) { + var referredNode = fragment_1.FragmentUtil.getById(element, ids[j]); + if (referredNode && DOMUtil_1.DOMUtil.sameNode(referredNode, element)) + return true; + } + return false; + }; + /* Determine the node depth of the given element */ + CommonUtil.nodeDepth = function (element) { + var depth = 0; + var walkNode = element; + while (walkNode !== null) { + walkNode = DOMWalker_1.DOMWalker.parentNode(walkNode); + depth = depth + 1; + } + return depth; + }; + /* compare node order of the 2 given nodes */ + /* returns + * 0 if the nodes are equal + * 1 if node b is before node a + * -1 if node a is before node b + * 2 if node a is nested in node b + * -2 if node b is nested in node a + * null if either node is null or their parent nodes are not equal + */ + CommonUtil.compareNodeOrder = function (nodeA, nodeB) { + if (nodeA === nodeB) + return 0; + var aDepth = CommonUtil.nodeDepth(nodeA); + var bDepth = CommonUtil.nodeDepth(nodeB); + if (bDepth > aDepth) { + for (var i = 0; i < bDepth - aDepth; ++i) + nodeB = DOMWalker_1.DOMWalker.parentNode(nodeB); + if (nodeA === nodeB) // Node B nested in Node A + return -2; + } + else if (aDepth > bDepth) { + for (var i = 0; i < aDepth - bDepth; ++i) + nodeA = DOMWalker_1.DOMWalker.parentNode(nodeA); + if (nodeA === nodeB) // Node A nested in Node B + return 2; + } + while (nodeA != null && nodeB != null && DOMWalker_1.DOMWalker.parentNode(nodeA) != DOMWalker_1.DOMWalker.parentNode(nodeB)) { + nodeA = DOMWalker_1.DOMWalker.parentNode(nodeA); + nodeB = DOMWalker_1.DOMWalker.parentNode(nodeB); + } + if (nodeA === null || nodeB === null || DOMWalker_1.DOMWalker.parentNode(nodeA) != DOMWalker_1.DOMWalker.parentNode(nodeB)) + return null; + while (nodeB != null && nodeB != nodeA) + nodeB = nodeB.previousSibling; + if (nodeB === null) // nodeB before nodeA + return 1; + else + return -1; + }; + /** + * Determine if the given attribute of the given element is not empty + * @memberOf AriaUtil + */ + CommonUtil.attributeNonEmpty = function (element, attrStr) { + return element.hasAttribute(attrStr) && element.getAttribute(attrStr).trim().length > 0; + }; + /* Return a pointer to the given frame, null if not found */ + CommonUtil.getFrameByName = function (ruleContext, frameName) { + var window = ruleContext.ownerDocument.defaultView; + var frameList = [window]; + var idx = 0; + while (idx < frameList.length) { + try { + if (frameList[idx].name === frameName) + return frameList[idx]; + for (var i = 0; i < frameList[idx].frames.length; ++i) { + try { + // Ensure it's a real frame and avoid recursion + if (frameList[idx].frames[i] && !frameList.includes(frameList[idx].frames[i])) { + frameList.push(frameList[idx].frames[i]); + } + } + catch (e) { } + } + } + catch (e) { } + ++idx; + } + return null; + }; + CommonUtil.defaultNSResolver = function (prefix) { + var uri; + switch (prefix) { + case 'html': + uri = 'http://www.w3.org/1999/xhtml'; + case 'x2': + uri = 'http://www.w3.org/TR/xhtml2'; + case 'x': + uri = 'http://www.w3.org/1999/xhtml'; + case 'xhtml': + uri = 'http://www.w3.org/1999/xhtml'; + default: + uri = null; + } + return uri; + }; + //checking if only the inner text is empty or not + CommonUtil.isInnerTextOnlyEmpty = function (element) { + // Get the innerText of the element + var text = element.innerText; + if ((text === undefined || text === null || text.trim().length === 0) && element.nodeName.toLowerCase() !== 'slot' && element.textContent !== undefined) { + //ignore slot because its text will be filled by the corresponding content in the light DOM + // innerText is sometimes 'undefined' in headless mode, or null if the element is invisible or not erxpanded + // so we try textContent as a workaround + text = element.textContent; + } + var retVal = !(text !== null && text.trim().length > 0); + if (element.nodeType === 1 && element.nodeName.toLowerCase() === "slot") { + //TODO: need to conside its own content, a slot may have its own content or assigned content + for (var _i = 0, _a = element.assignedNodes(); _i < _a.length; _i++) { + var slotElem = _a[_i]; + retVal = retVal && CommonUtil.isInnerTextEmpty(slotElem); + } + } + // Trim the inner text and verify that it is not empty. + return retVal; + }; + /* Return the inner text of the given element */ + CommonUtil.getInnerText = function (element) { + var retVal = element.innerText; + if (retVal === undefined || retVal === null || retVal.trim() === "") + retVal = element.textContent; + return retVal; + }; + /** + * return onscreen innerText only. + * This function should return the same result as innerText if no offscreen content exists + * + * @parm {element} node The node which should be checked it has inner text or not. + * @return {null | string} null if element has empty inner text, text otherwise + * + * @memberOf AriaUtil + */ + CommonUtil.getOnScreenInnerText = function (element) { + if (!element) + return null; + if (element.nodeType === 3) + return element.nodeValue(); + var text = ""; + var nw = new DOMWalker_1.DOMWalker(element); + // Loop over all the childrens of the element to get the text + while (nw.nextNode() && nw.node !== element && nw.node !== element.parentNode) { + if (nw.bEndTag) + continue; + if (nw.node.nodeType === 1 && (VisUtil_1.VisUtil.hiddenByDefaultElements.includes(nw.node.nodeName.toLowerCase()) || !VisUtil_1.VisUtil.isNodeVisible(nw.node) || VisUtil_1.VisUtil.isElementOffscreen(nw.node))) { + /** special case for svg <title> element: + * text in a <title> element is not rendered as part of the graphic, but browsers usually display it as a tooltip + * note some svg elements, such as title, desc, have a bounds {"left":0,"top":0,"height":0,"width":0} + */ + if (nw.node.nodeName.toLowerCase() === 'title' && CommonUtil.getAncestor(nw.node, "svg")) + continue; + if (nw.node.nextSibling) { + if (nw.node.nextSibling.nodeType === 3 && nw.node.nextSibling.nodeValue && nw.node.nextSibling.nodeValue.trim() !== '') + text += ' ' + nw.node.nextSibling.nodeValue.trim(); + nw.node = nw.node.nextSibling; + continue; + } + else + break; + } + if (nw.node.nodeType === 3 && nw.node.nodeValue && nw.node.nodeValue.trim() !== '') { + text += ' ' + nw.node.nodeValue.trim(); + } + } + return text.trim(); + }; + /** Return the text content of the given node + * this is different than innerText or textContent that return text content of a node and its descendants + */ + CommonUtil.getNodeText = function (element) { + if (!element) + return ""; + var text = ""; + var childNodes = element.childNodes; + for (var i = 0; i < childNodes.length; ++i) { + if (childNodes[i].nodeType == 3) { + text += childNodes[i].nodeValue; + } + } + return text; + }; + /** + * This function is responsible for checking if elements inner text is empty or not. + * + * @parm {element} node The node which should be checked it has inner text or not. + * @return {bool} true if element has empty inner text, false otherwise + * + * @memberOf AriaUtil + */ + CommonUtil.isInnerTextEmpty = function (element) { + // Get the innerText of the element + var text = CommonUtil.getInnerText(element); + // Trim the inner text and verify that it is not empty. + return !(text != null && text.trim().length > 0); + }; + CommonUtil.hasInnerContent = function (element) { + var text = CommonUtil.getInnerText(element); + var hasContent = (text !== null && text.trim().length > 0); + if (element.firstChild !== null) { + var nw = new DOMWalker_1.DOMWalker(element); + while (!hasContent && nw.nextNode()) { + hasContent = (nw.node.nodeName.toLowerCase() === "img" && + CommonUtil.attributeNonEmpty(nw.node, "alt")); + } + } + return hasContent; + }; + /** + * This function is responsible for determine if an element has inner content. + * This function also considers cases where inner text is hidden, which now will + * be classified as does not have hidden content. + * + * @parm {element} node The node which should be checked it has inner text or not. + * @return {bool} true if element has empty inner text, false otherwise + * + * @memberOf AriaUtil + */ + CommonUtil.hasInnerContentHidden = function (element) { + return CommonUtil.hasInnerContentHiddenHyperLink(element, false); + }; + CommonUtil.svgHasName = function (element) { + return CommonUtil.attributeNonEmpty(element, "aria-label") + || CommonUtil.attributeNonEmpty(element, "aria-labelledby") + || !!element.querySelector(":scope > title"); + }; + CommonUtil.hasInnerContentHiddenHyperLink = function (element, hyperlink_flag) { + if (!element) + return false; + // Variable Decleration + var childElement = element.firstElementChild; + var hasContent = false; + // In the case that the childElement is not null then we need to check each of the elements + // to make sure that the elements are not all hidden. + if (childElement != null) { + // Get the nodewalter of the element node, so that we can loop over it and verify + // that the elements under the element are not completly hidden. + var nw = new DOMWalker_1.DOMWalker(element); + // Loop over all the nodes until there are no more nodes or we have determine that there is content under + // this parent element. + while (!hasContent && nw.nextNode() && nw.node != element) { + // Get the next node + var node = nw.node; + // In the case an img element is present with alt then we can mark this as pass + // otherwise keep checking all the other elements. Make sure that this image element is not hidden. + hasContent = (node.nodeName.toLowerCase() === "img" + && (CommonUtil.attributeNonEmpty(node, "alt") || CommonUtil.attributeNonEmpty(node, "title")) + && !VisUtil_1.VisUtil.isNodeHiddenFromAT(node) && !VisUtil_1.VisUtil.isNodePresentational(node)) || (node.nodeName.toLowerCase() === "svg" + && CommonUtil.svgHasName(node)); + // Now we check if this node is of type element, visible + if (!hasContent && node.nodeType === 1 && !VisUtil_1.VisUtil.isNodeHiddenFromAT(node) && !VisUtil_1.VisUtil.isNodePresentational(node)) { + // Check if the innerText of the element is empty or not + hasContent = !CommonUtil.isInnerTextOnlyEmpty(node); + if (!hasContent && hyperlink_flag === true) { + hasContent = CommonUtil.attributeNonEmpty(node, "aria-label") || CommonUtil.attributeNonEmpty(node, "aria-labelledby"); + var doc = node.ownerDocument; + if (doc) { + var win = doc.defaultView; + if (win) { + var cStyle = win.getComputedStyle(node); + if (!hasContent && cStyle != null) { + // console.log(cStyle.backgroundImage); + // console.log(cStyle.content) + hasContent = ((cStyle.backgroundImage && cStyle.backgroundImage.indexOf) || cStyle.content) && CommonUtil.attributeNonEmpty(node, "alt"); + } + } + } + } + } + // Check for cases where there is text node after an element under the parent + // In the case we detect nodetype as text node and the patent of the text node is + // the same element we are checking has Inner content for then get the inner content of this + // text node. + if (node.nodeType === 3 && DOMWalker_1.DOMWalker.parentElement(node) === element) { + // Check if the innerText of the element is empty or not + hasContent = !CommonUtil.isInnerTextEmpty(node); + } + } + } + // In the case there are no child elements then we can simply perform the check for only innertext + // the img with alt case will be covered in the above if, as img is considers as an element. + else { + // Check if the innerText of the element is empty or not + hasContent = !CommonUtil.isInnerTextEmpty(element); + } + return hasContent; + }; + CommonUtil.hasInnerContentOrAlt = function (element) { + var text = CommonUtil.getInnerText(element); + var hasContent = (text != null && text.trim().length > 0) || CommonUtil.attributeNonEmpty(element, "alt"); + if (element.firstChild != null) { + var nw = new DOMWalker_1.DOMWalker(element); + while (!hasContent && nw.nextNode() && nw.node != element) { + hasContent = (nw.node.nodeName.toLowerCase() === "img" && + CommonUtil.attributeNonEmpty(nw.node, "alt")); + if (!hasContent + && (AriaUtil_1.AriaUtil.hasRole(nw.node, "button", true) || AriaUtil_1.AriaUtil.hasRole(nw.node, "textbox")) + && (AriaUtil_1.AriaUtil.hasAriaLabel(nw.node) || CommonUtil.attributeNonEmpty(nw.node, "title") || CommonUtil.getLabelForElementHidden(nw.elem(), true))) { + hasContent = true; + } + } + } + return hasContent; + }; + CommonUtil.concatUniqueArrayItem = function (item, arr) { + arr.indexOf(item) === -1 && item !== null ? arr.push(item) : false; + return arr; + }; + CommonUtil.concatUniqueArrayItemList = function (itemList, arr) { + for (var i = 0; itemList !== null && i < itemList.length; i++) { + arr = CommonUtil.concatUniqueArrayItem(itemList[i], arr); + } + return arr; + }; + /** + * remove array items from a given array + * @param itemList items to be removed from arr + * @param arr the array + * @returns + */ + CommonUtil.reduceArrayItemList = function (itemList, arr) { + if (arr && arr.length > 0 && itemList && itemList.length > 0) { + var result = arr.filter(function (value) { + return !itemList.includes(value); + }); + return result; + } + return arr; + }; + CommonUtil.getScopeForTh = function (element) { + /** https://www.w3.org/TR/html5/tabular-data.html#header-and-data-cell-semantics + * A header cell anchored at the slot with coordinate (x, y) with width width and height height is + * said to be a column header if any of the following conditions are true: + * * The cell's scope attribute is in the column state, or + * * The cell's scope attribute is in the auto state, and there are no data cells in any of + * the cells covering slots with y-coordinates y .. y+height-1. + * A header cell anchored at the slot with coordinate (x, y) with width width and height height is + * said to be a row header if any of the following conditions are true: + * * The cell's scope attribute is in the row state, or + * * The cell's scope attribute is in the auto state, the cell is not a column header, and there are + * no data cells in any of the cells covering slots with x-coordinates x .. x+width-1. + */ + // Note: auto is default scope + // Easiest answer is if scope is specified + if (element.hasAttribute("scope")) { + var scope = element.getAttribute("scope").toLowerCase(); + if (scope === "row" || scope === 'rowgroup') + return "row"; + if (scope === "col" || scope === 'colgroup') + return "column"; + } + // scope is auto, default (without a scope) or invalid value. + // if all the sibling elements are th, then return "columnheader" + var siblings = __spreadArray([], element.parentElement.children, true).filter(function (node) { return node.nodeType === 1 && node.tagName.toLowerCase() != "th"; }); + if (siblings === null || siblings.length === 0) + return "column"; + else + return "row"; + }; + CommonUtil.getControlOfLabel = function (node) { + // Handle the easy case of label -> for + var labelAncestor = CommonUtil.getAncestor(node, "label"); + if (labelAncestor && labelAncestor.hasAttribute("for")) { + return fragment_1.FragmentUtil.getById(node, labelAncestor.getAttribute("for")); + } + // Create a dictionary containing ids of parent nodes + var idDict = {}; + var parentWalk = node; + while (parentWalk) { + if (parentWalk.nodeType === 1 /* Node.ELEMENT_NODE */) { + var ancestor = parentWalk; + if (ancestor.hasAttribute("id")) { + idDict[ancestor.getAttribute("id")] = true; + } + } + parentWalk = DOMWalker_1.DOMWalker.parentNode(parentWalk); + } + // Early return if no ancestor IDs found + if (Object.keys(idDict).length === 0) { + return null; + } + // Cache aria-labelledby attribute if node is an element + var nodeAriaLabelledBy = node.nodeType === 1 ? node.getAttribute("aria-labelledby") : null; + // Iterate through controls that use aria-labelledby and see if any of them reference one of my ancestor ids + var inputsUsingLabelledBy = CacheUtil_1.CacheUtil.getSetCache(node.ownerDocument, "CommonUtil::getControlOfLabel", function () { return node.ownerDocument.querySelectorAll("*[aria-labelledby]"); }); + for (var idx = 0; idx < inputsUsingLabelledBy.length; ++idx) { + var inputUsingLabelledBy = inputsUsingLabelledBy[idx]; + var ariaLabelledBy = inputUsingLabelledBy.getAttribute("aria-labelledby"); + var sp = ariaLabelledBy.split(" "); + for (var _i = 0, sp_1 = sp; _i < sp_1.length; _i++) { + var id = sp_1[_i]; + if (id in idDict && !CommonUtil.isIdReferToSelf(node, nodeAriaLabelledBy)) { + return inputUsingLabelledBy; + } + } + } + // Find the cases where we're within an aria labelledby + return null; + }; + /** + * This function is responsible for checking if the node that is provied is + * disabled or not. Following is how the check is performed: + * 1. Check if the current node is disabled with the following options: + * attribute --> disabled + * Also needs to be "button", "input", "select", "textarea", "optgroup", "option", + * "menuitem", "fieldset" nodes (in array elementsAllowedDisabled) + * attribute --> aria-disabled="true" + * 2. Check if any of the current nodes parents are disabled with the same + * options listed in 1. + * + * Note: If either current node or any of the parent nodes are disabled then this + * function will return true (node is disabled). + * + * @parm {HTMLElement} node - The node which should be checked if it is disabled or not. + * @return {bool} true if the node is disabled, false otherwise + * + * @memberOf AriaUtil + */ + CommonUtil.isNodeDisabled = function (node) { + // Set PT_NODE_DISABLED to false for all the nodes, before the check and this will be changed to + // true when we detect that the node is disabled. We have to set it to false so that we know + // the node has already been checked. Only set it to false if the setting is undefined or null + // as if it is defined we do not wnat to reset it. As if it is true then we should make use of it + // to speed up the check. + var PT_NODE_DISABLED = CacheUtil_1.CacheUtil.getCache(node, "PT_NODE_DISABLED", undefined); + if (typeof PT_NODE_DISABLED !== "undefined") + return PT_NODE_DISABLED; + PT_NODE_DISABLED = false; + // Check the nodeType of this node, if this node is a text node then + // we get the parentnode and set that as the node as a text nodes, + // disabled is directly related to the parent node. + if (node.nodeType === 3) { + node = DOMWalker_1.DOMWalker.parentNode(node); + } + // Variable Declaration + var nodeName = node.nodeName.toLowerCase(); + // Get the disabled element property, disabled and aria-disabled attribute and check that it is true + var disabledAttribute = node.hasAttribute("disabled"); + var disabledPropertyCustom = PT_NODE_DISABLED; + var ariaDisabledAttribute = node.hasAttribute('aria-disabled') && node.getAttribute("aria-disabled") === 'true'; + // If this node has disabled attribute and the node allows disabled attribute, then return true. + // Disabled attribute is only allowed on "button", "input", "select", "textarea", "optgroup", "option", "menuitem", "fieldset" + // In the case aria-disabled is set to true, then also return true + if (disabledPropertyCustom || (disabledAttribute && ARIADefinitions_1.ARIADefinitions.elementsAllowedDisabled.indexOf(nodeName) > -1) || ariaDisabledAttribute) { + PT_NODE_DISABLED = true; + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_DISABLED", PT_NODE_DISABLED); + return true; + } + // Get the parentNode for this node, becuase we have to check all parents to make sure they do not have + // disabled attribute. Only keep checking until we are all the way back to the parentNode + // element. + var parentElement = DOMWalker_1.DOMWalker.parentNode(node); + // If the parent node exists and the nodetype is element (1), then run recursive call to perform the check + // all the way up to the very parent node. Use recursive call here instead of a while loop so that we do not + // have to duplicate the logic for checking if the node is disabled or not for all the parents starting with + // child node. + if (parentElement != null && parentElement.nodeType === 1) { + // Check upwards recursively, and save the results in an variable + var nodeDisabled = CommonUtil.isNodeDisabled(parentElement); + // If the node is found to be disabled then add the custom PT_NODE_DISABLED to true. + // so that we can use this next time, to quickly determine if node is disabled or not. + // This is extra percaution, the isNodeDisabled function already sets this. + if (nodeDisabled) { + PT_NODE_DISABLED = true; + } + // Check upwards recursively + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_DISABLED", PT_NODE_DISABLED); + return nodeDisabled; + } + // Return false (node is not disabled) + return false; + }; + /** + * This function is responsible for determine if hidden content should be checked + * in rules. + * + * @parm {element} node - A node so that the document can be accessed to check for the + * option. Can be document element or a simple node element. + * @return {bool} true if hidden content should be checked, false otherwise + * + * @memberOf AriaUtil + */ + CommonUtil.shouldCheckHiddenContent = function (node) { + return false; + }; + /** + * This function is responsible for determining if node should be skipped from checking or not, based + * on the Check Hidden Content settings and if the node is visible or not. + * + * @parm {element} node - Node to check if it is visible or not based on the Check Hidden Content + * setting. + * + * @return {bool} true if node should be skipped, false otherwise + * + * @memberOf AriaUtil + */ + CommonUtil.shouldNodeBeSkippedHidden = function (node) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we + // return true to identify that the node should not be scanned/added to any hash/array. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (!CommonUtil.shouldCheckHiddenContent(node) && !VisUtil_1.VisUtil.isNodeVisible(node)) { + return true; + } + return false; + }; + CommonUtil.isfocusableByDefault = function (node) { + var focusableElements = ['input', 'select', 'button', 'textarea', 'option', 'area']; + if (node.nodeName.toLowerCase() === "a" && CommonUtil.hasAttribute(node, 'href')) + return true; + if (node.nodeName.toLowerCase() === "area" && CommonUtil.hasAttribute(node, 'href')) + return true; + if (focusableElements.indexOf(node.nodeName.toLowerCase()) !== -1) + return true; + return false; + }; + /** + * This function check if a non-tabable node has valid tabable content. + * If it is tabable (the tabindex is not speicified or is not -1), returns false; + * If it is non-tabable, but a child is tabable and does not have element content, returns false; + * Otherwise, returns true. + */ + CommonUtil.nonTabableChildCheck = function (element) { + if (!element.hasAttribute("tabindex") || + (parseInt(element.getAttribute("tabindex")) != -1)) { + return false; + } + var nw = new DOMWalker_1.DOMWalker(element); + while (nw.nextNode()) { + var child = nw.elem(); + if (child === null) { // Text node. usually is a cartridge return. + continue; + } + if (child.hasAttribute("tabindex") && + (parseInt(child.getAttribute("tabindex")) != -1) && + !CommonUtil.hasInnerContent(child)) { + return false; + } + } + return true; + }; + CommonUtil.hasAttribute = function (element, attributeName) { + var hasAttribute = false; + if (element.hasAttribute) { + hasAttribute = element.hasAttribute(attributeName); + } + else if (element.attributes && element.attributes.getNamedItem) { + var attr = element.attributes.getNamedItem(attributeName); + hasAttribute = attr && attr.specified; + } + return hasAttribute; + }; + // truncate the given text to a given number of characters + // return truncated text to 150 chars, same with the media_alt_brief rule + CommonUtil.truncateText = function (text, len) { + if (len === void 0) { len = 150; } + if (!text) + return text; + text = text.trim(); + if (text.length > len) + return text.substring(0, len - 1) + "..."; + return text; + }; + CommonUtil.input_type_with_placeholder = ["text", "search", "tel", "url", "email", "password", "number"]; + CommonUtil.input_text_types = [ + "text", "file", "password", + "checkbox", "radio", + "search", "tel", "url", "email", + "date", "number", "range", + "time", "color" + ]; + CommonUtil.input_time_types = [ + "date", "month", "week", "time", "datetime-local" + ]; + CommonUtil.input_other_types = [ + "range", "color", "checkbox", "radio", "file", "image" + ]; + CommonUtil.form_button_types = [ + "button", "reset", "submit" + ]; + CommonUtil.form_labelable_elements = ["input", "textarea", "select", "keygen", "progress", "meter", "output", "button"]; + CommonUtil.tabTagMap = { + "button": function (element) { + return !element.hasAttribute("disabled"); + }, + "iframe": true, + "input": function (element) { + if (element.hasAttribute("disabled") || element.getAttribute("type") === "hidden") + return false; + if (element.getAttribute("type") === "radio") { + var name_2 = element.getAttribute("name"); + if (!name_2 || name_2.trim().length === 0) + return true; //single radio, no group + var doc = element.ownerDocument; + var group = doc.querySelectorAll("input[type='radio'][name='" + name_2.trim() + "']"); + if (group.length === 0 || group.length === 1) + return true; //single radio with the name, no others in group + var checked = null; + for (var i = 0; i < group.length; i++) { + if (group[i].checked) + checked = group[i]; + } + //only last one applies if multiple radios with 'checked' attributes + if (checked !== null) { + if (DOMUtil_1.DOMUtil.sameNode(checked, element)) + return true; + return false; + } + else { + // if nothing checked yet, return true if it's the first element + if (DOMUtil_1.DOMUtil.sameNode(group[0], element)) + return true; + return false; + } + } + else + return true; + }, + "select": function (element) { + return !element.hasAttribute("disabled"); + }, + "textarea": function (element) { + if (element.hasAttribute("disabled") || element.getAttribute("type") === "hidden") + return false; + return true; + }, + /**"div": function (element) { + return element.hasAttribute("contenteditable"); + },*/ + "a": function (element) { + // xlink:href?? see svg + return element.hasAttribute("href"); + }, + "area": function (element) { + return element.hasAttribute("href"); + }, + "audio": function (element) { + return element.hasAttribute("controls"); + }, + "video": function (element) { + return element.hasAttribute("controls"); + }, + "summary": function (element) { + // first summary child of a details element is automatically focusable + return element.parentElement && element.parentElement.nodeName.toLowerCase() === 'details' + && DOMUtil_1.DOMUtil.sameNode(__spreadArray([], element.parentElement.children, true).filter(function (elem) { return elem.nodeName.toLowerCase() === 'summary'; })[0], element); + }, + "details": function (element) { + //details element without a direct summary child is automatically focusable + return element.children && __spreadArray([], element.children, true).filter(function (elem) { return elem.nodeName.toLowerCase() === 'summary'; }).length === 0; + } + }; + CommonUtil.image_extensions = [".bmp", ".gif", ".jpg", ".jpeg", ".pcx", ".png"]; + return CommonUtil; +}()); +exports.CommonUtil = CommonUtil; + + +/***/ }, + +/***/ "./src/v4/util/TableUtil.ts" +/*!**********************************!*\ + !*** ./src/v4/util/TableUtil.ts ***! + \**********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.TableUtil = void 0; +var VisUtil_1 = __webpack_require__(/*! ./VisUtil */ "./src/v4/util/VisUtil.ts"); +var AriaUtil_1 = __webpack_require__(/*! ./AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ./CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var TableUtil = /** @class */ (function () { + function TableUtil() { + } + TableUtil.isDataTable = function (tableNode) { + return !(AriaUtil_1.AriaUtil.hasRole(tableNode, "none") || AriaUtil_1.AriaUtil.hasRole(tableNode, "presentation")); + }; + /* + * A complex data table is a data table with any of the following characteristics: + * + * a thead element that contains two or more tr elements + * a table with more than one thead element + * a table with two or more tr elements that contain only th elements + * a th or td element with a rowspan or colspan attribute + * a tr element that contains at least one td element and two or more th elements + * a table with headers not located in the first row or first column + * a td element with a headers attribute value that contains more than two IDREFs + */ + TableUtil.isComplexDataTable = function (table) { + if ("AriaUtil_isComplexDataTable" in table) { + return !!table.AriaUtil_isComplexDataTable; + } + var isComplexTable = false; + if (table && TableUtil.isDataTable(table)) { + var thNodes = null, tdNodes = null; + var trNodes = table.getElementsByTagName("tr"); + var trNodeCount = trNodes.length; + var tdNodeCount = 0, thNodeCount = 0, trNodesHavingOnlyThNodes = 0; + for (var i = 0; !isComplexTable && i < trNodeCount; ++i) { + thNodes = trNodes[i].getElementsByTagName("th"); + tdNodes = trNodes[i].getElementsByTagName("td"); + thNodeCount = thNodes.length; + tdNodeCount = tdNodes.length; + if (tdNodeCount !== 0) { + // a tr element that contains at least one td element and two or more th elements; + isComplexTable = thNodeCount > 1; + // a th element with a rowspan or colspan attribute + for (var j = 0; !isComplexTable && j < thNodeCount; ++j) { + isComplexTable = ((thNodes[j].hasAttribute("rowspan") || + thNodes[j].hasAttribute("colspan")) && + CommonUtil_1.CommonUtil.getAncestor(thNodes[j], "table") === table); + } + // a td element with a rowspan or colspan attribute + // a td element with a headers attribute value that contains more than two IDREFs + for (var k = 0; !isComplexTable && k < tdNodeCount; ++k) { + isComplexTable = ((tdNodes[k].hasAttribute("rowspan") || + tdNodes[k].hasAttribute("colspan") || + (tdNodes[k].hasAttribute("headers") && CommonUtil_1.CommonUtil.normalizeSpacing(tdNodes[k].getAttribute("headers")).split(" ").length > 2)) && + CommonUtil_1.CommonUtil.getAncestor(tdNodes[k], "table") === table); + } + } + else { + // two or more tr elements that contain only th elements + if (thNodeCount > 0) { + ++trNodesHavingOnlyThNodes; + } + isComplexTable = trNodesHavingOnlyThNodes === 2; + } + } + if (!isComplexTable) { + var theadNodes = table.getElementsByTagName("thead"); + var theadNodesLength = theadNodes.length; + if (theadNodesLength > 0) { + // table has more than one thead element + isComplexTable = theadNodesLength > 1; + // a thead element that contains two or more tr elements + if (!isComplexTable) { + isComplexTable = theadNodes[0].getElementsByTagName("tr").length > 1; + } + } + } + if (!isComplexTable && trNodeCount !== 0) { + // a table with headers not located in the first row or first column + isComplexTable = thNodeCount > 0 && !TableUtil.tableHeaderExists(table); + } + } + table.AriaUtil_isComplexDataTable = isComplexTable; + return isComplexTable; + }; + // Return true if a table cell is hidden or contain no data: <td></td> + TableUtil.isTableCellEmpty = function (cell) { + if (!cell || !VisUtil_1.VisUtil.isNodeVisible(cell) || cell.innerHTML.replace(/&nbsp;/g, ' ').trim().length === 0) + return true; + return false; + }; + // Return true if a table row is hidden or contain no data: <tr /> or <tr><td></td><td></td></tr> + TableUtil.isTableRowEmpty = function (row) { + if (!row || !row.cells || row.cells.length === 0 || !VisUtil_1.VisUtil.isNodeVisible(row)) + return true; + var passed = true; //empty + for (var c = 0; passed && c < row.cells.length; c++) { + var cell = row.cells[c]; + passed = TableUtil.isTableCellEmpty(cell); + } + return passed; + }; + // Return true if a table's header is in the first row or column + TableUtil.tableHeaderExists = function (ruleContext) { + var rows = ruleContext.rows; + if (!rows || rows.length === 0) + return null; + // note that table.rows return all all the rows in the table, + // including the rows contained within <thead>, <tfoot>, and <tbody> elements. + //case 1: headers are in the very first row with data in tbody or thead, but not in tfoot + //get the first row with data, ignoring the rows with no data + var passed = true; + var firstRow = rows[0]; + for (var r = 0; passed && r < rows.length; r++) { + firstRow = rows[r]; + // ignore the rows from tfoot + if (firstRow.parentNode && firstRow.parentNode.nodeName.toLowerCase() === 'tfoot') + continue; + passed = TableUtil.isTableRowEmpty(firstRow); + } + //table contain no data: <table><tr><td></td><td></td></tr></table> + if (passed) + return null; + // Check if the cells with data in the first data row are all TH's + passed = true; + for (var r = 0; passed && r < firstRow.cells.length; r++) { + var cell = firstRow.cells[r]; + passed = TableUtil.isTableCellEmpty(cell) || cell.nodeName.toLowerCase() === 'th'; + } + if (passed) + return true; + // Case 2: headers are in the first column with data + // Assume that the first column has all TH's or a TD without data in the first column. + passed = true; + for (var i = 0; passed && i < rows.length; ++i) { + // ignore the rows from tfoot + if (rows[i].parentNode && rows[i].parentNode.nodeName.toLowerCase() === 'tfoot') + continue; + // If no cells in this row, or no data at all, that's okay too. + passed = !rows[i].cells || + rows[i].cells.length === 0 || + rows[i].cells[0].innerHTML.trim().length === 0 || + rows[i].cells[0].nodeName.toLowerCase() != "td"; + } + if (passed) + return true; + //case 3: all td data cells have headers attributes that point to the id of a th element in the same table. + // https://html.spec.whatwg.org/multipage/tables.html#attributes-common-to-td-and-th-elements + passed = true; + var thIds = []; + var tdHeaders = []; + for (var r = 0; passed && r < rows.length; r++) { + var row = rows[r]; + // Check if the cells with data in the last data row are all TH's + for (var c = 0; c < row.cells.length; c++) { + var cell = row.cells[c]; + if (TableUtil.isTableCellEmpty(cell)) + continue; + if (cell.nodeName.toLowerCase() === 'td') { + if (!cell.getAttribute('headers') || cell.getAttribute('headers').trim().length === 0) + passed = false; + else + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(cell.getAttribute('headers').trim().split(" "), tdHeaders); + } + else if (cell.nodeName.toLowerCase() === 'th' && cell.getAttribute('id') && cell.getAttribute('id').trim().length > 0) + CommonUtil_1.CommonUtil.concatUniqueArrayItem(cell.getAttribute('id').trim(), thIds); + } + } + if (passed) { // all td elements have headers, to exam if the headers point to a th id + if (thIds.length > 0 && tdHeaders.every(function (header) { return thIds.includes(header); })) + return true; + } + return false; + }; + TableUtil.isLayoutTable = function (tableNode) { + return AriaUtil_1.AriaUtil.hasRole(tableNode, "presentation") || AriaUtil_1.AriaUtil.hasRole(tableNode, "none"); + }; + /* + * get conflict Aria and Html attributes + * return: a list of Aria and Html attribute pairs that are conflict + */ + TableUtil.isTableDescendant = function (contextHierarchies) { + if (!contextHierarchies) + return null; + return contextHierarchies["aria"].filter(function (hier) { return ["table", "grid", "treegrid"].includes(hier.role); }); + }; + return TableUtil; +}()); +exports.TableUtil = TableUtil; + + +/***/ }, + +/***/ "./src/v4/util/VisUtil.ts" +/*!********************************!*\ + !*** ./src/v4/util/VisUtil.ts ***! + \********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.VisUtil = void 0; +var CacheUtil_1 = __webpack_require__(/*! ./CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var DOMMapper_1 = __webpack_require__(/*! ../../v2/dom/DOMMapper */ "./src/v2/dom/DOMMapper.ts"); +var AriaUtil_1 = __webpack_require__(/*! ./AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CSSUtil_1 = __webpack_require__(/*! ./CSSUtil */ "./src/v4/util/CSSUtil.ts"); +var ClipPathUtil_1 = __webpack_require__(/*! ./ClipPathUtil */ "./src/v4/util/ClipPathUtil.ts"); +var VisUtil = /** @class */ (function () { + function VisUtil() { + } + /** + * This function is responsible for checking if the node that is provied is + * visible or not. Following is how the check is performed: + * 1. Check if the current node is hidden with the following options: + * CSS --> dislay: none + * CSS --> visibility: hidden + * attribute --> hidden + * 2. Check if the any of the current nodes parents are hidden with the same + * options listed in 1. + * + * Note: If either current node or any of the parent nodes are hidden then this + * function will return false (node is not visible). + * + * Note: nodes with CSS properties opacity:0 or filter:opacity(0%), or similar SVG mechanisms: + * They are not considered hidden. Text hidden with these methods can still be selected or copied, + * and user agents still expose it in their accessibility trees. + * + * Note: nodes hidden off screen or behind another object: they are not considered hidden. + * They are exposed in the accessibility tree and they can even name on-screen objects. + * + * @parm {element} node The node which should be checked if it is visible or not. + * @return {bool} false if the node is NOT visible, true otherwise + * + * @memberOf VisUtil + */ + VisUtil.isNodeVisible = function (nodeIn) { + // Check the nodeType if this node, if this node is a text node then + // we get the parentnode and set that as the node as a text nodes, + // visibility is directly related to the parent node. + if (nodeIn.nodeType === 3) { + nodeIn = DOMWalker_1.DOMWalker.parentNode(nodeIn); + } + var node = nodeIn; + // We should only allow nodeType element, and TextNode all other nodesTypes + // we can return the visibility as visible. + // Following nodes will be returned as visable by default, since we can not + // actually change their visibility. + // Node.PROCESSING_INSTRUCTION_NODE --> 7 + // Node.COMMENT_NODE --> 8 + // 9 /* Node.DOCUMENT_NODE */ --> 9 + // Node.DOCUMENT_TYPE_NODE --> 10 + // Node.DOCUMENT_FRAGMENT_NODE --> 11 + if (node.nodeType !== 1) { + return true; + } + // Make sure that the ownerDocument is present before moving forward + // in detecting if the node is visible or not. In the case that ownerDocument + // does not exist then we simply return node is visible by default. + if (!node.ownerDocument) { + return true; + } + // Variable Declaration + var compStyle; + var nodeName = node.nodeName.toLowerCase(); + // In the case this node is a script, link or style node, right away return node is visible + // because scripts, links and style nodes can not be hidden by HTML attribute or CSS or are hidden by default. But we want to scan + // the elements everytime as they render content still which is still visible to users. + // script --> script elements have display: none by default + // link --> link elements have display: none by default, but the actually CSS script is still executed so we have to + // mark this element as visible at all times. + // style --> style elements have display: none by default, but the actually CSS script is still executed so we have to + // mark this element as visible at all times. + // datalist --> In the rendering, the datalist element represents nothing and it, along with its children, should be hidden. + if (VisUtil.hiddenByDefaultElements != null && VisUtil.hiddenByDefaultElements != undefined && VisUtil.hiddenByDefaultElements.indexOf(nodeName) > -1) { + //return true; + return false; + } + var cacheVal = CacheUtil_1.CacheUtil.getCache(node, "PT_NODE_HIDDEN", undefined); + if (cacheVal !== undefined) { + return cacheVal; + } + // Set PT_NODE_HIDDEN to false for all the nodes, before the check and this will be changed to + // true when we detect that the node is hidden. We have to set it to false so that we know + // the rules has already been checked. + cacheVal = CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", false); + // Check if this node is visible, we check couple of CSS properties and hidden attribute. + // area, param and audio elements we do not check if they are hidden as it does not apply to them. + // Check the unhideableElements array which is part of the rules, to check if this element is allowed to be hidden or not + // in the case that the element is part of the unhideableElements array then we do not run the hidden check on this element, + // and go stright to the parent node. + // Array check elements like: + // area --> area element is part of a map element and it can not be hidden because it is used to + // make an certian parts of an map interactive. + // param --> element can only be part of object elment and it cannot be hidden directly, it + // can only be hidden if the parent is hidden. + // audio --> If this element is hidden it will still play the music, so we should still trigger + // violations for this element. + // In the case that unhideableElements array is not defined then we just scan all elements and do no filtering at all. + if (VisUtil.unhideableElements === null || VisUtil.unhideableElements === undefined || VisUtil.unhideableElements.indexOf(nodeName) === -1) { + // Check if defaultView exists for this node, if it does then use this to run the getComputedStyle + // function to get the CSS style for the node. + if (node.ownerDocument.defaultView) { + // Run the getComputedStyle on this node to fetch the CSS compuation of the node + compStyle = node.ownerDocument.defaultView.getComputedStyle(node, null); + } + // In the case that defaultView does not exists return true to identify that this + // node is visible, because were not able to detect if it was not. + else { + return CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", true); + } + // Get the hidden element property and hidden attribute + var hiddenAttribute = node.getAttribute("hidden"); + var hiddenPropertyCustom = cacheVal; + // To get the hidden property we need to perform a special check as in some cases the hidden property will not be + // a boolean, for theses cases we set it to false as we are not able to determine the true hidden condition. + // The reason for this is because form elements are able to perform an override, so when we have id="hidden" for an element + // which is under the form element then, node.hidden gives the element/list of elements which have id="hidden". Refer to + // mozilla bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1267356 + var hiddenProperty = typeof node.hidden === "boolean" ? node.hidden : false; + // If compStyle object is empty, node does't have hidden property, node does't have hidden attribute and does't have custom PT + // hidden property then we can just return true (node visible) at this point. + if (!compStyle && + !hiddenProperty && // this covers false, null, or undefined + (hiddenAttribute === null || hiddenAttribute === undefined) && + !hiddenPropertyCustom // This covers false, null or undefined + ) { + return CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", true); + } + // In the case that the compStyle is defined we check the following: + // CSS style display set to none + // CSS style visibility set to hidden + // Note: For this property since it is inherited, need to skip the check on parents as + // the parent can have hidden but the child can be visible. So we only check this property + // on child elements/elements that are passed to this function the first time. + // node hidden property set (node.hidden) + // node attribute hidden set (to any value) + // node custom hidden property ser (node.PT_NODE_HIDDEN) + // If any of the above conditions are true then we return false as this element is not visible + if ((compStyle !== null && ((compStyle.getPropertyValue('display') === 'none' || + (!CacheUtil_1.CacheUtil.getCache(node, "Visibility_Check_Parent", null) && compStyle.getPropertyValue('visibility') === 'hidden'))) || + (compStyle.getPropertyValue('display') !== 'block' && (hiddenProperty || hiddenAttribute != null || hiddenPropertyCustom)))) { + // Set a custom expandos property on the the node to identify that it is hidden, so that we can uses + // use this in the rules to determine if the node is hidden or not, if we need to. + // Use expandos property instead of a hash map which stores the elements, adding/checking expandos + // properties is a lot faster performance whise. For Hash map we need to store based on xpath, and to calculate + // xpath it is more performance impact. + return CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", false); + } + // check content-visibility: if the content-visibility is hidden, then, return false as the element is not visible + if (VisUtil.isContentHidden(node)) { + return CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", false); + } + // check hidden by clip-path + // TODO: need to check if hidden content contains focusable elements, similarly to offscreen content + if (ClipPathUtil_1.ClipPathUtil.isNodeVisuallyHiddenByClipPath(node)) { + return CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", false); + } + } + // Get the parentNode for this node, becuase we have to check all parents to make sure they do not have + // the hidden CSS, property or attribute. Only keep checking until we are all the way back to the parentNode + // element. + var parentElement = DOMWalker_1.DOMWalker.parentNode(node); + // If the parent node exists and the nodetype is element (1), then run recursive call to perform the check + // all the way up to the very parent node. Use recursive call here instead of a while loop so that we do not + // have to duplicate the logic for checking if the node is visible or not for all the parents starting with + // child node. + if (parentElement != null && parentElement.nodeType === 1) { + // When we have a parent element going through the isNodeVisible function we have to mark it as such + // so that in the function we can skip checking visibility: hidden for parent elements since visibility: hidden + // is inherited, which allows a child to have a different setting then the child. This property only needs to be checked + // once for the first element that is passed down and that is all. Ignore it for all the parents that we iterate over. + CacheUtil_1.CacheUtil.setCache(parentElement, "Visibility_Check_Parent", true); + // Check upwards recursively, and save the results in an variable + var nodeVisible = VisUtil.isNodeVisible(parentElement); + // If the node is found to not be visible then add the custom PT_NODE_HIDDEN to true. + // so that we can use this in the rules. + // if (!nodeVisible) { + // CacheUtil.setCache(node, "PT_NODE_HIDDEN", true); + // } + // Check upwards recursively + return CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", nodeVisible); + } + // Return true (node is visible) + return CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", true); + }; + /** + * This function is responsible for checking if the node that is visually hidden by clipping or opaq: + * 1. Check if the current node is visually hidden: + * CSS --> clip: rect(0px, 0px, 0px, 0px) + * CSS --> opacity: 0 + * + * Note: If either current node or any of the parent nodes are visually hidden then this + * function will return true (node is not visually hidden). + * + * Note: nodes with CSS properties clip: rect(0px, 0px, 0px, 0px) or opacity:0 or filter:opacity(0%), or similar SVG mechanisms: + * They are not considered hidden to an AT. Text hidden with these methods can still be selected or copied, + * and user agents still expose it in their accessibility trees. + * + * @parm {element} node The node which should be checked if it is visually hidden or not. + * @return {bool} true if the node is visually hidden, false otherwise + * + * @memberOf VisUtil + */ + VisUtil.isNodeVisuallyHidden = function (node) { + if (!node || node.nodeType !== 1) + return false; + var elem = node; + // Set PT_NODE_HIDDEN to false for all the nodes, before the check and this will be changed to + // true when we detect that the node is hidden. We have to set it to false so that we know + // the rules has already been checked. + var hidden = CacheUtil_1.CacheUtil.getCache(elem, "PT_NODE_VISUALLY_HIDDEN", undefined); + if (hidden === undefined) { + // defined styles only give the styles that changed + var comp_styles = CSSUtil_1.CSSUtil.getComputedStyle(elem); + if ((comp_styles['position'] === 'absolute' && comp_styles['clip'] && comp_styles['clip'].replaceAll(' ', '') === 'rect(0px,0px,0px,0px)') + || (comp_styles['opacity'] && parseFloat(comp_styles['opacity']) < 0.1)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN", true); + return true; + } + // Get the parentNode for this node, becuase we have to check all parents to make sure they do not have + // the hidden CSS, property or attribute. Only keep checking until we are all the way back to the parentNode + // element. + var parentElement = DOMWalker_1.DOMWalker.parentElement(elem); + if (!parentElement) + return false; + // Check upwards recursively + var hid = VisUtil.isNodeVisuallyHidden(parentElement); + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN", hid); + return hid; + } + return hidden; + }; + /** + * return true if the node or its ancestor is hidden by CSS content-visibility:hidden + * At this time, CSS content-visibility is partially supported by Chrome & Edge, but not supported by Firefox + * The implementation TEMPORARILY follows the Chrome test results: + * if content-visibility:hidden + * if the element is block-level (default or specified by the user), then the element and its children are normally hidden; + * if the element is inline (default or specified by the user), then the element and its children are normally NOT hidden; + * + * @param node + */ + VisUtil.isContentHidden = function (node) { + if (!node) + return false; + var vis = CacheUtil_1.CacheUtil.getCache(node, "PT_NODE_ContentHidden", undefined); + if (vis !== undefined) + return vis; + var style = getComputedStyle(node); + if (!style) { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_ContentHidden", false); + return false; + } + var content_visibility = style.getPropertyValue("content-visibility"); + if (content_visibility !== 'hidden') { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_ContentHidden", false); + return false; + } + var display = style.getPropertyValue("display"); + // inline element only + if (display === 'inline') { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_ContentHidden", false); + return false; + } + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_ContentHidden", true); + return true; + }; + /** + * return true if the node is offscreen by CSS position + * @param node + */ + VisUtil.isElementOffscreen = function (node) { + if (!node) + return true; + if (node.nodeType !== 1) + return false; + var vis = CacheUtil_1.CacheUtil.getCache(node, "PT_NODE_Offscreen", undefined); + if (vis !== undefined) + return vis; + var mapper = new DOMMapper_1.DOMMapper(); + var bounds = mapper.getUnadjustedBounds(node); + if (!bounds) { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_Offscreen", true); + return true; + } + if (bounds['height'] === 0 || bounds['width'] === 0 || (bounds['top'] + bounds['height']) <= 0 || (bounds['left'] + bounds['width']) <= 0) { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_Offscreen", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_Offscreen", false); + return false; + }; + /** + * return true if the node or its ancestor is natively hidden or aria-hidden = 'true' + * @param node + */ + VisUtil.isNodeHiddenFromAT = function (node) { + if (!node) + return false; + var vis = CacheUtil_1.CacheUtil.getCache(node, "PT_NODE_HiddenFromAT", undefined); + if (vis !== undefined) + return vis; + if (!VisUtil.isNodeVisible(node) || node.getAttribute("aria-hidden") === 'true') { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HiddenFromAT", true); + return true; + } + var ancestor = DOMUtil_1.DOMUtil.getAncestorWithAttribute(node, "aria-hidden", "true"); + if (ancestor) { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HiddenFromAT", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HiddenFromAT", false); + return false; + }; + /** + * return true if the node or its ancestor is natively hidden or aria-hidden = 'true' + * @param node + */ + VisUtil.isNodePresentational = function (node) { + var role = AriaUtil_1.AriaUtil.getResolvedRole(node); + if (role && (role === 'none' || role === 'presentation')) + return true; + return false; + }; + /** + * return true if the element is scrollable + * @param node + */ + VisUtil.isElementScrollable = function (elem) { + if (!elem) + return false; + var styles = CSSUtil_1.CSSUtil.getComputedStyle(elem); + if (!styles) + return false; + var x_scroll = styles.getPropertyValue('overflow-x'); + var y_scroll = styles.getPropertyValue('overflow-y'); + //console.log("before node="+ elem.nodeName +", id="+elem.getAttribute("id") +", x_scroll="+x_scroll + ", y_scroll="+y_scroll); + // If overflow-y is hidden, scroll, or auto, and the overflow-x property is visible (default), the value will be implicitly computed as auto. + if (x_scroll === 'visible' && (y_scroll === 'hidden' || y_scroll === 'scroll' || y_scroll === 'auto')) + x_scroll = 'auto'; + // If overflow-x is hidden, scroll, or auto and the overflow-y property is visible (default), the value will be implicitly computed as auto. + if (y_scroll === 'visible' && (x_scroll === 'hidden' || x_scroll === 'scroll' || x_scroll === 'auto')) + y_scroll = 'auto'; + // setting overflow to clip in one direction when it isn't set to visible or clip in the other direction results in the clip value behaving as hidden. + if (x_scroll === 'clip' && y_scroll !== 'visible' && y_scroll !== 'clip') + x_scroll = 'hidden'; + if (y_scroll === 'clip' && x_scroll !== 'visible' && x_scroll !== 'clip') + y_scroll = 'hidden'; + // not scrollable: no scroll bars + if ((x_scroll === 'visible' || x_scroll === 'hidden' || x_scroll === 'clip') + && (y_scroll === 'visible' || y_scroll === 'hidden' || y_scroll === 'clip')) + return false; + // false if the overall scrollable element (clientWidth + scrollbarWidth and clientHeight + scrollbarHeight) is too small to be visible on screen + if (Math.max(elem.offsetWidth, elem.offsetHeight) < 30 || Math.min(elem.offsetWidth, elem.offsetHeight) < 15) + return false; + // false if content is smaller than the scrollable container: both x and y scroll distances < element's horizontal/vertical padding + var padding_x = CSSUtil_1.CSSUtil.getPixelsFromStyle(styles.paddingLeft, elem) + CSSUtil_1.CSSUtil.getPixelsFromStyle(styles.paddingRight, elem); + var padding_y = CSSUtil_1.CSSUtil.getPixelsFromStyle(styles.paddingTop, elem) + CSSUtil_1.CSSUtil.getPixelsFromStyle(styles.paddingBottom, elem); + if (elem.scrollWidth - elem.clientWidth < 1 + padding_x + && elem.scrollHeight - elem.clientHeight < 1 + padding_y) + return false; + return true; + }; + // This list contains a list of element tags which can not be hidden, when hidden is + // added to theses elements it does not do anything at all. + // area --> area element is part of a map element and it can not be hidden because it is used to + // make an certian parts of an map interactive. + // param --> element can only be part of object elment and it cannot be hidden directly, it + // can only be hidden if the parent is hidden. + // audio --> If this element is hidden it will still play the music, so we should still trigger + // violations for this element. + // Note: All element tags that are added here should be added as lowercase, as we are using indexOf to do the check. + VisUtil.unhideableElements = ['area', 'param', 'audio']; + // This list contains a list of elements tags which have display: none by default, since we have rules triggering + // on theses elements we need to make then visible by default so that the rules can trigger regardless of the + // Check Hidden Content option in the tools. + // script --> script elements have display: none by default + // link --> link elements have display: none by default, but the actually CSS script is still executed so we have to + // mark this element as visible at all times. + // style --> style elements have display: none by default, but the actually CSS script is still executed so we have to + // mark this element as visible at all times. + // head --> head elements have display: none by default, but it will still behave correct + // title --> title elements have display: none by default, but it will still display the title. remove title from the list because a title can be a child of a svg element too + // meta --> meta elements have display: none by default, but it will still perform the action that meta is suppose to + // base --> base elements have display: none by default, but it will still perform the action that meta is suppose to + // noscript --> noscript elements have display: none by default, but it will still perform the action that meta is suppose to + // template --> template elements have display: none by default, because they are just a mechanism for holding client-side content + // that is not to be rendered when a page is loaded. https://developer.mozilla.org/en/docs/Web/HTML/Element/template + // datalist --> datalist elements have display: none by default, + VisUtil.hiddenByDefaultElements = ['script', 'link', 'style', 'head', 'meta', 'base', 'noscript', 'template', 'datalist']; + return VisUtil; +}()); +exports.VisUtil = VisUtil; + + +/***/ }, + +/***/ "./src/v4/sc-urls.json" +/*!*****************************!*\ + !*** ./src/v4/sc-urls.json ***! + \*****************************/ +(module) { + +module.exports = /*#__PURE__*/JSON.parse('{"1.1.1":{"num":"1.1.1","url":"https://www.w3.org/TR/WCAG22/#non-text-content","scId":"WCAG2:non-text-content","scAltId":["text-equiv-all"],"test":"WCAG2:text-equiv-all","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#non-text-content","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/non-text-content.html","handle":"Non-text Content","level":"A","wcagType":"2.0"},"1.2.1":{"num":"1.2.1","url":"https://www.w3.org/TR/WCAG22/#audio-only-and-video-only-prerecorded","scId":"WCAG2:audio-only-and-video-only-prerecorded","scAltId":["media-equiv-av-only-alt"],"test":"WCAG2:media-equiv-av-only-alt","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-only-and-video-only-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-only-and-video-only-prerecorded.html","handle":"Audio-only and Video-only (Prerecorded)","level":"A","wcagType":"2.0"},"1.2.2":{"num":"1.2.2","url":"https://www.w3.org/TR/WCAG22/#captions-prerecorded","scId":"WCAG2:captions-prerecorded","scAltId":["media-equiv-captions"],"test":"WCAG2:media-equiv-captions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#captions-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/captions-prerecorded.html","handle":"Captions (Prerecorded)","level":"A","wcagType":"2.0"},"1.2.3":{"num":"1.2.3","url":"https://www.w3.org/TR/WCAG22/#audio-description-or-media-alternative-prerecorded","scId":"WCAG2:audio-description-or-media-alternative-prerecorded","scAltId":["media-equiv-audio-desc"],"test":"WCAG2:media-equiv-audio-desc","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-description-or-media-alternative-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-description-or-media-alternative-prerecorded.html","handle":"Audio Description or Media Alternative (Prerecorded)","level":"A","wcagType":"2.0"},"1.2.4":{"num":"1.2.4","url":"https://www.w3.org/TR/WCAG22/#captions-live","scId":"WCAG2:captions-live","scAltId":["media-equiv-real-time-captions"],"test":"WCAG2:media-equiv-real-time-captions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#captions-live","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/captions-live.html","handle":"Captions (Live)","level":"AA","wcagType":"2.0"},"1.2.5":{"num":"1.2.5","url":"https://www.w3.org/TR/WCAG22/#audio-description-prerecorded","scId":"WCAG2:audio-description-prerecorded","scAltId":["media-equiv-audio-desc-only"],"test":"WCAG2:media-equiv-audio-desc-only","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-description-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-description-prerecorded.html","handle":"Audio Description (Prerecorded)","level":"AA","wcagType":"2.0"},"1.2.6":{"num":"1.2.6","url":"https://www.w3.org/TR/WCAG22/#sign-language-prerecorded","scId":"WCAG2:sign-language-prerecorded","scAltId":["media-equiv-sign"],"test":"WCAG2:media-equiv-sign","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#sign-language-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/sign-language-prerecorded.html","handle":"Sign Language (Prerecorded)","level":"AAA","wcagType":"2.0"},"1.2.7":{"num":"1.2.7","url":"https://www.w3.org/TR/WCAG22/#extended-audio-description-prerecorded","scId":"WCAG2:extended-audio-description-prerecorded","scAltId":["media-equiv-extended-ad"],"test":"WCAG2:media-equiv-extended-ad","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#extended-audio-description-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/extended-audio-description-prerecorded.html","handle":"Extended Audio Description (Prerecorded)","level":"AAA","wcagType":"2.0"},"1.2.8":{"num":"1.2.8","url":"https://www.w3.org/TR/WCAG22/#media-alternative-prerecorded","scId":"WCAG2:media-alternative-prerecorded","scAltId":["media-equiv-text-doc"],"test":"WCAG2:media-equiv-text-doc","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#media-alternative-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/media-alternative-prerecorded.html","handle":"Media Alternative (Prerecorded)","level":"AAA","wcagType":"2.0"},"1.2.9":{"num":"1.2.9","url":"https://www.w3.org/TR/WCAG22/#audio-only-live","scId":"WCAG2:audio-only-live","scAltId":["media-equiv-live-audio-only"],"test":"WCAG2:media-equiv-live-audio-only","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-only-live","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-only-live.html","handle":"Audio-only (Live)","level":"AAA","wcagType":"2.0"},"1.3.1":{"num":"1.3.1","url":"https://www.w3.org/TR/WCAG22/#info-and-relationships","scId":"WCAG2:info-and-relationships","scAltId":["content-structure-separation-programmatic"],"test":"WCAG2:content-structure-separation-programmatic","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#info-and-relationships","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/info-and-relationships.html","handle":"Info and Relationships","level":"A","wcagType":"2.0"},"1.3.2":{"num":"1.3.2","url":"https://www.w3.org/TR/WCAG22/#meaningful-sequence","scId":"WCAG2:meaningful-sequence","scAltId":["content-structure-separation-sequence"],"test":"WCAG2:content-structure-separation-sequence","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#meaningful-sequence","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/meaningful-sequence.html","handle":"Meaningful Sequence","level":"A","wcagType":"2.0"},"1.3.3":{"num":"1.3.3","url":"https://www.w3.org/TR/WCAG22/#sensory-characteristics","scId":"WCAG2:sensory-characteristics","scAltId":["content-structure-separation-understanding"],"test":"WCAG2:content-structure-separation-understanding","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#sensory-characteristics","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/sensory-characteristics.html","handle":"Sensory Characteristics","level":"A","wcagType":"2.0"},"1.3.4":{"num":"1.3.4","url":"https://www.w3.org/TR/WCAG22/#orientation","scId":"WCAG2:orientation","scAltId":[],"test":"WCAG2:orientation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#orientation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/orientation.html","handle":"Orientation","level":"AA","wcagType":"2.1"},"1.3.5":{"num":"1.3.5","url":"https://www.w3.org/TR/WCAG22/#identify-input-purpose","scId":"WCAG2:identify-input-purpose","scAltId":[],"test":"WCAG2:identify-input-purpose","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#identify-input-purpose","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/identify-input-purpose.html","handle":"Identify Input Purpose","level":"AA","wcagType":"2.1"},"1.3.6":{"num":"1.3.6","url":"https://www.w3.org/TR/WCAG22/#identify-purpose","scId":"WCAG2:identify-purpose","scAltId":[],"test":"WCAG2:identify-purpose","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#identify-purpose","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/identify-purpose.html","handle":"Identify Purpose","level":"AAA","wcagType":"2.1"},"1.4.1":{"num":"1.4.1","url":"https://www.w3.org/TR/WCAG22/#use-of-color","scId":"WCAG2:use-of-color","scAltId":["visual-audio-contrast-without-color"],"test":"WCAG2:visual-audio-contrast-without-color","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#use-of-color","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/use-of-color.html","handle":"Use of Color","level":"A","wcagType":"2.0"},"1.4.2":{"num":"1.4.2","url":"https://www.w3.org/TR/WCAG22/#audio-control","scId":"WCAG2:audio-control","scAltId":["visual-audio-contrast-dis-audio"],"test":"WCAG2:visual-audio-contrast-dis-audio","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-control","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-control.html","handle":"Audio Control","level":"A","wcagType":"2.0"},"1.4.3":{"num":"1.4.3","url":"https://www.w3.org/TR/WCAG22/#contrast-minimum","scId":"WCAG2:contrast-minimum","scAltId":["visual-audio-contrast-contrast"],"test":"WCAG2:visual-audio-contrast-contrast","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#contrast-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/contrast-minimum.html","handle":"Contrast (Minimum)","level":"AA","wcagType":"2.0"},"1.4.4":{"num":"1.4.4","url":"https://www.w3.org/TR/WCAG22/#resize-text","scId":"WCAG2:resize-text","scAltId":["visual-audio-contrast-scale"],"test":"WCAG2:visual-audio-contrast-scale","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#resize-text","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/resize-text.html","handle":"Resize text","level":"AA","wcagType":"2.0"},"1.4.5":{"num":"1.4.5","url":"https://www.w3.org/TR/WCAG22/#images-of-text","scId":"WCAG2:images-of-text","scAltId":["visual-audio-contrast-text-presentation"],"test":"WCAG2:visual-audio-contrast-text-presentation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#images-of-text","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/images-of-text.html","handle":"Images of Text","level":"AA","wcagType":"2.0"},"1.4.6":{"num":"1.4.6","url":"https://www.w3.org/TR/WCAG22/#contrast-enhanced","scId":"WCAG2:contrast-enhanced","scAltId":["visual-audio-contrast7"],"test":"WCAG2:visual-audio-contrast7","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#contrast-enhanced","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/contrast-enhanced.html","handle":"Contrast (Enhanced)","level":"AAA","wcagType":"2.0"},"1.4.7":{"num":"1.4.7","url":"https://www.w3.org/TR/WCAG22/#low-or-no-background-audio","scId":"WCAG2:low-or-no-background-audio","scAltId":["visual-audio-contrast-noaudio"],"test":"WCAG2:visual-audio-contrast-noaudio","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#low-or-no-background-audio","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/low-or-no-background-audio.html","handle":"Low or No Background Audio","level":"AAA","wcagType":"2.0"},"1.4.8":{"num":"1.4.8","url":"https://www.w3.org/TR/WCAG22/#visual-presentation","scId":"WCAG2:visual-presentation","scAltId":["visual-audio-contrast-visual-presentation"],"test":"WCAG2:visual-audio-contrast-visual-presentation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#visual-presentation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/visual-presentation.html","handle":"Visual Presentation","level":"AAA","wcagType":"2.0"},"1.4.9":{"num":"1.4.9","url":"https://www.w3.org/TR/WCAG22/#images-of-text-no-exception","scId":"WCAG2:images-of-text-no-exception","scAltId":["visual-audio-contrast-text-images"],"test":"WCAG2:visual-audio-contrast-text-images","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#images-of-text-no-exception","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/images-of-text-no-exception.html","handle":"Images of Text (No Exception)","level":"AAA","wcagType":"2.0"},"1.4.10":{"num":"1.4.10","url":"https://www.w3.org/TR/WCAG22/#reflow","scId":"WCAG2:reflow","scAltId":[],"test":"WCAG2:reflow","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#reflow","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/reflow.html","handle":"Reflow","level":"AA","wcagType":"2.1"},"1.4.11":{"num":"1.4.11","url":"https://www.w3.org/TR/WCAG22/#non-text-contrast","scId":"WCAG2:non-text-contrast","scAltId":[],"test":"WCAG2:non-text-contrast","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#non-text-contrast","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/non-text-contrast.html","handle":"Non-text Contrast","level":"AA","wcagType":"2.1"},"1.4.12":{"num":"1.4.12","url":"https://www.w3.org/TR/WCAG22/#text-spacing","scId":"WCAG2:text-spacing","scAltId":[],"test":"WCAG2:text-spacing","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#text-spacing","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/text-spacing.html","handle":"Text Spacing","level":"AA","wcagType":"2.1"},"1.4.13":{"num":"1.4.13","url":"https://www.w3.org/TR/WCAG22/#content-on-hover-or-focus","scId":"WCAG2:content-on-hover-or-focus","scAltId":[],"test":"WCAG2:content-on-hover-or-focus","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#content-on-hover-or-focus","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/content-on-hover-or-focus.html","handle":"Content on Hover or Focus","level":"AA","wcagType":"2.1"},"2.1.1":{"num":"2.1.1","url":"https://www.w3.org/TR/WCAG22/#keyboard","scId":"WCAG2:keyboard","scAltId":["keyboard-operation-keyboard-operable"],"test":"WCAG2:keyboard-operation-keyboard-operable","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#keyboard","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/keyboard.html","handle":"Keyboard","level":"A","wcagType":"2.0"},"2.1.2":{"num":"2.1.2","url":"https://www.w3.org/TR/WCAG22/#no-keyboard-trap","scId":"WCAG2:no-keyboard-trap","scAltId":["keyboard-operation-trapping"],"test":"WCAG2:keyboard-operation-trapping","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#no-keyboard-trap","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/no-keyboard-trap.html","handle":"No Keyboard Trap","level":"A","wcagType":"2.0"},"2.1.3":{"num":"2.1.3","url":"https://www.w3.org/TR/WCAG22/#keyboard-no-exception","scId":"WCAG2:keyboard-no-exception","scAltId":["keyboard-operation-all-funcs"],"test":"WCAG2:keyboard-operation-all-funcs","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#keyboard-no-exception","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/keyboard-no-exception.html","handle":"Keyboard (No Exception)","level":"AAA","wcagType":"2.0"},"2.1.4":{"num":"2.1.4","url":"https://www.w3.org/TR/WCAG22/#character-key-shortcuts","scId":"WCAG2:character-key-shortcuts","scAltId":[],"test":"WCAG2:WCAG2:character-key-shortcuts","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#character-key-shortcuts","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/character-key-shortcuts.html","handle":"Character Key Shortcuts","level":"A","wcagType":"2.1"},"2.2.1":{"num":"2.2.1","url":"https://www.w3.org/TR/WCAG22/#timing-adjustable","scId":"WCAG2:timing-adjustable","scAltId":["time-limits-required-behaviors"],"test":"WCAG2:time-limits-required-behaviors","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#timing-adjustable","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/timing-adjustable.html","handle":"Timing Adjustable","level":"A","wcagType":"2.0"},"2.2.2":{"num":"2.2.2","url":"https://www.w3.org/TR/WCAG22/#pause-stop-hide","scId":"WCAG2:pause-stop-hide","scAltId":["time-limits-pause"],"test":"WCAG2:time-limits-pause","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pause-stop-hide","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pause-stop-hide.html","handle":"Pause, Stop, Hide","level":"A","wcagType":"2.0"},"2.2.3":{"num":"2.2.3","url":"https://www.w3.org/TR/WCAG22/#no-timing","scId":"WCAG2:no-timing","scAltId":["time-limits-no-exceptions"],"test":"WCAG2:time-limits-no-exceptions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#no-timing","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/no-timing.html","handle":"No Timing","level":"AAA","wcagType":"2.0"},"2.2.4":{"num":"2.2.4","url":"https://www.w3.org/TR/WCAG22/#interruptions","scId":"WCAG2:interruptions","scAltId":["time-limits-postponed"],"test":"WCAG2:time-limits-postponed","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#interruptions","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/interruptions.html","handle":"Interruptions","level":"AAA","wcagType":"2.0"},"2.2.5":{"num":"2.2.5","url":"https://www.w3.org/TR/WCAG22/#re-authenticating","scId":"WCAG2:re-authenticating","scAltId":["time-limits-server-timeout"],"test":"WCAG2:time-limits-server-timeout","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#re-authenticating","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/re-authenticating.html","handle":"Re-authenticating","level":"AAA","wcagType":"2.0"},"2.2.6":{"num":"2.2.6","url":"https://www.w3.org/TR/WCAG22/#timeouts","scId":"WCAG2:timeouts","scAltId":[],"test":"WCAG2:WCAG2:timeouts","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#timeouts","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/timeouts.html","handle":"Timeouts","level":"AAA","wcagType":"2.1"},"2.3.1":{"num":"2.3.1","url":"https://www.w3.org/TR/WCAG22/#three-flashes-or-below-threshold","scId":"WCAG2:three-flashes-or-below-threshold","scAltId":["seizure-does-not-violate"],"test":"WCAG2:seizure-does-not-violate","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#three-flashes-or-below-threshold","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/three-flashes-or-below-threshold.html","handle":"Three Flashes or Below Threshold","level":"A","wcagType":"2.0"},"2.3.2":{"num":"2.3.2","url":"https://www.w3.org/TR/WCAG22/#three-flashes","scId":"WCAG2:three-flashes","scAltId":["seizure-three-times"],"test":"WCAG2:seizure-three-times","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#three-flashes","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/three-flashes.html","handle":"Three Flashes","level":"AAA","wcagType":"2.0"},"2.3.3":{"num":"2.3.3","url":"https://www.w3.org/TR/WCAG22/#animation-from-interactions","scId":"WCAG2:animation-from-interactions","scAltId":[],"test":"WCAG2:WCAG2:animation-from-interactions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#animation-from-interactions","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/animation-from-interactions.html","handle":"Animation from Interactions","level":"AAA","wcagType":"2.1"},"2.4.1":{"num":"2.4.1","url":"https://www.w3.org/TR/WCAG22/#bypass-blocks","scId":"WCAG2:bypass-blocks","scAltId":["navigation-mechanisms-skip"],"test":"WCAG2:navigation-mechanisms-skip","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#bypass-blocks","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/bypass-blocks.html","handle":"Bypass Blocks","level":"A","wcagType":"2.0"},"2.4.2":{"num":"2.4.2","url":"https://www.w3.org/TR/WCAG22/#page-titled","scId":"WCAG2:page-titled","scAltId":["navigation-mechanisms-title"],"test":"WCAG2:navigation-mechanisms-title","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#page-titled","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/page-titled.html","handle":"Page Titled","level":"A","wcagType":"2.0"},"2.4.3":{"num":"2.4.3","url":"https://www.w3.org/TR/WCAG22/#focus-order","scId":"WCAG2:focus-order","scAltId":["navigation-mechanisms-focus-order"],"test":"WCAG2:navigation-mechanisms-focus-order","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-order","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-order.html","handle":"Focus Order","level":"A","wcagType":"2.0"},"2.4.4":{"num":"2.4.4","url":"https://www.w3.org/TR/WCAG22/#link-purpose-in-context","scId":"WCAG2:link-purpose-in-context","scAltId":["navigation-mechanisms-refs"],"test":"WCAG2:navigation-mechanisms-refs","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#link-purpose-in-context","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/link-purpose-in-context.html","handle":"Link Purpose (In Context)","level":"A","wcagType":"2.0"},"2.4.5":{"num":"2.4.5","url":"https://www.w3.org/TR/WCAG22/#multiple-ways","scId":"WCAG2:multiple-ways","scAltId":["navigation-mechanisms-mult-loc"],"test":"WCAG2:navigation-mechanisms-mult-loc","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#multiple-ways","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/multiple-ways.html","handle":"Multiple Ways","level":"AA","wcagType":"2.0"},"2.4.6":{"num":"2.4.6","url":"https://www.w3.org/TR/WCAG22/#headings-and-labels","scId":"WCAG2:headings-and-labels","scAltId":["navigation-mechanisms-descriptive"],"test":"WCAG2:navigation-mechanisms-descriptive","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#headings-and-labels","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/headings-and-labels.html","handle":"Headings and Labels","level":"AA","wcagType":"2.0"},"2.4.7":{"num":"2.4.7","url":"https://www.w3.org/TR/WCAG22/#focus-visible","scId":"WCAG2:focus-visible","scAltId":["navigation-mechanisms-focus-visible"],"test":"WCAG2:navigation-mechanisms-focus-visible","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-visible","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-visible.html","handle":"Focus Visible","level":"AA","wcagType":"2.0"},"2.4.8":{"num":"2.4.8","url":"https://www.w3.org/TR/WCAG22/#location","scId":"WCAG2:location","scAltId":["navigation-mechanisms-location"],"test":"WCAG2:navigation-mechanisms-location","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#location","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/location.html","handle":"Location","level":"AAA","wcagType":"2.0"},"2.4.9":{"num":"2.4.9","url":"https://www.w3.org/TR/WCAG22/#link-purpose-link-only","scId":"WCAG2:link-purpose-link-only","scAltId":["navigation-mechanisms-link"],"test":"WCAG2:navigation-mechanisms-link","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#link-purpose-link-only","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/link-purpose-link-only.html","handle":"Link Purpose (Link Only)","level":"AAA","wcagType":"2.0"},"2.4.10":{"num":"2.4.10","url":"https://www.w3.org/TR/WCAG22/#section-headings","scId":"WCAG2:section-headings","scAltId":["navigation-mechanisms-headings"],"test":"WCAG2:navigation-mechanisms-headings","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#section-headings","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/section-headings.html","handle":"Section Headings","level":"AAA","wcagType":"2.0"},"2.4.11":{"num":"2.4.11","url":"https://www.w3.org/TR/WCAG22/#focus-not-obscured-minimum","scId":"WCAG2:focus-not-obscured-minimum","scAltId":["focus-not-obscured-minimum-alt"],"test":"WCAG2:focus-not-obscured-minimum-test","howToMeetUrl":"https://www.w3.org/TR/WCAG22/#focus-not-obscured-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-not-obscured-minimum.html","handle":"Focus Not Obscured (Minimum)","level":"AA","wcagType":"2.2"},"2.4.12":{"num":"2.4.12","url":"https://www.w3.org/TR/WCAG22/#focus-not-obscured-enhanced","scId":"WCAG2:focus-not-obscured-enhanced","scAltId":[],"test":"WCAG2:focus-not-obscured-enhanced-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-not-obscured-enhanced","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-not-obscured-enhanced.html","handle":"Focus Not Obscured (Enhanced)","level":"AAA","wcagType":"2.2"},"2.4.13":{"num":"2.4.13","url":"https://www.w3.org/TR/WCAG22/#focus-appearance","scId":"WCAG2:focus-appearance","scAltId":[],"test":"WCAG2:focus-appearance","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-appearance","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-appearance.html","handle":"Focus Appearance","level":"AAA","wcagType":"2.2"},"2.5.1":{"num":"2.5.1","url":"https://www.w3.org/TR/WCAG22/#pointer-gestures","scId":"WCAG2:pointer-gestures","scAltId":[],"test":"WCAG2:pointer-gestures-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pointer-gestures","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pointer-gestures.html","handle":"Pointer Gestures","level":"A","wcagType":"2.1"},"2.5.2":{"num":"2.5.2","url":"https://www.w3.org/TR/WCAG22/#pointer-cancellation","scId":"WCAG2:pointer-cancellation","scAltId":[],"test":"WCAG2:WCAG2:pointer-cancellation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pointer-cancellation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pointer-cancellation.html","handle":"Pointer Cancellation","level":"A","wcagType":"2.1"},"2.5.3":{"num":"2.5.3","url":"https://www.w3.org/TR/WCAG22/#label-in-name","scId":"WCAG2:label-in-name","scAltId":[],"test":"WCAG2:WCAG2:label-in-name","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#label-in-name","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/label-in-name.html","handle":"Label in Name","level":"A","wcagType":"2.1"},"2.5.4":{"num":"2.5.4","url":"https://www.w3.org/TR/WCAG22/#motion-actuation","scId":"WCAG2:motion-actuation","scAltId":[],"test":"WCAG2:WCAG2:motion-actuation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#motion-actuation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/motion-actuation.html","handle":"Motion Actuation","level":"A","wcagType":"2.1"},"2.5.5":{"num":"2.5.5","url":"https://www.w3.org/TR/WCAG22/#target-size","scId":"WCAG2:target-size","scAltId":[],"test":"WCAG2:WCAG2:target-size","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#target-size","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/target-size.html","handle":"Target Size","level":"AAA","wcagType":"2.1"},"2.5.6":{"num":"2.5.6","url":"https://www.w3.org/TR/WCAG22/#concurrent-input-mechanisms","scId":"WCAG2:concurrent-input-mechanisms","scAltId":[],"test":"WCAG2:WCAG2:concurrent-input-mechanisms","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#concurrent-input-mechanisms","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/concurrent-input-mechanisms.html","handle":"Concurrent Input Mechanisms","level":"AAA","wcagType":"2.1"},"2.5.7":{"num":"2.5.7","url":"https://www.w3.org/TR/WCAG22/#dragging-movements","scId":"WCAG2:dragging-movement","scAltId":["dragging-movement-alt"],"test":"WCAG2:dragging-movement-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/Understanding/dragging-movements.html","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/dragging-movements.html","handle":"Dragging Movement","level":"AA","wcagType":"2.2"},"2.5.8":{"num":"2.5.8","url":"https://www.w3.org/TR/WCAG22/#target-size-minimum","scId":"WCAG2:minimum-target-size","scAltId":["minimum-target-size-alt"],"test":"WCAG2:minimum-target-size-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#target-size-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/target-size-minimum.html","handle":"Minimum Target Size","level":"AA","wcagType":"2.2"},"3.1.1":{"num":"3.1.1","url":"https://www.w3.org/TR/WCAG22/#language-of-page","scId":"WCAG2:language-of-page","scAltId":["meaning-doc-lang-id"],"test":"WCAG2:meaning-doc-lang-id","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#language-of-page","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/language-of-page.html","handle":"Language of Page","level":"A","wcagType":"2.0"},"3.1.2":{"num":"3.1.2","url":"https://www.w3.org/TR/WCAG22/#language-of-parts","scId":"WCAG2:language-of-parts","scAltId":["meaning-other-lang-id"],"test":"WCAG2:meaning-other-lang-id","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#language-of-parts","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/language-of-parts.html","handle":"Language of Parts","level":"AA","wcagType":"2.0"},"3.1.3":{"num":"3.1.3","url":"https://www.w3.org/TR/WCAG22/#unusual-words","scId":"WCAG2:unusual-words","scAltId":["meaning-idioms"],"test":"WCAG2:meaning-idioms","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#unusual-words","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/unusual-words.html","handle":"Unusual Words","level":"AAA","wcagType":"2.0"},"3.1.4":{"num":"3.1.4","url":"https://www.w3.org/TR/WCAG22/#abbreviations","scId":"WCAG2:abbreviations","scAltId":["meaning-located"],"test":"WCAG2:meaning-located","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#abbreviations","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/abbreviations.html","handle":"Abbreviations","level":"AAA","wcagType":"2.0"},"3.1.5":{"num":"3.1.5","url":"https://www.w3.org/TR/WCAG22/#reading-level","scId":"WCAG2:reading-level","scAltId":["meaning-supplements"],"test":"WCAG2:meaning-supplements","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#reading-level","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/reading-level.html","handle":"Reading Level","level":"AAA","wcagType":"2.0"},"3.1.6":{"num":"3.1.6","url":"https://www.w3.org/TR/WCAG22/#pronunciation","scId":"WCAG2:pronunciation","scAltId":["meaning-pronunciation"],"test":"WCAG2:meaning-pronunciation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pronunciation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pronunciation.html","handle":"Pronunciation","level":"AAA","wcagType":"2.0"},"3.2.1":{"num":"3.2.1","url":"https://www.w3.org/TR/WCAG22/#on-focus","scId":"WCAG2:on-focus","scAltId":["consistent-behavior-receive-focus"],"test":"WCAG2:consistent-behavior-receive-focus","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#on-focus","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/on-focus.html","handle":"On Focus","level":"A","wcagType":"2.0"},"3.2.2":{"num":"3.2.2","url":"https://www.w3.org/TR/WCAG22/#on-input","scId":"WCAG2:on-input","scAltId":["consistent-behavior-unpredictable-change"],"test":"WCAG2:consistent-behavior-unpredictable-change","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#on-input","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/on-input.html","handle":"On Input","level":"A","wcagType":"2.0"},"3.2.3":{"num":"3.2.3","url":"https://www.w3.org/TR/WCAG22/#consistent-navigation","scId":"WCAG2:consistent-navigation","scAltId":["consistent-behavior-consistent-locations"],"test":"WCAG2:consistent-behavior-consistent-locations","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#consistent-navigation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/consistent-navigation.html","handle":"Consistent Navigation","level":"AA","wcagType":"2.0"},"3.2.4":{"num":"3.2.4","url":"https://www.w3.org/TR/WCAG22/#consistent-identification","scId":"WCAG2:consistent-identification","scAltId":["consistent-behavior-consistent-functionality"],"test":"WCAG2:consistent-behavior-consistent-functionality","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#consistent-identification","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/consistent-identification.html","handle":"Consistent Identification","level":"AA","wcagType":"2.0"},"3.2.5":{"num":"3.2.5","url":"https://www.w3.org/TR/WCAG22/#change-on-request","scId":"WCAG2:change-on-request","scAltId":["consistent-behavior-no-extreme-changes-context"],"test":"WCAG2:consistent-behavior-no-extreme-changes-context","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#change-on-request","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/change-on-request.html","handle":"Change on Request","level":"AAA","wcagType":"2.0"},"3.2.6":{"num":"3.2.6","url":"https://www.w3.org/TR/WCAG22/#consistent-help","scId":"WCAG2:consistent-help","scAltId":["consistent-help-alt"],"test":"WCAG2:consistent-help-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#consistent-help","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/consistent-help.html","handle":"Consistent Help","level":"AA","wcagType":"2.2"},"3.3.1":{"num":"3.3.1","url":"https://www.w3.org/TR/WCAG22/#error-identification","scId":"WCAG2:error-identification","scAltId":["minimize-error-identified"],"test":"WCAG2:minimize-error-identified","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-identification","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-identification.html","handle":"Error Identification","level":"A","wcagType":"2.0"},"3.3.2":{"num":"3.3.2","url":"https://www.w3.org/TR/WCAG22/#labels-or-instructions","scId":"WCAG2:labels-or-instructions","scAltId":["minimize-error-cues"],"test":"WCAG2:minimize-error-cues","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#labels-or-instructions","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/labels-or-instructions.html","handle":"Labels or Instructions","level":"A","wcagType":"2.0"},"3.3.3":{"num":"3.3.3","url":"https://www.w3.org/TR/WCAG22/#error-suggestion","scId":"WCAG2:error-suggestion","scAltId":["minimize-error-suggestions"],"test":"WCAG2:minimize-error-suggestions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-suggestion","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-suggestion.html","handle":"Error Suggestion","level":"AA","wcagType":"2.0"},"3.3.4":{"num":"3.3.4","url":"https://www.w3.org/TR/WCAG22/#error-prevention-legal-financial-data","scId":"WCAG2:error-prevention-legal-financial-data","scAltId":["minimize-error-reversible"],"test":"WCAG2:minimize-error-reversible","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-prevention-legal-financial-data","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-prevention-legal-financial-data.html","handle":"Error Prevention (Legal, Financial, Data)","level":"AA","wcagType":"2.0"},"3.3.5":{"num":"3.3.5","url":"https://www.w3.org/TR/WCAG22/#help","scId":"WCAG2:help","scAltId":["minimize-error-context-help"],"test":"WCAG2:minimize-error-context-help","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#help","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/help.html","handle":"Help","level":"AAA","wcagType":"2.0"},"3.3.6":{"num":"3.3.6","url":"https://www.w3.org/TR/WCAG22/#error-prevention-all","scId":"WCAG2:error-prevention-all","scAltId":["minimize-error-reversible-all"],"test":"WCAG2:minimize-error-reversible-all","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-prevention-all","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-prevention-all.html","handle":"Error Prevention (All)","level":"AAA","wcagType":"2.0"},"3.3.7":{"num":"3.3.7","url":"https://www.w3.org/TR/WCAG22/#redundant-entry","scId":"WCAG2:redundant-entry","scAltId":["redundant-entry-alt"],"test":"WCAG2:redundant-entry-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#redundant-entry","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/redundant-entry.html","handle":"Redundant Entry","level":"AA","wcagType":"2.2"},"3.3.8":{"num":"3.3.8","url":"https://www.w3.org/TR/WCAG22/#accessible-authentication-minimum","scId":"WCAG2:accessible-authentication-minimum","scAltId":["accessible-authentication-minimum-alt"],"test":"WCAG2:accessible-authentication-minimum-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#accessible-authentication-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/accessible-authentication-minimum.html","handle":"Accessible Authentication (Minimum)","level":"AA","wcagType":"2.2"},"3.3.9":{"num":"3.3.9","url":"https://www.w3.org/TR/WCAG22/#accessible-authentication-enhanced","scId":"WCAG2:accessible-authentication-enhanced","scAltId":[],"test":"WCAG2:accessible-authentication-enhanced","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#accessible-authentication-enhanced","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/accessible-authentication-enhanced.html","handle":"Accessible Authentication (Enhanced)","level":"AAA","wcagType":"2.2"},"4.1.1":{"num":"4.1.1","url":"https://www.w3.org/TR/WCAG22/#parsing","scId":"WCAG2:parsing","scAltId":["ensure-compat-parses"],"test":"WCAG2:ensure-compat-parses","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/?versions=2.1#parsing","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/parsing.html","handle":"Parsing","level":"A","wcagType":"2.0"},"4.1.2":{"num":"4.1.2","url":"https://www.w3.org/TR/WCAG22/#name-role-value","scId":"WCAG2:name-role-value","scAltId":["ensure-compat-rsv"],"test":"WCAG2:ensure-compat-rsv","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#name-role-value","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/name-role-value.html","handle":"Name, Role, Value","level":"A","wcagType":"2.0"},"4.1.3":{"num":"4.1.3","url":"https://www.w3.org/TR/WCAG22/#status-messages","scId":"WCAG2:status-messages","scAltId":[],"test":"WCAG2:status-messages","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#status-messages","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/status-messages.html","handle":"Status Messages","level":"AA","wcagType":"2.1"},"HTML":{"num":"HTML","url":"https://html.spec.whatwg.org/multipage/","scId":"","scAltId":[],"test":"","howToMeetUrl":"https://html.spec.whatwg.org/multipage/","understandingUrl":"https://html.spec.whatwg.org/multipage/","handle":"specification","level":"NA","wcagType":"NA"},"ARIA":{"num":"ARIA","url":"https://www.w3.org/TR/wai-aria-1.2/","scId":"","scAltId":[],"test":"","howToMeetUrl":"https://www.w3.org/TR/wai-aria-1.2/","understandingUrl":"https://www.w3.org/TR/wai-aria-1.2/","handle":"specification","level":"NA","wcagType":"NA"}}'); + +/***/ } + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ const __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ const cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ const module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ if (!(moduleId in __webpack_modules__)) { +/******/ delete __webpack_module_cache__[moduleId]; +/******/ const e = new Error("Cannot find module '" + moduleId + "'"); +/******/ e.code = 'MODULE_NOT_FOUND'; +/******/ throw e; +/******/ } +/******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +let __webpack_exports__ = {}; +// This entry needs to be wrapped in an IIFE because it needs to be isolated against other modules in the chunk. +(() => { +let exports = __webpack_exports__; +/*!**********************!*\ + !*** ./src/index.ts ***! + \**********************/ + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.checkDemo = exports.SRViewer = exports.SRCursor = exports.SRController = exports.DOMWalker = exports.Config = exports.ARIAMapper = exports.Checker = exports.Context = void 0; +var Context_1 = __webpack_require__(/*! ./v2/common/Context */ "./src/v2/common/Context.ts"); +Object.defineProperty(exports, "Context", ({ enumerable: true, get: function () { return Context_1.Context; } })); +// import { Simulator } from "./v2/simulator" +var Checker_1 = __webpack_require__(/*! ./v4/checker/Checker */ "./src/v4/checker/Checker.ts"); +Object.defineProperty(exports, "Checker", ({ enumerable: true, get: function () { return Checker_1.Checker; } })); +var ARIAMapper_1 = __webpack_require__(/*! ./v2/aria/ARIAMapper */ "./src/v2/aria/ARIAMapper.ts"); +Object.defineProperty(exports, "ARIAMapper", ({ enumerable: true, get: function () { return ARIAMapper_1.ARIAMapper; } })); +var Config_1 = __webpack_require__(/*! ./v2/config/Config */ "./src/v2/config/Config.ts"); +Object.defineProperty(exports, "Config", ({ enumerable: true, get: function () { return Config_1.Config; } })); +var DOMWalker_1 = __webpack_require__(/*! ./v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +Object.defineProperty(exports, "DOMWalker", ({ enumerable: true, get: function () { return DOMWalker_1.DOMWalker; } })); +var SRController_1 = __webpack_require__(/*! ./v4/simulator/SRController */ "./src/v4/simulator/SRController.ts"); +Object.defineProperty(exports, "SRController", ({ enumerable: true, get: function () { return SRController_1.SRController; } })); +var SRCursor_1 = __webpack_require__(/*! ./v4/simulator/SRCursor */ "./src/v4/simulator/SRCursor.ts"); +Object.defineProperty(exports, "SRCursor", ({ enumerable: true, get: function () { return SRCursor_1.SRCursor; } })); +var SRViewer_1 = __webpack_require__(/*! ./v4/simulator/SRViewer */ "./src/v4/simulator/SRViewer.ts"); +Object.defineProperty(exports, "SRViewer", ({ enumerable: true, get: function () { return SRViewer_1.SRViewer; } })); +function checkDemo(timeout) { + if (!timeout) + timeout = 0; + var checker = new Checker_1.Checker(); + setTimeout(function () { + checker.check(document.documentElement, ["IBM_Accessibility", "IBM_Design"]) + .then(function (report) { + console.log(report); + var vals = { + "FAIL": 0, + "POTENTIAL": 1, + "MANUAL": 2, + "PASS": 3 + }; + for (var idx = 0; idx < report.results.length; ++idx) { + if (report.results[idx].value[1] === "PASS") { + report.results.splice(idx--, 1); + } + } + report.results.sort(function (a, b) { + if (a.category != b.category) { + return a.category.localeCompare(b.category); + } + if (a.path["aria"] === b.path["aria"]) { + return vals[a.value[1]] - vals[b.value[1]]; + } + return a.path["aria"].localeCompare(b.path["aria"]); + }); + var lastPath = null; + var category = null; + for (var _i = 0, _a = report.results; _i < _a.length; _i++) { + var result = _a[_i]; + if (category !== result.category) { + if (category !== null) { + console.groupEnd(); + console.groupEnd(); + lastPath = null; + } + category = result.category; + console.group(result.category); + } + if (result.path["aria"] != lastPath) { + if (lastPath !== null) { + console.groupEnd(); + } + lastPath = result.path["aria"]; + if (lastPath === "") { + console.group("page"); + } + else { + console.group(lastPath); + } + } + console.log(result.value, result.message); + } + console.groupEnd(); + console.groupEnd(); + }); + }, timeout); +} +exports.checkDemo = checkDemo; + +})(); + +ace = __webpack_exports__; +/******/ })() +; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNlLWRlYnVnLmpzIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOzs7Ozs7Ozs7Ozs7OzsrRUFjK0U7OztBQWtCL0U7SUFBQTtJQWl5RkEsQ0FBQztJQWh5RlUsK0JBQWUsR0FBdEIsVUFBdUIsSUFBWTtRQUMvQixPQUFPLENBQUMsSUFBSSxJQUFJLGVBQWUsQ0FBQyxjQUFjLENBQUM7ZUFDeEMsZUFBZSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRO2VBQzdDLGVBQWUsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUM5RSxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksZ0NBQWdCLEdBQWMsQ0FBQyxhQUFhLEVBQUUsV0FBVyxFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUUsa0JBQWtCO1FBQ2pILGNBQWMsRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLG1CQUFtQjtRQUNqRSxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUUsc0JBQXNCO1FBQ2xHLHlGQUF5Rjs7UUFDdkYsZUFBZSxFQUFFLG1CQUFtQixFQUFFLGVBQWUsRUFBRSxjQUFjO0tBQzFFLENBQUM7SUFFRiwwREFBMEQ7SUFDbkQsbUNBQW1CLEdBQWMsQ0FBQyxXQUFXLEVBQUUsZUFBZSxFQUFFLGtCQUFrQixFQUFFLGlCQUFpQixFQUFFLGFBQWEsRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO0lBRXRKLG1CQUFtQjtJQUNaLHFDQUFxQixHQUFjO1FBQ3RDLFdBQVcsRUFBRSxpQkFBaUIsRUFBRSxhQUFhO0tBQ2hELENBQUM7SUFFRiw2REFBNkQ7SUFDdEQsMENBQTBCLEdBQWM7UUFDM0MsY0FBYyxFQUFFLGlCQUFpQjtLQUNwQyxDQUFDO0lBRUY7Ozs7Ozs7Ozs7T0FVRztJQUNJLGlDQUFpQixHQU1wQjtRQUNBLHVCQUF1QixFQUFFO1lBQ3JCLElBQUksRUFBRSx3Q0FBd0M7WUFDOUMsb0JBQW9CLEVBQUUsSUFBSTtTQUM3QjtRQUNELGFBQWEsRUFBRTtZQUNYLElBQUksRUFBRSwwQ0FBMEM7U0FDbkQ7UUFDRCxtQkFBbUIsRUFBRTtZQUNqQixJQUFJLEVBQUUsMENBQTBDO1lBQ2hELE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQyxxQ0FBcUM7U0FDaEc7UUFDRCxXQUFXLEVBQUU7WUFDVCxJQUFJLEVBQUUsMENBQTBDO1NBQ25EO1FBQ0QsY0FBYyxFQUFFO1lBQ1osSUFBSSxFQUFFLDBDQUEwQztZQUNoRCxNQUFNLEVBQUUsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxXQUFXLENBQUM7U0FDbEQ7UUFDRCxlQUFlLEVBQUU7WUFDYixJQUFJLEVBQUUsc0NBQXNDO1NBQy9DO1FBQ0QsZUFBZSxFQUFFO1lBQ2IsSUFBSSxFQUFFLHNDQUFzQztTQUMvQztRQUNELGNBQWMsRUFBRTtZQUNaLElBQUksRUFBRSxzQ0FBc0M7U0FDL0M7UUFDRCxlQUFlLEVBQUU7WUFDYixJQUFJLEVBQUUseUNBQXlDO1lBQy9DLG9CQUFvQixFQUFFLElBQUk7U0FDN0I7UUFDRCxjQUFjLEVBQUU7WUFDWixJQUFJLEVBQUUsMENBQTBDO1lBQ2hELE1BQU0sRUFBRSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQywrQkFBK0I7U0FDckg7UUFDRCxrQkFBa0IsRUFBRTtZQUNoQixJQUFJLEVBQUUseUNBQXlDO1lBQy9DLG9CQUFvQixFQUFFLElBQUk7U0FDN0I7UUFDRCxjQUFjLEVBQUU7WUFDWixJQUFJLEVBQUUseUNBQXlDO1NBQ2xEO1FBQ0QsZUFBZSxFQUFFO1lBQ2IsSUFBSSxFQUFFLDBDQUEwQztTQUNuRDtRQUNELGlCQUFpQixFQUFFO1lBQ2YsSUFBSSxFQUFFLDJDQUEyQztZQUNqRCxNQUFNLEVBQUUsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQztTQUMvRDtRQUNELG1CQUFtQixFQUFFO1lBQ2pCLElBQUksRUFBRSx3Q0FBd0M7WUFDOUMsb0JBQW9CLEVBQUUsSUFBSTtTQUM3QjtRQUNELGVBQWUsRUFBRTtZQUNiLElBQUksRUFBRSwwQ0FBMEM7WUFDaEQsTUFBTSxFQUFFLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxXQUFXLENBQUM7U0FDekM7UUFDRCxhQUFhLEVBQUU7WUFDWCxJQUFJLEVBQUUseUNBQXlDO1lBQy9DLG9CQUFvQixFQUFFLEtBQUs7U0FDOUI7UUFDRCxjQUFjLEVBQUU7WUFDWixJQUFJLEVBQUUsMENBQTBDO1lBQ2hELE1BQU0sRUFBRSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsV0FBVyxDQUFDO1NBQ3pDO1FBQ0QsZUFBZSxFQUFFO1lBQ2IsSUFBSSxFQUFFLDBDQUEwQztZQUNoRCxNQUFNLEVBQUUsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUM7U0FDekU7UUFDRCxhQUFhLEVBQUU7WUFDWCxJQUFJLEVBQUUsMENBQTBDO1lBQ2hELE1BQU0sRUFBRSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsV0FBVyxDQUFDO1NBQ3pDO1FBQ0QsY0FBYyxFQUFFO1lBQ1osSUFBSSxFQUFFLDBDQUEwQztZQUNoRCxNQUFNLEVBQUUsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsV0FBVyxDQUFDLENBQUMsK0JBQStCO1NBQ2hHO1FBQ0QsbUJBQW1CLEVBQUU7WUFDakIsSUFBSSxFQUFFLHlDQUF5QztTQUNsRDtRQUNELFlBQVksRUFBRTtZQUNWLElBQUksRUFBRSx5Q0FBeUM7U0FDbEQ7UUFDRCxpQkFBaUIsRUFBRTtZQUNmLElBQUksRUFBRSx5Q0FBeUM7WUFDL0Msb0JBQW9CLEVBQUUsSUFBSTtTQUM3QjtRQUNELFlBQVksRUFBRTtZQUNWLElBQUksRUFBRSxzQ0FBc0M7U0FDL0M7UUFDRCxXQUFXLEVBQUU7WUFDVCxJQUFJLEVBQUUsMENBQTBDO1lBQ2hELE1BQU0sRUFBRSxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsV0FBVyxDQUFDO1NBQ3pDO1FBQ0QsWUFBWSxFQUFFO1lBQ1YsSUFBSSxFQUFFLDBDQUEwQztTQUNuRDtRQUNELGdCQUFnQixFQUFFO1lBQ2QsSUFBSSxFQUFFLDBDQUEwQztTQUNuRDtRQUNELHNCQUFzQixFQUFFO1lBQ3BCLElBQUksRUFBRSwwQ0FBMEM7U0FDbkQ7UUFDRCxrQkFBa0IsRUFBRTtZQUNoQixJQUFJLEVBQUUsMENBQTBDO1lBQ2hELE1BQU0sRUFBRSxDQUFDLFlBQVksRUFBRSxVQUFVLEVBQUUsV0FBVyxDQUFDO1NBQ2xEO1FBQ0QsV0FBVyxFQUFFO1lBQ1QsSUFBSSxFQUFFLHlDQUF5QztZQUMvQyxvQkFBb0IsRUFBRSxJQUFJO1NBQzdCO1FBQ0Qsa0JBQWtCLEVBQUU7WUFDaEIsSUFBSSxFQUFFLHlDQUF5QztTQUNsRDtRQUNELGVBQWUsRUFBRTtZQUNiLElBQUksRUFBRSxzQ0FBc0M7U0FDL0M7UUFDRCxjQUFjLEVBQUU7WUFDWixJQUFJLEVBQUUsMENBQTBDO1lBQ2hELE1BQU0sRUFBRSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFdBQVcsQ0FBQztTQUNsRDtRQUNELGVBQWUsRUFBRTtZQUNiLElBQUksRUFBRSwwQ0FBMEM7U0FDbkQ7UUFDRCxlQUFlLEVBQUU7WUFDYixJQUFJLEVBQUUsMkNBQTJDO1lBQ2pELE1BQU0sRUFBRSxDQUFDLFdBQVcsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQztTQUNuRDtRQUNELGVBQWUsRUFBRTtZQUNiLElBQUksRUFBRSwwQ0FBMEM7U0FDbkQ7UUFDRCxzQkFBc0IsRUFBRTtZQUNwQixJQUFJLEVBQUUseUNBQXlDO1NBQ2xEO1FBQ0QsZUFBZSxFQUFFO1lBQ2IsSUFBSSxFQUFFLHNDQUFzQztTQUMvQztRQUNELGVBQWUsRUFBRTtZQUNiLElBQUksRUFBRSxzQ0FBc0M7U0FDL0M7UUFDRCxjQUFjLEVBQUU7WUFDWixJQUFJLEVBQUUsc0NBQXNDO1NBQy9DO1FBQ0QsZUFBZSxFQUFFO1lBQ2IsSUFBSSxFQUFFLDBDQUEwQztZQUNoRCxNQUFNLEVBQUUsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLFdBQVcsQ0FBQztTQUN6QztRQUNELGNBQWMsRUFBRTtZQUNaLElBQUksRUFBRSxzQ0FBc0M7U0FDL0M7UUFDRCxXQUFXLEVBQUU7WUFDVCxJQUFJLEVBQUUsMENBQTBDO1lBQ2hELE1BQU0sRUFBRSxDQUFDLFdBQVcsRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQztTQUN2RDtRQUNELGVBQWUsRUFBRTtZQUNiLElBQUksRUFBRSwwQ0FBMEM7U0FDbkQ7UUFDRCxlQUFlLEVBQUU7WUFDYixJQUFJLEVBQUUsMENBQTBDO1NBQ25EO1FBQ0QsZUFBZSxFQUFFO1lBQ2IsSUFBSSxFQUFFLDBDQUEwQztTQUNuRDtRQUNELGdCQUFnQixFQUFFO1lBQ2QsSUFBSSxFQUFFLHlDQUF5QztTQUNsRDtLQUNKO0lBRUQ7Ozs7Ozs7Ozs7Ozs7T0FhRztJQUNJLDhCQUFjLEdBZWpCO1FBQ0EsT0FBTyxFQUFFO1lBQ0wsU0FBUyxFQUFFLElBQUk7WUFDZixLQUFLLEVBQUUsSUFBSTtZQUNYLFFBQVEsRUFBRSxJQUFJO1lBQ2QsV0FBVyxFQUFFLElBQUk7WUFDakIsU0FBUyxFQUFFLElBQUk7WUFDZixRQUFRLEVBQUUsWUFBWTtZQUN0QixZQUFZLEVBQUUsS0FBSztZQUNuQixRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUM7WUFDcEIsZUFBZSxFQUFFLENBQUMsZUFBZSxFQUFFLG1CQUFtQixFQUFFLGVBQWUsRUFBRSxjQUFjLENBQUM7U0FDM0Y7UUFFRCxhQUFhLEVBQUU7WUFDWCxTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxDQUFDLFlBQVksQ0FBQztZQUNyQixRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFFBQVE7WUFDbEIsWUFBWSxFQUFFLEtBQUs7WUFDbkIsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDO1lBQ3BCLGVBQWUsRUFBRSxDQUFDLGVBQWUsRUFBRSxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsY0FBYyxDQUFDO1NBQzNGO1FBRUQsYUFBYSxFQUFFO1lBQ1gsU0FBUyxFQUFFLElBQUk7WUFDZixLQUFLLEVBQUUsQ0FBQyx1QkFBdUIsRUFBRSxlQUFlLENBQUM7WUFDakQsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLFFBQVEsRUFBRSxXQUFXO1lBQ3JCLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQztTQUN2QjtRQUVELFNBQVMsRUFBRTtZQUNQLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLENBQUMsZUFBZSxFQUFFLGNBQWMsQ0FBQztZQUN4QyxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFdBQVc7WUFDckIsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDO1lBQ3BCLGVBQWUsRUFBRSxDQUFDLGVBQWUsRUFBRSxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsY0FBYyxDQUFDO1NBQzNGO1FBRUQsUUFBUSxFQUFFO1lBQ04sU0FBUyxFQUFFLElBQUk7WUFDZixLQUFLLEVBQUUsSUFBSTtZQUNYLFFBQVEsRUFBRSxJQUFJO1lBQ2QsV0FBVyxFQUFFLElBQUk7WUFDakIsU0FBUyxFQUFFLElBQUk7WUFDZixRQUFRLEVBQUUsVUFBVTtZQUNwQixRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUM7WUFDcEIsZUFBZSxFQUFFLENBQUMsZUFBZSxFQUFFLG1CQUFtQixFQUFFLGVBQWUsRUFBRSxjQUFjLENBQUM7U0FDM0Y7UUFFRCxZQUFZLEVBQUU7WUFDVixTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxJQUFJO1lBQ1gsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLFFBQVEsRUFBRSxXQUFXO1lBQ3JCLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQztZQUNwQixlQUFlLEVBQUUsQ0FBQyxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLGNBQWMsQ0FBQztTQUMzRjtRQUVELFFBQVEsRUFBRTtZQUNOLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLENBQUMsZUFBZSxFQUFFLGNBQWMsQ0FBQztZQUN4QyxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxnQ0FBZ0M7WUFDM0MsUUFBUSxFQUFFLFFBQVE7WUFDbEIsWUFBWSxFQUFFLElBQUk7WUFDbEIsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQztZQUNoQyxzQkFBc0IsRUFBRSxJQUFJO1lBQzVCLGVBQWUsRUFBRSxDQUFDLG1CQUFtQixFQUFFLGNBQWMsQ0FBQztTQUN6RDtRQUVELFNBQVMsRUFBRTtZQUNQLFNBQVMsRUFBRSxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLFVBQVUsQ0FBQztZQUNsRCxLQUFLLEVBQUUsSUFBSTtZQUNYLFFBQVEsRUFBRSxJQUFJO1lBQ2QsV0FBVyxFQUFFLElBQUk7WUFDakIsU0FBUyxFQUFFLElBQUk7WUFDZixRQUFRLEVBQUUsV0FBVztZQUNyQixRQUFRLEVBQUUsQ0FBQyxZQUFZLENBQUM7WUFDeEIsZUFBZSxFQUFFLENBQUMsWUFBWSxFQUFFLGlCQUFpQixDQUFDO1lBQ2xELGVBQWUsRUFBRSxDQUFDLGVBQWUsRUFBRSxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsY0FBYyxDQUFDO1NBQzNGO1FBRUQsTUFBTSxFQUFFO1lBQ0osU0FBUyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ2xCLEtBQUssRUFBRSxDQUFDLGVBQWUsRUFBRSxjQUFjLEVBQUUsZUFBZSxFQUFFLGNBQWMsQ0FBQztZQUN6RSxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFdBQVc7WUFDckIsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQztZQUNoQyxlQUFlLEVBQUUsQ0FBQyxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLGNBQWMsQ0FBQztTQUMzRjtRQUVELFVBQVUsRUFBRTtZQUNSLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLENBQUMsZUFBZSxFQUFFLGVBQWUsRUFBRSxlQUFlLENBQUM7WUFDMUQsUUFBUSxFQUFFLENBQUMsY0FBYyxDQUFDO1lBQzFCLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSx5QkFBeUI7WUFDcEMsUUFBUSxFQUFFLFFBQVE7WUFDbEIsWUFBWSxFQUFFLElBQUk7WUFDbEIsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQztZQUNoQyxzQkFBc0IsRUFBRSxJQUFJO1lBQzVCLGVBQWUsRUFBRSxDQUFDLGVBQWUsQ0FBQztTQUNyQztRQUVELE1BQU0sRUFBRTtZQUNKLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLElBQUk7WUFDWCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFdBQVc7WUFDckIsUUFBUSxFQUFFLENBQUMsWUFBWSxDQUFDO1lBQ3hCLGVBQWUsRUFBRSxDQUFDLFlBQVksRUFBRSxpQkFBaUIsQ0FBQztZQUNsRCxlQUFlLEVBQUUsQ0FBQyxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLGNBQWMsQ0FBQztTQUMzRjtRQUVELGNBQWMsRUFBRTtZQUNaLFNBQVMsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUNsQixLQUFLLEVBQUUsQ0FBQyxlQUFlLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUUsZUFBZSxFQUFFLFdBQVcsQ0FBQztZQUMxSixRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxrQkFBa0I7WUFDN0IsUUFBUSxFQUFFLFdBQVc7WUFDckIsWUFBWSxFQUFFLElBQUk7WUFDbEIsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQztTQUNuQztRQUVELFVBQVUsRUFBRTtZQUNSLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLENBQUMsZUFBZSxFQUFFLHVCQUF1QixFQUFFLG1CQUFtQixFQUFFLGVBQWUsRUFBRSxlQUFlLENBQUM7WUFDeEcsUUFBUSxFQUFFLENBQUMsZUFBZSxDQUFDO1lBQzNCLFdBQVcsRUFBRSxFQUFFO1lBQ2YsU0FBUyxFQUFFLElBQUk7WUFDZixRQUFRLEVBQUUsUUFBUTtZQUNsQixZQUFZLEVBQUUsSUFBSTtZQUNsQixRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUM7U0FDdkI7UUFFRCxlQUFlLEVBQUU7WUFDYixTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxJQUFJO1lBQ1gsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLFFBQVEsRUFBRSxVQUFVO1lBQ3BCLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQztZQUNwQixlQUFlLEVBQUUsQ0FBQyxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLGNBQWMsQ0FBQztTQUMzRjtRQUVELFNBQVMsRUFBRTtZQUNQLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLElBQUk7WUFDWCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFdBQVc7WUFDckIsWUFBWSxFQUFFLEtBQUs7WUFDbkIsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQztZQUNoQyxlQUFlLEVBQUUsQ0FBQyxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLGNBQWMsQ0FBQztTQUMzRjtRQUVELGFBQWEsRUFBRTtZQUNYLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLElBQUk7WUFDWCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFVBQVU7WUFDcEIsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDO1lBQ3BCLGVBQWUsRUFBRSxDQUFDLGVBQWUsRUFBRSxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsY0FBYyxDQUFDO1NBQzNGO1FBRUQsWUFBWSxFQUFFO1lBQ1YsU0FBUyxFQUFFLElBQUk7WUFDZixLQUFLLEVBQUUsSUFBSTtZQUNYLFFBQVEsRUFBRSxJQUFJO1lBQ2QsV0FBVyxFQUFFLElBQUk7WUFDakIsU0FBUyxFQUFFLElBQUk7WUFDZixRQUFRLEVBQUUsV0FBVztZQUNyQixRQUFRLEVBQUUsQ0FBQyxZQUFZLENBQUM7WUFDeEIsZUFBZSxFQUFFLENBQUMsWUFBWSxFQUFFLGlCQUFpQixDQUFDO1lBQ2xELGVBQWUsRUFBRSxDQUFDLGVBQWUsRUFBRSxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsY0FBYyxDQUFDO1NBQzNGO1FBRUQsVUFBVSxFQUFFO1lBQ1IsU0FBUyxFQUFFLElBQUk7WUFDZixLQUFLLEVBQUUsSUFBSTtZQUNYLFFBQVEsRUFBRSxJQUFJO1lBQ2QsV0FBVyxFQUFFLElBQUk7WUFDakIsU0FBUyxFQUFFLElBQUk7WUFDZixRQUFRLEVBQUUsV0FBVztZQUNyQixRQUFRLEVBQUUsQ0FBQyxZQUFZLENBQUM7WUFDeEIsZUFBZSxFQUFFLENBQUMsWUFBWSxFQUFFLGlCQUFpQixDQUFDO1lBQ2xELGVBQWUsRUFBRSxDQUFDLGVBQWUsRUFBRSxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsY0FBYyxDQUFDO1NBQzNGO1FBRUQsUUFBUSxFQUFFO1lBQ04sU0FBUyxFQUFFLElBQUk7WUFDZixLQUFLLEVBQUUsQ0FBQyxZQUFZLENBQUM7WUFDckIsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLFlBQVksRUFBRSxLQUFLO1lBQ25CLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQztZQUNwQixlQUFlLEVBQUUsQ0FBQyxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLGNBQWMsQ0FBQztTQUMzRjtRQUNELFdBQVcsRUFBRTtZQUNULFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLElBQUk7WUFDWCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFdBQVc7WUFDckIsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDO1lBQ3BCLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLGVBQWUsRUFBRSxDQUFDLGVBQWUsRUFBRSxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsY0FBYyxDQUFDO1NBQzNGO1FBQ0QsY0FBYyxFQUFFO1lBQ1osU0FBUyxFQUFFLElBQUk7WUFDZixLQUFLLEVBQUUsSUFBSTtZQUNYLFFBQVEsRUFBRSxJQUFJO1lBQ2QsV0FBVyxFQUFFLElBQUk7WUFDakIsU0FBUyxFQUFFLElBQUk7WUFDZixRQUFRLEVBQUUsVUFBVTtZQUNwQixZQUFZLEVBQUUsS0FBSztZQUNuQixRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUM7U0FDdkI7UUFDRCxxQkFBcUIsRUFBRTtZQUNuQixTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxJQUFJO1lBQ1gsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLFFBQVEsRUFBRSxVQUFVO1lBQ3BCLFlBQVksRUFBRSxLQUFLO1lBQ25CLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQztTQUN2QjtRQUNELGVBQWUsRUFBRTtZQUNiLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLElBQUk7WUFDWCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFVBQVU7WUFDcEIsWUFBWSxFQUFFLEtBQUs7WUFDbkIsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDO1NBQ3ZCO1FBQ0QsY0FBYyxFQUFFO1lBQ1osU0FBUyxFQUFFLElBQUk7WUFDZixLQUFLLEVBQUUsSUFBSTtZQUNYLFFBQVEsRUFBRSxJQUFJO1lBQ2QsV0FBVyxFQUFFLElBQUk7WUFDakIsU0FBUyxFQUFFLElBQUk7WUFDZixRQUFRLEVBQUUsVUFBVTtZQUNwQixZQUFZLEVBQUUsS0FBSztZQUNuQixRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUM7U0FDdkI7UUFDRCxjQUFjLEVBQUU7WUFDWixTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxDQUFDLGVBQWUsRUFBRSxlQUFlLEVBQUUsZUFBZSxDQUFDO1lBQzFELFFBQVEsRUFBRSxJQUFJO1lBQ2QsV0FBVyxFQUFFLElBQUk7WUFDakIsU0FBUyxFQUFFLFVBQVU7WUFDckIsUUFBUSxFQUFFLFFBQVE7WUFDbEIsWUFBWSxFQUFFLElBQUk7WUFDbEIsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQztTQUNuQztRQUNELGlCQUFpQixFQUFFO1lBQ2YsU0FBUyxFQUFFLENBQUMsTUFBTSxDQUFDO1lBQ25CLEtBQUssRUFBRSxDQUFDLFlBQVksRUFBRSxlQUFlLEVBQUUsY0FBYyxDQUFDO1lBQ3RELFFBQVEsRUFBRSxJQUFJO1lBQ2QsV0FBVyxFQUFFLElBQUk7WUFDakIsU0FBUyxFQUFFLElBQUk7WUFDZixRQUFRLEVBQUUsV0FBVztZQUNyQixZQUFZLEVBQUUsSUFBSTtZQUNsQixRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUM7U0FDdkI7UUFDRCxrQkFBa0IsRUFBRTtZQUNoQixTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxJQUFJO1lBQ1gsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLFFBQVEsRUFBRSxVQUFVO1lBQ3BCLFlBQVksRUFBRSxLQUFLO1lBQ25CLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQztTQUN2QjtRQUNELGVBQWUsRUFBRTtZQUNiLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLENBQUMsZUFBZSxFQUFFLGVBQWUsRUFBRSxlQUFlLENBQUM7WUFDMUQsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsVUFBVTtZQUNyQixRQUFRLEVBQUUsUUFBUTtZQUNsQixZQUFZLEVBQUUsSUFBSTtZQUNsQixRQUFRLEVBQUUsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDO1NBQ25DO1FBQ0QsYUFBYSxFQUFFO1lBQ1gsU0FBUyxFQUFFLElBQUk7WUFDZixLQUFLLEVBQUUsSUFBSTtZQUNYLFFBQVEsRUFBRSxJQUFJO1lBQ2QsV0FBVyxFQUFFLElBQUk7WUFDakIsU0FBUyxFQUFFLElBQUk7WUFDZixRQUFRLEVBQUUsVUFBVTtZQUNwQixZQUFZLEVBQUUsS0FBSztZQUNuQixRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUM7U0FDdkI7UUFDRCxjQUFjLEVBQUU7WUFDWixTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxJQUFJO1lBQ1gsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLFFBQVEsRUFBRSxVQUFVO1lBQ3BCLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQztTQUN2QjtRQUNELGdCQUFnQixFQUFFO1lBQ2QsU0FBUyxFQUFFLElBQUk7WUFDZixLQUFLLEVBQUUsSUFBSTtZQUNYLFFBQVEsRUFBRSxJQUFJO1lBQ2QsV0FBVyxFQUFFLElBQUk7WUFDakIsU0FBUyxFQUFFLElBQUk7WUFDZixRQUFRLEVBQUUsVUFBVTtZQUNwQixZQUFZLEVBQUUsS0FBSztZQUNuQixRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUM7U0FDdkI7UUFDRCxXQUFXLEVBQUU7WUFDVCxTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxJQUFJO1lBQ1gsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsS0FBSztZQUNoQixRQUFRLEVBQUUsV0FBVztZQUNyQixZQUFZLEVBQUUsS0FBSztZQUNuQixRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUM7WUFDcEIsc0JBQXNCLEVBQUUsSUFBSTtTQUMvQjtRQUNELFlBQVksRUFBRTtZQUNWLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLElBQUk7WUFDWCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFVBQVU7WUFDcEIsWUFBWSxFQUFFLEtBQUs7WUFDbkIsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDO1NBQ3ZCO1FBQ0QsYUFBYSxFQUFFO1lBQ1gsU0FBUyxFQUFFLElBQUk7WUFDZixLQUFLLEVBQUUsSUFBSTtZQUNYLFFBQVEsRUFBRSxJQUFJO1lBQ2QsV0FBVyxFQUFFLElBQUk7WUFDakIsU0FBUyxFQUFFLElBQUk7WUFDZixRQUFRLEVBQUUsVUFBVTtZQUNwQixZQUFZLEVBQUUsS0FBSztZQUNuQixRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUM7U0FDdkI7UUFDRCxnQkFBZ0IsRUFBRTtZQUNkLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLElBQUk7WUFDWCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFVBQVU7WUFDcEIsWUFBWSxFQUFFLEtBQUs7WUFDbkIsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDO1NBQ3ZCO1FBQ0QsYUFBYSxFQUFFO1lBQ1gsU0FBUyxFQUFFLENBQUMsTUFBTSxDQUFDO1lBQ25CLEtBQUssRUFBRSxDQUFDLFlBQVksRUFBRSxlQUFlLEVBQUUsY0FBYyxDQUFDO1lBQ3RELFFBQVEsRUFBRSxJQUFJO1lBQ2QsV0FBVyxFQUFFLElBQUk7WUFDakIsU0FBUyxFQUFFLElBQUk7WUFDZixRQUFRLEVBQUUsV0FBVztZQUNyQixZQUFZLEVBQUUsS0FBSztZQUNuQixRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUM7U0FDdkI7UUFDRCxjQUFjLEVBQUU7WUFDWixTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxJQUFJO1lBQ1gsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLFFBQVEsRUFBRSxVQUFVO1lBQ3BCLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQztTQUN2QjtRQUNELGNBQWMsRUFBRTtZQUNaLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLElBQUk7WUFDWCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFVBQVU7WUFDcEIsWUFBWSxFQUFFLEtBQUs7WUFDbkIsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDO1NBQ3ZCO1FBQ0QsY0FBYyxFQUFFO1lBQ1osU0FBUyxFQUFFLElBQUk7WUFDZixLQUFLLEVBQUUsSUFBSTtZQUNYLFFBQVEsRUFBRSxJQUFJO1lBQ2QsV0FBVyxFQUFFLElBQUk7WUFDakIsU0FBUyxFQUFFLElBQUk7WUFDZixRQUFRLEVBQUUsVUFBVTtZQUNwQixZQUFZLEVBQUUsS0FBSztZQUNuQixRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUM7U0FDdkI7UUFDRCxZQUFZLEVBQUU7WUFDVixTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxJQUFJO1lBQ1gsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLFFBQVEsRUFBRSxVQUFVO1lBQ3BCLFlBQVksRUFBRSxLQUFLO1lBQ25CLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQztTQUN2QjtRQUNELGFBQWEsRUFBRTtZQUNYLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLElBQUk7WUFDWCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFVBQVU7WUFDcEIsWUFBWSxFQUFFLEtBQUs7WUFDbkIsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDO1NBQ3ZCO1FBQ0QsY0FBYyxFQUFFO1lBQ1osU0FBUyxFQUFFLElBQUk7WUFDZixLQUFLLEVBQUUsSUFBSTtZQUNYLFFBQVEsRUFBRSxJQUFJO1lBQ2QsV0FBVyxFQUFFLElBQUk7WUFDakIsU0FBUyxFQUFFLElBQUk7WUFDZixRQUFRLEVBQUUsVUFBVTtZQUNwQixZQUFZLEVBQUUsS0FBSztZQUNuQixRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUM7U0FDdkI7UUFDRCxjQUFjLEVBQUU7WUFDWixTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxJQUFJO1lBQ1gsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLFFBQVEsRUFBRSxVQUFVO1lBQ3BCLFlBQVksRUFBRSxLQUFLO1lBQ25CLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQztTQUN2QjtRQUNELGNBQWMsRUFBRTtZQUNaLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLElBQUk7WUFDWCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFVBQVU7WUFDcEIsWUFBWSxFQUFFLEtBQUs7WUFDbkIsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDO1NBQ3ZCO1FBQ0QsY0FBYyxFQUFFO1lBQ1osU0FBUyxFQUFFLElBQUk7WUFDZixLQUFLLEVBQUUsQ0FBQyxlQUFlLEVBQUUsZUFBZSxFQUFFLGVBQWUsQ0FBQztZQUMxRCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxVQUFVO1lBQ3JCLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFFBQVEsRUFBRSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUM7U0FDbkM7UUFDRCxXQUFXLEVBQUU7WUFDVCxTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxJQUFJO1lBQ1gsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLFFBQVEsRUFBRSxVQUFVO1lBQ3BCLFlBQVksRUFBRSxLQUFLO1lBQ25CLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQztTQUN2QjtRQUNELGtCQUFrQixFQUFFO1lBQ2hCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLElBQUk7WUFDWCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFVBQVU7WUFDcEIsWUFBWSxFQUFFLEtBQUs7WUFDbkIsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDO1NBQ3ZCO1FBQ0QsYUFBYSxFQUFFO1lBQ1gsU0FBUyxFQUFFLElBQUk7WUFDZixLQUFLLEVBQUUsQ0FBQyxlQUFlLEVBQUUsZUFBZSxFQUFFLGVBQWUsQ0FBQztZQUMxRCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxVQUFVO1lBQ3JCLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFFBQVEsRUFBRSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUM7U0FDbkM7UUFDRCxZQUFZLEVBQUU7WUFDVixTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxJQUFJO1lBQ1gsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLFFBQVEsRUFBRSxXQUFXO1lBQ3JCLFlBQVksRUFBRSxLQUFLO1lBQ25CLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQztTQUN2QjtRQUNELGVBQWUsRUFBRTtZQUNiLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLENBQUMsa0JBQWtCLENBQUM7WUFDM0IsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLFFBQVEsRUFBRSxXQUFXO1lBQ3JCLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFFBQVEsRUFBRSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUM7WUFDaEMsc0JBQXNCLEVBQUUsSUFBSTtTQUMvQjtRQUNELGNBQWMsRUFBRTtZQUNaLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLElBQUk7WUFDWCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFVBQVU7WUFDcEIsWUFBWSxFQUFFLEtBQUs7WUFDbkIsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDO1NBQ3ZCO1FBQ0QsZ0JBQWdCLEVBQUU7WUFDZCxTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxJQUFJO1lBQ1gsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLFFBQVEsRUFBRSxVQUFVO1lBQ3BCLFFBQVEsRUFBRSxDQUFDLFlBQVksQ0FBQztZQUN4QixlQUFlLEVBQUUsQ0FBQyxZQUFZLEVBQUUsaUJBQWlCLENBQUM7U0FDckQ7UUFDRCxnQkFBZ0IsRUFBRTtZQUNkLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLElBQUk7WUFDWCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFVBQVU7WUFDcEIsUUFBUSxFQUFFLENBQUMsWUFBWSxDQUFDO1lBQ3hCLGVBQWUsRUFBRSxDQUFDLFlBQVksRUFBRSxpQkFBaUIsQ0FBQztTQUNyRDtRQUNELFVBQVUsRUFBRTtZQUNSLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLElBQUk7WUFDWCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFVBQVU7WUFDcEIsWUFBWSxFQUFFLEtBQUs7WUFDbkIsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDO1NBQ3ZCO1FBQ0QsYUFBYSxFQUFFO1lBQ1gsU0FBUyxFQUFFLElBQUk7WUFDZixLQUFLLEVBQUUsSUFBSTtZQUNYLFFBQVEsRUFBRSxJQUFJO1lBQ2QsV0FBVyxFQUFFLElBQUk7WUFDakIsU0FBUyxFQUFFLElBQUk7WUFDZixRQUFRLEVBQUUsVUFBVTtZQUNwQixZQUFZLEVBQUUsS0FBSztZQUNuQixRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUM7U0FDdkI7UUFDRCxjQUFjLEVBQUU7WUFDWixTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxJQUFJO1lBQ1gsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLFFBQVEsRUFBRSxVQUFVO1lBQ3BCLFlBQVksRUFBRSxLQUFLO1lBQ25CLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQztTQUN2QjtRQUNELGVBQWUsRUFBRTtZQUNiLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLElBQUk7WUFDWCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFdBQVc7WUFDckIsWUFBWSxFQUFFLEtBQUs7WUFDbkIsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDO1NBQ3ZCO1FBQ0QsU0FBUyxFQUFFO1lBQ1AsU0FBUyxFQUFFLElBQUk7WUFDZixLQUFLLEVBQUUsSUFBSTtZQUNYLFFBQVEsRUFBRSxJQUFJO1lBQ2QsV0FBVyxFQUFFLElBQUk7WUFDakIsU0FBUyxFQUFFLElBQUk7WUFDZixRQUFRLEVBQUUsVUFBVTtZQUNwQixZQUFZLEVBQUUsS0FBSztZQUNuQixRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUM7U0FDdkI7UUFDRCxjQUFjLEVBQUU7WUFDWixTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxJQUFJO1lBQ1gsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLFFBQVEsRUFBRSxXQUFXO1lBQ3JCLFlBQVksRUFBRSxLQUFLO1lBQ25CLFFBQVEsRUFBRSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUM7U0FDbkM7UUFDRCxTQUFTLEVBQUU7WUFDUCxTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxJQUFJO1lBQ1gsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLFFBQVEsRUFBRSxXQUFXO1lBQ3JCLFlBQVksRUFBRSxLQUFLO1lBQ25CLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQztTQUN2QjtRQUNELFNBQVMsRUFBRTtZQUNQLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLElBQUk7WUFDWCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFVBQVU7WUFDcEIsWUFBWSxFQUFFLEtBQUs7WUFDbkIsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDO1NBQ3ZCO1FBQ0QsVUFBVSxFQUFFO1lBQ1IsU0FBUyxFQUFFLElBQUk7WUFDZixLQUFLLEVBQUUsSUFBSTtZQUNYLFFBQVEsRUFBRSxJQUFJO1lBQ2QsV0FBVyxFQUFFLElBQUk7WUFDakIsU0FBUyxFQUFFLElBQUk7WUFDZixRQUFRLEVBQUUsV0FBVztZQUNyQixZQUFZLEVBQUUsS0FBSztZQUNuQixRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUM7WUFDcEIsZUFBZSxFQUFFLENBQUMsZUFBZSxFQUFFLG1CQUFtQixFQUFFLGVBQWUsRUFBRSxjQUFjLENBQUM7U0FDM0Y7UUFFRCxVQUFVLEVBQUU7WUFDUixTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxJQUFJO1lBQ1gsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLFFBQVEsRUFBRSxXQUFXO1lBQ3JCLFFBQVEsRUFBRSxDQUFDLFlBQVksQ0FBQztZQUN4QixlQUFlLEVBQUUsQ0FBQyxZQUFZLEVBQUUsaUJBQWlCLENBQUM7WUFDbEQsZUFBZSxFQUFFLENBQUMsZUFBZSxFQUFFLG1CQUFtQixFQUFFLGVBQWUsRUFBRSxjQUFjLENBQUM7U0FDM0Y7UUFFRCxNQUFNLEVBQUU7WUFDSixTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxJQUFJO1lBQ1gsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsQ0FBQyxTQUFTLENBQUM7WUFDeEIsU0FBUyxFQUFFLElBQUk7WUFDZixRQUFRLEVBQUUsV0FBVztZQUNyQixRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUM7WUFDcEIsZUFBZSxFQUFFLENBQUMsZUFBZSxFQUFFLG1CQUFtQixFQUFFLGVBQWUsRUFBRSxjQUFjLENBQUM7U0FDM0Y7UUFFRCxRQUFRLEVBQUU7WUFDTixTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxJQUFJO1lBQ1gsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLFFBQVEsRUFBRSxXQUFXO1lBQ3JCLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQztZQUNwQixlQUFlLEVBQUUsQ0FBQyxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLGNBQWMsQ0FBQztTQUMzRjtRQUVELE1BQU0sRUFBRTtZQUNKLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLElBQUk7WUFDWCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxNQUFNO1lBQ2pCLFFBQVEsRUFBRSxVQUFVO1lBQ3BCLFlBQVksRUFBRSxLQUFLO1lBQ25CLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQztZQUNwQixlQUFlLEVBQUUsQ0FBQyxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLGNBQWMsQ0FBQztTQUMzRjtRQUVELFNBQVMsRUFBRTtZQUNQLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLElBQUk7WUFDWCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxZQUFZO1lBQ3ZCLFFBQVEsRUFBRSxXQUFXO1lBQ3JCLFFBQVEsRUFBRSxDQUFDLFlBQVksQ0FBQztZQUN4QixlQUFlLEVBQUUsQ0FBQyxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsc0JBQXNCLENBQUM7WUFDMUUsZUFBZSxFQUFFLENBQUMsZUFBZSxFQUFFLG1CQUFtQixFQUFFLGVBQWUsRUFBRSxjQUFjLENBQUM7U0FDM0Y7UUFFRCxtQkFBbUIsRUFBRTtZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxJQUFJO1lBQ1gsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQztTQUN2QjtRQUVELGlCQUFpQixFQUFFO1lBQ2YsU0FBUyxFQUFFLElBQUk7WUFDZixLQUFLLEVBQUUsSUFBSTtZQUNYLFFBQVEsRUFBRSxJQUFJO1lBQ2QsV0FBVyxFQUFFLElBQUk7WUFDakIsU0FBUyxFQUFFLElBQUk7WUFDZixZQUFZLEVBQUUsS0FBSztZQUNuQixRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUM7U0FDdkI7UUFFRCxpQkFBaUIsRUFBRTtZQUNmLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLElBQUk7WUFDWCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsWUFBWSxFQUFFLElBQUk7WUFDbEIsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDO1lBQ3BCLHNCQUFzQixFQUFFLElBQUk7U0FDL0I7UUFFRCxNQUFNLEVBQUU7WUFDSixTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxDQUFDLHVCQUF1QixFQUFFLGVBQWUsRUFBRSxzQkFBc0IsRUFBRSxlQUFlLEVBQUUsZUFBZSxDQUFDO1lBQzNHLFFBQVEsRUFBRSxJQUFJO1lBQ2QsV0FBVyxFQUFFLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQztZQUNoQyxTQUFTLEVBQUUsT0FBTztZQUNsQixRQUFRLEVBQUUsUUFBUTtZQUNsQixZQUFZLEVBQUUsS0FBSztZQUNuQixRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUM7WUFDcEIsZUFBZSxFQUFFLENBQUMsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLGNBQWMsQ0FBQztTQUMxRTtRQUVELFVBQVUsRUFBRTtZQUNSLFNBQVMsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUNsQixLQUFLLEVBQUUsQ0FBQyxlQUFlLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBRSxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsZUFBZSxFQUFFLGNBQWMsRUFBRSxlQUFlLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUUsZUFBZSxDQUFDO1lBQ3BOLFFBQVEsRUFBRSxJQUFJO1lBQ2QsV0FBVyxFQUFFLElBQUk7WUFDakIsU0FBUyxFQUFFLElBQUk7WUFDZixRQUFRLEVBQUUsUUFBUTtZQUNsQixRQUFRLEVBQUUsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDO1NBQ25DO1FBRUQsT0FBTyxFQUFFO1lBQ0wsU0FBUyxFQUFFLElBQUk7WUFDZixLQUFLLEVBQUUsQ0FBQyx1QkFBdUIsQ0FBQztZQUNoQyxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFdBQVc7WUFDckIsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDO1lBQ3BCLGVBQWUsRUFBRSxDQUFDLG1CQUFtQixFQUFFLGVBQWUsRUFBRSxjQUFjLENBQUM7U0FDMUU7UUFFRCxTQUFTLEVBQUU7WUFDUCxTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxJQUFJO1lBQ1gsUUFBUSxFQUFFLENBQUMsWUFBWSxDQUFDO1lBQ3hCLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSw2QkFBNkI7WUFDeEMsUUFBUSxFQUFFLFdBQVc7WUFDckIsWUFBWSxFQUFFLElBQUk7WUFDbEIsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQztZQUNoQyxlQUFlLEVBQUUsQ0FBQyxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLGNBQWMsQ0FBQztTQUMzRjtRQUVELEtBQUssRUFBRTtZQUNILFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLElBQUk7WUFDWCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxLQUFLO1lBQ2hCLFFBQVEsRUFBRSxXQUFXO1lBQ3JCLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQztZQUNwQixzQkFBc0IsRUFBRSxJQUFJO1lBQzVCLGVBQWUsRUFBRSxDQUFDLGVBQWUsRUFBRSxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsY0FBYyxDQUFDO1NBQzNGO1FBRUQsT0FBTyxFQUFFO1lBQ0wsU0FBUyxFQUFFLElBQUk7WUFDZixLQUFLLEVBQUUsSUFBSTtZQUNYLFFBQVEsRUFBRSxJQUFJO1lBQ2QsV0FBVyxFQUFFLElBQUk7WUFDakIsU0FBUyxFQUFFLEtBQUs7WUFDaEIsUUFBUSxFQUFFLFdBQVc7WUFDckIsWUFBWSxFQUFFLElBQUk7WUFDbEIsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDO1lBQ3BCLHNCQUFzQixFQUFFLElBQUk7WUFDNUIsZUFBZSxFQUFFLENBQUMsZUFBZSxFQUFFLG1CQUFtQixFQUFFLGVBQWUsRUFBRSxjQUFjLENBQUM7U0FDM0Y7UUFFRCxXQUFXLEVBQUU7WUFDVCxTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxJQUFJO1lBQ1gsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLFFBQVEsRUFBRSxXQUFXO1lBQ3JCLFFBQVEsRUFBRSxDQUFDLFlBQVksQ0FBQztZQUN4QixlQUFlLEVBQUUsQ0FBQyxZQUFZLEVBQUUsaUJBQWlCLENBQUM7WUFDbEQsZUFBZSxFQUFFLENBQUMsZUFBZSxFQUFFLG1CQUFtQixFQUFFLGVBQWUsRUFBRSxjQUFjLENBQUM7U0FDM0Y7UUFFRCxNQUFNLEVBQUU7WUFDSixTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxDQUFDLGVBQWUsQ0FBQztZQUN4QixRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxVQUFVO1lBQ3JCLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFFBQVEsRUFBRSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUM7WUFDaEMsZUFBZSxFQUFFLENBQUMsbUJBQW1CLEVBQUUsY0FBYyxDQUFDO1NBQ3pEO1FBRUQsTUFBTSxFQUFFO1lBQ0osU0FBUyxFQUFFLElBQUk7WUFDZixLQUFLLEVBQUUsSUFBSTtZQUNYLFFBQVEsRUFBRSxJQUFJO1lBQ2QsV0FBVyxFQUFFLENBQUMsVUFBVSxDQUFDO1lBQ3pCLFNBQVMsRUFBRSxTQUFTO1lBQ3BCLFFBQVEsRUFBRSxXQUFXO1lBQ3JCLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQztZQUNwQixlQUFlLEVBQUUsQ0FBQyxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLGNBQWMsQ0FBQztTQUMzRjtRQUVELFNBQVMsRUFBRTtZQUNQLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLENBQUMsdUJBQXVCLEVBQUUsZUFBZSxFQUFFLHNCQUFzQixFQUFFLGtCQUFrQixFQUFFLGVBQWUsRUFBRSxlQUFlLENBQUM7WUFDL0gsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDO1lBQ2hDLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFFBQVE7WUFDbEIsWUFBWSxFQUFFLElBQUk7WUFDbEIsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDO1lBQ3BCLGVBQWUsRUFBRSxDQUFDLGVBQWUsQ0FBQztTQUNyQztRQUVELFVBQVUsRUFBRTtZQUNSLFNBQVMsRUFBRSxDQUFDLE1BQU0sQ0FBQztZQUNuQixLQUFLLEVBQUUsQ0FBQyxZQUFZLEVBQUUsZUFBZSxFQUFFLGNBQWMsQ0FBQztZQUN0RCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFdBQVc7WUFDckIsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDO1lBQ3BCLGVBQWUsRUFBRSxDQUFDLGVBQWUsRUFBRSxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsY0FBYyxDQUFDO1NBQzNGO1FBRUQsS0FBSyxFQUFFO1lBQ0gsU0FBUyxFQUFFLElBQUk7WUFDZixLQUFLLEVBQUUsSUFBSTtZQUNYLFFBQVEsRUFBRSxJQUFJO1lBQ2QsV0FBVyxFQUFFLElBQUk7WUFDakIsU0FBUyxFQUFFLElBQUk7WUFDZixRQUFRLEVBQUUsWUFBWTtZQUN0QixRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUM7WUFDcEIsZUFBZSxFQUFFLENBQUMsZUFBZSxFQUFFLG1CQUFtQixFQUFFLGVBQWUsRUFBRSxjQUFjLENBQUM7U0FDM0Y7UUFFRCxNQUFNLEVBQUU7WUFDSixTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxJQUFJO1lBQ1gsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLFFBQVEsRUFBRSxVQUFVO1lBQ3BCLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQztZQUNwQixlQUFlLEVBQUUsQ0FBQyxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLGNBQWMsQ0FBQztTQUMzRjtRQUVELE1BQU0sRUFBRTtZQUNKLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLElBQUk7WUFDWCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxNQUFNO1lBQ2pCLFFBQVEsRUFBRSxXQUFXO1lBQ3JCLFFBQVEsRUFBRSxDQUFDLFlBQVksQ0FBQztZQUN4QixlQUFlLEVBQUUsQ0FBQyxZQUFZLEVBQUUsaUJBQWlCLENBQUM7WUFDbEQsZUFBZSxFQUFFLENBQUMsZUFBZSxFQUFFLG1CQUFtQixFQUFFLGVBQWUsRUFBRSxjQUFjLENBQUM7U0FDM0Y7UUFFRCxTQUFTLEVBQUU7WUFDUCxTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxJQUFJO1lBQ1gsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLFFBQVEsRUFBRSxZQUFZO1lBQ3RCLFlBQVksRUFBRSxLQUFLO1lBQ25CLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQztZQUNwQixlQUFlLEVBQUUsQ0FBQyxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLGNBQWMsQ0FBQztTQUMzRjtRQUVELE1BQU0sRUFBRTtZQUNKLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLElBQUk7WUFDWCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFdBQVc7WUFDckIsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDO1lBQ3BCLHNCQUFzQixFQUFFLEtBQUs7WUFDN0IsZUFBZSxFQUFFLENBQUMsZUFBZSxFQUFFLG1CQUFtQixFQUFFLGVBQWUsRUFBRSxjQUFjLENBQUM7U0FDM0Y7UUFFRCxNQUFNLEVBQUU7WUFDSixTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxDQUFDLHVCQUF1QixFQUFFLGtCQUFrQixDQUFDO1lBQ3BELFFBQVEsRUFBRSxJQUFJO1lBQ2QsV0FBVyxFQUFFLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxrQkFBa0IsRUFBRSxlQUFlLENBQUM7WUFDdkUsU0FBUyxFQUFFLElBQUk7WUFDZixRQUFRLEVBQUUsUUFBUTtZQUNsQixZQUFZLEVBQUUsS0FBSztZQUNuQixRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUM7WUFDcEIsZUFBZSxFQUFFLENBQUMsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLGNBQWMsQ0FBQztTQUMxRTtRQUVELFNBQVMsRUFBRTtZQUNQLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLENBQUMsdUJBQXVCLEVBQUUsa0JBQWtCLENBQUM7WUFDcEQsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLGtCQUFrQixFQUFFLGVBQWUsQ0FBQztZQUN2RSxTQUFTLEVBQUUsSUFBSTtZQUNmLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLFlBQVksRUFBRSxLQUFLO1lBQ25CLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQztZQUNwQixlQUFlLEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsY0FBYyxDQUFDO1NBQzFFO1FBRUQsVUFBVSxFQUFFO1lBQ1IsU0FBUyxFQUFFLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLENBQUM7WUFDdkMsS0FBSyxFQUFFLENBQUMsZUFBZSxFQUFFLGVBQWUsRUFBRSxjQUFjLENBQUM7WUFDekQsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFFBQVEsRUFBRSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUM7WUFDaEMsZUFBZSxFQUFFLENBQUMsbUJBQW1CLEVBQUUsY0FBYyxDQUFDO1NBQ3pEO1FBRUQsa0JBQWtCLEVBQUU7WUFDaEIsU0FBUyxFQUFFLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLENBQUM7WUFDdkMsS0FBSyxFQUFFLENBQUMsZUFBZSxFQUFFLGVBQWUsRUFBRSxjQUFjLENBQUM7WUFDekQsUUFBUSxFQUFFLENBQUMsY0FBYyxDQUFDO1lBQzFCLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFFBQVE7WUFDbEIsWUFBWSxFQUFFLElBQUk7WUFDbEIsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQztZQUNoQyxzQkFBc0IsRUFBRSxJQUFJO1lBQzVCLGVBQWUsRUFBRSxDQUFDLG1CQUFtQixFQUFFLGNBQWMsQ0FBQztTQUN6RDtRQUVELGVBQWUsRUFBRTtZQUNiLFNBQVMsRUFBRSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxDQUFDO1lBQ3ZDLEtBQUssRUFBRSxDQUFDLGVBQWUsRUFBRSxlQUFlLEVBQUUsY0FBYyxDQUFDO1lBQ3pELFFBQVEsRUFBRSxDQUFDLGNBQWMsQ0FBQztZQUMxQixXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFFBQVEsRUFBRSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUM7WUFDaEMsc0JBQXNCLEVBQUUsSUFBSTtZQUM1QixlQUFlLEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSxjQUFjLENBQUM7U0FDekQ7UUFFRCxPQUFPLEVBQUU7WUFDTCxTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxDQUFDLGVBQWUsRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLENBQUM7WUFDM0QsUUFBUSxFQUFFLENBQUMsZUFBZSxDQUFDO1lBQzNCLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFdBQVc7WUFDckIsWUFBWSxFQUFFLElBQUk7WUFDbEIsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDO1lBQ3BCLHNCQUFzQixFQUFFLElBQUk7WUFDNUIsZUFBZSxFQUFFLENBQUMsZUFBZSxFQUFFLG1CQUFtQixFQUFFLGVBQWUsRUFBRSxjQUFjLENBQUM7U0FDM0Y7UUFFRCxZQUFZLEVBQUU7WUFDVixTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxJQUFJO1lBQ1gsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLFFBQVEsRUFBRSxVQUFVO1lBQ3BCLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQztZQUNwQixlQUFlLEVBQUUsQ0FBQyxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLGNBQWMsQ0FBQztTQUMzRjtRQUVELE1BQU0sRUFBRTtZQUNKLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLEVBQUU7WUFDVCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFdBQVc7WUFDckIsUUFBUSxFQUFFLENBQUMsWUFBWSxDQUFDO1lBQ3hCLGVBQWUsRUFBRSxDQUFDLFlBQVksRUFBRSxpQkFBaUIsQ0FBQztZQUNsRCxlQUFlLEVBQUUsQ0FBQyxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLGNBQWMsQ0FBQztTQUMzRjtRQUVELE1BQU0sRUFBRTtZQUNKLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLElBQUk7WUFDWCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFdBQVc7WUFDckIsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDO1lBQ3BCLGVBQWUsRUFBRSxDQUFDLGVBQWUsRUFBRSxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsY0FBYyxDQUFDO1NBQzNGO1FBRUQsUUFBUSxFQUFFO1lBQ04sU0FBUyxFQUFFLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQztZQUMvQixLQUFLLEVBQUUsQ0FBQyxlQUFlLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBRSxjQUFjLENBQUM7WUFDekUsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsUUFBUTtZQUNuQixRQUFRLEVBQUUsUUFBUTtZQUNsQixZQUFZLEVBQUUsSUFBSTtZQUNsQixRQUFRLEVBQUUsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDO1lBQ2hDLHNCQUFzQixFQUFFLElBQUk7WUFDNUIsZUFBZSxFQUFFLENBQUMsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLGNBQWMsQ0FBQztTQUMxRTtRQUVELFdBQVcsRUFBRTtZQUNULFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLElBQUk7WUFDWCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFdBQVc7WUFDckIsUUFBUSxFQUFFLENBQUMsWUFBWSxDQUFDO1lBQ3hCLGVBQWUsRUFBRSxDQUFDLFlBQVksRUFBRSxpQkFBaUIsQ0FBQztZQUNsRCxlQUFlLEVBQUUsQ0FBQyxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLGNBQWMsQ0FBQztTQUMzRjtRQUVELGNBQWMsRUFBRTtZQUNaLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLEVBQUU7WUFDVCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFdBQVc7WUFDckIsUUFBUSxFQUFFLENBQUMsWUFBWSxDQUFDO1lBQ3hCLGVBQWUsRUFBRSxDQUFDLFlBQVksRUFBRSxpQkFBaUIsQ0FBQztZQUNsRCxlQUFlLEVBQUUsQ0FBQyxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLGNBQWMsQ0FBQztTQUMzRjtRQUVELGFBQWEsRUFBRTtZQUNYLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLENBQUMsZUFBZSxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLENBQUM7WUFDNUUsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQztZQUNwQixzQkFBc0IsRUFBRSxJQUFJO1lBQzVCLGVBQWUsRUFBRSxDQUFDLGVBQWUsRUFBRSxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsY0FBYyxDQUFDO1NBQzNGO1FBRUQsT0FBTyxFQUFFO1lBQ0wsU0FBUyxFQUFFLElBQUk7WUFDZixLQUFLLEVBQUUsQ0FBQyxlQUFlLEVBQUUsY0FBYyxDQUFDO1lBQ3hDLFFBQVEsRUFBRSxDQUFDLGNBQWMsQ0FBQztZQUMxQixXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsc0JBQXNCO1lBQ2pDLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFFBQVEsRUFBRSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUM7WUFDaEMsc0JBQXNCLEVBQUUsSUFBSTtZQUM1QixlQUFlLEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsY0FBYyxDQUFDO1NBQzFFO1FBRUQsWUFBWSxFQUFFO1lBQ1YsU0FBUyxFQUFFLElBQUk7WUFDZixLQUFLLEVBQUUsQ0FBQyx1QkFBdUIsRUFBRSxrQkFBa0IsRUFBRSxlQUFlLEVBQUUsZUFBZSxDQUFDO1lBQ3RGLFFBQVEsRUFBRSxJQUFJO1lBQ2QsV0FBVyxFQUFFLENBQUMsT0FBTyxDQUFDO1lBQ3RCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFFBQVE7WUFDbEIsWUFBWSxFQUFFLEtBQUs7WUFDbkIsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDO1lBQ3BCLGVBQWUsRUFBRSxDQUFDLGVBQWUsQ0FBQztTQUNyQztRQUVELFFBQVEsRUFBRTtZQUNOLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLElBQUk7WUFDWCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFVBQVU7WUFDcEIsWUFBWSxFQUFFLElBQUk7WUFDbEIsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDO1lBQ3BCLGVBQWUsRUFBRSxDQUFDLGVBQWUsRUFBRSxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsY0FBYyxDQUFDO1NBQzNGO1FBRUQsS0FBSyxFQUFFO1lBQ0gsU0FBUyxFQUFFLENBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsVUFBVSxDQUFDO1lBQ3BELEtBQUssRUFBRSxDQUFDLHVCQUF1QixFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsZUFBZSxFQUFFLGNBQWMsQ0FBQztZQUNuSixRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxDQUFDLE1BQU0sRUFBRSxjQUFjLEVBQUUsVUFBVSxFQUFFLFdBQVcsQ0FBQztZQUM5RCxTQUFTLEVBQUUsSUFBSTtZQUNmLFFBQVEsRUFBRSxXQUFXO1lBQ3JCLFFBQVEsRUFBRSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUM7WUFDaEMsZUFBZSxFQUFFLENBQUMsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLGNBQWMsQ0FBQztTQUMxRTtRQUVELFVBQVUsRUFBRTtZQUNSLFNBQVMsRUFBRSxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsVUFBVSxDQUFDO1lBQ3hDLEtBQUssRUFBRSxFQUFFO1lBQ1QsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDcEIsU0FBUyxFQUFFLHVCQUF1QjtZQUNsQyxRQUFRLEVBQUUsV0FBVztZQUNyQixRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUM7WUFDcEIsZUFBZSxFQUFFLENBQUMsZUFBZSxFQUFFLG1CQUFtQixFQUFFLGVBQWUsRUFBRSxjQUFjLENBQUM7U0FDM0Y7UUFFRCxXQUFXLEVBQUU7WUFDVCxTQUFTLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDbEIsS0FBSyxFQUFFLENBQUMsZUFBZSxFQUFFLGNBQWMsRUFBRSxlQUFlLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBRSxXQUFXLENBQUM7WUFDMUosUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsa0JBQWtCO1lBQzdCLFFBQVEsRUFBRSxXQUFXO1lBQ3JCLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFFBQVEsRUFBRSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUM7U0FDbkM7UUFFRCxXQUFXLEVBQUU7WUFDVCxTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxDQUFDLGtCQUFrQixFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLENBQUM7WUFDL0UsUUFBUSxFQUFFLENBQUMsZUFBZSxFQUFFLGVBQWUsQ0FBQztZQUM1QyxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLFlBQVksRUFBRSxLQUFLO1lBQ25CLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQztZQUNwQixzQkFBc0IsRUFBRSxJQUFJO1lBQzVCLGVBQWUsRUFBRSxDQUFDLG1CQUFtQixFQUFFLGVBQWUsRUFBRSxjQUFjLENBQUM7U0FDMUU7UUFFRCxRQUFRLEVBQUU7WUFDTixTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxJQUFJO1lBQ1gsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLFFBQVEsRUFBRSxVQUFVO1lBQ3BCLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQztZQUNwQixlQUFlLEVBQUUsQ0FBQyxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLGNBQWMsQ0FBQztTQUMzRjtRQUVELFdBQVcsRUFBRTtZQUNULFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLENBQUMsdUJBQXVCLEVBQUUsbUJBQW1CLEVBQUUsZ0JBQWdCLEVBQUUsa0JBQWtCLEVBQUUsZUFBZSxFQUFFLGVBQWUsQ0FBQztZQUM3SCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSx1QkFBdUI7WUFDbEMsUUFBUSxFQUFFLFFBQVE7WUFDbEIsWUFBWSxFQUFFLElBQUk7WUFDbEIsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDO1NBQ3ZCO1FBRUQsV0FBVyxFQUFFO1lBQ1QsU0FBUyxFQUFFLElBQUk7WUFDZixLQUFLLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQztZQUMzQixRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFdBQVc7WUFDckIsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDO1lBQ3BCLHNCQUFzQixFQUFFLElBQUk7WUFDNUIsZUFBZSxFQUFFLENBQUMsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLGNBQWMsQ0FBQztTQUMxRTtRQUVELFFBQVEsRUFBRTtZQUNOLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLENBQUMsa0JBQWtCLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLENBQUM7WUFDaEcsUUFBUSxFQUFFLENBQUMsZUFBZSxDQUFDO1lBQzNCLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFFBQVE7WUFDbEIsWUFBWSxFQUFFLElBQUk7WUFDbEIsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDO1lBQ3BCLHNCQUFzQixFQUFFLElBQUk7U0FDL0I7UUFFRCxZQUFZLEVBQUU7WUFDVixTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxDQUFDLHVCQUF1QixFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsZ0JBQWdCLENBQUM7WUFDdkksUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQztZQUNwQixlQUFlLEVBQUUsQ0FBQyxlQUFlLENBQUM7U0FDckM7UUFFRCxRQUFRLEVBQUU7WUFDTixTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxJQUFJO1lBQ1gsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLFFBQVEsRUFBRSxZQUFZO1lBQ3RCLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQztZQUNwQixlQUFlLEVBQUUsQ0FBQyxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLGNBQWMsQ0FBQztTQUMzRjtRQUVELFFBQVEsRUFBRTtZQUNOLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLElBQUk7WUFDWCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFdBQVc7WUFDckIsUUFBUSxFQUFFLENBQUMsWUFBWSxDQUFDO1lBQ3hCLGVBQWUsRUFBRSxDQUFDLFlBQVksRUFBRSxpQkFBaUIsQ0FBQztZQUNsRCxlQUFlLEVBQUUsQ0FBQyxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLGNBQWMsQ0FBQztTQUMzRjtRQUVELFdBQVcsRUFBRTtZQUNULFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLElBQUk7WUFDWCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFdBQVc7WUFDckIsUUFBUSxFQUFFLENBQUMsWUFBWSxDQUFDO1lBQ3hCLGVBQWUsRUFBRSxDQUFDLFlBQVksRUFBRSxpQkFBaUIsQ0FBQztZQUNsRCxlQUFlLEVBQUUsQ0FBQyxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLGNBQWMsQ0FBQztTQUMzRjtRQUVELFlBQVksRUFBRTtZQUNWLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLElBQUk7WUFDWCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFdBQVc7WUFDckIsUUFBUSxFQUFFLENBQUMsWUFBWSxDQUFDO1lBQ3hCLGVBQWUsRUFBRSxDQUFDLFlBQVksRUFBRSxpQkFBaUIsQ0FBQztZQUNsRCxlQUFlLEVBQUUsQ0FBQyxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLGNBQWMsQ0FBQztTQUMzRjtRQUVELGFBQWEsRUFBRTtZQUNYLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLElBQUk7WUFDWCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFdBQVc7WUFDckIsUUFBUSxFQUFFLENBQUMsWUFBWSxDQUFDO1lBQ3hCLGVBQWUsRUFBRSxDQUFDLFlBQVksRUFBRSxpQkFBaUIsQ0FBQztZQUNsRCxlQUFlLEVBQUUsQ0FBQyxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLGNBQWMsQ0FBQztTQUMzRjtRQUVELFFBQVEsRUFBRTtZQUNOLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLENBQUMsZUFBZSxFQUFFLGVBQWUsRUFBRSxlQUFlLENBQUM7WUFDMUQsUUFBUSxFQUFFLENBQUMsY0FBYyxDQUFDO1lBQzFCLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFFBQVE7WUFDbEIsWUFBWSxFQUFFLElBQUk7WUFDbEIsUUFBUSxFQUFFLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQztZQUNoQyxzQkFBc0IsRUFBRSxJQUFJO1lBQzVCLGVBQWUsRUFBRSxDQUFDLGVBQWUsQ0FBQztTQUNyQztRQUVELEtBQUssRUFBRTtZQUNILFNBQVMsRUFBRSxDQUFDLFNBQVMsQ0FBQztZQUN0QixLQUFLLEVBQUUsQ0FBQyxlQUFlLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBRSxjQUFjLENBQUM7WUFDMUUsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFFBQVEsRUFBRSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUM7WUFDaEMsc0JBQXNCLEVBQUUsSUFBSTtZQUM1QixlQUFlLEVBQUUsQ0FBQyxtQkFBbUIsRUFBRSxjQUFjLENBQUM7U0FDekQ7UUFFRCxPQUFPLEVBQUU7WUFDTCxTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxDQUFDLGVBQWUsRUFBRSxlQUFlLENBQUM7WUFDekMsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsQ0FBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLFNBQVMsQ0FBQztZQUMzQyxTQUFTLEVBQUUsT0FBTztZQUNsQixRQUFRLEVBQUUsV0FBVztZQUNyQixZQUFZLEVBQUUsS0FBSztZQUNuQixRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUM7WUFDcEIsZUFBZSxFQUFFLENBQUMsZUFBZSxFQUFFLG1CQUFtQixFQUFFLGVBQWUsRUFBRSxjQUFjLENBQUM7U0FDM0Y7UUFFRCxTQUFTLEVBQUU7WUFDUCxTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxDQUFDLHVCQUF1QixFQUFFLHNCQUFzQixFQUFFLGtCQUFrQixDQUFDO1lBQzVFLFFBQVEsRUFBRSxJQUFJO1lBQ2QsV0FBVyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ3BCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFFBQVE7WUFDbEIsWUFBWSxFQUFFLEtBQUs7WUFDbkIsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDO1lBQ3BCLGVBQWUsRUFBRSxDQUFDLG1CQUFtQixFQUFFLGVBQWUsRUFBRSxjQUFjLENBQUM7U0FDMUU7UUFFRCxVQUFVLEVBQUU7WUFDUixTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxJQUFJO1lBQ1gsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQztZQUNwQixlQUFlLEVBQUUsQ0FBQyxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLGNBQWMsQ0FBQztTQUMzRjtRQUVELE1BQU0sRUFBRTtZQUNKLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLElBQUk7WUFDWCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxLQUFLO1lBQ2hCLFFBQVEsRUFBRSxXQUFXO1lBQ3JCLFFBQVEsRUFBRSxDQUFDLFlBQVksQ0FBQztZQUN4QixlQUFlLEVBQUUsQ0FBQyxZQUFZLEVBQUUsaUJBQWlCLENBQUM7WUFDbEQsZUFBZSxFQUFFLENBQUMsZUFBZSxFQUFFLG1CQUFtQixFQUFFLGVBQWUsRUFBRSxjQUFjLENBQUM7U0FDM0Y7UUFFRCxTQUFTLEVBQUU7WUFDUCxTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxDQUFDLHVCQUF1QixFQUFFLG1CQUFtQixFQUFFLGdCQUFnQixFQUFFLGtCQUFrQixFQUFFLGVBQWUsRUFBRSxlQUFlLENBQUM7WUFDN0gsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUscUJBQXFCO1lBQ2hDLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQztTQUN2QjtRQUVELE1BQU0sRUFBRTtZQUNKLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLElBQUk7WUFDWCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFdBQVc7WUFDckIsUUFBUSxFQUFFLENBQUMsWUFBWSxDQUFDO1lBQ3hCLGVBQWUsRUFBRSxDQUFDLFlBQVksRUFBRSxpQkFBaUIsQ0FBQztZQUNsRCxlQUFlLEVBQUUsQ0FBQyxlQUFlLEVBQUUsbUJBQW1CLEVBQUUsZUFBZSxFQUFFLGNBQWMsQ0FBQztTQUMzRjtRQUVELE9BQU8sRUFBRTtZQUNMLFNBQVMsRUFBRSxJQUFJO1lBQ2YsS0FBSyxFQUFFLElBQUk7WUFDWCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFlBQVk7WUFDdEIsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDO1lBQ3BCLGVBQWUsRUFBRSxDQUFDLGVBQWUsRUFBRSxtQkFBbUIsRUFBRSxlQUFlLEVBQUUsY0FBYyxDQUFDO1NBQzNGO1FBRUQsU0FBUyxFQUFFO1lBQ1AsU0FBUyxFQUFFLElBQUk7WUFDZixLQUFLLEVBQUUsQ0FBQyx1QkFBdUIsRUFBRSxrQkFBa0IsQ0FBQztZQUNwRCxRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxJQUFJO1lBQ2pCLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFdBQVc7WUFDckIsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDO1lBQ3BCLGVBQWUsRUFBRSxDQUFDLG1CQUFtQixFQUFFLGVBQWUsRUFBRSxjQUFjLENBQUM7U0FDMUU7UUFFRCxTQUFTLEVBQUU7WUFDUCxTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxJQUFJO1lBQ1gsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLFFBQVEsRUFBRSxXQUFXO1lBQ3JCLFlBQVksRUFBRSxLQUFLO1lBQ25CLFFBQVEsRUFBRSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUM7WUFDaEMsZUFBZSxFQUFFLENBQUMsZUFBZSxFQUFFLG1CQUFtQixFQUFFLGVBQWUsRUFBRSxjQUFjLENBQUM7U0FDM0Y7UUFFRCxNQUFNLEVBQUU7WUFDSixTQUFTLEVBQUUsSUFBSTtZQUNmLEtBQUssRUFBRSxDQUFDLHVCQUF1QixFQUFFLHNCQUFzQixFQUFFLGtCQUFrQixFQUFFLGVBQWUsQ0FBQztZQUM3RixRQUFRLEVBQUUsSUFBSTtZQUNkLFdBQVcsRUFBRSxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUM7WUFDbEMsU0FBUyxFQUFFLElBQUk7WUFDZixRQUFRLEVBQUUsUUFBUTtZQUNsQixZQUFZLEVBQUUsSUFBSTtZQUNsQixRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUM7WUFDcEIsZUFBZSxFQUFFLENBQUMsZUFBZSxDQUFDO1NBQ3JDO1FBRUQsVUFBVSxFQUFFO1lBQ1IsU0FBUyxFQUFFLElBQUk7WUFDZixLQUFLLEVBQUUsQ0FBQyx1QkFBdUIsRUFBRSxlQUFlLEVBQUUsc0JBQXNCLEVBQUUsa0JBQWtCLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBRSxlQUFlLENBQUM7WUFDaEosUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDO1lBQ2hDLFNBQVMsRUFBRSxJQUFJO1lBQ2YsUUFBUSxFQUFFLFFBQVE7WUFDbEIsWUFBWSxFQUFFLElBQUk7WUFDbEIsUUFBUSxFQUFFLENBQUMsUUFBUSxDQUFDO1lBQ3BCLGVBQWUsRUFBRSxDQUFDLGVBQWUsQ0FBQztTQUNyQztRQUVELFVBQVUsRUFBRTtZQUNSLFNBQVMsRUFBRSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUM7WUFDNUIsS0FBSyxFQUFFLENBQUMsY0FBYyxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFFLGVBQWUsRUFBRSxjQUFjLENBQUM7WUFDeEcsUUFBUSxFQUFFLElBQUk7WUFDZCxXQUFXLEVBQUUsSUFBSTtZQUNqQixTQUFTLEVBQUUsSUFBSTtZQUNmLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFFBQVEsRUFBRSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUM7WUFDaEMsZUFBZSxFQUFFLENBQUMsbUJBQW1CLEVBQUUsY0FBYyxDQUFDO1NBQ3pEO0tBQ0osRUFBQyxxQkFBcUI7SUFFdkIsNEZBQTRGO0lBQzVGLDRFQUE0RTtJQUM1RSx3RUFBd0U7SUFDeEU7Ozs7T0FJRztJQUNJLHVDQUF1QixHQUFHLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxzQ0FBc0M7SUFDN0ksdUNBQXVCLEdBQUcsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxtSkFBbUo7SUFDck0sdUNBQXVCLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLCtLQUErSztJQUc5Tjs7O1VBR007SUFDQyw4Q0FBOEIsR0FFakM7UUFDQSxNQUFNLEVBQUU7WUFDSixZQUFZLEVBQUUsSUFBSTtZQUNsQixVQUFVLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDbkIseUJBQXlCLEVBQUUsSUFBSTtZQUMvQiwwQ0FBMEMsRUFBRSxDQUFDLFlBQVksRUFBRSxpQkFBaUIsQ0FBQztTQUNoRjtRQUNELFNBQVMsRUFBRTtZQUNQLFlBQVksRUFBRSxDQUFDLE9BQU8sQ0FBQztZQUN2QixVQUFVLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDbkIseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELFNBQVMsRUFBRTtZQUNQLFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQztZQUN6QixVQUFVLEVBQUUsQ0FBQyxhQUFhLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxRQUFRLENBQUM7WUFDekYseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELE9BQU8sRUFBRTtZQUNMLFlBQVksRUFBRSxDQUFDLGVBQWUsQ0FBQztZQUMvQixVQUFVLEVBQUUsQ0FBQyxnQkFBZ0IsRUFBRSxhQUFhLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBRSxlQUFlLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDO1lBQ3JLLHlCQUF5QixFQUFFLElBQUk7U0FDbEM7UUFDRCxPQUFPLEVBQUU7WUFDTCxZQUFZLEVBQUUsSUFBSTtZQUNsQixVQUFVLEVBQUUsQ0FBQyxhQUFhLENBQUM7WUFDM0IseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELEdBQUcsRUFBRTtZQUNELFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQztZQUN6QixVQUFVLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDbkIseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELE1BQU0sRUFBRTtZQUNKLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLHlCQUF5QixFQUFFLEtBQUs7U0FDbkM7UUFDRCxLQUFLLEVBQUU7WUFDSCxZQUFZLEVBQUUsQ0FBQyxTQUFTLENBQUM7WUFDekIsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ25CLHlCQUF5QixFQUFFLElBQUk7U0FDbEM7UUFDRCxLQUFLLEVBQUU7WUFDSCxZQUFZLEVBQUUsQ0FBQyxTQUFTLENBQUM7WUFDekIsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ25CLHlCQUF5QixFQUFFLElBQUk7U0FDbEM7UUFDRCxZQUFZLEVBQUU7WUFDVixZQUFZLEVBQUUsQ0FBQyxZQUFZLENBQUM7WUFDNUIsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ25CLHlCQUF5QixFQUFFLElBQUk7U0FDbEM7UUFDRCxNQUFNLEVBQUU7WUFDSixZQUFZLEVBQUUsQ0FBQyxTQUFTLENBQUM7WUFDekIsVUFBVSxFQUFFLElBQUk7WUFDaEIsNkJBQTZCLEVBQUUsQ0FBQyxhQUFhLENBQUM7WUFDOUMseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELElBQUksRUFBRTtZQUNGLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFVBQVUsRUFBRSxDQUFDLE1BQU0sRUFBRSxjQUFjLENBQUM7WUFDcEMseUJBQXlCLEVBQUUsS0FBSztZQUNoQywwQkFBMEIsRUFBRSxDQUFDLGFBQWEsQ0FBQztTQUM5QztRQUNELFFBQVEsRUFBRTtZQUNOLFlBQVksRUFBRSxDQUFDLFFBQVEsQ0FBQztZQUN4QixVQUFVLEVBQUUsQ0FBQyxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLGtCQUFrQixFQUFFLGVBQWUsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFDLFdBQVcsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxVQUFVLENBQUM7WUFDL0sseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELFFBQVEsRUFBRTtZQUNOLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFVBQVUsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUNuQix5QkFBeUIsRUFBRSxJQUFJO1NBQ2xDO1FBQ0QsU0FBUyxFQUFFO1lBQ1AsWUFBWSxFQUFFLENBQUMsU0FBUyxDQUFDO1lBQ3pCLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLHlCQUF5QixFQUFFLElBQUk7WUFDL0IsK0JBQStCLEVBQUUsS0FBSztTQUN6QztRQUNELE1BQU0sRUFBRTtZQUNKLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFVBQVUsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUNuQix5QkFBeUIsRUFBRSxJQUFJO1lBQy9CLDBDQUEwQyxFQUFFLENBQUMsWUFBWSxFQUFFLGlCQUFpQixDQUFDO1NBQ2hGO1FBQ0QsTUFBTSxFQUFFO1lBQ0osWUFBWSxFQUFFLENBQUMsTUFBTSxDQUFDO1lBQ3RCLFVBQVUsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUNuQix5QkFBeUIsRUFBRSxJQUFJO1NBQ2xDO1FBQ0QsS0FBSyxFQUFFO1lBQ0gsWUFBWSxFQUFFLElBQUk7WUFDbEIsVUFBVSxFQUFFLElBQUk7WUFDaEIseUJBQXlCLEVBQUUsS0FBSztTQUNuQztRQUNELFVBQVUsRUFBRTtZQUNSLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLHlCQUF5QixFQUFFLEtBQUs7U0FDbkM7UUFDRCxNQUFNLEVBQUU7WUFDSixZQUFZLEVBQUUsQ0FBQyxTQUFTLENBQUM7WUFDekIsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ25CLHlCQUF5QixFQUFFLElBQUk7U0FDbEM7UUFDRCxVQUFVLEVBQUU7WUFDUixZQUFZLEVBQUUsQ0FBQyxTQUFTLENBQUM7WUFDekIsVUFBVSxFQUFFLElBQUk7WUFDaEIseUJBQXlCLEVBQUUsS0FBSztZQUNoQywrQkFBK0IsRUFBRSxLQUFLO1NBQ3pDO1FBQ0QsSUFBSSxFQUFFO1lBQ0YsWUFBWSxFQUFFLElBQUk7WUFDbEIsVUFBVSxFQUFFLElBQUk7WUFDaEIseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELEtBQUssRUFBRTtZQUNILFlBQVksRUFBRSxDQUFDLFVBQVUsQ0FBQztZQUMxQixVQUFVLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDbkIseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELFNBQVMsRUFBRTtZQUNQLFlBQVksRUFBRSxDQUFDLE9BQU8sQ0FBQztZQUN2QixVQUFVLEVBQUUsSUFBSTtZQUNoQix5QkFBeUIsRUFBRSxJQUFJO1NBQ2xDO1FBQ0QsS0FBSyxFQUFFO1lBQ0gsWUFBWSxFQUFFLENBQUMsTUFBTSxDQUFDO1lBQ3RCLFVBQVUsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUNuQix5QkFBeUIsRUFBRSxJQUFJO1NBQ2xDO1FBQ0QsUUFBUSxFQUFFO1lBQ04sWUFBWSxFQUFFLENBQUMsUUFBUSxDQUFDO1lBQ3hCLFVBQVUsRUFBRSxDQUFDLGFBQWEsQ0FBQztZQUMzQix5QkFBeUIsRUFBRSxJQUFJO1NBQ2xDO1FBQ0YsSUFBSSxFQUFFO1lBQ0QsWUFBWSxFQUFFLElBQUk7WUFDbEIsVUFBVSxFQUFFLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsY0FBYyxDQUFDO1lBQ3JELHlCQUF5QixFQUFFLElBQUk7U0FDbEM7UUFDRCxJQUFJLEVBQUU7WUFDRixZQUFZLEVBQUUsQ0FBQyxNQUFNLENBQUM7WUFDdEIsVUFBVSxFQUFFLENBQUMsVUFBVSxDQUFDO1lBQ3hCLHlCQUF5QixFQUFFLElBQUk7U0FDbEM7UUFDRCxJQUFJLEVBQUU7WUFDRixZQUFZLEVBQUUsSUFBSTtZQUNsQixVQUFVLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDbkIseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELE9BQU8sRUFBRTtZQUNMLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFVBQVUsRUFBRSxDQUFDLGFBQWEsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxjQUFjLENBQUM7WUFDdEUseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELFVBQVUsRUFBRTtZQUNSLFlBQVksRUFBRSxDQUFDLE9BQU8sQ0FBQztZQUN2QixVQUFVLEVBQUUsQ0FBQyxNQUFNLEVBQUUsY0FBYyxFQUFFLFlBQVksQ0FBQztZQUNsRCx5QkFBeUIsRUFBRSxJQUFJO1NBQ2xDO1FBQ0QsWUFBWSxFQUFFO1lBQ1YsWUFBWSxFQUFFLElBQUk7WUFDbEIsVUFBVSxFQUFFLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxjQUFjLENBQUM7WUFDN0MseUJBQXlCLEVBQUUsSUFBSTtZQUMvQiwwQ0FBMEMsRUFBRSxDQUFDLFlBQVksRUFBRSxpQkFBaUIsQ0FBQztTQUNoRjtRQUNELE1BQU0sRUFBRTtZQUNKLFlBQVksRUFBRSxDQUFDLE1BQU0sQ0FBQztZQUN0QixVQUFVLEVBQUUsQ0FBQyxNQUFNLEVBQUUsY0FBYyxFQUFFLFFBQVEsQ0FBQztZQUM5Qyx5QkFBeUIsRUFBRSxJQUFJO1NBQ2xDO1FBQ0QsTUFBTSxFQUFFO1lBQ0osWUFBWSxFQUFFLElBQUk7WUFDbEIsVUFBVSxFQUFFLElBQUk7WUFDaEIseUJBQXlCLEVBQUUsS0FBSztTQUNuQztRQUNELFFBQVEsRUFBRTtZQUNOLFlBQVksRUFBRSxDQUFDLE9BQU8sQ0FBQztZQUN2QixVQUFVLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDbkIseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELElBQUksRUFBRTtZQUNGLFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQztZQUN6QixVQUFVLEVBQUUsQ0FBQyxjQUFjLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxLQUFLLENBQUM7WUFDM0QseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELElBQUksRUFBRTtZQUNGLFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQztZQUN6QixVQUFVLEVBQUUsQ0FBQyxjQUFjLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxLQUFLLENBQUM7WUFDM0QseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELElBQUksRUFBRTtZQUNGLFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQztZQUN6QixVQUFVLEVBQUUsQ0FBQyxjQUFjLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxLQUFLLENBQUM7WUFDM0QseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELElBQUksRUFBRTtZQUNGLFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQztZQUN6QixVQUFVLEVBQUUsQ0FBQyxjQUFjLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxLQUFLLENBQUM7WUFDM0QseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELElBQUksRUFBRTtZQUNGLFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQztZQUN6QixVQUFVLEVBQUUsQ0FBQyxjQUFjLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxLQUFLLENBQUM7WUFDM0QseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELElBQUksRUFBRTtZQUNGLFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQztZQUN6QixVQUFVLEVBQUUsQ0FBQyxjQUFjLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxLQUFLLENBQUM7WUFDM0QseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELElBQUksRUFBRTtZQUNGLFlBQVksRUFBRSxDQUFDLFdBQVcsQ0FBQztZQUMzQixVQUFVLEVBQUUsQ0FBQyxlQUFlLEVBQUUsTUFBTSxFQUFFLGNBQWMsQ0FBQztZQUNyRCx5QkFBeUIsRUFBRSxJQUFJO1NBQ2xDO1FBQ0QsTUFBTSxFQUFFO1lBQ0osWUFBWSxFQUFFLENBQUMsVUFBVSxDQUFDO1lBQzFCLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLHlCQUF5QixFQUFFLEtBQUs7WUFDaEMsK0JBQStCLEVBQUUsS0FBSztTQUN6QztRQUNELEdBQUcsRUFBRTtZQUNELFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQztZQUN6QixVQUFVLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDbkIseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELFFBQVEsRUFBRTtZQUNOLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFVBQVUsRUFBRSxDQUFDLGFBQWEsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxjQUFjLENBQUM7WUFDdEUseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELEtBQUssRUFBRTtZQUNILFlBQVksRUFBRSxDQUFDLFdBQVcsQ0FBQztZQUMzQixVQUFVLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDbkIseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELEtBQUssRUFBRTtZQUNILFlBQVksRUFBRSxJQUFJO1lBQ2xCLFVBQVUsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUNuQix5QkFBeUIsRUFBRSxJQUFJO1lBQy9CLDBDQUEwQyxFQUFFLENBQUMsWUFBWSxFQUFFLGlCQUFpQixDQUFDO1NBQ2hGO1FBQ0QsT0FBTyxFQUFFO1lBQ0wsWUFBWSxFQUFFLElBQUk7WUFDbEIsVUFBVSxFQUFFLElBQUk7WUFDaEIseUJBQXlCLEVBQUUsSUFBSTtZQUMvQiwwQ0FBMEMsRUFBRSxDQUFDLFlBQVksRUFBRSxpQkFBaUIsQ0FBQztTQUNoRjtRQUNELFFBQVEsRUFBRTtZQUNOLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLHlCQUF5QixFQUFFLElBQUk7WUFDL0IsMENBQTBDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsaUJBQWlCLENBQUM7U0FDaEY7UUFDRCxNQUFNLEVBQUU7WUFDSixZQUFZLEVBQUUsSUFBSTtZQUNsQixVQUFVLEVBQUUsSUFBSTtZQUNoQix5QkFBeUIsRUFBRSxLQUFLO1NBQ25DO1FBQ0QsTUFBTSxFQUFFO1lBQ0osWUFBWSxFQUFFLENBQUMsTUFBTSxDQUFDO1lBQ3RCLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLHlCQUF5QixFQUFFLElBQUk7U0FDbEM7UUFDRCxLQUFLLEVBQUU7WUFDSCxZQUFZLEVBQUUsSUFBSTtZQUNsQixVQUFVLEVBQUUsSUFBSTtZQUNoQix5QkFBeUIsRUFBRSxLQUFLO1NBQ25DO1FBQ0QsTUFBTSxFQUFFO1lBQ0osWUFBWSxFQUFFLElBQUk7WUFDbEIsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ25CLHlCQUF5QixFQUFFLElBQUk7WUFDL0IsMENBQTBDLEVBQUUsQ0FBQyxZQUFZLEVBQUUsaUJBQWlCLENBQUM7U0FDaEY7UUFDRCxNQUFNLEVBQUU7WUFDSixZQUFZLEVBQUUsQ0FBQyxNQUFNLENBQUM7WUFDdEIsVUFBVSxFQUFFLElBQUk7WUFDaEIseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELE1BQU0sRUFBRTtZQUNKLFlBQVksRUFBRSxDQUFDLE1BQU0sQ0FBQztZQUN0QixVQUFVLEVBQUUsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUM7WUFDdkgseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELE1BQU0sRUFBRTtZQUNKLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLHlCQUF5QixFQUFFLEtBQUs7U0FDbkM7UUFDRCxPQUFPLEVBQUU7WUFDTCxZQUFZLEVBQUUsQ0FBQyxPQUFPLENBQUM7WUFDdkIsVUFBVSxFQUFFLElBQUk7WUFDaEIseUJBQXlCLEVBQUUsSUFBSTtZQUMvQiw2QkFBNkIsRUFBRSxDQUFDLGVBQWUsRUFBRSxlQUFlLENBQUM7WUFDakUsK0JBQStCLEVBQUUsS0FBSztTQUN6QztRQUNELEtBQUssRUFBRTtZQUNILFlBQVksRUFBRSxDQUFDLFlBQVksQ0FBQztZQUM1QixVQUFVLEVBQUUsQ0FBQyxXQUFXLEVBQUUsY0FBYyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsY0FBYyxDQUFDO1lBQzFHLHlCQUF5QixFQUFFLElBQUk7U0FDbEM7UUFDRCxVQUFVLEVBQUU7WUFDUixZQUFZLEVBQUUsSUFBSTtZQUNsQixVQUFVLEVBQUUsSUFBSTtZQUNoQix5QkFBeUIsRUFBRSxLQUFLO1NBQ25DO1FBQ0QsUUFBUSxFQUFFO1lBQ04sWUFBWSxFQUFFLElBQUk7WUFDbEIsVUFBVSxFQUFFLENBQUMsYUFBYSxFQUFFLFVBQVUsRUFBRSxLQUFLLENBQUM7WUFDOUMseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELElBQUksRUFBRTtZQUNGLFlBQVksRUFBRSxDQUFDLE1BQU0sQ0FBQztZQUN0QixVQUFVLEVBQUUsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUM7WUFDdkgseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELFVBQVUsRUFBRTtZQUNSLFlBQVksRUFBRSxDQUFDLE9BQU8sQ0FBQztZQUN2QixVQUFVLEVBQUUsSUFBSTtZQUNoQix5QkFBeUIsRUFBRSxJQUFJO1NBQ2xDO1FBQ0QsUUFBUSxFQUFFO1lBQ04sWUFBWSxFQUFFLENBQUMsUUFBUSxDQUFDO1lBQ3hCLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLHlCQUF5QixFQUFFLElBQUk7WUFDL0IsNkJBQTZCLEVBQUUsQ0FBQyxlQUFlLENBQUM7U0FDbkQ7UUFDRCxRQUFRLEVBQUU7WUFDTixZQUFZLEVBQUUsQ0FBQyxRQUFRLENBQUM7WUFDeEIsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ25CLHlCQUF5QixFQUFFLElBQUk7U0FDbEM7UUFDRCxHQUFHLEVBQUU7WUFDRCxZQUFZLEVBQUUsQ0FBQyxXQUFXLENBQUM7WUFDM0IsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ25CLHlCQUF5QixFQUFFLElBQUk7U0FDbEM7UUFDRCxPQUFPLEVBQUU7WUFDTCxZQUFZLEVBQUUsSUFBSTtZQUNsQixVQUFVLEVBQUUsSUFBSTtZQUNoQix5QkFBeUIsRUFBRSxLQUFLO1NBQ25DO1FBQ0QsU0FBUyxFQUFFO1lBQ1AsWUFBWSxFQUFFLElBQUk7WUFDbEIsVUFBVSxFQUFFLElBQUk7WUFDaEIseUJBQXlCLEVBQUUsS0FBSztZQUNoQywwQkFBMEIsRUFBRSxDQUFDLGFBQWEsQ0FBQztTQUM5QztRQUNELEtBQUssRUFBRTtZQUNILFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQztZQUN6QixVQUFVLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDbkIseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELFVBQVUsRUFBRTtZQUNSLFlBQVksRUFBRSxDQUFDLGFBQWEsQ0FBQztZQUM3QixVQUFVLEVBQUUsSUFBSTtZQUNoQix5QkFBeUIsRUFBRSxJQUFJO1lBQy9CLDZCQUE2QixFQUFFLENBQUMsZUFBZSxDQUFDO1NBQ25EO1FBQ0QsR0FBRyxFQUFFO1lBQ0QsWUFBWSxFQUFFLENBQUMsU0FBUyxDQUFDO1lBQ3pCLFVBQVUsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUNuQix5QkFBeUIsRUFBRSxJQUFJO1NBQ2xDO1FBQ0QsSUFBSSxFQUFFO1lBQ0YsWUFBWSxFQUFFLElBQUk7WUFDbEIsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ25CLHlCQUF5QixFQUFFLElBQUk7U0FDbEM7UUFDRCxJQUFJLEVBQUU7WUFDRixZQUFZLEVBQUUsSUFBSTtZQUNsQixVQUFVLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDbkIseUJBQXlCLEVBQUUsSUFBSTtZQUMvQiwwQ0FBMEMsRUFBRSxDQUFDLFlBQVksRUFBRSxpQkFBaUIsQ0FBQztTQUNoRjtRQUNELE1BQU0sRUFBRTtZQUNKLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFVBQVUsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUNuQix5QkFBeUIsRUFBRSxJQUFJO1NBQ2xDO1FBQ0QsR0FBRyxFQUFFO1lBQ0QsWUFBWSxFQUFFLENBQUMsVUFBVSxDQUFDO1lBQzFCLFVBQVUsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUNuQix5QkFBeUIsRUFBRSxJQUFJO1lBQy9CLDZCQUE2QixFQUFFLENBQUMsWUFBWSxFQUFFLGlCQUFpQixDQUFDO1NBQ25FO1FBQ0QsTUFBTSxFQUFFO1lBQ0osWUFBWSxFQUFFLENBQUMsU0FBUyxDQUFDO1lBQ3pCLFVBQVUsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUNuQix5QkFBeUIsRUFBRSxJQUFJO1NBQ2xDO1FBQ0QsUUFBUSxFQUFFO1lBQ04sWUFBWSxFQUFFLElBQUk7WUFDbEIsVUFBVSxFQUFFLElBQUk7WUFDaEIseUJBQXlCLEVBQUUsS0FBSztTQUNuQztRQUNELFFBQVEsRUFBRTtZQUNOLFlBQVksRUFBRSxDQUFDLFFBQVEsQ0FBQztZQUN4QixVQUFVLEVBQUUsQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFLFFBQVEsQ0FBQztZQUN6RSx5QkFBeUIsRUFBRSxJQUFJO1NBQ2xDO1FBQ0QsTUFBTSxFQUFFO1lBQ0osWUFBWSxFQUFFLElBQUk7WUFDbEIsVUFBVSxFQUFFLElBQUk7WUFDaEIseUJBQXlCLEVBQUUsS0FBSztTQUNuQztRQUNELE9BQU8sRUFBRTtZQUNMLFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQztZQUN6QixVQUFVLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDbkIseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELFFBQVEsRUFBRTtZQUNOLFlBQVksRUFBRSxJQUFJO1lBQ2xCLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLHlCQUF5QixFQUFFLEtBQUs7U0FDbkM7UUFDRCxNQUFNLEVBQUU7WUFDSixZQUFZLEVBQUUsQ0FBQyxTQUFTLENBQUM7WUFDekIsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ25CLHlCQUF5QixFQUFFLElBQUk7U0FDbEM7UUFDRCxRQUFRLEVBQUU7WUFDTixZQUFZLEVBQUUsQ0FBQyxRQUFRLENBQUM7WUFDeEIsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ25CLHlCQUF5QixFQUFFLElBQUk7U0FDbEM7UUFDRCxPQUFPLEVBQUU7WUFDTCxZQUFZLEVBQUUsSUFBSTtZQUNsQixVQUFVLEVBQUUsSUFBSTtZQUNoQix5QkFBeUIsRUFBRSxLQUFLO1NBQ25DO1FBQ0QsS0FBSyxFQUFFO1lBQ0gsWUFBWSxFQUFFLENBQUMsV0FBVyxDQUFDO1lBQzNCLFVBQVUsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUNuQix5QkFBeUIsRUFBRSxJQUFJO1NBQ2xDO1FBQ0QsS0FBSyxFQUFFO1lBQ0gsWUFBWSxFQUFFLENBQUMsYUFBYSxDQUFDO1lBQzdCLFVBQVUsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUNuQix5QkFBeUIsRUFBRSxJQUFJO1NBQ2xDO1FBQ0QsS0FBSyxFQUFFO1lBQ0gsWUFBWSxFQUFFLENBQUMsbUJBQW1CLENBQUM7WUFDbkMsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ25CLHlCQUF5QixFQUFFLElBQUk7U0FDbEM7UUFDRCxPQUFPLEVBQUU7WUFDTCxZQUFZLEVBQUUsQ0FBQyxPQUFPLENBQUM7WUFDdkIsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ25CLHlCQUF5QixFQUFFLElBQUk7U0FDbEM7UUFDRCxVQUFVLEVBQUU7WUFDUixZQUFZLEVBQUUsSUFBSTtZQUNsQixVQUFVLEVBQUUsSUFBSTtZQUNoQix5QkFBeUIsRUFBRSxLQUFLO1NBQ25DO1FBQ0QsVUFBVSxFQUFFO1lBQ1IsWUFBWSxFQUFFLENBQUMsU0FBUyxDQUFDO1lBQ3pCLFVBQVUsRUFBRSxJQUFJO1lBQ2hCLHlCQUF5QixFQUFFLElBQUk7U0FDbEM7UUFDRCxPQUFPLEVBQUU7WUFDTCxZQUFZLEVBQUUsQ0FBQyxVQUFVLENBQUM7WUFDMUIsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ25CLHlCQUF5QixFQUFFLElBQUk7U0FDbEM7UUFDRCxPQUFPLEVBQUU7WUFDTCxZQUFZLEVBQUUsQ0FBQyxVQUFVLENBQUM7WUFDMUIsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ25CLHlCQUF5QixFQUFFLElBQUk7U0FDbEM7UUFDRCxNQUFNLEVBQUU7WUFDSixZQUFZLEVBQUUsQ0FBQyxNQUFNLENBQUM7WUFDdEIsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ25CLHlCQUF5QixFQUFFLElBQUk7U0FDbEM7UUFDRCxPQUFPLEVBQUU7WUFDTCxZQUFZLEVBQUUsSUFBSTtZQUNsQixVQUFVLEVBQUUsSUFBSTtZQUNoQix5QkFBeUIsRUFBRSxLQUFLO1NBQ25DO1FBQ0QsT0FBTyxFQUFFO1lBQ0wsWUFBWSxFQUFFLElBQUk7WUFDbEIsVUFBVSxFQUFFLElBQUk7WUFDaEIseUJBQXlCLEVBQUUsS0FBSztTQUNuQztRQUNELEdBQUcsRUFBRTtZQUNELFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQztZQUN6QixVQUFVLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDbkIseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELElBQUksRUFBRTtZQUNGLFlBQVksRUFBRSxDQUFDLE1BQU0sQ0FBQztZQUN0QixVQUFVLEVBQUUsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUM7WUFDdkgseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztRQUNELEtBQUssRUFBRTtZQUNILFlBQVksRUFBRSxJQUFJO1lBQ2xCLFVBQVUsRUFBRSxDQUFDLEtBQUssQ0FBQztZQUNuQix5QkFBeUIsRUFBRSxJQUFJO1lBQy9CLDBDQUEwQyxFQUFFLENBQUMsWUFBWSxFQUFFLGlCQUFpQixDQUFDO1NBQ2hGO1FBQ0QsT0FBTyxFQUFFO1lBQ0wsWUFBWSxFQUFFLElBQUk7WUFDbEIsVUFBVSxFQUFFLENBQUMsYUFBYSxDQUFDO1lBQzNCLHlCQUF5QixFQUFFLElBQUk7U0FDbEM7UUFDRCxLQUFLLEVBQUU7WUFDSCxZQUFZLEVBQUUsSUFBSTtZQUNsQixVQUFVLEVBQUUsQ0FBQyxNQUFNLEVBQUUsY0FBYyxDQUFDO1lBQ3BDLHlCQUF5QixFQUFFLEtBQUs7WUFDaEMsMEJBQTBCLEVBQUUsQ0FBQyxhQUFhLENBQUM7U0FDOUM7S0FDSixFQUFDLHFDQUFxQztJQUVoQyx5REFBeUMsR0FJNUM7UUFDQSxHQUFHLEVBQUU7WUFDRCxXQUFXLEVBQUU7Z0JBQ1QsWUFBWSxFQUFFLENBQUMsTUFBTSxDQUFDO2dCQUN0Qiw2REFBNkQ7Z0JBQzdELFVBQVUsRUFBRSxDQUFDLFFBQVEsRUFBRSxVQUFVLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBRSxrQkFBa0IsRUFBRSxlQUFlLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFVBQVUsQ0FBQztnQkFDbk0seUJBQXlCLEVBQUUsSUFBSTtnQkFDL0IsNkJBQTZCLEVBQUUsQ0FBQyxvQkFBb0IsQ0FBQzthQUN4RDtZQUNELGNBQWMsRUFBRTtnQkFDWixZQUFZLEVBQUUsQ0FBQyxTQUFTLENBQUM7Z0JBQ3pCLHVEQUF1RDtnQkFDdkQsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDO2dCQUNuQix5QkFBeUIsRUFBRSxJQUFJO2FBQ2xDO1NBQ0o7UUFDRCxNQUFNLEVBQUU7WUFDSixXQUFXLEVBQUU7Z0JBQ1QsWUFBWSxFQUFFLENBQUMsTUFBTSxDQUFDO2dCQUN0Qiw2REFBNkQ7Z0JBQzdELFVBQVUsRUFBRSxJQUFJO2dCQUNoQix5QkFBeUIsRUFBRSxJQUFJO2FBQ2xDO1lBQ0QsY0FBYyxFQUFFO2dCQUNaLFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQztnQkFDekIsdURBQXVEO2dCQUN2RCxVQUFVLEVBQUUsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDO2dCQUM5Qix5QkFBeUIsRUFBRSxJQUFJO2FBQ2xDO1NBQ0o7UUFDVCxPQUFPO1FBQ1Asd0NBQXdDO1FBQ3hDLG9IQUFvSDtRQUNwSCxtR0FBbUc7UUFDbkcsNkNBQTZDO1FBQzdDLFlBQVk7UUFDSixLQUFLLEVBQUU7WUFDSCxVQUFVLEVBQUU7Z0JBQ1IsWUFBWSxFQUFFLENBQUMsU0FBUyxDQUFDO2dCQUN6QixVQUFVLEVBQUUsQ0FBQyxjQUFjLEVBQUUsTUFBTSxDQUFDO2dCQUNwQyx5QkFBeUIsRUFBRSxJQUFJO2FBQ2xDO1lBQ0QsYUFBYSxFQUFFO2dCQUNYLFlBQVksRUFBRSxDQUFDLFNBQVMsQ0FBQztnQkFDekIsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDO2dCQUNuQix5QkFBeUIsRUFBRSxJQUFJO2FBQ2xDO1NBQ0o7UUFDRCxRQUFRLEVBQUU7WUFDTixrQkFBa0IsRUFBRTtnQkFDaEIsWUFBWSxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQUN4QixVQUFVLEVBQUUsQ0FBQyxhQUFhLENBQUM7Z0JBQzNCLHlCQUF5QixFQUFFLElBQUk7YUFDbEM7WUFDRCxxQkFBcUIsRUFBRTtnQkFDbkIsWUFBWSxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQUN4QixVQUFVLEVBQUUsQ0FBQyxLQUFLLENBQUM7Z0JBQ25CLHlCQUF5QixFQUFFLElBQUk7YUFDbEM7U0FDSjtRQUNELFFBQVEsRUFBRTtZQUNOLG9DQUFvQyxFQUFFO2dCQUNsQyxZQUFZLEVBQUUsQ0FBQyxTQUFTLENBQUM7Z0JBQ3pCLHVGQUF1RjtnQkFDdkYsVUFBVSxFQUFFLENBQUMsY0FBYyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsY0FBYyxDQUFDO2dCQUM3RCx5QkFBeUIsRUFBRSxJQUFJO2FBQ2xDO1lBQ0QsT0FBTyxFQUFFO2dCQUNMLFlBQVksRUFBRSxDQUFDLGFBQWEsQ0FBQztnQkFDN0IsNkZBQTZGO2dCQUM3RixVQUFVLEVBQUUsQ0FBQyxjQUFjLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxjQUFjLENBQUM7Z0JBQzdELHlCQUF5QixFQUFFLElBQUk7YUFDbEM7U0FDSjtRQUNULE9BQU87UUFDUCw2Q0FBNkM7UUFDN0Msd0dBQXdHO1FBQ3hHLGlRQUFpUTtRQUNqUSw2Q0FBNkM7UUFDN0MsWUFBWTtRQUVKLFFBQVEsRUFBRTtZQUNOLG9DQUFvQyxFQUFFO2dCQUNsQyxZQUFZLEVBQUUsQ0FBQyxTQUFTLENBQUM7Z0JBQ3pCLHVGQUF1RjtnQkFDdkYsVUFBVSxFQUFFLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxjQUFjLENBQUM7Z0JBQzdDLHlCQUF5QixFQUFFLElBQUk7YUFDbEM7WUFDRCxPQUFPLEVBQUU7Z0JBQ0wsWUFBWSxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQUN4Qiw2RkFBNkY7Z0JBQzdGLFVBQVUsRUFBRSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsY0FBYyxDQUFDO2dCQUM3Qyx5QkFBeUIsRUFBRSxJQUFJO2FBQ2xDO1NBRUo7UUFDRCxLQUFLLEVBQUU7WUFDSCxrQkFBa0IsRUFBRTtnQkFDaEIsWUFBWSxFQUFFLENBQUMsS0FBSyxDQUFDO2dCQUNyQixpREFBaUQ7Z0JBQ2pELFVBQVUsRUFBRSxDQUFDLFFBQVEsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsa0JBQWtCLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFVBQVUsQ0FBQztnQkFDcE4seUJBQXlCLEVBQUUsSUFBSTthQUNsQztZQUNELCtCQUErQixFQUFFO2dCQUM3QixZQUFZLEVBQUUsQ0FBQyxjQUFjLEVBQUUsTUFBTSxDQUFDO2dCQUN0QywrREFBK0Q7Z0JBQy9ELFVBQVUsRUFBRSxJQUFJO2dCQUNoQix5QkFBeUIsRUFBRSxLQUFLO2dCQUNoQywwQkFBMEIsRUFBRSxDQUFDLGtCQUFrQixDQUFDO2FBQ25EO1lBQ0QsNEJBQTRCLEVBQUU7Z0JBQzFCLFlBQVksRUFBRSxDQUFDLEtBQUssQ0FBQztnQkFDckIsZ0VBQWdFO2dCQUNoRSxVQUFVLEVBQUUsQ0FBQyxjQUFjLEVBQUUsTUFBTSxDQUFDO2dCQUNwQyx5QkFBeUIsRUFBRSxLQUFLO2dCQUNoQywwQkFBMEIsRUFBRSxDQUFDLGtCQUFrQixDQUFDO2FBQ25EO1NBQ0o7UUFDRCxPQUFPLEVBQUU7WUFDTCxRQUFRLEVBQUU7Z0JBQ04sWUFBWSxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQUN4QixVQUFVLEVBQUUsQ0FBQyxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLGtCQUFrQixFQUFFLGVBQWUsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFVBQVUsQ0FBQztnQkFDbksseUJBQXlCLEVBQUUsSUFBSTthQUNsQztZQUNELDRCQUE0QixFQUFFO2dCQUMxQixZQUFZLEVBQUUsQ0FBQyxVQUFVLENBQUM7Z0JBQzFCLDZFQUE2RTtnQkFDN0UsVUFBVSxFQUFFLENBQUMsa0JBQWtCLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUM7Z0JBQzlELHlCQUF5QixFQUFFLElBQUk7Z0JBQy9CLDBCQUEwQixFQUFFLENBQUMsZUFBZSxDQUFDO2dCQUM3Qyw2QkFBNkIsRUFBRSxDQUFDLGNBQWMsQ0FBQzthQUNsRDtZQUNELCtCQUErQixFQUFFO2dCQUM3QixZQUFZLEVBQUUsQ0FBQyxVQUFVLENBQUM7Z0JBQzFCLGlGQUFpRjtnQkFDakYsVUFBVSxFQUFFLENBQUMsa0JBQWtCLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQztnQkFDcEQseUJBQXlCLEVBQUUsSUFBSTtnQkFDL0IsMEJBQTBCLEVBQUUsQ0FBQyxlQUFlLENBQUM7Z0JBQzdDLDZCQUE2QixFQUFFLENBQUMsY0FBYyxDQUFDO2FBQ2xEO1lBQ0QsT0FBTyxFQUFFO2dCQUNMLFlBQVksRUFBRSxJQUFJO2dCQUNsQixVQUFVLEVBQUUsSUFBSTtnQkFDaEIseUJBQXlCLEVBQUUsSUFBSTthQUNsQztZQUNELE1BQU0sRUFBRTtnQkFDSixZQUFZLEVBQUUsSUFBSTtnQkFDbEIsVUFBVSxFQUFFLElBQUk7Z0JBQ2hCLHlCQUF5QixFQUFFLElBQUk7Z0JBQy9CLDBCQUEwQixFQUFFLENBQUMsZUFBZSxFQUFFLGVBQWUsQ0FBQztnQkFDOUQsdUJBQXVCLEVBQUUsQ0FBQyxTQUFTLENBQUM7YUFDdkM7WUFDRCxnQkFBZ0IsRUFBRTtnQkFDZCxZQUFZLEVBQUUsSUFBSTtnQkFDbEIsVUFBVSxFQUFFLElBQUk7Z0JBQ2hCLHlCQUF5QixFQUFFLElBQUk7Z0JBQy9CLDBCQUEwQixFQUFFLENBQUMsZUFBZSxFQUFFLGVBQWUsQ0FBQztnQkFDOUQsdUJBQXVCLEVBQUUsQ0FBQyxTQUFTLENBQUM7YUFDdkM7WUFDRCxlQUFlLEVBQUU7Z0JBQ2IsWUFBWSxFQUFFLENBQUMsU0FBUyxDQUFDO2dCQUN6QixxRUFBcUU7Z0JBQ3JFLFVBQVUsRUFBRSxJQUFJO2dCQUNoQix5QkFBeUIsRUFBRSxJQUFJO2dCQUMvQiwwQkFBMEIsRUFBRSxDQUFDLGtCQUFrQixFQUFFLGVBQWUsRUFBRSxlQUFlLENBQUM7Z0JBQ2xGLHVCQUF1QixFQUFFLENBQUMsU0FBUyxDQUFDO2FBQ3ZDO1lBQ0QsaUJBQWlCLEVBQUU7Z0JBQ2YsWUFBWSxFQUFFLENBQUMsVUFBVSxDQUFDO2dCQUMxQixVQUFVLEVBQUUsSUFBSTtnQkFDaEIseUJBQXlCLEVBQUUsSUFBSTthQUNsQztZQUNELE1BQU0sRUFBRTtnQkFDSixZQUFZLEVBQUUsSUFBSTtnQkFDbEIsVUFBVSxFQUFFLElBQUk7Z0JBQ2hCLHlCQUF5QixFQUFFLElBQUk7Z0JBQy9CLDBCQUEwQixFQUFFLENBQUMsZUFBZSxDQUFDO2FBQ2hEO1lBQ0QsUUFBUSxFQUFFO2dCQUNOLFlBQVksRUFBRSxJQUFJO2dCQUNsQixVQUFVLEVBQUUsSUFBSTtnQkFDaEIseUJBQXlCLEVBQUUsS0FBSzthQUNuQztZQUNELE9BQU8sRUFBRTtnQkFDTCxZQUFZLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBQ3hCLFVBQVUsRUFBRSxDQUFDLFVBQVUsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxrQkFBa0IsRUFBRSxlQUFlLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxVQUFVLENBQUM7Z0JBQ3ZKLHlCQUF5QixFQUFFLElBQUk7YUFDbEM7WUFDRCxPQUFPLEVBQUU7Z0JBQ0wsWUFBWSxFQUFFLElBQUk7Z0JBQ2xCLFVBQVUsRUFBRSxJQUFJO2dCQUNoQix5QkFBeUIsRUFBRSxJQUFJO2dCQUMvQiwwQkFBMEIsRUFBRSxDQUFDLGVBQWUsQ0FBQztnQkFDN0MsdUJBQXVCLEVBQUUsQ0FBQyxTQUFTLENBQUM7YUFDdkM7WUFDRCxRQUFRLEVBQUU7Z0JBQ04sWUFBWSxFQUFFLENBQUMsWUFBWSxDQUFDO2dCQUM1QixVQUFVLEVBQUUsSUFBSTtnQkFDaEIseUJBQXlCLEVBQUUsSUFBSTtnQkFDL0IsMEJBQTBCLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxlQUFlLEVBQUUsZUFBZSxDQUFDO2FBQ3JGO1lBQ0QsVUFBVSxFQUFFO2dCQUNSLFlBQVksRUFBRSxJQUFJO2dCQUNsQixVQUFVLEVBQUUsSUFBSTtnQkFDaEIseUJBQXlCLEVBQUUsSUFBSTtnQkFDL0IsMEJBQTBCLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxlQUFlLEVBQUUsZUFBZSxDQUFDO2dCQUNsRix1QkFBdUIsRUFBRSxDQUFDLFNBQVMsQ0FBQzthQUN2QztZQUNELE9BQU8sRUFBRTtnQkFDTCxZQUFZLEVBQUUsQ0FBQyxPQUFPLENBQUM7Z0JBQ3ZCLFVBQVUsRUFBRSxDQUFDLGVBQWUsQ0FBQztnQkFDN0IseUJBQXlCLEVBQUUsSUFBSTtnQkFDL0IsMEJBQTBCLEVBQUUsQ0FBQyxlQUFlLENBQUM7Z0JBQzdDLDZCQUE2QixFQUFFLENBQUMsY0FBYyxDQUFDO2FBQ2xEO1lBQ0QsT0FBTyxFQUFFO2dCQUNMLFlBQVksRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFDeEIsVUFBVSxFQUFFLElBQUk7Z0JBQ2hCLHlCQUF5QixFQUFFLElBQUk7Z0JBQy9CLDZCQUE2QixFQUFFLENBQUMsZUFBZSxFQUFFLGVBQWUsQ0FBQzthQUNwRTtZQUNELE9BQU8sRUFBRTtnQkFDTCxZQUFZLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBQ3hCLFVBQVUsRUFBRSxDQUFDLFVBQVUsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsa0JBQWtCLEVBQUUsZUFBZSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsVUFBVSxDQUFDO2dCQUNuSyx5QkFBeUIsRUFBRSxJQUFJO2FBQ2xDO1lBQ0QsZ0JBQWdCLEVBQUU7Z0JBQ2QsWUFBWSxFQUFFLENBQUMsV0FBVyxDQUFDO2dCQUMzQixVQUFVLEVBQUUsSUFBSTtnQkFDaEIseUJBQXlCLEVBQUUsSUFBSTtnQkFDL0IsMEJBQTBCLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxlQUFlLEVBQUUsZUFBZSxDQUFDO2FBQ3JGO1lBQ0Qsa0JBQWtCLEVBQUU7Z0JBQ2hCLFlBQVksRUFBRSxDQUFDLFVBQVUsQ0FBQztnQkFDMUIsVUFBVSxFQUFFLElBQUk7Z0JBQ2hCLHlCQUF5QixFQUFFLElBQUk7YUFDbEM7WUFDRCxRQUFRLEVBQUU7Z0JBQ04sWUFBWSxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQUN4QixVQUFVLEVBQUUsQ0FBQyxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLGtCQUFrQixFQUFFLGVBQWUsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFVBQVUsQ0FBQztnQkFDbksseUJBQXlCLEVBQUUsSUFBSTthQUNsQztZQUNELGFBQWEsRUFBRTtnQkFDWCxZQUFZLEVBQUUsQ0FBQyxTQUFTLENBQUM7Z0JBQ3pCLFVBQVUsRUFBRSxJQUFJO2dCQUNoQix5QkFBeUIsRUFBRSxJQUFJO2dCQUMvQiwwQkFBMEIsRUFBRSxDQUFDLGtCQUFrQixFQUFFLGVBQWUsRUFBRSxlQUFlLENBQUM7YUFDckY7WUFDRCxlQUFlLEVBQUU7Z0JBQ2IsWUFBWSxFQUFFLENBQUMsVUFBVSxDQUFDO2dCQUMxQixVQUFVLEVBQUUsSUFBSTtnQkFDaEIseUJBQXlCLEVBQUUsSUFBSTthQUNsQztZQUNELGNBQWMsRUFBRTtnQkFDWixZQUFZLEVBQUUsQ0FBQyxTQUFTLENBQUM7Z0JBQ3pCLFVBQVUsRUFBRSxDQUFDLFVBQVUsRUFBRSxXQUFXLEVBQUUsWUFBWSxDQUFDO2dCQUNuRCx5QkFBeUIsRUFBRSxJQUFJO2dCQUMvQiwwQkFBMEIsRUFBRSxDQUFDLGtCQUFrQixFQUFFLGVBQWUsRUFBRSxlQUFlLENBQUM7YUFDckY7WUFDRCxnQkFBZ0IsRUFBRTtnQkFDZCxZQUFZLEVBQUUsQ0FBQyxVQUFVLENBQUM7Z0JBQzFCLFVBQVUsRUFBRSxJQUFJO2dCQUNoQix5QkFBeUIsRUFBRSxJQUFJO2dCQUMvQixtRkFBbUY7YUFDdEY7WUFDRCxNQUFNLEVBQUU7Z0JBQ0osWUFBWSxFQUFFLElBQUk7Z0JBQ2xCLFVBQVUsRUFBRSxJQUFJO2dCQUNoQix5QkFBeUIsRUFBRSxJQUFJO2dCQUMvQiwwQkFBMEIsRUFBRSxDQUFDLGVBQWUsQ0FBQztnQkFDN0MsdUJBQXVCLEVBQUUsQ0FBQyxTQUFTLENBQUM7YUFDdkM7WUFDRCxhQUFhLEVBQUU7Z0JBQ1gsWUFBWSxFQUFFLENBQUMsU0FBUyxDQUFDO2dCQUN6QixVQUFVLEVBQUUsSUFBSTtnQkFDaEIseUJBQXlCLEVBQUUsSUFBSTtnQkFDL0IsMEJBQTBCLEVBQUUsQ0FBQyxrQkFBa0IsRUFBRSxlQUFlLEVBQUUsZUFBZSxDQUFDO2FBQ3JGO1lBQ0QsZUFBZSxFQUFFO2dCQUNiLFlBQVksRUFBRSxDQUFDLFVBQVUsQ0FBQztnQkFDMUIsVUFBVSxFQUFFLElBQUk7Z0JBQ2hCLHlCQUF5QixFQUFFLElBQUk7YUFDbEM7WUFDRCxNQUFNLEVBQUU7Z0JBQ0osWUFBWSxFQUFFLElBQUk7Z0JBQ2xCLFVBQVUsRUFBRSxJQUFJO2dCQUNoQix5QkFBeUIsRUFBRSxJQUFJO2dCQUMvQiwwQkFBMEIsRUFBRSxDQUFDLGVBQWUsQ0FBQztnQkFDN0MsdUJBQXVCLEVBQUUsQ0FBQyxTQUFTLENBQUM7YUFDdkM7WUFDRCxtQkFBbUIsRUFBRTtnQkFDakIsOERBQThEO2dCQUM5RCxZQUFZLEVBQUUsQ0FBQyxVQUFVLENBQUM7Z0JBQzFCLFVBQVUsRUFBRSxJQUFJO2dCQUNoQix5QkFBeUIsRUFBRSxJQUFJO2FBQ2xDO1lBQ0QsaUJBQWlCLEVBQUU7Z0JBQ2YsOERBQThEO2dCQUM5RCxZQUFZLEVBQUUsQ0FBQyxTQUFTLENBQUM7Z0JBQ3pCLFVBQVUsRUFBRSxJQUFJO2dCQUNoQix5QkFBeUIsRUFBRSxJQUFJO2FBQ2xDO1NBQ0o7UUFDRCxJQUFJLEVBQUU7WUFDRixvQkFBb0IsRUFBRTtnQkFDbEIsWUFBWSxFQUFFLENBQUMsVUFBVSxDQUFDO2dCQUMxQixVQUFVLEVBQUUsSUFBSTtnQkFDaEIseUJBQXlCLEVBQUUsSUFBSTthQUNsQztZQUNELHVCQUF1QixFQUFFO2dCQUNyQixZQUFZLEVBQUUsQ0FBQyxTQUFTLENBQUM7Z0JBQ3pCLFVBQVUsRUFBRSxDQUFDLEtBQUssQ0FBQztnQkFDbkIseUJBQXlCLEVBQUUsSUFBSTthQUNsQztTQUNKO1FBQ0QsU0FBUyxFQUFFO1lBQ1AsV0FBVyxFQUFFO2dCQUNULFlBQVksRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFDeEIsVUFBVSxFQUFFLENBQUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLGNBQWMsRUFBRSxxQkFBcUIsRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQUUsZ0JBQWdCLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxnQkFBZ0IsRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQUUsZUFBZSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDO2dCQUN0cUIseUJBQXlCLEVBQUUsSUFBSTthQUNsQztZQUNELGNBQWMsRUFBRTtnQkFDWixZQUFZLEVBQUUsSUFBSTtnQkFDbEIsVUFBVSxFQUFFLENBQUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLGNBQWMsRUFBRSxxQkFBcUIsRUFBRSxlQUFlLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQUUsZ0JBQWdCLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxnQkFBZ0IsRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQUUsZUFBZSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDO2dCQUN0cUIseUJBQXlCLEVBQUUsSUFBSTthQUNsQztTQUNKO1FBQ0QsUUFBUSxFQUFFO1lBQ04sMkJBQTJCLEVBQUU7Z0JBQ3pCLDZGQUE2RjtnQkFDN0YsWUFBWSxFQUFFLENBQUMsVUFBVSxDQUFDO2dCQUMxQixVQUFVLEVBQUUsQ0FBQyxNQUFNLENBQUM7Z0JBQ3BCLHlCQUF5QixFQUFFLElBQUk7Z0JBQy9CLDZCQUE2QixFQUFFLENBQUMsc0JBQXNCLENBQUM7YUFDMUQ7WUFDRCx3QkFBd0IsRUFBRTtnQkFDdEIsZ0dBQWdHO2dCQUNoRyxZQUFZLEVBQUUsQ0FBQyxTQUFTLENBQUM7Z0JBQ3pCLFVBQVUsRUFBRSxJQUFJO2dCQUNoQix5QkFBeUIsRUFBRSxJQUFJO2dCQUMvQiw2QkFBNkIsRUFBRSxDQUFDLHNCQUFzQixDQUFDO2FBQzFEO1NBQ0o7UUFDRCxTQUFTLEVBQUU7WUFDUCx5QkFBeUIsRUFBRTtnQkFDdkIsWUFBWSxFQUFFLElBQUk7Z0JBQ2xCLFVBQVUsRUFBRSxJQUFJO2dCQUNoQix5QkFBeUIsRUFBRSxJQUFJO2dCQUMvQiwwQkFBMEIsRUFBRSxDQUFDLGVBQWUsRUFBRSxlQUFlLENBQUM7YUFDakU7WUFDRCw0QkFBNEIsRUFBRTtnQkFDMUIsWUFBWSxFQUFFLElBQUk7Z0JBQ2xCLFVBQVUsRUFBRSxDQUFDLEtBQUssQ0FBQztnQkFDbkIseUJBQXlCLEVBQUUsSUFBSTthQUNsQztTQUNKO1FBQ0QsT0FBTyxFQUFFO1lBQ0wsV0FBVyxFQUFFO2dCQUNULFlBQVksRUFBRSxDQUFDLFVBQVUsQ0FBQztnQkFDMUIsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDO2dCQUNuQix5QkFBeUIsRUFBRSxJQUFJO2FBQ2xDO1lBQ0QsVUFBVSxFQUFFO2dCQUNSLFlBQVksRUFBRSxDQUFDLFVBQVUsQ0FBQztnQkFDMUIsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDO2dCQUNuQix5QkFBeUIsRUFBRSxJQUFJO2FBQ2xDO1lBQ0QsY0FBYyxFQUFFO2dCQUNaLFlBQVksRUFBRSxDQUFDLFVBQVUsQ0FBQztnQkFDMUIsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDO2dCQUNuQix5QkFBeUIsRUFBRSxJQUFJO2FBQ2xDO1lBQ0QsV0FBVyxFQUFFO2dCQUNULFlBQVksRUFBRSxJQUFJO2dCQUNsQixVQUFVLEVBQUUsQ0FBQyxLQUFLLENBQUM7Z0JBQ25CLHlCQUF5QixFQUFFLElBQUk7YUFDbEM7U0FDSjtRQUNELElBQUksRUFBRTtZQUNGLFdBQVcsRUFBRTtnQkFDVCxZQUFZLEVBQUUsQ0FBQyxNQUFNLENBQUM7Z0JBQ3RCLFVBQVUsRUFBRSxJQUFJO2dCQUNoQix5QkFBeUIsRUFBRSxJQUFJO2FBQ2xDO1lBQ0QsVUFBVSxFQUFFO2dCQUNSLFlBQVksRUFBRSxDQUFDLFVBQVUsQ0FBQztnQkFDMUIsVUFBVSxFQUFFLElBQUk7Z0JBQ2hCLHlCQUF5QixFQUFFLElBQUk7YUFDbEM7WUFDRCxjQUFjLEVBQUU7Z0JBQ1osWUFBWSxFQUFFLENBQUMsVUFBVSxDQUFDO2dCQUMxQixVQUFVLEVBQUUsSUFBSTtnQkFDaEIseUJBQXlCLEVBQUUsSUFBSTthQUNsQztZQUNELFdBQVcsRUFBRTtnQkFDVCxZQUFZLEVBQUUsSUFBSTtnQkFDbEIsVUFBVSxFQUFFLENBQUMsS0FBSyxDQUFDO2dCQUNuQix5QkFBeUIsRUFBRSxJQUFJO2FBQ2xDO1NBQ0o7UUFDRCxJQUFJLEVBQUU7WUFDRixxQkFBcUIsRUFBRTtnQkFDbkIsWUFBWSxFQUFFLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQztnQkFDbkMsVUFBVSxFQUFFLElBQUk7Z0JBQ2hCLHlCQUF5QixFQUFFLElBQUk7YUFDbEM7WUFDRCx3QkFBd0IsRUFBRTtnQkFDdEIsWUFBWSxFQUFFLENBQUMsY0FBYyxFQUFFLE1BQU0sQ0FBQztnQkFDdEMsVUFBVSxFQUFFLElBQUk7Z0JBQ2hCLHlCQUF5QixFQUFFLElBQUk7YUFDbEM7WUFDRCw2QkFBNkIsRUFBRTtnQkFDM0IsWUFBWSxFQUFFLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQztnQkFDdkMsVUFBVSxFQUFFLElBQUk7Z0JBQ2hCLHlCQUF5QixFQUFFLElBQUk7YUFDbEM7WUFDRCxnQ0FBZ0MsRUFBRTtnQkFDOUIsWUFBWSxFQUFFLENBQUMsY0FBYyxFQUFFLFVBQVUsQ0FBQztnQkFDMUMsVUFBVSxFQUFFLElBQUk7Z0JBQ2hCLHlCQUF5QixFQUFFLElBQUk7YUFDbEM7WUFDRCxXQUFXLEVBQUU7Z0JBQ1QsWUFBWSxFQUFFLElBQUk7Z0JBQ2xCLFVBQVUsRUFBRSxDQUFDLEtBQUssQ0FBQztnQkFDbkIseUJBQXlCLEVBQUUsSUFBSTthQUNsQztTQUNKO1FBQ0QsSUFBSSxFQUFFO1lBQ0YsV0FBVyxFQUFFO2dCQUNULFlBQVksRUFBRSxDQUFDLEtBQUssQ0FBQztnQkFDckIsVUFBVSxFQUFFLElBQUk7Z0JBQ2hCLHlCQUF5QixFQUFFLElBQUk7YUFDbEM7WUFDRCxVQUFVLEVBQUU7Z0JBQ1IsWUFBWSxFQUFFLENBQUMsS0FBSyxDQUFDO2dCQUNyQixVQUFVLEVBQUUsSUFBSTtnQkFDaEIseUJBQXlCLEVBQUUsSUFBSTthQUNsQztZQUNELGNBQWMsRUFBRTtnQkFDWixZQUFZLEVBQUUsQ0FBQyxLQUFLLENBQUM7Z0JBQ3JCLFVBQVUsRUFBRSxJQUFJO2dCQUNoQix5QkFBeUIsRUFBRSxJQUFJO2FBQ2xDO1lBQ0QsV0FBVyxFQUFFO2dCQUNULFlBQVksRUFBRSxJQUFJO2dCQUNsQixVQUFVLEVBQUUsQ0FBQyxLQUFLLENBQUM7Z0JBQ25CLHlCQUF5QixFQUFFLElBQUk7YUFDbEM7U0FDSjtRQUVELFNBQVMsRUFBRTtZQUNQLFlBQVksRUFBRSxJQUFJO1lBQ2xCLG9CQUFvQjtZQUNwQixVQUFVLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDbkIseUJBQXlCLEVBQUUsSUFBSTtTQUNsQztLQUNKLEVBQUMsbURBQW1EO0lBRXJELDRGQUE0RjtJQUM1Rix3R0FBd0c7SUFDeEcsNENBQTRDO0lBQ3JDLHlDQUF5QixHQWEzQjtRQUNELGNBQWMsRUFBRTtZQUNaLFFBQVEsRUFBRSxDQUFDO29CQUNQLGtCQUFrQixFQUFFLE9BQU87b0JBQzNCLGtCQUFrQixFQUFFLENBQUMsU0FBUyxDQUFDO29CQUMvQixtQkFBbUIsRUFBRSxJQUFJO2lCQUM1QixDQUFDO1lBQ0YsV0FBVyxFQUFFLENBQUM7b0JBQ1Ysa0JBQWtCLEVBQUUsTUFBTTtvQkFDMUIsa0JBQWtCLEVBQUUsQ0FBQyxTQUFTLENBQUM7b0JBQy9CLG1CQUFtQixFQUFFLElBQUk7aUJBQzVCLENBQUM7U0FDTDtRQUNELGVBQWUsRUFBRTtZQUNiLFFBQVEsRUFBRSxDQUFDO29CQUNQLGtCQUFrQixFQUFFLE9BQU87b0JBQzNCLGtCQUFrQixFQUFFLENBQUMsVUFBVSxDQUFDO29CQUNoQyxtQkFBbUIsRUFBRSxJQUFJO2lCQUM1QixDQUFDO1lBQ0YsV0FBVyxFQUFFLENBQUM7b0JBQ1Ysa0JBQWtCLEVBQUUsTUFBTTtvQkFDMUIsa0JBQWtCLEVBQUUsQ0FBQyxVQUFVLENBQUM7b0JBQ2hDLG1CQUFtQixFQUFFLElBQUk7aUJBQzVCLENBQUM7U0FDTDtRQUNELGFBQWEsRUFBRTtZQUNYLFFBQVEsRUFBRSxDQUFDO29CQUNQLGtCQUFrQixFQUFFLE9BQU87b0JBQzNCLGtCQUFrQixFQUFFLENBQUMsUUFBUSxDQUFDO29CQUM5QixtQkFBbUIsRUFBRSxDQUFDLGFBQWEsQ0FBQztpQkFDdkM7Z0JBQ0Q7b0JBQ0ksa0JBQWtCLEVBQUUsTUFBTTtvQkFDMUIsa0JBQWtCLEVBQUUsQ0FBQyxRQUFRLENBQUM7b0JBQzlCLG1CQUFtQixFQUFFLENBQUMsYUFBYSxDQUFDO2lCQUN2QyxDQUFDO1lBQ0YsV0FBVyxFQUFFLENBQUM7b0JBQ1Ysa0JBQWtCLEVBQUUsTUFBTTtvQkFDMUIsa0JBQWtCLEVBQUUsQ0FBQyxRQUFRLENBQUM7b0JBQzlCLG1CQUFtQixFQUFFLENBQUMsYUFBYSxDQUFDO2lCQUN2QyxDQUFDO1NBQ0w7UUFDRCxrQkFBa0IsRUFBRTtZQUNoQixRQUFRLEVBQUUsQ0FBQztvQkFDUCxrQkFBa0IsRUFBRSxJQUFJO29CQUN4QixrQkFBa0IsRUFBRSxDQUFDLGFBQWEsQ0FBQztvQkFDbkMsbUJBQW1CLEVBQUUsSUFBSTtpQkFDNUIsQ0FBQztTQUNMO1FBQ0QsZUFBZSxFQUFFO1lBQ2IsUUFBUSxFQUFFLENBQUM7b0JBQ1Asa0JBQWtCLEVBQUUsSUFBSTtvQkFDeEIsa0JBQWtCLEVBQUUsQ0FBQyxLQUFLLENBQUM7b0JBQzNCLG1CQUFtQixFQUFFLElBQUk7aUJBQzVCLENBQUM7WUFDRixrS0FBa0s7U0FDcks7UUFDRCxlQUFlLEVBQUU7WUFDYixRQUFRLEVBQUUsQ0FBQztvQkFDUCxrQkFBa0IsRUFBRSxJQUFJO29CQUN4QixrQkFBa0IsRUFBRSxDQUFDLEtBQUssQ0FBQztvQkFDM0IsbUJBQW1CLEVBQUUsSUFBSTtpQkFDNUIsQ0FBQztZQUNGLGtLQUFrSztTQUNySztRQUNELGVBQWUsRUFBRTtZQUNiLFFBQVEsRUFBRSxDQUFDO29CQUNQLGtCQUFrQixFQUFFLE9BQU87b0JBQzNCLGtCQUFrQixFQUFFLENBQUMsVUFBVSxFQUFFLGlCQUFpQixFQUFFLG1CQUFtQixDQUFDO29CQUN4RSxtQkFBbUIsRUFBRSxDQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDO2lCQUNoRCxDQUFDO1lBQ0YsV0FBVyxFQUFFLENBQUM7b0JBQ1Ysa0JBQWtCLEVBQUUsTUFBTTtvQkFDMUIsa0JBQWtCLEVBQUUsQ0FBQyxVQUFVLEVBQUUsaUJBQWlCLEVBQUUsbUJBQW1CLENBQUM7b0JBQ3hFLG1CQUFtQixFQUFFLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUM7aUJBQzlDLENBQUM7U0FDTDtRQUNELGVBQWUsRUFBRTtZQUNiLFFBQVEsRUFBRSxDQUFDO29CQUNQLGtCQUFrQixFQUFFLE9BQU87b0JBQzNCLGtCQUFrQixFQUFFLENBQUMsVUFBVSxDQUFDO29CQUNoQyxtQkFBbUIsRUFBRSxJQUFJO2lCQUM1QixDQUFDO1lBQ0YsV0FBVyxFQUFFLENBQUM7b0JBQ1Ysa0JBQWtCLEVBQUUsTUFBTTtvQkFDMUIsa0JBQWtCLEVBQUUsQ0FBQyxVQUFVLENBQUM7b0JBQ2hDLG1CQUFtQixFQUFFLElBQUk7aUJBQzVCLENBQUM7U0FDTDtRQUNELGNBQWMsRUFBRTtZQUNaLFFBQVEsRUFBRSxDQUFDO29CQUNQLCtDQUErQztvQkFDL0Msa0JBQWtCLEVBQUUsT0FBTztvQkFDM0Isa0JBQWtCLEVBQUUsQ0FBQyxTQUFTLENBQUM7b0JBQy9CLG1CQUFtQixFQUFFLENBQUMsT0FBTyxDQUFDO2lCQUNqQyxDQUFDO1lBQ0YsV0FBVyxFQUFFLENBQUM7b0JBQ1YsZ0NBQWdDO29CQUNoQyxrQkFBa0IsRUFBRSxJQUFJO29CQUN4QixrQkFBa0IsRUFBRSxDQUFDLFNBQVMsQ0FBQztvQkFDL0IsbUJBQW1CLEVBQUUsSUFBSTtpQkFDNUIsQ0FBQztTQUNMO1FBQ0QsY0FBYyxFQUFFO1lBQ1osUUFBUSxFQUFFLENBQUM7b0JBQ1AsK0NBQStDO29CQUMvQyxrQkFBa0IsRUFBRSxPQUFPO29CQUMzQixrQkFBa0IsRUFBRSxDQUFDLFNBQVMsQ0FBQztvQkFDL0IsbUJBQW1CLEVBQUUsQ0FBQyxPQUFPLENBQUM7aUJBQ2pDLENBQUM7WUFDRixXQUFXLEVBQUUsQ0FBQztvQkFDVixpQ0FBaUM7b0JBQ2pDLGtCQUFrQixFQUFFLElBQUk7b0JBQ3hCLGtCQUFrQixFQUFFLENBQUMsU0FBUyxDQUFDO29CQUMvQixtQkFBbUIsRUFBRSxJQUFJO2lCQUM1QixDQUFDO1NBQ0w7UUFDRDs7Ozs7OztZQU9JO0tBQ1A7SUFFTSwwQkFBVSxHQUFHLEVBQUU7SUFDMUIsc0JBQUM7Q0FBQTtBQWp5RlksMENBQWU7QUFpeUYzQixDQUFDO0FBRUYsSUFBSSxjQUFjLEdBQUcsRUFBRSxDQUFDO0FBRXhCLEtBQUssSUFBTSxVQUFVLElBQUksZUFBZSxDQUFDLGNBQWMsRUFBRTtJQUNyRCxJQUFNLFVBQVUsR0FBRyxlQUFlLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUN4RSxJQUFJLFVBQVUsS0FBSyxJQUFJLEVBQUU7UUFDckIsS0FBd0IsVUFBVSxFQUFWLHlCQUFVLEVBQVYsd0JBQVUsRUFBVixJQUFVLEVBQUU7WUFBL0IsSUFBTSxTQUFTO1lBQ2hCLElBQUksY0FBYyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRTtnQkFDekMsY0FBYyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQzthQUNsQztTQUNKO0tBQ0o7Q0FDSjtBQUNELGVBQWUsQ0FBQyxVQUFVLEdBQUcsY0FBYyxDQUFDOzs7Ozs7Ozs7Ozs7QUMvMEY1Qzs7Ozs7Ozs7Ozs7Ozs7K0VBYytFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFFL0UseUdBQW9EO0FBQ3BELDBHQUFzRDtBQUN0RCxxRkFBeUM7QUFDekMsc0dBQXNEO0FBQ3RELGdHQUFrRDtBQUNsRCxzSUFBc0U7QUFFdEUsMEZBQTBDO0FBQzFDLG1HQUFvRDtBQUNwRCwyRkFBNkM7QUFDN0MseUdBQXdEO0FBS3hEO0lBQWdDLDhCQUFZO0lBQTVDOztJQTZyQkEsQ0FBQztJQTVyQkcsd0NBQW1CLEdBQW5CLFVBQW9CLElBQVUsRUFBRSxJQUFZO1FBQ3hDLHFEQUFxRDtRQUNyRCxvQ0FBb0M7UUFDcEMseURBQXlEO1FBQ3pELHdCQUF3QjtRQUN4QixRQUFRO1FBQ1IsSUFBSTtRQUNKLE9BQU8sQ0FBQyxDQUFDLElBQUksSUFBSSxpQ0FBZSxDQUFDLGNBQWMsSUFBSSxpQ0FBZSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0lBQ3BILENBQUM7SUFDRCw0QkFBTyxHQUFQLFVBQVEsSUFBVTtRQUNkLElBQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDekMsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUNELGlDQUFZLEdBQVo7UUFDSSxPQUFPLE1BQU07SUFDakIsQ0FBQztJQUNELGtDQUFhLEdBQWIsVUFBYyxJQUFVO1FBQ3BCLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUNoQixJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssQ0FBQyxDQUFDLHVCQUF1QixFQUFFO1lBQzdDLElBQU0sUUFBUSxHQUFHLHFCQUFTLENBQUMsUUFBUSxDQUFDLElBQW1CLEVBQUUsMkJBQTJCLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDakcsSUFBSSxPQUFPLFFBQVEsS0FBSyxXQUFXO2dCQUFFLE9BQU8sUUFBUSxDQUFDO1lBQ3JELElBQU0sSUFBSSxHQUFHLElBQWUsQ0FBQztZQUM3QixLQUFLLElBQUksR0FBRyxHQUFDLENBQUMsRUFBRSxHQUFHLEdBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxHQUFHLEVBQUU7Z0JBQy9DLElBQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3RDLElBQU0sTUFBSSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ3pDLElBQUksTUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRTtvQkFDMUIsTUFBTSxDQUFDLE1BQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsU0FBUyxDQUFDO2lCQUNsRDthQUNKO1lBRUQsaUVBQWlFO1lBQ2pFLElBQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7WUFFN0MsZ0NBQWdDO1lBQ2hDLFVBQVUsQ0FBQyxhQUFhLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUNqRCxvQ0FBb0M7WUFDcEMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ2pELHFCQUFTLENBQUMsUUFBUSxDQUFDLElBQW1CLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxDQUFDLENBQUM7U0FDaEY7YUFBTSxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssQ0FBQyxDQUFDLG9CQUFvQixFQUFFO1lBQ2pELElBQU0sV0FBVyxHQUFHLFVBQVUsQ0FBQyx3QkFBd0IsQ0FBQztZQUN4RCxLQUFLLElBQU0sSUFBSSxJQUFJLFdBQVcsRUFBRTtnQkFDNUIsSUFBSSxHQUFHLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNsQyxJQUFJLE9BQU8sR0FBRyxLQUFLLFdBQVcsSUFBSSxHQUFHLEtBQUssSUFBSSxFQUFFO29CQUM1QyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDO2lCQUN0QjthQUNKO1NBQ0o7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBRUQsa0ZBQWtGO0lBQ25FLHdCQUFhLEdBQTVCLFVBQTZCLElBQWEsRUFBRSxRQUFnQixFQUFFLE1BQWdDO1FBQzFGLElBQU0sV0FBVyxHQUFHLFVBQVUsQ0FBQyx3QkFBd0IsQ0FBQztRQUN4RCxJQUFJLENBQUMsQ0FBQyxRQUFRLElBQUksV0FBVyxDQUFDO1lBQUUsT0FBTztRQUV2QyxLQUFLLElBQU0sSUFBSSxJQUFJLFdBQVcsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUN0QyxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDLEVBQUU7Z0JBQ25CLElBQUksS0FBSyxHQUFHLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDeEMsSUFBSSxPQUFPLEtBQUssS0FBSyxXQUFXLElBQUksS0FBSyxLQUFLLElBQUksRUFBRTtvQkFDaEQsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUU7d0JBQzNCLEtBQUssR0FBSSxLQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDO3FCQUNyQztvQkFDRCxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDO2lCQUN4QjthQUNKO1NBQ0o7SUFDTCxDQUFDO0lBRU0seUJBQWMsR0FBckIsVUFBc0IsSUFBaUI7UUFDbkMsSUFBTSxHQUFHLEdBQUcsdUJBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMscUJBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLDBCQUEwQixFQUFFLEtBQUssQ0FBQyxFQUFFO1lBQzdELElBQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUNuRCxLQUFLLElBQUksTUFBTSxHQUFHLENBQUMsRUFBRSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxFQUFFLE1BQU0sRUFBRTtnQkFDbkQsSUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUM3QixJQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQzt3Q0FDbkQsR0FBRztvQkFDUixJQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO29CQUM5QyxxREFBcUQ7b0JBQ3JELGlEQUFpRDtvQkFDakQscURBQXFEO29CQUNyRCxHQUFHO29CQUNIOzs7O3VCQUlHO29CQUNILElBQUksS0FBSyxJQUFJLENBQUMsaUJBQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUFFO3dCQUMxQyxtRUFBbUU7d0JBQ25FLElBQUksVUFBVSxHQUFHLEVBQUUsQ0FBQzt3QkFDcEIsSUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQyxDQUFDO3dCQUN6RCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRTs0QkFDeEMsSUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDOzRCQUNoQyxJQUFNLFVBQVUsR0FBRyxTQUFTLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQzs0QkFDcEUsS0FBSyxJQUFJLENBQUMsR0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUU7Z0NBQ3RDLElBQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0NBQ3BELElBQUksU0FBUztvQ0FDVCxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDOzZCQUNsQzt5QkFDSjt3QkFDRCxJQUFJLFVBQVUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFOzRCQUN6QixxQkFBUyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsWUFBWSxFQUFFLEtBQUssQ0FBQyxDQUFDOzt5QkFFbEQ7d0JBQ0QsNEVBQTRFO3dCQUM1RSxJQUFJLFFBQU0sR0FBYSxLQUFLLENBQUM7d0JBQzdCLElBQUksUUFBUSxHQUFHLEtBQUssQ0FBQzt3QkFDckIsT0FBTyxRQUFNLEtBQUssSUFBSSxFQUFFOzRCQUNwQixJQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLGNBQUksSUFBSSx3QkFBTyxDQUFDLFFBQVEsQ0FBQyxRQUFNLEVBQUUsSUFBSSxDQUFDLEVBQTlCLENBQThCLENBQUMsQ0FBQzs0QkFDdEUsSUFBSSxDQUFDLEtBQUs7Z0NBQ04sUUFBTSxHQUFHLHFCQUFTLENBQUMsYUFBYSxDQUFDLFFBQU0sQ0FBQyxDQUFDO2lDQUN4QztnQ0FDRCxRQUFRLEdBQUcsSUFBSSxDQUFDO2dDQUNoQixNQUFNOzZCQUNUO3lCQUNKO3dCQUNELElBQUksQ0FBQyxRQUFROzRCQUNULHFCQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxZQUFZLEVBQUUsS0FBSyxDQUFDLENBQUM7cUJBQ3REOztnQkExQ0wsS0FBSyxJQUFJLEdBQUcsR0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBRSxHQUFHOzRCQUFqQyxHQUFHO2lCQTJDWDthQUNKO1lBQ0QscUJBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLDBCQUEwQixFQUFFLElBQUksQ0FBQyxDQUFDO1NBQzdEO1FBQ0QsT0FBTyxxQkFBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFTyxxQ0FBZ0IsR0FBeEIsVUFBeUIsSUFBVTtRQUMvQixJQUFJLENBQUMsSUFBSTtZQUFFLE9BQU8sRUFBRSxDQUFDO1FBQ3JCLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDLEVBQUU7WUFDckIsSUFBSSxlQUFlLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLHFCQUFTLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDM0UsSUFBSSxVQUFVLEdBQUcsZUFBZSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQUMsTUFBTSxHQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDdEYsSUFBSSxFQUFFLEVBQUU7Z0JBQ1IsUUFBUSxFQUFFLEVBQUU7Z0JBQ1osU0FBUyxFQUFFLEVBQUU7Z0JBQ2IsbUJBQW1CLEVBQUUsSUFBSTthQUM1QixDQUFDO1lBQ0YsSUFBSSxhQUFhLEdBQUcsRUFBRSxDQUFDO1lBQ3ZCLGdCQUFnQjtZQUNoQixLQUFtQixVQUFlLEVBQWYsbUNBQWUsRUFBZiw2QkFBZSxFQUFmLElBQWUsRUFBRTtnQkFBL0IsSUFBTSxJQUFJO2dCQUNYLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDNUI7WUFDRCxhQUFhLENBQUMsSUFBSSxDQUFDO2dCQUNmLFVBQVUsRUFBRSxFQUFFO2dCQUNkLE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQztnQkFDNUIsU0FBUyxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUU7Z0JBQzlCLElBQUksRUFBRSxJQUFJO2dCQUNWLElBQUksRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUk7Z0JBQ2hDLFFBQVEsRUFBRSxVQUFVLENBQUMsUUFBUSxHQUFDLEdBQUcsR0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDO2dCQUM5RCxTQUFTLEVBQUUsRUFBRTtnQkFDYixtQkFBbUIsRUFBRSxVQUFVLENBQUMsbUJBQW1CO2FBQ3RELENBQUMsQ0FBQztZQUNILE9BQU8sYUFBYSxDQUFDO1NBQ3hCO2FBQU07WUFDSCxJQUFJLElBQUksR0FBRyxJQUFtQixDQUFDO1lBQy9CLElBQUksYUFBYSxHQU9aLHFCQUFTLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSw4QkFBOEIsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNwRSxJQUFJLENBQUMsYUFBYSxFQUFFO2dCQUNoQiw2RkFBNkY7Z0JBRTdGLDZDQUE2QztnQkFDN0MsSUFBSSxRQUFNLEdBQUcsVUFBVSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDN0MsSUFBSSxDQUFDLFFBQU0sRUFBRTtvQkFDVCxRQUFNLEdBQUcscUJBQVMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFnQixDQUFDO2lCQUN6RDtnQkFDRCxPQUFPLFFBQU0sSUFBSSxRQUFNLENBQUMsUUFBUSxLQUFLLENBQUMsRUFBRTtvQkFDcEMsUUFBTSxHQUFHLHFCQUFTLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBZ0IsQ0FBQztpQkFDekQ7Z0JBQ0QsSUFBSSxlQUFlLEdBQUcsUUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDbEUsSUFBSSxVQUFVLEdBQUcsZUFBZSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQUMsTUFBTSxHQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDdEYsSUFBSSxFQUFFLEVBQUU7b0JBQ1IsUUFBUSxFQUFFLEVBQUU7b0JBQ1osU0FBUyxFQUFFLEVBQUU7b0JBQ2IsbUJBQW1CLEVBQUUsSUFBSTtpQkFDNUIsQ0FBQztnQkFDRixPQUFPLFVBQVUsQ0FBQyxJQUFJLEtBQUssSUFBSSxFQUFFO29CQUM3QixRQUFNLEdBQUcsVUFBVSxDQUFDLGNBQWMsQ0FBQyxRQUFNLENBQUMsSUFBSSxxQkFBUyxDQUFDLGFBQWEsQ0FBQyxRQUFNLENBQWdCLENBQUM7b0JBQzdGLGVBQWUsR0FBRyxRQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO29CQUM5RCxVQUFVLEdBQUcsZUFBZSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEdBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQzFEO2dCQUVELHdCQUF3QjtnQkFDeEIsSUFBSSxRQUFRLEdBYVI7b0JBQ0EsVUFBVSxFQUFFLElBQUksQ0FBQyxRQUFRLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFDLENBQUMsRUFBRTtvQkFDOUQsTUFBTSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDO29CQUM1QixTQUFTLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRTtvQkFDOUIsSUFBSSxFQUFFLElBQUk7b0JBQ1YsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSTtvQkFDaEMsUUFBUSxFQUFFLEVBQUU7b0JBQ1osU0FBUyxFQUFFLEVBQUU7b0JBQ2IsbUJBQW1CLEVBQUUsSUFBSTtpQkFDNUI7Z0JBRUQseURBQXlEO2dCQUN6RCxJQUFJLHVCQUF1QixHQUFHLENBQUMsVUFBVSxDQUFDLG1CQUFtQixDQUFDO2dCQUM5RCxJQUFJLHVCQUF1QixFQUFFO29CQUN6QixRQUFRLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztpQkFDeEI7cUJBQU07b0JBQ0gsUUFBUSxDQUFDLG1CQUFtQixHQUFHLFVBQVUsQ0FBQyxtQkFBbUI7MkJBQ3RELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUN4RDtnQkFFRCxnQkFBZ0I7Z0JBQ2hCLElBQUksUUFBUSxDQUFDLElBQUksS0FBSyxJQUFJLEVBQUU7b0JBQ3hCLFVBQVUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO29CQUNyRixRQUFRLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQyxRQUFRLEdBQUMsR0FBRyxHQUFDLFFBQVEsQ0FBQyxJQUFJLEdBQUMsR0FBRyxHQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxHQUFDLEdBQUcsQ0FBQztpQkFDekc7cUJBQU07b0JBQ0gsUUFBUSxDQUFDLFFBQVEsR0FBRyxVQUFVLENBQUMsUUFBUSxDQUFDO2lCQUMzQztnQkFFRCxnQkFBZ0I7Z0JBQ2hCLGFBQWEsR0FBRyxFQUFFO2dCQUNsQixLQUFtQixVQUFlLEVBQWYsbUNBQWUsRUFBZiw2QkFBZSxFQUFmLElBQWUsRUFBRTtvQkFBL0IsSUFBTSxJQUFJO29CQUNYLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQzVCO2dCQUNELGFBQWEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzdCLHFCQUFTLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSw4QkFBOEIsRUFBRSxhQUFhLENBQUMsQ0FBQzthQUMzRTtZQUNELE9BQU8sYUFBYSxDQUFDO1NBQ3hCO0lBQ0wsQ0FBQztJQUVELDBCQUFLLEdBQUwsVUFBTSxJQUFVO1FBQ1osVUFBVSxDQUFDLGlCQUFpQixHQUFHLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQztRQUN4QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO1FBQzNCLElBQUksQ0FBQyxhQUFhLEdBQUcsQ0FBQztnQkFDbEIsUUFBUSxFQUFFLEVBQUU7Z0JBQ1osU0FBUyxFQUFFLEVBQUU7YUFDaEIsQ0FBQyxDQUFDO1FBQ0gsMEJBQTBCO1FBQzFCLElBQUksUUFBUSxHQUFHLElBQUksQ0FBQztRQUNwQixJQUFJLElBQUksQ0FBQztRQUNULE9BQU8sSUFBSSxHQUFHLHFCQUFTLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQzFDLFFBQVEsR0FBRyxJQUFJLENBQUM7U0FDbkI7UUFBQSxDQUFDO1FBQ0YsMkRBQTJEO1FBQzNELElBQUksVUFBVSxHQUFHLElBQUksdUJBQVUsQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzNELEdBQUc7WUFDQyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsUUFBUSxLQUFLLENBQUMsRUFBRTtnQkFDaEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUMxQztTQUNKLFFBQVEsVUFBVSxDQUFDLFFBQVEsRUFBRSxFQUFFO0lBQ3BDLENBQUM7SUFFRCw4QkFBUyxHQUFULFVBQVUsSUFBVTtRQUNoQixJQUFJLElBQUksQ0FBQyxhQUFhLEtBQUssSUFBSSxFQUFFO1lBQzdCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDcEI7UUFDRCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQztRQUN4QixLQUFLLElBQUksR0FBRyxHQUFDLENBQUMsRUFBRSxHQUFHLEdBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxFQUFFLEdBQUcsRUFBRTtZQUNyRCxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLEVBQUU7Z0JBQy9FLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDN0g7U0FDSjtRQUNELE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDO0lBQ2pDLENBQUM7SUFFRCxrQ0FBYSxHQUFiLFVBQWMsSUFBVTtRQUNwQiwrQ0FBK0M7UUFDL0MsSUFBSSxhQUFhLEdBQUcsRUFBRTtRQUN0QiwwQkFBMEI7UUFDMUIsYUFBYSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1QyxJQUFJLFFBQVEsR0FBRyxhQUFhLENBQUMsYUFBYSxDQUFDLE1BQU0sR0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyRCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkMsSUFBSSxRQUFRLENBQUMsSUFBSSxLQUFLLElBQUksRUFBRTtZQUN4QixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUNyQztRQUVELElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxhQUFhLENBQUM7SUFDMUMsQ0FBQztJQUVELCtCQUFVLEdBQVYsVUFBVyxJQUFVO1FBQ2pCLElBQUksTUFBTSxHQUFrQixFQUFFLENBQUM7UUFDL0IsS0FBa0IsVUFBcUIsRUFBckIsU0FBSSxDQUFDLGdCQUFnQixFQUFyQixjQUFxQixFQUFyQixJQUFxQixFQUFFO1lBQXBDLElBQU0sR0FBRztZQUNWLHlCQUF5QjtZQUN6QixtQkFBbUI7WUFDbkIsZ0RBQWdEO1lBQ2hELGtDQUFrQztZQUNsQyx1QkFBdUI7WUFDdkIsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNwQjtRQUNELElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDbkIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLEdBQUcsR0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJO1lBQy9ELElBQUksUUFBTSxHQUFHLHFCQUFTLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzNDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxRQUFNLENBQUMsQ0FBQyxDQUFDLHFCQUFTLENBQUMsUUFBUSxDQUFDLFFBQXFCLEVBQUUseUJBQXlCLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUNsSDtRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFvSEQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O01BME5FO0lBQ047Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztXQXFCTztJQUVXLHFCQUFVLEdBQXhCLFVBQXlCLElBQVc7UUFDaEMsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLENBQUMsQ0FBQyxvQkFBb0IsRUFBRTtZQUMxQyxPQUFPLE1BQU0sQ0FBQztTQUNqQjthQUFNLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDLENBQUMsdUJBQXVCLEVBQUU7WUFDcEQsT0FBTyxJQUFJLENBQUM7U0FDZjtRQUNELElBQU0sSUFBSSxHQUFHLElBQWUsQ0FBQztRQUM3QixJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssQ0FBQyxDQUFDLHVCQUF1QixFQUFFO1lBQ3RELE9BQU8sSUFBSSxDQUFDO1NBQ2Y7UUFFRCwySkFBMko7UUFDM0osOENBQThDO1FBQzlDLGtFQUFrRTtRQUVsRSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQzFFLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDL0MsSUFBSSxPQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUMvQixLQUFtQixVQUFLLEVBQUwsaUJBQUssRUFBTCxtQkFBSyxFQUFMLElBQUssRUFBRTtnQkFBckIsSUFBTSxNQUFJO2dCQUNYLElBQUksTUFBSSxLQUFLLGNBQWMsSUFBSSxNQUFJLEtBQUssTUFBTSxFQUFFO29CQUM1QyxxRUFBcUU7b0JBQ3JFLElBQUksQ0FBQyx1QkFBVSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsRUFBRTt3QkFDL0IsT0FBTyxJQUFJLENBQUM7cUJBQ2Y7aUJBQ0o7cUJBQU0sSUFBSSxNQUFJLElBQUksaUNBQWUsQ0FBQyxjQUFjLEVBQUU7b0JBQy9DLE9BQU8sTUFBSSxDQUFDO2lCQUNmO2FBQ0o7U0FDSjtRQUNELHVDQUF1QztRQUN2QyxJQUFNLEtBQUssR0FBRyxtQkFBUSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3QywrSEFBK0g7UUFDL0gsSUFBTSxJQUFJLEdBQUcsQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNELE9BQU8sSUFBSSxLQUFLLGNBQWMsSUFBSSxJQUFJLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNoRSx3Q0FBd0M7SUFFNUMsQ0FBQztJQXhZRCw0RUFBNEU7SUFDNUUsbUJBQW1CO0lBQ25CLElBQUk7SUFFSix5RUFBeUU7SUFDM0QsbUNBQXdCLEdBQStEO1FBQ2pHLFFBQVEsRUFBRTtZQUNOLE1BQU0sRUFBRSxjQUFJLFlBQUksc0NBQVcsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsMENBQUUsSUFBSSxJQUFFLHdCQUF3QjtTQUMxRjtRQUNDLFVBQVUsRUFBRTtZQUNWLHdGQUF3RjtZQUN4Riw0Q0FBNEM7WUFDNUMsaUJBQWlCLEVBQUUsY0FBSTtnQkFDbkIsSUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDbkMsSUFBSSxFQUFFLElBQUksRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQ3JCLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLGNBQWMsR0FBQyxFQUFFLEdBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ3JFLE9BQU8sRUFBRSxHQUFDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUM7MkJBQ2pDLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBRSxNQUFNLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsSUFBRSxFQUFFLENBQUMsQ0FBQztpQkFDdkY7Z0JBQ0QsT0FBTyxJQUFJLENBQUM7WUFDaEIsQ0FBQztTQUNKO1FBQ0MsSUFBSSxFQUFFO1lBQ0osT0FBTyxFQUFFLEdBQUc7U0FDZjtRQUNDLElBQUksRUFBRTtZQUNKLE9BQU8sRUFBRSxHQUFHO1NBQ2Y7UUFDQyxJQUFJLEVBQUU7WUFDSixPQUFPLEVBQUUsR0FBRztTQUNmO1FBQ0MsSUFBSSxFQUFFO1lBQ0osT0FBTyxFQUFFLEdBQUc7U0FDZjtRQUNDLElBQUksRUFBRTtZQUNKLE9BQU8sRUFBRSxHQUFHO1NBQ2Y7UUFDQyxJQUFJLEVBQUU7WUFDSixPQUFPLEVBQUUsR0FBRztTQUNmO1FBQ0MsT0FBTyxFQUFFO1lBQ1Asc0ZBQXNGO1lBQ3RGLGdGQUFnRjtZQUNoRixzRkFBc0Y7WUFDdEYsYUFBYTtZQUNiLFNBQVMsRUFBRSxjQUFJO2dCQUNYLElBQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ3ZDLElBQUksSUFBSSxLQUFLLFVBQVUsSUFBSSxJQUFJLEtBQUssT0FBTyxFQUFFO29CQUN6QyxPQUFPLEVBQUUsR0FBRSxJQUF5QixDQUFDLE9BQU8sQ0FBQztpQkFDaEQ7Z0JBQ0QsT0FBTyxJQUFJLENBQUM7WUFDaEIsQ0FBQztZQUNELGlGQUFpRjtZQUNqRixnQ0FBZ0M7O1lBQzlCLFNBQVMsRUFBRSxjQUFJLElBQU0sT0FBTyxJQUFJLENBQUMsQ0FBQztBQUFtQyxDQUFDLENBQUM7WUFDekUseUVBQXlFO1lBQ3pFLGtDQUFrQzs7WUFDaEMsVUFBVSxFQUFFLGNBQUksSUFBTSxPQUFPLElBQUksQ0FBQyxDQUFDO0FBQW1DLENBQUMsQ0FBQztZQUMxRSxzRkFBc0Y7WUFDdEYseUZBQXlGO1lBQ3pGLDhCQUE4Qjs7WUFDNUIsTUFBTSxFQUFFLGNBQUksSUFBTSxPQUFPLElBQUksQ0FBQyxDQUFDO0FBQW1DLENBQUMsQ0FBQztTQUN6RTtRQUNDLFFBQVEsRUFBRTtZQUNSLGlCQUFpQixFQUFFLE9BQU87U0FDN0I7UUFDQyxJQUFJLEVBQUU7WUFDSixnREFBZ0Q7WUFDaEQsU0FBUyxFQUFFLGNBQUk7Z0JBQ1gsSUFBTSxNQUFNLEdBQUcsaUJBQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUMvRCxJQUFJLENBQUMsTUFBTTtvQkFBRSxPQUFPLElBQUksQ0FBQztnQkFDekIsSUFBTSxHQUFHLEdBQUcscUJBQVMsQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLCtCQUErQixFQUFFLGNBQU0sYUFBTSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxFQUE3QixDQUE2QixDQUFDLENBQUM7Z0JBQ2hILElBQU0sUUFBUSxHQUFHLHFCQUFTLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxvQ0FBb0MsRUFBRSxjQUFNLGFBQU0sQ0FBQyxnQkFBZ0IsQ0FBQyx1QkFBdUIsQ0FBQyxFQUFoRCxDQUFnRCxDQUFDLENBQUM7Z0JBQzdJLE9BQU8sRUFBRSxHQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDM0MsQ0FBQztZQUNELGlEQUFpRDs7WUFDL0MsVUFBVSxFQUFFLGNBQUk7Z0JBQ2QsSUFBTSxNQUFNLEdBQUcsaUJBQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDOUQsSUFBSSxDQUFDLE1BQU07b0JBQUUsT0FBTyxJQUFJLENBQUM7Z0JBQ3pCLElBQU0sR0FBRyxHQUFHLHFCQUFTLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSwrQkFBK0IsRUFBRSxjQUFNLGFBQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsRUFBN0IsQ0FBNkIsQ0FBQyxDQUFDO2dCQUNoSCxJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7Z0JBQ1osS0FBSyxJQUFJLEdBQUcsR0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsRUFBRSxHQUFHLEVBQUU7b0JBQ25DLElBQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztvQkFDcEIsSUFBSSxpQkFBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsaUJBQU8sQ0FBQyxXQUFXLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUU7d0JBQ3pFLE9BQU8sRUFBRSxHQUFDLEdBQUcsQ0FBQztxQkFDakI7b0JBQ0QsRUFBRSxHQUFHLENBQUM7aUJBQ1Q7Z0JBQ0QsT0FBTyxJQUFJLENBQUM7WUFDaEIsQ0FBQztTQUNKO1FBQ0MsVUFBVSxFQUFFO1lBQ1Ysb0VBQW9FO1lBQ3BFLG9DQUFvQztZQUNwQyxTQUFTLEVBQUUsY0FBSSxJQUFJLFNBQUUsR0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQzttQkFDOUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxJQUFFLE1BQU0sSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxJQUFFLEVBQUUsQ0FBQyxDQUFDLEVBRC9ELENBQytEO1NBQ3JGO1FBQ0MsUUFBUSxFQUFFO1lBQ1IsNkVBQTZFO1lBQzdFLFVBQVUsRUFBRSxjQUFJLElBQUksU0FBRSxHQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDO21CQUNoRCxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUUsTUFBTSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUUsRUFBRSxDQUFDLENBQUMsRUFEaEUsQ0FDZ0U7U0FDdkY7UUFDQyxVQUFVLEVBQUU7WUFDVixVQUFVLEVBQUUsY0FBSSxJQUFJLFdBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxFQUEvQixDQUErQjtZQUNqRCxVQUFVLEVBQUUsY0FBSSxJQUFJLFVBQUcsRUFBSCxDQUFHO1lBQ3ZCLFVBQVUsRUFBRSxjQUFJLElBQUksV0FBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsRUFBMUIsQ0FBMEI7U0FDbkQ7S0FFSjtJQUNhLG1DQUF3QixHQUFnQztRQUNsRSxNQUFNLEVBQUUsY0FBSSxJQUFJLFdBQUksQ0FBQyxTQUFTLEVBQWQsQ0FBYztLQUNqQztJQUVjLDRCQUFpQixHQUFHLENBQUMsQ0FBQztJQXdSekMsaUJBQUM7Q0FBQSxDQTdyQitCLDJCQUFZLEdBNnJCM0M7QUE3ckJZLGdDQUFVOzs7Ozs7Ozs7Ozs7QUMvQnZCOzs7Ozs7Ozs7Ozs7OzsrRUFjK0U7OztBQUUvRSxzSUFBc0U7QUFDdEUsMEZBQTBDO0FBQzFDLDZGQUFnRDtBQUNoRCwyRkFBNkM7QUFFN0M7Ozs7R0FJRztBQUNIO0lBS0ksb0JBQVksT0FBYyxFQUFFLElBQWUsRUFBRSxJQUFZO1FBQ3JELElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxJQUFJLE9BQU8sQ0FBQztRQUM1QixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxLQUFLLENBQUMsRUFBRTtZQUMxQixJQUFJLENBQUMsSUFBSSxHQUFJLElBQUksQ0FBQyxJQUFpQixDQUFDLGVBQWU7U0FDdEQ7UUFDRCxJQUFJLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQztRQUNwQixrQ0FBa0M7UUFDbEMsMERBQTBEO1FBQzFELElBQUk7UUFDSixJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsSUFBSSxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLENBQUM7SUFDOUQsQ0FBQztJQUVELDJCQUFNLEdBQU47UUFDSSxJQUFLLElBQVksQ0FBQyxZQUFZO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDN0MsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDekIsT0FBTyxJQUFJLENBQUM7U0FDZjthQUFNLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDN0IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDMUM7YUFBTSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsdUJBQXVCLEVBQUU7WUFDMUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDN0Q7YUFBTTtZQUNILG1EQUFtRDtZQUNuRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxLQUFLLElBQUksQ0FBQztTQUN4QztJQUNMLENBQUM7SUFFRCw2QkFBUSxHQUFSO1FBQ0ksSUFBSSxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLEdBQUc7WUFDQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1lBQ2xCLGtJQUFrSTtZQUNsSSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRTtnQkFDZixJQUFJLFVBQVUsR0FBSSxJQUFJLENBQUMsSUFBMEIsQ0FBQztnQkFDbEQsSUFBSSxXQUFXLEdBQUksSUFBSSxDQUFDLElBQW9CLENBQUM7Z0JBQzdDLElBQUksV0FBVyxHQUFJLElBQUksQ0FBQyxJQUF3QjtnQkFDaEQsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDLENBQUMsdUJBQXVCO3VCQUM3QyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxRQUFRO3VCQUM3QyxpQkFBTyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUM7dUJBQ2pDLFVBQVUsQ0FBQyxlQUFlO3VCQUMxQixVQUFVLENBQUMsZUFBZSxDQUFDLGVBQWUsRUFDakQ7b0JBQ0ksSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztvQkFDN0IsSUFBSSxDQUFDLElBQUksR0FBRyxVQUFVLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBQztvQkFDdEQsSUFBSSxDQUFDLElBQVksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO2lCQUNsRDtxQkFBTSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxLQUFLLENBQUMsQ0FBQyx1QkFBdUI7dUJBQ3BELGlCQUFPLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQzt1QkFDbEMsV0FBVyxDQUFDLFVBQVU7dUJBQ3RCLFdBQVcsQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUN4QztvQkFDSSxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO29CQUM3QixJQUFJLENBQUMsSUFBSSxHQUFHLFdBQVcsQ0FBQyxVQUFVLENBQUM7b0JBQ2xDLElBQUksQ0FBQyxJQUFZLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztvQkFDL0MscUJBQVMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQWtCLENBQUMsQ0FBQztpQkFDbEQ7cUJBQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDO3VCQUM1QixXQUFXLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxLQUFLLE1BQU07dUJBQzdDLFdBQVcsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUM3QztvQkFDSSxJQUFJLENBQUMsSUFBSSxHQUFHLFdBQVcsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDOUM7cUJBQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxLQUFLLENBQUMsQ0FBQyx1QkFBdUIsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsS0FBSyxFQUFFLENBQUMsaUNBQWlDLENBQUM7dUJBQ3JILHFCQUFTLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO29CQUNsRCxJQUFJLENBQUMsSUFBSSxHQUFHLHFCQUFTLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUM3RDtxQkFBTTtvQkFDSCxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztpQkFDdkI7YUFDSjtpQkFBTTtnQkFDSCxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRTtvQkFDZixPQUFPLEtBQUssQ0FBQztpQkFDaEI7cUJBQU0sSUFBSyxJQUFJLENBQUMsSUFBWSxDQUFDLFNBQVMsRUFBRTtvQkFDckMsSUFBSSxTQUFTLEdBQUksSUFBSSxDQUFDLElBQVksQ0FBQyxTQUFTLENBQUM7b0JBQzdDLElBQUksYUFBYSxHQUFJLElBQUksQ0FBQyxJQUFZLENBQUMsU0FBUyxHQUFDLENBQUMsQ0FBQztvQkFDbkQsdUNBQXVDO29CQUN2Qyx1Q0FBdUM7b0JBQ3ZDLElBQUksYUFBYSxHQUFHLFNBQVMsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxNQUFNLEVBQUU7d0JBQ2xELElBQUksQ0FBQyxJQUFJLEdBQUcsU0FBUyxDQUFDLGFBQWEsRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUFDO3dCQUNyRCxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztxQkFDeEI7eUJBQU07d0JBQ0gsSUFBSSxDQUFDLElBQUksR0FBRyxTQUFTLENBQUM7d0JBQ3RCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO3FCQUN2QjtpQkFDSjtxQkFBTSxJQUFLLElBQUksQ0FBQyxJQUFZLENBQUMsWUFBWSxFQUFFO29CQUN4QyxJQUFJLENBQUMsSUFBSSxHQUFJLElBQUksQ0FBQyxJQUFZLENBQUMsWUFBWSxDQUFDO29CQUM1QyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztpQkFDdkI7cUJBQU0sSUFBSSxxQkFBUyxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTtvQkFDdkQsSUFBSSxDQUFDLElBQUksR0FBRyxxQkFBUyxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDM0QsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7b0JBQ3JCLFNBQVMsR0FBRyxJQUFJLENBQUM7aUJBQ3BCO3FCQUFNLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUU7b0JBQzdCLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxLQUFLLENBQUMsSUFBSyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQTBCLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxFQUFFO3dCQUN4RyxJQUFJLE1BQU0sR0FBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQTBCLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQzt3QkFDMUYsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDLElBQUksQ0FBRSxJQUFJLENBQUMsSUFBb0IsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUU7NEJBQzVFLElBQUksQ0FBQyxJQUFJLEdBQUcsdUJBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOzRCQUMvRSxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQzt5QkFDeEI7NkJBQU07NEJBQ0gsSUFBSSxHQUFHLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBRSxJQUFJLENBQUMsSUFBb0IsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQzs0QkFDeEUsSUFBSSxHQUFHLEtBQUssTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0NBQzNCLFdBQVc7Z0NBQ1gsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztnQ0FDakMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7NkJBQ3ZCO2lDQUFNO2dDQUNILFlBQVk7Z0NBQ1osSUFBSSxDQUFDLElBQUksR0FBRyx1QkFBWSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dDQUNuRixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQzs2QkFDeEI7eUJBQ0o7cUJBQ0o7b0JBQ0QsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztvQkFDakMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7aUJBQ3ZCO3FCQUFNO29CQUNILE9BQU8sS0FBSyxDQUFDO2lCQUNoQjthQUNKO1NBQ0osUUFDRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxLQUFLLENBQUMsQ0FBQyx1QkFBdUIsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsS0FBSyxFQUFFLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEtBQUssQ0FBQyxDQUFDLG9CQUFvQixDQUFDO2VBQzdILENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEtBQUssQ0FBQyxJQUFLLElBQUksQ0FBQyxJQUFnQixDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsS0FBSyxLQUFLLENBQUM7ZUFDdkYsQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyx1QkFBVSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBbUIsQ0FBQyxDQUFDLEVBQ3JHO1FBQ0YsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVELDZCQUFRLEdBQVI7UUFDSSxJQUFJLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdEIsR0FBRztZQUNDLFNBQVMsR0FBRyxLQUFLLENBQUM7WUFDbEIsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO2dCQUNkLElBQUksVUFBVSxHQUFJLElBQUksQ0FBQyxJQUEwQixDQUFDO2dCQUNsRCxJQUFJLFdBQVcsR0FBSSxJQUFJLENBQUMsSUFBb0IsQ0FBQztnQkFDN0MsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDLENBQUMsdUJBQXVCO3VCQUM3QyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxRQUFRO3VCQUM3QyxpQkFBTyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUM7dUJBQ2pDLFVBQVUsQ0FBQyxlQUFlO3VCQUMxQixVQUFVLENBQUMsZUFBZSxDQUFDLGVBQWUsRUFDakQ7b0JBQ0ksSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztvQkFDN0IsSUFBSSxDQUFDLElBQUksR0FBRyxVQUFVLENBQUMsZUFBZSxDQUFDLGVBQWUsQ0FBQztvQkFDdEQsSUFBSSxDQUFDLElBQVksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDO2lCQUNsRDtxQkFBTSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxLQUFLLENBQUMsQ0FBQyx1QkFBdUI7dUJBQ3BELGlCQUFPLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQzt1QkFDbEMsV0FBVyxDQUFDLFVBQVU7dUJBQ3RCLFdBQVcsQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUN2QztvQkFDSSxJQUFJLFlBQVksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO29CQUM3QixJQUFJLENBQUMsSUFBSSxHQUFHLFdBQVcsQ0FBQyxVQUFVLENBQUM7b0JBQ2xDLElBQUksQ0FBQyxJQUFZLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztvQkFDL0MscUJBQVMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQWtCLENBQUMsQ0FBQztpQkFDbEQ7cUJBQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxLQUFLLENBQUMsQ0FBQyx1QkFBdUIsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsS0FBSyxFQUFFLENBQUM7dUJBQ25GLHFCQUFTLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFO29CQUNqRCxJQUFJLENBQUMsSUFBSSxHQUFHLHFCQUFTLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUM1RDtxQkFBTTtvQkFDSCxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztpQkFDeEI7YUFDSjtpQkFBTTtnQkFDSCxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRTtvQkFDZixPQUFPLEtBQUssQ0FBQztpQkFDaEI7cUJBQU0sSUFBSSxxQkFBUyxDQUFDLDZCQUE2QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRTtvQkFDM0QsSUFBSSxDQUFDLElBQUksR0FBRyxxQkFBUyxDQUFDLDZCQUE2QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDL0QsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7aUJBQ3ZCO3FCQUFNLElBQUssSUFBSSxDQUFDLElBQVksQ0FBQyxZQUFZLEVBQUU7b0JBQ3hDLElBQUksQ0FBQyxJQUFJLEdBQUksSUFBSSxDQUFDLElBQVksQ0FBQyxZQUFZLENBQUM7b0JBQzVDLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO29CQUNyQixTQUFTLEdBQUcsSUFBSSxDQUFDO2lCQUNwQjtxQkFBTSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFO29CQUM3QixJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsS0FBSyxDQUFDLElBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxVQUEwQixDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsRUFBRTt3QkFDeEcsSUFBSSxNQUFNLEdBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxVQUEwQixDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQzFGLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEtBQUssQ0FBQyxJQUFJLENBQUUsSUFBSSxDQUFDLElBQW9CLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFOzRCQUM1RSxJQUFJLENBQUMsSUFBSSxHQUFHLHVCQUFZLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs0QkFDL0UsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7eUJBQ3hCOzZCQUFNOzRCQUNILElBQUksR0FBRyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUUsSUFBSSxDQUFDLElBQW9CLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7NEJBQ3hFLElBQUksR0FBRyxLQUFLLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dDQUMzQixXQUFXO2dDQUNYLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7Z0NBQ2pDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDOzZCQUN2QjtpQ0FBTTtnQ0FDSCxZQUFZO2dDQUNaLElBQUksQ0FBQyxJQUFJLEdBQUcsdUJBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQ0FDbkYsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7NkJBQ3hCO3lCQUNKO3FCQUNKO29CQUNELElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7b0JBQ2pDLElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO2lCQUN4QjtxQkFBTTtvQkFDSCxPQUFPLEtBQUssQ0FBQztpQkFDaEI7YUFDSjtTQUNKLFFBQ0csQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDLENBQUMsdUJBQXVCLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEtBQUssRUFBRSxDQUFDO2VBQzVFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEtBQUssQ0FBQyxJQUFLLElBQUksQ0FBQyxJQUFnQixDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsS0FBSyxLQUFLLENBQUM7ZUFDdkYsQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyx1QkFBVSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBbUIsQ0FBQyxDQUFDLEVBQ3JHO1FBQ0YsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUNMLGlCQUFDO0FBQUQsQ0FBQztBQXJNWSxnQ0FBVTs7Ozs7Ozs7Ozs7O0FDMUJ2Qjs7Ozs7Ozs7Ozs7Ozs7K0VBYytFOzs7QUFJL0U7SUFBQTtJQTZCQSxDQUFDO0lBNUJpQixnQ0FBbUIsR0FBakMsVUFBa0MsZ0JBQXNDO1FBQ3BFLElBQUksZ0JBQWdCLElBQUksZ0JBQWdCLENBQUMsR0FBRyxFQUFFO1lBQzFDLDZDQUE2QztZQUM3QyxLQUFLLElBQUksR0FBRyxHQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUMsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUU7Z0JBQ3pELElBQU0sSUFBSSxHQUFJLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFvQixDQUFDO2dCQUM3RCxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssQ0FBQzt1QkFDaEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxRQUFRO3VCQUN4QyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLEtBQUssY0FBYyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLEtBQUssTUFBTSxDQUFDLEVBQ3BHO29CQUNJLE9BQU8sSUFBSSxDQUFDO2lCQUNmO2FBQ0o7U0FDSjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFYSxvQkFBTyxHQUFyQixVQUFzQixnQkFBc0M7UUFDeEQsSUFBSSxnQkFBZ0IsSUFBSSxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUU7WUFDMUMsNkNBQTZDO1lBQzdDLEtBQUssSUFBSSxHQUFHLEdBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRTtnQkFDekQsSUFBTSxJQUFJLEdBQUksZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQW9CLENBQUM7Z0JBQzdELElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsS0FBSyxRQUFRLEVBQUU7b0JBQ2pFLE9BQU8sSUFBSSxDQUFDO2lCQUNmO2FBQ0o7U0FDSjtRQUNELE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFDTCxtQkFBQztBQUFELENBQUM7QUE3Qlksb0NBQVk7Ozs7Ozs7Ozs7OztBQ2xCekI7Ozs7Ozs7Ozs7Ozs7OytFQWMrRTs7O0FBSS9FO0lBQUE7SUF3QkEsQ0FBQztJQXZCaUIsNkJBQWdCLEdBQTlCLFVBQStCLElBQVU7UUFDckMsSUFBSSxDQUFDLEdBQVUsSUFBSSxDQUFDO1FBQ3BCLE9BQU0sQ0FBQyxDQUFDLFVBQVUsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsVUFBVSxDQUFDLEVBQUM7WUFDckMsSUFBSSxDQUFDLENBQUMsUUFBUSxLQUFLLEVBQUUsRUFBRTtnQkFDbkIsT0FBTyxDQUFxQixDQUFDO2FBQ2hDO1NBQ0o7UUFDRCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDOUIsQ0FBQztJQUVhLG9CQUFPLEdBQXJCLFVBQXNCLElBQVUsRUFBRSxFQUFVO1FBQ3hDLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUMxRCxDQUFDO0lBRWEsd0JBQVcsR0FBekIsVUFBMEIsV0FBaUMsRUFBRSxRQUFnQjtRQUN6RSxJQUFJLE9BQU8sR0FBRyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLGNBQUksSUFBSSxXQUFJLENBQUMsSUFBSSxLQUFLLFFBQVEsRUFBdEIsQ0FBc0IsQ0FBQyxDQUFDO1FBQ3hFLE9BQU8sT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxJQUFJLENBQUM7SUFDekQsQ0FBQztJQUVhLGdDQUFtQixHQUFqQyxVQUFrQyxXQUFpQyxFQUFFLElBQVk7UUFDN0UsSUFBSSxPQUFPLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxjQUFJLElBQUksV0FBSSxDQUFDLElBQUksS0FBSyxJQUFJLEVBQWxCLENBQWtCLENBQUMsQ0FBQztRQUNyRSxPQUFPLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDO0lBQ3pELENBQUM7SUFDTCxtQkFBQztBQUFELENBQUM7QUF4Qlksb0NBQVk7Ozs7Ozs7Ozs7OztBQ2xCekI7Ozs7Ozs7Ozs7Ozs7OytFQWMrRTs7O0FBRS9FLDBGQUEwRjtBQUMxRixJQUFNLGlCQUFpQixHQUFHO0lBQzFCLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQzdtRyxDQUFFLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDeDFILENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUM3aUUsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUM1ekQsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDenhCLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDM2pCLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDeGtFLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQ25xQyxDQUFFLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQ2xsQyxDQUFFLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDeDFCLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUMzNUgsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDempFLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUN2MUgsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUMzK0YsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQy9pQyxDQUFFLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQy9uRSxDQUFFLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDblcsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUMzOUIsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDN3BHLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUN4cUcsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUN4eUIsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDbmpCLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQ2gzQyxDQUFFLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDbjVELENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQzE4QyxDQUFFLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0NBQzdtQyxDQUFDO0FBR0Y7SUFBQTtJQXFDQSxDQUFDO0lBbkNHLHdEQUF3RDtJQUMxQyxnQkFBTyxHQUFyQixVQUFzQixPQUFlO1FBQ2pD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LENBQUMsR0FBRyxJQUFJLE1BQU0sQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLEdBQUcsSUFBSSxNQUFNLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLEdBQUcsR0FBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7bUJBQ2xLLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7bUJBQzNJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsSUFBSSxNQUFNLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7dUJBQ3JJLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLE1BQU0sQ0FB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LENBQUMsTUFBTSxDQUFDLENBQUM7cUJBQ3pCO3lCQUFNO3dCQUNILE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7cUJBQzNCO2lCQUNKO2dCQUNELE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDN0M7WUFDRCxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbkIsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3ZCLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ2hCLENBQUM7QUF4REQsOEJBd0RDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3YyL2FyaWEvQVJJQURlZmluaXRpb25zLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92Mi9hcmlhL0FSSUFNYXBwZXIudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3YyL2FyaWEvQVJJQVdhbGtlci50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvYW5jZXN0b3IudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sYW5nLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92Mi9jb21tb24vQ29tbW9uTWFwcGVyLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92Mi9jb21tb24vQ29udGV4dC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjIvY29tbW9uL0VuZ2luZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjIvY29uZmlnL0NvbmZpZy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjIvZG9tL0RPTU1hcHBlci50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjIvZG9tL0RPTVV0aWwudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3YyL2RvbS9ET01XYWxrZXIudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L2FwaS9JR3VpZGVsaW5lLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9hcGkvSVJ1bGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L2NoZWNrZXIvQ2hlY2tlci50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYV90YXJnZXRfd2FybmluZy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYV90ZXh0X3B1cnBvc2UudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FwcGxldF9hbHRfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcHBsaWNhdGlvbl9jb250ZW50X2FjY2Vzc2libGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyZWFfYWx0X2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9hY2Nlc3NpYmxlbmFtZV9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfYWN0aXZlZGVzY2VuZGFudF90YWJpbmRleF92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9hY3RpdmVkZXNjZW5kYW50X3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2FwcGxpY2F0aW9uX2xhYmVsX3VuaXF1ZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9hcHBsaWNhdGlvbl9sYWJlbGxlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9hcnRpY2xlX2xhYmVsX3VuaXF1ZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9hdHRyaWJ1dGVfYWxsb3dlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9hdHRyaWJ1dGVfY29uZmxpY3QudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfYXR0cmlidXRlX2RlcHJlY2F0ZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfYXR0cmlidXRlX2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9hdHRyaWJ1dGVfcmVkdW5kYW50LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2F0dHJpYnV0ZV9yZXF1aXJlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9hdHRyaWJ1dGVfdmFsdWVfdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfYmFubmVyX2xhYmVsX3VuaXF1ZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9iYW5uZXJfc2luZ2xlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2NoaWxkX3RhYmJhYmxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2NoaWxkX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxfdW5pcXVlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxfdmlzaWJsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsbGVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2NvbnRlbnRfaW5fbGFuZG1hcmsudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfY29udGVudGluZm9fbGFiZWxfdW5pcXVlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2NvbnRlbnRpbmZvX21pc3VzZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9jb250ZW50aW5mb19zaW5nbGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfZGVzY2VuZGFudF92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9kb2N1bWVudF9sYWJlbF91bmlxdWUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfZXZlbnRoYW5kbGVyX3JvbGVfdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfZm9ybV9sYWJlbF91bmlxdWUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfZ3JhcGhpY19sYWJlbGxlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9oaWRkZW5fbm9udGFiYmFibGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfaWRfdW5pcXVlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2ltZ19sYWJlbGxlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9rZXlib2FyZF9oYW5kbGVyX2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9sYW5kbWFya19uYW1lX3VuaXF1ZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9tYWluX2xhYmVsX3VuaXF1ZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9tYWluX2xhYmVsX3Zpc2libGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfbmF2aWdhdGlvbl9sYWJlbF91bmlxdWUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfcGFyZW50X3JlcXVpcmVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX3JlZ2lvbl9sYWJlbF91bmlxdWUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfcmVnaW9uX2xhYmVsbGVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX3JvbGVfYWxsb3dlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9yb2xlX3JlZHVuZGFudC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9zZWFyY2hfbGFiZWxfdW5pcXVlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX3NlbWFudGljcy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV90b29sYmFyX2xhYmVsX3VuaXF1ZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV93aWRnZXRfbGFiZWxsZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FzY2lpYXJ0X2FsdF9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2JsaW5rX2Nzc19yZXZpZXcudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2JsaW5rX2VsZW1fZGVwcmVjYXRlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYmxvY2txdW90ZV9jaXRlX2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvY2FudmFzX2NvbnRlbnRfZGVzY3JpYmVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9jYXB0aW9uX3RyYWNrX2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvY29tYm9ib3hfYWN0aXZlX2Rlc2NlbmRhbnQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2NvbWJvYm94X2F1dG9jb21wbGV0ZV92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvY29tYm9ib3hfZGVzaWduX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9jb21ib2JveF9mb2N1c2FibGVfZWxlbWVudHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2NvbWJvYm94X2hhc3BvcHVwX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9jb21ib2JveF9wb3B1cF9yZWZlcmVuY2UudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2RlYnVnX3BhdGhzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9kZXRlY3Rvcl90YWJiYWJsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZGlyX2F0dHJpYnV0ZV92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZG93bmxvYWRfa2V5Ym9hcmRfY29udHJvbGxhYmxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9kcmFnZ2FibGVfYWx0ZXJuYXRpdmVfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9lbGVtZW50X2FjY2Vzc2tleV9sYWJlbGxlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZWxlbWVudF9hY2Nlc3NrZXlfdW5pcXVlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9lbGVtZW50X2F0dHJpYnV0ZV9kZXByZWNhdGVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9lbGVtZW50X2lkX3VuaXF1ZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZWxlbWVudF9sYW5nX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9lbGVtZW50X21vdXNlZXZlbnRfa2V5Ym9hcmQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2VsZW1lbnRfb3JpZW50YXRpb25fdW5sb2NrZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2VsZW1lbnRfc2Nyb2xsYWJsZV90YWJiYWJsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZWxlbWVudF90YWJiYWJsZV9yb2xlX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9lbGVtZW50X3RhYmJhYmxlX3Vub2JzY3VyZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2VsZW1lbnRfdGFiYmFibGVfdmlzaWJsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZW1iZWRfYWx0X2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZW1vdGljb25zX2FsdF9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2Vycm9yX21lc3NhZ2VfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9maWVsZHNldF9sYWJlbF92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZmllbGRzZXRfbGVnZW5kX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9maWd1cmVfbGFiZWxfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9mb3JtX2ZvbnRfY29sb3IudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2Zvcm1faW50ZXJhY3Rpb25fcmV2aWV3LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9mb3JtX2xhYmVsX3VuaXF1ZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZm9ybV9zdWJtaXRfYnV0dG9uX2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZm9ybV9zdWJtaXRfcmV2aWV3LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9mcmFtZV9zcmNfdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2ZyYW1lX3RpdGxlX2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaGVhZGluZ19jb250ZW50X2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaGVhZGluZ19tYXJrdXBfbWlzdXNlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9odG1sX2xhbmdfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9odG1sX3NraXBuYXZfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pZnJhbWVfaW50ZXJhY3RpdmVfdGFiYmFibGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2ltYWdlYnV0dG9uX2FsdF9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2ltYWdlbWFwX2FsdF9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2ltZ19hbHRfYmFja2dyb3VuZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW1nX2FsdF9kZWNvcmF0aXZlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pbWdfYWx0X21pc3VzZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW1nX2FsdF9udWxsLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pbWdfYWx0X3JlZHVuZGFudC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW1nX2FsdF92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW1nX2lzbWFwX21pc3VzZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW1nX2xvbmdkZXNjX21pc3VzZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2lucHV0X2F1dG9jb21wbGV0ZV92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW5wdXRfY2hlY2tib3hlc19ncm91cGVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pbnB1dF9maWVsZHNfZ3JvdXBlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW5wdXRfaGFzcG9wdXBfY29uZmxpY3QudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2lucHV0X2xhYmVsX2FmdGVyLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pbnB1dF9sYWJlbF9iZWZvcmUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2lucHV0X2xhYmVsX2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW5wdXRfbGFiZWxfdmlzaWJsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW5wdXRfb25jaGFuZ2VfcmV2aWV3LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pbnB1dF9wbGFjZWhvbGRlcl9sYWJlbF92aXNpYmxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9sYWJlbF9jb250ZW50X2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvbGFiZWxfbmFtZV92aXNpYmxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9sYWJlbF9yZWZfdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2xpc3RfY2hpbGRyZW5fdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2xpc3RfbWFya3VwX3Jldmlldy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvbGlzdF9zdHJ1Y3R1cmVfcHJvcGVyLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9tYXJxdWVlX2VsZW1fYXZvaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL21lZGlhX2FsdF9icmllZi50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvbWVkaWFfYWx0X2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvbWVkaWFfYXVkaW9fdHJhbnNjcmliZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL21lZGlhX2F1dG9zdGFydF9jb250cm9sbGFibGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL21lZGlhX2tleWJvYXJkX2NvbnRyb2xsYWJsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvbWVkaWFfbGl2ZV9jYXB0aW9uZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL21lZGlhX3RyYWNrX2F2YWlsYWJsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvbWV0YV9yZWRpcmVjdF9vcHRpb25hbC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvbWV0YV9yZWZyZXNoX2RlbGF5LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9tZXRhX3ZpZXdwb3J0X3pvb21hYmxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9ub2VtYmVkX2NvbnRlbnRfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9vYmplY3RfdGV4dF9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3BhZ2VfdGl0bGVfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9wYWdlX3RpdGxlX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9zY3JpcHRfZm9jdXNfYmx1cl9yZXZpZXcudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3NjcmlwdF9vbmNsaWNrX2F2b2lkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9zY3JpcHRfb25jbGlja19taXN1c2UudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3NjcmlwdF9zZWxlY3RfcmV2aWV3LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9zZWxlY3Rfb3B0aW9uc19ncm91cGVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9za2lwX21haW5fZGVzY3JpYmVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9za2lwX21haW5fZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9zdHlsZV9iYWNrZ3JvdW5kX2RlY29yYXRpdmUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3N0eWxlX2JlZm9yZV9hZnRlcl9yZXZpZXcudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3N0eWxlX2NvbG9yX21pc3VzZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvc3R5bGVfZm9jdXNfdmlzaWJsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvc3R5bGVfaGlnaGNvbnRyYXN0X3Zpc2libGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3N0eWxlX2hvdmVyX3BlcnNpc3RlbnQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3N0eWxlX3ZpZXdwb3J0X3Jlc2l6YWJsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvc3ZnX2dyYXBoaWNzX2xhYmVsbGVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy90YWJsZV9hcmlhX2Rlc2NlbmRhbnRzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy90YWJsZV9jYXB0aW9uX2VtcHR5LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy90YWJsZV9jYXB0aW9uX25lc3RlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvdGFibGVfaGVhZGVyc19leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3RhYmxlX2hlYWRlcnNfcmVmX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy90YWJsZV9oZWFkZXJzX3JlbGF0ZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3RhYmxlX2xheW91dF9saW5lYXJpemVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy90YWJsZV9zY29wZV92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvdGFibGVfc3RydWN0dXJlX21pc3VzZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvdGFibGVfc3VtbWFyeV9yZWR1bmRhbnQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3RhcmdldF9zcGFjaW5nX3N1ZmZpY2llbnQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3RleHRfYmxvY2tfaGVhZGluZy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvdGV4dF9jb250cmFzdF9zdWZmaWNpZW50LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy90ZXh0X3F1b3RlZF9jb3JyZWN0bHkudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3RleHRfc2Vuc29yeV9taXN1c2UudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3RleHRfc3BhY2luZ192YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvdGV4dF93aGl0ZXNwYWNlX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy93aWRnZXRfdGFiYmFibGVfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy93aWRnZXRfdGFiYmFibGVfc2luZ2xlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlc2V0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvc2ltdWxhdG9yL1NSQ29udHJvbGxlci50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvc2ltdWxhdG9yL1NSQ3Vyc29yLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9zaW11bGF0b3IvU1JOYXZpZ2F0b3IudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3NpbXVsYXRvci9TUlJlbmRlcmVyLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9zaW11bGF0b3IvU1JSZW5kZXJlclJ1bGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3NpbXVsYXRvci9TUlRhYmxlVXRpbC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvc2ltdWxhdG9yL1NSVXRpbC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvc2ltdWxhdG9yL1NSVmlld2VyLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9zaW11bGF0b3IvcmVuZGVyX3J1bGVzL2NvbW1vbi50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvc2ltdWxhdG9yL3JlbmRlcl9ydWxlcy9jb250YWluZXJfZW50ZXIudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3NpbXVsYXRvci9yZW5kZXJfcnVsZXMvY29udGFpbnRlcl9leGl0LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9zaW11bGF0b3IvcmVuZGVyX3J1bGVzL2luZGV4LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC91dGlsL0FjY05hbWVVdGlsLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC91dGlsL0FyaWFVdGlsLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC91dGlsL0NTU1V0aWwudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3V0aWwvQ2FjaGVVdGlsLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC91dGlsL0NsaXBQYXRoVXRpbC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvdXRpbC9Db2xvclV0aWwudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3V0aWwvQ29tbW9uVXRpbC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvdXRpbC9UYWJsZVV0aWwudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3V0aWwvVmlzVXRpbC50cyIsIndlYnBhY2s6Ly9hY2Uvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMC0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuLypnbG9iYWwgT3BlbkFqYXgqL1xuLy8gYWxsIHJlZmVyZW5jZXMgdG8gV0FJLUFSSUEgc3BlY2lmaWNhdGlvbiBpcyB0aGUgV0FJLUFSSUEgMS4yXG4vLyBodHRwczovL3d3dy53My5vcmcvVFIvd2FpLWFyaWEtMS4yL1xuXG5leHBvcnQgdHlwZSBJRG9jdW1lbnRDb25mb3JtYW5jZVJlcXVpcmVtZW50ID0ge1xuICAgIGltcGxpY2l0Um9sZTogc3RyaW5nW10sXG4gICAgdmFsaWRSb2xlczogc3RyaW5nW10sXG4gICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogYm9vbGVhbixcbiAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlcz86IHN0cmluZ1tdLCBcbiAgICBvdGhlckRpc2FsbG93ZWRBcmlhQXR0cmlidXRlcz86IHN0cmluZ1tdLFxuICAgIG90aGVyUm9sZXNGb3JBdHRyaWJ1dGVzPzogc3RyaW5nW10sIC8vcm9sZXMsIG90aGVyIHRoYW4gaW1wbGljaXQgYW5kIHZhbGlkIHJvbGVzLCB3aG9zZSBhdHRyaWJ1dGVzIGFyZSBhbHNvIGFsbG93ZWRcbiAgICAvLyBhIGZldyBlbGVtZW50cyAoc3VjaCBhcyBkYXRhbGlzdCwgaHRtbCwgY2FwdGlvbikgdGhhdCBoYXZlIGFuIGltcGxpY2l0IHJvbGUgYnV0IGRpc2FsbG93IHNvbWUgb3IgYWxsIGF0dHJpYnV0ZXMgYWxsb3dlZCBmb3IgdGhlIHJvbGUuXG4gICAgYWxsb3dBdHRyaWJ1dGVzRnJvbUltcGxpY2l0Um9sZT86IGJvb2xlYW4sXG4gICAgcHJvaGliaXRlZEFyaWFBdHRyaWJ1dGVzV2hlbk5vSW1wbGljaXRSb2xlPzogc3RyaW5nW10gIC8vc29tZSBlbGVtZW50cyAodmFyLGFiYnIgZXRjLikgaGF2ZSBubyBpbXBsaWNpdCByb2xlIGJ1dCBuYW1pbmcgcHJvaGliaXRlZCAgIFxufVxuXG5leHBvcnQgY2xhc3MgQVJJQURlZmluaXRpb25zIHtcbiAgICBzdGF0aWMgbmFtZUZyb21Db250ZW50KHJvbGU6IHN0cmluZykgOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIChyb2xlIGluIEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJucykgXG4gICAgICAgICAgICAmJiBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNbcm9sZV0ubmFtZUZyb20gXG4gICAgICAgICAgICAmJiBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNbcm9sZV0ubmFtZUZyb20uaW5jbHVkZXMoXCJjb250ZW50c1wiKTtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIGFycmF5IG9mIFdBSS1BUklBIGdsb2JhbCBzdGF0ZXMgYW5kIHByb3BlcnRpZXNcbiAgICAgKiBAc2VlIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93YWktYXJpYS0xLjIvI2dsb2JhbF9zdGF0ZXNcbiAgICAgKi9cbiAgICBzdGF0aWMgZ2xvYmFsUHJvcGVydGllcyA6IHN0cmluZ1tdID0gW1wiYXJpYS1hdG9taWNcIiwgXCJhcmlhLWJ1c3lcIiwgXCJhcmlhLWNvbnRyb2xzXCIsIFwiYXJpYS1jdXJyZW50XCIsIFwiYXJpYS1kZXNjcmliZWRieVwiLCBcbiAgICAgICAgXCJhcmlhLWRldGFpbHNcIiwgXCJhcmlhLWZsb3d0b1wiLCBcImFyaWEtaGlkZGVuXCIsIFwiYXJpYS1rZXlzaG9ydGN1dHNcIixcbiAgICAgICAgXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCIsIFwiYXJpYS1saXZlXCIsIFwiYXJpYS1vd25zXCIsIFwiYXJpYS1yZWxldmFudFwiLCBcImFyaWEtcm9sZWRlc2NyaXB0aW9uXCJcbiAgICAgICAgLy8gdGhlIGZvbGxvd2luZyBhcmUgZGVwcmVjYXRlZCBpbiBBUklBIDEuMiwgd2lsbCBpbmRpY2F0ZSBkZXByZWNhdGlvbiBpbiBpbmRpdmlkdWFsIHJvbGVcbiAgICAgICAgLCAnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCdcbiAgICBdO1xuXG4gICAgLy9wcm9wZXJ0aWVzIGNvbnRhaW5zIGlkKHMpIHRoYXQgcmVmZXIgdG8gb3RoZXIgZWxlbWVudChzKVxuICAgIHN0YXRpYyByZWZlcmVuY2VQcm9wZXJ0aWVzIDogc3RyaW5nW10gPSBbXCJhcmlhLW93bnNcIiwgXCJhcmlhLWNvbnRyb2xzXCIsIFwiYXJpYS1kZXNjcmliZWRieVwiLCBcImFyaWEtbGFiZWxsZWRieVwiLCBcImFyaWEtZmxvd3RvXCIsIFwiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCJdO1xuXG4gICAgLy8gZGVwcmVjYXRlZCByb2xlc1xuICAgIHN0YXRpYyBnbG9iYWxEZXByZWNhdGVkUm9sZXMgOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgJ2RpcmVjdG9yeScsICdkb2MtYmlibGlvZW50cnknLCAnZG9jLWVuZG5vdGUnXG4gICAgXTtcblxuICAgIC8vIHRoZSBmb2xsb3dpbmcgYXJlIGRlcHJlY2F0ZWQgaW4gQVJJQSAxLjEgZm9yIGFsbCB0aGUgcm9sZXNcbiAgICBzdGF0aWMgZ2xvYmFsRGVwcmVjYXRlZFByb3BlcnRpZXMgOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgJ2FyaWEtZ3JhYmJlZCcsICdhcmlhLWRyb3BlZmZlY3QnXG4gICAgXTtcbiAgICBcbiAgICAvKlxuICAgICAqIFhTRCBkYXRhIHR5cGVzIGZvciBhbGwgV0FJLUFSSUEgcHJvcGVydGllc1xuICAgICAqIGFsb25nIHdpdGggdmFsaWQgdmFsdWVzIHdoZW4gdGhlIGRhdGEgdHlwZSBpcyBOTVRPS0VOXG4gICAgICogV0FJLUFSSUEgcHJvcGVydGllcyBkYXRhIHR5cGVzIGV4cGxhbmVkOlxuICAgICAqICB0eXBlOiBVc2VkIHRvIGlkZW50aWZ5IHRoZSB0eXBlIG9mIHZhbHVlcyBhbGxvd2VkIGZvciB0aGUgV0FJLUFSSUEgcHJvcGVydHlcbiAgICAgKiAgdmFsdWVzOiBVc2VkIHRvIGlkZW50aWZ5IHNwZWNpZmljIHZhbHVlcyBvZiBhbiBXQUktQVJJQSBwcm9wZXJ0eSB3aGVuIHR5cGUgaXMgbm10b2tlblxuICAgICAqICBoaWRkZW5JRFJlZlN1cHBvcnRlZDogVXNlZCB0byBpZGVudGlmeSBpZiB0aGUgV0FJLUFSSUEgcHJvcGVydHkgc3VwcG9ydHMgcmVmZXJlbmNpbmcgaGlkZGVuIElEXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHRydWU6IHJlZmVycyB0byBXQUktQVJJQSBwcm9wZXJ0eSBzdXBwb3J0cyBoaWRkZW4gSUQgcmVmZXJlbmNlc1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZTogcmVmZXJzIHRvIFdBSS1BUklBIHByb3BlcnR5IGRvZXMgbm90IHN1cHBvcnQgaGlkZGVuIElEIHJlZmVyZW5jZXNcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQgdmFsdWUgd2lsbCBiZSBzZXQgdG8gZmFsc2UsIGlmIG5vdCBzcGVjaWZpZWQuXG4gICAgICovXG4gICAgc3RhdGljIHByb3BlcnR5RGF0YVR5cGVzIDogeyBcbiAgICAgICAgW3Byb3A6IHN0cmluZ10gOiB7IFxuICAgICAgICAgICAgdHlwZTogc3RyaW5nLCBcbiAgICAgICAgICAgIGhpZGRlbklEUmVmU3VwcG9ydGVkPzogYm9vbGVhbixcbiAgICAgICAgICAgIHZhbHVlcz86IHN0cmluZ1tdIFxuICAgICAgICB9XG4gICAgfSA9IHtcbiAgICAgICAgXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpZHJlZlwiLFxuICAgICAgICAgICAgaGlkZGVuSURSZWZTdXBwb3J0ZWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWF0b21pY1wiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2Jvb2xlYW5cIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtYXV0b2NvbXBsZXRlXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjbm10b2tlblwiLFxuICAgICAgICAgICAgdmFsdWVzOiBbXCJpbmxpbmVcIiwgXCJsaXN0XCIsIFwiYm90aFwiLCBcIm5vbmVcIiwgXCJ1bmRlZmluZWRcIl0gLy9hZGQgdW5kZWZpbmVkIHRvIGhhbmRsZSB2YWx1ZSBlbXB0eVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtYnVzeVwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2Jvb2xlYW5cIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtY2hlY2tlZFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI25tdG9rZW5cIixcbiAgICAgICAgICAgIHZhbHVlczogW1widHJ1ZVwiLCBcImZhbHNlXCIsIFwibWl4ZWRcIiwgXCJ1bmRlZmluZWRcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWNvbGNvdW50XCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaW50XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWNvbGluZGV4XCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaW50XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWNvbHNwYW5cIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpbnRcIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtY29udHJvbHNcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpZHJlZnNcIixcbiAgICAgICAgICAgIGhpZGRlbklEUmVmU3VwcG9ydGVkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1jdXJyZW50XCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjbm10b2tlblwiLFxuICAgICAgICAgICAgdmFsdWVzOiBbXCJwYWdlXCIsIFwic3RlcFwiLCBcImxvY2F0aW9uXCIsIFwiZGF0ZVwiLCBcInRpbWVcIiwgXCJ0cnVlXCIsIFwiZmFsc2VcIiwgXCJ1bmRlZmluZWRcIl0gLy9hZGQgdW5kZWZpbmVkIGZvciBlbXB0eSB2YWx1ZVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtZGVzY3JpYmVkYnlcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpZHJlZnNcIixcbiAgICAgICAgICAgIGhpZGRlbklEUmVmU3VwcG9ydGVkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1kZXRhaWxzXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaWRyZWZzXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWRpc2FibGVkXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjYm9vbGVhblwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1kcm9wZWZmZWN0XCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjbm10b2tlbnNcIixcbiAgICAgICAgICAgIHZhbHVlczogW1wiY29weVwiLCBcIm1vdmVcIiwgXCJsaW5rXCIsIFwiZXhlY3V0ZVwiLCBcInBvcHVwXCIsIFwibm9uZVwiXVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtZXJyb3JtZXNzYWdlXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaWRyZWZcIixcbiAgICAgICAgICAgIGhpZGRlbklEUmVmU3VwcG9ydGVkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1leHBhbmRlZFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI25tdG9rZW5cIixcbiAgICAgICAgICAgIHZhbHVlczogW1widHJ1ZVwiLCBcImZhbHNlXCIsIFwidW5kZWZpbmVkXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1mbG93dG9cIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpZHJlZnNcIixcbiAgICAgICAgICAgIGhpZGRlbklEUmVmU3VwcG9ydGVkOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtZ3JhYmJlZFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI25tdG9rZW5cIixcbiAgICAgICAgICAgIHZhbHVlczogW1widHJ1ZVwiLCBcImZhbHNlXCIsIFwidW5kZWZpbmVkXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1oYXNwb3B1cFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI25tdG9rZW5cIixcbiAgICAgICAgICAgIHZhbHVlczogW1widHJ1ZVwiLCBcImZhbHNlXCIsIFwibWVudVwiLCBcImxpc3Rib3hcIiwgXCJ0cmVlXCIsIFwiZ3JpZFwiLCBcImRpYWxvZ1wiXVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtaGlkZGVuXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjbm10b2tlblwiLFxuICAgICAgICAgICAgdmFsdWVzOiBbXCJ0cnVlXCIsIFwiZmFsc2VcIiwgXCJ1bmRlZmluZWRcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWludmFsaWRcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNubXRva2VuXCIsXG4gICAgICAgICAgICB2YWx1ZXM6IFtcInRydWVcIiwgXCJmYWxzZVwiLCBcInNwZWxsaW5nXCIsIFwiZ3JhbW1hclwiLCBcInVuZGVmaW5lZFwiXSAvL2FkZCB1bmRlZmluZWQgZm9yIGVtcHR5IHZhbHVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1rZXlzaG9ydGN1dHNcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNzdHJpbmdcIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtbGFiZWxcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNzdHJpbmdcIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtbGFiZWxsZWRieVwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2lkcmVmc1wiLFxuICAgICAgICAgICAgaGlkZGVuSURSZWZTdXBwb3J0ZWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWxldmVsXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaW50XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWxpdmVcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNubXRva2VuXCIsXG4gICAgICAgICAgICB2YWx1ZXM6IFtcIm9mZlwiLCBcInBvbGl0ZVwiLCBcImFzc2VydGl2ZVwiXVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtbW9kYWxcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNib29sZWFuXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLW11bHRpbGluZVwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2Jvb2xlYW5cIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtbXVsdGlzZWxlY3RhYmxlXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjYm9vbGVhblwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1vcmllbnRhdGlvblwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI25tdG9rZW5cIixcbiAgICAgICAgICAgIHZhbHVlczogW1wiaG9yaXpvbnRhbFwiLCBcInZlcnRpY2FsXCIsIFwidW5kZWZpbmVkXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1vd25zXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaWRyZWZzXCIsXG4gICAgICAgICAgICBoaWRkZW5JRFJlZlN1cHBvcnRlZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtcGxhY2Vob2xkZXJcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNzdHJpbmdcIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtcG9zaW5zZXRcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpbnRcIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtcHJlc3NlZFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI25tdG9rZW5cIixcbiAgICAgICAgICAgIHZhbHVlczogW1widHJ1ZVwiLCBcImZhbHNlXCIsIFwibWl4ZWRcIiwgXCJ1bmRlZmluZWRcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXJlYWRvbmx5XCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjYm9vbGVhblwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1yZWxldmFudFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI25tdG9rZW5zXCIsXG4gICAgICAgICAgICB2YWx1ZXM6IFtcImFkZGl0aW9uc1wiLCBcInJlbW92YWxzXCIsIFwidGV4dFwiLCBcImFsbFwiXVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtcmVxdWlyZWRcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNib29sZWFuXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXJvbGVkZXNjcmlwdGlvblwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI3N0cmluZ1wiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1yb3djb3VudFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2ludFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1yb3dpbmRleFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2ludFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1yb3dzcGFuXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaW50XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXNlbGVjdGVkXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjbm10b2tlblwiLFxuICAgICAgICAgICAgdmFsdWVzOiBbXCJ0cnVlXCIsIFwiZmFsc2VcIiwgXCJ1bmRlZmluZWRcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXNldHNpemVcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpbnRcIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtc29ydFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI25tdG9rZW5cIixcbiAgICAgICAgICAgIHZhbHVlczogW1wiYXNjZW5kaW5nXCIsIFwiZGVzY2VuZGluZ1wiLCBcIm90aGVyXCIsIFwibm9uZVwiXVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtdmFsdWVtYXhcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNkZWNpbWFsXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXZhbHVlbWluXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjZGVjaW1hbFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS12YWx1ZW5vd1wiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2RlY2ltYWxcIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtdmFsdWV0ZXh0XCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjc3RyaW5nXCJcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qXG4gICAgICogZGVzaWduIHBhdHRlcm5zIGZvciBjb25jcmV0ZSBXQUktQVJJQSByb2xlc1xuICAgICAqIGxlZ2l0aW1hdGUga2V5cyBmb3IgZWFjaCByb2xlIGluY2x1ZGU6XG4gICAgICpcbiAgICAgKiAtIGNvbnRhaW5lcjogYXBwcm9wcmlhdGUgY29udGFpbmVyKHMpIGZvciB0aGF0IHJvbGVcbiAgICAgKiAtIHByb3BzOiBzdGF0ZXMgYW5kIHByb3BlcnRpZXMgdGhhdCBtYXkgYmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcm9sZSAoaW4gYWRkaXRpb24gdG8gdGhlIGdsb2JhbCBzdGF0ZXMgYW5kIHByb3BlcnRpZXMgbGlzdGVkIGFib3ZlKVxuICAgICAqIC0gcmVxUHJvcHM6IHJlcXVpcmVkIHN0YXRlcyBvciBwcm9wZXJ0aWVzIGZvciB0aGlzIHJvbGVcbiAgICAgKiAtIHJlcUNoaWxkcmVuOiByZXF1aXJlZCBjaGlsZHJlbiBmb3IgdGhpcyByb2xlXG4gICAgICogLSBodG1sRXF1aXY6IEhUTUwgZXF1aXZhbGVudCBmb3IgdGhpcyByb2xlXG4gICAgICogLSByb2xlVHlwZTogb25lIG9mIHdpZGdldCwgc3RydWN0dXJlLCBsYW5kbWFyaywgbGl2ZVJlZ2lvbiwgd2luZG93IChhcyBzZWVuIGluIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93YWktYXJpYS0xLjIvI3JvbGVzX2NhdGVnb3JpemF0aW9uKVxuICAgICAqIC0gbmFtZVJlcXVpcmVkOiBkZXRlcm1pbmVzIHdoZXRoZXIgYW4gYWNjZXNzaWJsZSBuYW1lIGlzIHJlcXVpcmVkIGZvciBhIHdpZGdldCAoc2VlIEFSSUEgc3BlYy4pXG4gICAgICogLSBuYW1lRnJvbTogZGV0ZXJtaW5lcyBob3cgYW4gYWNjZXNzaWJsZSBuYW1lIGlzIHN1cHBsaWVkIChhdXRob3Igb3IgY29udGVudCAtIHNlZSBBUklBIHNwZWMuKVxuICAgICAqIC0gZGVwcmVjYXRlZDogaWYgcHJlc2VudCwgaW5kaWNhdGVzIHRoYXQgdGhlIHJvbGUgaXMgZGVwcmVjYXRlZCwgYW5kIHByb3ZpZGVzIGEgbGlzdCBvZiBhbHRlcm5hdGl2ZSByb2xlKHMpXG4gICAgICovXG4gICAgc3RhdGljIGRlc2lnblBhdHRlcm5zIDoge1xuICAgICAgICBbcm9sZTogc3RyaW5nXToge1xuICAgICAgICAgICAgY29udGFpbmVyOiBzdHJpbmdbXSxcbiAgICAgICAgICAgIHByb3BzOiBzdHJpbmdbXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBzdHJpbmdbXSxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBzdHJpbmdbXSxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogc3RyaW5nLFxuICAgICAgICAgICAgcm9sZVR5cGU/OiBzdHJpbmcsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ/OiBib29sZWFuLFxuICAgICAgICAgICAgbmFtZUZyb20/OiBzdHJpbmdbXSxcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsQ2hpbGRyZW4/OiBib29sZWFuLFxuICAgICAgICAgICAgZGVwcmVjYXRlZD86IGJvb2xlYW4sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM/OiBzdHJpbmdbXVxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzPzogc3RyaW5nW11cbiAgICAgICAgfVxuICAgIH0gPSB7XG4gICAgICAgIFwiYWxlcnRcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGl2ZVJlZ2lvblwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiYWxlcnRkaWFsb2dcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtbW9kYWxcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2luZG93XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJhcHBsaWNhdGlvblwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIsIFwiYXJpYS1leHBhbmRlZFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIiwgLy8gb3IgY2FuIGJlIFwid2lkZ2V0XCJcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJhcnRpY2xlXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLXBvc2luc2V0XCIsIFwiYXJpYS1zZXRzaXplXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJiYW5uZXJcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiYmxvY2txdW90ZVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiYnV0dG9uXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWV4cGFuZGVkXCIsIFwiYXJpYS1wcmVzc2VkXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJidXR0b24gfCBpbnB1dFtAdHlwZT0nYnV0dG9uJ11cIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdLFxuICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxDaGlsZHJlbjogdHJ1ZSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImNhcHRpb25cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBbXCJmaWd1cmVcIiwgXCJncmlkXCIsIFwidGFibGVcIiwgXCJ0cmVlZ3JpZFwiXSxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcInByb2hpYml0ZWRcIl0sXG4gICAgICAgICAgICBwcm9oaWJpdGVkUHJvcHM6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiY2VsbFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IFtcInJvd1wiXSxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWNvbGluZGV4XCIsIFwiYXJpYS1jb2xzcGFuXCIsIFwiYXJpYS1yb3dpbmRleFwiLCBcImFyaWEtcm93c3BhblwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwidGRcIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImNoZWNrYm94XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWV4cGFuZGVkXCIsIFwiYXJpYS1yZWFkb25seVwiLCBcImFyaWEtcmVxdWlyZWRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogW1wiYXJpYS1jaGVja2VkXCJdLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwiaW5wdXRbQHR5cGU9J2NoZWNrYm94J11cIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdLFxuICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxDaGlsZHJlbjogdHJ1ZSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWhhc3BvcHVwJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJjb2RlXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcInByb2hpYml0ZWRcIl0sXG4gICAgICAgICAgICBwcm9oaWJpdGVkUHJvcHM6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiY29sdW1uaGVhZGVyXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogW1wicm93XCJdLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtY29saW5kZXhcIiwgXCJhcmlhLWNvbHNwYW5cIiwgXCJhcmlhLWV4cGFuZGVkXCIsIFwiYXJpYS1yZWFkb25seVwiLCBcImFyaWEtcmVxdWlyZWRcIiwgXCJhcmlhLXJvd2luZGV4XCIsIFwiYXJpYS1yb3dzcGFuXCIsIFwiYXJpYS1zZWxlY3RlZFwiLCBcImFyaWEtc29ydFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwidGhbQHNjb3BlPSdjb2wnXVwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl0gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJjb21ib2JveFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1jb250cm9sc1wiLCBcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiLCBcImFyaWEtYXV0b2NvbXBsZXRlXCIsIFwiYXJpYS1yZWFkb25seVwiLCBcImFyaWEtcmVxdWlyZWRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogW1wiYXJpYS1leHBhbmRlZFwiXSwgLy8gYXJpYS1jb250cm9scyBpc24ndCBhY3R1YWxseSByZXF1aXJlZCB3aGVuIGFyaWEtZXhwYW5kZWQ9XCJmYWxzZVwiXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogW10sXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJjb21wbGVtZW50YXJ5XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImNvbW1lbnRcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImNvbnRlbnRpbmZvXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImRlZmluaXRpb25cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wicHJvaGliaXRlZFwiXSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRQcm9wczogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJkZWxldGlvblwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJwcm9oaWJpdGVkXCJdLFxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImRpYWxvZ1wiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1tb2RhbFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aW5kb3dcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcbiAgICAgICAgXCJkaXJlY3RvcnlcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZDogdHJ1ZSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gIFxuICAgICAgICB9LCBcbiAgICAgICAgXCJkb2MtYWJzdHJhY3RcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWFja25vd2xlZGdtZW50c1wiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtYWZ0ZXJ3b3JkXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1hcHBlbmRpeFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtYmFja2xpbmtcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtZGlzYWJsZWRcIiwgXCJhcmlhLWV4cGFuZGVkXCIsIFwiYXJpYS1oYXNwb3B1cFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwiYSB8IGxpbmtcIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWJpYmxpb2VudHJ5XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogW1wibGlzdFwiXSxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWxldmVsXCIsIFwiYXJpYS1wb3NpbnNldFwiLCBcImFyaWEtc2V0c2l6ZVwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwibGlcIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1iaWJsaW9ncmFwaHlcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWJpYmxpb3JlZlwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1kaXNhYmxlZFwiLCBcImFyaWEtZXhwYW5kZWRcIiwgXCJhcmlhLWhhc3BvcHVwXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJhIHwgbGlua1wiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtY2hhcHRlclwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtY29sb3Bob25cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtY29uY2x1c2lvblwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtY292ZXJcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImltZ1wiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsQ2hpbGRyZW46IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtY3JlZGl0XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1jcmVkaXRzXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1kZWRpY2F0aW9uXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1lbmRub3RlXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogW1wibGlzdFwiXSxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWxldmVsXCIsIFwiYXJpYS1wb3NpbnNldFwiLCBcImFyaWEtc2V0c2l6ZVwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwibGlcIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtZW5kbm90ZXNcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtZXBpZ3JhcGhcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWVwaWxvZ3VlXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1lcnJhdGFcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWV4YW1wbGVcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWZvb3Rub3RlXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1mb3Jld29yZFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtZ2xvc3NhcnlcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWdsb3NzcmVmXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWRpc2FibGVkXCIsIFwiYXJpYS1leHBhbmRlZFwiLCBcImFyaWEtaGFzcG9wdXBcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImEgfCBsaW5rXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1pbmRleFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtaW50cm9kdWN0aW9uXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1ub3RlcmVmXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWRpc2FibGVkXCIsIFwiYXJpYS1leHBhbmRlZFwiLCBcImFyaWEtaGFzcG9wdXBcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImEgfCBsaW5rXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1ub3RpY2VcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1wYWdlYnJlYWtcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtb3JpZW50YXRpb25cIl0sIC8vIGFyaWEtZGlzYWJsZWQsIGFyaWEtdmFsdWVtYXgsIGFyaWEtdmFsdWVtaW4sIGFyaWEtdmFsdWV0ZXh0IGFyZSB2YWxpZCBpZiBmb2N1c2FibGUuIFRoaXMgaXMgaGFuZGxlZCBpbiB0aGUgY29kZS5cbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLCAvLyBhcmlhLXZhbHVlbm93IGlzIHJlcXVpcmVkIGlmIGZvY3VzYWJsZS4gVGhpcyBpcyBoYW5kbGVkIGluIHRoZSBjb2RlLlxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIiwgLy8gb3Igd2lkZ2V0IGlmIGZvY3VzYWJsZVxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdLFxuICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxDaGlsZHJlbjogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1wYWdlbGlzdFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtcGFnZWZvb3RlclwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcInByb2hpYml0ZWRcIl0sXG4gICAgICAgICAgICBwcm9oaWJpdGVkUHJvcHM6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl0sXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLXBhZ2VoZWFkZXJcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJwcm9oaWJpdGVkXCJdLFxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdLFxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1wYXJ0XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1wcmVmYWNlXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1wcm9sb2d1ZVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtcHVsbHF1b3RlXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtcW5hXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1zdWJ0aXRsZVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtdGlwXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtdG9jXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvY3VtZW50XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiZW1waGFzaXNcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wicHJvaGliaXRlZFwiXSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRQcm9wczogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJmZWVkXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogW1wiYXJ0aWNsZVwiXSxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJmaWd1cmVcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImZvcm1cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImZvcm1cIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJnZW5lcmljXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJkaXYgfCBzcGFuXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJwcm9oaWJpdGVkXCJdLFxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCIsIFwiYXJpYS1yb2xlZGVzY3JpcHRpb25cIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiZ3JhcGhpY3MtZG9jdW1lbnRcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgXCJncmFwaGljcy1vYmplY3RcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIFwiZ3JhcGhpY3Mtc3ltYm9sXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBwcmVzZW50YXRpb25hbENoaWxkcmVuOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICBcImdyaWRcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiLCBcImFyaWEtY29sY291bnRcIiwgXCJhcmlhLW11bHRpc2VsZWN0YWJsZVwiLCBcImFyaWEtcmVhZG9ubHlcIiwgXCJhcmlhLXJvd2NvdW50XCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogW1wicm93XCIsIFwicm93Z3JvdXBcIl0sIC8vIHJvd2dyb3VwIGlzIG5vdCByZXF1aXJlZCwgYnV0IGl0IGlzIGFsbG93ZWRcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJ0YWJsZVwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiZ3JpZGNlbGxcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBbXCJyb3dcIl0sXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1jb2xpbmRleFwiLCBcImFyaWEtY29sc3BhblwiLCBcImFyaWEtZGlzYWJsZWRcIiwgXCJhcmlhLWVycm9ybWVzc2FnZVwiLCBcImFyaWEtZXhwYW5kZWRcIiwgXCJhcmlhLWhhc3BvcHVwXCIsIFwiYXJpYS1pbnZhbGlkXCIsIFwiYXJpYS1yZWFkb25seVwiLCBcImFyaWEtcmVxdWlyZWRcIiwgXCJhcmlhLXJvd2luZGV4XCIsIFwiYXJpYS1yb3dzcGFuXCIsIFwiYXJpYS1zZWxlY3RlZFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwidGRcIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJncm91cFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiaGVhZGluZ1wiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBbXCJhcmlhLWxldmVsXCJdLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwiaDEgfCBoMiB8IGgzIHwgaDQgfCBoNSB8IGg2XCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJpbWdcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImltZ1wiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxDaGlsZHJlbjogdHJ1ZSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJpbWFnZVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwiaW1nXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBwcmVzZW50YXRpb25hbENoaWxkcmVuOiB0cnVlLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImluc2VydGlvblwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJwcm9oaWJpdGVkXCJdLFxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImxpbmtcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtZXhwYW5kZWRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImEgfCBsaW5rXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImxpc3RcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBbXCJsaXN0aXRlbVwiXSxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJvbCB8IHVsXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwibGlzdGJveFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIsIFwiYXJpYS1leHBhbmRlZFwiLCBcImFyaWEtbXVsdGlzZWxlY3RhYmxlXCIsIFwiYXJpYS1vcmllbnRhdGlvblwiLCBcImFyaWEtcmVhZG9ubHlcIiwgXCJhcmlhLXJlcXVpcmVkXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogW1wiZ3JvdXBcIiwgXCJvcHRpb25cIl0sIC8vIGdyb3VwIGlzIG5vdCByZXF1aXJlZCwgYnV0IGl0IGlzIGFsbG93ZWRcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWhhc3BvcHVwJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJsaXN0aXRlbVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IFtcImxpc3RcIl0sXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1sZXZlbFwiLCBcImFyaWEtcG9zaW5zZXRcIiwgXCJhcmlhLXNldHNpemVcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImxpXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwibG9nXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxpdmVSZWdpb25cIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwibWFpblwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJtYXJrXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJtYXJrXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJwcm9oaWJpdGVkXCJdLFxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcIm1hcnF1ZWVcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGl2ZVJlZ2lvblwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwibWF0aFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBwcmVzZW50YXRpb25hbENoaWxkcmVuOiBmYWxzZSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJtZW51XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIiwgXCJhcmlhLW9yaWVudGF0aW9uXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogW1wiZ3JvdXBcIiwgXCJtZW51aXRlbVwiLCBcIm1lbnVpdGVtY2hlY2tib3hcIiwgXCJtZW51aXRlbXJhZGlvXCJdLCAvLyBncm91cCBpcyBub3QgcmVxdWlyZWQsIGJ1dCBpdCBpcyBhbGxvd2VkXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJtZW51YmFyXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIiwgXCJhcmlhLW9yaWVudGF0aW9uXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogW1wiZ3JvdXBcIiwgXCJtZW51aXRlbVwiLCBcIm1lbnVpdGVtY2hlY2tib3hcIiwgXCJtZW51aXRlbXJhZGlvXCJdLCAvLyBncm91cCBpcyBub3QgcmVxdWlyZWQsIGJ1dCBpdCBpcyBhbGxvd2VkXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsIFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwibWVudWl0ZW1cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBbXCJncm91cFwiLCBcIm1lbnVcIiwgXCJtZW51YmFyXCJdLCAvLyBncm91cCBvbmx5IGNvdW50cyBhcyBhIHZhbGlkIGNvbnRhaW5lciBpZiBpdCBpcyBjb250YWluZWQgaW4gYSBtZW51IG9yIG1lbnViYXJcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWV4cGFuZGVkXCIsIFwiYXJpYS1wb3NpbnNldFwiLCBcImFyaWEtc2V0c2l6ZVwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIFwibWVudWl0ZW1jaGVja2JveFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IFtcImdyb3VwXCIsIFwibWVudVwiLCBcIm1lbnViYXJcIl0sIC8vIGdyb3VwIG9ubHkgY291bnRzIGFzIGEgdmFsaWQgY29udGFpbmVyIGlmIGl0IGlzIGNvbnRhaW5lZCBpbiBhIG1lbnUgb3IgbWVudWJhclxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtZXhwYW5kZWRcIiwgXCJhcmlhLXBvc2luc2V0XCIsIFwiYXJpYS1zZXRzaXplXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IFtcImFyaWEtY2hlY2tlZFwiXSxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl0sXG4gICAgICAgICAgICBwcmVzZW50YXRpb25hbENoaWxkcmVuOiB0cnVlLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwibWVudWl0ZW1yYWRpb1wiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IFtcImdyb3VwXCIsIFwibWVudVwiLCBcIm1lbnViYXJcIl0sIC8vIGdyb3VwIG9ubHkgY291bnRzIGFzIGEgdmFsaWQgY29udGFpbmVyIGlmIGl0IGlzIGNvbnRhaW5lZCBpbiBhIG1lbnUgb3IgbWVudWJhclxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtZXhwYW5kZWRcIiwgXCJhcmlhLXBvc2luc2V0XCIsIFwiYXJpYS1zZXRzaXplXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IFtcImFyaWEtY2hlY2tlZFwiXSxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl0sXG4gICAgICAgICAgICBwcmVzZW50YXRpb25hbENoaWxkcmVuOiB0cnVlLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwibWV0ZXJcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtdmFsdWVtYXhcIiwgXCJhcmlhLXZhbHVlbWluXCIsIFwiYXJpYS12YWx1ZXRleHRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogW1wiYXJpYS12YWx1ZW5vd1wiXSxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxDaGlsZHJlbjogdHJ1ZSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJuYXZpZ2F0aW9uXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcIm5vbmVcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcInByb2hpYml0ZWRcIl0sXG4gICAgICAgICAgICBwcm9oaWJpdGVkUHJvcHM6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwibm90ZVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwib3B0aW9uXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogW1wiZ3JvdXBcIiwgXCJsaXN0Ym94XCJdLCAvLyBncm91cCBvbmx5IGNvdW50cyBhcyBhIHZhbGlkIGNvbnRhaW5lciBpZiBpdCBpcyBjb250YWluZWQgaW4gYSBsaXN0Ym94XG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1zZWxlY3RlZFwiLCBcImFyaWEtY2hlY2tlZFwiLCBcImFyaWEtcG9zaW5zZXRcIiwgXCJhcmlhLXNldHNpemVcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCwgLy8gXCJhcmlhLXNlbGVjdGVkXCIgaGFzIGEgZGVmYXVsdFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwib3B0aW9uXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXSxcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsQ2hpbGRyZW46IHRydWUsXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInBhcmFncmFwaFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJwcm9oaWJpdGVkXCJdLFxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInByZXNlbnRhdGlvblwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW10sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wicHJvaGliaXRlZFwiXSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRQcm9wczogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJwcm9ncmVzc2JhclwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS12YWx1ZW1heFwiLCBcImFyaWEtdmFsdWVtaW5cIiwgXCJhcmlhLXZhbHVlbm93XCIsIFwiYXJpYS12YWx1ZXRleHRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxDaGlsZHJlbjogdHJ1ZSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJyYWRpb1wiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1wb3NpbnNldFwiLCBcImFyaWEtc2V0c2l6ZVwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBbXCJhcmlhLWNoZWNrZWRcIl0sXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJpbnB1dFtAdHlwZT0ncmFkaW8nXVwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl0sXG4gICAgICAgICAgICBwcmVzZW50YXRpb25hbENoaWxkcmVuOiB0cnVlLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJyYWRpb2dyb3VwXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIiwgXCJhcmlhLW9yaWVudGF0aW9uXCIsIFwiYXJpYS1yZWFkb25seVwiLCBcImFyaWEtcmVxdWlyZWRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBbXCJyYWRpb1wiXSxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1oYXNwb3B1cCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwicmVnaW9uXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInJvd1wiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IFtcImdyaWRcIiwgXCJyb3dncm91cFwiLCBcInRhYmxlXCIsIFwidHJlZWdyaWRcIl0sXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIsIFwiYXJpYS1jb2xpbmRleFwiLCBcImFyaWEtZXhwYW5kZWRcIiwgXCJhcmlhLWxldmVsXCIsIFwiYXJpYS1wb3NpbnNldFwiLCBcImFyaWEtcm93aW5kZXhcIiwgXCJhcmlhLXNlbGVjdGVkXCIsIFwiYXJpYS1zZXRzaXplXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogW1wiY2VsbFwiLCBcImNvbHVtbmhlYWRlclwiLCBcImdyaWRjZWxsXCIsIFwicm93aGVhZGVyXCJdLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcInRyXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwicm93Z3JvdXBcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBbXCJncmlkXCIsIFwidGFibGVcIiwgXCJ0cmVlZ3JpZFwiXSxcbiAgICAgICAgICAgIHByb3BzOiBbXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IFtcInJvd1wiXSxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJ0Ym9keSB8IHRmb290IHwgdGhlYWRcIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJyb3doZWFkZXJcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBbXCJyb3dcIl0sXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1jb2xpbmRleFwiLCBcImFyaWEtY29sc3BhblwiLCBcImFyaWEtZXhwYW5kZWRcIiwgXCJhcmlhLXJlYWRvbmx5XCIsIFwiYXJpYS1yZXF1aXJlZFwiLCBcImFyaWEtcm93aW5kZXhcIiwgXCJhcmlhLXJvd3NwYW5cIiwgXCJhcmlhLXNlbGVjdGVkXCIsIFwiYXJpYS1zb3J0XCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJ0aFtAc2NvcGU9J3JvdyddXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXVxuICAgICAgICB9LFxuXG4gICAgICAgIFwic2Nyb2xsYmFyXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLW9yaWVudGF0aW9uXCIsIFwiYXJpYS12YWx1ZW1heFwiLCBcImFyaWEtdmFsdWVtaW5cIiwgXCJhcmlhLXZhbHVldGV4dFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBbXCJhcmlhLWNvbnRyb2xzXCIsIFwiYXJpYS12YWx1ZW5vd1wiXSxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsQ2hpbGRyZW46IHRydWUsXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInNlYXJjaFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJzZWFyY2hib3hcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiLCBcImFyaWEtYXV0b2NvbXBsZXRlXCIsIFwiYXJpYS1tdWx0aWxpbmVcIiwgXCJhcmlhLXBsYWNlaG9sZGVyXCIsIFwiYXJpYS1yZWFkb25seVwiLCBcImFyaWEtcmVxdWlyZWRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImlucHV0W0B0eXBlPSdzZWFyY2gnXVwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJzZXBhcmF0b3JcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtb3JpZW50YXRpb25cIl0sIC8vIGFyaWEtZGlzYWJsZWQsIGFyaWEtdmFsdWVtYXgsIGFyaWEtdmFsdWVtaW4sIGFyaWEtdmFsdWV0ZXh0IGFyZSB2YWxpZCBpZiBmb2N1c2FibGUuIFRoaXMgaXMgaGFuZGxlZCBpbiB0aGUgY29kZS5cbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLCAvLyBhcmlhLXZhbHVlbm93IGlzIHJlcXVpcmVkIGlmIGZvY3VzYWJsZS4gVGhpcyBpcyBoYW5kbGVkIGluIHRoZSBjb2RlLlxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIiwgLy8gb3Igd2lkZ2V0IGlmIGZvY3VzYWJsZVxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsQ2hpbGRyZW46IHRydWUsXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInNsaWRlclwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1vcmllbnRhdGlvblwiLCBcImFyaWEtcmVhZG9ubHlcIiwgXCJhcmlhLXZhbHVlbWF4XCIsIFwiYXJpYS12YWx1ZW1pblwiLCBcImFyaWEtdmFsdWV0ZXh0XCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IFtcImFyaWEtdmFsdWVub3dcIl0sXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsQ2hpbGRyZW46IHRydWVcbiAgICAgICAgfSxcblxuICAgICAgICBcInNwaW5idXR0b25cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiLCBcImFyaWEtcmVhZG9ubHlcIiwgXCJhcmlhLXJlcXVpcmVkXCIsIFwiYXJpYS12YWx1ZW1heFwiLCBcImFyaWEtdmFsdWVtaW5cIiwgXCJhcmlhLXZhbHVlbm93XCIsIFwiYXJpYS12YWx1ZXRleHRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtaGFzcG9wdXAnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInN0YXR1c1wiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsaXZlUmVnaW9uXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInN0cm9uZ1wiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJwcm9oaWJpdGVkXCJdLFxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInN1YnNjcmlwdFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJwcm9oaWJpdGVkXCJdLFxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInN1Z2dlc3Rpb25cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wicHJvaGliaXRlZFwiXSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRQcm9wczogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJzdXBlcnNjcmlwdFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJwcm9oaWJpdGVkXCJdLFxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInN3aXRjaFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1leHBhbmRlZFwiLCBcImFyaWEtcmVhZG9ubHlcIiwgXCJhcmlhLXJlcXVpcmVkXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IFtcImFyaWEtY2hlY2tlZFwiXSxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl0sXG4gICAgICAgICAgICBwcmVzZW50YXRpb25hbENoaWxkcmVuOiB0cnVlLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtaGFzcG9wdXAnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInRhYlwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IFtcInRhYmxpc3RcIl0sXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1leHBhbmRlZFwiLCBcImFyaWEtcG9zaW5zZXRcIiwgXCJhcmlhLXNlbGVjdGVkXCIsIFwiYXJpYS1zZXRzaXplXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdLFxuICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxDaGlsZHJlbjogdHJ1ZSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInRhYmxlXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWNvbGNvdW50XCIsIFwiYXJpYS1yb3djb3VudFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IFtcInJvd1wiLCBcInJvd2dyb3VwXCIsIFwiY2FwdGlvblwiXSwgLy8gcm93Z3JvdXAgYW5kIGNhcHRpb24gYXJlIG5vdCByZXF1aXJlZCwgYnV0IGl0IGlzIGFsbG93ZWRcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJ0YWJsZVwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJ0YWJsaXN0XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIiwgXCJhcmlhLW11bHRpc2VsZWN0YWJsZVwiLCBcImFyaWEtb3JpZW50YXRpb25cIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBbXCJ0YWJcIl0sXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsIFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwidGFicGFuZWxcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInRlcm1cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImRmblwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wicHJvaGliaXRlZFwiXSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRQcm9wczogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJ0ZXh0Ym94XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIiwgXCJhcmlhLWF1dG9jb21wbGV0ZVwiLCBcImFyaWEtbXVsdGlsaW5lXCIsIFwiYXJpYS1wbGFjZWhvbGRlclwiLCBcImFyaWEtcmVhZG9ubHlcIiwgXCJhcmlhLXJlcXVpcmVkXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJpbnB1dFtAdHlwZT0ndGV4dCddXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcblxuICAgICAgICBcInRpbWVcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wicHJvaGliaXRlZFwiXSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRQcm9wczogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJ0aW1lclwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsaXZlUmVnaW9uXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInRvb2xiYXJcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiLCBcImFyaWEtb3JpZW50YXRpb25cIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJ0b29sdGlwXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSwgLy8gQVJJQSAxLjIgaGFzIHRoaXMgYXMgbmFtZVJlcXVpcmVkOiB0cnVlLCBidXQgQVJJQSAxLjMgcmVtb3ZlZCBpdCBiZWNhdXNlIGl0IG1ha2VzIG5vIHNlbnNlIHRvIHJlcXVpcmUgYSBuYW1lIG9uIGEgdG9vbHRpcC5cbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJ0cmVlXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIiwgXCJhcmlhLW11bHRpc2VsZWN0YWJsZVwiLCBcImFyaWEtb3JpZW50YXRpb25cIiwgXCJhcmlhLXJlcXVpcmVkXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogW1wiZ3JvdXBcIiwgXCJ0cmVlaXRlbVwiXSwgLy8gZ3JvdXAgaXMgbm90IHJlcXVpcmVkLCBidXQgaXQgaXMgYWxsb3dlZFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtaGFzcG9wdXAnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInRyZWVncmlkXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIiwgXCJhcmlhLWNvbGNvdW50XCIsIFwiYXJpYS1tdWx0aXNlbGVjdGFibGVcIiwgXCJhcmlhLW9yaWVudGF0aW9uXCIsIFwiYXJpYS1yZWFkb25seVwiLCBcImFyaWEtcmVxdWlyZWRcIiwgXCJhcmlhLXJvd2NvdW50XCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogW1wicm93XCIsIFwicm93Z3JvdXBcIl0sIC8vIHJvd2dyb3VwIGlzIG5vdCByZXF1aXJlZCwgYnV0IGl0IGlzIGFsbG93ZWRcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWhhc3BvcHVwJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJ0cmVlaXRlbVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IFtcImdyb3VwXCIsIFwidHJlZVwiXSxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWNoZWNrZWRcIiwgXCJhcmlhLWV4cGFuZGVkXCIsIFwiYXJpYS1sZXZlbFwiLCBcImFyaWEtcG9zaW5zZXRcIiwgXCJhcmlhLXNlbGVjdGVkXCIsIFwiYXJpYS1zZXRzaXplXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuICAgIH0gLy8gZW5kIGRlc2lnblBhdHRlcm5zXG5cbiAgICAvLyBjb3BpZWQgZnJvbSBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zZW1hbnRpY3Mtb3RoZXIuaHRtbCNkaXNhYmxlZC1lbGVtZW50c1xuICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2lucHV0Lmh0bWwjaW5wdXQtdHlwZS1hdHRyLXN1bW1hcnlcbiAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML0F0dHJpYnV0ZXMvZGlzYWJsZWRcbiAgICAvKiogbm90ZTpcbiAgICAgICogaWYgYSA8ZmllbGRzZXQ+IGlzIGRpc2FibGVkLCB0aGUgZGVzY2VuZGFudCBmb3JtIGNvbnRyb2xzIGFyZSBhbGwgZGlzYWJsZWQgZXhjZXB0IDxsZWdlbmQ+XG4gICAgICAqIElmIGFuIDxvcHRncm91cD4gaXMgZGlzYWJsZWQsIHRoZSBzZWxlY3QgaXMgc3RpbGwgaW50ZXJhY3RpdmUgKHVubGVzcyBvdGhlcndpc2UgZGlzYWJsZWQpLCBidXQgbm9uZSBvZiB0aGUgaXRlbXMgaW4gdGhlIG9wdGlvbiBncm91cCBhcmUgc2VsZWN0YWJsZS5cbiAgICAgICogV2hlbiBhbiBlbGVtZW50IGhhcyB0aGUgZGlzYWJsZWQgYXR0cmlidXRlIGFwcGxpZWQsIHRoZSA6ZGlzYWJsZWQgcHNldWRvLWNsYXNzIGFsc28gYXBwbGllcyB0byBpdC4gXG4gICAgICovXG4gICAgc3RhdGljIGVsZW1lbnRzQWxsb3dlZERpc2FibGVkID0gW1wiYnV0dG9uXCIsIFwiaW5wdXRcIiwgXCJzZWxlY3RcIiwgXCJ0ZXh0YXJlYVwiLCBcIm9wdGdyb3VwXCIsIFwib3B0aW9uXCIsIFwiZmllbGRzZXRcIl07IC8vIGFsc28gZm9ybS1hc3NvY2lhdGVkIGN1c3RvbSBlbGVtZW50XG4gICAgc3RhdGljIGVsZW1lbnRzQWxsb3dlZFJlcXVpcmVkID0gW1wic2VsZWN0XCIsIFwidGV4dGFyZWFcIl07IC8vIHJlbW92ZSAnaW5wdXQnIGFuZCBhZGQgdG8gdGhlIGluZGl2aWR1YWwgZWxlbWVudCwgYmVjdWFzZSByZXF1aXJlZCBpcyBub3Qgc3VwcG9ydGVkIG9uIGlucHV0QHR5cGU9XCJyYW5nZVwiLCBcImNvbG9yXCIsIFwiaGlkZGVuXCIgb3IgYW55IGJ1dHRvbiB0eXBlc1xuICAgIHN0YXRpYyBlbGVtZW50c0FsbG93ZWRSZWFkT25seSA9IFtcInRleHRhcmVhXCJdOyAvLyByZW1vdmUgJ2lucHV0JyBhbmQgYWRkIHRvIHRoZSBpbmRpdmlkdWFsIGVsZW1lbnQsIGJlY2F1c2UgcmVhZG9ubHkgaXMgbm90IHN1cHBvcnRlZCBvbiBpbnB1dEB0eXBlPVwiY2hlY2tib3hcIiwgXCJyYWRpb1wiLCBcInJhbmdlXCIsIFwiY29sb3JcIiwgXCJmaWxlXCIsIGhpZGRlblwiIG9yIGFueSBidXR0b24gdHlwZXNcblxuXG4gICAgLyogaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWwtYXJpYS8jZG9jY29uZm9ybWFuY2VcbiAgICAgICAgKiBkb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnQgY29udGFpbnMgcHJvcGVydGllcyBvZiB0aGUgdGFncyByZWxhdGVkIHRvIHJvbGUgd2l0aG91dCBhbnkgYWRkaXRpb25hbCBhdHRyaWJ1dGUgdmFsdWVcbiAgICAgICAgKiBkb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnRTcGVjaWFsVGFncyBjb250YWlucyB0aG9zZSB0YWdzIHRoYXQgcmVxdWlyZSBzcGVjaWFsIGNvbnNpZGVyYXRpb25zXG4gICAgICAgICovXG4gICAgc3RhdGljIGRvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudDoge1xuICAgICAgICBbcm9sZTogc3RyaW5nXTogSURvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudFxuICAgIH0gPSB7XG4gICAgICAgIFwiYWJiclwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgcHJvaGliaXRlZEFyaWFBdHRyaWJ1dGVzV2hlbk5vSW1wbGljaXRSb2xlOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiYWRkcmVzc1wiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdyb3VwXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImFydGljbGVcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJhcnRpY2xlXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYXBwbGljYXRpb25cIiwgXCJkb2N1bWVudFwiLCBcImZlZWRcIiwgXCJtYWluXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiLCBcInJlZ2lvblwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJhc2lkZVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImNvbXBsZW1lbnRhcnlcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJkb2MtZGVkaWNhdGlvblwiLCBcImRvYy1leGFtcGxlXCIsIFwiZG9jLWZvb3Rub3RlXCIsIFwiZG9jLWdsb3NzYXJ5XCIsIFwiZG9jLXB1bGxxdW90ZVwiLCBcImRvYy10aXBcIiwgXCJmZWVkXCIsIFwibm9uZVwiLCBcIm5vdGVcIiwgXCJwcmVzZW50YXRpb25cIiwgXCJyZWdpb25cIiwgXCJzZWFyY2hcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXVkaW9cIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYXBwbGljYXRpb25cIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYlwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdlbmVyaWNcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYmFzZVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgXCJiZGlcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImJkb1wiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdlbmVyaWNcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYmxvY2txdW90ZVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImJsb2NrcXVvdGVcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYm9keVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdlbmVyaWNcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgb3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFsnYXJpYS1oaWRkZW4nXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJiclwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2UsXG4gICAgICAgICAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1oaWRkZW5cIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJidXR0b25cIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJidXR0b25cIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJjaGVja2JveFwiLCBcImNvbWJvYm94XCIsIFwiZ3JpZGNlbGxcIiwgXCJsaW5rXCIsIFwibWVudWl0ZW1cIiwgXCJtZW51aXRlbWNoZWNrYm94XCIsIFwibWVudWl0ZW1yYWRpb1wiLCBcIm9wdGlvblwiLCBcInJhZGlvXCIsXCJzZXBhcmF0b3JcIiwgXCJzbGlkZXJcIiwgXCJzd2l0Y2hcIiwgXCJ0YWJcIiwgXCJ0cmVlaXRlbVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJjYW52YXNcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImNhcHRpb25cIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbJ2NhcHRpb24nXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgYWxsb3dBdHRyaWJ1dGVzRnJvbUltcGxpY2l0Um9sZTogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgXCJjaXRlXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICBwcm9oaWJpdGVkQXJpYUF0dHJpYnV0ZXNXaGVuTm9JbXBsaWNpdFJvbGU6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJjb2RlXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiY29kZVwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJjb2xcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwiY29sZ3JvdXBcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwiZGF0YVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdlbmVyaWNcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiZGF0YWxpc3RcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJsaXN0Ym94XCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlLFxuICAgICAgICAgICAgYWxsb3dBdHRyaWJ1dGVzRnJvbUltcGxpY2l0Um9sZTogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgXCJkZFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImRlbFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImRlbGV0aW9uXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImRldGFpbHNcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJncm91cFwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiZGZuXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1widGVybVwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJkaWFsb2dcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJkaWFsb2dcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbGVydGRpYWxvZ1wiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICBcImRsXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImdyb3VwXCIsIFwibGlzdFwiLCBcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiZHRcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJ0ZXJtXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wibGlzdGl0ZW1cIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiZW1cIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImVtYmVkXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFwcGxpY2F0aW9uXCIsIFwiZG9jdW1lbnRcIiwgXCJpbWdcIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImZpZWxkc2V0XCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ3JvdXBcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCIsIFwicmFkaW9ncm91cFwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJmaWdjYXB0aW9uXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImdyb3VwXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICBwcm9oaWJpdGVkQXJpYUF0dHJpYnV0ZXNXaGVuTm9JbXBsaWNpdFJvbGU6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJmb3JtXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZm9ybVwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIiwgXCJzZWFyY2hcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiaGVhZFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgXCJoZ3JvdXBcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJncm91cFwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJoMVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImhlYWRpbmdcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJkb2Mtc3VidGl0bGVcIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCIsIFwidGFiXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImgyXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiaGVhZGluZ1wiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImRvYy1zdWJ0aXRsZVwiLCBcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIiwgXCJ0YWJcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiaDNcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJoZWFkaW5nXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiZG9jLXN1YnRpdGxlXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiLCBcInRhYlwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJoNFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImhlYWRpbmdcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJkb2Mtc3VidGl0bGVcIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCIsIFwidGFiXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImg1XCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiaGVhZGluZ1wiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImRvYy1zdWJ0aXRsZVwiLCBcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIiwgXCJ0YWJcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiaDZcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJoZWFkaW5nXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiZG9jLXN1YnRpdGxlXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiLCBcInRhYlwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJoclwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInNlcGFyYXRvclwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImRvYy1wYWdlYnJlYWtcIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImh0bWxcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJkb2N1bWVudFwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZSxcbiAgICAgICAgICAgIGFsbG93QXR0cmlidXRlc0Zyb21JbXBsaWNpdFJvbGU6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwiaVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdlbmVyaWNcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiaWZyYW1lXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFwcGxpY2F0aW9uXCIsIFwiZG9jdW1lbnRcIiwgXCJpbWdcIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImluc1wiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImluc2VydGlvblwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJrYmRcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRBcmlhQXR0cmlidXRlc1doZW5Ob0ltcGxpY2l0Um9sZTogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXVxuICAgICAgICB9LFxuICAgICAgICBcImxhYmVsXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgcHJvaGliaXRlZEFyaWFBdHRyaWJ1dGVzV2hlbk5vSW1wbGljaXRSb2xlOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwibGVnZW5kXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgcHJvaGliaXRlZEFyaWFBdHRyaWJ1dGVzV2hlbk5vSW1wbGljaXRSb2xlOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwibGlua1wiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgXCJtYWluXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wibWFpblwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwibWFwXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcIm1hcmtcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRBcmlhQXR0cmlidXRlc1doZW5Ob0ltcGxpY2l0Um9sZTogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXVxuICAgICAgICB9LFxuICAgICAgICBcIm1hdGhcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJtYXRoXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJtZW51XCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wibGlzdFwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImdyb3VwXCIsIFwibGlzdGJveFwiLCBcIm1lbnVcIiwgXCJtZW51YmFyXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiLCBcInJhZGlvZ3JvdXBcIiwgXCJ0YWJsaXN0XCIsIFwidG9vbGJhclwiLCBcInRyZWVcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwibWV0YVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgXCJtZXRlclwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcIm1ldGVyXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICBvdGhlckRpc2FsbG93ZWRBcmlhQXR0cmlidXRlczogWydhcmlhLXZhbHVlbWF4JywgJ2FyaWEtdmFsdWVtaW4nXSxcbiAgICAgICAgICAgIGFsbG93QXR0cmlidXRlc0Zyb21JbXBsaWNpdFJvbGU6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwibmF2XCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wibmF2aWdhdGlvblwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImRvYy1pbmRleFwiLCBcImRvYy1wYWdlbGlzdFwiLCBcImRvYy10b2NcIiwgXCJtZW51XCIsIFwibWVudWJhclwiLCBcInRhYmxpc3RcIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcIm5vc2NyaXB0XCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcIm9iamVjdFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhcHBsaWNhdGlvblwiLCBcImRvY3VtZW50XCIsIFwiaW1nXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcIm9sXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wibGlzdFwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImdyb3VwXCIsIFwibGlzdGJveFwiLCBcIm1lbnVcIiwgXCJtZW51YmFyXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiLCBcInJhZGlvZ3JvdXBcIiwgXCJ0YWJsaXN0XCIsIFwidG9vbGJhclwiLCBcInRyZWVcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwib3B0Z3JvdXBcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJncm91cFwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwib3B0aW9uXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wib3B0aW9uXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICBvdGhlckRpc2FsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1zZWxlY3RlZFwiXVxuICAgICAgICB9LFxuICAgICAgICBcIm91dHB1dFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInN0YXR1c1wiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJwXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wicGFyYWdyYXBoXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInBhcmFtXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcInBpY3R1cmVcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlLFxuICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtaGlkZGVuXCJdIFxuICAgICAgICB9LFxuICAgICAgICBcInByZVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdlbmVyaWNcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwicHJvZ3Jlc3NcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJwcm9ncmVzc2JhclwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgb3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtdmFsdWVtYXhcIl0gXG4gICAgICAgIH0sXG4gICAgICAgIFwicVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdlbmVyaWNcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwicnBcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInJ0XCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICBwcm9oaWJpdGVkQXJpYUF0dHJpYnV0ZXNXaGVuTm9JbXBsaWNpdFJvbGU6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJydWJ5XCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJzXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZGVsZXRpb25cIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgb3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJzYW1wXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ2VuZXJpY1wiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJzY3JpcHRcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwic2VhcmNoXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogWydzZWFyY2gnXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFsnc2VhcmNoJywgJ2Zvcm0nLCAnZ3JvdXAnLCAnbm9uZScsICdwcmVzZW50YXRpb24nLCAncmVnaW9uJ10sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwic2xvdFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgXCJzbWFsbFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdlbmVyaWNcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwic291cmNlXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcInNwYW5cIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInN0cm9uZ1wiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInN0cm9uZ1wiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJzdHlsZVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgXCJzdWJcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJzdWJzY3JpcHRcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwic3VwXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wic3VwZXJzY3JpcHRcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwic3ZnXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ3JhcGhpY3MtZG9jdW1lbnRcIl0sIC8vIGFzIGRlZmluZWQgYnkgU1ZHIEFBTVxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInRhYmxlXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1widGFibGVcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwidGVtcGxhdGVcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwidGV4dGFyZWFcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJ0ZXh0Ym94XCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJ0Zm9vdFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInJvd2dyb3VwXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInRoZWFkXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wicm93Z3JvdXBcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwidGltZVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInRpbWVcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwidGl0bGVcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwidHJhY2tcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwidVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdlbmVyaWNcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwidWxcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJsaXN0XCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiZ3JvdXBcIiwgXCJsaXN0Ym94XCIsIFwibWVudVwiLCBcIm1lbnViYXJcIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCIsIFwicmFkaW9ncm91cFwiLCBcInRhYmxpc3RcIiwgXCJ0b29sYmFyXCIsIFwidHJlZVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJ2YXJcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRBcmlhQXR0cmlidXRlc1doZW5Ob0ltcGxpY2l0Um9sZTogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXVxuICAgICAgICB9LFxuICAgICAgICBcInZpZGVvXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFwcGxpY2F0aW9uXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcIndiclwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2UsXG4gICAgICAgICAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1oaWRkZW5cIl1cbiAgICAgICAgfVxuICAgIH0gLy8gZW5kIGRvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudFxuXG4gICAgc3RhdGljIGRvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudFNwZWNpYWxUYWdzOiB7XG4gICAgICAgIFtyb2xlOiBzdHJpbmddOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddIDogSURvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudFxuICAgICAgICB9IHwgSURvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudFxuICAgIH0gPSB7XG4gICAgICAgIFwiYVwiOiB7XG4gICAgICAgICAgICBcIndpdGgtaHJlZlwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJsaW5rXCJdLFxuICAgICAgICAgICAgICAgIC8vcm9sZUNvbmRpdGlvbjogXCIgd2hlbiBub24tZW1wdHkgaHJlZiBhdHRyaWJ1dGUgaXMgcHJlc2VudFwiLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImJ1dHRvblwiLCBcImNoZWNrYm94XCIsIFwiZG9jLWJhY2tsaW5rXCIsIFwiZG9jLWJpYmxpb3JlZlwiLCBcImRvYy1nbG9zc3JlZlwiLCBcImRvYy1ub3RlcmVmXCIsIFwibWVudWl0ZW1cIiwgXCJtZW51aXRlbWNoZWNrYm94XCIsIFwibWVudWl0ZW1yYWRpb1wiLCBcIm9wdGlvblwiLCBcInJhZGlvXCIsIFwic3dpdGNoXCIsIFwidGFiXCIsIFwidHJlZWl0ZW1cIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvdGhlckRpc2FsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1kaXNhYmxlZD10cnVlXCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJ3aXRob3V0LWhyZWZcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ2VuZXJpY1wiXSxcbiAgICAgICAgICAgICAgICAvL3JvbGVDb25kaXRpb246IFwiIHdoZW4gaHJlZiBhdHRyaWJ1dGUgaXMgbm90IHByZXNlbnRcIixcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcImFyZWFcIjoge1xuICAgICAgICAgICAgXCJ3aXRoLWhyZWZcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wibGlua1wiXSxcbiAgICAgICAgICAgICAgICAvL3JvbGVDb25kaXRpb246IFwiIHdoZW4gbm9uLWVtcHR5IGhyZWYgYXR0cmlidXRlIGlzIHByZXNlbnRcIixcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIndpdGhvdXQtaHJlZlwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgICAgIC8vcm9sZUNvbmRpdGlvbjogXCIgd2hlbiBocmVmIGF0dHJpYnV0ZSBpcyBub3QgcHJlc2VudFwiLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImJ1dHRvblwiLCBcImxpbmtcIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuLy8gVE9ET1xuLy8gICAgICAgIFwiYXV0b25vbW91cyBjdXN0b20gZWxlbWVudFwiOiB7XG4vLyAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiUm9sZSBleHBvc2VkIGZyb20gYXV0aG9yIGRlZmluZWQgRWxlbWVudEludGVybmFscy4gT3RoZXJ3aXNlIG5vIGNvcnJlc3BvbmRpbmcgcm9sZS5cIl0sXG4vLyAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcIklmIHJvbGUgZGVmaW5lZCBieSBFbGVtZW50SW50ZXJuYWxzXCIsIFwiYW55IHJvbGVcIiwgXCJubyByb2xlIE90aGVyd2lzZVwiXSxcbi8vICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuLy8gICAgICAgIH0sXG4gICAgICAgIFwiZGl2XCI6IHtcbiAgICAgICAgICAgIFwiY2hpbGQtZGxcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ2VuZXJpY1wiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJwcmVzZW50YXRpb25cIiwgXCJub25lXCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm5vLWNoaWxkLWRsXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdlbmVyaWNcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJmaWd1cmVcIjoge1xuICAgICAgICAgICAgXCJjaGlsZC1maWdjYXB0aW9uXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImZpZ3VyZVwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbJ2RvYy1leGFtcGxlJ10sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwibm8tY2hpbGQtZmlnY2FwdGlvblwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJmaWd1cmVcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJmb290ZXJcIjoge1xuICAgICAgICAgICAgXCJkZXMtc2VjdGlvbi1hcnRpY2xlLWFzaWRlLW1haW4tbmF2XCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdlbmVyaWNcIl0sXG4gICAgICAgICAgICAgICAgLy9yb2xlQ29uZGl0aW9uOiBcIiB3aGVuIGRlc2NlbmRhbnQgb2YgYW4gYXJ0aWNsZSwgYXNpZGUsIG1haW4sIG5hdiBvciBzZWN0aW9uIGVsZW1lbnRcIixcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJkb2MtZm9vdG5vdGVcIiwgXCJncm91cFwiLCBcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwib3RoZXJcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiY29udGVudGluZm9cIl0sXG4gICAgICAgICAgICAgICAgLy9yb2xlQ29uZGl0aW9uOiBcIiB3aGVuIG5vdCBhIGRlc2NlbmRhbnQgb2YgYW4gYXJ0aWNsZSwgYXNpZGUsIG1haW4sIG5hdiBvciBzZWN0aW9uIGVsZW1lbnRcIixcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJkb2MtZm9vdG5vdGVcIiwgXCJncm91cFwiLCBcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuLy8gVE9ET1xuLy8gICAgICAgIFwiZm9ybS1hc3NvY2lhdGVkIGN1c3RvbSBlbGVtZW50XCI6IHtcbi8vICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJSb2xlIGV4cG9zZWQgZnJvbSBhdXRob3IgZGVmaW5lZCBFbGVtZW50SW50ZXJuYWxzLiBPdGhlcndpc2UgJ2dlbmVyaWMnLlwiXSxcbi8vICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiSWYgcm9sZSBkZWZpbmVkIGJ5IEVsZW1lbnRJbnRlcm5hbHNcIiwgXCJmb3JtLXJlbGF0ZWQgcm9sZXM6IGJ1dHRvblwiLCBcImNoZWNrYm94XCIsIFwiY29tYm9ib3hcIiwgXCJncm91cFwiLCBcImxpc3Rib3hcIiwgXCJwcm9ncmVzc2JhclwiLCBcInJhZGlvXCIsIFwicmFkaW9ncm91cFwiLCBcInNlYXJjaGJveFwiLCBcInNsaWRlclwiLCBcInNwaW5idXR0b25cIiwgXCJzd2l0Y2hcIiwgXCJ0ZXh0Ym94XCIsIFwibm8gcm9sZSBPdGhlcndpc2VcIl0sXG4vLyAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbi8vICAgICAgICB9LFxuXG4gICAgICAgIFwiaGVhZGVyXCI6IHtcbiAgICAgICAgICAgIFwiZGVzLXNlY3Rpb24tYXJ0aWNsZS1hc2lkZS1tYWluLW5hdlwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgICAgIC8vcm9sZUNvbmRpdGlvbjogXCIgd2hlbiBkZXNjZW5kYW50IG9mIGFuIGFydGljbGUsIGFzaWRlLCBtYWluLCBuYXYgb3Igc2VjdGlvbiBlbGVtZW50XCIsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiZ3JvdXBcIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm90aGVyXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImJhbm5lclwiXSxcbiAgICAgICAgICAgICAgICAvL3JvbGVDb25kaXRpb246IFwiIHdoZW4gbm90IGEgZGVzY2VuZGFudCBvZiBhbiBhcnRpY2xlLCBhc2lkZSwgbWFpbiwgbmF2IG9yIHNlY3Rpb24gZWxlbWVudFwiLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImdyb3VwXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSxcbiAgICAgICAgXCJpbWdcIjoge1xuICAgICAgICAgICAgXCJpbWctd2l0aC1hY2NuYW1lXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImltZ1wiXSxcbiAgICAgICAgICAgICAgICAvL3JvbGVDb25kaXRpb246IFwid2hlbiBhY2Nlc3NpYmxlIG5hbWUgcHJlc2VudHNcIixcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJidXR0b25cIiwgXCJjaGVja2JveFwiLCBcImRvYy1jb3ZlclwiLCBcImxpbmtcIiwgXCJtZW51aXRlbVwiLCBcIm1lbnVpdGVtY2hlY2tib3hcIiwgXCJtZW51aXRlbXJhZGlvXCIsIFwibWV0ZXJcIiwgXCJvcHRpb25cIiwgXCJwcm9ncmVzc2JhclwiLCBcInJhZGlvXCIsIFwic2Nyb2xsYmFyXCIsIFwic2VwYXJhdG9yXCIsIFwic2xpZGVyXCIsIFwic3dpdGNoXCIsIFwidGFiXCIsIFwidHJlZWl0ZW1cIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiaW1nLXdpdGhvdXQtYWNjbmFtZS1lbXB0eS1hbHRcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wicHJlc2VudGF0aW9uXCIsIFwibm9uZVwiXSxcbiAgICAgICAgICAgICAgICAvL3JvbGVDb25kaXRpb246IFwid2hlbiBubyBhY2Nlc3NpYmxlIG5hbWUgcHJlc2VudHMgYW5kIGFsdD0nJ1wiLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2UsIFxuICAgICAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLWhpZGRlbj10cnVlXCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJpbWctd2l0aG91dC1hY2NuYW1lLW5vLWFsdFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJpbWdcIl0sXG4gICAgICAgICAgICAgICAgLy9yb2xlQ29uZGl0aW9uOiBcIndoZW4gbmVpdGhlciBhY2Nlc3NpYmxlIG5hbWUgbm8gYWx0IHByZXNlbnRzXCIsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wicHJlc2VudGF0aW9uXCIsIFwibm9uZVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZSwgXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtaGlkZGVuPXRydWVcIl1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJpbnB1dFwiOiB7XG4gICAgICAgICAgICBcImJ1dHRvblwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJidXR0b25cIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiY2hlY2tib3hcIiwgXCJjb21ib2JveFwiLCBcImdyaWRjZWxsXCIsIFwibGlua1wiLCBcIm1lbnVpdGVtXCIsIFwibWVudWl0ZW1jaGVja2JveFwiLCBcIm1lbnVpdGVtcmFkaW9cIiwgXCJvcHRpb25cIiwgXCJyYWRpb1wiLCBcInNsaWRlclwiLCBcInN3aXRjaFwiLCBcInRhYlwiLCBcInRyZWVpdGVtXCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImNoZWNrYm94LXdpdGgtYXJpYS1wcmVzc2VkXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImNoZWNrYm94XCJdLFxuICAgICAgICAgICAgICAgIC8vcm9sZUNvbmRpdGlvbjogXCIgd2l0aCB0eXBlPWNoZWNrYm94IGFuZCBhcmlhLXByZXNzZWQgYXR0cmlidXRlIGlzIHByZXNlbnRcIixcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJtZW51aXRlbWNoZWNrYm94XCIsIFwib3B0aW9uXCIsIFwic3dpdGNoXCIsIFwiYnV0dG9uXCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtcmVxdWlyZWRcIl0sXG4gICAgICAgICAgICAgICAgb3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtY2hlY2tlZFwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiY2hlY2tib3gtd2l0aG91dC1hcmlhLXByZXNzZWRcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiY2hlY2tib3hcIl0sXG4gICAgICAgICAgICAgICAgLy9yb2xlQ29uZGl0aW9uOiBcIiB3aXRoIHR5cGU9Y2hlY2tib3ggYW5kIGFyaWEtcHJlc3NlZCBhdHRyaWJ1dGUgaXMgbm90IHByZXNlbnRcIixcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJtZW51aXRlbWNoZWNrYm94XCIsIFwib3B0aW9uXCIsIFwic3dpdGNoXCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtcmVxdWlyZWRcIl0sXG4gICAgICAgICAgICAgICAgb3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtY2hlY2tlZFwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiY29sb3JcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImRhdGVcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtcmVxdWlyZWRcIiwgXCJhcmlhLXJlYWRvbmx5XCJdLFxuICAgICAgICAgICAgICAgIG90aGVyUm9sZXNGb3JBdHRyaWJ1dGVzOiBbXCJ0ZXh0Ym94XCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJkYXRldGltZS1sb2NhbFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1yZXF1aXJlZFwiLCBcImFyaWEtcmVhZG9ubHlcIl0sXG4gICAgICAgICAgICAgICAgb3RoZXJSb2xlc0ZvckF0dHJpYnV0ZXM6IFtcInRleHRib3hcIl1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImVtYWlsLW5vLWxpc3RcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1widGV4dGJveFwiXSxcbiAgICAgICAgICAgICAgICAvL3JvbGVDb25kaXRpb246IFwiIHdpdGggdHlwZT1lbWFpbCBhbmQgbm8gbGlzdCBhdHRyaWJ1dGUgaXMgcHJlc2VudFwiLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1wbGFjZWhvbGRlclwiLCBcImFyaWEtcmVxdWlyZWRcIiwgXCJhcmlhLXJlYWRvbmx5XCJdLFxuICAgICAgICAgICAgICAgIG90aGVyUm9sZXNGb3JBdHRyaWJ1dGVzOiBbXCJ0ZXh0Ym94XCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJlbWFpbC13aXRoLWxpc3RcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiY29tYm9ib3hcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJmaWxlXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLXJlcXVpcmVkXCJdLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiaGlkZGVuXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiaW1hZ2VcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiYnV0dG9uXCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImNoZWNrYm94XCIsIFwiZ3JpZGNlbGxcIiwgXCJsaW5rXCIsIFwibWVudWl0ZW1cIiwgXCJtZW51aXRlbWNoZWNrYm94XCIsIFwibWVudWl0ZW1yYWRpb1wiLCBcIm9wdGlvblwiLCBcInJhZGlvXCIsIFwic2xpZGVyXCIsIFwic3dpdGNoXCIsIFwidGFiXCIsIFwidHJlZWl0ZW1cIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwibW9udGhcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtcmVhZG9ubHlcIl0sXG4gICAgICAgICAgICAgICAgb3RoZXJSb2xlc0ZvckF0dHJpYnV0ZXM6IFtcInRleHRib3hcIl1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm51bWJlclwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJzcGluYnV0dG9uXCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1wbGFjZWhvbGRlclwiLCBcImFyaWEtcmVxdWlyZWRcIiwgXCJhcmlhLXJlYWRvbmx5XCJdLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwicGFzc3dvcmRcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtcGxhY2Vob2xkZXJcIiwgXCJhcmlhLXJlcXVpcmVkXCIsIFwiYXJpYS1yZWFkb25seVwiXSxcbiAgICAgICAgICAgICAgICBvdGhlclJvbGVzRm9yQXR0cmlidXRlczogW1widGV4dGJveFwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwicmFkaW9cIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wicmFkaW9cIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wibWVudWl0ZW1yYWRpb1wiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLXJlcXVpcmVkXCJdLFxuICAgICAgICAgICAgICAgIG90aGVyRGlzYWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLWNoZWNrZWRcIl1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInJhbmdlXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInNsaWRlclwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtdmFsdWVtYXhcIiwgXCJhcmlhLXZhbHVlbWluXCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJyZXNldFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJidXR0b25cIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiY2hlY2tib3hcIiwgXCJjb21ib2JveFwiLCBcImdyaWRjZWxsXCIsIFwibGlua1wiLCBcIm1lbnVpdGVtXCIsIFwibWVudWl0ZW1jaGVja2JveFwiLCBcIm1lbnVpdGVtcmFkaW9cIiwgXCJvcHRpb25cIiwgXCJyYWRpb1wiLCBcInNsaWRlclwiLCBcInN3aXRjaFwiLCBcInRhYlwiLCBcInRyZWVpdGVtXCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInNlYXJjaC1uby1saXN0XCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInNlYXJjaGJveFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtcGxhY2Vob2xkZXJcIiwgXCJhcmlhLXJlcXVpcmVkXCIsIFwiYXJpYS1yZWFkb25seVwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwic2VhcmNoLXdpdGgtbGlzdFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJjb21ib2JveFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInN1Ym1pdFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJidXR0b25cIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiY2hlY2tib3hcIiwgXCJjb21ib2JveFwiLCBcImdyaWRjZWxsXCIsIFwibGlua1wiLCBcIm1lbnVpdGVtXCIsIFwibWVudWl0ZW1jaGVja2JveFwiLCBcIm1lbnVpdGVtcmFkaW9cIiwgXCJvcHRpb25cIiwgXCJyYWRpb1wiLCBcInNsaWRlclwiLCBcInN3aXRjaFwiLCBcInRhYlwiLCBcInRyZWVpdGVtXCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInRlbC1uby1saXN0XCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInRleHRib3hcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLXBsYWNlaG9sZGVyXCIsIFwiYXJpYS1yZXF1aXJlZFwiLCBcImFyaWEtcmVhZG9ubHlcIl1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInRlbC13aXRoLWxpc3RcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiY29tYm9ib3hcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJ0ZXh0LW5vLWxpc3RcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1widGV4dGJveFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJjb21ib2JveFwiLCBcInNlYXJjaGJveFwiLCBcInNwaW5idXR0b25cIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1wbGFjZWhvbGRlclwiLCBcImFyaWEtcmVxdWlyZWRcIiwgXCJhcmlhLXJlYWRvbmx5XCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJ0ZXh0LXdpdGgtbGlzdFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJjb21ib2JveFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgICAgICAvLyBvdGhlckRpc2FsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1oYXNwb3B1cFwiXSAgLy8gY292ZXJlZCBpbiBhIGRpZmZlcmVudCBydWxlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJ0aW1lXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLXJlYWRvbmx5XCJdLFxuICAgICAgICAgICAgICAgIG90aGVyUm9sZXNGb3JBdHRyaWJ1dGVzOiBbXCJ0ZXh0Ym94XCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJ1cmwtbm8tbGlzdFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJ0ZXh0Ym94XCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1wbGFjZWhvbGRlclwiLCBcImFyaWEtcmVxdWlyZWRcIiwgXCJhcmlhLXJlYWRvbmx5XCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJ1cmwtd2l0aC1saXN0XCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImNvbWJvYm94XCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwid2Vla1wiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1yZWFkb25seVwiXSxcbiAgICAgICAgICAgICAgICBvdGhlclJvbGVzRm9yQXR0cmlidXRlczogW1widGV4dGJveFwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZGVmYXVsdC13aXRoLWxpc3RcIjoge1xuICAgICAgICAgICAgICAgIC8vIGlucHV0IHdpdGggYSBtaXNzaW5nIG9yIGludmFsaWQgdHlwZSwgd2l0aCBhIGxpc3QgYXR0cmlidXRlXG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJjb21ib2JveFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImRlZmF1bHQtbm8tbGlzdFwiOiB7XG4gICAgICAgICAgICAgICAgLy8gaW5wdXQgd2l0aCBhIG1pc3Npbmcgb3IgaW52YWxpZCB0eXBlLCB3aXRoIGEgbGlzdCBhdHRyaWJ1dGVcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInRleHRib3hcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwibGlcIjoge1xuICAgICAgICAgICAgXCJjaGlsZC1vZi1saXN0LXJvbGVcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogWydsaXN0aXRlbSddLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwibm8tY2hpbGQtb2YtbGlzdC1yb2xlXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFsnZ2VuZXJpYyddLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwic2VjdGlvblwiOiB7XG4gICAgICAgICAgICBcIndpdGgtbmFtZVwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJyZWdpb25cIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYWxlcnRcIiwgXCJhbGVydGRpYWxvZ1wiLCBcImFwcGxpY2F0aW9uXCIsIFwiYmFubmVyXCIsIFwiY29tcGxlbWVudGFyeVwiLCBcImNvbnRlbnRpbmZvXCIsIFwiZGlhbG9nXCIsIFwiZG9jLWFic3RyYWN0XCIsIFwiZG9jLWFja25vd2xlZGdtZW50c1wiLCBcImRvYy1hZnRlcndvcmRcIiwgXCJkb2MtYXBwZW5kaXhcIiwgXCJkb2MtYmlibGlvZ3JhcGh5XCIsIFwiZG9jLWNoYXB0ZXJcIiwgXCJkb2MtY29sb3Bob25cIiwgXCJkb2MtY29uY2x1c2lvblwiLCBcImRvYy1jcmVkaXRcIiwgXCJkb2MtY3JlZGl0c1wiLCBcImRvYy1kZWRpY2F0aW9uXCIsIFwiZG9jLWVuZG5vdGVzXCIsIFwiZG9jLWVwaWdyYXBoXCIsIFwiZG9jLWVwaWxvZ3VlXCIsIFwiZG9jLWVycmF0YVwiLCBcImRvYy1leGFtcGxlXCIsIFwiZG9jLWZvcmV3b3JkXCIsIFwiZG9jLWdsb3NzYXJ5XCIsIFwiZG9jLWluZGV4XCIsIFwiZG9jLWludHJvZHVjdGlvblwiLCBcImRvYy1ub3RpY2VcIiwgXCJkb2MtcGFnZWxpc3RcIiwgXCJkb2MtcGFydFwiLCBcImRvYy1wcmVmYWNlXCIsIFwiZG9jLXByb2xvZ3VlXCIsIFwiZG9jLXB1bGxxdW90ZVwiLCBcImRvYy1xbmFcIiwgXCJkb2MtdG9jXCIsIFwiZG9jdW1lbnRcIiwgXCJmZWVkXCIsIFwiZ3JvdXBcIiwgXCJsb2dcIiwgXCJtYWluXCIsIFwibWFycXVlZVwiLCBcIm5hdmlnYXRpb25cIiwgXCJub25lXCIsIFwibm90ZVwiLCBcInByZXNlbnRhdGlvblwiLCBcInNlYXJjaFwiLCBcInN0YXR1c1wiLCBcInRhYnBhbmVsXCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIndpdGhvdXQtbmFtZVwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFsZXJ0XCIsIFwiYWxlcnRkaWFsb2dcIiwgXCJhcHBsaWNhdGlvblwiLCBcImJhbm5lclwiLCBcImNvbXBsZW1lbnRhcnlcIiwgXCJjb250ZW50aW5mb1wiLCBcImRpYWxvZ1wiLCBcImRvYy1hYnN0cmFjdFwiLCBcImRvYy1hY2tub3dsZWRnbWVudHNcIiwgXCJkb2MtYWZ0ZXJ3b3JkXCIsIFwiZG9jLWFwcGVuZGl4XCIsIFwiZG9jLWJpYmxpb2dyYXBoeVwiLCBcImRvYy1jaGFwdGVyXCIsIFwiZG9jLWNvbG9waG9uXCIsIFwiZG9jLWNvbmNsdXNpb25cIiwgXCJkb2MtY3JlZGl0XCIsIFwiZG9jLWNyZWRpdHNcIiwgXCJkb2MtZGVkaWNhdGlvblwiLCBcImRvYy1lbmRub3Rlc1wiLCBcImRvYy1lcGlncmFwaFwiLCBcImRvYy1lcGlsb2d1ZVwiLCBcImRvYy1lcnJhdGFcIiwgXCJkb2MtZXhhbXBsZVwiLCBcImRvYy1mb3Jld29yZFwiLCBcImRvYy1nbG9zc2FyeVwiLCBcImRvYy1pbmRleFwiLCBcImRvYy1pbnRyb2R1Y3Rpb25cIiwgXCJkb2Mtbm90aWNlXCIsIFwiZG9jLXBhZ2VsaXN0XCIsIFwiZG9jLXBhcnRcIiwgXCJkb2MtcHJlZmFjZVwiLCBcImRvYy1wcm9sb2d1ZVwiLCBcImRvYy1wdWxscXVvdGVcIiwgXCJkb2MtcW5hXCIsIFwiZG9jLXRvY1wiLCBcImRvY3VtZW50XCIsIFwiZmVlZFwiLCBcImdyb3VwXCIsIFwibG9nXCIsIFwibWFpblwiLCBcIm1hcnF1ZWVcIiwgXCJuYXZpZ2F0aW9uXCIsIFwibm9uZVwiLCBcIm5vdGVcIiwgXCJwcmVzZW50YXRpb25cIiwgXCJzZWFyY2hcIiwgXCJzdGF0dXNcIiwgXCJ0YWJwYW5lbFwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwic2VsZWN0XCI6IHtcbiAgICAgICAgICAgIFwibm8tbXVsdGlwbGUtYXR0ci1zaXplLWd0MVwiOiB7XG4gICAgICAgICAgICAgICAgLy9yb2xlQ29uZGl0aW9uOiBcIiB3aXRoIGEgbXVsdGlwbGUgYXR0cmlidXRlIG9yIGEgc2l6ZSBhdHRyaWJ1dGUgaGF2aW5nIHZhbHVlIGdyZWF0ZXIgdGhhbiAxXCJcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImNvbWJvYm94XCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcIm1lbnVcIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvdGhlckRpc2FsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1tdWx0aXNlbGVjdGFibGVcIl1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm11bHRpcGxlLWF0dHItc2l6ZS1ndDFcIjoge1xuICAgICAgICAgICAgICAgIC8vcm9sZUNvbmRpdGlvbjogXCIgd2l0aCBubyBtdWx0aXBsZSBhdHRyaWJ1dGUgYW5kIG5vIHNpemUgYXR0cmlidXRlIGhhdmluZyB2YWx1ZSBncmVhdGVyIHRoYW4gMVwiXG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJsaXN0Ym94XCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvdGhlckRpc2FsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1tdWx0aXNlbGVjdGFibGVcIl1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJzdW1tYXJ5XCI6IHtcbiAgICAgICAgICAgIFwiZmlyc3Qtc3VtbWFyeS1vZi1kZXRhaWxcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtZGlzYWJsZWRcIiwgXCJhcmlhLWhhc3BvcHVwXCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJuby1maXJzdC1zdW1tYXJ5LW9mLWRldGFpbFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwidGJvZHlcIjoge1xuICAgICAgICAgICAgXCJkZXMtdGFibGVcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wicm93Z3JvdXBcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImRlcy1ncmlkXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInJvd2dyb3VwXCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJkZXMtdHJlZWdyaWRcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wicm93Z3JvdXBcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImRlcy1vdGhlclwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwidGRcIjoge1xuICAgICAgICAgICAgXCJkZXMtdGFibGVcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiY2VsbFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImRlcy1ncmlkXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdyaWRjZWxsXCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZGVzLXRyZWVncmlkXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdyaWRjZWxsXCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZGVzLW90aGVyXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJ0aFwiOiB7XG4gICAgICAgICAgICBcImRlcy10YWJsZS1yb3ctc2NvcGVcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wicm93aGVhZGVyXCIsIFwiY2VsbFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImRlcy10YWJsZS1jb2x1bW4tc2NvcGVcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiY29sdW1uaGVhZGVyXCIsIFwiY2VsbFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImRlcy1ncmlkLXRyZWVncmlkLXJvdy1zY29wZVwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJyb3doZWFkZXJcIiwgXCJncmlkY2VsbFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImRlcy1ncmlkLXRyZWVncmlkLWNvbHVtbi1zY29wZVwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJjb2x1bW5oZWFkZXJcIiwgXCJncmlkY2VsbFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImRlcy1vdGhlclwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwidHJcIjoge1xuICAgICAgICAgICAgXCJkZXMtdGFibGVcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wicm93XCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZGVzLWdyaWRcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wicm93XCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZGVzLXRyZWVncmlkXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInJvd1wiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImRlcy1vdGhlclwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICBcImRlZmF1bHRcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgLy9yb2xlQ29uZGl0aW9uOiBcIlwiLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9XG4gICAgfSAvLyBlbmQgb2YgZG9jdW1lbnRDb25mb3JtYW5jZVJlcXVpcmVtZW50U3BlY2lhbFRhZ3NcblxuICAgIC8vIG1hcCBhcmlhIGF0dHJpYnV0ZSB0byB0aGUgY29ycmVzcG9uZGluZyBuYXRpdmUgYXR0cmlidXRlLCBhcHBseSB0byBhbnkgZWxlbWVudCBhcHBsaWNhYmxlXG4gICAgLy8gbm90ZSB0aGlzIG1hcHBpbmcgaXMgZm9yIHRoZSByZWxhdGVkIGF0dHJpYnV0ZXMgaW4gdGhlIHNhbWUgZWxlbWVudCB3aXRob3V0IGNoZWNraW5nIHRoZSBwYXJlbnQgdHJlZS5cbiAgICAvLyByZWZlciB0byBodHRwczovL3czYy5naXRodWIuaW8vaHRtbC1hcmlhL1xuICAgIHN0YXRpYyByZWxhdGVkQXJpYUh0bWxBdHRyaWJ1dGVzOiB7XG4gICAgICAgIFthcmlhQXR0cjogc3RyaW5nXSA6IHtcbiAgICAgICAgICAgIGNvbmZsaWN0OiB7XG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBzdHJpbmcgfCBudWxsLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogc3RyaW5nW10sXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZVZhbHVlczogc3RyaW5nW10gfCBudWxsXG4gICAgICAgICAgICB9W10sXG4gICAgICAgICAgICBvdmVybGFwcGluZz86IHsgICAgXG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBzdHJpbmcgfCBudWxsLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogc3RyaW5nW10sXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZVZhbHVlczogc3RyaW5nW10gfCBudWxsXG4gICAgICAgICAgICB9W11cbiAgICAgICAgfSBcbiAgICB9ID0gIHtcbiAgICAgICAgXCJhcmlhLWNoZWNrZWRcIjoge1xuICAgICAgICAgICAgY29uZmxpY3Q6IFt7XG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBcImZhbHNlXCIsXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZU5hbWVzOiBbXCJjaGVja2VkXCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IG51bGxcbiAgICAgICAgICAgIH1dLFxuICAgICAgICAgICAgb3ZlcmxhcHBpbmc6IFt7ICAgIFxuICAgICAgICAgICAgICAgIGFyaWFBdHRyaWJ1dGVWYWx1ZTogXCJ0cnVlXCIsXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZU5hbWVzOiBbXCJjaGVja2VkXCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IG51bGxcbiAgICAgICAgICAgIH1dXG4gICAgICAgIH0sICAgIFxuICAgICAgICBcImFyaWEtZGlzYWJsZWRcIjoge1xuICAgICAgICAgICAgY29uZmxpY3Q6IFt7XG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBcImZhbHNlXCIsXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZU5hbWVzOiBbXCJkaXNhYmxlZFwiXSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlVmFsdWVzOiBudWxsXG4gICAgICAgICAgICB9XSxcbiAgICAgICAgICAgIG92ZXJsYXBwaW5nOiBbeyAgICBcbiAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlVmFsdWU6IFwidHJ1ZVwiLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wiZGlzYWJsZWRcIl0sXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZVZhbHVlczogbnVsbFxuICAgICAgICAgICAgfV1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWhpZGRlblwiOiB7XG4gICAgICAgICAgICBjb25mbGljdDogW3tcbiAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlVmFsdWU6IFwiZmFsc2VcIixcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IFtcImhpZGRlblwiXSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlVmFsdWVzOiBbXCJoaWRkZW4sbnVsbFwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlVmFsdWU6IFwidHJ1ZVwiLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wiaGlkZGVuXCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IFtcInVudGlsLWZvdW5kXCJdXG4gICAgICAgICAgICB9XSxcbiAgICAgICAgICAgIG92ZXJsYXBwaW5nOiBbeyAgICBcbiAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlVmFsdWU6IFwidHJ1ZVwiLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wiaGlkZGVuXCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IFtcImhpZGRlbixudWxsXCJdXG4gICAgICAgICAgICB9XVxuICAgICAgICB9LCAgICBcbiAgICAgICAgXCJhcmlhLXBsYWNlaG9sZGVyXCI6IHtcbiAgICAgICAgICAgIGNvbmZsaWN0OiBbe1xuICAgICAgICAgICAgICAgIGFyaWFBdHRyaWJ1dGVWYWx1ZTogbnVsbCxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IFtcInBsYWNlaG9sZGVyXCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IG51bGxcbiAgICAgICAgICAgIH1dXG4gICAgICAgIH0sICAgIFxuICAgICAgICBcImFyaWEtdmFsdWVtYXhcIjoge1xuICAgICAgICAgICAgY29uZmxpY3Q6IFt7XG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBudWxsLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wibWF4XCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IG51bGxcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgICAvL292ZXJsYXAgY2FzZSBjb3ZlcmVkIGluIHRoZSByb2xlIGRlZmluaXRpb246IEF1dGhvcnMgU0hPVUxEIE5PVCB1c2UgYXJpYS12YWx1ZW1heCBvbiBhbnkgZWxlbWVudCB3aGljaCBhbGxvd3MgdGhlIG1heCBhdHRyaWJ1dGUuIFVzZSB0aGUgbWF4IGF0dHJpYnV0ZSBpbnN0ZWFkLiBcbiAgICAgICAgfSwgICAgXG4gICAgICAgIFwiYXJpYS12YWx1ZW1pblwiOiB7XG4gICAgICAgICAgICBjb25mbGljdDogW3tcbiAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlVmFsdWU6IG51bGwsXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZU5hbWVzOiBbXCJtaW5cIl0sXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZVZhbHVlczogbnVsbFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICAgIC8vLy9vdmVybGFwIGNhc2UgY292ZXJlZCBpbiB0aGUgcm9sZSBkZWZpbml0aW9uOkF1dGhvcnMgU0hPVUxEIE5PVCB1c2UgYXJpYS12YWx1ZW1pbiBvbiBhbnkgZWxlbWVudCB3aGljaCBhbGxvd3MgdGhlIG1pbiBhdHRyaWJ1dGUuIFVzZSB0aGUgbWluIGF0dHJpYnV0ZSBpbnN0ZWFkLlxuICAgICAgICB9LCAgICBcbiAgICAgICAgXCJhcmlhLXJlYWRvbmx5XCI6IHtcbiAgICAgICAgICAgIGNvbmZsaWN0OiBbe1xuICAgICAgICAgICAgICAgIGFyaWFBdHRyaWJ1dGVWYWx1ZTogXCJmYWxzZVwiLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wicmVhZG9ubHlcIiwgXCJjb250ZW50ZWRpdGFibGVcIiwgXCJpc2NvbnRlbnRlZGl0YWJsZVwiXSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlVmFsdWVzOiBbbnVsbCwgXCJmYWxzZVwiLCBcImZhbHNlXCJdXG4gICAgICAgICAgICB9XSxcbiAgICAgICAgICAgIG92ZXJsYXBwaW5nOiBbeyAgICBcbiAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlVmFsdWU6IFwidHJ1ZVwiLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wicmVhZG9ubHlcIiwgXCJjb250ZW50ZWRpdGFibGVcIiwgXCJpc2NvbnRlbnRlZGl0YWJsZVwiXSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlVmFsdWVzOiBbbnVsbCwgXCJ0cnVlXCIsIFwidHJ1ZVwiXVxuICAgICAgICAgICAgfV1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXJlcXVpcmVkXCI6IHtcbiAgICAgICAgICAgIGNvbmZsaWN0OiBbe1xuICAgICAgICAgICAgICAgIGFyaWFBdHRyaWJ1dGVWYWx1ZTogXCJmYWxzZVwiLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wicmVxdWlyZWRcIl0sXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZVZhbHVlczogbnVsbFxuICAgICAgICAgICAgfV0sXG4gICAgICAgICAgICBvdmVybGFwcGluZzogW3sgICAgXG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBcInRydWVcIixcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IFtcInJlcXVpcmVkXCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IG51bGxcbiAgICAgICAgICAgIH1dXG4gICAgICAgIH0sICAgICAgICBcbiAgICAgICAgXCJhcmlhLWNvbHNwYW5cIjoge1xuICAgICAgICAgICAgY29uZmxpY3Q6IFt7XG4gICAgICAgICAgICAgICAgLy8gY29uZmxpY3Qgb2NjdXJzIGlmIGJvdGggdmFsdWVzIGFyZSBkaWZmZXJlbnRcbiAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlVmFsdWU6IFwiVkFMVUVcIixcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IFtcImNvbHNwYW5cIl0sXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZVZhbHVlczogW1wiVkFMVUVcIl1cbiAgICAgICAgICAgIH1dLFxuICAgICAgICAgICAgb3ZlcmxhcHBpbmc6IFt7ICAgIFxuICAgICAgICAgICAgICAgIC8vIG92ZXJsYXAgb2NjdXJzIGlmIGJvdGggZXhpc3RzXG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBudWxsLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wiY29sc3BhblwiXSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlVmFsdWVzOiBudWxsXG4gICAgICAgICAgICB9XVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtcm93c3BhblwiOiB7XG4gICAgICAgICAgICBjb25mbGljdDogW3tcbiAgICAgICAgICAgICAgICAvLyBjb25mbGljdCBvY2N1cnMgaWYgYm90aCB2YWx1ZXMgYXJlIGRpZmZlcmVudFxuICAgICAgICAgICAgICAgIGFyaWFBdHRyaWJ1dGVWYWx1ZTogXCJWQUxVRVwiLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wicm93c3BhblwiXSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlVmFsdWVzOiBbXCJWQUxVRVwiXVxuICAgICAgICAgICAgfV0sXG4gICAgICAgICAgICBvdmVybGFwcGluZzogW3sgICBcbiAgICAgICAgICAgICAgICAvLyBvdmVybGFwIG9jY3VycyBpZiBib3RoIGV4aXN0cyBcbiAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlVmFsdWU6IG51bGwsXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZU5hbWVzOiBbXCJyb3dzcGFuXCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IG51bGxcbiAgICAgICAgICAgIH1dXG4gICAgICAgIH0sXG4gICAgICAgIC8qKiBcImFyaWEtYXV0b2NvbXBsZXRlXCI6IHtcbiAgICAgICAgICAgIGNvbmZsaWN0OiBbe1xuICAgICAgICAgICAgICAgIC8vIGNvbmZsaWN0IG9jY3VycyBpZiBib3RoIGV4aXN0cywgYXJpYSB2YWx1ZSBpcyBvbmx5IGZvciBjdXN0b20gd2lkZ2V0LCByYXRoZXIgdGhhbiBuYXRpdmVcbiAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlVmFsdWU6IG51bGwsXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZU5hbWVzOiBbXCJhdXRvY29tcGxldGVcIl0sXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZVZhbHVlczogbnVsbFxuICAgICAgICAgICAgfV1cbiAgICAgICAgfSAqLyBcbiAgICB9XG5cbiAgICBzdGF0aWMgY29udGFpbmVycyA9IFtdXG59O1xuXG5sZXQgY29udGFpbmVyQXJyYXkgPSBbXTtcblxuZm9yIChjb25zdCByb2xlRGVzaWduIGluIEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJucykge1xuICAgIGNvbnN0IGNvbnRhaW5lcnMgPSBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNbcm9sZURlc2lnbl0uY29udGFpbmVyO1xuICAgIGlmIChjb250YWluZXJzICE9PSBudWxsKSB7XG4gICAgICAgIGZvciAoY29uc3QgY29udGFpbmVyIG9mIGNvbnRhaW5lcnMpIHtcbiAgICAgICAgICAgIGlmIChjb250YWluZXJBcnJheS5pbmRleE9mKGNvbnRhaW5lcikgPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBjb250YWluZXJBcnJheS5wdXNoKGNvbnRhaW5lcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5BUklBRGVmaW5pdGlvbnMuY29udGFpbmVycyA9IGNvbnRhaW5lckFycmF5O1xuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBBUklBRGVmaW5pdGlvbnMgfSBmcm9tIFwiLi9BUklBRGVmaW5pdGlvbnNcIjtcbmltcG9ydCB7IENvbW1vbk1hcHBlciB9IGZyb20gXCIuLi9jb21tb24vQ29tbW9uTWFwcGVyXCI7XG5pbXBvcnQgeyBET01VdGlsIH0gZnJvbSBcIi4uL2RvbS9ET01VdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uLy4uL3Y0L3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vLi4vdjQvdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG5pbXBvcnQgeyBJTWFwUmVzdWx0IH0gZnJvbSBcIi4uLy4uL3Y0L2FwaS9JTWFwcGVyXCI7XG5pbXBvcnQgeyBBUklBV2Fsa2VyIH0gZnJvbSBcIi4vQVJJQVdhbGtlclwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4uLy4uL3Y0L3V0aWwvQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vZG9tL0RPTVdhbGtlclwiO1xuaW1wb3J0IHsgQWNjTmFtZVV0aWwgfSBmcm9tIFwiLi4vLi4vdjQvdXRpbC9BY2NOYW1lVXRpbFwiO1xuXG50eXBlIEVsZW1DYWxjID0gKGVsZW06IEVsZW1lbnQpID0+IHN0cmluZztcbnR5cGUgTm9kZUNhbGMgPSAobm9kZTogTm9kZSkgPT4gc3RyaW5nO1xuXG5leHBvcnQgY2xhc3MgQVJJQU1hcHBlciBleHRlbmRzIENvbW1vbk1hcHBlciB7XG4gICAgY2hpbGRyZW5DYW5IYXZlUm9sZShub2RlOiBOb2RlLCByb2xlOiBzdHJpbmcpIDogYm9vbGVhbiB7XG4gICAgICAgIC8vIGlmIChub2RlLm5vZGVUeXBlID09PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovKSB7XG4gICAgICAgIC8vICAgICBjb25zdCBlbGVtID0gbm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyAgICAgaWYgKGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1oaWRkZW5cIikgPT09IFwidHJ1ZVwiKSB7XG4gICAgICAgIC8vICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyB9XG4gICAgICAgIHJldHVybiAhKHJvbGUgaW4gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zICYmIEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlXS5wcmVzZW50YXRpb25hbENoaWxkcmVuKTtcbiAgICB9XG4gICAgZ2V0Um9sZShub2RlOiBOb2RlKSA6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHJvbGUgPSBBUklBTWFwcGVyLm5vZGVUb1JvbGUobm9kZSk7XG4gICAgICAgIHJldHVybiByb2xlO1xuICAgIH1cbiAgICBnZXROYW1lc3BhY2UoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIFwiYXJpYVwiXG4gICAgfVxuICAgIGdldEF0dHJpYnV0ZXMobm9kZTogTm9kZSkgOiB7IFtrZXk6c3RyaW5nXTogc3RyaW5nIH0ge1xuICAgICAgICBsZXQgcmV0VmFsID0ge307XG4gICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovKSB7XG4gICAgICAgICAgICBjb25zdCBjYWNoZVZhbCA9IENhY2hlVXRpbC5nZXRDYWNoZShub2RlIGFzIEhUTUxFbGVtZW50LCBcIkFSSUFNYXBwZXI6OmdldEF0dHJpYnV0ZXNcIiwgdW5kZWZpbmVkKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY2FjaGVWYWwgIT09IFwidW5kZWZpbmVkXCIpIHJldHVybiBjYWNoZVZhbDtcbiAgICAgICAgICAgIGNvbnN0IGVsZW0gPSBub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICBmb3IgKGxldCBpZHg9MDsgaWR4PGVsZW0uYXR0cmlidXRlcy5sZW5ndGg7ICsraWR4KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYXR0ckluZm8gPSBlbGVtLmF0dHJpYnV0ZXNbaWR4XTtcbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gYXR0ckluZm8ubmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoXCJhcmlhLVwiKSkge1xuICAgICAgICAgICAgICAgICAgICByZXRWYWxbbmFtZS5zdWJzdHJpbmcoNSldID0gYXR0ckluZm8ubm9kZVZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gT3B0aW1pemU6IENhY2hlIG5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgdG8gYXZvaWQgcmVwZWF0ZWQgY2FsbHNcbiAgICAgICAgICAgIGNvbnN0IG5vZGVOYW1lID0gbm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBBcHBseSBnbG9iYWwgYXR0cmlidXRlcyBmaXJzdFxuICAgICAgICAgICAgQVJJQU1hcHBlci5hcHBseUF0dHJSb2xlKGVsZW0sIFwiZ2xvYmFsXCIsIHJldFZhbCk7XG4gICAgICAgICAgICAvLyBBcHBseSBlbGVtZW50LXNwZWNpZmljIGF0dHJpYnV0ZXNcbiAgICAgICAgICAgIEFSSUFNYXBwZXIuYXBwbHlBdHRyUm9sZShlbGVtLCBub2RlTmFtZSwgcmV0VmFsKTtcbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShub2RlIGFzIEhUTUxFbGVtZW50LCBcIkFSSUFNYXBwZXI6OmdldEF0dHJpYnV0ZXNcIiwgcmV0VmFsKTtcbiAgICAgICAgfSBlbHNlIGlmIChub2RlLm5vZGVUeXBlID09PSAzIC8qIE5vZGUuVEVYVF9OT0RFICovKSB7XG4gICAgICAgICAgICBjb25zdCBjYWxjdWxhdG9ycyA9IEFSSUFNYXBwZXIudGV4dEF0dHJWYWx1ZUNhbGN1bGF0b3JzO1xuICAgICAgICAgICAgZm9yIChjb25zdCBhdHRyIGluIGNhbGN1bGF0b3JzKSB7XG4gICAgICAgICAgICAgICAgbGV0IHZhbCA9IGNhbGN1bGF0b3JzW2F0dHJdKG5vZGUpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsICE9PSBcInVuZGVmaW5lZFwiICYmIHZhbCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICByZXRWYWxbYXR0cl0gPSB2YWw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgLy8gT3B0aW1pemU6IE1vdmUgYXBwbHlBdHRyUm9sZSBvdXRzaWRlIGdldEF0dHJpYnV0ZXMgdG8gYXZvaWQgZnVuY3Rpb24gcmVjcmVhdGlvblxuICAgIHByaXZhdGUgc3RhdGljIGFwcGx5QXR0clJvbGUoZWxlbTogRWxlbWVudCwgbm9kZU5hbWU6IHN0cmluZywgcmV0VmFsOiB7IFtrZXk6c3RyaW5nXTogc3RyaW5nIH0pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY2FsY3VsYXRvcnMgPSBBUklBTWFwcGVyLmVsZW1BdHRyVmFsdWVDYWxjdWxhdG9ycztcbiAgICAgICAgaWYgKCEobm9kZU5hbWUgaW4gY2FsY3VsYXRvcnMpKSByZXR1cm47XG4gICAgICAgIFxuICAgICAgICBmb3IgKGNvbnN0IGF0dHIgaW4gY2FsY3VsYXRvcnNbbm9kZU5hbWVdKSB7XG4gICAgICAgICAgICBpZiAoIShhdHRyIGluIHJldFZhbCkpIHtcbiAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSBjYWxjdWxhdG9yc1tub2RlTmFtZV1bYXR0cl07XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9ICh2YWx1ZSBhcyBFbGVtQ2FsYykoZWxlbSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsW2F0dHJdID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGdldEFyaWFPd25lZEJ5KGVsZW06IEhUTUxFbGVtZW50KSA6IEhUTUxFbGVtZW50IHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IGRvYyA9IEZyYWdtZW50VXRpbC5nZXRPd25lckZyYWdtZW50KGVsZW0pO1xuICAgICAgICBpZiAoIUNhY2hlVXRpbC5nZXRDYWNoZShkb2MsIFwiQVJJQU1hcHBlcjo6cHJlY2FsY093bmVkXCIsIGZhbHNlKSkge1xuICAgICAgICAgICAgY29uc3Qgb3duZXJzID0gZG9jLnF1ZXJ5U2VsZWN0b3JBbGwoXCJbYXJpYS1vd25zXVwiKTtcbiAgICAgICAgICAgIGZvciAobGV0IGlPd25lciA9IDA7IGlPd25lciA8IG93bmVycy5sZW5ndGg7ICsraU93bmVyKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3duZXIgPSBvd25lcnNbaU93bmVyXTtcbiAgICAgICAgICAgICAgICBjb25zdCBvd25JZHMgPSBvd25lci5nZXRBdHRyaWJ1dGUoXCJhcmlhLW93bnNcIikuc3BsaXQoLyArL2cpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGlJZD0wOyBpSWQgPCBvd25JZHMubGVuZ3RoOyArK2lJZCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvd25lZCA9IGRvYy5nZXRFbGVtZW50QnlJZChvd25JZHNbaUlkXSk7XG4gICAgICAgICAgICAgICAgICAgIC8vaWdub3JlIGlmIHRoZSBhcmlhLW93bnMgcG9pbnQgdG8gdGhlIGVsZW1lbnQgaXRzZWxmXG4gICAgICAgICAgICAgICAgICAgIC8vaWYgKG93bmVkICYmICFET01VdGlsLnNhbWVOb2RlKG93bmVyLCBvd25lZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgQ2FjaGVVdGlsLnNldENhY2hlKG93bmVkLCBcImFyaWEtb3duZWRcIiwgb3duZXIpO1xuICAgICAgICAgICAgICAgICAgICAvL31cbiAgICAgICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICAgICAqICBjaXJjdWxhciBoaWVyYXJjaHkgY2hlY2s6XG4gICAgICAgICAgICAgICAgICAgICAqICAoMSkgdGhlIG93bmVkIGVsZW1lbnQgaXMgbmVpdGhlciB0aGUgc2FtZSBlbGVtZW50IHdpdGggdGhlIG93bmVyIG5vciBhbnkgYXNjZW5kYW50IG9mIHRoZSBvd25lclxuICAgICAgICAgICAgICAgICAgICAgKiAgKDIpIGFueSBjaGlsZCB3aXRoIGFyaWEtb3ducyBjYW5ub3QgcG9pbnQgdG8gdGhlIG93bmVyIG9yIGFueSBhc2NlbmRhbnQgb2YgdGhlIG93bmVyXG4gICAgICAgICAgICAgICAgICAgICAqLyBcbiAgICAgICAgICAgICAgICAgICAgaWYgKG93bmVkICYmICFET01VdGlsLnNhbWVOb2RlKG93bmVyLCBvd25lZCkpIHsgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZSBvd25lZCB3aXRoIGFyaWEtb3ducyB0aGF0IHBvaW50cyB0byBhbm90aGVyIGVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvd25lZE5vZGVzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdWJfb3duZXJzID0gb3duZWQucXVlcnlTZWxlY3RvckFsbChcIlthcmlhLW93bnNdXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdWJfb3duZXJzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3ViX293bmVyID0gc3ViX293bmVyc1tpXTsgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3ViX293bklkcyA9IHN1Yl9vd25lci5nZXRBdHRyaWJ1dGUoXCJhcmlhLW93bnNcIikuc3BsaXQoLyArL2cpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGo9MDsgaiA8IHN1Yl9vd25JZHMubGVuZ3RoOyArK2opIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3duZWROb2RlID0gZG9jLmdldEVsZW1lbnRCeUlkKHN1Yl9vd25JZHNbal0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3duZWROb2RlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZWROb2Rlcy5wdXNoKG93bmVkTm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvd25lZE5vZGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShvd25lZCwgXCJhcmlhLW93bmVkXCIsIG93bmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiBhbnkgYXJpYS1vd25zIHBvaW50cyB0byB0aGUgZWxlbWVudCBpdHNlbGYgb3IgYW55IG9mIGl0J3MgcGFyZW50XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGFyZW50IDogRWxlbWVudCA9IG93bmVyOyAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNpcmN1bGFyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocGFyZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZm91bmQgPSBvd25lZE5vZGVzLnNvbWUoaXRlbSA9PiBET01VdGlsLnNhbWVOb2RlKHBhcmVudCwgaXRlbSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudCA9IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KHBhcmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaXJjdWxhciA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gICBcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2lyY3VsYXIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKG93bmVkLCBcImFyaWEtb3duZWRcIiwgb3duZXIpOyAgICBcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShkb2MsIFwiQVJJQU1hcHBlcjo6cHJlY2FsY093bmVkXCIsIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBDYWNoZVV0aWwuZ2V0Q2FjaGUoZWxlbSwgXCJhcmlhLW93bmVkXCIsIG51bGwpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0Tm9kZUhpZXJhcmNoeShub2RlOiBOb2RlKSB7XG4gICAgICAgIGlmICghbm9kZSkgcmV0dXJuIFtdO1xuICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSAhPT0gMSkge1xuICAgICAgICAgICAgbGV0IHBhcmVudEhpZXJhcmNoeSA9IHRoaXMuZ2V0Tm9kZUhpZXJhcmNoeShET01XYWxrZXIucGFyZW50RWxlbWVudChub2RlKSk7XG4gICAgICAgICAgICBsZXQgcGFyZW50SW5mbyA9IHBhcmVudEhpZXJhcmNoeS5sZW5ndGggPiAwID8gcGFyZW50SGllcmFyY2h5W3BhcmVudEhpZXJhcmNoeS5sZW5ndGgtMV0gOiB7XG4gICAgICAgICAgICAgICAgcm9sZTogXCJcIixcbiAgICAgICAgICAgICAgICByb2xlUGF0aDogXCJcIixcbiAgICAgICAgICAgICAgICByb2xlQ291bnQ6IHt9LFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuQ2FuSGF2ZVJvbGU6IHRydWVcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBsZXQgbm9kZUhpZXJhcmNoeSA9IFtdO1xuICAgICAgICAgICAgLy8gU2V0IGhpZXJhcmNoeVxuICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHBhcmVudEhpZXJhcmNoeSkge1xuICAgICAgICAgICAgICAgIG5vZGVIaWVyYXJjaHkucHVzaChpdGVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5vZGVIaWVyYXJjaHkucHVzaCh7XG4gICAgICAgICAgICAgICAgYXR0cmlidXRlczoge30sXG4gICAgICAgICAgICAgICAgYm91bmRzOiB0aGlzLmdldEJvdW5kcyhub2RlKSxcbiAgICAgICAgICAgICAgICBuYW1lc3BhY2U6IHRoaXMuZ2V0TmFtZXNwYWNlKCksXG4gICAgICAgICAgICAgICAgbm9kZTogbm9kZSxcbiAgICAgICAgICAgICAgICByb2xlOiB0aGlzLmdldFJvbGUobm9kZSkgfHwgbnVsbCxcbiAgICAgICAgICAgICAgICByb2xlUGF0aDogcGFyZW50SW5mby5yb2xlUGF0aCtcIi9cIisodGhpcy5nZXRSb2xlKG5vZGUpIHx8IG51bGwpLFxuICAgICAgICAgICAgICAgIHJvbGVDb3VudDoge30sXG4gICAgICAgICAgICAgICAgY2hpbGRyZW5DYW5IYXZlUm9sZTogcGFyZW50SW5mby5jaGlsZHJlbkNhbkhhdmVSb2xlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBub2RlSGllcmFyY2h5O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IGVsZW0gPSBub2RlIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgbGV0IG5vZGVIaWVyYXJjaHkgOiBBcnJheTx7XG4gICAgICAgICAgICAgICAgcm9sZTogc3RyaW5nLFxuICAgICAgICAgICAgICAgIHJvbGVQYXRoOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgcm9sZUNvdW50OiB7XG4gICAgICAgICAgICAgICAgICAgIFtyb2xlOiBzdHJpbmddOiBudW1iZXJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2hpbGRyZW5DYW5IYXZlUm9sZTogYm9vbGVhblxuICAgICAgICAgICAgfT4gPSBDYWNoZVV0aWwuZ2V0Q2FjaGUoZWxlbSwgXCJBUklBTWFwcGVyOjpnZXROb2RlSGllcmFyY2h5XCIsIG51bGwpO1xuICAgICAgICAgICAgaWYgKCFub2RlSGllcmFyY2h5KSB7XG4gICAgICAgICAgICAgICAgLy8gVGhpcyBlbGVtZW50IGhhc24ndCBiZWVuIHByb2Nlc3NlZCB5ZXQgLSBidXQgOjpyZXNldCBwcm9jZXNzZXMgdGhlbSBhbGwgaW4gdGhlIHJpZ2h0IG9yZGVyXG5cbiAgICAgICAgICAgICAgICAvLyBHZXQgZGV0YWlscyBhYm91dCB0aGUgY29ycmVjdCBwYXJlbnQgZmlyc3RcbiAgICAgICAgICAgICAgICBsZXQgcGFyZW50ID0gQVJJQU1hcHBlci5nZXRBcmlhT3duZWRCeShlbGVtKTtcbiAgICAgICAgICAgICAgICBpZiAoIXBhcmVudCkge1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBET01XYWxrZXIucGFyZW50RWxlbWVudChlbGVtKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICB9IFxuICAgICAgICAgICAgICAgIHdoaWxlIChwYXJlbnQgJiYgcGFyZW50Lm5vZGVUeXBlICE9PSAxKSB7IFxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBET01XYWxrZXIucGFyZW50RWxlbWVudChlbGVtKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHBhcmVudEhpZXJhcmNoeSA9IHBhcmVudCA/IHRoaXMuZ2V0Tm9kZUhpZXJhcmNoeShwYXJlbnQpIDogW107XG4gICAgICAgICAgICAgICAgbGV0IHBhcmVudEluZm8gPSBwYXJlbnRIaWVyYXJjaHkubGVuZ3RoID4gMCA/IHBhcmVudEhpZXJhcmNoeVtwYXJlbnRIaWVyYXJjaHkubGVuZ3RoLTFdIDoge1xuICAgICAgICAgICAgICAgICAgICByb2xlOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICByb2xlUGF0aDogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgcm9sZUNvdW50OiB7fSxcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW5DYW5IYXZlUm9sZTogdHJ1ZVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgd2hpbGUgKHBhcmVudEluZm8ucm9sZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBBUklBTWFwcGVyLmdldEFyaWFPd25lZEJ5KHBhcmVudCkgfHwgRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQocGFyZW50KSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50SGllcmFyY2h5ID0gcGFyZW50ID8gdGhpcy5nZXROb2RlSGllcmFyY2h5KHBhcmVudCkgOiBbXTtcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50SW5mbyA9IHBhcmVudEhpZXJhcmNoeVtwYXJlbnRIaWVyYXJjaHkubGVuZ3RoLTFdO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFNldCBpbml0aWFsIG5vZGUgaW5mb1xuICAgICAgICAgICAgICAgIGxldCBub2RlSW5mbyA6IHtcbiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgW3JvbGU6IHN0cmluZ106IHN0cmluZ1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJvdW5kczogYW55LFxuICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgbm9kZTogSFRNTEVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIHJvbGU6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgcm9sZVBhdGg6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgcm9sZUNvdW50OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBbcm9sZTogc3RyaW5nXTogbnVtYmVyXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW5DYW5IYXZlUm9sZTogYm9vbGVhblxuICAgICAgICAgICAgICAgIH0gPSB7XG4gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IGVsZW0ubm9kZVR5cGUgPT09IDEgPyB0aGlzLmdldEF0dHJpYnV0ZXMoZWxlbSk6IHt9LCAgIFxuICAgICAgICAgICAgICAgICAgICBib3VuZHM6IHRoaXMuZ2V0Qm91bmRzKGVsZW0pLFxuICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U6IHRoaXMuZ2V0TmFtZXNwYWNlKCksXG4gICAgICAgICAgICAgICAgICAgIG5vZGU6IGVsZW0sXG4gICAgICAgICAgICAgICAgICAgIHJvbGU6IHRoaXMuZ2V0Um9sZShlbGVtKSB8fCBudWxsLFxuICAgICAgICAgICAgICAgICAgICByb2xlUGF0aDogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgcm9sZUNvdW50OiB7fSxcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW5DYW5IYXZlUm9sZTogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIEFkanVzdCByb2xlIGlmIHdlJ3JlIHdpdGhpbiBhIHByZXNlbnRhdGlvbmFsIGNvbnRhaW5lclxuICAgICAgICAgICAgICAgIGxldCBwcmVzZW50YXRpb25hbENvbnRhaW5lciA9ICFwYXJlbnRJbmZvLmNoaWxkcmVuQ2FuSGF2ZVJvbGU7XG4gICAgICAgICAgICAgICAgaWYgKHByZXNlbnRhdGlvbmFsQ29udGFpbmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGVJbmZvLnJvbGUgPSBudWxsO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGVJbmZvLmNoaWxkcmVuQ2FuSGF2ZVJvbGUgPSBwYXJlbnRJbmZvLmNoaWxkcmVuQ2FuSGF2ZVJvbGUgXG4gICAgICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLmNoaWxkcmVuQ2FuSGF2ZVJvbGUoZWxlbSwgbm9kZUluZm8ucm9sZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gU2V0IHRoZSBwYXRoc1xuICAgICAgICAgICAgICAgIGlmIChub2RlSW5mby5yb2xlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudEluZm8ucm9sZUNvdW50W25vZGVJbmZvLnJvbGVdID0gKHBhcmVudEluZm8ucm9sZUNvdW50W25vZGVJbmZvLnJvbGVdIHx8IDApICsgMTsgXG4gICAgICAgICAgICAgICAgICAgIG5vZGVJbmZvLnJvbGVQYXRoID0gcGFyZW50SW5mby5yb2xlUGF0aCtcIi9cIitub2RlSW5mby5yb2xlK1wiW1wiK3BhcmVudEluZm8ucm9sZUNvdW50W25vZGVJbmZvLnJvbGVdK1wiXVwiO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGVJbmZvLnJvbGVQYXRoID0gcGFyZW50SW5mby5yb2xlUGF0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIFNldCBoaWVyYXJjaHlcbiAgICAgICAgICAgICAgICBub2RlSGllcmFyY2h5ID0gW11cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgcGFyZW50SGllcmFyY2h5KSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGVIaWVyYXJjaHkucHVzaChpdGVtKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbm9kZUhpZXJhcmNoeS5wdXNoKG5vZGVJbmZvKTtcbiAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJBUklBTWFwcGVyOjpnZXROb2RlSGllcmFyY2h5XCIsIG5vZGVIaWVyYXJjaHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5vZGVIaWVyYXJjaHk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXNldChub2RlOiBOb2RlKSB7XG4gICAgICAgIEFSSUFNYXBwZXIubmFtZUNvbXB1dGF0aW9uSWQgPSAwO1xuICAgICAgICB0aGlzLmhpZXJhcmNoeVJvbGUgPSBbXTtcbiAgICAgICAgdGhpcy5oaWVyYXJjaHlSZXN1bHRzID0gW107XG4gICAgICAgIHRoaXMuaGllcmFyY2h5UGF0aCA9IFt7XG4gICAgICAgICAgICByb2xlUGF0aDogXCJcIixcbiAgICAgICAgICAgIHJvbGVDb3VudDoge31cbiAgICAgICAgfV07XG4gICAgICAgIC8vIEdldCB0byB0aGUgdG9wbW9zdCBub2RlXG4gICAgICAgIGxldCBnb29kTm9kZSA9IG5vZGU7XG4gICAgICAgIGxldCBuZXh0O1xuICAgICAgICB3aGlsZSAobmV4dCA9IERPTVdhbGtlci5wYXJlbnROb2RlKGdvb2ROb2RlKSkge1xuICAgICAgICAgICAgZ29vZE5vZGUgPSBuZXh0O1xuICAgICAgICB9O1xuICAgICAgICAvLyBXYWxrIHRoZSB0cmVlIGFuZCBzZXQgdGhlIGhpZXJhcmNoaWVzIGluIHRoZSByaWdodCBvcmRlclxuICAgICAgICBsZXQgYXJpYVdhbGtlciA9IG5ldyBBUklBV2Fsa2VyKGdvb2ROb2RlLCBmYWxzZSwgZ29vZE5vZGUpO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICBpZiAoYXJpYVdhbGtlci5ub2RlLm5vZGVUeXBlID09PSAxKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5nZXROb2RlSGllcmFyY2h5KGFyaWFXYWxrZXIubm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gd2hpbGUgKGFyaWFXYWxrZXIubmV4dE5vZGUoKSk7XG4gICAgfVxuXG4gICAgb3BlblNjb3BlKG5vZGU6IE5vZGUpOiBJTWFwUmVzdWx0W10ge1xuICAgICAgICBpZiAodGhpcy5oaWVyYXJjaHlSb2xlID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0KG5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucHVzaEhpZXJhcmNoeShub2RlKVxuICAgICAgICBmb3IgKGxldCBpZHg9MDsgaWR4PHRoaXMuaGllcmFyY2h5UmVzdWx0cy5sZW5ndGg7ICsraWR4KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oaWVyYXJjaHlSZXN1bHRzW2lkeF0ucm9sZSAmJiB0aGlzLmhpZXJhcmNoeVJlc3VsdHNbaWR4XS5yb2xlWzBdID09PSBcIi9cIikge1xuICAgICAgICAgICAgICAgIHRoaXMuaGllcmFyY2h5UmVzdWx0c1tpZHhdLnJvbGUgPSAodGhpcy5oaWVyYXJjaHlSZXN1bHRzW2lkeF0ucm9sZSA/IHRoaXMuaGllcmFyY2h5UmVzdWx0c1tpZHhdLnJvbGUuc3Vic3RyaW5nKDEpIDogbnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuaGllcmFyY2h5UmVzdWx0cztcbiAgICB9XG5cbiAgICBwdXNoSGllcmFyY2h5KG5vZGU6IE5vZGUpIHtcbiAgICAgICAgLy8gSWYgd2UncmUgbm90IGFuIGVsZW1lbnQsIG5vIHNwZWNpYWwgaGFuZGxpbmdcbiAgICAgICAgbGV0IG5vZGVIaWVyYXJjaHkgPSBbXVxuICAgICAgICAvLyBEZXRlcm1pbmUgb3VyIG5vZGUgaW5mb1xuICAgICAgICBub2RlSGllcmFyY2h5ID0gdGhpcy5nZXROb2RlSGllcmFyY2h5KG5vZGUpO1xuICAgICAgICBsZXQgbm9kZUluZm8gPSBub2RlSGllcmFyY2h5W25vZGVIaWVyYXJjaHkubGVuZ3RoLTFdO1xuICAgICAgICB0aGlzLmhpZXJhcmNoeVJvbGUucHVzaChub2RlSW5mby5yb2xlKTtcbiAgICAgICAgaWYgKG5vZGVJbmZvLnJvbGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuaGllcmFyY2h5UGF0aC5wdXNoKG5vZGVJbmZvKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaGllcmFyY2h5UmVzdWx0cyA9IG5vZGVIaWVyYXJjaHk7XG4gICAgfVxuXG4gICAgY2xvc2VTY29wZShub2RlOiBOb2RlKTogSU1hcFJlc3VsdFtdIHtcbiAgICAgICAgbGV0IHJldFZhbCA6IElNYXBSZXN1bHRbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHJlcyBvZiB0aGlzLmhpZXJhcmNoeVJlc3VsdHMpIHtcbiAgICAgICAgICAgIC8vIGNvbnN0IHRlbXAgPSByZXMubm9kZTtcbiAgICAgICAgICAgIC8vIHJlcy5ub2RlID0gbnVsbDtcbiAgICAgICAgICAgIC8vIGxldCBjbG9uZWQgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHJlcykpO1xuICAgICAgICAgICAgLy8gY2xvbmVkLm5vZGUgPSByZXMubm9kZSA9IHRlbXA7IFxuICAgICAgICAgICAgLy8gcmV0VmFsLnB1c2goY2xvbmVkKTtcbiAgICAgICAgICAgIHJldFZhbC5wdXNoKHJlcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJldFZhbC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXRWYWxbcmV0VmFsLmxlbmd0aC0xXS5yb2xlID0gXCIvXCIrcmV0VmFsW3JldFZhbC5sZW5ndGgtMV0ucm9sZVxuICAgICAgICAgICAgbGV0IHBhcmVudCA9IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KG5vZGUpO1xuICAgICAgICAgICAgdGhpcy5oaWVyYXJjaHlSZXN1bHRzID0gcGFyZW50ID8gQ2FjaGVVdGlsLmdldENhY2hlKHBhcmVudCBhcyBIVE1MRWxlbWVudCwgXCJBUklBTWFwcGVyOjpnZXROb2RlSW5mb1wiLCBbXSkgOiBbXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAvLyBIZWxwZXIgZnVuY3Rpb25zXG4gICAgLy8vL1xuXG4gICAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWwtYWFtLTEuMC8jbWFwcGluZy1odG1sLXRvLWFjY2Vzc2liaWxpdHktYXBpc1xuICAgIHB1YmxpYyBzdGF0aWMgZWxlbUF0dHJWYWx1ZUNhbGN1bGF0b3JzOiB7IFtub2RlTmFtZTpzdHJpbmddOiB7IFthdHRyOnN0cmluZ106IHN0cmluZyB8IEVsZW1DYWxjIH19ID0ge1xuICAgICAgICBcImdsb2JhbFwiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogZWxlbSA9PiBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWUoZWxlbSk/Lm5hbWUgIC8vQVJJQU1hcHBlci5jb21wdXRlTmFtZVxuICAgICAgICB9XG4gICAgICAgICwgXCJkYXRhbGlzdFwiOiB7XG4gICAgICAgICAgICAvLyBzZXQgdG8gXCJ0cnVlXCIgaWYgdGhlIGRhdGFsaXN0J3Mgc2VsZWN0aW9uIG1vZGVsIGFsbG93cyBtdWx0aXBsZSBvcHRpb24gZWxlbWVudHMgdG8gYmVcbiAgICAgICAgICAgIC8vIHNlbGVjdGVkIGF0IGEgdGltZSwgYW5kIFwiZmFsc2VcIiBvdGhlcndpc2VcbiAgICAgICAgICAgIFwibXVsdGlzZWxlY3RhYmxlXCI6IGVsZW0gPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlkID0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJpZFwiKTtcbiAgICAgICAgICAgICAgICBpZiAoaWQgJiYgaWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgaW5wdXQgPSBlbGVtLm93bmVyRG9jdW1lbnQucXVlcnlTZWxlY3RvcihcImlucHV0W2xpc3Q9J1wiK2lkK1wiJ11cIik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIlwiKyhlbGVtLmdldEF0dHJpYnV0ZShcIm11bHRpcGxlXCIpIFxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGVsZW0uZ2V0QXR0cmlidXRlKFwibXVsdGlwbGVcIik9PVwidHJ1ZVwiIHx8IGVsZW0uZ2V0QXR0cmlidXRlKFwibXVsdGlwbGVcIik9PVwiXCIpKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAsIFwiaDFcIjoge1xuICAgICAgICAgICAgXCJsZXZlbFwiOiBcIjFcIlxuICAgICAgICB9XG4gICAgICAgICwgXCJoMlwiOiB7XG4gICAgICAgICAgICBcImxldmVsXCI6IFwiMlwiXG4gICAgICAgIH1cbiAgICAgICAgLCBcImgzXCI6IHtcbiAgICAgICAgICAgIFwibGV2ZWxcIjogXCIzXCJcbiAgICAgICAgfVxuICAgICAgICAsIFwiaDRcIjoge1xuICAgICAgICAgICAgXCJsZXZlbFwiOiBcIjRcIlxuICAgICAgICB9XG4gICAgICAgICwgXCJoNVwiOiB7XG4gICAgICAgICAgICBcImxldmVsXCI6IFwiNVwiXG4gICAgICAgIH1cbiAgICAgICAgLCBcImg2XCI6IHtcbiAgICAgICAgICAgIFwibGV2ZWxcIjogXCI2XCJcbiAgICAgICAgfVxuICAgICAgICAsIFwiaW5wdXRcIjoge1xuICAgICAgICAgICAgLy8gLSB0eXBlPVwiY2hlY2tib3hcIiBzdGF0ZSBzZXQgdG8gXCJtaXhlZFwiIGlmIHRoZSBlbGVtZW50J3MgaW5kZXRlcm1pbmF0ZSBJREwgYXR0cmlidXRlXG4gICAgICAgICAgICAvLyBpcyB0cnVlLCBvciBcInRydWVcIiBpZiB0aGUgZWxlbWVudCdzIGNoZWNrZWRuZXNzIGlzIHRydWUsIG9yIFwiZmFsc2VcIiBvdGhlcndpc2VcbiAgICAgICAgICAgIC8vIC0gdHlwZT1cInJhZGlvXCIgc3RhdGUgc2V0IHRvIFwidHJ1ZVwiIGlmIHRoZSBlbGVtZW50J3MgY2hlY2tlZG5lc3MgaXMgdHJ1ZSwgb3IgXCJmYWxzZVwiXG4gICAgICAgICAgICAvLyBvdGhlcndpc2UuXG4gICAgICAgICAgICBcImNoZWNrZWRcIjogZWxlbSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdHlwZSA9IGVsZW0uZ2V0QXR0cmlidXRlKFwidHlwZVwiKTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gXCJjaGVja2JveFwiIHx8IHR5cGUgPT09IFwicmFkaW9cIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJcIisoZWxlbSBhcyBIVE1MSW5wdXRFbGVtZW50KS5jaGVja2VkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIC0gdHlwZT1cInJhZGlvXCIgYW5kIG5vdCBpbiBtZW51IHJlZmxlY3RpbmcgbnVtYmVyIG9mIHR5cGU9cmFkaW8gaW5wdXQgZWxlbWVudHMgXG4gICAgICAgICAgICAvLyB3aXRoaW4gdGhlIHJhZGlvIGJ1dHRvbiBncm91cFxuICAgICAgICAgICAgLCBcInNldHNpemVcIjogZWxlbSA9PiB7IHJldHVybiBudWxsOyB0aHJvdyBuZXcgRXJyb3IoXCJOT1QgSU1QTEVNRU5URURcIik7IH1cbiAgICAgICAgICAgIC8vIC0gdHlwZT1cInJhZGlvXCIgYW5kIG5vdCBpbiBtZW51IHZhbHVlIHJlZmxlY3RpbmcgdGhlIGVsZW1lbnRzIHBvc2l0aW9uIFxuICAgICAgICAgICAgLy8gd2l0aGluIHRoZSByYWRpbyBidXR0b24gZ3JvdXAuXCJcbiAgICAgICAgICAgICwgXCJwb3NpbnNldFwiOiBlbGVtID0+IHsgcmV0dXJuIG51bGw7IHRocm93IG5ldyBFcnJvcihcIk5PVCBJTVBMRU1FTlRFRFwiKTsgfVxuICAgICAgICAgICAgLy8gaW5wdXQgKHR5cGUgYXR0cmlidXRlIGluIHRoZSBUZXh0LCBTZWFyY2gsIFRlbGVwaG9uZSwgVVJMLCBvciBFLW1haWwgc3RhdGVzIHdpdGggYSBcbiAgICAgICAgICAgIC8vIHN1Z2dlc3Rpb25zIHNvdXJjZSBlbGVtZW50KSBjb21ib2JveCByb2xlLCB3aXRoIHRoZSBhcmlhLW93bnMgcHJvcGVydHkgc2V0IHRvIHRoZSBzYW1lXG4gICAgICAgICAgICAvLyB2YWx1ZSBhcyB0aGUgbGlzdCBhdHRyaWJ1dGVcbiAgICAgICAgICAgICwgXCJvd25zXCI6IGVsZW0gPT4geyByZXR1cm4gbnVsbDsgdGhyb3cgbmV3IEVycm9yKFwiTk9UIElNUExFTUVOVEVEXCIpOyB9XG4gICAgICAgIH1cbiAgICAgICAgLCBcImtleWdlblwiOiB7XG4gICAgICAgICAgICBcIm11bHRpc2VsZWN0YWJsZVwiOiBcImZhbHNlXCJcbiAgICAgICAgfVxuICAgICAgICAsIFwibGlcIjoge1xuICAgICAgICAgICAgLy8gTnVtYmVyIG9mIGxpIGVsZW1lbnRzIHdpdGhpbiB0aGUgb2wsIHVsLCBtZW51XG4gICAgICAgICAgICBcInNldHNpemVcIjogZWxlbSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyZW50ID0gRE9NVXRpbC5nZXRBbmNlc3RvcihlbGVtLCBbXCJvbFwiLCBcInVsXCIsIFwibWVudVwiXSk7XG4gICAgICAgICAgICAgICAgaWYgKCFwYXJlbnQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxpcyA9IENhY2hlVXRpbC5nZXRTZXRDYWNoZShwYXJlbnQsIFwiZWxlbUF0dHJWYWx1ZUNhbGN1bGF0b3JzOjpsaXNcIiwgKCkgPT4gcGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJsaVwiKSk7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3RoZXJsaXMgPSBDYWNoZVV0aWwuZ2V0U2V0Q2FjaGUocGFyZW50LCBcImVsZW1BdHRyVmFsdWVDYWxjdWxhdG9yczo6b3RoZXJsaXNcIiwgKCkgPT4gcGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJvbCBsaSwgdWwgbGksIG1lbnUgbGlcIikpO1xuICAgICAgICAgICAgICAgIHJldHVybiBcIlwiKyhsaXMubGVuZ3RoLW90aGVybGlzLmxlbmd0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBQb3NpdGlvbiBvZiBsaSBlbGVtZW50IHdpdGhpbiB0aGUgb2wsIHVsLCBtZW51XG4gICAgICAgICAgICAsIFwicG9zaW5zZXRcIjogZWxlbSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyZW50ID0gRE9NVXRpbC5nZXRBbmNlc3RvcihlbGVtLCBbXCJvbFwiLCBcInVsXCIsIFwibWVudVwiXSlcbiAgICAgICAgICAgICAgICBpZiAoIXBhcmVudCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgY29uc3QgbGlzID0gQ2FjaGVVdGlsLmdldFNldENhY2hlKHBhcmVudCwgXCJlbGVtQXR0clZhbHVlQ2FsY3VsYXRvcnM6Omxpc1wiLCAoKSA9PiBwYXJlbnQucXVlcnlTZWxlY3RvckFsbChcImxpXCIpKTtcbiAgICAgICAgICAgICAgICBsZXQgbnVtID0gMDtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpZHg9MDsgaWR4PGxpcy5sZW5ndGg7ICsraWR4KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpID0gbGlzW2lkeF07XG4gICAgICAgICAgICAgICAgICAgIGlmIChET01VdGlsLnNhbWVOb2RlKHBhcmVudCwgRE9NVXRpbC5nZXRBbmNlc3RvcihsaSwgW1wib2xcIiwgXCJ1bFwiLCBcIm1lbnVcIl0pKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiXCIrbnVtO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICsrbnVtO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAsIFwibWVudWl0ZW1cIjoge1xuICAgICAgICAgICAgLy8gdHlwZSA9IGNoZWNrYm94IG9yIHJhZGlvLCBzZXQgdG8gXCJ0cnVlXCIgaWYgdGhlIGNoZWNrZWQgYXR0cmlidXRlIFxuICAgICAgICAgICAgLy8gaXMgcHJlc2VudCwgYW5kIFwiZmFsc2VcIiBvdGhlcndpc2VcbiAgICAgICAgICAgIFwiY2hlY2tlZFwiOiBlbGVtID0+IFwiXCIrISEoZWxlbS5nZXRBdHRyaWJ1dGUoXCJjaGVja2VkXCIpIFxuICAgICAgICAgICAgICAgICYmIChlbGVtLmdldEF0dHJpYnV0ZShcImNoZWNrZWRcIik9PVwidHJ1ZVwiIHx8IGVsZW0uZ2V0QXR0cmlidXRlKFwiY2hlY2tlZFwiKT09XCJcIikpXG4gICAgICAgIH1cbiAgICAgICAgLCBcIm9wdGlvblwiOiB7XG4gICAgICAgICAgICAvLyBzZXQgdG8gXCJ0cnVlXCIgaWYgdGhlIGVsZW1lbnQncyBzZWxlY3RlZG5lc3MgaXMgdHJ1ZSwgb3IgXCJmYWxzZVwiIG90aGVyd2lzZS5cbiAgICAgICAgICAgIFwic2VsZWN0ZWRcIjogZWxlbSA9PiBcIlwiKyEhKGVsZW0uZ2V0QXR0cmlidXRlKFwic2VsZWN0ZWRcIikgXG4gICAgICAgICAgICAgICAgJiYgKGVsZW0uZ2V0QXR0cmlidXRlKFwic2VsZWN0ZWRcIik9PVwidHJ1ZVwiIHx8IGVsZW0uZ2V0QXR0cmlidXRlKFwic2VsZWN0ZWRcIik9PVwiXCIpKVxuICAgICAgICB9XG4gICAgICAgICwgXCJwcm9ncmVzc1wiOiB7XG4gICAgICAgICAgICBcInZhbHVlbWF4XCI6IGVsZW0gPT4gZWxlbS5nZXRBdHRyaWJ1dGUoXCJtYXhcIikgfHwgXCIxXCJcbiAgICAgICAgICAgICwgXCJ2YWx1ZW1pblwiOiBlbGVtID0+IFwiMFwiXG4gICAgICAgICAgICAsIFwidmFsdWVub3dcIjogZWxlbSA9PiBlbGVtLmdldEF0dHJpYnV0ZShcInZhbHVlXCIpXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgdGV4dEF0dHJWYWx1ZUNhbGN1bGF0b3JzOiB7IFthdHRyOnN0cmluZ106IE5vZGVDYWxjIH0gPSB7XG4gICAgICAgIFwibmFtZVwiOiBub2RlID0+IG5vZGUubm9kZVZhbHVlXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgbmFtZUNvbXB1dGF0aW9uSWQgPSAwO1xuICAgIC8qKnB1YmxpYyBzdGF0aWMgY29tcHV0ZU5hbWUoY3VyOiBOb2RlKSA6IHN0cmluZyB7XG4gICAgICAgICsrQVJJQU1hcHBlci5uYW1lQ29tcHV0YXRpb25JZDtcbiAgICAgICAgcmV0dXJuIEFSSUFNYXBwZXIuY29tcHV0ZU5hbWVIZWxwKEFSSUFNYXBwZXIubmFtZUNvbXB1dGF0aW9uSWQsIGN1ciwgZmFsc2UsIGZhbHNlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNvbXB1dGVOYW1lSGVscCh3YWxrSWQ6IG51bWJlciwgY3VyOiBOb2RlLCBsYWJlbGxlZGJ5VHJhdmVyc2U6IGJvb2xlYW4sIHdhbGtUcmF2ZXJzZTogYm9vbGVhbikgOiBzdHJpbmcge1xuICAgICAgICAvLyAyZy4gTm9uZSBvZiB0aGUgb3RoZXIgY29udGVudCBhcHBsaWVzIHRvIHRleHQgbm9kZXMsIHNvIGp1c3QgZG8gdGhpcyBmaXJzdFxuICAgICAgICBpZiAoY3VyLm5vZGVUeXBlID09PSAzICkgcmV0dXJuIGN1ci5ub2RlVmFsdWU7XG4gICAgICAgIGlmIChjdXIubm9kZVR5cGUgPT09IDExKSByZXR1cm4gXCJcIjtcbiAgICAgICAgaWYgKGN1ci5ub2RlVHlwZSAhPT0gMSApIHtcbiAgICAgICAgICAgIGlmICh3YWxrVHJhdmVyc2UgfHwgbGFiZWxsZWRieVRyYXZlcnNlKSByZXR1cm4gXCJcIjtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvciAoXCJDYW4gb25seSBjb21wdXRlIG5hbWUgb24gRWxlbWVudCBhbmQgVGV4dCBcIiArIGN1ci5ub2RlVHlwZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBlbGVtID0gY3VyIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vIFdlJ3ZlIGJlZW4gaGVyZSBiZWZvcmUgLSBwcmV2ZW50IHJlY3Vyc2lvblxuICAgICAgICBpZiAoQ2FjaGVVdGlsLmdldENhY2hlKGVsZW0sIFwiZGF0YS1uYW1ld2Fsa1wiLCBudWxsKSA9PT0gXCJcIit3YWxrSWQpIHJldHVybiBcIlwiO1xuICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJkYXRhLW5hbWV3YWxrXCIsIFwiXCIrd2Fsa0lkKTtcbiAgICAgICAgLy8gU2VlIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sLWFhbS0xLjAvI2lucHV0LXR5cGUtdGV4dC1pbnB1dC10eXBlLXBhc3N3b3JkLWlucHV0LXR5cGUtc2VhcmNoLWlucHV0LXR5cGUtdGVsLWlucHV0LXR5cGUtdXJsLWFuZC10ZXh0YXJlYS1lbGVtZW50XG5cbiAgICAgICAgLy8gMmEuIE9ubHkgc2hvdyBoaWRkZW4gY29udGVudCBpZiBpdCdzIHJlZmVyZW5jZWQgYnkgYSBsYWJlbGxlZGJ5XG4gICAgICAgIGlmICghbGFiZWxsZWRieVRyYXZlcnNlICYmICFWaXNVdGlsLmlzTm9kZVZpc2libGUoY3VyKSkge1xuICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAyYi4gY29sbGVjdCB2YWxpZCBpZCByZWZlcmVuY2VzXG4gICAgICAgIGlmICghbGFiZWxsZWRieVRyYXZlcnNlICYmIGVsZW0uaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpKSB7XG4gICAgICAgICAgICBsZXQgbGFiZWxsZWRieSA9IGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgIGxldCB2YWxpZEVsZW1zID0gW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJlZiBvZiBsYWJlbGxlZGJ5KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVmRWxlbSA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKGN1ciwgcmVmKTtcbiAgICAgICAgICAgICAgICBpZiAocmVmRWxlbSAmJiAhRE9NVXRpbC5zYW1lTm9kZShlbGVtLCByZWZFbGVtKSkge1xuICAgICAgICAgICAgICAgICAgICB2YWxpZEVsZW1zLnB1c2gocmVmRWxlbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHZhbGlkRWxlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCBhY2N1bXVsYXRlZCA9IFwiXCI7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBlbGVtIG9mIHZhbGlkRWxlbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgYWNjdW11bGF0ZWQgKz0gXCIgXCIgKyB0aGlzLmNvbXB1dGVOYW1lSGVscCh3YWxrSWQsIGVsZW0sIHRydWUsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjY3VtdWxhdGVkLnRyaW0oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNpbmNlIG5vZGVUb1JvbGUgY2FsbHMgYmFjayBoZXJlIGZvciBmb3JtIGFuZCBzZWN0aW9uLCB3ZSBuZWVkIHNwZWNpYWwgY2FzaW5nIGhlcmUgdG8gaGFuZGxlIHRob3NlIHR3byBjYXNlc1xuICAgICAgICBpZiAoW1wic2VjdGlvblwiLCBcImZvcm1cIl0uaW5jbHVkZXMoY3VyLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICAgICAgICBpZiAoZWxlbS5oYXNBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIpICYmIGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKS50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIC8vIElmIEknbSBub3QgYW4gZW1iZWRkZWQgY29udHJvbCBvciBJJ20gbm90IHJlY3Vyc2luZywgcmV0dXJuIHRoZSBhcmlhLWxhYmVsXG4gICAgICAgICAgICAgICAgaWYgKCFsYWJlbGxlZGJ5VHJhdmVyc2UgJiYgIXdhbGtUcmF2ZXJzZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIpLnRyaW0oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZWxlbS5oYXNBdHRyaWJ1dGUoXCJ0aXRsZVwiKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZShcInRpdGxlXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAyYy4gSWYgbGFiZWwgb3Igd2FsaywgYW5kIHRoaXMgaXMgYSBjb250cm9sLCBza2lwIHRvIHRoZSB2YWx1ZSwgb3RoZXJ3aXNlIHByb3ZpZGUgdGhlIGxhYmVsXG4gICAgICAgIGNvbnN0IHJvbGUgPSBBUklBTWFwcGVyLm5vZGVUb1JvbGUoY3VyKTtcbiAgICAgICAgbGV0IGlzRW1iZWRkZWRDb250cm9sID0gW1xuICAgICAgICAgICAgXCJ0ZXh0Ym94XCIsIFwiYnV0dG9uXCIsIFwiY29tYm9ib3hcIiwgXCJsaXN0Ym94XCIsIFxuICAgICAgICAgICAgXCJwcm9ncmVzc2JhclwiLCBcInNjcm9sbGJhclwiLCBcInNsaWRlclwiLCBcInNwaW5idXR0b25cIlxuICAgICAgICBdLmluY2x1ZGVzKHJvbGUpO1xuICAgICAgICBpZiAoZWxlbS5oYXNBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIpICYmIGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKS50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy8gSWYgSSdtIG5vdCBhbiBlbWJlZGRlZCBjb250cm9sIG9yIEknbSBub3QgcmVjdXJzaW5nLCByZXR1cm4gdGhlIGFyaWEtbGFiZWxcbiAgICAgICAgICAgIGlmICghbGFiZWxsZWRieVRyYXZlcnNlICYmICF3YWxrVHJhdmVyc2UgfHwgIWlzRW1iZWRkZWRDb250cm9sKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKS50cmltKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyAyZC4gXG4gICAgICAgIGlmIChyb2xlICE9PSBcInByZXNlbnRhdGlvblwiICYmIHJvbGUgIT09IFwibm9uZVwiKSB7XG4gICAgICAgICAgICBpZiAoKGN1ci5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImltZ1wiIHx8IGN1ci5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImFyZWFcIikgJiYgZWxlbS5oYXNBdHRyaWJ1dGUoXCJhbHRcIikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gRE9NVXRpbC5jbGVhbldoaXRlc3BhY2UoZWxlbS5nZXRBdHRyaWJ1dGUoXCJhbHRcIikpLnRyaW0oKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGN1ci5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImlucHV0XCIgJiYgZWxlbS5oYXNBdHRyaWJ1dGUoXCJpZFwiKSAmJiBlbGVtLmdldEF0dHJpYnV0ZShcImlkXCIpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgbGFiZWwgPSBlbGVtLm93bmVyRG9jdW1lbnQucXVlcnlTZWxlY3RvcihcImxhYmVsW2Zvcj0nXCIrZWxlbS5nZXRBdHRyaWJ1dGUoXCJpZFwiKStcIiddXCIpO1xuICAgICAgICAgICAgICAgIGlmIChsYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobGFiZWwuaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKSB8fCAobGFiZWwuaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpICYmICFDb21tb25VdGlsLmlzSWRSZWZlclRvU2VsZihjdXIsIGxhYmVsLmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKSkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb21wdXRlTmFtZUhlbHAod2Fsa0lkLCBsYWJlbCwgZmFsc2UsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsYWJlbC50ZXh0Q29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjdXIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJmaWVsZHNldFwiKSB7XG4gICAgICAgICAgICAgICAgaWYoICg8RWxlbWVudD5jdXIpLnF1ZXJ5U2VsZWN0b3IoXCJsZWdlbmRcIikpe1xuICAgICAgICAgICAgICAgICAgICBsZXQgbGVnZW5kID0gKDxFbGVtZW50PmN1cikucXVlcnlTZWxlY3RvcihcImxlZ2VuZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlZ2VuZC5pbm5lclRleHQ7XG4gICAgICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXB1dGVOYW1lSGVscCh3YWxrSWQsIGN1ciwgZmFsc2UsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDJlLlxuICAgICAgICBpZiAoKHdhbGtUcmF2ZXJzZSB8fCBsYWJlbGxlZGJ5VHJhdmVyc2UpICYmIGlzRW1iZWRkZWRDb250cm9sKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGUgZW1iZWRkZWQgY29udHJvbCBoYXMgcm9sZSB0ZXh0Ym94LCByZXR1cm4gaXRzIHZhbHVlLlxuICAgICAgICAgICAgaWYgKHJvbGUgPT09IFwidGV4dGJveFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbnB1dFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcInZhbHVlXCIpKSByZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB3YWxrVHJhdmVyc2UgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIElmIHRoZSBlbWJlZGRlZCBjb250cm9sIGhhcyByb2xlIGJ1dHRvbiwgcmV0dXJuIHRoZSB0ZXh0IGFsdGVybmF0aXZlIG9mIHRoZSBidXR0b24uXG4gICAgICAgICAgICBpZiAocm9sZSA9PT0gXCJidXR0b25cIikge1xuICAgICAgICAgICAgICAgIGlmIChlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiaW5wdXRcIikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdHlwZSA9IGVsZW0uZ2V0QXR0cmlidXRlKFwidHlwZVwiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoW1wiYnV0dG9uXCIsIFwic3VibWl0XCIsIFwicmVzZXRcIl0uaW5jbHVkZXModHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcInZhbHVlXCIpKSByZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09PSBcInN1Ym1pdFwiKSByZXR1cm4gXCJTdWJtaXRcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09PSBcInJlc2V0XCIpIHJldHVybiBcIlJlc2V0XCI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB3YWxrVHJhdmVyc2UgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFRPRE86IElmIHRoZSBlbWJlZGRlZCBjb250cm9sIGhhcyByb2xlIGNvbWJvYm94IG9yIGxpc3Rib3gsIHJldHVybiB0aGUgdGV4dCBhbHRlcm5hdGl2ZSBvZiB0aGUgY2hvc2VuIG9wdGlvbi5cbiAgICAgICAgICAgIGlmIChyb2xlID09PSBcImNvbWJvYm94XCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbS5oYXNBdHRyaWJ1dGUoXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNlbGVjdGVkID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQoZWxlbSwgXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZCAmJiAhRE9NVXRpbC5zYW1lTm9kZShlbGVtLCBzZWxlY3RlZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBUklBTWFwcGVyLmNvbXB1dGVOYW1lSGVscCh3YWxrSWQsIHNlbGVjdGVkLCBmYWxzZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJZiB0aGUgZW1iZWRkZWQgY29udHJvbCBoYXMgcm9sZSByYW5nZSAoZS5nLiwgYSBzcGluYnV0dG9uIG9yIHNsaWRlcik6XG4gICAgICAgICAgICBpZiAoW1wicHJvZ3Jlc3NiYXJcIiwgXCJzY3JvbGxiYXJcIiwgXCJzbGlkZXJcIiwgXCJzcGluYnV0dG9uXCJdLmluY2x1ZGVzKHJvbGUpKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIGFyaWEtdmFsdWV0ZXh0IHByb3BlcnR5IGlzIHByZXNlbnQsIHJldHVybiBpdHMgdmFsdWUsXG4gICAgICAgICAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwiYXJpYS12YWx1ZXRleHRcIikpIHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtdmFsdWV0ZXh0XCIpO1xuICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgaWYgdGhlIGFyaWEtdmFsdWVub3cgcHJvcGVydHkgaXMgcHJlc2VudCwgcmV0dXJuIGl0cyB2YWx1ZSxcbiAgICAgICAgICAgICAgICBpZiAoZWxlbS5oYXNBdHRyaWJ1dGUoXCJhcmlhLXZhbHVlbm93XCIpKSByZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLXZhbHVlbm93XCIpO1xuICAgICAgICAgICAgICAgIC8vIFRPRE86IE90aGVyd2lzZSwgdXNlIHRoZSB2YWx1ZSBhcyBzcGVjaWZpZWQgYnkgYSBob3N0IGxhbmd1YWdlIGF0dHJpYnV0ZS5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDJmLiAyaC5cbiAgICAgICAgaWYgKHdhbGtUcmF2ZXJzZSB8fCBBUklBRGVmaW5pdGlvbnMubmFtZUZyb21Db250ZW50KHJvbGUpIHx8IGxhYmVsbGVkYnlUcmF2ZXJzZSkge1xuICAgICAgICAgICAgLy8gMmZpLiBTZXQgdGhlIGFjY3VtdWxhdGVkIHRleHQgdG8gdGhlIGVtcHR5IHN0cmluZy5cbiAgICAgICAgICAgIGxldCBhY2N1bXVsYXRlZCA9IFwiXCI7XG4gICAgICAgICAgICAvLyAyZmlpLiBDaGVjayBmb3IgQ1NTIGdlbmVyYXRlZCB0ZXh0dWFsIGNvbnRlbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IG5vZGUgYW5kIFxuICAgICAgICAgICAgLy8gaW5jbHVkZSBpdCBpbiB0aGUgYWNjdW11bGF0ZWQgdGV4dC4gVGhlIENTUyA6YmVmb3JlIGFuZCA6YWZ0ZXIgcHNldWRvIGVsZW1lbnRzIFtDU1MyXSBcbiAgICAgICAgICAgIC8vIGNhbiBwcm92aWRlIHRleHR1YWwgY29udGVudCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIGEgY29udGVudCBtb2RlbC5cbiAgICAgICAgICAgIC8vICAgRm9yIDpiZWZvcmUgcHNldWRvIGVsZW1lbnRzLCBVc2VyIGFnZW50cyBNVVNUIHByZXBlbmQgQ1NTIHRleHR1YWwgY29udGVudCwgd2l0aG91dCBcbiAgICAgICAgICAgIC8vICAgICBhIHNwYWNlLCB0byB0aGUgdGV4dHVhbCBjb250ZW50IG9mIHRoZSBjdXJyZW50IG5vZGUuXG4gICAgICAgICAgICAvLyAgIEZvciA6YWZ0ZXIgcHNldWRvIGVsZW1lbnRzLCBVc2VyIGFnZW50cyBNVVNUIGFwcGVuZCBDU1MgdGV4dHVhbCBjb250ZW50LCB3aXRob3V0IGEgXG4gICAgICAgICAgICAvLyAgICAgc3BhY2UsIHRvIHRoZSB0ZXh0dWFsIGNvbnRlbnQgb2YgdGhlIGN1cnJlbnQgbm9kZS5cbiAgICAgICAgICAgIGxldCBiZWZvcmUgPSBudWxsO1xuICAgICAgICAgICAgYmVmb3JlID0gZWxlbS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoZWxlbSxcImJlZm9yZVwiKS5jb250ZW50O1xuXG4gICAgICAgICAgICBpZiAoYmVmb3JlICYmIGJlZm9yZSAhPT0gXCJub25lXCIpIHtcbiAgICAgICAgICAgICAgICBiZWZvcmUgPSBiZWZvcmUucmVwbGFjZSgvXlwiLyxcIlwiKS5yZXBsYWNlKC9cIiQvLFwiXCIpO1xuICAgICAgICAgICAgICAgIGFjY3VtdWxhdGVkICs9IGJlZm9yZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIDJmaWlpLiBGb3IgZWFjaCBjaGlsZCBub2RlIG9mIHRoZSBjdXJyZW50IG5vZGU6XG4gICAgICAgICAgICAvLyAgIFNldCB0aGUgY3VycmVudCBub2RlIHRvIHRoZSBjaGlsZCBub2RlLlxuICAgICAgICAgICAgLy8gICBDb21wdXRlIHRoZSB0ZXh0IGFsdGVybmF0aXZlIG9mIHRoZSBjdXJyZW50IG5vZGUgYmVnaW5uaW5nIHdpdGggc3RlcCAyLiBTZXQgdGhlIHJlc3VsdCBcbiAgICAgICAgICAgIC8vICAgICB0byB0aGF0IHRleHQgYWx0ZXJuYXRpdmUuXG4gICAgICAgICAgICAvLyAgIEFwcGVuZCB0aGUgcmVzdWx0IHRvIHRoZSBhY2N1bXVsYXRlZCB0ZXh0LlxuICAgICAgICAgICAgaWYgKGVsZW0ubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJTTE9UXCIpIHtcbiAgICAgICAgICAgICAgICAvL2lmIG5vIGFzc2lnbmVkTm9kZSwgY2hlY2sgaXRzIG93biB0ZXh0IFxuICAgICAgICAgICAgICAgIGlmICghKGVsZW0gYXMgSFRNTFNsb3RFbGVtZW50KS5hc3NpZ25lZE5vZGVzKCkgfHwgKGVsZW0gYXMgSFRNTFNsb3RFbGVtZW50KS5hc3NpZ25lZE5vZGVzKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpbm5lclRleHQgPSBDb21tb25VdGlsLmdldElubmVyVGV4dChlbGVtKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlubmVyVGV4dCAmJiBpbm5lclRleHQgIT09IG51bGwgJiYgaW5uZXJUZXh0LnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgYWNjdW11bGF0ZWQgKz0gIFwiIFwiICsgaW5uZXJUZXh0O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAgIFxuICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayB0ZXh0IGZyb20gYWxsIGFzc2lnbmVkIG5vZGVzXG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc2xvdENoaWxkIG9mIChlbGVtIGFzIEhUTUxTbG90RWxlbWVudCkuYXNzaWduZWROb2RlcygpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmV4dENoaWxkQ29udGVudCA9IEFSSUFNYXBwZXIuY29tcHV0ZU5hbWVIZWxwKHdhbGtJZCwgc2xvdENoaWxkLCBsYWJlbGxlZGJ5VHJhdmVyc2UsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYWNjdW11bGF0ZWQgKz0gXCIgXCIgKyBuZXh0Q2hpbGRDb250ZW50O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgd2Fsa0NoaWxkID0gZWxlbS5maXJzdENoaWxkO1xuICAgICAgICAgICAgICAgIHdoaWxlICh3YWxrQ2hpbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5leHRDaGlsZENvbnRlbnQgPSBBUklBTWFwcGVyLmNvbXB1dGVOYW1lSGVscCh3YWxrSWQsIHdhbGtDaGlsZCwgbGFiZWxsZWRieVRyYXZlcnNlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgYWNjdW11bGF0ZWQgKz0gXCIgXCIgKyBuZXh0Q2hpbGRDb250ZW50O1xuICAgICAgICAgICAgICAgICAgICB3YWxrQ2hpbGQgPSB3YWxrQ2hpbGQubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgYWZ0ZXIgPSBudWxsO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhZnRlciA9IGVsZW0ub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGVsZW0sXCJhZnRlclwiKS5jb250ZW50O1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge31cblxuICAgICAgICAgICAgaWYgKGFmdGVyICYmIGFmdGVyICE9PSBcIm5vbmVcIikge1xuICAgICAgICAgICAgICAgIGFmdGVyID0gYWZ0ZXIucmVwbGFjZSgvXlwiLyxcIlwiKS5yZXBsYWNlKC9cIiQvLFwiXCIpO1xuICAgICAgICAgICAgICAgIGFjY3VtdWxhdGVkICs9IGFmdGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gMmZpdi4gUmV0dXJuIHRoZSBhY2N1bXVsYXRlZCB0ZXh0LlxuICAgICAgICAgICAgYWNjdW11bGF0ZWQgPSBhY2N1bXVsYXRlZC5yZXBsYWNlKC9cXHMrL2csXCIgXCIpLnRyaW0oKTtcbiAgICAgICAgICAgIGlmIChhY2N1bXVsYXRlZC50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhY2N1bXVsYXRlZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDJpLiBPdGhlcndpc2UsIGlmIHRoZSBjdXJyZW50IG5vZGUgaGFzIGEgVG9vbHRpcCBhdHRyaWJ1dGUsIHJldHVybiBpdHMgdmFsdWUuXG4gICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcInRpdGxlXCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoXCJ0aXRsZVwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZWxlbS50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwic3ZnXCIpIHtcbiAgICAgICAgICAgIGxldCB0aXRsZSA9IGVsZW0ucXVlcnlTZWxlY3RvcihcInRpdGxlXCIpO1xuICAgICAgICAgICAgaWYgKHRpdGxlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRpdGxlLnRleHRDb250ZW50IHx8IHRpdGxlLmlubmVyVGV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cbiAgICAqL1xuLyogICAgICAgIGlmIChyb2xlIGluIEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1xuICAgICAgICAgICAgJiYgQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVdLm5hbWVGcm9tIFxuICAgICAgICAgICAgJiYgQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVdLm5hbWVGcm9tLmluY2x1ZGVzKFwiY29udGVudHNcIikpIFxuICAgICAgICB7XG4gICAgICAgICAgICBuYW1lID0gZWxlbS50ZXh0Q29udGVudDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImlucHV0XCIgJiYgZWxlbS5oYXNBdHRyaWJ1dGUoXCJpZFwiKSAmJiBlbGVtLmdldEF0dHJpYnV0ZShcImlkXCIpLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBuYW1lID0gZWxlbS5vd25lckRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJsYWJlbFtmb3I9J1wiK2VsZW0uZ2V0QXR0cmlidXRlKFwiaWRcIikudHJpbSgpK1wiJ11cIikudGV4dENvbnRlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKSkge1xuICAgICAgICAgICAgbmFtZSA9IGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZWxlbS5oYXNBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsbGVkYnlcIikpIHtcbiAgICAgICAgICAgIG5hbWUgPSBcIlwiO1xuICAgICAgICAgICAgY29uc3QgaWRzID0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsbGVkYnlcIikuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBpZCBvZiBpZHMpIHtcbiAgICAgICAgICAgICAgICBuYW1lICs9IEZyYWdtZW50VXRpbC5nZXRCeUlkKGVsZW0sIGlkKS50ZXh0Q29udGVudCArIFwiIFwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbmFtZSA9IG5hbWUudHJpbSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuYW1lO1xuICAgIH0qL1xuXG4gICAgcHVibGljIHN0YXRpYyBub2RlVG9Sb2xlKG5vZGUgOiBOb2RlKSB7XG4gICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSAzIC8qIE5vZGUuVEVYVF9OT0RFICovKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJ0ZXh0XCI7XG4gICAgICAgIH0gZWxzZSBpZiAobm9kZS5ub2RlVHlwZSAhPT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLykge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZWxlbSA9IG5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgaWYgKCFlbGVtIHx8IGVsZW0ubm9kZVR5cGUgIT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8pIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVE8gRE86IHVzZSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUoZWxlbSkgdG8gcmVwbGFjZSB0aGUgY29kZSBmb2xsb3dpbmcsIHdoaWNoIHVzZXMgb25seSB0aGUgdmFsaWQgcm9sZXMgZm9yIHRoZSBlbGVtZW50IGJhc2VkIG9uIHRoZSBhcmlhIGZhbGxiYWNrIHJ1bGVcbiAgICAgICAgLy9jb25zdCByb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKGVsZW0pO1xuICAgICAgICAvL3JldHVybiByb2xlID09PSBcInByZXNlbnRhdGlvblwiIHx8IHJvbGUgPT09IFwibm9uZVwiID8gbnVsbCA6IHJvbGU7XG4gICAgICAgIFxuICAgICAgICBpZiAoZWxlbS5oYXNBdHRyaWJ1dGUoXCJyb2xlXCIpICYmIGVsZW0uZ2V0QXR0cmlidXRlKFwicm9sZVwiKS50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGV0IHJvbGVTdHIgPSBlbGVtLmdldEF0dHJpYnV0ZShcInJvbGVcIikudHJpbSgpO1xuICAgICAgICAgICAgbGV0IHJvbGVzID0gcm9sZVN0ci5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJvbGUgb2Ygcm9sZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAocm9sZSA9PT0gXCJwcmVzZW50YXRpb25cIiB8fCByb2xlID09PSBcIm5vbmVcIikge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiBlbGVtZW50IGlzIGZvY3VzYWJsZSwgdGhlbiBwcmVzZW50YXRpb24gcm9sZXMgYXJlIHRvIGJlIGlnbm9yZWRcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFDb21tb25VdGlsLmlzRm9jdXNhYmxlKGVsZW0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocm9sZSBpbiBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJvbGU7XG4gICAgICAgICAgICAgICAgfSAgICBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvL3JldHVybiB0aGlzLmVsZW1Ub0ltcGxpY2l0Um9sZShlbGVtKTtcbiAgICAgICAgY29uc3Qgcm9sZXMgPSBBcmlhVXRpbC5nZXRJbXBsaWNpdFJvbGUoZWxlbSk7XG4gICAgICAgIC8vY29uc29sZS5sb2coXCJub2RlPVwiICsgbm9kZS5ub2RlTmFtZSArXCIsIHJvbGU9IFwiICsgKHJvbGVzID8gcm9sZXNbMF0gOiBudWxsKSArXCIsIHJlc29sdmVkPVwiICsgQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKGVsZW0pKTtcbiAgICAgICAgY29uc3Qgcm9sZSA9ICFyb2xlcyB8fCByb2xlcy5sZW5ndGggPT09MCA/IG51bGwgOiByb2xlc1swXTtcbiAgICAgICAgcmV0dXJuIHJvbGUgPT09IFwicHJlc2VudGF0aW9uXCIgfHwgcm9sZSA9PT0gXCJub25lXCIgPyBudWxsIDogcm9sZTtcbiAgICAgICAgLy9yZXR1cm4gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKGVsZW0pO1xuICAgICAgICBcbiAgICB9XG59IFxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcbmltcG9ydCB7IEFSSUFNYXBwZXIgfSBmcm9tIFwiLi9BUklBTWFwcGVyXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3Y0L3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4uL2RvbS9ET01XYWxrZXJcIjtcblxuLyoqXG4gKiBXYWxrcyBpbiBhbiBBUklBIG9yZGVyXG4gKiBcbiAqIFNlZSBhbHNvIC4uL2RvbS9ET01XYWxrZXJcbiAqL1xuZXhwb3J0IGNsYXNzIEFSSUFXYWxrZXIge1xuICAgIHJvb3QgOiBOb2RlO1xuICAgIG5vZGUgOiBOb2RlO1xuICAgIGJFbmRUYWc6IGJvb2xlYW47XG5cbiAgICBjb25zdHJ1Y3RvcihlbGVtZW50IDogTm9kZSwgYkVuZD8gOiBib29sZWFuLCByb290PyA6IE5vZGUpIHtcbiAgICAgICAgdGhpcy5yb290ID0gcm9vdCB8fCBlbGVtZW50O1xuICAgICAgICBpZiAodGhpcy5yb290Lm5vZGVUeXBlID09PSA5KSB7XG4gICAgICAgICAgICB0aGlzLnJvb3QgPSAodGhpcy5yb290IGFzIERvY3VtZW50KS5kb2N1bWVudEVsZW1lbnRcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5vZGUgPSBlbGVtZW50O1xuICAgICAgICAvLyBpZiAodGhpcy5ub2RlLm5vZGVUeXBlID09PSA5KSB7XG4gICAgICAgIC8vICAgICB0aGlzLm5vZGUgPSAodGhpcy5ub2RlIGFzIERvY3VtZW50KS5kb2N1bWVudEVsZW1lbnRcbiAgICAgICAgLy8gfVxuICAgICAgICB0aGlzLmJFbmRUYWcgPSAoYkVuZCA9PSB1bmRlZmluZWQgPyBmYWxzZSA6IGJFbmQgPT0gdHJ1ZSk7XG4gICAgfVxuXG4gICAgYXRSb290KCkgOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCh0aGlzIGFzIGFueSkub3duZXJFbGVtZW50KSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLnJvb3QgPT09IHRoaXMubm9kZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5yb290LmlzU2FtZU5vZGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJvb3QuaXNTYW1lTm9kZSh0aGlzLm5vZGUpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucm9vdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucm9vdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbih0aGlzLm5vZGUpID09PSAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gTm90IHN1cHBvcnRlZCBpbiB0aGlzIGVudmlyb25tZW50IC0gdHJ5IG91ciBiZXN0XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5ub2RlLnBhcmVudE5vZGUgPT09IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZXh0Tm9kZSgpIDogYm9vbGVhbiB7XG4gICAgICAgIGxldCBza2lwT3duZWQgPSBmYWxzZTtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgc2tpcE93bmVkID0gZmFsc2U7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyh0aGlzLm5vZGUubm9kZU5hbWUsIHRoaXMuYkVuZFRhZz9cIkVORFwiOlwiU1RBUlRcIiwgdGhpcy5ub2RlLm5vZGVUeXBlID09PSAxICYmICh0aGlzLm5vZGUgYXMgYW55KS5nZXRBdHRyaWJ1dGUoXCJpZFwiKSk7XG4gICAgICAgICAgICBpZiAoIXRoaXMuYkVuZFRhZykge1xuICAgICAgICAgICAgICAgIGxldCBpZnJhbWVOb2RlID0gKHRoaXMubm9kZSBhcyBIVE1MSUZyYW1lRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgbGV0IGVsZW1lbnROb2RlID0gKHRoaXMubm9kZSBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgbGV0IHNsb3RFbGVtZW50ID0gKHRoaXMubm9kZSBhcyBIVE1MU2xvdEVsZW1lbnQpXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLyBcbiAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5ub2RlLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiSUZSQU1FXCJcbiAgICAgICAgICAgICAgICAgICAgJiYgVmlzVXRpbC5pc05vZGVWaXNpYmxlKGlmcmFtZU5vZGUpXG4gICAgICAgICAgICAgICAgICAgICYmIGlmcmFtZU5vZGUuY29udGVudERvY3VtZW50XG4gICAgICAgICAgICAgICAgICAgICYmIGlmcmFtZU5vZGUuY29udGVudERvY3VtZW50LmRvY3VtZW50RWxlbWVudClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBvd25lckVsZW1lbnQgPSB0aGlzLm5vZGU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IGlmcmFtZU5vZGUuY29udGVudERvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMubm9kZSBhcyBhbnkpLm93bmVyRWxlbWVudCA9IG93bmVyRWxlbWVudDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLyBcbiAgICAgICAgICAgICAgICAgICAgJiYgVmlzVXRpbC5pc05vZGVWaXNpYmxlKGVsZW1lbnROb2RlKVxuICAgICAgICAgICAgICAgICAgICAmJiBlbGVtZW50Tm9kZS5zaGFkb3dSb290XG4gICAgICAgICAgICAgICAgICAgICYmIGVsZW1lbnROb2RlLnNoYWRvd1Jvb3QuZmlyc3RDaGlsZClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBvd25lckVsZW1lbnQgPSB0aGlzLm5vZGU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IGVsZW1lbnROb2RlLnNoYWRvd1Jvb3Q7XG4gICAgICAgICAgICAgICAgICAgICh0aGlzLm5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQgPSBvd25lckVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIERPTVdhbGtlci5hc3NpZ25TbG90cyh0aGlzLm5vZGUgYXMgU2hhZG93Um9vdCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgXG4gICAgICAgICAgICAgICAgICAgICYmIGVsZW1lbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwic2xvdFwiXG4gICAgICAgICAgICAgICAgICAgICYmIHNsb3RFbGVtZW50LmFzc2lnbmVkTm9kZXMoKS5sZW5ndGggPiAwKSBcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHNsb3RFbGVtZW50LmFzc2lnbmVkTm9kZXMoKVswXTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8gfHwgdGhpcy5ub2RlLm5vZGVUeXBlID09PSAxMSAvKiBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUgKi8pIFxuICAgICAgICAgICAgICAgICAgICAmJiBET01XYWxrZXIuZmlyc3RDaGlsZE5vdE93bmVkQnlTbG90KHRoaXMubm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gRE9NV2Fsa2VyLmZpcnN0Q2hpbGROb3RPd25lZEJ5U2xvdCh0aGlzLm5vZGUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hdFJvb3QoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgodGhpcy5ub2RlIGFzIGFueSkuc2xvdE93bmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzbG90T3duZXIgPSAodGhpcy5ub2RlIGFzIGFueSkuc2xvdE93bmVyO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbmV4dFNsb3RJbmRleCA9ICh0aGlzLm5vZGUgYXMgYW55KS5zbG90SW5kZXgrMTtcbiAgICAgICAgICAgICAgICAgICAgLy8gZGVsZXRlICh0aGlzLm5vZGUgYXMgYW55KS5zbG90T3duZXI7XG4gICAgICAgICAgICAgICAgICAgIC8vIGRlbGV0ZSAodGhpcy5ub2RlIGFzIGFueSkuc2xvdEluZGV4O1xuICAgICAgICAgICAgICAgICAgICBpZiAobmV4dFNsb3RJbmRleCA8IHNsb3RPd25lci5hc3NpZ25lZE5vZGVzKCkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBzbG90T3duZXIuYXNzaWduZWROb2RlcygpW25leHRTbG90SW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBzbG90T3duZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgodGhpcy5ub2RlIGFzIGFueSkub3duZXJFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9ICh0aGlzLm5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChET01XYWxrZXIubmV4dFNpYmxpbmdOb3RPd25lZEJ5U2xvdCh0aGlzLm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IERPTVdhbGtlci5uZXh0U2libGluZ05vdE93bmVkQnlTbG90KHRoaXMubm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBza2lwT3duZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5ub2RlLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubm9kZS5wYXJlbnROb2RlLm5vZGVUeXBlID09PSAxICYmICh0aGlzLm5vZGUucGFyZW50Tm9kZSBhcyBIVE1MRWxlbWVudCkuaGFzQXR0cmlidXRlKFwiYXJpYS1vd25zXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgb3duSWRzID0gKHRoaXMubm9kZS5wYXJlbnROb2RlIGFzIEhUTUxFbGVtZW50KS5nZXRBdHRyaWJ1dGUoXCJhcmlhLW93bnNcIikuc3BsaXQoLyArL2cpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubm9kZS5ub2RlVHlwZSAhPT0gMSB8fCAhKHRoaXMubm9kZSBhcyBIVE1MRWxlbWVudCkuaGFzQXR0cmlidXRlKFwiaWRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBGcmFnbWVudFV0aWwuZ2V0T3duZXJGcmFnbWVudCh0aGlzLm5vZGUpLmdldEVsZW1lbnRCeUlkKG93bklkc1swXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpZHggPSBvd25JZHMuaW5kZXhPZigodGhpcy5ub2RlIGFzIEhUTUxFbGVtZW50KS5nZXRBdHRyaWJ1dGUoXCJpZFwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlkeCA9PT0gb3duSWRzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGFzdCBvbmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gdGhpcy5ub2RlLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IHRydWU7ICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ3JhYiBuZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IEZyYWdtZW50VXRpbC5nZXRPd25lckZyYWdtZW50KHRoaXMubm9kZSkuZ2V0RWxlbWVudEJ5SWQob3duSWRzW2lkeCsxXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSB0aGlzLm5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IHdoaWxlIChcbiAgICAgICAgICAgICh0aGlzLm5vZGUubm9kZVR5cGUgIT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8gJiYgdGhpcy5ub2RlLm5vZGVUeXBlICE9PSAxMSAmJiB0aGlzLm5vZGUubm9kZVR5cGUgIT09IDMgLyogTm9kZS5URVhUX05PREUgKi8pXG4gICAgICAgICAgICB8fCAodGhpcy5ub2RlLm5vZGVUeXBlID09PSAxICYmICh0aGlzLm5vZGUgYXMgRWxlbWVudCkuZ2V0QXR0cmlidXRlKFwiYUNoZWNrZXJcIikgPT09IFwiQUNFXCIpXG4gICAgICAgICAgICB8fCAoc2tpcE93bmVkICYmIHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSAmJiAhIUFSSUFNYXBwZXIuZ2V0QXJpYU93bmVkQnkodGhpcy5ub2RlIGFzIEhUTUxFbGVtZW50KSlcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHJldk5vZGUoKSA6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgc2tpcE93bmVkID0gZmFsc2U7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIHNraXBPd25lZCA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKHRoaXMuYkVuZFRhZykge1xuICAgICAgICAgICAgICAgIGxldCBpZnJhbWVOb2RlID0gKHRoaXMubm9kZSBhcyBIVE1MSUZyYW1lRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgbGV0IGVsZW1lbnROb2RlID0gKHRoaXMubm9kZSBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLyBcbiAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5ub2RlLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiSUZSQU1FXCJcbiAgICAgICAgICAgICAgICAgICAgJiYgVmlzVXRpbC5pc05vZGVWaXNpYmxlKGlmcmFtZU5vZGUpXG4gICAgICAgICAgICAgICAgICAgICYmIGlmcmFtZU5vZGUuY29udGVudERvY3VtZW50XG4gICAgICAgICAgICAgICAgICAgICYmIGlmcmFtZU5vZGUuY29udGVudERvY3VtZW50LmRvY3VtZW50RWxlbWVudCkgXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb3duZXJFbGVtZW50ID0gdGhpcy5ub2RlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBpZnJhbWVOb2RlLmNvbnRlbnREb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICh0aGlzLm5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQgPSBvd25lckVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8gXG4gICAgICAgICAgICAgICAgICAgICYmIFZpc1V0aWwuaXNOb2RlVmlzaWJsZShlbGVtZW50Tm9kZSlcbiAgICAgICAgICAgICAgICAgICAgJiYgZWxlbWVudE5vZGUuc2hhZG93Um9vdFxuICAgICAgICAgICAgICAgICAgICAmJiBlbGVtZW50Tm9kZS5zaGFkb3dSb290Lmxhc3RDaGlsZCkgXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb3duZXJFbGVtZW50ID0gdGhpcy5ub2RlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBlbGVtZW50Tm9kZS5zaGFkb3dSb290O1xuICAgICAgICAgICAgICAgICAgICAodGhpcy5ub2RlIGFzIGFueSkub3duZXJFbGVtZW50ID0gb3duZXJFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICBET01XYWxrZXIuYXNzaWduU2xvdHModGhpcy5ub2RlIGFzIFNoYWRvd1Jvb3QpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLyB8fCB0aGlzLm5vZGUubm9kZVR5cGUgPT09IDExKSBcbiAgICAgICAgICAgICAgICAgICAgJiYgRE9NV2Fsa2VyLmxhc3RDaGlsZE5vdE93bmVkQnlTbG90KHRoaXMubm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gRE9NV2Fsa2VyLmxhc3RDaGlsZE5vdE93bmVkQnlTbG90KHRoaXMubm9kZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hdFJvb3QoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChET01XYWxrZXIucHJldmlvdXNTaWJsaW5nTm90T3duZWRCeVNsb3QodGhpcy5ub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBET01XYWxrZXIucHJldmlvdXNTaWJsaW5nTm90T3duZWRCeVNsb3QodGhpcy5ub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCh0aGlzLm5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gKHRoaXMubm9kZSBhcyBhbnkpLm93bmVyRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHNraXBPd25lZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm5vZGUucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5ub2RlLnBhcmVudE5vZGUubm9kZVR5cGUgPT09IDEgJiYgKHRoaXMubm9kZS5wYXJlbnROb2RlIGFzIEhUTUxFbGVtZW50KS5oYXNBdHRyaWJ1dGUoXCJhcmlhLW93bnNcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvd25JZHMgPSAodGhpcy5ub2RlLnBhcmVudE5vZGUgYXMgSFRNTEVsZW1lbnQpLmdldEF0dHJpYnV0ZShcImFyaWEtb3duc1wiKS5zcGxpdCgvICsvZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5ub2RlLm5vZGVUeXBlICE9PSAxIHx8ICEodGhpcy5ub2RlIGFzIEhUTUxFbGVtZW50KS5oYXNBdHRyaWJ1dGUoXCJpZFwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IEZyYWdtZW50VXRpbC5nZXRPd25lckZyYWdtZW50KHRoaXMubm9kZSkuZ2V0RWxlbWVudEJ5SWQob3duSWRzWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlkeCA9IG93bklkcy5pbmRleE9mKCh0aGlzLm5vZGUgYXMgSFRNTEVsZW1lbnQpLmdldEF0dHJpYnV0ZShcImlkXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWR4ID09PSBvd25JZHMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsYXN0IG9uZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSB0aGlzLm5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gdHJ1ZTsgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBncmFiIG5leHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gRnJhZ21lbnRVdGlsLmdldE93bmVyRnJhZ21lbnQodGhpcy5ub2RlKS5nZXRFbGVtZW50QnlJZChvd25JZHNbaWR4KzFdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHRoaXMubm9kZS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IHdoaWxlIChcbiAgICAgICAgICAgICh0aGlzLm5vZGUubm9kZVR5cGUgIT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8gJiYgdGhpcy5ub2RlLm5vZGVUeXBlICE9PSAxMSlcbiAgICAgICAgICAgIHx8ICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgJiYgKHRoaXMubm9kZSBhcyBFbGVtZW50KS5nZXRBdHRyaWJ1dGUoXCJhQ2hlY2tlclwiKSA9PT0gXCJBQ0VcIilcbiAgICAgICAgICAgIHx8IChza2lwT3duZWQgJiYgdGhpcy5ub2RlLm5vZGVUeXBlID09PSAxICYmICEhQVJJQU1hcHBlci5nZXRBcmlhT3duZWRCeSh0aGlzLm5vZGUgYXMgSFRNTEVsZW1lbnQpKVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi8uLi8uLi9hcGkvSUVuZ2luZVwiO1xuXG5leHBvcnQgY2xhc3MgQW5jZXN0b3JVdGlsIHtcbiAgICBwdWJsaWMgc3RhdGljIGlzUHJlc2VudGF0aW9uRnJhbWUoY29udGV4dEhpZXJhcmNoeTogUnVsZUNvbnRleHRIaWVyYXJjaHkpIDogYm9vbGVhbiB7XG4gICAgICAgIGlmIChjb250ZXh0SGllcmFyY2h5ICYmIGNvbnRleHRIaWVyYXJjaHkuZG9tKSB7XG4gICAgICAgICAgICAvLyBTa2lwIGN1cnJlbnQgbm9kZSBiZWNhdXNlIHdlIHdhbnQgYW5jZXN0cnlcbiAgICAgICAgICAgIGZvciAobGV0IGlkeD1jb250ZXh0SGllcmFyY2h5LmRvbS5sZW5ndGgtMjsgaWR4ID49IDA7IC0taWR4KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbSA9IChjb250ZXh0SGllcmFyY2h5LmRvbVtpZHhdLm5vZGUgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGlmIChlbGVtLm5vZGVUeXBlID09PSAxIFxuICAgICAgICAgICAgICAgICAgICAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiaWZyYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgJiYgKGVsZW0uZ2V0QXR0cmlidXRlKFwicm9sZVwiKSA9PT0gXCJwcmVzZW50YXRpb25cIiB8fCBlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtaGlkZGVuXCIpID09PSBcInRydWVcIikpIFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGlzRnJhbWUoY29udGV4dEhpZXJhcmNoeTogUnVsZUNvbnRleHRIaWVyYXJjaHkpIDogYm9vbGVhbiB7XG4gICAgICAgIGlmIChjb250ZXh0SGllcmFyY2h5ICYmIGNvbnRleHRIaWVyYXJjaHkuZG9tKSB7XG4gICAgICAgICAgICAvLyBTa2lwIGN1cnJlbnQgbm9kZSBiZWNhdXNlIHdlIHdhbnQgYW5jZXN0cnlcbiAgICAgICAgICAgIGZvciAobGV0IGlkeD1jb250ZXh0SGllcmFyY2h5LmRvbS5sZW5ndGgtMjsgaWR4ID49IDA7IC0taWR4KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbSA9IChjb250ZXh0SGllcmFyY2h5LmRvbVtpZHhdLm5vZGUgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGlmIChlbGVtLm5vZGVUeXBlID09PSAxICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpZnJhbWVcIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgIENvcHlyaWdodDo6IDIwMjAtIElCTSwgSW5jXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uLy4uLy4uL2FwaS9JRW5naW5lXCI7XG5cbmV4cG9ydCBjbGFzcyBGcmFnbWVudFV0aWwge1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0T3duZXJGcmFnbWVudChub2RlOiBOb2RlKSA6IERvY3VtZW50IHwgRG9jdW1lbnRGcmFnbWVudCB7XG4gICAgICAgIGxldCBuIDogTm9kZSA9IG5vZGU7XG4gICAgICAgIHdoaWxlKG4ucGFyZW50Tm9kZSAmJiAobiA9IG4ucGFyZW50Tm9kZSkpe1xuICAgICAgICAgICAgaWYgKG4ubm9kZVR5cGUgPT09IDExKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG4gYXMgRG9jdW1lbnRGcmFnbWVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbm9kZS5vd25lckRvY3VtZW50O1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0QnlJZChub2RlOiBOb2RlLCBpZDogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE93bmVyRnJhZ21lbnQobm9kZSkuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0QW5jZXN0b3IoaGllcmFyY2hpZXM6IFJ1bGVDb250ZXh0SGllcmFyY2h5LCBlbGVtTmFtZTogc3RyaW5nKSB7XG4gICAgICAgIGxldCBtYXRjaGVzID0gaGllcmFyY2hpZXNbXCJkb21cIl0uZmlsdGVyKGluZm8gPT4gaW5mby5yb2xlID09PSBlbGVtTmFtZSk7XG4gICAgICAgIHJldHVybiBtYXRjaGVzLmxlbmd0aCA+IDAgJiYgbWF0Y2hlc1swXS5ub2RlIHx8IG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRBbmNlc3RvcldpdGhSb2xlKGhpZXJhcmNoaWVzOiBSdWxlQ29udGV4dEhpZXJhcmNoeSwgcm9sZTogc3RyaW5nKSB7XG4gICAgICAgIGxldCBtYXRjaGVzID0gaGllcmFyY2hpZXNbXCJhcmlhXCJdLmZpbHRlcihpbmZvID0+IGluZm8ucm9sZSA9PT0gcm9sZSk7XG4gICAgICAgIHJldHVybiBtYXRjaGVzLmxlbmd0aCA+IDAgJiYgbWF0Y2hlc1swXS5ub2RlIHx8IG51bGw7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMS0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuLy8gRnJvbSBodHRwczovL3d3dy5pYW5hLm9yZy9hc3NpZ25tZW50cy9sYW5ndWFnZS1zdWJ0YWctcmVnaXN0cnkvbGFuZ3VhZ2Utc3VidGFnLXJlZ2lzdHJ5XG5jb25zdCB2YWxpZFByaW1hcnlMYW5ncyA9IFsgLy8gXCJxYWEuLnF0elwiLFxuWyBcImFhXCIsXCJhYlwiLFwiYWVcIixcImFmXCIsXCJha1wiLFwiYW1cIixcImFuXCIsXCJhclwiLFwiYXNcIixcImF2XCIsXCJheVwiLFwiYXpcIixcImFhYVwiLFwiYWFiXCIsXCJhYWNcIixcImFhZFwiLFwiYWFlXCIsXCJhYWZcIixcImFhZ1wiLFwiYWFoXCIsXCJhYWlcIixcImFha1wiLFwiYWFsXCIsXCJhYW1cIixcImFhblwiLFwiYWFvXCIsXCJhYXBcIixcImFhcVwiLFwiYWFzXCIsXCJhYXRcIixcImFhdVwiLFwiYWF2XCIsXCJhYXdcIixcImFheFwiLFwiYWF6XCIsXCJhYmFcIixcImFiYlwiLFwiYWJjXCIsXCJhYmRcIixcImFiZVwiLFwiYWJmXCIsXCJhYmdcIixcImFiaFwiLFwiYWJpXCIsXCJhYmpcIixcImFibFwiLFwiYWJtXCIsXCJhYm5cIixcImFib1wiLFwiYWJwXCIsXCJhYnFcIixcImFiclwiLFwiYWJzXCIsXCJhYnRcIixcImFidVwiLFwiYWJ2XCIsXCJhYndcIixcImFieFwiLFwiYWJ5XCIsXCJhYnpcIixcImFjYVwiLFwiYWNiXCIsXCJhY2RcIixcImFjZVwiLFwiYWNmXCIsXCJhY2hcIixcImFjaVwiLFwiYWNrXCIsXCJhY2xcIixcImFjbVwiLFwiYWNuXCIsXCJhY3BcIixcImFjcVwiLFwiYWNyXCIsXCJhY3NcIixcImFjdFwiLFwiYWN1XCIsXCJhY3ZcIixcImFjd1wiLFwiYWN4XCIsXCJhY3lcIixcImFjelwiLFwiYWRhXCIsXCJhZGJcIixcImFkZFwiLFwiYWRlXCIsXCJhZGZcIixcImFkZ1wiLFwiYWRoXCIsXCJhZGlcIixcImFkalwiLFwiYWRsXCIsXCJhZG5cIixcImFkb1wiLFwiYWRwXCIsXCJhZHFcIixcImFkclwiLFwiYWRzXCIsXCJhZHRcIixcImFkdVwiLFwiYWR3XCIsXCJhZHhcIixcImFkeVwiLFwiYWR6XCIsXCJhZWFcIixcImFlYlwiLFwiYWVjXCIsXCJhZWRcIixcImFlZVwiLFwiYWVrXCIsXCJhZWxcIixcImFlbVwiLFwiYWVuXCIsXCJhZXFcIixcImFlclwiLFwiYWVzXCIsXCJhZXVcIixcImFld1wiLFwiYWV5XCIsXCJhZXpcIixcImFmYVwiLFwiYWZiXCIsXCJhZmRcIixcImFmZVwiLFwiYWZnXCIsXCJhZmhcIixcImFmaVwiLFwiYWZrXCIsXCJhZm5cIixcImFmb1wiLFwiYWZwXCIsXCJhZnNcIixcImFmdFwiLFwiYWZ1XCIsXCJhZnpcIixcImFnYVwiLFwiYWdiXCIsXCJhZ2NcIixcImFnZFwiLFwiYWdlXCIsXCJhZ2ZcIixcImFnZ1wiLFwiYWdoXCIsXCJhZ2lcIixcImFnalwiLFwiYWdrXCIsXCJhZ2xcIixcImFnbVwiLFwiYWduXCIsXCJhZ29cIixcImFncFwiLFwiYWdxXCIsXCJhZ3JcIixcImFnc1wiLFwiYWd0XCIsXCJhZ3VcIixcImFndlwiLFwiYWd3XCIsXCJhZ3hcIixcImFneVwiLFwiYWd6XCIsXCJhaGFcIixcImFoYlwiLFwiYWhnXCIsXCJhaGhcIixcImFoaVwiLFwiYWhrXCIsXCJhaGxcIixcImFobVwiLFwiYWhuXCIsXCJhaG9cIixcImFocFwiLFwiYWhyXCIsXCJhaHNcIixcImFodFwiLFwiYWlhXCIsXCJhaWJcIixcImFpY1wiLFwiYWlkXCIsXCJhaWVcIixcImFpZlwiLFwiYWlnXCIsXCJhaWhcIixcImFpaVwiLFwiYWlqXCIsXCJhaWtcIixcImFpbFwiLFwiYWltXCIsXCJhaW5cIixcImFpb1wiLFwiYWlwXCIsXCJhaXFcIixcImFpclwiLFwiYWlzXCIsXCJhaXRcIixcImFpd1wiLFwiYWl4XCIsXCJhaXlcIixcImFqYVwiLFwiYWpnXCIsXCJhamlcIixcImFqblwiLFwiYWpwXCIsXCJhanRcIixcImFqdVwiLFwiYWp3XCIsXCJhanpcIixcImFrYlwiLFwiYWtjXCIsXCJha2RcIixcImFrZVwiLFwiYWtmXCIsXCJha2dcIixcImFraFwiLFwiYWtpXCIsXCJha2pcIixcImFra1wiLFwiYWtsXCIsXCJha21cIixcImFrb1wiLFwiYWtwXCIsXCJha3FcIixcImFrclwiLFwiYWtzXCIsXCJha3RcIixcImFrdVwiLFwiYWt2XCIsXCJha3dcIixcImFreFwiLFwiYWt5XCIsXCJha3pcIixcImFsYVwiLFwiYWxjXCIsXCJhbGRcIixcImFsZVwiLFwiYWxmXCIsXCJhbGdcIixcImFsaFwiLFwiYWxpXCIsXCJhbGpcIixcImFsa1wiLFwiYWxsXCIsXCJhbG1cIixcImFsblwiLFwiYWxvXCIsXCJhbHBcIixcImFscVwiLFwiYWxyXCIsXCJhbHNcIixcImFsdFwiLFwiYWx1XCIsXCJhbHZcIixcImFsd1wiLFwiYWx4XCIsXCJhbHlcIixcImFselwiLFwiYW1hXCIsXCJhbWJcIixcImFtY1wiLFwiYW1lXCIsXCJhbWZcIixcImFtZ1wiLFwiYW1pXCIsXCJhbWpcIixcImFta1wiLFwiYW1sXCIsXCJhbW1cIixcImFtblwiLFwiYW1vXCIsXCJhbXBcIixcImFtcVwiLFwiYW1yXCIsXCJhbXNcIixcImFtdFwiLFwiYW11XCIsXCJhbXZcIixcImFtd1wiLFwiYW14XCIsXCJhbXlcIixcImFtelwiLFwiYW5hXCIsXCJhbmJcIixcImFuY1wiLFwiYW5kXCIsXCJhbmVcIixcImFuZlwiLFwiYW5nXCIsXCJhbmhcIixcImFuaVwiLFwiYW5qXCIsXCJhbmtcIixcImFubFwiLFwiYW5tXCIsXCJhbm5cIixcImFub1wiLFwiYW5wXCIsXCJhbnFcIixcImFuclwiLFwiYW5zXCIsXCJhbnRcIixcImFudVwiLFwiYW52XCIsXCJhbndcIixcImFueFwiLFwiYW55XCIsXCJhbnpcIixcImFvYVwiLFwiYW9iXCIsXCJhb2NcIixcImFvZFwiLFwiYW9lXCIsXCJhb2ZcIixcImFvZ1wiLFwiYW9oXCIsXCJhb2lcIixcImFvalwiLFwiYW9rXCIsXCJhb2xcIixcImFvbVwiLFwiYW9uXCIsXCJhb3JcIixcImFvc1wiLFwiYW90XCIsXCJhb3VcIixcImFveFwiLFwiYW96XCIsXCJhcGFcIixcImFwYlwiLFwiYXBjXCIsXCJhcGRcIixcImFwZVwiLFwiYXBmXCIsXCJhcGdcIixcImFwaFwiLFwiYXBpXCIsXCJhcGpcIixcImFwa1wiLFwiYXBsXCIsXCJhcG1cIixcImFwblwiLFwiYXBvXCIsXCJhcHBcIixcImFwcVwiLFwiYXByXCIsXCJhcHNcIixcImFwdFwiLFwiYXB1XCIsXCJhcHZcIixcImFwd1wiLFwiYXB4XCIsXCJhcHlcIixcImFwelwiLFwiYXFhXCIsXCJhcWNcIixcImFxZFwiLFwiYXFnXCIsXCJhcWtcIixcImFxbFwiLFwiYXFtXCIsXCJhcW5cIixcImFxcFwiLFwiYXFyXCIsXCJhcXRcIixcImFxelwiLFwiYXJiXCIsXCJhcmNcIixcImFyZFwiLFwiYXJlXCIsXCJhcmhcIixcImFyaVwiLFwiYXJqXCIsXCJhcmtcIixcImFybFwiLFwiYXJuXCIsXCJhcm9cIixcImFycFwiLFwiYXJxXCIsXCJhcnJcIixcImFyc1wiLFwiYXJ0XCIsXCJhcnVcIixcImFydlwiLFwiYXJ3XCIsXCJhcnhcIixcImFyeVwiLFwiYXJ6XCIsXCJhc2FcIixcImFzYlwiLFwiYXNjXCIsXCJhc2RcIixcImFzZVwiLFwiYXNmXCIsXCJhc2dcIixcImFzaFwiLFwiYXNpXCIsXCJhc2pcIixcImFza1wiLFwiYXNsXCIsXCJhc25cIixcImFzb1wiLFwiYXNwXCIsXCJhc3FcIixcImFzclwiLFwiYXNzXCIsXCJhc3RcIixcImFzdVwiLFwiYXN2XCIsXCJhc3dcIixcImFzeFwiLFwiYXN5XCIsXCJhc3pcIixcImF0YVwiLFwiYXRiXCIsXCJhdGNcIixcImF0ZFwiLFwiYXRlXCIsXCJhdGdcIixcImF0aFwiLFwiYXRpXCIsXCJhdGpcIixcImF0a1wiLFwiYXRsXCIsXCJhdG1cIixcImF0blwiLFwiYXRvXCIsXCJhdHBcIixcImF0cVwiLFwiYXRyXCIsXCJhdHNcIixcImF0dFwiLFwiYXR1XCIsXCJhdHZcIixcImF0d1wiLFwiYXR4XCIsXCJhdHlcIixcImF0elwiLFwiYXVhXCIsXCJhdWJcIixcImF1Y1wiLFwiYXVkXCIsXCJhdWVcIixcImF1ZlwiLFwiYXVnXCIsXCJhdWhcIixcImF1aVwiLFwiYXVqXCIsXCJhdWtcIixcImF1bFwiLFwiYXVtXCIsXCJhdW5cIixcImF1b1wiLFwiYXVwXCIsXCJhdXFcIixcImF1clwiLFwiYXVzXCIsXCJhdXRcIixcImF1dVwiLFwiYXV3XCIsXCJhdXhcIixcImF1eVwiLFwiYXV6XCIsXCJhdmJcIixcImF2ZFwiLFwiYXZpXCIsXCJhdmtcIixcImF2bFwiLFwiYXZtXCIsXCJhdm5cIixcImF2b1wiLFwiYXZzXCIsXCJhdnRcIixcImF2dVwiLFwiYXZ2XCIsXCJhd2FcIixcImF3YlwiLFwiYXdjXCIsXCJhd2RcIixcImF3ZVwiLFwiYXdnXCIsXCJhd2hcIixcImF3aVwiLFwiYXdrXCIsXCJhd21cIixcImF3blwiLFwiYXdvXCIsXCJhd3JcIixcImF3c1wiLFwiYXd0XCIsXCJhd3VcIixcImF3dlwiLFwiYXd3XCIsXCJhd3hcIixcImF3eVwiLFwiYXhiXCIsXCJheGVcIixcImF4Z1wiLFwiYXhrXCIsXCJheGxcIixcImF4bVwiLFwiYXh4XCIsXCJheWFcIixcImF5YlwiLFwiYXljXCIsXCJheWRcIixcImF5ZVwiLFwiYXlnXCIsXCJheWhcIixcImF5aVwiLFwiYXlrXCIsXCJheWxcIixcImF5blwiLFwiYXlvXCIsXCJheXBcIixcImF5cVwiLFwiYXlyXCIsXCJheXNcIixcImF5dFwiLFwiYXl1XCIsXCJheXhcIixcImF5eVwiLFwiYXl6XCIsXCJhemFcIixcImF6YlwiLFwiYXpjXCIsXCJhemRcIixcImF6Z1wiLFwiYXpqXCIsXCJhem1cIixcImF6blwiLFwiYXpvXCIsXCJhenRcIixcImF6elwiXVxuLFsgXCJiYVwiLFwiYmVcIixcImJnXCIsXCJiaFwiLFwiYmlcIixcImJtXCIsXCJiblwiLFwiYm9cIixcImJyXCIsXCJic1wiLFwiYmFhXCIsXCJiYWJcIixcImJhY1wiLFwiYmFkXCIsXCJiYWVcIixcImJhZlwiLFwiYmFnXCIsXCJiYWhcIixcImJhaVwiLFwiYmFqXCIsXCJiYWxcIixcImJhblwiLFwiYmFvXCIsXCJiYXBcIixcImJhclwiLFwiYmFzXCIsXCJiYXRcIixcImJhdVwiLFwiYmF2XCIsXCJiYXdcIixcImJheFwiLFwiYmF5XCIsXCJiYXpcIixcImJiYVwiLFwiYmJiXCIsXCJiYmNcIixcImJiZFwiLFwiYmJlXCIsXCJiYmZcIixcImJiZ1wiLFwiYmJoXCIsXCJiYmlcIixcImJialwiLFwiYmJrXCIsXCJiYmxcIixcImJibVwiLFwiYmJuXCIsXCJiYm9cIixcImJicFwiLFwiYmJxXCIsXCJiYnJcIixcImJic1wiLFwiYmJ0XCIsXCJiYnVcIixcImJidlwiLFwiYmJ3XCIsXCJiYnhcIixcImJieVwiLFwiYmJ6XCIsXCJiY2FcIixcImJjYlwiLFwiYmNjXCIsXCJiY2RcIixcImJjZVwiLFwiYmNmXCIsXCJiY2dcIixcImJjaFwiLFwiYmNpXCIsXCJiY2pcIixcImJja1wiLFwiYmNsXCIsXCJiY21cIixcImJjblwiLFwiYmNvXCIsXCJiY3BcIixcImJjcVwiLFwiYmNyXCIsXCJiY3NcIixcImJjdFwiLFwiYmN1XCIsXCJiY3ZcIixcImJjd1wiLFwiYmN5XCIsXCJiY3pcIixcImJkYVwiLFwiYmRiXCIsXCJiZGNcIixcImJkZFwiLFwiYmRlXCIsXCJiZGZcIixcImJkZ1wiLFwiYmRoXCIsXCJiZGlcIixcImJkalwiLFwiYmRrXCIsXCJiZGxcIixcImJkbVwiLFwiYmRuXCIsXCJiZG9cIixcImJkcFwiLFwiYmRxXCIsXCJiZHJcIixcImJkc1wiLFwiYmR0XCIsXCJiZHVcIixcImJkdlwiLFwiYmR3XCIsXCJiZHhcIixcImJkeVwiLFwiYmR6XCIsXCJiZWFcIixcImJlYlwiLFwiYmVjXCIsXCJiZWRcIixcImJlZVwiLFwiYmVmXCIsXCJiZWdcIixcImJlaFwiLFwiYmVpXCIsXCJiZWpcIixcImJla1wiLFwiYmVtXCIsXCJiZW9cIixcImJlcFwiLFwiYmVxXCIsXCJiZXJcIixcImJlc1wiLFwiYmV0XCIsXCJiZXVcIixcImJldlwiLFwiYmV3XCIsXCJiZXhcIixcImJleVwiLFwiYmV6XCIsXCJiZmFcIixcImJmYlwiLFwiYmZjXCIsXCJiZmRcIixcImJmZVwiLFwiYmZmXCIsXCJiZmdcIixcImJmaFwiLFwiYmZpXCIsXCJiZmpcIixcImJma1wiLFwiYmZsXCIsXCJiZm1cIixcImJmblwiLFwiYmZvXCIsXCJiZnBcIixcImJmcVwiLFwiYmZyXCIsXCJiZnNcIixcImJmdFwiLFwiYmZ1XCIsXCJiZndcIixcImJmeFwiLFwiYmZ5XCIsXCJiZnpcIixcImJnYVwiLFwiYmdiXCIsXCJiZ2NcIixcImJnZFwiLFwiYmdlXCIsXCJiZ2ZcIixcImJnZ1wiLFwiYmdpXCIsXCJiZ2pcIixcImJna1wiLFwiYmdsXCIsXCJiZ21cIixcImJnblwiLFwiYmdvXCIsXCJiZ3BcIixcImJncVwiLFwiYmdyXCIsXCJiZ3NcIixcImJndFwiLFwiYmd1XCIsXCJiZ3ZcIixcImJnd1wiLFwiYmd4XCIsXCJiZ3lcIixcImJnelwiLFwiYmhhXCIsXCJiaGJcIixcImJoY1wiLFwiYmhkXCIsXCJiaGVcIixcImJoZlwiLFwiYmhnXCIsXCJiaGhcIixcImJoaVwiLFwiYmhqXCIsXCJiaGtcIixcImJobFwiLFwiYmhtXCIsXCJiaG5cIixcImJob1wiLFwiYmhwXCIsXCJiaHFcIixcImJoclwiLFwiYmhzXCIsXCJiaHRcIixcImJodVwiLFwiYmh2XCIsXCJiaHdcIixcImJoeFwiLFwiYmh5XCIsXCJiaHpcIixcImJpYVwiLFwiYmliXCIsXCJiaWNcIixcImJpZFwiLFwiYmllXCIsXCJiaWZcIixcImJpZ1wiLFwiYmlqXCIsXCJiaWtcIixcImJpbFwiLFwiYmltXCIsXCJiaW5cIixcImJpb1wiLFwiYmlwXCIsXCJiaXFcIixcImJpclwiLFwiYml0XCIsXCJiaXVcIixcImJpdlwiLFwiYml3XCIsXCJiaXhcIixcImJpeVwiLFwiYml6XCIsXCJiamFcIixcImJqYlwiLFwiYmpjXCIsXCJiamRcIixcImJqZVwiLFwiYmpmXCIsXCJiamdcIixcImJqaFwiLFwiYmppXCIsXCJiampcIixcImJqa1wiLFwiYmpsXCIsXCJiam1cIixcImJqblwiLFwiYmpvXCIsXCJianBcIixcImJqcVwiLFwiYmpyXCIsXCJianNcIixcImJqdFwiLFwiYmp1XCIsXCJianZcIixcImJqd1wiLFwiYmp4XCIsXCJianlcIixcImJqelwiLFwiYmthXCIsXCJia2JcIixcImJrY1wiLFwiYmtkXCIsXCJia2ZcIixcImJrZ1wiLFwiYmtoXCIsXCJia2lcIixcImJralwiLFwiYmtrXCIsXCJia2xcIixcImJrbVwiLFwiYmtuXCIsXCJia29cIixcImJrcFwiLFwiYmtxXCIsXCJia3JcIixcImJrc1wiLFwiYmt0XCIsXCJia3VcIixcImJrdlwiLFwiYmt3XCIsXCJia3hcIixcImJreVwiLFwiYmt6XCIsXCJibGFcIixcImJsYlwiLFwiYmxjXCIsXCJibGRcIixcImJsZVwiLFwiYmxmXCIsXCJibGdcIixcImJsaFwiLFwiYmxpXCIsXCJibGpcIixcImJsa1wiLFwiYmxsXCIsXCJibG1cIixcImJsblwiLFwiYmxvXCIsXCJibHBcIixcImJscVwiLFwiYmxyXCIsXCJibHNcIixcImJsdFwiLFwiYmx2XCIsXCJibHdcIixcImJseFwiLFwiYmx5XCIsXCJibHpcIixcImJtYVwiLFwiYm1iXCIsXCJibWNcIixcImJtZFwiLFwiYm1lXCIsXCJibWZcIixcImJtZ1wiLFwiYm1oXCIsXCJibWlcIixcImJtalwiLFwiYm1rXCIsXCJibWxcIixcImJtbVwiLFwiYm1uXCIsXCJibW9cIixcImJtcFwiLFwiYm1xXCIsXCJibXJcIixcImJtc1wiLFwiYm10XCIsXCJibXVcIixcImJtdlwiLFwiYm13XCIsXCJibXhcIixcImJteVwiLFwiYm16XCIsXCJibmFcIixcImJuYlwiLFwiYm5jXCIsXCJibmRcIixcImJuZVwiLFwiYm5mXCIsXCJibmdcIixcImJuaVwiLFwiYm5qXCIsXCJibmtcIixcImJubFwiLFwiYm5tXCIsXCJibm5cIixcImJub1wiLFwiYm5wXCIsXCJibnFcIixcImJuclwiLFwiYm5zXCIsXCJibnRcIixcImJudVwiLFwiYm52XCIsXCJibndcIixcImJueFwiLFwiYm55XCIsXCJibnpcIixcImJvYVwiLFwiYm9iXCIsXCJib2VcIixcImJvZlwiLFwiYm9nXCIsXCJib2hcIixcImJvaVwiLFwiYm9qXCIsXCJib2tcIixcImJvbFwiLFwiYm9tXCIsXCJib25cIixcImJvb1wiLFwiYm9wXCIsXCJib3FcIixcImJvclwiLFwiYm90XCIsXCJib3VcIixcImJvdlwiLFwiYm93XCIsXCJib3hcIixcImJveVwiLFwiYm96XCIsXCJicGFcIixcImJwYlwiLFwiYnBkXCIsXCJicGVcIixcImJwZ1wiLFwiYnBoXCIsXCJicGlcIixcImJwalwiLFwiYnBrXCIsXCJicGxcIixcImJwbVwiLFwiYnBuXCIsXCJicG9cIixcImJwcFwiLFwiYnBxXCIsXCJicHJcIixcImJwc1wiLFwiYnB0XCIsXCJicHVcIixcImJwdlwiLFwiYnB3XCIsXCJicHhcIixcImJweVwiLFwiYnB6XCIsXCJicWFcIixcImJxYlwiLFwiYnFjXCIsXCJicWRcIixcImJxZlwiLFwiYnFnXCIsXCJicWhcIixcImJxaVwiLFwiYnFqXCIsXCJicWtcIixcImJxbFwiLFwiYnFtXCIsXCJicW5cIixcImJxb1wiLFwiYnFwXCIsXCJicXFcIixcImJxclwiLFwiYnFzXCIsXCJicXRcIixcImJxdVwiLFwiYnF2XCIsXCJicXdcIixcImJxeFwiLFwiYnF5XCIsXCJicXpcIixcImJyYVwiLFwiYnJiXCIsXCJicmNcIixcImJyZFwiLFwiYnJmXCIsXCJicmdcIixcImJyaFwiLFwiYnJpXCIsXCJicmpcIixcImJya1wiLFwiYnJsXCIsXCJicm1cIixcImJyblwiLFwiYnJvXCIsXCJicnBcIixcImJycVwiLFwiYnJyXCIsXCJicnNcIixcImJydFwiLFwiYnJ1XCIsXCJicnZcIixcImJyd1wiLFwiYnJ4XCIsXCJicnlcIixcImJyelwiLFwiYnNhXCIsXCJic2JcIixcImJzY1wiLFwiYnNlXCIsXCJic2ZcIixcImJzZ1wiLFwiYnNoXCIsXCJic2lcIixcImJzalwiLFwiYnNrXCIsXCJic2xcIixcImJzbVwiLFwiYnNuXCIsXCJic29cIixcImJzcFwiLFwiYnNxXCIsXCJic3JcIixcImJzc1wiLFwiYnN0XCIsXCJic3VcIixcImJzdlwiLFwiYnN3XCIsXCJic3hcIixcImJzeVwiLFwiYnRhXCIsXCJidGJcIixcImJ0Y1wiLFwiYnRkXCIsXCJidGVcIixcImJ0ZlwiLFwiYnRnXCIsXCJidGhcIixcImJ0aVwiLFwiYnRqXCIsXCJidGtcIixcImJ0bFwiLFwiYnRtXCIsXCJidG5cIixcImJ0b1wiLFwiYnRwXCIsXCJidHFcIixcImJ0clwiLFwiYnRzXCIsXCJidHRcIixcImJ0dVwiLFwiYnR2XCIsXCJidHdcIixcImJ0eFwiLFwiYnR5XCIsXCJidHpcIixcImJ1YVwiLFwiYnViXCIsXCJidWNcIixcImJ1ZFwiLFwiYnVlXCIsXCJidWZcIixcImJ1Z1wiLFwiYnVoXCIsXCJidWlcIixcImJ1alwiLFwiYnVrXCIsXCJidW1cIixcImJ1blwiLFwiYnVvXCIsXCJidXBcIixcImJ1cVwiLFwiYnVzXCIsXCJidXRcIixcImJ1dVwiLFwiYnV2XCIsXCJidXdcIixcImJ1eFwiLFwiYnV5XCIsXCJidXpcIixcImJ2YVwiLFwiYnZiXCIsXCJidmNcIixcImJ2ZFwiLFwiYnZlXCIsXCJidmZcIixcImJ2Z1wiLFwiYnZoXCIsXCJidmlcIixcImJ2alwiLFwiYnZrXCIsXCJidmxcIixcImJ2bVwiLFwiYnZuXCIsXCJidm9cIixcImJ2cFwiLFwiYnZxXCIsXCJidnJcIixcImJ2dFwiLFwiYnZ1XCIsXCJidnZcIixcImJ2d1wiLFwiYnZ4XCIsXCJidnlcIixcImJ2elwiLFwiYndhXCIsXCJid2JcIixcImJ3Y1wiLFwiYndkXCIsXCJid2VcIixcImJ3ZlwiLFwiYndnXCIsXCJid2hcIixcImJ3aVwiLFwiYndqXCIsXCJid2tcIixcImJ3bFwiLFwiYndtXCIsXCJid25cIixcImJ3b1wiLFwiYndwXCIsXCJid3FcIixcImJ3clwiLFwiYndzXCIsXCJid3RcIixcImJ3dVwiLFwiYnd3XCIsXCJid3hcIixcImJ3eVwiLFwiYnd6XCIsXCJieGFcIixcImJ4YlwiLFwiYnhjXCIsXCJieGRcIixcImJ4ZVwiLFwiYnhmXCIsXCJieGdcIixcImJ4aFwiLFwiYnhpXCIsXCJieGpcIixcImJ4a1wiLFwiYnhsXCIsXCJieG1cIixcImJ4blwiLFwiYnhvXCIsXCJieHBcIixcImJ4cVwiLFwiYnhyXCIsXCJieHNcIixcImJ4dVwiLFwiYnh2XCIsXCJieHdcIixcImJ4eFwiLFwiYnh6XCIsXCJieWFcIixcImJ5YlwiLFwiYnljXCIsXCJieWRcIixcImJ5ZVwiLFwiYnlmXCIsXCJieWdcIixcImJ5aFwiLFwiYnlpXCIsXCJieWpcIixcImJ5a1wiLFwiYnlsXCIsXCJieW1cIixcImJ5blwiLFwiYnlvXCIsXCJieXBcIixcImJ5cVwiLFwiYnlyXCIsXCJieXNcIixcImJ5dFwiLFwiYnl2XCIsXCJieXdcIixcImJ5eFwiLFwiYnl5XCIsXCJieXpcIixcImJ6YVwiLFwiYnpiXCIsXCJiemNcIixcImJ6ZFwiLFwiYnplXCIsXCJiemZcIixcImJ6Z1wiLFwiYnpoXCIsXCJiemlcIixcImJ6alwiLFwiYnprXCIsXCJiemxcIixcImJ6bVwiLFwiYnpuXCIsXCJiem9cIixcImJ6cFwiLFwiYnpxXCIsXCJienJcIixcImJ6c1wiLFwiYnp0XCIsXCJienVcIixcImJ6dlwiLFwiYnp3XCIsXCJienhcIixcImJ6eVwiLFwiYnp6XCJdXG4sWyBcImNhXCIsXCJjZVwiLFwiY2hcIixcImNvXCIsXCJjclwiLFwiY3NcIixcImN1XCIsXCJjdlwiLFwiY3lcIixcImNhYVwiLFwiY2FiXCIsXCJjYWNcIixcImNhZFwiLFwiY2FlXCIsXCJjYWZcIixcImNhZ1wiLFwiY2FoXCIsXCJjYWlcIixcImNhalwiLFwiY2FrXCIsXCJjYWxcIixcImNhbVwiLFwiY2FuXCIsXCJjYW9cIixcImNhcFwiLFwiY2FxXCIsXCJjYXJcIixcImNhc1wiLFwiY2F1XCIsXCJjYXZcIixcImNhd1wiLFwiY2F4XCIsXCJjYXlcIixcImNhelwiLFwiY2JhXCIsXCJjYmJcIixcImNiY1wiLFwiY2JkXCIsXCJjYmVcIixcImNiZ1wiLFwiY2JoXCIsXCJjYmlcIixcImNialwiLFwiY2JrXCIsXCJjYmxcIixcImNiblwiLFwiY2JvXCIsXCJjYnFcIixcImNiclwiLFwiY2JzXCIsXCJjYnRcIixcImNidVwiLFwiY2J2XCIsXCJjYndcIixcImNieVwiLFwiY2NhXCIsXCJjY2NcIixcImNjZFwiLFwiY2NlXCIsXCJjY2dcIixcImNjaFwiLFwiY2NqXCIsXCJjY2xcIixcImNjbVwiLFwiY2NuXCIsXCJjY29cIixcImNjcFwiLFwiY2NxXCIsXCJjY3JcIixcImNjc1wiLFwiY2RhXCIsXCJjZGNcIixcImNkZFwiLFwiY2RlXCIsXCJjZGZcIixcImNkZ1wiLFwiY2RoXCIsXCJjZGlcIixcImNkalwiLFwiY2RtXCIsXCJjZG5cIixcImNkb1wiLFwiY2RyXCIsXCJjZHNcIixcImNkeVwiLFwiY2R6XCIsXCJjZWFcIixcImNlYlwiLFwiY2VnXCIsXCJjZWtcIixcImNlbFwiLFwiY2VuXCIsXCJjZXRcIixcImNleVwiLFwiY2ZhXCIsXCJjZmRcIixcImNmZ1wiLFwiY2ZtXCIsXCJjZ2FcIixcImNnY1wiLFwiY2dnXCIsXCJjZ2tcIixcImNoYlwiLFwiY2hjXCIsXCJjaGRcIixcImNoZlwiLFwiY2hnXCIsXCJjaGhcIixcImNoalwiLFwiY2hrXCIsXCJjaGxcIixcImNobVwiLFwiY2huXCIsXCJjaG9cIixcImNocFwiLFwiY2hxXCIsXCJjaHJcIixcImNodFwiLFwiY2h3XCIsXCJjaHhcIixcImNoeVwiLFwiY2h6XCIsXCJjaWFcIixcImNpYlwiLFwiY2ljXCIsXCJjaWRcIixcImNpZVwiLFwiY2loXCIsXCJjaWtcIixcImNpbVwiLFwiY2luXCIsXCJjaXBcIixcImNpclwiLFwiY2l3XCIsXCJjaXlcIixcImNqYVwiLFwiY2plXCIsXCJjamhcIixcImNqaVwiLFwiY2prXCIsXCJjam1cIixcImNqblwiLFwiY2pvXCIsXCJjanBcIixcImNqclwiLFwiY2pzXCIsXCJjanZcIixcImNqeVwiLFwiY2thXCIsXCJja2JcIixcImNraFwiLFwiY2tsXCIsXCJja21cIixcImNrblwiLFwiY2tvXCIsXCJja3FcIixcImNrclwiLFwiY2tzXCIsXCJja3RcIixcImNrdVwiLFwiY2t2XCIsXCJja3hcIixcImNreVwiLFwiY2t6XCIsXCJjbGFcIixcImNsY1wiLFwiY2xkXCIsXCJjbGVcIixcImNsaFwiLFwiY2xpXCIsXCJjbGpcIixcImNsa1wiLFwiY2xsXCIsXCJjbG1cIixcImNsb1wiLFwiY2x0XCIsXCJjbHVcIixcImNsd1wiLFwiY2x5XCIsXCJjbWFcIixcImNtY1wiLFwiY21lXCIsXCJjbWdcIixcImNtaVwiLFwiY21rXCIsXCJjbWxcIixcImNtbVwiLFwiY21uXCIsXCJjbW9cIixcImNtclwiLFwiY21zXCIsXCJjbXRcIixcImNuYVwiLFwiY25iXCIsXCJjbmNcIixcImNuZ1wiLFwiY25oXCIsXCJjbmlcIixcImNua1wiLFwiY25sXCIsXCJjbm9cIixcImNucFwiLFwiY25yXCIsXCJjbnNcIixcImNudFwiLFwiY251XCIsXCJjbndcIixcImNueFwiLFwiY29hXCIsXCJjb2JcIixcImNvY1wiLFwiY29kXCIsXCJjb2VcIixcImNvZlwiLFwiY29nXCIsXCJjb2hcIixcImNvalwiLFwiY29rXCIsXCJjb2xcIixcImNvbVwiLFwiY29uXCIsXCJjb29cIixcImNvcFwiLFwiY29xXCIsXCJjb3RcIixcImNvdVwiLFwiY292XCIsXCJjb3dcIixcImNveFwiLFwiY295XCIsXCJjb3pcIixcImNwYVwiLFwiY3BiXCIsXCJjcGNcIixcImNwZVwiLFwiY3BmXCIsXCJjcGdcIixcImNwaVwiLFwiY3BuXCIsXCJjcG9cIixcImNwcFwiLFwiY3BzXCIsXCJjcHVcIixcImNweFwiLFwiY3B5XCIsXCJjcWRcIixcImNxdVwiLFwiY3JhXCIsXCJjcmJcIixcImNyY1wiLFwiY3JkXCIsXCJjcmZcIixcImNyZ1wiLFwiY3JoXCIsXCJjcmlcIixcImNyalwiLFwiY3JrXCIsXCJjcmxcIixcImNybVwiLFwiY3JuXCIsXCJjcm9cIixcImNycFwiLFwiY3JxXCIsXCJjcnJcIixcImNyc1wiLFwiY3J0XCIsXCJjcnZcIixcImNyd1wiLFwiY3J4XCIsXCJjcnlcIixcImNyelwiLFwiY3NhXCIsXCJjc2JcIixcImNzY1wiLFwiY3NkXCIsXCJjc2VcIixcImNzZlwiLFwiY3NnXCIsXCJjc2hcIixcImNzaVwiLFwiY3NqXCIsXCJjc2tcIixcImNzbFwiLFwiY3NtXCIsXCJjc25cIixcImNzb1wiLFwiY3NwXCIsXCJjc3FcIixcImNzclwiLFwiY3NzXCIsXCJjc3RcIixcImNzdVwiLFwiY3N2XCIsXCJjc3dcIixcImNzeFwiLFwiY3N5XCIsXCJjc3pcIixcImN0YVwiLFwiY3RjXCIsXCJjdGRcIixcImN0ZVwiLFwiY3RnXCIsXCJjdGhcIixcImN0bFwiLFwiY3RtXCIsXCJjdG5cIixcImN0b1wiLFwiY3RwXCIsXCJjdHNcIixcImN0dFwiLFwiY3R1XCIsXCJjdHlcIixcImN0elwiLFwiY3VhXCIsXCJjdWJcIixcImN1Y1wiLFwiY3VnXCIsXCJjdWhcIixcImN1aVwiLFwiY3VqXCIsXCJjdWtcIixcImN1bFwiLFwiY3VtXCIsXCJjdW9cIixcImN1cFwiLFwiY3VxXCIsXCJjdXJcIixcImN1c1wiLFwiY3V0XCIsXCJjdXVcIixcImN1dlwiLFwiY3V3XCIsXCJjdXhcIixcImN1eVwiLFwiY3ZnXCIsXCJjdm5cIixcImN3YVwiLFwiY3diXCIsXCJjd2RcIixcImN3ZVwiLFwiY3dnXCIsXCJjd3RcIixcImN5YVwiLFwiY3liXCIsXCJjeW9cIixcImN6aFwiLFwiY3prXCIsXCJjem5cIixcImN6b1wiLFwiY3p0XCJdXG4sWyBcImRhXCIsXCJkZVwiLFwiZHZcIixcImR6XCIsXCJkYWFcIixcImRhY1wiLFwiZGFkXCIsXCJkYWVcIixcImRhZlwiLFwiZGFnXCIsXCJkYWhcIixcImRhaVwiLFwiZGFqXCIsXCJkYWtcIixcImRhbFwiLFwiZGFtXCIsXCJkYW9cIixcImRhcFwiLFwiZGFxXCIsXCJkYXJcIixcImRhc1wiLFwiZGF1XCIsXCJkYXZcIixcImRhd1wiLFwiZGF4XCIsXCJkYXlcIixcImRhelwiLFwiZGJhXCIsXCJkYmJcIixcImRiZFwiLFwiZGJlXCIsXCJkYmZcIixcImRiZ1wiLFwiZGJpXCIsXCJkYmpcIixcImRibFwiLFwiZGJtXCIsXCJkYm5cIixcImRib1wiLFwiZGJwXCIsXCJkYnFcIixcImRiclwiLFwiZGJ0XCIsXCJkYnVcIixcImRidlwiLFwiZGJ3XCIsXCJkYnlcIixcImRjY1wiLFwiZGNyXCIsXCJkZGFcIixcImRkZFwiLFwiZGRlXCIsXCJkZGdcIixcImRkaVwiLFwiZGRqXCIsXCJkZG5cIixcImRkb1wiLFwiZGRyXCIsXCJkZHNcIixcImRkd1wiLFwiZGVjXCIsXCJkZWRcIixcImRlZVwiLFwiZGVmXCIsXCJkZWdcIixcImRlaFwiLFwiZGVpXCIsXCJkZWtcIixcImRlbFwiLFwiZGVtXCIsXCJkZW5cIixcImRlcFwiLFwiZGVxXCIsXCJkZXJcIixcImRlc1wiLFwiZGV2XCIsXCJkZXpcIixcImRnYVwiLFwiZGdiXCIsXCJkZ2NcIixcImRnZFwiLFwiZGdlXCIsXCJkZ2dcIixcImRnaFwiLFwiZGdpXCIsXCJkZ2tcIixcImRnbFwiLFwiZGduXCIsXCJkZ29cIixcImRnclwiLFwiZGdzXCIsXCJkZ3RcIixcImRndVwiLFwiZGd3XCIsXCJkZ3hcIixcImRnelwiLFwiZGhhXCIsXCJkaGRcIixcImRoZ1wiLFwiZGhpXCIsXCJkaGxcIixcImRobVwiLFwiZGhuXCIsXCJkaG9cIixcImRoclwiLFwiZGhzXCIsXCJkaHVcIixcImRodlwiLFwiZGh3XCIsXCJkaHhcIixcImRpYVwiLFwiZGliXCIsXCJkaWNcIixcImRpZFwiLFwiZGlmXCIsXCJkaWdcIixcImRpaFwiLFwiZGlpXCIsXCJkaWpcIixcImRpa1wiLFwiZGlsXCIsXCJkaW1cIixcImRpblwiLFwiZGlvXCIsXCJkaXBcIixcImRpcVwiLFwiZGlyXCIsXCJkaXNcIixcImRpdFwiLFwiZGl1XCIsXCJkaXdcIixcImRpeFwiLFwiZGl5XCIsXCJkaXpcIixcImRqYVwiLFwiZGpiXCIsXCJkamNcIixcImRqZFwiLFwiZGplXCIsXCJkamZcIixcImRqaVwiLFwiZGpqXCIsXCJkamtcIixcImRqbFwiLFwiZGptXCIsXCJkam5cIixcImRqb1wiLFwiZGpyXCIsXCJkanVcIixcImRqd1wiLFwiZGthXCIsXCJka2dcIixcImRra1wiLFwiZGtsXCIsXCJka3JcIixcImRrc1wiLFwiZGt4XCIsXCJkbGdcIixcImRsa1wiLFwiZGxtXCIsXCJkbG5cIixcImRtYVwiLFwiZG1iXCIsXCJkbWNcIixcImRtZFwiLFwiZG1lXCIsXCJkbWZcIixcImRtZ1wiLFwiZG1rXCIsXCJkbWxcIixcImRtbVwiLFwiZG1uXCIsXCJkbW9cIixcImRtclwiLFwiZG1zXCIsXCJkbXVcIixcImRtdlwiLFwiZG13XCIsXCJkbXhcIixcImRteVwiLFwiZG5hXCIsXCJkbmRcIixcImRuZVwiLFwiZG5nXCIsXCJkbmlcIixcImRualwiLFwiZG5rXCIsXCJkbm5cIixcImRub1wiLFwiZG5yXCIsXCJkbnRcIixcImRudVwiLFwiZG52XCIsXCJkbndcIixcImRueVwiLFwiZG9hXCIsXCJkb2JcIixcImRvY1wiLFwiZG9lXCIsXCJkb2ZcIixcImRvaFwiLFwiZG9pXCIsXCJkb2tcIixcImRvbFwiLFwiZG9uXCIsXCJkb29cIixcImRvcFwiLFwiZG9xXCIsXCJkb3JcIixcImRvc1wiLFwiZG90XCIsXCJkb3ZcIixcImRvd1wiLFwiZG94XCIsXCJkb3lcIixcImRvelwiLFwiZHBwXCIsXCJkcmFcIixcImRyYlwiLFwiZHJjXCIsXCJkcmRcIixcImRyZVwiLFwiZHJnXCIsXCJkcmhcIixcImRyaVwiLFwiZHJsXCIsXCJkcm5cIixcImRyb1wiLFwiZHJxXCIsXCJkcnJcIixcImRyc1wiLFwiZHJ0XCIsXCJkcnVcIixcImRyd1wiLFwiZHJ5XCIsXCJkc2JcIixcImRzZVwiLFwiZHNoXCIsXCJkc2lcIixcImRzbFwiLFwiZHNuXCIsXCJkc29cIixcImRzcVwiLFwiZHRhXCIsXCJkdGJcIixcImR0ZFwiLFwiZHRoXCIsXCJkdGlcIixcImR0a1wiLFwiZHRtXCIsXCJkdG5cIixcImR0b1wiLFwiZHRwXCIsXCJkdHJcIixcImR0c1wiLFwiZHR0XCIsXCJkdHVcIixcImR0eVwiLFwiZHVhXCIsXCJkdWJcIixcImR1Y1wiLFwiZHVkXCIsXCJkdWVcIixcImR1ZlwiLFwiZHVnXCIsXCJkdWhcIixcImR1aVwiLFwiZHVqXCIsXCJkdWtcIixcImR1bFwiLFwiZHVtXCIsXCJkdW5cIixcImR1b1wiLFwiZHVwXCIsXCJkdXFcIixcImR1clwiLFwiZHVzXCIsXCJkdXVcIixcImR1dlwiLFwiZHV3XCIsXCJkdXhcIixcImR1eVwiLFwiZHV6XCIsXCJkdmFcIixcImR3YVwiLFwiZHdrXCIsXCJkd2xcIixcImR3clwiLFwiZHdzXCIsXCJkd3VcIixcImR3d1wiLFwiZHd5XCIsXCJkd3pcIixcImR5YVwiLFwiZHliXCIsXCJkeWRcIixcImR5Z1wiLFwiZHlpXCIsXCJkeW1cIixcImR5blwiLFwiZHlvXCIsXCJkeXVcIixcImR5eVwiLFwiZHphXCIsXCJkemRcIixcImR6ZVwiLFwiZHpnXCIsXCJkemxcIixcImR6blwiXVxuLFsgXCJlZVwiLFwiZWxcIixcImVuXCIsXCJlb1wiLFwiZXNcIixcImV0XCIsXCJldVwiLFwiZWFhXCIsXCJlYmNcIixcImViZ1wiLFwiZWJrXCIsXCJlYm9cIixcImViclwiLFwiZWJ1XCIsXCJlY3JcIixcImVjc1wiLFwiZWN5XCIsXCJlZWVcIixcImVmYVwiLFwiZWZlXCIsXCJlZmlcIixcImVnYVwiLFwiZWdsXCIsXCJlZ29cIixcImVneFwiLFwiZWd5XCIsXCJlaHNcIixcImVodVwiLFwiZWlwXCIsXCJlaXRcIixcImVpdlwiLFwiZWphXCIsXCJla2FcIixcImVrY1wiLFwiZWtlXCIsXCJla2dcIixcImVraVwiLFwiZWtrXCIsXCJla2xcIixcImVrbVwiLFwiZWtvXCIsXCJla3BcIixcImVrclwiLFwiZWt5XCIsXCJlbGVcIixcImVsaFwiLFwiZWxpXCIsXCJlbGtcIixcImVsbVwiLFwiZWxvXCIsXCJlbHBcIixcImVsdVwiLFwiZWx4XCIsXCJlbWFcIixcImVtYlwiLFwiZW1lXCIsXCJlbWdcIixcImVtaVwiLFwiZW1rXCIsXCJlbW1cIixcImVtblwiLFwiZW1vXCIsXCJlbXBcIixcImVtcVwiLFwiZW1zXCIsXCJlbXVcIixcImVtd1wiLFwiZW14XCIsXCJlbXlcIixcImVtelwiLFwiZW5hXCIsXCJlbmJcIixcImVuY1wiLFwiZW5kXCIsXCJlbmZcIixcImVuaFwiLFwiZW5sXCIsXCJlbm1cIixcImVublwiLFwiZW5vXCIsXCJlbnFcIixcImVuclwiLFwiZW51XCIsXCJlbnZcIixcImVud1wiLFwiZW54XCIsXCJlb3RcIixcImVwaVwiLFwiZXJhXCIsXCJlcmdcIixcImVyaFwiLFwiZXJpXCIsXCJlcmtcIixcImVyb1wiLFwiZXJyXCIsXCJlcnNcIixcImVydFwiLFwiZXJ3XCIsXCJlc2VcIixcImVzZ1wiLFwiZXNoXCIsXCJlc2lcIixcImVza1wiLFwiZXNsXCIsXCJlc21cIixcImVzblwiLFwiZXNvXCIsXCJlc3FcIixcImVzc1wiLFwiZXN1XCIsXCJlc3hcIixcImVzeVwiLFwiZXRiXCIsXCJldGNcIixcImV0aFwiLFwiZXRuXCIsXCJldG9cIixcImV0clwiLFwiZXRzXCIsXCJldHRcIixcImV0dVwiLFwiZXR4XCIsXCJldHpcIixcImV1cVwiLFwiZXZlXCIsXCJldmhcIixcImV2blwiLFwiZXdvXCIsXCJleHRcIixcImV5YVwiLFwiZXlvXCIsXCJlemFcIixcImV6ZVwiXVxuLFsgXCJmYVwiLFwiZmZcIixcImZpXCIsXCJmalwiLFwiZm9cIixcImZyXCIsXCJmeVwiLFwiZmFhXCIsXCJmYWJcIixcImZhZFwiLFwiZmFmXCIsXCJmYWdcIixcImZhaFwiLFwiZmFpXCIsXCJmYWpcIixcImZha1wiLFwiZmFsXCIsXCJmYW1cIixcImZhblwiLFwiZmFwXCIsXCJmYXJcIixcImZhdFwiLFwiZmF1XCIsXCJmYXhcIixcImZheVwiLFwiZmF6XCIsXCJmYmxcIixcImZjc1wiLFwiZmVyXCIsXCJmZmlcIixcImZmbVwiLFwiZmdyXCIsXCJmaWFcIixcImZpZVwiLFwiZmlmXCIsXCJmaWxcIixcImZpcFwiLFwiZmlyXCIsXCJmaXRcIixcImZpdVwiLFwiZml3XCIsXCJma2tcIixcImZrdlwiLFwiZmxhXCIsXCJmbGhcIixcImZsaVwiLFwiZmxsXCIsXCJmbG5cIixcImZsclwiLFwiZmx5XCIsXCJmbXBcIixcImZtdVwiLFwiZm5iXCIsXCJmbmdcIixcImZuaVwiLFwiZm9kXCIsXCJmb2lcIixcImZvbVwiLFwiZm9uXCIsXCJmb3JcIixcImZvc1wiLFwiZm94XCIsXCJmcGVcIixcImZxc1wiLFwiZnJjXCIsXCJmcmRcIixcImZya1wiLFwiZnJtXCIsXCJmcm9cIixcImZycFwiLFwiZnJxXCIsXCJmcnJcIixcImZyc1wiLFwiZnJ0XCIsXCJmc2VcIixcImZzbFwiLFwiZnNzXCIsXCJmdWJcIixcImZ1Y1wiLFwiZnVkXCIsXCJmdWVcIixcImZ1ZlwiLFwiZnVoXCIsXCJmdWlcIixcImZ1alwiLFwiZnVtXCIsXCJmdW5cIixcImZ1cVwiLFwiZnVyXCIsXCJmdXRcIixcImZ1dVwiLFwiZnV2XCIsXCJmdXlcIixcImZ2clwiLFwiZndhXCIsXCJmd2VcIl1cbixbIFwiZ2FcIixcImdkXCIsXCJnbFwiLFwiZ25cIixcImd1XCIsXCJndlwiLFwiZ2FhXCIsXCJnYWJcIixcImdhY1wiLFwiZ2FkXCIsXCJnYWVcIixcImdhZlwiLFwiZ2FnXCIsXCJnYWhcIixcImdhaVwiLFwiZ2FqXCIsXCJnYWtcIixcImdhbFwiLFwiZ2FtXCIsXCJnYW5cIixcImdhb1wiLFwiZ2FwXCIsXCJnYXFcIixcImdhclwiLFwiZ2FzXCIsXCJnYXRcIixcImdhdVwiLFwiZ2F2XCIsXCJnYXdcIixcImdheFwiLFwiZ2F5XCIsXCJnYXpcIixcImdiYVwiLFwiZ2JiXCIsXCJnYmNcIixcImdiZFwiLFwiZ2JlXCIsXCJnYmZcIixcImdiZ1wiLFwiZ2JoXCIsXCJnYmlcIixcImdialwiLFwiZ2JrXCIsXCJnYmxcIixcImdibVwiLFwiZ2JuXCIsXCJnYm9cIixcImdicFwiLFwiZ2JxXCIsXCJnYnJcIixcImdic1wiLFwiZ2J1XCIsXCJnYnZcIixcImdid1wiLFwiZ2J4XCIsXCJnYnlcIixcImdielwiLFwiZ2NjXCIsXCJnY2RcIixcImdjZVwiLFwiZ2NmXCIsXCJnY2xcIixcImdjblwiLFwiZ2NyXCIsXCJnY3RcIixcImdkYVwiLFwiZ2RiXCIsXCJnZGNcIixcImdkZFwiLFwiZ2RlXCIsXCJnZGZcIixcImdkZ1wiLFwiZ2RoXCIsXCJnZGlcIixcImdkalwiLFwiZ2RrXCIsXCJnZGxcIixcImdkbVwiLFwiZ2RuXCIsXCJnZG9cIixcImdkcVwiLFwiZ2RyXCIsXCJnZHNcIixcImdkdFwiLFwiZ2R1XCIsXCJnZHhcIixcImdlYVwiLFwiZ2ViXCIsXCJnZWNcIixcImdlZFwiLFwiZ2VmXCIsXCJnZWdcIixcImdlaFwiLFwiZ2VpXCIsXCJnZWpcIixcImdla1wiLFwiZ2VsXCIsXCJnZW1cIixcImdlcVwiLFwiZ2VzXCIsXCJnZXZcIixcImdld1wiLFwiZ2V4XCIsXCJnZXlcIixcImdlelwiLFwiZ2ZrXCIsXCJnZnRcIixcImdmeFwiLFwiZ2dhXCIsXCJnZ2JcIixcImdnZFwiLFwiZ2dlXCIsXCJnZ2dcIixcImdna1wiLFwiZ2dsXCIsXCJnZ25cIixcImdnb1wiLFwiZ2dyXCIsXCJnZ3RcIixcImdndVwiLFwiZ2d3XCIsXCJnaGFcIixcImdoY1wiLFwiZ2hlXCIsXCJnaGhcIixcImdoa1wiLFwiZ2hsXCIsXCJnaG5cIixcImdob1wiLFwiZ2hyXCIsXCJnaHNcIixcImdodFwiLFwiZ2lhXCIsXCJnaWJcIixcImdpY1wiLFwiZ2lkXCIsXCJnaWVcIixcImdpZ1wiLFwiZ2loXCIsXCJnaWlcIixcImdpbFwiLFwiZ2ltXCIsXCJnaW5cIixcImdpb1wiLFwiZ2lwXCIsXCJnaXFcIixcImdpclwiLFwiZ2lzXCIsXCJnaXRcIixcImdpdVwiLFwiZ2l3XCIsXCJnaXhcIixcImdpeVwiLFwiZ2l6XCIsXCJnamlcIixcImdqa1wiLFwiZ2ptXCIsXCJnam5cIixcImdqclwiLFwiZ2p1XCIsXCJna2FcIixcImdrZFwiLFwiZ2tlXCIsXCJna25cIixcImdrb1wiLFwiZ2twXCIsXCJna3VcIixcImdsYlwiLFwiZ2xjXCIsXCJnbGRcIixcImdsaFwiLFwiZ2xpXCIsXCJnbGpcIixcImdsa1wiLFwiZ2xsXCIsXCJnbG9cIixcImdsclwiLFwiZ2x1XCIsXCJnbHdcIixcImdseVwiLFwiZ21hXCIsXCJnbWJcIixcImdtZFwiLFwiZ21lXCIsXCJnbWdcIixcImdtaFwiLFwiZ21sXCIsXCJnbW1cIixcImdtblwiLFwiZ21xXCIsXCJnbXJcIixcImdtdVwiLFwiZ212XCIsXCJnbXdcIixcImdteFwiLFwiZ215XCIsXCJnbXpcIixcImduYVwiLFwiZ25iXCIsXCJnbmNcIixcImduZFwiLFwiZ25lXCIsXCJnbmdcIixcImduaFwiLFwiZ25pXCIsXCJnbmpcIixcImdua1wiLFwiZ25sXCIsXCJnbm1cIixcImdublwiLFwiZ25vXCIsXCJnbnFcIixcImduclwiLFwiZ250XCIsXCJnbnVcIixcImdud1wiLFwiZ256XCIsXCJnb2FcIixcImdvYlwiLFwiZ29jXCIsXCJnb2RcIixcImdvZVwiLFwiZ29mXCIsXCJnb2dcIixcImdvaFwiLFwiZ29pXCIsXCJnb2pcIixcImdva1wiLFwiZ29sXCIsXCJnb21cIixcImdvblwiLFwiZ29vXCIsXCJnb3BcIixcImdvcVwiLFwiZ29yXCIsXCJnb3NcIixcImdvdFwiLFwiZ291XCIsXCJnb3dcIixcImdveFwiLFwiZ295XCIsXCJnb3pcIixcImdwYVwiLFwiZ3BlXCIsXCJncG5cIixcImdxYVwiLFwiZ3FpXCIsXCJncW5cIixcImdxclwiLFwiZ3F1XCIsXCJncmFcIixcImdyYlwiLFwiZ3JjXCIsXCJncmRcIixcImdyZ1wiLFwiZ3JoXCIsXCJncmlcIixcImdyalwiLFwiZ3JrXCIsXCJncm1cIixcImdyb1wiLFwiZ3JxXCIsXCJncnJcIixcImdyc1wiLFwiZ3J0XCIsXCJncnVcIixcImdydlwiLFwiZ3J3XCIsXCJncnhcIixcImdyeVwiLFwiZ3J6XCIsXCJnc2VcIixcImdzZ1wiLFwiZ3NsXCIsXCJnc21cIixcImdzblwiLFwiZ3NvXCIsXCJnc3BcIixcImdzc1wiLFwiZ3N3XCIsXCJndGFcIixcImd0aVwiLFwiZ3R1XCIsXCJndWFcIixcImd1YlwiLFwiZ3VjXCIsXCJndWRcIixcImd1ZVwiLFwiZ3VmXCIsXCJndWdcIixcImd1aFwiLFwiZ3VpXCIsXCJndWtcIixcImd1bFwiLFwiZ3VtXCIsXCJndW5cIixcImd1b1wiLFwiZ3VwXCIsXCJndXFcIixcImd1clwiLFwiZ3VzXCIsXCJndXRcIixcImd1dVwiLFwiZ3V2XCIsXCJndXdcIixcImd1eFwiLFwiZ3V6XCIsXCJndmFcIixcImd2Y1wiLFwiZ3ZlXCIsXCJndmZcIixcImd2alwiLFwiZ3ZsXCIsXCJndm1cIixcImd2blwiLFwiZ3ZvXCIsXCJndnBcIixcImd2clwiLFwiZ3ZzXCIsXCJndnlcIixcImd3YVwiLFwiZ3diXCIsXCJnd2NcIixcImd3ZFwiLFwiZ3dlXCIsXCJnd2ZcIixcImd3Z1wiLFwiZ3dpXCIsXCJnd2pcIixcImd3bVwiLFwiZ3duXCIsXCJnd3JcIixcImd3dFwiLFwiZ3d1XCIsXCJnd3dcIixcImd3eFwiLFwiZ3h4XCIsXCJneWFcIixcImd5YlwiLFwiZ3lkXCIsXCJneWVcIixcImd5ZlwiLFwiZ3lnXCIsXCJneWlcIixcImd5bFwiLFwiZ3ltXCIsXCJneW5cIixcImd5b1wiLFwiZ3lyXCIsXCJneXlcIixcImd5elwiLFwiZ3phXCIsXCJnemlcIixcImd6blwiXVxuLFsgXCJoYVwiLFwiaGVcIixcImhpXCIsXCJob1wiLFwiaHJcIixcImh0XCIsXCJodVwiLFwiaHlcIixcImh6XCIsXCJoYWFcIixcImhhYlwiLFwiaGFjXCIsXCJoYWRcIixcImhhZVwiLFwiaGFmXCIsXCJoYWdcIixcImhhaFwiLFwiaGFpXCIsXCJoYWpcIixcImhha1wiLFwiaGFsXCIsXCJoYW1cIixcImhhblwiLFwiaGFvXCIsXCJoYXBcIixcImhhcVwiLFwiaGFyXCIsXCJoYXNcIixcImhhdlwiLFwiaGF3XCIsXCJoYXhcIixcImhheVwiLFwiaGF6XCIsXCJoYmFcIixcImhiYlwiLFwiaGJuXCIsXCJoYm9cIixcImhidVwiLFwiaGNhXCIsXCJoY2hcIixcImhkblwiLFwiaGRzXCIsXCJoZHlcIixcImhlYVwiLFwiaGVkXCIsXCJoZWdcIixcImhlaFwiLFwiaGVpXCIsXCJoZW1cIixcImhnbVwiLFwiaGd3XCIsXCJoaGlcIixcImhoclwiLFwiaGh5XCIsXCJoaWFcIixcImhpYlwiLFwiaGlkXCIsXCJoaWZcIixcImhpZ1wiLFwiaGloXCIsXCJoaWlcIixcImhpalwiLFwiaGlrXCIsXCJoaWxcIixcImhpbVwiLFwiaGlvXCIsXCJoaXJcIixcImhpdFwiLFwiaGl3XCIsXCJoaXhcIixcImhqaVwiLFwiaGthXCIsXCJoa2VcIixcImhraFwiLFwiaGtrXCIsXCJoa25cIixcImhrc1wiLFwiaGxhXCIsXCJobGJcIixcImhsZFwiLFwiaGxlXCIsXCJobHRcIixcImhsdVwiLFwiaG1hXCIsXCJobWJcIixcImhtY1wiLFwiaG1kXCIsXCJobWVcIixcImhtZlwiLFwiaG1nXCIsXCJobWhcIixcImhtaVwiLFwiaG1qXCIsXCJobWtcIixcImhtbFwiLFwiaG1tXCIsXCJobW5cIixcImhtcFwiLFwiaG1xXCIsXCJobXJcIixcImhtc1wiLFwiaG10XCIsXCJobXVcIixcImhtdlwiLFwiaG13XCIsXCJobXhcIixcImhteVwiLFwiaG16XCIsXCJobmFcIixcImhuZFwiLFwiaG5lXCIsXCJobmdcIixcImhuaFwiLFwiaG5pXCIsXCJobmpcIixcImhublwiLFwiaG5vXCIsXCJobnNcIixcImhudVwiLFwiaG9hXCIsXCJob2JcIixcImhvY1wiLFwiaG9kXCIsXCJob2VcIixcImhvaFwiLFwiaG9pXCIsXCJob2pcIixcImhva1wiLFwiaG9sXCIsXCJob21cIixcImhvb1wiLFwiaG9wXCIsXCJob3JcIixcImhvc1wiLFwiaG90XCIsXCJob3ZcIixcImhvd1wiLFwiaG95XCIsXCJob3pcIixcImhwb1wiLFwiaHBzXCIsXCJocmFcIixcImhyY1wiLFwiaHJlXCIsXCJocmtcIixcImhybVwiLFwiaHJvXCIsXCJocnBcIixcImhyclwiLFwiaHJ0XCIsXCJocnVcIixcImhyd1wiLFwiaHJ4XCIsXCJocnpcIixcImhzYlwiLFwiaHNoXCIsXCJoc2xcIixcImhzblwiLFwiaHNzXCIsXCJodGlcIixcImh0b1wiLFwiaHRzXCIsXCJodHVcIixcImh0eFwiLFwiaHViXCIsXCJodWNcIixcImh1ZFwiLFwiaHVlXCIsXCJodWZcIixcImh1Z1wiLFwiaHVoXCIsXCJodWlcIixcImh1alwiLFwiaHVrXCIsXCJodWxcIixcImh1bVwiLFwiaHVvXCIsXCJodXBcIixcImh1cVwiLFwiaHVyXCIsXCJodXNcIixcImh1dFwiLFwiaHV1XCIsXCJodXZcIixcImh1d1wiLFwiaHV4XCIsXCJodXlcIixcImh1elwiLFwiaHZjXCIsXCJodmVcIixcImh2a1wiLFwiaHZuXCIsXCJodnZcIixcImh3YVwiLFwiaHdjXCIsXCJod29cIixcImh5YVwiLFwiaHl3XCIsXCJoeXhcIl1cbixbIFwiaWFcIixcImlkXCIsXCJpZVwiLFwiaWdcIixcImlpXCIsXCJpa1wiLFwiaW5cIixcImlvXCIsXCJpc1wiLFwiaXRcIixcIml1XCIsXCJpd1wiLFwiaWFpXCIsXCJpYW5cIixcImlhcFwiLFwiaWFyXCIsXCJpYmFcIixcImliYlwiLFwiaWJkXCIsXCJpYmVcIixcImliZ1wiLFwiaWJoXCIsXCJpYmlcIixcImlibFwiLFwiaWJtXCIsXCJpYm5cIixcImliclwiLFwiaWJ1XCIsXCJpYnlcIixcImljYVwiLFwiaWNoXCIsXCJpY2xcIixcImljclwiLFwiaWRhXCIsXCJpZGJcIixcImlkY1wiLFwiaWRkXCIsXCJpZGVcIixcImlkaVwiLFwiaWRyXCIsXCJpZHNcIixcImlkdFwiLFwiaWR1XCIsXCJpZmFcIixcImlmYlwiLFwiaWZlXCIsXCJpZmZcIixcImlma1wiLFwiaWZtXCIsXCJpZnVcIixcImlmeVwiLFwiaWdiXCIsXCJpZ2VcIixcImlnZ1wiLFwiaWdsXCIsXCJpZ21cIixcImlnblwiLFwiaWdvXCIsXCJpZ3NcIixcImlnd1wiLFwiaWhiXCIsXCJpaGlcIixcImlocFwiLFwiaWh3XCIsXCJpaW5cIixcImlpclwiLFwiaWpjXCIsXCJpamVcIixcImlqalwiLFwiaWpuXCIsXCJpam9cIixcImlqc1wiLFwiaWtlXCIsXCJpa2lcIixcImlra1wiLFwiaWtsXCIsXCJpa29cIixcImlrcFwiLFwiaWtyXCIsXCJpa3NcIixcImlrdFwiLFwiaWt2XCIsXCJpa3dcIixcImlreFwiLFwiaWt6XCIsXCJpbGFcIixcImlsYlwiLFwiaWxnXCIsXCJpbGlcIixcImlsa1wiLFwiaWxsXCIsXCJpbG1cIixcImlsb1wiLFwiaWxwXCIsXCJpbHNcIixcImlsdVwiLFwiaWx2XCIsXCJpbHdcIixcImltYVwiLFwiaW1lXCIsXCJpbWlcIixcImltbFwiLFwiaW1uXCIsXCJpbW9cIixcImltclwiLFwiaW1zXCIsXCJpbXlcIixcImluYlwiLFwiaW5jXCIsXCJpbmVcIixcImluZ1wiLFwiaW5oXCIsXCJpbmpcIixcImlubFwiLFwiaW5tXCIsXCJpbm5cIixcImlub1wiLFwiaW5wXCIsXCJpbnNcIixcImludFwiLFwiaW56XCIsXCJpb3JcIixcImlvdVwiLFwiaW93XCIsXCJpcGlcIixcImlwb1wiLFwiaXF1XCIsXCJpcXdcIixcImlyYVwiLFwiaXJlXCIsXCJpcmhcIixcImlyaVwiLFwiaXJrXCIsXCJpcm5cIixcImlyb1wiLFwiaXJyXCIsXCJpcnVcIixcImlyeFwiLFwiaXJ5XCIsXCJpc2FcIixcImlzY1wiLFwiaXNkXCIsXCJpc2VcIixcImlzZ1wiLFwiaXNoXCIsXCJpc2lcIixcImlza1wiLFwiaXNtXCIsXCJpc25cIixcImlzb1wiLFwiaXNyXCIsXCJpc3RcIixcImlzdVwiLFwiaXRiXCIsXCJpdGNcIixcIml0ZFwiLFwiaXRlXCIsXCJpdGlcIixcIml0a1wiLFwiaXRsXCIsXCJpdG1cIixcIml0b1wiLFwiaXRyXCIsXCJpdHNcIixcIml0dFwiLFwiaXR2XCIsXCJpdHdcIixcIml0eFwiLFwiaXR5XCIsXCJpdHpcIixcIml1bVwiLFwiaXZiXCIsXCJpdnZcIixcIml3a1wiLFwiaXdtXCIsXCJpd29cIixcIml3c1wiLFwiaXhjXCIsXCJpeGxcIixcIml5YVwiLFwiaXlvXCIsXCJpeXhcIixcIml6aFwiLFwiaXppXCIsXCJpenJcIixcIml6elwiXVxuLFsgXCJqYVwiLFwiamlcIixcImp2XCIsXCJqd1wiLFwiamFhXCIsXCJqYWJcIixcImphY1wiLFwiamFkXCIsXCJqYWVcIixcImphZlwiLFwiamFoXCIsXCJqYWpcIixcImpha1wiLFwiamFsXCIsXCJqYW1cIixcImphblwiLFwiamFvXCIsXCJqYXFcIixcImphclwiLFwiamFzXCIsXCJqYXRcIixcImphdVwiLFwiamF4XCIsXCJqYXlcIixcImphelwiLFwiamJlXCIsXCJqYmlcIixcImpialwiLFwiamJrXCIsXCJqYm1cIixcImpiblwiLFwiamJvXCIsXCJqYnJcIixcImpidFwiLFwiamJ1XCIsXCJqYndcIixcImpjc1wiLFwiamN0XCIsXCJqZGFcIixcImpkZ1wiLFwiamR0XCIsXCJqZWJcIixcImplZVwiLFwiamVnXCIsXCJqZWhcIixcImplaVwiLFwiamVrXCIsXCJqZWxcIixcImplblwiLFwiamVyXCIsXCJqZXRcIixcImpldVwiLFwiamdiXCIsXCJqZ2VcIixcImpna1wiLFwiamdvXCIsXCJqaGlcIixcImpoc1wiLFwiamlhXCIsXCJqaWJcIixcImppY1wiLFwiamlkXCIsXCJqaWVcIixcImppZ1wiLFwiamloXCIsXCJqaWlcIixcImppbFwiLFwiamltXCIsXCJqaW9cIixcImppcVwiLFwiaml0XCIsXCJqaXVcIixcImppdlwiLFwiaml5XCIsXCJqamVcIixcImpqclwiLFwiamthXCIsXCJqa21cIixcImprb1wiLFwiamtwXCIsXCJqa3JcIixcImprc1wiLFwiamt1XCIsXCJqbGVcIixcImpsc1wiLFwiam1hXCIsXCJqbWJcIixcImptY1wiLFwiam1kXCIsXCJqbWlcIixcImptbFwiLFwiam1uXCIsXCJqbXJcIixcImptc1wiLFwiam13XCIsXCJqbXhcIixcImpuYVwiLFwiam5kXCIsXCJqbmdcIixcImpuaVwiLFwiam5qXCIsXCJqbmxcIixcImpuc1wiLFwiam9iXCIsXCJqb2RcIixcImpvZ1wiLFwiam9yXCIsXCJqb3NcIixcImpvd1wiLFwianBhXCIsXCJqcHJcIixcImpweFwiLFwianFyXCIsXCJqcmFcIixcImpyYlwiLFwianJyXCIsXCJqcnRcIixcImpydVwiLFwianNsXCIsXCJqdWFcIixcImp1YlwiLFwianVjXCIsXCJqdWRcIixcImp1aFwiLFwianVpXCIsXCJqdWtcIixcImp1bFwiLFwianVtXCIsXCJqdW5cIixcImp1b1wiLFwianVwXCIsXCJqdXJcIixcImp1c1wiLFwianV0XCIsXCJqdXVcIixcImp1d1wiLFwianV5XCIsXCJqdmRcIixcImp2blwiLFwiandpXCIsXCJqeWFcIixcImp5ZVwiLFwianl5XCJdXG4sWyBcImthXCIsXCJrZ1wiLFwia2lcIixcImtqXCIsXCJra1wiLFwia2xcIixcImttXCIsXCJrblwiLFwia29cIixcImtyXCIsXCJrc1wiLFwia3VcIixcImt2XCIsXCJrd1wiLFwia3lcIixcImthYVwiLFwia2FiXCIsXCJrYWNcIixcImthZFwiLFwia2FlXCIsXCJrYWZcIixcImthZ1wiLFwia2FoXCIsXCJrYWlcIixcImthalwiLFwia2FrXCIsXCJrYW1cIixcImthb1wiLFwia2FwXCIsXCJrYXFcIixcImthclwiLFwia2F2XCIsXCJrYXdcIixcImtheFwiLFwia2F5XCIsXCJrYmFcIixcImtiYlwiLFwia2JjXCIsXCJrYmRcIixcImtiZVwiLFwia2JmXCIsXCJrYmdcIixcImtiaFwiLFwia2JpXCIsXCJrYmpcIixcImtia1wiLFwia2JsXCIsXCJrYm1cIixcImtiblwiLFwia2JvXCIsXCJrYnBcIixcImticVwiLFwia2JyXCIsXCJrYnNcIixcImtidFwiLFwia2J1XCIsXCJrYnZcIixcImtid1wiLFwia2J4XCIsXCJrYnlcIixcImtielwiLFwia2NhXCIsXCJrY2JcIixcImtjY1wiLFwia2NkXCIsXCJrY2VcIixcImtjZlwiLFwia2NnXCIsXCJrY2hcIixcImtjaVwiLFwia2NqXCIsXCJrY2tcIixcImtjbFwiLFwia2NtXCIsXCJrY25cIixcImtjb1wiLFwia2NwXCIsXCJrY3FcIixcImtjclwiLFwia2NzXCIsXCJrY3RcIixcImtjdVwiLFwia2N2XCIsXCJrY3dcIixcImtjeFwiLFwia2N5XCIsXCJrY3pcIixcImtkYVwiLFwia2RjXCIsXCJrZGRcIixcImtkZVwiLFwia2RmXCIsXCJrZGdcIixcImtkaFwiLFwia2RpXCIsXCJrZGpcIixcImtka1wiLFwia2RsXCIsXCJrZG1cIixcImtkblwiLFwia2RvXCIsXCJrZHBcIixcImtkcVwiLFwia2RyXCIsXCJrZHRcIixcImtkdVwiLFwia2R2XCIsXCJrZHdcIixcImtkeFwiLFwia2R5XCIsXCJrZHpcIixcImtlYVwiLFwia2ViXCIsXCJrZWNcIixcImtlZFwiLFwia2VlXCIsXCJrZWZcIixcImtlZ1wiLFwia2VoXCIsXCJrZWlcIixcImtlalwiLFwia2VrXCIsXCJrZWxcIixcImtlbVwiLFwia2VuXCIsXCJrZW9cIixcImtlcFwiLFwia2VxXCIsXCJrZXJcIixcImtlc1wiLFwia2V0XCIsXCJrZXVcIixcImtldlwiLFwia2V3XCIsXCJrZXhcIixcImtleVwiLFwia2V6XCIsXCJrZmFcIixcImtmYlwiLFwia2ZjXCIsXCJrZmRcIixcImtmZVwiLFwia2ZmXCIsXCJrZmdcIixcImtmaFwiLFwia2ZpXCIsXCJrZmpcIixcImtma1wiLFwia2ZsXCIsXCJrZm1cIixcImtmblwiLFwia2ZvXCIsXCJrZnBcIixcImtmcVwiLFwia2ZyXCIsXCJrZnNcIixcImtmdFwiLFwia2Z1XCIsXCJrZnZcIixcImtmd1wiLFwia2Z4XCIsXCJrZnlcIixcImtmelwiLFwia2dhXCIsXCJrZ2JcIixcImtnY1wiLFwia2dkXCIsXCJrZ2VcIixcImtnZlwiLFwia2dnXCIsXCJrZ2hcIixcImtnaVwiLFwia2dqXCIsXCJrZ2tcIixcImtnbFwiLFwia2dtXCIsXCJrZ25cIixcImtnb1wiLFwia2dwXCIsXCJrZ3FcIixcImtnclwiLFwia2dzXCIsXCJrZ3RcIixcImtndVwiLFwia2d2XCIsXCJrZ3dcIixcImtneFwiLFwia2d5XCIsXCJraGFcIixcImx5Z1wiLFwia2hiXCIsXCJraGNcIixcImtoZFwiLFwia2hlXCIsXCJraGZcIixcImtoZ1wiLFwia2hoXCIsXCJraGlcIixcImtoalwiLFwia2hrXCIsXCJraGxcIixcImtoblwiLFwia2hvXCIsXCJraHBcIixcImtocVwiLFwia2hyXCIsXCJraHNcIixcImtodFwiLFwia2h1XCIsXCJraHZcIixcImtod1wiLFwia2h4XCIsXCJraHlcIixcImtoelwiLFwia2lhXCIsXCJraWJcIixcImtpY1wiLFwia2lkXCIsXCJraWVcIixcImtpZlwiLFwia2lnXCIsXCJraWhcIixcImtpaVwiLFwia2lqXCIsXCJraWxcIixcImtpbVwiLFwia2lvXCIsXCJraXBcIixcImtpcVwiLFwia2lzXCIsXCJraXRcIixcImtpdVwiLFwia2l2XCIsXCJraXdcIixcImtpeFwiLFwia2l5XCIsXCJraXpcIixcImtqYVwiLFwia2piXCIsXCJramNcIixcImtqZFwiLFwia2plXCIsXCJramZcIixcImtqZ1wiLFwia2poXCIsXCJramlcIixcImtqalwiLFwia2prXCIsXCJramxcIixcImtqbVwiLFwia2puXCIsXCJram9cIixcImtqcFwiLFwia2pxXCIsXCJranJcIixcImtqc1wiLFwia2p0XCIsXCJranVcIixcImtqdlwiLFwia2p4XCIsXCJranlcIixcImtqelwiLFwia2thXCIsXCJra2JcIixcImtrY1wiLFwia2tkXCIsXCJra2VcIixcImtrZlwiLFwia2tnXCIsXCJra2hcIixcImtraVwiLFwia2tqXCIsXCJra2tcIixcImtrbFwiLFwia2ttXCIsXCJra25cIixcImtrb1wiLFwia2twXCIsXCJra3FcIixcImtrclwiLFwia2tzXCIsXCJra3RcIixcImtrdVwiLFwia2t2XCIsXCJra3dcIixcImtreFwiLFwia2t5XCIsXCJra3pcIixcImtsYVwiLFwia2xiXCIsXCJrbGNcIixcImtsZFwiLFwia2xlXCIsXCJrbGZcIixcImtsZ1wiLFwia2xoXCIsXCJrbGlcIixcImtsalwiLFwia2xrXCIsXCJrbGxcIixcImtsbVwiLFwia2xuXCIsXCJrbG9cIixcImtscFwiLFwia2xxXCIsXCJrbHJcIixcImtsc1wiLFwia2x0XCIsXCJrbHVcIixcImtsdlwiLFwia2x3XCIsXCJrbHhcIixcImtseVwiLFwia2x6XCIsXCJrbWFcIixcImttYlwiLFwia21jXCIsXCJrbWRcIixcImttZVwiLFwia21mXCIsXCJrbWdcIixcImttaFwiLFwia21pXCIsXCJrbWpcIixcImtta1wiLFwia21sXCIsXCJrbW1cIixcImttblwiLFwia21vXCIsXCJrbXBcIixcImttcVwiLFwia21yXCIsXCJrbXNcIixcImttdFwiLFwia211XCIsXCJrbXZcIixcImttd1wiLFwia214XCIsXCJrbXlcIixcImttelwiLFwia25hXCIsXCJrbmJcIixcImtuY1wiLFwia25kXCIsXCJrbmVcIixcImtuZlwiLFwia25nXCIsXCJrbmlcIixcImtualwiLFwia25rXCIsXCJrbmxcIixcImtubVwiLFwia25uXCIsXCJrbm9cIixcImtucFwiLFwia25xXCIsXCJrbnJcIixcImtuc1wiLFwia250XCIsXCJrbnVcIixcImtudlwiLFwia253XCIsXCJrbnhcIixcImtueVwiLFwia256XCIsXCJrb2FcIixcImtvY1wiLFwia29kXCIsXCJrb2VcIixcImtvZlwiLFwia29nXCIsXCJrb2hcIixcImtvaVwiLFwia29qXCIsXCJrb2tcIixcImtvbFwiLFwia29vXCIsXCJrb3BcIixcImtvcVwiLFwia29zXCIsXCJrb3RcIixcImtvdVwiLFwia292XCIsXCJrb3dcIixcImtveFwiLFwia295XCIsXCJrb3pcIixcImtwYVwiLFwia3BiXCIsXCJrcGNcIixcImtwZFwiLFwia3BlXCIsXCJrcGZcIixcImtwZ1wiLFwia3BoXCIsXCJrcGlcIixcImtwalwiLFwia3BrXCIsXCJrcGxcIixcImtwbVwiLFwia3BuXCIsXCJrcG9cIixcImtwcFwiLFwia3BxXCIsXCJrcHJcIixcImtwc1wiLFwia3B0XCIsXCJrcHVcIixcImtwdlwiLFwia3B3XCIsXCJrcHhcIixcImtweVwiLFwia3B6XCIsXCJrcWFcIixcImtxYlwiLFwia3FjXCIsXCJrcWRcIixcImtxZVwiLFwia3FmXCIsXCJrcWdcIixcImtxaFwiLFwia3FpXCIsXCJrcWpcIixcImtxa1wiLFwia3FsXCIsXCJrcW1cIixcImtxblwiLFwia3FvXCIsXCJrcXBcIixcImtxcVwiLFwia3FyXCIsXCJrcXNcIixcImtxdFwiLFwia3F1XCIsXCJrcXZcIixcImtxd1wiLFwia3F4XCIsXCJrcXlcIixcImtxelwiLFwia3JhXCIsXCJrcmJcIixcImtyY1wiLFwia3JkXCIsXCJrcmVcIixcImtyZlwiLFwia3JoXCIsXCJrcmlcIixcImtyalwiLFwia3JrXCIsXCJrcmxcIixcImtybVwiLFwia3JuXCIsXCJrcm9cIixcImtycFwiLFwia3JyXCIsXCJrcnNcIixcImtydFwiLFwia3J1XCIsXCJrcnZcIixcImtyd1wiLFwia3J4XCIsXCJrcnlcIixcImtyelwiLFwia3NhXCIsXCJrc2JcIixcImtzY1wiLFwia3NkXCIsXCJrc2VcIixcImtzZlwiLFwia3NnXCIsXCJrc2hcIixcImtzaVwiLFwia3NqXCIsXCJrc2tcIixcImtzbFwiLFwia3NtXCIsXCJrc25cIixcImtzb1wiLFwia3NwXCIsXCJrc3FcIixcImtzclwiLFwia3NzXCIsXCJrc3RcIixcImtzdVwiLFwia3N2XCIsXCJrc3dcIixcImtzeFwiLFwia3N5XCIsXCJrc3pcIixcImt0YVwiLFwia3RiXCIsXCJrdGNcIixcImt0ZFwiLFwia3RlXCIsXCJrdGZcIixcImt0Z1wiLFwia3RoXCIsXCJrdGlcIixcImt0alwiLFwia3RrXCIsXCJrdGxcIixcImt0bVwiLFwia3RuXCIsXCJrdG9cIixcImt0cFwiLFwia3RxXCIsXCJrdHJcIixcImt0c1wiLFwia3R0XCIsXCJrdHVcIixcImt0dlwiLFwia3R3XCIsXCJrdHhcIixcImt0eVwiLFwia3R6XCIsXCJrdWJcIixcImt1Y1wiLFwia3VkXCIsXCJrdWVcIixcImt1ZlwiLFwia3VnXCIsXCJrdWhcIixcImt1aVwiLFwia3VqXCIsXCJrdWtcIixcImt1bFwiLFwia3VtXCIsXCJrdW5cIixcImt1b1wiLFwia3VwXCIsXCJrdXFcIixcImt1c1wiLFwia3V0XCIsXCJrdXVcIixcImt1dlwiLFwia3V3XCIsXCJrdXhcIixcImt1eVwiLFwia3V6XCIsXCJrdmFcIixcImt2YlwiLFwia3ZjXCIsXCJrdmRcIixcImt2ZVwiLFwia3ZmXCIsXCJrdmdcIixcImt2aFwiLFwia3ZpXCIsXCJrdmpcIixcImt2a1wiLFwia3ZsXCIsXCJrdm1cIixcImt2blwiLFwia3ZvXCIsXCJrdnBcIixcImt2cVwiLFwia3ZyXCIsXCJrdnNcIixcImt2dFwiLFwia3Z1XCIsXCJrdnZcIixcImt2d1wiLFwia3Z4XCIsXCJrdnlcIixcImt2elwiLFwia3dhXCIsXCJrd2JcIixcImt3Y1wiLFwia3dkXCIsXCJrd2VcIixcImt3ZlwiLFwia3dnXCIsXCJrd2hcIixcImt3aVwiLFwia3dqXCIsXCJrd2tcIixcImt3bFwiLFwia3dtXCIsXCJrd25cIixcImt3b1wiLFwia3dwXCIsXCJrd3FcIixcImt3clwiLFwia3dzXCIsXCJrd3RcIixcImt3dVwiLFwia3d2XCIsXCJrd3dcIixcImt3eFwiLFwia3d5XCIsXCJrd3pcIixcImt4YVwiLFwia3hiXCIsXCJreGNcIixcImt4ZFwiLFwia3hlXCIsXCJreGZcIixcImt4aFwiLFwia3hpXCIsXCJreGpcIixcImt4a1wiLFwia3hsXCIsXCJreG1cIixcImt4blwiLFwia3hvXCIsXCJreHBcIixcImt4cVwiLFwia3hyXCIsXCJreHNcIixcImt4dFwiLFwia3h1XCIsXCJreHZcIixcImt4d1wiLFwia3h4XCIsXCJreHlcIixcImt4elwiLFwia3lhXCIsXCJreWJcIixcImt5Y1wiLFwia3lkXCIsXCJreWVcIixcImt5ZlwiLFwia3lnXCIsXCJreWhcIixcImt5aVwiLFwia3lqXCIsXCJreWtcIixcImt5bFwiLFwia3ltXCIsXCJreW5cIixcImt5b1wiLFwia3lwXCIsXCJreXFcIixcImt5clwiLFwia3lzXCIsXCJreXRcIixcImt5dVwiLFwia3l2XCIsXCJreXdcIixcImt5eFwiLFwia3l5XCIsXCJreXpcIixcImt6YVwiLFwia3piXCIsXCJremNcIixcImt6ZFwiLFwia3plXCIsXCJremZcIixcImt6Z1wiLFwia3poXCIsXCJremlcIixcImt6alwiLFwia3prXCIsXCJremxcIixcImt6bVwiLFwia3puXCIsXCJrem9cIixcImt6cFwiLFwia3pxXCIsXCJrenJcIixcImt6c1wiLFwia3p0XCIsXCJrenVcIixcImt6dlwiLFwia3p3XCIsXCJrenhcIixcImt6eVwiLFwia3p6XCJdXG4sWyBcImxhXCIsXCJsYlwiLFwibGdcIixcImxpXCIsXCJsblwiLFwibG9cIixcImx0XCIsXCJsdVwiLFwibHZcIixcImxhYVwiLFwibGFiXCIsXCJsYWNcIixcImxhZFwiLFwibGFlXCIsXCJsYWZcIixcImxhZ1wiLFwibGFoXCIsXCJsYWlcIixcImxhalwiLFwibGFrXCIsXCJsYWxcIixcImxhbVwiLFwibGFuXCIsXCJsYXBcIixcImxhcVwiLFwibGFyXCIsXCJsYXNcIixcImxhdVwiLFwibGF3XCIsXCJsYXhcIixcImxheVwiLFwibGF6XCIsXCJsYmFcIixcImxiYlwiLFwibGJjXCIsXCJsYmVcIixcImxiZlwiLFwibGJnXCIsXCJsYmlcIixcImxialwiLFwibGJrXCIsXCJsYmxcIixcImxibVwiLFwibGJuXCIsXCJsYm9cIixcImxicVwiLFwibGJyXCIsXCJsYnNcIixcImxidFwiLFwibGJ1XCIsXCJsYnZcIixcImxid1wiLFwibGJ4XCIsXCJsYnlcIixcImxielwiLFwibGNjXCIsXCJsY2RcIixcImxjZVwiLFwibGNmXCIsXCJsY2hcIixcImxjbFwiLFwibGNtXCIsXCJsY3BcIixcImxjcVwiLFwibGNzXCIsXCJsZGFcIixcImxkYlwiLFwibGRkXCIsXCJsZGdcIixcImxkaFwiLFwibGRpXCIsXCJsZGpcIixcImxka1wiLFwibGRsXCIsXCJsZG1cIixcImxkblwiLFwibGRvXCIsXCJsZHBcIixcImxkcVwiLFwibGVhXCIsXCJsZWJcIixcImxlY1wiLFwibGVkXCIsXCJsZWVcIixcImxlZlwiLFwibGVnXCIsXCJsZWhcIixcImxlaVwiLFwibGVqXCIsXCJsZWtcIixcImxlbFwiLFwibGVtXCIsXCJsZW5cIixcImxlb1wiLFwibGVwXCIsXCJsZXFcIixcImxlclwiLFwibGVzXCIsXCJsZXRcIixcImxldVwiLFwibGV2XCIsXCJsZXdcIixcImxleFwiLFwibGV5XCIsXCJsZXpcIixcImxmYVwiLFwibGZuXCIsXCJsZ2FcIixcImxnYlwiLFwibGdnXCIsXCJsZ2hcIixcImxnaVwiLFwibGdrXCIsXCJsZ2xcIixcImxnbVwiLFwibGduXCIsXCJsZ3FcIixcImxnclwiLFwibGd0XCIsXCJsZ3VcIixcImxnelwiLFwibGhhXCIsXCJsaGhcIixcImxoaVwiLFwibGhsXCIsXCJsaG1cIixcImxoblwiLFwibGhwXCIsXCJsaHNcIixcImxodFwiLFwibGh1XCIsXCJsaWFcIixcImxpYlwiLFwibGljXCIsXCJsaWRcIixcImxpZVwiLFwibGlmXCIsXCJsaWdcIixcImxpaFwiLFwibGlpXCIsXCJsaWpcIixcImxpa1wiLFwibGlsXCIsXCJsaW9cIixcImxpcFwiLFwibGlxXCIsXCJsaXJcIixcImxpc1wiLFwibGl1XCIsXCJsaXZcIixcImxpd1wiLFwibGl4XCIsXCJsaXlcIixcImxpelwiLFwibGphXCIsXCJsamVcIixcImxqaVwiLFwibGpsXCIsXCJsanBcIixcImxqd1wiLFwibGp4XCIsXCJsa2FcIixcImxrYlwiLFwibGtjXCIsXCJsa2RcIixcImxrZVwiLFwibGtoXCIsXCJsa2lcIixcImxralwiLFwibGtsXCIsXCJsa21cIixcImxrblwiLFwibGtvXCIsXCJsa3JcIixcImxrc1wiLFwibGt0XCIsXCJsa3VcIixcImxreVwiLFwibGxhXCIsXCJsbGJcIixcImxsY1wiLFwibGxkXCIsXCJsbGVcIixcImxsZlwiLFwibGxnXCIsXCJsbGhcIixcImxsaVwiLFwibGxqXCIsXCJsbGtcIixcImxsbFwiLFwibGxtXCIsXCJsbG5cIixcImxsb1wiLFwibGxwXCIsXCJsbHFcIixcImxsc1wiLFwibGx1XCIsXCJsbHhcIixcImxtYVwiLFwibG1iXCIsXCJsbWNcIixcImxtZFwiLFwibG1lXCIsXCJsbWZcIixcImxtZ1wiLFwibG1oXCIsXCJsbWlcIixcImxtalwiLFwibG1rXCIsXCJsbWxcIixcImxtbVwiLFwibG1uXCIsXCJsbW9cIixcImxtcFwiLFwibG1xXCIsXCJsbXJcIixcImxtdVwiLFwibG12XCIsXCJsbXdcIixcImxteFwiLFwibG15XCIsXCJsbXpcIixcImxuYVwiLFwibG5iXCIsXCJsbmRcIixcImxuZ1wiLFwibG5oXCIsXCJsbmlcIixcImxualwiLFwibG5sXCIsXCJsbm1cIixcImxublwiLFwibG5vXCIsXCJsbnNcIixcImxudVwiLFwibG53XCIsXCJsbnpcIixcImxvYVwiLFwibG9iXCIsXCJsb2NcIixcImxvZVwiLFwibG9mXCIsXCJsb2dcIixcImxvaFwiLFwibG9pXCIsXCJsb2pcIixcImxva1wiLFwibG9sXCIsXCJsb21cIixcImxvblwiLFwibG9vXCIsXCJsb3BcIixcImxvcVwiLFwibG9yXCIsXCJsb3NcIixcImxvdFwiLFwibG91XCIsXCJsb3ZcIixcImxvd1wiLFwibG94XCIsXCJsb3lcIixcImxvelwiLFwibHBhXCIsXCJscGVcIixcImxwblwiLFwibHBvXCIsXCJscHhcIixcImxyYVwiLFwibHJjXCIsXCJscmVcIixcImxyZ1wiLFwibHJpXCIsXCJscmtcIixcImxybFwiLFwibHJtXCIsXCJscm5cIixcImxyb1wiLFwibHJyXCIsXCJscnRcIixcImxydlwiLFwibHJ6XCIsXCJsc2FcIixcImxzYlwiLFwibHNkXCIsXCJsc2VcIixcImxzZ1wiLFwibHNoXCIsXCJsc2lcIixcImxzbFwiLFwibHNtXCIsXCJsc25cIixcImxzb1wiLFwibHNwXCIsXCJsc3JcIixcImxzc1wiLFwibHN0XCIsXCJsc3ZcIixcImxzeVwiLFwibHRjXCIsXCJsdGdcIixcImx0aFwiLFwibHRpXCIsXCJsdG5cIixcImx0b1wiLFwibHRzXCIsXCJsdHVcIixcImx1YVwiLFwibHVjXCIsXCJsdWRcIixcImx1ZVwiLFwibHVmXCIsXCJsdWlcIixcImx1alwiLFwibHVrXCIsXCJsdWxcIixcImx1bVwiLFwibHVuXCIsXCJsdW9cIixcImx1cFwiLFwibHVxXCIsXCJsdXJcIixcImx1c1wiLFwibHV0XCIsXCJsdXVcIixcImx1dlwiLFwibHV3XCIsXCJsdXlcIixcImx1elwiLFwibHZhXCIsXCJsdmlcIixcImx2a1wiLFwibHZzXCIsXCJsdnVcIixcImx3YVwiLFwibHdlXCIsXCJsd2dcIixcImx3aFwiLFwibHdsXCIsXCJsd21cIixcImx3b1wiLFwibHdzXCIsXCJsd3RcIixcImx3dVwiLFwibHd3XCIsXCJseG1cIixcImx5YVwiLFwibHlnXCIsXCJseW5cIixcImx6aFwiLFwibHpsXCIsXCJsem5cIixcImx6elwiXVxuLFsgXCJtZ1wiLFwibWhcIixcIm1pXCIsXCJta1wiLFwibWxcIixcIm1uXCIsXCJtb1wiLFwibXJcIixcIm1zXCIsXCJtdFwiLFwibXlcIixcIm1hYVwiLFwibWFiXCIsXCJtYWRcIixcIm1hZVwiLFwibWFmXCIsXCJtYWdcIixcIm1haVwiLFwibWFqXCIsXCJtYWtcIixcIm1hbVwiLFwibWFuXCIsXCJtYXBcIixcIm1hcVwiLFwibWFzXCIsXCJtYXRcIixcIm1hdVwiLFwibWF2XCIsXCJtYXdcIixcIm1heFwiLFwibWF6XCIsXCJtYmFcIixcIm1iYlwiLFwibWJjXCIsXCJtYmRcIixcIm1iZVwiLFwibWJmXCIsXCJtYmhcIixcIm1iaVwiLFwibWJqXCIsXCJtYmtcIixcIm1ibFwiLFwibWJtXCIsXCJtYm5cIixcIm1ib1wiLFwibWJwXCIsXCJtYnFcIixcIm1iclwiLFwibWJzXCIsXCJtYnRcIixcIm1idVwiLFwibWJ2XCIsXCJtYndcIixcIm1ieFwiLFwibWJ5XCIsXCJtYnpcIixcIm1jYVwiLFwibWNiXCIsXCJtY2NcIixcIm1jZFwiLFwibWNlXCIsXCJtY2ZcIixcIm1jZ1wiLFwibWNoXCIsXCJtY2lcIixcIm1jalwiLFwibWNrXCIsXCJtY2xcIixcIm1jbVwiLFwibWNuXCIsXCJtY29cIixcIm1jcFwiLFwibWNxXCIsXCJtY3JcIixcIm1jc1wiLFwibWN0XCIsXCJtY3VcIixcIm1jdlwiLFwibWN3XCIsXCJtY3hcIixcIm1jeVwiLFwibWN6XCIsXCJtZGFcIixcIm1kYlwiLFwibWRjXCIsXCJtZGRcIixcIm1kZVwiLFwibWRmXCIsXCJtZGdcIixcIm1kaFwiLFwibWRpXCIsXCJtZGpcIixcIm1ka1wiLFwibWRsXCIsXCJtZG1cIixcIm1kblwiLFwibWRwXCIsXCJtZHFcIixcIm1kclwiLFwibWRzXCIsXCJtZHRcIixcIm1kdVwiLFwibWR2XCIsXCJtZHdcIixcIm1keFwiLFwibWR5XCIsXCJtZHpcIixcIm1lYVwiLFwibWViXCIsXCJtZWNcIixcIm1lZFwiLFwibWVlXCIsXCJtZWZcIixcIm1lZ1wiLFwibWVoXCIsXCJtZWlcIixcIm1lalwiLFwibWVrXCIsXCJtZWxcIixcIm1lbVwiLFwibWVuXCIsXCJtZW9cIixcIm1lcFwiLFwibWVxXCIsXCJtZXJcIixcIm1lc1wiLFwibWV0XCIsXCJtZXVcIixcIm1ldlwiLFwibWV3XCIsXCJtZXlcIixcIm1lelwiLFwibWZhXCIsXCJtZmJcIixcIm1mY1wiLFwibWZkXCIsXCJtZmVcIixcIm1mZlwiLFwibWZnXCIsXCJtZmhcIixcIm1maVwiLFwibWZqXCIsXCJtZmtcIixcIm1mbFwiLFwibWZtXCIsXCJtZm5cIixcIm1mb1wiLFwibWZwXCIsXCJtZnFcIixcIm1mclwiLFwibWZzXCIsXCJtZnRcIixcIm1mdVwiLFwibWZ2XCIsXCJtZndcIixcIm1meFwiLFwibWZ5XCIsXCJtZnpcIixcIm1nYVwiLFwibWdiXCIsXCJtZ2NcIixcIm1nZFwiLFwibWdlXCIsXCJtZ2ZcIixcIm1nZ1wiLFwibWdoXCIsXCJtZ2lcIixcIm1nalwiLFwibWdrXCIsXCJtZ2xcIixcIm1nbVwiLFwibWduXCIsXCJtZ29cIixcIm1ncFwiLFwibWdxXCIsXCJtZ3JcIixcIm1nc1wiLFwibWd0XCIsXCJtZ3VcIixcIm1ndlwiLFwibWd3XCIsXCJtZ3hcIixcIm1neVwiLFwibWd6XCIsXCJtaGFcIixcIm1oYlwiLFwibWhjXCIsXCJtaGRcIixcIm1oZVwiLFwibWhmXCIsXCJtaGdcIixcIm1oaFwiLFwibWhpXCIsXCJtaGpcIixcIm1oa1wiLFwibWhsXCIsXCJtaG1cIixcIm1oblwiLFwibWhvXCIsXCJtaHBcIixcIm1ocVwiLFwibWhyXCIsXCJtaHNcIixcIm1odFwiLFwibWh1XCIsXCJtaHdcIixcIm1oeFwiLFwibWh5XCIsXCJtaHpcIixcIm1pYVwiLFwibWliXCIsXCJtaWNcIixcIm1pZFwiLFwibWllXCIsXCJtaWZcIixcIm1pZ1wiLFwibWloXCIsXCJtaWlcIixcIm1palwiLFwibWlrXCIsXCJtaWxcIixcIm1pbVwiLFwibWluXCIsXCJtaW9cIixcIm1pcFwiLFwibWlxXCIsXCJtaXJcIixcIm1pc1wiLFwibWl0XCIsXCJtaXVcIixcIm1pd1wiLFwibWl4XCIsXCJtaXlcIixcIm1pelwiLFwibWphXCIsXCJtamJcIixcIm1qY1wiLFwibWpkXCIsXCJtamVcIixcIm1qZ1wiLFwibWpoXCIsXCJtamlcIixcIm1qalwiLFwibWprXCIsXCJtamxcIixcIm1qbVwiLFwibWpuXCIsXCJtam9cIixcIm1qcFwiLFwibWpxXCIsXCJtanJcIixcIm1qc1wiLFwibWp0XCIsXCJtanVcIixcIm1qdlwiLFwibWp3XCIsXCJtanhcIixcIm1qeVwiLFwibWp6XCIsXCJta2FcIixcIm1rYlwiLFwibWtjXCIsXCJta2VcIixcIm1rZlwiLFwibWtnXCIsXCJta2hcIixcIm1raVwiLFwibWtqXCIsXCJta2tcIixcIm1rbFwiLFwibWttXCIsXCJta25cIixcIm1rb1wiLFwibWtwXCIsXCJta3FcIixcIm1rclwiLFwibWtzXCIsXCJta3RcIixcIm1rdVwiLFwibWt2XCIsXCJta3dcIixcIm1reFwiLFwibWt5XCIsXCJta3pcIixcIm1sYVwiLFwibWxiXCIsXCJtbGNcIixcIm1sZFwiLFwibWxlXCIsXCJtbGZcIixcIm1saFwiLFwibWxpXCIsXCJtbGpcIixcIm1sa1wiLFwibWxsXCIsXCJtbG1cIixcIm1sblwiLFwibWxvXCIsXCJtbHBcIixcIm1scVwiLFwibWxyXCIsXCJtbHNcIixcIm1sdVwiLFwibWx2XCIsXCJtbHdcIixcIm1seFwiLFwibWx6XCIsXCJtbWFcIixcIm1tYlwiLFwibW1jXCIsXCJtbWRcIixcIm1tZVwiLFwibW1mXCIsXCJtbWdcIixcIm1taFwiLFwibW1pXCIsXCJtbWpcIixcIm1ta1wiLFwibW1sXCIsXCJtbW1cIixcIm1tblwiLFwibW1vXCIsXCJtbXBcIixcIm1tcVwiLFwibW1yXCIsXCJtbXRcIixcIm1tdVwiLFwibW12XCIsXCJtbXdcIixcIm1teFwiLFwibW15XCIsXCJtbXpcIixcIm1uYVwiLFwibW5iXCIsXCJtbmNcIixcIm1uZFwiLFwibW5lXCIsXCJtbmZcIixcIm1uZ1wiLFwibW5oXCIsXCJtbmlcIixcIm1ualwiLFwibW5rXCIsXCJtbmxcIixcIm1ubVwiLFwibW5uXCIsXCJtbm9cIixcIm1ucFwiLFwibW5xXCIsXCJtbnJcIixcIm1uc1wiLFwibW50XCIsXCJtbnVcIixcIm1udlwiLFwibW53XCIsXCJtbnhcIixcIm1ueVwiLFwibW56XCIsXCJtb2FcIixcIm1vY1wiLFwibW9kXCIsXCJtb2VcIixcIm1vZlwiLFwibW9nXCIsXCJtb2hcIixcIm1vaVwiLFwibW9qXCIsXCJtb2tcIixcIm1vbVwiLFwibW9vXCIsXCJtb3BcIixcIm1vcVwiLFwibW9yXCIsXCJtb3NcIixcIm1vdFwiLFwibW91XCIsXCJtb3ZcIixcIm1vd1wiLFwibW94XCIsXCJtb3lcIixcIm1velwiLFwibXBhXCIsXCJtcGJcIixcIm1wY1wiLFwibXBkXCIsXCJtcGVcIixcIm1wZ1wiLFwibXBoXCIsXCJtcGlcIixcIm1walwiLFwibXBrXCIsXCJtcGxcIixcIm1wbVwiLFwibXBuXCIsXCJtcG9cIixcIm1wcFwiLFwibXBxXCIsXCJtcHJcIixcIm1wc1wiLFwibXB0XCIsXCJtcHVcIixcIm1wdlwiLFwibXB3XCIsXCJtcHhcIixcIm1weVwiLFwibXB6XCIsXCJtcWFcIixcIm1xYlwiLFwibXFjXCIsXCJtcWVcIixcIm1xZlwiLFwibXFnXCIsXCJtcWhcIixcIm1xaVwiLFwibXFqXCIsXCJtcWtcIixcIm1xbFwiLFwibXFtXCIsXCJtcW5cIixcIm1xb1wiLFwibXFwXCIsXCJtcXFcIixcIm1xclwiLFwibXFzXCIsXCJtcXRcIixcIm1xdVwiLFwibXF2XCIsXCJtcXdcIixcIm1xeFwiLFwibXF5XCIsXCJtcXpcIixcIm1yYVwiLFwibXJiXCIsXCJtcmNcIixcIm1yZFwiLFwibXJlXCIsXCJtcmZcIixcIm1yZ1wiLFwibXJoXCIsXCJtcmpcIixcIm1ya1wiLFwibXJsXCIsXCJtcm1cIixcIm1yblwiLFwibXJvXCIsXCJtcnBcIixcIm1ycVwiLFwibXJyXCIsXCJtcnNcIixcIm1ydFwiLFwibXJ1XCIsXCJtcnZcIixcIm1yd1wiLFwibXJ4XCIsXCJtcnlcIixcIm1yelwiLFwibXNiXCIsXCJtc2NcIixcIm1zZFwiLFwibXNlXCIsXCJtc2ZcIixcIm1zZ1wiLFwibXNoXCIsXCJtc2lcIixcIm1zalwiLFwibXNrXCIsXCJtc2xcIixcIm1zbVwiLFwibXNuXCIsXCJtc29cIixcIm1zcFwiLFwibXNxXCIsXCJtc3JcIixcIm1zc1wiLFwibXN0XCIsXCJtc3VcIixcIm1zdlwiLFwibXN3XCIsXCJtc3hcIixcIm1zeVwiLFwibXN6XCIsXCJtdGFcIixcIm10YlwiLFwibXRjXCIsXCJtdGRcIixcIm10ZVwiLFwibXRmXCIsXCJtdGdcIixcIm10aFwiLFwibXRpXCIsXCJtdGpcIixcIm10a1wiLFwibXRsXCIsXCJtdG1cIixcIm10blwiLFwibXRvXCIsXCJtdHBcIixcIm10cVwiLFwibXRyXCIsXCJtdHNcIixcIm10dFwiLFwibXR1XCIsXCJtdHZcIixcIm10d1wiLFwibXR4XCIsXCJtdHlcIixcIm11YVwiLFwibXViXCIsXCJtdWNcIixcIm11ZFwiLFwibXVlXCIsXCJtdWdcIixcIm11aFwiLFwibXVpXCIsXCJtdWpcIixcIm11a1wiLFwibXVsXCIsXCJtdW1cIixcIm11blwiLFwibXVvXCIsXCJtdXBcIixcIm11cVwiLFwibXVyXCIsXCJtdXNcIixcIm11dFwiLFwibXV1XCIsXCJtdXZcIixcIm11eFwiLFwibXV5XCIsXCJtdXpcIixcIm12YVwiLFwibXZiXCIsXCJtdmRcIixcIm12ZVwiLFwibXZmXCIsXCJtdmdcIixcIm12aFwiLFwibXZpXCIsXCJtdmtcIixcIm12bFwiLFwibXZtXCIsXCJtdm5cIixcIm12b1wiLFwibXZwXCIsXCJtdnFcIixcIm12clwiLFwibXZzXCIsXCJtdnRcIixcIm12dVwiLFwibXZ2XCIsXCJtdndcIixcIm12eFwiLFwibXZ5XCIsXCJtdnpcIixcIm13YVwiLFwibXdiXCIsXCJtd2NcIixcIm13ZFwiLFwibXdlXCIsXCJtd2ZcIixcIm13Z1wiLFwibXdoXCIsXCJtd2lcIixcIm13alwiLFwibXdrXCIsXCJtd2xcIixcIm13bVwiLFwibXduXCIsXCJtd29cIixcIm13cFwiLFwibXdxXCIsXCJtd3JcIixcIm13c1wiLFwibXd0XCIsXCJtd3VcIixcIm13dlwiLFwibXd3XCIsXCJtd3hcIixcIm13eVwiLFwibXd6XCIsXCJteGFcIixcIm14YlwiLFwibXhjXCIsXCJteGRcIixcIm14ZVwiLFwibXhmXCIsXCJteGdcIixcIm14aFwiLFwibXhpXCIsXCJteGpcIixcIm14a1wiLFwibXhsXCIsXCJteG1cIixcIm14blwiLFwibXhvXCIsXCJteHBcIixcIm14cVwiLFwibXhyXCIsXCJteHNcIixcIm14dFwiLFwibXh1XCIsXCJteHZcIixcIm14d1wiLFwibXh4XCIsXCJteHlcIixcIm14elwiLFwibXliXCIsXCJteWNcIixcIm15ZFwiLFwibXllXCIsXCJteWZcIixcIm15Z1wiLFwibXloXCIsXCJteWlcIixcIm15alwiLFwibXlrXCIsXCJteWxcIixcIm15bVwiLFwibXluXCIsXCJteW9cIixcIm15cFwiLFwibXlxXCIsXCJteXJcIixcIm15c1wiLFwibXl0XCIsXCJteXVcIixcIm15dlwiLFwibXl3XCIsXCJteXhcIixcIm15eVwiLFwibXl6XCIsXCJtemFcIixcIm16YlwiLFwibXpjXCIsXCJtemRcIixcIm16ZVwiLFwibXpnXCIsXCJtemhcIixcIm16aVwiLFwibXpqXCIsXCJtemtcIixcIm16bFwiLFwibXptXCIsXCJtem5cIixcIm16b1wiLFwibXpwXCIsXCJtenFcIixcIm16clwiLFwibXpzXCIsXCJtenRcIixcIm16dVwiLFwibXp2XCIsXCJtendcIixcIm16eFwiLFwibXp5XCIsXCJtenpcIl1cbixbIFwibmFcIixcIm5iXCIsXCJuZFwiLFwibmVcIixcIm5nXCIsXCJubFwiLFwibm5cIixcIm5vXCIsXCJuclwiLFwibnZcIixcIm55XCIsXCJuYWFcIixcIm5hYlwiLFwibmFjXCIsXCJuYWRcIixcIm5hZVwiLFwibmFmXCIsXCJuYWdcIixcIm5haFwiLFwibmFpXCIsXCJuYWpcIixcIm5ha1wiLFwibmFsXCIsXCJuYW1cIixcIm5hblwiLFwibmFvXCIsXCJuYXBcIixcIm5hcVwiLFwibmFyXCIsXCJuYXNcIixcIm5hdFwiLFwibmF3XCIsXCJuYXhcIixcIm5heVwiLFwibmF6XCIsXCJuYmFcIixcIm5iYlwiLFwibmJjXCIsXCJuYmRcIixcIm5iZVwiLFwibmJmXCIsXCJuYmdcIixcIm5iaFwiLFwibmJpXCIsXCJuYmpcIixcIm5ia1wiLFwibmJtXCIsXCJuYm5cIixcIm5ib1wiLFwibmJwXCIsXCJuYnFcIixcIm5iclwiLFwibmJzXCIsXCJuYnRcIixcIm5idVwiLFwibmJ2XCIsXCJuYndcIixcIm5ieFwiLFwibmJ5XCIsXCJuY2FcIixcIm5jYlwiLFwibmNjXCIsXCJuY2RcIixcIm5jZVwiLFwibmNmXCIsXCJuY2dcIixcIm5jaFwiLFwibmNpXCIsXCJuY2pcIixcIm5ja1wiLFwibmNsXCIsXCJuY21cIixcIm5jblwiLFwibmNvXCIsXCJuY3BcIixcIm5jcVwiLFwibmNyXCIsXCJuY3NcIixcIm5jdFwiLFwibmN1XCIsXCJuY3hcIixcIm5jelwiLFwibmRhXCIsXCJuZGJcIixcIm5kY1wiLFwibmRkXCIsXCJuZGZcIixcIm5kZ1wiLFwibmRoXCIsXCJuZGlcIixcIm5kalwiLFwibmRrXCIsXCJuZGxcIixcIm5kbVwiLFwibmRuXCIsXCJuZHBcIixcIm5kcVwiLFwibmRyXCIsXCJuZHNcIixcIm5kdFwiLFwibmR1XCIsXCJuZHZcIixcIm5kd1wiLFwibmR4XCIsXCJuZHlcIixcIm5kelwiLFwibmVhXCIsXCJuZWJcIixcIm5lY1wiLFwibmVkXCIsXCJuZWVcIixcIm5lZlwiLFwibmVnXCIsXCJuZWhcIixcIm5laVwiLFwibmVqXCIsXCJuZWtcIixcIm5lbVwiLFwibmVuXCIsXCJuZW9cIixcIm5lcVwiLFwibmVyXCIsXCJuZXNcIixcIm5ldFwiLFwibmV1XCIsXCJuZXZcIixcIm5ld1wiLFwibmV4XCIsXCJuZXlcIixcIm5lelwiLFwibmZhXCIsXCJuZmRcIixcIm5mbFwiLFwibmZyXCIsXCJuZnVcIixcIm5nYVwiLFwibmdiXCIsXCJuZ2NcIixcIm5nZFwiLFwibmdlXCIsXCJuZ2ZcIixcIm5nZ1wiLFwibmdoXCIsXCJuZ2lcIixcIm5nalwiLFwibmdrXCIsXCJuZ2xcIixcIm5nbVwiLFwibmduXCIsXCJuZ29cIixcIm5ncFwiLFwibmdxXCIsXCJuZ3JcIixcIm5nc1wiLFwibmd0XCIsXCJuZ3VcIixcIm5ndlwiLFwibmd3XCIsXCJuZ3hcIixcIm5neVwiLFwibmd6XCIsXCJuaGFcIixcIm5oYlwiLFwibmhjXCIsXCJuaGRcIixcIm5oZVwiLFwibmhmXCIsXCJuaGdcIixcIm5oaFwiLFwibmhpXCIsXCJuaGtcIixcIm5obVwiLFwibmhuXCIsXCJuaG9cIixcIm5ocFwiLFwibmhxXCIsXCJuaHJcIixcIm5odFwiLFwibmh1XCIsXCJuaHZcIixcIm5od1wiLFwibmh4XCIsXCJuaHlcIixcIm5oelwiLFwibmlhXCIsXCJuaWJcIixcIm5pY1wiLFwibmlkXCIsXCJuaWVcIixcIm5pZlwiLFwibmlnXCIsXCJuaWhcIixcIm5paVwiLFwibmlqXCIsXCJuaWtcIixcIm5pbFwiLFwibmltXCIsXCJuaW5cIixcIm5pb1wiLFwibmlxXCIsXCJuaXJcIixcIm5pc1wiLFwibml0XCIsXCJuaXVcIixcIm5pdlwiLFwibml3XCIsXCJuaXhcIixcIm5peVwiLFwibml6XCIsXCJuamFcIixcIm5qYlwiLFwibmpkXCIsXCJuamhcIixcIm5qaVwiLFwibmpqXCIsXCJuamxcIixcIm5qbVwiLFwibmpuXCIsXCJuam9cIixcIm5qclwiLFwibmpzXCIsXCJuanRcIixcIm5qdVwiLFwibmp4XCIsXCJuanlcIixcIm5qelwiLFwibmthXCIsXCJua2JcIixcIm5rY1wiLFwibmtkXCIsXCJua2VcIixcIm5rZlwiLFwibmtnXCIsXCJua2hcIixcIm5raVwiLFwibmtqXCIsXCJua2tcIixcIm5rbVwiLFwibmtuXCIsXCJua29cIixcIm5rcFwiLFwibmtxXCIsXCJua3JcIixcIm5rc1wiLFwibmt0XCIsXCJua3VcIixcIm5rdlwiLFwibmt3XCIsXCJua3hcIixcIm5relwiLFwibmxhXCIsXCJubGNcIixcIm5sZVwiLFwibmxnXCIsXCJubGlcIixcIm5salwiLFwibmxrXCIsXCJubGxcIixcIm5sbVwiLFwibmxuXCIsXCJubG9cIixcIm5scVwiLFwibmxyXCIsXCJubHVcIixcIm5sdlwiLFwibmx3XCIsXCJubHhcIixcIm5seVwiLFwibmx6XCIsXCJubWFcIixcIm5tYlwiLFwibm1jXCIsXCJubWRcIixcIm5tZVwiLFwibm1mXCIsXCJubWdcIixcIm5taFwiLFwibm1pXCIsXCJubWpcIixcIm5ta1wiLFwibm1sXCIsXCJubW1cIixcIm5tblwiLFwibm1vXCIsXCJubXBcIixcIm5tcVwiLFwibm1yXCIsXCJubXNcIixcIm5tdFwiLFwibm11XCIsXCJubXZcIixcIm5td1wiLFwibm14XCIsXCJubXlcIixcIm5telwiLFwibm5hXCIsXCJubmJcIixcIm5uY1wiLFwibm5kXCIsXCJubmVcIixcIm5uZlwiLFwibm5nXCIsXCJubmhcIixcIm5uaVwiLFwibm5qXCIsXCJubmtcIixcIm5ubFwiLFwibm5tXCIsXCJubm5cIixcIm5ucFwiLFwibm5xXCIsXCJubnJcIixcIm5uc1wiLFwibm50XCIsXCJubnVcIixcIm5udlwiLFwibm53XCIsXCJubnhcIixcIm5ueVwiLFwibm56XCIsXCJub2FcIixcIm5vY1wiLFwibm9kXCIsXCJub2VcIixcIm5vZlwiLFwibm9nXCIsXCJub2hcIixcIm5vaVwiLFwibm9qXCIsXCJub2tcIixcIm5vbFwiLFwibm9tXCIsXCJub25cIixcIm5vb1wiLFwibm9wXCIsXCJub3FcIixcIm5vc1wiLFwibm90XCIsXCJub3VcIixcIm5vdlwiLFwibm93XCIsXCJub3lcIixcIm5velwiLFwibnBhXCIsXCJucGJcIixcIm5wZ1wiLFwibnBoXCIsXCJucGlcIixcIm5wbFwiLFwibnBuXCIsXCJucG9cIixcIm5wc1wiLFwibnB1XCIsXCJucHhcIixcIm5weVwiLFwibnFnXCIsXCJucWtcIixcIm5xbFwiLFwibnFtXCIsXCJucW5cIixcIm5xb1wiLFwibnFxXCIsXCJucXRcIixcIm5xeVwiLFwibnJhXCIsXCJucmJcIixcIm5yY1wiLFwibnJlXCIsXCJucmZcIixcIm5yZ1wiLFwibnJpXCIsXCJucmtcIixcIm5ybFwiLFwibnJtXCIsXCJucm5cIixcIm5ycFwiLFwibnJyXCIsXCJucnRcIixcIm5ydVwiLFwibnJ4XCIsXCJucnpcIixcIm5zYVwiLFwibnNiXCIsXCJuc2NcIixcIm5zZFwiLFwibnNlXCIsXCJuc2ZcIixcIm5zZ1wiLFwibnNoXCIsXCJuc2lcIixcIm5za1wiLFwibnNsXCIsXCJuc21cIixcIm5zblwiLFwibnNvXCIsXCJuc3BcIixcIm5zcVwiLFwibnNyXCIsXCJuc3NcIixcIm5zdFwiLFwibnN1XCIsXCJuc3ZcIixcIm5zd1wiLFwibnN4XCIsXCJuc3lcIixcIm5zelwiLFwibnRkXCIsXCJudGVcIixcIm50Z1wiLFwibnRpXCIsXCJudGpcIixcIm50a1wiLFwibnRtXCIsXCJudG9cIixcIm50cFwiLFwibnRyXCIsXCJudHNcIixcIm50dVwiLFwibnR3XCIsXCJudHhcIixcIm50eVwiLFwibnR6XCIsXCJudWFcIixcIm51YlwiLFwibnVjXCIsXCJudWRcIixcIm51ZVwiLFwibnVmXCIsXCJudWdcIixcIm51aFwiLFwibnVpXCIsXCJudWpcIixcIm51a1wiLFwibnVsXCIsXCJudW1cIixcIm51blwiLFwibnVvXCIsXCJudXBcIixcIm51cVwiLFwibnVyXCIsXCJudXNcIixcIm51dFwiLFwibnV1XCIsXCJudXZcIixcIm51d1wiLFwibnV4XCIsXCJudXlcIixcIm51elwiLFwibnZoXCIsXCJudm1cIixcIm52b1wiLFwibndhXCIsXCJud2JcIixcIm53Y1wiLFwibndlXCIsXCJud2dcIixcIm53aVwiLFwibndtXCIsXCJud29cIixcIm53clwiLFwibnd4XCIsXCJud3lcIixcIm54YVwiLFwibnhkXCIsXCJueGVcIixcIm54Z1wiLFwibnhpXCIsXCJueGtcIixcIm54bFwiLFwibnhtXCIsXCJueG5cIixcIm54b1wiLFwibnhxXCIsXCJueHJcIixcIm54dVwiLFwibnh4XCIsXCJueWJcIixcIm55Y1wiLFwibnlkXCIsXCJueWVcIixcIm55ZlwiLFwibnlnXCIsXCJueWhcIixcIm55aVwiLFwibnlqXCIsXCJueWtcIixcIm55bFwiLFwibnltXCIsXCJueW5cIixcIm55b1wiLFwibnlwXCIsXCJueXFcIixcIm55clwiLFwibnlzXCIsXCJueXRcIixcIm55dVwiLFwibnl2XCIsXCJueXdcIixcIm55eFwiLFwibnl5XCIsXCJuemFcIixcIm56YlwiLFwibnpkXCIsXCJuemlcIixcIm56a1wiLFwibnptXCIsXCJuenNcIixcIm56dVwiLFwibnp5XCIsXCJuenpcIl1cbixbIFwib2NcIixcIm9qXCIsXCJvbVwiLFwib3JcIixcIm9zXCIsXCJvYWFcIixcIm9hY1wiLFwib2FyXCIsXCJvYXZcIixcIm9iaVwiLFwib2JrXCIsXCJvYmxcIixcIm9ibVwiLFwib2JvXCIsXCJvYnJcIixcIm9idFwiLFwib2J1XCIsXCJvY2FcIixcIm9jaFwiLFwib2NtXCIsXCJvY29cIixcIm9jdVwiLFwib2RhXCIsXCJvZGtcIixcIm9kdFwiLFwib2R1XCIsXCJvZm9cIixcIm9mc1wiLFwib2Z1XCIsXCJvZ2JcIixcIm9nY1wiLFwib2dlXCIsXCJvZ2dcIixcIm9nb1wiLFwib2d1XCIsXCJvaHRcIixcIm9odVwiLFwib2lhXCIsXCJvaW5cIixcIm9qYlwiLFwib2pjXCIsXCJvamdcIixcIm9qcFwiLFwib2pzXCIsXCJvanZcIixcIm9qd1wiLFwib2thXCIsXCJva2JcIixcIm9rY1wiLFwib2tkXCIsXCJva2VcIixcIm9rZ1wiLFwib2toXCIsXCJva2lcIixcIm9ralwiLFwib2trXCIsXCJva2xcIixcIm9rbVwiLFwib2tuXCIsXCJva29cIixcIm9rclwiLFwib2tzXCIsXCJva3VcIixcIm9rdlwiLFwib2t4XCIsXCJva3pcIixcIm9sYVwiLFwib2xkXCIsXCJvbGVcIixcIm9sa1wiLFwib2xtXCIsXCJvbG9cIixcIm9sclwiLFwib2x0XCIsXCJvbHVcIixcIm9tYVwiLFwib21iXCIsXCJvbWNcIixcIm9tZVwiLFwib21nXCIsXCJvbWlcIixcIm9ta1wiLFwib21sXCIsXCJvbW5cIixcIm9tb1wiLFwib21wXCIsXCJvbXFcIixcIm9tclwiLFwib210XCIsXCJvbXVcIixcIm9tdlwiLFwib213XCIsXCJvbXhcIixcIm9teVwiLFwib25hXCIsXCJvbmJcIixcIm9uZVwiLFwib25nXCIsXCJvbmlcIixcIm9ualwiLFwib25rXCIsXCJvbm5cIixcIm9ub1wiLFwib25wXCIsXCJvbnJcIixcIm9uc1wiLFwib250XCIsXCJvbnVcIixcIm9ud1wiLFwib254XCIsXCJvb2RcIixcIm9vZ1wiLFwib29uXCIsXCJvb3JcIixcIm9vc1wiLFwib3BhXCIsXCJvcGtcIixcIm9wbVwiLFwib3BvXCIsXCJvcHRcIixcIm9weVwiLFwib3JhXCIsXCJvcmNcIixcIm9yZVwiLFwib3JnXCIsXCJvcmhcIixcIm9yblwiLFwib3JvXCIsXCJvcnJcIixcIm9yc1wiLFwib3J0XCIsXCJvcnVcIixcIm9ydlwiLFwib3J3XCIsXCJvcnhcIixcIm9yeVwiLFwib3J6XCIsXCJvc2FcIixcIm9zY1wiLFwib3NpXCIsXCJvc25cIixcIm9zb1wiLFwib3NwXCIsXCJvc3RcIixcIm9zdVwiLFwib3N4XCIsXCJvdGFcIixcIm90YlwiLFwib3RkXCIsXCJvdGVcIixcIm90aVwiLFwib3RrXCIsXCJvdGxcIixcIm90bVwiLFwib3RuXCIsXCJvdG9cIixcIm90cVwiLFwib3RyXCIsXCJvdHNcIixcIm90dFwiLFwib3R1XCIsXCJvdHdcIixcIm90eFwiLFwib3R5XCIsXCJvdHpcIixcIm91YVwiLFwib3ViXCIsXCJvdWVcIixcIm91aVwiLFwib3VtXCIsXCJvdW5cIixcIm92ZFwiLFwib3dpXCIsXCJvd2xcIixcIm95YlwiLFwib3lkXCIsXCJveW1cIixcIm95eVwiLFwib3ptXCJdXG4sWyBcInBhXCIsXCJwaVwiLFwicGxcIixcInBzXCIsXCJwdFwiLFwicGFhXCIsXCJwYWJcIixcInBhY1wiLFwicGFkXCIsXCJwYWVcIixcInBhZlwiLFwicGFnXCIsXCJwYWhcIixcInBhaVwiLFwicGFrXCIsXCJwYWxcIixcInBhbVwiLFwicGFvXCIsXCJwYXBcIixcInBhcVwiLFwicGFyXCIsXCJwYXNcIixcInBhdFwiLFwicGF1XCIsXCJwYXZcIixcInBhd1wiLFwicGF4XCIsXCJwYXlcIixcInBhelwiLFwicGJiXCIsXCJwYmNcIixcInBiZVwiLFwicGJmXCIsXCJwYmdcIixcInBiaFwiLFwicGJpXCIsXCJwYmxcIixcInBibVwiLFwicGJuXCIsXCJwYm9cIixcInBicFwiLFwicGJyXCIsXCJwYnNcIixcInBidFwiLFwicGJ1XCIsXCJwYnZcIixcInBieVwiLFwicGJ6XCIsXCJwY2FcIixcInBjYlwiLFwicGNjXCIsXCJwY2RcIixcInBjZVwiLFwicGNmXCIsXCJwY2dcIixcInBjaFwiLFwicGNpXCIsXCJwY2pcIixcInBja1wiLFwicGNsXCIsXCJwY21cIixcInBjblwiLFwicGNwXCIsXCJwY3JcIixcInBjd1wiLFwicGRhXCIsXCJwZGNcIixcInBkaVwiLFwicGRuXCIsXCJwZG9cIixcInBkdFwiLFwicGR1XCIsXCJwZWFcIixcInBlYlwiLFwicGVkXCIsXCJwZWVcIixcInBlZlwiLFwicGVnXCIsXCJwZWhcIixcInBlaVwiLFwicGVqXCIsXCJwZWtcIixcInBlbFwiLFwicGVtXCIsXCJwZW9cIixcInBlcFwiLFwicGVxXCIsXCJwZXNcIixcInBldlwiLFwicGV4XCIsXCJwZXlcIixcInBlelwiLFwicGZhXCIsXCJwZmVcIixcInBmbFwiLFwicGdhXCIsXCJwZ2RcIixcInBnZ1wiLFwicGdpXCIsXCJwZ2tcIixcInBnbFwiLFwicGduXCIsXCJwZ3NcIixcInBndVwiLFwicGd5XCIsXCJwZ3pcIixcInBoYVwiLFwicGhkXCIsXCJwaGdcIixcInBoaFwiLFwicGhpXCIsXCJwaGtcIixcInBobFwiLFwicGhtXCIsXCJwaG5cIixcInBob1wiLFwicGhxXCIsXCJwaHJcIixcInBodFwiLFwicGh1XCIsXCJwaHZcIixcInBod1wiLFwicGlhXCIsXCJwaWJcIixcInBpY1wiLFwicGlkXCIsXCJwaWVcIixcInBpZlwiLFwicGlnXCIsXCJwaWhcIixcInBpaVwiLFwicGlqXCIsXCJwaWxcIixcInBpbVwiLFwicGluXCIsXCJwaW9cIixcInBpcFwiLFwicGlyXCIsXCJwaXNcIixcInBpdFwiLFwicGl1XCIsXCJwaXZcIixcInBpd1wiLFwicGl4XCIsXCJwaXlcIixcInBpelwiLFwicGp0XCIsXCJwa2FcIixcInBrYlwiLFwicGtjXCIsXCJwa2dcIixcInBraFwiLFwicGtuXCIsXCJwa29cIixcInBrcFwiLFwicGtyXCIsXCJwa3NcIixcInBrdFwiLFwicGt1XCIsXCJwbGFcIixcInBsYlwiLFwicGxjXCIsXCJwbGRcIixcInBsZVwiLFwicGxmXCIsXCJwbGdcIixcInBsaFwiLFwicGxqXCIsXCJwbGtcIixcInBsbFwiLFwicGxuXCIsXCJwbG9cIixcInBscFwiLFwicGxxXCIsXCJwbHJcIixcInBsc1wiLFwicGx0XCIsXCJwbHVcIixcInBsdlwiLFwicGx3XCIsXCJwbHlcIixcInBselwiLFwicG1hXCIsXCJwbWJcIixcInBtY1wiLFwicG1kXCIsXCJwbWVcIixcInBtZlwiLFwicG1oXCIsXCJwbWlcIixcInBtalwiLFwicG1rXCIsXCJwbWxcIixcInBtbVwiLFwicG1uXCIsXCJwbW9cIixcInBtcVwiLFwicG1yXCIsXCJwbXNcIixcInBtdFwiLFwicG11XCIsXCJwbXdcIixcInBteFwiLFwicG15XCIsXCJwbXpcIixcInBuYVwiLFwicG5iXCIsXCJwbmNcIixcInBuZFwiLFwicG5lXCIsXCJwbmdcIixcInBuaFwiLFwicG5pXCIsXCJwbmpcIixcInBua1wiLFwicG5sXCIsXCJwbm1cIixcInBublwiLFwicG5vXCIsXCJwbnBcIixcInBucVwiLFwicG5yXCIsXCJwbnNcIixcInBudFwiLFwicG51XCIsXCJwbnZcIixcInBud1wiLFwicG54XCIsXCJwbnlcIixcInBuelwiLFwicG9jXCIsXCJwb2RcIixcInBvZVwiLFwicG9mXCIsXCJwb2dcIixcInBvaFwiLFwicG9pXCIsXCJwb2tcIixcInBvbVwiLFwicG9uXCIsXCJwb29cIixcInBvcFwiLFwicG9xXCIsXCJwb3NcIixcInBvdFwiLFwicG92XCIsXCJwb3dcIixcInBveFwiLFwicG95XCIsXCJwb3pcIixcInBwYVwiLFwicHBlXCIsXCJwcGlcIixcInBwa1wiLFwicHBsXCIsXCJwcG1cIixcInBwblwiLFwicHBvXCIsXCJwcHBcIixcInBwcVwiLFwicHByXCIsXCJwcHNcIixcInBwdFwiLFwicHB1XCIsXCJwcWFcIixcInBxZVwiLFwicHFtXCIsXCJwcXdcIixcInByYVwiLFwicHJiXCIsXCJwcmNcIixcInByZFwiLFwicHJlXCIsXCJwcmZcIixcInByZ1wiLFwicHJoXCIsXCJwcmlcIixcInBya1wiLFwicHJsXCIsXCJwcm1cIixcInByblwiLFwicHJvXCIsXCJwcnBcIixcInBycVwiLFwicHJyXCIsXCJwcnNcIixcInBydFwiLFwicHJ1XCIsXCJwcndcIixcInByeFwiLFwicHJ5XCIsXCJwcnpcIixcInBzYVwiLFwicHNjXCIsXCJwc2RcIixcInBzZVwiLFwicHNnXCIsXCJwc2hcIixcInBzaVwiLFwicHNsXCIsXCJwc21cIixcInBzblwiLFwicHNvXCIsXCJwc3BcIixcInBzcVwiLFwicHNyXCIsXCJwc3NcIixcInBzdFwiLFwicHN1XCIsXCJwc3dcIixcInBzeVwiLFwicHRhXCIsXCJwdGhcIixcInB0aVwiLFwicHRuXCIsXCJwdG9cIixcInB0cFwiLFwicHRxXCIsXCJwdHJcIixcInB0dFwiLFwicHR1XCIsXCJwdHZcIixcInB0d1wiLFwicHR5XCIsXCJwdWFcIixcInB1YlwiLFwicHVjXCIsXCJwdWRcIixcInB1ZVwiLFwicHVmXCIsXCJwdWdcIixcInB1aVwiLFwicHVqXCIsXCJwdWtcIixcInB1bVwiLFwicHVvXCIsXCJwdXBcIixcInB1cVwiLFwicHVyXCIsXCJwdXRcIixcInB1dVwiLFwicHV3XCIsXCJwdXhcIixcInB1eVwiLFwicHV6XCIsXCJwd2FcIixcInB3YlwiLFwicHdnXCIsXCJwd2lcIixcInB3bVwiLFwicHduXCIsXCJwd29cIixcInB3clwiLFwicHd3XCIsXCJweG1cIixcInB5ZVwiLFwicHltXCIsXCJweW5cIixcInB5c1wiLFwicHl1XCIsXCJweXhcIixcInB5eVwiLFwicHpuXCJdXG4sWyBcInF1XCIsXCJxdWFcIixcInF1YlwiLFwicXVjXCIsXCJxdWRcIixcInF1ZlwiLFwicXVnXCIsXCJxdWhcIixcInF1aVwiLFwicXVrXCIsXCJxdWxcIixcInF1bVwiLFwicXVuXCIsXCJxdXBcIixcInF1cVwiLFwicXVyXCIsXCJxdXNcIixcInF1dlwiLFwicXV3XCIsXCJxdXhcIixcInF1eVwiLFwicXV6XCIsXCJxdmFcIixcInF2Y1wiLFwicXZlXCIsXCJxdmhcIixcInF2aVwiLFwicXZqXCIsXCJxdmxcIixcInF2bVwiLFwicXZuXCIsXCJxdm9cIixcInF2cFwiLFwicXZzXCIsXCJxdndcIixcInF2eVwiLFwicXZ6XCIsXCJxd2FcIixcInF3Y1wiLFwicXdlXCIsXCJxd2hcIixcInF3bVwiLFwicXdzXCIsXCJxd3RcIixcInF4YVwiLFwicXhjXCIsXCJxeGhcIixcInF4bFwiLFwicXhuXCIsXCJxeG9cIixcInF4cFwiLFwicXhxXCIsXCJxeHJcIixcInF4c1wiLFwicXh0XCIsXCJxeHVcIixcInF4d1wiLFwicXlhXCIsXCJxeXBcIl1cbixbIFwicm1cIixcInJuXCIsXCJyb1wiLFwicnVcIixcInJ3XCIsXCJyYWFcIixcInJhYlwiLFwicmFjXCIsXCJyYWRcIixcInJhZlwiLFwicmFnXCIsXCJyYWhcIixcInJhaVwiLFwicmFqXCIsXCJyYWtcIixcInJhbFwiLFwicmFtXCIsXCJyYW5cIixcInJhb1wiLFwicmFwXCIsXCJyYXFcIixcInJhclwiLFwicmFzXCIsXCJyYXRcIixcInJhdVwiLFwicmF2XCIsXCJyYXdcIixcInJheFwiLFwicmF5XCIsXCJyYXpcIixcInJiYlwiLFwicmJrXCIsXCJyYmxcIixcInJicFwiLFwicmNmXCIsXCJyZGJcIixcInJlYVwiLFwicmViXCIsXCJyZWVcIixcInJlZ1wiLFwicmVpXCIsXCJyZWpcIixcInJlbFwiLFwicmVtXCIsXCJyZW5cIixcInJlclwiLFwicmVzXCIsXCJyZXRcIixcInJleVwiLFwicmdhXCIsXCJyZ2VcIixcInJna1wiLFwicmduXCIsXCJyZ3JcIixcInJnc1wiLFwicmd1XCIsXCJyaGdcIixcInJocFwiLFwicmlhXCIsXCJyaWVcIixcInJpZlwiLFwicmlsXCIsXCJyaW1cIixcInJpblwiLFwicmlyXCIsXCJyaXRcIixcInJpdVwiLFwicmpnXCIsXCJyamlcIixcInJqc1wiLFwicmthXCIsXCJya2JcIixcInJraFwiLFwicmtpXCIsXCJya21cIixcInJrdFwiLFwicmt3XCIsXCJybWFcIixcInJtYlwiLFwicm1jXCIsXCJybWRcIixcInJtZVwiLFwicm1mXCIsXCJybWdcIixcInJtaFwiLFwicm1pXCIsXCJybWtcIixcInJtbFwiLFwicm1tXCIsXCJybW5cIixcInJtb1wiLFwicm1wXCIsXCJybXFcIixcInJtclwiLFwicm1zXCIsXCJybXRcIixcInJtdVwiLFwicm12XCIsXCJybXdcIixcInJteFwiLFwicm15XCIsXCJybXpcIixcInJuYVwiLFwicm5kXCIsXCJybmdcIixcInJubFwiLFwicm5uXCIsXCJybnBcIixcInJuclwiLFwicm53XCIsXCJyb2FcIixcInJvYlwiLFwicm9jXCIsXCJyb2RcIixcInJvZVwiLFwicm9mXCIsXCJyb2dcIixcInJvbFwiLFwicm9tXCIsXCJyb29cIixcInJvcFwiLFwicm9yXCIsXCJyb3VcIixcInJvd1wiLFwicnBuXCIsXCJycHRcIixcInJyaVwiLFwicnJvXCIsXCJycnRcIixcInJzYlwiLFwicnNpXCIsXCJyc2xcIixcInJzbVwiLFwicnRjXCIsXCJydGhcIixcInJ0bVwiLFwicnRzXCIsXCJydHdcIixcInJ1YlwiLFwicnVjXCIsXCJydWVcIixcInJ1ZlwiLFwicnVnXCIsXCJydWhcIixcInJ1aVwiLFwicnVrXCIsXCJydW9cIixcInJ1cFwiLFwicnVxXCIsXCJydXRcIixcInJ1dVwiLFwicnV5XCIsXCJydXpcIixcInJ3YVwiLFwicndrXCIsXCJyd2xcIixcInJ3bVwiLFwicndvXCIsXCJyd3JcIixcInJ4ZFwiLFwicnh3XCIsXCJyeW5cIixcInJ5c1wiLFwicnl1XCIsXCJyemhcIl1cbixbIFwic2FcIixcInNjXCIsXCJzZFwiLFwic2VcIixcInNnXCIsXCJzaFwiLFwic2lcIixcInNrXCIsXCJzbFwiLFwic21cIixcInNuXCIsXCJzb1wiLFwic3FcIixcInNyXCIsXCJzc1wiLFwic3RcIixcInN1XCIsXCJzdlwiLFwic3dcIixcInNhYVwiLFwic2FiXCIsXCJzYWNcIixcInNhZFwiLFwic2FlXCIsXCJzYWZcIixcInNhaFwiLFwic2FpXCIsXCJzYWpcIixcInNha1wiLFwic2FsXCIsXCJzYW1cIixcInNhb1wiLFwic2FwXCIsXCJzYXFcIixcInNhclwiLFwic2FzXCIsXCJzYXRcIixcInNhdVwiLFwic2F2XCIsXCJzYXdcIixcInNheFwiLFwic2F5XCIsXCJzYXpcIixcInNiYVwiLFwic2JiXCIsXCJzYmNcIixcInNiZFwiLFwic2JlXCIsXCJzYmZcIixcInNiZ1wiLFwic2JoXCIsXCJzYmlcIixcInNialwiLFwic2JrXCIsXCJzYmxcIixcInNibVwiLFwic2JuXCIsXCJzYm9cIixcInNicFwiLFwic2JxXCIsXCJzYnJcIixcInNic1wiLFwic2J0XCIsXCJzYnVcIixcInNidlwiLFwic2J3XCIsXCJzYnhcIixcInNieVwiLFwic2J6XCIsXCJzY2FcIixcInNjYlwiLFwic2NlXCIsXCJzY2ZcIixcInNjZ1wiLFwic2NoXCIsXCJzY2lcIixcInNja1wiLFwic2NsXCIsXCJzY25cIixcInNjb1wiLFwic2NwXCIsXCJzY3FcIixcInNjc1wiLFwic2N0XCIsXCJzY3VcIixcInNjdlwiLFwic2N3XCIsXCJzY3hcIixcInNkYVwiLFwic2RiXCIsXCJzZGNcIixcInNkZVwiLFwic2RmXCIsXCJzZGdcIixcInNkaFwiLFwic2RqXCIsXCJzZGtcIixcInNkbFwiLFwic2RtXCIsXCJzZG5cIixcInNkb1wiLFwic2RwXCIsXCJzZHFcIixcInNkclwiLFwic2RzXCIsXCJzZHRcIixcInNkdVwiLFwic2R2XCIsXCJzZHhcIixcInNkelwiLFwic2VhXCIsXCJzZWJcIixcInNlY1wiLFwic2VkXCIsXCJzZWVcIixcInNlZlwiLFwic2VnXCIsXCJzZWhcIixcInNlaVwiLFwic2VqXCIsXCJzZWtcIixcInNlbFwiLFwic2VtXCIsXCJzZW5cIixcInNlb1wiLFwic2VwXCIsXCJzZXFcIixcInNlclwiLFwic2VzXCIsXCJzZXRcIixcInNldVwiLFwic2V2XCIsXCJzZXdcIixcInNleVwiLFwic2V6XCIsXCJzZmJcIixcInNmZVwiLFwic2ZtXCIsXCJzZnNcIixcInNmd1wiLFwic2dhXCIsXCJzZ2JcIixcInNnY1wiLFwic2dkXCIsXCJzZ2VcIixcInNnZ1wiLFwic2doXCIsXCJzZ2lcIixcInNnalwiLFwic2drXCIsXCJzZ2xcIixcInNnbVwiLFwic2duXCIsXCJzZ29cIixcInNncFwiLFwic2dyXCIsXCJzZ3NcIixcInNndFwiLFwic2d1XCIsXCJzZ3dcIixcInNneFwiLFwic2d5XCIsXCJzZ3pcIixcInNoYVwiLFwic2hiXCIsXCJzaGNcIixcInNoZFwiLFwic2hlXCIsXCJzaGdcIixcInNoaFwiLFwic2hpXCIsXCJzaGpcIixcInNoa1wiLFwic2hsXCIsXCJzaG1cIixcInNoblwiLFwic2hvXCIsXCJzaHBcIixcInNocVwiLFwic2hyXCIsXCJzaHNcIixcInNodFwiLFwic2h1XCIsXCJzaHZcIixcInNod1wiLFwic2h4XCIsXCJzaHlcIixcInNoelwiLFwic2lhXCIsXCJzaWJcIixcInNpZFwiLFwic2llXCIsXCJzaWZcIixcInNpZ1wiLFwic2loXCIsXCJzaWlcIixcInNpalwiLFwic2lrXCIsXCJzaWxcIixcInNpbVwiLFwic2lvXCIsXCJzaXBcIixcInNpcVwiLFwic2lyXCIsXCJzaXNcIixcInNpdFwiLFwic2l1XCIsXCJzaXZcIixcInNpd1wiLFwic2l4XCIsXCJzaXlcIixcInNpelwiLFwic2phXCIsXCJzamJcIixcInNqZFwiLFwic2plXCIsXCJzamdcIixcInNqa1wiLFwic2psXCIsXCJzam1cIixcInNqblwiLFwic2pvXCIsXCJzanBcIixcInNqclwiLFwic2pzXCIsXCJzanRcIixcInNqdVwiLFwic2p3XCIsXCJza2FcIixcInNrYlwiLFwic2tjXCIsXCJza2RcIixcInNrZVwiLFwic2tmXCIsXCJza2dcIixcInNraFwiLFwic2tpXCIsXCJza2pcIixcInNra1wiLFwic2ttXCIsXCJza25cIixcInNrb1wiLFwic2twXCIsXCJza3FcIixcInNrclwiLFwic2tzXCIsXCJza3RcIixcInNrdVwiLFwic2t2XCIsXCJza3dcIixcInNreFwiLFwic2t5XCIsXCJza3pcIixcInNsYVwiLFwic2xjXCIsXCJzbGRcIixcInNsZVwiLFwic2xmXCIsXCJzbGdcIixcInNsaFwiLFwic2xpXCIsXCJzbGpcIixcInNsbFwiLFwic2xtXCIsXCJzbG5cIixcInNscFwiLFwic2xxXCIsXCJzbHJcIixcInNsc1wiLFwic2x0XCIsXCJzbHVcIixcInNsd1wiLFwic2x4XCIsXCJzbHlcIixcInNselwiLFwic21hXCIsXCJzbWJcIixcInNtY1wiLFwic21kXCIsXCJzbWZcIixcInNtZ1wiLFwic21oXCIsXCJzbWlcIixcInNtalwiLFwic21rXCIsXCJzbWxcIixcInNtbVwiLFwic21uXCIsXCJzbXBcIixcInNtcVwiLFwic21yXCIsXCJzbXNcIixcInNtdFwiLFwic211XCIsXCJzbXZcIixcInNtd1wiLFwic214XCIsXCJzbXlcIixcInNtelwiLFwic25iXCIsXCJzbmNcIixcInNuZVwiLFwic25mXCIsXCJzbmdcIixcInNuaFwiLFwic25pXCIsXCJzbmpcIixcInNua1wiLFwic25sXCIsXCJzbm1cIixcInNublwiLFwic25vXCIsXCJzbnBcIixcInNucVwiLFwic25yXCIsXCJzbnNcIixcInNudVwiLFwic252XCIsXCJzbndcIixcInNueFwiLFwic255XCIsXCJzbnpcIixcInNvYVwiLFwic29iXCIsXCJzb2NcIixcInNvZFwiLFwic29lXCIsXCJzb2dcIixcInNvaFwiLFwic29pXCIsXCJzb2pcIixcInNva1wiLFwic29sXCIsXCJzb25cIixcInNvb1wiLFwic29wXCIsXCJzb3FcIixcInNvclwiLFwic29zXCIsXCJzb3VcIixcInNvdlwiLFwic293XCIsXCJzb3hcIixcInNveVwiLFwic296XCIsXCJzcGJcIixcInNwY1wiLFwic3BkXCIsXCJzcGVcIixcInNwZ1wiLFwic3BpXCIsXCJzcGtcIixcInNwbFwiLFwic3BtXCIsXCJzcG5cIixcInNwb1wiLFwic3BwXCIsXCJzcHFcIixcInNwclwiLFwic3BzXCIsXCJzcHRcIixcInNwdVwiLFwic3B2XCIsXCJzcHhcIixcInNweVwiLFwic3FhXCIsXCJzcWhcIixcInNxalwiLFwic3FrXCIsXCJzcW1cIixcInNxblwiLFwic3FvXCIsXCJzcXFcIixcInNxclwiLFwic3FzXCIsXCJzcXRcIixcInNxdVwiLFwic3F4XCIsXCJzcmFcIixcInNyYlwiLFwic3JjXCIsXCJzcmVcIixcInNyZlwiLFwic3JnXCIsXCJzcmhcIixcInNyaVwiLFwic3JrXCIsXCJzcmxcIixcInNybVwiLFwic3JuXCIsXCJzcm9cIixcInNycVwiLFwic3JyXCIsXCJzcnNcIixcInNydFwiLFwic3J1XCIsXCJzcnZcIixcInNyd1wiLFwic3J4XCIsXCJzcnlcIixcInNyelwiLFwic3NhXCIsXCJzc2JcIixcInNzY1wiLFwic3NkXCIsXCJzc2VcIixcInNzZlwiLFwic3NnXCIsXCJzc2hcIixcInNzaVwiLFwic3NqXCIsXCJzc2tcIixcInNzbFwiLFwic3NtXCIsXCJzc25cIixcInNzb1wiLFwic3NwXCIsXCJzc3FcIixcInNzclwiLFwic3NzXCIsXCJzc3RcIixcInNzdVwiLFwic3N2XCIsXCJzc3hcIixcInNzeVwiLFwic3N6XCIsXCJzdGFcIixcInN0YlwiLFwic3RkXCIsXCJzdGVcIixcInN0ZlwiLFwic3RnXCIsXCJzdGhcIixcInN0aVwiLFwic3RqXCIsXCJzdGtcIixcInN0bFwiLFwic3RtXCIsXCJzdG5cIixcInN0b1wiLFwic3RwXCIsXCJzdHFcIixcInN0clwiLFwic3RzXCIsXCJzdHRcIixcInN0dVwiLFwic3R2XCIsXCJzdHdcIixcInN0eVwiLFwic3VhXCIsXCJzdWJcIixcInN1Y1wiLFwic3VlXCIsXCJzdWdcIixcInN1aVwiLFwic3VqXCIsXCJzdWtcIixcInN1bFwiLFwic3VtXCIsXCJzdW9cIixcInN1cVwiLFwic3VyXCIsXCJzdXNcIixcInN1dFwiLFwic3V2XCIsXCJzdXdcIixcInN1eFwiLFwic3V5XCIsXCJzdXpcIixcInN2YVwiLFwic3ZiXCIsXCJzdmNcIixcInN2ZVwiLFwic3ZrXCIsXCJzdm1cIixcInN2clwiLFwic3ZzXCIsXCJzdnhcIixcInN3YlwiLFwic3djXCIsXCJzd2ZcIixcInN3Z1wiLFwic3doXCIsXCJzd2lcIixcInN3alwiLFwic3drXCIsXCJzd2xcIixcInN3bVwiLFwic3duXCIsXCJzd29cIixcInN3cFwiLFwic3dxXCIsXCJzd3JcIixcInN3c1wiLFwic3d0XCIsXCJzd3VcIixcInN3dlwiLFwic3d3XCIsXCJzd3hcIixcInN3eVwiLFwic3hiXCIsXCJzeGNcIixcInN4ZVwiLFwic3hnXCIsXCJzeGtcIixcInN4bFwiLFwic3htXCIsXCJzeG5cIixcInN4b1wiLFwic3hyXCIsXCJzeHNcIixcInN4dVwiLFwic3h3XCIsXCJzeWFcIixcInN5YlwiLFwic3ljXCIsXCJzeWRcIixcInN5aVwiLFwic3lrXCIsXCJzeWxcIixcInN5bVwiLFwic3luXCIsXCJzeW9cIixcInN5clwiLFwic3lzXCIsXCJzeXdcIixcInN5eFwiLFwic3l5XCIsXCJzemFcIixcInN6YlwiLFwic3pjXCIsXCJzemRcIixcInN6ZVwiLFwic3pnXCIsXCJzemxcIixcInN6blwiLFwic3pwXCIsXCJzenNcIixcInN6dlwiLFwic3p3XCIsXCJzenlcIl1cbixbIFwidGFcIixcInRlXCIsXCJ0Z1wiLFwidGhcIixcInRpXCIsXCJ0a1wiLFwidGxcIixcInRuXCIsXCJ0b1wiLFwidHJcIixcInRzXCIsXCJ0dFwiLFwidHdcIixcInR5XCIsXCJ0YWFcIixcInRhYlwiLFwidGFjXCIsXCJ0YWRcIixcInRhZVwiLFwidGFmXCIsXCJ0YWdcIixcInRhaVwiLFwidGFqXCIsXCJ0YWtcIixcInRhbFwiLFwidGFuXCIsXCJ0YW9cIixcInRhcFwiLFwidGFxXCIsXCJ0YXJcIixcInRhc1wiLFwidGF1XCIsXCJ0YXZcIixcInRhd1wiLFwidGF4XCIsXCJ0YXlcIixcInRhelwiLFwidGJhXCIsXCJ0YmJcIixcInRiY1wiLFwidGJkXCIsXCJ0YmVcIixcInRiZlwiLFwidGJnXCIsXCJ0YmhcIixcInRiaVwiLFwidGJqXCIsXCJ0YmtcIixcInRibFwiLFwidGJtXCIsXCJ0Ym5cIixcInRib1wiLFwidGJwXCIsXCJ0YnFcIixcInRiclwiLFwidGJzXCIsXCJ0YnRcIixcInRidVwiLFwidGJ2XCIsXCJ0YndcIixcInRieFwiLFwidGJ5XCIsXCJ0YnpcIixcInRjYVwiLFwidGNiXCIsXCJ0Y2NcIixcInRjZFwiLFwidGNlXCIsXCJ0Y2ZcIixcInRjZ1wiLFwidGNoXCIsXCJ0Y2lcIixcInRja1wiLFwidGNsXCIsXCJ0Y21cIixcInRjblwiLFwidGNvXCIsXCJ0Y3BcIixcInRjcVwiLFwidGNzXCIsXCJ0Y3RcIixcInRjdVwiLFwidGN3XCIsXCJ0Y3hcIixcInRjeVwiLFwidGN6XCIsXCJ0ZGFcIixcInRkYlwiLFwidGRjXCIsXCJ0ZGRcIixcInRkZVwiLFwidGRmXCIsXCJ0ZGdcIixcInRkaFwiLFwidGRpXCIsXCJ0ZGpcIixcInRka1wiLFwidGRsXCIsXCJ0ZG1cIixcInRkblwiLFwidGRvXCIsXCJ0ZHFcIixcInRkclwiLFwidGRzXCIsXCJ0ZHRcIixcInRkdVwiLFwidGR2XCIsXCJ0ZHhcIixcInRkeVwiLFwidGVhXCIsXCJ0ZWJcIixcInRlY1wiLFwidGVkXCIsXCJ0ZWVcIixcInRlZlwiLFwidGVnXCIsXCJ0ZWhcIixcInRlaVwiLFwidGVrXCIsXCJ0ZW1cIixcInRlblwiLFwidGVvXCIsXCJ0ZXBcIixcInRlcVwiLFwidGVyXCIsXCJ0ZXNcIixcInRldFwiLFwidGV1XCIsXCJ0ZXZcIixcInRld1wiLFwidGV4XCIsXCJ0ZXlcIixcInRlelwiLFwidGZpXCIsXCJ0Zm5cIixcInRmb1wiLFwidGZyXCIsXCJ0ZnRcIixcInRnYVwiLFwidGdiXCIsXCJ0Z2NcIixcInRnZFwiLFwidGdlXCIsXCJ0Z2ZcIixcInRnZ1wiLFwidGdoXCIsXCJ0Z2lcIixcInRnalwiLFwidGduXCIsXCJ0Z29cIixcInRncFwiLFwidGdxXCIsXCJ0Z3JcIixcInRnc1wiLFwidGd0XCIsXCJ0Z3VcIixcInRndlwiLFwidGd3XCIsXCJ0Z3hcIixcInRneVwiLFwidGd6XCIsXCJ0aGNcIixcInRoZFwiLFwidGhlXCIsXCJ0aGZcIixcInRoaFwiLFwidGhpXCIsXCJ0aGtcIixcInRobFwiLFwidGhtXCIsXCJ0aG5cIixcInRocFwiLFwidGhxXCIsXCJ0aHJcIixcInRoc1wiLFwidGh0XCIsXCJ0aHVcIixcInRodlwiLFwidGh3XCIsXCJ0aHhcIixcInRoeVwiLFwidGh6XCIsXCJ0aWFcIixcInRpY1wiLFwidGlkXCIsXCJ0aWVcIixcInRpZlwiLFwidGlnXCIsXCJ0aWhcIixcInRpaVwiLFwidGlqXCIsXCJ0aWtcIixcInRpbFwiLFwidGltXCIsXCJ0aW5cIixcInRpb1wiLFwidGlwXCIsXCJ0aXFcIixcInRpc1wiLFwidGl0XCIsXCJ0aXVcIixcInRpdlwiLFwidGl3XCIsXCJ0aXhcIixcInRpeVwiLFwidGl6XCIsXCJ0amFcIixcInRqZ1wiLFwidGppXCIsXCJ0ampcIixcInRqbFwiLFwidGptXCIsXCJ0am5cIixcInRqb1wiLFwidGpwXCIsXCJ0anNcIixcInRqdVwiLFwidGp3XCIsXCJ0a2FcIixcInRrYlwiLFwidGtkXCIsXCJ0a2VcIixcInRrZlwiLFwidGtnXCIsXCJ0a2tcIixcInRrbFwiLFwidGttXCIsXCJ0a25cIixcInRrcFwiLFwidGtxXCIsXCJ0a3JcIixcInRrc1wiLFwidGt0XCIsXCJ0a3VcIixcInRrdlwiLFwidGt3XCIsXCJ0a3hcIixcInRrelwiLFwidGxhXCIsXCJ0bGJcIixcInRsY1wiLFwidGxkXCIsXCJ0bGZcIixcInRsZ1wiLFwidGxoXCIsXCJ0bGlcIixcInRsalwiLFwidGxrXCIsXCJ0bGxcIixcInRsbVwiLFwidGxuXCIsXCJ0bG9cIixcInRscFwiLFwidGxxXCIsXCJ0bHJcIixcInRsc1wiLFwidGx0XCIsXCJ0bHVcIixcInRsdlwiLFwidGx3XCIsXCJ0bHhcIixcInRseVwiLFwidG1hXCIsXCJ0bWJcIixcInRtY1wiLFwidG1kXCIsXCJ0bWVcIixcInRtZlwiLFwidG1nXCIsXCJ0bWhcIixcInRtaVwiLFwidG1qXCIsXCJ0bWtcIixcInRtbFwiLFwidG1tXCIsXCJ0bW5cIixcInRtb1wiLFwidG1wXCIsXCJ0bXFcIixcInRtclwiLFwidG1zXCIsXCJ0bXRcIixcInRtdVwiLFwidG12XCIsXCJ0bXdcIixcInRteVwiLFwidG16XCIsXCJ0bmFcIixcInRuYlwiLFwidG5jXCIsXCJ0bmRcIixcInRuZVwiLFwidG5mXCIsXCJ0bmdcIixcInRuaFwiLFwidG5pXCIsXCJ0bmtcIixcInRubFwiLFwidG5tXCIsXCJ0bm5cIixcInRub1wiLFwidG5wXCIsXCJ0bnFcIixcInRuclwiLFwidG5zXCIsXCJ0bnRcIixcInRudVwiLFwidG52XCIsXCJ0bndcIixcInRueFwiLFwidG55XCIsXCJ0bnpcIixcInRvYlwiLFwidG9jXCIsXCJ0b2RcIixcInRvZVwiLFwidG9mXCIsXCJ0b2dcIixcInRvaFwiLFwidG9pXCIsXCJ0b2pcIixcInRvbFwiLFwidG9tXCIsXCJ0b29cIixcInRvcFwiLFwidG9xXCIsXCJ0b3JcIixcInRvc1wiLFwidG91XCIsXCJ0b3ZcIixcInRvd1wiLFwidG94XCIsXCJ0b3lcIixcInRvelwiLFwidHBhXCIsXCJ0cGNcIixcInRwZVwiLFwidHBmXCIsXCJ0cGdcIixcInRwaVwiLFwidHBqXCIsXCJ0cGtcIixcInRwbFwiLFwidHBtXCIsXCJ0cG5cIixcInRwb1wiLFwidHBwXCIsXCJ0cHFcIixcInRwclwiLFwidHB0XCIsXCJ0cHVcIixcInRwdlwiLFwidHB3XCIsXCJ0cHhcIixcInRweVwiLFwidHB6XCIsXCJ0cWJcIixcInRxbFwiLFwidHFtXCIsXCJ0cW5cIixcInRxb1wiLFwidHFwXCIsXCJ0cXFcIixcInRxclwiLFwidHF0XCIsXCJ0cXVcIixcInRxd1wiLFwidHJhXCIsXCJ0cmJcIixcInRyY1wiLFwidHJkXCIsXCJ0cmVcIixcInRyZlwiLFwidHJnXCIsXCJ0cmhcIixcInRyaVwiLFwidHJqXCIsXCJ0cmtcIixcInRybFwiLFwidHJtXCIsXCJ0cm5cIixcInRyb1wiLFwidHJwXCIsXCJ0cnFcIixcInRyclwiLFwidHJzXCIsXCJ0cnRcIixcInRydVwiLFwidHJ2XCIsXCJ0cndcIixcInRyeFwiLFwidHJ5XCIsXCJ0cnpcIixcInRzYVwiLFwidHNiXCIsXCJ0c2NcIixcInRzZFwiLFwidHNlXCIsXCJ0c2ZcIixcInRzZ1wiLFwidHNoXCIsXCJ0c2lcIixcInRzalwiLFwidHNrXCIsXCJ0c2xcIixcInRzbVwiLFwidHNwXCIsXCJ0c3FcIixcInRzclwiLFwidHNzXCIsXCJ0c3RcIixcInRzdVwiLFwidHN2XCIsXCJ0c3dcIixcInRzeFwiLFwidHN5XCIsXCJ0c3pcIixcInR0YVwiLFwidHRiXCIsXCJ0dGNcIixcInR0ZFwiLFwidHRlXCIsXCJ0dGZcIixcInR0Z1wiLFwidHRoXCIsXCJ0dGlcIixcInR0alwiLFwidHRrXCIsXCJ0dGxcIixcInR0bVwiLFwidHRuXCIsXCJ0dG9cIixcInR0cFwiLFwidHRxXCIsXCJ0dHJcIixcInR0c1wiLFwidHR0XCIsXCJ0dHVcIixcInR0dlwiLFwidHR3XCIsXCJ0dHlcIixcInR0elwiLFwidHVhXCIsXCJ0dWJcIixcInR1Y1wiLFwidHVkXCIsXCJ0dWVcIixcInR1ZlwiLFwidHVnXCIsXCJ0dWhcIixcInR1aVwiLFwidHVqXCIsXCJ0dWxcIixcInR1bVwiLFwidHVuXCIsXCJ0dW9cIixcInR1cFwiLFwidHVxXCIsXCJ0dXNcIixcInR1dFwiLFwidHV1XCIsXCJ0dXZcIixcInR1d1wiLFwidHV4XCIsXCJ0dXlcIixcInR1elwiLFwidHZhXCIsXCJ0dmRcIixcInR2ZVwiLFwidHZrXCIsXCJ0dmxcIixcInR2bVwiLFwidHZuXCIsXCJ0dm9cIixcInR2c1wiLFwidHZ0XCIsXCJ0dnVcIixcInR2d1wiLFwidHZ4XCIsXCJ0dnlcIixcInR3YVwiLFwidHdiXCIsXCJ0d2NcIixcInR3ZFwiLFwidHdlXCIsXCJ0d2ZcIixcInR3Z1wiLFwidHdoXCIsXCJ0d2xcIixcInR3bVwiLFwidHduXCIsXCJ0d29cIixcInR3cFwiLFwidHdxXCIsXCJ0d3JcIixcInR3dFwiLFwidHd1XCIsXCJ0d3dcIixcInR3eFwiLFwidHd5XCIsXCJ0eGFcIixcInR4YlwiLFwidHhjXCIsXCJ0eGVcIixcInR4Z1wiLFwidHhoXCIsXCJ0eGlcIixcInR4alwiLFwidHhtXCIsXCJ0eG5cIixcInR4b1wiLFwidHhxXCIsXCJ0eHJcIixcInR4c1wiLFwidHh0XCIsXCJ0eHVcIixcInR4eFwiLFwidHh5XCIsXCJ0eWFcIixcInR5ZVwiLFwidHloXCIsXCJ0eWlcIixcInR5alwiLFwidHlsXCIsXCJ0eW5cIixcInR5cFwiLFwidHlyXCIsXCJ0eXNcIixcInR5dFwiLFwidHl1XCIsXCJ0eXZcIixcInR5eFwiLFwidHl5XCIsXCJ0eXpcIixcInR6YVwiLFwidHpoXCIsXCJ0empcIixcInR6bFwiLFwidHptXCIsXCJ0em5cIixcInR6b1wiLFwidHp4XCJdXG4sWyBcInVnXCIsXCJ1a1wiLFwidXJcIixcInV6XCIsXCJ1YW1cIixcInVhblwiLFwidWFyXCIsXCJ1YmFcIixcInViaVwiLFwidWJsXCIsXCJ1YnJcIixcInVidVwiLFwidWJ5XCIsXCJ1ZGFcIixcInVkZVwiLFwidWRnXCIsXCJ1ZGlcIixcInVkalwiLFwidWRsXCIsXCJ1ZG1cIixcInVkdVwiLFwidWVzXCIsXCJ1ZmlcIixcInVnYVwiLFwidWdiXCIsXCJ1Z2VcIixcInVnblwiLFwidWdvXCIsXCJ1Z3lcIixcInVoYVwiLFwidWhuXCIsXCJ1aXNcIixcInVpdlwiLFwidWppXCIsXCJ1a2FcIixcInVrZ1wiLFwidWtoXCIsXCJ1a2lcIixcInVra1wiLFwidWtsXCIsXCJ1a3BcIixcInVrcVwiLFwidWtzXCIsXCJ1a3VcIixcInVrdlwiLFwidWt3XCIsXCJ1a3lcIixcInVsYVwiLFwidWxiXCIsXCJ1bGNcIixcInVsZVwiLFwidWxmXCIsXCJ1bGlcIixcInVsa1wiLFwidWxsXCIsXCJ1bG1cIixcInVsblwiLFwidWx1XCIsXCJ1bHdcIixcInVtYVwiLFwidW1iXCIsXCJ1bWNcIixcInVtZFwiLFwidW1nXCIsXCJ1bWlcIixcInVtbVwiLFwidW1uXCIsXCJ1bW9cIixcInVtcFwiLFwidW1yXCIsXCJ1bXNcIixcInVtdVwiLFwidW5hXCIsXCJ1bmRcIixcInVuZVwiLFwidW5nXCIsXCJ1bmlcIixcInVua1wiLFwidW5tXCIsXCJ1bm5cIixcInVucFwiLFwidW5yXCIsXCJ1bnVcIixcInVueFwiLFwidW56XCIsXCJ1b2tcIixcInVwaVwiLFwidXB2XCIsXCJ1cmFcIixcInVyYlwiLFwidXJjXCIsXCJ1cmVcIixcInVyZlwiLFwidXJnXCIsXCJ1cmhcIixcInVyaVwiLFwidXJqXCIsXCJ1cmtcIixcInVybFwiLFwidXJtXCIsXCJ1cm5cIixcInVyb1wiLFwidXJwXCIsXCJ1cnJcIixcInVydFwiLFwidXJ1XCIsXCJ1cnZcIixcInVyd1wiLFwidXJ4XCIsXCJ1cnlcIixcInVyelwiLFwidXNhXCIsXCJ1c2hcIixcInVzaVwiLFwidXNrXCIsXCJ1c3BcIixcInVzc1wiLFwidXN1XCIsXCJ1dGFcIixcInV0ZVwiLFwidXRoXCIsXCJ1dHBcIixcInV0clwiLFwidXR1XCIsXCJ1dW1cIixcInV1blwiLFwidXVyXCIsXCJ1dXVcIixcInV2ZVwiLFwidXZoXCIsXCJ1dmxcIixcInV3YVwiLFwidXlhXCIsXCJ1em5cIixcInV6c1wiXVxuLFsgXCJ2ZVwiLFwidmlcIixcInZvXCIsXCJ2YWFcIixcInZhZVwiLFwidmFmXCIsXCJ2YWdcIixcInZhaFwiLFwidmFpXCIsXCJ2YWpcIixcInZhbFwiLFwidmFtXCIsXCJ2YW5cIixcInZhb1wiLFwidmFwXCIsXCJ2YXJcIixcInZhc1wiLFwidmF1XCIsXCJ2YXZcIixcInZheVwiLFwidmJiXCIsXCJ2YmtcIixcInZlY1wiLFwidmVkXCIsXCJ2ZWxcIixcInZlbVwiLFwidmVvXCIsXCJ2ZXBcIixcInZlclwiLFwidmdyXCIsXCJ2Z3RcIixcInZpY1wiLFwidmlkXCIsXCJ2aWZcIixcInZpZ1wiLFwidmlsXCIsXCJ2aW5cIixcInZpc1wiLFwidml0XCIsXCJ2aXZcIixcInZrYVwiLFwidmtpXCIsXCJ2a2pcIixcInZra1wiLFwidmtsXCIsXCJ2a21cIixcInZrblwiLFwidmtvXCIsXCJ2a3BcIixcInZrdFwiLFwidmt1XCIsXCJ2a3pcIixcInZscFwiLFwidmxzXCIsXCJ2bWFcIixcInZtYlwiLFwidm1jXCIsXCJ2bWRcIixcInZtZVwiLFwidm1mXCIsXCJ2bWdcIixcInZtaFwiLFwidm1pXCIsXCJ2bWpcIixcInZta1wiLFwidm1sXCIsXCJ2bW1cIixcInZtcFwiLFwidm1xXCIsXCJ2bXJcIixcInZtc1wiLFwidm11XCIsXCJ2bXZcIixcInZtd1wiLFwidm14XCIsXCJ2bXlcIixcInZtelwiLFwidm5rXCIsXCJ2bm1cIixcInZucFwiLFwidm9yXCIsXCJ2b3RcIixcInZyYVwiLFwidnJvXCIsXCJ2cnNcIixcInZydFwiLFwidnNpXCIsXCJ2c2xcIixcInZzdlwiLFwidnRvXCIsXCJ2dW1cIixcInZ1blwiLFwidnV0XCIsXCJ2d2FcIl1cbixbIFwid2FcIixcIndvXCIsXCJ3YWFcIixcIndhYlwiLFwid2FjXCIsXCJ3YWRcIixcIndhZVwiLFwid2FmXCIsXCJ3YWdcIixcIndhaFwiLFwid2FpXCIsXCJ3YWpcIixcIndha1wiLFwid2FsXCIsXCJ3YW1cIixcIndhblwiLFwid2FvXCIsXCJ3YXBcIixcIndhcVwiLFwid2FyXCIsXCJ3YXNcIixcIndhdFwiLFwid2F1XCIsXCJ3YXZcIixcIndhd1wiLFwid2F4XCIsXCJ3YXlcIixcIndhelwiLFwid2JhXCIsXCJ3YmJcIixcIndiZVwiLFwid2JmXCIsXCJ3YmhcIixcIndiaVwiLFwid2JqXCIsXCJ3YmtcIixcIndibFwiLFwid2JtXCIsXCJ3YnBcIixcIndicVwiLFwid2JyXCIsXCJ3YnNcIixcIndidFwiLFwid2J2XCIsXCJ3YndcIixcIndjYVwiLFwid2NpXCIsXCJ3ZGRcIixcIndkZ1wiLFwid2RqXCIsXCJ3ZGtcIixcIndkdVwiLFwid2R5XCIsXCJ3ZWFcIixcIndlY1wiLFwid2VkXCIsXCJ3ZWdcIixcIndlaFwiLFwid2VpXCIsXCJ3ZW1cIixcIndlblwiLFwid2VvXCIsXCJ3ZXBcIixcIndlclwiLFwid2VzXCIsXCJ3ZXRcIixcIndldVwiLFwid2V3XCIsXCJ3ZmdcIixcIndnYVwiLFwid2diXCIsXCJ3Z2dcIixcIndnaVwiLFwid2dvXCIsXCJ3Z3VcIixcIndnd1wiLFwid2d5XCIsXCJ3aGFcIixcIndoZ1wiLFwid2hrXCIsXCJ3aHVcIixcIndpYlwiLFwid2ljXCIsXCJ3aWVcIixcIndpZlwiLFwid2lnXCIsXCJ3aWhcIixcIndpaVwiLFwid2lqXCIsXCJ3aWtcIixcIndpbFwiLFwid2ltXCIsXCJ3aW5cIixcIndpclwiLFwid2l0XCIsXCJ3aXVcIixcIndpdlwiLFwid2l3XCIsXCJ3aXlcIixcIndqYVwiLFwid2ppXCIsXCJ3a2FcIixcIndrYlwiLFwid2tkXCIsXCJ3a2xcIixcIndrclwiLFwid2t1XCIsXCJ3a3dcIixcIndreVwiLFwid2xhXCIsXCJ3bGNcIixcIndsZVwiLFwid2xnXCIsXCJ3bGhcIixcIndsaVwiLFwid2xrXCIsXCJ3bGxcIixcIndsbVwiLFwid2xvXCIsXCJ3bHJcIixcIndsc1wiLFwid2x1XCIsXCJ3bHZcIixcIndsd1wiLFwid2x4XCIsXCJ3bHlcIixcIndtYVwiLFwid21iXCIsXCJ3bWNcIixcIndtZFwiLFwid21lXCIsXCJ3bWdcIixcIndtaFwiLFwid21pXCIsXCJ3bW1cIixcIndtblwiLFwid21vXCIsXCJ3bXNcIixcIndtdFwiLFwid213XCIsXCJ3bXhcIixcInduYlwiLFwid25jXCIsXCJ3bmRcIixcInduZVwiLFwid25nXCIsXCJ3bmlcIixcIndua1wiLFwid25tXCIsXCJ3bm5cIixcIndub1wiLFwid25wXCIsXCJ3bnVcIixcIndud1wiLFwid255XCIsXCJ3b2FcIixcIndvYlwiLFwid29jXCIsXCJ3b2RcIixcIndvZVwiLFwid29mXCIsXCJ3b2dcIixcIndvaVwiLFwid29rXCIsXCJ3b21cIixcIndvblwiLFwid29vXCIsXCJ3b3JcIixcIndvc1wiLFwid293XCIsXCJ3b3lcIixcIndwY1wiLFwid3JhXCIsXCJ3cmJcIixcIndyZFwiLFwid3JnXCIsXCJ3cmhcIixcIndyaVwiLFwid3JrXCIsXCJ3cmxcIixcIndybVwiLFwid3JuXCIsXCJ3cm9cIixcIndycFwiLFwid3JyXCIsXCJ3cnNcIixcIndydVwiLFwid3J2XCIsXCJ3cndcIixcIndyeFwiLFwid3J5XCIsXCJ3cnpcIixcIndzYVwiLFwid3NnXCIsXCJ3c2lcIixcIndza1wiLFwid3NyXCIsXCJ3c3NcIixcIndzdVwiLFwid3N2XCIsXCJ3dGZcIixcInd0aFwiLFwid3RpXCIsXCJ3dGtcIixcInd0bVwiLFwid3R3XCIsXCJ3dWFcIixcInd1YlwiLFwid3VkXCIsXCJ3dWhcIixcInd1bFwiLFwid3VtXCIsXCJ3dW5cIixcInd1clwiLFwid3V0XCIsXCJ3dXVcIixcInd1dlwiLFwid3V4XCIsXCJ3dXlcIixcInd3YVwiLFwid3diXCIsXCJ3d29cIixcInd3clwiLFwid3d3XCIsXCJ3eGFcIixcInd4d1wiLFwid3lhXCIsXCJ3eWJcIixcInd5aVwiLFwid3ltXCIsXCJ3eXJcIixcInd5eVwiXVxuLFsgXCJ4aFwiLFwieGFhXCIsXCJ4YWJcIixcInhhY1wiLFwieGFkXCIsXCJ4YWVcIixcInhhZ1wiLFwieGFpXCIsXCJ4YWpcIixcInhha1wiLFwieGFsXCIsXCJ4YW1cIixcInhhblwiLFwieGFvXCIsXCJ4YXBcIixcInhhcVwiLFwieGFyXCIsXCJ4YXNcIixcInhhdFwiLFwieGF1XCIsXCJ4YXZcIixcInhhd1wiLFwieGF5XCIsXCJ4YmFcIixcInhiYlwiLFwieGJjXCIsXCJ4YmRcIixcInhiZVwiLFwieGJnXCIsXCJ4YmlcIixcInhialwiLFwieGJtXCIsXCJ4Ym5cIixcInhib1wiLFwieGJwXCIsXCJ4YnJcIixcInhid1wiLFwieGJ4XCIsXCJ4YnlcIixcInhjYlwiLFwieGNjXCIsXCJ4Y2VcIixcInhjZ1wiLFwieGNoXCIsXCJ4Y2xcIixcInhjbVwiLFwieGNuXCIsXCJ4Y29cIixcInhjclwiLFwieGN0XCIsXCJ4Y3VcIixcInhjdlwiLFwieGN3XCIsXCJ4Y3lcIixcInhkYVwiLFwieGRjXCIsXCJ4ZGtcIixcInhkbVwiLFwieGRvXCIsXCJ4ZHlcIixcInhlYlwiLFwieGVkXCIsXCJ4ZWdcIixcInhlbFwiLFwieGVtXCIsXCJ4ZXBcIixcInhlclwiLFwieGVzXCIsXCJ4ZXRcIixcInhldVwiLFwieGZhXCIsXCJ4Z2FcIixcInhnYlwiLFwieGdkXCIsXCJ4Z2ZcIixcInhnZ1wiLFwieGdpXCIsXCJ4Z2xcIixcInhnbVwiLFwieGduXCIsXCJ4Z3JcIixcInhndVwiLFwieGd3XCIsXCJ4aGFcIixcInhoY1wiLFwieGhkXCIsXCJ4aGVcIixcInhoclwiLFwieGh0XCIsXCJ4aHVcIixcInhodlwiLFwieGlhXCIsXCJ4aWJcIixcInhpaVwiLFwieGlsXCIsXCJ4aW5cIixcInhpcFwiLFwieGlyXCIsXCJ4aXNcIixcInhpdlwiLFwieGl5XCIsXCJ4amJcIixcInhqdFwiLFwieGthXCIsXCJ4a2JcIixcInhrY1wiLFwieGtkXCIsXCJ4a2VcIixcInhrZlwiLFwieGtnXCIsXCJ4a2hcIixcInhraVwiLFwieGtqXCIsXCJ4a2tcIixcInhrbFwiLFwieGtuXCIsXCJ4a29cIixcInhrcFwiLFwieGtxXCIsXCJ4a3JcIixcInhrc1wiLFwieGt0XCIsXCJ4a3VcIixcInhrdlwiLFwieGt3XCIsXCJ4a3hcIixcInhreVwiLFwieGt6XCIsXCJ4bGFcIixcInhsYlwiLFwieGxjXCIsXCJ4bGRcIixcInhsZVwiLFwieGxnXCIsXCJ4bGlcIixcInhsblwiLFwieGxvXCIsXCJ4bHBcIixcInhsc1wiLFwieGx1XCIsXCJ4bHlcIixcInhtYVwiLFwieG1iXCIsXCJ4bWNcIixcInhtZFwiLFwieG1lXCIsXCJ4bWZcIixcInhtZ1wiLFwieG1oXCIsXCJ4bWpcIixcInhta1wiLFwieG1sXCIsXCJ4bW1cIixcInhtblwiLFwieG1vXCIsXCJ4bXBcIixcInhtcVwiLFwieG1yXCIsXCJ4bXNcIixcInhtdFwiLFwieG11XCIsXCJ4bXZcIixcInhtd1wiLFwieG14XCIsXCJ4bXlcIixcInhtelwiLFwieG5hXCIsXCJ4bmJcIixcInhuZFwiLFwieG5nXCIsXCJ4bmhcIixcInhuaVwiLFwieG5qXCIsXCJ4bmtcIixcInhubVwiLFwieG5uXCIsXCJ4bm9cIixcInhucVwiLFwieG5yXCIsXCJ4bnNcIixcInhudFwiLFwieG51XCIsXCJ4bnlcIixcInhuelwiLFwieG9jXCIsXCJ4b2RcIixcInhvZ1wiLFwieG9pXCIsXCJ4b2tcIixcInhvbVwiLFwieG9uXCIsXCJ4b29cIixcInhvcFwiLFwieG9yXCIsXCJ4b3dcIixcInhwYVwiLFwieHBiXCIsXCJ4cGNcIixcInhwZFwiLFwieHBlXCIsXCJ4cGZcIixcInhwZ1wiLFwieHBoXCIsXCJ4cGlcIixcInhwalwiLFwieHBrXCIsXCJ4cGxcIixcInhwbVwiLFwieHBuXCIsXCJ4cG9cIixcInhwcFwiLFwieHBxXCIsXCJ4cHJcIixcInhwc1wiLFwieHB0XCIsXCJ4cHVcIixcInhwdlwiLFwieHB3XCIsXCJ4cHhcIixcInhweVwiLFwieHB6XCIsXCJ4cWFcIixcInhxdFwiLFwieHJhXCIsXCJ4cmJcIixcInhyZFwiLFwieHJlXCIsXCJ4cmdcIixcInhyaVwiLFwieHJtXCIsXCJ4cm5cIixcInhycVwiLFwieHJyXCIsXCJ4cnRcIixcInhydVwiLFwieHJ3XCIsXCJ4c2FcIixcInhzYlwiLFwieHNjXCIsXCJ4c2RcIixcInhzZVwiLFwieHNoXCIsXCJ4c2lcIixcInhzalwiLFwieHNsXCIsXCJ4c21cIixcInhzblwiLFwieHNvXCIsXCJ4c3BcIixcInhzcVwiLFwieHNyXCIsXCJ4c3NcIixcInhzdVwiLFwieHN2XCIsXCJ4c3lcIixcInh0YVwiLFwieHRiXCIsXCJ4dGNcIixcInh0ZFwiLFwieHRlXCIsXCJ4dGdcIixcInh0aFwiLFwieHRpXCIsXCJ4dGpcIixcInh0bFwiLFwieHRtXCIsXCJ4dG5cIixcInh0b1wiLFwieHRwXCIsXCJ4dHFcIixcInh0clwiLFwieHRzXCIsXCJ4dHRcIixcInh0dVwiLFwieHR2XCIsXCJ4dHdcIixcInh0eVwiLFwieHR6XCIsXCJ4dWFcIixcInh1YlwiLFwieHVkXCIsXCJ4dWdcIixcInh1alwiLFwieHVsXCIsXCJ4dW1cIixcInh1blwiLFwieHVvXCIsXCJ4dXBcIixcInh1clwiLFwieHV0XCIsXCJ4dXVcIixcInh2ZVwiLFwieHZpXCIsXCJ4dm5cIixcInh2b1wiLFwieHZzXCIsXCJ4d2FcIixcInh3Y1wiLFwieHdkXCIsXCJ4d2VcIixcInh3Z1wiLFwieHdqXCIsXCJ4d2tcIixcInh3bFwiLFwieHdvXCIsXCJ4d3JcIixcInh3dFwiLFwieHd3XCIsXCJ4eGJcIixcInh4a1wiLFwieHhtXCIsXCJ4eHJcIixcInh4dFwiLFwieHlhXCIsXCJ4eWJcIixcInh5alwiLFwieHlrXCIsXCJ4eWxcIixcInh5dFwiLFwieHl5XCIsXCJ4emhcIixcInh6bVwiLFwieHpwXCJdXG4sWyBcInlpXCIsXCJ5b1wiLFwieWFhXCIsXCJ5YWJcIixcInlhY1wiLFwieWFkXCIsXCJ5YWVcIixcInlhZlwiLFwieWFnXCIsXCJ5YWhcIixcInlhaVwiLFwieWFqXCIsXCJ5YWtcIixcInlhbFwiLFwieWFtXCIsXCJ5YW5cIixcInlhb1wiLFwieWFwXCIsXCJ5YXFcIixcInlhclwiLFwieWFzXCIsXCJ5YXRcIixcInlhdVwiLFwieWF2XCIsXCJ5YXdcIixcInlheFwiLFwieWF5XCIsXCJ5YXpcIixcInliYVwiLFwieWJiXCIsXCJ5YmRcIixcInliZVwiLFwieWJoXCIsXCJ5YmlcIixcInlialwiLFwieWJrXCIsXCJ5YmxcIixcInlibVwiLFwieWJuXCIsXCJ5Ym9cIixcInlieFwiLFwieWJ5XCIsXCJ5Y2hcIixcInljbFwiLFwieWNuXCIsXCJ5Y3BcIixcInlkYVwiLFwieWRkXCIsXCJ5ZGVcIixcInlkZ1wiLFwieWRrXCIsXCJ5ZHNcIixcInllYVwiLFwieWVjXCIsXCJ5ZWVcIixcInllaVwiLFwieWVqXCIsXCJ5ZWxcIixcInllblwiLFwieWVyXCIsXCJ5ZXNcIixcInlldFwiLFwieWV1XCIsXCJ5ZXZcIixcInlleVwiLFwieWdhXCIsXCJ5Z2lcIixcInlnbFwiLFwieWdtXCIsXCJ5Z3BcIixcInlnclwiLFwieWdzXCIsXCJ5Z3VcIixcInlnd1wiLFwieWhhXCIsXCJ5aGRcIixcInlobFwiLFwieWhzXCIsXCJ5aWFcIixcInlpZlwiLFwieWlnXCIsXCJ5aWhcIixcInlpaVwiLFwieWlqXCIsXCJ5aWtcIixcInlpbFwiLFwieWltXCIsXCJ5aW5cIixcInlpcFwiLFwieWlxXCIsXCJ5aXJcIixcInlpc1wiLFwieWl0XCIsXCJ5aXVcIixcInlpdlwiLFwieWl4XCIsXCJ5aXlcIixcInlpelwiLFwieWthXCIsXCJ5a2dcIixcInlraVwiLFwieWtrXCIsXCJ5a2xcIixcInlrbVwiLFwieWtuXCIsXCJ5a29cIixcInlrclwiLFwieWt0XCIsXCJ5a3VcIixcInlreVwiLFwieWxhXCIsXCJ5bGJcIixcInlsZVwiLFwieWxnXCIsXCJ5bGlcIixcInlsbFwiLFwieWxtXCIsXCJ5bG5cIixcInlsb1wiLFwieWxyXCIsXCJ5bHVcIixcInlseVwiLFwieW1hXCIsXCJ5bWJcIixcInltY1wiLFwieW1kXCIsXCJ5bWVcIixcInltZ1wiLFwieW1oXCIsXCJ5bWlcIixcInlta1wiLFwieW1sXCIsXCJ5bW1cIixcInltblwiLFwieW1vXCIsXCJ5bXBcIixcInltcVwiLFwieW1yXCIsXCJ5bXNcIixcInltdFwiLFwieW14XCIsXCJ5bXpcIixcInluYVwiLFwieW5kXCIsXCJ5bmVcIixcInluZ1wiLFwieW5oXCIsXCJ5bmtcIixcInlubFwiLFwieW5uXCIsXCJ5bm9cIixcInlucVwiLFwieW5zXCIsXCJ5bnVcIixcInlvYlwiLFwieW9nXCIsXCJ5b2lcIixcInlva1wiLFwieW9sXCIsXCJ5b21cIixcInlvblwiLFwieW9zXCIsXCJ5b3RcIixcInlveFwiLFwieW95XCIsXCJ5cGFcIixcInlwYlwiLFwieXBnXCIsXCJ5cGhcIixcInlwa1wiLFwieXBtXCIsXCJ5cG5cIixcInlwb1wiLFwieXBwXCIsXCJ5cHpcIixcInlyYVwiLFwieXJiXCIsXCJ5cmVcIixcInlyaVwiLFwieXJrXCIsXCJ5cmxcIixcInlybVwiLFwieXJuXCIsXCJ5cm9cIixcInlyc1wiLFwieXJ3XCIsXCJ5cnlcIixcInlzY1wiLFwieXNkXCIsXCJ5c2dcIixcInlzbFwiLFwieXNtXCIsXCJ5c25cIixcInlzb1wiLFwieXNwXCIsXCJ5c3JcIixcInlzc1wiLFwieXN5XCIsXCJ5dGFcIixcInl0bFwiLFwieXRwXCIsXCJ5dHdcIixcInl0eVwiLFwieXVhXCIsXCJ5dWJcIixcInl1Y1wiLFwieXVkXCIsXCJ5dWVcIixcInl1ZlwiLFwieXVnXCIsXCJ5dWlcIixcInl1alwiLFwieXVrXCIsXCJ5dWxcIixcInl1bVwiLFwieXVuXCIsXCJ5dXBcIixcInl1cVwiLFwieXVyXCIsXCJ5dXRcIixcInl1dVwiLFwieXV3XCIsXCJ5dXhcIixcInl1eVwiLFwieXV6XCIsXCJ5dmFcIixcInl2dFwiLFwieXdhXCIsXCJ5d2dcIixcInl3bFwiLFwieXduXCIsXCJ5d3FcIixcInl3clwiLFwieXd0XCIsXCJ5d3VcIixcInl3d1wiLFwieXhhXCIsXCJ5eGdcIixcInl4bFwiLFwieXhtXCIsXCJ5eHVcIixcInl4eVwiLFwieXlyXCIsXCJ5eXVcIixcInl5elwiLFwieXpnXCIsXCJ5emtcIl1cbixbIFwiemFcIixcInpoXCIsXCJ6dVwiLFwiemFhXCIsXCJ6YWJcIixcInphY1wiLFwiemFkXCIsXCJ6YWVcIixcInphZlwiLFwiemFnXCIsXCJ6YWhcIixcInphaVwiLFwiemFqXCIsXCJ6YWtcIixcInphbFwiLFwiemFtXCIsXCJ6YW9cIixcInphcFwiLFwiemFxXCIsXCJ6YXJcIixcInphc1wiLFwiemF0XCIsXCJ6YXVcIixcInphdlwiLFwiemF3XCIsXCJ6YXhcIixcInpheVwiLFwiemF6XCIsXCJ6YmFcIixcInpiY1wiLFwiemJlXCIsXCJ6YmxcIixcInpidFwiLFwiemJ1XCIsXCJ6YndcIixcInpjYVwiLFwiemNoXCIsXCJ6ZGpcIixcInplYVwiLFwiemVnXCIsXCJ6ZWhcIixcInplblwiLFwiemdhXCIsXCJ6Z2JcIixcInpnaFwiLFwiemdtXCIsXCJ6Z25cIixcInpnclwiLFwiemhiXCIsXCJ6aGRcIixcInpoaVwiLFwiemhuXCIsXCJ6aHdcIixcInpoeFwiLFwiemlhXCIsXCJ6aWJcIixcInppa1wiLFwiemlsXCIsXCJ6aW1cIixcInppblwiLFwiemlyXCIsXCJ6aXdcIixcInppelwiLFwiemthXCIsXCJ6a2JcIixcInprZFwiLFwiemtnXCIsXCJ6a2hcIixcInpra1wiLFwiemtuXCIsXCJ6a29cIixcInprcFwiLFwiemtyXCIsXCJ6a3RcIixcInprdVwiLFwiemt2XCIsXCJ6a3pcIixcInpsYVwiLFwiemxlXCIsXCJ6bGpcIixcInpsbVwiLFwiemxuXCIsXCJ6bHFcIixcInpsc1wiLFwiemx3XCIsXCJ6bWFcIixcInptYlwiLFwiem1jXCIsXCJ6bWRcIixcInptZVwiLFwiem1mXCIsXCJ6bWdcIixcInptaFwiLFwiem1pXCIsXCJ6bWpcIixcInpta1wiLFwiem1sXCIsXCJ6bW1cIixcInptblwiLFwiem1vXCIsXCJ6bXBcIixcInptcVwiLFwiem1yXCIsXCJ6bXNcIixcInptdFwiLFwiem11XCIsXCJ6bXZcIixcInptd1wiLFwiem14XCIsXCJ6bXlcIixcInptelwiLFwiem5hXCIsXCJ6bmRcIixcInpuZVwiLFwiem5nXCIsXCJ6bmtcIixcInpuc1wiLFwiem9jXCIsXCJ6b2hcIixcInpvbVwiLFwiem9vXCIsXCJ6b3FcIixcInpvclwiLFwiem9zXCIsXCJ6cGFcIixcInpwYlwiLFwienBjXCIsXCJ6cGRcIixcInpwZVwiLFwienBmXCIsXCJ6cGdcIixcInpwaFwiLFwienBpXCIsXCJ6cGpcIixcInpwa1wiLFwienBsXCIsXCJ6cG1cIixcInpwblwiLFwienBvXCIsXCJ6cHBcIixcInpwcVwiLFwienByXCIsXCJ6cHNcIixcInpwdFwiLFwienB1XCIsXCJ6cHZcIixcInpwd1wiLFwienB4XCIsXCJ6cHlcIixcInpwelwiLFwienFlXCIsXCJ6cmFcIixcInpyZ1wiLFwienJuXCIsXCJ6cm9cIixcInpycFwiLFwienJzXCIsXCJ6c2FcIixcInpza1wiLFwienNsXCIsXCJ6c21cIixcInpzclwiLFwienN1XCIsXCJ6dGVcIixcInp0Z1wiLFwienRsXCIsXCJ6dG1cIixcInp0blwiLFwienRwXCIsXCJ6dHFcIixcInp0c1wiLFwienR0XCIsXCJ6dHVcIixcInp0eFwiLFwienR5XCIsXCJ6dWFcIixcInp1aFwiLFwienVtXCIsXCJ6dW5cIixcInp1eVwiLFwiendhXCIsXCJ6eHhcIixcInp5YlwiLFwienlnXCIsXCJ6eWpcIixcInp5blwiLFwienlwXCIsXCJ6emFcIixcInp6alwiXVxuXTtcblxuXG5leHBvcnQgY2xhc3MgTGFuZ1V0aWwge1xuXG4gICAgLyogRGV0ZXJtaW5lIGlmIGdpdmVuIHN0cmluZyBpcyBhIHZhbGlkIEJDUCA0NyBzdHJpbmcgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzQmNwNDcobGFuZ1N0cjogc3RyaW5nKSA6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gL14oKFthLXpBLVpdezIsM30oLVthLXpBLVpdKC1bYS16QS1aXXszfSl7MCwyfSk/fFthLXpBLVpdezR9fFthLXpBLVpdezUsOH0pKC1bYS16QS1aXXs0fSk/KC0oW2EtekEtWl17Mn18WzAtOV17M30pKT8oLShbMC05YS16QS1aXXs1LDh9fFswLTldW2EtekEtWl17M30pKSooLVswLTlhLXd5LXpBLVdZLVpdKC1bYS16QS1aMC05XXsyLDh9KSspKigteCgtW2EtekEtWjAtOV17MSw4fSkrKT98eCgtW2EtekEtWjAtOV17MSw4fSkrfChlbi1HQi1vZWR8aS1hbWl8aS1ibm58aS1kZWZhdWx0fGktZW5vY2hpYW58aS1oYWt8aS1rbGluZ29ufGktbHV4fGktbWluZ298aS1uYXZham98aS1wd258aS10YW98aS10YXl8aS10c3V8c2duLUJFLUZSfHNnbi1CRS1OTHxzZ24tQ0gtREV8YXJ0LWxvamJhbnxjZWwtZ2F1bGlzaHxuby1ib2t8bm8tbnlufHpoLWd1b3l1fHpoLWhha2thfHpoLW1pbnx6aC1taW4tbmFufHpoLXhpYW5nKSkkLy50ZXN0KGxhbmdTdHIpXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyB2YWxpZFByaW1hcnlMYW5nKGxhbmdTdHI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgcHJpbWFyeSA9IGxhbmdTdHIudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKHByaW1hcnkuaW5jbHVkZXMoXCItXCIpKSB7XG4gICAgICAgICAgICBwcmltYXJ5ID0gcHJpbWFyeS5zcGxpdChcIi1cIilbMF07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXByaW1hcnkubWF0Y2goL1thLXpdezIsM30vKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIC8vIHFhYS4ucXR6XG4gICAgICAgIGlmIChwcmltYXJ5Lmxlbmd0aCA9PT0gMyBcbiAgICAgICAgICAgICYmIHByaW1hcnkuY2hhckF0KDApID09PSBcInFcIlxuICAgICAgICAgICAgJiYgcHJpbWFyeS5jaGFyQ29kZUF0KDEpID49IDk3ICYmIHByaW1hcnkuY2hhckNvZGVBdCgxKSA8PSAxMTZcbiAgICAgICAgICAgICYmIHByaW1hcnkuY2hhckNvZGVBdCgyKSA+PSA5NyAmJiBwcmltYXJ5LmNoYXJDb2RlQXQoMikgPD0gMTIyKSB7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbGlkUHJpbWFyeUxhbmdzW3ByaW1hcnkuY2hhckNvZGVBdCgwKS05N10uaW5jbHVkZXMocHJpbWFyeSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBtYXRjaFByaW1hcnlMYW5nKGxhbmcxOiBzdHJpbmcsIGxhbmcyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgbGV0IHByaW1hcnkxID0gbGFuZzE7XG4gICAgICAgIGlmIChwcmltYXJ5MS5pbmNsdWRlcyhcIi1cIikpIHtcbiAgICAgICAgICAgIHByaW1hcnkxID0gcHJpbWFyeTEuc3BsaXQoXCItXCIpWzBdO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHByaW1hcnkyID0gbGFuZzI7XG4gICAgICAgIGlmIChwcmltYXJ5Mi5pbmNsdWRlcyhcIi1cIikpIHtcbiAgICAgICAgICAgIHByaW1hcnkyID0gcHJpbWFyeTIuc3BsaXQoXCItXCIpWzBdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHByaW1hcnkxLnRvTG93ZXJDYXNlKCkgPT09IHByaW1hcnkyLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMC0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgSU1hcHBlciwgSU1hcFJlc3VsdCwgQm91bmRzIH0gZnJvbSBcIi4uL2FwaS9JTWFwcGVyXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vZG9tL0RPTVdhbGtlclwiO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ29tbW9uTWFwcGVyIGltcGxlbWVudHMgSU1hcHBlciB7XG4gICAgYWJzdHJhY3QgZ2V0Um9sZShub2RlOiBOb2RlKSA6IHN0cmluZztcbiAgICBhYnN0cmFjdCBnZXROYW1lc3BhY2UoKSA6IHN0cmluZztcbiAgICBhYnN0cmFjdCBnZXRBdHRyaWJ1dGVzKG5vZGU6IE5vZGUpIDogeyBba2V5OnN0cmluZ106IHN0cmluZyB9O1xuXG4gICAgcHJvdGVjdGVkIGhpZXJhcmNoeVJvbGUgOiBzdHJpbmdbXSA9IG51bGw7XG4gICAgcHJvdGVjdGVkIGhpZXJhcmNoeVBhdGg6IEFycmF5PHtcbiAgICAgICAgcm9sZVBhdGg6IHN0cmluZyxcbiAgICAgICAgcm9sZUNvdW50OiB7XG4gICAgICAgICAgICBbcm9sZTogc3RyaW5nXTogbnVtYmVyXG4gICAgICAgIH1cbiAgICB9PiA9IG51bGw7XG4gICAgcHJvdGVjdGVkIGhpZXJhcmNoeVJlc3VsdHM6IElNYXBSZXN1bHRbXSA9IG51bGw7XG5cbiAgICBnZXRCb3VuZHMobm9kZTogTm9kZSkgOiBCb3VuZHMge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXNldChub2RlOiBOb2RlKSB7XG4gICAgICAgIHRoaXMuaGllcmFyY2h5Um9sZSA9IFtdO1xuICAgICAgICB0aGlzLmhpZXJhcmNoeVJlc3VsdHMgPSBbXTtcbiAgICAgICAgdGhpcy5oaWVyYXJjaHlQYXRoID0gW3tcbiAgICAgICAgICAgIHJvbGVQYXRoOiBcIlwiLFxuICAgICAgICAgICAgcm9sZUNvdW50OiB7fVxuICAgICAgICB9XTtcblxuICAgICAgICBsZXQgYW5jZXN0b3JzIDogTm9kZVtdID0gW107XG4gICAgICAgIGxldCBwYXJlbnQgPSBET01XYWxrZXIucGFyZW50Tm9kZShub2RlKTtcbiAgICAgICAgd2hpbGUgKHBhcmVudCAmJiBwYXJlbnQubm9kZVR5cGUgIT0gOSAvKiBOb2RlLkRPQ1VNRU5UX05PREUgKi8pIHtcbiAgICAgICAgICAgIGFuY2VzdG9ycy5wdXNoKHBhcmVudCk7XG4gICAgICAgICAgICBwYXJlbnQgPSBET01XYWxrZXIucGFyZW50Tm9kZShwYXJlbnQpO1xuICAgICAgICB9XG4gICAgICAgIGFuY2VzdG9ycyA9IGFuY2VzdG9ycy5yZXZlcnNlKCk7XG4gICAgICAgIGZvciAoY29uc3QgYW5jZXN0b3Igb2YgYW5jZXN0b3JzKSB7XG4gICAgICAgICAgICBsZXQgc2libGluZ3MgPSBbXTtcbiAgICAgICAgICAgIGxldCBzaWJsaW5nID0gYW5jZXN0b3IucHJldmlvdXNTaWJsaW5nO1xuICAgICAgICAgICAgd2hpbGUgKHNpYmxpbmcpIHtcbiAgICAgICAgICAgICAgICBzaWJsaW5ncy5wdXNoKHNpYmxpbmcpO1xuICAgICAgICAgICAgICAgIHNpYmxpbmcgPSBzaWJsaW5nLnByZXZpb3VzU2libGluZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNpYmxpbmdzID0gc2libGluZ3MucmV2ZXJzZSgpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBzaWJsaW5nIG9mIHNpYmxpbmdzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wdXNoSGllcmFyY2h5KHNpYmxpbmcpO1xuICAgICAgICAgICAgICAgIHRoaXMucG9wSGllcmFyY2h5KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnB1c2hIaWVyYXJjaHkoYW5jZXN0b3IpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHB1c2hIaWVyYXJjaHkobm9kZTogTm9kZSkge1xuICAgICAgICBsZXQgcm9sZSA6IHN0cmluZyA9IHRoaXMuZ2V0Um9sZShub2RlKSB8fCBudWxsO1xuICAgICAgICB0aGlzLmhpZXJhcmNoeVJvbGUucHVzaChyb2xlKTtcbiAgICAgICAgaWYgKHJvbGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGxldCBwYXJlbnRQYXRoSW5mbyA9IHRoaXMuaGllcmFyY2h5UGF0aFt0aGlzLmhpZXJhcmNoeVBhdGgubGVuZ3RoLTFdO1xuICAgICAgICAgICAgcGFyZW50UGF0aEluZm8ucm9sZUNvdW50W3JvbGVdID0gKHBhcmVudFBhdGhJbmZvLnJvbGVDb3VudFtyb2xlXSB8fCAwKSArIDE7IFxuICAgICAgICAgICAgdGhpcy5oaWVyYXJjaHlQYXRoLnB1c2goe1xuICAgICAgICAgICAgICAgIFwicm9sZVBhdGhcIjogcGFyZW50UGF0aEluZm8ucm9sZVBhdGgrXCIvXCIrcm9sZStcIltcIitwYXJlbnRQYXRoSW5mby5yb2xlQ291bnRbcm9sZV0rXCJdXCIsXG4gICAgICAgICAgICAgICAgXCJyb2xlQ291bnRcIjoge31cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGF0dHIgPSB7fVxuICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgYXR0ciA9IHRoaXMuZ2V0QXR0cmlidXRlcyhub2RlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmhpZXJhcmNoeVJlc3VsdHMucHVzaCh7XG4gICAgICAgICAgICBub2RlOiBub2RlLFxuICAgICAgICAgICAgbmFtZXNwYWNlOiB0aGlzLmdldE5hbWVzcGFjZSgpLFxuICAgICAgICAgICAgcm9sZTogcm9sZSxcbiAgICAgICAgICAgIGF0dHJpYnV0ZXM6IGF0dHIsXG4gICAgICAgICAgICByb2xlUGF0aDogdGhpcy5oaWVyYXJjaHlQYXRoW3RoaXMuaGllcmFyY2h5UGF0aC5sZW5ndGgtMV0ucm9sZVBhdGgsXG4gICAgICAgICAgICBib3VuZHM6IHRoaXMuZ2V0Qm91bmRzKG5vZGUpXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHBvcEhpZXJhcmNoeSgpIHtcbiAgICAgICAgbGV0IHJvbGUgPSB0aGlzLmhpZXJhcmNoeVJvbGUucG9wKCk7XG4gICAgICAgIGlmIChyb2xlICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmhpZXJhcmNoeVBhdGgucG9wKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5oaWVyYXJjaHlSZXN1bHRzLnBvcCgpO1xuICAgIH1cblxuICAgIG9wZW5TY29wZShub2RlOiBOb2RlKTogSU1hcFJlc3VsdFtdIHtcbiAgICAgICAgaWYgKHRoaXMuaGllcmFyY2h5Um9sZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5yZXNldChub2RlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnB1c2hIaWVyYXJjaHkobm9kZSlcblxuICAgICAgICByZXR1cm4gdGhpcy5oaWVyYXJjaHlSZXN1bHRzO1xuICAgIH1cblxuICAgIGNsb3NlU2NvcGUobm9kZTogTm9kZSk6IElNYXBSZXN1bHRbXSB7XG4gICAgICAgIGxldCByZXRWYWwgOiBJTWFwUmVzdWx0W10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCByZXMgb2YgdGhpcy5oaWVyYXJjaHlSZXN1bHRzKSB7XG4gICAgICAgICAgICAvLyBjb25zdCB0ZW1wID0gcmVzLm5vZGU7XG4gICAgICAgICAgICAvLyByZXMubm9kZSA9IG51bGw7XG4gICAgICAgICAgICAvLyBsZXQgY2xvbmVkID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShyZXMpKTtcbiAgICAgICAgICAgIC8vIGNsb25lZC5ub2RlID0gcmVzLm5vZGUgPSB0ZW1wOyBcbiAgICAgICAgICAgIC8vIHJldFZhbC5wdXNoKGNsb25lZCk7XG4gICAgICAgICAgICByZXRWYWwucHVzaChyZXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldFZhbFtyZXRWYWwubGVuZ3RoLTFdLnJvbGUgPSBcIi9cIityZXRWYWxbcmV0VmFsLmxlbmd0aC0xXS5yb2xlXG4gICAgICAgIHRoaXMucG9wSGllcmFyY2h5KCk7XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBJTWFwUmVzdWx0IH0gZnJvbSBcIi4uL2FwaS9JTWFwcGVyXCI7XG5pbXBvcnQgeyBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSUVuZ2luZVwiO1xuXG4vLyBDb250ZXh0IHRoYXQgd2lsbCBjYXVzZSB0aGlzIHJ1bGUgdG8gZXhlY3V0ZS4gXG4vLyBDb250ZXh0IHN5bnRheDpcbi8vICAgVHJpZ2dlcnM6XG4vLyAgICAgYXJpYTpyb2xlIC0gVHJpZ2dlcnMgb24gZWxlbWVudCB3aXRoIEFSSUEgcm9sZSByb2xlXG4vLyAgICAgYXJpYTpyb2xlW2F0dHJpYnV0ZV0gLSBUcmlnZ2VycyBvbiBlbGVtZW50cyB3aXRoIHRoZSBlcXVpdmFsZW50IGxvZ2ljYWwgXG4vLyAgICAgICBhcmlhLSBhdHRyaWJ1dGUgKGUuZy4sIGJ1dHRvbltkaXNhYmxlZF0gd2lsbCB0cmlnZ2VyIG9uIFxuLy8gICAgICAgPGJ1dHRvbiBkaXNhYmxlZD4gb3IgPGRpdiByb2xlPVwiYnV0dG9uXCIgYXJpYS1kaXNhYmxlZD1cInRydWVcIj4pXG4vLyAgICAgcm9sZVthdHRyaWJ1dGU9dmFsdWVdIC0gU2ltaWxhciB0byBhYm92ZSwgd2l0aCBjYXNlLXNlbnNpdGl2ZSBtYXRjaFxuLy8gICAgICAgdG8gdmFsdWVcbi8vICAgICByb2xlW2F0dHJpYnV0ZX52YWx1ZV0gLSBTaW1pbGFyIHRvIGFib3ZlLCB3aXRoIGNhc2UtaW5zZW5zaXRpdmUgbWF0Y2hcbi8vICAgICBkb206ZWxlbWVudCAtIFRyaWdnZXJzIG9uIGFuIGVsZW1lbnQgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWVcbi8vICAgICBkb206ZWxlbWVudFthdHRyaWJ1dGVdIC0gVHJpZ2dlcnMgb24gYSBkb20gZWxlbWVudCB3aXRoIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlXG4vLyAgICAgZG9tOipbYXR0cmlidXRlXSAtIFRyaWdnZXJzIG9uIGFsbCBlbGVtZW50cyB3aXRoIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlXG4vLyAgIENvbWJpbmluZyB0cmlnZ2Vyczpcbi8vICAgICB0cmlnZ2VyMSB0cmlnZ2VyMiAtIFRyaWdnZXJzIG9uIGVsZW1lbnRzIHdpdGggdHJpZ2dlcjIgd2l0aGluIGFuIFxuLy8gICAgICAgZWxlbWVudCB3aXRoIHRyaWdnZXIxXG4vLyAgICAgIXRyaWdnZXIxIHRyaWdnZXIyIC0gVHJpZ2dlcnMgb24gZWxlbWVudHMgd2l0aCB0cmlnZ2VyMiBub3Qgd2l0aGluXG4vLyAgICAgICBlbGVtZW50IHdpdGggdHJpZ2dlcjFcbi8vICAgICB0cmlnZ2VyMT50cmlnZ2VyMiAtIFRyaWdnZXJzIG9uIGVsZW1lbnRzIHdpdGggdHJpZ2dlcjIgd2l0aCBhblxuLy8gICAgICAgYW4gaW1tZWRpYXRlIHBhcmVudCB3aXRoIHRyaWdnZXIxXG4vLyAgICAgdHJpZ2dlcjErdHJpZ2dlcjIgLSBUcmlnZ2VycyBvbiBlbGVtZW50cyB3aXRoIHRyaWdnZXIyIHdpdGggYW5cbi8vICAgICAgIGltbWVkaWF0ZSBwcmV2aW91cyBzaWJsaW5nIHdpdGggdHJpZ2dlcjFcbi8vICAgICB0cmlnZ2VyMX50cmlnZ2VyMiAtIFRyaWdnZXJzIG9uIGVsZW1lbnRzIHdpdGggdHJpZ2dlcjIgd2l0aCBhblxuLy8gICAgICAgc29tZSBlYXJsaWVyIHNpYmxpbmcgd2l0aCB0cmlnZ2VyMVxuLy8gICAgIGNvbnRleHQsY29udGV4dCAtIFRyaWdnZXJzIG9uIGVsZW1lbnRzIHdpdGggZWl0aGVyIGNvbnRleHRcbmV4cG9ydCBjbGFzcyBBdHRySW5mbyB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBpbmNsdXNpdmU6IGJvb2xlYW4sXG4gICAgICAgIHB1YmxpYyBhdHRyOiBzdHJpbmcsXG4gICAgICAgIHB1YmxpYyBlcT86IHN0cmluZyxcbiAgICAgICAgcHVibGljIHZhbHVlPzogc3RyaW5nXG4gICAgKSB7XG4gICAgICAgIGlmICghaW5jbHVzaXZlIFxuICAgICAgICAgICAgICAgICYmICgodHlwZW9mIGVxKSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBlcS5sZW5ndGggPiAwKSlcbiAgICAgICAge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGhhdmUgIWF0dHJcIitlcStcIiBjb250ZXh0XCIpOyAgICBcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5jbHVzaXZlICYmICh0eXBlb2YgZXEpICE9PSBcInVuZGVmaW5lZFwiICYmIGVxLmxlbmd0aCA+IDAgJiYgKCh0eXBlb2YgdmFsdWUpID09PSBcInVuZGVmaW5lZFwiIHx8IHZhbHVlLmxlbmd0aCA9PT0gMCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBoYXZlIGVxdWl2YWxlbmNlIGNoZWNrIHdpdGhvdXQgYSB2YWx1ZVwiKTsgICAgXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgbWF0Y2hlcyhjb250ZXh0OiBJTWFwUmVzdWx0KSB7XG4gICAgICAgIGNvbnN0IHJ1bGVBdHRyUGFydCA9IHRoaXM7IFxuICAgICAgICBjb25zdCBlbGVtQXR0cnMgPSBjb250ZXh0LmF0dHJpYnV0ZXM7XG4gICAgICAgIGlmICghKHJ1bGVBdHRyUGFydC5hdHRyIGluIGVsZW1BdHRycykpIHtcbiAgICAgICAgICAgIHJldHVybiAhcnVsZUF0dHJQYXJ0LmluY2x1c2l2ZVxuICAgICAgICB9IGVsc2UgaWYgKCFydWxlQXR0clBhcnQuaW5jbHVzaXZlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0gZWxzZSBpZiAoIXJ1bGVBdHRyUGFydC5lcSkge1xuICAgICAgICAgICAgLy8gaW5jbHVzaXZlIG1hdGNoIGFuZCBJIGhhdmUgdGhhdCBhdHRyaWJ1dGUgYW5kIG5vIGVxdWl2YWxlbmNlIGRlZmluZWRcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gaW5jbHVzaXZlIG1hdGNoIGFuZCBJIGhhdmUgdGhhdCBhdHRyaWJ1dGUgYW5kIGVxdWl2YWxlbmNlIGRlZmluZWRcbiAgICAgICAgICAgIGNvbnN0IGF0dHJWYWx1ZSA9IGVsZW1BdHRyc1tydWxlQXR0clBhcnQuYXR0cl07XG4gICAgICAgICAgICBpZiAocnVsZUF0dHJQYXJ0LmVxID09PSBcIj1cIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBydWxlQXR0clBhcnQudmFsdWUgPT09IGF0dHJWYWx1ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocnVsZUF0dHJQYXJ0LmVxID09PSBcIiE9XCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcnVsZUF0dHJQYXJ0LnZhbHVlICE9PSBhdHRyVmFsdWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJ1bGVBdHRyUGFydC5lcSA9PT0gXCJ+XCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcnVsZUF0dHJQYXJ0LnZhbHVlID09PSBhdHRyVmFsdWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJ1bGVBdHRyUGFydC5lcSA9PT0gXCIhflwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJ1bGVBdHRyUGFydC52YWx1ZSAhPT0gYXR0clZhbHVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb250ZXh0IGVxdWl2YWxlbmNlIG9wZXJhdG9yIG5vdCBzdXBwb3J0ZWRcIilcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFBhcnRJbmZvIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIGluY2x1c2l2ZTogYm9vbGVhbiwgXG4gICAgICAgIHB1YmxpYyBuYW1lc3BhY2U6IHN0cmluZyxcbiAgICAgICAgcHVibGljIHJvbGU6IHN0cmluZywgXG4gICAgICAgIHB1YmxpYyBhdHRyczogQXR0ckluZm9bXSwgXG4gICAgICAgIHB1YmxpYyBjb25uZWN0b3I6IHN0cmluZykge1xuICAgICAgICAgICAgaWYgKHJvbGUgPT09IFwiKlwiICYmICFpbmNsdXNpdmUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCIhKiBjb250ZXh0IG5vdCBzdXBwb3J0ZWRcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgIHB1YmxpYyBtYXRjaGVzKCBcbiAgICAgICAgY29udGV4dEhpZXI6IFJ1bGVDb250ZXh0SGllcmFyY2h5LFxuICAgICAgICBoaWVyTGV2ZWw6IG51bWJlcikgOiBib29sZWFuIFxuICAgIHtcbiAgICAgICAgY29uc3QgcnVsZVBhcnQgPSB0aGlzO1xuICAgICAgICBsZXQgcnVsZVJvbGVNYXRjaCA9IChydWxlUGFydC5uYW1lc3BhY2UgaW4gY29udGV4dEhpZXIpICYmIGNvbnRleHRIaWVyW3J1bGVQYXJ0Lm5hbWVzcGFjZV1baGllckxldmVsXVxuICAgICAgICAgICAgJiYgKGNvbnRleHRIaWVyW3J1bGVQYXJ0Lm5hbWVzcGFjZV1baGllckxldmVsXS5yb2xlID09PSBydWxlUGFydC5yb2xlXG4gICAgICAgICAgICAgICAgfHwgY29udGV4dEhpZXJbcnVsZVBhcnQubmFtZXNwYWNlXVtoaWVyTGV2ZWxdLnJvbGUgIT09IFwibm9uZVwiICYmIHJ1bGVQYXJ0LnJvbGUgPT09IFwiKlwiKTtcbiAgICAgICAgaWYgKHJ1bGVSb2xlTWF0Y2ggXG4gICAgICAgICAgICAmJiBydWxlUGFydC5yb2xlID09PSBcIipcIiBcbiAgICAgICAgICAgICYmIHJ1bGVQYXJ0Lm5hbWVzcGFjZSA9PT0gXCJkb21cIiBcbiAgICAgICAgICAgICYmIChjb250ZXh0SGllcltydWxlUGFydC5uYW1lc3BhY2VdW2hpZXJMZXZlbF0ucm9sZSA9PT0gXCIjdGV4dFwiXG4gICAgICAgICAgICAgICAgfHwgY29udGV4dEhpZXJbcnVsZVBhcnQubmFtZXNwYWNlXVtoaWVyTGV2ZWxdLnJvbGUgPT09IFwiLyN0ZXh0XCIpKSB7XG4gICAgICAgICAgICBydWxlUm9sZU1hdGNoID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJ1bGVQYXJ0LmluY2x1c2l2ZSAmJiAhcnVsZVJvbGVNYXRjaCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoIXJ1bGVQYXJ0LmluY2x1c2l2ZSAmJiAhcnVsZVJvbGVNYXRjaCkgcmV0dXJuIHRydWU7XG5cbiAgICAgICAgLy8gTWF0Y2ggdGhlIGF0dHJpYnV0ZXNcbiAgICAgICAgY29uc3QgcnVsZUF0dHJzID0gcnVsZVBhcnQuYXR0cnM7XG4gICAgICAgIGNvbnN0IGVsZW1Db250ZXh0ID0gY29udGV4dEhpZXJbcnVsZVBhcnQubmFtZXNwYWNlXVtoaWVyTGV2ZWxdO1xuICAgICAgICBsZXQgbWF0Y2ggPSB0cnVlO1xuICAgICAgICBmb3IgKGNvbnN0IHJ1bGVBdHRyUGFydCBvZiBydWxlQXR0cnMpIHtcbiAgICAgICAgICAgIG1hdGNoID0gbWF0Y2ggJiYgcnVsZUF0dHJQYXJ0Lm1hdGNoZXMoZWxlbUNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcnVsZVBhcnQuaW5jbHVzaXZlKSBtYXRjaCA9ICFtYXRjaDtcbiAgICAgICAgcmV0dXJuIG1hdGNoO1xuICAgIH1cblxufVxuXG5leHBvcnQgY2xhc3MgQ29udGV4dCB7XG4gICAgY29udGV4dEluZm8gOiBQYXJ0SW5mb1tdID0gW11cblxuICAgIGNvbnN0cnVjdG9yKGNvbnRleHQ6IHN0cmluZykge1xuICAgICAgICBsZXQgY29udGV4dEhpZXJNYXRjaGVzIDogc3RyaW5nW10gPSBjb250ZXh0Lm1hdGNoKC8hP1svYS16QS1aOjAtOSpcXC1fXSsoXFxbW15cXF1dK1xcXSkqWyA+K35dPy9nKTtcbiAgICAgICAgbGV0IHJlc3VsdHMgOiBQYXJ0SW5mb1tdID0gW11cbiAgICAgICAgZm9yIChjb25zdCBwYXJ0IG9mIGNvbnRleHRIaWVyTWF0Y2hlcykge1xuICAgICAgICAgICAgbGV0IHBhcnRzID0gcGFydC5tYXRjaCgvKCE/KShbL2EtekEtWjowLTkqXFwtX10rKSgoXFxbW15cXF1dK1xcXSkqKShbID4rfl0/KS8pO1xuICAgICAgICAgICAgbGV0IGF0dHJJbmZvIDogQXR0ckluZm9bXSA9IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBhdHRyUGFydCBvZiBwYXJ0c1szXS5tYXRjaCgvXFxbKFteXFxdXSspXFxdL2cpIHx8IFtdKSB7XG4gICAgICAgICAgICAgICAgbGV0IGF0dHJQYXJ0cyA9IGF0dHJQYXJ0Lm1hdGNoKC9cXFsoIT8pKFthLXo6QS1aKlxcLV9dKykoIT9bPX5dKT8oW15cXF1dKyk/XFxdLyk7XG4gICAgICAgICAgICAgICAgYXR0ckluZm8ucHVzaChuZXcgQXR0ckluZm8oXG4gICAgICAgICAgICAgICAgICAgIGF0dHJQYXJ0c1sxXSAhPT0gXCIhXCIsXG4gICAgICAgICAgICAgICAgICAgIGF0dHJQYXJ0c1syXS50b0xvd2VyQ2FzZSgpLFxuICAgICAgICAgICAgICAgICAgICBhdHRyUGFydHNbM10sXG4gICAgICAgICAgICAgICAgICAgIGF0dHJQYXJ0c1s0XVxuICAgICAgICAgICAgICAgICkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGFydHNbMl0gPSBwYXJ0c1syXS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgY29uc3QgbnNQYXJ0cyA9IHBhcnRzWzJdLnNwbGl0KFwiOlwiKTtcbiAgICAgICAgICAgIGxldCBpbmNsID0gcGFydHNbMV0gIT09IFwiIVwiO1xuICAgICAgICAgICAgY29uc3QgbnMgPSBuc1BhcnRzLnNoaWZ0KCk7XG4gICAgICAgICAgICBsZXQgcm9sZSA9IG5zUGFydHMuam9pbihcIjpcIik7XG4gICAgICAgICAgICBsZXQgcGFydEluZm8gPSBuZXcgUGFydEluZm8oaW5jbCwgbnMsIHJvbGUsIGF0dHJJbmZvLCBwYXJ0c1twYXJ0cy5sZW5ndGgtMV0pO1xuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHBhcnRJbmZvKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbnRleHRJbmZvID0gcmVzdWx0cztcbiAgICB9XG5cbiAgICBzdGF0aWMgY2xlYW5Db250ZXh0KGNvbnRleHQ6IHN0cmluZykgOiBzdHJpbmcge1xuICAgICAgICBjb250ZXh0ID0gY29udGV4dC50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcbiAgICAgICAgY29udGV4dCA9IGNvbnRleHQucmVwbGFjZSgvICshL2csIFwiICFcIik7XG4gICAgICAgIGNvbnRleHQgPSBjb250ZXh0LnJlcGxhY2UoLyArKFs+K34sXSkvZywgXCIkMVwiKTtcbiAgICAgICAgY29udGV4dCA9IGNvbnRleHQucmVwbGFjZSgvKFs+K34sXSkgKy9nLCBcIiQxXCIpO1xuICAgICAgICBjb250ZXh0ID0gY29udGV4dC5yZXBsYWNlKC8gKy9nLCBcIiBcIik7XG4gICAgICAgIHJldHVybiBjb250ZXh0LnRyaW0oKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgcGFyc2UoY29udGV4dDogc3RyaW5nKSB7XG4gICAgICAgIGxldCBjb250ZXh0cyA9IENvbnRleHQuc3BsaXRNdWx0aXBsZShDb250ZXh0LmNsZWFuQ29udGV4dChjb250ZXh0KSk7XG5cbiAgICAgICAgbGV0IHJldFZhbCA6IENvbnRleHRbXSA9IFtdO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29udGV4dHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGxldCBjdHggPSBuZXcgQ29udGV4dChjb250ZXh0c1tpXSk7XG4gICAgICAgICAgICByZXRWYWwucHVzaChjdHgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlcyBpbml0aWFsIHByb2Nlc3Npbmcgb2Ygc3BsaXR0aW5nIG9uIGNvbW1hIC0gY29udGV4dCxjb250ZXh0XG4gICAgICogQHBhcmFtIGNvbnRleHQgXG4gICAgICovXG4gICAgc3RhdGljIHNwbGl0TXVsdGlwbGUoY29udGV4dDogc3RyaW5nKSA6IHN0cmluZ1tdIHtcbiAgICAgICAgbGV0IGNvbnRleHRzID0gW107XG4gICAgICAgIGlmIChjb250ZXh0KSB7XG4gICAgICAgICAgICBpZiAoY29udGV4dC5pbmRleE9mKFwiLFwiKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0cy5wdXNoKGNvbnRleHQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGMgb2YgY29udGV4dC5zcGxpdChcIixcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dHMucHVzaChjKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbnRleHRzO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgIENvcHlyaWdodDo6IDIwMjAtIElCTSwgSW5jXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi9kb20vRE9NV2Fsa2VyXCI7XG5pbXBvcnQgeyBDb250ZXh0IH0gZnJvbSBcIi4vQ29udGV4dFwiO1xuaW1wb3J0IHsgQ29uZmlnIH0gZnJvbSBcIi4uL2NvbmZpZy9Db25maWdcIjtcbmltcG9ydCB7IERPTU1hcHBlciB9IGZyb20gXCIuLi9kb20vRE9NTWFwcGVyXCI7XG5pbXBvcnQgeyBET01VdGlsIH0gZnJvbSBcIi4uL2RvbS9ET01VdGlsXCI7XG5pbXBvcnQgeyBDYWNoZVV0aWwgfSBmcm9tIFwiLi4vLi4vdjQvdXRpbC9DYWNoZVV0aWxcIjtcbmltcG9ydCB7IElzc3VlLCBSdWxlLCBSdWxlQ29udGV4dCwgUnVsZUNvbnRleHRIaWVyYXJjaHksIFJ1bGVSZXN1bHQsIGVSdWxlQ29uZmlkZW5jZSB9IGZyb20gXCIuLi8uLi92NC9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEhlbHBNYXAsIElFbmdpbmUsIE5sc01hcCB9IGZyb20gXCIuLi8uLi92NC9hcGkvSUVuZ2luZVwiO1xuaW1wb3J0IHsgSU1hcHBlciB9IGZyb20gXCIuLi8uLi92NC9hcGkvSU1hcHBlclwiO1xuaW1wb3J0IHsgUmVwb3J0IH0gZnJvbSBcIi4uLy4uL3Y0L2FwaS9JUmVwb3J0XCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3Y0L3V0aWwvVmlzVXRpbFwiO1xuXG5jbGFzcyBXcmFwcGVkUnVsZSB7XG4gICAgbnM6IHN0cmluZztcbiAgICBpZHg/OiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3RvciAocHVibGljIHJ1bGU6IFJ1bGUsIHB1YmxpYyBwYXJzZWRJbmZvIDogQ29udGV4dCkge1xuICAgICAgICB0aGlzLm5zID0gdGhpcy5wYXJzZWRJbmZvLmNvbnRleHRJbmZvW3RoaXMucGFyc2VkSW5mby5jb250ZXh0SW5mby5sZW5ndGgtMV0ubmFtZXNwYWNlO1xuICAgICAgICBDb25maWcuREVCVUcgJiYgY29uc29sZS5sb2coXCJBZGRlZCBSdWxlOlwiLCBydWxlLmlkLCBKU09OLnN0cmluZ2lmeSh0aGlzLnBhcnNlZEluZm8pKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGNvbnZlcnRpbmcgdGhlIG5vZGUgaW50byBhIHNuaXBwZXQgd2hpY2ggY2FuIGJlIGFkZGVkIHRvIHJlcG9ydC5cbiAgICAgKlxuICAgICAqIE5vdGU6IFRoaXMgZnVuY3Rpb24gd2lsbCB0YWtlIHRoZSBub2RlIGFuZCBleHRyYWN0IHRoZSBub2RlIG5hbWUgYW5kIHRoZSBhdHRyaWJ1dGVzIGFuZCBidWlsZCB0aGUgc25pcHBldCBiYXNlZCBvbiB0aGlzLlxuICAgICAqXG4gICAgICogVE9ETzogRnV0dXJlLCBtYXliZSB3ZSBjYW4gZXh0cmFjdCBtb3JlIHRoZW4ganVzdCBzaW5nbGUgbGluZSwgYWRkIG1vcmUgaW5mbyBvciBldmVuIGFkZCBjbG9zaW5nIHRhZ3MgZXRjLi4uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBub2RlIC0gVGhlIGh0bWwgZWxlbWVudCB0byBjb252ZXJ0IGludG8gZWxlbWVudCBzbmlwcGV0IHdpdGggbm9kZSBuYW1lIGFuZCBhdHRyaWJ1dGVzIG9ubHkuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IG5vZGVTbmlwcGV0IC0gcmV0dXJuIHRoZSBlbGVtZW50IHNuaXBwZXQgb2YgdGhlIGVsZW1lbnQgdGhhdCB3YXMgcHJvdmlkZWQgd2hpY2ggb25seSBjb250YWlucyxcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZW5hbWUgYW5kIGF0dHJpYnV0ZXMuIGkuZS4gPHRhYmxlIGlkPVxcXCJsYXlvdXRfdGFibGUxXFxcIiByb2xlPVxcXCJwcmVzZW50YXRpb25cXFwiPlxuICAgICAqXG4gICAgICogQG1lbWJlck9mIHRoaXNcbiAgICAgKi9cbiAgICBzdGF0aWMgY29udmVydE5vZGVUb1NuaXBwZXQobm9kZSA6IEVsZW1lbnQpIHtcbiAgICAgICAgLy8gVmFyaWFibGUgRGVjbGVyYXRpb25cbiAgICAgICAgdmFyIG5vZGVTbmlwcGV0ID0gJyc7XG5cbiAgICAgICAgLy8gRXh0cmFjdCB0aGUgbm9kZSBuYW1lIGFuZCBhZGQgaXQgdG8gdGhlIG5vZGUgc25pcHBldFxuICAgICAgICBub2RlU25pcHBldCArPSAnPCcgKyBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgLy8gRXh0cmFjdCBhbGwgdGhlIG5vZGUgYXR0cmlidXRlcyBhcyBhbiBhcnJheVxuICAgICAgICB2YXIgbm9kZUF0dHJpYnV0ZXMgPSBub2RlLmF0dHJpYnV0ZXM7XG5cbiAgICAgICAgLy8gSW4gdGhlIGNhc2UgdGhlcmUgYXJlIGF0dHJpYnV0ZXMgb24gdGhpcyBub2RlXG4gICAgICAgIGlmIChub2RlQXR0cmlidXRlcyAhPT0gbnVsbCAmJiB0eXBlb2Ygbm9kZUF0dHJpYnV0ZXMgIT09ICd1bmRlZmluZWQnKSB7XG5cbiAgICAgICAgICAgIC8vIExvb3Agb3ZlciBhbGwgdGhlc2VzIGF0dHJpYnV0ZXMgYW5kIGFkZCB0aGUgbmFtZSBhbmQgdmFsdWUgdG8gdGhlIG5vZGVTbmlwcGV0IHdoaWNoIHdpbGwgYmUgcmV0dXJuZWRcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSBub2RlQXR0cmlidXRlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgICAgIGlmIChub2RlQXR0cmlidXRlc1tpXS5uYW1lID09PSBcImRhdGEtbmFtZXdhbGtcIikgY29udGludWU7XG4gICAgICAgICAgICAgICAgLy8gQWRkIHRoZSBhdHRyaWJ1dGUgbmFtZSBhbmQgdmFsdWUuXG4gICAgICAgICAgICAgICAgbm9kZVNuaXBwZXQgKz0gJyAnICsgbm9kZUF0dHJpYnV0ZXNbaV0ubmFtZSArICc9XCInICsgbm9kZUF0dHJpYnV0ZXNbaV0udmFsdWUgKyAnXCInO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2xvc2UgdGhlIG5vZGVcbiAgICAgICAgbm9kZVNuaXBwZXQgKz0gJz4nO1xuXG4gICAgICAgIC8vIFJldHVybiB0aGUgbm9kZSBzbmlwcGV0XG4gICAgICAgIHJldHVybiBub2RlU25pcHBldDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBmaW5kaW5nIHRoZSBzb3VyY2UgbG9jYXRpb24gZm9yIGEgbm9kZSwgd2hpY2ggY2FuIGJlIGFkZGVkIHRvIGEgcmVwb3J0LlxuICAgICAqIFN1cHBvcnRzIGRlYnVnIGRpcmVjdGl2ZXMgaW4gdGhlIGZvbGxvd2luZyBmb3JtczpcbiAgICAgKiAgIDEuIEFuIGF0dHJpYnV0ZSBvbiB0aGUgZWxlbWVudCBpdHNlbGY6XG4gICAgICogICAgICAgIGlibS1hMTF5LWRlYnVnPVwiZmlsZS50czoxMDo1XCJcbiAgICAgKiAgIDIuIEEgY29tbWVudCBub2RlIHByZWNlZGluZyB0aGUgZWxlbWVudCAoYXMgYSBzaWJsaW5nIG9yIGFuY2VzdG9yIHNpYmxpbmcpOlxuICAgICAqICAgICAgICA8IS0tIGlibS1hMTF5LWRlYnVnOiBmaWxlLnRzOjEwOjUgLS0+XG4gICAgICogICAzLiBBIHdyYXBwZXIgZWxlbWVudCAoZS5nLiBkaXYpIHdob3NlIGZpcnN0IG5vbi13aGl0ZXNwYWNlIGNoaWxkIGlzIHN1Y2ggYSBjb21tZW50IG5vZGUuXG4gICAgICogICA0LiBBbiBhbmNlc3RvciBlbGVtZW50IHRoYXQgY2FycmllcyB0aGUgaWJtLWExMXktZGVidWcgYXR0cmlidXRlLlxuICAgICAqXG4gICAgICogVHJhdmVyc2FsOiBjaGVja3MgdGhlIG5vZGUgaXRzZWxmIGZvciBhbiBpbmxpbmUgYXR0cmlidXRlLCB0aGVuIHNjYW5zIHByZXZpb3VzIHNpYmxpbmdzIGF0XG4gICAgICogZWFjaCBhbmNlc3RvciBsZXZlbCB1cHdhcmQgKGFsc28gY2hlY2tpbmcgZWFjaCBhbmNlc3RvciBlbGVtZW50J3Mgb3duIGlubGluZSBhdHRyaWJ1dGUpLFxuICAgICAqIHN0b3BwaW5nIGlmIGEgYmxhbmsgb3IgJ2VuZCcgbWFya2VyIGlzIGZvdW5kLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtOb2RlfSBub2RlIC0gVGhlIERPTSBub2RlIHRvIGZpbmQgc291cmNlIGluZm8gZm9yXG4gICAgICogQHJldHVybiB7c3RyaW5nIHwgbnVsbH0gLSBUaGUgc291cmNlIGxvY2F0aW9uIHN0cmluZywgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiB0aGlzXG4gICAgICovXG4gICAgc3RhdGljIGNvbnZlcnROb2RlVG9Tb3VyY2Uobm9kZTogTm9kZSwgZW5hYmxlZDogYm9vbGVhbj1mYWxzZSk6IHN0cmluZyB7XG4gICAgICAgIC8vY29uc29sZS5sb2coXCJTb3VyY2UgTWFwIGVuYWJsZWQ6XCIsIGVuYWJsZWQpO1xuICAgICAgICBpZiAoIWVuYWJsZWQgfHwgIW5vZGUpIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgREVCVUdfRElSRUNUSVZFID0gXCJpYm0tYTExeS1kZWJ1Z1wiO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUeXBlZCByZXN1bHQgZnJvbSBleHRyYWN0RGlyZWN0aXZlIHRvIGF2b2lkIHNlbnRpbmVsIHN0cmluZyBjb2xsaXNpb25zLlxuICAgICAgICAgKiAgIHsgZm91bmQ6IGZhbHNlIH0gICAgICAgICAgICDigJQgbm8gZGlyZWN0aXZlIG9uIHRoaXMgbm9kZVxuICAgICAgICAgKiAgIHsgZm91bmQ6IHRydWUsIHN0b3A6IHRydWUgfSDigJQgZGlyZWN0aXZlIGlzIGEgc2NvcGUtZW5kIG1hcmtlciAoYmxhbmsgb3IgJ2VuZCcpXG4gICAgICAgICAqICAgeyBmb3VuZDogdHJ1ZSwgc3RvcDogZmFsc2UsIHNvdXJjZTogc3RyaW5nIH0g4oCUIHZhbGlkIHNvdXJjZSBsb2NhdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgdHlwZSBEaXJlY3RpdmVSZXN1bHQgPVxuICAgICAgICAgICAgfCB7IGZvdW5kOiBmYWxzZSB9XG4gICAgICAgICAgICB8IHsgZm91bmQ6IHRydWU7IHN0b3A6IHRydWUgfVxuICAgICAgICAgICAgfCB7IGZvdW5kOiB0cnVlOyBzdG9wOiBmYWxzZTsgc291cmNlOiBzdHJpbmcgfTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogUGFyc2VzIGEgc291cmNlIHN0cmluZyBpbnRvIGEgRGlyZWN0aXZlUmVzdWx0LlxuICAgICAgICAgKiBUaGUgc291cmNlIGlzIHRoZSBmaW5hbCByZXNvbHZlZCB2YWx1ZSDigJQgYWZ0ZXIgYW55ICc6JyBzZXBhcmF0b3IgaGFzIGFscmVhZHkgYmVlbiBzdHJpcHBlZC5cbiAgICAgICAgICogQSBibGFuayB2YWx1ZSBvciB0aGUgZXhhY3Qgd29yZCAnZW5kJyAoY2FzZS1pbnNlbnNpdGl2ZSkgaXMgYSBzdG9wIG1hcmtlci5cbiAgICAgICAgICovXG4gICAgICAgIGNvbnN0IHBhcnNlU291cmNlID0gZnVuY3Rpb24gKHNvdXJjZTogc3RyaW5nKTogRGlyZWN0aXZlUmVzdWx0IHtcbiAgICAgICAgICAgIGlmICghc291cmNlIHx8IHNvdXJjZS50b0xvd2VyQ2FzZSgpID09PSAnZW5kJykge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IGZvdW5kOiB0cnVlLCBzdG9wOiB0cnVlIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyBmb3VuZDogdHJ1ZSwgc3RvcDogZmFsc2UsIHNvdXJjZSB9O1xuICAgICAgICB9O1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFeHRyYWN0cyB0aGUgZGVidWctZGlyZWN0aXZlIGNvbW1lbnQgdmFsdWUgZnJvbSBhIG5vZGUuXG4gICAgICAgICAqIEhhbmRsZXM6XG4gICAgICAgICAqICAgLSBBIGNvbW1lbnQgbm9kZSBkaXJlY3RseVxuICAgICAgICAgKiAgIC0gQSB3cmFwcGVyIGVsZW1lbnQgKGUuZy4gPGRpdj4pIHdob3NlIGZpcnN0IG5vbi13aGl0ZXNwYWNlIGNoaWxkIGlzIGEgY29tbWVudCBub2RlXG4gICAgICAgICAqXG4gICAgICAgICAqIFJldHVybnMgeyBmb3VuZDogdHJ1ZSwgc3RvcDogdHJ1ZSB9IGlmIHRoZSBkaXJlY3RpdmUgaXMgYmxhbmsgb3IgZXhhY3RseSAnZW5kJyxcbiAgICAgICAgICogcmV0dXJucyB7IGZvdW5kOiB0cnVlLCBzdG9wOiBmYWxzZSwgc291cmNlIH0gaWYgYSB2YWxpZCBzb3VyY2UgaXMgZm91bmQsXG4gICAgICAgICAqIG9yIHJldHVybnMgeyBmb3VuZDogZmFsc2UgfSBpZiBubyBkaXJlY3RpdmUgaXMgcHJlc2VudCBvbiB0aGlzIG5vZGUuXG4gICAgICAgICAqL1xuICAgICAgICBjb25zdCBleHRyYWN0RGlyZWN0aXZlID0gZnVuY3Rpb24gKGVsZW06IE5vZGUgfCBudWxsKTogRGlyZWN0aXZlUmVzdWx0IHtcbiAgICAgICAgICAgIGlmICghZWxlbSkgcmV0dXJuIHsgZm91bmQ6IGZhbHNlIH07XG5cbiAgICAgICAgICAgIGxldCBjb21tZW50VmFsdWU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gICAgICAgICAgICBpZiAoZWxlbS5ub2RlVHlwZSA9PT0gTm9kZS5DT01NRU5UX05PREUpIHtcbiAgICAgICAgICAgICAgICAvLyBEaXJlY3QgY29tbWVudCBub2RlXG4gICAgICAgICAgICAgICAgY29tbWVudFZhbHVlID0gZWxlbS5ub2RlVmFsdWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW0ubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgLy8gRWxlbWVudCB3cmFwcGVyIChlLmcuIDxkaXY+PCEtLSBpYm0tYTExeS1kZWJ1ZzogLi4uIC0tPjwvZGl2PilcbiAgICAgICAgICAgICAgICAvLyBGaW5kIHRoZSBmaXJzdCBub24td2hpdGVzcGFjZSBjaGlsZCBub2RlXG4gICAgICAgICAgICAgICAgbGV0IGNoaWxkID0gZWxlbS5maXJzdENoaWxkO1xuICAgICAgICAgICAgICAgIHdoaWxlIChjaGlsZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIHB1cmUgd2hpdGVzcGFjZSB0ZXh0IG5vZGVzXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQubm9kZVZhbHVlICYmIGNoaWxkLm5vZGVWYWx1ZS50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vbi13aGl0ZXNwYWNlIHRleHQgYmVmb3JlIGEgY29tbWVudCDigJQgbm90IGEgZGlyZWN0aXZlIHdyYXBwZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGlsZC5ub2RlVHlwZSA9PT0gTm9kZS5DT01NRU5UX05PREUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnRWYWx1ZSA9IGNoaWxkLm5vZGVWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQW55IG90aGVyIG5vZGUgdHlwZSBiZWZvcmUgYSBjb21tZW50IOKAlCBub3QgYSBkaXJlY3RpdmUgd3JhcHBlclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2hpbGQgPSBjaGlsZC5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjb21tZW50VmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0cmltbWVkID0gY29tbWVudFZhbHVlLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAvLyBNYXRjaCBleGFjdGx5IFwiaWJtLWExMXktZGVidWdcIiBmb2xsb3dlZCBieSBlbmQtb2Ytc3RyaW5nLCB3aGl0ZXNwYWNlLCBvciAnOidcbiAgICAgICAgICAgICAgICAvLyBUaGlzIHByZXZlbnRzIFwiaWJtLWExMXktZGVidWctZXh0cmFcIiBmcm9tIGJlaW5nIHRyZWF0ZWQgYXMgYSBkaXJlY3RpdmUuXG4gICAgICAgICAgICAgICAgaWYgKHRyaW1tZWQgPT09IERFQlVHX0RJUkVDVElWRSB8fFxuICAgICAgICAgICAgICAgICAgICB0cmltbWVkLnN0YXJ0c1dpdGgoREVCVUdfRElSRUNUSVZFICsgJzonKSB8fFxuICAgICAgICAgICAgICAgICAgICB0cmltbWVkLnN0YXJ0c1dpdGgoREVCVUdfRElSRUNUSVZFICsgJyAnKSB8fFxuICAgICAgICAgICAgICAgICAgICB0cmltbWVkLnN0YXJ0c1dpdGgoREVCVUdfRElSRUNUSVZFICsgJ1xcdCcpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFN0cmlwIHRoZSBkaXJlY3RpdmUgbmFtZSBhbmQgb3B0aW9uYWwgbGVhZGluZyB3aGl0ZXNwYWNlXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFmdGVyRGlyZWN0aXZlID0gdHJpbW1lZC5zdWJzdHJpbmcoREVCVUdfRElSRUNUSVZFLmxlbmd0aCkudHJpbVN0YXJ0KCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIFN0cmlwIGEgc2luZ2xlIGxlYWRpbmcgJzonIHNlcGFyYXRvciBpZiBwcmVzZW50XG4gICAgICAgICAgICAgICAgICAgIC8vIChlLmcuIFwiaWJtLWExMXktZGVidWc6IGZpbGUudHM6MTA6NVwiIOKGkiBhZnRlckRpcmVjdGl2ZSA9IFwiOiBmaWxlLnRzOjEwOjVcIilcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc291cmNlID0gYWZ0ZXJEaXJlY3RpdmUuc3RhcnRzV2l0aCgnOicpXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGFmdGVyRGlyZWN0aXZlLnN1YnN0cmluZygxKS50cmltKClcbiAgICAgICAgICAgICAgICAgICAgICAgIDogYWZ0ZXJEaXJlY3RpdmUudHJpbSgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VTb3VyY2Uoc291cmNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB7IGZvdW5kOiBmYWxzZSB9O1xuICAgICAgICB9O1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIHRoZSBpYm0tYTExeS1kZWJ1ZyBhdHRyaWJ1dGUgdmFsdWUgZnJvbSBhbiBlbGVtZW50IG5vZGUgYXMgYSBEaXJlY3RpdmVSZXN1bHQsXG4gICAgICAgICAqIG9yIHsgZm91bmQ6IGZhbHNlIH0gaWYgYWJzZW50LiBSZWNvZ25pc2VzIHRoZSAnZW5kJyBzdG9wIG1hcmtlciBqdXN0IGxpa2UgY29tbWVudCBkaXJlY3RpdmVzLlxuICAgICAgICAgKiBUaGUgYXR0cmlidXRlIHZhbHVlIGlzIHRoZSBzb3VyY2UgZGlyZWN0bHkgKG5vICc6JyBwcmVmaXgpLCBlLmcuIGlibS1hMTF5LWRlYnVnPVwiZmlsZS50czoxMDo1XCIuXG4gICAgICAgICAqL1xuICAgICAgICBjb25zdCBnZXRJbmxpbmVBdHRyID0gZnVuY3Rpb24gKG46IE5vZGUpOiBEaXJlY3RpdmVSZXN1bHQge1xuICAgICAgICAgICAgaWYgKG4ubm9kZVR5cGUgIT09IE5vZGUuRUxFTUVOVF9OT0RFKSByZXR1cm4geyBmb3VuZDogZmFsc2UgfTtcbiAgICAgICAgICAgIGNvbnN0IHZhbCA9IChuIGFzIEVsZW1lbnQpLmdldEF0dHJpYnV0ZShERUJVR19ESVJFQ1RJVkUpO1xuICAgICAgICAgICAgaWYgKHZhbCA9PT0gbnVsbCkgcmV0dXJuIHsgZm91bmQ6IGZhbHNlIH07XG4gICAgICAgICAgICAvLyBBdHRyaWJ1dGUgdmFsdWUgaXMgdGhlIHNvdXJjZSBkaXJlY3RseSDigJQgbm8gJzonIHNlcGFyYXRvciB0byBzdHJpcFxuICAgICAgICAgICAgcmV0dXJuIHBhcnNlU291cmNlKHZhbC50cmltKCkpO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUcmF2ZXJzZXMgbGVmdCAocHJldmlvdXMgc2libGluZ3MpIHRoZW4gdXB3YXJkIChwYXJlbnQpIHRvIGZpbmQgc291cmNlIGluZm8uXG4gICAgICAgICAqIERvZXMgTk9UIGNoZWNrIHRoZSBzdGFydGluZyBlbGVtZW50IGl0c2VsZiDigJQgb25seSBpdHMgcHJlY2VkaW5nIHNpYmxpbmdzIGFuZCBhbmNlc3RvcnMuXG4gICAgICAgICAqIFRoaXMgYXZvaWRzIG1pc2lkZW50aWZ5aW5nIGEgY29udGVudCBub2RlIGFzIGl0cyBvd24gc291cmNlIGRpcmVjdGl2ZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQXQgZWFjaCBhbmNlc3RvciBsZXZlbCB0aGUgZnVuY3Rpb24gYWxzbyBjaGVja3MgdGhlIGFuY2VzdG9yIGVsZW1lbnQncyBvd24gaW5saW5lXG4gICAgICAgICAqIGlibS1hMTF5LWRlYnVnIGF0dHJpYnV0ZSwgc28gdGhhdCBhIHBhcmVudCBlbGVtZW50IGNhbiBhbm5vdGF0ZSBhbGwgaXRzIGRlc2NlbmRhbnRzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBTaWJsaW5nIHNjYW5uaW5nIHN0b3BzIGF0IHRoZSBmaXJzdCBub2RlIHRoYXQgaXMgcmVjb2duaXNlZCBhcyBhIGRpcmVjdGl2ZSAoZm91bmQgb3Igc3RvcCkuXG4gICAgICAgICAqIE5vbi1kaXJlY3RpdmUgbm9kZXMgKHJlYWwgY29udGVudCBlbGVtZW50cywgdGV4dCBub2RlcykgYXJlIHNraXBwZWQgc28gdGhhdCBhIGRpcmVjdGl2ZVxuICAgICAgICAgKiBwbGFjZWQgZnVydGhlciBiYWNrIGluIHRoZSBzaWJsaW5nIGxpc3QgaXMgc3RpbGwgZm91bmQgZXZlbiBpZiBjb250ZW50IG5vZGVzIGludGVydmVuZS5cbiAgICAgICAgICogSG93ZXZlciwgdHJhdmVyc2FsIGRvZXMgTk9UIGNyb3NzIGVsZW1lbnQgYm91bmRhcmllcyB3aGVuIHNjYW5uaW5nIHNpYmxpbmdzIOKAlCBvbmx5XG4gICAgICAgICAqIGNvbW1lbnQgbm9kZXMgYW5kIGRlZGljYXRlZCB3cmFwcGVyIGVsZW1lbnRzICh3aG9zZSBzb2xlIGZpcnN0IGNoaWxkIGlzIGEgY29tbWVudCkgYXJlXG4gICAgICAgICAqIHRyZWF0ZWQgYXMgdHJhbnNwYXJlbnQuXG4gICAgICAgICAqXG4gICAgICAgICAqIFNoYWRvdyBET00gdHJhdmVyc2FsOiB1c2VzIERPTVdhbGtlci5wYXJlbnROb2RlKCkgdG8gY3Jvc3Mgc2hhZG93IGJvdW5kYXJpZXMgY29ycmVjdGx5LFxuICAgICAgICAgKiBpbmNsdWRpbmcgc2xvdHRlZCBjb250ZW50IGFuZCBuZXN0ZWQgU2hhZG93IERPTSAoc2hhZG93LWluLXNoYWRvdykuIFdoZW4gdGhlIHBhcmVudFxuICAgICAgICAgKiBjaGFpbiByZWFjaGVzIGEgU2hhZG93Um9vdCwgRE9NV2Fsa2VyLnBhcmVudE5vZGUoKSBhdXRvbWF0aWNhbGx5IHJlc29sdmVzIGl0IHRvIHRoZVxuICAgICAgICAgKiBzaGFkb3cgaG9zdCBlbGVtZW50IGluIHRoZSBvdXRlciBET00uIEEgcGxhaW4gRG9jdW1lbnRGcmFnbWVudCB3aXRoIG5vIGhvc3QgcmV0dXJuc1xuICAgICAgICAgKiBudWxsIGZyb20gRE9NV2Fsa2VyLnBhcmVudE5vZGUoKSwgc3RvcHBpbmcgdHJhdmVyc2FsLlxuICAgICAgICAgKlxuICAgICAgICAgKiBTaWJsaW5nIHRyYXZlcnNhbCB1c2VzIERPTVdhbGtlci5wcmV2aW91c1NpYmxpbmdOb3RPd25lZEJ5U2xvdCgpIHRvIHNraXAgbm9kZXMgdGhhdFxuICAgICAgICAgKiBhcmUgYXNzaWduZWQgdG8gc2xvdHMgKGFuZCB0aGVyZWZvcmUgbG9naWNhbGx5IGJlbG9uZyB0byBhIGRpZmZlcmVudCBwYXJ0IG9mIHRoZSB0cmVlKS5cbiAgICAgICAgICpcbiAgICAgICAgICogVXNlcyBhbiBpdGVyYXRpdmUgYXBwcm9hY2ggKHJhdGhlciB0aGFuIHJlY3Vyc2lvbikgdG8gc2FmZWx5IGhhbmRsZSBkZWVwbHkgbmVzdGVkXG4gICAgICAgICAqIERPTSBzdHJ1Y3R1cmVzIHdpdGhvdXQgcmlzayBvZiBzdGFjayBvdmVyZmxvdy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIGVsZW0gLSBUaGUgbm9kZSB3aG9zZSBjb250ZXh0IHdlIGFyZSBzZWFyY2hpbmdcbiAgICAgICAgICogQHJldHVybnMgVGhlIHNvdXJjZSBsb2NhdGlvbiBzdHJpbmcsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICAgICAqL1xuICAgICAgICBjb25zdCBmaW5kU291cmNlID0gZnVuY3Rpb24gKGVsZW06IE5vZGUgfCBudWxsKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgICAgICBsZXQgY3VycmVudCA9IGVsZW07XG4gICAgICAgICAgICB3aGlsZSAoY3VycmVudCkge1xuICAgICAgICAgICAgICAgIC8vIFNjYW4gcHJldmlvdXMgc2libGluZ3MgZm9yIGEgZGVidWcgZGlyZWN0aXZlIGNvbW1lbnQgb3Igd3JhcHBlciBlbGVtZW50LlxuICAgICAgICAgICAgICAgIC8vIFVzZSBwcmV2aW91c1NpYmxpbmdOb3RPd25lZEJ5U2xvdCB0byBza2lwIG5vZGVzIGFzc2lnbmVkIHRvIHNsb3RzLCB3aGljaFxuICAgICAgICAgICAgICAgIC8vIGxvZ2ljYWxseSBiZWxvbmcgdG8gYSBkaWZmZXJlbnQgcGFydCBvZiB0aGUgY29tcG9zZWQgdHJlZS5cbiAgICAgICAgICAgICAgICAvLyBPbmx5IGNvbW1lbnQgbm9kZXMgYW5kIGRlZGljYXRlZCB3cmFwcGVyIGVsZW1lbnRzIGFyZSBjb25zaWRlcmVkIGRpcmVjdGl2ZXM7XG4gICAgICAgICAgICAgICAgLy8gYWxsIG90aGVyIG5vZGUgdHlwZXMgYXJlIHNraXBwZWQgKHRoZXkgZG8gbm90IGJsb2NrIGZ1cnRoZXIgc2Nhbm5pbmcpLlxuICAgICAgICAgICAgICAgIGxldCBwcmV2ID0gRE9NV2Fsa2VyLnByZXZpb3VzU2libGluZ05vdE93bmVkQnlTbG90KGN1cnJlbnQpO1xuICAgICAgICAgICAgICAgIHdoaWxlIChwcmV2KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGV4dHJhY3REaXJlY3RpdmUocHJldik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuZm91bmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuc3RvcCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHJlc3VsdCBhcyB7IGZvdW5kOiB0cnVlOyBzdG9wOiBmYWxzZTsgc291cmNlOiBzdHJpbmcgfSkuc291cmNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHByZXYgPSBET01XYWxrZXIucHJldmlvdXNTaWJsaW5nTm90T3duZWRCeVNsb3QocHJldik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gTm8gZGlyZWN0aXZlIGZvdW5kIGFtb25nIHNpYmxpbmdzIOKAlCBtb3ZlIHVwIHRvIHBhcmVudC5cbiAgICAgICAgICAgICAgICAvLyBVc2UgRE9NV2Fsa2VyLnBhcmVudE5vZGUoKSBpbnN0ZWFkIG9mIG5vZGUucGFyZW50Tm9kZSBkaXJlY3RseSBzbyB0aGF0OlxuICAgICAgICAgICAgICAgIC8vICAgMS4gU2hhZG93IERPTSBib3VuZGFyaWVzIGFyZSBjcm9zc2VkIGF1dG9tYXRpY2FsbHkgKFNoYWRvd1Jvb3Qg4oaSIGhvc3QgZWxlbWVudCksXG4gICAgICAgICAgICAgICAgLy8gICAgICBzdXBwb3J0aW5nIGJvdGggcmVndWxhciBhbmQgbmVzdGVkIFNoYWRvdyBET00gKHNoYWRvdy1pbi1zaGFkb3cpLlxuICAgICAgICAgICAgICAgIC8vICAgMi4gU2xvdHRlZCBub2RlcyBhcmUgcmUtcGFyZW50ZWQgdG8gdGhlaXIgc2xvdCBvd25lciByYXRoZXIgdGhhbiB0aGVpclxuICAgICAgICAgICAgICAgIC8vICAgICAgbGlnaHQtRE9NIHBhcmVudCwgbWF0Y2hpbmcgdGhlIGNvbXBvc2VkIChyZW5kZXJlZCkgdHJlZSBzdHJ1Y3R1cmUuXG4gICAgICAgICAgICAgICAgLy8gICAzLiBOb2RlcyB3aXRoIGFuIG93bmVyRWxlbWVudCAoZS5nLiBpZnJhbWUgZG9jdW1lbnQgcm9vdHMpIGFyZSByZS1wYXJlbnRlZFxuICAgICAgICAgICAgICAgIC8vICAgICAgdG8gdGhlaXIgb3duZXIgZWxlbWVudC5cbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnQgPSBET01XYWxrZXIucGFyZW50Tm9kZShjdXJyZW50KTtcblxuICAgICAgICAgICAgICAgIGlmICghcGFyZW50IHx8IHBhcmVudC5ub2RlVHlwZSA9PT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFJlYWNoZWQgdGhlIHRvcCBvZiB0aGUgdHJlZSAob3IgYSBwbGFpbiBEb2N1bWVudEZyYWdtZW50IHdpdGggbm8gaG9zdClcbiAgICAgICAgICAgICAgICAgICAgLy8gd2l0aG91dCBmaW5kaW5nIGEgZGlyZWN0aXZlLlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBDaGVjayB0aGUgcGFyZW50IGVsZW1lbnQncyBvd24gaW5saW5lIGF0dHJpYnV0ZSBiZWZvcmUgY29udGludWluZyB1cHdhcmQuXG4gICAgICAgICAgICAgICAgLy8gVGhpcyBhbGxvd3MgYSBjb250YWluaW5nIGVsZW1lbnQgdG8gYW5ub3RhdGUgYWxsIGl0cyBkZXNjZW5kYW50cy5cbiAgICAgICAgICAgICAgICAvLyBBbiAnZW5kJyBpbmxpbmUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgc3RvcHMgdHJhdmVyc2FsIGVudGlyZWx5LlxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudEF0dHJSZXN1bHQgPSBnZXRJbmxpbmVBdHRyKHBhcmVudCk7XG4gICAgICAgICAgICAgICAgaWYgKHBhcmVudEF0dHJSZXN1bHQuZm91bmQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudEF0dHJSZXN1bHQuc3RvcCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAocGFyZW50QXR0clJlc3VsdCBhcyB7IGZvdW5kOiB0cnVlOyBzdG9wOiBmYWxzZTsgc291cmNlOiBzdHJpbmcgfSkuc291cmNlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBwYXJlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBGaXJzdCwgY2hlY2sgZm9yIGFuIGlubGluZSBhdHRyaWJ1dGUgZGlyZWN0aXZlIG9uIHRoZSBlbGVtZW50IGl0c2VsZi5cbiAgICAgICAgLy8gQW4gJ2VuZCcgYXR0cmlidXRlIG9uIHRoZSBlbGVtZW50IGl0c2VsZiBzdG9wcyB0cmF2ZXJzYWwgKHJldHVybnMgbnVsbCkuXG4gICAgICAgIGNvbnN0IHNlbGZBdHRyUmVzdWx0ID0gZ2V0SW5saW5lQXR0cihub2RlKTtcbiAgICAgICAgaWYgKHNlbGZBdHRyUmVzdWx0LmZvdW5kKSB7XG4gICAgICAgICAgICBpZiAoc2VsZkF0dHJSZXN1bHQuc3RvcCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICByZXR1cm4gKHNlbGZBdHRyUmVzdWx0IGFzIHsgZm91bmQ6IHRydWU7IHN0b3A6IGZhbHNlOyBzb3VyY2U6IHN0cmluZyB9KS5zb3VyY2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGVuIHRyYXZlcnNlIHRoZSBET00gdG8gZmluZCBhIHByZWNlZGluZyBjb21tZW50IGRpcmVjdGl2ZSBvciBhbmNlc3RvciBhdHRyaWJ1dGVcbiAgICAgICAgcmV0dXJuIGZpbmRTb3VyY2Uobm9kZSk7XG4gICAgfVxuXG4gICAgcnVuKGVuZ2luZTogRW5naW5lLCBjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSkgOiBJc3N1ZVtdIHtcbiAgICAgICAgY29uc3Qgc3RhcnRUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgICAgIGxldCByZXN1bHRzOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVzdWx0cyA9IHRoaXMucnVsZS5ydW4oY29udGV4dCwgb3B0aW9ucywgY29udGV4dEhpZXJhcmNoaWVzKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc3QgZXJyOiBFcnJvciA9IGU7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiUlVMRSBFWENFUFRJT046XCIsdGhpcy5ydWxlLmlkLCBjb250ZXh0LmRvbS5yb2xlUGF0aCwgZXJyLnN0YWNrKTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZW5kVGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgICBpZiAoIXJlc3VsdHMpIHJlc3VsdHMgPSBbXTtcblxuICAgICAgICBpZiAoIShyZXN1bHRzIGluc3RhbmNlb2YgQXJyYXkpKSB7XG4gICAgICAgICAgICByZXN1bHRzID0gW3Jlc3VsdHNdO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZXRWYWwgOiBJc3N1ZVtdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlbmdpbmUuZ2V0TWVzc2FnZSh0aGlzLnJ1bGUuaWQsIHJlc3VsdC5yZWFzb25JZCwgcmVzdWx0Lm1lc3NhZ2VBcmdzKTtcbiAgICAgICAgICAgIGNvbnN0IHBhdGggPSB7fTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbnMgaW4gY29udGV4dCkge1xuICAgICAgICAgICAgICAgIHBhdGhbbnNdID0gY29udGV4dFtuc10ucm9sZVBhdGhcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJ1bGVJZCA9IHRoaXMucnVsZS5pZC5yZXBsYWNlKC9eKC4qKVxcJFxcJFxcZCskLywgXCIkMVwiKTtcblxuICAgICAgICAgICAgcmV0VmFsLnB1c2goe1xuICAgICAgICAgICAgICAgIHJ1bGVJZDogcnVsZUlkLFxuICAgICAgICAgICAgICAgIHZhbHVlOiByZXN1bHQudmFsdWUsXG4gICAgICAgICAgICAgICAgbm9kZTogY29udGV4dFtcImRvbVwiXS5ub2RlLFxuICAgICAgICAgICAgICAgIHBhdGg6IHBhdGgsXG4gICAgICAgICAgICAgICAgcnVsZVRpbWU6IGVuZFRpbWUtc3RhcnRUaW1lLFxuICAgICAgICAgICAgICAgIHJlYXNvbklkOiByZXN1bHQucmVhc29uSWQsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICAgICAgICAgICAgICBtZXNzYWdlQXJnczogcmVzdWx0Lm1lc3NhZ2VBcmdzLFxuICAgICAgICAgICAgICAgIGFwaUFyZ3M6IHJlc3VsdC5hcGlBcmdzLFxuICAgICAgICAgICAgICAgIGJvdW5kczogY29udGV4dFtcImRvbVwiXS5ib3VuZHMsXG4gICAgICAgICAgICAgICAgc25pcHBldDogV3JhcHBlZFJ1bGUuY29udmVydE5vZGVUb1NuaXBwZXQoY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQpLFxuICAgICAgICAgICAgICAgIHNvdXJjZTogV3JhcHBlZFJ1bGUuY29udmVydE5vZGVUb1NvdXJjZShjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudCwgZW5naW5lLmlzU291cmNlTWFwRW5hYmxlZCgpKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEVuZ2luZSBpbXBsZW1lbnRzIElFbmdpbmUge1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0TGFuZ3VhZ2VzKCkge1xuICAgICAgICBjb25zdCBlbnYgPSB0eXBlb2YgcHJvY2VzcyAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2YgKHByb2Nlc3MgYXMgYW55KS5ub2RlVHlwZSA9PT0gXCJ1bmRlZmluZWRcIiAmJiBwcm9jZXNzLmVudjtcbiAgICAgICAgLy8gSWYgYWxsIGVsc2UgZmFpbHMsIGRlZmF1bHQgdG8gVVMgRW5nbGlzaFxuICAgICAgICBsZXQgbm9kZUxhbmcgPSBcImVuLVVTXCI7XG4gICAgICAgIGlmIChlbnYpIHtcbiAgICAgICAgICAgIG5vZGVMYW5nID0gZW52LkxBTkcgfHwgZW52LkxBTkdVQUdFIHx8IGVudi5MQ19BTEwgfHwgZW52LkxDX01FU1NBR0VTO1xuICAgICAgICAgICAgaWYgKG5vZGVMYW5nICYmIG5vZGVMYW5nLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBub2RlTGFuZyA9IG5vZGVMYW5nLnNwbGl0KFwiLlwiKVswXS5yZXBsYWNlKC9fL2csXCItXCIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBub2RlTGFuZyA9IFwiZW4tVVNcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHlwZW9mIG5hdmlnYXRvciAhPT0gXCJ1bmRlZmluZWRcIiAmJiBuYXZpZ2F0b3IubGFuZ3VhZ2VzIHx8IFtub2RlTGFuZ107XG4gICAgfVxuICAgIG1hcHBlcnMgOiB7IFtuYW1lc3BhY2U6IHN0cmluZ10gOiBJTWFwcGVyIH0gPSB7fTtcbiAgICBydWxlTWFwIDogeyBbaWQ6IHN0cmluZ106IFJ1bGUgfSA9IHt9O1xuICAgIHdyYXBwZWRSdWxlTWFwIDogeyBbaWQ6IHN0cmluZ106IFdyYXBwZWRSdWxlIH0gPSB7fTtcbiAgICBubHNNYXAgOiBObHNNYXAgPSB7fVxuICAgIGhlbHBNYXAgOiBIZWxwTWFwID0ge31cbiAgICBzb3VyY2VNYXBFbmFibGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBwcml2YXRlIGluY2xSdWxlczoge1xuICAgICAgICBbbnNSb2xlOiBzdHJpbmddOiBXcmFwcGVkUnVsZVtdXG4gICAgfSA9IHt9XG5cbiAgICBwcml2YXRlIGV4Y2xSdWxlczoge1xuICAgICAgICBbbnNSb2xlOiBzdHJpbmddOiBXcmFwcGVkUnVsZVtdXG4gICAgfSA9IHt9XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgLy8gTmVlZCBhIERPTSBNYXBwZXIgYXMgYSBtaW5pbXVtXG4gICAgICAgIHRoaXMuYWRkTWFwcGVyKG5ldyBET01NYXBwZXIoKSk7XG4gICAgfVxuXG4gICAgcnVuKHJvb3Q6IERvY3VtZW50IHwgTm9kZSwgb3B0aW9ucz86IHt9KTogUHJvbWlzZTxSZXBvcnQ+IHtcbiAgICAgICAgaWYgKHJvb3QgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcIm51bGwgZG9jdW1lbnRcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJvb3Qubm9kZVR5cGUgPT09IDkgLyogTm9kZS5ET0NVTUVOVF9OT0RFICovKSB7XG4gICAgICAgICAgICByb290ID0gKHJvb3QgYXMgRG9jdW1lbnQpLmRvY3VtZW50RWxlbWVudDtcbiAgICAgICAgfVxuICAgICAgICByb290Lm93bmVyRG9jdW1lbnQgJiYgKChyb290Lm93bmVyRG9jdW1lbnQgYXMgYW55KS5QVF9DSEVDS19ISURERU5fQ09OVEVOVCA9IGZhbHNlKTtcbiAgICAgICAgY29uc3QgbnVtTm9kZXNWaXNpdGVkID0gQ2FjaGVVdGlsLmNsZWFyQ2FjaGVzKHJvb3QpO1xuICAgICAgICBjb25zdCB3YWxrZXIgPSBuZXcgRE9NV2Fsa2VyKHJvb3QsIGZhbHNlLCByb290LCB0cnVlKTtcbiAgICAgICAgY29uc3QgcmV0VmFsIDogUmVwb3J0ID0ge1xuICAgICAgICAgICAgcmVzdWx0czogW10sXG4gICAgICAgICAgICBudW1FeGVjdXRlZDogMCxcbiAgICAgICAgICAgIHJ1bGVUaW1lOiAwLFxuICAgICAgICAgICAgdG90YWxUaW1lOiAwXG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3RhcnQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsgICAgICAgIFxuICAgICAgICAvLyBSZXNldCB0aGUgcm9sZSBtYXBwZXJzXG4gICAgICAgIGZvciAoY29uc3QgbmFtZXNwYWNlIGluIHRoaXMubWFwcGVycykge1xuICAgICAgICAgICAgdGhpcy5tYXBwZXJzW25hbWVzcGFjZV0ucmVzZXQocm9vdCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBjb250ZXh0IGRldGVjdG9yXG4gICAgICAgIGxldCBjdXJyZW50Tm9kZUNvdW50ID0gMDtcbiAgICAgICAgbGV0IGxhc3RSZXBvcnRlZFBlcmNlbnQgPSAtMTtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgY3VycmVudE5vZGVDb3VudCsrO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBSZXBvcnQgcHJvZ3Jlc3MgYXQgZWFjaCBwZXJjZW50YWdlIG1pbGVzdG9uZVxuICAgICAgICAgICAgY29uc3QgY3VycmVudFBlcmNlbnQgPSBNYXRoLmZsb29yKChjdXJyZW50Tm9kZUNvdW50IC8gbnVtTm9kZXNWaXNpdGVkKSAqIDEwMCk7XG4gICAgICAgICAgICBpZiAoY3VycmVudFBlcmNlbnQgPiBsYXN0UmVwb3J0ZWRQZXJjZW50KSB7XG4gICAgICAgICAgICAgICAgaWYgKG51bU5vZGVzVmlzaXRlZCA+IDEwMDAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIChjdXJyZW50UGVyY2VudCA+IDYpIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgUHJvZ3Jlc3M6ICR7Y3VycmVudFBlcmNlbnR9JSAoJHtjdXJyZW50Tm9kZUNvdW50fS8ke251bU5vZGVzVmlzaXRlZH0gbm9kZXMpYCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnN0IHJ1bGVUaW1lcyA9IHJldFZhbC5yZXN1bHRzLnJlZHVjZSgocHJldiwgY3VyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBwcmV2W2N1ci5ydWxlSWRdID0gKHByZXZbY3VyLnJ1bGVJZF0gfHwgMCkrY3VyLnJ1bGVUaW1lO1xuICAgICAgICAgICAgICAgICAgICAvLyAgICAgcmV0dXJuIHByZXY7XG4gICAgICAgICAgICAgICAgICAgIC8vIH0sIHt9KTtcbiAgICAgICAgICAgICAgICAgICAgLy8gZm9yIChjb25zdCBydWxlSWQgaW4gcnVsZVRpbWVzKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBpZiAocnVsZVRpbWVzW3J1bGVJZF0gPiAxMDAwMCkge1xuICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgIGNvbnNvbGUubG9nKGAke3J1bGVJZH06ICR7cnVsZVRpbWVzW3J1bGVJZF19YCk7XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5ncm91cEVuZCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsYXN0UmVwb3J0ZWRQZXJjZW50ID0gY3VycmVudFBlcmNlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBHZXQgdGhlIGNvbnRleHQgaW5mb3JtYXRpb24gZnJvbSB0aGUgcnVsZSBtYXBwZXJzXG4gICAgICAgICAgICBjb25zdCBjb250ZXh0SGllcmFyY2hpZXMgOiBSdWxlQ29udGV4dEhpZXJhcmNoeSA9IHt9O1xuICAgICAgICAgICAgZm9yIChjb25zdCBuYW1lc3BhY2UgaW4gdGhpcy5tYXBwZXJzKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF3YWxrZXIuYkVuZFRhZykge1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0SGllcmFyY2hpZXNbbmFtZXNwYWNlXSA9IHRoaXMubWFwcGVyc1tuYW1lc3BhY2VdLm9wZW5TY29wZSh3YWxrZXIubm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIChuYW1lc3BhY2UgPT09IFwiZG9tXCIgJiYgd2Fsa2VyLm5vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnN0IGVsZW0gPSB3YWxrZXIubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGV0IGlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwiaWRcIikgJiYgKGlkID0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJpZFwiKS50cmltKCkpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiAocm9vdC5vd25lckRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKSA9PT0gZWxlbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb250ZXh0SGllcmFyY2hpZXNbXCJkb21cIl1bY29udGV4dEhpZXJhcmNoaWVzW1wiZG9tXCJdLmxlbmd0aC0xXS5yb2xlUGF0aCA9IFwiLy8qW0BpZD0nXCIraWQrXCInXVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHRIaWVyYXJjaGllc1tuYW1lc3BhY2VdID0gdGhpcy5tYXBwZXJzW25hbWVzcGFjZV0uY2xvc2VTY29wZSh3YWxrZXIubm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAod2Fsa2VyLm5vZGUubm9kZVR5cGUgIT09IDExIFxuICAgICAgICAgICAgICAgICYmIChWaXNVdGlsLmlzTm9kZVZpc2libGUod2Fsa2VyLm5vZGUpXG4gICAgICAgICAgICAgICAgICAgIC8vIHx8IHdhbGtlci5ub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiaGVhZFwiXG4gICAgICAgICAgICAgICAgICAgIHx8IHdhbGtlci5ub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwibWV0YVwiXG4gICAgICAgICAgICAgICAgICAgIHx8IHdhbGtlci5ub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwic3R5bGVcIlxuICAgICAgICAgICAgICAgICAgICB8fCB3YWxrZXIubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImRhdGFsaXN0XCJcbiAgICAgICAgICAgICAgICAgICAgfHwgd2Fsa2VyLm5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJwYXJhbVwiXG4gICAgICAgICAgICAgICAgICAgIHx8ICFET01VdGlsLmdldEFuY2VzdG9yKHdhbGtlci5ub2RlLCBbXCJib2R5XCJdKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGxldCBjb250ZXh0IDogUnVsZUNvbnRleHQgPSB7fTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IG5zIGluIGNvbnRleHRIaWVyYXJjaGllcykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuc0hpZXIgPSBjb250ZXh0SGllcmFyY2hpZXNbbnNdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXN0SGllciA9IG5zSGllcltuc0hpZXIubGVuZ3RoLTFdO1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0W25zXSA9IGxhc3RIaWVyOyBcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgbWF0Y2hpbmdSdWxlcyA9IHRoaXMuZ2V0TWF0Y2hpbmdSdWxlcyhjb250ZXh0SGllcmFyY2hpZXMpO1xuICAgICAgICAgICAgICAgIGxldCBkZXBNYXRjaCA9IHt9XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBtYXRjaGluZ1J1bGUgb2YgbWF0Y2hpbmdSdWxlcykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZnVsZmlsbHNEZXBlbmRlbmNpZXMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGRlcCBvZiBtYXRjaGluZ1J1bGUucnVsZS5kZXBlbmRlbmNpZXMgfHwgW10pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZGVwTWF0Y2hbZGVwXSkgZnVsZmlsbHNEZXBlbmRlbmNpZXMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoZnVsZmlsbHNEZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXN1bHRzIDogSXNzdWVbXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0YXJ0ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBtYXRjaGluZ1J1bGUucnVuKHRoaXMsIGNvbnRleHQsIG9wdGlvbnMsIGNvbnRleHRIaWVyYXJjaGllcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXcmFwcGVyIHNob3dzIGVycm9yIGluIGNvbnNvbGUuIFNraXAgdGhpcyBydWxlIGFzIE4vQVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGRvbid0IHdhbnQgdG8ga2lsbCB0aGUgZW5naW5lXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBvdXQgb2Ygc2NvcGUsIGl0IGZ1bGZpbGxzIHRoZSBkZXBlbmRlbmN5XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBNYXRjaFttYXRjaGluZ1J1bGUucnVsZS5pZF0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5yZXN1bHRzLnB1c2gocmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwucnVsZVRpbWUgKz0gcmVzdWx0LnJ1bGVUaW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5udW1FeGVjdXRlZCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQudmFsdWVbMV0gPT09IGVSdWxlQ29uZmlkZW5jZS5QQVNTKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcE1hdGNoW3Jlc3VsdC5ydWxlSWRdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gd2hpbGUgKHdhbGtlci5uZXh0Tm9kZSgpKTtcbiAgICAgICAgQ2FjaGVVdGlsLmNsZWFyQ2FjaGVzKHJvb3QpO1xuICAgICAgICByZXRWYWwudG90YWxUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCktc3RhcnQ7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmV0VmFsKTtcbiAgICB9XG5cbiAgICBlbmFibGVSdWxlcyhydWxlSWRzOiBzdHJpbmdbXSkge1xuICAgICAgICBmb3IgKGNvbnN0IHJ1bGVJZCBpbiB0aGlzLnJ1bGVNYXApIHtcbiAgICAgICAgICAgIHRoaXMucnVsZU1hcFtydWxlSWRdLmVuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHJ1bGVJZCBvZiBydWxlSWRzIHx8IFtdKSB7XG4gICAgICAgICAgICBpZiAoIShydWxlSWQgaW4gdGhpcy5ydWxlTWFwKSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcIldBUk5JTkc6IFJ1bGUgSWRcIixydWxlSWQsXCJjb3VsZCBub3QgYmUgZW5hYmxlZC5cIik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMucnVsZU1hcFtydWxlSWRdLmVuYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0UnVsZShydWxlSWQ6IHN0cmluZyk6IFJ1bGUge1xuICAgICAgICByZXR1cm4gdGhpcy5ydWxlTWFwW3J1bGVJZF07XG4gICAgfVxuXG4gICAgZ2V0UnVsZXNJZHMoKSA6IHN0cmluZ1tdIHtcbiAgICAgICAgbGV0IHJldFZhbCA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHJ1bGVJZCBpbiB0aGlzLnJ1bGVNYXApIHtcbiAgICAgICAgICAgIHJldFZhbC5wdXNoKHJ1bGVJZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICBhZGRSdWxlcyhydWxlczogUnVsZVtdKSB7XG4gICAgICAgIGZvciAoY29uc3QgcnVsZSBvZiBydWxlcykge1xuICAgICAgICAgICAgdGhpcy5hZGRSdWxlKHJ1bGUsIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3NvcnRSdWxlcygpO1xuICAgIH1cblxuICAgIGFkZFJ1bGUocnVsZTogUnVsZSwgc2tpcFNvcnQ/OiBib29sZWFuKSB7XG4gICAgICAgIGxldCBjdHhzIDpDb250ZXh0W10gPSBDb250ZXh0LnBhcnNlKHJ1bGUuY29udGV4dCk7XG4gICAgICAgIGxldCBpZHggPSAwO1xuICAgICAgICBjb25zdCBydWxlSWQgPSBydWxlLmlkO1xuICAgICAgICBpZiAocnVsZUlkIGluIHRoaXMucnVsZU1hcCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJXQVJOSU5HOiBSdWxlXCIscnVsZUlkLFwiYWxyZWFkeSBhZGRlZCB0byBlbmdpbmUuIElnbm9yaW5nLi4uXCIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucnVsZU1hcFtydWxlSWRdID0gcnVsZTtcbiAgICAgICAgZm9yIChjb25zdCBjdHggb2YgY3R4cykge1xuICAgICAgICAgICAgbGV0IHdyYXBJZCA9IHJ1bGVJZDtcbiAgICAgICAgICAgIGlmIChpZHggPj0gMSkge1xuICAgICAgICAgICAgICAgIHdyYXBJZCA9IHJ1bGVJZCtcIiQkXCIraWR4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgKytpZHg7XG4gICAgICAgICAgICBsZXQgd3JhcHBlZFJ1bGUgPSBuZXcgV3JhcHBlZFJ1bGUocnVsZSxjdHgpO1xuICAgICAgICAgICAgdGhpcy53cmFwcGVkUnVsZU1hcFt3cmFwSWRdID0gd3JhcHBlZFJ1bGU7XG4gICAgICAgICAgICBsZXQgcGFydHMgPSB3cmFwcGVkUnVsZS5wYXJzZWRJbmZvLmNvbnRleHRJbmZvO1xuICAgICAgICAgICAgbGV0IGxhc3RQYXJ0ID0gcGFydHNbcGFydHMubGVuZ3RoLTFdO1xuICAgICAgICAgICAgbGV0IHRyaWdnZXJSb2xlID0gbGFzdFBhcnQubmFtZXNwYWNlK1wiOlwiK2xhc3RQYXJ0LnJvbGU7XG4gICAgICAgICAgICBpZiAobGFzdFBhcnQuaW5jbHVzaXZlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbmNsUnVsZXNbdHJpZ2dlclJvbGVdID0gdGhpcy5pbmNsUnVsZXNbdHJpZ2dlclJvbGVdIHx8IFtdO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5jbFJ1bGVzW3RyaWdnZXJSb2xlXS5wdXNoKHdyYXBwZWRSdWxlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5leGNsUnVsZXNbdHJpZ2dlclJvbGVdID0gdGhpcy5leGNsUnVsZXNbdHJpZ2dlclJvbGVdIHx8IFtdO1xuICAgICAgICAgICAgICAgIHRoaXMuZXhjbFJ1bGVzW3RyaWdnZXJSb2xlXS5wdXNoKHdyYXBwZWRSdWxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIXNraXBTb3J0KSB7XG4gICAgICAgICAgICB0aGlzLl9zb3J0UnVsZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGVuYWJsZVNvdXJjZU1hcChlbmFibGU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5zb3VyY2VNYXBFbmFibGVkID0gZW5hYmxlO1xuICAgIH1cblxuICAgIGlzU291cmNlTWFwRW5hYmxlZCgpIDogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnNvdXJjZU1hcEVuYWJsZWQ7XG4gICAgfVxuICAgIFxuICAgIF9zb3J0UnVsZXMoKSB7XG4gICAgICAgIGZvciAoY29uc3Qgcm9sZSBpbiB0aGlzLmluY2xSdWxlcykge1xuICAgICAgICAgICAgdGhpcy5pbmNsUnVsZXNbcm9sZV0uc29ydCgocnVsZUE6IFdyYXBwZWRSdWxlLCBydWxlQjogV3JhcHBlZFJ1bGUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBoYXNEZXBBID0gcnVsZUEucnVsZS5kZXBlbmRlbmNpZXMgJiYgcnVsZUEucnVsZS5kZXBlbmRlbmNpZXMubGVuZ3RoID4gMDtcbiAgICAgICAgICAgICAgICBjb25zdCBoYXNEZXBCID0gcnVsZUIucnVsZS5kZXBlbmRlbmNpZXMgJiYgcnVsZUIucnVsZS5kZXBlbmRlbmNpZXMubGVuZ3RoID4gMDtcbiAgICAgICAgICAgICAgICAvLyBJZiBCIGRlcGVuZHMgb24gQSwgc29ydCBBIGJlZm9yZSBCXG4gICAgICAgICAgICAgICAgaWYgKGhhc0RlcEIgJiYgcnVsZUIucnVsZS5kZXBlbmRlbmNpZXMuaW5jbHVkZXMocnVsZUEucnVsZS5pZCkpIHJldHVybiAtMTtcbiAgICAgICAgICAgICAgICAvLyBJZiBBIGRlcGVuZHMgb24gQiwgc29ydCBCIGJlZm9yZSBBXG4gICAgICAgICAgICAgICAgaWYgKGhhc0RlcEEgJiYgcnVsZUEucnVsZS5kZXBlbmRlbmNpZXMuaW5jbHVkZXMocnVsZUIucnVsZS5pZCkpIHJldHVybiAxO1xuICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgZG9lc24ndCBtYXR0ZXJcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3Qgcm9sZSBpbiB0aGlzLmV4Y2xSdWxlcykge1xuICAgICAgICAgICAgdGhpcy5leGNsUnVsZXNbcm9sZV0uc29ydCgocnVsZUE6IFdyYXBwZWRSdWxlLCBydWxlQjogV3JhcHBlZFJ1bGUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBoYXNEZXBBID0gcnVsZUEucnVsZS5kZXBlbmRlbmNpZXMgJiYgcnVsZUEucnVsZS5kZXBlbmRlbmNpZXMubGVuZ3RoID4gMDtcbiAgICAgICAgICAgICAgICBjb25zdCBoYXNEZXBCID0gcnVsZUIucnVsZS5kZXBlbmRlbmNpZXMgJiYgcnVsZUIucnVsZS5kZXBlbmRlbmNpZXMubGVuZ3RoID4gMDtcbiAgICAgICAgICAgICAgICAvLyBJZiBCIGRlcGVuZHMgb24gQSwgc29ydCBBIGJlZm9yZSBCXG4gICAgICAgICAgICAgICAgaWYgKGhhc0RlcEIgJiYgcnVsZUIucnVsZS5kZXBlbmRlbmNpZXMuaW5jbHVkZXMocnVsZUEucnVsZS5pZCkpIHJldHVybiAtMTtcbiAgICAgICAgICAgICAgICAvLyBJZiBBIGRlcGVuZHMgb24gQiwgc29ydCBCIGJlZm9yZSBBXG4gICAgICAgICAgICAgICAgaWYgKGhhc0RlcEEgJiYgcnVsZUEucnVsZS5kZXBlbmRlbmNpZXMuaW5jbHVkZXMocnVsZUIucnVsZS5pZCkpIHJldHVybiAxO1xuICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgZG9lc24ndCBtYXR0ZXJcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYWRkTmxzTWFwKG1hcDogTmxzTWFwKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIG1hcCkge1xuICAgICAgICAgICAgdGhpcy5ubHNNYXBba2V5XSA9IG1hcFtrZXldO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYWRkSGVscE1hcChtYXA6IEhlbHBNYXApIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gbWFwKSB7XG4gICAgICAgICAgICB0aGlzLmhlbHBNYXBba2V5XSA9IG1hcFtrZXldO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0TWVzc2FnZShydWxlSWQ6IHN0cmluZywgcnVsZUlkeDogbnVtYmVyIHwgc3RyaW5nLCBtc2dBcmdzPzogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgICAgICBsZXQgc3BsaXR0ZXIgPSBydWxlSWQuaW5kZXhPZihcIiQkXCIpO1xuICAgICAgICBpZiAoc3BsaXR0ZXIgPj0gMCkge1xuICAgICAgICAgICAgcnVsZUlkID0gcnVsZUlkLnN1YnN0cmluZygwLHNwbGl0dGVyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIShydWxlSWQgaW4gdGhpcy5ubHNNYXApKSByZXR1cm4gcnVsZUlkO1xuICAgICAgICBsZXQgbWVzc2FnZVRlbXBsYXRlID0gdGhpcy5ubHNNYXBbcnVsZUlkXVtydWxlSWR4IHx8IDBdO1xuICAgICAgICBpZiAoIW1lc3NhZ2VUZW1wbGF0ZSkgcmV0dXJuIHJ1bGVJZCtcIl9cIitydWxlSWR4O1xuICAgICAgICByZXR1cm4gbWVzc2FnZVRlbXBsYXRlLnJlcGxhY2UoL1xceyhcXGQrKVxcfS9nLFxuICAgICAgICAgICAgKG1hdGNoZWRTdHIsIG1hdGNoZWROdW0sIG1hdGNoZWRJbmRleCkgPT4gbXNnQXJnc1ttYXRjaGVkTnVtXVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGdldEhlbHAocnVsZUlkOiBzdHJpbmcsIHJlYXNvbklkOiBudW1iZXIgfCBzdHJpbmcsIGFyY2hpdmVJZD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGlmICghYXJjaGl2ZUlkKSB7XG4gICAgICAgICAgICAvLyBTZXQgdG8gdGhlIGxhdGVzdFxuICAgICAgICAgICAgYXJjaGl2ZUlkID0gXCJsYXRlc3RcIjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYCR7Q29uZmlnLmhlbHBSb290fS8ke2FyY2hpdmVJZH0vZG9jJHt0aGlzLmdldEhlbHBSZWwocnVsZUlkLCByZWFzb25JZCl9YDtcbiAgICB9XG5cbiAgICBnZXRIZWxwUmVsKHJ1bGVJZDogc3RyaW5nLCBydWxlSWR4OiBudW1iZXIgfCBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBsZXQgc3BsaXR0ZXIgPSBydWxlSWQuaW5kZXhPZihcIiQkXCIpO1xuICAgICAgICBpZiAoc3BsaXR0ZXIgPj0gMCkge1xuICAgICAgICAgICAgcnVsZUlkID0gcnVsZUlkLnN1YnN0cmluZygwLHNwbGl0dGVyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIShydWxlSWQgaW4gdGhpcy5oZWxwTWFwKSkgcmV0dXJuIHJ1bGVJZDtcbiAgICAgICAgcnVsZUlkeCA9IHJ1bGVJZHggfHwgMDtcbiAgICAgICAgbGV0IGhlbHBTdHIgPSBudWxsO1xuICAgICAgICBpZiAocnVsZUlkeCBpbiB0aGlzLmhlbHBNYXBbcnVsZUlkXSkge1xuICAgICAgICAgICAgaGVscFN0ciA9IHRoaXMuaGVscE1hcFtydWxlSWRdW3J1bGVJZHggfHwgMF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBoZWxwU3RyID0gdGhpcy5oZWxwTWFwW3J1bGVJZF1bMF07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWhlbHBTdHIpIHJldHVybiBydWxlSWQrXCJfXCIrcnVsZUlkeDtcbiAgICAgICAgcmV0dXJuIGhlbHBTdHI7XG4gICAgfVxuXG4gICAgYWRkTWFwcGVyKG1hcHBlcjogSU1hcHBlcikge1xuICAgICAgICB0aGlzLm1hcHBlcnNbbWFwcGVyLmdldE5hbWVzcGFjZSgpXSA9IG1hcHBlcjtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBtYXRjaChydWxlOiBXcmFwcGVkUnVsZSxcbiAgICAgICAgY29udGV4dEhpZXI6IFJ1bGVDb250ZXh0SGllcmFyY2h5KSA6IGJvb2xlYW5cbiAgICB7XG4gICAgICAgIGxldCBydWxlUGFydHMgPSBydWxlLnBhcnNlZEluZm8uY29udGV4dEluZm87XG4gICAgICAgIGxldCBwYXJ0SWR4ID0gcnVsZVBhcnRzLmxlbmd0aC0xO1xuICAgICAgICBsZXQgY3VyTlMgPSBydWxlUGFydHNbcGFydElkeF0ubmFtZXNwYWNlO1xuICAgICAgICBsZXQgY3VySGllciA9IGNvbnRleHRIaWVyW2N1ck5TXVtjb250ZXh0SGllcltjdXJOU10ubGVuZ3RoLTFdO1xuICAgICAgICBjb25zdCBjb250ZXh0Tm9kZSA9IGN1ckhpZXIubm9kZTtcblxuICAgICAgICAvLyBJZiB0aGUgZW5kIG9mIHRoZSBydWxlIHBhcnQgZG9lc24ndCBtYXRjaCB0aGUgZW5kIG9mIHRoZSBoaWVyYXJjaHksIHdlIGRvbid0IGhhdmUgYSBtYXRjaFxuICAgICAgICBpZiAoIXJ1bGVQYXJ0c1twYXJ0SWR4XS5tYXRjaGVzKGNvbnRleHRIaWVyLCBjb250ZXh0SGllcltjdXJOU10ubGVuZ3RoLTEpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgdGhlcmUgd2FzIG9ubHkgb25lIHBhcnQsIHdlIGhhdmUgYSBtYXRjaFxuICAgICAgICBpZiAocnVsZVBhcnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTmVlZCB0byBkZWFsIHdpdGggcGFyZW50IHBhcnRzLiBUbyB3YWxrIHRoZSBoaWVyYXJjaHksIHRoZXNlIG5lZWQgdG8gYmVcbiAgICAgICAgLy8gYWxsIGluIHRoZSBzYW1lIG5hbWVzcGFjZS4gQ29uZmlybSB0aGF0IGlzIHRydWUuXG4gICAgICAgIGN1ck5TID0gcnVsZVBhcnRzWzBdLm5hbWVzcGFjZTtcbiAgICAgICAgY3VySGllciA9IGNvbnRleHRIaWVyW2N1ck5TXVtjb250ZXh0SGllcltjdXJOU10ubGVuZ3RoLTFdO1xuICAgICAgICAtLXBhcnRJZHg7XG4gICAgICAgIGlmIChydWxlUGFydHMuc2xpY2UoMCwgcnVsZVBhcnRzLmxlbmd0aC0xKS5zb21lKHBhcnQgPT4gcGFydC5uYW1lc3BhY2UgIT09IGN1ck5TKSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgW0VSUk9SXSBSdWxlICR7cnVsZS5ydWxlLmlkfSBoYXMgaW5jb25zaXRlbnQgcGFyZW50IG5hbWVzcGFjZXNgKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiB0aGUgdGFyZ2V0IG5vZGUgbWF0Y2hlcyB0aGUgZW5kIG9mIHRoZSBoaWVyYXJjaHksIG1vdmUgdXAgcGFzdCBpdCwgb3RoZXJ3aXNlLCBzdGFydCBhdCB0aGUgZW5kXG4gICAgICAgIGxldCBoaWVySWR4ID0gY29udGV4dEhpZXJbY3VyTlNdLmxlbmd0aCAtIChjdXJIaWVyLm5vZGUuaXNTYW1lTm9kZShjb250ZXh0Tm9kZSkgPyAyIDogMSk7XG4gICAgICAgIHdoaWxlIChoaWVySWR4ID49IDAgJiYgcGFydElkeCA+PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJ0ID0gcnVsZVBhcnRzW3BhcnRJZHhdO1xuICAgICAgICAgICAgY29uc3QgbWF0Y2hlc1BhcnQgPSBydWxlUGFydHNbcGFydElkeF0ubWF0Y2hlcyhjb250ZXh0SGllciwgaGllcklkeCk7XG4gICAgICAgICAgICBpZiAocGFydC5jb25uZWN0b3IgPT09IFwiPlwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFtYXRjaGVzUGFydCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBEaXJlY3QgcGFyZW50IGNoZWNrIGFuZCBkb2Vzbid0IG1hdGNoXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBEaXJlY3QgcGFyZW50IGNoZWNrIGFuZCBkb2VzIG1hdGNoXG4gICAgICAgICAgICAgICAgICAgIC0tcGFydElkeDtcbiAgICAgICAgICAgICAgICAgICAgLS1oaWVySWR4O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGFydC5jb25uZWN0b3IgPT09IFwiIFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcnQuaW5jbHVzaXZlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGluY2x1c2l2ZSBhbmNlc3RvciBtYXRjaFxuICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2hlc1BhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC0tcGFydElkeDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBJZiBkb2Vzbid0IG1hdGNoLCBqdXN0IG1vdmUgdXAgdGhlIHJvbGUgaGllcmFyY2h5XG4gICAgICAgICAgICAgICAgICAgIC0taGllcklkeDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFtYXRjaGVzUGFydCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBleGNsdXNpdmUgYW5jZXN0b3IgbWF0Y2ggYW5kIGN1cnJlbnQgbWF0Y2hlc1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXhjbHVzaXZlIGFuY2VzdG9yIG1hdGNoIGFuZCBjdXJyZW50IGRvZXNuJ3QgbWF0Y2ggLSBjaGVjayBmb3Igb3RoZXIgYW5jZXN0b3JzXG4gICAgICAgICAgICAgICAgICAgIGxldCBwYXJlbnRNYXRjaCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBzZWFyY2hJZHggPSBoaWVySWR4LTE7ICFwYXJlbnRNYXRjaCAmJiBzZWFyY2hJZHggPj0gMDsgLS1zZWFyY2hJZHgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudE1hdGNoID0gIXJ1bGVQYXJ0c1twYXJ0SWR4XS5tYXRjaGVzKGNvbnRleHRIaWVyLCBzZWFyY2hJZHgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnRNYXRjaCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBlbHNlIC0tcGFydElkeDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvbnRleHQgY29ubmVjdG9yIFwiK3BhcnQuY29ubmVjdG9yK1wiIGlzIG5vdCBzdXBwb3J0ZWRcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhcnRJZHggPT09IC0xO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0TWF0Y2hpbmdSdWxlcyhjdHhIaWVyIDogUnVsZUNvbnRleHRIaWVyYXJjaHkpIDogV3JhcHBlZFJ1bGVbXSB7XG4gICAgICAgIGxldCBtYXRjaGVzIDogV3JhcHBlZFJ1bGVbXSA9IFtdO1xuICAgICAgICBmdW5jdGlvbiBhZGRNYXRjaGVzKHJ1bGVzOiBXcmFwcGVkUnVsZVtdKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJ1bGUgb2YgcnVsZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAocnVsZS5ydWxlLmVuYWJsZWQgJiYgRW5naW5lLm1hdGNoKHJ1bGUsIGN0eEhpZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIG1hdGNoZXMucHVzaChydWxlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBucyBpbiBjdHhIaWVyKSB7XG4gICAgICAgICAgICBsZXQgcm9sZSA9IG5zK1wiOlwiKyhjdHhIaWVyW25zXS5sZW5ndGggPiAwID8gY3R4SGllcltuc11bY3R4SGllcltuc10ubGVuZ3RoLTFdLnJvbGUgOiBcIm5vbmVcIik7XG4gICAgICAgICAgICBpZiAocm9sZSBpbiB0aGlzLmluY2xSdWxlcykge1xuICAgICAgICAgICAgICAgIGFkZE1hdGNoZXModGhpcy5pbmNsUnVsZXNbcm9sZV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChjb25zdCB4Um9sZSBpbiB0aGlzLmV4Y2xSdWxlcykge1xuICAgICAgICAgICAgICAgIGlmICh4Um9sZSAhPT0gcm9sZSkge1xuICAgICAgICAgICAgICAgICAgICBhZGRNYXRjaGVzKHRoaXMuZXhjbFJ1bGVzW3hSb2xlXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJvbGUgIT09IG5zK1wiOm5vbmVcIikge1xuICAgICAgICAgICAgICAgIGlmIChyb2xlLnN0YXJ0c1dpdGgobnMrXCI6L1wiKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobnMrXCI6LypcIiBpbiB0aGlzLmluY2xSdWxlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkTWF0Y2hlcyh0aGlzLmluY2xSdWxlc1tucytcIjovKlwiXSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChucytcIjoqXCIgaW4gdGhpcy5pbmNsUnVsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZE1hdGNoZXModGhpcy5pbmNsUnVsZXNbbnMrXCI6KlwiXSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5zb3J0RGVwcyhtYXRjaGVzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTb3J0cyB0aGUgcnVsZXMgaW4gb3JkZXIgdG8gZXhlY3V0ZSBkZXBlbmRlbmNpZXMgaW4gdGhlIGNvcnJlY3Qgb3JkZXJcbiAgICAgKiBAcGFyYW0gaW5SdWxlcyBMaXN0IG9mIHdyYXBwZWQgcnVsZXMgdG8gc29ydFxuICAgICAqIEByZXR1cm5zIFNvcnRlZCBsaXN0IG9mIHdyYXBwZWQgcnVsZXNcbiAgICAgKi9cbiAgICBzb3J0RGVwcyhpblJ1bGVzOiBXcmFwcGVkUnVsZVtdKSB7XG4gICAgICAgIGxldCBkZXBSdWxlczogV3JhcHBlZFJ1bGVbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHJ1bGUgb2YgaW5SdWxlcykge1xuICAgICAgICAgICAgZGVwUnVsZXMucHVzaChydWxlKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgbGV0IHJldFZhbCA6IFdyYXBwZWRSdWxlW10gPSBbXTtcbiAgICAgICAgbGV0IGlkVG9SdWxlID0ge307XG4gICAgICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgcnVsZXMuIElmIHRoYXQgcnVsZSdzIGRlcGVuZGVuY2llcyBjYW4gYmUgbWV0IGJ5IHJ1bGVzIGFscmVhZHkgaW4gdGhlIGxpc3QsIGFkZCBpdCB0byB0aGUgbGlzdFxuICAgICAgICAvLyBSZXBlYXQgdW50aWwgbm8gY2hhbmdlcyBhcmUgbWFkZSB0byB0aGUgc2F0aXNmaWVkIGxpc3RcbiAgICAgICAgLy8gSWYgYSBydWxlIGNhbm5vdCBiZSBzYXRpc2ZpZWQsIGl0IHdpbGwgbmV2ZXIgZXhlY3V0ZSwgc28gaXQgY2FuIGJlIGRyb3BwZWQuXG4gICAgICAgIGxldCBjaGFuZ2UgPSBmYWxzZTtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgY2hhbmdlID0gZmFsc2U7XG4gICAgICAgICAgICBmb3IgKGxldCBpZHg9MDsgaWR4PGRlcFJ1bGVzLmxlbmd0aDsgKytpZHgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkZXBSdWxlID0gZGVwUnVsZXNbaWR4XTtcbiAgICAgICAgICAgICAgICBpZiAoZGVwUnVsZS5ydWxlLmlkIGluIGlkVG9SdWxlKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBsZXQgYWxsTWF0Y2ggPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmIChkZXBSdWxlLnJ1bGUuZGVwZW5kZW5jaWVzICYmIGRlcFJ1bGUucnVsZS5kZXBlbmRlbmNpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGRlcElkIG9mIGRlcFJ1bGUucnVsZS5kZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGRlcElkIGluIGlkVG9SdWxlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbE1hdGNoID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gaWYgKGRlcFJ1bGUucnVsZS5wcmVyZXFzICYmIGRlcFJ1bGUucnVsZS5wcmVyZXFzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgZm9yIChjb25zdCBkZXBJZCBvZiBkZXBSdWxlLnJ1bGUucHJlcmVxcykge1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgaWYgKCEoZGVwSWQgaW4gaWRUb1J1bGUpKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgYWxsTWF0Y2ggPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyAgICAgfVxuICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICBpZiAoYWxsTWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsLnB1c2goZGVwUnVsZSk7XG4gICAgICAgICAgICAgICAgICAgIGlkVG9SdWxlW2RlcFJ1bGUucnVsZS5pZF0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBkZXBSdWxlcy5zcGxpY2UoaWR4LS0sIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAoY2hhbmdlKTtcbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5leHBvcnQgY2xhc3MgQ29uZmlnIHtcbiAgICBzdGF0aWMgREVCVUcgPSBmYWxzZTtcbiAgICBzdGF0aWMgaGVscFJvb3QgPSBcImh0dHBzOi8vYWJsZS5pYm0uY29tL3J1bGVzL2FyY2hpdmVzXCI7XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBDb21tb25NYXBwZXIgfSBmcm9tIFwiLi4vY29tbW9uL0NvbW1vbk1hcHBlclwiO1xuaW1wb3J0IHsgQm91bmRzIH0gZnJvbSBcIi4uL2FwaS9JTWFwcGVyXCI7XG5pbXBvcnQgeyBDYWNoZVV0aWwgfSBmcm9tIFwiLi4vLi4vdjQvdXRpbC9DYWNoZVV0aWxcIjtcblxuZXhwb3J0IGNsYXNzIERPTU1hcHBlciBleHRlbmRzIENvbW1vbk1hcHBlciB7XG4gICAgZ2V0Um9sZShub2RlOiBOb2RlKSA6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuICAgIGdldE5hbWVzcGFjZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gXCJkb21cIlxuICAgIH1cbiAgICBnZXRBdHRyaWJ1dGVzKG5vZGU6IE5vZGUpIDogeyBba2V5OnN0cmluZ106IHN0cmluZyB9IHtcbiAgICAgICAgbGV0IHJldFZhbCA9IHt9O1xuICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLykge1xuICAgICAgICAgICAgY29uc3QgZWxlbSA9IG5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgICAgIGZvciAobGV0IGlkeD0wOyBpZHg8ZWxlbS5hdHRyaWJ1dGVzLmxlbmd0aDsgKytpZHgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhdHRySW5mbyA9IGVsZW0uYXR0cmlidXRlc1tpZHhdO1xuICAgICAgICAgICAgICAgIHJldFZhbFthdHRySW5mby5uYW1lLnRvTG93ZXJDYXNlKCldID0gYXR0ckluZm8ubm9kZVZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogZ2V0IHNjYWxlZCBib3VuZHMgZm9yIHNjcmVlbnNob3QgZXRjLiBhZGp1c3RlZCBmb3IgZGV2aWNlUGl4ZWxSYXRpbyBhbmQgc2Nyb2xsXG4gICAgICogQHBhcmFtIG5vZGUgXG4gICAgICogQHJldHVybnMgXG4gICAgICovXG4gICAgZ2V0Qm91bmRzKG5vZGU6IE5vZGUpIDogQm91bmRzIHtcbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgIT09IDEgLypOb2RlLkVMRU1FTlRfTk9ERSovKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBjYWNoZWRCb3VuZHMgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUobm9kZSBhcyBFbGVtZW50LCBcIkRPTU1hcHBlcl9Cb3VuZHNcIiwgdW5kZWZpbmVkKTtcbiAgICAgICAgaWYgKHR5cGVvZiBjYWNoZWRCb3VuZHMgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRCb3VuZHM7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGxldCBhZGp1c3RtZW50ID0gMTtcbiAgICAgICAgaWYgKG5vZGUub3duZXJEb2N1bWVudCAmJiBub2RlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcgJiYgbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LmRldmljZVBpeGVsUmF0aW8pIHtcbiAgICAgICAgICAgIGFkanVzdG1lbnQgPSBub2RlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuZGV2aWNlUGl4ZWxSYXRpbztcbiAgICAgICAgfVxuICAgICAgICBsZXQgYm91bmRzID0gKG5vZGUgYXMgRWxlbWVudCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgICAgLy8gRG8gYSBjaGVjayB3aGV0aGVyIGJvdW5kcyBoYXMgdmFsdWUgYXMgd2UgdXNlIGRpZmZlcmVudCB0b29sIChodG1sVW5pdCwgYnJvd3NlcikgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uXG4gICAgICAgIGlmIChib3VuZHMpIHtcbiAgICAgICAgICAgIGxldCBzY3JvbGxYID0gbm9kZSAmJiBub2RlLm93bmVyRG9jdW1lbnQgJiYgbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3ICYmIG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5zY3JvbGxYIHx8IDA7XG4gICAgICAgICAgICBsZXQgc2Nyb2xsWSA9IG5vZGUgJiYgbm9kZS5vd25lckRvY3VtZW50ICYmIG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyAmJiBub2RlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuc2Nyb2xsWSB8fCAwO1xuICAgICAgICAgICAgY29uc3QgcmV0ID0ge1xuICAgICAgICAgICAgICAgIFwibGVmdFwiOiBNYXRoLmNlaWwoKGJvdW5kcy5sZWZ0ICsgc2Nyb2xsWCkgKiBhZGp1c3RtZW50KSxcbiAgICAgICAgICAgICAgICBcInRvcFwiOiBNYXRoLmNlaWwoKGJvdW5kcy50b3AgKyBzY3JvbGxZKSAqIGFkanVzdG1lbnQpLFxuICAgICAgICAgICAgICAgIFwiaGVpZ2h0XCI6IE1hdGguY2VpbChib3VuZHMuaGVpZ2h0ICogYWRqdXN0bWVudCksXG4gICAgICAgICAgICAgICAgXCJ3aWR0aFwiOiBNYXRoLmNlaWwoYm91bmRzLndpZHRoICogYWRqdXN0bWVudClcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSBhcyBFbGVtZW50LCBcIkRPTU1hcHBlcl9Cb3VuZHNcIiwgcmV0KTtcbiAgICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogZ2V0IHJlYWwgQ1NTIGJvdW5kcyBpbiBjc3MgcGl4ZWxzLCBhZGp1c3RlZCBmb3Igc2Nyb2xsIG9ubHlcbiAgICAgKiBAcGFyYW0gbm9kZSBcbiAgICAgKiBAcmV0dXJucyBcbiAgICAgKi9cbiAgICBnZXRVbmFkanVzdGVkQm91bmRzKG5vZGU6IE5vZGUpIDogQm91bmRzIHtcbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgIT09IDEgLypOb2RlLkVMRU1FTlRfTk9ERSovKSByZXR1cm4gbnVsbDtcblxuXG4gICAgICAgIGNvbnN0IGNhY2hlZEJvdW5kcyA9IENhY2hlVXRpbC5nZXRDYWNoZShub2RlIGFzIEVsZW1lbnQsIFwiRE9NTWFwcGVyX1VuYWRqdXN0ZWRCb3VuZHNcIiwgdW5kZWZpbmVkKTtcbiAgICAgICAgaWYgKHR5cGVvZiBjYWNoZWRCb3VuZHMgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRCb3VuZHM7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBib3VuZHMgPSAobm9kZSBhcyBFbGVtZW50KS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgLy8gYWRqdXN0ZWQgZm9yIHNjcm9sbCBpZiBhbnlcbiAgICAgICAgaWYgKGJvdW5kcykge1xuICAgICAgICAgICAgbGV0IHNjcm9sbFggPSBub2RlICYmIG5vZGUub3duZXJEb2N1bWVudCAmJiBub2RlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcgJiYgbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LnNjcm9sbFggfHwgMDtcbiAgICAgICAgICAgIGxldCBzY3JvbGxZID0gbm9kZSAmJiBub2RlLm93bmVyRG9jdW1lbnQgJiYgbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3ICYmIG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5zY3JvbGxZIHx8IDA7XG4gICAgICAgICAgICBjb25zdCByZXQgPSB7XG4gICAgICAgICAgICAgICAgXCJsZWZ0XCI6IE1hdGguY2VpbChib3VuZHMubGVmdCArIHNjcm9sbFgpLFxuICAgICAgICAgICAgICAgIFwidG9wXCI6IE1hdGguY2VpbChib3VuZHMudG9wICsgc2Nyb2xsWSksXG4gICAgICAgICAgICAgICAgXCJoZWlnaHRcIjogTWF0aC5jZWlsKGJvdW5kcy5oZWlnaHQpLFxuICAgICAgICAgICAgICAgIFwid2lkdGhcIjogTWF0aC5jZWlsKGJvdW5kcy53aWR0aClcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSBhcyBFbGVtZW50LCBcIkRPTU1hcHBlcl9VbmFkanVzdGVkQm91bmRzXCIsIHJldCk7XG4gICAgICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMC0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4vRE9NV2Fsa2VyXCI7XG5cbi8qKlxuICogVXRpbGl0eSBjbGFzcyBwcm92aWRpbmcgaGVscGVyIG1ldGhvZHMgZm9yIERPTSBtYW5pcHVsYXRpb24gYW5kIHRyYXZlcnNhbCBvcGVyYXRpb25zLlxuICogVXNlZCB0aHJvdWdob3V0IHRoZSBhY2Nlc3NpYmlsaXR5IGNoZWNrZXIgZW5naW5lIHRvIG5hdmlnYXRlIGFuZCBhbmFseXplIERPTSBzdHJ1Y3R1cmVzLlxuICovXG5leHBvcnQgY2xhc3MgRE9NVXRpbCB7XG4gICAgXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGEgZ2l2ZW4gbm9kZSBoYXMgYW4gYW5jZXN0b3IgZWxlbWVudCB3aXRoIGEgbm9kZSBuYW1lIG1hdGNoaW5nIGFueSBvZiB0aGUgcHJvdmlkZWQgbmFtZXMuXG4gICAgICogVHJhdmVyc2VzIHVwIHRoZSBET00gdHJlZSBmcm9tIHRoZSBnaXZlbiBub2RlIHVudGlsIGEgbWF0Y2ggaXMgZm91bmQgb3IgdGhlIHJvb3QgaXMgcmVhY2hlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBub2RlIC0gVGhlIHN0YXJ0aW5nIERPTSBub2RlIHRvIGNoZWNrXG4gICAgICogQHBhcmFtIG5hbWVzIC0gQXJyYXkgb2Ygbm9kZSBuYW1lcyAodGFnIG5hbWVzKSB0byBzZWFyY2ggZm9yIGluIHVwcGVyY2FzZSAoZS5nLiwgWydUQUJMRScsICdESVYnXSlcbiAgICAgKiBAcmV0dXJucyB0cnVlIGlmIGFuIGFuY2VzdG9yIHdpdGggYSBtYXRjaGluZyBuYW1lIGlzIGZvdW5kLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgKi9cbiAgICBzdGF0aWMgaGFzUGFyZW50KG5vZGU6IE5vZGUsIG5hbWVzOnN0cmluZ1tdKSB7XG4gICAgICAgIGxldCBwID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQobm9kZSk7XG4gICAgICAgIHdoaWxlIChwICYmICFuYW1lcy5pbmNsdWRlcyhwLm5vZGVOYW1lKSkge1xuICAgICAgICAgICAgcCA9IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KHApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAhIXA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0cmlldmVzIHRoZSBmaXJzdCBhbmNlc3RvciBlbGVtZW50IHRoYXQgbWF0Y2hlcyBhbnkgb2YgdGhlIHByb3ZpZGVkIG5vZGUgbmFtZXMgKGNhc2UtaW5zZW5zaXRpdmUpLlxuICAgICAqIFNpbWlsYXIgdG8gaGFzUGFyZW50IGJ1dCByZXR1cm5zIHRoZSBhY3R1YWwgZWxlbWVudCByZWZlcmVuY2UgYW5kIHBlcmZvcm1zIGNhc2UtaW5zZW5zaXRpdmUgY29tcGFyaXNvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBub2RlIC0gVGhlIHN0YXJ0aW5nIERPTSBub2RlXG4gICAgICogQHBhcmFtIG5hbWVzIC0gQXJyYXkgb2YgbG93ZXJjYXNlIG5vZGUgbmFtZXMgdG8gc2VhcmNoIGZvciAoZS5nLiwgWyd0YWJsZScsICdkaXYnXSlcbiAgICAgKiBAcmV0dXJucyBUaGUgbWF0Y2hpbmcgYW5jZXN0b3IgZWxlbWVudCwgb3IgbnVsbCBpZiBub25lIGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIGdldEFuY2VzdG9yKG5vZGU6IE5vZGUsIG5hbWVzOnN0cmluZ1tdKSB7XG4gICAgICAgIGxldCBwID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQobm9kZSk7XG4gICAgICAgIHdoaWxlIChwICYmICFuYW1lcy5pbmNsdWRlcyhwLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICAgICAgICBwID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQocCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyBpZiB0d28gbm9kZXMgYXJlIHRoZSBzYW1lIG5vZGUsIHdpdGggZmFsbGJhY2sgc3RyYXRlZ2llcyBmb3IgZGlmZmVyZW50IGJyb3dzZXIgZW52aXJvbm1lbnRzLlxuICAgICAqIFVzZXMgbXVsdGlwbGUgY29tcGFyaXNvbiBtZXRob2RzIGZvciBjcm9zcy1icm93c2VyIGNvbXBhdGliaWxpdHk6XG4gICAgICogMS4gU3RyaWN0IGVxdWFsaXR5ICg9PT0pXG4gICAgICogMi4gaXNTYW1lTm9kZSgpIG1ldGhvZCBpZiBhdmFpbGFibGVcbiAgICAgKiAzLiBjb21wYXJlRG9jdW1lbnRQb3NpdGlvbigpIChyZXR1cm5zIDAgaWYgc2FtZSBub2RlKVxuICAgICAqIDQuIFJldHVybnMgdHJ1ZSBhcyBsYXN0IHJlc29ydCBpZiBubyBjb21wYXJpc29uIG1ldGhvZCBpcyBhdmFpbGFibGVcbiAgICAgKlxuICAgICAqIEBwYXJhbSBhIC0gRmlyc3Qgbm9kZSB0byBjb21wYXJlXG4gICAgICogQHBhcmFtIGIgLSBTZWNvbmQgbm9kZSB0byBjb21wYXJlXG4gICAgICogQHJldHVybnMgdHJ1ZSBpZiBub2RlcyBhcmUgdGhlIHNhbWUsIGZhbHNlIG90aGVyd2lzZVxuICAgICAqL1xuICAgIHN0YXRpYyBzYW1lTm9kZShhOiBOb2RlLCBiOiBOb2RlKSA6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoYSA9PT0gYikge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAoYS5pc1NhbWVOb2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gYS5pc1NhbWVOb2RlKGIpO1xuICAgICAgICB9IGVsc2UgaWYgKGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGIpID09PSAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gTm90IHN1cHBvcnRlZCBpbiB0aGlzIGVudmlyb25tZW50IC0gdHJ5IG91ciBiZXN0XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE5vcm1hbGl6ZXMgd2hpdGVzcGFjZSBpbiBhIHN0cmluZyBieSByZXBsYWNpbmcgYWxsIHdoaXRlc3BhY2UgY2hhcmFjdGVyc1xuICAgICAqIChzcGFjZXMsIHRhYnMsIGNhcnJpYWdlIHJldHVybnMsIG5ld2xpbmVzKSB3aXRoIHNpbmdsZSBzcGFjZXMgYW5kIGNvbGxhcHNpbmdcbiAgICAgKiBtdWx0aXBsZSBjb25zZWN1dGl2ZSBzcGFjZXMgaW50byBvbmUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcyAtIFRoZSBpbnB1dCBzdHJpbmcgdG8gY2xlYW5cbiAgICAgKiBAcmV0dXJucyBUaGUgY2xlYW5lZCBzdHJpbmcgd2l0aCBub3JtYWxpemVkIHdoaXRlc3BhY2VcbiAgICAgKiBAZXhhbXBsZSBcIkhlbGxvXFxuXFx0ICBXb3JsZFwiIOKGkiBcIkhlbGxvIFdvcmxkXCJcbiAgICAgKi9cbiAgICBzdGF0aWMgY2xlYW5XaGl0ZXNwYWNlKHM6IHN0cmluZykgOiBzdHJpbmcge1xuICAgICAgICBsZXQgcmV0VmFsID0gcy5yZXBsYWNlKC9bIFxcdFxcclxcbl0vZywgXCIgXCIpLnJlcGxhY2UoLyArL2csXCIgXCIpO1xuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbGxhcHNlcyBtdWx0aXBsZSBjb25zZWN1dGl2ZSBzcGFjZXMgaW50byBhIHNpbmdsZSBzcGFjZS5cbiAgICAgKiBVbmxpa2UgY2xlYW5XaGl0ZXNwYWNlLCBvbmx5IGhhbmRsZXMgc3BhY2VzLCBub3Qgb3RoZXIgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGxpa2UgdGFicyBvciBuZXdsaW5lcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzIC0gVGhlIGlucHV0IHN0cmluZyB0byBjbGVhblxuICAgICAqIEByZXR1cm5zIFRoZSBzdHJpbmcgd2l0aCBjb2xsYXBzZWQgc3BhY2VzXG4gICAgICovXG4gICAgc3RhdGljIGNsZWFuU3BhY2Uoczogc3RyaW5nKSA6IHN0cmluZyB7XG4gICAgICAgIGxldCByZXRWYWwgPSBzLnJlcGxhY2UoLyArL2csXCIgXCIpO1xuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERldGVybWluZXMgaWYgdHdvIGVsZW1lbnRzICh0eXBpY2FsbHkgdGFibGUgY2VsbHMpIGJlbG9uZyB0byB0aGUgc2FtZSB0YWJsZSBlbGVtZW50LlxuICAgICAqIEZpbmRzIHRoZSB0YWJsZSBhbmNlc3RvciBmb3IgZWFjaCBlbGVtZW50IGFuZCBjb21wYXJlcyB0aGVtIHVzaW5nIHNhbWVOb2RlKCkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZWxlbWVudDEgLSBGaXJzdCBlbGVtZW50IHRvIGNoZWNrXG4gICAgICogQHBhcmFtIGVsZW1lbnQyIC0gU2Vjb25kIGVsZW1lbnQgdG8gY2hlY2tcbiAgICAgKiBAcmV0dXJucyB0cnVlIGlmIGJvdGggZWxlbWVudHMgc2hhcmUgdGhlIHNhbWUgdGFibGUgYW5jZXN0b3IsIGZhbHNlIG90aGVyd2lzZVxuICAgICAqL1xuICAgIHN0YXRpYyBpc0luU2FtZVRhYmxlKGVsZW1lbnQxLCBlbGVtZW50Mikge1xuICAgICAgICBpZiAoZWxlbWVudDEgJiYgZWxlbWVudDIpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudE5hbWUgPSBbJ3RhYmxlJ107XG4gICAgICAgICAgICBjb25zdCBwYXJlbnQxPSBET01VdGlsLmdldEFuY2VzdG9yKGVsZW1lbnQxLCBwYXJlbnROYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudDI9IERPTVV0aWwuZ2V0QW5jZXN0b3IoZWxlbWVudDIsIHBhcmVudE5hbWUpO1xuICAgICAgICAgICAgaWYgKHBhcmVudDEgIT09IG51bGwgJiYgcGFyZW50MiAhPSBudWxsICYmIERPTVV0aWwuc2FtZU5vZGUocGFyZW50MSwgcGFyZW50MikpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBcbiAgICAvKipcbiAgICAgKiBUcmF2ZXJzZXMgdXAgdGhlIERPTSB0cmVlIHRvIGZpbmQgdGhlIHNoYWRvdyByb290IChkb2N1bWVudCBmcmFnbWVudCkgdGhhdCBjb250YWlucyB0aGUgZ2l2ZW4gbm9kZS5cbiAgICAgKiBJbXBvcnRhbnQgZm9yIGhhbmRsaW5nIFdlYiBDb21wb25lbnRzIGFuZCBTaGFkb3cgRE9NIHN0cnVjdHVyZXMgaW4gYWNjZXNzaWJpbGl0eSBjaGVja2luZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBub2RlIC0gVGhlIHN0YXJ0aW5nIG5vZGVcbiAgICAgKiBAcmV0dXJucyBUaGUgc2hhZG93IHJvb3Qgbm9kZSAobm9kZVR5cGUgMTEgPSBET0NVTUVOVF9GUkFHTUVOVF9OT0RFKSwgb3IgbnVsbCBpZiBub25lIGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIHNoYWRvd1Jvb3ROb2RlKG5vZGU6IE5vZGUpIDogTm9kZSB8IG51bGwge1xuICAgICAgICBsZXQgbmQgPSBub2RlO1xuICAgICAgICB3aGlsZSAobmQgIT0gbnVsbCAmJiBuZC5ub2RlVHlwZSAhPT0gMTEgLyogTm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFICovKVxuICAgICAgICAgICAgbmQgPSBuZC5wYXJlbnROb2RlO1xuICAgICAgICByZXR1cm4gbmQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGRlZXAgY29weSBvZiBhbiBvYmplY3Qgd2hpbGUgcHJlc2VydmluZyBOb2RlIHJlZmVyZW5jZXMgKGRvZXNuJ3QgY2xvbmUgTm9kZSBvYmplY3RzKS5cbiAgICAgKiBVc2VmdWwgd2hlbiBjb3B5aW5nIGRhdGEgc3RydWN0dXJlcyB0aGF0IGNvbnRhaW4gRE9NIG5vZGUgcmVmZXJlbmNlcywgYXMgeW91IHR5cGljYWxseSB3YW50XG4gICAgICogdG8gcHJlc2VydmUgdGhvc2UgcmVmZXJlbmNlcyByYXRoZXIgdGhhbiBhdHRlbXB0aW5nIHRvIGNsb25lIHRoZSBub2RlcyB0aGVtc2VsdmVzLlxuICAgICAqXG4gICAgICogQmVoYXZpb3I6XG4gICAgICogLSBQcmltaXRpdmUgdmFsdWVzOiBEZWVwIGNvcGllZCB2aWEgSlNPTiBzZXJpYWxpemF0aW9uXG4gICAgICogLSBGdW5jdGlvbnM6IFJldHVybmVkIGFzLWlzIChyZWZlcmVuY2UpXG4gICAgICogLSBOb2RlIG9iamVjdHM6IFJldHVybmVkIGFzLWlzIChyZWZlcmVuY2UsIG5vdCBjbG9uZWQpXG4gICAgICogLSBBcnJheXMvT2JqZWN0czogUmVjdXJzaXZlbHkgY29waWVkIHdpdGggdGhlIHNhbWUgcnVsZXNcbiAgICAgKlxuICAgICAqIEBwYXJhbSByaHMgLSBUaGUgb2JqZWN0IHRvIGNvcHkgKHJpZ2h0LWhhbmQgc2lkZSlcbiAgICAgKiBAcmV0dXJucyBBIGNvcHkgb2YgdGhlIG9iamVjdCB3aXRoIE5vZGUgcmVmZXJlbmNlcyBwcmVzZXJ2ZWRcbiAgICAgKi9cbiAgICBzdGF0aWMgb2JqZWN0Q29weVdpdGhOb2RlUmVmcyhyaHM6IGFueSkge1xuICAgICAgICBpZiAoIXJocykgcmV0dXJuIHJocztcbiAgICAgICAgaWYgKHR5cGVvZiByaHMgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcmhzID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmhzO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShyaHMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChyaHMgaW5zdGFuY2VvZiBOb2RlIHx8ICEhcmhzLm5vZGVUeXBlKSB7XG4gICAgICAgICAgICByZXR1cm4gcmhzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IHJldFZhbDtcbiAgICAgICAgICAgIGlmIChyaHMuY29uc3RydWN0b3IubmFtZSA9PT0gXCJBcnJheVwiKSB7XG4gICAgICAgICAgICAgICAgcmV0VmFsID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHJocykge1xuICAgICAgICAgICAgICAgICAgICByZXRWYWwucHVzaCh0aGlzLm9iamVjdENvcHlXaXRoTm9kZVJlZnMoaXRlbSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0VmFsID0ge307XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gcmhzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbFtrZXldID0gdGhpcy5vYmplY3RDb3B5V2l0aE5vZGVSZWZzKHJoc1trZXldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmluZHMgdGhlIGZpcnN0IGFuY2VzdG9yIGVsZW1lbnQgdGhhdCBoYXMgYSBzcGVjaWZpYyBhdHRyaWJ1dGUgd2l0aCBhIHNwZWNpZmljIHZhbHVlLlxuICAgICAqIFRyYXZlcnNlcyB1cCB0aGUgRE9NIHRyZWUgZnJvbSB0aGUgZ2l2ZW4gZWxlbWVudCB1bnRpbCBhIG1hdGNoaW5nIGFuY2VzdG9yIGlzIGZvdW5kLlxuICAgICAqXG4gICAgICogQHBhcmFtIGVsZW1lbnQgLSBUaGUgc3RhcnRpbmcgZWxlbWVudFxuICAgICAqIEBwYXJhbSBhdHRyTmFtZSAtIFRoZSBhdHRyaWJ1dGUgbmFtZSB0byBzZWFyY2ggZm9yXG4gICAgICogQHBhcmFtIGF0dHJWYWx1ZSAtIFRoZSBleHBlY3RlZCBhdHRyaWJ1dGUgdmFsdWVcbiAgICAgKiBAcmV0dXJucyBUaGUgbWF0Y2hpbmcgYW5jZXN0b3IgZWxlbWVudCwgb3IgbnVsbCBpZiBub25lIGZvdW5kXG4gICAgICogQGV4YW1wbGUgRmluZGluZyBhbiBhbmNlc3RvciB3aXRoIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIG9yIGRhdGEtdGVzdGlkPVwiY29udGFpbmVyXCJcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEFuY2VzdG9yV2l0aEF0dHJpYnV0ZShlbGVtZW50LCBhdHRyTmFtZSwgYXR0clZhbHVlKSB7XG4gICAgICAgIGxldCB3YWxrTm9kZSA9IERPTVdhbGtlci5wYXJlbnROb2RlKGVsZW1lbnQpO1xuICAgICAgICB3aGlsZSAod2Fsa05vZGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmICh3YWxrTm9kZS5ub2RlVHlwZSA9PT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLyAmJiAoPEVsZW1lbnQ+d2Fsa05vZGUpLmdldEF0dHJpYnV0ZShhdHRyTmFtZSkgPT09IGF0dHJWYWx1ZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gd2Fsa05vZGU7XG4gICAgICAgICAgICB3YWxrTm9kZSA9IERPTVdhbGtlci5wYXJlbnROb2RlKHdhbGtOb2RlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3Y0L3V0aWwvVmlzVXRpbFwiO1xuLyoqXG4gKiBXYWxrcyBpbiBhIERPTSBvcmRlclxuICogXG4gKiBBc3N1bXB0aW9uIHRoYXQgbm9kZXMgb2Ygc2hhZG93IERPTXMgY2FsbCBhc3NpZ25TbG90cyBvbiB0aGUgc2hhZG93IHJvb3QgYmVmb3JlIFxuICogZG9pbmcgb3RoZXIgcHJvY2Vzc2luZyBpbiB0aGF0IHRyZWUuIElmIHlvdSB3YWxrIGludG8gYSBzaGFkb3cgcm9vdCwgdGhlIERPTVdhbGtlclxuICogd2lsbCBkbyBpdCBhdXRvbWF0aWNhbGx5LlxuICogXG4gKiBTZWUgYWxzbyAuLi9hcmlhL0FSSUFXYWxrZXJcbiAqL1xuZXhwb3J0IGNsYXNzIERPTVdhbGtlciB7XG4gICAgcm9vdCA6IE5vZGU7XG4gICAgbm9kZSA6IE5vZGU7XG4gICAgYkVuZFRhZzogYm9vbGVhbjtcbiAgICBjb25zaWRlckhpZGRlbjogYm9vbGVhbjtcbiAgICBERUJVRzogYm9vbGVhbjtcblxuICAgIGNvbnN0cnVjdG9yKGVsZW1lbnQgOiBOb2RlLCBiRW5kPyA6IGJvb2xlYW4sIHJvb3Q/IDogTm9kZSwgY29uc2lkZXJIaWRkZW4/IDogYm9vbGVhbiwgREVCVUc/OiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuREVCVUcgPSAhIURFQlVHO1xuICAgICAgICB0aGlzLnJvb3QgPSByb290IHx8ICgoZWxlbWVudCAmJiBlbGVtZW50Lm93bmVyRG9jdW1lbnQpID8gZWxlbWVudC5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudDogZWxlbWVudCk7XG4gICAgICAgIGlmICh0aGlzLnJvb3Qubm9kZVR5cGUgPT09IDkpIHtcbiAgICAgICAgICAgIHRoaXMucm9vdCA9ICh0aGlzLnJvb3QgYXMgRG9jdW1lbnQpLmRvY3VtZW50RWxlbWVudFxuICAgICAgICB9XG4gICAgICAgIHRoaXMubm9kZSA9IGVsZW1lbnQ7XG4gICAgICAgIGlmICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDkpIHtcbiAgICAgICAgICAgIHRoaXMubm9kZSA9ICh0aGlzLm5vZGUgYXMgRG9jdW1lbnQpLmRvY3VtZW50RWxlbWVudFxuICAgICAgICB9XG4gICAgICAgIHRoaXMuYkVuZFRhZyA9IChiRW5kID09IHVuZGVmaW5lZCA/IGZhbHNlIDogYkVuZCA9PSB0cnVlKTtcbiAgICAgICAgdGhpcy5jb25zaWRlckhpZGRlbiA9IGNvbnNpZGVySGlkZGVuIHx8IGZhbHNlO1xuICAgIH1cblxuICAgIGVsZW0oKSA6IEhUTUxFbGVtZW50IHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgJiYgdGhpcy5ub2RlIGFzIEhUTUxFbGVtZW50IHx8IG51bGw7XG4gICAgfVxuICAgIFxuICAgIHN0YXRpYyBwYXJlbnROb2RlKG5vZGU6IE5vZGUpIDogTm9kZSB8IG51bGwge1xuICAgICAgICBpZiAobm9kZSA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBwIDogTm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgaWYgKChub2RlIGFzIGFueSkuc2xvdE93bmVyKSB7XG4gICAgICAgICAgICBwID0gKG5vZGUgYXMgYW55KS5zbG90T3duZXI7XG4gICAgICAgIH0gZWxzZSBpZiAoKG5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQpIHtcbiAgICAgICAgICAgIHAgPSAobm9kZSBhcyBhbnkpLm93bmVyRWxlbWVudDtcbiAgICAgICAgfSBlbHNlIGlmIChwICYmIHAubm9kZVR5cGUgPT09IDExKSB7XG4gICAgICAgICAgICBpZiAoKHAgYXMgU2hhZG93Um9vdCkuaG9zdCkge1xuICAgICAgICAgICAgICAgIHAgPSAocCBhcyBTaGFkb3dSb290KS5ob3N0O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcDtcbiAgICB9XG5cbiAgICBzdGF0aWMgcGFyZW50RWxlbWVudChub2RlOiBOb2RlKSA6IEVsZW1lbnQgfCBudWxsIHtcbiAgICAgICAgbGV0IGVsZW0gOiBFbGVtZW50ID0gbm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBkbyB7IFxuICAgICAgICAgICAgZWxlbSA9IERPTVdhbGtlci5wYXJlbnROb2RlKGVsZW0pIGFzIEVsZW1lbnQ7XG4gICAgICAgIH0gd2hpbGUgKGVsZW0gJiYgZWxlbS5ub2RlVHlwZSAhPT0gMSk7XG4gICAgICAgIHJldHVybiBlbGVtO1xuICAgIH1cblxuICAgIHN0YXRpYyBhc3NpZ25TbG90cyhyb290OiBTaGFkb3dSb290KSB7XG4gICAgICAgIGxldCBzbG90cyA9IHJvb3QucXVlcnlTZWxlY3RvckFsbChcInNsb3RcIik7XG4gICAgICAgIGZvciAobGV0IGlTbG90PTA7IGlTbG90PHNsb3RzLmxlbmd0aDsgKytpU2xvdCkge1xuICAgICAgICAgICAgbGV0IHByb2Nlc3NTbG90ID0gc2xvdHNbaVNsb3RdO1xuICAgICAgICAgICAgbGV0IGFzc2lnbmVkTm9kZXMgPSBwcm9jZXNzU2xvdC5hc3NpZ25lZE5vZGVzKCk7XG4gICAgICAgICAgICBmb3IgKGxldCBpQXNzaWduZWQ9MDsgaUFzc2lnbmVkPGFzc2lnbmVkTm9kZXMubGVuZ3RoOyArK2lBc3NpZ25lZCkge1xuICAgICAgICAgICAgICAgIChhc3NpZ25lZE5vZGVzW2lBc3NpZ25lZF0gYXMgYW55KS5zbG90T3duZXIgPSBwcm9jZXNzU2xvdDtcbiAgICAgICAgICAgICAgICAoYXNzaWduZWROb2Rlc1tpQXNzaWduZWRdIGFzIGFueSkuc2xvdEluZGV4ID0gaUFzc2lnbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGZpcnN0Q2hpbGROb3RPd25lZEJ5U2xvdChub2RlOiBOb2RlKSB7XG4gICAgICAgIGxldCByZXRWYWwgPSBub2RlLmZpcnN0Q2hpbGQ7XG4gICAgICAgIHdoaWxlIChyZXRWYWwgJiYgKHJldFZhbCBhcyBhbnkpLnNsb3RPd25lcikge1xuICAgICAgICAgICAgcmV0VmFsID0gcmV0VmFsLm5leHRTaWJsaW5nO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgc3RhdGljIGxhc3RDaGlsZE5vdE93bmVkQnlTbG90KG5vZGU6IE5vZGUpIHtcbiAgICAgICAgbGV0IHJldFZhbCA9IG5vZGUubGFzdENoaWxkO1xuICAgICAgICB3aGlsZSAocmV0VmFsICYmIChyZXRWYWwgYXMgYW55KS5zbG90T3duZXIpIHtcbiAgICAgICAgICAgIHJldFZhbCA9IHJldFZhbC5wcmV2aW91c1NpYmxpbmc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICBzdGF0aWMgbmV4dFNpYmxpbmdOb3RPd25lZEJ5U2xvdChub2RlOk5vZGUpIHtcbiAgICAgICAgbGV0IHJldFZhbCA9IG5vZGUubmV4dFNpYmxpbmc7XG4gICAgICAgIHdoaWxlIChyZXRWYWwgJiYgKHJldFZhbCBhcyBhbnkpLnNsb3RPd25lcikge1xuICAgICAgICAgICAgcmV0VmFsID0gcmV0VmFsLm5leHRTaWJsaW5nO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgc3RhdGljIHByZXZpb3VzU2libGluZ05vdE93bmVkQnlTbG90KG5vZGU6Tm9kZSkge1xuICAgICAgICBsZXQgcmV0VmFsID0gbm9kZS5wcmV2aW91c1NpYmxpbmc7XG4gICAgICAgIHdoaWxlIChyZXRWYWwgJiYgKHJldFZhbCBhcyBhbnkpLnNsb3RPd25lcikge1xuICAgICAgICAgICAgcmV0VmFsID0gcmV0VmFsLnByZXZpb3VzU2libGluZztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIGF0Um9vdCgpIDogYm9vbGVhbiB7XG4gICAgICAgIGlmICgodGhpcy5ub2RlIGFzIGFueSkub3duZXJFbGVtZW50KSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLnJvb3QgPT09IHRoaXMubm9kZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5yb290LmlzU2FtZU5vZGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJvb3QuaXNTYW1lTm9kZSh0aGlzLm5vZGUpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucm9vdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucm9vdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbih0aGlzLm5vZGUpID09PSAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gTm90IHN1cHBvcnRlZCBpbiB0aGlzIGVudmlyb25tZW50IC0gdHJ5IG91ciBiZXN0XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5ub2RlLnBhcmVudE5vZGUgPT09IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBERUJVR0lEWCA9IDA7XG4gICAgaW5kZW50ID0gMDtcbiAgICBuZXh0Tm9kZSgpIDogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGluZGVudCA9ICgpID0+IHtcbiAgICAgICAgICAgIGxldCBzID0gXCJcIjtcbiAgICAgICAgICAgIGZvciAobGV0IGlkeD0wOyBpZHg8dGhpcy5pbmRlbnQ7ICsraWR4KSB7XG4gICAgICAgICAgICAgICAgcyArPSBcIiBcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzO1xuICAgICAgICB9XG4gICAgICAgIGxldCBEQkcgPSBmYWxzZTsvL3RoaXMuREVCVUdJRFggPj0gNyAmJiB0aGlzLkRFQlVHSURYIDw9IDEwO1xuICAgICAgICBsZXQgc3RhcnROYW1lID0gdGhpcy5ub2RlLm5vZGVOYW1lO1xuICAgICAgICBpZiAoIXRoaXMubm9kZSkge1xuICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyh0aGlzLm5vZGUubm9kZU5hbWUsIHRoaXMuYkVuZFRhZz9cIkVORFwiOlwiU1RBUlRcIiwgdGhpcy5ub2RlLm5vZGVUeXBlID09PSAxICYmICh0aGlzLm5vZGUgYXMgYW55KS5nZXRBdHRyaWJ1dGUoXCJpZFwiKSk7XG4gICAgICAgICAgICBpZiAoIXRoaXMuYkVuZFRhZykge1xuICAgICAgICAgICAgICAgIGxldCBpZnJhbWVOb2RlID0gKHRoaXMubm9kZSBhcyBIVE1MSUZyYW1lRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgbGV0IGVsZW1lbnROb2RlID0gKHRoaXMubm9kZSBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgbGV0IHNsb3RFbGVtZW50ID0gKHRoaXMubm9kZSBhcyBIVE1MU2xvdEVsZW1lbnQpXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLyBcbiAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5ub2RlLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiSUZSQU1FXCJcbiAgICAgICAgICAgICAgICAgICAgJiYgKHRoaXMuY29uc2lkZXJIaWRkZW4gPyBWaXNVdGlsLmlzTm9kZVZpc2libGUoaWZyYW1lTm9kZSkgOiB0cnVlKVxuICAgICAgICAgICAgICAgICAgICAmJiBpZnJhbWVOb2RlLmNvbnRlbnREb2N1bWVudFxuICAgICAgICAgICAgICAgICAgICAmJiBpZnJhbWVOb2RlLmNvbnRlbnREb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBEQkcgJiYgY29uc29sZS5sb2coXCIhISFJbnRvIEZyYW1lXCIpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgb3duZXJFbGVtZW50ID0gdGhpcy5ub2RlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBpZnJhbWVOb2RlLmNvbnRlbnREb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICh0aGlzLm5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQgPSBvd25lckVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8gXG4gICAgICAgICAgICAgICAgICAgICYmICh0aGlzLmNvbnNpZGVySGlkZGVuID8gVmlzVXRpbC5pc05vZGVWaXNpYmxlKGVsZW1lbnROb2RlKSA6IHRydWUpXG4gICAgICAgICAgICAgICAgICAgICYmIGVsZW1lbnROb2RlLnNoYWRvd1Jvb3RcbiAgICAgICAgICAgICAgICAgICAgJiYgZWxlbWVudE5vZGUuc2hhZG93Um9vdC5maXJzdENoaWxkKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgREJHICYmIGNvbnNvbGUubG9nKFwiISEhSW50byBzaGFkb3cgcm9vdFwiKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG93bmVyRWxlbWVudCA9IHRoaXMubm9kZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gZWxlbWVudE5vZGUuc2hhZG93Um9vdDtcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMubm9kZSBhcyBhbnkpLm93bmVyRWxlbWVudCA9IG93bmVyRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgRE9NV2Fsa2VyLmFzc2lnblNsb3RzKHRoaXMubm9kZSBhcyBTaGFkb3dSb290KTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMVxuICAgICAgICAgICAgICAgICAgICAmJiBlbGVtZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInNsb3RcIlxuICAgICAgICAgICAgICAgICAgICAmJiBzbG90RWxlbWVudC5hc3NpZ25lZE5vZGVzKCkubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIERCRyAmJiBjb25zb2xlLmxvZyhcIiEhIUludG8gc2xvdFwiKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gc2xvdEVsZW1lbnQuYXNzaWduZWROb2RlcygpWzBdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLyB8fCB0aGlzLm5vZGUubm9kZVR5cGUgPT09IDExIC8qIE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSAqLylcbiAgICAgICAgICAgICAgICAgICAgJiYgRE9NV2Fsa2VyLmZpcnN0Q2hpbGROb3RPd25lZEJ5U2xvdCh0aGlzLm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIERCRyAmJiBjb25zb2xlLmxvZyhcIiEhIUZpcnN0IGNoaWxkXCIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBET01XYWxrZXIuZmlyc3RDaGlsZE5vdE93bmVkQnlTbG90KHRoaXMubm9kZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgREJHICYmIGNvbnNvbGUubG9nKFwiISEhRmxpcCB0byBlbmQgdGFnXCIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgREJHICYmIGNvbnNvbGUubG9nKFwiISEhMVwiKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hdFJvb3QoKSkge1xuICAgICAgICAgICAgICAgICAgICBEQkcgJiYgY29uc29sZS5sb2coXCIhISFEb25lIGF0IHJvb3RcIik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCh0aGlzLm5vZGUgYXMgYW55KS5zbG90T3duZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNsb3RPd25lciA9ICh0aGlzLm5vZGUgYXMgYW55KS5zbG90T3duZXI7XG4gICAgICAgICAgICAgICAgICAgIGxldCBuZXh0U2xvdEluZGV4ID0gKHRoaXMubm9kZSBhcyBhbnkpLnNsb3RJbmRleCsxO1xuICAgICAgICAgICAgICAgICAgICAvLyBkZWxldGUgKHRoaXMubm9kZSBhcyBhbnkpLnNsb3RPd25lcjtcbiAgICAgICAgICAgICAgICAgICAgLy8gZGVsZXRlICh0aGlzLm5vZGUgYXMgYW55KS5zbG90SW5kZXg7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0U2xvdEluZGV4IDwgc2xvdE93bmVyLmFzc2lnbmVkTm9kZXMoKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIERCRyAmJiBjb25zb2xlLmxvZyhcIiEhIU5leHQgc2xvdCBjaGlsZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHNsb3RPd25lci5hc3NpZ25lZE5vZGVzKClbbmV4dFNsb3RJbmRleF07XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIERCRyAmJiBjb25zb2xlLmxvZyhcIiEhIUJhY2sgdXAgdG8gc2xvdCBvd25lclwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHNsb3RPd25lcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCh0aGlzLm5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgREJHICYmIGNvbnNvbGUubG9nKFwiISEhVXAgdG8gZnJhbWUgb3duZXJcIik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9ICh0aGlzLm5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChET01XYWxrZXIubmV4dFNpYmxpbmdOb3RPd25lZEJ5U2xvdCh0aGlzLm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIERCRyAmJiBjb25zb2xlLmxvZyhcIiEhIU5leHQgc2libGluZ1wiKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gRE9NV2Fsa2VyLm5leHRTaWJsaW5nTm90T3duZWRCeVNsb3QodGhpcy5ub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm5vZGUucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgICAgICAgICBEQkcgJiYgY29uc29sZS5sb2coXCIhISFQYXJlbnRcIik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHRoaXMubm9kZS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIERCRyAmJiBjb25zb2xlLmxvZyhcIiEhIURvbmUgd2l0aCB3YWxrXCIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKERCRyAmJiAoXG4gICAgICAgICAgICAgICAgKHRoaXMubm9kZS5ub2RlVHlwZSAhPT0gMSAmJiB0aGlzLm5vZGUubm9kZVR5cGUgIT09IDExICYmIHRoaXMubm9kZS5ub2RlVHlwZSAhPT0gMyApXG4gICAgICAgICAgICAgICAgfHwgKHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSAmJiAodGhpcy5ub2RlIGFzIEVsZW1lbnQpLmdldEF0dHJpYnV0ZShcImFDaGVja2VyXCIpID09PSBcIkFDRVwiKVxuICAgICAgICAgICAgKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuREVCVUcgJiYgY29uc29sZS5sb2coaW5kZW50KCkrYDwke3RoaXMuYkVuZFRhZz9cIi9cIjpcIlwifSR7dGhpcy5ub2RlLm5vZGVOYW1lfT4gKGZyb20gJHtzdGFydE5hbWV9KSAke3RoaXMuREVCVUdJRFgrK30gU0tJUFBFRGApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IHdoaWxlIChcbiAgICAgICAgICAgICh0aGlzLm5vZGUubm9kZVR5cGUgIT09IDEgJiYgdGhpcy5ub2RlLm5vZGVUeXBlICE9PSAxMSAmJiB0aGlzLm5vZGUubm9kZVR5cGUgIT09IDMgKVxuICAgICAgICAgICAgfHwgKHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSAmJiAodGhpcy5ub2RlIGFzIEVsZW1lbnQpLmdldEF0dHJpYnV0ZShcImFDaGVja2VyXCIpID09PSBcIkFDRVwiKVxuICAgICAgICApO1xuICAgICAgICBpZiAodGhpcy5iRW5kVGFnKSB0aGlzLmluZGVudCAtPSAyO1xuICAgICAgICB0aGlzLkRFQlVHICYmIGNvbnNvbGUubG9nKGluZGVudCgpK2A8JHt0aGlzLmJFbmRUYWc/XCIvXCI6XCJcIn0ke3RoaXMubm9kZS5ub2RlTmFtZX0+IChmcm9tICR7c3RhcnROYW1lfSkgJHt0aGlzLkRFQlVHSURYKyt9YCk7XG4gICAgICAgIHRoaXMuREVCVUcgJiYgKHRoaXMubm9kZSBhcyBhbnkpLnNsb3RPd25lciAmJiBjb25zb2xlLmxvZyhpbmRlbnQoKStgc2xvdE93bmVyOiAkeyh0aGlzLm5vZGUgYXMgYW55KS5zbG90T3duZXIubm9kZU5hbWV9YCk7XG4gICAgICAgIHRoaXMuREVCVUcgJiYgKHRoaXMubm9kZSBhcyBhbnkpLnNsb3RJbmRleCAmJiBjb25zb2xlLmxvZyhpbmRlbnQoKStgc2xvdEluZGV4OiAkeyh0aGlzLm5vZGUgYXMgYW55KS5zbG90SW5kZXh9YCk7XG4gICAgICAgIHRoaXMuREVCVUcgJiYgKHRoaXMubm9kZSBhcyBhbnkpLm93bmVyRWxlbWVudCAmJiBjb25zb2xlLmxvZyhpbmRlbnQoKStgb3duZXJFbGVtZW50OiAkeyh0aGlzLm5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQubm9kZU5hbWV9YCk7XG4gICAgICAgIGlmICghdGhpcy5iRW5kVGFnKSB0aGlzLmluZGVudCArPSAyO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcmV2Tm9kZSgpIDogYm9vbGVhbiB7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmJFbmRUYWcpIHtcbiAgICAgICAgICAgICAgICBsZXQgaWZyYW1lTm9kZSA9ICh0aGlzLm5vZGUgYXMgSFRNTElGcmFtZUVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGxldCBlbGVtZW50Tm9kZSA9ICh0aGlzLm5vZGUgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8gXG4gICAgICAgICAgICAgICAgICAgICYmIHRoaXMubm9kZS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIklGUkFNRVwiXG4gICAgICAgICAgICAgICAgICAgICYmICh0aGlzLmNvbnNpZGVySGlkZGVuID8gVmlzVXRpbC5pc05vZGVWaXNpYmxlKGlmcmFtZU5vZGUpIDogdHJ1ZSlcbiAgICAgICAgICAgICAgICAgICAgJiYgaWZyYW1lTm9kZS5jb250ZW50RG9jdW1lbnRcbiAgICAgICAgICAgICAgICAgICAgJiYgaWZyYW1lTm9kZS5jb250ZW50RG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSBcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBvd25lckVsZW1lbnQgPSB0aGlzLm5vZGU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IGlmcmFtZU5vZGUuY29udGVudERvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMubm9kZSBhcyBhbnkpLm93bmVyRWxlbWVudCA9IG93bmVyRWxlbWVudDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqL1xuICAgICAgICAgICAgICAgICAgICAmJiAodGhpcy5jb25zaWRlckhpZGRlbiA/IFZpc1V0aWwuaXNOb2RlVmlzaWJsZShlbGVtZW50Tm9kZSkgOiB0cnVlKVxuICAgICAgICAgICAgICAgICAgICAmJiBlbGVtZW50Tm9kZS5zaGFkb3dSb290XG4gICAgICAgICAgICAgICAgICAgICYmIGVsZW1lbnROb2RlLnNoYWRvd1Jvb3QubGFzdENoaWxkKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG93bmVyRWxlbWVudCA9IHRoaXMubm9kZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gZWxlbWVudE5vZGUuc2hhZG93Um9vdDtcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMubm9kZSBhcyBhbnkpLm93bmVyRWxlbWVudCA9IG93bmVyRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgRE9NV2Fsa2VyLmFzc2lnblNsb3RzKHRoaXMubm9kZSBhcyBTaGFkb3dSb290KTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMVxuICAgICAgICAgICAgICAgICAgICAmJiBlbGVtZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInNsb3RcIlxuICAgICAgICAgICAgICAgICAgICAmJiAoZWxlbWVudE5vZGUgYXMgSFRNTFNsb3RFbGVtZW50KS5hc3NpZ25lZE5vZGVzKCkubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEVudGVyIHNsb3Qgd2l0aCBhc3NpZ25lZCBub2RlcyAtIGdvIHRvIGxhc3QgYXNzaWduZWQgbm9kZVxuICAgICAgICAgICAgICAgICAgICBsZXQgc2xvdEVsZW1lbnQgPSBlbGVtZW50Tm9kZSBhcyBIVE1MU2xvdEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHNsb3RFbGVtZW50LmFzc2lnbmVkTm9kZXMoKVtzbG90RWxlbWVudC5hc3NpZ25lZE5vZGVzKCkubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgodGhpcy5ub2RlLm5vZGVUeXBlID09PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovIHx8IHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMTEpXG4gICAgICAgICAgICAgICAgICAgICYmIERPTVdhbGtlci5sYXN0Q2hpbGROb3RPd25lZEJ5U2xvdCh0aGlzLm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IERPTVdhbGtlci5sYXN0Q2hpbGROb3RPd25lZEJ5U2xvdCh0aGlzLm5vZGUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYXRSb290KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHRoaXMubm9kZSBhcyBhbnkpLnNsb3RPd25lcikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgc2xvdE93bmVyID0gKHRoaXMubm9kZSBhcyBhbnkpLnNsb3RPd25lcjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHByZXZTbG90SW5kZXggPSAodGhpcy5ub2RlIGFzIGFueSkuc2xvdEluZGV4IC0gMTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZTbG90SW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gc2xvdE93bmVyLmFzc2lnbmVkTm9kZXMoKVtwcmV2U2xvdEluZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBzbG90T3duZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoRE9NV2Fsa2VyLnByZXZpb3VzU2libGluZ05vdE93bmVkQnlTbG90KHRoaXMubm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gRE9NV2Fsa2VyLnByZXZpb3VzU2libGluZ05vdE93bmVkQnlTbG90KHRoaXMubm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgodGhpcy5ub2RlIGFzIGFueSkub3duZXJFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9ICh0aGlzLm5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5ub2RlLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gdGhpcy5ub2RlLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gd2hpbGUgKFxuICAgICAgICAgICAgKHRoaXMubm9kZS5ub2RlVHlwZSAhPT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLyAmJiB0aGlzLm5vZGUubm9kZVR5cGUgIT09IDExICYmIHRoaXMubm9kZS5ub2RlVHlwZSAhPT0gMyApXG4gICAgICAgICAgICB8fCAodGhpcy5ub2RlLm5vZGVUeXBlID09PSAxICYmICh0aGlzLm5vZGUgYXMgRWxlbWVudCkuZ2V0QXR0cmlidXRlKFwiYUNoZWNrZXJcIikgPT09IFwiQUNFXCIpXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgIENvcHlyaWdodDo6IDIwMjAtIElCTSwgSW5jXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IGVSdWxlUG9saWN5IH0gZnJvbSBcIi4vSVJ1bGVcIlxuXG5leHBvcnQgZW51bSBlVG9vbGtpdExldmVsIHtcbiAgICBMRVZFTF9PTkUgPSBcIjFcIixcbiAgICBMRVZFTF9UV08gPSBcIjJcIixcbiAgICBMRVZFTF9USFJFRSA9IFwiM1wiLFxuICAgIExFVkVMX0ZPVVIgPSBcIjRcIlxufVxuXG5leHBvcnQgZW51bSBlR3VpZGVsaW5lQ2F0ZWdvcnkge1xuICAgIEFDQ0VTU0lCSUxJVFkgPSBcIkFjY2Vzc2liaWxpdHlcIixcbiAgICBERVNJR04gPSBcIkRlc2lnblwiLFxuICAgIE9USEVSID0gXCJPdGhlclwiXG59XG5cbmV4cG9ydCBlbnVtIGVHdWlkZWxpbmVUeXBlIHtcbiAgICBERUZBVUxUID0gXCJkZWZhdWx0XCIsXG4gICAgRVhURU5TSU9OID0gXCJleHRlbnNpb25cIlxufVxuXG5leHBvcnQgdHlwZSBDaGVja3BvaW50ID0ge1xuICAgIG51bTogc3RyaW5nLFxuICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vYWN0LXJ1bGVzL2FjdC10b29scy9ibG9iL21haW4vc3JjL2RhdGEvc2MtdXJscy5qc29uXG4gICAgc2NJZD86IHN0cmluZyxcbiAgICAvLyBKQ0g6IGFkZCBuYW1lIG9mIGNoZWNrcG9pbnQgYW5kIHN1bW1hcnkgZGVzY3JpcHRpb25cbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgd2NhZ0xldmVsOiBzdHJpbmcsXG4gICAgc3VtbWFyeTogc3RyaW5nLFxuICAgIHJ1bGVzPzogQXJyYXk8eyBcbiAgICAgICAgaWQ6IHN0cmluZywgXG4gICAgICAgIC8vIChvcHRpb25hbCkgUmVhc29uIGNvZGVzIHRoYXQgdGhpcyBydWxlc2V0IG1hcHBpbmcgYXBwbGllcyB0bywgXG4gICAgICAgIC8vIG9yIGFsbCBpZiBub3Qgc3BlY2lmaWVkXG4gICAgICAgIHJlYXNvbkNvZGVzPzogc3RyaW5nW10sXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeSwgXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbCxcbiAgICAgICAgZW5hYmxlZD86IGJvb2xlYW5cbiAgICB9PlxufVxuXG5leHBvcnQgdHlwZSBHdWlkZWxpbmUgPSB7XG4gICAgaWQ6IHN0cmluZyxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgY2F0ZWdvcnk6IGVHdWlkZWxpbmVDYXRlZ29yeSxcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nLFxuICAgIHR5cGU/OiBlR3VpZGVsaW5lVHlwZSxcbiAgICBjaGVja3BvaW50czogQXJyYXk8Q2hlY2twb2ludD5cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMC0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgZUd1aWRlbGluZUNhdGVnb3J5LCBlR3VpZGVsaW5lVHlwZSB9IGZyb20gXCIuL0lHdWlkZWxpbmVcIjtcbmltcG9ydCB7IElNYXBSZXN1bHQgfSBmcm9tIFwiLi9JTWFwcGVyXCI7XG5pbXBvcnQgeyBObHNNYXAgYXMgTmxzTWFwTmV3LCBIZWxwTWFwIGFzIEhlbHBNYXBOZXcsIElFbmdpbmUgYXMgSUVuZ2luZU5ldyB9IGZyb20gXCIuL0lFbmdpbmVcIjtcbmltcG9ydCB7IFJlcG9ydCBhcyBSZXBvcnROZXcgfSBmcm9tIFwiLi9JUmVwb3J0XCI7XG5pbXBvcnQgeyBlVG9vbGtpdExldmVsIGFzIGVUb29sa2l0TGV2ZWxOZXcgfSBmcm9tIFwiLi9JR3VpZGVsaW5lXCJcbmltcG9ydCB7IEJvdW5kcyB9IGZyb20gXCIuL0lCb3VuZHNcIjtcblxuZXhwb3J0IGVudW0gZVJ1bGVDb25maWRlbmNlIHtcbiAgICBQQVNTID0gXCJQQVNTXCIsXG4gICAgRkFJTCA9IFwiRkFJTFwiLFxuICAgIFBPVEVOVElBTCA9IFwiUE9URU5USUFMXCIsXG4gICAgTUFOVUFMID0gXCJNQU5VQUxcIlxufVxuXG5leHBvcnQgZW51bSBlUnVsZVBvbGljeSB7XG4gICAgVklPTEFUSU9OID0gXCJWSU9MQVRJT05cIixcbiAgICBSRUNPTU1FTkRBVElPTiA9IFwiUkVDT01NRU5EQVRJT05cIixcbiAgICBJTkZPUk1BVElPTiA9IFwiSU5GT1JNQVRJT05cIlxufVxuXG5leHBvcnQgZnVuY3Rpb24gUnVsZVBhc3MocmVhc29uSWQ6IG51bWJlciB8IHN0cmluZywgbWVzc2FnZUFyZ3M/IDogc3RyaW5nW10sIGFwaUFyZ3M/IDogYW55W10pIDogUnVsZVJlc3VsdCB7XG4gICAgaWYgKHR5cGVvZiByZWFzb25JZCA9PT0gXCJ1bmRlZmluZWRcIiB8fCByZWFzb25JZCA9PT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKFwiUmVhc29uIElEIG11c3QgYmUgZGVmaW5lZFwiKTtcbiAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogW2VSdWxlUG9saWN5LklORk9STUFUSU9OLCBlUnVsZUNvbmZpZGVuY2UuUEFTU10sXG4gICAgICAgIHJlYXNvbklkOiByZWFzb25JZCxcbiAgICAgICAgbWVzc2FnZUFyZ3M6IG1lc3NhZ2VBcmdzIHx8IFtdLFxuICAgICAgICBhcGlBcmdzOiBhcGlBcmdzIHx8IFtdXG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gUnVsZVJlbmRlcihyZWFzb25JZDogbnVtYmVyIHwgc3RyaW5nLCBtZXNzYWdlQXJncz8gOiBzdHJpbmdbXSwgYXBpQXJncz8gOiBhbnlbXSkgOiBSdWxlUmVzdWx0IHtcbiAgICBpZiAodHlwZW9mIHJlYXNvbklkID09PSBcInVuZGVmaW5lZFwiIHx8IHJlYXNvbklkID09PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoXCJSZWFzb24gSUQgbXVzdCBiZSBkZWZpbmVkXCIpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiBbZVJ1bGVQb2xpY3kuSU5GT1JNQVRJT04sIGVSdWxlQ29uZmlkZW5jZS5QQVNTXSxcbiAgICAgICAgcmVhc29uSWQ6IDAsXG4gICAgICAgIG1lc3NhZ2VBcmdzOiBtZXNzYWdlQXJncyB8fCBbXSxcbiAgICAgICAgYXBpQXJnczogYXBpQXJncyB8fCBbXVxuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBSdWxlRmFpbChyZWFzb25JZDogbnVtYmVyIHwgc3RyaW5nLCBtZXNzYWdlQXJncz8gOiBzdHJpbmdbXSwgYXBpQXJncz8gOiBhbnlbXSkgOiBSdWxlUmVzdWx0IHtcbiAgICBpZiAodHlwZW9mIHJlYXNvbklkID09PSBcInVuZGVmaW5lZFwiIHx8IHJlYXNvbklkID09PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoXCJSZWFzb24gSUQgbXVzdCBiZSBkZWZpbmVkXCIpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiBbZVJ1bGVQb2xpY3kuSU5GT1JNQVRJT04sIGVSdWxlQ29uZmlkZW5jZS5GQUlMXSxcbiAgICAgICAgcmVhc29uSWQ6IHJlYXNvbklkLFxuICAgICAgICBtZXNzYWdlQXJnczogbWVzc2FnZUFyZ3MgfHwgW10sXG4gICAgICAgIGFwaUFyZ3M6IGFwaUFyZ3MgfHwgW11cbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBSdWxlUG90ZW50aWFsKHJlYXNvbklkOiBudW1iZXIgfCBzdHJpbmcsIG1lc3NhZ2VBcmdzPyA6IHN0cmluZ1tdLCBhcGlBcmdzPyA6IGFueVtdKSA6IFJ1bGVSZXN1bHQge1xuICAgIGlmICh0eXBlb2YgcmVhc29uSWQgPT09IFwidW5kZWZpbmVkXCIgfHwgcmVhc29uSWQgPT09IG51bGwpIHRocm93IG5ldyBFcnJvcihcIlJlYXNvbiBJRCBtdXN0IGJlIGRlZmluZWRcIik7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IFtlUnVsZVBvbGljeS5JTkZPUk1BVElPTiwgZVJ1bGVDb25maWRlbmNlLlBPVEVOVElBTF0sXG4gICAgICAgIHJlYXNvbklkOiByZWFzb25JZCxcbiAgICAgICAgbWVzc2FnZUFyZ3M6IG1lc3NhZ2VBcmdzIHx8IFtdLFxuICAgICAgICBhcGlBcmdzOiBhcGlBcmdzIHx8IFtdXG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gUnVsZU1hbnVhbChyZWFzb25JZDogbnVtYmVyIHwgc3RyaW5nLCBtZXNzYWdlQXJncz8gOiBzdHJpbmdbXSwgYXBpQXJncz8gOiBhbnlbXSkgOiBSdWxlUmVzdWx0IHtcbiAgICBpZiAodHlwZW9mIHJlYXNvbklkID09PSBcInVuZGVmaW5lZFwiIHx8IHJlYXNvbklkID09PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoXCJSZWFzb24gSUQgbXVzdCBiZSBkZWZpbmVkXCIpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiBbZVJ1bGVQb2xpY3kuSU5GT1JNQVRJT04sIGVSdWxlQ29uZmlkZW5jZS5NQU5VQUxdLFxuICAgICAgICByZWFzb25JZDogcmVhc29uSWQsXG4gICAgICAgIG1lc3NhZ2VBcmdzOiBtZXNzYWdlQXJncyB8fCBbXSxcbiAgICAgICAgYXBpQXJnczogYXBpQXJncyB8fCBbXVxuICAgIH1cbn1cblxuZXhwb3J0IHR5cGUgUnVsZVJlc3VsdCA9IHtcbiAgICB2YWx1ZTogW2VSdWxlUG9saWN5LCBlUnVsZUNvbmZpZGVuY2VdLFxuICAgIHJlYXNvbklkPzogbnVtYmVyIHwgc3RyaW5nLFxuICAgIG1lc3NhZ2VBcmdzPzogc3RyaW5nW10sXG4gICAgYXBpQXJncz86IGFueVtdXG59XG5cbmV4cG9ydCB0eXBlIElzc3VlID0gUnVsZVJlc3VsdCAmIHtcbiAgICBydWxlSWQ6IHN0cmluZyxcblxuICAgIG5vZGU6IE5vZGUsXG4gICAgLy8gbmFtZXNwYWNlOiBzdHJpbmcsXG4gICAgY2F0ZWdvcnk/OiBlR3VpZGVsaW5lQ2F0ZWdvcnksXG4gICAgcGF0aDogeyBbbnM6IHN0cmluZ10gOiBzdHJpbmcgfSxcblxuICAgIHJ1bGVUaW1lOiBudW1iZXIsXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIGJvdW5kcz86IEJvdW5kcyxcbiAgICBzbmlwcGV0OiBzdHJpbmcsXG4gICAgc291cmNlPzogc3RyaW5nLFxuICAgIGxldmVsPzogc3RyaW5nXG59XG5cbmV4cG9ydCB0eXBlIFJ1bGVDb250ZXh0SGllcmFyY2h5ID0geyBbbmFtZXNwYWNlOiBzdHJpbmddIDogSU1hcFJlc3VsdFtdIH07XG5cbmV4cG9ydCB0eXBlIFJ1bGVDb250ZXh0ID0ge1xuICAgIFtuYW1lc3BhY2U6IHN0cmluZ10gOiBJTWFwUmVzdWx0XG59XG5cbmV4cG9ydCB0eXBlIFJ1bGUgPSB7XG4gICAgLy8gVW5pcXVlIHN0cmluZyBpZGVudGlmaWVyIGZvciB0aGlzIHJ1bGUgKHNob3VsZCBiZSBodW1hbiB1bmRlcnN0YW5kYWJsZSlcbiAgICAvLyBOTFMgY29kZXMgYW5kIGhlbHAgc291cmNlcyB3aWxsIGJlIGJhc2VkIG9mZiBvZiB0aGlzIGlkXG4gICAgaWQ6IHN0cmluZztcblxuICAgIHJ1bGVzZXRzOiBBcnJheTx7XG4gICAgICAgIGlkOiBzdHJpbmcgfCBzdHJpbmdbXVxuICAgICAgICBudW06IHN0cmluZyB8IHN0cmluZ1tdXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeSxcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsTmV3LFxuICAgICAgICAvLyAob3B0aW9uYWwpIFJlYXNvbiBjb2RlcyB0aGF0IHRoaXMgcnVsZXNldCBtYXBwaW5nIGFwcGxpZXMgdG8sIFxuICAgICAgICAvLyBvciBhbGwgaWYgbm90IHNwZWNpZmllZFxuICAgICAgICByZWFzb25Db2Rlcz86IHN0cmluZ1tdXG4gICAgfT5cblxuICAgIHJlZmFjdG9yPzoge1xuICAgICAgICBbb2xkUnVsZUlkOiBzdHJpbmddOiB7XG4gICAgICAgICAgICBbb2xkUmVhc29uQ29kZTogc3RyaW5nXTogc3RyaW5nXG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgW2xvY2FsZTogc3RyaW5nXToge1xuICAgICAgICAgICAgW3JlYXNvbklkOiBzdHJpbmddOiBzdHJpbmdcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBoZWxwOiB7XG4gICAgICAgIFtsb2NhbGU6IHN0cmluZ106IHtcbiAgICAgICAgICAgIFtyZWFzb25JZDogc3RyaW5nXTogc3RyaW5nXG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqIFxuICAgICAqIEhvdyB0aGlzIHJ1bGUgbWFwcyB0byBBQ1QgcnVsZXMsIGlmIGFueSAoaHR0cHM6Ly9hY3QtcnVsZXMuZ2l0aHViLmlvL3J1bGVzLylcbiAgICAgKiBcbiAgICAgKiBzdHJpbmc6IEZvciBhIHNpbmdsZSBydWxlIG1hcHBpbmcgdGhhdCBtYXRjaGVzIGV4YWN0bHkgdG8gdGhlIHJ1bGUgKFBhc3MgLT4gcGFzcywgUG90ZW50aWFsIC0+IGNhbnRUZWxsLCBGYWlsIC0+IGZhaWwsIHVubGlzdGVkID0+IGluYXBwbGljYWJsZSlcbiAgICAgKiBBcnJheTw+OiBDdXN0b20gbWFwcGluZyBvZiBydWxlIHRvIEFDVCByZXN1bHRzXG4gICAgICovXG4gICAgYWN0Pzogc3RyaW5nIHwgc3RyaW5nW10gfCBBcnJheTxzdHJpbmcgfCB7XG4gICAgICAgIFthY3RSdWxlSWQ6IHN0cmluZ106IHtcbiAgICAgICAgICAgIFtyZWFzb25JZDogc3RyaW5nXTogXCJwYXNzXCIgfCBcImZhaWxcIiB8IFwiY2FudFRlbGxcIiB8IFwiaW5hcHBsaWNhYmxlXCJcbiAgICAgICAgfVxuICAgIH0+XG5cbiAgICAvLyBTZWUgc3JjL3YyL2NvbW1vbi9Db250ZXh0LnRzIGZvciB2YWxpZCBjb250ZXh0c1xuICAgIGNvbnRleHQ6IHN0cmluZztcblxuICAgIC8vIEFycmF5IG9mIHJ1bGVzIHRoYXQgbXVzdCBwYXNzIHRvIGFsbG93IHRoaXMgdmFsaWRhdGUgdG8gcnVuIC0gdGhleSBtdXN0IGhhdmUgdGhlIHNhbWUgY29udGV4dCBwcm9wZXJ0eVxuICAgIGRlcGVuZGVuY2llcz86IHN0cmluZ1tdXG5cbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSkgPT4gUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSB8IG51bGxcblxuICAgIGVuYWJsZWQ/OiBib29sZWFuXG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWRcbiAqL1xuZXhwb3J0IHR5cGUgUnVsZURldGFpbHMgPSBJc3N1ZTtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBTZWUgSUVuZ2luZVxuICovXG5leHBvcnQgdHlwZSBSZXBvcnQgPSBSZXBvcnROZXc7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgU2VlIElFbmdpbmVcbiAqL1xuZXhwb3J0IHR5cGUgTmxzTWFwID0gTmxzTWFwTmV3O1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIFNlZSBJRW5naW5lXG4gKi9cbmV4cG9ydCB0eXBlIEhlbHBNYXAgPSBIZWxwTWFwTmV3O1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIFNlZSAuL0lFbmdpbmVcbiAqL1xuZXhwb3J0IHR5cGUgSUVuZ2luZSA9IElFbmdpbmVOZXc7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgU2VlIC4vSUd1aWRlbGluZVxuICovXG5leHBvcnQgeyBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4vSUd1aWRlbGluZVwiO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIFNlZSAuL0lHdWlkZWxpbmU6ZUd1aWRlbGluZUNhdGVnb3J5XG4gKi9cbmV4cG9ydCB7IGVHdWlkZWxpbmVDYXRlZ29yeSBhcyBlUnVsZUNhdGVnb3J5IH0gZnJvbSBcIi4vSUd1aWRlbGluZVwiO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIFNlZSAuL0lHdWlkZWxpbmU6ZUd1aWRlbGluZVR5cGVcbiAqL1xuZXhwb3J0IHsgZUd1aWRlbGluZVR5cGUgYXMgZVJ1bGVzZXRUeXBlIH0gZnJvbSBcIi4vSUd1aWRlbGluZVwiO1xuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlIGFzIFJ1bGVWNCwgZVJ1bGVQb2xpY3kgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBFbmdpbmUgfSBmcm9tIFwiLi4vLi4vdjIvY29tbW9uL0VuZ2luZVwiO1xuaW1wb3J0IHsgQVJJQU1hcHBlciB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFNYXBwZXJcIjtcbmltcG9ydCB7IGExMXlSdWxlc2V0cyB9IGZyb20gXCIuLi9ydWxlc2V0c1wiO1xuaW1wb3J0ICogYXMgY2hlY2tSdWxlc1Y0IGZyb20gXCIuLi9ydWxlc1wiO1xuaW1wb3J0IHsgR3VpZGVsaW5lLCBlR3VpZGVsaW5lQ2F0ZWdvcnkgfSBmcm9tIFwiLi4vYXBpL0lHdWlkZWxpbmVcIjtcbmltcG9ydCB7IElFbmdpbmUgfSBmcm9tIFwiLi4vYXBpL0lFbmdpbmVcIjtcbmltcG9ydCB7IFJlcG9ydCB9IGZyb20gXCIuLi9hcGkvSVJlcG9ydFwiO1xuaW1wb3J0IHsgSUNoZWNrZXIgfSBmcm9tIFwiLi4vYXBpL0lDaGVja2VyXCI7XG5cbmxldCBjaGVja1J1bGVzID0gW107XG5sZXQgY2hlY2tObHMgPSB7fTtcbmxldCBjaGVja0hlbHAgPSB7fTtcblxuZnVuY3Rpb24gX2luaXRpYWxpemUoKSB7XG4gICAgY29uc3QgbGFuZ3MgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KEVuZ2luZS5nZXRMYW5ndWFnZXMoKSkpO1xuICAgIC8vIERlZmF1bHQgbGFuZyB0byBlbi1VUyBpZiBub3RoaW5nIGVsc2Ugc3BlY2lmaWVkIGlzIGZvdW5kXG4gICAgbGFuZ3MucHVzaChcImVuLVVTXCIpO1xuICAgIC8vIFByb2Nlc3MgVjQgcnVsZXMgaW50byB0aGUgVjIgZm9ybWF0XG4gICAgZm9yIChsZXQgcnVsZW5hbWUgaW4gY2hlY2tSdWxlc1Y0KSB7XG4gICAgICAgIC8vIENvbnZlcnQgcnVsZVxuICAgICAgICBsZXQgdjRSdWxlOiBSdWxlVjQgPSBjaGVja1J1bGVzVjRbcnVsZW5hbWVdO1xuICAgICAgICBjaGVja1J1bGVzLnB1c2godjRSdWxlKTtcbiAgICAgICAgLy8gR28gYmFja3dhcmRzIGJlY2F1c2UgdGhlIGZpcnN0IGxhbmcgaXMgdGhlIHByZWZlcnJlZCwgc29cbiAgICAgICAgLy8gZWFybGllciBsYW5ndWFnZXMgd2lsbCBvdmVycmlkZSBsYXRlciBsYW5ndWFnZXNcbiAgICAgICAgZm9yIChsZXQgaWR4PWxhbmdzLmxlbmd0aC0xOyBpZHggPj0wOyAtLWlkeCkge1xuICAgICAgICAgICAgY29uc3QgbGFuZ0lkID0gbGFuZ3NbaWR4XTtcbiAgICAgICAgICAgIGlmIChsYW5nSWQgaW4gdjRSdWxlLm1lc3NhZ2VzKSB7XG4gICAgICAgICAgICAgICAgY2hlY2tObHNbdjRSdWxlLmlkXSA9IHY0UnVsZS5tZXNzYWdlc1tsYW5nSWRdO1xuICAgICAgICAgICAgICAgIGNoZWNrTmxzW3Y0UnVsZS5pZF1bMF0gPSBjaGVja05sc1t2NFJ1bGUuaWRdLmdyb3VwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGxhbmdJZCBpbiB2NFJ1bGUuaGVscCkge1xuICAgICAgICAgICAgICAgIGNoZWNrSGVscFt2NFJ1bGUuaWRdID0ge307XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCByZWFzb25JZCBpbiB2NFJ1bGUuaGVscFtsYW5nSWRdKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoZWNrSGVscFt2NFJ1bGUuaWRdW3JlYXNvbklkXSA9IGAvJHtsYW5nSWR9LyR7djRSdWxlLmhlbHBbbGFuZ0lkXVtyZWFzb25JZF19YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2hlY2tObHNbdjRSdWxlLmlkXVswXSA9IGNoZWNrTmxzW3Y0UnVsZS5pZF0uZ3JvdXA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ29udmVydCBSU1xuICAgICAgICBmb3IgKGNvbnN0IHJzU2VjdGlvbiBvZiB2NFJ1bGUucnVsZXNldHMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcnMgb2YgYTExeVJ1bGVzZXRzIGFzIEd1aWRlbGluZVtdKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNoZWNrUnNJZHMgOiBzdHJpbmdbXSA9IHR5cGVvZiByc1NlY3Rpb24uaWQgPT09IFwic3RyaW5nXCIgPyBbcnNTZWN0aW9uLmlkXSA6IHJzU2VjdGlvbi5pZDtcbiAgICAgICAgICAgICAgICBpZiAoY2hlY2tSc0lkcy5pbmNsdWRlcyhycy5pZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBjcCBvZiBycy5jaGVja3BvaW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNoZWNrQ1BJZHMgOiBzdHJpbmdbXSA9IHR5cGVvZiByc1NlY3Rpb24ubnVtID09PSBcInN0cmluZ1wiID8gW3JzU2VjdGlvbi5udW1dIDogcnNTZWN0aW9uLm51bTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGVja0NQSWRzLmluY2x1ZGVzKGNwLm51bSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcC5ydWxlcyA9IGNwLnJ1bGVzIHx8IFtdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3AucnVsZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiB2NFJ1bGUuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbkNvZGVzOiByc1NlY3Rpb24ucmVhc29uQ29kZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiByc1NlY3Rpb24ubGV2ZWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2xraXRMZXZlbDogcnNTZWN0aW9uLnRvb2xraXRMZXZlbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5faW5pdGlhbGl6ZSgpO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIFNlZSAuLi9hcGkvSUd1aWRlbGluZVxuICovXG5leHBvcnQgdHlwZSBSdWxlc2V0ID0gR3VpZGVsaW5lO1xuXG5leHBvcnQgY2xhc3MgQ2hlY2tlciBpbXBsZW1lbnRzIElDaGVja2VyIHtcbiAgICBwcml2YXRlIGd1aWRlbGluZXM6IEd1aWRlbGluZVtdID0gW107XG5cbiAgICBlbmdpbmU6IElFbmdpbmU7XG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIGdldEd1aWRlbGluZXMoKS5cbiAgICAgKi9cbiAgICBydWxlc2V0czogR3VpZGVsaW5lW10gPSB0aGlzLmd1aWRlbGluZXM7XG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIGdldEd1aWRlbGluZUlkcygpLlxuICAgICAqL1xuICAgIHJ1bGVzZXRJZHM6IHN0cmluZ1tdID0gW107XG4gICAgcnVsZXNldFJ1bGVzOiB7IFtyc0lkOiBzdHJpbmddOiBzdHJpbmdbXSB9ID0ge307XG4gICAgcnVsZUxldmVscyA6IHsgW3J1bGVJZDogc3RyaW5nXTogeyBbcnNJZDogc3RyaW5nXSA6IGVSdWxlUG9saWN5IH19ID0ge307XG4gICAgcnVsZVJlYXNvbkxldmVscyA6IHsgW3J1bGVJZDogc3RyaW5nXTogeyBbcnNJZDogc3RyaW5nXSA6IHtbcmVhc29uQ29kZXM6IHN0cmluZ10gOiBlUnVsZVBvbGljeSB9fX0gPSB7fTtcbiAgICBydWxlQ2F0ZWdvcnkgOiB7IFtydWxlSWQ6IHN0cmluZ106IHsgW3JzSWQ6IHN0cmluZ10gOiBlR3VpZGVsaW5lQ2F0ZWdvcnkgfX0gPSB7fTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgbGV0IGVuZ2luZSA9IHRoaXMuZW5naW5lID0gbmV3IEVuZ2luZSgpO1xuXG4gICAgICAgIGVuZ2luZS5hZGRNYXBwZXIobmV3IEFSSUFNYXBwZXIoKSk7XG5cbiAgICAgICAgZW5naW5lLmFkZFJ1bGVzKGNoZWNrUnVsZXMpO1xuICAgICAgICBlbmdpbmUuYWRkTmxzTWFwKGNoZWNrTmxzKTtcbiAgICAgICAgZW5naW5lLmFkZEhlbHBNYXAoY2hlY2tIZWxwKTtcblxuICAgICAgICBmb3IgKGNvbnN0IHJzIG9mIGExMXlSdWxlc2V0cykge1xuICAgICAgICAgICAgdGhpcy5hZGRSdWxlc2V0KHJzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBndWlkZWxpbmUgdG8gdGhlIGVuZ2luZS4gSWYgdGhlIGlkIGFscmVhZHkgZXhpc3RzLCB0aGUgcHJldmlvdXMgZ3VpZGVsaW5lIHdpbGwgYmUgcmVwbGFjZWQuXG4gICAgICogQHBhcmFtIGd1aWRlbGluZSBcbiAgICAgKi9cbiAgICBhZGRHdWlkZWxpbmUoZ3VpZGVsaW5lOiBHdWlkZWxpbmUpIHtcbiAgICAgICAgaWYgKGd1aWRlbGluZS5pZCBpbiB0aGlzLnJ1bGVzZXRSdWxlcykge1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVHdWlkZWxpbmUoZ3VpZGVsaW5lLmlkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmd1aWRlbGluZXMucHVzaChndWlkZWxpbmUpO1xuICAgICAgICB0aGlzLnJ1bGVzZXRJZHMucHVzaChndWlkZWxpbmUuaWQpO1xuICAgICAgICBjb25zdCBydWxlSWRzID0gW107XG4gICAgICAgIGZvciAoY29uc3QgY3Agb2YgZ3VpZGVsaW5lLmNoZWNrcG9pbnRzKSB7XG4gICAgICAgICAgICBjcC5ydWxlcyA9IGNwLnJ1bGVzIHx8IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBydWxlIG9mIGNwLnJ1bGVzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJ1bGUuZW5hYmxlZCAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgcnVsZUlkcy5wdXNoKHJ1bGUuaWQpO1xuICAgICAgICAgICAgICAgICAgICAvL3RoaXMucnVsZUxldmVsc1tydWxlLmlkXSA9IHRoaXMucnVsZUxldmVsc1tydWxlLmlkXSB8fCB7fTtcbiAgICAgICAgICAgICAgICAgICAgLy90aGlzLnJ1bGVMZXZlbHNbcnVsZS5pZF1bZ3VpZGVsaW5lLmlkXSA9IHJ1bGUubGV2ZWw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucnVsZVJlYXNvbkxldmVsc1tydWxlLmlkXSA9IHRoaXMucnVsZVJlYXNvbkxldmVsc1tydWxlLmlkXSB8fCB7fTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ydWxlUmVhc29uTGV2ZWxzW3J1bGUuaWRdW2d1aWRlbGluZS5pZF0gPSB0aGlzLnJ1bGVSZWFzb25MZXZlbHNbcnVsZS5pZF1bZ3VpZGVsaW5lLmlkXSB8fCB7fTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29kZSA9IHJ1bGUucmVhc29uQ29kZXMgPyBydWxlLnJlYXNvbkNvZGVzLmpvaW4oJy0tJykgOiBcIk5vbmVcIjtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ydWxlUmVhc29uTGV2ZWxzW3J1bGUuaWRdW2d1aWRlbGluZS5pZF1bY29kZV0gPSBydWxlLmxldmVsO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJ1bGVDYXRlZ29yeVtydWxlLmlkXSA9IHRoaXMucnVsZUNhdGVnb3J5W3J1bGUuaWRdIHx8IHt9O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJ1bGVDYXRlZ29yeVtydWxlLmlkXVtndWlkZWxpbmUuaWRdID0gZ3VpZGVsaW5lLmNhdGVnb3J5O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJ1bGVzZXRSdWxlc1tndWlkZWxpbmUuaWRdID0gcnVsZUlkcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGUgYSBydWxlIGZvciBhbGwgZ3VpZGVsaW5lc1xuICAgICAqIEBwYXJhbSBydWxlSWQgXG4gICAgICovXG4gICAgZW5hYmxlUnVsZShydWxlSWQ6IHN0cmluZykge1xuICAgICAgICBmb3IgKGNvbnN0IGd1aWRlbGluZSBvZiB0aGlzLmdldEd1aWRlbGluZXMoKSkge1xuICAgICAgICAgICAgbGV0IHVwZGF0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY3Agb2YgZ3VpZGVsaW5lLmNoZWNrcG9pbnRzKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBydWxlIG9mIGNwLnJ1bGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChydWxlLmVuYWJsZWQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBydWxlLmVuYWJsZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodXBkYXRlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkR3VpZGVsaW5lKGd1aWRlbGluZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNhYmxlIGEgcnVsZSBmb3IgYWxsIGd1aWRlbGluZXNcbiAgICAgKiBAcGFyYW0gcnVsZUlkIFxuICAgICAqL1xuICAgIGRpc2FibGVSdWxlKHJ1bGVJZDogc3RyaW5nKSB7XG4gICAgICAgIGZvciAoY29uc3QgZ3VpZGVsaW5lIG9mIHRoaXMuZ2V0R3VpZGVsaW5lcygpKSB7XG4gICAgICAgICAgICBsZXQgdXBkYXRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yIChjb25zdCBjcCBvZiBndWlkZWxpbmUuY2hlY2twb2ludHMpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHJ1bGUgb2YgY3AucnVsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGUuZW5hYmxlZCAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcnVsZS5lbmFibGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodXBkYXRlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkR3VpZGVsaW5lKGd1aWRlbGluZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgYSBndWlkZWxpbmUgZnJvbSB0aGUgZW5naW5lXG4gICAgICogXG4gICAgICogR2VuZXJhbGx5LCB0aGVyZSBpc24ndCBhIGdvb2QgcmVhc29uIHRvIGRvIHRoaXMuIFVzZXJzIHNob3VsZCBqdXN0IG5vdCBzZWxlY3QgdGhlIGd1aWRlbGluZSBhcyBhbiBvcHRpb24gaW4gY2hlY2tcbiAgICAgKiBAcGFyYW0gZ3VpZGVsaW5lSWRcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlbW92ZUd1aWRlbGluZShndWlkZWxpbmVJZDogc3RyaW5nKSB7XG4gICAgICAgIGlmIChndWlkZWxpbmVJZCBpbiB0aGlzLnJ1bGVzZXRSdWxlcykge1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMucnVsZXNldFJ1bGVzW2d1aWRlbGluZUlkXTtcbiAgICAgICAgICAgIHRoaXMucnVsZXNldHMgPSB0aGlzLmd1aWRlbGluZXMgPSB0aGlzLmd1aWRlbGluZXMuZmlsdGVyKGd1aWRlbGluZSA9PiBndWlkZWxpbmUuaWQgIT09IGd1aWRlbGluZUlkKTtcbiAgICAgICAgICAgIHRoaXMucnVsZXNldElkcyA9IHRoaXMuZ2V0R3VpZGVsaW5lSWRzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGd1aWRlbGluZXMgYXZhaWxhYmxlIGluIHRoZSBlbmdpbmVcbiAgICAgKiBAcmV0dXJucyBcbiAgICAgKi9cbiAgICBnZXRHdWlkZWxpbmVzKCkgOiBHdWlkZWxpbmVbXSB7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuZ3VpZGVsaW5lcykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgaWRzIG9mIHRoZSBndWlkZWxpbmVzIGF2YWlsYWJsZSBpbiB0aGUgZW5naW5lXG4gICAgICogQHJldHVybnMgXG4gICAgICovXG4gICAgZ2V0R3VpZGVsaW5lSWRzKCkgOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmd1aWRlbGluZXMubWFwKGd1aWRlbGluZSA9PiBndWlkZWxpbmUuaWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEBkZXByZWNhdGVkIFNlZSBhZGRHdWlkZWxpbmVcbiAgICAgKi9cbiAgICBhZGRSdWxlc2V0KHJzOiBSdWxlc2V0KSB7XG4gICAgICAgIHRoaXMuYWRkR3VpZGVsaW5lKHJzKTtcbiAgICB9XG5cbiAgICBlbmFibGVTb3VyY2VNYXAoZW5hYmxlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuZW5naW5lLmVuYWJsZVNvdXJjZU1hcChlbmFibGUpO1xuICAgIH1cblxuICAgIGlzU291cmNlTWFwRW5hYmxlZCgpIDogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVuZ2luZS5pc1NvdXJjZU1hcEVuYWJsZWQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQZXJmb3JtIGEgY2hlY2sgb2YgdGhlIHNwZWNpZmllZCBub2RlL2RvY3VtZW50XG4gICAgICogQHBhcmFtIG5vZGUgRE9NTm9kZSBvciBEb2N1bWVudCBvbiB3aGljaCB0byBydW4gdGhlIGNoZWNrXG4gICAgICogQHBhcmFtIGd1aWRlbGluZUlkcyBHdWlkZWxpbmUgaWRzIHRvIGNoZWNrIHdpdGggdG8gc3BlY2lmeSB3aGljaCBydWxlcyB0byBydW5cbiAgICAgKiBAcmV0dXJucyBcbiAgICAgKi9cbiAgICBjaGVjayhub2RlOiBOb2RlIHwgRG9jdW1lbnQsIGd1aWRlbGluZUlkcz86IHN0cmluZyB8IHN0cmluZ1tdKSA6IFByb21pc2U8UmVwb3J0PiB7XG4gICAgICAgIC8vIERldGVybWluZSB3aGljaCBydWxlcyB0byBydW5cbiAgICAgICAgbGV0IHJ1bGVJZHMgOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICAgIC8vIEZpeCB0aGUgaW5wdXRcbiAgICAgICAgaWYgKCFndWlkZWxpbmVJZHMpIHtcbiAgICAgICAgICAgIHJ1bGVJZHMgPSB0aGlzLmVuZ2luZS5nZXRSdWxlc0lkcygpO1xuICAgICAgICB9IGVsc2V7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGd1aWRlbGluZUlkcyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIGd1aWRlbGluZUlkcyA9IFtndWlkZWxpbmVJZHNdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJzSWQgb2YgZ3VpZGVsaW5lSWRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJzSWQgaW4gdGhpcy5ydWxlc2V0UnVsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgcnVsZUlkcyA9IHJ1bGVJZHMuY29uY2F0KHRoaXMucnVsZXNldFJ1bGVzW3JzSWRdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gICAgXG4gICAgICAgIHRoaXMuZW5naW5lLmVuYWJsZVJ1bGVzKHJ1bGVJZHMpO1xuICAgICAgICAvLyBBZGQgdGhlIHJlcG9ydCBsZXZlbHNcbiAgICAgICAgbGV0IG15VGhpcyA9IHRoaXM7XG4gICAgICAgIHJldHVybiB0aGlzLmVuZ2luZS5ydW4obm9kZSlcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXBvcnQpIHtcbiAgICAgICAgICAgICAgICByZXBvcnQubmxzID0ge31cblxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlcG9ydC5yZXN1bHRzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQucnVsZUlkIGluIGNoZWNrTmxzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXBvcnQubmxzW3Jlc3VsdC5ydWxlSWRdID0gcmVwb3J0Lm5sc1tyZXN1bHQucnVsZUlkXSB8fCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMDogY2hlY2tObHNbcmVzdWx0LnJ1bGVJZF1bMF1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQucmVhc29uSWQgaW4gY2hlY2tObHNbcmVzdWx0LnJ1bGVJZF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnQubmxzW3Jlc3VsdC5ydWxlSWRdW3Jlc3VsdC5yZWFzb25JZF0gPSBjaGVja05sc1tyZXN1bHQucnVsZUlkXVtyZXN1bHQucmVhc29uSWRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vcmVzdWx0LnZhbHVlWzBdID0gbXlUaGlzLmdldExldmVsKGd1aWRlbGluZUlkcyBhcyBzdHJpbmdbXSwgcmVzdWx0LnJ1bGVJZCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjb2RlID0gcmVzdWx0LnJlYXNvbklkPyByZXN1bHQucmVhc29uSWQgYXMgc3RyaW5nIDogXCJOb25lXCI7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC52YWx1ZVswXSA9IG15VGhpcy5nZXRSZWFzb25MZXZlbChndWlkZWxpbmVJZHMgYXMgc3RyaW5nW10sIHJlc3VsdC5ydWxlSWQsIGNvZGUpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQuY2F0ZWdvcnkgPSBteVRoaXMuZ2V0Q2F0ZWdvcnkoZ3VpZGVsaW5lSWRzIGFzIHN0cmluZ1tdLCByZXN1bHQucnVsZUlkKTtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHJlc3VsdC5wYXRoLmNzcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcG9ydDtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgcHJpdmF0ZSBnZXRMZXZlbChyc0lkczogc3RyaW5nW10sIHJ1bGVJZDogc3RyaW5nKSA6IGVSdWxlUG9saWN5IHtcbiAgICAgICAgaWYgKCFyc0lkcykgcmV0dXJuIGVSdWxlUG9saWN5LklORk9STUFUSU9OO1xuICAgICAgICBsZXQgcnNJbmZvID0gdGhpcy5ydWxlTGV2ZWxzW3J1bGVJZF07XG4gICAgICAgIGxldCByZXRWYWwgPSBudWxsO1xuICAgICAgICBpZiAocnNJZHMpIHtcbiAgICAgICAgICAgIGlmICghKHJ1bGVJZCBpbiB0aGlzLnJ1bGVMZXZlbHMpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUnVsZSB0cmlnZ2VyZWQgZm9yIHdoaWNoIHdlIGhhdmUgbm8gcnVsZSBsZXZlbCBpbmZvcm1hdGlvbjogXCIrcnVsZUlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoY29uc3QgcnNJZCBvZiByc0lkcykge1xuICAgICAgICAgICAgICAgIGlmIChyc0lkIGluIHJzSW5mbykge1xuICAgICAgICAgICAgICAgICAgICBpZiAocnNJbmZvW3JzSWRdID09PSBlUnVsZVBvbGljeS5WSU9MQVRJT04pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IGVSdWxlUG9saWN5LlZJT0xBVElPTjtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyc0luZm9bcnNJZF0gPT09IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OICYmIHJldFZhbCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT047XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmV0VmFsID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwgPSBlUnVsZVBvbGljeS5JTkZPUk1BVElPTjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocmV0VmFsID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSdWxlIHRyaWdnZXJlZCBmb3Igd2hpY2ggd2UgaGF2ZSBubyBydWxlIGxldmVsIGluZm9ybWF0aW9uOiBcIitydWxlSWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRSZWFzb25MZXZlbChyc0lkczogc3RyaW5nW10sIHJ1bGVJZDogc3RyaW5nLCByZWFzb25Db2RlPzogc3RyaW5nKSA6IGVSdWxlUG9saWN5IHtcbiAgICAgICAgaWYgKCFyc0lkcykgcmV0dXJuIGVSdWxlUG9saWN5LklORk9STUFUSU9OOyBcbiAgICAgICAgbGV0IHJzSW5mbyA9IHRoaXMucnVsZVJlYXNvbkxldmVsc1tydWxlSWRdO1xuICAgICAgICBsZXQgcmV0VmFsID0gbnVsbDtcbiAgICAgICAgaWYgKHJzSWRzKSB7XG4gICAgICAgICAgICBpZiAoIShydWxlSWQgaW4gdGhpcy5ydWxlUmVhc29uTGV2ZWxzKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlJ1bGUgdHJpZ2dlcmVkIGZvciB3aGljaCB3ZSBoYXZlIG5vIHJ1bGUgbGV2ZWwgaW5mb3JtYXRpb24gXCIrcnVsZUlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoY29uc3QgcnNJZCBvZiByc0lkcykge1xuICAgICAgICAgICAgICAgIGlmIChyc0lkIGluIHJzSW5mbykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZUNvZGUgPSBuZXcgUmVnRXhwKGAoXnwtLSkke3JlYXNvbkNvZGV9KCR8LS0pYCk7XG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHJzSW5mb1tyc0lkXSkuZm9yRWFjaChjb2RlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsZXZlbCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PT0gJ05vbmUnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsID0gcnNJbmZvW3JzSWRdW1wiTm9uZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlQ29kZS50ZXN0KGNvZGUpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsID0gcnNJbmZvW3JzSWRdW2NvZGVdOyBcbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxldmVsICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxldmVsID09PSBlUnVsZVBvbGljeS5WSU9MQVRJT04pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gZVJ1bGVQb2xpY3kuVklPTEFUSU9OO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGV2ZWwgPT09IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OICYmIHJldFZhbCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwgPSBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTjsgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXRWYWwgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gZVJ1bGVQb2xpY3kuSU5GT1JNQVRJT047XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJldFZhbCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gZVJ1bGVQb2xpY3kuSU5GT1JNQVRJT047XG4gICAgICAgICAgICAgICAgICAgIH0gICAgXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IFxuICAgICAgICBpZiAocmV0VmFsID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSdWxlIHRyaWdnZXJlZCBmb3Igd2hpY2ggd2UgaGF2ZSBubyBydWxlIGxldmVsIGluZm9ybWF0aW9uOiBcIitydWxlSWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRDYXRlZ29yeShyc0lkczogc3RyaW5nW10sIHJ1bGVJZD86IHN0cmluZykgOiBlR3VpZGVsaW5lQ2F0ZWdvcnkge1xuICAgICAgICBsZXQgcnNJbmZvID0gdGhpcy5ydWxlQ2F0ZWdvcnlbcnVsZUlkXTtcbiAgICAgICAgbGV0IHJldFZhbCA9IFwiXCI7XG5cbiAgICAgICAgaWYgKCEocnVsZUlkIGluIHRoaXMucnVsZUNhdGVnb3J5KSkge1xuICAgICAgICAgICAgcmV0dXJuIGVHdWlkZWxpbmVDYXRlZ29yeS5PVEhFUjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJzSWRzKSB7XG4gICAgICAgICAgICByc0lkcyA9IHRoaXMuZ2V0R3VpZGVsaW5lSWRzKCk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCByc0lkIG9mIHJzSWRzKSB7XG4gICAgICAgICAgICBpZiAocnNJZCBpbiByc0luZm8pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcnNJbmZvW3JzSWRdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlR3VpZGVsaW5lQ2F0ZWdvcnkuT1RIRVI7XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGNvbnN0IGFfdGFyZ2V0X3dhcm5pbmc6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYV90YXJnZXRfd2FybmluZ1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmFbdGFyZ2V0XSxkb206YXJlYVt0YXJnZXRdLGRvbTpiYXNlW3RhcmdldF1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9BX1RhcmdldEFuZFRleHRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwicG90ZW50aWFsX3dhcm5cIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBgYV90YXJnZXRfd2FybmluZy5odG1sYCxcbiAgICAgICAgICAgIFwicGFzc1wiOiBgYV90YXJnZXRfd2FybmluZy5odG1sYCxcbiAgICAgICAgICAgIFwicG90ZW50aWFsX3dhcm5cIjogYGFfdGFyZ2V0X3dhcm5pbmcuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVXNlcnMgc2hvdWxkIGJlIHdhcm5lZCBpbiBhZHZhbmNlIGlmIHRoZWlyIGlucHV0IGFjdGlvbiB3aWxsIG9wZW4gYSBuZXcgd2luZG93XCIsXG4gICAgICAgICAgICBcInBhc3NcIjogXCJUaGUgdXNlciBpcyB3YXJuZWQgaW4gYWR2YW5jZSB0aGF0IHRoZSBpbnB1dCBhY3Rpb24gb3BlbnMgYSBuZXcgd2luZG93XCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF93YXJuXCI6IFwiSW5mb3JtIHRoZSB1c2VyIHdoZW4gdGhlaXIgaW5wdXQgYWN0aW9uIHdpbGwgb3BlbiBhIG5ldyB3aW5kb3dcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFsgXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIG51bTogXCIzLjIuMlwiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vIHNraXAgdGhlIHJ1bGUgaWYgaXQncyBBVCBoaWRkZW4gYW5kIG5vdCB0YWJiYWJsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpICYmICFDb21tb25VdGlsLmlzVGFiYmFibGUocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgICAgICAgcGFyYW1XaW5UZXh0OiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IFtcIm5ldyB3aW5kb3dcIiwgXCJuZXcgdGFiXCJdLFxuICAgICAgICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIlxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHRTdHIgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0YXJnZXRcIik7XG4gICAgICAgIGxldCBwYXNzZWQgPSB0U3RyID09IFwiX3BhcmVudFwiIHx8IHRTdHIgPT0gXCJfc2VsZlwiIHx8IHRTdHIgPT0gXCJfdG9wXCIgfHwgQ29tbW9uVXRpbC5nZXRGcmFtZUJ5TmFtZShydWxlQ29udGV4dCx0U3RyKSAhPSBudWxsO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgLy8gTmFtZSBpcyBub3QgcGFydCBvZiB0aGlzIGZyYW1lc2V0IOKAkyBtdXN0IGhhdmUgcG90ZW50aWFsIHRvIGNyZWF0ZSBuZXcgd2luZG93P1xuICAgICAgICAgICAgLy8gU2VlIGlmIGEgbmV3IHdpbmRvdyBpcyBtZW50aW9uZWRcbiAgICAgICAgICAgIGxldCB0ZXh0U3RyID0gQ29tbW9uVXRpbC5nZXRJbm5lclRleHQocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInRpdGxlXCIpKVxuICAgICAgICAgICAgICAgIHRleHRTdHIgKz0gXCIgXCIgKyBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0aXRsZVwiKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gQ2hlY2sgYXJpYS1kZXNjcmliZWRieSBmb3Igd2FybmluZyB0ZXh0XG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiYXJpYS1kZXNjcmliZWRieVwiKSkge1xuICAgICAgICAgICAgICAgIGxldCBkZXNjcmliZWRieUlkcyA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtZGVzY3JpYmVkYnlcIikudHJpbSgpLnNwbGl0KC9cXHMrLyk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaWQgb2YgZGVzY3JpYmVkYnlJZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlZmVyZW5jZWRFbGVtID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQocnVsZUNvbnRleHQsIGlkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlZmVyZW5jZWRFbGVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGVzY3JpYmVkVGV4dCA9IENvbW1vblV0aWwuZ2V0SW5uZXJUZXh0KHJlZmVyZW5jZWRFbGVtKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjcmliZWRUZXh0ICYmIGRlc2NyaWJlZFRleHQudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0U3RyICs9IFwiIFwiICsgZGVzY3JpYmVkVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7ICFwYXNzZWQgJiYgaSA8IHBhcmFtcy5wYXJhbVdpblRleHQudmFsdWUubGVuZ3RoOyArK2kpXG4gICAgICAgICAgICAgICAgaWYgKHRleHRTdHIuaW5kZXhPZihwYXJhbXMucGFyYW1XaW5UZXh0LnZhbHVlW2ldKSAhPSAtMSkgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFzc2VkID8gUnVsZVBhc3MoXCJwYXNzXCIpIDogUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF93YXJuXCIpO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFjY05hbWVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQWNjTmFtZVV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFfdGV4dF9wdXJwb3NlOiBSdWxlID0ge1xuICAgIGlkOiBcImFfdGV4dF9wdXJwb3NlXCIsXG4gICAgLy8gZG9jLWJpYmxpb3JlZiBpcyBhIGxpbmtcbiAgICBjb250ZXh0OiBcImFyaWE6bGluayxhcmlhOmRvYy1iaWJsaW9yZWZcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9BX0hhc1RleHRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImZhaWxfYWNjX25hbWVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBgYV90ZXh0X3B1cnBvc2UuaHRtbGAsXG4gICAgICAgICAgICBcInBhc3NcIjogYGFfdGV4dF9wdXJwb3NlLmh0bWxgLFxuICAgICAgICAgICAgXCJmYWlsX2FjY19uYW1lXCI6IGBhX3RleHRfcHVycG9zZS5odG1sYFxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJIeXBlcmxpbmtzIG11c3QgaGF2ZSBhbiBhY2Nlc3NpYmxlIG5hbWUgZm9yIHRoZWlyIHB1cnBvc2VcIixcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIkh5cGVybGluayBoYXMgYSBkZXNjcmlwdGlvbiBvZiBpdHMgcHVycG9zZVwiLFxuICAgICAgICAgICAgXCJmYWlsX2FjY19uYW1lXCI6IFwiSHlwZXJsaW5rIGhhcyBubyBsaW5rIHRleHQsIGxhYmVsIG9yIGltYWdlIHdpdGggYSB0ZXh0IGFsdGVybmF0aXZlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbIFwiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBudW06IFtcIjIuNC40XCIsIFwiNC4xLjJcIl0sIC8vIG51bTogWyBcIjIuNC40XCIsIFwieC55LnpcIiBdIGFsc28gYWxsb3dlZFxuICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBcImM0ODdhZVwiLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30pOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcblxuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IGlzIGhpZGRlbiBvciBkaXNhYmxlZFxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpIHx8IENvbW1vblV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gUnVsZSBvbmx5IHBhc3NlcyBpZiBhbiBlbGVtZW50IGhhcyBpbm5lciBjb250ZW50LFxuICAgICAgICAvLyBpbiB0aGUgY2FzZSB0aGF0IHRoZXJlIGlzIG9ubHkgaGlkZGVuIGNvbnRlbnQgdW5kZXIgdGhlIHRoZSBlbGVtZW50IGl0IGlzIGEgdmlvbGF0aW9uXG4gICAgICAgIGNvbnN0IGFjY05hbWVfcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZShydWxlQ29udGV4dCk7XG4gICAgICAgIGxldCBwYXNzZWQgPVxuICAgICAgICAgICAgKGFjY05hbWVfcGFpciAmJiBhY2NOYW1lX3BhaXIubmFtZSAmJiBhY2NOYW1lX3BhaXIubmFtZS50cmltKCkubGVuZ3RoID4gMCkgXG4gICAgICAgICAgICAvKipBUklBTWFwcGVyLmNvbXB1dGVOYW1lKHJ1bGVDb250ZXh0KS50cmltKCkubGVuZ3RoID4gMCovXG4gICAgICAgICAgICB8fCBDb21tb25VdGlsLm5vblRhYmFibGVDaGlsZENoZWNrKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfYWNjX25hbWVcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGNvbnN0IGFwcGxldF9hbHRfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcImFwcGxldF9hbHRfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJkb206YXBwbGV0XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfQXBwbGV0X0hhc0FsdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiRmFpbF8yXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcIkZhaWxfM1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IGBhcHBsZXRfYWx0X2V4aXN0cy5odG1sYCxcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IGBhcHBsZXRfYWx0X2V4aXN0cy5odG1sYCxcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IGBhcHBsZXRfYWx0X2V4aXN0cy5odG1sYCxcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IGBhcHBsZXRfYWx0X2V4aXN0cy5odG1sYCxcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IGBhcHBsZXRfYWx0X2V4aXN0cy5odG1sYFxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCI8YXBwbGV0PiBlbGVtZW50cyBtdXN0IHByb3ZpZGUgYW4gJ2FsdCcgYXR0cmlidXRlIGFuZCBhbiBhbHRlcm5hdGl2ZSBkZXNjcmlwdGlvblwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJBbiA8YXBwbGV0PiBlbGVtZW50IGRvZXMgbm90IGhhdmUgYW4gJ2FsdCcgYXR0cmlidXRlIHRoYXQgcHJvdmlkZXMgYSBzaG9ydCB0ZXh0IGFsdGVybmF0aXZlXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIlRoZSAnYWx0JyBhdHRyaWJ1dGUgdmFsdWUgZm9yIGFuIDxhcHBsZXQ+IGVsZW1lbnQgZHVwbGljYXRlcyB0aGUgJ2NvZGUnIGF0dHJpYnV0ZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJBbiA8YXBwbGV0PiBlbGVtZW50IHByb3ZpZGVzIGFsdGVybmF0aXZlIHRleHQsIGJ1dCBkb2VzIG5vdCBwcm92aWRlIGlubmVyIGNvbnRlbnRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFsgXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIG51bTogXCIxLjEuMVwiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICAvLyBKQ0ggLSBOTyBPVVQgT0YgU0NPUEUgaGlkZGVuIGluIGNvbnRleHRcbiAgICAgICAgaWYgKCFDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcImFsdFwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IGFsdCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFsdFwiKS50cmltKCk7XG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiY29kZVwiKSAmJiBhbHQgPT0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiY29kZVwiKS50cmltKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzJcIik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFDb21tb25VdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbihydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzNcIik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiAgICAiLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGNvbnN0IGFwcGxpY2F0aW9uX2NvbnRlbnRfYWNjZXNzaWJsZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcHBsaWNhdGlvbl9jb250ZW50X2FjY2Vzc2libGVcIixcbiAgICBjb250ZXh0OiBcImFyaWE6YXBwbGljYXRpb25cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIkhBQUNfQXBwbGljYXRpb25fUm9sZV9UZXh0XCI6IHtcbiAgICAgICAgICAgIDA6IGBIQUFDX0FwcGxpY2F0aW9uX1JvbGVfVGV4dC5odG1sYCxcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgMDogYGFwcGxpY2F0aW9uX2NvbnRlbnRfYWNjZXNzaWJsZS5odG1sYCxcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IGBhcHBsaWNhdGlvbl9jb250ZW50X2FjY2Vzc2libGUuaHRtbGAsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IGBhcHBsaWNhdGlvbl9jb250ZW50X2FjY2Vzc2libGUuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiTm9uLWRlY29yYXRpdmUgc3RhdGljIHRleHQgYW5kIGltYWdlIGNvbnRlbnQgd2l0aGluIGFuIGVsZW1lbnQgd2l0aCBcXFwiYXBwbGljYXRpb25cXFwiIHJvbGUgbXVzdCBiZSBhY2Nlc3NpYmxlXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVmVyaWZ5IHRoYXQgdGhlIG5vbi1kZWNvcmF0aXZlIHN0YXRpYyB0ZXh0IGFuZCBpbWFnZSBjb250ZW50IHdpdGhpbiBhbiBlbGVtZW50IHdpdGggXFxcImFwcGxpY2F0aW9uXFxcIiByb2xlIGFyZSBhY2Nlc3NpYmxlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbIFwiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBudW06IFtcIjEuMS4xXCIsIFwiMi4xLjFcIl0sIC8vbWF0Y2ggbGlzdGluZyBpbiBoZWxwXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuICAgICAgICBsZXQgY2hpbGRyZW4gPSBydWxlQ29udGV4dC5jaGlsZE5vZGVzO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgcGFzc2VkICYmIGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGNoaWxkcmVuW2ldLm5vZGVUeXBlID09PSAxKSB7XG4gICAgICAgICAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlVmlzaWJsZShjaGlsZHJlbltpXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gQXJpYVV0aWwuaGFzUm9sZUluU2VtYW50aWNzKGNoaWxkcmVuW2ldLCBcImRvY3VtZW50XCIpIHx8IEFyaWFVdGlsLmhhc1JvbGVJblNlbWFudGljcyhjaGlsZHJlbltpXSwgXCJhcnRpY2xlXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hpbGRyZW5baV0ubm9kZVR5cGUgPT09IDMpIHtcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSBjaGlsZHJlbltpXS5ub2RlVmFsdWUudHJpbSgpLmxlbmd0aCA9PT0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwYXNzZWQgPyBSdWxlUGFzcyhcIlBhc3NfMFwiKSA6IFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG5leHBvcnQgY29uc3QgYXJlYV9hbHRfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcImFyZWFfYWx0X2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmFyZWFcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9BcmVhX0hhc0FsdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBgYXJlYV9hbHRfZXhpc3RzLmh0bWxgLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogYGFyZWFfYWx0X2V4aXN0cy5odG1sYCxcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IGBhcmVhX2FsdF9leGlzdHMuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiPGFyZWE+IGVsZW1lbnRzIGluIGFuIGltYWdlIG1hcCBtdXN0IGhhdmUgYSB0ZXh0IGFsdGVybmF0aXZlXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIjxhcmVhPiBlbGVtZW50IGluIGFuIGltYWdlIG1hcCBoYXMgbm8gdGV4dCBhbHRlcm5hdGl2ZVwiXG4gICAgICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFsgXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIG51bTogXCIxLjEuMVwiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxufV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIC8vIEpDSCAtIE5PIE9VVCBPRiBTQ09QRSBoaWRkZW4gaW4gY29udGV4dFxuICAgICAgICBpZiAoQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJhbHRcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiAgICAiLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5pbXBvcnQgeyBBY2NOYW1lVXRpbCB9IGZyb20gXCIuLi91dGlsL0FjY05hbWVVdGlsXCI7XG5pbXBvcnQgeyBBUklBRGVmaW5pdGlvbnMgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBRGVmaW5pdGlvbnNcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfYWNjZXNzaWJsZW5hbWVfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfYWNjZXNzaWJsZW5hbWVfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmNvbHVtbmhlYWRlciwgYXJpYTpoZWFkaW5nLCBhcmlhOnJvd2hlYWRlciwgYXJpYTpncmFwaGljcy1kb2N1bWVudCxhcmlhOmdyYXBoaWNzLXN5bWJvbCwgYXJpYTppbWcsYXJpYTppbWFnZSwgZG9jLWJhY2tsaW5rLCBkb2MtYmlibGlvZW50cnksIGRvYy1iaWJsaW9yZWYsIGRvYy1nbG9zc3JlZiwgZG9jLW5vdGVyZWYsIGRvYy1wYWdlYnJlYWssIGRvYy1leGFtcGxlXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImFyaWFfYWNjZXNzaWJsZW5hbWVfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9ub19hY2Nlc3NpYmxlX25hbWVcIjogXCJhcmlhX2FjY2Vzc2libGVuYW1lX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfbm9fYWNjZXNzaWJsZV9uYW1lX2ltYWdlXCI6IFwiYXJpYV9hY2Nlc3NpYmxlbmFtZV9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfYWNjZXNzaWJsZW5hbWVfZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIkFuIGFjY2Vzc2libGUgbmFtZSBpcyBwcm92aWRlZCBmb3IgdGhlIGVsZW1lbnRcIixcbiAgICAgICAgICAgIFwiZmFpbF9ub19hY2Nlc3NpYmxlX25hbWVcIjogXCJFbGVtZW50IDx7MH0+IHdpdGggXFxcInsxfVxcXCIgcm9sZSBoYXMgbm8gYWNjZXNzaWJsZSBuYW1lXCIsXG4gICAgICAgICAgICBcImZhaWxfbm9fYWNjZXNzaWJsZV9uYW1lX2ltYWdlXCI6IFwiRWxlbWVudCA8ezB9PiB3aXRoIFxcXCJ7MX1cXFwiIHJvbGUgaGFzIG5vIGFjY2Vzc2libGUgbmFtZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVsZW1lbnRzIHdpdGggY2VydGFpbiByb2xlcyBzaG91bGQgaGF2ZSBhY2Nlc3NpYmxlIG5hbWVzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkUsXG4gICAgICAgIHJlYXNvbkNvZGVzOiBbXCJmYWlsX25vX2FjY2Vzc2libGVfbmFtZVwiXVxuICAgIH0sXG4gICAge1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiQVJJQVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkUsXG4gICAgICAgIHJlYXNvbkNvZGVzOiBbXCJmYWlsX25vX2FjY2Vzc2libGVfbmFtZV9pbWFnZVwiXVxuICAgIH1dLFxuICAgIGFjdDogW3tcIjIzYTJhOFwiOiB7XCJmYWlsX25vX2FjY2Vzc2libGVfbmFtZV9pbWFnZVwiOiBcImZhaWxcIn19XSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgIC8vIHN2ZyBlbGVtZW50IGlzIGhhbmRsZWQgaW4gc3ZnX2dyYXBoaWNzX2xhYmJlbGxlZCBydWxlIGFuZCBpbWFnZSBydWxlc1xuICAgICAgICBpZiAobm9kZU5hbWUgPT09ICdzdmcnIHx8IG5vZGVOYW1lID09PSAnaW1nJykgcmV0dXJuO1xuICAgICAgICBcbiAgICAgICAgLy8gd2hlbiB0YWJsZSBlbGVtZW50IHdpdGggYSBjYXB0aW9uIGFzIGZpcnN0IGNoaWxkXG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gJ3RhYmxlJyBcbiAgICAgICAgICAgICYmIHJ1bGVDb250ZXh0LmZpcnN0RWxlbWVudENoaWxkICYmIHJ1bGVDb250ZXh0LmZpcnN0RWxlbWVudENoaWxkLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdjYXB0aW9uJ1xuICAgICAgICAgICAgJiYgcnVsZUNvbnRleHQuZmlyc3RFbGVtZW50Q2hpbGQudGV4dENvbnRlbnQgJiYgcnVsZUNvbnRleHQuZmlyc3RFbGVtZW50Q2hpbGQudGV4dENvbnRlbnQudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuXG4gICAgICAgIGNvbnN0IGludmFsaWRSb2xlcyA9IEFyaWFVdGlsLmdldFJvbGVzVW5kZWZpbmVkQnlBcmlhKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKGludmFsaWRSb2xlcyAmJiBpbnZhbGlkUm9sZXMubGVuZ3RoID4gMCkgcmV0dXJuIG51bGw7XG4gICAgICAgIGNvbnN0IGRlcHJlY2F0ZWRSb2xlcyA9IEFyaWFVdGlsLmdldERlcHJlY2F0ZWRBcmlhUm9sZXMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoZGVwcmVjYXRlZFJvbGVzICYmIGRlcHJlY2F0ZWRSb2xlcy5sZW5ndGggPiAwKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgZGVwcmVjYXRlZEF0dHJpYnV0ZXMgPSBBcmlhVXRpbC5nZXREZXByZWNhdGVkQXJpYUF0dHJpYnV0ZXMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoZGVwcmVjYXRlZEF0dHJpYnV0ZXMgJiYgZGVwcmVjYXRlZEF0dHJpYnV0ZXMubGVuZ3RoID4gMCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgbGV0IHJvbGUgPSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoIXJvbGUgfHwgIUFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlXSB8fCAhQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVdLm5hbWVSZXF1aXJlZClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgbmFtZV9wYWlyID0gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKCFuYW1lX3BhaXIgfHwgIW5hbWVfcGFpci5uYW1lIHx8IG5hbWVfcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGlmIChyb2xlID09PSAnaW1nJyB8fCByb2xlID09PSAnaW1hZ2UnKVxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfbm9fYWNjZXNzaWJsZV9uYW1lX2ltYWdlXCIsIFtydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLCByb2xlXSk7IFxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9ub19hY2Nlc3NpYmxlX25hbWVcIiwgW3J1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksIHJvbGVdKTtcbiAgICAgICAgfSAgICBcbiAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdGFiaW5kZXhfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9hY3RpdmVkZXNjZW5kYW50X3RhYmluZGV4X3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJkb206KlthcmlhLWFjdGl2ZWRlc2NlbmRhbnRdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9JbnZhbGlkVGFiaW5kZXhGb3JBY3RpdmVkZXNjZW5kYW50XCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiYXJpYV9hY3RpdmVkZXNjZW5kYW50X3RhYmluZGV4X3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV9hY3RpdmVkZXNjZW5kYW50X3RhYmluZGV4X3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdGFiaW5kZXhfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiVGhlIDx7MH0+IGVsZW1lbnQgdXNpbmcgJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCcgc2V0IHRvIFxcXCJ7MX1cXFwiIGlzIG5vdCB0YWJiYWJsZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVsZW1lbnQgdXNpbmcgJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCcgcHJvcGVydHkgc2hvdWxkIGJlIHRhYmJhYmxlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgLy8gUnVsZSBub3Qgc3VwcG9ydGVkIG9uIG1vYmlsZVxuICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiY2xhc3NcIikgJiYgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiY2xhc3NcIikuc3Vic3RyaW5nKDAsIDMpID09IFwibWJsXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRoZSBlbGVtZW50IGlzIGhpZGRlbiBieSBhIGRpc2FibGVkIEhUTUw1IGF0dHJpYnV0ZSBvciBhcmlhLWRpc2FibGVkOlxuICAgICAgICAvLyAgMS4gSW4gdGhlIGNhc2UgdGhhdCB0aGlzIGVsZW1lbnQgaGFzIGEgZGlzYWJsZWQgYXR0cmlidXRlIGFuZCB0aGUgZWxlbWVudCBzdXBwb3J0cyBpdCwgd2UgbWFyayB0aGlzIHJ1bGUgYXMgcGFzc2VkLlxuICAgICAgICAvLyAgMi4gSW4gdGhlIGNhc2UgdGhhdCB0aGlzIGVsZW1lbnQgaGFzIGFuIGFyaWEtZGlzYWJsZWQgYXR0cmlidXRlIHRoZW4sIHdlIG1hcmsgdGhpcyBydWxlIGFzIHBhc3NlZC5cbiAgICAgICAgLy8gRm9yIGJvdGggb2YgdGhlIGNhc2VzIGFib3ZlIHdlIGRvIG5vdCBuZWVkIHRvIHBlcmZvcm0gYW55IGZ1cnRoZXIgY2hlY2tzLCBhcyB0aGUgZWxlbWVudCBpcyBkaXNhYmxlZCBpbiBzb21lIGZvcm0gb3IgYW5vdGhlci5cbiAgICAgICAgaWYgKENvbW1vblV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vaWdub3JlIGlmIHRoZSBhdHRyaWJ1dGUgJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCcgaXMgYmxhbmtcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiKS50cmltKCkubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIC8vIElmIHRoZSB0YWJpbmRleCBhdHRyaWJ1dGUgaXMgcHJvdmlkZWQgdGhlbiB2ZXJpZnkgdGhhdCBpdCBpcyAwIG9yIC0xXG4gICAgICAgIHBhc3NlZCA9IENvbW1vblV0aWwuaXNUYWJiYWJsZShydWxlQ29udGV4dCk7XG5cbiAgICAgICAgLy8gcGFzcyBpZiBvbmUgb2YgdGhlIGNoaWxkcmVuIGlzIHRhYmJhYmxlLiBpbiB0aGlzIGNhc2UsIHRoZSB0YWIgd2lsbCBzdG9wIG9uIHRoZSBmaXJzdCB0YWJiYWJsZSBlbGVtZW50XG4gICAgICAgIGlmICghcGFzc2VkKSBcbiAgICAgICAgICAgIHBhc3NlZCA9IENvbW1vblV0aWwuZ2V0VGFiYmFibGVDaGlsZHJlbihydWxlQ29udGV4dCkgPiAwO1xuXG4gICAgICAgIC8vIEJ1aWxkIGFycmF5IGZvciBub2RlIHRva2VuXG4gICAgICAgIGxldCByZXRUb2tlbjEgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgcmV0VG9rZW4xLnB1c2gobm9kZU5hbWUpO1xuXG4gICAgICAgIC8vIEJ1aWxkIGFycmF5IGZvciBpZCByZWZlcmVuY2VkIGJ5IGFyaWEtYWN0aXZlZGVzY2VuZGFudFxuICAgICAgICBsZXQgcmV0VG9rZW4yID0gbmV3IEFycmF5KCk7XG4gICAgICAgIHJldFRva2VuMi5wdXNoKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiKS5zcGxpdChcIiBcIikuam9pbihcIiwgXCIpKTtcblxuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIFtydWxlQ29udGV4dF0sICcnLCAnJywgcGFzc2VkID09IHRydWUgPyBbXSA6IFtyZXRUb2tlbjEsIHJldFRva2VuMl0pO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIsIFtyZXRUb2tlbjEudG9TdHJpbmcoKSwgcmV0VG9rZW4yLnRvU3RyaW5nKCldKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgRE9NVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9hY3RpdmVkZXNjZW5kYW50X3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfYWN0aXZlZGVzY2VuZGFudF92YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbYXJpYS1hY3RpdmVkZXNjZW5kYW50XVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiSEFBQ19BY3RpdmVEZXNjZW5kYW50Q2hlY2tcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkZhaWxfMlwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJGYWlsXzNcIlxuICAgICAgICAgICAgLy8gXCJGYWlsXzRcIjogXCJGYWlsXzRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJhcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJhcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgLy8gXCJGYWlsXzRcIjogXCJhcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfYWN0aXZlZGVzY2VuZGFudF92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlRoZSAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JyBwcm9wZXJ0eSBpcyBlbXB0eVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJUaGUgJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCcgcHJvcGVydHkgcmVmZXJlbmNlcyBhIGhpZGRlbiBub2RlXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcIkVsZW1lbnQgaXMgbm90IGEgY29tYm9ib3gsIGFuZCB0aGUgcmVmZXJlbmNlZCBhY3RpdmUtZGVzY2VuZGFudCBlbGVtZW50IGlzIG5vdCBhIHZhbGlkIGRlc2NlbmRhbnRcIixcbiAgICAgICAgICAgIC8vIFwiRmFpbF80XCI6IFwiRWxlbWVudCBpcyBhIGNvbWJvYm94LCBhbmQgdGhlIHJlZmVyZW5jZWQgYWN0aXZlLWRlc2NlbmRhbnQgZWxlbWVudCBpcyBub3QgY29udHJvbGxlZCBieSB0aGlzIGNvbXBvbmVudFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JyBwcm9wZXJ0eSBtdXN0IHJlZmVyZW5jZSB0aGUgJ2lkJyBvZiBhIG5vbi1lbXB0eSwgbm9uLWhpZGRlbiBhY3RpdmUgY2hpbGQgZWxlbWVudFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbeyBcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4yXCJdLCBcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sIFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORSBcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vIGNvbWJvYm94IGFjdGl2ZSBkZXNjZW5kYW50cyBoYW5kbGVkIGJ5ICdjb21ib2JveF9hY3RpdmVfZGVzY2VuZGFudCdcbiAgICAgICAgaWYgKEFyaWFVdGlsLmhhc1JvbGVJblNlbWFudGljcyhydWxlQ29udGV4dCwgXCJjb21ib2JveFwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZGVzY2VuZGFudF9pZCA9IEFyaWFVdGlsLmdldEFyaWFBdHRyaWJ1dGUocnVsZUNvbnRleHQsIFwiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIpO1xuICAgICAgICAvLyBQT0YxOiBUaGUgYXR0cmlidXRlIGlzIGVtcHR5XG4gICAgICAgIGlmICghZGVzY2VuZGFudF9pZCB8fCBkZXNjZW5kYW50X2lkLnRyaW0oKSA9PT0gXCJcIikge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGRlc2NlbmRhbnQgPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChydWxlQ29udGV4dCwgZGVzY2VuZGFudF9pZC50cmltKCkpO1xuICAgICAgICBpZiAoIWRlc2NlbmRhbnQgfHwgRE9NVXRpbC5zYW1lTm9kZShkZXNjZW5kYW50X2lkLCBydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgIC8vIFRoZSByZWZlcmVuY2VkIGVsZW1lbnQgZG9lc24ndCBleGlzdC4gV2UgbGV0IDEwNzcgdG8gdHJpZ2dlciB0aGUgZXJyb3JcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFWaXNVdGlsLmlzTm9kZVZpc2libGUoZGVzY2VuZGFudCkpIHtcbiAgICAgICAgICAgIC8vIFBPRjI6IGFyaWEtYWN0aXZlZGVzY2VuZGFudCByZWZlcmVuY2VzIGEgaGlkZGVuIG5vZGVcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDEuIFRoZSB2YWx1ZSBvZiBhcmlhLWFjdGl2ZWRlc2NlbmRhbnQgcmVmZXJzIHRvIGFuIGVsZW1lbnQgdGhhdCBpcyBlaXRoZXIgYSBkZXNjZW5kYW50IG9mIFxuICAgICAgICAvLyB0aGUgZWxlbWVudCB3aXRoIERPTSBmb2N1c1xuICAgICAgICBpZiAocnVsZUNvbnRleHQuY29udGFpbnMoZGVzY2VuZGFudCkpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwb2ZJZCA9IDI7XG5cbiAgICAgICAgLy8gb3IgaXMgYSBsb2dpY2FsIGRlc2NlbmRhbnQgYXMgaW5kaWNhdGVkIGJ5IHRoZSBhcmlhLW93bnMgYXR0cmlidXRlLlxuICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiYXJpYS1vd25zXCIpKSB7XG4gICAgICAgICAgICBsZXQgb3duZWRfaWRzID0gQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtb3duc1wiKS50cmltKCkpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3duZWRfaWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IG93bmVkX2VsZSA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKHJ1bGVDb250ZXh0LCBvd25lZF9pZHNbaV0pO1xuICAgICAgICAgICAgICAgIGlmIChvd25lZF9lbGUgJiYgIURPTVV0aWwuc2FtZU5vZGUob3duZWRfZWxlLCBydWxlQ29udGV4dCkgJiYgb3duZWRfZWxlLmNvbnRhaW5zKGRlc2NlbmRhbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyAyLiBUaGUgZWxlbWVudCB3aXRoIERPTSBmb2N1cyBpcyBhIHRleHRib3ggd2l0aCBhcmlhLWNvbnRyb2xzIHJlZmVycmluZyB0byBhbiBlbGVtZW50IHRoYXQgXG4gICAgICAgIC8vICBzdXBwb3J0cyBhcmlhLWFjdGl2ZWRlc2NlbmRhbnQsIGFuZCB0aGUgdmFsdWUgb2YgYXJpYS1hY3RpdmVkZXNjZW5kYW50IHNwZWNpZmllZCBmb3IgdGhlIFxuICAgICAgICAvLyAgdGV4dGJveCByZWZlcnMgdG8gZWl0aGVyIGEgZGVzY2VuZGFudCBvZiB0aGUgZWxlbWVudCBjb250cm9sbGVkIGJ5IHRoZSB0ZXh0Ym94IG9yIGlzIGEgbG9naWNhbCBcbiAgICAgICAgLy8gIGRlc2NlbmRhbnQgb2YgdGhhdCBjb250cm9sbGVkIGVsZW1lbnQgYXMgaW5kaWNhdGVkIGJ5IHRoZSBhcmlhLW93bnMgYXR0cmlidXRlLlxuICAgICAgICAvL1xuICAgICAgICBpZiAoQXJpYVV0aWwuaGFzUm9sZUluU2VtYW50aWNzKHJ1bGVDb250ZXh0LCBcInRleHRib3hcIikgJiYgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiYXJpYS1jb250cm9sc1wiKSkge1xuICAgICAgICAgICAgcG9mSWQgPSAzO1xuICAgICAgICAgICAgbGV0IGNvbnRyb2xsZWRfaWRzID0gQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtY29udHJvbHNcIikudHJpbSgpKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbnRyb2xsZWRfaWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNvbnRyb2xsZWRfZWxlID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQocnVsZUNvbnRleHQsIGNvbnRyb2xsZWRfaWRzW2ldKTtcbiAgICAgICAgICAgICAgICBpZiAoY29udHJvbGxlZF9lbGUgJiYgIURPTVV0aWwuc2FtZU5vZGUoY29udHJvbGxlZF9lbGUsIHJ1bGVDb250ZXh0KSAmJiBjb250cm9sbGVkX2VsZS5jb250YWlucyhkZXNjZW5kYW50KSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjb250cm9sbGVkX2VsZS5oYXNBdHRyaWJ1dGUoXCJhcmlhLW93bnNcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG93bnNfaWRzID0gQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKGNvbnRyb2xsZWRfZWxlLmdldEF0dHJpYnV0ZShcImFyaWEtb3duc1wiKS50cmltKCkpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBvd25zX2lkcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG93bmVkX2VsZSA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKHJ1bGVDb250ZXh0LCBvd25zX2lkc1tqXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3duZWRfZWxlICYmICFET01VdGlsLnNhbWVOb2RlKG93bmVkX2VsZSwgcnVsZUNvbnRleHQpICYmIG93bmVkX2VsZS5jb250YWlucyhkZXNjZW5kYW50KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFBPRjM6IEknbSBub3QgYSBjb21ib2JveCwgYW5kIHRoZSByZWZlcmVuY2VkIGFjdGl2ZS1kZXNjZW5kYW50IGlzIG5vdCBhIGRlc2NlbmRhbnQgYW5kIG5vdCBvd25lZCBieSB0aGUgZWxlbWVudCBcbiAgICAgICAgLy8gdGhhdCByZWZlcmVuY2VkIGl0LlxuICAgICAgICBpZiAocG9mSWQgPT0gMykge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8zXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX2FwcGxpY2F0aW9uX2xhYmVsX3VuaXF1ZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2FwcGxpY2F0aW9uX2xhYmVsX3VuaXF1ZVwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTphcHBsaWNhdGlvblwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfTXVsdGlwbGVBcHBsaWNhdGlvbkxhbmRtYXJrc1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiYXJpYV9hcHBsaWNhdGlvbl9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIjogXCJhcmlhX2FwcGxpY2F0aW9uX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9hcHBsaWNhdGlvbl9sYWJlbF91bmlxdWUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiVGhlIGVsZW1lbnQgd2l0aCBcXFwiYXBwbGljYXRpb25cXFwiIHJvbGUgaGFzIGEgdW5pcXVlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCIsXG4gICAgICAgICAgICBcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwiOiBcIk11bHRpcGxlIGVsZW1lbnRzIHdpdGggXFxcImFwcGxpY2F0aW9uXFxcIiByb2xlIGRvIG5vdCBoYXZlIHVuaXF1ZSBsYWJlbHNcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFYWNoIGVsZW1lbnQgd2l0aCBcXFwiYXBwbGljYXRpb25cXFwiIHJvbGUgbXVzdCBoYXZlIGEgdW5pcXVlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjQuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IGR1cHBlZCA9IEFyaWFVdGlsLmlzTGFuZG1hcmtOYW1lVW5pcXVlKHJ1bGVDb250ZXh0LCBcImFwcGxpY2F0aW9uXCIpOyAgICBcbiAgICAgICAgaWYgKGR1cHBlZCA9PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIGlmIChkdXBwZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBY2NOYW1lVXRpbCB9IGZyb20gXCIuLi91dGlsL0FjY05hbWVVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9hcHBsaWNhdGlvbl9sYWJlbGxlZDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2FwcGxpY2F0aW9uX2xhYmVsbGVkXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmFwcGxpY2F0aW9uXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9BcHBsaWNhdGlvbkxhbmRtYXJrTGFiZWxcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImZhaWxfbm9fbGFiZWxcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJhcmlhX2FwcGxpY2F0aW9uX2xhYmVsbGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9ub19sYWJlbFwiOiBcImFyaWFfYXBwbGljYXRpb25fbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfYXBwbGljYXRpb25fbGFiZWxsZWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiVGhlIGVsZW1lbnQgd2l0aCBcXFwiYXBwbGljYXRpb25cXFwiIHJvbGUgaGFzIGEgbGFiZWwgdGhhdCBkZXNjcmliZXMgaXRzIHB1cnBvc2VcIixcbiAgICAgICAgICAgIFwiZmFpbF9ub19sYWJlbFwiOiBcIkVsZW1lbnQgd2l0aCBcXFwiYXBwbGljYXRpb25cXFwiIHJvbGUgZG9lcyBub3QgaGF2ZSBhIGxhYmVsXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWFjaCBlbGVtZW50IHdpdGggXFxcImFwcGxpY2F0aW9uXFxcIiByb2xlIG11c3QgaGF2ZSBhIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjQuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZShydWxlQ29udGV4dCk7XG4gICAgICAgIGlmICghcGFpcikge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9ub19sYWJlbFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9hcnRpY2xlX2xhYmVsX3VuaXF1ZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2FydGljbGVfbGFiZWxfdW5pcXVlXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmFydGljbGVcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX011bHRpcGxlQXJ0aWNsZVJvbGVzX0ltcGxpY2l0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJhcmlhX2FydGljbGVfbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCI6IFwiYXJpYV9hcnRpY2xlX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9hcnRpY2xlX2xhYmVsX3VuaXF1ZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJUaGUgZWxlbWVudCB3aXRoIFxcXCJhcnRpY2xlXFxcIiByb2xlIGhhcyBhIHVuaXF1ZSBsYWJlbCB0aGF0IGRlc2NyaWJlcyBpdHMgcHVycG9zZVwiLFxuICAgICAgICAgICAgXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIjogXCJNdWx0aXBsZSBlbGVtZW50cyB3aXRoIFxcXCJhcnRpY2xlXFxcIiByb2xlIGRvIG5vdCBoYXZlIHVuaXF1ZSBsYWJlbHNcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFYWNoIGVsZW1lbnQgd2l0aCBcXFwiYXJ0aWNsZVxcXCIgcm9sZSBtdXN0IGhhdmUgYSB1bmlxdWUgbGFiZWwgdGhhdCBkZXNjcmliZXMgaXRzIHB1cnBvc2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuNC4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgY29uc3QgZHVwcGVkID0gQXJpYVV0aWwuaXNMYW5kbWFya05hbWVVbmlxdWUocnVsZUNvbnRleHQsIFwiYXJ0aWNsZVwiKTsgICAgXG4gICAgICAgIGlmIChkdXBwZWQgPT0gbnVsbCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgaWYgKGR1cHBlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFSSUFEZWZpbml0aW9ucyB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFEZWZpbml0aW9uc1wiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9hdHRyaWJ1dGVfYWxsb3dlZDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2F0dHJpYnV0ZV9hbGxvd2VkXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfVmFsaWRQcm9wZXJ0eVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBgYXJpYV9hdHRyaWJ1dGVfYWxsb3dlZC5odG1sYCxcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IGBhcmlhX2F0dHJpYnV0ZV9hbGxvd2VkLmh0bWxgLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogYGFyaWFfYXR0cmlidXRlX2FsbG93ZWQuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQVJJQSBhdHRyaWJ1dGVzIG11c3QgYmUgdmFsaWQgZm9yIHRoZSBlbGVtZW50J3Mgcm9sZVwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUaGUgYXR0cmlidXRlKHMpICd7MH0nIHJlZmVyZW5jZWQgYnkgdGhlIGVsZW1lbnQgPHsxfT4gaXMgbm90IGEgdmFsaWQgQVJJQSBzdGF0ZSBvciBwcm9wZXJ0eVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBpZDogWyBcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgbnVtOiBcIjQuMS4yXCIsIC8vIG51bTogWyBcIjIuNC40XCIsIFwieC55LnpcIiBdIGFsc28gYWxsb3dlZFxuICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBcIjVmOTlhN1wiLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBjb250ZXh0QXR0cmlidXRlcyA9IHJ1bGVDb250ZXh0LmF0dHJpYnV0ZXM7XG4gICAgICAgIFxuICAgICAgICAvLyBUaGlzIGdldHMgYWxsIGVsZW1lbnRzIHdpdGggYXR0cmlidXRlcyBzbyB3ZSBzdGlsbCBoYXZlIHNvbWVcbiAgICAgICAgLy8gT3V0IG9mIFNjb3BlIHNpbmNlIG5vdCBhbGwgYXR0cmlidXRlcyBhcmUgYXJpYSBcblxuICAgICAgICBpZiAoY29udGV4dEF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgIGxldCBwcm9wZXJ0eURhdGFUeXBlcyA9IEFSSUFEZWZpbml0aW9ucy5wcm9wZXJ0eURhdGFUeXBlcztcbiAgICAgICAgICAgIGxldCBmYWlsZWRQcm9wZXJ0aWVzID0gXCJcIjtcbiAgICAgICAgICAgIGxldCB0ZXN0ZWRQcm9wZXJ0aWVzID0gMDtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW5ndGggPSBjb250ZXh0QXR0cmlidXRlcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBhdHRyTmFtZSA9IGNvbnRleHRBdHRyaWJ1dGVzW2ldLm5hbWU7XG4gICAgICAgICAgICAgICAgaWYgKEFyaWFVdGlsLmlzRGVmaW5lZEFyaWFBdHRyaWJ1dGUocnVsZUNvbnRleHQsIGF0dHJOYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICB0ZXN0ZWRQcm9wZXJ0aWVzKys7XG4gICAgICAgICAgICAgICAgICAgIC8vIE5vdyB3ZSBqdXN0IGhhdmUgYXJpYSBhdHRyaWJ1dGVzIHdoaWNoIGNhblxuICAgICAgICAgICAgICAgICAgICAvLyBwYXNzIG9yIGZhaWwgYmFzZWQgb24gd2hldGhlciB0aGVyZSBwcm9wZXJ0eSBpcyB2YWxpZFxuICAgICAgICAgICAgICAgICAgICBsZXQgZGF0YVR5cGVzID0gcHJvcGVydHlEYXRhVHlwZXNbYXR0ck5hbWVdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWRhdGFUeXBlcykgeyAvLyBpZiBwcm9wZXJ0eSBpcyBub3QgaW4gdmFsaWQgcHJvcGVydHkgbGlzdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGZhaWxlZFByb3BlcnRpZXMgY29tbWEgc2VwIGxpc3RcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmYWlsZWRQcm9wZXJ0aWVzLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbGVkUHJvcGVydGllcyA9IGF0dHJOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsZWRQcm9wZXJ0aWVzID0gZmFpbGVkUHJvcGVydGllcyArIFwiLCBcIiArIGF0dHJOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRlc3RlZFByb3BlcnRpZXMgPT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChmYWlsZWRQcm9wZXJ0aWVzLmxlbmd0aCAhPSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIsIFtmYWlsZWRQcm9wZXJ0aWVzLCBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vcmV0dXJuIFJ1bGVQYXNzKDEpO1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIC8vIEpDSCAtIHBhc3NpbmcgaXMgYmFzZWQgb24gYWxsIGF0dHJpYnV0ZXMgbm90IGp1c3QgYXJpYSBhdHRyaWJ1dGVzXG4gICAgICAgIC8vICAgICAgIGxlYWRpbmcgdG8gT1ZFUiBDT1VOVElORyBzbyBtb3ZlZCBwYXNzIHVwXG4gICAgICAgIC8vcmV0dXJuIFJ1bGVQYXNzKDEpO1xuICAgIH1cbn1cbiAgICAiLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfYXR0cmlidXRlX2NvbmZsaWN0OiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfYXR0cmlidXRlX2NvbmZsaWN0XCIsXG4gICAgY29udGV4dDogXCJkb206KlthcmlhLXJlcXVpcmVkXSwgZG9tOipbYXJpYS1hdXRvY29tcGxldGVdLCBkb206KlthcmlhLXJlYWRvbmx5XSwgZG9tOipbYXJpYS1kaXNhYmxlZF0sIGRvbToqW2FyaWEtcGxhY2Vob2xkZXJdXCIgXG4gICAgICAgICAgICArIFwiLCBkb206KlthcmlhLWNoZWNrZWRdLCBkb206KlthcmlhLWhpZGRlbl0sIGRvbToqW2FyaWEtdmFsdWVtYXhdLCBkb206KlthcmlhLXZhbHVlbWluXSwgZG9tOipbYXJpYS1jb2xzcGFuXVwiXG4gICAgICAgICAgICArIFwiLCBkb206KlthcmlhLXJvd3NwYW5dXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIC8vIFwicGFzc1wiOiBcImFyaWFfYXR0cmlidXRlX2NvbmZsaWN0Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9jb25mbGljdFwiOiBcImFyaWFfYXR0cmlidXRlX2NvbmZsaWN0Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2F0dHJpYnV0ZV9jb25mbGljdC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICAvLyBcInBhc3NcIjogXCJUaGUgQVJJQSBhdHRyaWJ1dGUgaXMgbm90IGNvbmZsaWN0IHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgSFRNTCBhdHRyaWJ1dGVcIixcbiAgICAgICAgICAgIFwiZmFpbF9jb25mbGljdFwiOiBcIlRoZSBBUklBIGF0dHJpYnV0ZSBcXFwiezB9XFxcIiBpcyBpbiBjb25mbGljdCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIEhUTUwgYXR0cmlidXRlIFxcXCJ7MX1cXFwiXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQW4gQVJJQSBhdHRyaWJ1dGUgbXVzdCBub3QgY29uZmxpY3Qgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBIVE1MIGF0dHJpYnV0ZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAgIC8vIGRlcGVuZGVuY3kgY2hlY2s6IGlmIHRoZSBBUklBIGF0dHJpYnV0ZSBpcyBjb21wbGV0ZWx5IGludmFsaWQsIHNraXAgdGhpcyBjaGVja1xuICAgICAgICBsZXQgaW52YWxpZEF0dHJpYnV0ZXMgPSBBcmlhVXRpbC5nZXRJbnZhbGlkQXJpYUF0dHJpYnV0ZXMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoaW52YWxpZEF0dHJpYnV0ZXMgJiYgaW52YWxpZEF0dHJpYnV0ZXMubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgbGV0IHJldCA9IFtdO1xuICAgICAgICBsZXQgYXJpYUF0dHJpYnV0ZXMgPSBBcmlhVXRpbC5nZXRVc2VyRGVmaW5lZEFyaWFBdHRyaWJ1dGVzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKCFhcmlhQXR0cmlidXRlcyB8fCBhcmlhQXR0cmlidXRlcy5sZW5ndGggPT09MClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCBjb25mbGljdEF0dHJpYnV0ZXMgPSBBcmlhVXRpbC5nZXRDb25mbGljdEFyaWFBbmRIdG1sQXR0cmlidXRlcyhydWxlQ29udGV4dCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29uZmxpY3RBdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICByZXQucHVzaChSdWxlRmFpbChcImZhaWxfY29uZmxpY3RcIiwgW2NvbmZsaWN0QXR0cmlidXRlc1tpXVsnYXJpYUF0dHInXSwgY29uZmxpY3RBdHRyaWJ1dGVzW2ldWydodG1sQXR0ciddXSkpO1xuICAgICAgICAgICAgaWYgKGFyaWFBdHRyaWJ1dGVzLmluY2x1ZGVzKGNvbmZsaWN0QXR0cmlidXRlc1tpXVsnYXJpYUF0dHInXSkpXG4gICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5yZWR1Y2VBcnJheUl0ZW1MaXN0KFtjb25mbGljdEF0dHJpYnV0ZXNbaV1bJ2FyaWFBdHRyJ11dLCBhcmlhQXR0cmlidXRlcyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmV0Lmxlbmd0aCA+IDApIFxuICAgICAgICAgICAgcmV0dXJuIHJldDtcblxuICAgICAgICByZXR1cm4gbnVsbDsgIFxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9hdHRyaWJ1dGVfZGVwcmVjYXRlZDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2F0dHJpYnV0ZV9kZXByZWNhdGVkXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICAvLyBcInBhc3NcIjogXCJhcmlhX2F0dHJpYnV0ZV9kZXByZWNhdGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9hcmlhX3JvbGVcIjogXCJhcmlhX2F0dHJpYnV0ZV9kZXByZWNhdGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9hcmlhX2F0dHJcIjogXCJhcmlhX2F0dHJpYnV0ZV9kZXByZWNhdGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9yb2xlX2F0dHJcIjogXCJhcmlhX2F0dHJpYnV0ZV9kZXByZWNhdGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2F0dHJpYnV0ZV9kZXByZWNhdGVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIC8vIFwicGFzc1wiOiBcIlRoZSBBUklBIHJvbGVzIGFuZCBhdHRyaWJ1dGUgYXJlIHVzZWQgcGVyIHNwZWNpZmljYXRpb25cIixcbiAgICAgICAgICAgIFwiZmFpbF9hcmlhX3JvbGVcIjogXCJUaGUgQVJJQSByb2xlIFxcXCJ7MH1cXFwiIGlzIGRlcHJlY2F0ZWQgaW4gdGhlIEFSSUEgc3BlY2lmaWNhdGlvblwiLFxuICAgICAgICAgICAgXCJmYWlsX2FyaWFfYXR0clwiOiBcIlRoZSBBUklBIGF0dHJpYnV0ZXMgXFxcInswfVxcXCIgYXJlIGRlcHJlY2F0ZWQgaW4gdGhlIEFSSUEgc3BlY2lmaWNhdGlvblwiLFxuICAgICAgICAgICAgXCJmYWlsX3JvbGVfYXR0clwiOiBcIlRoZSBBUklBIGF0dHJpYnV0ZXMgXFxcInswfVxcXCIgYXJlIGRlcHJlY2F0ZWQgZm9yIHRoZSByb2xlIFxcXCJ7MX1cXFwiIGluIHRoZSBBUklBIHNwZWNpZmljYXRpb25cIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJObyBkZXByZWNhdGVkIEFSSUEgcm9sZSBvciBhdHRyaWJ1dGUgc2hvdWxkIGJlIHVzZWRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3sgXG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCJdLCBcbiAgICAgICAgXCJudW1cIjogW1wiQVJJQVwiXSwgXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sIFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFIFxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAgIGxldCByZXQgPSBbXTtcbiAgICAgICAgY29uc3QgZGVwcmVjYXRlZFJvbGVzID0gQXJpYVV0aWwuZ2V0RGVwcmVjYXRlZEFyaWFSb2xlcyhydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChkZXByZWNhdGVkUm9sZXMgJiYgZGVwcmVjYXRlZFJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGVwcmVjYXRlZFJvbGVzLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgICAgIHJldC5wdXNoKFJ1bGVGYWlsKCdmYWlsX2FyaWFfcm9sZScsIFtkZXByZWNhdGVkUm9sZXNbaV1dKSk7ICAgICBcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRlcHJlY2F0ZWRBdHRyaWJ1dGVzID0gQXJpYVV0aWwuZ2V0RGVwcmVjYXRlZEFyaWFBdHRyaWJ1dGVzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKGRlcHJlY2F0ZWRBdHRyaWJ1dGVzICYmIGRlcHJlY2F0ZWRBdHRyaWJ1dGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGVwcmVjYXRlZEF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAvLyBcInJvbGVcIjpcImFueVwiLCBcImF0dHJpYnV0ZVwiOmFyaWFBdHRyc1tpXX1cbiAgICAgICAgICAgICAgICBpZiAoZGVwcmVjYXRlZEF0dHJpYnV0ZXNbaV0ucm9sZSA9PT0gJ2FueScpXG4gICAgICAgICAgICAgICAgICAgIHJldC5wdXNoKFJ1bGVGYWlsKCdmYWlsX2FyaWFfYXR0cicsIFtkZXByZWNhdGVkQXR0cmlidXRlc1tpXS5hdHRyaWJ1dGVdKSk7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICByZXQucHVzaChSdWxlRmFpbCgnZmFpbF9yb2xlX2F0dHInLCBbZGVwcmVjYXRlZEF0dHJpYnV0ZXNbaV0uYXR0cmlidXRlLCBkZXByZWNhdGVkQXR0cmlidXRlc1tpXS5yb2xlXSkpO1xuICAgICAgICAgICAgfSAgICAgICBcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKHJldC5sZW5ndGggPiAwKVxuICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IEFSSUFEZWZpbml0aW9ucyB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFEZWZpbml0aW9uc1wiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfYXR0cmlidXRlX2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2F0dHJpYnV0ZV9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbToqW3JvbGVdXCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJhcmlhX3JvbGVfYWxsb3dlZFwiXSxcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX0VtcHR5UHJvcGVydHlWYWx1ZVwiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcImZhaWxfZW1wdHlfYXR0cmlidXRlXCI6IFwiZmFpbF9lbXB0eV9hdHRyaWJ1dGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiYXJpYV9hdHRyaWJ1dGVfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9lbXB0eV9hdHRyaWJ1dGVcIjogXCJhcmlhX2F0dHJpYnV0ZV9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfYXR0cmlidXRlX2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJmYWlsX2VtcHR5X2F0dHJpYnV0ZVwiOiBcIlRoZSBlbGVtZW50IGF0dHJpYnV0ZShzKTogJ3swfScgdmFsdWUgaXMgZW1wdHlcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJXaGVuIHNwZWNpZnlpbmcgYSByZXF1aXJlZCBBUklBIGF0dHJpYnV0ZSwgdGhlIHZhbHVlIG11c3Qgbm90IGJlIGVtcHR5XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXCI2YTcyODFcIl0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcblxuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IGlzIGhpZGRlblxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGxldCBhdHRyTmFtZUFyciA9IG5ldyBBcnJheSgpO1xuICAgICAgICBsZXQgZGVzaWduUGF0dGVybnMgPSBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnM7XG4gICAgICAgIGxldCBoYXNBdHRyaWJ1dGUgPSBDb21tb25VdGlsLmhhc0F0dHJpYnV0ZTtcbiAgICAgICAgbGV0IHRlc3RlZFByb3BlcnRpZXMgPSAwO1xuXG4gICAgICAgIGxldCByb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKCFyb2xlKSByZXR1cm47XG4gICAgICAgIGlmIChkZXNpZ25QYXR0ZXJuc1tyb2xlXSAmJiBBcmlhVXRpbC5nZXRSb2xlUmVxdWlyZWRQcm9wZXJ0aWVzKHJvbGUsIHJ1bGVDb250ZXh0KSAhPSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgcmVxdWlyZWRSb2xlUHJvcHMgPSBBcmlhVXRpbC5nZXRSb2xlUmVxdWlyZWRQcm9wZXJ0aWVzKHJvbGUsIHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW5ndGggPSByZXF1aXJlZFJvbGVQcm9wcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBhdHRyaWJ1dGUgPSByZXF1aXJlZFJvbGVQcm9wc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoaGFzQXR0cmlidXRlKHJ1bGVDb250ZXh0LCBhdHRyaWJ1dGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRlc3RlZFByb3BlcnRpZXMrKztcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5vZGVWYWx1ZSA9IENvbW1vblV0aWwubm9ybWFsaXplU3BhY2luZyhydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUocmVxdWlyZWRSb2xlUHJvcHNbaV0pKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGVWYWx1ZS5sZW5ndGggPT0gMCkgYXR0ck5hbWVBcnIucHVzaChyZXF1aXJlZFJvbGVQcm9wc1tpXSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXF1aXJlZFJvbGVQcm9wc1tpXSA9PSBcImFyaWEtbGFiZWxsZWRieVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgocm9sZSA9PSBcInJhZGlvZ3JvdXBcIikgJiYgKGhhc0F0dHJpYnV0ZShydWxlQ29udGV4dCwgXCJhcmlhLWxhYmVsXCIpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGVzdGVkUHJvcGVydGllcysrO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5vZGVWYWx1ZSA9IENvbW1vblV0aWwubm9ybWFsaXplU3BhY2luZyhydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlVmFsdWUubGVuZ3RoID09IDApIGF0dHJOYW1lQXJyLnB1c2goXCJhcmlhLWxhYmVsXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXF1aXJlZFJvbGVQcm9wc1tpXSA9PSBcImFyaWEtdmFsdWVub3dcIikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoKHJvbGUgPT0gXCJwcm9ncmVzc2JhclwiKSAmJiAoaGFzQXR0cmlidXRlKHJ1bGVDb250ZXh0LCBcImFyaWEtdmFsdWV0ZXh0XCIpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGVzdGVkUHJvcGVydGllcysrO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5vZGVWYWx1ZSA9IENvbW1vblV0aWwubm9ybWFsaXplU3BhY2luZyhydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhcmlhLXZhbHVldGV4dFwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZVZhbHVlLmxlbmd0aCA9PSAwKSBhdHRyTmFtZUFyci5wdXNoKFwiYXJpYS12YWx1ZXRleHRcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmIChkZXNpZ25QYXR0ZXJuc1tyb2xlXSkge1xuICAgICAgICAgICAgbGV0IHRhZ1Byb3BlcnR5ID0gQXJpYVV0aWwuZ2V0RWxlbWVudEFyaWFQcm9wZXJ0eShydWxlQ29udGV4dCk7XG4gICAgICAgICAgICBsZXQgcGVybWl0dGVkUm9sZXMgPSBbXTtcbiAgICAgICAgICAgIHBlcm1pdHRlZFJvbGVzLnB1c2gocm9sZSk7XG4gICAgICAgICAgICBsZXQgYWxsb3dlZEF0dHJpYnV0ZXMgPSBBcmlhVXRpbC5nZXRBbGxvd2VkQXJpYUF0dHJpYnV0ZXMocnVsZUNvbnRleHQsIHBlcm1pdHRlZFJvbGVzLCB0YWdQcm9wZXJ0eSk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuZ3RoID0gYWxsb3dlZEF0dHJpYnV0ZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgYXR0cmlidXRlID0gYWxsb3dlZEF0dHJpYnV0ZXNbaV07XG4gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZSA9PSBcImFyaWEtY2hlY2tlZFwiIHx8IGF0dHJpYnV0ZSA9PSBcImFyaWEtc2VsZWN0ZWRcIiB8fFxuICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgPT0gXCJhcmlhLWV4cGFuZGVkXCIgfHwgYXR0cmlidXRlID09IFwiYXJpYS1vcmllbnRhdGlvblwiIHx8XG4gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSA9PSBcImFyaWEtbGV2ZWxcIikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaGFzQXR0cmlidXRlKHJ1bGVDb250ZXh0LCBhdHRyaWJ1dGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXN0ZWRQcm9wZXJ0aWVzKys7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbm9kZVZhbHVlID0gQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShhdHRyaWJ1dGUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlVmFsdWUubGVuZ3RoID09IDAgJiYgIWF0dHJOYW1lQXJyLmluY2x1ZGVzKGF0dHJpYnV0ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyTmFtZUFyci5wdXNoKGF0dHJpYnV0ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmV0TXNnID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCBwYXNzZWQgPSBhdHRyTmFtZUFyci5sZW5ndGggPT0gMDtcbiAgICAgICAgcmV0TXNnLnB1c2goYXR0ck5hbWVBcnIuam9pbihcIiwgXCIpKTtcbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBbcnVsZUNvbnRleHRdLCBhdHRyTmFtZUFyciwgJycsIHJldE1zZyk7XG4gICAgICAgIGlmICh0ZXN0ZWRQcm9wZXJ0aWVzID09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9IGVsc2UgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfZW1wdHlfYXR0cmlidXRlXCIsIHJldE1zZyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9hdHRyaWJ1dGVfcmVkdW5kYW50OiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfYXR0cmlidXRlX3JlZHVuZGFudFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbYXJpYS1yZXF1aXJlZF0sIGRvbToqW2FyaWEtYXV0b2NvbXBsZXRlXSwgZG9tOipbYXJpYS1yZWFkb25seV0sIGRvbToqW2FyaWEtZGlzYWJsZWRdLCBkb206KlthcmlhLXBsYWNlaG9sZGVyXVwiIFxuICAgICAgICAgICAgKyBcIiwgZG9tOipbYXJpYS1jaGVja2VkXSwgZG9tOipbYXJpYS1oaWRkZW5dLCBkb206KlthcmlhLXZhbHVlbWF4XSwgZG9tOipbYXJpYS12YWx1ZW1pbl0sIGRvbToqW2FyaWEtY29sc3Bhbl1cIlxuICAgICAgICAgICAgKyBcIiwgZG9tOipbYXJpYS1yb3dzcGFuXVwiLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJhcmlhX2F0dHJpYnV0ZV9yZWR1bmRhbnQuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX3JlZHVuZGFudFwiOiBcImFyaWFfYXR0cmlidXRlX3JlZHVuZGFudC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9hdHRyaWJ1dGVfcmVkdW5kYW50Lmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlRoZSBBUklBIGF0dHJpYnV0ZSBpcyBub3QgcmVkdW5kYW50IHdpdGggYSBjb3JyZXNwb25kaW5nIEhUTUwgYXR0cmlidXRlXCIsXG4gICAgICAgICAgICBcImZhaWxfcmVkdW5kYW50XCI6IFwiVGhlIEFSSUEgYXR0cmlidXRlIFxcXCJ7MH1cXFwiIGlzIHJlZHVuZGFudCB3aXRoIHRoZSBIVE1MIGF0dHJpYnV0ZSBcXFwiezF9XFxcIlwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkFuIEFSSUEgYXR0cmlidXRlIHNob3VsZCBub3QgYmUgcmVkdW5kYW50IHdpdGggYSBjb3JyZXNwb25kaW5nIEhUTUwgYXR0cmlidXRlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIFxuICAgICAgICAvLyBkZXBlbmRlbmN5IGNoZWNrOiBpZiB0aGUgQVJJQSBhdHRyaWJ1dGUgaXMgY29tcGxldGVseSBpbnZhbGlkLCBza2lwIHRoaXMgY2hlY2tcbiAgICAgICAgbGV0IGludmFsaWRBdHRyaWJ1dGVzID0gQXJpYVV0aWwuZ2V0SW52YWxpZEFyaWFBdHRyaWJ1dGVzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKGludmFsaWRBdHRyaWJ1dGVzICYmIGludmFsaWRBdHRyaWJ1dGVzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICAvLyBpZiBjb25mbGljdCBhbHJlYWR5IHJlcG9ydGVkLCBpZ25vcmUgcmVwb3J0aW5nIG92ZXJsYXBcbiAgICAgICAgbGV0IGNvbmZsaWN0QXR0cmlidXRlcyA9IEFyaWFVdGlsLmdldENvbmZsaWN0QXJpYUFuZEh0bWxBdHRyaWJ1dGVzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKGNvbmZsaWN0QXR0cmlidXRlcyAmJiBjb25mbGljdEF0dHJpYnV0ZXMubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCBkb21BdHRyaWJ1dGVzID0gcnVsZUNvbnRleHQuYXR0cmlidXRlcztcbiAgICAgICAgbGV0IGFyaWFBdHRycyA9IFtdO1xuICAgICAgICBsZXQgaHRtbEF0dHJzID0gW107XG4gICAgICAgIGlmIChkb21BdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRvbUF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgYXR0ck5hbWUgPSBkb21BdHRyaWJ1dGVzW2ldLm5hbWUudHJpbSgpLnRvTG93ZXJDYXNlKCk7IFxuICAgICAgICAgICAgICAgIGxldCBhdHRyVmFsdWUgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoYXR0ck5hbWUpO1xuICAgICAgICAgICAgICAgIGlmIChhdHRyVmFsdWUgPT09ICcnKSBhdHRyVmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgICAgIGlmIChhdHRyTmFtZS5zdWJzdHJpbmcoMCwgNSkgPT09ICdhcmlhLScpIFxuICAgICAgICAgICAgICAgICAgICBhcmlhQXR0cnMucHVzaCh7bmFtZTogYXR0ck5hbWUsIHZhbHVlOiBhdHRyVmFsdWV9KTtcbiAgICAgICAgICAgICAgICBlbHNlIFxuICAgICAgICAgICAgICAgICAgICBodG1sQXR0cnMucHVzaCh7bmFtZTogYXR0ck5hbWUsIHZhbHVlOiBhdHRyVmFsdWV9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgcmV0ID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJpYUF0dHJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBleGFtaW5lZEh0bWxBdHJOYW1lcyA9IEFyaWFVdGlsLmdldENvbmZsaWN0T3JPdmVybGFwcGluZ0h0bWxBdHRyaWJ1dGUoYXJpYUF0dHJzW2ldLCBodG1sQXR0cnMsICdvdmVybGFwcGluZycpO1xuICAgICAgICAgICAgaWYgKGV4YW1pbmVkSHRtbEF0ck5hbWVzID09PSBudWxsKSBjb250aW51ZTtcbiAgICAgICAgICAgIGV4YW1pbmVkSHRtbEF0ck5hbWVzLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGl0ZW1bJ3Jlc3VsdCddID09PSAnUGFzcycpIHsgLy9wYXNzXG4gICAgICAgICAgICAgICAgICAgIHJldC5wdXNoKFJ1bGVQYXNzKFwicGFzc1wiKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpdGVtWydyZXN1bHQnXSA9PT0gJ0ZhaWxlZCcpIHsgLy9mYWlsZWRcbiAgICAgICAgICAgICAgICAgICAgcmV0LnB1c2goUnVsZUZhaWwoXCJmYWlsX3JlZHVuZGFudFwiLCBbYXJpYUF0dHJzW2ldWyduYW1lJ10sIGl0ZW1bJ2F0dHInXV0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTsgICAgXG4gICAgICAgIH0gICAgXG4gICAgICAgIGlmIChyZXQubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgQVJJQURlZmluaXRpb25zIH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQURlZmluaXRpb25zXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfYXR0cmlidXRlX3JlcXVpcmVkOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfYXR0cmlidXRlX3JlcXVpcmVkXCIsXG4gICAgY29udGV4dDogXCJkb206Kltyb2xlXVwiLFxuICAgIGRlcGVuZGVuY2llczogW1wiYXJpYV9yb2xlX2FsbG93ZWRcIl0sXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9SZXF1aXJlZFByb3BlcnRpZXNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImZhaWxfbWlzc2luZ1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IGBhcmlhX2F0dHJpYnV0ZV9yZXF1aXJlZC5odG1sYCxcbiAgICAgICAgICAgIFwicGFzc1wiOiBgYXJpYV9hdHRyaWJ1dGVfcmVxdWlyZWQuaHRtbGAsXG4gICAgICAgICAgICBcImZhaWxfbWlzc2luZ1wiOiBgYXJpYV9hdHRyaWJ1dGVfcmVxdWlyZWQuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGhlIHJlcXVpcmVkIGF0dHJpYnV0ZXMgZm9yIHRoZSBlbGVtZW50IHdpdGggYSByb2xlIG11c3QgYmUgZGVmaW5lZFwiLFxuICAgICAgICAgICAgXCJwYXNzXCI6IFwiVGhlIHJlcXVpcmVkIGF0dHJpYnV0ZXMgZm9yIHRoZSBlbGVtZW50IHdpdGggdGhlIHJvbGUgYXJlIGRlZmluZWRcIixcbiAgICAgICAgICAgIFwiZmFpbF9taXNzaW5nXCI6IFwiRWxlbWVudCB3aXRoICd7MH0nIHJvbGUgZG9lcyBub3QgaGF2ZSB0aGUgcmVxdWlyZWQgQVJJQSBhdHRyaWJ1dGUocyk6ICd7MX0nXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbIFwiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBudW06IFwiNC4xLjJcIiwgLy8gbnVtOiBbIFwiMi40LjRcIiwgXCJ4LnkuelwiIF0gYWxzbyBhbGxvd2VkXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFwiNGU4YWI2XCIsXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IGF0dHJOYW1lQXJyID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCByb2xlTmFtZUFyciA9IG5ldyBBcnJheSgpO1xuICAgICAgICBsZXQgZGVzaWduUGF0dGVybnMgPSBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnM7XG4gICAgICAgIC8vbGV0IGltcGxpY2l0Um9sZSA9IEFSSUFNYXBwZXIuZWxlbVRvSW1wbGljaXRSb2xlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgLy9sZXQgaW1wbGljaXRSb2xlID0gQXJpYVV0aWwuZ2V0SW1wbGljaXRSb2xlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgbGV0IGhhc0F0dHJpYnV0ZSA9IENvbW1vblV0aWwuaGFzQXR0cmlidXRlO1xuICAgICAgICBsZXQgdGVzdGVkUm9sZXMgPSAwO1xuXG4gICAgICAgIGxldCB0YWdQcm9wZXJ0eSA9IEFyaWFVdGlsLmdldEVsZW1lbnRBcmlhUHJvcGVydHkocnVsZUNvbnRleHQpO1xuICAgICAgICBsZXQgcm9sZSA9IEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZShydWxlQ29udGV4dCk7XG4gICAgICAgIGlmICghcm9sZSkgcmV0dXJuO1xuICAgICAgICBcbiAgICAgICAgbGV0IHJlcXVpcmVkUm9sZVByb3BzID0gQXJpYVV0aWwuZ2V0Um9sZVJlcXVpcmVkUHJvcGVydGllcyhyb2xlLCBydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChkZXNpZ25QYXR0ZXJuc1tyb2xlXSAmJiByZXF1aXJlZFJvbGVQcm9wcyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IGFsbG93ZWRSb2xlUHJvcHMgPSBBcmlhVXRpbC5nZXRBbGxvd2VkQXJpYUF0dHJpYnV0ZXMocnVsZUNvbnRleHQsIHJvbGUsIHRhZ1Byb3BlcnR5KTtcbiAgICAgICAgICAgIGxldCByb2xlTWlzc2luZ1JlcVByb3AgPSBmYWxzZTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBwcm9wZXJ0aWVzTGVuZ3RoID0gcmVxdWlyZWRSb2xlUHJvcHMubGVuZ3RoOyBpIDwgcHJvcGVydGllc0xlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFhbGxvd2VkUm9sZVByb3BzLmluY2x1ZGVzKHJlcXVpcmVkUm9sZVByb3BzW2ldKSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgaWYgKCFoYXNBdHRyaWJ1dGUocnVsZUNvbnRleHQsIHJlcXVpcmVkUm9sZVByb3BzW2ldKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiBhbiBhcmlhLWxhYmVsbGVkYnkgaXNuJ3QgcHJlc2VudCwgYW4gYXJpYS1sYWJlbCB3aWxsIG1lZXQgdGhlIHJlcXVpcmVtZW50LlxuICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWlyZWRSb2xlUHJvcHNbaV0gPT0gXCJhcmlhLWxhYmVsbGVkYnlcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCghaGFzQXR0cmlidXRlKHJ1bGVDb250ZXh0LCBcImFyaWEtbGFiZWxcIikpIHx8IChyb2xlICE9IFwicmFkaW9ncm91cFwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJOYW1lQXJyLnB1c2gocmVxdWlyZWRSb2xlUHJvcHNbaV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGVNaXNzaW5nUmVxUHJvcCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVxdWlyZWRSb2xlUHJvcHNbaV0gPT0gXCJhcmlhLXZhbHVlbm93XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoIWhhc0F0dHJpYnV0ZShydWxlQ29udGV4dCwgXCJhcmlhLXZhbHVldGV4dFwiKSkgfHwgKHJvbGUgIT0gXCJwcm9ncmVzc2JhclwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJOYW1lQXJyLnB1c2gocmVxdWlyZWRSb2xlUHJvcHNbaV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGVNaXNzaW5nUmVxUHJvcCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVxdWlyZWRSb2xlUHJvcHNbaV0gPT0gXCJhcmlhLWNvbnRyb2xzXCIgJiYgcm9sZSA9PSBcImNvbWJvYm94XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNraXAgdGhpcyBjaGVjayBzaW5jZSBhcmlhLWNvbnRyb2xzIGluIHRoZSB0ZXh0Ym94IG9mIGEgY29tYm9ib3ggaXMgYWxyZWFkeSBoYW5kbGVkIGluIHJ1bGUgSEFBQ19Db21ib2JveF9NdXN0X2hhdmVfVGV4dF9JbnB1dFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXR0ck5hbWVBcnIucHVzaChyZXF1aXJlZFJvbGVQcm9wc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByb2xlTWlzc2luZ1JlcVByb3AgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJvbGVNaXNzaW5nUmVxUHJvcCA9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgcm9sZU5hbWVBcnIucHVzaChyb2xlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgbGV0IHBhc3NlZCA9IHJvbGVOYW1lQXJyLmxlbmd0aCA9PSAwIHx8IGF0dHJOYW1lQXJyLmxlbmd0aCA9PSAwOyAvLyBvbmx5IGFyaWEgYXR0cmlidXRlcyBzbyBOTyBPVVQgT0YgU0NPUEVcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIGxldCByZXRUb2tlbiA9IG5ldyBBcnJheSgpO1xuICAgICAgICAgICAgcmV0VG9rZW4ucHVzaChyb2xlTmFtZUFyci5qb2luKFwiLCBcIikpO1xuICAgICAgICAgICAgcmV0VG9rZW4ucHVzaChhdHRyTmFtZUFyci5qb2luKFwiLCBcIikpO1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9taXNzaW5nXCIsIHJldFRva2VuKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBBUklBRGVmaW5pdGlvbnMgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBRGVmaW5pdGlvbnNcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfYXR0cmlidXRlX3ZhbHVlX3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfYXR0cmlidXRlX3ZhbHVlX3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIGRlcGVuZGVuY2llczogW1wiYXJpYV9hdHRyaWJ1dGVfYWxsb3dlZFwiXSxcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX1ZhbGlkUHJvcGVydHlWYWx1ZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfYXR0cmlidXRlX3ZhbHVlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9hdHRyaWJ1dGVfdmFsdWVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2F0dHJpYnV0ZV92YWx1ZV92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQVJJQSBwcm9wZXJ0eSB2YWx1ZXMgbXVzdCBiZSB2YWxpZFwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUaGUgdmFsdWUgXFxcInswfVxcXCIgc3BlY2lmaWVkIGZvciBhdHRyaWJ1dGUgJ3sxfScgb24gZWxlbWVudCA8ezJ9PiBpcyBub3QgdmFsaWRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFwiNmE3MjgxXCIsXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHZhbHVlQXJyID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCBhdHRyTmFtZUFyciA9IG5ldyBBcnJheSgpO1xuICAgICAgICBsZXQgZGF0YVR5cGVBcnIgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgbGV0IHByb3BlcnR5RGF0YVR5cGVzID0gQVJJQURlZmluaXRpb25zLnByb3BlcnR5RGF0YVR5cGVzO1xuICAgICAgICBsZXQgY29udGV4dEF0dHJpYnV0ZXMgPSBydWxlQ29udGV4dC5hdHRyaWJ1dGVzO1xuICAgICAgICBsZXQgdGVzdGVkUHJvcGVydHlWYWx1ZXMgPSAwO1xuXG4gICAgICAgIGlmIChjb250ZXh0QXR0cmlidXRlcykge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbmd0aCA9IGNvbnRleHRBdHRyaWJ1dGVzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGF0dHJOYW1lID0gY29udGV4dEF0dHJpYnV0ZXNbaV0ubmFtZTtcbiAgICAgICAgICAgICAgICBpZiAoQXJpYVV0aWwuaXNEZWZpbmVkQXJpYUF0dHJpYnV0ZShydWxlQ29udGV4dCwgYXR0ck5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkYXRhVHlwZXMgPSBwcm9wZXJ0eURhdGFUeXBlc1thdHRyTmFtZV07XG4gICAgICAgICAgICAgICAgICAgIGxldCBub2RlVmFsdWUgPSBDb21tb25VdGlsLm5vcm1hbGl6ZVNwYWNpbmcoY29udGV4dEF0dHJpYnV0ZXNbaV0ubm9kZVZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGVzdGVkUHJvcGVydHlWYWx1ZXMrKztcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFUeXBlcyAmJiBkYXRhVHlwZXMudmFsdWVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YVR5cGVzLnZhbHVlcy5pbmRleE9mKG5vZGVWYWx1ZSkgPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YVR5cGVzLnZhbHVlcy5pbmRleE9mKCd1bmRlZmluZWQnKSAhPSAtMSAmJiBub2RlVmFsdWUubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy90cmFuc2xhdGUgJ3VuZGVmaW5lZCcgdG8gbWVhbiAnJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFyaWEtcmVsZXZhbnQgaXMgcmVwcmVzZW50ZWQgYXMgYSBzcGFjZSBkZWxpbWl0ZWQgbGlzdCBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczogXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZGl0aW9ucywgcmVtb3ZhbHMsIHRleHQ7IG9yIGEgc2luZ2xlIGNhdGNoLWFsbCB2YWx1ZSBhbGwuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhVHlwZXMudHlwZSA9PT0gXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNubXRva2Vuc1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYXR0clZhbHVlcyA9IGNvbnRleHRBdHRyaWJ1dGVzW2ldLm5vZGVWYWx1ZS50cmltKCkuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHZhbHVlIGFsbCBpcyBzcGVjaWZpZWQsIGl0IGNhbm5vdCBoYXZlIGFueSBvdGhlciB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF0dHJWYWx1ZXMubGVuZ3RoID4gMSAmJiBhdHRyVmFsdWVzLmluY2x1ZGVzKFwiYWxsXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVBcnIucHVzaChjb250ZXh0QXR0cmlidXRlc1tpXS5ub2RlVmFsdWUuc3BsaXQoXCIgXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyTmFtZUFyci5wdXNoKGF0dHJOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZUFyci5wdXNoKGRhdGFUeXBlcy52YWx1ZXMudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoYXNoID0ge307XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBhdHRyVmFsdWVzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBpbmRpdmlkdWFsIHZhbHVlIGlzIG5vdCBpbiB0aGUgbGlzdCBvZiBhbGxvd2VkIHZhbHVlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXR0clZhbHVlc1tqXSAhPSBcIlwiICYmICFkYXRhVHlwZXMudmFsdWVzLmluY2x1ZGVzKGF0dHJWYWx1ZXNbal0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc2guaGFzT3duUHJvcGVydHkoYXR0ck5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaFthdHRyTmFtZV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJOYW1lQXJyLnB1c2goYXR0ck5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVBcnIucHVzaChhdHRyVmFsdWVzW2pdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlQXJyLnB1c2goZGF0YVR5cGVzLnZhbHVlcy50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlQXJyLnB1c2goY29udGV4dEF0dHJpYnV0ZXNbaV0ubm9kZVZhbHVlLnNwbGl0KFwiIFwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyTmFtZUFyci5wdXNoKGF0dHJOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlQXJyLnB1c2goZGF0YVR5cGVzLnZhbHVlcy50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhVHlwZXMgJiYgZGF0YVR5cGVzLnR5cGUgJiYgZGF0YVR5cGVzLnR5cGUgPT09IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaW50XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpVmFsID0gcGFyc2VJbnQobm9kZVZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc05hTihpVmFsKSB8fCAoXCJcIiArIGlWYWwgIT09IG5vZGVWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUFyci5wdXNoKG5vZGVWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ck5hbWVBcnIucHVzaChhdHRyTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YVR5cGVzICYmIGRhdGFUeXBlcy50eXBlICYmIGRhdGFUeXBlcy50eXBlID09IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjZGVjaW1hbFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZlZhbCA9IHBhcnNlRmxvYXQobm9kZVZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc05hTihmVmFsKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlQXJyLnB1c2gobm9kZVZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyTmFtZUFyci5wdXNoKGF0dHJOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhVHlwZXMgJiYgZGF0YVR5cGVzLnR5cGUgJiYgKGRhdGFUeXBlcy50eXBlID09IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjYm9vbGVhblwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRtcFYgPSBub2RlVmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodG1wViAhPT0gXCJ0cnVlXCIgJiYgdG1wViAhPT0gXCJmYWxzZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVBcnIucHVzaChub2RlVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJOYW1lQXJyLnB1c2goYXR0ck5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGFUeXBlcyAmJiBkYXRhVHlwZXMudHlwZSAmJiAoZGF0YVR5cGVzLnR5cGUgPT0gXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNzdHJpbmdcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RlZFByb3BlcnR5VmFsdWVzLS07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJldE1zZyA9IG5ldyBBcnJheSgpO1xuICAgICAgICBsZXQgcGFzc2VkID0gYXR0ck5hbWVBcnIubGVuZ3RoID09IDA7XG4gICAgICAgIHJldE1zZy5wdXNoKHZhbHVlQXJyLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgIHJldE1zZy5wdXNoKGF0dHJOYW1lQXJyLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgIHJldE1zZy5wdXNoKHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICAvLyByZXRNc2cucHVzaCAoZGF0YVR5cGVBcnIuam9pbihcIiwgXCIpKTtcbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBbcnVsZUNvbnRleHRdLCBhdHRyTmFtZUFyciwgJycsIHJldE1zZyk7XG4gICAgICAgIGlmICh0ZXN0ZWRQcm9wZXJ0eVZhbHVlcyA9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSBlbHNlIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgcmV0TXNnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX2Jhbm5lcl9sYWJlbF91bmlxdWU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9iYW5uZXJfbGFiZWxfdW5pcXVlXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmJhbm5lclwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfTXVsdGlwbGVCYW5uZXJMYW5kbWFya3NfSW1wbGljaXRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImFyaWFfYmFubmVyX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwiOiBcImFyaWFfYmFubmVyX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9iYW5uZXJfbGFiZWxfdW5pcXVlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlRoZSBlbGVtZW50IHdpdGggXFxcImJhbm5lclxcXCIgcm9sZSBoYXMgYSB1bmlxdWUgbGFiZWwgdGhhdCBkZXNjcmliZXMgaXRzIHB1cnBvc2VcIixcbiAgICAgICAgICAgIFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCI6IFwiTXVsdGlwbGUgZWxlbWVudHMgd2l0aCBcXFwiYmFubmVyXFxcIiByb2xlIGRvIG5vdCBoYXZlIHVuaXF1ZSBsYWJlbHNcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFYWNoIGVsZW1lbnQgd2l0aCBcXFwiYmFubmVyXFxcIiByb2xlIG11c3QgaGF2ZSBhIHVuaXF1ZSBsYWJlbCB0aGF0IGRlc2NyaWJlcyBpdHMgcHVycG9zZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBkdXBwZWQgPSBBcmlhVXRpbC5pc0xhbmRtYXJrTmFtZVVuaXF1ZShydWxlQ29udGV4dCwgXCJiYW5uZXJcIiwgdHJ1ZSk7ICAgIFxuICAgICAgICBpZiAoZHVwcGVkID09IG51bGwpIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgaWYgKGR1cHBlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX2Jhbm5lcl9zaW5nbGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9iYW5uZXJfc2luZ2xlXCIsXG4gICAgY29udGV4dDogXCJkb206Kltyb2xlXSwgZG9tOmhlYWRlclwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfT25lQmFubmVySW5TaWJsaW5nU2V0X0ltcGxpY2l0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9iYW5uZXJfc2luZ2xlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV9iYW5uZXJfc2luZ2xlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2Jhbm5lcl9zaW5nbGUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJNdWx0aXBsZSBlbGVtZW50cyB3aXRoIFxcXCJiYW5uZXJcXFwiIHJvbGUgZm91bmQgb24gdGhlIHBhZ2VcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBIHBhZ2UsIGRvY3VtZW50LCBvciBhcHBsaWNhdGlvbiBzaG91bGQgb25seSBoYXZlIG9uZSBlbGVtZW50IHdpdGggXFxcImJhbm5lclxcXCIgcm9sZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBpZiAoIUFyaWFVdGlsLmhhc1JvbGVJblNlbWFudGljcyhydWxlQ29udGV4dCwgXCJiYW5uZXJcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhc3NlZCA9XG4gICAgICAgICAgICBBcmlhVXRpbC5nZXRTaWJsaW5nV2l0aFJvbGVIaWRkZW4oXG4gICAgICAgICAgICAgICAgcnVsZUNvbnRleHQsXG4gICAgICAgICAgICAgICAgXCJiYW5uZXJcIixcbiAgICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgIHRydWVcbiAgICAgICAgICAgICkgPT09IG51bGw7XG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KHBhc3NlZCwgW3J1bGVDb250ZXh0XSwgJ3JvbGUnLCAnJywgW10pO1xuICAgICAgICBpZiAocGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgQVJJQURlZmluaXRpb25zIH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQURlZmluaXRpb25zXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9jaGlsZF90YWJiYWJsZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2NoaWxkX3RhYmJhYmxlXCIsXG4gICAgY29udGV4dDogXCJkb206Kltyb2xlXVwiLFxuICAgIGRlcGVuZGVuY2llczogW1wiYXJpYV9yb2xlX2FsbG93ZWRcIl0sXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9NaXNzaW5nRm9jdXNhYmxlQ2hpbGRcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJmYWlsX21pc3NpbmdfY2hpbGRcIjogXCJmYWlsX21pc3NpbmdfY2hpbGRcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJhcmlhX2NoaWxkX3RhYmJhYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9taXNzaW5nX2NoaWxkXCI6IFwiYXJpYV9jaGlsZF90YWJiYWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9jaGlsZF90YWJiYWJsZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJmYWlsX21pc3NpbmdfY2hpbGRcIjogXCJOb25lIG9mIHRoZSBkZXNjZW5kZW50IGVsZW1lbnRzIHdpdGggXFxcInsxfVxcXCIgcm9sZSBpcyB0YWJiYWJsZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlVJIGNvbXBvbmVudCBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIHRhYmJhYmxlIGRlc2NlbmRhbnQgZm9yIGtleWJvYXJkIGFjY2Vzc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgICAgLy9za2lwIHRoZSBjaGVjayBpZiB0aGUgZWxlbWVudCBpcyBoaWRkZW4gb3IgZGlzYWJsZWRcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSB8fCBDb21tb25VdGlsLmlzTm9kZURpc2FibGVkKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgcmVxdWlyZXMgcHJlc2VudGF0aW9uYWwgY2hpbGRyZW4gb25seVxuICAgICAgICBpZiAoQXJpYVV0aWwuY29udGFpbnNQcmVzZW50YXRpb25hbENoaWxkcmVuT25seShydWxlQ29udGV4dCkgfHwgQXJpYVV0aWwuc2hvdWxkQmVQcmVzZW50YXRpb25hbENoaWxkKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICAvLyBBbiBBUklBIGxpc3QgaXMgbm90IGludGVyYWN0aXZlXG4gICAgICAgIGlmIChBcmlhVXRpbC5oYXNSb2xlKHJ1bGVDb250ZXh0LCB7IFwibGlzdFwiOiB0cnVlLCBcInJvd1wiOiB0cnVlLCBcInJvd2dyb3VwXCI6IHRydWUsIFwidGFibGVcIjogdHJ1ZSwgXCJncmlkXCI6IHRydWUgfSkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTm90IGEgdmFsaWQgbWVzc2FnZSBmb3IgbW9iaWxlIGJlY2F1c2UgYWxsIGVsZW1lbnRzIGFyZSBmb2N1c2FibGUgaW4gaU9TIHdoZW4gVm9pY2VPdmVyIGlzIGVuYWJsZWQuXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJjbGFzc1wiKSAmJiBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJjbGFzc1wiKS5zdWJzdHJpbmcoMCwgMykgPT0gXCJtYmxcIikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvL2lnbm9yZSBkYXRhbGlzdCBlbGVtZW50IGNoZWNrIHNpbmNlIGl0IHdpbGwgYmUgcGFydCBvZiBhIGlucHV0IGVsZW1lbnQgb3IgaGlkZGVuIGJ5IGRlZmF1bHRcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdkYXRhbGlzdCcpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICAvLyBpZ25vcmUgaWYgdGhlIGVsZW1lbnQncyBuYXZpZ2F0aW9uIGlzIGNvbnRyb2xsZWQgYnkgYW5vdGhlciBlbGVtZW50LCBzdWNoIGFzIGNvbWJvYm94XG4gICAgICAgIGlmIChBcmlhVXRpbC5pc05hdmlnYXRpb25Pd25lZE9yQ29udHJvbGxlZChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDsgIFxuXG4gICAgICAgIGxldCByb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGxldCBkb2MgPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50O1xuICAgICAgICBsZXQgaGFzQXR0cmlidXRlID0gQ29tbW9uVXRpbC5oYXNBdHRyaWJ1dGU7XG4gICAgICAgIGxldCByb2xlTmFtZUFyciA9IG5ldyBBcnJheSgpO1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBcIlwiO1xuICAgICAgICBsZXQgaW5TY29wZSA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChBUklBRGVmaW5pdGlvbnMuY29udGFpbmVycy5pbmNsdWRlcyhyb2xlKSkge1xuICAgICAgICAgICAgbGV0IGRpc2FibGVkID0gaGFzQXR0cmlidXRlKHJ1bGVDb250ZXh0LCAnYXJpYS1kaXNhYmxlZCcpID8gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYXJpYS1kaXNhYmxlZFwiKSA6ICcnO1xuICAgICAgICAgICAgaWYgKGRpc2FibGVkICE9ICd0cnVlJyAmJiAhaGFzQXR0cmlidXRlKHJ1bGVDb250ZXh0LCAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JykgJiYgIUNvbW1vblV0aWwuaXNUYWJiYWJsZShydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgICAgICBsZXQgcmVxQ2hpbGRyZW4gPSBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNbcm9sZV0ucmVxQ2hpbGRyZW47XG4gICAgICAgICAgICAgICAgaWYgKHJlcUNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgICAgIGluU2NvcGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHhwID0gXCJkZXNjZW5kYW50OjoqW1wiO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlcUNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB4cCArPSBcIkByb2xlPSdcIiArIHJlcUNoaWxkcmVuW2ldICsgXCInIG9yIFwiO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHhwID0geHAuc3Vic3RyaW5nKDAsIHhwLmxlbmd0aCAtIDQpICsgJ10nO1xuICAgICAgICAgICAgICAgICAgICBsZXQgeHBhdGhSZXN1bHQgPSBkb2MuZXZhbHVhdGUoeHAsIHJ1bGVDb250ZXh0LCBDb21tb25VdGlsLmRlZmF1bHROU1Jlc29sdmVyLCAwIC8qIFhQYXRoUmVzdWx0LkFOWV9UWVBFICovLCBudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHI6IEVsZW1lbnQgPSB4cGF0aFJlc3VsdC5pdGVyYXRlTmV4dCgpIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChyICYmICFwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvbGxvd2luZyBhcmUgdGhlIHN0ZXBzIHRoYXQgYXJlIGV4ZWN1dGVkIGF0IHRoaXMgc3RhZ2UgdG8gZGV0ZXJtaW5lIGlmIHRoZSBub2RlIHNob3VsZCBiZSBjbGFzc2lmaWVkIGFzIGhpZGRlblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3Igbm90LlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gIDEuIE9ubHkgcnVuIGlzTm9kZVZpc2libGUgY2hlY2sgaWYgaGlkZGVuIGNvbnRlbnQgc2hvdWxkIE5PVCBiZSBjaGVja2VkLiBJbiB0aGUgY2FzZSB0aGF0IGhpZGRlbiBjb250ZW50IGlzIHRvLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGJlIHNjYW5uZWQgdGhlbiB3ZSBjYW4ganVzdCBzY2FuIGV2ZXJ5dGhpbmcgYXMgbm9ybWFsLiBJbiB0aGUgY2FzZSB0aGF0IHRoZSBjdXJyZW50IG5vZGUgaXMgaGlkZGVuIHdlIGRvIG5vdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGFkZCBpdCB0byB0aGUgcm9sZVRvRWxlbXMgaGFzaCBhdCBhbGwgb3IgZXZlbiBkbyBhbnkgY2hlY2tpbmcgZm9yIGl0IGF0IGFsbC5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3RlOiBUaGUgaWYgY29uZGl0aW9ucyB1c2VzIHNob3J0LWNpcmN1aXRpbmcgc28gaWYgdGhlIGZpcnN0IGNvbmRpdGlvbiBpcyBub3QgdHJ1ZSBpdCB3aWxsIG5vdCBjaGVjayB0aGUgbmV4dCBvbmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICBzbyBvbiBhbmQgc28gZm9ydGguXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ29tbW9uVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKHIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9IHhwYXRoUmVzdWx0Lml0ZXJhdGVOZXh0KCkgYXMgRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gQ29tbW9uVXRpbC5pc1RhYmJhYmxlKHIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXF1aXJlZCBjaGlsZCBpcyBub3QgZm9jdXNhYmxlIHZpYSB0YWJpbmRleC4gU2VlIGlmIHRoZXJlIGlzIGEgZ3JhbmRjaGlsZCB0aGF0IGlzIGZvY3VzYWJsZSBieSBkZWZhdWx0IG9yIGJ5IHRhYmluZGV4LlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgeHAyID0gXCJkZXNjZW5kYW50OjoqXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHhwYXRoUmVzdWx0MiA9IGRvYy5ldmFsdWF0ZSh4cDIsIHIsIENvbW1vblV0aWwuZGVmYXVsdE5TUmVzb2x2ZXIsIDAgLyogWFBhdGhSZXN1bHQuQU5ZX1RZUEUgKi8sIG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByMiA9IHhwYXRoUmVzdWx0Mi5pdGVyYXRlTmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChyMiAmJiAhcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvbGxvd2luZyBhcmUgdGhlIHN0ZXBzIHRoYXQgYXJlIGV4ZWN1dGVkIGF0IHRoaXMgc3RhZ2UgdG8gZGV0ZXJtaW5lIGlmIHRoZSBub2RlIHNob3VsZCBiZSBjbGFzc2lmaWVkIGFzIGhpZGRlblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvciBub3QuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAxLiBPbmx5IHJ1biBpc05vZGVWaXNpYmxlIGNoZWNrIGlmIGhpZGRlbiBjb250ZW50IHNob3VsZCBOT1QgYmUgY2hlY2tlZC4gSW4gdGhlIGNhc2UgdGhhdCBoaWRkZW4gY29udGVudCBpcyB0byxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGJlIHNjYW5uZWQgdGhlbiB3ZSBjYW4ganVzdCBzY2FuIGV2ZXJ5dGhpbmcgYXMgbm9ybWFsLiBJbiB0aGUgY2FzZSB0aGF0IHRoZSBjdXJyZW50IG5vZGUgaXMgaGlkZGVuIHdlIGRvIG5vdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgYWRkIGl0IHRvIHRoZSByb2xlVG9FbGVtcyBoYXNoIGF0IGFsbCBvciBldmVuIGRvIGFueSBjaGVja2luZyBmb3IgaXQgYXQgYWxsLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3RlOiBUaGUgaWYgY29uZGl0aW9ucyB1c2VzIHNob3J0LWNpcmN1aXRpbmcgc28gaWYgdGhlIGZpcnN0IGNvbmRpdGlvbiBpcyBub3QgdHJ1ZSBpdCB3aWxsIG5vdCBjaGVjayB0aGUgbmV4dCBvbmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgIHNvIG9uIGFuZCBzbyBmb3J0aC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENvbW1vblV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbihyMikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIyID0geHBhdGhSZXN1bHQyLml0ZXJhdGVOZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBDb21tb25VdGlsLmlzVGFiYmFibGUocik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIyID0geHBhdGhSZXN1bHQyLml0ZXJhdGVOZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGVOYW1lQXJyID0gci5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpLnRyaW0oKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZU5hbWUgPSByLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByID0geHBhdGhSZXN1bHQuaXRlcmF0ZU5leHQoKSBhcyBFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVmFyaWFibGUgRGVjbGVyYXRpb25cbiAgICAgICAgbGV0IHJldFRva2VuMSA9IG5ldyBBcnJheSgpO1xuICAgICAgICBsZXQgcmV0VG9rZW4yID0gbmV3IEFycmF5KCk7XG5cbiAgICAgICAgLy8gSW4gdGhlIGNhc2UgdGhlIGFycmF5cy9zdHJpbmdzIGFyZSBlbXB0eSwgdGhhdCBtZWFucyB0aGF0IHRoZXJlIGlzIG5vIHZpb2xhdGlvbiBzbyB3ZSBjYW4gcmVzZXQgaXQgYmFjayB0byBwYXNzZWQsIHRoZSByZWFzb24gZm9yIHRoaXNcbiAgICAgICAgLy8gaXMgdGhhdCB3ZSBhcmUgc2V0dGluZyBwYXNzZWQ9ZmFsc2Ugd2hpbGUgd2UgcGVyZm9ybSBhIGxvb3Agd2hpY2ggY2F1c2VzIHZpb2xhdGlvbiB0byB0cmlnZ2VyIGV2ZW4gaWYgdGhlcmUgaXMgbm8gaXNzdWVzLiBJbnN0ZWFkIG9mXG4gICAgICAgIC8vIHVwZGF0aW5nIHRoZSB3aG9sZSBydWxlIHRvIHN3aXRjaCBmcm9tIHVzaW5nIHBhc3NlZCBpbiB0aGF0IHdheSBzaW1wbHkgZG8gdGhlIGNoZWNrIGF0IHRoaXMgcG9pbnQuXG4gICAgICAgIGlmIChub2RlTmFtZS5sZW5ndGggPiAwICYmIHJvbGVOYW1lQXJyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldFRva2VuMS5wdXNoKG5vZGVOYW1lKTtcbiAgICAgICAgICAgIHJldFRva2VuMi5wdXNoKHJvbGVOYW1lQXJyLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBbcnVsZUNvbnRleHRdLCAncm9sZScsICcnLCBwYXNzZWQgPT0gdHJ1ZSA/IFtdIDogW3JldFRva2VuMSwgcmV0VG9rZW4yXSk7XG4gICAgICAgIGlmICghaW5TY29wZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0gZWxzZSBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9taXNzaW5nX2NoaWxkXCIsIFtyZXRUb2tlbjEudG9TdHJpbmcoKSwgcmV0VG9rZW4yLnRvU3RyaW5nKCldKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfY2hpbGRfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9jaGlsZF92YWxpZFwiLFxuICAgIC8vY29udGV4dDogXCJkb206Kltyb2xlXVwiLFxuICAgIC8vZGVwZW5kZW5jaWVzOiBbXCJScHRfQXJpYV9WYWxpZFJvbGVcIl0sXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIGRlcGVuZGVuY2llczogW1wiYXJpYV9yb2xlX3ZhbGlkXCIsIFwiYXJpYV9kZXNjZW5kYW50X3ZhbGlkXCJdLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9jaGlsZF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NcIjogXCJhcmlhX2NoaWxkX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF9ub19jaGlsZFwiOiBcImFyaWFfY2hpbGRfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX2ludmFsaWRfY2hpbGRcIjogXCJhcmlhX2NoaWxkX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBbiBlbGVtZW50IHdpdGggYW4gQVJJQSByb2xlIG11c3Qgb3duIGEgcmVxdWlyZWQgY2hpbGRcIixcbiAgICAgICAgICAgIFwiUGFzc1wiOiBcIkFuIGVsZW1lbnQgd2l0aCBhbiBBUklBIHJvbGUgb3ducyBhIHJlcXVpcmVkIGNoaWxkXCIsXG4gICAgICAgICAgICBcIkZhaWxfbm9fY2hpbGRcIjogXCJUaGUgZWxlbWVudCB3aXRoIHJvbGUgXFxcInswfVxcXCIgZG9lcyBub3Qgb3duIGFueSBjaGlsZCBlbGVtZW50IHdpdGggYW55IG9mIHRoZSBmb2xsb3dpbmcgcm9sZShzKTogXFxcInsxfVxcXCJcIixcbiAgICAgICAgICAgIFwiRmFpbF9pbnZhbGlkX2NoaWxkXCI6IFwiVGhlIGVsZW1lbnQgd2l0aCByb2xlIFxcXCJ7MH1cXFwiIG93bnMgdGhlIGNoaWxkIGVsZW1lbnQgd2l0aCB0aGUgcm9sZSBcXFwiezF9XFxcIiB0aGF0IGlzIG5vdCBvbmUgb2YgdGhlIGFsbG93ZWQgcm9sZShzKTogXFxcInsyfVxcXCJcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIC8vIFRPRE86IEFDVDogVmVyaWZ5IG1hcHBpbmdcbiAgICBhY3Q6IFtcImJjNGE3NVwiXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIG9yIGRpc2FibGVkXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkgfHwgQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIFxuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IHJlcXVpcmVzIHByZXNlbnRhdGlvbmFsIGNoaWxkcmVuIG9ubHlcbiAgICAgICAgaWYgKEFyaWFVdGlsLmNvbnRhaW5zUHJlc2VudGF0aW9uYWxDaGlsZHJlbk9ubHkocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBcbiAgICAgICAgbGV0IHJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXMocnVsZUNvbnRleHQsIGZhbHNlKTtcbiAgICAgICAgLy8gaWYgZXhwbGljaXQgcm9sZSBkb2Vzbid0IGV4aXN0LCBnZXQgdGhlIGltcGxpY2l0IG9uZVxuICAgICAgICBpZiAoIXJvbGVzIHx8IHJvbGVzLmxlbmd0aCA9PT0gMCkgXG4gICAgICAgICAgICByb2xlcyA9ICBBcmlhVXRpbC5nZXRJbXBsaWNpdFJvbGUocnVsZUNvbnRleHQpO1xuICAgICAgICBcbiAgICAgICAgLy9pZ25vcmUgaWYgdGhlIGVsZW1lbnQgZG9lc24ndCBoYXZlIGFueSBleHBsaWNpdCBvciBpbXBsaWNpdCByb2xlLCBzaG91bGRuJ3QgaGFwcGVuXG4gICAgICAgIGlmICghcm9sZXMgfHwgcm9sZXMubGVuZ3RoID09PSAwKSBcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgLy8gaWdub3JlIGlmIHRoZSBlbGVtZW50IGNvbnRhaW5zIG5vbmUgb3IgcHJlc2VudGF0aW9uIHJvbGVcbiAgICAgICAgbGV0IHByZXNlbnRhdGlvblJvbGVzID0gW1wibm9uZVwiLCBcInByZXNlbnRhdGlvblwiXTtcbiAgICAgICAgY29uc3QgZm91bmQgPSByb2xlcy5zb21lKHI9PiBwcmVzZW50YXRpb25Sb2xlcy5pbmNsdWRlcyhyKSk7XG4gICAgICAgIGlmIChmb3VuZCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gIEZvciBjb21ib2JveCwgd2UgaGF2ZSBnMTE5MyAuLi4gZzExOTkgdG8gY2hlY2sgdGhlIHZhbHVlcyBldGMuXG4gICAgICAgIC8vICBXZSBkb24ndCB3YW50IHRvIHRyaWdnZXIgMTE1MiBhZ2Fpbi4gU28sIHdlIGJ5cGFzcyBpdCBoZXJlLlxuICAgICAgICBpZiAocm9sZXMuaW5jbHVkZXMoXCJjb21ib2JveFwiKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgbGV0IHJlcXVpcmVkQ2hpbGRSb2xlcyA9IEFyaWFVdGlsLmdldFJlcXVpcmVkQ2hpbGRSb2xlcyhydWxlQ29udGV4dCwgdHJ1ZSk7XG4gICAgICAgIC8vIGEgJ2dyb3VwJyByb2xlIGlzIGFsbG93ZWQgYnV0IG5vdCByZXF1aXJlZCBmb3Igc29tZSBlbGVtZW50cyBzbyByZW1vdmUgaXQgaWYgZXhpc3RzXG4gICAgICAgIGlmIChyZXF1aXJlZENoaWxkUm9sZXMuaW5jbHVkZXMoJ2dyb3VwJykpIHtcbiAgICAgICAgICAgIGxldCBpbmRleCA9IHJlcXVpcmVkQ2hpbGRSb2xlcy5pbmRleE9mKCdncm91cCcpO1xuICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpXG4gICAgICAgICAgICAgICAgcmVxdWlyZWRDaGlsZFJvbGVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8qKiAgXG4gICAgICAgICAqIGlnbm9yZSBpZiBhIHJvbGUgZG9lc24ndCByZXF1aXJlIGEgY2hpbGQgd2l0aCBhbnkgc3BlY2lmaWMgcm9sZVxuICAgICAgICAgKiB0aGUgcmV2ZXJzZSBtaWdodCBiZSBub3QgdHJ1ZSAtIHBhcmVudCB3aWxsIGJlIGNoZWNrZWQgaW4gUnB0X0FyaWFfUmVxdWlyZWRQYXJlbnRfTmF0aXZlX0hvc3RfU2VtYXRpY3MgcnVsZVxuICAgICAgICAqL1xuICAgICAgICAgaWYgKHJlcXVpcmVkQ2hpbGRSb2xlcy5sZW5ndGggPT0gMClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIGdldCBhbGwgdGhlIGNoaWxkcmVuIGZyb20gYWNjZXNzaWJpbGl0eSB0cmVlLCBcbiAgICAgICAgLy8gaW5jbHVkaW5nIG9uZXMgd2l0aCBhcmlhLW93bnMgICAgXG4gICAgICAgIGxldCBkaXJlY3RBVENoaWxkcmVuID0gQXJpYVV0aWwuZ2V0RGlyZWN0QVRDaGlsZHJlbihydWxlQ29udGV4dCk7XG4gICAgICAgIFxuICAgICAgICBpZiAoIWRpcmVjdEFUQ2hpbGRyZW4gfHwgZGlyZWN0QVRDaGlsZHJlbi5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgLy8gdGhlIGVsZW1lbnQgd2l0aCBhdCBsZWFzdCBvbmUgcmVxdWlyZWQgcm9sZSBkb3Nlbid0IGNvbnRhaW4gYW55IGFjY2Vzc2libGUgY2hpbGRcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogV2hlbiBhIHdpZGdldCBpcyBtaXNzaW5nIHJlcXVpcmVkIG93bmVkIGVsZW1lbnRzIGR1ZSB0byBzY3JpcHQgZXhlY3V0aW9uIG9yIGxvYWRpbmcsIFxuICAgICAgICAgICAgICogYXV0aG9ycyBNVVNUIG1hcmsgYSBjb250YWluaW5nIGVsZW1lbnQgd2l0aCAnYXJpYS1idXN5JyBlcXVhbCB0byB0cnVlLiBcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgIGxldCBidXN5ID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYXJpYS1idXN5XCIpO1xuICAgICAgICAgICAgIGlmICghYnVzeSB8fCBidXN5ICE9PSAndHJ1ZScpIHtcbiAgICAgICAgICAgICAgICAgbGV0IHJldFRva2VuID0gbmV3IEFycmF5KCk7XG4gICAgICAgICAgICAgICAgIHJldFRva2VuLnB1c2gocm9sZXMuam9pbihcIiwgXCIpKTtcbiAgICAgICAgICAgICAgICAgcmV0VG9rZW4ucHVzaChyZXF1aXJlZENoaWxkUm9sZXMuam9pbihcIiwgXCIpKTtcbiAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF9ub19jaGlsZFwiLCByZXRUb2tlbik7XG4gICAgICAgICAgICAgfSBcbiAgICAgICAgICAgICAvLyBpdCdzICdidXN5JyBsb2FkaW5nLCBpZ25vcmUgaXQgXG4gICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGxldCB2aW9sYXRlRWxlbVJvbGVzID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGZvciAobGV0IGo9MDsgaiA8IGRpcmVjdEFUQ2hpbGRyZW4ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGxldCBjaGlsZFJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXMoZGlyZWN0QVRDaGlsZHJlbltqXSwgZmFsc2UpO1xuICAgICAgICAgICAgLy8gaWYgZXhwbGljaXQgcm9sZSBkb2Vzbid0IGV4aXN0LCBnZXQgdGhlIGltcGxpY2l0IG9uZVxuICAgICAgICAgICAgaWYgKCFjaGlsZFJvbGVzIHx8IGNoaWxkUm9sZXMubGVuZ3RoID09IDApIFxuICAgICAgICAgICAgICAgIGNoaWxkUm9sZXMgPSAgQXJpYVV0aWwuZ2V0SW1wbGljaXRSb2xlKGRpcmVjdEFUQ2hpbGRyZW5bal0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoY2hpbGRSb2xlcyAmJiBjaGlsZFJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgKiB3aGVuIG11bHRpcGxlIHJvbGVzIGFyZSBzcGVjaWZpZWQgYXMgcmVxdWlyZWQgb3duZWQgZWxlbWVudHMgZm9yIGEgcm9sZSwgYXQgbGVhc3Qgb25lIGluc3RhbmNlIG9mIG9uZSByZXF1aXJlZCBvd25lZCBlbGVtZW50IGlzIGV4cGVjdGVkLiBcbiAgICAgICAgICAgICAgICAgKiB0aGUgc3BlY2lmaWNhdGlvbiBkb2VzIG5vdCByZXF1aXJlIGFuIGluc3RhbmNlIG9mIGVhY2ggb2YgdGhlIGxpc3RlZCBvd25lZCByb2xlcy5cbiAgICAgICAgICAgICAgICAgKiB0aGVyZWZvcmUsIHRoZSByZXF1aXJlbWVudCBpcyBtZXQgaWYgaXQgaGFzIGFueSBvbmUgb2YgdGhlIHJlcXVpcmVkIHJvbGVzLlxuICAgICAgICAgICAgICAgICAqLyAgICBcbiAgICAgICAgICAgICAgICBjb25zdCBmb3VuZCA9IGNoaWxkUm9sZXMuc29tZShyPT4gcmVxdWlyZWRDaGlsZFJvbGVzLmluY2x1ZGVzKHIpKTtcbiAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSBcbiAgICAgICAgICAgICAgICAgICAgdmlvbGF0ZUVsZW1Sb2xlcy5wdXNoKGNoaWxkUm9sZXMuam9pbihcIiwgXCIpKTsgXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGlnbm9yZSB0aGUgZWxlbWVudCBzaW5jZSBpdCdzIG5vdCBzZW1hbnRpYywgc2hvdWxkbid0IGhhcHBlbiBcbiAgICAgICAgICAgIH0gICAgIFxuICAgICAgICB9IFxuICAgICAgICBcbiAgICAgICAgaWYgKHZpb2xhdGVFbGVtUm9sZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGV0IHJldFZhbHVlcyA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgdmlvbGF0ZUVsZW1Sb2xlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCByZXRUb2tlbiA9IG5ldyBBcnJheSgpO1xuICAgICAgICAgICAgICAgIHJldFRva2VuLnB1c2gocm9sZXMuam9pbihcIiwgXCIpKTtcbiAgICAgICAgICAgICAgICByZXRUb2tlbi5wdXNoKHZpb2xhdGVFbGVtUm9sZXNbaV0pO1xuICAgICAgICAgICAgICAgIHJldFRva2VuLnB1c2gocmVxdWlyZWRDaGlsZFJvbGVzLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgICAgICAgICAgcmV0VmFsdWVzLnB1c2goUnVsZUZhaWwoXCJGYWlsX2ludmFsaWRfY2hpbGRcIiwgcmV0VG9rZW4pKTtcbiAgICAgICAgICAgIH0gXG4gICAgICAgICAgICByZXR1cm4gcmV0VmFsdWVzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfY29tcGxlbWVudGFyeV9sYWJlbF91bmlxdWU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsX3VuaXF1ZVwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpjb21wbGVtZW50YXJ5XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9NdWx0aXBsZUNvbXBsZW1lbnRhcnlMYW5kbWFya3NfSW1wbGljaXRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImFyaWFfY29tcGxlbWVudGFyeV9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIjogXCJhcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxfdW5pcXVlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlRoZSBlbGVtZW50IHdpdGggXFxcImNvbXBsZW1lbnRhcnlcXFwiIHJvbGUgaGFzIGEgdW5pcXVlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCIsXG4gICAgICAgICAgICBcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwiOiBcIk11bHRpcGxlIGVsZW1lbnRzIHdpdGggXFxcImNvbXBsZW1lbnRhcnlcXFwiIHJvbGUgZG8gbm90IGhhdmUgdW5pcXVlIGxhYmVsc1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVhY2ggZWxlbWVudCB3aXRoIFxcXCJjb21wbGVtZW50YXJ5XFxcIiByb2xlIG11c3QgaGF2ZSBhIHVuaXF1ZSBsYWJlbCB0aGF0IGRlc2NyaWJlcyBpdHMgcHVycG9zZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBkdXBwZWQgPSBBcmlhVXRpbC5pc0xhbmRtYXJrTmFtZVVuaXF1ZShydWxlQ29udGV4dCwgXCJjb21wbGVtZW50YXJ5XCIpOyAgICBcbiAgICAgICAgaWYgKGR1cHBlZCA9PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgaWYgKGR1cHBlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsX3Zpc2libGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsX3Zpc2libGVcIixcbiAgICBjb250ZXh0OiBcImRvbToqW3JvbGVdLCBkb206YXNpZGVcIixcbiAgICBkZXBlbmRlbmNpZXM6IFtcImFyaWFfY29tcGxlbWVudGFyeV9sYWJlbGxlZFwiXSxcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX0NvbXBsZW1lbnRhcnlMYW5kbWFya0xhYmVsX0ltcGxpY2l0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsX3Zpc2libGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxfdmlzaWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsX3Zpc2libGUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJFbGVtZW50IHdpdGggXFxcImNvbXBsZW1lbnRhcnlcXFwiIHJvbGUgZG9lcyBub3QgaGF2ZSBhIHZpc2libGUgbGFiZWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFYWNoIGVsZW1lbnQgd2l0aCBcXFwiY29tcGxlbWVudGFyeVxcXCIgcm9sZSBzaG91bGQgaGF2ZSBhIHZpc2libGUgbGFiZWwgdGhhdCBkZXNjcmliZXMgaXRzIHB1cnBvc2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBpZiAoIUFyaWFVdGlsLmhhc1JvbGVJblNlbWFudGljcyhydWxlQ29udGV4dCwgXCJjb21wbGVtZW50YXJ5XCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwYXNzZWQgPSBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KFxuICAgICAgICAgICAgcnVsZUNvbnRleHQsXG4gICAgICAgICAgICBcImFyaWEtbGFiZWxsZWRieVwiXG4gICAgICAgICk7XG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KHBhc3NlZCwgW3J1bGVDb250ZXh0XSwgJ3JvbGUnLCAnJywgW10pO1xuICAgICAgICBpZiAocGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBBY2NOYW1lVXRpbCB9IGZyb20gXCIuLi91dGlsL0FjY05hbWVVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfY29tcGxlbWVudGFyeV9sYWJlbGxlZDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxsZWRcIixcbiAgICBjb250ZXh0OiBcImFyaWE6Y29tcGxlbWVudGFyeVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfQ29tcGxlbWVudGFyeVJlcXVpcmVkTGFiZWxfSW1wbGljaXRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfY29tcGxlbWVudGFyeV9sYWJlbGxlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkVsZW1lbnQgd2l0aCBcXFwiY29tcGxlbWVudGFyeVxcXCIgcm9sZSBkb2VzIG5vdCBoYXZlIGEgbGFiZWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFYWNoIGVsZW1lbnQgd2l0aCBcXFwiY29tcGxlbWVudGFyeVxcXCIgcm9sZSBtdXN0IGhhdmUgYSBsYWJlbCB0aGF0IGRlc2NyaWJlcyBpdHMgcHVycG9zZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IHBhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWUocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAocGFpcikge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01XYWxrZXJcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5pbXBvcnQgeyBUYWJsZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9UYWJsZVV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfY29udGVudF9pbl9sYW5kbWFyazogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2NvbnRlbnRfaW5fbGFuZG1hcmtcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9PcnBoYW5lZENvbnRlbnRfTmF0aXZlX0hvc3RfU2VtYXRpY3NcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX2NvbnRlbnRfaW5fbGFuZG1hcmsuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2NvbnRlbnRfaW5fbGFuZG1hcmsuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfY29udGVudF9pbl9sYW5kbWFyay5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkNvbnRlbnQgaXMgbm90IHdpdGhpbiBhIGxhbmRtYXJrIGVsZW1lbnRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBbGwgY29udGVudCBtdXN0IHJlc2lkZSB3aXRoaW4gYW4gZWxlbWVudCB3aXRoIGEgbGFuZG1hcmsgcm9sZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaWRcIjogW1wiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgbGV0IHBhcmFtcyA9IENhY2hlVXRpbC5nZXRDYWNoZShjb250ZXh0LmRvbS5ub2RlLm93bmVyRG9jdW1lbnQsIFwiYXJpYV9jb250ZW50X2luX2xhbmRtYXJrXCIsIG51bGwpO1xuICAgICAgICBpZiAoIXBhcmFtcykge1xuICAgICAgICAgICAgcGFyYW1zID0ge1xuICAgICAgICAgICAgICAgIGxhbmRtYXJrczoge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogW1wiYmFubmVyXCIsIFwiY29tcGxlbWVudGFyeVwiLCBcImNvbnRlbnRpbmZvXCIsIFwiZm9ybVwiLCBcIm1haW5cIiwgXCJuYXZpZ2F0aW9uXCIsIFwicmVnaW9uXCIsIFwic2VhcmNoXCJdLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImFycmF5XCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHBvc3NpYmxlT3JwaGFuZWRXaWRnZXRzOiB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBbXCJidXR0b25cIiwgXCJjb21ib2JveFwiLCBcImNoZWNrYm94XCIsIFwiZ3JpZFwiLCBcImhlYWRpbmdcIiwgXCJsaW5rXCIsIFwibGlzdFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJsaXN0Ym94XCIsIFwibWVudVwiLCBcIm1lbnViYXJcIiwgXCJwcm9ncmVzc2JhclwiLCBcInJhZGlvXCIsIFwidGFibGlzdFwiLCBcInRleHRib3hcIiwgXCJ0b29sYmFyXCIsIFwidHJlZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJ0cmVlZ3JpZFwiXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcG9zc2libGVPcnBoYW5lZEVsZW1lbnRzOiB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBbXCJwXCIsIFwidGFibGVcIiwgXCJpbnB1dFwiLCBcInRleHRhcmVhXCIsIFwic2VsZWN0XCIsIFwiYnV0dG9uXCIsIFwiYVwiLCBcIm9sXCIsIFwidWxcIiwgXCJkbFwiLCBcImgxXCIsIFwiaDJcIiwgXCJoM1wiLCBcImg0XCIsIFwiaDVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiaDZcIiwgXCJlbWJlZFwiLCBcIm9iamVjdFwiLCBcImFyZWFcIlxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImFycmF5XCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG5vTGFuZG1hcmtlZFJvbGVzOiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZXNlIHJvbGVzIGRvbid0IHJlcXVpcmUgbGFuZG1hcmtzXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBbXCJhbGVydFwiLCBcImFsZXJ0ZGlhbG9nXCIsIFwiZGlhbG9nXCIsIFwidG9vbHRpcFwiXSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJhcnJheVwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBtYXBMYW5kbWFya3M6IHt9LFxuICAgICAgICAgICAgICAgIG1hcFBvc3NpYmxlT3JwaGFuZWRXaWRnZXRzOiB7fSxcbiAgICAgICAgICAgICAgICBtYXBQb3NzaWJsZU9ycGhhbmVkRWxlbWVudHM6IHt9LFxuICAgICAgICAgICAgICAgIG1hcE5vTGFuZG1hcmtlZFJvbGVzOiB7fVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQ29udmVydCBhcnJheXMgdG8gbWFwc1xuICAgICAgICAgICAgcGFyYW1zLm1hcExhbmRtYXJrcyA9IHt9O1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJhbXMubGFuZG1hcmtzLnZhbHVlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgcGFyYW1zLm1hcExhbmRtYXJrc1twYXJhbXMubGFuZG1hcmtzLnZhbHVlW2ldXSA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHBhcmFtcy5tYXBQb3NzaWJsZU9ycGhhbmVkV2lkZ2V0cyA9IHt9XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcmFtcy5wb3NzaWJsZU9ycGhhbmVkV2lkZ2V0cy52YWx1ZS5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIHBhcmFtcy5tYXBQb3NzaWJsZU9ycGhhbmVkV2lkZ2V0c1twYXJhbXMucG9zc2libGVPcnBoYW5lZFdpZGdldHMudmFsdWVbaV1dID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcGFyYW1zLm1hcFBvc3NpYmxlT3JwaGFuZWRFbGVtZW50cyA9IHt9XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcmFtcy5wb3NzaWJsZU9ycGhhbmVkRWxlbWVudHMudmFsdWUubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBwYXJhbXMubWFwUG9zc2libGVPcnBoYW5lZEVsZW1lbnRzW3BhcmFtcy5wb3NzaWJsZU9ycGhhbmVkRWxlbWVudHMudmFsdWVbaV1dID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcGFyYW1zLm1hcE5vTGFuZG1hcmtlZFJvbGVzID0ge31cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFyYW1zLm5vTGFuZG1hcmtlZFJvbGVzLnZhbHVlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgcGFyYW1zLm1hcE5vTGFuZG1hcmtlZFJvbGVzW3BhcmFtcy5ub0xhbmRtYXJrZWRSb2xlcy52YWx1ZVtpXV0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoY29udGV4dC5kb20ubm9kZS5vd25lckRvY3VtZW50LCBcImFyaWFfY29udGVudF9pbl9sYW5kbWFya1wiLCBwYXJhbXMpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKHJ1bGVDb250ZXh0KSB8fCAgLy8gYXZvaWQgZGlhZ25vc2luZyBnMTE1NyBmb3Igbm9uLXZpc2libGUgbm9kZXNcbiAgICAgICAgICAgIChWaXNVdGlsLmhpZGRlbkJ5RGVmYXVsdEVsZW1lbnRzICE9IG51bGwgJiZcbiAgICAgICAgICAgICAgICBWaXNVdGlsLmhpZGRlbkJ5RGVmYXVsdEVsZW1lbnRzICE9IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgIFZpc1V0aWwuaGlkZGVuQnlEZWZhdWx0RWxlbWVudHMuaW5kZXhPZihub2RlTmFtZSkgPiAtMSkpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBlbGVtc1dpdGhvdXRDb250ZW50ID0gW1wiYXJlYVwiLCBcImlucHV0XCIsIFwiZW1iZWRcIiwgXCJidXR0b25cIiwgXCJ0ZXh0YXJlYVwiLCBcInNlbGVjdFwiXTtcbiAgICAgICAgaWYgKCFDb21tb25VdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbihydWxlQ29udGV4dCkgJiYgLy9vbmx5IHRyaWdnZXIgdGhlIHJ1bGUgb24gZWxlbWVudHMgdGhhdCBoYXZlIGNvbnRlbnRcbiAgICAgICAgICAgIGVsZW1zV2l0aG91dENvbnRlbnQuaW5kZXhPZihub2RlTmFtZSkgPT09IC0xKSB7IC8vIGEgZmV3IGVsZW1zIHdpaG91dCBjb250ZW50IHNob3VsZCBub3QgYmUgc2tpcHBlZFxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2hvcnQgY2lyY3VpdCBmb3IgbGF5b3V0IHRhYmxlc1xuICAgICAgICBpZiAobm9kZU5hbWUgPT0gXCJ0YWJsZVwiICYmIFRhYmxlVXRpbC5pc0xheW91dFRhYmxlKHJ1bGVDb250ZXh0KSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBpZiBpdCBpcyBhIHBvc3NpYmxlIG9ycGhhblxuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgbGV0IGlzUG9zc2libGVPcnBoYW5lZFdpZGdldCA9IEFyaWFVdGlsLmhhc1JvbGUocnVsZUNvbnRleHQsIHBhcmFtcy5tYXBQb3NzaWJsZU9ycGhhbmVkV2lkZ2V0cywgdHJ1ZSk7XG4gICAgICAgIC8vZXhjbHVkZSA8bGluayByZWw9XCJzdHlsZXNoZWV0XCIgaHJlZj1cInh5ei5jc3NcIj4gaW4gdGhlIDxoZWFkPiBhbmQgPGJvZHk+KCM2MDgpXG4gICAgICAgIC8vaGF2aW5nIGxpbmsgaW4gdGhlIGhlYWQgY291bGQgY2F1c2UgbG90IG9mIHZpb2xhaW9ucyAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gJ2xpbmsnKSB7XG4gICAgICAgICAgICBpc1Bvc3NpYmxlT3JwaGFuZWRXaWRnZXQgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBpc1Bvc3NpYmxlT3JwaGFuZWRFbGVtZW50ID0gbm9kZU5hbWUgaW4gcGFyYW1zLm1hcFBvc3NpYmxlT3JwaGFuZWRFbGVtZW50cztcbiAgICAgICAgaWYgKGlzUG9zc2libGVPcnBoYW5lZFdpZGdldCB8fCBpc1Bvc3NpYmxlT3JwaGFuZWRFbGVtZW50KSB7XG4gICAgICAgICAgICAvLyBTZWUgaWYgYW5jZXN0b3IgaGFzIGxhbmRtYXJrIHJvbGVzIG9yIGltcGxpY2l0IGxhbmQgbWFyayByb2xlc1xuICAgICAgICAgICAgbGV0IHBhcmVudFJvbGVzID0gY29udGV4dEhpZXJhcmNoaWVzW1wiYXJpYVwiXS5tYXAoaW5mbyA9PiBpbmZvLnJvbGUpO1xuICAgICAgICAgICAgcGFzc2VkID0gcGFyZW50Um9sZXMuZmlsdGVyKHJvbGUgPT4gcm9sZSBpbiBwYXJhbXMubWFwTGFuZG1hcmtzKS5sZW5ndGggPiAwXG4gICAgICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgIC8vIERvbid0IGZhaWwgZWxlbWVudHMgd2hlbiBhIHBhcmVudCBvciBzaWJsaW5nIGhhcyBmYWlsZWQgLSBjYXVzZXMgdG9vIG1hbnkgbWVzc2FnZXMuXG4gICAgICAgICAgICAgICAgbGV0IHdhbGtFbGVtZW50ID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgICAgIHdoaWxlICghcGFzc2VkICYmIHdhbGtFbGVtZW50ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gQ2FjaGVVdGlsLmdldENhY2hlKHdhbGtFbGVtZW50LCBcIlJwdF9BcmlhX09ycGhhbmVkQ29udGVudFwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHdhbGtFbGVtZW50ID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQod2Fsa0VsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB3YWxrRWxlbWVudCA9IHJ1bGVDb250ZXh0Lm5leHRFbGVtZW50U2libGluZztcbiAgICAgICAgICAgICAgICB3aGlsZSAoIXBhc3NlZCAmJiB3YWxrRWxlbWVudCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IENhY2hlVXRpbC5nZXRDYWNoZSh3YWxrRWxlbWVudCwgXCJScHRfQXJpYV9PcnBoYW5lZENvbnRlbnRcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB3YWxrRWxlbWVudCA9IHdhbGtFbGVtZW50Lm5leHRFbGVtZW50U2libGluZztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgd2Fsa0VsZW1lbnQgPSBydWxlQ29udGV4dC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIHdoaWxlICghcGFzc2VkICYmIHdhbGtFbGVtZW50ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gQ2FjaGVVdGlsLmdldENhY2hlKHdhbGtFbGVtZW50LCBcIlJwdF9BcmlhX09ycGhhbmVkQ29udGVudFwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHdhbGtFbGVtZW50ID0gd2Fsa0VsZW1lbnQucHJldmlvdXNFbGVtZW50U2libGluZztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKHJ1bGVDb250ZXh0LCBcIlJwdF9BcmlhX09ycGhhbmVkQ29udGVudFwiLCB0cnVlKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCB0cmlnZ2VyIHJ1bGUgaWYgZWxlbWVudCBpcyBhIHN0YW5kLWFsb25lIHdpZGdldFxuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUocnVsZUNvbnRleHQsIFwiUnB0X0FyaWFfT3JwaGFuZWRDb250ZW50X05vVHJpZ2dlclwiLCBmYWxzZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIEFyaWFVdGlsLmhhc1JvbGUocnVsZUNvbnRleHQsIHBhcmFtcy5tYXBOb0xhbmRtYXJrZWRSb2xlcywgdHJ1ZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUocnVsZUNvbnRleHQsIHBhcmFtcy5tYXBOb0xhbmRtYXJrZWRSb2xlcywgdHJ1ZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3NlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKHJ1bGVDb250ZXh0LCBcIlJwdF9BcmlhX09ycGhhbmVkQ29udGVudF9Ob1RyaWdnZXJcIiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBbcnVsZUNvbnRleHRdLCAnJywgJycsIFtdKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX2NvbnRlbnRpbmZvX2xhYmVsX3VuaXF1ZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2NvbnRlbnRpbmZvX2xhYmVsX3VuaXF1ZVwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpjb250ZW50aW5mb1wiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfTXVsdGlwbGVDb250ZW50aW5mb0xhbmRtYXJrc19JbXBsaWNpdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiYXJpYV9jb250ZW50aW5mb19sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIjogXCJhcmlhX2NvbnRlbnRpbmZvX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9jb250ZW50aW5mb19sYWJlbF91bmlxdWUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiVGhlIGVsZW1lbnQgd2l0aCBcXFwiY29udGVudGluZm9cXFwiIHJvbGUgaGFzIGEgdW5pcXVlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCIsXG4gICAgICAgICAgICBcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwiOiBcIk11bHRpcGxlIGVsZW1lbnRzIHdpdGggXFxcImNvbnRlbnRpbmZvXFxcIiByb2xlIGRvIG5vdCBoYXZlIHVuaXF1ZSBsYWJlbHNcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFYWNoIGVsZW1lbnQgd2l0aCBcXFwiY29udGVudGluZm9cXFwiIHJvbGUgbXVzdCBoYXZlIGEgdW5pcXVlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IGR1cHBlZCA9IEFyaWFVdGlsLmlzTGFuZG1hcmtOYW1lVW5pcXVlKHJ1bGVDb250ZXh0LCBcImNvbnRlbnRpbmZvXCIsIHRydWUpOyAgICBcbiAgICAgICAgaWYgKGR1cHBlZCA9PSBudWxsKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBpZiAoZHVwcGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX2NvbnRlbnRpbmZvX21pc3VzZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2NvbnRlbnRpbmZvX21pc3VzZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbcm9sZV0sIGRvbTpmb290ZXIsIGRvbTphZGRyZXNzXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9Db250ZW50aW5mb1dpdGhOb01haW5fSW1wbGljaXRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9jb250ZW50aW5mb19taXN1c2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2NvbnRlbnRpbmZvX21pc3VzZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9jb250ZW50aW5mb19taXN1c2UuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJFbGVtZW50IHdpdGggXFxcImNvbnRlbnRpbmZvXFxcIiByb2xlIGlzIHByZXNlbnQgd2l0aG91dCBhbiBlbGVtZW50IHdpdGggXFxcIm1haW5cXFwiIHJvbGVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFYWNoIGVsZW1lbnQgd2l0aCBcXFwiY29udGVudGluZm9cXFwiIHJvbGUgaXMgb25seSBwZXJtaXR0ZWQgd2l0aCBhbiBlbGVtZW50IHdpdGggXFxcIm1haW5cXFwiIHJvbGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcblxuICAgICAgICAvL2NvbnNpZGVyIGltcGxpY2l0IHJvbGVcbiAgICAgICAgaWYgKCFBcmlhVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MocnVsZUNvbnRleHQsIFwiY29udGVudGluZm9cIikpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29uc2lkZXIgdGhlIENoZWNrIEhpZGRlbiBDb250ZW50IHNldHRpbmcgdGhhdCBpcyBzZXQgYnkgdGhlIHJ1bGVzXG4gICAgICAgIGxldCBwYXNzZWQgPVxuICAgICAgICAgICAgQ29tbW9uVXRpbC5nZXRFbGVtZW50c0J5Um9sZUhpZGRlbihcbiAgICAgICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgICAgIFwibWFpblwiLFxuICAgICAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgdHJ1ZVxuICAgICAgICAgICAgKS5sZW5ndGggPiAwO1xuXG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KHBhc3NlZCwgW3J1bGVDb250ZXh0XSwgJ3JvbGUnLCAnJywgW10pO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfY29udGVudGluZm9fc2luZ2xlOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfY29udGVudGluZm9fc2luZ2xlXCIsXG4gICAgY29udGV4dDogXCJkb206Kltyb2xlXSwgZG9tOmZvb3RlciwgZG9tOmFkZHJlc3NcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX011bHRpcGxlQ29udGVudGluZm9JblNpYmxpbmdTZXRfSW1wbGljaXRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX2NvbnRlbnRpbmZvX3NpbmdsZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfY29udGVudGluZm9fc2luZ2xlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2NvbnRlbnRpbmZvX3NpbmdsZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIk11bHRpcGxlIGVsZW1lbnRzIHdpdGggXFxcImNvbnRlbnRpbmZvXFxcIiByb2xlIGZvdW5kIG9uIHRoZSBwYWdlXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQSBwYWdlLCBkb2N1bWVudCwgb3IgYXBwbGljYXRpb24gc2hvdWxkIG9ubHkgaGF2ZSBvbmUgZWxlbWVudCB3aXRoIFxcXCJjb250ZW50aW5mb1xcXCIgcm9sZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcblxuICAgICAgICAvL2ZpbmQgb3V0IGlmIDxmb290ZXI+IGVsZW1lbnQgaGFzIHNpYmxpbmdzIGFzIDxmb290ZXI+IGhhcyBpbXBsaWNpdCBjb250ZW50aW5mbyByb2xlXG4gICAgICAgIGlmICghQXJpYVV0aWwuaGFzUm9sZUluU2VtYW50aWNzKHJ1bGVDb250ZXh0LCBcImNvbnRlbnRpbmZvXCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwYXNzZWQgPSAhQXJpYVV0aWwuZ2V0U2libGluZ1dpdGhSb2xlSGlkZGVuKFxuICAgICAgICAgICAgcnVsZUNvbnRleHQsXG4gICAgICAgICAgICBcImNvbnRlbnRpbmZvXCIsXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgdHJ1ZVxuICAgICAgICApO1xuXG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KHBhc3NlZCwgW3J1bGVDb250ZXh0XSwgJ3JvbGUnLCAnJywgW10pO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX2Rlc2NlbmRhbnRfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9kZXNjZW5kYW50X3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIGRlcGVuZGVuY2llczogW1wiYXJpYV9yb2xlX3ZhbGlkXCJdLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9kZXNjZW5kYW50X3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImFyaWFfZGVzY2VuZGFudF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9jaGlsZF9pbXBsaWNpdF9yb2xlXCI6IFwiYXJpYV9kZXNjZW5kYW50X3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwicmVjb21tZW5kYXRpb25fbm9faW1wYWN0X3JvbGVcIjogXCJhcmlhX2Rlc2NlbmRhbnRfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2NoaWxkX2V4cGxpY2l0X3JvbGVcIjogXCJhcmlhX2Rlc2NlbmRhbnRfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIkJyb3dzZXJzIGlnbm9yZSB0aGUgZXhwbGljaXQgYW5kIGltcGxpY2l0IEFSSUEgcm9sZXMgb2YgdGhlIGRlc2NlbmRhbnRzIG9mIGNlcnRhaW4gZWxlbWVudHNcIixcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlRoZSBlbGVtZW50IGNvbnRhaW5zIHZhbGlkIGRlc2NlbmRhbnRzXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9jaGlsZF9pbXBsaWNpdF9yb2xlXCI6IFwiVGhlIGVsZW1lbnQgd2l0aCByb2xlIFxcXCJ7MH1cXFwiIGNvbnRhaW5zIGRlc2NlbmRhbnRzIHdpdGggaW1wbGljaXQgcm9sZXMgXFxcInsxfVxcXCIgd2hpY2ggYXJlIGlnbm9yZWQgYnkgYnJvd3NlcnNcIixcbiAgICAgICAgICAgIFwicmVjb21tZW5kYXRpb25fbm9faW1wYWN0X3JvbGVcIjogXCJUaGUgZWxlbWVudCB3aXRoIHJvbGUgXFxcInswfVxcXCIgY29udGFpbnMgZGVzY2VuZGFudHMgd2l0aCByb2xlcyBcXFwiezF9XFxcIiB3aGljaCBhcmUgaWdub3JlZCBieSBicm93c2Vyc1wiLFxuICAgICAgICAgICAgXCJmYWlsX2NoaWxkX2V4cGxpY2l0X3JvbGVcIjogXCJUaGUgZWxlbWVudCB3aXRoIHJvbGUgXFxcInswfVxcXCIgY29udGFpbnMgZGVzY2VuZGFudHMgd2l0aCByb2xlcyBcXFwiezF9XFxcIiB3aGljaCBhcmUgaWdub3JlZCBieSBicm93c2Vyc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORSxcbiAgICAgICAgcmVhc29uQ29kZXM6IFtcInBhc3NcIiwgXCJwb3RlbnRpYWxfY2hpbGRfaW1wbGljaXRfcm9sZVwiLCBcImZhaWxfY2hpbGRfZXhwbGljaXRfcm9sZVwiXVxuICAgIH0se1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FLFxuICAgICAgICByZWFzb25Db2RlczogW1wicmVjb21tZW5kYXRpb25fbm9faW1wYWN0X3JvbGVcIl1cbiAgICB9XSxcbiAgICAvLyBUT0RPOiBBQ1Q6IFZlcmlmeSBtYXBwaW5nXG4gICAgYWN0OiBbXCIzMDduNXpcIl0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIFxuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IGlzIGhpZGRlbiBvciBkaXNhYmxlZFxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpIHx8IENvbW1vblV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBcbiAgICAgICAgLy9za2lwIHRoZSBjaGVjayBpZiB0aGUgZWxlbWVudCBkb2Vzbid0IHJlcXVpcmUgcHJlc2VudGF0aW9uYWwgY2hpbGRyZW4gb25seVxuICAgICAgICBpZiAoIUFyaWFVdGlsLmNvbnRhaW5zUHJlc2VudGF0aW9uYWxDaGlsZHJlbk9ubHkocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBcbiAgICAgICAgbGV0IHJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXMocnVsZUNvbnRleHQsIGZhbHNlKTtcbiAgICAgICAgLy8gaWYgZXhwbGljaXQgcm9sZSBkb2Vzbid0IGV4aXN0LCBnZXQgdGhlIGltcGxpY2l0IG9uZVxuICAgICAgICBpZiAoIXJvbGVzIHx8IHJvbGVzLmxlbmd0aCA9PT0gMCkgXG4gICAgICAgICAgICByb2xlcyA9ICBBcmlhVXRpbC5nZXRJbXBsaWNpdFJvbGUocnVsZUNvbnRleHQpO1xuICAgICAgICBcbiAgICAgICAgLy9pZ25vcmUgaWYgdGhlIGVsZW1lbnQgZG9lc24ndCBoYXZlIGFueSBleHBsaWNpdCBvciBpbXBsaWNpdCByb2xlLCBzaG91bGRuJ3QgaGFwcGVuXG4gICAgICAgIGlmICghcm9sZXMgfHwgcm9sZXMubGVuZ3RoID09PSAwKSBcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIGxldCB0YWdOYW1lID0gcnVsZUNvbnRleHQudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAvLyBnZXQgYWxsIHRoZSBjaGlsZHJlbiBmcm9tIGFjY2Vzc2liaWxpdHkgdHJlZSwgXG4gICAgICAgIC8vIGluY2x1ZGluZyBvbmVzIHdpdGggYXJpYS1vd25zICAgIFxuICAgICAgICBsZXQgZGlyZWN0QVRDaGlsZHJlbiA9IEFyaWFVdGlsLmdldERpcmVjdEFUQ2hpbGRyZW4ocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoZGlyZWN0QVRDaGlsZHJlbiAmJiBkaXJlY3RBVENoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vIHRoZSBlbGVtZW50IHdpdGggYXQgbGVhc3Qgb25lIG5vbi1wcmVzZW50YXRpb25hbCBjaGlsZHJlblxuICAgICAgICAgICAgbGV0IGV4cGxpY2l0Um9sZXMgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgICAgIGxldCBpbXBsaWNpdFJvbGVzID0gbmV3IEFycmF5KCk7XG4gICAgICAgICAgICBsZXQgbm9JbXBhY3RSb2xlcyA9IG5ldyBBcnJheSgpO1xuICAgICAgICAgICAgZm9yIChsZXQgaj0wOyBqIDwgZGlyZWN0QVRDaGlsZHJlbi5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIC8vIGlnbm9yZSA8aW1nPiBhbmQgPHN2Zz5cbiAgICAgICAgICAgICAgICBjb25zdCB0YWcgPSBkaXJlY3RBVENoaWxkcmVuW2pdLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgaWYgKHRhZyA9PT0gJ2ltZycgfHwgdGFnID09PSAnc3ZnJykgY29udGludWU7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gZ2V0IGV4cGxpY2l0IHJvbGUgaWYgZXhpc3RzXG4gICAgICAgICAgICAgICAgbGV0IGNoaWxkUm9sZXMgPSBBcmlhVXRpbC5nZXRSb2xlcyhkaXJlY3RBVENoaWxkcmVuW2pdLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkUm9sZXMgJiYgY2hpbGRSb2xlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHNlcGFyYXRlIGNhc2UgZm9yIHJvbGU9XCJjb2RlXCJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkUm9sZXMuaW5jbHVkZXMoXCJjb2RlXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBub0ltcGFjdFJvbGVzLnB1c2goY2hpbGRSb2xlcy5maWx0ZXIocm9sZSA9PiByb2xlID09PSBcImNvZGVcIikuam9pbihcIiwgXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBleHBsaWNpdFJvbGVzLnB1c2goY2hpbGRSb2xlcy5maWx0ZXIocm9sZSA9PiByb2xlICE9PSBcImNvZGVcIikuam9pbihcIiwgXCIpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBnZXQgaW1wbGljaXQgcm9sZSBpZiBleGlzdHNcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRSb2xlcyA9ICBBcmlhVXRpbC5nZXRJbXBsaWNpdFJvbGUoZGlyZWN0QVRDaGlsZHJlbltqXSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIHNlcGFyYXRlIGNhc2UgZm9yIHJvbGU9XCJjb2RlXCJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkUm9sZXMuaW5jbHVkZXMoXCJjb2RlXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBub0ltcGFjdFJvbGVzLnB1c2goY2hpbGRSb2xlcy5maWx0ZXIocm9sZSA9PiByb2xlID09PSBcImNvZGVcIikuam9pbihcIiwgXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGRSb2xlcyAmJiBjaGlsZFJvbGVzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGVzLnB1c2goY2hpbGRSb2xlcy5maWx0ZXIocm9sZSA9PiByb2xlICE9PSBcImNvZGVcIikuam9pbihcIiwgXCIpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChleHBsaWNpdFJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgcmV0VmFsdWVzID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgZXhwbGljaXRSb2xlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmV0VG9rZW4gPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0VG9rZW4ucHVzaChyb2xlcy5qb2luKFwiLCBcIikpO1xuICAgICAgICAgICAgICAgICAgICByZXRUb2tlbi5wdXNoKGV4cGxpY2l0Um9sZXNbaV0pO1xuICAgICAgICAgICAgICAgICAgICByZXRWYWx1ZXMucHVzaChSdWxlRmFpbChcImZhaWxfY2hpbGRfZXhwbGljaXRfcm9sZVwiLCByZXRUb2tlbikpO1xuICAgICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbHVlcztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGltcGxpY2l0Um9sZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCByZXRWYWx1ZXMgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBpbXBsaWNpdFJvbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZXRUb2tlbiA9IG5ldyBBcnJheSgpO1xuICAgICAgICAgICAgICAgICAgICByZXRUb2tlbi5wdXNoKHJvbGVzLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgICAgICAgICAgICAgIHJldFRva2VuLnB1c2goaW1wbGljaXRSb2xlc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbHVlcy5wdXNoKFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfY2hpbGRfaW1wbGljaXRfcm9sZVwiLCByZXRUb2tlbikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmV0VmFsdWVzO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobm9JbXBhY3RSb2xlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJldFZhbHVlcyA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGk9MDsgaSA8IG5vSW1wYWN0Um9sZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJldFRva2VuID0gbmV3IEFycmF5KCk7XG4gICAgICAgICAgICAgICAgICAgIHJldFRva2VuLnB1c2gocm9sZXMuam9pbihcIiwgXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0VG9rZW4ucHVzaChub0ltcGFjdFJvbGVzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsdWVzLnB1c2goUnVsZVBvdGVudGlhbChcInJlY29tbWVuZGF0aW9uX25vX2ltcGFjdF9yb2xlXCIsIHJldFRva2VuKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXRWYWx1ZXM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTsgICAgICAgXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfZG9jdW1lbnRfbGFiZWxfdW5pcXVlOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfZG9jdW1lbnRfbGFiZWxfdW5pcXVlXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmRvY3VtZW50XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9NdWx0aXBsZURvY3VtZW50Um9sZXNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImFyaWFfZG9jdW1lbnRfbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCI6IFwiYXJpYV9kb2N1bWVudF9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfZG9jdW1lbnRfbGFiZWxfdW5pcXVlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlRoZSBlbGVtZW50IHdpdGggXFxcImRvY3VtZW50XFxcIiByb2xlIGhhcyBhIHVuaXF1ZSBsYWJlbCB0aGF0IGRlc2NyaWJlcyBpdHMgcHVycG9zZVwiLFxuICAgICAgICAgICAgXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIjogXCJNdWx0aXBsZSBlbGVtZW50cyB3aXRoIFxcXCJkb2N1bWVudFxcXCIgcm9sZXMgZG8gbm90IGhhdmUgdW5pcXVlIGxhYmVsc1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVhY2ggZWxlbWVudCB3aXRoIFxcXCJkb2N1bWVudFxcXCIgcm9sZSBtdXN0IGhhdmUgYSB1bmlxdWUgbGFiZWwgdGhhdCBkZXNjcmliZXMgaXRzIHB1cnBvc2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuNC4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgY29uc3QgZHVwcGVkID0gQXJpYVV0aWwuaXNMYW5kbWFya05hbWVVbmlxdWUocnVsZUNvbnRleHQsIFwiZG9jdW1lbnRcIiwgdHJ1ZSk7ICAgIFxuICAgICAgICBpZiAoZHVwcGVkID09IG51bGwpIHJldHVybiBudWxsOyBcbiAgICAgICAgaWYgKGR1cHBlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX2V2ZW50aGFuZGxlcl9yb2xlX3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfZXZlbnRoYW5kbGVyX3JvbGVfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqW29uY2xpY2tdLGRvbToqW29uYmx1cl0sIGRvbToqW29uZGJsY2xpY2tdLCBkb206KltvbmZvY3VzXSwgZG9tOipbb25rZXlkb3duXSxkb206KltvbmtleXByZXNzXSwgZG9tOipbb25rZXl1cF0sIGRvbToqW29ubW91c2Vkb3duXSwgZG9tOipbb25tb3VzZXVwXSwgZG9tOipbb25tb3VzZW1vdmVdLCBkb206Kltvbm1vdXNlb3V0XSwgZG9tOipbb25tb3VzZW92ZXJdLCBkb206KltvbnJlc2l6ZV0sIGRvbToqW29uY2hhbmdlXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfRXZlbnRIYW5kbGVyTWlzc2luZ1JvbGVfTmF0aXZlX0hvc3RfU2VtYXRpY3NcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX2V2ZW50aGFuZGxlcl9yb2xlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV9ldmVudGhhbmRsZXJfcm9sZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9ldmVudGhhbmRsZXJfcm9sZV92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlRoZSA8ezB9PiBlbGVtZW50IHdpdGggJ3sxfScgZG9lcyBub3QgaGF2ZSBhIHZhbGlkIEFSSUEgcm9sZSBzcGVjaWZpZWRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFbGVtZW50cyB3aXRoIGV2ZW50IGhhbmRsZXJzIG11c3QgaGF2ZSBhIHZhbGlkIEFSSUEgcm9sZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy8gRG9uJ3QgdHJpZ2dlciB0aGlzIGZvciBTVkcgZWxlbWVudCBmb3Igbm93IHVudGlsIGEgZGV0ZXJtaW5hdGlvbiBpcyBtYWRlIChieSBSaWNoKVxuICAgICAgICAvLyB0byBzdXBwb3J0IFNWRyBhdCBhIHBvaW50IHdoZW4gdGhlIFNWRyBhMTF5IHNwZWMgaXMgcmVhZHkuXG4gICAgICAgIGlmIChDb21tb25VdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBcInN2Z1wiKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvL3RoaXMgcnVsZSBpcyBwYXNzZWQgaWYgYSBlbGVtZW50IGhhcyBhdHRyaWJ1dCByb2xlIFxuICAgICAgICAvL2Fsc28sIHBhc3NlZCBvZiBlbGVtZW50IGhhcyBhbnkgaW1wbGljaXQgcm9sZXMuIFxuICAgICAgICBpZiAoQXJpYVV0aWwuaGFzQW55Um9sZShydWxlQ29udGV4dCwgdHJ1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vcGFzcyBpZiB0aGlzIGVsZW1lbnQgaXMgcmVjZWl2ZWQgZm9jdXMgYnkgZGVmYXVsdFxuICAgICAgICBpZiAoQ29tbW9uVXRpbC5pc2ZvY3VzYWJsZUJ5RGVmYXVsdChydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vdmFsaWRhdGUgaWYgdGhpcyBlbGVtZW50IGhhcyBhbnkgb2YgdGhlIGdpdmVuIGV2ZW50IGhhbmRsZXInc1xuICAgICAgICBsZXQgcmV0VG9rZW4xID0gbmV3IEFycmF5KCk7XG4gICAgICAgIHJldFRva2VuMS5wdXNoKHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICBsZXQgZXZlbnRBcnIgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgLy8gRnJvbSBXQ0FHMjBfU2NyaXB0X1VzZVczQ0RvbUZ1bmN0aW9uc1xuICAgICAgICAvL2xldCBldmVudHMgPSBbXCJvbmJsdXJcIiwgXCJvbmZvY3VzXCIsIFwib25jaGFuZ2VcIiwgXCJvbmNsaWNrXCIsIFwib25jb250ZXh0bWVudVwiLCBcIm9uZGJsY2xpY2tcIiwgXCJvbmtleWRvd25cIixcbiAgICAgICAgLy8gICAgICAgICAgICAgIFwib25rZXlwcmVzc1wiLCBcIm9ua2V5dXBcIiwgXCJvbmxvYWRcIiwgXCJvbm1vdXNlZG93blwiLCBcIm9ubW91c2V1cFwiLCBcIm9ubW91c2Vtb3ZlXCIsIFwib25tb3VzZW91dFwiLFxuICAgICAgICAvLyAgICAgICAgICAgICAgXCJvbm1vdXNlb3ZlclwiLCBcIm9ubW91c2V3aGVlbFwiLCBcIm9ucmVzZXRcIiwgXCJvbnBhc3RlXCIsIFwib25yZXNpemVcIiwgXCJvbnNjcm9sbFwiLFxuICAgICAgICAvLyAgICAgICAgICAgICAgXCJvbnNlbGVjdFwiLCBcIm9uc3VibWl0XCIsIFwib25hY3RpdmF0ZVwiLCBcIm9uZGVhY3RpdmF0ZVwiLCBcIm9ubW91c2VlbnRlclwiLCBcIm9ubW91c2VsZWF2ZVwiXTtcbiAgICAgICAgbGV0IGV2ZW50cyA9IFtcIm9uYmx1clwiLCBcIm9uZm9jdXNcIiwgXCJvbmNoYW5nZVwiLCBcIm9uY2xpY2tcIiwgXCJvbmRibGNsaWNrXCIsIFwib25rZXlkb3duXCIsXG4gICAgICAgICAgICBcIm9ua2V5cHJlc3NcIiwgXCJvbmtleXVwXCIsIFwib25tb3VzZWRvd25cIiwgXCJvbm1vdXNldXBcIiwgXCJvbm1vdXNlbW92ZVwiLCBcIm9ubW91c2VvdXRcIixcbiAgICAgICAgICAgIFwib25tb3VzZW92ZXJcIiwgXCJvbnJlc2l6ZVwiXG4gICAgICAgIF07XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXZlbnRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKGV2ZW50c1tpXSkpXG4gICAgICAgICAgICAgICAgZXZlbnRBcnIucHVzaChldmVudHNbaV0pO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZXRUb2tlbjIgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgcmV0VG9rZW4yLnB1c2goZXZlbnRBcnIuam9pbihcIiwgXCIpKTtcbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQoZmFsc2UsIFtydWxlQ29udGV4dF0sICcnLCAnJywgW3JldFRva2VuMSwgcmV0VG9rZW4yXSk7XG4gICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiLCBbcmV0VG9rZW4xLnRvU3RyaW5nKCksIHJldFRva2VuMi50b1N0cmluZygpXSk7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfZm9ybV9sYWJlbF91bmlxdWU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9mb3JtX2xhYmVsX3VuaXF1ZVwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpmb3JtXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9NdWx0aXBsZUZvcm1MYW5kbWFya3NfSW1wbGljaXRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImFyaWFfZm9ybV9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIjogXCJhcmlhX2Zvcm1fbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2Zvcm1fbGFiZWxfdW5pcXVlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlRoZSBlbGVtZW50IHdpdGggXFxcImZvcm1cXFwiIHJvbGUgaGFzIGEgdW5pcXVlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCIsXG4gICAgICAgICAgICBcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwiOiBcIk11bHRpcGxlIGVsZW1lbnRzIHdpdGggXFxcImZvcm1cXFwiIHJvbGUgZG8gbm90IGhhdmUgdW5pcXVlIGxhYmVsc1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVhY2ggZWxlbWVudCB3aXRoIFxcXCJmb3JtXFxcIiByb2xlIG11c3QgaGF2ZSBhIHVuaXF1ZSBsYWJlbCB0aGF0IGRlc2NyaWJlcyBpdHMgcHVycG9zZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBkdXBwZWQgPSBBcmlhVXRpbC5pc0xhbmRtYXJrTmFtZVVuaXF1ZShydWxlQ29udGV4dCwgXCJmb3JtXCIsIHRydWUpOyAgICBcbiAgICAgICAgaWYgKGR1cHBlZCA9PSBudWxsKSByZXR1cm4gbnVsbDsgXG4gICAgICAgIGlmIChkdXBwZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX2dyYXBoaWNfbGFiZWxsZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9ncmFwaGljX2xhYmVsbGVkXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmdyYXBoaWNzLWRvY3VtZW50LGFyaWE6Z3JhcGhpY3Mtc3ltYm9sXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJIQUFDX0FyaWFfU3ZnQWx0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJGYWlsXzJcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiRmFpbF8zXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2dyYXBoaWNfbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX2dyYXBoaWNfbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2dyYXBoaWNfbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJhcmlhX2dyYXBoaWNfbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJhcmlhX2dyYXBoaWNfbGFiZWxsZWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIkFuIGVsZW1lbnQgd2l0aCBhIGdyYXBoaWNzIHJvbGUgbXVzdCBoYXZlIGEgbm9uLWVtcHR5IGxhYmVsXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkVsZW1lbnQgd2l0aCBcXFwiezB9XFxcIiBncmFwaGljcyByb2xlIGhhcyBubyBsYWJlbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJFbGVtZW50IHdpdGggXFxcInswfVxcXCIgZ3JhcGhpY3Mgcm9sZSBoYXMgbm8gbGFiZWwgb3IgYW4gZW1wdHkgbGFiZWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiRWxlbWVudCB3aXRoIFxcXCJ7MH1cXFwiIGdyYXBoaWNzIHJvbGUgbWlzc2luZyBub24tZW1wdHkgJ2FyaWEtbGFiZWwnIG9yICdhcmlhLWxhYmVsbGVkYnknXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFtdLFxuICAgIGFjdDogW3tcbiAgICAgICAgXCI3ZDY3MzRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImluYXBwbGljYWJsZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJmYWlsXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcImluYXBwbGljYWJsZVwiXG4gICAgICAgIH1cbiAgICB9XSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuXG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBpZiAoIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInJvbGVcIikgfHwgIXJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInJvbGVcIikuaW5jbHVkZXMoXCJncmFwaGljcy1cIikpIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8qIHJlbW92ZWQgdGhlIHJvbGUgY2hlY2sgcm9sZT0gcHJlc2VudGF0aW9uIHNpbmNlIGlmIGFuIGVsZW1lbnQgaGFzIHJvbGU9aW1nLCB0aGVuIHRoZXJlIG5lZWRzIHRvIGJlIGEgY2hlY2sgZm9yIGFsdCBhdHRyaWJ1dGUgcmVnYXJkbGVzcyBvZiB0aGUgcHJlc2VjbmUgb2Ygcm9sZT1wcmVzZW50YXRpb25cbiAgICAgICAgaWYgKFJQVFV0aWwuaGFzUm9sZShydWxlQ29udGV4dCwgXCJwcmVzZW50YXRpb25cIikgfHwgUlBUVXRpbC5oYXNSb2xlKHJ1bGVDb250ZXh0LCBcIm5vbmVcIikpe1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcygxKTtcbiAgICAgICAgfSovXG5cbiAgICAgICAgLy8gSWYgcm9sZSA9PT0gaW1nLCB5b3UgbXVzdCB1c2UgYW4gYXJpYSBsYWJlbFxuICAgICAgICAvL2NoZWNrIGF0dHJpYnV0ZXMgYXJpYS1sYWJlbCBhbmQgYXJpYS1sYWJlbGxlZGJ5IGZvciBvdGhlciB0YWdzIChlLmcuLCA8ZGl2PiwgPHNwYW4+LCBldGMpXG4gICAgICAgIGxldCBwYXNzZWQgPSBBcmlhVXRpbC5nZXRBcmlhTGFiZWwocnVsZUNvbnRleHQpLmxlbmd0aCA+IDA7XG5cbiAgICAgICAgaWYgKCFwYXNzZWQgJiYgcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJzdmdcIikge1xuICAgICAgICAgICAgbGV0IHN2Z1RpdGxlID0gcnVsZUNvbnRleHQucXVlcnlTZWxlY3RvcihcInRpdGxlXCIpO1xuICAgICAgICAgICAgcGFzc2VkID0gc3ZnVGl0bGUgJiYgQ29tbW9uVXRpbC5oYXNJbm5lckNvbnRlbnQoc3ZnVGl0bGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIC8vY2hlY2sgdGl0bGUgYXR0cmlidXRlXG4gICAgICAgICAgICBwYXNzZWQgPSBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInRpdGxlXCIpO1xuICAgICAgICAgICAgLy8gV2Ugc2hvdWxkIGd1aWRlIHBlb3BsZSB0byB1c2UgYWx0IG9yIGxhYmVsIC0gdGhpcyBpcyBqdXN0IGEgc2Vjb25kYXJ5IGFwcHJvYWNoIHRvIHNpbGVuY2UgdGhlIHJ1bGUuXG4gICAgICAgICAgICAvLyBTbywgd2Ugc2hvdWxkIGtlZXAgdGhlIFBPRiBmcm9tIGFib3ZlLlxuICAgICAgICAgICAgLy8gaWYgKCFwYXNzZWQpIFBPRiA9IFwiRmFpbF8zXCI7XG4gICAgICAgIH1cbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBbcnVsZUNvbnRleHRdLCAncm9sZScsICcnLCBbXSk7XG4gICAgICAgIGlmIChwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMlwiLCBbcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwicm9sZVwiKV0pXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX2hpZGRlbl9ub250YWJiYWJsZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2hpZGRlbl9ub250YWJiYWJsZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbYXJpYS1oaWRkZW49dHJ1ZV0sIGRvbToqW2FyaWEtaGlkZGVuPXRydWVdIGRvbToqXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJhcmlhX2hpZGRlbl9mb2N1c19taXN1c2VcIjogeyBcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IGBhcmlhX2hpZGRlbl9ub250YWJiYWJsZS5odG1sYCwgXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBgYXJpYV9oaWRkZW5fbm9udGFiYmFibGUuaHRtbGAsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBgYXJpYV9oaWRkZW5fbm9udGFiYmFibGUuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQSBoaWRkZW4gZWxlbWVudCBzaG91bGQgbm90IGNvbnRhaW4gYW55IHRhYmJhYmxlIGVsZW1lbnRzXCIsIFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJFbGVtZW50IFxcXCJ7MH1cXFwiIHNob3VsZCBub3QgYmUgZm9jdXNhYmxlIHdpdGhpbiB0aGUgc3VidHJlZSBvZiBhbiBlbGVtZW50IHdpdGggYW4gJ2FyaWEtaGlkZGVuJyBhdHRyaWJ1dGUgd2l0aCB2YWx1ZSAndHJ1ZSdcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFsgXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIG51bTogW1wiMS4zLjFcIiwgXCI0LjEuMlwiXSwgLy8gbnVtOiBbIFwiMi40LjRcIiwgXCJ4LnkuelwiIF0gYWxzbyBhbGxvd2VkXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICAvLyBUT0RPOiBBQ1Q6IEhhbmRsZSB0ZXN0Y2FzZSB3aXRoIGZvY3VzIGp1bXBpbmcgYXdheVxuICAgIGFjdDogXCI2Y2ZhODRcIixcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAgICAgXG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChDb21tb25VdGlsLmlzVGFiYmFibGUocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW25vZGVOYW1lXSk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcbmltcG9ydCB7IEFSSUFEZWZpbml0aW9ucyB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFEZWZpbml0aW9uc1wiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfaWRfdW5pcXVlOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfaWRfdW5pcXVlXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfVmFsaWRJZFJlZlwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfaWRfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV9pZF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfaWRfdW5pcXVlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiVGhlICdpZCcgXFxcInswfVxcXCIgc3BlY2lmaWVkIGZvciB0aGUgQVJJQSBwcm9wZXJ0eSAnezF9JyB2YWx1ZSBpcyBub3QgdmFsaWRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgQVJJQSBwcm9wZXJ0eSBtdXN0IHJlZmVyZW5jZSBhIG5vbi1lbXB0eSB1bmlxdWUgaWQgb2YgYW4gZXhpc3RpbmcgZWxlbWVudCB0aGF0IGlzIHZpc2libGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICAvLyBUT0RPOiBBQ1Q6IDZhNzI4MSAtIE5lZWQgYSBzZXBhcmF0ZSByZWFzb24gY29kZSB3aGVuIHRoZSBwcm9wZXJ0eSBpcyBub3QgcmVxdWlyZWQuIEFDVCBzYXlzIGl0J3Mgb2theSB0byBiZVxuICAgIC8vIGludmFsaWQgd2hlbiBub3QgcmVxdWlyZWQuIEkgdGhpbmsgd2Ugc2hvdWxkIHN0aWxsIGZhaWwsIGJ1dCBmbGFnIGl0IGFzIGEgZGlmZmVyZW50IHJlYXNvbiBzbyB0aGF0IHdlIGNhbiBoYXZlIGEgc3Vic2V0XG4gICAgLy8gYWxpZ25zIHdpdGggQUNULlxuICAgIGFjdDogW1wiNTk3OTZmXCIsIFwiNmE3MjgxXCJdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzID0gdHJ1ZTtcbiAgICAgICAgbGV0IGF0dHJOYW1lQXJyID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCBub25FeGlzdGFudElEcyA9IG5ldyBBcnJheSgpO1xuICAgICAgICBsZXQgb3duZXJEb2N1bWVudCA9IEZyYWdtZW50VXRpbC5nZXRPd25lckZyYWdtZW50KHJ1bGVDb250ZXh0KTtcbiAgICAgICAgbGV0IGNvbnRleHRBdHRyaWJ1dGVzID0gcnVsZUNvbnRleHQuYXR0cmlidXRlcztcbiAgICAgICAgbGV0IGlkVG9rZW5zID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCB0ZXN0ZWRSZWZlcmVuY2VzID0gMDtcblxuICAgICAgICBpZiAoY29udGV4dEF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBhdHRyTGVuZ3RoID0gY29udGV4dEF0dHJpYnV0ZXMubGVuZ3RoOyBpIDwgYXR0ckxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgcGFzcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgbGV0IGF0dHJOYW1lID0gY29udGV4dEF0dHJpYnV0ZXNbaV0ubmFtZTtcbiAgICAgICAgICAgICAgICBpZiAoQXJpYVV0aWwuaXNEZWZpbmVkQXJpYUF0dHJpYnV0ZShydWxlQ29udGV4dCwgYXR0ck5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkYXRhVHlwZXMgPSBBUklBRGVmaW5pdGlvbnMucHJvcGVydHlEYXRhVHlwZXNbYXR0ck5hbWVdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YVR5cGVzICYmIGRhdGFUeXBlcy50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3VwcG9ydHNPbmVJRFJlZiA9IChkYXRhVHlwZXMudHlwZSA9PSBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2lkcmVmXCIpID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9JZiB0aGUgZGF0YSB0eXBlIHN1cHBvcnRzIG9uZSBvciBtb3JlIGlkIHJlZnMgZG8gZXJyb3IgY2hlY2tpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdXBwb3J0c09uZUlEUmVmIHx8IChkYXRhVHlwZXMudHlwZSA9PSBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2lkcmVmc1wiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RlZFJlZmVyZW5jZXMrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbm9kZVZhbHVlTGVuZ3RoID0gQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKGNvbnRleHRBdHRyaWJ1dGVzW2ldLm5vZGVWYWx1ZSkubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpZEFycmF5ID0gY29udGV4dEF0dHJpYnV0ZXNbaV0ubm9kZVZhbHVlLnNwbGl0KFwiIFwiKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBhbiBlbXB0eSBJRCBSZWZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZVZhbHVlTGVuZ3RoIDwgMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkVG9rZW5zLnB1c2goXCJcXFwiXCIgKyBjb250ZXh0QXR0cmlidXRlc1tpXS5ub2RlVmFsdWUgKyBcIlxcXCJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIHRvIHNlZSBpZiB0b28gbWFueSBJRFJlZnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzdXBwb3J0c09uZUlEUmVmKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vSWYgaGFzIHRvbyBtYW55IElEUmVmcyBpdCBpcyBhbiBlcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZVZhbHVlTGVuZ3RoID49IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZEFycmF5Lmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmVlZCB0byBjYXB0dXJlIGFsbCB0aGUgSURSZWZzIGZvciBpZFRva2Vuc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHogPSAwLCBsZW5ndGggPSBpZEFycmF5Lmxlbmd0aDsgeiA8IGxlbmd0aDsgKyt6KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZEFycmF5W3pdICE9IFwiXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkVG9rZW5zLnB1c2goaWRBcnJheVt6XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgdG8gc2VlIGlmIGlkIHJlZnMgYXJlIGludmFsaWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFzcyAmJiBub2RlVmFsdWVMZW5ndGggPj0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMCwgbGVuZ3RoID0gaWRBcnJheS5sZW5ndGg7IGogPCBsZW5ndGg7ICsraikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlkQXJyYXlbal0ubGVuZ3RoID4gMCkgeyAvLyBpdCBpcyBhbiBlbXB0eSBzdHJpbmcgaWYgc3BhY2VzIGFyZSBvbmUgYWZ0ZXIgdGhlIG90aGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBlbGVtZW50IGJ5IElkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVsZW1lbnRCeUlkID0gb3duZXJEb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZEFycmF5W2pdKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBhc3MgaWYgdGhlIGVsZW1lbnQgZXhpc3RzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzcyA9IGVsZW1lbnRCeUlkICE9IG51bGw7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgZWxlbWVudCBleGlzdHMgYW5kIHRoaXMgaXMgYW4gYXJpYSBhdHRyaWJ1dGUgdGhhdCBkb2Vzbid0IHN1cHBvcnQgaGlkZGVuIElEIHJlZmVyZW5jZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZW4gcGVyZm9ybSBhIGlzTm9kZVZpc2libGUgY2hlY2ssIGluIHRoZSBjYXNlIHRoZSBub2RlIGlzIG5vdCB2aXNpYmxlIHRoZW4gd2UgcmV0dXJuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFsc2UgYW5kIHRydWUgb3RoZXJ3aXNlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXNzICYmICFkYXRhVHlwZXMuaGlkZGVuSURSZWZTdXBwb3J0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzcyA9IFZpc1V0aWwuaXNOb2RlVmlzaWJsZShlbGVtZW50QnlJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZEFycmF5W2pdICE9IFwiXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkVG9rZW5zLnB1c2goaWRBcnJheVtqXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSBvbmUgb2YgdGhlIGlkIHJlZmVyZW5jZXMgbmVlZCB0byBiZSB2YWxpZCB0byBtYXJrIHRoZSBydWxlIGFzIHBhc3NlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGVyZWZvcmUgaWYgd2UgZmluZCBhIHNpbmdsZSB2aXNpYmxlIGVsZW1lbnQgdGhlbiBzdG9wIGNoZWNraW5nIGFuZCBtYXJrIGFzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFzc2VkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXNzKSBhdHRyTmFtZUFyci5wdXNoKGF0dHJOYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHBhc3NlZCA9IGF0dHJOYW1lQXJyLmxlbmd0aCA9PSAwO1xuICAgICAgICBsZXQgcmV0VG9rZW4xID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCByZXRUb2tlbjIgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgbGV0IHJldFRva2VuMyA9IG5ldyBBcnJheSgpO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuXG4gICAgICAgICAgICByZXRUb2tlbjIucHVzaChhdHRyTmFtZUFyci5qb2luKFwiLCBcIikpO1xuICAgICAgICAgICAgcmV0VG9rZW4zLnB1c2gocnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgICAgICBpZiAoaWRUb2tlbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHJldFRva2VuMS5wdXNoKGlkVG9rZW5zLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIFtydWxlQ29udGV4dF0sIGF0dHJOYW1lQXJyLCAnJywgcGFzc2VkID09IHRydWUgPyBbXSA6IFtyZXRUb2tlbjEsIHJldFRva2VuMiwgcmV0VG9rZW4zXSk7XG4gICAgICAgIGlmICh0ZXN0ZWRSZWZlcmVuY2VzID09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9IGVsc2UgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiLCBbcmV0VG9rZW4xLnRvU3RyaW5nKCksIHJldFRva2VuMi50b1N0cmluZygpLCByZXRUb2tlbjMudG9TdHJpbmcoKV0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9pbWdfbGFiZWxsZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9pbWdfbGFiZWxsZWRcIixcbiAgICBjb250ZXh0OiBcImFyaWE6aW1nLCBhcmlhOmltYWdlXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJIQUFDX0FyaWFfSW1nQWx0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJGYWlsXzJcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiRmFpbF8zXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2ltZ19sYWJlbGxlZC5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfaW1nX2xhYmVsbGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV9pbWdfbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJhcmlhX2ltZ19sYWJlbGxlZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcImFyaWFfaW1nX2xhYmVsbGVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBbiBlbGVtZW50IHdpdGggXFxcImltZ1xcXCIgcm9sZSBtdXN0IGhhdmUgYSBub24tZW1wdHkgbGFiZWxcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRWxlbWVudCB3aXRoIFxcXCJpbWdcXFwiIHJvbGUgaGFzIG5vIGxhYmVsXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkVsZW1lbnQgd2l0aCBcXFwiaW1nXFxcIiByb2xlIGhhcyBubyBsYWJlbCBvciBhbiBlbXB0eSBsYWJlbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJFbGVtZW50IHdpdGggXFxcImltZ1xcXCIgcm9sZSBtaXNzaW5nIG5vbi1lbXB0eSAnYXJpYS1sYWJlbCcgb3IgJ2FyaWEtbGFiZWxsZWRieSdcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW10sXG4gICAgYWN0OiBbXCIyM2EyYThcIiwge1xuICAgICAgICBcIjdkNjczNFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcImZhaWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiaW5hcHBsaWNhYmxlXCJcbiAgICAgICAgfVxuICAgIH1dLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJyb2xlXCIpKSB7XG4gICAgICAgICAgICAvLyBJZiBubyByb2xlLCB0aGlzIGlzIGltcGxpY2l0LCBhbmQgY292ZXJlZCBieSBXQ0FHMjBfSW1nX0hhc0FsdFxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICAvLyBzdmcgYW5kIGltZyBlbGVtZW50cyBhcmUgaGFuZGxlZCBpbiBzdmdfZ3JhcGhpY3NfbGFiYmVsbGVkIGFuZCBpbWdfYWx0X3ZhbGlkIHJ1bGVzXG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gJ3N2ZycgfHwgbm9kZU5hbWUgPT09ICdpbWcnKSByZXR1cm47XG5cbiAgICAgICAgLyogcmVtb3ZlZCB0aGUgcm9sZSBjaGVjayByb2xlPSBwcmVzZW50YXRpb24gc2luY2UgaWYgYW4gZWxlbWVudCBoYXMgcm9sZT1pbWcsIHRoZW4gdGhlcmUgbmVlZHMgdG8gYmUgYSBjaGVjayBmb3IgYWx0IGF0dHJpYnV0ZSByZWdhcmRsZXNzIG9mIHRoZSBwcmVzZWNuZSBvZiByb2xlPXByZXNlbnRhdGlvblxuICAgICAgICBpZiAoUlBUVXRpbC5oYXNSb2xlKHJ1bGVDb250ZXh0LCBcInByZXNlbnRhdGlvblwiKSB8fCBSUFRVdGlsLmhhc1JvbGUocnVsZUNvbnRleHQsIFwibm9uZVwiKSl7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKDEpO1xuICAgICAgICB9Ki9cblxuICAgICAgICAvKiBKQ0ggLSBQb2ludHMgb2YgZmFpbHVyZVxuICAgICAgICAgKiAgICAwLiBNaXNzaW5nIGFsdCBhdHRyIHdpdGggdmFsdWVcbiAgICAgICAgICogICAgMS4gTWlzc2luZyBhcmlhLWxhYmVsIG9yIGFyaWEtbGFiZWxsZWRieVxuICAgICAgICAgKiAgICAyLiBNaXNzaW5nIHRpdGxlIGF0dHIgd2l0aCB2YWx1ZVxuICAgICAgICAgKi9cbiAgICAgICAgXG4gICAgICAgIC8vIElmIHJvbGUgPT09IGltZywgeW91IG11c3QgdXNlIGFuIGFyaWEgbGFiZWxcbiAgICAgICAgLy9jaGVjayBhdHRyaWJ1dGVzIGFyaWEtbGFiZWwgYW5kIGFyaWEtbGFiZWxsZWRieSBmb3Igb3RoZXIgdGFncyAoZS5nLiwgPGRpdj4sIDxzcGFuPiwgZXRjKVxuICAgICAgICBsZXQgcGFzc2VkID0gQXJpYVV0aWwuZ2V0QXJpYUxhYmVsKHJ1bGVDb250ZXh0KS5sZW5ndGggPiAwO1xuXG4gICAgICAgIGlmICghcGFzc2VkICYmIHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwic3ZnXCIpIHtcbiAgICAgICAgICAgIGxldCBzdmdUaXRsZSA9IHJ1bGVDb250ZXh0LnF1ZXJ5U2VsZWN0b3IoXCJ0aXRsZVwiKTtcbiAgICAgICAgICAgIHBhc3NlZCA9IHN2Z1RpdGxlICYmIENvbW1vblV0aWwuaGFzSW5uZXJDb250ZW50KHN2Z1RpdGxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAvL2NoZWNrIHRpdGxlIGF0dHJpYnV0ZVxuICAgICAgICAgICAgcGFzc2VkID0gQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJ0aXRsZVwiKTtcbiAgICAgICAgICAgIC8vIFdlIHNob3VsZCBndWlkZSBwZW9wbGUgdG8gdXNlIGFsdCBvciBsYWJlbCAtIHRoaXMgaXMganVzdCBhIHNlY29uZGFyeSBhcHByb2FjaCB0byBzaWxlbmNlIHRoZSBydWxlLlxuICAgICAgICAgICAgLy8gU28sIHdlIHNob3VsZCBrZWVwIHRoZSBQT0YgZnJvbSBhYm92ZS5cbiAgICAgICAgICAgIC8vIGlmICghcGFzc2VkKSBQT0YgPSBcIkZhaWxfM1wiO1xuICAgICAgICB9XG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KHBhc3NlZCwgW3J1bGVDb250ZXh0XSwgJ3JvbGUnLCAnJywgW10pO1xuICAgICAgICBpZiAocGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzJcIilcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgQVJJQURlZmluaXRpb25zIH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQURlZmluaXRpb25zXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9rZXlib2FyZF9oYW5kbGVyX2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2tleWJvYXJkX2hhbmRsZXJfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJkb206Kltyb2xlXVwiLFxuICAgIGRlcGVuZGVuY2llczogW1wiYXJpYV9yb2xlX2FsbG93ZWRcIl0sXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9NaXNzaW5nS2V5Ym9hcmRIYW5kbGVyXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX25vX2tleWJvYXJkX2FjY2Vzc1wiOiBcInBvdGVudGlhbF9ub19rZXlib2FyZF9hY2Nlc3NcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJhcmlhX2tleWJvYXJkX2hhbmRsZXJfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX25vX2tleWJvYXJkX2FjY2Vzc1wiOiBcImFyaWFfa2V5Ym9hcmRfaGFuZGxlcl9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfa2V5Ym9hcmRfaGFuZGxlcl9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX25vX2tleWJvYXJkX2FjY2Vzc1wiOiBcIlZlcmlmeSB0aGUgPHswfT4gZWxlbWVudCB3aXRoIFxcXCJ7MX1cXFwiIHJvbGUgaGFzIGtleWJvYXJkIGFjY2Vzc1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkludGVyYWN0aXZlIFdBSV9BUklBIFVJIGNvbXBvbmVudHMgbXVzdCBwcm92aWRlIGtleWJvYXJkIGFjY2Vzc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcblxuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IGlzIGhpZGRlbiBvciBkaXNhYmxlZFxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpIHx8IENvbW1vblV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuICAgICAgICBsZXQgc2F2ZWRQYXNzZWQgPSBwYXNzZWQ7XG4gICAgICAgIGxldCBkb2MgPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50O1xuICAgICAgICBsZXQgZGVzaWduUGF0dGVybnMgPSBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnM7XG4gICAgICAgIC8vbGV0IHJvbGVzID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwicm9sZVwiKS50cmltKCkudG9Mb3dlckNhc2UoKS5zcGxpdCgvXFxzKy8pO1xuICAgICAgICAvL29ubHkgY29uc2lkZXIgdXNlciBzcGVjaWZpZWQgcm9sZShzKSwgcmF0aGVyIHRoYW4gbmF0aXZlIGNvbnRhaW5lcnNcbiAgICAgICAgbGV0IHJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXMocnVsZUNvbnRleHQsIGZhbHNlKTtcbiAgICAgICAgXG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIC8vaWYgYW4gZXhwbGljaXQgcm9sZSBpcyBzcGVjaWZpZWQsIHRoZSAnYXJpYV9yb2xlX3JlZHVuZGFudCcgcnVsZSBzaG91bGQgYmUgdHJpZ2dlcmVkIGFuZCBhZGRyZXNzZWQgZmlyc3QsXG4gICAgICAgIC8vIGFuZCB0aGUgY3VycmVudCBydWxlIHNob3VsZCBiZSBpZ25vcmVkXG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gJ2RhdGFsaXN0JyAmJiByb2xlcyAmJiByb2xlcy5pbmNsdWRlcyhcImxpc3Rib3hcIikpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIFxuICAgICAgICAvLyBDb21wb3NpdGUgdXNlciBpbnRlcmZhY2Ugd2lkZ2V0IHJvbGVzLiBUaGV5IGFjdCBhcyBjb250YWluZXJzIHRoYXQgbWFuYWdlIG90aGVyLCBjb250YWluZWQgd2lkZ2V0cy5cbiAgICAgICAgbGV0IHJvbGVDb250YWluZXJzID0gW1wiY29tYm9ib3hcIiwgXCJncmlkXCIsIFwibGlzdGJveFwiLCBcIm1lbnVcIiwgXCJtZW51YmFyXCIsIFwicmFkaW9ncm91cFwiLCBcInRhYmxpc3RcIiwgXCJ0cmVlXCIsIFwidHJlZWdyaWRcIl07XG4gICAgICAgIGZvciAoY29uc3Qgcm9sZSBvZiByb2xlQ29udGFpbmVycykge1xuICAgICAgICAgICAgaWYgKEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUocnVsZUNvbnRleHQsIHJvbGUsIHRydWUpICE9IG51bGwpIFxuICAgICAgICAgICAgICAgIC8vIGl0J3MgYSBkZXNjZW5kYW50IG9mIGEgY29tcG9zaXRlIHdpZGdldCBhbHJlYWR5IGV4YW1pbmVkXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGxldCBoYXNBdHRyaWJ1dGUgPSBDb21tb25VdGlsLmhhc0F0dHJpYnV0ZTtcbiAgICAgICAgXG4gICAgICAgIGxldCByb2xlTmFtZUFyciA9IG5ldyBBcnJheSgpO1xuXG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcm9sZXMubGVuZ3RoOyArK2opIHtcbiAgICAgICAgICAgIGxldCBwYXR0ZXJuID0gZGVzaWduUGF0dGVybnNbcm9sZXNbal1dO1xuICAgICAgICAgICAgaWYgKHJvbGVDb250YWluZXJzLmluZGV4T2Yocm9sZXNbal0pID49IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgZGlzYWJsZWQgPSBoYXNBdHRyaWJ1dGUocnVsZUNvbnRleHQsICdhcmlhLWRpc2FibGVkJykgPyBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWRpc2FibGVkXCIpIDogJyc7XG4gICAgICAgICAgICAgICAgaWYgKCFkaXNhYmxlZCkge1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFNlZSBpZiB0aGVyZSBpcyBhIGtleWJvYXJkIGV2ZW50IGhhbmRsZXIgb24gdGhlIHBhcmVudCBlbGVtZW50LlxuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25rZXlkb3duXCIpIHx8IHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9ua2V5cHJlc3NcIikgfHwgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25rZXl1cFwiKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gTm8ga2V5Ym9hcmQgZXZlbnQgaGFuZGxlciBmb3VuZCBvbiBwYXJlbnQuIFNlZSBpZiBrZXlib2FyZCBldmVudCBoYW5kbGVycyBhcmUgb24gcmVxdWlyZWQgY2hpbGQgZWxlbWVudHMuXG4gICAgICAgICAgICAgICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc0F0dHJpYnV0ZShydWxlQ29udGV4dCwgJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlcUNoaWxkcmVuID0gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVzW2pdXS5yZXFDaGlsZHJlbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVxQ2hpbGRyZW4pIHsgLyogU01GIFRPRE8gbWVudWJhciBkb2VzIG5vdCBoYXZlIGFueSByZXFDaGlsZHJlbiAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgcmVxdWlyZWRDaGlsZHJlbkxlbmd0aCA9IHJlcUNoaWxkcmVuLmxlbmd0aDsgaSA8IHJlcXVpcmVkQ2hpbGRyZW5MZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHhwID0gXCIqW2NvbnRhaW5zKEByb2xlLCdcIiArIHJlcUNoaWxkcmVuW2ldICsgXCInKV1cIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB4cGF0aFJlc3VsdCA9IGRvYy5ldmFsdWF0ZSh4cCwgcnVsZUNvbnRleHQsIENvbW1vblV0aWwuZGVmYXVsdE5TUmVzb2x2ZXIsIDAgLyogWFBhdGhSZXN1bHQuQU5ZX1RZUEUgKi8sIG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHIgPSB4cGF0aFJlc3VsdC5pdGVyYXRlTmV4dCgpIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocikge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gKHIuaGFzQXR0cmlidXRlKFwib25rZXlkb3duXCIpIHx8IHIuaGFzQXR0cmlidXRlKFwib25rZXlwcmVzc1wiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXNzZWQpIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGlsZCBkaWQgbm90IGhhdmUgYSBrZXkgaGFuZGxlci4gU2VlIGlmIGFueSBvZiB0aGUgZ3JhbmRjaGlsZHJlbiBkby5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHhwMiA9IFwiZGVzY2VuZGFudDo6KlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgeHBhdGhSZXN1bHQyID0gZG9jLmV2YWx1YXRlKHhwMiwgciwgQ29tbW9uVXRpbC5kZWZhdWx0TlNSZXNvbHZlciwgMCAvKiBYUGF0aFJlc3VsdC5BTllfVFlQRSAqLywgbnVsbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByMjogRWxlbWVudCA9IHhwYXRoUmVzdWx0Mi5pdGVyYXRlTmV4dCgpIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChyMiAmJiAhcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGb2xsb3dpbmcgYXJlIHRoZSBzdGVwcyB0aGF0IGFyZSBleGVjdXRlZCBhdCB0aGlzIHN0YWdlIHRvIGRldGVybWluZSBpZiB0aGUgbm9kZSBzaG91bGQgYmUgY2xhc3NpZmllZCBhcyBoaWRkZW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yIG5vdC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAxLiBPbmx5IHJ1biBpc05vZGVWaXNpYmxlIGNoZWNrIGlmIGhpZGRlbiBjb250ZW50IHNob3VsZCBOT1QgYmUgY2hlY2tlZC4gSW4gdGhlIGNhc2UgdGhhdCBoaWRkZW4gY29udGVudCBpcyB0byxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBiZSBzY2FubmVkIHRoZW4gd2UgY2FuIGp1c3Qgc2NhbiBldmVyeXRoaW5nIGFzIG5vcm1hbC4gSW4gdGhlIGNhc2UgdGhhdCB0aGUgY3VycmVudCBub2RlIGlzIGhpZGRlbiB3ZSBkbyBub3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBhZGQgaXQgdG8gdGhlIHJvbGVUb0VsZW1zIGhhc2ggYXQgYWxsIG9yIGV2ZW4gZG8gYW55IGNoZWNraW5nIGZvciBpdCBhdCBhbGwuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90ZTogVGhlIGlmIGNvbmRpdGlvbnMgdXNlcyBzaG9ydC1jaXJjdWl0aW5nIHNvIGlmIHRoZSBmaXJzdCBjb25kaXRpb24gaXMgbm90IHRydWUgaXQgd2lsbCBub3QgY2hlY2sgdGhlIG5leHQgb25lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgc28gb24gYW5kIHNvIGZvcnRoLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENvbW1vblV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbihyMikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByMiA9IHhwYXRoUmVzdWx0Mi5pdGVyYXRlTmV4dCgpIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IENvbW1vblV0aWwuaXNUYWJiYWJsZShyMikgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocjIuaGFzQXR0cmlidXRlKFwib25rZXlkb3duXCIpIHx8IHIyLmhhc0F0dHJpYnV0ZShcIm9ua2V5cHJlc3NcIikpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJcyB0aGlzIGFuIGFjdGlvbiBsaW5rP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocjIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSBcImFcIiAmJiByMi5oYXNBdHRyaWJ1dGUoXCJocmVmXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaHJlZiA9IHIyLmdldEF0dHJpYnV0ZShcImhyZWZcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBY3Rpb24gbGluayBtdXN0IHN0YXJ0IHdpdGggXCJqYXZhc2NyaXB0OlwiLCBtdXN0IG5vdCBjb250YWluIGEgXCJ2b2lkXCIgYW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtdXN0IGhhdmUgYSBmdW5jdGlvbiBuYW1lIGZvbGxvd2luZyBcImphdmFzY3JpcHQ6XCIgKGkuZS4sIGhyZWYubGVuZ3RoID4gMTEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSAoaHJlZi5zdGFydHNXaXRoKFwiamF2YXNjcmlwdDpcIikgJiYgaHJlZi5pbmRleE9mKFwidm9pZFwiKSA9PSAtMSAmJiBocmVmLmxlbmd0aCA+IDExKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcjIgPSB4cGF0aFJlc3VsdDIuaXRlcmF0ZU5leHQoKSBhcyBFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFsbCB0aGUgcmVxdWlyZWQgY2hpbGRyZW4gKG9yIGFueSBkZXNjZW5kYW50cyBvZiB0aGUgcmVxdWlyZWQgY2hpbGRyZW4pIG11c3QgaGF2ZSBrZXlwcmVzcy9rZXlkb3duXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIG5vdCwgaXQgaXMgYSBmYWlsdXJlLCBubyBuZWVkIHRvIGtlZXAgY2hlY2tpbmcgYW55IG1vcmUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0geHBhdGhSZXN1bHQuaXRlcmF0ZU5leHQoKSBhcyBFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGN1cnJlbnQgZWxlbWVudCBmYWlsZWQgdGhlIGtleWRvd24va2V5cHJlc3MsIGFuZCBpdCBkb2VzIG5vdCBoYXZlIHJlcXVpcmVkIGNoaWxkcmVuLCBzdWNoIGFzIG1lbnViYXIuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExldCdzIGNoZWNrIGl0cyBkZXNjZW5kYW50cy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHhwMiA9IFwiZGVzY2VuZGFudDo6KlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgeHBhdGhSZXN1bHQyID0gZG9jLmV2YWx1YXRlKHhwMiwgcnVsZUNvbnRleHQsIENvbW1vblV0aWwuZGVmYXVsdE5TUmVzb2x2ZXIsIDAgLyogWFBhdGhSZXN1bHQuQU5ZX1RZUEUgKi8sIG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcjIgPSB4cGF0aFJlc3VsdDIuaXRlcmF0ZU5leHQoKSBhcyBFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocjIgJiYgIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9sbG93aW5nIGFyZSB0aGUgc3RlcHMgdGhhdCBhcmUgZXhlY3V0ZWQgYXQgdGhpcyBzdGFnZSB0byBkZXRlcm1pbmUgaWYgdGhlIG5vZGUgc2hvdWxkIGJlIGNsYXNzaWZpZWQgYXMgaGlkZGVuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvciBub3QuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgMS4gT25seSBydW4gaXNOb2RlVmlzaWJsZSBjaGVjayBpZiBoaWRkZW4gY29udGVudCBzaG91bGQgTk9UIGJlIGNoZWNrZWQuIEluIHRoZSBjYXNlIHRoYXQgaGlkZGVuIGNvbnRlbnQgaXMgdG8sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgYmUgc2Nhbm5lZCB0aGVuIHdlIGNhbiBqdXN0IHNjYW4gZXZlcnl0aGluZyBhcyBub3JtYWwuIEluIHRoZSBjYXNlIHRoYXQgdGhlIGN1cnJlbnQgbm9kZSBpcyBoaWRkZW4gd2UgZG8gbm90XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgYWRkIGl0IHRvIHRoZSByb2xlVG9FbGVtcyBoYXNoIGF0IGFsbCBvciBldmVuIGRvIGFueSBjaGVja2luZyBmb3IgaXQgYXQgYWxsLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGU6IFRoZSBpZiBjb25kaXRpb25zIHVzZXMgc2hvcnQtY2lyY3VpdGluZyBzbyBpZiB0aGUgZmlyc3QgY29uZGl0aW9uIGlzIG5vdCB0cnVlIGl0IHdpbGwgbm90IGNoZWNrIHRoZSBuZXh0IG9uZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgIHNvIG9uIGFuZCBzbyBmb3J0aC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDb21tb25VdGlsLnNob3VsZE5vZGVCZVNraXBwZWRIaWRkZW4ocjIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcjIgPSB4cGF0aFJlc3VsdDIuaXRlcmF0ZU5leHQoKSBhcyBFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBDb21tb25VdGlsLmlzVGFiYmFibGUocjIpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHIyLmhhc0F0dHJpYnV0ZShcIm9ua2V5ZG93blwiKSB8fCByMi5oYXNBdHRyaWJ1dGUoXCJvbmtleXByZXNzXCIpKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJcyB0aGlzIGFuIGFjdGlvbiBsaW5rP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyMi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09IFwiYVwiICYmIHIyLmhhc0F0dHJpYnV0ZShcImhyZWZcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhyZWYgPSByMi5nZXRBdHRyaWJ1dGUoXCJocmVmXCIpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFjdGlvbiBsaW5rIG11c3Qgc3RhcnQgd2l0aCBcImphdmFzY3JpcHQ6XCIsIG11c3Qgbm90IGNvbnRhaW4gYSBcInZvaWRcIiBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbXVzdCBoYXZlIGEgZnVuY3Rpb24gbmFtZSBmb2xsb3dpbmcgXCJqYXZhc2NyaXB0OlwiIChpLmUuLCBocmVmLmxlbmd0aCA+IDExKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSAoaHJlZi5zdGFydHNXaXRoKFwiamF2YXNjcmlwdDpcIikgJiYgaHJlZi5pbmRleE9mKFwidm9pZFwiKSA9PSAtMSAmJiBocmVmLmxlbmd0aCA+IDExKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByMiA9IHhwYXRoUmVzdWx0Mi5pdGVyYXRlTmV4dCgpIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEF0dHJpYnV0ZSAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JyBpcyBzcGVjaWZpZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgcm9sZU5hbWVBcnIucHVzaChyb2xlc1tqXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXBhc3NlZCAmJiBzYXZlZFBhc3NlZCkge1xuICAgICAgICAgICAgICAgIHNhdmVkUGFzc2VkID0gcGFzc2VkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJldFRva2VuMSA9IG5ldyBBcnJheSgpO1xuICAgICAgICByZXRUb2tlbjEucHVzaChydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgbGV0IHJldFRva2VuMiA9IG5ldyBBcnJheSgpO1xuICAgICAgICByZXRUb2tlbjIucHVzaChyb2xlTmFtZUFyci5qb2luKFwiLCBcIikpO1xuXG4gICAgICAgIC8vIERldGVybWluZSBpZiB0aGlzIGlzIHJlZmVyZW5jZWQgYnkgYSBjb21ib2JveC4gSWYgc28sIGxlYXZlIGl0IHRvIHRoZSBjb21ib2JveCBydWxlcyB0byBjaGVja1xuICAgICAgICBsZXQgaWQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJpZFwiKTtcbiAgICAgICAgaWYgKGlkICYmIGlkLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAqW2FyaWEtY29udHJvbHM9JyR7aWR9J11bcm9sZT0nY29tYm9ib3gnXWApKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNhdmVkUGFzc2VkID8gUnVsZVBhc3MoXCJwYXNzXCIpIDogUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF9ub19rZXlib2FyZF9hY2Nlc3NcIiwgW3JldFRva2VuMS50b1N0cmluZygpLCByZXRUb2tlbjIudG9TdHJpbmcoKV0pO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFSSUFNYXBwZXIgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBTWFwcGVyXCI7XG5pbXBvcnQgeyBET01VdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01VdGlsXCI7XG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgQWNjTmFtZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BY2NOYW1lVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX2xhbmRtYXJrX25hbWVfdW5pcXVlOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfbGFuZG1hcmtfbmFtZV91bmlxdWVcIixcbiAgICBjb250ZXh0OiBcImFyaWE6Y29tcGxlbWVudGFyeSwgYXJpYTpiYW5uZXIsIGFyaWE6Y29udGVudGluZm8sIGFyaWE6bWFpbiwgYXJpYTpuYXZpZ2F0aW9uLCBhcmlhOnJlZ2lvbiwgYXJpYTpzZWFyY2gsIGFyaWE6Zm9ybVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwibGFuZG1hcmtfbmFtZV91bmlxdWVcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMFwiOiBcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImFyaWFfbGFuZG1hcmtfbmFtZV91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIjogXCJhcmlhX2xhbmRtYXJrX25hbWVfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2xhbmRtYXJrX25hbWVfdW5pcXVlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIk11bHRpcGxlIGVsZW1lbnRzIHdpdGggXFxcInswfVxcXCIgbGFuZG1hcmtzIHdpdGhpbiB0aGUgc2FtZSBwYXJlbnQgcmVnaW9uIGFyZSBkaXN0aW5ndWlzaGVkIGJ5IHVuaXF1ZSAnYXJpYS1sYWJlbCcgb3IgJ2FyaWEtbGFiZWxsZWRieSdcIixcbiAgICAgICAgICAgIFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCI6IFwiTXVsdGlwbGUgZWxlbWVudHMgd2l0aCBcXFwiezB9XFxcIiBsYW5kbWFya3Mgd2l0aGluIHRoZSBzYW1lIHBhcmVudCByZWdpb24gYXJlIG5vdCBkaXN0aW5ndWlzaGVkIGZyb20gb25lIGFub3RoZXIgYmVjYXVzZSB0aGV5IGhhdmUgdGhlIHNhbWUgXFxcInsxfVxcXCIgbGFiZWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFYWNoIGxhbmRtYXJrIHNob3VsZCBoYXZlIGEgdW5pcXVlICdhcmlhLWxhYmVsbGVkYnknIG9yICdhcmlhLWxhYmVsJyBvciBiZSBuZXN0ZWQgaW4gYSBkaWZmZXJlbnQgcGFyZW50IHJlZ2lvblwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaWRcIjogW1wiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgLy8gVE9ETyBkbyBJIG5lZWQgdG8gZml0ZXIgb3V0IGJhZCBjb250ZW50aW5mbyBub2RlczogVGhlIGZvb3RlciBlbGVtZW50IGlzIG5vdCBhIGNvbnRlbnRpbmZvIGxhbmRtYXJrIHdoZW4gaXQgaXMgYSBkZXNjZW5kYW50IG9mIHRoZSBmb2xsb3dpbmcgSFRNTDUgc2VjdGlvbmluZyBlbGVtZW50czogaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTcvTk9URS13YWktYXJpYS1wcmFjdGljZXMtMS4xLTIwMTcxMjE0L2V4YW1wbGVzL2xhbmRtYXJrcy9IVE1MNS5odG1sXG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgLy8gQ2hlY2tpbmcgaWYgdGhpcyBsYW5kbWFyayBpcyBpbnNpZGUgYSBkaWFsb2cgZWxlbWVudC4gSWYgaXQgaXMgd2UgYXJlIGdvaW5nIHRvIHNraXAgY2hlY2tpbmcgaXQuIFxuICAgICAgICAvKip2YXIgY29weU9mUnVsZUNvbnRleHQgPSBydWxlQ29udGV4dDtcbiAgICAgICAgdmFyIHBhcm5ldE5vZGVzT2ZSdWxlQ29udGV4dCA9IFtdO1xuICAgICAgICB3aGlsZSAoY29weU9mUnVsZUNvbnRleHQpIHtcbiAgICAgICAgICAgIHBhcm5ldE5vZGVzT2ZSdWxlQ29udGV4dC51bnNoaWZ0KGNvcHlPZlJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgIGNvcHlPZlJ1bGVDb250ZXh0ID0gY29weU9mUnVsZUNvbnRleHQucGFyZW50RWxlbWVudDtcbiAgICAgICAgfVxuICAgICAgICBwYXJuZXROb2Rlc09mUnVsZUNvbnRleHQuZm9yRWFjaChlbGVtID0+IHtcbiAgICAgICAgICAgIGlmIChlbGVtICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW0udGFnTmFtZSA9PSBcIkRJQUxPR1wiIHx8IGVsZW0uZ2V0QXR0cmlidXRlKCdyb2xlJykgPT0gXCJkaWFsb2dcIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbCAvLyBTa2lwcGluZyBjaGVja2luZyBsYW5kbWFya3MgdGhhdCBoYXBwZW4gdG8gYmUgaW5zaWRlIGRpYWxvZyBlbGVtZW50c1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgKi9cbiAgICAgICAgaWYgKENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFtcIkRJQUxPR1wiXSkgIT09IG51bGwgfHwgQXJpYVV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShydWxlQ29udGV4dCwgXCJkaWFsb2dcIiwgdHJ1ZSkgIT09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICAvLyBCZWdpbmluZyBmb3JtQ2FjaGUgd29ya1xuICAgICAgICBsZXQgb3duZXJEb2N1bWVudCA9IEZyYWdtZW50VXRpbC5nZXRPd25lckZyYWdtZW50KHJ1bGVDb250ZXh0KTtcbiAgICAgICAgbGV0IGZvcm1DYWNoZSA6IHtcbiAgICAgICAgICAgIG5hdmlnYXRpb25Ob2RlczogYW55W10sXG4gICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNDb21wdXRlZExhYmVsczogc3RyaW5nW10sXG4gICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNQYXJlbnRzOiBhbnlbXSxcbiAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc01hdGNoRm91bmQ6IHN0cmluZ1tdXG4gICAgICAgIH0gPSBDYWNoZVV0aWwuZ2V0Q2FjaGUoXG4gICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgXCJhcmlhX2xhbmRtYXJrX25hbWVfdW5pcXVlXCIsXG4gICAgICAgICAgICBudWxsXG4gICAgICAgICk7XG4gICAgICAgIGlmICghZm9ybUNhY2hlKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIi0tLS0tLS0tLUVOVEVSSU5HIEZPUk0gQ0FDSEVcIilcbiAgICAgICAgICAgIGZvcm1DYWNoZSA9IHtcbiAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXM6IFtdLFxuICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc0NvbXB1dGVkTGFiZWxzOiBbXSxcbiAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNQYXJlbnRzOiBbXSxcbiAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNNYXRjaEZvdW5kOiBbXVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGxldCBuYXZpZ2F0aW9uTm9kZXNUZW1wID0gb3duZXJEb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFxuICAgICAgICAgICAgICAgICdhc2lkZSxbcm9sZT1cImNvbXBsZW1lbnRhcnlcIl0sIGZvb3Rlcixbcm9sZT1cImNvbnRlbnRpbmZvXCJdLCBoZWFkZXIsW3JvbGU9XCJiYW5uZXJcIl0sIG1haW4sW3JvbGU9XCJtYWluXCJdLCBuYXYsW3JvbGU9XCJuYXZpZ2F0aW9uXCJdLCBmb3JtLFtyb2xlPVwiZm9ybVwiXSwgc2VjdGlvbixbcm9sZT1cInJlZ2lvblwiXSxbcm9sZT1cInNlYXJjaFwiXSdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBsZXQgbmF2aWdhdGlvbk5vZGVzID0gQXJyYXkuZnJvbShuYXZpZ2F0aW9uTm9kZXNUZW1wKTtcbiAgICAgICAgICAgIGxldCBuYXZpZ2F0aW9uTm9kZXNQYXJlbnRzID0gW107XG4gICAgICAgICAgICBsZXQgbmF2aWdhdGlvbk5vZGVzTWF0Y2hGb3VuZCA6IHN0cmluZ1tdID0gW107XG5cbiAgICAgICAgICAgIC8vIFRoaXMgYmxvY2sgb2YgY29kZSBmaWx0ZXJzIG91dCBhbnkgbmF2IGVsZW1lbnRzIHRoYXQgYXJlIHVuZGVyIGEgZGlhbG9nLiBBcyB0aG9zZSBhcmUgbm90IG9uZXMgd2Ugd2FudCB0byB0ZXN0IGFnYWluc3QgYXMgd2UgY29uc2lkZXIgZGlhbG9ncyBhcmUgc2VwYXJhdGUgbG9jYXRpb25zIGZyb20gdGhlIHJlc3Qgb2YgdGhlIG1haW4gcGFnZS5cbiAgICAgICAgICAgIGxldCBuYXZpZ2F0aW9uTm9kZXNXaXRob3V0RGlhbG9ncyA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYXZpZ2F0aW9uTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAvKipsZXQgYSA9IG5hdmlnYXRpb25Ob2Rlc1tpXTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBsZXQgZGlhbG9nTm9kZUZvdW5kRmxhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHdoaWxlIChhKSB7XG4gICAgICAgICAgICAgICAgICAgIGEgPSBhLnBhcmVudEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYS50YWdOYW1lID09IFwiRElBTE9HXCIgfHwgYS5nZXRBdHRyaWJ1dGUoJ3JvbGUnKSA9PSBcImRpYWxvZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlhbG9nTm9kZUZvdW5kRmxhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFkaWFsb2dOb2RlRm91bmRGbGFnKSB7XG4gICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc1dpdGhvdXREaWFsb2dzLnB1c2gobmF2aWdhdGlvbk5vZGVzW2ldKVxuICAgICAgICAgICAgICAgIH0qL1xuXG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIG5vZGUgdGhhdCBpcyBBVCBoaWRkZW4gb3IgaW4gYSBkaWFsb2dcbiAgICAgICAgICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQobmF2aWdhdGlvbk5vZGVzW2ldKSB8fCBDb21tb25VdGlsLmdldEFuY2VzdG9yKG5hdmlnYXRpb25Ob2Rlc1tpXSwgW1wiRElBTE9HXCJdKSAhPT0gbnVsbCB8fCBBcmlhVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKG5hdmlnYXRpb25Ob2Rlc1tpXSwgXCJkaWFsb2dcIiwgdHJ1ZSkgIT09IG51bGwpIFxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNXaXRob3V0RGlhbG9ncy5wdXNoKG5hdmlnYXRpb25Ob2Rlc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzID0gbmF2aWdhdGlvbk5vZGVzV2l0aG91dERpYWxvZ3M7XG5cblxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYXZpZ2F0aW9uTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAvLyBMb29wIG92ZXIgYWxsIHRoZSBsYW5kbWFyayBub2Rlc1xuICAgICAgICAgICAgICAgIGxldCBlbHMgPSBbXTtcbiAgICAgICAgICAgICAgICBsZXQgYSA9IG5hdmlnYXRpb25Ob2Rlc1tpXS5wYXJlbnRFbGVtZW50O1xuICAgICAgICAgICAgICAgIHdoaWxlIChhKSB7XG4gICAgICAgICAgICAgICAgICAgIGVscy5wdXNoKGEpO1xuICAgICAgICAgICAgICAgICAgICBhID0gYS5wYXJlbnRFbGVtZW50O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgZWxzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIExvb3Agb3ZlciBhbGwgdGhlIHBhcmVudHMgb2YgdGhlIGxhbmRtYXJrIG5vZGVzXG4gICAgICAgICAgICAgICAgICAgIC8vIEZpbmQgbmVhcmVzdCBsYW5kbWFyayBwYXJlbnQgYmFzZWQgb24gdGhlIHRhZ05hbWUgb3IgdGhlIHJvbGUgYXR0cmlidXRlXG4gICAgICAgICAgICAgICAgICAgIGxldCB0YWdOYW1lVHJpZ2dlciA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiQVNJREVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiRk9PVEVSXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIkZPUk1cIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiSEVBREVSXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIk1BSU5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiTkFWXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlNFQ1RJT05cIixcbiAgICAgICAgICAgICAgICAgICAgXS5pbmNsdWRlcyhlbHNbal0udGFnTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCByb2xlTmFtZVRyaWdnZXIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsc1tqXS5oYXNBdHRyaWJ1dGUoXCJyb2xlXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByb2xlTmFtZVRyaWdnZXIgPSBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJjb21wbGVtZW50YXJ5XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJjb250ZW50aW5mb1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZm9ybVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYmFubmVyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJtYWluXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYXZpZ2F0aW9uXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJyZWdpb25cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInNlYXJjaFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXS5pbmNsdWRlcyhlbHNbal0uZ2V0QXR0cmlidXRlKFwicm9sZVwiKSk7IC8vIFRPRE8gd2UgYXJlIG5vdCBjb3ZlcmluZyB0aGUgY2FzZSB3aGVyZSBhIGVsZW1lbmVudCB3aXRoIG11bHRpcGxlIHJvbGVzLiBlLmcuLCByb2xlID0gXCJmb3JtIGJhbm5lclwiLiBUaGlzIGlzIGEgaW1wcm92bWVudCB3ZSBtaWdodCB3YW50IHRvIGFkZCBpbiB0aGUgZnV0dXJlLlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWdOYW1lVHJpZ2dlciB8fCByb2xlTmFtZVRyaWdnZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5lYXJlc3QgcGFyZW50LWxhbmRtYXJrIGZvdW5kXG4gICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNQYXJlbnRzLnB1c2goZWxzW2pdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChqID09PSBlbHMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBub2RlIGlzIGF0IHRoZSBoZWFkIG9mIHRoZSBmaWxlIHNvIGl0IGRvZXMgbm90IGhhdmUgYSBwYXJlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc1BhcmVudHMucHVzaChudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgbmF2aWdhdGlvbk5vZGVzQ29tcHV0ZWRMYWJlbHMgPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmF2aWdhdGlvbk5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZShuYXZpZ2F0aW9uTm9kZXNbaV0pO1xuICAgICAgICAgICAgICAgIC8vIExvb3Agb3ZlciBhbGwgdGhlIGxhbmRtYXJrIG5vZGVzXG4gICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzQ29tcHV0ZWRMYWJlbHMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgLyoqQVJJQU1hcHBlci5jb21wdXRlTmFtZShuYXZpZ2F0aW9uTm9kZXNbaV0pKi9cbiAgICAgICAgICAgICAgICAgICAgcGFpciAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwID8gcGFpci5uYW1lLnRyaW0oKSA6IFwiXCJcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYXZpZ2F0aW9uTm9kZXNQYXJlbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgLy8gTG9vcCBvdmVyIGFsbCB0aGUgcGFyZW50cyBvZiB0aGUgbGFuZG1hcmsgbm9kZXMgdG8gZmluZCBkdXBsaWNhdGVzXG4gICAgICAgICAgICAgICAgbGV0IG1hdGNoRm91bmQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBsZXQgcGFzc18wX2ZsYWcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG5hdmlnYXRpb25Ob2Rlc1BhcmVudHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGogPT09IGkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGRvIG5vdCB3YW50IHRvIGNvbXBhcmUgYWdhaW5zdCBvdXJzZWxmc1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlmIHN0YXRlbWVudCBmb2N1cyBvbiB0aGUgY2FzZSB3aGVyZSB0aGUgcGFyZW50IGxhbmRtYXJrIGlzIG51bGxcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzUGFyZW50c1tpXSA9PT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzUGFyZW50c1tqXSA9PT0gbnVsbFxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBsb29raW5nIGF0IHR3byByb290IG5vZGVzLCBzbyB3ZSBzaG91bGQgY29tcGFyZSB0aGVtLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSSUFNYXBwZXIubm9kZVRvUm9sZShuYXZpZ2F0aW9uTm9kZXNbaV0pID09PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSSUFNYXBwZXIubm9kZVRvUm9sZShuYXZpZ2F0aW9uTm9kZXNbal0pXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCb3RoIG5vZGVzIGhhdmUgdGhlIHNhbWUgcm9sZSBBTkRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc0NvbXB1dGVkTGFiZWxzW2ldID09PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNDb21wdXRlZExhYmVsc1tqXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBib3RoIGhhdmUgdGhlIHNhbWUgKGNvbXB1dGVkKSBhcmlhLWxhYmVsL2FyaWEtbGFiZWxsZWRieVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiAobmF2aWdhdGlvbk5vZGVzQ29tcHV0ZWRMYWJlbHNbaV0gPT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzTWF0Y2hGb3VuZC5wdXNoKFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCIpOyAvLyBGYWlsIDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hGb3VuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSBwYXJlbnRzICYmIHNhbWUgbm9kZSByb2xlcyBCVVQgZGlmZmVyZW50IGNvbXB1dGVkIGFyaWEtbGFiZWwvYXJpYS1sYWJlbGxlZGJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgYXQgbGVhc3QgYSBQYXNzXzAuIEJ1dCB3ZSBuZWVkIHRvIGNoZWNrIGFsbCBub2RlcyB0byBzZWUgaWYgYW5vdGhlciBvbmUgZmFpbHMuIFNvIHNldCBhIGZsYWcuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NfMF9mbGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhbWUgcGFyZW50cyBidXQgZGlmZmVyZW50IG5vZGUgcm9sZXMgLy8gTm90IGFwcGxpY2FibGVcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc1BhcmVudHNbaV0gPT09IG51bGwgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc1BhcmVudHNbal0gPT09IG51bGxcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBhcmUgbG9va2luZyBhdCBhIHNpbmdsZSByb290IG5vZGVcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpZiBzdGF0ZW1lbnQgZm9jdXMgb24gdGhlIGNhc2Ugd2hlcmUgdGhlIHBhcmVudCBsYW5kbWFyayBpcyBOT1QgbnVsbFxuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBET01VdGlsLnNhbWVOb2RlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc1BhcmVudHNbaV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzUGFyZW50c1tqXVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgdGhlIHNhbWUgcGFyZW50LWxhbmRtYXJrIEFORFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSSUFNYXBwZXIubm9kZVRvUm9sZShuYXZpZ2F0aW9uTm9kZXNbaV0pID09PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSSUFNYXBwZXIubm9kZVRvUm9sZShuYXZpZ2F0aW9uTm9kZXNbal0pXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCb3RoIG5vZGVzIGhhdmUgdGhlIHNhbWUgcm9sZSBBTkRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc0NvbXB1dGVkTGFiZWxzW2ldID09PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNDb21wdXRlZExhYmVsc1tqXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBib3RoIGhhdmUgdGhlIHNhbWUgKGNvbXB1dGVkKSBhcmlhLWxhYmVsL2FyaWEtbGFiZWxsZWRieVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiAobmF2aWdhdGlvbk5vZGVzQ29tcHV0ZWRMYWJlbHNbaV0gPT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzTWF0Y2hGb3VuZC5wdXNoKFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCIpOyAvLyBGYWlsIDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hGb3VuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSBwYXJlbnRzICYmIHNhbWUgbm9kZSByb2xlcyBCVVQgZGlmZmVyZW50IGNvbXB1dGVkIGFyaWEtbGFiZWwvYXJpYS1sYWJlbGxlZGJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgYXQgbGVhc3QgYSBQYXNzXzAuIEJ1dCB3ZSBuZWVkIHRvIGNoZWNrIGFsbCBub2RlcyB0byBzZWUgaWYgYW5vdGhlciBvbmUgZmFpbHMuIFNvIHNldCBhIGZsYWcuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NfMF9mbGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhbWUgcGFyZW50cyBidXQgZGlmZmVyZW50IG5vZGUgcm9sZXMgLy8gTm90IGFwcGxpY2FibGVcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIERpZmZlcmVudCBwYXJlbnRzIC8vIE5vdCBhcHBsaWNhYmxlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFtYXRjaEZvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXNzXzBfZmxhZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzTWF0Y2hGb3VuZC5wdXNoKFwicGFzc1wiKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc01hdGNoRm91bmQucHVzaChcIm51bGxcIik7IC8vIFRoaXMgaXMgbm90IHRoZSBrZXl3b3JkIG51bGwgb24gcHVycG9zZS4gSXQgaXMgYSBzcGFjZWhvbGRlciBpbiB0aGUgYXJyYXkgc28gaW5kZXhlcyBtYXRjaCB1cC5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvcm1DYWNoZS5uYXZpZ2F0aW9uTm9kZXNDb21wdXRlZExhYmVscyA9XG4gICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzQ29tcHV0ZWRMYWJlbHM7XG4gICAgICAgICAgICBmb3JtQ2FjaGUubmF2aWdhdGlvbk5vZGVzID0gbmF2aWdhdGlvbk5vZGVzO1xuICAgICAgICAgICAgZm9ybUNhY2hlLm5hdmlnYXRpb25Ob2Rlc1BhcmVudHMgPSBuYXZpZ2F0aW9uTm9kZXNQYXJlbnRzO1xuICAgICAgICAgICAgZm9ybUNhY2hlLm5hdmlnYXRpb25Ob2Rlc01hdGNoRm91bmQgPSBuYXZpZ2F0aW9uTm9kZXNNYXRjaEZvdW5kO1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKFxuICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICAgICAgXCJhcmlhX2xhbmRtYXJrX25hbWVfdW5pcXVlXCIsXG4gICAgICAgICAgICAgICAgZm9ybUNhY2hlXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyBUT0RPIEFkZCB2YWxpZGF0aW9uIHRoYXQgYWxsIDMgYXJyYXlzIGFyZSB0aGUgc2FtZSBsZW5ndGhcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiLS0tLS0tLS0tLS0tLUVuZCBmb3JtQ2FjaGVcIilcbiAgICAgICAgfSAvLyBFbmQgZm9ybUNhY2hlXG5cbiAgICAgICAgbGV0IGluZGV4VG9DaGVjayA9IC0xO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZvcm1DYWNoZS5uYXZpZ2F0aW9uTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5pc1NhbWVOb2RlKGZvcm1DYWNoZS5uYXZpZ2F0aW9uTm9kZXNbaV0pKSB7XG4gICAgICAgICAgICAgICAgaW5kZXhUb0NoZWNrID0gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5kZXhUb0NoZWNrID09PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZvcm1DYWNoZS5uYXZpZ2F0aW9uTm9kZXNNYXRjaEZvdW5kW2luZGV4VG9DaGVja10gPT09IFwicGFzc1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIsXG4gICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICBBUklBTWFwcGVyLm5vZGVUb1JvbGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ2FjaGUubmF2aWdhdGlvbk5vZGVzW2luZGV4VG9DaGVja11cbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKGZvcm1DYWNoZS5uYXZpZ2F0aW9uTm9kZXNNYXRjaEZvdW5kW2luZGV4VG9DaGVja10gPT09IFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwiLFxuICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgQVJJQU1hcHBlci5ub2RlVG9Sb2xlKFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNhY2hlLm5hdmlnYXRpb25Ob2Rlc1tpbmRleFRvQ2hlY2tdXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIGZvcm1DYWNoZS5uYXZpZ2F0aW9uTm9kZXNDb21wdXRlZExhYmVsc1tpbmRleFRvQ2hlY2tdLFxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9tYWluX2xhYmVsX3VuaXF1ZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX21haW5fbGFiZWxfdW5pcXVlXCIsXG4gICAgY29udGV4dDogXCJhcmlhOm1haW5cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX011bHRpcGxlTWFpbnNSZXF1aXJlTGFiZWxfSW1wbGljaXRfMlwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfbWFpbl9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX21haW5fbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX21haW5fbGFiZWxfdW5pcXVlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiTXVsdGlwbGUgZWxlbWVudHMgd2l0aCBcXFwibWFpblxcXCIgcm9sZSBkbyBub3QgaGF2ZSB1bmlxdWUgbGFiZWxzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWFjaCBlbGVtZW50IHdpdGggXFxcIm1haW5cXFwiIHJvbGUgbXVzdCBoYXZlIHVuaXF1ZSBsYWJlbCB0aGF0IGRlc2NyaWJlcyBpdHMgcHVycG9zZXNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgbGV0IGNvbnRleHRMYWJlbCA9IEFyaWFVdGlsLmdldEFyaWFMYWJlbChydWxlQ29udGV4dCk7XG5cbiAgICAgICAgbGV0IHBhcmVudERvY1JvbGUgPSBBcmlhVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKFxuICAgICAgICAgICAgcnVsZUNvbnRleHQsXG4gICAgICAgICAgICBcImRvY3VtZW50XCIsXG4gICAgICAgICAgICB0cnVlXG4gICAgICAgICk7XG4gICAgICAgIGxldCBtYWlucyA9IENvbW1vblV0aWwuZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW4oXG4gICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgXCJtYWluXCIsXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgdHJ1ZVxuICAgICAgICApO1xuICAgICAgICBsZXQgcmVzdWx0ID0gbnVsbDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYWlucy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgaWYgKG1haW5zW2ldID09PSBydWxlQ29udGV4dCkgY29udGludWU7XG4gICAgICAgICAgICByZXN1bHQgPSBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgICAgIGxldCB0aGlzUGFyZW50RG9jUm9sZSA9IEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUoXG4gICAgICAgICAgICAgICAgbWFpbnNbaV0sXG4gICAgICAgICAgICAgICAgXCJkb2N1bWVudFwiLFxuICAgICAgICAgICAgICAgIHRydWVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAodGhpc1BhcmVudERvY1JvbGUgPT09IHBhcmVudERvY1JvbGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoQXJpYVV0aWwuZ2V0QXJpYUxhYmVsKG1haW5zW2ldKSA9PT0gY29udGV4dExhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfbWFpbl9sYWJlbF92aXNpYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfbWFpbl9sYWJlbF92aXNpYmxlXCIsXG4gICAgY29udGV4dDogXCJkb206Ym9keVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfTXVsdGlwbGVNYWluc1Zpc2libGVMYWJlbF9JbXBsaWNpdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfbWFpbl9sYWJlbF92aXNpYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV9tYWluX2xhYmVsX3Zpc2libGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfbWFpbl9sYWJlbF92aXNpYmxlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiTXVsdGlwbGUgZWxlbWVudHMgd2l0aCBcXFwibWFpblxcXCIgcm9sZSBkbyBub3QgaGF2ZSB1bmlxdWUgdmlzaWJsZSBsYWJlbHNcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFYWNoIGVsZW1lbnQgd2l0aCBcXFwibWFpblxcXCIgcm9sZSBzaG91bGQgaGF2ZSBhIHVuaXF1ZSB2aXNpYmxlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gQ29uc2lkZXIgdGhlIENoZWNrIEhpZGRlbiBDb250ZW50IHNldHRpbmcgdGhhdCBpcyBzZXQgYnkgdGhlIHJ1bGVzXG4gICAgICAgIC8vY2FsbCBnZXRFbGVtZW50c0J5Um9sZUhpZGRlbiB3aXRoIGNvbnNpZGVySW1wbGljaXQgZmxhZyBhcyB0cnVlXG4gICAgICAgIC8vc28gdGhhdCB0aGUgbWV0aG9kIHJldHVycyA8bWFpbj4gZWxlbWVudHNcbiAgICAgICAgbGV0IGxhbmRtYXJrcyA9IENvbW1vblV0aWwuZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW4oXG4gICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgXCJtYWluXCIsXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgdHJ1ZVxuICAgICAgICApO1xuICAgICAgICBpZiAobGFuZG1hcmtzLmxlbmd0aCA9PT0gMCB8fCBsYW5kbWFya3MubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwYXNzZWQgPSBBcmlhVXRpbC5oYXNVbmlxdWVBcmlhTGFiZWxsZWRieShsYW5kbWFya3MpO1xuXG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9uYXZpZ2F0aW9uX2xhYmVsX3VuaXF1ZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX25hdmlnYXRpb25fbGFiZWxfdW5pcXVlXCIsXG4gICAgY29udGV4dDogXCJhcmlhOm5hdmlnYXRpb25cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX011bHRpcGxlTmF2aWdhdGlvbkxhbmRtYXJrc19JbXBsaWNpdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiYXJpYV9uYXZpZ2F0aW9uX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwiOiBcImFyaWFfbmF2aWdhdGlvbl9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfbmF2aWdhdGlvbl9sYWJlbF91bmlxdWUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiVGhlIGVsZW1lbnQgd2l0aCBcXFwibmF2aWdhdGlvblxcXCIgcm9sZSBoYXMgYSB1bmlxdWUgbGFiZWwgdGhhdCBkZXNjcmliZXMgaXRzIHB1cnBvc2VcIixcbiAgICAgICAgICAgIFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCI6IFwiTXVsdGlwbGUgZWxlbWVudHMgd2l0aCBcXFwibmF2aWdhdGlvblxcXCIgcm9sZSBkbyBub3QgaGF2ZSB1bmlxdWUgbGFiZWxzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWFjaCBlbGVtZW50IHdpdGggXFxcIm5hdmlnYXRpb25cXFwiIHJvbGUgbXVzdCBoYXZlIGEgdW5pcXVlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IGR1cHBlZCA9IEFyaWFVdGlsLmlzTGFuZG1hcmtOYW1lVW5pcXVlKHJ1bGVDb250ZXh0LCBcIm5hdmlnYXRpb25cIiwgdHJ1ZSk7ICAgIFxuICAgICAgICBpZiAoZHVwcGVkID09IG51bGwpIHJldHVybiBudWxsOyBcbiAgICAgICAgaWYgKGR1cHBlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgfSAgICBcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBUklBRGVmaW5pdGlvbnMgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBRGVmaW5pdGlvbnNcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9wYXJlbnRfcmVxdWlyZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9wYXJlbnRfcmVxdWlyZWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqW3JvbGVdXCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJhcmlhX3JvbGVfYWxsb3dlZFwiXSxcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX1JlcXVpcmVkUGFyZW50X05hdGl2ZV9Ib3N0X1NlbWF0aWNzXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9wYXJlbnRfcmVxdWlyZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX3BhcmVudF9yZXF1aXJlZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfcGFyZW50X3JlcXVpcmVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFYWNoIGVsZW1lbnQgd2l0aCBhbiBpbXBsaWNpdCBvciBleHBsaWNpdCByb2xlIG11c3QgYmUgY29udGFpbmVkIHdpdGhpbiBhIHZhbGlkIGVsZW1lbnRcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRWxlbWVudCB3aXRoIFxcXCJ7MH1cXFwiIHJvbGUgaXMgbm90IGNvbnRhaW5lZCBpbiBvciBvd25lZCBieSBhbiBlbGVtZW50IHdpdGggb25lIG9mIHRoZSBmb2xsb3dpbmcgcm9sZXM6IFxcXCJ7MX1cXFwiXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgLy8gVE9ETzogQUNUOiBDaGVjayBGYWlsIDNcbiAgICBhY3Q6IFwiZmY4OWM5XCIsXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIFxuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IGlzIGhpZGRlbiBvciBkaXNhYmxlZFxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpIHx8IENvbW1vblV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBcbiAgICAgICAgLy9za2lwIHRoZSBjaGVjayBpZiB0aGUgZWxlbWVudCBzaG91bGQgYmUgYSBwcmVzZW50YXRpb25hbCBjaGlsZCBvZiBhbiBlbGVtZW50XG4gICAgICAgIGlmIChBcmlhVXRpbC5zaG91bGRCZVByZXNlbnRhdGlvbmFsQ2hpbGQocnVsZUNvbnRleHQpIHx8IFZpc1V0aWwuaXNOb2RlUHJlc2VudGF0aW9uYWwocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGxldCBkZXNpZ25QYXR0ZXJucyA9IEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJucztcbiAgICAgICAgbGV0IHJvbGVOYW1lQXJyID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCBjb250YWluZXJSb2xlcyA9IG5ldyBBcnJheSgpO1xuICAgICAgICBsZXQgdGVzdGVkQ29udGFpbmVyID0gMDtcblxuICAgICAgICBsZXQgYW5jZXN0b3JSb2xlcyA9IGNvbnRleHRIaWVyYXJjaGllc1tcImFyaWFcIl0ubWFwKGluZm8gPT4gaW5mby5yb2xlKTtcbiAgICAgICAgbGV0IHBhcmVudFJvbGUgPSBhbmNlc3RvclJvbGVzW2FuY2VzdG9yUm9sZXMubGVuZ3RoIC0gMl07XG4gICAgICAgIGxldCBjb3VudCA9IDI7XG4gICAgICAgIHdoaWxlIChwYXJlbnRSb2xlID09PSAnbm9uZScpIHtcbiAgICAgICAgICAgIGNvdW50Kys7XG4gICAgICAgICAgICBwYXJlbnRSb2xlID0gYW5jZXN0b3JSb2xlc1thbmNlc3RvclJvbGVzLmxlbmd0aCAtIGNvdW50XTtcblxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvKipmb3IgKGxldCBqID0gMCwgbGVuZ3RoID0gcm9sZXMubGVuZ3RoOyBqIDwgbGVuZ3RoOyArK2opIHtcbiAgICAgICAgICAgIGlmIChkZXNpZ25QYXR0ZXJuc1tyb2xlc1tqXV0gJiYgZGVzaWduUGF0dGVybnNbcm9sZXNbal1dLmNvbnRhaW5lciAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGVzdGVkQ29udGFpbmVyKys7XG4gICAgICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgY29udGFpbmVyUm9sZXMgPSBkZXNpZ25QYXR0ZXJuc1tyb2xlc1tqXV0uY29udGFpbmVyO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBjb250YWluZXJzTGVuZ3RoID0gY29udGFpbmVyUm9sZXMubGVuZ3RoOyAhcGFzc2VkICYmIGkgPCBjb250YWluZXJzTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gcGFyZW50Um9sZSA9PT0gY29udGFpbmVyUm9sZXNbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXNzZWQpIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocGFzc2VkID09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJvbGVOYW1lQXJyLnB1c2gocm9sZXNbal0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBcbiAgICAgICAgKi9cbiAgICAgICAgY29uc3Qgcm9sZSA9IEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZShydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChkZXNpZ25QYXR0ZXJuc1tyb2xlXSAmJiBkZXNpZ25QYXR0ZXJuc1tyb2xlXS5jb250YWluZXIgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGVzdGVkQ29udGFpbmVyKys7XG4gICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGNvbnRhaW5lclJvbGVzID0gZGVzaWduUGF0dGVybnNbcm9sZV0uY29udGFpbmVyO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGNvbnRhaW5lcnNMZW5ndGggPSBjb250YWluZXJSb2xlcy5sZW5ndGg7ICFwYXNzZWQgJiYgaSA8IGNvbnRhaW5lcnNMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9IHBhcmVudFJvbGUgPT09IGNvbnRhaW5lclJvbGVzW2ldO1xuICAgICAgICAgICAgICAgIGlmIChwYXNzZWQpIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBhc3NlZCA9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHJvbGVOYW1lQXJyLnB1c2gocm9sZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmV0VG9rZW4xID0gbmV3IEFycmF5KCk7XG4gICAgICAgIHJldFRva2VuMS5wdXNoKHJvbGVOYW1lQXJyLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgIGxldCByZXRUb2tlbjIgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgcmV0VG9rZW4yLnB1c2goY29udGFpbmVyUm9sZXMuam9pbihcIiwgXCIpKTtcbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBbcnVsZUNvbnRleHRdLCAnJywgJycsIHBhc3NlZCA9PSB0cnVlID8gW10gOiBbcmV0VG9rZW4xLCByZXRUb2tlbjJdKTtcbiAgICAgICAgaWYgKHRlc3RlZENvbnRhaW5lciA9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSBlbHNlIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW3JldFRva2VuMS50b1N0cmluZygpLCByZXRUb2tlbjIudG9TdHJpbmcoKV0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfcmVnaW9uX2xhYmVsX3VuaXF1ZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX3JlZ2lvbl9sYWJlbF91bmlxdWVcIixcbiAgICBjb250ZXh0OiBcImFyaWE6cmVnaW9uXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9NdWx0aXBsZVJlZ2lvbnNVbmlxdWVMYWJlbF9JbXBsaWNpdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiYXJpYV9yZWdpb25fbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCI6IFwiYXJpYV9yZWdpb25fbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX3JlZ2lvbl9sYWJlbF91bmlxdWUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiVGhlIGVsZW1lbnQgd2l0aCBcXFwicmVnaW9uXFxcIiByb2xlIGhhcyBhIHVuaXF1ZSBsYWJlbCB0aGF0IGRlc2NyaWJlcyBpdHMgcHVycG9zZVwiLFxuICAgICAgICAgICAgXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIjogXCJNdWx0aXBsZSBlbGVtZW50cyB3aXRoIFxcXCJyZWdpb25cXFwiIHJvbGUgZG8gbm90IGhhdmUgdW5pcXVlIGxhYmVsc1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVhY2ggZWxlbWVudCB3aXRoIFxcXCJyZWdpb25cXFwiIHJvbGUgbXVzdCBoYXZlIGEgdW5pcXVlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgZHVwcGVkID0gQXJpYVV0aWwuaXNMYW5kbWFya05hbWVVbmlxdWUocnVsZUNvbnRleHQsIFwicmVnaW9uXCIpOyAgICBcbiAgICAgICAgaWYgKGR1cHBlZCA9PSBudWxsKSByZXR1cm4gbnVsbDsgXG4gICAgICAgIGlmIChkdXBwZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfcmVnaW9uX2xhYmVsbGVkOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfcmVnaW9uX2xhYmVsbGVkXCIsXG4gICAgY29udGV4dDogXCJhcmlhOnJlZ2lvblwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfUmVnaW9uTGFiZWxfSW1wbGljaXRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJcbiAgICAgICAgICAgIC8vIFwiRmFpbF8yXCI6IFwiRmFpbF8yXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9yZWdpb25fbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX3JlZ2lvbl9sYWJlbGxlZC5odG1sXCIsXG4gICAgICAgICAgICAvLyBcIkZhaWxfMlwiOiBcImFyaWFfcmVnaW9uX2xhYmVsbGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX3JlZ2lvbl9sYWJlbGxlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkVsZW1lbnQgd2l0aCBcXFwicmVnaW9uXFxcIiByb2xlIGRvZXMgbm90IGhhdmUgYSBsYWJlbFwiLFxuICAgICAgICAgICAgLy8gXCJGYWlsXzJcIjogXCJFbGVtZW50IHdpdGggXFxcInJlZ2lvblxcXCIgcm9sZSBpcyBub3QgbGFiZWxlZCB3aXRoICdhcmlhLWxhYmVsJyBvciAnYXJpYS1sYWJlbGxlZGJ5J1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVhY2ggZWxlbWVudCB3aXRoIFxcXCJyZWdpb25cXFwiIHJvbGUgbXVzdCBoYXZlIGEgbGFiZWwgdGhhdCBkZXNjcmliZXMgaXRzIHB1cnBvc2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICBsZXQgcGFzc2VkID0gQXJpYVV0aWwuaGFzQXJpYUxhYmVsKHJ1bGVDb250ZXh0KSB8fCBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInRpdGxlXCIpO1xuICAgICAgICBpZiAocGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX3JvbGVfYWxsb3dlZDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX3JvbGVfYWxsb3dlZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbcm9sZV1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX1ZhbGlkUm9sZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJGYWlsXzJcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IGBhcmlhX3JvbGVfYWxsb3dlZC5odG1sYCxcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IGBhcmlhX3JvbGVfYWxsb3dlZC5odG1sYCxcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IGBhcmlhX3JvbGVfYWxsb3dlZC5odG1sYCxcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogYGFyaWFfcm9sZV9hbGxvd2VkLmh0bWxgXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVsZW1lbnRzIG11c3QgaGF2ZSBhIHZhbGlkICdyb2xlJyBwZXIgQVJJQSBzcGVjaWZpY2F0aW9uXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIlRoZSByb2xlICd7MH0nIGRlZmluZWQgb24gdGhlIGVsZW1lbnQgaXMgbm90IHZhbGlkIHBlciBBUklBIHNwZWNpZmljYXRpb25cIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJTb21lIG9mIHRoZSByb2xlcywgJ3swfScsIGRlZmluZWQgb24gdGhlIGVsZW1lbnQgYXJlIG5vdCB2YWxpZCBwZXIgQVJJQSBzcGVjaWZpY2F0aW9uXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbIFwiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBudW06IFwiNC4xLjJcIiwgLy8gbnVtOiBbIFwiMi40LjRcIiwgXCJ4LnkuelwiIF0gYWxzbyBhbGxvd2VkXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICAvLyBUT0RPOiBBQ1Q6IFJlY2hlY2tcbiAgICBhY3Q6IFwiNjc0YjEwXCIsXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHJvbGVTdHIgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAocm9sZVN0ci5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhcmlhLWhpZGRlblwiKSAmJiBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWhpZGRlblwiKS50b0xvd2VyQ2FzZSgpID09PSBcInRydWVcIikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaW52YWxpZFJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXNVbmRlZmluZWRCeUFyaWEocnVsZUNvbnRleHQpO1xuXG4gICAgICAgIGlmICghaW52YWxpZFJvbGVzIHx8IGludmFsaWRSb2xlcy5sZW5ndGggPT09IDApXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IHJvbGVzID0gcm9sZVN0ci5zcGxpdCgvXFxzKy8pO1xuICAgICAgICAgICAgaWYgKGludmFsaWRSb2xlcy5sZW5ndGggPT09IHJvbGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMlwiLCBbaW52YWxpZFJvbGVzLmpvaW4oXCIsXCIpXSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGludmFsaWRSb2xlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiLCBbaW52YWxpZFJvbGVzLmpvaW4oXCIsXCIpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4gICAgIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBUYWJsZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9UYWJsZVV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfcm9sZV9yZWR1bmRhbnQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9yb2xlX3JlZHVuZGFudFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbcm9sZV1cIixcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiYXJpYV9yb2xlX3JlZHVuZGFudC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfcmVkdW5kYW50XCI6IFwiYXJpYV9yb2xlX3JlZHVuZGFudC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9yb2xlX3JlZHVuZGFudC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJBbiBleHBsaWNpdGx5LWFzc2lnbmVkIEFSSUEgcm9sZSBpcyBub3QgcmVkdW5kYW50IHdpdGggdGhlIGltcGxpY2l0IHJvbGUgb2YgdGhlIGVsZW1lbnRcIixcbiAgICAgICAgICAgIFwiZmFpbF9yZWR1bmRhbnRcIjogXCJUaGUgZXhwbGljaXRseS1hc3NpZ25lZCBBUklBIHJvbGUgXFxcInswfVxcXCIgaXMgcmVkdW5kYW50IHdpdGggdGhlIGltcGxpY2l0IHJvbGUgb2YgdGhlIGVsZW1lbnQgPHsxfT5cIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBbiBleHBsaWNpdGx5LWFzc2lnbmVkIEFSSUEgcm9sZSBzaG91bGQgbm90IGJlIHJlZHVuZGFudCB3aXRoIHRoZSBpbXBsaWNpdCByb2xlIG9mIHRoZSBlbGVtZW50XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCJdLFxuICAgICAgICBcIm51bVwiOiBbXCJBUklBXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgZWxlbU5hbWUgPSBydWxlQ29udGV4dC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIFxuICAgICAgICBsZXQgYXJpYVJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXMocnVsZUNvbnRleHQsIGZhbHNlKTtcbiAgICAgICAgaWYgKCFhcmlhUm9sZXMgfHwgYXJpYVJvbGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICAgIC8vIHRoZSBpbnZhbGlkIHJvbGUgY2FzZTogaGFuZGxlZCBieSBScHRfQXJpYV9WYWxpZFJvbGUuIElnbm9yZSB0byBhdm9pZCBkdXBsaWNhdGVkIHJlcG9ydFxuICAgICAgICBsZXQgcm9sZV9kZWZpbmVkID0gQXJpYVV0aWwuYXJlUm9sZXNEZWZpbmVkKGFyaWFSb2xlcyk7XG4gICAgICAgIGlmICghcm9sZV9kZWZpbmVkKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gZGVwZW5kZW5jeSBjaGVjazogaWYgaXQncyBhbHJlYWR5IGZhaWxlZCBpbiB0aGUgcGFyZW50IHJlbGF0aW9uLCB0aGVuIHNraXAgdGhpcyBjaGVja1xuICAgICAgICAvLyBjb21tZW50IG91dCB0byByZXBvcnQgdGhlIHJlZHVuZGFudCByb2xlIGZvciB0YWJsZSBlbGVtZW50OiB0ciwgdGQgJiB0aFxuICAgICAgICAvKippZiAoW1widGRcIiwgXCJ0aFwiLCBcInRyXCJdLmluY2x1ZGVzKGVsZW1OYW1lKSkge1xuICAgICAgICAgICAgbGV0IHBhcmVudFJvbGUgPSBUYWJsZVV0aWwuaXNUYWJsZURlc2NlbmRhbnQoY29udGV4dEhpZXJhcmNoaWVzKTtcbiAgICAgICAgICAgIGlmIChwYXJlbnRSb2xlICE9PSBudWxsICYmIHBhcmVudFJvbGUubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSovXG5cbiAgICAgICAgbGV0IGltcGxpY2l0Um9sZXMgPSBBcmlhVXRpbC5nZXRJbXBsaWNpdFJvbGUocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoIWltcGxpY2l0Um9sZXMgfHwgaW1wbGljaXRSb2xlcy5sZW5ndGggPT09IDApXG4gICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcblxuICAgICAgICBsZXQgcmV0ID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJpYVJvbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIWltcGxpY2l0Um9sZXMuaW5jbHVkZXMoYXJpYVJvbGVzW2ldKSkgIFxuICAgICAgICAgICAgICAgIHJldC5wdXNoKFJ1bGVQYXNzKFwicGFzc1wiKSk7XG4gICAgICAgICAgICBlbHNlICAgICBcbiAgICAgICAgICAgICAgICByZXQucHVzaChSdWxlRmFpbChcImZhaWxfcmVkdW5kYW50XCIsIFthcmlhUm9sZXNbaV0sIGVsZW1OYW1lXSkpO1xuICAgICAgICB9ICBcbiAgICAgICAgaWYgKHJldC5sZW5ndGggPiAwKSAgXG4gICAgICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgICByZXR1cm4gbnVsbDsgICAgXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfc2VhcmNoX2xhYmVsX3VuaXF1ZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX3NlYXJjaF9sYWJlbF91bmlxdWVcIixcbiAgICBjb250ZXh0OiBcImFyaWE6c2VhcmNoXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9NdWx0aXBsZVNlYXJjaExhbmRtYXJrc1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiYXJpYV9zZWFyY2hfbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCI6IFwiYXJpYV9zZWFyY2hfbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX3NlYXJjaF9sYWJlbF91bmlxdWUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiVGhlIGVsZW1lbnQgd2l0aCBcXFwic2VhcmNoXFxcIiByb2xlIGhhcyBhIHVuaXF1ZSBsYWJlbCB0aGF0IGRlc2NyaWJlcyBpdHMgcHVycG9zZVwiLFxuICAgICAgICAgICAgXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIjogXCJNdWx0aXBsZSBlbGVtZW50cyB3aXRoIFxcXCJzZWFyY2hcXFwiIHJvbGUgZG8gbm90IGhhdmUgdW5pcXVlIGxhYmVsc1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVhY2ggZWxlbWVudCB3aXRoIFxcXCJzZWFyY2hcXFwiIHJvbGUgbXVzdCBoYXZlIGEgdW5pcXVlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogZGVwcmVjYXRlZCB0aGUgcnVsZSBvbiAwMS8yNy8yMDI1XG4gICAgICogcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSwqL1xuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IGR1cHBlZCA9IEFyaWFVdGlsLmlzTGFuZG1hcmtOYW1lVW5pcXVlKHJ1bGVDb250ZXh0LCBcInNlYXJjaFwiLCB0cnVlKTsgICAgXG4gICAgICAgIGlmIChkdXBwZWQgPT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICBpZiAoZHVwcGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfcm9sZV92YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX3JvbGVfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJhcmlhX2F0dHJpYnV0ZV9hbGxvd2VkXCJdLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiYXJpYV9zZW1hbnRpY3Nfcm9sZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiRmFpbF8yXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9yb2xlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV9yb2xlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiYXJpYV9yb2xlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX3JvbGVfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUaGUgQVJJQSByb2xlICd7MH0nIGlzIG5vdCB2YWxpZCBmb3IgdGhlIGVsZW1lbnQgPHsxfT5cIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiVGhlIEFSSUEgcm9sZSAnezB9JyBpcyBub3QgdmFsaWQgZm9yIHRoZSBlbGVtZW50IDx7MX0+IGFuZCBtYXkgYmUgaWdub3JlZCBieSB0aGUgYnJvd3NlciBzaW5jZSB0aGUgZWxlbWVudCBpcyBmb2N1c2FibGVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBUklBIHJvbGVzIG11c3QgYmUgdmFsaWQgZm9yIHRoZSBlbGVtZW50IHRvIHdoaWNoIHRoZXkgYXJlIGFzc2lnbmVkXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgdGFnTmFtZSA9IHJ1bGVDb250ZXh0LnRhZ05hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgLy8gb25seSBjaGVrIGVsZW1lbnQgKDEpIGFuZCBmcmFnbWVudCBub2RlcyAoMTEpXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5ub2RlVHlwZSAhPT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLylcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICAvLyB0aGUgaW52YWxpZCByb2xlIGNhc2U6IGhhbmRsZWQgYnkgYXJpYV9yb2xlX2FsbG93ZWQuIElnbm9yZSB0byBhdm9pZCBkdXBsaWNhdGVkIHJlcG9ydFxuICAgICAgICBjb25zdCB1bmRlZmluZWRSb2xlcyA9IEFyaWFVdGlsLmdldFJvbGVzVW5kZWZpbmVkQnlBcmlhKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKHVuZGVmaW5lZFJvbGVzICYmIHVuZGVmaW5lZFJvbGVzLmxlbmd0aCA+IDApIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCBkZXByZWNhdGVkUm9sZXMgPSBBcmlhVXRpbC5nZXREZXByZWNhdGVkQXJpYVJvbGVzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKGRlcHJlY2F0ZWRSb2xlcyAmJiBkZXByZWNhdGVkUm9sZXMubGVuZ3RoID4gMCkgcmV0dXJuIG51bGw7XG4gICAgICAgIGNvbnN0IGRlcHJlY2F0ZWRBdHRyaWJ1dGVzID0gQXJpYVV0aWwuZ2V0RGVwcmVjYXRlZEFyaWFBdHRyaWJ1dGVzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKGRlcHJlY2F0ZWRBdHRyaWJ1dGVzICYmIGRlcHJlY2F0ZWRBdHRyaWJ1dGVzLmxlbmd0aCA+IDApIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIGRlcGVuZGVuY3kgY2hlY2s6IGlmIGl0J3MgYWxyZWFkeSBmYWlsZWQsIHRoZW4gc2tpcFxuICAgICAgICBpZiAoW1widGRcIiwgXCJ0aFwiLCBcInRyXCJdLmluY2x1ZGVzKHRhZ05hbWUpKSB7XG4gICAgICAgICAgICBsZXQgcGFyZW50Um9sZSA9IENvbW1vblV0aWwuaXNUYWJsZURlc2NlbmRhbnQoY29udGV4dEhpZXJhcmNoaWVzKTtcbiAgICAgICAgICAgIGlmIChwYXJlbnRSb2xlICE9PSBudWxsICYmIHBhcmVudFJvbGUubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBkb21Sb2xlczogc3RyaW5nW10gPSBBcmlhVXRpbC5nZXRVc2VyRGVmaW5lZFJvbGVzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKCFkb21Sb2xlcyB8fCBkb21Sb2xlcy5sZW5ndGggPT09MClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIGNoZWNrIHRoZSAnZ2VuZXJpYycgcm9sZSBmaXJzdFxuICAgICAgICBpZiAoZG9tUm9sZXMuaW5jbHVkZXMoJ2dlbmVyaWMnKSlcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiLCBbXCJnZW5lcmljXCIsIHRhZ05hbWVdKTtcbiAgICAgICAgXG4gICAgICAgIGxldCBpbnZhbGlkUm9sZXMgPSBBcmlhVXRpbC5nZXRJbnZhbGlkUm9sZXMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoaW52YWxpZFJvbGVzID09PSBudWxsIHx8IGludmFsaWRSb2xlcy5sZW5ndGggPT09MClcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiLCBbZG9tUm9sZXMuam9pbihcIiwgXCIpLCB0YWdOYW1lXSk7XG5cbiAgICAgICAgaWYgKGludmFsaWRSb2xlcy5pbmNsdWRlcyhcInByZXNlbnRhdGlvblwiKSB8fCBpbnZhbGlkUm9sZXMuaW5jbHVkZXMoXCJub25lXCIpICYmIENvbW1vblV0aWwuaXNUYWJiYWJsZShydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzJcIiwgW2ludmFsaWRSb2xlcy5qb2luKFwiLCBcIiksIHRhZ05hbWVdKTtcbiAgICAgICAgXG4gICAgICAgIGlmIChpbnZhbGlkUm9sZXMubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiLCBbaW52YWxpZFJvbGVzLmpvaW4oXCIsIFwiKSwgdGFnTmFtZV0pO1xuICAgICAgICBcbiAgICAgICAgaWYgKGRvbVJvbGVzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIiwgW2RvbVJvbGVzLmpvaW4oXCIsIFwiKSwgdGFnTmFtZV0pO1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufVxuXG4vLyBUaGlzIHJ1bGUgaXMgaW4gdGhlIHNhbWUgZmlsZSBiZWNhdXNlIHRoZXJlIGlzIGEgZGVwZW5kZW5jeSB0aGF0IGFyaWFfcm9sZV92YWxpZCBydW5zIGZpcnN0LFxuLy8gYW5kIHRoZSBpbmZvIGlzIHBhc3NlZCBieSBjYWNoZSwgYnV0IHRoZXJlIGlzbid0IGEgZGVwZW5kZW5jeSBpbiB0aGUgRmFpbF8yIHNjZW5hcmlvLCBzbyByZWd1bGFyXG4vLyBkZXBlbmRlbmN5IGNhbm5vdCBiZSB1c2VkXG5leHBvcnQgY29uc3QgYXJpYV9hdHRyaWJ1dGVfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9hdHRyaWJ1dGVfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgLy8gVGhlIHRoZSBBUklBIHJvbGUgaXMgY29tcGxldGVseSBpbnZhbGlkLCBza2lwIHRoaXMgY2hlY2tcbiAgICBkZXBlbmRlbmNpZXM6IFtcImFyaWFfYXR0cmlidXRlX2RlcHJlY2F0ZWRcIiwgXCJhcmlhX3JvbGVfdmFsaWRcIl0sXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJhcmlhX2F0dHJpYnV0ZV9hbGxvd2VkXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc1wiOiBcIlBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF9pbnZhbGlkX3JvbGVfYXR0clwiOiBcIkZhaWxfaW52YWxpZF9yb2xlX2F0dHJcIixcbiAgICAgICAgICAgIFwiRmFpbF9pbnZhbGlkX2ltcGxpY2l0X3JvbGVfYXR0clwiOiBcIkZhaWxfaW52YWxpZF9pbXBsaWNpdF9yb2xlX2F0dHJcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfYXR0cmlidXRlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc1wiOiBcImFyaWFfYXR0cmlidXRlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF9pbnZhbGlkX3JvbGVfYXR0clwiOiBcImFyaWFfYXR0cmlidXRlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF9pbnZhbGlkX2ltcGxpY2l0X3JvbGVfYXR0clwiOiBcImFyaWFfYXR0cmlidXRlX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBUklBIGF0dHJpYnV0ZXMgc2hvdWxkIGJlIHZhbGlkIGZvciB0aGUgZWxlbWVudCBhbmQgQVJJQSByb2xlIHRvIHdoaWNoIHRoZXkgYXJlIGFzc2lnbmVkXCIsXG4gICAgICAgICAgICBcIlBhc3NcIjogXCJBUklBIGF0dHJpYnV0ZXMgYXJlIHZhbGlkIGZvciB0aGUgZWxlbWVudCBhbmQgQVJJQSByb2xlXCIsXG4gICAgICAgICAgICBcIkZhaWxfaW52YWxpZF9yb2xlX2F0dHJcIjogXCJUaGUgQVJJQSBhdHRyaWJ1dGVzIFxcXCJ7MH1cXFwiIGFyZSBub3QgdmFsaWQgZm9yIHRoZSBlbGVtZW50IDx7MX0+IHdpdGggQVJJQSByb2xlIFxcXCJ7Mn1cXFwiXCIsXG4gICAgICAgICAgICBcIkZhaWxfaW52YWxpZF9pbXBsaWNpdF9yb2xlX2F0dHJcIjogXCJUaGUgQVJJQSBhdHRyaWJ1dGVzIFxcXCJ7MH1cXFwiIGFyZSBub3QgdmFsaWQgZm9yIHRoZSBlbGVtZW50IDx7MX0+IHdpdGggaW1wbGljaXQgQVJJQSByb2xlIFxcXCJ7Mn1cXFwiXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCJBUklBXCJdLCAvL3JlbW92ZWQgbWFwcGluZyB0byA0LjEuMiBmcm9tIGhlcmUgYW5kIGhlbHBcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXCI1YzAxZWFcIiwgeyBcIjQ2Y2E3ZlwiOiB7IFwiUGFzc1wiOiBcInBhc3NcIiwgXCJGYWlsX2ludmFsaWRfcm9sZV9hdHRyXCI6IFwiZmFpbFwiLCBcIkZhaWxfaW52YWxpZF9pbXBsaWNpdF9yb2xlX2F0dHJcIjogXCJmYWlsXCJ9fV0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy8gb25seSBjaGVrIGVsZW1lbnQgKDEpXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5ub2RlVHlwZSAhPT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLylcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIGlnbm9yZSBpZiBubyBhcmlhIGF0dHJpYnV0ZVxuICAgICAgICBsZXQgYXJpYUF0dHJpYnV0ZXM6c3RyaW5nW10gPSBBcmlhVXRpbC5nZXRVc2VyRGVmaW5lZEFyaWFBdHRyaWJ1dGVzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKGFyaWFBdHRyaWJ1dGVzID09PSBudWxsIHx8IGFyaWFBdHRyaWJ1dGVzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgIFxuICAgICAgICBsZXQgcm9sZXM6IHN0cmluZ1tdID0gQXJpYVV0aWwuZ2V0VXNlckRlZmluZWRSb2xlcyhydWxlQ29udGV4dCk7XG4gICAgICAgIGxldCBleHBsaWNpdCA9IHRydWU7XG4gICAgICAgIGlmIChyb2xlcyAmJiByb2xlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvLyB0aGUgaW52YWxpZCByb2xlIGNhc2U6IGhhbmRsZWQgYnkgUnB0X0FyaWFfVmFsaWRSb2xlLiBJZ25vcmUgdG8gYXZvaWQgZHVwbGljYXRlZCByZXBvcnRcbiAgICAgICAgICAgIGlmICghQXJpYVV0aWwuYXJlUm9sZXNEZWZpbmVkKHJvbGVzKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vbm8gZXhwbGljaXQgcm9sZSBkZWZpbmVkXG4gICAgICAgICAgICByb2xlcyA9ICBBcmlhVXRpbC5nZXRJbXBsaWNpdFJvbGUocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgZXhwbGljaXQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgbGV0IHRhZ05hbWUgPSBydWxlQ29udGV4dC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGxldCBmYWlsZWRBdHRyaWJ1dGVzID0gQXJpYVV0aWwuZ2V0SW52YWxpZEFyaWFBdHRyaWJ1dGVzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKCFmYWlsZWRBdHRyaWJ1dGVzIHx8IGZhaWxlZEF0dHJpYnV0ZXMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc1wiLCBbYXJpYUF0dHJpYnV0ZXMuam9pbihcIiwgXCIpLCB0YWdOYW1lLCByb2xlcy5qb2luKFwiLCBcIildKTtcblxuICAgICAgICBpZiAocm9sZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgaWYgKGV4cGxpY2l0KVxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfaW52YWxpZF9yb2xlX2F0dHJcIiwgW2ZhaWxlZEF0dHJpYnV0ZXMuam9pbihcIiwgXCIpLCB0YWdOYW1lLCByb2xlcy5qb2luKFwiLCBcIildKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsX2ludmFsaWRfaW1wbGljaXRfcm9sZV9hdHRyXCIsIFtmYWlsZWRBdHRyaWJ1dGVzLmpvaW4oXCIsIFwiKSwgdGFnTmFtZSwgcm9sZXMuam9pbihcIiwgXCIpXSk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfaW52YWxpZF9yb2xlX2F0dHJcIiwgW2ZhaWxlZEF0dHJpYnV0ZXMuam9pbihcIiwgXCIpLCB0YWdOYW1lLCBcIm5vbmVcIl0pO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBDYWNoZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfdG9vbGJhcl9sYWJlbF91bmlxdWU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV90b29sYmFyX2xhYmVsX3VuaXF1ZVwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTp0b29sYmFyXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9NdWx0aXBsZVRvb2xiYXJVbmlxdWVMYWJlbFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfdG9vbGJhcl9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX3Rvb2xiYXJfbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX3Rvb2xiYXJfbGFiZWxfdW5pcXVlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiTXVsdGlwbGUgZWxlbWVudHMgd2l0aCBcXFwidG9vbGJhclxcXCIgcm9sZXMgZG8gbm90IGhhdmUgdW5pcXVlIGxhYmVsc1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVhY2ggZWxlbWVudCB3aXRoIFxcXCJ0b29sYmFyXFxcIiByb2xlIG11c3QgaGF2ZSBhIHVuaXF1ZSBsYWJlbCB0aGF0IGRlc2NyaWJlcyBpdHMgcHVycG9zZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi40LjFcIl0sIC8vdXBkYXRlZCBtYXBwaW5nIHRvIG1hdGNoIG90aGVyIGxhbmRtYXJrIHJlZ2lvbnMgcnVsZXNcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBDb25zaWRlciB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyB0aGF0IGlzIHNldCBieSB0aGUgcnVsZXNcbiAgICAgICAgLy8gQWxzbywgY29uc2lkZXIgSW1wbGljaXQgcm9sZSBjaGVja2luZy5cbiAgICAgICAgbGV0IGxhbmRtYXJrcyA9IENvbW1vblV0aWwuZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW4oXG4gICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgXCJ0b29sYmFyXCIsXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgdHJ1ZVxuICAgICAgICApO1xuICAgICAgICBpZiAobGFuZG1hcmtzLmxlbmd0aCA9PT0gMCB8fCBsYW5kbWFya3MubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBkdXBlcyA9IENhY2hlVXRpbC5nZXRDYWNoZShcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICBcImFyaWFfdG9vbGJhcl9sYWJlbF91bmlxdWVcIixcbiAgICAgICAgICAgIG51bGxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFkdXBlcykge1xuICAgICAgICAgICAgZHVwZXMgPSBBcmlhVXRpbC5maW5kQXJpYUxhYmVsRHVwZXMobGFuZG1hcmtzKTtcbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShcbiAgICAgICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgICAgIFwiYXJpYV90b29sYmFyX2xhYmVsX3VuaXF1ZVwiLFxuICAgICAgICAgICAgICAgIGR1cGVzXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGxldCBteUxhYmVsID0gQXJpYVV0aWwuZ2V0QXJpYUxhYmVsKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgbGV0IHBhc3NlZCA9XG4gICAgICAgICAgICBteUxhYmVsICE9PSBcIlwiICYmICghKG15TGFiZWwgaW4gZHVwZXMpIHx8IGR1cGVzW215TGFiZWxdIDw9IDEpO1xuXG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW215TGFiZWxdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBBUklBTWFwcGVyIH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQU1hcHBlclwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG5pbXBvcnQgeyBBUklBRGVmaW5pdGlvbnMgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBRGVmaW5pdGlvbnNcIjtcbmltcG9ydCB7IERPTVV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfd2lkZ2V0X2xhYmVsbGVkOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfd2lkZ2V0X2xhYmVsbGVkXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfV2lkZ2V0TGFiZWxzX0ltcGxpY2l0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV93aWRnZXRfbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX3dpZGdldF9sYWJlbGxlZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfd2lkZ2V0X2xhYmVsbGVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJJbnRlcmFjdGl2ZSBjb21wb25lbnQgbXVzdCBoYXZlIGEgcHJvZ3JhbW1hdGljYWxseSBhc3NvY2lhdGVkIG5hbWVcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiSW50ZXJhY3RpdmUgY29tcG9uZW50IHdpdGggQVJJQSByb2xlICd7MH0nIGRvZXMgbm90IGhhdmUgYSBwcm9ncmFtbWF0aWNhbGx5IGFzc29jaWF0ZWQgbmFtZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogXCJtNmIxcTNcIixcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvKiByZW1vdmVkIHRoZSByb2xlIGNoZWNrIHJvbGU9IHByZXNlbnRhdGlvbiBhbmQgcm9sZT1ub25lIHNpbmNlIHRoZXNlIDIgcm9sZXMgYXJlIG5vdCBpbiB0aGUgbGlzdCBvZiB3aWRnZXQgdHlwZSByb2xlcyAqL1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidHlwZVwiKSAmJlxuICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInR5cGVcIikgPT09IFwiaGlkZGVuXCIpIHx8XG4gICAgICAgICAgICAoQXJpYVV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShydWxlQ29udGV4dCwgXCJjb21ib2JveFwiKSAmJlxuICAgICAgICAgICAgICAgICEoXG4gICAgICAgICAgICAgICAgICAgIEFyaWFVdGlsLmhhc1JvbGVJblNlbWFudGljcyhydWxlQ29udGV4dCwgXCJ0ZXh0Ym94XCIpIHx8XG4gICAgICAgICAgICAgICAgICAgIEFyaWFVdGlsLmhhc1JvbGVJblNlbWFudGljcyhydWxlQ29udGV4dCwgXCJzZWFyY2hib3hcIilcbiAgICAgICAgICAgICAgICApKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gZGlhZ25vc2UgdGhhdCBhIGNvbWJvYm94IGlucHV0IHRleHRib3ggaGFzIGEgbGFiZWwoZ2l0aHViIGlzc3VlICMxMTA0KVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZWxlbVJvbGUgPSBBUklBTWFwcGVyLm5vZGVUb1JvbGUocnVsZUNvbnRleHQpO1xuICAgICAgICBsZXQgdGFnTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgLy8gSGFuZGxlZCBieSBpbnB1dF9sYWJlbF9leGlzdHNcbiAgICAgICAgbGV0IHNraXBSb2xlcyA9IFtcbiAgICAgICAgICAgIFwiYnV0dG9uXCIsXG4gICAgICAgICAgICBcImNoZWNrYm94XCIsXG4gICAgICAgICAgICBcImNvbWJvYm94XCIsXG4gICAgICAgICAgICBcImxpc3Rib3hcIixcbiAgICAgICAgICAgIFwibWVudWl0ZW1jaGVja2JveFwiLFxuICAgICAgICAgICAgXCJtZW51aXRlbXJhZGlvXCIsXG4gICAgICAgICAgICBcInJhZGlvXCIsXG4gICAgICAgICAgICBcInNlYXJjaGJveFwiLFxuICAgICAgICAgICAgXCJzbGlkZXJcIixcbiAgICAgICAgICAgIFwic3BpbmJ1dHRvblwiLFxuICAgICAgICAgICAgXCJzd2l0Y2hcIixcbiAgICAgICAgICAgIFwidGV4dGJveFwiLFxuICAgICAgICAgICAgXCJwcm9ncmVzc2JhclwiLFxuICAgICAgICAgICAgXCJsaW5rXCIsXG4gICAgICAgIF07XG4gICAgICAgIGlmIChza2lwUm9sZXMuaW5jbHVkZXMoZWxlbVJvbGUpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGFnTmFtZSA9PT0gXCJvdXRwdXRcIiB8fFxuICAgICAgICAgICAgKHRhZ05hbWUgPT09IFwiaW5wdXRcIiAmJlxuICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInR5cGVcIikgPT09IFwiZmlsZVwiKVxuICAgICAgICApIHtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInJvbGVcIikpIHtcbiAgICAgICAgICAgIC8vIEZvcm0vaW5wdXQgZWxlbWVudHMgYXJlIGNoZWNrZWQgYnkgRzQxLCB3ZSBza2lwIHRoZW0gZnJvbSB0aGlzIHJ1bGUuIEdpdGh1YiBpc3N1ZSA0NDlcbiAgICAgICAgICAgIGxldCBza2lwRWxlbWVudHMgPSBbXG4gICAgICAgICAgICAgICAgXCJpbnB1dFwiLFxuICAgICAgICAgICAgICAgIFwidGV4dGFyZWFcIixcbiAgICAgICAgICAgICAgICBcInNlbGVjdFwiLFxuICAgICAgICAgICAgICAgIFwiYnV0dG9uXCIsXG4gICAgICAgICAgICAgICAgXCJkYXRhbGlzdFwiLFxuICAgICAgICAgICAgICAgIFwib3B0Z3JvdXBcIixcbiAgICAgICAgICAgICAgICBcIm9wdGlvblwiLFxuICAgICAgICAgICAgICAgIFwia2V5Z2VuXCIsXG4gICAgICAgICAgICAgICAgXCJvdXRwdXRcIixcbiAgICAgICAgICAgICAgICBcInByb2dyZXNzXCIsXG4gICAgICAgICAgICAgICAgXCJtZXRlclwiLFxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBza2lwRWxlbWVudHMuaW5kZXhPZihydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSAhPVxuICAgICAgICAgICAgICAgIC0xXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGF2b2lkIGRpYWdub3NpbmcgdGhlIHBvcHVwIGxpc3Qgb2YgYSBjb21ib2JveC5cbiAgICAgICAgbGV0IHJvbGVzVG9DaGVjayA9IFtcImxpc3Rib3hcIiwgXCJ0cmVlXCIsIFwiZ3JpZFwiLCBcImRpYWxvZ1wiXTtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByb2xlc1RvQ2hlY2subGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGlmIChBcmlhVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MocnVsZUNvbnRleHQsIHJvbGVzVG9DaGVja1tqXSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgY29tYm9ib3hlcyA9IENvbW1vblV0aWwuZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW4oXG4gICAgICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIFwiY29tYm9ib3hcIixcbiAgICAgICAgICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgdHJ1ZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBjb21ib2JveGVzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjb21ib2JveCA9IGNvbWJvYm94ZXNba107XG4gICAgICAgICAgICAgICAgICAgIGxldCBhcmlhX293bnMgPSBDb21tb25VdGlsLmdldEVsZW1lbnRBdHRyaWJ1dGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21ib2JveCxcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiYXJpYS1vd25zXCJcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFyaWFfb3ducykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG93bnMgPSBDb21tb25VdGlsLm5vcm1hbGl6ZVNwYWNpbmcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYV9vd25zLnRyaW0oKVxuICAgICAgICAgICAgICAgICAgICAgICAgKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG93bnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgb3duZWQgPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZUNvbnRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG93bnNbaV1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvd25lZCA9PT0gcnVsZUNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGxldCBwcm9oaWJpdGVkID0gZmFsc2U7XG4gICAgICAgIGxldCBkZXNpZ25QYXR0ZXJucyA9IEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJucztcbiAgICAgICAgLy9nZXQgYXR0cmlidXRlIHJvbGVzIGFzIHdlbGwgYXMgaW1wbGljaXQgcm9sZXMuXG4gICAgICAgIGxldCByb2xlcyA9IEFyaWFVdGlsLmdldFJvbGVzKHJ1bGVDb250ZXh0LCB0cnVlKTtcbiAgICAgICAgbGV0IG51bVdpZGdldHNUZXN0ZWQgPSAwO1xuICAgICAgICBsZXQgaW50ZXJhY3RpdmVSb2xlVHlwZXMgPSBbXCJ3aWRnZXRcIiwgXCJsaXZlUmVnaW9uXCIsIFwid2luZG93XCJdO1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuZ3RoID0gcm9sZXMubGVuZ3RoOyBwYXNzZWQgJiYgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBsZXQgcGF0dGVybiA9IGRlc2lnblBhdHRlcm5zW3JvbGVzW2ldXTtcblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHBhdHRlcm4gJiZcbiAgICAgICAgICAgICAgICBwYXR0ZXJuLm5hbWVSZXF1aXJlZCAmJlxuICAgICAgICAgICAgICAgIHBhdHRlcm4ucm9sZVR5cGUgJiZcbiAgICAgICAgICAgICAgICBpbnRlcmFjdGl2ZVJvbGVUeXBlcy5pbmNsdWRlcyhwYXR0ZXJuLnJvbGVUeXBlKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgKytudW1XaWRnZXRzVGVzdGVkO1xuXG4gICAgICAgICAgICAgICAgLy8gQWxsIHdpZGdldHMgbWF5IGhhdmUgYW4gYXV0aG9yIHN1cHBsaWVkIGFjY2Vzc2libGUgbmFtZS5cbiAgICAgICAgICAgICAgICAvLyBUaXRsZSBpcyBsZWdhbCwgYnV0IGRvbid0IGFkdmVydGlzZSBpdHMgdXNlIGluIGRvY3VtZW50YXRpb24uXG4gICAgICAgICAgICAgICAgLy8gRW5jb3VyYWdlIHVzZSBvZiBhcmlhLWxhYmVsLCBhcmlhLWxhYmVsbGVkYnkgb3IgaHRtbCBsYWJlbCBlbGVtZW50LlxuICAgICAgICAgICAgICAgIHBhc3NlZCA9XG4gICAgICAgICAgICAgICAgICAgIEFyaWFVdGlsLmhhc0FyaWFMYWJlbChydWxlQ29udGV4dCkgfHxcbiAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJ0aXRsZVwiKSB8fFxuICAgICAgICAgICAgICAgICAgICBDb21tb25VdGlsLmdldExhYmVsRm9yRWxlbWVudEhpZGRlbihydWxlQ29udGV4dCwgdHJ1ZSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICFwYXNzZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgcGF0dGVybi5uYW1lRnJvbSAmJlxuICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuLm5hbWVGcm9tLmluZGV4T2YoXCJjb250ZW50c1wiKSA+PSAwXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNlZSBpZiB3aWRnZXQncyBhY2Nlc3NpYmxlIG5hbWUgaXMgc3VwcGxpZWQgYnkgZWxlbWVudCdzIGlubmVyIHRleHRcbiAgICAgICAgICAgICAgICAgICAgLy8gbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdXG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IENvbW1vblV0aWwuaGFzSW5uZXJDb250ZW50T3JBbHQocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIGl0IGhhcyBpbXBsaWNpdCBsYWJlbCwgbGlrZSA8bGFiZWw+PGlucHV0IC4uLi4+YWJjIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IENvbW1vblV0aWwuaGFzSW1wbGljaXRMYWJlbChydWxlQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAhcGFzc2VkICYmXG4gICAgICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbWdcIiAmJlxuICAgICAgICAgICAgICAgICAgICAhcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwicm9sZVwiKSAmJlxuICAgICAgICAgICAgICAgICAgICBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhbHRcIilcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID1cbiAgICAgICAgICAgICAgICAgICAgICAgIERPTVV0aWwuY2xlYW5XaGl0ZXNwYWNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFsdFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgKS50cmltKCkubGVuZ3RoID4gMDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAocGF0dGVybi5uYW1lRnJvbS5pbmRleE9mKFwicHJvaGliaXRlZFwiKSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb2hpYml0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChudW1XaWRnZXRzVGVzdGVkID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSBlbHNlIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW2VsZW1Sb2xlXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvL1RPRE9cbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIGlmIChwcm9oaWJpdGVkKSB7XG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8yXCIpO1xuICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhc2NpaWFydF9hbHRfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcImFzY2lpYXJ0X2FsdF9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTpwcmUsIGRvbTpsaXN0aW5nLCBkb206eG1wLCBkb206cGxhaW50ZXh0XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfUHJlX0FTQ0lJQXJ0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFzY2lpYXJ0X2FsdF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcImFzY2lpYXJ0X2FsdF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFzY2lpYXJ0X2FsdF9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0aGF0IEFTQ0lJIGFydCBoYXMgYSB0ZXh0IGFsdGVybmF0aXZlXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQVNDSUkgYXJ0IG11c3QgaGF2ZSBhIHRleHQgYWx0ZXJuYXRpdmVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBEZWNpc2lvbiBpbiBwbGFubmluZyA5LzcvMjMgdGhhdCB0aGlzIHJ1bGUgY2F1c2VzIG1vcmUgcmV2aWV3cyB0aGF0IHdlIHNlZSBhY3R1YWwgcHJvYmxlbXMgaW4gY29udGVudCwgc28gdHVybiB0aGVzZSBydWxlcyBvZmZcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICAqL1xuICAgIHJ1bGVzZXRzOiBbXSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG5cbiAgICAgICAgLy8gRml4IGZvciBJRFdCIHdyaXRlcnMuIERvbid0IHRyaWdnZXIgaWYgY29udGVudCBpcyBpbiBhIGNvZGUgZWxlbWVudC4gIFRoZSBjb2RlIGVsZW1lbnQgaXMgc2VhcmNoZWQgZm9yXG4gICAgICAgIC8vIGluIHZhcmlvdXMgcGxhY2VzIGJlY2F1c2Ugb2YgdGhlIHdlaXJkIHdheSB2YXJpb3VzIGJyb3dzZXJzIHJlbmRlciA8Y29kZT48cHJlPjwvcHJlPjwvY29kZS4gIEZpcmVmb3gsXG4gICAgICAgIC8vIEh0bWxVbml0IGFuZCBDaHJvbWUgYWxsIHJlbmRlciBkaWZmZXJlbnRseS4gIEZpcmVmb3g6IDxjb2RlPjwvY29kZT48cHJlPjwvcHJlPiAgSHRtbFVuaXQ6IDwvY29kZT48cHJlPjxjb2RlPjwvY29kZT48L3ByZT5cbiAgICAgICAgLy8gU2VlIHVuaXQgdGVzdCBDb2RlRWxlbWVudEFib3ZlUHJlRWxlbWVudC5odG1sLiAgRG9uJ3Qga25vdyBob3cgUlBUIHJlbmRlcnMsIHNvIGNvdmVyIGFsbCB0aGUgYmFzZXMuXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09IFwicHJlXCIpIHtcbiAgICAgICAgICAgIGlmICgocnVsZUNvbnRleHQucHJldmlvdXNTaWJsaW5nICYmIHJ1bGVDb250ZXh0LnByZXZpb3VzU2libGluZy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09IFwiY29kZVwiKSB8fFxuICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiY29kZVwiKS5sZW5ndGggPiAwIHx8XG4gICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgXCJjb2RlXCIpKSB7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgbGV0IHR4dFZhbHVlID0gQ29tbW9uVXRpbC5nZXRJbm5lclRleHQocnVsZUNvbnRleHQpO1xuICAgICAgICBsZXQgbm9uQWxwaGFOdW1lcmljTm9yU3BhY2VDb3VudCA9IDA7XG4gICAgICAgIGxldCBhbHBoTnVtU2FtZUNoYXJhY3RlckNvdW50ID0gMDtcbiAgICAgICAgbGV0IGxhc3RDaGFyYWN0ZXIgPSBcIlwiO1xuXG4gICAgICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgdGV4dCBjb250ZW50XG4gICAgICAgIGZvciAobGV0IGlkeCA9IDA7IHBhc3NlZCAmJiAoaWR4IDwgdHh0VmFsdWUubGVuZ3RoKTsgKytpZHgpIHtcbiAgICAgICAgICAgIGxldCBjaFN0ciA9IHR4dFZhbHVlLnN1YnN0cihpZHgsIDEpO1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgaXQgaXMgYWxwaGFudW1lcmljIG9yIHB1bmN0dWF0aW9uXG4gICAgICAgICAgICBpZiAoL1tcXHchQCMkJSZcXCooKS4sP1xcW1xcXXt9PD49XCI6XFwvXFxcXC1dLy50ZXN0KGNoU3RyKSkge1xuICAgICAgICAgICAgICAgIC8vIERldGVjdCBzYW1lIGNoYXJhY3RlciBzZXF1ZW5jZVxuICAgICAgICAgICAgICAgIGlmIChsYXN0Q2hhcmFjdGVyID09IGNoU3RyKSB7XG4gICAgICAgICAgICAgICAgICAgIGFscGhOdW1TYW1lQ2hhcmFjdGVyQ291bnQgPSBhbHBoTnVtU2FtZUNoYXJhY3RlckNvdW50ICsgMTs7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYWxwaE51bVNhbWVDaGFyYWN0ZXJDb3VudCA9IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmICgvXFxzLy50ZXN0KGNoU3RyKSkge1xuICAgICAgICAgICAgICAgIGFscGhOdW1TYW1lQ2hhcmFjdGVyQ291bnQgPSAwO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBub25BbHBoYU51bWVyaWNOb3JTcGFjZUNvdW50ID0gbm9uQWxwaGFOdW1lcmljTm9yU3BhY2VDb3VudCArIDE7XG4gICAgICAgICAgICAgICAgYWxwaE51bVNhbWVDaGFyYWN0ZXJDb3VudCA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsYXN0Q2hhcmFjdGVyID0gY2hTdHI7XG5cbiAgICAgICAgICAgIC8vIE1ha2UgdGhlIGRlY2lzaW9uXG4gICAgICAgICAgICBpZiAobm9uQWxwaGFOdW1lcmljTm9yU3BhY2VDb3VudCA+PSA1IHx8IGFscGhOdW1TYW1lQ2hhcmFjdGVyQ291bnQgPj0gNCkge1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYmxpbmtfY3NzX3JldmlldzogUnVsZSA9IHtcbiAgICBpZDogXCJibGlua19jc3NfcmV2aWV3XCIsXG4gICAgY29udGV4dDogXCJkb206c3R5bGUsIGRvbToqW3N0eWxlXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX0JsaW5rX0NTU1RyaWdnZXIxXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBgYmxpbmtfY3NzX3Jldmlldy5odG1sYCxcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IGBibGlua19jc3NfcmV2aWV3Lmh0bWxgLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBgYmxpbmtfY3NzX3Jldmlldy5odG1sYFxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJEbyBub3QgdXNlIHRoZSBcXFwiYmxpbmtcXFwiIHZhbHVlIG9mIHRoZSAndGV4dC1kZWNvcmF0aW9uJyBwcm9wZXJ0eSBmb3IgbG9uZ2VyIHRoYW4gZml2ZSBzZWNvbmRzXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiQ2hlY2sgdGhlIFxcXCJibGlua1xcXCIgdmFsdWUgb2YgdGhlIENTUyAndGV4dC1kZWNvcmF0aW9uJyBwcm9wZXJ0eSBpcyBub3QgdXNlZCBmb3IgbW9yZSB0aGFuIHRoYW4gZml2ZSBzZWNvbmRzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIG51bTogXCIyLjIuMlwiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHRleHRWYWx1ZSA9IENvbW1vblV0aWwuZ2V0SW5uZXJUZXh0KHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZSgnc3R5bGUnKSkge1xuICAgICAgICAgICAgdGV4dFZhbHVlID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKCdzdHlsZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhc3NlZCA9IHRleHRWYWx1ZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoXCJ0ZXh0LWRlY29yYXRpb246YmxpbmtcIikgPT0gLTE7XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGNvbnN0IGJsaW5rX2VsZW1fZGVwcmVjYXRlZDogUnVsZSA9IHtcbiAgICBpZDogXCJibGlua19lbGVtX2RlcHJlY2F0ZWRcIixcbiAgICBjb250ZXh0OiBcImRvbTpibGlua1wiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0JsaW5rX0Fsd2F5c1RyaWdnZXJcIjoge1xuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBgYmxpbmtfZWxlbV9kZXByZWNhdGVkLmh0bWxgLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogYGJsaW5rX2VsZW1fZGVwcmVjYXRlZC5odG1sYFxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJDb250ZW50IHRoYXQgYmxpbmtzIHBlcnNpc3RlbnRseSBtdXN0IG5vdCBiZSB1c2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkNvbnRlbnQgZm91bmQgdGhhdCBibGlua3MgcGVyc2lzdGVudGx5XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbIFwiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBudW06IFwiMi4yLjJcIiwgLy8gbnVtOiBbIFwiMi40LjRcIiwgXCJ4LnkuelwiIF0gYWxzbyBhbGxvd2VkXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIC8vIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICB9XG59XG4gICAgIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBibG9ja3F1b3RlX2NpdGVfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcImJsb2NrcXVvdGVfY2l0ZV9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTpibG9ja3F1b3RlXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfQmxvY2txdW90ZV9IYXNDaXRlXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImJsb2NrcXVvdGVfY2l0ZV9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcImJsb2NrcXVvdGVfY2l0ZV9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImJsb2NrcXVvdGVfY2l0ZV9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0aGF0IDxibG9ja3F1b3RlPiBzaG91bGQgaGF2ZSBhICdjaXRlJyBhdHRyaWJ1dGUgYW5kIG5vdCBiZSB1c2VkIGZvciBpbmRlbnRhdGlvbiBvbmx5XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVXNlIDxibG9ja3F1b3RlPiBvbmx5IGZvciBxdW90YXRpb25zLCBub3QgaW5kZW50YXRpb25cIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwiY2l0ZVwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIGxldCBjaXRlRWxlbXMgPSBDb21tb25VdGlsLmdldERvY0VsZW1lbnRzQnlUYWcocnVsZUNvbnRleHQsIFwiY2l0ZVwiKTtcbiAgICAgICAgICAgIHBhc3NlZCA9IGNpdGVFbGVtcyAhPSBudWxsICYmIGNpdGVFbGVtcy5sZW5ndGggPiAwO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGNhbnZhc19jb250ZW50X2Rlc2NyaWJlZDogUnVsZSA9IHtcbiAgICBpZDogXCJjYW52YXNfY29udGVudF9kZXNjcmliZWRcIixcbiAgICBjb250ZXh0OiBcImRvbTpjYW52YXNcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIkhBQUNfQ2FudmFzXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwiTWFudWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImNhbnZhc19jb250ZW50X2Rlc2NyaWJlZC5odG1sXCIsXG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwiY2FudmFzX2NvbnRlbnRfZGVzY3JpYmVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJjYW52YXNfY29udGVudF9kZXNjcmliZWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIlZlcmlmeSBhY2Nlc3NpYmlsaXR5IG9mIHRoZSA8Y2FudmFzPiBlbGVtZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGhlIDxjYW52YXM+IGVsZW1lbnQgbWF5IG5vdCBiZSBhY2Nlc3NpYmxlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiLCBcIjIuMS4xXCIsIFwiNC4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHJ1bGVDb250ZXh0LmlubmVySFRNTC50cmltKCkubGVuZ3RoID4gMDtcbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVNYW51YWwoXCJNYW51YWxfMVwiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGNvbnN0IGNhcHRpb25fdHJhY2tfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcImNhcHRpb25fdHJhY2tfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJkb206dmlkZW9cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIkhBQUNfVmlkZW9fSGFzTm9UcmFja1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJjYXB0aW9uX3RyYWNrX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiY2FwdGlvbl90cmFja19leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImNhcHRpb25fdHJhY2tfZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgdGhhdCBjYXB0aW9ucyBhcmUgYXZhaWxhYmxlIGZvciBhbnkgbWVhbmluZ2Z1bCBhdWRpbyBvciBwcm92aWRlIGEgY2FwdGlvbiB0cmFjayBmb3IgdGhlIDx2aWRlbz4gZWxlbWVudFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkEgPHZpZGVvPiBlbGVtZW50IG11c3QgaGF2ZSBhIHRleHQgYWx0ZXJuYXRpdmUgZm9yIGFueSBtZWFuaW5nZnVsIGF1ZGlvIGNvbnRlbnRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMi4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEhUTUxWaWRlb0VsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSBmYWxzZTtcblxuICAgICAgICAvLyBpZ25vcmUgZGVjb3JhdGl2ZSB2aWRlbyBpZiB1c2VyIHVzZXMgYXJpYS1oaWRkZW5cbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtaGlkZGVuXCIpID09PSBcInRydWVcIikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdHJhY2tzID0gcnVsZUNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJ0cmFja1wiKTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRyYWNrcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgcGFzc2VkID0gcGFzc2VkIHx8IHRyYWNrc1tpXS5nZXRBdHRyaWJ1dGUoXCJraW5kXCIpID09PSAnY2FwdGlvbnMnO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNoZWNrcyBmb3IgYWRkaXRpb24gb2YgZHluYW1pYyB0cmFja3NcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0LnRleHRUcmFja3MgJiYgcnVsZUNvbnRleHQudGV4dFRyYWNrcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJ1bGVDb250ZXh0LnRleHRUcmFja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSBwYXNzZWQgfHwgcnVsZUNvbnRleHQudGV4dFRyYWNrc1tpXS5raW5kID09PSAnY2FwdGlvbnMnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IEZyYWdtZW50VXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9mcmFnbWVudFwiO1xuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01XYWxrZXJcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGNvbWJvYm94X2FjdGl2ZV9kZXNjZW5kYW50OiBSdWxlID0ge1xuICAgIGlkOiBcImNvbWJvYm94X2FjdGl2ZV9kZXNjZW5kYW50XCIsXG4gICAgY29udGV4dDogXCJhcmlhOmNvbWJvYm94XCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJjb21ib2JveF9wb3B1cF9yZWZlcmVuY2VcIl0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc1wiOiBcImNvbWJvYm94X2FjdGl2ZV9kZXNjZW5kYW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF9taXNzaW5nXCI6IFwiY29tYm9ib3hfYWN0aXZlX2Rlc2NlbmRhbnQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX25vdF9pbl9wb3B1cFwiOiBcImNvbWJvYm94X2FjdGl2ZV9kZXNjZW5kYW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF9hY3RpdmVfcm9sZV9pbnZhbGlkXCI6IFwiY29tYm9ib3hfYWN0aXZlX2Rlc2NlbmRhbnQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX2FjdGl2ZV9ub3Rfc2VsZWN0ZWRcIjogXCJjb21ib2JveF9hY3RpdmVfZGVzY2VuZGFudC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiY29tYm9ib3hfYWN0aXZlX2Rlc2NlbmRhbnQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXCI6IFwiJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCcgaXMgdXNlZCBhcHByb3ByaWF0ZWx5IGZvciB0aGlzIGNvbWJvYm94XCIsXG4gICAgICAgICAgICBcIkZhaWxfbWlzc2luZ1wiOiBcIlRoZSBlbGVtZW50IHJlZmVyZW5jZWQgYnkgJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCcgXFxcInswfVxcXCIgZG9lcyBub3QgZXhpc3RcIixcbiAgICAgICAgICAgIFwiRmFpbF9ub3RfaW5fcG9wdXBcIjogXCJUaGUgZWxlbWVudCByZWZlcmVuY2VkIGJ5ICdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnIFxcXCJ7MH1cXFwiIGRvZXMgbm90IGV4aXN0IHdpdGhpbiB0aGUgcG9wdXAgcmVmZXJlbmNlZCBieSAnaWQnIFxcXCJ7MX1cXFwiXCIsXG4gICAgICAgICAgICBcIkZhaWxfYWN0aXZlX3JvbGVfaW52YWxpZFwiOiBcIlRoZSAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JyBcXFwiezB9XFxcIiByZWZlcmVuY2VzIGFuIGVsZW1lbnQgd2l0aCB0aGUgcm9sZXMgXFxcInsxfVxcXCIsIHdoaWNoIGRvZXMgbm90IGhhdmUgYSB2YWxpZCBBUklBIHJvbGUgb2YgJ29wdGlvbicsICdncmlkY2VsbCcsICdyb3cnLCBvciAndHJlZWl0ZW0nXCIsXG4gICAgICAgICAgICBcIkZhaWxfYWN0aXZlX25vdF9zZWxlY3RlZFwiOiBcIlRoZSAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JyBcXFwiezB9XFxcIiByZWZlcmVuY2VzIGFuIGVsZW1lbnQgdGhhdCBkb2VzIG5vdCBoYXZlICdhcmlhLXNlbGVjdGVkJyBzZXQgdG8gdHJ1ZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIidhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnIG11c3QgYmUgdXNlZCB0byBkZWZpbmUgZm9jdXMgd2l0aGluIHRoZSBjb21ib2JveCBwb3B1cCwgZXhjZXB0IHdoZW4gdXNpbmcgYSBkaWFsb2cgcG9wdXBcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBjYWNoZSA9IENhY2hlVXRpbC5nZXRDYWNoZShydWxlQ29udGV4dC5vd25lckRvY3VtZW50LCBcImNvbWJvYm94XCIsIHt9KTtcbiAgICAgICAgaWYgKCFjYWNoZSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBjYWNoZWRFbGVtID0gY2FjaGVbY29udGV4dFtcImRvbVwiXS5yb2xlUGF0aF07XG4gICAgICAgIGlmICghY2FjaGVkRWxlbSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGNvbnN0IHsgcG9wdXBFbGVtZW50LCBwb3B1cElkIH0gPSBjYWNoZWRFbGVtO1xuICAgICAgICAvLyBJZiB0aGlzIGlzbid0IGRlZmluZWQsIHRoZSBjb21ib2JveCBpcyBwcm9iYWJseSBjb2xsYXBzZWQuIEEgcmVmZXJlbmNlIGVycm9yIGlzXG4gICAgICAgIC8vIGRldGVjdGVkIGluIGNvbWJvYm94X3BvcHVwX3JlZmVyZW5jZVxuICAgICAgICBpZiAoIXBvcHVwRWxlbWVudCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gVGhpcyBydWxlIG9ubHkgYXBwbGllcyBpZiB0aGUgYWN0aXZlZGVzY2VuZGFudCBpcyBzcGVjaWZpZWRcbiAgICAgICAgbGV0IGFjdGl2ZUlkID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIpO1xuICAgICAgICBpZiAoIWFjdGl2ZUlkIHx8IGFjdGl2ZUlkLnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGFjdGl2ZUVsZW0gPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChydWxlQ29udGV4dCwgYWN0aXZlSWQpO1xuICAgICAgICBpZiAoIWFjdGl2ZUVsZW0pIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfbWlzc2luZ1wiLCBbYWN0aXZlSWRdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBmb3VuZCA9IGZhbHNlO1xuXG4gICAgICAgIC8vIGV4YW1pbmUgdGhlIGNoaWxkcmVuXG4gICAgICAgIGlmIChwb3B1cEVsZW1lbnQpIHtcbiAgICAgICAgICAgIGxldCBudyA9IG5ldyBET01XYWxrZXIocG9wdXBFbGVtZW50KTtcbiAgICAgICAgICAgIHdoaWxlICghZm91bmQgJiYgbncubmV4dE5vZGUoKSAmJiBudy5ub2RlICE9IHBvcHVwRWxlbWVudCAmJiBudy5ub2RlICE9IHBvcHVwRWxlbWVudC5uZXh0U2libGluZykge1xuICAgICAgICAgICAgICAgIGlmIChudy5ub2RlLm5vZGVUeXBlID09PSAxICYmIFZpc1V0aWwuaXNOb2RlVmlzaWJsZShudy5ub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG53LmVsZW0oKS5nZXRBdHRyaWJ1dGUoXCJpZFwiKSA9PT0gYWN0aXZlSWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJldFZhbCA9IFtdO1xuXG4gICAgICAgIGlmICghZm91bmQpIHtcbiAgICAgICAgICAgIHJldFZhbC5wdXNoKFJ1bGVQYXNzKFwiRmFpbF9ub3RfaW5fcG9wdXBcIiwgW2FjdGl2ZUlkLCBwb3B1cElkXSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGFjdGl2ZVJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXMoYWN0aXZlRWxlbSwgdHJ1ZSk7XG4gICAgICAgIGxldCB2YWxpZFJvbGVzID0gW1wib3B0aW9uXCIsIFwiZ3JpZGNlbGxcIiwgXCJyb3dcIiwgXCJ0cmVlaXRlbVwiXS5maWx0ZXIoKHZhbGlkUm9sZSkgPT4gYWN0aXZlUm9sZXMuaW5jbHVkZXModmFsaWRSb2xlKSk7XG4gICAgICAgIGlmICh2YWxpZFJvbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0VmFsLnB1c2goUnVsZUZhaWwoXCJGYWlsX2FjdGl2ZV9yb2xlX2ludmFsaWRcIiwgW2FjdGl2ZUlkLCBhY3RpdmVSb2xlcy5qb2luKFwiLFwiKV0pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhY3RpdmVFbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtc2VsZWN0ZWRcIikgIT09IFwidHJ1ZVwiKSB7XG4gICAgICAgICAgICByZXRWYWwucHVzaChSdWxlRmFpbChcIkZhaWxfYWN0aXZlX25vdF9zZWxlY3RlZFwiLCBbYWN0aXZlSWRdKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmV0VmFsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc1wiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgY29tYm9ib3hfYXV0b2NvbXBsZXRlX3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcImNvbWJvYm94X2F1dG9jb21wbGV0ZV92YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpjb21ib2JveFwiLFxuICAgIGRlcGVuZGVuY2llczogW1wiY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlXCJdLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiY29tYm9ib3hfYXV0b2NvbXBsZXRlXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc1wiOiBcIlBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCIsXG4gICAgICAgICAgICBcIkZhaWxfaW5saW5lXCI6IFwiRmFpbF9pbmxpbmVcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NcIjogXCJjb21ib2JveF9hdXRvY29tcGxldGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJjb21ib2JveF9hdXRvY29tcGxldGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX2lubGluZVwiOiBcImNvbWJvYm94X2F1dG9jb21wbGV0ZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiY29tYm9ib3hfYXV0b2NvbXBsZXRlX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc1wiOiBcIlRoZSBjb21ib2JveCBkb2VzIG5vdCB1c2UgJ2FyaWEtYXV0b2NvbXBsZXRlJyB2YWx1ZSAnXFxcImlubGluZVxcXCInIG5vciBkb2VzIGl0IGhhdmUgJ2FyaWEtYXV0b2NvbXBsZXRlJyBkZWZpbmVkIHdpdGhpbiB0aGUgcG9wdXBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiVGhlIGNvbWJvYm94IGhhcyB0aGUgJ2FyaWEtYXV0b2NvbXBsZXRlJyBhdHRyaWJ1dGUgaW5jb3JyZWN0bHkgc2V0IG9uIGFuIGVsZW1lbnQgd2l0aGluIHRoZSBwb3B1cCByZWZlcmVuY2VkIGJ5IFxcXCJ7MH1cXFwiXCIsXG4gICAgICAgICAgICBcIkZhaWxfaW5saW5lXCI6IFwiVGhlIGNvbWJvYm94IGRvZXMgbm90IHN1cHBvcnQgYW4gJ2FyaWEtYXV0b2NvbXBsZXRlJyBhdHRyaWJ1dGUgdmFsdWUgc2V0IHRvICdcXFwiaW5saW5lXFxcIicgXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQSBjb21ib2JveCB0aGF0IHN1cHBvcnRzIGF1dG9jb21wbGV0aW9uIGJlaGF2aW9yIG11c3QgaGF2ZSB0aGUgJ2FyaWEtYXV0b2NvbXBsZXRlJyBhdHRyaWJ1dGUgb25seSBvbiBpdHMgdGV4dCBpbnB1dCBlbGVtZW50IHdpdGggYSB2YWxpZCB2YWx1ZTsgYSB2YWx1ZSBvZiAnXFxcImlubGluZVxcXCInIGlzIG5vdCBzdXBwb3J0ZWRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3sgXG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLCBcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sIFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTiwgXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FIFxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IGNhY2hlID0gQ2FjaGVVdGlsLmdldENhY2hlKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsIFwiY29tYm9ib3hcIiwge30pO1xuICAgICAgICBpZiAoIWNhY2hlKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IGNhY2hlZEVsZW0gPSBjYWNoZVtjb250ZXh0W1wiZG9tXCJdLnJvbGVQYXRoXTtcbiAgICAgICAgaWYgKCFjYWNoZWRFbGVtKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgeyBwb3B1cElkLCBwb3B1cEVsZW1lbnQgfSA9IGNhY2hlZEVsZW07XG4gICAgICAgIGxldCByZXRWYWwgPSBbXTtcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtYXV0b2NvbXBsZXRlXCIpID09PSBcImlubGluZVwiKSB7XG4gICAgICAgICAgICByZXRWYWwucHVzaChSdWxlRmFpbChcIkZhaWxfaW5saW5lXCIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlOyBcbiAgICAgICAgLy8gZXhhbWluZSB0aGUgY2hpbGRyZW5cbiAgICAgICAgaWYgKHBvcHVwRWxlbWVudCAmJiBWaXNVdGlsLmlzTm9kZVZpc2libGUocG9wdXBFbGVtZW50KSkge1xuICAgICAgICAgICAgLy8gaWYgcG9wdXBFbGVtZW50IGl0c2VsZiBoYXMgXCJhcmlhLWF1dG9jb21wbGV0ZVwiXG4gICAgICAgICAgICBwYXNzZWQgPSAhcG9wdXBFbGVtZW50Lmhhc0F0dHJpYnV0ZShcImFyaWEtYXV0b2NvbXBsZXRlXCIpO1xuICAgICAgICAgICAgLy8gaWYgYW55IGNoaWxkIG9mIHBvcHVwRWxlbWVudCBoYXMgXCJhcmlhLWF1dG9jb21wbGV0ZVwiXG4gICAgICAgICAgICBpZiAocGFzc2VkICYmIHBvcHVwRWxlbWVudC5jaGlsZHJlbiAmJiBwb3B1cEVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCBudyA9IG5ldyBET01XYWxrZXIocG9wdXBFbGVtZW50KTtcbiAgICAgICAgICAgICAgICB3aGlsZSAocGFzc2VkICYmIG53Lm5leHROb2RlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG53Lm5vZGUubm9kZVR5cGUgPT09IDEgJiYgVmlzVXRpbC5pc05vZGVWaXNpYmxlKG53Lm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSAhbncuZWxlbSgpLmhhc0F0dHJpYnV0ZShcImFyaWEtYXV0b2NvbXBsZXRlXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG53LmJFbmRUYWcgJiYgbncubm9kZSA9PT0gcG9wdXBFbGVtZW50Lmxhc3RFbGVtZW50Q2hpbGQpIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldFZhbC5wdXNoKFJ1bGVGYWlsKFwiRmFpbF8xXCIsIFtwb3B1cElkXSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJldFZhbC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc1wiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5cbmZ1bmN0aW9uIHBhdHRlcm5EZXRlY3QoZWxlbTogRWxlbWVudCk6IFN0cmluZyB7XG4gICAgLy8gY2hlY2sgJ2V4cGxpY2l0JyByb2xlIGNvbWJvYm94IGFuZCB0aGF0IGl0IGlzIG5vdCA8c2VsZWN0Pi4gXG4gICAgaWYgKGVsZW0udGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInNlbGVjdFwiICYmIGVsZW0uZ2V0QXR0cmlidXRlKFwicm9sZVwiKSAhPT0gXCJjb21ib2JveFwiKSB7XG4gICAgICAgIHJldHVybiBcImltcGxpY2l0XCI7XG4gICAgfSBlbHNlIGlmIChlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiaW5wdXRcIlxuICAgICAgICAmJiAoIWVsZW0uaGFzQXR0cmlidXRlKFwidHlwZVwiKSB8fCBlbGVtLmdldEF0dHJpYnV0ZShcInR5cGVcIikgPT09IFwidGV4dFwiKVxuICAgICAgICAmJiBlbGVtLmhhc0F0dHJpYnV0ZShcImFyaWEtb3duc1wiKSAmJiAhZWxlbS5oYXNBdHRyaWJ1dGUoXCJhcmlhLWNvbnRyb2xzXCIpKSB7XG4gICAgICAgIC8vIExvb2tzIGxpa2UgdGhpcyBpcyBhbiBBUklBIDEuMCBwYXR0ZXJuLCB3aGljaCB0aGUgQVJJQSAxLjIgc3BlYyBzYXlzIHRvIGNvbnRpbnVlIHRvIGFsbG93XG4gICAgICAgIHJldHVybiBcIjEuMFwiO1xuICAgIH0gZWxzZSBpZiAoZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9PSBcImlucHV0XCJcbiAgICAgICAgJiYgZWxlbS5oYXNBdHRyaWJ1dGUoXCJhcmlhLW93bnNcIikgJiYgIWVsZW0uaGFzQXR0cmlidXRlKFwiYXJpYS1jb250cm9sc1wiKSkge1xuICAgICAgICAvLyBMb29rcyBsaWtlIHRoaXMgaXMgYW4gQVJJQSAxLjEgcGF0dGVybiwgd2hpY2ggdGhlIEFSSUEgMS4yIHNwZWMgc2F5cyBpcyBub3cgaW52YWxpZFxuICAgICAgICByZXR1cm4gXCIxLjFcIjtcbiAgICB9XG4gICAgLy8gQXNzdW1lIHRoZXkncmUgdHJ5aW5nIHRvIGRvIHRoZSBsYXRlc3QsIDEuMiBwYXR0ZXJuXG4gICAgcmV0dXJuIFwiMS4yXCI7XG59XG5cbmV4cG9ydCBjb25zdCBjb21ib2JveF9kZXNpZ25fdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiY29tYm9ib3hfZGVzaWduX3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmNvbWJvYm94XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJjb21ib2JveF92ZXJzaW9uXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18xLjBcIjogXCJQYXNzXzEuMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzEuMVwiOiBcIkZhaWxfMS4xXCIsXG4gICAgICAgICAgICBcIlBhc3NfMS4yXCI6IFwiUGFzc18xLjJcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMS4wXCI6IFwiY29tYm9ib3hfZGVzaWduX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xLjFcIjogXCJjb21ib2JveF9kZXNpZ25fdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJQYXNzXzEuMlwiOiBcImNvbWJvYm94X2Rlc2lnbl92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiY29tYm9ib3hfZGVzaWduX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18xLjBcIjogXCJUaGUgY29tYm9ib3ggZGVzaWduIHBhdHRlcm4gaXMgZGV0ZWN0ZWQgYXMgQVJJQSAxLjAsIHdoaWNoIGlzIGFsbG93ZWQgYnkgQVJJQSAxLjJcIixcbiAgICAgICAgICAgIFwiRmFpbF8xLjFcIjogXCJUaGUgY29tYm9ib3ggZGVzaWduIHBhdHRlcm4gaXMgZGV0ZWN0ZWQgYXMgQVJJQSAxLjEsIHdoaWNoIGlzIG5vdCBhbGxvd2VkIGJ5IEFSSUEgMS4yXCIsXG4gICAgICAgICAgICBcIlBhc3NfMS4yXCI6IFwiVGhlIGNvbWJvYm94IGRlc2lnbiBwYXR0ZXJuIGlzIGRldGVjdGVkIGFzIEFSSUEgMS4yXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGhlIGNvbWJvYm94IGRlc2lnbiBwYXR0ZXJuIG11c3QgYmUgdmFsaWQgZm9yIEFSSUEgMS4yXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7IFxuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSwgXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4yXCJdLCBcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sIFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORSBcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKHJ1bGVDb250ZXh0KSB8fCBDb21tb25VdGlsLmlzTm9kZURpc2FibGVkKHJ1bGVDb250ZXh0KSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHBhdHRlcm4gPSBwYXR0ZXJuRGV0ZWN0KHJ1bGVDb250ZXh0KTtcblxuICAgICAgICAvLyBXZSBkb24ndCBhc3Nlc3MgbmF0aXZlIHNlbGVjdCBlbGVtZW50cyBoZXJlXG4gICAgICAgIGlmIChwYXR0ZXJuID09PSBcImltcGxpY2l0XCIpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHRhZ05hbWUgPSBydWxlQ29udGV4dC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGxldCBleHBhbmRlZCA9IChBcmlhVXRpbC5nZXRBcmlhQXR0cmlidXRlKHJ1bGVDb250ZXh0LCBcImFyaWEtZXhwYW5kZWRcIikgfHwgXCJcIikudHJpbSgpLnRvTG93ZXJDYXNlKCkgPT09IFwidHJ1ZVwiO1xuICAgICAgICBsZXQgZWRpdGFibGUgPSB0YWdOYW1lID09PSBcImlucHV0XCIgJiYgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0eXBlXCIpIHx8IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInR5cGVcIikudG9Mb3dlckNhc2UoKSA9PT0gXCJ0ZXh0XCIpO1xuXG4gICAgICAgIGxldCBrZXkgPSBjb250ZXh0W1wiZG9tXCJdLnJvbGVQYXRoO1xuICAgICAgICBpZiAoa2V5KSB7XG4gICAgICAgICAgICBsZXQgY2FjaGUgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUocnVsZUNvbnRleHQub3duZXJEb2N1bWVudCwgXCJjb21ib2JveFwiLCB7fSk7XG4gICAgICAgICAgICBpZiAoIWNhY2hlKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNhY2hlW2tleV0gPSB7XG4gICAgICAgICAgICAgICAgXCJpbnB1dEVsZW1lbnRcIjogZWRpdGFibGUgPyBydWxlQ29udGV4dCA6IG51bGwsXG4gICAgICAgICAgICAgICAgXCJwYXR0ZXJuXCI6IHBhdHRlcm4sXG4gICAgICAgICAgICAgICAgXCJleHBhbmRlZFwiOiBleHBhbmRlZFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShydWxlQ29udGV4dC5vd25lckRvY3VtZW50LCBcImNvbWJvYm94XCIsIGNhY2hlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIE5vIHhwYXRoP1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGF0dGVybiA9PT0gXCIxLjBcIikge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18xLjBcIik7XG4gICAgICAgIH0gZWxzZSBpZiAocGF0dGVybiA9PT0gXCIxLjFcIikge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xLjFcIik7XG4gICAgICAgIH0gZWxzZSBpZiAocGF0dGVybiA9PT0gXCIxLjJcIikge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18xLjJcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGNvbWJvYm94X2ZvY3VzYWJsZV9lbGVtZW50czogUnVsZSA9IHtcbiAgICBpZDogXCJjb21ib2JveF9mb2N1c2FibGVfZWxlbWVudHNcIixcbiAgICBjb250ZXh0OiBcImFyaWE6Y29tYm9ib3hcIixcbiAgICBkZXBlbmRlbmNpZXM6IFtcImNvbWJvYm94X3BvcHVwX3JlZmVyZW5jZVwiXSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXCI6IFwiY29tYm9ib3hfZm9jdXNhYmxlX2VsZW1lbnRzLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF9ub3RfdGFiYmFibGVcIjogXCJjb21ib2JveF9mb2N1c2FibGVfZWxlbWVudHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX3RhYmJhYmxlX2NoaWxkXCI6IFwiY29tYm9ib3hfZm9jdXNhYmxlX2VsZW1lbnRzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJjb21ib2JveF9mb2N1c2FibGVfZWxlbWVudHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXCI6IFwiRE9NIGZvY3VzIGlzIGFsbG93ZWQgb25seSBvbiB0aGUgY29tYm9ib3ggZWxlbWVudCBhcyByZXF1aXJlZFwiLFxuICAgICAgICAgICAgXCJGYWlsX25vdF90YWJiYWJsZVwiOiBcIlRoZSBjb21ib2JveCBlbGVtZW50IGRvZXMgbm90IGFsbG93IERPTSBmb2N1cyBhcyByZXF1aXJlZFwiLFxuICAgICAgICAgICAgXCJGYWlsX3RhYmJhYmxlX2NoaWxkXCI6IFwiVGhlIHBvcHVwIG9mIHRoZSBjb21ib2JveCBoYXMgRE9NIGZvY3VzIG9yIGhhcyAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JyBkZWZpbmVkLCB3aGljaCBpcyBub3QgYWxsb3dlZFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRhYmJhYmxlIGZvY3VzIGZvciB0aGUgY29tYm9ib3ggbXVzdCBiZSBhbGxvd2VkIG9ubHkgb24gdGhlIHRleHQgaW5wdXQsIGV4Y2VwdCB3aGVuIHVzaW5nIGEgZGlhbG9nIHBvcHVwXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7IFxuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sIFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTiwgXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FIFxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IGNhY2hlID0gQ2FjaGVVdGlsLmdldENhY2hlKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsIFwiY29tYm9ib3hcIiwge30pO1xuICAgICAgICBpZiAoIWNhY2hlKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IGNhY2hlZEVsZW0gPSBjYWNoZVtjb250ZXh0W1wiZG9tXCJdLnJvbGVQYXRoXTtcbiAgICAgICAgaWYgKCFjYWNoZWRFbGVtKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgeyBwb3B1cEVsZW1lbnQsIGV4cGFuZGVkIH0gPSBjYWNoZWRFbGVtO1xuICAgICAgICAvLyBJZiB0aGlzIGlzbid0IGRlZmluZWQsIHRoZSBjb21ib2JveCBpcyBwcm9iYWJseSBjb2xsYXBzZWQuIEEgcmVmZXJlbmNlIGVycm9yIGlzXG4gICAgICAgIC8vIGRldGVjdGVkIGluIGNvbWJvYm94X3BvcHVwX3JlZmVyZW5jZVxuICAgICAgICBpZiAoIXBvcHVwRWxlbWVudCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgY29uc3QgcG9wdXBSb2xlID0gQXJpYVV0aWwuZ2V0Um9sZXMocG9wdXBFbGVtZW50LCB0cnVlKVswXTtcblxuICAgICAgICBsZXQgcmV0VmFsID0gW11cbiAgICAgICAgaWYgKCFDb21tb25VdGlsLmlzVGFiYmFibGUocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICByZXRWYWwucHVzaChSdWxlRmFpbChcIkZhaWxfbm90X3RhYmJhYmxlXCIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE9ubHkgbWFrZXMgc2Vuc2UgdG8gY2hlY2sgdGhlIHBvcHVwIHdoZW4gZXhwYW5kZWRcbiAgICAgICAgLy8gdGhpcyBkb2VzIG5vdCBhcHBseSB0byBkaWFsb2dzLCByZXR1cm4gcGFzcyBzaW5jZSB0aGUgbWFpbiBlbGVtZW50IHdhcyBmb2N1c2FibGUgYWJvdmVcbiAgICAgICAgaWYgKGV4cGFuZGVkID09PSBmYWxzZSB8fCBwb3B1cFJvbGUgPT09IFwiZGlhbG9nXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NcIik7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcblxuICAgICAgICAvLyBleGFtaW5lIHRoZSBjaGlsZHJlblxuICAgICAgICBpZiAocG9wdXBFbGVtZW50ICAmJiBWaXNVdGlsLmlzTm9kZVZpc2libGUocG9wdXBFbGVtZW50KSkge1xuICAgICAgICAgICAgLy8gaWYgcG9wdXBFbGVtZW50IGl0c2VsZiBoYXMgXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIlxuICAgICAgICAgICAgcGFzc2VkID0gIUNvbW1vblV0aWwuaXNUYWJiYWJsZShwb3B1cEVsZW1lbnQpICYmICFBcmlhVXRpbC5nZXRBcmlhQXR0cmlidXRlKHBvcHVwRWxlbWVudCwgXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIik7O1xuICAgICAgICAgICAgLy8gaWYgYW55IGNoaWxkIG9mIHBvcHVwRWxlbWVudCBoYXMgXCJhcmlhLWF1dG9jb21wbGV0ZVwiXG4gICAgICAgICAgICBpZiAocGFzc2VkICYmIHBvcHVwRWxlbWVudC5jaGlsZHJlbiAmJiBwb3B1cEVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCBudyA9IG5ldyBET01XYWxrZXIocG9wdXBFbGVtZW50KTtcbiAgICAgICAgICAgICAgICB3aGlsZSAocGFzc2VkICYmIG53Lm5leHROb2RlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG53Lm5vZGUubm9kZVR5cGUgPT09IDEgJiYgVmlzVXRpbC5pc05vZGVWaXNpYmxlKG53Lm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSAhQ29tbW9uVXRpbC5pc1RhYmJhYmxlKG53Lm5vZGUpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIUFyaWFVdGlsLmdldEFyaWFBdHRyaWJ1dGUobncubm9kZSwgXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobncuYkVuZFRhZyAmJiBudy5ub2RlID09PSBwb3B1cEVsZW1lbnQubGFzdEVsZW1lbnRDaGlsZCkgYnJlYWs7ICAgIFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldFZhbC5wdXNoKFJ1bGVGYWlsKFwiRmFpbF90YWJiYWJsZV9jaGlsZFwiKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmV0VmFsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc1wiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDYWNoZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGNvbWJvYm94X2hhc3BvcHVwX3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcImNvbWJvYm94X2hhc3BvcHVwX3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmNvbWJvYm94XCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJjb21ib2JveF9wb3B1cF9yZWZlcmVuY2VcIl0sXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJjb21ib2JveF9oYXNwb3B1cFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NcIjogXCJQYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfcG9wdXBfcm9sZV9pbnZhbGlkXCI6IFwiRmFpbF9wb3B1cF9yb2xlX2ludmFsaWRcIixcbiAgICAgICAgICAgIFwiRmFpbF9jb21ib2JveF9wb3B1cF9yb2xlX21pc21hdGNoXCI6IFwiRmFpbF9jb21ib2JveF9wb3B1cF9yb2xlX21pc21hdGNoXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXCI6IFwiY29tYm9ib3hfaGFzcG9wdXBfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX3BvcHVwX3JvbGVfaW52YWxpZFwiOiBcImNvbWJvYm94X2hhc3BvcHVwX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF9jb21ib2JveF9wb3B1cF9yb2xlX21pc21hdGNoXCI6IFwiY29tYm9ib3hfaGFzcG9wdXBfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImNvbWJvYm94X2hhc3BvcHVwX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc1wiOiBcIlRoZSAnYXJpYS1jb250cm9scycgKEFSSUEgMS4yKSBvciAnYXJpYS1vd25zJyAoQVJJQSAxLjApIGFwcHJvcHJpYXRlbHkgcmVmZXJlbmNlcyBhIHZhbGlkIHBvcHVwICdpZCcgdmFsdWVcIixcbiAgICAgICAgICAgIFwiRmFpbF9wb3B1cF9yb2xlX2ludmFsaWRcIjogXCJUaGUgJ3JvbGUnIHZhbHVlIFxcXCJ7MH1cXFwiIG9mIHRoZSBwb3B1cCBlbGVtZW50IFxcXCJ7MX1cXFwiIHNob3VsZCBiZSBvbmUgb2YgXFxcImxpc3Rib3hcXFwiLCBcXFwiZ3JpZFxcXCIsIFxcXCJ0cmVlXFxcIiBvciBcXFwiZGlhbG9nXFxcIlwiLFxuICAgICAgICAgICAgXCJGYWlsX2NvbWJvYm94X3BvcHVwX3JvbGVfbWlzbWF0Y2hcIjogXCJUaGUgdmFsdWUgb2YgdGhlIGNvbWJvYm94ICdhcmlhLWhhc3BvcHVwJyBhdHRyaWJ1dGUgXFxcInswfVxcXCIgZG9lcyBub3QgbWF0Y2ggdGhlICdyb2xlJyB2YWx1ZSBvZiB0aGUgcG9wdXAgZWxlbWVudCBcXFwiezF9XFxcIlwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSBjb21ib2JveCBhdHRyaWJ1dGUgJ2FyaWEtaGFzcG9wdXAnIHZhbHVlIG11c3QgYmUgYXBwcm9wcmlhdGUgZm9yIHRoZSByb2xlIG9mIHRoZSBlbGVtZW50IHJlZmVyZW5jZWQgYnkgJ2FyaWEtY29udHJvbHMnIChBUklBIDEuMikgb3IgJ2FyaWEtb3ducycgKEFSSUEgMS4wKVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbeyBcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sIFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSwgXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLCBcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkUgXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBjb25zdCBjYWNoZSA9IENhY2hlVXRpbC5nZXRDYWNoZShydWxlQ29udGV4dC5vd25lckRvY3VtZW50LCBcImNvbWJvYm94XCIsIHt9KTtcbiAgICAgICAgaWYgKCFjYWNoZSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGNvbnN0IGNhY2hlS2V5ID0gY29udGV4dFtcImRvbVwiXS5yb2xlUGF0aDtcbiAgICAgICAgY29uc3QgY2FjaGVkRWxlbSA9IGNhY2hlW2NhY2hlS2V5XTtcbiAgICAgICAgaWYgKCFjYWNoZWRFbGVtKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgeyBwb3B1cEVsZW1lbnQsIHBvcHVwSWQgfSA9IGNhY2hlZEVsZW07XG4gICAgICAgIC8vIElmIHRoaXMgaXNuJ3QgZGVmaW5lZCwgdGhlIGNvbWJvYm94IGlzIHByb2JhYmx5IGNvbGxhcHNlZC4gQSByZWZlcmVuY2UgZXJyb3IgaXNcbiAgICAgICAgLy8gZGV0ZWN0ZWQgaW4gY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlXG4gICAgICAgIGlmICghcG9wdXBFbGVtZW50KSByZXR1cm4gbnVsbDtcbiAgICAgICAgLy8gQ2hlY2sgdGhhdCBwb3B1cCByb2xlIGlzIGxpc3Rib3gsIGdyaWQsIHRyZWUsIG9yIGRpYWxvZyBhbmQgdGhhdCBpdCBtYXRjaGVzIHRoZSBjb21ib2JveFxuICAgICAgICBsZXQgcG9wdXBSb2xlcyA9IEFyaWFVdGlsLmdldFJvbGVzKHBvcHVwRWxlbWVudCwgdHJ1ZSk7XG4gICAgICAgIGxldCB2YWxpZFJvbGVzID0gW1wibGlzdGJveFwiLCBcImdyaWRcIiwgXCJ0cmVlXCIsIFwiZGlhbG9nXCJdLmZpbHRlcigodmFsaWRSb2xlKSA9PiBwb3B1cFJvbGVzLmluY2x1ZGVzKHZhbGlkUm9sZSkpO1xuICAgICAgICBpZiAodmFsaWRSb2xlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfcG9wdXBfcm9sZV9pbnZhbGlkXCIsIFtwb3B1cFJvbGVzLmpvaW4oXCIsXCIpLCBwb3B1cElkXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgcG9wdXBSb2xlID0gdmFsaWRSb2xlc1swXTtcbiAgICAgICAgICAgIGxldCBoYXNwb3B1cFZhbCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtaGFzcG9wdXBcIikgfHwgXCJsaXN0Ym94XCI7XG4gICAgICAgICAgICAvLyBQb3B1cCByb2xlIG11c3QgbWF0Y2ggYXJpYS1oYXNwb3B1cCB1bmxlc3MgcG9wdXBSb2xlIGlzIGxpc3Rib3gsIHRoZW4gYXJpYS1oYXNwb3B1cCBzaG91bGQgbm90IGJlIGRlZmluZWQgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoaGFzcG9wdXBWYWwgIT09IHBvcHVwUm9sZSkge1xuICAgICAgICAgICAgICAgIGlmIChwb3B1cFJvbGUgIT09IFwibGlzdGJveFwiIHx8IHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImFyaWEtaGFzcG9wdXBcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF9jb21ib2JveF9wb3B1cF9yb2xlX21pc21hdGNoXCIsIFtoYXNwb3B1cFZhbCwgcG9wdXBSb2xlXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG5pbXBvcnQgeyBDYWNoZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBjb21ib2JveF9wb3B1cF9yZWZlcmVuY2U6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmNvbWJvYm94XCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJjb21ib2JveF9kZXNpZ25fdmFsaWRcIl0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJjb21ib2JveF9wb3B1cF9yZWZlcmVuY2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJQYXNzXzEuMF9leHBhbmRlZFwiOiBcImNvbWJvYm94X3BvcHVwX3JlZmVyZW5jZS5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NfMS4wX2NvbGxhcHNlZFwiOiBcImNvbWJvYm94X3BvcHVwX3JlZmVyZW5jZS5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NfMS4yX2V4cGFuZGVkXCI6IFwiY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc18xLjJfY29sbGFwc2VkXCI6IFwiY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xLjBfbWlzc2luZ19vd25zXCI6IFwiY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xLjJfbWlzc2luZ19jb250cm9sc1wiOiBcImNvbWJvYm94X3BvcHVwX3JlZmVyZW5jZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMS4wX3BvcHVwX3JlZmVyZW5jZV9taXNzaW5nXCI6IFwiY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xLjJfcG9wdXBfcmVmZXJlbmNlX21pc3NpbmdcIjogXCJjb21ib2JveF9wb3B1cF9yZWZlcmVuY2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX2NvbWJvYm94X2V4cGFuZGVkX2hpZGRlblwiOiBcImNvbWJvYm94X3BvcHVwX3JlZmVyZW5jZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfY29tYm9ib3hfY29sbGFwc2VkX3Zpc2libGVcIjogXCJjb21ib2JveF9wb3B1cF9yZWZlcmVuY2UuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSAnYXJpYS1jb250cm9scycgKGZvciBBUklBIDEuMikgb3IgdGhlICdhcmlhLW93bnMnIChmb3IgQVJJQSAxLjApIGF0dHJpYnV0ZSBvZiB0aGUgZXhwYW5kZWQgY29tYm9ib3ggbXVzdCByZWZlcmVuY2UgYSB2YWxpZCBwb3B1cCAnaWQnIHZhbHVlXCIsXG4gICAgICAgICAgICBcIlBhc3NfMS4wX2V4cGFuZGVkXCI6IFwiVGhlIGNvbWJvYm94IHBvcHVwIHJlZmVyZW5jZWQgYnkgJ2FyaWEtb3ducycgKEFSSUEgMS4wKSBleGlzdHMgYW5kIGlzIHZpc2libGVcIixcbiAgICAgICAgICAgIFwiUGFzc18xLjBfY29sbGFwc2VkXCI6IFwiVGhlIGNvbWJvYm94IHBvcHVwIGluIGl0cyBjb2xsYXBzZWQgc3RhdGUgZG9lcyBub3QgcmVmZXJlbmNlIGFueSB2aXNpYmxlIHBvcHVwIGFzIHJlcXVpcmVkXCIsXG4gICAgICAgICAgICBcIlBhc3NfMS4yX2V4cGFuZGVkXCI6IFwiVGhlIGNvbWJvYm94IHBvcHVwIHJlZmVyZW5jZWQgYnkgJ2FyaWEtY29udHJvbHMnIChBUklBIDEuMikgZXhpc3RzIGFuZCBpcyB2aXNpYmxlXCIsXG4gICAgICAgICAgICBcIlBhc3NfMS4yX2NvbGxhcHNlZFwiOiBcIlRoZSBjb21ib2JveCBwb3B1cCBpbiBpdHMgY29sbGFwc2VkIHN0YXRlIGRvZXMgbm90IHJlZmVyZW5jZSBhbnkgdmlzaWJsZSBwb3B1cCBhcyByZXF1aXJlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzEuMF9taXNzaW5nX293bnNcIjogXCJUaGUgJ2FyaWEtb3ducycgYXR0cmlidXRlIG9mIHRoZSBleHBhbmRlZCBjb21ib2JveCBpcyBtaXNzaW5nXCIsXG4gICAgICAgICAgICBcIkZhaWxfMS4yX21pc3NpbmdfY29udHJvbHNcIjogXCJUaGUgJ2FyaWEtY29udHJvbHMnIGF0dHJpYnV0ZSBvZiB0aGUgZXhwYW5kZWQgY29tYm9ib3ggaXMgbWlzc2luZ1wiLFxuICAgICAgICAgICAgXCJGYWlsXzEuMF9wb3B1cF9yZWZlcmVuY2VfbWlzc2luZ1wiOiBcIlRoZSAnYXJpYS1vd25zJyBhdHRyaWJ1dGUgXFxcInswfVxcXCIgb2YgdGhlIGV4cGFuZGVkIGNvbWJvYm94IGRvZXMgbm90IHJlZmVyZW5jZSBhIHZhbGlkIHBvcHVwICdpZCcgdmFsdWVcIixcbiAgICAgICAgICAgIFwiRmFpbF8xLjJfcG9wdXBfcmVmZXJlbmNlX21pc3NpbmdcIjogXCJUaGUgJ2FyaWEtY29udHJvbHMnIGF0dHJpYnV0ZSBcXFwiezB9XFxcIiBvZiB0aGUgZXhwYW5kZWQgY29tYm9ib3ggZG9lcyBub3QgcmVmZXJlbmNlIGEgdmFsaWQgcG9wdXAgJ2lkJyB2YWx1ZVwiLFxuICAgICAgICAgICAgXCJGYWlsX2NvbWJvYm94X2V4cGFuZGVkX2hpZGRlblwiOiBcIlRoZSBjb21ib2JveCAnYXJpYS1leHBhbmRlZCcgYXR0cmlidXRlIGlzIHRydWUsIGJ1dCB0aGUgY29tYm9ib3ggcG9wdXAgaXMgbm90IHZpc2libGVcIixcbiAgICAgICAgICAgIFwiRmFpbF9jb21ib2JveF9jb2xsYXBzZWRfdmlzaWJsZVwiOiBcIlRoZSBjb21ib2JveCAnYXJpYS1leHBhbmRlZCcgYXR0cmlidXRlIGlzIGZhbHNlLCBidXQgdGhlIGNvbWJvYm94IHBvcHVwIGlzIHZpc2libGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFt7XG4gICAgICAgIFwiNGU4YWI2XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18xLjBfZXhwYW5kZWRcIjogXCJmYWlsXCIsXG4gICAgICAgICAgICBcIlBhc3NfMS4wX2NvbGxhcHNlZFwiOiBcImZhaWxcIixcbiAgICAgICAgICAgIFwiUGFzc18xLjJfZXhwYW5kZWRcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIlBhc3NfMS4yX2NvbGxhcHNlZFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xLjBfbWlzc2luZ19vd25zXCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgICAgICBcIkZhaWxfMS4yX21pc3NpbmdfY29udHJvbHNcIjogXCJmYWlsXCIsXG4gICAgICAgICAgICBcIkZhaWxfMS4wX3BvcHVwX3JlZmVyZW5jZV9taXNzaW5nXCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgICAgICBcIkZhaWxfMS4yX3BvcHVwX3JlZmVyZW5jZV9taXNzaW5nXCI6IFwiZmFpbFwiLFxuICAgICAgICAgICAgXCJGYWlsX2NvbWJvYm94X2V4cGFuZGVkX2hpZGRlblwiOiBcImluYXBwbGljYWJsZVwiLFxuICAgICAgICAgICAgXCJGYWlsX2NvbWJvYm94X2NvbGxhcHNlZF92aXNpYmxlXCI6IFwiaW5hcHBsaWNhYmxlXCJcbiAgICAgICAgfVxuICAgIH1dLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGNhY2hlID0gQ2FjaGVVdGlsLmdldENhY2hlKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsIFwiY29tYm9ib3hcIiwge30pO1xuICAgICAgICBpZiAoIWNhY2hlKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgY2FjaGVLZXkgPSBjb250ZXh0W1wiZG9tXCJdLnJvbGVQYXRoO1xuICAgICAgICBjb25zdCBjYWNoZWRFbGVtID0gY2FjaGVbY2FjaGVLZXldO1xuICAgICAgICBpZiAoIWNhY2hlZEVsZW0pIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCB7IHBhdHRlcm4sIGV4cGFuZGVkIH0gPSBjYWNoZWRFbGVtO1xuXG4gICAgICAgIGxldCBwb3B1cElkO1xuICAgICAgICBsZXQgcG9wdXBFbGVtZW50O1xuICAgICAgICBpZiAocGF0dGVybiA9PT0gXCIxLjBcIikge1xuICAgICAgICAgICAgaWYgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhcmlhLW93bnNcIikpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgY29tYm9ib3ggaXNuJ3QgZXhwYW5kZWQsIHRoaXMgYXR0cmlidXRlIGlzbid0IHJlcXVpcmVkXG4gICAgICAgICAgICAgICAgcmV0dXJuICFleHBhbmRlZCA/IG51bGwgOiBSdWxlRmFpbChcIkZhaWxfMS4wX21pc3Npbmdfb3duc1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBvcHVwSWQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhcmlhLW93bnNcIik7XG4gICAgICAgICAgICBwb3B1cEVsZW1lbnQgPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChydWxlQ29udGV4dCwgcG9wdXBJZCk7XG4gICAgICAgICAgICBpZiAoIXBvcHVwRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIC8vIElmIHRoZSBjb21ib2JveCBpc24ndCBleHBhbmRlZCwgdGhpcyBhdHRyaWJ1dGUgaXNuJ3QgcmVxdWlyZWRcbiAgICAgICAgICAgICAgICByZXR1cm4gIWV4cGFuZGVkID8gbnVsbCA6IFJ1bGVGYWlsKFwiRmFpbF8xLjBfcG9wdXBfcmVmZXJlbmNlX21pc3NpbmdcIiwgW3BvcHVwSWRdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChwYXR0ZXJuID09PSBcIjEuMlwiKSB7XG4gICAgICAgICAgICBpZiAoIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImFyaWEtY29udHJvbHNcIikpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgY29tYm9ib3ggaXNuJ3QgZXhwYW5kZWQsIHRoaXMgYXR0cmlidXRlIGlzbid0IHJlcXVpcmVkXG4gICAgICAgICAgICAgICAgcmV0dXJuICFleHBhbmRlZCA/IG51bGwgOiBSdWxlRmFpbChcIkZhaWxfMS4yX21pc3NpbmdfY29udHJvbHNcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwb3B1cElkID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYXJpYS1jb250cm9sc1wiKTtcbiAgICAgICAgICAgIHBvcHVwRWxlbWVudCA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKHJ1bGVDb250ZXh0LCBwb3B1cElkKTtcbiAgICAgICAgICAgIGlmICghcG9wdXBFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIGNvbWJvYm94IGlzbid0IGV4cGFuZGVkLCB0aGlzIGF0dHJpYnV0ZSBpc24ndCByZXF1aXJlZFxuICAgICAgICAgICAgICAgIHJldHVybiAhZXhwYW5kZWQgPyBudWxsIDogUnVsZUZhaWwoXCJGYWlsXzEuMl9wb3B1cF9yZWZlcmVuY2VfbWlzc2luZ1wiLCBbcG9wdXBJZF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBXZSBoYXZlIGFuIGVsZW1lbnQsIHN0aWNrIGl0IGluIHRoZSBjYWNoZSBhbmQgdGhlbiBjaGVjayBpdHMgcm9sZVxuICAgICAgICBjYWNoZWRFbGVtLnBvcHVwSWQgPSBwb3B1cElkO1xuICAgICAgICBjYWNoZWRFbGVtLnBvcHVwRWxlbWVudCA9IHBvcHVwRWxlbWVudDtcblxuXG4gICAgICAgIGlmIChleHBhbmRlZCAmJiAhVmlzVXRpbC5pc05vZGVWaXNpYmxlKHBvcHVwRWxlbWVudCkpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfY29tYm9ib3hfZXhwYW5kZWRfaGlkZGVuXCIpO1xuICAgICAgICB9IGVsc2UgaWYgKCFleHBhbmRlZCAmJiBWaXNVdGlsLmlzTm9kZVZpc2libGUocG9wdXBFbGVtZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF9jb21ib2JveF9jb2xsYXBzZWRfdmlzaWJsZVwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXR0ZXJuID09PSBcIjEuMFwiKSB7XG4gICAgICAgICAgICBpZiAoZXhwYW5kZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzEuMF9leHBhbmRlZFwiKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18xLjBfY29sbGFwc2VkXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGV4cGFuZGVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18xLjJfZXhwYW5kZWRcIik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMS4yX2NvbGxhcHNlZFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5cbmV4cG9ydCBjb25zdCBkZWJ1Z19wYXRoczogUnVsZSA9IHtcbiAgICBpZDogXCJkZWJ1Z19wYXRoc1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipcIixcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBgYCxcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IGBgXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIlwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFtcIkRFQlVHXCJdLFxuICAgICAgICBudW06IFwiMVwiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LklORk9STUFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfRk9VUlxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgcnVsZUNvbnRleHQuc2V0QXR0cmlidXRlKFwiZG9tUGF0aFwiLCBjb250ZXh0W1wiZG9tXCJdLnJvbGVQYXRoKTtcbiAgICAgICAgcnVsZUNvbnRleHQuc2V0QXR0cmlidXRlKFwiYXJpYVBhdGhcIiwgY29udGV4dFtcImFyaWFcIl0ucm9sZVBhdGgpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGNvbnN0IGRldGVjdG9yX3RhYmJhYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcImRldGVjdG9yX3RhYmJhYmxlXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IGBgLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogYGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBpZDogW1wiRVhURU5TSU9OU1wiXSxcbiAgICAgICAgbnVtOiBcIjFcIiwgLy8gbnVtOiBbIFwiMi40LjRcIiwgXCJ4LnkuelwiIF0gYWxzbyBhbGxvd2VkXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5JTkZPUk1BVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX0ZPVVJcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmICghQ29tbW9uVXRpbC5pc1RhYmJhYmxlKHJ1bGVDb250ZXh0KSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGhpZXJDb250ZXh0ID0gY29udGV4dEhpZXJhcmNoaWVzLmFyaWFbY29udGV4dEhpZXJhcmNoaWVzLmFyaWEubGVuZ3RoIC0gMV07XG4gICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiLCBbXSwgW3tcbiAgICAgICAgICAgIG5hbWU6IGhpZXJDb250ZXh0LmF0dHJpYnV0ZXMubmFtZSxcbiAgICAgICAgICAgIHJvbGU6IGhpZXJDb250ZXh0LnJvbGUsXG4gICAgICAgICAgICB0YWJpbmRleDogcGFyc2VJbnQocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidGFiaW5kZXhcIikgfHwgXCIwXCIpXG4gICAgICAgIH1dKTtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGNvbnN0IGRpcl9hdHRyaWJ1dGVfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZGlyX2F0dHJpYnV0ZV92YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbZGlyXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiVmFsZXJpZV9FbGVtX0RpclZhbGlkXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiZGlyX2F0dHJpYnV0ZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImRpcl9hdHRyaWJ1dGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImRpcl9hdHRyaWJ1dGVfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJJbnZhbGlkIHZhbHVlIHVzZWQgZm9yIHRoZSAnZGlyJyBhdHRyaWJ1dGVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCInZGlyJyBhdHRyaWJ1dGUgdmFsdWUgbXVzdCBiZSBcXFwibHRyXFxcIiwgXFxcInJ0bFxcXCIsIG9yIFxcXCJhdXRvXFxcIlwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgZGlyU3RyID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiZGlyXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGxldCBwYXNzZWQgPSBkaXJTdHIgPT0gXCJsdHJcIiB8fCBkaXJTdHIgPT0gXCJydGxcIiB8fCBkaXJTdHIgPT0gXCJhdXRvXCI7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlTWFudWFsLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBkb3dubG9hZF9rZXlib2FyZF9jb250cm9sbGFibGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZG93bmxvYWRfa2V5Ym9hcmRfY29udHJvbGxhYmxlXCIsXG4gICAgY29udGV4dDogXCJkb206YVtocmVmXSxkb206YXJlYVtocmVmXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiSEFBQ19NZWRpYV9Eb2N1bWVudFRyaWdnZXIyXCI6IHtcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJNYW51YWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJkb3dubG9hZF9rZXlib2FyZF9jb250cm9sbGFibGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImRvd25sb2FkX2tleWJvYXJkX2NvbnRyb2xsYWJsZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwiVmVyaWZ5IHRoYXQgdGhlIGZpbGUgZG93bmxvYWQgbWVjaGFuaXNtIGRvZXMgbm90IGNhdXNlIGEga2V5Ym9hcmQgdHJhcFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkZpbGUgZG93bmxvYWQgbWVjaGFuaXNtcyBzaG91bGQgYmUga2V5Ym9hcmQtb3BlcmFibGUgYW5kIHByZXNlcnZlIHBhZ2UgZm9jdXMgbG9jYXRpb25cIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuMS4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgaHJlZiA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImhyZWZcIik7XG4gICAgICAgIGxldCBleHQgPSBDb21tb25VdGlsLmdldEZpbGVFeHQoaHJlZik7XG4gICAgICAgIGxldCBwYXNzZWQgPSAhW1wiLmRvY3hcIiwgXCIuZG9jXCIsIFwiLnBkZlwiLCBcIi5vZHRcIl0uaW5jbHVkZXMoZXh0KTtcbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZU1hbnVhbChcIk1hbnVhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSwgUnVsZVBvdGVudGlhbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGRyYWdnYWJsZV9hbHRlcm5hdGl2ZV9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZHJhZ2dhYmxlX2FsdGVybmF0aXZlX2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbZHJhZ2dhYmxlXVwiLFxuICAgIGRlcGVuZGVuY2llczogW10sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJkcmFnZ2FibGVfYWx0ZXJuYXRpdmVfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIC8vIFwicGFzc19hbHRlcm5hdGl2ZVwiOiBcImRyYWdnYWJsZV9hbHRlcm5hdGl2ZV9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJwYXNzX3VuZHJhZ2dhYmxlXCI6IFwiZHJhZ2dhYmxlX2FsdGVybmF0aXZlX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9hbHRlcm5hdGl2ZVwiOiBcImRyYWdnYWJsZV9hbHRlcm5hdGl2ZV9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIkEgZHJhZ2dhYmxlIGVsZW1lbnQgbXVzdCBoYXZlIGEgXFxcInNpbmdsZSBwb2ludGVyXFxcIiBhbHRlcm5hdGl2ZVwiLFxuICAgICAgICAgICAgLy8gXCJwYXNzX2FsdGVybmF0aXZlXCI6IFwiVGhlIGRyYWdnYWJsZSBlbGVtZW50IFxcXCJ7MH1cXFwiIGhhcyBhIFxcXCJzaW5nbGUgcG9pbnRlclxcXCIgYWx0ZXJuYXRpdmVcIixcbiAgICAgICAgICAgIFwicGFzc191bmRyYWdnYWJsZVwiOiBcIlRoZSBlbGVtZW50IFxcXCJ7MH1cXFwiIGlzIG5vdCBkcmFnZ2FibGVcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX2FsdGVybmF0aXZlXCI6IFwiRW5zdXJlIHRoZSBkcmFnZ2FibGUgZWxlbWVudCBcXFwiezB9XFxcIiBoYXMgYSBcXFwic2luZ2xlIHBvaW50ZXJcXFwiIGFsdGVybmF0aXZlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbIFwiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIG51bTogW1wiMi41LjdcIl0sXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgY29uc3Qgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvY2FsZUxvd2VyQ2FzZSgpOyBcbiAgICAgICAgICBcbiAgICAgICAgLy9pZ25vcmUgY2VydGFpbiBlbGVtZW50c1xuICAgICAgICBpZiAoQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgW1wicHJlXCIsIFwiY29kZVwiLCBcInNjcmlwdFwiLCBcIm1ldGFcIl0pICE9PSBudWxsIFxuICAgICAgICAgICAgfHwgbm9kZU5hbWUgPT09IFwiYm9keVwiIHx8IG5vZGVOYW1lID09PSBcImh0bWxcIiApXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJkcmFnZ2FibGVcIikgPT09ICd0cnVlJykgXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF9hbHRlcm5hdGl2ZVwiLCBbbm9kZU5hbWVdKTtcbiAgICAgICAgZWxzZSBpZiAocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiZHJhZ2dhYmxlXCIpID09PSAnZmFsc2UnKSBcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NfdW5kcmFnZ2FibGVcIiwgW25vZGVOYW1lXSk7XG4gICAgICAgIGVsc2UgXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5pbXBvcnQgeyBBUklBRGVmaW5pdGlvbnMgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBRGVmaW5pdGlvbnNcIjtcbmltcG9ydCB7IEFSSUFNYXBwZXIgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBTWFwcGVyXCI7XG5pbXBvcnQgeyBBY2NOYW1lVXRpbCB9IGZyb20gXCIuLi91dGlsL0FjY05hbWVVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBlbGVtZW50X2FjY2Vzc2tleV9sYWJlbGxlZDogUnVsZSA9IHtcbiAgICBpZDogXCJlbGVtZW50X2FjY2Vzc2tleV9sYWJlbGxlZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbYWNjZXNza2V5XVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiSEFBQ19BY2Nlc3NrZXlfTmVlZExhYmVsXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImVsZW1lbnRfYWNjZXNza2V5X2xhYmVsbGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJlbGVtZW50X2FjY2Vzc2tleV9sYWJlbGxlZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZWxlbWVudF9hY2Nlc3NrZXlfbGFiZWxsZWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlRoZSBlbGVtZW50IHdpdGggYW4gYXNzaWduZWQgJ2FjY2Vzc2tleScgYXR0cmlidXRlIGRvZXMgbm90IGhhdmUgYW4gYXNzb2NpYXRlZCBsYWJlbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkFuIGVsZW1lbnQgd2l0aCBhbiBhc3NpZ25lZCAnYWNjZXNza2V5JyBhdHRyaWJ1dGUgbXVzdCBoYXZlIGFuIGFzc29jaWF0ZWQgbGFiZWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3sgXG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLCBcbiAgICAgICAgXCJudW1cIjogW1wiMy4zLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sIFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORSBcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IGlzIGhpZGRlbiBvciBkaXNhYmxlZFxuICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShydWxlQ29udGV4dCkgfHwgQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgLy9za2lwIGlmIHRoZSBlbGVtZW50IGlzIHRhYmJhYmxlLCBpdCdzIGNvdmVyZWQgYnkgb3RoZXIgcnVsZXNcbiAgICAgICAgaWYgKENvbW1vblV0aWwuaXNUYWJiYWJsZShydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgbGV0IHJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXMocnVsZUNvbnRleHQsIHRydWUpO1xuICAgICAgICAvL3NraXAgdGhlIG5hdGl2ZSBlbGVtZW50LCBtb3N0bHkgdGV4dCBlbGVtZW50c1xuICAgICAgICBpZiAoIXJvbGVzIHx8IHJvbGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICAgIGxldCBwYXR0ZXJucyA9IEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlc1swXV1cbiAgICAgICAgaWYgKCFwYXR0ZXJucyB8fCAhcGF0dGVybnMubmFtZUZyb20pIFxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIC8vIGlnbm9yZSBpZiBhY2Nlc3NibGUgbmFtZSBpcyByZXF1aXJlZCAoY2hlY2tlZCBpbiBvdGhlciBydWxlcykgb3IgcHJvaGliaXRlZCAodGV4dCBlbGVtZW50KSAgICBcbiAgICAgICAgaWYgKHBhdHRlcm5zLm5hbWVSZXF1aXJlZCB8fCAhcGF0dGVybnMubmFtZUZyb20gfHwgcGF0dGVybnMubmFtZUZyb20uaW5jbHVkZXMoXCJwcm9oaWJpdGVkXCIpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBcbiAgICAgICAgLy9zcGVjaWFsIGNhc2U6IGxlZ2VuZCwgYXMgYSBjaGlsZCBvZiBhIGZpZWxkc2V0LCBkZWxlZ2F0ZSB0aGUgYWNjZXNza2V5IGNvbW1hbmQgdG8gdGhlIGZpZWxkIG9mIHRoZSBmaWVsZHNldCB3aGljaCBpcyBjb3ZlcmVkIGJ5IG90aGVyIHJ1bGVzIFxuICAgICAgICBpZiAocnVsZUNvbnRleHQucGFyZW50RWxlbWVudCAmJiBydWxlQ29udGV4dC5wYXJlbnRFbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdmaWVsZHNldCcpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgLy8gY2hlY2sgaWYgYWNjZXNzaWJsZSBuYW1lIGV4aXN0c1xuICAgICAgICBjb25zdCBwYWlyID0gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKHBhaXIgJiYgcGFpci5uYW1lICYmIHBhaXIubmFtZS50cmltKCkubGVuZ3RoID4gMClcbiAgICAgICAgLy9pZiAoQVJJQU1hcHBlci5jb21wdXRlTmFtZShydWxlQ29udGV4dCkudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDYWNoZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGVsZW1lbnRfYWNjZXNza2V5X3VuaXF1ZTogUnVsZSA9IHtcbiAgICBpZDogXCJlbGVtZW50X2FjY2Vzc2tleV91bmlxdWVcIixcbiAgICBjb250ZXh0OiBcImRvbToqW2FjY2Vzc2tleV1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9FbGVtX1VuaXF1ZUFjY2Vzc0tleVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImVsZW1lbnRfYWNjZXNza2V5X3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImVsZW1lbnRfYWNjZXNza2V5X3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZWxlbWVudF9hY2Nlc3NrZXlfdW5pcXVlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiJ2FjY2Vzc2tleScgYXR0cmlidXRlIHZhbHVlIG9uIHRoZSBlbGVtZW50IGlzIG5vdCB1bmlxdWVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCInYWNjZXNza2V5JyBhdHRyaWJ1dGUgdmFsdWVzIG9uIGVhY2ggZWxlbWVudCBtdXN0IGJlIHVuaXF1ZSBmb3IgdGhlIHBhZ2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIkhUTUxcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgbWFwID0gQ2FjaGVVdGlsLmdldENhY2hlKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsIFwiZWxlbWVudF9hY2Nlc3NrZXlfdW5pcXVlXCIsIHt9KTtcbiAgXG4gICAgICAgIGxldCBrZXkgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhY2Nlc3NrZXlcIik7XG5cbiAgICAgICAgbGV0IHBhc3NlZCA9ICEoa2V5IGluIG1hcCk7XG4gICAgICAgIG1hcFtrZXldID0gdHJ1ZTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuY29uc3QgREVQUkVDQVRFRF9FTEVNRU5UUyA9IFtcbiAgICAvKiogb3JpZ2luYWwgKi9cbiAgICBcImFwcGxldFwiLCBcImJhc2Vmb250XCIsIFwiY2VudGVyXCIsIFwiZGlyXCIsIFwiZm9udFwiLCBcImlzaW5kZXhcIiwgXCJsaXN0aW5nXCIsXG4gICAgXCJwbGFpbnRleHRcIiwgXCJzcGFjZXJcIiwgXCJzXCIsIFwic3RyaWtlXCIsIFwidVwiLCBcInhtcFwiLFxuICAgIC8qKiBhZGRlZCBmcm9tIGh0dHBzOi8vZGV2LnczLm9yZy9odG1sNS9wZi1zdW1tYXJ5L29ic29sZXRlLmh0bWwgKi9cbiAgICBcImFjcm9ueW1cIiwgXCJmcmFtZVwiLCBcImZyYW1lc2V0XCIsIFwibm9mcmFtZXNcIiwgXCJub2VtYmVkXCIsIFwiYmlnXCIsIFwiYmxpbmtcIiwgXCJtYXJxdWVlXCIsIFwidHRcIixcblxuXVxuXG5jb25zdCBERVBSRUNBVEVEX0hUTUxfR0xPQkFMX0FUVFJJQlVURVMgPSBbXG4gICAgLyoqIG9yaWdpbmFsICovXG4gICAgXCJhbGlnblwiLCBcImxpbmtcIiwgXCJhcmNoaXZlXCIsIFwiYmFja2dyb3VuZFwiLCBcImJnY29sb3JcIiwgXCJjbGVhclwiLCBcImNvZGVcIiwgXCJjb2xvclwiLFxuICAgIFwiY29tcGFjdFwiLCBcImZhY2VcIiwgXCJoc3BhY2VcIiwgXCJsYW5ndWFnZVwiLCBcImxpbmtcIiwgXCJub3NoYWRlXCIsIFwibm93cmFwXCIsIFwib2JqZWN0XCIsXG4gICAgXCJwcm9tcHRcIiwgXCJzdGFydFwiLCBcInRleHRcIiwgXCJ2ZXJzaW9uXCIsIFwidmxpbmtcIiwgXCJ2c3BhY2VcIlxuXVxuXG5jb25zdCBERVBSRUNBVEVEX0VMRU1FTlRfQVRUUklCVVRFUyA9IHtcbiAgICAvKiogb3JpZ2luYWwgKi9cbiAgICBcInRkXCI6IFtcImhlaWdodFwiLCBcIndpZHRoXCIsIFwiYWJiclwiLCBcImF4aXNcIiwgXCJjaGFyXCIsIFwiY2hhcm9mZlwiLCBcImhlaWdodFwiLCBcIm5vd3JhcFwiLCBcInZhbGlnblwiLCBcIndpZHRoXCIsIFwiYWxpZ25cIiwgXCJiZ2NvbG9yXCJdLFxuICAgIFwidGhcIjogW1wiaGVpZ2h0XCIsIFwid2lkdGhcIiwgXCJhYmJyXCIsIFwiYXhpc1wiLCBcImNoYXJvZmZcIiwgXCJoZWlnaHRcIiwgXCJiZ2NvbG9yXCIsIFwiYWxpZ25cIiwgXCJub3dyYXBcIiwgXCJjaGFyXCIsIFwidmFsaWduXCIsIFwid2lkdGhcIl0sXG4gICAgXCJsaVwiOiBbXCJ0eXBlXCIsIFwidmFsdWVcIiwgXCJ0eXBlXCJdLFxuICAgIFwidWxcIjogW1widHlwZVwiLCBcImNvbXBhY3RcIl0sXG4gICAgXCJwcmVcIjogW1wid2lkdGhcIl0sXG5cbiAgICAvKiogYWRkZWQgZnJvbSBodHRwczovL2Rldi53My5vcmcvaHRtbDUvcGYtc3VtbWFyeS9vYnNvbGV0ZS5odG1sICovXG4gICAgXCJtZXRhXCI6IFtcImh0dHAtZXF1aXZcIl0sXG4gICAgXCJhXCI6IFtcImNoYXJzZXRcIiwgXCJjb29yZHNcIiwgXCJzaGFwZVwiLCBcInJldlwiLCBcInNjaGVtZVwiXSxcbiAgICBcImxpbmtcIjogW1wicmV2XCIsIFwiY2hhcnNldFwiLCBcInRhcmdldFwiXSxcbiAgICBcImltZ1wiOiBbXCJuYW1lXCIsIFwibG9uZ2Rlc2NcIiwgXCJhbGlnblwiLCBcImhzcGFjZVwiLCBcInZzcGFjZVwiLCBcImJvcmRlclwiXSxcbiAgICBcImFyZWFcIjogW1wibm9ocmVmXCJdLFxuICAgIFwiaGVhZFwiOiBbXCJwcm9maWxlXCJdLFxuICAgIFwiaHRtbFwiOiBbXCJ2ZXJzaW9uXCJdLFxuICAgIFwiaWZyYW1lXCI6IFtcImxvbmdkZXNjXCIsIFwiYWxpZ25cIiwgXCJmcmFtZWJvcmRlclwiLCBcIm1hcmdpbmhlaWdodFwiLCBcIm1hcmdpbndpZHRoXCIsIFwic2Nyb2xsaW5nXCJdLFxuICAgIFwib2JqZWN0XCI6IFtcImFyY2hpdmVcIiwgXCJjb2RlXCIsIFwiY29kZWJhc2VcIiwgXCJjb2RldHlwZVwiLCBcImRlY2xhcmVcIiwgXCJzdGFuZGJ5XCIsIFwiYWxpZ25cIiwgXCJoc3BhY2VcIiwgXCJ2c3BhY2VcIiwgXCJib3JkZXJcIl0sXG4gICAgXCJwYXJhbVwiOiBbXCJ0eXBlXCIsIFwidmFsdWV0eXBlXCJdLFxuICAgIFwic2NyaXB0XCI6IFtcImxhbmd1YWdlXCJdLFxuICAgIFwiYm9keVwiOiBbXCJhbGlua1wiLCBcImJhY2tncm91bmRcIiwgXCJiZ2NvbG9yXCIsIFwibGlua1wiLCBcInRleHRcIiwgXCJ2bGlua1wiXSxcbiAgICBcImJyXCI6IFtcImNsZWFyXCJdLFxuICAgIFwiY2FwdGlvblwiOiBbXCJhbGlnblwiXSxcbiAgICBcImNvbFwiOiBbXCJhbGlnblwiLCBcImNoYXJcIiwgXCJjaGFyb2ZmXCIsIFwidmFsaWduXCIsIFwid2lkdGhcIl0sXG4gICAgXCJkaXZcIjogW1wiYWxpZ25cIl0sXG4gICAgXCJkbFwiOiBbXCJjb21wYWN0XCJdLFxuICAgIFwiaHJcIjogW1wiYWxpZ25cIiwgXCJub3NoYWRlXCIsIFwic2l6ZVwiLCBcIndpZHRoXCIsIFwiYWxpZ25cIl0sXG4gICAgXCJoMlwiOiBbXCJhbGlnblwiXSxcbiAgICBcImgzXCI6IFtcImFsaWduXCJdLFxuICAgIFwiaDRcIjogW1wiYWxpZ25cIl0sXG4gICAgXCJoNVwiOiBbXCJhbGlnblwiXSxcbiAgICBcImg2XCI6IFtcImFsaWduXCJdLFxuICAgIFwiaW5wdXRcIjogW1wiYWxpZ25cIiwgXCJ1c2VtYXBcIl0sXG4gICAgXCJsZWdlbmRcIjogW1wiYWxpZ25cIl0sXG4gICAgXCJtZW51XCI6IFtcImNvbXBhY3RcIl0sXG4gICAgXCJvbFwiOiBbXCJjb21wYWN0XCIsIFwidHlwZVwiLCBcInR5cGVcIl0sXG4gICAgXCJwXCI6IFtcImFsaWduXCJdLFxuICAgIFwidGFibGVcIjogW1wiYmdjb2xvclwiLCBcImNlbGxwYWRkaW5nXCIsIFwiY2VsbHNwYWNpbmdcIiwgXCJmcmFtZVwiLCBcInJ1bGVzXCIsIFwid2lkdGhcIiwgXCJhbGlnblwiXSxcbiAgICBcInRib2R5XCI6IFtcImFsaWduXCIsIFwiY2hhclwiLCBcInZhbGlnblwiLCBcImNoYXJvZmZcIl0sXG4gICAgXCJ0Zm9vdFwiOiBbXCJhbGlnblwiLCBcImNoYXJvZmZcIiwgXCJjaGFyXCIsIFwidmFsaWduXCJdLFxuICAgIFwidGhlYWRcIjogW1wiY2hhclwiLCBcImNoYXJvZmZcIiwgXCJ2YWxpZ25cIiwgXCJhbGlnblwiXSxcbiAgICBcInRyXCI6IFtcImFsaWduXCIsIFwiYmdjb2xvclwiLCBcImNoYXJcIiwgXCJjaGFyb2ZmXCIsIFwidmFsaWduXCJdXG59XG5cbmZ1bmN0aW9uIGFycmF5VG9Db250ZXh0U3RyKG9iaiwgdHlwZSkge1xuICAgIGxldCBzdHIgPSBcIlwiO1xuICAgIGZvciAoY29uc3QgcHJvcCBvZiBvYmopIHtcbiAgICAgICAgaWYgKHN0ciAhPT0gJycgJiYgIXN0ci5lbmRzV2l0aCgnLCAnKSkgc3RyICs9IFwiLCBcIjtcbiAgICAgICAgaWYgKHR5cGUgPT09ICdIVE1MX0VMRU1FTlRTJylcbiAgICAgICAgICAgIHN0ciArPSAnZG9tOicgKyBwcm9wO1xuICAgICAgICBlbHNlIGlmICh0eXBlID09PSAnSFRNTF9BVFRSSUJVVEVTJylcbiAgICAgICAgICAgIHN0ciArPSAnZG9tOipbJyArIHByb3AgKyBcIl1cIjtcbiAgICB9XG4gICAgcmV0dXJuIHN0cjtcbn1cblxuZnVuY3Rpb24gb2JqVG9Db250ZXh0U3RyKG9iaiwgdHlwZTogc3RyaW5nKSB7XG4gICAgbGV0IHN0ciA9IFwiXCI7XG4gICAgZm9yIChjb25zdCBwcm9wIGluIG9iaikge1xuICAgICAgICBpZiAoc3RyICE9PSAnJyAmJiAhc3RyLmVuZHNXaXRoKCcsICcpKSBzdHIgKz0gXCIsIFwiO1xuICAgICAgICBpZiAodHlwZSA9PT0gJ0hUTUxfRUxFTUVOVF9BVFRSSUJVVEVTJykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIG9ialtwcm9wXSBhcyBTdHJpbmdbXSkge1xuICAgICAgICAgICAgICAgIGlmIChzdHIgIT09ICcnICYmICFzdHIuZW5kc1dpdGgoXCIsIFwiKSkgc3RyICs9IFwiLCBcIjtcbiAgICAgICAgICAgICAgICBzdHIgKz0gJ2RvbTonICsgcHJvcCArICdbJyArIGl0ZW0gKyAnXSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gXG4gICAgfVxuICAgIHJldHVybiBzdHI7XG59XG5cbmV4cG9ydCBjb25zdCBlbGVtZW50X2F0dHJpYnV0ZV9kZXByZWNhdGVkOiBSdWxlID0ge1xuICAgIGlkOiBcImVsZW1lbnRfYXR0cmlidXRlX2RlcHJlY2F0ZWRcIixcbiAgICBjb250ZXh0OiBcImRvbTphcHBsZXQsIGRvbTpiYXNlZm9udCwgZG9tOmNlbnRlciwgZG9tOmRpciwgZG9tOmZvbnQsIGRvbTppc2luZGV4LCBkb206bGlzdGluZywgZG9tOm1lbnUsIGRvbTpwbGFpbnRleHQsIGRvbTpzcGFjZXIsIGRvbTpzLCBkb206c3RyaWtlLCBkb206dSwgZG9tOnhtcCwgZG9tOmFjcm9ueW0sIGRvbTpmcmFtZSwgZG9tOmZyYW1lc2V0LCBkb206bm9mcmFtZXMsIGRvbTpub2VtYmVkLCBkb206YmlnLCBkb206YmxpbmssIGRvbTptYXJxdWVlLCBkb206dHROYU5kb206KlthbGlnbl0sIGRvbToqW2xpbmtdLCBkb206KlthcmNoaXZlXSwgZG9tOipbYmFja2dyb3VuZF0sIGRvbToqW2JnY29sb3JdLCBkb206KltjbGVhcl0sIGRvbToqW2NvZGVdLCBkb206Kltjb2xvcl0sIGRvbToqW2NvbXBhY3RdLCBkb206KltmYWNlXSwgZG9tOipbaHNwYWNlXSwgZG9tOipbbGFuZ3VhZ2VdLCBkb206KltsaW5rXSwgZG9tOipbbm9zaGFkZV0sIGRvbToqW25vd3JhcF0sIGRvbToqW29iamVjdF0sIGRvbToqW3Byb21wdF0sIGRvbToqW3N0YXJ0XSwgZG9tOipbdGV4dF0sIGRvbToqW3ZlcnNpb25dLCBkb206Klt2bGlua10sIGRvbToqW3ZzcGFjZV1OYU5kb206dGRbaGVpZ2h0XSwgZG9tOnRkW3dpZHRoXSwgZG9tOnRkW2FiYnJdLCBkb206dGRbYXhpc10sIGRvbTp0ZFtjaGFyXSwgZG9tOnRkW2NoYXJvZmZdLCBkb206dGRbaGVpZ2h0XSwgZG9tOnRkW25vd3JhcF0sIGRvbTp0ZFt2YWxpZ25dLCBkb206dGRbd2lkdGhdLCBkb206dGRbYWxpZ25dLCBkb206dGRbYmdjb2xvcl0sIGRvbTp0aFtoZWlnaHRdLCBkb206dGhbd2lkdGhdLCBkb206dGhbYWJicl0sIGRvbTp0aFtheGlzXSwgZG9tOnRoW2NoYXJvZmZdLCBkb206dGhbaGVpZ2h0XSwgZG9tOnRoW2JnY29sb3JdLCBkb206dGhbYWxpZ25dLCBkb206dGhbbm93cmFwXSwgZG9tOnRoW2NoYXJdLCBkb206dGhbdmFsaWduXSwgZG9tOnRoW3dpZHRoXSwgZG9tOmxpW3R5cGVdLCBkb206bGlbdmFsdWVdLCBkb206bGlbdHlwZV0sIGRvbTp1bFt0eXBlXSwgZG9tOnVsW2NvbXBhY3RdLCBkb206cHJlW3dpZHRoXSwgZG9tOm1ldGFbaHR0cC1lcXVpdl0sIGRvbTphW2NoYXJzZXRdLCBkb206YVtjb29yZHNdLCBkb206YVtzaGFwZV0sIGRvbTphW3Jldl0sIGRvbTphW3NjaGVtZV0sIGRvbTpsaW5rW3Jldl0sIGRvbTpsaW5rW2NoYXJzZXRdLCBkb206bGlua1t0YXJnZXRdLCBkb206aW1nW25hbWVdLCBkb206aW1nW2xvbmdkZXNjXSwgZG9tOmltZ1thbGlnbl0sIGRvbTppbWdbaHNwYWNlXSwgZG9tOmltZ1t2c3BhY2VdLCBkb206aW1nW2JvcmRlcl0sIGRvbTphcmVhW25vaHJlZl0sIGRvbTpoZWFkW3Byb2ZpbGVdLCBkb206aHRtbFt2ZXJzaW9uXSwgZG9tOmlmcmFtZVtsb25nZGVzY10sIGRvbTppZnJhbWVbYWxpZ25dLCBkb206aWZyYW1lW2ZyYW1lYm9yZGVyXSwgZG9tOmlmcmFtZVttYXJnaW5oZWlnaHRdLCBkb206aWZyYW1lW21hcmdpbndpZHRoXSwgZG9tOmlmcmFtZVtzY3JvbGxpbmddLCBkb206b2JqZWN0W2FyY2hpdmVdLCBkb206b2JqZWN0W2NvZGVdLCBkb206b2JqZWN0W2NvZGViYXNlXSwgZG9tOm9iamVjdFtjb2RldHlwZV0sIGRvbTpvYmplY3RbZGVjbGFyZV0sIGRvbTpvYmplY3Rbc3RhbmRieV0sIGRvbTpvYmplY3RbYWxpZ25dLCBkb206b2JqZWN0W2hzcGFjZV0sIGRvbTpvYmplY3RbdnNwYWNlXSwgZG9tOm9iamVjdFtib3JkZXJdLCBkb206cGFyYW1bdHlwZV0sIGRvbTpwYXJhbVt2YWx1ZXR5cGVdLCBkb206c2NyaXB0W2xhbmd1YWdlXSwgZG9tOmJvZHlbYWxpbmtdLCBkb206Ym9keVtiYWNrZ3JvdW5kXSwgZG9tOmJvZHlbYmdjb2xvcl0sIGRvbTpib2R5W2xpbmtdLCBkb206Ym9keVt0ZXh0XSwgZG9tOmJvZHlbdmxpbmtdLCBkb206YnJbY2xlYXJdLCBkb206Y2FwdGlvblthbGlnbl0sIGRvbTpjb2xbYWxpZ25dLCBkb206Y29sW2NoYXJdLCBkb206Y29sW2NoYXJvZmZdLCBkb206Y29sW3ZhbGlnbl0sIGRvbTpjb2xbd2lkdGhdLCBkb206ZGl2W2FsaWduXSwgZG9tOmRsW2NvbXBhY3RdLCBkb206aHJbYWxpZ25dLCBkb206aHJbbm9zaGFkZV0sIGRvbTpocltzaXplXSwgZG9tOmhyW3dpZHRoXSwgZG9tOmhyW2FsaWduXSwgZG9tOmgyW2FsaWduXSwgZG9tOmgzW2FsaWduXSwgZG9tOmg0W2FsaWduXSwgZG9tOmg1W2FsaWduXSwgZG9tOmg2W2FsaWduXSwgZG9tOmlucHV0W2FsaWduXSwgZG9tOmlucHV0W3VzZW1hcF0sIGRvbTpsZWdlbmRbYWxpZ25dLCBkb206bWVudVtjb21wYWN0XSwgZG9tOm9sW2NvbXBhY3RdLCBkb206b2xbdHlwZV0sIGRvbTpvbFt0eXBlXSwgZG9tOnBbYWxpZ25dLCBkb206dGFibGVbYmdjb2xvcl0sIGRvbTp0YWJsZVtjZWxscGFkZGluZ10sIGRvbTp0YWJsZVtjZWxsc3BhY2luZ10sIGRvbTp0YWJsZVtmcmFtZV0sIGRvbTp0YWJsZVtydWxlc10sIGRvbTp0YWJsZVt3aWR0aF0sIGRvbTp0YWJsZVthbGlnbl0sIGRvbTp0Ym9keVthbGlnbl0sIGRvbTp0Ym9keVtjaGFyXSwgZG9tOnRib2R5W3ZhbGlnbl0sIGRvbTp0Ym9keVtjaGFyb2ZmXSwgZG9tOnRmb290W2FsaWduXSwgZG9tOnRmb290W2NoYXJvZmZdLCBkb206dGZvb3RbY2hhcl0sIGRvbTp0Zm9vdFt2YWxpZ25dLCBkb206dGhlYWRbY2hhcl0sIGRvbTp0aGVhZFtjaGFyb2ZmXSwgZG9tOnRoZWFkW3ZhbGlnbl0sIGRvbTp0aGVhZFthbGlnbl0sIGRvbTp0clthbGlnbl0sIGRvbTp0cltiZ2NvbG9yXSwgZG9tOnRyW2NoYXJdLCBkb206dHJbY2hhcm9mZl0sIGRvbTp0clt2YWxpZ25dXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImVsZW1lbnRfYXR0cmlidXRlX2RlcHJlY2F0ZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2VsZW1cIjogXCJlbGVtZW50X2F0dHJpYnV0ZV9kZXByZWNhdGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9hdHRyXCI6IFwiZWxlbWVudF9hdHRyaWJ1dGVfZGVwcmVjYXRlZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfZWxlbV9hdHRyXCI6IFwiZWxlbWVudF9hdHRyaWJ1dGVfZGVwcmVjYXRlZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZWxlbWVudF9hdHRyaWJ1dGVfZGVwcmVjYXRlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJmYWlsX2VsZW1cIjogXCJUaGUgPHswfT4gZWxlbWVudCBpcyBkZXByZWNhdGVkIGluIEhUTUwgNVwiLFxuICAgICAgICAgICAgXCJmYWlsX2F0dHJcIjogXCJUaGUgSFRNTCBhdHRyaWJ1dGUocykgXFxcInswfVxcXCIgaXMgZGVwcmVjYXRlZCBpbiBIVE1MIDVcIixcbiAgICAgICAgICAgIFwiZmFpbF9lbGVtX2F0dHJcIjogXCJUaGUgSFRNTCBhdHRyaWJ1dGUocykgXFxcInswfVxcXCIgaXMgZGVwcmVjYXRlZCBmb3IgdGhlIDx7MX0+IGVsZW1lbnQgaW4gSFRNTCA1XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQXZvaWQgdXNlIG9mIG9ic29sZXRlIGZlYXR1cmVzIGlmIHBvc3NpYmxlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7IFxuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiXSwgXG4gICAgICAgIFwibnVtXCI6IFtcIkhUTUxcIl0sIFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLCBcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRSBcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG5cbiAgICAgICAgLy8gSFRNTFVuaXQgYXV0byBhZGRzIGEgdGJvZHlbYWxpZ249bGVmdF0gdG8gdGFibGVzIGlmIHRib2R5IGlzIG1pc3NpbmchXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInRib2R5XCIgJiYgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiYWxpZ25cIikpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lm5vZGVOYW1lLmluY2x1ZGVzKFwiLVwiKSkge1xuICAgICAgICAgICAgLy8gVGhpcyBpcyBhIHdlYmNvbXBvbmVudCBlbGVtZW50LCBIVE1MIGRvZXNuJ3QgZGVmaW5lIHdoYXQncyBkZXByZWNhdGVkXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICBsZXQgcmV0ID0gW107XG4gICAgICAgIC8vIGNoZWNrIGlmIGl0J3MgYSBkZXByZWNhdGVkIGVsZW1lbnRcbiAgICAgICAgaWYgKERFUFJFQ0FURURfRUxFTUVOVFMuaW5jbHVkZXMobm9kZU5hbWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2VsZW1cIiwgW25vZGVOYW1lXSk7XG5cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNoZWNrIGlmIGl0J3MgYSBkZXByZWNhdGVkIEhUTUwgZ2xvYmFsIGF0dHJpYnV0ZVxuICAgICAgICBjb25zdCBhdHRycyA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZU5hbWVzKCk7XG4gICAgICAgIGxldCB2aW9sYXRpb25zID0gJyc7XG4gICAgICAgIGZvciAoY29uc3QgYXR0ciBvZiBhdHRycykge1xuICAgICAgICAgICAgaWYgKERFUFJFQ0FURURfSFRNTF9HTE9CQUxfQVRUUklCVVRFUy5pbmNsdWRlcyhhdHRyKSkge1xuICAgICAgICAgICAgICAgIGlmICh2aW9sYXRpb25zICE9PSAnJykgdmlvbGF0aW9ucyArPSAnLCAnO1xuICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMgKz0gYXR0cjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodmlvbGF0aW9ucyAhPT0gJycpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfYXR0clwiLCBbdmlvbGF0aW9uc10pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2hlY2sgaWYgaXQncyBhIGRlcHJlY2F0ZWQgSFRNTCBlbGVtZW50ICYgYXR0cmlidXRlXG4gICAgICAgIHZpb2xhdGlvbnMgPSAnJztcbiAgICAgICAgaWYgKG5vZGVOYW1lIGluIERFUFJFQ0FURURfRUxFTUVOVF9BVFRSSUJVVEVTKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGF0dHIgb2YgYXR0cnMpIHtcbiAgICAgICAgICAgICAgICBpZiAoREVQUkVDQVRFRF9FTEVNRU5UX0FUVFJJQlVURVNbbm9kZU5hbWVdICYmIERFUFJFQ0FURURfRUxFTUVOVF9BVFRSSUJVVEVTW25vZGVOYW1lXS5pbmNsdWRlcyhhdHRyKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodmlvbGF0aW9ucyAhPT0gJycpIHZpb2xhdGlvbnMgKz0gJywgJztcbiAgICAgICAgICAgICAgICAgICAgdmlvbGF0aW9ucyArPSBhdHRyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh2aW9sYXRpb25zICE9PSAnJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfZWxlbV9hdHRyXCIsIFt2aW9sYXRpb25zLCBub2RlTmFtZV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEZyYWdtZW50VXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9mcmFnbWVudFwiO1xuXG5leHBvcnQgY29uc3QgZWxlbWVudF9pZF91bmlxdWU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZWxlbWVudF9pZF91bmlxdWVcIixcbiAgICBjb250ZXh0OiBcImRvbToqW2lkXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX0VsZW1fVW5pcXVlSWRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcInBvdGVudGlhbF9lbXB0eVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJwb3RlbnRpYWxfaW5fdXNlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJlbGVtZW50X2lkX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcInBhc3NcIjogXCJlbGVtZW50X2lkX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9lbXB0eVwiOiBcImVsZW1lbnRfaWRfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX2luX3VzZVwiOiBcImVsZW1lbnRfaWRfdW5pcXVlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFbGVtZW50ICdpZCcgYXR0cmlidXRlIHZhbHVlcyBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYSBkb2N1bWVudFwiLFxuICAgICAgICAgICAgXCJwYXNzXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX2VtcHR5XCI6IFwiVGhlIDx7MH0+IGVsZW1lbnQgaGFzIHRoZSBpZCBcXFwiezF9XFxcIiB0aGF0IGlzIGVtcHR5XCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9pbl91c2VcIjogXCJUaGUgPHswfT4gZWxlbWVudCBoYXMgdGhlIGlkIFxcXCJ7MX1cXFwiIHRoYXQgaXMgYWxyZWFkeSBpbiB1c2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIkhUTUxcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbe1xuICAgICAgICBcIjNlYTBjOFwiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9lbXB0eVwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX2luX3VzZVwiOiBcImZhaWxcIlxuICAgICAgICB9XG4gICAgfV0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAgIGxldCBpZCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImlkXCIpO1xuXG4gICAgICAgIC8vIEluIHRoZSBjYXNlIHRoYXQgaWQgaXMgZW1wdHkgd2Ugc2hvdWxkIHRyaWdnZXIgYSB2aW9sYXRpb24gcmlnaHQgYXdheSB3aXRoIG91dCBjaGVja2luZyBcbiAgICAgICAgLy8gZm9yIHVuaXF1ZW5lc3MuXG4gICAgICAgIGlmIChpZCA9PT0gXCJcIikge1xuICAgICAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQoZmFsc2UsIFtydWxlQ29udGV4dF0sICcnLCAnJywgW3J1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksIGlkXSk7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF9lbXB0eVwiLCBbcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSwgaWRdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBlbGVtZW50ID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQocnVsZUNvbnRleHQsIGlkKTtcbiAgICAgICAgbGV0IHBhc3NlZCA9IGVsZW1lbnQgPT09IHJ1bGVDb250ZXh0O1xuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIFtydWxlQ29udGV4dF0sICcnLCAnJywgcGFzc2VkID09IHRydWUgPyBbXSA6IFtydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLCBpZF0pO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfaW5fdXNlXCIsIFtydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLCBpZF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHksIGVSdWxlQ29uZmlkZW5jZSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgTGFuZ1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGFuZ1wiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5pbXBvcnQgeyBBUklBTWFwcGVyIH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQU1hcHBlclwiO1xuaW1wb3J0IHsgQWNjTmFtZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BY2NOYW1lVXRpbFwiO1xuXG5jb25zdCB2YWxpZGF0ZUxhbmcgPSAoY29udGV4dDogUnVsZUNvbnRleHQpOiBudW1iZXIgPT4ge1xuICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwibGFuZ1wiKSkge1xuICAgICAgICBpZiAobm9kZU5hbWUgIT09IFwiaHRtbFwiICYmIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImxhbmdcIikgPT09IFwiXCIpIHtcbiAgICAgICAgICAgIC8vIEl0J3Mgb2theSB0byBoYXZlIGEgbGFuZz1cIlwiIGlmIG5vdCBvbiBodG1sXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgbGFuZ1N0ciA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImxhbmdcIik7XG4gICAgICAgICAgICBpZiAoIUxhbmdVdGlsLnZhbGlkUHJpbWFyeUxhbmcobGFuZ1N0cikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghTGFuZ1V0aWwuaXNCY3A0NyhsYW5nU3RyKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ4bWw6bGFuZ1wiKSkge1xuICAgICAgICBpZiAobm9kZU5hbWUgIT09IFwiaHRtbFwiICYmIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInhtbDpsYW5nXCIpID09PSBcIlwiKSB7XG4gICAgICAgICAgICAvLyBJdCdzIG9rYXkgdG8gaGF2ZSBhIGxhbmc9XCJcIiBpZiBub3Qgb24gaHRtbFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IGxhbmdTdHIgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ4bWw6bGFuZ1wiKTtcbiAgICAgICAgICAgIGlmICghTGFuZ1V0aWwudmFsaWRQcmltYXJ5TGFuZyhsYW5nU3RyKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFMYW5nVXRpbC5pc0JjcDQ3KGxhbmdTdHIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIDA7XG59XG5cbmV4cG9ydCBjb25zdCBodG1sX2xhbmdfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaHRtbF9sYW5nX3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJkb206aHRtbFtsYW5nXSwgZG9tOmh0bWxbeG1sOmxhbmddXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiaHRtbF9sYW5nX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiaHRtbF9sYW5nX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiaHRtbF9sYW5nX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiaHRtbF9sYW5nX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF80XCI6IFwiaHRtbF9sYW5nX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJodG1sX2xhbmdfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJMYW5nIGhhcyBhIHZhbGlkIHByaW1hcnkgbGFuZyBhbmQgY29uZm9ybXMgdG8gQkNQIDQ3XCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlNwZWNpZmllZCAnbGFuZycgYXR0cmlidXRlIGRvZXMgbm90IGluY2x1ZGUgYSB2YWxpZCBwcmltYXJ5IGxhbmd1YWdlXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIlNwZWNpZmllZCAnbGFuZycgYXR0cmlidXRlIGRvZXMgbm90IGNvbmZvcm0gdG8gQkNQIDQ3XCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcIlNwZWNpZmllZCAneG1sOmxhbmcnIGF0dHJpYnV0ZSBkb2VzIG5vdCBpbmNsdWRlIGEgdmFsaWQgcHJpbWFyeSBsYW5ndWFnZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzRcIjogXCJTcGVjaWZpZWQgJ3htbDpsYW5nJyBhdHRyaWJ1dGUgZG9lcyBub3QgY29uZm9ybSB0byBCQ1AgNDdcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgZGVmYXVsdCBodW1hbiBsYW5ndWFnZSBvZiB0aGUgcGFnZSBtdXN0IGJlIHZhbGlkIGFuZCBzcGVjaWZpZWQgaW4gYWNjb3JkYW5jZSB3aXRoIEJDUCA0N1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMy4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW3tcbiAgICAgICAgXCJiNWMzZjhcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImZhaWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcImluYXBwbGljYWJsZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzRcIjogXCJpbmFwcGxpY2FibGVcIlxuICAgICAgICB9LFxuICAgICAgICBcImJmMDUxYVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZmFpbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcImZhaWxcIixcbiAgICAgICAgICAgIFwiRmFpbF80XCI6IFwiaW5hcHBsaWNhYmxlXCJcbiAgICAgICAgfSxcbiAgICAgICAgLy8gVE9ETzogQUNUOiBNaXNtYXRjaCBiZWNhdXNlIHRoZXkgZG9uJ3QgY2hlY2sgdGhlIGh0bWwgZWxlbWVudCBpbiB0aGUgc2FtZSBydWxlXG4gICAgICAgIC8vIFwiZGU0NmU0XCI6IHtcbiAgICAgICAgLy8gICAgIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAvLyAgICAgXCJGYWlsXzFcIjogXCJmYWlsXCIsXG4gICAgICAgIC8vICAgICBcIkZhaWxfMlwiOiBcInBhc3NcIixcbiAgICAgICAgLy8gICAgIFwiRmFpbF8zXCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgIC8vICAgICBcIkZhaWxfNFwiOiBcImluYXBwbGljYWJsZVwiXG4gICAgICAgIC8vIH1cbiAgICB9XSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBsZXQgcmVhc29uQ29kZSA9IHZhbGlkYXRlTGFuZyhjb250ZXh0KTtcbiAgICAgICAgLy8gVGhpcyBpcyBkb25lIGhlcmUgaW5zdGVhZCBvZiBpbiB2YWxpZGF0ZUxhbmcgc28gdGhhdCB0aGUgZ2VuSGVscCBjb2RlIHdpbGwgcGljayBpdCB1cFxuICAgICAgICBsZXQgcmV0QXJyID0gW1xuICAgICAgICAgICAgUnVsZVBhc3MoXCJQYXNzXzBcIiksXG4gICAgICAgICAgICBSdWxlRmFpbChcIkZhaWxfMVwiKSxcbiAgICAgICAgICAgIFJ1bGVGYWlsKFwiRmFpbF8yXCIpLFxuICAgICAgICAgICAgUnVsZUZhaWwoXCJGYWlsXzNcIiksXG4gICAgICAgICAgICBSdWxlRmFpbChcIkZhaWxfNFwiKVxuICAgICAgICBdXG4gICAgICAgIHJldHVybiByZXRBcnJbcmVhc29uQ29kZV07XG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgZWxlbWVudF9sYW5nX3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcImVsZW1lbnRfbGFuZ192YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbbGFuZ10sIGRvbToqW3htbDpsYW5nXVwiLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImVsZW1lbnRfbGFuZ192YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImVsZW1lbnRfbGFuZ192YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcImVsZW1lbnRfbGFuZ192YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcImVsZW1lbnRfbGFuZ192YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfNFwiOiBcImVsZW1lbnRfbGFuZ192YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZWxlbWVudF9sYW5nX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiTGFuZyBoYXMgYSB2YWxpZCBwcmltYXJ5IGxhbmcgYW5kIGNvbmZvcm1zIHRvIEJDUCA0N1wiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJTcGVjaWZpZWQgJ2xhbmcnIGF0dHJpYnV0ZSBkb2VzIG5vdCBpbmNsdWRlIGEgdmFsaWQgcHJpbWFyeSBsYW5ndWFnZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJTcGVjaWZpZWQgJ2xhbmcnIGF0dHJpYnV0ZSBkb2VzIG5vdCBjb25mb3JtIHRvIEJDUCA0N1wiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJTcGVjaWZpZWQgJ3htbDpsYW5nJyBhdHRyaWJ1dGUgZG9lcyBub3QgaW5jbHVkZSBhIHZhbGlkIHByaW1hcnkgbGFuZ3VhZ2VcIixcbiAgICAgICAgICAgIFwiRmFpbF80XCI6IFwiU3BlY2lmaWVkICd4bWw6bGFuZycgYXR0cmlidXRlIGRvZXMgbm90IGNvbmZvcm0gdG8gQkNQIDQ3XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGhlIGNoYW5nZSBpbiBsYW5ndWFnZSBvZiBzcGVjaWZpYyBjb250ZW50IG11c3QgYmUgdmFsaWQgYW5kIHNwZWNpZmllZCBpbiBhY2NvcmRhbmNlIHdpdGggQkNQIDQ3XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIzLjEuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFt7XG4gICAgICAgIC8vIFwiYjVjM2Y4XCI6IHtcbiAgICAgICAgLy8gICAgIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAvLyAgICAgXCJGYWlsXzFcIjogXCJmYWlsXCIsXG4gICAgICAgIC8vICAgICBcIkZhaWxfMlwiOiBcImluYXBwbGljYWJsZVwiLFxuICAgICAgICAvLyAgICAgXCJGYWlsXzNcIjogXCJpbmFwcGxpY2FibGVcIixcbiAgICAgICAgLy8gICAgIFwiRmFpbF80XCI6IFwiaW5hcHBsaWNhYmxlXCJcbiAgICAgICAgLy8gfSxcbiAgICAgICAgLy8gXCJiZjA1MWFcIjoge1xuICAgICAgICAvLyAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgIC8vICAgICBcIkZhaWxfMVwiOiBcImZhaWxcIixcbiAgICAgICAgLy8gICAgIFwiRmFpbF8yXCI6IFwicGFzc1wiLFxuICAgICAgICAvLyAgICAgXCJGYWlsXzNcIjogXCJmYWlsXCIsXG4gICAgICAgIC8vICAgICBcIkZhaWxfNFwiOiBcImluYXBwbGljYWJsZVwiXG4gICAgICAgIC8vIH0sXG4gICAgICAgIC8vIFRPRE86IEFDVDogTWlzbWF0Y2ggYmVjYXVzZSB0aGV5IGRvbid0IGNoZWNrIHRoZSBodG1sIGVsZW1lbnQgaW4gdGhlIHNhbWUgcnVsZVxuICAgICAgICBcImRlNDZlNFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZmFpbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcImluYXBwbGljYWJsZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzRcIjogXCJpbmFwcGxpY2FibGVcIlxuICAgICAgICB9XG4gICAgfV0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgLy8gSWYgaXQncyB0aGUgSFRNTCBub2RlLCB0aGF0J3MgaGFuZGxlZCBieSBodG1sX2xhbmdfdmFsaWRcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSBcImh0bWxcIikgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCByZWFzb25Db2RlID0gdmFsaWRhdGVMYW5nKGNvbnRleHQpO1xuICAgICAgICAvLyBUaGlzIGlzIGRvbmUgaGVyZSBpbnN0ZWFkIG9mIGluIHZhbGlkYXRlTGFuZyBzbyB0aGF0IHRoZSBnZW5IZWxwIGNvZGUgd2lsbCBwaWNrIGl0IHVwXG4gICAgICAgIGxldCByZXRBcnIgPSBbXG4gICAgICAgICAgICBSdWxlUGFzcyhcIlBhc3NfMFwiKSxcbiAgICAgICAgICAgIFJ1bGVGYWlsKFwiRmFpbF8xXCIpLFxuICAgICAgICAgICAgUnVsZUZhaWwoXCJGYWlsXzJcIiksXG4gICAgICAgICAgICBSdWxlRmFpbChcIkZhaWxfM1wiKSxcbiAgICAgICAgICAgIFJ1bGVGYWlsKFwiRmFpbF80XCIpXG4gICAgICAgIF1cbiAgICAgICAgbGV0IHJldFZhbCA9IHJldEFycltyZWFzb25Db2RlXTtcbiAgICAgICAgaWYgKHJldFZhbC52YWx1ZVsxXSAhPT0gZVJ1bGVDb25maWRlbmNlLlBBU1MpIHtcbiAgICAgICAgICAgIC8vIEVuc3VyZSB0aGF0IHRoZXJlJ3MgYWN0dWFsbHkgY29udGVudCBvZiB0aGlzIGVsZW1lbnQgLSBza2lwIHN1YnRyZWVzIHRoYXQgaGF2ZSBvdGhlciBsYW5nIGF0dHJpYnV0ZXNcbiAgICAgICAgICAgIGxldCBoYXNDb250ZW50ID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuZmlyc3RDaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGxldCBudyA9IG5ldyBET01XYWxrZXIocnVsZUNvbnRleHQsIGZhbHNlLCBydWxlQ29udGV4dCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgd2hpbGUgKCFoYXNDb250ZW50ICYmIG53Lm5leHROb2RlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2tpcCBoaWRkZW5cbiAgICAgICAgICAgICAgICAgICAgaWYgKG53Lm5vZGUubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlbGVtZW50ID0gbncubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFWaXNVdGlsLmlzTm9kZVZpc2libGUoZWxlbWVudCkgfHwgZWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJsYW5nXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbncuYkVuZFRhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWUoZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzQ29udGVudCA9IGhhc0NvbnRlbnQgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbWdcIiAmJiAocGFpciAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwKS8qKkFSSUFNYXBwZXIuY29tcHV0ZU5hbWUoZWxlbWVudCkudHJpbSgpLmxlbmd0aCA+IDAqLztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhc0NvbnRlbnQgPSBoYXNDb250ZW50IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG53Lm5vZGUubm9kZVR5cGUgPT09IDMgJiYgbncubm9kZS5ub2RlVmFsdWUudHJpbSgpLmxlbmd0aCA+IDA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWhhc0NvbnRlbnQpIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGNvbnN0IGVsZW1lbnRfbW91c2VldmVudF9rZXlib2FyZDogUnVsZSA9IHtcbiAgICBpZDogXCJlbGVtZW50X21vdXNlZXZlbnRfa2V5Ym9hcmRcIixcbiAgICBjb250ZXh0OiBcImRvbToqW29uZGJsY2xpY2tdLCBkb206Kltvbm1vdXNlbW92ZV0sIGRvbToqW29ubW91c2Vkb3duXSwgZG9tOipbb25tb3VzZXVwXSwgZG9tOipbb25tb3VzZW92ZXJdLCBkb206Kltvbm1vdXNlb3V0XSwgZG9tOipbb25jbGlja11cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9FbGVtX0V2ZW50TW91c2VBbmRLZXlcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJNYW51YWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiZWxlbWVudF9tb3VzZWV2ZW50X2tleWJvYXJkLmh0bWxcIixcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJlbGVtZW50X21vdXNlZXZlbnRfa2V5Ym9hcmQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImVsZW1lbnRfbW91c2VldmVudF9rZXlib2FyZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwiQ29uZmlybSB0aGUgPHswfT4gZWxlbWVudCB3aXRoIG1vdXNlIGV2ZW50IGhhbmRsZXIocykgJ3sxfScgaGFzIGEgY29ycmVzcG9uZGluZyBrZXlib2FyZCBoYW5kbGVyKHMpXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQWxsIGludGVyYWN0aXZlIGNvbnRlbnQgd2l0aCBtb3VzZSBldmVudCBoYW5kbGVycyBtdXN0IGhhdmUgZXF1aXZhbGVudCBrZXlib2FyZCBhY2Nlc3NcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImhyZWZcIikgfHxcbiAgICAgICAgICAgICghcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25kYmxjbGlja1wiKSAmJlxuICAgICAgICAgICAgICAgICFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbm1vdXNlbW92ZVwiKSAmJlxuICAgICAgICAgICAgICAgICghcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25tb3VzZWRvd25cIikgfHwgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25rZXlkb3duXCIpKSAmJlxuICAgICAgICAgICAgICAgICghcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25tb3VzZXVwXCIpIHx8IHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9ua2V5dXBcIikpICYmXG4gICAgICAgICAgICAgICAgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbm1vdXNlb3ZlclwiKSB8fCBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmZvY3VzXCIpKSAmJlxuICAgICAgICAgICAgICAgICghcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25tb3VzZW91dFwiKSB8fCBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmJsdXJcIikpICYmXG4gICAgICAgICAgICAgICAgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmNsaWNrXCIpIHx8IHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9ua2V5cHJlc3NcIikgfHxcbiAgICAgICAgICAgICAgICAgICAgbm9kZU5hbWUgPT0gXCJhXCIgfHwgbm9kZU5hbWUgPT0gXCJidXR0b25cIikpO1xuXG4gICAgICAgIGxldCBmYWlsZWRNb3VzZUV2ZW50cyA9IG5ldyBBcnJheSgpO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgLy9zdG9yZSBhbmQgZGlzcGxheSBldmVudCBuYW1lIGFuZCBub2RlIG5hbWUgaW4gdGhlIHRva2Vuc1xuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9uZGJsY2xpY2tcIikpIHtcbiAgICAgICAgICAgICAgICBmYWlsZWRNb3VzZUV2ZW50cy5wdXNoKFwib25kYmxjbGlja1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbm1vdXNlbW92ZVwiKSkge1xuICAgICAgICAgICAgICAgIGZhaWxlZE1vdXNlRXZlbnRzLnB1c2goXCJvbm1vdXNlbW92ZVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbm1vdXNlZG93blwiKSAmJiAhcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25rZXlkb3duXCIpKSB7XG4gICAgICAgICAgICAgICAgZmFpbGVkTW91c2VFdmVudHMucHVzaChcIm9ubW91c2Vkb3duXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9ubW91c2V1cFwiKSAmJiAhcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25rZXl1cFwiKSkge1xuICAgICAgICAgICAgICAgIGZhaWxlZE1vdXNlRXZlbnRzLnB1c2goXCJvbm1vdXNldXBcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25tb3VzZW92ZXJcIikgJiYgIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9uZm9jdXNcIikpIHtcbiAgICAgICAgICAgICAgICBmYWlsZWRNb3VzZUV2ZW50cy5wdXNoKFwib25tb3VzZW92ZXJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25tb3VzZW91dFwiKSAmJiAhcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25ibHVyXCIpKSB7XG4gICAgICAgICAgICAgICAgZmFpbGVkTW91c2VFdmVudHMucHVzaChcIm9ubW91c2VvdXRcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25jbGlja1wiKSAmJiAhcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25rZXlwcmVzc1wiKSkge1xuICAgICAgICAgICAgICAgIGlmICghKG5vZGVOYW1lID09IFwiYVwiIHx8IG5vZGVOYW1lID09IFwiYnV0dG9uXCIpKVxuICAgICAgICAgICAgICAgICAgICBmYWlsZWRNb3VzZUV2ZW50cy5wdXNoKFwib25jbGlja1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFzc2VkID8gUnVsZVBhc3MoXCJQYXNzXzBcIikgOiBSdWxlTWFudWFsKFwiTWFudWFsXzFcIiwgW25vZGVOYW1lLCBmYWlsZWRNb3VzZUV2ZW50cy5qb2luKFwiLCBcIildKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDU1NVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ1NTVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgZWxlbWVudF9vcmllbnRhdGlvbl91bmxvY2tlZDogUnVsZSA9IHtcbiAgICBpZDogXCJlbGVtZW50X29yaWVudGF0aW9uX3VubG9ja2VkXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJlbGVtZW50X29yaWVudGF0aW9uX3VubG9ja2VkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9sb2NrZWRcIjogXCJlbGVtZW50X29yaWVudGF0aW9uX3VubG9ja2VkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJlbGVtZW50X29yaWVudGF0aW9uX3VubG9ja2VkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlRoZSBlbGVtZW50IGlzIG5vdCByZXN0cmljdGVkIHRvIGVpdGhlciBsYW5kc2NhcGUgb3IgcG9ydHJhaXQgb3JpZW50YXRpb24gdXNpbmcgQ1NTIHRyYW5zZm9ybSBwcm9wZXJ0eVwiLFxuICAgICAgICAgICAgXCJmYWlsX2xvY2tlZFwiOiBcIlRoZSBlbGVtZW50IDx7MH0+IGlzIHJlc3RyaWN0ZWQgdG8gZWl0aGVyIGxhbmRzY2FwZSBvciBwb3J0cmFpdCBvcmllbnRhdGlvbiB1c2luZyBDU1MgdHJhbnNmb3JtIHByb3BlcnR5XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWxlbWVudHMgc2hvdWxkIG5vdCBiZSByZXN0cmljdGVkIHRvIGVpdGhlciBsYW5kc2NhcGUgb3IgcG9ydHJhaXQgb3JpZW50YXRpb24gdXNpbmcgQ1NTIHRyYW5zZm9ybSBwcm9wZXJ0eVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjRcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogWydiMzNlZmYnXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgICAvL3NraXAgaW52aXNpYmxlIGVsZW1lbnRcbiAgICAgICAgaWYgKCFWaXNVdGlsLmlzTm9kZVZpc2libGUocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICAvL3NraXAgZWxlbWVudHNcbiAgICAgICAgaWYgKENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFtcInNjcmlwdFwiLCBcIm1ldGFcIiwgXCJ0aXRsZVwiXSkpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIFxuICAgICAgICAvLyBjYWNoZSB0aGUgb3JpZW50YXRpb24gcmVzdWx0IGZvciBhbGwgdGhlIGVsZW1lbnRzIGluIHRoZSBwYWdlXG4gICAgICAgIGxldCBkb2MgPSBGcmFnbWVudFV0aWwuZ2V0T3duZXJGcmFnbWVudChydWxlQ29udGV4dCkgYXMgYW55O1xuICAgICAgICBsZXQgb3JpZW50YXRpb25UcmFuc2Zvcm1zID0gQ2FjaGVVdGlsLmdldENhY2hlKGRvYywgXCJSUFRVdGlsX01FRElBX09SSUVOVEFUSU9OX1RSQU5TRlJPTVwiLCBudWxsKTtcbiAgICAgICAgaWYgKCFvcmllbnRhdGlvblRyYW5zZm9ybXMpIHtcbiAgICAgICAgICAgIG9yaWVudGF0aW9uVHJhbnNmb3JtcyA9IENTU1V0aWwuZ2V0TWVkaWFPcmllbnRhdGlvblRyYW5zZm9ybShkb2MpO1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGRvYywgXCJSUFRVdGlsX01FRElBX09SSUVOVEFUSU9OX1RSQU5TRlJPTVwiLCBvcmllbnRhdGlvblRyYW5zZm9ybXMpO1xuICAgICAgICB9IFxuICAgICAgICBcbiAgICAgICAgLy8gZmluZCBpZiB0aGUgZWxlbWVudCBtYXRjaGVzIG9yaWVudGF0aW9uIHNlbGVjdG9yKHMpXG4gICAgICAgIGxldCBtZWRpYV90cmFuc2Zvcm1zID0gW107XG4gICAgICAgIE9iamVjdC5rZXlzKG9yaWVudGF0aW9uVHJhbnNmb3JtcykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgT2JqZWN0LmtleXMob3JpZW50YXRpb25UcmFuc2Zvcm1zW2tleV0pLmZvckVhY2godGFnID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMob3JpZW50YXRpb25UcmFuc2Zvcm1zW2tleV1bdGFnXSkubGVuZ3RoID4gMCAmJiBDU1NVdGlsLnNlbGVjdG9yTWF0Y2hlc0VsZW0ocnVsZUNvbnRleHQsIHRhZykpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWVudGF0aW9uVHJhbnNmb3Jtc1trZXldW3RhZ10udHJhbnNmb3JtKVxuICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFfdHJhbnNmb3Jtcy5wdXNoKG9yaWVudGF0aW9uVHJhbnNmb3Jtc1trZXldW3RhZ10udHJhbnNmb3JtKTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFfdHJhbnNmb3Jtcy5wdXNoKG9yaWVudGF0aW9uVHJhbnNmb3Jtc1trZXldW3RhZ10pO1xuICAgICAgICAgICAgICAgIH0gICAgXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICAvLyBubyBtYXRjaCwgdGhlIGVsZW1lbnQgaXMgbm90IGluIG1lZGlhIG9yaWVudGF0aW9uIHRyYW5zZm9ybVxuICAgICAgICBpZiAobWVkaWFfdHJhbnNmb3Jtcy5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgbGV0IHJldCA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBtZWRpYV90cmFuc2Zvcm1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgbWVkaWFfdHJhbnNmb3JtID0gbWVkaWFfdHJhbnNmb3Jtc1tpXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbWVkaWFfdHJhbnNmb3JtID09PSAnb2JqZWN0JylcbiAgICAgICAgICAgICAgICBmb3IodmFyIGtleSBpbiBtZWRpYV90cmFuc2Zvcm0pXG4gICAgICAgICAgICAgICAgICAgIG1lZGlhX3RyYW5zZm9ybSA9IGtleSArXCIoXCIgKyBtZWRpYV90cmFuc2Zvcm1ba2V5XSArXCIpXCI7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGxldCBjb250YWluc1JvdGF0aW9uID0gZmFsc2U7XG4gICAgICAgICAgICBbJ3JvdGF0ZScsICdyb3RhdGUzZCcsICdyb3RhdGVaJywgJ21hdHJpeCcsICdtYXRyaXgzZCddLmZvckVhY2gocm90YXRpb24gPT4ge1xuICAgICAgICAgICAgICAgIGlmIChtZWRpYV90cmFuc2Zvcm0uaW5jbHVkZXMocm90YXRpb24pKSBjb250YWluc1JvdGF0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gbm8gcm90YXRpb24gdHJhbnNmb3JtLCBza2lwXG4gICAgICAgICAgICBpZiAoIWNvbnRhaW5zUm90YXRpb24pIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBsZXQgZGVncmVlID0gQ1NTVXRpbC5nZXRSb3RhdGlvbkRlZ3JlZShtZWRpYV90cmFuc2Zvcm0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBubyBvciAzNjBuIGRlZ3JlZSByb3RhdGlvbiBcbiAgICAgICAgICAgIGlmIChkZWdyZWUgPT09IDApIHsgXG4gICAgICAgICAgICAgICAgcmV0LnB1c2goUnVsZVBhc3MoXCJwYXNzXCIpKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogY2FsY3VsYXRlIHRoZSBvcmlnaW5hbCBwYWdlIHJvdGF0aW9uIHRyYW5zZm9ybWF0aW9uLCBleGFtcGxlXG4gICAgICAgICAgICAgKiAgaHRtbCB7IHRyYW5zZm9ybTogcm90YXRlKDIuNWRlZyk7IH1cbiAgICAgICAgICAgICovXG4gICAgICAgICAgICBjb25zdCBkZWZpbmVkU3R5bGUgPSBDU1NVdGlsLmdldERlZmluZWRTdHlsZXMocnVsZUNvbnRleHQsIFtcInRyYW5zZm9ybVwiXSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8qKiBcbiAgICAgICAgICAgICAqIGNvbXBlbnNhdGUgdGhlIG1lZGlhIG9yaWVudGF0aW9uIHdpdGggdGhlIHBhZ2Ugb3JpZW50YXRpb25cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgaWYgKGRlZmluZWRTdHlsZVsndHJhbnNmb3JtJ10pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYWdlX2RlZ3JlZSA9IENTU1V0aWwuZ2V0Um90YXRpb25EZWdyZWUoZGVmaW5lZFN0eWxlWyd0cmFuc2Zvcm0nXSk7XG4gICAgICAgICAgICAgICAgLy8gcm90YXRlIGlzIGFkZGl0aXZlXG4gICAgICAgICAgICAgICAgZGVncmVlICs9IHBhZ2VfZGVncmVlO1xuICAgICAgICAgICAgfSAgICBcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gV2hlbiBkZWdyZWUgaXMgMSB0dXJuICgzNjAgZGVncmVlKSwgaXQgaXMgbm90IGNvbnNpZGVyZWQgYW4gb3JpZW50YXRpb24gbG9ja1xuICAgICAgICAgICAgLy8gYWxsb3cgMSBkZWdyZWUgZmxvYXRpbmcgcmFuZ2UgZm9yIHRoZSByaWdodCBhbmdsZVxuICAgICAgICAgICAgaWYgKE1hdGguYWJzKGRlZ3JlZSAtIDM2MCkgJSAzNjAgPiAxKVxuICAgICAgICAgICAgICAgIHJldC5wdXNoKFJ1bGVGYWlsKFwiZmFpbF9sb2NrZWRcIiwgW25vZGVOYW1lXSkpO1xuICAgICAgICAgICAgZWxzZSByZXQucHVzaChSdWxlUGFzcyhcInBhc3NcIikpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXQubGVuZ3RoID4gMCkgIFxuICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgcmV0dXJuIG51bGw7IFxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgZWxlbWVudF9zY3JvbGxhYmxlX3RhYmJhYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcImVsZW1lbnRfc2Nyb2xsYWJsZV90YWJiYWJsZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipcIixcbiAgICBkZXBlbmRlbmNpZXM6IFtdLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZWxlbWVudF9zY3JvbGxhYmxlX3RhYmJhYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwicGFzc190YWJiYWJsZVwiOiBcImVsZW1lbnRfc2Nyb2xsYWJsZV90YWJiYWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcInBhc3NfaW50ZXJhY3RpdmVcIjogXCJlbGVtZW50X3Njcm9sbGFibGVfdGFiYmFibGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX3Njcm9sbGFibGVcIjogXCJlbGVtZW50X3Njcm9sbGFibGVfdGFiYmFibGUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIlNjcm9sbGFibGUgZWxlbWVudHMgc2hvdWxkIGJlIHRhYmJhYmxlIG9yIGNvbnRhaW4gdGFiYmFibGUgY29udGVudFwiLFxuICAgICAgICAgICAgXCJwYXNzX3RhYmJhYmxlXCI6IFwiVGhlIHNjcm9sbGFibGUgZWxlbWVudCBpcyB0YWJiYWJsZVwiLFxuICAgICAgICAgICAgXCJwYXNzX2ludGVyYWN0aXZlXCI6IFwiVGhlIHNjcm9sbGFibGUgZWxlbWVudCBoYXMgdGFiYmFibGUgY29udGVudFwiLFxuICAgICAgICAgICAgXCJmYWlsX3Njcm9sbGFibGVcIjogXCJUaGUgc2Nyb2xsYWJsZSBlbGVtZW50IDx7MH0+IHdpdGggbm9uLWludGVyYWN0aXZlIGNvbnRlbnQgaXMgbm90IHRhYmJhYmxlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogZGVwcmVjYXRlZCBvbiA2LzEwLzIwMjUgZHVlIHRvIEJyb3dzZXIgc3VwcG9ydCBmb3IgYXV0by1mb2N1cyBvZiBhIHNjcm9sbGFibGUgZWxlbWVudCBcbiAgICAgKiBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgbnVtOiBbXCIyLjEuMVwiXSxcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLCovXG4gICAgcnVsZXNldHM6IFtdLFxuICAgIGFjdDogW1wiMHNzdzlrXCJdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IGlzIGhpZGRlbiBvciBkaXNhYmxlZFxuICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShydWxlQ29udGV4dCkgfHwgQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIFxuICAgICAgICAvL3NraXAgZWxlbWVudHNcbiAgICAgICAgaWYgKENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFtcImlmcmFtZVwiLCBcInN2Z1wiLCBcInNjcmlwdFwiLCBcIm1ldGFcIiwgXCJzdHlsZVwiXSkpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICAvL3NraXAgaWYgbm8gdmlzaWJsZSBjb250ZW50XG4gICAgICAgIGlmICghQ29tbW9uVXRpbC5oYXNJbm5lckNvbnRlbnQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBcbiAgICAgICAgLy8gaWdub3JlIGlmIHRoZSBlbGVtZW50J3MgbmF2aWdhdGlvbiBpcyBjb250cm9sbGVkIG9yIG93bmVkIGJ5IGFub3RoZXIgZWxlbWVudFxuICAgICAgICBpZiAoQXJpYVV0aWwuaXNOYXZpZ2F0aW9uT3duZWRPckNvbnRyb2xsZWQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7ICBcblxuICAgICAgICAvLyBpZ25vcmUgaWYgdGhlIGVsZW1lbnQgaXMgbm90IHNjcm9sbGFibGUgb3IgY29udGVudCB3aXRob3V0aW5nIG5lZWRpbmcgYSBzY3JvbGxcbiAgICAgICAgaWYgKCFWaXNVdGlsLmlzRWxlbWVudFNjcm9sbGFibGUocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gcGFzcyBpZiBlbGVtZW50IGlzIHRhYmJhYmxlXG4gICAgICAgIGlmIChDb21tb25VdGlsLmlzVGFiYmFibGUocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc190YWJiYWJsZVwiKTtcblxuICAgICAgICAvLyBjaGVjayBpZiBlbGVtZW50IGNvbnRlbnQgaXMgdGFiYmFibGVcbiAgICAgICAgY29uc3QgY291bnQgPSBDb21tb25VdGlsLmdldFRhYmJhYmxlQ2hpbGRyZW4ocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoY291bnQgPiAwKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc19pbnRlcmFjdGl2ZVwiKTtcblxuICAgICAgICAvLyBpZ25vcmUgaW4gRmlyZWZveCBpZiBubyB0YWJpbmRleCBhdCBhbGwgKG5vdCB0ZXN0ZWQgaW4gZW1iZWRkZWQgb3IgYW55IHNpbXVsYXRvcilcbiAgICAgICAgaWYgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSAmJiBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoXCJGaXJlZm94XCIpID4gLTEpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX3Njcm9sbGFibGVcIiwgW3J1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldKTsgICAgXG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgQVJJQURlZmluaXRpb25zIH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQURlZmluaXRpb25zXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGVsZW1lbnRfdGFiYmFibGVfcm9sZV92YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJlbGVtZW50X3RhYmJhYmxlX3JvbGVfdmFsaWRcIixcbiAgICBjb250ZXh0OlwiZG9tOipcIixcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiZWxlbWVudF90YWJiYWJsZV9yb2xlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9pbnZhbGlkX3JvbGVcIjogXCJlbGVtZW50X3RhYmJhYmxlX3JvbGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX25vX3ZhbGlkX3JvbGVcIjogXCJlbGVtZW50X3RhYmJhYmxlX3JvbGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImVsZW1lbnRfdGFiYmFibGVfcm9sZV92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJUaGUgdGFiYmFibGUgZWxlbWVudCBoYXMgYSB3aWRnZXQgcm9sZVwiLFxuICAgICAgICAgICAgXCJmYWlsX2ludmFsaWRfcm9sZVwiOiBcIlRoZSB0YWJiYWJsZSBlbGVtZW50J3Mgcm9sZSAnezB9JyBpcyBub3QgYSB3aWRnZXQgcm9sZVwiLFxuICAgICAgICAgICAgXCJmYWlsX25vX3ZhbGlkX3JvbGVcIjogXCJUaGUgdGFiYmFibGUgZWxlbWVudCBkb2VzIG5vdCBoYXZlIGEgdmFsaWQgd2lkZ2V0IHJvbGVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBIHRhYmJhYmxlIGVsZW1lbnQgbXVzdCBoYXZlIGEgdmFsaWQgd2lkZ2V0IHJvbGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCJdLFxuICAgICAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiaWRcIjogW1wiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICAgICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAgIGlmIChDb21tb25VdGlsLmlzTm9kZURpc2FibGVkKHJ1bGVDb250ZXh0KSB8fCBWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgY29uc3Qgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAvLyBpZiB0aGUgZWxlbWVudCBpcyB0YWJiYWJsZSBieSBkZWZhdWx0IHdpdGggb3Igd2l0aG91dCB0YWJpbmRleCwgbGV0IHRoZSBvdGhlciBydWxlcyAoc3VjaCBhcyB3aWRnZXRfdGFiYmFibGVfc2luZ2xlKSB0byBoYW5kbGUgaXRcbiAgICAgICAgaWYgKG5vZGVOYW1lIGluIENvbW1vblV0aWwudGFiVGFnTWFwICkge1xuICAgICAgICAgICAgbGV0IHZhbHVlID0gQ29tbW9uVXRpbC50YWJUYWdNYXBbbm9kZU5hbWVdO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiAodmFsdWUpID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgIH0gXG4gICAgICAgICAgICBpZiAodmFsdWUpIHJldHVybiBudWxsO1xuICAgICAgICB9IFxuICAgICAgICBcbiAgICAgICAgLy8gaGFuZGxlIHRoZSBjYXNlOiBubyB0YWJpbmRleCBvciB0YWJpbmRleCA8IDBcbiAgICAgICAgaWYgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSB8fCBwYXJzZUludChydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSkgPCAwKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gaWdub3JlIGlmIHRoZSBlbGVtZW50J3MgbmF2aWdhdGlvbiBpcyBjb250cm9sbGVkIGJ5IGFub3RoZXIgZWxlbWVudCwgc3VjaCBhcyBjb21ib2JveFxuICAgICAgICBpZiAoQXJpYVV0aWwuaXNOYXZpZ2F0aW9uT3duZWRPckNvbnRyb2xsZWQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7ICBcblxuICAgICAgICAvLyBpZ25vcmUgaWYgdGhlIGVsZW1lbnQgaXMgc2Nyb2xsYWJsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc0VsZW1lbnRTY3JvbGxhYmxlKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybiBudWxsOyAgICBcblxuICAgICAgICAvLyBlbGVtZW50cyB3aG9zZSByb2xlcyBhbGxvdyBubyBkZXNjZW5kYW50cyB0aGF0IGFyZSBpbnRlcmFjdGl2ZSBvciB3aXRoIGEgdGFiaW5kZXggPj0gMCBcbiAgICAgICAgLy8gdGhpcyBjYXNlIHNob3VsZCBiZSBoYW5kbGVkIGluIHdpZGdldF90YWJiYWJsZV9zaW5nbGUgYW5kIGFyaWFfY2hpbGRfdGFiYmFibGVcbiAgICAgICAgY29uc3Qgcm9sZXNfbm9faW50ZXJhY3RpdmVfY2hpbGQgPVtcImJ1dHRvblwiLCBcImNoZWNrYm94XCIsIFwiaW1nXCIsIFwibGlua1wiLCBcIm1lbnVpdGVtXCIsIFwibWVudWl0ZW1jaGVja2JveFwiLCBcIm1lbnVpdGVtcmFkaW9cIiwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25cIiwgXCJyYWRpb1wiLCBcInN3aXRjaFwiLCBcInRhYlwiXTtcblxuICAgICAgICBjb25zdCBwYXJlbnQgPSBET01XYWxrZXIucGFyZW50Tm9kZShydWxlQ29udGV4dCk7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBwYXJlbnRfcm9sZSA9IEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZShwYXJlbnQgYXMgRWxlbWVudCk7XG4gICAgICAgIFxuICAgICAgICAvLyBpZ25vcmUgaWYgdGhlIHBhcmVudCByb2xlIGlzIGluIHJvbGVzX25vX2ludGVyYWN0aXZlX2NoaWxkXG4gICAgICAgIGlmIChyb2xlc19ub19pbnRlcmFjdGl2ZV9jaGlsZC5pbmNsdWRlcyhwYXJlbnRfcm9sZSkpXG4gICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgbGV0IHJvbGUgPSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoIXJvbGUpIFxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9ub192YWxpZF9yb2xlXCIpOyBcbiAgICAgICAgLy8gaWdub3JlICdhcHBsaWNhdGlvbicgcm9sZSB0aGF0IGNvbnRhaW5zIG9uZSBvciBtb3JlIGZvY3VzYWJsZSBlbGVtZW50cyB0aGF0IGRvIG5vdCBmb2xsb3cgYSBzdGFuZGFyZCBpbnRlcmFjdGlvbiBwYXR0ZXJuIHN1cHBvcnRlZCBieSBhIHdpZGdldCByb2xlOmh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDIzL1BSLVdBSS1BUklBLTEuMi0yMDIzMDMyOC8jYXBwbGljYXRpb24gXG4gICAgICAgIGlmIChyb2xlID09PSBcImFwcGxpY2F0aW9uXCIpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICAvLyBoYW5kbGUgdGhlIGNhc2U6IHRhYmluZGV4ID49IDAgdG8gZXhhbWluZSB3aGV0aGVyIGEgd2lkZ2V0IHJvbGUgaXMgc2V0dXAgb3Igbm90IFxuICAgICAgICAvLyBwYXNzIGlmIG9uZSBvZiB0aGUgcm9sZXMgaXMgYSB3aWRnZXQgdHlwZVxuICAgICAgICAvLyBSb3cgaXMgd2VpcmQuIEl0J3Mgc3RydWN0dXJlLCBidXQgY2FuIGFsc28gYmUgd2lkZ2V0XG4gICAgICAgIC8vIEZvY3VzYWJsZSBzZXBhcmF0b3JzIGFyZSB3aWRnZXRzXG4gICAgICAgIGlmIChyb2xlID09PSBcInJvd1wiIHx8IHJvbGUgPT09IFwic2VwYXJhdG9yXCIgfHwgQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVdLnJvbGVUeXBlID09PSAnd2lkZ2V0Jykge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2ludmFsaWRfcm9sZVwiLCBbcm9sZV0pO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHksIFJ1bGVQb3RlbnRpYWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5pbXBvcnQgeyBET01NYXBwZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTU1hcHBlclwiO1xuaW1wb3J0IHsgQ29sb3JVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29sb3JVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBlbGVtZW50X3RhYmJhYmxlX3Vub2JzY3VyZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZWxlbWVudF90YWJiYWJsZV91bm9ic2N1cmVkXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIGRlcGVuZGVuY2llczogW10sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJlbGVtZW50X3RhYmJhYmxlX3Vub2JzY3VyZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJwYXNzXCI6IFwiZWxlbWVudF90YWJiYWJsZV91bm9ic2N1cmVkLmh0bWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX29ic2N1cmVkXCI6IFwiZWxlbWVudF90YWJiYWJsZV91bm9ic2N1cmVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJXaGVuIGFuIGVsZW1lbnQgcmVjZWl2ZXMgZm9jdXMsIGl0IGlzIG5vdCBlbnRpcmVseSBjb3ZlcmVkIGJ5IG90aGVyIGNvbnRlbnRcIixcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlRoZSBlbGVtZW50IGlzIG5vdCBlbnRpcmVseSBjb3ZlcmVkIGJ5IG90aGVyIGNvbnRlbnRcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX29ic2N1cmVkXCI6IFwiQ29uZmlybSB0aGF0IHdoZW4gdGhlIGVsZW1lbnQgcmVjZWl2ZXMgZm9jdXMsIGl0IGlzIG5vdCBjb3ZlcmVkIG9yLCBpZiBjb3ZlcmVkIGJ5IHVzZXIgYWN0aW9uLCBjYW4gYmUgdW5jb3ZlcmVkIHdpdGhvdXQgbW92aW5nIGZvY3VzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbIFwiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIG51bTogW1wiMi40LjExXCJdLFxuICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgIC8vIEVhcmx5IGV4aXQ6IGNoZWNrIHZpc2liaWxpdHkgYW5kIHRhYmJhYmlsaXR5IGZpcnN0XG4gICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKHJ1bGVDb250ZXh0KSB8fCAhQ29tbW9uVXRpbC5pc1RhYmJhYmxlKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgY29uc3Qgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICAgIFxuICAgICAgICAvLyBFYXJseSBleGl0OiBpZ25vcmUgY2VydGFpbiBlbGVtZW50c1xuICAgICAgICBpZiAoQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgW1wicHJlXCIsIFwiY29kZVwiLCBcInNjcmlwdFwiLCBcIm1ldGFcIl0pICE9PSBudWxsXG4gICAgICAgICAgICB8fCBub2RlTmFtZSA9PT0gXCJib2R5XCIgfHwgbm9kZU5hbWUgPT09IFwiaHRtbFwiKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBkb2MgPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50O1xuICAgICAgICBpZiAoIWRvYykgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICBjb25zdCB3aW4gPSBkb2MuZGVmYXVsdFZpZXc7XG4gICAgICAgIGlmICghd2luKSByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIC8vIFJldXNlIHNpbmdsZSBET01NYXBwZXIgaW5zdGFuY2VcbiAgICAgICAgY29uc3QgbWFwcGVyOiBET01NYXBwZXIgPSBuZXcgRE9NTWFwcGVyKCk7XG4gICAgICAgIGNvbnN0IGJvdW5kcyA9IG1hcHBlci5nZXRVbmFkanVzdGVkQm91bmRzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgXG4gICAgICAgIC8vIEVhcmx5IGV4aXQ6IGJvdW5kcyBub3QgYXZhaWxhYmxlIG9yIGVsZW1lbnQgaGFzIG5vIGRpbWVuc2lvbnNcbiAgICAgICAgaWYgKCFib3VuZHMgfHwgYm91bmRzLmhlaWdodCA9PT0gMCB8fCBib3VuZHMud2lkdGggPT09IDApXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IGNTdHlsZSA9IHdpbi5nZXRDb21wdXRlZFN0eWxlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKCFjU3R5bGUpIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgLy8gUGFyc2Ugei1pbmRleCBvbmNlIGFuZCBjYWNoZVxuICAgICAgICBjb25zdCB6aW5kZXggPSBwYXJzZUludChjU3R5bGUuekluZGV4ID09PSAnYXV0bycgfHwgIWNTdHlsZS56SW5kZXggPyAnMCcgOiBjU3R5bGUuekluZGV4KTtcbiAgICAgICAgXG4gICAgICAgIC8vIE1vcmUgc3BlY2lmaWMgc2VsZWN0b3IgdG8gcmVkdWNlIGl0ZXJhdGlvblxuICAgICAgICBjb25zdCBlbGVtcyA9IGRvYy5xdWVyeVNlbGVjdG9yQWxsKCdib2R5ICo6bm90KHNjcmlwdCk6bm90KHN0eWxlKTpub3QobWV0YSk6bm90KGxpbmspJyk7XG4gICAgICAgIGlmICghZWxlbXMgfHwgZWxlbXMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICBcbiAgICAgICAgbGV0IGJlZm9yZSA9IHRydWU7XG4gICAgICAgIGNvbnN0IGJvdW5kc1JpZ2h0ID0gYm91bmRzLmxlZnQgKyBib3VuZHMud2lkdGg7XG4gICAgICAgIGNvbnN0IGJvdW5kc0JvdHRvbSA9IGJvdW5kcy50b3AgKyBib3VuZHMuaGVpZ2h0O1xuICAgICAgICBcbiAgICAgICAgLy8gQ2hlY2sgZm9yIG9ic2N1cmluZyBlbGVtZW50c1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtID0gZWxlbXNbaV07XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogVGhlIG5vZGVzIHJldHVybmVkIGZyb20gcXVlcnlTZWxlY3RvckFsbCBhcmUgaW4gZG9jdW1lbnQgb3JkZXIuXG4gICAgICAgICAgICAgKiBJZiB0d28gZWxlbWVudHMgb3ZlcmxhcCBhbmQgei1pbmRleCBhcmUgbm90IGRlZmluZWQsIHRoZW4gdGhlIG5vZGVcbiAgICAgICAgICAgICAqIHJlbmRlcmVkIGVhcmxpZXIgd2lsbCBiZSBvdmVybGFpZCBieSB0aGUgbm9kZSByZW5kZXJlZCBsYXRlci5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgLy8gVXNlIGNvbXBhcmVEb2N1bWVudFBvc2l0aW9uIHRvIGNoZWNrIGNvbnRhaW5tZW50IHJlbGF0aW9uc2hpcHNcbiAgICAgICAgICAgIC8vIE5vdGU6IGNvbXBhcmVEb2N1bWVudFBvc2l0aW9uIHJldHVybnMgMCB3aGVuIGNvbXBhcmluZyBhIG5vZGUgdG8gaXRzZWxmXG4gICAgICAgICAgICBjb25zdCBwb3NpdGlvbiA9IHJ1bGVDb250ZXh0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGVsZW0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBET0NVTUVOVF9QT1NJVElPTl9DT05UQUlORURfQlkgKDE2KTogZWxlbSBpcyBjb250YWluZWQgYnkgcnVsZUNvbnRleHRcbiAgICAgICAgICAgIC8vIEFsc28gaGFuZGxlIHNlbGYtY29tcGFyaXNvbiAocG9zaXRpb24gPT09IDApXG4gICAgICAgICAgICBpZiAocG9zaXRpb24gPT09IDAgfHwgKHBvc2l0aW9uICYgTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9DT05UQUlORURfQlkpKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhlIG5leHQgbm9kZSBpbiBlbGVtcyB3aWxsIGJlIGFmdGVyIHRoZSB0YXJnZXQgbm9kZSAocnVsZUNvbnRleHQpXG4gICAgICAgICAgICAgICAgYmVmb3JlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIERPQ1VNRU5UX1BPU0lUSU9OX0NPTlRBSU5TICg4KTogZWxlbSBjb250YWlucyBydWxlQ29udGV4dFxuICAgICAgICAgICAgLy8gU2tpcCBpZiBlbGVtZW50IGNvbnRhaW5zIHJ1bGVDb250ZXh0IG9yIGlzIG5vdCB2aXNpYmxlXG4gICAgICAgICAgICBpZiAoKHBvc2l0aW9uICYgTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9DT05UQUlOUykgfHwgIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShlbGVtKSlcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY29uc3QgYm5kcyA9IG1hcHBlci5nZXRVbmFkanVzdGVkQm91bmRzKGVsZW0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBTa2lwIGlmIG5vIGJvdW5kcyBvciB6ZXJvIGRpbWVuc2lvbnNcbiAgICAgICAgICAgIGlmICghYm5kcyB8fCBibmRzLmhlaWdodCA9PT0gMCB8fCBibmRzLndpZHRoID09PSAwKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBRdWljayBib3VuZHMgY2hlY2s6IGRvZXMgZWxlbSBjb21wbGV0ZWx5IGNvdmVyIHJ1bGVDb250ZXh0P1xuICAgICAgICAgICAgaWYgKGJuZHMudG9wID4gYm91bmRzLnRvcCB8fCBibmRzLmxlZnQgPiBib3VuZHMubGVmdClcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY29uc3QgYm5kc1JpZ2h0ID0gYm5kcy5sZWZ0ICsgYm5kcy53aWR0aDtcbiAgICAgICAgICAgIGNvbnN0IGJuZHNCb3R0b20gPSBibmRzLnRvcCArIGJuZHMuaGVpZ2h0O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoYm5kc1JpZ2h0IDwgYm91bmRzUmlnaHQgfHwgYm5kc0JvdHRvbSA8IGJvdW5kc0JvdHRvbSlcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gQ2hlY2sgei1pbmRleCB0byBkZXRlcm1pbmUgaWYgZWxlbSBvYnNjdXJlcyBydWxlQ29udGV4dFxuICAgICAgICAgICAgY29uc3QgelN0eWxlID0gd2luLmdldENvbXB1dGVkU3R5bGUoZWxlbSk7XG4gICAgICAgICAgICBpZiAoIXpTdHlsZSkgY29udGludWU7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNvbnN0IGVsZW1aaW5kZXggPSBwYXJzZUludCh6U3R5bGUuekluZGV4ID09PSAnYXV0bycgfHwgIXpTdHlsZS56SW5kZXggfHwgaXNOYU4oTnVtYmVyKHpTdHlsZS56SW5kZXgpKSA/ICcwJyA6IHpTdHlsZS56SW5kZXgpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBJZiBiZWZvcmUgcnVsZUNvbnRleHQgaW4gRE9NIG9yZGVyLCBlbGVtIG11c3QgaGF2ZSBoaWdoZXIgei1pbmRleCB0byBvYnNjdXJlXG4gICAgICAgICAgICAvLyBJZiBhZnRlciBydWxlQ29udGV4dCBpbiBET00gb3JkZXIsIGVsZW0gY2FuIG9ic2N1cmUgd2l0aCBlcXVhbCBvciBoaWdoZXIgei1pbmRleFxuICAgICAgICAgICAgaWYgKChiZWZvcmUgJiYgZWxlbVppbmRleCA+IHppbmRleCkgfHwgKCFiZWZvcmUgJiYgZWxlbVppbmRleCA+PSB6aW5kZXgpKSB7XG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgZWxlbWVudCBoYXMgb3BhcXVlIGJhY2tncm91bmRcbiAgICAgICAgICAgICAgICBsZXQgaGFzT3BhcXVlQmFja2dyb3VuZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmICh6U3R5bGUuYmFja2dyb3VuZCAmJiB6U3R5bGUuYmFja2dyb3VuZCAhPT0gJ25vbmUnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJnQ29sb3IgPSBDb2xvclV0aWwuQ29sb3IoelN0eWxlLmJhY2tncm91bmQpO1xuICAgICAgICAgICAgICAgICAgICBoYXNPcGFxdWVCYWNrZ3JvdW5kID0gYmdDb2xvciAmJiAoYmdDb2xvci5hbHBoYSA9PT0gdW5kZWZpbmVkIHx8IGJnQ29sb3IuYWxwaGEgPiAwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFoYXNPcGFxdWVCYWNrZ3JvdW5kICYmIHpTdHlsZS5iYWNrZ3JvdW5kQ29sb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYmdDb2xvciA9IENvbG9yVXRpbC5Db2xvcih6U3R5bGUuYmFja2dyb3VuZENvbG9yKTtcbiAgICAgICAgICAgICAgICAgICAgaGFzT3BhcXVlQmFja2dyb3VuZCA9IGJnQ29sb3IgJiYgKGJnQ29sb3IuYWxwaGEgPT09IHVuZGVmaW5lZCB8fCBiZ0NvbG9yLmFscGhhID4gMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIElmIGVsZW1lbnQgaGFzIG5vIGNvbnRlbnQgYW5kIG5vIG9wYXF1ZSBiYWNrZ3JvdW5kLCBza2lwIGl0XG4gICAgICAgICAgICAgICAgaWYgKCFDb21tb25VdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbihlbGVtKSAmJiAhaGFzT3BhcXVlQmFja2dyb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfb2JzY3VyZWRcIiwgW10pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgQ1NTVXRpbCB9IGZyb20gXCIuLi91dGlsL0NTU1V0aWxcIjtcbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHksIFJ1bGVQb3RlbnRpYWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IERPTU1hcHBlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NTWFwcGVyXCI7XG5cbmV4cG9ydCBjb25zdCBlbGVtZW50X3RhYmJhYmxlX3Zpc2libGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZWxlbWVudF90YWJiYWJsZV92aXNpYmxlXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIGRlcGVuZGVuY2llczogW10sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJlbGVtZW50X3RhYmJhYmxlX3Zpc2libGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJwYXNzXCI6IFwiZWxlbWVudF90YWJiYWJsZV92aXNpYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX3Zpc2libGVcIjogXCJlbGVtZW50X3RhYmJhYmxlX3Zpc2libGUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIkEgdGFiYmFibGUgZWxlbWVudCBzaG91bGQgYmUgdmlzaWJsZSBvbiB0aGUgc2NyZWVuIHdoZW4gaXQgaGFzIGtleWJvYXJkIGZvY3VzXCIsXG4gICAgICAgICAgICBcInBhc3NcIjogXCJUaGUgdGFiYmFibGUgZWxlbWVudCBpcyB2aXNpYmxlIG9uIHRoZSBzY3JlZW5cIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX3Zpc2libGVcIjogXCJDb25maXJtIHRoZSBlbGVtZW50IHNob3VsZCBiZSB0YWJiYWJsZSBhbmQgaWYgc28sIGl0IGJlY29tZXMgdmlzaWJsZSB3aGVuIGl0IGhhcyBrZXlib2FyZCBmb2N1c1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBpZDogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBudW06IFtcIjIuNC43XCJdLFxuICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgaWYgKCFDb21tb25VdGlsLmlzVGFiYmFibGUocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgIGNvbnN0IG1hcHBlciA6IERPTU1hcHBlciA9IG5ldyBET01NYXBwZXIoKTtcbiAgICAgICAgY29uc3QgYm91bmRzID0gbWFwcGVyLmdldFVuYWRqdXN0ZWRCb3VuZHMocnVsZUNvbnRleHQpO1xuICAgICAgICBcbiAgICAgICAgLy9pbiBjYXNlIHRoZSBib3VuZHMgbm90IGF2YWlsYWJsZVxuICAgICAgICBpZiAoIWJvdW5kcykgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICAvLyBHZXQgYWxsIG5lZWRlZCBzdHlsZXMgaW4gYSBzaW5nbGUgcGFzcyB0aHJvdWdoIHN0eWxlc2hlZXRzXG4gICAgICAgIGNvbnN0IGFsbFN0eWxlcyA9IENTU1V0aWwuZ2V0RGVmaW5lZFN0eWxlc011bHRpcGxlKHJ1bGVDb250ZXh0LCBbXCJwb3NpdGlvblwiLCBcImNsaXBcIl0sIFtcIlwiLCBcIjpmb2N1c1wiXSk7XG4gICAgICAgIGNvbnN0IGRlZmluZWRfc3R5bGVzID0gYWxsU3R5bGVzW1wiXCJdO1xuICAgICAgICBjb25zdCBvbmZvY3VzX3N0eWxlcyA9IGFsbFN0eWxlc1tcIjpmb2N1c1wiXTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgaWYgKGJvdW5kc1snaGVpZ2h0J10gPT09IDAgfHwgYm91bmRzWyd3aWR0aCddID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfdmlzaWJsZVwiLCBbXSk7XG5cbiAgICAgICAgaWYgKGRlZmluZWRfc3R5bGVzWydwb3NpdGlvbiddPT09J2Fic29sdXRlJyAmJiBkZWZpbmVkX3N0eWxlc1snY2xpcCddICYmIGRlZmluZWRfc3R5bGVzWydjbGlwJ10ucmVwbGFjZUFsbCgnICcsICcnKT09PSdyZWN0KDBweCwwcHgsMHB4LDBweCknXG4gICAgICAgICAgICAmJiAhb25mb2N1c19zdHlsZXNbJ2NsaXAnXSkge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBub3RlIHRoYXQgQSB1c2VyIGNhbiBzZWxlY3QgYSBjaGVja2JveCBhbmQgcmFkaW8gYnV0dG9uIGJ5IHNlbGVjdGluZyB0aGUgYnV0dG9uIG9yIHRoZSBsYWJlbCB0ZXh0LlxuICAgICAgICAgICAgICogV2hlbiBhIGNoZWNrYm94IG9yIHJhZGlvIGJ1dHRvbiBpcyBjbGlwcGVkIHRvIDAgc2l6ZSwgaXQgaXMgc3RpbGwgYXZhaWxhYmxlIHRvIGEga2V5Ym9hcmQgb3IgYSBzY3JlZW4gcmVhZGVyLlxuICAgICAgICAgICAgICogVGhlIHJ1bGUgc2hvdWxkIGJlIHBhc3NlZCBpZiB0aGUgbGFiZWwgdGV4dCBleGlzdHMgYW5kIHRoZSBidXR0b24gb24tZm9jdXMgc3R5bGUgaXMgZGVmaW5lZCBieSB0aGUgdXNlcixcbiAgICAgICAgICAgICAqIHdoaWNoIGxpa2VseSBpbmN1cnMgdGhlIGNoYW5nZXMgb2YgdGhlIGxhYmVsIHN0eWxlLlxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBpZiAobm9kZU5hbWUgPT09ICdpbnB1dCcgJiYgKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZSgndHlwZScpPT09J2NoZWNrYm94JyB8fCBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoJ3R5cGUnKT09PSdyYWRpbycpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGFiZWwgPSBDb21tb25VdGlsLmdldExhYmVsRm9yRWxlbWVudChydWxlQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgaWYgKGxhYmVsICYmICFDb21tb25VdGlsLmlzSW5uZXJUZXh0RW1wdHkobGFiZWwpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEdldCBhZGRpdGlvbmFsIHBzZXVkby1jbGFzcyBzdHlsZXMgKHJldXNlIG9uZm9jdXNfc3R5bGVzIGZyb20gbGluZSA2MClcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHNldWRvU3R5bGVzID0gQ1NTVXRpbC5nZXREZWZpbmVkU3R5bGVzTXVsdGlwbGUocnVsZUNvbnRleHQsIG51bGwsIFtcIjpmb2N1cy12aXNpYmxlXCIsIFwiOmZvY3VzLXdpdGhpblwiLCBcIjpjaGVja2VkXCIsIFwiOmZvY3VzXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9jdXNfdmlzaWJsZV9zdHlsZXMgPSBwc2V1ZG9TdHlsZXNbXCI6Zm9jdXMtdmlzaWJsZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9jdXNfd2l0aGluX3N0eWxlcyA9IHBzZXVkb1N0eWxlc1tcIjpmb2N1cy13aXRoaW5cIl07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoZWNrZWRfc3R5bGVzID0gcHNldWRvU3R5bGVzW1wiOmNoZWNrZWRcIl07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9uZm9jdXNfc3R5bGVzID0gcHNldWRvU3R5bGVzW1wiOmZvY3VzXCJdO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChvbmZvY3VzX3N0eWxlcyB8fCBmb2N1c192aXNpYmxlX3N0eWxlcyB8fCBmb2N1c193aXRoaW5fc3R5bGVzIHx8IGNoZWNrZWRfc3R5bGVzKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF92aXNpYmxlXCIsIFtdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChib3VuZHNbJ3RvcCddID49IDAgJiYgYm91bmRzWydsZWZ0J10gPj0gMClcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBkZWZhdWx0X3N0eWxlcyA9IGdldENvbXB1dGVkU3R5bGUocnVsZUNvbnRleHQpO1xuICAgICAgICBcbiAgICAgICAgbGV0IHRvcCA9IGJvdW5kc1sndG9wJ107XG4gICAgICAgIGxldCBsZWZ0ID0gYm91bmRzWydsZWZ0J107XG4gICAgICAgXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhvbmZvY3VzX3N0eWxlcykubGVuZ3RoID09PSAwICkge1xuICAgICAgICAgICAgLy8gbm8gb25mb2N1cyBwb3NpdGlvbiBjaGFuZ2UsIGJ1dCBjb3VsZCBiZSBjaGFuZ2VkIGZyb20ganNcbiAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX3Zpc2libGVcIiwgW10pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gd2l0aCBvbmZvY3VzIHBvc2l0aW9uIGNoYW5nZVxuICAgICAgICAgICAgdmFyIHBvc2l0aW9ucyA9IFsnYWJzb2x1dGUnLCAnZml4ZWQnXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb25mb2N1c19zdHlsZXNbJ3RvcCddICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbnMuaW5jbHVkZXMob25mb2N1c19zdHlsZXNbJ3Bvc2l0aW9uJ10pIHx8ICh0eXBlb2Ygb25mb2N1c19zdHlsZXNbJ3Bvc2l0aW9uJ10gPT09ICd1bmRlZmluZWQnICYmIHBvc2l0aW9ucy5pbmNsdWRlcyhkZWZhdWx0X3N0eWxlc1sncG9zaXRpb24nXSkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRvcCA9IG9uZm9jdXNfc3R5bGVzWyd0b3AnXS5yZXBsYWNlKC9cXEQvZywnJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHBvc2l0aW9uIGlzIHVuZGVmaW5lZCBhbmQgdGhlIHBhcmVudCdzIHBvc2l0aW9uIGlzICdyZWxhdGl2ZSdcbiAgICAgICAgICAgICAgICAgICAgdG9wID0gTnVtYmVyLk1JTl9WQUxVRTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIG9uZm9jdXNfc3R5bGVzWydsZWZ0J10gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9ucy5pbmNsdWRlcyhvbmZvY3VzX3N0eWxlc1sncG9zaXRpb24nXSkgfHwgKHR5cGVvZiBvbmZvY3VzX3N0eWxlc1sncG9zaXRpb24nXSA9PT0gJ3VuZGVmaW5lZCcgJiYgcG9zaXRpb25zLmluY2x1ZGVzKGRlZmF1bHRfc3R5bGVzWydwb3NpdGlvbiddKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbGVmdCA9IG9uZm9jdXNfc3R5bGVzWydsZWZ0J10ucmVwbGFjZSgvXFxEL2csJycpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBwb3NpdGlvbiBpcyB1bmRlZmluZWQgYW5kIHRoZSBwYXJlbnQncyBwb3NpdGlvbiBpcyAncmVsYXRpdmUnXG4gICAgICAgICAgICAgICAgICAgIGxlZnQgPSBOdW1iZXIuTUlOX1ZBTFVFO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKHRvcCA+PSAwICYmIGxlZnQgPj0gMClcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX3Zpc2libGVcIiwgW10pO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGVtYmVkX2FsdF9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZW1iZWRfYWx0X2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmVtYmVkXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfRW1iZWRfSGFzQWx0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImVtYmVkX2FsdF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcImVtYmVkX2FsdF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImVtYmVkX2FsdF9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0aGF0IHRoZSA8ZW1iZWQ+IGVsZW1lbnQgaGFzIGFsdGVybmF0aXZlIGNvbnRlbnRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJQcm92aWRlIGFsdGVybmF0aXZlIGNvbnRlbnQgZm9yIDxlbWJlZD4gZWxlbWVudHNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX0ZPVVJcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwiYWx0XCIpO1xuICAgICAgICByZXR1cm4gcGFzc2VkID8gUnVsZVBhc3MoXCJQYXNzXzBcIikgOiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGVtb3RpY29uc19hbHRfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcImVtb3RpY29uc19hbHRfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX1RleHRfRW1vdGljb25zXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImVtb3RpY29uc19hbHRfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJlbW90aWNvbnNfYWx0X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZW1vdGljb25zX2FsdF9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0aGF0IGVtb3RpY29ucyBoYXZlIGEgdGV4dCBhbHRlcm5hdGl2ZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVtb3RpY29ucyBtdXN0IGhhdmUgYSBzaG9ydCB0ZXh0IGFsdGVybmF0aXZlIHRoYXQgZGVzY3JpYmVzIHRoZWlyIHB1cnBvc2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBEZWNpc2lvbiBpbiBwbGFubmluZyA5LzcvMjMgdGhhdCB0aGlzIHJ1bGUgY2F1c2VzIG1vcmUgcmV2aWV3cyB0aGF0IHdlIHNlZSBhY3R1YWwgcHJvYmxlbXMgaW4gY29udGVudCwgc28gdHVybiB0aGVzZSBydWxlcyBvZmZcbiAgICBcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICAqL1xuICAgIHJ1bGVzZXRzOiBbXSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRlUGFyYW1zID0ge1xuICAgICAgICAgICAgZW1vdGljb25zOiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IFtcIjotKVwiLCBcIjopXCIsIFwiOm8pXCIsIFwiOl1cIiwgXCI6M1wiLCBcIjpjKVwiLCBcIjo+XCIsIFwiPV1cIiwgXCI4KVwiLCBcIj0pXCIsIFwiOkRcIiwgXCJDOlwiLFxuICAgICAgICAgICAgICAgICAgICBcIjotRFwiLCBcIjpEXCIsIFwiOERcIiwgXCJYRFwiLCBcIj1EXCIsIFwiPTNcIiwgXCI8PTNcIiwgXCI8PThcIiwgXCItLSEtLVwiLCBcIjotKFwiLCBcIjooXCIsIFwiOmNcIiwgXCI6PFwiLCBcIjpbXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiRDpcIiwgXCJEOFwiLCBcIkQ7XCIsIFwiRD1cIiwgXCJEWFwiLCBcInYudlwiLCBcIjotOVwiLCBcIjstKVwiLCBcIjspXCIsIFwiKilcIiwgXCI7XVwiLCBcIjtEXCIsIFwiOi1QXCIsIFwiOlBcIixcbiAgICAgICAgICAgICAgICAgICAgXCI6LXBcIiwgXCI6cFwiLCBcIj1wXCIsIFwiOi3DnlwiLCBcIjrDnlwiLCBcIjotYlwiLCBcIjpiXCIsIFwiOi1PXCIsIFwiOk9cIiwgXCJPX09cIiwgXCJvX29cIiwgXCI4T1wiLCBcIk93T1wiLCBcIk8tT1wiLFxuICAgICAgICAgICAgICAgICAgICBcIjBfb1wiLCBcIk9fb1wiLCBcIk8zT1wiLCBcIm8wb8KgO29fbztcIiwgXCJvLi4ub1wiLCBcIjB3MFwiLCBcIjotL1wiLCBcIjovXCIsIFwiOlxcXFxcIiwgXCI9L1wiLCBcIj1cXFxcXCIsIFwiOlNcIiwgXCI6fFwiLFxuICAgICAgICAgICAgICAgICAgICBcImQ6LSlcIiwgXCJxQi0pXCIsIFwiOil+XCIsIFwiOi0pPi4uLi5cIiwgXCI6LVhcIiwgXCI6WFwiLCBcIjotI1wiLCBcIjojXCIsIFwiTzotKVwiLCBcIjA6M1wiLCBcIk86KVwiLCBcIjonKFwiLCBcIjsqKFwiLFxuICAgICAgICAgICAgICAgICAgICBcIlRfVFwiLCBcIlRUX1RUXCIsIFwiVC5UXCIsIFwiOi0qXCIsIFwiOipcIiwgXCJebylcIiwgXCI+OilcIiwgXCI+OylcIiwgXCI+Oi0pXCIsIFwiQilcIiwgXCJCLSlcIiwgXCI4KVwiLCBcIjgtKVwiLFxuICAgICAgICAgICAgICAgICAgICBcIl4+Lj5eXCIsIFwiXjwuPF5cIiwgXCJePl8+XlwiLCBcIl48XzxeXCIsIFwiRDo8XCIsIFwiPjooXCIsIFwiRC06PFwiLCBcIj46LShcIiwgXCI6LUBbMV1cIiwgXCI7KFwiLCBcImBfwrRcIiwgXCJEPFwiLFxuICAgICAgICAgICAgICAgICAgICBcIjwzXCIsIFwiPDMzM1wiLCBcIj1eX149XCIsIFwiPT4uPj1cIiwgXCI9PF88PVwiLCBcIj0+Ljw9XCIsIFwiXFxcXCwsL1wiLCBcIlxcXFxtL1wiLCBcIlxcXFxtL1xcXFw+LjwvXFxcXG0vXCIsIFwiXFxcXG8vXCIsIFwiXFxcXG8gby9cIixcbiAgICAgICAgICAgICAgICAgICAgXCJvL1xcXFxvXCIsIFwiOiZcIiwgXCI6dVwiXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB0eXBlOiBcIltzdHJpbmddXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgZW1vdGljb25zID0gdmFsaWRhdGVQYXJhbXMuZW1vdGljb25zLnZhbHVlO1xuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgbGV0IHRlc3RUZXh0ID0gXCJcIjtcblxuICAgICAgICBsZXQgd2Fsa05vZGU6IE5vZGUgPSBydWxlQ29udGV4dC5maXJzdENoaWxkO1xuICAgICAgICB3aGlsZSAod2Fsa05vZGUpIHtcbiAgICAgICAgICAgIC8vIENvbXBseSB0byB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyB3aWxsIGJlIGRvbmUgYnkgZGVmYXVsdCBhcyB0aGlzIHJ1bGUgdHJpZ2dlcnMgb24gZWFjaCBlbGVtZW50XG4gICAgICAgICAgICAvLyBhbmQgZm9yIGVhY2ggZWxlbWVudCBpdCBvbmx5IGNoZWNrcyB0aGF0IHNpbmdsZSBlbGVtZW50cyB0ZXh0IG5vZGVzIGFuZCBub3RoaW5nIGVsc2UuIFNvIGFsbCBpbm5lciBlbGVtZW50cyB3aWxsIGJlXG4gICAgICAgICAgICAvLyBjb3ZlcmVkIG9uIHRoZWlyIG93bi4gQ3VycmVudGx5IGZvciB0aGlzIHJ1bGUgYnkgZGVmYXVsdCBDaGVjayBIaWRkZW4gQ29udGVudCB3aWxsIHdvcmssIGFzIHdlIGFyZSBkb2luZ1xuICAgICAgICAgICAgLy8gYSBub2RlIHdhbGsgb25seSBvbiBzaWJsaW5ncyBzbyBpdCB3b3VsZCBub3QgZ2V0IHRleHQgbm9kZXMgZnJvbSBvdGhlciBzaWJsaW5ncyBhdCBhbGwuXG4gICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSBpbiB0aGUgZnV0dXJlIHNvbWV0aGluZyBjaG5nZXMsIGp1c3QgbmVlZCB0byBhZGQgJiYgIVJQVFV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbih3YWxrTm9kZSkgdG8gdGhlIGJlbG93XG4gICAgICAgICAgICAvLyBpZi5cbiAgICAgICAgICAgIGlmICh3YWxrTm9kZS5ub2RlTmFtZSA9PSBcIiN0ZXh0XCIpIHtcbiAgICAgICAgICAgICAgICB0ZXN0VGV4dCArPSBcIiBcIiArIHdhbGtOb2RlLm5vZGVWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdhbGtOb2RlID0gd2Fsa05vZGUubmV4dFNpYmxpbmc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGVzdFRleHQudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBwYXNzZWQgJiYgaiA8IGVtb3RpY29ucy5sZW5ndGg7ICsraikge1xuICAgICAgICAgICAgICAgIGxldCBlbW90SWR4ID0gdGVzdFRleHQuaW5kZXhPZihlbW90aWNvbnNbal0pO1xuICAgICAgICAgICAgICAgIGxldCBlTG5ndGggPSBlbW90aWNvbnNbal0ubGVuZ3RoO1xuICAgICAgICAgICAgICAgIHdoaWxlIChwYXNzZWQgJiYgZW1vdElkeCAhPSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBQYXNzZXMgaWY6IHRoZSBlbW90aWNvbiBpcyBub3QgcHJlY2VkZWQgYnkgd2hpdGVzcGFjZSxcbiAgICAgICAgICAgICAgICAgICAgLy8gb3IgdGhlIGVtb3RpY29uIGlzIG5vdCBmb2xsb3dlZCBieSB3aGl0ZXNwYWNlIHVubGVzcyBpdCdzIHB1bmN0dWF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAvLyBvciBpdCdzIGluIGEgcHJlLCBjb2RlLCBvciBzY3JpcHRcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID1cbiAgICAgICAgICAgICAgICAgICAgICAgIChlbW90SWR4ID4gMCAmJiAhL1xccy8udGVzdCh0ZXN0VGV4dC5zdWJzdHJpbmcoZW1vdElkeCAtIDEsIGVtb3RJZHgpKSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIChlbW90SWR4IDwgdGVzdFRleHQubGVuZ3RoIC0gZUxuZ3RoICYmICEvXFxzLy50ZXN0KHRlc3RUZXh0LnN1YnN0cmluZyhlbW90SWR4ICsgZUxuZ3RoLCBlbW90SWR4ICsgZUxuZ3RoICsgMSkpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIS9bLiwhJ1wiP10vLnRlc3QodGVzdFRleHQuc3Vic3RyaW5nKGVtb3RJZHggKyBlTG5ndGgsIGVtb3RJZHggKyBlTG5ndGggKyAxKSkpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIEFsbG93IHVzYWdlIG9mICg6IHN0dWZmIDopIHNpbmNlIHRoaXMgaXMgYSBjb21tZW50IGluIHNvbWUgbGFuZ3VhZ2VzXG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IHBhc3NlZCB8fCAoKGVtb3RpY29uc1tqXSA9PSBcIjopXCIgfHwgZW1vdGljb25zW2pdID09IFwiKDpcIikgJiYgL1xcKFxcOi4qXFw6XFwpLy50ZXN0KHRlc3RUZXh0KSk7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IHBhc3NlZCB8fCAoKGVtb3RpY29uc1tqXSA9PSBcIjspXCIgfHwgZW1vdGljb25zW2pdID09IFwiKDtcIikgJiYgL1xcKFxcOy4qXFw7XFwpLy50ZXN0KHRlc3RUZXh0KSk7XG4gICAgICAgICAgICAgICAgICAgIGVtb3RJZHggPSB0ZXN0VGV4dC5pbmRleE9mKGVtb3RpY29uc1tqXSwgZW1vdElkeCArIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAvLyBEb24ndCB0cmlnZ2VyIGlmIHdlJ3JlIG5vdCBpbiB0aGUgYm9keSBvciBpZiB3ZSdyZSBpbiBhIHNjcmlwdCwgcHJlLCBjb2RlXG4gICAgICAgICAgICBsZXQgY2hlY2tBbmNlc3RvciA9IENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFtcInByZVwiLCBcImNvZGVcIiwgXCJzY3JpcHRcIiwgXCJib2R5XCJdKTtcbiAgICAgICAgICAgIHBhc3NlZCA9IGNoZWNrQW5jZXN0b3IgPT0gbnVsbCB8fCBjaGVja0FuY2VzdG9yLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgIT0gXCJib2R5XCI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBlcnJvcl9tZXNzYWdlX2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJlcnJvcl9tZXNzYWdlX2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbYXJpYS1pbnZhbGlkPXRydWVdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJIQUFDX0FyaWFfRXJyb3JNZXNzYWdlXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJGYWlsXzJcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImVycm9yX21lc3NhZ2VfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZXJyb3JfbWVzc2FnZV9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJlcnJvcl9tZXNzYWdlX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZXJyb3JfbWVzc2FnZV9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJDdXN0b20gZXJyb3IgbWVzc2FnZSBoYXMgaW52YWxpZCByZWZlcmVuY2UgJ2lkJyB2YWx1ZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJDdXN0b20gZXJyb3IgbWVzc2FnZSBpcyBub3QgdmlzaWJsZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkEgY3VzdG9tIGVycm9yIG1lc3NhZ2UgbXVzdCByZWZlcmVuY2UgYSB2YWxpZCAnaWQnIHZhbHVlIGFuZCB3aGVuIHRyaWdnZXJlZCB0aGUgbWVzc2FnZSBtdXN0IGJlIGFwcHJvcHJpYXRlbHkgZXhwb3NlZFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMy4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IGFyaWFfZXJyTXNnSWQgPSBBcmlhVXRpbC5nZXRBcmlhQXR0cmlidXRlKHJ1bGVDb250ZXh0LCBcImFyaWEtZXJyb3JtZXNzYWdlXCIpO1xuXG4gICAgICAgIC8vIElmIGFyaWEtZXJyb3JtZXNzYWdlIGlzIG5vdCBwcm92aWRlZCwgdGhlbiBPVVRfT0ZfU0NPUEVcbiAgICAgICAgaWYgKCFhcmlhX2Vyck1zZ0lkKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBtc2dfZWxlID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQocnVsZUNvbnRleHQsIGFyaWFfZXJyTXNnSWQpO1xuXG4gICAgICAgIC8vIFBPRjA6IEludmFsaWQgaWQgcmVmZXJlbmNlXG4gICAgICAgIGlmICghbXNnX2VsZSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUE9GMTogUmVmZXJlbmNlZCBlbGVtZW50IGlzIG5vdCB2aXNpYmxlXG4gICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKG1zZ19lbGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzJcIik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG5pbXBvcnQgeyBDYWNoZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgQWNjTmFtZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BY2NOYW1lVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgZmllbGRzZXRfbGFiZWxfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZmllbGRzZXRfbGFiZWxfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImFyaWE6Z3JvdXBcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcImdyb3VwX3dpdGhJbnB1dHNfaGFzTmFtZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMVwiOiBcIlBhc3NfMVwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiRmFpbF8yXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzFcIjogXCJmaWVsZHNldF9sYWJlbF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImZpZWxkc2V0X2xhYmVsX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiZmllbGRzZXRfbGFiZWxfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImZpZWxkc2V0X2xhYmVsX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18xXCI6IFwiR3JvdXAvRmllbGRzZXQgXFxcInswfVxcXCIgd2l0aCBhbiBpbnB1dCBoYXMgYSB1bmlxdWUgbmFtZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJHcm91cC9GaWVsZHNldCBkb2VzIG5vdCBoYXZlIGFuIGFjY2Vzc2libGUgbmFtZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJHcm91cC9GaWVsZHNldCBcXFwiezB9XFxcIiBoYXMgYSBkdXBsaWNhdGUgbmFtZSB0byBhbm90aGVyIGdyb3VwXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiR3JvdXBzIHdpdGggbmVzdGVkIGlucHV0cyBtdXN0IGhhdmUgdW5pcXVlIGFjY2Vzc2libGUgbmFtZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbeyBcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sIFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiLCBcIjMuMy4yXCJdLCBcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sIFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFIFxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcblxuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IGlzIGhpZGRlbiBvciBkaXNhYmxlZFxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpIHx8IENvbW1vblV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGxldCBvd25lckRvY3VtZW50ID0gRnJhZ21lbnRVdGlsLmdldE93bmVyRnJhZ21lbnQocnVsZUNvbnRleHQpO1xuICAgICAgICBsZXQgZm9ybUNhY2hlID0gQ2FjaGVVdGlsLmdldENhY2hlKFxuICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgIFwibGFuZG1hcmtfZ3JvdXBfaW5wdXRcIixcbiAgICAgICAgICAgIG51bGxcbiAgICAgICAgKTtcbiAgICAgICAgXG4gICAgICAgIGlmICghZm9ybUNhY2hlKSB7XG4gICAgICAgICAgICBmb3JtQ2FjaGUgPSB7XG4gICAgICAgICAgICAgICAgZ3JvdXBzV2l0aElucHV0czogW10sXG4gICAgICAgICAgICAgICAgZ3JvdXBzV2l0aElucHV0c0NvbXB1dGVkTGFiZWxzOiBbXSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBsZXQgYWxsR3JvdXBzVGVtcCA9IG93bmVyRG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcbiAgICAgICAgICAgICAgICAnZmllbGRzZXQsW3JvbGU9XCJncm91cFwiXSdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBsZXQgYWxsR3JvdXBzID0gQXJyYXkuZnJvbShhbGxHcm91cHNUZW1wKTtcbiAgICAgICAgICAgIGxldCBncm91cHNXaXRoSW5wdXRzID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFsbEdyb3Vwcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIC8vIExvb3Agb3ZlciBhbGwgdGhlIGdyb3VwIG5vZGVzXG4gICAgICAgICAgICAgICAgaWYgKGFsbEdyb3Vwc1tpXS5xdWVyeVNlbGVjdG9yKFwiaW5wdXRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBzV2l0aElucHV0cy5wdXNoKGFsbEdyb3Vwc1tpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGdyb3Vwc1dpdGhJbnB1dHNDb21wdXRlZExhYmVscyA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBncm91cHNXaXRoSW5wdXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZShncm91cHNXaXRoSW5wdXRzW2ldKTtcbiAgICAgICAgICAgICAgICAvLyBMb29wIG92ZXIgYWxsIHRoZSBsYW5kbWFyayBub2Rlc1xuICAgICAgICAgICAgICAgIGdyb3Vwc1dpdGhJbnB1dHNDb21wdXRlZExhYmVscy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAvKipBUklBTWFwcGVyLmNvbXB1dGVOYW1lKGdyb3Vwc1dpdGhJbnB1dHNbaV0pKi9cbiAgICAgICAgICAgICAgICAgICAgcGFpciAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwID8gcGFpci5uYW1lLnRyaW0oKSA6IFwiXCJcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9ybUNhY2hlLmdyb3Vwc1dpdGhJbnB1dHMgPSBncm91cHNXaXRoSW5wdXRzO1xuICAgICAgICAgICAgZm9ybUNhY2hlLmdyb3Vwc1dpdGhJbnB1dHNDb21wdXRlZExhYmVscyA9XG4gICAgICAgICAgICAgICAgZ3JvdXBzV2l0aElucHV0c0NvbXB1dGVkTGFiZWxzO1xuXG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUocnVsZUNvbnRleHQub3duZXJEb2N1bWVudCwgXCJsYW5kbWFya19ncm91cF9pbnB1dFwiLGZvcm1DYWNoZSk7ICAgIFxuICAgICAgICB9XG4gICAgICAgIC8vIGZvcm1DYWNoZS5ncm91cHNXaXRoSW5wdXRzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgIC8vICAgICBjb25zb2xlLmxvZyhcImZvcm1DYWNoZS5ncm91cHNXaXRoSW5wdXRzOiBcIiArZWxlbWVudC5pZClcbiAgICAgICAgLy8gfSk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiZm9ybUNhY2hlLmdyb3Vwc1dpdGhJbnB1dHNDb21wdXRlZExhYmVsczogXCIgK2Zvcm1DYWNoZS5ncm91cHNXaXRoSW5wdXRzQ29tcHV0ZWRMYWJlbHMpXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiZm9ybUNhY2hlLmdyb3Vwc1dpdGhJbnB1dHNDb21wdXRlZExhYmVsczogXCIgK2Zvcm1DYWNoZS5ncm91cHNXaXRoSW5wdXRzQ29tcHV0ZWRMYWJlbHMubGVuZ3RoKVxuXG4gICAgICAgIGxldCBydWxlQ29udGV4dEZvdW5kSW5ncm91cHNXaXRoSW5wdXRzRmxhZyA9IGZhbHNlO1xuICAgICAgICBsZXQgY29tcHV0ZWROYW1lID0gXCJcIjtcbiAgICAgICAgaWYgKCFmb3JtQ2FjaGUuZ3JvdXBzV2l0aElucHV0cykge1xuICAgICAgICAgICAgLy8gV2UgZG8gbm90IGhhdmUgYW55IGdyb3VwcyB3aXRoIGlucHV0cy4gVGhlcmVmb3JlIHdlIHNob3VsZCBza2lwIHRoaXMgcnVsZSB0cmlnZ2VyLlxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZvcm1DYWNoZS5ncm91cHNXaXRoSW5wdXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuaXNTYW1lTm9kZShmb3JtQ2FjaGUuZ3JvdXBzV2l0aElucHV0c1tpXSkpIHtcbiAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIGZvdW5kIG91ciBydWxlQ29udGV4dCBpbiB0aGUgY2FjaGVcbiAgICAgICAgICAgICAgICBydWxlQ29udGV4dEZvdW5kSW5ncm91cHNXaXRoSW5wdXRzRmxhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBmb3JtQ2FjaGUuZ3JvdXBzV2l0aElucHV0c0NvbXB1dGVkTGFiZWxzW2ldID09PSBcIlwiIHx8XG4gICAgICAgICAgICAgICAgICAgIGZvcm1DYWNoZS5ncm91cHNXaXRoSW5wdXRzQ29tcHV0ZWRMYWJlbHNbaV0gPT09IG51bGxcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJGYWlsXzFcIilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgZm91bmRTYW1lTmFtZUZsYWcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBmb3IgKFxuICAgICAgICAgICAgICAgICAgICBsZXQgaiA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGogPCBmb3JtQ2FjaGUuZ3JvdXBzV2l0aElucHV0c0NvbXB1dGVkTGFiZWxzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgaisrXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpID09IGopIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9IC8vIFdlIGRvIG5vdCB3YW50IHRvIGNvbXBhcmUgYWdhaW5zdCBvdXJzZWxmc1xuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ2FjaGUuZ3JvdXBzV2l0aElucHV0c0NvbXB1dGVkTGFiZWxzW2ldID09PVxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNhY2hlLmdyb3Vwc1dpdGhJbnB1dHNDb21wdXRlZExhYmVsc1tqXVxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kU2FtZU5hbWVGbGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZm91bmRTYW1lTmFtZUZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJGYWlsXzJcIilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8yXCIsIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1DYWNoZS5ncm91cHNXaXRoSW5wdXRzQ29tcHV0ZWRMYWJlbHNbaV0sXG4gICAgICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb21wdXRlZE5hbWUgPSBmb3JtQ2FjaGUuZ3JvdXBzV2l0aElucHV0c0NvbXB1dGVkTGFiZWxzW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghcnVsZUNvbnRleHRGb3VuZEluZ3JvdXBzV2l0aElucHV0c0ZsYWcpIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwibnVsbCByZXR1cm5cIilcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiUGFzc18xXCIpXG4gICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMVwiLCBbY29tcHV0ZWROYW1lXSk7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBmaWVsZHNldF9sZWdlbmRfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZmllbGRzZXRfbGVnZW5kX3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJkb206ZmllbGRzZXRcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9GaWVsZHNldF9IYXNMZWdlbmRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkZhaWxfMlwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJGYWlsXzNcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImZpZWxkc2V0X2xlZ2VuZF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImZpZWxkc2V0X2xlZ2VuZF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcImZpZWxkc2V0X2xlZ2VuZF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcImZpZWxkc2V0X2xlZ2VuZF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZmllbGRzZXRfbGVnZW5kX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiPGZpZWxkc2V0PiBlbGVtZW50IGRvZXMgbm90IGhhdmUgYSA8bGVnZW5kPlwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCI8ZmllbGRzZXQ+IGVsZW1lbnQgaGFzIG1vcmUgdGhhbiBvbmUgPGxlZ2VuZD5cIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiPGZpZWxkc2V0PiBlbGVtZW50IDxsZWdlbmQ+IGlzIGVtcHR5XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiIDxmaWVsZHNldD4gZWxlbWVudHMgc2hvdWxkIGhhdmUgYSBzaW5nbGUsIG5vbi1lbXB0eSA8bGVnZW5kPiBhcyBhIGxhYmVsXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSwgIC8vaHR0cHM6Ly93d3cudzMub3JnL1dBSS9XQ0FHMjIvVGVjaG5pcXVlcy9odG1sL0g3MVxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAvL3NraXAgaWYgdGhlIGZpZWxkc2V0IGlzIGhpZGRlbiBvciBkaXNhYmxlZFxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpIHx8IENvbW1vblV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gSW4gdGhlIGNhc2UgYSBsZWdlbmQgaXMgaGlkZGVuLCB3ZSBzaG91bGQgc3RpbGwgdHJpZ2dlciBhIHZpb2xhdGlvbnMgZm9yIHRoaXNcbiAgICAgICAgbGV0IGxlZ2VuZHMgPSBDb21tb25VdGlsLmdldENoaWxkQnlUYWdIaWRkZW4ocnVsZUNvbnRleHQsIFwibGVnZW5kXCIsIHRydWUsIGZhbHNlKTtcbiAgICAgICAgaWYgKGxlZ2VuZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBGaWVsZHNldCBoYXMgTk8gTGVnZW5kXG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH0gZWxzZSBpZiAobGVnZW5kcy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAvLyBGaWVsZHNldCBoYXMgbW9yZSB0aGFuIG9uZSBsZWdlbmRcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMlwiKTtcbiAgICAgICAgfSBlbHNlIGlmIChDb21tb25VdGlsLmdldElubmVyVGV4dChsZWdlbmRzWzBdKS50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBGaWVsZHNldCBoYXMgbGVnZW5kIGJ1dCBsZWdlbmQgaXMgZW1wdHlcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfM1wiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcbmltcG9ydCB7IEFjY05hbWVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQWNjTmFtZVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBmaWd1cmVfbGFiZWxfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcImZpZ3VyZV9sYWJlbF9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTpmaWd1cmVcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIkhBQUNfRmlndXJlX2xhYmVsXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiZmlndXJlX2xhYmVsX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImZpZ3VyZV9sYWJlbF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImZpZ3VyZV9sYWJlbF9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUaGUgPGZpZ3VyZT4gZWxlbWVudCBkb2VzIG5vdCBoYXZlIGFuIGFzc29jaWF0ZWQgbGFiZWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBIDxmaWd1cmU+IGVsZW1lbnQgbXVzdCBoYXZlIGFuIGFzc29jaWF0ZWQgbGFiZWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICAvLyBpZ25vcmUgaWYgYW4gZXhwbGljaXQgcm9sZSBpcyBzcGVjaWZpZWQuIHRoaXMgY2FzZSB3aWxsIGJlIGNvdmVyZWQgaW4gdGhlIGFyaWFfYWNjZXNzaWJsZW5hbWVfZXhpc3RzIHJ1bGVzXG4gICAgICAgIGxldCByb2xlID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwicm9sZVwiKTtcbiAgICAgICAgaWYgKHJvbGUpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9sZXQgcGFzc2VkID0gQXJpYVV0aWwuaGFzQXJpYUxhYmVsKHJ1bGVDb250ZXh0KSB8fCBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInRpdGxlXCIpO1xuICAgICAgICBjb25zdCBwYWlyID0gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgY29uc3QgcGFzc2VkID0gcGFpciAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwO1xuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIFtydWxlQ29udGV4dF0sICcnLCAnJywgW10pO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIsIFtdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG5leHBvcnQgY29uc3QgZm9ybV9mb250X2NvbG9yOiBSdWxlID0ge1xuICAgIGlkOiBcImZvcm1fZm9udF9jb2xvclwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmZvcm1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9Gb250X0NvbG9ySW5Gb3JtXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImZvcm1fZm9udF9jb2xvci5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiZm9ybV9mb250X2NvbG9yLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJmb3JtX2ZvbnRfY29sb3IuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIkNoZWNrIGNvbG9yIGlzIG5vdCB1c2VkIGFzIHRoZSBvbmx5IHZpc3VhbCBtZWFucyB0byBjb252ZXkgd2hpY2ggZmllbGRzIGFyZSByZXF1aXJlZFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkNvbWJpbmUgY29sb3IgYW5kIGRlc2NyaXB0aXZlIG1hcmt1cCB0byBpbmRpY2F0ZSByZXF1aXJlZCBmb3JtIGZpZWxkc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS40LjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGxldCBmb250cyA9IHJ1bGVDb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiZm9udFwiKTtcbiAgICAgICAgaWYgKGZvbnRzICE9IG51bGwpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZm9udHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSAhZm9udHNbaV0uaGFzQXR0cmlidXRlKFwiY29sb3JcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGZvcm1faW50ZXJhY3Rpb25fcmV2aWV3OiBSdWxlID0ge1xuICAgIGlkOiBcImZvcm1faW50ZXJhY3Rpb25fcmV2aWV3XCIsXG4gICAgY29udGV4dDogXCJkb206Zm9ybVt0YXJnZXRdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfRm9ybV9UYXJnZXRBbmRUZXh0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImZvcm1faW50ZXJhY3Rpb25fcmV2aWV3Lmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJmb3JtX2ludGVyYWN0aW9uX3Jldmlldy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZm9ybV9pbnRlcmFjdGlvbl9yZXZpZXcuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0aGF0IGludGVyYWN0aW5nIHdpdGggY29udGVudCB3aWxsIG5vdCBvcGVuIHBvcC11cCB3aW5kb3dzIG9yIGNoYW5nZSB0aGUgYWN0aXZlIHdpbmRvdyB3aXRob3V0IGluZm9ybWluZyB0aGUgdXNlclwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlVzZXIgc2hvdWxkIGJlIGluZm9ybWVkIGluIGFkdmFuY2Ugd2hlbiBpbnRlcmFjdGluZyB3aXRoIGNvbnRlbnQgY2F1c2VzIGEgY2hhbmdlIG9mIGNvbnRleHRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjMuMi4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgdmFsaWRhdGVQYXJhbXMgPSB7XG4gICAgICAgICAgICBwYXJhbVdpblRleHQ6IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogW1wibmV3IHdpbmRvd1wiXSxcbiAgICAgICAgICAgICAgICB0eXBlOiBcImFycmF5XCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgdFN0ciA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInRhcmdldFwiKTtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRTdHIgPT09IFwiX3BhcmVudFwiIHx8IHRTdHIgPT09IFwiX3NlbGZcIiB8fCB0U3RyID09PSBcIl90b3BcIiB8fCBDb21tb25VdGlsLmdldEZyYW1lQnlOYW1lKHJ1bGVDb250ZXh0LCB0U3RyKSAhPSBudWxsO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgLy8gTmFtZSBpcyBub3QgcGFydCBvZiB0aGlzIGZyYW1lc2V0IOKAkyBtdXN0IGhhdmUgcG90ZW50aWFsIHRvIGNyZWF0ZSBuZXcgd2luZG93P1xuICAgICAgICAgICAgLy8gU2VlIGlmIGEgbmV3IHdpbmRvdyBpcyBtZW50aW9uZWRcbiAgICAgICAgICAgIGxldCB0ZXh0U3RyID0gQ29tbW9uVXRpbC5nZXRJbm5lclRleHQocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInRpdGxlXCIpKVxuICAgICAgICAgICAgICAgIHRleHRTdHIgKz0gXCIgXCIgKyBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0aXRsZVwiKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyAhcGFzc2VkICYmIGkgPCB2YWxpZGF0ZVBhcmFtcy5wYXJhbVdpblRleHQudmFsdWUubGVuZ3RoOyArK2kpXG4gICAgICAgICAgICAgICAgaWYgKHRleHRTdHIuaW5kZXhPZih2YWxpZGF0ZVBhcmFtcy5wYXJhbVdpblRleHQudmFsdWVbaV0pICE9IC0xKSBwYXNzZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgZm9ybV9sYWJlbF91bmlxdWU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZm9ybV9sYWJlbF91bmlxdWVcIixcbiAgICBjb250ZXh0OiBcImRvbTpsYWJlbFtmb3JdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfTGFiZWxfVW5pcXVlRm9yXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiZm9ybV9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJmb3JtX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZm9ybV9sYWJlbF91bmlxdWUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGb3JtIGNvbnRyb2wgaGFzIG1vcmUgdGhhbiBvbmUgbGFiZWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJGb3JtIGNvbnRyb2xzIHNob3VsZCBoYXZlIGV4YWN0bHkgb25lIGxhYmVsXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBKQ0ggLSBOTyBPVVQgT0YgU0NPUEUgaGlkZGVuIGluIGNvbnRleHRcbiAgICAgICAgbGV0IGxhYmVsSWRzID0gQ2FjaGVVdGlsLmdldENhY2hlKEZyYWdtZW50VXRpbC5nZXRPd25lckZyYWdtZW50KHJ1bGVDb250ZXh0KSwgXCJSUFRfTGFiZWxfU2luZ2xlXCIsIHt9KVxuICAgICAgICBsZXQgaWQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJmb3JcIik7XG4gICAgICAgIGxldCBwYXNzZWQgPSAhKGlkIGluIGxhYmVsSWRzKTtcbiAgICAgICAgbGFiZWxJZHNbaWRdID0gdHJ1ZTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01XYWxrZXJcIjtcblxuZXhwb3J0IGNvbnN0IGZvcm1fc3VibWl0X2J1dHRvbl9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZm9ybV9zdWJtaXRfYnV0dG9uX2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmZvcm1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9Gb3JtX0hhc1N1Ym1pdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJmb3JtX3N1Ym1pdF9idXR0b25fZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJmb3JtX3N1Ym1pdF9idXR0b25fZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJmb3JtX3N1Ym1pdF9idXR0b25fZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgdGhlIDxmb3JtPiBlbGVtZW50IGhhcyBhIHN1Ym1pdCBidXR0b24gb3IgYW4gaW1hZ2UgYnV0dG9uXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQSA8Zm9ybT4gZWxlbWVudCBzaG91bGQgaGF2ZSBhIHN1Ym1pdCBidXR0b24gb3IgYW4gaW1hZ2UgYnV0dG9uXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIzLjIuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0LmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICAgIC8vIHN1Ym1pdCBidXR0b25zIGFyZSB1c3VhbGx5IGF0IHRoZSBib3R0b20gLSB3YWxrIGJhY2t3YXJkc1xuICAgICAgICAgICAgbGV0IG53ID0gbmV3IERPTVdhbGtlcihydWxlQ29udGV4dCwgdHJ1ZSk7XG4gICAgICAgICAgICB3aGlsZSAoIXBhc3NlZCAmJiBudy5wcmV2Tm9kZSgpICYmIG53Lm5vZGUgIT0gcnVsZUNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICBpZiAoIW53LmJFbmRUYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5vZGVOYW1lID0gbncubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwiaW5wdXRcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHR5cGUgPSBudy5lbGVtKCkuZ2V0QXR0cmlidXRlKFwidHlwZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IHR5cGUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IHR5cGUgPT09IFwic3VibWl0XCIgfHwgdHlwZSA9PT0gXCJpbWFnZVwiO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5vZGVOYW1lID09PSBcImJ1dHRvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBudy5lbGVtKCkuaGFzQXR0cmlidXRlKFwidHlwZVwiKSAmJiBudy5lbGVtKCkuZ2V0QXR0cmlidXRlKFwidHlwZVwiKS50b0xvd2VyQ2FzZSgpID09PSBcInN1Ym1pdFwiO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG53Lm5vZGUubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IEFyaWFVdGlsLmhhc1JvbGUobncubm9kZSwgXCJidXR0b25cIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5cbmV4cG9ydCBjb25zdCBmb3JtX3N1Ym1pdF9yZXZpZXc6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZm9ybV9zdWJtaXRfcmV2aWV3XCIsXG4gICAgY29udGV4dDogXCJkb206c2VsZWN0W29uY2hhbmdlXSwgZG9tOmlucHV0W29uY2hhbmdlXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX0Zvcm1fQ2hhbmdlRW1wdHlcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiZm9ybV9zdWJtaXRfcmV2aWV3Lmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJmb3JtX3N1Ym1pdF9yZXZpZXcuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImZvcm1fc3VibWl0X3Jldmlldy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiQ29uZmlybSB0aGUgZm9ybSBkb2VzIG5vdCBzdWJtaXQgYXV0b21hdGljYWxseSB3aXRob3V0IHdhcm5pbmdcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBIGZvcm0gc2hvdWxkIG5vdCBiZSBzdWJtaXR0ZWQgYXV0b21hdGljYWxseSB3aXRob3V0IHdhcm5pbmcgdGhlIHVzZXJcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIzLjIuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSwqL1xuICAgIC8vZGVwcmVjYXRlIHRoZSBydWxlIG9uIEp1biAxMCwgMjAyNFxuICAgIHJ1bGVzZXRzOiBbXSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJvbmNoYW5nZVwiKS50cmltKCkubGVuZ3RoID09PSAwO1xuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgZnJhbWVfc3JjX3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcImZyYW1lX3NyY192YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmZyYW1lLCBkb206aWZyYW1lXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJWYWxlcmllX0ZyYW1lX1NyY0h0bWxcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImZyYW1lX3NyY192YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiZnJhbWVfc3JjX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJmcmFtZV9zcmNfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSA8ZnJhbWU+IGNvbnRlbnQgaXMgYWNjZXNzaWJsZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkEgPGZyYW1lPiBjb250YWluaW5nIG5vbi1IVE1MIGNvbnRlbnQgbXVzdCBiZSBtYWRlIGFjY2Vzc2libGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuNC4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwic3JjXCIpICYmXG4gICAgICAgICAgICBDb21tb25VdGlsLmlzSHRtbEV4dChDb21tb25VdGlsLmdldEZpbGVFeHQocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwic3JjXCIpKSk7XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBY2NOYW1lVXRpbCB9IGZyb20gXCIuLi91dGlsL0FjY05hbWVVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGZyYW1lX3RpdGxlX2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJmcmFtZV90aXRsZV9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTpmcmFtZSwgZG9tOmlmcmFtZVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0ZyYW1lX0hhc1RpdGxlXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZnJhbWVfdGl0bGVfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiZnJhbWVfdGl0bGVfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZnJhbWVfdGl0bGVfZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJJbmxpbmUgZnJhbWVzIG11c3QgaGF2ZSBhIHVuaXF1ZSwgbm9uLWVtcHR5ICd0aXRsZScgYXR0cmlidXRlXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIklubGluZSBmcmFtZSBkb2VzIG5vdCBoYXZlIGEgJ3RpdGxlJyBhdHRyaWJ1dGVcIixcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSwgLypDaGFuZ2UgbWFwcGluZyB0byA0LjEuMiBmcm9tIDIuNC4xIHR5cG8/ICovXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBcImNhZTc2MFwiLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIC8vIGlnbm9yZSBpZiBhbiBleHBsaWNpdCByb2xlIGlzIHNwZWNpZmllZC4gdGhpcyBjYXNlIHdpbGwgYmUgY292ZXJlZCBpbiB0aGUgYXJpYV9hY2Nlc3NpYmxlbmFtZV9leGlzdHMgcnVsZXNcbiAgICAgICAgbGV0IHJvbGUgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpO1xuICAgICAgICBpZiAocm9sZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuYW1lX3BhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWUocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAobmFtZV9wYWlyICYmIG5hbWVfcGFpci5uYW1lICYmIG5hbWVfcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vaWYgKENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwidGl0bGVcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGhlYWRpbmdfY29udGVudF9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaGVhZGluZ19jb250ZW50X2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmgxLCBkb206aDIsIGRvbTpoMywgZG9tOmg0LCBkb206aDUsIGRvbTpoNlwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX0hlYWRlcl9IYXNDb250ZW50XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiaGVhZGluZ19jb250ZW50X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImhlYWRpbmdfY29udGVudF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImhlYWRpbmdfY29udGVudF9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJIZWFkaW5nIGVsZW1lbnQgaGFzIGRlc2NyaXB0aXZlIHRleHRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiSGVhZGluZyBlbGVtZW50IGhhcyBubyBkZXNjcmlwdGl2ZSBjb250ZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiSGVhZGluZyBlbGVtZW50cyBtdXN0IHByb3ZpZGUgZGVzY3JpcHRpdmUgdGV4dFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi40LjZcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcGFzc2VkID1Db21tb25VdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbihydWxlQ29udGV4dCk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBoZWFkaW5nX21hcmt1cF9taXN1c2U6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaGVhZGluZ19tYXJrdXBfbWlzdXNlXCIsXG4gICAgY29udGV4dDogXCJkb206aDEsIGRvbTpoMiwgZG9tOmgzLCBkb206aDQsIGRvbTpoNSwgZG9tOmg2XCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJoZWFkaW5nX2NvbnRlbnRfZXhpc3RzXCJdLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX0hlYWRlcnNfRmV3V29yZHNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiaGVhZGluZ19tYXJrdXBfbWlzdXNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJoZWFkaW5nX21hcmt1cF9taXN1c2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImhlYWRpbmdfbWFya3VwX21pc3VzZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVmVyaWZ5IHRoYXQgdGhlIGhlYWRpbmcgZWxlbWVudCBpcyBhIGdlbnVpbmUgaGVhZGluZ1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkhlYWRpbmcgZWxlbWVudHMgbXVzdCBub3QgYmUgdXNlZCBmb3IgcHJlc2VudGF0aW9uXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCB2YWxpZGF0ZVBhcmFtcyA9IHtcbiAgICAgICAgICAgIGhlYWRpbmdMZW5ndGhUaHJlc2g6IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogMjAsXG4gICAgICAgICAgICAgICAgdHlwZTogXCJpbnRlZ2VyXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgaGVhZGluZ0xlbmd0aFRocmVzaCA9IHZhbGlkYXRlUGFyYW1zLmhlYWRpbmdMZW5ndGhUaHJlc2gudmFsdWU7XG4gICAgICAgIGxldCBwYXNzZWQgPSBDb21tb25VdGlsLndvcmRDb3VudChDb21tb25VdGlsLmdldElubmVyVGV4dChydWxlQ29udGV4dCkpIDw9IGhlYWRpbmdMZW5ndGhUaHJlc2g7XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBbmNlc3RvclV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvYW5jZXN0b3JcIjtcbmltcG9ydCB7IExhbmdVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xhbmdcIjtcblxuZXhwb3J0IGNvbnN0IGh0bWxfbGFuZ19leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaHRtbF9sYW5nX2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmh0bWxcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9IdG1sX0hhc0xhbmdcIjogeyBcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJGYWlsXzJcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiRmFpbF8zXCIsXG4gICAgICAgICAgICBcIkZhaWxfNFwiOiBcIkZhaWxfNFwiLFxuICAgICAgICAgICAgXCJGYWlsXzVcIjogXCJGYWlsXzVcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzVcIjogXCJQb3RlbnRpYWxfNVwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfNlwiOiBcIlBvdGVudGlhbF82XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogYGh0bWxfbGFuZ19leGlzdHMuaHRtbGAsIFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogYGh0bWxfbGFuZ19leGlzdHMuaHRtbGAsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBgaHRtbF9sYW5nX2V4aXN0cy5odG1sYCxcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IGBodG1sX2xhbmdfZXhpc3RzLmh0bWxgLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogYGh0bWxfbGFuZ19leGlzdHMuaHRtbGAsXG4gICAgICAgICAgICBcIkZhaWxfNFwiOiBgaHRtbF9sYW5nX2V4aXN0cy5odG1sYCxcbiAgICAgICAgICAgIFwiRmFpbF81XCI6IGBodG1sX2xhbmdfZXhpc3RzLmh0bWxgLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfNVwiOiBgaHRtbF9sYW5nX2V4aXN0cy5odG1sYCxcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzZcIjogYGh0bWxfbGFuZ19leGlzdHMuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiUGFnZSBtdXN0IGlkZW50aWZ5IHRoZSBkZWZhdWx0IGxhbmd1YWdlIG9mIHRoZSBkb2N1bWVudCB3aXRoIGEgJ2xhbmcnIGF0dHJpYnV0ZVwiLCBcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFnZSBsYW5ndWFnZSBkZXRlY3RlZCBhcyBcXFwiezB9XFxcIlwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJQYWdlIGRldGVjdGVkIGFzIFhIVE1MIDEuMCwgYnV0IGhhcyBuZWl0aGVyICdsYW5nJyBub3IgJ3htbDpsYW5nJyBhdHRyaWJ1dGVzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIlBhZ2UgZGV0ZWN0ZWQgYXMgWEhUTUwsIGJ1dCBkb2VzIG5vdCBoYXZlIGFuICd4bWw6bGFuZycgYXR0cmlidXRlXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcIlBhZ2UgZGV0ZWN0ZWQgYXMgSFRNTCwgYnV0IGRvZXMgbm90IGhhdmUgYSAnbGFuZycgYXR0cmlidXRlXCIsXG4gICAgICAgICAgICBcIkZhaWxfNFwiOiBcIlBhZ2UgZGV0ZWN0ZWQgd2l0aCAnbGFuZycgYW5kICd4bWw6bGFuZycgYXR0cmlidXRlcyBhbmQgcHJpbWFyeSBsYW5ndWFnZXMgZG8gbm90IG1hdGNoOiBcXFwiezB9XFxcIiwgXFxcInsxfVxcXCJcIixcbiAgICAgICAgICAgIFwiRmFpbF81XCI6IFwiUGFnZSBkZXRlY3RlZCB3aXRoICdsYW5nJyBhbmQgJ3htbDpsYW5nJyBhdHRyaWJ1dGVzIHRoYXQgZG8gbm90IG1hdGNoOiBcXFwiezB9XFxcIiwgXFxcInsxfVxcXCJcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzVcIjogXCJQYWdlIGRldGVjdGVkIGFzIFhIVE1MIDEuMCB3aXRoIG9ubHkgYSAnbGFuZycgYXR0cmlidXRlLiBDb25maXJtIHRoYXQgcGFnZSBpcyBvbmx5IGRlbGl2ZXJlZCB2aWEgdGV4dC9odG1sIG1pbWUgdHlwZVwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfNlwiOiBcIlBhZ2UgZGV0ZWN0ZWQgYXMgWEhUTUwgMS4wIHdpdGggb25seSBhbiAneG1sOmxhbmcnIGF0dHJpYnV0ZS4gQ29uZmlybSB0aGF0IHBhZ2UgaXMgb25seSBkZWxpdmVyZWQgdmlhIHhtbCBtaW1lIHR5cGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFsgXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIG51bTogXCIzLjEuMVwiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW3tcbiAgICAgICAgXCJiNWMzZjhcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImluYXBwbGljYWJsZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJpbmFwcGxpY2FibGVcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiZmFpbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzRcIjogXCJpbmFwcGxpY2FibGVcIixcbiAgICAgICAgICAgIFwiRmFpbF81XCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF81XCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF82XCI6IFwiaW5hcHBsaWNhYmxlXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCI1YjdhZTBcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImluYXBwbGljYWJsZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJpbmFwcGxpY2FibGVcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgICAgICBcIkZhaWxfNFwiOiBcImZhaWxcIixcbiAgICAgICAgICAgIFwiRmFpbF81XCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfNVwiOiBcImluYXBwbGljYWJsZVwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfNlwiOiBcImluYXBwbGljYWJsZVwiXG4gICAgICAgIH1cbiAgICB9XSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICAvLyBUaGlzIHJ1bGUgZG9lcyBub3QgYXBwbHkgaW5zaWRlIGEgcHJlc2VudGF0aW9uYWwgZnJhbWVcbiAgICAgICAgaWYgKEFuY2VzdG9yVXRpbC5pc1ByZXNlbnRhdGlvbkZyYW1lKGNvbnRleHRIaWVyYXJjaGllcykpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBkb2N0eXBlU3RyaW5nID0gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5kb2N0eXBlID8gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5kb2N0eXBlLnB1YmxpY0lkIDogXCJcIjtcbiAgICAgICAgaWYgKCFkb2N0eXBlU3RyaW5nKSBkb2N0eXBlU3RyaW5nID0gXCJcIjtcbiAgICAgICAgbGV0IGxhbmcgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJsYW5nXCIpO1xuICAgICAgICBsZXQgbGFuZ1hNTCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInhtbDpsYW5nXCIpO1xuXG4gICAgICAgIGlmIChkb2N0eXBlU3RyaW5nLmluY2x1ZGVzKCdYSFRNTCcpICYmICFkb2N0eXBlU3RyaW5nLmluY2x1ZGVzKFwiMS4wXCIpKSB7XG4gICAgICAgICAgICBpZiAoIWxhbmdYTUwpIHtcbiAgICAgICAgICAgICAgICAvLyBYSFRNTCAhPSAxLjAgKG11c3QgaGF2ZSB4bWw6bGFuZ1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMlwiKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIsW2xhbmdYTUxdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChkb2N0eXBlU3RyaW5nLmluY2x1ZGVzKCdYSFRNTCcpICYmIGRvY3R5cGVTdHJpbmcuaW5jbHVkZXMoXCIxLjBcIikpIHtcbiAgICAgICAgICAgIC8vIEhhbmRsZSBYSFRNTCAxLjBcbiAgICAgICAgICAgIC8vIElmIG5laXRoZXIgaXMgcHJvdmlkZWQsIGl0J3MgYSBmYWlsdXJlXG4gICAgICAgICAgICBpZiAoIWxhbmcgJiYgIWxhbmdYTUwpIHtcbiAgICAgICAgICAgICAgICAvLyBYSFRNTCBhbmQgbm8gbGFuZ1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobGFuZyAmJiBsYW5nWE1MKSB7XG4gICAgICAgICAgICAgICAgaWYgKGxhbmcgIT09IGxhbmdYTUwpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFMYW5nVXRpbC52YWxpZFByaW1hcnlMYW5nKGxhbmcpIHx8ICFMYW5nVXRpbC52YWxpZFByaW1hcnlMYW5nKGxhbmdYTUwpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBMZXQgRWxlbV9MYW5nX1ZhbGlkIGhhbmRsZSB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIUxhbmdVdGlsLm1hdGNoUHJpbWFyeUxhbmcobGFuZywgbGFuZ1hNTCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFhIVE1MIGFuZCBsYW5nIGFuZCB4bWw6bGFuZywgYnV0IHRoZXkgZG9uJ3QgbWF0Y2hcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfNFwiLCBbbGFuZywgbGFuZ1hNTF0sIFtdKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfNVwiLCBbbGFuZywgbGFuZ1hNTF0sIFtdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFhIVE1MIGFuZCBsYW5nIGFuZCB4bWw6bGFuZyBtYXRjaFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIixbbGFuZ10pXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChsYW5nKSB7XG4gICAgICAgICAgICAgICAgLy8gWEhUTUwgYW5kIG9ubHkgbGFuZyAob2theSBpZiBvbmx5IGRlbGl2ZXJlZCB2aWEgdGV4dC9odG1sKVxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzVcIik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFhIVE1MIGFuZCBvbmx5IHhtbDpsYW5nIChva2F5IGlmIG9ubHkgZGVsaXZlcmVkIHZpYSB4bWwgbWltZSB0eXBlKVxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzZcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIWxhbmcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzNcIik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxhbmcgJiYgbGFuZ1hNTCkge1xuICAgICAgICAgICAgICAgIC8vIEhUTUw1IHBvbHlnbG90IGRvY3VtZW50c1xuICAgICAgICAgICAgICAgIGlmIChsYW5nICE9PSBsYW5nWE1MKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghTGFuZ1V0aWwudmFsaWRQcmltYXJ5TGFuZyhsYW5nKSB8fCAhTGFuZ1V0aWwudmFsaWRQcmltYXJ5TGFuZyhsYW5nWE1MKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGV0IEVsZW1fTGFuZ19WYWxpZCBoYW5kbGUgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFMYW5nVXRpbC5tYXRjaFByaW1hcnlMYW5nKGxhbmcsIGxhbmdYTUwpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBYSFRNTCBhbmQgbGFuZyBhbmQgeG1sOmxhbmcsIGJ1dCB0aGV5IGRvbid0IG1hdGNoXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzRcIiwgW2xhbmcsIGxhbmdYTUxdLCBbXSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzVcIiwgW2xhbmcsIGxhbmdYTUxdLCBbXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBYSFRNTCBhbmQgbGFuZyBhbmQgeG1sOmxhbmcgbWF0Y2hcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIsW2xhbmddKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIsW2xhbmddKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG4gICAgXG5leHBvcnQgY29uc3QgaHRtbF9za2lwbmF2X2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJodG1sX3NraXBuYXZfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJkb206aHRtbFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX0h0bWxfU2tpcE5hdlwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogYGh0bWxfc2tpcG5hdl9leGlzdHMuaHRtbGAsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBgaHRtbF9za2lwbmF2X2V4aXN0cy5odG1sYCxcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogYGh0bWxfc2tpcG5hdl9leGlzdHMuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiUHJvdmlkZSBhIHdheSB0byBieXBhc3MgYmxvY2tzIG9mIGNvbnRlbnQgdGhhdCBhcmUgcmVwZWF0ZWQgb24gbXVsdGlwbGUgV2ViIHBhZ2VzXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVmVyaWZ5IHRoZXJlIGlzIGEgd2F5IHRvIGJ5cGFzcyBibG9ja3Mgb2YgY29udGVudCB0aGF0IGFyZSByZXBlYXRlZCBvbiBtdWx0aXBsZSBXZWIgcGFnZXNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFsgXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIG51bTogXCIyLjQuMVwiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgIGxldCBmcmFtZXMgPSBDb21tb25VdGlsLmdldERvY0VsZW1lbnRzQnlUYWcocnVsZUNvbnRleHQsIFwiZnJhbWVcIik7XG4gICAgICAgIGxldCBoZWFkZXJzID0gQ29tbW9uVXRpbC5nZXREb2NFbGVtZW50c0J5VGFnKHJ1bGVDb250ZXh0LCBcImgxXCIpO1xuXG4gICAgICAgIGlmICgoZnJhbWVzICE9IG51bGwgJiYgZnJhbWVzLmxlbmd0aCA+IDApIHx8IChoZWFkZXJzICE9IG51bGwgJiYgaGVhZGVycy5sZW5ndGggPiAwKSkge1xuICAgICAgICAgICAgLy8gSWYgZnJhbWVzIG9yIGhlYWRpbmdzIGFyZSB1c2VkLCBwYXNzXG4gICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gTG9vayBmb3Igc2tpcCBhbmNob3JzXG4gICAgICAgICAgICBsZXQgYW5jaG9ycyA9IENvbW1vblV0aWwuZ2V0RG9jRWxlbWVudHNCeVRhZyhydWxlQ29udGV4dCwgXCJhXCIpO1xuICAgICAgICAgICAgbGV0IHRhcmdldHMgPSB7fTtcbiAgICAgICAgICAgIGZvciAobGV0IGlkeCA9IDA7ICFwYXNzZWQgJiYgaWR4IDwgYW5jaG9ycy5sZW5ndGg7ICsraWR4KSB7XG4gICAgICAgICAgICAgICAgaWYgKGFuY2hvcnNbaWR4XS5oYXNBdHRyaWJ1dGUoXCJocmVmXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBocmVmID0gYW5jaG9yc1tpZHhdLmhyZWY7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaHJlZiAhPT0gdHlwZW9mIFwiXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChocmVmLmJhc2VWYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBocmVmID0gaHJlZi5iYXNlVmFsO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBocmVmID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZXQgdG1wTG9jYXRpb247XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgKChydWxlQ29udGV4dC5vd25lckRvY3VtZW50IGFzIGFueSkubG9jYXRpb25Gcm9tREFQKSAhPSBcInVuZGVmaW5lZFwiICYmIChydWxlQ29udGV4dC5vd25lckRvY3VtZW50IGFzIGFueSkubG9jYXRpb25Gcm9tREFQICE9IG51bGwpIHsgLy8gREFQIHNldHMgaXRcbiAgICAgICAgICAgICAgICAgICAgICAgIHRtcExvY2F0aW9uID0gKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQgYXMgYW55KS5sb2NhdGlvbkZyb21EQVA7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIHNlcnZlciBzY2FuIGhhcyB0aGUgbG9jYXRpb24gb2JqZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICB0bXBMb2NhdGlvbiA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQubG9jYXRpb247XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGV0IGRvY0hyZWYgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICBpZiAodG1wTG9jYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY0hyZWYgPSB0bXBMb2NhdGlvbi5ocmVmO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIEZpeCB3ZWlyZCBidWdzIHdpdGggaG93IHZhcmlvdXMgcGFyc2VycyByZXBvcnQgb24gZmlsZTogdXJsJ3M6XG4gICAgICAgICAgICAgICAgICAgIGlmIChocmVmLnN0YXJ0c1dpdGgoXCJmaWxlOi8vL1wiKSkgaHJlZiA9IFwiZmlsZTovXCIgKyBocmVmLnN1YnN0cmluZyhcImZpbGU6Ly8vXCIubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRvY0hyZWYuc3RhcnRzV2l0aChcImZpbGU6Ly8vXCIpKSBkb2NIcmVmID0gXCJmaWxlOi9cIiArIGRvY0hyZWYuc3Vic3RyaW5nKFwiZmlsZTovLy9cIi5sZW5ndGgpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChocmVmLmNoYXJBdCgwKSA9PSBcIiNcIiB8fCBocmVmLnN0YXJ0c1dpdGgoZG9jSHJlZiArIFwiI1wiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRhcmdldCA9IENvbW1vblV0aWwuZ2V0RmlsZUFuY2hvcihocmVmKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChGcmFnbWVudFV0aWwuZ2V0QnlJZChydWxlQ29udGV4dCwgdGFyZ2V0KSAhPSBudWxsKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0c1t0YXJnZXRdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYW5jaG9yc1tpZHhdLmhhc0F0dHJpYnV0ZShcIm5hbWVcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQXNzdW1lIGZvcndhcmQganVtcGluZyB0YXJnZXRzXG4gICAgICAgICAgICAgICAgICAgIGxldCBuYW1lID0gYW5jaG9yc1tpZHhdLmdldEF0dHJpYnV0ZShcIm5hbWVcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lLmluZGV4T2YoXCIjXCIpICE9IC0xKVxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IENvbW1vblV0aWwuZ2V0RmlsZUFuY2hvcihuYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gbmFtZSBpbiB0YXJnZXRzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5pbXBvcnQgeyBET01NYXBwZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTU1hcHBlclwiO1xuXG5leHBvcnQgY29uc3QgaWZyYW1lX2ludGVyYWN0aXZlX3RhYmJhYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcImlmcmFtZV9pbnRlcmFjdGl2ZV90YWJiYWJsZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmlmcmFtZVwiLFxuICAgIGRlcGVuZGVuY2llczogW10sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpZnJhbWVfaW50ZXJhY3RpdmVfdGFiYmFibGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJwYXNzXCI6IFwiaWZyYW1lX2ludGVyYWN0aXZlX3RhYmJhYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9pbnZhbGlkXCI6IFwiaWZyYW1lX2ludGVyYWN0aXZlX3RhYmJhYmxlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJJZnJhbWUgd2l0aCBpbnRlcmFjdGl2ZSBjb250ZW50IHNob3VsZCBub3QgYmUgZXhjbHVkZWQgZnJvbSB0YWIgb3JkZXIgdXNpbmcgdGFiaW5kZXhcIixcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlRoZSBpZnJhbWUgd2l0aCBpbnRlcmFjdGl2ZSBjb250ZW50IGlzIG5vdCBleGNsdWRlZCBmcm9tIHRoZSB0YWIgb3JkZXIgdXNpbmcgdGFiaW5kZXhcIixcbiAgICAgICAgICAgIFwiZmFpbF9pbnZhbGlkXCI6IFwiVGhlIDxpZnJhbWU+IHdpdGggaW50ZXJhY3RpdmUgY29udGVudCBpcyBleGNsdWRlZCBmcm9tIHRhYiBvcmRlciB1c2luZyB0YWJpbmRleFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBpZDogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBudW06IFtcIjIuMS4xXCJdLFxuICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXCJha243Ym5cIl0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIG9yIGRpc2FibGVkXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkgfHwgQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIFxuICAgICAgICBjb25zdCBtYXBwZXIgOiBET01NYXBwZXIgPSBuZXcgRE9NTWFwcGVyKCk7XG4gICAgICAgIGNvbnN0IGJvdW5kcyA9IG1hcHBlci5nZXRVbmFkanVzdGVkQm91bmRzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgLy9pbiBjYXNlIHRoZSBib3VuZHMgbm90IGF2YWlsYWJsZVxuICAgICAgICBpZiAoIWJvdW5kcykgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICAvLyBpZ25vcmUgaWYgaWZyYW1lIGlzIHRvbyBzbWFsbCB0byBiZSB2aXNpYmxlIG9uIHNjcmVlblxuICAgICAgICBpZiAoTWF0aC5tYXgoYm91bmRzWydoZWlnaHQnXSwgYm91bmRzWyd3aWR0aCddKSA8IDMwIHx8IE1hdGgubWluKGJvdW5kc1snaGVpZ2h0J10sIGJvdW5kc1snd2lkdGgnXSkgPCAxNSkgIFxuICAgICAgICAgICByZXR1cm4gbnVsbDsgXG5cbiAgICAgICAgLy8gcGFzcyBpZnJhbWUgZWxlbWVudCBkb2VzIG5vdCBoYXZlIGEgdGFiaW5kZXggYXR0cmlidXRlIHZhbHVlIHRoYXQgaXMgYSBuZWdhdGl2ZSBudW1iZXJcbiAgICAgICAgaWYgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSB8fCBwYXJzZUludChydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSkgPj0gMClcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG5cbiAgICAgICAgLy8gY2hlY2sgaWZyYW1lIGNvbnRlbnRcbiAgICAgICAgY29uc3QgaWZyYW1FbGVtID0gcnVsZUNvbnRleHQgYXMgSFRNTElGcmFtZUVsZW1lbnQ7XG4gICAgICAgIGlmICghaWZyYW1FbGVtIHx8ICFpZnJhbUVsZW0uY29udGVudERvY3VtZW50IHx8ICFpZnJhbUVsZW0uY29udGVudERvY3VtZW50LmRvY3VtZW50RWxlbWVudClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IGNvdW50ID0gQ29tbW9uVXRpbC5nZXRUYWJiYWJsZUNoaWxkcmVuKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKGNvdW50ID4gMClcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfaW52YWxpZFwiKTtcblxuICAgICAgICByZXR1cm4gbnVsbDsgICAgXG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgaW1hZ2VidXR0b25fYWx0X2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJpbWFnZWJ1dHRvbl9hbHRfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJkb206aW5wdXRcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9JbnB1dF9FeHBsaWNpdExhYmVsSW1hZ2VcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUGFzc18xXCI6IFwiUGFzc18xXCIsXG4gICAgICAgICAgICBcIlBhc3NfMlwiOiBcIlBhc3NfMlwiLFxuICAgICAgICAgICAgXCJGYWlsXCI6IFwiRmFpbFwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiaW1hZ2VidXR0b25fYWx0X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NfMVwiOiBcImltYWdlYnV0dG9uX2FsdF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJQYXNzXzJcIjogXCJpbWFnZWJ1dHRvbl9hbHRfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbFwiOiBcImltYWdlYnV0dG9uX2FsdF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImltYWdlYnV0dG9uX2FsdF9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJJbWFnZSBidXR0b24gcHJvdmlkZXMgYWx0ZXJuYXRpdmUgdGV4dCB1c2luZyB0aGUgJ2FsdCcgYXR0cmlidXRlXCIsXG4gICAgICAgICAgICBcIlBhc3NfMVwiOiBcIkltYWdlIGJ1dHRvbiBwcm92aWRlcyBhbHRlcm5hdGl2ZSB0ZXh0IHVzaW5nIGFuIEFSSUEgbGFiZWxcIixcbiAgICAgICAgICAgIFwiUGFzc18yXCI6IFwiSW1hZ2UgYnV0dG9uIHByb3ZpZGVzIGFsdGVybmF0aXZlIHRleHQgdXNpbmcgdGhlICd0aXRsZScgYXR0cmlidXRlXCIsXG4gICAgICAgICAgICBcIkZhaWxcIjogXCJUaGUgPGlucHV0PiBlbGVtZW50IG9mIHR5cGUgXFxcImltYWdlXFxcIiBoYXMgbm8gdGV4dCBhbHRlcm5hdGl2ZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSA8aW5wdXQ+IGVsZW1lbnQgb2YgdHlwZSBcXFwiaW1hZ2VcXFwiIHNob3VsZCBoYXZlIGEgdGV4dCBhbHRlcm5hdGl2ZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogXCI1OTc5NmZcIixcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICAvLyBTZWUgaHR0cHM6Ly93d3cudzMub3JnL1dBSS9XQ0FHMjIvVGVjaG5pcXVlcy9mYWlsdXJlcy9GNjVcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgaWYgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0eXBlXCIpIHx8IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInR5cGVcIikudG9Mb3dlckNhc2UoKSAhPSBcImltYWdlXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcImFsdFwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9IGVsc2UgaWYgKEFyaWFVdGlsLmhhc0FyaWFMYWJlbChydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMVwiKTtcbiAgICAgICAgfSBlbHNlIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0aXRsZVwiKSAmJiBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0aXRsZVwiKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzJcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbFwiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGltYWdlbWFwX2FsdF9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaW1hZ2VtYXBfYWx0X2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmltZ1t1c2VtYXBdLCBkb206aW1nW2lzbWFwXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiSEFBQ19JbWdfVXNlbWFwQWx0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiaW1hZ2VtYXBfYWx0X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImltYWdlbWFwX2FsdF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImltYWdlbWFwX2FsdF9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJJbWFnZSBtYXAgb3IgY2hpbGQgPGFyZWE+IGhhcyBubyB0ZXh0IGFsdGVybmF0aXZlXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQW4gaW1hZ2UgbWFwIGFuZCBlYWNoIDxhcmVhPiBlbGVtZW50IGluIGFuIGltYWdlIG1hcCBtdXN0IGhhdmUgdGV4dCBhbHRlcm5hdGl2ZShzKVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgcGFzc2VkID0gQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJhbHRcIikgfHxcbiAgICAgICAgICAgICghcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiaXNtYXBcIikgJiYgIUNvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwidXNlbWFwXCIpKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgaW1nX2FsdF9iYWNrZ3JvdW5kOiBSdWxlID0ge1xuICAgIGlkOiBcImltZ19hbHRfYmFja2dyb3VuZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIkhBQUNfQmFja2dyb3VuZEltZ19IYXNUZXh0T3JUaXRsZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIk1hbnVhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJpbWdfYWx0X2JhY2tncm91bmQuaHRtbFwiLFxuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcImltZ19hbHRfYmFja2dyb3VuZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiaW1nX2FsdF9iYWNrZ3JvdW5kLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJWZXJpZnkgaW1wb3J0YW50IGJhY2tncm91bmQgaW1hZ2UgaW5mb3JtYXRpb24gaGFzIGEgdGV4dCBhbHRlcm5hdGl2ZSBpbiBzeXN0ZW0gaGlnaCBjb250cmFzdCBtb2RlXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQmFja2dyb3VuZCBpbWFnZXMgdGhhdCBjb252ZXkgaW1wb3J0YW50IGluZm9ybWF0aW9uIG11c3QgaGF2ZSBhIHRleHQgYWx0ZXJuYXRpdmUgdGhhdCBkZXNjcmliZXMgdGhlIGltYWdlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IGRvYyA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQ7XG4gICAgICAgIGxldCBzdHlsZSA9IGRvYy5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKHN0eWxlID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYmFja2dyb3VuZEltZ3MgPSBzdHlsZS5iYWNrZ3JvdW5kSW1hZ2U7XG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuXG4gICAgICAgIGlmIChiYWNrZ3JvdW5kSW1ncyAhPSBudWxsICYmIGJhY2tncm91bmRJbWdzICE9IFwiXCIgJiYgYmFja2dyb3VuZEltZ3MgIT0gJ25vbmUnICYmIGJhY2tncm91bmRJbWdzICE9ICdpbmhlcml0Jykge1xuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0LmlubmVySFRNTCAhPSBudWxsICYmIHJ1bGVDb250ZXh0LmlubmVySFRNTC50cmltKCkubGVuZ3RoICE9IDApIHtcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHRpdGxlID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKCd0aXRsZScpO1xuICAgICAgICAgICAgICAgIGlmICh0aXRsZSAhPSBudWxsICYmIHRpdGxlLmxlbmd0aCAhPSAwKVxuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZU1hbnVhbChcIk1hbnVhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGltZ19hbHRfZGVjb3JhdGl2ZTogUnVsZSA9IHtcbiAgICBpZDogXCJpbWdfYWx0X2RlY29yYXRpdmVcIixcbiAgICBjb250ZXh0OiBcImRvbTppbWdbYWx0XVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0ltZ19QcmVzZW50YXRpb25JbWdIYXNOb25OdWxsQWx0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiaW1nX2FsdF9kZWNvcmF0aXZlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiaW1nX2FsdF9kZWNvcmF0aXZlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpbWdfYWx0X2RlY29yYXRpdmUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJJbWFnZSBkZXNpZ25hdGVkIGFzIGRlY29yYXRpdmUgaGFzIG5vbi1udWxsICdhbHQnIGF0dHJpYnV0ZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkltYWdlIGRlc2lnbmF0ZWQgYXMgZGVjb3JhdGl2ZSBtdXN0IGhhdmUgJ2FsdD1cXFwiXFxcIlwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgaWYgKEFyaWFVdGlsLmhhc1JvbGUocnVsZUNvbnRleHQsIFwicHJlc2VudGF0aW9uXCIpIHx8IEFyaWFVdGlsLmhhc1JvbGUocnVsZUNvbnRleHQsIFwibm9uZVwiKSkge1xuICAgICAgICAgICAgcGFzc2VkID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYWx0XCIpLmxlbmd0aCA9PSAwO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBpbWdfYWx0X21pc3VzZTogUnVsZSA9IHtcbiAgICBpZDogXCJpbWdfYWx0X21pc3VzZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmltZywgZG9tOmFyZWEsIGRvbTppbnB1dFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX0ltZ19BbHRDb21tb25NaXN1c2VcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiaW1nX2FsdF9taXN1c2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcImltZ19hbHRfbWlzdXNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpbWdfYWx0X21pc3VzZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVmVyaWZ5IHRoYXQgdGhlIGZpbGUgbmFtZSBzZXJ2ZXMgYXMgYSBnb29kIGlubGluZSByZXBsYWNlbWVudCBmb3IgdGhlIGltYWdlXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiJ2FsdCcgYXR0cmlidXRlIHZhbHVlIG11c3QgYmUgYSBnb29kIGlubGluZSByZXBsYWNlbWVudCBmb3IgdGhlIGltYWdlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCB2YWxpZGF0ZVBhcmFtcyA9IHtcbiAgICAgICAgICAgIGJhZFRleHQ6IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogW1wic2hvcnQgZGVzY3JpcHRpb25cIl0sXG4gICAgICAgICAgICAgICAgdHlwZTogXCJbc3RyaW5nXVwiXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgLy8gQWx0IHRleHQgY2hlY2sgYXJlIGVsc2V3aGVyZSAoU2VlIDQxLCAyNDAsIDQ1NSlcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImFsdFwiKSkge1xuICAgICAgICAgICAgbGV0IGFsdFRleHQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhbHRcIikudHJpbSgpO1xuICAgICAgICAgICAgaWYgKGFsdFRleHQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCBiYWRUZXh0ID0gdmFsaWRhdGVQYXJhbXMuYmFkVGV4dC52YWx1ZTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgcGFzc2VkICYmIGkgPCBiYWRUZXh0Lmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGFsdFRleHQuaW5kZXhPZihiYWRUZXh0W2ldKSA9PSAtMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHBhc3NlZCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgc3JjID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKChub2RlTmFtZSA9PSBcImFyZWFcIikgPyBcImhyZWZcIiA6IFwic3JjXCIpO1xuICAgICAgICAgICAgICAgICAgICAvLyBBbGxvdyBpdCB0byBwYXNzIGlmIHRoZXJlJ3Mgbm8gc3JjIC0gY2FuJ3QgZGV0ZXJtaW5lIHRoZXNlLlxuICAgICAgICAgICAgICAgICAgICBpZiAoc3JjICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZhaWwgaWYgdGhlIGFsdCBtYXRjaGVzIHRoZSBzcmMgZXhhY3RseVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWxzbyBmYWlsIGlmIHRoZSBhbHQgaGFzIGEgLiBpbiBpdCBhbmQgZWl0aGVyIHRoZSBzcmMgaXMgaW4gdGhlIGFsdCBvciB0aGUgYWx0IGlzIGluIHRoZSBzcmNcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IHNyYy50cmltKCkgIT0gYWx0VGV4dCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbHRUZXh0LmluZGV4T2YoXCIuXCIpID09IC0xIHx8IChhbHRUZXh0LmluZGV4T2Yoc3JjKSA9PSAtMSAmJiBzcmMuaW5kZXhPZihhbHRUZXh0KSA9PSAtMSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlUG90ZW50aWFsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGltZ19hbHRfbnVsbDogUnVsZSA9IHtcbiAgICBpZDogXCJpbWdfYWx0X251bGxcIixcbiAgICBjb250ZXh0OiBcImRvbTppbWdbYWx0XVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0ltZ19UaXRsZUVtcHR5V2hlbkFsdE51bGxcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImZhaWxfZGVjb3JhdGl2ZVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImltZ19hbHRfbnVsbC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfZGVjb3JhdGl2ZVwiOiBcImltZ19hbHRfbnVsbC5odG1sXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9hcmlhX292ZXJyaWRlXCI6IFwiaW1nX2FsdF9udWxsLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpbWdfYWx0X251bGwuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiTmVpdGhlciAnYXJpYScgbm9yICd0aXRsZScgYXR0cmlidXRlcyBhcmUgdXNlZCBmb3IgdGhlIGRlY29yYXRpdmUgaW1hZ2VcIixcbiAgICAgICAgICAgIFwiZmFpbF9kZWNvcmF0aXZlXCI6IFwiVGhlIGltYWdlICdhbHQnIGF0dHJpYnV0ZSBpcyBlbXB0eSwgYnV0IHRoZSAndGl0bGUnIGF0dHJpYnV0ZSBpcyBub3QgZW1wdHlcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX2FyaWFfb3ZlcnJpZGVcIjogXCJUaGUgaW1hZ2UgJ2FsdCcgYXR0cmlidXRlIGlzIGVtcHR5LCBidXQgdGhlICdhcmlhJyBsYWJlbCBpcyBub3QgZW1wdHkgYW5kIG92ZXJyaWRlcyB0aGUgJ2FsdCcgYXR0cmlidXRlXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiV2hlbiB0aGUgaW50ZW50IGlzIHRvIG1hcmsgYW4gaW1hZ2UgYXMgZGVjb3JhdGl2ZSB3aXRoIGFuIGVtcHR5ICdhbHQnIGF0dHJpYnV0ZSwgdGhlICdhcmlhJyBvciAndGl0bGUnIGF0dHJpYnV0ZXMgc2hvdWxkIG5vdCBiZSB1c2VkXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FLFxuICAgICAgICByZWFzb25Db2RlczogW1wiZmFpbF9kZWNvcmF0aXZlXCJdXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCJBUklBXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkUsXG4gICAgICAgIHJlYXNvbkNvZGVzOiBbXCJwb3RlbnRpYWxfYXJpYV9vdmVycmlkZVwiXVxuICAgIH1cbiAgICBdLFxuICAgIGFjdDogW3tcIjQ2Y2E3ZlwiOiB7XCJwb3RlbnRpYWxfYXJpYV9vdmVycmlkZVwiOiBcImZhaWxcIn19XSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmIChydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhbHRcIikudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdlIGhhdmUgYSB0aXRsZSwgYnV0IGFsdCBpcyBlbXB0eVxuICAgICAgICBpZiAoQXJpYVV0aWwuZ2V0QXJpYUxhYmVsKHJ1bGVDb250ZXh0KS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF9hcmlhX292ZXJyaWRlXCIpO1xuICAgICAgICB9IGVsc2UgaWYgKENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwidGl0bGVcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfZGVjb3JhdGl2ZVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGltZ19hbHRfcmVkdW5kYW50OiBSdWxlID0ge1xuICAgIGlkOiBcImltZ19hbHRfcmVkdW5kYW50XCIsXG4gICAgY29udGV4dDogXCJkb206aW1nW2FsdF1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9JbWdfTGlua1RleHROb3RSZWR1bmRhbnRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkZhaWxfMlwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJGYWlsXzNcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImltZ19hbHRfcmVkdW5kYW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiaW1nX2FsdF9yZWR1bmRhbnQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJpbWdfYWx0X3JlZHVuZGFudC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcImltZ19hbHRfcmVkdW5kYW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpbWdfYWx0X3JlZHVuZGFudC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkxpbmsgdGV4dCBpcyByZXBlYXRlZCBpbiBhbiBpbWFnZSAnYWx0JyB2YWx1ZSB3aXRoaW4gdGhlIHNhbWUgbGlua1wiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJMaW5rIHRleHQgb2YgcHJldmlvdXMgbGluayBpcyByZXBlYXRlZCBpbiBpbWFnZSAnYWx0JyB2YWx1ZSBvZiBhIGxpbmtcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiSW1hZ2UgJ2FsdCcgdmFsdWUgd2l0aGluIGEgbGluayBpcyByZXBlYXRlZCBpbiBsaW5rIHRleHQgb2YgdGhlIGxpbmsgYWZ0ZXJcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgdGV4dCBhbHRlcm5hdGl2ZSBmb3IgYW4gaW1hZ2Ugd2l0aGluIGEgbGluayBzaG91bGQgbm90IHJlcGVhdCB0aGUgbGluayB0ZXh0IG9yIGFkamFjZW50IGxpbmsgdGV4dFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4xLjFcIiwgXCIyLjQuNFwiXSwgLy9tYXRjaCBoZWxwIHJlZmVyZW5jZXNcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgYU5vZGUgPSBDb21tb25VdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBcImFcIik7XG4gICAgICAgIC8vSWYgbm90IGluIGFuIGFuY2hvciwgT3V0IG9mIFNjb3BlXG4gICAgICAgIGlmIChhTm9kZSA9PSBudWxsKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgYWx0VGV4dCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFsdFwiKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKGFsdFRleHQubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIC8vIElmIGFsdCB0ZXh0IGlzIGVtcHR5LCB0aGVyZSdzIG5vIHRleHQgdG8gYmUgcmVkdW5kYW50IC0gbGV0IGFfdGV4dF9wdXJwb3NlXG4gICAgICAgICAgICAvLyB0cmlnZ2VyIGluIHRoYXQgY2FzZS5cbiAgICAgICAgICAgIC8vIFNvIE91dCBvZiBTY29wZSBmb3IgdGhpcyBydWxlXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgaW5uZXJUZXh0ID0gYU5vZGUuaW5uZXJUZXh0O1xuICAgICAgICBsZXQgbGlua1RleHQgPSBcIlwiO1xuXG4gICAgICAgIGlmIChpbm5lclRleHQgIT0gbnVsbCkge1xuICAgICAgICAgICAgbGlua1RleHQgPSBpbm5lclRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxpbmtUZXh0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGlmIChhbHRUZXh0ID09IGxpbmtUZXh0KSB7XG4gICAgICAgICAgICAgICAgLy8gVGV4dCBpbiBsaW5rXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgICAgICAvL2FsdCBpcyBub24temVybywgYnV0IG5vIGxpbmsgdGV4dCAtIGVuc3VyZSBhZGphY2VudCBsaW5rIHRleHQgaXNuJ3QgcmVkdW5kYW50XG4gICAgICAgICAgICBsZXQgd2FsayA9IG5ldyBET01XYWxrZXIoYU5vZGUpO1xuICAgICAgICAgICAgd2hpbGUgKHBhc3NlZCAmJiB3YWxrLnByZXZOb2RlKCkpIHtcbiAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIG5vZGUgYW5kIG5vZGVOYW1lXG4gICAgICAgICAgICAgICAgbGV0IG5vZGUgPSB3YWxrLm5vZGU7XG4gICAgICAgICAgICAgICAgbGV0IG5vZGVOYW1lID0gbm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIGlmICgobm9kZU5hbWUgPT0gXCIjdGV4dFwiICYmIG5vZGUubm9kZVZhbHVlLmxlbmd0aCA+IDApIHx8XG4gICAgICAgICAgICAgICAgICAgIChub2RlTmFtZSA9PSBcImltZ1wiICYmIENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkobm9kZSwgXCJhbHRcIikpKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBDb21wbHkgd2l0aCB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgU2V0dGluZyBpZiB0aGUgYSBlbGVtZW50IHNob3VsZCBiZSBjaGVja2VkIG9yIG5vdFxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5vZGVOYW1lID09PSBcImFcIiAmJiAhQ29tbW9uVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRleHQgYmVmb3JlIGltYWdlIGxpbmtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gKChub2RlIGFzIEhUTUxFbGVtZW50KS5pbm5lclRleHQgfHwgbm9kZS50ZXh0Q29udGVudCB8fCBcIlwiKS50cmltKCkudG9Mb3dlckNhc2UoKSAhPSBhbHRUZXh0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8yXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2FsayA9IG5ldyBET01XYWxrZXIoYU5vZGUsIHRydWUpO1xuICAgICAgICAgICAgd2hpbGUgKHBhc3NlZCAmJiB3YWxrLm5leHROb2RlKCkpIHtcbiAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIG5vZGUgYW5kIG5vZGVOYW1lXG4gICAgICAgICAgICAgICAgbGV0IG5vZGUgPSB3YWxrLm5vZGU7XG4gICAgICAgICAgICAgICAgbGV0IG5vZGVOYW1lID0gbm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgICAgICAgICAgaWYgKChub2RlTmFtZSA9PSBcIiN0ZXh0XCIgJiYgbm9kZS5ub2RlVmFsdWUubGVuZ3RoID4gMCkgfHxcbiAgICAgICAgICAgICAgICAgICAgKG5vZGVOYW1lID09IFwiaW1nXCIgJiYgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShub2RlLCBcImFsdFwiKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIENvbXBseSB3aXRoIHRoZSBDaGVjayBIaWRkZW4gQ29udGVudCBTZXR0aW5nIGlmIHRoZSBhIGVsZW1lbnQgc2hvdWxkIGJlIGNoZWNrZWQgb3Igbm90XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAobm9kZU5hbWUgPT0gXCJhXCIgJiYgIUNvbW1vblV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbihub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSAobm9kZSBhcyBIVE1MRWxlbWVudCkuaW5uZXJUZXh0LnRyaW0oKS50b0xvd2VyQ2FzZSgpICE9IGFsdFRleHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBUZXh0IGFmdGVyIGltYWdlIGxpbmtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzNcIik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5pbXBvcnQgeyBBY2NOYW1lVXRpbCB9IGZyb20gXCIuLi91dGlsL0FjY05hbWVVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBpbWdfYWx0X3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcImltZ19hbHRfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbTppbWdcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9JbWdfSGFzQWx0XCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiZmFpbF9ibGFua19hbHRcIjogXCJmYWlsX2JsYW5rX2FsdFwiLFxuICAgICAgICAgICAgXCJmYWlsX25vX2FsdFwiOiBcImZhaWxfbm9fYWx0XCIsXG4gICAgICAgICAgICBcImZhaWxfYmxhbmtfdGl0bGVcIjogXCJmYWlsX2JsYW5rX3RpdGxlXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiaW1nX2FsdF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfYmxhbmtfYWx0XCI6IFwiaW1nX2FsdF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfbm9fYWx0XCI6IFwiaW1nX2FsdF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfYmxhbmtfdGl0bGVcIjogXCJpbWdfYWx0X3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpbWdfYWx0X3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlRoZSBpbWFnZSBoYXMgYW4gYWNjZXNzaWJsZSBuYW1lIG9yIGlzIGNvcnJlY3RseSBtYXJrZWQgYXMgZGVjb3JhdGl2ZSBvciByZWR1bmRhbnRcIixcbiAgICAgICAgICAgIFwiZmFpbF9ibGFua19hbHRcIjogXCJJbWFnZSAnYWx0JyBhdHRyaWJ1dGUgdmFsdWUgY29uc2lzdHMgb25seSBvZiBibGFuayBzcGFjZShzKVwiLFxuICAgICAgICAgICAgXCJmYWlsX25vX2FsdFwiOiBcIlRoZSBpbWFnZSBoYXMgbmVpdGhlciBhbiBhY2Nlc3NpYmxlIG5hbWUgbm9yIGlzIG1hcmtlZCBhcyBkZWNvcmF0aXZlIG9yIHJlZHVuZGFudFwiLFxuICAgICAgICAgICAgXCJmYWlsX2JsYW5rX3RpdGxlXCI6IFwiVGhlIGltYWdlIGRvZXMgbm90IGhhdmUgYW4gJ2FsdCcgYXR0cmlidXRlIG9yIEFSSUEgbGFiZWwsIGFuZCB0aGUgJ3RpdGxlJyBhdHRyaWJ1dGUgdmFsdWUgY29uc2lzdHMgb25seSBvZiBibGFuayBzcGFjZShzKVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkltYWdlcyBtdXN0IGhhdmUgYWNjZXNzaWJsZSBuYW1lcyB1bmxlc3MgdGhleSBhcmUgZGVjb3JhdGl2ZSBvciByZWR1bmRhbnRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFwiMjNhMmE4XCIsXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy8gSWYgbm90IHZpc2libGUgdG8gdGhlIHNjcmVlbiByZWFkZXIsIG9yIGNhbiBiZSBpZ25vcmVkXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkgfHwgQWNjTmFtZVV0aWwuaXNBY2Nlc3NpYmxlTmFtZUlnbm9yYWJsZShydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIGlmIChBcmlhVXRpbC5nZXRBcmlhTGFiZWwocnVsZUNvbnRleHQpLnRyaW0oKS5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIC8vIHRoZSBpbWcgaGFzIG5vbi1lbXB0eSBhcmlhIGxhYmVsXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGFsdCA9IHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImFsdFwiKSA/IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFsdFwiKSA6IG51bGw7XG4gICAgICAgIFxuICAgICAgICAvLyBjaGVjayB0aXRsZSBhdHRyaWJ1dGVcbiAgICAgICAgaWYgKGFsdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gdGhlIGltZyBoYXMgbm8gYWx0IG9yIGF0dHJpYnV0ZSwgZXhhbWluZSB0aGUgdGl0bGUgYXR0cmlidXRlXG4gICAgICAgICAgICBsZXQgdGl0bGUgPSBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0aXRsZVwiKSA/IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInRpdGxlXCIpIDogbnVsbDtcbiAgICAgICAgICAgIGlmICh0aXRsZSA9PT0gbnVsbCB8fCB0aXRsZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAvLyBubyB0aXRsZSBvciB0aXRsZSBpcyBlbXB0eSwgZXhhbWluZSBhbHQgZnVydGhlclxuICAgICAgICAgICAgICAgIGlmIChhbHQgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJvbGUgPSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUocnVsZUNvbnRleHQsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJvbGUgPT09ICdwcmVzZW50YXRpb24nIHx8IHJvbGUgPT09ICdub25lJylcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX25vX2FsdFwiKTtcbiAgICAgICAgICAgICAgICB9ICAgIFxuICAgICAgICAgICAgICAgIGlmIChhbHQubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpOyBcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHRpdGxlLnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdGl0bGUgY29udGFpbnMgYmxhbmsgc3BhY2Ugb25seSAodGl0bGU9XCIgIFwiKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2JsYW5rX3RpdGxlXCIpOyBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gdGl0bGUgY29udGFpbnMgc29tZSB0ZXh0ICh0aXRsZT1cInNvbWUgdGV4dFwiKVxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoYWx0Lmxlbmd0aCA9PT0gMCB8fCBhbHQudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAvLyB0aGUgaW1nIGhhcyBlbXB0eSBhbHQgKGFsdD1cIlwiKSBvciBub24tZW1wdHkgYWx0IChhbHQ9XCJzb21lIHRleHRcIilcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpOyBcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gYWx0IGNvbnRhaW5zIGJsYW5rIHNwYWNlIG9ubHkgKGFsdD1cIiBcIilcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2JsYW5rX2FsdFwiKTsgXG4gICAgICAgICAgICB9ICAgIFxuICAgICAgICB9ICAgICAgICBcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgaW1nX2lzbWFwX21pc3VzZTogUnVsZSA9IHtcbiAgICBpZDogXCJpbWdfaXNtYXBfbWlzdXNlXCIsXG4gICAgY29udGV4dDogXCJkb206aW1nW2lzbWFwXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX0ltZ19Vc2VtYXBWYWxpZFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJpbWdfaXNtYXBfbWlzdXNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJpbWdfaXNtYXBfbWlzdXNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpbWdfaXNtYXBfbWlzdXNlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJTZXJ2ZXItc2lkZSBpbWFnZSBtYXAgaG90LXNwb3RzIGRvIG5vdCBoYXZlIGR1cGxpY2F0ZSB0ZXh0IGxpbmtzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiU2VydmVyLXNpZGUgaW1hZ2UgbWFwIGhvdC1zcG90cyBtdXN0IGhhdmUgZHVwbGljYXRlIHRleHQgbGlua3NcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidXNlbWFwXCIpKSB7XG4gICAgICAgICAgICBsZXQgdXNlbWFwID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidXNlbWFwXCIpO1xuICAgICAgICAgICAgdXNlbWFwID0gdXNlbWFwLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgbGV0IGlkeCA9IHVzZW1hcC5pbmRleE9mKFwiI1wiKTtcbiAgICAgICAgICAgIGlmIChpZHggIT0gLTEpXG4gICAgICAgICAgICAgICAgdXNlbWFwID0gdXNlbWFwLnN1YnN0cihpZHggKyAxKTtcblxuICAgICAgICAgICAgaWYgKHVzZW1hcC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IG1hcHMgPSBDb21tb25VdGlsLmdldERvY0VsZW1lbnRzQnlUYWcocnVsZUNvbnRleHQsIFwibWFwXCIpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyAhcGFzc2VkICYmIGkgPCBtYXBzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IG1hcHNbaV0uaGFzQXR0cmlidXRlKFwibmFtZVwiKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgbWFwc1tpXS5nZXRBdHRyaWJ1dGUoXCJuYW1lXCIpLnRvTG93ZXJDYXNlKCkgPT0gdXNlbWFwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGltZ19sb25nZGVzY19taXN1c2U6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaW1nX2xvbmdkZXNjX21pc3VzZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmltZ1tsb25nZGVzY11cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9JbWdfTG9uZ0Rlc2NyaXB0aW9uMlwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJpbWdfbG9uZ2Rlc2NfbWlzdXNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJpbWdfbG9uZ2Rlc2NfbWlzdXNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpbWdfbG9uZ2Rlc2NfbWlzdXNlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgdGhhdCB0aGUgZmlsZSBkZXNpZ25hdGVkIGJ5IHRoZSAnbG9uZ2Rlc2MnIGF0dHJpYnV0ZSBjb250YWlucyB2YWxpZCBIVE1MIGNvbnRlbnQgKGZpbGUgZXh0ZW5zaW9uIG5vdCByZWNvZ25pemVkKVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIiBUaGUgJ2xvbmdkZXNjJyBhdHRyaWJ1dGUgbXVzdCByZWZlcmVuY2UgSFRNTCBjb250ZW50XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBsb25nZGVzYyA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImxvbmdkZXNjXCIpO1xuICAgICAgICAvLyBpZiAobG9uZ2Rlc2MgaXMgYmFkIFVSTCkgcGFzc2VkID0gZmFsc2U7XG5cbiAgICAgICAgbGV0IGV4dCA9IENvbW1vblV0aWwuZ2V0RmlsZUV4dChsb25nZGVzYyk7XG4gICAgICAgIGxldCBwYXNzZWQgPSBleHQubGVuZ3RoICE9IDAgJiYgQ29tbW9uVXRpbC5pc0h0bWxFeHQoZXh0KVxuICAgICAgICAgICAgfHwgbG9uZ2Rlc2Muc3RhcnRzV2l0aChcIiNcIilcbiAgICAgICAgICAgIHx8IGxvbmdkZXNjLnN0YXJ0c1dpdGgoXCJodHRwOi8vXCIpXG4gICAgICAgICAgICB8fCBsb25nZGVzYy5zdGFydHNXaXRoKFwiaHR0cHM6Ly9cIilcbiAgICAgICAgICAgIHx8IGxvbmdkZXNjLnN0YXJ0c1dpdGgoXCJkYXRhOlwiKTtcblxuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4vLyBUaGlzIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgXCJucG0gcnVuIHByZWJ1aWxkXCIuIERvIG5vdCBlZGl0XG5cbmV4cG9ydCAqIGZyb20gXCIuL2FfdGFyZ2V0X3dhcm5pbmdcIlxuZXhwb3J0ICogZnJvbSBcIi4vYV90ZXh0X3B1cnBvc2VcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXBwbGV0X2FsdF9leGlzdHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXBwbGljYXRpb25fY29udGVudF9hY2Nlc3NpYmxlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyZWFfYWx0X2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2FjY2Vzc2libGVuYW1lX2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdGFiaW5kZXhfdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9hY3RpdmVkZXNjZW5kYW50X3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfYXBwbGljYXRpb25fbGFiZWxfdW5pcXVlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfYXBwbGljYXRpb25fbGFiZWxsZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9hcnRpY2xlX2xhYmVsX3VuaXF1ZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2F0dHJpYnV0ZV9hbGxvd2VkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfYXR0cmlidXRlX2NvbmZsaWN0XCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfYXR0cmlidXRlX2RlcHJlY2F0ZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9hdHRyaWJ1dGVfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfYXR0cmlidXRlX3JlZHVuZGFudFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2F0dHJpYnV0ZV9yZXF1aXJlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2F0dHJpYnV0ZV92YWx1ZV92YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2Jhbm5lcl9sYWJlbF91bmlxdWVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9iYW5uZXJfc2luZ2xlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfY2hpbGRfdGFiYmFibGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9jaGlsZF92YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxfdW5pcXVlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfY29tcGxlbWVudGFyeV9sYWJlbF92aXNpYmxlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfY29tcGxlbWVudGFyeV9sYWJlbGxlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2NvbnRlbnRfaW5fbGFuZG1hcmtcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9jb250ZW50aW5mb19sYWJlbF91bmlxdWVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9jb250ZW50aW5mb19taXN1c2VcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9jb250ZW50aW5mb19zaW5nbGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9kZXNjZW5kYW50X3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfZG9jdW1lbnRfbGFiZWxfdW5pcXVlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfZXZlbnRoYW5kbGVyX3JvbGVfdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9mb3JtX2xhYmVsX3VuaXF1ZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2dyYXBoaWNfbGFiZWxsZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9oaWRkZW5fbm9udGFiYmFibGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9pZF91bmlxdWVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9pbWdfbGFiZWxsZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9rZXlib2FyZF9oYW5kbGVyX2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2xhbmRtYXJrX25hbWVfdW5pcXVlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfbWFpbl9sYWJlbF91bmlxdWVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9tYWluX2xhYmVsX3Zpc2libGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9uYXZpZ2F0aW9uX2xhYmVsX3VuaXF1ZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX3BhcmVudF9yZXF1aXJlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX3JlZ2lvbl9sYWJlbF91bmlxdWVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9yZWdpb25fbGFiZWxsZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9yb2xlX2FsbG93ZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9yb2xlX3JlZHVuZGFudFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX3NlYXJjaF9sYWJlbF91bmlxdWVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9zZW1hbnRpY3NcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV90b29sYmFyX2xhYmVsX3VuaXF1ZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX3dpZGdldF9sYWJlbGxlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hc2NpaWFydF9hbHRfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2JsaW5rX2Nzc19yZXZpZXdcIlxuZXhwb3J0ICogZnJvbSBcIi4vYmxpbmtfZWxlbV9kZXByZWNhdGVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2Jsb2NrcXVvdGVfY2l0ZV9leGlzdHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vY2FudmFzX2NvbnRlbnRfZGVzY3JpYmVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2NhcHRpb25fdHJhY2tfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2NvbWJvYm94X2FjdGl2ZV9kZXNjZW5kYW50XCJcbmV4cG9ydCAqIGZyb20gXCIuL2NvbWJvYm94X2F1dG9jb21wbGV0ZV92YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9jb21ib2JveF9kZXNpZ25fdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vY29tYm9ib3hfZm9jdXNhYmxlX2VsZW1lbnRzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2NvbWJvYm94X2hhc3BvcHVwX3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2NvbWJvYm94X3BvcHVwX3JlZmVyZW5jZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9kZWJ1Z19wYXRoc1wiXG5leHBvcnQgKiBmcm9tIFwiLi9kZXRlY3Rvcl90YWJiYWJsZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9kaXJfYXR0cmlidXRlX3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2Rvd25sb2FkX2tleWJvYXJkX2NvbnRyb2xsYWJsZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9kcmFnZ2FibGVfYWx0ZXJuYXRpdmVfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2VsZW1lbnRfYWNjZXNza2V5X2xhYmVsbGVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2VsZW1lbnRfYWNjZXNza2V5X3VuaXF1ZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9lbGVtZW50X2F0dHJpYnV0ZV9kZXByZWNhdGVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2VsZW1lbnRfaWRfdW5pcXVlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2VsZW1lbnRfbGFuZ192YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9lbGVtZW50X21vdXNlZXZlbnRfa2V5Ym9hcmRcIlxuZXhwb3J0ICogZnJvbSBcIi4vZWxlbWVudF9vcmllbnRhdGlvbl91bmxvY2tlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9lbGVtZW50X3Njcm9sbGFibGVfdGFiYmFibGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vZWxlbWVudF90YWJiYWJsZV9yb2xlX3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2VsZW1lbnRfdGFiYmFibGVfdW5vYnNjdXJlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9lbGVtZW50X3RhYmJhYmxlX3Zpc2libGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vZW1iZWRfYWx0X2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9lbW90aWNvbnNfYWx0X2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9lcnJvcl9tZXNzYWdlX2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9maWVsZHNldF9sYWJlbF92YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9maWVsZHNldF9sZWdlbmRfdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vZmlndXJlX2xhYmVsX2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9mb3JtX2ZvbnRfY29sb3JcIlxuZXhwb3J0ICogZnJvbSBcIi4vZm9ybV9pbnRlcmFjdGlvbl9yZXZpZXdcIlxuZXhwb3J0ICogZnJvbSBcIi4vZm9ybV9sYWJlbF91bmlxdWVcIlxuZXhwb3J0ICogZnJvbSBcIi4vZm9ybV9zdWJtaXRfYnV0dG9uX2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9mb3JtX3N1Ym1pdF9yZXZpZXdcIlxuZXhwb3J0ICogZnJvbSBcIi4vZnJhbWVfc3JjX3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2ZyYW1lX3RpdGxlX2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9oZWFkaW5nX2NvbnRlbnRfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2hlYWRpbmdfbWFya3VwX21pc3VzZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9odG1sX2xhbmdfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2h0bWxfc2tpcG5hdl9leGlzdHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vaWZyYW1lX2ludGVyYWN0aXZlX3RhYmJhYmxlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2ltYWdlYnV0dG9uX2FsdF9leGlzdHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vaW1hZ2VtYXBfYWx0X2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9pbWdfYWx0X2JhY2tncm91bmRcIlxuZXhwb3J0ICogZnJvbSBcIi4vaW1nX2FsdF9kZWNvcmF0aXZlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2ltZ19hbHRfbWlzdXNlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2ltZ19hbHRfbnVsbFwiXG5leHBvcnQgKiBmcm9tIFwiLi9pbWdfYWx0X3JlZHVuZGFudFwiXG5leHBvcnQgKiBmcm9tIFwiLi9pbWdfYWx0X3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2ltZ19pc21hcF9taXN1c2VcIlxuZXhwb3J0ICogZnJvbSBcIi4vaW1nX2xvbmdkZXNjX21pc3VzZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9pbnB1dF9hdXRvY29tcGxldGVfdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vaW5wdXRfY2hlY2tib3hlc19ncm91cGVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2lucHV0X2ZpZWxkc19ncm91cGVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2lucHV0X2hhc3BvcHVwX2NvbmZsaWN0XCJcbmV4cG9ydCAqIGZyb20gXCIuL2lucHV0X2xhYmVsX2FmdGVyXCJcbmV4cG9ydCAqIGZyb20gXCIuL2lucHV0X2xhYmVsX2JlZm9yZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9pbnB1dF9sYWJlbF9leGlzdHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vaW5wdXRfbGFiZWxfdmlzaWJsZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9pbnB1dF9vbmNoYW5nZV9yZXZpZXdcIlxuZXhwb3J0ICogZnJvbSBcIi4vaW5wdXRfcGxhY2Vob2xkZXJfbGFiZWxfdmlzaWJsZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9sYWJlbF9jb250ZW50X2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9sYWJlbF9uYW1lX3Zpc2libGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vbGFiZWxfcmVmX3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2xpc3RfY2hpbGRyZW5fdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vbGlzdF9tYXJrdXBfcmV2aWV3XCJcbmV4cG9ydCAqIGZyb20gXCIuL2xpc3Rfc3RydWN0dXJlX3Byb3BlclwiXG5leHBvcnQgKiBmcm9tIFwiLi9tYXJxdWVlX2VsZW1fYXZvaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vbWVkaWFfYWx0X2JyaWVmXCJcbmV4cG9ydCAqIGZyb20gXCIuL21lZGlhX2FsdF9leGlzdHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vbWVkaWFfYXVkaW9fdHJhbnNjcmliZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vbWVkaWFfYXV0b3N0YXJ0X2NvbnRyb2xsYWJsZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9tZWRpYV9rZXlib2FyZF9jb250cm9sbGFibGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vbWVkaWFfbGl2ZV9jYXB0aW9uZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vbWVkaWFfdHJhY2tfYXZhaWxhYmxlXCJcbmV4cG9ydCAqIGZyb20gXCIuL21ldGFfcmVkaXJlY3Rfb3B0aW9uYWxcIlxuZXhwb3J0ICogZnJvbSBcIi4vbWV0YV9yZWZyZXNoX2RlbGF5XCJcbmV4cG9ydCAqIGZyb20gXCIuL21ldGFfdmlld3BvcnRfem9vbWFibGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vbm9lbWJlZF9jb250ZW50X2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9vYmplY3RfdGV4dF9leGlzdHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vcGFnZV90aXRsZV9leGlzdHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vcGFnZV90aXRsZV92YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9zY3JpcHRfZm9jdXNfYmx1cl9yZXZpZXdcIlxuZXhwb3J0ICogZnJvbSBcIi4vc2NyaXB0X29uY2xpY2tfYXZvaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vc2NyaXB0X29uY2xpY2tfbWlzdXNlXCJcbmV4cG9ydCAqIGZyb20gXCIuL3NjcmlwdF9zZWxlY3RfcmV2aWV3XCJcbmV4cG9ydCAqIGZyb20gXCIuL3NlbGVjdF9vcHRpb25zX2dyb3VwZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vc2tpcF9tYWluX2Rlc2NyaWJlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9za2lwX21haW5fZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL3N0eWxlX2JhY2tncm91bmRfZGVjb3JhdGl2ZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9zdHlsZV9iZWZvcmVfYWZ0ZXJfcmV2aWV3XCJcbmV4cG9ydCAqIGZyb20gXCIuL3N0eWxlX2NvbG9yX21pc3VzZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9zdHlsZV9mb2N1c192aXNpYmxlXCJcbmV4cG9ydCAqIGZyb20gXCIuL3N0eWxlX2hpZ2hjb250cmFzdF92aXNpYmxlXCJcbmV4cG9ydCAqIGZyb20gXCIuL3N0eWxlX2hvdmVyX3BlcnNpc3RlbnRcIlxuZXhwb3J0ICogZnJvbSBcIi4vc3R5bGVfdmlld3BvcnRfcmVzaXphYmxlXCJcbmV4cG9ydCAqIGZyb20gXCIuL3N2Z19ncmFwaGljc19sYWJlbGxlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi90YWJsZV9hcmlhX2Rlc2NlbmRhbnRzXCJcbmV4cG9ydCAqIGZyb20gXCIuL3RhYmxlX2NhcHRpb25fZW1wdHlcIlxuZXhwb3J0ICogZnJvbSBcIi4vdGFibGVfY2FwdGlvbl9uZXN0ZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vdGFibGVfaGVhZGVyc19leGlzdHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vdGFibGVfaGVhZGVyc19yZWZfdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vdGFibGVfaGVhZGVyc19yZWxhdGVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL3RhYmxlX2xheW91dF9saW5lYXJpemVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL3RhYmxlX3Njb3BlX3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL3RhYmxlX3N0cnVjdHVyZV9taXN1c2VcIlxuZXhwb3J0ICogZnJvbSBcIi4vdGFibGVfc3VtbWFyeV9yZWR1bmRhbnRcIlxuZXhwb3J0ICogZnJvbSBcIi4vdGFyZ2V0X3NwYWNpbmdfc3VmZmljaWVudFwiXG5leHBvcnQgKiBmcm9tIFwiLi90ZXh0X2Jsb2NrX2hlYWRpbmdcIlxuZXhwb3J0ICogZnJvbSBcIi4vdGV4dF9jb250cmFzdF9zdWZmaWNpZW50XCJcbmV4cG9ydCAqIGZyb20gXCIuL3RleHRfcXVvdGVkX2NvcnJlY3RseVwiXG5leHBvcnQgKiBmcm9tIFwiLi90ZXh0X3NlbnNvcnlfbWlzdXNlXCJcbmV4cG9ydCAqIGZyb20gXCIuL3RleHRfc3BhY2luZ192YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi90ZXh0X3doaXRlc3BhY2VfdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vd2lkZ2V0X3RhYmJhYmxlX2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi93aWRnZXRfdGFiYmFibGVfc2luZ2xlXCIiLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgaW5wdXRfYXV0b2NvbXBsZXRlX3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcImlucHV0X2F1dG9jb21wbGV0ZV92YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmlucHV0W2F1dG9jb21wbGV0ZV0sIGRvbTp0ZXh0YXJlYVthdXRvY29tcGxldGVdLCBkb206c2VsZWN0W2F1dG9jb21wbGV0ZV1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMV9JbnB1dF9BdXRvY29tcGxldGVcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImZhaWxfaW5hcHByb3ByaWF0ZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJmYWlsX2ludmFsaWRcIixcbiAgICAgICAgICAgIFwiRmFpbF9hdHRyaWJ1dGVfaW5jb3JyZWN0XCI6IFwiZmFpbF9pbmNvcnJlY3RcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcImlucHV0X2F1dG9jb21wbGV0ZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcInBhc3NcIjogXCJpbnB1dF9hdXRvY29tcGxldGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2luYXBwcm9wcmlhdGVcIjogXCJpbnB1dF9hdXRvY29tcGxldGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2ludmFsaWRcIjogXCJpbnB1dF9hdXRvY29tcGxldGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2luY29ycmVjdFwiOiBcImlucHV0X2F1dG9jb21wbGV0ZV92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGhlICdhdXRvY29tcGxldGUnIGF0dHJpYnV0ZSdzIHRva2VuKHMpIG11c3QgYmUgYXBwcm9wcmlhdGUgZm9yIHRoZSBpbnB1dCBmb3JtIGZpZWxkXCIsXG4gICAgICAgICAgICBcInBhc3NcIjogXCJUaGUgJ2F1dG9jb21wbGV0ZScgYXR0cmlidXRlJ3MgdG9rZW4ocykgaXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBpbnB1dCBmb3JtIGZpZWxkXCIsXG4gICAgICAgICAgICBcImZhaWxfaW5hcHByb3ByaWF0ZVwiOiBcIlRoZSAnYXV0b2NvbXBsZXRlJyBhdHRyaWJ1dGUncyB0b2tlbihzKSBhcmUgbm90IGFwcHJvcHJpYXRlIGZvciB0aGUgaW5wdXQgZm9ybSBmaWVsZFwiLFxuICAgICAgICAgICAgXCJmYWlsX2ludmFsaWRcIjogXCJUaGUgJ2F1dG9jb21wbGV0ZScgYXR0cmlidXRlJ3MgdG9rZW4ocykgYXJlIG5vdCBhcHByb3ByaWF0ZSBmb3IgYW4gaW5wdXQgZm9ybSBmaWVsZCBvZiBhbnkgdHlwZVwiLFxuICAgICAgICAgICAgXCJmYWlsX2luY29ycmVjdFwiOiBcIlRoZSAnYXV0b2NvbXBsZXRlJyBhdHRyaWJ1dGUgaGFzIGFuIGluY29ycmVjdCB2YWx1ZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjVcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgXG4gICAgYWN0OiBbe1xuICAgICAgICBcIjczZjJjMlwiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcImZhaWxfaW5hcHByb3ByaWF0ZVwiOiBcImZhaWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9pbnZhbGlkXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJmYWlsX2luY29ycmVjdFwiOiBcImZhaWxcIlxuICAgICAgICB9XG4gICAgfV0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIG9yIGRpc2FibGVkXG4gICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKHJ1bGVDb250ZXh0KSB8fCBDb21tb25VdGlsLmlzTm9kZURpc2FibGVkKHJ1bGVDb250ZXh0KSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGxldCBhdXRvY29tcGxldGVBdHRyID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYXV0b2NvbXBsZXRlXCIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIGxldCB0b2tlbnMgPSBhdXRvY29tcGxldGVBdHRyLnNwbGl0KC9cXHMrLyk7XG4gICAgICAgIGlmICh0b2tlbnMubGVuZ3RoID09PSAwIHx8IGF1dG9jb21wbGV0ZUF0dHIubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNhY2hlID0ge1xuICAgICAgICAgICAgXCJ0b2tlbnNPbk9mZlwiOiBbXCJvblwiLCBcIm9mZlwiXSxcbiAgICAgICAgICAgIFwidG9rZW5PcHRpb25hbFNlY3Rpb25cIjogXCJzZWN0aW9uLVwiLFxuICAgICAgICAgICAgXCJ0b2tlbnNPcHRpb25hbFB1cnBvc2VcIjogW1wic2hpcHBpbmdcIiwgXCJiaWxsaW5nXCJdLFxuICAgICAgICAgICAgXCJ0b2tlbnNNYW5kYXRvcnlHcm91cDFfcGFzc3dvcmRcIjogW1wibmV3LXBhc3N3b3JkXCIsIFwiY3VycmVudC1wYXNzd29yZFwiLCBcIm9uZS10aW1lLWNvZGVcIl0sXG4gICAgICAgICAgICBcInRva2Vuc01hbmRhdG9yeUdyb3VwMV9tdWx0aWxpbmVcIjogW1wic3RyZWV0LWFkZHJlc3NcIl0sXG4gICAgICAgICAgICBcInRva2Vuc01hbmRhdG9yeUdyb3VwMV9tb250aFwiOiBbXCJjYy1leHBcIl0sXG4gICAgICAgICAgICBcInRva2Vuc01hbmRhdG9yeUdyb3VwMV9udW1lcmljXCI6IFtcImNjLWV4cC1tb250aFwiLFxuICAgICAgICAgICAgICAgIFwiY2MtZXhwLXllYXJcIixcbiAgICAgICAgICAgICAgICBcInRyYW5zYWN0aW9uLWFtb3VudFwiLFxuICAgICAgICAgICAgICAgIFwiYmRheS1kYXlcIixcbiAgICAgICAgICAgICAgICBcImJkYXktbW9udGhcIixcbiAgICAgICAgICAgICAgICBcImJkYXkteWVhclwiXSxcbiAgICAgICAgICAgIFwidG9rZW5zTWFuZGF0b3J5R3JvdXAxX2RhdGVcIjogW1wiYmRheVwiXSxcbiAgICAgICAgICAgIFwidG9rZW5zTWFuZGF0b3J5R3JvdXAxX3VybFwiOiBbXCJ1cmxcIiwgXCJwaG90b1wiXSxcbiAgICAgICAgICAgIFwidG9rZW5zTWFuZGF0b3J5R3JvdXAxX3RleHRcIjogW1wibmFtZVwiLFxuICAgICAgICAgICAgICAgIFwiaG9ub3JpZmljLXByZWZpeFwiLFxuICAgICAgICAgICAgICAgIFwiZ2l2ZW4tbmFtZVwiLFxuICAgICAgICAgICAgICAgIFwiYWRkaXRpb25hbC1uYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJmYW1pbHktbmFtZVwiLFxuICAgICAgICAgICAgICAgIFwiaG9ub3JpZmljLXN1ZmZpeFwiLFxuICAgICAgICAgICAgICAgIFwibmlja25hbWVcIixcbiAgICAgICAgICAgICAgICBcInVzZXJuYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJvcmdhbml6YXRpb24tdGl0bGVcIixcbiAgICAgICAgICAgICAgICBcIm9yZ2FuaXphdGlvblwiLFxuICAgICAgICAgICAgICAgIFwiYWRkcmVzcy1saW5lMVwiLFxuICAgICAgICAgICAgICAgIFwiYWRkcmVzcy1saW5lMlwiLFxuICAgICAgICAgICAgICAgIFwiYWRkcmVzcy1saW5lM1wiLFxuICAgICAgICAgICAgICAgIFwiYWRkcmVzcy1sZXZlbDRcIixcbiAgICAgICAgICAgICAgICBcImFkZHJlc3MtbGV2ZWwzXCIsXG4gICAgICAgICAgICAgICAgXCJhZGRyZXNzLWxldmVsMlwiLFxuICAgICAgICAgICAgICAgIFwiYWRkcmVzcy1sZXZlbDFcIixcbiAgICAgICAgICAgICAgICBcImNvdW50cnlcIixcbiAgICAgICAgICAgICAgICBcImNvdW50cnktbmFtZVwiLFxuICAgICAgICAgICAgICAgIFwicG9zdGFsLWNvZGVcIixcbiAgICAgICAgICAgICAgICBcImNjLW5hbWVcIixcbiAgICAgICAgICAgICAgICBcImNjLWdpdmVuLW5hbWVcIixcbiAgICAgICAgICAgICAgICBcImNjLWFkZGl0aW9uYWwtbmFtZVwiLFxuICAgICAgICAgICAgICAgIFwiY2MtZmFtaWx5LW5hbWVcIixcbiAgICAgICAgICAgICAgICBcImNjLW51bWJlclwiLFxuICAgICAgICAgICAgICAgIFwiY2MtY3NjXCIsXG4gICAgICAgICAgICAgICAgXCJjYy10eXBlXCIsXG4gICAgICAgICAgICAgICAgXCJ0cmFuc2FjdGlvbi1jdXJyZW5jeVwiLFxuICAgICAgICAgICAgICAgIFwibGFuZ3VhZ2VcIixcbiAgICAgICAgICAgICAgICBcInNleFwiXSxcbiAgICAgICAgICAgIFwidG9rZW5zTWFuZGF0b3J5R3JvdXAxX2FsbFwiOiBbXCJuYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJob25vcmlmaWMtcHJlZml4XCIsXG4gICAgICAgICAgICAgICAgXCJnaXZlbi1uYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJhZGRpdGlvbmFsLW5hbWVcIixcbiAgICAgICAgICAgICAgICBcImZhbWlseS1uYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJob25vcmlmaWMtc3VmZml4XCIsXG4gICAgICAgICAgICAgICAgXCJuaWNrbmFtZVwiLFxuICAgICAgICAgICAgICAgIFwidXNlcm5hbWVcIixcbiAgICAgICAgICAgICAgICBcIm5ldy1wYXNzd29yZFwiLFxuICAgICAgICAgICAgICAgIFwiY3VycmVudC1wYXNzd29yZFwiLFxuICAgICAgICAgICAgICAgIFwib3JnYW5pemF0aW9uLXRpdGxlXCIsXG4gICAgICAgICAgICAgICAgXCJvcmdhbml6YXRpb25cIixcbiAgICAgICAgICAgICAgICBcInN0cmVldC1hZGRyZXNzXCIsXG4gICAgICAgICAgICAgICAgXCJhZGRyZXNzLWxpbmUxXCIsXG4gICAgICAgICAgICAgICAgXCJhZGRyZXNzLWxpbmUyXCIsXG4gICAgICAgICAgICAgICAgXCJhZGRyZXNzLWxpbmUzXCIsXG4gICAgICAgICAgICAgICAgXCJhZGRyZXNzLWxldmVsNFwiLFxuICAgICAgICAgICAgICAgIFwiYWRkcmVzcy1sZXZlbDNcIixcbiAgICAgICAgICAgICAgICBcImFkZHJlc3MtbGV2ZWwyXCIsXG4gICAgICAgICAgICAgICAgXCJhZGRyZXNzLWxldmVsMVwiLFxuICAgICAgICAgICAgICAgIFwiY291bnRyeVwiLFxuICAgICAgICAgICAgICAgIFwiY291bnRyeS1uYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJwb3N0YWwtY29kZVwiLFxuICAgICAgICAgICAgICAgIFwiY2MtbmFtZVwiLFxuICAgICAgICAgICAgICAgIFwiY2MtZ2l2ZW4tbmFtZVwiLFxuICAgICAgICAgICAgICAgIFwiY2MtYWRkaXRpb25hbC1uYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJjYy1mYW1pbHktbmFtZVwiLFxuICAgICAgICAgICAgICAgIFwiY2MtbnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgXCJjYy1leHBcIixcbiAgICAgICAgICAgICAgICBcImNjLWV4cC1tb250aFwiLFxuICAgICAgICAgICAgICAgIFwiY2MtZXhwLXllYXJcIixcbiAgICAgICAgICAgICAgICBcImNjLWNzY1wiLFxuICAgICAgICAgICAgICAgIFwiY2MtdHlwZVwiLFxuICAgICAgICAgICAgICAgIFwidHJhbnNhY3Rpb24tY3VycmVuY3lcIixcbiAgICAgICAgICAgICAgICBcInRyYW5zYWN0aW9uLWFtb3VudFwiLFxuICAgICAgICAgICAgICAgIFwibGFuZ3VhZ2VcIixcbiAgICAgICAgICAgICAgICBcImJkYXlcIixcbiAgICAgICAgICAgICAgICBcImJkYXktZGF5XCIsXG4gICAgICAgICAgICAgICAgXCJiZGF5LW1vbnRoXCIsXG4gICAgICAgICAgICAgICAgXCJiZGF5LXllYXJcIixcbiAgICAgICAgICAgICAgICBcInNleFwiLFxuICAgICAgICAgICAgICAgIFwidXJsXCIsXG4gICAgICAgICAgICAgICAgXCJwaG90b1wiXSxcbiAgICAgICAgICAgIFwidG9rZW5zT3B0aW9uYWxHcm91cDJcIjogW1wiaG9tZVwiLFxuICAgICAgICAgICAgICAgIFwid29ya1wiLFxuICAgICAgICAgICAgICAgIFwibW9iaWxlXCIsXG4gICAgICAgICAgICAgICAgXCJmYXhcIixcbiAgICAgICAgICAgICAgICBcInBhZ2VyXCJdLFxuXG4gICAgICAgICAgICBcInRva2Vuc01hbmRhdG9yeUdyb3VwMl90ZWxcIjogW1widGVsXCJdLFxuICAgICAgICAgICAgXCJ0b2tlbnNNYW5kYXRvcnlHcm91cDJfZW1haWxcIjogW1wiZW1haWxcIl0sXG4gICAgICAgICAgICBcInRva2Vuc01hbmRhdG9yeUdyb3VwMl91cmxcIjogW1wiaW1wcFwiXSxcbiAgICAgICAgICAgIFwidG9rZW5zTWFuZGF0b3J5R3JvdXAyX3RleHRcIjogW1widGVsLWNvdW50cnktY29kZVwiLFxuICAgICAgICAgICAgICAgIFwidGVsLW5hdGlvbmFsXCIsXG4gICAgICAgICAgICAgICAgXCJ0ZWwtYXJlYS1jb2RlXCIsXG4gICAgICAgICAgICAgICAgXCJ0ZWwtbG9jYWxcIixcbiAgICAgICAgICAgICAgICBcInRlbC1sb2NhbC1wcmVmaXhcIixcbiAgICAgICAgICAgICAgICBcInRlbC1sb2NhbC1zdWZmaXhcIixcbiAgICAgICAgICAgICAgICBcInRlbC1leHRlbnNpb25cIl0sXG4gICAgICAgICAgICBcInRva2Vuc01hbmRhdG9yeUdyb3VwMl9hbGxcIjogW1widGVsXCIsXG4gICAgICAgICAgICAgICAgXCJ0ZWwtY291bnRyeS1jb2RlXCIsXG4gICAgICAgICAgICAgICAgXCJ0ZWwtbmF0aW9uYWxcIixcbiAgICAgICAgICAgICAgICBcInRlbC1hcmVhLWNvZGVcIixcbiAgICAgICAgICAgICAgICBcInRlbC1sb2NhbFwiLFxuICAgICAgICAgICAgICAgIFwidGVsLWxvY2FsLXByZWZpeFwiLFxuICAgICAgICAgICAgICAgIFwidGVsLWxvY2FsLXN1ZmZpeFwiLFxuICAgICAgICAgICAgICAgIFwidGVsLWV4dGVuc2lvblwiLFxuICAgICAgICAgICAgICAgIFwiZW1haWxcIixcbiAgICAgICAgICAgICAgICBcImltcHBcIl0sXG4gICAgICAgICAgICBcInRva2Vuc09wdGlvbkdyb3VwMV93ZWJhdXRoblwiOiBbXCJ3ZWJhdXRoblwiXSAgICBcbiAgICAgICAgfVxuICAgICAgICBsZXQgdmFsaWRfdmFsdWVzID0gW107XG4gICAgICAgIGZvciAodmFyIGtleSBpbiBjYWNoZSlcbiAgICAgICAgICAgIHZhbGlkX3ZhbHVlcz12YWxpZF92YWx1ZXMuY29uY2F0KGNhY2hlW2tleV0pO1xuICAgICAgICBcbiAgICAgICAgbGV0IGZvdW5kTWFuZGF0b3J5VG9rZW4gPSBmYWxzZTtcbiAgICAgICAgbGV0IGZvdW5kUmVjb2duaXplZFRva2VuID0gdHJ1ZTtcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKCF0b2tlbnMuZXZlcnkociA9PiB2YWxpZF92YWx1ZXMuaW5jbHVkZXMocikgfHwgci5zdGFydHNXaXRoKGNhY2hlWyd0b2tlbk9wdGlvbmFsU2VjdGlvbiddKSkpXG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2luY29ycmVjdFwiKTtcbiAgICAgICAgXG4gICAgICAgIGxldCB0eXBlID0gcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidHlwZVwiKSA/IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInR5cGVcIikudHJpbSgpLnRvTG93ZXJDYXNlKCkgOiBcInRleHRcIjtcbiAgICAgICAgXG4gICAgICAgIGxldCB0b2tlbnNNYW5kYXRvcnlHcm91cDEgPSBbXTtcbiAgICAgICAgbGV0IHRva2Vuc01hbmRhdG9yeUdyb3VwMiA9IFtdO1xuICAgICAgICBsZXQgdG9rZW5zT3B0aW9uYWxHcm91cCA9IFtdO1xuXG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJ0ZXh0YXJlYVwiIHx8IG5vZGVOYW1lID09PSBcInNlbGVjdFwiKSB7XG4gICAgICAgICAgICAvLyBhY2NlcHQgYWxsIHRva2Vuc1xuICAgICAgICAgICAgdG9rZW5zTWFuZGF0b3J5R3JvdXAxID0gY2FjaGUudG9rZW5zTWFuZGF0b3J5R3JvdXAxX2FsbDtcbiAgICAgICAgICAgIHRva2Vuc01hbmRhdG9yeUdyb3VwMiA9IGNhY2hlLnRva2Vuc01hbmRhdG9yeUdyb3VwMl9hbGw7XG4gICAgICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwidGV4dGFyZWFcIilcbiAgICAgICAgICAgICAgICB0b2tlbnNPcHRpb25hbEdyb3VwID0gY2FjaGUudG9rZW5zT3B0aW9uR3JvdXAxX3dlYmF1dGhuO1xuXG4gICAgICAgIH0gZWxzZSBpZiAobm9kZU5hbWUgPT09IFwiaW5wdXRcIikge1xuICAgICAgICAgICAgdG9rZW5zT3B0aW9uYWxHcm91cCA9IGNhY2hlLnRva2Vuc09wdGlvbkdyb3VwMV93ZWJhdXRobjtcbiAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgdmFyaW91cyAnaW5wdXQnIHR5cGVzXG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcblxuICAgICAgICAgICAgICAgIC8vIERpc2FibGUgY2hlY2sgZm9yIGlucHV0IHR5cGU9aGlkZGVuIGZvciBub3cgYmFzZWQgb24gc2NydW0gZGlzY3Vzc2lvblxuICAgICAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgICAgY2FzZSBcImhpZGRlblwiOlxuICAgICAgICAgICAgICAgICAgICAvLyBhY2NlcHQgYWxsIHRva2Vuc1xuICAgICAgICAgICAgICAgICAgICB0b2tlbnNNYW5kYXRvcnlHcm91cDEgPSBjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDFfYWxsO1xuICAgICAgICAgICAgICAgICAgICB0b2tlbnNNYW5kYXRvcnlHcm91cDIgPSBjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDJfYWxsO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICAgICAgY2FzZSBcInRleHRcIjpcbiAgICAgICAgICAgICAgICBjYXNlIFwic2VhcmNoXCI6XG4gICAgICAgICAgICAgICAgICAgIHRva2Vuc01hbmRhdG9yeUdyb3VwMSA9IGNhY2hlLnRva2Vuc01hbmRhdG9yeUdyb3VwMV90ZXh0LmNvbmNhdChjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDFfcGFzc3dvcmQsXG4gICAgICAgICAgICAgICAgICAgICAgICBjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDFfdXJsLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGUudG9rZW5zTWFuZGF0b3J5R3JvdXAxX251bWVyaWMsXG4gICAgICAgICAgICAgICAgICAgICAgICBjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDFfbW9udGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDFfZGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRva2Vuc01hbmRhdG9yeUdyb3VwMiA9IGNhY2hlLnRva2Vuc01hbmRhdG9yeUdyb3VwMl9hbGw7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJwYXNzd29yZFwiOlxuICAgICAgICAgICAgICAgICAgICB0b2tlbnNNYW5kYXRvcnlHcm91cDEgPSBjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDFfcGFzc3dvcmQ7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJ1cmxcIjpcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5zTWFuZGF0b3J5R3JvdXAxID0gY2FjaGUudG9rZW5zTWFuZGF0b3J5R3JvdXAxX3VybDtcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5zTWFuZGF0b3J5R3JvdXAyID0gY2FjaGUudG9rZW5zTWFuZGF0b3J5R3JvdXAyX3VybDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcImVtYWlsXCI6XG4gICAgICAgICAgICAgICAgICAgIHRva2Vuc01hbmRhdG9yeUdyb3VwMiA9IGNhY2hlLnRva2Vuc01hbmRhdG9yeUdyb3VwMl9lbWFpbDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcInRlbFwiOlxuICAgICAgICAgICAgICAgICAgICB0b2tlbnNNYW5kYXRvcnlHcm91cDIgPSBjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDJfdGVsO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICAgICAgICAgICAgICAgIHRva2Vuc01hbmRhdG9yeUdyb3VwMSA9IGNhY2hlLnRva2Vuc01hbmRhdG9yeUdyb3VwMV9udW1lcmljO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwibW9udGhcIjpcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5zTWFuZGF0b3J5R3JvdXAxID0gY2FjaGUudG9rZW5zTWFuZGF0b3J5R3JvdXAxX21vbnRoO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiZGF0ZVwiOlxuICAgICAgICAgICAgICAgICAgICB0b2tlbnNNYW5kYXRvcnlHcm91cDEgPSBjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDFfZGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgLy8gdW5zdXBwb3J0ZWQgdHlwZSBmb3IgdGhpcyBydWxlLlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gc2hvdWxkIG5ldmVyIGdldCBoZXJlLlxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEaXNhYmxlIGNoZWNrIGZvciBpbnB1dCB0eXBlPWhpZGRlbiBmb3Igbm93IGJhc2VkIG9uIHNjcnVtIGRpc2N1c3Npb25cbiAgICAgICAgbGV0IGF1dG9maWxsTWFudGxlID0gLyogKG5vZGVOYW1lPT09XCJpbnB1dFwiICYmIHR5cGU9PT1cImhpZGRlblwiKSA/IFwiYW5jaG9yXCIgOiAqLyBcImV4cGVjdGF0aW9uXCI7XG5cbiAgICAgICAgaWYgKGF1dG9maWxsTWFudGxlID09PSBcImV4cGVjdGF0aW9uXCIpIHtcbiAgICAgICAgICAgIC8vIGNoZWNrIG9ufG9mZiBmb3IgZXhwZWN0YXRpb24gbWFudGxlLlxuICAgICAgICAgICAgaWYgKHRva2Vucy5pbmNsdWRlcyhcIm9uXCIpIHx8IHRva2Vucy5pbmNsdWRlcyhcIm9mZlwiKSkge1xuICAgICAgICAgICAgICAgIC8vIG9ufG9mZiBzaG91bGQgYmUgdGhlIG9ubHkgdG9rZW5cbiAgICAgICAgICAgICAgICBpZiAodG9rZW5zLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfaW52YWxpZFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjaGVjayBkZXRhaWwgYXV0b2ZpbGwgdG9rZW5zXG4gICAgICAgIGxldCBjdXJySW5kZXggPSAwO1xuICAgICAgICBsZXQgY3VyclJlY29nbml6ZWRJbmRleCA9IDA7XG5cbiAgICAgICAgLy8gY2hlY2sgb3B0aW9uYWwgJ3NlY3Rpb24tKicgdG9rZW5zXG4gICAgICAgIGlmICh0b2tlbnNbY3VyckluZGV4XS5zdGFydHNXaXRoKGNhY2hlLnRva2VuT3B0aW9uYWxTZWN0aW9uKSAmJlxuICAgICAgICAgICAgdG9rZW5zW2N1cnJJbmRleF0ubGVuZ3RoID4gOCkge1xuICAgICAgICAgICAgY3VyckluZGV4Kys7IC8vIGNvbnN1bWUgdG9rZW5cbiAgICAgICAgICAgIGN1cnJSZWNvZ25pemVkSW5kZXgrKztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNoZWNrIG9wdGlvbmFsICdzaGlwcGluZ3xiaWxsaW5nJyB0b2tlbnNcbiAgICAgICAgaWYgKHRva2Vucy5sZW5ndGggPiBjdXJySW5kZXggJiZcbiAgICAgICAgICAgIGNhY2hlLnRva2Vuc09wdGlvbmFsUHVycG9zZS5pbmNsdWRlcyh0b2tlbnNbY3VyckluZGV4XSkpIHtcbiAgICAgICAgICAgIGN1cnJJbmRleCsrOyAvLyBjb25zdW1lICB0b2tlblxuICAgICAgICAgICAgY3VyclJlY29nbml6ZWRJbmRleCsrO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2hlY2sgZWl0aGVyIG1hbmRhdG9yeSBncm91cCAxIG9yIDIgdG9rZW5zXG4gICAgICAgIGlmICh0b2tlbnMubGVuZ3RoID4gY3VyckluZGV4KSB7XG4gICAgICAgICAgICAvLyBjaGVjayBtYW5kYXRvcnkgZ3JvdXAgMVxuICAgICAgICAgICAgaWYgKHRva2Vuc01hbmRhdG9yeUdyb3VwMS5pbmNsdWRlcyh0b2tlbnNbY3VyckluZGV4XSkpIHtcbiAgICAgICAgICAgICAgICBmb3VuZE1hbmRhdG9yeVRva2VuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjdXJySW5kZXgrKztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gY2hlY2sgb3B0aW9uYWwgdG9rZW5zIGZvciBncm91cCAyXG4gICAgICAgICAgICAgICAgaWYgKGNhY2hlLnRva2Vuc09wdGlvbmFsR3JvdXAyLmluY2x1ZGVzKHRva2Vuc1tjdXJySW5kZXhdKSkge1xuICAgICAgICAgICAgICAgICAgICBjdXJySW5kZXgrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gY2hlY2sgbWFuZGF0b3J5IGdyb3VwIDJcbiAgICAgICAgICAgICAgICBpZiAodG9rZW5zTWFuZGF0b3J5R3JvdXAyLmluY2x1ZGVzKHRva2Vuc1tjdXJySW5kZXhdKSkge1xuICAgICAgICAgICAgICAgICAgICBmb3VuZE1hbmRhdG9yeVRva2VuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgY3VyckluZGV4Kys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2hlY2sgZWl0aGVyIG1hbmRhdG9yeSBncm91cCAxIG9yIDIgdG9rZW5zXG4gICAgICAgIGlmICh0b2tlbnMubGVuZ3RoID4gY3VyclJlY29nbml6ZWRJbmRleCkge1xuICAgICAgICAgICAgLy8gY2hlY2sgbWFuZGF0b3J5IGdyb3VwIDFcbiAgICAgICAgICAgIGlmIChjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDFfYWxsLmluY2x1ZGVzKHRva2Vuc1tjdXJyUmVjb2duaXplZEluZGV4XSkpIHtcbiAgICAgICAgICAgICAgICBmb3VuZFJlY29nbml6ZWRUb2tlbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgY3VyclJlY29nbml6ZWRJbmRleCsrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBjaGVjayBvcHRpb25hbCB0b2tlbnMgZm9yIGdyb3VwIDJcbiAgICAgICAgICAgICAgICBpZiAoY2FjaGUudG9rZW5zT3B0aW9uYWxHcm91cDIuaW5jbHVkZXModG9rZW5zW2N1cnJSZWNvZ25pemVkSW5kZXhdKSkge1xuICAgICAgICAgICAgICAgICAgICBjdXJyUmVjb2duaXplZEluZGV4Kys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGNoZWNrIG1hbmRhdG9yeSBncm91cCAyXG4gICAgICAgICAgICAgICAgaWYgKGNhY2hlLnRva2Vuc01hbmRhdG9yeUdyb3VwMl9hbGwuaW5jbHVkZXModG9rZW5zW2N1cnJSZWNvZ25pemVkSW5kZXhdKSkge1xuICAgICAgICAgICAgICAgICAgICBmb3VuZFJlY29nbml6ZWRUb2tlbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJSZWNvZ25pemVkSW5kZXgrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmICh0b2tlbnMubGVuZ3RoID4gY3VyckluZGV4ICsgY3VyclJlY29nbml6ZWRJbmRleCkge1xuICAgICAgICAgICAgLy8gY2hlY2sgb3B0aW9uYWwgdG9rZW5zIHdlYmF1dGhuXG4gICAgICAgICAgICBpZiAodG9rZW5zT3B0aW9uYWxHcm91cC5pbmNsdWRlcyh0b2tlbnNbY3VyckluZGV4ICsgY3VyclJlY29nbml6ZWRJbmRleF0pKSB7XG4gICAgICAgICAgICAgICAgY3VyckluZGV4Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCh0b2tlbnMubGVuZ3RoID4gY3VyckluZGV4ICYmIHRva2Vuc09wdGlvbmFsR3JvdXAuaW5jbHVkZXModG9rZW5zW2N1cnJJbmRleF0pKVxuICAgICAgICAgICAgfHwgKHRva2Vucy5sZW5ndGggPiBjdXJyUmVjb2duaXplZEluZGV4ICYmIHRva2Vuc09wdGlvbmFsR3JvdXAuaW5jbHVkZXModG9rZW5zW2N1cnJSZWNvZ25pemVkSW5kZXhdKSkpIHtcbiAgICAgICAgICAgIGN1cnJJbmRleCsrO1xuICAgICAgICAgICAgY3VyclJlY29nbml6ZWRJbmRleCsrO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT25seSBwYXNzIGlmIHdlIGhhdmUgc2VlbiBlaXRoZXIgb2YgdGhlIG1hbmRhdG9yeSBncm91cHMgYW5kIGFsbCB0b2tlbnMgaGF2ZSBiZWVuIGNvbnN1bWVkXG4gICAgICAgIGlmIChmb3VuZE1hbmRhdG9yeVRva2VuICYmIHRva2Vucy5sZW5ndGggPT09IGN1cnJJbmRleCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgfSBlbHNlIGlmIChmb3VuZFJlY29nbml6ZWRUb2tlbiAmJiB0b2tlbnMubGVuZ3RoID09PSBjdXJyUmVjb2duaXplZEluZGV4KSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2luY29ycmVjdFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfaW5hcHByb3ByaWF0ZVwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgVGFibGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVGFibGVVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBpbnB1dF9jaGVja2JveGVzX2dyb3VwZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaW5wdXRfY2hlY2tib3hlc19ncm91cGVkXCIsXG4gICAgY29udGV4dDogXCJkb206aW5wdXRbdHlwZT1yYWRpb10sIGRvbTppbnB1dFt0eXBlPWNoZWNrYm94XVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0lucHV0X1JhZGlvQ2hrSW5GaWVsZFNldFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfTG9uZU5vZ3JvdXBcIjogXCJwYXNzX2xvbmVub2dyb3VwXCIsXG4gICAgICAgICAgICBcIlBhc3NfR3JvdXBlZFwiOiBcInBhc3NfZ3JvdXBlZFwiLFxuICAgICAgICAgICAgXCJQYXNzX1JhZGlvTm9OYW1lXCI6IFwicGFzc19yYWRpb05vTmFtZVwiLFxuICAgICAgICAgICAgXCJGYWlsX0NvbnRyb2xOYW1lTWlzbWF0Y2hcIjogXCJmYWlsX2NvbnRyb2xuYW1lbWlzbWF0Y2hcIixcbiAgICAgICAgICAgIFwiRmFpbF9Ob3RHcm91cGVkT3RoZXJHcm91cGVkXCI6IFwiZmFpbF9ub3Rncm91cGVkb3RoZXJncm91cGVkXCIsXG4gICAgICAgICAgICBcIkZhaWxfTm90R3JvdXBlZE90aGVyTm90R3JvdXBlZFwiOiBcImZhaWxfbm90Z3JvdXBlZG90aGVybm90Z3JvdXBlZFwiLFxuICAgICAgICAgICAgXCJGYWlsX05vdFNhbWVHcm91cFwiOiBcImZhaWxfbm90c2FtZWdyb3VwXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF9Mb25lQ2hlY2tib3hcIjogXCJwb3RlbnRpYWxfbG9uZWNoZWNrYm94XCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF9Vbm5hbWVkQ2hlY2tib3hcIjogXCJwb3RlbnRpYWxfdW5uYW1lZGNoZWNrYm94XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpbnB1dF9jaGVja2JveGVzX2dyb3VwZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJwYXNzX2xvbmVub2dyb3VwXCI6IFwiaW5wdXRfY2hlY2tib3hlc19ncm91cGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwicGFzc19ncm91cGVkXCI6IFwiaW5wdXRfY2hlY2tib3hlc19ncm91cGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwicGFzc19yYWRpb25vbmFtZVwiOiBcImlucHV0X2NoZWNrYm94ZXNfZ3JvdXBlZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfY29udHJvbG5hbWVtaXNtYXRjaFwiOiBcImlucHV0X2NoZWNrYm94ZXNfZ3JvdXBlZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfbm90Z3JvdXBlZG90aGVyZ3JvdXBlZFwiOiBcImlucHV0X2NoZWNrYm94ZXNfZ3JvdXBlZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfbm90Z3JvdXBlZG90aGVybm90Z3JvdXBlZFwiOiBcImlucHV0X2NoZWNrYm94ZXNfZ3JvdXBlZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfbm90c2FtZWdyb3VwXCI6IFwiaW5wdXRfY2hlY2tib3hlc19ncm91cGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX2xvbmVjaGVja2JveFwiOiBcImlucHV0X2NoZWNrYm94ZXNfZ3JvdXBlZC5odG1sXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF91bm5hbWVkY2hlY2tib3hcIjogXCJpbnB1dF9jaGVja2JveGVzX2dyb3VwZWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIlJlbGF0ZWQgc2V0cyBvZiByYWRpbyBidXR0b25zIG9yIGNoZWNrYm94ZXMgc2hvdWxkIGJlIHByb2dyYW1tYXRpY2FsbHkgZ3JvdXBlZFwiLFxuICAgICAgICAgICAgXCJwYXNzX2xvbmVub2dyb3VwXCI6IFwiezB9IGdyb3VwaW5nIG5vdCByZXF1aXJlZCBmb3IgYSBjb250cm9sIG9mIHRoaXMgdHlwZVwiLFxuICAgICAgICAgICAgXCJwYXNzX2dyb3VwZWRcIjogXCJ7MH0gaW5wdXQgaXMgZ3JvdXBlZCB3aXRoIG90aGVyIHJlbGF0ZWQgY29udHJvbHMgd2l0aCB0aGUgc2FtZSBuYW1lXCIsXG4gICAgICAgICAgICBcInBhc3NfcmFkaW9ub25hbWVcIjogXCJSYWRpbyBpbnB1dCBpcyBub3QgZ3JvdXBlZCwgYnV0IHBhc3NlcyBiZWNhdXNlIGl0IGhhcyBubyBuYW1lIHRvIGdyb3VwIHdpdGggb3RoZXIgcmFkaW8gaW5wdXRzXCIsXG4gICAgICAgICAgICBcImZhaWxfY29udHJvbG5hbWVtaXNtYXRjaFwiOiBcInswfSBpbnB1dCBmb3VuZCB0aGF0IGhhcyB0aGUgc2FtZSBuYW1lLCBcXFwiezJ9XFxcIiBhcyBhIHsxfSBpbnB1dFwiLFxuICAgICAgICAgICAgXCJmYWlsX25vdGdyb3VwZWRvdGhlcmdyb3VwZWRcIjogXCJ7MH0gaW5wdXQgaXMgbm90IGluIHRoZSBncm91cCB3aXRoIGFub3RoZXIgezB9IHdpdGggdGhlIG5hbWUgXFxcInsxfVxcXCJcIixcbiAgICAgICAgICAgIFwiZmFpbF9ub3Rncm91cGVkb3RoZXJub3Rncm91cGVkXCI6IFwiezB9IGlucHV0IGFuZCBvdGhlcnMgd2l0aCB0aGUgbmFtZSBcXFwiezF9XFxcIiBhcmUgbm90IGdyb3VwZWQgdG9nZXRoZXJcIixcbiAgICAgICAgICAgIFwiZmFpbF9ub3RzYW1lZ3JvdXBcIjogXCJ7MH0gaW5wdXQgaXMgaW4gYSBkaWZmZXJlbnQgZ3JvdXAgdGhhbiBhbm90aGVyIHswfSB3aXRoIHRoZSBuYW1lIFxcXCJ7MX1cXFwiXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9sb25lY2hlY2tib3hcIjogXCJWZXJpZnkgdGhhdCB0aGlzIHVuZ3JvdXBlZCBjaGVja2JveCBpbnB1dCBpcyBub3QgcmVsYXRlZCB0byBvdGhlciBjaGVja2JveGVzXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF91bm5hbWVkY2hlY2tib3hcIjogXCJWZXJpZnkgdGhhdCB0aGlzIHVuLW5hbWVkLCB1bmdyb3VwZWQgY2hlY2tib3ggaW5wdXQgaXMgbm90IHJlbGF0ZWQgdG8gb3RoZXIgY2hlY2tib3hlc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBnZXRHcm91cCA9IChlOiBFbGVtZW50KSA9PiB7XG4gICAgICAgICAgICBsZXQgcmV0VmFsID0gQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihlLCBcImZpZWxkc2V0XCIpXG4gICAgICAgICAgICAgICAgfHwgQXJpYVV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShlLCBcInJhZGlvZ3JvdXBcIilcbiAgICAgICAgICAgICAgICB8fCBBcmlhVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKGUsIFwiZ3JvdXBcIilcbiAgICAgICAgICAgICAgICB8fCBBcmlhVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKGUsIFwiZ3JpZFwiKVxuICAgICAgICAgICAgICAgIHx8IEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUoZSwgXCJ0YWJsZVwiKTtcbiAgICAgICAgICAgIGlmICghcmV0VmFsKSB7XG4gICAgICAgICAgICAgICAgcmV0VmFsID0gQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihlLCBcInRhYmxlXCIpO1xuICAgICAgICAgICAgICAgIGlmIChyZXRWYWwgJiYgIVRhYmxlVXRpbC5pc0RhdGFUYWJsZShyZXRWYWwpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE9ubHkgcmFkaW8gYnV0dG9ucyBhbmQgY2hlY2tib3hlcyBhcmUgaW4gc2NvcGVcbiAgICAgICAgbGV0IGN0eFR5cGUgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIFxuICAgICAgICAvLyBEZXRlcm1pbmUgd2hpY2ggZm9ybSB3ZSdyZSBpbiAoaWYgYW55KSB0byBkZXRlcm1pbmUgb3VyIHNjb3BlXG4gICAgICAgIGxldCBjdHhGb3JtID0gQXJpYVV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShydWxlQ29udGV4dCwgXCJmb3JtXCIpXG4gICAgICAgICAgICB8fCBDb21tb25VdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBcImh0bWxcIilcbiAgICAgICAgICAgIHx8IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuXG4gICAgICAgIC8vIEdldCBkYXRhIGFib3V0IGFsbCBvZiB0aGUgdmlzaWJsZSBjaGVja2JveGVzIGFuZCByYWRpb3MgaW4gdGhlIHNjb3BlIG9mIHRoaXMgZm9ybVxuICAgICAgICAvLyBhbmQgY2FjaGUgaXQgZm9yIGFsbCBvZiB0aGUgb3RoZXIgaW5wdXRzIGluIHRoaXMgc2NvcGVcbiAgICAgICAgbGV0IGZvcm1DYWNoZSA9IENhY2hlVXRpbC5nZXRDYWNoZShjdHhGb3JtLCBcImlucHV0X2NoZWNrYm94ZXNfZ3JvdXBlZFwiLCBudWxsKTtcbiAgICAgICAgaWYgKCFmb3JtQ2FjaGUpIHtcbiAgICAgICAgICAgIGZvcm1DYWNoZSA9IHtcbiAgICAgICAgICAgICAgICBjaGVja2JveEJ5TmFtZToge30sXG4gICAgICAgICAgICAgICAgcmFkaW9zQnlOYW1lOiB7fSxcbiAgICAgICAgICAgICAgICBuYW1lVG9Hcm91cDoge1xuXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBudW1DaGVja2JveGVzOiAwLFxuICAgICAgICAgICAgICAgIG51bVJhZGlvczogMFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gR2V0IGFsbCBvZiB0aGUgY2hlY2tib3hlcyBpbiB0aGUgZm9ybSBvciBib2R5IChidXQgbm90IG5lc3RlZCBpbiBzb21ldGhpbmcgZWxzZSBhbmQgbm90IGhpZGRlbilcbiAgICAgICAgICAgIC8vIEFuZCBnZXQgYSBtYXBwaW5nIG9mIHRoZXNlIGNoZWNrYm94ZXMgdG9cbiAgICAgICAgICAgIGxldCBjV2Fsa2VyID0gbmV3IERPTVdhbGtlcihjdHhGb3JtLCBmYWxzZSwgY3R4Rm9ybSwgdHJ1ZSk7XG4gICAgICAgICAgICBsZXQgY2hlY2tib3hRID0gW107XG4gICAgICAgICAgICBsZXQgcmFkaW9zUSA9IFtdO1xuICAgICAgICAgICAgd2hpbGUgKGNXYWxrZXIubmV4dE5vZGUoKSkge1xuICAgICAgICAgICAgICAgIGlmICghY1dhbGtlci5iRW5kVGFnXG4gICAgICAgICAgICAgICAgICAgICYmIGNXYWxrZXIubm9kZS5ub2RlVHlwZSA9PT0gMVxuICAgICAgICAgICAgICAgICAgICAmJiBjV2Fsa2VyLm5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgICYmIFZpc1V0aWwuaXNOb2RlVmlzaWJsZShjV2Fsa2VyLm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0eXBlID0gKGNXYWxrZXIubm9kZSBhcyBFbGVtZW50KS5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gXCJjaGVja2JveFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGVja2JveFEucHVzaChjV2Fsa2VyLm5vZGUpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFwicmFkaW9cIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmFkaW9zUS5wdXNoKGNXYWxrZXIubm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBsZXQgY2hlY2tib3hRID0gY3R4Rm9ybS5xdWVyeVNlbGVjdG9yQWxsKFwiaW5wdXRbdHlwZT1jaGVja2JveF1cIik7XG4gICAgICAgICAgICBmb3IgKGxldCBpZHggPSAwOyBpZHggPCBjaGVja2JveFEubGVuZ3RoOyArK2lkeCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNiID0gY2hlY2tib3hRW2lkeF07XG4gICAgICAgICAgICAgICAgaWYgKChBcmlhVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKGNiLCBcImZvcm1cIilcbiAgICAgICAgICAgICAgICAgICAgfHwgQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgXCJodG1sXCIpXG4gICAgICAgICAgICAgICAgICAgIHx8IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSA9PT0gY3R4Rm9ybVxuICAgICAgICAgICAgICAgICAgICAmJiAhQ29tbW9uVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKGNiKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gY2IuZ2V0QXR0cmlidXRlKFwibmFtZVwiKSB8fCBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAoZm9ybUNhY2hlLmNoZWNrYm94QnlOYW1lW25hbWVdID0gZm9ybUNhY2hlLmNoZWNrYm94QnlOYW1lW25hbWVdIHx8IFtdKS5wdXNoKGNiKTtcbiAgICAgICAgICAgICAgICAgICAgZm9ybUNhY2hlLm5hbWVUb0dyb3VwW25hbWVdID0gZm9ybUNhY2hlLm5hbWVUb0dyb3VwW25hbWVdIHx8IGdldEdyb3VwKGNiKTtcbiAgICAgICAgICAgICAgICAgICAgKytmb3JtQ2FjaGUubnVtQ2hlY2tib3hlcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBHZXQgYWxsIG9mIHRoZSByYWRpb3MgaW4gdGhlIGZvcm0gb3IgYm9keSAoYnV0IG5vdCBuZXN0ZWQgaW4gc29tZXRoaW5nIGVsc2UgYW5kIG5vdCBoaWRkZW4pXG4gICAgICAgICAgICAvLyBsZXQgcmFkaW9zUSA9IGN0eEZvcm0ucXVlcnlTZWxlY3RvckFsbChcImlucHV0W3R5cGU9cmFkaW9dXCIpO1xuICAgICAgICAgICAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgcmFkaW9zUS5sZW5ndGg7ICsraWR4KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgciA9IHJhZGlvc1FbaWR4XTtcbiAgICAgICAgICAgICAgICBjb25zdCByYWRDdHggPSAoQXJpYVV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShyLCBcImZvcm1cIilcbiAgICAgICAgICAgICAgICAgICAgfHwgQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgXCJodG1sXCIpXG4gICAgICAgICAgICAgICAgICAgIHx8IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KTtcbiAgICAgICAgICAgICAgICBpZiAocmFkQ3R4ID09PSBjdHhGb3JtXG4gICAgICAgICAgICAgICAgICAgICYmICFDb21tb25VdGlsLnNob3VsZE5vZGVCZVNraXBwZWRIaWRkZW4ocikpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IHIuZ2V0QXR0cmlidXRlKFwibmFtZVwiKSB8fCBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAoZm9ybUNhY2hlLnJhZGlvc0J5TmFtZVtuYW1lXSA9IGZvcm1DYWNoZS5yYWRpb3NCeU5hbWVbbmFtZV0gfHwgW10pLnB1c2gocik7XG4gICAgICAgICAgICAgICAgICAgIGZvcm1DYWNoZS5uYW1lVG9Hcm91cFtuYW1lXSA9IGZvcm1DYWNoZS5uYW1lVG9Hcm91cFtuYW1lXSB8fCBnZXRHcm91cChyKTtcbiAgICAgICAgICAgICAgICAgICAgKytmb3JtQ2FjaGUubnVtUmFkaW9zO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShjdHhGb3JtLCBcImlucHV0X2NoZWNrYm94ZXNfZ3JvdXBlZFwiLCBmb3JtQ2FjaGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8vLy8vLy8vLy8vLyBDYWxjdWxhdGVkIGV2ZXJ5dGhpbmcsIG5vdyBjaGVjayB0aGUgdmFyaW91cyBjYXNlc1xuXG4gICAgICAgIGNvbnN0IGN0eE5hbWUgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJuYW1lXCIpO1xuICAgICAgICBjb25zdCBjdHhHcm91cCA9IGdldEdyb3VwKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgY3R4VHlwZSA9IGN0eFR5cGUgPT09IFwicmFkaW9cIiA/IFwiUmFkaW9cIiA6IFwiQ2hlY2tib3hcIjtcblxuICAgICAgICBpZiAoIWN0eE5hbWUgfHwgY3R4TmFtZSA9PT0gXCJcIikge1xuICAgICAgICAgICAgLy8gRmlyc3QgcHJvY2VzcyBjYXNlcyB3aGVyZSB0aGUgY29udHJvbCBpcyBub3QgbmFtZWRcbiAgICAgICAgICAgIGlmIChjdHhUeXBlID09PSBcIlJhZGlvXCIpIHtcbiAgICAgICAgICAgICAgICAvLyBSYWRpb3Mgd2l0aG91dCBuYW1lcyBkb24ndCBhY3QgbGlrZSBncm91cHMsIHNvIGRvbid0IGVuZm9yY2UgZ3JvdXBpbmdcbiAgICAgICAgICAgICAgICBpZiAoY3R4R3JvdXAgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc19yYWRpb25vbmFtZVwiLCBbY3R4VHlwZV0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NfZ3JvdXBlZFwiLCBbY3R4VHlwZV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gTXVzdCBiZSBhbiB1bm5hbWVkIGNoZWNrYm94XG4gICAgICAgICAgICAgICAgaWYgKGN0eEdyb3VwID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgoZm9ybUNhY2hlLmNoZWNrYm94QnlOYW1lW1wiXCJdIHx8IFtdKS5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF91bm5hbWVkY2hlY2tib3hcIiwgW2N0eFR5cGVdKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NfbG9uZW5vZ3JvdXBcIiwgW2N0eFR5cGVdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NfZ3JvdXBlZFwiLCBbY3R4VHlwZV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIENvbnNpZGVyaW5nIGEgbmFtZWQgY2hlY2tib3hcbiAgICAgICAgICAgIGNvbnN0IG51bVJhZGlvc1dpdGhOYW1lID0gKGZvcm1DYWNoZS5yYWRpb3NCeU5hbWVbY3R4TmFtZV0gfHwgW10pLmxlbmd0aDtcbiAgICAgICAgICAgIGNvbnN0IG51bUNoZWNrYm94ZXNXaXRoTmFtZSA9IChmb3JtQ2FjaGUuY2hlY2tib3hCeU5hbWVbY3R4TmFtZV0gfHwgW10pLmxlbmd0aDtcbiAgICAgICAgICAgIC8vIENhcGl0YWxpemUgdGhlIGlucHV0IHR5cGUgZm9yIG1lc3NhZ2VzXG4gICAgICAgICAgICBpZiAobnVtUmFkaW9zV2l0aE5hbWUgPiAwICYmIG51bUNoZWNrYm94ZXNXaXRoTmFtZSA+IDApIHtcbiAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIGEgbmFtaW5nIG1pc21hdGNoIGJldHdlZW4gZGlmZmVyZW50IGNvbnRyb2xzXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9jb250cm9sbmFtZW1pc21hdGNoXCIsIFtjdHhUeXBlLCBjdHhUeXBlID09PSBcImNoZWNrYm94XCIgPyBcInJhZGlvXCIgOiBcImNoZWNrYm94XCIsIGN0eE5hbWVdKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY3R4VHlwZSA9PT0gXCJSYWRpb1wiICYmIChmb3JtQ2FjaGUubnVtUmFkaW9zID09PSAxIHx8IG51bVJhZGlvc1dpdGhOYW1lID09PSAxKVxuICAgICAgICAgICAgICAgIHx8IGN0eFR5cGUgPT09IFwiQ2hlY2tib3hcIiAmJiBmb3JtQ2FjaGUubnVtQ2hlY2tib3hlcyA9PT0gMSkge1xuICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBsb25lIGNvbnRyb2wgKGVpdGhlciBvbmx5IGNvbnRyb2wgb2YgdGhpcyB0eXBlIG9uIHRoZSBwYWdlLCBvciBhIHJhZGlvIGJ1dHRvbiB3aXRob3V0IGFueSBvdGhlcnMgYnkgdGhhdCBuYW1lKVxuICAgICAgICAgICAgICAgIC8vIFdlIHBhc3MgdGhpcyBjb250cm9sIGluIGFsbCBjYXNlc1xuICAgICAgICAgICAgICAgIGlmIChjdHhHcm91cCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzX2xvbmVub2dyb3VwXCIsIFtjdHhUeXBlXSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc19ncm91cGVkXCIsIFtjdHhUeXBlXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChjdHhUeXBlID09PSBcIkNoZWNrYm94XCIgJiYgZm9ybUNhY2hlLm51bUNoZWNrYm94ZXMgPiAxICYmIG51bUNoZWNrYm94ZXNXaXRoTmFtZSA9PT0gMSkge1xuICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgb25seSBvbmUgY2hlY2tib3ggd2l0aCB0aGlzIG5hbWUsIGJ1dCB0aGVyZSBhcmUgb3RoZXIgY2hlY2tib3hlcyBpbiB0aGUgZm9ybS5cbiAgICAgICAgICAgICAgICAvLyBJZiB3ZSdyZSBub3QgZ3JvdXBlZCwgYXNrIHRoZW0gdG8gZXhhbWluZSBpdFxuICAgICAgICAgICAgICAgIGlmIChjdHhHcm91cCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF9sb25lY2hlY2tib3hcIiwgW2N0eFR5cGVdKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzX2dyb3VwZWRcIiwgW2N0eFR5cGVdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFdlIHNoYXJlIGEgbmFtZSB3aXRoIGFub3RoZXIgc2ltaWxhciBjb250cm9sLiBBcmUgd2UgZ3JvdXBlZCB0b2dldGhlcj9cbiAgICAgICAgICAgICAgICBpZiAoY3R4R3JvdXAgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZvcm1DYWNoZS5uYW1lVG9Hcm91cFtjdHhOYW1lXSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UncmUgbm90IGdyb3VwZWQsIGJ1dCBzb21lIGNvbnRyb2wgd2l0aCB0aGUgc2FtZSBuYW1lIGlzIGluIGEgZ3JvdXBcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfbm90Z3JvdXBlZG90aGVyZ3JvdXBlZFwiLCBbY3R4VHlwZSwgY3R4TmFtZV0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm9uZSBvZiB1cyBhcmUgZ3JvdXBlZFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9ub3Rncm91cGVkb3RoZXJub3Rncm91cGVkXCIsIFtjdHhUeXBlLCBjdHhOYW1lXSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZm9ybUNhY2hlLm5hbWVUb0dyb3VwW2N0eE5hbWVdICE9PSBjdHhHcm91cCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBXZSdyZSBub3QgaW4gdGhlIG1haW4gZ3JvdXAgd2l0aCB0aGUgb3RoZXJzXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfbm90c2FtZWdyb3VwXCIsIFtjdHhUeXBlLCBjdHhOYW1lXSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gV2UncmUgYWxsIGdyb3VwZWQgdXAhXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NfZ3JvdXBlZFwiLCBbY3R4VHlwZV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGlucHV0X2ZpZWxkc19ncm91cGVkOiBSdWxlID0ge1xuICAgIGlkOiBcImlucHV0X2ZpZWxkc19ncm91cGVkXCIsXG4gICAgY29udGV4dDogXCJkb206aW5wdXQsIGRvbTp0ZXh0YXJlYSwgZG9tOnNlbGVjdFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0lucHV0X0luRmllbGRTZXRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiaW5wdXRfZmllbGRzX2dyb3VwZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcImlucHV0X2ZpZWxkc19ncm91cGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpbnB1dF9maWVsZHNfZ3JvdXBlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVXNlIHRoZSA8ZmllbGRzZXQ+IGVsZW1lbnQgdG8gZ3JvdXAgbG9naWNhbGx5IHJlbGF0ZWQgaW5wdXQgZWxlbWVudHNcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJHcm91cHMgb2YgbG9naWNhbGx5IHJlbGF0ZWQgaW5wdXQgZWxlbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCB3aXRoaW4gYSA8ZmllbGRzZXQ+IGVsZW1lbnRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy8gRG9uJ3QgdHJpZ2dlciBmb3Igb3RoZXIgaW5wdXQgdHlwZXMgb3IgaWYgd2UncmUgaW4gYSBmaWVsZHNldFxuICAgICAgICBpZiAocnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSBcImlucHV0XCIgJiYgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidHlwZVwiKSkge1xuICAgICAgICAgICAgbGV0IHR5cGUgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBpZiAodHlwZSAhPSBcInRleHRcIiAmJiB0eXBlICE9IFwiZmlsZVwiICYmIHR5cGUgIT0gXCJwYXNzd29yZFwiKVxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgXCJmaWVsZHNldFwiKSAhPSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuXG4gICAgICAgIC8vIE5vIGZpZWxkc2V0IC0gc2VlIGlmIHRoaXMgaW5wdXQgaXMgYWxsIGJ5IGl0c2VsZiAtIG5vIG5lZWQgdG8gZ3JvdXAgc2luZ2xlIGlucHV0c1xuICAgICAgICBsZXQgcGFyZW50ID0gQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgW1wiZm9ybVwiLCBcImJvZHlcIl0pO1xuICAgICAgICBsZXQgY2hlY2tUeXBlcyA9IFtcImlucHV0XCIsIFwidGV4dGFyZWFcIiwgXCJzZWxlY3RcIl07XG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBwYXNzZWQgJiYgaSA8IGNoZWNrVHlwZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGxldCBjb250cm9scyA9IHBhcmVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShjaGVja1R5cGVzW2ldKTtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBwYXNzZWQgJiYgaiA8IGNvbnRyb2xzLmxlbmd0aDsgKytqKSB7XG5cbiAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgbm9kZSBzaG91bGQgYmUgc2tpcHBlZCBvciBub3QgYmFzZWQgb24gdGhlIENoZWNrIEhpZGRlbiBDb250ZW50IHNldHRpbmcgYW5kIGlmIHRoZSBub2RlIGlzVmlzaWJsZSBvclxuICAgICAgICAgICAgICAgIC8vIG5vdC5cbiAgICAgICAgICAgICAgICBpZiAoQ29tbW9uVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKGNvbnRyb2xzW2pdKSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGV4dGFyZWFzIGFuZCBzZWxlY3RzIHdpbGwgYmUgY2FsbGVkIHR5cGU9J3RleHQnXG4gICAgICAgICAgICAgICAgbGV0IHR5cGUgPSBjb250cm9sc1tqXS5oYXNBdHRyaWJ1dGUoXCJ0eXBlXCIpID8gY29udHJvbHNbal0uZ2V0QXR0cmlidXRlKFwidHlwZVwiKS50b0xvd2VyQ2FzZSgpIDogXCJ0ZXh0XCI7XG4gICAgICAgICAgICAgICAgLy8gT25seSBmYWlsIGlmIHRoaXMgaXMgYW5vdGhlciBjb250cm9sIGluIHRoZSBmb3JtIGFuZCBpdHMgdHlwZSBpcyBhbm90aGVyIHRleHQtbGlrZSBpbnB1dFxuICAgICAgICAgICAgICAgIHBhc3NlZCA9IGNvbnRyb2xzW2pdID09IHJ1bGVDb250ZXh0IHx8ICh0eXBlICE9IFwidGV4dFwiICYmIHR5cGUgIT0gXCJwYXNzd29yZFwiICYmIHR5cGUgIT0gXCJmaWxlXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgaW5wdXRfaGFzcG9wdXBfY29uZmxpY3Q6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaW5wdXRfaGFzcG9wdXBfY29uZmxpY3RcIixcbiAgICBjb250ZXh0OiBcImRvbTppbnB1dFtsaXN0XVthcmlhLWhhc3BvcHVwXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiaW5wdXRfaGFzcG9wdXBfaW52YWxpZFwiOiB7XG4gICAgICAgICAgICAvLyBcIlBhc3NcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwicG90ZW50aWFsX3R5cGVfbWlzdXNlXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8yXCI6IFwicG90ZW50aWFsX21pc3VzZVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpbnB1dF9oYXNwb3B1cF9jb25mbGljdC5odG1sXCIsXG4gICAgICAgICAgICAvLyBcInBhc3NcIjogXCJpbnB1dF9oYXNwb3B1cF9jb25mbGljdC5odG1sXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF90eXBlX21pc3VzZVwiOiBcImlucHV0X2hhc3BvcHVwX2NvbmZsaWN0Lmh0bWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX21pc3VzZVwiOiBcImlucHV0X2hhc3BvcHVwX2NvbmZsaWN0Lmh0bWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX2xpc3Rfbm90ZXhpc3RcIjogXCJpbnB1dF9oYXNwb3B1cF9jb25mbGljdC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfaW52YWxpZF9saXN0X3R5cGVcIjogXCJpbnB1dF9oYXNwb3B1cF9jb25mbGljdC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfaW52YWxpZF9saXN0X2VsZW1cIjogXCJpbnB1dF9oYXNwb3B1cF9jb25mbGljdC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiPGlucHV0PiBlbGVtZW50IHdpdGggYSAnbGlzdCcgYXR0cmlidXRlIHNob3VsZCBub3QgdXNlIGFuIGV4cGxpY2l0ICdhcmlhLWhhc3BvcHVwJyBhdHRyaWJ1dGVcIixcbiAgICAgICAgICAgIC8vIFwicGFzc1wiOiBcIlRoZSA8aW5wdXQ+IGVsZW1lbnQgd2l0aCBhICdsaXN0JyBhdHRyaWJ1dGUgZG9lcyBub3QgdXNlIGFuIGV4cGxpY2l0ICdhcmlhLWhhc3BvcHVwJyBhdHRyaWJ1dGVcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX3R5cGVfbWlzdXNlXCI6IFwiVGhlIDxpbnB1dD4gZWxlbWVudCB3aXRoIHR5cGUgXFxcInswfVxcXCIgYW5kICdsaXN0JyBhdHRyaWJ1dGUgdXNlcyBhbiBleHBsaWNpdCAnYXJpYS1oYXNwb3B1cCcgYXR0cmlidXRlXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9taXN1c2VcIjogXCJUaGUgPGlucHV0PiBlbGVtZW50IHdpdGggYSBtaXNzaW5nIG9yIGludmFsaWQgdHlwZSBhbmQgJ2xpc3QnIGF0dHJpYnV0ZSB1c2VzIGFuIGV4cGxpY2l0ICdhcmlhLWhhc3BvcHVwJyBhdHRyaWJ1dGVcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX2xpc3Rfbm90ZXhpc3RcIjogXCJUaGUgbGlzdCBhdHRyaWJ1dGUgZm9yIHRoZSA8aW5wdXQ+IGVsZW1lbnQgaXMgaW52YWxpZFwiLFxuICAgICAgICAgICAgXCJmYWlsX2ludmFsaWRfbGlzdF90eXBlXCI6IFwiVGhlIGxpc3QgYXR0cmlidXRlIGZvciB0aGUgPGlucHV0PiBlbGVtZW50IHdpdGggdGhlIHR5cGUgXFxcInswfVxcXCIgaXMgaW52YWxpZFwiLFxuICAgICAgICAgICAgXCJmYWlsX2ludmFsaWRfbGlzdF9lbGVtXCI6IFwiVGhlIGxpc3QgYXR0cmlidXRlIGZvciB0aGUgPGlucHV0PiBlbGVtZW50IGRvZXMgbm90IHJlZmVyZW5jZSBhIGRhdGFsaXN0IGVsZW1lbnRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG5cbiAgICAgICAgLy9za2lwIGlmIHRoZSBmaWVsZHNldCBpcyBoaWRkZW4gb3IgZGlzYWJsZWRcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSB8fCBDb21tb25VdGlsLmlzTm9kZURpc2FibGVkKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCByb2xlcyA9IEFyaWFVdGlsLmdldFVzZXJEZWZpbmVkUm9sZXMocnVsZUNvbnRleHQpO1xuICAgICAgICAvLyBsZXQgXCJhcmlhX3JvbGVfdmFsaWRcIiB0byBoYW5kbGUgaW52YWxpZCByb2xlLiBPbmx5IGFsbG93ZWQgcm9sZSBpcyBjb21ib2JveCB3aGljaCBpcyBpbXBsaWNpdC4gXG4gICAgICAgIGlmIChyb2xlcyAmJiByb2xlcy5sZW5ndGggPiAwICYmICFyb2xlcy5pbmNsdWRlcygnY29tYm9ib3gnKSkgXG4gICAgICAgICAgICByZXR1cm4gbnVsbDsgICAgICAgICBcblxuICAgICAgICAvL3RyaWdnZXJpbmcgaW5wdXQgdHlwZXM6IHRleHQsIHNlYXJjaCwgdGVsLCB1cmwsIGVtYWlsLCBvciBtaXNzaW5nIG9yIGludmFsaWQgXG4gICAgICAgIGxldCB5ZXNUeXBlcyA9IFtcInRleHRcIiwgXCJzZWFyY2hcIiwgXCJ0ZWxcIiwgXCJ1cmxcIiwgXCJlbWFpbFwiLCBcImRhdGVcIiwgXCJtb250aFwiLCBcIndlZWtcIiwgXCJ0aW1lXCIsIFwiZGF0ZXRpbWUtbG9jYWxcIiwgXCJudW1iZXJcIiwgXCJyYW5nZVwiLCBcImNvbG9yXCJdO1xuICAgICAgICBsZXQgbm9UeXBlcyA9IFtcImZpbGVcIiwgXCJwYXNzd29yZFwiLCBcImNoZWNrYm94XCIsIFwicmFkaW9cIiwgXCJzdWJtaXRcIiwgXCJyZXNldFwiLCBcImltYWdlXCIsIFwiaGlkZGVuXCIsIFwiYnV0dG9uXCJdO1xuXG4gICAgICAgIGxldCBhdHRyVmFsdWUgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpO1xuICAgICAgICAvL21pc3NpbmcgaW5wdXQgdHlwZSBmb3IgbGlzdCBidXQgd2l0aCBhcmlhX2hhc19wb3B1cFxuICAgICAgICBpZiAoIWF0dHJWYWx1ZSB8fCBhdHRyVmFsdWUudHJpbSgpLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX21pc3VzZVwiKTtcblxuICAgICAgICBhdHRyVmFsdWUgPSBhdHRyVmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIC8vaW52YWxpZCBpbnB1dCB0eXBlcyBmb3IgbGlzdCBidXQgd2l0aCBhcmlhX2hhc19wb3B1cFxuICAgICAgICBpZiAoIXllc1R5cGVzLmluY2x1ZGVzKGF0dHJWYWx1ZSkgJiYgIW5vVHlwZXMuaW5jbHVkZXMoYXR0clZhbHVlKSlcbiAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX21pc3VzZVwiKTtcblxuICAgICAgICAvLyB0aGUgbGlzdCBhdHRyaWJ1dGUgaXMgdXNlZCBmb3Igd3JvbmcgaW5wdXQgdHlwZVxuICAgICAgICBpZiAoYXR0clZhbHVlICYmIG5vVHlwZXMuaW5jbHVkZXMoYXR0clZhbHVlKSlcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfaW52YWxpZF9saXN0X3R5cGVcIik7XG5cbiAgICAgICAgbGV0IGxpc3QgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJsaXN0XCIpO1xuICAgICAgICAvLyB0aGUgbGlzdCBhdHRyaWJ1dGUgaXMgYmxhbmtcbiAgICAgICAgaWYgKCFsaXN0IHx8IGxpc3QudHJpbSgpLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX2xpc3Rfbm90ZXhpc3RcIik7XG5cbiAgICAgICAgbGV0IGxpc3RFbGVtID0gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5nZXRFbGVtZW50QnlJZChsaXN0KTtcbiAgICAgICAgLy8gdGhlIGxpc3QgZWxlbWVudCBkb2Vzbid0IGV4aXN0XG4gICAgICAgIGlmICghbGlzdEVsZW0pXG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJwb3RlbnRpYWxfbGlzdF9ub3RleGlzdFwiKTtcblxuICAgICAgICAvLyB0aGUgbGlzdCBlbGVtZW50IGlzIG5vdCBhIGRhdGFsaXN0IGVsZW1lbnRcbiAgICAgICAgaWYgKGxpc3RFbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgIT09ICdkYXRhbGlzdCcpXG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2ludmFsaWRfbGlzdF9lbGVtXCIpO1xuXG4gICAgICAgIC8vIHZhbGlkIGlucHV0IHR5cGVzIGZvciBsaXN0IGJ1dCB3aXRoIGFyaWFfaGFzX3BvcHVwICAgIFxuICAgICAgICBpZiAoeWVzVHlwZXMuaW5jbHVkZXMoYXR0clZhbHVlKSlcbiAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX3R5cGVfbWlzdXNlXCIsIFthdHRyVmFsdWVdKTtcbiAgICAgICAgXG4gICAgICAgIC8vIHNob3VsZG4ndCBnZXQgaGVyZSBcbiAgICAgICAgICAgIHJldHVybjtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGlucHV0X2xhYmVsX2FmdGVyOiBSdWxlID0ge1xuICAgIGlkOiBcImlucHV0X2xhYmVsX2FmdGVyXCIsXG4gICAgY29udGV4dDogXCJkb206aW5wdXRcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9JbnB1dF9MYWJlbEFmdGVyXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJGYWlsXzJcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImlucHV0X2xhYmVsX2FmdGVyLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiaW5wdXRfbGFiZWxfYWZ0ZXIuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJpbnB1dF9sYWJlbF9hZnRlci5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiaW5wdXRfbGFiZWxfYWZ0ZXIuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJDaGVja2JveCBvciByYWRpbyBidXR0b24gaXMgbmVzdGVkIGluIGxhYmVsLCBzbyBsYWJlbCBpcyBub3QgYWZ0ZXIgdGhlIGlucHV0IGNvbnRyb2xcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiTGFiZWwgdGV4dCBpcyBsb2NhdGVkIGJlZm9yZSBpdHMgYXNzb2NpYXRlZCBjaGVja2JveCBvciByYWRpbyBidXR0b24gZWxlbWVudFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkNoZWNrYm94ZXMgYW5kIHJhZGlvIGJ1dHRvbnMgbXVzdCBoYXZlIGEgbGFiZWwgYWZ0ZXIgdGhlIGlucHV0IGNvbnRyb2xcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjMuMy4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCB0eXBlID0gXCJcIjtcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInR5cGVcIikpXG4gICAgICAgICAgICB0eXBlID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidHlwZVwiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAodHlwZSAhPSBcImNoZWNrYm94XCIgJiYgdHlwZSAhPSBcInJhZGlvXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IG9ubHkgdGhlIG5vbi1oaWRkZW4gbGFiZWxzIGZvciBlbGVtZW50XG4gICAgICAgIGxldCBsYWJlbEVsZW0gPSBDb21tb25VdGlsLmdldExhYmVsRm9yRWxlbWVudEhpZGRlbihydWxlQ29udGV4dCwgdHJ1ZSk7XG4gICAgICAgIGlmIChsYWJlbEVsZW0gPT09IG51bGwgfHwgIUNvbW1vblV0aWwuaGFzSW5uZXJDb250ZW50SGlkZGVuKGxhYmVsRWxlbSkpIHtcbiAgICAgICAgICAgIC8vIER1ZSB0byBkZXBlbmRlbmN5LCBsYWJlbCBtdXN0IGJlIGRvbmUgdmlhIHRpdGxlIC0gdGhpcyBydWxlIGRvZXNuJ3QgYXBwbHlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGxldCB2YWx1ZSA9IENvbW1vblV0aWwuY29tcGFyZU5vZGVPcmRlcihsYWJlbEVsZW0sIHJ1bGVDb250ZXh0KTtcbiAgICAgICAgbGV0IHBhc3NlZDtcbiAgICAgICAgaWYgKHZhbHVlID09PSAtMikge1xuICAgICAgICAgICAgLy8gaW5wdXQgbmVzdGVkIGluIGxhYmVsXG4gICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCB3YWxrTm9kZSA9IG5ldyBET01XYWxrZXIobGFiZWxFbGVtKTtcbiAgICAgICAgICAgIHdhbGtOb2RlLm5vZGUgPSBydWxlQ29udGV4dDtcbiAgICAgICAgICAgIHdoaWxlICghcGFzc2VkICYmIHdhbGtOb2RlLm5leHROb2RlKCkpIHtcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSAoKHdhbGtOb2RlLm5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCIjdGV4dFwiICYmIHdhbGtOb2RlLm5vZGUubm9kZVZhbHVlLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICB8fCAod2Fsa05vZGUubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInNwYW5cIiAmJiB3YWxrTm9kZS5ub2RlLnRleHRDb250ZW50LnRyaW0oKS5sZW5ndGggPiAwKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgIC8vIElucHV0IG5lc3RlZCBpbiBsYWJlbCBhbmQgdGV4dCBiZWZvcmUgaW5wdXRcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodmFsdWUgIT0gMSkge1xuICAgICAgICAgICAgICAgIC8vIGxhYmVsIGlzIGJlZm9yZSBpbnB1dFxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGlucHV0X2xhYmVsX2JlZm9yZTogUnVsZSA9IHtcbiAgICBpZDogXCJpbnB1dF9sYWJlbF9iZWZvcmVcIixcbiAgICBjb250ZXh0OiBcImRvbTppbnB1dCwgZG9tOnRleHRhcmVhLCBkb206c2VsZWN0XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfSW5wdXRfTGFiZWxCZWZvcmVcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkZhaWxfMlwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiaW5wdXRfbGFiZWxfYmVmb3JlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiaW5wdXRfbGFiZWxfYmVmb3JlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiaW5wdXRfbGFiZWxfYmVmb3JlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpbnB1dF9sYWJlbF9iZWZvcmUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUZXh0IGlucHV0IGlzIG5lc3RlZCBpbiBsYWJlbCBzdWNoIHRoYXQgaW5wdXQgcHJlY2VkZXMgdGhlIGxhYmVsIHRleHRcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiTGFiZWwgdGV4dCBpcyBsb2NhdGVkIGFmdGVyIGl0cyBhc3NvY2lhdGVkIHRleHQgaW5wdXQgb3IgPHNlbGVjdD4gZWxlbWVudFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRleHQgaW5wdXRzIGFuZCA8c2VsZWN0PiBlbGVtZW50cyBtdXN0IGhhdmUgYSBsYWJlbCBiZWZvcmUgdGhlIGlucHV0IGNvbnRyb2xcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjMuMy4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmIChydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09IFwiaW5wdXRcIiAmJiBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0eXBlXCIpKSB7XG4gICAgICAgICAgICBsZXQgdHlwZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInR5cGVcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIGlmICh0eXBlICE9IFwidGV4dFwiICYmIHR5cGUgIT0gXCJmaWxlXCIgJiYgdHlwZSAhPSBcInBhc3N3b3JkXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdldCBvbmx5IHRoZSBub24taGlkZGVuIGxhYmVscyBmb3IgZWxlbWVudFxuICAgICAgICBsZXQgbGFiZWxFbGVtID0gQ29tbW9uVXRpbC5nZXRMYWJlbEZvckVsZW1lbnRIaWRkZW4ocnVsZUNvbnRleHQsIHRydWUpO1xuICAgICAgICBcbiAgICAgICAgaWYgKGxhYmVsRWxlbSA9PSBudWxsIHx8ICFDb21tb25VdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbihsYWJlbEVsZW0pKSB7XG4gICAgICAgICAgICAvLyBEdWUgdG8gZGVwZW5kZW5jeSwgbGFiZWwgbXVzdCBiZSBkb25lIHZpYSB0aXRsZSAtIHRoaXMgcnVsZSBkb2Vzbid0IGFwcGx5XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB2YWx1ZSA9IENvbW1vblV0aWwuY29tcGFyZU5vZGVPcmRlcihsYWJlbEVsZW0sIHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKHZhbHVlID09PSAtMikge1xuICAgICAgICAgICAgLy8gaWdub3JlIGlmIG5vIGxhYmVsIG9yIHRoZSBjb250ZW50IGZvciB0aGUgbGFiZWwgaXMgb25seSBmcm9tIHRoZSBuZXN0ZWQgaW5wdXQgY29udHJvbCBcbiAgICAgICAgICAgIGxldCB0ZXh0ID0gQ29tbW9uVXRpbC5nZXRJbm5lclRleHQocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgaWYgKHRleHQgJiYgdGV4dC50cmltKCkubGVuZ3RoID4gMCAmJiBDb21tb25VdGlsLmdldElubmVyVGV4dChydWxlQ29udGV4dCkudHJpbSgpID09PSB0ZXh0LnRyaW0oKSkge1xuICAgICAgICAgICAgICAgIC8vIER1ZSB0byBkZXBlbmRlbmN5LCBsYWJlbCBtdXN0IGJlIGRvbmUgdmlhIHRpdGxlIC0gdGhpcyBydWxlIGRvZXNuJ3QgYXBwbHlcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaW5wdXQgbmVzdGVkIGluIGxhYmVsXG4gICAgICAgICAgICBsZXQgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgd2Fsa05vZGUgPSBydWxlQ29udGV4dC5wcmV2aW91c1NpYmxpbmc7XG4gICAgICAgICAgICB3aGlsZSAoIXBhc3NlZCAmJiB3YWxrTm9kZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9ICgod2Fsa05vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSBcIiN0ZXh0XCIgJiYgd2Fsa05vZGUubm9kZVZhbHVlLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICB8fCAod2Fsa05vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSBcInNwYW5cIiAmJiB3YWxrTm9kZS50ZXh0Q29udGVudC50cmltKCkubGVuZ3RoID4gMCkpO1xuICAgICAgICAgICAgICAgIHdhbGtOb2RlID0gd2Fsa05vZGUucHJldmlvdXNTaWJsaW5nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBJbnB1dCBuZXN0ZWQgaW4gbGFiZWwgYW5kIHRleHQgYWZ0ZXIgaW5wdXRcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodmFsdWUgIT0gLTEpIHtcbiAgICAgICAgICAgICAgICAvLyBsYWJlbCBpcyBhZnRlciBpbnB1dFxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBIYXZlbid0IHJldHVybmVkIHlldCwgdGhlbiBJIHBhc3NcbiAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5pbXBvcnQgeyBBY2NOYW1lVXRpbCB9IGZyb20gXCIuLi91dGlsL0FjY05hbWVVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBpbnB1dF9sYWJlbF9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaW5wdXRfbGFiZWxfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmJ1dHRvbixhcmlhOmNoZWNrYm94LGFyaWE6Y29tYm9ib3gsYXJpYTpsaXN0Ym94LGFyaWE6bWVudWl0ZW1jaGVja2JveCxhcmlhOm1lbnVpdGVtcmFkaW8sYXJpYTpyYWRpbyxhcmlhOnNlYXJjaGJveCxhcmlhOnNsaWRlcixhcmlhOnNwaW5idXR0b24sYXJpYTpzd2l0Y2gsYXJpYTp0ZXh0Ym94LGFyaWE6cHJvZ3Jlc3NiYXIsZG9tOmlucHV0W3R5cGU9ZmlsZV0sZG9tOm91dHB1dCxkb206bWV0ZXIsZG9tOmlucHV0W3R5cGU9cGFzc3dvcmRdXCIsXG4gICAgLy9kZXBlbmRlbmNpZXM6IFtcImFyaWFfcm9sZV9yZWR1bmRhbnRcIiwgXCJhcmlhX3JvbGVfdmFsaWRcIl0sXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfSW5wdXRfRXhwbGljaXRMYWJlbFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiRmFpbF8yXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJpbnB1dF9sYWJlbF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJpbnB1dF9sYWJlbF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJpbnB1dF9sYWJlbF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImlucHV0X2xhYmVsX2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZvcm0gY29udHJvbCBlbGVtZW50IDx7MH0+IGhhcyBubyBhc3NvY2lhdGVkIGxhYmVsXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkZvcm0gY29udHJvbCB3aXRoIFxcXCJ7MH1cXFwiIHJvbGUgaGFzIG5vIGFzc29jaWF0ZWQgbGFiZWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFYWNoIGZvcm0gY29udHJvbCBtdXN0IGhhdmUgYW4gYXNzb2NpYXRlZCBsYWJlbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sIC8qIHJlbW92ZSAxLjEuMSBtYXBwaW5nLCBrZWVwIDQuMS4yICovXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIC8vIFRPRE86IEFDVDogaHR0cHM6Ly9naXRodWIuY29tL0lCTWEvZXF1YWwtYWNjZXNzL2lzc3Vlcy83NTZcbiAgICBhY3Q6IFtcIjk3YTRlMVwiLCBcImUwODZlNVwiXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAvL2lnbm9yZSBkYXRhbGlzdCBlbGVtZW50IGNoZWNrIHNpbmNlIGl0IHdpbGwgYmUgcGFydCBvZiBhIGlucHV0IGVsZW1lbnQgb3IgaGlkZGVuIGJ5IGRlZmF1bHRcbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSAnZGF0YWxpc3QnKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICAvLyBEZXRlcm1pbmUgdGhlIGlucHV0IHR5cGVcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGxldCB0eXBlID0gXCJ0ZXh0XCI7XG4gICAgICAgIGlmIChub2RlTmFtZSA9PSBcImlucHV0XCIgJiYgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidHlwZVwiKSkge1xuICAgICAgICAgICAgdHlwZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInR5cGVcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgfSBlbHNlIGlmIChub2RlTmFtZSA9PT0gXCJidXR0b25cIiB8fCBBcmlhVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MocnVsZUNvbnRleHQsIFwiYnV0dG9uXCIpKSB7XG4gICAgICAgICAgICB0eXBlID0gXCJidXR0b25lbGVtXCI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGVOYW1lID09IFwiaW5wdXRcIiAmJiB0eXBlID09IFwiXCIpIHtcbiAgICAgICAgICAgIHR5cGUgPSBcInRleHRcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZSA9PT0gXCJpbWFnZVwiKSB7XG4gICAgICAgICAgICAvLyBIYW5kbGVkIGJ5IGlucHV0X2xhYmVsX2V4aXN0c0ltYWdlXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuLyoqIFxuICAgICAgICBsZXQgUE9GID0gLTE7XG4gICAgICAgIGxldCB0ZXh0VHlwZXMgPSBDb21tb25VdGlsLmlucHV0X3RleHRfdHlwZXM7XG4gICAgICAgIGxldCBidXR0b25UeXBlcyA9IENvbW1vblV0aWwuZm9ybV9idXR0b25fdHlwZXM7ICBcbiAgICAgICBcbiAgICAgICAgbGV0IGJ1dHRvblR5cGVzV2l0aERlZmF1bHRzID0gW1wicmVzZXRcIiwgXCJzdWJtaXRcIl07IC8vICdzdWJtaXQnIGFuZCAncmVzZXQnIGhhdmUgdmlzaWJsZSBkZWZhdWx0cy5cbiAgICAgICAgaWYgKHRleHRUeXBlcy5pbmRleE9mKHR5cGUpICE9PSAtMSkgeyAvLyBJZiB0eXBlIGlzIGluIHRoZSBsaXN0XG4gICAgICAgICAgICAvLyBHZXQgb25seSB0aGUgbm9uLWhpZGRlbiBsYWJlbHMgZm9yIGVsZW1lbnRzLCBpbiB0aGUgY2FzZSB0aGF0IGEgbGFiZWwgaXMgaGlkZGVuIHRoZW4gaXQgaXMgYSB2aW9sYXRpb25cbiAgICAgICAgICAgIC8vIE5vdGU6IGxhYmVsW2Zvcl0gZG9lcyBub3Qgd29yayBmb3IgQVJJQSBkZWZpbmVkIGlucHV0c1xuICAgICAgICAgICAgbGV0IGxhYmVsRWxlbSA9IHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInJvbGVcIikgPyBudWxsIDogQ29tbW9uVXRpbC5nZXRMYWJlbEZvckVsZW1lbnRIaWRkZW4ocnVsZUNvbnRleHQsIHRydWUpO1xuICAgICAgICAgICAgbGV0IGhhc0xhYmVsRWxlbUNvbnRlbnQgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChsYWJlbEVsZW0pIHtcbiAgICAgICAgICAgICAgICBpZiAoQ29tbW9uVXRpbC5oYXNJbm5lckNvbnRlbnRIaWRkZW4obGFiZWxFbGVtKSkge1xuICAgICAgICAgICAgICAgICAgICBoYXNMYWJlbEVsZW1Db250ZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChsYWJlbEVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKSB8fCBcIlwiKS50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBoYXNMYWJlbEVsZW1Db250ZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxhYmVsRWxlbS5oYXNBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsbGVkYnlcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsbGVkQnlFbGVtID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQobGFiZWxFbGVtLCBsYWJlbEVsZW0uZ2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsbGVkYnknKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsYWJlbGxlZEJ5RWxlbSAmJiAhRE9NVXRpbC5zYW1lTm9kZShsYWJlbGxlZEJ5RWxlbSwgbGFiZWxFbGVtKSAmJiBDb21tb25VdGlsLmhhc0lubmVyQ29udGVudChsYWJlbGxlZEJ5RWxlbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhc0xhYmVsRWxlbUNvbnRlbnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGFzc2VkID0gKCEhbGFiZWxFbGVtICYmIGhhc0xhYmVsRWxlbUNvbnRlbnQpIHx8XG4gICAgICAgICAgICAgICAgKCFsYWJlbEVsZW0gJiYgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJ0aXRsZVwiKSB8fCBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInBsYWNlaG9sZGVyXCIpKSB8fFxuICAgICAgICAgICAgICAgIEFyaWFVdGlsLmdldEFyaWFMYWJlbChydWxlQ29udGV4dCkudHJpbSgpLmxlbmd0aCA+IDAgfHwgQ29tbW9uVXRpbC5oYXNJbXBsaWNpdExhYmVsKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgIGlmICghcGFzc2VkKSBQT0YgPSAyICsgdGV4dFR5cGVzLmluZGV4T2YodHlwZSk7XG4gICAgICAgICAgICBcbiAgICAgICAgfSBlbHNlIGlmIChidXR0b25UeXBlcy5pbmRleE9mKHR5cGUpICE9PSAtMSkgeyAvLyBJZiB0eXBlIGlzIGEgYnV0dG9uXG4gICAgICAgICAgICBpZiAoYnV0dG9uVHlwZXNXaXRoRGVmYXVsdHMuaW5kZXhPZih0eXBlKSAhPT0gLTEgJiYgIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInZhbHVlXCIpKSB7XG4gICAgICAgICAgICAgICAgLy8gJ3N1Ym1pdCcgYW5kICdyZXNldCcgaGF2ZSB2aXNpYmxlIGRlZmF1bHRzIHNvIHBhc3MgaWYgdGhlcmUgaXMgbm8gJ3ZhbHVlJyBhdHRyaWJ1dGVcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInZhbHVlXCIpIHx8IEFyaWFVdGlsLmhhc0FyaWFMYWJlbChydWxlQ29udGV4dCkgfHwgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJ0aXRsZVwiKTtcbiAgICAgICAgICAgICAgICBpZiAoIXBhc3NlZCkgUE9GID0gMiArIHRleHRUeXBlcy5sZW5ndGggKyBidXR0b25UeXBlcy5pbmRleE9mKHR5cGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gXCJidXR0b25lbGVtXCIpIHtcbiAgICAgICAgICAgIC8vIElmIEkgYW0gYW4gaW1hZ2UgYW5kIEkgaGF2ZSBhbHQgdGV4dCAtIGFjY2Vzc2liaWxpdHktd2ViLWVuZ2luZSMyNjlcbiAgICAgICAgICAgIGxldCBiQWx0ID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbWdcIiAmJiBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhbHRcIikpIHtcbiAgICAgICAgICAgICAgICBsZXQgYWx0ID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYWx0XCIpO1xuICAgICAgICAgICAgICAgIGlmIChhbHQudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBiQWx0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYkFsdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHBhc3NlZCA9IENvbW1vblV0aWwuaGFzSW5uZXJDb250ZW50SGlkZGVuKHJ1bGVDb250ZXh0KSB8fCBBcmlhVXRpbC5oYXNBcmlhTGFiZWwocnVsZUNvbnRleHQpIHx8IGJBbHQgfHwgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJ0aXRsZVwiKTtcblxuICAgICAgICAgICAgaWYgKCFwYXNzZWQpIFBPRiA9IDIgKyB0ZXh0VHlwZXMubGVuZ3RoICsgYnV0dG9uVHlwZXMubGVuZ3RoICsgMTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vY2hlY2sgaWYgYSBuYXRpdmUgYnV0dG9uIGlzIGxhYmVsbGVkXG4gICAgICAgIGlmICghcGFzc2VkICYmIG5vZGVOYW1lID09IFwiYnV0dG9uXCIpIHtcbiAgICAgICAgICAgICBpZiAoQ29tbW9uVXRpbC5oYXNJbXBsaWNpdExhYmVsKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBsYWJlbCA9IENvbW1vblV0aWwuZ2V0TGFiZWxGb3JFbGVtZW50KHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgICAgICBpZiAobGFiZWwgJiYgQ29tbW9uVXRpbC5oYXNJbm5lckNvbnRlbnRIaWRkZW4obGFiZWwpKVxuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSB0cnVlOyAgICBcbiAgICAgICAgICAgICB9ICAgIFxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUnB0X0FyaWFfVmFsaWRJZFJlZiBkZXRlcm1pbmVzIGlmIHRoZSBhcmlhLWxhYmVsbGVkYnkgaWQgcG9pbnRzIHRvIGEgdmFsaWQgZWxlbWVudFxuICAgICAgICBpZiAoIXBhc3NlZCAmJiAoYnV0dG9uVHlwZXMuaW5kZXhPZih0eXBlKSAhPT0gLTEpKSB7XG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiY2xhc3NcIikgJiYgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiY2xhc3NcIikgPT0gXCJkaWppdE9mZlNjcmVlblwiICYmIERPTVdhbGtlci5wYXJlbnRFbGVtZW50KHJ1bGVDb250ZXh0KS5oYXNBdHRyaWJ1dGUoXCJ3aWRnZXRpZFwiKSkge1xuICAgICAgICAgICAgICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIGRpaml0IGJ1dHRvbnNcbiAgICAgICAgICAgICAgICBsZXQgbGFiZWxJZCA9IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KHJ1bGVDb250ZXh0KS5nZXRBdHRyaWJ1dGUoXCJ3aWRnZXRpZFwiKSArIFwiX2xhYmVsXCI7XG4gICAgICAgICAgICAgICAgbGV0IGxhYmVsID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQocnVsZUNvbnRleHQsIGxhYmVsSWQpO1xuICAgICAgICAgICAgICAgIGlmIChsYWJlbCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IENvbW1vblV0aWwuaGFzSW5uZXJDb250ZW50SGlkZGVuKGxhYmVsKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBtZWFucyBJIGZhaWxlZCBhYm92ZSBhbHNvXG4gICAgICAgICAgICAgICAgICAgIGlmICghcGFzc2VkKSBQT0YgPSAyICsgdGV4dFR5cGVzLmxlbmd0aCArIGJ1dHRvblR5cGVzLmxlbmd0aCArIDQgKyBidXR0b25UeXBlcy5pbmRleE9mKHR5cGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcGFzc2VkICYmIG5vZGVOYW1lID09IFwib3B0Z3JvdXBcIikge1xuICAgICAgICAgICAgcGFzc2VkID0gQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJsYWJlbFwiKTtcbiAgICAgICAgICAgIGlmICghcGFzc2VkKSBQT0YgPSAyICsgdGV4dFR5cGVzLmxlbmd0aCArIGJ1dHRvblR5cGVzLmxlbmd0aCArIDI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFwYXNzZWQgJiYgbm9kZU5hbWUgPT0gXCJvcHRpb25cIikge1xuICAgICAgICAgICAgLy8gSXMgYSBub24tZW1wdHkgdmFsdWUgYXR0cmlidXRlIGFsc28gZW5vdWdoIGZvciBhbiBvcHRpb24gZWxlbWVudD9cbiAgICAgICAgICAgIHBhc3NlZCA9IENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwibGFiZWxcIikgfHwgcnVsZUNvbnRleHQuaW5uZXJIVE1MLnRyaW0oKS5sZW5ndGggPiAwO1xuICAgICAgICAgICAgaWYgKCFwYXNzZWQpIFBPRiA9IDIgKyB0ZXh0VHlwZXMubGVuZ3RoICsgYnV0dG9uVHlwZXMubGVuZ3RoICsgMztcbiAgICAgICAgfSBcbiAgICAgICAgXG4gICAgICAgIGlmICghcGFzc2VkKVxuICAgICAgICAgICAgcGFzc2VkID0gQXJpYVV0aWwuZ2V0QXJpYUxhYmVsKHJ1bGVDb250ZXh0KS50cmltKCkubGVuZ3RoID4gMCB8fCBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInRpdGxlXCIpO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgLy8gY2hlY2sgYXJpYSByb2xlIHRvIGZpZ3VyZSBvdXQgaWYgdGhlIGFjY2Vzc2libGUgbmFtZSBjYW4gYmUgZnJvbSBjb250ZW50IFxuICAgICAgICAgICAgY29uc3Qgcm9sZXMgPSBBcmlhVXRpbC5nZXRSb2xlcyhydWxlQ29udGV4dCwgdHJ1ZSk7XG4gICAgICAgICAgICAvL3doZW4gbXVsdGlwbGUgcm9sZXMgc3BlY2lmaWVkLCBvbmx5IHRoZSBmaXJzdCB2YWxpZCByb2xlIChndWFyYW50ZWVkIGJ5IGRlcGVuZGVuY2llcykgaXMgYXBwbGllZCwgYW5kIHRoZSBvdGhlcnMganVzdCBhcyBmYWxsYmFja3NcbiAgICAgICAgICAgIGlmIChBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNbcm9sZXNbMF1dICYmIEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlc1swXV0ubmFtZUZyb20gJiYgQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVzWzBdXS5uYW1lRnJvbS5pbmNsdWRlcyhcImNvbnRlbnRzXCIpKVxuICAgICAgICAgICAgICAgIHBhc3NlZCA9IENvbW1vblV0aWwuaGFzSW5uZXJDb250ZW50SGlkZGVuKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgfVxuKi9cbiAgICAgICAgY29uc3QgcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZShydWxlQ29udGV4dCk7XG4gICAgICAgIHBhc3NlZCA9IHBhaXIgJiYgcGFpci5uYW1lICYmIHBhaXIubmFtZS50cmltKCkubGVuZ3RoID4gMDtcblxuICAgICAgICBpZiAocGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH0gZWxzZSBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwicm9sZVwiKSAmJiBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzJcIiwgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwicm9sZVwiKS5zcGxpdChcIiBcIikpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIsIFtub2RlTmFtZV0pO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5pbXBvcnQgeyBET01VdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01VdGlsXCI7XG5pbXBvcnQgeyBBY2NOYW1lVXRpbCB9IGZyb20gXCIuLi91dGlsL0FjY05hbWVVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBpbnB1dF9sYWJlbF92aXNpYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcImlucHV0X2xhYmVsX3Zpc2libGVcIixcbiAgICBjb250ZXh0OiBcImFyaWE6YnV0dG9uLGFyaWE6Y2hlY2tib3gsYXJpYTpjb21ib2JveCxhcmlhOmxpc3Rib3gsYXJpYTptZW51aXRlbWNoZWNrYm94LGFyaWE6bWVudWl0ZW1yYWRpbyxhcmlhOnJhZGlvLGFyaWE6c2VhcmNoYm94LGFyaWE6c2xpZGVyLGFyaWE6c3BpbmJ1dHRvbixhcmlhOnN3aXRjaCxhcmlhOnRleHRib3hcIixcbiAgICBkZXBlbmRlbmNpZXM6IFtcImlucHV0X2xhYmVsX2V4aXN0c1wiXSwgXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfSW5wdXRfVmlzaWJsZUxhYmVsXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcInBvdGVudGlhbF9ub19sYWJlbFwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfcGxhY2Vob2xkZXJfb25seVwiOiBcInBvdGVudGlhbF9wbGFjZWhvbGRlcl9vbmx5XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImlucHV0X2xhYmVsX3Zpc2libGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfcGxhY2Vob2xkZXJfb25seVwiOiBcImlucHV0X2xhYmVsX3Zpc2libGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfbm9fbGFiZWxcIjogXCJpbnB1dF9sYWJlbF92aXNpYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpbnB1dF9sYWJlbF92aXNpYmxlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlRoZSBpbnB1dCBlbGVtZW50IGhhcyBhbiBhc3NvY2lhdGVkIHZpc2libGUgbGFiZWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX3BsYWNlaG9sZGVyX29ubHlcIjogXCJUaGUg4oCYcGxhY2Vob2xkZXLigJkgaXMgdGhlIG9ubHkgdmlzaWJsZSBsYWJlbFwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfbm9fbGFiZWxcIjogXCJUaGUgaW5wdXQgZWxlbWVudCBkb2VzIG5vdCBoYXZlIGFuIGFzc29jaWF0ZWQgdmlzaWJsZSBsYWJlbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkFuIGlucHV0IGVsZW1lbnQgbXVzdCBoYXZlIGFuIGFzc29jaWF0ZWQgdmlzaWJsZSBsYWJlbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi41LjNcIiwgXCIzLjMuMlwiXSwgLy9tYXAgdG8gYm90aCByZXF1aXJlbWVudHMgaW4gaGVscFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIFxuICAgICAgICAvL2lnbm9yZSBkYXRhbGlzdCBlbGVtZW50IGNoZWNrIHNpbmNlIGl0IHdpbGwgYmUgcGFydCBvZiBhIGlucHV0IGVsZW1lbnQgb3IgaGlkZGVuIGJ5IGRlZmF1bHRcbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSAnZGF0YWxpc3QnKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgaWYgKCFWaXNVdGlsLmlzTm9kZVZpc2libGUocnVsZUNvbnRleHQpIHx8IENvbW1vblV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICAvLyBpZiBhIGNvbnRyb2wgaXMgaW4gYSB0YWJsZSBjZWxsLCB0aGUgY29sIGhlYWRlcnMgY2FuIGFjdCBhcyB2aXNpYmxlIGxhYmVsLCB3aGljaCBpcyBjaGVja2VkIGluIHRhYmxlIGhlYWRpbmcgcnVsZVxuICAgICAgICBpZiAoQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgXCJ0YWJsZVwiKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIGN1c3RvbSB3aWRnZXQgc3VibWlzc2lvbiBpcyBub3QgaW4gc2NvcGUgZm9yIHRoaXMgc3VjY2VzcyBjcml0ZXJpYSAoSUJNYS9lcXVhbC1hY2Nlc3MjMjA0KSBpZiBpdCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIGRhdGEgZW50cnlcbiAgICAgICAgbGV0IHJvbGUgPSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAocm9sZSAmJiByb2xlID09PSBcImJ1dHRvblwiICYmIG5vZGVOYW1lICE9PSAnaW5wdXQnICYmIG5vZGVOYW1lICE9PSAnYnV0dG9uJykgeyAgICBcbiAgICAgICAgICAgIC8vIGxpa2VseSBhIGN1c3RvbSB3aWRnZXQsIHNraXAgaWYgbm90IGFzc29jaWF0ZWQgd2l0aCBkYXRhIGVudHJ5XG4gICAgICAgICAgICBpZiAoIUNvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFwiZm9ybVwiKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsgICAgXG4gICAgICAgIH1cblxuICAgICAgICAvLyB3aGVuIGluIGEgY29tYm9ib3gsIG9ubHkgbG9vayBhdCB0aGUgaW5wdXQgdGV4dGJveC5cbiAgICAgICAgaWYgKEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUocnVsZUNvbnRleHQsIFwiY29tYm9ib3hcIikgJiZcbiAgICAgICAgICAgICEoQXJpYVV0aWwuaGFzUm9sZUluU2VtYW50aWNzKHJ1bGVDb250ZXh0LCBcInRleHRib3hcIikgfHwgQXJpYVV0aWwuaGFzUm9sZUluU2VtYW50aWNzKHJ1bGVDb250ZXh0LCBcInNlYXJjaGJveFwiKSB8fFxuICAgICAgICAgICAgICAgIG5vZGVOYW1lID09PSBcImlucHV0XCIgfHwgKG5vZGVOYW1lID09PSBcInNlbGVjdFwiICYmIEFyaWFVdGlsLmhhc1JvbGVJblNlbWFudGljcyhydWxlQ29udGV4dCwgXCJjb21ib2JveFwiKSkpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICAvLyBhdm9pZCBkaWFnbm9zaW5nIHRoZSBwb3B1cCBsaXN0IG9mIGEgY29tYm9ib3guXG4gICAgICAgIGxldCByb2xlc1RvQ2hlY2sgPSBbXCJsaXN0Ym94XCIsIFwidHJlZVwiLCBcImdyaWRcIiwgXCJkaWFsb2dcIl07XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcm9sZXNUb0NoZWNrLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBpZiAoQXJpYVV0aWwuaGFzUm9sZUluU2VtYW50aWNzKHJ1bGVDb250ZXh0LCByb2xlc1RvQ2hlY2tbal0pKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNvbWJvYm94ZXMgPSBDb21tb25VdGlsLmdldEVsZW1lbnRzQnlSb2xlSGlkZGVuKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsIFwiY29tYm9ib3hcIiwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBjb21ib2JveGVzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjb21ib2JveCA9IGNvbWJvYm94ZXNba107XG4gICAgICAgICAgICAgICAgICAgIGxldCBhcmlhX293bnMgPSBDb21tb25VdGlsLmdldEVsZW1lbnRBdHRyaWJ1dGUoY29tYm9ib3gsIFwiYXJpYS1vd25zXCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYXJpYV9vd25zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgb3ducyA9IENvbW1vblV0aWwubm9ybWFsaXplU3BhY2luZyhhcmlhX293bnMudHJpbSgpKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG93bnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgb3duZWQgPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChydWxlQ29udGV4dCwgb3duc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG93bmVkID09PSBydWxlQ29udGV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGNvbnN0IHBhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWUocnVsZUNvbnRleHQpO1xuICAgICAgICAvLyBjaGVjayB2aXNpYmxlIGxhYmVsIGZvciBpbnB1dCBvciBidXR0b25cbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSAnaW5wdXQnIHx8IG5vZGVOYW1lID09PSAnYnV0dG9uJykge1xuICAgICAgICAgICAgaWYgKHBhaXIgJiYgcGFpci5uYW1lICYmIHBhaXIubmFtZS50cmltKCkubGVuZ3RoID4gMCAmJiAocGFpci5uYW1lRnJvbSA9PT0gJ2xhYmVsJyB8fCBwYWlyLm5hbWVGcm9tID09PSAnaW50ZXJuYWwnIHx8IHBhaXIubmFtZUZyb20gPT09ICdhbHQnKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2hlY2sgaWYgYW4gYWx0ZXJuYXRpdmUgdG9vbHRpcCBleGlzdHMgdGhhdCBjYW4gYmUgbWFkZSB2aXNpYmxlIHRocm91Z2ggbW91c2VvdmVyXG4gICAgICAgIGlmIChwYWlyICYmIHBhaXIubmFtZSAmJiBwYWlyLm5hbWUudHJpbSgpLmxlbmd0aCA+IDAgJiYgKHBhaXIubmFtZUZyb20gPT09ICd0ZXh0JyB8fCBwYWlyLm5hbWVGcm9tID09PSAndGl0bGUnKSlcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG5cbiAgICAgICAgLy8gY2hlY2sgaWYgYW55IHZpc2libGUgdGV4dCBmcm9tIHRoZSBjb250cm9sLiBcbiAgICAgICAgLy8gbm90ZSB0aGF0ICgxKSB0aGUgdGV4dCBkb2VzbuKAmXQgbmVlZCB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbnRyb2wgdG8gZm9ybSBhIHJlbGF0aW9uc2hpcFxuICAgICAgICAvLyAgKDIpIHRoZSB0ZXh0IGRvZXNuJ3QgbmVlZCB0byBmb2xsb3cgYWNjZXNzaWJsZSBuYW1lIHJlcXVpcmVtZW50IChlLmcuIG5hbWVGcm9tKVxuICAgICAgICBjb25zdCB0ZXh0ID0gQ29tbW9uVXRpbC5nZXRPblNjcmVlbklubmVyVGV4dChydWxlQ29udGV4dCk7XG4gICAgICAgIGlmICh0ZXh0ICYmIHRleHQubGVuZ3RoICE9PSAwKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgXG4gICAgICAgIC8vIGNoZWNrIGlmIGFueSBkZXNjZW5kYW50IHdpdGggYW4gYWx0ZXJuYXRpdmUgdG9vbHRpcCB0aGF0IGNhbiBiZSBtYWRlIHZpc2libGUgdGhyb3VnaCBtb3VzZW92ZXJcbiAgICAgICAgLy8gb25seSBjb25zaWRlciBpbWcgYW5kIHN2ZywgYW5kIG90aGVyIHRleHQgY29udGVudCBvZiB0aGUgZGVzY2VuZGFudCBpcyBjb3ZlcmVkIGluIHRoZSBpc0lubmVyVGV4dCBhYm92ZSAgXG4gICAgICAgIGxldCBkZXNjZW5kYW50cyA9IEFyaWFVdGlsLmdldEFsbERlc2NlbmRhbnRzV2l0aFJvbGVzKHJ1bGVDb250ZXh0LCBbXCJpbWdcIiwgXCJncmFwaGljcy1kb2N1bWVudFwiLCBcImdyYXBoaWNzLW9iamVjdFwiLCBcImdyYXBoaWNzLXN5bWJvbFwiXSwgZmFsc2UsIHRydWUpO1xuICAgICAgICBpZiAoZGVzY2VuZGFudHMgJiYgZGVzY2VuZGFudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yIChsZXQgZD0wOyBkIDwgZGVzY2VuZGFudHMubGVuZ3RoOyBkKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShkZXNjZW5kYW50c1tkXSwgXCJ0aXRsZVwiKSB8fCBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KGRlc2NlbmRhbnRzW2RdLCBcImFsdFwiKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgICAgIH0gXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIGNoZWNrIGlmIHRoZXJlIGlzIGEgdmlzaWJsZSBsYWJlbCBwb2ludGVkIHRvIGJ5IHRoZSBhcmlhLWxhYmVsbGVkYnkgYXR0cmlidXRlLlxuICAgICAgICBpZiAoQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJhcmlhLWxhYmVsbGVkYnlcIikpIHtcbiAgICAgICAgICAgIGxldCB0aGVMYWJlbCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKTtcbiAgICAgICAgICAgIGxldCBsYWJlbFZhbHVlcyA9IHRoZUxhYmVsLnNwbGl0KC9cXHMrLyk7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGxhYmVsVmFsdWVzLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICAgICAgbGV0IGVsZW1lbnRCeUlkID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQocnVsZUNvbnRleHQsIGxhYmVsVmFsdWVzW2pdKTtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudEJ5SWQgJiYgIURPTVV0aWwuc2FtZU5vZGUoZWxlbWVudEJ5SWQsIHJ1bGVDb250ZXh0KSAmJiBWaXNVdGlsLmlzTm9kZVZpc2libGUoZWxlbWVudEJ5SWQpICYmIENvbW1vblV0aWwuaGFzSW5uZXJDb250ZW50SGlkZGVuKGVsZW1lbnRCeUlkKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpOyBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoKG5vZGVOYW1lID09PSBcIm9wdGdyb3VwXCIgfHwgbm9kZU5hbWUgPT0gXCJvcHRpb25cIikgJiYgKHBhaXIgJiYgcGFpci5uYW1lICYmIHBhaXIubmFtZS50cmltKCkubGVuZ3RoID4gMCAmJiAocGFpci5uYW1lRnJvbSA9PT0gJ2xhYmVsJyB8fCBwYWlyLm5hbWVGcm9tID09PSAnY29udGVudCcpKSlcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG5cbiAgICAgICAgLy8gRGV0ZXJtaW5lIGlmIHRoaXMgaXMgcmVmZXJlbmNlZCBieSBhIGNvbWJvYm94LiBJZiBzbywgdGhlIGxhYmVsIGJlbG9uZ3MgdG8gdGhlIGNvbWJvYm94XG4gICAgICAgIGxldCBpZCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImlkXCIpO1xuICAgICAgICBpZiAoaWQgJiYgaWQudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5vd25lckRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCpbYXJpYS1jb250cm9scz0nJHtpZH0nXVtyb2xlPSdjb21ib2JveCddYCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNoZWNrIGlmIGEgcGxhY2Vob2xkZXIgZXhpc3RzIGV2ZW4gdGhvdWdoIGEgcGxhY2Vob2xkZXIgdGV4dCBpcyBub3Qgc3VmZmljaWVudCBhcyBhIHZpc2libGUgdGV4dFxuICAgICAgICBpZiAoQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJwbGFjZWhvbGRlclwiKSlcbiAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX3BsYWNlaG9sZGVyX29ubHlcIik7XG5cbiAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfbm9fbGFiZWxcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGNvbnN0IGlucHV0X29uY2hhbmdlX3JldmlldzogUnVsZSA9IHtcbiAgICBpZDogXCJpbnB1dF9vbmNoYW5nZV9yZXZpZXdcIixcbiAgICBjb250ZXh0OiBcImRvbTppbnB1dFtvbmNoYW5nZV0sIGRvbTp0ZXh0YXJlYVtvbmNoYW5nZV0sIGRvbTpzZWxlY3Rbb25jaGFuZ2VdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfSW5wdXRfSGFzT25jaGFuZ2VcIjoge1xuICAgICAgICAgICAgLy8gXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwicG90ZW50aWFsX3dhcm5pbmdcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICAvLyBcInBhc3NcIjogXCJpbnB1dF9vbmNoYW5nZV9yZXZpZXcuaHRtbFwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfd2FybmluZ1wiOiBcImlucHV0X29uY2hhbmdlX3Jldmlldy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiaW5wdXRfb25jaGFuZ2VfcmV2aWV3Lmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJVc2VycyBtdXN0IGJlIGFkdmlzZWQgaWYsIGR1ZSB0byBhIGNoYW5nZSBvZiBlbGVtZW50IHZhbHVlLCBhIGZvcm0gYXV0b21hdGljYWxseSBzdWJtaXRzLCBhIG5ldyB3aW5kb3cgb3BlbnMsIG9yIGEgY2hhbmdlIGluIGZvY3VzIG9jY3Vyc1wiLFxuICAgICAgICAgICAgLy8gXCJwYXNzXCI6IFwiVGhlIHVzZXIgaXMgYWR2aXNlZCBvZiB0aGUgYXV0b21hdGljIGZvcm0gc3VibWlzc2lvbiwgbmV3IHdpbmRvdyBvcGVuaW5nLCBvciBmb2N1cyBjaGFuZ2VcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX3dhcm5pbmdcIjogXCJDb25maXJtIHRoYXQgdGhlIHVzZXIgaXMgYWR2aXNlZCBpZiwgZHVlIHRvIGEgY2hhbmdlIG9mIGVsZW1lbnQgdmFsdWUsIGEgZm9ybSBhdXRvbWF0aWNhbGx5IHN1Ym1pdHMsIGEgbmV3IHdpbmRvdyBvcGVucywgb3IgYSBjaGFuZ2UgaW4gZm9jdXMgb2NjdXJzXCIgICAgXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMy4yLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAocnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSBcImlucHV0XCIgJiYgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidHlwZVwiKSkge1xuICAgICAgICAgICAgbGV0IHR5cGUgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gXCJoaWRkZW5cIiB8fCB0eXBlID09PSBcInN1Ym1pdFwiIHx8IHR5cGUgPT09IFwiaW1hZ2VcIiB8fCB0eXBlID09PSBcImJ1dHRvblwiIHx8IHR5cGUgPT09IFwicmVzZXRcIilcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX3dhcm5pbmdcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5cbmV4cG9ydCBjb25zdCBpbnB1dF9wbGFjZWhvbGRlcl9sYWJlbF92aXNpYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcImlucHV0X3BsYWNlaG9sZGVyX2xhYmVsX3Zpc2libGVcIixcbiAgICBjb250ZXh0OiBcImRvbTppbnB1dFtwbGFjZWhvbGRlcl0sIGRvbTp0ZXh0YXJlYVtwbGFjZWhvbGRlcl1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIkhBQUNfSW5wdXRfUGxhY2Vob2xkZXJcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMlwiOiBcIlBvdGVudGlhbF8yXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJpbnB1dF9wbGFjZWhvbGRlcl9sYWJlbF92aXNpYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJpbnB1dF9wbGFjZWhvbGRlcl9sYWJlbF92aXNpYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzJcIjogXCJpbnB1dF9wbGFjZWhvbGRlcl9sYWJlbF92aXNpYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpbnB1dF9wbGFjZWhvbGRlcl9sYWJlbF92aXNpYmxlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJIVE1MNSBwbGFjZWhvbGRlciBpcyB0aGUgb25seSB2aXNpYmxlIGxhYmVsXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8yXCI6IFwiQWRkaXRpb25hbCB2aXNpYmxlIGxhYmVsIHJlZmVyZW5jZWQgYnkgJ2FyaWEtbGFiZWxsZWRieScgaXMgbm90IHZhbGlkXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiSFRNTDUgJ3BsYWNlaG9sZGVyJyBhdHRyaWJ1dGUgbXVzdCBub3QgYmUgdXNlZCBhcyBhIHZpc2libGUgbGFiZWwgcmVwbGFjZW1lbnRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBtZXJnZSB0aGUgcnVsZSBpbnRvIGlucHV0X2xhYmVsX3Zpc2libGVcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjMuMy4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICAqL1xuICAgIHJ1bGVzZXRzOiBbXSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0eXBlXCIpKSB7XG4gICAgICAgICAgICBsZXQgdHlwZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInR5cGVcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIGlmICh0eXBlID09IFwiaGlkZGVuXCIgfHwgdHlwZSA9PSBcImJ1dHRvblwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImhpZGRlblwiKSkge1xuICAgICAgICAgICAgbGV0IGhpZGRlbiA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImhpZGRlblwiKTtcbiAgICAgICAgICAgIGlmIChoaWRkZW4gPT0gXCJcIiB8fCBoaWRkZW4udG9Mb3dlckNhc2UoKSA9PSBcImhpZGRlblwiKSB7IC8vIHdoZW4gaGlkZGVuIGlzIGVtcHR5IGluIHRoZSBlbGVtZW50LCBcIlwiIGlzIHJldHVybmVkLCBzYW1lIGFzIGl0IGhhcyBhIHZhbHVlIG9mIFwiXCIuXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImFyaWEtbGFiZWxcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpICYmIHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImlkXCIpKSB7XG4gICAgICAgICAgICBsZXQgaWQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJpZFwiKS50cmltKCk7XG4gICAgICAgICAgICBsZXQgcmVmSWRzID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpLnRyaW0oKS5zcGxpdCgvXFxzKy8pOyAvLyBzZXBhcmF0ZWQgYnkgb25lIG9yIG1vcmUgd2hpdGUgc3BhY2VzXG4gICAgICAgICAgICBpZiAoIXJlZklkcy5pbmNsdWRlcyhpZCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IEZyYWdtZW50VXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9mcmFnbWVudFwiO1xuaW1wb3J0IHsgRE9NVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgbGFiZWxfY29udGVudF9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwibGFiZWxfY29udGVudF9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTpsYWJlbFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiVmFsZXJpZV9MYWJlbF9IYXNDb250ZW50XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc19SZWd1bGFyXCI6IFwiUGFzc19SZWd1bGFyXCIsXG4gICAgICAgICAgICBcIlBhc3NfQXJpYUxhYmVsXCI6IFwiUGFzc19BcmlhTGFiZWxcIixcbiAgICAgICAgICAgIFwiUGFzc19MYWJlbGxlZEJ5XCI6IFwiUGFzc19MYWJlbGxlZEJ5XCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfUmVndWxhclwiOiBcImxhYmVsX2NvbnRlbnRfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc19BcmlhTGFiZWxcIjogXCJsYWJlbF9jb250ZW50X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NfTGFiZWxsZWRCeVwiOiBcImxhYmVsX2NvbnRlbnRfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwibGFiZWxfY29udGVudF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImxhYmVsX2NvbnRlbnRfZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc19SZWd1bGFyXCI6IFwiPGxhYmVsPiBlbGVtZW50IGhhcyBhY2Nlc3NpYmxlIG5hbWUgd2l0aCBpbm5lciBjb250ZW50XCIsXG4gICAgICAgICAgICBcIlBhc3NfQXJpYUxhYmVsXCI6IFwiPGxhYmVsPiBlbGVtZW50IGhhcyBhY2Nlc3NpYmxlIG5hbWUgdmlhICdhcmlhLWxhYmVsJ1wiLFxuICAgICAgICAgICAgXCJQYXNzX0xhYmVsbGVkQnlcIjogXCI8bGFiZWw+IGVsZW1lbnQgaGFzIGFjY2Vzc2libGUgbmFtZSB2aWEgJ2FyaWEtbGFiZWxsZWRieSdcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiVGhlIDxsYWJlbD4gZWxlbWVudCBkb2VzIG5vdCBoYXZlIGRlc2NyaXB0aXZlIHRleHQgdGhhdCBpZGVudGlmaWVzIHRoZSBleHBlY3RlZCBpbnB1dFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkEgPGxhYmVsPiBlbGVtZW50IG11c3QgaGF2ZSBub24tZW1wdHkgZGVzY3JpcHRpdmUgdGV4dCB0aGF0IGlkZW50aWZpZXMgdGhlIHB1cnBvc2Ugb2YgdGhlIGludGVyYWN0aXZlIGNvbXBvbmVudFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgaWYgKENvbW1vblV0aWwuaGFzSW5uZXJDb250ZW50SGlkZGVuKHJ1bGVDb250ZXh0KSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc19SZWd1bGFyXCIpO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIikgfHwgXCJcIikudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfQXJpYUxhYmVsXCIpO1xuICAgICAgICB9IGVsc2UgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKSkge1xuICAgICAgICAgICAgbGV0IGxhYmVsRWxlbSA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKHJ1bGVDb250ZXh0LCBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWxsZWRieScpKTtcbiAgICAgICAgICAgIGlmIChsYWJlbEVsZW0gJiYgIURPTVV0aWwuc2FtZU5vZGUobGFiZWxFbGVtLCBydWxlQ29udGV4dCkgJiYgQ29tbW9uVXRpbC5oYXNJbm5lckNvbnRlbnQobGFiZWxFbGVtKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfTGFiZWxsZWRCeVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IEZyYWdtZW50VXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9mcmFnbWVudFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcbmltcG9ydCB7IENTU1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9DU1NVdGlsXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuXG5leHBvcnQgY29uc3QgbGFiZWxfbmFtZV92aXNpYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcImxhYmVsX25hbWVfdmlzaWJsZVwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpidXR0b24sYXJpYTpjaGVja2JveCxhcmlhOmdyaWRjZWxsLGFyaWE6bGluayxhcmlhOm1lbnVpdGVtLGFyaWE6bWVudWl0ZW1jaGVja2JveCxhcmlhOm1lbnVpdGVtcmFkaW8sYXJpYTpvcHRpb24sYXJpYTpyYWRpbyxhcmlhOnN3aXRjaCxhcmlhOnRhYixhcmlhOnRyZWVpdGVtLGRvbTppbnB1dCxkb206dGV4dGFyZWEsZG9tOnNlbGVjdCxkb206b3V0cHV0LGRvbTptZXRlclwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIxX0xhYmVsX0FjY2Vzc2libGVcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJsYWJlbF9uYW1lX3Zpc2libGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJsYWJlbF9uYW1lX3Zpc2libGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImxhYmVsX25hbWVfdmlzaWJsZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIkFjY2Vzc2libGUgbmFtZSBtYXRjaGVzIG9yIGNvbnRhaW5zIHRoZSB2aXNpYmxlIGxhYmVsIHRleHRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiQWNjZXNzaWJsZSBuYW1lIGRvZXMgbm90IG1hdGNoIG9yIGNvbnRhaW4gdGhlIHZpc2libGUgbGFiZWwgdGV4dFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkFjY2Vzc2libGUgbmFtZSBtdXN0IG1hdGNoIG9yIGNvbnRhaW4gdGhlIHZpc2libGUgbGFiZWwgdGV4dFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuNS4zXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICAvLyBUT0RPOiBBQ1Q6IFJldmlldyBodHRwczovL2dpdGh1Yi5jb20vYWN0LXJ1bGVzL2FjdC1ydWxlcy5naXRodWIuaW8vaXNzdWVzLzE2MThcbiAgICAvLyBodHRwczovL3d3dy53My5vcmcvV0FJL1dDQUcyMS9UZWNobmlxdWVzL2FyaWEvQVJJQTI0XG4gICAgYWN0OiBcIjJlZThiOFwiLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShydWxlQ29udGV4dCkgfHxcbiAgICAgICAgICAgIENvbW1vblV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHBhc3MgaWYgdGhlIHZpc2libGUgdGV4dCB1c2VzIE1hdGVyaWFsIEljb24gZm9udFxuICAgICAgICBpZiAoQ1NTVXRpbC5pc01hdGVyaWFsSWNvbkZvbnQocnVsZUNvbnRleHQpKSBcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcblxuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcblxuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIGxldCBpc0lucHV0QnV0dG9uID0gZmFsc2U7XG4gICAgICAgIC8vbGV0IGJ1dHRvblR5cGVzID0gW1wiYnV0dG9uXCIsIFwicmVzZXRcIiwgXCJzdWJtaXRcIl07IC8vXCJpbWFnZVwiXG4gICAgICAgIGxldCBpbnB1dFR5cGUgPSBudWxsO1xuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwiaW5wdXRcIiAmJiBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0eXBlXCIpKSB7XG4gICAgICAgICAgICBpbnB1dFR5cGUgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBpZiAoQ29tbW9uVXRpbC5mb3JtX2J1dHRvbl90eXBlcy5pbmRleE9mKGlucHV0VHlwZSkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgaXNJbnB1dEJ1dHRvbiA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdGhlTGFiZWxCeSA9IEFyaWFVdGlsLmdldEFyaWFBdHRyaWJ1dGUocnVsZUNvbnRleHQsIFwiYXJpYS1sYWJlbGxlZGJ5XCIpO1xuICAgICAgICBpZiAodGhlTGFiZWxCeSAmJiAhQ29tbW9uVXRpbC5pc0lkUmVmZXJUb1NlbGYocnVsZUNvbnRleHQsIHRoZUxhYmVsQnkpICYmICFpc0lucHV0QnV0dG9uKSB7XG4gICAgICAgICAgICAvLyBza2lwIHRoZSBjaGVja3MgaWYgaXQgaGFzIGFuIGFyaWEtbGFiZWxsZWRieSBzaW5jZSBpdCB0YWtlcyBwcmVjZWRlbmNlLlxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IHRoZUxhYmVsID0gbnVsbDtcbiAgICAgICAgICAgIGlmICh0aGVMYWJlbEJ5ICYmICFDb21tb25VdGlsLmlzSWRSZWZlclRvU2VsZihydWxlQ29udGV4dCwgdGhlTGFiZWxCeSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgbGFiZWxWYWx1ZXMgPSB0aGVMYWJlbEJ5LnNwbGl0KC9cXHMrLyk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBsYWJlbFZhbHVlcy5sZW5ndGg7ICsraikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZWxlbWVudEJ5SWQgPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChydWxlQ29udGV4dCwgbGFiZWxWYWx1ZXNbal0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudEJ5SWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoZUxhYmVsID0gQ29tbW9uVXRpbC5nZXRJbm5lclRleHQoZWxlbWVudEJ5SWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoZUxhYmVsID0gQXJpYVV0aWwuZ2V0QXJpYUF0dHJpYnV0ZShydWxlQ29udGV4dCwgXCJhcmlhLWxhYmVsXCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXRoZUxhYmVsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGxldCB0ZXh0ID0gbnVsbDtcblxuICAgICAgICAgICAgaWYgKGlzSW5wdXRCdXR0b24pIHtcbiAgICAgICAgICAgICAgICAvKiBOb3RlOiBEaXNhYmxlIHRoZSBhbHQgY2hlY2sgaW4gaW1hZ2VzIHVudGlsIHdlIGdldCBjb25maXJtYXRpb25cbiAgICAgICAgICAgICAgICBpZiAoaW5wdXRUeXBlPT09XCJpbWFnZVwiICYmIHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImFsdFwiKSl7XG4gICAgICAgICAgICAgICAgICAgIC8vIHVzZSAnYWx0JyBhdHRyaWJ1dGUgYXMgdmlzaWJsZSB0ZXh0XG4gICAgICAgICAgICAgICAgICAgIHRleHQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhbHRcIik7XG4gICAgICAgICAgICAgICAgfWVsc2UgXG4gICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidmFsdWVcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdXNlICd2YWx1ZScgYXR0cmlidXRlIGFzIHZpc2libGUgdGV4dFxuICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidmFsdWVcIik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdXNlIGRlZmF1bHQgdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0VHlwZSA9PT0gXCJzdWJtaXRcIi8qfHxpbnB1dFR5cGU9PT1cImltYWdlXCIqLykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IFwic3VibWl0XCI7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXRUeXBlID09PSBcInJlc2V0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBcInJlc2V0XCI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgaWYgKCF0ZXh0KSB7XG4gICAgICAgICAgICAgICAgLy8gbG9vayBmb3IgYSA8bGFiZWw+IGVsZW1lbnRcbiAgICAgICAgICAgICAgICBsZXQgbGFiZWxFbGVtID0gQ29tbW9uVXRpbC5nZXRMYWJlbEZvckVsZW1lbnRIaWRkZW4ocnVsZUNvbnRleHQsIHRydWUpO1xuICAgICAgICAgICAgICAgIGlmICghbGFiZWxFbGVtKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwYXJlbnROb2RlID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImxhYmVsXCIgLyomJiBSUFRVdGlsLmlzRmlyc3RGb3JtRWxlbWVudChwYXJlbnROb2RlLCBydWxlQ29udGV4dCkqLykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBhcmVudENsb25lID0gcGFyZW50Tm9kZS5jbG9uZU5vZGUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBleGNsdWRlIGFsbCBmb3JtIGVsZW1lbnRzIGZyb20gdGhlIGxhYmVsIHNpbmNlIHRoZXkgbWlnaHQgYWxzbyBoYXZlIGlubmVyIGNvbnRlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsRWxlbSA9IENvbW1vblV0aWwucmVtb3ZlQWxsRm9ybUVsZW1lbnRzRnJvbUxhYmVsKHBhcmVudENsb25lKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCBlbGVtZW50ID0gbGFiZWxFbGVtID8gbGFiZWxFbGVtIDogcnVsZUNvbnRleHQ7XG5cbiAgICAgICAgICAgICAgICBsZXQgZWxlbWVudHNUb1NraXBDb250ZW50Q2hlY2sgPSBbXCJtZXRlclwiLCBcIm91dHB1dFwiLCBcInByb2dyZXNzXCIsIFwic2VsZWN0XCIsIFwidGV4dGFyZWFcIl07XG4gICAgICAgICAgICAgICAgaWYgKCFsYWJlbEVsZW0gJiYgZWxlbWVudHNUb1NraXBDb250ZW50Q2hlY2suaW5kZXhPZihub2RlTmFtZSkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHRleHQgPSBcIlwiOyAvLyBza2lwIGNvbnRlbnQgY2hlY2sgZm9yIHNvbWUgZWxlbWVudHNcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIHZpc2libGUgdGV4dCBvbmx5XG4gICAgICAgICAgICAgICAgICAgIHRleHQgPSBDb21tb25VdGlsLmdldE9uU2NyZWVuSW5uZXJUZXh0KGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8qIE5vdGU6IERpc2FibGUgdGhpcyBhbHQgY2hlY2sgaW4gaW1hZ2VzIGZvciBub3cgdW50aWwgd2UgZ2V0IGNvbmZpcm1hdGlvblxuICAgICAgICAgICAgICAgIC8vIExvb2sgZm9yIHRoZSBhbHQgYXR0cmlidXRlIG9mIGFuIGltYWdlIHdoaWNoIGlzIGNvbnNpZGVyZWQgdmlzaWJsZSB0ZXh0LlxuICAgICAgICAgICAgICAgIGxldCBoYXNJbWdBbHQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5maXJzdENoaWxkICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG53ID0gUlBUVXRpbC5uZXcgTm9kZVdhbGtlcihlbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCFoYXNJbWdBbHQgJiYgbncubmV4dE5vZGUoKSAmJiBudy5ub2RlICE9IGVsZW1lbnQgJiYgbncubm9kZSAhPSBlbGVtZW50Lm5leHRTaWJsaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBoYXNJbWdBbHQgPSAobncubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09IFwiaW1nXCIgJiYgUlBUVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShudy5ub2RlLCBcImFsdFwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzSW1nQWx0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHRleHQgPyB0ZXh0ICsgbncubm9kZS5nZXRBdHRyaWJ1dGUoXCJhbHRcIikgOiBudy5ub2RlLmdldEF0dHJpYnV0ZShcImFsdFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgbm9uYWxwaGFudW1lcmljID0gL1teYS16QS1aMC05XS9nO1xuXG4gICAgICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKG5vbmFscGhhbnVtZXJpYywgXCIgXCIpOyAvLyBvbmx5IGNvbnNpZGVyIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzXG4gICAgICAgICAgICBsZXQgbm9ybWFsaXplZFRleHQgPSBDb21tb25VdGlsLm5vcm1hbGl6ZVNwYWNpbmcodGV4dCkudG9Mb3dlckNhc2UoKTsgLy8gTGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSBhbmQgZGlmZmVyZW5jZSBpbiBjYXNlIHNlbnNpdGl2aXR5IHNob3VsZCBiZSBpZ25vcmVkLlxuXG4gICAgICAgICAgICB0aGVMYWJlbCA9IHRoZUxhYmVsLnJlcGxhY2Uobm9uYWxwaGFudW1lcmljLCBcIiBcIik7IC8vIG9ubHkgY29uc2lkZXIgYWxwaGFudW1lcmljIGNoYXJhY3RlcnNcbiAgICAgICAgICAgIGxldCBub3JtYWxpemVkTGFiZWwgPSBDb21tb25VdGlsLm5vcm1hbGl6ZVNwYWNpbmcodGhlTGFiZWwpLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgICAgIGlmIChub3JtYWxpemVkVGV4dC5sZW5ndGggPiAxKSB7IC8vIHNraXAgbm9uLXRleHQgY29udGVudC4gZS5nLiwgPGJ1dHRvbiBhcmlhLWxhYmVsPVwiY2xvc2VcIj5YPC9idXR0b24+XG4gICAgICAgICAgICAgICAgbGV0IGxvY2F0aW9uID0gbm9ybWFsaXplZExhYmVsLmluZGV4T2Yobm9ybWFsaXplZFRleHQpO1xuXG4gICAgICAgICAgICAgICAgLy8gQXZvaWQgbWF0Y2hpbmcgcGFydGlhbCB3b3Jkcy5lLmcuLCB0ZXh0IFwibmFtZVwiIHNob3VsZCBub3QgbWF0Y2ggJ3N1cm5hbWUnIG9yICduYW1lcydcbiAgICAgICAgICAgICAgICBpZiAobG9jYXRpb24gPj0gMCAmJiBub3JtYWxpemVkTGFiZWwubGVuZ3RoID4gbm9ybWFsaXplZFRleHQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBsZXR0ZXJzID0gL15bMC05YS16QS1aXSskLztcbiAgICAgICAgICAgICAgICAgICAgaWYgKChsb2NhdGlvbiArIG5vcm1hbGl6ZWRUZXh0Lmxlbmd0aCkgPCBub3JtYWxpemVkTGFiZWwubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBlbmRpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0aGVDaGFyID0gbm9ybWFsaXplZExhYmVsLmNoYXJBdChsb2NhdGlvbiArIG5vcm1hbGl6ZWRUZXh0Lmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhlQ2hhci5tYXRjaChsZXR0ZXJzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXNzZWQgJiYgbG9jYXRpb24gPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBiZWdpbm5pbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0aGVDaGFyID0gbm9ybWFsaXplZExhYmVsLmNoYXJBdChsb2NhdGlvbiAtIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoZUNoYXIubWF0Y2gobGV0dGVycykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobG9jYXRpb24gPT09IC0xKSB7IC8vIGNoZWNrIHRoYXQgdmlzaWJsZSB0ZXh0IGNvbnRlbnQgb2YgdGhlIHRhcmdldCBpcyBjb250YWluZWQgd2l0aGluIGl0cyBhY2Nlc3NpYmxlIG5hbWUuXG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEZyYWdtZW50VXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9mcmFnbWVudFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGxhYmVsX3JlZl92YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJsYWJlbF9yZWZfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbTpsYWJlbFtmb3JdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfTGFiZWxfUmVmVmFsaWRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImZhaWxfaW52YWxpZFwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImxhYmVsX3JlZl92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfaW52YWxpZFwiOiBcImxhYmVsX3JlZl92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwibGFiZWxfcmVmX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlRoZSAnZm9yJyBhdHRyaWJ1dGUgZm9yIGEgbGFiZWwgcmVmZXJlbmNlYSBhIHVuaXF1ZSBub24tZW1wdHkgJ2lkJyBhdHRyaWJ1dGUgb2YgYSB2YWxpZCBlbGVtZW50XCIsXG4gICAgICAgICAgICBcImZhaWxfaW52YWxpZFwiOiBcIlRoZSB2YWx1ZSBcXFwiezB9XFxcIiBvZiB0aGUgJ2ZvcicgYXR0cmlidXRlIGlzIG5vdCB0aGUgJ2lkJyBvZiBhIHZhbGlkIGVsZW1lbnRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgJ2ZvcicgYXR0cmlidXRlIGZvciBhIGxhYmVsIHNob3VsZCByZWZlcmVuY2UgYSBub24tZW1wdHksIHVuaXF1ZSAnaWQnIGF0dHJpYnV0ZSBvZiBhIHZhbGlkIGVsZW1lbnRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBpZCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImZvclwiKTtcbiAgICAgICAgbGV0IHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICBsZXQgdGFyZ2V0ID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQocnVsZUNvbnRleHQsIGlkKTtcbiAgICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICAgICAgLy8gaWdub3JlIGlmIGJvdGggbGFiZWwgYW5kIGNvbnRyb2wgYXJlIGludmlzaWJsZVxuICAgICAgICAgICAgaWYgKCFWaXNVdGlsLmlzTm9kZVZpc2libGUodGFyZ2V0KSAmJiAhVmlzVXRpbC5pc05vZGVWaXNpYmxlKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIC8vIGhhbmRsZXMgbnVsbCBhbmQgdW5kZWZpbmVkXG4gICAgICAgICAgICBpZiAoIXRhcmdldC5oYXNBdHRyaWJ1dGUoXCJyb2xlXCIpKSB7XG4gICAgICAgICAgICAgICAgLy8gRmFpbCBpZiB3ZSdyZSBwb2ludGluZyBhdCBzb21ldGhpbmcgdGhhdCBpcyBsYWJlbGxlZCBieSBhbm90aGVyIG1lY2hhbmlzbVxuICAgICAgICAgICAgICAgIGxldCBub2RlTmFtZSA9IHRhcmdldC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9IG5vZGVOYW1lID09IFwiaW5wdXRcIiB8fCBub2RlTmFtZSA9PSBcInNlbGVjdFwiIHx8IG5vZGVOYW1lID09IFwidGV4dGFyZWFcIlxuICAgICAgICAgICAgICAgICAgICB8fCBub2RlTmFtZSA9PSBcImJ1dHRvblwiIHx8IG5vZGVOYW1lID09IFwiZGF0YWxpc3RcIlxuICAgICAgICAgICAgICAgICAgICB8fCBub2RlTmFtZSA9PSBcIm9wdGdyb3VwXCIgfHwgbm9kZU5hbWUgPT0gXCJvcHRpb25cIlxuICAgICAgICAgICAgICAgICAgICB8fCBub2RlTmFtZSA9PSBcImtleWdlblwiIHx8IG5vZGVOYW1lID09IFwib3V0cHV0XCJcbiAgICAgICAgICAgICAgICAgICAgfHwgbm9kZU5hbWUgPT0gXCJwcm9ncmVzc1wiIHx8IG5vZGVOYW1lID09IFwibWV0ZXJcIlxuICAgICAgICAgICAgICAgICAgICB8fCBub2RlTmFtZSA9PSBcImZpZWxkc2V0XCIgfHwgbm9kZU5hbWUgPT0gXCJsZWdlbmRcIjtcbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT0gXCJpbnB1dFwiICYmIHRhcmdldC5oYXNBdHRyaWJ1dGUoXCJ0eXBlXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0eXBlID0gdGFyZ2V0LmdldEF0dHJpYnV0ZShcInR5cGVcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gdHlwZSA9PSBcInRleHRcIiB8fCB0eXBlID09IFwicGFzc3dvcmRcIiB8fCB0eXBlID09IFwiZmlsZVwiIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlID09IFwiY2hlY2tib3hcIiB8fCB0eXBlID09IFwicmFkaW9cIiB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9PSBcImhpZGRlblwiIHx8IHR5cGUgPT0gXCJzZWFyY2hcIiB8fCB0eXBlID09IFwidGVsXCIgfHwgdHlwZSA9PSBcInVybFwiIHx8IHR5cGUgPT0gXCJlbWFpbFwiIHx8ICAvL0hUTUwgNVxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9PSBcImRhdGVcIiB8fCB0eXBlID09IFwibnVtYmVyXCIgfHwgdHlwZSA9PSBcInJhbmdlXCIgfHwgdHlwZSA9PSBcImltYWdlXCIgfHwgLy9IVE1MIDVcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPT0gXCJ0aW1lXCIgfHwgdHlwZSA9PSBcImNvbG9yXCIgfHwgIC8vIEhUTUwgNVxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9PSBcImRhdGV0aW1lLWxvY2FsXCIgfHwgdHlwZSA9PSBcIm1vbnRoXCIgfHwgdHlwZSA9PSBcIndlZWtcIjsgLy9IVE1MNS4xXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBBZGQgb25lIG1vcmUgY2hlY2sgdG8gbWFrZSBzdXJlIHRoZSB0YXJnZXQgZWxlbWVudCBpcyBOT1QgaGlkZGVuLCBpbiB0aGUgY2FzZSB0aGUgdGFyZ2V0IGlzIGhpZGRlblxuICAgICAgICAgICAgLy8gZmxhZyBhIHZpb2xhdGlvbiByZWdhcmRsZXNzIG9mIHdoYXQgdGhlIENoZWNrIEhpZGRlbiBDb250ZW50IHNldHRpbmcgaXMuXG4gICAgICAgICAgICBpZiAocGFzc2VkICYmICFWaXNVdGlsLmlzTm9kZVZpc2libGUodGFyZ2V0KSkge1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCByZXRUb2tlbjogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldFRva2VuLnB1c2goaWQpO1xuICAgICAgICB9XG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KHBhc3NlZCwgW3J1bGVDb250ZXh0XSwgJycsICcnLCBwYXNzZWQgPT0gdHJ1ZSA/IFtdIDogW3JldFRva2VuXSk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2ludmFsaWRcIiwgcmV0VG9rZW4pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuXG5leHBvcnQgY29uc3QgbGlzdF9jaGlsZHJlbl92YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJsaXN0X2NoaWxkcmVuX3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmdyb3VwXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJIQUFDX0xpc3RfR3JvdXBfTGlzdEl0ZW1cIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJsaXN0X2NoaWxkcmVuX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwibGlzdF9jaGlsZHJlbl92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwibGlzdF9jaGlsZHJlbl92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkxpc3QgY29tcG9uZW50IHdpdGggXFxcImdyb3VwXFxcIiByb2xlIGhhcyBjaGlsZHJlbiB0aGF0IGFyZSBub3QgPGxpc3RpdGVtPiBlbGVtZW50c1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkxpc3QgY29tcG9uZW50IHdpdGggXFxcImdyb3VwXFxcIiByb2xlIG11c3QgbGltaXQgY2hpbGRyZW4gdG8gPGxpc3RpdGVtPiBlbGVtZW50c1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHBhcmVudCA9IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKCFBcmlhVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MocGFyZW50LCBcImxpc3RcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGxldCBjaGlsZHJlbiA9IHJ1bGVDb250ZXh0LmNoaWxkcmVuO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgcGFzc2VkICYmIGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcGFzc2VkID0gQXJpYVV0aWwuaGFzUm9sZUluU2VtYW50aWNzKGNoaWxkcmVuW2ldLCBcImxpc3RpdGVtXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgbGlzdF9tYXJrdXBfcmV2aWV3OiBSdWxlID0ge1xuICAgIGlkOiBcImxpc3RfbWFya3VwX3Jldmlld1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9MaXN0X1VzZU1hcmt1cFwiOiB7XG4gICAgICAgICAgICAvLyBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgLy8gXCJwYXNzXCI6IFwibGlzdF9tYXJrdXBfcmV2aWV3Lmh0bWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX2xpc3RcIjogXCJsaXN0X21hcmt1cF9yZXZpZXcuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImxpc3RfbWFya3VwX3Jldmlldy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICAvLyBcInBhc3NcIjogXCJQcm9wZXIgSFRNTCBlbGVtZW50cyBhcmUgdXNlZCB0byBjcmVhdGUgYSBsaXN0XCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9saXN0XCI6IFwiVmVyaWZ5IHRoaXMgaXMgYSBsaXN0IGFuZCBpZiBzbywgbW9kaWZ5IHRvIHVzZSBwcm9wZXIgSFRNTCBlbGVtZW50cyBmb3IgdGhlIGxpc3RcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJQcm9wZXIgSFRNTCBlbGVtZW50cyBzaG91bGQgYmUgdXNlZCB0byBjcmVhdGUgYSBsaXN0XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG5cbiAgICAgICAgLy8gRXh0cmFjdCB0aGUgbm9kZU5hbWUgb2YgdGhlIGNvbnRleHQgbm9kZVxuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIG9yIGRpc2FibGVkXG4gICAgICAgIGlmIChDb21tb25VdGlsLmlzTm9kZURpc2FibGVkKHJ1bGVDb250ZXh0KSB8fCBWaXNVdGlsLmhpZGRlbkJ5RGVmYXVsdEVsZW1lbnRzLmluY2x1ZGVzKG5vZGVOYW1lKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIERvbid0IHRyaWdnZXIgaWYgd2UncmUgbm90IGluIHRoZSBib2R5IG9yIGlmIHdlJ3JlIGluIGEgc2NyaXB0XG4gICAgICAgIGlmIChDb21tb25VdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBbXCJib2R5XCJdKSA9PT0gbnVsbCkgXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICAvLyBpZ25vcmUgc2NyaXB0LCBsYWJlbCBhbmQgdGhlaXIgY2hpbGQgZWxlbWVudHNcbiAgICAgICAgaWYgKENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFtcInNjcmlwdFwiLCAnbGFiZWwnXSkgIT09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICAvLyBpZ25vcmUgYWxsIHdpZGdldHMgYW5kIHRoZWlyIGNoaWxkcmVuLCBhbmQgY2VydGFpbiBzdHJ1Y3R1cmUgcm9sZXNcbiAgICAgICAgbGV0IHJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXNXaXRoVHlwZXMocnVsZUNvbnRleHQsIFtcIndpZGdldFwiXSk7XG4gICAgICAgIC8vIGFkZCBzb21lIHN0cnVjdHVyZSByb2xlc1xuICAgICAgICBDb21tb25VdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QoW1wiY2FwdGlvblwiLCBcImNvZGVcIiwgXCJjb2x1bW5oZWFkZXJcIiwgIFwiZmlndXJlXCIsIFwibGlzdFwiLCBcImxpc3RpdGVtXCIsIFwibWF0aFwiLCBcIm1ldGVyXCIsIFwiY29sdW1uaGVhZGVyXCIsIFwicm93aGVhZGVyXCJdLCByb2xlcyk7XG4gICAgICAgIGlmIChBcmlhVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlcyhydWxlQ29udGV4dCwgcm9sZXMpICE9PSBudWxsKSBcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuICAgICAgICBsZXQgd2Fsa05vZGUgPSBydWxlQ29udGV4dC5maXJzdENoaWxkIGFzIE5vZGU7XG4gICAgICAgIHdoaWxlIChwYXNzZWQgJiYgd2Fsa05vZGUpIHtcbiAgICAgICAgICAgIC8vIENvbXBseSB0byB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyB3aWxsIGJlIGRvbmUgYnkgZGVmYXVsdCBhcyB0aGlzIHJ1bGUgdHJpZ2dlcnMgb24gZWFjaCBlbGVtZW50XG4gICAgICAgICAgICAvLyBhbmQgZm9yIGVhY2ggZWxlbWVudCBpdCBvbmx5IGNoZWNrcyB0aGF0IHNpbmdsZSBlbGVtZW50cyB0ZXh0IG5vZGVzIGFuZCBub3RoaW5nIGVsc2UuIFNvIGFsbCBpbm5lciBlbGVtZW50cyB3aWxsIGJlXG4gICAgICAgICAgICAvLyBjb3ZlcmVkIG9uIHRoZWlyIG93bi4gQ3VycmVudGx5IGZvciB0aGlzIHJ1bGUgYnkgZGVmYXVsdCBDaGVjayBIaWRkZW4gQ29udGVudCB3aWxsIHdvcmssIGFzIHdlIGFyZSBkb2luZ1xuICAgICAgICAgICAgLy8gYSBub2RlIHdhbGsgb25seSBvbiBzaWJsaW5ncyBzbyBpdCB3b3VsZCBub3QgZ2V0IHRleHQgbm9kZXMgZnJvbSBvdGhlciBzaWJsaW5ncyBhdCBhbGwuXG4gICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSBpbiB0aGUgZnV0dXJlIHNvbWV0aGluZyBjaGFuZ2VzLCBqdXN0IG5lZWQgdG8gYWRkICYmICFSUFRVdGlsLnNob3VsZE5vZGVCZVNraXBwZWRIaWRkZW4od2Fsa05vZGUpIHRvIHRoZSBiZWxvd1xuICAgICAgICAgICAgLy8gaWYuXG4gICAgICAgICAgICBpZiAod2Fsa05vZGUubm9kZU5hbWUgPT0gXCIjdGV4dFwiKSB7XG4gICAgICAgICAgICAgICAgbGV0IHR4dFZhbCA9IHdhbGtOb2RlLm5vZGVWYWx1ZTtcbiAgICAgICAgICAgICAgICBsZXQgZmFpbHVyZSA9IC9eWyBcXHRcXHJcXG5dKlsoIF0qWzEtOV0qW1xcKlxcLSkuXVsgXFx0XVtBLVosYS16XSsvLnRlc3QodHh0VmFsKTtcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSAhZmFpbHVyZTtcbiAgICAgICAgICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGVyZSdzIHNvbWUgc29ydCBvZiBibG9jayBsZXZlbCBlbGVtZW50IGJlZm9yZSB0aGlzXG4gICAgICAgICAgICAgICAgICAgIC8vIEF2b2lkIGZhaWx1cmVzIGR1ZSB0byB0aGluZ3MgbGlrZSA8aT5Tb21lIHNlbnRlbmNlPC9pPi4gTmV3IHNlbnRlbmNlLlxuICAgICAgICAgICAgICAgICAgICBsZXQgbncgPSBuZXcgRE9NV2Fsa2VyKHdhbGtOb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCFwYXNzZWQgJiYgbncucHJldk5vZGUoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5vZGVOYW1lID0gbncubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFtcImJsb2NrcXVvdGVcIiwgXCJjZW50ZXJcIiwgXCJkaXJcIiwgXCJkaXZcIiwgXCJmb3JtXCIsIFwiaDFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImgyXCIsIFwiaDNcIiwgXCJoNFwiLCBcImg1XCIsIFwiaDZcIiwgXCJoclwiLCBcImJyXCIsIFwibWVudVwiLCBcInBcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInByZVwiXS5pbmNsdWRlcyhub2RlTmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlTmFtZSA9PSBcIiN0ZXh0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdHh0ID0gbncubm9kZS5ub2RlVmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gdHh0Lmxlbmd0aCA+IDAgJiYgIVtcIiBcIiwgXCJcXHRcIiwgXCJcXG5cIl0uaW5jbHVkZXModHh0LmNoYXJBdCh0eHQubGVuZ3RoIC0gMSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2Fsa05vZGUgPSB3YWxrTm9kZS5uZXh0U2libGluZztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBudWxsO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfbGlzdFwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGxpc3Rfc3RydWN0dXJlX3Byb3BlcjogUnVsZSA9IHtcbiAgICBpZDogXCJsaXN0X3N0cnVjdHVyZV9wcm9wZXJcIixcbiAgICBjb250ZXh0OiBcImRvbTpkbCwgZG9tOnVsLCBkb206b2wsIGRvbTpkaXIsIGRvbTptZW51LCBkb206bGksIGRvbTpkZCwgZG9tOmR0XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfTGlzdF9NaXN1c2VcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwibGlzdF9zdHJ1Y3R1cmVfcHJvcGVyLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJsaXN0X3N0cnVjdHVyZV9wcm9wZXIuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImxpc3Rfc3RydWN0dXJlX3Byb3Blci5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiTGlzdCBlbGVtZW50IGlzIG1pc3Npbmcgb3IgaW1wcm9wZXJseSBzdHJ1Y3R1cmVkXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiTGlzdCBlbGVtZW50cyBzaG91bGQgb25seSBiZSB1c2VkIGZvciBsaXN0cyBvZiByZWxhdGVkIGl0ZW1zXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHBhc3NlZDtcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAvLyBHZXQgYWxsIHRoZSBjaGlsZHJlbnMgb2YgdGhlIHJ1bGVDb250ZXh0XG4gICAgICAgIGxldCBjaGlsZHJlbiA9IHJ1bGVDb250ZXh0LmNoaWxkcmVuXG5cbiAgICAgICAgaWYgKG5vZGVOYW1lID09IFwiZGxcIikge1xuICAgICAgICAgICAgbGV0IGZpcnN0ID0gXCJcIjtcbiAgICAgICAgICAgIGxldCBsYXN0ID0gXCJcIjtcbiAgICAgICAgICAgIGxldCB3YWxrQ2hpbGRyZW4gPSBydWxlQ29udGV4dC5maXJzdENoaWxkIGFzIE5vZGU7XG4gICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgbGV0IHByZXNlbnRhdGlvbmFsRm91bmQgPSBmYWxzZTtcblxuICAgICAgICAgICAgLy8gSWYgdGhlcmUgYXJlIG5vIGNoaWxkcmVucyBzZXQgYXMgcGFzc2VkLCBzaW5jZSBkbCBlbGVtZW50cyBjYW4gaGF2ZVxuICAgICAgICAgICAgLy8gemVybyBvciBtb3JlIG9mOiBvbmUgb3IgbW9yZSBkdCBlbGVtZW50cywgZm9sbG93ZWQgYnkgb25lIG9yIG1vcmUgZGQgZWxlbWVudHNcbiAgICAgICAgICAgIGlmICghcnVsZUNvbnRleHQuY2hpbGRyZW4gfHwgcnVsZUNvbnRleHQuY2hpbGRyZW4ubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB3aGlsZSAocGFzc2VkICYmIHdhbGtDaGlsZHJlbiAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh3YWxrQ2hpbGRyZW4ubm9kZVR5cGUgPT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5vZGVOYW1lID0gd2Fsa0NoaWxkcmVuLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdoaWxlIHdhbGtpbmcgdGhyb3VnaCB0aGUgZWxlbWVudHMgdW5kZXIgZGwsIGlmIHdlIGZpbmQgYSBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByZXNlbnRhdGlvbmFsIGVsZW1lbnQgd2UgbW92ZSB0byB0aGUgbmV4dCBlbGVtZW50IGFzIHByZXNlbnRhdGlvbmFsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlbGVtZW50cyBhcmUgYWxsb3dlZCB1bmRlciBsaXN0IGVsZW1lbnRzIGFzIHRoZXkgYXJlIG9ubHkgZm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3JtYXR0aW5nIHRleHQgbm9kZXMuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJpYVV0aWwuaXNQcmVzZW50YXRpb25hbEVsZW1lbnQod2Fsa0NoaWxkcmVuKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsRm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbGtDaGlsZHJlbiA9IHdhbGtDaGlsZHJlbi5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSBzZXQgdG8gcGFzcyBpZiB3ZSBmaW5kIGRkIG9yIGR0IGVsZW1lbnQsIGluIHRoZSBjYXNlIG9mXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbiBlbGVtZW50IHRoYXQgaXMgbm90IHN1cHBvcnRlZCB3ZSB3aWxsIGNhdGNoIGl0IGhlcmUuIGkuZS4gaW1nIFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWxlbWVudFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gbm9kZU5hbWUgPT0gXCJkZFwiIHx8IG5vZGVOYW1lID09IFwiZHRcIjtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2V0IHRoZSBmaXJzdCBhbmQgbGFzdCBub2RlIGRlcGVuZGluZyBvbiB3aGljaCBpcyBmb3VuZCBmaXJzdCBhbmQgbGFzdFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0ID09IFwiXCIpIGZpcnN0ID0gbm9kZU5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYXN0ID0gbm9kZU5hbWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgd2Fsa0NoaWxkcmVuID0gd2Fsa0NoaWxkcmVuLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IHdlIGhhdmUgZm91bmQgZHQgYW5kIGRkIGVsZW1lbnRzIHVuZGVyIGRsIHdlIHBhc3MgcmlnaHQgYXdheS5cbiAgICAgICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IHRoZXJlIGlzIG5vIGR0IG9yIGRkIGVsZW1lbnQsIGJ1dCBidW5jaCBvZiBwcmVzZW50YXRpb25hbCBlbGVtZW50cyB3ZSBtYXJrIHRoaXMgYXMgYVxuICAgICAgICAgICAgICAgIC8vIHBhc3MuIEluIHRoZSBjYXNlIHRoYXQgdGhlcmUgYXJlIG90aGVyIGVsZW1lbnRzLCBzdWNoIGFzIGltZyB3ZSB3aWxsIHN0aWxsIHRyaWdnZXIgYSB2aW9sYXRpb24uXG4gICAgICAgICAgICAgICAgcGFzc2VkID0gKHBhc3NlZCAmJiBmaXJzdCA9PSBcImR0XCIgJiYgbGFzdCA9PSBcImRkXCIpIHx8IChwYXNzZWQgJiYgcHJlc2VudGF0aW9uYWxGb3VuZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAobm9kZU5hbWUgPT0gXCJsaVwiKSB7XG4gICAgICAgICAgICBwYXNzZWQgPSBDb21tb25VdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBbXCJ1bFwiLCBcIm9sXCIsIFwiZGlyXCIsIFwibWVudVwiXSkgIT0gbnVsbDtcbiAgICAgICAgfSBlbHNlIGlmIChub2RlTmFtZSA9PSBcImRkXCIgfHwgbm9kZU5hbWUgPT0gXCJkdFwiKSB7XG4gICAgICAgICAgICBwYXNzZWQgPSBDb21tb25VdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBcImRsXCIpICE9IG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgd2Fsa0NoaWxkcmVuID0gcnVsZUNvbnRleHQuZmlyc3RDaGlsZCBhcyBOb2RlO1xuICAgICAgICAgICAgLy8gWmVybyBvciBtb3JlIGxpIGVsZW1lbnRzIGFyZSBwZXJtaXR0ZWQgaW5zaWRlIG9mIDxvbD4sIDx1bD4gb3IgPG1lbnU+IGVsZW1lbnRzIG5vdyBhcyBwZXIgdGhlIGh0bWw1IHNwZWMuIFRoaXMgaGFuZGxlcyB0aGUgY2FzZVxuICAgICAgICAgICAgLy8gd2hlbiB0aGVyZSBhcmUgemVybyBlbGVtZW50cyB1bmRlciB0aGUgPG9sPiwgPHVsPiBvciA8bWVudT4uXG4gICAgICAgICAgICBpZiAoKG5vZGVOYW1lID09IFwidWxcIiB8fCBub2RlTmFtZSA9PSBcIm9sXCIgfHwgbm9kZU5hbWUgPT0gXCJtZW51XCIpICYmICghcnVsZUNvbnRleHQuY2hpbGRyZW4gfHwgcnVsZUNvbnRleHQuY2hpbGRyZW4ubGVuZ3RoID09IDApKSB7XG4gICAgICAgICAgICAgICAgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IGxpRm91bmQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBsZXQgcHJlc2VudGF0aW9uYWxGb3VuZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHBhc3NlZCAmJiB3YWxrQ2hpbGRyZW4gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBXaGlsZSB3YWxraW5nIHRocm91Z2ggdGhlIGxpc3QgZWxlbWVudHMsIGlmIHdlIGZpbmQgYSBcbiAgICAgICAgICAgICAgICAgICAgLy8gcHJlc2VudGF0aW9uYWwgZWxlbWVudCB3ZSBza2lwIGNoZWNraW5nIGFzIHByZXNlbnRhdGlvbmFsXG4gICAgICAgICAgICAgICAgICAgIC8vIGVsZW1lbnRzIGFyZSBhbGxvd2VkIHVuZGVyIGxpc3QgZWxlbWVudHMgYXMgdGhleSBhcmUgb25seSBmb3JcbiAgICAgICAgICAgICAgICAgICAgLy8gZm9ybWF0dGluZyB0ZXh0LlxuICAgICAgICAgICAgICAgICAgICBpZiAoQXJpYVV0aWwuaXNQcmVzZW50YXRpb25hbEVsZW1lbnQod2Fsa0NoaWxkcmVuKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxGb3VuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB3YWxrQ2hpbGRyZW4gPSB3YWxrQ2hpbGRyZW4ubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIFBhc3MgaWYgdGhlIG5vZGUgdHlwZSBpcyBhbnl0aGluZyBidXQgMSwgb3IgaW4gdGhlIGNhc2UgdGhhdCBpdCBpcyBhIGxpIGVsZW1lbnQuIEZvciBhbnkgb3RoZXIgbm9kZSBcbiAgICAgICAgICAgICAgICAgICAgLy8gaXQgd2lsbCBiZSBjYXVnaHQgaGVyZSB0aGF0IGVsZW1lbnQgaXMgbm90IGFsbG93ZWQgdW5kZXIgbGlzdCBub2RlLlxuICAgICAgICAgICAgICAgICAgICAvLyBGdXJ0aGVybW9yZSBpbiB0aGUgY2FzZSB0aGF0IHRoZXJlIGlzIGEgdGVtcGxhdGUgZWxlbWVudCB3aXRoIHRoZSBwYXJlbnQgYmVpbmcgdWwvb2wgZG9uJ3QgZmxhZyBhIHZpb2xhdGlvblxuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSB3YWxrQ2hpbGRyZW4ubm9kZVR5cGUgIT0gMSB8fCB3YWxrQ2hpbGRyZW4ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSBcImxpXCIgfHwgKHdhbGtDaGlsZHJlbi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09IFwidGVtcGxhdGVcIiAmJiAobm9kZU5hbWUgPT0gXCJ1bFwiIHx8IG5vZGVOYW1lID09IFwib2xcIikpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFNldCBsaSBmb3VuZCB0byB0cnVlIGlmIHRoZSBjdXJyZW50IGVsZW1lbnQgKG5vZGVUeXBlPTEpIGlzIGFuIGxpIGVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgbGlGb3VuZCA9IGxpRm91bmQgfHwgKHdhbGtDaGlsZHJlbi5ub2RlVHlwZSA9PSAxICYmIHdhbGtDaGlsZHJlbi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09IFwibGlcIik7XG4gICAgICAgICAgICAgICAgICAgIHdhbGtDaGlsZHJlbiA9IHdhbGtDaGlsZHJlbi5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gSW4gdGhlIGNhc2UgdGhhdCBpdCBoYXMgcGFzc2VkIGFuZCBhbHNvIGxpIGVsZW1lbnQgaXMgZm91bmQgdW5kZXIgbGlzdCBub2RlLCB3ZSBwYXNzIHJpZ2h0IGF3YXkuXG4gICAgICAgICAgICAgICAgLy8gSW4gdGhlIGNhc2UgdGhhdCB0aGVyZSBpcyBubyBsaSBlbGVtZW50LCBidXQgYnVuY2ggb2YgcHJlc2VudGF0aW9uYWwgZWxlbWVudHMgd2UgbWFyayB0aGlzIGFzIGFcbiAgICAgICAgICAgICAgICAvLyBwYXNzLiBJbiB0aGUgY2FzZSB0aGF0IHRoZXJlIGFyZSBvdGhlciBlbGVtZW50cywgc3VjaCBhcyBpbWcgd2Ugd2lsbCBzdGlsbCB0cmlnZ2VyIGEgdmlvbGF0aW9uLlxuICAgICAgICAgICAgICAgIHBhc3NlZCA9IChwYXNzZWQgJiYgbGlGb3VuZCkgfHwgKHBhc3NlZCAmJiBwcmVzZW50YXRpb25hbEZvdW5kKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5cbmV4cG9ydCBjb25zdCBtYXJxdWVlX2VsZW1fYXZvaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwibWFycXVlZV9lbGVtX2F2b2lkXCIsXG4gICAgY29udGV4dDogXCJkb206bWFycXVlZVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX01hcnF1ZWVfVHJpZ2dlclwiOiB7XG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIm1hcnF1ZWVfZWxlbV9hdm9pZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwibWFycXVlZV9lbGVtX2F2b2lkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiU2Nyb2xsaW5nIGNvbnRlbnQgZm91bmQgdGhhdCB1c2VzIHRoZSBvYnNvbGV0ZSA8bWFycXVlZT4gZWxlbWVudFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSA8bWFycXVlZT4gZWxlbWVudCBpcyBvYnNvbGV0ZSBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjIuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vIEpDSCAtIE5PIE9VVCBPRiBTQ09QRSBoaWRkZW4gaW4gY29udGV4dFxuICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgbWVkaWFfYWx0X2JyaWVmOiBSdWxlID0ge1xuICAgIGlkOiBcIm1lZGlhX2FsdF9icmllZlwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmltZ1thbHRdLCBkb206YXBwbGV0W2FsdF0sIGRvbTphcmVhW2FsdF0sIGRvbTplbWJlZFthbHRdLCBkb206aW5wdXRbdHlwZV1bYWx0XVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX01lZGlhX0FsdEJyaWVmXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIm1lZGlhX2FsdF9icmllZi5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwibWVkaWFfYWx0X2JyaWVmLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJtZWRpYV9hbHRfYnJpZWYuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlRleHQgYWx0ZXJuYXRpdmUgaXMgbW9yZSB0aGFuIDE1MCBjaGFyYWN0ZXJzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQWx0ZXJuYXRpdmUgdGV4dCBpbiAnYWx0JyBhdHRyaWJ1dGUgc2hvdWxkIGJlIGJyaWVmICg8MTUwIGNoYXJhY3RlcnMpXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRlUGFyYW1zID0ge1xuICAgICAgICAgICAgbWF4QWx0OiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IDE1MCxcbiAgICAgICAgICAgICAgICB0eXBlOiBcImludGVnZXJcIlxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IGFsdExlbmd0aCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFsdFwiKS50cmltKCkubGVuZ3RoO1xuICAgICAgICBsZXQgcGFzc2VkID0gYWx0TGVuZ3RoIDw9IHZhbGlkYXRlUGFyYW1zLm1heEFsdC52YWx1ZTtcbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBtZWRpYV9hbHRfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcIm1lZGlhX2FsdF9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTphcmVhW2FsdF0sIGRvbTplbWJlZFthbHRdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfTWVkaWFfQXVkaW9WaWRlb0FsdEZpbGVuYW1lXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIm1lZGlhX2FsdF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIm1lZGlhX2FsdF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIm1lZGlhX2FsdF9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIkZpbGVuYW1lIHVzZWQgYXMgbGFiZWwgZm9yIGVtYmVkZGVkIGF1ZGlvIG9yIHZpZGVvXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQXVkaW8gb3IgdmlkZW8gb24gdGhlIHBhZ2UgbXVzdCBoYXZlIGEgc2hvcnQgdGV4dCBhbHRlcm5hdGl2ZSB0aGF0IGRlc2NyaWJlcyB0aGUgbWVkaWEgY29udGVudFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgdXJpID0gXCJcIjtcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT0gXCJhcmVhXCIpIHtcbiAgICAgICAgICAgIHVyaSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImhyZWZcIilcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHVyaSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInNyY1wiKVxuICAgICAgICB9XG4gICAgICAgIGlmICh1cmkgPT0gbnVsbCkgdXJpID0gXCJcIjtcbiAgICAgICAgbGV0IGV4dCA9IENvbW1vblV0aWwuZ2V0RmlsZUV4dCh1cmkpO1xuICAgICAgICBsZXQgaXNBdWRWaWQgPSBleHQubGVuZ3RoICE9IDAgJiYgKENvbW1vblV0aWwuaXNBdWRpb0V4dChleHQpIHx8IENvbW1vblV0aWwuaXNWaWRlb0V4dChleHQpKTtcbiAgICAgICAgbGV0IGFsdFRleHQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhbHRcIik7XG4gICAgICAgIGxldCBwYXNzZWQgPSAhaXNBdWRWaWQgfHwgKGFsdFRleHQubGVuZ3RoID4gMCAmJiBhbHRUZXh0LmluZGV4T2YoZXh0KSA9PSAtMSk7XG5cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVNYW51YWwsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IG1lZGlhX2F1ZGlvX3RyYW5zY3JpYmVkOiBSdWxlID0ge1xuICAgIGlkOiBcIm1lZGlhX2F1ZGlvX3RyYW5zY3JpYmVkXCIsXG4gICAgY29udGV4dDogXCJkb206Ymdzb3VuZCwgZG9tOmFbaHJlZl0sIGRvbTphcmVhW2hyZWZdLCBkb206ZW1iZWQsIGRvbTpvYmplY3RcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9NZWRpYV9BdWRpb1RyaWdnZXJcIjoge1xuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIk1hbnVhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIm1lZGlhX2F1ZGlvX3RyYW5zY3JpYmVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJtZWRpYV9hdWRpb190cmFuc2NyaWJlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwiUHJvdmlkZSB0cmFuc2NyaXB0cyBmb3IgYXVkaW8gZmlsZXNcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBdWRpbyBpbmZvcm1hdGlvbiBzaG91bGQgYWxzbyBiZSBhdmFpbGFibGUgaW4gdGV4dCBmb3JtXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjIuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgcGFzc2VkO1xuICAgICAgICBsZXQgdGhpc05vZGUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAodGhpc05vZGUgPT0gXCJiZ3NvdW5kXCIpIHtcbiAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGFzc2VkID0gIUNvbW1vblV0aWwuaXNBdWRpb09iakVtYmVkTGluayhydWxlQ29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIG51bGw7IC8vIE91dCBvZiBTY29wZVxuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVNYW51YWwoXCJNYW51YWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG5leHBvcnQgY29uc3QgbWVkaWFfYXV0b3N0YXJ0X2NvbnRyb2xsYWJsZTogUnVsZSA9IHtcbiAgICBpZDogXCJtZWRpYV9hdXRvc3RhcnRfY29udHJvbGxhYmxlXCIsXG4gICAgY29udGV4dDogXCJkb206cGFyYW1bbmFtZT1hdXRvcGxheV0sIGRvbTpwYXJhbVtuYW1lPWF1dG9zdGFydF0sIGRvbTplbWJlZFtmbGFzaHZhcnNdLCBkb206ZW1iZWRbc3JjXSwgZG9tOipbYXV0b3N0YXJ0PXRydWVdLCBkb206KlthdXRvc3RhcnQ9MV0sIGRvbTpiZ3NvdW5kXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfRW1iZWRfQXV0b1N0YXJ0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIm1lZGlhX2F1dG9zdGFydF9jb250cm9sbGFibGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIm1lZGlhX2F1dG9zdGFydF9jb250cm9sbGFibGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIm1lZGlhX2F1dG9zdGFydF9jb250cm9sbGFibGUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0aGVyZSBpcyBhIG1lY2hhbmlzbSB0byBwYXVzZSBvciBzdG9wIGFuZCBjb250cm9sIHRoZSB2b2x1bWUgZm9yIHRoZSBhdWRpbyB0aGF0IHBsYXlzIGF1dG9tYXRpY2FsbHlcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJNZWNoYW5pc20gbXVzdCBiZSBhdmFpbGFibGUgdG8gcGF1c2Ugb3Igc3RvcCBhbmQgY29udHJvbCB0aGUgdm9sdW1lIG9mIHRoZSBhdWRpbyB0aGF0IHBsYXlzIGF1dG9tYXRpY2FsbHlcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuNC4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGxldCBwYXNzZWQ7XG4gICAgICAgIGlmIChub2RlTmFtZSA9PSBcImJnc291bmRcIikge1xuICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSBpZiAobm9kZU5hbWUgPT0gXCJwYXJhbVwiKSB7XG4gICAgICAgICAgICBsZXQgY29udGVudCA9IFwiXCI7XG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidmFsdWVcIikpXG4gICAgICAgICAgICAgICAgY29udGVudCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInZhbHVlXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBwYXNzZWQgPSBjb250ZW50LmluZGV4T2YoXCIwO1wiKSA9PSAwIHx8XG4gICAgICAgICAgICAgICAgIShjb250ZW50LmluZGV4T2YoXCJ0cnVlXCIpICE9IC0xIHx8IGNvbnRlbnQuaW5kZXhPZihcIjFcIikgIT0gLTEpO1xuICAgICAgICB9IGVsc2UgaWYgKG5vZGVOYW1lID09IFwiZW1iZWRcIikge1xuICAgICAgICAgICAgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJmbGFzaHZhcnNcIikpIHtcbiAgICAgICAgICAgICAgICBsZXQgc3RyID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiZmxhc2h2YXJzXCIpO1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9IHN0ci5pbmRleE9mKFwiYXV0b3N0YXJ0PXRydWVcIikgPT0gLTEgJiZcbiAgICAgICAgICAgICAgICAgICAgc3RyLmluZGV4T2YoXCJhdXRvc3RhcnQ9MVwiKSA9PSAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwYXNzZWQgJiYgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwic3JjXCIpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHN0ciA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInNyY1wiKTtcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSBzdHIuaW5kZXhPZihcImF1dG9zdGFydD10cnVlXCIpID09IC0xICYmXG4gICAgICAgICAgICAgICAgICAgIHN0ci5pbmRleE9mKFwiYXV0b3N0YXJ0PTFcIikgPT0gLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZCAmJiBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhdXRvc3RhcnRcIikpIHtcbiAgICAgICAgICAgIGxldCB2YWwgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhdXRvc3RhcnRcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIHBhc3NlZCA9IHZhbCAhPSAndHJ1ZScgJiYgdmFsICE9ICcxJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFzc2VkID8gUnVsZVBhc3MoXCJQYXNzXzBcIikgOiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgbWVkaWFfa2V5Ym9hcmRfY29udHJvbGxhYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcIm1lZGlhX2tleWJvYXJkX2NvbnRyb2xsYWJsZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmF1ZGlvLCBkb206dmlkZW9cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIkhBQUNfQXVkaW9fVmlkZW9fVHJpZ2dlclwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIk1hbnVhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJtZWRpYV9rZXlib2FyZF9jb250cm9sbGFibGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIm1lZGlhX2tleWJvYXJkX2NvbnRyb2xsYWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwibWVkaWFfa2V5Ym9hcmRfY29udHJvbGxhYmxlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJWZXJpZnkgbWVkaWEgdXNpbmcgPGF1ZGlvPiBhbmQvb3IgPHZpZGVvPiBlbGVtZW50cyBoYXZlIGtleWJvYXJkIGFjY2Vzc2libGUgY29udHJvbHNcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJNZWRpYSB1c2luZyA8YXVkaW8+IGFuZC9vciA8dmlkZW8+IGVsZW1lbnRzIG11c3QgaGF2ZSBrZXlib2FyZCBhY2Nlc3NpYmxlIGNvbnRyb2xzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAobm9kZU5hbWUgPT0gXCJhdWRpb1wiIHx8IG5vZGVOYW1lID09PSBcInZpZGVvXCIpIHtcbiAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXNzZWQgPyBSdWxlUGFzcyhcIlBhc3NfMFwiKSA6IFJ1bGVNYW51YWwoXCJNYW51YWxfMVwiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlTWFudWFsLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IG1lZGlhX2xpdmVfY2FwdGlvbmVkOiBSdWxlID0ge1xuICAgIGlkOiBcIm1lZGlhX2xpdmVfY2FwdGlvbmVkXCIsXG4gICAgY29udGV4dDogXCJkb206ZW1iZWQsIGRvbTpvYmplY3RcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9NZWRpYV9WaWRlb09iamVjdFRyaWdnZXJcIjoge1xuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIk1hbnVhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIm1lZGlhX2xpdmVfY2FwdGlvbmVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJtZWRpYV9saXZlX2NhcHRpb25lZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwiVmVyaWZ5IGNhcHRpb25zIGFyZSBwcm92aWRlZCBmb3IgbGl2ZSBtZWRpYSAoc3RyZWFtaW5nIHZpZGVvIHdpdGggYXVkaW8pXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiTGl2ZSBtZWRpYSAoc3RyZWFtaW5nIHZpZGVvIHdpdGggYXVkaW8pIHNob3VsZCBoYXZlIGNhcHRpb25zIGZvciBhdWRpbyBjb250ZW50XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjIuNFwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSAhQ29tbW9uVXRpbC5pc1ZpZGVvT2JqRW1iZWRMaW5rKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZU1hbnVhbChcIk1hbnVhbF8xXCIpO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVNYW51YWwsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IG1lZGlhX3RyYWNrX2F2YWlsYWJsZTogUnVsZSA9IHtcbiAgICBpZDogXCJtZWRpYV90cmFja19hdmFpbGFibGVcIixcbiAgICBjb250ZXh0OiBcImRvbTphW2hyZWZdLCBkb206YXJlYVtocmVmXSwgZG9tOmFwcGxldCwgZG9tOmVtYmVkLCBkb206b2JqZWN0XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfTWVkaWFfVmlkZW9SZWZlcmVuY2VUcmlnZ2VyXCI6IHtcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJNYW51YWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJtZWRpYV90cmFja19hdmFpbGFibGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIm1lZGlhX3RyYWNrX2F2YWlsYWJsZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwiVmVyaWZ5IGF2YWlsYWJpbGl0eSBvZiBhIHVzZXItc2VsZWN0YWJsZSBhdWRpbyB0cmFjayB3aXRoIGRlc2NyaXB0aW9uIG9mIHZpc3VhbCBjb250ZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiUHJlLXJlY29yZGVkIG1lZGlhIHNob3VsZCBoYXZlIGFuIGF1ZGlvIHRyYWNrIHRoYXQgZGVzY3JpYmVzIHZpc3VhbCBpbmZvcm1hdGlvblwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4yLjNcIiwgXCIxLjIuNVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcblxuICAgICAgICBpZiAobm9kZU5hbWUgPT0gXCJhcHBsZXRcIikge1xuICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXNzZWQgPSAhQ29tbW9uVXRpbC5pc1ZpZGVvT2JqRW1iZWRMaW5rKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBudWxsO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVNYW51YWwoXCJNYW51YWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgbWV0YV9yZWRpcmVjdF9vcHRpb25hbDogUnVsZSA9IHtcbiAgICBpZDogXCJtZXRhX3JlZGlyZWN0X29wdGlvbmFsXCIsXG4gICAgY29udGV4dDogXCJkb206bWV0YVtodHRwLWVxdWl2XVtjb250ZW50XVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX01ldGFfUmVkaXJlY3RaZXJvXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiZmFpbFwiOiBcImZhaWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9sb25ncmVmcmVzaFwiOiBcImZhaWxfbG9uZ3JlZnJlc2hcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIm1ldGFfcmVkaXJlY3Rfb3B0aW9uYWwuaHRtbFwiLFxuICAgICAgICAgICAgXCJwYXNzXCI6IFwibWV0YV9yZWRpcmVjdF9vcHRpb25hbC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxcIjogXCJtZXRhX3JlZGlyZWN0X29wdGlvbmFsLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9sb25ncmVmcmVzaFwiOiBcIm1ldGFfcmVkaXJlY3Rfb3B0aW9uYWwuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIlBhZ2Ugc2hvdWxkIG5vdCBhdXRvbWF0aWNhbGx5IHJlZnJlc2ggd2l0aG91dCB3YXJuaW5nIG9yIG9wdGlvbiB0byB0dXJuIGl0IG9mZiBvciBhZGp1c3QgdGhlIHRpbWUgbGltaXRcIixcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcImZhaWxcIjogXCJDaGVjayBwYWdlIGRvZXMgbm90IGF1dG9tYXRpY2FsbHkgcmVmcmVzaCB3aXRob3V0IHdhcm5pbmcgb3Igb3B0aW9uc1wiLFxuICAgICAgICAgICAgXCJmYWlsX2xvbmdyZWZyZXNoXCI6IFwiQ2hlY2sgcGFnZSBkb2VzIG5vdCBhdXRvbWF0aWNhbGx5IHJlZnJlc2ggd2l0aG91dCB3YXJuaW5nIG9yIG9wdGlvbnNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBkZXByZWNhdGUgV0NBRyBBQUFcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuMi40XCIsIFwiMy4yLjVcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgKi9cbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi4yLjRcIiwgXCIzLjIuNVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICAvLyBSZW1vdmVkIEFDVCBiaXN6NTggQUFBXG4gICAgLyoqYWN0OiBbeyBcbiAgICAgICAgXCJiYzY1OWFcIiA6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiZmFpbFwiOiBcImZhaWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9sb25ncmVmcmVzaFwiOiBcInBhc3NcIlxuICAgICAgICB9XG4gICAgfV0sKi9cbiAgICBhY3Q6IFsgXCJiaXN6NThcIl0sICAvLyBmYWlsIGV2ZW4gaWYgYSBwYWdlIGlzIHJlZGlyZWN0ZWQgYWZ0ZXIgbW9yZSB0aGFuIDIwIGhvdXJzICg3MjAwKVxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIFxuICAgICAgICBpZiAocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiaHR0cC1lcXVpdlwiKS50b0xvd2VyQ2FzZSgpICE9PSAncmVmcmVzaCcpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGRvYyA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQ7XG4gICAgICAgIGlmICghZG9jKSByZXR1cm47XG5cbiAgICAgICAgLy8gY2hlY2sgaWYgdGhlIHJ1bGUgYWxyZWFkeSBwYXNzZWQgb3IgZmFpbGVkOiBvbmx5IHRoZSBmaXJzdCBvbmUgdHJpZGRlcnMgaWYgbXVsdGlwbGVcbiAgICAgICAgaWYgKENhY2hlVXRpbC5nZXRDYWNoZShkb2MsIFwibWV0YV9yZWRpcmVjdF9vcHRpb25hbF9kb25lXCIsIGZhbHNlKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsOyAgICBcblxuICAgICAgICBsZXQgY29udGVudCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImNvbnRlbnRcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKCFjb250ZW50IHx8IGNvbnRlbnQudHJpbSgpLmxlbmd0aCA9PT0wKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgbGV0IHRpbWU6bnVtYmVyID0gLTE7XG4gICAgICAgIGlmIChjb250ZW50Lm1hdGNoKC9eXFxkKyQvKSkgXG4gICAgICAgICAgICB0aW1lID0gcGFyc2VJbnQoY29udGVudCk7XG4gICAgICAgIGVsc2UgaWYgKGNvbnRlbnQubWF0Y2goL15cXGQrOy8pKSB7XG4gICAgICAgICAgICBsZXQgcG9zID0gY29udGVudC5pbmRleE9mKFwiO1wiKTtcbiAgICAgICAgICAgIHRpbWUgPSBwYXJzZUludChjb250ZW50LnN1YnN0cmluZygwLCBwb3MpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJbnZhbGlkIGNvbnRlbnQgZmllbGRcbiAgICAgICAgaWYgKHRpbWUgPT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShkb2MsIFwibWV0YV9yZWRpcmVjdF9vcHRpb25hbF9kb25lXCIsIHRydWUpO1xuICAgICAgICBpZiAodGltZSA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIGVsc2UgaWYgKHRpbWUgPCA3MjAwMSlcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxcIik7XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2xvbmdyZWZyZXNoXCIpOyAgICBcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBtZXRhX3JlZnJlc2hfZGVsYXk6IFJ1bGUgPSB7XG4gICAgaWQ6IFwibWV0YV9yZWZyZXNoX2RlbGF5XCIsXG4gICAgY29udGV4dDogXCJkb206bWV0YVtodHRwLWVxdWl2XVtjb250ZW50XVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX01ldGFfUmVmcmVzaFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJwb3RlbnRpYWxfcmVmcmVzaFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwibWV0YV9yZWZyZXNoX2RlbGF5Lmh0bWxcIixcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIm1ldGFfcmVmcmVzaF9kZWxheS5odG1sXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9yZWZyZXNoXCI6IFwibWV0YV9yZWZyZXNoX2RlbGF5Lmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJQYWdlcyBzaG91bGQgbm90IHJlZnJlc2ggYXV0b21hdGljYWxseVwiLFxuICAgICAgICAgICAgXCJwYXNzXCI6IFwiUGFnZXMgZG8gbm90IHJlZnJlc2ggYXV0b21hdGljYWxseVwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfcmVmcmVzaFwiOiBcIlZlcmlmeSBwYWdlIGlzIG5vdCBiZWluZyBjYXVzZWQgdG8gcmVmcmVzaCBhdXRvbWF0aWNhbGx5XCIsXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi4yLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgLy9hY3Q6IFsgXCJiaXN6NThcIiwgXCJiYzY1OWFcIiBdLFxuICAgIGFjdDogWyBcImJjNjU5YVwiIF0sICAvLyBwYXNzIGlmIGEgcGFnZSBpcyByZWRpcmVjdGVkIGFmdGVyIG1vcmUgdGhhbiAyMCBob3VycyAoNzIwMClcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiaHR0cC1lcXVpdlwiKS50b0xvd2VyQ2FzZSgpICE9PSAncmVmcmVzaCcpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgZG9jID0gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudDtcbiAgICAgICAgaWYgKCFkb2MpIHJldHVybjtcblxuICAgICAgICAvLyBjaGVjayBpZiB0aGUgcnVsZSBhbHJlYWR5IHBhc3NlZDogdGhlIGZpcnN0IG9uZSB0YWtlcyBwcmlvcml0eVxuICAgICAgICBpZiAoQ2FjaGVVdGlsLmdldENhY2hlKGRvYywgXCJtZXRhX3JlZnJlc2hfZGVsYXlfZG9uZVwiLCBmYWxzZSkpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgY29udGVudCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImNvbnRlbnRcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKCFjb250ZW50IHx8IGNvbnRlbnQudHJpbSgpLmxlbmd0aCA9PT0wKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgbGV0IHRpbWU6bnVtYmVyID0gLTE7XG4gICAgICAgIGlmIChjb250ZW50Lm1hdGNoKC9eXFxkKyQvKSkgXG4gICAgICAgICAgICB0aW1lID0gcGFyc2VJbnQoY29udGVudCk7XG4gICAgICAgIGVsc2UgaWYgKGNvbnRlbnQubWF0Y2goL15cXGQrOy8pKSB7XG4gICAgICAgICAgICBsZXQgcG9zID0gY29udGVudC5pbmRleE9mKFwiO1wiKTtcbiAgICAgICAgICAgIHRpbWUgPSBwYXJzZUludChjb250ZW50LnN1YnN0cmluZygwLCBwb3MpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJbnZhbGlkIGNvbnRlbnQgZmllbGRcbiAgICAgICAgaWYgKHRpbWUgPT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShkb2MsIFwibWV0YV9yZWZyZXNoX2RlbGF5X2RvbmVcIiwgdHJ1ZSk7XG4gICAgICAgIGlmICh0aW1lID09PSAwKSBcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX3JlZnJlc2hcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5cbmV4cG9ydCBjb25zdCBtZXRhX3ZpZXdwb3J0X3pvb21hYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcIm1ldGFfdmlld3BvcnRfem9vbWFibGVcIixcbiAgICBjb250ZXh0OiBcImRvbTptZXRhW25hbWVdW2NvbnRlbnRdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJtZXRhX3ZpZXdwb3J0X3pvb21cIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwicG90ZW50aWFsX3pvb21hYmxlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJtZXRhX3ZpZXdwb3J0X3pvb21hYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIm1ldGFfdmlld3BvcnRfem9vbWFibGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfem9vbWFibGVcIjogXCJtZXRhX3ZpZXdwb3J0X3pvb21hYmxlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgJ21ldGFbbmFtZT12aWV3cG9ydF0nIHNob3VsZCBub3QgcHJldmVudCB0aGUgYnJvd3NlciB6b29taW5nIHRoZSBjb250ZW50XCIsXG4gICAgICAgICAgICBcInBhc3NcIjogXCJUaGUgJ21ldGFbbmFtZT12aWV3cG9ydF0nIGRvZXMgbm90IHByZXZlbnQgdGhlIGJyb3dzZXIgem9vbWluZyB0aGUgY29udGVudFwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfem9vbWFibGVcIjogXCJDb25maXJtIHRoZSAnbWV0YVtuYW1lPXZpZXdwb3J0XScgd2l0aCBcXFwiezB9XFxcIiBjYW4gYmUgem9vbWVkIGJ5IHVzZXJcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuNC40XCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbe1xuICAgICAgICBcImI0ZjBjM1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF96b29tYWJsZVwiOiBcImZhaWxcIlxuICAgICAgICB9XG4gICAgfV0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcblxuICAgICAgICBpZiAocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwibmFtZVwiKS50b0xvd2VyQ2FzZSgpICE9PSAndmlld3BvcnQnKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgbGV0IGNvbnRlbnQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJjb250ZW50XCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIC8vIG5laXRoZXIgbWF4aW11bS1zY2FsZSBub3IgdXNlci1zY2FsYWJsZSAoZGVmYXVsdCB5ZXMpXG4gICAgICAgIGlmICghY29udGVudCB8fCBjb250ZW50LnRyaW0oKSA9PT0gJycgfHwgKCFjb250ZW50LmluY2x1ZGVzKCdtYXhpbXVtLXNjYWxlJykgJiYgIWNvbnRlbnQuaW5jbHVkZXMoJ3VzZXItc2NhbGFibGUnKSkpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgdXNlcl9tc2cgPSBudWxsO1xuICAgICAgICBsZXQgbWF4X21zZyA9IG51bGw7XG4gICAgICAgIGNvbnN0IHByb3BzID0gY29udGVudC5zcGxpdChcIixcIik7XG4gICAgICAgIGxldCB1c2VyX3NjYWxlX3ZhbHVlID0gJ3llcyc7XG4gICAgICAgIGxldCBtYXhpbXVtX3NjYWxlX3ZhbHVlID0gJzIuMCc7XG4gICAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBwcm9wcykge1xuICAgICAgICAgICAgY29uc3QgcGllY2VzID0gcHJvcC50cmltKCkuc3BsaXQoJz0nKTtcbiAgICAgICAgICAgIGlmIChwaWVjZXMubGVuZ3RoIDwgMikgY29udGludWU7XG4gICAgICAgICAgICBpZiAocHJvcC5pbmNsdWRlcygndXNlci1zY2FsYWJsZScpKSB7XG4gICAgICAgICAgICAgICAgdXNlcl9tc2cgPSBwcm9wO1xuICAgICAgICAgICAgICAgIHVzZXJfc2NhbGVfdmFsdWUgPSBwaWVjZXNbMV0udHJpbSgpO1xuICAgICAgICAgICAgICAgIGlmICh1c2VyX3NjYWxlX3ZhbHVlLnN0YXJ0c1dpdGgoXCInXCIpIHx8IHVzZXJfc2NhbGVfdmFsdWUuc3RhcnRzV2l0aCgnXCInKSkge1xuICAgICAgICAgICAgICAgICAgICB1c2VyX3NjYWxlX3ZhbHVlID0gdXNlcl9zY2FsZV92YWx1ZS5zdWJzdHJpbmcoMSwgdXNlcl9zY2FsZV92YWx1ZS5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHByb3AuaW5jbHVkZXMoJ21heGltdW0tc2NhbGUnKSkge1xuICAgICAgICAgICAgICAgIG1heF9tc2cgPSBwcm9wO1xuICAgICAgICAgICAgICAgIG1heGltdW1fc2NhbGVfdmFsdWUgPSBwaWVjZXNbMV0udHJpbSgpO1xuICAgICAgICAgICAgICAgIGlmIChtYXhpbXVtX3NjYWxlX3ZhbHVlLnN0YXJ0c1dpdGgoXCInXCIpIHx8IG1heGltdW1fc2NhbGVfdmFsdWUuc3RhcnRzV2l0aCgnXCInKSkge1xuICAgICAgICAgICAgICAgICAgICBtYXhpbXVtX3NjYWxlX3ZhbHVlID0gbWF4aW11bV9zY2FsZV92YWx1ZS5zdWJzdHJpbmcoMSwgbWF4aW11bV9zY2FsZV92YWx1ZS5sZW5ndGggLSAxKS50cmltKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHZhbHVlID0gTnVtYmVyKHVzZXJfc2NhbGVfdmFsdWUpO1xuICAgICAgICBpZiAoIWlzTmFOKHZhbHVlKSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlID49IDEgfHwgdmFsdWUgPD0gLTEpIHVzZXJfc2NhbGVfdmFsdWUgPSAneWVzJztcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBtYXhpbXVtX3NjYWxlID0gMi4wO1xuICAgICAgICB2YWx1ZSA9IE51bWJlcihtYXhpbXVtX3NjYWxlX3ZhbHVlKTtcbiAgICAgICAgaWYgKCFpc05hTih2YWx1ZSkpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA8IDApIG1heGltdW1fc2NhbGUgPSAyLjA7XG4gICAgICAgICAgICBlbHNlIG1heGltdW1fc2NhbGUgPSB2YWx1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChtYXhpbXVtX3NjYWxlX3ZhbHVlID09PSAneWVzJykgbWF4aW11bV9zY2FsZSA9IDEuMDtcbiAgICAgICAgICAgIGVsc2UgbWF4aW11bV9zY2FsZSA9IDAuMTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHVzZXItc2NhbGFibGUgaXMgbm90IHNldCB0byAneWVzJywgaWdub3JlIG1heGltdW1fc2NhbGVcbiAgICAgICAgaWYgKHVzZXJfc2NhbGVfdmFsdWUgIT09ICd5ZXMnKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF96b29tYWJsZVwiLCBbdXNlcl9tc2ddKTtcbiAgICAgICAgfVxuICAgICAgICAvLyB1c2VyLXNjYWxhYmxlIGlzICd5ZXMnLCBidXQgbWF4aW11bV9zY2FsZSBpcyB0b28gc21hbGxcbiAgICAgICAgaWYgKG1heGltdW1fc2NhbGUgPCAyLjApIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX3pvb21hYmxlXCIsIFttYXhfbXNnXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3Qgbm9lbWJlZF9jb250ZW50X2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJub2VtYmVkX2NvbnRlbnRfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJkb206bm9lbWJlZFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiVmFsZXJpZV9Ob2VtYmVkX0hhc0NvbnRlbnRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIm5vZW1iZWRfY29udGVudF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIm5vZW1iZWRfY29udGVudF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIm5vZW1iZWRfY29udGVudF9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIkFkZCBkZXNjcmlwdGl2ZSB0ZXh0IHRvIHRoZSA8bm9lbWJlZD4gZWxlbWVudFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIjxub2VtYmVkPiBlbGVtZW50cyBzaG91bGQgY29udGFpbiBkZXNjcmlwdGl2ZSB0ZXh0XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9GT1VSXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBwYXNzZWQgPSBDb21tb25VdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbihydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgQWNjTmFtZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BY2NOYW1lVXRpbFwiO1xuXG5leHBvcnQgY29uc3Qgb2JqZWN0X3RleHRfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcIm9iamVjdF90ZXh0X2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOm9iamVjdFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX09iamVjdF9IYXNUZXh0XCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiZmFpbF9ub190ZXh0X2FsdGVybmF0aXZlXCI6IFwiZmFpbF9ub190ZXh0X2FsdGVybmF0aXZlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJvYmplY3RfdGV4dF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJwYXNzXCI6IFwib2JqZWN0X3RleHRfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9ub190ZXh0X2FsdGVybmF0aXZlXCI6IFwib2JqZWN0X3RleHRfZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCI8b2JqZWN0PiBlbGVtZW50IG11c3QgaGF2ZSBhIHRleHQgYWx0ZXJuYXRpdmUgZm9yIHRoZSBjb250ZW50IHJlbmRlcmVkIGJ5IHRoZSBvYmplY3RcIixcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIjxvYmplY3Q+IGVsZW1lbnQgaGFzIGEgdGV4dCBhbHRlcm5hdGl2ZVwiLFxuICAgICAgICAgICAgXCJmYWlsX25vX3RleHRfYWx0ZXJuYXRpdmVcIjogXCJBbiA8b2JqZWN0PiBlbGVtZW50IGRvZXMgbm90IGhhdmUgYSB0ZXh0IGFsdGVybmF0aXZlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBcIjhmYzNiNlwiLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIC8vIERldGVjdCBpZiB0aGlzIG9iamVjdCBpcyBvZiB0eXBlIHRleHQsIGJ5IGNoZWNraW5nIHRoZSBvYmplY3QgdHlwZSBpbiB0aGUgY2FzZSBpdCBpcyB0ZXh0IHRoZW4gZG8gbm90IHRyaWdnZXIgdGhpcyBydWxlXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0eXBlXCIpICYmIChydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpKS5pbmRleE9mKFwidGV4dFwiKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBpZ25vcmUgaWYgYW4gZXhwbGljaXQgcm9sZSBpcyBzcGVjaWZpZWQ6IGluY2x1ZGluZyAncHJlc2VudGF0aW9uJywgJ25vbmUnLCAnYXBwbGljYXRpb24nLCAnZG9jdW1lbnQnIG9yICdpbWcnXG4gICAgICAgIC8vIHRoaXMgY2FzZSB3aWxsIGJlIGNvdmVyZWQgaW4gb3RoZXIgcnVsZXNcbiAgICAgICAgbGV0IHJvbGUgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpO1xuICAgICAgICBpZiAocm9sZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQZXIgQUNULCBpZ25vcmUgZW1iZWRkZWQgSFRNTCBmaWxlc1xuICAgICAgICBsZXQgZGF0YSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImRhdGFcIik7XG4gICAgICAgIGxldCBleHQgPSBkYXRhICYmIHR5cGVvZiBkYXRhID09PSB0eXBlb2YgXCJcIiA/IGRhdGEuc3Vic3RyaW5nKGRhdGEubGFzdEluZGV4T2YoXCIuXCIpKSA6IFwiXCI7XG4gICAgICAgIGlmIChleHQgPT09IFwiLmh0bWxcIiB8fCBleHQgPT09IFwiLmh0bVwiKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgY29uc3QgcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZShydWxlQ29udGV4dCk7XG4gICAgICAgIGNvbnN0IHBhc3NlZCA9IHBhaXIgJiYgcGFpci5uYW1lICYmIHBhaXIubmFtZS50cmltKCkubGVuZ3RoID4gMDtcbiAgICAgICAgLy9sZXQgcGFzc2VkID0gQVJJQU1hcHBlci5jb21wdXRlTmFtZShydWxlQ29udGV4dCkudHJpbSgpLmxlbmd0aCA+IDA7XG4gICAgICAgIGlmIChwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX25vX3RleHRfYWx0ZXJuYXRpdmVcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgQW5jZXN0b3JVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2FuY2VzdG9yXCI7XG5cbmV4cG9ydCBjb25zdCBwYWdlX3RpdGxlX2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJwYWdlX3RpdGxlX2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmh0bWxcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9Eb2NfSGFzVGl0bGVcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkZhaWxfMlwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJGYWlsXzNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcInBhZ2VfdGl0bGVfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwicGFnZV90aXRsZV9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJwYWdlX3RpdGxlX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcInBhZ2VfdGl0bGVfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwicGFnZV90aXRsZV9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSBwYWdlIHNob3VsZCBoYXZlIGEgdGl0bGUgdGhhdCBjb3JyZWN0bHkgaWRlbnRpZmllcyB0aGUgc3ViamVjdCBvZiB0aGUgcGFnZVwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJNaXNzaW5nIDxoZWFkPiBlbGVtZW50IHNvIHRoZXJlIGNhbiBiZSBubyA8dGl0bGU+IGVsZW1lbnQgcHJlc2VudFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJNaXNzaW5nIDx0aXRsZT4gZWxlbWVudCBpbiA8aGVhZD4gZWxlbWVudFwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJUaGUgPHRpdGxlPiBlbGVtZW50IGlzIGVtcHR5IChubyBpbm5lckhUTUwpXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjQuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbe1xuICAgICAgICBcIjI3NzlhNVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJmYWlsXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcImZhaWxcIlxuICAgICAgICB9XG4gICAgfV0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgLy8gVGhpcyBydWxlIGRvZXMgbm90IGFwcGx5IGluc2lkZSBhIHByZXNlbnRhdGlvbmFsIGZyYW1lXG4gICAgICAgIGlmIChBbmNlc3RvclV0aWwuaXNGcmFtZShjb250ZXh0SGllcmFyY2hpZXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBOb2RlO1xuICAgICAgICAvLyBGaXJzdCwgZmluZCB0aGUgaGVhZCBlbGVtZW50XG4gICAgICAgIGxldCBmaW5kSGVhZCA9IHJ1bGVDb250ZXh0LmZpcnN0Q2hpbGQgYXMgTm9kZTtcbiAgICAgICAgbGV0IGZpbmRUaXRsZSA9IG51bGw7XG4gICAgICAgIHdoaWxlIChmaW5kSGVhZCAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoZmluZEhlYWQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSBcImhlYWRcIilcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGZpbmRIZWFkID0gZmluZEhlYWQubmV4dFNpYmxpbmc7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHBvc3NpYmxlVGl0bGVzID0gKHJ1bGVDb250ZXh0IGFzIEVsZW1lbnQpLnF1ZXJ5U2VsZWN0b3JBbGwoXCJ0aXRsZVwiKTtcbiAgICAgICAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgcG9zc2libGVUaXRsZXMubGVuZ3RoOyArK2lkeCkge1xuICAgICAgICAgICAgaWYgKCFDb21tb25VdGlsLmdldEFuY2VzdG9yKHBvc3NpYmxlVGl0bGVzW2lkeF0sIFtcInN2Z1wiXSkpIHtcbiAgICAgICAgICAgICAgICBmaW5kVGl0bGUgPSBwb3NzaWJsZVRpdGxlc1tpZHhdO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChmaW5kSGVhZCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKCFmaW5kVGl0bGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmluZFRpdGxlID09PSBudWxsKSB7IC8vIGRvbid0IGhhdmUgdGl0bGUgc2Vjb25kIFBvRlxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8yXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgd2UgZ2V0IGhlcmUgd2UgaGF2ZSA8aGVhZD4gYW5kIDx0aXRsZT5cblxuICAgICAgICBpZiAoZmluZFRpdGxlICE9IG51bGwgJiYgQ29tbW9uVXRpbC5nZXRJbm5lclRleHQoZmluZFRpdGxlKS50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9IGVsc2UgeyAvLyA8dGl0bGU+IGhhcyBubyBpbm5lckhUTUwgdGhpcmQgUG9GXG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzNcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBwYWdlX3RpdGxlX3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcInBhZ2VfdGl0bGVfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbTpoZWFkIGRvbTp0aXRsZVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX1RpdGxlX1ZhbGlkXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICAvLyBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMlwiOiBcIlBvdGVudGlhbF8yXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYWdlX3RpdGxlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIC8vIFwiRmFpbF8xXCI6IFwicGFnZV90aXRsZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8yXCI6IFwicGFnZV90aXRsZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwicGFnZV90aXRsZV92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICAvLyBcIkZhaWxfMVwiOiBcIlBhZ2UgPHRpdGxlPiBpcyBlbXB0eVwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMlwiOiBcIlZlcmlmeSB0aGF0IHVzaW5nIHRoZSBmaWxlbmFtZSBhcyB0aGUgcGFnZSA8dGl0bGU+IHZhbHVlIGlzIGRlc2NyaXB0aXZlXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiUGFnZSA8dGl0bGU+IHNob3VsZCBiZSBhIGRlc2NyaXB0aXZlIHRpdGxlLCByYXRoZXIgdGhhbiBhIGZpbGVuYW1lXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjQuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuXG4gICAgICAgIGxldCB0aXRsZVN0ciA9IENvbW1vblV0aWwuZ2V0SW5uZXJUZXh0KHJ1bGVDb250ZXh0KS50cmltKCk7XG5cbiAgICAgICAgLy8gYWxsb3cgLmNvbSwgLm5ldCBhbmQgLm9yZ1xuICAgICAgICBsZXQgdGl0bGVTdHJMb3dlcmNhc2UgPSB0aXRsZVN0ci50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAodGl0bGVTdHJMb3dlcmNhc2UuaW5jbHVkZXMoXCIuY29tXCIpIHx8IHRpdGxlU3RyTG93ZXJjYXNlLmluY2x1ZGVzKFwiLm5ldFwiKSB8fCB0aXRsZVN0ckxvd2VyY2FzZS5pbmNsdWRlcyhcIi5vcmdcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiLCBbdGl0bGVTdHJdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aXRsZVN0ci5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIC8vIFRoaXMgaXMgY292ZXJlZCBieSBwYWdlX3RpdGxlX2V4aXN0c1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7Ly9SdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBwYXNzZWQgPSAhL15cXFMqXFwuW2EtekEtWl17MSw0fSg/IS4pfF5odHRwcz86XFwvXFwvXFxTKi9pLnRlc3QodGl0bGVTdHIpO1xuXG4gICAgICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzJcIik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiLCBbdGl0bGVTdHJdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG5leHBvcnQgY29uc3Qgc2NyaXB0X2ZvY3VzX2JsdXJfcmV2aWV3OiBSdWxlID0ge1xuICAgIGlkOiBcInNjcmlwdF9mb2N1c19ibHVyX3Jldmlld1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbb25mb2N1c11cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9TY3JpcHRfRm9jdXNCbHVyc1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJzY3JpcHRfZm9jdXNfYmx1cl9yZXZpZXcuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcInNjcmlwdF9mb2N1c19ibHVyX3Jldmlldy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwic2NyaXB0X2ZvY3VzX2JsdXJfcmV2aWV3Lmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgc2NyaXB0IGRvZXMgbm90IHJlbW92ZSBmb2N1cyBmcm9tIGNvbnRlbnQgdGhhdCBub3JtYWxseSByZWNlaXZlcyBmb2N1c1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlNjcmlwdGluZyBtdXN0IG5vdCByZW1vdmUgZm9jdXMgZnJvbSBjb250ZW50IHRoYXQgbm9ybWFsbHkgcmVjZWl2ZXMgZm9jdXNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuMS4xXCIsIFwiMi40LjdcIiwgXCIzLjIuMVwiXSwgLy9tYXRjaCByZXF1aXJlbWVudHMgbGlzdGVkIGluIGhlbHBcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcGFzc2VkID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwib25mb2N1c1wiKS5pbmRleE9mKFwiLmJsdXIoXCIpID09IC0xO1xuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgY29uc3Qgc2NyaXB0X29uY2xpY2tfYXZvaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwic2NyaXB0X29uY2xpY2tfYXZvaWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqW29uY2xpY2tdXCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJzY3JpcHRfb25jbGlja19taXN1c2VcIl0sXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfU2NyaXB0X09uY2xpY2tIVE1MMlwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJzY3JpcHRfb25jbGlja19hdm9pZC5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwic2NyaXB0X29uY2xpY2tfYXZvaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInNjcmlwdF9vbmNsaWNrX2F2b2lkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgdGhhdCAnb25jbGljaycgZXZlbnRzIGFyZSBub3QgdXNlZCBpbiBzY3JpcHQgdG8gZW11bGF0ZSBhIGxpbmtcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJTY3JpcHRzIHNob3VsZCBub3QgYmUgdXNlZCB0byBlbXVsYXRlIGxpbmtzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjEuMVwiXSwgLy9oZWxwIGFuZCBtYXRjaCBtYXBwaW5nIHRvIDIuMS4xIG9ubHkgXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfRk9VUlxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy8gRG9uJ3QgdHJpZ2dlciB0aGlzIGZvciBTVkcgZWxlbWVudCBmb3Igbm93IHVudGlsIGEgZGV0ZXJtaW5hdGlvbiBpcyBtYWRlIChieSBSaWNoKVxuICAgICAgICAvLyB0byBzdXBwb3J0IFNWRyBhdCBhIHBvaW50IHdoZW4gdGhlIFNWRyBhMTF5IHNwZWMgaXMgcmVhZHkuXG4gICAgICAgIGlmIChDb21tb25VdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBcInN2Z1wiKSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIHRoZXJlJ3MgYW4gYXJpYS1yb2xlIHNwZWNpZmllZCwgZG9uJ3QgdHJpZ2dlciB0aGlzLlxuICAgICAgICBpZiAoQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJyb2xlXCIpKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuXG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGxldCBwYXNzZWQgPSBub2RlTmFtZSA9PSBcImFcIiB8fCBub2RlTmFtZSA9PSBcImFyZWFcIiB8fCBub2RlTmFtZSA9PSBcImlucHV0XCI7XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBzY3JpcHRfb25jbGlja19taXN1c2U6IFJ1bGUgPSB7XG4gICAgaWQ6IFwic2NyaXB0X29uY2xpY2tfbWlzdXNlXCIsXG4gICAgY29udGV4dDogXCJkb206KltvbmNsaWNrXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX1NjcmlwdF9PbmNsaWNrSFRNTDFcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwic2NyaXB0X29uY2xpY2tfbWlzdXNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJzY3JpcHRfb25jbGlja19taXN1c2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInNjcmlwdF9vbmNsaWNrX21pc3VzZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG9zc2libGUgdXNlIG9mIGEgc2NyaXB0IHRvIGVtdWxhdGUgYSBsaW5rXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiU2NyaXB0cyBzaG91bGQgbm90IGJlIHVzZWQgdG8gZW11bGF0ZSBsaW5rc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi4xLjFcIl0sIC8vaGVscCBhbmQgbWF0Y2ggbWFwcGluZyB0byAyLjEuMSBvbmx5IFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRlUGFyYW1zID0ge1xuICAgICAgICAgICAgZmFpbFN1YnN0cmluZzoge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBbXCIuYXNwXCIsIFwiLmFzcHhcIiwgXCIuY2ZtXCIsIFwiLmNmbWxcIiwgXCIuY2dpXCIsIFwiLmh0bVwiLCBcIi5odG1sXCIsIFwiLnNodG1cIixcbiAgICAgICAgICAgICAgICAgICAgXCIuc2h0bWxcIiwgXCIucGhwXCIsIFwiLnBsXCIsIFwiLnB5XCIsIFwiLnNodG1cIiwgXCIuc2h0bWxcIiwgXCIueGh0bWxcIixcbiAgICAgICAgICAgICAgICAgICAgXCJsb2NhdGlvbi5ocmVmXCJdLFxuICAgICAgICAgICAgICAgIHR5cGU6IFwiW3N0cmluZ11cIlxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBJZiB0aGVyZSdzIGFuIGFyaWEtcm9sZSBzcGVjaWZpZWQsIGRvbid0IHRyaWdnZXIgdGhpcy5cbiAgICAgICAgbGV0IHBhc3NlZCA9IENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwicm9sZVwiKTtcbiAgICAgICAgLy8gSWYgdGhpcyBpcyBhbiBhIG9yIGFyZWEsIGRvbid0IHRyaWdnZXIgaWYgdGhlcmUncyBhbiBocmVmLlxuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBwYXNzZWQgPSBwYXNzZWQgfHwgKChub2RlTmFtZSA9PSBcImFcIiB8fCBub2RlTmFtZSA9PSBcImFyZWFcIikgJiYgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJocmVmXCIpKTtcblxuICAgICAgICAvLyBJZiB0aGUgZ3VhcmRzIGZhaWxlZCwgY2hlY2sgdG8gc2VlIGlmIHRoZXkncmUgbG9va2luZyBhdCBsaW5rc1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgbGV0IGZhaWxTdWJzdHJpbmcgPSB2YWxpZGF0ZVBhcmFtcy5mYWlsU3Vic3RyaW5nLnZhbHVlOztcbiAgICAgICAgICAgIGxldCBvbmNsaWNrID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwib25jbGlja1wiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBwYXNzZWQgJiYgaSA8IGZhaWxTdWJzdHJpbmcubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSBvbmNsaWNrLmluZGV4T2YoZmFpbFN1YnN0cmluZ1tpXSkgPT0gLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5cbmV4cG9ydCBjb25zdCBzY3JpcHRfc2VsZWN0X3JldmlldzogUnVsZSA9IHtcbiAgICBpZDogXCJzY3JpcHRfc2VsZWN0X3Jldmlld1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOnNlbGVjdFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX1NlbGVjdF9Ob0NoYW5nZUFjdGlvblwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJzY3JpcHRfc2VsZWN0X3Jldmlldy5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwic2NyaXB0X3NlbGVjdF9yZXZpZXcuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInNjcmlwdF9zZWxlY3RfcmV2aWV3Lmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgdGhhdCBubyBjaGFuZ2Ugb2YgY29udGV4dCBvciBhY3Rpb24gb2NjdXJzIHdoZW4gc2VsZWN0aW9uIG9wdGlvbnMgaW4gdGhpcyBjb21wb25lbnQgcmVjZWl2ZSBmb2N1c1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIk5vIGNoYW5nZXMgb2YgY29udGV4dCBzaG91bGQgb2NjdXIgd2hlbiBhIHNlbGVjdGlvbiB2YWx1ZSByZWNlaXZlcyBmb2N1c1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMy4yLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcGFzc2VkID0gIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9uY2hhbmdlXCIpICYmICFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmZvY3VzXCIpO1xuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgY29uc3Qgc2VsZWN0X29wdGlvbnNfZ3JvdXBlZDogUnVsZSA9IHtcbiAgICBpZDogXCJzZWxlY3Rfb3B0aW9uc19ncm91cGVkXCIsXG4gICAgY29udGV4dDogXCJkb206c2VsZWN0XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfU2VsZWN0X0hhc09wdEdyb3VwXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInNlbGVjdF9vcHRpb25zX2dyb3VwZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcInNlbGVjdF9vcHRpb25zX2dyb3VwZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInNlbGVjdF9vcHRpb25zX2dyb3VwZWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIkdyb3VwIG9mIHJlbGF0ZWQgb3B0aW9ucyBtYXkgbmVlZCA8b3B0Z3JvdXA+XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiR3JvdXBzIG9mIHJlbGF0ZWQgb3B0aW9ucyB3aXRoaW4gYSBzZWxlY3Rpb24gbGlzdCBzaG91bGQgYmUgZ3JvdXBlZCB3aXRoIDxvcHRncm91cD5cIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCB2YWxpZGF0ZVBhcmFtcyA9IHtcbiAgICAgICAgICAgIHBhcmFtTnVtT3B0aW9uczoge1xuICAgICAgICAgICAgICAgIHZhbHVlOiAxMCxcbiAgICAgICAgICAgICAgICB0eXBlOiBcImludGVnZXJcIlxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vIEhhbmRsZSB0aGUgY2FzZXMgd2hlcmUgb3B0Z3JvdXAgaXMgaGlkZGVuLCB3aGljaCBzaG91bGQgdHJpZ2dlciBhIHZpb2xhdGlvbnNcbiAgICAgICAgLy8gYnV0IGluIHRoZSBjYXNlIHRoYXQgQ2hlY2sgaGlkZGVuIG9wdGlvbiBpcyBzZXQgdGhlbiBzaG91bGQgbm90IHRyaWdnZXIgYSB2aW9sYXRpb24uXG4gICAgICAgIGxldCBwYXNzZWQgPSBDb21tb25VdGlsLmdldENoaWxkQnlUYWdIaWRkZW4ocnVsZUNvbnRleHQsIFwib3B0Z3JvdXBcIiwgZmFsc2UsIHRydWUpLmxlbmd0aCA+IDAgfHxcbiAgICAgICAgICAgIENvbW1vblV0aWwuZ2V0Q2hpbGRCeVRhZ0hpZGRlbihydWxlQ29udGV4dCwgXCJvcHRpb25cIiwgZmFsc2UsIHRydWUpLmxlbmd0aCA8PVxuICAgICAgICAgICAgdmFsaWRhdGVQYXJhbXMucGFyYW1OdW1PcHRpb25zLnZhbHVlO1xuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3Qgc2tpcF9tYWluX2Rlc2NyaWJlZDogUnVsZSA9IHtcbiAgICBpZDogXCJza2lwX21haW5fZGVzY3JpYmVkXCIsXG4gICAgY29udGV4dDogXCJkb206Ym9keVwiLFxuICAgIGRlcGVuZGVuY2llczogW1wic2tpcF9tYWluX2V4aXN0c1wiXSxcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9Cb2R5X0ZpcnN0QUNvbnRhaW5zU2tpcFRleHRfTmF0aXZlX0hvc3RfU2VtYXRpY3NcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInNraXBfbWFpbl9kZXNjcmliZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcInNraXBfbWFpbl9kZXNjcmliZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInNraXBfbWFpbl9kZXNjcmliZWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0aGF0IGlmIHRoaXMgaHlwZXJsaW5rIHNraXBzIGNvbnRlbnQsIHRoZSBkZXNjcmlwdGlvbiBjb21tdW5pY2F0ZXMgd2hlcmUgaXQgbGlua3MgdG9cIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgZGVzY3JpcHRpb24gb2YgYSBoeXBlcmxpbmsgdXNlZCB0byBza2lwIGNvbnRlbnQgbXVzdCBjb21tdW5pY2F0ZSB3aGVyZSBpdCBsaW5rcyB0b1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi40LjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCB2YWxpZGF0ZVBhcmFtcyA9IHtcbiAgICAgICAgICAgIHBhcmFtU2tpcFRleHQ6IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogW1wic2tpcFwiLCBcImp1bXBcIl0sXG4gICAgICAgICAgICAgICAgdHlwZTogXCJbc3RyaW5nXVwiXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy8gR2V0IHRoZSBhbmNob3JzIG9uIHRoZSBwYWdlXG4gICAgICAgIGxldCBkb2MgPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50O1xuXG4gICAgICAgIC8vIENoZWNrIGZvciBsYW5kbWFya3MgZmlyc3RcbiAgICAgICAgbGV0IHBhc3NlZDtcbiAgICAgICAgaWYgKENhY2hlVXRpbC5nZXRDYWNoZShydWxlQ29udGV4dCwgXCJJQk1faGFzTGFuZG1hcmtzX0ltcGxpY2l0XCIsIG51bGwpID09PSBudWxsKSB7XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUocnVsZUNvbnRleHQsIFwiSUJNX2hhc0xhbmRtYXJrc19JbXBsaWNpdFwiLCBDb21tb25VdGlsLmdldEVsZW1lbnRzQnlSb2xlSGlkZGVuKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsIFtcImFwcGxpY2F0aW9uXCIsIFwiYmFubmVyXCIsIFwiY29tcGxlbWVudGFyeVwiLCBcImNvbnRlbnRpbmZvXCIsXG4gICAgICAgICAgICAgICAgXCJmb3JtXCIsIFwibWFpblwiLCBcIm5hdmlnYXRpb25cIiwgXCJzZWFyY2hcIlxuICAgICAgICAgICAgXSwgdHJ1ZSwgdHJ1ZSkubGVuZ3RoID4gMCk7XG4gICAgICAgIH1cbiAgICAgICAgcGFzc2VkID0gQ2FjaGVVdGlsLmdldENhY2hlKHJ1bGVDb250ZXh0LCBcIklCTV9oYXNMYW5kbWFya3NfSW1wbGljaXRcIiwgZmFsc2UpO1xuXG4gICAgICAgIGlmICghcGFzc2VkKSB7IC8vIE5vIGxhbmRtYXJrcywgY2hlY2sgZm9yIHNraXAgbGlua3NcbiAgICAgICAgICAgIGxldCBsaW5rcyA9IGRvYy5saW5rcztcbiAgICAgICAgICAgIC8vIFNraXAgbGluayBzaG91bGQgYmUgdGhlIGZpcnN0IG9uZSBvbiB0aGUgcGFnZSB3aXRoIGFuIGhyZWYgYXR0cmlidXRlIChpLmUuLCBsaW5rc1swXSlcbiAgICAgICAgICAgIC8vIGFsc28gaWYgdGhlIGZpcnN0IGxpbmsgaXMgaGlkZGVuIHRoZW4gd2Ugc2hvdWxkIGFsc28gdHJpZ2dlciBhIHZpb2xhdGlvbi5cbiAgICAgICAgICAgIGlmIChsaW5rcyAmJiBsaW5rcy5sZW5ndGggPiAwICYmIFZpc1V0aWwuaXNOb2RlVmlzaWJsZShsaW5rc1swXSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgdGVzdFRleHQgPSBDb21tb25VdGlsLmdldElubmVyVGV4dChkb2MubGlua3NbMF0pLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7ICFwYXNzZWQgJiYgaSA8IHZhbGlkYXRlUGFyYW1zLnBhcmFtU2tpcFRleHQudmFsdWUubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gdGVzdFRleHQuaW5kZXhPZih2YWxpZGF0ZVBhcmFtcy5wYXJhbVNraXBUZXh0LnZhbHVlW2ldKSAhPSAtMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgcGFzc2VkID0gZmFsc2U7XG5cbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IEFuY2VzdG9yVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9hbmNlc3RvclwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3Qgc2tpcF9tYWluX2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJza2lwX21haW5fZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJkb206Ym9keVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0JvZHlfRmlyc3RBU2tpcHNfTmF0aXZlX0hvc3RfU2VtYXRpY3NcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJza2lwX21haW5fZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwic2tpcF9tYWluX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwic2tpcF9tYWluX2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlRoZSBwYWdlIGRvZXMgbm90IHByb3ZpZGUgYSB3YXkgdG8gcXVpY2tseSBuYXZpZ2F0ZSB0byB0aGUgbWFpbiBjb250ZW50IChBUklBIFxcXCJtYWluXFxcIiBsYW5kbWFyayBvciBhIHNraXAgbGluaylcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJQYWdlcyBtdXN0IHByb3ZpZGUgYSB3YXkgdG8gc2tpcCBkaXJlY3RseSB0byB0aGUgbWFpbiBjb250ZW50XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjQuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIC8vIFRoaXMgcnVsZSBkb2VzIG5vdCBhcHBseSBpbnNpZGUgYSBwcmVzZW50YXRpb25hbCBmcmFtZVxuICAgICAgICBpZiAoQW5jZXN0b3JVdGlsLmlzUHJlc2VudGF0aW9uRnJhbWUoY29udGV4dEhpZXJhcmNoaWVzKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy8gR2V0IHRoZSBhbmNob3JzIG9uIHRoZSBwYWdlXG4gICAgICAgIGxldCBkb2MgPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50O1xuXG4gICAgICAgIC8vIENoZWNrIGZvciBsYW5kbWFya3MgZmlyc3RcbiAgICAgICAgbGV0IHBhc3NlZDtcbiAgICAgICAgaWYgKENhY2hlVXRpbC5nZXRDYWNoZShydWxlQ29udGV4dCwgXCJJQk1faGFzTGFuZG1hcmtzX0ltcGxpY2l0XCIsIG51bGwpID09PSBudWxsKSB7XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUocnVsZUNvbnRleHQsIFwiSUJNX2hhc0xhbmRtYXJrc19JbXBsaWNpdFwiLCBDb21tb25VdGlsLmdldEVsZW1lbnRzQnlSb2xlSGlkZGVuKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsIFtcImFwcGxpY2F0aW9uXCIsIFwiYmFubmVyXCIsIFwiY29tcGxlbWVudGFyeVwiLCBcImNvbnRlbnRpbmZvXCIsXG4gICAgICAgICAgICAgICAgXCJmb3JtXCIsIFwibWFpblwiLCBcIm5hdmlnYXRpb25cIiwgXCJzZWFyY2hcIlxuICAgICAgICAgICAgXSwgdHJ1ZSwgdHJ1ZSkubGVuZ3RoID4gMCk7XG4gICAgICAgIH1cbiAgICAgICAgcGFzc2VkID0gQ2FjaGVVdGlsLmdldENhY2hlKHJ1bGVDb250ZXh0LCBcIklCTV9oYXNMYW5kbWFya3NfSW1wbGljaXRcIiwgZmFsc2UpO1xuXG4gICAgICAgIGlmICghcGFzc2VkKSB7IC8vIE5vIGxhbmRtYXJrcywgY2hlY2sgZm9yIHNraXAgbGlua3NcbiAgICAgICAgICAgIGxldCBhbmNob3JzID0gQ29tbW9uVXRpbC5nZXREb2NFbGVtZW50c0J5VGFnKHJ1bGVDb250ZXh0LCBcImFcIik7XG5cbiAgICAgICAgICAgIC8vIFNraXAgYW5jaG9yIHNob3VsZCBiZSB0aGUgZmlyc3Qgb25lIG9uIHRoZSBwYWdlIHdpdGggYW4gaHJlZiBhdHRyaWJ1dGVcbiAgICAgICAgICAgIGxldCB0ZXN0QW5jaG9yID0gbnVsbDtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYW5jaG9ycy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIGlmIChhbmNob3JzW2ldLmhhc0F0dHJpYnV0ZShcImhyZWZcIikgJiYgVmlzVXRpbC5pc05vZGVWaXNpYmxlKGFuY2hvcnNbaV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHRlc3RBbmNob3IgPSBhbmNob3JzW2ldO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFB1bGwgb3V0IHRoZSB0YXJnZXQgaWRcbiAgICAgICAgICAgIGxldCB0YXJnZXRJZCA9IG51bGw7XG4gICAgICAgICAgICBpZiAodGVzdEFuY2hvciAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgbGV0IGhyZWZTdHIgPSB0ZXN0QW5jaG9yLmdldEF0dHJpYnV0ZShcImhyZWZcIik7XG4gICAgICAgICAgICAgICAgbGV0IGlkeCA9IGhyZWZTdHIuaW5kZXhPZihcIiNcIik7XG4gICAgICAgICAgICAgICAgaWYgKGlkeCAhPSAtMSkge1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXRJZCA9IGhyZWZTdHIuc3Vic3RyaW5nKGlkeCArIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIERldGVybWluZSBpZiB0aGVyZSBpcyBhbiBlbGVtZW50IGlkIG9yIG5hbWVkIGFuY2hvciBvbiB0aGUgcGFnZSB3aXRoIHRoaXNcbiAgICAgICAgICAgIC8vIHRhcmdldCBpZC5cblxuICAgICAgICAgICAgaWYgKHRhcmdldElkICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSBkb2MuZ2V0RWxlbWVudEJ5SWQodGFyZ2V0SWQpICE9IG51bGw7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7ICFwYXNzZWQgJiYgaSA8IGFuY2hvcnMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFhbmNob3JzW2ldLmhhc0F0dHJpYnV0ZShcImhyZWZcIikgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGFuY2hvcnNbaV0uaGFzQXR0cmlidXRlKFwibmFtZVwiKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yc1tpXS5nZXRBdHRyaWJ1dGUoXCJuYW1lXCIpID09IHRhcmdldElkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KHBhc3NlZCwgW3J1bGVDb250ZXh0XSwgJycsICcnLCBbXSk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBzdHlsZV9iYWNrZ3JvdW5kX2RlY29yYXRpdmU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwic3R5bGVfYmFja2dyb3VuZF9kZWNvcmF0aXZlXCIsXG4gICAgY29udGV4dDogXCJkb206c3R5bGUsIGRvbToqW3N0eWxlXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX1N0eWxlX0JhY2tncm91bmRJbWFnZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJzdHlsZV9iYWNrZ3JvdW5kX2RlY29yYXRpdmUuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcInN0eWxlX2JhY2tncm91bmRfZGVjb3JhdGl2ZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwic3R5bGVfYmFja2dyb3VuZF9kZWNvcmF0aXZlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgdGhlIENTUyBiYWNrZ3JvdW5kIGltYWdlIGRvZXMgbm90IGNvbnZleSBpbXBvcnRhbnQgaW5mb3JtYXRpb25cIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJJbWFnZXMgaW5jbHVkZWQgYnkgdXNpbmcgQ1NTIGFsb25lIG11c3Qgbm90IGNvbnZleSBpbXBvcnRhbnQgaW5mb3JtYXRpb25cIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwibGlua1wiICYmIHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInJlbFwiKSAmJlxuICAgICAgICAgICAgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwicmVsXCIpLnRvTG93ZXJDYXNlKCkgPT09IFwic3R5bGVzaGVldFwiKSB7XG4gICAgICAgICAgICAvLyBFeHRlcm5hbCBzdHlsZXNoZWV0IC0gdHJpZ2dlclxuICAgICAgICAgICAgcGFzc2VkID0gQ29tbW9uVXRpbC50cmlnZ2VyT25jZShydWxlQ29udGV4dCwgXCJzdHlsZV9iYWNrZ3JvdW5kX2RlY29yYXRpdmVcIiwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWQgJiYgbm9kZU5hbWUgPT09IFwic3R5bGVcIiB8fCBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJzdHlsZVwiKSkge1xuICAgICAgICAgICAgbGV0IHN0eWxlVGV4dDtcbiAgICAgICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJzdHlsZVwiKVxuICAgICAgICAgICAgICAgIHN0eWxlVGV4dCA9IENvbW1vblV0aWwuZ2V0SW5uZXJUZXh0KHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBzdHlsZVRleHQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJzdHlsZVwiKTtcbiAgICAgICAgICAgIGxldCBiZ01hdGNoZXMgPSBzdHlsZVRleHQubWF0Y2goL2JhY2tncm91bmQ6W147XSovZyk7XG4gICAgICAgICAgICBpZiAoYmdNYXRjaGVzICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IHBhc3NlZCAmJiBpIDwgYmdNYXRjaGVzLmxlbmd0aDsgKytpKVxuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBiZ01hdGNoZXNbaV0uaW5kZXhPZihcInVybChcIikgPT09IC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ1NTVXRpbCB9IGZyb20gXCIuLi91dGlsL0NTU1V0aWxcIjtcblxuLyoqXG4gKiBEZXNjcmlwdGlvbjogVHJpZ2dlciBpZiA6YmVmb3JlIGFuZCA6YWZ0ZXIgYXJlIHVzZWQgaW4gQ1NTIChJbnRlcm5hbCBhbmQgRXh0ZXJuYWwpIHdpdGggY29udGVudFxuICogT3JpZ2luOiBXQ0FHIDIuMCBGODdcbiAqL1xuZXhwb3J0IGNvbnN0IHN0eWxlX2JlZm9yZV9hZnRlcl9yZXZpZXc6IFJ1bGUgPSB7XG4gICAgaWQ6IFwic3R5bGVfYmVmb3JlX2FmdGVyX3Jldmlld1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOnN0eWxlLCBkb206bGlua1wiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX1N0eWxlX0JlZm9yZUFmdGVyXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBgc3R5bGVfYmVmb3JlX2FmdGVyX3Jldmlldy5odG1sYCxcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IGBzdHlsZV9iZWZvcmVfYWZ0ZXJfcmV2aWV3Lmh0bWxgLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBgc3R5bGVfYmVmb3JlX2FmdGVyX3Jldmlldy5odG1sYFxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJEbyBub3QgdXNlIENTUyAnOjpiZWZvcmUnIGFuZCAnOjphZnRlcicgcHNldWRvLWVsZW1lbnRzIHRvIGluc2VydCBub24tZGVjb3JhdGl2ZSBjb250ZW50XCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVmVyaWZ5IHRoZSAnOjpiZWZvcmUnIGFuZCAnOjphZnRlcicgcHNldWRvLWVsZW1lbnRzIGRvIG5vdCBpbnNlcnQgbm9uLWRlY29yYXRpdmUgY29udGVudFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICAvLyBUdXJuIG9mZiB0aGUgcnVsZSBkdWUgdG8gdGhlIG9ic29sZXRlIHJlcXVpcmVtZW50XG4gICAgICAgIC8vaWQ6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgaWQ6IFtdLFxuICAgICAgICBudW06IFwiMS4zLjFcIiwgLy8gbnVtOiBbIFwiMi40LjRcIiwgXCJ4LnkuelwiIF0gYWxzbyBhbGxvd2VkXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIC8vY2hlY2sgSW50ZXJuYWwgc3R5bGVzICAgICAgICBcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwic3R5bGVcIikge1xuICAgICAgICAgICAgbGV0IGNzcyA9IENTU1V0aWwuZ2V0Q1NTU3R5bGUocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IHBhc3NlZCAmJiBpIDwgY3NzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgLy8gR3VhcmQgYWdhaW5zdCBiYWQgQ1NTXG4gICAgICAgICAgICAgICAgaWYgKGNzc1tpXS5zZWxlY3Rvcikge1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSAoY3NzW2ldLnNlbGVjdG9yLmluZGV4T2YoXCI6YmVmb3JlXCIpID09PSAtMSAmJiBjc3NbaV0uc2VsZWN0b3IuaW5kZXhPZihcIjphZnRlclwiKSA9PT0gLTEpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAhKFwiY29udGVudFwiIGluIGNzc1tpXS52YWx1ZXMpIHx8IGNzc1tpXS52YWx1ZXNbXCJjb250ZW50XCJdLnRyaW0oKS5sZW5ndGggPT09IDAgfHwgY3NzW2ldLnZhbHVlc1tcImNvbnRlbnRcIl0udHJpbSgpID09PSBcIlxcXCJcXFwiXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8IGNzc1tpXS52YWx1ZXNbXCJjb250ZW50XCJdLnRyaW0oKSA9PT0gXCJcXCdcXCdcIiB8fCBjc3NbaV0udmFsdWVzW1wiY29udGVudFwiXS50cmltKCkgPT09IFwibm9uZVwiIHx8IGNzc1tpXS52YWx1ZXNbXCJjb250ZW50XCJdLnRyaW0oKSA9PT0gXCJhdHRyKHgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8IGNzc1tpXS52YWx1ZXNbXCJjb250ZW50XCJdLnRyaW0oKSA9PT0gXCJhdHRyKHkpXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBjaGVjayBzcGVjaWFsIHJ1bGVzIGluIHRoZSBzdHlsZXNoZWV0c1xuICAgICAgICAgICAgaWYgKHBhc3NlZCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHNJbmRleCA9IDA7IHNJbmRleCA8IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHMubGVuZ3RoOyBzSW5kZXgrKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgc2hlZXQgPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LnN0eWxlU2hlZXRzW3NJbmRleF0gYXMgQ1NTU3R5bGVTaGVldDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNoZWV0Lm93bmVyTm9kZSA9PT0gcnVsZUNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0eWxlUnVsZXMgPSBzaGVldC5jc3NSdWxlcyA/IHNoZWV0LmNzc1J1bGVzIDogc2hlZXQucnVsZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlUnVsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgc3R5bGVSdWxlSW5kZXggPSAwOyBwYXNzZWQgJiYgc3R5bGVSdWxlSW5kZXggPCBzdHlsZVJ1bGVzLmxlbmd0aDsgc3R5bGVSdWxlSW5kZXgrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0eWxlUnVsZSA9IHN0eWxlUnVsZXNbc3R5bGVSdWxlSW5kZXhdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBAbWVkaWEgcnVsZXMgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGNoZWNrICdpZiAoc3R5bGVSdWxlIGluc3RhbmNlb2YgQ1NTTWVkaWFSdWxlKScgZG9lc24ndCB3b3JrIHdoZW4gcnVuIGluIEthcm1hKGJ1dCB3b3JrcyBpbiBEQVApIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc28gbGV0J3MgYWNjZXNzIHRoZSB0eXBlIGRpcmVjdGx5IGFzIGEgd29ya2Fyb3VuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0eWxlSW1wb3J0UnVsZTogQ1NTSW1wb3J0UnVsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZVJ1bGUudHlwZSAmJiBzdHlsZVJ1bGUudHlwZSA9PT0gNCAvKiBDU1NSdWxlLk1FRElBX1JVTEUgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3R5bGVNZWRpYVJ1bGUgPSBzdHlsZVJ1bGUgYXMgQ1NTTWVkaWFSdWxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtZWRpYVJ1bGVzID0gc3R5bGVNZWRpYVJ1bGUuY3NzUnVsZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lZGlhUnVsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgckluZGV4ID0gMDsgcGFzc2VkICYmIHJJbmRleCA8IG1lZGlhUnVsZXMubGVuZ3RoOyBySW5kZXgrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1SdWxlID0gbWVkaWFSdWxlc1tySW5kZXhdIGFzIGFueTsgLy8gc2VsZWN0b3JUZXh0IG5vdCByZWNvZ25pemVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVJ1bGUuc2VsZWN0b3JUZXh0ICE9PSBudWxsICYmIG1SdWxlLnNlbGVjdG9yVGV4dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGUgPSBtUnVsZS5zZWxlY3RvclRleHQudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZS5pbmRleE9mKFwiOmJlZm9yZVwiKSAhPT0gLTEgfHwgcnVsZS5pbmRleE9mKFwiOmFmdGVyXCIpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29udGVudCA9IG1SdWxlLnN0eWxlWydjb250ZW50J107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50ICYmIGNvbnRlbnQudHJpbSgpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQudHJpbSgpICE9PSBcIlxcXCJcXFwiXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LnRyaW0oKSAhPT0gXCJcXCdcXCdcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcIm5vbmVcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcImF0dHIoeClcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcImF0dHIoeSlcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBpbXBvcnQgcnVsZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0eWxlUnVsZS50eXBlICYmIHN0eWxlUnVsZS50eXBlID09PSAzIC8qIENTU1J1bGUuSU1QT1JUX1JVTEUgKi8gJiYgKHN0eWxlSW1wb3J0UnVsZSA9IHN0eWxlUnVsZSBhcyBDU1NJbXBvcnRSdWxlKS5zdHlsZVNoZWV0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGVzID0gc3R5bGVJbXBvcnRSdWxlLnN0eWxlU2hlZXQuY3NzUnVsZXMgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZUltcG9ydFJ1bGUuc3R5bGVTaGVldC5jc3NSdWxlcyA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlSW1wb3J0UnVsZS5zdHlsZVNoZWV0LnJ1bGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBySW5kZXggPSAwOyBwYXNzZWQgJiYgckluZGV4IDwgcnVsZXMubGVuZ3RoOyBySW5kZXgrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGltcG9ydGVkUnVsZSA9IHJ1bGVzW3JJbmRleF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBAbWVkaWEgcnVsZXMgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW1wb3J0ZWRSdWxlLnR5cGUgJiYgaW1wb3J0ZWRSdWxlLnR5cGUgPT09IDQgLyogQ1NTUnVsZS5NRURJQV9SVUxFICovKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1lZGlhUnVsZXMgPSAoaW1wb3J0ZWRSdWxlIGFzIENTU01lZGlhUnVsZSkuY3NzUnVsZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lZGlhUnVsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgbUluZGV4ID0gMDsgbUluZGV4IDwgbWVkaWFSdWxlcy5sZW5ndGg7IG1JbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbVJ1bGUgPSBtZWRpYVJ1bGVzW21JbmRleF0gYXMgYW55OyAvLyBzZWxlY3RvclRleHQgbm90IHJlY29nbml6ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtUnVsZS5zZWxlY3RvclRleHQgIT09IG51bGwgJiYgbVJ1bGUuc2VsZWN0b3JUZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcnVsZSA9IG1SdWxlLnNlbGVjdG9yVGV4dC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlLmluZGV4T2YoXCI6YmVmb3JlXCIpICE9PSAtMSB8fCBydWxlLmluZGV4T2YoXCI6YWZ0ZXJcIikgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb250ZW50ID0gbVJ1bGUuc3R5bGVbJ2NvbnRlbnQnXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQgJiYgY29udGVudC50cmltKCkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC50cmltKCkgIT09IFwiXFxcIlxcXCJcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcIlxcJ1xcJ1wiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC50cmltKCkgIT09IFwibm9uZVwiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC50cmltKCkgIT09IFwiYXR0cih4KVwiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC50cmltKCkgIT09IFwiYXR0cih5KVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgoaW1wb3J0ZWRSdWxlIGFzIGFueSkuc2VsZWN0b3JUZXh0ICE9PSBudWxsICYmIChpbXBvcnRlZFJ1bGUgYXMgYW55KS5zZWxlY3RvclRleHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBydWxlID0gKGltcG9ydGVkUnVsZSBhcyBhbnkpLnNlbGVjdG9yVGV4dC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vc3VwcG9ydCBib3RoIHNpbmdsZSBjb2xvbiAoOikgYW5kIGRvdWJsZSBjb2xvbiAoOjopIHBzZXVkbyAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlLmluZGV4T2YoXCI6YmVmb3JlXCIpICE9PSAtMSB8fCBydWxlLmluZGV4T2YoXCI6YWZ0ZXJcIikgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb250ZW50ID0gKGltcG9ydGVkUnVsZSBhcyBhbnkpLnN0eWxlWydjb250ZW50J107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50ICYmIGNvbnRlbnQudHJpbSgpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQudHJpbSgpICE9PSBcIlxcXCJcXFwiXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LnRyaW0oKSAhPT0gXCJcXCdcXCdcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcIm5vbmVcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcImF0dHIoeClcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcImF0dHIoeSlcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBjc3MgYWNjZXNzIGlzc3Vlc1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy9jaGVjayBleHRlcm5hbCBzdHlsZXMgXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImxpbmtcIiAmJiBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJyZWxcIikgJiZcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInJlbFwiKS50b0xvd2VyQ2FzZSgpID09PSBcInN0eWxlc2hlZXRcIiAmJlxuICAgICAgICAgICAgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiaHJlZlwiKSAmJiBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJocmVmXCIpLnRyaW0oKS5sZW5ndGggIT09IDApIHtcblxuICAgICAgICAgICAgZm9yIChsZXQgc0luZGV4ID0gMDsgc0luZGV4IDwgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5zdHlsZVNoZWV0cy5sZW5ndGg7IHNJbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNoZWV0ID0gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5zdHlsZVNoZWV0c1tzSW5kZXhdIGFzIENTU1N0eWxlU2hlZXQ7XG4gICAgICAgICAgICAgICAgaWYgKHNoZWV0ICYmIHNoZWV0Lm93bmVyTm9kZSA9PT0gcnVsZUNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBydWxlcyA9IHNoZWV0LmNzc1J1bGVzID8gc2hlZXQuY3NzUnVsZXMgOiBzaGVldC5ydWxlcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHJJbmRleCA9IDA7IHBhc3NlZCAmJiBySW5kZXggPCBydWxlcy5sZW5ndGg7IHJJbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBydWxlRnJvbUxpbmsgPSBydWxlc1tySW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBAbWVkaWEgcnVsZXMgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlRnJvbUxpbmsudHlwZSAmJiBydWxlRnJvbUxpbmsudHlwZSA9PT0gNCAvKiBDU1NSdWxlLk1FRElBX1JVTEUgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtZWRpYVJ1bGVzID0gKHJ1bGVGcm9tTGluayBhcyBDU1NNZWRpYVJ1bGUpLmNzc1J1bGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lZGlhUnVsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBtSW5kZXggPSAwOyBwYXNzZWQgJiYgbUluZGV4IDwgbWVkaWFSdWxlcy5sZW5ndGg7IG1JbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtUnVsZSA9IG1lZGlhUnVsZXNbbUluZGV4XSBhcyBhbnk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtUnVsZS5zZWxlY3RvclRleHQgIT09IG51bGwgJiYgbVJ1bGUuc2VsZWN0b3JUZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBydWxlU2VsVHh0ID0gbVJ1bGUuc2VsZWN0b3JUZXh0LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZVNlbFR4dC5pbmRleE9mKFwiOmJlZm9yZVwiKSAhPT0gLTEgfHwgcnVsZVNlbFR4dC5pbmRleE9mKFwiOmFmdGVyXCIpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb250ZW50ID0gbVJ1bGUuc3R5bGVbJ2NvbnRlbnQnXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudCAmJiBjb250ZW50LnRyaW0oKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQudHJpbSgpICE9PSBcIlxcXCJcXFwiXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcIlxcJ1xcJ1wiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LnRyaW0oKSAhPT0gXCJub25lXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcImF0dHIoeClcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC50cmltKCkgIT09IFwiYXR0cih5KVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgocnVsZXNbckluZGV4XSBhcyBhbnkpLnNlbGVjdG9yVGV4dCAhPT0gbnVsbCAmJiAocnVsZXNbckluZGV4XSBhcyBhbnkpLnNlbGVjdG9yVGV4dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcnVsZSA9IChydWxlc1tySW5kZXhdIGFzIGFueSkuc2VsZWN0b3JUZXh0LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3N1cHBvcnQgYm90aCBzaW5nbGUgY29sb24gKDopIGFuZCBkb3VibGUgY29sb24gKDo6KSBwc2V1ZG8gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlLmluZGV4T2YoXCI6YmVmb3JlXCIpICE9PSAtMSB8fCBydWxlLmluZGV4T2YoXCI6YWZ0ZXJcIikgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSAocnVsZXNbckluZGV4XSBhcyBhbnkpLnN0eWxlWydjb250ZW50J107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQgJiYgY29udGVudC50cmltKCkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LnRyaW0oKSAhPT0gXCJcXFwiXFxcIlwiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LnRyaW0oKSAhPT0gXCJcXCdcXCdcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC50cmltKCkgIT09IFwibm9uZVwiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LnRyaW0oKSAhPT0gXCJhdHRyKHgpXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcImF0dHIoeSlcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBjc3MgYWNjZXNzIGlzc3Vlc1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBzdHlsZV9jb2xvcl9taXN1c2U6IFJ1bGUgPSB7XG4gICAgaWQ6IFwic3R5bGVfY29sb3JfbWlzdXNlXCIsXG4gICAgY29udGV4dDogXCJkb206c3R5bGUsIGRvbToqW3N0eWxlXSwgZG9tOmZvbnRbY29sb3JdLCBkb206bGlua1wiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX1N0eWxlX0NvbG9yU2VtYW50aWNzMVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogYHN0eWxlX2NvbG9yX21pc3VzZS5odG1sYCxcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IGBzdHlsZV9jb2xvcl9taXN1c2UuaHRtbGAsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IGBzdHlsZV9jb2xvcl9taXN1c2UuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQ29tYmluZSBjb2xvciBhbmQgZGVzY3JpcHRpdmUgbWFya3VwIHRvIGNvbnZleSBpbmZvcm1hdGlvblwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSBjb2xvciBpcyBub3QgdXNlZCBhcyB0aGUgb25seSB2aXN1YWwgbWVhbnMgb2YgY29udmV5aW5nIGluZm9ybWF0aW9uXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIG51bTogXCIxLjQuMVwiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgbGV0IHN0eWxlVGV4dCA9IFwiXCI7XG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJzdHlsZVwiKSB7XG4gICAgICAgICAgICBzdHlsZVRleHQgPSBDb21tb25VdGlsLmdldElubmVyVGV4dChydWxlQ29udGV4dCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIC8vIGNoZWNrIGltcG9ydFxuICAgICAgICAgICAgZm9yIChsZXQgc0luZGV4ID0gMDsgc0luZGV4IDwgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5zdHlsZVNoZWV0cy5sZW5ndGg7IHNJbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNoZWV0ID0gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5zdHlsZVNoZWV0c1tzSW5kZXhdIGFzIENTU1N0eWxlU2hlZXQ7XG4gICAgICAgICAgICAgICAgaWYgKHNoZWV0ICYmIHNoZWV0Lm93bmVyTm9kZSA9PT0gcnVsZUNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHlsZVJ1bGVzID0gc2hlZXQuY3NzUnVsZXMgPyBzaGVldC5jc3NSdWxlcyA6IHNoZWV0LnJ1bGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgc3R5bGVSdWxlSW5kZXggPSAwOyBzdHlsZVJ1bGVJbmRleCA8IHN0eWxlUnVsZXMubGVuZ3RoOyBzdHlsZVJ1bGVJbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0eWxlUnVsZSA9IHN0eWxlUnVsZXNbc3R5bGVSdWxlSW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHlsZUltcG9ydFJ1bGU6IENTU0ltcG9ydFJ1bGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlUnVsZS50eXBlICYmIHN0eWxlUnVsZS50eXBlID09PSAzIC8qIENTU1J1bGUuSU1QT1JUX1JVTEUgKi8gJiYgKHN0eWxlSW1wb3J0UnVsZSA9IHN0eWxlUnVsZSBhcyBDU1NJbXBvcnRSdWxlKS5zdHlsZVNoZWV0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbXBvcnRSdWxlcyA9IHN0eWxlSW1wb3J0UnVsZS5zdHlsZVNoZWV0LmNzc1J1bGVzID8gc3R5bGVJbXBvcnRSdWxlLnN0eWxlU2hlZXQuY3NzUnVsZXMgOiBzdHlsZUltcG9ydFJ1bGUuc3R5bGVTaGVldC5ydWxlcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgckluZGV4ID0gMDsgckluZGV4IDwgaW1wb3J0UnVsZXMubGVuZ3RoOyBySW5kZXgrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlSdWxlID0gaW1wb3J0UnVsZXNbckluZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlVGV4dCArPSBpUnVsZS5jc3NUZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTaWxlbmNlIGNzcyBhY2Nlc3MgaXNzdWVzXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwic3R5bGVcIikpIHtcbiAgICAgICAgICAgIHN0eWxlVGV4dCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInN0eWxlXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobm9kZU5hbWUgPT09IFwibGlua1wiICYmIC8vY2hlY2sgZXh0ZXJuYWwgc3R5bGVzXG4gICAgICAgICAgICBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJyZWxcIikgJiZcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInJlbFwiKS50b0xvd2VyQ2FzZSgpID09PSBcInN0eWxlc2hlZXRcIiAmJlxuICAgICAgICAgICAgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiaHJlZlwiKSAmJlxuICAgICAgICAgICAgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKS50cmltKCkubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBzSW5kZXggPSAwOyBzSW5kZXggPCBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LnN0eWxlU2hlZXRzLmxlbmd0aDsgc0luZGV4KyspIHtcbiAgICAgICAgICAgICAgICBsZXQgc2hlZXQgPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LnN0eWxlU2hlZXRzW3NJbmRleF0gYXMgQ1NTU3R5bGVTaGVldDtcbiAgICAgICAgICAgICAgICBpZiAoc2hlZXQgJiYgc2hlZXQub3duZXJOb2RlID09PSBydWxlQ29udGV4dCkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGVzID0gc2hlZXQuY3NzUnVsZXMgPyBzaGVldC5jc3NSdWxlcyA6IHNoZWV0LnJ1bGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgckluZGV4ID0gMDsgckluZGV4IDwgcnVsZXMubGVuZ3RoOyBySW5kZXgrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlVGV4dCArPSBydWxlc1tySW5kZXhdLmNzc1RleHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNpbGVuY2UgY3NzIGFjY2VzcyBpc3N1ZXNcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcblxuICAgICAgICAvLyBEZWZlY3QgMTAyMjogRmluZCB1c2VzIG9mICdjb2xvcicgYW5kICcqYmFja2dyb3VuZConIG9ubHlcbiAgICAgICAgbGV0IGlzQmdVc2VkID0gc3R5bGVUZXh0Lm1hdGNoKC9cXGJiYWNrZ3JvdW5kXFxiL2kpO1xuXG4gICAgICAgIGxldCB0aGVDb2xvclN0eWxlVG9DaGVjayA9IHN0eWxlVGV4dC5yZXBsYWNlKC8tY29sb3IvZywgXCJcIik7XG4gICAgICAgIGxldCBpc0NvbG9yVXNlZCA9IHRoZUNvbG9yU3R5bGVUb0NoZWNrLm1hdGNoKC9cXGJjb2xvclxcYi9pKTtcblxuICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiY29sb3JcIikgfHwgaXNDb2xvclVzZWQgfHwgaXNCZ1VzZWQpIHtcbiAgICAgICAgICAgIGxldCBnb29kVGFnTmFtZXMgPSB7XG4gICAgICAgICAgICAgICAgXCJlbVwiOiBcIlwiLCBcInN0cm9uZ1wiOiBcIlwiLCBcImNpdGVcIjogXCJcIiwgXCJkZm5cIjogXCJcIixcbiAgICAgICAgICAgICAgICBcImNvZGVcIjogXCJcIiwgXCJzYW1wXCI6IFwiXCIsIFwia2JkXCI6IFwiXCIsIFwidmFyXCI6IFwiXCIsIFwiYWJiclwiOiBcIlwiLCBcImFjcm9ueW1cIjogXCJcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQ29sb3IgdXNlZCDvv70gYXJlIHRoZXJlIHNlbWFudGljcyBpbnZvbHZlZD9cbiAgICAgICAgICAgIHBhc3NlZCA9IG5vZGVOYW1lIGluIGdvb2RUYWdOYW1lcyB8fFxuICAgICAgICAgICAgICAgIENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIGdvb2RUYWdOYW1lcykgIT09IG51bGw7XG4gICAgICAgICAgICBpZiAoIXBhc3NlZCAmJiBydWxlQ29udGV4dC5oYXNDaGlsZE5vZGVzKCkpIHtcbiAgICAgICAgICAgICAgICBsZXQgbncgPSBuZXcgRE9NV2Fsa2VyKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgICAgICB3aGlsZSAoIXBhc3NlZCAmJiBudy5uZXh0Tm9kZSgpICYmIG53Lm5vZGUgIT09IHJ1bGVDb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IG53Lm5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSBpbiBnb29kVGFnTmFtZXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFRyaWdnZXIgb25seSBvbmNlXG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICBsZXQgdHJpZ2dlcmVkID0gQ2FjaGVVdGlsLmdldENhY2hlKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsIFwic3R5bGVfY29sb3JfbWlzdXNlXCIsIGZhbHNlKTtcbiAgICAgICAgICAgIHBhc3NlZCA9IHRyaWdnZXJlZDtcbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShydWxlQ29udGV4dC5vd25lckRvY3VtZW50LCBcInN0eWxlX2NvbG9yX21pc3VzZVwiLCB0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ1NTVXRpbCB9IGZyb20gXCIuLi91dGlsL0NTU1V0aWxcIjtcbmltcG9ydCB7IENvbG9yVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbG9yVXRpbFwiO1xuXG5leHBvcnQgY29uc3Qgc3R5bGVfZm9jdXNfdmlzaWJsZTogUnVsZSA9IHtcbiAgICBpZDogXCJzdHlsZV9mb2N1c192aXNpYmxlXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX1N0eWxlX0hpbmRlckZvY3VzMVwiOiB7XG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwicG90ZW50aWFsX2ZvY3VzX25vdF92aXNpYmxlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogYHN0eWxlX2ZvY3VzX3Zpc2libGUuaHRtbGAsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9mb2N1c19ub3RfdmlzaWJsZVwiOiBgc3R5bGVfZm9jdXNfdmlzaWJsZS5odG1sYCxcbiAgICAgICAgICAgIFwicGFzc19mb2N1c192aXNpYmxlXCI6IGBzdHlsZV9mb2N1c192aXNpYmxlLmh0bWxgXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSBrZXlib2FyZCBmb2N1cyBpbmRpY2F0b3Igc2hvdWxkIGJlIHZpc2libGUgd2hlbiBkZWZhdWx0IGJvcmRlciBvciBvdXRsaW5lIGlzIG1vZGlmaWVkIGJ5IENTU1wiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfZm9jdXNfbm90X3Zpc2libGVcIjogXCJDaGVjayB0aGUga2V5Ym9hcmQgZm9jdXMgaW5kaWNhdG9yIGlzIHZpc2libGUgd2hlbiB1c2luZyBDU1MgZGVjbGFyYXRpb24gZm9yICdib3JkZXInIG9yICdvdXRsaW5lJ1wiLFxuICAgICAgICAgICAgXCJwYXNzX2ZvY3VzX3Zpc2libGVcIjogXCJUaGUga2V5Ym9hcmQgZm9jdXMgaW5kaWNhdG9yIGlzIHZpc2libGUgb3IgaXMgbm90IGNoYW5nZWQgZnJvbSB0aGUgYnJvd3NlciBkZWZhdWx0XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIG51bTogXCIyLjQuN1wiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgdmFsaWRhdGVQYXJhbXMgPSB7XG4gICAgICAgICAgICBza2lwTm9kZXM6IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogW1widGFibGVcIl0sXG4gICAgICAgICAgICAgICAgdHlwZTogXCJbc3RyaW5nXVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2hlY2tQYXJhbXM6IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogW1wiYm9yZGVyXCIsIFwiYm9yZGVyLXdpZHRoXCIsIFwiYm9yZGVyLXN0eWxlXCIsIFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJib3JkZXItdG9wLXdpZHRoXCIsIFwiYm9yZGVyLXJpZ2h0LXdpZHRoXCIsIFwiYm9yZGVyLWJvdHRvbS13aWR0aFwiLCBcImJvcmRlci1sZWZ0LXdpZHRoXCIsIFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJib3JkZXItdG9wLWNvbG9yXCIsIFwiYm9yZGVyLXJpZ2h0LWNvbG9yXCIsIFwiYm9yZGVyLWJvdHRvbS1jb2xvclwiLCBcImJvcmRlci1sZWZ0LWNvbG9yXCIsIFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJib3JkZXItdG9wLXN0eWxlXCIsIFwiYm9yZGVyLXJpZ2h0LXN0eWxlXCIsIFwiYm9yZGVyLWJvdHRvbS1zdHlsZVwiLCBcImJvcmRlci1sZWZ0LXN0eWxlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIm91dGxpbmVcIiwgXCJvdXRsaW5lLXdpZHRoXCIsIFwib3V0bGluZS1jb2xvclwiLCBcIm91dGxpbmUtc3R5bGVcIl0sXG4gICAgICAgICAgICAgICAgdHlwZTogXCJbc3RyaW5nXVwiXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGlmICghQ29tbW9uVXRpbC5pc1RhYmJhYmxlKHJ1bGVDb250ZXh0KSB8fCB2YWxpZGF0ZVBhcmFtcy5za2lwTm9kZXMudmFsdWUuaW5jbHVkZXMocnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIC8vIEdldCBhbGwgc3R5bGVzIGluIGEgc2luZ2xlIHBhc3MgdGhyb3VnaCBzdHlsZXNoZWV0c1xuICAgICAgICBjb25zdCBhbGxTdHlsZXMgPSBDU1NVdGlsLmdldERlZmluZWRTdHlsZXNNdWx0aXBsZShydWxlQ29udGV4dCwgbnVsbCwgW1wiXCIsIFwiOmZvY3VzXCIsIFwiOmZvY3VzLXZpc2libGVcIiwgXCI6Zm9jdXMtd2l0aGluXCJdKTtcbiAgICAgICAgbGV0IG5vcm1hbFN0eWxlcyA9IGFsbFN0eWxlc1tcIlwiXTsgLy8gY29uc2lkZXIgYm90aCB1c2VyLWRlZmluZWQgYW5kIGJyb3dzZXIgZGVmYXVsdFxuICAgICAgICBsZXQgZm9jdXNTdHlsZXMgPSBbXVxuICAgICAgICBmb2N1c1N0eWxlcy5wdXNoKGFsbFN0eWxlc1tcIjpmb2N1c1wiXSk7XG4gICAgICAgIGZvY3VzU3R5bGVzLnB1c2goYWxsU3R5bGVzW1wiOmZvY3VzLXZpc2libGVcIl0pO1xuICAgICAgICBmb2N1c1N0eWxlcy5wdXNoKGFsbFN0eWxlc1tcIjpmb2N1cy13aXRoaW5cIl0pO1xuICAgICAgICBcbiAgICAgICAgLy8gaWYgZm9jdXMgc3R5bGUgaXMgZGVmaW5lZFxuICAgICAgICBsZXQgc3R5bGVPYmogPSBmb2N1c1N0eWxlc1swXTtcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHN0eWxlT2JqKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvL3Bhc3MgaWYgb3V0bGluZSBpcyBub3QgZGVmaW5lZCBhdCBhbGwsIGJyb3dzZXIgd2lsbCBvdmVycmlkZSBcbiAgICAgICAgICAgIGlmICgoKCFub3JtYWxTdHlsZXNbXCJvdXRsaW5lLXdpZHRoXCJdICYmICFub3JtYWxTdHlsZXNbXCJvdXRsaW5lLXN0eWxlXCJdKVxuICAgICAgICAgICAgICAgIHx8IChub3JtYWxTdHlsZXNbXCJvdXRsaW5lLXdpZHRoXCJdID09PSAnMHB4JyB8fCBub3JtYWxTdHlsZXNbXCJvdXRsaW5lLXN0eWxlXCJdID09PSAnbm9uZScpKVxuICAgICAgICAgICAgICAgICYmICghc3R5bGVPYmpbXCJvdXRsaW5lLXN0eWxlXCJdIHx8IHN0eWxlT2JqW1wib3V0bGluZS1zdHlsZVwiXSAhPT0gJ25vbmUnKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzX2ZvY3VzX3Zpc2libGVcIik7ICAgICAgIFxuXG4gICAgICAgICAgICBsZXQgbm9uZVN0eWxlID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgbnVtT3RoZXJTdHlsZSA9IDA7XG4gICAgICAgICAgICBmb3IgKGxldCBmb2N1c1N0eWxlIGluIHN0eWxlT2JqKSB7XG4gICAgICAgICAgICAgICAgaWYgKHZhbGlkYXRlUGFyYW1zLmNoZWNrUGFyYW1zLnZhbHVlLmluY2x1ZGVzKGZvY3VzU3R5bGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAgICAgKiBmYWlsdXJlIGNhc2U6ICBcbiAgICAgICAgICAgICAgICAgICAgICogIDEuIGZvY3VzIG91dGxpbmUgb3IgYm9yZGVyIHN0eWxlIGlzIG5vbmUgYW5kIG5vIG90aGVyIHN0eWxlIChjb2xvciBvciB3aWR0aCkgZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgKiAgMi4gZm9jdXMgb3V0bGluZSBvciBib3JkZXIgc3R5bGUgaXMgc2FtZSB3aXRoIHRoZSBub3JtYWxcbiAgICAgICAgICAgICAgICAgICAgICogIDMuIHNpemUgaW4gZm9jdXMgaXMgc2FtZSBvciBzbWFsbGVyIHRoYW4gZGVmYXVsdFxuICAgICAgICAgICAgICAgICAgICAgKiAgNC4gY29sb3IgY29udHJhc3QgaW4gZm9jdXMgaXMgYmV0dGVyICBcbiAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICAgIGxldCBmb2N1c1N0eWxlVmFsdWUgPSBzdHlsZU9ialtmb2N1c1N0eWxlXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5vcm1hbFN0eWxlVmFsdWUgPSBub3JtYWxTdHlsZXNbZm9jdXNTdHlsZV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChmb2N1c1N0eWxlLmluY2x1ZGVzKFwic3R5bGVcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb2N1c1N0eWxlVmFsdWUgPT09IFwibm9uZVwiKSBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25lU3R5bGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25lU3R5bGUgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vcm1hbFN0eWxlVmFsdWUgJiYgZm9jdXNTdHlsZVZhbHVlICE9PSBcIm5vbmVcIiAmJiBmb2N1c1N0eWxlVmFsdWUgPT09IG5vcm1hbFN0eWxlVmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfZm9jdXNfbm90X3Zpc2libGVcIik7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZvY3VzU3R5bGUuaW5jbHVkZXMoXCJ3aWR0aFwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbnVtT3RoZXJTdHlsZSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAvL3Byb3hpbWF0aW9uIG9mIHRoZSB3aWR0aCBzdHlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvY3VzU3R5bGVWYWx1ZSA9PT0gJ2luaXRpYWwnKSBmb2N1c1N0eWxlVmFsdWUgPSAnMnB4JztcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZvY3VzU3R5bGVWYWx1ZSA9PT0gJ3RoaW4nKSBmb2N1c1N0eWxlVmFsdWUgPSAnMXB4JztcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZvY3VzU3R5bGVWYWx1ZSA9PT0gJ21lZGl1bScpIGZvY3VzU3R5bGVWYWx1ZSA9ICcycHgnO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZm9jdXNTdHlsZVZhbHVlID09PSAndGhpY2snKSBmb2N1c1N0eWxlVmFsdWUgPSAnM3B4JzsgIFxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9ybWFsU3R5bGVWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub3JtYWxTdHlsZVZhbHVlID09PSAnaW5pdGlhbCcpIG5vcm1hbFN0eWxlVmFsdWUgPSAnMnB4JztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChub3JtYWxTdHlsZVZhbHVlID09PSAndGhpbicpIG5vcm1hbFN0eWxlVmFsdWUgPSAnMXB4JztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChub3JtYWxTdHlsZVZhbHVlID09PSAnbWVkaXVtJykgbm9ybWFsU3R5bGVWYWx1ZSA9ICcycHgnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5vcm1hbFN0eWxlVmFsdWUgPT09ICd0aGljaycpIG5vcm1hbFN0eWxlVmFsdWUgPSAnM3B4JzsgIFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZm9jdXNTdHlsZVZhbHVlID0gQ1NTVXRpbC5nZXRQaXhlbHNGcm9tU3R5bGUoZm9jdXNTdHlsZVZhbHVlLCBydWxlQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxTdHlsZVZhbHVlID0gQ1NTVXRpbC5nZXRQaXhlbHNGcm9tU3R5bGUobm9ybWFsU3R5bGVWYWx1ZSwgcnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvY3VzU3R5bGVWYWx1ZSA9PSAwIHx8IGZvY3VzU3R5bGVWYWx1ZSA8PSBub3JtYWxTdHlsZVZhbHVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX2ZvY3VzX25vdF92aXNpYmxlXCIpO1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmb2N1c1N0eWxlLmluY2x1ZGVzKFwiY29sb3JcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG51bU90aGVyU3R5bGUrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBlbGVtZW50IGJnIGNvbG9yXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29sb3JDb21ibyA9IENvbG9yVXRpbC5Db2xvckNvbWJvKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2xvckNvbWJvID09PSBudWxsKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBiZyA9IGNvbG9yQ29tYm8uYmc7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWJnKSBjb250aW51ZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy9wcm94aW1hdGlvbiBvZiB0aGUgd2lkdGggc3R5bGVcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb2N1c1N0eWxlVmFsdWUgPT09ICdpbml0aWFsJykgZm9jdXNTdHlsZVZhbHVlID0gJ2JsYWNrJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub3JtYWxTdHlsZVZhbHVlICYmIG5vcm1hbFN0eWxlVmFsdWUgPT09ICdpbml0aWFsJykgbm9ybWFsU3R5bGVWYWx1ZSA9ICdibGFjayc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGJvcmRlci9vdXRsaW5lIGNvbG9yIGFzIGZnIGNvbG9yc1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9jdXNTdHlsZVZhbHVlID0gQ29sb3JVdGlsLkNvbG9yKGZvY3VzU3R5bGVWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxTdHlsZVZhbHVlID0gQ29sb3JVdGlsLkNvbG9yKG5vcm1hbFN0eWxlVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvY3VzU3R5bGVWYWx1ZSA9PT0gbnVsbCB8fCBub3JtYWxTdHlsZVZhbHVlID09PSBudWxsKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgLy9nZXQgdGhlIGJvcmRlci9vdXRsaW5lIGNvbG9yIGNvbnRyYXN0IHJhdGlvc1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZvY3VzUmF0aW8gPSBmb2N1c1N0eWxlVmFsdWUuY29udHJhc3RSYXRpbyhiZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbm9ybWFsUmF0aW8gPSBub3JtYWxTdHlsZVZhbHVlLmNvbnRyYXN0UmF0aW8oYmcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvY3VzUmF0aW8gPCAzLjAgfHwgZm9jdXNSYXRpbyA8PSBub3JtYWxSYXRpbylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF9mb2N1c19ub3RfdmlzaWJsZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vb3RoZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIG51bU90aGVyU3R5bGUrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub3JtYWxTdHlsZVZhbHVlICE9IG51bGwgJiYgZm9jdXNTdHlsZVZhbHVlID09PSBub3JtYWxTdHlsZVZhbHVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX2ZvY3VzX25vdF92aXNpYmxlXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gd2FybiBpZiBhIGJvcmRlci9vdXRsaW5lIGZvY3VzIHN0eWxlIGlzICdub25lJyBhbmQgbm9lIG90aGVyIChjb2xvciBhbmQvb3Igd2lkdGgpIGlzIGRlZmluZWQgXG4gICAgICAgICAgICBpZiAobm9uZVN0eWxlICYmIG51bU90aGVyU3R5bGUgPT09IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfZm9jdXNfbm90X3Zpc2libGVcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBubyBmb2N1cyBzdHlsZSBkZWZpbmVkIFxuICAgICAgICAgICAgLy8gd2FybiBpZiBub3JtYWwgc3R5bGUgaXMgZGVmaW5lZCBhbmQgaXMgbm90IFwibm9uZVwiXG4gICAgICAgICAgICBmb3IgKGxldCBub3JtYWxTdHlsZSBpbiBub3JtYWxTdHlsZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAodmFsaWRhdGVQYXJhbXMuY2hlY2tQYXJhbXMudmFsdWUuaW5jbHVkZXMobm9ybWFsU3R5bGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBub3JtYWxTdHlsZVZhbHVlID0gbm9ybWFsU3R5bGVzW25vcm1hbFN0eWxlXTtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGlmIGJvcmRlciBvciBvdXRsaW5lIHN0eWxlIGlzIFwibm9uZVwiIFxuICAgICAgICAgICAgICAgICAgICBpZiAobm9ybWFsU3R5bGVWYWx1ZSAhPT0gJ25vbmUnKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfZm9jdXNfbm90X3Zpc2libGVcIik7XG4gICAgICAgICAgICAgICAgfSAgICAgICAgXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gICBcbiAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc19mb2N1c192aXNpYmxlXCIpO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDYWNoZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IHN0eWxlX2hpZ2hjb250cmFzdF92aXNpYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcInN0eWxlX2hpZ2hjb250cmFzdF92aXNpYmxlXCIsXG4gICAgY29udGV4dDogXCJkb206c3R5bGUsIGRvbTpsaW5rLCBkb206KltzdHlsZV1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9TdHlsZV9UcmlnZ2VyMlwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIk1hbnVhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJzdHlsZV9oaWdoY29udHJhc3RfdmlzaWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwic3R5bGVfaGlnaGNvbnRyYXN0X3Zpc2libGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInN0eWxlX2hpZ2hjb250cmFzdF92aXNpYmxlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJDb25maXJtIFdpbmRvd3MgaGlnaCBjb250cmFzdCBtb2RlIGlzIHN1cHBvcnRlZCB3aGVuIHVzaW5nIENTUyB0byBpbmNsdWRlLCBwb3NpdGlvbiBvciBhbHRlciBub24tZGVjb3JhdGl2ZSBjb250ZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiV2luZG93cyBoaWdoIGNvbnRyYXN0IG1vZGUgbXVzdCBiZSBzdXBwb3J0ZWQgd2hlbiB1c2luZyBDU1MgdG8gaW5jbHVkZSwgcG9zaXRpb24gb3IgYWx0ZXIgbm9uLWRlY29yYXRpdmUgY29udGVudFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4xLjFcIiwgXCIxLjMuMlwiLCBcIjEuNC4xMVwiXSwgIC8vb3RoZXIgXCJzdHlsZVwiIHJ1bGVzIGZvciBmb2N1cywgaG92ZXIsIGFuZCBjb2xvclxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpZFwiOiBbXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCIsIFwiMS4zLjJcIiwgXCIxLjQuMTFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwibGlua1wiICYmXG4gICAgICAgICAgICAoIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInJlbFwiKSB8fCBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJyZWxcIikudG9Mb3dlckNhc2UoKSAhPT0gXCJzdHlsZXNoZWV0XCIpKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAobm9kZU5hbWUgIT09IFwic3R5bGVcIiAmJiBub2RlTmFtZSAhPT0gXCJsaW5rXCIgJiZcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInN0eWxlXCIpICYmIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInN0eWxlXCIpLnRyaW0oKS5sZW5ndGggPT09IDApXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGxldCB0cmlnZ2VyZWQgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUocnVsZUNvbnRleHQub3duZXJEb2N1bWVudCwgXCJzdHlsZV9oaWdoY29udHJhc3RfdmlzaWJsZVwiLCBmYWxzZSk7XG4gICAgICAgIGxldCBwYXNzZWQgPSB0cmlnZ2VyZWQ7XG4gICAgICAgIC8vICAgICAgICBQYWNrYWdlcy5qYXZhLmxhbmcuU3lzdGVtLm91dC5wcmludGxuKHRyaWdnZXJlZCk7XG4gICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShydWxlQ29udGV4dC5vd25lckRvY3VtZW50LCBcInN0eWxlX2hpZ2hjb250cmFzdF92aXNpYmxlXCIsIHRydWUpO1xuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZU1hbnVhbChcIk1hbnVhbF8xXCIpO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IHN0eWxlX2hvdmVyX3BlcnNpc3RlbnQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwic3R5bGVfaG92ZXJfcGVyc2lzdGVudFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOnN0eWxlLCBkb206KltzdHlsZV0sIGRvbToqXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwic3R5bGVfaG92ZXJfcGVyc2lzdGVudC5odG1sXCIsXG4gICAgICAgICAgICAvLyBcIlBhc3NfMVwiOiBcInN0eWxlX2hvdmVyX3BlcnNpc3RlbnQuaHRtbFwiLFxuICAgICAgICAgICAgXCJQYXNzXzJcIjogXCJzdHlsZV9ob3Zlcl9wZXJzaXN0ZW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJzdHlsZV9ob3Zlcl9wZXJzaXN0ZW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzJcIjogXCJzdHlsZV9ob3Zlcl9wZXJzaXN0ZW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzNcIjogXCJzdHlsZV9ob3Zlcl9wZXJzaXN0ZW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJzdHlsZV9ob3Zlcl9wZXJzaXN0ZW50Lmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwidGhlIGhvdmVyOiBwc2V1ZG8tY2xhc3MgaXMgbm90IHVzZWQgdG8gZGlzcGxheSBjb250ZW50XCIsXG4gICAgICAgICAgICAvLyBcIlBhc3NfMVwiOiBcImNvbnRlbnQgZGlzcGxheWVkIHZpYSB0aGUgOmhvdmVyIHBzZXVkby1jbGFzcyBpcyBhIGRpcmVjdCBjaGlsZCBvZiB0aGUgdHJpZ2dlciBlbGVtZW50XCIsXG4gICAgICAgICAgICBcIlBhc3NfMlwiOiBcImNvbnRlbnQgZGlzcGxheWVkIHZpYSB0aGUgOmhvdmVyIHBzZXVkby1jbGFzcyBpcyB0aGUgYWRqYWNlbnQgc2libGluZyBvZiB0aGUgdHJpZ2dlciBlbGVtZW50XCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiQ29uZmlybSB0aGUgcG9pbnRlciBjYW4gYmUgcG9zaXRpb25lZCBvdmVyIHRoZSBkaXNwbGF5ZWQgZWxlbWVudCwgbm90IGp1c3QgdGhlIHRyaWdnZXJcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzJcIjogXCJDb25maXJtIHRoZSBwb2ludGVyIGNhbiBiZSBwb3NpdGlvbmVkIG92ZXIgYWxsIHRoZSBpbmZvcm1hdGlvbiBkaXNwbGF5ZWQgb24gaG92ZXJcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzNcIjogXCJDb25maXJtIHRoZSBtYXJnaW4gc3R5bGUgYXR0cmlidXRlIGhhcyBub3QgcHJldmVudGVkIHRoZSBwb2ludGVyIGZyb20gaG92ZXJpbmcgb3ZlciB0aGUgZGlzcGxheWVkIGVsZW1lbnQsIG5vdCBqdXN0IHRoZSB0cmlnZ2VyXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGhlIHBvaW50ZXIgc2hvdWxkIGJlIGFibGUgdG8gbW92ZSBvdmVyIGNvbnRlbnQgZGlzcGxheWVkIG9uIGhvdmVyXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS40LjEzXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGxldCBwYXNzMCA9IGZhbHNlO1xuICAgICAgICBsZXQgcGFzczEgPSBmYWxzZTtcbiAgICAgICAgbGV0IHBhc3MyID0gZmFsc2U7IC8vIG5ldmVyIGhhcHBlblxuICAgICAgICBsZXQgcG90ZW50aWFsMSA9IGZhbHNlO1xuICAgICAgICBsZXQgcG90ZW50aWFsMiA9IGZhbHNlO1xuICAgICAgICBsZXQgcG90ZW50aWFsMyA9IGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGxldCBzdHlsZVRleHQgPSBcIlwiO1xuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwic3R5bGVcIikge1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJSVUxFIFJVTiAqKioqKioqKioqKioqKioqKipcIik7XG4gICAgICAgICAgICBzdHlsZVRleHQgPSBDb21tb25VdGlsLmdldElubmVyVGV4dChydWxlQ29udGV4dCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIC8vIGNoZWNrIGltcG9ydFxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJydWxlQ29udGV4dC5vd25lckRvY3VtZW50LnN0eWxlU2hlZXRzLmxlbmd0aCA9IFwiK3J1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHMubGVuZ3RoKTtcbiAgICAgICAgICAgIGZvciAobGV0IHNJbmRleCA9IDA7IHNJbmRleCA8IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHMubGVuZ3RoOyArK3NJbmRleCkge1xuICAgICAgICAgICAgICAgIGxldCBzaGVldCA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHNbc0luZGV4XSBhcyBDU1NTdHlsZVNoZWV0O1xuICAgICAgICAgICAgICAgIGlmIChzaGVldCAmJiBzaGVldC5vd25lck5vZGUgPT09IHJ1bGVDb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3R5bGVSdWxlcyA9IHNoZWV0LmNzc1J1bGVzID8gc2hlZXQuY3NzUnVsZXMgOiBzaGVldC5ydWxlcztcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwic3R5bGVSdWxlcy5sZW5ndGggPSBcIitzdHlsZVJ1bGVzLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBzdHlsZVJ1bGVJbmRleCA9IDA7IHN0eWxlUnVsZUluZGV4IDwgc3R5bGVSdWxlcy5sZW5ndGg7IHN0eWxlUnVsZUluZGV4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIioqKioqKioqKipcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIqKioqKioqKioqIEZPUiBMT09QIHN0eWxlUnVsZUluZGV4ID0gXCIrc3R5bGVSdWxlSW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmb3VuZEhvdmVyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhvdmVyRWxlbWVudCA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBsdXNDb21iaW5hdG9yID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRpbGRlQ29tYmluYXRvciA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhZnRlckNvbWJpbmF0b3JFbGVtZW50ID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYWZ0ZXJDb21iaW5hdG9yRWxlbWVudERpc3BsYXkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYWZ0ZXJDb21iaW5hdG9yRWxlbWVudERpc3BsYXlWYWx1ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhZnRlckNvbWJpbmF0b3JFbGVtZW50SG92ZXIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3VwcG9ydGluZ0VsZW1lbnQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3VwcG9ydGluZ0hvdmVyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5UHJvcGVydHkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3VwcG9ydGluZ0hvdmVyRWxlbWVudERpc3BsYXlWYWx1ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhZGphY2VudFBsdXNTaWJsaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFkamFjZW50VGlsZGVNdWx0aXBsZVNpYmxpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3R5bGVSdWxlID0gc3R5bGVSdWxlc1tzdHlsZVJ1bGVJbmRleF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGVUZXh0ID0gc3R5bGVSdWxlc1tzdHlsZVJ1bGVJbmRleF0uY3NzVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInN0eWxlUnVsZXNbXCIrc3R5bGVSdWxlSW5kZXgrXCJdID0gXCIrcnVsZVRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEuIENoZWNrIGZvciA6aG92ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZVRleHQubWF0Y2goLzpob3Zlci9nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEhvdmVyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIxLiBmb3VuZCA6aG92ZXIgPSBcIisgZm91bmRIb3Zlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDIuIEdldCBob3ZlciBlbGVtZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvdmVyRWxlbWVudCA9IHJ1bGVUZXh0LnNwbGl0KFwiOlwiKVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIyLiBmb3VuZCBlbGVtZW50IHRoYXQgZ29lcyB3aXRoIDpob3ZlciA9IFwiK2hvdmVyRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIxLiBObyBob3ZlciBvbiBjc3MgZWxlbWVudCBzbyBza2lwIHRoaXMgcnVsZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8vIGlmIG5vIDpob3ZlciBza2lwIHRoaXMgcnVsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAzYS4gQ2hlY2sgZm9yIGNzcyBjb21iaW5hdG9yICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA0YS4gaWYgc28gZG8gd2UgaGF2ZSBhbiBhZnRlciBjb21iaW5hdG9yIGVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGx1c1RlbXBTdHIgPSBydWxlVGV4dC5zdWJzdHJpbmcocnVsZVRleHQuaW5kZXhPZihcIitcIikgKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVzVGVtcFN0ciA9IHBsdXNUZW1wU3RyLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZVRleHQubWF0Y2goLzpob3ZlciBcXCsvZykgfHwgcnVsZVRleHQubWF0Y2goLzpob3ZlclxcKy9nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVzQ29tYmluYXRvciA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiM2EuIEZvdW5kIHBsdXNDb21iaW5hdG9yID0gXCIrIHBsdXNDb21iaW5hdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJDb21iaW5hdG9yRWxlbWVudCA9IHBsdXNUZW1wU3RyLnNwbGl0KFwiIFwiKVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCI0YS4gRm91bmQgcGx1cyBhZnRlckNvbWJpbmF0b3JFbGVtZW50ID0gXCIrYWZ0ZXJDb21iaW5hdG9yRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gM2IuIENoZWNrIGZvciBjc3MgY29tYmluYXRvciArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNGIuIGlmIHNvIGRvIHdlIGhhdmUgYW4gYWZ0ZXIgY29tYmluYXRvciBlbGVtZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGVUZXh0Lm1hdGNoKC86aG92ZXIgXFx+L2cpIHx8IHJ1bGVUZXh0Lm1hdGNoKC86aG92ZXJcXH4vZykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJtYXRjaCA9IFwiK3J1bGVUZXh0Lm1hdGNoKFwiOmhvdmVyIFxcflwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbGRlQ29tYmluYXRvciA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiM2IuIEZvdW5kIHRpbGRlQ29tYmluYXRvciA9IFwiKyB0aWxkZUNvbWJpbmF0b3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGx1c1RlbXBTdHIgPSBydWxlVGV4dC5zdWJzdHJpbmcocnVsZVRleHQuaW5kZXhPZihcIn5cIikgKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1c1RlbXBTdHIgPSBwbHVzVGVtcFN0ci50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyQ29tYmluYXRvckVsZW1lbnQgPSBwbHVzVGVtcFN0ci5zcGxpdChcIiBcIilbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiNGIuIEZvdW5kIHRpbGRlIGFmdGVyQ29tYmluYXRvckVsZW1lbnQgPSBcIithZnRlckNvbWJpbmF0b3JFbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBsdXNDb21iaW5hdG9yICYmICF0aWxkZUNvbWJpbmF0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTk8gcGx1c0NvbWJpbmF0b3Igb3IgdGlsZGVDb21iaW5hdG9yIHNvIHNraXAgdGhpcyBydWxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiTk8gcGx1c0NvbWJpbmF0b3Igb3IgdGlsZGVDb21iaW5hdG9yIHNvIFBBU1NcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiKioqKiBSRVBPUlQgUEFTUyAwIEhFUkVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTsgLy8gSkNIOiBzaG91bGQgd2UgaGF2ZSBhIE4vQSBwYXNzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU28gbm93IHdlIGhhdmUgYSBjc3MgZWxlbWVudCB3aXRoIGhvdmVyIC0gZWxlbWVudDpob3ZlciBzbyB3ZSBoYXZlIHByb2JsZW1zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gY2hlY2tcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDUuIENoZWNrIGlmIHRoZSBhZnRlciBjb21iaW5hdG9yIGVsZW1lbnQgaGFzIGRpc3BsYXk6IHByb3BlcnR5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNi4gQ2hlY2sgaWYgZGlzcGxheSBwcm9wZXJ0eSBpcyBub3Qgbm9uZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZnRlckNvbWJpbmF0b3JFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCBpbmRleCBvZiBkaXNwbGF5OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInBsdXNUZW1wU3RyID0gXCIrcGx1c1RlbXBTdHIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSBwbHVzVGVtcFN0ci5pbmRleE9mKFwiZGlzcGxheTpcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJDb21iaW5hdG9yRWxlbWVudERpc3BsYXkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCI1LiBGb3VuZCBhZnRlckNvbWJpbmF0b3JFbGVtZW50RGlzcGxheSA9IFwiK2FmdGVyQ29tYmluYXRvckVsZW1lbnREaXNwbGF5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbHVzVGVtcFN0ci5zbGljZShpbmRleCArIDgpLnRyaW0oKS5zcGxpdChcIiBcIilbMF0gIT09IFwibm9uZTtcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyQ29tYmluYXRvckVsZW1lbnREaXNwbGF5VmFsdWUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiNi4gRm91bmQgYWZ0ZXJDb21iaW5hdG9yRWxlbWVudERpc3BsYXlWYWx1ZSBub3Qgbm9uZSA9IFwiK2FmdGVyQ29tYmluYXRvckVsZW1lbnREaXNwbGF5VmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImFmdGVyQ29tYmluYXRvckVsZW1lbnREaXNwbGF5VmFsdWUgPT09IG5vbmVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIqKioqIFBVVCBQT1RFTlRJQUwgMCBIRVJFXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBiYWQgY3NzIHNvIGl0IHdvbid0IGhhcHBlblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJOTyBhZnRlckNvbWJpbmF0b3JFbGVtZW50RGlzcGxheSBzbyBza2lwIHRoaXMgcnVsZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBiYWQgY3NzIHNvIGl0IHdvbid0IGhhcHBlblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIk5PIGFmdGVyQ29tYmluYXRvckVsZW1lbnQgc28gc2tpcCB0aGlzIHJ1bGVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZnRlckNvbWJpbmF0b3JFbGVtZW50RGlzcGxheVZhbHVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hlZXQgJiYgc2hlZXQub3duZXJOb2RlID09PSBydWxlQ29udGV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIqKioqIEF0IHRoaXMgcG9pbnQgd2UgaGF2ZSB2ZXJpZmllZCB0aGF0IHdlIGhhdmUgYSBjc3MgZWxlbWVudCB3aXRoIGEgaG92ZXIgb2YgdGhlIGZvcm1hdCBzcGFuOmhvdmVyICsgZGl2IHsgZGlzcGxheTogYmxvY2s7IH0gd2l0aCBhbGwgdGhlIHByb3BlciBwcm9wZXJ0aWVzIGFuZCB2YWx1ZXNcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiBBdCB0aGlzIHBvaW50IHdlIGhhdmUgdmVyaWZpZWQgdGhhdCB3ZSBoYXZlIGEgY3NzIGVsZW1lbnQgd2l0aCBhIGhvdmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICBvZiB0aGUgZm9ybWF0IHNwYW46aG92ZXIgKyBkaXYgeyBkaXNwbGF5OiBibG9jazsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgd2l0aCBhbGwgdGhlIHByb3BlciBwcm9wZXJ0aWVzIGFuZCB2YWx1ZXNcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3R5bGVSdWxlczIgPSBzaGVldC5jc3NSdWxlcyA/IHNoZWV0LmNzc1J1bGVzIDogc2hlZXQucnVsZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJzdHlsZVJ1bGVzMi5sZW5ndGggPSBcIitzdHlsZVJ1bGVzMi5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHN0eWxlUnVsZUluZGV4MiA9IDA7IHN0eWxlUnVsZUluZGV4MiA8IHN0eWxlUnVsZXMyLmxlbmd0aDsgc3R5bGVSdWxlSW5kZXgyKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgcnVsZSBmb3IgYWZ0ZXJDb21pbmF0b3JFbGVtZW50OmhvdmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGZpbmQgYWZ0ZXJDb21iaW5hdG9yRWxlbWVudDpob3ZlciBzZWUgaWYgcnVsZSBoYXMgcHJvcGVydHkgZGlzcGxheTogdmFsdWUgd2hlcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmFsdWUgIT0gbm9uZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIioqKioqKioqKipcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiKioqKioqKioqKiAybmQgRk9SIHN0eWxlUnVsZUluZGV4MiA9IFwiK3N0eWxlUnVsZUluZGV4Mik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBydWxlVGV4dDIgPSBzdHlsZVJ1bGVzW3N0eWxlUnVsZUluZGV4Ml0uY3NzVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJydWxlVGV4dDIgPSBcIiwgcnVsZVRleHQyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJhZnRlckNvbWJpbmF0b3JFbGVtZW50ID0gXCIrYWZ0ZXJDb21iaW5hdG9yRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGFsbCBzdXBwb3J0aW5nIGVsZW1lbnRzIGZvciBtYXJnaW4gcHJvcGVydHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgZmluZCBtYXJnaW4gU1RPUCBhbmQgUkVQT1JUIEVSUk9SXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZWdFeFN0cmluZyA9IGFmdGVyQ29tYmluYXRvckVsZW1lbnQgKyBcIiB7XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0cmltUnVsZVRleHQyID0gcnVsZVRleHQyLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlZ0luZGV4ID0gdHJpbVJ1bGVUZXh0Mi5pbmRleE9mKHJlZ0V4U3RyaW5nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFmdGVyQ29tYmluYXRvckVsZW1lbnRQcm9wZXJ0aWVzID0gdHJpbVJ1bGVUZXh0Mi5zbGljZShyZWdJbmRleCkudHJpbSgpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgKCFhZnRlckNvbWJpbmF0b3JFbGVtZW50UHJvcGVydGllcy5tYXRjaCgvbWFyZ2luL2cpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdHJpbVJ1bGVUZXh0Mi5tYXRjaCgvbWFyZ2luL2cpKSB7ICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJObyBtYXJnaW4gcHJvYmxlbSBzbyBjb250aW51ZSBvbi4uLlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvIHdlIGhhdmUgYSBzdXBwb3J0aW5nIGVsZW1lbnQgY3NzIGRlZmluaXRpb25zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3VwcG9ydGluZ0hvdmVyRWxlbWVudCA9IHJ1bGVUZXh0Mi5zcGxpdChcIjpcIilbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0aW5nSG92ZXJFbGVtZW50ID0gc3VwcG9ydGluZ0hvdmVyRWxlbWVudC5zcGxpdChcIiBcIilbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInN1cHBvcnRpbmdIb3ZlckVsZW1lbnQgPSBcIitzdXBwb3J0aW5nSG92ZXJFbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiYWZ0ZXJDb21iaW5hdG9yRWxlbWVudCA9IFwiK2FmdGVyQ29tYmluYXRvckVsZW1lbnQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBORUVEIFRPIENIRUNLIEZPUiBhZnRlckNvbWluYXRvckVsZW1lbnQ6aG92ZXIgaW4gT05FIFNURVBcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1cHBvcnRpbmdIb3ZlckVsZW1lbnQgPT09IGFmdGVyQ29tYmluYXRvckVsZW1lbnQgJiYgcnVsZVRleHQyLm1hdGNoKC86aG92ZXIvZykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIjcuIEZvdW5kIHN1cHBvcnRpbmcgaG92ZXIgZWxlbWVudCBzYW1lIGFzIGFmdGVyQ29tYmluYXRvckVsZW1lbnRcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA3LiBGb3VuZCBzdXBwb3J0aW5nIGhvdmVyIGVsZW1lbnQgc2FtZSBhcyBhZnRlckNvbWJpbmF0b3JFbGVtZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGluZ0VsZW1lbnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvZXMgc3VwcG9ydGluZyBlbGVtZW50IGhhdmUgaG92ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIjguIFN1cHBvcnRpbmcgZWxlbWVudCBoYXMgaG92ZXIgYWxzbyA9IFwiKyBmb3VuZEhvdmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA4LiBTdXBwb3J0aW5nIGVsZW1lbnQgaGFzIGhvdmVyIGFsc29cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0aW5nSG92ZXIgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IHJ1bGVUZXh0Mi5pbmRleE9mKFwiZGlzcGxheTpcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJpbmRleCA9IFwiK2luZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gOS4gRm91bmQgc3VwcG9ydGluZ0hvdmVyRWxlbWVudERpc3BsYXlQcm9wZXJ0eVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVByb3BlcnR5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCI5LiBGb3VuZCBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVByb3BlcnR5ID0gXCIrc3VwcG9ydGluZ0hvdmVyRWxlbWVudERpc3BsYXlQcm9wZXJ0eSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbHVzVGVtcFN0ci5zbGljZShpbmRleCArIDgpLnRyaW0oKS5zcGxpdChcIiBcIilbMF0gIT09IFwibm9uZTtcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMTAuIEZvdW5kIHN1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5VmFsdWUgbm90IG5vbmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5VmFsdWUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIxMC4gRm91bmQgc3VwcG9ydGluZ0hvdmVyRWxlbWVudERpc3BsYXlWYWx1ZSBub3Qgbm9uZSA9IFwiK3N1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5VmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IGxpc3Qgb2YgaG92ZXIgZWxlbWVudHMgYW5kIG5leHQgc2libGluZyBmb3IgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9yICsgdGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgQURKQUNFTlQgc2libGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhvdmVyRWxlbWVudCAhPT0gXCJcIiAmJiBwbHVzQ29tYmluYXRvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBob3ZlckVsZW1lbnRMaXN0ID0gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShob3ZlckVsZW1lbnQudG9VcHBlckNhc2UoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJob3ZlckVsZW1lbnRMaXN0Lmxlbmd0aCA9IFwiK2hvdmVyRWxlbWVudExpc3QubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImhvdmVyRWxlbWVudExpc3RbMF0udGFnTmFtZSA9IFwiK2hvdmVyRWxlbWVudExpc3RbMF0udGFnTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IGFkamFjZW50IHNpYmxpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkFkamFjZW50IHNpYmxpbmcgPSBcIitob3ZlckVsZW1lbnRMaXN0WzBdLm5leHRFbGVtZW50U2libGluZy50YWdOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImFmdGVyQ29tYmluYXRvckVsZW1lbnQudG9VcHBlckNhc2UoKSA9IFwiK2FmdGVyQ29tYmluYXRvckVsZW1lbnQudG9VcHBlckNhc2UoKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWZ0ZXJDb21iaW5hdG9yRWxlbWVudC50b1VwcGVyQ2FzZSgpID09PSBob3ZlckVsZW1lbnRMaXN0WzBdLm5leHRFbGVtZW50U2libGluZy50YWdOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiMTFhLiBIb3ZlciB3aXRoIHBsdXMgaGFzIGFkamFjZW50IHNpYmxpbmcuXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDExYS4gSG92ZXIgd2l0aCBwbHVzIGhhcyBhZGphY2VudCBzaWJsaW5nLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGphY2VudFBsdXNTaWJsaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCB3ZSBoYXZlIHZlcmlmaWVkIGEgc3VwcG9ydGluZyBhZnRlckNvbWJpbmF0b3JFbGVtZW50IGNzcyBydWxlIHRoYXQgY29udGFpbnMgaG92ZXIgYW5kIGRpc3BsYXkgcHJvcGVydHkgdGhhdCBpcyBub3QgZXF1YWwgdG8gbm9uZSBhbmQgaGFzIGEgaG92ZXIgZWxlbWVudCBpbiB0aGUgYm9keSB3aXRoIGFuIGFkamFjZW50IHNpYmxpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIqKioqIFJFUE9SVCBQQVNTIDEgSEVSRVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzczAgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBsdXNDb21iaW5hdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIxMWEuIE1haW4gaG92ZXIgd2l0aCArIGNvbWJpbmF0b3IgaGFzIG5vIGFkamFjZW50IHNpYmxpbmdcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwb3RlbnRpYWwxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiKioqKiBQVVQgUE9URU5USUFMIDEgSEVSRVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG90ZW50aWFsMSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdldCBsaXN0IG9mIGhvdmVyIGVsZW1lbnRzIGFuZCBkZXRlcm1pbmUgaWYgdGhlcmUgYXJlIDIgb3IgbW9yZSBhZGphY2VudCBzaWJsaW5ncyBmb3IgflxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9yIH4gdGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgQURKQUNFTlQgc2libGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhvdmVyRWxlbWVudCAhPT0gXCJcIiAmJiB0aWxkZUNvbWJpbmF0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImhvdmVyRWxlbWVudC50b1VwcGVyQ2FzZSgpID0gXCIraG92ZXJFbGVtZW50LnRvVXBwZXJDYXNlKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBob3ZlckVsZW1lbnRMaXN0ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvdmVyRWxlbWVudC50b1VwcGVyQ2FzZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJob3ZlckVsZW1lbnRMaXN0Lmxlbmd0aCA9IFwiK2hvdmVyRWxlbWVudExpc3QubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgdHdvIG9yIG1vcmUgYWRqYWNlbnQgc2libGluZ3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2libGluZ3MgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2libGluZyA9IGhvdmVyRWxlbWVudExpc3RbMF0ubmV4dEVsZW1lbnRTaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJzaWJsaW5nLnRhZ05hbWUgPSBcIitzaWJsaW5nLnRhZ05hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2libGluZy50YWdOYW1lID09PSBhZnRlckNvbWJpbmF0b3JFbGVtZW50LnRvVXBwZXJDYXNlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpYmxpbmdzLnB1c2goc2libGluZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKChzaWJsaW5nID0gc2libGluZy5uZXh0RWxlbWVudFNpYmxpbmcpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2libGluZ0NvdW50ID0gc2libGluZ3MubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwic2libGluZ0NvdW50ID0gXCIrc2libGluZ0NvdW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBKQ0ggVE9ETzogd2hhdCBpZiBzaWJsaW5nIGNvdW50IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2libGluZ0NvdW50ID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiMTFiLiBIb3ZlciB3aXRoIHRpbGRlIGFuZCBvbmUgYWRqYWNlbnQgc2libGluZ1wiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRqYWNlbnRUaWxkZU11bHRpcGxlU2libGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiKioqKiBSRVBPUlQgUEFTUyAyIEhFUkVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNpYmxpbmdDb3VudCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJNYWluIGhvdmVyIHdpdGggfiBjb21iaW5hdG9yIGhhcyB0d28gb3IgbW9yZSBzaWJsaW5nc1wiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwb3RlbnRpYWwyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIioqKiogUFVUIFBPVEVOVElBTCAyIEhFUkVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8yXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBsdXNDb21iaW5hdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSBtYWtlIGl0IHRvIHRoZSBsYXN0IHJ1bGUgYW5kIHN1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5VmFsdWUgaXMgc3RpbGwgZmFsc2UgPT4gcG90ZW50aWFsMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlUnVsZUluZGV4MiA9PT0gc3R5bGVSdWxlczIubGVuZ3RoIC0gMSAmJiBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVZhbHVlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiTk8gcGx1cyBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVByb3BlcnR5XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiKioqKiBQVVQgUE9URU5USUFMIDEgSEVSRVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aWxkZUNvbWJpbmF0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIG1ha2UgaXQgdG8gdGhlIGxhc3QgcnVsZSBhbmQgc3VwcG9ydGluZ0hvdmVyRWxlbWVudERpc3BsYXlWYWx1ZSBpcyBzdGlsbCBmYWxzZSA9PiBwb3RlbnRpYWwyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVSdWxlSW5kZXgyID09PSBzdHlsZVJ1bGVzMi5sZW5ndGggLSAxICYmIHN1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5VmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJOTyBwbHVzIHN1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5UHJvcGVydHlcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIqKioqIFBVVCBQT1RFTlRJQUwgMiBIRVJFXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90ZSBhdCBsZWFzdCBvbmUgb2YgdGhlIHJ1bGVzIG11c3QgaGF2ZSBhIGRpc3BsYXkgcHJvcGVydHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBsdXNDb21iaW5hdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIG1ha2UgaXQgdG8gdGhlIGxhc3QgcnVsZSBhbmQgc3VwcG9ydGluZ0hvdmVyRWxlbWVudERpc3BsYXlQcm9wZXJ0eSBpcyBzdGlsbCBmYWxzZSA9PiBwb3RlbnRpYWwxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZVJ1bGVJbmRleDIgPT09IHN0eWxlUnVsZXMyLmxlbmd0aCAtIDEgJiYgc3VwcG9ydGluZ0hvdmVyRWxlbWVudERpc3BsYXlQcm9wZXJ0eSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiTk8gcGx1cyBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVByb3BlcnR5XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIqKioqIFBVVCBQT1RFTlRJQUwgMSBIRVJFXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aWxkZUNvbWJpbmF0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgbWFrZSBpdCB0byB0aGUgbGFzdCBydWxlIGFuZCBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVByb3BlcnR5IGlzIHN0aWxsIGZhbHNlID0+IHBvdGVudGlhbDJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlUnVsZUluZGV4MiA9PT0gc3R5bGVSdWxlczIubGVuZ3RoIC0gMSAmJiBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVByb3BlcnR5ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJOTyB0aWxkZSBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVByb3BlcnR5XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIqKioqIFBVVCBQT1RFTlRJQUwgMiBIRVJFXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90ZSBhdCBsZWFzdCBvbmUgb2YgdGhlIHJ1bGVzIG11c3QgaGF2ZSBhIHN1cHBvcnRpbmdFbGVtZW50OmhvdmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBsdXNDb21iaW5hdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgbWFrZSBpdCB0byB0aGUgbGFzdCBydWxlIGFuZCBzdXBwb3J0aW5nRWxlbWVudCBpcyBzdGlsbCBmYWxzZSA9PiBwb3RlbnRpYWwxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJzdHlsZVJ1bGVJbmRleDIgPSBcIitzdHlsZVJ1bGVJbmRleDIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwic3R5bGVSdWxlczIubGVuZ3RoID0gXCIrc3R5bGVSdWxlczIubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInN1cHBvcnRpbmdFbGVtZW50ID0gXCIrc3VwcG9ydGluZ0hvdmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVSdWxlSW5kZXgyID09PSBzdHlsZVJ1bGVzMi5sZW5ndGggLSAxICYmIHN1cHBvcnRpbmdIb3ZlciA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJOTyBwbHVzIHN1cHBvcnRpbmdFbGVtZW50OmhvdmVyXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIioqKiogUFVUIFBPVEVOVElBTCAxIEhFUkVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aWxkZUNvbWJpbmF0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSBtYWtlIGl0IHRvIHRoZSBsYXN0IHJ1bGUgYW5kIHN1cHBvcnRpbmdFbGVtZW50IGlzIHN0aWxsIGZhbHNlID0+IHBvdGVudGlhbDJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInN0eWxlUnVsZUluZGV4MiA9IFwiK3N0eWxlUnVsZUluZGV4Mik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJzdHlsZVJ1bGVzMi5sZW5ndGggPSBcIitzdHlsZVJ1bGVzMi5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwic3VwcG9ydGluZ0VsZW1lbnQgPSBcIitzdXBwb3J0aW5nSG92ZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZVJ1bGVJbmRleDIgPT09IHN0eWxlUnVsZXMyLmxlbmd0aCAtIDEgJiYgc3VwcG9ydGluZ0hvdmVyID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIk5PIHRpbGRlIHN1cHBvcnRpbmdFbGVtZW50OmhvdmVyXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIioqKiogUFVUIFBPVEVOVElBTCAyIEhFUkVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJUaGVyZSBpcyBhIG1hcmdpbiBpbiB0aGUgc3VwcG9ydGluZyBlbGVtZW50XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwb3RlbnRpYWwzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIqKioqIFBVVCBQT1RFTlRJQUwgMyBIRVJFXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvdGVudGlhbDMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzNcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2lsZW5jZSBjc3MgYWNjZXNzIGlzc3Vlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNpbGVuY2UgY3NzIGFjY2VzcyBpc3N1ZXNcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cIik7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwicGFzczAgPSBcIitwYXNzMCk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwicGFzczEgPSBcIitwYXNzMSk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwicGFzczIgPSBcIitwYXNzMik7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwicG90ZW50aWFsMSA9IFwiK3BvdGVudGlhbDEpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcInBvdGVudGlhbDIgPSBcIitwb3RlbnRpYWwyKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJwb3RlbnRpYWwzID0gXCIrcG90ZW50aWFsMyk7XG4gICAgICAgIGlmIChwYXNzMCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICAvLyBpZiAocGFzczEpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMlwiKTsgLy8gRG9lc24ndCB0cmlnZ2VyXG4gICAgICAgIC8vIGlmIChwYXNzMikgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18zXCIpOyAvLyBEb2Vzbid0IHRyaWdnZXJcbiAgICAgICAgaWYgKHBvdGVudGlhbDEpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgICAgIGlmIChwb3RlbnRpYWwyKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8yXCIpO1xuICAgICAgICBpZiAocG90ZW50aWFsMykgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfM1wiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuLyoqXG4gKiBEZXNjcmlwdGlvbjogVHJpZ2dlciB3aGVuIHZpZXdwb3J0IHVuaXRzIGFyZSB1c2VkIGZvciBmb250IHNpemUuXG4gKiBPcmlnaW46IFZhcmlvdXNcbiAqL1xuZXhwb3J0IGNvbnN0IHN0eWxlX3ZpZXdwb3J0X3Jlc2l6YWJsZTogUnVsZSA9IHtcbiAgICBpZDogXCJzdHlsZV92aWV3cG9ydF9yZXNpemFibGVcIixcbiAgICBjb250ZXh0OiBcImRvbTpsaW5rLCBkb206c3R5bGUsIGRvbToqW3N0eWxlXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIxX1N0eWxlX1ZpZXdwb3J0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBgc3R5bGVfdmlld3BvcnRfcmVzaXphYmxlLmh0bWxgLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogYHN0eWxlX3ZpZXdwb3J0X3Jlc2l6YWJsZS5odG1sYCxcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogYHN0eWxlX3ZpZXdwb3J0X3Jlc2l6YWJsZS5odG1sYFxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUZXh0IG11c3Qgc2NhbGUgdXAgdG8gMjAwJSB3aXRob3V0IGxvc3Mgb2YgY29udGVudCBvciBmdW5jdGlvbmFsaXR5XCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVmVyaWZ5IHRoYXQgdGV4dCBzaXplZCB1c2luZyB2aWV3cG9ydCB1bml0cyBjYW4gYmUgcmVzaXplZCB1cCB0byAyMDAlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIG51bTogW1wiMS40LjRcIiwgXCIxLjQuMTBcIl0sIC8vIG1hdGNoIGhlbHAgZm9yIGJvdGggXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGxldCB0aGVQYXR0ZXJuID0gL1xcZCsodnd8dmh8dm1pbnx2bWF4KS9naTtcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSBcInN0eWxlXCIpIHtcbiAgICAgICAgICAgIGZvciAobGV0IHNJbmRleCA9IDA7IHNJbmRleCA8IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHMubGVuZ3RoOyBzSW5kZXgrKykge1xuICAgICAgICAgICAgICAgIGxldCBzaGVldCA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHNbc0luZGV4XSBhcyBDU1NTdHlsZVNoZWV0XG4gICAgICAgICAgICAgICAgaWYgKHNoZWV0Lm93bmVyTm9kZSA9PT0gcnVsZUNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHlsZVJ1bGVzID0gc2hlZXQuY3NzUnVsZXMgPyBzaGVldC5jc3NSdWxlcyA6IHNoZWV0LnJ1bGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlUnVsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBzdHlsZVJ1bGVJbmRleCA9IDA7IHBhc3NlZCAmJiBzdHlsZVJ1bGVJbmRleCA8IHN0eWxlUnVsZXMubGVuZ3RoOyBzdHlsZVJ1bGVJbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBydWxlID0gc3R5bGVSdWxlc1tzdHlsZVJ1bGVJbmRleF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlLnR5cGUgJiYgcnVsZS50eXBlID09PSAxIC8qIENTU1J1bGUuU1RZTEVfUlVMRSAqLykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0eWxlUnVsZSA9IHJ1bGUgYXMgQ1NTU3R5bGVSdWxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlUnVsZS5zdHlsZVsnZm9udFNpemUnXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmb250U2l6ZSA9IHN0eWxlUnVsZS5zdHlsZVsnZm9udFNpemUnXS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZvdW5kID0gZm9udFNpemUubWF0Y2godGhlUGF0dGVybik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvbnRTaXplLmxlbmd0aCAmJiBmb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgaW1wb3J0IHJ1bGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJ1bGUudHlwZSAmJiBydWxlLnR5cGUgPT09IDMgLyogQ1NTUnVsZS5JTVBPUlRfUlVMRSAqLyAmJiAocnVsZSBhcyBDU1NJbXBvcnRSdWxlKS5zdHlsZVNoZWV0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW1wb3J0UnVsZSA9IHJ1bGUgYXMgQ1NTSW1wb3J0UnVsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBydWxlcyA9IGltcG9ydFJ1bGUuc3R5bGVTaGVldC5jc3NSdWxlcyA/IGltcG9ydFJ1bGUuc3R5bGVTaGVldC5jc3NSdWxlcyA6IGltcG9ydFJ1bGUuc3R5bGVTaGVldC5ydWxlcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHJJbmRleCA9IDA7IHBhc3NlZCAmJiBySW5kZXggPCBydWxlcy5sZW5ndGg7IHJJbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbXBvcnRlZFJ1bGUgPSBydWxlc1tySW5kZXhdIGFzIGFueVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW1wb3J0ZWRSdWxlLnR5cGUgJiYgaW1wb3J0ZWRSdWxlLnR5cGUgPT09IDEgLyogQ1NTUnVsZS5TVFlMRV9SVUxFICovKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW1wb3J0ZWRSdWxlLnN0eWxlWydmb250U2l6ZSddKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZvbnRTaXplID0gaW1wb3J0ZWRSdWxlLnN0eWxlWydmb250U2l6ZSddLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZm91bmQgPSBmb250U2l6ZS5tYXRjaCh0aGVQYXR0ZXJuKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm9udFNpemUubGVuZ3RoICYmIGZvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlIGNzcyBhY2Nlc3MgaXNzdWVzXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAobm9kZU5hbWUgPT09IFwibGlua1wiKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBzSW5kZXggPSAwOyBzSW5kZXggPCBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LnN0eWxlU2hlZXRzLmxlbmd0aDsgc0luZGV4KyspIHtcbiAgICAgICAgICAgICAgICBsZXQgc2hlZXQgPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LnN0eWxlU2hlZXRzW3NJbmRleF0gYXMgQ1NTU3R5bGVTaGVldDtcbiAgICAgICAgICAgICAgICBpZiAoc2hlZXQgJiYgc2hlZXQub3duZXJOb2RlID09PSBydWxlQ29udGV4dCkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGVzID0gc2hlZXQuY3NzUnVsZXMgPyBzaGVldC5jc3NSdWxlcyA6IHNoZWV0LnJ1bGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgckluZGV4ID0gMDsgcGFzc2VkICYmIHJJbmRleCA8IHJ1bGVzLmxlbmd0aDsgckluZGV4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGVGcm9tTGluayA9IHJ1bGVzW3JJbmRleF0gYXMgYW55O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBydWxlcyBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGVGcm9tTGluay50eXBlICYmIHJ1bGVGcm9tTGluay50eXBlID09PSAxIC8qIENTU1J1bGUuU1RZTEVfUlVMRSAqLykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGVGcm9tTGluay5zdHlsZVsnZm9udFNpemUnXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmb250U2l6ZSA9IHJ1bGVGcm9tTGluay5zdHlsZVsnZm9udFNpemUnXS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZvdW5kID0gZm9udFNpemUubWF0Y2godGhlUGF0dGVybik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvbnRTaXplLmxlbmd0aCAmJiBmb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBjc3MgYWNjZXNzIGlzc3Vlc1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IHN0eWxlVmFsdWUgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoJ3N0eWxlJyk7XG4gICAgICAgICAgICBpZiAoc3R5bGVWYWx1ZSkge1xuICAgICAgICAgICAgICAgIGxldCBzdHlsZVBhdHRlcm4gPSAvZm9udC1zaXplOlxccypcXGQrKHZ3fHZofHZtaW58dm1heCkvZ2k7XG4gICAgICAgICAgICAgICAgbGV0IGZvdW5kID0gc3R5bGVWYWx1ZS5tYXRjaChzdHlsZVBhdHRlcm4pO1xuICAgICAgICAgICAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcGFzc2VkID8gUnVsZVBhc3MoXCJQYXNzXzBcIikgOiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBY2NOYW1lVXRpbCB9IGZyb20gXCIuLi91dGlsL0FjY05hbWVVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3Qgc3ZnX2dyYXBoaWNzX2xhYmVsbGVkOiBSdWxlID0ge1xuICAgIGlkOiBcInN2Z19ncmFwaGljc19sYWJlbGxlZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOnN2Z1wiLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwic3ZnX2dyYXBoaWNzX2xhYmVsbGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwicGFzc1wiOiBcInN2Z19ncmFwaGljc19sYWJlbGxlZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfYWNjX25hbWVcIjogXCJzdmdfZ3JhcGhpY3NfbGFiZWxsZWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIkEgbm9uLWRlY29yYXRpdmUgU1ZHIGVsZW1lbnQgbXVzdCBoYXZlIGFuIGFjY2Vzc2libGUgbmFtZVwiLFxuICAgICAgICAgICAgXCJwYXNzXCI6IFwiVGhlIFNWRyBlbGVtZW50IGhhcyBhbiBhY2Nlc3NpYmxlIG5hbWVcIixcbiAgICAgICAgICAgIFwiZmFpbF9hY2NfbmFtZVwiOiBcIlRoZSBTVkcgZWxlbWVudCBoYXMgbm8gYWNjZXNzaWJsZSBuYW1lXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCJdLCBcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbe1xuICAgICAgICBcIjdkNjczNFwiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcImZhaWxfYWNjX25hbWVcIjogXCJmYWlsXCJcbiAgICAgICAgfVxuICAgIH1dLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG5cbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkgfHwgVmlzVXRpbC5pc05vZGVQcmVzZW50YXRpb25hbChydWxlQ29udGV4dCkgfHwgQWNjTmFtZVV0aWwuaXNBY2Nlc3NpYmxlTmFtZUlnbm9yYWJsZShydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IG5hbWVfcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZShydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChuYW1lX3BhaXIgJiYgbmFtZV9wYWlyLm5hbWUgJiYgbmFtZV9wYWlyLm5hbWUudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2FjY19uYW1lXCIpXG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlQ29udGV4dEhpZXJhcmNoeSwgUnVsZUZhaWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5cbmV4cG9ydCBjb25zdCB0YWJsZV9hcmlhX2Rlc2NlbmRhbnRzOiBSdWxlID0ge1xuICAgIGlkOiBcInRhYmxlX2FyaWFfZGVzY2VuZGFudHNcIixcbiAgICBjb250ZXh0OiBcImFyaWE6dGFibGUgZG9tOnRyW3JvbGVdLCBhcmlhOnRhYmxlIGRvbTp0aFtyb2xlXSwgYXJpYTp0YWJsZSBkb206dGRbcm9sZV0sIGFyaWE6Z3JpZCBkb206dHJbcm9sZV0sIGFyaWE6Z3JpZCBkb206dGhbcm9sZV0sIGFyaWE6Z3JpZCBkb206dGRbcm9sZV0sIGFyaWE6dHJlZWdyaWQgZG9tOnRyW3JvbGVdLCBhcmlhOnRyZWVncmlkIGRvbTp0aFtyb2xlXSwgYXJpYTp0cmVlZ3JpZCBkb206dGRbcm9sZV1cIixcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcInRhYmxlX2FyaWFfZGVzY2VuZGFudHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJleHBsaWNpdF9yb2xlXCI6IFwidGFibGVfYXJpYV9kZXNjZW5kYW50cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGFibGUgc3RydWN0dXJlIGVsZW1lbnRzIGNhbm5vdCBzcGVjaWZ5IGFuIGV4cGxpY2l0ICdyb2xlJyB3aXRoaW4gdGFibGUgY29udGFpbmVyc1wiLFxuICAgICAgICAgICAgXCJleHBsaWNpdF9yb2xlXCI6IFwiQW4gZXhwbGljaXQgQVJJQSAncm9sZScgaXMgbm90IHZhbGlkIGZvciA8ezB9PiBlbGVtZW50IHdpdGhpbiBhbiBBUklBIHJvbGUgJ3sxfScgcGVyIHRoZSBBUklBIGluIEhUTUwgc3BlY2lmaWNhdGlvblwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDsgXG4gICAgICAgIGxldCBwYXJlbnRSb2xlID0gQ29tbW9uVXRpbC5pc1RhYmxlRGVzY2VuZGFudChjb250ZXh0SGllcmFyY2hpZXMpO1xuICAgICAgICAvLyBjYWNoZSB0aGUgcmVzdWx0XG4gICAgICAgIGlmIChwYXJlbnRSb2xlID09PSBudWxsIHx8IHBhcmVudFJvbGUubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIC8vIGlnbm9yZSB0aGUgcmVkdW5kYW5jeSBjYXNlczogcmVwb3J0ZWQgaW4gdGhlIGFyaWFfcm9sZV9yZWR1bmRhbnQgcnVsZVxuICAgICAgICBjb25zdCBpbXBsaWNpdFJvbGVzID0gQXJpYVV0aWwuZ2V0SW1wbGljaXRSb2xlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgY29uc3QgZXhwbGljaXRSb2xlcyA9IEFyaWFVdGlsLmdldFJvbGVzKHJ1bGVDb250ZXh0LCBmYWxzZSk7O1xuICAgICAgICBpZiAoaW1wbGljaXRSb2xlcyAmJiBpbXBsaWNpdFJvbGVzLmxlbmd0aCA+IDAgJiYgZXhwbGljaXRSb2xlcyAmJiBleHBsaWNpdFJvbGVzLmxlbmd0aCA+IDAgXG4gICAgICAgICAgICAmJiBleHBsaWNpdFJvbGVzLnNvbWUoaXRlbSA9PiBpbXBsaWNpdFJvbGVzLmluY2x1ZGVzKGl0ZW0pKSlcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJleHBsaWNpdF9yb2xlXCIsIFtjb250ZXh0W1wiZG9tXCJdLm5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSwgcGFyZW50Um9sZVswXS5yb2xlXSk7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IHRhYmxlX2NhcHRpb25fZW1wdHk6IFJ1bGUgPSB7XG4gICAgaWQ6IFwidGFibGVfY2FwdGlvbl9lbXB0eVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmNhcHRpb25cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlZhbGVyaWVfQ2FwdGlvbl9IYXNDb250ZW50XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwidGFibGVfY2FwdGlvbl9lbXB0eS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcInRhYmxlX2NhcHRpb25fZW1wdHkuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInRhYmxlX2NhcHRpb25fZW1wdHkuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUaGUgPHRhYmxlPiBlbGVtZW50IGhhcyBhbiBlbXB0eSA8Y2FwdGlvbj4gZWxlbWVudFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkEgPGNhcHRpb24+IGVsZW1lbnQgZm9yIGEgPHRhYmxlPiBlbGVtZW50IG11c3QgY29udGFpbiBkZXNjcmlwdGl2ZSB0ZXh0XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcGFzc2VkID0gQ29tbW9uVXRpbC5oYXNJbm5lckNvbnRlbnRIaWRkZW4ocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IHRhYmxlX2NhcHRpb25fbmVzdGVkOiBSdWxlID0ge1xuICAgIGlkOiBcInRhYmxlX2NhcHRpb25fbmVzdGVkXCIsXG4gICAgY29udGV4dDogXCJkb206Y2FwdGlvblwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiVmFsZXJpZV9DYXB0aW9uX0luVGFibGVcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJ0YWJsZV9jYXB0aW9uX25lc3RlZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcInRhYmxlX2NhcHRpb25fbmVzdGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJ0YWJsZV9jYXB0aW9uX25lc3RlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIjxjYXB0aW9uPiBlbGVtZW50IGlzIG5vdCBuZXN0ZWQgaW5zaWRlIGEgPHRhYmxlPiBlbGVtZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGhlIDxjYXB0aW9uPiBlbGVtZW50IG11c3QgYmUgbmVzdGVkIGluc2lkZSB0aGUgYXNzb2NpYXRlZCA8dGFibGU+IGVsZW1lbnRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFwidGFibGVcIikgIT0gbnVsbDtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFRhYmxlVXRpbCB9IGZyb20gXCIuLi91dGlsL1RhYmxlVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgdGFibGVfaGVhZGVyc19leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwidGFibGVfaGVhZGVyc19leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTp0YWJsZVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX1RhYmxlX0RhdGFIZWFkaW5nc0FyaWFcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJ0YWJsZV9oZWFkZXJzX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcInRhYmxlX2hlYWRlcnNfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJ0YWJsZV9oZWFkZXJzX2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlRhYmxlIGhhcyBubyBoZWFkZXJzIGlkZW50aWZpZWRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJEYXRhIHRhYmxlIG11c3QgaWRlbnRpZnkgaGVhZGVyc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgSFRNTFRhYmxlRWxlbWVudDtcbiAgICAgICAgLy8gSWYgdGhpcyBpcyBhIGxheW91dCB0YWJsZSBvciB0aGVyZSBhcmUgbm8gcm93cywgdGhlIHJ1bGUgZG9lcyBub3QgYXBwbHkuXG4gICAgICAgIGxldCByb3dzID0gcnVsZUNvbnRleHQucm93cztcbiAgICAgICAgaWYgKCFUYWJsZVV0aWwuaXNEYXRhVGFibGUocnVsZUNvbnRleHQpIHx8IHJvd3MgPT09IG51bGwgfHwgcm93cy5sZW5ndGggPT09IDApXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgcGFzc2VkID0gVGFibGVVdGlsLnRhYmxlSGVhZGVyRXhpc3RzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKHBhc3NlZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIFxuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IERPTVV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5pbXBvcnQgeyBBUklBTWFwcGVyIH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQU1hcHBlclwiO1xuXG5leHBvcnQgY29uc3QgdGFibGVfaGVhZGVyc19yZWZfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwidGFibGVfaGVhZGVyc19yZWZfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbTp0ZFtoZWFkZXJzXSwgZG9tOnRoW2hlYWRlcnNdXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwidGFibGVfaGVhZGVyc19yZWZfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJ0YWJsZV9oZWFkZXJzX3JlZl92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcInRhYmxlX2hlYWRlcnNfcmVmX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwidGFibGVfaGVhZGVyc19yZWZfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzRcIjogXCJ0YWJsZV9oZWFkZXJzX3JlZl92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwidGFibGVfaGVhZGVyc19yZWZfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUaGUgJ2hlYWRlcnMnIGF0dHJpYnV0ZSB2YWx1ZSBcXFwiezB9XFxcIiBkb2VzIG5vdCByZWZlcmVuY2UgYSB2YWxpZCAnaWQnIGluIHRoaXMgZG9jdW1lbnRcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiVGhlICdoZWFkZXJzJyBhdHRyaWJ1dGUgdmFsdWUgXFxcInswfVxcXCIgcmVmZXJzIHRvIGl0c2VsZlwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJUaGUgJ2hlYWRlcnMnIGF0dHJpYnV0ZSB2YWx1ZSBcXFwiezB9XFxcIiBkb2VzIG5vdCByZWZlciB0byBhIGNlbGwgaW4gdGhlIHNhbWUgdGFibGVcIixcbiAgICAgICAgICAgIFwiRmFpbF80XCI6IFwiVGhlICdoZWFkZXJzJyBhdHRyaWJ1dGUgdmFsdWUgXFxcInswfVxcXCIgZG9lcyBub3QgcmVmZXIgdG8gYSBjZWxsIGluZGljYXRlZCB3aXRoIDx0aD4gb3IgYSByb2xlIG9mIFxcXCJjb2x1bW5oZWFkZXJcXFwiIG9yIFxcXCJyb3doZWFkZXJcXFwiXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGhlICdoZWFkZXJzJyBhdHRyaWJ1dGUgc2hvdWxkIHJlZmVyIHRvIGEgdmFsaWQgY2VsbCBpbiB0aGUgc2FtZSB0YWJsZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogW1wiYTI1ZjQ1XCJdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXJlbnRUYWJsZSA9IENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFwidGFibGVcIik7XG4gICAgICAgIGxldCBwYXJlbnRSb2xlID0gQVJJQU1hcHBlci5ub2RlVG9Sb2xlKHBhcmVudFRhYmxlKTtcbiAgICAgICAgLy8gSWYgdGhpcyBpcyBhIGxheW91dCB0YWJsZSBvciBhIHNpbXBsZSB0YWJsZSB0aGUgcnVsZSBkb2VzIG5vdCBhcHBseS5cbiAgICAgICAgaWYgKHBhcmVudFRhYmxlID09IG51bGwgfHwgIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShwYXJlbnRUYWJsZSkgfHwgIVtcInRhYmxlXCIsIFwiZ3JpZFwiXS5pbmNsdWRlcyhwYXJlbnRSb2xlKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGxldCBkb2MgPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50O1xuICAgICAgICBsZXQgdmFsdWUgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJoZWFkZXJzXCIpO1xuICAgICAgICBpZiAoIXZhbHVlKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IGlkcyA9IHZhbHVlLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgbGV0IGludmFsaWRIZWFkZXJWYWx1ZXMgPSBbXTtcbiAgICAgICAgbGV0IHNhbWVOb2RlSGVhZGVyVmFsdWVzID0gW107XG4gICAgICAgIGxldCBzYW1lVGFibGVIZWFkZXJWYWx1ZXMgPSBbXTtcbiAgICAgICAgbGV0IGludmFsaWRFbGVtSGVhZGVyVmFsdWVzID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgaWQgPSBpZHNbaV07XG4gICAgICAgICAgICBpZiAoaWQudHJpbSgpID09PSAnJykgY29udGludWU7XG4gICAgICAgICAgICBjb25zdCBlbGVtID0gZG9jLmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgICAgICAgICAgIGlmICghZWxlbSlcbiAgICAgICAgICAgICAgICBpbnZhbGlkSGVhZGVyVmFsdWVzLnB1c2goaWQpO1xuICAgICAgICAgICAgZWxzZSBpZiAoRE9NVXRpbC5zYW1lTm9kZShlbGVtLCBydWxlQ29udGV4dCkpXG4gICAgICAgICAgICAgICAgc2FtZU5vZGVIZWFkZXJWYWx1ZXMucHVzaChpZCk7XG4gICAgICAgICAgICBlbHNlIGlmICghRE9NVXRpbC5pc0luU2FtZVRhYmxlKGVsZW0sIHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgICAgICBzYW1lVGFibGVIZWFkZXJWYWx1ZXMucHVzaChpZCk7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgZWxlbU5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW1OYW1lICE9PSAndGgnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXMoZWxlbSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghcm9sZXMuaW5jbHVkZXMoJ2NvbHVtbmhlYWRlcicpICYmICFyb2xlcy5pbmNsdWRlcygncm93aGVhZGVyJykpXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkRWxlbUhlYWRlclZhbHVlcy5wdXNoKGlkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmVzdWx0cyA9IFtdO1xuICAgICAgICBpZiAoaW52YWxpZEhlYWRlclZhbHVlcy5sZW5ndGggIT0gMClcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaChSdWxlRmFpbChcIkZhaWxfMVwiLCBbaW52YWxpZEhlYWRlclZhbHVlcy50b1N0cmluZygpXSkpO1xuICAgICAgICBpZiAoc2FtZU5vZGVIZWFkZXJWYWx1ZXMubGVuZ3RoICE9IDApXG4gICAgICAgICAgICByZXN1bHRzLnB1c2goUnVsZUZhaWwoXCJGYWlsXzJcIiwgW3NhbWVOb2RlSGVhZGVyVmFsdWVzLnRvU3RyaW5nKCldKSk7XG4gICAgICAgIGlmIChzYW1lVGFibGVIZWFkZXJWYWx1ZXMubGVuZ3RoICE9IDApXG4gICAgICAgICAgICByZXN1bHRzLnB1c2goUnVsZUZhaWwoXCJGYWlsXzNcIiwgW3NhbWVUYWJsZUhlYWRlclZhbHVlcy50b1N0cmluZygpXSkpO1xuICAgICAgICBpZiAoaW52YWxpZEVsZW1IZWFkZXJWYWx1ZXMubGVuZ3RoICE9IDApXG4gICAgICAgICAgICByZXN1bHRzLnB1c2goUnVsZUZhaWwoXCJGYWlsXzRcIiwgW2ludmFsaWRFbGVtSGVhZGVyVmFsdWVzLnRvU3RyaW5nKCldKSk7XG5cbiAgICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHRzO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgVGFibGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVGFibGVVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCB0YWJsZV9oZWFkZXJzX3JlbGF0ZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwidGFibGVfaGVhZGVyc19yZWxhdGVkXCIsXG4gICAgY29udGV4dDogXCJkb206dGQsIGRvbTp0aFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiVmFsZXJpZV9UYWJsZV9EYXRhQ2VsbFJlbGF0aW9uc2hpcHNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJ0YWJsZV9oZWFkZXJzX3JlbGF0ZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJ0YWJsZV9oZWFkZXJzX3JlbGF0ZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInRhYmxlX2hlYWRlcnNfcmVsYXRlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkNvbXBsZXggdGFibGUgZG9lcyBub3QgaGF2ZSBoZWFkZXJzIGZvciBlYWNoIGNlbGwgcHJvcGVybHkgZGVmaW5lZCB3aXRoICdoZWFkZXInIG9yICdzY29wZSdcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJGb3IgYSBjb21wbGV4IGRhdGEgdGFibGUsIGFsbCA8dGg+IGFuZCA8dGQ+IGVsZW1lbnRzIG11c3QgYmUgcmVsYXRlZCB2aWEgJ2hlYWRlcicgb3IgJ3Njb3BlJyBhdHRyaWJ1dGVzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcGFyZW50VGFibGUgPSBDb21tb25VdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBcInRhYmxlXCIpO1xuICAgICAgICAvLyBJZiB0aGlzIGlzIGEgbGF5b3V0IHRhYmxlIG9yIGEgc2ltcGxlIHRhYmxlIHRoZSBydWxlIGRvZXMgbm90IGFwcGx5LlxuICAgICAgICBpZiAocGFyZW50VGFibGUgPT0gbnVsbCB8fCAhVGFibGVVdGlsLmlzQ29tcGxleERhdGFUYWJsZShwYXJlbnRUYWJsZSkpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICAvLyBJZiB0aGlzIHRhYmxlIGhhc24ndCBiZWVuIHByZXByb2Nlc3NlZCwgcHJvY2VzcyBpdC5cbiAgICAgICAgaWYgKENhY2hlVXRpbC5nZXRDYWNoZShydWxlQ29udGV4dCwgXCJ0YWJsZV9oZWFkZXJzX3JlbGF0ZWRcIiwgbnVsbCkgPT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIEJ1aWxkIGEgZ3JpZCB0aGF0J3MgYWN0dWFsbHkgdXNhYmxlIChyb3dzcGFuIGFuZCBjb2xzcGFuIGVsZW1lbnRzIGFyZSBkdXBsaWNhdGVkKVxuICAgICAgICAgICAgLy8gVGhpcyBidWlsZHMgYSByZWFsIDJkIHRhYmxlIGFycmF5LlxuICAgICAgICAgICAgbGV0IGdyaWQgPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFyZW50VGFibGUucm93cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIGxldCByb3cgPSBwYXJlbnRUYWJsZS5yb3dzW2ldO1xuICAgICAgICAgICAgICAgIGlmICghZ3JpZFtpXSkgZ3JpZFtpXSA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcm93LmNlbGxzLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjZWxsID0gcm93LmNlbGxzW2pdO1xuICAgICAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoY2VsbCwgXCJ0YWJsZV9oZWFkZXJzX3JlbGF0ZWRcIiwgaSArIFwiOlwiICsgaik7XG4gICAgICAgICAgICAgICAgICAgIGxldCB3aWR0aCA9IHBhcnNlSW50KGNlbGwuZ2V0QXR0cmlidXRlKFwiY29sc3BhblwiKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghd2lkdGgpIHdpZHRoID0gMTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGhlaWdodCA9IHBhcnNlSW50KGNlbGwuZ2V0QXR0cmlidXRlKFwicm93c3BhblwiKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaGVpZ2h0KSBoZWlnaHQgPSAxO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZ1ggPSAwO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoZ3JpZFtpXVtnWF0pIGdYICs9IDE7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgaGVpZ2h0OyArK2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZ3JpZFtpICsga10pIGdyaWRbaSArIGtdID0gW11cbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGwgPSAwOyBsIDwgd2lkdGg7ICsrbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyaWRbaSArIGtdW2dYICsgbF0gPSBjZWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJdGVyYXRlIHRocm91Z2ggdGhlIHRhYmxlIGdyaWQgYW5kIHJlY29yZCBoZWFkZXJzIHRoYXQgcG9pbnQgdG8gY2VsbHMgYW5kXG4gICAgICAgICAgICAvLyBjZWxscyB0aGF0IGFyZSBwb2ludGVkIHRvIGJ5IGhlYWRlcnNcbiAgICAgICAgICAgIGxldCBkb2MgPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50O1xuICAgICAgICAgICAgbGV0IGxvb2t1cCA9IHt9XG4gICAgICAgICAgICBsZXQgc2NvcGVkQ29scyA9IHt9O1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBncmlkLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJvd1Njb3BlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgZ3JpZFtpXS5sZW5ndGg7ICsraikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZ3JpZENlbGwgPSBncmlkW2ldW2pdO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZ3JpZE5vZGVOYW1lID0gZ3JpZENlbGwubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGdyaWROb2RlTmFtZSA9PSBcInRoXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChncmlkQ2VsbC5nZXRBdHRyaWJ1dGUoXCJzY29wZVwiKSA9PSBcInJvd1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93U2NvcGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSdzIGFuIGF4aXMgYXR0cmlidXRlLCBpdCBtdXN0IGJlIHJlZmVycmVkIHRvIGJ5IGhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2NvcGUgaXMgbm90IGVub3VnaC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUNvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkoZ3JpZENlbGwsIFwiYXhpc1wiKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9va3VwW0NhY2hlVXRpbC5nZXRDYWNoZShncmlkQ2VsbCwgXCJ0YWJsZV9oZWFkZXJzX3JlbGF0ZWRcIiwgbnVsbCldID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZ3JpZENlbGwuZ2V0QXR0cmlidXRlKFwic2NvcGVcIikgPT0gXCJjb2xcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlZENvbHNbal0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlJ3MgYW4gYXhpcyBhdHRyaWJ1dGUsIGl0IG11c3QgYmUgcmVmZXJyZWQgdG8gYnkgaGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzY29wZSBpcyBub3QgZW5vdWdoLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShncmlkQ2VsbCwgXCJheGlzXCIpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rdXBbQ2FjaGVVdGlsLmdldENhY2hlKGdyaWRDZWxsLCBcInRhYmxlX2hlYWRlcnNfcmVsYXRlZFwiLCBudWxsKV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSGVhZGVycyBjYW4gcmVmZXIgdG8gb3RoZXIgaGVhZGVyc1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkoZ3JpZENlbGwsIFwiaGVhZGVyc1wiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoZHJzID0gZ3JpZENlbGwuZ2V0QXR0cmlidXRlKFwiaGVhZGVyc1wiKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBoZHJzLmxlbmd0aDsgKytrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoZWFkRWxlbSA9IGRvYy5nZXRFbGVtZW50QnlJZChoZHJzW2tdLnRyaW0oKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoZWFkRWxlbSAmJiBDb21tb25VdGlsLmdldEFuY2VzdG9yKGhlYWRFbGVtLCBcInRhYmxlXCIpID09IHBhcmVudFRhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rdXBbQ2FjaGVVdGlsLmdldENhY2hlKGhlYWRFbGVtLCBcInRhYmxlX2hlYWRlcnNfcmVsYXRlZFwiLCBudWxsKV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGdyaWROb2RlTmFtZSA9PSBcInRkXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3dTY29wZWQgfHwgc2NvcGVkQ29sc1tqXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb2t1cFtDYWNoZVV0aWwuZ2V0Q2FjaGUoZ3JpZENlbGwsIFwidGFibGVfaGVhZGVyc19yZWxhdGVkXCIsIG51bGwpXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkoZ3JpZENlbGwsIFwiaGVhZGVyc1wiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoZHJzID0gZ3JpZENlbGwuZ2V0QXR0cmlidXRlKFwiaGVhZGVyc1wiKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBoZHJzLmxlbmd0aDsgKytrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoZWFkRWxlbSA9IGRvYy5nZXRFbGVtZW50QnlJZChoZHJzW2tdLnRyaW0oKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoZWFkRWxlbSAmJiBDb21tb25VdGlsLmdldEFuY2VzdG9yKGhlYWRFbGVtLCBcInRhYmxlXCIpID09IHBhcmVudFRhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rdXBbQ2FjaGVVdGlsLmdldENhY2hlKGdyaWRDZWxsLCBcInRhYmxlX2hlYWRlcnNfcmVsYXRlZFwiLCBudWxsKV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9va3VwW0NhY2hlVXRpbC5nZXRDYWNoZShoZWFkRWxlbSwgXCJ0YWJsZV9oZWFkZXJzX3JlbGF0ZWRcIiwgbnVsbCldID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShwYXJlbnRUYWJsZSwgXCJ0YWJsZV9oZWFkZXJzX3JlbGF0ZWRcIiwgbG9va3VwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByY0luZm8gPSBDYWNoZVV0aWwuZ2V0Q2FjaGUocnVsZUNvbnRleHQsIFwidGFibGVfaGVhZGVyc19yZWxhdGVkXCIsIG51bGwpO1xuICAgICAgICBsZXQgdEluZm8gPSBDYWNoZVV0aWwuZ2V0Q2FjaGUocGFyZW50VGFibGUsIFwidGFibGVfaGVhZGVyc19yZWxhdGVkXCIsIG51bGwpO1xuICAgICAgICBsZXQgcGFzc2VkID0gcmNJbmZvICYmIHRJbmZvICYmIHJjSW5mbyBpbiB0SW5mbztcblxuICAgICAgICBpZiAoIXBhc3NlZCAmJiByY0luZm8gPT09IFwiMDowXCIgJiZcbiAgICAgICAgICAgIENvbW1vblV0aWwuZ2V0SW5uZXJUZXh0KHJ1bGVDb250ZXh0KS50cmltKCkubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIC8vIFdlIGRvbid0IHRlc3QgaWYgaXQncyB0aGUgdXBwZXItbGVmdCBjZWxsIGFuZCBpdCdzIGVtcHR5XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRoZSB0YWJsZSBoYXMgbm8gdGgncywgaXQgbWF5IGp1c3QgYmUgdGhhdCB0aGlzIHdhcyBzdXBwb3NlZCB0byBiZSBhIGxheW91dFxuICAgICAgICAvLyB0YWJsZSwgd2hpY2ggaW50cm9kdWNlcyBhIGxvdCBvZiBub2lzZS4gIEluIHRoYXQgY2FzZSwgb25seSB0cmlnZ2VyIHRoaXMgZXJyb3JcbiAgICAgICAgLy8gb25jZSBwZXIgdGFibGUuXG4gICAgICAgIGlmICghcGFzc2VkICYmIHBhcmVudFRhYmxlLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwidGhcIikubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIGlmIChDYWNoZVV0aWwuZ2V0Q2FjaGUocGFyZW50VGFibGUsIFwidGFibGVfaGVhZGVyc19yZWxhdGVkX1RyaWdPbmNlXCIsIGZhbHNlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShwYXJlbnRUYWJsZSwgXCJ0YWJsZV9oZWFkZXJzX3JlbGF0ZWRfVHJpZ09uY2VcIiwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgVGFibGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVGFibGVVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCB0YWJsZV9sYXlvdXRfbGluZWFyaXplZDogUnVsZSA9IHtcbiAgICBpZDogXCJ0YWJsZV9sYXlvdXRfbGluZWFyaXplZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOnRhYmxlXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfVGFibGVfTGF5b3V0VHJpZ2dlclwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJ0YWJsZV9sYXlvdXRfbGluZWFyaXplZC5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwidGFibGVfbGF5b3V0X2xpbmVhcml6ZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInRhYmxlX2xheW91dF9saW5lYXJpemVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgdGFibGUgaXMgbm90IGJlaW5nIHVzZWQgdG8gZm9ybWF0IHRleHQgY29udGVudCBpbiBjb2x1bW5zIHVubGVzcyB0aGUgdGFibGUgY2FuIGJlIGxpbmVhcml6ZWRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBdm9pZCB1c2luZyB0YWJsZXMgdG8gZm9ybWF0IHRleHQgZG9jdW1lbnRzIGluIGNvbHVtbnMgdW5sZXNzIHRoZSB0YWJsZSBjYW4gYmUgbGluZWFyaXplZFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfRk9VUlxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgcGFzc2VkID0gIVRhYmxlVXRpbC5pc0xheW91dFRhYmxlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGNvbnN0IHRhYmxlX3Njb3BlX3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcInRhYmxlX3Njb3BlX3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJkb206dGRbc2NvcGVdLCBkb206dGhbc2NvcGVdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfVGFibGVfU2NvcGVfVmFsaWRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkZhaWxfMlwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwidGFibGVfc2NvcGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJ0YWJsZV9zY29wZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcInRhYmxlX3Njb3BlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJ0YWJsZV9zY29wZV92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlZhbHVlIHByb3ZpZGVkIGlzIGludmFsaWQgZm9yIHRoZSAnc2NvcGUnIGF0dHJpYnV0ZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJUaGUgJ3Njb3BlJyBhdHRyaWJ1dGUgc2hvdWxkIG9ubHkgYmUgdXNlZCBvbiBhIDx0aD4gZWxlbWVudFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlZhbHVlIGZvciAnc2NvcGUnIGF0dHJpYnV0ZSBtdXN0IGJlIFxcXCJyb3dcXFwiLCBcXFwiY29sXFxcIiwgXFxcInJvd2dyb3VwXFxcIiwgb3IgXFxcImNvbGdyb3VwXFxcIlwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgY29uc3Qgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAobm9kZU5hbWUgPT09ICd0ZCcpXG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzJcIik7XG5cbiAgICAgICAgLy9vbmx5IGNvbnRpbnVlIGZvciAndGgnXG4gICAgICAgIGxldCBzY29wZVZhbCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInNjb3BlXCIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBsZXQgcGFzc2VkID0gL14ocm93fGNvbHxyb3dncm91cHxjb2xncm91cCkkLy50ZXN0KHNjb3BlVmFsKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgVGFibGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVGFibGVVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCB0YWJsZV9zdHJ1Y3R1cmVfbWlzdXNlOiBSdWxlID0ge1xuICAgIGlkOiBcInRhYmxlX3N0cnVjdHVyZV9taXN1c2VcIixcbiAgICBjb250ZXh0OiBcImRvbTp0YWJsZVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX1RhYmxlX1N0cnVjdHVyZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInRhYmxlX3N0cnVjdHVyZV9taXN1c2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJ0YWJsZV9zdHJ1Y3R1cmVfbWlzdXNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJ0YWJsZV9zdHJ1Y3R1cmVfbWlzdXNlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiVGhlIDx7MH0+IGVsZW1lbnQgd2l0aCBcXFwicHJlc2VudGF0aW9uXFxcIiByb2xlIG9yIFxcXCJub25lXFxcIiByb2xlIGhhcyBzdHJ1Y3R1cmFsIGVsZW1lbnQocykgYW5kL29yIGF0dHJpYnV0ZShzKSAnezF9J1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRhYmxlIGVsZW1lbnRzIHdpdGggJ3JvbGU9XFxcInByZXNlbnRhdGlvblxcXCIgb3IgJ3JvbGU9XFxcIm5vbmVcXFwiIHNob3VsZCBub3QgaGF2ZSBzdHJ1Y3R1cmFsIGVsZW1lbnRzIG9yIGF0dHJpYnV0ZXNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgLy8gSkNIIC0gT1VUIE9GIFNDT1BFIGhpZGRlbiBpbiBjb250ZXh0XG4gICAgICAgIGlmIChUYWJsZVV0aWwuaXNEYXRhVGFibGUocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKEFyaWFVdGlsLmlzTm9kZUluR3JpZChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCBlcnJvck5vZGVzID0gW107XG4gICAgICAgIGlmIChDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInN1bW1hcnlcIikpXG4gICAgICAgICAgICBlcnJvck5vZGVzLnB1c2gocnVsZUNvbnRleHQpO1xuXG4gICAgICAgIGxldCBjYXB0aW9uRWxlbXMgPSBydWxlQ29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZShcImNhcHRpb25cIik7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2FwdGlvbkVsZW1zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBpZiAoQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihjYXB0aW9uRWxlbXNbaV0sIFwidGFibGVcIikgPT0gcnVsZUNvbnRleHQpIHtcblxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBub2RlIHNob3VsZCBiZSBza2lwcGVkIG9yIG5vdCBiYXNlZCBvbiB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyBhbmQgaWYgdGhlIG5vZGUgaXNWaXNpYmxlIG9yXG4gICAgICAgICAgICAgICAgLy8gbm90LlxuICAgICAgICAgICAgICAgIGlmIChDb21tb25VdGlsLnNob3VsZE5vZGVCZVNraXBwZWRIaWRkZW4oY2FwdGlvbkVsZW1zW2ldKSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIG5vZGUgdG8gdGhlIGVycm9yTm9kZXNcbiAgICAgICAgICAgICAgICBlcnJvck5vZGVzLnB1c2goY2FwdGlvbkVsZW1zW2ldKTtcblxuICAgICAgICAgICAgICAgIC8vIFNpbmNlIHdlIGFyZSBub3QgYWN0dWFsbHkgbWFraW5nIHVzZSBvZiB0aGVzZXMgZXJyb3JOb2RlcyBldmVuIHRob3VnaCB0aGV5IGFyZSBwYXNzZWQgYWxvbmcgd2l0aFxuICAgICAgICAgICAgICAgIC8vIFZhbGlkYXRpb25SZXN1bHQsIHdlIGRvIG5vdCBuZWVkIHRvIGtlZXAgbG9vcGluZyBvdmVyIGFuZCBnZXR0aW5nIGV2ZXJ5IHNpbmdsZSB2aW9sYXRpbmcgbm9kZSB1bmRlclxuICAgICAgICAgICAgICAgIC8vIHRoZSBydWxlIGNvbnRleHQuIFRoaXMgY2FuIGJlIGEgZnV0dXJlIGVuaGFuY2VubWVudCB3aGVyZSB3ZSBhY3R1YWxseSBtYWtlIHVzZSBvZiB0aGUgZXJyb3Igbm9kZXMgdGhhdFxuICAgICAgICAgICAgICAgIC8vIGFyZSBwYXNzZWQgYWxvbmcuIEFkZGluZyB0aGlzIGJyZWFrIHRvIHNwZWVkIHVwIHBlcmZvcm1hbmNlIGF0IHRoaXMgcG9pbnQuXG4gICAgICAgICAgICAgICAgYnJlYWs7IC8vIFRoZXJlIGlzIG5vIHBvaW50IHRvIGtlZXAgYWRkaW5nIHRoZSBlcnJvciBub2Rlcywgc3RvcCBhZnRlciBmaW5kaW5nIHRoZSBmaXJzdCBvbmVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB0aE5vZGVzID0gcnVsZUNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJ0aFwiKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aE5vZGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBpZiAoQ29tbW9uVXRpbC5nZXRBbmNlc3Rvcih0aE5vZGVzW2ldLCBcInRhYmxlXCIpID09IHJ1bGVDb250ZXh0KSB7XG5cbiAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgbm9kZSBzaG91bGQgYmUgc2tpcHBlZCBvciBub3QgYmFzZWQgb24gdGhlIENoZWNrIEhpZGRlbiBDb250ZW50IHNldHRpbmcgYW5kIGlmIHRoZSBub2RlIGlzVmlzaWJsZSBvclxuICAgICAgICAgICAgICAgIC8vIG5vdC5cbiAgICAgICAgICAgICAgICBpZiAoQ29tbW9uVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKHRoTm9kZXNbaV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgbm9kZSB0byB0aGUgZXJyb3JOb2Rlc1xuICAgICAgICAgICAgICAgIGVycm9yTm9kZXMucHVzaCh0aE5vZGVzW2ldKTtcblxuICAgICAgICAgICAgICAgIC8vIFNpbmNlIHdlIGFyZSBub3QgYWN0dWFsbHkgbWFraW5nIHVzZSBvZiB0aGVzZXMgZXJyb3JOb2RlcyBldmVuIHRob3VnaCB0aGV5IGFyZSBwYXNzZWQgYWxvbmcgd2l0aFxuICAgICAgICAgICAgICAgIC8vIFZhbGlkYXRpb25SZXN1bHQsIHdlIGRvIG5vdCBuZWVkIHRvIGtlZXAgbG9vcGluZyBvdmVyIGFuZCBnZXR0aW5nIGV2ZXJ5IHNpbmdsZSB2aW9sYXRpbmcgbm9kZSB1bmRlclxuICAgICAgICAgICAgICAgIC8vIHRoZSBydWxlIGNvbnRleHQuIFRoaXMgY2FuIGJlIGEgZnV0dXJlIGVuaGFuY2VubWVudCB3aGVyZSB3ZSBhY3R1YWxseSBtYWtlIHVzZSBvZiB0aGUgZXJyb3Igbm9kZXMgdGhhdFxuICAgICAgICAgICAgICAgIC8vIGFyZSBwYXNzZWQgYWxvbmcuIEFkZGluZyB0aGlzIGJyZWFrIHRvIHNwZWVkIHVwIHBlcmZvcm1hbmNlIGF0IHRoaXMgcG9pbnQuXG4gICAgICAgICAgICAgICAgYnJlYWs7IC8vIFRoZXJlIGlzIG5vIHBvaW50IHRvIGtlZXAgYWRkaW5nIHRoZSBlcnJvciBub2Rlcywgc3RvcCBhZnRlciBmaW5kaW5nIHRoZSBmaXJzdCBvbmVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgdGROb2RlcyA9IHJ1bGVDb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwidGRcIik7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGROb2Rlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgaWYgKCh0ZE5vZGVzW2ldLmhhc0F0dHJpYnV0ZShcInNjb3BlXCIpIHx8IHRkTm9kZXNbaV0uaGFzQXR0cmlidXRlKFwiaGVhZGVyc1wiKSkgJiZcbiAgICAgICAgICAgICAgICBDb21tb25VdGlsLmdldEFuY2VzdG9yKHRkTm9kZXNbaV0sIFwidGFibGVcIikgPT0gcnVsZUNvbnRleHQpIHtcblxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBub2RlIHNob3VsZCBiZSBza2lwcGVkIG9yIG5vdCBiYXNlZCBvbiB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyBhbmQgaWYgdGhlIG5vZGUgaXNWaXNpYmxlIG9yXG4gICAgICAgICAgICAgICAgLy8gbm90LlxuICAgICAgICAgICAgICAgIGlmIChDb21tb25VdGlsLnNob3VsZE5vZGVCZVNraXBwZWRIaWRkZW4odGROb2Rlc1tpXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gQWRkIHRoZSBub2RlIHRvIHRoZSBlcnJvck5vZGVzXG4gICAgICAgICAgICAgICAgZXJyb3JOb2Rlcy5wdXNoKHRkTm9kZXNbaV0pO1xuXG4gICAgICAgICAgICAgICAgLy8gU2luY2Ugd2UgYXJlIG5vdCBhY3R1YWxseSBtYWtpbmcgdXNlIG9mIHRoZXNlcyBlcnJvck5vZGVzIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIHBhc3NlZCBhbG9uZyB3aXRoXG4gICAgICAgICAgICAgICAgLy8gVmFsaWRhdGlvblJlc3VsdCwgd2UgZG8gbm90IG5lZWQgdG8ga2VlcCBsb29waW5nIG92ZXIgYW5kIGdldHRpbmcgZXZlcnkgc2luZ2xlIHZpb2xhdGluZyBub2RlIHVuZGVyXG4gICAgICAgICAgICAgICAgLy8gdGhlIHJ1bGUgY29udGV4dC4gVGhpcyBjYW4gYmUgYSBmdXR1cmUgZW5oYW5jZW5tZW50IHdoZXJlIHdlIGFjdHVhbGx5IG1ha2UgdXNlIG9mIHRoZSBlcnJvciBub2RlcyB0aGF0XG4gICAgICAgICAgICAgICAgLy8gYXJlIHBhc3NlZCBhbG9uZy4gQWRkaW5nIHRoaXMgYnJlYWsgdG8gc3BlZWQgdXAgcGVyZm9ybWFuY2UgYXQgdGhpcyBwb2ludC5cbiAgICAgICAgICAgICAgICBicmVhazsgLy8gVGhlcmUgaXMgbm8gcG9pbnQgdG8ga2VlcCBhZGRpbmcgdGhlIGVycm9yIG5vZGVzLCBzdG9wIGFmdGVyIGZpbmRpbmcgdGhlIGZpcnN0IG9uZVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IHRoZSBub2RlIG5hbWUgZm9yIHRoZSBydWxlIGNvbnRleHQgZWxlbWVudCBpbiB0aGlzIGNhc2UgaXQgd2lsbCBhbHdheXMgYmUgdGFibGVcbiAgICAgICAgbGV0IGN1cnJlbnRFbGVtZW50VG9rZW4gPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIC8vIENvbnN0cnVjdCBhIG5ldyBhcnJheSB3aGljaCB3aWxsIGNvbnRhbiBvbmx5IHRoZSBlbGVtZW50IHRhZyBmb3IgdGhlIHZpb2xhdGlvbiBlbGVtZW50c1xuICAgICAgICBsZXQgc3RydWN0dXJhbEVsZW1lbnRUb2tlbnMgPSBuZXcgQXJyYXkoKTtcblxuICAgICAgICAvLyBDb25zdHJ1Y3QgYSBzZWVuIGhhc2ggdGhhdCB3aWxsIGtlZXAgdHJhc2sgb2YgYWxsIHRoZSBlbGVtZW50cyB0aGF0IHdlcmUgYWxyZWFkeSBhZGRlZCB0byB0aGUgdG9rZW4gYXJyYXksIHRvIG1ha2Ugc3VyZVxuICAgICAgICAvLyB3ZSBkbyBub3QgZHVwbGljYXRlIGFueSBvZiB0aGUgZWxlbWVudHMuIER1cGxpY2F0ZSBlbGVtZW50IHRhZ3MgaW4gdGhlIHRva2VuIG1lc3NhZ2UgbG9va3MgYmFkIGFuZCBjb25mdXNpbmcuXG4gICAgICAgIGxldCBzZWVuID0ge307XG5cbiAgICAgICAgLy8gTG9vcCB0aHJvdWdoIGFsbCB0aGUgdmlvbGF0aW5nIHN0cnVjdHVyYWwgZWxlbWVudHMgYW5kIGV4dHJhY3QgdGhlIGVsZW1lbnQgdGFnIHRvIGJlIHVzZWQgYXMgYSB0b2tlblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVycm9yTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIC8vIEdldCB0aGUgbm9kZSBuYW1lICh0YWcgbmFtZSkgZm9yIHRoZSB2aW9sYXRpbmcgc3RydWN0dXJhbCBlbGVtZW50XG4gICAgICAgICAgICBsZXQgbm9kZU5hbWUgPSBlcnJvck5vZGVzW2ldLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgICAgIC8vIE9ubHkgbmVlZCB0byBhZGQgdGhlIHZpb2xhdGluZyBlbGVtZW50IG9uY2VcbiAgICAgICAgICAgIGlmICghc2Vlbi5oYXNPd25Qcm9wZXJ0eShub2RlTmFtZSkpIHtcbiAgICAgICAgICAgICAgICAvLyBTaW5jZSB3ZSBhcmUgYWRkaW5nIHRoZSB0b2tlbiBhcyBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyB3ZSBuZWVkIHRvIGhhbmRsZVxuICAgICAgICAgICAgICAgIC8vIHRoZSBzdW1tYXJ5IGF0dHJpYnV0ZSBvbiB0aGUgcnVsZUNvbnRleHQgKHRhYmxlKS4gV2Ugb25seSBhZGQgc3VtbWFyeSBvbmNlLCBzYW1lIGFzXG4gICAgICAgICAgICAgICAgLy8gZm9yIGVsZW1lbnRzIHRvIGF2b2lkIGR1cGxpY2F0aW9uIGluIHRoZSBtZXNzYWdlLiAoU3VtbWFyeSBzaG91bGQgbm90IGR1cGxpY2F0ZSwgYnV0IGp1c3QgaW4gY2FzZSlcbiAgICAgICAgICAgICAgICBpZiAobm9kZU5hbWUgPT0gXCJ0YWJsZVwiICYmICFzZWVuLmhhc093blByb3BlcnR5W1wic3VtbWFyeVwiXSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBNYXJrIHRoaXMgYXMgYSBuZXcgYXR0cmlidXRlXG4gICAgICAgICAgICAgICAgICAgIHNlZW5bXCJzdW1tYXJ5XCJdID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBTaW5jZSB0aGlzIGlzIGEgbmV3IHZpb2xhdGluZyBlbGVtZW50IGFkZCBpdCB0byB0aGUgc3RydWN0dXJhbCBlbGVtZW50IHRva2VucyBhcnJheVxuICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmFsRWxlbWVudFRva2Vucy5wdXNoKFwic3VtbWFyeVwiKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBNYXJrIHRoaXMgYXMgYSBuZXcgZWxlbWVudFxuICAgICAgICAgICAgICAgICAgICBzZWVuW25vZGVOYW1lXSA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gU2luY2UgdGhpcyBpcyBhIG5ldyB2aW9sYXRpbmcgZWxlbWVudCBhZGQgaXQgdG8gdGhlIHN0cnVjdHVyYWwgZWxlbWVudCB0b2tlbnMgYXJyYXlcbiAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJhbEVsZW1lbnRUb2tlbnMucHVzaChub2RlTmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2UgbmVlZCB0byB0YWtlIHRoZSBhcnJheSBvZiBzdHJ1Y3R1cmFsIGVsZW1lbnRzIGFuZCBqb2luIHRoZW0gd2l0aCBhIGNvbW1hIGFuZCBhIHNwYWNlIHRvIG1ha2UgZ3JhbW1hdGljYWwgY29ycmVjdCBpblxuICAgICAgICAvLyB0aGUgbWVzc2FnZS5cbiAgICAgICAgbGV0IHN0cnVjdHVyYWxFbGVtZW50VG9rZW5zU3RyID0gc3RydWN0dXJhbEVsZW1lbnRUb2tlbnMuam9pbihcIiwgXCIpO1xuXG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KGVycm9yTm9kZXMubGVuZ3RoID09IDAsIGVycm9yTm9kZXMsICcnLCAnJywgW2N1cnJlbnRFbGVtZW50VG9rZW4sIHN0cnVjdHVyYWxFbGVtZW50VG9rZW5zXSk7XG4gICAgICAgIGlmIChlcnJvck5vZGVzLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW2N1cnJlbnRFbGVtZW50VG9rZW4sIHN0cnVjdHVyYWxFbGVtZW50VG9rZW5zU3RyXSk7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG5pbXBvcnQgeyBET01VdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01VdGlsXCI7XG5cbmV4cG9ydCBjb25zdCB0YWJsZV9zdW1tYXJ5X3JlZHVuZGFudDogUnVsZSA9IHtcbiAgICBpZDogXCJ0YWJsZV9zdW1tYXJ5X3JlZHVuZGFudFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOnRhYmxlXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfVGFibGVfQ2FwU3VtbVJlZHVuZGFudFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInRhYmxlX3N1bW1hcnlfcmVkdW5kYW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwidGFibGVfc3VtbWFyeV9yZWR1bmRhbnQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInRhYmxlX3N1bW1hcnlfcmVkdW5kYW50Lmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiVGhlIHRhYmxlIHN1bW1hcnkgZHVwbGljYXRlcyB0aGUgY2FwdGlvblwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSB0YWJsZSBzdW1tYXJ5IG11c3Qgbm90IGR1cGxpY2F0ZSB0aGUgY2FwdGlvblwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcG9mSWQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuICAgICAgICBsZXQgc3VtU3RyO1xuICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwic3VtbWFyeVwiKSkge1xuICAgICAgICAgICAgcG9mSWQgPSAwO1xuICAgICAgICAgICAgc3VtU3RyID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwic3VtbWFyeVwiKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgfSBlbHNlIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhcmlhLWRlc2NyaWJlZGJ5XCIpKSB7XG4gICAgICAgICAgICBwb2ZJZCA9IDE7XG4gICAgICAgICAgICBsZXQgc3VtbWFyeU5vZGVJZHMgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWRlc2NyaWJlZGJ5XCIpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgIGxldCBzdW1tYXJ5Tm9kZUNvbmNhdCA9IFwiXCI7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN1bW1hcnlOb2RlSWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHN1bW1hcnlOb2RlSWQgPSBzdW1tYXJ5Tm9kZUlkc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoc3VtbWFyeU5vZGVJZCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgc3VtbWFyeU5vZGUgPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChydWxlQ29udGV4dCwgc3VtbWFyeU5vZGVJZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdW1tYXJ5Tm9kZSAmJiAhRE9NVXRpbC5zYW1lTm9kZShzdW1tYXJ5Tm9kZSxydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnlOb2RlQ29uY2F0ICs9IFwiIFwiICsgQ29tbW9uVXRpbC5nZXRJbm5lclRleHQoc3VtbWFyeU5vZGUpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3VtU3RyID0gc3VtbWFyeU5vZGVDb25jYXQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzdW1TdHIpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IGNhcEVsZW1zID0gcnVsZUNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJjYXB0aW9uXCIpO1xuICAgICAgICAgICAgaWYgKGNhcEVsZW1zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChzdW1TdHIubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCBjYXBTdHIgPSBDb21tb25VdGlsLmdldElubmVyVGV4dChjYXBFbGVtc1swXSkudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgaWYgKCFzdW1TdHIuaW5jbHVkZXMoY2FwU3RyKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSwgUnVsZUZhaWwsIFJ1bGVQb3RlbnRpYWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IERPTU1hcHBlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NTWFwcGVyXCI7XG5pbXBvcnQgeyBDU1NVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ1NTVXRpbFwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG4gICAgXG4gICAgZXhwb3J0IGNvbnN0IHRhcmdldF9zcGFjaW5nX3N1ZmZpY2llbnQ6IFJ1bGUgPSB7XG4gICAgICAgIGlkOiBcInRhcmdldF9zcGFjaW5nX3N1ZmZpY2llbnRcIixcbiAgICAgICAgY29udGV4dDogXCJkb206KlwiLFxuICAgICAgICBkZXBlbmRlbmNpZXM6IFtdLFxuICAgICAgICBoZWxwOiB7XG4gICAgICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgICAgICBcImdyb3VwXCI6IFwidGFyZ2V0X3NwYWNpbmdfc3VmZmljaWVudC5odG1sXCIsXG4gICAgICAgICAgICAgICAgXCJwYXNzX3NwYWNpbmdcIjogXCJ0YXJnZXRfc3BhY2luZ19zdWZmaWNpZW50Lmh0bWxcIixcbiAgICAgICAgICAgICAgICBcInBhc3Nfc2l6ZWRcIjogXCJ0YXJnZXRfc3BhY2luZ19zdWZmaWNpZW50Lmh0bWxcIixcbiAgICAgICAgICAgICAgICBcInBhc3NfaW5saW5lXCI6IFwidGFyZ2V0X3NwYWNpbmdfc3VmZmljaWVudC5odG1sXCIsXG4gICAgICAgICAgICAgICAgXCJwYXNzX2RlZmF1bHRcIjogXCJ0YXJnZXRfc3BhY2luZ19zdWZmaWNpZW50Lmh0bWxcIixcbiAgICAgICAgICAgICAgICBcInZpb2xhdGlvbl9zcGFjaW5nXCI6IFwidGFyZ2V0X3NwYWNpbmdfc3VmZmljaWVudC5odG1sXCIsXG4gICAgICAgICAgICAgICAgXCJyZWNvbW1lbmRhdGlvbl9pbmxpbmVcIjogXCJ0YXJnZXRfc3BhY2luZ19zdWZmaWNpZW50Lmh0bWxcIixcbiAgICAgICAgICAgICAgICBcInBvdGVudGlhbF9vdmVybGFwXCI6IFwidGFyZ2V0X3NwYWNpbmdfc3VmZmljaWVudC5odG1sXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbWVzc2FnZXM6IHtcbiAgICAgICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgdGFyZ2V0IG11c3QgYmUgc3VmZmljaWVudGx5IHNpemVkIG9yIHNwYWNlZCBmcm9tIG90aGVyIHRhcmdldHNcIixcbiAgICAgICAgICAgICAgICBcInBhc3Nfc3BhY2luZ1wiOiBcIlRoZSB0YXJnZXQncyBzcGFjaW5nIGZyb20gb3RoZXIgdGFyZ2V0cyBpcyBzdWZmaWNpZW50XCIsXG4gICAgICAgICAgICAgICAgXCJwYXNzX3NpemVkXCI6IFwiVGhlIHRhcmdldOKAmXMgc2l6ZSBpcyBtb3JlIHRoYW4gMjQgQ1NTIHBpeGVsc1wiLFxuICAgICAgICAgICAgICAgIFwicGFzc19pbmxpbmVcIjogXCJUaGUgdGFyZ2V0IGlzIGluIGEgc2VudGVuY2Ugb3IgaXRzIHNpemUgaXMgb3RoZXJ3aXNlIGNvbnN0cmFpbmVkIGJ5IHRoZSBsaW5lLWhlaWdodCBvZiBub24tdGFyZ2V0IHRleHRcIixcbiAgICAgICAgICAgICAgICBcInBhc3NfZGVmYXVsdFwiOiBcIlRoZSB0YXJnZXQncyBzaXplIGlzIGRldGVybWluZWQgYnkgdGhlIHVzZXIgYWdlbnQgYW5kIGlzIG5vdCBtb2RpZmllZCBieSB0aGUgYXV0aG9yXCIsXG4gICAgICAgICAgICAgICAgXCJ2aW9sYXRpb25fc3BhY2luZ1wiOiBcIlVuZGVyc2l6ZWQgdGFyZ2V0IFxcXCJ7MH1cXFwiIGRvZXMgbm90IGhhdmUgc3VmZmljaWVudCBzcGFjaW5nIG9mIDEyIENTUyBwaXhlbHMgZnJvbSBhbm90aGVyIHRhcmdldCBcXFwiezF9XFxcIlwiLFxuICAgICAgICAgICAgICAgIFwicmVjb21tZW5kYXRpb25faW5saW5lXCI6IFwiQ29uZmlybSB0aGUgaW5saW5lIHRhcmdldCBcXFwiezB9XFxcIiBpcyBzdWZmaWNpZW50bHkgc3BhY2VkIGZyb20gYW5vdGhlciBpbmxpbmUgdGFyZ2V0IFxcXCJ7MX1cXFwiXCIsXG4gICAgICAgICAgICAgICAgXCJwb3RlbnRpYWxfb3ZlcmxhcFwiOiBcIkVuc3VyZSB0aGUgb3ZlcmxhcHBlZCB0YXJnZXQgXFxcInswfVxcXCIgbWVldHMgYSBtaW5pbXVtIHRhcmdldCBzaXplIG9yIGhhcyBzdWZmaWNpZW50IHNwYWNpbmcgZnJvbSB0aGUgb3ZlcmxhcHBpbmcgdGFyZ2V0IFxcXCJ7MX1cXFwiXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgcnVsZXNldHM6IFt7XG4gICAgICAgICAgICBpZDogWyBcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICAgICAgbnVtOiBbXCIyLjUuOFwiXSxcbiAgICAgICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUUsXG4gICAgICAgICAgICByZWFzb25Db2RlczogW1wicGFzc19zcGFjaW5nXCIsXCJwYXNzX3NpemVkXCIsIFwicGFzc19pbmxpbmVcIixcInBhc3NfZGVmYXVsdFwiLCBcInZpb2xhdGlvbl9zcGFjaW5nXCIsIFwicG90ZW50aWFsX292ZXJsYXBcIl1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgaWQ6IFsgXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgICAgIG51bTogW1wiMi41LjhcIl0sXG4gICAgICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUUsXG4gICAgICAgICAgICByZWFzb25Db2RlczogW1wicmVjb21tZW5kYXRpb25faW5saW5lXCJdXG4gICAgICAgIH1dLFxuICAgICAgICBhY3Q6IFtdLFxuICAgICAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICBjb25zdCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCk7IFxuICAgICAgICAgICAgXG4gICAgICAgICAgICBjb25zdCBtYXBwZXIgOiBET01NYXBwZXIgPSBuZXcgRE9NTWFwcGVyKCk7XG4gICAgICAgICAgICBjb25zdCBib3VuZHMgPSBtYXBwZXIuZ2V0VW5hZGp1c3RlZEJvdW5kcyhydWxlQ29udGV4dCk7IC8vY29udGV4dFtcImRvbVwiXS5ib3VuZHM7ICAgIFxuICAgICAgICAgICAgaWYgKCFib3VuZHMpIFxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBpZ25vcmUgaGlkZGVuLCBub24tdGFyZ2V0XG4gICAgICAgICAgICBpZiAoIUNvbW1vblV0aWwuaXNUYXJnZXQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgICAgICBpZiAoYm91bmRzLmhlaWdodCA+PSAyNCAmJiBib3VuZHMud2lkdGggPj0gMjQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc19zaXplZFwiKTsgXG5cbiAgICAgICAgICAgIC8vIGNoZWNrIGlubGluZSBlbGVtZW50OiB3aXRob3V0IHRleHQgaW4gdGhlIHNhbWUgbGluZVxuICAgICAgICAgICAgY29uc3Qgc3RhdHVzID0gQ1NTVXRpbC5nZXRJbmxpbmVTdGF0dXMocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgaWYgKHN0YXR1cyA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBpZiAoc3RhdHVzLmlubGluZSkge1xuICAgICAgICAgICAgICAgIGlmIChzdGF0dXMudGV4dCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzLnZpb2xhdGlvbiA9PT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NfaW5saW5lXCIpO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjYXNlIDE6IGlubGluZSBlbGVtZW50IGlzIHRvbyBjbG9zZSBob3Jpem9udGFsbHlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicmVjb21tZW5kYXRpb25faW5saW5lXCIsIFtub2RlTmFtZSwgc3RhdHVzLnZpb2xhdGlvbl0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMudmlvbGF0aW9uID09PSBudWxsKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc19kZWZhdWx0XCIpO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjYXNlIDE6IGlubGluZSBlbGVtZW50IGlzIHRvbyBjbG9zZSBob3Jpem9udGFsbHlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicmVjb21tZW5kYXRpb25faW5saW5lXCIsIFtub2RlTmFtZSwgc3RhdHVzLnZpb2xhdGlvbl0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIGJyb3dzZXIgZGVmYXVsdFxuICAgICAgICAgICAgICAgIGlmIChDU1NVdGlsLmlzVGFyZ2V0QnJvd3NlckRlZmF1bHQocnVsZUNvbnRleHQpKSBcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc19kZWZhdWx0XCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgZG9jID0gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudDtcbiAgICAgICAgICAgIGlmICghZG9jKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGxldCBjU3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgIGlmIChjU3R5bGUgPT09IG51bGwpIFxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBsZXQgemluZGV4ID0gY1N0eWxlLnpJbmRleDsgICBcbiAgICAgICAgICAgIGlmICghemluZGV4IHx8IGlzTmFOKE51bWJlcih6aW5kZXgpKSlcbiAgICAgICAgICAgICAgICB6aW5kZXggPSBcIjBcIjtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gR2V0IHRoZSBsaXN0IG9mIHRhcmdldCBlbGVtZW50c1xuICAgICAgICAgICAgbGV0IHRhcmdldEVsZW1zID0gQ2FjaGVVdGlsLmdldENhY2hlKGRvYy5kb2N1bWVudEVsZW1lbnQsIFwidGFyZ2V0X3NwYWNpbmdfc3VmZmljaWVudDo6dGFyZ2V0c1wiLCB1bmRlZmluZWQpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0YXJnZXRFbGVtcyA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgICAgIHRhcmdldEVsZW1zID0gW107XG4gICAgICAgICAgICAgICAgLy9zZWxlY3QgYWxsIGVsZW1lbnRzIGV4Y2VwdCBpdHNlbGYgYW5kIGRlc2NlbmRhbnRzXG4gICAgICAgICAgICAgICAgbGV0IGVsZW1zID0gZG9jLnF1ZXJ5U2VsZWN0b3JBbGwoJ2JvZHkgKjpub3Qoc2NyaXB0KTpub3Qoc3R5bGUpJyk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgZWxlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZWxlbSA9IGVsZW1zW2ldIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICBpZiAoQ29tbW9uVXRpbC5pc1RhcmdldChlbGVtKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0RWxlbXMucHVzaChlbGVtKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZG9jLmRvY3VtZW50RWxlbWVudCwgXCJ0YXJnZXRfc3BhY2luZ19zdWZmaWNpZW50Ojp0YXJnZXRzXCIsIHRhcmdldEVsZW1zKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCF0YXJnZXRFbGVtcyB8fCB0YXJnZXRFbGVtcy5sZW5ndGggPT09IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgICAgICBsZXQgYmVmb3JlID0gdHJ1ZTtcbiAgICAgICAgICAgIGxldCBtaW5YID0gMjQ7XG4gICAgICAgICAgICBsZXQgbWluWSA9IDI0O1xuICAgICAgICAgICAgbGV0IGFkamFjZW50WCA9IG51bGw7XG4gICAgICAgICAgICBsZXQgYWRqYWNlbnRZID0gbnVsbDtcbiAgICAgICAgICAgIGxldCBjaGVja2VkID0gW107IC8vY29udGFpbnMgYSBsaXN0IG9mIGVsZW1lbnRzIHRoYXQgaGF2ZSBiZWVuIGNoZWNrZWQgc28gdGhlaXIgZGVzY2VuZGFudHMgZG9uJ3QgbmVlZCB0byBiZSBjaGVja2VkIGFnYWluXG4gICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCB0YXJnZXRFbGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW0gPSB0YXJnZXRFbGVtc1tpXSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgKiAgdGhlIG5vZGVzIHJldHVybmVkIGZyb20gcXVlcnlTZWxlY3RvckFsbCBpcyBpbiBkb2N1bWVudCBvcmRlclxuICAgICAgICAgICAgICAgICAqICBpZiB0d28gZWxlbWVudHMgb3ZlcmxhcCBhbmQgei1pbmRleCBhcmUgbm90IGRlZmluZWQsIHRoZW4gdGhlIG5vZGUgcmVuZGVyZWQgZWFybGllciB3aWxsIGJlIG92ZXJsYWlkIGJ5IHRoZSBub2RlIHJlbmRlcmVkIGxhdGVyXG4gICAgICAgICAgICAgICAgICogIGZpbHRlciBvdXQgdGhlIGVsZW1lbnRzIHRoYXTigJlyZSBkZXNjZW5kYW50IG9yIGFuY2VzdG9ycyBvZiB0aGUgdGFyZ2V0IGVsZW1lbnQsIG5vciBkZXNjZW5kYW50IG9mIHRoZSB0YXJnZXQgZWxlbWVudCdzIHNpYmxpbmdzXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgLy8gVXNlIGNvbXBhcmVEb2N1bWVudFBvc2l0aW9uIHRvIGNoZWNrIGNvbnRhaW5tZW50IHJlbGF0aW9uc2hpcHNcbiAgICAgICAgICAgICAgICAvLyBOb3RlOiBjb21wYXJlRG9jdW1lbnRQb3NpdGlvbiByZXR1cm5zIDAgd2hlbiBjb21wYXJpbmcgYSBub2RlIHRvIGl0c2VsZlxuICAgICAgICAgICAgICAgIGNvbnN0IHBvc2l0aW9uID0gcnVsZUNvbnRleHQuY29tcGFyZURvY3VtZW50UG9zaXRpb24oZWxlbSk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gRE9DVU1FTlRfUE9TSVRJT05fQ09OVEFJTkVEX0JZICgxNik6IGVsZW0gaXMgY29udGFpbmVkIGJ5IHJ1bGVDb250ZXh0XG4gICAgICAgICAgICAgICAgLy8gQWxzbyBoYW5kbGUgc2VsZi1jb21wYXJpc29uIChwb3NpdGlvbiA9PT0gMClcbiAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24gPT09IDAgfHwgKHBvc2l0aW9uICYgTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9DT05UQUlORURfQlkpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vdGhlIG5leHQgbm9kZSBpbiBlbGVtcyB3aWxsIGJlIGFmdGVyIHRoZSB0YXJnZXQgbm9kZSAocnVsZUNvbnRleHQpLlxuICAgICAgICAgICAgICAgICAgICBiZWZvcmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIERPQ1VNRU5UX1BPU0lUSU9OX0NPTlRBSU5TICg4KTogZWxlbSBjb250YWlucyBydWxlQ29udGV4dFxuICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBhc2NlbmRhbnRzIG9mIHRoZSBlbGVtZW50LCBvciBpdHNlbGYgb3IgaXRzIGFzY2VuZGFudCBhbHJlYWR5IGNoZWNrZWRcbiAgICAgICAgICAgICAgICBpZiAoKHBvc2l0aW9uICYgTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9DT05UQUlOUykgfHwgY2hlY2tlZC5zb21lKGl0ZW0gPT4gaXRlbS5jb250YWlucyhlbGVtKSkpXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgYm5kcyA9IG1hcHBlci5nZXRVbmFkanVzdGVkQm91bmRzKGVsZW0pO1xuICAgICAgICAgICAgICAgIGlmICghYm5kcykgY29udGludWU7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgbGV0IHpTdHlsZSA9IGdldENvbXB1dGVkU3R5bGUoZWxlbSk7IFxuICAgICAgICAgICAgICAgIGxldCB6X2luZGV4ID0gJzAnO1xuICAgICAgICAgICAgICAgIGlmICh6U3R5bGUpIHtcbiAgICAgICAgICAgICAgICAgICAgel9pbmRleCA9IHpTdHlsZS56SW5kZXg7XG4gICAgICAgICAgICAgICAgICAgIGlmICghel9pbmRleCB8fCBpc05hTihOdW1iZXIoel9pbmRleCkpKVxuICAgICAgICAgICAgICAgICAgICAgICAgel9pbmRleCA9IFwiMFwiO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIGNhc2UgMjogdGhlIGVsZW1lbnQgb3ZlcmxhcHMgdGhlIHRhcmdldCBlbnRpcmVseVxuICAgICAgICAgICAgICAgIC8vIG5vdGUgd2hlbiBhIGxpbmsgaXMgaW5saW5lIHdpdGggb3RoZXIgdGFyZ2V0LCBpZiB0aGUgbGluayB0ZXh0IHdyYXBzIGluIGFub3RoZXIgbGluZSBpbiBhIGdpdmVuIHZpZXdwb3J0LCAgXG4gICAgICAgICAgICAgICAgLy8gdGhlIGJvdW5kcyBvZiB0aGUgbGluayBtYXkgY292ZXIgYW5kIHRoZSBlbnRpcmUgdHdvIGxpbmVzLCBjYXVzaW5nIHRoZSBvdGhlciB0YWdldHMgdG8gYmUgb3ZlcmxhcHBlZCwgc2VlIHR3byBsaW5rcyBpbiB0aGUgdGVzdCBjYXNlOiBlbGVtZW50X2lubGluZS5odG1sIFxuICAgICAgICAgICAgICAgIGlmIChibmRzLnRvcCA8PSBib3VuZHMudG9wICYmIGJuZHMubGVmdCA8PSBib3VuZHMubGVmdCAmJiBibmRzLnRvcCArIGJuZHMuaGVpZ2h0ID49IGJvdW5kcy50b3AgKyBib3VuZHMuaGVpZ2h0IFxuICAgICAgICAgICAgICAgICAgICAmJiBibmRzLmxlZnQgKyBibmRzLndpZHRoID49IGJvdW5kcy5sZWZ0ICsgYm91bmRzLndpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSB0YXJnZXQgb24gdG9wICAgIFxuICAgICAgICAgICAgICAgICAgICBpZiAoYmVmb3JlID8gcGFyc2VJbnQoemluZGV4KSA8IHBhcnNlSW50KHpfaW5kZXgpOiBwYXJzZUludCh6aW5kZXgpIDw9IHBhcnNlSW50KHpfaW5kZXgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdGFyZ2V0IGlzIGVudGlyZWx5IGNvdmVyZWQ6IHRhYmJhYmxlIHRhcmdldCBoYW5kbGVkIGJ5IGVsZW1lbnRfdGFiYmFibGVfdW5vYnNjdXJlZCBhbmQgdGFiaW5kZXg9LTEgaWdub3JlZFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfb3ZlcmxhcFwiLCBbbm9kZU5hbWUsIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pO1xuICAgICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gY2FzZSAzOiBpZiB0aGUgdGFyZ2V0IG92ZXJsYXBzIHRoZSBlbGVtZW50IGVudGlyZWx5XG4gICAgICAgICAgICAgICAgaWYgKGJvdW5kcy50b3AgPD0gYm5kcy50b3AgJiYgYm91bmRzLmxlZnQgPD0gYm5kcy5sZWZ0ICYmIGJvdW5kcy50b3AgKyBib3VuZHMuaGVpZ2h0ID49IGJuZHMudG9wICsgYm5kcy5oZWlnaHQgXG4gICAgICAgICAgICAgICAgICAgICYmIGJvdW5kcy5sZWZ0ICsgYm91bmRzLndpZHRoID49IGJuZHMubGVmdCArIGJuZHMud2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGVsZW1lbnQgb24gdG9wICAgIFxuICAgICAgICAgICAgICAgICAgICBpZiAoYmVmb3JlID8gcGFyc2VJbnQoemluZGV4KSA8IHBhcnNlSW50KHpfaW5kZXgpOiBwYXJzZUludCh6aW5kZXgpIDw9IHBhcnNlSW50KHpfaW5kZXgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF9vdmVybGFwXCIsIFtub2RlTmFtZSwgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSk7IFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgLy8gdGhlIHRhcmdldCBvbiB0b3BcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcInZpb2xhdGlvbl9zcGFjaW5nXCIsIFtub2RlTmFtZSwgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSk7ICAgICBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gY2FzZSA0OiB0aGUgZWxlbWVudCBvdmVybGFwcyBwYXJ0aWFsbHkgd2l0aCB0aGUgdGFyZ2V0XG4gICAgICAgICAgICAgICAgaWYgKCgoKGJvdW5kcy50b3AgPj0gYm5kcy50b3AgJiYgYm91bmRzLnRvcCA8PSBibmRzLnRvcCArIGJuZHMuaGVpZ2h0KSB8fCAoYm91bmRzLnRvcCArIGJvdW5kcy5oZWlnaHQgPD0gYm5kcy50b3AgJiYgYm91bmRzLnRvcCArIGJvdW5kcy5oZWlnaHQgPj0gYm5kcy50b3AgK2JuZHMuaGVpZ2h0KSlcbiAgICAgICAgICAgICAgICAgICAgICYmICgoYm91bmRzLmxlZnQgPiBibmRzLmxlZnQgJiYgYm91bmRzLmxlZnQgPCBibmRzLmxlZnQgKyBibmRzLndpZHRoKSB8fCAoYm5kcy5sZWZ0ID4gYm91bmRzLmxlZnQgJiYgYm5kcy5sZWZ0IDwgYm91bmRzLmxlZnQgKyBib3VuZHMud2lkdGgpKSkgXG4gICAgICAgICAgICAgICAgICAgICB8fCAoKChib3VuZHMudG9wID4gYm5kcy50b3AgJiYgYm91bmRzLnRvcCA8IGJuZHMudG9wICsgYm5kcy5oZWlnaHQpIHx8IChibmRzLnRvcCA+IGJvdW5kcy50b3AgJiYgYm5kcy50b3AgPCBib3VuZHMudG9wICsgYm91bmRzLmhlaWdodCkpXG4gICAgICAgICAgICAgICAgICAgICAmJiAoKGJvdW5kcy5sZWZ0ID49IGJuZHMubGVmdCAmJiBib3VuZHMubGVmdCA8PSBibmRzLmxlZnQgKyBibmRzLndpZHRoKSB8fCAoYm91bmRzLmxlZnQgKyBib3VuZHMud2lkdGggPj0gYm5kcy5sZWZ0ICYmIGJvdW5kcy5sZWZ0ICsgYm91bmRzLndpZHRoIDw9IGJuZHMubGVmdCArIGJuZHMud2lkdGgpKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IG1vcmUgY2hlY2sgdG8gdHVybiB0byB2aW9sYXRpb24gIFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfb3ZlcmxhcFwiLCBbbm9kZU5hbWUsIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pOyBcblxuICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIG5vIG92ZXJsYXAgd2l0aCB0aGUgZWxlbSwgdGhvdWdoIG1heSBvdmVybGFwIHdpdGhlIG90aGVyIGVsZW1lbnRzXG4gICAgICAgICAgICAgICAgICAgIGxldCBkaXNYID0gMjQ7IFxuICAgICAgICAgICAgICAgICAgICBsZXQgZGlzWSA9IDI0OyAgIFxuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZWxlbWVudCBpcyBpbiB0aGUgaG9yaXpvbnRhbGx5IHNhbWUgcm93IHdpdGggdGhlIHRhcmdldFxuICAgICAgICAgICAgICAgICAgICBpZiAoYm91bmRzLndpZHRoIDwgMjQgJiYgKChib3VuZHMudG9wID49IGJuZHMudG9wICYmIGJvdW5kcy50b3AgPD0gYm5kcy50b3AgKyBibmRzLmhlaWdodCkgfHwgKGJvdW5kcy50b3AgPD0gYm5kcy50b3AgJiYgYm91bmRzLnRvcCArIGJvdW5kcy5oZWlnaHQgPiBibmRzLnRvcCkpKVxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzWCA9IE1hdGgubWluKCBNYXRoLmFicyhib3VuZHMubGVmdCAtIGJuZHMubGVmdCksIE1hdGguYWJzKGJvdW5kcy5sZWZ0IC0gKGJuZHMubGVmdCArIGJuZHMud2lkdGgpKSwgIE1hdGguYWJzKGJvdW5kcy5sZWZ0ICsgYm91bmRzLndpZHRoIC0gKGJuZHMubGVmdCArIGJuZHMud2lkdGgpKSwgTWF0aC5hYnMoYm91bmRzLmxlZnQgKyBib3VuZHMud2lkdGggLSBibmRzLmxlZnQpKTtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBlbGVtZW50IGlzIGluIHRoZSB2ZXJ0aWNhbGx5IHNhbWUgY29sdW1uIHdpdGggdGhlIHRhcmdldCAgICBcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJvdW5kcy5oZWlnaHQgPCAyNCAmJiAoKGJvdW5kcy5sZWZ0ID49IGJuZHMubGVmdCAmJiBib3VuZHMubGVmdCA8PSBibmRzLmxlZnQgKyBibmRzLndpZHRoKSB8fCAoYm91bmRzLmxlZnQgPD0gYm5kcy5sZWZ0ICYmIGJvdW5kcy5sZWZ0ICsgYm91bmRzLndpZHRoID4gYm5kcy5sZWZ0KSkpXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNZID0gTWF0aC5taW4oTWF0aC5hYnMoYm91bmRzLnRvcCAtIGJuZHMudG9wKSwgTWF0aC5hYnMoYm91bmRzLnRvcCAtIChibmRzLnRvcCArIGJuZHMuaGVpZ2h0KSksICBNYXRoLmFicyhib3VuZHMudG9wICsgYm91bmRzLmhlaWdodCAtIChibmRzLnRvcCArIGJuZHMuaGVpZ2h0KSksIE1hdGguYWJzKGJvdW5kcy50b3AgKyBib3VuZHMuaGVpZ2h0IC0gYm5kcy50b3ApKTtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIGlmIChkaXNYIDwgbWluWCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWluWCA9IGRpc1g7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGphY2VudFggPSBlbGVtO1xuICAgICAgICAgICAgICAgICAgICB9ICAgIFxuICAgICAgICAgICAgICAgICAgICBpZiAoZGlzWSA8IG1pblkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pblkgPSBkaXNZOyAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgYWRqYWNlbnRZID0gZWxlbTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjaGVja2VkLnB1c2goZWxlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIGNhc2UgNTogbm8gb3ZlcmxhcCArIGluc3VmZmljaWVudCB0YXJnZXQgc2l6ZS4gY2hlY2sgc3BhY2luZyAgICBcbiAgICAgICAgICAgIGlmIChNYXRoLnJvdW5kKGJvdW5kcy53aWR0aC8yKSArIG1pblggPCAxMiB8fCBNYXRoLnJvdW5kKGJvdW5kcy5oZWlnaHQvMikgKyBtaW5ZIDwgMTIpIHtcbiAgICAgICAgICAgICAgICBpZiAoTWF0aC5yb3VuZChib3VuZHMud2lkdGgvMikgKyBtaW5YIDwgTWF0aC5yb3VuZChib3VuZHMuaGVpZ2h0LzIpICsgbWluWSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwidmlvbGF0aW9uX3NwYWNpbmdcIiwgW25vZGVOYW1lLCBhZGphY2VudFgubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pOyBcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJ2aW9sYXRpb25fc3BhY2luZ1wiLCBbbm9kZU5hbWUsIGFkamFjZW50WS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSk7XG4gICAgICAgICAgICB9IGVsc2UgXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc19zcGFjaW5nXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgICIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuaW1wb3J0IHsgQ1NTVXRpbCB9IGZyb20gXCIuLi91dGlsL0NTU1V0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCB0ZXh0X2Jsb2NrX2hlYWRpbmc6IFJ1bGUgPSB7XG4gICAgaWQ6IFwidGV4dF9ibG9ja19oZWFkaW5nXCIsXG4gICAgY29udGV4dDogXCJkb206cCwgZG9tOmRpdiwgZG9tOmJyXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfQmxvY2tfU2hvdWxkQmVIZWFkaW5nXCI6IHtcbiAgICAgICAgICAgIC8vIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcInBvdGVudGlhbF9oZWFkaW5nXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgLy8gXCJwYXNzXCI6IFwidGV4dF9ibG9ja19oZWFkaW5nLmh0bWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX2hlYWRpbmdcIjogXCJ0ZXh0X2Jsb2NrX2hlYWRpbmcuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInRleHRfYmxvY2tfaGVhZGluZy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICAvLyBcInBhc3NcIjogXCJIZWFkaW5nIHRleHQgdXNlcyBhIGhlYWRpbmcgZWxlbWVudCBvciByb2xlXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9oZWFkaW5nXCI6IFwiQ29uZmlybSB0aGlzIHRleHQgJ3swfScgaXMgdXNlZCBhcyBhIGhlYWRpbmcgYW5kIGlmIHNvLCBtb2RpZnkgdG8gdXNlIGEgaGVhZGluZyBlbGVtZW50IG9yIHJvbGVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJIZWFkaW5nIHRleHQgc2hvdWxkIHVzZSBhIGhlYWRpbmcgZWxlbWVudCBvciByb2xlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBjaGVjayBpZiB0aGUgZWxlbWVudCBpcyBoaWRkZW4gb3IgZGlzYWJsZWRcbiAgICAgICAgaWYgKENvbW1vblV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpIHx8ICFWaXNVdGlsLmlzTm9kZVZpc2libGUocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gRG9uJ3QgdHJpZ2dlciBpZiB3ZSdyZSBub3QgaW4gdGhlIGJvZHkgb3IgaWYgd2UncmUgaW4gYSBzY3JpcHRcbiAgICAgICAgaWYgKENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFtcImJvZHlcIl0pID09PSBudWxsIHx8IENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFtcInNjcmlwdFwiXSkgIT09IG51bGwpIFxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgY29uc3QgdmFsaWRhdGVQYXJhbXMgPSB7XG4gICAgICAgICAgICBudW1Xb3Jkczoge1xuICAgICAgICAgICAgICAgIHZhbHVlOiAxMCxcbiAgICAgICAgICAgICAgICB0eXBlOiBcImludGVnZXJcIlxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBsZXQgYm9keUZvbnQgPSAwO1xuICAgICAgICBsZXQgYm9keSA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJib2R5XCIpO1xuICAgICAgICBpZiAoYm9keSAhPSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgYm9keVN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShib2R5WzBdKTtcbiAgICAgICAgICAgIGlmIChib2R5U3R5bGUpIGJvZHlGb250ID0gQ1NTVXRpbC5nZXRQaXhlbHNGcm9tU3R5bGUoYm9keVN0eWxlWydmb250LXNpemUnXSwgYm9keSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG51bVdvcmRzID0gdmFsaWRhdGVQYXJhbXMubnVtV29yZHMudmFsdWU7XG4gICAgICAgIGxldCB3b3Jkc1NlZW4gPSAwO1xuICAgICAgICBsZXQgd29yZFN0cjogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgbGV0IGVtcGhhc2l6ZWRUZXh0ID0gZmFsc2U7XG4gICAgICAgIGxldCBudyA9IG5ldyBET01XYWxrZXIocnVsZUNvbnRleHQpO253Lm5leHROb2RlKCk7XG4gICAgICAgIGxldCBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgd2hpbGUgKCFwYXNzZWQgJiZcbiAgICAgICAgICAgIG53Lm5leHROb2RlKCkgJiYgXG4gICAgICAgICAgICBudy5ub2RlICE9PSBydWxlQ29udGV4dCAmJlxuICAgICAgICAgICAgbncubm9kZSAhPT0gRE9NV2Fsa2VyLnBhcmVudE5vZGUocnVsZUNvbnRleHQpICYmXG4gICAgICAgICAgICAhW1wiYnJcIiwgXCJkaXZcIiwgXCJwXCJdLmluY2x1ZGVzKG53Lm5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkpIC8vIERvbid0IHJlcG9ydCB0d2ljZVxuICAgICAgICB7ICAgXG4gICAgICAgICAgICBpZiAobncubm9kZSA9PT0gcnVsZUNvbnRleHQgfHwgQ29tbW9uVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKG53Lm5vZGUpKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBsZXQgbndOYW1lID0gbncubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgaWYgKG53Lm5vZGUubm9kZVR5cGUgPT09IDMpIHsgXG4gICAgICAgICAgICAgICAgLy8gZm9yIHRleHQgY2hpbGRcbiAgICAgICAgICAgICAgICBpZiAobncubm9kZS5ub2RlVmFsdWUudHJpbSgpLmxlbmd0aCA+IDAgJiYgbncubm9kZS5wYXJlbnRFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGl0J3Mgc3R5bGUgaWYgdGhlIHRhcmdldCBlbGVtZW50IGNvbnRhaW5zIHRleHQsIGUuZy4sIDxwPiBmYWtlIGhlYWRpbmc8L3A+IFxuICAgICAgICAgICAgICAgICAgICBsZXQgc3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKG53Lm5vZGUucGFyZW50RWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZSAmJiAoc3R5bGVbJ2ZvbnQtd2VpZ2h0J10gPT09ICdib2xkJyB8fCBzdHlsZVsnZm9udC13ZWlnaHQnXSA+PSA3MDBcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8ICAoc3R5bGVbJ2ZvbnQtc2l6ZSddICYmIHN0eWxlWydmb250LXNpemUnXS5pbmNsdWRlcyhcImxhcmdlXCIpKSBcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8IChzdHlsZVsnZm9udC1zaXplJ10gJiYgYm9keUZvbnQgIT09IDAgJiYgQ1NTVXRpbC5nZXRQaXhlbHNGcm9tU3R5bGUoc3R5bGVbJ2ZvbnQtc2l6ZSddLG53Lm5vZGUucGFyZW50RWxlbWVudCkgID4gYm9keUZvbnQpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5leHRTdHIgPSBudy5ub2RlLm5vZGVWYWx1ZS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB3YyA9IENvbW1vblV0aWwud29yZENvdW50KG5leHRTdHIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdjID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmRTdHIucHVzaChuZXh0U3RyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXBoYXNpemVkVGV4dCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZHNTZWVuICs9IHdjO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gd29yZHNTZWVuID4gbnVtV29yZHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIHRoaXMgbm9kZSBiZWNhdXNlIGl0J3MgZW1waGFzaXplZFxuICAgICAgICAgICAgICAgICAgICAgICAgbncuYkVuZFRhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbm9kZSBjb250YWluIHJlZ3VsYXIgdGV4dFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSAgIFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAobncubm9kZS5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgICAgIC8vIGZvciBlbGVtZW50IGNoaWxkXG4gICAgICAgICAgICAgICAgaWYgKG53TmFtZSA9PT0gXCJiXCIgfHwgbndOYW1lID09PSBcInN0cm9uZ1wiIHx8IG53TmFtZSA9PT0gXCJ1XCIgfHwgbndOYW1lID09PSBcImZvbnRcIikge1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgdGFyZ2V0IGVsZW1lbnQgY29udGFpbnMgZW1waGFzaXMgY2hpbGQsIGUuZy4sIDxwPjxzdHJvbmc+ZmFrZSBoZWFkaW5nPC9zdHJvbmc+PC9wPiBcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5leHRTdHIgPSBDb21tb25VdGlsLmdldElubmVyVGV4dChudy5ub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIGxldCB3YyA9IENvbW1vblV0aWwud29yZENvdW50KG5leHRTdHIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAod2MgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JkU3RyLnB1c2gobmV4dFN0cik7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbXBoYXNpemVkVGV4dCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3Jkc1NlZW4gKz0gd2M7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gd29yZHNTZWVuID4gbnVtV29yZHM7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNraXAgdGhpcyBub2RlIGJlY2F1c2UgaXQncyBlbXBoYXNpemVkXG4gICAgICAgICAgICAgICAgICAgIG53LmJFbmRUYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSB0aGUgZWxlbWVudCB3aGljaCBoYXMgYSByb2xlIGV4Y2VwdCAnZ2VuZXJpYycsICdwYXJhZ3JhcGgnIG9yICdzdHJvbmcnXG4gICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBhcHBsZXQgZWxlbWVudCB0aGF0IGlzIGRlcHJlY2F0ZWQgYW55d2F5XG4gICAgICAgICAgICAgICAgICAgIGxldCByb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKG53Lm5vZGUgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSAocm9sZSAhPT0gbnVsbCAmJiByb2xlICE9PSAnZ2VuZXJpYycgJiYgcm9sZSAhPT0gJ3BhcmFncmFwaCcgJiYgcm9sZSAhPT0gJ3N0cm9uZycpIHx8IG53TmFtZSA9PT0gXCJhcHBsZXRcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHdvcmRzU2VlbiA9PSAwKSBwYXNzZWQgPSB0cnVlO1xuICAgICAgICAvL2lnbm9yZSBpZiB0aGUgc3RyaW5nIGVuZHMgd2l0aCDigJw64oCdICDigJws4oCdICDigJwt4oCdICDigJw74oCdIG9yIOKAnC7igJ0gXG4gICAgICAgIGlmICghcGFzc2VkKSBwYXNzZWQgPSAvWzosO1xcLVxcLl0kLy50ZXN0KHdvcmRTdHIuam9pbihcIiBcIikudHJpbSgpKTtcbiAgICAgICAgXG4gICAgICAgIGlmIChwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfaGVhZGluZ1wiLCBbd29yZFN0ci5qb2luKFwiIFwiKV0pO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcbmltcG9ydCB7IENvbG9yVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbG9yVXRpbFwiO1xuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5pbXBvcnQgeyBDU1NVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ1NTVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgdGV4dF9jb250cmFzdF9zdWZmaWNpZW50OiBSdWxlID0ge1xuICAgIGlkOiBcInRleHRfY29udHJhc3Rfc3VmZmljaWVudFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIklCTUFfQ29sb3JfQ29udHJhc3RfV0NBRzJBQVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZmFpbF9jb250cmFzdFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcInBvdGVudGlhbF9zYW1lX2NvbG9yXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJJQk1BX0NvbG9yX0NvbnRyYXN0X1dDQUcyQUFfUFZcIjoge1xuICAgICAgICAgICAgXCJwYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF8xXCI6IFwicG90ZW50aWFsX2dyYXBoaWNfYmFja2dyb3VuZFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IGB0ZXh0X2NvbnRyYXN0X3N1ZmZpY2llbnQuaHRtbGAsXG4gICAgICAgICAgICBcInBhc3NcIjogYHRleHRfY29udHJhc3Rfc3VmZmljaWVudC5odG1sYCxcbiAgICAgICAgICAgIFwiZmFpbF9jb250cmFzdFwiOiBgdGV4dF9jb250cmFzdF9zdWZmaWNpZW50Lmh0bWxgLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfc2FtZV9jb2xvclwiOiBgdGV4dF9jb250cmFzdF9zdWZmaWNpZW50Lmh0bWxgLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfZ3JhcGhpY19iYWNrZ3JvdW5kXCI6IGB0ZXh0X2NvbnRyYXN0X3N1ZmZpY2llbnQuaHRtbGAsXG4gICAgICAgICAgICBcInBvdGVudGlhbF90ZXh0X3NoYWRvd1wiOiBgdGV4dF9jb250cmFzdF9zdWZmaWNpZW50Lmh0bWxgXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSBjb250cmFzdCByYXRpbyBvZiB0ZXh0IHdpdGggaXRzIGJhY2tncm91bmQgbXVzdCBtZWV0IFdDQUcgQUEgcmVxdWlyZW1lbnRzXCIsXG4gICAgICAgICAgICBcInBhc3NcIjogXCJUaGUgY29udHJhc3QgcmF0aW8gb2YgdGV4dCB3aXRoIGl0cyBiYWNrZ3JvdW5kIG1lZXRzIFdDQUcgQUEgcmVxdWlyZW1lbnRzXCIsXG4gICAgICAgICAgICBcImZhaWxfY29udHJhc3RcIjogXCJUZXh0IGNvbnRyYXN0IG9mIHswfSB3aXRoIGl0cyBiYWNrZ3JvdW5kIGlzIGxlc3MgdGhhbiB0aGUgV0NBRyBBQSBtaW5pbXVtIHJlcXVpcmVtZW50cyBmb3IgdGV4dCBvZiBzaXplIHsxfXB4IGFuZCB3ZWlnaHQgb2YgezJ9XCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9zYW1lX2NvbG9yXCI6IFwiVGhlIGZvcmVncm91bmQgdGV4dCBhbmQgaXRzIGJhY2tncm91bmQgY29sb3IgYXJlIGJvdGggZGV0ZWN0ZWQgYXMgezN9LiBWZXJpZnkgdGhlIHRleHQgbWVldHMgdGhlIFdDQUcgQUEgcmVxdWlyZW1lbnRzIGZvciBtaW5pbXVtIGNvbnRyYXN0XCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9ncmFwaGljX2JhY2tncm91bmRcIjogXCJWZXJpZnkgdGhlIGNvbnRyYXN0IHJhdGlvIG9mIHRoZSB0ZXh0IGFnYWluc3QgdGhlIGxpZ2h0ZXN0IGFuZCB0aGUgZGFya2VzdCBjb2xvcnMgb2YgdGhlIGJhY2tncm91bmQgbWVldHMgdGhlIFdDQUcgQUEgbWluaW11bSByZXF1aXJlbWVudHMgZm9yIHRleHQgb2Ygc2l6ZSB7MX1weCBhbmQgd2VpZ2h0IG9mIHsyfVwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfdGV4dF9zaGFkb3dcIjogXCJWZXJpZnkgdGhlIGNvbnRyYXN0IHJhdGlvIG9mIHRoZSB0ZXh0IHdpdGggc2hhZG93IG1lZXRzIHRoZSBXQ0FHIEFBIG1pbmltdW0gcmVxdWlyZW1lbnRzIGZvciB0ZXh0IG9mIHNpemUgezF9cHggYW5kIHdlaWdodCBvZiB7Mn1cIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgbnVtOiBcIjEuNC4zXCIsIC8vIG51bTogWyBcIjIuNC40XCIsIFwieC55LnpcIiBdIGFsc28gYWxsb3dlZFxuICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbJ2FmdzRmNyddLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAvLyBhdm9pZCBkaWFnbm9zaW5nIGVsZW1lbnRzIHRoYXQgYXJlIG5vdCB2aXNpYmxlXG4gICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKHJ1bGVDb250ZXh0KSB8fFxuICAgICAgICAgICAgKFZpc1V0aWwuaGlkZGVuQnlEZWZhdWx0RWxlbWVudHMgIT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgIFZpc1V0aWwuaGlkZGVuQnlEZWZhdWx0RWxlbWVudHMgIT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgVmlzVXRpbC5oaWRkZW5CeURlZmF1bHRFbGVtZW50cy5pbmRleE9mKG5vZGVOYW1lKSA+IC0xKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vVE9ETyA/IHNob3VsZCBvbmx5IGNvbnNpZGVyIG5hdGl2ZSBkaXNhYmxlZCwgaWdub3JlIGFyaWEtZGlzYWJsZWRcbiAgICAgICAgLy9za2lwIGRpc2FibGVkIGVsZW1lbnRcbiAgICAgICAgaWYgKENvbW1vblV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy9za2lwIGVsZW1lbnRzXG4gICAgICAgIGlmIChDb21tb25VdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBbXCJzdmdcIiwgXCJzY3JpcHRcIiwgXCJtZXRhXCIsIFwic3R5bGVcIl0pKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgbGV0IGRvYyA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQ7XG4gICAgICAgIGlmICghZG9jKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIFxuICAgICAgICBsZXQgd2luID0gZG9jLmRlZmF1bHRWaWV3O1xuICAgICAgICBpZiAoIXdpbikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGlzIGVsZW1lbnQgaGFzIGNoaWxkcmVuIHdpdGggYWN0dWFsIHRleHQuXG4gICAgICAgIGxldCBjaGlsZFN0ciA9IENvbW1vblV0aWwuZ2V0Tm9kZVRleHQocnVsZUNvbnRleHQpO1xuICAgICAgICBcbiAgICAgICAgaWYgKCFDb21tb25VdGlsLmlzU2hhZG93SG9zdEVsZW1lbnQocnVsZUNvbnRleHQpIHx8IChDb21tb25VdGlsLmlzU2hhZG93SG9zdEVsZW1lbnQocnVsZUNvbnRleHQpICYmIENvbW1vblV0aWwuZ2V0Tm9kZVRleHQocnVsZUNvbnRleHQuc2hhZG93Um9vdCkgPT09ICcnKSkge1xuICAgICAgICAgICAgaWYgKGNoaWxkU3RyLnRyaW0oKS5sZW5ndGggPT0gMCApXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIGlnbm9yZSBpZiB0aGUgdGV4dCBkb2VzIG5vdCBjb252ZXkgYW55dGhpbmcgaW4gaHVtYW4gbGFuZ3VhZ2VcbiAgICAgICAgICAgIC8qKiBcbiAgICAgICAgICAgICAqICgxKSBpZ25vcmUgbm9uLWFscGhhbnVtZXJpYyBvciBzcGVjaWFsIGNoYXJhY3RlcnMgaW4gQVNDSTogXihhLXpBLVpcXGRcXHMpXG4gICAgICAgICAgICAgKiAoMikgaWdub3JlIG5vbi1wcmludGFibGUgdW5pY29kZSBjaGFyYWN0ZXJzOiBcXHUwMDAwLVxcdTAwMDhcXHUwMDBCLVxcdTAwMUZcXHUwMDdGLVxcdTAwOUZcXHUyMDAwLVxcdTIwMEZcXHUyMDI4LVxcdTIwMkZcXHUyMDVGLVxcdTIwNkZcXHUzMDAwXFx1RkVGRlxuICAgICAgICAgICAgICogIHNlZSBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8zNzcwMTE3L3doYXQtaXMtdGhlLXJhbmdlLW9mLXVuaWNvZGUtcHJpbnRhYmxlLWNoYXJhY3RlcnNcbiAgICAgICAgICAgICAqICgzKSBmb3Igbm93IG5vdCBjb25zaWRlciB1bmljb2RlIHNwZWNpYWwgY2hhcmFjdGVycyB0aGF0IGFyZSBkaWZmZXJlbnQgaW4gZGlmZmVyZW50IGxhbmd1YWdlc1xuICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIC8vbGV0IHJlZ2V4ID0gL1teKGEtekEtWlxcZFxccylcXHUwMDAwLVxcdTAwMDhcXHUwMDBCLVxcdTAwMUZcXHUwMDdGLVxcdTAwOUZcXHUyMDAwLVxcdTIwMEZcXHUyMDI4LVxcdTIwMkZcXHUyMDVGLVxcdTIwNkZcXHUzMDAwXFx1RkVGRl0rL2c7XG4gICAgICAgICAgICBsZXQgcmVnZXggPSAvW14oYS16QS1aXFxkXFxzKVxcXihcXHU0ZTAwLVxcdTlmZmZcXHUzNDAwLVxcdTRkYmYpXFx1MDAwMC1cXHUwMDA4XFx1MDAwQi1cXHUwMDFGXFx1MDA3Ri1cXHUwMDlGXFx1MjAwMC1cXHUyMDBGXFx1MjAyOC1cXHUyMDJGXFx1MjA1Ri1cXHUyMDZGXFx1MzAwMFxcdUZFRkZdKy9nO1xuICAgICAgICAgICAgY2hpbGRTdHIgPSBjaGlsZFN0ci50cmltKCkucmVwbGFjZShyZWdleCwgJycpO1xuICAgICAgICAgICAgaWYgKGNoaWxkU3RyLnRyaW0oKS5sZW5ndGggPT09IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZWxlbSA9IHJ1bGVDb250ZXh0O1xuICAgICAgICAvLyB0aGUgY2hpbGQgZWxlbWVudHMgKHJhdGhlciB0aGFuIHNoYWRvdyByb290KSBvZiBhIHNoYWRvdyBob3N0IGlzIGVpdGhlciByZS1hc3NpZ25lZCB0byB0aGUgc2hhZG93IHNsb3QgaWYgdGhlIHNsb3QgZXhpc3RzIFxuICAgICAgICAvLyBvciBub3QgZGlzcGxheWVkLCBzbyBzaG91bGRuJ3QgYmUgY2hlY2tlZCBmcm9tIHRoZSBsaWdodCBET00sIHJhdGhlciBpdCBzaG91bGQgYmUgY2hlY2tlZCBhcyByZWFzc2dpbmdlZCBzbG90IGVsZW1lbnQocykgaW4gdGhlIHNoYWRvdyBET00uXG4gICAgICAgIGlmIChDb21tb25VdGlsLmlzU2hhZG93SG9zdEVsZW1lbnQocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICAvLyBpZiBpdCdzIGRpcmVjdCB0ZXh0IG9mIGEgc2hhZG93IGhvc3RcbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5zaGFkb3dSb290KSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgbm9kZT1ydWxlQ29udGV4dC5maXJzdENoaWxkOyBub2RlOyBub2RlPW5vZGUubmV4dFNpYmxpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGU9PTMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgbXVsdGlwbGUgdGV4dHMgZXhpc3QsIG9ubHkgbmVlZCB0byBjaGVjayBvbmUgXG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtID0gKG5vZGUgYXMgVGV4dCkuYXNzaWduZWRTbG90O1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH0gICBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZWxlbSA9PT0gbnVsbCkgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBsZXQgc3R5bGUgPSB3aW4uZ2V0Q29tcHV0ZWRTdHlsZShlbGVtKTtcbiAgICAgICAgXG4gICAgICAgIC8vIEpDSCBjbGlwIElORk86XG4gICAgICAgIC8vICAgICAgVGhlIGNsaXAgcHJvcGVydHkgbGV0cyB5b3Ugc3BlY2lmeSBhIHJlY3RhbmdsZSB0byBjbGlwIGFuIGFic29sdXRlbHkgcG9zaXRpb25lZCBlbGVtZW50LiBcbiAgICAgICAgLy8gICAgICBUaGUgcmVjdGFuZ2xlIHNwZWNpZmllZCBhcyBmb3VyIGNvb3JkaW5hdGVzLCBhbGwgZnJvbSB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBlbGVtZW50IHRvIGJlIGNsaXBwZWQuXG4gICAgICAgIC8vICAgICAgUHJvcGVydHkgdmFsdWVzOlxuICAgICAgICAvLyAgICAgICAgICBub25lICAgICAgICBUaGlzIGlzIGRlZmF1bHQuIE5vIGNsaXBwaW5nIGlzIGRvbmVcbiAgICAgICAgLy8gICAgICAgICAgYXV0byAgICAgICAgTm8gY2xpcHBpbmcgd2lsbCBiZSBkb25lXG4gICAgICAgIC8vICAgICAgICAgIHNoYXBlICAgICAgIFRoZSBvbmx5IHZhbGlkIHZhbHVlIGlzOiByZWN0ICh0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnQpXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgIGUuZy4sIGNsaXA6IHJlY3QoMTBweCwgMjBweCwgMzBweCwgNDBweCk7XG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IHRoZSBmb3VyIHZhbHVlcyBhcmUgaW4gdGhlIHNhbWUgb3JkZXIgYXMgbWFyZ2luL3BhZGRpbmdcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgVGhlIHJlY3QgdmFsdWVzIGFyZSBwb3NpdGl2ZSBwaXhlbCB2YWx1ZXMsIGUuZy4sIDEwcHgsIGV0Yy5cbiAgICAgICAgLy8gICAgICAgICAgbWFyZ2luLWJveCAgVXNlcyB0aGUgbWFyZ2luIGJveCBhcyB0aGUgcmVmZXJlbmNlIGJveFxuICAgICAgICAvLyAgICAgICAgICBib3JkZXItYm94ICBVc2VzIHRoZSBib3JkZXIgYm94IGFzIHRoZSByZWZlcmVuY2UgYm94XG4gICAgICAgIC8vICAgICAgICAgIHBhZGRpbmctYm94IFVzZXMgdGhlIHBhZGRpbmcgYm94IGFzIHRoZSByZWZlcmVuY2UgYm94XG4gICAgICAgIC8vICAgICAgICAgIGNvbnRlbnQtYm94XG4gICAgICAgIC8vICAgICAgICAgIGZpbGwtYm94XG4gICAgICAgIC8vICAgICAgICAgIHN0cm9rZS1ib3hcbiAgICAgICAgLy8gICAgICBOT1RFOiB0aGUgQ1NTIGNsaXAgcHJvcGVydHkgaXMgZGVwcmVjYXRlZFxuICAgICAgICAvLyAgICAgIEFsc286IGNsaXAgb25seSB3b3JrcyBpZiB0aGUgZWxlbWVudCBpcyBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQgYW5kIGNhbiBvbmx5IGRvIHJlY3RhbmdsZXNcbiAgICAgICAgLy8gY2hlY2sgaWYgZWxlbWVudCB2aXNpYmxlXG4gICAgICAgIGxldCB2aXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgaWYgKHN0eWxlLndpZHRoICE9PSBcIjBcIiAmJlxuICAgICAgICAgICAgc3R5bGUuaGVpZ2h0ICE9PSBcIjBcIiAmJlxuICAgICAgICAgICAgc3R5bGUub3BhY2l0eSAhPT0gXCIwXCIgJiZcbiAgICAgICAgICAgIHN0eWxlLmRpc3BsYXkgIT09ICdub25lJyAmJlxuICAgICAgICAgICAgc3R5bGUudmlzaWJpbGl0eSAhPT0gJ2hpZGRlbicgJiZcbiAgICAgICAgICAgIHN0eWxlLm92ZXJmbG93ICE9PSAnaGlkZGVuJyAmJlxuICAgICAgICAgICAgLy8gbGVmdCBhbmQgcmlnaHQgd29yayB3aXRoIGFsbCBhYnNvbHV0ZSB1bml0c1xuICAgICAgICAgICAgKHN0eWxlLmxlZnQgPT09IFwiYXV0b1wiIHx8IChzdHlsZS5wb3NpdGlvbiA9PT0gJ2Fic29sdXRlJyAmJiBwYXJzZUludChzdHlsZS5sZWZ0LnJlcGxhY2UoL1teMC05ListXS8sICcnKSkgPiAwKSkgJiZcbiAgICAgICAgICAgIChzdHlsZS5sZWZ0ID09PSBcImF1dG9cIiB8fCAoc3R5bGUucG9zaXRpb24gPT09ICdhYnNvbHV0ZScgJiYgcGFyc2VJbnQoc3R5bGUudG9wLnJlcGxhY2UoL1teMC05ListXS8sICcnKSkgPiAwKSkpIHtcbiAgICAgICAgICAgIHZpc2libGUgPSB0cnVlO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJlbGVtZW50IElTIHZpc2libGVcIik7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkNIRUNLIENPTE9SIENPTlRSQVNUIHVubGVzcyB0byBzbWFsbFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZpc2libGUgPSBmYWxzZTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiZWxlbWVudCBOT1QgdmlzaWJsZVwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmlzaWJsZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiRE8gTk9UIENIRUNLIENPTE9SIENPTlRSQVNUXCIpO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuXG4gICAgICAgIGxldCBjbGlwSGVpZ2h0ID0gLTE7XG4gICAgICAgIGlmIChzdHlsZS5jbGlwICE9PSBcImF1dG9cIikge1xuICAgICAgICAgICAgbGV0IGNsaXBTdHJpbmcgPSBzdHlsZS5jbGlwLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBpZiAoY2xpcFN0cmluZy5pbmNsdWRlcyhcInJlY3RcIikpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVCcmFja2V0cyA9IC9cXCgoLiopXFwpL2c7XG4gICAgICAgICAgICAgICAgdmFyIGxpc3RPZlRleHQgPSBbXTtcbiAgICAgICAgICAgICAgICB2YXIgZm91bmQgPSByZUJyYWNrZXRzLmV4ZWMoY2xpcFN0cmluZyk7XG4gICAgICAgICAgICAgICAgdmFyIGZvdW5kQXJyID0gZm91bmRbMV0uc3BsaXQoJywgJyk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmb3VuZEFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImZvdW5kQXJyW1wiLGksXCJdID0gXCIsZm91bmRBcnJbaV0pO1xuICAgICAgICAgICAgICAgICAgICBsaXN0T2ZUZXh0LnB1c2goZm91bmRBcnJbaV0pO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImxpc3RPZlRleHQgPSBcIixsaXN0T2ZUZXh0KTtcbiAgICAgICAgICAgIGNsaXBIZWlnaHQgPSBwYXJzZUludChsaXN0T2ZUZXh0WzBdLnJlcGxhY2UoL3B4L2csICcnKSkgLSBwYXJzZUludChsaXN0T2ZUZXh0WzJdLnJlcGxhY2UoL3B4L2csICcnKSk7XG4gICAgICAgICAgICBjbGlwSGVpZ2h0ID0gTWF0aC5hYnMoY2xpcEhlaWdodCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBKQ0ggY2xpcC1wYXRoIElORk86XG4gICAgICAgIC8vICAgICAgRXhjZWxsZW50IGFydGljbGUgb24gY2xpcC1wYXRoOiBodHRwczovL2lzaGFkZWVkLmNvbS9hcnRpY2xlL2NsaXAtcGF0aC9cbiAgICAgICAgLy8gICAgICBjbGlwLXBhdGggaXMgYSB0b3RhbGx5IGRpZmZlcmVudCBhbmltYWwgd2l0aCBtYW55LCBtYW55IGRpZmZlcmVudCB2YXJpYXRpb25zXG4gICAgICAgIC8vICAgICAgVGhlIGdvYWwgd2FzIGZvciBpdCB0byBub3QgYmUgYXMgbGltaXRlZCBhcyBjbGlwXG4gICAgICAgIC8vICAgICAgVGhlIHN5bnRheCBpcyBtb3JlIGNvbXBsaWNhdGVkIChhcyBpdCBkb2VzIG1vcmUpIGFuZCBpdCBpcyBkaWZmZXJlbnQgZnJvbSBjbGlwLFxuICAgICAgICAvLyAgICAgIGUuZy4sIHRoZSBhYm92ZSBjbGlwIHJlY3RhbmdsZSB3b3VsZCBiZSBjbGlwLXBhdGg6IGluc2V0KDEwcHggMjBweCAzMHB4IDQwcHgpO1xuICAgICAgICAvLyAgICAgIE5vdGU6IHRoZXJlIGFyZSBubyBjb21tYXNcbiAgICAgICAgLy8gICAgICBBbHNvLCBpdCBjYW4gdGFrZSBzaW5nbGUgdmFsdWVzIHRvIG1ha2UgYWxsIHNpZGVzIHRoZSBzYW1lLCBvciAyIHZhbHVlcyAodmVydC9ob3JpKS5cbiAgICAgICAgLy8gICAgICBvciAzIHZhbHVlcyAodG9wL2hvcmkvYm90dG9tKVxuICAgICAgICAvLyAgICAgIEFuZCBwZXJjZW50YWdlcyBjYW4gd29ya3MgYXMgd2VsbCBhcyBweFxuICAgICAgICAvLyAgICAgIFxuICAgICAgICAvLyAgICAgIEFsdGhvdWdoIHRoZXJlIGFyZSBmaXZlIGRpZmZlcmVudCBzaGFwZXM6IGluc2V0ICh0ZXJtIHVzZWQgZm9yIHJlY3RhbmdsZSksIGNpcmNsZSxcbiAgICAgICAgLy8gICAgICAgICAgZWxsaXBzZSwgcG9seWdvbiwgcGF0aCAtIHdlIHdpbGwgb25seSBjb25jZXJuIG91cnNlbHZlcyB3aXRoIGluc2V0XG4gICAgICAgIC8vICAgICAgVGhlcmUgYXJlIDcgYm94IHZhbHVlczogbWFyZ2luLWJveCwgYm9yZGVyLWJveCwgcGFkZGluZy1ib3gsIGNvbnRlbnQtYm94LCBmaWxsLWJveCwgc3Ryb2tlLWJveCwgdmlldy1ib3hcbiAgICAgICAgLy8gICAgICBCb3ggYW5kIHNoYXBlIHZhbHVlcyBtYXkgYmUgY29tYmluZWQ6IGNsaXAtcGF0aDogcGFkZGluZy1ib3ggY2lyY2xlKDUwcHggYXQgMCAxMDBweCk7XG4gICAgICAgIC8vICAgICAgTk9URTogdGhlIGJveCB2YWx1ZXMgYXJlIE5PVCBpbnR1aXRpdmUsIHNlZTogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL0NTU19TaGFwZXMvRnJvbV9ib3hfdmFsdWVzI21hcmdpbi1ib3hcbiAgICAgICAgLy8gICAgICBcbiAgICAgICAgLy8gICAgICBTbyB0aGUga2V5IHF1ZXN0aW9uIGlzIHdoYXQgYW1vdW50IG9mIGVmZm9ydCBkbyB3ZSB3YW50IHRvIGludmVzdCBpbnRvIGNsaXAtcGF0aFxuICAgICAgICAvLyBcblxuICAgICAgICAvLyBKQ0ggZG9uJ3QgZG8gY2xpcC1wYXRoIG5vdyBcbiAgICAgICAgbGV0IGNsaXBQYXRoSGVpZ2h0ID0gLTE7XG4gICAgICAgIC8vIGlmIChzdHlsZS5jbGlwUGF0aCAhPT0gXCJhdXRvXCIpIHtcbiAgICAgICAgLy8gICAgIGNvbnNvbGUubG9nKFwic3R5bGUuY2xpcFBhdGggPSBcIixzdHlsZS5jbGlwUGF0aCk7XG4gICAgICAgIC8vICAgICBjb25zb2xlLmxvZyhcInN0eWxlLmNsaXBQYXRoLnRvU3RyaW5nID0gXCIsc3R5bGUuY2xpcFBhdGgudG9TdHJpbmcoKSk7XG4gICAgICAgIC8vICAgICBsZXQgY2xpcFN0cmluZyA9IHN0eWxlLmNsaXBQYXRoLnRvU3RyaW5nKCk7XG4gICAgICAgIC8vICAgICBpZiAoY2xpcFN0cmluZy5pbmNsdWRlcyhcImluc2V0XCIpKSB7XG4gICAgICAgIC8vICAgICAgICAgdmFyIHJlQnJhY2tldHMgPSAvXFwoKC4qKVxcKS9nO1xuICAgICAgICAvLyAgICAgICB2YXIgbGlzdE9mVGV4dCA9IFtdO1xuICAgICAgICAvLyAgICAgICB2YXIgZm91bmQgPSByZUJyYWNrZXRzLmV4ZWMoY2xpcFN0cmluZyk7XG4gICAgICAgIC8vICAgICAgIHZhciBmb3VuZEFyciA9IGZvdW5kWzFdLnNwbGl0KCcgJyk7XG4gICAgICAgIC8vICAgICAgIGZvciAobGV0IGk9MDsgaTxmb3VuZEFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICAvLyAgICAgICAgIGNvbnNvbGUubG9nKFwiZm91bmRBcnJbXCIsaSxcIl0gPSBcIixmb3VuZEFycltpXSk7XG4gICAgICAgIC8vICAgICAgICAgbGlzdE9mVGV4dC5wdXNoKGZvdW5kQXJyW2ldKTtcbiAgICAgICAgLy8gICAgICAgfTtcbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gICAgIGNvbnNvbGUubG9nKFwibGlzdE9mVGV4dCA9IFwiLGxpc3RPZlRleHQpO1xuICAgICAgICAvLyBjbGlwUGF0aEhlaWdodCA9IHBhcnNlSW50KGxpc3RPZlRleHRbMF0ucmVwbGFjZSgvcHgvZywgJycpKSAtIHBhcnNlSW50KGxpc3RPZlRleHRbMl0ucmVwbGFjZSgvcHgvZywgJycpKTtcbiAgICAgICAgLy8gY2xpcFBhdGhIZWlnaHQgPSBNYXRoLmFicyhjbGlwSGVpZ2h0KTtcbiAgICAgICAgLy8gfVxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcImNsaXBQYXRoSGVpZ2h0ID0gXCIsIGNsaXBQYXRoSGVpZ2h0KTtcblxuICAgICAgICAvLyBpZiAoc3R5bGUucG9zaXRpb24gPT09IFwiYWJzb2x1dGVcIiAmJiBzdHlsZS5jbGlwID09PSBcInJlY3QoMHB4LCAwcHgsIDBweCwgMHB4KVwiICYmIHN0eWxlLm92ZXJmbG93ICE9PSBcInZpc2libGVcIikge1xuICAgICAgICAvLyBKQ0ggYXJiaXRyYXJpbHkgdXNlIGxlc3MgdGhhdCA3cHggZm9yIGNsaXBIZWlnaHRcbiAgICAgICAgaWYgKHN0eWxlLnBvc2l0aW9uID09PSBcImFic29sdXRlXCIgJiYgY2xpcEhlaWdodCA8IDcgJiYgY2xpcEhlaWdodCAhPT0gLTEpIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiRE8gTk9UIENIRUNLIENPTE9SIENPTlRSQVNUIGJlY2F1c2UgdG9vIHNtYWxsXCIpO1xuICAgICAgICAgICAgLy8gQ29ybmVyIGNhc2Ugd2hlcmUgaXRlbSBpcyBoaWRkZW4gKGFjY2Vzc2liaWxpdHkgaGlkaW5nIHRlY2huaXF1ZSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBGaXJzdCBkZXRlcm1pbmUgdGhlIGNvbG9yIGNvbnRyYXN0IHJhdGlvXG4gICAgICAgIGxldCBjb2xvckNvbWJvID0gQ29sb3JVdGlsLkNvbG9yQ29tYm8oZWxlbSk7XG4gICAgICAgIGlmIChjb2xvckNvbWJvID09PSBudWxsKSB7XG4gICAgICAgICAgICAvL3NvbWUgZXhjZXB0aW9uIG9jY3VycmVkLCBvciBub3QgYWJsZSB0byBnZXQgY29sb3IgY29tYm8gZm9yIHNvbWUgcmVhc29uXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcInVuYWJsZSB0byBnZXQgY29sb3IgY29tYm8gZm9yIGVsZW1lbnQ6IFwiICsgZWxlbS5ub2RlTmFtZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGZnID0gY29sb3JDb21iby5mZztcbiAgICAgICAgbGV0IGJnID0gY29sb3JDb21iby5iZztcbiAgICAgICAgbGV0IHJhdGlvID0gZmcuY29udHJhc3RSYXRpbyhiZyk7XG4gICAgICAgIGxldCB3ZWlnaHQgPSBDU1NVdGlsLmdldFdlaWdodE51bWJlcihzdHlsZS5mb250V2VpZ2h0KTtcbiAgICAgICAgbGV0IHNpemUgPSBDU1NVdGlsLmdldEZvbnRJblBpeGVscyhzdHlsZS5mb250U2l6ZSwgZWxlbSk7XG4gICAgICAgIGxldCBpc0xhcmdlU2NhbGUgPSBzaXplID49IDI0IHx8IHNpemUgPj0gMTguNiAmJiB3ZWlnaHQgPj0gNzAwO1xuICAgICAgICBcbiAgICAgICAgaWYgKENTU1V0aWwuY29udGFpbnNDS0ooY2hpbGRTdHIpKSB7XG4gICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYWN0LXJ1bGVzL2FjdC1ydWxlcy5naXRodWIuaW8vcHVsbC8yMTIxL2ZpbGVzXG4gICAgICAgICAgICAvLyBmb3IgQ0pLLCAyMiBwdCBvciAxOCBwdCB3aXRoIGZvbnQtd2VpZ2h0ID49IDcwMCwgMXB0ID0gMS4zMzMgcHhcbiAgICAgICAgICAgIGlzTGFyZ2VTY2FsZSA9IHNpemUgPj0gMjkuMyB8fCBzaXplID49IDI0ICYmIHdlaWdodCA+PSA3MDA7XG4gICAgICAgIH0gICAgXG4gICAgICAgIGxldCBwYXNzZWQgPSByYXRpbyA+PSA0LjUgfHwgKHJhdGlvID49IDMgJiYgaXNMYXJnZVNjYWxlKTtcbiAgICAgICAgbGV0IGhhc0JhY2tncm91bmQgPSBjb2xvckNvbWJvLmhhc0JHSW1hZ2UgfHwgY29sb3JDb21iby5oYXNHcmFkaWVudDtcbiAgICAgICAgbGV0IHRleHRTaGFkb3cgPSBjb2xvckNvbWJvLnRleHRTaGFkb3c7XG4gICAgICAgIGxldCBpc0Rpc2FibGVkID0gQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChlbGVtKTtcbiAgICAgICAgaWYgKCFpc0Rpc2FibGVkKSB7XG4gICAgICAgICAgICBsZXQgY29udHJvbCA9IENvbW1vblV0aWwuZ2V0Q29udHJvbE9mTGFiZWwoZWxlbSk7XG4gICAgICAgICAgICBpZiAoY29udHJvbCkge1xuICAgICAgICAgICAgICAgIGlzRGlzYWJsZWQgPSBDb21tb25VdGlsLmlzTm9kZURpc2FibGVkKGNvbnRyb2wpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZiAoIWlzRGlzYWJsZWQgJiYgbm9kZU5hbWUgPT09ICdsYWJlbCcgJiYgQ29tbW9uVXRpbC5pc0Rpc2FibGVkQnlGaXJzdENoaWxkRm9ybUVsZW1lbnQoZWxlbSkpIHtcbiAgICAgICAgICAgIGlzRGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc0Rpc2FibGVkICYmIHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImlkXCIpICYmIENvbW1vblV0aWwuaXNEaXNhYmxlZEJ5UmVmZXJyaW5nRWxlbWVudChlbGVtKSkge1xuICAgICAgICAgICAgaXNEaXNhYmxlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvKipzZXRDYWNoZShydWxlQ29udGV4dCwgXCJFWFRfQ29sb3JfQ29udHJhc3RfV0NBRzJBQVwiLCB7XG4gICAgICAgICAgICBcInJhdGlvXCI6IHJhdGlvLFxuICAgICAgICAgICAgXCJpc0xhcmdlU2NhbGVcIjogaXNMYXJnZVNjYWxlLFxuICAgICAgICAgICAgXCJ3ZWlnaHRcIjogd2VpZ2h0LFxuICAgICAgICAgICAgXCJzaXplXCI6IHNpemUsXG4gICAgICAgICAgICBcImhhc0JhY2tncm91bmRcIjogaGFzQmFja2dyb3VuZCxcbiAgICAgICAgICAgIFwiaXNEaXNhYmxlZFwiOiBpc0Rpc2FibGVkXG4gICAgICAgIH0pOyovXG4gICAgICAgIFxuICAgICAgICAvLyBJZiBlbGVtZW50IG9yIHBhcmVudCBpcyBkaXNhYmxlZCwgdGhpcyBydWxlIGRvZXMgbm90IGFwcGx5IChidXQgbWF5IGJlIDM6MSBpbiBmdXR1cmUpXG4gICAgICAgIGlmICghcGFzc2VkICYmIGlzRGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIGlmIChoYXNCYWNrZ3JvdW5kKSB7XG4gICAgICAgICAgICAgICAgLy8gZmlyZSBwb3RlbnRpYWwgc2luY2UgYSB0ZXh0IG9uIGFuIGltYWdlIG9yIGdyYWRpZW50IG1heSBiZSBzdGlsbCB2aWV3YWJsZSwgZGVwZW5kaW5nIG9uIHRoZSB0ZXh0IGxvY2F0aW9uIG9uIHRoZSBncmFkaWVudCBvciBpbWFnZVxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX2dyYXBoaWNfYmFja2dyb3VuZFwiLCBbcmF0aW8udG9GaXhlZCgyKSwgc2l6ZSwgd2VpZ2h0XSk7O1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0ZXh0U2hhZG93KSB7XG4gICAgICAgICAgICAgICAgLy8gZmlyZSBwb3RlbnRpYWwgc2luY2UgYSB0ZXh0IHdpdGggc2hhZG93IG1heSBiZSBzdGlsbCB2aWV3YWJsZSwgZGVwZW5kaW5nIG9uIHRoZSBzaGFkb3cgZWZmZmVjdHNcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF90ZXh0X3NoYWRvd1wiLCBbcmF0aW8udG9GaXhlZCgyKSwgc2l6ZSwgd2VpZ2h0XSk7O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoZmcudG9IZXgoKSA9PT0gYmcudG9IZXgoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF9zYW1lX2NvbG9yXCIsIFtyYXRpby50b0ZpeGVkKDIpLCBzaXplLCB3ZWlnaHQsIGZnLnRvSGV4KCksIGJnLnRvSGV4KCksIGNvbG9yQ29tYm8uaGFzQkdJbWFnZSwgY29sb3JDb21iby5oYXNHcmFkaWVudF0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfY29udHJhc3RcIiwgW3JhdGlvLnRvRml4ZWQoMiksIHNpemUsIHdlaWdodCwgZmcudG9IZXgoKSwgYmcudG9IZXgoKSwgY29sb3JDb21iby5oYXNCR0ltYWdlLCBjb2xvckNvbWJvLmhhc0dyYWRpZW50XSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSAgICBcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIiwgW3JhdGlvLnRvRml4ZWQoMiksIHNpemUsIHdlaWdodCwgZmcudG9IZXgoKSwgYmcudG9IZXgoKSwgY29sb3JDb21iby5oYXNCR0ltYWdlLCBjb2xvckNvbWJvLmhhc0dyYWRpZW50XSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCB0ZXh0X3F1b3RlZF9jb3JyZWN0bHk6IFJ1bGUgPSB7XG4gICAgaWQ6IFwidGV4dF9xdW90ZWRfY29ycmVjdGx5XCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInRleHRfcXVvdGVkX2NvcnJlY3RseS5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwidGV4dF9xdW90ZWRfY29ycmVjdGx5Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJ0ZXh0X3F1b3RlZF9jb3JyZWN0bHkuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIklmIHRoZSBmb2xsb3dpbmcgdGV4dCBpcyBhIHF1b3RhdGlvbiwgbWFyayBpdCBhcyBhIDxxPiBvciA8YmxvY2txdW90ZT4gZWxlbWVudDogezB9XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiUXVvdGF0aW9ucyBzaG91bGQgYmUgbWFya2VkIHdpdGggPHE+IG9yIDxibG9ja3F1b3RlPiBlbGVtZW50c1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBpZ25vcmUgdGhlIGNoZWNrIGlmIHRoZSBub2RlIGlzIGhpZGRlblxuICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShydWxlQ29udGV4dCkgKSByZXR1cm4gbnVsbDtcbiAgICAgICAgLy8gRG9uJ3QgdHJpZ2dlciBpZiB0aGUgZWxlbWVudCBpcyBub3QgaW4gdGhlIGJvZHlcbiAgICAgICAgaWYgKENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFtcImJvZHlcIl0pID09PSBudWxsKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCB2YWxpZGF0ZVBhcmFtcyA9IHtcbiAgICAgICAgICAgIG1pbldvcmRzOiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IDMsXG4gICAgICAgICAgICAgICAgdHlwZTogXCJpbnRlZ2VyXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgbWluV29yZHMgPSB2YWxpZGF0ZVBhcmFtcy5taW5Xb3Jkcy52YWx1ZTtcblxuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgbGV0IHdhbGtOb2RlID0gcnVsZUNvbnRleHQuZmlyc3RDaGlsZCBhcyBOb2RlO1xuICAgICAgICBsZXQgdmlvbGF0ZWR0ZXh0ID0gbnVsbDtcbiAgICAgICAgLy8gaWdub3JlIHRoZSBjaGVjayBmb3IgdGhlIHRleHQgb2YgdGhlIGZvbGxvd2luZyBlbGVtZW50c1xuICAgICAgICBjb25zdCBpZ25vcmVkID0gW1wiYmxvY2txdW90ZVwiLCBcInFcIiwgXCJzY3JpcHRcIiwgXCJzdHlsZVwiLCBcInByZVwiLCBcImNvZGVcIiwgXCJydWJ5XCIsIFwic2FtcFwiXTtcbiAgICAgICAgd2hpbGUgKHBhc3NlZCAmJiB3YWxrTm9kZSkge1xuICAgICAgICAgICAgLy8gQ29tcGx5IHRvIHRoZSBDaGVjayBIaWRkZW4gQ29udGVudCBzZXR0aW5nIHdpbGwgYmUgZG9uZSBieSBkZWZhdWx0IGFzIHRoaXMgcnVsZSB0cmlnZ2VycyBvbiBlYWNoIGVsZW1lbnRcbiAgICAgICAgICAgIC8vIGFuZCBmb3IgZWFjaCBlbGVtZW50IGl0IG9ubHkgY2hlY2tzIHRoYXQgc2luZ2xlIGVsZW1lbnRzIHRleHQgbm9kZXMgYW5kIG5vdGhpbmcgZWxzZS4gU28gYWxsIGlubmVyIGVsZW1lbnRzIHdpbGwgYmVcbiAgICAgICAgICAgIC8vIGNvdmVyZWQgb24gdGhlaXIgb3duLiBDdXJyZW50bHkgZm9yIHRoaXMgcnVsZSBieSBkZWZhdWx0IENoZWNrIEhpZGRlbiBDb250ZW50IHdpbGwgd29yaywgYXMgd2UgYXJlIGRvaW5nXG4gICAgICAgICAgICAvLyBhIG5vZGUgd2FsayBvbmx5IG9uIHNpYmxpbmdzIHNvIGl0IHdvdWxkIG5vdCBnZXQgdGV4dCBub2RlcyBmcm9tIG90aGVyIHNpYmxpbmdzIGF0IGFsbC5cbiAgICAgICAgICAgIC8vIEluIHRoZSBjYXNlIGluIHRoZSBmdXR1cmUgc29tZXRoaW5nIGNobmdlcywganVzdCBuZWVkIHRvIGFkZCAmJiAhUlBUVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKHdhbGtOb2RlKSB0byB0aGUgYmVsb3dcbiAgICAgICAgICAgIC8vIGlmLlxuICAgICAgICAgICAgaWYgKHdhbGtOb2RlLm5vZGVOYW1lID09PSBcIiN0ZXh0XCIpIHtcbiAgICAgICAgICAgICAgICBsZXQgdHh0VmFsID0gd2Fsa05vZGUubm9kZVZhbHVlO1xuICAgICAgICAgICAgICAgIC8vIERvIHRoZSByZWdleCB0ZXN0cyBmaXJzdCAtIHNob3VsZCBiZSBmYXN0XG5cbiAgICAgICAgICAgICAgICAvLyBSZW1vdmUgYXBvc3Ryb3BoZSdzXG4gICAgICAgICAgICAgICAgdHh0VmFsID0gdHh0VmFsLnJlcGxhY2UoLyhcXFMpJyhcXFMpL2csIFwiJDEkMlwiKTtcbiAgICAgICAgICAgICAgICBsZXQgZGJsUXVvdGVzID0gdHh0VmFsLm1hdGNoKC8oXCJbXlwiXStcIikvZyk7XG4gICAgICAgICAgICAgICAgbGV0IHNuZ2xRdW90ZXMgPSB0eHRWYWwubWF0Y2goLygnW14nXSsnKS9nKTtcbiAgICAgICAgICAgICAgICAvLyBXYWxrIHRoZSBwYXJlbnRzIC0gb25seSBjb250aW51ZSB0ZXN0aW5nIGlmIHdlIGZvdW5kIGEgcXVvdGUsIGJ1dFxuICAgICAgICAgICAgICAgIC8vIHdlJ3JlIG5vdCBhbHJlYWR5IG1hcmtlZCB1cFxuICAgICAgICAgICAgICAgIC8vIEFsc28gc2tpcCBpZiB3ZSdyZSBpbiBhIHNjcmlwdCAtIHRoZXJlJ3MgbG90cyBvZiBxdW90ZXMgdXNlZCBpbiBzY3JpcHRzXG4gICAgICAgICAgICAgICAgaWYgKChkYmxRdW90ZXMgIT09IG51bGwgfHwgc25nbFF1b3RlcyAhPT0gbnVsbCkgJiZcbiAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5nZXRBbmNlc3Rvcih3YWxrTm9kZSwgaWdub3JlZCkgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRibFF1b3RlcyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgcGFzc2VkICYmIGkgPCBkYmxRdW90ZXMubGVuZ3RoOyArK2kpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gQ29tbW9uVXRpbC53b3JkQ291bnQoZGJsUXVvdGVzW2ldKSA8IG1pbldvcmRzO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChzbmdsUXVvdGVzICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBwYXNzZWQgJiYgaSA8IHNuZ2xRdW90ZXMubGVuZ3RoOyArK2kpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gQ29tbW9uVXRpbC53b3JkQ291bnQoc25nbFF1b3Rlc1tpXSkgPCBtaW5Xb3JkcztcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBhbnkgbGluZWZlZWQgaW5zaWRlIHRoZSBxdW90ZVxuICAgICAgICAgICAgICAgICAgICAvLyB2aW9sYXRlZHRleHQgPSB0eHRWYWwucmVwbGFjZShuZXcgUmVnRXhwKFwiXFxcXHI/XFxcXG58XFxcXHJcIixcImdcIiksXCJcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkYmxRdW90ZXMgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpb2xhdGVkdGV4dCA9IHNuZ2xRdW90ZXMuam9pbihcIiwgXCIpLnJlcGxhY2UobmV3IFJlZ0V4cChcIlxcXFxyP1xcXFxufFxcXFxyXCIsIFwiZ1wiKSwgXCJcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc25nbFF1b3RlcyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmlvbGF0ZWR0ZXh0ID0gZGJsUXVvdGVzLmpvaW4oXCIsIFwiKS5yZXBsYWNlKG5ldyBSZWdFeHAoXCJcXFxccj9cXFxcbnxcXFxcclwiLCBcImdcIiksIFwiXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmlvbGF0ZWR0ZXh0ID0gZGJsUXVvdGVzLmNvbmNhdChzbmdsUXVvdGVzKS5qb2luKFwiLCBcIikucmVwbGFjZShuZXcgUmVnRXhwKFwiXFxcXHI/XFxcXG58XFxcXHJcIiwgXCJnXCIpLCBcIlwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdhbGtOb2RlID0gd2Fsa05vZGUubmV4dFNpYmxpbmc7XG4gICAgICAgIH1cblxuICAgICAgICAvL2lmIHRoZSB2aW9sYXRlZHRleHQgaXMgbG9uZ2VyIHRoYW4gNjkgY2hhcnMsIG9ubHkga2VlcCB0aGUgZmlyc3QgMzIsIHRoZSBcIiAuLi4gXCIsIGFuZCB0aGUgbGFzdCAzMiBjaGFycyBcbiAgICAgICAgaWYgKCFwYXNzZWQgJiYgdmlvbGF0ZWR0ZXh0Lmxlbmd0aCAmJiB2aW9sYXRlZHRleHQubGVuZ3RoID4gNjkpIHtcbiAgICAgICAgICAgIHZpb2xhdGVkdGV4dCA9IHZpb2xhdGVkdGV4dC5zdWJzdHJpbmcoMCwgMzIpICsgXCIgLi4uIFwiICsgdmlvbGF0ZWR0ZXh0LnN1YnN0cmluZyh2aW9sYXRlZHRleHQubGVuZ3RoIC0gMzIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBhc3NlZCA/IFJ1bGVQYXNzKFwiUGFzc18wXCIpIDogUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIsIFt2aW9sYXRlZHRleHRdKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IHRleHRfc2Vuc29yeV9taXN1c2U6IFJ1bGUgPSB7XG4gICAgaWQ6IFwidGV4dF9zZW5zb3J5X21pc3VzZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmJvZHksIGRvbTpib2R5IGRvbToqXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfVGV4dF9TZW5zb3J5UmVmZXJlbmNlXCI6IHtcbiAgICAgICAgICAgIC8vIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcInBvdGVudGlhbF9wb3NpdGlvbiwgcG90ZW50aWFsX290aGVyXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgLy8gXCJwYXNzXCI6IFwidGV4dF9zZW5zb3J5X21pc3VzZS5odG1sXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9wb3NpdGlvblwiOiBcInRleHRfc2Vuc29yeV9taXN1c2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfb3RoZXJcIjogXCJ0ZXh0X3NlbnNvcnlfbWlzdXNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJ0ZXh0X3NlbnNvcnlfbWlzdXNlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIC8vIFwicGFzc1wiOiBcIkluc3RydWN0aW9ucyBhcmUgbWVhbmluZ2Z1bCB3aXRob3V0IHJlbHlpbmcgc29sZWx5IG9uIHNoYXBlLCBzaXplLCBvciBsb2NhdGlvbiB3b3Jkc1wiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfcG9zaXRpb25cIjogXCJDb25maXJtIHRoZSB3b3JkKHMpICd7MH0nIG9mIHRoZSB1c2VyIGluc3RydWN0aW9uIGlzIHVzZWQgdG8gaW5kaWNhdGUgYSBsb2dpY2FsIHJhdGhlciB0aGFuIHZpc3VhbCBwb3NpdGlvblwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfb3RoZXJcIjogXCJDb25maXJtIHRoZSB1c2VyIGluc3RydWN0aW9uIGlzIHN0aWxsIHVuZGVyc3RhbmRhYmxlIHdpdGhvdXQgdGhlIHdvcmQocykgJ3swfSdcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJJbnN0cnVjdGlvbnMgc2hvdWxkIGJlIG1lYW5pbmdmdWwgd2l0aG91dCByZWx5aW5nIHNvbGVseSBvbiBzaGFwZSwgc2l6ZSwgb3IgbG9jYXRpb24gd29yZHNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4zXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vIEV4dHJhY3QgdGhlIG5vZGVOYW1lIG9mIHRoZSBjb250ZXh0IG5vZGVcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIG9yIGRpc2FibGVkXG4gICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKHJ1bGVDb250ZXh0KSB8fCBDb21tb25VdGlsLmlzTm9kZURpc2FibGVkKHJ1bGVDb250ZXh0KSB8fCBWaXNVdGlsLmhpZGRlbkJ5RGVmYXVsdEVsZW1lbnRzLmluY2x1ZGVzKG5vZGVOYW1lKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgLy8gRG9uJ3QgdHJpZ2dlciBpZiB3ZSdyZSBub3QgaW4gdGhlIGJvZHkgb3IgaWYgd2UncmUgaW4gYSBzY3JpcHRcbiAgICAgICAgaWYgKENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFtcImJvZHlcIl0pID09PSBudWxsKSBcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgLy8gaWdub3JlIHNjcmlwdCwgbGluaywgbGFiZWwgYW5kIHRoZWlyIGNoaWxkIGVsZW1lbnRzXG4gICAgICAgIGlmIChDb21tb25VdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBbXCJzY3JpcHRcIiwgXCJhXCIsICdsYWJlbCddKSAhPT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgIFxuICAgICAgICAvLyBpZ25vcmUgdGV4dCBvbiBsYW5kbWFyayByb2xlcywgYnV0IG5vdCBvbiB0aGVpciBjaGlsZHJlbiAoZS5nLiwgc2VjdGlvbiwgbWFpbilcbiAgICAgICAgY29uc3Qgcm9sZSA9IEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZShydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChyb2xlKSB7XG4gICAgICAgICAgICBsZXQgbG1Sb2xlcyA9IEFyaWFVdGlsLmdldFJvbGVzV2l0aFR5cGVzKHJ1bGVDb250ZXh0LCBbXCJsYW5kbWFya1wiXSk7XG4gICAgICAgICAgICBpZiAobG1Sb2xlcyAmJiBsbVJvbGVzLmluY2x1ZGVzKHJvbGUpKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9ICAgIFxuICAgICAgICBcbiAgICAgICAgLy8gaWdub3JlIGFsbCB3aWRnZXRzIGFuZCBoZWFkaW5ncywgYW5kIHRoZWlyIGNoaWxkcmVuLCBhbmQgY2VydGFpbiBzdHJ1Y3R1cmUgcm9sZXNcbiAgICAgICAgbGV0IHJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXNXaXRoVHlwZXMocnVsZUNvbnRleHQsIFtcIndpZGdldFwiLCBcImhlYWRpbmdcIl0pO1xuICAgICAgICAvLyBhZGQgc29tZSBzdHJ1Y3R1cmUgcm9sZXNcbiAgICAgICAgQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KFtcImNhcHRpb25cIiwgXCJjZWxsXCIsIFwiY29kZVwiLCBcImNvbHVtbmhlYWRlclwiLCBcImRlZmluaXRpb25cIiwgXCJmaWd1cmVcIiwgXCJsaXN0XCIsIFwibGlzdGl0ZW1cIiwgXCJtYXRoXCIsIFwibWV0ZXJcIiwgXCJyb3dcIiwgXCJyb3dncm91cFwiLCBcInJvd2hlYWRlclwiLCBcInRlcm1cIl0sIHJvbGVzKTtcbiAgICAgICAgaWYgKEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGVzKHJ1bGVDb250ZXh0LCByb2xlcykgIT09IG51bGwpIFxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgbGV0IHZpb2xhdGVkUG9zaXRpb25UZXh0ID0gXCJcIjtcbiAgICAgICAgbGV0IHZpb2xhdGVkT3RoZXJUZXh0ID0gXCJcIjtcbiAgICAgICAgbGV0IHdhbGtOb2RlID0gcnVsZUNvbnRleHQuZmlyc3RDaGlsZCBhcyBOb2RlO1xuICAgICAgICBsZXQgdHh0VmFsID0gXCJcIjsgXG4gICAgICAgIHdoaWxlICh3YWxrTm9kZSkge1xuICAgICAgICAgICAgLy8gZm9yIGVhY2ggZWxlbWVudCBpdCBvbmx5IGNoZWNrcyB0aGF0IHNpbmdsZSBlbGVtZW50cyB0ZXh0IG5vZGVzIGFuZCBub3RoaW5nIGVsc2UuIFxuICAgICAgICAgICAgLy8gYWxsIGlubmVyIGVsZW1lbnRzIHdpbGwgYmUgY292ZXJlZCBvbiB0aGVpciBvd24uIFxuICAgICAgICAgICAgLy8gd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIChzcGFjZSwgbmV3bGluZSwgdGFiKSBiZXR3ZWVuIGVsZW1lbnRzIGFyZSBjb25zaWRlcmVkIGEgbm9kZSB0b28uXG4gICAgICAgICAgICBpZiAod2Fsa05vZGUubm9kZU5hbWUgPT09IFwiI3RleHRcIikge1xuICAgICAgICAgICAgICAgIGxldCB0eHQgPSB3YWxrTm9kZS5ub2RlVmFsdWUudHJpbSgpO1xuICAgICAgICAgICAgICAgIGlmICh0eHQubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICAgICAgdHh0VmFsICs9ICh0eHRWYWwubGVuZ3RoID4gMCA/IFwiLCBcIiArIHR4dCA6IHR4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3YWxrTm9kZSA9IHdhbGtOb2RlLm5leHRTaWJsaW5nO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZiAodHh0VmFsLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAvLyBmaXJzdCB0byByZW1vdmUgZWFjaCBleGVtcHQgd29yZCB3aXRoIGEgc2luZ2xlIHNwYWNlIGluIHRoZSB0ZXh0XG4gICAgICAgICAgICBsZXQgZXhlbXB0UmVnZXggPSBnZXRSZWdleChydWxlQ29udGV4dC5vd25lckRvY3VtZW50LCBcImV4ZW1wdFRleHRcIik7XG4gICAgICAgICAgICB0eHRWYWwgPSB0eHRWYWwucmVwbGFjZShleGVtcHRSZWdleCwgXCIgXCIpO1xuXG4gICAgICAgICAgICB2aW9sYXRlZFBvc2l0aW9uVGV4dCA9IGdldFZpb2xhdGVkVGV4dChydWxlQ29udGV4dC5vd25lckRvY3VtZW50LCBcInBvc2l0aW9uVGV4dFwiLCB0eHRWYWwpO1xuICAgICAgICAgICAgdmlvbGF0ZWRPdGhlclRleHQgPSBnZXRWaW9sYXRlZFRleHQocnVsZUNvbnRleHQub3duZXJEb2N1bWVudCwgXCJvdGhlclRleHRcIiwgdHh0VmFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXQgPSBbXTsgXG4gICAgICAgIGlmICh2aW9sYXRlZFBvc2l0aW9uVGV4dCkgcmV0LnB1c2goUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF9wb3NpdGlvblwiLCBbdmlvbGF0ZWRQb3NpdGlvblRleHRdKSk7XG4gICAgICAgIGlmICh2aW9sYXRlZE90aGVyVGV4dCkgcmV0LnB1c2goUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF9vdGhlclwiLCBbdmlvbGF0ZWRPdGhlclRleHRdKSk7XG4gICAgICAgIHJldHVybiByZXQubGVuZ3RoID09IDAgPyBudWxsIDogcmV0O1xuICAgIH1cbn1cblxuY29uc3QgdmFsaWRhdGVQYXJhbXMgPSB7XG4gICAgcG9zaXRpb25UZXh0OiB7XG4gICAgICAgIHZhbHVlOiBbXCJ0b3AtbGVmdFwiLCBcInRvcC1yaWdodFwiLCBcImJvdHRvbS1yaWdodFwiLCBcImJvdHRvbS1sZWZ0XCIsXG4gICAgICAgICAgICBcInRvcC10by1ib3R0b21cIiwgXCJsZWZ0LXRvLXJpZ2h0XCIsIFwiYm90dG9tLXRvLXRvcFwiLCBcInJpZ2h0LXRvLWxlZnRcIixcbiAgICAgICAgICAgIFwicmlnaHRcIiwgXCJsZWZ0XCIsIFwiYWJvdmVcIiwgXCJiZWxvd1wiLCBcInRvcFwiLCBcImJvdHRvbVwiLFxuICAgICAgICAgICAgXCJ1cHBlclwiLCBcImxvd2VyXCIsIFwiY29ybmVyXCIsIFwiYmVzaWRlXCJcbiAgICAgICAgXSxcbiAgICAgICAgdHlwZTogXCJbc3RyaW5nXVwiXG4gICAgfSxcbiAgICBvdGhlclRleHQ6IHtcbiAgICAgICAgdmFsdWU6IFtcInJvdW5kXCIsIFwic3F1YXJlXCIsIFwic2hhcGVcIiwgXCJyZWN0YW5nbGVcIiwgXCJ0cmlhbmdsZVwiLFxuICAgICAgICAgICAgXCJzaXplXCIsIFwibGFyZ2VcIiwgXCJzbWFsbFwiLCBcIm1lZGl1bVwiLCBcImJpZ1wiLCBcImh1Z2VcIiwgXCJ0aW55XCIsIFwiZXh0cmFcIixcbiAgICAgICAgICAgIFwibGFyZ2VyXCIsIFwic21hbGxlclwiLCBcImJpZ2dlclwiLCBcImxpdHRsZVwiLCBcImxhcmdlc3RcIiwgXCJzbWFsbGVzdFwiLCBcImJpZ2dlc3RcIlxuICAgICAgICBdLFxuICAgICAgICB0eXBlOiBcIltzdHJpbmddXCJcbiAgICB9LFxuICAgIGV4ZW1wdFRleHQ6IHtcbiAgICAgICAgdmFsdWU6IFtcInJpZ2h0LWNsaWNrXCIsIFwibGVmdC1jbGlja1wiLCBcInJpZ2h0LWNsaWNraW5nXCIsIFwicmlnaHQtY2xpY2tzXCIsIFxuICAgICAgICAgICBcImxlZnQtY2xpY2tpbmdcIiwgXCJsZWZ0LWNsaWNrc1wiLCBcInNxdWFyZSByb290XCIsIFwicmlnaHQgbm93XCIsIFwib2ZmIHRoZSB0b3BcIiAgIC8vYXBwZW5kIGFzIG5lZWRlZFxuICAgICAgICBdLFxuICAgICAgICB0eXBlOiBcIltzdHJpbmddXCJcbiAgICB9ICAgIFxufVxuXG5mdW5jdGlvbiBnZXRSZWdleChkb2MsIHR5cGUpIHtcbiAgICBpZiAoIXZhbGlkYXRlUGFyYW1zW3R5cGVdKSByZXR1cm4gXCJcIjtcbiAgICBsZXQgc2Vuc29yeVJlZ2V4ID0gQ2FjaGVVdGlsLmdldENhY2hlKGRvYywgdHlwZSArIFwiX3NlbnNvcnlfbWlzdXNlXCIsIG51bGwpO1xuICAgIGlmIChzZW5zb3J5UmVnZXggPT0gbnVsbCkge1xuICAgICAgICBsZXQgc2Vuc29yeVRleHQgPSB2YWxpZGF0ZVBhcmFtc1t0eXBlXS52YWx1ZTtcbiAgICAgICAgbGV0IHJlZ2V4U3RyID0gXCIoXFxzXFxzK3xcIiArIHNlbnNvcnlUZXh0WzBdO1xuICAgICAgICBmb3IgKGxldCBqID0gMTsgaiA8IHNlbnNvcnlUZXh0Lmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICBsZXQgd29yZHMgPSBzZW5zb3J5VGV4dFtqXS50cmltKCkuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgcmVnZXhTdHIgKz0gXCJ8XCIgKyB3b3Jkc1swXTtcbiAgICAgICAgICAgIGlmICh3b3Jkcy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgYyA9IDE7IGMgPCB3b3Jkcy5sZW5ndGg7ICsrYylcbiAgICAgICAgICAgICAgICAgICAgcmVnZXhTdHIgKz0gXCIgK1wiICsgd29yZHNbY107XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy9yZWdleFN0ciArPSBcIilcXFxcV1wiO1xuICAgICAgICByZWdleFN0ciArPSBcIilcIjtcbiAgICAgICAgc2Vuc29yeVJlZ2V4ID0gbmV3IFJlZ0V4cChyZWdleFN0ciwgXCJnaVwiKTtcbiAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGRvYywgdHlwZSArXCJfc2Vuc29yeV9taXN1c2VcIiwgc2Vuc29yeVJlZ2V4KTtcbiAgICB9XG4gICAgcmV0dXJuIHNlbnNvcnlSZWdleDtcbn1cblxuZnVuY3Rpb24gZ2V0VmlvbGF0ZWRUZXh0KGRvYywgdHlwZSwgdHh0VmFsKSB7XG4gICAgaWYgKCF0eHRWYWwpIHJldHVybiBcIlwiO1xuICAgIGxldCBzZW5zb3J5VGV4dEFyciA9IHZhbGlkYXRlUGFyYW1zW3R5cGVdLnZhbHVlXG4gICAgbGV0IGhhc2ggPSB7fSwgcmVzdWx0ID0gW107XG4gICAgXG4gICAgLy8gc3BsaXQgdGhlIHN0cmluZyBpbnRvIHdvcmRzXG4gICAgbGV0IGNvdW50cyA9IHR4dFZhbC5zcGxpdCgvXFxzKy8pLnJlZHVjZShmdW5jdGlvbiAobWFwLCB3b3JkKSB7XG4gICAgICAgIGxldCB3b3JkV29UcmFpbGluZ1B1bmMgPSB3b3JkLnJlcGxhY2UoL1suPyE6OygpJ1wiLGBcXF1dKyQvLCBcIlwiKTtcbiAgICAgICAgbGV0IGxjV29yZFdvUHVuYyA9IHdvcmQudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bLj8hOjsoKSdcIixgXFxdXS9nLCBcIlwiKTtcblxuICAgICAgICBmb3IgKGxldCBjb3VudGVyID0gMDsgY291bnRlciA8IHNlbnNvcnlUZXh0QXJyLmxlbmd0aDsgY291bnRlcisrKSB7XG4gICAgICAgICAgICBsZXQgYSA9IGxjV29yZFdvUHVuYy5pbmRleE9mKHNlbnNvcnlUZXh0QXJyW2NvdW50ZXJdKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgbGV0IHNlbnNvcnlXb3JkTGVuID0gc2Vuc29yeVRleHRBcnJbY291bnRlcl0ubGVuZ3RoO1xuICAgICAgICAgICAgbGV0IGNoYXJGb2xsb3dTZW5zb3J5VGV4dCA9IGxjV29yZFdvUHVuYy5jaGFyQXQoc2Vuc29yeVdvcmRMZW4gKyBhKTtcblxuICAgICAgICAgICAgLy8gSWYgdGhlIHdvcmQgZG9lcyBub3QgY29udGFpbnMgc3Vic3RyaW5nIG9mIHNlbnNvcnlUZXh0QXJyW2NvdW50ZXJdXG4gICAgICAgICAgICAvLyBwcm9jZWVkIHRvIHRoZSBuZXh0IGxvb3AgaXRlcmF0aW9uIGZvciBuZXh0IHNlbnNvcnlUZXh0LlxuICAgICAgICAgICAgaWYgKGEgPCAwKSB7IGNvbnRpbnVlOyB9XG5cbiAgICAgICAgICAgIC8vY2hlY2sgdGhlIGZvbGxvd2luZyBhbmQgcHJvY2VlZGluZyBwdW5jdHVhdGlvbnNcbiAgICAgICAgICAgIC8vbGV0IGlzUHVuY2ZvbGxvd2luZyA9ICgoY2hhckZvbGxvd1NlbnNvcnlUZXh0ID09ICdcXC0nKSB8fFxuICAgICAgICAgICAgbGV0IGlzUHVuY2ZvbGxvd2luZyA9IChcbiAgICAgICAgICAgICAgICAoY2hhckZvbGxvd1NlbnNvcnlUZXh0ID09ICdcXC4nKSB8fFxuICAgICAgICAgICAgICAgIChjaGFyRm9sbG93U2Vuc29yeVRleHQgPT0gJ1xcPycpIHx8IChjaGFyRm9sbG93U2Vuc29yeVRleHQgPT0gJ1xcIScpIHx8XG4gICAgICAgICAgICAgICAgKGNoYXJGb2xsb3dTZW5zb3J5VGV4dCA9PSAnXFw6JykgfHwgKGNoYXJGb2xsb3dTZW5zb3J5VGV4dCA9PSAnXFw7JykgfHxcbiAgICAgICAgICAgICAgICAoY2hhckZvbGxvd1NlbnNvcnlUZXh0ID09ICdcXCgnKSB8fCAoY2hhckZvbGxvd1NlbnNvcnlUZXh0ID09ICdcXCknKSB8fFxuICAgICAgICAgICAgICAgIChjaGFyRm9sbG93U2Vuc29yeVRleHQgPT0gJ1xcJycpIHx8IChjaGFyRm9sbG93U2Vuc29yeVRleHQgPT0gJ1xcXCInKSB8fFxuICAgICAgICAgICAgICAgIChjaGFyRm9sbG93U2Vuc29yeVRleHQgPT0gJ1xcLCcpIHx8IChjaGFyRm9sbG93U2Vuc29yeVRleHQgPT0gJy5cXGAnKSB8fFxuICAgICAgICAgICAgICAgIChjaGFyRm9sbG93U2Vuc29yeVRleHQgPT0gJ1xcXFwnKSB8fCAoY2hhckZvbGxvd1NlbnNvcnlUZXh0ID09ICdcXF0nKSk7XG5cbiAgICAgICAgICAgIGxldCBpc1B1bmNQcmVjZWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChhID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCBjaGFyUHJlY2VkZVNlbnNvcnlUZXh0ID0gbGNXb3JkV29QdW5jLmNoYXJBdChhIC0gMSk7XG4gICAgICAgICAgICAgICAgaXNQdW5jUHJlY2VkaW5nID0gKChjaGFyUHJlY2VkZVNlbnNvcnlUZXh0ID09ICdcXC0nKSB8fFxuICAgICAgICAgICAgICAgICAgICAoY2hhclByZWNlZGVTZW5zb3J5VGV4dCA9PSAnXFwuJykgfHxcbiAgICAgICAgICAgICAgICAgICAgKGNoYXJQcmVjZWRlU2Vuc29yeVRleHQgPT0gJ1xcPycpIHx8IChjaGFyUHJlY2VkZVNlbnNvcnlUZXh0ID09ICdcXCEnKSB8fFxuICAgICAgICAgICAgICAgICAgICAoY2hhclByZWNlZGVTZW5zb3J5VGV4dCA9PSAnXFw6JykgfHwgKGNoYXJQcmVjZWRlU2Vuc29yeVRleHQgPT0gJ1xcOycpIHx8XG4gICAgICAgICAgICAgICAgICAgIChjaGFyUHJlY2VkZVNlbnNvcnlUZXh0ID09ICdcXCgnKSB8fCAoY2hhclByZWNlZGVTZW5zb3J5VGV4dCA9PSAnXFwpJykgfHxcbiAgICAgICAgICAgICAgICAgICAgKGNoYXJQcmVjZWRlU2Vuc29yeVRleHQgPT0gJ1xcJycpIHx8IChjaGFyUHJlY2VkZVNlbnNvcnlUZXh0ID09ICdcXFwiJykgfHxcbiAgICAgICAgICAgICAgICAgICAgKGNoYXJQcmVjZWRlU2Vuc29yeVRleHQgPT0gJ1xcLCcpIHx8IChjaGFyUHJlY2VkZVNlbnNvcnlUZXh0ID09ICcuXFxgJykgfHxcbiAgICAgICAgICAgICAgICAgICAgKGNoYXJQcmVjZWRlU2Vuc29yeVRleHQgPT0gJ1xcXFwnKSB8fCAoY2hhclByZWNlZGVTZW5zb3J5VGV4dCA9PSAnXFxdJykpO1xuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICgoKGxjV29yZFdvUHVuYy5sZW5ndGggPT0gc2Vuc29yeVdvcmRMZW4pIHx8IChpc1B1bmNmb2xsb3dpbmcgPT0gdHJ1ZSkgfHwgKGlzUHVuY1ByZWNlZGluZyA9PSB0cnVlKSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWhhc2guaGFzT3duUHJvcGVydHkod29yZFdvVHJhaWxpbmdQdW5jKSkge1xuICAgICAgICAgICAgICAgICAgICBoYXNoW3dvcmRXb1RyYWlsaW5nUHVuY10gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh3b3JkV29UcmFpbGluZ1B1bmMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb3VudGVyID0gc2Vuc29yeVRleHRBcnIubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG1hcFt3b3JkV29UcmFpbGluZ1B1bmNdID0gKG1hcFt3b3JkV29UcmFpbGluZ1B1bmNdIHx8IDApICsgMTtcbiAgICAgICAgcmV0dXJuIG1hcDtcbiAgICB9LCBPYmplY3QuY3JlYXRlKG51bGwpKTtcbiAgICByZXR1cm4gcmVzdWx0LmpvaW4oXCIsIFwiKTtcbn0gIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsLCBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgQ1NTVXRpbCB9IGZyb20gXCIuLi91dGlsL0NTU1V0aWxcIjtcbmltcG9ydCB7IERPTU1hcHBlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NTWFwcGVyXCI7XG5cbi8vIE1vZHVsZS1sZXZlbCBjb25zdGFudHNcbmNvbnN0IFNUWUxFX1ZBTFVFX1JFR0VYID0gLygtP1tcXGQuXSspKFthLXolXSopLztcbmNvbnN0IE1JTl9XT1JEX1NQQUNJTkdfUkFUSU8gPSAwLjE2O1xuY29uc3QgTUlOX0xFVFRFUl9TUEFDSU5HX1JBVElPID0gMC4xMjtcbmNvbnN0IE1JTl9MSU5FX0hFSUdIVF9SQVRJTyA9IDEuNTtcbmNvbnN0IElNUE9SVEFOVF9TVUZGSVggPSBcIiFpbXBvcnRhbnRcIjtcbmNvbnN0IElNUE9SVEFOVF9TVUZGSVhfTEVOR1RIID0gSU1QT1JUQU5UX1NVRkZJWC5sZW5ndGggKyAxOyAvLyArMSBmb3IgdGhlIHNwYWNlIGJlZm9yZSAhaW1wb3J0YW50XG5cbi8qKlxuICogUmVzb2x2ZXMgaW5oZXJpdGVkIG9yIHVuc2V0IHN0eWxlIHZhbHVlcyBieSB0cmF2ZXJzaW5nIHVwIHRoZSBET00gdHJlZVxuICogQHBhcmFtIGVsZW1lbnQgLSBUaGUgZWxlbWVudCB0byByZXNvbHZlIHRoZSBzdHlsZSBmb3JcbiAqIEBwYXJhbSBwcm9wZXJ0eSAtIFRoZSBDU1MgcHJvcGVydHkgbmFtZVxuICogQHBhcmFtIGN1cnJlbnRWYWx1ZSAtIFRoZSBjdXJyZW50IHN0eWxlIHZhbHVlXG4gKiBAcmV0dXJucyBUaGUgcmVzb2x2ZWQgc3R5bGUgdmFsdWVcbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZUluaGVyaXRlZFN0eWxlKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBwcm9wZXJ0eTogc3RyaW5nLCBjdXJyZW50VmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKGN1cnJlbnRWYWx1ZS5zdGFydHNXaXRoKCdpbmhlcml0JykgfHwgY3VycmVudFZhbHVlLnN0YXJ0c1dpdGgoJ3Vuc2V0JykpIHtcbiAgICAgICAgY29uc3QgYW5jZXN0b3IgPSBDU1NVdGlsLmdldEFuY2VzdG9yV2l0aFN0eWxlcyhcbiAgICAgICAgICAgIGVsZW1lbnQucGFyZW50RWxlbWVudCxcbiAgICAgICAgICAgIHtbcHJvcGVydHldOiBbXCIqXCJdfSxcbiAgICAgICAgICAgIFsnaW5oZXJpdCcsICd1bnNldCddXG4gICAgICAgICk7XG4gICAgICAgIGlmIChhbmNlc3RvciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIENTU1V0aWwuZ2V0RGVmaW5lZFN0eWxlcyhhbmNlc3RvciwgW3Byb3BlcnR5XSlbcHJvcGVydHldO1xuICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRWYWx1ZS5zdGFydHNXaXRoKCd1bnNldCcpKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJpbml0aWFsXCI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGN1cnJlbnRWYWx1ZTtcbn1cblxuLyoqXG4gKiBSZW1vdmVzIHRoZSAhaW1wb3J0YW50IHN1ZmZpeCBmcm9tIGEgc3R5bGUgdmFsdWVcbiAqIEBwYXJhbSBzdHlsZVZhbHVlIC0gVGhlIHN0eWxlIHZhbHVlIHBvdGVudGlhbGx5IGNvbnRhaW5pbmcgIWltcG9ydGFudFxuICogQHJldHVybnMgVGhlIHN0eWxlIHZhbHVlIHdpdGhvdXQgIWltcG9ydGFudFxuICovXG5mdW5jdGlvbiByZW1vdmVJbXBvcnRhbnRTdWZmaXgoc3R5bGVWYWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3R5bGVWYWx1ZS5zdWJzdHJpbmcoMCwgc3R5bGVWYWx1ZS5sZW5ndGggLSBJTVBPUlRBTlRfU1VGRklYX0xFTkdUSCk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgc3BhY2luZyBwcm9wZXJ0eSB2aW9sYXRlcyBhY2Nlc3NpYmlsaXR5IHJlcXVpcmVtZW50c1xuICogQHBhcmFtIGVsZW1lbnQgLSBUaGUgSFRNTCBlbGVtZW50IGJlaW5nIGNoZWNrZWRcbiAqIEBwYXJhbSBwcm9wZXJ0eSAtIFRoZSBDU1MgcHJvcGVydHkgbmFtZSAod29yZC1zcGFjaW5nLCBsZXR0ZXItc3BhY2luZywgbGluZS1oZWlnaHQpXG4gKiBAcGFyYW0gc3R5bGVWYWx1ZSAtIFRoZSBjdXJyZW50IHN0eWxlIHZhbHVlXG4gKiBAcGFyYW0gZm9udFNpemUgLSBUaGUgY29tcHV0ZWQgZm9udCBzaXplIGluIHBpeGVsc1xuICogQHBhcmFtIG1pblJhdGlvIC0gVGhlIG1pbmltdW0gcmF0aW8gdGhyZXNob2xkXG4gKiBAcGFyYW0gYWxsb3dVbml0bGVzcyAtIFdoZXRoZXIgdW5pdGxlc3MgdmFsdWVzIGFyZSBhbGxvd2VkIChmb3IgbGluZS1oZWlnaHQpXG4gKiBAcmV0dXJucyBSdWxlUmVzdWx0IGluZGljYXRpbmcgcGFzcyBvciBmYWlsXG4gKi9cbmZ1bmN0aW9uIGNoZWNrU3BhY2luZ1Byb3BlcnR5KFxuICAgIGVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICAgIHByb3BlcnR5OiBzdHJpbmcsXG4gICAgc3R5bGVWYWx1ZTogc3RyaW5nLFxuICAgIGZvbnRTaXplOiBudW1iZXIsXG4gICAgbWluUmF0aW86IG51bWJlcixcbiAgICBhbGxvd1VuaXRsZXNzOiBib29sZWFuID0gZmFsc2Vcbik6IGJvb2xlYW4ge1xuICAgIC8vIENoZWNrIGlmICFpbXBvcnRhbnQgaXMgdXNlZFxuICAgIGlmIChlbGVtZW50LnN0eWxlLmdldFByb3BlcnR5UHJpb3JpdHkocHJvcGVydHkpICE9PSAnaW1wb3J0YW50Jykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgIWltcG9ydGFudCBzdWZmaXhcbiAgICBjb25zdCBjbGVhblZhbHVlID0gcmVtb3ZlSW1wb3J0YW50U3VmZml4KHN0eWxlVmFsdWUpO1xuXG4gICAgLy8gQ2hlY2sgZm9yIGluaXRpYWwgb3Igbm9ybWFsIHZhbHVlcyAoY29tcHV0ZWQgc3BhY2UgaXMgMClcbiAgICBpZiAoY2xlYW5WYWx1ZSA9PT0gJ2luaXRpYWwnIHx8IGNsZWFuVmFsdWUgPT09ICdub3JtYWwnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBQYXJzZSB0aGUgbnVtZXJpYyB2YWx1ZVxuICAgIGNvbnN0IG51bWVyaWNWYWx1ZSA9IHBhcnNlRmxvYXQoY2xlYW5WYWx1ZSk7XG4gICAgaWYgKGlzTmFOKG51bWVyaWNWYWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gTWF0Y2ggdmFsdWUgYW5kIHVuaXRcbiAgICBjb25zdCBwYXJzZWRWYWx1ZSA9IGNsZWFuVmFsdWUudHJpbSgpLm1hdGNoKFNUWUxFX1ZBTFVFX1JFR0VYKTtcbiAgICBpZiAoIXBhcnNlZFZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IFssIHZhbHVlLCB1bml0XSA9IHBhcnNlZFZhbHVlO1xuXG4gICAgLy8gSGFuZGxlIHVuaXRsZXNzIHZhbHVlcyAob25seSBmb3IgbGluZS1oZWlnaHQpXG4gICAgaWYgKHVuaXQgPT09ICcnKSB7XG4gICAgICAgIGlmIChhbGxvd1VuaXRsZXNzKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VGbG9hdCh2YWx1ZSkgPCBtaW5SYXRpbyA/IGZhbHNlIDogdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBGb3Igb3RoZXIgcHJvcGVydGllcywgemVybyB2YWx1ZSB3aXRob3V0IHVuaXQgaXMgaWdub3JlZFxuICAgICAgICBpZiAocGFyc2VGbG9hdCh2YWx1ZSkgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gU2tpcCBpZiBubyB1bml0IGFuZCBub24temVybyAoZXJyb3IgY2FzZSwgaW5hcHBsaWNhYmxlKVxuICAgIGlmICh1bml0ID09PSAnJyAmJiBwYXJzZUZsb2F0KHZhbHVlKSAhPT0gMCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBDb252ZXJ0IHRvIHBpeGVscyBhbmQgY2hlY2sgcmF0aW9cbiAgICBjb25zdCBwaXhlbHMgPSBDU1NVdGlsLmNvbnZlcnRWYWx1ZTJQaXhlbHModW5pdCwgdmFsdWUsIGVsZW1lbnQpO1xuICAgIGlmIChwaXhlbHMgIT09IG51bGwgJiYgcGl4ZWxzIC8gZm9udFNpemUgPCBtaW5SYXRpbykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBjb25zdCB0ZXh0X3NwYWNpbmdfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwidGV4dF9zcGFjaW5nX3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJ0ZXh0X3NwYWNpbmdfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInRleHRfc3BhY2luZ192YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfbGV0dGVyX3NwYWNpbmdfc3R5bGVcIjogXCJ0ZXh0X3NwYWNpbmdfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX3dvcmRfc3BhY2luZ19zdHlsZVwiOiBcInRleHRfc3BhY2luZ192YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfbGluZV9oZWlnaHRfc3R5bGVcIjogXCJ0ZXh0X3NwYWNpbmdfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiQ1NTICFpbXBvcnRhbnQgaXMgbm90IHVzZWQgaW4gaW5saW5lIHN0eWxlIHRvIGNvbnRyb2wgbGV0dGVyIG9yIHdvcmQgc3BhY2luZyBvciBsaW5lIGhlaWdodFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkNTUyAhaW1wb3J0YW50IHNob3VsZCBub3QgYmUgdXNlZCBpbiBpbmxpbmUgc3R5bGUgdG8gY29udHJvbCBsZXR0ZXIgb3Igd29yZCBzcGFjaW5nIG9yIGxpbmUgaGVpZ2h0XCIsXG4gICAgICAgICAgICBcImZhaWxfbGV0dGVyX3NwYWNpbmdfc3R5bGVcIjogXCJDU1MgIWltcG9ydGFudCBzaG91bGQgbm90IGJlIHVzZWQgaW4gaW5saW5lIOKAmGxldHRlci1zcGFjaW5n4oCZIHN0eWxlXCIsXG4gICAgICAgICAgICBcImZhaWxfd29yZF9zcGFjaW5nX3N0eWxlXCI6IFwiQ1NTICFpbXBvcnRhbnQgc2hvdWxkIG5vdCBiZSB1c2VkIGluIGlubGluZSDigJh3b3JkLXNwYWNpbmfigJkgc3R5bGVcIixcbiAgICAgICAgICAgIFwiZmFpbF9saW5lX2hlaWdodF9zdHlsZVwiOiBcIkNTUyAhaW1wb3J0YW50IHNob3VsZCBub3QgYmUgdXNlZCBpbiBpbmxpbmUg4oCYbGluZS1oZWlnaHTigJkgc3R5bGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICAgXCJudW1cIjogW1wiMS40LjEyXCJdLFxuICAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OlsnOWU0NWVjJywgJzI0YWZjMicsICc3OGZkMzInXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGlzIGVsZW1lbnQgaGFzIGNoaWxkcmVuIHdpdGggYWN0dWFsIHRleHRcbiAgICAgICAgbGV0IGNoaWxkU3RyID0gXCJcIjtcbiAgICAgICAgY29uc3QgY2hpbGROb2RlcyA9IHJ1bGVDb250ZXh0LmNoaWxkTm9kZXM7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGROb2Rlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgaWYgKGNoaWxkTm9kZXNbaV0ubm9kZVR5cGUgPT09IDMpIHsgLy8gVGV4dCBub2RlXG4gICAgICAgICAgICAgICAgY2hpbGRTdHIgKz0gY2hpbGROb2Rlc1tpXS5ub2RlVmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoaWxkU3RyLnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIG9yIGRpc2FibGVkXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkgfHwgQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgb2ZmIHNjcmVlblxuICAgICAgICBjb25zdCBtYXBwZXI6IERPTU1hcHBlciA9IG5ldyBET01NYXBwZXIoKTtcbiAgICAgICAgY29uc3QgYm91bmRzID0gbWFwcGVyLmdldFVuYWRqdXN0ZWRCb3VuZHMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoIWJvdW5kcyB8fCBib3VuZHNbJ3RvcCddIDwgMCB8fCBib3VuZHNbJ2xlZnQnXSA8IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2tpcCBub24tSFRNTCBlbGVtZW50cyAoZS5nLiwgU1ZHKVxuICAgICAgICBpZiAoQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgXCJzdmdcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRm9udCBzaXplIGFsd2F5cyByZXNvbHZlZCB0byAncHgnXG4gICAgICAgIGNvbnN0IGNvbXB1dGVkU3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgY29uc3QgZm9udFNpemUgPSBwYXJzZUZsb2F0KGNvbXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnZm9udC1zaXplJykpO1xuXG4gICAgICAgIC8vIEVhcmx5IGV4aXQgb3B0aW1pemF0aW9uOiBDaGVjayBpZiBjb21wdXRlZCBzdHlsZXMgYWxyZWFkeSBwYXNzXG4gICAgICAgIC8vIElmIGFsbCB0aHJlZSBwcm9wZXJ0aWVzIGhhdmUgcGFzc2luZyB2YWx1ZXMsIHdlIGNhbiBza2lwIHRoZSBleHBlbnNpdmUgZ2V0RGVmaW5lZFN0eWxlcyBjYWxsXG4gICAgICAgIGNvbnN0IGNvbXB1dGVkV29yZFNwYWNpbmcgPSBjb21wdXRlZFN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ3dvcmQtc3BhY2luZycpO1xuICAgICAgICBjb25zdCBjb21wdXRlZExldHRlclNwYWNpbmcgPSBjb21wdXRlZFN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ2xldHRlci1zcGFjaW5nJyk7XG4gICAgICAgIGNvbnN0IGNvbXB1dGVkTGluZUhlaWdodCA9IGNvbXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnbGluZS1oZWlnaHQnKTtcblxuICAgICAgICAvLyBDaGVjayBpZiBjb21wdXRlZCB2YWx1ZXMgcGFzcyB0aGUgcmVxdWlyZW1lbnRzXG4gICAgICAgIGxldCB3b3JkU3BhY2luZ1Bhc3NlcyA9IHRydWU7XG4gICAgICAgIGxldCBsZXR0ZXJTcGFjaW5nUGFzc2VzID0gdHJ1ZTtcbiAgICAgICAgbGV0IGxpbmVIZWlnaHRQYXNzZXMgPSB0cnVlO1xuXG4gICAgICAgIC8vIENoZWNrIHdvcmQtc3BhY2luZyAoaWdub3JlIDBweCB3aGljaCByZXByZXNlbnRzIGRlZmF1bHQvbm9ybWFsKVxuICAgICAgICBpZiAoY29tcHV0ZWRXb3JkU3BhY2luZykge1xuICAgICAgICAgICAgY29uc3Qgd29yZFZhbHVlID0gcGFyc2VGbG9hdChjb21wdXRlZFdvcmRTcGFjaW5nKTtcbiAgICAgICAgICAgIGlmICghaXNOYU4od29yZFZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHdvcmRQaXhlbHMgPSBDU1NVdGlsLmNvbnZlcnRWYWx1ZTJQaXhlbHMoJ3B4Jywgd29yZFZhbHVlLnRvU3RyaW5nKCksIHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgICAgICBpZiAod29yZFBpeGVscyAhPT0gbnVsbCAmJiB3b3JkUGl4ZWxzIC8gZm9udFNpemUgPCBNSU5fV09SRF9TUEFDSU5HX1JBVElPKSB7XG4gICAgICAgICAgICAgICAgICAgIHdvcmRTcGFjaW5nUGFzc2VzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgbGV0dGVyLXNwYWNpbmcgKGlnbm9yZSAwcHggd2hpY2ggcmVwcmVzZW50cyBkZWZhdWx0L25vcm1hbClcbiAgICAgICAgaWYgKGNvbXB1dGVkTGV0dGVyU3BhY2luZykge1xuICAgICAgICAgICAgY29uc3QgbGV0dGVyVmFsdWUgPSBwYXJzZUZsb2F0KGNvbXB1dGVkTGV0dGVyU3BhY2luZyk7XG4gICAgICAgICAgICBpZiAoIWlzTmFOKGxldHRlclZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxldHRlclBpeGVscyA9IENTU1V0aWwuY29udmVydFZhbHVlMlBpeGVscygncHgnLCBsZXR0ZXJWYWx1ZS50b1N0cmluZygpLCBydWxlQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgaWYgKGxldHRlclBpeGVscyAhPT0gbnVsbCAmJiBsZXR0ZXJQaXhlbHMgLyBmb250U2l6ZSA8IE1JTl9MRVRURVJfU1BBQ0lOR19SQVRJTykge1xuICAgICAgICAgICAgICAgICAgICBsZXR0ZXJTcGFjaW5nUGFzc2VzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgbGluZS1oZWlnaHRcbiAgICAgICAgaWYgKGNvbXB1dGVkTGluZUhlaWdodCkge1xuICAgICAgICAgICAgY29uc3QgbGluZVZhbHVlID0gcGFyc2VGbG9hdChjb21wdXRlZExpbmVIZWlnaHQpO1xuICAgICAgICAgICAgaWYgKCFpc05hTihsaW5lVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgLy8gTGluZSBoZWlnaHQgY2FuIGJlIHVuaXRsZXNzIG9yIGluIHBpeGVsc1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gY29tcHV0ZWRMaW5lSGVpZ2h0Lm1hdGNoKFNUWUxFX1ZBTFVFX1JFR0VYKTtcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgWywgdmFsdWUsIHVuaXRdID0gbWF0Y2g7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1bml0ID09PSAnJyB8fCB1bml0ID09PSAncHgnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByYXRpbyA9IHVuaXQgPT09ICcnID8gcGFyc2VGbG9hdCh2YWx1ZSkgOiBwYXJzZUZsb2F0KHZhbHVlKSAvIGZvbnRTaXplO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhdGlvIDwgTUlOX0xJTkVfSEVJR0hUX1JBVElPKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZUhlaWdodFBhc3NlcyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgYWxsIGNvbXB1dGVkIHZhbHVlcyBwYXNzLCB3ZSBjYW4gc2tpcCB0aGUgZXhwZW5zaXZlIGdldERlZmluZWRTdHlsZXMgY2hlY2tcbiAgICAgICAgaWYgKHdvcmRTcGFjaW5nUGFzc2VzICYmIGxldHRlclNwYWNpbmdQYXNzZXMgJiYgbGluZUhlaWdodFBhc3Nlcykge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgZGVmaW5lZCBzdHlsZXMgdG8gY2hlY2sgZm9yICFpbXBvcnRhbnQgZGVjbGFyYXRpb25zXG4gICAgICAgIGNvbnN0IHN0eWxlcyA9IENTU1V0aWwuZ2V0RGVmaW5lZFN0eWxlcyhydWxlQ29udGV4dCwgW1wid29yZC1zcGFjaW5nXCIsIFwibGV0dGVyLXNwYWNpbmdcIiwgXCJsaW5lLWhlaWdodFwiXSk7XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhzdHlsZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHRzOiBSdWxlUmVzdWx0W10gPSBbXTtcblxuICAgICAgICAvLyBDaGVjayB3b3JkLXNwYWNpbmdcbiAgICAgICAgbGV0IHdvcmRTdHlsZSA9IHN0eWxlc1snd29yZC1zcGFjaW5nJ107XG4gICAgICAgIGlmICh3b3JkU3R5bGUpIHtcbiAgICAgICAgICAgIHdvcmRTdHlsZSA9IHJlc29sdmVJbmhlcml0ZWRTdHlsZShydWxlQ29udGV4dCwgJ3dvcmQtc3BhY2luZycsIHdvcmRTdHlsZSk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBjaGVja1NwYWNpbmdQcm9wZXJ0eShcbiAgICAgICAgICAgICAgICBydWxlQ29udGV4dCxcbiAgICAgICAgICAgICAgICAnd29yZC1zcGFjaW5nJyxcbiAgICAgICAgICAgICAgICB3b3JkU3R5bGUsXG4gICAgICAgICAgICAgICAgZm9udFNpemUsXG4gICAgICAgICAgICAgICAgTUlOX1dPUkRfU1BBQ0lOR19SQVRJT1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaChyZXN1bHQgPyBSdWxlUGFzcyhcInBhc3NcIikgOiBSdWxlRmFpbCgnZmFpbF93b3JkX3NwYWNpbmdfc3R5bGUnKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBsZXR0ZXItc3BhY2luZ1xuICAgICAgICBsZXQgbGV0dGVyU3R5bGUgPSBzdHlsZXNbJ2xldHRlci1zcGFjaW5nJ107XG4gICAgICAgIGlmIChsZXR0ZXJTdHlsZSkge1xuICAgICAgICAgICAgbGV0dGVyU3R5bGUgPSByZXNvbHZlSW5oZXJpdGVkU3R5bGUocnVsZUNvbnRleHQsICdsZXR0ZXItc3BhY2luZycsIGxldHRlclN0eWxlKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNoZWNrU3BhY2luZ1Byb3BlcnR5KFxuICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0LFxuICAgICAgICAgICAgICAgICdsZXR0ZXItc3BhY2luZycsXG4gICAgICAgICAgICAgICAgbGV0dGVyU3R5bGUsXG4gICAgICAgICAgICAgICAgZm9udFNpemUsXG4gICAgICAgICAgICAgICAgTUlOX0xFVFRFUl9TUEFDSU5HX1JBVElPXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHJlc3VsdCA/IFJ1bGVQYXNzKFwicGFzc1wiKSA6IFJ1bGVGYWlsKCdmYWlsX2xldHRlcl9zcGFjaW5nX3N0eWxlJykpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgbGluZS1oZWlnaHQgKG9ubHkgaWYgbm8gc2Nyb2xsYWJsZSBhbmNlc3RvcilcbiAgICAgICAgbGV0IGxpbmVTdHlsZSA9IHN0eWxlc1snbGluZS1oZWlnaHQnXTtcbiAgICAgICAgY29uc3Qgb3ZlcmZsb3dTdHlsZXMgPSB7XG4gICAgICAgICAgICBcIm92ZXJmbG93XCI6IFsnYXV0bycsICdzY3JvbGwnXSxcbiAgICAgICAgICAgIFwib3ZlcmZsb3cteFwiOiBbJ2F1dG8nLCAnc2Nyb2xsJ10sXG4gICAgICAgICAgICBcIm92ZXJmbG93LXlcIjogWydhdXRvJywgJ3Njcm9sbCddXG4gICAgICAgIH07XG4gICAgICAgIGlmIChsaW5lU3R5bGUgJiYgQ1NTVXRpbC5nZXRBbmNlc3RvcldpdGhTdHlsZXMocnVsZUNvbnRleHQsIG92ZXJmbG93U3R5bGVzKSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgbGluZVN0eWxlID0gcmVzb2x2ZUluaGVyaXRlZFN0eWxlKHJ1bGVDb250ZXh0LCAnbGluZS1oZWlnaHQnLCBsaW5lU3R5bGUpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gY2hlY2tTcGFjaW5nUHJvcGVydHkoXG4gICAgICAgICAgICAgICAgcnVsZUNvbnRleHQsXG4gICAgICAgICAgICAgICAgJ2xpbmUtaGVpZ2h0JyxcbiAgICAgICAgICAgICAgICBsaW5lU3R5bGUsXG4gICAgICAgICAgICAgICAgZm9udFNpemUsXG4gICAgICAgICAgICAgICAgTUlOX0xJTkVfSEVJR0hUX1JBVElPLFxuICAgICAgICAgICAgICAgIHRydWUgLy8gQWxsb3cgdW5pdGxlc3MgdmFsdWVzIGZvciBsaW5lLWhlaWdodFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaChyZXN1bHQgPyBSdWxlUGFzcyhcInBhc3NcIikgOiBSdWxlRmFpbCgnZmFpbF9saW5lX2hlaWdodF9zdHlsZScpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHRzLmxlbmd0aCA+IDAgPyByZXN1bHRzIDogbnVsbDtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IHRleHRfd2hpdGVzcGFjZV92YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJ0ZXh0X3doaXRlc3BhY2VfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcInRleHRfd2hpdGVzcGFjZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF90ZXh0XCI6IFwidGV4dF93aGl0ZXNwYWNlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJ0ZXh0X3doaXRlc3BhY2VfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX3RleHRcIjogXCJTcGFjZSBjaGFyYWN0ZXJzIHNob3VsZCBub3QgYmUgdXNlZCB0byBjcmVhdGUgc3BhY2UgYmV0d2VlbiB0aGUgbGV0dGVycyBvZiBhIHdvcmRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJTcGFjZSBjaGFyYWN0ZXJzIHNob3VsZCBub3QgYmUgdXNlZCB0byBjb250cm9sIHNwYWNpbmcgd2l0aGluIGEgd29yZFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuXG4gICAgICAgIC8vIERvbid0IHRyaWdnZXIgaWYgd2UncmUgbm90IGluIHRoZSBib2R5IG9yIGlmIHdlJ3JlIGluIGEgc2NyaXB0XG4gICAgICAgIGxldCBjaGVja0FuY2VzdG9yID0gQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgW1wiYm9keVwiLCBcInNjcmlwdFwiLCBcImNvZGVcIl0pO1xuICAgICAgICBpZiAoY2hlY2tBbmNlc3RvciA9PSBudWxsIHx8IGNoZWNrQW5jZXN0b3Iubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPSBcImJvZHlcIilcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgXG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuICAgICAgICBsZXQgd2Fsa05vZGUgPSBydWxlQ29udGV4dC5maXJzdENoaWxkIGFzIE5vZGU7XG4gICAgICAgIHdoaWxlIChwYXNzZWQgJiYgd2Fsa05vZGUpIHtcbiAgICAgICAgICAgIC8vIENvbXBseSB0byB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyB3aWxsIGJlIGRvbmUgYnkgZGVmYXVsdCBhcyB0aGlzIHJ1bGUgdHJpZ2dlcnMgb24gZWFjaCBlbGVtZW50XG4gICAgICAgICAgICAvLyBhbmQgZm9yIGVhY2ggZWxlbWVudCBpdCBvbmx5IGNoZWNrcyB0aGF0IHNpbmdsZSBlbGVtZW50cyB0ZXh0IG5vZGVzIGFuZCBub3RoaW5nIGVsc2UuIFNvIGFsbCBpbm5lciBlbGVtZW50cyB3aWxsIGJlXG4gICAgICAgICAgICAvLyBjb3ZlcmVkIG9uIHRoZWlyIG93bi4gQ3VycmVudGx5IGZvciB0aGlzIHJ1bGUgYnkgZGVmYXVsdCBDaGVjayBIaWRkZW4gQ29udGVudCB3aWxsIHdvcmssIGFzIHdlIGFyZSBkb2luZ1xuICAgICAgICAgICAgLy8gYSBub2RlIHdhbGsgb25seSBvbiBzaWJsaW5ncyBzbyBpdCB3b3VsZCBub3QgZ2V0IHRleHQgbm9kZXMgZnJvbSBvdGhlciBzaWJsaW5ncyBhdCBhbGwuXG4gICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSBpbiB0aGUgZnV0dXJlIHNvbWV0aGluZyBjaG5nZXMsIGp1c3QgbmVlZCB0byBhZGQgJiYgIVJQVFV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbih3YWxrTm9kZSkgdG8gdGhlIGJlbG93XG4gICAgICAgICAgICAvLyBpZi5cbiAgICAgICAgICAgIGlmICh3YWxrTm9kZS5ub2RlTmFtZSA9PSBcIiN0ZXh0XCIpIHtcbiAgICAgICAgICAgICAgICBsZXQgdHh0VmFsID0gd2Fsa05vZGUubm9kZVZhbHVlO1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9ICEoLyhefFxccylbYS16QS1aXSBbYS16QS1aXSBbYS16QS1aXSgkfFxccykvLnRlc3QodHh0VmFsKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3YWxrTm9kZSA9IHdhbGtOb2RlLm5leHRTaWJsaW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfdGV4dFwiKTtcblxuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgQVJJQU1hcHBlciB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFNYXBwZXJcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3Qgd2lkZ2V0X3RhYmJhYmxlX2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJ3aWRnZXRfdGFiYmFibGVfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmJ1dHRvbixhcmlhOmxpbmssYXJpYTpzcGluYnV0dG9uLGFyaWE6dGFibGlzdCxhcmlhOmNvbWJvYm94LGFyaWE6bGlzdGJveCxhcmlhOm1lbnUsYXJpYTpyYWRpb2dyb3VwLGFyaWE6dHJlZSxhcmlhOm1lbnViYXIsIGFyaWE6Z3JpZCwgYXJpYTp0cmVlZ3JpZCwgYXJpYTpjaGVja2JveCxhcmlhOnNsaWRlcixhcmlhOnNwaW5idXR0b24sYXJpYTp0ZXh0Ym94LGFyaWE6c2Nyb2xsYmFyLGFyaWE6c2xpZGVyLGFyaWE6c3BpbmJ1dHRvblwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiSUJNQV9Gb2N1c19UYWJiYWJsZVwiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcImZhaWxfbm9fdGFiYmFibGVcIjogXCJmYWlsX25vX3RhYmJhYmxlXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwid2lkZ2V0X3RhYmJhYmxlX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfbm9fdGFiYmFibGVcIjogXCJ3aWRnZXRfdGFiYmFibGVfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJ3aWRnZXRfdGFiYmFibGVfZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcImZhaWxfbm9fdGFiYmFibGVcIjogXCJDb21wb25lbnQgd2l0aCBcXFwiezB9XFxcIiByb2xlIGRvZXMgbm90IGhhdmUgYSB0YWJiYWJsZSBlbGVtZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQ29tcG9uZW50IG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgdGFiYmFibGUgZWxlbWVudFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgICAgLy9za2lwIHRoZSBjaGVjayBpZiB0aGUgZWxlbWVudCBpcyBoaWRkZW4gb3IgZGlzYWJsZWRcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSB8fCBDb21tb25VdGlsLmlzTm9kZURpc2FibGVkKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgc2hvdWxkIGJlIGEgcHJlc2VudGF0aW9uYWwgY2hpbGQgb2YgYW4gZWxlbWVudFxuICAgICAgICBpZiAoQXJpYVV0aWwuc2hvdWxkQmVQcmVzZW50YXRpb25hbENoaWxkKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgXG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIC8vaWdub3JlIGRhdGFsaXN0IGVsZW1lbnQgY2hlY2sgc2luY2UgaXQgd2lsbCBiZSBwYXJ0IG9mIGEgaW5wdXQgZWxlbWVudCBvciBoaWRkZW4gYnkgZGVmYXVsdFxuICAgICAgICBpZiAobm9kZU5hbWUgPT09ICdkYXRhbGlzdCcpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIFxuICAgICAgICAvLyBDb21wb3NpdGUgdXNlciBpbnRlcmZhY2Ugd2lkZ2V0IHJvbGVzLiBUaGV5IGFjdCBhcyBjb250YWluZXJzIHRoYXQgbWFuYWdlIG90aGVyLCBjb250YWluZWQgd2lkZ2V0cy5cbiAgICAgICAgbGV0IHJvbGVDb250YWluZXJzID0gW1wiY29tYm9ib3hcIiwgXCJncmlkXCIsIFwibGlzdGJveFwiLCBcIm1lbnVcIiwgXCJtZW51YmFyXCIsIFwicmFkaW9ncm91cFwiLCBcInRhYmxpc3RcIiwgXCJ0cmVlXCIsIFwidHJlZWdyaWRcIl07XG4gICAgICAgIGZvciAoY29uc3Qgcm9sZSBvZiByb2xlQ29udGFpbmVycykge1xuICAgICAgICAgICAgaWYgKEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUocnVsZUNvbnRleHQsIHJvbGUsIHRydWUpICE9IG51bGwpIFxuICAgICAgICAgICAgICAgIC8vIGl0J3MgYSBkZXNjZW5kYW50IG9mIGEgY29tcG9zaXRlIHdpZGdldCBhbHJlYWR5IGV4YW1pbmVkXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0gICAgXG4gICAgICAgIGxldCByb2xlID0gQVJJQU1hcHBlci5ub2RlVG9Sb2xlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgbGV0IGNvdW50ID0gMDtcbiAgICAgICAgaWYgKENvbW1vblV0aWwuaXNUYWJiYWJsZShydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgICsrY291bnQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgbm9kZSBoYXMgY2hpbGRyZW4sIGxvb2sgZm9yIHRhYiBzdG9wcyBpbiB0aGUgY2hpbGRyZW5cbiAgICAgICAgLy8gc2tpcCB0aGUgY291bnQgaWYgdGhlIGVsZW1lbnQgcmVxdWlyZXMgcHJlc2VudGF0aW9uYWwgY2hpbGRyZW4gb25seVxuICAgICAgICBpZiAoY291bnQgPCAxICYmICFBcmlhVXRpbC5jb250YWluc1ByZXNlbnRhdGlvbmFsQ2hpbGRyZW5Pbmx5KHJ1bGVDb250ZXh0KSAmJiBydWxlQ29udGV4dC5maXJzdENoaWxkKSB7XG4gICAgICAgICAgICBsZXQgbncgPSBuZXcgRE9NV2Fsa2VyKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgIHdoaWxlIChjb3VudCA8IDEgJiYgbncubmV4dE5vZGUoKSAmJiBudy5ub2RlICE9IHJ1bGVDb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgaWYgKG53Lm5vZGUubm9kZVR5cGUgPT0gMSAmJiAhbncuYkVuZFRhZyAmJiBDb21tb25VdGlsLmlzVGFiYmFibGUobncubm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgKytjb3VudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHBhc3NlZCA9IGNvdW50ID49IDE7XG4gICAgICAgIHJldHVybiBwYXNzZWQgPyBSdWxlUGFzcyhcInBhc3NcIikgOiBSdWxlUG90ZW50aWFsKFwiZmFpbF9ub190YWJiYWJsZVwiLCBbcm9sZV0pO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IEFSSUFNYXBwZXIgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBTWFwcGVyXCI7XG5cbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IHdpZGdldF90YWJiYWJsZV9zaW5nbGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwid2lkZ2V0X3RhYmJhYmxlX3NpbmdsZVwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpidXR0b24sYXJpYTpsaW5rLGFyaWE6bWVudWl0ZW0sYXJpYTpzcGluYnV0dG9uLGFyaWE6dGFibGlzdCxhcmlhOmNvbWJvYm94LGFyaWE6bGlzdGJveCxhcmlhOm1lbnUsYXJpYTpyYWRpb2dyb3VwLGFyaWE6dHJlZSxhcmlhOmNoZWNrYm94LGFyaWE6b3B0aW9uLGFyaWE6cmFkaW8sYXJpYTpzbGlkZXIsYXJpYTpzcGluYnV0dG9uLGFyaWE6dGV4dGJveCxhcmlhOmNvbHVtbmhlYWRlcixhcmlhOnJvd2hlYWRlcixhcmlhOnNsaWRlcixhcmlhOnRhYlwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiSUJNQV9Gb2N1c19NdWx0aVRhYlwiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9tdWx0aXBsZV90YWJiYWJsZVwiOiBcInBvdGVudGlhbF9tdWx0aXBsZV90YWJiYWJsZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJ3aWRnZXRfdGFiYmFibGVfc2luZ2xlLmh0bWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX211bHRpcGxlX3RhYmJhYmxlXCI6IFwid2lkZ2V0X3RhYmJhYmxlX3NpbmdsZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwid2lkZ2V0X3RhYmJhYmxlX3NpbmdsZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJDb21wb25lbnRzIHdpdGggYSB3aWRnZXQgcm9sZSBzaG91bGQgaGF2ZSBubyBtb3JlIHRoYW4gb25lIHRhYmJhYmxlIGVsZW1lbnRcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX211bHRpcGxlX3RhYmJhYmxlXCI6IFwiQ29tcG9uZW50IHdpdGggXFxcInswfVxcXCIgcm9sZSBoYXMgbW9yZSB0aGFuIG9uZSB0YWJiYWJsZSBlbGVtZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQ29tcG9uZW50cyB3aXRoIGEgd2lkZ2V0IHJvbGUgbXVzdCBoYXZlIG5vIG1vcmUgdGhhbiBvbmUgdGFiYmFibGUgZWxlbWVudFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi4xLjFcIiwgXCIyLjQuM1wiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIG9yIGRpc2FibGVkXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkgfHwgQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIFxuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IHNob3VsZCBiZSBhIHByZXNlbnRhdGlvbmFsIGNoaWxkIG9mIGFuIGVsZW1lbnRcbiAgICAgICAgaWYgKEFyaWFVdGlsLnNob3VsZEJlUHJlc2VudGF0aW9uYWxDaGlsZChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIFxuICAgICAgICBsZXQgcm9sZSA9IEFSSUFNYXBwZXIubm9kZVRvUm9sZShydWxlQ29udGV4dCk7XG4gICAgICAgIGxldCBjb3VudCA9IDA7XG4gICAgICAgIGlmIChDb21tb25VdGlsLmlzVGFiYmFibGUocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICArK2NvdW50O1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIG5vZGUgaGFzIGNoaWxkcmVuLCBsb29rIGZvciB0YWIgc3RvcHMgaW4gdGhlIGNoaWxkcmVuXG4gICAgICAgIC8vc2tpcCB0aGUgY291bnQgaWYgdGhlIGVsZW1lbnQgcmVxdWlyZXMgcHJlc2VudGF0aW9uYWwgY2hpbGRyZW4gb25seVxuICAgICAgICBsZXQgbmFtZSA9IFtdO1xuICAgICAgICBpZiAoY291bnQgPCAyICYmICFBcmlhVXRpbC5jb250YWluc1ByZXNlbnRhdGlvbmFsQ2hpbGRyZW5Pbmx5KHJ1bGVDb250ZXh0KSAmJiBydWxlQ29udGV4dC5maXJzdENoaWxkKSB7XG4gICAgICAgICAgICBsZXQgbncgPSBuZXcgRE9NV2Fsa2VyKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgIHdoaWxlIChjb3VudCA8IDIgJiYgbncubmV4dE5vZGUoKSAmJiBudy5ub2RlICE9IHJ1bGVDb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgaWYgKG53Lm5vZGUubm9kZVR5cGUgPT0gMSAmJiAhbncuYkVuZFRhZyAmJiBDb21tb25VdGlsLmlzVGFiYmFibGUobncubm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUmFkaW8gaW5wdXRzIHdpdGggdGhlIHNhbWUgbmFtZSBuYXRpdmVseSBhcmUgb25seSBvbmUgdGFiIHN0b3BcbiAgICAgICAgICAgICAgICAgICAgLyoqaWYgKG53Lm5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2lucHV0JyAmJiAobncubm9kZSBhcyBFbGVtZW50KS5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpID09PSAncmFkaW8nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY3VyTmFtZSA9IChudy5ub2RlIGFzIEVsZW1lbnQpLmdldEF0dHJpYnV0ZShcIm5hbWVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZS5pbmNsdWRlcyhjdXJOYW1lKSkgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS5wdXNoKGN1ck5hbWUpO1xuICAgICAgICAgICAgICAgICAgICB9Ki9cbiAgICAgICAgICAgICAgICAgICAgKytjb3VudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHBhc3NlZCA9IGNvdW50IDwgMjtcbiAgICAgICAgaWYgKCFwYXNzZWQpXG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUocnVsZUNvbnRleHQsIFwid2lkZ2V0X3RhYmJhYmxlX3NpbmdsZVwiLCBcInBvdGVudGlhbF9tdWx0aXBsZV90YWJiYWJsZVwiKTtcbiAgICAgICAgcmV0dXJuIHBhc3NlZCA/IFJ1bGVQYXNzKFwicGFzc1wiKSA6IFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfbXVsdGlwbGVfdGFiYmFibGVcIiwgW3JvbGVdKTtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgIENvcHlyaWdodDo6IDIwMjAtIElCTSwgSW5jXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbi8vIFRoaXMgZmlsZSBjb21lcyBmcm9tIGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9hY3QtcnVsZXMvYWN0LXRvb2xzL21haW4vc3JjL2RhdGEvc2MtdXJscy5qc29uXG5pbXBvcnQgKiBhcyBTQ1VSTHMgZnJvbSBcIi4vc2MtdXJscy5qc29uXCJcbmltcG9ydCB7IEd1aWRlbGluZSwgZUd1aWRlbGluZUNhdGVnb3J5LCBlR3VpZGVsaW5lVHlwZSB9IGZyb20gXCIuL2FwaS9JR3VpZGVsaW5lXCI7XG5jb25zdCBTQ3MgPSBbXTtcbmZvciAoY29uc3Qga2V5IGluIFNDVVJMcykge1xuICAgIFNDcy5wdXNoKFNDVVJMc1trZXldKTtcbn1cblxuY29uc3Qgc3VtbWFyaWVzID0ge1xuICAgIFwiMS4xLjFcIjogXCJBbGwgbm9uLXRleHQgY29udGVudCB0aGF0IGlzIHByZXNlbnRlZCB0byB0aGUgdXNlciBoYXMgYSB0ZXh0IGFsdGVybmF0aXZlIHRoYXQgc2VydmVzIHRoZSBlcXVpdmFsZW50IHB1cnBvc2UuXCIsXG4gICAgXCIxLjIuMVwiOiBcIkZvciBwcmVyZWNvcmRlZCBhdWRpby1vbmx5IG9yIHZpZGVvLW9ubHkgbWVkaWEsIGFuIGFsdGVybmF0aXZlIHByb3ZpZGVzIGVxdWl2YWxlbnQgaW5mb3JtYXRpb24uXCIsXG4gICAgXCIxLjIuMlwiOiBcIkNhcHRpb25zIGFyZSBwcm92aWRlZCBmb3IgYWxsIHByZXJlY29yZGVkIGF1ZGlvIGNvbnRlbnQgaW4gc3luY2hyb25pemVkIG1lZGlhLlwiLFxuICAgIFwiMS4yLjNcIjogXCJBbiBhbHRlcm5hdGl2ZSBmb3IgdGltZS1iYXNlZCBtZWRpYSBvciBhdWRpbyBkZXNjcmlwdGlvbiBvZiB0aGUgcHJlcmVjb3JkZWQgdmlkZW8gY29udGVudCBpcyBwcm92aWRlZCBmb3Igc3luY2hyb25pemVkIG1lZGlhLlwiLFxuICAgIFwiMS4yLjRcIjogXCJDYXB0aW9ucyBhcmUgcHJvdmlkZWQgZm9yIGFsbCBsaXZlIGF1ZGlvIGNvbnRlbnQgaW4gc3luY2hyb25pemVkIG1lZGlhLlwiLFxuICAgIFwiMS4yLjVcIjogXCJBdWRpbyBkZXNjcmlwdGlvbiBpcyBwcm92aWRlZCBmb3IgYWxsIHByZXJlY29yZGVkIHZpZGVvIGNvbnRlbnQgaW4gc3luY2hyb25pemVkIG1lZGlhLlwiLFxuICAgIFwiMS4zLjFcIjogXCJJbmZvcm1hdGlvbiwgc3RydWN0dXJlLCBhbmQgcmVsYXRpb25zaGlwcyBjb252ZXllZCB0aHJvdWdoIHByZXNlbnRhdGlvbiBjYW4gYmUgcHJvZ3JhbW1hdGljYWxseSBkZXRlcm1pbmVkIG9yIGFyZSBhdmFpbGFibGUgaW4gdGV4dC5cIixcbiAgICBcIjEuMy4yXCI6IFwiV2hlbiB0aGUgc2VxdWVuY2UgaW4gd2hpY2ggY29udGVudCBpcyBwcmVzZW50ZWQgYWZmZWN0cyBpdHMgbWVhbmluZywgYSBjb3JyZWN0IHJlYWRpbmcgc2VxdWVuY2UgY2FuIGJlIHByb2dyYW1tYXRpY2FsbHkgZGV0ZXJtaW5lZC5cIixcbiAgICBcIjEuMy4zXCI6IFwiSW5zdHJ1Y3Rpb25zIHByb3ZpZGVkIGZvciB1bmRlcnN0YW5kaW5nIGFuZCBvcGVyYXRpbmcgY29udGVudCBkbyBub3QgcmVseSBzb2xlbHkgb24gc2Vuc29yeSBjaGFyYWN0ZXJpc3RpY3Mgb2YgY29tcG9uZW50cyBzdWNoIGFzIHNoYXBlLCBzaXplLCB2aXN1YWwgbG9jYXRpb24sIG9yaWVudGF0aW9uLCBvciBzb3VuZC5cIixcbiAgICBcIjEuMy40XCI6IFwiQ29udGVudCBkb2VzIG5vdCByZXN0cmljdCBpdHMgdmlldyBhbmQgb3BlcmF0aW9uIHRvIGEgc2luZ2xlIGRpc3BsYXkgb3JpZW50YXRpb24sIHN1Y2ggYXMgcG9ydHJhaXQgb3IgbGFuZHNjYXBlLlwiLFxuICAgIFwiMS4zLjVcIjogXCJUaGUgcHVycG9zZSBvZiBlYWNoIGlucHV0IGZpZWxkIHRoYXQgY29sbGVjdHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHVzZXIgY2FuIGJlIHByb2dyYW1tYXRpY2FsbHkgZGV0ZXJtaW5lZCB3aGVuIHRoZSBmaWVsZCBzZXJ2ZXMgYSBjb21tb24gcHVycG9zZS5cIixcbiAgICBcIjEuNC4xXCI6IFwiQ29sb3IgaXMgbm90IHVzZWQgYXMgdGhlIG9ubHkgdmlzdWFsIG1lYW5zIG9mIGNvbnZleWluZyBpbmZvcm1hdGlvbiwgaW5kaWNhdGluZyBhbiBhY3Rpb24sIHByb21wdGluZyBhIHJlc3BvbnNlLCBvciBkaXN0aW5ndWlzaGluZyBhIHZpc3VhbCBlbGVtZW50LlwiLFxuICAgIFwiMS40LjJcIjogXCJJZiBhbnkgYXVkaW8gcGxheXMgYXV0b21hdGljYWxseSBmb3IgbW9yZSB0aGFuIDMgc2Vjb25kcywgZWl0aGVyIGEgbWVjaGFuaXNtIGlzIGF2YWlsYWJsZSB0byBwYXVzZSBvciBzdG9wIHRoZSBhdWRpbywgb3IgYSBtZWNoYW5pc20gaXMgYXZhaWxhYmxlIHRvIGNvbnRyb2wgYXVkaW8gdm9sdW1lIGluZGVwZW5kZW50bHkgZnJvbSB0aGUgb3ZlcmFsbCBzeXN0ZW0gdm9sdW1lIGxldmVsLlwiLFxuICAgIFwiMS40LjNcIjogXCJUaGUgdmlzdWFsIHByZXNlbnRhdGlvbiBvZiB0ZXh0IGFuZCBpbWFnZXMgb2YgdGV4dCBoYXMgYSBjb250cmFzdCByYXRpbyBvZiBhdCBsZWFzdCA0LjU6MSwgd2l0aCBhIDM6MSByYXRpbyBmb3IgbGFyZ2Utc2NhbGUgdGV4dC5cIixcbiAgICBcIjEuNC40XCI6IFwiVGV4dCBjYW4gYmUgcmVzaXplZCB3aXRob3V0IGFzc2lzdGl2ZSB0ZWNobm9sb2d5IHVwIHRvIDIwMCBwZXJjZW50IHdpdGhvdXQgbG9zcyBvZiBjb250ZW50IG9yIGZ1bmN0aW9uYWxpdHkuXCIsXG4gICAgXCIxLjQuNVwiOiBcIklmIHRoZSB0ZWNobm9sb2dpZXMgYmVpbmcgdXNlZCBjYW4gYWNoaWV2ZSB0aGUgdmlzdWFsIHByZXNlbnRhdGlvbiwgdGV4dCBzaG91bGQgbm90IGJlIHVzZWQgdG8gY29udmV5IGluZm9ybWF0aW9uIHJhdGhlciB0aGFuIGltYWdlcyBvZiB0ZXh0LlwiLFxuICAgIFwiMS40LjEwXCI6IFwiQ29udGVudCBjYW4gcmVmbG93IHdpdGhvdXQgbG9zcyBvZiBpbmZvcm1hdGlvbiBvciBmdW5jdGlvbmFsaXR5LCBhbmQgd2l0aG91dCByZXF1aXJpbmcgc2Nyb2xsaW5nIGluIHR3byBkaW1lbnNpb25zLlwiLFxuICAgIFwiMS40LjExXCI6IFwiVGhlIHBhcnRzIG9mIGdyYXBoaWNhbCBvYmplY3RzIHJlcXVpcmVkIHRvIHVuZGVyc3RhbmQgdGhlIGNvbnRlbnQsIGFuZCB0aGUgdmlzdWFsIGluZm9ybWF0aW9uIHJlcXVpcmVkIHRvIGlkZW50aWZ5IFVJIGNvbXBvbmVudHMgYW5kIHN0YXRlcywgaGF2ZSBhIGNvbnRyYXN0IHJhdGlvIG9mIGF0IGxlYXN0IDM6MSBhZ2FpbnN0IGFkamFjZW50IGNvbG9ycy5cIixcbiAgICBcIjEuNC4xMlwiOiBcIk5vIGxvc3Mgb2YgY29udGVudCBvciBmdW5jdGlvbmFsaXR5IG9jY3VycyB3aGVuIHVzZXJzIGNoYW5nZSBsZXR0ZXIsIHdvcmQgYW5kIHBhcmFncmFwaCBzcGFjaW5nLCBhcyB3ZWxsIGFzIGxpbmUgaGVpZ2h0LlwiLFxuICAgIFwiMS40LjEzXCI6IFwiV2hlcmUgaG92ZXIgb3IgZm9jdXMgYWN0aW9ucyBjYXVzZSBhZGRpdGlvbmFsIGNvbnRlbnQgdG8gYmVjb21lIHZpc2libGUgYW5kIGhpZGRlbiwgdGhlIGFkZGl0aW9uYWwgY29udGVudCBpcyBkaXNtaXNzYWJsZSwgaG92ZXJhYmxlIGFuZCBwZXJzaXN0ZW50LlwiLFxuICAgIFwiMi4xLjFcIjogXCJBbGwgZnVuY3Rpb25hbGl0eSBvZiB0aGUgY29udGVudCBpcyBvcGVyYWJsZSB0aHJvdWdoIGEga2V5Ym9hcmQgaW50ZXJmYWNlIHdpdGhvdXQgcmVxdWlyaW5nIHNwZWNpZmljIHRpbWluZ3MgZm9yIGluZGl2aWR1YWwga2V5c3Ryb2tlcy5cIixcbiAgICBcIjIuMS4yXCI6IFwiSWYga2V5Ym9hcmQgZm9jdXMgY2FuIGJlIG1vdmVkIHRvIGEgY29tcG9uZW50IHVzaW5nIGEga2V5Ym9hcmQgaW50ZXJmYWNlLCB0aGVuIGZvY3VzIGNhbiBiZSBtb3ZlZCBhd2F5IGZyb20gdGhhdCBjb21wb25lbnQgdXNpbmcgb25seSBhIGtleWJvYXJkIGludGVyZmFjZSwgYW5kLCBpZiBpdCByZXF1aXJlcyBtb3JlIHRoYW4gdW5tb2RpZmllZCBhcnJvdyBvciB0YWIga2V5cyBvciBvdGhlciBzdGFuZGFyZCBleGl0IG1ldGhvZHMsIHRoZSB1c2VyIGlzIGFkdmlzZWQgb2YgdGhlIG1ldGhvZCBmb3IgbW92aW5nIGZvY3VzIGF3YXkuXCIsXG4gICAgXCIyLjEuNFwiOiBcIklmIGEga2V5Ym9hcmQgc2hvcnRjdXQgaXMgaW1wbGVtZW50ZWQgdXNpbmcgb25seSBsZXR0ZXIsIHB1bmN0dWF0aW9uLCBudW1iZXIgb3Igc3ltYm9sIGNoYXJhY3RlcnMsIHRoZW4gdGhlIHNob3J0Y3V0IGNhbiBiZSB0dXJuZWQgb2ZmLCByZW1hcHBlZCBvciBhY3RpdmF0ZWQgb25seSBvbiBmb2N1cy5cIixcbiAgICBcIjIuMi4xXCI6IFwiRm9yIGVhY2ggdGltZSBsaW1pdCB0aGF0IGlzIHNldCBieSB0aGUgY29udGVudCwgdGhlIHVzZXIgY2FuIHR1cm4gb2ZmLCBhZGp1c3QsIG9yIGV4dGVuZCB0aGUgbGltaXQuXCIsXG4gICAgXCIyLjIuMlwiOiBcIkZvciBtb3ZpbmcsIGJsaW5raW5nLCBzY3JvbGxpbmcsIG9yIGF1dG8tdXBkYXRpbmcgaW5mb3JtYXRpb24sIHRoZSB1c2VyIGNhbiBwYXVzZSwgc3RvcCwgaGlkZSBvciBhZGp1c3QgdGhlIGluZm9ybWF0aW9uLlwiLFxuICAgIFwiMi4zLjFcIjogXCJDb250ZW50IGRvZXMgbm90IGNvbnRhaW4gYW55dGhpbmcgdGhhdCBmbGFzaGVzIG1vcmUgdGhhbiB0aHJlZSB0aW1lcyBpbiBhbnkgb25lIHNlY29uZCBwZXJpb2QsIG9yIHRoZSBmbGFzaCBpcyBiZWxvdyB0aGUgZ2VuZXJhbCBmbGFzaCBhbmQgcmVkIGZsYXNoIHRocmVzaG9sZHMuXCIsXG4gICAgXCIyLjQuMVwiOiBcIkEgbWVjaGFuaXNtIGlzIGF2YWlsYWJsZSB0byBieXBhc3MgYmxvY2tzIG9mIGNvbnRlbnQgdGhhdCBhcmUgcmVwZWF0ZWQgb24gbXVsdGlwbGUgV2ViIHBhZ2VzLlwiLFxuICAgIFwiMi40LjJcIjogXCJXZWIgcGFnZXMsIG5vbi13ZWIgZG9jdW1lbnRzLCBhbmQgc29mdHdhcmUgaGF2ZSB0aXRsZXMgdGhhdCBkZXNjcmliZSB0b3BpYyBvciBwdXJwb3NlLlwiLFxuICAgIFwiMi40LjNcIjogXCJJZiBjb250ZW50IGNhbiBiZSBuYXZpZ2F0ZWQgc2VxdWVudGlhbGx5IGFuZCB0aGUgbmF2aWdhdGlvbiBzZXF1ZW5jZXMgYWZmZWN0IG1lYW5pbmcgb3Igb3BlcmF0aW9uLCBmb2N1c2FibGUgY29tcG9uZW50cyByZWNlaXZlIGZvY3VzIGluIGFuIG9yZGVyIHRoYXQgcHJlc2VydmVzIG1lYW5pbmcgYW5kIG9wZXJhYmlsaXR5LlwiLFxuICAgIFwiMi40LjRcIjogXCJUaGUgcHVycG9zZSBvZiBlYWNoIGxpbmsgY2FuIGJlIGRldGVybWluZWQgZnJvbSB0aGUgbGluayB0ZXh0IGFsb25lIG9yIGZyb20gdGhlIGxpbmsgdGV4dCB0b2dldGhlciB3aXRoIGl0cyBwcm9ncmFtbWF0aWNhbGx5IGRldGVybWluZWQgbGluayBjb250ZW50LlwiLFxuICAgIFwiMi40LjVcIjogXCJNb3JlIHRoYW4gb25lIHdheSBpcyBhdmFpbGFibGUgdG8gbG9jYXRlIGEgV2ViIHBhZ2Ugd2l0aGluIGEgc2V0IG9mIFdlYiBwYWdlcywgZXhjZXB0IHdoZXJlIHRoZSBXZWIgUGFnZSBpcyB0aGUgcmVzdWx0IG9mLCBvciBhIHN0ZXAgaW4sIGEgcHJvY2Vzcy5cIixcbiAgICBcIjIuNC42XCI6IFwiSGVhZGluZ3MgYW5kIGxhYmVscyBkZXNjcmliZSB0b3BpYyBvciBwdXJwb3NlLlwiLFxuICAgIFwiMi40LjdcIjogXCJBbnkga2V5Ym9hcmQgb3BlcmFibGUgdXNlciBpbnRlcmZhY2UgaGFzIGEgbW9kZSBvZiBvcGVyYXRpb24gd2hlcmUgdGhlIGtleWJvYXJkIGZvY3VzIGluZGljYXRvciBpcyB2aXNpYmxlLlwiLFxuICAgIFwiMi40LjExXCI6IFwiV2hlbiBhbiBlbGVtZW50IHJlY2VpdmVzIGZvY3VzLCBpdCBpcyBub3QgZW50aXJlbHkgY292ZXJlZCBieSBvdGhlciBjb250ZW50LlwiLFxuICAgIFwiMi41LjFcIjogXCJBbGwgZnVuY3Rpb25hbGl0eSB0aGF0IHVzZXMgbXVsdGlwb2ludCBvciBwYXRoLWJhc2VkIGdlc3R1cmVzIGZvciBvcGVyYXRpb24gY2FuIGJlIG9wZXJhdGVkIHdpdGggYSBzaW5nbGUgcG9pbnRlciB3aXRob3V0IGEgcGF0aC1iYXNlZCBnZXN0dXJlLlwiLFxuICAgIFwiMi41LjJcIjogXCJGb3IgZnVuY3Rpb25hbGl0eSB0aGF0IGNhbiBiZSBvcGVyYXRlZCB1c2luZyBhIHNpbmdsZSBwb2ludGVyLCBjb21wbGV0aW9uIG9mIHRoZSBmdW5jdGlvbiBpcyBvbiB0aGUgdXAtZXZlbnQgd2l0aCBhbiBhYmlsaXR5IHRvIGFib3J0LCB1bmRvIG9yIHJldmVyc2UgdGhlIG91dGNvbWUuXCIsXG4gICAgXCIyLjUuM1wiOiBcIkZvciB1c2VyIGludGVyZmFjZSBjb21wb25lbnRzIHdpdGggbGFiZWxzIHRoYXQgaW5jbHVkZSB0ZXh0IG9yIGltYWdlcyBvZiB0ZXh0LCB0aGUgYWNjZXNzaWJsZSBuYW1lIGNvbnRhaW5zIHRoZSB0ZXh0IHRoYXQgaXMgcHJlc2VudGVkIHZpc3VhbGx5LlwiLFxuICAgIFwiMi41LjRcIjogXCJGdW5jdGlvbmFsaXR5IHRoYXQgY2FuIGJlIG9wZXJhdGVkIGJ5IG1vdGlvbiBjYW4gYWxzbyBiZSBvcGVyYXRlZCBieSB1c2VyIGludGVyZmFjZSBjb21wb25lbnRzLCBhbmQgdGhlIG1vdGlvbiB0cmlnZ2VyIGNhbiBiZSBkaXNhYmxlZC5cIixcbiAgICBcIjIuNS44XCI6IFwiVGhlIHNpemUgb2YgdGhlIHRhcmdldCBmb3IgcG9pbnRlciBpbnB1dHMgaXMgYXQgbGVhc3QgMjQgYnkgMjQgQ1NTIHBpeGVscy5cIixcbiAgICBcIjIuNS43XCI6IFwiQWxsIGZ1bmN0aW9uYWxpdHkgdGhhdCB1c2VzIGEgZHJhZ2dpbmcgbW92ZW1lbnQgZm9yIG9wZXJhdGlvbiBjYW4gYmUgYWNoaWV2ZWQgYnkgYSBzaW5nbGUgcG9pbnRlciB3aXRob3V0IGRyYWdnaW5nLlwiLFxuICAgIFwiMy4xLjFcIjogXCJUaGUgZGVmYXVsdCBodW1hbiBsYW5ndWFnZSBvZiBXZWIgcGFnZXMsIG5vbi1XZWIgZG9jdW1lbnRzLCBvciBzb2Z0d2FyZSBjYW4gYmUgcHJvZ3JhbW1hdGljYWxseSBkZXRlcm1pbmVkLlwiLFxuICAgIFwiMy4xLjJcIjogXCJUaGUgaHVtYW4gbGFuZ3VhZ2Ugb2YgZWFjaCBwYXNzYWdlIG9yIHBocmFzZSBpbiB0aGUgY29udGVudCBjYW4gYmUgcHJvZ3JhbW1hdGljYWxseSBkZXRlcm1pbmVkLlwiLFxuICAgIFwiMy4yLjFcIjogXCJXaGVuIGFueSBjb21wb25lbnQgcmVjZWl2ZXMgZm9jdXMsIGl0IGRvZXMgbm90IGluaXRpYXRlIGEgY2hhbmdlIG9mIGNvbnRleHQuXCIsXG4gICAgXCIzLjIuMlwiOiBcIkNoYW5naW5nIHRoZSBzZXR0aW5nIG9mIGFueSB1c2VyIGludGVyZmFjZSBjb21wb25lbnQgZG9lcyBub3QgYXV0b21hdGljYWxseSBjYXVzZSBhIGNoYW5nZSBvZiBjb250ZXh0IHVubGVzcyB0aGUgdXNlciBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBiZWhhdmlvciBiZWZvcmUgdXNpbmcgdGhlIGNvbXBvbmVudC5cIixcbiAgICBcIjMuMi4zXCI6IFwiTmF2aWdhdGlvbmFsIG1lY2hhbmlzbXMgdGhhdCBhcmUgcmVwZWF0ZWQgb24gbXVsdGlwbGUgV2ViIHBhZ2VzIHdpdGhpbiBhIHNldCBvZiBXZWIgcGFnZXMgb2NjdXIgaW4gdGhlIHNhbWUgcmVsYXRpdmUgb3JkZXIgZWFjaCB0aW1lIHRoZXkgYXJlIHJlcGVhdGVkLCB1bmxlc3MgYSBjaGFuZ2UgaXMgaW5pdGlhdGVkIGJ5IHRoZSB1c2VyLlwiLFxuICAgIFwiMy4yLjRcIjogXCJDb21wb25lbnRzIHRoYXQgaGF2ZSB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IHdpdGhpbiBhIHNldCBvZiBXZWIgcGFnZXMgYXJlIGlkZW50aWZpZWQgY29uc2lzdGVudGx5LlwiLFxuICAgIFwiMy4yLjZcIjogXCJNYWtlIGl0IGVhc2llciB0byBmaW5kIGhlbHAgYW5kIHN1cHBvcnQuIElmIGEgV2ViIHBhZ2UgY29udGFpbnMgaGVscCBtZWNoYW5pc21zIHRoZXkgb2NjdXIgaW4gdGhlIHNhbWUgb3JkZXIgcmVsYXRpdmUgdG8gb3RoZXIgcGFnZSBjb250ZW50LCB1bmxlc3MgYSBjaGFuZ2UgaXMgaW5pdGlhdGVkIGJ5IHRoZSB1c2VyLlwiLFxuICAgIFwiMy4zLjFcIjogXCJJZiBhbiBpbnB1dCBlcnJvciBpcyBhdXRvbWF0aWNhbGx5IGRldGVjdGVkLCB0aGUgaXRlbSB0aGF0IGlzIGluIGVycm9yIGlzIGlkZW50aWZpZWQgYW5kIHRoZSBlcnJvciBpcyBkZXNjcmliZWQgdG8gdGhlIHVzZXIgaW4gdGV4dC5cIixcbiAgICBcIjMuMy4yXCI6IFwiTGFiZWxzIG9yIGluc3RydWN0aW9ucyBhcmUgcHJvdmlkZWQgd2hlbiBjb250ZW50IHJlcXVpcmVzIHVzZXIgaW5wdXQuXCIsXG4gICAgXCIzLjMuM1wiOiBcIklmIGFuIGlucHV0IGVycm9yIGlzIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgYW5kIHN1Z2dlc3Rpb25zIGZvciBjb3JyZWN0aW9uIGFyZSBrbm93biwgdGhlbiB0aGUgc3VnZ2VzdGlvbnMgYXJlIHByb3ZpZGVkIHRvIHRoZSB1c2VyLCB1bmxlc3MgaXQgd291bGQgamVvcGFyZGl6ZSB0aGUgc2VjdXJpdHkgb3IgcHVycG9zZSBvZiB0aGUgY29udGVudC5cIixcbiAgICBcIjMuMy40XCI6IFwiRm9yIGNvbnRlbnQgdGhhdCBjYXVzZSBsZWdhbCBjb21taXRtZW50cyBvciBmaW5hbmNpYWwgdHJhbnNhY3Rpb25zIGZvciB0aGUgdXNlciB0byBvY2N1ciwgdGhhdCBtb2RpZnkgb3IgZGVsZXRlIHVzZXItY29udHJvbGxhYmxlIGRhdGEgaW4gZGF0YSBzdG9yYWdlIHN5c3RlbXMsIG9yIHRoYXQgc3VibWl0IHVzZXIgdGVzdCByZXNwb25zZXMsIHRoZSB1c2VyIGNhbiByZXZlcnNlLCBjb3JyZWN0LCBvciBjb25maXJtIHRoZSBhY3Rpb24uXCIsXG4gICAgXCIzLjMuN1wiOiBcIk1ha2UgaXQgZWFzaWVyIGZvciB1c2VycyB0byBjb21wbGV0ZSBtdWx0aS1zdGVwIHByb2Nlc3Nlcy4gRG9uJ3QgYXNrIGZvciB0aGUgc2FtZSBpbmZvcm1hdGlvbiB0d2ljZSBpbiB0aGUgc2FtZSBzZXNzaW9uLlwiLFxuICAgIFwiMy4zLjhcIjogXCJNYWtlIGxvZ2lucyBwb3NzaWJsZSB3aXRoIGxlc3MgbWVudGFsIGVmZm9ydC4gRG9uJ3QgbWFrZSBwZW9wbGUgc29sdmUsIHJlY2FsbCwgb3IgdHJhbnNjcmliZSBzb21ldGhpbmcgdG8gbG9nIGluLlwiLFxuICAgIFwiNC4xLjFcIjogXCIoT2Jzb2xldGUgYW5kIHJlbW92ZWQpIFRoaXMgcmVxdWlyZW1lbnQgd2FzIG9yaWdpbmFsbHkgYWRvcHRlZCB0byBhZGRyZXNzIHByb2JsZW1zIHRoYXQgYXNzaXN0aXZlIHRlY2hub2xvZ3kgKEFUKSBoYWQgZGlyZWN0bHkgcGFyc2luZyBIVE1MLiBBVCBubyBsb25nZXIgaGFzIGFueSBuZWVkIHRvIGRpcmVjdGx5IHBhcnNlIEhUTUwuIENvbnNlcXVlbnRseSwgdGhlc2UgcHJvYmxlbXMgZWl0aGVyIG5vIGxvbmdlciBleGlzdCBvciBhcmUgYWRkcmVzc2VkIGJ5IG90aGVyIHJlcXVpcmVtZW50cy5cIiwgXG4gICAgXCI0LjEuMlwiOiBcIkZvciBhbGwgdXNlciBpbnRlcmZhY2UgY29tcG9uZW50cyAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG86IGZvcm0gZWxlbWVudHMsIGxpbmtzIGFuZCBjb21wb25lbnRzIGdlbmVyYXRlZCBieSBzY3JpcHRzKSwgdGhlIG5hbWUgYW5kIHJvbGUgY2FuIGJlIHByb2dyYW1tYXRpY2FsbHkgZGV0ZXJtaW5lZDsgc3RhdGVzLCBwcm9wZXJ0aWVzLCBhbmQgdmFsdWVzIHRoYXQgY2FuIGJlIHNldCBieSB0aGUgdXNlciBjYW4gYmUgcHJvZ3JhbW1hdGljYWxseSBzZXQ7IGFuZCBub3RpZmljYXRpb24gb2YgY2hhbmdlcyB0byB0aGVzZSBpdGVtcyBpcyBhdmFpbGFibGUgdG8gdXNlciBhZ2VudHMsIGluY2x1ZGluZyBhc3Npc3RpdmUgdGVjaG5vbG9naWVzLlwiLFxuICAgIFwiNC4xLjNcIjogXCJJbiBjb250ZW50IGltcGxlbWVudGVkIHVzaW5nIG1hcmt1cCBsYW5ndWFnZXMsIHN0YXR1cyBtZXNzYWdlcyBjYW4gYmUgcHJvZ3JhbW1hdGljYWxseSBkZXRlcm1pbmVkIHRocm91Z2ggcm9sZSBvciBwcm9wZXJ0aWVzIHN1Y2ggdGhhdCB0aGV5IGNhbiBiZSBwcmVzZW50ZWQgdG8gdGhlIHVzZXIgYnkgYXNzaXN0aXZlIHRlY2hub2xvZ2llcyB3aXRob3V0IHJlY2VpdmluZyBmb2N1cy5cIixcbiAgICBcIkhUTUxcIjogXCJUaGUgSFRNTCBzcGVjaWZpY2F0aW9uIGlzc3VlcyB0aGF0IGNhdXNlIGFjY2Vzc2liaWxpdHkgaXNzdWVzIG1heSBiZSBjb3ZlcmVkIGJ5IG90aGVyIHJ1bGVzIGFuZCB3aWxsIGJlIHJlcG9ydGVkIHVuZGVyIHRob3NlIGFjY2Vzc2liaWxpdHkgcmVxdWlyZW1lbnRzLiBIb3dldmVyLCBzb21lIG5vbi1jb25mb3JtaW5nIEhUTUwgc3BlY2lmaWNhdGlvbiBpc3N1ZXMgYXJlIHN0aWxsIHJlcG9ydGVkLlwiLFxuICAgIFwiQVJJQVwiOiBcIlRoZSBBUklBIHNwZWNpZmljYXRpb24gaXNzdWVzIHRoYXQgY2F1c2UgYWNjZXNzaWJpbGl0eSBpc3N1ZXMgbWF5IGJlIGNvdmVyZWQgYnkgb3RoZXIgcnVsZXMgYW5kIHdpbGwgYmUgcmVwb3J0ZWQgdW5kZXIgdGhvc2UgYWNjZXNzaWJpbGl0eSByZXF1aXJlbWVudHMuIEhvd2V2ZXIsIHNvbWUgbm9uLWNvbmZvcm1pbmcgQVJJQSBzcGVjaWZpY2F0aW9uIGlzc3VlcyBhcmUgc3RpbGwgcmVwb3J0ZWQuXCIsXG59ICAgICBcblxuZXhwb3J0IGNvbnN0IGExMXlSdWxlc2V0czogR3VpZGVsaW5lW10gPSBbXG4gICAgLy8ge1xuICAgIC8vICAgICBpZDogXCJERUJVR1wiLFxuICAgIC8vICAgICBuYW1lOiBcIkRFQlVHIFJ1bGVzXCIsXG4gICAgLy8gICAgIGNhdGVnb3J5OiBlUnVsZUNhdGVnb3J5LkFDQ0VTU0lCSUxJVFksXG4gICAgLy8gICAgIGRlc2NyaXB0aW9uOiBcIlJ1bGVzIGZvciBkZWJ1Z2dpbmdcIixcbiAgICAvLyAgICAgY2hlY2twb2ludHM6IFt7XG4gICAgLy8gICAgICAgICBudW06IFwiMVwiLFxuICAgIC8vICAgICAgICAgbmFtZTogXCJEZWJ1ZyBDUCAxXCIsXG4gICAgLy8gICAgICAgICB3Y2FnTGV2ZWw6IFwiQVwiLFxuICAgIC8vICAgICAgICAgc3VtbWFyeTogXCJSdWxlcyBmb3IgRGVidWdcIlxuICAgIC8vICAgICB9XVxuICAgIC8vIH0sXG4gICAge1xuICAgICAgICBpZDogXCJFWFRFTlNJT05TXCIsXG4gICAgICAgIG5hbWU6IFwiRXh0ZW5zaW9uIFJ1bGVzXCIsXG4gICAgICAgIGNhdGVnb3J5OiBlR3VpZGVsaW5lQ2F0ZWdvcnkuQUNDRVNTSUJJTElUWSxcbiAgICAgICAgZGVzY3JpcHRpb246IFwiUnVsZXMgZm9yIGVuYWJsaW5nIHRoZSBicm93c2VyIGV4dGVuc2lvbnNcIixcbiAgICAgICAgdHlwZTogZUd1aWRlbGluZVR5cGUuRVhURU5TSU9OLFxuICAgICAgICBjaGVja3BvaW50czogW3tcbiAgICAgICAgICAgIG51bTogXCIxXCIsXG4gICAgICAgICAgICBuYW1lOiBcIkV4dGVuc2lvbiBDUCAxXCIsXG4gICAgICAgICAgICB3Y2FnTGV2ZWw6IFwiQVwiLFxuICAgICAgICAgICAgc3VtbWFyeTogXCJSdWxlcyBmb3IgRXh0ZW5zaW9uXCJcbiAgICAgICAgfV1cbiAgICB9LFxuICAgIHtcbiAgICAgICAgaWQ6IFwiSUJNX0FjY2Vzc2liaWxpdHlcIixcbiAgICAgICAgbmFtZTogXCJJQk0gQWNjZXNzaWJpbGl0eSA3LjNcIixcbiAgICAgICAgY2F0ZWdvcnk6IGVHdWlkZWxpbmVDYXRlZ29yeS5BQ0NFU1NJQklMSVRZLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJSdWxlcyBmb3IgV0NBRyAyLjAsIDIuMSwgMi4yIEEgYW5kIEFBIHBsdXMgYWRkaXRpb25hbCBJQk0gc3VwcGxlbWVudGFsIHJlcXVpcmVtZW50cy5cIixcbiAgICAgICAgLy8gVGhpcyBydWxlc2V0IGhhcyBhbGwgMi4wIGFuZCAyLjEgY2hlY2twb2ludHMgdGhhdCBhcmUgQSBvciBBQVxuICAgICAgICBjaGVja3BvaW50czogU0NzXG4gICAgICAgICAgICAuZmlsdGVyKHNjID0+IChzYy5sZXZlbCA9PT0gXCJBXCIgfHwgc2MubGV2ZWwgPT09IFwiQUFcIiB8fCBzYy5sZXZlbCA9PT0gXCJOQVwiKSAmJiAoc2Mud2NhZ1R5cGUgPT09IFwiMi4wXCIgfHwgc2Mud2NhZ1R5cGUgPT09IFwiMi4xXCIgfHwgc2Mud2NhZ1R5cGUgPT09IFwiMi4yXCIgfHwgc2Mud2NhZ1R5cGUgPT09IFwiTkFcIikpXG4gICAgICAgICAgICAubWFwKHNjID0+ICh7XG4gICAgICAgICAgICAgICAgbnVtOiBzYy5udW0sXG4gICAgICAgICAgICAgICAgc2NJZDogc2Muc2NJZCxcbiAgICAgICAgICAgICAgICBuYW1lOiBzYy5oYW5kbGUsXG4gICAgICAgICAgICAgICAgd2NhZ0xldmVsOiBzYy5sZXZlbCxcbiAgICAgICAgICAgICAgICBzdW1tYXJ5OiBzdW1tYXJpZXNbc2MubnVtXVxuICAgICAgICAgICAgfSkpXG4gICAgfSxcbiAgICB7XG4gICAgICAgIGlkOiBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIixcbiAgICAgICAgbmFtZTogXCJJQk0gQWNjZXNzaWJpbGl0eSBuZXh0XCIsXG4gICAgICAgIGNhdGVnb3J5OiBlR3VpZGVsaW5lQ2F0ZWdvcnkuQUNDRVNTSUJJTElUWSxcbiAgICAgICAgZGVzY3JpcHRpb246IFwiUnVsZXMgZm9yIFdDQUcgMi4wLCAyLjEsIDIuMiBBIGFuZCBBQSBwbHVzIGFkZGl0aW9uYWwgSUJNIHN1cHBsZW1lbnRhbCByZXF1aXJlbWVudHMuXCIsXG4gICAgICAgIC8vIFRoaXMgcnVsZXNldCBoYXMgYWxsIDIuMCBhbmQgMi4xIGNoZWNrcG9pbnRzIHRoYXQgYXJlIEEgb3IgQUFcbiAgICAgICAgY2hlY2twb2ludHM6IFNDc1xuICAgICAgICAgICAgLmZpbHRlcihzYyA9PiAoc2MubGV2ZWwgPT09IFwiQVwiIHx8IHNjLmxldmVsID09PSBcIkFBXCIgfHwgc2MubGV2ZWwgPT09IFwiTkFcIikgJiYgKHNjLndjYWdUeXBlID09PSBcIjIuMFwiIHx8IHNjLndjYWdUeXBlID09PSBcIjIuMVwiIHx8IHNjLndjYWdUeXBlID09PSBcIjIuMlwiIHx8IHNjLndjYWdUeXBlID09PSBcIk5BXCIpKVxuICAgICAgICAgICAgLm1hcChzYyA9PiAoe1xuICAgICAgICAgICAgICAgIG51bTogc2MubnVtLFxuICAgICAgICAgICAgICAgIHNjSWQ6IHNjLnNjSWQsXG4gICAgICAgICAgICAgICAgbmFtZTogc2MuaGFuZGxlLFxuICAgICAgICAgICAgICAgIHdjYWdMZXZlbDogc2MubGV2ZWwsXG4gICAgICAgICAgICAgICAgc3VtbWFyeTogc3VtbWFyaWVzW3NjLm51bV1cbiAgICAgICAgICAgIH0pKVxuICAgIH0sXG4gICAge1xuICAgICAgICBpZDogXCJXQ0FHXzJfMlwiLFxuICAgICAgICBuYW1lOiBcIldDQUcgMi4yIChBLCBBQSlcIixcbiAgICAgICAgY2F0ZWdvcnk6IGVHdWlkZWxpbmVDYXRlZ29yeS5BQ0NFU1NJQklMSVRZLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJSdWxlcyBmb3IgV0NBRyAyLjIgQSAmIEFBLiBUaGlzIGlzIHRoZSBjdXJyZW50IFczQyByZWNvbW1lbmRhdGlvbiAoc3BlY2lmaWNhdGlvbikuIENvbnRlbnQgdGhhdCBjb25mb3JtcyB0byBXQ0FHIDIuMiBhbHNvIGNvbmZvcm1zIHRvIFdDQUcgMi4xLlwiLFxuICAgICAgICAvLyBUaGlzIHJ1bGVzZXQgaGFzIGFsbCAyLjAgYW5kIDIuMSBjaGVja3BvaW50cyB0aGF0IGFyZSBBIG9yIEFBXG4gICAgICAgIGNoZWNrcG9pbnRzOiBTQ3NcbiAgICAgICAgICAgIC5maWx0ZXIoc2MgPT4gKHNjLmxldmVsID09PSBcIkFcIiB8fCBzYy5sZXZlbCA9PT0gXCJBQVwiKSAmJiAoc2Mud2NhZ1R5cGUgPT09IFwiMi4wXCIgfHwgc2Mud2NhZ1R5cGUgPT09IFwiMi4xXCIgfHwgc2Mud2NhZ1R5cGUgPT09IFwiMi4yXCIpKVxuICAgICAgICAgICAgLm1hcChzYyA9PiAoe1xuICAgICAgICAgICAgICAgIG51bTogc2MubnVtLFxuICAgICAgICAgICAgICAgIHNjSWQ6IHNjLnNjSWQsXG4gICAgICAgICAgICAgICAgbmFtZTogc2MuaGFuZGxlLFxuICAgICAgICAgICAgICAgIHdjYWdMZXZlbDogc2MubGV2ZWwsXG4gICAgICAgICAgICAgICAgc3VtbWFyeTogc3VtbWFyaWVzW3NjLm51bV1cbiAgICAgICAgICAgIH0pKVxuICAgIH0sXG4gICAge1xuICAgICAgICBpZDogXCJXQ0FHXzJfMVwiLFxuICAgICAgICBuYW1lOiBcIldDQUcgMi4xIChBLCBBQSlcIixcbiAgICAgICAgY2F0ZWdvcnk6IGVHdWlkZWxpbmVDYXRlZ29yeS5BQ0NFU1NJQklMSVRZLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJSdWxlcyBmb3IgV0NBRyAyLjEgQSAmIEFBLiBDb250ZW50IHRoYXQgY29uZm9ybXMgdG8gV0NBRyAyLjEgYWxzbyBjb25mb3JtcyB0byBXQ0FHIDIuMC5cIixcbiAgICAgICAgLy8gVGhpcyBydWxlc2V0IGhhcyBhbGwgMi4wIGFuZCAyLjEgY2hlY2twb2ludHMgdGhhdCBhcmUgQSBvciBBQVxuICAgICAgICBjaGVja3BvaW50czogU0NzXG4gICAgICAgICAgICAuZmlsdGVyKHNjID0+IChzYy5sZXZlbCA9PT0gXCJBXCIgfHwgc2MubGV2ZWwgPT09IFwiQUFcIikgJiYgKHNjLndjYWdUeXBlID09PSBcIjIuMFwiIHx8IHNjLndjYWdUeXBlID09PSBcIjIuMVwiKSlcbiAgICAgICAgICAgIC5tYXAoc2MgPT4gKHtcbiAgICAgICAgICAgICAgICBudW06IHNjLm51bSxcbiAgICAgICAgICAgICAgICBzY0lkOiBzYy5zY0lkLFxuICAgICAgICAgICAgICAgIG5hbWU6IHNjLmhhbmRsZSxcbiAgICAgICAgICAgICAgICB3Y2FnTGV2ZWw6IHNjLmxldmVsLFxuICAgICAgICAgICAgICAgIHN1bW1hcnk6IHN1bW1hcmllc1tzYy5udW1dXG4gICAgICAgICAgICB9KSlcbiAgICB9LFxuICAgIHtcbiAgICAgICAgaWQ6IFwiV0NBR18yXzBcIixcbiAgICAgICAgbmFtZTogXCJXQ0FHIDIuMCAoQSwgQUEpXCIsXG4gICAgICAgIGNhdGVnb3J5OiBlR3VpZGVsaW5lQ2F0ZWdvcnkuQUNDRVNTSUJJTElUWSxcbiAgICAgICAgZGVzY3JpcHRpb246IFwiUnVsZXMgZm9yIFdDQUcgMi4wIEEgJiBBQS4gUmVmZXJlbmNlZCBieSBVUyBTZWN0aW9uIDUwOCwgYnV0IG5vdCB0aGUgbGF0ZXN0IFczQyByZWNvbW1lbmRhdGlvbi5cIixcbiAgICAgICAgLy8gVGhpcyBydWxlc2V0IGhhcyBhbGwgMi4wIGNoZWNrcG9pbnRzIHRoYXQgYXJlIEEgb3IgQUFcbiAgICAgICAgY2hlY2twb2ludHM6IFNDc1xuICAgICAgICAgICAgLmZpbHRlcihzYyA9PiAoc2MubGV2ZWwgPT09IFwiQVwiIHx8IHNjLmxldmVsID09PSBcIkFBXCIpICYmIChzYy53Y2FnVHlwZSA9PT0gXCIyLjBcIikpXG4gICAgICAgICAgICAubWFwKHNjID0+ICh7XG4gICAgICAgICAgICAgICAgbnVtOiBzYy5udW0sXG4gICAgICAgICAgICAgICAgc2NJZDogc2Muc2NJZCxcbiAgICAgICAgICAgICAgICBuYW1lOiBzYy5oYW5kbGUsXG4gICAgICAgICAgICAgICAgd2NhZ0xldmVsOiBzYy5sZXZlbCxcbiAgICAgICAgICAgICAgICBzdW1tYXJ5OiBzdW1tYXJpZXNbc2MubnVtXVxuICAgICAgICAgICAgfSkpXG4gICAgfVxuXVxuIiwiXG5pbXBvcnQgeyBTUkN1cnNvciB9IGZyb20gXCIuL1NSQ3Vyc29yXCI7XG5pbXBvcnQgeyBTUlJlbmRlcmVyIH0gZnJvbSBcIi4vU1JSZW5kZXJlclwiO1xuaW1wb3J0IHsgTmF2aWdhdGlvbk1vZGUsIE5hdmlnYXRpb25SZXN1bHQsIFJlbmRlclJlc3VsdCB9IGZyb20gXCIuL1NSVHlwZXNcIjtcbmltcG9ydCB7IFNSTmF2aWdhdG9yIH0gZnJvbSBcIi4vU1JOYXZpZ2F0b3JcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgU1JVdGlsIH0gZnJvbSBcIi4vU1JVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG4vKipcbiAqIFNSQ29udHJvbGxlciBjbGFzcyBmb3IgbWFuYWdpbmcgc2NyZWVuIHJlYWRlciBzaW11bGF0aW9uXG4gKiBNYWludGFpbnMgYSBwb2ludCBvZiByZWdhcmQgYW5kIHByb3ZpZGVzIG5hdmlnYXRpb24gZnVuY3Rpb25zXG4gKi9cbmV4cG9ydCBjbGFzcyBTUkNvbnRyb2xsZXIge1xuICAgIHB1YmxpYyBzdGF0aWMgc2luZ2xldG9uO1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Q29udHJvbGxlcihjdHJsRG9jOiBIVE1MRG9jdW1lbnQgPSBkb2N1bWVudCkge1xuICAgICAgICBpZiAoIXRoaXMuc2luZ2xldG9uKSB7XG4gICAgICAgICAgICB0aGlzLnNpbmdsZXRvbiA9IG5ldyBTUkNvbnRyb2xsZXIoY3RybERvYy5ib2R5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5zaW5nbGV0b24gYXMgU1JDb250cm9sbGVyO1xuICAgIH1cblxuICAgIC8qKiBUaGUgY3VycmVudCBwb2ludCBvZiByZWdhcmQgKi9cbiAgICBwcml2YXRlIHBvaW50T2ZSZWdhcmQ6IFNSQ3Vyc29yO1xuICAgIHByaXZhdGUgbXV0YXRpb25PYnNlcnZlcjogTXV0YXRpb25PYnNlcnZlcjtcbiAgICBwcml2YXRlIGxpdmVMaXN0ZW5lcnM6IEFycmF5PChyZXN1bHQ6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPj4gPSBbXTtcbiAgICBwcml2YXRlIGN0cmxEb2M7XG4gICAgXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBTUkNvbnRyb2xsZXJcbiAgICAgKiBAcGFyYW0gcm9vdEVsZW1lbnQgVGhlIHJvb3QgZWxlbWVudCB0byBzdGFydCBmcm9tIChkZWZhdWx0cyB0byBkb2N1bWVudC5ib2R5KVxuICAgICAqL1xuICAgIHByaXZhdGUgY29uc3RydWN0b3IocHJpdmF0ZSByb290RWxlbWVudDogTm9kZSA9IGRvY3VtZW50LmJvZHkpIHtcbiAgICAgICAgdGhpcy5jdHJsRG9jID0gcm9vdEVsZW1lbnQub3duZXJEb2N1bWVudDtcbiAgICAgICAgdGhpcy5zZXRQb2ludE9mUmVnYXJkKHJvb3RFbGVtZW50KTtcbiAgICAgICAgdGhpcy5zZXR1cE11dGF0aW9uVHJhY2tpbmcoKTtcbiAgICAgICAgY29uc29sZS5pbmZvKGBbV0FSTklOR10gVGhlIFNSQ29udHJvbGxlciBpcyBhIG5ldyBmZWF0dXJlIHRoYXQgaXMgbm90IHlldCBcInN0YWJsZVwiLiBXaGF0IHRoaXMgbWVhbnM6XG4qIEFQSSBzdWJqZWN0IHRvIGNoYW5nZSwgZXZlbiBiZXR3ZWVuIG1pbm9yIHZlcnNpb25zIG9mIHRoZSBjaGVja2VyXG4qIFJlc3VsdHMgc2hvdWxkIGJlIGNvbnNpZGVyZWQgZXhwZXJpbWVudGFsLiBUaGVyZSBhcmUgYSB2YXJpZXR5IG9mIGtub3duIGlzc3VlcywgYnV0IG1ha2luZyB0aGlzIGF2YWlsYWJsZSBmb3IgZWFybHkgZXhwZXJpbWVudGF0aW9uIC8gZmVlZGJhY2suYCk7XG4gICAgfVxuXG4gICAgcHVibGljIGRpc2Nvbm5lY3QoKSB7XG4gICAgICAgIGlmICh0aGlzLm11dGF0aW9uT2JzZXJ2ZXIpIHtcbiAgICAgICAgICAgIHRoaXMubXV0YXRpb25PYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgcHJpdmF0ZSBmaW5kQWxsU2hhZG93Um9vdHMocm9vdDogRG9jdW1lbnQgfCBEb2N1bWVudEZyYWdtZW50IHwgTm9kZSA9IGRvY3VtZW50KTogTm9kZVtdIHtcbiAgICAgICAgY29uc3Qgc2hhZG93Um9vdHM6IE5vZGVbXSA9IFtdO1xuXG4gICAgICAgIC8vIEdldCBhbGwgZWxlbWVudHMgaW4gdGhlIGN1cnJlbnQgcm9vdFxuICAgICAgICBjb25zdCB3YWxrZXIgPSB0aGlzLmN0cmxEb2MuY3JlYXRlVHJlZVdhbGtlcihcbiAgICAgICAgICAgIHJvb3QsXG4gICAgICAgICAgICBOb2RlRmlsdGVyLlNIT1dfRUxFTUVOVCxcbiAgICAgICAgICAgIG51bGxcbiAgICAgICAgKTtcblxuICAgICAgICBsZXQgbm9kZTogTm9kZSB8IG51bGw7XG4gICAgICAgIHdoaWxlIChub2RlID0gd2Fsa2VyLm5leHROb2RlKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBub2RlIGFzIEVsZW1lbnQ7XG5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgZWxlbWVudCBoYXMgYW4gb3BlbiBzaGFkb3cgcm9vdFxuICAgICAgICAgICAgaWYgKGVsZW1lbnQuc2hhZG93Um9vdCkge1xuICAgICAgICAgICAgICAgIHNoYWRvd1Jvb3RzLnB1c2goZWxlbWVudC5zaGFkb3dSb290KTtcblxuICAgICAgICAgICAgICAgIC8vIFJlY3Vyc2l2ZWx5IHNlYXJjaCBpbnNpZGUgdGhpcyBzaGFkb3cgcm9vdFxuICAgICAgICAgICAgICAgIGNvbnN0IG5lc3RlZFNoYWRvd1Jvb3RzID0gdGhpcy5maW5kQWxsU2hhZG93Um9vdHMoZWxlbWVudC5zaGFkb3dSb290KTtcbiAgICAgICAgICAgICAgICBzaGFkb3dSb290cy5wdXNoKC4uLm5lc3RlZFNoYWRvd1Jvb3RzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzaGFkb3dSb290cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdXAgbXV0YXRpb24gdHJhY2tpbmdcbiAgICAgKiBcbiAgICAgKiBJbiB0aGUgZXZlbnQgdGhhdCB0aGUgcG9pbnQgb2YgcmVnYXJkIGlzIHJlbW92ZWQgZnJvbSB0aGUgRE9NLCB3ZSBuZWVkIHRvIGdldCB1cCB0byB0aGUgbmVhcmVzdCBwYXJlbnQgdGhhdCdzIG5vdCBiZWluZyByZW1vdmVkXG4gICAgICovXG4gICAgcHJpdmF0ZSBzZXR1cE11dGF0aW9uVHJhY2tpbmcoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm11dGF0aW9uT2JzZXJ2ZXIpIHtcbiAgICAgICAgICAgIHRoaXMubXV0YXRpb25PYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbXlUaGlzID0gdGhpcztcbiAgICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigobXV0YXRpb25zKSA9PiB7XG4gICAgICAgICAgICBsZXQgcG9yTm9kZSA9IG15VGhpcy5wb2ludE9mUmVnYXJkLmdldE5vZGUoKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcmVtb3ZhbE11dGF0aW9uIG9mIG11dGF0aW9ucy5maWx0ZXIobXV0YXRpb24gPT4gbXV0YXRpb24ucmVtb3ZlZE5vZGVzPy5sZW5ndGggPiAwKSkge1xuICAgICAgICAgICAgICAgIHJlbW92YWxNdXRhdGlvbi5yZW1vdmVkTm9kZXMuZm9yRWFjaCgocmVtb3ZlZE5vZGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlbW92ZWROb2RlLmlzU2FtZU5vZGUocG9yTm9kZSkgfHwgcmVtb3ZlZE5vZGUuY29udGFpbnMocG9yTm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuaW5mbyhcIkFkanVzdGluZyBQb1IgZHVlIHRvIERPTSBtdXRhdGlvbiByZW1vdmluZyBQb1JcIik7Ly8sIHJlbW92YWxNdXRhdGlvbi50YXJnZXQsIHJlbW92ZWROb2RlLCBwb3JOb2RlKVxuICAgICAgICAgICAgICAgICAgICAgICAgcG9yTm9kZSA9IHJlbW92YWxNdXRhdGlvbi50YXJnZXQ7XG4gICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5zZXRQb2ludE9mUmVnYXJkKHBvck5vZGUpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBmb3IgKGNvbnN0IG11dGF0aW9uIG9mIG11dGF0aW9ucykge1xuICAgICAgICAgICAgICAgIGlmIChtdXRhdGlvbi5hZGRlZE5vZGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIG11dGF0aW9uLmFkZGVkTm9kZXMuZm9yRWFjaChhZGRlZE5vZGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWRkIG9ic2VydmF0aW9uIG9mIG5ldyBzaGFkb3cgcm9vdHNcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhbGxSb290cyA9IHRoaXMuZmluZEFsbFNoYWRvd1Jvb3RzKGFkZGVkTm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHJvb3Qgb2YgYWxsUm9vdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5vYnNlcnZlKHJvb3QsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRMaXN0OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJ0cmVlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJEYXRhOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBtdXRhdGlvbi50YXJnZXQ7XG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbSA9IG5vZGUubm9kZVR5cGUgPT09IDEgPyBub2RlIGFzIEhUTUxFbGVtZW50IDogbm9kZS5wYXJlbnRFbGVtZW50O1xuICAgICAgICAgICAgICAgIGlmIChlbGVtIFxuICAgICAgICAgICAgICAgICAgICAmJiAhZWxlbS5jbG9zZXN0KGBbYXJpYS1idXN5PVwidHJ1ZVwiXWApXG4gICAgICAgICAgICAgICAgICAgICYmIGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1idXN5XCIpICE9PSBcInRydWVcIlxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZGVudGlmeSB0aGUgbGl2ZSByZWdpb24gY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpdmVSZWdpb25FbGVtID0gXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZWxlbWVudCBpdHNlbGYgaXMgYSBsaXZlIHJlZ2lvbiBjb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICgoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wicG9saXRlXCIsIFwiYXNzZXJ0aXZlXCJdLmluY2x1ZGVzKGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1saXZlXCIpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBlbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiT1VUUFVUXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgW1wic3RhdHVzXCIsIFwibG9nXCIsIFwicHJvZ3Jlc3NiYXJcIiwgXCJhbGVydFwiLCBcInRpbWVyXCJdLmluY2x1ZGVzKGVsZW0uZ2V0QXR0cmlidXRlKFwicm9sZVwiKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICkgJiYgZWxlbSkgXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBPciBnZXQgdGhlIG5lYXJlc3QgYW5jZXN0b3JcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8IGVsZW0uY2xvc2VzdChgW2FyaWEtbGl2ZT1cInBvbGl0ZVwiXSxbYXJpYS1saXZlPVwiYXNzZXJ0aXZlXCJdLG91dHB1dCxbcm9sZT1cInN0YXR1c1wiXSxbcm9sZT1cImxvZ1wiXSxbcm9sZT1cInByb2dyZXNzYmFyXCJdLFtyb2xlPVwiYWxlcnRcIl0sW3JvbGU9XCJ0aW1lclwiXWApO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBpc011dGF0aW9uUmVsZXZhbnQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlbGV2YW5jZSA9IFtcImFkZGl0aW9uc1wiLCBcInRleHRcIl07XG4gICAgICAgICAgICAgICAgICAgIGlmIChsaXZlUmVnaW9uRWxlbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIHdoYXQga2luZHMgb2YgY2hhbmdlcyBhcmUgJ3JlbGV2YW50J1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVsZXZhbnRFbGVtID0gZWxlbS5jbG9zZXN0KFwiW2FyaWEtcmVsZXZhbnRdXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlbGV2YW50RWxlbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGV2YW5jZSA9IHJlbGV2YW50RWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLXJlbGV2YW50XCIpLnNwbGl0KC8gKy9nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpdmVSZWdpb25FbGVtLmdldEF0dHJpYnV0ZShcInJvbGVcIikgPT09IFwibG9nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxldmFuY2UgPSBbXCJhZGRpdGlvbnNcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGl2ZVJlZ2lvbkVsZW0uaGFzQXR0cmlidXRlKFwiYXJpYS1yZWxldmFudFwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGV2YW5jZSA9IGxpdmVSZWdpb25FbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtcmVsZXZhbnRcIikuc3BsaXQoLyArL2cpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlbGV2YW5jZS5pbmNsdWRlcyhcImFsbFwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGV2YW5jZSA9IFtcImFkZGl0aW9uc1wiLCBcInJlbW92YWxzXCIsIFwidGV4dFwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlzTXV0YXRpb25SZWxldmFudCA9IChtdXRhdGlvbi50YXJnZXQubm9kZVR5cGUgPT09IDMgJiYgcmVsZXZhbmNlLmluY2x1ZGVzKFwidGV4dFwiKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAobXV0YXRpb24uYWRkZWROb2Rlcy5sZW5ndGggPiAwICYmIHJlbGV2YW5jZS5pbmNsdWRlcyhcImFkZGl0aW9uc1wiKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAobXV0YXRpb24ucmVtb3ZlZE5vZGVzLmxlbmd0aCA+IDAgJiYgcmVsZXZhbmNlLmluY2x1ZGVzKFwicmVtb3ZhbHNcIikpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIFxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChsaXZlUmVnaW9uRWxlbSAmJiBpc011dGF0aW9uUmVsZXZhbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzQXRvbWljID0gbGl2ZVJlZ2lvbkVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1hdG9taWNcIikgPT09IFwidHJ1ZVwiIHx8IFtcImFsZXJ0XCIsIFwic3RhdHVzXCIsIFwidGltZXJcIiwgXCJtYXJxdWVlXCJdLmluY2x1ZGVzKGxpdmVSZWdpb25FbGVtLmdldEF0dHJpYnV0ZShcInJvbGVcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVhZCB0aGUgd2hvbGUgcmVnaW9uIGlmIGF0b21pY1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0F0b21pYyAmJiBtdXRhdGlvbi50eXBlID09PSBcImNoYXJhY3RlckRhdGFcIiAmJiBtdXRhdGlvbi50YXJnZXQubm9kZVR5cGUgPT09IDMgJiYgIVZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKG11dGF0aW9uLnRhcmdldC5wYXJlbnRFbGVtZW50KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbGl2ZUxpc3RlbmVyIG9mIHRoaXMubGl2ZUxpc3RlbmVycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXZlTGlzdGVuZXIobXV0YXRpb24udGFyZ2V0Lm5vZGVWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGl2ZVRhcmdldCA9IGlzQXRvbWljID8gbGl2ZVJlZ2lvbkVsZW0gOiBtdXRhdGlvbi50YXJnZXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChsaXZlVGFyZ2V0IGFzIGFueSkubGl2ZUFubm91bmNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCgobGl2ZVRhcmdldCBhcyBhbnkpLmxpdmVBbm5vdW5jZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsaXZlVGFyZ2V0IGFzIGFueSkubGl2ZUFubm91bmNlID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXN1bHRzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpc1JlbW92YWwgPSAocmVsZXZhbmNlLmluY2x1ZGVzKFwicmVtb3ZhbHNcIikgJiYgbXV0YXRpb24ucmVtb3ZlZE5vZGVzLmxlbmd0aCA+IDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNBdG9taWMgfHwgaXNSZW1vdmFsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGl2ZUN1cnNvciA9IG5ldyBTUkN1cnNvcihsaXZlVGFyZ2V0LCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGl2ZUN1cnNvckVuZCA9IG5ldyBTUkN1cnNvcihsaXZlVGFyZ2V0LCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpdmVDdXJzb3JFbmQubmV4dCgoKSA9PiB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaCgoaXNSZW1vdmFsP1wiW3JlbW92ZWRdIFwiOlwiXCIpK1NSUmVuZGVyZXIucmVuZGVyUmFuZ2UoXCJpdGVtXCIsIGxpdmVDdXJzb3IsIGxpdmVDdXJzb3JFbmQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZWxldmFuY2UuaW5jbHVkZXMoXCJhZGRpdGlvbnNcIikgJiYgbXV0YXRpb24uYWRkZWROb2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGlvbi5hZGRlZE5vZGVzLmZvckVhY2goYWRkZWROb2RlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBKdXN0IHJlbmRlciB0aGUgYWRkaXRpb25zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxpdmVDdXJzb3IgPSBuZXcgU1JDdXJzb3IoYWRkZWROb2RlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxpdmVDdXJzb3JFbmQgPSBuZXcgU1JDdXJzb3IoYWRkZWROb2RlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXZlQ3Vyc29yRW5kLm5leHQoKCkgPT4gdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKFNSUmVuZGVyZXIucmVuZGVyUmFuZ2UoXCJpdGVtXCIsIGxpdmVDdXJzb3IsIGxpdmVDdXJzb3JFbmQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbGl2ZUxpc3RlbmVyIG9mIHRoaXMubGl2ZUxpc3RlbmVycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGl2ZUxpc3RlbmVyKHJlc3VsdHMuam9pbihcIlxcblwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAxMDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBOZWVkIHRvIG9ic2VydmUgYWxsIG9mIHRoZSBzaGFkb3cgcm9vdHNcbiAgICAgICAgbGV0IGFsbFJvb3RzID0gdGhpcy5maW5kQWxsU2hhZG93Um9vdHModGhpcy5jdHJsRG9jLmRvY3VtZW50RWxlbWVudCk7XG4gICAgICAgIGFsbFJvb3RzLnB1c2godGhpcy5jdHJsRG9jLmRvY3VtZW50RWxlbWVudCk7XG4gICAgICAgIGZvciAoY29uc3Qgcm9vdCBvZiBhbGxSb290cykge1xuICAgICAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShyb290LCB7XG4gICAgICAgICAgICAgICAgY2hpbGRMaXN0OiB0cnVlLFxuICAgICAgICAgICAgICAgIHN1YnRyZWU6IHRydWUsXG4gICAgICAgICAgICAgICAgY2hhcmFjdGVyRGF0YTogdHJ1ZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkTGl2ZUxpc3RlbmVyKGxpc3RlbmVyOiAocmVzdWx0OiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD4pIHtcbiAgICAgICAgdGhpcy5saXZlTGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZW1vdmVMaXZlTGlzdGVuZXIocmVtb3ZlTGlzdGVuZXI6IChyZXN1bHQ6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPikge1xuICAgICAgICB0aGlzLmxpdmVMaXN0ZW5lcnMgPSB0aGlzLmxpdmVMaXN0ZW5lcnMuZmlsdGVyKGxpc3RlbmVyID0+IGxpc3RlbmVyICE9PSByZW1vdmVMaXN0ZW5lcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBjdXJyZW50IHBvaW50IG9mIHJlZ2FyZFxuICAgICAqIEByZXR1cm5zIFRoZSBjdXJyZW50IFNSQ3Vyc29yIHJlcHJlc2VudGluZyB0aGUgcG9pbnQgb2YgcmVnYXJkXG4gICAgICovXG4gICAgcHVibGljIGdldFBvaW50T2ZSZWdhcmQoKTogU1JDdXJzb3Ige1xuICAgICAgICByZXR1cm4gdGhpcy5wb2ludE9mUmVnYXJkO1xuICAgIH1cbiAgICBcbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIHBvaW50IG9mIHJlZ2FyZCB0byBhIHNwZWNpZmljIERPTSBub2RlXG4gICAgICogQHBhcmFtIG5vZGUgVGhlIG5vZGUgdG8gc2V0IGFzIHRoZSBwb2ludCBvZiByZWdhcmRcbiAgICAgKiBAcmV0dXJucyBOYXZpZ2F0aW9uUmVzdWx0IGluZGljYXRpbmcgc3VjY2VzcyBvciBmYWlsdXJlXG4gICAgICovXG4gICAgcHVibGljIHNldFBvaW50T2ZSZWdhcmQobm9kZTogTm9kZSk6IE5hdmlnYXRpb25SZXN1bHQge1xuICAgICAgICBjb25zdCBERUJVRyA9IGZhbHNlO1xuICAgICAgICBERUJVRyAmJiBjb25zb2xlLmdyb3VwKFwic2V0UG9pbnRPZlJlZ2FyZFwiKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMucG9pbnRPZlJlZ2FyZCA9IG5ldyBTUkN1cnNvcihub2RlKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gVXBkYXRlIGNvbnRhaW5lciBzdGF0ZVxuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyQ2hhbmdlcyA9IFNSQ29udHJvbGxlci5kaWZmQ29udGFpbmVycyhcImZvY3VzXCIsIHRoaXMucG9pbnRPZlJlZ2FyZCk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNvbnN0IHJvbGUgPSB0aGlzLnBvaW50T2ZSZWdhcmQuZ2V0Um9sZSgpO1xuICAgICAgICAgICAgY29uc3QgbmFtZSA9IHRoaXMucG9pbnRPZlJlZ2FyZC5nZXROYW1lSW5mbygpPy5uYW1lO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgICAgICAgcmVuZGVyaW5nUmVzdWx0OiBTUlJlbmRlcmVyLnJlbmRlckN1cnJlbnQoXCJmb2N1c1wiLCB0aGlzLnBvaW50T2ZSZWdhcmQsIGNvbnRhaW5lckNoYW5nZXMpLFxuICAgICAgICAgICAgICAgIHJvbGUsXG4gICAgICAgICAgICAgICAgbmFtZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICAgICAgcmVuZGVyaW5nUmVzdWx0OiB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0OiB0aGlzLnBvaW50T2ZSZWdhcmQuY2xvbmUoKSxcbiAgICAgICAgICAgICAgICAgICAgZW5kOiB0aGlzLnBvaW50T2ZSZWdhcmQuY2xvbmUoKSxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYEZhaWxlZCB0byBzZXQgcG9pbnQgb2YgcmVnYXJkOiAke2Vycm9yLm1lc3NhZ2V9YFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBERUJVRyAmJiBjb25zb2xlLmdyb3VwRW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLyoqXG4gICAgICogSnVtcCB0byB0aGUgbmV4dCBlbGVtZW50IGJ5IHRoZSBzcGVjaWZpZWQgbW9kZVxuICAgICAqIEBwYXJhbSBtb2RlIFRoZSBuYXZpZ2F0aW9uIG1vZGUgdG8gdXNlXG4gICAgICogQHJldHVybnMgTmF2aWdhdGlvblJlc3VsdCBpbmRpY2F0aW5nIHN1Y2Nlc3Mgb3IgZmFpbHVyZVxuICAgICAqL1xuICAgIHB1YmxpYyBqdW1wTmV4dChtb2RlOiBOYXZpZ2F0aW9uTW9kZSk6IE5hdmlnYXRpb25SZXN1bHQge1xuICAgICAgICBDYWNoZVV0aWwuY2xlYXJDYWNoZXModGhpcy5jdHJsRG9jLmRvY3VtZW50RWxlbWVudCk7XG4gICAgICAgIGNvbnN0IG9sZFBvaW50T2ZSZWdhcmQgPSB0aGlzLnBvaW50T2ZSZWdhcmQuY2xvbmUoKTtcbiAgICAgICAgY29uc3QgREVCVUcgPSBmYWxzZTtcbiAgICAgICAgREVCVUcgJiYgY29uc29sZS5ncm91cChcImp1bXBOZXh0XCIpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IGJDb250aW51ZSA9IHRydWU7XG4gICAgICAgICAgICBsZXQgbmV4dEp1bXAgPSB0aGlzLnBvaW50T2ZSZWdhcmQuY2xvbmUoKTtcbiAgICAgICAgICAgIGxldCByZW5kZXJpbmdSZXN1bHQ7XG4gICAgICAgICAgICB3aGlsZSAoYkNvbnRpbnVlICYmIG5leHRKdW1wKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGFzdEp1bXAgPSBuZXh0SnVtcC5jbG9uZSgpO1xuICAgICAgICAgICAgICAgIG5leHRKdW1wID0gU1JOYXZpZ2F0b3IuanVtcE5leHQobW9kZSwgbmV4dEp1bXApO1xuICAgICAgICAgICAgICAgIGlmIChuZXh0SnVtcCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY29udGFpbmVyQ2hhbmdlcyA9IFNSQ29udHJvbGxlci5kaWZmQ29udGFpbmVycyhtb2RlLCBuZXh0SnVtcCwgbGFzdEp1bXApO1xuICAgICAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gXCJpdGVtXCIgJiYgIVNSTmF2aWdhdG9yLmdldFN0YXJ0RnVuYyhtb2RlKShuZXh0SnVtcC5nZXRSb2xlKCksICFuZXh0SnVtcC5pc0VuZFRhZygpLCBuZXh0SnVtcC5nZXROb2RlKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJDaGFuZ2VzID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudGVyaW5nOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWF2aW5nOiBbXVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJlbmRlcmluZ1Jlc3VsdCA9IFNSUmVuZGVyZXIucmVuZGVyQ3VycmVudChtb2RlLCBuZXh0SnVtcCwgY29udGFpbmVyQ2hhbmdlcyk7XG4gICAgICAgICAgICAgICAgICAgIC8vIEtlZXAgZ29pbmcgaWYgdGhlIGxhbmRpbmcgcG9pbnQgaXMgZW1wdHksIHVubGVzcyBpdCdzIGNlcnRhaW4gbmF2IG1vZGVzIChlLmcuLCByZWdpb24pXG4gICAgICAgICAgICAgICAgICAgIGJDb250aW51ZSA9IHJlbmRlcmluZ1Jlc3VsdC5tZXNzYWdlLnRyaW0oKS5sZW5ndGggPT09IDAgJiYgIVtcInJlZ2lvblwiXS5pbmNsdWRlcyhtb2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIW5leHRKdW1wKSB7XG4gICAgICAgICAgICAgICAgLy8gUmVzdG9yZSB0aGUgb3JpZ2luYWwgcG9pbnQgb2YgcmVnYXJkXG4gICAgICAgICAgICAgICAgdGhpcy5wb2ludE9mUmVnYXJkID0gb2xkUG9pbnRPZlJlZ2FyZDtcbiAgICAgICAgICAgICAgICBsZXQgY3VycmVudFJlc3VsdCA9IFNSUmVuZGVyZXIucmVuZGVyQ3VycmVudChtb2RlLCBvbGRQb2ludE9mUmVnYXJkLCB7IGxlYXZpbmc6IFtdLCBlbnRlcmluZzogW119KTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyaW5nUmVzdWx0OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydDogb2xkUG9pbnRPZlJlZ2FyZC5jbG9uZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiBvbGRQb2ludE9mUmVnYXJkLmNsb25lKCksXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgTm8gbmV4dCAke21vZGV9LiAke2N1cnJlbnRSZXN1bHQ/Lm1lc3NhZ2UgfHwgXCJcIn1gXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBvaW50T2ZSZWdhcmQgPSBuZXh0SnVtcDtcbiAgICAgICAgICAgICAgICBjb25zdCByb2xlID0gdGhpcy5wb2ludE9mUmVnYXJkLmdldFJvbGUoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gdGhpcy5wb2ludE9mUmVnYXJkLmdldE5hbWVJbmZvKCk/Lm5hbWU7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGNvbnRhaW5lciBjaGFuZ2VzXG4gICAgICAgICAgICAgICAgREVCVUcgJiYgY29uc29sZS5sb2coXCJOZXcgUE9SOlwiLCB0aGlzLnBvaW50T2ZSZWdhcmQuZ2V0Tm9kZSgpLCByZW5kZXJpbmdSZXN1bHQpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHJlbmRlcmluZ1Jlc3VsdCxcbiAgICAgICAgICAgICAgICAgICAgcm9sZSxcbiAgICAgICAgICAgICAgICAgICAgbmFtZVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIC8vIFJlc3RvcmUgdGhlIG9yaWdpbmFsIHBvaW50IG9mIHJlZ2FyZFxuICAgICAgICAgICAgdGhpcy5wb2ludE9mUmVnYXJkID0gb2xkUG9pbnRPZlJlZ2FyZDtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICAgICAgcmVuZGVyaW5nUmVzdWx0OiB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBvbGRQb2ludE9mUmVnYXJkLmNsb25lKCksXG4gICAgICAgICAgICAgICAgICAgIGVuZDogb2xkUG9pbnRPZlJlZ2FyZC5jbG9uZSgpLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgTmF2aWdhdGlvbiBlcnJvcjogJHtlcnJvci5tZXNzYWdlfWBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgY29uc29sZS5ncm91cEVuZCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8qKlxuICAgICAqIEp1bXAgdG8gdGhlIHByZXZpb3VzIGVsZW1lbnQgYnkgdGhlIHNwZWNpZmllZCBtb2RlXG4gICAgICogQHBhcmFtIG1vZGUgVGhlIG5hdmlnYXRpb24gbW9kZSB0byB1c2VcbiAgICAgKiBAcmV0dXJucyBOYXZpZ2F0aW9uUmVzdWx0IGluZGljYXRpbmcgc3VjY2VzcyBvciBmYWlsdXJlXG4gICAgICovXG4gICAgcHVibGljIGp1bXBQcmV2aW91cyhtb2RlOiBOYXZpZ2F0aW9uTW9kZSk6IE5hdmlnYXRpb25SZXN1bHQge1xuICAgICAgICBDYWNoZVV0aWwuY2xlYXJDYWNoZXModGhpcy5jdHJsRG9jLmRvY3VtZW50RWxlbWVudCk7XG4gICAgICAgIGNvbnN0IG9sZFBvaW50T2ZSZWdhcmQgPSB0aGlzLnBvaW50T2ZSZWdhcmQuY2xvbmUoKTtcbiAgICAgICAgXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgYkNvbnRpbnVlID0gdHJ1ZTtcbiAgICAgICAgICAgIGxldCBwcmV2SnVtcCA9IHRoaXMucG9pbnRPZlJlZ2FyZC5jbG9uZSgpO1xuICAgICAgICAgICAgbGV0IHJlbmRlcmluZ1Jlc3VsdDtcbiAgICAgICAgICAgIHdoaWxlIChiQ29udGludWUgJiYgcHJldkp1bXApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsYXN0SnVtcCA9IHByZXZKdW1wLmNsb25lKCk7XG4gICAgICAgICAgICAgICAgcHJldkp1bXAgPSBTUk5hdmlnYXRvci5qdW1wUHJldmlvdXMobW9kZSwgcHJldkp1bXApO1xuICAgICAgICAgICAgICAgIGlmIChwcmV2SnVtcCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY29udGFpbmVyQ2hhbmdlcyA9IFNSQ29udHJvbGxlci5kaWZmQ29udGFpbmVycyhtb2RlLCBwcmV2SnVtcCwgbGFzdEp1bXApO1xuICAgICAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gXCJpdGVtXCIgJiYgIVNSTmF2aWdhdG9yLmdldFN0YXJ0RnVuYyhtb2RlKShwcmV2SnVtcC5nZXRSb2xlKCksICFwcmV2SnVtcC5pc0VuZFRhZygpLCBwcmV2SnVtcC5nZXROb2RlKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJDaGFuZ2VzID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudGVyaW5nOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWF2aW5nOiBbXVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJlbmRlcmluZ1Jlc3VsdCA9IFNSUmVuZGVyZXIucmVuZGVyQ3VycmVudChtb2RlLCBwcmV2SnVtcCwgY29udGFpbmVyQ2hhbmdlcyk7XG4gICAgICAgICAgICAgICAgICAgIC8vIEtlZXAgZ29pbmcgaWYgdGhlIGxhbmRpbmcgcG9pbnQgaXMgZW1wdHksIHVubGVzcyBpdCdzIGNlcnRhaW4gbmF2IG1vZGVzIChlLmcuLCByZWdpb24pXG4gICAgICAgICAgICAgICAgICAgIGJDb250aW51ZSA9IHJlbmRlcmluZ1Jlc3VsdC5tZXNzYWdlLnRyaW0oKS5sZW5ndGggPT09IDAgJiYgIVtcInJlZ2lvblwiXS5pbmNsdWRlcyhtb2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmICghcHJldkp1bXApIHtcbiAgICAgICAgICAgICAgICAvLyBSZXN0b3JlIHRoZSBvcmlnaW5hbCBwb2ludCBvZiByZWdhcmRcbiAgICAgICAgICAgICAgICB0aGlzLnBvaW50T2ZSZWdhcmQgPSBvbGRQb2ludE9mUmVnYXJkO1xuICAgICAgICAgICAgICAgIGxldCBjdXJyZW50UmVzdWx0ID0gU1JSZW5kZXJlci5yZW5kZXJDdXJyZW50KG1vZGUsIG9sZFBvaW50T2ZSZWdhcmQsIHsgbGVhdmluZzogW10sIGVudGVyaW5nOiBbXX0pO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICByZW5kZXJpbmdSZXN1bHQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBvbGRQb2ludE9mUmVnYXJkLmNsb25lKCksXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmQ6IG9sZFBvaW50T2ZSZWdhcmQuY2xvbmUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBObyBwcmV2aW91cyAke21vZGV9LiAke2N1cnJlbnRSZXN1bHQ/Lm1lc3NhZ2UgfHwgXCJcIn1gXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBvaW50T2ZSZWdhcmQgPSBwcmV2SnVtcDtcbiAgICAgICAgICAgICAgICBjb25zdCByb2xlID0gdGhpcy5wb2ludE9mUmVnYXJkLmdldFJvbGUoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gdGhpcy5wb2ludE9mUmVnYXJkLmdldE5hbWVJbmZvKCk/Lm5hbWU7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gLy8gQ2hlY2sgZm9yIGNvbnRhaW5lciBjaGFuZ2VzXG4gICAgICAgICAgICAgICAgLy8gY29uc3QgY29udGFpbmVyQ2hhbmdlcyA9IFNSQ29udHJvbGxlci5kaWZmQ29udGFpbmVycyhtb2RlLCB0aGlzLnBvaW50T2ZSZWdhcmQsIG9sZFBvaW50T2ZSZWdhcmQpO1xuICAgICAgICAgICAgICAgIC8vIGxldCBzID0gU1JSZW5kZXJlci5yZW5kZXJFbnRlcihtb2RlLCB0aGlzLnBvaW50T2ZSZWdhcmQpO1xuICAgICAgICAgICAgICAgIC8vIGlmIChjb250YWluZXJDaGFuZ2VzLmVudGVyaW5nW2NvbnRhaW5lckNoYW5nZXMuZW50ZXJpbmcubGVuZ3RoLTFdICE9PSBzKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIGNvbnRhaW5lckNoYW5nZXMuZW50ZXJpbmcucHVzaChzKTtcbiAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyaW5nUmVzdWx0LFxuICAgICAgICAgICAgICAgICAgICByb2xlLFxuICAgICAgICAgICAgICAgICAgICBuYW1lXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgLy8gUmVzdG9yZSB0aGUgb3JpZ2luYWwgcG9pbnQgb2YgcmVnYXJkXG4gICAgICAgICAgICB0aGlzLnBvaW50T2ZSZWdhcmQgPSBvbGRQb2ludE9mUmVnYXJkO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICByZW5kZXJpbmdSZXN1bHQ6IHtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IG9sZFBvaW50T2ZSZWdhcmQuY2xvbmUoKSxcbiAgICAgICAgICAgICAgICAgICAgZW5kOiBvbGRQb2ludE9mUmVnYXJkLmNsb25lKCksXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBOYXZpZ2F0aW9uIGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lIHRoZSBkaWZmZXJlbnQgaW4gY29udGFpbmVycyBiZXR3ZWVuIHRoZSB0d28gbm9kZXNcbiAgICAgKiBAcGFyYW0gbmV3V2Fsa2VyIFRoZSBuZXcgbm9kZSB3ZSdyZSBuYXZpZ2F0aW5nIHRvXG4gICAgICogQHBhcmFtIG9sZFdhbGtlciBUaGUgcHJldmlvdXMgbm9kZSB3ZSB3ZXJlIGF0XG4gICAgICogQHJldHVybnMgQXJyYXkgb2YgY29udGFpbmVyIGNoYW5nZSBtZXNzYWdlc1xuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZGlmZkNvbnRhaW5lcnMobW9kZTogTmF2aWdhdGlvbk1vZGUgfCBcImZvY3VzXCIsIG5ld1dhbGtlcjogU1JDdXJzb3IsIG9sZFdhbGtlcj86IFNSQ3Vyc29yKTogeyBsZWF2aW5nOiBzdHJpbmdbXSwgZW50ZXJpbmc6IHN0cmluZ1tdIH0ge1xuICAgICAgICBjb25zdCBERUJVRyA9IGZhbHNlO1xuICAgICAgICBERUJVRyAmJiBjb25zb2xlLmxvZyhcIi09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LVwiKTtcbiAgICAgICAgREVCVUcgJiYgY29uc29sZS5sb2coXCJBKVwiLCBvbGRXYWxrZXIuZ2V0Tm9kZSgpLm5vZGVOYW1lLCBuZXdXYWxrZXIuZ2V0Tm9kZSgpLm5vZGVOYW1lKTtcbiAgICAgICAgbGV0IGxlYXZpbmc6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGxldCBlbnRlcmluZzogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGRvY1Jvb3QgPSBuZXdXYWxrZXIgP1xuICAgICAgICAgICAgICAgIChuZXdXYWxrZXIuZ2V0Tm9kZSgpLm93bmVyRG9jdW1lbnQuYm9keSB8fCBuZXdXYWxrZXIuZ2V0Tm9kZSgpLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSA6XG4gICAgICAgICAgICAgICAgb2xkV2Fsa2VyID9cbiAgICAgICAgICAgICAgICAgICAgKG9sZFdhbGtlci5nZXROb2RlKCkub3duZXJEb2N1bWVudC5ib2R5IHx8IG9sZFdhbGtlci5nZXROb2RlKCkub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIDpcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keSB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG5cbiAgICAgICAgICAgIGxldCB3YWxrTmV3ID0gbmV3V2Fsa2VyID8gbmV3V2Fsa2VyLmNsb25lKCkgOiAobmV3IFNSQ3Vyc29yKGRvY1Jvb3QpKTtcbiAgICAgICAgICAgIGxldCB3YWxrT2xkID0gb2xkV2Fsa2VyID8gb2xkV2Fsa2VyLmNsb25lKCkgOiAobmV3IFNSQ3Vyc29yKGRvY1Jvb3QpKTtcbiAgICAgICAgICAgIGlmICghd2Fsa05ldy5nZXROb2RlKCkuaXNTYW1lTm9kZSh3YWxrT2xkLmdldE5vZGUoKSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgY29tbW9uUGFyZW50ID0gU1JDb250cm9sbGVyLmNvbW1vblBhcmVudCh3YWxrTmV3LCB3YWxrT2xkKTtcbiAgICAgICAgICAgICAgICBpZiAoY29tbW9uUGFyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIERFQlVHICYmIGNvbnNvbGUubG9nKFwiQilcIiwgY29tbW9uUGFyZW50LmdldE5vZGUoKS5ub2RlTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChjb21tb25QYXJlbnQuY29udGFpbnMod2Fsa05ldykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHICYmIGNvbnNvbGUubG9nKFwiRW50ZXJpbmc6XCIsIHdhbGtOZXcuZ2V0Tm9kZSgpLm5vZGVOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudGVyaW5nLnB1c2goU1JSZW5kZXJlci5yZW5kZXJFbnRlcihtb2RlLCB3YWxrTmV3LCB3YWxrT2xkKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB3YWxrTmV3LnBhcmVudCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVudGVyaW5nLnJldmVyc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgZW50ZXJpbmcgPSBlbnRlcmluZy5maWx0ZXIocyA9PiBzICYmIHMudHJpbSgpLmxlbmd0aCA+IDApLm1hcChzID0+IHMudHJpbSgpKTs7XG5cbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNvbW1vblBhcmVudC5jb250YWlucyh3YWxrT2xkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgREVCVUcgJiYgY29uc29sZS5sb2coXCJMZWF2aW5nOlwiLCB3YWxrT2xkLmdldE5vZGUoKS5ub2RlTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZWF2aW5nLnB1c2goU1JSZW5kZXJlci5yZW5kZXJMZWF2ZShtb2RlLCB3YWxrT2xkLCB3YWxrT2xkKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB3YWxrT2xkLnBhcmVudCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxlYXZpbmcgPSBsZWF2aW5nLmZpbHRlcihzID0+IHMgJiYgcy50cmltKCkubGVuZ3RoID4gMCkubWFwKHMgPT4gcy50cmltKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgIH1cbiAgICAgICAgREVCVUcgJiYgY29uc29sZS5sb2cobGVhdmluZywgZW50ZXJpbmcpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsZWF2aW5nLFxuICAgICAgICAgICAgZW50ZXJpbmdcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBjb21tb25QYXJlbnQod2Fsa2VyT25lOiBTUkN1cnNvciwgd2Fsa2VyVHdvOiBTUkN1cnNvcik6IFNSQ3Vyc29yIHtcbiAgICAgICAgaWYgKHdhbGtlck9uZS5jb250YWlucyh3YWxrZXJUd28pKSB7XG4gICAgICAgICAgICByZXR1cm4gd2Fsa2VyT25lLmNsb25lKCk7XG4gICAgICAgIH0gZWxzZSBpZiAod2Fsa2VyVHdvLmNvbnRhaW5zKHdhbGtlck9uZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB3YWxrZXJUd28uY2xvbmUoKTsgXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgY29tbW9uUGFyZW50OiBTUkN1cnNvciA9IHdhbGtlck9uZS5jbG9uZSgpO1xuICAgICAgICAgICAgd2hpbGUgKCFjb21tb25QYXJlbnQuY29udGFpbnMod2Fsa2VyVHdvKSAmJiBjb21tb25QYXJlbnQucGFyZW50KCkpO1xuICAgICAgICAgICAgaWYgKCFjb21tb25QYXJlbnQuY29udGFpbnMod2Fsa2VyT25lKSB8fCAhY29tbW9uUGFyZW50LmNvbnRhaW5zKHdhbGtlclR3bykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH0gXG4gICAgICAgICAgICByZXR1cm4gY29tbW9uUGFyZW50O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyByZW5kZXJBbGwobW9kZTogTmF2aWdhdGlvbk1vZGUpOiBzdHJpbmdbXSB7XG4gICAgICAgIGxldCBjdHJsID0gU1JDb250cm9sbGVyLmdldENvbnRyb2xsZXIoKTtcbiAgICAgICAgbGV0IGRpYWxvZ3MgPSBjdHJsLmN0cmxEb2MuYm9keS5xdWVyeVNlbGVjdG9yQWxsKFwiZGlhbG9nLFtyb2xlPSdkaWFsb2cnXVwiKTtcbiAgICAgICAgZGlhbG9ncy5mb3JFYWNoKGRpYWxvZyA9PiB7XG4gICAgICAgICAgICBpZiAoU1JVdGlsLmlzTW9kYWxEaWFsb2dFbGVtZW50KGRpYWxvZykpIHtcbiAgICAgICAgICAgICAgICBjdHJsLnNldFBvaW50T2ZSZWdhcmQoZGlhbG9nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgbGV0IHJlc3VsdHM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIC8vIEhhbmRsZSB0aGUgaW5pdGlhbCBpdGVtIGZpcnN0IChpZiB0aGVyZSBpcyBvbmUpXG4gICAgICAgIGxldCBzdGFydGVyTXNnID0gU1JSZW5kZXJlci5yZW5kZXJDdXJyZW50KG1vZGUsIGN0cmwuZ2V0UG9pbnRPZlJlZ2FyZCgpLCB7ZW50ZXJpbmc6IFtdLCBsZWF2aW5nOiBbXX0pO1xuICAgICAgICBpZiAoc3RhcnRlck1zZykge1xuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHN0YXJ0ZXJNc2cubWVzc2FnZSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYkNvbnRpbnVlID0gdHJ1ZTtcbiAgICAgICAgd2hpbGUgKGJDb250aW51ZSkge1xuICAgICAgICAgICAgbGV0IG5leHRWYWwgPSBjdHJsLmp1bXBOZXh0KG1vZGUpO1xuICAgICAgICAgICAgaWYgKG5leHRWYWwuc3VjY2Vzcykge1xuICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaChuZXh0VmFsLnJlbmRlcmluZ1Jlc3VsdC5tZXNzYWdlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYkNvbnRpbnVlID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyByZW5kZXJBbGxEZXRhaWwoZG9jOiBIVE1MRG9jdW1lbnQsIG1vZGU6IE5hdmlnYXRpb25Nb2RlKTogUmVuZGVyUmVzdWx0W10ge1xuICAgICAgICBsZXQgY3RybCA9IFNSQ29udHJvbGxlci5nZXRDb250cm9sbGVyKGRvYyk7XG4gICAgICAgIGN0cmwuc2V0UG9pbnRPZlJlZ2FyZChkb2MuYm9keSk7XG4gICAgICAgIGxldCBkaWFsb2dzID0gZG9jLmJvZHkucXVlcnlTZWxlY3RvckFsbChcImRpYWxvZyxbcm9sZT0nZGlhbG9nJ11cIik7XG4gICAgICAgIGRpYWxvZ3MuZm9yRWFjaChkaWFsb2cgPT4ge1xuICAgICAgICAgICAgaWYgKFNSVXRpbC5pc01vZGFsRGlhbG9nRWxlbWVudChkaWFsb2cpKSB7XG4gICAgICAgICAgICAgICAgY3RybC5zZXRQb2ludE9mUmVnYXJkKGRpYWxvZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIGxldCByZXN1bHRzOiBSZW5kZXJSZXN1bHRbXSA9IFtdO1xuICAgICAgICAvLyBIYW5kbGUgdGhlIGluaXRpYWwgaXRlbSBmaXJzdCAoaWYgdGhlcmUgaXMgb25lKVxuICAgICAgICBsZXQgc3RhcnRlck1zZyA9IFNSUmVuZGVyZXIucmVuZGVyQ3VycmVudChtb2RlLCBjdHJsLmdldFBvaW50T2ZSZWdhcmQoKSwge2VudGVyaW5nOiBbXSwgbGVhdmluZzogW119KTtcbiAgICAgICAgaWYgKHN0YXJ0ZXJNc2cpIHtcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaChzdGFydGVyTXNnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBiQ29udGludWUgPSB0cnVlO1xuICAgICAgICB3aGlsZSAoYkNvbnRpbnVlKSB7XG4gICAgICAgICAgICBsZXQgbmV4dFZhbCA9IGN0cmwuanVtcE5leHQobW9kZSk7XG4gICAgICAgICAgICBpZiAobmV4dFZhbC5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgLy8gbW9kZSA9PT0gXCJpdGVtXCIgJiYgY29uc29sZS5sb2cobmV4dFZhbCk7XG4gICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKG5leHRWYWwucmVuZGVyaW5nUmVzdWx0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYkNvbnRpbnVlID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyByZW5kZXJTdHJ1Y3R1cmUoZG9jOiBIVE1MRG9jdW1lbnQpOiBBcnJheTx7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9PiB7XG4gICAgICAgIGNvbnN0IG1vZGVzOiBOYXZpZ2F0aW9uTW9kZVtdID0gWyBcInJlZ2lvblwiLCBcImhlYWRpbmdcIiwgXCJpdGVtXCIsIFwidGFiX2ZvY3VzXCIsIFwiaW1hZ2VcIiBdO1xuICAgICAgICBsZXQgZGV0YWlscyA9IG1vZGVzLm1hcChtb2RlTGFiZWwgPT4gU1JDb250cm9sbGVyLnJlbmRlckFsbERldGFpbChkb2MsIG1vZGVMYWJlbCkpO1xuICAgICAgICBsZXQgcmV0VmFsOiBBcnJheTx7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9PiA9IFtdO1xuICAgICAgICB3aGlsZSAoZGV0YWlscy5zb21lKGRldGFpbCA9PiBkZXRhaWwubGVuZ3RoID4gMCkpIHtcbiAgICAgICAgICAgIGxldCBuZXh0ID0gZGV0YWlsc1swXVswXT8uc3RhcnQ7XG4gICAgICAgICAgICBtb2Rlcy5mb3JFYWNoKChtb2RlLCBpZHgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZGV0YWlsc1tpZHhdLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFuZXh0IHx8IFNSQ3Vyc29yLmNvbXBhcmUoZGV0YWlsc1tpZHhdWzBdLnN0YXJ0LCBuZXh0KSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgPSBkZXRhaWxzW2lkeF1bMF0uc3RhcnQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgbGV0IG5leHRJdGVtOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge307XG4gICAgICAgICAgICBsZXQgaGFzVmFsdWUgPSBmYWxzZTtcbiAgICAgICAgICAgIG1vZGVzLmZvckVhY2goKG1vZGUsIGlkeCkgPT4ge1xuICAgICAgICAgICAgICAgIG5leHRJdGVtW21vZGVdID0gXCJcIjtcbiAgICAgICAgICAgICAgICBpZiAoZGV0YWlsc1tpZHhdLmxlbmd0aCA+IDAgJiYgU1JDdXJzb3IuY29tcGFyZShkZXRhaWxzW2lkeF1bMF0uc3RhcnQsIG5leHQpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIG5leHRJdGVtW21vZGVdID0gZGV0YWlsc1tpZHhdLnNoaWZ0KCkubWVzc2FnZTtcbiAgICAgICAgICAgICAgICAgICAgaGFzVmFsdWUgPSBuZXh0SXRlbVttb2RlXSAhPT0gXCJcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKGhhc1ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbSA9IG5leHQuZ2V0RWxlbWVudCgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdG9yID0gZWxlbSAmJiBTUlV0aWwuZ2V0VW5pcXVlU2VsZWN0b3IoZWxlbSk7XG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdG9yICYmIGRvYy5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKSkge1xuICAgICAgICAgICAgICAgICAgICBuZXh0SXRlbS5zZWxlY3RvciA9IHNlbGVjdG9yO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXRWYWwucHVzaChuZXh0SXRlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG59IiwiaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01XYWxrZXJcIjtcbmltcG9ydCB7IEFjY2Vzc2libGVOYW1lUmVzdWx0LCBBY2NOYW1lVXRpbCB9IGZyb20gXCIuLi91dGlsL0FjY05hbWVVdGlsXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgU1JVdGlsIH0gZnJvbSBcIi4vU1JVdGlsXCI7XG5cbi8qKlxuICogRnVuY3Rpb24gdHlwZSBmb3IgbWF0Y2hpbmcgbm9kZXMgZHVyaW5nIGN1cnNvciBuYXZpZ2F0aW9uXG4gKiBAcGFyYW0gcm9sZSAtIFRoZSBBUklBIHJvbGUgb2YgdGhlIGN1cnJlbnQgbm9kZVxuICogQHBhcmFtIGJTdGFydFRhZyAtIFdoZXRoZXIgdGhpcyBpcyBhIHN0YXJ0IHRhZyAodHJ1ZSkgb3IgZW5kIHRhZyAoZmFsc2UpXG4gKiBAcGFyYW0gbm9kZSAtIFRoZSBET00gbm9kZSBiZWluZyBldmFsdWF0ZWRcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIG5vZGUgbWF0Y2hlcyB0aGUgY3JpdGVyaWEsIGZhbHNlIG90aGVyd2lzZVxuICovXG5leHBvcnQgdHlwZSBTUkN1cnNvck1hdGNoRnVuYyA9IChyb2xlOiBzdHJpbmcsIGJTdGFydFRhZzogYm9vbGVhbiwgbm9kZTogTm9kZSkgPT4gYm9vbGVhbjtcblxuZXhwb3J0IHR5cGUgU1JDdXJzb3JTa2lwRnVuYyA9IChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7IHNraXBDdXJyZW50OiBib29sZWFuLCBza2lwQ2hpbGRyZW46IGJvb2xlYW59IHwgbnVsbDtcblxuLyoqXG4gKiBTUkN1cnNvciAoU2NyZWVuIFJlYWRlciBDdXJzb3IpIGNsYXNzXG4gKlxuICogVGhpcyBjbGFzcyBwcm92aWRlcyBhIGN1cnNvci1saWtlIGludGVyZmFjZSBmb3IgbmF2aWdhdGluZyB0aGUgRE9NIGluIGEgd2F5IHRoYXRcbiAqIHNpbXVsYXRlcyBob3cgc2NyZWVuIHJlYWRlcnMgcHJvY2VzcyBhbmQgbmF2aWdhdGUgY29udGVudC4gSXQgdHJhY2tzOlxuICogLSBUaGUgY3VycmVudCBub2RlIHBvc2l0aW9uXG4gKiAtIFdoZXRoZXIgaXQncyBhdCBhIHN0YXJ0IG9yIGVuZCB0YWdcbiAqIC0gVGhlIEFSSUEgcm9sZSBvZiB0aGUgY3VycmVudCBub2RlXG4gKiAtIFRoZSBhY2Nlc3NpYmxlIG5hbWUgb2YgdGhlIGN1cnJlbnQgbm9kZVxuICovXG5leHBvcnQgY2xhc3MgU1JDdXJzb3Ige1xuICAgIC8qKiBUaGUgQVJJQSByb2xlIG9mIHRoZSBjdXJyZW50IG5vZGUgKi9cbiAgICBwcml2YXRlIHJvbGU6IHN0cmluZztcbiAgICAvKiogVGhlIGNvbXB1dGVkIGFjY2Vzc2libGUgbmFtZSBvZiB0aGUgY3VycmVudCBub2RlICovXG4gICAgcHJpdmF0ZSBuYW1lOiBBY2Nlc3NpYmxlTmFtZVJlc3VsdDtcbiAgICAvKiogVGhlIHVuZGVybHlpbmcgRE9NIHdhbGtlciB0aGF0IGhhbmRsZXMgbm9kZSB0cmF2ZXJzYWwgKi9cbiAgICBwcml2YXRlIHdhbGtlcjogRE9NV2Fsa2VyO1xuICAgIFxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgU1JDdXJzb3IgcG9zaXRpb25lZCBhdCB0aGUgc3BlY2lmaWVkIGVsZW1lbnRcbiAgICAgKiBAcGFyYW0gZWxlbWVudCAtIFRoZSBET00gbm9kZSB0byBwb3NpdGlvbiB0aGUgY3Vyc29yIGF0XG4gICAgICogQHBhcmFtIGJFbmQgLSBXaGV0aGVyIHRvIHBvc2l0aW9uIGF0IHRoZSBlbmQgdGFnICh0cnVlKSBvciBzdGFydCB0YWcgKGZhbHNlKVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGVsZW1lbnQgOiBOb2RlLCBiRW5kPyA6IGJvb2xlYW4pIHtcbiAgICAgICAgLy8gVXNlIERPTVdhbGtlciB3aXRoIGNvbnNpZGVySGlkZGVuPWZhbHNlIHRvIHByb2Nlc3MgYWxsIGNvbnRlbnQgKGluY2x1ZGluZyBoaWRkZW4gZWxlbWVudHMpXG4gICAgICAgIC8vIFRoaXMgaXMgaW1wb3J0YW50IGZvciBzY3JlZW4gcmVhZGVyIHNpbXVsYXRpb24gd2hpY2ggbmVlZHMgdG8gc2VlIGFsbCBjb250ZW50XG4gICAgICAgIHRoaXMud2Fsa2VyID0gbmV3IERPTVdhbGtlcihlbGVtZW50LCBiRW5kLCB1bmRlZmluZWQsIGZhbHNlKTtcbiAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaE5hbWUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjb3B5IG9mIHRoaXMgY3Vyc29yIGF0IHRoZSBzYW1lIHBvc2l0aW9uXG4gICAgICogQHJldHVybnMgQSBuZXcgU1JDdXJzb3IgaW5zdGFuY2Ugd2l0aCB0aGUgc2FtZSBwb3NpdGlvbiBhbmQgcHJvcGVydGllc1xuICAgICAqL1xuICAgIGNsb25lKCkgOiBTUkN1cnNvciB7XG4gICAgICAgIGxldCByZXRWYWwgPSBuZXcgU1JDdXJzb3IodGhpcy53YWxrZXIubm9kZSwgdGhpcy53YWxrZXIuYkVuZFRhZyk7XG4gICAgICAgIHJldFZhbC5yb2xlID0gdGhpcy5yb2xlO1xuICAgICAgICByZXRWYWwubmFtZSA9IHRoaXMubmFtZTtcbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHRoZSByb2xlIGFuZCBhY2Nlc3NpYmxlIG5hbWUgcHJvcGVydGllcyBiYXNlZCBvbiB0aGUgY3VycmVudCBub2RlXG4gICAgICogVGhpcyBpcyBjYWxsZWQgd2hlbmV2ZXIgdGhlIGN1cnNvciBwb3NpdGlvbiBjaGFuZ2VzXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlZnJlc2hOYW1lKCkge1xuICAgICAgICBpZiAodGhpcy53YWxrZXIubm9kZS5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgLy8gRWxlbWVudCBub2RlXG4gICAgICAgICAgICB0aGlzLnJvbGUgPSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUodGhpcy53YWxrZXIubm9kZSBhcyBIVE1MRWxlbWVudCwgdHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLm5hbWUgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWUodGhpcy53YWxrZXIubm9kZSBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy53YWxrZXIubm9kZS5ub2RlVHlwZSA9PT0gMykge1xuICAgICAgICAgICAgLy8gVGV4dCBub2RlXG4gICAgICAgICAgICB0aGlzLnJvbGUgPSBcInRleHRcIjtcbiAgICAgICAgICAgIHRoaXMubmFtZSA9IHsgbmFtZTogdGhpcy53YWxrZXIubm9kZS50ZXh0Q29udGVudCwgbmFtZUZyb206IFwidGV4dFwiIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBPdGhlciBub2RlIHR5cGVzXG4gICAgICAgICAgICB0aGlzLnJvbGUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0aGlzLm5hbWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNb3ZlcyB0aGUgY3Vyc29yIHRvIHRoZSBuZXh0IG5vZGUgdGhhdCBtYXRjaGVzIHRoZSBwcm92aWRlZCBjcml0ZXJpYVxuICAgICAqIEBwYXJhbSBtYXRjaGluZ0Z1bmMgLSBGdW5jdGlvbiB0aGF0IGRldGVybWluZXMgaWYgYSBub2RlIG1hdGNoZXMgdGhlIHNlYXJjaCBjcml0ZXJpYVxuICAgICAqIEByZXR1cm5zIHRydWUgaWYgYSBtYXRjaGluZyBub2RlIHdhcyBmb3VuZCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgICovXG4gICAgcHVibGljIG5leHQobWF0Y2hpbmdGdW5jOiBTUkN1cnNvck1hdGNoRnVuYywgc2tpcEZ1bmM/OiBTUkN1cnNvclNraXBGdW5jKSA6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBERUJVRyA9IGZhbHNlO1xuXG4gICAgICAgIC8vIGNvbnN0IERFQlVHID0gZmFsc2U7XG4gICAgICAgIGxldCBmb3VuZE5leHQgPSBmYWxzZTtcblxuICAgICAgICAvLyBHZXQgdGhlIHNraXAgaW5mbyBmb3IgdGhlIGN1cnJlbnQgc3BvdFxuICAgICAgICB0aGlzLnJlZnJlc2hOYW1lKCk7XG4gICAgICAgIERFQlVHICYmIGNvbnNvbGUuZ3JvdXAoYG5leHQgZnVuY3Rpb25gKTtcbiAgICAgICAgREVCVUcgJiYgY29uc29sZS5sb2codGhpcy5pc0VuZFRhZygpP1wiL1wiOlwiXCIsIHRoaXMuZ2V0Tm9kZSgpKTtcbiAgICAgICAgbGV0IHsgc2tpcEN1cnJlbnQsIHNraXBDaGlsZHJlbiB9ID0gKHNraXBGdW5jICYmIHNraXBGdW5jKHRoaXMpKSB8fCB7IHNraXBDdXJyZW50OiBmYWxzZSwgc2tpcENoaWxkcmVuOiBmYWxzZSB9O1xuICAgICAgICBERUJVRyAmJiBjb25zb2xlLmxvZyhcInNraXBDdXJyZW50OlwiLCBza2lwQ3VycmVudCwgXCJza2lwQ2hpbGRyZW46XCIsIHNraXBDaGlsZHJlbik7XG5cbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgLy8gTW92ZSBhcyBhcHByb3ByaWF0ZSBmcm9tIHRoZSBjdXJyZW50IHNwb3RcbiAgICAgICAgICAgIGlmIChza2lwQ2hpbGRyZW4gJiYgIXRoaXMud2Fsa2VyLmJFbmRUYWcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLndhbGtlci5iRW5kVGFnID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMud2Fsa2VyLm5leHROb2RlKCkpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBza2lwIGluZm8gZm9yIHRoZSBuZXcgc3BvdFxuICAgICAgICAgICAgdGhpcy5yZWZyZXNoTmFtZSgpO1xuICAgICAgICAgICAgREVCVUcgJiYgY29uc29sZS5sb2codGhpcy5pc0VuZFRhZygpP1wiL1wiOlwiXCIsIHRoaXMuZ2V0Tm9kZSgpKTtcbiAgICAgICAgICAgICh7IHNraXBDdXJyZW50LCBza2lwQ2hpbGRyZW4gfSA9IChza2lwRnVuYyAmJiBza2lwRnVuYyh0aGlzKSkgfHwgeyBza2lwQ3VycmVudDogZmFsc2UsIHNraXBDaGlsZHJlbjogZmFsc2UgfSk7XG4gICAgICAgICAgICBERUJVRyAmJiBjb25zb2xlLmxvZyhcInNraXBDdXJyZW50OlwiLCBza2lwQ3VycmVudCwgXCJza2lwQ2hpbGRyZW46XCIsIHNraXBDaGlsZHJlbik7XG5cbiAgICAgICAgICAgIC8vIFVwZGF0ZSByb2xlIGJhc2VkIG9uIG5vZGUgdHlwZVxuICAgICAgICAgICAgaWYgKHRoaXMud2Fsa2VyLm5vZGUubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJvbGUgPSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUodGhpcy53YWxrZXIubm9kZSBhcyBIVE1MRWxlbWVudCwgdHJ1ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMud2Fsa2VyLm5vZGUubm9kZVR5cGUgPT09IDMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJvbGUgPSBcInRleHRcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChTUlV0aWwuaXNNb2RhbERpYWxvZ0VsZW1lbnQodGhpcy5nZXROb2RlKCkpICYmIHRoaXMuaXNFbmRUYWcoKSkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXNraXBDdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBub2RlIG1hdGNoZXMgb3VyIGNyaXRlcmlhXG4gICAgICAgICAgICAgICAgZm91bmROZXh0ID0gbWF0Y2hpbmdGdW5jKHRoaXMucm9sZSwgIXRoaXMud2Fsa2VyLmJFbmRUYWcsIHRoaXMud2Fsa2VyLm5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IHdoaWxlICghZm91bmROZXh0KTtcbiAgICAgICAgREVCVUcgJiYgY29uc29sZS5sb2coXCJmb3VuZE5leHQ6XCIsIGZvdW5kTmV4dCwgdGhpcy5pc0VuZFRhZygpP1wiL1wiOlwiXCIsIHRoaXMuZ2V0Tm9kZSgpKTtcbiAgICAgICAgREVCVUcgJiYgY29uc29sZS5ncm91cEVuZCgpO1xuXG4gICAgICAgIGlmIChmb3VuZE5leHQpIHtcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaE5hbWUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFJlc2V0IHByb3BlcnRpZXMgaWYgbm8gbWF0Y2ggd2FzIGZvdW5kXG4gICAgICAgICAgICB0aGlzLnJvbGUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0aGlzLm5hbWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZvdW5kTmV4dDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNb3ZlcyB0aGUgY3Vyc29yIHRvIHRoZSBwcmV2aW91cyBub2RlIHRoYXQgbWF0Y2hlcyB0aGUgcHJvdmlkZWQgY3JpdGVyaWFcbiAgICAgKiBAcGFyYW0gbWF0Y2hpbmdGdW5jIC0gRnVuY3Rpb24gdGhhdCBkZXRlcm1pbmVzIGlmIGEgbm9kZSBtYXRjaGVzIHRoZSBzZWFyY2ggY3JpdGVyaWFcbiAgICAgKiBAcmV0dXJucyB0cnVlIGlmIGEgbWF0Y2hpbmcgbm9kZSB3YXMgZm91bmQsIGZhbHNlIG90aGVyd2lzZVxuICAgICAqL1xuICAgIHB1YmxpYyBwcmV2aW91cyhtYXRjaGluZ0Z1bmM6IFNSQ3Vyc29yTWF0Y2hGdW5jLCBza2lwRnVuYz86IFNSQ3Vyc29yU2tpcEZ1bmMpIDogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IERFQlVHID0gZmFsc2U7XG4gICAgICAgIGxldCBmb3VuZFByZXZpb3VzID0gZmFsc2U7XG5cbiAgICAgICAgLy8gR2V0IHRoZSBza2lwIGluZm8gZm9yIHRoZSBjdXJyZW50IHNwb3RcbiAgICAgICAgdGhpcy5yZWZyZXNoTmFtZSgpO1xuICAgICAgICBERUJVRyAmJiBjb25zb2xlLmdyb3VwKGBwcmV2aW91cyBmdW5jdGlvbmApO1xuICAgICAgICBERUJVRyAmJiBjb25zb2xlLmxvZyh0aGlzLmlzRW5kVGFnKCksIHRoaXMuZ2V0Tm9kZSgpKTtcbiAgICAgICAgbGV0IHsgc2tpcEN1cnJlbnQsIHNraXBDaGlsZHJlbiB9ID0gKHNraXBGdW5jICYmIHNraXBGdW5jKHRoaXMpKSB8fCB7IHNraXBDdXJyZW50OiBmYWxzZSwgc2tpcENoaWxkcmVuOiBmYWxzZSB9O1xuICAgICAgICBERUJVRyAmJiBjb25zb2xlLmxvZyhza2lwQ3VycmVudCwgc2tpcENoaWxkcmVuKTtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgLy8gTW92ZSBhcyBhcHByb3ByaWF0ZSBmcm9tIHRoZSBjdXJyZW50IHNwb3RcbiAgICAgICAgICAgIGlmIChza2lwQ2hpbGRyZW4gJiYgdGhpcy53YWxrZXIuYkVuZFRhZykge1xuICAgICAgICAgICAgICAgIERFQlVHICYmIGNvbnNvbGUubG9nKFwiU2tpcHBpbmcgbm9kZVwiKVxuICAgICAgICAgICAgICAgIHRoaXMud2Fsa2VyLmJFbmRUYWcgPSBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMud2Fsa2VyLnByZXZOb2RlKCkpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBza2lwIGluZm8gZm9yIHRoZSBuZXcgc3BvdFxuICAgICAgICAgICAgdGhpcy5yZWZyZXNoTmFtZSgpO1xuICAgICAgICAgICAgREVCVUcgJiYgY29uc29sZS5sb2codGhpcy5pc0VuZFRhZygpLCB0aGlzLmdldE5vZGUoKSk7XG4gICAgICAgICAgICAoeyBza2lwQ3VycmVudCwgc2tpcENoaWxkcmVuIH0gPSAoc2tpcEZ1bmMgJiYgc2tpcEZ1bmModGhpcykpIHx8IHsgc2tpcEN1cnJlbnQ6IGZhbHNlLCBza2lwQ2hpbGRyZW46IGZhbHNlIH0pO1xuICAgICAgICAgICAgREVCVUcgJiYgY29uc29sZS5sb2coc2tpcEN1cnJlbnQsIHNraXBDaGlsZHJlbik7XG5cbiAgICAgICAgICAgIC8vIFVwZGF0ZSByb2xlIGJhc2VkIG9uIG5vZGUgdHlwZVxuICAgICAgICAgICAgaWYgKHRoaXMud2Fsa2VyLm5vZGUubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJvbGUgPSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUodGhpcy53YWxrZXIubm9kZSBhcyBIVE1MRWxlbWVudCwgdHJ1ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMud2Fsa2VyLm5vZGUubm9kZVR5cGUgPT09IDMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJvbGUgPSBcInRleHRcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChTUlV0aWwuaXNNb2RhbERpYWxvZ0VsZW1lbnQodGhpcy5nZXROb2RlKCkpICYmICF0aGlzLmlzRW5kVGFnKCkpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghc2tpcEN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGlzIG5vZGUgbWF0Y2hlcyBvdXIgY3JpdGVyaWFcbiAgICAgICAgICAgICAgICBmb3VuZFByZXZpb3VzID0gbWF0Y2hpbmdGdW5jKHRoaXMucm9sZSwgIXRoaXMud2Fsa2VyLmJFbmRUYWcsIHRoaXMud2Fsa2VyLm5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IHdoaWxlICghZm91bmRQcmV2aW91cyk7XG4gICAgICAgIERFQlVHICYmIGNvbnNvbGUubG9nKHRoaXMuaXNFbmRUYWcoKSwgdGhpcy5nZXROb2RlKCkpO1xuICAgICAgICBERUJVRyAmJiBjb25zb2xlLmdyb3VwRW5kKCk7XG4gICAgICAgIGlmIChmb3VuZFByZXZpb3VzKSB7XG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hOYW1lKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBSZXNldCBwcm9wZXJ0aWVzIGlmIG5vIG1hdGNoIHdhcyBmb3VuZFxuICAgICAgICAgICAgdGhpcy5yb2xlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5uYW1lID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmb3VuZFByZXZpb3VzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1vdmVzIHRoZSBjdXJzb3IgdG8gdGhlIHBhcmVudCBub2RlIG9mIHRoZSBjdXJyZW50IG5vZGVcbiAgICAgKiBAcGFyYW0gZW5kVGFnIC0gV2hldGhlciB0byBwb3NpdGlvbiBhdCB0aGUgZW5kIHRhZyAodHJ1ZSkgb3Igc3RhcnQgdGFnIChmYWxzZSlcbiAgICAgKiBAcmV0dXJucyB0cnVlIGlmIHN1Y2Nlc3NmdWxseSBtb3ZlZCB0byBwYXJlbnQsIGZhbHNlIGlmIG5vIHBhcmVudCBleGlzdHNcbiAgICAgKi9cbiAgICBwdWJsaWMgcGFyZW50KGVuZFRhZz86IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKCF0aGlzLndhbGtlci5ub2RlLnBhcmVudE5vZGUpIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpcy53YWxrZXIubm9kZSA9IHRoaXMud2Fsa2VyLm5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgdGhpcy53YWxrZXIuYkVuZFRhZyA9IGVuZFRhZyA9PT0gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMud2Fsa2VyLm5vZGUubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgICAgICAgIHRoaXMucm9sZSA9IEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZSh0aGlzLndhbGtlci5ub2RlIGFzIEhUTUxFbGVtZW50LCB0cnVlKTtcbiAgICAgICAgICAgIHRoaXMubmFtZSA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZSh0aGlzLndhbGtlci5ub2RlIGFzIEhUTUxFbGVtZW50KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLndhbGtlci5ub2RlLm5vZGVUeXBlID09PSAzKSB7XG4gICAgICAgICAgICB0aGlzLnJvbGUgPSBcInRleHRcIjtcbiAgICAgICAgICAgIHRoaXMubmFtZSA9IHsgbmFtZTogdGhpcy53YWxrZXIubm9kZS50ZXh0Q29udGVudCwgbmFtZUZyb206IFwidGV4dFwiIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJvbGUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0aGlzLm5hbWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTW92ZXMgdGhlIGN1cnNvciB1cCB0aGUgRE9NIHRyZWUgdW50aWwgZmluZGluZyBhIG5vZGUgd2l0aCBhIG1hdGNoaW5nIHJvbGUgb3IgZWxlbWVudCBuYW1lXG4gICAgICogQHBhcmFtIHJvbGVzIC0gQXJyYXkgb2YgQVJJQSByb2xlcyB0byBtYXRjaFxuICAgICAqIEBwYXJhbSBlbGVtcyAtIE9wdGlvbmFsIGFycmF5IG9mIGVsZW1lbnQgbmFtZXMgdG8gbWF0Y2hcbiAgICAgKiBAcmV0dXJucyB0cnVlIGlmIGEgbWF0Y2hpbmcgbm9kZSB3YXMgZm91bmQsIGZhbHNlIG90aGVyd2lzZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRDdXJyZW50T3JQYXJlbnRCeVJvbGUocm9sZXM6IHN0cmluZ1tdLCBlbGVtcz86IHN0cmluZ1tdKSB7XG4gICAgICAgIGNvbnN0IHVwcEVsZW1zID0gZWxlbXMgPyBlbGVtcy5tYXAoZWxlbSA9PiBlbGVtLnRvVXBwZXJDYXNlKCkpIDogW107XG4gICAgICAgIGNvbnN0IG1hdGNoZXMgPSAod2Fsa2VyOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgY29uc3QgZWxlbSA9IHdhbGtlci5nZXRFbGVtZW50KCk7XG4gICAgICAgICAgICByZXR1cm4gcm9sZXMuaW5jbHVkZXModGhpcy5nZXRSb2xlKCkpXG4gICAgICAgICAgICB8fCAoZWxlbSAmJiAhZWxlbS5oYXNBdHRyaWJ1dGUoXCJyb2xlXCIpICYmIHVwcEVsZW1zLmluY2x1ZGVzKGVsZW0ubm9kZU5hbWUudG9VcHBlckNhc2UoKSkpO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlICghbWF0Y2hlcyh0aGlzKSAmJiB0aGlzLnBhcmVudCgpKTtcbiAgICAgICAgcmV0dXJuIG1hdGNoZXModGhpcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBjdXJzb3IgYW5kIG1vdmVzIGl0IHVwIHRoZSBET00gdHJlZSB1bnRpbCBmaW5kaW5nIGEgbm9kZSB3aXRoIGEgbWF0Y2hpbmcgcm9sZSBvciBlbGVtZW50IG5hbWVcbiAgICAgKiBAcGFyYW0gcm9sZXMgLSBBcnJheSBvZiBBUklBIHJvbGVzIHRvIG1hdGNoXG4gICAgICogQHBhcmFtIGVsZW1zIC0gT3B0aW9uYWwgYXJyYXkgb2YgZWxlbWVudCBuYW1lcyB0byBtYXRjaFxuICAgICAqIEByZXR1cm5zIEEgbmV3IGN1cnNvciBhdCB0aGUgbWF0Y2hpbmcgbm9kZSwgb3IgbnVsbCBpZiBubyBtYXRjaCBmb3VuZFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRDdXJyZW50T3JQYXJlbnRCeVJvbGVDbG9uZShyb2xlczogc3RyaW5nW10sIGVsZW1zPzogc3RyaW5nW10pIHtcbiAgICAgICAgbGV0IHJldFZhbCA9IHRoaXMuY2xvbmUoKTtcbiAgICAgICAgaWYgKHJldFZhbC5nZXRDdXJyZW50T3JQYXJlbnRCeVJvbGUocm9sZXMsIGVsZW1zKSkge1xuICAgICAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Q3VycmVudE9yUGFyZW50VGFiYmFibGVDbG9uZSgpIHtcbiAgICAgICAgbGV0IHJldFZhbCA9IHRoaXMuY2xvbmUoKTtcbiAgICAgICAgd2hpbGUgKHJldFZhbCkge1xuICAgICAgICAgICAgY29uc3QgZWxlbSA9IHJldFZhbC5nZXRFbGVtZW50KCk7XG4gICAgICAgICAgICBpZiAocmV0VmFsLmlzU3RhcnRUYWcoKSAmJiBlbGVtICYmIENvbW1vblV0aWwuaXNUYWJiYWJsZShlbGVtKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXJldFZhbC5wYXJlbnQoZmFsc2UpKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgQVJJQSByb2xlIG9mIHRoZSBjdXJyZW50IG5vZGVcbiAgICAgKiBAcmV0dXJucyBUaGUgQVJJQSByb2xlIGFzIGEgc3RyaW5nLCBvciB1bmRlZmluZWQgaWYgbm90IGF2YWlsYWJsZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRSb2xlKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvbGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgYWNjZXNzaWJsZSBuYW1lIGluZm8gZm9yIHRoZSBjdXJyZW50IG5vZGVcbiAgICAgKiBAcmV0dXJucyBUaGUgQWNjZXNzaWJsZU5hbWVSZXN1bHQgb2JqZWN0LCBvciB1bmRlZmluZWQgaWYgbm90IGF2YWlsYWJsZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXROYW1lSW5mbygpOiBBY2Nlc3NpYmxlTmFtZVJlc3VsdCB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hbWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBhY2Nlc3NpYmxlIG5hbWUgb2YgdGhlIGN1cnJlbnQgbm9kZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXROYW1lKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgICAgIC8vIEhhbmRsZSBvbmUtb2ZmIHF1aXJrcyBpbiB0aGUgbmFtZSBjYWxjdWxhdGlvblxuICAgICAgICBjb25zdCBuYW1lSW5mbyA9IHRoaXMuZ2V0TmFtZUluZm8oKTtcbiAgICAgICAgaWYgKG5hbWVJbmZvICYmIG5hbWVJbmZvLm5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBuYW1lSW5mby5uYW1lO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVsZW0gPSB0aGlzLmdldEVsZW1lbnQoKTtcbiAgICAgICAgaWYgKGVsZW0pIHtcbiAgICAgICAgICAgIGNvbnN0IGxhYmVsRWxlbSA9IENvbW1vblV0aWwuZ2V0TGFiZWxGb3JFbGVtZW50SGlkZGVuKGVsZW0sIHRydWUpO1xuICAgICAgICAgICAgaWYgKGxhYmVsRWxlbSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBsYWJlbEVsZW0uaW5uZXJUZXh0IHx8IGxhYmVsRWxlbS50ZXh0Q29udGVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgd2hldGhlciB0aGUgY3Vyc29yIGlzIGF0IGFuIGVuZCB0YWcgb3Igc3RhcnQgdGFnXG4gICAgICogQHBhcmFtIHZhbCAtIFRydWUgZm9yIGVuZCB0YWcsIGZhbHNlIGZvciBzdGFydCB0YWdcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0RW5kVGFnKHZhbDogYm9vbGVhbikge1xuICAgICAgICB0aGlzLndhbGtlci5iRW5kVGFnID0gdmFsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIERPTSBub2RlIGF0IHRoZSBjdXJyZW50IGN1cnNvciBwb3NpdGlvblxuICAgICAqIEByZXR1cm5zIFRoZSBjdXJyZW50IERPTSBub2RlXG4gICAgICovXG4gICAgcHVibGljIGdldE5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLndhbGtlci5ub2RlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGN1cnJlbnQgbm9kZSBhcyBhbiBIVE1MRWxlbWVudCBpZiBpdCBpcyBhbiBlbGVtZW50IG5vZGVcbiAgICAgKiBAcmV0dXJucyBUaGUgY3VycmVudCBub2RlIGFzIEhUTUxFbGVtZW50LCBvciB1bmRlZmluZWQgaWYgbm90IGFuIGVsZW1lbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0RWxlbWVudCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLndhbGtlci5ub2RlKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICBpZiAodGhpcy53YWxrZXIubm9kZS5ub2RlVHlwZSAhPT0gMSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHRoaXMud2Fsa2VyLm5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFBhcmVudEVsZW1lbnQoKSB7XG4gICAgICAgIGlmICghdGhpcy53YWxrZXIubm9kZSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCByZXRWYWwgPSB0aGlzLmNsb25lKCk7XG4gICAgICAgIHJldFZhbC53YWxrZXIubm9kZSA9IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KHJldFZhbC53YWxrZXIubm9kZSk7XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSBjdXJzb3IgaXMgcG9zaXRpb25lZCBhdCBhbiBlbmQgdGFnXG4gICAgICogQHJldHVybnMgdHJ1ZSBpZiBhdCBhbiBlbmQgdGFnLCBmYWxzZSBpZiBhdCBhIHN0YXJ0IHRhZ1xuICAgICAqL1xuICAgIHB1YmxpYyBpc0VuZFRhZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud2Fsa2VyLmJFbmRUYWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSBjdXJzb3IgaXMgcG9zaXRpb25lZCBhdCBhbiBlbmQgdGFnXG4gICAgICogQHJldHVybnMgdHJ1ZSBpZiBhdCBhbiBlbmQgdGFnLCBmYWxzZSBpZiBhdCBhIHN0YXJ0IHRhZ1xuICAgICAqL1xuICAgIHB1YmxpYyBpc1N0YXJ0VGFnKCkge1xuICAgICAgICByZXR1cm4gIXRoaXMud2Fsa2VyLmJFbmRUYWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29tcGFyZXMgdGhlIGRvY3VtZW50IHBvc2l0aW9uIG9mIHR3byBjdXJzb3JzXG4gICAgICogQHBhcmFtIG9uZSAtIEZpcnN0IGN1cnNvciB0byBjb21wYXJlXG4gICAgICogQHBhcmFtIHR3byAtIFNlY29uZCBjdXJzb3IgdG8gY29tcGFyZVxuICAgICAqIEByZXR1cm5zIDAgaWYgZXF1YWwsIC0xIGlmIG9uZSBpcyBiZWZvcmUgdHdvLCAxIGlmIG9uZSBpcyBhZnRlciB0d29cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGNvbXBhcmUob25lOiBTUkN1cnNvciB8IG51bGwsIHR3bzogU1JDdXJzb3IgfCBudWxsKSB7XG4gICAgICAgIGNvbnN0IG5vZGVPbmUgPSBvbmU/LndhbGtlcj8ubm9kZTtcbiAgICAgICAgY29uc3Qgbm9kZVR3byA9IHR3bz8ud2Fsa2VyPy5ub2RlO1xuICAgICAgICBpZiAoIW5vZGVPbmUgJiYgIW5vZGVUd28pIHJldHVybiAwO1xuICAgICAgICBpZiAoIW5vZGVPbmUpIHJldHVybiAxO1xuICAgICAgICBpZiAoIW5vZGVUd28pIHJldHVybiAtMTtcbiAgICAgICAgXG4gICAgICAgIGxldCBkb2NQb3NpdGlvbiA9IG5vZGVPbmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24obm9kZVR3byk7XG4gICAgICAgIFxuICAgICAgICAvLyBIYW5kbGUgZGlzY29ubmVjdGVkIG5vZGVzIChkaWZmZXJlbnQgZG9jdW1lbnRzIG9yIHNoYWRvdyBET01zKVxuICAgICAgICBpZiAoZG9jUG9zaXRpb24gJiAweDEpIHtcbiAgICAgICAgICAgIC8vIE5vZGVzIGFyZSBkaXNjb25uZWN0ZWQgLSB0aGV5J3JlIGluIGRpZmZlcmVudCB0cmVlcyAoaWZyYW1lIG9yIHNoYWRvdyBET00pXG4gICAgICAgICAgICAvLyBCdWlsZCBhbmNlc3RvciBjaGFpbnMgdXNpbmcgRE9NV2Fsa2VyLnBhcmVudE5vZGUgKGhhbmRsZXMgc2hhZG93IERPTSAmIGlmcmFtZXMpXG4gICAgICAgICAgICBsZXQgYW5jZXN0b3JzT25lOiBOb2RlW10gPSBbbm9kZU9uZV07XG4gICAgICAgICAgICBsZXQgYW5jZXN0b3JzVHdvOiBOb2RlW10gPSBbbm9kZVR3b107XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGxldCBjdXJyZW50OiBOb2RlIHwgbnVsbCA9IG5vZGVPbmU7XG4gICAgICAgICAgICB3aGlsZSAoY3VycmVudCA9IERPTVdhbGtlci5wYXJlbnROb2RlKGN1cnJlbnQpKSB7XG4gICAgICAgICAgICAgICAgYW5jZXN0b3JzT25lLnB1c2goY3VycmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGN1cnJlbnQgPSBub2RlVHdvO1xuICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnQgPSBET01XYWxrZXIucGFyZW50Tm9kZShjdXJyZW50KSkge1xuICAgICAgICAgICAgICAgIGFuY2VzdG9yc1R3by5wdXNoKGN1cnJlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBSZXZlcnNlIHNvIHJvb3QgaXMgZmlyc3RcbiAgICAgICAgICAgIGFuY2VzdG9yc09uZS5yZXZlcnNlKCk7XG4gICAgICAgICAgICBhbmNlc3RvcnNUd28ucmV2ZXJzZSgpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBGaW5kIHdoZXJlIHRoZSBwYXRocyBkaXZlcmdlXG4gICAgICAgICAgICBsZXQgY29tbW9uRGVwdGggPSAwO1xuICAgICAgICAgICAgd2hpbGUgKGNvbW1vbkRlcHRoIDwgYW5jZXN0b3JzT25lLmxlbmd0aCAmJlxuICAgICAgICAgICAgICAgICAgIGNvbW1vbkRlcHRoIDwgYW5jZXN0b3JzVHdvLmxlbmd0aCAmJlxuICAgICAgICAgICAgICAgICAgIGFuY2VzdG9yc09uZVtjb21tb25EZXB0aF0gPT09IGFuY2VzdG9yc1R3b1tjb21tb25EZXB0aF0pIHtcbiAgICAgICAgICAgICAgICBjb21tb25EZXB0aCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBJZiBvbmUgcGF0aCBpcyBhIHByZWZpeCBvZiB0aGUgb3RoZXIsIGhhbmRsZSBjb250YWlubWVudFxuICAgICAgICAgICAgaWYgKGNvbW1vbkRlcHRoID09PSBhbmNlc3RvcnNPbmUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgLy8gbm9kZU9uZSBpcyBhbiBhbmNlc3RvciBvZiBub2RlVHdvXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9uZS53YWxrZXIuYkVuZFRhZyA/IDEgOiAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjb21tb25EZXB0aCA9PT0gYW5jZXN0b3JzVHdvLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIC8vIG5vZGVUd28gaXMgYW4gYW5jZXN0b3Igb2Ygbm9kZU9uZVxuICAgICAgICAgICAgICAgIHJldHVybiB0d28ud2Fsa2VyLmJFbmRUYWcgPyAtMSA6IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIENvbXBhcmUgdGhlIG5vZGVzIHdoZXJlIHBhdGhzIGRpdmVyZ2VcbiAgICAgICAgICAgIGlmIChjb21tb25EZXB0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgY2hpbGRPbmUgPSBhbmNlc3RvcnNPbmVbY29tbW9uRGVwdGhdO1xuICAgICAgICAgICAgICAgIGxldCBjaGlsZFR3byA9IGFuY2VzdG9yc1R3b1tjb21tb25EZXB0aF07XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgbGV0IGNoaWxkUG9zaXRpb24gPSBjaGlsZE9uZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihjaGlsZFR3byk7XG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkUG9zaXRpb24gJiAweDIpIHJldHVybiAxOyAgLy8gY2hpbGRUd28gcHJlY2VkZXMgY2hpbGRPbmVcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGRQb3NpdGlvbiAmIDB4NCkgcmV0dXJuIC0xOyAvLyBjaGlsZE9uZSBwcmVjZWRlcyBjaGlsZFR3b1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBObyBjb21tb24gYW5jZXN0b3IgZm91bmQgLSBzaG91bGRuJ3QgaGFwcGVuIGluIGEgd2VsbC1mb3JtZWQgZG9jdW1lbnRcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZiAoZG9jUG9zaXRpb24gJiAweDgpIHtcbiAgICAgICAgICAgIC8vIG9uZSBpcyBjb250YWluZWQgd2l0aGluIHR3b1xuICAgICAgICAgICAgLy8gaWYgdHdvIGlzIGFuIGVuZCB0YWcsIG9uZSBpcyBiZWZvcmUsIG90aGVyd2lzZSwgb25lIGlzIGFmdGVyXG4gICAgICAgICAgICByZXR1cm4gdHdvLndhbGtlci5iRW5kVGFnID8gLTEgOiAxO1xuICAgICAgICB9IGVsc2UgaWYgKGRvY1Bvc2l0aW9uICYgMHgxMCkge1xuICAgICAgICAgICAgLy8gdHdvIGlzIGNvbnRhaW5lZCB3aXRoaW4gb25lXG4gICAgICAgICAgICAvLyBpZiBvbmUgaXMgYW4gZW5kIHRhZywgb25lIGlzIGFmdGVyLCBvdGhlcndpc2UsIG9uZSBpcyBiZWZvcmVcbiAgICAgICAgICAgIHJldHVybiBvbmUud2Fsa2VyLmJFbmRUYWcgPyAxIDogLTE7XG4gICAgICAgIH0gZWxzZSBpZiAoZG9jUG9zaXRpb24gJiAweDIpIHtcbiAgICAgICAgICAgIC8vIHR3byBwcmVjZWRlcyBvbmUgaW4gdGhlIGRvY3VtZW50XG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfSBlbHNlIGlmIChkb2NQb3NpdGlvbiAmIDB4NCkge1xuICAgICAgICAgICAgLy8gb25lIHByZWNlZGVzIHR3byBpbiB0aGUgZG9jdW1lbnRcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhpcyBjdXJzb3IncyBub2RlIGNvbnRhaW5zIGFub3RoZXIgY3Vyc29yJ3Mgbm9kZVxuICAgICAqIEBwYXJhbSBvdGhlciAtIFRoZSBvdGhlciBjdXJzb3IgdG8gY2hlY2tcbiAgICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoaXMgY3Vyc29yIGNvbnRhaW5zIChpcyBhIHBhcmVudC9hbmNlc3RvciBvZikgdGhlIG90aGVyIGN1cnNvcidzIG5vZGVcbiAgICAgKi9cbiAgICBwdWJsaWMgY29udGFpbnMob3RoZXI6IFNSQ3Vyc29yKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE5vZGUoKS5jb250YWlucyhvdGhlci5nZXROb2RlKCkpXG4gICAgICAgICAgICAmJiAhdGhpcy5pc1NhbWVOb2RlKG90aGVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhpcyBjdXJzb3IgcG9pbnRzIHRvIHRoZSBzYW1lIG5vZGUgYXMgYW5vdGhlciBjdXJzb3JcbiAgICAgKiBAcGFyYW0gb3RoZXIgLSBUaGUgb3RoZXIgY3Vyc29yIHRvIGNvbXBhcmUgd2l0aFxuICAgICAqIEByZXR1cm5zIHRydWUgaWYgYm90aCBjdXJzb3JzIHBvaW50IHRvIHRoZSBzYW1lIG5vZGVcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNTYW1lTm9kZShvdGhlcjogU1JDdXJzb3IpIHtcbiAgICAgICAgaWYgKCFvdGhlcikgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gdGhpcy5nZXROb2RlKCkuaXNTYW1lTm9kZShvdGhlci5nZXROb2RlKCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGUgY3VycmVudCBub2RlIGhhcyBhIG5vbi1lbXB0eSBhY2Nlc3NpYmxlIG5hbWVcbiAgICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBub2RlIGhhcyBhIG5vbi1lbXB0eSBhY2Nlc3NpYmxlIG5hbWVcbiAgICAgKi9cbiAgICBwdWJsaWMgaGFzTm9uRW1wdHlOYW1lKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuZ2V0TmFtZUluZm8oKT8ubmFtZSB8fCBcIlwiKS50cmltKCkubGVuZ3RoID4gMDtcbiAgICB9XG5cbn0iLCJpbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuaW1wb3J0IHsgQWNjTmFtZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BY2NOYW1lVXRpbFwiO1xuaW1wb3J0IHsgTmF2aWdhdGlvbk1vZGUgfSBmcm9tIFwiLi9TUlR5cGVzXCI7XG5pbXBvcnQgeyBTUkN1cnNvciwgU1JDdXJzb3JNYXRjaEZ1bmMsIFNSQ3Vyc29yU2tpcEZ1bmMgfSBmcm9tIFwiLi9TUkN1cnNvclwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5cbmV4cG9ydCBuYW1lc3BhY2UgU1JOYXZpZ2F0b3Ige1xuICAgIC8qKlxuICAgICAqIERldGVybWluZSBpZiBhIG5vZGUgaXMgYSBibG9jay1sZXZlbCBlbGVtZW50IGJhc2VkIG9uIGl0cyBkaXNwbGF5IHByb3BlcnR5XG4gICAgICogQHBhcmFtIG5vZGUgVGhlIERPTSBub2RlIHRvIGNoZWNrXG4gICAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgbm9kZSBpcyBhIGJsb2NrLWxldmVsIGVsZW1lbnQsIGZhbHNlIG90aGVyd2lzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzQmxvY2tFbGVtZW50KG5vZGU6IE5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgIT09IDEpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJiclwiKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY29uc3QgZWxlbSA9IG5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IG15d2luID0gZWxlbS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3O1xuICAgICAgICBjb25zdCBkaXNwID0gbXl3aW4uZ2V0Q29tcHV0ZWRTdHlsZShlbGVtKT8uZGlzcGxheTtcbiAgICAgICAgaWYgKGRpc3AgJiYgZGlzcC5zdGFydHNXaXRoKFwidGFibGVcIikpIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAoZGlzcCA9PT0gXCJibG9ja1wiICYmIGVsZW0uc3R5bGUuZGlzcGxheSAhPT0gXCJibG9ja1wiKSB7XG4gICAgICAgICAgICAvLyBJcyB0aGlzIGJsb2NrIGJlY2F1c2UgaXQncyBhIGZsZXggZWxlbT9cbiAgICAgICAgICAgIGlmIChlbGVtLnBhcmVudEVsZW1lbnQgJiYgbXl3aW4uZ2V0Q29tcHV0ZWRTdHlsZShlbGVtLnBhcmVudEVsZW1lbnQpLmRpc3BsYXkgPT09IFwiZmxleFwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUoZWxlbSwgdHJ1ZSkgPT09IFwibGlua1wiKSB7XG4gICAgICAgICAgICBsZXQgdGVtcCA9IG5ldyBET01XYWxrZXIobm9kZSwgZmFsc2UsIHVuZGVmaW5lZCwgZmFsc2UpO1xuICAgICAgICAgICAgdGVtcC5wcmV2Tm9kZSgpO1xuICAgICAgICAgICAgaWYgKCFpc0Jsb2NrRWxlbWVudCh0ZW1wLm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtcImJsb2NrXCIsIFwiZmxleFwiLCBcImdyaWRcIiwgXCJsaXN0LWl0ZW1cIl0uaW5jbHVkZXMoZGlzcCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0RXhwbGljaXRUYWJpbmRleChub2RlOiBOb2RlKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgICAgIGlmICghbm9kZSB8fCBub2RlLm5vZGVUeXBlICE9PSAxKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgZWxlbSA9IG5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGlmICghZWxlbS5oYXNBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGNvbnN0IHRhYmluZGV4VmFsdWUgPSBwYXJzZUludChlbGVtLmdldEF0dHJpYnV0ZShcInRhYmluZGV4XCIpLCAxMCk7XG4gICAgICAgIHJldHVybiBOdW1iZXIuaXNOYU4odGFiaW5kZXhWYWx1ZSkgPyBudWxsIDogdGFiaW5kZXhWYWx1ZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1Bvc2l0aXZlVGFiRm9jdXMobm9kZTogTm9kZSk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIW5vZGUgfHwgbm9kZS5ub2RlVHlwZSAhPT0gMSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjb25zdCBlbGVtID0gbm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgY29uc3QgZXhwbGljaXRUYWJpbmRleCA9IGdldEV4cGxpY2l0VGFiaW5kZXgoZWxlbSk7XG4gICAgICAgIHJldHVybiBleHBsaWNpdFRhYmluZGV4ICE9PSBudWxsICYmIGV4cGxpY2l0VGFiaW5kZXggPiAwICYmIENvbW1vblV0aWwuaXNUYWJiYWJsZShlbGVtKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0RlZmF1bHRPclplcm9UYWJGb2N1cyhub2RlOiBOb2RlKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghbm9kZSB8fCBub2RlLm5vZGVUeXBlICE9PSAxKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IGVsZW0gPSBub2RlIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBjb25zdCBleHBsaWNpdFRhYmluZGV4ID0gZ2V0RXhwbGljaXRUYWJpbmRleChlbGVtKTtcbiAgICAgICAgcmV0dXJuIChleHBsaWNpdFRhYmluZGV4ID09PSBudWxsIHx8IGV4cGxpY2l0VGFiaW5kZXggPT09IDApICYmIENvbW1vblV0aWwuaXNUYWJiYWJsZShlbGVtKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRUYWJGb2N1c1N0YXJ0RnVuYyhpbmNsdWRlUG9zaXRpdmVUYWJpbmRleDogYm9vbGVhbiA9IHRydWUpOiBTUkN1cnNvck1hdGNoRnVuYyB7XG4gICAgICAgIHJldHVybiAoX3JvbGU6IHN0cmluZywgYlN0YXJ0VGFnOiBib29sZWFuLCBub2RlOiBOb2RlKSA9PiB7XG4gICAgICAgICAgICBpZiAoIShub2RlICYmIG5vZGUubm9kZVR5cGUgPT09IDEgJiYgYlN0YXJ0VGFnICYmIENvbW1vblV0aWwuaXNUYWJiYWJsZShub2RlKSkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiBpbmNsdWRlUG9zaXRpdmVUYWJpbmRleCB8fCBpc0RlZmF1bHRPclplcm9UYWJGb2N1cyhub2RlKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb2xsZWN0IGFsbCB0YWJiYWJsZSBlbGVtZW50cyBpbiB0YWIgb3JkZXIgKHBvc2l0aXZlIHRhYmluZGV4IGZpcnN0LCB0aGVuIGRvY3VtZW50IG9yZGVyKVxuICAgICAqIEBwYXJhbSBtYXRjaEZ1bmMgRnVuY3Rpb24gdG8gbWF0Y2ggdGFiYmFibGUgZWxlbWVudHNcbiAgICAgKiBAcGFyYW0gcm9vdE5vZGUgT3B0aW9uYWwgcm9vdCBub2RlIHRvIHN0YXJ0IGNvbGxlY3Rpb24gZnJvbSAoZGVmYXVsdHMgdG8gZG9jdW1lbnQgYm9keSlcbiAgICAgKiBAcmV0dXJucyBBcnJheSBvZiBjdXJzb3JzIHBvaW50aW5nIHRvIHRhYmJhYmxlIGVsZW1lbnRzIGluIHRhYiBvcmRlclxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvbGxlY3RUYWJGb2N1c0N1cnNvcnMobWF0Y2hGdW5jOiBTUkN1cnNvck1hdGNoRnVuYywgcm9vdE5vZGU/OiBOb2RlKTogU1JDdXJzb3JbXSB7XG4gICAgICAgIGNvbnN0IHJvb3QgPSAocm9vdE5vZGU/Lm93bmVyRG9jdW1lbnQgfHwgZG9jdW1lbnQpLmJvZHkgfHwgcm9vdE5vZGU7XG4gICAgICAgIGlmICghcm9vdCkgcmV0dXJuIFtdO1xuICAgICAgICBsZXQgd2Fsa2VyID0gbmV3IFNSQ3Vyc29yKHJvb3QsIGZhbHNlKTtcbiAgICAgICAgY29uc3Qgc2tpcEZ1bmMgPSBnZXRTa2lwRnVuYyhcInRhYl9mb2N1c1wiKTtcbiAgICAgICAgbGV0IHBvc2l0aXZlUmVzdWx0czogU1JDdXJzb3JbXSA9IFtdO1xuICAgICAgICBsZXQgbm9ybWFsUmVzdWx0czogU1JDdXJzb3JbXSA9IFtdO1xuXG4gICAgICAgIGNvbnN0IGFkZEN1cnNvciA9IChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICBpZiAoIW1hdGNoRnVuYyhjdXJzb3IuZ2V0Um9sZSgpLCAhY3Vyc29yLmlzRW5kVGFnKCksIGN1cnNvci5nZXROb2RlKCkpKSByZXR1cm47XG4gICAgICAgICAgICBpZiAoaXNQb3NpdGl2ZVRhYkZvY3VzKGN1cnNvci5nZXROb2RlKCkpKSB7XG4gICAgICAgICAgICAgICAgcG9zaXRpdmVSZXN1bHRzLnB1c2goY3Vyc29yLmNsb25lKCkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpc0RlZmF1bHRPclplcm9UYWJGb2N1cyhjdXJzb3IuZ2V0Tm9kZSgpKSkge1xuICAgICAgICAgICAgICAgIG5vcm1hbFJlc3VsdHMucHVzaChjdXJzb3IuY2xvbmUoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgYWRkQ3Vyc29yKHdhbGtlcik7XG4gICAgICAgIHdoaWxlICh3YWxrZXIubmV4dCgoKSA9PiB0cnVlLCBza2lwRnVuYykpIHtcbiAgICAgICAgICAgIGFkZEN1cnNvcih3YWxrZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcG9zaXRpdmVSZXN1bHRzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFFbGVtID0gYS5nZXRFbGVtZW50KCk7XG4gICAgICAgICAgICBjb25zdCBiRWxlbSA9IGIuZ2V0RWxlbWVudCgpO1xuICAgICAgICAgICAgY29uc3QgYVRhYmluZGV4ID0gZ2V0RXhwbGljaXRUYWJpbmRleChhRWxlbSkgfHwgMDtcbiAgICAgICAgICAgIGNvbnN0IGJUYWJpbmRleCA9IGdldEV4cGxpY2l0VGFiaW5kZXgoYkVsZW0pIHx8IDA7XG4gICAgICAgICAgICBpZiAoYVRhYmluZGV4ICE9PSBiVGFiaW5kZXgpIHJldHVybiBiVGFiaW5kZXggLSBhVGFiaW5kZXg7XG4gICAgICAgICAgICByZXR1cm4gU1JDdXJzb3IuY29tcGFyZShhLCBiKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHBvc2l0aXZlUmVzdWx0cy5jb25jYXQobm9ybWFsUmVzdWx0cyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmluZCB0aGUgaW5kZXggb2YgYSBjdXJzb3IgaW4gYW4gYXJyYXkgb2YgdGFiIGZvY3VzIGN1cnNvcnNcbiAgICAgKiBAcGFyYW0gY3Vyc29ycyBBcnJheSBvZiBjdXJzb3JzIHRvIHNlYXJjaFxuICAgICAqIEBwYXJhbSB3YWxrZXIgVGhlIGN1cnNvciB0byBmaW5kXG4gICAgICogQHJldHVybnMgVGhlIGluZGV4IG9mIHRoZSBjdXJzb3IsIG9yIC0xIGlmIG5vdCBmb3VuZFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZpbmRUYWJGb2N1c0luZGV4KGN1cnNvcnM6IFNSQ3Vyc29yW10sIHdhbGtlcjogU1JDdXJzb3IpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gY3Vyc29ycy5maW5kSW5kZXgoY3Vyc29yID0+IFNSQ3Vyc29yLmNvbXBhcmUoY3Vyc29yLCB3YWxrZXIpID09PSAwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIG1hdGNoIGZ1bmN0aW9uIGZvciBpZGVudGlmeWluZyBzdGFydCBwb3NpdGlvbnMgaW4gYSBnaXZlbiBuYXZpZ2F0aW9uIG1vZGVcbiAgICAgKiBAcGFyYW0gbW9kZSBUaGUgbmF2aWdhdGlvbiBtb2RlIChlLmcuLCBcImxpbmtcIiwgXCJoZWFkaW5nXCIsIFwiYnV0dG9uXCIsIGV0Yy4pXG4gICAgICogQHJldHVybnMgQSBmdW5jdGlvbiB0aGF0IG1hdGNoZXMgZWxlbWVudHMgYXBwcm9wcmlhdGUgZm9yIHRoZSBuYXZpZ2F0aW9uIG1vZGVcbiAgICAgKi9cbiAgICBleHBvcnQgZnVuY3Rpb24gZ2V0U3RhcnRGdW5jKG1vZGU6IE5hdmlnYXRpb25Nb2RlKSA6IFNSQ3Vyc29yTWF0Y2hGdW5jIHtcbiAgICAgICAgc3dpdGNoIChtb2RlKSB7XG4gICAgICAgICAgICBjYXNlIFwibGlua1wiOlxuICAgICAgICAgICAgICAgIHJldHVybiAocm9sZTogc3RyaW5nLCBiU3RhcnRUYWc6IGJvb2xlYW4pID0+IChiU3RhcnRUYWcgJiYgcm9sZSA9PT0gXCJsaW5rXCIpO1xuICAgICAgICAgICAgY2FzZSBcInRhYl9mb2N1c1wiOlxuICAgICAgICAgICAgICAgIHJldHVybiBnZXRUYWJGb2N1c1N0YXJ0RnVuYyhmYWxzZSk7XG4gICAgICAgICAgICBjYXNlIFwiaGVhZGluZ1wiOlxuICAgICAgICAgICAgICAgIHJldHVybiAocm9sZTogc3RyaW5nLCBiU3RhcnRUYWc6IGJvb2xlYW4pID0+IChiU3RhcnRUYWcgJiYgcm9sZSA9PT0gXCJoZWFkaW5nXCIpO1xuICAgICAgICAgICAgY2FzZSBcImgxXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIChyb2xlOiBzdHJpbmcsIGJTdGFydFRhZzogYm9vbGVhbiwgbm9kZTogTm9kZSkgPT4gKGJTdGFydFRhZyAmJiByb2xlID09PSBcImhlYWRpbmdcIiAmJiAobm9kZSBhcyBIVE1MRWxlbWVudCkuYXJpYUxldmVsID09PSBcIjFcIik7XG4gICAgICAgICAgICBjYXNlIFwiaDJcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gKHJvbGU6IHN0cmluZywgYlN0YXJ0VGFnOiBib29sZWFuLCBub2RlOiBOb2RlKSA9PiAoYlN0YXJ0VGFnICYmIHJvbGUgPT09IFwiaGVhZGluZ1wiICYmIChub2RlIGFzIEhUTUxFbGVtZW50KS5hcmlhTGV2ZWwgPT09IFwiMlwiKTtcbiAgICAgICAgICAgIGNhc2UgXCJoM1wiOlxuICAgICAgICAgICAgICAgIHJldHVybiAocm9sZTogc3RyaW5nLCBiU3RhcnRUYWc6IGJvb2xlYW4sIG5vZGU6IE5vZGUpID0+IChiU3RhcnRUYWcgJiYgcm9sZSA9PT0gXCJoZWFkaW5nXCIgJiYgKG5vZGUgYXMgSFRNTEVsZW1lbnQpLmFyaWFMZXZlbCA9PT0gXCIzXCIpO1xuICAgICAgICAgICAgY2FzZSBcImg0XCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIChyb2xlOiBzdHJpbmcsIGJTdGFydFRhZzogYm9vbGVhbiwgbm9kZTogTm9kZSkgPT4gKGJTdGFydFRhZyAmJiByb2xlID09PSBcImhlYWRpbmdcIiAmJiAobm9kZSBhcyBIVE1MRWxlbWVudCkuYXJpYUxldmVsID09PSBcIjRcIik7XG4gICAgICAgICAgICBjYXNlIFwiaDVcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gKHJvbGU6IHN0cmluZywgYlN0YXJ0VGFnOiBib29sZWFuLCBub2RlOiBOb2RlKSA9PiAoYlN0YXJ0VGFnICYmIHJvbGUgPT09IFwiaGVhZGluZ1wiICYmIChub2RlIGFzIEhUTUxFbGVtZW50KS5hcmlhTGV2ZWwgPT09IFwiNVwiKTtcbiAgICAgICAgICAgIGNhc2UgXCJoNlwiOlxuICAgICAgICAgICAgICAgIHJldHVybiAocm9sZTogc3RyaW5nLCBiU3RhcnRUYWc6IGJvb2xlYW4sIG5vZGU6IE5vZGUpID0+IChiU3RhcnRUYWcgJiYgcm9sZSA9PT0gXCJoZWFkaW5nXCIgJiYgKG5vZGUgYXMgSFRNTEVsZW1lbnQpLmFyaWFMZXZlbCA9PT0gXCI2XCIpO1xuICAgICAgICAgICAgY2FzZSBcImltYWdlXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIChyb2xlOiBzdHJpbmcsIGJTdGFydFRhZzogYm9vbGVhbikgPT4gKGJTdGFydFRhZyAmJiBbXCJpbWdcIiwgXCJncmFwaGljcy1kb2N1bWVudFwiXS5pbmNsdWRlcyhyb2xlKSk7XG4gICAgICAgICAgICBjYXNlIFwicmFkaW9cIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gKHJvbGU6IHN0cmluZywgYlN0YXJ0VGFnOiBib29sZWFuKSA9PiAoYlN0YXJ0VGFnICYmIHJvbGUgPT09IFwicmFkaW9cIik7XG4gICAgICAgICAgICBjYXNlIFwiYnV0dG9uXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIChyb2xlOiBzdHJpbmcsIGJTdGFydFRhZzogYm9vbGVhbikgPT4gKGJTdGFydFRhZyAmJiByb2xlID09PSBcImJ1dHRvblwiKTtcbiAgICAgICAgICAgIGNhc2UgXCJjaGVja2JveFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiAocm9sZTogc3RyaW5nLCBiU3RhcnRUYWc6IGJvb2xlYW4pID0+IChiU3RhcnRUYWcgJiYgcm9sZSA9PT0gXCJjaGVja2JveFwiKTtcbiAgICAgICAgICAgIGNhc2UgXCJjb21ib1wiOiAgICAgICBcbiAgICAgICAgICAgICAgICByZXR1cm4gKHJvbGU6IHN0cmluZywgYlN0YXJ0VGFnOiBib29sZWFuKSA9PiAoYlN0YXJ0VGFnICYmIHJvbGUgPT09IFwiY29tYm9ib3hcIik7XG4gICAgICAgICAgICBjYXNlIFwibGlzdFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiAocm9sZTogc3RyaW5nLCBiU3RhcnRUYWc6IGJvb2xlYW4pID0+IChiU3RhcnRUYWcgJiYgcm9sZSA9PT0gXCJsaXN0XCIpO1xuICAgICAgICAgICAgY2FzZSBcImxpc3RpdGVtXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIChyb2xlOiBzdHJpbmcsIGJTdGFydFRhZzogYm9vbGVhbikgPT4gKGJTdGFydFRhZyAmJiByb2xlID09PSBcImxpc3RpdGVtXCIpO1xuICAgICAgICAgICAgY2FzZSBcImFydGljbGVcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gKHJvbGU6IHN0cmluZywgYlN0YXJ0VGFnOiBib29sZWFuKSA9PiAoYlN0YXJ0VGFnICYmIHJvbGUgPT09IFwiYXJ0aWNsZVwiKTtcbiAgICAgICAgICAgIGNhc2UgXCJ0YWJsZVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiAocm9sZTogc3RyaW5nLCBiU3RhcnRUYWc6IGJvb2xlYW4pID0+IChiU3RhcnRUYWcgJiYgcm9sZSA9PT0gXCJ0YWJsZVwiKTtcbiAgICAgICAgICAgIGNhc2UgXCJwYXJhZ3JhcGhcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gKF9yb2xlOiBzdHJpbmcsIGJTdGFydFRhZzogYm9vbGVhbiwgbm9kZTogTm9kZSkgPT4gKGJTdGFydFRhZyAmJiAobm9kZSBhcyBIVE1MRWxlbWVudCkubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJQXCIpO1xuICAgICAgICAgICAgY2FzZSBcImRvbVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiAoKSA9PiB0cnVlO1xuICAgICAgICAgICAgY2FzZSBcIml0ZW1cIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gKF9yb2xlOiBzdHJpbmcsIGJTdGFydFRhZzogYm9vbGVhbiwgbm9kZTogTm9kZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWJTdGFydFRhZykgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNCbG9ja0VsZW1lbnQobm9kZSkpIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZW1wID0gbmV3IERPTVdhbGtlcihub2RlLCAhYlN0YXJ0VGFnKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXAucHJldk5vZGUoKSAmJiB0ZW1wLmJFbmRUYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpc0Jsb2NrRWxlbWVudCh0ZW1wLm5vZGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFwicmVnaW9uXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIChyb2xlOiBzdHJpbmcsIGJTdGFydFRhZzogYm9vbGVhbiwgbm9kZTogTm9kZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWJTdGFydFRhZykgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoW1wibWFpblwiLCBcIm5hdmlnYXRpb25cIiwgXCJmb3JtXCIsIFwiYmFubmVyXCIsIFwic2VhcmNoXCIsIFwiY29udGVudGluZm9cIl0uaW5jbHVkZXMocm9sZSkpIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBpZiAocm9sZSAhPT0gXCJyZWdpb25cIiB8fCBub2RlPy5ub2RlVHlwZSAhPT0gMSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gISFBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWUobm9kZSBhcyBIVE1MRWxlbWVudCk/Lm5hbWU/LnRyaW0oKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgY2FzZSBcImZvcm1jb250cm9sXCI6XG4gICAgICAgICAgICBjYXNlIFwiZWRpdGJveFwiOlxuICAgICAgICAgICAgY2FzZSBcImdyYXBoaWNcIjpcbiAgICAgICAgICAgIGNhc2UgXCJmcmFtZVwiOlxuICAgICAgICAgICAgY2FzZSBcImRpdmlzaW9uXCI6XG4gICAgICAgICAgICBjYXNlIFwidGFiY29udHJvbFwiOlxuICAgICAgICAgICAgY2FzZSBcInNlcGFyYXRvclwiOlxuICAgICAgICAgICAgY2FzZSBcImNsaWNrYWJsZVwiOlxuICAgICAgICAgICAgY2FzZSBcIm1vdXNlb3ZlclwiOlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5PVF9JTVBMRU1FTlRFRFwiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiBhbiBlbGVtZW50IGlzIHdpdGhpbiBhIFNoYWRvdyBET01cbiAgICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgZWxlbWVudCB0byBjaGVja1xuICAgICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIGVsZW1lbnQgaXMgaW4gYSBTaGFkb3cgRE9NLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgKi9cbiAgICBjb25zdCBpc0luU2hhZG93RE9NID0gKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IHJvb3QgPSBlbGVtZW50LmdldFJvb3ROb2RlKCk7XG4gICAgICAgIHJldHVybiByb290IGluc3RhbmNlb2YgU2hhZG93Um9vdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmUgc2tpcCBiZWhhdmlvciBmb3IgaXRlbSBuYXZpZ2F0aW9uIG1vZGVcbiAgICAgKiBIYW5kbGVzIGNvbXBsZXggdmlzaWJpbGl0eSBydWxlcyBpbmNsdWRpbmcgaGlkZGVuIGNvbnRlbnQgaW4gaGVhZGluZ3MvbGlua3NcbiAgICAgKiBAcGFyYW0gY3Vyc29yIFRoZSBjdXJzb3IgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb25cbiAgICAgKiBAcmV0dXJucyBPYmplY3QgaW5kaWNhdGluZyB3aGV0aGVyIHRvIHNraXAgY3VycmVudCBub2RlIGFuZC9vciBpdHMgY2hpbGRyZW4sIG9yIG51bGwgZm9yIGRlZmF1bHQgYmVoYXZpb3JcbiAgICAgKi9cbiAgICBjb25zdCBTS0lQX0lURU1fQkVIQVZJT1IgPSAoY3Vyc29yOiBTUkN1cnNvcikgOiB7IHNraXBDdXJyZW50OiBib29sZWFuLCBza2lwQ2hpbGRyZW46IGJvb2xlYW59IHwgbnVsbCA9PiB7XG4gICAgICAgIGNvbnN0IERFQlVHID0gZmFsc2U7XG4gICAgICAgIERFQlVHICYmIGNvbnNvbGUuZ3JvdXAoXCJTS0lQX0lURU1fQkVIQVZJT1JcIik7XG4gICAgICAgIGxldCByZXRWYWw6IHsgc2tpcEN1cnJlbnQ6IGJvb2xlYW4sIHNraXBDaGlsZHJlbjogYm9vbGVhbn0gfCBudWxsID0gbnVsbDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IG5vZGVUeXBlID0gY3Vyc29yLmdldE5vZGUoKS5ub2RlVHlwZTtcbiAgICAgICAgICAgIGxldCBlbGVtID0gY3Vyc29yLmdldEVsZW1lbnQoKTtcbiAgICAgICAgICAgIGNvbnN0IGN1cnNvclN0YXJ0ID0gY3Vyc29yLmNsb25lKCk7XG4gICAgICAgICAgICBjdXJzb3JTdGFydC5zZXRFbmRUYWcoZmFsc2UpO1xuXG4gICAgICAgICAgICBERUJVRyAmJiBjb25zb2xlLmxvZyhub2RlVHlwZSk7XG4gICAgICAgICAgICAvLyBTa2lwIENEQVRBIGFuZCBjb21tZW50cyBjb21wbGV0ZWx5XG4gICAgICAgICAgICBpZiAoWzQsIDhdLmluY2x1ZGVzKG5vZGVUeXBlKSkgcmV0dXJuIHJldFZhbCA9IHsgc2tpcEN1cnJlbnQ6IHRydWUsIHNraXBDaGlsZHJlbjogdHJ1ZSB9O1xuICAgICAgICAgICAgLy8gT25seSBwcm9jZXNzIGVsZW1lbnRzIGFuZCB0ZXh0XG4gICAgICAgICAgICBpZiAoIVsxLDNdLmluY2x1ZGVzKG5vZGVUeXBlKSkgcmV0dXJuIHJldFZhbCA9IHsgc2tpcEN1cnJlbnQ6IHRydWUsIHNraXBDaGlsZHJlbjogZmFsc2UgfTtcblxuICAgICAgICAgICAgLy8gRm9yIHRleHQgZWxlbWVudHMsIENvbnNpZGVyIHdpdGggcmVsYXRpb24gdG8gdGhlaXIgcGFyZW50IGVsZW1lbnRcbiAgICAgICAgICAgIGlmIChub2RlVHlwZSA9PT0gMykge1xuICAgICAgICAgICAgICAgIGVsZW0gPSBjdXJzb3IuZ2V0Tm9kZSgpLnBhcmVudEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgaWYgKCFlbGVtKSByZXR1cm4gcmV0VmFsID0gVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQoZWxlbSkgPyB7IHNraXBDdXJyZW50OiB0cnVlLCBza2lwQ2hpbGRyZW46IGZhbHNlIH0gOiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gaWYgKCFlbGVtKSBjb25zb2xlLmxvZyhjdXJzb3IuZ2V0Tm9kZSgpKTtcblxuICAgICAgICAgICAgLy8gV2UgaGF2ZSBhbiBlbGVtZW50XG5cbiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSdyZSB3aXRoaW4gdGhlIGJvZHkgZWxlbWVudFxuICAgICAgICAgICAgaWYgKCFlbGVtLmNsb3Nlc3QoXCJib2R5XCIpICYmICFpc0luU2hhZG93RE9NKGVsZW0pKSByZXR1cm4gcmV0VmFsID0geyBza2lwQ3VycmVudDogdHJ1ZSwgc2tpcENoaWxkcmVuOiBmYWxzZSB9O1xuXG4gICAgICAgICAgICAvLyBNYWtlIHN1cmUgd2UncmUgbm90IGluIGEgc2NyaXB0IG9yIHN0eWxlXG4gICAgICAgICAgICBpZiAoZWxlbS5jbG9zZXN0KFwic2NyaXB0LHN0eWxlXCIpKSByZXR1cm4gcmV0VmFsID0geyBza2lwQ3VycmVudDogdHJ1ZSwgc2tpcENoaWxkcmVuOiB0cnVlIH07XG5cbiAgICAgICAgICAgIC8vIEZvciB0ZXh0IG5vZGVzLCB3ZSBuZWVkIHRvIGNoZWNrIHZpc2liaWxpdHkgaW4gY29udGV4dCBvZiBwYXJlbnQgaGVhZGluZy9saW5rXG4gICAgICAgICAgICAvLyBTbyB3ZSdsbCBoYW5kbGUgdGV4dCBub2RlIHZpc2liaWxpdHkgY2hlY2tzIGJlbG93IHdpdGggdGhlIGVsZW1lbnQgdmlzaWJpbGl0eSBjaGVja3NcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gU2tpcCB0aGluZ3MgaGlkZGVuIGZyb20gdGhlIEFULCBVTkxFU1Mgd2UncmUgaW5zaWRlIGEgaGVhZGluZyBvciBsaW5rXG4gICAgICAgICAgICAvLyAoaGVhZGluZ3MgYW5kIGxpbmtzIHNob3VsZCBpbmNsdWRlIHRoZWlyIGZ1bGwgYWNjZXNzaWJsZSBuYW1lLCBpbmNsdWRpbmcgaGlkZGVuIHBhcnRzKVxuICAgICAgICAgICAgLy8gQlVUIG9ubHkgaWYgdGhlIGhlYWRpbmcvbGluayB1c2VzIG5hbWVGcm9tPVwiY29udGVudFwiIChub3QgYXJpYS1sYWJlbC9hcmlhLWxhYmVsbGVkYnkpXG4gICAgICAgICAgICBjb25zdCBwYXJlbnRIZWFkaW5nT3JMaW5rID0gY3Vyc29yU3RhcnQuZ2V0Q3VycmVudE9yUGFyZW50QnlSb2xlQ2xvbmUoW1wiaGVhZGluZ1wiLCBcImxpbmtcIl0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBTcGVjaWFsIGNhc2U6IGlmIGN1cnJlbnQgZWxlbWVudCBpdHNlbGYgaXMgYSBoZWFkaW5nIG9yIGxpbmsgQU5EIHdlJ3JlIE5PVCBpbnNpZGUgYW5vdGhlciBoZWFkaW5nL2xpbmssXG4gICAgICAgICAgICAvLyBhcHBseSBub3JtYWwgc2tpcCBydWxlc1xuICAgICAgICAgICAgY29uc3QgY3VycmVudFJvbGUgPSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUoZWxlbSk7XG4gICAgICAgICAgICBjb25zdCBpc0N1cnJlbnRIZWFkaW5nT3JMaW5rID0gY3VycmVudFJvbGUgPT09IFwiaGVhZGluZ1wiIHx8IGN1cnJlbnRSb2xlID09PSBcImxpbmtcIjtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKCFwYXJlbnRIZWFkaW5nT3JMaW5rKSB7XG4gICAgICAgICAgICAgICAgLy8gTm90IGluc2lkZSBhbnkgaGVhZGluZy9saW5rIC0gYXBwbHkgbm9ybWFsIHNraXAgcnVsZXNcbiAgICAgICAgICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQoZWxlbSkpIHJldHVybiByZXRWYWwgPSB7IHNraXBDdXJyZW50OiB0cnVlLCBza2lwQ2hpbGRyZW46IG5vZGVUeXBlID09PSAxIH07XG4gICAgICAgICAgICAgICAgaWYgKCFWaXNVdGlsLmlzTm9kZVZpc2libGUoZWxlbSkpIHJldHVybiByZXRWYWwgPSB7IHNraXBDdXJyZW50OiB0cnVlLCBza2lwQ2hpbGRyZW46IG5vZGVUeXBlID09PSAxIH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBwYXJlbnQgaGVhZGluZy9saW5rIHVzZXMgYXJpYS1sYWJlbCBvciBhcmlhLWxhYmVsbGVkYnlcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRFbGVtID0gcGFyZW50SGVhZGluZ09yTGluay5nZXRFbGVtZW50KCk7XG4gICAgICAgICAgICAgICAgY29uc3QgbmFtZUluZm8gPSBwYXJlbnRIZWFkaW5nT3JMaW5rLmdldE5hbWVJbmZvKCk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gSWYgbmFtZUZyb20gaXMgTk9UIFwiY29udGVudFwiIG9yIFwidGV4dFwiLCBza2lwIGFsbCBjb250ZW50IChpdCdzIHVzaW5nIGFyaWEtbGFiZWwvYXJpYS1sYWJlbGxlZGJ5KVxuICAgICAgICAgICAgICAgIGlmIChuYW1lSW5mbyAmJiAhW1wiY29udGVudFwiLCBcInRleHRcIl0uaW5jbHVkZXMobmFtZUluZm8ubmFtZUZyb20pKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFBhcmVudCB1c2VzIGFyaWEtbGFiZWwvYXJpYS1sYWJlbGxlZGJ5IC0gc2tpcCBhbGwgY29udGVudCBpbmNsdWRpbmcgbmVzdGVkIGhlYWRpbmdzL2xpbmtzXG4gICAgICAgICAgICAgICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChlbGVtKSkgcmV0dXJuIHJldFZhbCA9IHsgc2tpcEN1cnJlbnQ6IHRydWUsIHNraXBDaGlsZHJlbjogdHJ1ZSB9O1xuICAgICAgICAgICAgICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShlbGVtKSkgcmV0dXJuIHJldFZhbCA9IHsgc2tpcEN1cnJlbnQ6IHRydWUsIHNraXBDaGlsZHJlbjogdHJ1ZSB9O1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNDdXJyZW50SGVhZGluZ09yTGluaykge1xuICAgICAgICAgICAgICAgICAgICAvLyBDdXJyZW50IGVsZW1lbnQgaXMgYSBoZWFkaW5nL2xpbmsgaW5zaWRlIGFub3RoZXIgaGVhZGluZy9saW5rIHdpdGggY29udGVudC1iYXNlZCBuYW1lXG4gICAgICAgICAgICAgICAgICAgIC8vIERvbid0IHNraXAgaXQgLSBsZXQgaXQgdGhyb3VnaCBzbyBpdHMgY29udGVudCBjYW4gYmUgcmVhZFxuICAgICAgICAgICAgICAgICAgICAvLyAoVGhlIGxvZ2ljIGF0IGxpbmUgMTgzIHdpbGwgaGFuZGxlIHdoZXRoZXIgdG8gc2tpcCBpdHMgY2hpbGRyZW4pXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbmFtZUZyb20gaXMgXCJjb250ZW50XCIsIHNvIGluY2x1ZGUgaGlkZGVuIGNvbnRlbnQgYnV0IHNraXAgaGlkZGVuIGltYWdlcy9ncmFwaGljc1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKGVsZW0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoKHJvbGUgPT09IFwiaW1nXCIgfHwgcm9sZSA9PT0gXCJncmFwaGljcy1kb2N1bWVudFwiKSAmJiBWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChlbGVtKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbCA9IHsgc2tpcEN1cnJlbnQ6IHRydWUsIHNraXBDaGlsZHJlbjogdHJ1ZSB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIERvbid0IHNraXAgb3RoZXIgaGlkZGVuIGNvbnRlbnQgLSBpdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIGFjY2Vzc2libGUgbmFtZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiQk9EWVwiKSByZXR1cm4gcmV0VmFsID0geyBza2lwQ3VycmVudDogZmFsc2UsIHNraXBDaGlsZHJlbjogZmFsc2UgfTtcblxuICAgICAgICAgICAgLy8gU2tpcCBsYWJlbHMgdGhhdCBhcmUgYXNzb2NpYXRlZCB3aXRoIGNvbnRyb2xzIC0gdGhleSdsbCBiZSByZWFkIHdpdGggdGhlIHJlbGF0ZWQgaW5wdXQuXG4gICAgICAgICAgICAvLyBLZWVwIGNoaWxkcmVuIHNvIGludGVyYWN0aXZlIGNvbnRlbnQgKGUuZy4gbGlua3MpIGluc2lkZSB0aGUgbGFiZWwgc3RpbGwgYXBwZWFycyBpblxuICAgICAgICAgICAgLy8gcmVhZGluZy90YWIgb3JkZXIuXG4gICAgICAgICAgICBpZiAoZWxlbS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIkxBQkVMXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGVsZW0uaGFzQXR0cmlidXRlKFwiZm9yXCIpXG4gICAgICAgICAgICAgICAgICAgICYmIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW0uZ2V0QXR0cmlidXRlKFwiZm9yXCIpKVxuICAgICAgICAgICAgICAgICAgICAmJiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbGVtLmdldEF0dHJpYnV0ZShcImZvclwiKSkuZ2V0QXR0cmlidXRlKFwidHlwZVwiKSAhPT0gXCJoaWRkZW5cIlxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0VmFsID0geyBza2lwQ3VycmVudDogdHJ1ZSwgc2tpcENoaWxkcmVuOiBmYWxzZSB9O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5lc3RlZENvbnRyb2wgPSBlbGVtLnF1ZXJ5U2VsZWN0b3IoXCJpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYSwgYnV0dG9uLCBbcm9sZT0nY2hlY2tib3gnXSwgW3JvbGU9J2NvbWJvYm94J10sIFtyb2xlPSdsaXN0Ym94J10sIFtyb2xlPSdtZW51aXRlbWNoZWNrYm94J10sIFtyb2xlPSdtZW51aXRlbXJhZGlvJ10sIFtyb2xlPSdyYWRpbyddLCBbcm9sZT0nc2VhcmNoYm94J10sIFtyb2xlPSdzbGlkZXInXSwgW3JvbGU9J3NwaW5idXR0b24nXSwgW3JvbGU9J3N3aXRjaCddLCBbcm9sZT0ndGV4dGJveCddXCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobmVzdGVkQ29udHJvbCAmJiAobmVzdGVkQ29udHJvbCBhcyBIVE1MRWxlbWVudCkuZ2V0QXR0cmlidXRlKFwidHlwZVwiKSAhPT0gXCJoaWRkZW5cIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbCA9IHsgc2tpcEN1cnJlbnQ6IHRydWUsIHNraXBDaGlsZHJlbjogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU2tpcCBub24taW50ZXJhY3RpdmUgY29udGVudCB0aGF0IGlzIGEgZGVzY2VuZGFudCBvZiBhIGZvci1saW5rZWQgbGFiZWwuXG4gICAgICAgICAgICAvLyBTdWNoIGNvbnRlbnQgaXMgYWxyZWFkeSBzdXJmYWNlZCBhcyBwYXJ0IG9mIHRoZSBhc3NvY2lhdGVkIGNvbnRyb2wncyBhbm5vdW5jZW1lbnQuXG4gICAgICAgICAgICAvLyBJbnRlcmFjdGl2ZSBkZXNjZW5kYW50cyAobGlua3MsIGJ1dHRvbnMsIGV0Yy4pIGFyZSBhbGxvd2VkIHRocm91Z2guXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGFiZWxGb3IgPSBlbGVtLmNsb3Nlc3QoXCJsYWJlbFtmb3JdXCIpIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICAgICAgICAgICAgICBjb25zdCBsYWJlbEZvclRhcmdldCA9IGxhYmVsRm9yICYmIGxhYmVsRm9yLmdldEF0dHJpYnV0ZShcImZvclwiKTtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsRm9yXG4gICAgICAgICAgICAgICAgICAgICYmIGxhYmVsRm9yVGFyZ2V0XG4gICAgICAgICAgICAgICAgICAgICYmIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGxhYmVsRm9yVGFyZ2V0KVxuICAgICAgICAgICAgICAgICAgICAmJiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChsYWJlbEZvclRhcmdldCkuZ2V0QXR0cmlidXRlKFwidHlwZVwiKSAhPT0gXCJoaWRkZW5cIlxuICAgICAgICAgICAgICAgICAgICAmJiAhZWxlbS5jbG9zZXN0KFwiYVtocmVmXSwgW3JvbGU9J2xpbmsnXSwgYnV0dG9uLCBbcm9sZT0nYnV0dG9uJ11cIilcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbCA9IHsgc2tpcEN1cnJlbnQ6IHRydWUsIHNraXBDaGlsZHJlbjogbm9kZVR5cGUgPT09IDEgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHJvbGUgPSBjdXJzb3JTdGFydC5nZXRSb2xlKCk7XG5cbiAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgcHJlc2VudGF0aW9uYWwgY2hpbGRyZW4sIHJlYWQgdGhlIGVsZW1lbnQsIHNraXAgdGhlIGNoaWxkcmVuXG4gICAgICAgICAgICBpZiAoQXJpYVV0aWwuY29udGFpbnNQcmVzZW50YXRpb25hbENoaWxkcmVuT25seShlbGVtKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXRWYWwgPSB7IHNraXBDdXJyZW50OiBmYWxzZSwgc2tpcENoaWxkcmVuOiB0cnVlIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBTa2lwIGNoaWxkcmVuIG9mIGhlYWRpbmdzL2xpbmtzIHRoYXQgZG9uJ3QgdXNlIGNvbnRlbnQtYmFzZWQgbmFtZXNcbiAgICAgICAgICAgIC8vIFVOTEVTUyB3ZSdyZSBpbnNpZGUgYW5vdGhlciBoZWFkaW5nL2xpbmsgdGhhdCBET0VTIHVzZSBjb250ZW50LWJhc2VkIG5hbWVzXG4gICAgICAgICAgICBpZiAoW1wibGlua1wiLCBcImhlYWRpbmdcIl0uaW5jbHVkZXMocm9sZSkgJiYgKCFjdXJzb3JTdGFydC5nZXROYW1lKCkgfHwgKCFbXCJjb250ZW50XCIsIFwidGV4dFwiXS5pbmNsdWRlcyhjdXJzb3JTdGFydC5nZXROYW1lSW5mbygpLm5hbWVGcm9tKSkpKSB7XG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgd2UncmUgaW5zaWRlIGEgcGFyZW50IGhlYWRpbmcvbGluayB3aXRoIGNvbnRlbnQtYmFzZWQgbmFtZVxuICAgICAgICAgICAgICAgIGlmIChwYXJlbnRIZWFkaW5nT3JMaW5rICYmIHBhcmVudEhlYWRpbmdPckxpbmsuZ2V0TmFtZUluZm8oKSAmJiBbXCJjb250ZW50XCIsIFwidGV4dFwiXS5pbmNsdWRlcyhwYXJlbnRIZWFkaW5nT3JMaW5rLmdldE5hbWVJbmZvKCkubmFtZUZyb20pKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIERvbid0IHNraXAgY2hpbGRyZW4gLSB3ZSdyZSBuZXN0ZWQgaW5zaWRlIGEgY29udGVudC1iYXNlZCBoZWFkaW5nL2xpbmtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0VmFsID0geyBza2lwQ3VycmVudDogZmFsc2UsIHNraXBDaGlsZHJlbjogdHJ1ZSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGVsZW0ubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJMRUdFTkRcIikge1xuICAgICAgICAgICAgICAgIGxldCBwYXJlbnQgPSBET01XYWxrZXIucGFyZW50RWxlbWVudChjdXJzb3IuZ2V0Tm9kZSgpKTtcbiAgICAgICAgICAgICAgICB3aGlsZSAocGFyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnQubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gJ0ZJRUxEU0VUJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGVnZW5kIGlzIHdpdGhpbiBhIGZpZWxkc2V0LCBzdXBwcmVzcyBvdXRwdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXRWYWwgPSB7IHNraXBDdXJyZW50OiBmYWxzZSwgc2tpcENoaWxkcmVuOiB0cnVlIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQocGFyZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZWxlbSAmJiBlbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiTVNVUFwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbCA9IHsgc2tpcEN1cnJlbnQ6IGZhbHNlLCBza2lwQ2hpbGRyZW46IHRydWUgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlbGVtLmNsb3Nlc3QoXCIuaWJtYS1zci1vdmVybGF5XCIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbCA9IHsgc2tpcEN1cnJlbnQ6IHRydWUsIHNraXBDaGlsZHJlbjogdHJ1ZSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJldFZhbCA9IG51bGw7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBERUJVRyAmJiBjb25zb2xlLmxvZyhcIlNLSVBfSVRFTSByZXRWYWw6XCIsIHJldFZhbCk7XG4gICAgICAgICAgICBERUJVRyAmJiBjb25zb2xlLmdyb3VwRW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmUgc2tpcCBiZWhhdmlvciBmb3IgbmVzdGVkIG5hdmlnYXRpb24gbW9kZXMgKGxpbmssIGhlYWRpbmcsIGltYWdlLCBldGMuKVxuICAgICAqIFNpbXBsZXIgdGhhbiBTS0lQX0lURU1fQkVIQVZJT1IgYXMgaXQgZG9lc24ndCBuZWVkIGNvbXBsZXggaGVhZGluZy9saW5rIGNvbnRlbnQgcnVsZXNcbiAgICAgKiBAcGFyYW0gY3Vyc29yIFRoZSBjdXJzb3IgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb25cbiAgICAgKiBAcmV0dXJucyBPYmplY3QgaW5kaWNhdGluZyB3aGV0aGVyIHRvIHNraXAgY3VycmVudCBub2RlIGFuZC9vciBpdHMgY2hpbGRyZW4sIG9yIG51bGwgZm9yIGRlZmF1bHQgYmVoYXZpb3JcbiAgICAgKi9cbiAgICBjb25zdCBTS0lQX05FU1RFRF9CRUhBVklPUiA9IChjdXJzb3I6IFNSQ3Vyc29yKSA6IHsgc2tpcEN1cnJlbnQ6IGJvb2xlYW4sIHNraXBDaGlsZHJlbjogYm9vbGVhbn0gfCBudWxsID0+IHtcbiAgICAgICAgY29uc3Qgbm9kZVR5cGUgPSBjdXJzb3IuZ2V0Tm9kZSgpLm5vZGVUeXBlO1xuICAgICAgICBjb25zdCBlbGVtID0gY3Vyc29yLmdldEVsZW1lbnQoKTtcbiAgICAgICAgLy8gT25seSB2aXNpdCBlbGVtZW50cyBhbmQgdGV4dCBub2Rlc1xuICAgICAgICBpZiAobm9kZVR5cGUgIT09IDEgJiYgbm9kZVR5cGUgIT09IDMpIHJldHVybiB7IHNraXBDdXJyZW50OiB0cnVlLCBza2lwQ2hpbGRyZW46IGZhbHNlIH07XG4gICAgICAgIGlmIChub2RlVHlwZSA9PT0gMykgcmV0dXJuIFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKGVsZW0pID8geyBza2lwQ3VycmVudDogdHJ1ZSwgc2tpcENoaWxkcmVuOiBmYWxzZSB9IDogbnVsbDtcbiAgICAgICAgLy8gV2UgaGF2ZSBhbiBlbGVtZW5ldFxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQoZWxlbSkpIHJldHVybiB7IHNraXBDdXJyZW50OiB0cnVlLCBza2lwQ2hpbGRyZW46IHRydWUgfTtcbiAgICAgICAgLy8gU2tpcCBsYWJlbCBmb3JzIC0gdGhleSdsbCBiZSByZWFkIHdpdGggdGhlIHJlbGF0ZWQgaW5wdXQuXG4gICAgICAgIC8vIEtlZXAgY2hpbGRyZW4gc28gaW50ZXJhY3RpdmUgY29udGVudCAoZS5nLiBsaW5rcykgaW5zaWRlIHRoZSBsYWJlbCBzdGlsbCBhcHBlYXJzIGluXG4gICAgICAgIC8vIHJlYWRpbmcvdGFiIG9yZGVyLlxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBlbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiTEFCRUxcIlxuICAgICAgICAgICAgJiYgZWxlbS5oYXNBdHRyaWJ1dGUoXCJmb3JcIilcbiAgICAgICAgICAgICYmIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW0uZ2V0QXR0cmlidXRlKFwiZm9yXCIpKVxuICAgICAgICAgICAgJiYgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxlbS5nZXRBdHRyaWJ1dGUoXCJmb3JcIikpLmdldEF0dHJpYnV0ZShcInR5cGVcIikgIT09IFwiaGlkZGVuXCJcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4geyBza2lwQ3VycmVudDogdHJ1ZSwgc2tpcENoaWxkcmVuOiBmYWxzZSB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2tpcCBub24taW50ZXJhY3RpdmUgY29udGVudCB0aGF0IGlzIGEgZGVzY2VuZGFudCBvZiBhIGZvci1saW5rZWQgbGFiZWwuXG4gICAgICAgIC8vIFN1Y2ggY29udGVudCBpcyBhbHJlYWR5IHN1cmZhY2VkIGFzIHBhcnQgb2YgdGhlIGFzc29jaWF0ZWQgY29udHJvbCdzIGFubm91bmNlbWVudC5cbiAgICAgICAgLy8gSW50ZXJhY3RpdmUgZGVzY2VuZGFudHMgKGxpbmtzLCBidXR0b25zLCBldGMuKSBhcmUgYWxsb3dlZCB0aHJvdWdoLlxuICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBsYWJlbEZvciA9IGVsZW0uY2xvc2VzdChcImxhYmVsW2Zvcl1cIikgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgICAgICAgICAgY29uc3QgbGFiZWxGb3JUYXJnZXQgPSBsYWJlbEZvciAmJiBsYWJlbEZvci5nZXRBdHRyaWJ1dGUoXCJmb3JcIik7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgbGFiZWxGb3JcbiAgICAgICAgICAgICAgICAmJiBsYWJlbEZvclRhcmdldFxuICAgICAgICAgICAgICAgICYmIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGxhYmVsRm9yVGFyZ2V0KVxuICAgICAgICAgICAgICAgICYmIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGxhYmVsRm9yVGFyZ2V0KS5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpICE9PSBcImhpZGRlblwiXG4gICAgICAgICAgICAgICAgJiYgIWVsZW0uY2xvc2VzdChcImFbaHJlZl0sIFtyb2xlPSdsaW5rJ10sIGJ1dHRvbiwgW3JvbGU9J2J1dHRvbiddXCIpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBza2lwQ3VycmVudDogdHJ1ZSwgc2tpcENoaWxkcmVuOiBub2RlVHlwZSA9PT0gMSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgcm9sZSA9IGN1cnNvci5nZXRSb2xlKCk7XG5cbiAgICAgICAgLy8gSWYgd2UgaGF2ZSBwcmVzZW50YXRpb25hbCBjaGlsZHJlbiwgcmVhZCB0aGUgZWxlbWVudCwgc2tpcCB0aGUgY2hpbGRyZW5cbiAgICAgICAgaWYgKEFyaWFVdGlsLmNvbnRhaW5zUHJlc2VudGF0aW9uYWxDaGlsZHJlbk9ubHkoZWxlbSkpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHNraXBDdXJyZW50OiBmYWxzZSwgc2tpcENoaWxkcmVuOiB0cnVlIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsZW0gJiYgZWxlbS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIk1TVVBcIikge1xuICAgICAgICAgICAgcmV0dXJuIHsgc2tpcEN1cnJlbnQ6IHRydWUsIHNraXBDaGlsZHJlbjogdHJ1ZSB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbGVtLmNsb3Nlc3QoXCIuaWJtYS1zci1vdmVybGF5XCIpKSB7XG4gICAgICAgICAgICByZXR1cm4geyBza2lwQ3VycmVudDogdHJ1ZSwgc2tpcENoaWxkcmVuOiB0cnVlIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBza2lwIGZ1bmN0aW9uIGZvciBhIGdpdmVuIG5hdmlnYXRpb24gbW9kZVxuICAgICAqIEBwYXJhbSBtb2RlIFRoZSBuYXZpZ2F0aW9uIG1vZGVcbiAgICAgKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBub2RlcyB0byBza2lwIGR1cmluZyBuYXZpZ2F0aW9uXG4gICAgICovXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGdldFNraXBGdW5jKG1vZGU6IE5hdmlnYXRpb25Nb2RlKSA6IFNSQ3Vyc29yU2tpcEZ1bmMge1xuICAgICAgICBzd2l0Y2ggKG1vZGUpIHtcbiAgICAgICAgICAgIGNhc2UgXCJyZWdpb25cIjpcbiAgICAgICAgICAgIGNhc2UgXCJpdGVtXCI6IFxuICAgICAgICAgICAgICAgIHJldHVybiBTS0lQX0lURU1fQkVIQVZJT1I7XG4gICAgICAgICAgICBjYXNlIFwibGlua1wiOiBcbiAgICAgICAgICAgIGNhc2UgXCJ0YWJfZm9jdXNcIjogXG4gICAgICAgICAgICBjYXNlIFwiaGVhZGluZ1wiOlxuICAgICAgICAgICAgY2FzZSBcImgxXCI6XG4gICAgICAgICAgICBjYXNlIFwiaDJcIjpcbiAgICAgICAgICAgIGNhc2UgXCJoM1wiOlxuICAgICAgICAgICAgY2FzZSBcImg0XCI6XG4gICAgICAgICAgICBjYXNlIFwiaDVcIjpcbiAgICAgICAgICAgIGNhc2UgXCJoNlwiOlxuICAgICAgICAgICAgY2FzZSBcImltYWdlXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFNLSVBfTkVTVEVEX0JFSEFWSU9SO1xuICAgICAgICAgICAgY2FzZSBcInJhZGlvXCI6XG4gICAgICAgICAgICBjYXNlIFwiYnV0dG9uXCI6XG4gICAgICAgICAgICBjYXNlIFwiY2hlY2tib3hcIjpcbiAgICAgICAgICAgIGNhc2UgXCJjb21ib1wiOiAgICAgICBcbiAgICAgICAgICAgIGNhc2UgXCJsaXN0XCI6XG4gICAgICAgICAgICBjYXNlIFwibGlzdGl0ZW1cIjpcbiAgICAgICAgICAgIGNhc2UgXCJhcnRpY2xlXCI6XG4gICAgICAgICAgICBjYXNlIFwidGFibGVcIjpcbiAgICAgICAgICAgIGNhc2UgXCJwYXJhZ3JhcGhcIjpcbiAgICAgICAgICAgIGNhc2UgXCJkb21cIjpcbiAgICAgICAgICAgIGNhc2UgXCJmb3JtY29udHJvbFwiOlxuICAgICAgICAgICAgY2FzZSBcImVkaXRib3hcIjpcbiAgICAgICAgICAgIGNhc2UgXCJncmFwaGljXCI6XG4gICAgICAgICAgICBjYXNlIFwiZnJhbWVcIjpcbiAgICAgICAgICAgIGNhc2UgXCJkaXZpc2lvblwiOlxuICAgICAgICAgICAgY2FzZSBcInRhYmNvbnRyb2xcIjpcbiAgICAgICAgICAgIGNhc2UgXCJzZXBhcmF0b3JcIjpcbiAgICAgICAgICAgIGNhc2UgXCJjbGlja2FibGVcIjpcbiAgICAgICAgICAgIGNhc2UgXCJtb3VzZW92ZXJcIjpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOT1RfSU1QTEVNRU5URURcIik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBcbiAgICAvKipcbiAgICAgKiBKdW1wIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uIG9yIHRoZSBwcmV2aW91cyBtYXRjaGluZyBlbGVtZW50IGlmIGN1cnJlbnQgZG9lc24ndCBtYXRjaFxuICAgICAqIEBwYXJhbSBtb2RlIFRoZSBuYXZpZ2F0aW9uIG1vZGVcbiAgICAgKiBAcGFyYW0gd2Fsa2VyIFRoZSBjdXJzb3IgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb25cbiAgICAgKiBAcmV0dXJucyBBIGN1cnNvciBhdCB0aGUgY3VycmVudCBvciBwcmV2aW91cyBtYXRjaGluZyBwb3NpdGlvblxuICAgICAqL1xuICAgIGV4cG9ydCBmdW5jdGlvbiBqdW1wQ3VycmVudChtb2RlOiBOYXZpZ2F0aW9uTW9kZSwgd2Fsa2VyOiBTUkN1cnNvcikgOiBTUkN1cnNvciB7XG4gICAgICAgIGNvbnN0IG1hdGNoRnVuYyA9IG1vZGUgPT09IFwidGFiX2ZvY3VzXCIgPyBnZXRUYWJGb2N1c1N0YXJ0RnVuYyh0cnVlKSA6IGdldFN0YXJ0RnVuYyhtb2RlKTtcbiAgICAgICAgaWYgKG1hdGNoRnVuYyh3YWxrZXIuZ2V0Um9sZSgpLCAhd2Fsa2VyLmlzRW5kVGFnKCksIHdhbGtlci5nZXROb2RlKCkpKSB7XG4gICAgICAgICAgICByZXR1cm4gd2Fsa2VyLmNsb25lKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4ganVtcFByZXZpb3VzKG1vZGUsIHdhbGtlcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogSnVtcCB0byB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IGVsZW1lbnQgYW5kIHJldHVybiBhbGwgaW50ZXJtZWRpYXRlIGl0ZW0gcG9zaXRpb25zXG4gICAgICogQHBhcmFtIG1vZGUgVGhlIG5hdmlnYXRpb24gbW9kZVxuICAgICAqIEBwYXJhbSB3YWxrZXIgVGhlIGN1cnNvciBhdCB0aGUgY3VycmVudCBwb3NpdGlvblxuICAgICAqIEByZXR1cm5zIEFycmF5IG9mIGN1cnNvcnMgcmVwcmVzZW50aW5nIHBvc2l0aW9ucyBmcm9tIGN1cnJlbnQgdG8gZW5kXG4gICAgICovXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGp1bXBDdXJyZW50RW5kKG1vZGU6IE5hdmlnYXRpb25Nb2RlLCB3YWxrZXI6IFNSQ3Vyc29yKSA6IFNSQ3Vyc29yW10ge1xuICAgICAgICBpZiAobW9kZSA9PT0gXCJpdGVtXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1FbmQgPSBqdW1wTmV4dChtb2RlLCB3YWxrZXIpO1xuICAgICAgICAgICAgcmV0dXJuIGl0ZW1FbmQgPyBbaXRlbUVuZF0gOiBbXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IG5hbWVJbmZvID0gd2Fsa2VyLmdldE5hbWVJbmZvKCk7XG4gICAgICAgICAgICBsZXQgcmV0VmFsID0gd2Fsa2VyLmNsb25lKCk7XG4gICAgICAgICAgICBpZiAobmFtZUluZm8gJiYgIVtcImNvbnRlbnRcIiwgXCJ0ZXh0XCJdLmluY2x1ZGVzKG5hbWVJbmZvLm5hbWVGcm9tKSkge1xuICAgICAgICAgICAgICAgIC8vIE5hbWUgaXMganVzdCBmcm9tIHRoZSBpdGVtIGl0c2VsZlxuICAgICAgICAgICAgICAgIHJldFZhbC5uZXh0KCgpID0+IHRydWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBOYW1lIGlzIGZyb20gdGhlIGNvbnRlbnRcbiAgICAgICAgICAgICAgICByZXRWYWwuc2V0RW5kVGFnKHRydWUpO1xuICAgICAgICAgICAgICAgIHJldFZhbC5uZXh0KCgpID0+IHRydWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBlbmRDdXJzb3JzOiBTUkN1cnNvcltdID0gW107XG4gICAgICAgICAgICBsZXQgaXRlbUVuZCA9IGp1bXBOZXh0KFwiaXRlbVwiLCB3YWxrZXIpO1xuICAgICAgICAgICAgd2hpbGUgKGl0ZW1FbmQgJiYgU1JDdXJzb3IuY29tcGFyZShpdGVtRW5kLCByZXRWYWwpIDwgMCkge1xuICAgICAgICAgICAgICAgIGVuZEN1cnNvcnMucHVzaChpdGVtRW5kKTtcbiAgICAgICAgICAgICAgICBpdGVtRW5kID0ganVtcE5leHQoXCJpdGVtXCIsIGl0ZW1FbmQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZW5kQ3Vyc29ycy5wdXNoKHJldFZhbCk7XG4gICAgICAgICAgICByZXR1cm4gbW9kZSA9PT0gXCJ0YWJfZm9jdXNcIiAmJiB3YWxrZXIuZ2V0Um9sZSgpID09PSBcImxpbmtcIiA/IFtlbmRDdXJzb3JzW2VuZEN1cnNvcnMubGVuZ3RoIC0gMV1dIDogZW5kQ3Vyc29ycztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEp1bXAgdG8gdGhlIG5leHQgbWF0Y2hpbmcgZWxlbWVudCBpbiB0aGUgZ2l2ZW4gbmF2aWdhdGlvbiBtb2RlXG4gICAgICogQHBhcmFtIG1vZGUgVGhlIG5hdmlnYXRpb24gbW9kZVxuICAgICAqIEBwYXJhbSB3YWxrZXIgVGhlIGN1cnNvciBhdCB0aGUgY3VycmVudCBwb3NpdGlvblxuICAgICAqIEByZXR1cm5zIEEgY3Vyc29yIGF0IHRoZSBuZXh0IG1hdGNoaW5nIHBvc2l0aW9uLCBvciBudWxsIGlmIG5vbmUgZm91bmRcbiAgICAgKi9cbiAgICBleHBvcnQgZnVuY3Rpb24ganVtcE5leHQobW9kZTogTmF2aWdhdGlvbk1vZGUsIHdhbGtlcjogU1JDdXJzb3IpIDogU1JDdXJzb3Ige1xuICAgICAgICBjb25zdCBERUJVRyA9IGZhbHNlO1xuICAgICAgICBERUJVRyAmJiBjb25zb2xlLmdyb3VwKFwiU1JOYXZpZ2F0b3I6Omp1bXBOZXh0XCIsIHdhbGtlci5pc0VuZFRhZygpP1wiL1wiOlwiXCIsIHdhbGtlci5nZXROb2RlKCkpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKG1vZGUgPT09IFwidGFiX2ZvY3VzXCIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0YWJGb2N1c01hdGNoRnVuYyA9IGdldFRhYkZvY3VzU3RhcnRGdW5jKHRydWUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhYkZvY3VzQ3Vyc29ycyA9IGNvbGxlY3RUYWJGb2N1c0N1cnNvcnModGFiRm9jdXNNYXRjaEZ1bmMsIHdhbGtlci5nZXROb2RlKCkpO1xuICAgICAgICAgICAgICAgIGlmICh0YWJGb2N1c0N1cnNvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyh0YWJGb2N1c0N1cnNvcnMubWFwKGMgPT4gYy5nZXROb2RlKCkpKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFRhYkZvY3VzUGFyZW50Q3Vyc29yID0gd2Fsa2VyLmdldEN1cnJlbnRPclBhcmVudFRhYmJhYmxlQ2xvbmUoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFRhYkZvY3VzQ3Vyc29yID0gY3VycmVudFRhYkZvY3VzUGFyZW50Q3Vyc29yICYmIGZpbmRUYWJGb2N1c0luZGV4KHRhYkZvY3VzQ3Vyc29ycywgY3VycmVudFRhYkZvY3VzUGFyZW50Q3Vyc29yKSA+PSAwID8gY3VycmVudFRhYkZvY3VzUGFyZW50Q3Vyc29yIDogd2Fsa2VyLmNsb25lKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IGZpbmRUYWJGb2N1c0luZGV4KHRhYkZvY3VzQ3Vyc29ycywgY3VycmVudFRhYkZvY3VzQ3Vyc29yKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudEluZGV4ICsgMSA8IHRhYkZvY3VzQ3Vyc29ycy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFiRm9jdXNDdXJzb3JzW2N1cnJlbnRJbmRleCArIDFdLmNsb25lKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFiRm9jdXNDdXJzb3JzWzBdLmNsb25lKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgcmV0VmFsID0gd2Fsa2VyLmNsb25lKCk7XG4gICAgICAgICAgICBjb25zdCBtYXRjaEZ1bmMgPSBnZXRTdGFydEZ1bmMobW9kZSk7XG4gICAgICAgICAgICBjb25zdCBza2lwRnVuYyA9IGdldFNraXBGdW5jKG1vZGUpO1xuICAgICAgICAgICAgaWYgKHJldFZhbC5uZXh0KG1hdGNoRnVuYywgc2tpcEZ1bmMpKSB7XG4gICAgICAgICAgICAgICAgREVCVUcgJiYgY29uc29sZS5sb2coXCJTUk5hdmlnYXRvcjo6anVtcE5leHQgcmVzdWx0XCIsIHJldFZhbCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBjb25zb2xlLmdyb3VwRW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBOYXZpZ2F0ZXMgdG8gdGhlIHByZXZpb3VzIGVsZW1lbnQgaW4gc2NyZWVuIHJlYWRlciBuYXZpZ2F0aW9uIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgbW9kZS5cbiAgICAgKlxuICAgICAqIEZvciB0YWJfZm9jdXMgbW9kZSwgdGhpcyBmdW5jdGlvbiBhdHRlbXB0cyB0byBtb3ZlIHRvIHRoZSBwcmV2aW91cyB0YWJiYWJsZSBlbGVtZW50IGJ5OlxuICAgICAqIDEuIEZpcnN0IHRyeWluZyB0byBtb3ZlIGJhY2t3YXJkIHVzaW5nIHRoZSBtb2RlJ3MgbWF0Y2ggYW5kIHNraXAgZnVuY3Rpb25zXG4gICAgICogMi4gSWYgdGhhdCBmYWlscywgY29sbGVjdGluZyBhbGwgdGFiIGZvY3VzIGN1cnNvcnMgYW5kIGZpbmRpbmcgdGhlIHByZXZpb3VzIG9uZSBpbiB0aGUgdGFiIG9yZGVyXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbW9kZSAtIFRoZSBuYXZpZ2F0aW9uIG1vZGUgKGUuZy4sIFwidGFiX2ZvY3VzXCIpIHRoYXQgZGV0ZXJtaW5lcyBob3cgdG8gbmF2aWdhdGVcbiAgICAgKiBAcGFyYW0gd2Fsa2VyIC0gVGhlIGN1cnJlbnQgY3Vyc29yIHBvc2l0aW9uIGluIHRoZSBzY3JlZW4gcmVhZGVyIG5hdmlnYXRpb25cbiAgICAgKiBAcmV0dXJucyBBIG5ldyBjdXJzb3IgcG9zaXRpb25lZCBhdCB0aGUgcHJldmlvdXMgZWxlbWVudCwgb3IgbnVsbCBpZiBubyBwcmV2aW91cyBlbGVtZW50IGV4aXN0c1xuICAgICAqL1xuICAgIGV4cG9ydCBmdW5jdGlvbiBqdW1wUHJldmlvdXMobW9kZTogTmF2aWdhdGlvbk1vZGUsIHdhbGtlcjogU1JDdXJzb3IpIDogU1JDdXJzb3Ige1xuICAgICAgICBpZiAobW9kZSA9PT0gXCJ0YWJfZm9jdXNcIikge1xuICAgICAgICAgICAgbGV0IHJldFZhbCA9IHdhbGtlci5jbG9uZSgpO1xuICAgICAgICAgICAgY29uc3QgbWF0Y2hGdW5jID0gZ2V0U3RhcnRGdW5jKG1vZGUpO1xuICAgICAgICAgICAgY29uc3Qgc2tpcEZ1bmMgPSBnZXRTa2lwRnVuYyhtb2RlKTtcbiAgICAgICAgICAgIGlmIChyZXRWYWwucHJldmlvdXMobWF0Y2hGdW5jLCBza2lwRnVuYykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCB0YWJGb2N1c01hdGNoRnVuYyA9IGdldFRhYkZvY3VzU3RhcnRGdW5jKHRydWUpO1xuICAgICAgICAgICAgY29uc3QgdGFiRm9jdXNDdXJzb3JzID0gY29sbGVjdFRhYkZvY3VzQ3Vyc29ycyh0YWJGb2N1c01hdGNoRnVuYywgd2Fsa2VyLmdldE5vZGUoKSk7XG4gICAgICAgICAgICBpZiAodGFiRm9jdXNDdXJzb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50VGFiRm9jdXNQYXJlbnRDdXJzb3IgPSB3YWxrZXIuZ2V0Q3VycmVudE9yUGFyZW50VGFiYmFibGVDbG9uZSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRUYWJGb2N1c0N1cnNvciA9IGN1cnJlbnRUYWJGb2N1c1BhcmVudEN1cnNvciAmJiBmaW5kVGFiRm9jdXNJbmRleCh0YWJGb2N1c0N1cnNvcnMsIGN1cnJlbnRUYWJGb2N1c1BhcmVudEN1cnNvcikgPj0gMCA/IGN1cnJlbnRUYWJGb2N1c1BhcmVudEN1cnNvciA6IHdhbGtlci5jbG9uZSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IGZpbmRUYWJGb2N1c0luZGV4KHRhYkZvY3VzQ3Vyc29ycywgY3VycmVudFRhYkZvY3VzQ3Vyc29yKTtcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudEluZGV4ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFiRm9jdXNDdXJzb3JzW2N1cnJlbnRJbmRleCAtIDFdLmNsb25lKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmV0VmFsID0gd2Fsa2VyLmNsb25lKCk7XG4gICAgICAgIGNvbnN0IG1hdGNoRnVuYyA9IGdldFN0YXJ0RnVuYyhtb2RlKTtcbiAgICAgICAgY29uc3Qgc2tpcEZ1bmMgPSBnZXRTa2lwRnVuYyhtb2RlKTtcbiAgICAgICAgaWYgKHJldFZhbC5wcmV2aW91cyhtYXRjaEZ1bmMsIHNraXBGdW5jKSkge1xuICAgICAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG59XG4iLCJpbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBTUk5hdmlnYXRvciB9IGZyb20gXCIuL1NSTmF2aWdhdG9yXCI7XG5pbXBvcnQgeyBDb250YWluZXJDaGFuZ2VzLCBOYXZpZ2F0aW9uTW9kZSwgUmVuZGVyUmVzdWx0IH0gZnJvbSBcIi4vU1JUeXBlc1wiO1xuaW1wb3J0IHsgU1JDdXJzb3IgfSBmcm9tIFwiLi9TUkN1cnNvclwiO1xuaW1wb3J0IHsgU1JfUlVMRVMsIENPTlRBSU5FUl9FTlRFUl9SVUxFUywgQ09OVEFJTkVSX0VYSVRfUlVMRVMgfSBmcm9tIFwiLi9yZW5kZXJfcnVsZXNcIjtcbmltcG9ydCB7IGdldExpbmtBbm5vdW5jZW1lbnQgfSBmcm9tIFwiLi9yZW5kZXJfcnVsZXMvY29tbW9uXCI7XG5cbi8qKlxuICogU1JSZW5kZXJlciBuYW1lc3BhY2UgcHJvdmlkZXMgZnVuY3Rpb25hbGl0eSBmb3Igc2ltdWxhdGluZyBob3cgc2NyZWVuIHJlYWRlcnNcbiAqIGFubm91bmNlIGNvbnRlbnQgdG8gdXNlcnMuIEl0IGNvbnRhaW5zIHJ1bGVzIGZvciByZW5kZXJpbmcgZGlmZmVyZW50IHR5cGVzIG9mXG4gKiBlbGVtZW50cyBhbmQgQVJJQSByb2xlcyBpbiB2YXJpb3VzIG5hdmlnYXRpb24gbW9kZXMuXG4gKlxuICogVGhlIHJlbmRlcmVyIHVzZXMgYSBydWxlLWJhc2VkIHN5c3RlbSB0byBkZXRlcm1pbmUgd2hhdCB0ZXh0IHNob3VsZCBiZSBhbm5vdW5jZWRcbiAqIHdoZW4gbmF2aWdhdGluZyB0bywgd2l0aGluLCBvciBhd2F5IGZyb20gZWxlbWVudHMgYmFzZWQgb24gdGhlaXIgcm9sZXMgYW5kIHByb3BlcnRpZXMuXG4gKi9cbmV4cG9ydCBuYW1lc3BhY2UgU1JSZW5kZXJlciB7XG4gICAgLyoqXG4gICAgICogR2VuZXJhdGVzIHRoZSBhbm5vdW5jZW1lbnQgdGV4dCB3aGVuIGVudGVyaW5nIGFuIGVsZW1lbnRcbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gbG9va3MgdXAgdGhlIGFwcHJvcHJpYXRlIHJ1bGUgYmFzZWQgb24gdGhlIGVsZW1lbnQncyByb2xlIG9yIHRhZyBuYW1lXG4gICAgICogYW5kIGFwcGxpZXMgaXQgdG8gZ2VuZXJhdGUgdGhlIGFubm91bmNlbWVudCB0ZXh0LlxuICAgICAqXG4gICAgICogQHBhcmFtIG1vZGUgLSBUaGUgY3VycmVudCBuYXZpZ2F0aW9uIG1vZGVcbiAgICAgKiBAcGFyYW0gd2Fsa2VyIC0gQ3Vyc29yIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uXG4gICAgICogQHBhcmFtIG9sZFdhbGtlciAtIE9wdGlvbmFsIGN1cnNvciBhdCB0aGUgcHJldmlvdXMgcG9zaXRpb25cbiAgICAgKiBAcmV0dXJucyBBbm5vdW5jZW1lbnQgdGV4dCBmb3IgZW50ZXJpbmcgdGhlIGVsZW1lbnQsIG9yIG51bGwgaWYgbm8gcnVsZSBhcHBsaWVzXG4gICAgICovXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHJlbmRlckVudGVyKG1vZGU6IE5hdmlnYXRpb25Nb2RlIHwgXCJmb2N1c1wiLCB3YWxrZXI6IFNSQ3Vyc29yLCBvbGRXYWxrZXI/OiBTUkN1cnNvcik6IHN0cmluZyB8IG51bGwgeyAgICAgICAgXG4gICAgICAgIGNvbnN0IERFQlVHID0gZmFsc2U7XG4gICAgICAgIGZvciAoY29uc3QgcnVsZSBvZiBDT05UQUlORVJfRU5URVJfUlVMRVMpIHtcbiAgICAgICAgICAgIGxldCBzID0gcnVsZS50ZXN0KG1vZGUsIHdhbGtlciwgb2xkV2Fsa2VyKTtcbiAgICAgICAgICAgIERFQlVHICYmIGNvbnNvbGUubG9nKG1vZGUsIHdhbGtlciwgcnVsZSwgcyk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHMgIT09IFwidW5kZWZpbmVkXCIgJiYgcyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlcyB0aGUgYW5ub3VuY2VtZW50IHRleHQgd2hlbiBsZWF2aW5nIGFuIGVsZW1lbnRcbiAgICAgKlxuICAgICAqIFNpbWlsYXIgdG8gcmVuZGVyRW50ZXIsIGJ1dCBhcHBsaWVzIHJ1bGVzIGZvciBsZWF2aW5nIGVsZW1lbnRzIGluc3RlYWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbW9kZSAtIFRoZSBjdXJyZW50IG5hdmlnYXRpb24gbW9kZVxuICAgICAqIEBwYXJhbSB3YWxrZXIgLSBDdXJzb3IgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb25cbiAgICAgKiBAcGFyYW0gb2xkV2Fsa2VyIC0gT3B0aW9uYWwgY3Vyc29yIGF0IHRoZSBwcmV2aW91cyBwb3NpdGlvblxuICAgICAqIEByZXR1cm5zIEFubm91bmNlbWVudCB0ZXh0IGZvciBsZWF2aW5nIHRoZSBlbGVtZW50LCBvciBudWxsIGlmIG5vIHJ1bGUgYXBwbGllc1xuICAgICAqL1xuICAgIGV4cG9ydCBmdW5jdGlvbiByZW5kZXJMZWF2ZShtb2RlOiBOYXZpZ2F0aW9uTW9kZSwgd2Fsa2VyOiBTUkN1cnNvciwgb2xkV2Fsa2VyPzogU1JDdXJzb3IpOiBzdHJpbmcgfCBudWxsICB7XG4gICAgICAgIGZvciAoY29uc3QgcnVsZSBvZiBDT05UQUlORVJfRVhJVF9SVUxFUykge1xuICAgICAgICAgICAgbGV0IHMgPSBydWxlLnRlc3QobW9kZSwgd2Fsa2VyLCBvbGRXYWxrZXIpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBzICE9PSBcInVuZGVmaW5lZFwiICYmIHMgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW5kZXJzIHRoZSBjdXJyZW50IGVsZW1lbnQgYW5kIGFueSBjb250YWluZXIgY2hhbmdlc1xuICAgICAqXG4gICAgICogVGhpcyBmdW5jdGlvbiBjb21iaW5lcyBhbm5vdW5jZW1lbnRzIGZvcjpcbiAgICAgKiAtIENvbnRhaW5lcnMgYmVpbmcgbGVmdFxuICAgICAqIC0gQ29udGFpbmVycyBiZWluZyBlbnRlcmVkXG4gICAgICogLSBUaGUgY3VycmVudCBlbGVtZW50IGl0c2VsZlxuICAgICAqXG4gICAgICogQHBhcmFtIG1vZGUgLSBUaGUgY3VycmVudCBuYXZpZ2F0aW9uIG1vZGVcbiAgICAgKiBAcGFyYW0gd2Fsa2VyIC0gQ3Vyc29yIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uXG4gICAgICogQHBhcmFtIGNvbnRhaW5lckNoYW5nZXMgLSBJbmZvcm1hdGlvbiBhYm91dCBjb250YWluZXJzIGJlaW5nIGVudGVyZWQgb3IgbGVmdFxuICAgICAqIEByZXR1cm5zIENvbWJpbmVkIGFubm91bmNlbWVudCB0ZXh0XG4gICAgICovXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHJlbmRlckN1cnJlbnQobW9kZTogTmF2aWdhdGlvbk1vZGUsIHdhbGtlcjogU1JDdXJzb3IsIGNvbnRhaW5lckNoYW5nZXM6IENvbnRhaW5lckNoYW5nZXMpOiBSZW5kZXJSZXN1bHQgfCBudWxsIHtcbiAgICAgICAgY29uc3QgREVCVUcgPSBmYWxzZTsvL21vZGUgPT09IFwidGFiX2ZvY3VzXCIgJiYgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJmaXh0dXJlXCIpPy5nZXRBdHRyaWJ1dGUoXCJjbGFzc1wiKSA9PT0gXCJ0b210ZXN0XCI7XG4gICAgICAgIGxldCBzdGFydE9mUmVuZGVyID0gU1JOYXZpZ2F0b3IuanVtcEN1cnJlbnQobW9kZSwgd2Fsa2VyKTtcbiAgICAgICAgaWYgKCFzdGFydE9mUmVuZGVyKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgZW5kT2ZSZW5kZXJzID0gU1JOYXZpZ2F0b3IuanVtcEN1cnJlbnRFbmQobW9kZSwgc3RhcnRPZlJlbmRlcik7XG4gICAgICAgIGlmICghZW5kT2ZSZW5kZXJzIHx8IGVuZE9mUmVuZGVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGVuZE9mUmVuZGVycyA9IFtudWxsXTtcbiAgICAgICAgfVxuICAgICAgICBERUJVRyAmJiBjb25zb2xlLmxvZyhcIkFBQUFcIiwgc3RhcnRPZlJlbmRlci5pc1N0YXJ0VGFnKCksIHN0YXJ0T2ZSZW5kZXIuZ2V0Tm9kZSgpKTtcbiAgICAgICAgREVCVUcgJiYgY29uc29sZS5sb2coXCJCQkJCXCIsIGVuZE9mUmVuZGVycy5tYXAodmFsID0+IHZhbCAmJiB2YWwuaXNTdGFydFRhZygpKSwgZW5kT2ZSZW5kZXJzLm1hcCh2YWwgPT4gdmFsICYmIHZhbC5nZXROb2RlKCkpKTtcblxuICAgICAgICBsZXQgZW5kT2ZSZW5kZXIgPSBlbmRPZlJlbmRlcnNbZW5kT2ZSZW5kZXJzLmxlbmd0aCAtIDFdO1xuICAgICAgICBsZXQgcmVuZGVyU3RyID0gXCJcIjtcbiAgICAgICAgZm9yIChsZXQgY2FuZGlkYXRlRW5kIG9mIGVuZE9mUmVuZGVycykge1xuICAgICAgICAgICAgbGV0IGNhbmRpZGF0ZVJlbmRlclN0ciA9IFNSUmVuZGVyZXIucmVuZGVyUmFuZ2UobW9kZSwgc3RhcnRPZlJlbmRlciwgY2FuZGlkYXRlRW5kKTtcbiAgICAgICAgICAgIGlmIChjYW5kaWRhdGVSZW5kZXJTdHIudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBlbmRPZlJlbmRlciA9IGNhbmRpZGF0ZUVuZDtcbiAgICAgICAgICAgICAgICByZW5kZXJTdHIgPSBjYW5kaWRhdGVSZW5kZXJTdHI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlbmRlclN0ciA9PT0gXCJcIikge1xuICAgICAgICAgICAgcmVuZGVyU3RyID0gU1JSZW5kZXJlci5yZW5kZXJSYW5nZShtb2RlLCBzdGFydE9mUmVuZGVyLCBlbmRPZlJlbmRlcik7XG4gICAgICAgIH1cbiAgICAgICAgREVCVUcgJiYgY29uc29sZS5sb2coXCJDQ0NDXCIsIHJlbmRlclN0cik7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdGFydDogc3RhcnRPZlJlbmRlcixcbiAgICAgICAgICAgIGVuZDogZW5kT2ZSZW5kZXIsXG4gICAgICAgICAgICBtZXNzYWdlOiAoY29udGFpbmVyQ2hhbmdlcy5sZWF2aW5nIHx8IFtdKS5jb25jYXQoY29udGFpbmVyQ2hhbmdlcy5lbnRlcmluZyB8fCBbXSkuY29uY2F0KFtyZW5kZXJTdHJdKS5qb2luKFwiIFwiKS5yZXBsYWNlKC9cXHMrL2csIFwiIFwiKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVuZGVycyBhIHJhbmdlIG9mIGVsZW1lbnRzIGJldHdlZW4gdHdvIGN1cnNvcnNcbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gdHJhdmVyc2VzIHRoZSBET00gZnJvbSBzdGFydE9mUmVuZGVyIHRvIGVuZE9mUmVuZGVyLFxuICAgICAqIGFwcGx5aW5nIHJlbmRlcmluZyBydWxlcyB0byBlYWNoIGVsZW1lbnQgYW5kIGNvbWJpbmluZyB0aGUgcmVzdWx0cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBtb2RlIC0gVGhlIGN1cnJlbnQgbmF2aWdhdGlvbiBtb2RlXG4gICAgICogQHBhcmFtIHN0YXJ0T2ZSZW5kZXIgLSBDdXJzb3IgYXQgdGhlIHN0YXJ0IG9mIHRoZSByYW5nZVxuICAgICAqIEBwYXJhbSBlbmRPZlJlbmRlciAtIEN1cnNvciBhdCB0aGUgZW5kIG9mIHRoZSByYW5nZVxuICAgICAqIEByZXR1cm5zIENvbWJpbmVkIGFubm91bmNlbWVudCB0ZXh0IGZvciB0aGUgZW50aXJlIHJhbmdlXG4gICAgICovXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHJlbmRlclJhbmdlKG1vZGU6IE5hdmlnYXRpb25Nb2RlLCBzdGFydE9mUmVuZGVyOiBTUkN1cnNvciwgZW5kT2ZSZW5kZXI6IFNSQ3Vyc29yKSA6IHN0cmluZyB7XG4gICAgICAgIGxldCBpdGVyV2Fsa2VyID0gc3RhcnRPZlJlbmRlci5jbG9uZSgpO1xuICAgICAgICBsZXQgZWxlbVN0cnM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGxldCBiQ29udGludWUgPSB0cnVlO1xuICAgICAgICBsZXQgY3VycmVudExpbms6IE5vZGUgPSBudWxsO1xuICAgICAgICB3aGlsZSAoYkNvbnRpbnVlKSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtID0gaXRlcldhbGtlci5nZXRFbGVtZW50KCk7XG4gICAgICAgICAgICBjb25zdCBub2RlID0gaXRlcldhbGtlci5nZXROb2RlKCk7XG4gICAgICAgICAgICBjb25zdCBub2RlVHlwZSA9IG5vZGUubm9kZVR5cGU7XG4gICAgICAgICAgICBsZXQgcmVuZGVyU3Ryczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICAgIGxldCBsaW5rUGFyZW50ID0gQXJpYVV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShub2RlLCBcImxpbmtcIiwgdHJ1ZSk7XG4gICAgICAgICAgICBpZiAobGlua1BhcmVudCAmJiAhW1wiY29udGVudFwiLCBcInRleHRcIl0uaW5jbHVkZXMobmV3IFNSQ3Vyc29yKGxpbmtQYXJlbnQpLmdldE5hbWVJbmZvKCk/Lm5hbWVGcm9tKSkge1xuICAgICAgICAgICAgICAgIC8vIFdlIGRvbid0IGNvbnNpZGVyIGxpbmtzIHRoYXQgYW5ub3VuY2UgdGhlbXNlbHZlc1xuICAgICAgICAgICAgICAgIGxpbmtQYXJlbnQgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChjb25zdCBydWxlIG9mIFNSX1JVTEVTKSB7XG4gICAgICAgICAgICAgICAgbGV0IHMgPSBydWxlLnRlc3QobW9kZSwgaXRlcldhbGtlcik7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzICE9PSBcInVuZGVmaW5lZFwiICYmIHMgIT09IG51bGwgJiYgcy50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZVR5cGUgPT09IDEgJiYgIWl0ZXJXYWxrZXIuaXNFbmRUYWcoKSAmJiBlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtaGFzcG9wdXBcIikgPT09IFwibWVudVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzID0gXCJbc3ViTWVudV0gXCIrcztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBIYW5kbGUgbGlua3NcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGUgPT09IFwidGFiX2ZvY3VzXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlJ3JlIGluIGxpbmsgbW9kZVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRMaW5rICYmICghbGlua1BhcmVudCB8fCAobGlua1BhcmVudCAmJiBjdXJyZW50TGluayAhPT0gbGlua1BhcmVudCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UndmUgYWRkZWQgYSBzdHJpbmcgd2l0aGluIGEgbGluayAoY3VycmVudExpbmspLCBidXQgbm93IHdlJ3ZlIGxlZnQgdGhlIGxpbmsgb3IgbW92ZWQgdG8gYSBuZXcgbGlua1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBgJHtzfSAke2dldExpbmtBbm5vdW5jZW1lbnQobmV3IFNSQ3Vyc29yKGN1cnJlbnRMaW5rLCBmYWxzZSkpfWA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGlua1BhcmVudCAmJiAoIWN1cnJlbnRMaW5rIHx8IChjdXJyZW50TGluayAhPT0gbGlua1BhcmVudCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UncmUgaW4gYSBsaW5rLCBhbmQgd2UgaGF2ZW4ndCBhbm5vdW5jZWQgdGhpcyBsaW5rLCBvciB3ZSd2ZSBtb3ZlZCB0byBhIG5ldyBsaW5rXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA9IGAke2dldExpbmtBbm5vdW5jZW1lbnQobmV3IFNSQ3Vyc29yKGxpbmtQYXJlbnQsIGZhbHNlKSl9ICR7c31gO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBcblxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChzICE9PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50TGluayA9IGxpbmtQYXJlbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtU3Rycy5wdXNoKHMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsZW1TdHJzLnB1c2gocmVuZGVyU3Rycy5maWx0ZXIocyA9PiBzLnRyaW0oKS5sZW5ndGggPiAwKS5qb2luKFwiIFwiKSlcbiAgICAgICAgICAgIGJDb250aW51ZSA9IGl0ZXJXYWxrZXIubmV4dCgoKSA9PiB0cnVlLCBTUk5hdmlnYXRvci5nZXRTa2lwRnVuYyhtb2RlKSkgJiYgU1JDdXJzb3IuY29tcGFyZShpdGVyV2Fsa2VyLCBlbmRPZlJlbmRlcikgPCAwO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtb2RlID09PSBcInRhYl9mb2N1c1wiICYmIGN1cnJlbnRMaW5rKSB7XG4gICAgICAgICAgICBlbGVtU3Rycy5wdXNoKGAke2dldExpbmtBbm5vdW5jZW1lbnQobmV3IFNSQ3Vyc29yKGN1cnJlbnRMaW5rLCBmYWxzZSkpfWApO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZXRWYWwgPSBlbGVtU3Rycy5maWx0ZXIocyA9PiBzLnRyaW0oKS5sZW5ndGggPiAwKS5qb2luKFwiIFwiKTtcbiAgICAgICAgcmV0VmFsID0gcmV0VmFsLnJlcGxhY2UoLywgXFx1MDAwMShbXlxcdTAwMDJdKylcXHUwMDAyL2csIChtYXRjaCwgZGVzY3JpYmVkQnlUZXh0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBxdW90ZWRUZXh0ID0gYFwiJHtkZXNjcmliZWRCeVRleHR9XCJgO1xuICAgICAgICAgICAgY29uc3QgdW5tYXJrZWRSZXRWYWwgPSByZXRWYWwucmVwbGFjZShtYXRjaCwgXCJcIik7XG4gICAgICAgICAgICByZXR1cm4gdW5tYXJrZWRSZXRWYWwuaW5jbHVkZXMocXVvdGVkVGV4dCkgfHwgdW5tYXJrZWRSZXRWYWwuaW5jbHVkZXMoZGVzY3JpYmVkQnlUZXh0KSA/IFwiXCIgOiBgLCAke3F1b3RlZFRleHR9YDtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldFZhbCA9IHJldFZhbC5yZXBsYWNlKC9bXFx1MDAwMVxcdTAwMDJdL2csIFwiXCIpO1xuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxufVxuXG4iLCJpbXBvcnQgeyBTUkN1cnNvciB9IGZyb20gXCIuL1NSQ3Vyc29yXCI7XG5pbXBvcnQgeyBOYXZpZ2F0aW9uTW9kZSB9IGZyb20gXCIuL1NSVHlwZXNcIjtcblxuZXhwb3J0IGNsYXNzIFNSUmVuZGVyZXJSdWxlIHtcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJ1bGVEZWZpbml0aW9uOiB7XG4gICAgICAgIG1vZGVzOiBOYXZpZ2F0aW9uTW9kZVtdLFxuICAgICAgICByb2xlczogc3RyaW5nW10sXG4gICAgICAgIGVsZW1zOiBzdHJpbmdbXSxcbiAgICAgICAgdGVzdHM6IEFycmF5PChjdXJzb3I6IFNSQ3Vyc29yLCBvbGRDdXJzb3I/OiBTUkN1cnNvciwgbW9kZT86IE5hdmlnYXRpb25Nb2RlKSA9PiBzdHJpbmcgfCBudWxsPlxuICAgIH0pIHtcblxuICAgIH1cblxuICAgIHB1YmxpYyB0ZXN0KG1vZGU6IE5hdmlnYXRpb25Nb2RlLCBjdXJzb3I6IFNSQ3Vyc29yLCBvbGRDdXJzb3I/OiBTUkN1cnNvcik6IHN0cmluZyB8IG51bGwge1xuICAgICAgICBpZiAodGhpcy5ydWxlRGVmaW5pdGlvbi5tb2Rlcy5pbmNsdWRlcyhtb2RlKVxuICAgICAgICAgICAgJiYgKFxuICAgICAgICAgICAgICAgIHRoaXMucnVsZURlZmluaXRpb24ucm9sZXMuaW5jbHVkZXMoY3Vyc29yLmdldFJvbGUoKSlcbiAgICAgICAgICAgICAgICB8fCB0aGlzLnJ1bGVEZWZpbml0aW9uLmVsZW1zLmluY2x1ZGVzKGN1cnNvci5nZXROb2RlKCkubm9kZU5hbWUudG9VcHBlckNhc2UoKSlcbiAgICAgICAgICAgIClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHRlc3Qgb2YgdGhpcy5ydWxlRGVmaW5pdGlvbi50ZXN0cykge1xuICAgICAgICAgICAgICAgIGxldCBzID0gdGVzdChjdXJzb3IsIG9sZEN1cnNvciwgbW9kZSk7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzID09PSBcInN0cmluZ1wiKSByZXR1cm4gcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59IiwiaW1wb3J0IHsgU1JDdXJzb3IgfSBmcm9tIFwiLi9TUkN1cnNvclwiO1xuXG4vKipcbiAqIFRhYmxlVXRpbCBuYW1lc3BhY2UgcHJvdmlkZXMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIGhhbmRsaW5nIEhUTUwgdGFibGVzIGluIHRoZSBhY2Nlc3NpYmlsaXR5IHNpbXVsYXRvci5cbiAqIFRoZXNlIGZ1bmN0aW9ucyBoZWxwIGRldGVybWluZSBjZWxsIHBvc2l0aW9ucywgcmVsYXRpb25zaGlwcywgYW5kIGV4dHJhY3QgaGVhZGVyIGluZm9ybWF0aW9uXG4gKiB0byBzaW11bGF0ZSBob3cgc2NyZWVuIHJlYWRlcnMgd291bGQgYW5ub3VuY2UgdGFibGUgbmF2aWdhdGlvbi5cbiAqL1xuZXhwb3J0IG5hbWVzcGFjZSBTUlRhYmxlVXRpbCB7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIHRhYmxlIGNlbGwgd2l0aCBpdHMgcG9zaXRpb24gYW5kIHNwYW5uaW5nIGluZm9ybWF0aW9uXG4gICAgICogQHByb3BlcnR5IHJvd0luZGV4U3RhcnQgLSBUaGUgc3RhcnRpbmcgcm93IGluZGV4ICgwLWJhc2VkKVxuICAgICAqIEBwcm9wZXJ0eSBjb2xJbmRleFN0YXJ0IC0gVGhlIHN0YXJ0aW5nIGNvbHVtbiBpbmRleCAoMC1iYXNlZClcbiAgICAgKiBAcHJvcGVydHkgcm93c3BhbiAtIE51bWJlciBvZiByb3dzIHRoaXMgY2VsbCBzcGFuc1xuICAgICAqIEBwcm9wZXJ0eSBjb2xzcGFuIC0gTnVtYmVyIG9mIGNvbHVtbnMgdGhpcyBjZWxsIHNwYW5zXG4gICAgICogQHByb3BlcnR5IGNlbGxDdXJzb3IgLSBTUkN1cnNvciBwb2ludGluZyB0byB0aGlzIGNlbGxcbiAgICAgKi9cbiAgICBleHBvcnQgdHlwZSBDZWxsTW9kZWwgPSB7IHJvd0luZGV4U3RhcnQ6IG51bWJlciwgY29sSW5kZXhTdGFydDogbnVtYmVyLCByb3dzcGFuOiBudW1iZXIsIGNvbHNwYW46IG51bWJlciwgY2VsbEN1cnNvcjogU1JDdXJzb3IgfVxuICAgIFxuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSByb3cgaW4gYSB0YWJsZSBhcyBhbiBhcnJheSBvZiBjZWxsIG1vZGVsc1xuICAgICAqL1xuICAgIGV4cG9ydCB0eXBlIFJvd01vZGVsID0gQ2VsbE1vZGVsW107XG4gICAgXG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIGNvbXBsZXRlIHRhYmxlIGFzIGFuIGFycmF5IG9mIHJvd3NcbiAgICAgKi9cbiAgICBleHBvcnQgdHlwZSBUYWJsZU1vZGVsID0gUm93TW9kZWxbXTtcblxuICAgIC8qKlxuICAgICAqIERldGVybWluZXMgaWYgdGhlIGN1cnNvciBpcyBwb2ludGluZyB0byBhIGNlbGwgZWxlbWVudCAoVEQgb3IgVEgpXG4gICAgICogb3IgaGFzIGEgY2VsbC1yZWxhdGVkIEFSSUEgcm9sZVxuICAgICAqIEBwYXJhbSBjdXJzb3IgLSBUaGUgU1JDdXJzb3IgdG8gY2hlY2tcbiAgICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBjdXJzb3IgaXMgb24gYSBjZWxsLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgKi9cbiAgICBleHBvcnQgZnVuY3Rpb24gaXNDdXJzb3JDZWxsUm9sZShjdXJzb3I6IFNSQ3Vyc29yKSB7XG4gICAgICAgIGlmICghY3Vyc29yLmdldEVsZW1lbnQoKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoW1wiY2VsbFwiLCBcInJvd2hlYWRlclwiLCBcImNvbHVtbmhlYWRlclwiXS5pbmNsdWRlcyhjdXJzb3IuZ2V0Um9sZSgpKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICFjdXJzb3IuZ2V0RWxlbWVudCgpLmhhc0F0dHJpYnV0ZShcInJvbGVcIikgJiYgW1wiVEhcIiwgXCJURFwiXS5pbmNsdWRlcyhjdXJzb3IuZ2V0RWxlbWVudCgpLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYSBjdXJzb3IgcG9pbnRpbmcgdG8gdGhlIGN1cnJlbnQgY2VsbCBvciB0aGUgcGFyZW50IGNlbGwgaWYgdGhlIGN1cnNvclxuICAgICAqIGlzIGluc2lkZSBhIGNlbGwncyBjb250ZW50XG4gICAgICogQHBhcmFtIGN1cnNvciAtIFRoZSBTUkN1cnNvciB0byBjaGVja1xuICAgICAqIEByZXR1cm5zIEEgbmV3IFNSQ3Vyc29yIHBvaW50aW5nIHRvIHRoZSBjZWxsIG9yIG51bGwgaWYgbm90IGluIGEgY2VsbFxuICAgICAqL1xuICAgIGV4cG9ydCBmdW5jdGlvbiBnZXRDdXJyZW50T3JQYXJlbnRDZWxsQ3Vyc29yKGN1cnNvcjogU1JDdXJzb3IpIDogU1JDdXJzb3Ige1xuICAgICAgICByZXR1cm4gY3Vyc29yLmdldEN1cnJlbnRPclBhcmVudEJ5Um9sZUNsb25lKFtcImNlbGxcIiwgXCJyb3doZWFkZXJcIiwgXCJjb2x1bW5oZWFkZXJcIl0sIFtcIlREXCIsXCJUSFwiXSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBjb2xzcGFuIG9mIGEgY2VsbCBhdCBhIGdpdmVuIGxvY2F0aW9uXG4gICAgICogQHBhcmFtIGN1cnNvciBUaGUgY3Vyc29yIHRvIGdldCB0aGUgY29sc3BhbiBmcm9tXG4gICAgICogQHJldHVybnMgVGhlIGNvbHNwYW4gb2YgdGhlIGNlbGwgYXQgdGhlIGN1cnNvcidzIGxvY2F0aW9uIG9yIDAgaWYgbm90IGluIGEgY29sdW1uXG4gICAgICovXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGdldENvbFNwYW4oY3Vyc29yOiBTUkN1cnNvcik6IG51bWJlciB7XG4gICAgICAgIGlmICghaXNDdXJzb3JDZWxsUm9sZShjdXJzb3IpKSByZXR1cm4gMDtcbiAgICAgICAgbGV0IGNvbFNwYW4gPSBjdXJzb3IuZ2V0RWxlbWVudCgpLmdldEF0dHJpYnV0ZShcImNvbHNwYW5cIik7XG4gICAgICAgIGlmIChjb2xTcGFuKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQoY29sU3Bhbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSByb3dzcGFuIG9mIGEgY2VsbCBhdCBhIGdpdmVuIGxvY2F0aW9uXG4gICAgICogQHBhcmFtIGN1cnNvciBUaGUgY3Vyc29yIHRvIGdldCB0aGUgcm93c3BhbiBmcm9tXG4gICAgICogQHJldHVybnMgVGhlIHJvd3NwYW4gb2YgdGhlIGNlbGwgYXQgdGhlIGN1cnNvcidzIGxvY2F0aW9uIG9yIDAgaWYgbm90IGluIGEgY29sdW1uXG4gICAgICovXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGdldFJvd1NwYW4oY3Vyc29yOiBTUkN1cnNvcik6IG51bWJlciB7XG4gICAgICAgIGlmICghaXNDdXJzb3JDZWxsUm9sZShjdXJzb3IpKSByZXR1cm4gMDtcbiAgICAgICAgbGV0IHJvd1NwYW4gPSBjdXJzb3IuZ2V0RWxlbWVudCgpLmdldEF0dHJpYnV0ZShcInJvd3NwYW5cIik7XG4gICAgICAgIGlmIChyb3dTcGFuKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQocm93U3Bhbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQnVpbGRzIGEgY29tcGxldGUgbW9kZWwgb2YgYSB0YWJsZSdzIHN0cnVjdHVyZSwgYWNjb3VudGluZyBmb3Igcm93c3BhbiBhbmQgY29sc3BhblxuICAgICAqXG4gICAgICogVGhpcyBmdW5jdGlvbiB0cmF2ZXJzZXMgdGhlIGVudGlyZSB0YWJsZSBhbmQgY3JlYXRlcyBhIGRhdGEgc3RydWN0dXJlIHRoYXQgcmVwcmVzZW50c1xuICAgICAqIHRoZSBsb2dpY2FsIGdyaWQgb2YgY2VsbHMsIHByb3Blcmx5IGhhbmRsaW5nIGNlbGxzIHRoYXQgc3BhbiBtdWx0aXBsZSByb3dzIG9yIGNvbHVtbnMuXG4gICAgICogVGhlIHJlc3VsdGluZyBtb2RlbCBtYWtlcyBpdCBlYXNpZXIgdG8gZGV0ZXJtaW5lIGNlbGwgcmVsYXRpb25zaGlwcyBhbmQgcG9zaXRpb25zLlxuICAgICAqXG4gICAgICogQHBhcmFtIGluVGFibGVDdXJzb3IgLSBBIGN1cnNvciB3aXRoaW4gdGhlIHRhYmxlXG4gICAgICogQHJldHVybnMgQSBUYWJsZU1vZGVsIHJlcHJlc2VudGluZyB0aGUgY29tcGxldGUgdGFibGUgc3RydWN0dXJlLCBvciBudWxsIGlmIG5vdCBpbiBhIHRhYmxlXG4gICAgICovXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGdldFRhYmxlTW9kZWwoaW5UYWJsZUN1cnNvcjogU1JDdXJzb3IpOiBUYWJsZU1vZGVsIHtcbiAgICAgICAgLy8gR2V0IGEgY3Vyc29yIHBvaW50aW5nIHRvIHRoZSB0YWJsZSBlbGVtZW50XG4gICAgICAgIGxldCB0YWJsZUN1cnNvciA9IGluVGFibGVDdXJzb3IuZ2V0Q3VycmVudE9yUGFyZW50QnlSb2xlQ2xvbmUoW1widGFibGVcIl0pO1xuICAgICAgICBpZiAoIXRhYmxlQ3Vyc29yKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IHdhbGtUYWJsZUN1cnNvciA9IHRhYmxlQ3Vyc29yLmNsb25lKCk7XG5cbiAgICAgICAgbGV0IHJldFZhbDogVGFibGVNb2RlbCA9IFtdOyAgLy8gVGhlIGNvbXBsZXRlIHRhYmxlIG1vZGVsIHdlJ3JlIGJ1aWxkaW5nXG4gICAgICAgIGxldCBjdXJSb3c6IFJvd01vZGVsID0gW107ICAgIC8vIFRoZSBjdXJyZW50IHJvdyBiZWluZyBwcm9jZXNzZWRcbiAgICAgICAgbGV0IHByZXZSb3c6IFJvd01vZGVsOyAgICAgICAgLy8gVGhlIHByZXZpb3VzIHJvdyAobmVlZGVkIGZvciByb3dzcGFuIGhhbmRsaW5nKVxuICAgICAgICBcbiAgICAgICAgLy8gV2FsayB0aHJvdWdoIHRoZSB0YWJsZSdzIERPTSBzdHJ1Y3R1cmVcbiAgICAgICAgd2hpbGUgKHdhbGtUYWJsZUN1cnNvci5uZXh0KCgpID0+IHRydWUpICYmICF3YWxrVGFibGVDdXJzb3IuZ2V0Tm9kZSgpLmlzU2FtZU5vZGUodGFibGVDdXJzb3IuZ2V0Tm9kZSgpKSkge1xuICAgICAgICAgICAgaWYgKHdhbGtUYWJsZUN1cnNvci5pc0VuZFRhZygpICYmIHdhbGtUYWJsZUN1cnNvci5nZXRSb2xlKCkgPT09IFwicm93XCIpIHtcbiAgICAgICAgICAgICAgICAvLyBSZWFjaGVkIHRoZSBlbmQgb2YgdGhlIHJvdywgcHVzaCB3aGF0IHdlIGhhdmUgYW5kIHJlc2V0XG4gICAgICAgICAgICAgICAgcmV0VmFsLnB1c2goY3VyUm93KTtcbiAgICAgICAgICAgICAgICBwcmV2Um93ID0gY3VyUm93O1xuICAgICAgICAgICAgICAgIGN1clJvdyA9IFtdO1xuXG4gICAgICAgICAgICAgICAgLy8gSGFuZGxlIGNlbGxzIHdpdGggcm93c3BhbiBmcm9tIHByZXZpb3VzIHJvd3MgdGhhdCBhZmZlY3QgdGhpcyByb3dcbiAgICAgICAgICAgICAgICAvLyBUaGlzIGVuc3VyZXMgY2VsbHMgc3Bhbm5pbmcgbXVsdGlwbGUgcm93cyBhcmUgcHJvcGVybHkgcmVwcmVzZW50ZWQgaW4gdGhlIG1vZGVsXG4gICAgICAgICAgICAgICAgd2hpbGUgKHByZXZSb3cgJiYgY3VyUm93Lmxlbmd0aCA8IHByZXZSb3cubGVuZ3RoICYmXG4gICAgICAgICAgICAgICAgICAgICAgKChwcmV2Um93W2N1clJvdy5sZW5ndGhdLnJvd0luZGV4U3RhcnQgKyBwcmV2Um93W2N1clJvdy5sZW5ndGhdLnJvd3NwYW4gLSAxKSA+PSByZXRWYWwubGVuZ3RoKSkge1xuICAgICAgICAgICAgICAgICAgICBjdXJSb3cucHVzaChwcmV2Um93W2N1clJvdy5sZW5ndGhdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIFByb2Nlc3MgZWFjaCBjZWxsIGluIHRoZSByb3dcbiAgICAgICAgICAgIGlmICghd2Fsa1RhYmxlQ3Vyc29yLmlzRW5kVGFnKCkgJiYgaXNDdXJzb3JDZWxsUm9sZSh3YWxrVGFibGVDdXJzb3IpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29sc3BhbiA9IGdldENvbFNwYW4od2Fsa1RhYmxlQ3Vyc29yKTtcbiAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBjZWxsIG1vZGVsIHdpdGggcG9zaXRpb24gYW5kIHNwYW5uaW5nIGluZm9ybWF0aW9uXG4gICAgICAgICAgICAgICAgY29uc3QgY2VsbEluZm86IENlbGxNb2RlbCA9IHtcbiAgICAgICAgICAgICAgICAgICAgcm93SW5kZXhTdGFydDogcmV0VmFsLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgY29sSW5kZXhTdGFydDogY3VyUm93Lmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgcm93c3BhbjogZ2V0Um93U3Bhbih3YWxrVGFibGVDdXJzb3IpLFxuICAgICAgICAgICAgICAgICAgICBjb2xzcGFuLFxuICAgICAgICAgICAgICAgICAgICBjZWxsQ3Vyc29yOiB3YWxrVGFibGVDdXJzb3IuY2xvbmUoKVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gRm9yIGNlbGxzIHdpdGggY29sc3BhbiwgYWRkIHRoZSBzYW1lIGNlbGwgaW5mbyB0byBtdWx0aXBsZSBjb2x1bW5zXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaWR4PTA7IGlkeDxjb2xzcGFuOyArK2lkeCkge1xuICAgICAgICAgICAgICAgICAgICBjdXJSb3cucHVzaChjZWxsSW5mbyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIENvbnRpbnVlIGhhbmRsaW5nIGNlbGxzIHdpdGggcm93c3BhbiBmcm9tIHByZXZpb3VzIHJvd3NcbiAgICAgICAgICAgICAgICB3aGlsZSAocHJldlJvdyAmJiBjdXJSb3cubGVuZ3RoIDwgcHJldlJvdy5sZW5ndGggJiZcbiAgICAgICAgICAgICAgICAgICAgICAoKHByZXZSb3dbY3VyUm93Lmxlbmd0aF0ucm93SW5kZXhTdGFydCArIHByZXZSb3dbY3VyUm93Lmxlbmd0aF0ucm93c3BhbiAtIDEpID49IHJldFZhbC5sZW5ndGgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1clJvdy5wdXNoKHByZXZSb3dbY3VyUm93Lmxlbmd0aF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGNlbGwgbW9kZWwgZm9yIGEgc3BlY2lmaWMgY2VsbCBpbiB0aGUgdGFibGVcbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gZmluZHMgdGhlIENlbGxNb2RlbCBvYmplY3QgdGhhdCByZXByZXNlbnRzIGEgc3BlY2lmaWMgY2VsbCxcbiAgICAgKiB3aGljaCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBpdHMgcG9zaXRpb24gYW5kIHNwYW5uaW5nLlxuICAgICAqXG4gICAgICogQHBhcmFtIGluQ2VsbEN1cnNvciAtIEEgY3Vyc29yIHBvaW50aW5nIHRvIGEgY2VsbCBvciBpdHMgY29udGVudHNcbiAgICAgKiBAcGFyYW0gdGFibGVNb2RlbCAtIE9wdGlvbmFsIHByZS1idWlsdCB0YWJsZSBtb2RlbCAod2lsbCBiZSBjcmVhdGVkIGlmIG5vdCBwcm92aWRlZClcbiAgICAgKiBAcmV0dXJucyBUaGUgQ2VsbE1vZGVsIGZvciB0aGUgc3BlY2lmaWVkIGNlbGwsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGdldENlbGxNb2RlbChpbkNlbGxDdXJzb3I6IFNSQ3Vyc29yLCB0YWJsZU1vZGVsPzogVGFibGVNb2RlbCkgOiBDZWxsTW9kZWwge1xuICAgICAgICBsZXQgY2VsbEN1cnNvciA9IGdldEN1cnJlbnRPclBhcmVudENlbGxDdXJzb3IoaW5DZWxsQ3Vyc29yKTtcbiAgICAgICAgaWYgKCF0YWJsZU1vZGVsKSB7XG4gICAgICAgICAgICB0YWJsZU1vZGVsID0gZ2V0VGFibGVNb2RlbChpbkNlbGxDdXJzb3IpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNlYXJjaCB0aHJvdWdoIHRoZSB0YWJsZSBtb2RlbCB0byBmaW5kIHRoZSBtYXRjaGluZyBjZWxsXG4gICAgICAgIGZvciAobGV0IHJvd0luZGV4ID0gMDsgcm93SW5kZXggPCB0YWJsZU1vZGVsLmxlbmd0aDsgKytyb3dJbmRleCkge1xuICAgICAgICAgICAgZm9yIChsZXQgY29sSW5kZXggPSAwOyBjb2xJbmRleCA8IHRhYmxlTW9kZWxbcm93SW5kZXhdLmxlbmd0aDsgKytjb2xJbmRleCkge1xuICAgICAgICAgICAgICAgIGlmICh0YWJsZU1vZGVsW3Jvd0luZGV4XVtjb2xJbmRleF0uY2VsbEN1cnNvci5pc1NhbWVOb2RlKGNlbGxDdXJzb3IpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0YWJsZU1vZGVsW3Jvd0luZGV4XVtjb2xJbmRleF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBhIGNlbGwgc3BhbnMgYSBzcGVjaWZpYyBjb2x1bW5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjZWxsTW9kZWwgLSBUaGUgY2VsbCBtb2RlbCB0byBjaGVja1xuICAgICAqIEBwYXJhbSBjb2xJZHggLSBUaGUgY29sdW1uIGluZGV4IHRvIGNoZWNrXG4gICAgICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgY2VsbCBjb250YWlucyB0aGUgc3BlY2lmaWVkIGNvbHVtblxuICAgICAqL1xuICAgIGV4cG9ydCBmdW5jdGlvbiBjZWxsTW9kZWxDb250YWluc0NvbHVtbihjZWxsTW9kZWw6IENlbGxNb2RlbCwgY29sSWR4OiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIGNvbElkeCA+PSBjZWxsTW9kZWwuY29sSW5kZXhTdGFydCAmJiBjb2xJZHggPCBjZWxsTW9kZWwuY29sSW5kZXhTdGFydCtjZWxsTW9kZWwuY29sc3BhbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYSBjZWxsIHNwYW5zIGEgc3BlY2lmaWMgcm93XG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2VsbE1vZGVsIC0gVGhlIGNlbGwgbW9kZWwgdG8gY2hlY2tcbiAgICAgKiBAcGFyYW0gcm93SWR4IC0gVGhlIHJvdyBpbmRleCB0byBjaGVja1xuICAgICAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGNlbGwgY29udGFpbnMgdGhlIHNwZWNpZmllZCByb3dcbiAgICAgKi9cbiAgICBleHBvcnQgZnVuY3Rpb24gY2VsbE1vZGVsQ29udGFpbnNSb3coY2VsbE1vZGVsOiBDZWxsTW9kZWwsIHJvd0lkeDogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiByb3dJZHggPj0gY2VsbE1vZGVsLnJvd0luZGV4U3RhcnQgJiYgcm93SWR4IDwgY2VsbE1vZGVsLnJvd0luZGV4U3RhcnQrY2VsbE1vZGVsLnJvd3NwYW47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgcm93IGhlYWRlcnMgYXNzb2NpYXRlZCB3aXRoIGEgY2VsbFxuICAgICAqIEZpcnN0IGNoZWNrcyBmb3IgZXhwbGljaXQgaGVhZGVycyBhdHRyaWJ1dGUsIHRoZW4gbG9va3MgZm9yIHJvdyBoZWFkZXJzIGluIHRoZSBzYW1lIHJvd1xuICAgICAqIEBwYXJhbSBjdXJzb3IgLSBUaGUgU1JDdXJzb3IgcG9pbnRpbmcgdG8gYSBjZWxsXG4gICAgICogQHJldHVybnMgQSBzdHJpbmcgY29udGFpbmluZyB0aGUgY29uY2F0ZW5hdGVkIGhlYWRlciBuYW1lc1xuICAgICAqL1xuICAgIGV4cG9ydCBmdW5jdGlvbiBnZXRSb3dIZWFkZXJzKGN1cnNvcjogU1JDdXJzb3IpIHtcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgY29sdW1uIGhlYWRlcnMgYXNzb2NpYXRlZCB3aXRoIGEgY2VsbFxuICAgICAqIEZpcnN0IGNoZWNrcyBmb3IgZXhwbGljaXQgaGVhZGVycyBhdHRyaWJ1dGUsIHRoZW4gbG9va3MgZm9yIGNvbHVtbiBoZWFkZXJzIGluIHRoZSBzYW1lIGNvbHVtblxuICAgICAqIEBwYXJhbSBjdXJzb3IgLSBUaGUgU1JDdXJzb3IgcG9pbnRpbmcgdG8gYSBjZWxsXG4gICAgICogQHJldHVybnMgQSBzdHJpbmcgY29udGFpbmluZyB0aGUgY29uY2F0ZW5hdGVkIGhlYWRlciBuYW1lc1xuICAgICAqL1xuICAgIGV4cG9ydCBmdW5jdGlvbiBnZXRDb2x1bW5IZWFkZXJzRm9yQ3Vyc29yKGluQ2VsbEN1cnNvcjogU1JDdXJzb3IsIHRhYmxlTW9kZWw/OiBUYWJsZU1vZGVsKSB7XG4gICAgICAgIGlmICghdGFibGVNb2RlbCkge1xuICAgICAgICAgICAgdGFibGVNb2RlbCA9IGdldFRhYmxlTW9kZWwoaW5DZWxsQ3Vyc29yKTtcbiAgICAgICAgICAgIGlmICghdGFibGVNb2RlbCkgcmV0dXJuIFwiXCI7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2VsbE1vZGVsID0gZ2V0Q2VsbE1vZGVsKGluQ2VsbEN1cnNvciwgdGFibGVNb2RlbCk7XG4gICAgICAgIGlmICghY2VsbE1vZGVsKSByZXR1cm4gXCJcIjtcblxuICAgICAgICBjb25zdCBjZWxsQ3Vyc29yID0gY2VsbE1vZGVsLmNlbGxDdXJzb3I7XG4gICAgICAgIGlmICghY2VsbEN1cnNvcikgcmV0dXJuIFwiXCI7XG5cbiAgICAgICAgY29uc3QgY2VsbEVsZW0gPSBjZWxsQ3Vyc29yLmdldEVsZW1lbnQoKTtcbiAgICAgICAgaWYgKCFjZWxsRWxlbSkgcmV0dXJuIFwiXCI7XG5cbiAgICAgICAgY29uc3QgY29sRGF0YXM6IEFycmF5PHtcbiAgICAgICAgICAgIHBvdGVudGlhbENvbEhlYWRlcnM6IFNSQ3Vyc29yW10sXG4gICAgICAgICAgICBleGlzdHNEYXRhQ2VsbDogYm9vbGVhbixcbiAgICAgICAgICAgIGNvbElkeDogbnVtYmVyXG4gICAgICAgIH0+ID0gW107XG4gICAgICAgIGZvciAobGV0IGNvbElkeCA9IGNlbGxNb2RlbC5jb2xJbmRleFN0YXJ0OyBjb2xJZHggPCBjZWxsTW9kZWwuY29sSW5kZXhTdGFydCtjZWxsTW9kZWwuY29sc3BhbjsgKytjb2xJZHgpIHtcbiAgICAgICAgICAgIGNvbERhdGFzLnB1c2goe1xuICAgICAgICAgICAgICAgIHBvdGVudGlhbENvbEhlYWRlcnM6IFtdLFxuICAgICAgICAgICAgICAgIGV4aXN0c0RhdGFDZWxsOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBjb2xJZHhcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGxldCBwb3RlbnRpYWxIZWFkZXJzOiBTUkN1cnNvcltdID0gW107XG4gICAgICAgIGlmIChjZWxsRWxlbS5oYXNBdHRyaWJ1dGUoXCJoZWFkZXJzXCIpKSB7XG4gICAgICAgICAgICBwb3RlbnRpYWxIZWFkZXJzID0gY2VsbEVsZW0uZ2V0QXR0cmlidXRlKFwiaGVhZGVyc1wiKVxuICAgICAgICAgICAgICAgIC8vIFNwbGl0IHRoZSBoZWFkZXIgYXR0cmlidXRlIGludG8gaWRzXG4gICAgICAgICAgICAgICAgLnNwbGl0KFwiIFwiKVxuICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgbm9kZSBmb3IgZWFjaCBpZFxuICAgICAgICAgICAgICAgIC5tYXAoaWQgPT4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpKVxuICAgICAgICAgICAgICAgIC8vIEdldCByaWQgb2YgYmFkIG1hcHBpbmdzXG4gICAgICAgICAgICAgICAgLmZpbHRlcihub2RlID0+ICEhbm9kZSlcbiAgICAgICAgICAgICAgICAvLyBDb252ZXJ0IHRvIFNSQ3Vyc29ycyB0byB0aGF0IHdlIGNhbiBnZXQgYWNjZXNzaWJsZSBuYW1lc1xuICAgICAgICAgICAgICAgIC5tYXAobm9kZSA9PiBuZXcgU1JDdXJzb3Iobm9kZSkpXG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIGhlYWRlcnMgdGhhdCBhcmVuJ3QgaW4gdGhlIHNhbWUgY29sdW1uIChpZ25vcmUgY29sdW1uIGhlYWRlcnMpXG4gICAgICAgICAgICAgICAgLmZpbHRlcihjdXJzb3IgPT4gY29sRGF0YXMuc29tZShjb2xEYXRhID0+IGNlbGxNb2RlbENvbnRhaW5zQ29sdW1uKFNSVGFibGVVdGlsLmdldENlbGxNb2RlbChjdXJzb3IsIHRhYmxlTW9kZWwpLCBjb2xEYXRhLmNvbElkeCkpKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gR2V0IGFsbCBjZWxscyBpbiB0aGlzIGNvbHVtblxuICAgICAgICAgICAgLy8gTm90ZSAtIGlmIGV2ZXJ5dGhpbmcgaW4gdGhpcyBjb2x1bW4gaXMgZW1wdHkgb3IgYSBoZWFkZXIgY2VsbCwgdGhpcyBpcyBwcm9iYWJseSBub3QgYSBoZWFkaW5nXG4gICAgICAgICAgICBmb3IgKGxldCByb3dJZHg9MDsgcm93SWR4IDwgdGFibGVNb2RlbC5sZW5ndGg7ICsrcm93SWR4KSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBjb2xEYXRhIG9mIGNvbERhdGFzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbElkeCA9IGNvbERhdGEuY29sSWR4O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGVja0luZm8gPSB0YWJsZU1vZGVsW3Jvd0lkeF1bY29sSWR4XTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hlY2tDdXJzb3IgPSBjaGVja0luZm8uY2VsbEN1cnNvcjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hlY2tDdXJzb3JFbGVtID0gY2hlY2tDdXJzb3IuZ2V0RWxlbWVudCgpO1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIHJvdy9jb2wgaXNuJ3QgZm91bmQsIG9yIGlzIHRoZSBzYW1lIGN1cnNvciBhcyBvdXIgb3JpZ2luYWwgY2VsbCBtb2RlbCwgb3IgYWxyZWFkeSBpbiBvdXIgbGlzdCwgc2tpcCwgYnV0IGNoZWNrIGlmIGl0J3MgYSBkYXRhIGNlbGxcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGVja0luZm8gfHwgIWNoZWNrQ3Vyc29yIHx8IGNoZWNrQ3Vyc29yLmlzU2FtZU5vZGUoY2VsbEN1cnNvcikgfHwgcG90ZW50aWFsSGVhZGVycy5zb21lKGMgPT4gY2hlY2tDdXJzb3IuaXNTYW1lTm9kZShjKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbERhdGEuZXhpc3RzRGF0YUNlbGwgPSBjb2xEYXRhLmV4aXN0c0RhdGFDZWxsIHx8IChpc0RhdGFDZWxsKGNoZWNrQ3Vyc29yKSAmJiAoY2hlY2tDdXJzb3IuaGFzTm9uRW1wdHlOYW1lKCkgfHwgY29sRGF0YS5wb3RlbnRpYWxDb2xIZWFkZXJzLmxlbmd0aCA+IDApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYyA9IGNoZWNrQ3Vyc29yLmNsb25lKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGVja0N1cnNvci5nZXRSb2xlKCkgPT09IFwiY29sdW1uaGVhZGVyXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvdGVudGlhbEhlYWRlcnMucHVzaChjKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbERhdGEucG90ZW50aWFsQ29sSGVhZGVycy5wdXNoKGMpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFjaGVja0N1cnNvckVsZW0uaGFzQXR0cmlidXRlKFwicm9sZVwiKSAmJiBjaGVja0N1cnNvckVsZW0ubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJUSFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tDdXJzb3JFbGVtLmdldEF0dHJpYnV0ZShcInNjb3BlXCIpID09PSBcImNvbFwiIHx8IGNoZWNrQ3Vyc29yRWxlbS5nZXRBdHRyaWJ1dGUoXCJzY29wZVwiKSA9PT0gXCJheGlzXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3RlbnRpYWxIZWFkZXJzLnB1c2goYyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sRGF0YS5wb3RlbnRpYWxDb2xIZWFkZXJzLnB1c2goYyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFjaGVja0N1cnNvckVsZW0uaGFzQXR0cmlidXRlKFwic2NvcGVcIikgJiYgY2hlY2tDdXJzb3IuaGFzTm9uRW1wdHlOYW1lKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3RlbnRpYWxIZWFkZXJzLnB1c2goYyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sRGF0YS5wb3RlbnRpYWxDb2xIZWFkZXJzLnB1c2goYyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xEYXRhLmV4aXN0c0RhdGFDZWxsID0gY29sRGF0YS5leGlzdHNEYXRhQ2VsbCB8fCAoaXNEYXRhQ2VsbChjaGVja0N1cnNvcikgJiYgKGNoZWNrQ3Vyc29yLmhhc05vbkVtcHR5TmFtZSgpIHx8IGNvbERhdGEucG90ZW50aWFsQ29sSGVhZGVycy5sZW5ndGggPiAwKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNvbERhdGEgb2YgY29sRGF0YXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWNvbERhdGEuZXhpc3RzRGF0YUNlbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgY29sRGF0YS5wb3RlbnRpYWxDb2xIZWFkZXJzID0gW107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcG90ZW50aWFsSGVhZGVycyA9IHBvdGVudGlhbEhlYWRlcnMuZmlsdGVyKG9uZSA9PiBjb2xEYXRhcy5zb21lKGNvbERhdGEgPT4gY29sRGF0YS5wb3RlbnRpYWxDb2xIZWFkZXJzLnNvbWUodHdvID0+IHR3by5pc1NhbWVOb2RlKG9uZSkpKSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcG90ZW50aWFsSGVhZGVyc1xuICAgICAgICAgICAgLy8gQW5kIHRoZW4gcmV0dXJuIHRoZSBuYW1lcyBvZiB0aGUgaGVhZGVyc1xuICAgICAgICAgICAgLm1hcChjdXJzb3IgPT4gY3Vyc29yLmdldE5hbWVJbmZvKCk/Lm5hbWUgfHwgXCJcIilcbiAgICAgICAgICAgIC5tYXAocyA9PiBzLnRyaW0oKSlcbiAgICAgICAgICAgIC5maWx0ZXIocyA9PiBzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAuam9pbihcIiwgXCIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHJvdyBoZWFkZXJzIGFzc29jaWF0ZWQgd2l0aCBhIGNlbGxcbiAgICAgKiBGaXJzdCBjaGVja3MgZm9yIGV4cGxpY2l0IGhlYWRlcnMgYXR0cmlidXRlLCB0aGVuIGxvb2tzIGZvciByb3cgaGVhZGVycyBpbiB0aGUgc2FtZSByb3dcbiAgICAgKiBAcGFyYW0gY3Vyc29yIC0gVGhlIFNSQ3Vyc29yIHBvaW50aW5nIHRvIGEgY2VsbFxuICAgICAqIEByZXR1cm5zIEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGNvbmNhdGVuYXRlZCBoZWFkZXIgbmFtZXNcbiAgICAgKi9cbiAgICBleHBvcnQgZnVuY3Rpb24gZ2V0Um93SGVhZGVyc0ZvckN1cnNvcihpbkNlbGxDdXJzb3I6IFNSQ3Vyc29yLCB0YWJsZU1vZGVsPzogVGFibGVNb2RlbCkge1xuICAgICAgICBpZiAoIXRhYmxlTW9kZWwpIHtcbiAgICAgICAgICAgIHRhYmxlTW9kZWwgPSBnZXRUYWJsZU1vZGVsKGluQ2VsbEN1cnNvcik7XG4gICAgICAgICAgICBpZiAoIXRhYmxlTW9kZWwpIHJldHVybiBcIlwiO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNlbGxNb2RlbCA9IGdldENlbGxNb2RlbChpbkNlbGxDdXJzb3IsIHRhYmxlTW9kZWwpO1xuICAgICAgICBpZiAoIWNlbGxNb2RlbCkgcmV0dXJuIFwiXCI7XG5cbiAgICAgICAgY29uc3QgY2VsbEN1cnNvciA9IGNlbGxNb2RlbC5jZWxsQ3Vyc29yO1xuICAgICAgICBpZiAoIWNlbGxDdXJzb3IpIHJldHVybiBcIlwiO1xuXG4gICAgICAgIGNvbnN0IGNlbGxFbGVtID0gY2VsbEN1cnNvci5nZXRFbGVtZW50KCk7XG4gICAgICAgIGlmICghY2VsbEVsZW0pIHJldHVybiBcIlwiO1xuXG4gICAgICAgIGNvbnN0IHJvd0RhdGFzOiBBcnJheTx7XG4gICAgICAgICAgICBwb3RlbnRpYWxSb3dIZWFkZXJzOiBTUkN1cnNvcltdLFxuICAgICAgICAgICAgZXhpc3RzRGF0YUNlbGw6IGJvb2xlYW4sXG4gICAgICAgICAgICByb3dJZHg6IG51bWJlclxuICAgICAgICB9PiA9IFtdO1xuICAgICAgICBmb3IgKGxldCByb3dJZHggPSBjZWxsTW9kZWwucm93SW5kZXhTdGFydDsgcm93SWR4IDwgY2VsbE1vZGVsLnJvd0luZGV4U3RhcnQrY2VsbE1vZGVsLnJvd3NwYW47ICsrcm93SWR4KSB7XG4gICAgICAgICAgICByb3dEYXRhcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBwb3RlbnRpYWxSb3dIZWFkZXJzOiBbXSxcbiAgICAgICAgICAgICAgICBleGlzdHNEYXRhQ2VsbDogZmFsc2UsXG4gICAgICAgICAgICAgICAgcm93SWR4XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwb3RlbnRpYWxIZWFkZXJzOiBTUkN1cnNvcltdID0gW107XG4gICAgICAgIGlmIChjZWxsRWxlbS5oYXNBdHRyaWJ1dGUoXCJoZWFkZXJzXCIpKSB7XG4gICAgICAgICAgICBwb3RlbnRpYWxIZWFkZXJzID0gY2VsbEVsZW0uZ2V0QXR0cmlidXRlKFwiaGVhZGVyc1wiKVxuICAgICAgICAgICAgICAgIC8vIFNwbGl0IHRoZSBoZWFkZXIgYXR0cmlidXRlIGludG8gaWRzXG4gICAgICAgICAgICAgICAgLnNwbGl0KFwiIFwiKVxuICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgbm9kZSBmb3IgZWFjaCBpZFxuICAgICAgICAgICAgICAgIC5tYXAoaWQgPT4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpKVxuICAgICAgICAgICAgICAgIC8vIEdldCByaWQgb2YgYmFkIG1hcHBpbmdzXG4gICAgICAgICAgICAgICAgLmZpbHRlcihub2RlID0+ICEhbm9kZSlcbiAgICAgICAgICAgICAgICAvLyBDb252ZXJ0IHRvIFNSQ3Vyc29ycyB0byB0aGF0IHdlIGNhbiBnZXQgYWNjZXNzaWJsZSBuYW1lc1xuICAgICAgICAgICAgICAgIC5tYXAobm9kZSA9PiBuZXcgU1JDdXJzb3Iobm9kZSkpXG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIGhlYWRlcnMgdGhhdCBhcmVuJ3QgaW4gdGhlIHNhbWUgcm93IChpZ25vcmUgY29sdW1uIGhlYWRlcnMpXG4gICAgICAgICAgICAgICAgLmZpbHRlcihjdXJzb3IgPT4gcm93RGF0YXMuc29tZShyb3dEYXRhID0+IGNlbGxNb2RlbENvbnRhaW5zUm93KFNSVGFibGVVdGlsLmdldENlbGxNb2RlbChjdXJzb3IsIHRhYmxlTW9kZWwpLCByb3dEYXRhLnJvd0lkeCkpKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gR2V0IGFsbCBjZWxscyBpbiB0aGUgcm93c1xuICAgICAgICAgICAgLy8gTm90ZSAtIGlmIGV2ZXJ5dGhpbmcgaW4gdGhlIHJvdyBpcyBlbXB0eSBvciBhIGhlYWRlciBjZWxsLCB0aGlzIGlzIHByb2JhYmx5IG5vdCBhIGhlYWRpbmdcbiAgICAgICAgICAgIGxldCBsb25nZXN0Um93ID0gcm93RGF0YXMucmVkdWNlKChwcmV2LCBjdXIpID0+IE1hdGgubWF4KHByZXYsIHRhYmxlTW9kZWxbY3VyLnJvd0lkeF0ubGVuZ3RoKSwgMCk7XG4gICAgICAgICAgICBmb3IgKGxldCBjb2xJZHg9MDsgY29sSWR4IDwgbG9uZ2VzdFJvdzsgKytjb2xJZHgpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHJvd0RhdGEgb2Ygcm93RGF0YXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgcm93SWR4ID0gcm93RGF0YS5yb3dJZHg7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb2xJZHggPj0gdGFibGVNb2RlbFtyb3dJZHhdLmxlbmd0aCkgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoZWNrSW5mbyA9IHRhYmxlTW9kZWxbcm93SWR4XVtjb2xJZHhdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGVja0N1cnNvciA9IGNoZWNrSW5mby5jZWxsQ3Vyc29yO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGVja0N1cnNvckVsZW0gPSBjaGVja0N1cnNvci5nZXRFbGVtZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgcm93L2NvbCBpc24ndCBmb3VuZCwgb3IgaXMgdGhlIHNhbWUgY3Vyc29yIGFzIG91ciBvcmlnaW5hbCBjZWxsIG1vZGVsLCBvciBhbHJlYWR5IGluIG91ciBsaXN0LCBza2lwLCBidXQgY2hlY2sgaWYgaXQncyBhIGRhdGEgY2VsbFxuICAgICAgICAgICAgICAgICAgICBpZiAoIWNoZWNrSW5mbyB8fCAhY2hlY2tDdXJzb3IgfHwgY2hlY2tDdXJzb3IuaXNTYW1lTm9kZShjZWxsQ3Vyc29yKSB8fCBwb3RlbnRpYWxIZWFkZXJzLnNvbWUoYyA9PiBjaGVja0N1cnNvci5pc1NhbWVOb2RlKGMpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcm93RGF0YS5leGlzdHNEYXRhQ2VsbCA9IHJvd0RhdGEuZXhpc3RzRGF0YUNlbGwgfHwgKGlzRGF0YUNlbGwoY2hlY2tDdXJzb3IpICYmIChjaGVja0N1cnNvci5oYXNOb25FbXB0eU5hbWUoKSB8fCByb3dEYXRhLnBvdGVudGlhbFJvd0hlYWRlcnMubGVuZ3RoID4gMCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjID0gY2hlY2tDdXJzb3IuY2xvbmUoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoZWNrQ3Vyc29yLmdldFJvbGUoKSA9PT0gXCJyb3doZWFkZXJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcG90ZW50aWFsSGVhZGVycy5wdXNoKGMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcm93RGF0YS5wb3RlbnRpYWxSb3dIZWFkZXJzLnB1c2goYyk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWNoZWNrQ3Vyc29yRWxlbS5oYXNBdHRyaWJ1dGUoXCJyb2xlXCIpICYmIGNoZWNrQ3Vyc29yRWxlbS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIlRIXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGVja0N1cnNvckVsZW0uZ2V0QXR0cmlidXRlKFwic2NvcGVcIikgPT09IFwicm93XCIgfHwgY2hlY2tDdXJzb3JFbGVtLmdldEF0dHJpYnV0ZShcInNjb3BlXCIpID09PSBcImF4aXNcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvdGVudGlhbEhlYWRlcnMucHVzaChjKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dEYXRhLnBvdGVudGlhbFJvd0hlYWRlcnMucHVzaChjKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWNoZWNrQ3Vyc29yRWxlbS5oYXNBdHRyaWJ1dGUoXCJzY29wZVwiKSAmJiBjaGVja0N1cnNvci5oYXNOb25FbXB0eU5hbWUoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvdGVudGlhbEhlYWRlcnMucHVzaChjKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dEYXRhLnBvdGVudGlhbFJvd0hlYWRlcnMucHVzaChjKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvd0RhdGEuZXhpc3RzRGF0YUNlbGwgPSByb3dEYXRhLmV4aXN0c0RhdGFDZWxsIHx8IChpc0RhdGFDZWxsKGNoZWNrQ3Vyc29yKSAmJiAoY2hlY2tDdXJzb3IuaGFzTm9uRW1wdHlOYW1lKCkgfHwgcm93RGF0YS5wb3RlbnRpYWxSb3dIZWFkZXJzLmxlbmd0aCA+IDApKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoY29uc3Qgcm93RGF0YSBvZiByb3dEYXRhcykge1xuICAgICAgICAgICAgICAgIGlmICghcm93RGF0YS5leGlzdHNEYXRhQ2VsbCkge1xuICAgICAgICAgICAgICAgICAgICByb3dEYXRhLnBvdGVudGlhbFJvd0hlYWRlcnMgPSBbXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwb3RlbnRpYWxIZWFkZXJzID0gcG90ZW50aWFsSGVhZGVycy5maWx0ZXIob25lID0+IHJvd0RhdGFzLnNvbWUocm93RGF0YSA9PiByb3dEYXRhLnBvdGVudGlhbFJvd0hlYWRlcnMuc29tZSh0d28gPT4gdHdvLmlzU2FtZU5vZGUob25lKSkpKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwb3RlbnRpYWxIZWFkZXJzXG4gICAgICAgICAgICAvLyBBbmQgdGhlbiByZXR1cm4gdGhlIG5hbWVzIG9mIHRoZSBoZWFkZXJzXG4gICAgICAgICAgICAubWFwKGN1cnNvciA9PiBjdXJzb3IuZ2V0TmFtZUluZm8oKT8ubmFtZSB8fCBcIlwiKVxuICAgICAgICAgICAgLm1hcChzID0+IHMudHJpbSgpKVxuICAgICAgICAgICAgLmZpbHRlcihzID0+IHMubGVuZ3RoID4gMClcbiAgICAgICAgICAgIC5qb2luKFwiLCBcIik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyBpZiBhIGNlbGwgaXMgYSBkYXRhIGNlbGwgKG5vdCBhIGhlYWRlciBjZWxsKVxuICAgICAqXG4gICAgICogQSBkYXRhIGNlbGwgaXMgb25lIHdpdGggZWl0aGVyOlxuICAgICAqIC0gQW4gZXhwbGljaXQgQVJJQSByb2xlIG9mIFwiY2VsbFwiXG4gICAgICogLSBBIFREIGVsZW1lbnQgd2l0aG91dCBhbiBvdmVycmlkaW5nIHJvbGUgYXR0cmlidXRlXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2hlY2tDdXJzb3IgLSBUaGUgY3Vyc29yIHRvIGNoZWNrXG4gICAgICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgY3Vyc29yIHBvaW50cyB0byBhIGRhdGEgY2VsbFxuICAgICAqL1xuICAgIGV4cG9ydCBmdW5jdGlvbiBpc0RhdGFDZWxsKGNoZWNrQ3Vyc29yOiBTUkN1cnNvcikge1xuICAgICAgICBjb25zdCBjaGVja0N1cnNvckVsZW0gPSBjaGVja0N1cnNvci5nZXRFbGVtZW50KCk7XG4gICAgICAgIGlmICghY2hlY2tDdXJzb3JFbGVtKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiBjaGVja0N1cnNvci5nZXRSb2xlKCkgPT09IFwiY2VsbFwiIHx8ICghY2hlY2tDdXJzb3JFbGVtLmhhc0F0dHJpYnV0ZShcInJvbGVcIikgJiYgY2hlY2tDdXJzb3JFbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiVERcIik7XG4gICAgfVxufSIsImltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBuYW1lc3BhY2UgU1JVdGlsIHtcbiAgICBleHBvcnQgZnVuY3Rpb24gaXNNb2RhbERpYWxvZ0VsZW1lbnQobm9kZTogTm9kZSkge1xuICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSAhPT0gMSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjb25zdCBlbGVtID0gbm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgY29uc3Qgcm9sZSA9IEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZShlbGVtLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIHJvbGUgPT09IFwiZGlhbG9nXCIgJiYgZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLW1vZGFsXCIpID09PSBcInRydWVcIiAmJiBWaXNVdGlsLmlzTm9kZVZpc2libGUobm9kZSlcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZXMgYSB1bmlxdWUgQ1NTIHNlbGVjdG9yIGZvciBhIHNwZWNpZmljIEhUTUwgZWxlbWVudFxuICAgICAqIFRoZSBzZWxlY3RvciBpcyBidWlsdCB1c2luZyBhIGNvbWJpbmF0aW9uIG9mOlxuICAgICAqIDEuIEVsZW1lbnQgdGFnIG5hbWVcbiAgICAgKiAyLiBJRCAoaWYgYXZhaWxhYmxlKVxuICAgICAqIDMuIENsYXNzZXMgKGlmIGF2YWlsYWJsZSlcbiAgICAgKiA0LiBBdHRyaWJ1dGVzIChpZiBuZWVkZWQpXG4gICAgICogNS4gbnRoLWNoaWxkIHNlbGVjdG9ycyBmb3IgcG9zaXRpb24gaW4gcGFyZW50XG4gICAgICogXG4gICAgICogQHBhcmFtIGVsZW1lbnQgVGhlIEhUTUwgZWxlbWVudCB0byBnZW5lcmF0ZSBhIHNlbGVjdG9yIGZvclxuICAgICAqIEBwYXJhbSBvcHRpbWl6ZWQgSWYgdHJ1ZSwgY3JlYXRlcyBhIHNob3J0ZXIgYnV0IHBvc3NpYmx5IGxlc3Mgcm9idXN0IHNlbGVjdG9yXG4gICAgICogQHJldHVybiBBIENTUyBzZWxlY3RvciBzdHJpbmcgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIHRoZSBlbGVtZW50XG4gICAgICovXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGdldFVuaXF1ZVNlbGVjdG9yKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBvcHRpbWl6ZWQ6IGJvb2xlYW4gPSBmYWxzZSk6IHN0cmluZyB7XG4gICAgICAgIC8vIElmIHRoZSBlbGVtZW50IGhhcyBhbiBJRCwgdGhhdCdzIHRoZSBtb3N0IGRpcmVjdCB3YXkgdG8gc2VsZWN0IGl0XG4gICAgICAgIGlmIChlbGVtZW50LmlkKSB7XG4gICAgICAgICAgICByZXR1cm4gYCMke0NTUy5lc2NhcGUoZWxlbWVudC5pZCl9YDtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gSWYgd2UncmUgYXQgdGhlIHJvb3Qgb3IgZG9jdW1lbnQgZWxlbWVudCwgcmV0dXJuIHRoZSB0YWcgbmFtZVxuICAgICAgICBpZiAoZWxlbWVudC5pc1NhbWVOb2RlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkgfHwgZWxlbWVudC5pc1NhbWVOb2RlKGRvY3VtZW50LmJvZHkpKSB7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIFN0YXJ0IGJ1aWxkaW5nIHRoZSBzZWxlY3RvciB3aXRoIHRoZSB0YWcgbmFtZVxuICAgICAgICBsZXQgc2VsZWN0b3IgPSBlbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgXG4gICAgICAgIC8vIEFkZCBjbGFzc2VzIGlmIGF2YWlsYWJsZSBhbmQgd2UncmUgbm90IG9wdGltaXppbmcgZm9yIGJyZXZpdHlcbiAgICAgICAgaWYgKGVsZW1lbnQuY2xhc3NMaXN0Lmxlbmd0aCAmJiAhb3B0aW1pemVkKSB7XG4gICAgICAgICAgICAvLyBUYWtlIHVwIHRvIDMgY2xhc3NlcyB0byBhdm9pZCBvdmVybHkgc3BlY2lmaWMgc2VsZWN0b3JzXG4gICAgICAgICAgICBjb25zdCBjbGFzc2VzID0gQXJyYXkuZnJvbShlbGVtZW50LmNsYXNzTGlzdCkuc2xpY2UoMCwgMyk7XG4gICAgICAgICAgICBzZWxlY3RvciArPSBjbGFzc2VzLm1hcChjbHMgPT4gYC4ke0NTUy5lc2NhcGUoY2xzKX1gKS5qb2luKCcnKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gQWRkIGRpc3Rpbmd1aXNoaW5nIGF0dHJpYnV0ZXMgaWYgbmVlZGVkIGFuZCBub3Qgb3B0aW1pemluZ1xuICAgICAgICBpZiAoIW9wdGltaXplZCkge1xuICAgICAgICAgICAgLy8gQ29uc2lkZXIgYWRkaW5nIHJvbGUsIGFyaWEtbGFiZWwsIG9yIG90aGVyIGRpc3RpbmN0aXZlIGF0dHJpYnV0ZXNcbiAgICAgICAgICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZSgncm9sZScpKSB7XG4gICAgICAgICAgICAgICAgc2VsZWN0b3IgKz0gYFtyb2xlPVwiJHtDU1MuZXNjYXBlKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdyb2xlJykgfHwgJycpfVwiXWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZSgnYXJpYS1sYWJlbCcpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGFiZWwgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcpIHx8ICcnO1xuICAgICAgICAgICAgICAgIGlmIChsYWJlbC5sZW5ndGggPD0gMjApIHsgLy8gQXZvaWQgb3Zlcmx5IGxvbmcgc2VsZWN0b3JzXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yICs9IGBbYXJpYS1sYWJlbD1cIiR7Q1NTLmVzY2FwZShsYWJlbCl9XCJdYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIEZvciBpbnB1dHMsIGFkZCB0eXBlIGF0dHJpYnV0ZVxuICAgICAgICAgICAgaWYgKGVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnaW5wdXQnICYmIGVsZW1lbnQuaGFzQXR0cmlidXRlKCd0eXBlJykpIHtcbiAgICAgICAgICAgICAgICBzZWxlY3RvciArPSBgW3R5cGU9XCIke0NTUy5lc2NhcGUoZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3R5cGUnKSB8fCAnJyl9XCJdYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIHBhcmVudCBub2RlLCBkZXRlcm1pbmUgcG9zaXRpb24gYW1vbmcgc2libGluZ3NcbiAgICAgICAgaWYgKGVsZW1lbnQucGFyZW50RWxlbWVudCkge1xuICAgICAgICAgICAgLy8gRmluZCBhbGwgc2libGluZ3Mgd2l0aCB0aGUgc2FtZSB0YWdcbiAgICAgICAgICAgIGNvbnN0IHNpYmxpbmdzID0gQXJyYXkuZnJvbShlbGVtZW50LnBhcmVudEVsZW1lbnQuY2hpbGRyZW4pXG4gICAgICAgICAgICAgICAgLmZpbHRlcihjaGlsZCA9PiBjaGlsZC50YWdOYW1lID09PSBlbGVtZW50LnRhZ05hbWUpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBJZiB0aGVyZSdzIG1vcmUgdGhhbiBvbmUgc2libGluZyB3aXRoIHRoZSBzYW1lIHRhZywgYWRkIG50aC1jaGlsZFxuICAgICAgICAgICAgaWYgKHNpYmxpbmdzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IHNpYmxpbmdzLmluZGV4T2YoZWxlbWVudCkgKyAxO1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yICs9IGA6bnRoLW9mLXR5cGUoJHtpbmRleH0pYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gSWYgd2UncmUgbm90IGF0IHRoZSByb290LCByZWN1cnNpdmVseSBidWlsZCB0aGUgcGFyZW50IHNlbGVjdG9yXG4gICAgICAgICAgICAvLyBidXQgdXNlIG9wdGltaXplZCBzZWxlY3RvcnMgZm9yIGFuY2VzdG9ycyB0byBrZWVwIHRoZSBvdmVyYWxsIHNlbGVjdG9yIG1hbmFnZWFibGVcbiAgICAgICAgICAgIHJldHVybiBgJHtnZXRVbmlxdWVTZWxlY3RvcihlbGVtZW50LnBhcmVudEVsZW1lbnQsIHRydWUpfSA+ICR7c2VsZWN0b3J9YDtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHNlbGVjdG9yO1xuICAgIH1cbn0iLCJpbXBvcnQgeyBTUkNvbnRyb2xsZXIgfSBmcm9tIFwiLi9TUkNvbnRyb2xsZXJcIjtcbmltcG9ydCB7IE5hdmlnYXRpb25Nb2RlLCBOYXZpZ2F0aW9uUmVzdWx0IH0gZnJvbSBcIi4vU1JUeXBlc1wiO1xuXG4vKipcbiAqIFNST3ZlcmxheSBjbGFzcyBmb3IgY3JlYXRpbmcgYSBVSSB3aWRnZXQgdG8gY29udHJvbCBzY3JlZW4gcmVhZGVyIHNpbXVsYXRpb25cbiAqIFByb3ZpZGVzIGJ1dHRvbnMgZm9yIG5hdmlnYXRpb24gYW5kIGRpc3BsYXlzIHJlc3VsdHNcbiAqL1xuZXhwb3J0IGNsYXNzIFNST3ZlcmxheSB7XG4gICAgLyoqIFRoZSBjb250YWluZXIgZWxlbWVudCBmb3IgdGhlIG92ZXJsYXkgKi9cbiAgICBwcml2YXRlIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XG4gICAgLyoqIFRoZSByZXN1bHRzIGRpc3BsYXkgZWxlbWVudCAqL1xuICAgIHByaXZhdGUgcmVzdWx0c0Rpc3BsYXk6IEhUTUxFbGVtZW50O1xuICAgIC8qKiBOYXZpZ2F0aW9uIG1vZGVzIGF2YWlsYWJsZSBpbiB0aGUgVUkgKi9cbiAgICBwcml2YXRlIG5hdmlnYXRpb25Nb2RlczogeyBtb2RlOiBOYXZpZ2F0aW9uTW9kZSwgbGFiZWw6IHN0cmluZyB9W10gPSBbXG4gICAgICAgIHsgbW9kZTogXCJpdGVtXCIsIGxhYmVsOiBcIkl0ZW1cIiB9LFxuICAgICAgICB7IG1vZGU6IFwidGFiX2ZvY3VzXCIsIGxhYmVsOiBcIlRhYmJhYmxlXCIgfSxcbiAgICAgICAgeyBtb2RlOiBcImhlYWRpbmdcIiwgbGFiZWw6IFwiSGVhZGluZ1wiIH0sXG4gICAgICAgIHsgbW9kZTogXCJyZWdpb25cIiwgbGFiZWw6IFwiUmVnaW9uXCIgfVxuICAgIF07XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IFNST3ZlcmxheVxuICAgICAqIEBwYXJhbSBjb250cm9sbGVyIFRoZSBTUkNvbnRyb2xsZXIgaW5zdGFuY2UgdG8gdXNlIGZvciBuYXZpZ2F0aW9uXG4gICAgICovXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBzclZpZXdlcjogU1JWaWV3ZXIpIHtcbiAgICAgICAgdGhpcy5jcmVhdGVPdmVybGF5KCk7XG4gICAgfVxuXG5cbiAgICBwcml2YXRlIGNyZWF0ZURPTUVsZW1lbnQoZWxlbU5hbWU6IHN0cmluZywgYXR0cnM6IHsgW2F0dHI6IHN0cmluZ106IHN0cmluZ30sIHN0eWxlczogUGFydGlhbDxDU1NTdHlsZURlY2xhcmF0aW9uPikge1xuICAgICAgICBsZXQgcmV0VmFsID0gdGhpcy5zclZpZXdlci52aWV3ZXJEb2MuY3JlYXRlRWxlbWVudChlbGVtTmFtZSk7XG4gICAgICAgIGlmIChhdHRycykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gYXR0cnMpIHtcbiAgICAgICAgICAgICAgICByZXRWYWxba2V5XSA9IGF0dHJzW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0eWxlcykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gc3R5bGVzKSB7XG4gICAgICAgICAgICAgICAgcmV0VmFsLnN0eWxlW2tleV0gPSBzdHlsZXNba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdGhlIG92ZXJsYXkgVUkgZWxlbWVudHMgYW5kIGFkZHMgdGhlbSB0byB0aGUgRE9NXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVPdmVybGF5KCk6IHZvaWQge1xuICAgICAgICAvLyBDcmVhdGUgbWFpbiBjb250YWluZXJcbiAgICAgICAgdGhpcy5jb250YWluZXIgPSB0aGlzLmNyZWF0ZURPTUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICAgICAgY2xhc3NOYW1lOiBcImlibWEtc3Itb3ZlcmxheVwiXG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIHBvc2l0aW9uOiAnZml4ZWQnLFxuICAgICAgICAgICAgYm90dG9tOiAnMCcsXG4gICAgICAgICAgICBsZWZ0OiAnMCcsXG4gICAgICAgICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAncmdiYSgwLCAwLCAwLCAwLjgpJyxcbiAgICAgICAgICAgIGNvbG9yOiAnd2hpdGUnLFxuICAgICAgICAgICAgcGFkZGluZzogJzEwcHgnLFxuICAgICAgICAgICAgekluZGV4OiAnMTAwMDAnLFxuICAgICAgICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgICAgICAgZmxleERpcmVjdGlvbjogJ2NvbHVtbicsXG4gICAgICAgICAgICBnYXA6ICcxMHB4J1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBDcmVhdGUgY29udHJvbHMgY29udGFpbmVyXG4gICAgICAgIGNvbnN0IGNvbnRyb2xzQ29udGFpbmVyID0gdGhpcy5jcmVhdGVET01FbGVtZW50KFwiZGl2XCIsIHt9LCB7IFxuICAgICAgICAgICAgZGlzcGxheTogXCJmbGV4XCIsIGZsZXhXcmFwOiBcIndyYXBcIiwgZ2FwOiBcIjEwcHhcIn0pO1xuXG4gICAgICAgIC8vIENyZWF0ZSBuYXZpZ2F0aW9uIG1vZGUgZ3JvdXBzXG4gICAgICAgIHRoaXMubmF2aWdhdGlvbk1vZGVzLmZvckVhY2gobmF2TW9kZSA9PiB7XG4gICAgICAgICAgICBjb25zdCBtb2RlR3JvdXAgPSB0aGlzLmNyZWF0ZURPTUVsZW1lbnQoJ2RpdicsIHt9LCB7XG4gICAgICAgICAgICAgICAgZGlzcGxheTogXCJmbGV4XCIsXG4gICAgICAgICAgICAgICAgYWxpZ25JdGVtczogJ2NlbnRlcicsXG4gICAgICAgICAgICAgICAgZ2FwOiAnNXB4JyxcbiAgICAgICAgICAgICAgICBtYXJnaW46ICcwIDEwcHgnXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgbW9kZUdyb3VwLmFwcGVuZENoaWxkKHRoaXMuY3JlYXRlRE9NRWxlbWVudCgnc3BhbicsIHtcbiAgICAgICAgICAgICAgICB0ZXh0Q29udGVudDogbmF2TW9kZS5sYWJlbCArIFwiOlwiXG4gICAgICAgICAgICB9LCB7fSkpO1xuXG4gICAgICAgICAgICAvLyBQcmV2aW91cyBidXR0b25cbiAgICAgICAgICAgIGNvbnN0IHByZXZCdXR0b24gPSB0aGlzLmNyZWF0ZURPTUVsZW1lbnQoJ2J1dHRvbicsIHtcbiAgICAgICAgICAgICAgICB0ZXh0Q29udGVudDogJ+KXgCBQcmV2J1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIHBhZGRpbmc6ICc1cHggMTBweCcsXG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAnIzQ0NCcsXG4gICAgICAgICAgICAgICAgY29sb3I6ICd3aGl0ZScsXG4gICAgICAgICAgICAgICAgYm9yZGVyOiAnbm9uZScsXG4gICAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiAnM3B4JyxcbiAgICAgICAgICAgICAgICBjdXJzb3I6ICdwb2ludGVyJ1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBwcmV2QnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5zclZpZXdlci5uYXZpZ2F0ZVByZXZpb3VzKG5hdk1vZGUubW9kZSkpO1xuICAgICAgICAgICAgbW9kZUdyb3VwLmFwcGVuZENoaWxkKHByZXZCdXR0b24pO1xuXG4gICAgICAgICAgICAvLyBOZXh0IGJ1dHRvblxuICAgICAgICAgICAgY29uc3QgbmV4dEJ1dHRvbiA9IHRoaXMuY3JlYXRlRE9NRWxlbWVudCgnYnV0dG9uJywge1xuICAgICAgICAgICAgICAgIHRleHRDb250ZW50OiAnTmV4dCDilrYnXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgcGFkZGluZzogJzVweCAxMHB4JyxcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICcjNDQ0JyxcbiAgICAgICAgICAgICAgICBjb2xvcjogJ3doaXRlJyxcbiAgICAgICAgICAgICAgICBib3JkZXI6ICdub25lJyxcbiAgICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6ICczcHgnLFxuICAgICAgICAgICAgICAgIGN1cnNvcjogJ3BvaW50ZXInXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG5leHRCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB0aGlzLnNyVmlld2VyLm5hdmlnYXRlTmV4dChuYXZNb2RlLm1vZGUpKTtcbiAgICAgICAgICAgIG1vZGVHcm91cC5hcHBlbmRDaGlsZChuZXh0QnV0dG9uKTtcblxuICAgICAgICAgICAgY29udHJvbHNDb250YWluZXIuYXBwZW5kQ2hpbGQobW9kZUdyb3VwKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGxldCBvdGhlckJ1dHRvbkdyb3VwID0gdGhpcy5jcmVhdGVET01FbGVtZW50KCdkaXYnLCB7fSwge1xuICAgICAgICAgICAgZGlzcGxheTogXCJmbGV4XCIsXG4gICAgICAgICAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgICAgICAgICAgIGdhcDogJzVweCcsXG4gICAgICAgICAgICBtYXJnaW46ICcwIDEwcHgnXG4gICAgICAgIH0pXG4gICAgICAgIC8vIFNob3cgYWxsIGJ1dHRvblxuICAgICAgICBjb25zdCBzaG93QWxsQnV0dG9uID0gdGhpcy5jcmVhdGVET01FbGVtZW50KCdidXR0b24nLCB7XG4gICAgICAgICAgICB0ZXh0Q29udGVudDogJ1Nob3cgYWxsJ1xuICAgICAgICB9LCB7XG4gICAgICAgICAgICBwYWRkaW5nOiAnNXB4IDEwcHgnLFxuICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAnIzQ0NCcsXG4gICAgICAgICAgICBjb2xvcjogJ3doaXRlJyxcbiAgICAgICAgICAgIGJvcmRlcjogJ25vbmUnLFxuICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiAnM3B4JyxcbiAgICAgICAgICAgIGN1cnNvcjogJ3BvaW50ZXInXG4gICAgICAgIH0pO1xuICAgICAgICBzaG93QWxsQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5zclZpZXdlci5zaG93QWxsKHRydWUpKTtcbiAgICAgICAgb3RoZXJCdXR0b25Hcm91cC5hcHBlbmRDaGlsZChzaG93QWxsQnV0dG9uKTtcblxuICAgICAgICAvLyBUb2dnbGUgU3BlZWNoIEJ1dHRvblxuICAgICAgICBjb25zdCB0b2dnbGVTcGVlY2ggPSB0aGlzLmNyZWF0ZURPTUVsZW1lbnQoJ2J1dHRvbicsIHtcbiAgICAgICAgICAgIHRleHRDb250ZW50OiAnVG9nZ2xlIHNwZWVjaCdcbiAgICAgICAgfSwge1xuICAgICAgICAgICAgcGFkZGluZzogJzVweCAxMHB4JyxcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJyM0NDQnLFxuICAgICAgICAgICAgY29sb3I6ICd3aGl0ZScsXG4gICAgICAgICAgICBib3JkZXI6ICdub25lJyxcbiAgICAgICAgICAgIGJvcmRlclJhZGl1czogJzNweCcsXG4gICAgICAgICAgICBjdXJzb3I6ICdwb2ludGVyJ1xuICAgICAgICB9KTtcbiAgICAgICAgdG9nZ2xlU3BlZWNoLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5zclZpZXdlci50b2dnbGVTcGVlY2goKSk7XG4gICAgICAgIG90aGVyQnV0dG9uR3JvdXAuYXBwZW5kQ2hpbGQodG9nZ2xlU3BlZWNoKTtcbiAgICAgICAgY29udHJvbHNDb250YWluZXIuYXBwZW5kQ2hpbGQob3RoZXJCdXR0b25Hcm91cCk7XG5cblxuICAgICAgICAvLyBDcmVhdGUgcmVzdWx0cyBkaXNwbGF5XG4gICAgICAgIHRoaXMucmVzdWx0c0Rpc3BsYXkgPSB0aGlzLmNyZWF0ZURPTUVsZW1lbnQoJ2RpdicsIHtcbiAgICAgICAgICAgIHRleHRDb250ZW50OiAnU2NyZWVuIHJlYWRlciBzaW11bGF0aW9uIHJlc3VsdHMgd2lsbCBhcHBlYXIgaGVyZS4nXG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIHBhZGRpbmc6ICcxMHB4JyxcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJ3JnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKScsXG4gICAgICAgICAgICBib3JkZXJSYWRpdXM6ICczcHgnLFxuICAgICAgICAgICAgbWluSGVpZ2h0OiAnMTAwcHgnLFxuICAgICAgICAgICAgbWF4SGVpZ2h0OiAnNTB2aCcsXG4gICAgICAgICAgICBmb250RmFtaWx5OiAnbW9ub3NwYWNlJyxcbiAgICAgICAgICAgIG92ZXJmbG93OiAnYXV0bydcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gQWRkIGVsZW1lbnRzIHRvIGNvbnRhaW5lclxuICAgICAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZChjb250cm9sc0NvbnRhaW5lcik7XG4gICAgICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMucmVzdWx0c0Rpc3BsYXkpO1xuXG4gICAgICAgIC8vIEFkZCB0byBkb2N1bWVudFxuICAgICAgICB0aGlzLnNyVmlld2VyLnZpZXdlckRvYy5ib2R5LmFwcGVuZENoaWxkKHRoaXMuY29udGFpbmVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNwbGF5IHRoZSBuYXZpZ2F0aW9uIHJlc3VsdCBpbiB0aGUgb3ZlcmxheVxuICAgICAqIEBwYXJhbSByZXN1bHQgVGhlIG5hdmlnYXRpb24gcmVzdWx0XG4gICAgICogQHBhcmFtIG1vZGUgVGhlIG5hdmlnYXRpb24gbW9kZSB1c2VkXG4gICAgICogQHBhcmFtIGRpcmVjdGlvbiBUaGUgbmF2aWdhdGlvbiBkaXJlY3Rpb24gKCduZXh0JywgJ3ByZXZpb3VzJywgb3IgJ2ZvY3VzJylcbiAgICAgKi9cbiAgICBwdWJsaWMgZGlzcGxheVJlc3VsdChyZXN1bHQ6IE5hdmlnYXRpb25SZXN1bHQsIG1vZGU6IE5hdmlnYXRpb25Nb2RlLCBkaXJlY3Rpb246ICduZXh0JyB8ICdwcmV2aW91cycgfCAnZm9jdXMnKTogdm9pZCB7XG4gICAgICAgIGxldCBkaXNwbGF5VGV4dCA9ICcnO1xuICAgICAgICBcbiAgICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIj8/P1wiLCByZXN1bHQpO1xuICAgICAgICAgICAgZGlzcGxheVRleHQgPSBgJHtkaXJlY3Rpb24udG9VcHBlckNhc2UoKX0gJHttb2RlfTogJHtyZXN1bHQucmVuZGVyaW5nUmVzdWx0Lm1lc3NhZ2V9YDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRpc3BsYXlUZXh0ID0gYCR7ZGlyZWN0aW9uLnRvVXBwZXJDYXNlKCl9ICR7bW9kZX06ICR7cmVzdWx0LnJlbmRlcmluZ1Jlc3VsdC5tZXNzYWdlfWA7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0LnJlbmRlcmluZ1Jlc3VsdC5lbmQ/LmdldEVsZW1lbnQoKT8uc2Nyb2xsSW50b1ZpZXcoKTtcbiAgICAgICAgcmVzdWx0LnJlbmRlcmluZ1Jlc3VsdC5zdGFydD8uZ2V0RWxlbWVudCgpPy5zY3JvbGxJbnRvVmlldygpO1xuICAgICAgICB3aW5kb3cuc2Nyb2xsQnkoMCwgLTIwMCk7XG4gICAgICAgIFxuICAgICAgICB0aGlzLnJlc3VsdHNEaXNwbGF5LmlubmVySFRNTCA9IFwiXCI7XG4gICAgICAgIHRoaXMucmVzdWx0c0Rpc3BsYXkudGV4dENvbnRlbnQgPSBkaXNwbGF5VGV4dDtcbiAgICAgICAgbGV0IGluc3BlY3RCdXR0b24gPSB0aGlzLmNyZWF0ZURPTUVsZW1lbnQoXCJidXR0b25cIiwge1xuICAgICAgICAgICAgaW5uZXJUZXh0OiBcIkRlYnVnXCJcbiAgICAgICAgfSwge1xuICAgICAgICB9KTtcbiAgICAgICAgaW5zcGVjdEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2cocmVzdWx0LnJlbmRlcmluZ1Jlc3VsdC5zdGFydD8uZ2V0Tm9kZSgpLCByZXN1bHQucmVuZGVyaW5nUmVzdWx0LmVuZD8uZ2V0Tm9kZSgpKTtcbiAgICAgICAgfSlcbiAgICAgICAgdGhpcy5yZXN1bHRzRGlzcGxheS5hcHBlbmRDaGlsZChpbnNwZWN0QnV0dG9uKVxuICAgIH1cblxuICAgIHB1YmxpYyBkaXNwbGF5QWxsKHJlc3VsdDogQXJyYXk8eyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfT4pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdGFibGUgPSB0aGlzLmNyZWF0ZURPTUVsZW1lbnQoXCJ0YWJsZVwiLCB7fSwge30pO1xuICAgICAgICBjb25zdCBoZWFkZXJSb3cgPSB0aGlzLmNyZWF0ZURPTUVsZW1lbnQoXCJ0clwiLCB7fSwge30pO1xuICAgICAgICBjb25zdCBoZWFkaW5nTGFiZWxzID0gW1wiUmVnaW9uXCIsIFwiSGVhZGluZ1wiLCBcIkl0ZW1cIiwgXCJUYWJiYWJsZVwiXTtcbiAgICAgICAgY29uc3QgaGVhZGluZ0ZpZWxkcyA9IFtcInJlZ2lvblwiLCBcImhlYWRpbmdcIiwgXCJpdGVtXCIsIFwidGFiX2ZvY3VzXCJdO1xuICAgICAgICBmb3IgKGNvbnN0IGhlYWRpbmdMYWJlbCBvZiBoZWFkaW5nTGFiZWxzKSB7XG4gICAgICAgICAgICBoZWFkZXJSb3cuYXBwZW5kQ2hpbGQodGhpcy5jcmVhdGVET01FbGVtZW50KFwidGhcIiwge1xuICAgICAgICAgICAgICAgIHNjb3BlOiBcImNvbFwiLFxuICAgICAgICAgICAgICAgIGlubmVyVGV4dDogaGVhZGluZ0xhYmVsXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgdGV4dEFsaWduOiBcImxlZnRcIixcbiAgICAgICAgICAgICAgICBwYWRkaW5nOiBcIi4yNXJlbVwiLFxuICAgICAgICAgICAgICAgIG1hcmdpbjogXCIwcmVtXCIsXG4gICAgICAgICAgICAgICAgY29sb3I6IFwid2hpdGVcIlxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgdGFibGUuYXBwZW5kQ2hpbGQoaGVhZGVyUm93KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgbGluZSBvZiByZXN1bHQpIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGFSb3cgPSB0aGlzLmNyZWF0ZURPTUVsZW1lbnQoXCJ0clwiLCB7fSwge30pO1xuICAgICAgICAgICAgaGVhZGluZ0ZpZWxkcy5mb3JFYWNoKChmaWVsZCkgPT4ge1xuICAgICAgICAgICAgICAgIGRhdGFSb3cuYXBwZW5kQ2hpbGQodGhpcy5jcmVhdGVET01FbGVtZW50KFwidGRcIiwge1xuICAgICAgICAgICAgICAgICAgICBpbm5lclRleHQ6IGxpbmVbZmllbGRdXG4gICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbEFsaWduOiBcInRvcFwiLFxuICAgICAgICAgICAgICAgICAgICBib3JkZXI6IFwic29saWQgd2hpdGUgMXB4XCIsXG4gICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IFwiLjI1cmVtXCIsXG4gICAgICAgICAgICAgICAgICAgIG1hcmdpbjogXCIwcmVtXCIsXG4gICAgICAgICAgICAgICAgICAgIGNvbG9yOiBcIndoaXRlXCJcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgdGFibGUuYXBwZW5kQ2hpbGQoZGF0YVJvdyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZXN1bHRzRGlzcGxheS5pbm5lckhUTUwgPSBcIlwiO1xuICAgICAgICB0aGlzLnJlc3VsdHNEaXNwbGF5LmFwcGVuZENoaWxkKHRhYmxlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgdGhlIG92ZXJsYXkgZnJvbSB0aGUgRE9NXG4gICAgICovXG4gICAgcHVibGljIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmNvbnRhaW5lciAmJiB0aGlzLmNvbnRhaW5lci5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuY29udGFpbmVyKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBTUlZpZXdlciBjbGFzcyBmb3IgbWFuYWdpbmcgc2NyZWVuIHJlYWRlciBzaW11bGF0aW9uIHdpdGggVUkgY29udHJvbHNcbiAqL1xuZXhwb3J0IGNsYXNzIFNSVmlld2VyIHtcbiAgICAvKiogVGhlIGNvbnRyb2xsZXIgaW5zdGFuY2UgKi9cbiAgICBwcml2YXRlIGNvbnRyb2xsZXI6IFNSQ29udHJvbGxlcjtcbiAgICAvKiogVGhlIG92ZXJsYXkgVUkgaW5zdGFuY2UgKi9cbiAgICBwcml2YXRlIG92ZXJsYXk6IFNST3ZlcmxheTtcbiAgICAvKiogRmxhZyB0byB0cmFjayBpZiBzcGVlY2ggaXMgYWN0aXZlICovXG4gICAgcHJpdmF0ZSBpc1N0cmVhbWluZzogYm9vbGVhbiA9IGZhbHNlO1xuICAgIC8qKiBGbGFnIHRvIHNldCBpZiBzaG93aW5nIGFsbCAqL1xuICAgIHByaXZhdGUgaXNTaG93aW5nQWxsOiBib29sZWFuID0gZmFsc2U7XG4gICAgLyoqIEZsYWcgdG8gc2V0IGlmIGl0IHNob3VsZCBiZSBzcGVha2luZyAqL1xuICAgIHByaXZhdGUgc3BlZWNoRW5hYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIC8qKiBLZXlib2FyZCBldmVudCBoYW5kbGVyICovXG4gICAgcHJpdmF0ZSBrZXlib2FyZEhhbmRsZXI6IChlOiBLZXlib2FyZEV2ZW50KSA9PiB2b2lkO1xuICAgIC8qKiBGb2N1cyBldmVudCBoYW5kbGVyICovXG4gICAgcHJpdmF0ZSBmb2N1c0hhbmRsZXI6IChlOiBGb2N1c0V2ZW50KSA9PiB2b2lkO1xuICAgIHZpZXdlckRvYzogSFRNTERvY3VtZW50O1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBTUlZpZXdlclxuICAgICAqIEBwYXJhbSByb290RWxlbWVudCBUaGUgcm9vdCBlbGVtZW50IHRvIHN0YXJ0IGZyb20gKGRlZmF1bHRzIHRvIGRvY3VtZW50LmJvZHkpXG4gICAgICovXG4gICAgY29uc3RydWN0b3Iocm9vdEVsZW1lbnQ6IE5vZGUgPSBkb2N1bWVudC5ib2R5KSB7XG4gICAgICAgIHRoaXMudmlld2VyRG9jID0gcm9vdEVsZW1lbnQub3duZXJEb2N1bWVudDtcbiAgICAgICAgLy8gQ3JlYXRlIGNvbnRyb2xsZXIgZm9yIHRoZSBkb2N1bWVudCBib2R5XG4gICAgICAgIHRoaXMuY29udHJvbGxlciA9IFNSQ29udHJvbGxlci5nZXRDb250cm9sbGVyKHRoaXMudmlld2VyRG9jKTtcbiAgICAgICAgXG4gICAgICAgIC8vIENyZWF0ZSBvdmVybGF5IFVJXG4gICAgICAgIHRoaXMub3ZlcmxheSA9IG5ldyBTUk92ZXJsYXkodGhpcyk7XG4gICAgICAgIFxuICAgICAgICAvLyBTZXQgdXAga2V5Ym9hcmQgaGFuZGxlcnNcbiAgICAgICAgdGhpcy5zZXR1cEtleWJvYXJkSGFuZGxlcnMoKTtcbiAgICAgICAgXG4gICAgICAgIC8vIFNldCB1cCBmb2N1cyB0cmFja2luZ1xuICAgICAgICB0aGlzLnNldHVwRm9jdXNUcmFja2luZygpO1xuXG4gICAgICAgIC8vIFNldCB1cCBtdXRhdGlvbiB0cmFja2luZ1xuICAgICAgICB0aGlzLnNldHVwTXV0YXRpb25UcmFja2luZygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzaG93QWxsKGJFbmFibGVBbGxNb2RlPzogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBpZiAoYkVuYWJsZUFsbE1vZGUpIHtcbiAgICAgICAgICAgIHRoaXMuaXNTaG93aW5nQWxsID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPSBTUkNvbnRyb2xsZXIucmVuZGVyU3RydWN0dXJlKHRoaXMudmlld2VyRG9jKTtcbiAgICAgICAgdGhpcy5vdmVybGF5LmRpc3BsYXlBbGwocmVzdWx0KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9nZ2xlU3BlZWNoKCkge1xuICAgICAgICB0aGlzLnNwZWVjaEVuYWJsZWQgPSAhdGhpcy5zcGVlY2hFbmFibGVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE5hdmlnYXRlIHRvIHRoZSBuZXh0IGVsZW1lbnQgdXNpbmcgdGhlIHNwZWNpZmllZCBtb2RlXG4gICAgICogQHBhcmFtIG1vZGUgVGhlIG5hdmlnYXRpb24gbW9kZSB0byB1c2VcbiAgICAgKi9cbiAgICBwdWJsaWMgbmF2aWdhdGVOZXh0KG1vZGU6IE5hdmlnYXRpb25Nb2RlKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaXNTaG93aW5nQWxsID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuY29udHJvbGxlci5qdW1wTmV4dChtb2RlKTtcbiAgICAgICAgdGhpcy5vdmVybGF5LmRpc3BsYXlSZXN1bHQocmVzdWx0LCBtb2RlLCAnbmV4dCcpO1xuICAgICAgICB0aGlzLnNwZWFrUmVzdWx0KHJlc3VsdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTmF2aWdhdGUgdG8gdGhlIHByZXZpb3VzIGVsZW1lbnQgdXNpbmcgdGhlIHNwZWNpZmllZCBtb2RlXG4gICAgICogQHBhcmFtIG1vZGUgVGhlIG5hdmlnYXRpb24gbW9kZSB0byB1c2VcbiAgICAgKi9cbiAgICBwdWJsaWMgbmF2aWdhdGVQcmV2aW91cyhtb2RlOiBOYXZpZ2F0aW9uTW9kZSk6IHZvaWQge1xuICAgICAgICB0aGlzLmlzU2hvd2luZ0FsbCA9IGZhbHNlO1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmNvbnRyb2xsZXIuanVtcFByZXZpb3VzKG1vZGUpO1xuICAgICAgICB0aGlzLm92ZXJsYXkuZGlzcGxheVJlc3VsdChyZXN1bHQsIG1vZGUsICdwcmV2aW91cycpO1xuICAgICAgICB0aGlzLnNwZWFrUmVzdWx0KHJlc3VsdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHVwIGtleWJvYXJkIGV2ZW50IGhhbmRsZXJzIGZvciBzY3JlZW4gcmVhZGVyIG5hdmlnYXRpb25cbiAgICAgKi9cbiAgICBwcml2YXRlIHNldHVwS2V5Ym9hcmRIYW5kbGVycygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5rZXlib2FyZEhhbmRsZXIgPSAoZTogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgICAgICAgLy8gRG9uJ3QgY2FwdHVyZSBrZXlib2FyZCBldmVudHMgd2hlbiBmb2N1cyBpcyBpbiBmb3JtIGNvbnRyb2xzXG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBlLnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgIGlmICh0YXJnZXQudGFnTmFtZSA9PT0gJ0lOUFVUJyB8fCB0YXJnZXQudGFnTmFtZSA9PT0gJ1RFWFRBUkVBJyB8fCB0YXJnZXQudGFnTmFtZSA9PT0gJ1NFTEVDVCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIEhhbmRsZSBrZXlib2FyZCBzaG9ydGN1dHNcbiAgICAgICAgICAgIGlmIChlLmN0cmxLZXkpIHtcbiAgICAgICAgICAgICAgICAvLyBDdHJsIGtleSBzdG9wcyBzcGVlY2hcbiAgICAgICAgICAgICAgICB0aGlzLnN0b3BTcGVlY2goKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZS5hbHRLZXkgfHwgZS5tZXRhS2V5KSByZXR1cm47XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhlLmtleSk7XG4gICAgICAgICAgICBzd2l0Y2ggKGUua2V5KSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnQXJyb3dVcCc6XG4gICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0ZVByZXZpb3VzKCdpdGVtJyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJyAnOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzU3RyZWFtaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjYXNlICdBcnJvd0Rvd24nOlxuICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGVOZXh0KCdpdGVtJyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ0VudGVyJzpcbiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGl2YXRlQ3VycmVudEVsZW1lbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnNldFBvaW50T2ZSZWdhcmQodGhpcy52aWV3ZXJEb2MuYWN0aXZlRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ0gnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ2gnOlxuICAgICAgICAgICAgICAgICAgICBpZiAoZS5zaGlmdEtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0ZVByZXZpb3VzKCdoZWFkaW5nJyk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRlTmV4dCgnaGVhZGluZycpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ1InOlxuICAgICAgICAgICAgICAgIGNhc2UgJ3InOlxuICAgICAgICAgICAgICAgICAgICBpZiAoZS5zaGlmdEtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0ZVByZXZpb3VzKCdyZWdpb24nKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGVOZXh0KCdyZWdpb24nKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdUYWInOlxuICAgICAgICAgICAgICAgICAgICBpZiAoZS5zaGlmdEtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0ZVByZXZpb3VzKCd0YWJfZm9jdXMnKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGVOZXh0KCd0YWJfZm9jdXMnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgXG4gICAgICAgIC8vIEFkZCB0aGUgZXZlbnQgbGlzdGVuZXJcbiAgICAgICAgdGhpcy52aWV3ZXJEb2MuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMua2V5Ym9hcmRIYW5kbGVyKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNwZWFrUmVzdWx0KHJlc3VsdCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuc3BlZWNoRW5hYmxlZCkgcmV0dXJuO1xuICAgICAgICBjb25zdCB1dHRlcmFuY2UgPSBuZXcgU3BlZWNoU3ludGhlc2lzVXR0ZXJhbmNlKHJlc3VsdC5yZW5kZXJpbmdSZXN1bHQubWVzc2FnZSk7XG4gICAgICAgIHV0dGVyYW5jZS5yYXRlID0gMS41O1xuICAgICAgICBsZXQgbXlUaGlzID0gdGhpcztcbiAgICAgICAgdXR0ZXJhbmNlLmFkZEV2ZW50TGlzdGVuZXIoXCJlbmRcIiwgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAobXlUaGlzLmlzU3RyZWFtaW5nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0ZU5leHQoJ2l0ZW0nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHNwZWVjaFN5bnRoZXNpcy5jYW5jZWwoKTtcbiAgICAgICAgc3BlZWNoU3ludGhlc2lzLnNwZWFrKHV0dGVyYW5jZSk7XG4gICAgfVxuICAgIFxuICAgIC8qKlxuICAgICAqIFN0b3Agc3BlZWNoIG91dHB1dFxuICAgICAqL1xuICAgIHByaXZhdGUgc3RvcFNwZWVjaCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pc1N0cmVhbWluZyA9IGZhbHNlO1xuICAgICAgICAvLyBDYW5jZWwgYW55IGFjdGl2ZSBzcGVlY2ggc3ludGhlc2lzXG4gICAgICAgIHNwZWVjaFN5bnRoZXNpcy5jYW5jZWwoKTtcbiAgICB9XG4gICAgXG4gICAgLyoqXG4gICAgICogU2V0IHVwIG11dGF0aW9uIHRyYWNraW5nXG4gICAgICovXG4gICAgcHJpdmF0ZSBzZXR1cE11dGF0aW9uVHJhY2tpbmcoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKG11dGF0aW9ucykgPT4ge1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2codGhpcy5pc1Nob3dpbmdBbGwsIG11dGF0aW9ucy5sZW5ndGgpO1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNTaG93aW5nQWxsKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3V0c2lkZU92ZXJsYXkgPSBtdXRhdGlvbnMuZmlsdGVyKG11dGF0aW9uID0+IG11dGF0aW9uLnRhcmdldC5ub2RlVHlwZSA9PT0gMSBcbiAgICAgICAgICAgICAgICAgICAgJiYgIShtdXRhdGlvbi50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoXCIuaWJtYS1zci1vdmVybGF5XCIpKVxuICAgICAgICAgICAgICAgIGlmIChvdXRzaWRlT3ZlcmxheS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiTXV0YXRpb25zXCIsb3V0c2lkZU92ZXJsYXkpO1xuICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBteVRoaXMgPSB0aGlzO1xuICAgICAgICAgICAgICAgICAgICBteVRoaXMuc2hvd0FsbCgpO1xuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG15VGhpcy5zaG93QWxsKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5vYnNlcnZlKHRoaXMudmlld2VyRG9jLmRvY3VtZW50RWxlbWVudCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRMaXN0OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnRyZWU6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIH0sIDEwMDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIG9ic2VydmVyLm9ic2VydmUodGhpcy52aWV3ZXJEb2MuZG9jdW1lbnRFbGVtZW50LCB7XG4gICAgICAgICAgICBhdHRyaWJ1dGVzOiB0cnVlLFxuICAgICAgICAgICAgY2hpbGRMaXN0OiB0cnVlLFxuICAgICAgICAgICAgc3VidHJlZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdXAgZm9jdXMgdHJhY2tpbmcgdG8gdXBkYXRlIHRoZSBwb2ludCBvZiByZWdhcmQgd2hlbiBmb2N1cyBjaGFuZ2VzXG4gICAgICovXG4gICAgcHJpdmF0ZSBzZXR1cEZvY3VzVHJhY2tpbmcoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZm9jdXNIYW5kbGVyID0gKGU6IEZvY3VzRXZlbnQpID0+IHtcbiAgICAgICAgICAgIC8vIFNraXAgaWYgdGhlIGZvY3VzIGlzIG9uIHRoZSBvdmVybGF5IGl0c2VsZlxuICAgICAgICAgICAgaWYgKGUudGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBlLnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vdmVybGF5ICYmIHRhcmdldC5jbG9zZXN0KCcuaWJtYS1zci1vdmVybGF5JykpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zb2xlLmdyb3VwKFwiZm9jdXNIYW5kbGVyXCIpO1xuICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgcG9pbnQgb2YgcmVnYXJkIHRvIHRoZSBuZXdseSBmb2N1c2VkIGVsZW1lbnRcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmNvbnRyb2xsZXIuc2V0UG9pbnRPZlJlZ2FyZCh0YXJnZXQpO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIEFubm91bmNlIHRoZSBmb2N1cyBjaGFuZ2VcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vdmVybGF5LmRpc3BsYXlSZXN1bHQocmVzdWx0LCAnZm9jdXMnLCAnZm9jdXMnKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zcGVha1Jlc3VsdChyZXN1bHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zb2xlLmdyb3VwRW5kKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIFxuICAgICAgICAvLyBBZGQgdGhlIGZvY3VzIGV2ZW50IGxpc3RlbmVyIHRvIHRoZSBkb2N1bWVudFxuICAgICAgICB0aGlzLnZpZXdlckRvYy5hZGRFdmVudExpc3RlbmVyKCdmb2N1c2luJywgdGhpcy5mb2N1c0hhbmRsZXIpO1xuICAgIH1cbiAgICBcbiAgICAvKipcbiAgICAgKiBBY3RpdmF0ZSAoY2xpY2spIHRoZSBlbGVtZW50IGF0IHRoZSBjdXJyZW50IHBvaW50IG9mIHJlZ2FyZFxuICAgICAqL1xuICAgIHByaXZhdGUgYWN0aXZhdGVDdXJyZW50RWxlbWVudCgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY3VycmVudEVsZW1lbnQgPSB0aGlzLmNvbnRyb2xsZXIuZ2V0UG9pbnRPZlJlZ2FyZCgpLmdldEVsZW1lbnQoKTtcbiAgICAgICAgXG4gICAgICAgIGlmIChjdXJyZW50RWxlbWVudCkge1xuICAgICAgICAgICAgLy8gQW5ub3VuY2UgdGhhdCB3ZSdyZSBhY3RpdmF0aW5nIHRoZSBlbGVtZW50XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICAgICAgICByZW5kZXJpbmdSZXN1bHQ6IHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYEFjdGl2YXRpbmc6ICR7Y3VycmVudEVsZW1lbnQudGV4dENvbnRlbnQgfHwgY3VycmVudEVsZW1lbnQubm9kZU5hbWV9YCxcbiAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IHRoaXMuY29udHJvbGxlci5nZXRQb2ludE9mUmVnYXJkKCksXG4gICAgICAgICAgICAgICAgICAgIGVuZDogdGhpcy5jb250cm9sbGVyLmdldFBvaW50T2ZSZWdhcmQoKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLm92ZXJsYXkuZGlzcGxheVJlc3VsdChyZXN1bHQsICdmb2N1cycsICdmb2N1cycpO1xuICAgICAgICAgICAgdGhpcy5zcGVha1Jlc3VsdChyZXN1bHQpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBGb2N1cyB0aGUgZWxlbWVudCBmaXJzdFxuICAgICAgICAgICAgaWYgKGN1cnJlbnRFbGVtZW50LmZvY3VzKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudEVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gU2ltdWxhdGUgYSBjbGljayBvbiB0aGUgZWxlbWVudFxuICAgICAgICAgICAgY3VycmVudEVsZW1lbnQuY2xpY2soKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgY29udHJvbGxlciBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIFRoZSBTUkNvbnRyb2xsZXIgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Q29udHJvbGxlcigpOiBTUkNvbnRyb2xsZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250cm9sbGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc3Ryb3kgdGhlIHZpZXdlciBhbmQgY2xlYW4gdXAgcmVzb3VyY2VzXG4gICAgICovXG4gICAgcHVibGljIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIC8vIFJlbW92ZSBldmVudCBsaXN0ZW5lcnNcbiAgICAgICAgdGhpcy52aWV3ZXJEb2MucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMua2V5Ym9hcmRIYW5kbGVyKTtcbiAgICAgICAgdGhpcy52aWV3ZXJEb2MucmVtb3ZlRXZlbnRMaXN0ZW5lcignZm9jdXNpbicsIHRoaXMuZm9jdXNIYW5kbGVyKTtcbiAgICAgICAgXG4gICAgICAgIC8vIFN0b3AgYW55IGFjdGl2ZSBzcGVlY2hcbiAgICAgICAgdGhpcy5zdG9wU3BlZWNoKCk7XG4gICAgICAgIFxuICAgICAgICAvLyBEZXN0cm95IG92ZXJsYXlcbiAgICAgICAgdGhpcy5vdmVybGF5LmRlc3Ryb3koKTtcbiAgICB9XG59IiwiaW1wb3J0IHsgU1JDdXJzb3IgfSBmcm9tIFwiLi4vU1JDdXJzb3JcIjtcbmltcG9ydCB7IFNSUmVuZGVyZXJSdWxlIH0gZnJvbSBcIi4uL1NSUmVuZGVyZXJSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi8uLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBBUklBRGVmaW5pdGlvbnMgfSBmcm9tIFwiLi4vLi4vLi4vdjIvYXJpYS9BUklBRGVmaW5pdGlvbnNcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgTmF2aWdhdGlvbk1vZGUgfSBmcm9tIFwiLi4vU1JUeXBlc1wiO1xuXG4vKipcbiAqIFByb3ZpZGUgdGhlIG5hbWUsIHN1cnJvdW5kZWQgYnkgdGhlIHF1b3RlQ2hhckJlZm9yZSBhbmQgcXVvdGVDaGFyQWZ0ZXIgYW5kIGZvbGxvd2VkIGJ5IHRoZSBwYWRkaW5nIGlmIHRoZSBuYW1lIGV4aXN0c1xuICogQHBhcmFtIGN1cnNvciBUaGUgY3Vyc29yIGZvciB3aGljaCB0byBmZXRjaCB0aGUgbmFtZVxuICogQHBhcmFtIHBhZGRpbmcgU3RyaW5nIHRvIGFkZCBhZnRlciwgaWYgdGhlIG5hbWUgZXhpc3RzXG4gKiBAcGFyYW0gcXVvdGVDaGFyQmVmb3JlIFRoZSBzdHJpbmcgdG8gdXNlIGFzIHRoZSBsZWFkaW5nIHF1b3RlLCBpZiB0aGUgbmFtZSBleGlzdHNcbiAqIEBwYXJhbSBxdW90ZUNoYXJCZWZvcmUgVGhlIHN0cmluZyB0byB1c2UgYXMgdGhlIHRyYWlsaW5nIHF1b3RlLCBpZiB0aGUgbmFtZSBleGlzdHNcbiAqIEByZXR1cm5zIFxuICovXG5leHBvcnQgZnVuY3Rpb24gcXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yOiBTUkN1cnNvciwgcGFkZGluZz86IHN0cmluZywgcXVvdGVDaGFyQmVmb3JlPzogc3RyaW5nLCBxdW90ZUNoYXJBZnRlcj86IHN0cmluZykge1xuICAgIHJldHVybiBjdXJzb3IuZ2V0TmFtZSgpIFxuICAgICAgICA/IGAke3F1b3RlTmFtZShjdXJzb3IpfSR7cGFkZGluZyB8fCBcIiwgXCJ9YFxuICAgICAgICA6IFwiXCI7XG59XG5cbi8qKlxuICogUHJvdmlkZSB0aGUgbmFtZSwgc3Vycm91bmRlZCBieSBxdW90ZXMgYW5kIHByZWNlZGVkIGJ5IHRoZSBwYWRkaW5nIGlmIHRoZSBuYW1lIGV4aXN0c1xuICogQHBhcmFtIGN1cnNvciBUaGUgY3Vyc29yIGZvciB3aGljaCB0byBmZXRjaCB0aGUgbmFtZVxuICogQHBhcmFtIHBhZGRpbmcgU3RyaW5nIHRvIGFkZCBiZWZvcmUsIGlmIHRoZSBuYW1lIGV4aXN0cyAoZGVmYXVsdHMgdG8gXCIsIFwiKVxuICogQHJldHVybnMgVGhlIHF1b3RlZCBuYW1lIHdpdGggbGVhZGluZyBwYWRkaW5nLCBvciBlbXB0eSBzdHJpbmcgaWYgbm8gbmFtZSBleGlzdHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHF1b3RlTmFtZVBhZEJlZm9yZShjdXJzb3I6IFNSQ3Vyc29yLCBwYWRkaW5nPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGN1cnNvci5nZXROYW1lKClcbiAgICAgICAgPyBgJHtwYWRkaW5nIHx8IFwiLCBcIn0ke3F1b3RlTmFtZShjdXJzb3IpfWBcbiAgICAgICAgOiBcIlwiO1xufVxuXG4vKipcbiAqIFByb3ZpZGUgdGhlIG5hbWUgc3Vycm91bmRlZCBieSBxdW90ZSBjaGFyYWN0ZXJzXG4gKiBAcGFyYW0gY3Vyc29yIFRoZSBjdXJzb3IgZm9yIHdoaWNoIHRvIGZldGNoIHRoZSBuYW1lXG4gKiBAcGFyYW0gcXVvdGVDaGFyQmVmb3JlIFRoZSBzdHJpbmcgdG8gdXNlIGFzIHRoZSBsZWFkaW5nIHF1b3RlIChkZWZhdWx0cyB0byBcIilcbiAqIEBwYXJhbSBxdW90ZUNoYXJBZnRlciBUaGUgc3RyaW5nIHRvIHVzZSBhcyB0aGUgdHJhaWxpbmcgcXVvdGUgKGRlZmF1bHRzIHRvIFwiKVxuICogQHJldHVybnMgVGhlIHF1b3RlZCBuYW1lLCBvciBlbXB0eSBzdHJpbmcgaWYgbm8gbmFtZSBleGlzdHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHF1b3RlTmFtZShjdXJzb3I6IFNSQ3Vyc29yLCBxdW90ZUNoYXJCZWZvcmU/OiBzdHJpbmcsIHF1b3RlQ2hhckFmdGVyPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGN1cnNvci5nZXROYW1lKClcbiAgICAgICAgPyBgJHtxdW90ZUNoYXJCZWZvcmUgfHwgJ1wiJ30ke2N1cnNvci5nZXROYW1lKCl9JHtxdW90ZUNoYXJBZnRlciB8fCAnXCInfWBcbiAgICAgICAgOiBcIlwiO1xufVxuXG4vKipcbiAqIEdldCB0aGUgcm9sZSBkZXNjcmlwdGlvbiBmb3IgYW4gZWxlbWVudCwgdXNpbmcgYXJpYS1yb2xlZGVzY3JpcHRpb24gaWYgcHJlc2VudFxuICogRmFsbHMgYmFjayB0byB0aGUgcHJvdmlkZWQgZGVmYXVsdCByb2xlIG5hbWUgaWYgYXJpYS1yb2xlZGVzY3JpcHRpb24gaXMgbm90IHNwZWNpZmllZCBvciBlbXB0eVxuICogQHBhcmFtIGN1cnNvciBUaGUgY3Vyc29yIHBvc2l0aW9uZWQgYXQgdGhlIGVsZW1lbnRcbiAqIEBwYXJhbSBkZWZhdWx0Um9sZSBUaGUgZGVmYXVsdCByb2xlIG5hbWUgdG8gdXNlIGlmIGFyaWEtcm9sZWRlc2NyaXB0aW9uIGlzIG5vdCBwcmVzZW50XG4gKiBAcmV0dXJucyBUaGUgcm9sZSBkZXNjcmlwdGlvbiAoZWl0aGVyIGN1c3RvbSBvciBkZWZhdWx0KVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Um9sZURlc2NyaXB0aW9uKGN1cnNvcjogU1JDdXJzb3IsIGRlZmF1bHRSb2xlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGVsZW0gPSBjdXJzb3IuZ2V0RWxlbWVudCgpO1xuICAgIGlmICghZWxlbSkgcmV0dXJuIGRlZmF1bHRSb2xlO1xuICAgIFxuICAgIGNvbnN0IHJvbGVEZXNjcmlwdGlvbiA9IGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1yb2xlZGVzY3JpcHRpb25cIik7XG4gICAgaWYgKHJvbGVEZXNjcmlwdGlvbiAmJiByb2xlRGVzY3JpcHRpb24udHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIHJvbGVEZXNjcmlwdGlvbi50cmltKCk7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBkZWZhdWx0Um9sZTtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZSB0aGUgc2NyZWVuIHJlYWRlciBhbm5vdW5jZW1lbnQgZm9yIGEgbGluayBlbGVtZW50XG4gKiBEaXN0aW5ndWlzaGVzIGJldHdlZW4gc2FtZS1wYWdlIGxpbmtzIChhbmNob3JzKSBhbmQgcmVndWxhciBsaW5rc1xuICogQHBhcmFtIGN1cnNvciBUaGUgY3Vyc29yIHBvc2l0aW9uZWQgYXQgdGhlIGxpbmsgZWxlbWVudFxuICogQHBhcmFtIG1vZGUgVGhlIG5hdmlnYXRpb24gbW9kZSAoYWZmZWN0cyBhbm5vdW5jZW1lbnQgb3JkZXIpXG4gKiBAcmV0dXJucyBUaGUgZm9ybWF0dGVkIGxpbmsgYW5ub3VuY2VtZW50IHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGlua0Fubm91bmNlbWVudChjdXJzb3I6IFNSQ3Vyc29yLCBtb2RlPzogTmF2aWdhdGlvbk1vZGUpOiBzdHJpbmcge1xuICAgIGxldCBocmVmOiBzdHJpbmcgPSAoKGN1cnNvci5nZXROb2RlKCkgYXMgYW55KS5ocmVmKSB8fCBcIlwiO1xuICAgIGxldCBhbm5vdW5jZVN0ciA9IFwiXCI7XG4gICAgaWYgKGhyZWYuc3RhcnRzV2l0aChkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSAmJiBocmVmLmNoYXJBdChkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmxlbmd0aCkgPT09IFwiI1wiKSB7XG4gICAgICAgIGFubm91bmNlU3RyID0gYHNhbWUgcGFnZSBsaW5rYDtcbiAgICB9IGVsc2Uge1xuICAgICAgICBhbm5vdW5jZVN0ciA9IGBsaW5rYDtcbiAgICB9XG4gICAgbGV0IG5hbWVJbmZvID0gY3Vyc29yLmdldE5hbWVJbmZvKCk7XG4gICAgaWYgKG5hbWVJbmZvICYmICFbXCJjb250ZW50XCIsIFwidGV4dFwiXS5pbmNsdWRlcyhuYW1lSW5mby5uYW1lRnJvbSkpIHtcbiAgICAgICAgaWYgKG1vZGUgPT09IFwidGFiX2ZvY3VzXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX0ke2Fubm91bmNlU3RyfV1gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGBbJHthbm5vdW5jZVN0cn0ke3F1b3RlTmFtZVBhZEJlZm9yZShjdXJzb3IpfV1gO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBgWyR7YW5ub3VuY2VTdHJ9XWA7XG59XG5cbi8qKlxuICogR2V0IHRoZSBkZXNjcmlwdGlvbiB0ZXh0IGZyb20gYXJpYS1kZXNjcmliZWRieSByZWZlcmVuY2VzXG4gKiBSZXNvbHZlcyBhbGwgSURzIGluIGFyaWEtZGVzY3JpYmVkYnkgYW5kIGNvbmNhdGVuYXRlcyB0aGVpciB0ZXh0IGNvbnRlbnRcbiAqIEBwYXJhbSBlbGVtIFRoZSBlbGVtZW50IHdpdGggYXJpYS1kZXNjcmliZWRieSBhdHRyaWJ1dGVcbiAqIEBwYXJhbSBtb2RlIFRoZSBuYXZpZ2F0aW9uIG1vZGUgKHJldHVybnMgZW1wdHkgc3RyaW5nIGluIFwiaXRlbVwiIG1vZGUpXG4gKiBAcmV0dXJucyBUaGUgZm9ybWF0dGVkIGRlc2NyaXB0aW9uIHRleHQgd2l0aCBsZWFkaW5nIGNvbW1hIGFuZCBxdW90ZXMsIG9yIGVtcHR5IHN0cmluZ1xuICovXG5mdW5jdGlvbiBnZXREZXNjcmliZWRCeUFubm91bmNlbWVudHMoZWxlbTogSFRNTEVsZW1lbnQsIG1vZGU/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRlc2NyaWJlZEJ5ID0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWRlc2NyaWJlZGJ5XCIpO1xuICAgIGlmICghZGVzY3JpYmVkQnkpIHJldHVybiBcIlwiO1xuICAgIGNvbnN0IGRlc2NyaXB0aW9uRWxlbXMgPSBkZXNjcmliZWRCeVxuICAgICAgICAuc3BsaXQoL1xccysvKVxuICAgICAgICAubWFwKGlkID0+IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKSlcbiAgICAgICAgLmZpbHRlcihkZXNjRWxlbSA9PiAhIWRlc2NFbGVtKSBhcyBIVE1MRWxlbWVudFtdO1xuXG4gICAgY29uc3QgZGVzY3JpcHRpb25UZXh0ID0gZGVzY3JpcHRpb25FbGVtc1xuICAgICAgICAubWFwKGRlc2NFbGVtID0+IGRlc2NFbGVtLnRleHRDb250ZW50Py50cmltKCkpXG4gICAgICAgIC5maWx0ZXIodGV4dCA9PiAhIXRleHQpXG4gICAgICAgIC5qb2luKFwiIFwiKTtcblxuICAgIGlmICghZGVzY3JpcHRpb25UZXh0IHx8IGRlc2NyaXB0aW9uVGV4dC5sZW5ndGggPT09IDApIHJldHVybiBcIlwiO1xuICAgIGlmIChtb2RlID09PSBcIml0ZW1cIikgcmV0dXJuIGAsIFxcdTAwMDEke2Rlc2NyaXB0aW9uVGV4dH1cXHUwMDAyYDtcbiAgICByZXR1cm4gYCwgXCIke2Rlc2NyaXB0aW9uVGV4dH1cImA7XG59XG5cbi8qKlxuICogR2V0IHN0YXRlIGFubm91bmNlbWVudHMgZm9yIGRpc2FibGVkLCByZWFkb25seSwgcmVxdWlyZWQsIGFuZCBpbnZhbGlkIGF0dHJpYnV0ZXNcbiAqIEBwYXJhbSBlbGVtIFRoZSBlbGVtZW50IHRvIGNoZWNrIGZvciBzdGF0ZSBhdHRyaWJ1dGVzXG4gKiBAcmV0dXJucyBBIHN0cmluZyB3aXRoIHN0YXRlIGFubm91bmNlbWVudHMgKGUuZy4sIFwiLCBkaXNhYmxlZFwiLCBcIiwgcmVhZCBvbmx5XCIsIFwiLCByZXF1aXJlZFwiLCBcIiwgaW52YWxpZFwiKVxuICovXG5mdW5jdGlvbiBnZXRTdGF0ZUFubm91bmNlbWVudHMoZWxlbTogSFRNTEVsZW1lbnQpOiBzdHJpbmcge1xuICAgIGxldCBzdGF0ZXMgPSBcIlwiO1xuICAgIFxuICAgIC8vIENoZWNrIGZvciBkaXNhYmxlZCBzdGF0ZSAoYm90aCBhdHRyaWJ1dGUgYW5kIGFyaWEtZGlzYWJsZWQpXG4gICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwiZGlzYWJsZWRcIikgfHwgZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWRpc2FibGVkXCIpID09PSBcInRydWVcIikge1xuICAgICAgICBzdGF0ZXMgKz0gXCIsIGRpc2FibGVkXCI7XG4gICAgfVxuICAgIFxuICAgIC8vIENoZWNrIGZvciByZWFkb25seSBzdGF0ZSAoYm90aCBhdHRyaWJ1dGUgYW5kIGFyaWEtcmVhZG9ubHkpXG4gICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwicmVhZG9ubHlcIikgfHwgZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLXJlYWRvbmx5XCIpID09PSBcInRydWVcIikge1xuICAgICAgICBzdGF0ZXMgKz0gXCIsIHJlYWQgb25seVwiO1xuICAgIH1cbiAgICBcbiAgICAvLyBDaGVjayBmb3IgcmVxdWlyZWQgc3RhdGUgKGJvdGggYXR0cmlidXRlIGFuZCBhcmlhLXJlcXVpcmVkKVxuICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcInJlcXVpcmVkXCIpIHx8IGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1yZXF1aXJlZFwiKSA9PT0gXCJ0cnVlXCIpIHtcbiAgICAgICAgc3RhdGVzICs9IFwiLCByZXF1aXJlZFwiO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciBpbnZhbGlkIHN0YXRlIChhcmlhLWludmFsaWQpXG4gICAgaWYgKGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1pbnZhbGlkXCIpID09PSBcInRydWVcIikge1xuICAgICAgICBzdGF0ZXMgKz0gXCIsIGludmFsaWRcIjtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHN0YXRlcztcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhIGxpc3RpdGVtIGNvbnRhaW5zIGludGVyYWN0aXZlL3dpZGdldCBlbGVtZW50c1xuICogU2NyZWVuIHJlYWRlcnMgdHlwaWNhbGx5IGRvbid0IHJlYWQgdGhlIGFjY2Vzc2libGUgbmFtZSBvZiBhIGxpc3RpdGVtIHdoZW4gaXQgY29udGFpbnMgaW50ZXJhY3RpdmUgZWxlbWVudHNcbiAqIFVzZXMgRE9NV2Fsa2VyIHRvIHByb3Blcmx5IHRyYXZlcnNlIHNoYWRvdyBET00gYW5kIG90aGVyIGNvbXBsZXggc3RydWN0dXJlc1xuICovXG5mdW5jdGlvbiBsaXN0aXRlbUNvbnRhaW5zSW50ZXJhY3RpdmVFbGVtZW50KGN1cnNvcjogU1JDdXJzb3IpOiBib29sZWFuIHtcbiAgICBjb25zdCBlbGVtID0gY3Vyc29yLmdldEVsZW1lbnQoKTtcbiAgICBpZiAoIWVsZW0pIHJldHVybiBmYWxzZTtcbiAgICBcbiAgICAvLyBVc2UgRE9NV2Fsa2VyIHRvIHRyYXZlcnNlIHRoZSBlbnRpcmUgc3VidHJlZSBpbmNsdWRpbmcgc2hhZG93IERPTVxuICAgIGNvbnN0IHdhbGtlciA9IG5ldyBET01XYWxrZXIoZWxlbSwgZmFsc2UsIGVsZW0sIGZhbHNlKTtcbiAgICBcbiAgICAvLyBXYWxrIHRocm91Z2ggYWxsIGRlc2NlbmRhbnRzXG4gICAgd2hpbGUgKHdhbGtlci5uZXh0Tm9kZSgpKSB7XG4gICAgICAgIC8vIE9ubHkgY2hlY2sgZWxlbWVudCBub2RlcyBhdCBzdGFydCB0YWdzXG4gICAgICAgIGlmICh3YWxrZXIubm9kZS5ub2RlVHlwZSA9PT0gMSAmJiAhd2Fsa2VyLmJFbmRUYWcpIHtcbiAgICAgICAgICAgIGNvbnN0IHJvbGUgPSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUod2Fsa2VyLm5vZGUgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICAgICAgaWYgKHJvbGUgJiYgQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVdICYmIEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlXS5yb2xlVHlwZSA9PT0gJ3dpZGdldCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgYW4gaWZyYW1lJ3MgY29udGVudCBjYW4gYmUgYWNjZXNzZWQgKG5vdCBjcm9zcy1vcmlnaW4pXG4gKiBBdHRlbXB0cyB0byBhY2Nlc3MgdGhlIGlmcmFtZSdzIGRvY3VtZW50IHRvIGRldGVybWluZSBpZiBpdCdzIGFjY2Vzc2libGVcbiAqIEBwYXJhbSBpZnJhbWUgVGhlIGlmcmFtZSBlbGVtZW50IHRvIGNoZWNrXG4gKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBpZnJhbWUgY29udGVudCBpcyBhY2Nlc3NpYmxlLCBmYWxzZSBpZiBjcm9zcy1vcmlnaW4gb3IgYmxvY2tlZFxuICovXG5mdW5jdGlvbiBjYW5BY2Nlc3NGcmFtZShpZnJhbWUpIHtcbiAgICB0cnkge1xuICAgICAgICAvLyBUaGlzIHRocm93cyBhIERPTUV4Y2VwdGlvbiBmb3IgY3Jvc3Mtb3JpZ2luIGZyYW1lc1xuICAgICAgICBjb25zdCBkb2MgPSBpZnJhbWUuY29udGVudERvY3VtZW50IHx8IGlmcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50O1xuICAgICAgICByZXR1cm4gZG9jICE9PSBudWxsO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAvLyBpZiAoZSBpbnN0YW5jZW9mIERPTUV4Y2VwdGlvbiAmJiBlLm5hbWUgPT09ICdTZWN1cml0eUVycm9yJykge1xuICAgICAgICAvLyAgICAgcmV0dXJuIGZhbHNlOyAvLyBDcm9zcy1vcmlnaW4sIGFjY2VzcyBibG9ja2VkXG4gICAgICAgIC8vIH1cbiAgICAgICAgLy8gdGhyb3cgZTsgLy8gUmUtdGhyb3cgdW5leHBlY3RlZCBlcnJvcnNcbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBSVUxFUzogU1JSZW5kZXJlclJ1bGVbXSA9IFtcbiAgICAvLyBTaW5nbGUgcm9sZSBydWxlcyAtIGFscGhhYmV0aWNhbGx5IHNvcnRlZFxuICAgIFxuICAgIC8vIEJ1dHRvbiByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImJ1dHRvblwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcImJ1dHRvblwiLCBcInRhYl9mb2N1c1wiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yLCBfb2xkQ3Vyc29yPzogU1JDdXJzb3IsIG1vZGU/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWN1cnNvci5pc1N0YXJ0VGFnKCkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW0gPSBjdXJzb3IuZ2V0Tm9kZSgpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvbGVEZXNjID0gZ2V0Um9sZURlc2NyaXB0aW9uKGN1cnNvciwgXCJidXR0b25cIik7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1wcmVzc2VkXCIpID09PSBcInRydWVcIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFt0b2dnbGUgJHtyb2xlRGVzY30sIHByZXNzZWQke3F1b3RlTmFtZVBhZEJlZm9yZShjdXJzb3IpfSR7Z2V0RGVzY3JpYmVkQnlBbm5vdW5jZW1lbnRzKGVsZW0sIG1vZGUpfV1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvciwgX29sZEN1cnNvcj86IFNSQ3Vyc29yLCBtb2RlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFjdXJzb3IuaXNTdGFydFRhZygpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtID0gY3Vyc29yLmdldE5vZGUoKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICBjb25zdCByb2xlRGVzYyA9IGdldFJvbGVEZXNjcmlwdGlvbihjdXJzb3IsIFwiYnV0dG9uXCIpO1xuICAgICAgICAgICAgICAgIGlmIChlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtcHJlc3NlZFwiKSA9PT0gXCJmYWxzZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgW3RvZ2dsZSAke3JvbGVEZXNjfSwgbm90IHByZXNzZWQke3F1b3RlTmFtZVBhZEJlZm9yZShjdXJzb3IpfSR7Z2V0RGVzY3JpYmVkQnlBbm5vdW5jZW1lbnRzKGVsZW0sIG1vZGUpfV1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvciwgX29sZEN1cnNvcj86IFNSQ3Vyc29yLCBtb2RlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5pc0VuZFRhZygpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGxldCBleHBhbmRTdHIgPSBcIlwiO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW0gPSBjdXJzb3IuZ2V0RWxlbWVudCgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvbGVEZXNjID0gZ2V0Um9sZURlc2NyaXB0aW9uKGN1cnNvciwgXCJidXR0b25cIik7XG4gICAgICAgICAgICAgICAgaWYgKFtcIm1lbnVcIiwgXCJ0cnVlXCJdLmluY2x1ZGVzKGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1oYXNwb3B1cFwiKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZXhwYW5kU3RyICs9IFwiLCBtZW51XCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcImFyaWEtZXhwYW5kZWRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgZXhwYW5kU3RyICs9IGAsICR7ZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWV4cGFuZGVkXCIpID09PSBcInRydWVcIiA/IFwiZXhwYW5kZWRcIiA6IFwiY29sbGFwc2VkXCJ9YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZXhwYW5kU3RyICs9IGdldFN0YXRlQW5ub3VuY2VtZW50cyhlbGVtKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYFske3F1b3RlTmFtZVBhZEFmdGVyKGN1cnNvcil9JHtyb2xlRGVzY30ke2V4cGFuZFN0cn0ke2dldERlc2NyaWJlZEJ5QW5ub3VuY2VtZW50cyhlbGVtLCBtb2RlKX1dYDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4geyBpZiAoY3Vyc29yLmlzRW5kVGFnKCkpIHJldHVybiBcIlwiOyB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIENoZWNrYm94IHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiY2hlY2tib3hcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJjaGVja2JveFwiLCBcInRhYl9mb2N1c1wiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yLCBfb2xkQ3Vyc29yPzogU1JDdXJzb3IsIG1vZGU/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmlzU3RhcnRUYWcoKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGVtID0gY3Vyc29yLmdldE5vZGUoKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByb2xlRGVzYyA9IGdldFJvbGVEZXNjcmlwdGlvbihjdXJzb3IsIFwiY2hlY2tib3hcIik7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzdGF0ZVN0ciA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtY2hlY2tlZFwiKSA9PT0gXCJtaXhlZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZVN0ciA9IFwiaGFsZiBjaGVja2VkXCI7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgYkNoZWNrZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcImFyaWEtY2hlY2tlZFwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJDaGVja2VkID0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWNoZWNrZWRcIikgPT09IFwidHJ1ZVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQ2hlY2tlZCA9IGVsZW0uY2hlY2tlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlU3RyID0gYkNoZWNrZWQgPyBcImNoZWNrZWRcIiA6IFwibm90IGNoZWNrZWRcIjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBzdGF0ZVN0ciArPSBnZXRTdGF0ZUFubm91bmNlbWVudHMoY3Vyc29yLmdldEVsZW1lbnQoKSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cm9sZURlc2N9LCAke3N0YXRlU3RyfSR7cXVvdGVOYW1lUGFkQmVmb3JlKGN1cnNvcil9JHtnZXREZXNjcmliZWRCeUFubm91bmNlbWVudHMoY3Vyc29yLmdldEVsZW1lbnQoKSwgbW9kZSl9XWBcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIENlbGwsIENvbHVtbmhlYWRlciwgYW5kIFJvd2hlYWRlciByb2xlc1xuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJjZWxsXCIsIFwiY29sdW1uaGVhZGVyXCIsIFwicm93aGVhZGVyXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwidGFibGVcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghY3Vyc29yLmlzU3RhcnRUYWcoKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBjZWxsIGVsZW1lbnRcbiAgICAgICAgICAgICAgICBjb25zdCBjZWxsRWxlbSA9IGN1cnNvci5nZXRFbGVtZW50KCk7XG4gICAgICAgICAgICAgICAgaWYgKCFjZWxsRWxlbSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGNlbGwgaGFzIGFueSB2aXNpYmxlIGNvbnRlbnQgYnkgY2hlY2tpbmc6XG4gICAgICAgICAgICAgICAgLy8gMS4gVGV4dCBjb250ZW50ICh0cmltbWVkKVxuICAgICAgICAgICAgICAgIC8vIDIuIENoaWxkIGVsZW1lbnRzIHdpdGggcm9sZXMgKGJ1dHRvbnMsIGxpbmtzLCBldGMuKVxuICAgICAgICAgICAgICAgIC8vIDMuIEltYWdlcyB3aXRoIGFsdCB0ZXh0XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgY29uc3QgdGV4dENvbnRlbnQgPSBjZWxsRWxlbS50ZXh0Q29udGVudD8udHJpbSgpIHx8IFwiXCI7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGNoaWxkIGVsZW1lbnRzIHdpdGggaW50ZXJhY3RpdmUgcm9sZXMgb3IgY29udGVudFxuICAgICAgICAgICAgICAgIGNvbnN0IHdhbGtlciA9IG5ldyBET01XYWxrZXIoY2VsbEVsZW0sIGZhbHNlLCBjZWxsRWxlbSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIGxldCBoYXNDb250ZW50ID0gdGV4dENvbnRlbnQubGVuZ3RoID4gMDtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBpZiAoIWhhc0NvbnRlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGVsZW1lbnRzIHRoYXQgd291bGQgaGF2ZSBjb250ZW50IChidXR0b25zLCBsaW5rcywgaW1hZ2VzLCBldGMuKVxuICAgICAgICAgICAgICAgICAgICB3aGlsZSAod2Fsa2VyLm5leHROb2RlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3YWxrZXIubm9kZS5ub2RlVHlwZSA9PT0gMSAmJiAhd2Fsa2VyLmJFbmRUYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGVtID0gd2Fsa2VyLm5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgcm9sZSA9IEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZShlbGVtKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgaW50ZXJhY3RpdmUgZWxlbWVudHMgb3IgZWxlbWVudHMgd2l0aCBhY2Nlc3NpYmxlIG5hbWVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvbGUgJiYgQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0NvbnRlbnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGltYWdlcyB3aXRoIGFsdCB0ZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW0ubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJJTUdcIiAmJiBlbGVtLmhhc0F0dHJpYnV0ZShcImFsdFwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNDb250ZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIElmIHRoZSBjZWxsIGlzIGVtcHR5LCByZXR1cm4gXCJbYmxhbmtdXCJcbiAgICAgICAgICAgICAgICBpZiAoIWhhc0NvbnRlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiW2JsYW5rXVwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIHJldHVybiBudWxsIHRvIGxldCBkZWZhdWx0IHJlbmRlcmluZyBjb250aW51ZVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBDb21ib2JveCByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImNvbWJvYm94XCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwiY29tYm9cIiwgXCJ0YWJfZm9jdXNcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuaXNFbmRUYWcoKSkgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm9sZURlc2MgPSBnZXRSb2xlRGVzY3JpcHRpb24oY3Vyc29yLCBcImNvbWJvIGJveFwiKTtcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtID0gY3Vyc29yLmdldEVsZW1lbnQoKTtcbiAgICAgICAgICAgICAgICBsZXQgc3RhdGUgPSBcIlwiO1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuZ2V0Tm9kZSgpLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiU0VMRUNUXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBcIiwgY29sbGFwc2VkXCI7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0RWxlbSA9IGN1cnNvci5nZXRFbGVtZW50KCkgYXMgSFRNTFNlbGVjdEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZUVsZW0gPSBzZWxlY3RFbGVtLnNlbGVjdGVkSW5kZXggPj0gMCA/IHNlbGVjdEVsZW0ub3B0aW9uc1tzZWxlY3RFbGVtLnNlbGVjdGVkSW5kZXhdIDogbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlU3RyID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlRWxlbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRlbXAgPSBuZXcgU1JDdXJzb3IodmFsdWVFbGVtLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVN0ciA9IHF1b3RlTmFtZVBhZEJlZm9yZSh0ZW1wLCBcIiwgXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlICs9IGdldFN0YXRlQW5ub3VuY2VtZW50cyhlbGVtKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBbJHtxdW90ZU5hbWVQYWRBZnRlcihjdXJzb3IpfSR7cm9sZURlc2N9JHtzdGF0ZX0ke3ZhbHVlU3RyfV1gO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3Vyc29yLmdldE5vZGUoKS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIklOUFVUXCIgJiYgIWN1cnNvci5nZXRFbGVtZW50KCkuaGFzQXR0cmlidXRlKFwicm9sZVwiKSkge1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IGdldFN0YXRlQW5ub3VuY2VtZW50cyhlbGVtKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBbJHtxdW90ZU5hbWVQYWRBZnRlcihjdXJzb3IpfSR7cm9sZURlc2N9LCBoYXMgYXV0byBjb21wbGV0ZSwgZWRpdGFibGUsIG9wZW5zIGxpc3Qke3N0YXRlfV1gO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcImFyaWEtZXhwYW5kZWRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gYCwgJHtlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtZXhwYW5kZWRcIikgPT09IFwidHJ1ZVwiID8gXCJleHBhbmRlZFwiIDogXCJjb2xsYXBzZWRcIn1gO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwiYXJpYS1hdXRvY29tcGxldGVcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSArPSBgLCBoYXMgYXV0byBjb21wbGV0ZWA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSArPSBgLCBlZGl0YWJsZSwgb3BlbnMgbGlzdGBcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBzdGF0ZSArPSBnZXRTdGF0ZUFubm91bmNlbWVudHMoZWxlbSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX0ke3JvbGVEZXNjfSR7c3RhdGV9XWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBEZWZhdWx0IHJvbGUgKGZhbGxiYWNrKVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJkZWZhdWx0XCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IGN1cnNvci5pc1N0YXJ0VGFnKCkgP1xuICAgICAgICAgICAgICAgIGAhITwke2N1cnNvci5nZXRSb2xlKCl9PiR7KGN1cnNvci5nZXROYW1lSW5mbygpPy5uYW1lICsgXCJcIil9ISFgIDpcbiAgICAgICAgICAgICAgICBgISE8LyR7Y3Vyc29yLmdldFJvbGUoKX0+ISFgXG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIERlbGV0aW9uIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiZGVsZXRpb25cIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4gKGN1cnNvci5pc1N0YXJ0VGFnKCkgJiYgYFtkZWxldGVkXWAgfHwgXCJcIilcbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gRGlhbG9nIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiZGlhbG9nXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY3Vyc29yLmlzRW5kVGFnKCkgPyBgW0VuZCBvZiBkaWFsb2ddYCA6IGBbU3RhcnQgb2YgZGlhbG9nJHtxdW90ZU5hbWVQYWRCZWZvcmUoY3Vyc29yKX1gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBEb2N1bWVudCByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImRvY3VtZW50XCIsIFwiZ2VuZXJpY1wiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgICgpID0+IFwiXCJcbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gR3JhcGhpY3MgZG9jdW1lbnQgcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJncmFwaGljcy1kb2N1bWVudFwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcImltYWdlXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmlzU3RhcnRUYWcoKSAmJiAhY3Vyc29yLmdldE5hbWVJbmZvKCk/Lm5hbWUgJiYgY3Vyc29yLmdldE5hbWVJbmZvKCk/Lm5hbWUgIT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRG9uJ3QgYW5ub3VuY2UgdW5sYWJlbGVkIGdyYXBoaWNzIHRoYXQgYXJlIGhpZGRlbiBpbnNpZGUgbGlua3Mgb3IgaGVhZGluZ3NcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyZW50SGVhZGluZ09yTGluayA9IGN1cnNvci5nZXRDdXJyZW50T3JQYXJlbnRCeVJvbGVDbG9uZShbXCJoZWFkaW5nXCIsIFwibGlua1wiXSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnRIZWFkaW5nT3JMaW5rICYmIFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKGN1cnNvci5nZXRFbGVtZW50KCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJbVW5sYWJlbGVkIGdyYXBoaWNdXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiAoY3Vyc29yLmlzU3RhcnRUYWcoKSAmJiAoY3Vyc29yLmdldE5hbWVJbmZvKCk/Lm5hbWUgPT09IFwiXCIpKSA/IFwiXCIgOiBudWxsLFxuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IChjdXJzb3IuaXNTdGFydFRhZygpICYmIGN1cnNvci5nZXROYW1lSW5mbygpPy5uYW1lICYmIGBbZ3JhcGhpYyR7cXVvdGVOYW1lUGFkQmVmb3JlKGN1cnNvcil9XWApIHx8IG51bGwsXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4gKGN1cnNvci5pc0VuZFRhZygpKSA/IFwiXCIgOiBudWxsXG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIEhlYWRpbmcgcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJoZWFkaW5nXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwidGFiX2ZvY3VzXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IsIF9vbGRDdXJzb3I6IFNSQ3Vyc29yLCBtb2RlOiBOYXZpZ2F0aW9uTW9kZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChtb2RlID09PSBcInRhYl9mb2N1c1wiICYmIGN1cnNvci5pc1N0YXJ0VGFnKCkpIHJldHVybiBcIlwiO1xuICAgICAgICAgICAgICAgIGlmIChtb2RlID09PSBcIml0ZW1cIiAmJiBjdXJzb3IuaXNFbmRUYWcoKSkgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICAgICAgbGV0IGxldmVsOiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgY29uc3Qgbm9kZSA9IGN1cnNvci5nZXRFbGVtZW50KCk7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUuYXJpYUxldmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEV4cGxpY2l0IGFyaWEtbGV2ZWwgYXR0cmlidXRlXG4gICAgICAgICAgICAgICAgICAgIGxldmVsID0gbm9kZS5hcmlhTGV2ZWw7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChub2RlLmdldEF0dHJpYnV0ZSgncm9sZScpID09PSAnaGVhZGluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gcm9sZT1cImhlYWRpbmdcIiB3aXRob3V0IGFyaWEtbGV2ZWwgZGVmYXVsdHMgdG8gMlxuICAgICAgICAgICAgICAgICAgICBsZXZlbCA9ICcyJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBOYXRpdmUgaGVhZGluZyBlbGVtZW50IChoMS1oNiksIGV4dHJhY3QgbnVtYmVyIGZyb20gdGFnIG5hbWVcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSBub2RlLm5vZGVOYW1lLnN1YnN0cmluZygxKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgbmFtZUluZm8gPSBjdXJzb3IuZ2V0TmFtZUluZm8oKTtcbiAgICAgICAgICAgICAgICBpZiAoKCFuYW1lSW5mbyB8fCBbXCJjb250ZW50XCIsIFwidGV4dFwiXS5pbmNsdWRlcyhuYW1lSW5mby5uYW1lRnJvbSkpICYmICEobm9kZS50ZXh0Q29udGVudCB8fCBcIlwiKS50cmltKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKG5hbWVJbmZvICYmICFbXCJjb250ZW50XCIsIFwidGV4dFwiXS5pbmNsdWRlcyhuYW1lSW5mby5uYW1lRnJvbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBbaGVhZGluZyBsZXZlbCAke2xldmVsfSR7cXVvdGVOYW1lUGFkQmVmb3JlKGN1cnNvcil9XWA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBbaGVhZGluZyBsZXZlbCAke2xldmVsfV1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gLS0gaW4gaGVhZGluZyBtb2RlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImhlYWRpbmdcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcImhlYWRpbmdcIiwgXCJoMVwiLCBcImgyXCIsIFwiaDNcIiwgXCJoNFwiLCBcImg1XCIsIFwiaDZcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuaXNTdGFydFRhZygpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBjdXJzb3IuZ2V0Tm9kZSgpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICBsZXQgbGV2ZWw6IHN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIGlmIChub2RlLmFyaWFMZXZlbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXhwbGljaXQgYXJpYS1sZXZlbCBhdHRyaWJ1dGVcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsID0gbm9kZS5hcmlhTGV2ZWw7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobm9kZS5nZXRBdHRyaWJ1dGUoJ3JvbGUnKSA9PT0gJ2hlYWRpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByb2xlPVwiaGVhZGluZ1wiIHdpdGhvdXQgYXJpYS1sZXZlbCBkZWZhdWx0cyB0byAyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCA9ICcyJztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5hdGl2ZSBoZWFkaW5nIGVsZW1lbnQgKGgxLWg2KSwgZXh0cmFjdCBudW1iZXIgZnJvbSB0YWcgbmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSBub2RlLm5vZGVOYW1lLnN1YnN0cmluZygxKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGxldCBuYW1lSW5mbyA9IGN1cnNvci5nZXROYW1lSW5mbygpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoKCFuYW1lSW5mbyB8fCBbXCJjb250ZW50XCIsIFwidGV4dFwiXS5pbmNsdWRlcyhuYW1lSW5mby5uYW1lRnJvbSkpICYmICEobm9kZS50ZXh0Q29udGVudCB8fCBcIlwiKS50cmltKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFske3F1b3RlTmFtZVBhZEFmdGVyKGN1cnNvcil9aGVhZGluZyBsZXZlbCAke2xldmVsfV1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gSW1hZ2Ugcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJpbWdcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJpbWFnZVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5pc0VuZFRhZygpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY3Vyc29yLmdldE5hbWVJbmZvKCk/Lm5hbWUgJiYgY3Vyc29yLmdldE5hbWVJbmZvKCk/Lm5hbWUgIT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvbid0IGFubm91bmNlIHVubGFiZWxlZCBncmFwaGljcyB0aGF0IGFyZSBoaWRkZW4gaW5zaWRlIGxpbmtzIG9yIGhlYWRpbmdzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAodGhlc2Ugd2VyZSBvbmx5IGluY2x1ZGVkIGJlY2F1c2Ugb2YgdGhlIFNLSVBfSVRFTV9CRUhBVklPUiBjaGFuZ2UpXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRIZWFkaW5nT3JMaW5rID0gY3Vyc29yLmdldEN1cnJlbnRPclBhcmVudEJ5Um9sZUNsb25lKFtcImhlYWRpbmdcIiwgXCJsaW5rXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnRIZWFkaW5nT3JMaW5rICYmIFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKGN1cnNvci5nZXRFbGVtZW50KCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJbVW5sYWJlbGVkIGdyYXBoaWNdXCJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJzb3IuZ2V0TmFtZUluZm8oKT8ubmFtZSA9PT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFtncmFwaGljJHtxdW90ZU5hbWVQYWRCZWZvcmUoY3Vyc29yKX1dYFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBJbnNlcnRpb24gcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJpbnNlcnRpb25cIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4gKGN1cnNvci5pc1N0YXJ0VGFnKCkgJiYgYFtpbnNlcnRlZF1gIHx8IFwiXCIpXG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIExpbmsgcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJsaW5rXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwicmVnaW9uXCIsIFwibGlua1wiLCBcInRhYl9mb2N1c1wiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yLCBfb2xkQ3Vyc29yOiBTUkN1cnNvciwgbW9kZTogTmF2aWdhdGlvbk1vZGUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmlzU3RhcnRUYWcoKSAmJiAhW1wiY29udGVudFwiLCBcInRleHRcIl0uaW5jbHVkZXMoY3Vyc29yLmdldE5hbWVJbmZvKCk/Lm5hbWVGcm9tKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0TGlua0Fubm91bmNlbWVudChjdXJzb3IsIG1vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gTGlzdGl0ZW0gcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJsaXN0aXRlbVwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGlzT3JkZXJlZDogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBsZXQgcGFyZW50TGlzdEVsZW06IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGxldCB3YWxrUGFyZW50cyA9IERPTVdhbGtlci5wYXJlbnROb2RlKGN1cnNvci5nZXROb2RlKCkpO1xuICAgICAgICAgICAgICAgIHdoaWxlICh0eXBlb2YgaXNPcmRlcmVkID09PSBcInVuZGVmaW5lZFwiICYmIHdhbGtQYXJlbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh3YWxrUGFyZW50cy5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWxlbSA9IHdhbGtQYXJlbnRzIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwicm9sZVwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtLmdldEF0dHJpYnV0ZShcInJvbGVcIikgPT09IFwibGlzdFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzT3JkZXJlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRMaXN0RWxlbSA9IGVsZW07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiVUxcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzT3JkZXJlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudExpc3RFbGVtID0gZWxlbTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIk9MXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc09yZGVyZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudExpc3RFbGVtID0gZWxlbTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB3YWxrUGFyZW50cyA9IERPTVdhbGtlci5wYXJlbnROb2RlKHdhbGtQYXJlbnRzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgbGlzdGl0ZW0gY29udGFpbnMgaW50ZXJhY3RpdmUgZWxlbWVudHNcbiAgICAgICAgICAgICAgICAvLyBTY3JlZW4gcmVhZGVycyBkb24ndCByZWFkIHRoZSBhY2Nlc3NpYmxlIG5hbWUgd2hlbiBpbnRlcmFjdGl2ZSBlbGVtZW50cyBhcmUgcHJlc2VudFxuICAgICAgICAgICAgICAgIGNvbnN0IGhhc0ludGVyYWN0aXZlQ29udGVudCA9IGxpc3RpdGVtQ29udGFpbnNJbnRlcmFjdGl2ZUVsZW1lbnQoY3Vyc29yKTtcbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lVG9Vc2UgPSBoYXNJbnRlcmFjdGl2ZUNvbnRlbnQgPyBcIlwiIDogKGN1cnNvci5nZXROYW1lSW5mbygpPy5uYW1lIHx8IFwiXCIpO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGxldCByZXRTdHIgPSBcIlwiO1xuICAgICAgICAgICAgICAgIGlmICghaXNPcmRlcmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsZW0gPSBjdXJzb3IuZ2V0RWxlbWVudCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoKGVsZW0ubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJMSVwiICYmIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW0pLmxpc3RTdHlsZVR5cGUgPT09IFwibm9uZVwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgfHwgZWxlbS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpICE9PSBcIkxJXCIpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldFN0ciA9IGN1cnNvci5pc1N0YXJ0VGFnKCkgPyBgJHtuYW1lVG9Vc2V9YCA6IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXRTdHIgPSBjdXJzb3IuaXNTdGFydFRhZygpID8gYFtidWxsZXRdICR7bmFtZVRvVXNlfWAgOiBcIlwiO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRm9yIG9yZGVyZWQgbGlzdHMsIGNvdW50IHNpYmxpbmcgbGlzdGl0ZW1zIGFuZCBhY2NvdW50IGZvciBzdGFydCBhdHRyaWJ1dGVcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvdW50ID0gMTsgLy8gU3RhcnQgYXQgMSBieSBkZWZhdWx0XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIHN0YXJ0IGF0dHJpYnV0ZSBpZiBpdCBleGlzdHMgb24gdGhlIDxvbD4gZWxlbWVudFxuICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50TGlzdEVsZW0gJiYgcGFyZW50TGlzdEVsZW0ubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gJ09MJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50TGlzdEVsZW0uaGFzQXR0cmlidXRlKCdzdGFydCcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFydFZhbHVlID0gcGFyc2VJbnQocGFyZW50TGlzdEVsZW0uZ2V0QXR0cmlidXRlKCdzdGFydCcpIHx8ICcxJywgMTApO1xuICAgICAgICAgICAgICAgICAgICAgICAgY291bnQgPSBpc05hTihzdGFydFZhbHVlKSA/IDEgOiBzdGFydFZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAvLyBDb3VudCBwcmV2aW91cyBzaWJsaW5nIGxpc3RpdGVtcyBhdCB0aGUgc2FtZSBsZXZlbCB1c2luZyBET01XYWxrZXJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudEVsZW0gPSBjdXJzb3IuZ2V0RWxlbWVudCgpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgc2libGluZyA9IERPTVdhbGtlci5wcmV2aW91c1NpYmxpbmdOb3RPd25lZEJ5U2xvdChjdXJyZW50RWxlbSk7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChzaWJsaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IGNvdW50IGRpcmVjdCBzaWJsaW5ncyB0aGF0IGFyZSBsaXN0aXRlbXMgKGVsZW1lbnQgbm9kZXMgb25seSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaWJsaW5nLm5vZGVUeXBlID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2libGluZ0VsZW0gPSBzaWJsaW5nIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaWJsaW5nRWxlbS5nZXRBdHRyaWJ1dGUoJ3JvbGUnKSA9PT0gJ2xpc3RpdGVtJyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWJsaW5nRWxlbS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSAnTEknKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgc2libGluZyA9IERPTVdhbGtlci5wcmV2aW91c1NpYmxpbmdOb3RPd25lZEJ5U2xvdChzaWJsaW5nKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgcmV0U3RyID0gY3Vyc29yLmlzU3RhcnRUYWcoKSA/IGAke2NvdW50fS4gJHtuYW1lVG9Vc2V9YCA6IFwiXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXRTdHI7XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIE1hdGggcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJtYXRoXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IGN1cnNvci5pc0VuZFRhZygpID8gYFttYXRoIGNvbnRlbnRdYCA6IFwiXCJcbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gTGluayByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcIm1lbnVpdGVtXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwidGFiX2ZvY3VzXCIsIFwicmVnaW9uXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgcmV0VmFsID0gXCJcIjtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmlzU3RhcnRUYWcoKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBsZXQgaXNTdWJNZW51Q29udGFpbmVyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIC8vIGZvciAobGV0IGNoZWNrQ2hpbGRyZW49Y3Vyc29yLmdldE5vZGUoKS5maXJzdENoaWxkOyAhaXNTdWJNZW51Q29udGFpbmVyICYmIGNoZWNrQ2hpbGRyZW4gIT09IG51bGw7IGNoZWNrQ2hpbGRyZW4gPSBjaGVja0NoaWxkcmVuLm5leHRTaWJsaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBpc1N1Yk1lbnVDb250YWluZXIgPSBjaGVja0NoaWxkcmVuLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiVUxcIjtcbiAgICAgICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgICAgICAvLyBpZiAoaXNTdWJNZW51Q29udGFpbmVyKSByZXR1cm4gXCJbPz8/P21lbnVdXCI7XG4gICAgICAgICAgICAgICAgICAgIGxldCBleHBhbmRTdHIgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGVtID0gY3Vyc29yLmdldEVsZW1lbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1oYXNwb3B1cFwiKSA9PT0gXCJ0cnVlXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4cGFuZFN0ciArPSBcIiwgc3ViLW1lbnVcIjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbS5oYXNBdHRyaWJ1dGUoXCJhcmlhLWV4cGFuZGVkXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBleHBhbmRTdHIgKz0gYCwgJHtlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtZXhwYW5kZWRcIikgPT09IFwidHJ1ZVwiID8gXCJleHBhbmRlZFwiIDogXCJjb2xsYXBzZWRcIn1gO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gYFttZW51JHtleHBhbmRTdHJ9YDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5hbWVJbmZvID0gY3Vyc29yLmdldE5hbWVJbmZvKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lSW5mbyAmJiAhW1wiY29udGVudFwiLCBcInRleHRcIl0uaW5jbHVkZXMobmFtZUluZm8ubmFtZUZyb20pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwgKz0gcXVvdGVOYW1lUGFkQmVmb3JlKGN1cnNvcik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsICs9IFwiXVwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBNZXRlciByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcIm1ldGVyXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwidGFiX2ZvY3VzXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IGN1cnNvci5pc1N0YXJ0VGFnKCkgPyBgW3Byb2dyZXNzIGJhciwgJHsoKGN1cnNvci5nZXROb2RlKCkgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWUpfV1gIDogXCJcIlxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBQcm9ncmVzc2JhciByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcInByb2dyZXNzYmFyXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IGN1cnNvci5pc1N0YXJ0VGFnKCkgPyBgW3Byb2dyZXNzIGJhciwgJHsoKGN1cnNvci5nZXROb2RlKCkgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWUpfV1gIDogXCJcIlxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBSYWRpbyByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcInJhZGlvXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwidGFiX2ZvY3VzXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IsIF9vbGRDdXJzb3I/OiBTUkN1cnNvciwgbW9kZT86IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuaXNTdGFydFRhZygpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJvbGVEZXNjID0gZ2V0Um9sZURlc2NyaXB0aW9uKGN1cnNvciwgXCJyYWRpbyBidXR0b25cIik7XG4gICAgICAgICAgICAgICAgICAgIGxldCBiQ2hlY2tlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmdldEVsZW1lbnQoKS5oYXNBdHRyaWJ1dGUoXCJhcmlhLWNoZWNrZWRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJDaGVja2VkID0gY3Vyc29yLmdldEVsZW1lbnQoKS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWNoZWNrZWRcIikgPT09IFwidHJ1ZVwiO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgYkNoZWNrZWQgPSAoY3Vyc29yLmdldE5vZGUoKSBhcyBhbnkpLmNoZWNrZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGV0IHN0YXRlU3RyID0gZ2V0U3RhdGVBbm5vdW5jZW1lbnRzKGN1cnNvci5nZXRFbGVtZW50KCkpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFske3JvbGVEZXNjfSwgJHtiQ2hlY2tlZCA/IFwiY2hlY2tlZFwiIDogXCJub3QgY2hlY2tlZFwifSR7c3RhdGVTdHJ9JHtxdW90ZU5hbWVQYWRCZWZvcmUoY3Vyc29yKX0ke2dldERlc2NyaWJlZEJ5QW5ub3VuY2VtZW50cyhjdXJzb3IuZ2V0RWxlbWVudCgpLCBtb2RlKX1dYFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gU2VhcmNoYm94IHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wic2VhcmNoYm94XCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwidGFiX2ZvY3VzXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IGN1cnNvci5pc1N0YXJ0VGFnKCkgPyBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX1lZGl0XWAgOiBcIlwiXG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIFNlcGFyYXRvciByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcInNlcGFyYXRvclwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiAoY3Vyc29yLmlzU3RhcnRUYWcoKSAmJiBgW3NlcGFyYXRvcl1gIHx8IFwiXCIpXG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIFNsaWRlciByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcInNsaWRlclwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInRhYl9mb2N1c1wiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yLCBfb2xkQ3Vyc29yPzogU1JDdXJzb3IsIG1vZGU/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWN1cnNvci5pc1N0YXJ0VGFnKCkpIHJldHVybiBcIlwiO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvbGVEZXNjID0gZ2V0Um9sZURlc2NyaXB0aW9uKGN1cnNvciwgXCJzbGlkZXJcIik7XG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbSA9IGN1cnNvci5nZXRFbGVtZW50KCk7XG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGFyaWEtdmFsdWVub3cgZmlyc3QsIHRoZW4gZmFsbCBiYWNrIHRvIG5hdGl2ZSB2YWx1ZSBwcm9wZXJ0eVxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZWxlbS5oYXNBdHRyaWJ1dGUoXCJhcmlhLXZhbHVlbm93XCIpXG4gICAgICAgICAgICAgICAgICAgID8gZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLXZhbHVlbm93XCIpXG4gICAgICAgICAgICAgICAgICAgIDogKGN1cnNvci5nZXROb2RlKCkgYXMgYW55KS52YWx1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYFske3F1b3RlTmFtZVBhZEFmdGVyKGN1cnNvcil9JHtyb2xlRGVzY30sICR7dmFsdWV9JHtnZXREZXNjcmliZWRCeUFubm91bmNlbWVudHMoY3Vyc29yLmdldEVsZW1lbnQoKSwgbW9kZSl9XWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIFNwaW5idXR0b24gcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJzcGluYnV0dG9uXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwidGFiX2ZvY3VzXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IsIF9vbGRDdXJzb3I/OiBTUkN1cnNvciwgbW9kZT86IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghY3Vyc29yLmlzU3RhcnRUYWcoKSkgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm9sZURlc2MgPSBnZXRSb2xlRGVzY3JpcHRpb24oY3Vyc29yLCBcInNwaW5idXR0b25cIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBbJHtxdW90ZU5hbWVQYWRBZnRlcihjdXJzb3IpfSR7cm9sZURlc2N9LCBlZGl0YWJsZSR7Z2V0RGVzY3JpYmVkQnlBbm5vdW5jZW1lbnRzKGN1cnNvci5nZXRFbGVtZW50KCksIG1vZGUpfV1gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBUYWIgcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJ0YWJcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJ0YWJfZm9jdXNcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghY3Vyc29yLmlzU3RhcnRUYWcoKSkgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm9sZURlc2MgPSBnZXRSb2xlRGVzY3JpcHRpb24oY3Vyc29yLCBcInRhYlwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYFske3JvbGVEZXNjfSR7KGN1cnNvci5nZXROb2RlKCkgYXMgSFRNTEVsZW1lbnQpLmdldEF0dHJpYnV0ZShcImFyaWEtc2VsZWN0ZWRcIikgPT09IFwidHJ1ZVwiID8gXCIsIHNlbGVjdGVkXCIgOiBcIlwifSR7cXVvdGVOYW1lUGFkQmVmb3JlKGN1cnNvcil9XWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIFRhYmxpc3Qgcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJ0YWJsaXN0XCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmdldE5hbWVJbmZvKCkgPT09IG51bGwpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuaXNTdGFydFRhZygpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgW2dyb3VwIHN0YXJ0JHtxdW90ZU5hbWVQYWRCZWZvcmUoY3Vyc29yKX1dYDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFtncm91cCBlbmQke3F1b3RlTmFtZVBhZEJlZm9yZShjdXJzb3IpfV1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gVGFicGFuZWwgcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJ0YWJwYW5lbFwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5nZXROYW1lSW5mbygpID09PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmlzU3RhcnRUYWcoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFtUYWIgcGFuZWwgc3RhcnQke3F1b3RlTmFtZVBhZEJlZm9yZShjdXJzb3IpfV1gO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgW1RhYiBwYW5lbCBlbmQke3F1b3RlTmFtZVBhZEJlZm9yZShjdXJzb3IpfV1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gVGV4dCByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcInRleHRcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJsaW5rXCIsIFwidGFiX2ZvY3VzXCIsIFwicmVnaW9uXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmlzRW5kVGFnKCkgfHwgIWN1cnNvci5nZXRQYXJlbnRFbGVtZW50KCk/LmdldEVsZW1lbnQoKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbSA9IGN1cnNvci5nZXRQYXJlbnRFbGVtZW50KCk/LmdldEVsZW1lbnQoKTtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoZWxlbSkudGV4dERlY29yYXRpb25MaW5lID09PSBcImxpbmUtdGhyb3VnaFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgW3N0cmlrZXRocm91Z2hdICR7KGN1cnNvci5nZXROYW1lSW5mbygpPy5uYW1lICsgXCJcIil9IFtlbmQgc3RyaWtldGhyb3VnaF1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYCR7KGN1cnNvci5nZXROYW1lSW5mbygpPy5uYW1lICsgXCJcIil9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gLS0gaW4gaGVhZGluZyBtb2RlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcInRleHRcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcImhlYWRpbmdcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4gXCJcIlxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBUZXh0Ym94IHJvbGVcbiAgICAgICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgICAgIHJvbGVzOiBbXCJ0ZXh0Ym94XCJdLFxuICAgICAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJ0YWJfZm9jdXNcIl0sXG4gICAgICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yLCBfb2xkQ3Vyc29yPzogU1JDdXJzb3IsIG1vZGU/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZWxlbSA9IGN1cnNvci5nZXRFbGVtZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuaXNFbmRUYWcoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vZGUgPT09IFwiaXRlbVwiICYmIGVsZW0ubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJURVhUQVJFQVwiID8gXCJbb3V0IG9mIGVkaXRdXCIgOiBcIlwiO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgXG4gICAgICAgICAgICAgICAgICAgIGlmICghY3Vyc29yLmlzU3RhcnRUYWcoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICBcbiAgICAgICAgICAgICAgICAgICAgbGV0IGF0dHJpYnV0ZXMgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbS5oYXNBdHRyaWJ1dGUoXCJwbGFjZWhvbGRlclwiKSAmJiBlbGVtLmdldEF0dHJpYnV0ZShcInBsYWNlaG9sZGVyXCIpLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzICs9IGAsIHBsYWNlaG9sZGVyOiAke2VsZW0uZ2V0QXR0cmlidXRlKFwicGxhY2Vob2xkZXJcIil9YDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzICs9IGdldFN0YXRlQW5ub3VuY2VtZW50cyhlbGVtKTtcbiAgICBcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNNdWx0aWxpbmUgPSBlbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiVEVYVEFSRUFcIiB8fCBlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtbXVsdGlsaW5lXCIpID09PSBcInRydWVcIjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVzY3JpYmVkQnkgPSBnZXREZXNjcmliZWRCeUFubm91bmNlbWVudHMoZWxlbSwgbW9kZSk7XG4gICAgXG4gICAgICAgICAgICAgICAgICAgIGlmIChpc011bHRpbGluZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGV4dENvbnRlbnQgPSBtb2RlID09PSBcInRhYl9mb2N1c1wiID8gZWxlbS50ZXh0Q29udGVudD8udHJpbSgpIDogXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRTdWZmaXggPSB0ZXh0Q29udGVudCA/IGAgJHt0ZXh0Q29udGVudH1gIDogXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX1lZGl0LCBtdWx0aWxpbmUke2F0dHJpYnV0ZXN9JHtkZXNjcmliZWRCeX1dJHtjb250ZW50U3VmZml4fWA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICBcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBbJHtxdW90ZU5hbWVQYWRBZnRlcihjdXJzb3IpfWVkaXQke2F0dHJpYnV0ZXN9JHtkZXNjcmliZWRCeX1dYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdXG4gICAgICAgIH0pLFxuXG4gICAgLy8gVHJlZWl0ZW0gcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJ0cmVlaXRlbVwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInRhYl9mb2N1c1wiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5pc0VuZFRhZygpKSByZXR1cm4gXCJcIjtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtID0gY3Vyc29yLmdldEVsZW1lbnQoKTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBCdWlsZCB0aGUgYW5ub3VuY2VtZW50IHN0cmluZyB3aXRob3V0IHRoZSBuYW1lIChsZXQgY29udGVudCByZW5kZXIgc2VwYXJhdGVseSlcbiAgICAgICAgICAgICAgICBsZXQgYW5ub3VuY2VtZW50ID0gYFt0cmVldmlldyBpdGVtYDtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBBZGQgc2VsZWN0ZWQgc3RhdGUgaWYgcHJlc2VudFxuICAgICAgICAgICAgICAgIGlmIChlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtc2VsZWN0ZWRcIikgPT09IFwidHJ1ZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGFubm91bmNlbWVudCArPSBcIiwgc2VsZWN0ZWRcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gQWRkIGV4cGFuZGVkL2NvbGxhcHNlZCBzdGF0ZSBpZiBwcmVzZW50XG4gICAgICAgICAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwiYXJpYS1leHBhbmRlZFwiKSkge1xuICAgICAgICAgICAgICAgICAgICBhbm5vdW5jZW1lbnQgKz0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWV4cGFuZGVkXCIpID09PSBcInRydWVcIiA/IFwiLCBleHBhbmRlZFwiIDogXCIsIGNvbGxhcHNlZFwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBBZGQgbGV2ZWwgaWYgZXhwbGljaXRseSBzZXQgb3IgY2FsY3VsYXRlIGZyb20gbmVzdGluZ1xuICAgICAgICAgICAgICAgIGxldCBsZXZlbCA9IGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1sZXZlbFwiKTtcbiAgICAgICAgICAgICAgICBpZiAobGV2ZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgYW5ub3VuY2VtZW50ICs9IGAsIGxldmVsICR7bGV2ZWx9YDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBDYWxjdWxhdGUgbGV2ZWwgYnkgY291bnRpbmcgcGFyZW50IHRyZWVpdGVtcyBvciBncm91cHMgdXNpbmcgRE9NV2Fsa2VyIGZvciBzaGFkb3cgRE9NIHN1cHBvcnRcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNhbGN1bGF0ZWRMZXZlbCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwYXJlbnQgPSBET01XYWxrZXIucGFyZW50RWxlbWVudChlbGVtKTtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHBhcmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyZW50Um9sZSA9IEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZShwYXJlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudFJvbGUgPT09IFwiZ3JvdXBcIiB8fCBwYXJlbnRSb2xlID09PSBcInRyZWVcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgZ3JvdXAgaXMgaW5zaWRlIGEgdHJlZWl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZ3JvdXBQYXJlbnQgPSBET01XYWxrZXIucGFyZW50RWxlbWVudChwYXJlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChncm91cFBhcmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBncm91cFBhcmVudFJvbGUgPSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUoZ3JvdXBQYXJlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ3JvdXBQYXJlbnRSb2xlID09PSBcInRyZWVpdGVtXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGN1bGF0ZWRMZXZlbCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZ3JvdXBQYXJlbnRSb2xlID09PSBcInRyZWVcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBQYXJlbnQgPSBET01XYWxrZXIucGFyZW50RWxlbWVudChncm91cFBhcmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQocGFyZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoY2FsY3VsYXRlZExldmVsID4gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3VuY2VtZW50ICs9IGAsIGxldmVsICR7Y2FsY3VsYXRlZExldmVsfWA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gQWRkIHBvc2l0aW9uIGluZm9ybWF0aW9uIChhcmlhLXBvc2luc2V0L2FyaWEtc2V0c2l6ZSBvciBjYWxjdWxhdGUpXG4gICAgICAgICAgICAgICAgbGV0IHBvc2l0aW9uID0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLXBvc2luc2V0XCIpO1xuICAgICAgICAgICAgICAgIGxldCBzZXRTaXplID0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLXNldHNpemVcIik7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgaWYgKCFwb3NpdGlvbiB8fCAhc2V0U2l6ZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBDYWxjdWxhdGUgcG9zaXRpb24gYnkgY291bnRpbmcgc2libGluZ3Mgd2l0aCBzYW1lIHJvbGUgdXNpbmcgRE9NV2Fsa2VyIGZvciBzaGFkb3cgRE9NIHN1cHBvcnRcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBvcyA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0b3RhbCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KGVsZW0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJdGVyYXRlIHRocm91Z2ggY2hpbGRyZW4gdG8gY291bnQgdHJlZWl0ZW1zXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2hpbGQgPSBET01XYWxrZXIuZmlyc3RDaGlsZE5vdE93bmVkQnlTbG90KHBhcmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoY2hpbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQubm9kZVR5cGUgPT09IDEpIHsgLy8gRWxlbWVudCBub2RlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkRWxlbSA9IGNoaWxkIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKGNoaWxkRWxlbSkgPT09IFwidHJlZWl0ZW1cIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWwrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZEVsZW0gPT09IGVsZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3MgPSB0b3RhbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZCA9IGNoaWxkLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIHNldFNpemUgPSB0b3RhbC50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBhbm5vdW5jZW1lbnQgKz0gYCwgJHtwb3NpdGlvbn0gb2YgJHtzZXRTaXplfV0gYDtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICByZXR1cm4gYW5ub3VuY2VtZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBIVE1MIEVsZW1lbnQgcnVsZXNcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW10sXG4gICAgICAgIGVsZW1zOiBbXCJCT0RZXCJdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInRhYl9mb2N1c1wiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGl0bGVTdHIgPSBjdXJzb3IuZ2V0Tm9kZSgpLm93bmVyRG9jdW1lbnQudGl0bGU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnNvci5pc0VuZFRhZygpID8gYFtFbmQgb2YgZG9jdW1lbnQke3RpdGxlU3RyLnRyaW0oKS5sZW5ndGggPiAwID8gXCI6IFwiICsgdGl0bGVTdHIudHJpbSgpIDogXCJcIn1dYCA6IGBbU3RhcnQgb2YgZG9jdW1lbnQke3RpdGxlU3RyLnRyaW0oKS5sZW5ndGggPiAwID8gXCI6IFwiICsgdGl0bGVTdHIudHJpbSgpIDogXCJcIn1dYFxuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW10sXG4gICAgICAgIGVsZW1zOiBbXCJJRlJBTUVcIl0sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwidGFiX2ZvY3VzXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBhY2Nlc3NXYXJuaW5nID0gY2FuQWNjZXNzRnJhbWUoY3Vyc29yLmdldE5vZGUoKSkgPyBcIlwiIDogXCJ7RW11bGF0b3IgdW5hYmxlIHRvIGFjY2VzcyBmcmFtZX1cIlxuICAgICAgICAgICAgICAgIHJldHVybiBjdXJzb3IuaXNFbmRUYWcoKSA/IFwiXCIgOiBhY2Nlc3NXYXJuaW5nO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW10sXG4gICAgICAgIGVsZW1zOiBbXCJCUlwiXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB3YWxrID0gY3Vyc29yLmNsb25lKCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIFdhbGsgdW50aWwgd2UgaGl0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBhZ2UsIGZpbmQgYW5vdGhlciBCUiwgb3IgZmluZCBzb21ldGhpbmcgd2l0aCBhIG5hbWVcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHdhbGsucHJldmlvdXMoKCkgPT4gdHJ1ZSkgJiYgd2Fsay5nZXROb2RlKCkubm9kZU5hbWUudG9VcHBlckNhc2UoKSAhPT0gXCJCUlwiICYmIHdhbGsuZ2V0TmFtZUluZm8oKSAmJiB3YWxrLmdldE5hbWVJbmZvKCkubmFtZS50cmltKCkubGVuZ3RoID09PSAwKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdhbGsuZ2V0Tm9kZSgpLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiQlJcIiA/IFwiW2JsYW5rXVwiIDogbnVsbDtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtdLFxuICAgICAgICBlbGVtczogW1wiRExcIl0sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IFwiXCJcbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtdLFxuICAgICAgICBlbGVtczogW1wiSU5QVVRcIl0sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwidGFiX2ZvY3VzXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IsIF9vbGRDdXJzb3I/OiBTUkN1cnNvciwgbW9kZT86IHN0cmluZykgPT4gKGN1cnNvci5pc1N0YXJ0VGFnKCkgJiYgY3Vyc29yLmdldEVsZW1lbnQoKT8uZ2V0QXR0cmlidXRlKFwidHlwZVwiKSA9PT0gXCJwYXNzd29yZFwiICYmIGBbJHtxdW90ZU5hbWVQYWRBZnRlcihjdXJzb3IpfWVkaXQsIHByb3RlY3RlZCR7Z2V0RGVzY3JpYmVkQnlBbm5vdW5jZW1lbnRzKGN1cnNvci5nZXRFbGVtZW50KCksIG1vZGUpfV1gKSB8fCBudWxsLFxuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IsIF9vbGRDdXJzb3I/OiBTUkN1cnNvciwgbW9kZT86IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuaXNTdGFydFRhZygpICYmIGN1cnNvci5nZXRFbGVtZW50KCk/LmdldEF0dHJpYnV0ZShcInR5cGVcIikgPT09IFwiZmlsZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IChjdXJzb3IuZ2V0RWxlbWVudCgpIGFzIEhUTUxJbnB1dEVsZW1lbnQpPy52YWx1ZSB8fCBcIlwiO1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlID09PSBcIlwiID8gXCJObyBmaWxlIGNob3NlblwiIDogdmFsdWUuc3Vic3RyaW5nKFwiQzpcXFxcZmFrZXBhdGhcXFxcXCIubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBbJHtxdW90ZU5hbWVQYWRBZnRlcihjdXJzb3IpfWJ1dHRvbiR7Z2V0RGVzY3JpYmVkQnlBbm5vdW5jZW1lbnRzKGN1cnNvci5nZXRFbGVtZW50KCksIG1vZGUpfV0gWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX0ke3ZhbHVlfV1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvciwgX29sZEN1cnNvcj86IFNSQ3Vyc29yLCBtb2RlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5pc1N0YXJ0VGFnKCkgJiYgY3Vyc29yLmdldEVsZW1lbnQoKT8uZ2V0QXR0cmlidXRlKFwidHlwZVwiKSA9PT0gXCJjb2xvclwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IChjdXJzb3IuZ2V0RWxlbWVudCgpIGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByID0gKE51bWJlcihgMHgke3ZhbC5zdWJzdHJpbmcoMSwgMyl9YCkgKiAxMDAuMCAvIE51bWJlcihcIjB4ZmZcIikpLnRvRml4ZWQoMCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGcgPSAoTnVtYmVyKGAweCR7dmFsLnN1YnN0cmluZygzLCA1KX1gKSAqIDEwMC4wIC8gTnVtYmVyKFwiMHhmZlwiKSkudG9GaXhlZCgwKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYiA9IChOdW1iZXIoYDB4JHt2YWwuc3Vic3RyaW5nKDUpfWApICogMTAwLjAgLyBOdW1iZXIoXCIweGZmXCIpKS50b0ZpeGVkKDApO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFske3F1b3RlTmFtZVBhZEFmdGVyKGN1cnNvcil9Y2xpY2thYmxlJHtnZXREZXNjcmliZWRCeUFubm91bmNlbWVudHMoY3Vyc29yLmdldEVsZW1lbnQoKSwgbW9kZSl9XSBbJHtyfSUgcmVkICR7Z30lIGdyZWVuICR7Yn0lIGJsdWVdYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IsIF9vbGRDdXJzb3I/OiBTUkN1cnNvciwgbW9kZT86IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuaXNTdGFydFRhZygpICYmIGN1cnNvci5nZXRFbGVtZW50KCk/LmdldEF0dHJpYnV0ZShcInR5cGVcIikgPT09IFwibW9udGhcIikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSAoY3Vyc29yLmdldEVsZW1lbnQoKSBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHkgPSBcIjBcIjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG0gPSBcIjBcIjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbC50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGUgPSBuZXcgRGF0ZSh2YWwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgeSA9IFwiXCIgKyBkYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBtID0gXCJcIiArIChkYXRlLmdldE1vbnRoKCkgKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFske3F1b3RlTmFtZVBhZEFmdGVyKGN1cnNvcil9Y2xpY2thYmxlJHtnZXREZXNjcmliZWRCeUFubm91bmNlbWVudHMoY3Vyc29yLmdldEVsZW1lbnQoKSwgbW9kZSl9XSBbc3BpbiBidXR0b24sICR7bX1dIFtzcGluIGJ1dHRvbiwgJHt5fV0gW21lbnUgYnV0dG9uXSBbc3ViTWVudV0gU2hvdyBtb250aCBwaWNrZXJgO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvciwgX29sZEN1cnNvcj86IFNSQ3Vyc29yLCBtb2RlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5pc1N0YXJ0VGFnKCkgJiYgY3Vyc29yLmdldEVsZW1lbnQoKT8uZ2V0QXR0cmlidXRlKFwidHlwZVwiKSA9PT0gXCJkYXRlXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsID0gKGN1cnNvci5nZXRFbGVtZW50KCkgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGxldCB5ID0gXCIwXCI7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtID0gXCIwXCI7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkYXkgPSBcIjBcIjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbC50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGUgPSBuZXcgRGF0ZSh2YWwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgeSA9IFwiXCIgKyBkYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBtID0gXCJcIiArIChkYXRlLmdldE1vbnRoKCkgKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRheSA9IFwiXCIgKyAoZGF0ZS5nZXREYXRlKCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX1jbGlja2FibGUke2dldERlc2NyaWJlZEJ5QW5ub3VuY2VtZW50cyhjdXJzb3IuZ2V0RWxlbWVudCgpLCBtb2RlKX1dIFtzcGluIGJ1dHRvbiwgJHttfV0gLyBbc3BpbiBidXR0b24sICR7ZGF5fV0gLyBbc3BpbiBidXR0b24sICR7eX1dIFttZW51IGJ1dHRvbl0gW3N1Yk1lbnVdIFNob3cgZGF0ZSBwaWNrZXJgO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvciwgX29sZEN1cnNvcj86IFNSQ3Vyc29yLCBtb2RlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5pc1N0YXJ0VGFnKCkgJiYgY3Vyc29yLmdldEVsZW1lbnQoKT8uZ2V0QXR0cmlidXRlKFwidHlwZVwiKSA9PT0gXCJkYXRldGltZS1sb2NhbFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IChjdXJzb3IuZ2V0RWxlbWVudCgpIGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlOyAvLyAyMDI1LTA5LTEyVDA0OjIwXG4gICAgICAgICAgICAgICAgICAgIGxldCB5ID0gXCIwXCI7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtID0gXCIwXCI7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkYXkgPSBcIjBcIjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGhvdXIgPSBcIjBcIjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1pbiA9IFwiMFwiO1xuICAgICAgICAgICAgICAgICAgICBsZXQgYW1wbSA9IFwiMFwiO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGF0ZSA9IG5ldyBEYXRlKHZhbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB5ID0gXCJcIiArIGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG0gPSBcIlwiICsgKGRhdGUuZ2V0TW9udGgoKSArIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF5ID0gXCJcIiArIChkYXRlLmdldERhdGUoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0ZS5nZXRIb3VycygpID09PSAwIHx8IGRhdGUuZ2V0SG91cnMoKSA9PT0gMTIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3VyID0gXCIxMlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRlLmdldEhvdXJzKCkgPCAxMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvdXIgPSBcIlwiICsgZGF0ZS5nZXRIb3VycygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3VyID0gXCJcIiArIChkYXRlLmdldEhvdXJzKCkgLSAxMik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBtaW4gPSBcIlwiICsgZGF0ZS5nZXRNaW51dGVzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbXBtID0gZGF0ZS5nZXRIb3VycygpID49IDEyID8gXCJwbVwiIDogXCJhbVwiO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX1jbGlja2FibGUke2dldERlc2NyaWJlZEJ5QW5ub3VuY2VtZW50cyhjdXJzb3IuZ2V0RWxlbWVudCgpLCBtb2RlKX1dIFtzcGluIGJ1dHRvbiwgJHttfV0gLyBbc3BpbiBidXR0b24sICR7ZGF5fV0gLyBbc3BpbiBidXR0b24sICR7eX1dIFtzcGluIGJ1dHRvbiwgJHtob3VyfV0gOiBbc3BpbiBidXR0b24sICR7bWlufV0gW3NwaW4gYnV0dG9uLCAke2FtcG19XSAgW21lbnUgYnV0dG9uXSBbc3ViTWVudV0gU2hvdyBsb2NhbCBkYXRlIGFuZCB0aW1lIHBpY2tlcmA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yLCBfb2xkQ3Vyc29yPzogU1JDdXJzb3IsIG1vZGU/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmlzU3RhcnRUYWcoKSAmJiBjdXJzb3IuZ2V0RWxlbWVudCgpPy5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpID09PSBcInRpbWVcIikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSAoY3Vyc29yLmdldEVsZW1lbnQoKSBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZTsgLy8gMjAyNS0wOS0xMlQwNDoyMFxuICAgICAgICAgICAgICAgICAgICBsZXQgaG91ciA9IFwiMFwiO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWluID0gXCIwXCI7XG4gICAgICAgICAgICAgICAgICAgIGxldCBhbXBtID0gXCIwXCI7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWwudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkYXRlID0gdmFsLnNwbGl0KFwiOlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBob3VycyA9IHBhcnNlSW50KGRhdGVbMF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhvdXJzID09PSAwIHx8IGhvdXJzID09PSAxMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvdXIgPSBcIjEyXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXJzIDwgMTIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3VyID0gXCJcIiArIGhvdXJzO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3VyID0gXCJcIiArIChob3VycyAtIDEyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbiA9IGRhdGVbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBhbXBtID0gaG91cnMgPj0gMTIgPyBcInBtXCIgOiBcImFtXCI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBbJHtxdW90ZU5hbWVQYWRBZnRlcihjdXJzb3IpfWdyb3VwaW5nIGNsaWNrYWJsZSR7Z2V0RGVzY3JpYmVkQnlBbm5vdW5jZW1lbnRzKGN1cnNvci5nZXRFbGVtZW50KCksIG1vZGUpfSBbc3BpbiBidXR0b24sICR7aG91cn1dIDogW3NwaW4gYnV0dG9uLCAke21pbn1dIFtzcGluIGJ1dHRvbiwgJHthbXBtfV0gW21lbnUgYnV0dG9uXSBbc3ViTWVudV0gU2hvdyB0aW1lIHBpY2tlciBbb3V0IG9mIGdyb3VwaW5nXWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yLCBfb2xkQ3Vyc29yPzogU1JDdXJzb3IsIG1vZGU/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmlzU3RhcnRUYWcoKSAmJiBjdXJzb3IuZ2V0RWxlbWVudCgpPy5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpID09PSBcIndlZWtcIikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSAoY3Vyc29yLmdldEVsZW1lbnQoKSBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZTsgLy8gMjAyNS1XMzhcbiAgICAgICAgICAgICAgICAgICAgbGV0IHllYXIgPSBcIjBcIjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHdlZWsgPSBcIjBcIjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbC50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGUgPSB2YWwuc3BsaXQoLy1XLyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB5ZWFyID0gZGF0ZVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdlZWsgPSBkYXRlWzFdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX1jbGlja2FibGUke2dldERlc2NyaWJlZEJ5QW5ub3VuY2VtZW50cyhjdXJzb3IuZ2V0RWxlbWVudCgpLCBtb2RlKX1dIFtzcGluIGJ1dHRvbiwgJHt3ZWVrfV0sIFtzcGluIGJ1dHRvbiwgJHt5ZWFyfV0gW21lbnUgYnV0dG9uXSBbc3ViTWVudV0gU2hvdyB3ZWVrIHBpY2tlcmA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiBjdXJzb3IuZ2V0RWxlbWVudCgpPy5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpID09PSBcImhpZGRlblwiID8gXCJcIiA6IG51bGwsXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4gKGN1cnNvci5pc1N0YXJ0VGFnKCkgJiYgYCEhWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX1pbnB1dCEhXSR7Y3Vyc29yLmdldEVsZW1lbnQoKS5vdXRlckhUTUx9YCkgfHwgbnVsbFxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW10sXG4gICAgICAgIGVsZW1zOiBbXCJMSVwiXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIGxpc3RpdGVtIGNvbnRhaW5zIGludGVyYWN0aXZlIGVsZW1lbnRzXG4gICAgICAgICAgICAgICAgLy8gU2NyZWVuIHJlYWRlcnMgZG9uJ3QgcmVhZCB0aGUgYWNjZXNzaWJsZSBuYW1lIHdoZW4gaW50ZXJhY3RpdmUgZWxlbWVudHMgYXJlIHByZXNlbnRcbiAgICAgICAgICAgICAgICBjb25zdCBoYXNJbnRlcmFjdGl2ZUNvbnRlbnQgPSBsaXN0aXRlbUNvbnRhaW5zSW50ZXJhY3RpdmVFbGVtZW50KGN1cnNvcik7XG4gICAgICAgICAgICAgICAgY29uc3QgbmFtZVRvVXNlID0gaGFzSW50ZXJhY3RpdmVDb250ZW50ID8gXCJcIiA6IChjdXJzb3IuZ2V0TmFtZUluZm8oKT8ubmFtZSB8fCBcIlwiKTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtID0gY3Vyc29yLmdldEVsZW1lbnQoKTtcbiAgICAgICAgICAgICAgICBpZiAod2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbSkubGlzdFN0eWxlVHlwZSA9PT0gXCJub25lXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGN1cnNvci5pc1N0YXJ0VGFnKCkgPyBgJHtuYW1lVG9Vc2V9YCA6IFwiXCI7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGN1cnNvci5pc1N0YXJ0VGFnKCkgPyBgW2J1bGxldF0gJHtuYW1lVG9Vc2V9YCA6IFwiXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBNYXRoTUwgZWxlbWVudHNcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW10sXG4gICAgICAgIGVsZW1zOiBbXCJNRlJBQ1wiXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4gY3Vyc29yLmlzU3RhcnRUYWcoKSA/IGBbZnJhY3Rpb25dYCA6IGBbZW5kIGZyYWN0aW9uXWBcbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtdLFxuICAgICAgICBlbGVtczogW1wiTVJPV1wiXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIC8vIE9ubHkgYW5ub3VuY2Ugb3ZlciBvbiB0aGUgZW5kIHRhZ1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuaXNTdGFydFRhZygpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGxldCBmcmFjdGlvbiA9IGN1cnNvci5nZXRDdXJyZW50T3JQYXJlbnRCeVJvbGVDbG9uZShbXSwgW1wibWZyYWNcIl0pO1xuICAgICAgICAgICAgICAgIGlmIChmcmFjdGlvbiAmJiBmcmFjdGlvbi5nZXRFbGVtZW50KCkucXVlcnlTZWxlY3RvckFsbChcIm1yb3dcIilbMF0/LmlzU2FtZU5vZGUoY3Vyc29yLmdldE5vZGUoKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiW292ZXJdXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW10sXG4gICAgICAgIGVsZW1zOiBbXCJNU1FSVFwiXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4gY3Vyc29yLmlzU3RhcnRUYWcoKSA/IGBbc3F1YXJlIHJvb3RdYCA6IGBbZW5kIHJvb3RdYFxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW10sXG4gICAgICAgIGVsZW1zOiBbXCJNU1VQXCJdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5pc0VuZFRhZygpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1pID0gY3Vyc29yLmdldEVsZW1lbnQoKS5xdWVyeVNlbGVjdG9yKFwibWlcIik/LmlubmVySFRNTCB8fCBcIlwiO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1uID0gY3Vyc29yLmdldEVsZW1lbnQoKS5xdWVyeVNlbGVjdG9yKFwibW5cIik/LmlubmVySFRNTCB8fCBcIlwiO1xuICAgICAgICAgICAgICAgIGlmIChtbiA9PT0gXCIyXCIpIHJldHVybiBgJHttaX0gW3NxdWFyZWRdYDtcbiAgICAgICAgICAgICAgICBpZiAobW4gPT09IFwiM1wiKSByZXR1cm4gYCR7bWl9IFtjdWJlZF1gO1xuICAgICAgICAgICAgICAgIHJldHVybiBgJHttaX0gW3RvIHRoZSAke21ufV1gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBNdWx0aXBsZSByb2xlcyBydWxlcyAtIHBsYWNlZCBhdCB0aGUgYm90dG9tXG4gICAgXG4gICAgLy8gRGVmYXVsdCBtb2RlIHJ1bGVzIC0gQ29udGFpbmVyIGVsZW1lbnRzIChtdWx0aXBsZSByb2xlcylcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiYXJ0aWNsZVwiLCBcImJhbm5lclwiLCBcImJsb2NrcXVvdGVcIiwgXCJjYXB0aW9uXCIsIFwiY2VsbFwiLCBcImNvZGVcIiwgXCJjb2x1bW5oZWFkZXJcIixcbiAgICAgICAgICAgIFwiY29tcGxlbWVudGFyeVwiLCBcImNvbnRlbnRpbmZvXCIsIFwiZmlndXJlXCIsIFwiZm9ybVwiLCBcImdyb3VwXCIsIFwibGlzdFwiLCBcIm1haW5cIixcbiAgICAgICAgICAgIFwibWFya1wiLCBcIm5hdmlnYXRpb25cIiwgXCJyZWdpb25cIiwgXCJyb3dcIiwgXCJyb3doZWFkZXJcIiwgXCJzZWFyY2hcIiwgXCJ0YWJsZVwiLCBcInRvb2xiYXJcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4gXCJcIlxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBEZWZhdWx0IG1vZGUgcnVsZXMgLSBFbGVtZW50cyB0aGF0IHNjcmVlbiByZWFkZXJzIHR5cGljYWxseSBpZ25vcmUgKG11bHRpcGxlIHJvbGVzKVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJwYXJhZ3JhcGhcIiwgXCJyb3dncm91cFwiLCBcInN0YXR1c1wiLCBcInN0cm9uZ1wiLCBcInN1YnNjcmlwdFwiLCBcInN1cGVyc2NyaXB0XCIsXG4gICAgICAgICAgICBcInRlcm1cIiwgXCJ0aW1lXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiBcIlwiXG4gICAgICAgIF1cbiAgICB9KSxcbl1cbiIsImltcG9ydCB7IFNSUmVuZGVyZXJSdWxlIH0gZnJvbSBcIi4uL1NSUmVuZGVyZXJSdWxlXCI7XG5pbXBvcnQgeyBTUkN1cnNvciB9IGZyb20gXCIuLi9TUkN1cnNvclwiO1xuaW1wb3J0IHsgU1JUYWJsZVV0aWwgfSBmcm9tIFwiLi4vU1JUYWJsZVV0aWxcIjtcbmltcG9ydCB7IHF1b3RlTmFtZVBhZEFmdGVyLCBxdW90ZU5hbWVQYWRCZWZvcmUsIGdldFJvbGVEZXNjcmlwdGlvbiB9IGZyb20gXCIuL2NvbW1vblwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQVJJQURlZmluaXRpb25zIH0gZnJvbSBcIi4uLy4uLy4uL3YyL2FyaWEvQVJJQURlZmluaXRpb25zXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uLy4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG4vKipcbiAqIEdlbmVyYXRlcyB0aGUgYW5ub3VuY2VtZW50IHRleHQgd2hlbiBlbnRlcmluZyBhIHRhYmxlIGNlbGxcbiAqL1xuZnVuY3Rpb24gcmVuZGVyRW50ZXJUYWJsZUNlbGwobmV3Q3Vyc29yOiBTUkN1cnNvciwgb2xkQ3Vyc29yOiBTUkN1cnNvcikge1xuICAgIC8vIFdlIHNlZW0gdG8gYmUgYXQgdGhlIG5ld2xpbmUgdGV4dCBub2RlIGFmdGVyIHRoZSBjZWxsXG4gICAgaWYgKG9sZEN1cnNvciAmJiBvbGRDdXJzb3IuZ2V0Tm9kZSgpPy5ub2RlTmFtZSA9PT0gXCIjdGV4dFwiKSB7XG4gICAgICAgIG9sZEN1cnNvciA9IG9sZEN1cnNvci5jbG9uZSgpO1xuICAgICAgICBvbGRDdXJzb3IucHJldmlvdXMoKCkgPT4gdHJ1ZSlcbiAgICB9XG4gICAgY29uc3QgbmV3VGFibGVNb2RlbCA9IFNSVGFibGVVdGlsLmdldFRhYmxlTW9kZWwobmV3Q3Vyc29yKTtcbiAgICBjb25zdCBvbGRDZWxsSW5mbyA9IFNSVGFibGVVdGlsLmdldENlbGxNb2RlbChvbGRDdXJzb3IsIG5ld1RhYmxlTW9kZWwpO1xuICAgIGNvbnN0IG5ld0NlbGxJbmZvID0gU1JUYWJsZVV0aWwuZ2V0Q2VsbE1vZGVsKG5ld0N1cnNvciwgbmV3VGFibGVNb2RlbCk7XG4gICAgaWYgKCFuZXdDZWxsSW5mbykgcmV0dXJuIFwiXCI7XG4gICAgbGV0IHJldFZhbDogc3RyaW5nW10gPSBbXTtcblxuICAgIC8vIEFubm91bmNlIHJvdyBpbmZvcm1hdGlvbiBpZiB3ZSd2ZSBtb3ZlZCB0byBhIGRpZmZlcmVudCByb3cgb3IgdGhlIHJvd3NwYW4gaGFzIGNoYW5nZWRcbiAgICBpZiAoIW9sZENlbGxJbmZvIHx8IG9sZENlbGxJbmZvLnJvd0luZGV4U3RhcnQgIT09IG5ld0NlbGxJbmZvLnJvd0luZGV4U3RhcnQgfHwgb2xkQ2VsbEluZm8ucm93c3BhbiAhPT0gbmV3Q2VsbEluZm8ucm93c3Bhbikge1xuICAgICAgICAvLyBJZiBhIGNoYW5nZSBpbiByb3cgb3IgYSBjaGFuZ2UgaW4gcm93U3BhblxuICAgICAgICBsZXQgcm93SGVhZGVycyA9IFNSVGFibGVVdGlsLmdldFJvd0hlYWRlcnNGb3JDdXJzb3IobmV3Q3Vyc29yLCBuZXdUYWJsZU1vZGVsKTtcbiAgICAgICAgbGV0IGhlYWRlckluZm9TdHIgPSByb3dIZWFkZXJzICYmIHJvd0hlYWRlcnMudHJpbSgpLmxlbmd0aCA+IDAgPyBgXCIke3Jvd0hlYWRlcnN9XCIsIGAgOiBcIlwiO1xuICAgICAgICByZXRWYWwucHVzaChgWyR7aGVhZGVySW5mb1N0cn1yb3cgJHsobmV3Q2VsbEluZm8ucm93SW5kZXhTdGFydCsxKX0ke25ld0NlbGxJbmZvLnJvd3NwYW4gPiAxID8gXCIgdGhyb3VnaCBcIiArIChuZXdDZWxsSW5mby5yb3dJbmRleFN0YXJ0K25ld0NlbGxJbmZvLnJvd3NwYW4pIDogXCJcIn1dYCk7XG4gICAgfVxuXG4gICAgLy8gQW5ub3VuY2UgY29sdW1uIGluZm9ybWF0aW9uIGlmIHdlJ3ZlIG1vdmVkIHRvIGEgZGlmZmVyZW50IGNvbHVtbiBvciB0aGUgY29sc3BhbiBoYXMgY2hhbmdlZFxuICAgIGlmICghb2xkQ2VsbEluZm8gfHwgb2xkQ2VsbEluZm8uY29sSW5kZXhTdGFydCAhPT0gbmV3Q2VsbEluZm8uY29sSW5kZXhTdGFydCB8fCBvbGRDZWxsSW5mby5jb2xzcGFuICE9PSBuZXdDZWxsSW5mby5jb2xzcGFuKSB7XG4gICAgICAgIC8vIElmIGEgY2hhbmdlIGluIGNvbHVtbiBvciBhIGNoYW5nZSBpbiBjb2xzcGFuXG4gICAgICAgIGxldCBjb2x1bW5IZWFkZXJzID0gU1JUYWJsZVV0aWwuZ2V0Q29sdW1uSGVhZGVyc0ZvckN1cnNvcihuZXdDdXJzb3IsIG5ld1RhYmxlTW9kZWwpO1xuICAgICAgICBsZXQgaGVhZGVySW5mb1N0ciA9IGNvbHVtbkhlYWRlcnMgJiYgY29sdW1uSGVhZGVycy50cmltKCkubGVuZ3RoID4gMCA/IGBcIiR7Y29sdW1uSGVhZGVyc31cIiwgYCA6IFwiXCI7XG4gICAgICAgIHJldFZhbC5wdXNoKGBbJHtoZWFkZXJJbmZvU3RyfWNvbHVtbiAkeyhuZXdDZWxsSW5mby5jb2xJbmRleFN0YXJ0KzEpfSR7bmV3Q2VsbEluZm8uY29sc3BhbiA+IDEgPyBcIiB0aHJvdWdoIFwiICsgKG5ld0NlbGxJbmZvLmNvbEluZGV4U3RhcnQrbmV3Q2VsbEluZm8uY29sc3BhbikgOiBcIlwifV1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmV0VmFsLmpvaW4oXCIgXCIpO1xufVxuXG5leHBvcnQgbGV0IFJVTEVTOiBTUlJlbmRlcmVyUnVsZVtdID0gW1xuICAgIC8vIFNpbmdsZSByb2xlIHJ1bGVzIC0gYWxwaGFiZXRpY2FsbHkgc29ydGVkXG5cbiAgICAvLyBBcnRpY2xlIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiYXJ0aWNsZVwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcImFydGljbGVcIiwgXCJ0YWJfZm9jdXNcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvciwgX29sZEN1cnNvcj86IFNSQ3Vyc29yLCBtb2RlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG1vZGUgPT09IFwidGFiX2ZvY3VzXCIgJiYgIUNvbW1vblV0aWwuaXNUYWJiYWJsZShjdXJzb3IuZ2V0Tm9kZSgpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm9sZURlc2MgPSBnZXRSb2xlRGVzY3JpcHRpb24oY3Vyc29yLCBcImFydGljbGVcIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBbJHtxdW90ZU5hbWVQYWRBZnRlcihjdXJzb3IpfSR7cm9sZURlc2N9XWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIEJhbm5lciByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImJhbm5lclwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInJlZ2lvblwiLCBcInRhYl9mb2N1c1wiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yLCBfb2xkQ3Vyc29yPzogU1JDdXJzb3IsIG1vZGU/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gXCJ0YWJfZm9jdXNcIiAmJiAhQ29tbW9uVXRpbC5pc1RhYmJhYmxlKGN1cnNvci5nZXROb2RlKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICBjb25zdCByb2xlRGVzYyA9IGdldFJvbGVEZXNjcmlwdGlvbihjdXJzb3IsIFwiYmFubmVyIHJlZ2lvblwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYFske3F1b3RlTmFtZVBhZEFmdGVyKGN1cnNvcil9JHtyb2xlRGVzY31dYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gQmxvY2txdW90ZSByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImJsb2NrcXVvdGVcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJyZWdpb25cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoX2N1cnNvcjogU1JDdXJzb3IpID0+IFwiW2Jsb2NrcXVvdGVdXCJcbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gQ2FwdGlvbiByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImNhcHRpb25cIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJyZWdpb25cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoX2N1cnNvcjogU1JDdXJzb3IpID0+IFwiW2NhcHRpb25dXCJcbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gQ2VsbCByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImNlbGxcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJ0YWJsZVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIHJlbmRlckVudGVyVGFibGVDZWxsXG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIENvbHVtbmhlYWRlciByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImNvbHVtbmhlYWRlclwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInRhYmxlXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgcmVuZGVyRW50ZXJUYWJsZUNlbGxcbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gQ29tcGxlbWVudGFyeSByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImNvbXBsZW1lbnRhcnlcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJyZWdpb25cIiwgXCJ0YWJfZm9jdXNcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvciwgX29sZEN1cnNvcj86IFNSQ3Vyc29yLCBtb2RlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG1vZGUgPT09IFwidGFiX2ZvY3VzXCIgJiYgIUNvbW1vblV0aWwuaXNUYWJiYWJsZShjdXJzb3IuZ2V0Tm9kZSgpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBbJHtxdW90ZU5hbWVQYWRBZnRlcihjdXJzb3IpfWNvbXBsZW1lbnRhcnkgcmVnaW9uXWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIENvbnRlbnRpbmZvIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiY29udGVudGluZm9cIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJyZWdpb25cIiwgXCJ0YWJfZm9jdXNcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvciwgX29sZEN1cnNvcj86IFNSQ3Vyc29yLCBtb2RlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG1vZGUgPT09IFwidGFiX2ZvY3VzXCIgJiYgIUNvbW1vblV0aWwuaXNUYWJiYWJsZShjdXJzb3IuZ2V0Tm9kZSgpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBbJHtxdW90ZU5hbWVQYWRBZnRlcihjdXJzb3IpfWNvbnRlbnQgaW5mbyByZWdpb25dYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gRmlndXJlIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiZmlndXJlXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwicmVnaW9uXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKF9jdXJzb3I6IFNSQ3Vyc29yKSA9PiBcIltmaWd1cmVdXCJcbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gRm9ybSByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImZvcm1cIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJyZWdpb25cIiwgXCJmb3JtY29udHJvbFwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5nZXROYW1lSW5mbygpID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIltzZWN0aW9uXVwiO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX1mb3JtIHJlZ2lvbl1gXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBHcm91cCByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImdyb3VwXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwicmVnaW9uXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmdldE5hbWVJbmZvKCkgPT09IG51bGwpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuZ2V0Q3VycmVudE9yUGFyZW50QnlSb2xlQ2xvbmUoW1wiY29tYm9ib3hcIl0sIFtcInNlbGVjdFwiXSk/LmdldE5vZGUoKS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIlNFTEVDVFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmdldE5vZGUoKS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIkRFVEFJTFNcIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFtidXR0b24sICR7Y3Vyc29yLmdldEVsZW1lbnQoKS5oYXNBdHRyaWJ1dGUoXCJvcGVuXCIpID8gXCJleHBhbmRlZFwiOiBcImNvbGxhcHNlZFwifV1gO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgW2dyb3VwaW5nJHtxdW90ZU5hbWVQYWRCZWZvcmUoY3Vyc29yKX1dYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIC0tIHRhYl9mb2N1c1xuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJncm91cFwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1widGFiX2ZvY3VzXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmdldE5hbWVJbmZvKCkgPT09IG51bGwpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuZ2V0Q3VycmVudE9yUGFyZW50QnlSb2xlQ2xvbmUoW1wiY29tYm9ib3hcIl0sIFtcInNlbGVjdFwiXSk/LmdldE5vZGUoKS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIlNFTEVDVFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmdldE5vZGUoKS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIkRFVEFJTFNcIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFtidXR0b24sICR7Y3Vyc29yLmdldEVsZW1lbnQoKS5oYXNBdHRyaWJ1dGUoXCJvcGVuXCIpID8gXCJleHBhbmRlZFwiOiBcImNvbGxhcHNlZFwifV1gO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIExpc3Qgcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJsaXN0XCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwibGlzdFwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgbm9kZSA9IGN1cnNvci5nZXROb2RlKCkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVzY2VuZGFudExpc3RJdGVtcyA9IGRvY3VtZW50LmV2YWx1YXRlKFwiLi8vbGkgfCAuLy8qW0Byb2xlPSdsaXN0aXRlbSddXCIsIG5vZGUsIG51bGwsIFhQYXRoUmVzdWx0Lk9SREVSRURfTk9ERV9TTkFQU0hPVF9UWVBFLCBudWxsKTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBDb3VudCBpdGVtcywgZXhjbHVkaW5nIHRob3NlIGluIG90aGVyIGxpc3RzIG9yIHdpdGhpbiBwcmVzZW50YXRpb25hbCBjb250YWluZXJzXG4gICAgICAgICAgICAgICAgbGV0IG51bUl0ZW1zID0gMDtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRlc2NlbmRhbnRMaXN0SXRlbXMuc25hcHNob3RMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gZGVzY2VuZGFudExpc3RJdGVtcy5zbmFwc2hvdEl0ZW0oaSkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAvLyBXYWxrIHVwIGFuY2VzdG9ycyB0byBjaGVjayBmb3IgYm90aCBuZXN0ZWQgbGlzdHMgYW5kIHByZXNlbnRhdGlvbmFsIGNvbnRhaW5lcnNcbiAgICAgICAgICAgICAgICAgICAgbGV0IGlzSW5PdGhlckxpc3QgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGhhc1ByZXNlbnRhdGlvbmFsQW5jZXN0b3IgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFuY2VzdG9yID0gaXRlbS5wYXJlbnRFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGFuY2VzdG9yICYmIGFuY2VzdG9yICE9PSBub2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiBhbmNlc3RvciBpcyBhbm90aGVyIGxpc3RcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFuY2VzdG9yUm9sZSA9IEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZShhbmNlc3Rvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYW5jZXN0b3JSb2xlID09PSBcImxpc3RcIiB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2VzdG9yLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiVUxcIiB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2VzdG9yLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiT0xcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzSW5PdGhlckxpc3QgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiBhbmNlc3RvciBoYXMgcHJlc2VudGF0aW9uYWwgY2hpbGRyZW5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbmNlc3RvclJvbGUgJiYgQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW2FuY2VzdG9yUm9sZV0/LnByZXNlbnRhdGlvbmFsQ2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNQcmVzZW50YXRpb25hbEFuY2VzdG9yID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgYW5jZXN0b3IgPSBhbmNlc3Rvci5wYXJlbnRFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBpZiAoIWlzSW5PdGhlckxpc3QgJiYgIWhhc1ByZXNlbnRhdGlvbmFsQW5jZXN0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG51bUl0ZW1zKys7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgaWYgKG51bUl0ZW1zID09PSAwKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICByZXR1cm4gYFske3F1b3RlTmFtZVBhZEFmdGVyKGN1cnNvcil9bGlzdCBvZiAke251bUl0ZW1zfSBpdGVtc11gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBNYWluIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wibWFpblwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInJlZ2lvblwiLCBcInRhYl9mb2N1c1wiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yLCBfb2xkQ3Vyc29yPzogU1JDdXJzb3IsIG1vZGU/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gXCJ0YWJfZm9jdXNcIiAmJiAhQ29tbW9uVXRpbC5pc1RhYmJhYmxlKGN1cnNvci5nZXROb2RlKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICByZXR1cm4gYFske3F1b3RlTmFtZVBhZEFmdGVyKGN1cnNvcil9bWFpbiByZWdpb25dYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gbWVudWJhciByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcIm1lbnViYXJcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJsaXN0XCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBub2RlID0gY3Vyc29yLmdldE5vZGUoKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICBjb25zdCBkZXNjZW5kYW50TGlzdEl0ZW1zID0gZG9jdW1lbnQuZXZhbHVhdGUoXCIuLy8qW0Byb2xlPSdtZW51aXRlbSddXCIsIG5vZGUsIG51bGwsIFhQYXRoUmVzdWx0Lk9SREVSRURfTk9ERV9TTkFQU0hPVF9UWVBFLCBudWxsKTtcbiAgICAgICAgICAgICAgICBjb25zdCBkZXNjZW5kYW50TGlzdEl0ZW1zSW5PdGhlckxpc3RzID0gZG9jdW1lbnQuZXZhbHVhdGUoXG4gICAgICAgICAgICAgICAgICAgIFwiLi8vKltAcm9sZT0nbWVudWJhciddLy8qW0Byb2xlPSdtZW51aXRlbSddfC4vLypbQHJvbGU9J21lbnUnXS8vKltAcm9sZT0nbWVudWl0ZW0nXVwiLFxuICAgICAgICAgICAgICAgICAgICBub2RlLCBudWxsLCBYUGF0aFJlc3VsdC5PUkRFUkVEX05PREVfU05BUFNIT1RfVFlQRSwgbnVsbCk7XG4gICAgICAgICAgICAgICAgLy8gY29uc3QgZGVzY2VuZGFudENvbnRhaW5lcnMgPSBkb2N1bWVudC5ldmFsdWF0ZShcIi4vLypbQHJvbGU9J21lbnVpdGVtJ10vKltAcm9sZT0nbWVudSddXCIsIG5vZGUsIG51bGwsIFhQYXRoUmVzdWx0Lk9SREVSRURfTk9ERV9TTkFQU0hPVF9UWVBFLCBudWxsKTtcbiAgICAgICAgICAgICAgICAvLyBjb25zdCBkZXNjZW5kYW50Q29udGFpbmVyczIgPSBkb2N1bWVudC5ldmFsdWF0ZShcIi4vLypbQHJvbGU9J21lbnViYXInXS8vKltAcm9sZT0nbWVudWl0ZW0nXS8qW0Byb2xlPSdtZW51J118Li8vKltAcm9sZT0nbWVudSddLy8qW0Byb2xlPSdtZW51aXRlbSddLypbQHJvbGU9J21lbnUnXVwiLCBub2RlLCBudWxsLCBYUGF0aFJlc3VsdC5PUkRFUkVEX05PREVfU05BUFNIT1RfVFlQRSwgbnVsbCk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJNRU5VQkFSXCIsIGN1cnNvci5pc0VuZFRhZygpP1wiL1wiOlwiXCIsIGN1cnNvci5nZXROb2RlKCkpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGRlc2NlbmRhbnRMaXN0SXRlbXMsIGRlc2NlbmRhbnRMaXN0SXRlbXNJbk90aGVyTGlzdHMpOy8vLCBkZXNjZW5kYW50Q29udGFpbmVycywgZGVzY2VuZGFudENvbnRhaW5lcnMyKVxuICAgICAgICAgICAgICAgIGxldCBudW1JdGVtcyA9IGRlc2NlbmRhbnRMaXN0SXRlbXMuc25hcHNob3RMZW5ndGgtZGVzY2VuZGFudExpc3RJdGVtc0luT3RoZXJMaXN0cy5zbmFwc2hvdExlbmd0aDsvLy1kZXNjZW5kYW50Q29udGFpbmVycy5zbmFwc2hvdExlbmd0aCtkZXNjZW5kYW50Q29udGFpbmVyczIuc25hcHNob3RMZW5ndGg7XG4gICAgICAgICAgICAgICAgaWYgKG51bUl0ZW1zID09PSAwKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICByZXR1cm4gYFske3F1b3RlTmFtZVBhZEFmdGVyKGN1cnNvcil9bWVudWJhciB3aXRoICR7bnVtSXRlbXN9IGl0ZW1zXWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIE5hdmlnYXRpb24gcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJuYXZpZ2F0aW9uXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwicmVnaW9uXCIsIFwidGFiX2ZvY3VzXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IsIF9vbGRDdXJzb3I/OiBTUkN1cnNvciwgbW9kZT86IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChtb2RlID09PSBcInRhYl9mb2N1c1wiICYmICFDb21tb25VdGlsLmlzVGFiYmFibGUoY3Vyc29yLmdldE5vZGUoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvbGVEZXNjID0gZ2V0Um9sZURlc2NyaXB0aW9uKGN1cnNvciwgXCJuYXZpZ2F0aW9uIHJlZ2lvblwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYFske3F1b3RlTmFtZVBhZEFmdGVyKGN1cnNvcil9JHtyb2xlRGVzY31dYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gUmFkaW8gZ3JvdXAgcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJyYWRpb2dyb3VwXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwicmVnaW9uXCIsIFwidGFiX2ZvY3VzXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmdldE5hbWVJbmZvKCkgPT09IG51bGwpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIHJldHVybiBgW2dyb3VwaW5nJHtxdW90ZU5hbWVQYWRCZWZvcmUoY3Vyc29yKX1dYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gUmVnaW9uIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wicmVnaW9uXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwicmVnaW9uXCIsIFwidGFiX2ZvY3VzXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IsIF9vbGRDdXJzb3I/OiBTUkN1cnNvciwgbW9kZT86IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuZ2V0TmFtZUluZm8oKSA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKG1vZGUgPT09IFwidGFiX2ZvY3VzXCIgJiYgIUNvbW1vblV0aWwuaXNUYWJiYWJsZShjdXJzb3IuZ2V0Tm9kZSgpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm9sZURlc2MgPSBnZXRSb2xlRGVzY3JpcHRpb24oY3Vyc29yLCBcInJlZ2lvblwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYFske3F1b3RlTmFtZVBhZEFmdGVyKGN1cnNvcil9JHtyb2xlRGVzY31dYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gUm93IHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wicm93XCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwidGFibGVcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoKSA9PiBcIlwiXG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIFJvd2hlYWRlciByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcInJvd2hlYWRlclwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInRhYmxlXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgcmVuZGVyRW50ZXJUYWJsZUNlbGxcbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gU2VhcmNoIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wic2VhcmNoXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwicmVnaW9uXCIsIFwidGFiX2ZvY3VzXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IsIF9vbGRDdXJzb3I/OiBTUkN1cnNvciwgbW9kZT86IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChtb2RlID09PSBcInRhYl9mb2N1c1wiICYmICFDb21tb25VdGlsLmlzVGFiYmFibGUoY3Vyc29yLmdldE5vZGUoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvbGVEZXNjID0gZ2V0Um9sZURlc2NyaXB0aW9uKGN1cnNvciwgXCJzZWFyY2ggcmVnaW9uXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX0ke3JvbGVEZXNjfV1gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBUYWJsZSByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcInRhYmxlXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwidGFibGVcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIGxldCB0YWJsZVdhbGtlciA9IGN1cnNvci5jbG9uZSgpO1xuICAgICAgICAgICAgICAgIC8vIEdldCB0byB0aGUgc3RhcnQgb2YgdGhlIHRhYmxlXG4gICAgICAgICAgICAgICAgd2hpbGUgKHRhYmxlV2Fsa2VyLmdldFJvbGUoKSAhPT0gXCJ0YWJsZVwiICYmIHRhYmxlV2Fsa2VyLnByZXZpb3VzKCgpID0+IHRydWUpKTtcbiAgICAgICAgICAgICAgICAvLyBTZXQgYW4gZW5kIHRvIHRoZSB0YWJsZVxuICAgICAgICAgICAgICAgIGxldCB0YWJsZU5vZGUgPSB0YWJsZVdhbGtlci5nZXROb2RlKCk7XG4gICAgICAgICAgICAgICAgbGV0IHJvd3MgPSAwO1xuICAgICAgICAgICAgICAgIGxldCBjb2xzID0gMDtcbiAgICAgICAgICAgICAgICAvLyBTYW5pdHkgY2hlY2sgdGhhdCB0aGUgdGFibGUgaGFzIGNvbnRlbnRcbiAgICAgICAgICAgICAgICBpZiAodGFibGVXYWxrZXIuZ2V0Tm9kZSgpLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZpcnN0Um93Q29tcGxldGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRhYmxlV2Fsa2VyLm5leHQoKCkgPT4gdHJ1ZSkgJiYgIXRhYmxlV2Fsa2VyLmdldE5vZGUoKS5pc1NhbWVOb2RlKHRhYmxlTm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJvbGUgPSB0YWJsZVdhbGtlci5nZXRSb2xlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFibGVXYWxrZXIuaXNTdGFydFRhZygpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvbGUgPT09IFwicm93XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytyb3dzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmlyc3RSb3dDb21wbGV0ZSAmJiBbXCJjZWxsXCIsIFwicm93aGVhZGVyXCIsIFwiY29sdW1uaGVhZGVyXCJdLmluY2x1ZGVzKHJvbGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGVtID0gdGFibGVXYWxrZXIuZ2V0Tm9kZSgpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29scyArPSBwYXJzZUludChlbGVtLmdldEF0dHJpYnV0ZShcImNvbHNwYW5cIikgfHwgXCIxXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyb2xlID09PSBcInJvd1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RSb3dDb21wbGV0ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgcmV0dXJuIGBbdGFibGUgd2l0aCAke3Jvd3N9ICR7cm93cyA9PT0gMSA/IFwicm93XCIgOiBcInJvd3NcIn0gYW5kICR7Y29sc30gJHtjb2xzID09PSAxID8gXCJjb2x1bW5cIiA6IFwiY29sdW1uc1wifSR7cXVvdGVOYW1lUGFkQmVmb3JlKGN1cnNvcil9XWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIFRvb2xiYXIgcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJ0b29sYmFyXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwicmVnaW9uXCIsIFwidGFiX2ZvY3VzXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IsIF9vbGRDdXJzb3I/OiBTUkN1cnNvciwgbW9kZT86IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChtb2RlID09PSBcInRhYl9mb2N1c1wiICYmICFDb21tb25VdGlsLmlzVGFiYmFibGUoY3Vyc29yLmdldE5vZGUoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX10b29sYmFyXWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIEhUTUwgRWxlbWVudCBydWxlc1xuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXSxcbiAgICAgICAgZWxlbXM6IFtcIkRMXCJdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcImxpc3RcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBjdXJzb3IuZ2V0Tm9kZSgpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlc2NlbmRhbnRMaXN0SXRlbXMgPSBkb2N1bWVudC5ldmFsdWF0ZShcIi4vL2R0XCIsIG5vZGUsIG51bGwsIFhQYXRoUmVzdWx0Lk9SREVSRURfTk9ERV9TTkFQU0hPVF9UWVBFLCBudWxsKTtcbiAgICAgICAgICAgICAgICBsZXQgbnVtSXRlbXMgPSBkZXNjZW5kYW50TGlzdEl0ZW1zLnNuYXBzaG90TGVuZ3RoO1xuICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX1kZWZpbml0aW9uIGxpc3Qgb2YgJHtudW1JdGVtc30gdGVybXNdYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtdLFxuICAgICAgICBlbGVtczogW1wiRklHQ0FQVElPTlwiXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoX2N1cnNvcjogU1JDdXJzb3IpID0+IFwiW2NhcHRpb25dXCJcbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtdLFxuICAgICAgICBlbGVtczogW1wiTUFSS1wiXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoX2N1cnNvcjogU1JDdXJzb3IpID0+IFwiW2hpZ2hsaWdodGVkXVwiXG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIE11bHRpcGxlIHJvbGVzIHJ1bGVzIC0gcGxhY2VkIGF0IHRoZSBib3R0b21cblxuICAgIC8vIEhlYWRpbmcgbW9kZSBydWxlcyAtIGlnbm9yZSBjb250YWluZXIgZWxlbWVudHMgaW4gaGVhZGluZyBtb2RlIChtdWx0aXBsZSByb2xlcylcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiYXJ0aWNsZVwiLCBcImJhbm5lclwiLCBcImJsb2NrcXVvdGVcIiwgXCJjYXB0aW9uXCIsIFwiY2VsbFwiLCBcImNvbHVtbmhlYWRlclwiLCBcbiAgICAgICAgICAgICAgICBcImNvbXBsZW1lbnRhcnlcIiwgXCJjb250ZW50aW5mb1wiLCBcImZpZ3VyZVwiLCBcImZvcm1cIiwgXCJncm91cFwiLCBcInJlZ2lvblwiLCBcbiAgICAgICAgICAgICAgICBcInJvd1wiLCBcInJvd2hlYWRlclwiLCBcInNlYXJjaFwiLCBcInRvb2xiYXJcIiwgXCJsaXN0XCIsIFwibWFpblwiLCBcIm5hdmlnYXRpb25cIiwgXCJ0YWJsZVwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaGVhZGluZ1wiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgICgpID0+IFwiXCJcbiAgICAgICAgXVxuICAgIH0pXG5dO1xuIiwiaW1wb3J0IHsgU1JSZW5kZXJlclJ1bGUgfSBmcm9tIFwiLi4vU1JSZW5kZXJlclJ1bGVcIjtcbmltcG9ydCB7IFNSQ3Vyc29yIH0gZnJvbSBcIi4uL1NSQ3Vyc29yXCI7XG5pbXBvcnQgeyBxdW90ZU5hbWVQYWRBZnRlciwgZ2V0Um9sZURlc2NyaXB0aW9uIH0gZnJvbSBcIi4vY29tbW9uXCI7XG5cbmV4cG9ydCBsZXQgUlVMRVM6IFNSUmVuZGVyZXJSdWxlW10gPSBbXG4gICAgLy8gU2luZ2xlIHJvbGUgcnVsZXMgLSBhbHBoYWJldGljYWxseSBzb3J0ZWRcbiAgICBcbiAgICAvLyBBcnRpY2xlIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiYXJ0aWNsZVwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm9sZURlc2MgPSBnZXRSb2xlRGVzY3JpcHRpb24oY3Vyc29yLCBcImFydGljbGVcIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBbb3V0IG9mICR7cm9sZURlc2N9XWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIEJhbm5lciByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImJhbm5lclwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm9sZURlc2MgPSBnZXRSb2xlRGVzY3JpcHRpb24oY3Vyc29yLCBcImJhbm5lciByZWdpb25cIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBbb3V0IG9mICR7cm9sZURlc2N9XWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIEJsb2NrcXVvdGUgcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJibG9ja3F1b3RlXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKF9jdXJzb3I6IFNSQ3Vyc29yKSA9PiBcIltvdXQgb2YgYmxvY2txdW90ZV1cIlxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBDYXB0aW9uIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiY2FwdGlvblwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChfY3Vyc29yOiBTUkN1cnNvcikgPT4gXCJbb3V0IG9mIGNhcHRpb25dXCJcbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gQ29tcGxlbWVudGFyeSByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImNvbXBsZW1lbnRhcnlcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvbGVEZXNjID0gZ2V0Um9sZURlc2NyaXB0aW9uKGN1cnNvciwgXCJjb21wbGVtZW50YXJ5IHJlZ2lvblwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYFtvdXQgb2YgJHtyb2xlRGVzY31dYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gQ29udGVudGluZm8gcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJjb250ZW50aW5mb1wiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm9sZURlc2MgPSBnZXRSb2xlRGVzY3JpcHRpb24oY3Vyc29yLCBcImNvbnRlbnQgaW5mbyByZWdpb25cIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBbb3V0IG9mICR7cm9sZURlc2N9XWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIEZpZ3VyZSByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImZpZ3VyZVwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInJlZ2lvblwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChfY3Vyc29yOiBTUkN1cnNvcikgPT4gXCJbb3V0IG9mIGZpZ3VyZV1cIlxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBGb3JtIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiZm9ybVwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInJlZ2lvblwiLCBcImZvcm1jb250cm9sXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmdldE5hbWVJbmZvKCkgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiW291dCBvZiBzZWN0aW9uXVwiO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgW291dCBvZiBmb3JtXWBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIEdyb3VwIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiZ3JvdXBcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuZ2V0TmFtZUluZm8oKSA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5nZXRDdXJyZW50T3JQYXJlbnRCeVJvbGVDbG9uZShbXCJjb21ib2JveFwiXSwgW1wic2VsZWN0XCJdKT8uZ2V0Tm9kZSgpLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiU0VMRUNUXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgcmV0dXJuIFwiW291dCBvZiBncm91cGluZ11cIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gTGlzdCByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImxpc3RcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBjdXJzb3IuZ2V0Tm9kZSgpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlc2NlbmRhbnRMaXN0SXRlbXMgPSBkb2N1bWVudC5ldmFsdWF0ZShcIi4vL2xpIHwgLi8vKltAcm9sZT0nbGlzdGl0ZW0nXVwiLCBub2RlLCBudWxsLCBYUGF0aFJlc3VsdC5PUkRFUkVEX05PREVfU05BUFNIT1RfVFlQRSwgbnVsbCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVzY2VuZGFudExpc3RJdGVtc0luT3RoZXJMaXN0cyA9IGRvY3VtZW50LmV2YWx1YXRlKFxuICAgICAgICAgICAgICAgICAgICBcIi4vL3VsLy9saXwuLy91bC8vKltAcm9sZT0nbGlzdGl0ZW0nXXwuLy9vbC8vbGl8Li8vb2wvLypbQHJvbGU9J2xpc3RpdGVtJ118Li8vKltAcm9sZT0nbGlzdCddLy9saXwuLy8qW0Byb2xlPSdsaXN0J10vLypbQHJvbGU9J2xpc3RpdGVtJ11cIixcbiAgICAgICAgICAgICAgICAgICAgbm9kZSwgbnVsbCwgWFBhdGhSZXN1bHQuT1JERVJFRF9OT0RFX1NOQVBTSE9UX1RZUEUsIG51bGwpO1xuICAgICAgICAgICAgICAgIGxldCBudW1JdGVtcyA9IGRlc2NlbmRhbnRMaXN0SXRlbXMuc25hcHNob3RMZW5ndGgtZGVzY2VuZGFudExpc3RJdGVtc0luT3RoZXJMaXN0cy5zbmFwc2hvdExlbmd0aDtcbiAgICAgICAgICAgICAgICBpZiAobnVtSXRlbXMgPT09IDApIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX1vdXQgb2YgbGlzdF1gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBNYWluIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wibWFpblwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm9sZURlc2MgPSBnZXRSb2xlRGVzY3JpcHRpb24oY3Vyc29yLCBcIm1haW4gcmVnaW9uXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBgW291dCBvZiAke3JvbGVEZXNjfV1gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBtZW51YmFyIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wibWVudWJhclwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcImxpc3RcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoX2N1cnNvcjogU1JDdXJzb3IpID0+IGBbb3V0IG9mIG1lbnViYXJdYFxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBOYXZpZ2F0aW9uIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wibmF2aWdhdGlvblwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm9sZURlc2MgPSBnZXRSb2xlRGVzY3JpcHRpb24oY3Vyc29yLCBcIm5hdmlnYXRpb24gcmVnaW9uXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBgW291dCBvZiAke3JvbGVEZXNjfV1gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyByYWRpb2dyb3VwIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wicmFkaW9ncm91cFwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInJlZ2lvblwiLCBcInRhYl9mb2N1c1wiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChfY3Vyc29yOiBTUkN1cnNvcikgPT4gXCJbb3V0IG9mIGdyb3VwaW5nXVwiXG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIFJlZ2lvbiByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcInJlZ2lvblwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5nZXROYW1lSW5mbygpID09PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICBjb25zdCByb2xlRGVzYyA9IGdldFJvbGVEZXNjcmlwdGlvbihjdXJzb3IsIFwicmVnaW9uXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBgW291dCBvZiAke3JvbGVEZXNjfV1gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBTZWFyY2ggcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJzZWFyY2hcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvbGVEZXNjID0gZ2V0Um9sZURlc2NyaXB0aW9uKGN1cnNvciwgXCJzZWFyY2ggcmVnaW9uXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBgW291dCBvZiAke3JvbGVEZXNjfV1gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBUYWJsZSByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcInRhYmxlXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKF9jdXJzb3I6IFNSQ3Vyc29yKSA9PiBcIltvdXQgb2YgdGFibGVdXCJcbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gVG9vbGJhciByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcInRvb2xiYXJcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoX2N1cnNvcjogU1JDdXJzb3IpID0+IGBbb3V0IG9mIHRvb2xiYXJdYFxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBIVE1MIEVsZW1lbnQgcnVsZXNcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW10sXG4gICAgICAgIGVsZW1zOiBbXCJBQkJSXCJdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiBjdXJzb3IuZ2V0RWxlbWVudCgpLmhhc0F0dHJpYnV0ZShcInRpdGxlXCIpID8gXG4gICAgICAgICAgICAgICAgYFske2N1cnNvci5nZXRFbGVtZW50KCkuZ2V0QXR0cmlidXRlKFwidGl0bGVcIil9XWAgOiBudWxsXG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXSxcbiAgICAgICAgZWxlbXM6IFtcIkRMXCJdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChfY3Vyc29yOiBTUkN1cnNvcikgPT4gYFtvdXQgb2YgZGVmaW5pdGlvbiBsaXN0XWBcbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtdLFxuICAgICAgICBlbGVtczogW1wiRklHQ0FQVElPTlwiXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoX2N1cnNvcjogU1JDdXJzb3IpID0+IGBbb3V0IG9mIGNhcHRpb25dYFxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW10sXG4gICAgICAgIGVsZW1zOiBbXCJNQVJLXCJdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChfY3Vyc29yOiBTUkN1cnNvcikgPT4gYFtvdXQgb2YgaGlnaGxpZ2h0ZWRdYFxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBNdWx0aXBsZSByb2xlcyBydWxlcyAtIHBsYWNlZCBhdCB0aGUgYm90dG9tXG4gICAgXG4gICAgLy8gUmVnaW9uIG1vZGUgcnVsZXMgLSBpZ25vcmUgY29udGFpbmVyIGVsZW1lbnRzIGluIHJlZ2lvbiBhbmQgaGVhZGluZyBtb2RlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImdyb3VwXCIsIFwiYXJ0aWNsZVwiLCBcImJhbm5lclwiLCBcImJsb2NrcXVvdGVcIiwgXCJjYXB0aW9uXCIsIFwiY29tcGxlbWVudGFyeVwiLCBcbiAgICAgICAgICAgICAgICBcImNvbnRlbnRpbmZvXCIsIFwiZmlndXJlXCIsIFwiZm9ybVwiLCBcImxpc3RcIiwgXCJyZWdpb25cIiwgXCJtYWluXCIsIFwibmF2aWdhdGlvblwiLCBcbiAgICAgICAgICAgICAgICBcInNlYXJjaFwiLCBcInRhYmxlXCIsIFwidG9vbGJhclwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wicmVnaW9uXCIsIFwiaGVhZGluZ1wiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgICgpID0+IFwiXCJcbiAgICAgICAgXVxuICAgIH0pLFxuXTtcbiIsImltcG9ydCB7IFJVTEVTIGFzIFNSUnVsZXMgfSBmcm9tIFwiLi9jb21tb25cIjtcbmltcG9ydCB7IFJVTEVTIGFzIENvbnRhaW5lckVudGVyUnVsZXMgfSBmcm9tIFwiLi9jb250YWluZXJfZW50ZXJcIjtcbmltcG9ydCB7IFJVTEVTIGFzIENvbnRhaW5lckV4aXRSdWxlcyB9IGZyb20gXCIuL2NvbnRhaW50ZXJfZXhpdFwiO1xuZXhwb3J0IGxldCBTUl9SVUxFUyA9IFNSUnVsZXM7XG5leHBvcnQgbGV0IENPTlRBSU5FUl9FTlRFUl9SVUxFUyA9IENvbnRhaW5lckVudGVyUnVsZXM7XG5leHBvcnQgbGV0IENPTlRBSU5FUl9FWElUX1JVTEVTID0gQ29udGFpbmVyRXhpdFJ1bGVzO1xuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBBUklBRGVmaW5pdGlvbnMgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBRGVmaW5pdGlvbnNcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4vVmlzVXRpbFwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4vQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuaW1wb3J0IHsgRE9NVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NVXRpbFwiO1xuXG50eXBlIEVsZW1DYWxjID0gKGVsZW06IEVsZW1lbnQpID0+IHN0cmluZztcbnR5cGUgTm9kZUNhbGMgPSAobm9kZTogTm9kZSkgPT4gc3RyaW5nO1xuXG5leHBvcnQgdHlwZSBBY2Nlc3NpYmxlTmFtZVJlc3VsdCA9IHtcbiAgICBuYW1lOiBzdHJpbmcsIFxuICAgIG5hbWVGcm9tOiBcImFyaWFMYWJlbFwiIHwgXCJ0aXRsZVwiIHwgXCJwbGFjZWhvbGRlclwiIHwgXCJsYWJlbFwiIFxuICAgICAgICB8IFwidmFsdWVcIiB8IFwiaW50ZXJuYWxcIiB8IFwiYWx0XCIgfCBcInRleHRcIiB8IFwibGVnZW5kXCIgXG4gICAgICAgIHwgXCJzdW1tYXJ5XCIgfCBcImZpZ2NhcHRpb25cIiB8IFwiY2FwdGlvblwiXG4gICAgICAgIHwgXCJzaGFkb3dcIiB8IFwic2xvdFwiIHwgXCJzaGFkb3ctaG9zdFwiIHwgXCJjb250ZW50LXNsb3RcIlxuICAgICAgICB8IFwiY29udGVudFwiXG4gICAgICAgIHwgXCJzdmdsaW5rVGl0bGVcIiB8IFwic3ZnVGl0bGVcIiB8IFwic3ZnVGV4dFwiIHwgXCJzdmdEZXNjXCJcbiAgICAgICAgfCBcImFyaWEtZGVzY3JpcHRpb25cIlxuICAgICAgICB8IHN0cmluZyAvLyBjc3MtKlxufVxuZXhwb3J0IGNsYXNzIEFjY05hbWVVdGlsIHtcbiAgICAvKipcbiAgICAgKiBDb21wdXRlcyB0aGUgYWNjZXNzaWJsZSBuYW1lIGZvciBhbiBTVkcgZWxlbWVudCBhY2NvcmRpbmcgdG8gVzNDIHNwZWNpZmljYXRpb25cbiAgICAgKiBGb2xsb3dpbmcgdGhlIEFjY2Vzc2libGUgTmFtZSBhbmQgRGVzY3JpcHRpb24gQ29tcHV0YXRpb24gMS4xIGFsZ29yaXRobVxuICAgICAqIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9hY2NuYW1lLTEuMS9cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gZWxlbSBUaGUgU1ZHIGVsZW1lbnRcbiAgICAgKiBAcmV0dXJucyBUaGUgYWNjZXNzaWJsZSBuYW1lIHJlc3VsdCBvciBudWxsIGlmIG5vIGFjY2Vzc2libGUgbmFtZSBpcyBmb3VuZFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgY29tcHV0ZUFjY2Vzc2libGVOYW1lRm9yU1ZHRWxlbWVudFczQyhlbGVtOiBFbGVtZW50KTogQWNjZXNzaWJsZU5hbWVSZXN1bHQgfCBudWxsIHtcbiAgICAgICAgaWYgKCFlbGVtIHx8IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gJ3N2ZycpIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIFN0ZXAgMTogQ2hlY2sgZm9yIGFyaWEtbGFiZWxsZWRieSAoYWxyZWFkeSBoYW5kbGVkIGJ5IG1haW4gY29tcHV0ZUFjY2Vzc2libGVOYW1lIGZ1bmN0aW9uKVxuICAgICAgICAvLyBTdGVwIDI6IENoZWNrIGZvciBhcmlhLWxhYmVsIChhbHJlYWR5IGhhbmRsZWQgYnkgbWFpbiBjb21wdXRlQWNjZXNzaWJsZU5hbWUgZnVuY3Rpb24pXG5cbiAgICAgICAgLy8gU3RlcCAzOiBDaGVjayBmb3IgdGl0bGUgZWxlbWVudFxuICAgICAgICBjb25zdCBzdmdUaXRsZXMgPSBlbGVtLnF1ZXJ5U2VsZWN0b3JBbGwoXCI6c2NvcGUgPiB0aXRsZVwiKTtcbiAgICAgICAgaWYgKHN2Z1RpdGxlcyAmJiBzdmdUaXRsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGV0IHRleHQgPSBcIlwiO1xuICAgICAgICAgICAgc3ZnVGl0bGVzLmZvckVhY2goc3ZnVGl0bGUgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChzdmdUaXRsZSAmJiAhVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQoc3ZnVGl0bGUpICYmICFWaXNVdGlsLmlzTm9kZVByZXNlbnRhdGlvbmFsKHN2Z1RpdGxlKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0aXRsZSA9IHN2Z1RpdGxlLnRleHRDb250ZW50O1xuICAgICAgICAgICAgICAgICAgICBpZiAodGl0bGUgJiYgdGl0bGUudHJpbSgpICE9PSAnJylcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgKz0gdGl0bGUudHJpbSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHRleHQgJiYgdGV4dC50cmltKCkgIT09ICcnKVxuICAgICAgICAgICAgICAgIHJldHVybiB7IFwibmFtZVwiOiB0ZXh0LnRyaW0oKSwgXCJuYW1lRnJvbVwiOiBcInN2Z1RpdGxlXCIgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0ZXAgNDogQ2hlY2sgZm9yIHRleHQgY29udGVudCBpbiBTVkcgdGV4dCBlbGVtZW50c1xuICAgICAgICBsZXQgdGV4dENvbnRlbnQgPSBcIlwiO1xuICAgICAgICBjb25zdCB0ZXh0RWxlbWVudHMgPSBlbGVtLnF1ZXJ5U2VsZWN0b3JBbGwoXCJ0ZXh0LCB0ZXh0UGF0aCwgdHNwYW5cIik7XG4gICAgICAgIGlmICh0ZXh0RWxlbWVudHMgJiYgdGV4dEVsZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRleHRFbGVtZW50cy5mb3JFYWNoKHRleHRFbGVtZW50ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHRleHRFbGVtZW50KSAmJiAhVmlzVXRpbC5pc05vZGVQcmVzZW50YXRpb25hbCh0ZXh0RWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGVudCA9IHRleHRFbGVtZW50LnRleHRDb250ZW50O1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudCAmJiBjb250ZW50LnRyaW0oKSAhPT0gJycpXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0Q29udGVudCArPSBcIiBcIiArIGNvbnRlbnQudHJpbSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHRleHRDb250ZW50LnRyaW0oKSAhPT0gJycpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgXCJuYW1lXCI6IENvbW1vblV0aWwudHJ1bmNhdGVUZXh0KHRleHRDb250ZW50LnRyaW0oKSksIFwibmFtZUZyb21cIjogXCJzdmdUZXh0XCIgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0ZXAgNTogQ2hlY2sgZm9yIHhsaW5rOnRpdGxlIGF0dHJpYnV0ZSBvbiBsaW5rcyB3aXRoaW4gU1ZHXG4gICAgICAgIGNvbnN0IGxpbmtzID0gZWxlbS5xdWVyeVNlbGVjdG9yQWxsKFwiYVwiKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5rcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgbGluayA9IGxpbmtzW2ldO1xuICAgICAgICAgICAgaWYgKCFWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChsaW5rKSAmJiAhVmlzVXRpbC5pc05vZGVQcmVzZW50YXRpb25hbChsaW5rKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHhsaW5rVGl0bGUgPSBsaW5rLmdldEF0dHJpYnV0ZShcInhsaW5rOnRpdGxlXCIpO1xuICAgICAgICAgICAgICAgIGlmICh4bGlua1RpdGxlICYmIHhsaW5rVGl0bGUudHJpbSgpICE9PSAnJylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgXCJuYW1lXCI6IENvbW1vblV0aWwudHJ1bmNhdGVUZXh0KHhsaW5rVGl0bGUpLCBcIm5hbWVGcm9tXCI6IFwic3ZnbGlua1RpdGxlXCIgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0ZXAgNjogQ2hlY2sgZm9yIGFyaWEtZGVzY3JpYmVkYnkgb3IgYXJpYS1kZXNjcmlwdGlvblxuICAgICAgICBsZXQgZGVzY3JpcHRpb24gPSBBcmlhVXRpbC5nZXRBcmlhRGVzY3JpcHRpb24oZWxlbSk7XG4gICAgICAgIGlmIChkZXNjcmlwdGlvbiAmJiBkZXNjcmlwdGlvbi50cmltKCkgIT09ICcnKVxuICAgICAgICAgICAgcmV0dXJuIHsgXCJuYW1lXCI6IENvbW1vblV0aWwudHJ1bmNhdGVUZXh0KGRlc2NyaXB0aW9uKSwgXCJuYW1lRnJvbVwiOiBcImFyaWEtZGVzY3JpcHRpb25cIiB9O1xuXG4gICAgICAgIC8vIFN0ZXAgNzogQ2hlY2sgZm9yIGRlc2MgZWxlbWVudFxuICAgICAgICBjb25zdCBkZXNjRWxlbWVudHMgPSBlbGVtLnF1ZXJ5U2VsZWN0b3JBbGwoXCI6c2NvcGUgPiBkZXNjXCIpO1xuICAgICAgICBpZiAoZGVzY0VsZW1lbnRzICYmIGRlc2NFbGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsZXQgZGVzY1RleHQgPSBcIlwiO1xuICAgICAgICAgICAgZGVzY0VsZW1lbnRzLmZvckVhY2goZGVzY0VsZW1lbnQgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQoZGVzY0VsZW1lbnQpICYmICFWaXNVdGlsLmlzTm9kZVByZXNlbnRhdGlvbmFsKGRlc2NFbGVtZW50KSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXNjID0gZGVzY0VsZW1lbnQudGV4dENvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkZXNjICYmIGRlc2MudHJpbSgpICE9PSAnJylcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NUZXh0ICs9IFwiIFwiICsgZGVzYy50cmltKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoZGVzY1RleHQudHJpbSgpICE9PSAnJylcbiAgICAgICAgICAgICAgICByZXR1cm4geyBcIm5hbWVcIjogZGVzY1RleHQudHJpbSgpLCBcIm5hbWVGcm9tXCI6IFwic3ZnRGVzY1wiIH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdGVwIDg6IENoZWNrIGZvciB0aXRsZSBhdHRyaWJ1dGVcbiAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwidGl0bGVcIikpIHtcbiAgICAgICAgICAgIGNvbnN0IHRpdGxlID0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJ0aXRsZVwiKTtcbiAgICAgICAgICAgIGlmICh0aXRsZSAmJiB0aXRsZS50cmltKCkgIT09ICcnKVxuICAgICAgICAgICAgICAgIHJldHVybiB7IFwibmFtZVwiOiBDb21tb25VdGlsLnRydW5jYXRlVGV4dCh0aXRsZSksIFwibmFtZUZyb21cIjogXCJ0aXRsZVwiIH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBObyBhY2Nlc3NpYmxlIG5hbWUgZm91bmRcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gY2FsY3VsYXRlIGFjY2Vzc2libGUgbmFtZSBmb3IgYSBnaXZlbiBub2RlXG4gICAgcHVibGljIHN0YXRpYyBjb21wdXRlQWNjZXNzaWJsZU5hbWUoZWxlbTogRWxlbWVudCkgOiBBY2Nlc3NpYmxlTmFtZVJlc3VsdCB8IG51bGwge1xuICAgICAgICBpZiAoIWVsZW0pIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCBub2RlTmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICBsZXQgbmFtZV9wYWlyID0gQ2FjaGVVdGlsLmdldENhY2hlKGVsZW0sIFwiRUxFTUVOVF9BQ0NFU1NCTEVfTkFNRVwiLCB1bmRlZmluZWQpO1xuICAgICAgICBpZiAobmFtZV9wYWlyICE9PSB1bmRlZmluZWQpIHJldHVybiBuYW1lX3BhaXI7XG5cbiAgICAgICAgLy8gMS4gbmFtZSBmcm9tIGF1dGhvciwgb3IgZWxlbWVudHMgd2l0aG91dCBhIHJvbGUgYnV0IHdpdGggYXJpYS1sYWJlbGxlZGJ5IG9yIGFyaWEtbGFiZWwgXG4gICAgICAgIC8vICAgZ2V0IGFyaWEgbGFiZWwgZXZlbiBmb3IgdGhlIHJvbGUgd2hlcmUgdGhlIG5hbWUgaXMgcHJvaGliaXRlZCBvciBpcyAncHJlc2VudGF0aW9uJyBvciAnbm9uZSdcbiAgICAgICAgbGV0IGFjY05hbWUgPSBBcmlhVXRpbC5nZXRBcmlhTGFiZWwoZWxlbSk7XG4gICAgICAgIGlmIChhY2NOYW1lICYmIGFjY05hbWUudHJpbSgpICE9PSBcIlwiKSB7XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJFTEVNRU5UX0FDQ0VTU0JMRV9OQU1FXCIsIHtcIm5hbWVcIjpDb21tb25VdGlsLnRydW5jYXRlVGV4dChhY2NOYW1lKSwgXCJuYW1lRnJvbVwiOiBcImFyaWFMYWJlbFwifSk7XG4gICAgICAgICAgICByZXR1cm4ge1wibmFtZVwiOkNvbW1vblV0aWwudHJ1bmNhdGVUZXh0KGFjY05hbWUpLCBcIm5hbWVGcm9tXCI6IFwiYXJpYUxhYmVsXCJ9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gMi4gYWNjZXNzaWJsZSBuYW1lIG1hcHBpbmcgZm9yIG5hdGl2ZSBodG1sIGVsZW1lbnRzXG4gICAgICAgIG5hbWVfcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZUZvck5hdGl2ZUVsZW1lbnQoZWxlbSk7XG4gICAgICAgIGlmIChuYW1lX3BhaXIpIHtcbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIkVMRU1FTlRfQUNDRVNTQkxFX05BTUVcIiwgbmFtZV9wYWlyKTtcbiAgICAgICAgICAgIHJldHVybiBuYW1lX3BhaXI7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIDMuIG5hbWUgZnJvbSBuYXRpdmUgb3IgYXJpYSBhdHRyaWJ1dGVcbiAgICAgICAgLyoqbmFtZV9wYWlyID0gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lRnJvbUF0dHJpYnV0ZShlbGVtKTtcbiAgICAgICAgaWYgKG5hbWVfcGFpcikge1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiRUxFTUVOVF9BQ0NFU1NCTEVfTkFNRVwiLCBuYW1lX3BhaXIpO1xuICAgICAgICAgICAgcmV0dXJuIG5hbWVfcGFpcjtcbiAgICAgICAgfSovXG5cbiAgICAgICAgLy8gNC4gbmFtZSBmcm9tIGNvbnRlbnQgZm9yIGN1c3RvbSBlbGVtZW50cyB3aXRoIGEgcm9sZVxuICAgICAgICBjb25zdCByb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKGVsZW0pO1xuICAgICAgICBpZiAoQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVdICYmIEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlXS5uYW1lRnJvbS5pbmNsdWRlcyhcImNvbnRlbnRzXCIpKSB7XG4gICAgICAgICAgICBuYW1lX3BhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWVGcm9tQ29udGVudChlbGVtKTtcbiAgICAgICAgICAgIGlmIChuYW1lX3BhaXIpIHtcbiAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJFTEVNRU5UX0FDQ0VTU0JMRV9OQU1FXCIsIG5hbWVfcGFpcik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5hbWVfcGFpcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDUuIG5hbWUgZnJvbSB0aGUgZ2xvYmFsIGF0dHJpYnV0ZSBcInRpdGxlXCJcbiAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwidGl0bGVcIikpIHtcbiAgICAgICAgICAgIGxldCB0aXRsZSA9IGVsZW0uZ2V0QXR0cmlidXRlKFwidGl0bGVcIikudHJpbSgpO1xuICAgICAgICAgICAgaWYgKHRpdGxlICYmIHRpdGxlLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdGl0bGUgPSBDb21tb25VdGlsLnRydW5jYXRlVGV4dCh0aXRsZSk7XG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiRUxFTUVOVF9BQ0NFU1NCTEVfTkFNRVwiLCB7XCJuYW1lXCI6dGl0bGUsIFwibmFtZUZyb21cIjogXCJ0aXRsZVwifSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjp0aXRsZSwgXCJuYW1lRnJvbVwiOiBcInRpdGxlXCJ9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyA2LiBuYW1lIGZyb20gdGhlIGF0dHJpYnV0ZSBcInBsYWNlaG9sZGVyXCJcbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSAndGV4dGFyZWEnIHx8IChub2RlTmFtZSA9PT0gJ2lucHV0JyAmJiAoIWVsZW0uaGFzQXR0cmlidXRlKFwidHlwZVwiKSB8fCBDb21tb25VdGlsLmlucHV0X3R5cGVfd2l0aF9wbGFjZWhvbGRlci5pbmNsdWRlcyhlbGVtLmdldEF0dHJpYnV0ZShcInR5cGVcIikpKSkpIHtcbiAgICAgICAgICAgIGxldCBwbGFjZWhvbGRlciA9IGVsZW0uZ2V0QXR0cmlidXRlKFwicGxhY2Vob2xkZXJcIik7XG4gICAgICAgICAgICBpZiAocGxhY2Vob2xkZXIgJiYgcGxhY2Vob2xkZXIudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlciA9IENvbW1vblV0aWwudHJ1bmNhdGVUZXh0KHBsYWNlaG9sZGVyKTtcbiAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJFTEVNRU5UX0FDQ0VTU0JMRV9OQU1FXCIsIHtcIm5hbWVcIjpwbGFjZWhvbGRlciwgXCJuYW1lRnJvbVwiOiBcInBsYWNlaG9sZGVyXCJ9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1wibmFtZVwiOnBsYWNlaG9sZGVyLCBcIm5hbWVGcm9tXCI6IFwicGxhY2Vob2xkZXJcIn07XG4gICAgICAgICAgICB9ICAgIFxuICAgICAgICB9XG5cbiAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiRUxFTUVOVF9BQ0NFU1NCTEVfTkFNRVwiLCBudWxsKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gY2FsY3VsYXRlIGFjY2Vzc2libGUgbmFtZSBmb3IgbmF0aXZlIGVsZW1lbnRzXG4gICAgcHVibGljIHN0YXRpYyBjb21wdXRlQWNjZXNzaWJsZU5hbWVGb3JOYXRpdmVFbGVtZW50KGVsZW06IEVsZW1lbnQpIDogQWNjZXNzaWJsZU5hbWVSZXN1bHQgfCBudWxsIHtcbiAgICAgICAgY29uc3Qgbm9kZU5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIFxuICAgICAgICAvLyBsYWJlbGxhYmxlIGZpZWxkc1xuICAgICAgICBpZiAoQ29tbW9uVXRpbC5mb3JtX2xhYmVsYWJsZV9lbGVtZW50cy5pbmNsdWRlcyhub2RlTmFtZSkpIHtcbiAgICAgICAgICAgIC8vIEdldCBvbmx5IHRoZSBub24taGlkZGVuIGxhYmVscyBmb3IgZWxlbWVudFxuICAgICAgICAgICAgY29uc3QgbGFiZWwgPSBDb21tb25VdGlsLmdldEZvcm1GaWVsZExhYmVsKGVsZW0pO1xuICAgICAgICAgICAgaWYgKGxhYmVsICYmIGxhYmVsLnRyaW0oKSAhPT0gJycpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjpDb21tb25VdGlsLnRydW5jYXRlVGV4dChsYWJlbCksIFwibmFtZUZyb21cIjogXCJsYWJlbFwifTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlucHV0IHR5cGVzOiBidXR0b24sIHJlc2V0LCBzdWJtaXQsIGltYWdlXG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJpbnB1dFwiICYmIGVsZW0uaGFzQXR0cmlidXRlKFwidHlwZVwiKSkgeyBcbiAgICAgICAgICAgIGlmIChDb21tb25VdGlsLmZvcm1fYnV0dG9uX3R5cGVzLmluY2x1ZGVzKGVsZW0uZ2V0QXR0cmlidXRlKFwidHlwZVwiKSkpIHtcbiAgICAgICAgICAgICAgICAvLyBpbnB1dCB0eXBlczogYnV0dG9uLCByZXNldCwgc3VibWl0XG4gICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBcInZhbHVlXCIgYXR0cmlidXRlIGZvciB0aGUgZWxlbWVudFxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gQ29tbW9uVXRpbC5nZXRFbGVtZW50QXR0cmlidXRlKGVsZW0sIFwidmFsdWVcIik7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlICYmIHZhbHVlLnRyaW0oKSAhPT0gJycpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XCJuYW1lXCI6Q29tbW9uVXRpbC50cnVuY2F0ZVRleHQodmFsdWUpLCBcIm5hbWVGcm9tXCI6IFwidmFsdWVcIn07XG5cbiAgICAgICAgICAgICAgICAvLyBpbnB1dCAnc3VibWl0JyBhbmQgJ3Jlc2V0JyBoYXZlIHZpc2libGUgZGVmYXVsdHMgc28gcGFzcyBpZiB0aGVyZSBpcyBubyBleHBsaWNpdCAndmFsdWUnIGF0dHJpYnV0ZVxuICAgICAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBlbGVtLmdldEF0dHJpYnV0ZShcInR5cGVcIik7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdzdWJtaXQnIHx8IHR5cGUgPT09ICdyZXNldCcpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XCJuYW1lXCI6dHlwZSwgXCJuYW1lRnJvbVwiOiBcImludGVybmFsXCJ9O1xuXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW0uZ2V0QXR0cmlidXRlKFwidHlwZVwiKSA9PT0gJ2ltYWdlJykge1xuICAgICAgICAgICAgICAgIC8vIGlucHV0IHR5cGUgPSAnaW1hZ2UnXG4gICAgICAgICAgICAgICAgLy8gbm90ZSB0aGF0IHRob3VnaCBIVE1MIDUgc3BlYyBpbmRpY2F0ZXMgXCJUaGUgZWxlbWVudCdzIFt2YWx1ZV0gYXR0cmlidXRlIG11c3QgYmUgb21pdHRlZFwiLCBDaHJvbWUgdXNlcyB0aGUgdmFsdWUuXG4gICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBhY2Nlc3NpYmxlIG5hbWUgZm9yIHRoZSBhbHQgYXR0cmlidXRlXG4gICAgICAgICAgICAgICAgY29uc3QgYWx0ID0gQ29tbW9uVXRpbC5nZXRFbGVtZW50QXR0cmlidXRlKGVsZW0sIFwiYWx0XCIpO1xuICAgICAgICAgICAgICAgIGlmIChhbHQgJiYgYWx0LnRyaW0oKSAhPT0gJycpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XCJuYW1lXCI6Q29tbW9uVXRpbC50cnVuY2F0ZVRleHQoYWx0KSwgXCJuYW1lRnJvbVwiOiBcImFsdFwifTs7XG5cbiAgICAgICAgICAgICAgICAvLyB0aGUgdmlzaWJsZSBkZWZhdWx0IHRleHQgZm9yIHR5cGUgXCJpbWFnZVwiIGlzIFwiU3VibWl0XCIgc2FtZSB3aXRoIHRoZSB0eXBlIFwic3VibWl0XCJcbiAgICAgICAgICAgICAgICAvL3JldHVybiB7XCJuYW1lXCI6ZWxlbS5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpLCBcIm5hbWVGcm9tXCI6IFwiaW50ZXJuYWxcIn07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBidXR0b25cbiAgICAgICAgLy8gbm90ZSBidXR0b24gbWF5IGhhdmUgYSB2YWx1ZSBhdHRyaWJ1dGUsIGJ1dCBpdCdzIG5vdCBhIHZpc2libGUgdGV4dFxuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwiYnV0dG9uXCIpIHtcbiAgICAgICAgICAgIC8vIGZpcnN0IHVzZSB0aGUgYnV0dG9uIHRleHRcbiAgICAgICAgICAgIGNvbnN0IHRleHQgPSAoZWxlbSBhcyBIVE1MRWxlbWVudCkuaW5uZXJUZXh0O1xuICAgICAgICAgICAgaWYgKHRleHQgJiYgdGV4dC50cmltKCkgIT09ICcnKVxuICAgICAgICAgICAgICAgIHJldHVybiB7XCJuYW1lXCI6Q29tbW9uVXRpbC50cnVuY2F0ZVRleHQodGV4dCksIFwibmFtZUZyb21cIjogXCJ0ZXh0XCJ9O1xuXG4gICAgICAgICAgICAvLyBmb3IgaW1hZ2UgYnV0dG9uOiBnZXQgdGhlIGZpcnN0IGltYWdlIGlmIGV4aXN0c1xuICAgICAgICAgICAgY29uc3QgaW1hZ2UgPSBlbGVtLnF1ZXJ5U2VsZWN0b3IoJ2ltZycpO1xuICAgICAgICAgICAgaWYgKGltYWdlICYmICFWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChpbWFnZSkgJiYgIVZpc1V0aWwuaXNOb2RlUHJlc2VudGF0aW9uYWwoaW1hZ2UpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHBhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWUoaW1hZ2UpOyBcbiAgICAgICAgICAgICAgICBpZiAocGFpciAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwKSBcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhaXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIGZvciBhIGJ1dHRvbiB3aXRoIGEgc3ZnIGltYWdlXG4gICAgICAgICAgICBjb25zdCBzdmcgPSBlbGVtLnF1ZXJ5U2VsZWN0b3IoJ3N2ZycpO1xuICAgICAgICAgICAgaWYgKHN2ZyAmJiAhVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQoc3ZnKSAmJiAhVmlzVXRpbC5pc05vZGVQcmVzZW50YXRpb25hbChzdmcpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHBhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWUoc3ZnKTtcbiAgICAgICAgICAgICAgICBpZiAocGFpciAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwKSBcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhaXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBmaWVsZHNldFxuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwiZmllbGRzZXRcIikge1xuICAgICAgICAgICAgLy8gaWYgdGhlIGZpZWxkc2V0IGVsZW1lbnQncyBmaXJzdCBjaGlsZCBpcyBhIGxlZ2VuZCBlbGVtZW50LCB0aGVuIHVzZSB0aGUgc3VidHJlZSBvZiB0aGUgbGVnZW5kXG4gICAgICAgICAgICBjb25zdCBmaXJzdCA9IGVsZW0uZmlyc3RFbGVtZW50Q2hpbGQ7XG4gICAgICAgICAgICBpZiAoZmlyc3QgJiYgZmlyc3Qubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2xlZ2VuZCcpIHtcbiAgICAgICAgICAgICAgICAvLyBsZWdlbmQgY2FuIGJlIG1peGVkIHRleHRcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXh0ID0gKGZpcnN0IGFzIEhUTUxFbGVtZW50KS5pbm5lclRleHQ7XG4gICAgICAgICAgICAgICAgaWYgKHRleHQgJiYgdGV4dC50cmltKCkubGVuZ3RoID4gMCkgXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XCJuYW1lXCI6Q29tbW9uVXRpbC50cnVuY2F0ZVRleHQodGV4dCksIFwibmFtZUZyb21cIjogXCJsZWdlbmRcIn07IFxuICAgICAgICAgICAgfSAgICAgICAgXG4gICAgICAgIH1cblxuICAgICAgICAvLyBvdXRwdXRcbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSBcIm91dHB1dFwiKSB7XG4gICAgICAgICAgICAvLyBpZiB0aGUgYXNzb2NpYXRlZCBsYWJlbCBlbGVtZW50IGV4aXN0cywgdXNlIGNvbmNhdGVuYXRlZCBhY2Nlc3NpYmxlIG5hbWUocykgZnJvbSBsYWJlbGxlZCBlbGVtZW50cy5cbiAgICAgICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcImZvclwiKSkge1xuICAgICAgICAgICAgICAgIGxldCBsYWJlbElEcyA9IGVsZW0uZ2V0QXR0cmlidXRlKFwiZm9yXCIpLnRyaW0oKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICAgICAgaWYgKGxhYmVsSURzICYmIGxhYmVsSURzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBsYWJlbElEcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsTm9kZSA9IGVsZW0ub3duZXJEb2N1bWVudC5nZXRFbGVtZW50QnlJZChsYWJlbElEc1tqXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFiZWxOb2RlICYmICFET01VdGlsLnNhbWVOb2RlKGxhYmVsTm9kZSwgZWxlbSkgJiYgIVZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKGxhYmVsTm9kZSkgJiYgIVZpc1V0aWwuaXNOb2RlUHJlc2VudGF0aW9uYWwobGFiZWxOb2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWUobGFiZWxOb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFpciAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwKSBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgKz0gXCIgXCIgKyBDb21tb25VdGlsLm5vcm1hbGl6ZVNwYWNpbmcocGFpci5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAobGFiZWwudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1wibmFtZVwiOkNvbW1vblV0aWwudHJ1bmNhdGVUZXh0KGxhYmVsKSwgXCJuYW1lRnJvbVwiOiBcImxhYmVsXCJ9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gICAgICAgXG4gICAgICAgIH1cblxuICAgICAgICAvLyBzdW1tYXJ5XG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJzdW1tYXJ5XCIpIHtcbiAgICAgICAgICAgIC8vIHVzZSBzdW1tYXJ5IGVsZW1lbnQgc3VidHJlZVxuICAgICAgICAgICAgY29uc3QgdGV4dCA9IChlbGVtIGFzIEhUTUxFbGVtZW50KS5pbm5lclRleHQ7XG4gICAgICAgICAgICBpZiAodGV4dCAmJiB0ZXh0LnRyaW0oKS5sZW5ndGggPiAwKSBcbiAgICAgICAgICAgICAgICByZXR1cm4ge1wibmFtZVwiOkNvbW1vblV0aWwudHJ1bmNhdGVUZXh0KHRleHQpLCBcIm5hbWVGcm9tXCI6IFwibGVnZW5kXCJ9OyAgICAgICAgIFxuICAgICAgICB9XG5cbiAgICAgICAgLy8gZGV0YWlsc1xuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwiZGV0YWlsc1wiKSB7XG4gICAgICAgICAgICBjb25zdCBmaXJzdCA9IGVsZW0uZmlyc3RFbGVtZW50Q2hpbGQ7XG4gICAgICAgICAgICBpZiAoZmlyc3QgJiYgZmlyc3Qubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ3N1bW1hcnknKSB7XG4gICAgICAgICAgICAgICAgLy8gZ2V0IGFjY2Vzc2libGUgbmFtZSBmcm9tIHN1bW1hcnlcbiAgICAgICAgICAgICAgICBjb25zdCBwYWlyID0gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lKGZpcnN0KTtcbiAgICAgICAgICAgICAgICBpZiAocGFpciAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwKSBcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjpDb21tb25VdGlsLnRydW5jYXRlVGV4dChwYWlyLm5hbWUudHJpbSgpKSwgXCJuYW1lRnJvbVwiOiBcInN1bW1hcnlcIn07IFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSWYgbm8gc3VtbWFyeSBlbGVtZW50IGFzIGEgZGlyZWN0IGNoaWxkIG9mIHRoZSBkZXRhaWxzIGVsZW1lbnQsIFxuICAgICAgICAgICAgLy8gdGhlIHVzZXIgYWdlbnQgc2hvdWxkIHByb3ZpZGUgb25lIHdpdGggYSBzdWJ0cmVlIGNvbnRhaW5pbmcgYSBsb2NhbGl6ZWQgc3RyaW5nIG9mIHRoZSB3b3JkIFwiZGV0YWlsc1wiLlxuICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjpcImRldGFpbHNcIiwgXCJuYW1lRnJvbVwiOiBcImludGVybmFsXCJ9OyAgICAgICAgIFxuICAgICAgICB9XG5cbiAgICAgICAgLy8gZmlndXJlXG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJmaWd1cmVcIikge1xuICAgICAgICAgICAgLy8gaWYgdGhlIGZpZ3VyZSBlbGVtZW50IGhhcyBhIGZpZ2NhcHRpb24gYXMgYSBjaGlsZFxuICAgICAgICAgICAgbGV0IGNhcHRpb24gPSBDb21tb25VdGlsLmdldENoaWxkQnlUYWdIaWRkZW4oZWxlbSwgXCJmaWdjYXB0aW9uXCIsIHRydWUsIGZhbHNlKTtcbiAgICAgICAgICAgIGlmIChjYXB0aW9uICYmIGNhcHRpb24ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIC8vIGZpZ2NhcHRpb24gY2FuIGJlIG1peGVkIHRleHRcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXh0ID0gKGNhcHRpb25bMF0gYXMgSFRNTEVsZW1lbnQpLmlubmVyVGV4dDtcbiAgICAgICAgICAgICAgICBpZiAodGV4dCAmJiB0ZXh0LnRyaW0oKS5sZW5ndGggPiAwKSBcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjpDb21tb25VdGlsLnRydW5jYXRlVGV4dCh0ZXh0KSwgXCJuYW1lRnJvbVwiOiBcImZpZ2NhcHRpb25cIn07ICBcbiAgICAgICAgICAgIH0gICAgICAgIFxuICAgICAgICB9XG5cbiAgICAgICAgLy8gaW1nIGVsZW1lbnRzOiB1c2UgYXR0cmlidXRlIFwiYWx0XCJcbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSBcImltZ1wiKSB7XG4gICAgICAgICAgICBpZiAoZWxlbS5oYXNBdHRyaWJ1dGUoXCJhbHRcIikpIHtcbiAgICAgICAgICAgICAgICBsZXQgYWx0ID0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJhbHRcIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjpDb21tb25VdGlsLnRydW5jYXRlVGV4dChhbHQpLCBcIm5hbWVGcm9tXCI6IFwiYWx0XCJ9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gYXJlYSBlbGVtZW50czogdXNlIGF0dHJpYnV0ZSBcImFsdFwiXG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJhcmVhXCIpIHtcbiAgICAgICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcImFsdFwiKSkge1xuICAgICAgICAgICAgICAgIGxldCBhbHQgPSBlbGVtLmdldEF0dHJpYnV0ZShcImFsdFwiKTtcbiAgICAgICAgICAgICAgICBpZiAoYWx0ICYmIGFsdC50cmltKCkubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjpDb21tb25VdGlsLnRydW5jYXRlVGV4dChhbHQpLCBcIm5hbWVGcm9tXCI6IFwiYWx0XCJ9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gdGFibGUgZWxlbWVudFxuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwidGFibGVcIikge1xuICAgICAgICAgICAgLy8gaWYgdGhlIGZpZ3VyZSBlbGVtZW50IGhhcyBhIGNhcHRpb24gYXMgdGhlIGZpcnN0IGNoaWxkXG4gICAgICAgICAgICBsZXQgY2FwdGlvbkVsZW0gPSBlbGVtLmZpcnN0RWxlbWVudENoaWxkO1xuICAgICAgICAgICAgaWYgKGNhcHRpb25FbGVtICYmIGNhcHRpb25FbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdjYXB0aW9uJykge1xuICAgICAgICAgICAgICAgIC8vIGNhcHRpb24gY2FuIGJlIG1peGVkIHRleHRcbiAgICAgICAgICAgICAgICBjb25zdCBjYXB0aW9uID0gKGNhcHRpb25FbGVtIGFzIEhUTUxFbGVtZW50KS5pbm5lclRleHQ7XG4gICAgICAgICAgICAgICAgaWYgKGNhcHRpb24gJiYgY2FwdGlvbi50cmltKCkubGVuZ3RoID4gMCkgXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XCJuYW1lXCI6Q29tbW9uVXRpbC50cnVuY2F0ZVRleHQoY2FwdGlvbiksIFwibmFtZUZyb21cIjogXCJjYXB0aW9uXCJ9OyBcbiAgICAgICAgICAgIH0gICAgICAgICBcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGEgZWxlbWVudFxuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwiYVwiKSB7XG4gICAgICAgICAgICAvLyBmaXJzdCB1c2UgdGhlIGxpbmsgdGV4dFxuICAgICAgICAgICAgY29uc3QgdGV4dCA9IChlbGVtIGFzIEhUTUxFbGVtZW50KS5pbm5lclRleHQ7XG4gICAgICAgICAgICBpZiAodGV4dCAmJiB0ZXh0LnRyaW0oKSAhPT0gJycpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjpDb21tb25VdGlsLnRydW5jYXRlVGV4dCh0ZXh0KSwgXCJuYW1lRnJvbVwiOiBcInRleHRcIn07XG4gICAgICAgICAgICAgXG4gICAgICAgICAgICAvL2ZvciBpbWFnZSBsaW5rOiBnZXQgdGhlIGltYWdlIG9yIHN2ZyBpZiBleGlzdHNcbiAgICAgICAgICAgIGNvbnN0IGltYWdlcyA9IGVsZW0ucXVlcnlTZWxlY3RvckFsbChcIjpzY29wZSA+IGltZywgOnNjb3BlID4gc3ZnXCIpO1xuICAgICAgICAgICAgaWYgKGltYWdlcyAmJiBpbWFnZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCB0ZXh0ID0gXCJcIjtcbiAgICAgICAgICAgICAgICBpbWFnZXMuZm9yRWFjaChpbWFnZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQoaW1hZ2UpICYmICFWaXNVdGlsLmlzTm9kZVByZXNlbnRhdGlvbmFsKGltYWdlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWUoaW1hZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhaXIgJiYgcGFpci5uYW1lICYmIHBhaXIubmFtZS50cmltKCkubGVuZ3RoID4gMCkgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCArPSBcIiBcIiArIHBhaXIubmFtZS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAodGV4dC50cmltKCkgIT09ICcnKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1wibmFtZVwiOnRleHQudHJpbSgpLCBcIm5hbWVGcm9tXCI6IFwiYWx0XCJ9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gb3B0Z3JvdXBcbiAgICAgICAgLy8gbGFiZWwgcGFydGljaXBhdGUgaW4gYWNjZXNzaWJsZSBuYW1lIGNhbGN1bGF0aW9uOiBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbC1hYW0tMS4wLyNhdHQtbGFiZWxcbiAgICAgICAgLy8gVGhlIGxhYmVsIGF0dHJpYnV0ZSBtdXN0IGJlIHNwZWNpZmllZC4gSXRzIHZhbHVlIGdpdmVzIHRoZSBuYW1lIG9mIHRoZSBncm91cFxuICAgICAgICAvLyB0aGUgdmFsdWUgaXMgZGlzYWJsZWQgaW4gdGhlIGludGVyZmFjZVxuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwib3B0Z3JvdXBcIiB8fCBub2RlTmFtZSA9PT0gXCJvcHRpb25cIiB8fCBub2RlTmFtZSA9PT0gXCJ0cmFja1wiKSB7XG4gICAgICAgICAgICBjb25zdCBsYWJlbCA9IGVsZW0uZ2V0QXR0cmlidXRlKFwibGFiZWxcIik7XG4gICAgICAgICAgICBpZiAobGFiZWwgJiYgbGFiZWwudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjpDb21tb25VdGlsLnRydW5jYXRlVGV4dChsYWJlbCksIFwibmFtZUZyb21cIjogXCJsYWJlbFwifTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHN2Z1xuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwic3ZnXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWVGb3JTVkdFbGVtZW50VzNDKGVsZW0pO1xuICAgICAgICAgICAgaWYgKHBhaXIgJiYgcGFpci5uYW1lICYmIHBhaXIubmFtZS50cmltKCkubGVuZ3RoID4gMCkgXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhaXI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gY2FsY3VsYXRlIGFjY2Vzc2libGUgbmFtZSBmb3IgbmF0aXZlIGVsZW1lbnRzXG4gICAgcHVibGljIHN0YXRpYyBjb21wdXRlQWNjZXNzaWJsZU5hbWVGb3JTVkdFbGVtZW50KGVsZW06IEVsZW1lbnQpIDogQWNjZXNzaWJsZU5hbWVSZXN1bHQgfCBudWxsIHtcbiAgICAgICAgLy8gMS4gYSBkaXJlY3QgY2hpbGQgb3IgZGVzY2VuZGFudCB0aXRsZSBlbGVtZW50IFxuICAgICAgICBjb25zdCBzdmdUaXRsZXMgPSBlbGVtLnF1ZXJ5U2VsZWN0b3JBbGwoXCI6c2NvcGUgPiB0aXRsZVwiKTtcbiAgICAgICAgaWYgKHN2Z1RpdGxlcyAmJiBzdmdUaXRsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGV0IHRleHQgPSBcIlwiO1xuICAgICAgICAgICAgc3ZnVGl0bGVzLmZvckVhY2goc3ZnVGl0bGUgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChzdmdUaXRsZSAmJiAhVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQoc3ZnVGl0bGUpICYmICFWaXNVdGlsLmlzTm9kZVByZXNlbnRhdGlvbmFsKHN2Z1RpdGxlKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0aXRsZSA9IHN2Z1RpdGxlLnRleHRDb250ZW50O1xuICAgICAgICAgICAgICAgICAgICBpZiAodGl0bGUgJiYgdGl0bGUudHJpbSgpICE9PSAnJylcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgKz0gdGl0bGUudHJpbSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHRleHQgJiYgdGV4dC50cmltKCkgIT09ICcnKVxuICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjp0ZXh0LnRyaW0oKSwgXCJuYW1lRnJvbVwiOiBcInN2Z1RpdGxlXCJ9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gMi4geGxpbms6dGl0bGUgYXR0cmlidXRlIG9uIGEgbGlua1xuICAgICAgICBsZXQgbGlua1RpdGxlID0gZWxlbS5xdWVyeVNlbGVjdG9yKFwiYVwiKTtcbiAgICAgICAgaWYgKGxpbmtUaXRsZSAmJiAhVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQobGlua1RpdGxlKSAmJiAhVmlzVXRpbC5pc05vZGVQcmVzZW50YXRpb25hbChsaW5rVGl0bGUpKSB7XG4gICAgICAgICAgICBsZXQgbGluayA9IGxpbmtUaXRsZS5nZXRBdHRyaWJ1dGUoXCJ4bGluazp0aXRsZVwiKTtcbiAgICAgICAgICAgIGlmIChsaW5rICYmIGxpbmsudHJpbSgpICE9PSAnJylcbiAgICAgICAgICAgICAgICByZXR1cm4ge1wibmFtZVwiOkNvbW1vblV0aWwudHJ1bmNhdGVUZXh0KGxpbmspLCBcIm5hbWVGcm9tXCI6IFwic3ZnbGlua1RpdGxlXCJ9O1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqIDMuIGZvciB0ZXh0IGNvbnRhaW5lciBlbGVtZW50cywgdGhlIHRleHQgY29udGVudC4gXG4gICAgICAgICAqIG5vdGUgdGhlIFNWRyB0ZXh0IGNvbnRlbnQgZWxlbWVudHMgYXJlOiDigJh0ZXh04oCZLCDigJh0ZXh0UGF0aOKAmSBhbmQg4oCYdHNwYW7igJkuXG4gICAgICAgICAqICBzdmcgZWxlbWVudCBjYW4gYmUgbmVzdGVkLiBPbmUgb2YgdGhlIHB1cnBvc2VzIGlzIHRvIHRvIGdyb3VwIFNWRyBzaGFwZXMgdG9nZXRoZXIgYXMgYSBjb2xsZWN0aW9uIGZvciByZXNwb25zaXZlIGRlc2lnbi5cbiAgICAgICAgICogXG4gICAgICAgICAqIHNlbGVjdCB0ZXh0IGNvbnRlbnQgZXhjbHVkZWQgdGhlIHRleHQgZnJvbSB0aGUgbmVzdGVkIHN2ZyBlbGVtZW50cyBhbmQgdGhlaXIgY2hpbGRyZW4gXG4gICAgICAgICAqLyBcbiAgICAgICAgbGV0IHRleHQgPSBcIlwiO1xuICAgICAgICBlbGVtLnF1ZXJ5U2VsZWN0b3JBbGwoXCI6c2NvcGUgPiAqXCIpLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGlmIChlbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgIT09ICdzdmcnICYmICFWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChlbGVtZW50KSAmJiAhVmlzVXRpbC5pc05vZGVQcmVzZW50YXRpb25hbChlbGVtZW50KSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gQ29tbW9uVXRpbC5nZXRJbm5lclRleHQoZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlICYmIHZhbHVlLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9IHZhbHVlO1xuICAgICAgICAgICAgfSAgICBcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh0ZXh0LnRyaW0oKSAhPT0gJycpXG4gICAgICAgICAgICByZXR1cm4ge1wibmFtZVwiOkNvbW1vblV0aWwudHJ1bmNhdGVUZXh0KHRleHQpLCBcIm5hbWVGcm9tXCI6IFwic3ZnVGV4dFwifTsgXG5cbiAgICAgICAgLy8gNC4gZnJvbSBhcmlhLWRlc2NyaWJlZGJ5IG9yIGFyaWEtZGVzY3JpcHRpb24gXG4gICAgICAgIGxldCBkZXNjYnkgPSBBcmlhVXRpbC5nZXRBcmlhRGVzY3JpcHRpb24oZWxlbSk7XG4gICAgICAgIGlmIChkZXNjYnkgJiYgZGVzY2J5LnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjpDb21tb25VdGlsLnRydW5jYXRlVGV4dChkZXNjYnkpLCBcIm5hbWVGcm9tXCI6IFwiYXJpYS1kZXNjcmlwdGlvblwifTtcblxuICAgICAgICAvLyA1LiBhIGRpcmVjdCBjaGlsZCBvciBkZXNjZW5kYW50IGRlc2MgZWxlbWVudFxuICAgICAgICBsZXQgZGVzY0VsZW1zID0gZWxlbS5xdWVyeVNlbGVjdG9yQWxsKFwiOnNjb3BlID4gZGVzY1wiKTtcbiAgICAgICAgaWYgKGRlc2NFbGVtcyAmJiBkZXNjRWxlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGV0IHRleHQgPSBcIlwiO1xuICAgICAgICAgICAgZGVzY0VsZW1zLmZvckVhY2goZGVzY0VsZW0gPT4ge1xuICAgICAgICAgICAgICAgIGlmIChkZXNjRWxlbSAmJiAhVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQoZGVzY0VsZW0pICYmICFWaXNVdGlsLmlzTm9kZVByZXNlbnRhdGlvbmFsKGRlc2NFbGVtKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXNjID0gZGVzY0VsZW0udGV4dENvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkZXNjICYmIGRlc2MudHJpbSgpICE9PSAnJylcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgKz0gZGVzYy50cmltKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAodGV4dCAmJiB0ZXh0LnRyaW0oKSAhPT0gJycpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjp0ZXh0LnRyaW0oKSwgXCJuYW1lRnJvbVwiOiBcInN2Z0Rlc2NcIn07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBjYWxjdWxhdGUgYWNjZXNzaWJsZSBuYW1lIGZvciBjdXN0b20gZWxlbWVudHMgbWFya2VkIHdpdGggYXJpYVxuICAgIHB1YmxpYyBzdGF0aWMgY29tcHV0ZUFjY2Vzc2libGVOYW1lRnJvbUNvbnRlbnQoZWxlbTogRWxlbWVudCkgOiBBY2Nlc3NpYmxlTmFtZVJlc3VsdCB8IG51bGwge1xuICAgICAgICBjb25zdCBub2RlTmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgY29uc3Qgcm9sZSA9IEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZShlbGVtKTtcbiAgICAgICAgLyoqIGZvciBhY2MgbmFtZSBmcm9tIGNvbnRlbnQsIHRoZSBjb250ZW50IGZyb20gQ1NTIHBzZXVkby1lbGVtZW50cyBcbiAgICAgICAgICogIDpiZWZvcmUgYW5kIDphZnRlciBwc2V1ZG8gZWxlbWVudHMgW0NTUzJdIGNhbiBwcm92aWRlIHRleHR1YWwgY29udGVudCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIGEgY29udGVudCBtb2RlbC5cbiAgICAgICAgICogRm9yIDpiZWZvcmUgb3IgOmFmdGVyIHBzZXVkbyBlbGVtZW50cywgdXNlciBhZ2VudHMgbXVzdCBwcmVwZW5kIENTUyB0ZXh0dWFsIGNvbnRlbnQsIHdpdGhvdXQgYSBzcGFjZSwgXG4gICAgICAgICAqICAgdG8gdGhlIHRleHR1YWwgY29udGVudCBvZiB0aGUgY3VycmVudCBub2RlLlxuICAgICAgICAgKi9cbiAgICAgICAgbGV0IHBhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWVGb3JDU1NQc2V1ZG9FbGVtZW50KGVsZW0sIFwiYmVmb3JlXCIpO1xuICAgICAgICBpZiAocGFpciAhPT0gbnVsbCAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgcmV0dXJuIHBhaXI7XG5cbiAgICAgICAgcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZUZvckNTU1BzZXVkb0VsZW1lbnQoZWxlbSwgXCJhZnRlclwiKTtcbiAgICAgICAgaWYgKHBhaXIgJiYgcGFpci5uYW1lICYmIHBhaXIubmFtZS50cmltKCkubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHJldHVybiBwYWlyO1xuXG4gICAgICAgIC8vICBzaGFkb3cgaG9zdFxuICAgICAgICBpZiAoZWxlbS5zaGFkb3dSb290KSB7XG4gICAgICAgICAgICBwYWlyID0gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lRm9yU2hhZG93SG9zdChlbGVtKTtcbiAgICAgICAgICAgIGlmIChwYWlyICYmIHBhaXIubmFtZSAmJiBwYWlyLm5hbWUudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjogcGFpci5uYW1lLCBcIm5hbWVGcm9tXCI6IFwic2hhZG93XCJ9OztcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gc2xvdCBlbGVtZW50XG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJzbG90XCIpIHtcbiAgICAgICAgICAgIHBhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWVGb3JTbG90RWxlbWVudChlbGVtKTtcbiAgICAgICAgICAgIGlmIChwYWlyICYmIHBhaXIubmFtZSAmJiBwYWlyLm5hbWUudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjogcGFpci5uYW1lLCBcIm5hbWVGcm9tXCI6IFwic2xvdFwifTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG90aGVyd2lzZTogZ2V0IHRoZSB2YWx1ZSBmcm9tIHRoZSBlbGVtZW50XG4gICAgICAgIHBhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWVGcm9tQ2hpbGRyZW4oZWxlbSk7XG4gICAgICAgIGlmIChwYWlyICYmIHBhaXIubmFtZSAmJiBwYWlyLm5hbWUudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICByZXR1cm4ge1wibmFtZVwiOiBwYWlyLm5hbWUsIFwibmFtZUZyb21cIjogXCJjb250ZW50XCJ9O1xuXG4gICAgICAgIC8vIG5vIGFjY2Vzc2libGUgbmFtZSBleGlzdHNcbiAgICAgICAgcmV0dXJuIG51bGw7ICAgIFxuICAgIH1cblxuICAgIC8vIGNhbGN1bGF0ZSBhY2Nlc3NpYmxlIG5hbWUgZnJvbSBDU1MgZ2VuZXJhdGVkIGNvbnRlbnRcbiAgICBwdWJsaWMgc3RhdGljIGNvbXB1dGVBY2Nlc3NpYmxlTmFtZUZvckNTU1BzZXVkb0VsZW1lbnQoZWxlbTogRWxlbWVudCwgdHlwZTpzdHJpbmcpIDogQWNjZXNzaWJsZU5hbWVSZXN1bHQgfCBudWxsIHtcbiAgICAgICAgY29uc3QgY29udGVudEVsZW0gPSBlbGVtLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtLHR5cGUpO1xuICAgICAgICBpZiAoY29udGVudEVsZW0pIHtcbiAgICAgICAgICAgIGxldCBjb250ZW50ID0gY29udGVudEVsZW0uY29udGVudDtcbiAgICAgICAgICAgIGlmIChjb250ZW50ICYmIGNvbnRlbnQgIT09IFwibm9uZVwiICYmIGNvbnRlbnQgIT09IFwibm9cIiAmJiBjb250ZW50ICE9PSBcIm5vcm1hbFwiKSB7XG4gICAgICAgICAgICAgICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZSgvXlwiLyxcIlwiKS5yZXBsYWNlKC9cIiQvLFwiXCIpO1xuICAgICAgICAgICAgICAgIGlmIChjb250ZW50LnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1wibmFtZVwiOiBDb21tb25VdGlsLnRydW5jYXRlVGV4dChjb250ZW50KSwgXCJuYW1lRnJvbVwiOiBcImNzcy1cIit0eXBlfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBjYWxjdWxhdGUgYWNjZXNzaWJsZSBuYW1lIGZvciBTTE9UIGVsZW1lbnRcbiAgICBwdWJsaWMgc3RhdGljIGNvbXB1dGVBY2Nlc3NpYmxlTmFtZUZvclNoYWRvd0hvc3QoZWxlbTogRWxlbWVudCkgOiBBY2Nlc3NpYmxlTmFtZVJlc3VsdCB8IG51bGwge1xuICAgICAgICBsZXQgdGV4dCA9IFwiXCI7XG4gICAgICAgIGNvbnN0IHNoYWRvd1Jvb3QgPSBlbGVtLnNoYWRvd1Jvb3Q7XG4gICAgICAgIGlmIChzaGFkb3dSb290KSB7XG4gICAgICAgICAgICBsZXQgY2hpbGRyZW4gPSBzaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGwoJyonKTsgICBcbiAgICAgICAgICAgIC8vIGNoZWNrIHRleHQgZnJvbSBhbGwgdGhlIGNoaWxkcmVuIGVsZW1lbnRzXG4gICAgICAgICAgICBjaGlsZHJlbi5mb3JFYWNoKGNoaWxkID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYWlyID0gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lKGNoaWxkKTtcbiAgICAgICAgICAgICAgICBpZiAocGFpciAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9IFwiIFwiICsgcGFpci5uYW1lLnRyaW0oKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0ZXh0LnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjogQ29tbW9uVXRpbC50cnVuY2F0ZVRleHQodGV4dCksIFwibmFtZUZyb21cIjogXCJzaGFkb3ctaG9zdFwifTtcblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBjYWxjdWxhdGUgYWNjZXNzaWJsZSBuYW1lIGZvciBTTE9UIGVsZW1lbnRcbiAgICBwdWJsaWMgc3RhdGljIGNvbXB1dGVBY2Nlc3NpYmxlTmFtZUZvclNsb3RFbGVtZW50KGVsZW06IEVsZW1lbnQpIDogQWNjZXNzaWJsZU5hbWVSZXN1bHQgfCBudWxsIHtcbiAgICAgICAgLy9pZiBubyBhc3NpZ25lZE5vZGUsIGNoZWNrIGl0cyBvd24gdGV4dCBcbiAgICAgICAgbGV0IHRleHQgPSBcIlwiO1xuICAgICAgICBpZiAoIShlbGVtIGFzIEhUTUxTbG90RWxlbWVudCkuYXNzaWduZWROb2RlcygpIHx8IChlbGVtIGFzIEhUTUxTbG90RWxlbWVudCkuYXNzaWduZWROb2RlcygpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgY29uc3QgcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZShlbGVtKTtcbiAgICAgICAgICAgIGlmIChwYWlyICYmIHBhaXIubmFtZSAmJiBwYWlyLm5hbWUudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgdGV4dCArPSBcIiBcIiArIHBhaXIubmFtZS50cmltKCk7XG4gICAgICAgIH0gZWxzZSB7ICAgIFxuICAgICAgICAgICAgLy8gY2hlY2sgdGV4dCBmcm9tIGFsbCBhc3NpZ25lZCBub2Rlc1xuICAgICAgICAgICAgZm9yIChjb25zdCBzbG90Q2hpbGQgb2YgKGVsZW0gYXMgSFRNTFNsb3RFbGVtZW50KS5hc3NpZ25lZE5vZGVzKCkpIHtcbiAgICAgICAgICAgICAgICBsZXQgcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZShzbG90Q2hpbGQgYXMgRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgaWYgKHBhaXIgJiYgcGFpci5uYW1lICYmIHBhaXIubmFtZS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9IFwiIFwiICsgcGFpci5uYW1lLnRyaW0oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGV4dC50cmltKCkubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHJldHVybiB7XCJuYW1lXCI6IENvbW1vblV0aWwudHJ1bmNhdGVUZXh0KHRleHQpLCBcIm5hbWVGcm9tXCI6IFwiY29udGVudC1zbG90XCJ9O1xuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIGNhbGN1bGF0ZSBhY2Nlc3NpYmxlIG5hbWUgZnJvbSBjaGlsZHJlbiBjb250ZW50XG4gICAgcHVibGljIHN0YXRpYyBjb21wdXRlQWNjZXNzaWJsZU5hbWVGcm9tQ2hpbGRyZW4oZWxlbTogRWxlbWVudCkgOiBBY2Nlc3NpYmxlTmFtZVJlc3VsdCB8IG51bGwge1xuICAgICAgICBsZXQgdGV4dCA9IFwiXCI7XG5cbiAgICAgICAgLy9sZXQgd2Fsa0NoaWxkID0gZWxlbS5maXJzdENoaWxkO1xuICAgICAgICBsZXQgbncgPSBuZXcgRE9NV2Fsa2VyKGVsZW0pO1xuICAgICAgICAvLyBMb29wIG92ZXIgYWxsIHRoZSBjaGlsZHJlbnMgb2YgdGhlIGVsZW1lbnQgdG8gZ2V0IHRoZSB0ZXh0XG4gICAgICAgIHdoaWxlIChudy5uZXh0Tm9kZSgpICYmIG53Lm5vZGUgIT09IGVsZW0gJiYgbncubm9kZSAhPT0gZWxlbS5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICBpZiAobncuYkVuZFRhZykgY29udGludWU7XG4gICAgICAgIC8vd2hpbGUgKHdhbGtDaGlsZCkgeyBcbiAgICAgICAgICAgIGNvbnN0IHdhbGtDaGlsZCA9IG53Lm5vZGU7IFxuICAgICAgICAgICAgaWYgKHdhbGtDaGlsZC5ub2RlVHlwZSA9PT0gMykge1xuICAgICAgICAgICAgICAgIC8vIGZvciB0aGUgdGV4dCBub2RlLCBnZXQgdGhlIHBhcmVudG5vZGUgdG8gY2hlY2sgdmlzaWJpbGl0eVxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IHdhbGtDaGlsZC5wYXJlbnRFbGVtZW50O1xuICAgICAgICAgICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocGFyZW50KSAmJiAhVmlzVXRpbC5pc05vZGVQcmVzZW50YXRpb25hbChwYXJlbnQpICYmIHdhbGtDaGlsZC5ub2RlVmFsdWUgJiYgd2Fsa0NoaWxkLm5vZGVWYWx1ZS50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9IFwiIFwiICsgd2Fsa0NoaWxkLm5vZGVWYWx1ZS50cmltKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHdhbGtDaGlsZC5ub2RlVHlwZSA9PT0gMSAmJiAhVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQod2Fsa0NoaWxkIGFzIEhUTUxFbGVtZW50KSAmJiAhVmlzVXRpbC5pc05vZGVQcmVzZW50YXRpb25hbCh3YWxrQ2hpbGQgYXMgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZSh3YWxrQ2hpbGQgYXMgRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgaWYgKHBhaXIgJiYgcGFpci5uYW1lICYmIHBhaXIubmFtZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRleHQgKz0gXCIgXCIgKyBwYWlyLm5hbWUudHJpbSgpO1xuICAgICAgICAgICAgICAgICAgICBudy5iRW5kVGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gU2tpcCBjaGlsZHJlbiBpZiB0aGlzIGVsZW1lbnQgb25seSBoYXMgcHJlc2VudGF0aW9uYWwgY2hpbGRyZW5cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChBcmlhVXRpbC5jb250YWluc1ByZXNlbnRhdGlvbmFsQ2hpbGRyZW5Pbmx5KG53Lm5vZGUgYXMgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIG53LmJFbmRUYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGV4dC50cmltKCkubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHJldHVybiB7XCJuYW1lXCI6IENvbW1vblV0aWwudHJ1bmNhdGVUZXh0KHRleHQpLCBcIm5hbWVGcm9tXCI6IFwiY29udGVudFwifTtcblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBpZiBhY2Nlc3NpYmxlIG5hbWUgY2FuIGJlIGlnbm9yZWQgZm9yIGltYWdlIG9yIHN2Z1xuICAgIHB1YmxpYyBzdGF0aWMgaXNBY2Nlc3NpYmxlTmFtZUlnbm9yYWJsZShlbGVtOiBFbGVtZW50KSA6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIWVsZW0pIHJldHVybiBmYWxzZTtcblxuICAgICAgICBjb25zdCBub2RlTmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKG5vZGVOYW1lICE9PSAnaW1nJyAmJiBub2RlTmFtZSAhPT0gJ3N2ZycpIHJldHVybiBmYWxzZTtcbiAgICAgICAgXG4gICAgICAgIGxldCBwYXJlbnQgPSBlbGVtLnBhcmVudEVsZW1lbnQ7XG4gICAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgICAgIC8vIGlmIHRoZSBwYXJlbnQgaXMgYSB3aWRnZXQgYW5kIGhhcyBhbiBhcmlhIGxhYmVsLCB0aGVuIGltYWdlL3N2ZyBsYWJlbCBpcyBub3QgbmVjZXNzYXJ5XG4gICAgICAgICAgICBpZiAoKEFyaWFVdGlsLmlzV2lkZ2V0KHBhcmVudCkgfHwgQXJpYVV0aWwuY29udGFpbnNQcmVzZW50YXRpb25hbENoaWxkcmVuT25seShwYXJlbnQpKSAmJiBBcmlhVXRpbC5oYXNBcmlhTGFiZWwocGFyZW50KSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn0gXG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgIENvcHlyaWdodDo6IDIwMjAtIElCTSwgSW5jXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgQVJJQURlZmluaXRpb25zLCBJRG9jdW1lbnRDb25mb3JtYW5jZVJlcXVpcmVtZW50IH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQURlZmluaXRpb25zXCI7XG5pbXBvcnQgeyBBUklBTWFwcGVyIH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQU1hcHBlclwiO1xuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01XYWxrZXJcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi9WaXNVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4vQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgQWNjTmFtZVV0aWwgfSBmcm9tIFwiLi9BY2NOYW1lVXRpbFwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG5pbXBvcnQgeyBET01VdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01VdGlsXCI7XG5cbmV4cG9ydCBjbGFzcyBBcmlhVXRpbCB7XG5cbiAgICAvLyBUaGlzIGxpc3QgY29udGFpbnMgYSBsaXN0IG9mIGVsZW1lbnRzIHRhZ3Mgd2hpY2ggaGF2ZSBkaXNwbGF5OiBub25lIGJ5IGRlZmF1bHQsIHNpbmNlIHdlIGhhdmUgcnVsZXMgdHJpZ2dlcmluZ1xuICAgIHB1YmxpYyBzdGF0aWMgbmF2TGlua0tleXdvcmRzID0gWydzdGFydCcsICduZXh0JywgJ3ByZXYnLCAncHJldmlvdXMnLCAnY29udGVudHMnLCAnaW5kZXgnXVxuXG4gICAgLy8gVGhpcyBsaXN0IGNvbnRhaW5zIGEgbGlzdCBvZiBydWxlIGlkcyBmb3IgdGhlIHJ1bGVzIHRoYXQgaGF2ZSB0byBjaGVjayBmb3IgaGlkZGVuIGNvbnRlbnQgcmVnYXJkbGVzcyBvZiB0aGUgQ2hlY2sgSGlkZGVuXG4gICAgLy8gQ29udGVudCBTZXR0aW5nLiBUaGlzIG1lYW5zIHRoYXQgd2hlbiB0aGUgZW5naW5lIGlzIGFjdHVhbGx5IGRldGVybWluZSB3aGljaCBlbGVtZW50cyB0byBtYXNzIHRvIHRoZSBydWxlcywgaXQgd2lsbCBhbHdheXNcbiAgICAvLyBwYXNzIHRoZXNlcyBydWxlcyBubyBtYXR0ZXIgd2hhdCB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgU2V0dGluZyBpcy5cbiAgICBwdWJsaWMgc3RhdGljIHJ1bGVzVGhhdEhhdmVUb0NoZWNrSGlkZGVuID0gWydSUFRfRWxlbV9VbmlxdWVJZCddXG5cbiAgICBwdWJsaWMgc3RhdGljIGlzRGVmaW5lZEFyaWFBdHRyaWJ1dGVBdEluZGV4KGVsZSwgaW5kZXgpIHtcbiAgICAgICAgbGV0IGF0dHJOYW1lID0gZWxlLmF0dHJpYnV0ZXNbaW5kZXhdLm5hbWU7XG4gICAgICAgIHJldHVybiBBcmlhVXRpbC5pc0RlZmluZWRBcmlhQXR0cmlidXRlKGVsZSwgYXR0ck5hbWUpO1xuICAgIH1cblxuICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93YWktYXJpYS0xLjEvI2ludHJvc3RhdGVzXG4gICAgcHVibGljIHN0YXRpYyBhcmlhQXR0cmlidXRlUm9sZURlZmF1bHRzID0ge1xuICAgICAgICBcImFsZXJ0XCI6IHtcbiAgICAgICAgICAgIFwiYXJpYS1saXZlXCI6IFwiYXNzZXJ0aXZlXCIsXG4gICAgICAgICAgICBcImFyaWEtYXRvbWljXCI6IFwidHJ1ZVwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiY29tYm9ib3hcIjoge1xuICAgICAgICAgICAgXCJhcmlhLWhhc3BvcHVwXCI6IFwibGlzdGJveFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwibGlzdGJveFwiOiB7XG4gICAgICAgICAgICBcImFyaWEtb3JpZW50YXRpb25cIjogXCJ2ZXJ0aWNhbFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwibG9nXCI6IHtcbiAgICAgICAgICAgIFwiYXJpYS1saXZlXCI6IFwicG9saXRlXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJtZW51XCI6IHtcbiAgICAgICAgICAgIFwiYXJpYS1vcmllbnRhdGlvblwiOiBcInZlcnRpY2FsXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJtZW51YmFyXCI6IHtcbiAgICAgICAgICAgIFwiYXJpYS1vcmllbnRhdGlvblwiOiBcImhvcml6b250YWxcIlxuICAgICAgICB9LFxuICAgICAgICBcIm1ldGVyXCI6IHtcbiAgICAgICAgICAgIFwiYXJpYS12YWx1ZW1pblwiOiBcIjBcIixcbiAgICAgICAgICAgIFwiYXJpYS12YWx1ZW1heFwiOiBcIjEwMFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwib3B0aW9uXCI6IHtcbiAgICAgICAgICAgIFwiYXJpYS1zZWxlY3RlZFwiOiBcImZhbHNlXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJwcm9ncmVzc2JhclwiOiB7XG4gICAgICAgICAgICBcImFyaWEtdmFsdWVtaW5cIjogXCIwXCIsXG4gICAgICAgICAgICBcImFyaWEtdmFsdWVtYXhcIjogXCIxMDBcIlxuICAgICAgICB9LFxuICAgICAgICBcInNjcm9sbGJhclwiOiB7XG4gICAgICAgICAgICBcImFyaWEtb3JpZW50YXRpb25cIjogXCJ2ZXJ0aWNhbFwiLFxuICAgICAgICAgICAgXCJhcmlhLXZhbHVlbWluXCI6IFwiMFwiLFxuICAgICAgICAgICAgXCJhcmlhLXZhbHVlbWF4XCI6IFwiMTAwXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJzZXBhcmF0b3JcIjoge1xuICAgICAgICAgICAgXCJhcmlhLW9yaWVudGF0aW9uXCI6IFwiaG9yaXpvbnRhbFwiLFxuICAgICAgICAgICAgXCJhcmlhLXZhbHVlbWluXCI6IFwiMFwiLFxuICAgICAgICAgICAgXCJhcmlhLXZhbHVlbWF4XCI6IFwiMTAwXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJzbGlkZXJcIjoge1xuICAgICAgICAgICAgXCJhcmlhLW9yaWVudGF0aW9uXCI6IFwiaG9yaXpvbnRhbFwiLFxuICAgICAgICAgICAgXCJhcmlhLXZhbHVlbWluXCI6IFwiMFwiLFxuICAgICAgICAgICAgXCJhcmlhLXZhbHVlbWF4XCI6IFwiMTAwXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJzcGluYnV0dG9uXCI6IHtcbiAgICAgICAgICAgIC8vIE5vdCBzdXJlIGhvdyB0byBlbmNvZGUgbWluL21heCAob3Igbm93IGluIDEuMiAtIFwiaGFzIG5vIHZhbHVlXCIpXG4gICAgICAgICAgICAvL1wiYXJpYS12YWx1ZW5vd1wiOiBcIjBcIiBUT0RPOiBhdCByaXNrOiBtYXliZSBkZWxldGUgYWZ0ZXIgQVJJQSAxLjIgcmVhY2hlcyBwcm9wb3NlZCByZWNcbiAgICAgICAgICAgIC8vIFByb2JhYmx5IGp1c3QgZGVsZXRlIHNwaW5idXR0b24gZnJvbSB0aGlzIGxpc3QgY29tcGxldGVseSBhbmQgbGV0IHVzZXIgYWdlbnRzIGhhbmRsZSBcImRlZmF1bHRzXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJzdGF0dXNcIjoge1xuICAgICAgICAgICAgXCJhcmlhLWxpdmVcIjogXCJwb2xpdGVcIixcbiAgICAgICAgICAgIFwiYXJpYS1hdG9taWNcIjogXCJ0cnVlXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJ0YWJcIjoge1xuICAgICAgICAgICAgXCJhcmlhLXNlbGVjdGVkXCI6IFwiZmFsc2VcIlxuICAgICAgICB9LFxuICAgICAgICBcInRhYmxpc3RcIjoge1xuICAgICAgICAgICAgXCJhcmlhLW9yaWVudGF0aW9uXCI6IFwiaG9yaXpvbnRhbFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwidG9vbGJhclwiOiB7XG4gICAgICAgICAgICBcImFyaWEtb3JpZW50YXRpb25cIjogXCJob3Jpem9udGFsXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJ0cmVlXCI6IHtcbiAgICAgICAgICAgIFwiYXJpYS1vcmllbnRhdGlvblwiOiBcInZlcnRpY2FsXCJcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93YWktYXJpYS0xLjEvI2FyaWEtYXRvbWljXG4gICAgcHVibGljIHN0YXRpYyBhcmlhQXR0cmlidXRlR2xvYmFsRGVmYXVsdHMgPSB7XG4gICAgICAgIFwiYXJpYS1hdG9taWNcIjogXCJmYWxzZVwiLFxuICAgICAgICBcImFyaWEtYXV0b2NvbXBsZXRlXCI6IFwibm9uZVwiLFxuICAgICAgICBcImFyaWEtYnVzeVwiOiBcImZhbHNlXCIsXG4gICAgICAgIFwiYXJpYS1jaGVja2VkXCI6IHVuZGVmaW5lZCxcbiAgICAgICAgXCJhcmlhLWN1cnJlbnRcIjogXCJmYWxzZVwiLFxuICAgICAgICBcImFyaWEtZGlzYWJsZWRcIjogXCJmYWxzZVwiLFxuICAgICAgICBcImFyaWEtZHJvcGVmZmVjdFwiOiBcIm5vbmVcIixcbiAgICAgICAgXCJhcmlhLWV4cGFuZGVkXCI6IHVuZGVmaW5lZCxcbiAgICAgICAgXCJhcmlhLWdyYWJiZWRcIjogdW5kZWZpbmVkLFxuICAgICAgICBcImFyaWEtaGFzcG9wdXBcIjogXCJmYWxzZVwiLFxuICAgICAgICBcImFyaWEtaGlkZGVuXCI6IHVuZGVmaW5lZCxcbiAgICAgICAgXCJhcmlhLWludmFsaWRcIjogXCJmYWxzZVwiLFxuICAgICAgICBcImFyaWEtbGl2ZVwiOiBcIm9mZlwiLFxuICAgICAgICBcImFyaWEtbW9kYWxcIjogXCJmYWxzZVwiLFxuICAgICAgICBcImFyaWEtbXVsdGlsaW5lXCI6IFwiZmFsc2VcIixcbiAgICAgICAgXCJhcmlhLW11bHRpc2VsZWN0YWJsZVwiOiBcImZhbHNlXCIsXG4gICAgICAgIFwiYXJpYS1vcmllbnRhdGlvblwiOiB1bmRlZmluZWQsXG4gICAgICAgIFwiYXJpYS1wcmVzc2VkXCI6IHVuZGVmaW5lZCxcbiAgICAgICAgXCJhcmlhLXJlYWRvbmx5XCI6IFwiZmFsc2VcIixcbiAgICAgICAgLy9cImFyaWEtcmVsZXZhbnRcIjogXCJhZGRpdGlvbnMgdGV4dFwiLCBUT0RPOiBhcmUgbXVsdGlwbGUgdmFsdWVzIHN1cHBvcnRlZD9cbiAgICAgICAgXCJhcmlhLXJlcXVpcmVkXCI6IFwiZmFsc2VcIixcbiAgICAgICAgXCJhcmlhLXNlbGVjdGVkXCI6IHVuZGVmaW5lZCxcbiAgICAgICAgXCJhcmlhLXNvcnRcIjogXCJub25lXCJcbiAgICB9XG5cbiAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbC1hYW0tMS4wLyNodG1sLWF0dHJpYnV0ZS1zdGF0ZS1hbmQtcHJvcGVydHktbWFwcGluZ3NcbiAgICBwdWJsaWMgc3RhdGljIGFyaWFBdHRyaWJ1dGVJbXBsaWNpdE1hcHBpbmdzID0ge1xuICAgICAgICBcImFyaWEtYXV0b2NvbXBsZXRlXCI6IHtcbiAgICAgICAgICAgIFwiZm9ybVwiOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcIm9mZlwiID09PSBlLmdldEF0dHJpYnV0ZShcImF1dG9jb21wbGV0ZVwiKSA/IFwibm9uZVwiIDogXCJib3RoXCI7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJpbnB1dFwiOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcIm9mZlwiID09PSBlLmdldEF0dHJpYnV0ZShcImF1dG9jb21wbGV0ZVwiKSA/IFwibm9uZVwiIDogXCJib3RoXCI7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJzZWxlY3RcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJvZmZcIiA9PT0gZS5nZXRBdHRyaWJ1dGUoXCJhdXRvY29tcGxldGVcIikgPyBcIm5vbmVcIiA6IFwiYm90aFwiO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwidGV4dGFyZWFcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJvZmZcIiA9PT0gZS5nZXRBdHRyaWJ1dGUoXCJhdXRvY29tcGxldGVcIikgPyBcIm5vbmVcIiA6IFwiYm90aFwiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtY2hlY2tlZFwiOiB7XG4gICAgICAgICAgICBcImlucHV0XCI6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGUuaGFzQXR0cmlidXRlKFwiaW5kZXRlcm1pbmF0ZVwiKSkgcmV0dXJuIFwibWl4ZWRcIjtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJcIiArIGUuaGFzQXR0cmlidXRlKFwiY2hlY2tlZFwiKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm1lbnVpdGVtXCI6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGUuaGFzQXR0cmlidXRlKFwiaW5kZXRlcm1pbmF0ZVwiKSkgcmV0dXJuIFwibWl4ZWRcIjtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJcIiArIGUuaGFzQXR0cmlidXRlKFwiY2hlY2tlZFwiKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIipcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoZS5oYXNBdHRyaWJ1dGUoXCJpbmRldGVybWluYXRlXCIpKSByZXR1cm4gXCJtaXhlZFwiO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWRpc2FibGVkXCI6IHtcbiAgICAgICAgICAgIFwiYnV0dG9uXCI6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGUuaGFzQXR0cmlidXRlKFwiZGlzYWJsZWRcIikgPyBcInRydWVcIiA6IFwiZmFsc2VcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZmllbGRzZXRcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5oYXNBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiKSA/IFwidHJ1ZVwiIDogXCJmYWxzZVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJpbnB1dFwiOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlLmhhc0F0dHJpYnV0ZShcImRpc2FibGVkXCIpID8gXCJ0cnVlXCIgOiBcImZhbHNlXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm9wdGdyb3VwXCI6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGUuaGFzQXR0cmlidXRlKFwiZGlzYWJsZWRcIikgPyBcInRydWVcIiA6IFwiZmFsc2VcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwib3B0aW9uXCI6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGUuaGFzQXR0cmlidXRlKFwiZGlzYWJsZWRcIikgPyBcInRydWVcIiA6IFwiZmFsc2VcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwic2VsZWN0XCI6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGUuaGFzQXR0cmlidXRlKFwiZGlzYWJsZWRcIikgPyBcInRydWVcIiA6IFwiZmFsc2VcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwidGV4dGFyZWFcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5oYXNBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiKSA/IFwidHJ1ZVwiIDogXCJmYWxzZVwiXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1leHBhbmRlZFwiOiB7XG4gICAgICAgICAgICBcImRldGFpbHNcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5nZXRBdHRyaWJ1dGUoXCJvcGVuXCIpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJkaWFsb2dcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5nZXRBdHRyaWJ1dGUoXCJvcGVuXCIpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1tdWx0aXNlbGVjdGFibGVcIjoge1xuICAgICAgICAgICAgXCJzZWxlY3RcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoZS5oYXNBdHRyaWJ1dGUoXCJtdWx0aXBsZVwiKSkgcmV0dXJuIFwidHJ1ZVwiO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXBsYWNlaG9sZGVyXCI6IHtcbiAgICAgICAgICAgIFwiaW5wdXRcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5nZXRBdHRyaWJ1dGUoXCJwbGFjZWhvbGRlclwiKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwidGV4dGFyZWFcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5nZXRBdHRyaWJ1dGUoXCJwbGFjZWhvbGRlclwiKVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtcmVxdWlyZWRcIjoge1xuICAgICAgICAgICAgXCJpbnB1dFwiOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlLmdldEF0dHJpYnV0ZShcInJlcXVpcmVkXCIpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJzZWxlY3RcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5nZXRBdHRyaWJ1dGUoXCJyZXF1aXJlZFwiKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwidGV4dGFyZWFcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5nZXRBdHRyaWJ1dGUoXCJyZXF1aXJlZFwiKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogdGhpcyBtZXRob2QgcmV0dXJucyB1c2VyLWRlZmluZWQgYXJpYSBhdHRyaWJ1dGUgbmFtZSBmcm9tIGRvbVxuICAgICAqIEBwYXJhbSBlbGUgIGVsZW1lbnRcbiAgICAgKiBAcmV0dXJucyB1c2VyIGRlZmluZWQgYXJpYSBhdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRVc2VyRGVmaW5lZEFyaWFBdHRyaWJ1dGVzKGVsZW0pIHtcbiAgICAgICAgbGV0IGFyaWFBdHRyaWJ1dGVzID0gW107XG4gICAgICAgIGxldCBkb21BdHRyaWJ1dGVzID0gZWxlbS5hdHRyaWJ1dGVzO1xuICAgICAgICBpZiAoZG9tQXR0cmlidXRlcykge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkb21BdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGF0dHJOYW1lID0gZG9tQXR0cmlidXRlc1tpXS5uYW1lLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIGxldCBpc0FyaWEgPSBhdHRyTmFtZS5zdWJzdHJpbmcoMCwgNSkgPT09ICdhcmlhLSc7XG4gICAgICAgICAgICAgICAgaWYgKGlzQXJpYSlcbiAgICAgICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZXMucHVzaChhdHRyTmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFyaWFBdHRyaWJ1dGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHRoaXMgbWV0aG9kIHJldHVybnMgdXNlci1kZWZpbmVkIGh0bWwgYXR0cmlidXRlIG5hbWUgZnJvbSBkb21cbiAgICAgKiBAcGFyYW0gZWxlICBlbGVtZW50XG4gICAgICogQHJldHVybnMgdXNlciBkZWZpbmVkIGh0bWwgYXR0cmlidXRlc1xuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0VXNlckRlZmluZWRIdG1sQXR0cmlidXRlcyhlbGVtKSB7XG4gICAgICAgIGxldCBodG1sQXR0cmlidXRlcyA9IFtdO1xuICAgICAgICBsZXQgZG9tQXR0cmlidXRlcyA9IGVsZW0uYXR0cmlidXRlcztcbiAgICAgICAgaWYgKGRvbUF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZG9tQXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBhdHRyTmFtZSA9IGRvbUF0dHJpYnV0ZXNbaV0ubmFtZS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBsZXQgaXNBcmlhID0gYXR0ck5hbWUuc3Vic3RyaW5nKDAsIDUpID09PSAnYXJpYS0nO1xuICAgICAgICAgICAgICAgIGlmICghaXNBcmlhKVxuICAgICAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlcy5wdXNoKGF0dHJOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaHRtbEF0dHJpYnV0ZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogdGhpcyBtZXRob2QgcmV0dXJucyB1c2VyLWRlZmluZWQgYXJpYSBhdHRyaWJ1dGUgbmFtZS12YWx1ZSBwYWlyIGZyb20gZG9tXG4gICAgICogQHBhcmFtIGVsZSAgZWxlbWVudFxuICAgICAqIEByZXR1cm5zIHVzZXIgZGVmaW5lZCBhcmlhIGF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldFVzZXJEZWZpbmVkQXJpYUF0dHJpYnV0ZU5hbWVWYWx1ZVBhaXJzKGVsZW0pIHtcbiAgICAgICAgbGV0IGFyaWFBdHRyaWJ1dGVzID0gW107XG4gICAgICAgIGxldCBkb21BdHRyaWJ1dGVzID0gZWxlbS5hdHRyaWJ1dGVzO1xuICAgICAgICBpZiAoZG9tQXR0cmlidXRlcykge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkb21BdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGF0dHJOYW1lID0gZG9tQXR0cmlidXRlc1tpXS5uYW1lLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIGxldCBhdHRyVmFsdWUgPSBlbGVtLmdldEF0dHJpYnV0ZShhdHRyTmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKGF0dHJWYWx1ZSA9PT0gJycpIGF0dHJWYWx1ZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgbGV0IGlzQXJpYSA9IGF0dHJOYW1lLnN1YnN0cmluZygwLCA1KSA9PT0gJ2FyaWEtJztcbiAgICAgICAgICAgICAgICBpZiAoaXNBcmlhKVxuICAgICAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlcy5wdXNoKHsgbmFtZTogYXR0ck5hbWUsIHZhbHVlOiBhdHRyVmFsdWUgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFyaWFBdHRyaWJ1dGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHRoaXMgbWV0aG9kIHJldHVybnMgdXNlci1kZWZpbmVkIGh0bWwgYXR0cmlidXRlIG5hbWUtdmFsdWUgcGFpciBmcm9tIGRvbVxuICAgICAqIEBwYXJhbSBlbGUgIGVsZW1lbnRcbiAgICAgKiBAcmV0dXJucyB1c2VyIGRlZmluZWQgaHRtbCBhdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRVc2VyRGVmaW5lZEh0bWxBdHRyaWJ1dGVOYW1lVmFsdWVQYWlycyhlbGVtKSB7XG4gICAgICAgIGxldCBodG1sQXR0cmlidXRlcyA9IFtdO1xuICAgICAgICBsZXQgZG9tQXR0cmlidXRlcyA9IGVsZW0uYXR0cmlidXRlcztcbiAgICAgICAgaWYgKGRvbUF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZG9tQXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBhdHRyTmFtZSA9IGRvbUF0dHJpYnV0ZXNbaV0ubmFtZS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBsZXQgYXR0clZhbHVlID0gZWxlbS5nZXRBdHRyaWJ1dGUoYXR0ck5hbWUpO1xuICAgICAgICAgICAgICAgIGlmIChhdHRyVmFsdWUgPT09ICcnKSBhdHRyVmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgICAgIGxldCBpc0FyaWEgPSBhdHRyTmFtZS5zdWJzdHJpbmcoMCwgNSkgPT09ICdhcmlhLSc7XG4gICAgICAgICAgICAgICAgaWYgKCFpc0FyaWEpXG4gICAgICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVzLnB1c2goeyBuYW1lOiBhdHRyTmFtZSwgdmFsdWU6IGF0dHJWYWx1ZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaHRtbEF0dHJpYnV0ZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaGFuZGxlcyBpbXBsaWNpdCBhcmlhIGRlZmluaXRpb25zLCBmb3IgZXhhbXBsZSwgYW4gaW5wdXQgd2l0aCBjaGVja2VkIGlzIGVxdWl2YWxlbnQgdG8gYXJpYS1jaGVja2VkPVwidHJ1ZVwiXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRBcmlhQXR0cmlidXRlKGVsZSwgYXR0cmlidXRlTmFtZSkge1xuICAgICAgICAvLyBJZiB0aGUgYXR0cmlidXRlIGlzIGRlZmluZWQsIGl0IHRha2VzIHByZWNlZGVuY2VcbiAgICAgICAgbGV0IHJldFZhbCA9IGVsZS5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7XG5cbiAgICAgICAgaWYgKGVsZS5oYXNBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSkgJiYgcmV0VmFsLnRyaW0oKSA9PT0gXCJcIikgeyAvL1wiXCIgaXMgdHJlYXRlZCBhcyBmYWxzZSwgc28gd2UgbmVlZCByZXR1cm4gaXQgYmVmb3JlIHRoZSBiZWxvdyBjaGVja1xuICAgICAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGVuIGRldGVybWluZSBpbXBsaWNpdCB2YWx1ZXMgZnJvbSBvdGhlciBhdHRyaWJ1dGVzXG4gICAgICAgIGlmICghcmV0VmFsKSB7XG4gICAgICAgICAgICBsZXQgdGFnID0gZWxlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBpZiAoYXR0cmlidXRlTmFtZSBpbiBBcmlhVXRpbC5hcmlhQXR0cmlidXRlSW1wbGljaXRNYXBwaW5ncykge1xuICAgICAgICAgICAgICAgIGlmICh0YWcgaW4gQXJpYVV0aWwuYXJpYUF0dHJpYnV0ZUltcGxpY2l0TWFwcGluZ3NbYXR0cmlidXRlTmFtZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gQXJpYVV0aWwuYXJpYUF0dHJpYnV0ZUltcGxpY2l0TWFwcGluZ3NbYXR0cmlidXRlTmFtZV1bdGFnXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiAocmV0VmFsKSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwgPSByZXRWYWwoZWxlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXCIqXCIgaW4gQXJpYVV0aWwuYXJpYUF0dHJpYnV0ZUltcGxpY2l0TWFwcGluZ3NbYXR0cmlidXRlTmFtZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gQXJpYVV0aWwuYXJpYUF0dHJpYnV0ZUltcGxpY2l0TWFwcGluZ3NbYXR0cmlidXRlTmFtZV1bXCIqXCJdO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIChyZXRWYWwpID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IHJldFZhbChlbGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgcm9sZS1iYXNlZCBkZWZhdWx0c1xuICAgICAgICBpZiAoIXJldFZhbCkge1xuICAgICAgICAgICAgbGV0IHJvbGUgPSBBUklBTWFwcGVyLm5vZGVUb1JvbGUoZWxlKTtcbiAgICAgICAgICAgIGlmIChyb2xlIGluIEFyaWFVdGlsLmFyaWFBdHRyaWJ1dGVSb2xlRGVmYXVsdHMgJiYgYXR0cmlidXRlTmFtZSBpbiBBcmlhVXRpbC5hcmlhQXR0cmlidXRlUm9sZURlZmF1bHRzW3JvbGVdKSB7XG4gICAgICAgICAgICAgICAgcmV0VmFsID0gQXJpYVV0aWwuYXJpYUF0dHJpYnV0ZVJvbGVEZWZhdWx0c1tyb2xlXVthdHRyaWJ1dGVOYW1lXTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIChyZXRWYWwpID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gcmV0VmFsKGVsZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3RpbGwgbm90IGRlZmluZWQ/IENoZWNrIGdsb2JhbCBkZWZhdWx0c1xuICAgICAgICBpZiAoIXJldFZhbCAmJiBhdHRyaWJ1dGVOYW1lIGluIEFyaWFVdGlsLmFyaWFBdHRyaWJ1dGVHbG9iYWxEZWZhdWx0cykge1xuICAgICAgICAgICAgcmV0VmFsID0gQXJpYVV0aWwuYXJpYUF0dHJpYnV0ZUdsb2JhbERlZmF1bHRzW2F0dHJpYnV0ZU5hbWVdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpc0RlZmluZWRBcmlhQXR0cmlidXRlKGVsZSwgYXR0ck5hbWUpIHtcbiAgICAgICAgbGV0IGlzRGVmaW5lZEFyaWFBdHRyaWJ1dGUgPSBmYWxzZTtcbiAgICAgICAgaWYgKGF0dHJOYW1lLnN1YnN0cmluZygwLCA1KSA9PT0gJ2FyaWEtJykge1xuICAgICAgICAgICAgLy8gVXNlciBhZ2VudHMgU0hPVUxEIHRyZWF0IHN0YXRlIGFuZCBwcm9wZXJ0eSBhdHRyaWJ1dGVzIHdpdGggYSB2YWx1ZSBvZiBcIlwiIHRoZSBzYW1lIGFzIHRoZXkgdHJlYXQgYW4gYWJzZW50IGF0dHJpYnV0ZS5cbiAgICAgICAgICAgIGlzRGVmaW5lZEFyaWFBdHRyaWJ1dGUgPSBlbGUuaGFzQXR0cmlidXRlICYmIGVsZS5oYXNBdHRyaWJ1dGUoYXR0ck5hbWUpICYmIGVsZS5nZXRBdHRyaWJ1dGUoYXR0ck5hbWUpLmxlbmd0aCA+IDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzRGVmaW5lZEFyaWFBdHRyaWJ1dGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV0FJLUFSSUHigJlzIHJvbGUgYXR0cmlidXRlIG1heSBoYXZlIGEgbGlzdCBvZiB2YWx1ZXMsIGJ1dCBvbmx5IHRoZSBmaXJzdCB2YWxpZCBhbmQgc3VwcG9ydGVkIFdBSS1BUklBIHJvbGUgaXMgdXNlZFxuICAgICAqIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93YWktYXJpYS1pbXBsZW1lbnRhdGlvbi8jbWFwcGluZ19yb2xlX3RhYmxlXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgcmV0cmlldmluZyB0aGUgcmVzb2xlZCByb2xlIGZvciBhbiBlbGVtZW50LlxuICAgICAqIEBwYXJtIHtIVE1MRWxlbWVudH0gZWxlIC0gZWxlbWVudCBmb3Igd2hpY2ggdG8gZmluZCByb2xlLlxuICAgICAqXG4gICAgICogQHJldHVybiBzdHJpbmcgLSByZXNvbHZlZCByb2xlIGZvciB0aGUgZWxlbWVudDpcbiAgICAgKiAgICAgICBleHBsaWNpdCByb2xlOiByZXNvbGVkIGZyb20gdGhlIGxpc3Qgb2YgdmFsdWVzXG4gICAgICogICAgICAgaW1wbGljaXQgcm9sZTogaWYgbm90IGV4cGxpY2l0ZWx5IHNwZWNpZmllZCwgb3Igbm9uZSBvZiB0aGUgc3BlY2lmaWVkIHJvbGUgdmFsdWVzIGlzIGFsbG93ZWQgZm9yIHRoZSBlbGVtZW50XG4gICAgICogICAgICAgbnVsbDogaWYgbm9uZSBvZiB0aGUgc3BlY2lmaWVkIHJvbGUgdmFsdWVzIGlzIGFsbG93ZWQgZm9yIHRoZSBlbGVtZW50LCBuZWl0aGVyIGltcGxpY2l0IHJvbGUgZXhpc3RzXG4gICAgICogICAgICAgXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRSZXNvbHZlZFJvbGUoZWxlbTogRWxlbWVudCwgY29uc2lkZXJJbXBsaWNpdFJvbGVzOiBib29sZWFuID0gdHJ1ZSk6IHN0cmluZyB7XG4gICAgICAgIGlmICghZWxlbSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCByb2xlID0gQ2FjaGVVdGlsLmdldENhY2hlKGVsZW0sIFwiUlBUVVRJTF9FTEVNRU5UX1JFU09MVkVEX1JPTEVcIiwgbnVsbCk7XG4gICAgICAgIGlmIChyb2xlID09PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCByb2xlcyA9IEFyaWFVdGlsLmdldFVzZXJEZWZpbmVkUm9sZXMoZWxlbSk7IFxuICAgICAgICAgICAgbGV0IHRhZ1Byb3BlcnR5ID0gQXJpYVV0aWwuZ2V0RWxlbWVudEFyaWFQcm9wZXJ0eShlbGVtKTtcbiAgICAgICAgICAgIGxldCBhbGxvd2VkUm9sZXMgPSBBcmlhVXRpbC5nZXRBbGxvd2VkQXJpYVJvbGVzKGVsZW0sIHRhZ1Byb3BlcnR5KTtcbiAgICAgICAgICAgIGxldCBjb250YWluc0dlbmVyaWMgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChyb2xlcyAmJiByb2xlcy5sZW5ndGggPiAwICYmIGFsbG93ZWRSb2xlcyAmJiBhbGxvd2VkUm9sZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm9sZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFsbG93ZWRSb2xlcy5pbmNsdWRlcyhcImFueVwiKSB8fCBhbGxvd2VkUm9sZXMuaW5jbHVkZXMocm9sZXNbaV0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWxsb3dlZFJvbGVzLmluY2x1ZGVzKFwiYW55XCIpICYmIHJvbGVzW2ldID09PSAnZ2VuZXJpYycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluc0dlbmVyaWMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICByb2xlID0gcm9sZXNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocm9sZSA9PT0gXCJwcmVzZW50YXRpb25cIiB8fCByb2xlID09PSBcIm5vbmVcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGVsZW1lbnQgaXMgZm9jdXNhYmxlLCB0aGVuIHByZXNlbnRhdGlvbiByb2xlcyBhcmUgdG8gYmUgaWdub3JlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDb21tb25VdGlsLmlzRm9jdXNhYmxlKGVsZW0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcmVzZXQgcnVsZSB0byBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGUgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY29udGFpbnNHZW5lcmljKSByb2xlID0gJ2dlbmVyaWMnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAocm9sZSA9PT0gbnVsbCAmJiBjb25zaWRlckltcGxpY2l0Um9sZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbXBsaWNpdFJvbGUgPSBBcmlhVXRpbC5nZXRJbXBsaWNpdFJvbGUoZWxlbSk7XG4gICAgICAgICAgICAgICAgcm9sZSA9IGltcGxpY2l0Um9sZSAmJiBpbXBsaWNpdFJvbGUubGVuZ3RoID4gMCA/IGltcGxpY2l0Um9sZVswXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlJQVFVUSUxfRUxFTUVOVF9SRVNPTFZFRF9ST0xFXCIsIHJvbGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByb2xlICE9PSB1bmRlZmluZWQgPyByb2xlIDogbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciByZXRyaWV2aW5nIHVzZXIgZGVmaW5lZCBlbGVtZW50J3Mgcm9sZXMgZnJvbSBkb20uXG4gICAgICogQHBhcm0ge0hUTUxFbGVtZW50fSBlbGUgLSBlbGVtZW50IGZvciB3aGljaCB0byBmaW5kIHJvbGUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtMaXN0fSByb2xlcyAtIGxpc3Qgb2YgdXNlciBkZWZpbmVkIHJvbGVzIGluIHRoZSBlbGVtZW50IHJvbGUgYXR0cmlidXRlLlxuICAgICAqXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRVc2VyRGVmaW5lZFJvbGVzKGVsZTogRWxlbWVudCk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIEFyaWFVdGlsLmdldFJvbGVzKGVsZSwgZmFsc2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIHJldHJpZXZpbmcgZWxlbWVudCdzIHJvbGVzLlxuICAgICAqIFRoaXMgZnVuY3Rpb24gYWxzbyBmaW5kcyBpbXBsaWNpdCByb2xlcy5cbiAgICAgKiBAcGFybSB7SFRNTEVsZW1lbnR9IGVsZSAtIGVsZW1lbnQgZm9yIHdoaWNoIHRvIGZpbmQgcm9sZS5cbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJJbXBsaWNpdFJvbGVzIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBpbXBsaWNpdCByb2xlcyBzZXR0aW5nIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAqXG4gICAgICogQHJldHVybiB7TGlzdH0gcm9sZXMgLSBsaXN0IG9mIGF0dHJpYnV0ZSByb2xlcyBhbmQgaW1wbGljaXQgcm9sZXMuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldFJvbGVzKGVsZTogRWxlbWVudCwgY29uc2lkZXJJbXBsaWNpdFJvbGVzOiBib29sZWFuKTogc3RyaW5nW10ge1xuICAgICAgICBsZXQgcm9sZXM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGlmIChlbGUgJiYgZWxlLmhhc0F0dHJpYnV0ZSAmJiBlbGUuaGFzQXR0cmlidXRlKFwicm9sZVwiKSkge1xuICAgICAgICAgICAgbGV0IGF0dHJSb2xlcyA9IENvbW1vblV0aWwubm9ybWFsaXplU3BhY2luZyhlbGUuZ2V0QXR0cmlidXRlKFwicm9sZVwiKS50cmltKCkpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXR0clJvbGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgcm9sZXMucHVzaChhdHRyUm9sZXNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy9jaGVjayBpZiBpbXBsaWNpdCByb2xlcyBleGlzdC5cbiAgICAgICAgLy9Ob3RlOiBlbGVtZW50IGNhbiBoYXZlIG11bHRpcGxlIGltcGxpY2l0IHJvbGVzXG4gICAgICAgIGlmIChjb25zaWRlckltcGxpY2l0Um9sZXMpIHtcbiAgICAgICAgICAgIGxldCBpbXBsaWNpdFJvbGUgPSBBcmlhVXRpbC5nZXRJbXBsaWNpdFJvbGUoZWxlKTtcbiAgICAgICAgICAgIGlmIChpbXBsaWNpdFJvbGUgIT09IG51bGwgJiYgaW1wbGljaXRSb2xlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAvL2FkZCBpbXBsaWNpdCByb2xlcyB0byB0aGUgYXR0cmlidXRlcyByb2xlcy5cbiAgICAgICAgICAgICAgICBDb21tb25VdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QoaW1wbGljaXRSb2xlLCByb2xlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJvbGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGltcGxpY2l0IHJvbGUgb2YgdGhlIGVsZW1lbWVudFxuICAgICAqIEBwYXJtIHtIVE1MRWxlbWVudH0gZWxlIC0gZWxlbWVudCBmb3Igd2hpY2ggdG8gZmluZCByb2xlLlxuICAgICAqXG4gICAgICogQHJldHVybiB0aGUgaW1wbGljaXQgcm9sZSBvciBbXSBpZiBkb2Vzbid0IGV4aXN0XG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEltcGxpY2l0Um9sZShlbGUpOiBzdHJpbmdbXSB7XG4gICAgICAgIGlmICghZWxlIHx8IGVsZS5ub2RlVHlwZSAhPT0gMSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBpbXBsaWNpdFJvbGVzOiBzdHJpbmdbXSA9IENhY2hlVXRpbC5nZXRDYWNoZShlbGUsIFwiQXJpYVV0aWxfSW1wbGljaXRSb2xlXCIsIG51bGwpO1xuICAgICAgICBpZiAoIWltcGxpY2l0Um9sZXMpIHtcbiAgICAgICAgICAgIGxldCB0YWdQcm9wZXJ0eSA9IEFyaWFVdGlsLmdldEVsZW1lbnRBcmlhUHJvcGVydHkoZWxlKTtcbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZXJlIGFyZSBhbnkgaW1wbGljaXQgcm9sZXMgZm9yIHRoaXMgZWxlbWVudC5cbiAgICAgICAgICAgIGlmICh0YWdQcm9wZXJ0eSAmJiB0YWdQcm9wZXJ0eS5pbXBsaWNpdFJvbGUpIHtcbiAgICAgICAgICAgICAgICBpZiAodGFnUHJvcGVydHkuaW1wbGljaXRSb2xlLmluY2x1ZGVzKFwiZ2VuZXJpY1wiKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgJ2dlbmVyaWMnIHJvbGUgaXMgb25seSBhbGxvd2VkIGlmIGEgdmFsaWQgYXJpYSBhdHRyaWJ1dGUgZXhpc3RzLlxuICAgICAgICAgICAgICAgICAgICBsZXQgZG9tQXJpYUF0dHJpYnV0ZXMgPSBBcmlhVXRpbC5nZXRVc2VyRGVmaW5lZEFyaWFBdHRyaWJ1dGVzKGVsZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkb21BcmlhQXR0cmlidXRlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGUsIFwiQXJpYVV0aWxfSW1wbGljaXRSb2xlXCIsIFtdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZXQgcm9sZUF0dHJpYnV0ZXMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBhdHRlcm4gPSBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNbJ2dlbmVyaWMnXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhdHRlcm4ucmVxUHJvcHMgJiYgcGF0dGVybi5yZXFQcm9wcy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KHBhdHRlcm4ucmVxUHJvcHMsIHJvbGVBdHRyaWJ1dGVzKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnUHJvcGVydHkuZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZClcbiAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdChBUklBRGVmaW5pdGlvbnMuZ2xvYmFsUHJvcGVydGllcywgcm9sZUF0dHJpYnV0ZXMpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXR0ZXJuLmRlcHJlY2F0ZWRQcm9wcyAmJiBwYXR0ZXJuLmRlcHJlY2F0ZWRQcm9wcy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5yZWR1Y2VBcnJheUl0ZW1MaXN0KHBhdHRlcm4uZGVwcmVjYXRlZFByb3BzLCByb2xlQXR0cmlidXRlcyk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlICdnZW5lcmljJyByb2xlIGlmIHJvbGVBdHRyaWJ1dGVzIGRvZXNuJ3QgY29udGFpbiBhbnkgb2YgZG9tQXJpYUF0dHJpYnV0ZXMgXG4gICAgICAgICAgICAgICAgICAgIGlmIChyb2xlQXR0cmlidXRlcy5sZW5ndGggPiAwICYmICFyb2xlQXR0cmlidXRlcy5zb21lKGF0dHIgPT4gZG9tQXJpYUF0dHJpYnV0ZXMuaW5jbHVkZXMoYXR0cikpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW1wbGljaXQgPSBDb21tb25VdGlsLnJlZHVjZUFycmF5SXRlbUxpc3QoWydnZW5lcmljJ10sIHRhZ1Byb3BlcnR5LmltcGxpY2l0Um9sZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlLCBcIkFyaWFVdGlsX0ltcGxpY2l0Um9sZVwiLCBpbXBsaWNpdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW1wbGljaXQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZSwgXCJBcmlhVXRpbF9JbXBsaWNpdFJvbGVcIiwgdGFnUHJvcGVydHkuaW1wbGljaXRSb2xlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGFnUHJvcGVydHkuaW1wbGljaXRSb2xlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZSwgXCJBcmlhVXRpbF9JbXBsaWNpdFJvbGVcIiwgW10pO1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbXBsaWNpdFJvbGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHJlcXVpcmVkIHByb3BlcnRpZXMgb2YgdGhlIHJvbGVcbiAgICAgKiBAcGFybSB7c3RyaW5nfSByb2xlIC0gdGhlIHJvbGVcbiAgICAgKiBAcGFybSB7SFRNTEVsZW1lbnR9IGVsZSAtIGVsZW1lbnQgZm9yIHdoaWNoIHRvIGZpbmQgcm9sZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0xpc3R9IHByb3BlcnRpZXMgLSBsaXN0IG9mIHByb3BlcnRpZXMgdGhhdCBhcmUgcmVxdWlyZWQgYnkgdGhlIHJvbGVcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Um9sZVJlcXVpcmVkUHJvcGVydGllcyhyb2xlLCBlbGUpIHtcbiAgICAgICAgaWYgKHJvbGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlXSkge1xuICAgICAgICAgICAgbGV0IHJlcXVpcmVkQXR0cmlidXRlcyA9IEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlXS5yZXFQcm9wcztcbiAgICAgICAgICAgIC8vIGhhbmRsZSBzcGVjaWFsIGNhc2Ugb2Ygc2VwYXJhdG9yXG4gICAgICAgICAgICBpZiAocm9sZS50b0xvd2VyQ2FzZSgpID09PSBcInNlcGFyYXRvclwiICYmIGVsZSAmJiBDb21tb25VdGlsLmlzRm9jdXNhYmxlKGVsZSkpIHtcbiAgICAgICAgICAgICAgICByZXF1aXJlZEF0dHJpYnV0ZXMgPSBDb21tb25VdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QoW1wiYXJpYS12YWx1ZW5vd1wiXSwgcmVxdWlyZWRBdHRyaWJ1dGVzIHx8IFtdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXF1aXJlZEF0dHJpYnV0ZXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGZpbmRpbmcgaWYgYSBlbGVtZW50IGhhcyBnaXZlbiByb2xlLlxuICAgICAqIFRoaXMgZnVuY3Rpb24gYXNsbyBmaW5kcyBpZiBlbGVtZW50IGhhcyBnaXZlbiByb2xlcyBhcyBpbXBsaWNpdCByb2xlLlxuICAgICAqIEBwYXJtIHtIVE1MRWxlbWVudH0gZWxlIC0gZWxlbWVudCBmb3Igd2hpY2ggdG8gZmluZCByb2xlLlxuICAgICAqIEBwYXJtIHtsaXN0IG9yIHN0cmluZ30gcm9sZXMgLSBMaXN0IG9yIHNpbmdsZSByb2xlIGZvciB3aGljaCB0byBmaW5kIGlmIGVsZW1lbnQgaGFzIHRoZXNlIHJvbGVzLlxuICAgICAqIEBwYXJtIHtib29sfSBjb25zaWRlckltcGxpY2l0Um9sZXMgLSB0cnVlIG9yIGZhbHNlIGJhc2VkIG9uIGlmIGltcGxpY2l0IHJvbGVzIHNldHRpbmcgc2hvdWxkIGJlIGNvbnNpZGVyZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtMaXN0fSByZXRWYWwgLSB0cnVlIG9yIGZhbHNlIGJhc2VkIG9uIGlmIHRoIGVsZW1lbnQgaGFzIHRoZSBzcGVjaWZpZWQgcm9sZS5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqXG4gICAgICogQ29uc2lkZXIgdG8gdXNlIGhhc1JvbGVJblNlbWFudGljcygpIGluc3RlYWQuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBoYXNSb2xlKGVsZSwgcm9sZSwgY29uc2lkZXJJbXBsaWNpdFJvbGVzPykgeyAgLy9Db25zaWRlciB0byB1c2UgaGFzUm9sZUluU2VtYW50aWNzKCkgaW5zdGVhZC5cbiAgICAgICAgbGV0IHJldFZhbCA9IGZhbHNlO1xuICAgICAgICBpZiAoZWxlICYmIGVsZS5oYXNBdHRyaWJ1dGUgJiYgZWxlLmhhc0F0dHJpYnV0ZShcInJvbGVcIikpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgKHJvbGUpICE9IHR5cGVvZiAoXCJcIikpIHtcbiAgICAgICAgICAgICAgICBsZXQgcm9sZXMgPSBlbGUuZ2V0QXR0cmlidXRlKFwicm9sZVwiKS50cmltKCkuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyAhcmV0VmFsICYmIGkgPCByb2xlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICByZXRWYWwgPSByb2xlc1tpXSBpbiByb2xlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHJvbGVzID0gZWxlLmdldEF0dHJpYnV0ZShcInJvbGVcIikudHJpbSgpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgIXJldFZhbCAmJiBpIDwgcm9sZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gcm9sZXNbaV0gPT09IHJvbGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vaWYgbm9uZSBvZiB0aGUgdGhlIGF0dHJpYnV0ZSByb2xlcyBtYXRjaGVkIHdpdGggZ2l2ZW4gcm9sZVxuICAgICAgICAvL2NoZWNrIGlmIGltcGxpY2l0IHJvbGVzIG1hdGNoZXMuXG4gICAgICAgIC8vTm90ZTogZWxlbWVudCBjYW4gaGF2ZSBtdWx0aXBsZSBpbXBsaWNpdCByb2xlc1xuICAgICAgICBpZiAoIXJldFZhbCAmJiBjb25zaWRlckltcGxpY2l0Um9sZXMpIHtcbiAgICAgICAgICAgIGxldCB3Um9sZXMgPSBbXTtcbiAgICAgICAgICAgIC8vY2hlY2sgaWYgdGhlcmUgYXJlIGFueSBpbXBsaWNpdCByb2xlcyBmb3IgdGhpcyBlbGVtZW50LlxuICAgICAgICAgICAgbGV0IGltcGxpY2l0Um9sZSA9IEFyaWFVdGlsLmdldEltcGxpY2l0Um9sZShlbGUpO1xuICAgICAgICAgICAgaWYgKGltcGxpY2l0Um9sZSAhPT0gbnVsbCAmJiBpbXBsaWNpdFJvbGUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIENvbW1vblV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdChpbXBsaWNpdFJvbGUsIHdSb2xlcyk7XG4gICAgICAgICAgICAgICAgLy9pZiByb2xlIGlzIGFycmF5IGxvb3AgdGhydSBhbmQgc2VlIGlmIGFueSAgb2YgdGhlIGltcGxpY2l0IHJvbGUgcHJlc2VudCBpbiB0aGUgYXJyYXlcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIChyb2xlKSAhPSB0eXBlb2YgKFwiXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyAhcmV0VmFsICYmIGkgPCB3Um9sZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IHdSb2xlc1tpXSBpbiByb2xlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7ICFyZXRWYWwgJiYgaSA8IHdSb2xlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gd1JvbGVzW2ldID09PSByb2xlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSBlbGVtZW50IGhhcyB0aGUgcm9sZSwgaW5jbHVkaW5nIHRoZSBpbXBsaWVkIHJvbGUgaWYgcm9sZSBpcyBub3QgZXhwbGljaXRseSBzcGVjaWZpZWQuXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlcGxhY2luZyB0aGUgaGFzUm9sZSBmdW5jdGlvblxuICAgICAqXG4gICAgICogQHBhcm0ge0hUTUxFbGVtZW50fSBlbGUgLSBlbGVtZW50IGZvciB3aGljaCB0byBmaW5kIHJvbGUuXG4gICAgICogQHBhcm0ge2xpc3Qgb3Igc3RyaW5nfSByb2xlcyAtIExpc3Qgb3Igc2luZ2xlIHJvbGUgZm9yIHdoaWNoIHRvIGZpbmQgaWYgZWxlbWVudCBoYXMgdGhlc2Ugcm9sZXMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtMaXN0fSByZXRWYWwgLSB0cnVlIG9yIGZhbHNlIGJhc2VkIG9uIGlmIHRoZSBlbGVtZW50IGhhcyB0aGUgc3BlY2lmaWVkIHJvbGUuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGhhc1JvbGVJblNlbWFudGljcyhlbGUsIHJvbGUpIHtcbiAgICAgICAgbGV0IHJldFZhbCA9IGZhbHNlO1xuICAgICAgICBsZXQgcm9sZVNwZWNpZmllZCA9IGZhbHNlO1xuICAgICAgICBpZiAoZWxlICYmIGVsZS5oYXNBdHRyaWJ1dGUgJiYgZWxlLmhhc0F0dHJpYnV0ZShcInJvbGVcIikpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgKHJvbGUpICE9IHR5cGVvZiAoXCJcIikpIHtcbiAgICAgICAgICAgICAgICBsZXQgcm9sZXMgPSBlbGUuZ2V0QXR0cmlidXRlKFwicm9sZVwiKS50cmltKCkudG9Mb3dlckNhc2UoKS5zcGxpdCgvXFxzKy8pO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyAhcmV0VmFsICYmIGkgPCByb2xlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICByb2xlU3BlY2lmaWVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gcm9sZXNbaV0gaW4gcm9sZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCByb2xlcyA9IGVsZS5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpLnNwbGl0KC9cXHMrLyk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7ICFyZXRWYWwgJiYgaSA8IHJvbGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJvbGVTcGVjaWZpZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZXRWYWwgPSByb2xlc1tpXSA9PT0gcm9sZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocm9sZVNwZWNpZmllZCkge1xuICAgICAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vY2hlY2sgaWYgaW1wbGljaXQgcm9sZXMgbWF0Y2hlcy5cbiAgICAgICAgLy9Ob3RlOiBlbGVtZW50IGNhbiBoYXZlIG11bHRpcGxlIGltcGxpY2l0IHJvbGVzXG4gICAgICAgIC8vY2hlY2sgaWYgdGhlcmUgYXJlIGFueSBpbXBsaWNpdCByb2xlcyBmb3IgdGhpcyBlbGVtZW50LlxuICAgICAgICBsZXQgaW1wUm9sZXMgPSBBcmlhVXRpbC5nZXRJbXBsaWNpdFJvbGUoZWxlKTtcbiAgICAgICAgaWYgKGltcFJvbGVzICE9PSBudWxsICYmIGltcFJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vaWYgcm9sZSBpcyBhcnJheSBsb29wIHRocnUgYW5kIHNlZSBpZiBhbnkgIG9mIHRoZSBpbXBsaWNpdCByb2xlIHByZXNlbnQgaW4gdGhlIGFycmF5XG4gICAgICAgICAgICBpZiAodHlwZW9mIChyb2xlKSAhPSB0eXBlb2YgKFwiXCIpKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7ICFyZXRWYWwgJiYgaSA8IGltcFJvbGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IGltcFJvbGVzW2ldIGluIHJvbGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgIXJldFZhbCAmJiBpIDwgaW1wUm9sZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gaW1wUm9sZXNbaV0gPT09IHJvbGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZmluZGluZyBpZiBhIGVsZW1lbnQgaGFzIGdpdmVuIHJvbGUuXG4gICAgICogVGhpcyBmdW5jdGlvbiBhbHNvIGNoZWNrcyBpZiBlbGVtZW50IGhhcyBnaXZlbiByb2xlcyBhcyBpbXBsaWNpdCByb2xlcy5cbiAgICAgKiBAcGFybSB7SFRNTEVsZW1lbnR9IGVsZSAtIGVsZW1lbnQgZm9yIHdoaWNoIHRvIGZpbmQgcm9sZS5cbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJJbXBsaWNpdFJvbGVzIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBpbXBsaWNpdCByb2xlcyBzZXR0aW5nIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAqXG4gICAgICogQHJldHVybiB7Ym9vbH0gcmV0VmFsIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiB0aGUgZWxlbWVudCBoYXMgdGhlIHNwZWNpZmllZCByb2xlLlxuICAgICAqXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBoYXNBbnlSb2xlKGVsZSwgY29uc2lkZXJJbXBsaWNpdFJvbGVzKSB7XG4gICAgICAgIGxldCByZXRWYWwgPSBmYWxzZTtcbiAgICAgICAgaWYgKGVsZSAmJiBlbGUuaGFzQXR0cmlidXRlICYmIGVsZS5oYXNBdHRyaWJ1dGUoXCJyb2xlXCIpKSB7XG4gICAgICAgICAgICByZXRWYWwgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9jaGVjayBpZiBpbXBsaWNpdCByb2xlcyBleGlzdC5cbiAgICAgICAgLy9Ob3RlOiBlbGVtZW50IGNhbiBoYXZlIG11bHRpcGxlIGltcGxpY2l0IHJvbGVzXG4gICAgICAgIGlmICghcmV0VmFsICYmIGNvbnNpZGVySW1wbGljaXRSb2xlcykge1xuICAgICAgICAgICAgLy9jaGVjayBpZiB0aGVyZSBhcmUgYW55IGltcGxpY2l0IHJvbGVzIGZvciB0aGlzIGVsZW1lbnQuXG4gICAgICAgICAgICBsZXQgaW1wUm9sZXMgPSBBcmlhVXRpbC5nZXRJbXBsaWNpdFJvbGUoZWxlKTtcbiAgICAgICAgICAgIGlmIChpbXBSb2xlcyAhPT0gbnVsbCAmJiBpbXBSb2xlcy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgIHJldFZhbCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGlzUHJlc2VudGF0aW9uYWxFbGVtZW50KG5vZGUpIHtcbiAgICAgICAgLy8gRWxlbWVudHMgZXh0cmFjdGVkIGZyb20gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vZG9jcy9XZWIvSFRNTC9FbGVtZW50I0lubGluZV90ZXh0X3NlbWFudGljcyxcbiAgICAgICAgLy8gaHR0cDovL2Rldi53My5vcmcvaHRtbDUvaHRtbC1hdXRob3IvI3RleHQtbGV2ZWwtc2VtYW50aWNzIGFuZCBodHRwczovL3dpa2kud2hhdHdnLm9yZy93aWtpL1ByZXNlbnRhdGlvbmFsX2VsZW1lbnRzX2FuZF9hdHRyaWJ1dGVzXG4gICAgICAgIGxldCBwcmVzZW50YXRpb25hbEVsZW1lbnRzID0gW1wiYWJiclwiLCBcImJcIiwgXCJiZGlcIiwgXCJiZG9cIiwgXCJiclwiLCBcImNpdGVcIiwgXCJjb2RlXCIsIFwiZGF0YVwiLCBcImRmblwiLFxuICAgICAgICAgICAgXCJlbVwiLCBcImlcIiwgXCJrYmRcIiwgXCJtYXJrXCIsIFwicVwiLCBcInJwXCIsIFwicnRcIiwgXCJydGNcIiwgXCJydWJ5XCIsIFwic1wiLFxuICAgICAgICAgICAgXCJzYW1wXCIsIFwic21hbGxcIiwgXCJzcGFuXCIsIFwic3Ryb25nXCIsIFwic3ViXCIsIFwic3VwXCIsIFwidGltZVwiLCBcInVcIixcbiAgICAgICAgICAgIFwidmFyXCIsIFwid2JyXCIsIFwiYVwiLCBcInByb2dyZXNzXCIsIFwibWV0ZXJcIiwgXCJiYXNlZm9udFwiLCBcImJpZ1wiLCBcImNlbnRlclwiLFxuICAgICAgICAgICAgXCJzdHJpa2VcIiwgXCJ0dFwiLCBcImZvbnRcIiwgXCJibGlua1wiLCBcImgxXCIsIFwiaDJcIiwgXCJoM1wiLCBcImg0XCIsIFwiaDVcIiwgXCJoNlwiLFxuICAgICAgICAgICAgXCJoclwiLCBcImJsb2NrcXVvdGVcIiwgXCJwXCJcbiAgICAgICAgXTtcbiAgICAgICAgcmV0dXJuIENvbW1vblV0aWwudmFsSW5BcnJheShub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksIHByZXNlbnRhdGlvbmFsRWxlbWVudHMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHJldHVybiB0aGUgYW5jZXN0b3Igb2YgdGhlIGdpdmVuIGVsZW1lbnQgYW5kIHJvbGUuXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gZWxlbWVudCAtIFRoZSBlbGVtZW50IHRvIHN0YXJ0IHRoZSBub2RlIHdhbGsgb24gdG8gZmluZCBwYXJlbnQgbm9kZVxuICAgICAqIEBwYXJtIHtzdHJpbmd9IHJvbGUgLSBUaGUgcm9sZSB0byBzZWFyY2ggZm9yIG9uIGFuIGVsZW1lbnQgdW5kZXIgdGhlIHByb3ZpZGVkIGVsZW1lbnRcbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJJbXBsaWNpdFJvbGVzIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBpbXBsaWNpdCByb2xlcyBzZXR0aW5nIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAqXG4gICAgICogQHJldHVybiB7bm9kZX0gd2Fsa05vZGUgLSBBIHBhcmVudCBub2RlIG9mIHRoZSBlbGVtZW50IHBhc3NlZCBpbiwgd2hpY2ggaGFzIHRoZSBwcm92aWRlZCByb2xlXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEFuY2VzdG9yV2l0aFJvbGUoZWxlbWVudCwgcm9sZU5hbWUsIGNvbnNpZGVySW1wbGljaXRSb2xlcz8pIHtcbiAgICAgICAgbGV0IHdhbGtOb2RlID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUoZWxlbWVudCk7XG4gICAgICAgIHdoaWxlICh3YWxrTm9kZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGNvbnNpZGVySW1wbGljaXRSb2xlcykge1xuICAgICAgICAgICAgICAgIGlmIChBcmlhVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3Mod2Fsa05vZGUsIHJvbGVOYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChBcmlhVXRpbC5oYXNSb2xlKHdhbGtOb2RlLCByb2xlTmFtZSwgZmFsc2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdhbGtOb2RlID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUod2Fsa05vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3YWxrTm9kZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiByZXR1cm4gdGhlIGFuY2VzdG9yIG9mIHRoZSBnaXZlbiBlbGVtZW50IGFuZCByb2xlcy5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBlbGVtZW50IC0gVGhlIGVsZW1lbnQgdG8gc3RhcnQgdGhlIG5vZGUgd2FsayBvbiB0byBmaW5kIHBhcmVudCBub2RlXG4gICAgICogQHBhcm0ge2FycmF5fSByb2xlcyAtIHRoZSByb2xlIG5hbWVzIHRvIHNlYXJjaCBmb3JcbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJJbXBsaWNpdFJvbGVzIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBpbXBsaWNpdCByb2xlcyBzZXR0aW5nIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAqXG4gICAgICogQHJldHVybiB7bm9kZX0gd2Fsa05vZGUgLSBBIHBhcmVudCBub2RlIG9mIHRoZSBlbGVtZW50IHBhc3NlZCBpbiwgd2hpY2ggaGFzIHRoZSBwcm92aWRlZCByb2xlXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEFuY2VzdG9yV2l0aFJvbGVzKGVsZW1lbnQsIHJvbGVOYW1lcykge1xuICAgICAgICBpZiAoIWVsZW1lbnQgfHwgIXJvbGVOYW1lcyB8fCAhcm9sZU5hbWVzLmxlbmd0aCB8fCByb2xlTmFtZXMubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IHdhbGtOb2RlID0gZWxlbWVudDtcbiAgICAgICAgd2hpbGUgKHdhbGtOb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgcm9sZSA9IEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZSh3YWxrTm9kZSk7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgcm9sZSAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICAgICAgcm9sZU5hbWVzLmluY2x1ZGVzKHJvbGUpIHx8XG4gICAgICAgICAgICAgICAgICAgIChyb2xlTmFtZXMuaW5jbHVkZXMoXCIqXCIpICYmICFbXCJwcmVzZW50YXRpb25cIiwgXCJub25lXCJdLmluY2x1ZGVzKHJvbGUpKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIHJldHVybiB3YWxrTm9kZTtcbiAgICAgICAgICAgIHdhbGtOb2RlID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUod2Fsa05vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHJldHVybiB0aGUgcm9sZXMgd2l0aCBnaXZlbiByb2xlIHR5cGUuXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gZWxlbWVudCAtIFRoZSBlbGVtZW50IHRvIHN0YXJ0IHRoZSBub2RlIHdhbGsgb24gdG8gZmluZCBwYXJlbnQgbm9kZVxuICAgICAqIEBwYXJtIHthcnJheX0gcm9sZVR5cGxlcyAtIHJvbGUgdHlwZXMsIHN1Y2ggYXMgJ3dpZGdldCcsICdzdHJ1Y3R1cmUnIGV0Yy5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge2FycmF5fSByb2xlcyAtIEEgcGFyZW50IG5vZGUgb2YgdGhlIGVsZW1lbnQgcGFzc2VkIGluLCB3aGljaCBoYXMgdGhlIHByb3ZpZGVkIHJvbGVcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Um9sZXNXaXRoVHlwZXMoZWxlbWVudCwgdHlwZXM6IHN0cmluZ1tdKSB7XG4gICAgICAgIGlmICghZWxlbWVudCB8fCAhdHlwZXMgfHwgIXR5cGVzLmxlbmd0aCB8fCB0eXBlcy5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCByb2xlcyA9IENhY2hlVXRpbC5nZXRDYWNoZShlbGVtZW50Lm93bmVyRG9jdW1lbnQsIFwicm9sZXNfd2l0aF9naXZlbl90eXBlc1wiLCBudWxsKTtcbiAgICAgICAgaWYgKCFyb2xlcyB8fCByb2xlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJvbGVzID0gW107XG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyhBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnMpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlcy5pbmNsdWRlcyh2YWx1ZS5yb2xlVHlwZSkpXG4gICAgICAgICAgICAgICAgICAgIHJvbGVzLnB1c2goa2V5KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW1lbnQub3duZXJEb2N1bWVudCwgXCJyb2xlc193aXRoX2dpdmVuX3R5cGVzXCIsIHJvbGVzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcm9sZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcmV0dXJuIHRoZSByb2xlcyB3aXRoIGdpdmVuIHJvbGUgdHlwZS5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBlbGVtZW50IC0gVGhlIGVsZW1lbnQgdG8gc3RhcnQgdGhlIG5vZGUgd2FsayBvbiB0byBmaW5kIHBhcmVudCBub2RlXG4gICAgICogQHBhcm0ge2FycmF5fSByb2xlVHlwbGVzIC0gcm9sZSB0eXBlcywgc3VjaCBhcyAnd2lkZ2V0JywgJ3N0cnVjdHVyZScgZXRjLlxuICAgICAqXG4gICAgICogQHJldHVybiB7YXJyYXl9IHJvbGVzIC0gQSBwYXJlbnQgbm9kZSBvZiB0aGUgZWxlbWVudCBwYXNzZWQgaW4sIHdoaWNoIGhhcyB0aGUgcHJvdmlkZWQgcm9sZVxuICAgICAqXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpc1dpZGdldChlbGVtZW50KSB7XG4gICAgICAgIGlmICghZWxlbWVudCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IHdpZGdldCA9IENhY2hlVXRpbC5nZXRDYWNoZShlbGVtZW50Lm93bmVyRG9jdW1lbnQsIFwiaXNfZWxlbWVudF93aWRnZXRcIiwgbnVsbCk7XG4gICAgICAgIGlmICh3aWRnZXQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIGxldCByZXQgPSBmYWxzZTtcbiAgICAgICAgICAgIGNvbnN0IHJvbGUgPSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUoZWxlbWVudCk7IFxuICAgICAgICAgICAgaWYgKHJvbGUgJiYgQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVdICYmIEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlXS5yb2xlVHlwZSA9PT0gJ3dpZGdldCcpXG4gICAgICAgICAgICAgICAgcmV0ID0gdHJ1ZTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW1lbnQub3duZXJEb2N1bWVudCwgXCJpc19lbGVtZW50X3dpZGdldFwiLCByZXQpO1xuICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd2lkZ2V0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHJldHVybiBpZiB0aGUgZWxlbWVudCBpcyBvd25lZCBvciBjb250cm9sbGVkIGJ5IGFub3RoZXIgZWxlbWVudC4gXG4gICAgICogSWYgYW4gYW5jZXN0b3Igb2YgYW4gZWxlbWVudCBpcyBvd25lZCBvciBjb250cm9sbGVkIGJ5IGFub3RoZXIgZWxlbWVudCwgdGhlbiB0aGUgZWxlbWVudCBpcyBhbHNvIGNvbnNpZGVyZWQgYXMgb3duZWQgb3IgY29udHJvbGxlZC5cbiAgICAgKiBhbiBlbGVtZW50IGNhbiBiZSBvd25lZCBvciBjb250cm9sbGVkIGJ5IGFub3RoZXIgZWxlbWVudCB0aHJvdWdoIGFyaWEtb3ducyBvciBhcmlhLWNvbnRyb2xzXG4gICAgICogICB3aGVuIHRoZSBET00gaGllcmFyY2h5IGNhbm5vdCBiZSB1c2VkIHRvIHJlcHJlc2VudCB0aGUgcmVsYXRpb25zaGlwLlxuICAgICAqIGFyaWEtb3ducyBhdHRyaWJ1dGUgaXMgdXNlZCB0byBkZWZpbmUgY29udGV4dHVhbCByZWxhdGlvbnNoaXAgd2l0aCBhIG93bmluZyBwYXJlbnQgXG4gICAgICogYXJpYS1jb250cm9scyBhdHRyaWJ1dGUgaXMgdXNlZCB0byBhc3NvY2lhdGUgYW4gZWxlbWVudCB3aXRoIHRoZSBjb250cm9sbGluZyBlbGVtZW50LlxuICAgICAqICBleGFtcGxlIGVsZW1lbnRzIHdpdGggcm9sZXM6IGNvbWJvYm94LCBzY3JvbGxiYXIsIHRhYiwgYnV0dG9uLCBsaXN0Ym94LCBtZW51LCBtZW51YmFyLCByYWRpb2dyb3VwLCB0cmVlLCB0cmVlZ3JpZFxuICAgICAqIFxuICAgICAqIHdoZW4gYW4gZWxlbWVudCBpcyBvd25lZCBvciBjb250cm9sbGVkIGJ5IGFub3RoZXIgZWxlbWVudCwgaXRzIG5hdmlnYXRpb24gbWF5IGJlIGNvbnRyb2xsZWQgYnkgdGhlIHBhcmVudCBcbiAgICAgKiAgdGhyb3VnaCBhcmlhLWFjdGl2ZWRlc2NlbmRhbnRzIGF0dHJpYnV0ZSBvciByb3ZpbmcgdGFiaW5kZXhcbiAgICAgKiBcbiAgICAgKiBOb3RlIG5hdmlnYXRpb24gd2l0aCBuYXRpdmUgY29tYm9ib3ggKGlucHV0IHdpdGggYSBkYXRhbGlzdCkgaXMgaW4gbmF0aXZlIGZvY3VzIG5hdmlnYXRpb24sIG5vdCBjb25zaWRlcmVkIGhlcmUgICBcbiAgICAgKiBcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gZWxlbWVudCAtIFRoZSBlbGVtZW50IHRvIGluc3BlY3RcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgaXNOYXZpZ2F0aW9uT3duZWRPckNvbnRyb2xsZWQoZWxlbWVudCA6IEVsZW1lbnQpIHtcbiAgICAgICAgaWYgKCFlbGVtZW50KSByZXR1cm4gZmFsc2U7XG4gICAgICAgIFxuICAgICAgICBsZXQgb3duZXJFbGVtczogRWxlbWVudFtdID0gQ2FjaGVVdGlsLmdldENhY2hlKGVsZW1lbnQub3duZXJEb2N1bWVudCwgXCJBcmlhVXRpbF9OYXZpZ2F0aW9uT3duZWRPckNvbnRyb2xsZWRcIiwgbnVsbCk7XG4gICAgICAgIGlmIChvd25lckVsZW1zICE9PSBudWxsICYmIG93bmVyRWxlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgaWYgKENvbW1vblV0aWwuZ2V0QW5jZXN0b3IoZWxlbWVudCwgb3duZXJFbGVtcykpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJvbGUgPSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUoZWxlbWVudCk7XG4gICAgICAgIGlmICghcm9sZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBcbiAgICAgICAgbGV0IGlkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJpZFwiKTtcbiAgICAgICAgaWYgKCFpZCB8fCBpZC50cmltKCkubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgY29uc3QgZWxlbSA9IGVsZW1lbnQub3duZXJEb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAqW2FyaWEtY29udHJvbHN+PScke2lkfSddLCAqW2FyaWEtb3duc349JyR7aWR9J11gKTtcbiAgICAgICAgaWYgKCFlbGVtKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgY29uc3QgY29udGFpbmVycyA9IFsnY29tYm9ib3gnLCAnc2Nyb2xsYmFyJywgJ2J1dHRvbicsICd0YWInLCAnbGlzdGJveCcsICdtZW51JywgJ21lbnViYXInLCAncmFkaW9ncm91cCcsICd0cmVlJywgJ3RyZWVncmlkJ107XG4gICAgICAgIGlmIChjb250YWluZXJzLmluY2x1ZGVzKHJvbGUpKSB7XG4gICAgICAgICAgICBpZiAob3duZXJFbGVtcyA9PT0gbnVsbClcbiAgICAgICAgICAgICAgICBvd25lckVsZW1zID0gW107XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIG93bmVyRWxlbXMucHVzaChlbGVtZW50KTtcbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtZW50Lm93bmVyRG9jdW1lbnQsIFwiQXJpYVV0aWxfTmF2aWdhdGlvbk93bmVkT3JDb250cm9sbGVkXCIsIG93bmVyRWxlbXMpOyAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gICAgXG4gICAgICAgIFxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZmluZGluZyBhIG5vZGUgd2hpY2ggbWF0Y2hlcyB0aGUgcm9sZSBhbmQgaXMgYSBzaWJsaW5nIG9mIHRoZVxuICAgICAqIHByb3ZpZGVkIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGJ5IGRlZmF1bHQgd2lsbCBub3QgY29uc2lkZXIgQ2hlY2sgSGlkZGVuIFNldHRpbmcgYXQgYWxsLlxuICAgICAqXG4gICAgICogTm90ZTogVGhpcyBpcyBhIHdyYXBwZXIgZnVuY3Rpb24gdG86IEFyaWFVdGlsLmdldFNpYmxpbmdXaXRoUm9sZUhpZGRlblxuICAgICAqXG4gICAgICogQHBhcm0ge2VsZW1lbnR9IGVsZW1lbnQgLSBUaGUgZWxlbWVudCB0byBzdGFydCB0aGUgbm9kZSB3YWxrIG9uIHRvIGZpbmQgc2libGluZyBub2RlXG4gICAgICogQHBhcm0ge3N0cmluZ30gcm9sZSAtIFRoZSByb2xlIHRvIHNlYXJjaCBmb3Igb24gYW4gZWxlbWVudCB1bmRlciB0aGUgcHJvdmlkZWQgZWxlbWVudFxuICAgICAqXG4gICAgICogQHJldHVybiB7bm9kZX0gd2Fsa05vZGUgLSBBIHNpYmxpbmcgbm9kZSBvZiB0aGUgZWxlbWVudCBwYXNzZWQgaW4sIHdoaWNoIGhhcyB0aGUgcHJvdmlkZWQgcm9sZVxuICAgICAqXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRTaWJsaW5nV2l0aFJvbGUoZWxlbWVudCwgcm9sZSkge1xuICAgICAgICByZXR1cm4gQXJpYVV0aWwuZ2V0U2libGluZ1dpdGhSb2xlSGlkZGVuKGVsZW1lbnQsIHJvbGUsIGZhbHNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBmaW5kaW5nIGEgbm9kZSB3aGljaCBtYXRjaGVzIHRoZSByb2xlIGFuZCBpcyBhIHNpYmxpbmcgb2YgdGhlXG4gICAgICogcHJvdmlkZWQgZWxlbWVudC5cbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gYWxzbyBjb25zaWRlcnMgaW1wbGljaXQgcm9sZXMgZm9yIHRoZSBlbGVtZW50cy5cbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gd2lsbCBhbHNvIGNvbnNpZGVyIGVsZW1lbnRzIHRoYXQgYXJlIGhpZGRlbiBiYXNlZCBvbiB0aGUgaWYgdGhlIENoZWNrXG4gICAgICogSGlkZGVuIENvbnRlbnQgc2V0dGluZ3Mgc2hvdWxkIGJlIGNvbnNpZGVyZWQgb3Igbm90LlxuICAgICAqXG4gICAgICogQHBhcm0ge2VsZW1lbnR9IGVsZW1lbnQgLSBUaGUgZWxlbWVudCB0byBzdGFydCB0aGUgbm9kZSB3YWxrIG9uIHRvIGZpbmQgc2libGluZyBub2RlXG4gICAgICogQHBhcm0ge3N0cmluZ30gcm9sZSAtIFRoZSByb2xlIHRvIHNlYXJjaCBmb3Igb24gYW4gZWxlbWVudCB1bmRlciB0aGUgcHJvdmlkZWQgZWxlbWVudFxuICAgICAqIEBwYXJtIHtib29sfSBjb25zaWRlckhpZGRlblNldHRpbmcgLSB0cnVlIG9yIGZhbHNlIGJhc2VkIG9uIGlmIGhpZGRlbiBzZXR0aW5nIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAqIEBwYXJtIHtib29sfSBjb25zaWRlckltcGxpY2l0IC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBJbXBsaWNpdCByb2xlcyBzaG91bGQgYmUgY29uc2lkZXJlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge25vZGV9IHdhbGtOb2RlIC0gQSBzaWJsaW5nIG5vZGUgb2YgdGhlIGVsZW1lbnQgcGFzc2VkIGluLCB3aGljaCBoYXMgdGhlIHByb3ZpZGVkIHJvbGVcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0U2libGluZ1dpdGhSb2xlSGlkZGVuKGVsZW1lbnQsIHJvbGUsIGNvbnNpZGVySGlkZGVuU2V0dGluZywgY29uc2lkZXJJbXBsaWNpdFJvbGU/KSB7XG5cbiAgICAgICAgLy8gVmFyaWFibGUgRGVjbGFyYXRpb25cbiAgICAgICAgbGV0IHdhbGtOb2RlID0gbnVsbDtcbiAgICAgICAgbGV0IGhhc1JvbGUgPSBmYWxzZTtcblxuICAgICAgICAvLyBPbmx5IHBlcmZvcm0gdGhlIGNoZWNrIGlmIGVsZW1lbnQgYW5kIHJvbGUgYXJlIGJvdGggcHJvdmlkZWRcbiAgICAgICAgaWYgKGVsZW1lbnQgJiYgcm9sZSkge1xuICAgICAgICAgICAgLy8gRmV0Y2ggdGhlIG5leHQgc2libGluZyBlbGVtZW50XG4gICAgICAgICAgICB3YWxrTm9kZSA9IGVsZW1lbnQubmV4dFNpYmxpbmc7XG5cbiAgICAgICAgICAgIC8vIEtlZXAgbG9vcGluZyBvdmVyIHRoZSBuZXh0IHNpYmxpbmdzIHRvIGZpbmQgZWxlbWVudCB3aGljaCBtYXRjaGVzXG4gICAgICAgICAgICAvLyB0aGUgcHJvdmlkZWQgcm9sZS5cbiAgICAgICAgICAgIHdoaWxlICh3YWxrTm9kZSAhPT0gbnVsbCAmJiAhaGFzUm9sZSkge1xuXG4gICAgICAgICAgICAgICAgLy8gRm9sbG93aW5nIGFyZSB0aGUgc3RlcHMgdGhhdCBhcmUgZXhlY3V0ZWQgYXQgdGhpcyBzdGFnZSB0byBkZXRlcm1pbmUgaWYgdGhlIG5vZGUgc2hvdWxkIGJlIGNsYXNzaWZpZWQgYXMgaGlkZGVuXG4gICAgICAgICAgICAgICAgLy8gb3Igbm90LlxuICAgICAgICAgICAgICAgIC8vICAxLiBJZiBjb25zaWRlckhpZGRlblNldHRpbmcgb3B0aW9uIGlzIHNldCB0byB0cnVlIHRoZW4gd2UgcGVyZm9ybSB0aGUgY2hlY2sgdG8gY29uc2lkZXIgdGhlXG4gICAgICAgICAgICAgICAgLy8gICAgIENoZWNrIEhpZGRlbiBDb250ZW50IHRoYXQgaXMgcHJvdmlkZWQuXG4gICAgICAgICAgICAgICAgLy8gIDIuIE9ubHkgcnVuIGlzTm9kZVZpc2libGUgY2hlY2sgaWYgaGlkZGVuIGNvbnRlbnQgc2hvdWxkIE5PVCBiZSBjaGVja2VkLiBJbiB0aGUgY2FzZSB0aGF0IGhpZGRlbiBjb250ZW50IGlzIHRvLFxuICAgICAgICAgICAgICAgIC8vICAgICBiZSBzY2FubmVkIHRoZW4gd2UgY2FuIGp1c3Qgc2NhbiBldmVyeXRoaW5nIGFzIG5vcm1hbC4gSW4gdGhlIGNhc2UgdGhhdCB0aGUgY3VycmVudCBub2RlIGlzIGhpZGRlbiB3ZSBkbyBub3RcbiAgICAgICAgICAgICAgICAvLyAgICAgYWRkIGl0IHRvIHRoZSByb2xlVG9FbGVtcyBoYXNoIGF0IGFsbCBvciBldmVuIGRvIGFueSBjaGVja2luZyBmb3IgaXQgYXQgYWxsLlxuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgLy8gTm90ZTogVGhlIGlmIGNvbmRpdGlvbnMgdXNlcyBzaG9ydC1jaXJjdWl0aW5nIHNvIGlmIHRoZSBmaXJzdCBjb25kaXRpb24gaXMgbm90IHRydWUgaXQgd2lsbCBub3QgY2hlY2sgdGhlIG5leHQgb25lLFxuICAgICAgICAgICAgICAgIC8vICAgICAgIHNvIG9uIGFuZCBzbyBmb3J0aC5cbiAgICAgICAgICAgICAgICBpZiAoY29uc2lkZXJIaWRkZW5TZXR0aW5nICYmIENvbW1vblV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbih3YWxrTm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTW92ZSBvbiB0byB0aGUgbmV4dCBub2RlXG4gICAgICAgICAgICAgICAgICAgIHdhbGtOb2RlID0gd2Fsa05vZGUubmV4dFNpYmxpbmc7XG5cbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBub2RlIGhhcyB0aGUgcm9sZSB0aGF0IHdlIG5lZWQgdG8gY2hlY2sgZXhpc3RzXG4gICAgICAgICAgICAgICAgaWYgKGNvbnNpZGVySW1wbGljaXRSb2xlKSB7XG4gICAgICAgICAgICAgICAgICAgIGhhc1JvbGUgPSBBcmlhVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3Mod2Fsa05vZGUsIHJvbGUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGhhc1JvbGUgPSBBcmlhVXRpbC5oYXNSb2xlKHdhbGtOb2RlLCByb2xlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gTW92ZSBvbiB0byB0aGUgbmV4dCBub2RlXG4gICAgICAgICAgICAgICAgd2Fsa05vZGUgPSB3YWxrTm9kZS5uZXh0U2libGluZztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSWYgd2Ugc3RpbGwgaGF2ZSBub3QgZm91bmQgYSBub2RlIHRoYXQgbWF0Y2hlcyB0aGUgcm9sZSwgc3RhcnQgYSByZXZlcnNlIGxvb2sgdXBcbiAgICAgICAgICAgIGlmICghd2Fsa05vZGUpIHtcbiAgICAgICAgICAgICAgICAvLyBGZXRjaCB0aGUgcHJldmlvdXMgU2libGluZyBvZiB0aGlzIGVsZW1lbnRcbiAgICAgICAgICAgICAgICB3YWxrTm9kZSA9IGVsZW1lbnQucHJldmlvdXNTaWJsaW5nO1xuXG4gICAgICAgICAgICAgICAgLy8gS2VlcCBsb29waW5nIG92ZXIgYWxsIHRoZSBwcmV2aW91cyBzaWJsaW5ncyB0byBzZWFyY2ggZm9yIGFuIGVsZW1lbnQgd2hpY2hcbiAgICAgICAgICAgICAgICAvLyBtYXRjaGVzIHRoZSBwcm92aWRlZCByb2xlLlxuICAgICAgICAgICAgICAgIHdoaWxlICh3YWxrTm9kZSAhPT0gbnVsbCAmJiAhaGFzUm9sZSkge1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIEZvbGxvd2luZyBhcmUgdGhlIHN0ZXBzIHRoYXQgYXJlIGV4ZWN1dGVkIGF0IHRoaXMgc3RhZ2UgdG8gZGV0ZXJtaW5lIGlmIHRoZSBub2RlIHNob3VsZCBiZSBjbGFzc2lmaWVkIGFzIGhpZGRlblxuICAgICAgICAgICAgICAgICAgICAvLyBvciBub3QuXG4gICAgICAgICAgICAgICAgICAgIC8vICAxLiBJZiBjb25zaWRlckhpZGRlblNldHRpbmcgb3B0aW9uIGlzIHNldCB0byB0cnVlIHRoZW4gd2UgcGVyZm9ybSB0aGUgY2hlY2sgdG8gY29uc2lkZXIgdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBDaGVjayBIaWRkZW4gQ29udGVudCB0aGF0IGlzIHByb3ZpZGVkLlxuICAgICAgICAgICAgICAgICAgICAvLyAgMi4gT25seSBydW4gaXNOb2RlVmlzaWJsZSBjaGVjayBpZiBoaWRkZW4gY29udGVudCBzaG91bGQgTk9UIGJlIGNoZWNrZWQuIEluIHRoZSBjYXNlIHRoYXQgaGlkZGVuIGNvbnRlbnQgaXMgdG8sXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBiZSBzY2FubmVkIHRoZW4gd2UgY2FuIGp1c3Qgc2NhbiBldmVyeXRoaW5nIGFzIG5vcm1hbC4gSW4gdGhlIGNhc2UgdGhhdCB0aGUgY3VycmVudCBub2RlIGlzIGhpZGRlbiB3ZSBkbyBub3RcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIGFkZCBpdCB0byB0aGUgcm9sZVRvRWxlbXMgaGFzaCBhdCBhbGwgb3IgZXZlbiBkbyBhbnkgY2hlY2tpbmcgZm9yIGl0IGF0IGFsbC5cbiAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgLy8gTm90ZTogVGhlIGlmIGNvbmRpdGlvbnMgdXNlcyBzaG9ydC1jaXJjdWl0aW5nIHNvIGlmIHRoZSBmaXJzdCBjb25kaXRpb24gaXMgbm90IHRydWUgaXQgd2lsbCBub3QgY2hlY2sgdGhlIG5leHQgb25lLFxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgICBzbyBvbiBhbmQgc28gZm9ydGguXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb25zaWRlckhpZGRlblNldHRpbmcgJiYgQ29tbW9uVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKHdhbGtOb2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTW92ZSBvbiB0byB0aGUgbmV4dCBub2RlXG4gICAgICAgICAgICAgICAgICAgICAgICB3YWxrTm9kZSA9IHdhbGtOb2RlLnByZXZpb3VzU2libGluZztcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGlzIG5vZGUgaGFzIHRoZSByb2xlIHRoYXQgd2UgbmVlZCB0byBjaGVjayBleGlzdHNcbiAgICAgICAgICAgICAgICAgICAgaGFzUm9sZSA9IEFyaWFVdGlsLmhhc1JvbGUod2Fsa05vZGUsIHJvbGUsIGNvbnNpZGVySW1wbGljaXRSb2xlKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBNb3ZlIG9uIHRvIHRoZSBuZXh0IG5vZGVcbiAgICAgICAgICAgICAgICAgICAgd2Fsa05vZGUgPSB3YWxrTm9kZS5wcmV2aW91c1NpYmxpbmc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHdhbGtOb2RlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGdldHRpbmcgYSBkZXNjZW5kYW50IGVsZW1lbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHJvbGUsIHVuZGVyXG4gICAgICogdGhlIGVsZW1lbnQgdGhhdCB3YXMgcHJvdmlkZWQuXG4gICAgICpcbiAgICAgKiBOb3RlIGJ5IGRlZmF1bHQgdGhpcyBmdW5jdGlvbiB3aWxsIG5vdCBjb25zaWRlciB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgU2V0dGluZy5cbiAgICAgKlxuICAgICAqIE5vdGU6IFRoaXMgaXMgYSB3cmFwcGVyIGZ1bmN0aW9uIHRvOiBBcmlhVXRpbC5nZXREZXNjZW5kYW50V2l0aFJvbGVIaWRkZW5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBlbGVtZW50IC0gcGFyZW50IGVsZW1lbnQgZm9yIHdoaWNoIHdlIHdpbGwgYmUgY2hlY2tpbmcgZGVzY2VuZGFudHMgZm9yXG4gICAgICogQHBhcm0ge3N0cmluZ30gcm9sZU5hbWUgLSBUaGUgcm9sZSB0byBsb29rIGZvciBvbiB0aGUgZGVzY2VuZGFudCdzIGVsZW1lbnRzXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtub2RlfSAtIFRoZSBkZXNjZW5kYW50IGVsZW1lbnQgdGhhdCBtYXRjaGVzIHRoZSByb2xlIHNwZWNpZmllZCAob25seSBvbmUpXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldERlc2NlbmRhbnRXaXRoUm9sZShlbGVtZW50LCByb2xlTmFtZSkge1xuICAgICAgICByZXR1cm4gQXJpYVV0aWwuZ2V0RGVzY2VuZGFudFdpdGhSb2xlSGlkZGVuKGVsZW1lbnQsIHJvbGVOYW1lLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZ2V0dGluZyBhIGRlc2NlbmRhbnQgZWxlbWVudCB3aXRoIHRoZSBzcGVjaWZpZWQgcm9sZSwgdW5kZXJcbiAgICAgKiB0aGUgZWxlbWVudCB0aGF0IHdhcyBwcm92aWRlZC4gVGhpcyBmdW5jdGlvbiBhc2xvIGZpbmRzIGVsZW1lbnRzIHdpdGggaW1wbGljaXQgcm9sZXMuXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gZWxlbWVudCAtIHBhcmVudCBlbGVtZW50IGZvciB3aGljaCB3ZSB3aWxsIGJlIGNoZWNraW5nIGRlc2NlbmRhbnRzIGZvclxuICAgICAqIEBwYXJtIHtzdHJpbmd9IHJvbGVOYW1lIC0gVGhlIHJvbGUgdG8gbG9vayBmb3Igb24gdGhlIGRlc2NlbmRhbnQncyBlbGVtZW50c1xuICAgICAqIEBwYXJtIHtib29sfSBjb25zaWRlckhpZGRlblNldHRpbmcgLSB0cnVlIG9yIGZhbHNlIGJhc2VkIG9uIGlmIGhpZGRlbiBzZXR0aW5nIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAqIEBwYXJtIHtib29sfSBjb25zaWRlckltcGxpY2l0Um9sZXMgLSB0cnVlIG9yIGZhbHNlIGJhc2VkIG9uIGlmIGltcGxpY2l0IHJvbGVzIHNldHRpbmcgc2hvdWxkIGJlIGNvbnNpZGVyZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtub2RlfSAtIFRoZSBkZXNjZW5kYW50IGVsZW1lbnQgdGhhdCBtYXRjaGVzIHRoZSByb2xlIHNwZWNpZmllZCAob25seSBvbmUpXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldERlc2NlbmRhbnRXaXRoUm9sZUhpZGRlbihlbGVtZW50LCByb2xlTmFtZSwgY29uc2lkZXJIaWRkZW5TZXR0aW5nLCBjb25zaWRlckltcGxpY2l0Um9sZXM/KSB7XG4gICAgICAgIC8vIFZhcmlhYmxlIERlY2xlcmF0aW9uXG4gICAgICAgIGxldCBkZXNjZW5kYW50ID0gbnVsbDtcbiAgICAgICAgbGV0IG53ID0gbmV3IERPTVdhbGtlcihlbGVtZW50KTtcbiAgICAgICAgLy8gTG9vcCBvdmVyIGFsbCB0aGUgY2hpbGRyZW5zIG9mIHRoZSBlbGVtZW50IHByb3ZpZGVkIGFuZCBjaGVjayBpZiB0aGUgcm9sZW5hbWUgcHJvdmlkZWQgZXhpc3RzXG4gICAgICAgIHdoaWxlIChudy5uZXh0Tm9kZSgpICYmIG53Lm5vZGUgIT0gZWxlbWVudCAmJiBudy5ub2RlICE9IGVsZW1lbnQubmV4dFNpYmxpbmcpIHtcblxuICAgICAgICAgICAgLy8gRm9sbG93aW5nIGFyZSB0aGUgc3RlcHMgdGhhdCBhcmUgZXhlY3V0ZWQgYXQgdGhpcyBzdGFnZSB0byBkZXRlcm1pbmUgaWYgdGhlIG5vZGUgc2hvdWxkIGJlIGNsYXNzaWZpZWQgYXMgaGlkZGVuXG4gICAgICAgICAgICAvLyBvciBub3QuXG4gICAgICAgICAgICAvLyAgMS4gSWYgY29uc2lkZXJIaWRkZW5TZXR0aW5nIG9wdGlvbiBpcyBzZXQgdG8gdHJ1ZSB0aGVuIHdlIHBlcmZvcm0gdGhlIGNoZWNrIHRvIGNvbnNpZGVyIHRoZVxuICAgICAgICAgICAgLy8gICAgIENoZWNrIEhpZGRlbiBDb250ZW50IHRoYXQgaXMgcHJvdmlkZWQuXG4gICAgICAgICAgICAvLyAgMi4gT25seSBydW4gaXNOb2RlVmlzaWJsZSBjaGVjayBpZiBoaWRkZW4gY29udGVudCBzaG91bGQgTk9UIGJlIGNoZWNrZWQuIEluIHRoZSBjYXNlIHRoYXQgaGlkZGVuIGNvbnRlbnQgaXMgdG8sXG4gICAgICAgICAgICAvLyAgICAgYmUgc2Nhbm5lZCB0aGVuIHdlIGNhbiBqdXN0IHNjYW4gZXZlcnl0aGluZyBhcyBub3JtYWwuIEluIHRoZSBjYXNlIHRoYXQgdGhlIGN1cnJlbnQgbm9kZSBpcyBoaWRkZW4gd2UgZG8gbm90XG4gICAgICAgICAgICAvLyAgICAgYWRkIGl0IHRvIHRoZSByb2xlVG9FbGVtcyBoYXNoIGF0IGFsbCBvciBldmVuIGRvIGFueSBjaGVja2luZyBmb3IgaXQgYXQgYWxsLlxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIE5vdGU6IFRoZSBpZiBjb25kaXRpb25zIHVzZXMgc2hvcnQtY2lyY3VpdGluZyBzbyBpZiB0aGUgZmlyc3QgY29uZGl0aW9uIGlzIG5vdCB0cnVlIGl0IHdpbGwgbm90IGNoZWNrIHRoZSBuZXh0IG9uZSxcbiAgICAgICAgICAgIC8vICAgICAgIHNvIG9uIGFuZCBzbyBmb3J0aC5cbiAgICAgICAgICAgIGlmIChjb25zaWRlckhpZGRlblNldHRpbmcgJiYgQ29tbW9uVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKG53Lm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgbm9kZSBoYXMgdGhlIHJvbGUgc3BlY2lmaWVkLCBpZiBpdCBkb2VzIHRoZW4gc2V0IHRoaXMgYXMgdGhlIGRlc2NlbmRhbnQgYW5kIHN0b3AgY2hlY2tpbmcgdGhlIHJlc3Qgb2YgdGhlXG4gICAgICAgICAgICAvLyBub2Rlcy5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgbm9kZSBoYXMgdGhlIGltcGxpY2l0IHJvbGVzLCBpZiBpdCBkb2VzIHRoZW4gc2V0IHRoaXMgYXMgdGhlIGRlc2NlbmRhbnQgYW5kIHN0b3AgY2hlY2tpbmcgdGhlIHJlc3Qgb2YgdGhlXG4gICAgICAgICAgICAvLyBub2Rlcy5cbiAgICAgICAgICAgIGlmIChjb25zaWRlckltcGxpY2l0Um9sZXMgPyBBcmlhVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3Mobncubm9kZSwgcm9sZU5hbWUpIDogQXJpYVV0aWwuaGFzUm9sZShudy5ub2RlLCByb2xlTmFtZSwgZmFsc2UpKSB7XG4gICAgICAgICAgICAgICAgZGVzY2VuZGFudCA9IG53Lm5vZGU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGVzY2VuZGFudDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBnZXR0aW5nIEFsbCBkZXNjZW5kYW50IGVsZW1lbnRzIHdpdGggdGhlIHNwZWNpZmllZCByb2xlcywgdW5kZXJcbiAgICAgKiB0aGUgZWxlbWVudCB0aGF0IHdhcyBwcm92aWRlZC4gVGhpcyBmdW5jdGlvbiBhc2xvIGZpbmRzIGVsZW1lbnRzIHdpdGggaW1wbGljaXQgcm9sZXMuXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gZWxlbWVudCAtIHBhcmVudCBlbGVtZW50IGZvciB3aGljaCB3ZSB3aWxsIGJlIGNoZWNraW5nIGRlc2NlbmRhbnRzIGZvclxuICAgICAqIEBwYXJtIHtzdHJpbmdbXX0gcm9sZU5hbWVzIC0gVGhlIHJvbGVzIHRvIGxvb2sgZm9yIG9uIHRoZSBkZXNjZW5kYW50J3MgZWxlbWVudHNcbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJIaWRkZW5TZXR0aW5nIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBoaWRkZW4gc2V0dGluZyBzaG91bGQgYmUgY29uc2lkZXJlZC5cbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJJbXBsaWNpdFJvbGVzIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBpbXBsaWNpdCByb2xlcyBzZXR0aW5nIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAqXG4gICAgICogQHJldHVybiB7bm9kZVtdfSAtIGFsbCBkZXNjZW5kYW50IGVsZW1lbnRzIHRoYXQgbWF0Y2ggdGhlIHJvbGVzIHNwZWNpZmllZFxuICAgICAqXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRBbGxEZXNjZW5kYW50c1dpdGhSb2xlcyhlbGVtZW50LCByb2xlTmFtZXM6IHN0cmluZ1tdLCBjb25zaWRlckhpZGRlblNldHRpbmcsIGNvbnNpZGVySW1wbGljaXRSb2xlcykge1xuICAgICAgICBpZiAoIXJvbGVOYW1lcyB8fCByb2xlTmFtZXMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgICAgIC8vIFZhcmlhYmxlIERlY2xlcmF0aW9uXG4gICAgICAgIGxldCBkZXNjZW5kYW50cyA9IFtdO1xuXG4gICAgICAgIHJvbGVOYW1lcy5mb3JFYWNoKHJvbGVOYW1lID0+IHtcbiAgICAgICAgICAgIGxldCBraWRzID0gQXJpYVV0aWwuZ2V0QWxsRGVzY2VuZGFudHNXaXRoUm9sZUhpZGRlbihlbGVtZW50LCByb2xlTmFtZSwgY29uc2lkZXJIaWRkZW5TZXR0aW5nLCBjb25zaWRlckltcGxpY2l0Um9sZXMpO1xuICAgICAgICAgICAgaWYgKGtpZHMgJiYga2lkcy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgIGRlc2NlbmRhbnRzID0gZGVzY2VuZGFudHMuY29uY2F0KGtpZHMpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGRlc2NlbmRhbnRzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGdldHRpbmcgQWxsIGRlc2NlbmRhbnQgZWxlbWVudHMgd2l0aCB0aGUgc3BlY2lmaWVkIHJvbGUsIHVuZGVyXG4gICAgICogdGhlIGVsZW1lbnQgdGhhdCB3YXMgcHJvdmlkZWQuIFRoaXMgZnVuY3Rpb24gYXNsbyBmaW5kcyBlbGVtZW50cyB3aXRoIGltcGxpY2l0IHJvbGVzLlxuICAgICAqXG4gICAgICogQHBhcm0ge2VsZW1lbnR9IGVsZW1lbnQgLSBwYXJlbnQgZWxlbWVudCBmb3Igd2hpY2ggd2Ugd2lsbCBiZSBjaGVja2luZyBkZXNjZW5kYW50cyBmb3JcbiAgICAgKiBAcGFybSB7c3RyaW5nfSByb2xlTmFtZSAtIFRoZSByb2xlIHRvIGxvb2sgZm9yIG9uIHRoZSBkZXNjZW5kYW50J3MgZWxlbWVudHNcbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJIaWRkZW5TZXR0aW5nIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBoaWRkZW4gc2V0dGluZyBzaG91bGQgYmUgY29uc2lkZXJlZC5cbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJJbXBsaWNpdFJvbGVzIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBpbXBsaWNpdCByb2xlcyBzZXR0aW5nIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAqXG4gICAgICogQHJldHVybiB7bm9kZVtdfSAtIFRoZSBkZXNjZW5kYW50IGVsZW1lbnRzIHRoYXQgbWF0Y2ggdGhlIHJvbGUgc3BlY2lmaWVkXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEFsbERlc2NlbmRhbnRzV2l0aFJvbGVIaWRkZW4oZWxlbWVudCwgcm9sZU5hbWU6IHN0cmluZywgY29uc2lkZXJIaWRkZW5TZXR0aW5nLCBjb25zaWRlckltcGxpY2l0Um9sZXMpIHtcbiAgICAgICAgLy8gVmFyaWFibGUgRGVjbGVyYXRpb25cbiAgICAgICAgbGV0IGRlc2NlbmRhbnRzID0gW107XG4gICAgICAgIGxldCBudyA9IG5ldyBET01XYWxrZXIoZWxlbWVudCk7XG4gICAgICAgIC8vIExvb3Agb3ZlciBhbGwgdGhlIGNoaWxkcmVucyBvZiB0aGUgZWxlbWVudCBwcm92aWRlZCBhbmQgY2hlY2sgaWYgdGhlIHJvbGVuYW1lIHByb3ZpZGVkIGV4aXN0c1xuICAgICAgICB3aGlsZSAobncubmV4dE5vZGUoKSAmJiBudy5ub2RlICE9IGVsZW1lbnQgJiYgbncubm9kZSAhPSBlbGVtZW50Lm5leHRTaWJsaW5nKSB7XG4gICAgICAgICAgICBpZiAobncuYkVuZFRhZykge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gRm9sbG93aW5nIGFyZSB0aGUgc3RlcHMgdGhhdCBhcmUgZXhlY3V0ZWQgYXQgdGhpcyBzdGFnZSB0byBkZXRlcm1pbmUgaWYgdGhlIG5vZGUgc2hvdWxkIGJlIGNsYXNzaWZpZWQgYXMgaGlkZGVuXG4gICAgICAgICAgICAvLyBvciBub3QuXG4gICAgICAgICAgICAvLyAgMS4gSWYgY29uc2lkZXJIaWRkZW5TZXR0aW5nIG9wdGlvbiBpcyBzZXQgdG8gdHJ1ZSB0aGVuIHdlIHBlcmZvcm0gdGhlIGNoZWNrIHRvIGNvbnNpZGVyIHRoZVxuICAgICAgICAgICAgLy8gICAgIENoZWNrIEhpZGRlbiBDb250ZW50IHRoYXQgaXMgcHJvdmlkZWQuXG4gICAgICAgICAgICAvLyAgMi4gT25seSBydW4gaXNOb2RlVmlzaWJsZSBjaGVjayBpZiBoaWRkZW4gY29udGVudCBzaG91bGQgTk9UIGJlIGNoZWNrZWQuIEluIHRoZSBjYXNlIHRoYXQgaGlkZGVuIGNvbnRlbnQgaXMgdG8sXG4gICAgICAgICAgICAvLyAgICAgYmUgc2Nhbm5lZCB0aGVuIHdlIGNhbiBqdXN0IHNjYW4gZXZlcnl0aGluZyBhcyBub3JtYWwuIEluIHRoZSBjYXNlIHRoYXQgdGhlIGN1cnJlbnQgbm9kZSBpcyBoaWRkZW4gd2UgZG8gbm90XG4gICAgICAgICAgICAvLyAgICAgYWRkIGl0IHRvIHRoZSByb2xlVG9FbGVtcyBoYXNoIGF0IGFsbCBvciBldmVuIGRvIGFueSBjaGVja2luZyBmb3IgaXQgYXQgYWxsLlxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIE5vdGU6IFRoZSBpZiBjb25kaXRpb25zIHVzZXMgc2hvcnQtY2lyY3VpdGluZyBzbyBpZiB0aGUgZmlyc3QgY29uZGl0aW9uIGlzIG5vdCB0cnVlIGl0IHdpbGwgbm90IGNoZWNrIHRoZSBuZXh0IG9uZSxcbiAgICAgICAgICAgIC8vICAgICAgIHNvIG9uIGFuZCBzbyBmb3J0aC5cbiAgICAgICAgICAgIGlmIChjb25zaWRlckhpZGRlblNldHRpbmcgJiYgQ29tbW9uVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKG53Lm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgbm9kZSBoYXMgdGhlIHJvbGUgc3BlY2lmaWVkLCBpZiBpdCBkb2VzIHRoZW4gc2V0IHRoaXMgYXMgdGhlIGRlc2NlbmRhbnQgYW5kIHN0b3AgY2hlY2tpbmcgdGhlIHJlc3Qgb2YgdGhlXG4gICAgICAgICAgICAvLyBub2Rlcy5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgbm9kZSBoYXMgdGhlIGltcGxpY2l0IHJvbGVzLCBpZiBpdCBkb2VzIHRoZW4gc2V0IHRoaXMgYXMgdGhlIGRlc2NlbmRhbnQgYW5kIHN0b3AgY2hlY2tpbmcgdGhlIHJlc3Qgb2YgdGhlXG4gICAgICAgICAgICAvLyBub2Rlcy5cbiAgICAgICAgICAgIGlmIChBcmlhVXRpbC5oYXNSb2xlKG53Lm5vZGUsIHJvbGVOYW1lLCBjb25zaWRlckltcGxpY2l0Um9sZXMpKSB7XG4gICAgICAgICAgICAgICAgZGVzY2VuZGFudHMucHVzaChudy5ub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkZXNjZW5kYW50cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBnZXR0aW5nIEFsbCBkaXJlY3QgY2hpbGRyZW4gaW4gQVQgdHJlZSB3aXRoIGEgcm9sZSAoZXhjbHVkZSBub25lIGFuZCBwcmVzZW50YXRpb24pXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gZWxlbWVudCAtIHBhcmVudCBlbGVtZW50IGZvciB3aGljaCB3ZSB3aWxsIGJlIGNoZWNraW5nIGNoaWxkcmVuIGZvclxuICAgICAqIEByZXR1cm4ge25vZGV9IC0gVGhlIGRpcmVjdCBjaGlsZCBlbGVtZW50cyBpbiBBVCB0cmVlIHRoYXQgaGFzIGEgcm9sZVxuICAgICAqXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXREaXJlY3RBVENoaWxkcmVuKGVsZW1lbnQpIHtcbiAgICAgICAgbGV0IHJlcXVpcmVkQ2hpbGRSb2xlcyA9IEFyaWFVdGlsLmdldFJlcXVpcmVkQ2hpbGRSb2xlcyhlbGVtZW50LCB0cnVlKTtcbiAgICAgICAgbGV0IGRpcmVjdDogQXJyYXk8SFRNTEVsZW1lbnQ+ID0gW107XG4gICAgICAgIEFyaWFVdGlsLnJldHJpZXZlRGlyZWN0QVRDaGlsZHJlbihlbGVtZW50LCByZXF1aXJlZENoaWxkUm9sZXMsIGRpcmVjdCk7XG4gICAgICAgIHJldHVybiBkaXJlY3Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgcmVjdXJzaXZlbHkgYW55IGNoaWxkIHBhdGggdGlsbCBlaXRoZXIgbm8gY2hpbGQgb3IgYSBjaGlsZCB3aXRoIGEgcm9sZSBpcyBmb3VuZCAoZXhjbHVkZSBub25lIGFuZCBwcmVzZW50YXRpb24pXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gZWxlbWVudCAtIHBhcmVudCBlbGVtZW50IGZvciB3aGljaCB3ZSB3aWxsIGJlIGNoZWNraW5nIGNoaWxkcmVuIGZvclxuICAgICAqIEByZXR1cm4ge25vZGV9IC0gVGhlIGRpcmVjdCBjaGlsZCBlbGVtZW50cyBpbiBBVCB0cmVlXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIHJldHJpZXZlRGlyZWN0QVRDaGlsZHJlbihlbGVtZW50LCByZXF1aXJlZENoaWxkUm9sZXMsIGRpcmVjdDogQXJyYXk8SFRNTEVsZW1lbnQ+KSB7XG4gICAgICAgIGxldCBjaGlsZHJlbjogSFRNTEVsZW1lbnRbXSA9IFtdO1xuICAgICAgICBpZiAoZWxlbWVudC5jaGlsZHJlbiAhPT0gbnVsbCAmJiBlbGVtZW50LmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWxlbWVudC5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goZWxlbWVudC5jaGlsZHJlbltpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgdGhlIGVsZW1lbnQgY29udGFpbnMgXCJhcmlhLW93blwiIGF0dHJpYnV0ZSwgdGhlbiB0aGUgYXJpYS1vd25lZCBjaGlsZHJlbiBuZWVkIHRvIGJlIGluY2x1ZGVkIHRvb1xuICAgICAgICBsZXQgb3duZWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcImFyaWEtb3duc1wiKTtcbiAgICAgICAgaWYgKG93bmVkKSB7XG4gICAgICAgICAgICBsZXQgZG9jID0gZWxlbWVudC5vd25lckRvY3VtZW50O1xuICAgICAgICAgICAgaWYgKGRvYykge1xuICAgICAgICAgICAgICAgIGxldCBvd25lZElkcyA9IG93bmVkLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG93bmVkSWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBvd25lZEVsZW0gPSBkb2MuZ2V0RWxlbWVudEJ5SWQob3duZWRJZHNbaV0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAob3duZWRFbGVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbi5wdXNoKG93bmVkRWxlbSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAvL2lnbm9yZSBoaWRkZW4gYW5kIGludmlzaWJsZSBjaGlsZFxuICAgICAgICAgICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChjaGlsZHJlbltpXSkgfHwgIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShjaGlsZHJlbltpXSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGxldCByb2xlcyA9IEFyaWFVdGlsLmdldFJvbGVzKGNoaWxkcmVuW2ldLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgaWYgKHJvbGVzID09PSBudWxsIHx8IHJvbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByb2xlcyA9IEFyaWFVdGlsLmdldEltcGxpY2l0Um9sZShjaGlsZHJlbltpXSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHJvbGVzICYmIHJvbGVzICE9PSBudWxsICYmIHJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgLy9yZW1vdmUgJ25vbmUnIGFuZCAncHJlc2VudGF0aW9uJ1xuICAgICAgICAgICAgICAgICAgICByb2xlcyA9IHJvbGVzLmZpbHRlcihmdW5jdGlvbiAocm9sZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJvbGUgIT09IFwibm9uZVwiICYmIHJvbGUgIT09IFwicHJlc2VudGF0aW9uXCI7XG4gICAgICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICAgICAgLy8gYSAnZ3JvdXAnIHJvbGUgaXMgYWxsb3dlZCBidXQgbm90IHJlcXVpcmVkIGZvciBzb21lIGVsZW1lbnRzIHNvIHJlbW92ZSBpdCBpZiBleGlzdHNcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJvbGVzLmluY2x1ZGVzKFwiZ3JvdXBcIikgJiYgcmVxdWlyZWRDaGlsZFJvbGVzICYmIHJlcXVpcmVkQ2hpbGRSb2xlcy5pbmNsdWRlcygnZ3JvdXAnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcm9sZXMgPSByb2xlcy5maWx0ZXIoZnVuY3Rpb24gKHJvbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcm9sZSAhPT0gJ2dyb3VwJztcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJvbGVzICYmIHJvbGVzICE9PSBudWxsICYmIHJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZGlyZWN0LnB1c2goY2hpbGRyZW5baV0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHJlY3Vyc2l2ZSB1bnRpbCBnZXQgYSByZXR1cm4gdmFsdWUsIFxuICAgICAgICAgICAgICAgICAgICBBcmlhVXRpbC5yZXRyaWV2ZURpcmVjdEFUQ2hpbGRyZW4oY2hpbGRyZW5baV0sIHJlcXVpcmVkQ2hpbGRSb2xlcywgZGlyZWN0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgbnVsbCBvciByZXF1aXJlZCBjaGlsZCByb2xlcyBmb3IgYSBnaXZlbiBlbGVtZW50IHdpdGggb25lIG1vcmUgcm9sZXMsXG4gICAgICogcmV0dXJuIG51bGwgaWYgdGhlIHJvbGUgaXMgJ25vbmUnIG9yICdwcmVzZW50YXRpb24nXG4gICAgICogQHBhcmFtIGVsZW1lbnQgXG4gICAgICogQHBhcmFtIGluY2x1ZGVJbXBsaWNpdCBpbmNsdWRlIGltcGxpY2l0IHJvbGVzIGlmIG5vIHJvbGUgaXMgZXhwbGljaXRseSBwcm92aWRlZFxuICAgICAqIEByZXR1cm5zIFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0UmVxdWlyZWRDaGlsZFJvbGVzKGVsZW1lbnQsIGluY2x1ZGVJbXBsaWNpdDogYm9vbGVhbik6IHN0cmluZ1tdIHtcbiAgICAgICAgbGV0IHJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXMoZWxlbWVudCwgZmFsc2UpO1xuICAgICAgICAvLyBpZiBleHBsaWNpdCByb2xlIGRvZXNuJ3QgZXhpc3QsIGdldCB0aGUgaW1wbGljaXQgb25lXG4gICAgICAgIGlmICgoIXJvbGVzIHx8IHJvbGVzLmxlbmd0aCA9PT0gMCkgJiYgaW5jbHVkZUltcGxpY2l0KSB7XG4gICAgICAgICAgICByb2xlcyA9IEFyaWFVdGlsLmdldEltcGxpY2l0Um9sZShlbGVtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKiAgXG4gICAgICAgICAqIGlnbm9yZSBpZiB0aGUgZWxlbWVudCBkb2Vzbid0IGhhdmUgYW55IGV4cGxpY2l0IG9yIGltcGxpY2l0IHJvbGVcbiAgICAgICAgKi9cbiAgICAgICAgaWYgKCFyb2xlcyB8fCByb2xlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqICBcbiAgICAgICAgICogaWdub3JlIGlmIHRoZSBlbGVtZW50IGNvbnRhaW5zIG5vbmUgb3IgcHJlc2VudGF0aW9uIHJvbGVcbiAgICAgICAgKi9cbiAgICAgICAgbGV0IHByZXNlbnRhdGlvblJvbGVzID0gW1wibm9uZVwiLCBcInByZXNlbnRhdGlvblwiXTtcbiAgICAgICAgY29uc3QgZm91bmQgPSByb2xlcy5zb21lKHIgPT4gcHJlc2VudGF0aW9uUm9sZXMuaW5jbHVkZXMocikpO1xuICAgICAgICBpZiAoZm91bmQpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCBkZXNpZ25QYXR0ZXJucyA9IEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJucztcbiAgICAgICAgbGV0IHJlcXVpcmVkQ2hpbGRSb2xlczogc3RyaW5nW10gPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByb2xlcy5sZW5ndGg7ICsraikge1xuICAgICAgICAgICAgaWYgKGRlc2lnblBhdHRlcm5zW3JvbGVzW2pdXSAmJiBkZXNpZ25QYXR0ZXJuc1tyb2xlc1tqXV0ucmVxQ2hpbGRyZW4gIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXF1aXJlZENoaWxkUm9sZXMgPSBDb21tb25VdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QoZGVzaWduUGF0dGVybnNbcm9sZXNbal1dLnJlcUNoaWxkcmVuLCByZXF1aXJlZENoaWxkUm9sZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXF1aXJlZENoaWxkUm9sZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZ2V0dGluZyBhbiBlbGVtZW50IHJlZmVyZW5jZWQgYnkgYXJpYS1vd25zIGFuZCBoYXMgdGhlXG4gICAgICogcm9sZSB0aGF0IHdhcyBzcGVjaWZpZWQuXG4gICAgICpcbiAgICAgKiBOb3RlIGJ5IGRlZmF1bHQgdGhpcyBmdW5jdGlvbiB3aWxsIG5vdCBjb25zaWRlciB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgU2V0dGluZy5cbiAgICAgKlxuICAgICAqIE5vdGU6IFRoaXMgaXMgYSB3cmFwcGVyIGZ1bmN0aW9uIHRvOiBBcmlhVXRpbC5nZXRBcmlhT3duc1dpdGhSb2xlSGlkZGVuXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gY2hlY2sgZm9yIGFyaWEtb3duc1xuICAgICAqIEBwYXJtIHtzdHJpbmd9IHJvbGVOYW1lIC0gVGhlIHJvbGUgdG8gbG9vayBmb3Igb24gdGhlIGFyaWEtb3ducyBlbGVtZW50XG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtub2RlfSAtIFRoZSBlbGVtZW50IHRoYXQgaXMgcmVmZXJlbmNlZCBieSBhcmlhLW93bnMgYW5kIGhhcyByb2xlIHNwZWNpZmllZC5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0QXJpYU93bnNXaXRoUm9sZShlbGVtZW50LCByb2xlTmFtZSkge1xuICAgICAgICByZXR1cm4gQXJpYVV0aWwuZ2V0QXJpYU93bnNXaXRoUm9sZUhpZGRlbihlbGVtZW50LCByb2xlTmFtZSwgZmFsc2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGdldHRpbmcgYW4gZWxlbWVudCByZWZlcmVuY2VkIGJ5IGFyaWEtb3ducyBhbmQgaGFzIHRoZVxuICAgICAqIHJvbGUgdGhhdCB3YXMgc3BlY2lmaWVkLiBUaGlzIGZ1bmN0aW9uIGFzbG8gZmluZHMgZWxlbWVudHMgd2l0aCBpbXBsaWNpdCByb2xlcy5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBjaGVjayBmb3IgYXJpYS1vd25zXG4gICAgICogQHBhcm0ge3N0cmluZ30gcm9sZU5hbWUgLSBUaGUgcm9sZSB0byBsb29rIGZvciBvbiB0aGUgYXJpYS1vd25zIGVsZW1lbnRcbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJIaWRkZW5TZXR0aW5nIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBoaWRkZW4gc2V0dGluZyBzaG91bGQgYmUgY29uc2lkZXJlZC5cbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJJbXBsaWNpdFJvbGVzIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBpbXBsaWNpdCByb2xlcyBzZXR0aW5nIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAqXG4gICAgICogQHJldHVybiB7bm9kZX0gLSBUaGUgZWxlbWVudCB0aGF0IGlzIHJlZmVyZW5jZWQgYnkgYXJpYS1vd25zIGFuZCBoYXMgcm9sZSBzcGVjaWZpZWQuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEFyaWFPd25zV2l0aFJvbGVIaWRkZW4oZWxlbWVudCwgcm9sZU5hbWUsIGNvbnNpZGVySGlkZGVuU2V0dGluZywgY29uc2lkZXJJbXBsaWNpdFJvbGVzPykge1xuICAgICAgICAvLyBWYXJpYWJsZSBEZWNsZXJhdGlvblxuICAgICAgICBsZXQgcmVmZXJlbmNlZEVsZW1lbnQgPSBudWxsO1xuICAgICAgICBsZXQgcmVmZXJlbmNlZEVsZW1IYXNSb2xlID0gZmFsc2U7XG5cbiAgICAgICAgLy8gSW4gdGhlIGNhc2UgYXJpYS1vd25zIGlzIG5vdCBvbiB0aGUgZWxlbWVudCBqdXN0IGJyZWFrIG91dCBvZiB0aGlzIGZ1bmN0aW9uIHdpdGggbnVsbFxuICAgICAgICBpZiAoQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShlbGVtZW50LCBcImFyaWEtb3duc1wiKSkge1xuXG4gICAgICAgICAgICAvLyBHZXQgdGhlIHJlZmVyZW5jZSBJRFxuICAgICAgICAgICAgbGV0IHJlZmVyZW5jZUlEID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJhcmlhLW93bnNcIik7XG5cbiAgICAgICAgICAgIC8vIEdldCB0aGUgZWxlbWVudCBmb3IgdGhlIHJlZmVyZW5jZSBJRFxuICAgICAgICAgICAgcmVmZXJlbmNlZEVsZW1lbnQgPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChlbGVtZW50LCByZWZlcmVuY2VJRCk7XG4gICAgICAgICAgICAvL2lnbm9yZSBpZiB0aGUgYXJpYS1vd25zIHBvaW50IHRvIHRoZSBlbGVtZW50IGl0c2VsZlxuICAgICAgICAgICAgaWYgKERPTVV0aWwuc2FtZU5vZGUoZWxlbWVudCwgcmVmZXJlbmNlZEVsZW1lbnQpKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgICAgICAvLyBGb2xsb3dpbmcgYXJlIHRoZSBzdGVwcyB0aGF0IGFyZSBleGVjdXRlZCBhdCB0aGlzIHN0YWdlIHRvIGRldGVybWluZSBpZiB0aGUgbm9kZSBzaG91bGQgYmUgY2xhc3NpZmllZCBhcyBoaWRkZW5cbiAgICAgICAgICAgIC8vIG9yIG5vdC5cbiAgICAgICAgICAgIC8vICAxLiBJZiBjb25zaWRlckhpZGRlblNldHRpbmcgb3B0aW9uIGlzIHNldCB0byB0cnVlIHRoZW4gd2UgcGVyZm9ybSB0aGUgY2hlY2sgdG8gY29uc2lkZXIgdGhlXG4gICAgICAgICAgICAvLyAgICAgQ2hlY2sgSGlkZGVuIENvbnRlbnQgdGhhdCBpcyBwcm92aWRlZC5cbiAgICAgICAgICAgIC8vICAyLiBPbmx5IHJ1biBpc05vZGVWaXNpYmxlIGNoZWNrIGlmIGhpZGRlbiBjb250ZW50IHNob3VsZCBOT1QgYmUgY2hlY2tlZC4gSW4gdGhlIGNhc2UgdGhhdCBoaWRkZW4gY29udGVudCBpcyB0byxcbiAgICAgICAgICAgIC8vICAgICBiZSBzY2FubmVkIHRoZW4gd2UgY2FuIGp1c3Qgc2NhbiBldmVyeXRoaW5nIGFzIG5vcm1hbC4gSW4gdGhlIGNhc2UgdGhhdCB0aGUgY3VycmVudCBub2RlIGlzIGhpZGRlbiB3ZSBkbyBub3RcbiAgICAgICAgICAgIC8vICAgICBhZGQgaXQgdG8gdGhlIHJvbGVUb0VsZW1zIGhhc2ggYXQgYWxsIG9yIGV2ZW4gZG8gYW55IGNoZWNraW5nIGZvciBpdCBhdCBhbGwuXG4gICAgICAgICAgICBpZiAoY29uc2lkZXJIaWRkZW5TZXR0aW5nICYmIHJlZmVyZW5jZWRFbGVtZW50ICE9IG51bGwgJiYgQ29tbW9uVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKHJlZmVyZW5jZWRFbGVtZW50KSkge1xuICAgICAgICAgICAgICAgIHJlZmVyZW5jZWRFbGVtSGFzUm9sZSA9IG51bGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlZmVyZW5jZWRFbGVtSGFzUm9sZSA9IEFyaWFVdGlsLmhhc1JvbGUocmVmZXJlbmNlZEVsZW1lbnQsIHJvbGVOYW1lLCBjb25zaWRlckltcGxpY2l0Um9sZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZWZlcmVuY2VkRWxlbUhhc1JvbGUgPyByZWZlcmVuY2VkRWxlbWVudCA6IG51bGw7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHRydWUgaWYgdGhlIGVsZW1lbnQgaGFzIGFuIEFSSUEgbGFiZWxcbiAgICBwdWJsaWMgc3RhdGljIGhhc0FyaWFMYWJlbChlbGVtZW50KSB7XG5cbiAgICAgICAgLy8gUnB0X0FyaWFfVmFsaWRJZFJlZiBkZXRlcm1pbmVzIGlmIHRoZSBhcmlhLWxhYmVsbGVkYnkgaWQgcG9pbnRzIHRvIGEgdmFsaWQgZWxlbWVudFxuICAgICAgICByZXR1cm4gQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShlbGVtZW50LCBcImFyaWEtbGFiZWxcIikgfHwgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShlbGVtZW50LCBcImFyaWEtbGFiZWxsZWRieVwiKTtcbiAgICB9XG5cbiAgICAvLyBHaXZlbiBhbiBhcnJheSBvZiBlbGVtZW50cywgcmV0dXJuIHRydWUgaWYgdGhlIGVsZW1lbnRzIGhhdmUgdW5pcXVlIEFSSUEgbGFiZWxzXG4gICAgcHVibGljIHN0YXRpYyBoYXNVbmlxdWVBcmlhTGFiZWxzTG9jYWxseShlbGVtZW50cywgaXNHbG9iYWwpIHtcbiAgICAgICAgaWYgKGVsZW1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsZXQgZG9jID0gZWxlbWVudHNbMF0ub3duZXJEb2N1bWVudDtcbiAgICAgICAgbGV0IGhhc0R1cGxpY2F0ZUxhYmVscyA9IGZhbHNlO1xuICAgICAgICBsZXQgdW5pcXVlQXJpYUxhYmVscyA9IG51bGw7XG5cbiAgICAgICAgaWYgKGlzR2xvYmFsKSB7XG4gICAgICAgICAgICB1bmlxdWVBcmlhTGFiZWxzID0gQ2FjaGVVdGlsLmdldENhY2hlKGRvYywgXCJBcmlhVXRpbF9IQVNfVU5JUVVFX0FSSUFfTEFCRUxTXCIsIG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1bmlxdWVBcmlhTGFiZWxzID09PSBudWxsKSB7XG4gICAgICAgICAgICB1bmlxdWVBcmlhTGFiZWxzID0ge307XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgIWhhc0R1cGxpY2F0ZUxhYmVscyAmJiBpIDwgZWxlbWVudHMubGVuZ3RoOyArK2kpIHtcblxuICAgICAgICAgICAgaWYgKGVsZW1lbnRzW2ldLmhhc0F0dHJpYnV0ZSkge1xuXG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnRzW2ldLmhhc0F0dHJpYnV0ZShcImFyaWEtbGFiZWxcIikpIHtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgYXJpYUxhYmVsID0gQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKGVsZW1lbnRzW2ldLmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIikpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgIGhhc0R1cGxpY2F0ZUxhYmVscyA9IGFyaWFMYWJlbCBpbiB1bmlxdWVBcmlhTGFiZWxzO1xuICAgICAgICAgICAgICAgICAgICB1bmlxdWVBcmlhTGFiZWxzW2FyaWFMYWJlbF0gPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50c1tpXS5oYXNBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsbGVkYnlcIikpIHtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgbGFiZWxJRCA9IGVsZW1lbnRzW2ldLmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsTm9kZSA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKGVsZW1lbnRzW2ldLCBsYWJlbElEKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhYmVsTm9kZSAmJiAhRE9NVXRpbC5zYW1lTm9kZShsYWJlbE5vZGUsIGVsZW1lbnRzW2ldKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBBcmlhVXRpbC5nZXRUZXh0Q29udGVudEV4Y2x1ZGluZ1NjcmlwdHMobGFiZWxOb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZXQgbm9ybWFsaXplZExhYmVsID0gQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKGxhYmVsKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICBoYXNEdXBsaWNhdGVMYWJlbHMgPSBub3JtYWxpemVkTGFiZWwgaW4gdW5pcXVlQXJpYUxhYmVscztcbiAgICAgICAgICAgICAgICAgICAgdW5pcXVlQXJpYUxhYmVsc1tub3JtYWxpemVkTGFiZWxdID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEhhcyBubyBsYWJlbCBhdCBhbGxcbiAgICAgICAgICAgICAgICAgICAgaGFzRHVwbGljYXRlTGFiZWxzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzR2xvYmFsKSB7XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZG9jLCBcIkFyaWFVdGlsX0hBU19VTklRVUVfQVJJQV9MQUJFTFNcIiwgdW5pcXVlQXJpYUxhYmVscyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICFoYXNEdXBsaWNhdGVMYWJlbHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRleHQgY29udGVudCBmcm9tIGFuIGVsZW1lbnQsIGV4Y2x1ZGluZyBzY3JpcHQgYW5kIHN0eWxlIGVsZW1lbnRzXG4gICAgICogVGhpcyBpcyBhIHNpbXBsaWZpZWQgdmVyc2lvbiB0aGF0IGRvZXNuJ3QgZ28gdGhyb3VnaCBmdWxsIGFjY2Vzc2libGUgbmFtZSBjb21wdXRhdGlvblxuICAgICAqIHRvIGF2b2lkIGNpcmN1bGFyIGRlcGVuZGVuY2llcyB3aGVuIGNhbGxlZCBmcm9tIGdldEFyaWFMYWJlbFxuICAgICAqXG4gICAgICogTm90ZTogV2hlbiBhbiBlbGVtZW50IGlzIHJlZmVyZW5jZWQgYnkgYXJpYS1sYWJlbGxlZGJ5LCBpdHMgY29udGVudCBpcyBpbmNsdWRlZFxuICAgICAqIGV2ZW4gaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIChwZXIgQVJJQSBzcGVjKVxuICAgICAqL1xuICAgIHByaXZhdGUgc3RhdGljIGdldFRleHRDb250ZW50RXhjbHVkaW5nU2NyaXB0cyhlbGVtOiBFbGVtZW50KTogc3RyaW5nIHtcbiAgICAgICAgaWYgKCFlbGVtKSByZXR1cm4gXCJcIjtcbiAgICAgICAgXG4gICAgICAgIGxldCB0ZXh0ID0gXCJcIjtcbiAgICAgICAgbGV0IG53ID0gbmV3IERPTVdhbGtlcihlbGVtKTtcbiAgICAgICAgXG4gICAgICAgIHdoaWxlIChudy5uZXh0Tm9kZSgpICYmIG53Lm5vZGUgIT09IGVsZW0gJiYgbncubm9kZSAhPT0gZWxlbS5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICBpZiAobncuYkVuZFRhZykgY29udGludWU7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBudy5ub2RlO1xuICAgICAgICAgICAgY29uc3Qgbm9kZU5hbWUgPSBub2RlLm5vZGVOYW1lID8gbm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIDogXCJcIjtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gU2tpcCBzY3JpcHQgYW5kIHN0eWxlIGVsZW1lbnRzXG4gICAgICAgICAgICBpZiAobm9kZU5hbWUgPT09ICdzY3JpcHQnIHx8IG5vZGVOYW1lID09PSAnc3R5bGUnKSB7XG4gICAgICAgICAgICAgICAgbncuYkVuZFRhZyA9IHRydWU7IC8vIFNraXAgY2hpbGRyZW5cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDMpIHsgLy8gVGV4dCBub2RlXG4gICAgICAgICAgICAgICAgLy8gSW5jbHVkZSB0ZXh0IGV2ZW4gZnJvbSBoaWRkZW4gZWxlbWVudHMgd2hlbiByZWZlcmVuY2VkIGJ5IGFyaWEtbGFiZWxsZWRieVxuICAgICAgICAgICAgICAgIGlmIChub2RlLm5vZGVWYWx1ZSAmJiBub2RlLm5vZGVWYWx1ZS50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9IFwiIFwiICsgbm9kZS5ub2RlVmFsdWUudHJpbSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMSkgeyAvLyBFbGVtZW50IG5vZGVcbiAgICAgICAgICAgICAgICAvLyBIYW5kbGUgaW1hZ2VzIC0gZ2V0IGFsdCB0ZXh0XG4gICAgICAgICAgICAgICAgaWYgKG5vZGVOYW1lID09PSAnaW1nJyAmJiAobm9kZSBhcyBFbGVtZW50KS5oYXNBdHRyaWJ1dGUoJ2FsdCcpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRleHQgKz0gXCIgXCIgKyAobm9kZSBhcyBFbGVtZW50KS5nZXRBdHRyaWJ1dGUoJ2FsdCcpLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgbncuYkVuZFRhZyA9IHRydWU7IC8vIFNraXAgY2hpbGRyZW4gb2YgaW1nXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIEhhbmRsZSBpbnB1dCB3aXRoIHR5cGU9XCJpbWFnZVwiIC0gZ2V0IGFsdCB0ZXh0XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAobm9kZU5hbWUgPT09ICdpbnB1dCcgJiYgKG5vZGUgYXMgRWxlbWVudCkuZ2V0QXR0cmlidXRlKCd0eXBlJykgPT09ICdpbWFnZScgJiYgKG5vZGUgYXMgRWxlbWVudCkuaGFzQXR0cmlidXRlKCdhbHQnKSkge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9IFwiIFwiICsgKG5vZGUgYXMgRWxlbWVudCkuZ2V0QXR0cmlidXRlKCdhbHQnKS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgIG53LmJFbmRUYWcgPSB0cnVlOyAvLyBTa2lwIGNoaWxkcmVuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gdGV4dC50cmltKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRBcmlhTGFiZWwoZWxlKSB7XG4gICAgICAgIGlmIChlbGUuaGFzQXR0cmlidXRlKSB7XG4gICAgICAgICAgICBpZiAoZWxlLmhhc0F0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKSkge1xuICAgICAgICAgICAgICAgIGxldCBsYWJlbElEcyA9IGVsZS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsbGVkYnlcIikudHJpbSgpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgICAgICBsZXQgbm9ybWFsaXplZExhYmVsID0gXCJcIjtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMCwgbGVuZ3RoID0gbGFiZWxJRHMubGVuZ3RoOyBqIDwgbGVuZ3RoOyArK2opIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsSUQgPSBsYWJlbElEc1tqXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsTm9kZSA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKGVsZSwgbGFiZWxJRCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsYWJlbE5vZGUgJiYgIURPTVV0aWwuc2FtZU5vZGUobGFiZWxOb2RlLCBlbGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2Ugb3VyIGhlbHBlciB0byBnZXQgdGV4dCBjb250ZW50IHdpdGhvdXQgY2lyY3VsYXIgZGVwZW5kZW5jeVxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsID0gQXJpYVV0aWwuZ2V0VGV4dENvbnRlbnRFeGNsdWRpbmdTY3JpcHRzKGxhYmVsTm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkTGFiZWwgKz0gQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKGxhYmVsKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbm9ybWFsaXplZExhYmVsLnRyaW0oKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlLmhhc0F0dHJpYnV0ZShcImFyaWEtbGFiZWxcIikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKGVsZS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIpKS50cmltKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRBcmlhRGVzY3JpcHRpb24oZWxlKSB7XG4gICAgICAgIGlmICghZWxlKSByZXR1cm4gXCJcIjtcbiAgICAgICAgbGV0IG5vcm1hbGl6ZWRMYWJlbCA9IFwiXCI7XG4gICAgICAgIGxldCBkZXNjID0gZWxlLmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKTtcbiAgICAgICAgaWYgKGRlc2MgJiYgZGVzYy50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGV0IGxhYmVsSURzID0gZGVzYy50cmltKCkuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDAsIGxlbmd0aCA9IGxhYmVsSURzLmxlbmd0aDsgaiA8IGxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICAgICAgbGV0IGxhYmVsSUQgPSBsYWJlbElEc1tqXTtcbiAgICAgICAgICAgICAgICBsZXQgbGFiZWxOb2RlID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQoZWxlLCBsYWJlbElEKTtcbiAgICAgICAgICAgICAgICBpZiAobGFiZWxOb2RlICYmICFET01VdGlsLnNhbWVOb2RlKGxhYmVsTm9kZSwgZWxlKSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbGFiZWwgPSBBcmlhVXRpbC5nZXRUZXh0Q29udGVudEV4Y2x1ZGluZ1NjcmlwdHMobGFiZWxOb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhYmVsICYmIGxhYmVsLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZExhYmVsICs9IENvbW1vblV0aWwubm9ybWFsaXplU3BhY2luZyhsYWJlbCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobm9ybWFsaXplZExhYmVsLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgIHJldHVybiBub3JtYWxpemVkTGFiZWwudHJpbSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVzYyA9IGVsZS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWRlc2NyaXB0aW9uXCIpO1xuICAgICAgICBpZiAoZGVzYyAmJiBkZXNjLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgcmV0dXJuIGRlc2MudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZpbmRBcmlhTGFiZWxEdXBlcyhlbGVtZW50cykge1xuICAgICAgICBsZXQgZHVwZU1hcCA9IHt9XG4gICAgICAgIGVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKGVsZSkge1xuICAgICAgICAgICAgZHVwZU1hcFtBcmlhVXRpbC5nZXRBcmlhTGFiZWwoZWxlKV0gPSAoZHVwZU1hcFtBcmlhVXRpbC5nZXRBcmlhTGFiZWwoZWxlKV0gfHwgMCkgKyAxO1xuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gZHVwZU1hcDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiByZXR1cm4gYWNjZXNzaWJsZSBuYW1lcyBmb3IgYWxsIEFUIHZpc2libGUgbGFuZG1hcmsgZWxlbWVudHMgXG4gICAgICogQHBhcmFtIGRvYyBcbiAgICAgKiBAcmV0dXJucyBcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldExhbmRtYXJrQWNjTmFtZXMoZG9jKSB7XG4gICAgICAgIGxldCBuYW1lTWFwID0gQ2FjaGVVdGlsLmdldENhY2hlKGRvYywgXCJBcmlhVXRpbF9MYW5kbWFya19BY2NOYW1lc1wiLCBudWxsKTtcbiAgICAgICAgaWYgKG5hbWVNYXAgJiYgbmFtZU1hcC5sZW5ndGggIT09IDApIFxuICAgICAgICAgICAgcmV0dXJuIG5hbWVNYXA7XG5cbiAgICAgICAgbmFtZU1hcCA9IFtdO1xuICAgICAgICBsZXQgbGFuZG1hcmtFbGVtcyA9IGRvYy5xdWVyeVNlbGVjdG9yQWxsKFxuICAgICAgICAgICAgJ2FzaWRlLFtyb2xlPVwiY29tcGxlbWVudGFyeVwiXSwgZm9vdGVyLFtyb2xlPVwiY29udGVudGluZm9cIl0sIGhlYWRlcixbcm9sZT1cImJhbm5lclwiXSwgbWFpbixbcm9sZT1cIm1haW5cIl0sIG5hdixbcm9sZT1cIm5hdmlnYXRpb25cIl0sIGZvcm0sW3JvbGU9XCJmb3JtXCJdLCBzZWN0aW9uLFtyb2xlPVwicmVnaW9uXCJdLCBhcnRpY2xlLFtyb2xlPVwiYXJ0aWNsZVwiXSwgW3JvbGU9XCJzZWFyY2hcIl0sW3JvbGU9XCJhcHBsaWNhdGlvblwiXSxbcm9sZT1cImRvY3VtZW50XCJdJ1xuICAgICAgICApO1xuXG4gICAgICAgIGlmIChsYW5kbWFya0VsZW1zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGRvYywgXCJBcmlhVXRpbF9MYW5kbWFya19BY2NOYW1lc1wiLCBuYW1lTWFwKTtcbiAgICAgICAgICAgIHJldHVybiBuYW1lTWFwO1xuICAgICAgICB9XG5cbiAgICAgICAgbGFuZG1hcmtFbGVtcy5mb3JFYWNoKGZ1bmN0aW9uIChlbGVtOiBFbGVtZW50KSB7XG4gICAgICAgICAgICAvLyBpZ25vcmUgbm9kZSB0aGF0IGlzIEFUIGhpZGRlbiBvciBpbiBhIGRpYWxvZyB0aGF0IGlzIGNvbnNpZGVyZWQgYXMgYSBzZXBhcmF0ZSBsb2NhdGlvbiBmcm9tIHRoZSByZXN0IG9mIHRoZSBtYWluIHBhZ2VcbiAgICAgICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQoZWxlbSkgJiYgQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihlbGVtLCBbXCJESUFMT0dcIl0pID09PSBudWxsICYmIEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUoZWxlbSwgXCJkaWFsb2dcIiwgdHJ1ZSkgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBsZXQgbmFtZSA9IFwiXCI7XG4gICAgICAgICAgICAgICAgbGV0IHBhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWUoZWxlbSk7XG4gICAgICAgICAgICAgICAgaWYgKHBhaXIgJiYgcGFpci5uYW1lICYmIHBhaXIubmFtZS50cmltKCkubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHBhaXIubmFtZS50cmltKCk7XG5cbiAgICAgICAgICAgICAgICAvLyBjaGVjayBuZWVzdGVkIGxhbmRtYXJrIHRvIGNhbGN1bGF0ZSB0aGUgYWNjZXNzaWJsZSBuYW1lXG4gICAgICAgICAgICAgICAgY29uc3QgYW5jZXN0b3JzID0gWy4uLmxhbmRtYXJrRWxlbXNdLmZpbHRlcigoZSkgPT4gZS5jb250YWlucyhlbGVtKSAmJiBlICE9PSBlbGVtKTtcbiAgICAgICAgICAgICAgICBpZiAoYW5jZXN0b3JzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgYW5jZXN0b3JzLmZvckVhY2goKGFuY2VzdG9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbmNlc3Rvcl9wYWlyID0gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lKGFuY2VzdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbmNlc3Rvcl9wYWlyICYmIGFuY2VzdG9yX3BhaXIubmFtZSAmJiBhbmNlc3Rvcl9wYWlyLm5hbWUudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGFuY2VzdG9yX3BhaXIubmFtZS50cmltKCkgKyBcIiBcIiArIG5hbWU7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBjb25zdCByb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKGVsZW0pO1xuICAgICAgICAgICAgICAgIG5hbWVNYXAucHVzaCh7XCJlbGVtXCIgOiBlbGVtLCBcInJvbGVcIiA6IHJvbGUsIFwibmFtZVwiOiBuYW1lfSk7ICAgIFxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZG9jLCBcIkFyaWFVdGlsX0xhbmRtYXJrX0FjY05hbWVzXCIsIG5hbWVNYXApO1xuICAgICAgICByZXR1cm4gbmFtZU1hcDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBjaGVjayBpZiB0aGUgZ2l2ZW4gZWxlbWVudCB3aXRoIHRoZSBsYW5kbWFyayByb2x3IGlzIHVuaXF1ZVxuICAgICAqIEBwYXJhbSBlbGVtZW50IFxuICAgICAqIEBwYXJhbSByb2xlOiBhIHNwZWNpZmljIGxhbmRtYXJrIHJvbGUsIG9yIFwiYW55XCIgZm9yIGFsbCBsYW5kbWFyayByb2xlICBcbiAgICAgKiBAcGFyYW0gY29uc2lkZXJOb25lTGFiZWw6IGlmIGNvbnNpZGVyIHRoZSBsYW5kbWFya3Mgd2l0aG91dCBhIGxhYmVsXG4gICAgICogQHJldHVybnMgXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpc0xhbmRtYXJrTmFtZVVuaXF1ZShlbGVtZW50LCByb2xlLCBjb25zaWRlck5vbmVMYWJlbDogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgICAgIGNvbnN0IG5hbWVNYXAgPSBBcmlhVXRpbC5nZXRMYW5kbWFya0FjY05hbWVzKGVsZW1lbnQub3duZXJEb2N1bWVudCk7XG4gICAgICAgIGxldCBleGlzdCA9IG51bGw7XG4gICAgICAgIGlmIChyb2xlID09PSAnYW55JylcbiAgICAgICAgICAgIGV4aXN0ID0gbmFtZU1hcC5maW5kKGVudHJ5ID0+IGVudHJ5LmVsZW0gPT09IGVsZW1lbnQpOyAgICAgIFxuICAgICAgICBlbHNlICAgIFxuICAgICAgICAgICAgZXhpc3QgPSBuYW1lTWFwLmZpbmQoZW50cnkgPT4gZW50cnkuZWxlbSA9PT0gZWxlbWVudCAmJiBlbnRyeS5yb2xlID09PSByb2xlKTtcblxuICAgICAgICBpZiAoIWV4aXN0KSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBuYW1lID0gZXhpc3QubmFtZTtcbiAgICAgICAgaWYgKCFjb25zaWRlck5vbmVMYWJlbCAmJiBuYW1lID09PSAnJykgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbmFtZU1hcC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKG5hbWVNYXBbaV0uZWxlbSA9PT0gZWxlbWVudCkgY29udGludWU7ICAgICBcbiAgICAgICAgICAgIGlmIChuYW1lID09PSBuYW1lTWFwW2ldLm5hbWUpIHtcbiAgICAgICAgICAgICAgICBpZiAocm9sZSA9PT0gJ2FueScpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5hbWVNYXBbaV0ucm9sZSA9PT0gcm9sZSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7IFxuICAgICAgICAgICAgfSAgICAgICAgXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIEdpdmVuIGFuIGFycmF5IG9mIGVsZW1lbnRzLCByZXR1cm4gdHJ1ZSBpZiB0aGUgZWxlbWVudHMgaGF2ZSB1bmlxdWUgQVJJQSBsYWJlbHMgZ2xvYmFsbHlcbiAgICBwdWJsaWMgc3RhdGljIGhhc1VuaXF1ZUFyaWFMYWJlbHMoZWxlbWVudHMpIHtcbiAgICAgICAgcmV0dXJuIEFyaWFVdGlsLmhhc1VuaXF1ZUFyaWFMYWJlbHNMb2NhbGx5KGVsZW1lbnRzLCB0cnVlKTtcbiAgICB9XG5cbiAgICAvLyBHaXZlbiBhbiBhcnJheSBvZiBlbGVtZW50cywgcmV0dXJuIHRydWUgaWYgdGhlIGVsZW1lbnRzIGhhdmUgdW5pcXVlIEFSSUEgbGFiZWxzXG4gICAgcHVibGljIHN0YXRpYyBoYXNEdXBsaWNhdGVBcmlhTGFiZWxzTG9jYWxseShlbGVtZW50cywgaXNHbG9iYWwpIHtcbiAgICAgICAgaWYgKGVsZW1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsZXQgZG9jID0gZWxlbWVudHNbMF0ub3duZXJEb2N1bWVudDtcblxuICAgICAgICBsZXQgaGFzRHVwbGljYXRlTGFiZWxzID0gZmFsc2U7XG4gICAgICAgIGxldCB1bmlxdWVBcmlhTGFiZWxzOiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfSA9IG51bGw7XG4gICAgICAgIGxldCBkdXBsaWNhdGVMYWJlbE5hbWVBcnJheSA9IG5ldyBBcnJheSgpO1xuXG4gICAgICAgIGlmIChpc0dsb2JhbCkge1xuICAgICAgICAgICAgdW5pcXVlQXJpYUxhYmVscyA9IENhY2hlVXRpbC5nZXRDYWNoZShkb2MsIFwiQXJpYVV0aWxfSEFTX1VOSVFVRV9BUklBX0xBQkVMU1wiLCBudWxsKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodW5pcXVlQXJpYUxhYmVscyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdW5pcXVlQXJpYUxhYmVscyA9IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7ICsraSkge1xuXG4gICAgICAgICAgICBpZiAoZWxlbWVudHNbaV0uaGFzQXR0cmlidXRlKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudHNbaV0uaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKSkge1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBhcmlhTGFiZWwgPSBDb21tb25VdGlsLm5vcm1hbGl6ZVNwYWNpbmcoZWxlbWVudHNbaV0uZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKSkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgaGFzRHVwbGljYXRlTGFiZWxzID0gYXJpYUxhYmVsIGluIHVuaXF1ZUFyaWFMYWJlbHM7XG4gICAgICAgICAgICAgICAgICAgIHVuaXF1ZUFyaWFMYWJlbHNbYXJpYUxhYmVsXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGlmICghKGFyaWFMYWJlbCBpbiBkdXBsaWNhdGVMYWJlbE5hbWVBcnJheSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGR1cGxpY2F0ZUxhYmVsTmFtZUFycmF5W2FyaWFMYWJlbF0gPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBkdXBsaWNhdGVMYWJlbE5hbWVBcnJheVthcmlhTGFiZWxdLnB1c2goZWxlbWVudHNbaV0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSk7XG5cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnRzW2ldLmhhc0F0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKSkge1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBsYWJlbElEcyA9IGVsZW1lbnRzW2ldLmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKS50cmltKCkuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbm9ybWFsaXplZExhYmVsID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDAsIGxlbmd0aCA9IGxhYmVsSURzLmxlbmd0aDsgaiA8IGxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGFiZWxJRCA9IGxhYmVsSURzW2pdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsTm9kZSA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKGVsZW1lbnRzW2ldLCBsYWJlbElEKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYWJlbE5vZGUgJiYgIURPTVV0aWwuc2FtZU5vZGUobGFiZWxOb2RlLCBlbGVtZW50c1tpXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGFiZWwgPSBBcmlhVXRpbC5nZXRUZXh0Q29udGVudEV4Y2x1ZGluZ1NjcmlwdHMobGFiZWxOb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkTGFiZWwgKz0gQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKGxhYmVsKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGhhc0R1cGxpY2F0ZUxhYmVscyA9IG5vcm1hbGl6ZWRMYWJlbCBpbiB1bmlxdWVBcmlhTGFiZWxzO1xuICAgICAgICAgICAgICAgICAgICB1bmlxdWVBcmlhTGFiZWxzW25vcm1hbGl6ZWRMYWJlbF0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIShub3JtYWxpemVkTGFiZWwgaW4gZHVwbGljYXRlTGFiZWxOYW1lQXJyYXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkdXBsaWNhdGVMYWJlbE5hbWVBcnJheVtub3JtYWxpemVkTGFiZWxdID0gbmV3IEFycmF5KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZHVwbGljYXRlTGFiZWxOYW1lQXJyYXlbbm9ybWFsaXplZExhYmVsXS5wdXNoKGVsZW1lbnRzW2ldLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNHbG9iYWwpIHtcbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShkb2MsIFwiQXJpYVV0aWxfSEFTX1VOSVFVRV9BUklBX0xBQkVMU1wiLCB1bmlxdWVBcmlhTGFiZWxzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZHVwbGljYXRlTGFiZWxOYW1lQXJyYXk7XG4gICAgfVxuXG4gICAgLy8gR2l2ZW4gYW4gYXJyYXkgb2YgZWxlbWVudHMsIHJldHVybiB0cnVlIGlmIHRoZSBlbGVtZW50cyBoYXZlIHVuaXF1ZSBBUklBIGxhYmVscyBnbG9iYWxseVxuICAgIHB1YmxpYyBzdGF0aWMgaGFzRHVwbGljYXRlQXJpYUxhYmVscyhlbGVtZW50cykge1xuICAgICAgICByZXR1cm4gQXJpYVV0aWwuaGFzRHVwbGljYXRlQXJpYUxhYmVsc0xvY2FsbHkoZWxlbWVudHMsIHRydWUpO1xuICAgIH1cblxuICAgIC8vIEdpdmVuIGFuIGFycmF5IG9mIGVsZW1lbnRzLCByZXR1cm4gdHJ1ZSBpZiB0aGUgZWxlbWVudHMgaGF2ZSB1bmlxdWUgYXJpYS1sYWJlbGxlZGJ5IGF0dHJpYnV0ZXNcbiAgICBwdWJsaWMgc3RhdGljIGhhc1VuaXF1ZUFyaWFMYWJlbGxlZGJ5KGVsZW1lbnRzKSB7XG5cbiAgICAgICAgbGV0IGhhc0R1cGxpY2F0ZUxhYmVscyA9IGZhbHNlO1xuICAgICAgICBsZXQgbGFiZWxSZWZzID0ge307XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7ICFoYXNEdXBsaWNhdGVMYWJlbHMgJiYgaSA8IGVsZW1lbnRzLmxlbmd0aDsgKytpKSB7XG5cbiAgICAgICAgICAgIGlmIChlbGVtZW50c1tpXS5oYXNBdHRyaWJ1dGUgJiYgZWxlbWVudHNbaV0uaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpICYmICFDb21tb25VdGlsLmlzSWRSZWZlclRvU2VsZihlbGVtZW50c1tpXSwgZWxlbWVudHNbaV0uZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpKSkge1xuICAgICAgICAgICAgICAgIGxldCBsYWJlbFJlZiA9IENvbW1vblV0aWwubm9ybWFsaXplU3BhY2luZyhlbGVtZW50c1tpXS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsbGVkYnlcIikpO1xuICAgICAgICAgICAgICAgIGhhc0R1cGxpY2F0ZUxhYmVscyA9IGxhYmVsUmVmIGluIGxhYmVsUmVmcztcbiAgICAgICAgICAgICAgICBsYWJlbFJlZnNbbGFiZWxSZWZdID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaGFzRHVwbGljYXRlTGFiZWxzID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gIWhhc0R1cGxpY2F0ZUxhYmVscztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB0aGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciByZXNvbHZpbmcgQVJJQSByZXF1aXJlbWVudHMgZm9yIGFuIEhUTUwgZWxlbWVudCBwZXIgQVJJQSBpbiBIVE1MXG4gICAgICogQHBhcmFtIHJ1bGVDb250ZXh0IHRoZSBIVE1MIGVsZW1lbnQgdG8gYmUgZXhhbWluZWRcbiAgICAgKiBAcmV0dXJucyBcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEVsZW1lbnRBcmlhUHJvcGVydHkocnVsZUNvbnRleHQpIHtcbiAgICAgICAgbGV0IHRhZ1Byb3BlcnR5OiBJRG9jdW1lbnRDb25mb3JtYW5jZVJlcXVpcmVtZW50ID0gQ2FjaGVVdGlsLmdldENhY2hlKHJ1bGVDb250ZXh0LCBcIkFyaWFVdGlsX0VsZW1lbnRBcmlhUHJvcGVydHlcIiwgbnVsbCk7XG4gICAgICAgIGlmICghdGFnUHJvcGVydHkpIHtcbiAgICAgICAgICAgIGxldCB0YWdOYW1lID0gbnVsbDtcbiAgICAgICAgICAgIGxldCBuYW1lID0gbnVsbDtcblxuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0LnRhZ05hbWUpIHtcbiAgICAgICAgICAgICAgICB0YWdOYW1lID0gcnVsZUNvbnRleHQudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChydWxlQ29udGV4dC5ub2RlTmFtZSkge1xuICAgICAgICAgICAgICAgIHRhZ05hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBjaGVjayBpZiB0aGUgdGFnUHJvcGVydHkgZXhpc3RzIGluIHRoZSBkb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnQgaGFzaC5cbiAgICAgICAgICAgIHRhZ1Byb3BlcnR5ID0gQVJJQURlZmluaXRpb25zLmRvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudFt0YWdOYW1lXTtcblxuICAgICAgICAgICAgLy8gVGhlIHRhZyBuZWVkcyB0byBjaGVjayBzb21lIHNwZWNpYWwgYXR0cmlidXRlc1xuICAgICAgICAgICAgaWYgKHRhZ1Byb3BlcnR5ID09PSBudWxsIHx8IHRhZ1Byb3BlcnR5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBsZXQgc3BlY2lhbFRhZ1Byb3BlcnRpZXMgPSBBUklBRGVmaW5pdGlvbnMuZG9jdW1lbnRDb25mb3JtYW5jZVJlcXVpcmVtZW50U3BlY2lhbFRhZ3NbdGFnTmFtZV07XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0YWdOYW1lKSB7IC8vIHNwZWNpYWwgY2FzZXNcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImFcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImhyZWZcIikgPyB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wid2l0aC1ocmVmXCJdIDogdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcIndpdGhvdXQtaHJlZlwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiYXJlYVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiaHJlZlwiKSA/IHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJ3aXRoLWhyZWZcIl0gOiB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wid2l0aG91dC1ocmVmXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJmaWd1cmVcIjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZjcyA9IENvbW1vblV0aWwuZ2V0Q2hpbGRCeVRhZyhydWxlQ29udGV4dCwgXCJmaWdjYXB0aW9uXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZmNzICE9PSBudWxsICYmIGZjcy5sZW5ndGggPiAwID8gdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcImNoaWxkLWZpZ2NhcHRpb25cIl0gOiB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wibm8tY2hpbGQtZmlnY2FwdGlvblwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJmb290ZXJcIjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImhlYWRlclwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUocnVsZUNvbnRleHQsIFwiYXJ0aWNsZVwiLCB0cnVlKSAhPT0gbnVsbCB8fCBBcmlhVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKHJ1bGVDb250ZXh0LCBcImNvbXBsZW1lbnRhcnlcIiwgdHJ1ZSkgIT09IG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBBcmlhVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKHJ1bGVDb250ZXh0LCBcIm5hdmlnYXRpb25cIiwgdHJ1ZSkgIT09IG51bGwgfHwgQXJpYVV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShydWxlQ29udGV4dCwgXCJyZWdpb25cIiwgdHJ1ZSkgIT09IG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBDb21tb25VdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBbXCJhcnRpY2xlXCIsIFwiYXNpZGVcIiwgXCJtYWluXCIsIFwibmF2XCIsIFwic2VjdGlvblwiXSkgIT09IG51bGwpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcImRlcy1zZWN0aW9uLWFydGljbGUtYXNpZGUtbWFpbi1uYXZcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcIm90aGVyXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJpbWdcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhbHQgPSBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhbHRcIikgPyBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhbHRcIikgOiBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRpdGxlID0gcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidGl0bGVcIikgPyBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0aXRsZVwiKSA6IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJpYVV0aWwuZ2V0QXJpYUxhYmVsKHJ1bGVDb250ZXh0KS50cmltKCkubGVuZ3RoICE9PSAwIHx8IChhbHQgIT09IG51bGwgJiYgYWx0Lmxlbmd0aCA+IDApIHx8ICh0aXRsZSAhPT0gbnVsbCAmJiB0aXRsZS5sZW5ndGggPiAwKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBpbWcgaGFzIG5vbi1lbXB0eSBhbHQgKGFsdD1cInNvbWUgdGV4dFwiIG9yIGFsdD1cIiAgXCIpIG9yIGFuIGFjY2Vzc2libGUgbmFtZSBpcyBwcm92aWRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJpbWctd2l0aC1hY2NuYW1lXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWx0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBpbWcgaGFzIGFuIGVtcHR5IGFsdCAoYWx0PVwiXCIpIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiaW1nLXdpdGhvdXQtYWNjbmFtZS1lbXB0eS1hbHRcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGltZyBsYWNrcyBhbiBhbHQgYXR0cmlidXRlIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiaW1nLXdpdGhvdXQtYWNjbmFtZS1uby1hbHRcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJpbnB1dFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwidHlwZVwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0eXBlID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidHlwZVwiKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW3R5cGVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YWdQcm9wZXJ0eSA9PT0gbnVsbCB8fCB0YWdQcm9wZXJ0eSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImNoZWNrYm94XCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJhcmlhLXByZXNzZWRcIikgPyB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiY2hlY2tib3gtd2l0aC1hcmlhLXByZXNzZWRcIl0gOiB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiY2hlY2tib3gtd2l0aG91dC1hcmlhLXByZXNzZWRcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiZW1haWxcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcImxpc3RcIikgPyB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiZW1haWwtd2l0aC1saXN0XCJdIDogdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcImVtYWlsLW5vLWxpc3RcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwic2VhcmNoXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJsaXN0XCIpID8gdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcInNlYXJjaC13aXRoLWxpc3RcIl0gOiB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wic2VhcmNoLW5vLWxpc3RcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwidGVsXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJsaXN0XCIpID8gdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcInRlbC13aXRoLWxpc3RcIl0gOiB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1widGVsLW5vLWxpc3RcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwidGV4dFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwibGlzdFwiKSA/IHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJ0ZXh0LXdpdGgtbGlzdFwiXSA6IHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJ0ZXh0LW5vLWxpc3RcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwidXJsXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJsaXN0XCIpID8gdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcInVybC13aXRoLWxpc3RcIl0gOiB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1widXJsLW5vLWxpc3RcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZmF1bHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcImxpc3RcIikgPyB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiZGVmYXVsdC13aXRoLWxpc3RcIl0gOiB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiZGVmYXVsdC1uby1saXN0XCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IHR5cGUgaXMgdGhlIHNhbWUgYXMgdHlwZT10ZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJsaXN0XCIpID8gdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcInRleHQtd2l0aC1saXN0XCJdIDogdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcInRleHQtbm8tbGlzdFwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwibGlcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpYWxUYWdQcm9wZXJ0aWVzID0gQVJJQURlZmluaXRpb25zLmRvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudFNwZWNpYWxUYWdzW1wibGlcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZUNvbnRleHQucGFyZW50RWxlbWVudCAmJiBBcmlhVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MocnVsZUNvbnRleHQucGFyZW50RWxlbWVudCwgXCJsaXN0XCIpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJjaGlsZC1vZi1saXN0LXJvbGVcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcIm5vLWNoaWxkLW9mLWxpc3Qtcm9sZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwic2VjdGlvblwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9uYW1lID0gQVJJQU1hcHBlci5jb21wdXRlTmFtZShydWxlQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL2lmIChuYW1lICYmIG5hbWUudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhYmVsID0gQXJpYVV0aWwuZ2V0QXJpYUxhYmVsKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobGFiZWwgJiYgbGFiZWwudHJpbSgpLmxlbmd0aCA+IDApIHx8IENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwidGl0bGVcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wid2l0aC1uYW1lXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wid2l0aG91dC1uYW1lXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJzZWxlY3RcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpYWxUYWdQcm9wZXJ0aWVzID0gQVJJQURlZmluaXRpb25zLmRvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudFNwZWNpYWxUYWdzW1wic2VsZWN0XCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm11bHRpcGxlXCIpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJzaXplXCIpICYmIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInNpemVcIikgPiAxKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJtdWx0aXBsZS1hdHRyLXNpemUtZ3QxXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJuby1tdWx0aXBsZS1hdHRyLXNpemUtZ3QxXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJzdW1tYXJ5XCI6XG4gICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWFsVGFnUHJvcGVydGllcyA9IEFSSUFEZWZpbml0aW9ucy5kb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnRTcGVjaWFsVGFnc1tcInN1bW1hcnlcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZUNvbnRleHQucGFyZW50RWxlbWVudCAmJiBydWxlQ29udGV4dC5wYXJlbnRFbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdkZXRhaWxzJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIERPTVV0aWwuc2FtZU5vZGUoWy4uLnJ1bGVDb250ZXh0LnBhcmVudEVsZW1lbnQuY2hpbGRyZW5dLmZpbHRlcihlbGVtID0+IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ3N1bW1hcnknKVswXSwgcnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJmaXJzdC1zdW1tYXJ5LW9mLWRldGFpbFwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wibm8tZmlyc3Qtc3VtbWFyeS1vZi1kZXRhaWxcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcInRib2R5XCI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJ0ZFwiOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwidHJcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcmlhVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKHJ1bGVDb250ZXh0LCBcInRhYmxlXCIsIHRydWUpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcImRlcy10YWJsZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJpYVV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShydWxlQ29udGV4dCwgXCJncmlkXCIsIHRydWUpIHx8IEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUocnVsZUNvbnRleHQsIFwidHJlZWdyaWRcIiwgdHJ1ZSkgPyB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiZGVzLWdyaWRcIl0gOiB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiZGVzLW90aGVyXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJ0aFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2NvcGUgPSBDb21tb25VdGlsLmdldFNjb3BlRm9yVGgocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUocnVsZUNvbnRleHQsIFwidGFibGVcIiwgdHJ1ZSkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2NvcGUgPT09ICdjb2x1bW4nKSB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiZGVzLXRhYmxlLWNvbHVtbi1zY29wZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJkZXMtdGFibGUtcm93LXNjb3BlXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChBcmlhVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKHJ1bGVDb250ZXh0LCBcImdyaWRcIiwgdHJ1ZSkgIT09IG51bGwgfHwgQXJpYVV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShydWxlQ29udGV4dCwgXCJ0cmVlZ3JpZFwiLCB0cnVlKSAhPT0gbnVsbCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjb3BlID09PSAnY29sdW1uJykgdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcImRlcy1ncmlkLXRyZWVncmlkLWNvbHVtbi1zY29wZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJkZXMtZ3JpZC10cmVlZ3JpZC1yb3ctc2NvcGVcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiZGVzLW90aGVyXCJdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImRpdlwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBydCA9IHJ1bGVDb250ZXh0LnBhcmVudEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcnQgIT09IG51bGwgJiYgcHJ0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdkbCcgPyB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiY2hpbGQtZGxcIl0gOiB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wibm8tY2hpbGQtZGxcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1Byb3BlcnR5ID0gQVJJQURlZmluaXRpb25zLmRvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudFNwZWNpYWxUYWdzW1wiZGVmYXVsdFwiXSBhcyBJRG9jdW1lbnRDb25mb3JtYW5jZVJlcXVpcmVtZW50O1xuICAgICAgICAgICAgICAgIH0gLy9zd2l0Y2hcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUocnVsZUNvbnRleHQsIFwiQXJpYVV0aWxfRWxlbWVudEFyaWFQcm9wZXJ0eVwiLCB0YWdQcm9wZXJ0eSk7XG4gICAgICAgIHJldHVybiB0YWdQcm9wZXJ0eSB8fCBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0QWxsb3dlZEFyaWFSb2xlcyhydWxlQ29udGV4dCwgcHJvcGVydGllczogSURvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudCkge1xuICAgICAgICBsZXQgYWxsb3dlZFJvbGVzOiBzdHJpbmdbXSA9IENhY2hlVXRpbC5nZXRDYWNoZShydWxlQ29udGV4dCwgXCJBcmlhVXRpbF9BbGxvd2VkQXJpYVJvbGVzXCIsIG51bGwpO1xuICAgICAgICBpZiAoIWFsbG93ZWRSb2xlcykge1xuICAgICAgICAgICAgYWxsb3dlZFJvbGVzID0gW107XG4gICAgICAgICAgICBsZXQgdGFnUHJvcGVydHk6IElEb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnQgPSBudWxsO1xuICAgICAgICAgICAgaWYgKHByb3BlcnRpZXMgIT09IG51bGwgJiYgcHJvcGVydGllcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGFnUHJvcGVydHkgPSBwcm9wZXJ0aWVzO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IEFyaWFVdGlsLmdldEVsZW1lbnRBcmlhUHJvcGVydHkocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGFnUHJvcGVydHkgIT09IG51bGwgJiYgdGFnUHJvcGVydHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGlmICh0YWdQcm9wZXJ0eS5pbXBsaWNpdFJvbGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KHRhZ1Byb3BlcnR5LmltcGxpY2l0Um9sZSwgYWxsb3dlZFJvbGVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRhZ1Byb3BlcnR5LnZhbGlkUm9sZXMgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KHRhZ1Byb3BlcnR5LnZhbGlkUm9sZXMsIGFsbG93ZWRSb2xlcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBpbXBsaWNpdFJvbGVzID0gQXJpYVV0aWwuZ2V0SW1wbGljaXRSb2xlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgICAgICBpZiAoaW1wbGljaXRSb2xlcyAmJiBpbXBsaWNpdFJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KHRhZ1Byb3BlcnR5LnZhbGlkUm9sZXMsIGFsbG93ZWRSb2xlcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKHJ1bGVDb250ZXh0LCBcIkFyaWFVdGlsX0FsbG93ZWRBcmlhUm9sZXNcIiwgYWxsb3dlZFJvbGVzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWxsb3dlZFJvbGVzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0QWxsb3dlZEFyaWFBdHRyaWJ1dGVzKHJ1bGVDb250ZXh0LCByb2xlcywgcHJvcGVydGllcykge1xuICAgICAgICBsZXQgYWxsb3dlZEF0dHJpYnV0ZXM6IHN0cmluZ1tdID0gQ2FjaGVVdGlsLmdldENhY2hlKHJ1bGVDb250ZXh0LCBcIkFyaWFVdGlsX0FsbG93ZWRBcmlhQXR0cmlidXRlc1wiLCBudWxsKTtcbiAgICAgICAgaWYgKCFhbGxvd2VkQXR0cmlidXRlcykge1xuICAgICAgICAgICAgYWxsb3dlZEF0dHJpYnV0ZXMgPSBbXTtcbiAgICAgICAgICAgIGxldCBwZXJtaXR0ZWRSb2xlcyA9IFsuLi5yb2xlc107XG4gICAgICAgICAgICBsZXQgdGFnTmFtZSA9IHJ1bGVDb250ZXh0LnRhZ05hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAgICAgbGV0IHByb2hpYml0ZWRBdHRyaWJ1dGVzID0gW107XG4gICAgICAgICAgICAvLyBFbGVtZW50IHdpdGggYSBkaXNhYmxlZCBhdHRyaWJ1dGUgIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9kaXNhYmxlZC1lbGVtZW50cy5odG1sXG4gICAgICAgICAgICBpZiAoQVJJQURlZmluaXRpb25zLmVsZW1lbnRzQWxsb3dlZERpc2FibGVkLmluZGV4T2YodGFnTmFtZSkgPiAtMSkge1xuICAgICAgICAgICAgICAgIC8vIFVzZSB0aGUgYXJpYS1kaXNhYmxlZCBhdHRyaWJ1dGUgb24gYW55IGVsZW1lbnQgdGhhdCBpcyBhbGxvd2VkIHRoZSBkaXNhYmxlZCBhdHRyaWJ1dGUgaW4gSFRNTDUuXG4gICAgICAgICAgICAgICAgYWxsb3dlZEF0dHJpYnV0ZXMgPSBDb21tb25VdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbShcImFyaWEtZGlzYWJsZWRcIiwgYWxsb3dlZEF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gRWxlbWVudCB3aXRoIGEgcmVxdWlyZWQgYXR0cmlidXRlIGh0dHA6Ly93d3cudGhlLWFydC1vZi13ZWIuY29tL2h0bWwvaHRtbDUtZm9ybS12YWxpZGF0aW9uL1xuICAgICAgICAgICAgaWYgKEFSSUFEZWZpbml0aW9ucy5lbGVtZW50c0FsbG93ZWRSZXF1aXJlZC5pbmRleE9mKHRhZ05hbWUpID4gLTEpIHtcbiAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIGFyaWEtcmVxdWlyZWQgYXR0cmlidXRlIG9uIGFueSBlbGVtZW50IHRoYXQgaXMgYWxsb3dlZCB0aGUgcmVxdWlyZWQgYXR0cmlidXRlIGluIEhUTUw1LlxuICAgICAgICAgICAgICAgIGFsbG93ZWRBdHRyaWJ1dGVzID0gQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW0oXCJhcmlhLXJlcXVpcmVkXCIsIGFsbG93ZWRBdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKEFSSUFEZWZpbml0aW9ucy5lbGVtZW50c0FsbG93ZWRSZWFkT25seS5pbmRleE9mKHRhZ05hbWUpID4gLTEpIHtcbiAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIGFyaWEtcmVhZG9ubHkgYXR0cmlidXRlIG9uIGFueSBlbGVtZW50IHRoYXQgaXMgYWxsb3dlZCB0aGUgcmVhZG9ubHkgYXR0cmlidXRlIGluIEhUTUw1LlxuICAgICAgICAgICAgICAgIGFsbG93ZWRBdHRyaWJ1dGVzID0gQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW0oXCJhcmlhLXJlYWRvbmx5XCIsIGFsbG93ZWRBdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IHRhZ1Byb3BlcnR5ID0gbnVsbDtcbiAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzICE9IG51bGwgJiYgcHJvcGVydGllcyAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgIHRhZ1Byb3BlcnR5ID0gcHJvcGVydGllcztcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IEFyaWFVdGlsLmdldEVsZW1lbnRBcmlhUHJvcGVydHkocnVsZUNvbnRleHQpO1xuXG4gICAgICAgICAgICBpZiAodGFnUHJvcGVydHkgIT09IG51bGwgJiYgdGFnUHJvcGVydHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUgaW1wbGljaXQgcm9sZSBhbGxvd2VkIGF0dHJpYnV0ZXMgdG8gdGhlIGFsbG93ZWQgcm9sZSBsaXN0IGlmIHRoZXJlIGlzIG5vIHNwZWNpZmllZCByb2xlXG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIGlmIHRoZSBlbGVtZW50IGRvZXNuJ3QgYWxsb3cgdGhlIGF0dHJpYnV0ZXMgZnJvbSB0aGUgaW1wbGljaXQgcm9sZXNcbiAgICAgICAgICAgICAgICBpZiAodGFnUHJvcGVydHkuaW1wbGljaXRSb2xlICE9PSBudWxsICYmXG4gICAgICAgICAgICAgICAgICAgIChwZXJtaXR0ZWRSb2xlcyA9PT0gbnVsbCB8fCBwZXJtaXR0ZWRSb2xlcyA9PT0gdW5kZWZpbmVkIHx8IHBlcm1pdHRlZFJvbGVzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgJiYgdGFnUHJvcGVydHkuYWxsb3dBdHRyaWJ1dGVzRnJvbUltcGxpY2l0Um9sZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFnUHJvcGVydHkuaW1wbGljaXRSb2xlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcm9sZVByb3BlcnR5ID0gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3RhZ1Byb3BlcnR5LmltcGxpY2l0Um9sZVtpXV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocm9sZVByb3BlcnR5ICE9PSBudWxsICYmIHJvbGVQcm9wZXJ0eSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHByb3BlcnRpZXMgPSByb2xlUHJvcGVydHkucHJvcHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KHByb3BlcnRpZXMsIGFsbG93ZWRBdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzID0gQXJpYVV0aWwuZ2V0Um9sZVJlcXVpcmVkUHJvcGVydGllcyh0YWdQcm9wZXJ0eS5pbXBsaWNpdFJvbGVbaV0sIHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tb25VdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QocHJvcGVydGllcywgYWxsb3dlZEF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwcm9oaWJpdGVkUHJvcHMgPSByb2xlUHJvcGVydHkucHJvaGliaXRlZFByb3BzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9oaWJpdGVkUHJvcHMgJiYgcHJvaGliaXRlZFByb3BzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdChwcm9oaWJpdGVkUHJvcHMsIHByb2hpYml0ZWRBdHRyaWJ1dGVzKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpYWwgY2FzZSBvZiBzZXBhcmF0b3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFnUHJvcGVydHkuaW1wbGljaXRSb2xlW2ldID09PSBcInNlcGFyYXRvclwiICYmIENvbW1vblV0aWwuaXNGb2N1c2FibGUocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdChbXCJhcmlhLWRpc2FibGVkXCIsIFwiYXJpYS12YWx1ZW5vd1wiLCBcImFyaWEtdmFsdWVtYXhcIiwgXCJhcmlhLXZhbHVlbWluXCIsIFwiYXJpYS12YWx1ZXRleHRcIl0sIGFsbG93ZWRBdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gQWRkaW5nIHRoZSBnbG9iYWwgcHJvcGVydGllcyB0byB0aGUgdmFsaWQgYXR0cmlidXRlIGxpc3RcbiAgICAgICAgICAgICAgICBpZiAodGFnUHJvcGVydHkuZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcHJvcGVydGllcyA9IEFSSUFEZWZpbml0aW9ucy5nbG9iYWxQcm9wZXJ0aWVzOyAvLyBnbG9iYWwgcHJvcGVydGllc1xuICAgICAgICAgICAgICAgICAgICBDb21tb25VdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QocHJvcGVydGllcywgYWxsb3dlZEF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGFkZGluZyB0aGUgb3RoZXIgcm9sZSB0byB0aGUgYWxsb3dlZCByb2xlcyBmb3IgdGhlIGF0dHJpYnV0ZXNcbiAgICAgICAgICAgIGlmICh0YWdQcm9wZXJ0eSAmJiB0YWdQcm9wZXJ0eS5vdGhlclJvbGVzRm9yQXR0cmlidXRlcyAmJiB0YWdQcm9wZXJ0eS5vdGhlclJvbGVzRm9yQXR0cmlidXRlcy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgIENvbW1vblV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdCh0YWdQcm9wZXJ0eS5vdGhlclJvbGVzRm9yQXR0cmlidXRlcywgcGVybWl0dGVkUm9sZXMpO1xuICAgICAgICAgICAgLy8gYWRkaW5nIHRoZSBzcGVjaWZpZWQgcm9sZSBwcm9wZXJ0aWVzIHRvIHRoZSBhbGxvd2VkIGF0dHJpYnV0ZSBsaXN0XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgcGVybWl0dGVkUm9sZXMgIT09IG51bGwgJiYgaSA8IHBlcm1pdHRlZFJvbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJvbGVQcm9wZXJ0aWVzID0gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3Blcm1pdHRlZFJvbGVzW2ldXTtcbiAgICAgICAgICAgICAgICBpZiAocm9sZVByb3BlcnRpZXMgIT09IG51bGwgJiYgcm9sZVByb3BlcnRpZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgdGhlIHByb3BlcnRpZXMgaWYgdGhlIGVsZW1lbnQgZG9lc24ndCBhbGxvdyBhdHRyaWJ1dGVzIGZyb20gdGhlIGltcGxpY2l0IHJvbGVcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0YWdQcm9wZXJ0eSB8fCB0YWdQcm9wZXJ0eS5pbXBsaWNpdFJvbGUgPT09IG51bGwgfHwgIXRhZ1Byb3BlcnR5LmltcGxpY2l0Um9sZS5pbmNsdWRlcyhwZXJtaXR0ZWRSb2xlc1tpXSkgfHwgKHRhZ1Byb3BlcnR5LmltcGxpY2l0Um9sZS5pbmNsdWRlcyhwZXJtaXR0ZWRSb2xlc1tpXSkgJiYgdGFnUHJvcGVydHkuYWxsb3dBdHRyaWJ1dGVzRnJvbUltcGxpY2l0Um9sZSA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHByb3BlcnRpZXMgPSByb2xlUHJvcGVydGllcy5wcm9wczsgLy8gYWxsb3dlZCBwcm9wZXJ0aWVzXG4gICAgICAgICAgICAgICAgICAgICAgICBDb21tb25VdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QocHJvcGVydGllcywgYWxsb3dlZEF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcyA9IEFyaWFVdGlsLmdldFJvbGVSZXF1aXJlZFByb3BlcnRpZXMocGVybWl0dGVkUm9sZXNbaV0sIHJ1bGVDb250ZXh0KTsgLy8gcmVxdWlyZWQgcHJvcGVydGllc1xuICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KHByb3BlcnRpZXMsIGFsbG93ZWRBdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZXQgcHJvaGliaXRlZFByb3BzID0gcm9sZVByb3BlcnRpZXMucHJvaGliaXRlZFByb3BzO1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJvaGliaXRlZFByb3BzICYmIHByb2hpYml0ZWRQcm9wcy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KHByb2hpYml0ZWRQcm9wcywgcHJvaGliaXRlZEF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIHNlcGFyYXRvclxuICAgICAgICAgICAgICAgICAgICBpZiAocGVybWl0dGVkUm9sZXNbaV0gPT09IFwic2VwYXJhdG9yXCIgJiYgQ29tbW9uVXRpbC5pc0ZvY3VzYWJsZShydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdChbXCJhcmlhLWRpc2FibGVkXCIsIFwiYXJpYS12YWx1ZW1heFwiLCBcImFyaWEtdmFsdWVtaW5cIiwgXCJhcmlhLXZhbHVldGV4dFwiXSwgYWxsb3dlZEF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBpZ25vcmUgYXJpYS1sZXZlbCwgYXJpYS1zZXRzaXplIG9yIGFyaWEtcG9zaW5zZXQgaWYgXCJyb3dcIiBpcyBub3QgaW4gdHJlZWdyaWRcbiAgICAgICAgICAgIGlmIChwZXJtaXR0ZWRSb2xlcy5pbmNsdWRlcyhcInJvd1wiKSAmJiBBcmlhVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKHJ1bGVDb250ZXh0LCBcInRyZWVncmlkXCIsIHRydWUpID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSAtMTtcbiAgICAgICAgICAgICAgICBpZiAoKGluZGV4ID0gYWxsb3dlZEF0dHJpYnV0ZXMuaW5kZXhPZihcImFyaWEtbGV2ZWxcIikpID4gLTEpXG4gICAgICAgICAgICAgICAgICAgIGFsbG93ZWRBdHRyaWJ1dGVzLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoKGluZGV4ID0gYWxsb3dlZEF0dHJpYnV0ZXMuaW5kZXhPZihcImFyaWEtc2V0c2l6ZVwiKSkgPiAtMSlcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dlZEF0dHJpYnV0ZXMuc3BsaWNlKGluZGV4LCAxKTtcblxuICAgICAgICAgICAgICAgIGlmICgoaW5kZXggPSBhbGxvd2VkQXR0cmlidXRlcy5pbmRleE9mKFwiYXJpYS1wb3NpbnNldFwiKSkgPiAtMSlcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dlZEF0dHJpYnV0ZXMuc3BsaWNlKGluZGV4LCAxKTtcblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBhZGQgdGhlIG90aGVyIGFsbG93ZWQgYXR0cmlidXRlcyBmb3IgdGhlIGVsZW1lbnRcbiAgICAgICAgICAgIGlmICh0YWdQcm9wZXJ0eSAmJiB0YWdQcm9wZXJ0eS5vdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlcyAmJiB0YWdQcm9wZXJ0eS5vdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgLy8gY2hlY2sgYXR0cmlidXRlLXZhbHVlIHBhaXIgaWYgZXhpc3RzXG4gICAgICAgICAgICAgICAgbGV0IGFsbG93ZWQgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBwID0gMDsgcCA8IHRhZ1Byb3BlcnR5Lm90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzLmxlbmd0aDsgcCsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGF0dHIgPSB0YWdQcm9wZXJ0eS5vdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlc1twXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGF0dHIuaW5jbHVkZXMoXCI9XCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYWlyID0gYXR0ci5zcGxpdChcIj1cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKHBhaXJbMF0pID09PSBwYWlyWzFdKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWQucHVzaChwYWlyWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkLnB1c2goYXR0cik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChhbGxvd2VkLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdChhbGxvd2VkLCBhbGxvd2VkQXR0cmlidXRlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBhZGQgdGhlIG90aGVyIHByb2hpYml0dGVkIGF0dHJpYnV0ZXMgZm9yIHRoZSBlbGVtZW50XG4gICAgICAgICAgICBpZiAodGFnUHJvcGVydHkgJiYgdGFnUHJvcGVydHkub3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXMgJiYgdGFnUHJvcGVydHkub3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIC8vIGNoZWNrIGF0dHJpYnV0ZS12YWx1ZSBwYWlyIGlmIGV4aXN0c1xuICAgICAgICAgICAgICAgIGxldCBkaXNhbGxvd2VkID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgcCA9IDA7IHAgPCB0YWdQcm9wZXJ0eS5vdGhlckRpc2FsbG93ZWRBcmlhQXR0cmlidXRlcy5sZW5ndGg7IHArKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhdHRyID0gdGFnUHJvcGVydHkub3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXNbcF07XG4gICAgICAgICAgICAgICAgICAgIGlmIChhdHRyLmluY2x1ZGVzKFwiPVwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFpciA9IGF0dHIuc3BsaXQoXCI9XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShwYWlyWzBdKSA9PT0gcGFpclsxXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhbGxvd2VkLnB1c2gocGFpclswXSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWxsb3dlZC5wdXNoKGF0dHIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZGlzYWxsb3dlZC5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICBDb21tb25VdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QoZGlzYWxsb3dlZCwgcHJvaGliaXRlZEF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy9leGNsdWRlIHRoZSBwcm9oaWJpdGVkQXR0cmlidXRlcyBmcm9tIHRoZSBhbGxvd2VkQXR0cmlidXRlc1xuICAgICAgICAgICAgYWxsb3dlZEF0dHJpYnV0ZXMgPSBDb21tb25VdGlsLnJlZHVjZUFycmF5SXRlbUxpc3QocHJvaGliaXRlZEF0dHJpYnV0ZXMsIGFsbG93ZWRBdHRyaWJ1dGVzKTtcblxuICAgICAgICAgICAgLy9leGNsdWRlIGFyaWEgYXR0cmlidXRlIGZvciBlbGVtZW50cyB3aXRob3V0IGltcGxpY2l0IHJvbGUgYW5kIHdpdGggJ05hbWluZyBQcm9oaWJpdGVkJ1xuICAgICAgICAgICAgaWYgKCghcm9sZXMgfHwgcm9sZXMubGVuZ3RoID09PSAwKSAmJiB0YWdQcm9wZXJ0eS5pbXBsaWNpdFJvbGUgPT09IG51bGwgJiYgdGFnUHJvcGVydHkucHJvaGliaXRlZEFyaWFBdHRyaWJ1dGVzV2hlbk5vSW1wbGljaXRSb2xlKVxuICAgICAgICAgICAgICAgIGFsbG93ZWRBdHRyaWJ1dGVzID0gQ29tbW9uVXRpbC5yZWR1Y2VBcnJheUl0ZW1MaXN0KHRhZ1Byb3BlcnR5LnByb2hpYml0ZWRBcmlhQXR0cmlidXRlc1doZW5Ob0ltcGxpY2l0Um9sZSwgYWxsb3dlZEF0dHJpYnV0ZXMpO1xuXG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUocnVsZUNvbnRleHQsIFwiQXJpYVV0aWxfQWxsb3dlZEFyaWFBdHRyaWJ1dGVzXCIsIGFsbG93ZWRBdHRyaWJ1dGVzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWxsb3dlZEF0dHJpYnV0ZXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEBwYXJhbSBhcmlhQXR0ciBcbiAgICAgKiBAcGFyYW0gaHRtbEF0dHJzIFxuICAgICAqIEB0eXBlOiBjb25mbGljdCBvciBvdmVybGFwcGluZ1xuICAgICAqIEByZXR1cm5zIGh0bWxBdHRyTmFtZSwgJ1Bhc3MnIG9yIG51bGxcbiAgICAgKiAgICAgICAgIGh0bWxBdHRyTmFtZSB0aGF0IGNvbmZsaWN0cyB3aXRoIHRoZSBhcmlhQXR0ciwgXG4gICAgICogICAgICAgICAnUGFzcycgd2l0aCBubyBjb25mbGljdCB3aXRoIHRoZSBhcmlhQXR0ciwgXG4gICAgICogICAgICAgICBvciBudWxsIHdoZXJlIGFyaWFBdHRyIHdvbid0IGNhdXNlIGNvbmZsaWN0XG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRDb25mbGljdE9yT3ZlcmxhcHBpbmdIdG1sQXR0cmlidXRlKGFyaWFBdHRyLCBodG1sQXR0cnMsIHR5cGUpOiBhbnlbXSB8IG51bGwge1xuICAgICAgICBsZXQgZXhpc3QgPSBBUklBRGVmaW5pdGlvbnMucmVsYXRlZEFyaWFIdG1sQXR0cmlidXRlc1thcmlhQXR0clsnbmFtZSddXTtcbiAgICAgICAgaWYgKGV4aXN0KSB7XG4gICAgICAgICAgICBpZiAoIWFyaWFBdHRyIHx8IGFyaWFBdHRyLmxlbmd0aCA9PSAwIHx8ICFodG1sQXR0cnMgfHwgaHRtbEF0dHJzLmxlbmd0aCA9PSAwKSByZXR1cm4gW107XG5cbiAgICAgICAgICAgIGxldCBleGFtaW5lZEh0bWxBdHJOYW1lcyA9IFtdO1xuICAgICAgICAgICAgbGV0IGNvbmNlcm5UeXBlcyA9IG51bGw7XG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gJ2NvbmZsaWN0Jykge1xuICAgICAgICAgICAgICAgIGlmICghZXhpc3QuY29uZmxpY3QgfHwgT2JqZWN0LmtleXMoZXhpc3QuY29uZmxpY3QpLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgY29uY2VyblR5cGVzID0gZXhpc3QuY29uZmxpY3Q7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdvdmVybGFwcGluZycpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWV4aXN0Lm92ZXJsYXBwaW5nIHx8IE9iamVjdC5rZXlzKGV4aXN0Lm92ZXJsYXBwaW5nKS5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIGNvbmNlcm5UeXBlcyA9IGV4aXN0Lm92ZXJsYXBwaW5nO1xuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgICAgIGxldCBhcHBsaWNhYmxlID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgZmFpbCA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBjb25jZXJuVHlwZXMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgY29uY2VybkFyaWFWYWx1ZSA9IGNvbmNlcm5UeXBlc1trXS5hcmlhQXR0cmlidXRlVmFsdWU7XG4gICAgICAgICAgICAgICAgbGV0IGNvbmNlcm5IdG1sTmFtZXMgPSBjb25jZXJuVHlwZXNba10uaHRtbEF0dHJpYnV0ZU5hbWVzO1xuICAgICAgICAgICAgICAgIGxldCBjb25jZXJuSHRtbFZhbHVlcyA9IGNvbmNlcm5UeXBlc1trXS5odG1sQXR0cmlidXRlVmFsdWVzO1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBodG1sQXR0cnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gY29uY2Vybkh0bWxOYW1lcy5pbmRleE9mKGh0bWxBdHRyc1tpXVsnbmFtZSddKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYWJsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaHRtbFZhbHVlc0luQ29uY2VybiA9IChjb25jZXJuSHRtbFZhbHVlcyA9PT0gbnVsbCB8fCBjb25jZXJuSHRtbFZhbHVlc1tpbmRleF0gPT09IG51bGwpID8gbnVsbCA6IGNvbmNlcm5IdG1sVmFsdWVzW2luZGV4XS5zcGxpdChcIixcIik7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25jZXJuQXJpYVZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGh0bWxWYWx1ZXNJbkNvbmNlcm4gPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhhbWluZWRIdG1sQXRyTmFtZXMucHVzaCh7IHJlc3VsdDogJ0ZhaWxlZCcsICdhdHRyJzogaHRtbEF0dHJzW2ldWyduYW1lJ10gfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaHRtbFZhbHVlc0luQ29uY2Vybi5pbmNsdWRlcyhodG1sQXR0cnNbaV1bJ3ZhbHVlJ10pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4YW1pbmVkSHRtbEF0ck5hbWVzLnB1c2goeyByZXN1bHQ6ICdGYWlsZWQnLCAnYXR0cic6IGh0bWxBdHRyc1tpXVsnbmFtZSddIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGh0bWxWYWx1ZXNJbkNvbmNlcm4gPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uY2VybkFyaWFWYWx1ZSA9PT0gYXJpYUF0dHJbJ3ZhbHVlJ10pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhhbWluZWRIdG1sQXRyTmFtZXMucHVzaCh7IHJlc3VsdDogJ0ZhaWxlZCcsICdhdHRyJzogaHRtbEF0dHJzW2ldWyduYW1lJ10gfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uY2VybkFyaWFWYWx1ZSA9PT0gJ1ZBTFVFJyAmJiBodG1sVmFsdWVzSW5Db25jZXJuLmluY2x1ZGVzKCdWQUxVRScpICYmIGh0bWxWYWx1ZXNJbkNvbmNlcm5bMF0gIT09IGFyaWFBdHRyWyd2YWx1ZSddKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhhbWluZWRIdG1sQXRyTmFtZXMucHVzaCh7IHJlc3VsdDogJ0ZhaWxlZCcsICdhdHRyJzogaHRtbEF0dHJzW2ldWyduYW1lJ10gfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbmNlcm5BcmlhVmFsdWUgPT09IGFyaWFBdHRyWyd2YWx1ZSddICYmIGh0bWxWYWx1ZXNJbkNvbmNlcm4uaW5jbHVkZXMoaHRtbEF0dHJzW2ldWyd2YWx1ZSddKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4YW1pbmVkSHRtbEF0ck5hbWVzLnB1c2goeyByZXN1bHQ6ICdGYWlsZWQnLCAnYXR0cic6IGh0bWxBdHRyc1tpXVsnbmFtZSddIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoYXBwbGljYWJsZSAmJiAhZmFpbClcbiAgICAgICAgICAgICAgICBleGFtaW5lZEh0bWxBdHJOYW1lcy5wdXNoKHsgcmVzdWx0OiAnUGFzcycsICdhdHRyJzogJycgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiBleGFtaW5lZEh0bWxBdHJOYW1lcztcbiAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNvbnRhaW5zUHJlc2VudGF0aW9uYWxDaGlsZHJlbk9ubHkoZWxlbTogSFRNTEVsZW1lbnQpOiBib29sZWFuIHtcbiAgICAgICAgbGV0IHJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXMoZWxlbSwgZmFsc2UpO1xuICAgICAgICAvLyBpZiBleHBsaWNpdCByb2xlIGRvZXNuJ3QgZXhpc3QsIGdldCB0aGUgaW1wbGljaXQgb25lXG4gICAgICAgIGlmICghcm9sZXMgfHwgcm9sZXMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcm9sZXMgPSBBcmlhVXRpbC5nZXRJbXBsaWNpdFJvbGUoZWxlbSk7XG5cbiAgICAgICAgLy9pZ25vcmUgaWYgdGhlIGVsZW1lbnQgZG9lc24ndCBoYXZlIGFueSBleHBsaWNpdCBvciBpbXBsaWNpdCByb2xlLCBzaG91bGRuJ3QgaGFwcGVuXG4gICAgICAgIGlmICghcm9sZXMgfHwgcm9sZXMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyByb2xlcyAhPT0gbnVsbCAmJiBpIDwgcm9sZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCByb2xlUHJvcGVydGllcyA9IEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlc1tpXV07XG4gICAgICAgICAgICBpZiAocm9sZVByb3BlcnRpZXMgIT09IG51bGwgJiYgcm9sZVByb3BlcnRpZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGxldCBwcmVzZW50aW9uYWwgPSByb2xlUHJvcGVydGllcy5wcmVzZW50YXRpb25hbENoaWxkcmVuO1xuICAgICAgICAgICAgICAgIGlmIChwcmVzZW50aW9uYWwgPT09IHRydWUpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHNob3VsZEJlUHJlc2VudGF0aW9uYWxDaGlsZChlbGVtZW50OiBIVE1MRWxlbWVudCk6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgd2Fsa05vZGU6IEVsZW1lbnQgPSBET01XYWxrZXIucGFyZW50RWxlbWVudChlbGVtZW50KTtcbiAgICAgICAgd2hpbGUgKHdhbGtOb2RlKSB7XG4gICAgICAgICAgICBpZiAoQXJpYVV0aWwuY29udGFpbnNQcmVzZW50YXRpb25hbENoaWxkcmVuT25seSh3YWxrTm9kZSBhcyBIVE1MRWxlbWVudCkpIHJldHVybiB0cnVlO1xuXG4gICAgICAgICAgICAvL2FyaWEtb3duIGNhc2U6IGlmIHRoZSBlbGVtZW50IGlzIHJlZmVycmVkIGJ5IGFuIGFyaWEtd29uXG4gICAgICAgICAgICB3YWxrTm9kZSA9IEFSSUFNYXBwZXIuZ2V0QXJpYU93bmVkQnkod2Fsa05vZGUgYXMgSFRNTEVsZW1lbnQpIHx8IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KHdhbGtOb2RlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyogXG4gKiBjaGVjayBpZiBhbnkgZXhwbGljaXQgcm9sZSBzcGVjaWZpZWQgZm9yIHRoZSBlbGVtZW50IGlzIGEgdmFsaWQgQVJJQSByb2xlXG4gKiByZXR1cm46IG51bGwgaWYgbm8gZXhwbGljaXQgcm9sZSBpcyBkZWZpbmVkLCBcbiAqICAgICAgICAgdHJ1ZSBpZiB0aGUgcm9sZShzKSBhcmUgZGVmaW5lZCBpbiBBUklBXG4gKiAgICAgICAgIGZhbHNlIGlmIGFueSByb2xlIGlzIG5vdCBkZWZpbmVkIGluIEFSSUFcbiovXG4gICAgcHVibGljIHN0YXRpYyBhcmVSb2xlc0RlZmluZWQocm9sZXM6IHN0cmluZ1tdKSB7XG4gICAgICAgIGlmICghcm9sZXMgfHwgcm9sZXMubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgZGVzaWduUGF0dGVybnMgPSBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnM7XG4gICAgICAgIGZvciAoY29uc3Qgcm9sZSBvZiByb2xlcylcbiAgICAgICAgICAgIGlmICghKHJvbGUudG9Mb3dlckNhc2UoKSBpbiBkZXNpZ25QYXR0ZXJucykpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qIFxuICAgICAqIGNoZWNrIGlmIGFueSBleHBsaWNpdCByb2xlIHNwZWNpZmllZCBmb3IgdGhlIGVsZW1lbnQgaXMgYSB2YWxpZCBBUklBIHJvbGVcbiAgICAgKiByZXR1cm46IG51bGwgaWYgbm8gZXhwbGljaXQgcm9sZSBpcyBkZWZpbmVkLCBcbiAgICAgKiAgICAgICAgIHRydWUgaWYgdGhlIHJvbGUocykgYXJlIGRlZmluZWQgaW4gQVJJQVxuICAgICAqICAgICAgICAgZmFsc2UgaWYgYW55IHJvbGUgaXMgbm90IGRlZmluZWQgaW4gQVJJQVxuICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnZhbGlkUm9sZXMocnVsZUNvbnRleHQ6IEVsZW1lbnQpIHtcbiAgICAgICAgbGV0IGRvbVJvbGVzOiBzdHJpbmdbXSA9IEFyaWFVdGlsLmdldFVzZXJEZWZpbmVkUm9sZXMocnVsZUNvbnRleHQpO1xuXG4gICAgICAgIGlmICghZG9tUm9sZXMgfHwgZG9tUm9sZXMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gY2hlY2sgdGhlICdnZW5lcmljJyByb2xlIGZpcnN0XG4gICAgICAgIGlmIChkb21Sb2xlcyAmJiBkb21Sb2xlcy5pbmNsdWRlcygnZ2VuZXJpYycpKVxuICAgICAgICAgICAgcmV0dXJuIFtcImdlbmVyaWNcIl07XG5cbiAgICAgICAgLy8gRmFpbGluZyByb2xlc1xuICAgICAgICBsZXQgZmFpbFJvbGVUb2tlbnMgPSBbXTtcbiAgICAgICAgLy8gUGFzc2luZyByb2xlc1xuICAgICAgICBsZXQgcGFzc1JvbGVUb2tlbnMgPSBbXTtcblxuICAgICAgICBsZXQgdGFnUHJvcGVydHkgPSBBcmlhVXRpbC5nZXRFbGVtZW50QXJpYVByb3BlcnR5KHJ1bGVDb250ZXh0KTtcbiAgICAgICAgbGV0IGFsbG93ZWRSb2xlcyA9IEFyaWFVdGlsLmdldEFsbG93ZWRBcmlhUm9sZXMocnVsZUNvbnRleHQsIHRhZ1Byb3BlcnR5KTtcbiAgICAgICAgaWYgKCFhbGxvd2VkUm9sZXMgfHwgYWxsb3dlZFJvbGVzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiBkb21Sb2xlcztcblxuICAgICAgICBsZXQgaW52YWxpZFJvbGVzID0gW107XG5cbiAgICAgICAgaWYgKGFsbG93ZWRSb2xlcy5pbmNsdWRlcygnYW55JykpXG4gICAgICAgICAgICByZXR1cm4gW107XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkb21Sb2xlcy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGlmICghYWxsb3dlZFJvbGVzLmluY2x1ZGVzKGRvbVJvbGVzW2ldKSAmJiAhaW52YWxpZFJvbGVzLmluY2x1ZGVzKGRvbVJvbGVzW2ldKSlcbiAgICAgICAgICAgICAgICBpbnZhbGlkUm9sZXMucHVzaChkb21Sb2xlc1tpXSk7XG5cbiAgICAgICAgcmV0dXJuIGludmFsaWRSb2xlcztcbiAgICB9XG5cbiAgICAvKiBcbiAgICAgKiBjaGVjayBpZiBhbnkgZXhwbGljaXQgcm9sZSBzcGVjaWZpZWQgZm9yIHRoZSBlbGVtZW50IGlzIG5vdCBkZWZpbmVkIGluIEFSSUFcbiAgICAgKiByZXR1cm46IGxpc3Qgb2Ygc3BlY2lmaWVkIHJvbGVzIG5vdCBkZWZpbmVkIGluIEFSSUFcbiAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Um9sZXNVbmRlZmluZWRCeUFyaWEoZWxlbWVudDogRWxlbWVudCkge1xuICAgICAgICBpZiAoIWVsZW1lbnQpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IHJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXMoZWxlbWVudCwgZmFsc2UpO1xuICAgICAgICBsZXQgdW5kZWZpbmVkUm9sZXMgPSBbXTtcbiAgICAgICAgaWYgKHJvbGVzICYmIHJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxldCBkZXNpZ25QYXR0ZXJucyA9IEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJucztcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm9sZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoIShyb2xlc1tpXSBpbiBkZXNpZ25QYXR0ZXJucykpIHtcbiAgICAgICAgICAgICAgICAgICAgdW5kZWZpbmVkUm9sZXMucHVzaChyb2xlc1tpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWRSb2xlcztcbiAgICB9XG5cbiAgICAvKiBcbiAgICAgKiB0aGlzIG1ldGhvZCBmaXJzdCBjaGVja3MgZXhwbGljaXQgcm9sZXMsIGlmIG5vIGV4cGxpY2l0IHJvbGUsIGl0IHdpbGwgY2hlY2sgdGhlIGltcGxpY2l0IHJvbGVcbiAgICAgKiByZXR1cm46IG51bGwgaWYgYW55IGV4cGxpY2l0IHJvbGUgaXMgaW52YWxpZCwgXG4gICAgICogICAgICAgICBhIGxpc3Qgb2YgaW52YWxpZCBhdHRyaWJ1dGVzXG4gICAgICogICAgICAgICBlbXB0eSBsaXN0IGlmIGFsbCBhdHRyaWJ1dGVzIGFyZSB2YWxpZCwgb3Igbm8gYXJpYSBhdHRyaWJ1dGVzIGFyZSBzcGVjaWZpZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEludmFsaWRBcmlhQXR0cmlidXRlcyhydWxlQ29udGV4dDogRWxlbWVudCk6IHN0cmluZ1tdIHtcbiAgICAgICAgbGV0IHJvbGVzID0gQXJpYVV0aWwuZ2V0VXNlckRlZmluZWRSb2xlcyhydWxlQ29udGV4dCk7XG5cbiAgICAgICAgLy8gdGhlIGludmFsaWQgcm9sZSBjYXNlOiBoYW5kbGVkIGJ5IFJwdF9BcmlhX1ZhbGlkUm9sZS4gSWdub3JlIHRvIGF2b2lkIGR1cGxpY2F0ZWQgcmVwb3J0XG4gICAgICAgIC8vIGZvciBtdXRpcGxlIHJvbGVzLCBza2lwIGlmIGFueSByb2xlIGlzIGludmFsaWRcbiAgICAgICAgbGV0IGRlZmluZWQgPSBBcmlhVXRpbC5hcmVSb2xlc0RlZmluZWQocm9sZXMpO1xuICAgICAgICBpZiAoZGVmaW5lZCAhPT0gbnVsbCAmJiAhZGVmaW5lZClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCBhdHRycyA9IFtdO1xuICAgICAgICBpZiAoIXJvbGVzIHx8IHJvbGVzLmxlbmd0aCA9PSAwKVxuICAgICAgICAgICAgcm9sZXMgPSBBcmlhVXRpbC5nZXRJbXBsaWNpdFJvbGUocnVsZUNvbnRleHQpO1xuXG4gICAgICAgIGxldCBhcmlhX2F0dHJzOiBzdHJpbmdbXSA9IEFyaWFVdGlsLmdldFVzZXJEZWZpbmVkQXJpYUF0dHJpYnV0ZXMocnVsZUNvbnRleHQpO1xuXG4gICAgICAgIGxldCB0YWdQcm9wZXJ0eSA9IEFyaWFVdGlsLmdldEVsZW1lbnRBcmlhUHJvcGVydHkocnVsZUNvbnRleHQpO1xuICAgICAgICAvLyBBdHRyaWJ1dGVzIGFsbG93ZWQgb24gdGhpcyBub2RlXG4gICAgICAgIGxldCBhbGxvd2VkQXR0cmlidXRlcyA9IEFyaWFVdGlsLmdldEFsbG93ZWRBcmlhQXR0cmlidXRlcyhydWxlQ29udGV4dCwgcm9sZXMsIHRhZ1Byb3BlcnR5KTtcblxuICAgICAgICBpZiAoYXJpYV9hdHRycykge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmlhX2F0dHJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGF0dHJOYW1lID0gYXJpYV9hdHRyc1tpXS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWFsbG93ZWRBdHRyaWJ1dGVzLmluY2x1ZGVzKGF0dHJOYW1lKSAmJiAhYXR0cnMuaW5jbHVkZXMoYXR0ck5hbWUpKVxuICAgICAgICAgICAgICAgICAgICBhdHRycy5wdXNoKGF0dHJOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXR0cnM7XG4gICAgfVxuXG4gICAgLyogXG4gICAgICogZ2V0IGNvbmZsaWN0IEFyaWEgYW5kIEh0bWwgYXR0cmlidXRlc1xuICAgICAqIHJldHVybjogYSBsaXN0IG9mIEFyaWEgYW5kIEh0bWwgYXR0cmlidXRlIHBhaXJzIHRoYXQgYXJlIGNvbmZsaWN0XG4gICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldENvbmZsaWN0QXJpYUFuZEh0bWxBdHRyaWJ1dGVzKGVsZW06IEVsZW1lbnQpIHtcblxuICAgICAgICBsZXQgYXJpYUF0dHJzID0gQXJpYVV0aWwuZ2V0VXNlckRlZmluZWRBcmlhQXR0cmlidXRlTmFtZVZhbHVlUGFpcnMoZWxlbSk7XG4gICAgICAgIGxldCBodG1sQXR0cnMgPSBBcmlhVXRpbC5nZXRVc2VyRGVmaW5lZEh0bWxBdHRyaWJ1dGVOYW1lVmFsdWVQYWlycyhlbGVtKTtcblxuICAgICAgICBsZXQgcmV0ID0gW107XG4gICAgICAgIGlmIChhcmlhQXR0cnMgJiYgYXJpYUF0dHJzLmxlbmd0aCA+IDAgJiYgaHRtbEF0dHJzICYmIGh0bWxBdHRycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyaWFBdHRycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4YW1pbmVkSHRtbEF0ck5hbWVzID0gQXJpYVV0aWwuZ2V0Q29uZmxpY3RPck92ZXJsYXBwaW5nSHRtbEF0dHJpYnV0ZShhcmlhQXR0cnNbaV0sIGh0bWxBdHRycywgJ2NvbmZsaWN0Jyk7XG4gICAgICAgICAgICAgICAgaWYgKGV4YW1pbmVkSHRtbEF0ck5hbWVzID09PSBudWxsKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBleGFtaW5lZEh0bWxBdHJOYW1lcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbVsncmVzdWx0J10gPT09ICdGYWlsZWQnKSAvL2ZhaWxlZFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0LnB1c2goeyAnYXJpYUF0dHInOiBhcmlhQXR0cnNbaV1bJ25hbWUnXSwgJ2h0bWxBdHRyJzogaXRlbVsnYXR0ciddIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuXG4gICAgLyogXG4gICAgICogZ2V0IGRlcHJlY2F0ZWQgQXJpYSByb2xlc1xuICAgICAqIHJldHVybjogYSBsaXN0IG9mIGRlcHJlY2F0ZWQgQXJpYSByb2xlc1xuICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXREZXByZWNhdGVkQXJpYVJvbGVzKGVsZW1lbnQ6IEVsZW1lbnQpIHtcbiAgICAgICAgaWYgKCFlbGVtZW50KSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCByb2xlcyA9IEFyaWFVdGlsLmdldFJvbGVzKGVsZW1lbnQsIGZhbHNlKTtcbiAgICAgICAgbGV0IHJldCA9IFtdO1xuICAgICAgICBpZiAocm9sZXMgJiYgcm9sZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgZ2xvYmFsRGVwcmVjYXRlZFJvbGVzID0gQVJJQURlZmluaXRpb25zLmdsb2JhbERlcHJlY2F0ZWRSb2xlcztcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm9sZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoZ2xvYmFsRGVwcmVjYXRlZFJvbGVzLmluY2x1ZGVzKHJvbGVzW2ldKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0LnB1c2gocm9sZXNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuXG4gICAgLyogXG4gICAgICogZ2V0IGRlcHJlY2F0ZWQgQXJpYSByb2xlLWF0dHJpYnV0ZXNcbiAgICAgKiByZXR1cm46IGEgbGlzdCBvZiBkZXByZWNhdGVkIEFyaWEgcm9sZS1hdHRyaWJ1dGVzIHBhcmlzXG4gICAgICogICAgICAgICBmb3IgZ2xvYmFsIHRoZSByb2xlIGlzIG1hcmtlZCBhcyAnYW55J1xuICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXREZXByZWNhdGVkQXJpYUF0dHJpYnV0ZXMoZWxlbWVudDogRWxlbWVudCkge1xuICAgICAgICBpZiAoIWVsZW1lbnQpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCBkb21BdHRyaWJ1dGVzID0gZWxlbWVudC5hdHRyaWJ1dGVzO1xuICAgICAgICBsZXQgYXJpYUF0dHJzID0gW107XG4gICAgICAgIGlmIChkb21BdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRvbUF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgYXR0ck5hbWUgPSBkb21BdHRyaWJ1dGVzW2ldLm5hbWU7XG4gICAgICAgICAgICAgICAgaWYgKGF0dHJOYW1lLnN1YnN0cmluZygwLCA1KSA9PT0gJ2FyaWEtJylcbiAgICAgICAgICAgICAgICAgICAgYXJpYUF0dHJzLnB1c2goYXR0ck5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChhcmlhQXR0cnMubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG5cbiAgICAgICAgbGV0IHJldCA9IFtdO1xuICAgICAgICBjb25zdCBnbG9iYWxEZXByZWNhdGVkQXR0cmlidXRlcyA9IEFSSUFEZWZpbml0aW9ucy5nbG9iYWxEZXByZWNhdGVkUHJvcGVydGllcztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmlhQXR0cnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChnbG9iYWxEZXByZWNhdGVkQXR0cmlidXRlcy5pbmNsdWRlcyhhcmlhQXR0cnNbaV0pKVxuICAgICAgICAgICAgICAgIHJldC5wdXNoKHsgXCJyb2xlXCI6IFwiYW55XCIsIFwiYXR0cmlidXRlXCI6IGFyaWFBdHRyc1tpXSB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByb2xlcyA9IEFyaWFVdGlsLmdldFJvbGVzKGVsZW1lbnQsIGZhbHNlKTtcbiAgICAgICAgaWYgKHJvbGVzICYmIHJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm9sZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCByb2xlV2l0aERlcHJlY2F0ZWRBdHRyaWJ1dGVzID0gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVzW2ldXTtcbiAgICAgICAgICAgICAgICBpZiAocm9sZVdpdGhEZXByZWNhdGVkQXR0cmlidXRlcykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXByZWNhdGVkQXR0cmlOYW1lcyA9IHJvbGVXaXRoRGVwcmVjYXRlZEF0dHJpYnV0ZXNbJ2RlcHJlY2F0ZWRQcm9wcyddO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGVwcmVjYXRlZEF0dHJpTmFtZXMgJiYgZGVwcmVjYXRlZEF0dHJpTmFtZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBhcmlhQXR0cnMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVwcmVjYXRlZEF0dHJpTmFtZXMuaW5jbHVkZXMoYXJpYUF0dHJzW2pdKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LnB1c2goeyBcInJvbGVcIjogcm9sZXNbaV0sIFwiYXR0cmlidXRlXCI6IGFyaWFBdHRyc1tqXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0O1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaXNOb2RlSW5HcmlkKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUobm9kZSwgXCJncmlkXCIpICE9IG51bGw7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4vQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4vQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgRE9NTWFwcGVyIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01NYXBwZXJcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5pbXBvcnQgeyBCb3VuZHMgfSBmcm9tIFwiLi4vYXBpL0lCb3VuZHNcIjtcblxudHlwZSBQc2V1ZG9DbGFzcyA9XG4gICAgfCBcIjpob3ZlclwiXG4gICAgfCBcIjphY3RpdmVcIlxuICAgIHwgXCI6Zm9jdXNcIlxuICAgIHwgXCI6Zm9jdXMtdmlzaWJsZVwiXG4gICAgfCBcIjpmb2N1cy13aXRoaW5cIjtcblxuZXhwb3J0IGNsYXNzIENTU1V0aWwge1xuICAgIHB1YmxpYyBzdGF0aWMgc2VsZWN0b3JNYXRjaGVzRWxlbShlbGVtZW50OiBFbGVtZW50LCBzZWxlY3Rvcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIC8vIEVhcmx5IHJldHVybiBmb3IgZW1wdHkgc2VsZWN0b3IgKGJlZm9yZSB0cnktY2F0Y2ggZm9yIHBlcmZvcm1hbmNlKVxuICAgICAgICBpZiAoIXNlbGVjdG9yIHx8IHNlbGVjdG9yLmxlbmd0aCA9PT0gMCB8fCBzZWxlY3Rvci50cmltKCkgPT09IFwiXCIpIHJldHVybiBmYWxzZTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gTW9kZXJuIHN0YW5kYXJkIG1ldGhvZFxuICAgICAgICAgICAgaWYgKHR5cGVvZiBlbGVtZW50Lm1hdGNoZXMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50Lm1hdGNoZXMoc2VsZWN0b3IpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBWZW5kb3ItcHJlZml4ZWQgZmFsbGJhY2tzIChvbGRlciBicm93c2VycylcbiAgICAgICAgICAgIGlmICh0eXBlb2YgKGVsZW1lbnQgYXMgYW55KS53ZWJraXRNYXRjaGVzU2VsZWN0b3IgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIHJldHVybiAoZWxlbWVudCBhcyBhbnkpLndlYmtpdE1hdGNoZXNTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgKGVsZW1lbnQgYXMgYW55KS5tc01hdGNoZXNTZWxlY3RvciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChlbGVtZW50IGFzIGFueSkubXNNYXRjaGVzU2VsZWN0b3Ioc2VsZWN0b3IpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBMZWdhY3kgbWV0aG9kIChkZXByZWNhdGVkIGJ1dCBrZXB0IGZvciBjb21wYXRpYmlsaXR5KVxuICAgICAgICAgICAgaWYgKHR5cGVvZiAoZWxlbWVudCBhcyBhbnkpLm1hdGNoZXNTZWxlY3RvciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChlbGVtZW50IGFzIGFueSkubWF0Y2hlc1NlbGVjdG9yKHNlbGVjdG9yKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRmFsbGJhY2s6IHVzZSBxdWVyeVNlbGVjdG9yQWxsIGFuZCBjaGVjayBpZiBlbGVtZW50IGlzIGluIHJlc3VsdHNcbiAgICAgICAgICAgIGNvbnN0IGRvYyA9IGVsZW1lbnQub3duZXJEb2N1bWVudCB8fCAoZWxlbWVudCBhcyBhbnkpLmRvY3VtZW50O1xuICAgICAgICAgICAgaWYgKCFkb2MpIHJldHVybiBmYWxzZTtcblxuICAgICAgICAgICAgY29uc3QgbWF0Y2hlcyA9IGRvYy5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTtcbiAgICAgICAgICAgIC8vIFVzZSBBcnJheS5mcm9tIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2Ugd2l0aCBtb2Rlcm4gZW5naW5lc1xuICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20obWF0Y2hlcykuaW5jbHVkZXMoZWxlbWVudCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgLy8gQmFkIHNlbGVjdG9yPyBEb2Vzbid0IG1hdGNoIHRoZW4uLi5cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHN0eWxlIGNvbXB1dGVkIGZvciB0aGlzIGVsZW1lbnRcbiAgICAgKiBAcGFyYW0gZWxlbVxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Q29tcHV0ZWRTdHlsZShlbGVtOiBIVE1MRWxlbWVudCwgcHNldWRvRWx0PzogUHNldWRvQ2xhc3MpIHtcbiAgICAgICAgaWYgKCFlbGVtKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgZG9jID0gZWxlbS5vd25lckRvY3VtZW50O1xuICAgICAgICBjb25zdCB3aW4gPSBkb2MuZGVmYXVsdFZpZXc7XG4gICAgICAgIHJldHVybiB3aW4uZ2V0Q29tcHV0ZWRTdHlsZShlbGVtLCBwc2V1ZG9FbHQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhcnNlIGFuZCBjYWNoZSBhbGwgc3R5bGVzaGVldCBydWxlcyBhdCB0aGUgZG9jdW1lbnQgbGV2ZWxcbiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHBhcnNlZCBydWxlIG9iamVjdHMgd2l0aCBzZWxlY3RvciBhbmQgc3R5bGUgaW5mb3JtYXRpb25cbiAgICAgKi9cbiAgICBwcml2YXRlIHN0YXRpYyBnZXRQYXJzZWRTdHlsZXNoZWV0UnVsZXMob3duZXJEb2M6IERvY3VtZW50KTogQXJyYXk8e1xuICAgICAgICBmdWxsUnVsZVNlbGVjdG9yOiBzdHJpbmc7XG4gICAgICAgIGhhc1BzZXVkb0NsYXNzOiBib29sZWFuO1xuICAgICAgICBzZWxNYWluOiBzdHJpbmc7XG4gICAgICAgIHNlbFBzZXVkbzogc3RyaW5nO1xuICAgICAgICBzdHlsZTogQ1NTU3R5bGVEZWNsYXJhdGlvbjtcbiAgICB9PiB7XG4gICAgICAgIC8vIENoZWNrIGlmIHdlIGFscmVhZHkgaGF2ZSBjYWNoZWQgcGFyc2VkIHJ1bGVzIGZvciB0aGlzIGRvY3VtZW50XG4gICAgICAgIGNvbnN0IGNhY2hlZFJ1bGVzID0gQ2FjaGVVdGlsLmdldENhY2hlKG93bmVyRG9jLCBcIlJQVFV0aWxfUGFyc2VkU3R5bGVzaGVldFJ1bGVzXCIsIG51bGwpO1xuICAgICAgICBpZiAoY2FjaGVkUnVsZXMpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRSdWxlcztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhcnNlZFJ1bGVzID0gW107XG5cbiAgICAgICAgLy8gSXRlcmF0ZSB0aHJvdWdoIGFsbCBvZiB0aGUgc3R5bGVzaGVldHMgYW5kIHJ1bGVzXG4gICAgICAgIGZvciAobGV0IHNzSW5kZXggPSAwOyBzc0luZGV4IDwgb3duZXJEb2Muc3R5bGVTaGVldHMubGVuZ3RoOyArK3NzSW5kZXgpIHtcbiAgICAgICAgICAgIGNvbnN0IHNoZWV0ID0gb3duZXJEb2Muc3R5bGVTaGVldHNbc3NJbmRleF0gYXMgQ1NTU3R5bGVTaGVldDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKHNoZWV0ICYmIHNoZWV0LmNzc1J1bGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHJJbmRleCA9IDA7IHJJbmRleCA8IHNoZWV0LmNzc1J1bGVzLmxlbmd0aDsgKytySW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJ1bGUgPSBzaGVldC5jc3NSdWxlc1tySW5kZXhdIGFzIENTU1N0eWxlUnVsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZ1bGxSdWxlU2VsZWN0b3IgPSBydWxlLnNlbGVjdG9yVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmdWxsUnVsZVNlbGVjdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHNldWRvTWF0Y2ggPSBmdWxsUnVsZVNlbGVjdG9yLm1hdGNoKC9eKC4qKSg6W2EtekEtWi1dKikkLyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFzUHNldWRvQ2xhc3MgPSAhIXBzZXVkb01hdGNoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbE1haW4gPSBoYXNQc2V1ZG9DbGFzcyA/IHBzZXVkb01hdGNoWzFdIDogZnVsbFJ1bGVTZWxlY3RvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxQc2V1ZG8gPSBoYXNQc2V1ZG9DbGFzcyA/IHBzZXVkb01hdGNoWzJdIDogXCJcIjtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlZFJ1bGVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxsUnVsZVNlbGVjdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNQc2V1ZG9DbGFzcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsTWFpbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsUHNldWRvLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZTogcnVsZS5zdHlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAhZXJyLnRvU3RyaW5nKCkuaW5jbHVkZXMoXCJDYW5ub3QgYWNjZXNzIHJ1bGVzXCIpICYmXG4gICAgICAgICAgICAgICAgICAgICFlcnIudG9TdHJpbmcoKS5pbmNsdWRlcyhcIlNlY3VyaXR5RXJyb3I6XCIpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYWNoZSB0aGUgcGFyc2VkIHJ1bGVzIGF0IHRoZSBkb2N1bWVudCBsZXZlbFxuICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUob3duZXJEb2MsIFwiUlBUVXRpbF9QYXJzZWRTdHlsZXNoZWV0UnVsZXNcIiwgcGFyc2VkUnVsZXMpO1xuICAgICAgICByZXR1cm4gcGFyc2VkUnVsZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJpdmF0ZSBoZWxwZXIgbWV0aG9kIHRvIGZpbGwgc3R5bGUgbWFwcyBmcm9tIGEgQ1NTU3R5bGVEZWNsYXJhdGlvblxuICAgICAqIEhhbmRsZXMgQ1NTIHByb3BlcnR5IHByaW9yaXRpZXMgYW5kIHRoZSBcImFsbFwiIHNob3J0aGFuZCBwcm9wZXJ0eVxuICAgICAqL1xuICAgIHByaXZhdGUgc3RhdGljIGZpbGxTdHlsZShtYXBzOiBhbnlbXSwgc3R5bGU6IENTU1N0eWxlRGVjbGFyYXRpb24pOiB2b2lkIHtcbiAgICAgICAgZm9yIChsZXQgc0luZGV4ID0gMDsgc0luZGV4IDwgc3R5bGUubGVuZ3RoOyArK3NJbmRleCkge1xuICAgICAgICAgICAgaWYgKHN0eWxlW3NJbmRleF0gPT09IFwiYWxsXCIgJiYgc3R5bGVbc3R5bGVbc0luZGV4XV0pIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IG1hcCBvZiBtYXBzKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIG1hcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG1hcFtrZXldO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSBzdHlsZVtzSW5kZXhdO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbWFwIG9mIG1hcHMpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHByaW9yaXR5ID0gc3R5bGUuZ2V0UHJvcGVydHlQcmlvcml0eShrZXkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoa2V5IGluIG1hcCAmJiBtYXBba2V5XS5lbmRzV2l0aChcIiFpbXBvcnRhbnRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmlvcml0eSA9PT0gXCJpbXBvcnRhbnRcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICFtYXBba2V5XS5zdGFydHNXaXRoKFwiaW5oZXJpdFwiKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICFtYXBba2V5XS5zdGFydHNXaXRoKFwidW5zZXRcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBba2V5XSA9IHN0eWxlW2tleV0gKyBcIiAhaW1wb3J0YW50XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcFtrZXldID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZVtrZXldICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHJpb3JpdHkgPT09IFwiaW1wb3J0YW50XCIgPyBcIiAhaW1wb3J0YW50XCIgOiBcIlwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcml2YXRlIGhlbHBlciBtZXRob2QgdGhhdCBjb25zb2xpZGF0ZXMgdGhlIGxvZ2ljIGZvciBnZXR0aW5nIGRlZmluZWQgc3R5bGVzXG4gICAgICogVXNlZCBieSBib3RoIGdldERlZmluZWRTdHlsZXMgYW5kIGdldERlZmluZWRTdHlsZXNNdWx0aXBsZVxuICAgICAqL1xuICAgIHByaXZhdGUgc3RhdGljIGdldERlZmluZWRTdHlsZXNJbnRlcm5hbChcbiAgICAgICAgZWxlbTogSFRNTEVsZW1lbnQsXG4gICAgICAgIHByb3BzOiBzdHJpbmdbXSB8IG51bGwsXG4gICAgICAgIHBzZXVkb0NsYXNzZXM6IHN0cmluZ1tdXG4gICAgKTogeyBbcHNldWRvQ2xhc3M6IHN0cmluZ106IGFueSB9IHtcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IHt9O1xuICAgICAgICBjb25zdCBkZWZpbmVkU3R5bGVzTWFwID0ge307XG4gICAgICAgIGNvbnN0IGRlZmluZWRTdHlsZVBzZXVkb01hcCA9IHt9O1xuXG4gICAgICAgIC8vIEluaXRpYWxpemUgcmVzdWx0IG9iamVjdHMgZm9yIGFsbCBwc2V1ZG8tY2xhc3Nlc1xuICAgICAgICBmb3IgKGNvbnN0IHBzZXVkb0NsYXNzIG9mIHBzZXVkb0NsYXNzZXMpIHtcbiAgICAgICAgICAgIGRlZmluZWRTdHlsZXNNYXBbcHNldWRvQ2xhc3NdID0ge307XG4gICAgICAgICAgICBkZWZpbmVkU3R5bGVQc2V1ZG9NYXBbcHNldWRvQ2xhc3NdID0ge307XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgcHJlLXBhcnNlZCBzdHlsZXNoZWV0IHJ1bGVzIGZyb20gY2FjaGVcbiAgICAgICAgY29uc3QgcGFyc2VkUnVsZXMgPSBDU1NVdGlsLmdldFBhcnNlZFN0eWxlc2hlZXRSdWxlcyhlbGVtLm93bmVyRG9jdW1lbnQpO1xuICAgICAgICBcbiAgICAgICAgLy8gQ2hlY2sgb25jZSBpZiB3ZSBuZWVkIHRvIGhhbmRsZSA6Zm9jdXMgcHNldWRvLWNsYXNzXG4gICAgICAgIGNvbnN0IGhhc0ZvY3VzUHNldWRvID0gcHNldWRvQ2xhc3Nlcy5pbmNsdWRlcyhcIjpmb2N1c1wiKTtcblxuICAgICAgICAvLyBQcm9jZXNzIGVhY2ggY2FjaGVkIHJ1bGVcbiAgICAgICAgZm9yIChjb25zdCBwYXJzZWRSdWxlIG9mIHBhcnNlZFJ1bGVzKSB7XG4gICAgICAgICAgICBpZiAocHJvcHMgIT09IG51bGwgJiYgIXByb3BzLnNvbWUocHJvcCA9PiAhIXBhcnNlZFJ1bGUuc3R5bGVbcHJvcF0pKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBzZWxQc2V1ZG8gPSBwYXJzZWRSdWxlLnNlbFBzZXVkbztcbiAgICAgICAgICAgIGNvbnN0IGhhc1BzZXVkb0NsYXNzID0gcGFyc2VkUnVsZS5oYXNQc2V1ZG9DbGFzcztcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gSGFuZGxlIDpmb2N1cy13aXRoaW4gcmVwbGFjZW1lbnQgb25jZSBwZXIgcnVsZSBpZiBuZWVkZWRcbiAgICAgICAgICAgIGxldCBzZWxNYWluID0gcGFyc2VkUnVsZS5zZWxNYWluO1xuICAgICAgICAgICAgaWYgKGhhc0ZvY3VzUHNldWRvICYmIHNlbFBzZXVkbyA9PT0gXCI6Zm9jdXNcIikge1xuICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgZWxlbWVudCBoYXMgZm9jdXMsIHJlbW92ZSBmb2N1cy13aXRoaW4gZnJvbSBwYXJlbnRzXG4gICAgICAgICAgICAgICAgc2VsTWFpbiA9IHNlbE1haW4ucmVwbGFjZShcbiAgICAgICAgICAgICAgICAgICAgLyhbID5dW14rfiA+XSspOmZvY3VzLXdpdGhpbi9nLFxuICAgICAgICAgICAgICAgICAgICBcIiQxXCJcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBDYWNoZSBzZWxlY3RvciBtYXRjaGluZyByZXN1bHQgKG9ubHkgb25jZSBwZXIgcnVsZSwgbm90IHBlciBwc2V1ZG8tY2xhc3MpXG4gICAgICAgICAgICBjb25zdCBzZWxlY3Rvck1hdGNoZXMgPSBDU1NVdGlsLnNlbGVjdG9yTWF0Y2hlc0VsZW0oZWxlbSwgc2VsTWFpbik7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIE9ubHkgcHJvY2VzcyBpZiBzZWxlY3RvciBtYXRjaGVzXG4gICAgICAgICAgICBpZiAoc2VsZWN0b3JNYXRjaGVzKSB7XG4gICAgICAgICAgICAgICAgLy8gUHJvY2VzcyBmb3IgZWFjaCBwc2V1ZG8tY2xhc3NcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHBzZXVkb0NsYXNzIG9mIHBzZXVkb0NsYXNzZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2FjaGUgbWFwIHJlZmVyZW5jZXMgdG8gYXZvaWQgcmVwZWF0ZWQgbG9va3Vwc1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHlsZU1hcCA9IGRlZmluZWRTdHlsZXNNYXBbcHNldWRvQ2xhc3NdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwc2V1ZG9NYXAgPSBkZWZpbmVkU3R5bGVQc2V1ZG9NYXBbcHNldWRvQ2xhc3NdO1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHN0eWxlcyBvZiBub24tcHNldWRvIHNlbGVjdG9yc1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc1BzZXVkb0NsYXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBDU1NVdGlsLmZpbGxTdHlsZShbc3R5bGVNYXAsIHBzZXVkb01hcF0sIHBhcnNlZFJ1bGUuc3R5bGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHN0eWxlcyBmb3IgbWF0Y2hpbmcgcHNldWRvLWNsYXNzXG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWxQc2V1ZG8gPT09IHBzZXVkb0NsYXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBDU1NVdGlsLmZpbGxTdHlsZShbcHNldWRvTWFwXSwgcGFyc2VkUnVsZS5zdHlsZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBIYW5kbGUgZWxlbWVudCBzdHlsZXMgYW5kIGJ1aWxkIHJlc3VsdHMgaW4gb25lIHBhc3NcbiAgICAgICAgZm9yIChjb25zdCBwc2V1ZG9DbGFzcyBvZiBwc2V1ZG9DbGFzc2VzKSB7XG4gICAgICAgICAgICBjb25zdCBzdHlsZU1hcCA9IGRlZmluZWRTdHlsZXNNYXBbcHNldWRvQ2xhc3NdO1xuICAgICAgICAgICAgY29uc3QgcHNldWRvTWFwID0gZGVmaW5lZFN0eWxlUHNldWRvTWFwW3BzZXVkb0NsYXNzXTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gQWRkIGVsZW1lbnQncyBpbmxpbmUgc3R5bGVzXG4gICAgICAgICAgICBDU1NVdGlsLmZpbGxTdHlsZShbc3R5bGVNYXAsIHBzZXVkb01hcF0sIGVsZW0uc3R5bGUpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBCdWlsZCByZXN1bHRzXG4gICAgICAgICAgICBpZiAocHNldWRvQ2xhc3MgPT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICByZXN1bHRzW3BzZXVkb0NsYXNzXSA9IHN0eWxlTWFwO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBGb3IgcHNldWRvLWNsYXNzZXMsIHJldHVybiBvbmx5IHN0eWxlcyB0aGF0IGRpZmZlciBmcm9tIGRlZmF1bHRcbiAgICAgICAgICAgICAgICBjb25zdCBkaWZmU3R5bGVzID0ge307XG4gICAgICAgICAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHBzZXVkb01hcCk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IGtleXNbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChwc2V1ZG9NYXBba2V5XSAhPT0gc3R5bGVNYXBba2V5XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlmZlN0eWxlc1trZXldID0gcHNldWRvTWFwW2tleV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzdWx0c1twc2V1ZG9DbGFzc10gPSBkaWZmU3R5bGVzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBzdHlsZSBkZWZpbmVkIGZvciB0aGlzIGVsZW1lbnQgZm9yIG11bHRpcGxlIHBzZXVkby1jbGFzc2VzIGluIGEgc2luZ2xlIHBhc3NcbiAgICAgKlxuICAgICAqIFRoaXMgaXMgbW9yZSBlZmZpY2llbnQgdGhhbiBjYWxsaW5nIGdldERlZmluZWRTdHlsZXMgbXVsdGlwbGUgdGltZXMgYXMgaXQgb25seVxuICAgICAqIGl0ZXJhdGVzIHRocm91Z2ggc3R5bGVzaGVldHMgb25jZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1cbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBwcm9wcyBQcm9wZXJ0aWVzIGZvciB3aGljaCB3ZSBhcmUgbG9va2luZyBmb3IgKGFsbG93cyB1cyB0byBza2lwIGVsZW0gbWF0Y2hpbmcgdW5uZWNlc3NhcmlseSlcbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBwc2V1ZG9DbGFzc2VzIC0gQXJyYXkgb2YgcHNldWRvLWNsYXNzZXMgdG8gcmV0cmlldmUuIFVzZSBcIlwiIGZvciBkZWZhdWx0IChubyBwc2V1ZG8tY2xhc3MpLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IE9iamVjdCBtYXBwaW5nIGVhY2ggcHNldWRvLWNsYXNzIHRvIGl0cyBkZWZpbmVkIHN0eWxlc1xuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0RGVmaW5lZFN0eWxlc011bHRpcGxlKGVsZW06IEhUTUxFbGVtZW50LCBwcm9wczogc3RyaW5nW10gfCBudWxsLCBwc2V1ZG9DbGFzc2VzOiBzdHJpbmdbXSkge1xuICAgICAgICBpZiAoIWVsZW0pIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCByZXN1bHRzID0ge307XG5cbiAgICAgICAgLy8gQ3JlYXRlIGNhY2hlIGtleSB0aGF0IGluY2x1ZGVzIHByb3BzIGZpbHRlclxuICAgICAgICAvLyBVc2UgXCJhbGxcIiBmb3IgbnVsbCBwcm9wcywgb3Igc29ydGVkIGNvbW1hLXNlcGFyYXRlZCBsaXN0IGZvciBzcGVjaWZpYyBwcm9wc1xuICAgICAgICBjb25zdCBwcm9wc0tleSA9IHByb3BzID09PSBudWxsID8gXCJhbGxcIiA6IHByb3BzLnNsaWNlKCkuc29ydCgpLmpvaW4oXCIsXCIpO1xuICAgICAgICBcbiAgICAgICAgLy8gQ2hlY2sgY2FjaGUgZmlyc3QgLSBzZWUgaWYgd2UgaGF2ZSBhbGwgcmVxdWVzdGVkIHBzZXVkby1jbGFzc2VzIGNhY2hlZFxuICAgICAgICBsZXQgYWxsQ2FjaGVkU3R5bGVzID0gQ2FjaGVVdGlsLmdldENhY2hlKGVsZW0sIFwiUlBUVXRpbF9EZWZpbmVkU3R5bGVzXCIsIG51bGwpO1xuICAgICAgICBpZiAoIWFsbENhY2hlZFN0eWxlcykge1xuICAgICAgICAgICAgYWxsQ2FjaGVkU3R5bGVzID0ge307XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIEdldCBvciBjcmVhdGUgdGhlIGNhY2hlIGJ1Y2tldCBmb3IgdGhpcyBwcm9wcyBmaWx0ZXJcbiAgICAgICAgbGV0IGNhY2hlZFN0eWxlcyA9IGFsbENhY2hlZFN0eWxlc1twcm9wc0tleV07XG4gICAgICAgIGxldCBtaXNzaW5nUHNldWRvQ2xhc3NlcyA9IFtdO1xuICAgICAgICBcbiAgICAgICAgaWYgKGNhY2hlZFN0eWxlcykge1xuICAgICAgICAgICAgLy8gQ2hlY2sgd2hpY2ggcHNldWRvLWNsYXNzZXMgYXJlIGFscmVhZHkgY2FjaGVkXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHBzZXVkb0NsYXNzIG9mIHBzZXVkb0NsYXNzZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoY2FjaGVkU3R5bGVzW3BzZXVkb0NsYXNzXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdHNbcHNldWRvQ2xhc3NdID0gY2FjaGVkU3R5bGVzW3BzZXVkb0NsYXNzXTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBtaXNzaW5nUHNldWRvQ2xhc3Nlcy5wdXNoKHBzZXVkb0NsYXNzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIElmIGFsbCBhcmUgY2FjaGVkLCByZXR1cm4gaW1tZWRpYXRlbHlcbiAgICAgICAgICAgIGlmIChtaXNzaW5nUHNldWRvQ2xhc3Nlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZFN0eWxlcyA9IHt9O1xuICAgICAgICAgICAgbWlzc2luZ1BzZXVkb0NsYXNzZXMgPSBwc2V1ZG9DbGFzc2VzO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT25seSBwcm9jZXNzIG1pc3NpbmcgcHNldWRvLWNsYXNzZXMgdXNpbmcgdGhlIGludGVybmFsIGhlbHBlclxuICAgICAgICBpZiAobWlzc2luZ1BzZXVkb0NsYXNzZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgbmV3UmVzdWx0cyA9IENTU1V0aWwuZ2V0RGVmaW5lZFN0eWxlc0ludGVybmFsKGVsZW0sIHByb3BzLCBtaXNzaW5nUHNldWRvQ2xhc3Nlcyk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIE1lcmdlIG5ldyByZXN1bHRzIHdpdGggY2FjaGVkIHJlc3VsdHNcbiAgICAgICAgICAgIGZvciAoY29uc3QgcHNldWRvQ2xhc3Mgb2YgbWlzc2luZ1BzZXVkb0NsYXNzZXMpIHtcbiAgICAgICAgICAgICAgICByZXN1bHRzW3BzZXVkb0NsYXNzXSA9IG5ld1Jlc3VsdHNbcHNldWRvQ2xhc3NdO1xuICAgICAgICAgICAgICAgIGNhY2hlZFN0eWxlc1twc2V1ZG9DbGFzc10gPSBuZXdSZXN1bHRzW3BzZXVkb0NsYXNzXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gVXBkYXRlIGNhY2hlIHdpdGggYWxsIHN0eWxlcyAoZXhpc3RpbmcgKyBuZXcpXG4gICAgICAgICAgICBhbGxDYWNoZWRTdHlsZXNbcHJvcHNLZXldID0gY2FjaGVkU3R5bGVzO1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUlBUVXRpbF9EZWZpbmVkU3R5bGVzXCIsIGFsbENhY2hlZFN0eWxlcyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBzdHlsZSBkZWZpbmVkIGZvciB0aGlzIGVsZW1lbnRcbiAgICAgKlxuICAgICAqIFRoaXMgZGlmZmVycyBmcm9tIHRoZSBjb21wdXRlZCBzdHlsZSBpbiB0aGF0IHRoZSBjb21wdXRlZCBzdHlsZSB3aWxsIHJldHVyblxuICAgICAqIHN0eWxlcyBkZWZpbmVkIGJ5IHRoZSB1c2VyIGFnZW50LiBUaGlzIHdpbGwgb25seSByZXR1cm4gc3R5bGVzIGRlZmluZWQgYnkgdGhlXG4gICAgICogYXBwbGljYXRpb25cbiAgICAgKiBpZiByb3RhdGlvbiB0cmFuc2Zvcm0gaXMgdXNlZCwgdGhlIGNvbXB1dGVkIHN0eWxlIHJldHVybnMgdGhlIHJlc29sdmVkIG1hdHJpeFxuICAgICAqICB3aGlsZSB0aGUgZGVmaW5lZCBzdHlsZSByZXR1cm4gdGhlIHRyYW5zZm9ybSBmdW5jdGlvbihzKVxuICAgICAqIGZvciBleGFtcGxlLCBmb3IgJ3RyYW5zZm9ybTogcm90YXRlKDIuNWRlZyk7JywgdGhlIGNvbXB1dGVkIHN0eWxlIHJldHVybnMgJ21hdHJpeCgtMC4wNDM2MTk0LCAwLjk5OTA0OCwgLTAuOTk5MDQ4LCAtMC4wNDM2MTk0LCAwLCAwKSdcbiAgICAgKiAgYW5kIHRoZSBkZWZpbmVkIHN0eWxlIHJldHVybnMgJ3JvdGF0ZSgyLjVkZWcpJ1xuICAgICAqXG4gICAgICogY2hhbmdlIHRoZSB0eXBlIG9mIHRoZSBwYXJhbWV0ZXIgcHNldWRvQ2xhc3MgZnJvbSBQc2V1ZG9DbGFzcyB0byBzdHJpbmcgdG8gaW5jbHVkZSBib3RoIHBzZXVkbyBjbGFzc2VzIChlLmcuLCA6Zm9jdXMsIDpjaGVja2VkKVxuICAgICAqIGFuZCBwc2V1ZG8gZWxlbWVudHMgKGUuZy4sIDo6YmVmb3JlLCA6OmFmdGVyKS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1cbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBwcm9wcyBQcm9wZXJ0aWVzIGZvciB3aGljaCB3ZSBhcmUgbG9va2luZyBmb3IgKGFsbG93cyB1cyB0byBza2lwIGVsZW0gbWF0Y2hpbmcgdW5uZWNlc3NhcmlseSlcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3BzZXVkb0NsYXNzXSBJZiBzcGVjaWZpZWQsIHdpbGwgcmV0dXJuIHZhbHVlcyB0aGF0IGFyZSBkaWZmZXJlbnRcbiAgICAgKiB0aGFuIHdoZW4gdGhlIHBzZXVkb0NsYXNzIGRvZXMgbm90IG1hdGNoLlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0RGVmaW5lZFN0eWxlcyhlbGVtOiBIVE1MRWxlbWVudCwgcHJvcHM6IHN0cmluZ1tdLCBwc2V1ZG9DbGFzcz86IHN0cmluZykge1xuICAgICAgICBpZiAoIWVsZW0pIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIENyZWF0ZSBjYWNoZSBrZXkgdGhhdCBpbmNsdWRlcyBwcm9wcyBmaWx0ZXJcbiAgICAgICAgLy8gVXNlIFwiYWxsXCIgZm9yIG51bGwgcHJvcHMsIG9yIHNvcnRlZCBjb21tYS1zZXBhcmF0ZWQgbGlzdCBmb3Igc3BlY2lmaWMgcHJvcHNcbiAgICAgICAgY29uc3QgcHJvcHNLZXkgPSBwcm9wcyA9PT0gbnVsbCA/IFwiYWxsXCIgOiBwcm9wcy5zbGljZSgpLnNvcnQoKS5qb2luKFwiLFwiKTtcbiAgICAgICAgY29uc3QgcHNldWRvS2V5ID0gcHNldWRvQ2xhc3MgfHwgXCJcIjtcbiAgICAgICAgXG4gICAgICAgIC8vIENoZWNrIGNhY2hlIGZpcnN0IC0gdXNlIHNoYXJlZCBjYWNoZSBzdHJ1Y3R1cmUgd2l0aCBnZXREZWZpbmVkU3R5bGVzTXVsdGlwbGVcbiAgICAgICAgbGV0IGFsbENhY2hlZFN0eWxlcyA9IENhY2hlVXRpbC5nZXRDYWNoZShlbGVtLCBcIlJQVFV0aWxfRGVmaW5lZFN0eWxlc1wiLCBudWxsKTtcbiAgICAgICAgaWYgKCFhbGxDYWNoZWRTdHlsZXMpIHtcbiAgICAgICAgICAgIGFsbENhY2hlZFN0eWxlcyA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBHZXQgb3IgY3JlYXRlIHRoZSBjYWNoZSBidWNrZXQgZm9yIHRoaXMgcHJvcHMgZmlsdGVyXG4gICAgICAgIGxldCBjYWNoZWRTdHlsZXMgPSBhbGxDYWNoZWRTdHlsZXNbcHJvcHNLZXldO1xuICAgICAgICBpZiAoIWNhY2hlZFN0eWxlcykge1xuICAgICAgICAgICAgY2FjaGVkU3R5bGVzID0ge307XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmIChjYWNoZWRTdHlsZXNbcHNldWRvS2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU3R5bGVzW3BzZXVkb0tleV07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVc2UgdGhlIGludGVybmFsIGhlbHBlciBtZXRob2Qgd2l0aCBhIHNpbmdsZSBwc2V1ZG8tY2xhc3NcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IENTU1V0aWwuZ2V0RGVmaW5lZFN0eWxlc0ludGVybmFsKGVsZW0sIHByb3BzLCBbcHNldWRvS2V5XSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc3VsdHNbcHNldWRvS2V5XTtcbiAgICAgICAgXG4gICAgICAgIC8vIENhY2hlIHRoZSByZXN1bHRcbiAgICAgICAgY2FjaGVkU3R5bGVzW3BzZXVkb0tleV0gPSByZXN1bHQ7XG4gICAgICAgIGFsbENhY2hlZFN0eWxlc1twcm9wc0tleV0gPSBjYWNoZWRTdHlsZXM7XG4gICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlJQVFV0aWxfRGVmaW5lZFN0eWxlc1wiLCBhbGxDYWNoZWRTdHlsZXMpO1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBtZWRpYSBxdWVyeSBkZWZpbmVkIGZvciB0aGUgZG9jdW1lbnRcbiAgICAgKiBHZXQgbWVkaWEgb3JpZW50YXRpb24gdHJhbnNmb3JtcyBmcm9tIHN0eWxlc2hlZXRzIHdpdGggY2FjaGluZ1xuICAgICAqIFJldHVybnMgdHJhbnNmb3JtL3JvdGF0ZSBwcm9wZXJ0aWVzIGZvciBlbGVtZW50cyB3aXRoaW4gbWVkaWEgcXVlcmllc1xuICAgICAqXG4gICAgICogQHBhcmFtIHtEb2N1bWVudH0gZG9jXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRNZWRpYU9yaWVudGF0aW9uVHJhbnNmb3JtKGRvYzogRG9jdW1lbnQpIHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgd2UgYWxyZWFkeSBoYXZlIGNhY2hlZCBtZWRpYSBvcmllbnRhdGlvbiB0cmFuc2Zvcm1zIGZvciB0aGlzIGRvY3VtZW50XG4gICAgICAgIGNvbnN0IGNhY2hlZFRyYW5zZm9ybXMgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUoZG9jLCBcIlJQVFV0aWxfTWVkaWFPcmllbnRhdGlvblRyYW5zZm9ybXNcIiwgbnVsbCk7XG4gICAgICAgIGlmIChjYWNoZWRUcmFuc2Zvcm1zKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkVHJhbnNmb3JtcztcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBvcmllbnRhdGlvblRyYW5zZm9ybXMgPSB7fVxuXG4gICAgICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCBhbGwgb2YgdGhlIHN0eWxlc2hlZXRzIGFuZCBydWxlc1xuICAgICAgICBmb3IgKGxldCBzc0luZGV4ID0gMDsgc3NJbmRleCA8IGRvYy5zdHlsZVNoZWV0cy5sZW5ndGg7ICsrc3NJbmRleCkge1xuICAgICAgICAgICAgY29uc3Qgc2hlZXQgPSBkb2Muc3R5bGVTaGVldHNbc3NJbmRleF0gYXMgQ1NTU3R5bGVTaGVldDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKHNoZWV0ICYmIHNoZWV0LmNzc1J1bGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHJJbmRleCA9IDA7IHJJbmRleCA8IHNoZWV0LmNzc1J1bGVzLmxlbmd0aDsgKytySW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoZWV0UnVsZSA9IHNoZWV0LmNzc1J1bGVzW3JJbmRleF07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoNCAvKiBDU1NSdWxlLk1FRElBX1JVTEUgKi8gPT09IHNoZWV0UnVsZS5NRURJQV9SVUxFKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcnVsZSA9IHNoZWV0UnVsZSBhcyBDU1NNZWRpYVJ1bGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGUgJiYgcnVsZS5tZWRpYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZWRpYUxpc3QgPSBydWxlLm1lZGlhO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1lZGlhTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtZWRpYUxpc3QuaXRlbShpKSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZWRpYUtleSA9IG1lZGlhTGlzdC5pdGVtKGkpLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZWxlbV90cmFuc2Zvcm1zID0gb3JpZW50YXRpb25UcmFuc2Zvcm1zW21lZGlhS2V5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZWxlbV90cmFuc2Zvcm1zKSBlbGVtX3RyYW5zZm9ybXMgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHlsZVJ1bGVzID0gcnVsZS5jc3NSdWxlcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgc3R5bGVSdWxlcy5sZW5ndGg7ICsraikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgxIC8qIENTU1J1bGUuU1RZTEVfUlVMRSAqLyA9PT0gc3R5bGVSdWxlc1tqXS5TVFlMRV9SVUxFKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0eWxlUnVsZSA9IHN0eWxlUnVsZXNbal0gYXMgQ1NTU3R5bGVSdWxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RvciA9IHN0eWxlUnVsZS5zZWxlY3RvclRleHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRyYW5zZm9ybXMgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0eWxlcyA9IHN0eWxlUnVsZS5zdHlsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHMgPSAwOyBzIDwgc3R5bGVzLmxlbmd0aDsgKytzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gc3R5bGVzW3NdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleUxvd2VyID0ga2V5LnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtleUxvd2VyID09PSBcInRyYW5zZm9ybVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXkgPT09IFwiYWxsXCIgJiYgc3R5bGVzW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybXMgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3Jtc1trZXldID0gc3R5bGVzW2tleV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleUxvd2VyID09PSBcInJvdGF0ZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybXNba2V5XSA9IHN0eWxlc1trZXldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyh0cmFuc2Zvcm1zKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbV90cmFuc2Zvcm1zW3NlbGVjdG9yXSA9IHRyYW5zZm9ybXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoZWxlbV90cmFuc2Zvcm1zKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZW50YXRpb25UcmFuc2Zvcm1zW21lZGlhS2V5XSA9IGVsZW1fdHJhbnNmb3JtcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgIWVyci50b1N0cmluZygpLmluY2x1ZGVzKFwiQ2Fubm90IGFjY2VzcyBydWxlc1wiKSAmJlxuICAgICAgICAgICAgICAgICAgICAhZXJyLnRvU3RyaW5nKCkuaW5jbHVkZXMoXCJTZWN1cml0eUVycm9yOlwiKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBDYWNoZSB0aGUgbWVkaWEgb3JpZW50YXRpb24gdHJhbnNmb3JtcyBhdCB0aGUgZG9jdW1lbnQgbGV2ZWxcbiAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGRvYywgXCJSUFRVdGlsX01lZGlhT3JpZW50YXRpb25UcmFuc2Zvcm1zXCIsIG9yaWVudGF0aW9uVHJhbnNmb3Jtcyk7XG4gICAgICAgIHJldHVybiBvcmllbnRhdGlvblRyYW5zZm9ybXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogY29udmVydCBnaXZlbiByb3RhdGlvbiB0cmFuc2Zvcm0gZnVuY3Rpb25zIHRvIHRoZSBkZWdyZWUgdHJhbnNmb3JtZWQuXG4gICAgICogSWYgbXVsdGlwbGUgZnVuY3Rpb25zIGFyZSBnaXZlbiwgdGhlbiB0aGUgZnVuY3Rpb25zIGFyZSBhcHBsaWVkIGxpbmVhcmx5IGluIHRoZSBvcmRlci5cbiAgICAgKiAgIHJvdGF0aW9uX3RyYW5zZm9ybSBmdW5jdGlvbiBleGFtcGxlOiAgcm90YXRlKDQ1ZGVnKSwgcm90YXRlKDJ0dXJuKSwgcm90YXRlKDJyYWQpLCByb3RhdGUzZCgxLCAxLCAxLCA0NWRlZyksXG4gICAgICogICAgICAgIHJvdGF0ZSgycmFkKSByb3RhdGUzZCgxLCAxLCAxLCA0NWRlZylcbiAgICAgKiBAcGFyYW0gcm90YXRpb25fdHJhbnNmb3JtXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRSb3RhdGlvbkRlZ3JlZShyb3RhdGlvbl90cmFuc2Zvcm0pIHtcbiAgICAgICAgbGV0IGRlZ3JlZSA9IDA7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoIXJvdGF0aW9uX3RyYW5zZm9ybSkgcmV0dXJuIGRlZ3JlZTtcbiAgICAgICAgICAgIC8vIG5vcm1hbGl6ZSB0aGUgcm90YXRpb25fdHJhbnNmb3JtXG4gICAgICAgICAgICByb3RhdGlvbl90cmFuc2Zvcm0gPSByb3RhdGlvbl90cmFuc2Zvcm0ucmVwbGFjZUFsbChcIiwgXCIsIFwiLFwiKTtcbiAgICAgICAgICAgIGNvbnN0IHRyYW5zZm9ybV9mdW5jdGlvbnMgPSByb3RhdGlvbl90cmFuc2Zvcm0uc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0cmFuc2Zvcm1fZnVuY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdHJhbnNmb3JtX2Z1bmN0aW9uID0gdHJhbnNmb3JtX2Z1bmN0aW9uc1tpXS50cmltKCk7XG4gICAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybV9mdW5jdGlvbiA9PT0gXCJcIikgY29udGludWU7XG4gICAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybV9mdW5jdGlvbi5zdGFydHNXaXRoKFwicm90YXRlM2RcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXhhbXBsZTogcm90YXRlM2QoMSwgMSwgMSwgNDVkZWcpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsZWZ0ID0gdHJhbnNmb3JtX2Z1bmN0aW9uLmluZGV4T2YoXCIoXCIpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByaWdodCA9IHRyYW5zZm9ybV9mdW5jdGlvbi5pbmRleE9mKFwiKVwiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxlZnQgIT09IC0xICYmIHJpZ2h0ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1hdHJpeCA9IHRyYW5zZm9ybV9mdW5jdGlvbi5zdWJzdHJpbmcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCArIDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHRcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hdHJpeCkgdmFsdWVzID0gbWF0cml4LnNwbGl0KFwiLFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZXMgJiYgdmFsdWVzLmxlbmd0aCA9PT0gNCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByb3RhdGlvbiA9IHZhbHVlc1szXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJvdGF0aW9uKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3RhdGlvbiA9IHJvdGF0aW9uLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocm90YXRpb24uZW5kc1dpdGgoXCJ0dXJuXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBudW0gPSByb3RhdGlvbi5zdWJzdHJpbmcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRpb24ubGVuZ3RoIC0gNFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW0gPSBwYXJzZUZsb2F0KG51bSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNOYU4obnVtKSkgZGVncmVlID0gbnVtICogMzYwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocm90YXRpb24uZW5kc1dpdGgoXCJyYWRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG51bSA9IHJvdGF0aW9uLnN1YnN0cmluZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3RhdGlvbi5sZW5ndGggLSAzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bSA9IHBhcnNlRmxvYXQobnVtKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc05hTihudW0pKSBkZWdyZWUgPSAobnVtICogMTgwKSAvIE1hdGguUEk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyb3RhdGlvbi5lbmRzV2l0aChcImRlZ1wiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbnVtID0gcm90YXRpb24uc3Vic3RyaW5nKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0aW9uLmxlbmd0aCAtIDNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtID0gcGFyc2VGbG9hdChudW0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTmFOKG51bSkpIGRlZ3JlZSArPSBudW07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtX2Z1bmN0aW9uLnN0YXJ0c1dpdGgoXCJyb3RhdGVcIikgfHxcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtX2Z1bmN0aW9uLnN0YXJ0c1dpdGgoXCJyb3RhdGVaXCIpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGV4YW1wbGU6IHJvdGF0ZSg0NWRlZyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxlZnQgPSB0cmFuc2Zvcm1fZnVuY3Rpb24uaW5kZXhPZihcIihcIik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJpZ2h0ID0gdHJhbnNmb3JtX2Z1bmN0aW9uLmluZGV4T2YoXCIpXCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobGVmdCAhPT0gLTEgJiYgcmlnaHQgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcm90YXRpb24gPSB0cmFuc2Zvcm1fZnVuY3Rpb24uc3Vic3RyaW5nKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgKyAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyb3RhdGlvbikgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByb3RhdGlvbiA9IHJvdGF0aW9uLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3RhdGlvbi5lbmRzV2l0aChcInR1cm5cIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbnVtID0gcm90YXRpb24uc3Vic3RyaW5nKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3RhdGlvbi5sZW5ndGggLSA0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW0gPSBwYXJzZUZsb2F0KG51bSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc05hTihudW0pKSBkZWdyZWUgPSBudW0gKiAzNjA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJvdGF0aW9uLmVuZHNXaXRoKFwicmFkXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG51bSA9IHJvdGF0aW9uLnN1YnN0cmluZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRpb24ubGVuZ3RoIC0gM1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtID0gcGFyc2VGbG9hdChudW0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNOYU4obnVtKSkgZGVncmVlID0gKG51bSAqIDE4MCkgLyBNYXRoLlBJO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyb3RhdGlvbi5lbmRzV2l0aChcImRlZ1wiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBudW0gPSByb3RhdGlvbi5zdWJzdHJpbmcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0aW9uLmxlbmd0aCAtIDNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bSA9IHBhcnNlRmxvYXQobnVtKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTmFOKG51bSkpIGRlZ3JlZSArPSBudW07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRyYW5zZm9ybV9mdW5jdGlvbi5zdGFydHNXaXRoKFwibWF0cml4M2RcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY2FsY3VsYXRlIHRoZSB0aHJlZSBFdWxlciBhbmdsZXNcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGVmdCA9IHRyYW5zZm9ybV9mdW5jdGlvbi5pbmRleE9mKFwiKFwiKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmlnaHQgPSB0cmFuc2Zvcm1fZnVuY3Rpb24uaW5kZXhPZihcIilcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsZWZ0ICE9PSAtMSAmJiByaWdodCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtYXRyaXggPSB0cmFuc2Zvcm1fZnVuY3Rpb24uc3Vic3RyaW5nKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgKyAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlcyA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF0cml4KSB2YWx1ZXMgPSBtYXRyaXguc3BsaXQoXCIsXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlcyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHpfYW5nbGUgPSBNYXRoLmF0YW4yKHZhbHVlc1s0XSwgdmFsdWVzWzVdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWdyZWUgKz0gTWF0aC5yb3VuZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5yb3VuZCgoel9hbmdsZSAqIDE4MCkgLyBNYXRoLlBJKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRyYW5zZm9ybV9mdW5jdGlvbi5zdGFydHNXaXRoKFwibWF0cml4XCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgdGhyZWUgRXVsZXIgYW5nbGVzXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxlZnQgPSB0cmFuc2Zvcm1fZnVuY3Rpb24uaW5kZXhPZihcIihcIik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJpZ2h0ID0gdHJhbnNmb3JtX2Z1bmN0aW9uLmluZGV4T2YoXCIpXCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobGVmdCAhPT0gLTEgJiYgcmlnaHQgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbWF0cml4ID0gdHJhbnNmb3JtX2Z1bmN0aW9uLnN1YnN0cmluZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0ICsgMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZXMgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hdHJpeCkgdmFsdWVzID0gbWF0cml4LnNwbGl0KFwiLFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZXMgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB6X2FuZ2xlID0gTWF0aC5hdGFuMih2YWx1ZXNbMV0sIHZhbHVlc1swXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVncmVlICs9IE1hdGgucm91bmQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGgucm91bmQoKHpfYW5nbGUgKiAxODApIC8gTWF0aC5QSSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB3aGlsZSAoZGVncmVlID49IDM2MCkgZGVncmVlIC09IDM2MDtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkNhbm5vdCByZXRyaWV2ZSByb3RhdGlvbiBkZWdyZWU6IFwiICsgZXJyKTtcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVncmVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnQgQ1NTIHN0eWxlIHN0cmluZyB2YWx1ZXMgdG8gcGl4ZWxzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIHN0eWxlIHZhbHVlIGluIHN0cmluZywgc3VjaCBhcyAzcmVtLCAyMzBweCBldGMuXG4gICAgICogQHBhcmFtIHRhcmdldCBlbGVtZW50LlxuICAgICAqIEByZXR1cm4gdmFsdWUgaW4gcGl4ZWxzXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRQaXhlbHNGcm9tU3R5bGUodmFsdWUsIGVsZW0pIHtcbiAgICAgICAgaWYgKCF2YWx1ZSkgcmV0dXJuIDA7XG4gICAgICAgIGNvbnN0IHJlZ2V4ID0gLygtP1tcXGQuXSspKFthLXolXSopLztcbiAgICAgICAgbGV0IHBhcnNlZCA9IHZhbHVlLnRyaW0oKS5tYXRjaChyZWdleCk7XG4gICAgICAgIGlmIChwYXJzZWQgPT09IG51bGwpIHJldHVybiAwO1xuICAgICAgICBpZiAocGFyc2VkWzJdID09PSBcIlwiIHx8IHBhcnNlZFsxXSA9PT0gMClcbiAgICAgICAgICAgIC8vbm8gemVybyB2YWx1ZSB3aXRob3V0IHVuaXQgd2hpY2ggaXMgY29uc2lkZXJlZCBhcyBlcnJvciwgc28gaW1wbGljYWJsZVxuICAgICAgICAgICAgcmV0dXJuIDA7XG5cbiAgICAgICAgY29uc3QgcGl4ZWxzID0gQ1NTVXRpbC5jb252ZXJ0VmFsdWUyUGl4ZWxzKHBhcnNlZFsyXSwgcGFyc2VkWzFdLCBlbGVtKTtcbiAgICAgICAgcmV0dXJuIHBpeGVscyA9PT0gbnVsbCA/IHBpeGVscyA6IHBhcnNlRmxvYXQocGl4ZWxzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0IGFic29sdXRlIENTUyBudW1lcmljYWwgdmFsdWVzIHRvIHBpeGVscy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB1bml0VmFsdWUgaW4gc3RyaW5nXG4gICAgICogQHBhcmFtIHRhcmdldCBlbGVtZW50LlxuICAgICAqIEByZXR1cm4gdmFsdWUgaW4gcGl4ZWxzXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBjb252ZXJ0VmFsdWUyUGl4ZWxzKHVuaXQsIHVuaXRWYWx1ZSwgZWxlbSkge1xuICAgICAgICBpZiAodW5pdFZhbHVlID09PSAwKSByZXR1cm4gMDtcbiAgICAgICAgaWYgKCF1bml0KSB1bml0ID0gXCJweFwiO1xuICAgICAgICBjb25zdCBzdXBwb3J0ZWRVbml0cyA9IHtcbiAgICAgICAgICAgIC8vIGFic29sdXRlIHVuaXRcbiAgICAgICAgICAgIHB4OiAodmFsdWUpID0+IHZhbHVlLFxuICAgICAgICAgICAgY206ICh2YWx1ZSkgPT4gdmFsdWUgKiAzNy44LFxuICAgICAgICAgICAgbW06ICh2YWx1ZSkgPT4gdmFsdWUgKiAzLjc4LFxuICAgICAgICAgICAgcTogKHZhbHVlKSA9PiB2YWx1ZSAqIDAuOTUsXG4gICAgICAgICAgICBpbjogKHZhbHVlKSA9PiB2YWx1ZSAqIDk2LFxuICAgICAgICAgICAgcGM6ICh2YWx1ZSkgPT4gdmFsdWUgKiAxNixcbiAgICAgICAgICAgIHB0OiAodmFsdWUpID0+IHZhbHVlICogMS4zMyxcblxuICAgICAgICAgICAgLy8gcmVsYXRpdmUgdW5pdFxuICAgICAgICAgICAgcmVtOiAodmFsdWUpID0+XG4gICAgICAgICAgICAgICAgdmFsdWUgKlxuICAgICAgICAgICAgICAgIHBhcnNlRmxvYXQoXG4gICAgICAgICAgICAgICAgICAgIGdldENvbXB1dGVkU3R5bGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XG4gICAgICAgICAgICAgICAgICAgICkuZ2V0UHJvcGVydHlWYWx1ZShcImZvbnQtc2l6ZVwiKVxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICBlbTogKHZhbHVlKSA9PlxuICAgICAgICAgICAgICAgIHZhbHVlICpcbiAgICAgICAgICAgICAgICBwYXJzZUZsb2F0KFxuICAgICAgICAgICAgICAgICAgICBnZXRDb21wdXRlZFN0eWxlKGVsZW0pLmdldFByb3BlcnR5VmFsdWUoXCJmb250LXNpemVcIilcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgdnc6ICh2YWx1ZSkgPT5cbiAgICAgICAgICAgICAgICAodmFsdWUgLyAxMDApICogZWxlbS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LmlubmVyV2lkdGgsXG4gICAgICAgICAgICB2aDogKHZhbHVlKSA9PlxuICAgICAgICAgICAgICAgICh2YWx1ZSAvIDEwMCkgKiBlbGVtLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuaW5uZXJIZWlnaHQsXG4gICAgICAgICAgICBcIiVcIjogKHZhbHVlKSA9PlxuICAgICAgICAgICAgICAgICh2YWx1ZSAvIDEwMCkgKlxuICAgICAgICAgICAgICAgIHBhcnNlRmxvYXQoXG4gICAgICAgICAgICAgICAgICAgIGdldENvbXB1dGVkU3R5bGUoZWxlbSkuZ2V0UHJvcGVydHlWYWx1ZShcImZvbnQtc2l6ZVwiKVxuICAgICAgICAgICAgICAgICksXG4gICAgICAgIH07XG4gICAgICAgIFxuICAgICAgICBpZiAodW5pdCBpbiBzdXBwb3J0ZWRVbml0cykgcmV0dXJuIHN1cHBvcnRlZFVuaXRzW3VuaXRdKHVuaXRWYWx1ZSk7XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8qXG4gICAgICogUmV0dXJucyBpZiB0aGUgZm9udCBmb3IgdmlzaWJsZSB0ZXh0IG9mIHRoZSBlbGVtZW50IGlzIGRlZmluZWQgYnkgbWF0ZXJpYWwgaWNvbnNcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzTWF0ZXJpYWxJY29uRm9udChlbGVtOiBIVE1MRWxlbWVudCkge1xuICAgICAgICAvLyBUT0RPOiBjaGVjayB0aGUgZXhpc3RlbmNlIG1hdGVyaWFsIGljb25zIHVzaW5nIGZldGNoIGluIG5vZGUgMTgrXG4gICAgICAgIC8vIGZvciBub3cgKG5vZGUgMTYpIGp1c3QgZGVydGVybWluZSBpZiB0aGUgc3R5bGVzaGVldCBmb3IgdGhlICdNYXRlcmlhbCBJY29ucycgZXhpc3RzIHN0YXRpY2FsbHkuIG5vdGUgdGhhdCB0aGUgbG9hZGluZyBvZiB0aGUgZm9udCBzdHlsZXNoZWV0IG9jY3VycyBhdCBydW4gdGltZS5cbiAgICAgICAgLy9saXN0IG9mIGtub3duIG1hdGVyaWFsIGljb25zIGFuZCBzdHlsZXNoZWV0IGxpbmtcbiAgICAgICAgY29uc3Qga25vd25faWNvbnMgPSB7XG4gICAgICAgICAgICBcIk1hdGVyaWFsIEljb25zXCI6XG4gICAgICAgICAgICAgICAgXCJodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2ljb24/ZmFtaWx5PU1hdGVyaWFsK0ljb25zXCIsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGtub3duX2Nzc19jbGFzc2VzID0ge1xuICAgICAgICAgICAgXCJtYXRlcmlhbC1pY29uc1wiOlxuICAgICAgICAgICAgICAgIFwiaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9pY29uP2ZhbWlseT1NYXRlcmlhbCtJY29uc1wiLFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIG1hdGVyaWFsIGljb24gZm9udCBjYW4gYmUgZGVmaW5lZCBlaXRoZXIgYnkgZm9udC1mYW1pbHk6ICdNYXRlcmlhbCBJY29ucycgb3IgYnkgY2xhc3M9XCJtYXRlcmlhbC1pY29uc1wiXG4gICAgICAgIGxldCBzdHlsZXMgPSBDU1NVdGlsLmdldERlZmluZWRTdHlsZXMoZWxlbSwgW1wiZm9udC1mYW1pbHlcIl0pO1xuICAgICAgICBsZXQgZm9udEZhbWlseSA9IHN0eWxlc1tcImZvbnQtZmFtaWx5XCJdO1xuXG4gICAgICAgIGxldCBmb3VuZCA9IGZhbHNlO1xuICAgICAgICAvLyBmb250LWZhbWlseSBzcGVjaWZpZXMgYSBwcmlvcml0aXplZCBsaXN0IG9mIG9uZSBvciBtb3JlIGZvbnQgZmFtaWx5IG5hbWVzXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGZvbnRGYW1pbHkgJiZcbiAgICAgICAgICAgIGZvbnRGYW1pbHkuc3BsaXQoXCIsXCIpWzBdLnJlcGxhY2UoL1snXCJdKy9nLCBcIlwiKS50cmltKCkgaW4ga25vd25faWNvbnNcbiAgICAgICAgKVxuICAgICAgICAgICAgZm91bmQgPSB0cnVlO1xuXG4gICAgICAgIGlmICghZm91bmQpIHtcbiAgICAgICAgICAgIGxldCBsaXN0ID0gZWxlbS5jbGFzc0xpc3Q7XG4gICAgICAgICAgICBmb3IgKGxldCBjc3NfY2xhc3MgaW4ga25vd25fY3NzX2NsYXNzZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAobGlzdC5jb250YWlucyhjc3NfY2xhc3MpKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghZm91bmQpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBsZXQgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgIC8vIGNoZWNrIGlmIHRoZSBzdHlsZXNoZWV0IGZvciB0aGUgJ01hdGVyaWFsIEljb25zJyBleGlzdHMgc3RhdGljYWxseVxuICAgICAgICBsZXQgc2hlZXRzID0gZWxlbS5vd25lckRvY3VtZW50LnN0eWxlU2hlZXRzO1xuICAgICAgICBmb3IgKGxldCBzID0gMDsgcyA8IHNoZWV0cy5sZW5ndGg7IHMrKykge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHNoZWV0cyAmJlxuICAgICAgICAgICAgICAgIHNoZWV0cy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICAgICAgT2JqZWN0LnZhbHVlcyhrbm93bl9pY29ucykuaW5kZXhPZihzaGVldHNbc10uaHJlZikgPiAtMVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFzc2VkO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0V2VpZ2h0TnVtYmVyKHN0eWxlVmFsKSB7XG4gICAgICAgIGxldCBtYXAgPSB7XG4gICAgICAgICAgICBsaWdodDogMTAwLFxuICAgICAgICAgICAgYm9sZDogNzAwLFxuICAgICAgICB9O1xuICAgICAgICBsZXQgcmV0VmFsID0gcGFyc2VJbnQoc3R5bGVWYWwpO1xuICAgICAgICBpZiAocmV0VmFsKSByZXR1cm4gcmV0VmFsO1xuICAgICAgICBpZiAoc3R5bGVWYWwgaW4gbWFwKSByZXR1cm4gbWFwW3N0eWxlVmFsXTtcbiAgICAgICAgcmV0dXJuIDQwMDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldEZvbnRJblBpeGVscyhzdHlsZVZhbCwgZWxlbSkge1xuICAgICAgICBsZXQgbWFwID0ge1xuICAgICAgICAgICAgXCJ4eC1zbWFsbFwiOiAxNixcbiAgICAgICAgICAgIFwieC1zbWFsbFwiOiAxMCxcbiAgICAgICAgICAgIHNtYWxsOiAxMyxcbiAgICAgICAgICAgIG1lZGl1bTogMTYsXG4gICAgICAgICAgICBsYXJnZTogMTgsXG4gICAgICAgICAgICBcIngtbGFyZ2VcIjogMjQsXG4gICAgICAgICAgICBcInh4LWxhcmdlXCI6IDMyLFxuICAgICAgICB9O1xuICAgICAgICBsZXQgdmFsdWUgPSBwYXJzZUZsb2F0KHN0eWxlVmFsKTtcbiAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIG1hcFtzdHlsZVZhbF07XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHVuaXRzID0gc3R5bGVWYWwuc3Vic3RyaW5nKChcIlwiICsgdmFsdWUpLmxlbmd0aCk7XG4gICAgICAgIC8qKlxuICAgICAgICBpZiAodW5pdHMgPT09IFwiXCIgfHwgdW5pdHMgPT09IFwicHhcIikgcmV0dXJuIHZhbHVlO1xuICAgICAgICBpZiAodW5pdHMgPT09IFwiZW1cIikgcmV0dXJuIHZhbHVlICogMTY7XG4gICAgICAgIGlmICh1bml0cyA9PT0gXCIlXCIpIHJldHVybiB2YWx1ZSAvIDEwMCAqIDE2O1xuICAgICAgICBpZiAodW5pdHMgPT09IFwicHRcIikgcmV0dXJuIHZhbHVlICogNCAvIDM7XG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKHZhbHVlKTtcbiAgICAqL1xuICAgICAgICByZXR1cm4gQ1NTVXRpbC5jb252ZXJ0VmFsdWUyUGl4ZWxzKHVuaXRzLCB2YWx1ZSwgZWxlbSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRDU1NTdHlsZShlbGVtZW50KSB7XG4gICAgICAgIGxldCBzdHlsZVRleHQgPSBcIlwiO1xuICAgICAgICBpZiAoZWxlbWVudCA9PT0gbnVsbCkgcmV0dXJuIFtdO1xuICAgICAgICBpZiAoZWxlbWVudC5JQk1fQ1NTX1RIQikgcmV0dXJuIGVsZW1lbnQuSUJNX0NTU19USEI7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IGVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSBcInN0eWxlXCIpIHtcbiAgICAgICAgICAgIHN0eWxlVGV4dCA9IGVsZW1lbnQuaW5uZXJUZXh0O1xuICAgICAgICAgICAgaWYgKHN0eWxlVGV4dCA9PT0gdW5kZWZpbmVkIHx8IHN0eWxlVGV4dC50cmltKCkgPT09IFwiXCIpXG4gICAgICAgICAgICAgICAgc3R5bGVUZXh0ID0gZWxlbWVudC50ZXh0Q29udGVudDtcbiAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZShcInN0eWxlXCIpKSB7XG4gICAgICAgICAgICBzdHlsZVRleHQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcInN0eWxlXCIpO1xuICAgICAgICB9IGVsc2UgcmV0dXJuIFtdO1xuICAgICAgICBpZiAoc3R5bGVUZXh0ID09PSBudWxsIHx8IHN0eWxlVGV4dC50cmltKCkubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG4gICAgICAgIC8vcmVtb3ZlIGNvbW1lbnQgYmxvY2tzXG4gICAgICAgIGxldCByZSA9IC8oXFwvXFwqKyg/Oig/Oig/OlteXFwqXSkrKXwoPzpbXFwqXSsoPyFcXC8pKSlbKl0rXFwvKXxcXC9cXC8uKi9nO1xuICAgICAgICBsZXQgc3Vic3QgPSBcIiBcIjtcbiAgICAgICAgc3R5bGVUZXh0ID0gc3R5bGVUZXh0LnJlcGxhY2UocmUsIHN1YnN0KTtcbiAgICAgICAgLy8gRmluZCBhbGwgXCJrZXkgOiB2YWw7XCIgcGFpcnMgd2l0aCB2YXJpb3VzIHdoaXRlc3BhY2UgaW5iZXR3ZWVuXG4gICAgICAgIGxldCByS2V5VmFscyA9IC9cXHMqKFteOlxcc10rKVxccyo6XFxzKihbXjskfV0rKVxccyooO3wkKS9nO1xuICAgICAgICAvLyBGaW5kIGFsbCBcInNlbGVjdG9yIHsgY3Nza2V5dmFscyB9IHdpdGggdmFyaW91cyB3aGl0ZXNwYWNlIGluYmV0d2VlblxuICAgICAgICBsZXQgclNlbGVjdG9ycyA9IC9cXHMqKFtee10qKXsoW159XSopfS9nO1xuICAgICAgICBpZiAoc3R5bGVUZXh0LmluZGV4T2YoXCJ7XCIpID09PSAtMSkge1xuICAgICAgICAgICAgbGV0IGtleVZhbHMgPSB7fTtcbiAgICAgICAgICAgIGxldCBtO1xuICAgICAgICAgICAgd2hpbGUgKChtID0gcktleVZhbHMuZXhlYyhzdHlsZVRleHQpKSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAga2V5VmFsc1ttWzFdXSA9IG1bMl0udHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgcmV0VmFsID0gW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlczoga2V5VmFscyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGVsZW1lbnQuSUJNX0NTU19USEIgPSByZXRWYWw7XG4gICAgICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IHJldFZhbCA9IFtdO1xuICAgICAgICAgICAgbGV0IG07XG4gICAgICAgICAgICBsZXQgbTI7XG4gICAgICAgICAgICB3aGlsZSAoKG0gPSByU2VsZWN0b3JzLmV4ZWMoc3R5bGVUZXh0KSkgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGxldCBrZXlWYWxzID0ge307XG4gICAgICAgICAgICAgICAgbGV0IHNlbEtleSA9IG1bMV07XG4gICAgICAgICAgICAgICAgbGV0IHNlbFZhbCA9IG1bMl07XG5cbiAgICAgICAgICAgICAgICB3aGlsZSAoKG0yID0gcktleVZhbHMuZXhlYyhzZWxWYWwpKSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGtleVZhbHNbbTJbMV1dID0gbTJbMl0udHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldFZhbC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6IHNlbEtleSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiBrZXlWYWxzLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxlbWVudC5JQk1fQ1NTX1RIQiA9IHJldFZhbDtcbiAgICAgICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBhbiBcImlubGluZVwiIENTUyBkaXNwbGF5IHByb3BlcnR5IHRlbGxzIHRoZSBlbGVtZW50IHRvIGZpdCBpdHNlbGYgb24gdGhlIHNhbWUgbGluZS4gQW4gJ2lubGluZScgZWxlbWVudCdzIHdpZHRoIGFuZCBoZWlnaHQgYXJlIGlnbm9yZWQuXG4gICAgICogc29tZSBlbGVtZW50IGhhcyBkZWZhdWx0IGlubGluZSBwcm9wZXJ0eSwgc3VjaCBhcyA8c3Bhbj4sIDxhPlxuICAgICAqIG1vc3QgZm9ybWF0dGluZyBlbGVtZW50cyBpbmhlcmVudCBpbmxpbmUgcHJvcGVydHksIHN1Y2ggYXMgPGVtPiwgPHN0cm9uZz4sIDxpPiwgPHNtYWxsPlxuICAgICAqIG90aGVyIGlubGluZSBlbGVtZW50czogPGFiYnI+IDxhY3JvbnltPiA8Yj4gPGJkbz4gPGJpZz4gPGJyPiA8Y2l0ZT4gPGNvZGU+IDxkZm4+IDxlbT4gPGk+IDxpbnB1dD4gPGtiZD4gPGxhYmVsPlxuICAgICAqIDxtYXA+IDxvYmplY3Q+IDxvdXRwdXQ+IDxxPiA8c2FtcD4gPHNjcmlwdD4gPHNlbGVjdD4gPHNtYWxsPiA8c3Bhbj4gPHN0cm9uZz4gPHN1Yj4gPHN1cD4gPHRleHRhcmVhPiA8dGltZT4gPHR0PiA8dmFyPlxuICAgICAqIGFuIFwiaW5saW5lLWJsb2NrXCIgZWxlbWVudCBzdGlsbCBwbGFjZSBlbGVtZW50IGluIHRoZSBzYW1lIGxpbmUgd2l0aG91dCBicmVha2luZyB0aGUgbGluZSwgYnV0IHRoZSBlbGVtZW50J3Mgd2lkdGggYW5kIGhlaWdodCBhcmUgYXBwbGllZC5cbiAgICAgKiBpbmxpbmUtYmxvY2sgZWxlbWVudHM6IGltZywgYnV0dG9uLCBzZWxlY3QsIG1ldGVyLCBwcm9ncmVzcywgbWFyZ3VlZSwgYWxzbyBpbiBDaHJvbWU6IHRleHRhcmVhLCBpbnB1dFxuICAgICAqIEEgYmxvY2stbGV2ZWwgZWxlbWVudCBhbHdheXMgc3RhcnRzIG9uIGEgbmV3IGxpbmUsIGFuZCB0aGUgYnJvd3NlcnMgYXV0b21hdGljYWxseSBhZGQgc29tZSBzcGFjZSAoYSBtYXJnaW4pIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIGVsZW1lbnQuXG4gICAgICogYmxvY2stbGV2ZWwgZWxlbWVudHM6IDxhZGRyZXNzPiA8YXJ0aWNsZT4gPGFzaWRlPiA8YmxvY2txdW90ZT4gPGNhbnZhcz4gPGRkPiA8ZGl2PiA8ZGw+IDxkdD4gPGZpZWxkc2V0PiA8ZmlnY2FwdGlvbj4gPGZpZ3VyZT4gPGZvb3Rlcj4gPGZvcm0+XG4gICAgICogPGgxPi08aDY+IDxoZWFkZXI+IDxocj4gPGxpPiA8bWFpbj4gPG5hdj4gPG5vc2NyaXB0PiA8b2w+IDxwPiA8cHJlPiA8c2VjdGlvbj4gPHRhYmxlPiA8dGZvb3Q+IDx1bD4gPHZpZGVvPlxuICAgICAqXG4gICAgICogcmV0dXJuOiBpZiBpdCdzIGlubGluZSBlbGVtZW50IGFuZCB7IGlubGluZTogdHJ1ZSB8IGZhbHNlLCB0ZXh0OiB0cnVlIHwgZmFsc2UsIHZpb2xhdGlvbjogbnVsbCB8IHtub2RlfSB9XG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRJbmxpbmVTdGF0dXMoZWxlbWVudCkge1xuICAgICAgICBpZiAoIWVsZW1lbnQpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IGVsZW1fc3R5bCA9IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCk7XG4gICAgICAgIGlmICghZWxlbV9zdHlsKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgc3RhdHVzID0geyBpbmxpbmU6IGZhbHNlLCB0ZXh0OiBmYWxzZSwgdmlvbGF0aW9uOiBudWxsIH07XG4gICAgICAgIGNvbnN0IHVkaXNwbGF5ID0gZWxlbV9zdHlsLmdldFByb3BlcnR5VmFsdWUoXCJkaXNwbGF5XCIpO1xuICAgICAgICAvLyBpbmxpbmUgZWxlbWVudCBvbmx5XG4gICAgICAgIGlmICh1ZGlzcGxheSAhPT0gXCJpbmxpbmVcIikgcmV0dXJuIHN0YXR1cztcblxuICAgICAgICBzdGF0dXMuaW5saW5lID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgcGFyZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICAgICAgICBpZiAoIXBhcmVudCkgcmV0dXJuIHN0YXR1cztcblxuICAgICAgICBjb25zdCBtYXBwZXI6IERPTU1hcHBlciA9IG5ldyBET01NYXBwZXIoKTtcbiAgICAgICAgY29uc3QgYm91bmRzID0gbWFwcGVyLmdldFVuYWRqdXN0ZWRCb3VuZHMoZWxlbWVudCk7XG4gICAgICAgIGNvbnN0IHN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShwYXJlbnQpO1xuICAgICAgICBjb25zdCBkaXNwbGF5ID0gc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShcImRpc3BsYXlcIik7XG4gICAgICAgIC8vIGFuIGlubGluZSBlbGVtZW50IGlzIGluc2lkZSBhIGJsb2NrLiBub3RlIDxib2R5PiBpcyBhIGJsb2NrIGVsZW1lbnQgdG9vXG4gICAgICAgIGlmIChkaXNwbGF5ICE9PSBcImJsb2NrXCIgJiYgZGlzcGxheSAhPT0gXCJpbmxpbmUtYmxvY2tcIikge1xuICAgICAgICAgICAgLy9wYXJlbnQgaXMgaW5saW5lIGVsZW1lbnRcbiAgICAgICAgICAgIGlmICghQ29tbW9uVXRpbC5pc0lubmVyVGV4dE9ubHlFbXB0eShwYXJlbnQpKVxuICAgICAgICAgICAgICAgIHN0YXR1cy50ZXh0ID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiBzdGF0dXM7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogQHJldHVybnMgXCJ5ZXNcIlwiOiBpbmxpbmUgd2l0aCB0ZXh0LCBcIm5vXCI6IGlubGluZSB3aXRob3V0IHRleHQsIFxuICAgICAgICAgKiAgICAgICAgICBcInZpb2xhdGlvblwiOiBub3Qgc3BhY2luZyBlbm91Z2ggdG8gbmVpYm9yaW5nIGlubGluZSB0YXJnZXRcbiAgICAgICAgICogICAgICAgICAgXCJibG9ja1wiOiBibG9jayBlbGVtZW50LCAgXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBpc0lubGluZVdpdGhUZXh0KG5vZGU6IE5vZGUsIGJlZm9yZTogYm9vbGVhbikgOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgICAgIC8vIG5vdGUgYnJvd3NlcnMgaW5zZXJ0IFRleHQgbm9kZXMgdG8gcmVwcmVzZW50IHdoaXRlc3BhY2VzLlxuICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUubm9kZVZhbHVlICYmIG5vZGUubm9kZVZhbHVlLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJ5ZXNcIjtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIm5vXCI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG5vZGUubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlOiA8YnI+IGlzIHN0eWxlZCAnaW5saW5lJyBieSBkZWZhdWx0LCBidXQgY2hhbmdlIHRoZSBsaW5lXG4gICAgICAgICAgICAgICAgaWYgKG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJiclwiKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJibG9ja1wiO1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBjb25zdCBjU3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKG5vZGUgYXMgRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgY29uc3QgY0Rpc3BsYXkgPSBjU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShcImRpc3BsYXlcIik7XG4gICAgICAgICAgICAgICAgaWYgKGNEaXNwbGF5ID09PSBcImlubGluZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChDb21tb25VdGlsLmlzVGFyZ2V0KG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYm91bmRzLndpZHRoIDwgMjQpIHsgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlIGhvcml6b250YWwgc3BhY2luZyBpcyBzdWZmaWNpZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm5kcyA9IG1hcHBlci5nZXRVbmFkanVzdGVkQm91bmRzKG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoYmVmb3JlICYmIChNYXRoLnJvdW5kKGJvdW5kcy53aWR0aCAvIDIpICsgYm91bmRzLmxlZnQgLSBibmRzLmxlZnQgPCAyNCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICghYmVmb3JlICYmIChNYXRoLnJvdW5kKGJvdW5kcy53aWR0aCAvIDIpICsgYm91bmRzLmxlZnQgLSAoYm5kcy5sZWZ0ICsgYm5kcy53aWR0aCkgPCAyNCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cy52aW9sYXRpb24gPSBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcInZpb2xhdGlvblwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJub1wiOyAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgfSBcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFDb21tb25VdGlsLmlzSW5uZXJUZXh0T25seUVtcHR5KG5vZGUpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwieWVzXCI7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIm5vXCI7XG4gICAgICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcImJsb2NrXCI7XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgIHJldHVybiBcImJsb2NrXCI7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhbiBpbmxpbmUgZWxlbWVudCBpcyBpbnNpZGUgYSBibG9jay4gbm90ZSA8Ym9keT4gaXMgYSBibG9jayBlbGVtZW50IHRvb1xuICAgICAgICAvLyBvbmUgb3IgbW9yZSBpbmxpbmUgZWxlbWVudHMgd2l0aCB0ZXh0IGluIHRoZSBzYW1lIGxpbmU6IDx0YXJnZXQ+LCB0ZXh0PHRhcmdldD4sIDx0YXJnZXQ+dGV4dCwgPGlubGluZT4rdGV4dDx0YXJnZXQ+LCA8dGFyZ2V0PjxpbmxpbmU+K3RleHQsIHRleHQ8dGFyZ2V0PjxpbmxpbmU+K1xuICAgICAgICBsZXQgd2Fsa05vZGUgPSBlbGVtZW50Lm5leHRTaWJsaW5nO1xuICAgICAgICB3aGlsZSAod2Fsa05vZGUpIHtcbiAgICAgICAgICAgIGxldCBpbmxpbmVUZXh0ID0gaXNJbmxpbmVXaXRoVGV4dCh3YWxrTm9kZSwgdHJ1ZSk7XG4gICAgICAgICAgICBpZiAoaW5saW5lVGV4dCA9PT0gXCJ5ZXNcIikge1xuICAgICAgICAgICAgICAgIHN0YXR1cy50ZXh0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpbmxpbmVUZXh0ID09PSBcImJsb2NrXCIpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdhbGtOb2RlID0gd2Fsa05vZGUubmV4dFNpYmxpbmc7XG4gICAgICAgIH1cblxuICAgICAgICB3YWxrTm9kZSA9IGVsZW1lbnQucHJldmlvdXNTaWJsaW5nO1xuICAgICAgICB3aGlsZSAod2Fsa05vZGUpIHtcbiAgICAgICAgICAgIGxldCBpbmxpbmVUZXh0ID0gaXNJbmxpbmVXaXRoVGV4dCh3YWxrTm9kZSwgZmFsc2UpO1xuICAgICAgICAgICAgaWYgKGlubGluZVRleHQgPT09IFwieWVzXCIpIHtcbiAgICAgICAgICAgICAgICBzdGF0dXMudGV4dCA9IHRydWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaW5saW5lVGV4dCA9PT0gXCJibG9ja1wiKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3YWxrTm9kZSA9IHdhbGtOb2RlLnByZXZpb3VzU2libGluZztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RhdHVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGEgdGFyZ2V0IGlzIGVuIGVsZW1lbnQgdGhhdCBhY2NlcHQgYSBwb2ludGVyIGFjdGlvbiAoY2xpY2sgb3IgdG91Y2gpXG4gICAgICogYSB0YXJnZXQgaXMgYSBicm93c2VyIGRlZmF1bHQgaWYgaXQncyBhIG5hdGl2ZSB3aWRnZXQgKG5vIHVzZXIgZGVmaW5lZCByb2xlKSB3aXRob3V0IHVzZXIgc3R5bGVcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzVGFyZ2V0QnJvd3NlckRlZmF1bHQoZWxlbWVudCkge1xuICAgICAgICBpZiAoIWVsZW1lbnQpIHJldHVybiBmYWxzZTtcblxuICAgICAgICAvLyB1c2VyIGRlZmluZWQgd2lkZ2V0XG4gICAgICAgIGNvbnN0IHJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXMoZWxlbWVudCwgZmFsc2UpO1xuICAgICAgICBpZiAocm9sZXMgJiYgcm9sZXMubGVuZ3RoID4gMCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIC8vIG5vIHVzZXIgc3R5bGUgdG8gc3BhY2UgY29udHJvbCBzaXplLCBpbmNsdWRpbmcgdXNlIG9mIGZvbnRcbiAgICAgICAgY29uc3Qgc3R5bGVzID0gQ1NTVXRpbC5nZXREZWZpbmVkU3R5bGVzKGVsZW1lbnQsIFtcbiAgICAgICAgICAgIFwibGluZS1oZWlnaHRcIiwgXCJoZWlnaHRcIiwgXCJ3aWR0aFwiLFwibWluLWhlaWdodFwiLCBcIm1pbi13aWR0aFwiLFxuICAgICAgICAgICAgXCJmb250LXNpemVcIixcIm1hcmdpbi10b3BcIixcIm1hcmdpbi1ib3R0b21cIiwgXCJtYXJnaW4tbGVmdFwiLCBcIm1hcmdpbi1yaWdodFwiXG4gICAgICAgIF0pO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICBzdHlsZXNbXCJsaW5lLWhlaWdodFwiXSB8fFxuICAgICAgICAgICAgc3R5bGVzW1wiaGVpZ2h0XCJdIHx8XG4gICAgICAgICAgICBzdHlsZXNbXCJ3aWR0aFwiXSB8fFxuICAgICAgICAgICAgc3R5bGVzW1wibWluLWhlaWdodFwiXSB8fFxuICAgICAgICAgICAgc3R5bGVzW1wibWluLXdpZHRoXCJdIHx8XG4gICAgICAgICAgICBzdHlsZXNbXCJmb250LXNpemVcIl0gfHxcbiAgICAgICAgICAgIHN0eWxlc1tcIm1hcmdpbi10b3BcIl0gfHxcbiAgICAgICAgICAgIHN0eWxlc1tcIm1hcmdpbi1ib3R0b21cIl0gfHxcbiAgICAgICAgICAgIHN0eWxlc1tcIm1hcmdpbi1sZWZ0XCJdIHx8XG4gICAgICAgICAgICBzdHlsZXNbXCJtYXJnaW4tcmlnaHRcIl1cbiAgICAgICAgKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qXG4gICAgICogc3RyaW5nIGNvbnRhaW5zIENKSyAoY2hpbmVzZSwgamFwYW5lc2VzLCBvciBrb3JlYSlcbiAgICAgKiByZXR1cm46IGJvb2xlYW5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGNvbnRhaW5zQ0tKKHRleHQ6IHN0cmluZykge1xuICAgICAgICBpZiAoIXRleHQpIHJldHVybiBmYWxzZTtcblxuICAgICAgICAvLyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9DSktfVW5pZmllZF9JZGVvZ3JhcGhzICBodHRwczovL2F5YWthLnNobi5oay9oYW5yZWdleC9cbiAgICAgICAgbGV0IHJlZ2V4ID0gLyg/OltcXHU0ZTAwLVxcdTlmZmZcXHUzNDAwLVxcdTRkYmZdKSsvZztcblxuICAgICAgICBjb25zdCByZXBsYWNlZCA9IHRleHQudHJpbSgpLnJlcGxhY2UocmVnZXgsIFwiXCIpO1xuICAgICAgICBpZiAocmVwbGFjZWQubGVuZ3RoID09PSB0ZXh0LnRyaW0oKS5sZW5ndGgpIHJldHVybiBmYWxzZTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIGFuY2VzdG9yIHdpdGggdGhlIGdpdmVuIHN0eWxlIHByb3BlcnRpZXMuXG4gICAgICogU2VhcmNoZXMgdXAgdGhlIERPTSB0cmVlIHRvIGZpbmQgYW4gYW5jZXN0b3IgdGhhdCBoYXMgQUxMIHNwZWNpZmllZCBzdHlsZSBwcm9wZXJ0aWVzXG4gICAgICogd2l0aCB2YWx1ZXMgbWF0Y2hpbmcgdGhlIGNyaXRlcmlhLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtlbGVtZW50fSBlbGVtIC0gVGhlIGVsZW1lbnQgdG8gc3RhcnQgdGhlIG5vZGUgd2FsayBvbiB0byBmaW5kIHBhcmVudCBub2RlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHN0eWxlUHJvcHMgLSBUaGUgc3R5bGUgcHJvcGVydGllcyBhbmQgdmFsdWVzIG9mIHRoZSBwYXJlbnQgdG8gc2VhcmNoIGZvci5cbiAgICAgKiAgICAgICAgIHN1Y2ggYXMge1wib3ZlcmZsb3dcIjpbJ2F1dG8nLCAnc2Nyb2xsJ10sIFwib3ZlcmZsb3cteFwiOlsnYXV0bycsICdzY3JvbGwnXX1cbiAgICAgKiAgICAgICAgICBvciB7XCJvdmVyZmxvd1wiOlsnKiddLCBcIm92ZXJmbG93LXhcIjpbJyonXX0sIFRoZSAnKicgZm9yIGFueSB2YWx1ZSB0byBjaGVjayB0aGUgZXhpc3RlbmNlIG9mIHRoZSBzdHlsZSBwcm9wLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGV4Y2x1ZGVkVmFsdWVzIC0gc3R5bGUgdmFsdWVzIHRoYXQgc2hvdWxkIGJlIGlnbm9yZWQuXG4gICAgICogQHJldHVybiB7RWxlbWVudHxudWxsfSAtIEFuIGFuY2VzdG9yIGVsZW1lbnQgdGhhdCBoYXMgYWxsIHRoZSBzcGVjaWZpZWQgc3R5bGUgcHJvcGVydGllcywgb3IgbnVsbCBpZiBub25lIGZvdW5kXG4gICAgICogQG1lbWJlck9mIENTU1V0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEFuY2VzdG9yV2l0aFN0eWxlcyhlbGVtLCBzdHlsZVByb3BzLCBleGNsdWRlZFZhbHVlcyA9IFtdKSB7XG4gICAgICAgIC8vIENyZWF0ZSBhIGNhY2hlIGtleSB0aGF0IGluY2x1ZGVzIHRoZSBzdHlsZSBwcm9wZXJ0aWVzIGJlaW5nIHNlYXJjaGVkIGZvclxuICAgICAgICBjb25zdCBjYWNoZUtleSA9IFwiQXJpYVV0aWxfQW5jZXN0b3JXaXRoU3R5bGVzX1wiICsgSlNPTi5zdHJpbmdpZnkoc3R5bGVQcm9wcykgKyBcIl9cIiArIEpTT04uc3RyaW5naWZ5KGV4Y2x1ZGVkVmFsdWVzKTtcbiAgICAgICAgXG4gICAgICAgIC8vIENoZWNrIGlmIHdlIGFscmVhZHkgaGF2ZSBhIGNhY2hlZCByZXN1bHQgZm9yIHRoaXMgc3BlY2lmaWMgcXVlcnlcbiAgICAgICAgY29uc3QgY2FjaGVkUmVzdWx0ID0gQ2FjaGVVdGlsLmdldENhY2hlKGVsZW0sIGNhY2hlS2V5LCBudWxsKTtcbiAgICAgICAgaWYgKGNhY2hlZFJlc3VsdCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFJlc3VsdCA9PT0gXCJOT1RfRk9VTkRcIiA/IG51bGwgOiBjYWNoZWRSZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdGFydCB3aXRoIHRoZSBlbGVtZW50IGl0c2VsZiAobm90IGp1c3QgcGFyZW50KSB0byBtYWludGFpbiBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gICAgICAgIGxldCB3YWxrTm9kZSA9IGVsZW07XG4gICAgICAgIHdoaWxlICh3YWxrTm9kZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gU2tpcCBpZiBub3QgYW4gSFRNTEVsZW1lbnQgKGUuZy4sIFNWR0VsZW1lbnQpXG4gICAgICAgICAgICAvLyBVc2Ugbm9kZVR5cGUgY2hlY2sgaW5zdGVhZCBvZiBpbnN0YW5jZW9mIHRvIHdvcmsgYWNyb3NzIGRpZmZlcmVudCBkb2N1bWVudCBjb250ZXh0c1xuICAgICAgICAgICAgaWYgKHdhbGtOb2RlLm5vZGVUeXBlICE9PSAxIHx8IHdhbGtOb2RlLm5hbWVzcGFjZVVSSSA9PT0gXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiKSB7XG4gICAgICAgICAgICAgICAgd2Fsa05vZGUgPSBET01XYWxrZXIucGFyZW50RWxlbWVudCh3YWxrTm9kZSk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNvbnN0IHN0eWxlcyA9IENTU1V0aWwuZ2V0RGVmaW5lZFN0eWxlcyh3YWxrTm9kZSwgT2JqZWN0LmtleXMoc3R5bGVQcm9wcykpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBDaGVjayBpZiBBTlkgc3BlY2lmaWVkIHN0eWxlIHByb3BlcnR5IG1hdGNoZXMgdGhlIGNyaXRlcmlhIChPUiBsb2dpYylcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3R5bGVQcm9wIGluIHN0eWxlUHJvcHMpIHtcbiAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSBzdHlsZXNbc3R5bGVQcm9wXTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFByb3BlcnR5IG5vdCBkZWZpbmVkIG9uIHRoaXMgZWxlbWVudCwgdHJ5IG5leHQgcHJvcGVydHlcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIFJlbW92ZSAhaW1wb3J0YW50IHN1ZmZpeCBmb3IgY29tcGFyaXNvblxuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuc3BsaXQoXCIgXCIpWzBdO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHZhbHVlIHNob3VsZCBiZSBleGNsdWRlZFxuICAgICAgICAgICAgICAgIGlmIChleGNsdWRlZFZhbHVlcy5pbmNsdWRlcyh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHZhbHVlIG1hdGNoZXMgdGhlIGNyaXRlcmlhXG4gICAgICAgICAgICAgICAgY29uc3QgYWNjZXB0ZWRWYWx1ZXMgPSBzdHlsZVByb3BzW3N0eWxlUHJvcF07XG4gICAgICAgICAgICAgICAgaWYgKGFjY2VwdGVkVmFsdWVzLmluY2x1ZGVzKCcqJykpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQW55IHZhbHVlIGlzIGFjY2VwdGFibGUgKGp1c3QgY2hlY2tpbmcgZXhpc3RlbmNlKVxuICAgICAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgY2FjaGVLZXksIHdhbGtOb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdhbGtOb2RlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWNjZXB0ZWRWYWx1ZXMuaW5jbHVkZXModmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFZhbHVlIG1hdGNoZXMgb25lIG9mIHRoZSBhY2NlcHRlZCB2YWx1ZXNcbiAgICAgICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIGNhY2hlS2V5LCB3YWxrTm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB3YWxrTm9kZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHdhbGtOb2RlID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQod2Fsa05vZGUpO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBObyBtYXRjaGluZyBlbGVtZW50IG9yIGFuY2VzdG9yIGZvdW5kIC0gY2FjaGUgdGhpcyByZXN1bHQgdG8gYXZvaWQgcmUtc2VhcmNoaW5nXG4gICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBjYWNoZUtleSwgXCJOT1RfRk9VTkRcIik7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHJldHVybiBhbiBhcnJheSBbdmFsdWUsIFVuaXRdIGZyb20gYSB2YWx1ZS11bml0IGNvbWJvIHN0cmluZ1xuICAgICAqIEBwYXJhbSB2YWx1ZVVuaXRDb21ibywgc3VjaCBhcyAyMHB4LCAycmVtIFxuICAgICAqIEByZXR1cm5zIFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0VmFsdWVVbml0UGFpcih2YWx1ZVVuaXRDb21ibykge1xuICAgICAgICBpZiAoIXZhbHVlVW5pdENvbWJvKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcih2YWx1ZVVuaXRDb21ibykpIHJldHVybiBbXCJweFwiLCB2YWx1ZVVuaXRDb21ib107XG5cbiAgICAgICAgY29uc3QgdmFsdWUgPSBwYXJzZUludCh2YWx1ZVVuaXRDb21ibyk7XG4gICAgICAgIGlmIChpc05hTih2YWx1ZSkpIHJldHVybiBudWxsO1xuXG4gICAgICAgIHZhbHVlVW5pdENvbWJvID0gdmFsdWVVbml0Q29tYm8udHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGxldCBtYXRjaCA9IHZhbHVlVW5pdENvbWJvLnRyaW0oKS5tYXRjaCgvKFthLXpdKykkLyk7XG4gICAgICAgIGxldCB1bml0ID0gJ3B4JztcbiAgICAgICAgaWYgKG1hdGNoKSB1bml0ID0gbWF0Y2hbMV07XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gW3VuaXQsIHZhbHVlXTtcbiAgICB9XG5cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIENhY2hlRG9jdW1lbnQgZXh0ZW5kcyBEb2N1bWVudCB7XG4gICAgYWNlQ2FjaGU6IHsgW2tleTogc3RyaW5nXTogYW55IH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgQ2FjaGVFbGVtZW50IGV4dGVuZHMgRWxlbWVudCB7XG4gICAgYWNlQ2FjaGU6IHsgW2tleTogc3RyaW5nXTogYW55IH1cbn1cblxuZXhwb3J0IGNsYXNzIENhY2hlVXRpbCB7XG4gICAgLyogUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgZ2l2ZW4gZ2xvYmFsIHZhcmlhYmxlXG4gICAgICAgICAqIHdpdGggaXRzIGluaXRpYWwgdmFsdWUgYXMgZ2l2ZW4gKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldENhY2hlKGNhY2hlU3BvdDogRWxlbWVudCB8IERvY3VtZW50IHwgRG9jdW1lbnRGcmFnbWVudCwga2V5TmFtZSwgaW5pdFZhbHVlKSB7XG4gICAgICAgIGlmICghY2FjaGVTcG90KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICBsZXQgY2FjaGVPYmogPSAoY2FjaGVTcG90Lm5vZGVUeXBlID09PSA5IC8qIE5vZGUuRE9DVU1FTlRfTk9ERSAqLyB8fCBjYWNoZVNwb3Qubm9kZVR5cGUgPT09IDExIC8qIE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSAqLykgPyBjYWNoZVNwb3QgYXMgQ2FjaGVEb2N1bWVudCA6IGNhY2hlU3BvdCBhcyBDYWNoZUVsZW1lbnQ7XG4gICAgICAgIGlmIChjYWNoZU9iai5hY2VDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjYWNoZU9iai5hY2VDYWNoZSA9IHt9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNhY2hlT2JqLmFjZUNhY2hlW2tleU5hbWVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNhY2hlT2JqLmFjZUNhY2hlW2tleU5hbWVdID0gaW5pdFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYWNoZU9iai5hY2VDYWNoZVtrZXlOYW1lXVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgc2V0Q2FjaGUoY2FjaGVTcG90OiBEb2N1bWVudCB8IEVsZW1lbnQgfCBEb2N1bWVudEZyYWdtZW50IHwgU2hhZG93Um9vdCwgZ2xvYmFsTmFtZSwgdmFsdWUpOiBhbnkge1xuICAgICAgICBpZiAoIWNhY2hlU3BvdCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IGNhY2hlT2JqID0gKGNhY2hlU3BvdC5ub2RlVHlwZSA9PT0gOSAvKiBOb2RlLkRPQ1VNRU5UX05PREUgKi8gfHwgY2FjaGVTcG90Lm5vZGVUeXBlID09PSAxMSAvKiBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUgKi8pID8gY2FjaGVTcG90IGFzIENhY2hlRG9jdW1lbnQgOiBjYWNoZVNwb3QgYXMgQ2FjaGVFbGVtZW50O1xuICAgICAgICBpZiAoY2FjaGVPYmouYWNlQ2FjaGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY2FjaGVPYmouYWNlQ2FjaGUgPSB7fVxuICAgICAgICB9XG4gICAgICAgIGNhY2hlT2JqLmFjZUNhY2hlW2dsb2JhbE5hbWVdID0gdmFsdWU7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldFNldENhY2hlKGNhY2hlU3BvdDogRWxlbWVudCB8IERvY3VtZW50IHwgRG9jdW1lbnRGcmFnbWVudCwga2V5TmFtZSwgaW5pdEZ1bmM6ICgpID0+IGFueSkge1xuICAgICAgICBpZiAoIWNhY2hlU3BvdCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IGNhY2hlT2JqID0gKGNhY2hlU3BvdC5ub2RlVHlwZSA9PT0gOSAvKiBOb2RlLkRPQ1VNRU5UX05PREUgKi8gfHwgY2FjaGVTcG90Lm5vZGVUeXBlID09PSAxMSAvKiBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUgKi8pID8gY2FjaGVTcG90IGFzIENhY2hlRG9jdW1lbnQgOiBjYWNoZVNwb3QgYXMgQ2FjaGVFbGVtZW50O1xuICAgICAgICBpZiAoY2FjaGVPYmouYWNlQ2FjaGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY2FjaGVPYmouYWNlQ2FjaGUgPSB7fVxuICAgICAgICB9XG4gICAgICAgIGlmIChjYWNoZU9iai5hY2VDYWNoZVtrZXlOYW1lXSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBjYWNoZU9iai5hY2VDYWNoZVtrZXlOYW1lXSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgY2FjaGVPYmouYWNlQ2FjaGVba2V5TmFtZV0gPSBpbml0RnVuYygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYWNoZU9iai5hY2VDYWNoZVtrZXlOYW1lXVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY2xlYXJDYWNoZXMoY2FjaGVSb290OiBOb2RlKTogbnVtYmVyIHtcbiAgICAgICAgbGV0IG51bU5vZGVzVmlzaXRlZCA9IDA7XG4gICAgICAgIGRlbGV0ZSAoY2FjaGVSb290Lm93bmVyRG9jdW1lbnQgYXMgQ2FjaGVEb2N1bWVudCkuYWNlQ2FjaGU7XG4gICAgICAgIGxldCBudyA9IG5ldyBET01XYWxrZXIoY2FjaGVSb290LCBmYWxzZSwgY2FjaGVSb290LCB0cnVlKTtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgKytudW1Ob2Rlc1Zpc2l0ZWQ7XG4gICAgICAgICAgICBkZWxldGUgKG53Lm5vZGUgYXMgQ2FjaGVFbGVtZW50KS5hY2VDYWNoZTtcbiAgICAgICAgICAgIG53Lm5vZGUub3duZXJEb2N1bWVudCAmJiBkZWxldGUgKG53Lm5vZGUub3duZXJEb2N1bWVudCBhcyBDYWNoZURvY3VtZW50KS5hY2VDYWNoZTtcbiAgICAgICAgfSB3aGlsZSAobncubmV4dE5vZGUoKSk7XG4gICAgICAgIHJldHVybiBudW1Ob2Rlc1Zpc2l0ZWQ7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBDYWNoZVV0aWwgfSBmcm9tIFwiLi9DYWNoZVV0aWxcIjtcbmltcG9ydCB7IENTU1V0aWwgfSBmcm9tIFwiLi9DU1NVdGlsXCI7XG5cbmV4cG9ydCBjbGFzcyBDbGlwUGF0aFV0aWwge1xuICAgIFxuICAgIHByaXZhdGUgc3RhdGljIFRIUkVTSE9MRCA6IG51bWJlciA9IDU7ICAvLyA1cHhcbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBjaGVja2luZyBpZiB0aGUgbm9kZSB0aGF0IGlzIHZpc3VhbGx5IGhpZGRlbiBieSBjc3MgY2xpcC1wYXRoOlxuICAgICAqXG4gICAgICogTm90ZSAxOiBJZiBlaXRoZXIgY3VycmVudCBub2RlIG9yIGFueSBvZiB0aGUgcGFyZW50IG5vZGVzIGFyZSB2aXN1YWxseSBoaWRkZW4gdGhlbiB0aGlzXG4gICAgICogICAgICAgICAgZnVuY3Rpb24gd2lsbCByZXR1cm4gdHJ1ZSAobm9kZSBpcyBub3QgdmlzdWFsbHkgaGlkZGVuKS5cbiAgICAgKlxuICAgICAqIE5vdGUgMjogbm9kZXMgd2l0aCBDU1MgcHJvcGVydGllcyBjbGlwLXBhdGgsIHRoZSBjb250ZW50IGlzIG5vdCBjb25zaWRlcmVkIGhpZGRlbiB0byBhbiBBVC4gVGV4dCBoaWRkZW4gd2l0aCB0aGVzZSBtZXRob2RzIFxuICAgICAqICAgICAgY2FuIHN0aWxsIGJlIHJlZWRhYmxlIGJ5IHNjcmVlbiByZWFkZXJzLiBcbiAgICAgKiBOb3RlIDM6IGlmIGEgbGluaywgZm9ybSBjb250cm9sLCBvciBvdGhlciBmb2N1c2FibGUgZWxlbWVudCBpcyBnaXZlbiB0aGlzIHN0eWxlLCB0aGUgZWxlbWVudCB3b3VsZCBiZSBmb2N1c2FibGUgYnV0IG5vdCB2aXNpYmxlLCBcbiAgICAgKiAgICAgIGtleWJvYXJkIHVzZXJzIG1pZ2h0IGJlIGNvbmZ1c2VkLiAgICBcbiAgICAgKiBcbiAgICAgKiBAcGFybSB7Tm9kZX0gbm9kZSBUaGUgbm9kZSB3aGljaCBzaG91bGQgYmUgY2hlY2tlZCBpZiBpdCBpcyB2aXN1YWxseSBoaWRkZW4gb3Igbm90LlxuICAgICAqIEByZXR1cm4ge2Jvb2x9IHRydWUgaWYgdGhlIG5vZGUgaXMgdmlzdWFsbHkgaGlkZGVuLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBWaXNVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpc05vZGVWaXN1YWxseUhpZGRlbkJ5Q2xpcFBhdGgobm9kZTogTm9kZSkgOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCFub2RlIHx8IG5vZGUubm9kZVR5cGUgIT09IDEpIHJldHVybiBmYWxzZTtcbiAgICAgICAgXG4gICAgICAgIGxldCBlbGVtID0gbm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IGhpZGRlbiA9IENhY2hlVXRpbC5nZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIHVuZGVmaW5lZCk7XG4gICAgICAgIGlmIChoaWRkZW4gIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJldHVybiBoaWRkZW47XG4gICAgICAgICAgICBcbiAgICAgICAgY29uc3Qgc3R5bGUgPSBDU1NVdGlsLmdldENvbXB1dGVkU3R5bGUoZWxlbSk7XG4gICAgICAgIGNvbnN0IHdpZHRoID0gcGFyc2VJbnQoc3R5bGUud2lkdGgpOyAgLy9hbHdheXMgaW4gcHhcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gcGFyc2VJbnQoc3R5bGUuaGVpZ2h0KTsgLy9hbHdheXMgaW4gcHhcblxuICAgICAgICBsZXQgcGF0aCA9IHN0eWxlWydjbGlwLXBhdGgnXTsgXG4gICAgICAgIGlmICghcGF0aCB8fCBwYXRoLnRyaW0oKSA9PT0gJ25vbmUnIHx8IHBhdGgudHJpbSgpID09PSAnJykgIHtcbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIGZhbHNlKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgcGF0aCA9IHBhdGgudHJpbSgpLnJlcGxhY2UoL1xccysvZywgJyAnKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBcbiAgICAgICAgbGV0IGluZGV4ID0gcGF0aC5pbmRleE9mKFwiaW5zZXQoXCIpO1xuICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7IFxuICAgICAgICAgICAgbGV0IHJvdW5kX2luZGV4ID0gcGF0aC5pbmRleE9mKFwicm91bmRcIik7XG4gICAgICAgICAgICBsZXQgc3RyID0gcGF0aC5zdWJzdHJpbmcocGF0aC5pbmRleE9mKFwiKFwiKSsxLCBwYXRoLmluZGV4T2YoXCIpXCIpKTtcbiAgICAgICAgICAgIGlmIChyb3VuZF9pbmRleCAhPT0gLTEpXG4gICAgICAgICAgICAgICAgc3RyID0gcGF0aC5zdWJzdHJpbmcocGF0aC5pbmRleE9mKFwiKFwiKSsxLCByb3VuZF9pbmRleCk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGxldCBudW1iZXJzID0gc3RyLnRyaW0oKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICAvLyBXaGVuIG9uZSB2YWx1ZSBpcyBzcGVjaWZpZWQsIGl0IGFwcGxpZXMgdGhlIHNhbWUgaW5zZXQgdG8gYWxsIGZvdXIgc2lkZXNcbiAgICAgICAgICAgIGlmIChudW1iZXJzLmxlbmd0aCA9PT0gMSkgIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXQgPSBDbGlwUGF0aFV0aWwuaXNDbGlwcGVkQnlJbnNldChlbGVtLCBudW1iZXJzWzBdLCBudW1iZXJzWzBdLCBudW1iZXJzWzBdLCBudW1iZXJzWzBdKTtcbiAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCByZXQpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFdoZW4gdHdvIHZhbHVlcyBhcmUgc3BlY2lmaWVkLCB0aGUgZmlyc3QgdmFsdWUgYXBwbGllcyB0byB0aGUgdG9wIGFuZCBib3R0b20sIHRoZSBzZWNvbmQgdG8gdGhlIGxlZnQgYW5kIHJpZ2h0LlxuICAgICAgICAgICAgaWYgKG51bWJlcnMubGVuZ3RoID09PSAyKSB7IFxuICAgICAgICAgICAgICAgIGNvbnN0IHJldCA9IENsaXBQYXRoVXRpbC5pc0NsaXBwZWRCeUluc2V0KGVsZW0sIG51bWJlcnNbMF0sIG51bWJlcnNbMV0sIG51bWJlcnNbMF0sIG51bWJlcnNbMV0pO1xuICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIHJldCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldDsgICAgICAgICBcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gV2hlbiB0aHJlZSB2YWx1ZXMgYXJlIHNwZWNpZmllZCwgdGhlIGZpcnN0IGFwcGxpZXMgdG8gdGhlIHRvcCwgdGhlIHNlY29uZCB0byB0aGUgcmlnaHQgYW5kIGxlZnQsIHRoZSB0aGlyZCB0byB0aGUgYm90dG9tLlxuICAgICAgICAgICAgaWYgKG51bWJlcnMubGVuZ3RoID09PSAzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmV0ID0gQ2xpcFBhdGhVdGlsLmlzQ2xpcHBlZEJ5SW5zZXQoZWxlbSwgbnVtYmVyc1swXSwgbnVtYmVyc1sxXSwgbnVtYmVyc1sxXSwgbnVtYmVyc1syXSk7IFxuICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIHJldCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldDsgXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFdoZW4gZm91ciB2YWx1ZXMgYXJlIHNwZWNpZmllZCwgdGhlIHZhbHVlcyBhcHBseSB0byB0aGUgdG9wLCByaWdodCwgYm90dG9tLCBhbmQgbGVmdCBpbiB0aGF0IG9yZGVyIChjbG9ja3dpc2UpLlxuICAgICAgICAgICAgaWYgKG51bWJlcnMubGVuZ3RoID09PSA0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmV0ID0gQ2xpcFBhdGhVdGlsLmlzQ2xpcHBlZEJ5SW5zZXQoZWxlbSwgbnVtYmVyc1swXSwgbnVtYmVyc1sxXSwgbnVtYmVyc1syXSwgbnVtYmVyc1szXSk7IFxuICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIHJldCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgICAgIH0gICAgIFxuXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGluZGV4ID0gcGF0aC5pbmRleE9mKFwicmVjdChcIik7XG4gICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgIGxldCByb3VuZF9pbmRleCA9IHBhdGguaW5kZXhPZihcInJvdW5kXCIpO1xuICAgICAgICAgICAgbGV0IHN0ciA9IHBhdGguc3Vic3RyaW5nKHBhdGguaW5kZXhPZihcIihcIikrMSwgcGF0aC5pbmRleE9mKFwiKVwiKSk7XG4gICAgICAgICAgICBpZiAocm91bmRfaW5kZXggIT09IC0xKVxuICAgICAgICAgICAgICAgIHN0ciA9IHBhdGguc3Vic3RyaW5nKHBhdGguaW5kZXhPZihcIihcIikrMSwgcm91bmRfaW5kZXgpO1xuXG4gICAgICAgICAgICBsZXQgbnVtYmVycyA9IHN0ci50cmltKCkuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFRoZSBmaXJzdCAodG9wKSBhbmQgdGhpcmQgKGJvdHRvbSkgdmFsdWVzIGFyZSBkaXN0YW5jZXMgZnJvbSB0aGUgdG9wIGVkZ2Ugb2YgdGhlIGNvbnRhaW5pbmcgYmxvY2ssIFxuICAgICAgICAgICAgICogYW5kIHRoZSBzZWNvbmQgKHJpZ2h0KSBhbmQgZm91cnRoIChsZWZ0KSB2YWx1ZXMgYXJlIGRpc3RhbmNlcyBmcm9tIHRoZSBsZWZ0IGVkZ2Ugb2YgdGhlIGNvbnRhaW5pbmcgYmxvY2suIFxuICAgICAgICAgICAgICogVGhlIHNlY29uZCAocmlnaHQpIGFuZCB0aGlyZCAoYm90dG9tKSB2YWx1ZXMgYXJlIGNsYW1wZWQgYnkgdGhlIGZvdXJ0aCAobGVmdCkgYW5kIGZpcnN0ICh0b3ApIHZhbHVlcywgcmVzcGVjdGl2ZWx5LCBcbiAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgKiBJZiBhdXRvIGlzIHVzZWQgZm9yIHRoZSBmaXJzdCAodG9wKSBvciBmb3VydGggKGxlZnQpIHZhbHVlLCB0aGUgdmFsdWUgb2YgYXV0byBpcyAwLCBcbiAgICAgICAgICAgICAqIGFuZCBpZiB1c2VkIGZvciB0aGUgc2Vjb25kIChyaWdodCkgb3IgdGhpcmQgKGJvdHRvbSkgdmFsdWUsIHRoZSB2YWx1ZSBvZiBhdXRvIGlzIDEwMCUuXG4gICAgICAgICAgICAqL1xuICAgICAgICAgICAgaWYgKG51bWJlcnNbMF09PT0nYXV0bycpIG51bWJlcnNbMF0gPSAnMHB4JztcbiAgICAgICAgICAgIGlmIChudW1iZXJzWzNdPT09J2F1dG8nKSBudW1iZXJzWzNdID0gJzBweCc7XG4gICAgICAgICAgICBpZiAobnVtYmVyc1sxXT09PSdhdXRvJykgbnVtYmVyc1sxXSA9ICcxMDAlJztcbiAgICAgICAgICAgIGlmIChudW1iZXJzWzJdPT09J2F1dG8nKSBudW1iZXJzWzJdID0gJzEwMCUnO1xuXG4gICAgICAgICAgICAvLyB0byBwcmV2ZW50IHRoZSBib3R0b20gZWRnZSBmcm9tIGNyb3NzaW5nIG92ZXIgdGhlIHRvcCBlZGdlIGFuZCByaWdodCBlZGdlIGZyb20gY3Jvc3Npbmcgb3ZlciB0aGUgbGVmdCBlZGdlLiBcbiAgICAgICAgICAgIC8vIGZvciBleGFtcGxlLCByZWN0KDEwcHggMCAwIDIwcHgpIGlzIGNsYW1wZWQgdG8gcmVjdCgxMHB4IDIwcHggMTBweCAyMHB4KVxuICAgICAgICAgICAgbnVtYmVyc1syXSA9IE1hdGgubWF4KG51bWJlcnNbMF0sIG51bWJlcnNbMl0pO1xuICAgICAgICAgICAgbnVtYmVyc1sxXSA9IE1hdGgubWF4KG51bWJlcnNbMV0sIG51bWJlcnNbM10pXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGxldCB0b3AgPSBwYXJzZUludChudW1iZXJzWzBdKTtcbiAgICAgICAgICAgIGlmIChpc05hTih0b3ApKSB7XG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG51bWJlcnNbMF0uZW5kc1dpdGgoXCIlXCIpKVxuICAgICAgICAgICAgICAgIHRvcCA9IHRvcCAqIGhlaWdodC8xMDA7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgcGFpciA9IENTU1V0aWwuZ2V0VmFsdWVVbml0UGFpcih0b3ApO1xuICAgICAgICAgICAgICAgIGlmICghcGFpcikge1xuICAgICAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdG9wID0gQ1NTVXRpbC5jb252ZXJ0VmFsdWUyUGl4ZWxzKHBhaXJbMF0sIHBhaXJbMV0sIGVsZW0pO1xuICAgICAgICAgICAgfSBcbiAgICAgICAgICAgIGlmICh0b3AgPj0gaGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgbGV0IGxlZnQgPSBwYXJzZUludChudW1iZXJzWzNdKTtcbiAgICAgICAgICAgIGlmIChpc05hTihsZWZ0KSkge1xuICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChudW1iZXJzWzNdLmVuZHNXaXRoKFwiJVwiKSlcbiAgICAgICAgICAgICAgICBsZWZ0ID0gbGVmdCAqIHdpZHRoLzEwMDtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBwYWlyID0gQ1NTVXRpbC5nZXRWYWx1ZVVuaXRQYWlyKGxlZnQpO1xuICAgICAgICAgICAgICAgIGlmICghcGFpcikge1xuICAgICAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGVmdCA9IENTU1V0aWwuY29udmVydFZhbHVlMlBpeGVscyhwYWlyWzBdLCBwYWlyWzFdLCBlbGVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChsZWZ0ID49IHdpZHRoKSB7XG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IHJpZ2h0ID0gcGFyc2VJbnQobnVtYmVyc1sxXSk7XG4gICAgICAgICAgICBpZiAoaXNOYU4ocmlnaHQpKSB7XG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG51bWJlcnNbMV0uZW5kc1dpdGgoXCIlXCIpKVxuICAgICAgICAgICAgICAgIHJpZ2h0ID0gcmlnaHQgKiB3aWR0aC8xMDA7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgcGFpciA9IENTU1V0aWwuZ2V0VmFsdWVVbml0UGFpcihyaWdodCk7XG4gICAgICAgICAgICAgICAgaWYgKCFwYWlyKSB7XG4gICAgICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByaWdodCA9IENTU1V0aWwuY29udmVydFZhbHVlMlBpeGVscyhwYWlyWzBdLCBwYWlyWzFdLCBlbGVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgbGV0IGJvdHRvbSA9IHBhcnNlSW50KG51bWJlcnNbMl0pO1xuICAgICAgICAgICAgaWYgKGlzTmFOKGJvdHRvbSkpIHtcbiAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobnVtYmVyc1syXS5lbmRzV2l0aChcIiVcIikpXG4gICAgICAgICAgICAgICAgYm90dG9tID0gYm90dG9tICogaGVpZ2h0LzEwMDtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBwYWlyID0gQ1NTVXRpbC5nZXRWYWx1ZVVuaXRQYWlyKGJvdHRvbSk7XG4gICAgICAgICAgICAgICAgaWYgKCFwYWlyKSB7XG4gICAgICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBib3R0b20gPSBDU1NVdGlsLmNvbnZlcnRWYWx1ZTJQaXhlbHMocGFpclswXSwgcGFpclsxXSwgZWxlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmICgoYm90dG9tIC0gdG9wKSA8PSBDbGlwUGF0aFV0aWwuVEhSRVNIT0xEICB8fCAocmlnaHQgLSBsZWZ0KSA8PSBDbGlwUGF0aFV0aWwuVEhSRVNIT0xEKSB7XG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIGZhbHNlKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTsgICAgICAgICAgICAgICAgXG4gICAgICAgIH1cblxuICAgICAgICBpbmRleCA9IHBhdGguaW5kZXhPZihcInh5d2goXCIpO1xuICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICBsZXQgcm91bmRfaW5kZXggPSBwYXRoLmluZGV4T2YoXCJyb3VuZFwiKTtcbiAgICAgICAgICAgIGxldCBzdHIgPSBwYXRoLnN1YnN0cmluZyhwYXRoLmluZGV4T2YoXCIoXCIpKzEsIHBhdGguaW5kZXhPZihcIilcIikpO1xuICAgICAgICAgICAgaWYgKHJvdW5kX2luZGV4ICE9PSAtMSlcbiAgICAgICAgICAgICAgICBzdHIgPSBwYXRoLnN1YnN0cmluZyhwYXRoLmluZGV4T2YoXCIoXCIpKzEsIHJvdW5kX2luZGV4KTtcblxuICAgICAgICAgICAgbGV0IG51bWJlcnMgPSBzdHIudHJpbSgpLnNwbGl0KFwiIFwiKTtcblxuICAgICAgICAgICAgbGV0IHggPSBwYXJzZUludChudW1iZXJzWzBdKTtcbiAgICAgICAgICAgIGlmIChpc05hTih4KSkge1xuICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChudW1iZXJzWzBdLmVuZHNXaXRoKFwiJVwiKSlcbiAgICAgICAgICAgICAgICB4ID0geCAqIHdpZHRoLzEwMDtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBwYWlyID0gQ1NTVXRpbC5nZXRWYWx1ZVVuaXRQYWlyKHRvcCk7XG4gICAgICAgICAgICAgICAgaWYgKCFwYWlyKSB7XG4gICAgICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB4ID0gQ1NTVXRpbC5jb252ZXJ0VmFsdWUyUGl4ZWxzKHBhaXJbMF0sIHBhaXJbMV0sIGVsZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHggPj0gd2lkdGgpIHtcbiAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBsZXQgeSA9IHBhcnNlSW50KG51bWJlcnNbMV0pO1xuICAgICAgICAgICAgaWYgKGlzTmFOKHkpKSB7XG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKG51bWJlcnNbMV0uZW5kc1dpdGgoXCIlXCIpKVxuICAgICAgICAgICAgICAgIHkgPSB5ICogaGVpZ2h0LzEwMDtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBwYWlyID0gQ1NTVXRpbC5nZXRWYWx1ZVVuaXRQYWlyKHkpO1xuICAgICAgICAgICAgICAgIGlmICghcGFpcikge1xuICAgICAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2Nyb2xsWSA9IENTU1V0aWwuY29udmVydFZhbHVlMlBpeGVscyhwYWlyWzBdLCBwYWlyWzFdLCBlbGVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh5ID49IGhlaWdodCkge1xuICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCB3ID0gcGFyc2VJbnQobnVtYmVyc1syXSk7XG4gICAgICAgICAgICBpZiAoaXNOYU4odykpIHtcbiAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobnVtYmVyc1syXS5lbmRzV2l0aChcIiVcIikpXG4gICAgICAgICAgICAgICAgdyA9IHcgKiB3aWR0aC8xMDA7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgcGFpciA9IENTU1V0aWwuZ2V0VmFsdWVVbml0UGFpcih3KTtcbiAgICAgICAgICAgICAgICBpZiAoIXBhaXIpIHtcbiAgICAgICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHcgPSBDU1NVdGlsLmNvbnZlcnRWYWx1ZTJQaXhlbHMocGFpclswXSwgcGFpclsxXSwgZWxlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodyA8PSBDbGlwUGF0aFV0aWwuVEhSRVNIT0xEKSB7XG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGxldCBoID0gcGFyc2VJbnQobnVtYmVyc1szXSk7XG4gICAgICAgICAgICBpZiAoaXNOYU4oaCkpIHtcbiAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobnVtYmVyc1szXS5lbmRzV2l0aChcIiVcIikpXG4gICAgICAgICAgICAgICAgaCA9IGggKiBoZWlnaHQvMTAwO1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHBhaXIgPSBDU1NVdGlsLmdldFZhbHVlVW5pdFBhaXIoaCk7XG4gICAgICAgICAgICAgICAgaWYgKCFwYWlyKSB7XG4gICAgICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBoID0gQ1NTVXRpbC5jb252ZXJ0VmFsdWUyUGl4ZWxzKHBhaXJbMF0sIHBhaXJbMV0sIGVsZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoaCA8PSBDbGlwUGF0aFV0aWwuVEhSRVNIT0xEKSB7XG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCBmYWxzZSk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7ICAgICAgICAgICAgICAgIFxuICAgICAgICB9XG5cbiAgICAgICAgaW5kZXggPSBwYXRoLmluZGV4T2YoXCJjaXJjbGUoXCIpO1xuICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICBsZXQgc3RyID0gcGF0aC5zdWJzdHJpbmcocGF0aC5pbmRleE9mKFwiKFwiKSsxLCBwYXRoLmluZGV4T2YoXCIpXCIpKTtcbiAgICAgICAgICAgIGxldCBudW1iZXJzID0gc3RyLnRyaW0oKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGxldCByYWRpdXMgPSBwYXJzZUludChudW1iZXJzWzBdKTtcbiAgICAgICAgICAgIGlmIChpc05hTihyYWRpdXMpKSB7XG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG51bWJlcnNbMF0uZW5kc1dpdGgoXCIlXCIpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNob3J0ID0gd2lkdGggPiBoZWlnaHQgPyBoZWlnaHQgOiB3aWR0aDtcbiAgICAgICAgICAgICAgICByYWRpdXMgPSByYWRpdXMgKiBzaG9ydC8xMDA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhaXIgPSBDU1NVdGlsLmdldFZhbHVlVW5pdFBhaXIocmFkaXVzKTtcbiAgICAgICAgICAgICAgICBpZiAoIXBhaXIpIHtcbiAgICAgICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJhZGl1cyA9IENTU1V0aWwuY29udmVydFZhbHVlMlBpeGVscyhwYWlyWzBdLCBwYWlyWzFdLCBlbGVtKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHJhZGl1cyA8PSBDbGlwUGF0aFV0aWwuVEhSRVNIT0xEKSB7XG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIGZhbHNlKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTsgIFxuICAgICAgICB9ICAgIFxuICAgICAgICBcbiAgICAgICAgaW5kZXggPSBwYXRoLmluZGV4T2YoXCJlbGxpcHNlKFwiKTtcbiAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgbGV0IHN0ciA9IHBhdGguc3Vic3RyaW5nKHBhdGguaW5kZXhPZihcIihcIikrMSwgcGF0aC5pbmRleE9mKFwiKVwiKSk7XG4gICAgICAgICAgICBsZXQgbnVtYmVycyA9IHN0ci50cmltKCkuc3BsaXQoXCIgXCIpO1xuXG4gICAgICAgICAgICAvLyBlbGxpcHNlKGNsb3Nlc3Qtc2lkZSBmYXJ0aGVzdC1zaWRlIGF0IDMwJSA0MCUpO1xuICAgICAgICAgICAgaWYgKG51bWJlcnMubGVuZ3RoID4gMyAmJiBudW1iZXJzWzBdID09PSAnY2xvc2VzdC1zaWRlJyAmJiBudW1iZXJzWzFdID09PSAnZmFydGhlc3Qtc2lkZScgJiYgbnVtYmVyc1syXSA9PT0gJ2F0Jykge1xuICAgICAgICAgICAgICAgIGxldCByYWRpdXMgPSBwYXJzZUludChudW1iZXJzWzNdKTtcbiAgICAgICAgICAgICAgICBpZiAobnVtYmVycy5sZW5ndGggPT09IDQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG51bWJlcnNbM10uZW5kc1dpdGgoXCIlXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSB3aWR0aCA+IGhlaWdodCA/IGhlaWdodCA6IHdpZHRoO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmFkaXVzID0gcmFkaXVzICogdmFsdWUvMTAwO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFpciA9IENTU1V0aWwuZ2V0VmFsdWVVbml0UGFpcihyYWRpdXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYWlyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJhZGl1cyA9IENTU1V0aWwuY29udmVydFZhbHVlMlBpeGVscyhwYWlyWzBdLCBwYWlyWzFdLCBlbGVtKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAocmFkaXVzIDw9IENsaXBQYXRoVXRpbC5USFJFU0hPTEQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtYmVycy5sZW5ndGggPT09IDUpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaT0zOyBpIDwgbnVtYmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJhZGl1cyA9IHBhcnNlSW50KG51bWJlcnNbaV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bWJlcnNbaV0uZW5kc1dpdGgoXCIlXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gKGkgPT09IDMpID8gd2lkdGggOiBoZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFkaXVzID0gcmFkaXVzICogdmFsdWUvMTAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYWlyID0gQ1NTVXRpbC5nZXRWYWx1ZVVuaXRQYWlyKHJhZGl1cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYWlyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWRpdXMgPSBDU1NVdGlsLmNvbnZlcnRWYWx1ZTJQaXhlbHMocGFpclswXSwgcGFpclsxXSwgZWxlbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmFkaXVzIDw9IENsaXBQYXRoVXRpbC5USFJFU0hPTEQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB9ICAgICBcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBlbGxpcHNlKDQwJSA1MCUgYXQgbGVmdCk7XG4gICAgICAgICAgICBsZXQgYXRfaW5kZXggPSBwYXRoLmluZGV4T2YoXCJhdFwiKTtcbiAgICAgICAgICAgIHN0ciA9IHBhdGguc3Vic3RyaW5nKHBhdGguaW5kZXhPZihcIihcIikrMSwgcGF0aC5pbmRleE9mKFwiKVwiKSk7XG4gICAgICAgICAgICBpZiAoYXRfaW5kZXggIT09IC0xKVxuICAgICAgICAgICAgICAgIHN0ciA9IHBhdGguc3Vic3RyaW5nKHBhdGguaW5kZXhPZihcIihcIikrMSwgYXRfaW5kZXgpO1xuXG4gICAgICAgICAgICBudW1iZXJzID0gc3RyLnRyaW0oKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICBpZiAobnVtYmVycy5sZW5ndGggIT09IDIpIHtcbiAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBudW1iZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJhZGl1cyA9IHBhcnNlSW50KG51bWJlcnNbaV0pO1xuICAgICAgICAgICAgICAgIGlmIChudW1iZXJzW2ldLmVuZHNXaXRoKFwiJVwiKSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSAoaSA9PT0gMCkgPyB3aWR0aCA6IGhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgcmFkaXVzID0gcmFkaXVzICogdmFsdWUvMTAwO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhaXIgPSBDU1NVdGlsLmdldFZhbHVlVW5pdFBhaXIocmFkaXVzKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwYWlyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmFkaXVzID0gQ1NTVXRpbC5jb252ZXJ0VmFsdWUyUGl4ZWxzKHBhaXJbMF0sIHBhaXJbMV0sIGVsZW0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocmFkaXVzIDw9IENsaXBQYXRoVXRpbC5USFJFU0hPTEQpIHtcbiAgICAgICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfSAgICAgICAgICAgIFxuICAgICAgICAgICBcbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIGZhbHNlKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGluZGV4ID0gcGF0aC5pbmRleE9mKFwicG9seWdvbihcIik7XG4gICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgIGxldCBzdHIgPSBwYXRoLnN1YnN0cmluZyhwYXRoLmluZGV4T2YoXCIoXCIpKzEsIHBhdGguaW5kZXhPZihcIilcIikpO1xuICAgICAgICAgICAgbGV0IG51bWJlcnMgPSBzdHIudHJpbSgpLnNwbGl0KFwiLFwiKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gcG9seWdvbihub256ZXJvfGV2ZW5vZGQsIDAlIDAlLCA1MCUgNTAlLCAwJSAxMDAlKVxuICAgICAgICAgICAgaWYgKG51bWJlcnNbMF0gPT09ICdub256ZXJvJyB8fCBudW1iZXJzWzBdID09PSAnZXZlbm9kZCcpXG4gICAgICAgICAgICAgICAgbnVtYmVycy5zaGlmdCgpO1xuXG4gICAgICAgICAgICBsZXQgeSA9IDA7XG4gICAgICAgICAgICBsZXQgeCA9IDA7XG4gICAgICAgICAgICBsZXQgY2hhbmdlZF94ID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgY2hhbmdlZF95ID0gZmFsc2U7XG4gICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBudW1iZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNvb3JkaW5hdGVzID0gbnVtYmVyc1tpXS50cmltKCkuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgICAgIGlmIChjb29yZGluYXRlcy5sZW5ndGggIT0gMiApIHtcbiAgICAgICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IGNvb3JkaW5hdGVfeHkgPSBbMCwgMF07XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9MDsgaSA8IDI7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSBwYXJzZUludChjb29yZGluYXRlc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc05hTih2YWx1ZSkpIHJldHVybiBmYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoY29vcmRpbmF0ZXNbaV0uZW5kc1dpdGgoXCIlXCIpKVxuICAgICAgICAgICAgICAgICAgICAgICAgY29vcmRpbmF0ZV94eVtpXSA9IChpID09PSAwKSA/IHZhbHVlICogd2lkdGgvMTAwIDogdmFsdWUgKiBoZWlnaHQvMTAwO1xuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhaXIgPSBDU1NVdGlsLmdldFZhbHVlVW5pdFBhaXIoY29vcmRpbmF0ZXNbaV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYWlyKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb29yZGluYXRlX3h5W2ldID0gQ1NTVXRpbC5jb252ZXJ0VmFsdWUyUGl4ZWxzKHBhaXJbMF0sIHBhaXJbMV0sIGVsZW0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHggPSBjb29yZGluYXRlX3h5WzBdO1xuICAgICAgICAgICAgICAgICAgICB5ID0gY29vcmRpbmF0ZV94eVsxXTtcbiAgICAgICAgICAgICAgICB9IFxuXG4gICAgICAgICAgICAgICAgaWYgKE1hdGguYWJzKGNvb3JkaW5hdGVfeHlbMF0gLSB4KSA+PSBDbGlwUGF0aFV0aWwuVEhSRVNIT0xEKSBcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlZF94ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAoTWF0aC5hYnMoY29vcmRpbmF0ZV94eVsxXSAtIHkpID49IENsaXBQYXRoVXRpbC5USFJFU0hPTEQpIFxuICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkX3kgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNoYW5nZWRfeCAmJiBjaGFuZ2VkX3kpIHtcbiAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfSAgXG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9ICAgICAgXG5cbiAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaXNDbGlwcGVkQnlJbnNldChlbGVtLCB0b3AsIHJpZ2h0ID0gJzBweCcsIGJvdHRvbSA9ICcwcHgnLCBsZWZ0ID0gJzBweCcpIHtcbiAgICAgICAgY29uc3Qgc3R5bGUgPSBDU1NVdGlsLmdldENvbXB1dGVkU3R5bGUoZWxlbSk7XG4gICAgICAgIGNvbnN0IHdpZHRoID0gcGFyc2VJbnQoc3R5bGUud2lkdGgpOyAgLy9hbHdheXMgaW4gcHhcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gcGFyc2VJbnQoc3R5bGUuaGVpZ2h0KTsgLy9hbHdheXMgaW4gcHhcbiAgICAgICAgXG4gICAgICAgIC8vIHRvcFxuICAgICAgICBsZXQgdG9wX3ZhbHVlID0gcGFyc2VJbnQodG9wKTtcbiAgICAgICAgaWYgKGlzTmFOKHRvcF92YWx1ZSkpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBpZiAodG9wLmVuZHNXaXRoKFwiJVwiKSlcbiAgICAgICAgICAgIHRvcF92YWx1ZSA9IHRvcF92YWx1ZSAqIGhlaWdodC8xMDA7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcGFpciA9IENTU1V0aWwuZ2V0VmFsdWVVbml0UGFpcih0b3ApO1xuICAgICAgICAgICAgaWYgKCFwYWlyKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB0b3BfdmFsdWUgPSBDU1NVdGlsLmNvbnZlcnRWYWx1ZTJQaXhlbHMocGFpclswXSwgcGFpclsxXSwgZWxlbSk7XG4gICAgICAgIH1cblxuICAgICAgICAvL2luc2V0IG91dHNpZGUgb2YgdGhlIGNvbnRhaW5lclxuICAgICAgICBpZiAodG9wX3ZhbHVlID4gaGVpZ2h0KSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgLy8gcmlnaHRcbiAgICAgICAgbGV0IHJpZ2h0X3ZhbHVlID0gcGFyc2VJbnQocmlnaHQpO1xuICAgICAgICBpZiAoaXNOYU4ocmlnaHRfdmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgaWYgKHJpZ2h0LmVuZHNXaXRoKFwiJVwiKSlcbiAgICAgICAgICAgIHJpZ2h0X3ZhbHVlID0gcmlnaHRfdmFsdWUgKiB3aWR0aC8xMDA7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcGFpciA9IENTU1V0aWwuZ2V0VmFsdWVVbml0UGFpcihyaWdodCk7XG4gICAgICAgICAgICBpZiAoIXBhaXIpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIHJpZ2h0X3ZhbHVlID0gQ1NTVXRpbC5jb252ZXJ0VmFsdWUyUGl4ZWxzKHBhaXJbMF0sIHBhaXJbMV0sIGVsZW0pO1xuICAgICAgICB9XG4gICAgICAgIC8vaW5zZXQgb3V0c2lkZSBvZiB0aGUgY29udGFpbmVyXG4gICAgICAgIGlmIChyaWdodF92YWx1ZSA+IHdpZHRoKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgLy8gYm90dG9tXG4gICAgICAgIGxldCBib3R0b21fdmFsdWUgPSBwYXJzZUludChib3R0b20pO1xuICAgICAgICBpZiAoaXNOYU4oYm90dG9tX3ZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGlmIChib3R0b20uZW5kc1dpdGgoXCIlXCIpKVxuICAgICAgICAgICAgYm90dG9tX3ZhbHVlID0gYm90dG9tX3ZhbHVlICogaGVpZ2h0LzEwMDtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBwYWlyID0gQ1NTVXRpbC5nZXRWYWx1ZVVuaXRQYWlyKGJvdHRvbSk7XG4gICAgICAgICAgICBpZiAoIXBhaXIpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGJvdHRvbV92YWx1ZSA9IENTU1V0aWwuY29udmVydFZhbHVlMlBpeGVscyhwYWlyWzBdLCBwYWlyWzFdLCBlbGVtKTtcbiAgICAgICAgfVxuICAgICAgICAvL2luc2V0IG91dHNpZGUgb2YgdGhlIGNvbnRhaW5lclxuICAgICAgICBpZiAoYm90dG9tX3ZhbHVlID4gaGVpZ2h0KSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgLy8gbGVmdFxuICAgICAgICBsZXQgbGVmdF92YWx1ZSA9IHBhcnNlSW50KGxlZnQpO1xuICAgICAgICBpZiAoaXNOYU4obGVmdF92YWx1ZSkpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBpZiAobGVmdC5lbmRzV2l0aChcIiVcIikpXG4gICAgICAgICAgICBsZWZ0X3ZhbHVlID0gbGVmdF92YWx1ZSAqIHdpZHRoLzEwMDtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBwYWlyID0gQ1NTVXRpbC5nZXRWYWx1ZVVuaXRQYWlyKGxlZnQpO1xuICAgICAgICAgICAgaWYgKCFwYWlyKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBsZWZ0X3ZhbHVlID0gQ1NTVXRpbC5jb252ZXJ0VmFsdWUyUGl4ZWxzKHBhaXJbMF0sIHBhaXJbMV0sIGVsZW0pO1xuICAgICAgICB9XG4gICAgICAgIC8vaW5zZXQgb3V0c2lkZSBvZiB0aGUgY29udGFpbmVyXG4gICAgICAgIGlmIChsZWZ0X3ZhbHVlID4gd2lkdGgpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBpZiAoaGVpZ2h0IC0gKHRvcF92YWx1ZSArIGJvdHRvbV92YWx1ZSkgPD0gQ2xpcFBhdGhVdGlsLlRIUkVTSE9MRCAgfHwgd2lkdGggLSAocmlnaHRfdmFsdWUgKyBsZWZ0X3ZhbHVlKSA8PSBDbGlwUGF0aFV0aWwuVEhSRVNIT0xEKSBcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgIENvcHlyaWdodDo6IDIwMjAtIElCTSwgSW5jXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5cbmV4cG9ydCBjbGFzcyBDb2xvclV0aWwge1xuXG4gICAgcHVibGljIHN0YXRpYyBDU1NDb2xvckxvb2t1cCA9IHtcbiAgICAgICAgXCJhbGljZWJsdWVcIjogXCIjZjBmOGZmXCIsXG4gICAgICAgIFwiYW50aXF1ZXdoaXRlXCI6IFwiI2ZhZWJkN1wiLFxuICAgICAgICBcImFxdWFcIjogXCIjMDBmZmZmXCIsXG4gICAgICAgIFwiYXF1YW1hcmluZVwiOiBcIiM3ZmZmZDRcIixcbiAgICAgICAgXCJhenVyZVwiOiBcIiNmMGZmZmZcIixcbiAgICAgICAgXCJiZWlnZVwiOiBcIiNmNWY1ZGNcIixcbiAgICAgICAgXCJiaXNxdWVcIjogXCIjZmZlNGM0XCIsXG4gICAgICAgIFwiYmxhY2tcIjogXCIjMDAwMDAwXCIsXG4gICAgICAgIFwiYmxhbmNoZWRhbG1vbmRcIjogXCIjZmZlYmNkXCIsXG4gICAgICAgIFwiYmx1ZVwiOiBcIiMwMDAwZmZcIixcbiAgICAgICAgXCJibHVldmlvbGV0XCI6IFwiIzhhMmJlMlwiLFxuICAgICAgICBcImJyb3duXCI6IFwiI2E1MmEyYVwiLFxuICAgICAgICBcImJ1cmx5d29vZFwiOiBcIiNkZWI4ODdcIixcbiAgICAgICAgXCJjYWRldGJsdWVcIjogXCIjNWY5ZWEwXCIsXG4gICAgICAgIFwiY2hhcnRyZXVzZVwiOiBcIiM3ZmZmMDBcIixcbiAgICAgICAgXCJjaG9jb2xhdGVcIjogXCIjZDI2OTFlXCIsXG4gICAgICAgIFwiY29yYWxcIjogXCIjZmY3ZjUwXCIsXG4gICAgICAgIFwiY29ybmZsb3dlcmJsdWVcIjogXCIjNjQ5NWVkXCIsXG4gICAgICAgIFwiY29ybnNpbGtcIjogXCIjZmZmOGRjXCIsXG4gICAgICAgIFwiY3JpbXNvblwiOiBcIiNkYzE0M2NcIixcbiAgICAgICAgXCJjeWFuXCI6IFwiIzAwZmZmZlwiLFxuICAgICAgICBcImRhcmtibHVlXCI6IFwiIzAwMDA4YlwiLFxuICAgICAgICBcImRhcmtjeWFuXCI6IFwiIzAwOGI4YlwiLFxuICAgICAgICBcImRhcmtnb2xkZW5yb2RcIjogXCIjYjg4NjBiXCIsXG4gICAgICAgIFwiZGFya2dyYXlcIjogXCIjYTlhOWE5XCIsXG4gICAgICAgIFwiZGFya2dyZWVuXCI6IFwiIzAwNjQwMFwiLFxuICAgICAgICBcImRhcmtraGFraVwiOiBcIiNiZGI3NmJcIixcbiAgICAgICAgXCJkYXJrbWFnZW50YVwiOiBcIiM4YjAwOGJcIixcbiAgICAgICAgXCJkYXJrb2xpdmVncmVlblwiOiBcIiM1NTZiMmZcIixcbiAgICAgICAgXCJkYXJrb3JhbmdlXCI6IFwiI2ZmOGMwMFwiLFxuICAgICAgICBcImRhcmtvcmNoaWRcIjogXCIjOTkzMmNjXCIsXG4gICAgICAgIFwiZGFya3JlZFwiOiBcIiM4YjAwMDBcIixcbiAgICAgICAgXCJkYXJrc2FsbW9uXCI6IFwiI2U5OTY3YVwiLFxuICAgICAgICBcImRhcmtzZWFncmVlblwiOiBcIiM4ZmJjOGZcIixcbiAgICAgICAgXCJkYXJrc2xhdGVibHVlXCI6IFwiIzQ4M2Q4YlwiLFxuICAgICAgICBcImRhcmtzbGF0ZWdyYXlcIjogXCIjMmY0ZjRmXCIsXG4gICAgICAgIFwiZGFya3R1cnF1b2lzZVwiOiBcIiMwMGNlZDFcIixcbiAgICAgICAgXCJkYXJrdmlvbGV0XCI6IFwiIzk0MDBkM1wiLFxuICAgICAgICBcImRlZXBwaW5rXCI6IFwiI2ZmMTQ5M1wiLFxuICAgICAgICBcImRlZXBza3libHVlXCI6IFwiIzAwYmZmZlwiLFxuICAgICAgICBcImRpbWdyYXlcIjogXCIjNjk2OTY5XCIsXG4gICAgICAgIFwiZG9kZ2VyYmx1ZVwiOiBcIiMxZTkwZmZcIixcbiAgICAgICAgXCJmaXJlYnJpY2tcIjogXCIjYjIyMjIyXCIsXG4gICAgICAgIFwiZmxvcmFsd2hpdGVcIjogXCIjZmZmYWYwXCIsXG4gICAgICAgIFwiZm9yZXN0Z3JlZW5cIjogXCIjMjI4YjIyXCIsXG4gICAgICAgIFwiZnVjaHNpYVwiOiBcIiNmZjAwZmZcIixcbiAgICAgICAgXCJnYWluc2Jvcm9cIjogXCIjZGNkY2RjXCIsXG4gICAgICAgIFwiZ2hvc3R3aGl0ZVwiOiBcIiNmOGY4ZmZcIixcbiAgICAgICAgXCJnb2xkXCI6IFwiI2ZmZDcwMFwiLFxuICAgICAgICBcImdvbGRlbnJvZFwiOiBcIiNkYWE1MjBcIixcbiAgICAgICAgXCJncmF5XCI6IFwiIzgwODA4MFwiLFxuICAgICAgICBcImdyZWVuXCI6IFwiIzAwODAwMFwiLFxuICAgICAgICBcImdyZWVueWVsbG93XCI6IFwiI2FkZmYyZlwiLFxuICAgICAgICBcImhvbmV5ZGV3XCI6IFwiI2YwZmZmMFwiLFxuICAgICAgICBcImhvdHBpbmtcIjogXCIjZmY2OWI0XCIsXG4gICAgICAgIFwiaW5kaWFucmVkXCI6IFwiI2NkNWM1Y1wiLFxuICAgICAgICBcImluZGlnb1wiOiBcIiM0YjAwODJcIixcbiAgICAgICAgXCJpdm9yeVwiOiBcIiNmZmZmZjBcIixcbiAgICAgICAgXCJraGFraVwiOiBcIiNmMGU2OGNcIixcbiAgICAgICAgXCJsYXZlbmRlclwiOiBcIiNlNmU2ZmFcIixcbiAgICAgICAgXCJsYXZlbmRlcmJsdXNoXCI6IFwiI2ZmZjBmNVwiLFxuICAgICAgICBcImxhd25ncmVlblwiOiBcIiM3Y2ZjMDBcIixcbiAgICAgICAgXCJsZW1vbmNoaWZmb25cIjogXCIjZmZmYWNkXCIsXG4gICAgICAgIFwibGlnaHRibHVlXCI6IFwiI2FkZDhlNlwiLFxuICAgICAgICBcImxpZ2h0Y29yYWxcIjogXCIjZjA4MDgwXCIsXG4gICAgICAgIFwibGlnaHRjeWFuXCI6IFwiI2UwZmZmZlwiLFxuICAgICAgICBcImxpZ2h0Z29sZGVucm9keWVsbG93XCI6IFwiI2ZhZmFkMlwiLFxuICAgICAgICBcImxpZ2h0Z3JleVwiOiBcIiNkM2QzZDNcIixcbiAgICAgICAgXCJsaWdodGdyZWVuXCI6IFwiIzkwZWU5MFwiLFxuICAgICAgICBcImxpZ2h0cGlua1wiOiBcIiNmZmI2YzFcIixcbiAgICAgICAgXCJsaWdodHNhbG1vblwiOiBcIiNmZmEwN2FcIixcbiAgICAgICAgXCJsaWdodHNlYWdyZWVuXCI6IFwiIzIwYjJhYVwiLFxuICAgICAgICBcImxpZ2h0c2t5Ymx1ZVwiOiBcIiM4N2NlZmFcIixcbiAgICAgICAgXCJsaWdodHNsYXRlZ3JheVwiOiBcIiM3Nzg4OTlcIixcbiAgICAgICAgXCJsaWdodHN0ZWVsYmx1ZVwiOiBcIiNiMGM0ZGVcIixcbiAgICAgICAgXCJsaWdodHllbGxvd1wiOiBcIiNmZmZmZTBcIixcbiAgICAgICAgXCJsaW1lXCI6IFwiIzAwZmYwMFwiLFxuICAgICAgICBcImxpbWVncmVlblwiOiBcIiMzMmNkMzJcIixcbiAgICAgICAgXCJsaW5lblwiOiBcIiNmYWYwZTZcIixcbiAgICAgICAgXCJtYWdlbnRhXCI6IFwiI2ZmMDBmZlwiLFxuICAgICAgICBcIm1hcm9vblwiOiBcIiM4MDAwMDBcIixcbiAgICAgICAgXCJtZWRpdW1hcXVhbWFyaW5lXCI6IFwiIzY2Y2RhYVwiLFxuICAgICAgICBcIm1lZGl1bWJsdWVcIjogXCIjMDAwMGNkXCIsXG4gICAgICAgIFwibWVkaXVtb3JjaGlkXCI6IFwiI2JhNTVkM1wiLFxuICAgICAgICBcIm1lZGl1bXB1cnBsZVwiOiBcIiM5MzcwZDhcIixcbiAgICAgICAgXCJtZWRpdW1zZWFncmVlblwiOiBcIiMzY2IzNzFcIixcbiAgICAgICAgXCJtZWRpdW1zbGF0ZWJsdWVcIjogXCIjN2I2OGVlXCIsXG4gICAgICAgIFwibWVkaXVtc3ByaW5nZ3JlZW5cIjogXCIjMDBmYTlhXCIsXG4gICAgICAgIFwibWVkaXVtdHVycXVvaXNlXCI6IFwiIzQ4ZDFjY1wiLFxuICAgICAgICBcIm1lZGl1bXZpb2xldHJlZFwiOiBcIiNjNzE1ODVcIixcbiAgICAgICAgXCJtaWRuaWdodGJsdWVcIjogXCIjMTkxOTcwXCIsXG4gICAgICAgIFwibWludGNyZWFtXCI6IFwiI2Y1ZmZmYVwiLFxuICAgICAgICBcIm1pc3R5cm9zZVwiOiBcIiNmZmU0ZTFcIixcbiAgICAgICAgXCJtb2NjYXNpblwiOiBcIiNmZmU0YjVcIixcbiAgICAgICAgXCJuYXZham93aGl0ZVwiOiBcIiNmZmRlYWRcIixcbiAgICAgICAgXCJuYXZ5XCI6IFwiIzAwMDA4MFwiLFxuICAgICAgICBcIm9sZGxhY2VcIjogXCIjZmRmNWU2XCIsXG4gICAgICAgIFwib2xpdmVcIjogXCIjODA4MDAwXCIsXG4gICAgICAgIFwib2xpdmVkcmFiXCI6IFwiIzZiOGUyM1wiLFxuICAgICAgICBcIm9yYW5nZVwiOiBcIiNmZmE1MDBcIixcbiAgICAgICAgXCJvcmFuZ2VyZWRcIjogXCIjZmY0NTAwXCIsXG4gICAgICAgIFwib3JjaGlkXCI6IFwiI2RhNzBkNlwiLFxuICAgICAgICBcInBhbGVnb2xkZW5yb2RcIjogXCIjZWVlOGFhXCIsXG4gICAgICAgIFwicGFsZWdyZWVuXCI6IFwiIzk4ZmI5OFwiLFxuICAgICAgICBcInBhbGV0dXJxdW9pc2VcIjogXCIjYWZlZWVlXCIsXG4gICAgICAgIFwicGFsZXZpb2xldHJlZFwiOiBcIiNkODcwOTNcIixcbiAgICAgICAgXCJwYXBheWF3aGlwXCI6IFwiI2ZmZWZkNVwiLFxuICAgICAgICBcInBlYWNocHVmZlwiOiBcIiNmZmRhYjlcIixcbiAgICAgICAgXCJwZXJ1XCI6IFwiI2NkODUzZlwiLFxuICAgICAgICBcInBpbmtcIjogXCIjZmZjMGNiXCIsXG4gICAgICAgIFwicGx1bVwiOiBcIiNkZGEwZGRcIixcbiAgICAgICAgXCJwb3dkZXJibHVlXCI6IFwiI2IwZTBlNlwiLFxuICAgICAgICBcInB1cnBsZVwiOiBcIiM4MDAwODBcIixcbiAgICAgICAgXCJyZWRcIjogXCIjZmYwMDAwXCIsXG4gICAgICAgIFwicm9zeWJyb3duXCI6IFwiI2JjOGY4ZlwiLFxuICAgICAgICBcInJveWFsYmx1ZVwiOiBcIiM0MTY5ZTFcIixcbiAgICAgICAgXCJzYWRkbGVicm93blwiOiBcIiM4YjQ1MTNcIixcbiAgICAgICAgXCJzYWxtb25cIjogXCIjZmE4MDcyXCIsXG4gICAgICAgIFwic2FuZHlicm93blwiOiBcIiNmNGE0NjBcIixcbiAgICAgICAgXCJzZWFncmVlblwiOiBcIiMyZThiNTdcIixcbiAgICAgICAgXCJzZWFzaGVsbFwiOiBcIiNmZmY1ZWVcIixcbiAgICAgICAgXCJzaWVubmFcIjogXCIjYTA1MjJkXCIsXG4gICAgICAgIFwic2lsdmVyXCI6IFwiI2MwYzBjMFwiLFxuICAgICAgICBcInNreWJsdWVcIjogXCIjODdjZWViXCIsXG4gICAgICAgIFwic2xhdGVibHVlXCI6IFwiIzZhNWFjZFwiLFxuICAgICAgICBcInNsYXRlZ3JheVwiOiBcIiM3MDgwOTBcIixcbiAgICAgICAgXCJzbm93XCI6IFwiI2ZmZmFmYVwiLFxuICAgICAgICBcInNwcmluZ2dyZWVuXCI6IFwiIzAwZmY3ZlwiLFxuICAgICAgICBcInN0ZWVsYmx1ZVwiOiBcIiM0NjgyYjRcIixcbiAgICAgICAgXCJ0YW5cIjogXCIjZDJiNDhjXCIsXG4gICAgICAgIFwidGVhbFwiOiBcIiMwMDgwODBcIixcbiAgICAgICAgXCJ0aGlzdGxlXCI6IFwiI2Q4YmZkOFwiLFxuICAgICAgICBcInRvbWF0b1wiOiBcIiNmZjYzNDdcIixcbiAgICAgICAgXCJ0dXJxdW9pc2VcIjogXCIjNDBlMGQwXCIsXG4gICAgICAgIFwidmlvbGV0XCI6IFwiI2VlODJlZVwiLFxuICAgICAgICBcIndoZWF0XCI6IFwiI2Y1ZGViM1wiLFxuICAgICAgICBcIndoaXRlXCI6IFwiI2ZmZmZmZlwiLFxuICAgICAgICBcIndoaXRlc21va2VcIjogXCIjZjVmNWY1XCIsXG4gICAgICAgIFwieWVsbG93XCI6IFwiI2ZmZmYwMFwiLFxuICAgICAgICBcInllbGxvd2dyZWVuXCI6IFwiIzlhY2QzMlwiLFxuICAgICAgICBcImJ1dHRvbnRleHRcIjogXCJyZ2JhKDAsIDAsIDAsIDAuODQ3KVwiLFxuICAgICAgICBcImJ1dHRvbmZhY2VcIjogXCIjZmZmZmZmXCIsXG4gICAgICAgIFwiZ3JheXRleHRcIjogXCJyZ2JhKDAsIDAsIDAsIDAuMjQ3KVwiXG4gICAgfVxuXG5cbiAgICAvLyBSZXdyaXRlIHRoZSBjb2xvciBvYmplY3QgdG8gYWNjb3VudCBmb3IgYWxwaGFcbiAgICBwdWJsaWMgc3RhdGljIENvbG9yKGNzc1N0eWxlQ29sb3IpIHtcbiAgICAgICAgaWYgKCFjc3NTdHlsZUNvbG9yKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY3NzU3R5bGVDb2xvciA9IGNzc1N0eWxlQ29sb3IudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKGNzc1N0eWxlQ29sb3IgPT09IFwidHJhbnNwYXJlbnRcIikgcmV0dXJuIG5ldyBDb2xvck9iaigyNTUsIDI1NSwgMjU1LCAwKTtcbiAgICAgICAgaWYgKGNzc1N0eWxlQ29sb3IgaW4gQ29sb3JVdGlsLkNTU0NvbG9yTG9va3VwKVxuICAgICAgICAgICAgY3NzU3R5bGVDb2xvciA9IENvbG9yVXRpbC5DU1NDb2xvckxvb2t1cFtjc3NTdHlsZUNvbG9yXTtcbiAgICAgICAgaWYgKGNzc1N0eWxlQ29sb3Iuc3RhcnRzV2l0aChcInJnYihcIikpIHtcbiAgICAgICAgICAgIGxldCByZ2JSZWdleCA9IC9cXHMqcmdiXFxzKlxcKFxccyooXFxkKylcXHMqLFxccyooXFxkKylcXHMqLFxccyooXFxkKylcXHMqXFwpLztcbiAgICAgICAgICAgIGxldCBtID0gY3NzU3R5bGVDb2xvci5tYXRjaChyZ2JSZWdleCk7XG4gICAgICAgICAgICBpZiAobSA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbG9yT2JqKG1bMV0sIG1bMl0sIG1bM10pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGNzc1N0eWxlQ29sb3Iuc3RhcnRzV2l0aChcInJnYmEoXCIpKSB7XG4gICAgICAgICAgICBsZXQgcmdiUmVnZXggPSAvXFxzKnJnYmFcXHMqXFwoXFxzKihcXGQrKVxccyosXFxzKihcXGQrKVxccyosXFxzKihcXGQrKVxccyosXFxzKiguKylcXHMqXFwpLztcbiAgICAgICAgICAgIGxldCBtID0gY3NzU3R5bGVDb2xvci5tYXRjaChyZ2JSZWdleCk7XG4gICAgICAgICAgICBpZiAobSA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbG9yT2JqKG1bMV0sIG1bMl0sIG1bM10sIG1bNF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGNzc1N0eWxlQ29sb3IuY2hhckF0KDApICE9IFwiI1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChjc3NTdHlsZUNvbG9yLmxlbmd0aCA9PT0gNCkge1xuICAgICAgICAgICAgICAgIC8vIFRoZSB0aHJlZS1kaWdpdCBSR0IgKCNyZ2IpIGlzIGNvbnZlcnRlZCB0byBzaXgtZGlnaXQgZm9ybSAoI3JyZ2diYikgYnkgcmVwbGljYXRpbmcgZGlnaXRzXG4gICAgICAgICAgICAgICAgLy8gKGh0dHBzOi8vd3d3LnczLm9yZy9UUi9jc3MtY29sb3ItMy8jcmdiLWNvbG9yKVxuICAgICAgICAgICAgICAgIGNzc1N0eWxlQ29sb3IgPSBcIiNcIiArIGNzc1N0eWxlQ29sb3IuY2hhckF0KDEpLnJlcGVhdCgyKSArXG4gICAgICAgICAgICAgICAgICAgIGNzc1N0eWxlQ29sb3IuY2hhckF0KDIpLnJlcGVhdCgyKSArXG4gICAgICAgICAgICAgICAgICAgIGNzc1N0eWxlQ29sb3IuY2hhckF0KDMpLnJlcGVhdCgyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCB0aGlzUmVkID0gcGFyc2VJbnQoY3NzU3R5bGVDb2xvci5zdWJzdHJpbmcoMSwgMyksIDE2KTtcbiAgICAgICAgICAgIGxldCB0aGlzR3JlZW4gPSBwYXJzZUludChjc3NTdHlsZUNvbG9yLnN1YnN0cmluZygzLCA1KSwgMTYpO1xuICAgICAgICAgICAgbGV0IHRoaXNCbHVlID0gcGFyc2VJbnQoY3NzU3R5bGVDb2xvci5zdWJzdHJpbmcoNSwgNyksIDE2KTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQ29sb3JPYmoodGhpc1JlZCwgdGhpc0dyZWVuLCB0aGlzQmx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gICAgcmV0dXJuIG51bGw7IC8vIFVucmVhY2hhYmxlXG4gICAgfTtcblxuIHB1YmxpYyBzdGF0aWMgQ29sb3JDb21ibyhydWxlQ29udGV4dCA6IEhUTUxFbGVtZW50KSB7XG4gICAgdHJ5IHsgXG4gICAgICAgIHZhciBkb2MgPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50O1xuICAgICAgICBpZiAoIWRvYykge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHdpbiA9IGRvYy5kZWZhdWx0VmlldztcbiAgICAgICAgaWYgKCF3aW4pIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGFuY2VzdG9ycyA9IFtdO1xuICAgICAgICBsZXQgd2Fsa05vZGUgOiBFbGVtZW50ID0gcnVsZUNvbnRleHQ7XG4gICAgICAgIHdoaWxlICh3YWxrTm9kZSkge1xuICAgICAgICAgICAgaWYgKHdhbGtOb2RlLm5vZGVUeXBlID09PSAxKSBcbiAgICAgICAgICAgICAgICBhbmNlc3RvcnMucHVzaCh3YWxrTm9kZSk7XG4gICAgICAgICAgICB3YWxrTm9kZSA9IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KHdhbGtOb2RlKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgdmFyIHJldFZhbCA9IHtcbiAgICAgICAgICAgIFwiaGFzR3JhZGllbnRcIjogZmFsc2UsXG4gICAgICAgICAgICBcImhhc0JHSW1hZ2VcIjogZmFsc2UsXG4gICAgICAgICAgICBcInRleHRTaGFkb3dcIjogZmFsc2UsXG4gICAgICAgICAgICBcImZnXCI6IG51bGwsXG4gICAgICAgICAgICBcImJnXCI6IG51bGxcbiAgICAgICAgfTtcbiAgICAgICAgXG4gICAgICAgIC8vIHN0YXJ0XG4gICAgICAgIHZhciBjU3R5bGUgPSB3aW4uZ2V0Q29tcHV0ZWRTdHlsZShydWxlQ29udGV4dCk7XG4gICAgICAgIHZhciBjb21wU3R5bGVDb2xvciA9IGNTdHlsZS5jb2xvcjtcbiAgICAgICAgaWYgKCFjb21wU3R5bGVDb2xvcilcbiAgICAgICAgICAgIGNvbXBTdHlsZUNvbG9yID0gXCJibGFja1wiO1xuICAgICAgICB2YXIgZmcgPSBDb2xvclV0aWwuQ29sb3IoY29tcFN0eWxlQ29sb3IpO1xuICAgICAgICB2YXIgcmVDb2xvciA9IC90cmFuc3BhcmVudHxyZ2JhP1xcKFteKV0rXFwpL2dpO1xuICAgICAgICB2YXIgZ3Vlc3NHcmFkQ29sb3IgPSBmdW5jdGlvbiAoZ3JhZExpc3QsIGJnQ29sb3IsIGZnQ29sb3IpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUncyBvbmx5IG9uZSBjb2xvciwgcmV0dXJuIHRoYXRcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGdyYWRMaXN0Lmxlbmd0aCA9PT0gXCJ1bmRlZmluZWRcIilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdyYWRMaXN0O1xuXG4gICAgICAgICAgICAgICAgdmFyIG92ZXJhbGxXb3JzdCA9IG51bGw7XG4gICAgICAgICAgICAgICAgdmFyIG92ZXJhbGxXb3JzdFJhdGlvID0gbnVsbDtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpR3JhZCA9IDE7IGlHcmFkIDwgZ3JhZExpc3QubGVuZ3RoOyArK2lHcmFkKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB3b3JzdENvbG9yID0gZ3JhZExpc3RbaUdyYWQgLSAxXTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHdvcnN0UmF0aW8gPSBmZ0NvbG9yLmNvbnRyYXN0UmF0aW8oZ3JhZExpc3RbaUdyYWQgLSAxXSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzdGVwID0gLjE7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpZHggPSAwO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoc3RlcCA+IC4wMDAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaWR4ICsgc3RlcCA8PSAxICYmIHdvcnN0UmF0aW8gPiBmZ0NvbG9yLmNvbnRyYXN0UmF0aW8oZ3JhZExpc3RbaUdyYWRdLm1peChncmFkTGlzdFtpR3JhZCAtIDFdLCBpZHggKyBzdGVwKS5nZXRPdmVybGF5Q29sb3IoYmdDb2xvcikpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yc3RDb2xvciA9IGdyYWRMaXN0W2lHcmFkXS5taXgoZ3JhZExpc3RbaUdyYWQgLSAxXSwgaWR4ICsgc3RlcCkuZ2V0T3ZlcmxheUNvbG9yKGJnQ29sb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcnN0UmF0aW8gPSBmZ0NvbG9yLmNvbnRyYXN0UmF0aW8od29yc3RDb2xvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWR4ID0gaWR4ICsgc3RlcDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChpZHggLSBzdGVwID49IDAgJiYgd29yc3RSYXRpbyA+IGZnQ29sb3IuY29udHJhc3RSYXRpbyhncmFkTGlzdFtpR3JhZF0ubWl4KGdyYWRMaXN0W2lHcmFkIC0gMV0sIGlkeCAtIHN0ZXApLmdldE92ZXJsYXlDb2xvcihiZ0NvbG9yKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JzdENvbG9yID0gZ3JhZExpc3RbaUdyYWRdLm1peChncmFkTGlzdFtpR3JhZCAtIDFdLCBpZHggLSBzdGVwKS5nZXRPdmVybGF5Q29sb3IoYmdDb2xvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yc3RSYXRpbyA9IGZnQ29sb3IuY29udHJhc3RSYXRpbyh3b3JzdENvbG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZHggPSBpZHggLSBzdGVwO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgc3RlcCA9IHN0ZXAgLyAxMDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAob3ZlcmFsbFdvcnN0UmF0aW8gPT09IG51bGwgfHwgb3ZlcmFsbFdvcnN0UmF0aW8gPiB3b3JzdFJhdGlvKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvdmVyYWxsV29yc3RSYXRpbyA9IHdvcnN0UmF0aW87XG4gICAgICAgICAgICAgICAgICAgICAgICBvdmVyYWxsV29yc3QgPSB3b3JzdENvbG9yO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBvdmVyYWxsV29yc3Q7IC8vIHJldHVybiB0aGUgZGFya2VzdCBjb2xvclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGJnQ29sb3I7XG4gICAgICAgIH07XG5cbiAgICAgICAgdmFyIHByaW9yU3RhY2tCRyA9IENvbG9yVXRpbC5Db2xvcihcIndoaXRlXCIpO1xuICAgICAgICB2YXIgdGhpc1N0YWNrT3BhY2l0eSA9IG51bGw7XG4gICAgICAgIHZhciB0aGlzU3RhY2tBbHBoYSA9IG51bGw7XG4gICAgICAgIHZhciB0aGlzU3RhY2tCRyA9IG51bGw7XG4gICAgICAgIC8vIEFuY2VzdG9ycyBwcm9jZXNzZWQgZnJvbSB0aGUgdG9wbW9zdCBwYXJlbnQgdG93YXJkIHRoZSBjaGlsZFxuICAgICAgICB3aGlsZSAoYW5jZXN0b3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHZhciBwcm9jTmV4dCA9IGFuY2VzdG9ycy5wb3AoKTtcbiAgICAgICAgICAgIC8vdmFyIHByb2NOZXh0ID0gYW5jZXN0b3JzLnNwbGljZSgwLCAxKVswXTtcbiAgICAgICAgICAgIC8vIGNTdHlsZSBpcyB0aGUgY29tcHV0ZWQgc3R5bGUgb2YgdGhpcyBsYXllclxuICAgICAgICAgICAgdmFyIGNTdHlsZSA9IHdpbi5nZXRDb21wdXRlZFN0eWxlKHByb2NOZXh0KTtcbiAgICAgICAgICAgIGlmIChjU3R5bGUgPT09IG51bGwpIGNvbnRpbnVlO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyB0aGlzQmdDb2xvciBpcyB0aGUgY29sb3Igb2YgdGhpcyBsYXllciBvciBudWxsIGlmIHRoZSBsYXllciBpcyB0cmFuc3BhcmVudFxuICAgICAgICAgICAgdmFyIHRoaXNCZ0NvbG9yID0gbnVsbDtcbiAgICAgICAgICAgIGlmIChjU3R5bGUuYmFja2dyb3VuZENvbG9yICYmIGNTdHlsZS5iYWNrZ3JvdW5kQ29sb3IgIT0gXCJ0cmFuc3BhcmVudFwiICYmIGNTdHlsZS5iYWNrZ3JvdW5kQ29sb3IgIT0gXCJyZ2JhKDAsIDAsIDAsIDApXCIpIHtcbiAgICAgICAgICAgICAgICB0aGlzQmdDb2xvciA9IENvbG9yVXRpbC5Db2xvcihjU3R5bGUuYmFja2dyb3VuZENvbG9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIGEgZ3JhZGllbnQgaW52b2x2ZWQsIHNldCB0aGlzQmdDb2xvciB0byB0aGUgd29yc3QgY29sb3IgY29tYmluYXRpb24gYXZhaWxhYmxlIGFnYWluc3QgdGhlIGZvcmVncm91bmRcbiAgICAgICAgICAgIGlmIChjU3R5bGUuYmFja2dyb3VuZEltYWdlICYmIGNTdHlsZS5iYWNrZ3JvdW5kSW1hZ2UuaW5kZXhPZiAmJiBjU3R5bGUuYmFja2dyb3VuZEltYWdlLmluZGV4T2YoXCJncmFkaWVudFwiKSAhPSAtMSkge1xuICAgICAgICAgICAgICAgIHZhciBncmFkQ29sb3JzIDogc3RyaW5nW10gPSBjU3R5bGUuYmFja2dyb3VuZEltYWdlLm1hdGNoKHJlQ29sb3IpO1xuICAgICAgICAgICAgICAgIGlmIChncmFkQ29sb3JzKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBncmFkQ29sb3JDb21wIDogQ29sb3JPYmpbXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdyYWRDb2xvcnMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZ3JhZENvbG9yc1tpXS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFkQ29sb3JzLnNwbGljZShpLS0sIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29sb3JDb21wID0gQ29sb3JVdGlsLkNvbG9yKGdyYWRDb2xvcnNbaV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2xvckNvbXAuYWxwaGEgIT09IHVuZGVmaW5lZCAmJiBjb2xvckNvbXAuYWxwaGEgPCAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1peCB0aGUgZ3JkaWVudCBiZyBjb2xvciB3aXQgcGFyZW50IGJnIGlmIGFscGhhIDwgMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29tcFN0YWNrQmcgPSB0aGlzU3RhY2tCRyB8fCBwcmlvclN0YWNrQkc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yQ29tcCA9IGNvbG9yQ29tcC5nZXRPdmVybGF5Q29sb3IoY29tcFN0YWNrQmcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFkQ29sb3JDb21wLnB1c2goY29sb3JDb21wKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzQmdDb2xvciA9IGd1ZXNzR3JhZENvbG9yKGdyYWRDb2xvckNvbXAsIHRoaXNTdGFja0JHIHx8IHByaW9yU3RhY2tCRywgZmcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gSGFuZGxlIG5vbi1zb2xpZCBvcGFjaXR5XG4gICAgICAgICAgICBpZiAodGhpc1N0YWNrT3BhY2l0eSA9PT0gbnVsbCB8fCAoY1N0eWxlLm9wYWNpdHkgJiYgY1N0eWxlLm9wYWNpdHkubGVuZ3RoID4gMCAmJiBwYXJzZUZsb2F0KGNTdHlsZS5vcGFjaXR5KSA8IDEpKSB7XG4gICAgICAgICAgICAgICAgLy8gTmV3IHN0YWNrLCByZXNldFxuICAgICAgICAgICAgICAgIGlmICh0aGlzU3RhY2tCRyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE92ZXJsYXlcbiAgICAgICAgICAgICAgICAgICAgdGhpc1N0YWNrQkcuYWxwaGEgPSB0aGlzU3RhY2tPcGFjaXR5ICogdGhpc1N0YWNrQWxwaGE7XG4gICAgICAgICAgICAgICAgICAgIHByaW9yU3RhY2tCRyA9IHRoaXNTdGFja0JHLmdldE92ZXJsYXlDb2xvcihwcmlvclN0YWNrQkcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzU3RhY2tPcGFjaXR5ID0gMS4wO1xuICAgICAgICAgICAgICAgIHRoaXNTdGFja0FscGhhID0gbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzU3RhY2tCRyA9IG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKGNTdHlsZS5vcGFjaXR5ICYmIGNTdHlsZS5vcGFjaXR5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpc1N0YWNrT3BhY2l0eSA9IHBhcnNlRmxvYXQoY1N0eWxlLm9wYWNpdHkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGhpc0JnQ29sb3IgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzU3RhY2tCRyA9IHRoaXNCZ0NvbG9yO1xuICAgICAgICAgICAgICAgICAgICB0aGlzU3RhY2tBbHBoYSA9IHRoaXNTdGFja0JHLmFscGhhIHx8IDEuMDtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXNTdGFja0JHLmFscGhhO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpc1N0YWNrT3BhY2l0eSA9PT0gMS4wICYmIHRoaXNTdGFja0FscGhhID09PSAxLjApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5oYXNCR0ltYWdlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuaGFzR3JhZGllbnQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEhhbmRsZSBzb2xpZCBjb2xvciBiYWNrZ3JvdW5kcyBhbmQgZ3JhZGllbnQgY29sb3IgYmFja2dyb3VuZHNcbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXNCZ0NvbG9yICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIHN0YWNrIGFscmVhZHkgaGFzIGEgYmFja2dyb3VuZCBjb2xvciwgYmxlbmQgaXRcbiAgICAgICAgICAgICAgICBpZiAodGhpc1N0YWNrQkcgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpc1N0YWNrQkcgPSB0aGlzQmdDb2xvcjtcbiAgICAgICAgICAgICAgICAgICAgdGhpc1N0YWNrQWxwaGEgPSB0aGlzU3RhY2tCRy5hbHBoYSB8fCAxLjA7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzU3RhY2tCRy5hbHBoYTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzU3RhY2tCRyA9IHRoaXNCZ0NvbG9yLmdldE92ZXJsYXlDb2xvcih0aGlzU3RhY2tCRyk7XG4gICAgICAgICAgICAgICAgICAgIC8vdGhpc1N0YWNrQWxwaGEgPSB0aGlzQmdDb2xvci5hbHBoYSB8fCAxLjA7XG4gICAgICAgICAgICAgICAgICAgIHRoaXNTdGFja0FscGhhID0gdGhpc1N0YWNrQkcuYWxwaGEgfHwgMS4wO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyAjNTI2OiBJZiB0aGlzQmdDb2xvciBoYWQgYW4gYWxwaGEgdmFsdWUsIGl0IG1heSBub3QgZXhwb3NlIHRocm91Z2ggdGhpc1N0YWNrQkcgaW4gdGhlIGFib3ZlIGNvZGVcbiAgICAgICAgICAgICAgICAvLyBXZSBjYW4ndCB3aXBlIG91dCB0aGUgZ3JhZGllbnQgaW5mbyBpZiB0aGlzIGxheWVyIHdhcyB0cmFuc3BhcmVudFxuICAgICAgICAgICAgICAgIGlmICh0aGlzU3RhY2tPcGFjaXR5ID09PSAxLjAgJiYgdGhpc1N0YWNrQWxwaGEgPT09IDEuMCAmJiAodGhpc1N0YWNrQkcuYWxwaGEgfHwgMS4wKSA9PT0gMS4wICYmICh0aGlzQmdDb2xvci5hbHBoYSB8fCAxLjApID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbC5oYXNCR0ltYWdlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbC5oYXNHcmFkaWVudCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjU3R5bGUuYmFja2dyb3VuZEltYWdlICYmIGNTdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgIT0gXCJub25lXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoY1N0eWxlLmJhY2tncm91bmRJbWFnZS5pbmRleE9mICYmIGNTdHlsZS5iYWNrZ3JvdW5kSW1hZ2UuaW5kZXhPZihcImdyYWRpZW50XCIpICE9IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbC5oYXNHcmFkaWVudCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsLmhhc0JHSW1hZ2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpc1N0YWNrQkcgIT0gbnVsbCkge1xuICAgICAgICAgICAgZmcgPSBmZy5nZXRPdmVybGF5Q29sb3IodGhpc1N0YWNrQkcpO1xuICAgICAgICAgICAgZGVsZXRlIGZnLmFscGhhO1xuICAgICAgICB9XG4gICAgICAgIGZnLmFscGhhID0gKGZnLmFscGhhIHx8IDEpICogdGhpc1N0YWNrT3BhY2l0eTtcbiAgICAgICAgZmcgPSBmZy5nZXRPdmVybGF5Q29sb3IocHJpb3JTdGFja0JHKTtcbiAgICAgICAgaWYgKHRoaXNTdGFja0JHICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXNTdGFja0JHLmFscGhhID0gdGhpc1N0YWNrT3BhY2l0eSAqIHRoaXNTdGFja0FscGhhO1xuICAgICAgICAgICAgcHJpb3JTdGFja0JHID0gdGhpc1N0YWNrQkcuZ2V0T3ZlcmxheUNvbG9yKHByaW9yU3RhY2tCRyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0VmFsLmZnID0gZmc7XG4gICAgICAgIHJldFZhbC5iZyA9IHByaW9yU3RhY2tCRztcblxuICAgICAgICBpZiAoY1N0eWxlLnRleHRTaGFkb3cgJiYgY1N0eWxlLnRleHRTaGFkb3cgIT09ICdub25lJylcbiAgICAgICAgICAgIHJldFZhbC50ZXh0U2hhZG93ID0gdHJ1ZTtcblxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAvLyBzb21ldGhpbmcgaGFwcGVuZWQsIHRoZW4uLi5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuIH07XG59XG5cbmV4cG9ydCBjbGFzcyBDb2xvck9iaiB7XG4gICAgcmVkIDogbnVtYmVyO1xuICAgIGdyZWVuIDogbnVtYmVyO1xuICAgIGJsdWUgOiBudW1iZXI7XG4gICAgYWxwaGEgOiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3RvcihyZWQgOiBzdHJpbmcgfCBudW1iZXIsIGdyZWVuIDogc3RyaW5nIHwgbnVtYmVyLCBibHVlIDogc3RyaW5nIHwgbnVtYmVyLCBhbHBoYT8gOiBzdHJpbmcgfCBudW1iZXIpIHtcbiAgICAgICAgZnVuY3Rpb24gZml4Q29tcG9uZW50KGNvbXAgOiBzdHJpbmcgfCBudW1iZXIpIDogbnVtYmVyIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgKGNvbXApICE9IHR5cGVvZiAoXCJcIikpIHJldHVybiBjb21wIGFzIG51bWJlcjtcbiAgICAgICAgICAgIGxldCBjb21wU3RyID0gY29tcCBhcyBzdHJpbmc7XG4gICAgICAgICAgICBjb21wU3RyID0gY29tcFN0ci50cmltKCk7XG4gICAgICAgICAgICBpZiAoY29tcFN0cltjb21wU3RyLmxlbmd0aCAtIDFdICE9IFwiJVwiKSByZXR1cm4gcGFyc2VJbnQoY29tcFN0cik7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChwYXJzZUZsb2F0KGNvbXBTdHIuc3Vic3RyaW5nKDAsIGNvbXBTdHIubGVuZ3RoIC0gMSkpICogMi41NSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZWQgPSBmaXhDb21wb25lbnQocmVkKTtcbiAgICAgICAgdGhpcy5ncmVlbiA9IGZpeENvbXBvbmVudChncmVlbik7XG4gICAgICAgIHRoaXMuYmx1ZSA9IGZpeENvbXBvbmVudChibHVlKTtcbiAgICAgICAgaWYgKHR5cGVvZiAoYWxwaGEpICE9IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHRoaXMuYWxwaGEgPSAodHlwZW9mIChhbHBoYSkgPT09IHR5cGVvZiAoXCJcIikpID8gcGFyc2VGbG9hdChhbHBoYSBhcyBzdHJpbmcpIDogYWxwaGEgYXMgbnVtYmVyO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdG9IZXhIZWxwKHZhbHVlIDogbnVtYmVyKSA6IHN0cmluZyB7XG4gICAgICAgIGxldCByZXRWYWwgPSBNYXRoLnJvdW5kKHZhbHVlKS50b1N0cmluZygxNik7XG4gICAgICAgIGlmIChyZXRWYWwubGVuZ3RoID09PSAxKVxuICAgICAgICAgICAgcmV0dXJuIFwiMFwiICsgcmV0VmFsO1xuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH07XG5cbiAgICB0b0hleCgpIDogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIFwiI1wiICsgdGhpcy50b0hleEhlbHAodGhpcy5yZWQpICsgdGhpcy50b0hleEhlbHAodGhpcy5ncmVlbikgKyB0aGlzLnRvSGV4SGVscCh0aGlzLmJsdWUpO1xuICAgIH07XG5cbiAgICBjb250cmFzdFJhdGlvKGJnQ29sb3IgOiBDb2xvck9iaikgeyBcbiAgICAgICAgbGV0IGZnQ29sb3I6IENvbG9yT2JqID0gdGhpcztcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgKHRoaXMuYWxwaGEpICE9IFwidW5kZWZpbmVkXCIpXG4gICAgICAgICAgICBmZ0NvbG9yID0gdGhpcy5nZXRPdmVybGF5Q29sb3IoYmdDb2xvcik7XG4gICAgICAgICAgICAgXG4gICAgICAgIGxldCBsdW0xID0gZmdDb2xvci5yZWxhdGl2ZUx1bWluYW5jZSgpO1xuICAgICAgICBpZiAoIWJnQ29sb3IucmVsYXRpdmVMdW1pbmFuY2UpIHtcbiAgICAgICAgICAgIGxldCBzID0gXCJcIjtcbiAgICAgICAgICAgIGZvciAobGV0IGtleSBpbiBiZ0NvbG9yKSB7XG4gICAgICAgICAgICAgICAgcyArPSBrZXkgKyBcIlxcblwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYWxlcnQoYmdDb2xvcik7XG4gICAgICAgICAgICBhbGVydChzKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbHVtMiA9IGJnQ29sb3IucmVsYXRpdmVMdW1pbmFuY2UoKTtcbiAgICAgICAgbGV0IHJhdGlvID0gKGx1bTEgPiBsdW0yKSA/IChsdW0xICsgLjA1KSAvIChsdW0yICsgLjA1KSA6IChsdW0yICsgLjA1KSAvIChsdW0xICsgLjA1KTtcbiAgICAgICAgcmV0dXJuIHJhdGlvO1xuICAgIH07XG5cbiAgICByZWxhdGl2ZUx1bWluYW5jZSgpIDogbnVtYmVyIHtcbiAgICAgICAgbGV0IFIgPSB0aGlzLnJlZCAvIDI1NS4wO1xuICAgICAgICBsZXQgRyA9IHRoaXMuZ3JlZW4gLyAyNTUuMDtcbiAgICAgICAgbGV0IEIgPSB0aGlzLmJsdWUgLyAyNTUuMDtcbiAgICAgICAgUiA9IFIgPD0gLjA0MDQ1ID8gUiAvIDEyLjkyIDogTWF0aC5wb3coKFIgKyAuMDU1KSAvIDEuMDU1LCAyLjQpO1xuICAgICAgICBHID0gRyA8PSAuMDQwNDUgPyBHIC8gMTIuOTIgOiBNYXRoLnBvdygoRyArIC4wNTUpIC8gMS4wNTUsIDIuNCk7XG4gICAgICAgIEIgPSBCIDw9IC4wNDA0NSA/IEIgLyAxMi45MiA6IE1hdGgucG93KChCICsgLjA1NSkgLyAxLjA1NSwgMi40KTtcbiAgICAgICAgcmV0dXJuIDAuMjEyNiAqIFIgKyAwLjcxNTIgKiBHICsgMC4wNzIyICogQjtcbiAgICB9O1xuXG4gICAgbWl4KGNvbG9yMiA6IENvbG9yT2JqLCBwZXJjVGhpcyA6IG51bWJlcikge1xuICAgICAgICBpZiAodHlwZW9mICh0aGlzLmFscGhhKSA9PT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2YgKGNvbG9yMi5hbHBoYSkgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQ29sb3JPYmooXG4gICAgICAgICAgICAgICAgcGVyY1RoaXMgKiB0aGlzLnJlZCArICgxIC0gcGVyY1RoaXMpICogY29sb3IyLnJlZCxcbiAgICAgICAgICAgICAgICBwZXJjVGhpcyAqIHRoaXMuZ3JlZW4gKyAoMSAtIHBlcmNUaGlzKSAqIGNvbG9yMi5ncmVlbixcbiAgICAgICAgICAgICAgICBwZXJjVGhpcyAqIHRoaXMuYmx1ZSArICgxIC0gcGVyY1RoaXMpICogY29sb3IyLmJsdWVcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgYWxwaGFUaGlzID0gdGhpcy5hbHBoYSA/IHRoaXMuYWxwaGEgOiAxO1xuICAgICAgICAgICAgbGV0IGFscGhhT3RoZXIgPSBjb2xvcjIuYWxwaGEgPyBjb2xvcjIuYWxwaGEgOiAxO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBDb2xvck9iaihcbiAgICAgICAgICAgICAgICBwZXJjVGhpcyAqIHRoaXMucmVkICsgKDEgLSBwZXJjVGhpcykgKiBjb2xvcjIucmVkLFxuICAgICAgICAgICAgICAgIHBlcmNUaGlzICogdGhpcy5ncmVlbiArICgxIC0gcGVyY1RoaXMpICogY29sb3IyLmdyZWVuLFxuICAgICAgICAgICAgICAgIHBlcmNUaGlzICogdGhpcy5ibHVlICsgKDEgLSBwZXJjVGhpcykgKiBjb2xvcjIuYmx1ZSxcbiAgICAgICAgICAgICAgICBwZXJjVGhpcyAqIGFscGhhVGhpcyArICgxIC0gcGVyY1RoaXMpICogYWxwaGFPdGhlclxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBnZXRPdmVybGF5Q29sb3IoYmdDb2xvciA6IENvbG9yT2JqKSB7XG4gICAgICAgIGlmICh0eXBlb2YgKHRoaXMuYWxwaGEpID09PSBcInVuZGVmaW5lZFwiIHx8IHRoaXMuYWxwaGEgPj0gMSkge1xuICAgICAgICAgICAgLy8gTm8gbWl4aW5nIHJlcXVpcmVkIC0gaXQncyBvcGFxdWVcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmFscGhhIDwgMCkge1xuICAgICAgICAgICAgLy9cdFx0SGFhYy5FcnJvci5sb2dFcnJvcihcIkludmFsaWQgYWxwaGEgdmFsdWVcIik7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIChiZ0NvbG9yLmFscGhhKSAhPSBcInVuZGVmaW5lZFwiICYmIGJnQ29sb3IuYWxwaGEgPCAxKSB7XG4gICAgICAgICAgICAvL1x0XHRIYWFjLkVycm9yLmxvZ0Vycm9yKFwiQ2Fubm90IG1peCB3aXRoIGEgYmFja2dyb3VuZCBhbHBoYVwiKTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZXRWYWwgPSB0aGlzLm1peChiZ0NvbG9yLCB0aGlzLmFscGhhKTtcbiAgICAgICAgZGVsZXRlIHJldFZhbC5hbHBoYTsgXG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmcm9tQ1NTQ29sb3IoY3NzU3R5bGVDb2xvcikge1xuICAgICAgICBsZXQgdGhpc1JlZCA9IC0xO1xuICAgICAgICBsZXQgdGhpc0dyZWVuID0gLTE7XG4gICAgICAgIGxldCB0aGlzQmx1ZSA9IC0xO1xuXG4gICAgICAgIGNzc1N0eWxlQ29sb3IgPSBjc3NTdHlsZUNvbG9yLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChjc3NTdHlsZUNvbG9yLnN0YXJ0c1dpdGgoXCJyZ2IoXCIpKSB7XG4gICAgICAgICAgICBsZXQgcmdiUmVnZXggPSAvXFxzKnJnYlxccypcXChcXHMqKFxcZCspXFxzKixcXHMqKFxcZCspXFxzKixcXHMqKFxcZCspXFxzKlxcKS87XG4gICAgICAgICAgICBsZXQgbSA9IGNzc1N0eWxlQ29sb3IubWF0Y2gocmdiUmVnZXgpO1xuICAgICAgICAgICAgaWYgKG0gPT09IG51bGwpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpc1JlZCA9IG1bMV07XG4gICAgICAgICAgICAgICAgdGhpc0dyZWVuID0gbVsyXTtcbiAgICAgICAgICAgICAgICB0aGlzQmx1ZSA9IG1bM107XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoY3NzU3R5bGVDb2xvci5zdGFydHNXaXRoKFwicmdiYShcIikpIHtcbiAgICAgICAgICAgIGxldCByZ2JSZWdleCA9IC9cXHMqcmdiYVxccypcXChcXHMqKFxcZCspXFxzKixcXHMqKFxcZCspXFxzKixcXHMqKFxcZCspXFxzKixcXHMqKC4rKVxccypcXCkvO1xuICAgICAgICAgICAgbGV0IG0gPSBjc3NTdHlsZUNvbG9yLm1hdGNoKHJnYlJlZ2V4KTtcbiAgICAgICAgICAgIGlmIChtID09PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXNSZWQgPSBtWzFdO1xuICAgICAgICAgICAgICAgIHRoaXNHcmVlbiA9IG1bMl07XG4gICAgICAgICAgICAgICAgdGhpc0JsdWUgPSBtWzNdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGNzc1N0eWxlQ29sb3IuY2hhckF0KDApICE9IFwiI1wiKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNzc1N0eWxlQ29sb3IgaW4gQ29sb3JVdGlsLkNTU0NvbG9yTG9va3VwKVxuICAgICAgICAgICAgICAgICAgICBjc3NTdHlsZUNvbG9yID0gQ29sb3JVdGlsLkNTU0NvbG9yTG9va3VwW2Nzc1N0eWxlQ29sb3JdO1xuICAgICAgICAgICAgICAgIGVsc2UgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgZnJvbUhleCA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgICAgICAgICAgICBsZXQgbG9va3VwID0ge1xuICAgICAgICAgICAgICAgICAgICBcImFcIjogMTAsXG4gICAgICAgICAgICAgICAgICAgIFwiYlwiOiAxMSxcbiAgICAgICAgICAgICAgICAgICAgXCJjXCI6IDEyLFxuICAgICAgICAgICAgICAgICAgICBcImRcIjogMTMsXG4gICAgICAgICAgICAgICAgICAgIFwiZVwiOiAxNCxcbiAgICAgICAgICAgICAgICAgICAgXCJmXCI6IDE1XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBsZXQgcmV0VmFsID0gMDtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbC5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICByZXRWYWwgPSByZXRWYWwgKiAxNiArXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJzZUludCh2YWwuY2hhckF0KGkpIGluIGxvb2t1cCA/IGxvb2t1cFt2YWwuY2hhckF0KGkpXSA6IHZhbC5jaGFyQXQoaSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNzc1N0eWxlQ29sb3IubGVuZ3RoID09PSA0KSB7XG4gICAgICAgICAgICAgICAgLy8gVGhlIHRocmVlLWRpZ2l0IFJHQiAoI3JnYikgaXMgY29udmVydGVkIHRvIHNpeC1kaWdpdCBmb3JtICgjcnJnZ2JiKSBieSByZXBsaWNhdGluZyBkaWdpdHNcbiAgICAgICAgICAgICAgICAvLyAoaHR0cHM6Ly93d3cudzMub3JnL1RSL2Nzcy1jb2xvci0zLyNyZ2ItY29sb3IpXG4gICAgICAgICAgICAgICAgY3NzU3R5bGVDb2xvciA9IFwiI1wiICsgY3NzU3R5bGVDb2xvci5jaGFyQXQoMSkucmVwZWF0KDIpICtcbiAgICAgICAgICAgICAgICAgICAgY3NzU3R5bGVDb2xvci5jaGFyQXQoMikucmVwZWF0KDIpICtcbiAgICAgICAgICAgICAgICAgICAgY3NzU3R5bGVDb2xvci5jaGFyQXQoMykucmVwZWF0KDIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpc1JlZCA9IGZyb21IZXgoY3NzU3R5bGVDb2xvci5zdWJzdHJpbmcoMSwgMykpO1xuICAgICAgICAgICAgdGhpc0dyZWVuID0gZnJvbUhleChjc3NTdHlsZUNvbG9yLnN1YnN0cmluZygzLCA1KSk7XG4gICAgICAgICAgICB0aGlzQmx1ZSA9IGZyb21IZXgoY3NzU3R5bGVDb2xvci5zdWJzdHJpbmcoNSwgNykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgQ29sb3JPYmoodGhpc1JlZCwgdGhpc0dyZWVuLCB0aGlzQmx1ZSk7XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IEFSSUFEZWZpbml0aW9ucyB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFEZWZpbml0aW9uc1wiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4vQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4vQXJpYVV0aWxcIjtcbmltcG9ydCB7IEFjY05hbWVVdGlsIH0gZnJvbSBcIi4vQWNjTmFtZVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi9WaXNVdGlsXCI7XG5pbXBvcnQgeyBET01VdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01VdGlsXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG5cbmV4cG9ydCBjbGFzcyBDb21tb25VdGlsIHtcblxuICAgIHB1YmxpYyBzdGF0aWMgaW5wdXRfdHlwZV93aXRoX3BsYWNlaG9sZGVyID0gW1widGV4dFwiLCBcInNlYXJjaFwiLCBcInRlbFwiLCBcInVybFwiLCBcImVtYWlsXCIsIFwicGFzc3dvcmRcIiwgXCJudW1iZXJcIl07XG4gICAgcHVibGljIHN0YXRpYyBpbnB1dF90ZXh0X3R5cGVzID0gW1xuICAgICAgICBcInRleHRcIiwgXCJmaWxlXCIsIFwicGFzc3dvcmRcIixcbiAgICAgICAgXCJjaGVja2JveFwiLCBcInJhZGlvXCIsXG4gICAgICAgIFwic2VhcmNoXCIsIFwidGVsXCIsIFwidXJsXCIsIFwiZW1haWxcIiwgIC8vSFRNTCA1LiBOb3RlOiB0eXBlID0gXCJoaWRkZW5cIiBkb2Vzbid0IHJlcXVpcmUgdGV4dFxuICAgICAgICBcImRhdGVcIiwgXCJudW1iZXJcIiwgXCJyYW5nZVwiLFxuICAgICAgICBcInRpbWVcIiwgXCJjb2xvclwiXG4gICAgXTtcbiAgICBwdWJsaWMgc3RhdGljIGlucHV0X3RpbWVfdHlwZXMgPSBbXG4gICAgICAgIFwiZGF0ZVwiLCBcIm1vbnRoXCIsIFwid2Vla1wiLCBcInRpbWVcIiwgXCJkYXRldGltZS1sb2NhbFwiXG4gICAgXTtcbiAgICBwdWJsaWMgc3RhdGljIGlucHV0X290aGVyX3R5cGVzID0gW1xuICAgICAgICBcInJhbmdlXCIsIFwiY29sb3JcIiwgXCJjaGVja2JveFwiLCBcInJhZGlvXCIsIFwiZmlsZVwiLCBcImltYWdlXCJcbiAgICBdO1xuICAgIHB1YmxpYyBzdGF0aWMgZm9ybV9idXR0b25fdHlwZXMgPSBbXG4gICAgICAgIFwiYnV0dG9uXCIsIFwicmVzZXRcIiwgXCJzdWJtaXRcIlxuICAgIF07XG5cbiAgICBwdWJsaWMgc3RhdGljIGZvcm1fbGFiZWxhYmxlX2VsZW1lbnRzID0gW1wiaW5wdXRcIiwgIFwidGV4dGFyZWFcIiwgXCJzZWxlY3RcIiwgXCJrZXlnZW5cIiwgXCJwcm9ncmVzc1wiLCBcIm1ldGVyXCIsIFwib3V0cHV0XCIsIFwiYnV0dG9uXCJdO1xuXG4gICAgcHVibGljIHN0YXRpYyB0YWJUYWdNYXAgPSB7XG4gICAgICAgIFwiYnV0dG9uXCI6IGZ1bmN0aW9uIChlbGVtZW50KTogYm9vbGVhbiB7XG4gICAgICAgICAgICByZXR1cm4gIWVsZW1lbnQuaGFzQXR0cmlidXRlKFwiZGlzYWJsZWRcIik7XG4gICAgICAgIH0sXG4gICAgICAgIFwiaWZyYW1lXCI6IHRydWUsXG4gICAgICAgIFwiaW5wdXRcIjogZnVuY3Rpb24gKGVsZW1lbnQpOiBib29sZWFuIHtcbiAgICAgICAgICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZShcImRpc2FibGVkXCIpIHx8IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwidHlwZVwiKSA9PT0gXCJoaWRkZW5cIikgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwidHlwZVwiKSA9PT0gXCJyYWRpb1wiKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwibmFtZVwiKTtcbiAgICAgICAgICAgICAgICBpZiAoIW5hbWUgfHwgbmFtZS50cmltKCkubGVuZ3RoID09PSAwKSByZXR1cm4gdHJ1ZTsgLy9zaW5nbGUgcmFkaW8sIG5vIGdyb3VwXG4gICAgICAgICAgICAgICAgbGV0IGRvYyA9IGVsZW1lbnQub3duZXJEb2N1bWVudDtcbiAgICAgICAgICAgICAgICBjb25zdCBncm91cCA9IGRvYy5xdWVyeVNlbGVjdG9yQWxsKFwiaW5wdXRbdHlwZT0ncmFkaW8nXVtuYW1lPSdcIiArIG5hbWUudHJpbSgpICtcIiddXCIpO1xuICAgICAgICAgICAgICAgIGlmIChncm91cC5sZW5ndGggPT09IDAgfHwgZ3JvdXAubGVuZ3RoID09PSAxKSByZXR1cm4gdHJ1ZTsgIC8vc2luZ2xlIHJhZGlvIHdpdGggdGhlIG5hbWUsIG5vIG90aGVycyBpbiBncm91cFxuXG4gICAgICAgICAgICAgICAgbGV0IGNoZWNrZWQgPSBudWxsO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZ3JvdXAubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKChncm91cFtpXSBhcyBIVE1MSW5wdXRFbGVtZW50KS5jaGVja2VkKVxuICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tlZCA9IGdyb3VwW2ldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvL29ubHkgbGFzdCBvbmUgYXBwbGllcyBpZiBtdWx0aXBsZSByYWRpb3Mgd2l0aCAnY2hlY2tlZCcgYXR0cmlidXRlc1xuICAgICAgICAgICAgICAgIGlmIChjaGVja2VkICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChET01VdGlsLnNhbWVOb2RlKGNoZWNrZWQsIGVsZW1lbnQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiBub3RoaW5nIGNoZWNrZWQgeWV0LCByZXR1cm4gdHJ1ZSBpZiBpdCdzIHRoZSBmaXJzdCBlbGVtZW50XG4gICAgICAgICAgICAgICAgICAgIGlmIChET01VdGlsLnNhbWVOb2RlKGdyb3VwWzBdLCBlbGVtZW50KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlICAgXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0sXG4gICAgICAgIFwic2VsZWN0XCI6IGZ1bmN0aW9uIChlbGVtZW50KTogYm9vbGVhbiB7XG4gICAgICAgICAgICByZXR1cm4gIWVsZW1lbnQuaGFzQXR0cmlidXRlKFwiZGlzYWJsZWRcIik7XG4gICAgICAgIH0sXG4gICAgICAgIFwidGV4dGFyZWFcIjogZnVuY3Rpb24gKGVsZW1lbnQpOiBib29sZWFuIHtcbiAgICAgICAgICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZShcImRpc2FibGVkXCIpIHx8IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwidHlwZVwiKSA9PT0gXCJoaWRkZW5cIikgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlwiZGl2XCI6IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJjb250ZW50ZWRpdGFibGVcIik7XG4gICAgICAgIH0sKi9cbiAgICAgICAgXCJhXCI6IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgICAgICAvLyB4bGluazpocmVmPz8gc2VlIHN2Z1xuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuaGFzQXR0cmlidXRlKFwiaHJlZlwiKTtcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmVhXCI6IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJocmVmXCIpO1xuICAgICAgICB9LFxuICAgICAgICBcImF1ZGlvXCI6IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJjb250cm9sc1wiKTtcbiAgICAgICAgfSxcbiAgICAgICAgXCJ2aWRlb1wiOiBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuaGFzQXR0cmlidXRlKFwiY29udHJvbHNcIik7XG4gICAgICAgIH0sXG4gICAgICAgIFwic3VtbWFyeVwiOiBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgICAgLy8gZmlyc3Qgc3VtbWFyeSBjaGlsZCBvZiBhIGRldGFpbHMgZWxlbWVudCBpcyBhdXRvbWF0aWNhbGx5IGZvY3VzYWJsZSBcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50LnBhcmVudEVsZW1lbnQgJiYgZWxlbWVudC5wYXJlbnRFbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdkZXRhaWxzJ1xuICAgICAgICAgICAgICAgICYmIERPTVV0aWwuc2FtZU5vZGUoWy4uLmVsZW1lbnQucGFyZW50RWxlbWVudC5jaGlsZHJlbl0uZmlsdGVyKGVsZW0gPT4gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnc3VtbWFyeScpWzBdLCBlbGVtZW50KTtcbiAgICAgICAgfSxcbiAgICAgICAgXCJkZXRhaWxzXCI6IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgICAgICAvL2RldGFpbHMgZWxlbWVudCB3aXRob3V0IGEgZGlyZWN0IHN1bW1hcnkgY2hpbGQgaXMgYXV0b21hdGljYWxseSBmb2N1c2FibGVcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50LmNoaWxkcmVuICYmIFsuLi5lbGVtZW50LmNoaWxkcmVuXS5maWx0ZXIoZWxlbSA9PiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdzdW1tYXJ5JykubGVuZ3RoID09PSAwO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyB3b3JkQ291bnQoc3RyKTogbnVtYmVyIHtcbiAgICAgICAgc3RyID0gc3RyLnRyaW0oKTtcbiAgICAgICAgaWYgKHN0ci5sZW5ndGggPT09IDApIHJldHVybiAwO1xuICAgICAgICByZXR1cm4gc3RyLnNwbGl0KC9cXHMrL2cpLmxlbmd0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBOb3RlIHRoYXQgdGhpcyBvbmx5IGRldGVjdHMgaWYgdGhlIGVsZW1lbnQgaXRzZWxmIGlzIGluIHRoZSB0YWIgb3JkZXIuXG4gICAgICogSG93ZXZlciwgdGhpcyBlbGVtZW50IG1heSBkZWxlZ2F0ZSBmb2N1cyB0byBhbm90aGVyIGVsZW1lbnQgdmlhIGFyaWEtYWN0aXZlZGVzY2VuZGFudC5cbiAgICAgKiBBbHNvLCBmb2N1cyB2YXJpZXMgYnkgYnJvd3Nlci4uLiBzdGlja2luZyB0byB0aGluZ3MgdGhhdCBhcmUgZm9jdXNhYmxlIG9uIENocm9tZSBhbmQgRmlyZWZveC5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzVGFiYmFibGUoZWxlbWVudCkge1xuICAgICAgICAvLyBVc2luZyBodHRwczovL2FsbHlqcy5pby9kYXRhLXRhYmxlcy9mb2N1c2FibGUuaHRtbFxuICAgICAgICAvLyBIYW5kbGUgdGhlIGV4cGxpY2l0IGNhc2VzIGZpcnN0XG4gICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKGVsZW1lbnQpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZShcImluZXJ0XCIpIHx8IERPTVV0aWwuZ2V0QW5jZXN0b3JXaXRoQXR0cmlidXRlKGVsZW1lbnQsIFwiaW5lcnRcIiwgXCJcIikpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKFwidGFiaW5kZXhcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZUludChlbGVtZW50LmdldEF0dHJpYnV0ZShcInRhYmluZGV4XCIpKSA+PSAwO1xuICAgICAgICB9XG4gICAgICAgIC8vIEV4cGxpY2l0IGNhc2VzIGhhbmRsZWQgLSBub3cgdGhlIGltcGxpY2l0XG4gICAgICAgIGxldCBub2RlTmFtZSA9IGVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKG5vZGVOYW1lIGluIENvbW1vblV0aWwudGFiVGFnTWFwKSB7XG4gICAgICAgICAgICBsZXQgcmV0VmFsID0gQ29tbW9uVXRpbC50YWJUYWdNYXBbbm9kZU5hbWVdO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiAocmV0VmFsKSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgcmV0VmFsID0gcmV0VmFsKGVsZW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZShcImNvbnRlbnRlZGl0YWJsZVwiKSkgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUZXN0IGlmIHRoZSBlbGUgbm9kZSBpcyBmb2N1c2FibGVcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzRm9jdXNhYmxlKGVsZSkge1xuICAgICAgICBpZiAoZWxlID09PSBcInVuZGVmaW5lZFwiIHx8IGVsZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBDb21tb25VdGlsLmlzVGFiYmFibGUoZWxlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBOb3RlIHRoYXQgdGhpcyBvbmx5IGRldGVjdHMgaWYgdGhlIGVsZW1lbnQgaXRzZWxmIGlzIGludGVyYWN0aXZlLCBidXQgbm90IG9uY2xpY2sgZXZlbnQuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpc0NsaWNrYWJsZShlbGVtZW50KSB7XG4gICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKGVsZW1lbnQpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIFxuICAgICAgICAvLyBuYXRpdmUgZm9jdXNhYmxlIGVsZW1lbnRcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gZWxlbWVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAobm9kZU5hbWUgaW4gQ29tbW9uVXRpbC50YWJUYWdNYXApIHtcbiAgICAgICAgICAgIGxldCByZXRWYWwgPSBDb21tb25VdGlsLnRhYlRhZ01hcFtub2RlTmFtZV07XG4gICAgICAgICAgICBpZiAodHlwZW9mIChyZXRWYWwpID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICByZXRWYWwgPSByZXRWYWwoZWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgICAgICB9IGVsc2UgeyBcbiAgICAgICAgICAgIC8vY3VzdG9tIHdpZGdldFxuICAgICAgICAgICAgaWYgKEFyaWFVdGlsLmlzV2lkZ2V0KGVsZW1lbnQpICYmIGVsZW1lbnQuaGFzQXR0cmlidXRlKFwidGFiaW5kZXhcIikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0gXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlOyAgXG4gICAgfVxuXG4gICAgLyogXG4gICAgICogZ2V0IGNvbmZsaWN0IEFyaWEgYW5kIEh0bWwgYXR0cmlidXRlc1xuICAgICAqIHJldHVybjogYSBsaXN0IG9mIEFyaWEgYW5kIEh0bWwgYXR0cmlidXRlIHBhaXJzIHRoYXQgYXJlIGNvbmZsaWN0XG4gICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzVGFibGVEZXNjZW5kYW50KGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KSB7XG4gICAgICAgIGlmICghY29udGV4dEhpZXJhcmNoaWVzKSByZXR1cm4gbnVsbDtcblxuICAgICAgICByZXR1cm4gY29udGV4dEhpZXJhcmNoaWVzW1wiYXJpYVwiXS5maWx0ZXIoaGllciA9PiBbXCJ0YWJsZVwiLCBcImdyaWRcIiwgXCJ0cmVlZ3JpZFwiXS5pbmNsdWRlcyhoaWVyLnJvbGUpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHRhYkluZGV4TEVaZXJvKGVsZW0pIHtcbiAgICAgICAgaWYgKENvbW1vblV0aWwuaGFzQXR0cmlidXRlKGVsZW0sIFwidGFiaW5kZXhcIikpIHtcbiAgICAgICAgICAgIGlmIChlbGVtLmdldEF0dHJpYnV0ZShcInRhYmluZGV4XCIpLm1hdGNoKC9eLT9cXGQrJC8pKSB7XG4gICAgICAgICAgICAgICAgbGV0IHRhYmluZGV4VmFsdWUgPSBwYXJzZUludChlbGVtLmdldEF0dHJpYnV0ZShcInRhYmluZGV4XCIpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGFiaW5kZXhWYWx1ZSA9PT0gMCB8fCB0YWJpbmRleFZhbHVlID09PSAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogZ2V0IG51bWJlciBvZiB0YWJiYWJsZSBjaGlsZHJlblxuICAgICAqIEBwYXJhbSBlbGVtZW50IFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0VGFiYmFibGVDaGlsZHJlbihlbGVtZW50KSB7XG4gICAgICAgIGxldCBjb3VudCA9IDA7XG4gICAgICAgIC8vIElmIG5vZGUgaGFzIGNoaWxkcmVuLCBsb29rIGZvciB0YWIgc3RvcHMgaW4gdGhlIGNoaWxkcmVuXG4gICAgICAgIGlmIChlbGVtZW50LmZpcnN0Q2hpbGQgfHwgZWxlbWVudC5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIklGUkFNRVwiKSB7XG4gICAgICAgICAgICBsZXQgbncgPSBuZXcgRE9NV2Fsa2VyKGVsZW1lbnQpO1xuICAgICAgICAgICAgd2hpbGUgKG53Lm5leHROb2RlKCkgJiYgbncubm9kZSAhPSBlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgaWYgKG53Lm5vZGUubm9kZVR5cGUgPT0gMSAmJiAhbncuYkVuZFRhZyAmJiBDb21tb25VdGlsLmlzVGFiYmFibGUobncubm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgKytjb3VudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvdW50O1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgbm9ybWFsaXplU3BhY2luZyhzKSB7XG4gICAgICAgIGlmICghcykgcmV0dXJuICcnO1xuICAgICAgICByZXR1cm4gcy50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xuICAgIH07XG5cbiAgICAvL1RPRE86IGZ1bmN0aW9uIGRvZXMgbm90IGhhbmRsZSBlcXVpdmFsZW50cyBmb3Igcm9sZXM6IHJvdywgbGluaywgaGVhZGVyLCBidXR0b25cbiAgICAvLyBCdXQgaXQgbWF5IG5vdCBoYXZlIHRvLiBCdWcgcmVwb3J0cyBoYXZlIGJlZW4gYWJvdXQgcmFkaW8gYnV0dG9ucyBhbmQgY2hlY2tib3hlcy5cbiAgICBwdWJsaWMgc3RhdGljIGlzSHRtbEVxdWl2KG5vZGUsIGh0bWxFcXVpdikge1xuICAgICAgICBsZXQgcmV0VmFsID0gZmFsc2U7XG4gICAgICAgIGlmIChub2RlKSB7XG4gICAgICAgICAgICBsZXQgbm9kZU5hbWUgPSBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwiaW5wdXRcIikge1xuICAgICAgICAgICAgICAgIGxldCB0eXBlID0gbm9kZS5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGh0bWxFcXVpdi5pbmRleE9mKFwiY2hlY2tib3hcIikgIT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IHR5cGUgPT09IFwiY2hlY2tib3hcIjtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChodG1sRXF1aXYuaW5kZXhPZihcInJhZGlvXCIpICE9IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwgPSB0eXBlID09PSBcInJhZGlvXCI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIG5vbkV4aXN0YW50SURzKG5vZGUsIHRhcmdldGlkcykge1xuICAgICAgICBsZXQgcmV0dXJubm90Zm91bmRpZHMgPSAnJztcbiAgICAgICAgaWYgKENvbW1vblV0aWwubm9ybWFsaXplU3BhY2luZyh0YXJnZXRpZHMpLmxlbmd0aCA8IDEpIHJldHVybiByZXR1cm5ub3Rmb3VuZGlkcztcblxuICAgICAgICBsZXQgdGFyZ2V0QXJyYXkgPSB0YXJnZXRpZHMuc3BsaXQoXCIgXCIpO1xuICAgICAgICBsZXQgZG9jID0gbm9kZS5vd25lckRvY3VtZW50O1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhcmdldEFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgeHAgPSBcIi8vKltAaWQ9J1wiICsgdGFyZ2V0QXJyYXlbaV0gKyBcIiddXCI7XG4gICAgICAgICAgICBsZXQgeHBhdGhSZXN1bHQgPSBkb2MuZXZhbHVhdGUoeHAsIG5vZGUsIGRvYy5kZWZhdWx0TlNSZXNvbHZlciwgMCAvKiBYUGF0aFJlc3VsdC5BTllfVFlQRSAqLywgbnVsbCk7XG4gICAgICAgICAgICBsZXQgciA9IHhwYXRoUmVzdWx0Lml0ZXJhdGVOZXh0KCk7XG4gICAgICAgICAgICBpZiAoIXIpIHJldHVybm5vdGZvdW5kaWRzICs9IHRhcmdldEFycmF5W2ldICsgJywgJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKHJldHVybm5vdGZvdW5kaWRzKS5sZW5ndGggPj0gMilcbiAgICAgICAgICAgIHJldHVybm5vdGZvdW5kaWRzID0gcmV0dXJubm90Zm91bmRpZHMuc3Vic3RyaW5nKDAsIHJldHVybm5vdGZvdW5kaWRzLmxlbmd0aCAtIDIpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICByZXR1cm5ub3Rmb3VuZGlkcyA9ICcnO1xuICAgICAgICByZXR1cm4gcmV0dXJubm90Zm91bmRpZHM7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXREb2NFbGVtZW50c0J5VGFnKGVsZW0sIHRhZ05hbWUpIHtcbiAgICAgICAgbGV0IGRvYyA9IEZyYWdtZW50VXRpbC5nZXRPd25lckZyYWdtZW50KGVsZW0pIGFzIGFueTtcbiAgICAgICAgdGFnTmFtZSA9IHRhZ05hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgbGV0IGNhY2hlID0gQ2FjaGVVdGlsLmdldENhY2hlKGRvYywgXCJSUFRfRE9DRUxFTVNCWVRBR1wiLCB7fSk7XG4gICAgICAgIGlmICghKHRhZ05hbWUgaW4gY2FjaGUpKSB7XG4gICAgICAgICAgICBjYWNoZVt0YWdOYW1lXSA9IGRvYy5xdWVyeVNlbGVjdG9yQWxsKHRhZ05hbWUpO1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGRvYywgXCJSUFRfRE9DRUxFTVNCWVRBR1wiLCBjYWNoZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNhY2hlW3RhZ05hbWVdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGdldCBhIGxpc3Qgb2YgYWxsIHRoZSBjaGlsZCBlbGVtbnRzIHdoaWNoIG1hdGNoIHRoZSB0YWdcbiAgICAgKiBuYW1lIHByb3ZpZGVkLlxuICAgICAqXG4gICAgICogTm90ZTogVGhpcyBpcyBhIHdyYXBwZXIgZnVuY3Rpb24gdG86IEFyaWFVdGlsLmdldENoaWxkQnlUYWdIaWRkZW5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBwYXJlbnRFbGVtIC0gVGhlIHBhcmVudCBlbGVtZW50XG4gICAgICogQHBhcm0ge3N0cmluZ30gdGFnTmFtZSAtIFRoZSB0YWcgdG8gc2VhcmNoIGZvciB1bmRlciB0aGUgcGFyZW50IGVsZW1lbnRcbiAgICAgKiBAcGFybSB7Ym9vbGVhbn0gaWdub3JlSGlkZGVuIC0gdHJ1ZSBpZiBoaWRkZW4gZWxlbWVudHMgd2l0aCB0aGUgdGFnIHNob3VsZCBpZ25vcmVkIGZyb20gdGhlIGxpc3RcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgaWYgdGhlIGhpZGRlbiBlbGVtZW50cyBzaG91bGQgYmUgYWRkZWRcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0xpc3R9IHJldFZhbCAtIGxpc3Qgb2YgYWxsIHRoZSBlbGVtZW50cyB3aGljaCBtYXRjaGVkIHRoZSB0YWcgdW5kZXIgdGhlIHBhcmVudCB0aGF0IHdlcmUgcHJvdmlkZWQuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldENoaWxkQnlUYWcocGFyZW50RWxlbSwgdGFnTmFtZSkge1xuICAgICAgICByZXR1cm4gQ29tbW9uVXRpbC5nZXRDaGlsZEJ5VGFnSGlkZGVuKHBhcmVudEVsZW0sIHRhZ05hbWUsIGZhbHNlLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZ2V0IGEgbGlzdCBvZiBhbGwgdGhlIGNoaWxkIGVsZW1udHMgd2hpY2ggbWF0Y2ggdGhlIHRhZ1xuICAgICAqIG5hbWUgcHJvdmlkZWQuXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gcGFyZW50RWxlbSAtIFRoZSBwYXJlbnQgZWxlbWVudFxuICAgICAqIEBwYXJtIHtzdHJpbmd9IHRhZ05hbWUgLSBUaGUgdGFnIHRvIHNlYXJjaCBmb3IgdW5kZXIgdGhlIHBhcmVudCBlbGVtZW50XG4gICAgICogQHBhcm0ge2Jvb2xlYW59IGlnbm9yZUhpZGRlbiAtIHRydWUgaWYgaGlkZGVuIGVsZW1lbnRzIHdpdGggdGhlIHRhZyBzaG91bGQgaWdub3JlZCBmcm9tIHRoZSBsaXN0XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIGlmIHRoZSBoaWRkZW4gZWxlbWVudHMgc2hvdWxkIGJlIGFkZGVkXG4gICAgICogQHBhcm0ge2Jvb2x9IGNvbnNpZGVySGlkZGVuU2V0dGluZyAtIHRydWUgb3IgZmFsc2UgYmFzZWQgb24gaWYgaGlkZGVuIHNldHRpbmcgc2hvdWxkIGJlIGNvbnNpZGVyZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtMaXN0fSByZXRWYWwgLSBsaXN0IG9mIGFsbCB0aGUgZWxlbWVudHMgd2hpY2ggbWF0Y2hlZCB0aGUgdGFnIHVuZGVyIHRoZSBwYXJlbnQgdGhhdCB3ZXJlIHByb3ZpZGVkLlxuICAgICAqXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRDaGlsZEJ5VGFnSGlkZGVuKHBhcmVudEVsZW0sIHRhZ05hbWUsIGlnbm9yZUhpZGRlbiwgY29uc2lkZXJIaWRkZW5TZXR0aW5nKSB7XG4gICAgICAgIC8vIFZhcmlhYmxlIERlY2xlcmF0aW9uXG4gICAgICAgIGxldCByZXRWYWwgPSBbXTtcbiAgICAgICAgbGV0IGNoaWxkID0gcGFyZW50RWxlbS5maXJzdENoaWxkO1xuXG4gICAgICAgIC8vIExvb3Agb3ZlciBhbGwgdGhlIGNoaWxkIGVsZW1lbnRzIG9mIHRoZSBwYXJlbnQgdG8gYnVpbGQgYSBsaXN0IG9mIGFsbCB0aGUgZWxlbWVudHMgdGhhdFxuICAgICAgICAvLyBtYXRjaCB0aGUgdGFnTmFtZSBwcm92aWRlZFxuICAgICAgICB3aGlsZSAoY2hpbGQgIT0gbnVsbCkge1xuXG4gICAgICAgICAgICAvLyBPbmx5IGluY2x1ZGUgdGhlIGNoaWxkcmVuIGludG8gdGhlIHJldHVybiBhcnJheSBpZiB0aGV5IG1hdGNoIHdpdGggdGFnbmFtZS5cbiAgICAgICAgICAgIGlmIChjaGlsZC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSB0YWdOYW1lKSB7XG5cbiAgICAgICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IGlnbm9yZWhpZGRlbiB3YXMgc2V0IHRvIHRydWUsIHRoZW4gcGVyZm9ybSBhIGlzTm9kZVZpc2libGUgY2hlY2tcbiAgICAgICAgICAgICAgICAvLyBhbmQgaW4gdGhlIGNhc2UgdGhlIG5vZGUgaXMgbm90IHZpc2lsYmxlIHdlIG1vcmUgdG8gdGhlc2VzIHRoZW4gbW92ZSB0byB0aGUgbmV4dCBub2RlLlxuICAgICAgICAgICAgICAgIC8vIFBlcmZvcm0gYSBjb3VwbGUgb2YgY2hlY2tzIHRvIGRldGVybWluZSBpZiBoaWRkZW4gZWxlbWVudHMgc2hvdWxkIGJlIGlnbm9yZWQgb3Igbm90LlxuICAgICAgICAgICAgICAgIC8vICAxLiBXaGVuIGlnbm9yZUhpZGRlbiBpcyBzZXQgdG8gdHJ1ZSB1cGZyb250LCB0aGVuIHBlcmZvcm0gYSBpc05vZGVWaXNpYmxlXG4gICAgICAgICAgICAgICAgLy8gIDIuIElmIGNvbnNpZGVySGlkZGVuU2V0dGluZyBvcHRpb24gaXMgc2V0IHRvIHRydWUgdGhlbiB3ZSBwZXJmb3JtIHRoZSBjaGVjayB0byBjb25zaWRlciB0aGVcbiAgICAgICAgICAgICAgICAvLyAgICAgQ2hlY2sgSGlkZGVuIENvbnRlbnQgdGhhdCBpcyBwcm92aWRlZC5cbiAgICAgICAgICAgICAgICAvLyAgMi4xLiBPbmx5IHJ1biBpc05vZGVWaXNpYmxlIGNoZWNrIGlmIGhpZGRlbiBjb250ZW50IHNob3VsZCBOT1QgYmUgY2hlY2tlZC4gSW4gdGhlIGNhc2UgdGhhdCBoaWRkZW4gY29udGVudCBpcyB0byxcbiAgICAgICAgICAgICAgICAvLyAgICAgICBiZSBzY2FubmVkIHRoZW4gd2UgY2FuIGp1c3Qgc2NhbiBldmVyeXRoaW5nIGFzIG5vcm1hbC4gSW4gdGhlIGNhc2UgdGhhdCB0aGUgY3VycmVudCBub2RlIGlzIGhpZGRlbiB3ZSBkbyBub3RcbiAgICAgICAgICAgICAgICAvLyAgICAgICBhZGQgaXQgdG8gdGhlIHJvbGVUb0VsZW1zIGhhc2ggYXQgYWxsIG9yIGV2ZW4gZG8gYW55IGNoZWNraW5nIGZvciBpdCBhdCBhbGwuXG4gICAgICAgICAgICAgICAgaWYgKChpZ25vcmVIaWRkZW4gfHwgKGNvbnNpZGVySGlkZGVuU2V0dGluZyAmJiAhQ29tbW9uVXRpbC5zaG91bGRDaGVja0hpZGRlbkNvbnRlbnQoY2hpbGQpKSkgJiYgIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShjaGlsZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTW92ZSBvbiB0byB0aGUgbmV4dCBlbGVtZW50XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkID0gY2hpbGQubmV4dFNpYmxpbmc7XG5cbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gUHVzaCB0aGUgZWxlbWVudFxuICAgICAgICAgICAgICAgIHJldFZhbC5wdXNoKGNoaWxkKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gTW92ZSB0byB0aGUgbmV4dCBzaWJsaW5nIGVsZW1lbnRcbiAgICAgICAgICAgIGNoaWxkID0gY2hpbGQubmV4dFNpYmxpbmc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZmluZGluZyBhIGxpc3Qgb2YgZWxlbWVudHMgdGhhdCBtYXRjaCBnaXZlbiByb2xlcyhzKS5cbiAgICAgICAgICogVGhpcyBmdW5jdGlvbiBieSBkZWZhdWx5IHdpbGwgbm90IGNvbnNpZGVyIENoZWNrIEhpZGRlbiBTZXR0aW5nIGF0IGFsbC5cbiAgICAgICAgICogVGhpcyBmdW5jdGlvbiBieSBkZWZhdWx5IHdpbGwgbm90IGNvbnNpZGVyIGltcGxpY2l0IHJvbGVzLlxuICAgICAgICAgKiBOb3RlOiBUaGlzIGlzIGEgd3JhcHBlciBmdW5jdGlvbiB0bzogQXJpYVV0aWwuZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcm0ge2RvY3VtZW50fSBkb2MgLSBUaGUgZG9jdW1lbnQgbm9kZVxuICAgICAgICAgKiBAcGFybSB7bGlzdCBvciBzdHJpbmd9IHJvbGVzIC0gTGlzdCBvciBzaW5nbGUgcm9sZSBmb3Igd2hpY2ggdG8gcmV0dXJuIGVsZW1lbnRzIGJhc2VkIG9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtMaXN0fSByZXRWYWwgLSBsaXN0IG9mIGFsbCB0aGUgZWxlbWVudHMgd2hpY2ggbWF0Y2hlZCB0aGUgcm9sZShzKSB0aGF0IHdlcmUgcHJvdmlkZWQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEVsZW1lbnRzQnlSb2xlKGRvYywgcm9sZXMpIHtcbiAgICAgICAgcmV0dXJuIENvbW1vblV0aWwuZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW4oZG9jLCByb2xlcywgZmFsc2UsIGZhbHNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBmaW5kaW5nIGEgbGlzdCBvZiBlbGVtZW50cyB0aGF0IG1hdGNoIGdpdmVuIHJvbGVzKHMpLlxuICAgICAqIFRoaXMgZnVuY3Rpb24gYXNsbyBmaW5kcyBlbGVtZW50cyB3aXRoIGltcGxpY2l0IHJvbGVzLlxuICAgICAqIFRoaXMgZnVuY3Rpb24gd2lsbCBhbHNvIGNvbnNpZGVyIGVsZW1lbnRzIHRoYXQgYXJlIGhpZGRlbiBiYXNlZCBvbiB0aGUgaWYgdGhlIENoZWNrXG4gICAgICogSGlkZGVuIENvbnRlbnQgc2V0dGluZ3Mgc2hvdWxkIGJlIGNvbnNpZGVyZWQgb3Igbm90LlxuICAgICAqXG4gICAgICogQHBhcm0ge2RvY3VtZW50fSBkb2MgLSBUaGUgZG9jdW1lbnQgbm9kZVxuICAgICAqIEBwYXJtIHtsaXN0IG9yIHN0cmluZ30gcm9sZXMgLSBMaXN0IG9yIHNpbmdsZSByb2xlIGZvciB3aGljaCB0byByZXR1cm4gZWxlbWVudHMgYmFzZWQgb24uXG4gICAgICogQHBhcm0ge2Jvb2x9IGNvbnNpZGVySGlkZGVuU2V0dGluZyAtIHRydWUgb3IgZmFsc2UgYmFzZWQgb24gaWYgaGlkZGVuIHNldHRpbmcgc2hvdWxkIGJlIGNvbnNpZGVyZWQuXG4gICAgICogQHBhcm0ge2Jvb2x9IGNvbnNpZGVySW1wbGljaXRSb2xlcyAtIHRydWUgb3IgZmFsc2UgYmFzZWQgb24gaWYgaW1wbGljaXQgcm9sZXMgc2V0dGluZyBzaG91bGQgYmUgY29uc2lkZXJlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0xpc3R9IHJldFZhbCAtIGxpc3Qgb2YgYWxsIHRoZSBlbGVtZW50cyB3aGljaCBtYXRjaGVkIHRoZSByb2xlKHMpIHRoYXQgd2VyZSBwcm92aWRlZC5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW4oZG9jLCByb2xlcywgY29uc2lkZXJIaWRkZW5TZXR0aW5nLCBjb25zaWRlckltcGxpY2l0Um9sZXM/KSB7XG4gICAgICAgIFxuICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IHRoZSByb2xlIHRvIGVsZW1lbnQgYXNzb2ljYXRpb24gaXMgYWxyZWFkeSBtYWRlLCBhbmQgYXZhaWxhYmxlIGluIHRoZSBnbG9iYWwgaGFzQXR0cmlidXRlXG4gICAgICAgIC8vIHdlIGNhbiBqdXN0IHVzZSB0aGF0IG9uZSBpbnN0ZWFkIG9mIGJ1aWxkaW5nIGEgbmV3IG9uZS5cbiAgICAgICAgbGV0IHJvbGVUb0VsZW1zID0gbnVsbDtcbiAgICAgICAgaWYgKGNvbnNpZGVySW1wbGljaXRSb2xlcykge1xuICAgICAgICAgICAgcm9sZVRvRWxlbXMgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUoZG9jLCBcIkFyaWFVdGlsX0dFVEVMRU1FTlRTQllfUk9MRV9JTVBMSUNJVFwiLCBudWxsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJvbGVUb0VsZW1zID0gQ2FjaGVVdGlsLmdldENhY2hlKGRvYywgXCJBcmlhVXRpbF9HRVRFTEVNRU5UU0JZX1JPTEVcIiwgbnVsbCk7XG4gICAgICAgIH1cblxuXG4gICAgICAgIC8vIEJ1aWxkIHRoZSBuZXcgcm9sZSB0byBlbGVtZW50LCB0aGlzIGlzIHdoZXJlIHdlIGxvb3AgdGhyb3VnaCBhbGwgdGhlIGVsZW1lbnRzIGFuZCBleHRyYWN0IGFsbCB0aGVcbiAgICAgICAgLy8gZWxlbWVudHMgYnNhZWQgb24gcm9sZXMuXG4gICAgICAgIGlmIChyb2xlVG9FbGVtcyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gUmUtaW5pdGlhbGl6ZSB0aGUgcm9sZVRvRWxlbXMgaGFzaFxuICAgICAgICAgICAgcm9sZVRvRWxlbXMgPSB7fTtcblxuICAgICAgICAgICAgLy8gR2V0IHRoZSBib2R5IG9mIHRoZSBkb2NcbiAgICAgICAgICAgIGxldCByb290ID0gZG9jLmJvZHk7XG5cbiAgICAgICAgICAgIC8vIEtlZXAgbG9vcGluZyB1bnRpbCB3ZSBhcmUgYXQgdGhlIHZlcnkgcGFyZW50IG5vZGUgb2YgdGhlIGVudGlyZSBwYWdlLCBzbyB0aGF0IHdlIGNhbiBsb29wIHRocm91Z2hcbiAgICAgICAgICAgIC8vIGFsbCB0aGUgbm9kZXMuXG4gICAgICAgICAgICB3aGlsZSAoRE9NV2Fsa2VyLnBhcmVudE5vZGUocm9vdCkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIHBhcmVudE5vZGVcbiAgICAgICAgICAgICAgICByb290ID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUocm9vdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBCdWlsZCBhIG5vZGV3YWx0ZXIgYmFzZWQgb2YgdGhlIHJvb3Qgbm9kZSwgdGhpcyBub2RlIHdhbHRlciB3aWxsIGJlIHVzZSBsb29wIG92ZXIgYWxsIHRoZSBub2Rlc1xuICAgICAgICAgICAgLy8gYW5kIGJ1aWxkIHRoZSByb2xlcyB0byBFbGVtZW50IGNvcmFsYXRpb25cbiAgICAgICAgICAgIGxldCBudyA9IG5ldyBET01XYWxrZXIocm9vdCk7XG4gICAgICAgICAgICAvLyBMb29wIG92ZXIgdGhlIGVudGlyZSBkb2MvbGlzdCBvZiBub2RlcyB0byBidWlsZCB0aGUgcm9sZSB0byBlbGVtZW50IG1hcFxuICAgICAgICAgICAgLy8gTm90ZTogVGhpcyB3aWxsIGJ1aWxkIGFuIHJvbGVUb0VsZW1zIGhhc2ggd2hpY2ggaXMgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQuXG4gICAgICAgICAgICAvLyByb2xlVG9FbGVtcyA9IHtcbiAgICAgICAgICAgIC8vICAgIGRvY3VtZW50OiBbe2Rpdn0se2FiYnJ9LHt2YXJ9XSxcbiAgICAgICAgICAgIC8vICAgIG1haW46IFt7ZGl2fV0sXG4gICAgICAgICAgICAvLyAgICBuYXZpZ2F0aW9uOiBbe2Rpdn1dXG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICB3aGlsZSAobncubmV4dE5vZGUoKSkge1xuICAgICAgICAgICAgICAgIGlmICghbncuZWxlbSgpKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAvLyBPbmx5IGNoZWNrIHRoZSBlbGVtZW50cyB3aGljaCBoYXZlIHRoZSByb2xlIGF0dHJpYnV0ZSBhc3NpY2lhdGVkIHRvIHRoZW1cbiAgICAgICAgICAgICAgICBpZiAoIW53LmJFbmRUYWcpIHtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgd1JvbGVzID0gW107XG4gICAgICAgICAgICAgICAgICAgIC8vY2hlY2sgaWYgdGhlIG5vZGUgaGFzIHJvbGUgYXR0cmlidXRlc1xuICAgICAgICAgICAgICAgICAgICBpZiAobncuZWxlbSgpICYmIG53LmVsZW0oKS5oYXNBdHRyaWJ1dGUoXCJyb2xlXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBFeHRyYWN0IGFsbCB0aGUgcm9sZXMgdGhhdCBhcmUgYXNzaWduZWQgdG8gdGhpcyBlbGVtZW50LCBjYW4gaGF2ZSBtdWx0aXBsZSByb2xlcyBvbiBvbmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVsZW1lbnQgc3BsaXQgYnkgc3BhY2UsIHNvIHdlIG5lZWQgdG8gZXh0cmFjdCBhbGwgb2YgdGhlbSBpbnRvIGFuIGFycmF5LlxuICAgICAgICAgICAgICAgICAgICAgICAgd1JvbGVzID0gbncuZWxlbSgpLmdldEF0dHJpYnV0ZShcInJvbGVcIikuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKG53LmVsZW0oKSAmJiB3Um9sZXMubGVuZ3RoID09PSAwICYmIGNvbnNpZGVySW1wbGljaXRSb2xlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9jaGVjayBpZiB0aGVyZSBhcmUgYW55IGltcGxpY2l0IHJvbGVzIGZvciB0aGlzIGVsZW1lbnQuXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW1wbGljaXRSb2xlID0gQXJpYVV0aWwuZ2V0SW1wbGljaXRSb2xlKG53Lm5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGltcGxpY2l0Um9sZSAhPT0gbnVsbCAmJiBpbXBsaWNpdFJvbGUubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3Um9sZXMgPSBpbXBsaWNpdFJvbGU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAod1JvbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBGb2xsb3dpbmcgYXJlIHRoZSBzdGVwcyB0aGF0IGFyZSBleGVjdXRlZCBhdCB0aGlzIHN0YWdlIHRvIGRldGVybWluZSBpZiB0aGUgbm9kZSBzaG91bGQgYmUgY2xhc3NpZmllZCBhcyBoaWRkZW5cbiAgICAgICAgICAgICAgICAgICAgLy8gb3Igbm90LlxuICAgICAgICAgICAgICAgICAgICAvLyAgMS4gSWYgY29uc2lkZXJIaWRkZW5TZXR0aW5nIG9wdGlvbiBpcyBzZXQgdG8gdHJ1ZSB0aGVuIHdlIHBlcmZvcm0gdGhlIGNoZWNrIHRvIGNvbnNpZGVyIHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgQ2hlY2sgSGlkZGVuIENvbnRlbnQgdGhhdCBpcyBwcm92aWRlZC5cbiAgICAgICAgICAgICAgICAgICAgLy8gIDIuIE9ubHkgcnVuIGlzTm9kZVZpc2libGUgY2hlY2sgaWYgaGlkZGVuIGNvbnRlbnQgc2hvdWxkIE5PVCBiZSBjaGVja2VkLiBJbiB0aGUgY2FzZSB0aGF0IGhpZGRlbiBjb250ZW50IGlzIHRvLFxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgYmUgc2Nhbm5lZCB0aGVuIHdlIGNhbiBqdXN0IHNjYW4gZXZlcnl0aGluZyBhcyBub3JtYWwuIEluIHRoZSBjYXNlIHRoYXQgdGhlIGN1cnJlbnQgbm9kZSBpcyBoaWRkZW4gd2UgZG8gbm90XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBhZGQgaXQgdG8gdGhlIHJvbGVUb0VsZW1zIGhhc2ggYXQgYWxsIG9yIGV2ZW4gZG8gYW55IGNoZWNraW5nIGZvciBpdCBhdCBhbGwuXG4gICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgIC8vIE5vdGU6IFRoZSBpZiBjb25kaXRpb25zIHVzZXMgc2hvcnQtY2lyY3VpdGluZyBzbyBpZiB0aGUgZmlyc3QgY29uZGl0aW9uIGlzIG5vdCB0cnVlIGl0IHdpbGwgbm90IGNoZWNrIHRoZSBuZXh0IG9uZSxcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgc28gb24gYW5kIHNvIGZvcnRoLlxuICAgICAgICAgICAgICAgICAgICBpZiAoY29uc2lkZXJIaWRkZW5TZXR0aW5nICYmIENvbW1vblV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbihudy5ub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBMb29wIHRocm91Z2ggYWxsIHRoZSByb2xlcyBhbmQgYXNzaWduZWQgdGhpcyBub2RlIHRvIGFsbCB0aGVzIHJvbGVzXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgd1JvbGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IHRoZSByb2xlIGtleSBpcyBub3QgYWxyZWFkeSBpbiB0aGUgcm9sZVRvRWxlbXMgaGFzaCwgY29uc3RydWN0IHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkIHRoZSBrZXkgYW5kIGFzc2lnbiBlbXB0eSBhcnJheS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHdSb2xlc1tpXSBpbiByb2xlVG9FbGVtcykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlVG9FbGVtc1t3Um9sZXNbaV1dID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgbm9kZSB0byB0aGUgYXJyYXkgZm9yIHRoZSByb2xlXG4gICAgICAgICAgICAgICAgICAgICAgICByb2xlVG9FbGVtc1t3Um9sZXNbaV1dLnB1c2gobncubm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFNldCB0aGUgcm9sZVRvRWxlbXMgaGFzaCBtYXAgYXMgYSBnbG9iYWwgdmFyaWFibGVcbiAgICAgICAgICAgIGlmIChjb25zaWRlckltcGxpY2l0Um9sZXMpIHtcbiAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZG9jLCBcIkFyaWFVdGlsX0dFVEVMRU1FTlRTQllfUk9MRV9JTVBMSUNJVFwiLCByb2xlVG9FbGVtcyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShkb2MsIFwiQXJpYVV0aWxfR0VURUxFTUVOVFNCWV9ST0xFXCIsIHJvbGVUb0VsZW1zKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW5pdGlsaXplIHRoZSByZXR1cm4gdmFsdWVcbiAgICAgICAgbGV0IHJldFZhbCA9IFtdO1xuXG4gICAgICAgIC8vIEhhbmRsZSB0aGUgY2FzZXMgd2hlcmUgdGhlIHByb3ZpZGVkIHJvbGUgaXMgYSBzdHJpbmcgYW5kIG5vdCBhbiBhcnJheSxcbiAgICAgICAgLy8gZm9yIHRoaXMgY2FzZSB3ZSB0YWtlIHRoZSBzdHJpbmcgYW5kIHB1dCBpdCBpbnRvIGFuIGFycmF5XG4gICAgICAgIGlmICh0eXBlb2YgKHJvbGVzKSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgbGV0IHJvbGUgPSByb2xlcztcbiAgICAgICAgICAgIHJvbGVzID0gW107XG4gICAgICAgICAgICByb2xlcy5wdXNoKHJvbGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTG9vcCB0aHJvdWdoIHRoZSByb2xlcyB0aGF0IHdlcmUgcHJvdmlkZWQgYW5kIGZpbmQgdGhlIGxpc3Qgb2YgZWxlbWVudHMgZm9yIHRoaXMgcm9sZXNcbiAgICAgICAgLy8gYW5kIGFkZCB0aGVtIHRvIHRoZSByZXR1cm4gdmFsdWUuXG4gICAgICAgIGlmIChyb2xlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIC8vIGxvb3Agb3ZlciBhbGwgdGhlIHJvbGVzXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJvbGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgLy8gRXh0cmFjdCB0aGUgcm9sZSBmcm9tIHRoZSBhcnJheVxuICAgICAgICAgICAgICAgIGxldCBuZXh0Um9sZSA9IHJvbGVzW2ldO1xuICAgICAgICAgICAgICAgIC8vIEZldGNoIHRoZSBsaXN0IG9mIGFsbCB0aGUgZWxlbWVudHMgZm9yIHRoaXMgcm9sZVxuICAgICAgICAgICAgICAgIGxldCBjb3B5Um9sZXMgPSByb2xlVG9FbGVtc1tuZXh0Um9sZV07XG5cbiAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSBhcmUgZWxlbWVudHMgdG8gY29weSB0byBhbm90aGVyIGFycmF5LCB0aGVuIHBlcmZvcm0gdGhlIGNvcHlcbiAgICAgICAgICAgICAgICBpZiAoY29weVJvbGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIExvb3Agb3ZlciBhbGwgdGhlIGVsZW1lbnRzIHdoaWNoIGFyZSB0byBiZSBjb3BpZWRcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjb3B5Um9sZXMubGVuZ3RoOyArK2opIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFkZCB0aGlzIGVsZW1lbnQgdG8gdGhlIHJldHVybiB2YWxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5wdXNoKGNvcHlSb2xlc1tqXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAgICAgKiBhIHRhcmdldCBpcyBlbiBlbGVtZW50IHRoYXQgYWNjZXB0IGEgcG9pbnRlciBhY3Rpb24gKGNsaWNrIG9yIHRvdWNoKVxuICAgICAgICAgKiBcbiAgICAgICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpc1RhcmdldChlbGVtZW50KSB7IFxuICAgICAgICBpZiAoIWVsZW1lbnQgfHwgZWxlbWVudC5ub2RlVHlwZSAhPT0gMSBcbiAgICAgICAgICAgIHx8IFtcImh0bWxcIiwgXCJib2R5XCJdLmluY2x1ZGVzKGVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSlcbiAgICAgICAgICAgIHx8IENvbW1vblV0aWwuZ2V0QW5jZXN0b3IoZWxlbWVudCwgW1wic3ZnXCIsIFwicHJlXCIsIFwiY29kZVwiLCBcInNjcmlwdFwiLCBcIm1ldGFcIiwgJ2hlYWQnXSkgIT09IG51bGwgXG4gICAgICAgICAgICB8fCAhVmlzVXRpbC5pc05vZGVWaXNpYmxlKGVsZW1lbnQpIHx8IFZpc1V0aWwuaXNOb2RlVmlzdWFsbHlIaWRkZW4oZWxlbWVudCkgXG4gICAgICAgICAgICB8fCBDb21tb25VdGlsLmlzTm9kZURpc2FibGVkKGVsZW1lbnQpIHx8IFZpc1V0aWwuaXNFbGVtZW50T2Zmc2NyZWVuKGVsZW1lbnQpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBcbiAgICAgICAgaWYgKENvbW1vblV0aWwuaXNDbGlja2FibGUoZWxlbWVudCkpIFxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAgICAgY29uc3Qgcm9sZSA9IEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZShlbGVtZW50KTtcbiAgICAgICAgaWYgKCFyb2xlKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgY29uc3QgdGFyZ2V0X3JvbGVzID0gW1wibGlzdGl0ZW1cIiwgXCJtZW51aXRlbVwiLCBcIm1lbnVpdGVtY2hlY2tib3hcIiwgXCJtZW51aXRlbXJhZGlvXCIsIFwib3B0aW9uXCIsIFwicmFkaW9cIiwgXCJzd2l0Y2hcIiwgXCJ0cmVlaXRlbVwiXTtcbiAgICAgICAgaWYgKHRhcmdldF9yb2xlcy5pbmNsdWRlcyhyb2xlKSkge1xuICAgICAgICAgICAgLy8gZmluZCB0aGUgcHJvcGVyIHBhcmVudCBlbGVtZW50c1xuICAgICAgICAgICAgbGV0IHBhcmVudCA9IGVsZW1lbnQucGFyZW50RWxlbWVudDtcbiAgICAgICAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRfcm9sZSA9IEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZShwYXJlbnQpO1xuICAgICAgICAgICAgICAgIC8vIGRhdGFsaXN0LCBmaWVsZHNldCwgb3B0Z3JvdXAsIGV0Yy4gbWF5IGJlIGp1c3QgdXNlZCBmb3IgZ3JvdXBpbmcgcHVycG9zZSwgc28gZ28gdXAgdG8gdGhlIHBhcmVudFxuICAgICAgICAgICAgICAgIGlmIChwYXJlbnRfcm9sZSA9PT0gJ2dyb3VwJylcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudEVsZW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChwYXJlbnQgJiYgQ29tbW9uVXRpbC5pc1RhcmdldChwYXJlbnQpKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9ICAgIFxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRGaWxlRXh0KHVybCkge1xuICAgICAgICBsZXQgbSA9IHVybC5tYXRjaCgvXFwuKChbXjs/I1xcLl18XiQpKykoWzs/I118JCkvKTtcbiAgICAgICAgaWYgKG0gIT0gbnVsbCAmJiBtLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgICAgICByZXR1cm4gXCIuXCIgKyBtWzFdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGdldEZpbGVBbmNob3IodXJsKSB7XG4gICAgICAgIGxldCBtID0gdXJsLm1hdGNoKC8jKChbXjs/XFwuXXxeJCkrKShbOz9dfCQpLyk7XG4gICAgICAgIGlmIChtICE9IG51bGwgJiYgbS5sZW5ndGggPj0gMikge1xuICAgICAgICAgICAgcmV0dXJuIG1bMV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgY2hlY2tPYmpFbWJlZChub2RlLCBleHRUZXN0LCBtaW1lVGVzdCkge1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgaWYgKG5vZGVOYW1lICE9IFwib2JqZWN0XCIgJiYgbm9kZU5hbWUgIT0gXCJlbWJlZFwiICYmXG4gICAgICAgICAgICBub2RlTmFtZSAhPSBcImFcIiAmJiBub2RlTmFtZSAhPSBcImFyZWFcIikgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsZXQgcmV0VmFsID0gZmFsc2U7XG4gICAgICAgIC8vIENoZWNrIG1pbWUgdHlwZVxuICAgICAgICBpZiAoIXJldFZhbCAmJiBub2RlLmhhc0F0dHJpYnV0ZShcInR5cGVcIikpIHtcbiAgICAgICAgICAgIGxldCBtaW1lID0gbm9kZS5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICByZXRWYWwgPSBtaW1lVGVzdChtaW1lKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJldFZhbCAmJiBub2RlLmhhc0F0dHJpYnV0ZShcImNvZGV0eXBlXCIpKSB7XG4gICAgICAgICAgICBsZXQgbWltZSA9IG5vZGUuZ2V0QXR0cmlidXRlKFwiY29kZXR5cGVcIik7XG4gICAgICAgICAgICByZXRWYWwgPSBtaW1lVGVzdChtaW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIHRoZSBmaWxlbmFtZVxuICAgICAgICBpZiAoIXJldFZhbCkge1xuICAgICAgICAgICAgbGV0IGZpbGVuYW1lID0gXCJcIjtcbiAgICAgICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJlbWJlZFwiKSB7XG4gICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBub2RlLmdldEF0dHJpYnV0ZShcInNyY1wiKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobm9kZU5hbWUgPT09IFwiYVwiIHx8IG5vZGVOYW1lID09PSBcImFyZWFcIikge1xuICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gbm9kZS5nZXRBdHRyaWJ1dGUoXCJocmVmXCIpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChub2RlLmhhc0F0dHJpYnV0ZShcImRhdGFcIikpIHtcbiAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IG5vZGUuZ2V0QXR0cmlidXRlKFwiZGF0YVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmaWxlbmFtZSA9PT0gbnVsbCkgZmlsZW5hbWUgPSBcIlwiO1xuICAgICAgICAgICAgbGV0IGV4dCA9IENvbW1vblV0aWwuZ2V0RmlsZUV4dChmaWxlbmFtZSk7XG4gICAgICAgICAgICByZXRWYWwgPSBleHRUZXN0KGV4dCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBmb3IgZmlsZW5hbWVzIGluIHRoZSBwYXJhbXNcbiAgICAgICAgaWYgKCFyZXRWYWwgJiYgbm9kZU5hbWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIC8vIEluIHRoZSBjYXNlIHRoYXQgQ2hlY2sgSGlkZGVuIE9wdGlvbiBpcyBzZXQgdGhlbiBjb21wbHkgd2l0aCB0aGF0IHNldHRpbmdcbiAgICAgICAgICAgIGxldCBwYXJhbXMgPSBDb21tb25VdGlsLmdldENoaWxkQnlUYWdIaWRkZW4obm9kZSwgXCJwYXJhbVwiLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgIXJldFZhbCAmJiBwYXJhbXMgIT0gbnVsbCAmJiBpIDwgcGFyYW1zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgcmV0VmFsID0gcGFyYW1zW2ldLmhhc0F0dHJpYnV0ZShcInZhbHVlXCIpICYmXG4gICAgICAgICAgICAgICAgICAgIGV4dFRlc3QoQ29tbW9uVXRpbC5nZXRGaWxlRXh0KHBhcmFtc1tpXS5nZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgaXNBdWRpb09iakVtYmVkTGluayhub2RlKSB7XG4gICAgICAgIHJldHVybiBDb21tb25VdGlsLmNoZWNrT2JqRW1iZWQobm9kZSwgQ29tbW9uVXRpbC5pc0F1ZGlvRXh0LCBmdW5jdGlvbiAobWltZSkge1xuICAgICAgICAgICAgcmV0dXJuIG1pbWUuc3RhcnRzV2l0aChcImF1ZGlvXCIpXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGlzQXVkaW9FeHQoZXh0KSB7XG4gICAgICAgIGxldCBhdWRpb19leHRlbnNpb25zID0gW1wiLmFpZlwiLCBcIi5haWZjXCIsIFwiLmFpZmZcIiwgXCIuYWlyXCIsIFwiLmFzZlwiLCBcIi5hdVwiLCBcIi5jZGFcIixcbiAgICAgICAgICAgIFwiLmRzbVwiLCBcIi5kc3NcIiwgXCIuZHdkXCIsIFwiLmlmZlwiLCBcIi5rYXJcIiwgXCIubTFhXCIsIFwiLm1lZFwiLFxuICAgICAgICAgICAgXCIubXAyXCIsIFwiLm1wM1wiLCBcIi5tcGFcIiwgXCIucGNtXCIsIFwiLnJhXCIsIFwiLnJhbVwiLCBcIi5ybVwiLFxuICAgICAgICAgICAgXCIuc2FtXCIsIFwiLnNmXCIsIFwiLnNmMlwiLCBcIi5zbXBcIiwgXCIuc25kXCIsIFwiLnN2eFwiLCBcIi51bFwiLFxuICAgICAgICAgICAgXCIudm9jXCIsIFwiLndhdlwiLCBcIi53bWFcIiwgXCIud3ZlXCJcbiAgICAgICAgXTtcbiAgICAgICAgcmV0dXJuIENvbW1vblV0aWwudmFsSW5BcnJheShleHQudG9Mb3dlckNhc2UoKSwgYXVkaW9fZXh0ZW5zaW9ucyk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgaXNWaWRlb09iakVtYmVkTGluayhub2RlKSB7XG4gICAgICAgIHJldHVybiBDb21tb25VdGlsLmNoZWNrT2JqRW1iZWQobm9kZSwgQ29tbW9uVXRpbC5pc1ZpZGVvRXh0LCBmdW5jdGlvbiAobWltZSkge1xuICAgICAgICAgICAgcmV0dXJuIG1pbWUuc3RhcnRzV2l0aChcInZpZGVvXCIpIHx8XG4gICAgICAgICAgICAgICAgbWltZS5zdGFydHNXaXRoKFwiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2hcIik7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGlzVmlkZW9FeHQoZXh0KSB7XG4gICAgICAgIGxldCB2aWRlb19leHRlbnNpb25zID0gW1wiLmFzZlwiLCBcIi5hdmlcIiwgXCIuZGl2eFwiLCBcIi5kdlwiLCBcIi5tMXZcIiwgXCIubTJwXCIsIFwiLm0ydlwiLCBcIi5tb292XCIsXG4gICAgICAgICAgICBcIi5tb3ZcIiwgXCIubXA0XCIsIFwiLm1wZWdcIiwgXCIubXBnXCIsIFwiLm1wdlwiLCBcIi5vZ21cIiwgXCIub21mXCIsIFwiLnF0XCIsXG4gICAgICAgICAgICBcIi5ybVwiLCBcIi5ydlwiLCBcIi5zbWlcIiwgXCIuc21pbFwiLCBcIi5zd2ZcIiwgXCIudm9iXCIsIFwiLndtdlwiLCBcIi5ybXZiXCIsXG4gICAgICAgICAgICBcIi5tdmJcIlxuICAgICAgICBdO1xuICAgICAgICByZXR1cm4gQ29tbW9uVXRpbC52YWxJbkFycmF5KGV4dC50b0xvd2VyQ2FzZSgpLCB2aWRlb19leHRlbnNpb25zKTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBpc0ltYWdlT2JqRW1iZWRMaW5rKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIENvbW1vblV0aWwuY2hlY2tPYmpFbWJlZChub2RlLCBDb21tb25VdGlsLmlzSW1nRXh0LCBmdW5jdGlvbiAobWltZSkge1xuICAgICAgICAgICAgcmV0dXJuIG1pbWUuc3RhcnRzV2l0aChcImltYWdlXCIpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGltYWdlX2V4dGVuc2lvbnMgPSBbXCIuYm1wXCIsIFwiLmdpZlwiLCBcIi5qcGdcIiwgXCIuanBlZ1wiLCBcIi5wY3hcIiwgXCIucG5nXCJdO1xuICAgICAgICBcbiAgICBwdWJsaWMgc3RhdGljIGlzSW1nRXh0KGV4dCkge1xuICAgICAgICByZXR1cm4gQ29tbW9uVXRpbC52YWxJbkFycmF5KGV4dC50b0xvd2VyQ2FzZSgpLCBDb21tb25VdGlsLmltYWdlX2V4dGVuc2lvbnMpO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGlzSHRtbEV4dChleHQpIHtcbiAgICAgICAgbGV0IGh0bWxfZXh0ZW5zaW9ucyA9IFtcIi5hc3BcIiwgXCIuYXNweFwiLCBcIi5jZm1cIiwgXCIuY2ZtbFwiLCBcIi5jZ2lcIiwgXCIuaHRtXCIsIFwiLmh0bWxcIiwgXCIuc2h0bVwiLFxuICAgICAgICAgICAgXCIuc2h0bWxcIiwgXCIucGhwXCIsIFwiLnBsXCIsIFwiLnB5XCIsIFwiLnNodG1cIiwgXCIuc2h0bWxcIiwgXCIueGh0bWxcIlxuICAgICAgICBdO1xuICAgICAgICByZXR1cm4gQ29tbW9uVXRpbC52YWxJbkFycmF5KGV4dC50b0xvd2VyQ2FzZSgpLCBodG1sX2V4dGVuc2lvbnMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaGFzVHJpZ2dlcmVkKGRvYywgaWQpIHtcbiAgICAgICAgcmV0dXJuIENhY2hlVXRpbC5nZXRDYWNoZShkb2MsIGlkLCBmYWxzZSk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgdHJpZ2dlck9uY2UoZG9jLCBpZCwgcGFzc2VkKSB7XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiB0cnVlO1xuICAgICAgICBsZXQgdHJpZ2dlcmVkID0gQ2FjaGVVdGlsLmdldENhY2hlKGRvYywgaWQsIGZhbHNlKTtcbiAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGRvYywgaWQsIHRydWUpO1xuICAgICAgICByZXR1cm4gdHJpZ2dlcmVkO1xuICAgIH1cblxuICAgIC8qIGRldGVybWluZSBpZiB0aGUgZ2l2ZW4gdmFsdWUgZXhpc3RzIGluIHRoZSBnaXZlbiBhcnJheSAqL1xuICAgIHB1YmxpYyBzdGF0aWMgdmFsSW5BcnJheSh2YWx1ZSwgYXJyKSB7XG4gICAgICAgIGZvciAobGV0IGlkeCBpbiBhcnIpIHtcbiAgICAgICAgICAgIGlmIChhcnJbaWR4XSA9PT0gdmFsdWUpIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiByZXR1cm4gdGhlIGFuY2VzdG9yIG9mIHRoZSBnaXZlbiBlbGVtZW50XG4gICAgICogQHBhcmFtIHRhZ05hbWVzIHN0cmluZywgYXJyYXksIG9yIGRpY3Rpb25hcnkgY29udGFpbmluZyB0aGUgdGFncyB0byBzZWFyY2ggZm9yXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRBbmNlc3RvcihlbGVtZW50LCB0YWdOYW1lcykge1xuICAgICAgICBsZXQgd2Fsa05vZGUgPSBlbGVtZW50O1xuICAgICAgICB3aGlsZSAod2Fsa05vZGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGxldCB0aGlzVGFnID0gd2Fsa05vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgKHRhZ05hbWVzKSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzVGFnID09PSB0YWdOYW1lcy50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGFnTmFtZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaWR4IGluIHRhZ05hbWVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWdOYW1lc1tpZHhdID09PSB0aGlzVGFnKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdhbGtOb2RlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpc1RhZyBpbiB0YWdOYW1lcykge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2Fsa05vZGUgPSBET01XYWxrZXIucGFyZW50Tm9kZSh3YWxrTm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdhbGtOb2RlO1xuICAgIH1cblxuICAgIC8vIHJldHVybiB0cnVlIGlmIGVsZW1lbnQxIGFuZCBlbGVtZW50MiBhcmUgc2libGluZ3NcbiAgICBwdWJsaWMgc3RhdGljIGlzU2libGluZyhlbGVtZW50MSwgZWxlbWVudDIpIHtcbiAgICAgICAgaWYgKGVsZW1lbnQxICYmIGVsZW1lbnQyKSB7XG4gICAgICAgICAgICBsZXQgbm9kZSA9IG51bGw7XG4gICAgICAgICAgICBpZiAoRE9NV2Fsa2VyLnBhcmVudE5vZGUoZWxlbWVudDEpICYmIERPTVdhbGtlci5wYXJlbnROb2RlKGVsZW1lbnQxKS5maXJzdENoaWxkKSB7XG4gICAgICAgICAgICAgICAgbm9kZSA9IERPTVdhbGtlci5wYXJlbnROb2RlKGVsZW1lbnQxKS5maXJzdENoaWxkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB3aGlsZSAobm9kZSkge1xuICAgICAgICAgICAgICAgIGlmIChub2RlID09PSBlbGVtZW50MikgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaXNEZXNjZW5kYW50KHBhcmVudCwgY2hpbGQpIHtcbiAgICAgICAgbGV0IG5vZGUgPSBET01XYWxrZXIucGFyZW50Tm9kZShjaGlsZCk7XG4gICAgICAgIHdoaWxlIChub2RlICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChub2RlID09PSBwYXJlbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5vZGUgPSBET01XYWxrZXIucGFyZW50Tm9kZShub2RlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy9jaGVjayBpZiB0aGUgZmlyc3QgZm9ybSBjb250cm9sIGNoaWxkIGlzIGRpc2FibGVkXG4gICAgcHVibGljIHN0YXRpYyBpc0Rpc2FibGVkQnlGaXJzdENoaWxkRm9ybUVsZW1lbnQoZWxlbWVudCkge1xuICAgICAgICBsZXQgZm9ybUVsZW1lbnRzID0gW1wiaW5wdXRcIiwgXCJ0ZXh0YXJlYVwiLCBcInNlbGVjdFwiLCBcImtleWdlblwiLCBcInByb2dyZXNzXCIsIFwibWV0ZXJcIiwgXCJvdXRwdXRcIl07XG4gICAgICAgIGlmIChlbGVtZW50LmZpcnN0Q2hpbGQgIT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IG53ID0gbmV3IERPTVdhbGtlcihlbGVtZW50KTtcbiAgICAgICAgICAgIHdoaWxlIChudy5uZXh0Tm9kZSgpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGZvcm1FbGVtZW50cy5pbmNsdWRlcyhudy5ub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChDb21tb25VdGlsLmlzTm9kZURpc2FibGVkKG53Lm5vZGUpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaXNEaXNhYmxlZEJ5UmVmZXJyaW5nRWxlbWVudChlbGVtZW50KSB7XG4gICAgICAgIGxldCBpZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiaWRcIik7XG4gICAgICAgIGxldCBkb2MgPSBlbGVtZW50Lm93bmVyRG9jdW1lbnQ7XG4gICAgICAgIGxldCByb290ID0gZG9jLmJvZHk7XG4gICAgICAgIHdoaWxlIChET01XYWxrZXIucGFyZW50Tm9kZShyb290KSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gR2V0IHRoZSBwYXJlbnROb2RlXG4gICAgICAgICAgICByb290ID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUocm9vdCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG53ID0gbmV3IERPTVdhbGtlcihyb290KTtcbiAgICAgICAgd2hpbGUgKG53Lm5leHROb2RlKCkpIHtcbiAgICAgICAgICAgIC8vIGNoZWNrIHRoZSBlbGVtZW50IHdob3NlICdhcmlhLWRlc2NyaWJlZGJ5JyBlcXVhbHMgdG8gdGhlIGlkXG4gICAgICAgICAgICBpZiAobncubm9kZSAmJiBudy5ub2RlLm5vZGVUeXBlID09PSAxICYmIG53LmVsZW0oKSkge1xuICAgICAgICAgICAgICAgIGxldCBBcmlhRGVzY3JpYmVkYnlJREFycmF5ID0gKG53LmVsZW0oKS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWRlc2NyaWJlZGJ5XCIpIHx8IFwiXCIpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgICAgICBpZiAoQXJpYURlc2NyaWJlZGJ5SURBcnJheS5pbmNsdWRlcyhpZCkgJiYgQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChudy5ub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBnZXQgZWxlbWVudCBjb250YWluaW5nIGxhYmVsIGZvciB0aGUgZ2l2ZW4gZWxlbWVudFxuICAgICAgICAgKiBAZGVwcmVjYXRlZCBEZXByZWNhdGVkIGJlY2F1c2UgdGhlIGZ1bmN0aW9uIG5hbWUgaXMgbWlzbGVhZGluZy4gVXNlIGdldExhYmVsRm9yRWxlbWVudChlbGVtZW50KSBpbnN0ZWFkXG4gICAgICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SW5wdXRMYWJlbChlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBDb21tb25VdGlsLmdldExhYmVsRm9yRWxlbWVudChlbGVtZW50KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBnZXR0aW5nIHRoZSBlbGVtZW50IGNvbnRhaW5pbmcgdGhlIGxhYmVsIGZvciB0aGUgZ2l2ZW4gZWxlbWVudC5cbiAgICAgKlxuICAgICAqIE5vdGU6IFRoaXMgaXMgYSB3cmFwcGVyIGZ1bmN0aW9uIHRvOiBBcmlhVXRpbC5nZXRMYWJlbEZvckVsZW1lbnRIaWRkZW5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBlbGVtZW50IC0gVGhlIGVsZW1lbnQgZm9yIHdoaWNoIHRvIGdldCB0aGUgbGFiZWwgZWxlbWVudCBmb3IuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtlbGVtZW50fSBlbGVtZW50IC0gcmV0dXJuIHRoZSBlbGVtZW50IGZvciB0aGUgbGFiZWwsIG90aGVyd2lzZSBudWxsXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldExhYmVsRm9yRWxlbWVudChlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBDb21tb25VdGlsLmdldExhYmVsRm9yRWxlbWVudEhpZGRlbihlbGVtZW50LCBmYWxzZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZ2V0dGluZyB0aGUgZWxlbWVudCBjb250YWluaW5nIHRoZSBsYWJlbCBmb3IgdGhlIGdpdmVuIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIG51bGwgaWYgdGhlIGNvbnRhaW5pbmcgbGFibGUgZWxlbWVudCBpcyBoaWRkZW4sIHdoZW4gdGhlIGlnbm9yZUhpZGRlbiBvcHRpb25cbiAgICAgKiBpcyBzZXQgdG8gdHJ1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBlbGVtZW50IC0gVGhlIGVsZW1lbnQgZm9yIHdoaWNoIHRvIGdldCB0aGUgbGFiZWwgZWxlbWVudCBmb3IuXG4gICAgICogQHBhcm0ge2Jvb2xlYW59IGlnbm9yZUhpZGRlbiAtIHRydWUgaWYgaGlkZGVuIGVsZW1lbnRzIHdpdGggbGFiZWwgc2hvdWxkIGJlIGlnbm9yZWQgZnJvbSB0aGUgbGlzdFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSBpZiB0aGUgaGlkZGVuIGVsZW1lbnRzIHNob3VsZCBiZSBhZGRlZFxuICAgICAqXG4gICAgICogQHJldHVybiB7ZWxlbWVudH0gZWxlbWVudCAtIHJldHVybiB0aGUgZWxlbWVudCBmb3IgdGhlIGxhYmVsLCBvdGhlcndpc2UgbnVsbFxuICAgICAqXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRMYWJlbEZvckVsZW1lbnRIaWRkZW4oZWxlbWVudDogRWxlbWVudCwgaWdub3JlSGlkZGVuKSB7XG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBnbG9iYWwgQXJpYVV0aWxfTEFCRUxTIGhhc2ggaXMgYXZhaWxhYmxlLCBhcyB0aGlzIHdpbGwgY29udGFpbiB0aGUgbGFiZWwgbm9kZXMgYmFzZWQgb25cbiAgICAgICAgLy8gZm9yIGF0dHJpYnV0ZS5cbiAgICAgICAgLy9pZiAoIWdldENhY2hlKGVsZW1lbnQub3duZXJEb2N1bWVudCxcIkFyaWFVdGlsX0xBQkVMU1wiLCBudWxsKSkge1xuICAgICAgICBsZXQgcm9vdCA9IGVsZW1lbnQuZ2V0Um9vdE5vZGUoKTtcbiAgICAgICAgaWYgKCFDYWNoZVV0aWwuZ2V0Q2FjaGUoKHJvb3Qubm9kZVR5cGUgPT09IDExKSA/IDxTaGFkb3dSb290PnJvb3QgOiA8RG9jdW1lbnQ+cm9vdCwgXCJBcmlhVXRpbF9MQUJFTFNcIiwgbnVsbCkpIHtcbiAgICAgICAgICAgIC8vIFZhcmlhYmxlIERlY2xlcmF0aW9uXG4gICAgICAgICAgICBsZXQgaWRUb0xhYmVsID0ge31cblxuICAgICAgICAgICAgLy8gR2V0IGFsbCB0aGUgbGFiZWwgZWxlbWVudHMgaW4gdGhlIGVudGlyZSBkb2NcbiAgICAgICAgICAgIGxldCBsYWJlbE5vZGVzID0gQ29tbW9uVXRpbC5nZXREb2NFbGVtZW50c0J5VGFnKGVsZW1lbnQsIFwibGFiZWxcIik7XG4gICAgICAgICAgICAvLyBMb29wIG92ZXIgYWxsIHRoZSBsYWJlbCBub2RlcywgaW4gdGhlIGNhc2UgdGhlIGxhYmVsIG5vZGUgaGFzIGEgZm9yIGF0dHJpYnV0ZSxcbiAgICAgICAgICAgIC8vIGV4dHJhY3QgdGhhdCBhdHRyaWJ1dGUgYW5kIGFkZCB0aGlzIG5vZGUgdG8gdGhlIGhhc2ggaWYgaXQgaXMgdmlzaWJsZS5cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGFiZWxOb2Rlcy5sZW5ndGg7ICsraSkge1xuXG4gICAgICAgICAgICAgICAgaWYgKGxhYmVsTm9kZXNbaV0uaGFzQXR0cmlidXRlKFwiZm9yXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIGlnbm9yZSBoaWRkZW4gaXMgc3BlY2lmaWVkIGFuZCB0aGUgbm9kZSBpcyBub3QgdmlzaWJsZSB3ZSBkbyBub3QgYWRkIGl0IHRvIHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyBsYWJlbE5vZGVzIGhhc2guXG4gICAgICAgICAgICAgICAgICAgIGlmIChpZ25vcmVIaWRkZW4gJiYgIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShsYWJlbE5vZGVzW2ldKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZFRvTGFiZWxbbGFiZWxOb2Rlc1tpXS5nZXRBdHRyaWJ1dGUoXCJmb3JcIildID0gbGFiZWxOb2Rlc1tpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEFkZCB0aGUgYnVpbHQgaGFzaCB0byB0aGUgb3duZXJEb2N1bWVudCAoZG9jdW1lbnQpLCB0byBiZSB1c2VkIGxhdGVyIHRvIGZhc3QgcmV0cml2YWxcbiAgICAgICAgICAgIC8vc2V0Q2FjaGUoZWxlbWVudC5vd25lckRvY3VtZW50LCBcIkFyaWFVdGlsX0xBQkVMU1wiLCBpZFRvTGFiZWwpO1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKChyb290Lm5vZGVUeXBlID09PSAxMSkgPyA8U2hhZG93Um9vdD5yb290IDogPERvY3VtZW50PnJvb3QsIFwiQXJpYVV0aWxfTEFCRUxTXCIsIGlkVG9MYWJlbCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiB0aGlzIGVsZW1lbnQgaGFzIGFuIGlkIGF0dHJpYnV0ZSwgZ2V0IHRoZSBjb3Jvc3BvbmRpbmcgbGFiZWwgZWxlbWVudFxuICAgICAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJpZFwiKSkge1xuICAgICAgICAgICAgLy8gRmV0Y2ggdGhlIGlkIGF0dHJpYnV0ZVxuICAgICAgICAgICAgbGV0IGN0cmxJZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiaWRcIik7XG4gICAgICAgICAgICAvLyBSZXR1cm4gdGhlIGNvcm9zcG9uZGluZyBsYWJlbCBlbGVtZW50LlxuICAgICAgICAgICAgLy8gTm90ZTogaW4gdGhlIGNhc2UgdGhhdCB0aGUgdGhlIGlkIGlzIG5vdCBmb3VuZCBpbiB0aGUgaGFzaCB0aGF0IG1lYW5zLCBpdCBkb2VzIG5vdCBleGlzdHMgb3IgaXMgaGlkZGVuXG4gICAgICAgICAgICBpZiAoY3RybElkLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgLy9yZXR1cm4gZ2V0Q2FjaGUoZWxlbWVudC5nZXRSb290Tm9kZSgpLm93bmVyRG9jdW1lbnQsXCJBcmlhVXRpbF9MQUJFTFNcIix7fSlbY3RybElkXTtcbiAgICAgICAgICAgICAgICByZXR1cm4gQ2FjaGVVdGlsLmdldENhY2hlKChyb290Lm5vZGVUeXBlID09PSAxMSkgPyA8U2hhZG93Um9vdD5yb290IDogPERvY3VtZW50PnJvb3QsIFwiQXJpYVV0aWxfTEFCRUxTXCIsIHt9KVtjdHJsSWRdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qIFJldHVybiBzcGVjaWZpZWQgZWxlbWVudCBhdHRyaWJ1dGUgaWYgcHJlc2VudCBlbHNlIHJldHVybiBudWxsICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRFbGVtZW50QXR0cmlidXRlKGVsZW1lbnQsIGF0dHIpIHtcbiAgICAgICAgLy9yZXR1cm4gKGVsZW1lbnQgJiYgZWxlbWVudC5oYXNBdHRyaWJ1dGUgJiYgZWxlbWVudC5oYXNBdHRyaWJ1dGUoYXR0cikpID8gZWxlbWVudC5nZXRBdHRyaWJ1dGUoYXR0cikgOiBudWxsO1xuICAgICAgICBpZiAoIWF0dHIgfHwgIWVsZW1lbnQgfHwgIWVsZW1lbnQuaGFzQXR0cmlidXRlIHx8ICFlbGVtZW50Lmhhc0F0dHJpYnV0ZShhdHRyKSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGNvbnN0IGF0clZhbHVlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoYXR0cilcbiAgICAgICAgaWYgKCFBUklBRGVmaW5pdGlvbnMucmVmZXJlbmNlUHJvcGVydGllcy5pbmNsdWRlcyhhdHRyKSlcbiAgICAgICAgICAgIHJldHVybiBhdHJWYWx1ZTtcblxuICAgICAgICAvL2F0dHIgaXMgYSByZWZlcmVuY2UgdG8gb3RoZXIgZWxlbWVudHMocylcbiAgICAgICAgY29uc3QgdmFsdWVzID0gYXRyVmFsdWUuc3BsaXQoLyArL2cpO1xuICAgICAgICAvL2lnbm9yZSBpZiBub25lIG9mIHRoZSByZWZlcnJlZCBlbGVtZW50KHMpIGV4aXN0IG9yIGFsbCBwb2ludCB0byB0aGUgZWxlbWVudCBpdHNlbGZcbiAgICAgICAgbGV0IGV4aXN0ID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGlkID0gMDsgdmFsdWVzIDwgdmFsdWVzLmxlbmd0aDsgKytpZCkge1xuICAgICAgICAgICAgY29uc3QgcmVmZXJyZWQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh2YWx1ZXNbaWRdKTtcbiAgICAgICAgICAgIGlmIChyZWZlcnJlZCAmJiAhRE9NVXRpbC5zYW1lTm9kZShyZWZlcnJlZCwgZWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICBleGlzdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGV4aXN0ID8gYXRyVmFsdWUgOiBudWxsO1xuICAgIH1cblxuICAgIC8vIFJldHVybiB0cnVlIGlmIGVsZW1lbnQgaGFzIHZhbGlkIGltcGxpY2l0IGxhYmVsXG4gICAgcHVibGljIHN0YXRpYyBoYXNJbXBsaWNpdExhYmVsKGVsZW1lbnQpIHtcbiAgICAgICAgbGV0IHBhcmVudE5vZGUgPSBDb21tb25VdGlsLmdldEFuY2VzdG9yKGVsZW1lbnQsIFwibGFiZWxcIik7XG4gICAgICAgIC8vIFRlc3QgIGEpIGlmIHRoZSBwYXJlbnQgaXMgYSBsYWJlbCB3aGljaCBpcyB0aGUgaW1wbGljaXQgbGFiZWxcbiAgICAgICAgLy8gICAgICAgYikgaWYgdGhlIGZvcm0gZWxlbWVudCBpcyB0aGUgZmlyc3QgY2hpbGQgb2YgdGhlIGxhYmVsXG4gICAgICAgIC8vICAgICAgIGMpIGlmIHRoZSBmb3JtIGVsZW1lbnQgcmVxdWlyZXMgYW4gaW1wbGljaXQgb3IgZXhwbGljaXQgbGFiZWwgOiBcImlucHV0XCIsICBcInRleHRhcmVhXCIsIFwic2VsZWN0XCIsIFwia2V5Z2VuXCIsIFwicHJvZ3Jlc3NcIiwgXCJtZXRlclwiLCBcIm91dHB1dFwiXG4gICAgICAgIC8vICAgICAgIGQpIGZvcm0gZWxlbWVudHMgd2hpY2ggbWF5IGhhdmUgYSBsYWJlbDogYnV0dG9uXG4gICAgICAgIC8vIGZvcm0gZWxlbWVudHMgdGhhdCBkbyBub3QgcmVxdWlyZSBpbXBsaWNpdCBvciBleHBsaWNpdCBsYWJlbCBlbGVtZW50IGFyZTpcbiAgICAgICAgLy8gXCJvcHRncm91cFwiLCBcIm9wdGlvblwiLCBcImRhdGFsaXN0XCIoYWRkZWQgbGF0ZXIpLiBUaGVzZSB3ZXJlIGhhbmRsZWQgZGlmZmVyZW50bHkgaW4gdGhlIG1haW4gcnVsZSwgbWlnaHQgbmVlZCB0byByZWZhY3RvciB0aGUgY29kZSBsYXRlclxuXG4gICAgICAgIGlmIChwYXJlbnROb2RlICYmIHBhcmVudE5vZGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImxhYmVsXCIgJiYgQ29tbW9uVXRpbC5pc0ZpcnN0Rm9ybUVsZW1lbnQocGFyZW50Tm9kZSwgZWxlbWVudCkpIHtcbiAgICAgICAgICAgIGxldCBwYXJlbnRDbG9uZSA9IHBhcmVudE5vZGUuY2xvbmVOb2RlKHRydWUpO1xuICAgICAgICAgICAgLy8gZXhjbHVkZSBhbGwgZm9ybSBlbGVtZW50cyBmcm9tIHRoZSBsYWJlbCBzaW5jZSB0aGV5IG1pZ2h0IGFsc28gaGF2ZSBpbm5lciBjb250ZW50XG4gICAgICAgICAgICBwYXJlbnRDbG9uZSA9IENvbW1vblV0aWwucmVtb3ZlQWxsRm9ybUVsZW1lbnRzRnJvbUxhYmVsKHBhcmVudENsb25lKTtcbiAgICAgICAgICAgIHJldHVybiBDb21tb25VdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbihwYXJlbnRDbG9uZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gdGhlIGltcGxpY2l0IGxhYmVsIG9mIHRoZSBnaXZlbiBmb3JtIGZpZWxkXG4gICAgcHVibGljIHN0YXRpYyBnZXRJbXBsaWNpdExhYmVsKGVsZW1lbnQpIHtcbiAgICAgICAgbGV0IHBhcmVudE5vZGUgPSBDb21tb25VdGlsLmdldEFuY2VzdG9yKGVsZW1lbnQsIFwibGFiZWxcIik7XG4gICAgICAgIC8vIFRlc3QgIGEpIGlmIHRoZSBwYXJlbnQgaXMgYSBsYWJlbCB3aGljaCBpcyB0aGUgaW1wbGljaXQgbGFiZWxcbiAgICAgICAgLy8gICAgICAgYikgaWYgdGhlIGZvcm0gZWxlbWVudCBpcyB0aGUgZmlyc3QgY2hpbGQgb2YgdGhlIGxhYmVsXG4gICAgICAgIC8vICAgICAgIGMpIGlmIHRoZSBmb3JtIGVsZW1lbnQgcmVxdWlyZXMgYW4gaW1wbGljaXQgb3IgZXhwbGljaXQgbGFiZWwgOiBcImlucHV0XCIsICBcInRleHRhcmVhXCIsIFwic2VsZWN0XCIsIFwia2V5Z2VuXCIsIFwicHJvZ3Jlc3NcIiwgXCJtZXRlclwiLCBcIm91dHB1dFwiXG4gICAgICAgIC8vICAgICAgIGQpIGZvcm0gZWxlbWVudHMgd2hpY2ggbWF5IGhhdmUgYSBsYWJlbDogYnV0dG9uXG4gICAgICAgIC8vIGZvcm0gZWxlbWVudHMgdGhhdCBkbyBub3QgcmVxdWlyZSBpbXBsaWNpdCBvciBleHBsaWNpdCBsYWJlbCBlbGVtZW50IGFyZTpcbiAgICAgICAgLy8gXCJvcHRncm91cFwiLCBcIm9wdGlvblwiLCBcImRhdGFsaXN0XCIoYWRkZWQgbGF0ZXIpLiBUaGVzZSB3ZXJlIGhhbmRsZWQgZGlmZmVyZW50bHkgaW4gdGhlIG1haW4gcnVsZSwgbWlnaHQgbmVlZCB0byByZWZhY3RvciB0aGUgY29kZSBsYXRlclxuXG4gICAgICAgIGlmIChwYXJlbnROb2RlICYmIHBhcmVudE5vZGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImxhYmVsXCIgJiYgQ29tbW9uVXRpbC5pc0ZpcnN0Rm9ybUVsZW1lbnQocGFyZW50Tm9kZSwgZWxlbWVudCkpIHtcbiAgICAgICAgICAgIGxldCBwYXJlbnRDbG9uZSA9IHBhcmVudE5vZGUuY2xvbmVOb2RlKHRydWUpO1xuICAgICAgICAgICAgLy8gZXhjbHVkZSBhbGwgZm9ybSBlbGVtZW50cyBmcm9tIHRoZSBsYWJlbCBzaW5jZSB0aGV5IG1pZ2h0IGFsc28gaGF2ZSBpbm5lciBjb250ZW50XG4gICAgICAgICAgICBwYXJlbnRDbG9uZSA9IENvbW1vblV0aWwucmVtb3ZlQWxsRm9ybUVsZW1lbnRzRnJvbUxhYmVsKHBhcmVudENsb25lKTtcbiAgICAgICAgICAgIGNvbnN0IGxhYmVsID0gQ29tbW9uVXRpbC5nZXRJbm5lclRleHQocGFyZW50Q2xvbmUpO1xuICAgICAgICAgICAgcmV0dXJuIGxhYmVsICYmIGxhYmVsLnRyaW0oKSAhPT0gJycgPyBsYWJlbC50cmltKCkgOiBudWxsO1xuICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGdldHRpbmcgdGhlIGxhYmVsIGZvciBhIGZvcm0gZmllbGQgZWxlbWVudC5cbiAgICAgKlxuICAgICAqXG4gICAgICogQHBhcm0ge2VsZW1lbnR9IGVsZW1lbnQgLSBUaGUgZWxlbWVudCBmcm9tIHdoaWNoIHRvIGdldCB0aGUgbGFiZWwuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IHRleHQgLSByZXR1cm4gdGhlIGxhYmVsIHRleHQgb3IgbnVsbFxuICAgICAqXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRGb3JtRmllbGRMYWJlbChlbGVtKSA6IHN0cmluZyB8IG51bGwge1xuICAgICAgICAvLyBnZXQgdGhlIGxhYmVsIGZyb20gdGhlIGF0dHJpYnV0ZSBcImZvclwiIG9mIHRoZSBsYWJlbCBlbGVtZW50XG4gICAgICAgIC8vIEdldCBvbmx5IHRoZSBub24taGlkZGVuIGxhYmVscyBmb3IgZWxlbWVudFxuICAgICAgICBsZXQgdmFsdWUgPSBcIlwiO1xuICAgICAgICBsZXQgbGFiZWwgPSBudWxsO1xuICAgICAgICBsZXQgbGFiZWxFbGVtID0gQ29tbW9uVXRpbC5nZXRMYWJlbEZvckVsZW1lbnRIaWRkZW4oZWxlbSwgdHJ1ZSk7XG4gICAgICAgIGlmIChsYWJlbEVsZW0pIHtcbiAgICAgICAgICAgIC8vIHZhbHVlIGRpcmVjdGx5IGZyb20gZWxlbWVudCB0ZXh0XG4gICAgICAgICAgICBsYWJlbCA9IGxhYmVsRWxlbS5pbm5lclRleHQ7IC8vIGlnbm9yZSBoaWRkZW4gdGV4dFxuICAgICAgICB9IGVsc2UgeyAgICBcbiAgICAgICAgICAgIC8qKiBpZiBpdCdzIG5vdCBsYWJlbCB3aXRoIGZvciBhdHRyaWJ1dGUsIHRoZW4gZmluZCBpbXBsaWNpdCBsYWJlbFxuICAgICAgICAgICAgICogY2FzZXMgZm9yIGV4cGxpY3QgbGFiZWw6IFxuICAgICAgICAgICAgICogICA8bGFiZWwgZm9yPSdteSc+PC9sYWJlbD48aW5wdXQgaWQ9J215Jy8+XG4gICAgICAgICAgICAgKiAgIDxsYWJlbCBmb3I9J215Jz48aW5wdXQgaWQ9J215Jy8+PC9sYWJlbD4gICBcbiAgICAgICAgICAgICAqIGNhc2VzIGZvciBpbXBsaWNpdCBsYWJlbDogXG4gICAgICAgICAgICAgKiAgICA8bGFiZWw+PGlucHV0IC8+PC9sYWJlbD5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgbGFiZWxFbGVtID0gQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihlbGVtLCBcImxhYmVsXCIpO1xuICAgICAgICAgICAgaWYgKGxhYmVsRWxlbSAmJiBsYWJlbEVsZW0udGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImxhYmVsXCIgJiYgQ29tbW9uVXRpbC5pc0ZpcnN0Rm9ybUVsZW1lbnQobGFiZWxFbGVtLCBlbGVtKSkge1xuICAgICAgICAgICAgICAgIGxldCBwYXJlbnRDbG9uZSA9IGxhYmVsRWxlbS5jbG9uZU5vZGUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgLy8gZXhjbHVkZSBhbGwgdGhlIHRleHQgZnJvbSB0aGUgZmlyc3QgZm9ybSBlbGVtZW50IHNpbmNlIHRoZXkgbWlnaHQgYWxzbyBcbiAgICAgICAgICAgICAgICAvLyBoYXZlIGlubmVyIGNvbnRlbnQgdGhhdCBpcyBwYXJ0IG9mIGlubmVyVGV4dFxuICAgICAgICAgICAgICAgIHBhcmVudENsb25lID0gQ29tbW9uVXRpbC5yZW1vdmVBbGxGb3JtRWxlbWVudHNGcm9tTGFiZWwocGFyZW50Q2xvbmUpO1xuICAgICAgICAgICAgICAgIGxhYmVsID0gQ29tbW9uVXRpbC5nZXRJbm5lclRleHQocGFyZW50Q2xvbmUpO1xuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7ICAgXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmIChsYWJlbCAmJiBsYWJlbC50cmltKCkgIT09IFwiXCIpXG4gICAgICAgICAgICB2YWx1ZSArPSBsYWJlbC50cmltKCk7XG4gICAgICAgIFxuICAgICAgICAvLyB2YWx1ZSBmcm9tIGNoaWxkIGVsZW1lbnQgYXR0cmlidXRlXG4gICAgICAgIGxhYmVsID0gQ29tbW9uVXRpbC5nZXRMYWJlbFRleHRGcm9tQXR0cmlidXRlKGxhYmVsRWxlbSwgdHJ1ZSk7XG4gICAgICAgIGlmIChsYWJlbCAmJiBsYWJlbC50cmltKCkgIT09IFwiXCIpXG4gICAgICAgICAgICB2YWx1ZSArPSBsYWJlbC50cmltKCk7XG5cbiAgICAgICAgLy8gd2lyZWQgY2FzZTogZ2V0IGFyaWEgbGFiZWwgZnJvbSBsYWJlbCBlbGVtZW50IGl0c2VsZiBqdXN0IGluIGNhc2UgKHRob3VnaCBuYW1lIHByb2hpYml0ZWQgZnJvbSBhcmlhIGluIGh0bWwpXG4gICAgICAgIGxhYmVsID0gQXJpYVV0aWwuZ2V0QXJpYUxhYmVsKGxhYmVsRWxlbSk7XG4gICAgICAgIGlmIChsYWJlbCAmJiBsYWJlbC50cmltKCkgIT09IFwiXCIpXG4gICAgICAgICAgICB2YWx1ZSArPSBsYWJlbC50cmltKCk7XG5cbiAgICAgICAgcmV0dXJuIHZhbHVlLnRyaW0oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBjYWxjdWxhdGUgbGFiZWwgZnJvbSBlbWJlZGRlZCBjb250cm9sOiBodHRwczovL3czYy5naXRodWIuaW8vYWNjbmFtZS9cbiAgICAgKiBAcGFyYW0ge2VsZW1lbnR9IGxhYmVsRWxlbSBsYWJlbCBlbGVtZW50XG4gICAgICogQHBhcmFtIHtib29sZWFufSBpZ25vcmVIaWRkZW4gLSB0cnVlIGlmIGhpZGRlbiBlbGVtZW50cyB3aXRoIGxhYmVsIHNob3VsZCBiZSBpZ25vcmVkIGZyb20gdGhlIGxpc3RcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgaWYgdGhlIGhpZGRlbiBlbGVtZW50cyBzaG91bGQgYmUgYWRkZWQgIFxuICAgICAqIEByZXR1cm5zIGxhYmVsIHRleHQgb3IgJydcbiAgICAgKiBcbiAgICAgKiBub3RlIHRoZSBhc3N1bXB0aW9uIGlzIHRoZSBsYWJlbEVsZW0gcmVmZXJzIGVpdGhlciB0byBhIGxhYmVsbGVkIGVsZW1lbnQgYnkgJ2ZvcicgYXR0cmlidXRlIFxuICAgICAqICBvciBpdHMgZmlyc3QgZm9ybSBmaWVsZCBpcyBsYWJiZWxsZWQgZWxlbWVudFxuICAgICAqLyBcbiAgICBwdWJsaWMgc3RhdGljIGdldExhYmVsVGV4dEZyb21BdHRyaWJ1dGUobGFiZWxFbGVtOiBFbGVtZW50LCBpZ25vcmVIaWRkZW46IGJvb2xlYW4pIDogc3RyaW5nIHtcbiAgICAgICAgLy8gbGFiZWwgZWl0aGVyIHBvaW50cyB0byBhIGxhYmVsYWJsZSBlbGVtZW50IGJ5IGl0cyBmb3IgYXR0cmlidXRlIG9yIHRoZSBmaXJzdCBlbGVtZW50IGNoaWxkXG4gICAgICAgIC8vIGdldCB0aGUgbGFiZWxsZWQgZWxtZW50IGlmIGl0J3MgYW4gaW1wbGljaXQgbGFiZWxcbiAgICAgICAgbGV0IGxhYmVsZWRFbGVtID0gbnVsbDtcbiAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbGFiZWxFbGVtLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBjaGlsZDogRWxlbWVudCA9IGxhYmVsRWxlbS5jaGlsZHJlbi5pdGVtKGkpO1xuICAgICAgICAgICAgaWYgKENvbW1vblV0aWwuZm9ybV9sYWJlbGFibGVfZWxlbWVudHMuaW5jbHVkZXMoY2hpbGQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgICAgICAgICAgICBsYWJlbGVkRWxlbSA9IGNoaWxkO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBsZXQgbncgPSBuZXcgRE9NV2Fsa2VyKGxhYmVsRWxlbSk7XG4gICAgICAgIGxldCB0ZXh0ID0gJyc7XG4gICAgICAgIHdoaWxlIChudy5uZXh0Tm9kZSgpICYmIG53Lm5vZGUgIT09IGxhYmVsRWxlbSkge1xuICAgICAgICAgICAgLy8gb25seSBjaGVjayBlbGVtZW50IGNoaWxkcmVuXG4gICAgICAgICAgICBpZiAobncubm9kZSAmJiBudy5ub2RlLm5vZGVUeXBlID09PSAxICYmIG53LmVsZW0oKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW0gPSBudy5lbGVtKCk7XG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIGlmIGl0J3MgaGlkZGVuLCBvciBsYWJlbGxlZCBlbGVtZW50LCBvciBmaXJzdCBmb3JtIGVsZW1lbnQgaWYgbm90IGxhYmVsZWQgYnkgZm9yIGF0dHJpYnV0ZVxuICAgICAgICAgICAgICAgIGlmICgoaWdub3JlSGlkZGVuICYmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChlbGVtKSB8fCBWaXNVdGlsLmlzTm9kZVByZXNlbnRhdGlvbmFsKGVsZW0pKSlcbiAgICAgICAgICAgICAgICAgICAgfHwgKGxhYmVsZWRFbGVtICYmIGxhYmVsZWRFbGVtLmNvbnRhaW5zKGVsZW0pKSlcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICBjb25zdCByb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKGVsZW0pO1xuICAgICAgICAgICAgICAgIC8vIHRleHRib3ggZXRjLiByZXR1cm4gaXRzIHRleHQgdmFsdWVcbiAgICAgICAgICAgICAgICBpZiAocm9sZSA9PT0gXCJ0ZXh0Ym94XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IGVsZW0uZ2V0QXR0cmlidXRlKFwidmFsdWVcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICYmIG5hbWUudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9ICcgJyArIG5hbWUudHJpbSgpO1xuXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyb2xlID09PSBcImNvbWJvYm94XCIgfHwgcm9sZSA9PT0gXCJsaXN0Ym94XCIpIHsgXG4gICAgICAgICAgICAgICAgICAgIC8vIGZvciBjb21ib2JveCBvciBsaXN0Ym94IHJvbGVzLCByZXR1cm4gdGhlIHRleHQgYWx0ZXJuYXRpdmUgb2YgdGhlIGNob3NlbiBvcHRpb24uXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkSWQgPSBlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiKSB8fCBlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtc2VsZWN0ZWRcIikgfHwgZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWNoZWNrZWRcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZElkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2VsZWN0ZWRPcHRpb24gPSBlbGVtLm93bmVyRG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoc2VsZWN0ZWRJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRPcHRpb24gJiYgIURPTVV0aWwuc2FtZU5vZGUoZWxlbSwgc2VsZWN0ZWRPcHRpb24pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZShzZWxlY3RlZE9wdGlvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhaXIgJiYgcGFpci5uYW1lKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9ICcgJyArIHBhaXIubmFtZS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFtcInByb2dyZXNzYmFyXCIsIFwic2Nyb2xsYmFyXCIsIFwic2xpZGVyXCIsIFwic3BpbmJ1dHRvblwiLCBcIm1ldGVyXCJdLmluY2x1ZGVzKHJvbGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGZvciByYW5nZSByb2xlIHR5cGUsIGluY2x1ZGluZyBcInByb2dyZXNzYmFyXCIsIFwic2Nyb2xsYmFyXCIsIFwic2xpZGVyXCIsIFwic3BpbmJ1dHRvblwiIHJvbGVzXG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBhcmlhLXZhbHVldGV4dCBwcm9wZXJ0eSBpcyBwcmVzZW50LCByZXR1cm4gaXRzIHZhbHVlXG4gICAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS12YWx1ZXRleHRcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZS50cmltKCkubGVuZ3RoID4gMCkgXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9ICcgJyArIHZhbHVlLnRyaW0oKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIGlmIHRoZSBhcmlhLXZhbHVlbm93IHByb3BlcnR5IGlzIHByZXNlbnQsIHJldHVybiBpdHMgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLXZhbHVlbm93XCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgJiYgdmFsdWUudHJpbSgpLmxlbmd0aCA+IDApIFxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCArPSAnICcgKyB2YWx1ZS50cmltKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gZmluYWxseSB1c2UgbmF0aXZlIHZhbHVlIGF0dHJpYnV0ZVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGVsZW0uZ2V0QXR0cmlidXRlKFwidmFsdWVcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZS50cmltKCkubGVuZ3RoID4gMCkgXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9ICcgJyArIHZhbHVlLnRyaW0oKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBnZXQgYXJpYSBsYWJlbCBmcm9tIHRoZSBlbGVtZW50XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBBcmlhVXRpbC5nZXRBcmlhTGFiZWwoZWxlbSk7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlICYmIHZhbHVlLnRyaW0oKSAhPT0gXCJcIilcbiAgICAgICAgICAgICAgICAgICAgdGV4dCArPSAnICcgKyB2YWx1ZS50cmltKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGV4dC50cmltKCk7ICAgIFxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaXNGaXJzdEZvcm1FbGVtZW50KHBhcmVudE5vZGUsIGVsZW1lbnQpIHtcbiAgICAgICAgLy9sZXQgZm9ybUVsZW1lbnRzUmVxdWlyaW5nTGFiZWwgPSBbXCJpbnB1dFwiLCBcInRleHRhcmVhXCIsIFwic2VsZWN0XCIsIFwia2V5Z2VuXCIsIFwicHJvZ3Jlc3NcIiwgXCJtZXRlclwiLCBcIm91dHB1dFwiXTtcbiAgICAgICAgaWYgKHBhcmVudE5vZGUuZmlyc3RDaGlsZCAhPSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgbncgPSBuZXcgRE9NV2Fsa2VyKHBhcmVudE5vZGUpO1xuICAgICAgICAgICAgd2hpbGUgKG53Lm5leHROb2RlKCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoQ29tbW9uVXRpbC5mb3JtX2xhYmVsYWJsZV9lbGVtZW50cy5pbmRleE9mKG53Lm5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudy5ub2RlID09PSBlbGVtZW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgYSBzaGFkb3cgaG9zdCBvciBkZXNjZW5kYW50IG9mIGEgc2hhZG93IGhvc3QsIGJ1dCBub3QgYSBkZXNjZWRhbnQgb2YgdGhlIHNoYWRvdyByb290IG9mIHRoZSBob3N0ICh0byBiZSBhc3NpZ25lZCB0byBzaGFkb3cgc2xvdCBvciBpZ25vcmVkKSAgXG4gICAgcHVibGljIHN0YXRpYyBpc1NoYWRvd0hvc3RFbGVtZW50KGVsZW1lbnQ6IEVsZW1lbnQpIHtcbiAgICAgICAgaWYgKENvbW1vblV0aWwuaXNTaGFkb3dFbGVtZW50KGVsZW1lbnQpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsZXQgd2Fsa05vZGU6IEVsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgICB3aGlsZSAod2Fsa05vZGUpIHtcbiAgICAgICAgICAgIGlmICh3YWxrTm9kZS5zaGFkb3dSb290KSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIHdhbGtOb2RlID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQod2Fsa05vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvL2NoZWNrIGlmIGFuIGVsZW1lbnQgaXMgaW4gYSBzaGFkb3cgdHJlZVxuICAgIHB1YmxpYyBzdGF0aWMgaXNTaGFkb3dFbGVtZW50KGVsZW1lbnQ6IEVsZW1lbnQpIHtcbiAgICAgICAgbGV0IHJvb3QgPSBlbGVtZW50LmdldFJvb3ROb2RlKCk7XG4gICAgICAgIGlmIChyb290LnRvU3RyaW5nKCkgPT09IFwiW29iamVjdCBTaGFkb3dSb290XVwiKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHJlbW92ZUFsbEZvcm1FbGVtZW50c0Zyb21MYWJlbChlbGVtZW50KSB7XG4gICAgICAgIGxldCBmb3JtRWxlbWVudHMgPSBbXCJpbnB1dFwiLCBcInRleHRhcmVhXCIsIFwic2VsZWN0XCIsIFwiYnV0dG9uXCIsIFwiZGF0YWxpc3RcIiwgXCJvcHRncm91cFwiLCBcIm9wdGlvblwiLCBcImtleWdlblwiLCBcIm91dHB1dFwiLCBcInByb2dyZXNzXCIsIFwibWV0ZXJcIl07XG4gICAgICAgIGxldCBjaGlsZE5vZGVzID0gZWxlbWVudC5jaGlsZE5vZGVzO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChmb3JtRWxlbWVudHMuaW5kZXhPZihjaGlsZE5vZGVzW2ldLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpID4gLTEpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZUNoaWxkKGNoaWxkTm9kZXNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gZWxlbWVudCBcbiAgICAgICAgICogQHBhcmFtIGlkU3RyIFxuICAgICAgICAgKiBAcmV0dXJucyB0cnVlIGlmIGFueSBvbmUgKGlmIG11bHRpcGxlIElkcykgaWQgcG9pbnRzIHRvIGl0c2VsZlxuICAgICAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzSWRSZWZlclRvU2VsZihlbGVtZW50LCBpZFN0cjogU3RyaW5nKSB7XG4gICAgICAgIGlmICghaWRTdHIgfHwgaWRTdHIudHJpbSgpID09PSAnJykgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsZXQgaWRzID0gaWRTdHIudHJpbSgpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgZm9yIChsZXQgaiA9IDAsIGxlbmd0aCA9IGlkcy5sZW5ndGg7IGogPCBsZW5ndGg7ICsraikge1xuICAgICAgICAgICAgbGV0IHJlZmVycmVkTm9kZSA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKGVsZW1lbnQsIGlkc1tqXSk7XG4gICAgICAgICAgICBpZiAocmVmZXJyZWROb2RlICYmIERPTVV0aWwuc2FtZU5vZGUocmVmZXJyZWROb2RlLCBlbGVtZW50KSkgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qIERldGVybWluZSB0aGUgbm9kZSBkZXB0aCBvZiB0aGUgZ2l2ZW4gZWxlbWVudCAqL1xuICAgIHB1YmxpYyBzdGF0aWMgbm9kZURlcHRoKGVsZW1lbnQpIHtcbiAgICAgICAgbGV0IGRlcHRoID0gMDtcbiAgICAgICAgbGV0IHdhbGtOb2RlID0gZWxlbWVudDtcbiAgICAgICAgd2hpbGUgKHdhbGtOb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgICB3YWxrTm9kZSA9IERPTVdhbGtlci5wYXJlbnROb2RlKHdhbGtOb2RlKTtcbiAgICAgICAgICAgIGRlcHRoID0gZGVwdGggKyAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZXB0aDtcbiAgICB9XG5cbiAgICAvKiBjb21wYXJlIG5vZGUgb3JkZXIgb2YgdGhlIDIgZ2l2ZW4gbm9kZXMgKi9cbiAgICAvKiByZXR1cm5zXG4gICAgICogICAwIGlmIHRoZSBub2RlcyBhcmUgZXF1YWxcbiAgICAgKiAgIDEgaWYgbm9kZSBiIGlzIGJlZm9yZSBub2RlIGFcbiAgICAgKiAgLTEgaWYgbm9kZSBhIGlzIGJlZm9yZSBub2RlIGJcbiAgICAgKiAgIDIgaWYgbm9kZSBhIGlzIG5lc3RlZCBpbiBub2RlIGJcbiAgICAgKiAgLTIgaWYgbm9kZSBiIGlzIG5lc3RlZCBpbiBub2RlIGFcbiAgICAgKiAgIG51bGwgaWYgZWl0aGVyIG5vZGUgaXMgbnVsbCBvciB0aGVpciBwYXJlbnQgbm9kZXMgYXJlIG5vdCBlcXVhbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgY29tcGFyZU5vZGVPcmRlcihub2RlQSwgbm9kZUIpIHtcbiAgICAgICAgaWYgKG5vZGVBID09PSBub2RlQikgcmV0dXJuIDA7XG5cbiAgICAgICAgbGV0IGFEZXB0aCA9IENvbW1vblV0aWwubm9kZURlcHRoKG5vZGVBKTtcbiAgICAgICAgbGV0IGJEZXB0aCA9IENvbW1vblV0aWwubm9kZURlcHRoKG5vZGVCKTtcbiAgICAgICAgaWYgKGJEZXB0aCA+IGFEZXB0aCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBiRGVwdGggLSBhRGVwdGg7ICsraSlcbiAgICAgICAgICAgICAgICBub2RlQiA9IERPTVdhbGtlci5wYXJlbnROb2RlKG5vZGVCKTtcbiAgICAgICAgICAgIGlmIChub2RlQSA9PT0gbm9kZUIpIC8vIE5vZGUgQiBuZXN0ZWQgaW4gTm9kZSBBXG4gICAgICAgICAgICAgICAgcmV0dXJuIC0yO1xuICAgICAgICB9IGVsc2UgaWYgKGFEZXB0aCA+IGJEZXB0aCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhRGVwdGggLSBiRGVwdGg7ICsraSlcbiAgICAgICAgICAgICAgICBub2RlQSA9IERPTVdhbGtlci5wYXJlbnROb2RlKG5vZGVBKTtcbiAgICAgICAgICAgIGlmIChub2RlQSA9PT0gbm9kZUIpIC8vIE5vZGUgQSBuZXN0ZWQgaW4gTm9kZSBCXG4gICAgICAgICAgICAgICAgcmV0dXJuIDI7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKG5vZGVBICE9IG51bGwgJiYgbm9kZUIgIT0gbnVsbCAmJiBET01XYWxrZXIucGFyZW50Tm9kZShub2RlQSkgIT0gRE9NV2Fsa2VyLnBhcmVudE5vZGUobm9kZUIpKSB7XG4gICAgICAgICAgICBub2RlQSA9IERPTVdhbGtlci5wYXJlbnROb2RlKG5vZGVBKTtcbiAgICAgICAgICAgIG5vZGVCID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUobm9kZUIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlQSA9PT0gbnVsbCB8fCBub2RlQiA9PT0gbnVsbCB8fCBET01XYWxrZXIucGFyZW50Tm9kZShub2RlQSkgIT0gRE9NV2Fsa2VyLnBhcmVudE5vZGUobm9kZUIpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgd2hpbGUgKG5vZGVCICE9IG51bGwgJiYgbm9kZUIgIT0gbm9kZUEpXG4gICAgICAgICAgICBub2RlQiA9IG5vZGVCLnByZXZpb3VzU2libGluZztcbiAgICAgICAgaWYgKG5vZGVCID09PSBudWxsKSAvLyBub2RlQiBiZWZvcmUgbm9kZUFcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICBlbHNlIHJldHVybiAtMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAgRGV0ZXJtaW5lIGlmIHRoZSBnaXZlbiBhdHRyaWJ1dGUgb2YgdGhlIGdpdmVuIGVsZW1lbnQgaXMgbm90IGVtcHR5XG4gICAgICogIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgYXR0cmlidXRlTm9uRW1wdHkoZWxlbWVudCwgYXR0clN0cikge1xuICAgICAgICByZXR1cm4gZWxlbWVudC5oYXNBdHRyaWJ1dGUoYXR0clN0cikgJiYgZWxlbWVudC5nZXRBdHRyaWJ1dGUoYXR0clN0cikudHJpbSgpLmxlbmd0aCA+IDA7XG4gICAgfVxuXG4gICAgLyogUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgZ2l2ZW4gZnJhbWUsIG51bGwgaWYgbm90IGZvdW5kICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRGcmFtZUJ5TmFtZShydWxlQ29udGV4dCwgZnJhbWVOYW1lKSB7XG4gICAgICAgIGxldCB3aW5kb3cgPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3O1xuICAgICAgICBsZXQgZnJhbWVMaXN0ID0gW3dpbmRvd107XG4gICAgICAgIGxldCBpZHggPSAwO1xuICAgICAgICB3aGlsZSAoaWR4IDwgZnJhbWVMaXN0Lmxlbmd0aCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoZnJhbWVMaXN0W2lkeF0ubmFtZSA9PT0gZnJhbWVOYW1lKSByZXR1cm4gZnJhbWVMaXN0W2lkeF07XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmcmFtZUxpc3RbaWR4XS5mcmFtZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVuc3VyZSBpdCdzIGEgcmVhbCBmcmFtZSBhbmQgYXZvaWQgcmVjdXJzaW9uXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnJhbWVMaXN0W2lkeF0uZnJhbWVzW2ldICYmICFmcmFtZUxpc3QuaW5jbHVkZXMoZnJhbWVMaXN0W2lkeF0uZnJhbWVzW2ldKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lTGlzdC5wdXNoKGZyYW1lTGlzdFtpZHhdLmZyYW1lc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsgfVxuICAgICAgICAgICAgKytpZHg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZWZhdWx0TlNSZXNvbHZlcihwcmVmaXgpIHtcbiAgICAgICAgbGV0IHVyaTtcbiAgICAgICAgc3dpdGNoIChwcmVmaXgpIHtcbiAgICAgICAgICAgIGNhc2UgJ2h0bWwnOlxuICAgICAgICAgICAgICAgIHVyaSA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJztcbiAgICAgICAgICAgIGNhc2UgJ3gyJzpcbiAgICAgICAgICAgICAgICB1cmkgPSAnaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwyJztcbiAgICAgICAgICAgIGNhc2UgJ3gnOlxuICAgICAgICAgICAgICAgIHVyaSA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJztcbiAgICAgICAgICAgIGNhc2UgJ3hodG1sJzpcbiAgICAgICAgICAgICAgICB1cmkgPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCc7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHVyaSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVyaTtcbiAgICB9XG5cbiAgICAvL2NoZWNraW5nIGlmIG9ubHkgdGhlIGlubmVyIHRleHQgaXMgZW1wdHkgb3Igbm90XG4gICAgcHVibGljIHN0YXRpYyBpc0lubmVyVGV4dE9ubHlFbXB0eShlbGVtZW50KSB7XG4gICAgICAgIC8vIEdldCB0aGUgaW5uZXJUZXh0IG9mIHRoZSBlbGVtZW50XG4gICAgICAgIGxldCB0ZXh0ID0gZWxlbWVudC5pbm5lclRleHQ7XG5cbiAgICAgICAgaWYgKCh0ZXh0ID09PSB1bmRlZmluZWQgfHwgdGV4dCA9PT0gbnVsbCB8fCB0ZXh0LnRyaW0oKS5sZW5ndGggPT09IDApICYmIGVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gJ3Nsb3QnICYmIGVsZW1lbnQudGV4dENvbnRlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy9pZ25vcmUgc2xvdCBiZWNhdXNlIGl0cyB0ZXh0IHdpbGwgYmUgZmlsbGVkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIGNvbnRlbnQgaW4gdGhlIGxpZ2h0IERPTSBcbiAgICAgICAgICAgIC8vIGlubmVyVGV4dCBpcyBzb21ldGltZXMgJ3VuZGVmaW5lZCcgaW4gaGVhZGxlc3MgbW9kZSwgb3IgbnVsbCBpZiB0aGUgZWxlbWVudCBpcyBpbnZpc2libGUgb3Igbm90IGVyeHBhbmRlZCBcbiAgICAgICAgICAgIC8vIHNvIHdlIHRyeSB0ZXh0Q29udGVudCBhcyBhIHdvcmthcm91bmRcbiAgICAgICAgICAgIHRleHQgPSBlbGVtZW50LnRleHRDb250ZW50XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmV0VmFsID0gISh0ZXh0ICE9PSBudWxsICYmIHRleHQudHJpbSgpLmxlbmd0aCA+IDApO1xuICAgICAgICBpZiAoZWxlbWVudC5ub2RlVHlwZSA9PT0gMSAmJiBlbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwic2xvdFwiKSB7XG4gICAgICAgICAgICAvL1RPRE86IG5lZWQgdG8gY29uc2lkZSBpdHMgb3duIGNvbnRlbnQsIGEgc2xvdCBtYXkgaGF2ZSBpdHMgb3duIGNvbnRlbnQgb3IgYXNzaWduZWQgY29udGVudFxuICAgICAgICAgICAgZm9yIChjb25zdCBzbG90RWxlbSBvZiBlbGVtZW50LmFzc2lnbmVkTm9kZXMoKSkge1xuICAgICAgICAgICAgICAgIHJldFZhbCA9IHJldFZhbCAmJiBDb21tb25VdGlsLmlzSW5uZXJUZXh0RW1wdHkoc2xvdEVsZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVHJpbSB0aGUgaW5uZXIgdGV4dCBhbmQgdmVyaWZ5IHRoYXQgaXQgaXMgbm90IGVtcHR5LlxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIC8qIFJldHVybiB0aGUgaW5uZXIgdGV4dCBvZiB0aGUgZ2l2ZW4gZWxlbWVudCAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SW5uZXJUZXh0KGVsZW1lbnQpIHtcbiAgICAgICAgbGV0IHJldFZhbCA9IGVsZW1lbnQuaW5uZXJUZXh0O1xuICAgICAgICBpZiAocmV0VmFsID09PSB1bmRlZmluZWQgfHwgcmV0VmFsID09PSBudWxsIHx8IHJldFZhbC50cmltKCkgPT09IFwiXCIpXG4gICAgICAgICAgICByZXRWYWwgPSBlbGVtZW50LnRleHRDb250ZW50O1xuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHJldHVybiBvbnNjcmVlbiBpbm5lclRleHQgb25seS5cbiAgICAgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gdGhlIHNhbWUgcmVzdWx0IGFzIGlubmVyVGV4dCBpZiBubyBvZmZzY3JlZW4gY29udGVudCBleGlzdHNcbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBub2RlIFRoZSBub2RlIHdoaWNoIHNob3VsZCBiZSBjaGVja2VkIGl0IGhhcyBpbm5lciB0ZXh0IG9yIG5vdC5cbiAgICAgKiBAcmV0dXJuIHtudWxsIHwgc3RyaW5nfSBudWxsIGlmIGVsZW1lbnQgaGFzIGVtcHR5IGlubmVyIHRleHQsIHRleHQgb3RoZXJ3aXNlXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldE9uU2NyZWVuSW5uZXJUZXh0KGVsZW1lbnQpIHtcbiAgICAgICAgaWYgKCFlbGVtZW50KSByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKGVsZW1lbnQubm9kZVR5cGUgPT09IDMpIHJldHVybiBlbGVtZW50Lm5vZGVWYWx1ZSgpO1xuXG4gICAgICAgIGxldCB0ZXh0ID0gXCJcIjtcbiAgICAgICAgbGV0IG53ID0gbmV3IERPTVdhbGtlcihlbGVtZW50KTtcbiAgICAgICAgLy8gTG9vcCBvdmVyIGFsbCB0aGUgY2hpbGRyZW5zIG9mIHRoZSBlbGVtZW50IHRvIGdldCB0aGUgdGV4dFxuICAgICAgICB3aGlsZSAobncubmV4dE5vZGUoKSAmJiBudy5ub2RlICE9PSBlbGVtZW50ICYmIG53Lm5vZGUgIT09IGVsZW1lbnQucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgaWYgKG53LmJFbmRUYWcpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKG53Lm5vZGUubm9kZVR5cGUgPT09IDEgJiYgKFZpc1V0aWwuaGlkZGVuQnlEZWZhdWx0RWxlbWVudHMuaW5jbHVkZXMobncubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSB8fCAhVmlzVXRpbC5pc05vZGVWaXNpYmxlKG53Lm5vZGUpIHx8IFZpc1V0aWwuaXNFbGVtZW50T2Zmc2NyZWVuKG53Lm5vZGUgYXMgSFRNTEVsZW1lbnQpKSkgeyBcbiAgICAgICAgICAgICAgICAvKiogc3BlY2lhbCBjYXNlIGZvciBzdmcgPHRpdGxlPiBlbGVtZW50OiBcbiAgICAgICAgICAgICAgICAgKiAgICAgdGV4dCBpbiBhIDx0aXRsZT4gZWxlbWVudCBpcyBub3QgcmVuZGVyZWQgYXMgcGFydCBvZiB0aGUgZ3JhcGhpYywgYnV0IGJyb3dzZXJzIHVzdWFsbHkgZGlzcGxheSBpdCBhcyBhIHRvb2x0aXBcbiAgICAgICAgICAgICAgICAgKiAgICAgbm90ZSBzb21lIHN2ZyBlbGVtZW50cywgc3VjaCBhcyB0aXRsZSwgZGVzYywgaGF2ZSBhIGJvdW5kcyB7XCJsZWZ0XCI6MCxcInRvcFwiOjAsXCJoZWlnaHRcIjowLFwid2lkdGhcIjowfVxuICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgaWYgKG53Lm5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ3RpdGxlJyAmJiBDb21tb25VdGlsLmdldEFuY2VzdG9yKG53Lm5vZGUsIFwic3ZnXCIpKSBcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBpZiAobncubm9kZS5uZXh0U2libGluZykge1xuICAgICAgICAgICAgICAgICAgICBpZiAobncubm9kZS5uZXh0U2libGluZy5ub2RlVHlwZSA9PT0gMyAmJiBudy5ub2RlLm5leHRTaWJsaW5nLm5vZGVWYWx1ZSAmJiBudy5ub2RlLm5leHRTaWJsaW5nLm5vZGVWYWx1ZS50cmltKCkgIT09ICcnKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCArPSAnICcgKyBudy5ub2RlLm5leHRTaWJsaW5nLm5vZGVWYWx1ZS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgIG53Lm5vZGUgPSBudy5ub2RlLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobncubm9kZS5ub2RlVHlwZSA9PT0gMyAmJiBudy5ub2RlLm5vZGVWYWx1ZSAmJiBudy5ub2RlLm5vZGVWYWx1ZS50cmltKCkgIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgdGV4dCArPSAnICcgKyBudy5ub2RlLm5vZGVWYWx1ZS50cmltKCk7IFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0ZXh0LnRyaW0oKTtcbiAgICB9XG5cbiAgICAvKiogUmV0dXJuIHRoZSB0ZXh0IGNvbnRlbnQgb2YgdGhlIGdpdmVuIG5vZGUgXG4gICAgICogIHRoaXMgaXMgZGlmZmVyZW50IHRoYW4gaW5uZXJUZXh0IG9yIHRleHRDb250ZW50IHRoYXQgcmV0dXJuIHRleHQgY29udGVudCBvZiBhIG5vZGUgYW5kIGl0cyBkZXNjZW5kYW50c1xuICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXROb2RlVGV4dChlbGVtZW50KSB7XG4gICAgICAgIGlmICghZWxlbWVudCkgcmV0dXJuIFwiXCI7XG4gICAgICAgIGxldCB0ZXh0ID0gXCJcIjtcbiAgICAgICAgbGV0IGNoaWxkTm9kZXMgPSBlbGVtZW50LmNoaWxkTm9kZXM7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGROb2Rlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgaWYgKGNoaWxkTm9kZXNbaV0ubm9kZVR5cGUgPT0gMykge1xuICAgICAgICAgICAgICAgIHRleHQgKz0gY2hpbGROb2Rlc1tpXS5ub2RlVmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgY2hlY2tpbmcgaWYgZWxlbWVudHMgaW5uZXIgdGV4dCBpcyBlbXB0eSBvciBub3QuXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gbm9kZSBUaGUgbm9kZSB3aGljaCBzaG91bGQgYmUgY2hlY2tlZCBpdCBoYXMgaW5uZXIgdGV4dCBvciBub3QuXG4gICAgICogQHJldHVybiB7Ym9vbH0gdHJ1ZSBpZiBlbGVtZW50IGhhcyBlbXB0eSBpbm5lciB0ZXh0LCBmYWxzZSBvdGhlcndpc2VcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgaXNJbm5lclRleHRFbXB0eShlbGVtZW50KSB7XG4gICAgICAgIC8vIEdldCB0aGUgaW5uZXJUZXh0IG9mIHRoZSBlbGVtZW50XG4gICAgICAgIGxldCB0ZXh0ID0gQ29tbW9uVXRpbC5nZXRJbm5lclRleHQoZWxlbWVudCk7XG5cbiAgICAgICAgLy8gVHJpbSB0aGUgaW5uZXIgdGV4dCBhbmQgdmVyaWZ5IHRoYXQgaXQgaXMgbm90IGVtcHR5LlxuICAgICAgICByZXR1cm4gISh0ZXh0ICE9IG51bGwgJiYgdGV4dC50cmltKCkubGVuZ3RoID4gMCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBoYXNJbm5lckNvbnRlbnQoZWxlbWVudCkge1xuICAgICAgICBsZXQgdGV4dCA9IENvbW1vblV0aWwuZ2V0SW5uZXJUZXh0KGVsZW1lbnQpO1xuICAgICAgICBsZXQgaGFzQ29udGVudCA9ICh0ZXh0ICE9PSBudWxsICYmIHRleHQudHJpbSgpLmxlbmd0aCA+IDApO1xuXG4gICAgICAgIGlmIChlbGVtZW50LmZpcnN0Q2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGxldCBudyA9IG5ldyBET01XYWxrZXIoZWxlbWVudCk7XG4gICAgICAgICAgICB3aGlsZSAoIWhhc0NvbnRlbnQgJiYgbncubmV4dE5vZGUoKSkge1xuICAgICAgICAgICAgICAgIGhhc0NvbnRlbnQgPSAobncubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImltZ1wiICYmXG4gICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkobncubm9kZSwgXCJhbHRcIikpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoYXNDb250ZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGRldGVybWluZSBpZiBhbiBlbGVtZW50IGhhcyBpbm5lciBjb250ZW50LlxuICAgICAqIFRoaXMgZnVuY3Rpb24gYWxzbyBjb25zaWRlcnMgY2FzZXMgd2hlcmUgaW5uZXIgdGV4dCBpcyBoaWRkZW4sIHdoaWNoIG5vdyB3aWxsXG4gICAgICogYmUgY2xhc3NpZmllZCBhcyBkb2VzIG5vdCBoYXZlIGhpZGRlbiBjb250ZW50LlxuICAgICAqXG4gICAgICogQHBhcm0ge2VsZW1lbnR9IG5vZGUgVGhlIG5vZGUgd2hpY2ggc2hvdWxkIGJlIGNoZWNrZWQgaXQgaGFzIGlubmVyIHRleHQgb3Igbm90LlxuICAgICAqIEByZXR1cm4ge2Jvb2x9IHRydWUgaWYgZWxlbWVudCBoYXMgZW1wdHkgaW5uZXIgdGV4dCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGhhc0lubmVyQ29udGVudEhpZGRlbihlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBDb21tb25VdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbkh5cGVyTGluayhlbGVtZW50LCBmYWxzZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBzdmdIYXNOYW1lKGVsZW1lbnQ6IFNWR0VsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkoZWxlbWVudCwgXCJhcmlhLWxhYmVsXCIpXG4gICAgICAgICAgICB8fCBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KGVsZW1lbnQsIFwiYXJpYS1sYWJlbGxlZGJ5XCIpXG4gICAgICAgICAgICB8fCAhIWVsZW1lbnQucXVlcnlTZWxlY3RvcihcIjpzY29wZSA+IHRpdGxlXCIpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaGFzSW5uZXJDb250ZW50SGlkZGVuSHlwZXJMaW5rKGVsZW1lbnQsIGh5cGVybGlua19mbGFnKSB7XG4gICAgICAgIGlmICghZWxlbWVudCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAvLyBWYXJpYWJsZSBEZWNsZXJhdGlvblxuICAgICAgICBsZXQgY2hpbGRFbGVtZW50ID0gZWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZDtcbiAgICAgICAgbGV0IGhhc0NvbnRlbnQgPSBmYWxzZTtcblxuICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IHRoZSBjaGlsZEVsZW1lbnQgaXMgbm90IG51bGwgdGhlbiB3ZSBuZWVkIHRvIGNoZWNrIGVhY2ggb2YgdGhlIGVsZW1lbnRzXG4gICAgICAgIC8vIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBlbGVtZW50cyBhcmUgbm90IGFsbCBoaWRkZW4uXG4gICAgICAgIGlmIChjaGlsZEVsZW1lbnQgIT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gR2V0IHRoZSBub2Rld2FsdGVyIG9mIHRoZSBlbGVtZW50IG5vZGUsIHNvIHRoYXQgd2UgY2FuIGxvb3Agb3ZlciBpdCBhbmQgdmVyaWZ5XG4gICAgICAgICAgICAvLyB0aGF0IHRoZSBlbGVtZW50cyB1bmRlciB0aGUgZWxlbWVudCBhcmUgbm90IGNvbXBsZXRseSBoaWRkZW4uXG4gICAgICAgICAgICBsZXQgbncgPSBuZXcgRE9NV2Fsa2VyKGVsZW1lbnQpO1xuICAgICAgICAgICAgLy8gTG9vcCBvdmVyIGFsbCB0aGUgbm9kZXMgdW50aWwgdGhlcmUgYXJlIG5vIG1vcmUgbm9kZXMgb3Igd2UgaGF2ZSBkZXRlcm1pbmUgdGhhdCB0aGVyZSBpcyBjb250ZW50IHVuZGVyXG4gICAgICAgICAgICAvLyB0aGlzIHBhcmVudCBlbGVtZW50LlxuICAgICAgICAgICAgd2hpbGUgKCFoYXNDb250ZW50ICYmIG53Lm5leHROb2RlKCkgJiYgbncubm9kZSAhPSBlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBuZXh0IG5vZGVcbiAgICAgICAgICAgICAgICBsZXQgbm9kZSA9IG53Lm5vZGU7XG5cbiAgICAgICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSBhbiBpbWcgZWxlbWVudCBpcyBwcmVzZW50IHdpdGggYWx0IHRoZW4gd2UgY2FuIG1hcmsgdGhpcyBhcyBwYXNzXG4gICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIGtlZXAgY2hlY2tpbmcgYWxsIHRoZSBvdGhlciBlbGVtZW50cy4gTWFrZSBzdXJlIHRoYXQgdGhpcyBpbWFnZSBlbGVtZW50IGlzIG5vdCBoaWRkZW4uXG4gICAgICAgICAgICAgICAgaGFzQ29udGVudCA9IChcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImltZ1wiXG4gICAgICAgICAgICAgICAgICAgICYmIChDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KG5vZGUsIFwiYWx0XCIpIHx8IENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkobm9kZSwgXCJ0aXRsZVwiKSlcbiAgICAgICAgICAgICAgICAgICAgJiYgIVZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKG5vZGUgYXMgSFRNTEVsZW1lbnQpICYmICFWaXNVdGlsLmlzTm9kZVByZXNlbnRhdGlvbmFsKG5vZGUgYXMgSFRNTEVsZW1lbnQpXG4gICAgICAgICAgICAgICAgKSB8fCAoXG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwic3ZnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICYmIENvbW1vblV0aWwuc3ZnSGFzTmFtZShub2RlIGFzIGFueSlcbiAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIC8vIE5vdyB3ZSBjaGVjayBpZiB0aGlzIG5vZGUgaXMgb2YgdHlwZSBlbGVtZW50LCB2aXNpYmxlXG4gICAgICAgICAgICAgICAgaWYgKCFoYXNDb250ZW50ICYmIG5vZGUubm9kZVR5cGUgPT09IDEgJiYgIVZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKG5vZGUgYXMgSFRNTEVsZW1lbnQpICYmICFWaXNVdGlsLmlzTm9kZVByZXNlbnRhdGlvbmFsKG5vZGUgYXMgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBpbm5lclRleHQgb2YgdGhlIGVsZW1lbnQgaXMgZW1wdHkgb3Igbm90XG4gICAgICAgICAgICAgICAgICAgIGhhc0NvbnRlbnQgPSAhQ29tbW9uVXRpbC5pc0lubmVyVGV4dE9ubHlFbXB0eShub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNDb250ZW50ICYmIGh5cGVybGlua19mbGFnID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBoYXNDb250ZW50ID0gQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShub2RlLCBcImFyaWEtbGFiZWxcIikgfHwgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShub2RlLCBcImFyaWEtbGFiZWxsZWRieVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkb2MgPSBub2RlLm93bmVyRG9jdW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG9jKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHdpbiA9IGRvYy5kZWZhdWx0VmlldztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod2luKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjU3R5bGUgPSB3aW4uZ2V0Q29tcHV0ZWRTdHlsZShub2RlIGFzIGFueSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaGFzQ29udGVudCAmJiBjU3R5bGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhjU3R5bGUuYmFja2dyb3VuZEltYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coY1N0eWxlLmNvbnRlbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNDb250ZW50ID0gKChjU3R5bGUuYmFja2dyb3VuZEltYWdlICYmIGNTdHlsZS5iYWNrZ3JvdW5kSW1hZ2UuaW5kZXhPZikgfHwgY1N0eWxlLmNvbnRlbnQpICYmIENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkobm9kZSwgXCJhbHRcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBjYXNlcyB3aGVyZSB0aGVyZSBpcyB0ZXh0IG5vZGUgYWZ0ZXIgYW4gZWxlbWVudCB1bmRlciB0aGUgcGFyZW50XG4gICAgICAgICAgICAgICAgLy8gSW4gdGhlIGNhc2Ugd2UgZGV0ZWN0IG5vZGV0eXBlIGFzIHRleHQgbm9kZSBhbmQgdGhlIHBhdGVudCBvZiB0aGUgdGV4dCBub2RlIGlzXG4gICAgICAgICAgICAgICAgLy8gdGhlIHNhbWUgZWxlbWVudCB3ZSBhcmUgY2hlY2tpbmcgaGFzIElubmVyIGNvbnRlbnQgZm9yIHRoZW4gZ2V0IHRoZSBpbm5lciBjb250ZW50IG9mIHRoaXNcbiAgICAgICAgICAgICAgICAvLyB0ZXh0IG5vZGUuXG4gICAgICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDMgJiYgRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQobm9kZSkgPT09IGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGlubmVyVGV4dCBvZiB0aGUgZWxlbWVudCBpcyBlbXB0eSBvciBub3RcbiAgICAgICAgICAgICAgICAgICAgaGFzQ29udGVudCA9ICFDb21tb25VdGlsLmlzSW5uZXJUZXh0RW1wdHkobm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEluIHRoZSBjYXNlIHRoZXJlIGFyZSBubyBjaGlsZCBlbGVtZW50cyB0aGVuIHdlIGNhbiBzaW1wbHkgcGVyZm9ybSB0aGUgY2hlY2sgZm9yIG9ubHkgaW5uZXJ0ZXh0XG4gICAgICAgIC8vIHRoZSBpbWcgd2l0aCBhbHQgY2FzZSB3aWxsIGJlIGNvdmVyZWQgaW4gdGhlIGFib3ZlIGlmLCBhcyBpbWcgaXMgY29uc2lkZXJzIGFzIGFuIGVsZW1lbnQuXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGlubmVyVGV4dCBvZiB0aGUgZWxlbWVudCBpcyBlbXB0eSBvciBub3RcbiAgICAgICAgICAgIGhhc0NvbnRlbnQgPSAhQ29tbW9uVXRpbC5pc0lubmVyVGV4dEVtcHR5KGVsZW1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGhhc0NvbnRlbnQ7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBoYXNJbm5lckNvbnRlbnRPckFsdChlbGVtZW50KSB7XG4gICAgICAgIGxldCB0ZXh0ID0gQ29tbW9uVXRpbC5nZXRJbm5lclRleHQoZWxlbWVudCk7XG4gICAgICAgIGxldCBoYXNDb250ZW50ID0gKHRleHQgIT0gbnVsbCAmJiB0ZXh0LnRyaW0oKS5sZW5ndGggPiAwKSB8fCBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KGVsZW1lbnQsIFwiYWx0XCIpO1xuXG4gICAgICAgIGlmIChlbGVtZW50LmZpcnN0Q2hpbGQgIT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IG53ID0gbmV3IERPTVdhbGtlcihlbGVtZW50KTtcbiAgICAgICAgICAgIHdoaWxlICghaGFzQ29udGVudCAmJiBudy5uZXh0Tm9kZSgpICYmIG53Lm5vZGUgIT0gZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGhhc0NvbnRlbnQgPSAobncubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImltZ1wiICYmXG4gICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkobncubm9kZSwgXCJhbHRcIikpO1xuICAgICAgICAgICAgICAgIGlmICghaGFzQ29udGVudFxuICAgICAgICAgICAgICAgICAgICAmJiAoQXJpYVV0aWwuaGFzUm9sZShudy5ub2RlLCBcImJ1dHRvblwiLCB0cnVlKSB8fCBBcmlhVXRpbC5oYXNSb2xlKG53Lm5vZGUsIFwidGV4dGJveFwiKSlcbiAgICAgICAgICAgICAgICAgICAgJiYgKEFyaWFVdGlsLmhhc0FyaWFMYWJlbChudy5ub2RlKSB8fCBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KG53Lm5vZGUsIFwidGl0bGVcIikgfHwgQ29tbW9uVXRpbC5nZXRMYWJlbEZvckVsZW1lbnRIaWRkZW4obncuZWxlbSgpLCB0cnVlKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaGFzQ29udGVudCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhhc0NvbnRlbnQ7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjb25jYXRVbmlxdWVBcnJheUl0ZW0oaXRlbTogc3RyaW5nLCBhcnI6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICAgICAgICBhcnIuaW5kZXhPZihpdGVtKSA9PT0gLTEgJiYgaXRlbSAhPT0gbnVsbCA/IGFyci5wdXNoKGl0ZW0pIDogZmFsc2U7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KGl0ZW1MaXN0OiBzdHJpbmdbXSwgYXJyOiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGl0ZW1MaXN0ICE9PSBudWxsICYmIGkgPCBpdGVtTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJyID0gQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW0oaXRlbUxpc3RbaV0sIGFycik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiByZW1vdmUgYXJyYXkgaXRlbXMgZnJvbSBhIGdpdmVuIGFycmF5XG4gICAgICogQHBhcmFtIGl0ZW1MaXN0IGl0ZW1zIHRvIGJlIHJlbW92ZWQgZnJvbSBhcnJcbiAgICAgKiBAcGFyYW0gYXJyIHRoZSBhcnJheVxuICAgICAqIEByZXR1cm5zIFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgcmVkdWNlQXJyYXlJdGVtTGlzdChpdGVtTGlzdDogc3RyaW5nW10sIGFycjogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gICAgICAgIGlmIChhcnIgJiYgYXJyLmxlbmd0aCA+IDAgJiYgaXRlbUxpc3QgJiYgaXRlbUxpc3QubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGFyci5maWx0ZXIoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICFpdGVtTGlzdC5pbmNsdWRlcyh2YWx1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldFNjb3BlRm9yVGgoZWxlbWVudCkge1xuICAgICAgICAvKiogaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L3RhYnVsYXItZGF0YS5odG1sI2hlYWRlci1hbmQtZGF0YS1jZWxsLXNlbWFudGljc1xuICAgICAgICAgKiBBIGhlYWRlciBjZWxsIGFuY2hvcmVkIGF0IHRoZSBzbG90IHdpdGggY29vcmRpbmF0ZSAoeCwgeSkgd2l0aCB3aWR0aCB3aWR0aCBhbmQgaGVpZ2h0IGhlaWdodCBpcyBcbiAgICAgICAgICogc2FpZCB0byBiZSBhIGNvbHVtbiBoZWFkZXIgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgdHJ1ZTpcbiAgICAgICAgICogKiBUaGUgY2VsbCdzIHNjb3BlIGF0dHJpYnV0ZSBpcyBpbiB0aGUgY29sdW1uIHN0YXRlLCBvclxuICAgICAgICAgKiAqIFRoZSBjZWxsJ3Mgc2NvcGUgYXR0cmlidXRlIGlzIGluIHRoZSBhdXRvIHN0YXRlLCBhbmQgdGhlcmUgYXJlIG5vIGRhdGEgY2VsbHMgaW4gYW55IG9mIFxuICAgICAgICAgKiAgIHRoZSBjZWxscyBjb3ZlcmluZyBzbG90cyB3aXRoIHktY29vcmRpbmF0ZXMgeSAuLiB5K2hlaWdodC0xLlxuICAgICAgICAgKiBBIGhlYWRlciBjZWxsIGFuY2hvcmVkIGF0IHRoZSBzbG90IHdpdGggY29vcmRpbmF0ZSAoeCwgeSkgd2l0aCB3aWR0aCB3aWR0aCBhbmQgaGVpZ2h0IGhlaWdodCBpc1xuICAgICAgICAgKiBzYWlkIHRvIGJlIGEgcm93IGhlYWRlciBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSB0cnVlOlxuICAgICAgICAgKiAqIFRoZSBjZWxsJ3Mgc2NvcGUgYXR0cmlidXRlIGlzIGluIHRoZSByb3cgc3RhdGUsIG9yXG4gICAgICAgICAqICogVGhlIGNlbGwncyBzY29wZSBhdHRyaWJ1dGUgaXMgaW4gdGhlIGF1dG8gc3RhdGUsIHRoZSBjZWxsIGlzIG5vdCBhIGNvbHVtbiBoZWFkZXIsIGFuZCB0aGVyZSBhcmVcbiAgICAgICAgICogICBubyBkYXRhIGNlbGxzIGluIGFueSBvZiB0aGUgY2VsbHMgY292ZXJpbmcgc2xvdHMgd2l0aCB4LWNvb3JkaW5hdGVzIHggLi4geCt3aWR0aC0xLlxuICAgICAgICAgKi9cbiAgICAgICAgLy8gTm90ZTogYXV0byBpcyBkZWZhdWx0IHNjb3BlXG5cbiAgICAgICAgLy8gRWFzaWVzdCBhbnN3ZXIgaXMgaWYgc2NvcGUgaXMgc3BlY2lmaWVkXG4gICAgICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZShcInNjb3BlXCIpKSB7XG4gICAgICAgICAgICBsZXQgc2NvcGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcInNjb3BlXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBpZiAoc2NvcGUgPT09IFwicm93XCIgfHwgc2NvcGUgPT09ICdyb3dncm91cCcpIHJldHVybiBcInJvd1wiO1xuICAgICAgICAgICAgaWYgKHNjb3BlID09PSBcImNvbFwiIHx8IHNjb3BlID09PSAnY29sZ3JvdXAnKSByZXR1cm4gXCJjb2x1bW5cIjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNjb3BlIGlzIGF1dG8sIGRlZmF1bHQgKHdpdGhvdXQgYSBzY29wZSkgb3IgaW52YWxpZCB2YWx1ZS5cbiAgICAgICAgLy8gaWYgYWxsIHRoZSBzaWJsaW5nIGVsZW1lbnRzIGFyZSB0aCwgdGhlbiByZXR1cm4gXCJjb2x1bW5oZWFkZXJcIiBcbiAgICAgICAgdmFyIHNpYmxpbmdzID0gWy4uLmVsZW1lbnQucGFyZW50RWxlbWVudC5jaGlsZHJlbl0uZmlsdGVyKG5vZGUgPT4gbm9kZS5ub2RlVHlwZSA9PT0gMSAmJiBub2RlLnRhZ05hbWUudG9Mb3dlckNhc2UoKSAhPSBcInRoXCIpO1xuICAgICAgICBpZiAoc2libGluZ3MgPT09IG51bGwgfHwgc2libGluZ3MubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIFwiY29sdW1uXCI7XG4gICAgICAgIGVsc2UgcmV0dXJuIFwicm93XCI7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRDb250cm9sT2ZMYWJlbChub2RlOiBOb2RlKSB7XG4gICAgICAgIC8vIEhhbmRsZSB0aGUgZWFzeSBjYXNlIG9mIGxhYmVsIC0+IGZvclxuICAgICAgICBjb25zdCBsYWJlbEFuY2VzdG9yID0gQ29tbW9uVXRpbC5nZXRBbmNlc3Rvcihub2RlLCBcImxhYmVsXCIpO1xuICAgICAgICBpZiAobGFiZWxBbmNlc3RvciAmJiBsYWJlbEFuY2VzdG9yLmhhc0F0dHJpYnV0ZShcImZvclwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIEZyYWdtZW50VXRpbC5nZXRCeUlkKG5vZGUsIGxhYmVsQW5jZXN0b3IuZ2V0QXR0cmlidXRlKFwiZm9yXCIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENyZWF0ZSBhIGRpY3Rpb25hcnkgY29udGFpbmluZyBpZHMgb2YgcGFyZW50IG5vZGVzXG4gICAgICAgIGNvbnN0IGlkRGljdCA9IHt9O1xuICAgICAgICBsZXQgcGFyZW50V2FsayA9IG5vZGU7XG4gICAgICAgIHdoaWxlIChwYXJlbnRXYWxrKSB7XG4gICAgICAgICAgICBpZiAocGFyZW50V2Fsay5ub2RlVHlwZSA9PT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFuY2VzdG9yID0gcGFyZW50V2FsayBhcyBFbGVtZW50O1xuICAgICAgICAgICAgICAgIGlmIChhbmNlc3Rvci5oYXNBdHRyaWJ1dGUoXCJpZFwiKSkge1xuICAgICAgICAgICAgICAgICAgICBpZERpY3RbYW5jZXN0b3IuZ2V0QXR0cmlidXRlKFwiaWRcIildID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYXJlbnRXYWxrID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUocGFyZW50V2Fsayk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFYXJseSByZXR1cm4gaWYgbm8gYW5jZXN0b3IgSURzIGZvdW5kXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhpZERpY3QpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYWNoZSBhcmlhLWxhYmVsbGVkYnkgYXR0cmlidXRlIGlmIG5vZGUgaXMgYW4gZWxlbWVudFxuICAgICAgICBjb25zdCBub2RlQXJpYUxhYmVsbGVkQnkgPSBub2RlLm5vZGVUeXBlID09PSAxID8gKG5vZGUgYXMgRWxlbWVudCkuZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpIDogbnVsbDtcblxuICAgICAgICAvLyBJdGVyYXRlIHRocm91Z2ggY29udHJvbHMgdGhhdCB1c2UgYXJpYS1sYWJlbGxlZGJ5IGFuZCBzZWUgaWYgYW55IG9mIHRoZW0gcmVmZXJlbmNlIG9uZSBvZiBteSBhbmNlc3RvciBpZHNcbiAgICAgICAgY29uc3QgaW5wdXRzVXNpbmdMYWJlbGxlZEJ5ID0gQ2FjaGVVdGlsLmdldFNldENhY2hlKFxuICAgICAgICAgICAgbm9kZS5vd25lckRvY3VtZW50LCBcbiAgICAgICAgICAgIFwiQ29tbW9uVXRpbDo6Z2V0Q29udHJvbE9mTGFiZWxcIiwgXG4gICAgICAgICAgICAoKSA9PiAgbm9kZS5vd25lckRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCIqW2FyaWEtbGFiZWxsZWRieV1cIilcbiAgICAgICAgKTtcblxuICAgICAgICBmb3IgKGxldCBpZHggPSAwOyBpZHggPCBpbnB1dHNVc2luZ0xhYmVsbGVkQnkubGVuZ3RoOyArK2lkeCkge1xuICAgICAgICAgICAgY29uc3QgaW5wdXRVc2luZ0xhYmVsbGVkQnkgPSBpbnB1dHNVc2luZ0xhYmVsbGVkQnlbaWR4XTtcbiAgICAgICAgICAgIGNvbnN0IGFyaWFMYWJlbGxlZEJ5ID0gaW5wdXRVc2luZ0xhYmVsbGVkQnkuZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpO1xuICAgICAgICAgICAgY29uc3Qgc3AgPSBhcmlhTGFiZWxsZWRCeS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIHNwKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlkIGluIGlkRGljdCAmJiAhQ29tbW9uVXRpbC5pc0lkUmVmZXJUb1NlbGYobm9kZSwgbm9kZUFyaWFMYWJlbGxlZEJ5KSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5wdXRVc2luZ0xhYmVsbGVkQnk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRmluZCB0aGUgY2FzZXMgd2hlcmUgd2UncmUgd2l0aGluIGFuIGFyaWEgbGFiZWxsZWRieVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBjaGVja2luZyBpZiB0aGUgbm9kZSB0aGF0IGlzIHByb3ZpZWQgaXNcbiAgICAgKiBkaXNhYmxlZCBvciBub3QuIEZvbGxvd2luZyBpcyBob3cgdGhlIGNoZWNrIGlzIHBlcmZvcm1lZDpcbiAgICAgKiAgICAxLiBDaGVjayBpZiB0aGUgY3VycmVudCBub2RlIGlzIGRpc2FibGVkIHdpdGggdGhlIGZvbGxvd2luZyBvcHRpb25zOlxuICAgICAqICAgICAgIGF0dHJpYnV0ZSAtLT4gZGlzYWJsZWRcbiAgICAgKiAgICAgICAgIEFsc28gbmVlZHMgdG8gYmUgXCJidXR0b25cIiwgXCJpbnB1dFwiLCBcInNlbGVjdFwiLCBcInRleHRhcmVhXCIsIFwib3B0Z3JvdXBcIiwgXCJvcHRpb25cIixcbiAgICAgKiAgICAgICAgIFwibWVudWl0ZW1cIiwgXCJmaWVsZHNldFwiIG5vZGVzIChpbiBhcnJheSBlbGVtZW50c0FsbG93ZWREaXNhYmxlZClcbiAgICAgKiAgICAgICBhdHRyaWJ1dGUgLS0+IGFyaWEtZGlzYWJsZWQ9XCJ0cnVlXCJcbiAgICAgKiAgICAyLiBDaGVjayBpZiBhbnkgb2YgdGhlIGN1cnJlbnQgbm9kZXMgcGFyZW50cyBhcmUgZGlzYWJsZWQgd2l0aCB0aGUgc2FtZVxuICAgICAqICAgICAgIG9wdGlvbnMgbGlzdGVkIGluIDEuXG4gICAgICpcbiAgICAgKiAgICBOb3RlOiBJZiBlaXRoZXIgY3VycmVudCBub2RlIG9yIGFueSBvZiB0aGUgcGFyZW50IG5vZGVzIGFyZSBkaXNhYmxlZCB0aGVuIHRoaXNcbiAgICAgKiAgICAgICAgICBmdW5jdGlvbiB3aWxsIHJldHVybiB0cnVlIChub2RlIGlzIGRpc2FibGVkKS5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtIVE1MRWxlbWVudH0gbm9kZSAtIFRoZSBub2RlIHdoaWNoIHNob3VsZCBiZSBjaGVja2VkIGlmIGl0IGlzIGRpc2FibGVkIG9yIG5vdC5cbiAgICAgKiBAcmV0dXJuIHtib29sfSB0cnVlIGlmIHRoZSBub2RlIGlzIGRpc2FibGVkLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgaXNOb2RlRGlzYWJsZWQobm9kZSkge1xuXG4gICAgICAgIC8vIFNldCBQVF9OT0RFX0RJU0FCTEVEIHRvIGZhbHNlIGZvciBhbGwgdGhlIG5vZGVzLCBiZWZvcmUgdGhlIGNoZWNrIGFuZCB0aGlzIHdpbGwgYmUgY2hhbmdlZCB0b1xuICAgICAgICAvLyB0cnVlIHdoZW4gd2UgZGV0ZWN0IHRoYXQgdGhlIG5vZGUgaXMgZGlzYWJsZWQuIFdlIGhhdmUgdG8gc2V0IGl0IHRvIGZhbHNlIHNvIHRoYXQgd2Uga25vd1xuICAgICAgICAvLyB0aGUgbm9kZSBoYXMgYWxyZWFkeSBiZWVuIGNoZWNrZWQuIE9ubHkgc2V0IGl0IHRvIGZhbHNlIGlmIHRoZSBzZXR0aW5nIGlzIHVuZGVmaW5lZCBvciBudWxsXG4gICAgICAgIC8vIGFzIGlmIGl0IGlzIGRlZmluZWQgd2UgZG8gbm90IHduYXQgdG8gcmVzZXQgaXQuIEFzIGlmIGl0IGlzIHRydWUgdGhlbiB3ZSBzaG91bGQgbWFrZSB1c2Ugb2YgaXRcbiAgICAgICAgLy8gdG8gc3BlZWQgdXAgdGhlIGNoZWNrLlxuICAgICAgICBsZXQgUFRfTk9ERV9ESVNBQkxFRCA9IENhY2hlVXRpbC5nZXRDYWNoZShub2RlLCBcIlBUX05PREVfRElTQUJMRURcIiwgdW5kZWZpbmVkKTtcbiAgICAgICAgaWYgKHR5cGVvZiBQVF9OT0RFX0RJU0FCTEVEICE9PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gUFRfTk9ERV9ESVNBQkxFRDtcbiAgICAgICAgUFRfTk9ERV9ESVNBQkxFRCA9IGZhbHNlO1xuXG4gICAgICAgIC8vIENoZWNrIHRoZSBub2RlVHlwZSBvZiB0aGlzIG5vZGUsIGlmIHRoaXMgbm9kZSBpcyBhIHRleHQgbm9kZSB0aGVuXG4gICAgICAgIC8vIHdlIGdldCB0aGUgcGFyZW50bm9kZSBhbmQgc2V0IHRoYXQgYXMgdGhlIG5vZGUgYXMgYSB0ZXh0IG5vZGVzLFxuICAgICAgICAvLyBkaXNhYmxlZCBpcyBkaXJlY3RseSByZWxhdGVkIHRvIHRoZSBwYXJlbnQgbm9kZS5cbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDMpIHtcbiAgICAgICAgICAgIG5vZGUgPSBET01XYWxrZXIucGFyZW50Tm9kZShub2RlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFZhcmlhYmxlIERlY2xhcmF0aW9uXG4gICAgICAgIGxldCBub2RlTmFtZSA9IG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAvLyBHZXQgdGhlIGRpc2FibGVkIGVsZW1lbnQgcHJvcGVydHksIGRpc2FibGVkIGFuZCBhcmlhLWRpc2FibGVkIGF0dHJpYnV0ZSBhbmQgY2hlY2sgdGhhdCBpdCBpcyB0cnVlXG4gICAgICAgIGxldCBkaXNhYmxlZEF0dHJpYnV0ZSA9IG5vZGUuaGFzQXR0cmlidXRlKFwiZGlzYWJsZWRcIik7XG4gICAgICAgIGxldCBkaXNhYmxlZFByb3BlcnR5Q3VzdG9tID0gUFRfTk9ERV9ESVNBQkxFRDtcbiAgICAgICAgbGV0IGFyaWFEaXNhYmxlZEF0dHJpYnV0ZSA9IG5vZGUuaGFzQXR0cmlidXRlKCdhcmlhLWRpc2FibGVkJykgJiYgbm9kZS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWRpc2FibGVkXCIpID09PSAndHJ1ZSc7XG5cbiAgICAgICAgLy8gSWYgdGhpcyBub2RlIGhhcyBkaXNhYmxlZCBhdHRyaWJ1dGUgYW5kIHRoZSBub2RlIGFsbG93cyBkaXNhYmxlZCBhdHRyaWJ1dGUsIHRoZW4gcmV0dXJuIHRydWUuXG4gICAgICAgIC8vIERpc2FibGVkIGF0dHJpYnV0ZSBpcyBvbmx5IGFsbG93ZWQgb24gXCJidXR0b25cIiwgXCJpbnB1dFwiLCBcInNlbGVjdFwiLCBcInRleHRhcmVhXCIsIFwib3B0Z3JvdXBcIiwgXCJvcHRpb25cIiwgXCJtZW51aXRlbVwiLCBcImZpZWxkc2V0XCJcbiAgICAgICAgLy8gSW4gdGhlIGNhc2UgYXJpYS1kaXNhYmxlZCBpcyBzZXQgdG8gdHJ1ZSwgdGhlbiBhbHNvIHJldHVybiB0cnVlXG4gICAgICAgIGlmIChkaXNhYmxlZFByb3BlcnR5Q3VzdG9tIHx8IChkaXNhYmxlZEF0dHJpYnV0ZSAmJiBBUklBRGVmaW5pdGlvbnMuZWxlbWVudHNBbGxvd2VkRGlzYWJsZWQuaW5kZXhPZihub2RlTmFtZSkgPiAtMSkgfHwgYXJpYURpc2FibGVkQXR0cmlidXRlKSB7XG4gICAgICAgICAgICBQVF9OT0RFX0RJU0FCTEVEID0gdHJ1ZTtcbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShub2RlLCBcIlBUX05PREVfRElTQUJMRURcIiwgUFRfTk9ERV9ESVNBQkxFRCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdldCB0aGUgcGFyZW50Tm9kZSBmb3IgdGhpcyBub2RlLCBiZWN1YXNlIHdlIGhhdmUgdG8gY2hlY2sgYWxsIHBhcmVudHMgdG8gbWFrZSBzdXJlIHRoZXkgZG8gbm90IGhhdmVcbiAgICAgICAgLy8gZGlzYWJsZWQgYXR0cmlidXRlLiBPbmx5IGtlZXAgY2hlY2tpbmcgdW50aWwgd2UgYXJlIGFsbCB0aGUgd2F5IGJhY2sgdG8gdGhlIHBhcmVudE5vZGVcbiAgICAgICAgLy8gZWxlbWVudC5cbiAgICAgICAgbGV0IHBhcmVudEVsZW1lbnQgPSBET01XYWxrZXIucGFyZW50Tm9kZShub2RlKTtcblxuICAgICAgICAvLyBJZiB0aGUgcGFyZW50IG5vZGUgZXhpc3RzIGFuZCB0aGUgbm9kZXR5cGUgaXMgZWxlbWVudCAoMSksIHRoZW4gcnVuIHJlY3Vyc2l2ZSBjYWxsIHRvIHBlcmZvcm0gdGhlIGNoZWNrXG4gICAgICAgIC8vIGFsbCB0aGUgd2F5IHVwIHRvIHRoZSB2ZXJ5IHBhcmVudCBub2RlLiBVc2UgcmVjdXJzaXZlIGNhbGwgaGVyZSBpbnN0ZWFkIG9mIGEgd2hpbGUgbG9vcCBzbyB0aGF0IHdlIGRvIG5vdFxuICAgICAgICAvLyBoYXZlIHRvIGR1cGxpY2F0ZSB0aGUgbG9naWMgZm9yIGNoZWNraW5nIGlmIHRoZSBub2RlIGlzIGRpc2FibGVkIG9yIG5vdCBmb3IgYWxsIHRoZSBwYXJlbnRzIHN0YXJ0aW5nIHdpdGhcbiAgICAgICAgLy8gY2hpbGQgbm9kZS5cbiAgICAgICAgaWYgKHBhcmVudEVsZW1lbnQgIT0gbnVsbCAmJiBwYXJlbnRFbGVtZW50Lm5vZGVUeXBlID09PSAxKSB7XG4gICAgICAgICAgICAvLyBDaGVjayB1cHdhcmRzIHJlY3Vyc2l2ZWx5LCBhbmQgc2F2ZSB0aGUgcmVzdWx0cyBpbiBhbiB2YXJpYWJsZVxuICAgICAgICAgICAgbGV0IG5vZGVEaXNhYmxlZCA9IENvbW1vblV0aWwuaXNOb2RlRGlzYWJsZWQocGFyZW50RWxlbWVudCk7XG5cbiAgICAgICAgICAgIC8vIElmIHRoZSBub2RlIGlzIGZvdW5kIHRvIGJlIGRpc2FibGVkIHRoZW4gYWRkIHRoZSBjdXN0b20gUFRfTk9ERV9ESVNBQkxFRCB0byB0cnVlLlxuICAgICAgICAgICAgLy8gc28gdGhhdCB3ZSBjYW4gdXNlIHRoaXMgbmV4dCB0aW1lLCB0byBxdWlja2x5IGRldGVybWluZSBpZiBub2RlIGlzIGRpc2FibGVkIG9yIG5vdC5cbiAgICAgICAgICAgIC8vIFRoaXMgaXMgZXh0cmEgcGVyY2F1dGlvbiwgdGhlIGlzTm9kZURpc2FibGVkIGZ1bmN0aW9uIGFscmVhZHkgc2V0cyB0aGlzLlxuICAgICAgICAgICAgaWYgKG5vZGVEaXNhYmxlZCkge1xuICAgICAgICAgICAgICAgIFBUX05PREVfRElTQUJMRUQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBDaGVjayB1cHdhcmRzIHJlY3Vyc2l2ZWx5XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0RJU0FCTEVEXCIsIFBUX05PREVfRElTQUJMRUQpO1xuICAgICAgICAgICAgcmV0dXJuIG5vZGVEaXNhYmxlZDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJldHVybiBmYWxzZSAobm9kZSBpcyBub3QgZGlzYWJsZWQpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmUgaWYgaGlkZGVuIGNvbnRlbnQgc2hvdWxkIGJlIGNoZWNrZWRcbiAgICAgKiBpbiBydWxlcy5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBub2RlIC0gQSBub2RlIHNvIHRoYXQgdGhlIGRvY3VtZW50IGNhbiBiZSBhY2Nlc3NlZCB0byBjaGVjayBmb3IgdGhlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb24uIENhbiBiZSBkb2N1bWVudCBlbGVtZW50IG9yIGEgc2ltcGxlIG5vZGUgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJuIHtib29sfSB0cnVlIGlmIGhpZGRlbiBjb250ZW50IHNob3VsZCBiZSBjaGVja2VkLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgc2hvdWxkQ2hlY2tIaWRkZW5Db250ZW50KG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIGlmIG5vZGUgc2hvdWxkIGJlIHNraXBwZWQgZnJvbSBjaGVja2luZyBvciBub3QsIGJhc2VkXG4gICAgICogb24gdGhlIENoZWNrIEhpZGRlbiBDb250ZW50IHNldHRpbmdzIGFuZCBpZiB0aGUgbm9kZSBpcyB2aXNpYmxlIG9yIG5vdC5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBub2RlIC0gTm9kZSB0byBjaGVjayBpZiBpdCBpcyB2aXNpYmxlIG9yIG5vdCBiYXNlZCBvbiB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnRcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmcuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtib29sfSB0cnVlIGlmIG5vZGUgc2hvdWxkIGJlIHNraXBwZWQsIGZhbHNlIG90aGVyd2lzZVxuICAgICAqXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBzaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKG5vZGUpIHtcbiAgICAgICAgLy8gRm9sbG93aW5nIGFyZSB0aGUgc3RlcHMgdGhhdCBhcmUgZXhlY3V0ZWQgYXQgdGhpcyBzdGFnZSB0byBkZXRlcm1pbmUgaWYgdGhlIG5vZGUgc2hvdWxkIGJlIGNsYXNzaWZpZWQgYXMgaGlkZGVuXG4gICAgICAgIC8vIG9yIG5vdC5cbiAgICAgICAgLy8gIDEuIE9ubHkgcnVuIGlzTm9kZVZpc2libGUgY2hlY2sgaWYgaGlkZGVuIGNvbnRlbnQgc2hvdWxkIE5PVCBiZSBjaGVja2VkLiBJbiB0aGUgY2FzZSB0aGF0IGhpZGRlbiBjb250ZW50IGlzIHRvLFxuICAgICAgICAvLyAgICAgYmUgc2Nhbm5lZCB0aGVuIHdlIGNhbiBqdXN0IHNjYW4gZXZlcnl0aGluZyBhcyBub3JtYWwuIEluIHRoZSBjYXNlIHRoYXQgdGhlIGN1cnJlbnQgbm9kZSBpcyBoaWRkZW4gd2VcbiAgICAgICAgLy8gICAgIHJldHVybiB0cnVlIHRvIGlkZW50aWZ5IHRoYXQgdGhlIG5vZGUgc2hvdWxkIG5vdCBiZSBzY2FubmVkL2FkZGVkIHRvIGFueSBoYXNoL2FycmF5LlxuICAgICAgICAvL1xuICAgICAgICAvLyBOb3RlOiBUaGUgaWYgY29uZGl0aW9ucyB1c2VzIHNob3J0LWNpcmN1aXRpbmcgc28gaWYgdGhlIGZpcnN0IGNvbmRpdGlvbiBpcyBub3QgdHJ1ZSBpdCB3aWxsIG5vdCBjaGVjayB0aGUgbmV4dCBvbmUsXG4gICAgICAgIC8vICAgICAgIHNvIG9uIGFuZCBzbyBmb3J0aC5cbiAgICAgICAgaWYgKCFDb21tb25VdGlsLnNob3VsZENoZWNrSGlkZGVuQ29udGVudChub2RlKSAmJiAhVmlzVXRpbC5pc05vZGVWaXNpYmxlKG5vZGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGlzZm9jdXNhYmxlQnlEZWZhdWx0KG5vZGUpIHtcbiAgICAgICAgdmFyIGZvY3VzYWJsZUVsZW1lbnRzID0gWydpbnB1dCcsICdzZWxlY3QnLCAnYnV0dG9uJywgJ3RleHRhcmVhJywgJ29wdGlvbicsICdhcmVhJ107XG4gICAgICAgIGlmIChub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiYVwiICYmIENvbW1vblV0aWwuaGFzQXR0cmlidXRlKG5vZGUsICdocmVmJykpIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAobm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImFyZWFcIiAmJiBDb21tb25VdGlsLmhhc0F0dHJpYnV0ZShub2RlLCAnaHJlZicpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKGZvY3VzYWJsZUVsZW1lbnRzLmluZGV4T2Yobm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSAhPT0gLTEpIHJldHVybiB0cnVlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBjaGVjayBpZiBhIG5vbi10YWJhYmxlIG5vZGUgaGFzIHZhbGlkIHRhYmFibGUgY29udGVudC5cbiAgICAgKiBJZiBpdCBpcyB0YWJhYmxlICh0aGUgdGFiaW5kZXggaXMgbm90IHNwZWljaWZpZWQgb3IgaXMgbm90IC0xKSwgcmV0dXJucyBmYWxzZTtcbiAgICAgKiBJZiBpdCBpcyBub24tdGFiYWJsZSwgYnV0IGEgY2hpbGQgaXMgdGFiYWJsZSBhbmQgZG9lcyBub3QgaGF2ZSBlbGVtZW50IGNvbnRlbnQsIHJldHVybnMgZmFsc2U7XG4gICAgICogT3RoZXJ3aXNlLCByZXR1cm5zIHRydWUuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBub25UYWJhYmxlQ2hpbGRDaGVjayhlbGVtZW50OiBFbGVtZW50KTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghZWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSB8fFxuICAgICAgICAgICAgKHBhcnNlSW50KGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwidGFiaW5kZXhcIikpICE9IC0xKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGxldCBudyA9IG5ldyBET01XYWxrZXIoZWxlbWVudCk7XG4gICAgICAgIHdoaWxlIChudy5uZXh0Tm9kZSgpKSB7XG4gICAgICAgICAgICBsZXQgY2hpbGQgPSBudy5lbGVtKCk7XG4gICAgICAgICAgICBpZiAoY2hpbGQgPT09IG51bGwpIHsgLy8gVGV4dCBub2RlLiB1c3VhbGx5IGlzIGEgY2FydHJpZGdlIHJldHVybi5cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjaGlsZC5oYXNBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSAmJlxuICAgICAgICAgICAgICAgIChwYXJzZUludChjaGlsZC5nZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSkgIT0gLTEpICYmXG4gICAgICAgICAgICAgICAgIUNvbW1vblV0aWwuaGFzSW5uZXJDb250ZW50KGNoaWxkKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGhhc0F0dHJpYnV0ZShlbGVtZW50LCBhdHRyaWJ1dGVOYW1lKSB7XG4gICAgICAgIHZhciBoYXNBdHRyaWJ1dGUgPSBmYWxzZTtcbiAgICAgICAgaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKSB7XG4gICAgICAgICAgICBoYXNBdHRyaWJ1dGUgPSBlbGVtZW50Lmhhc0F0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTtcbiAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50LmF0dHJpYnV0ZXMgJiYgZWxlbWVudC5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSkge1xuICAgICAgICAgICAgdmFyIGF0dHIgPSBlbGVtZW50LmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKGF0dHJpYnV0ZU5hbWUpO1xuICAgICAgICAgICAgaGFzQXR0cmlidXRlID0gYXR0ciAmJiBhdHRyLnNwZWNpZmllZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGFzQXR0cmlidXRlO1xuICAgIH1cblxuICAgIC8vIHRydW5jYXRlIHRoZSBnaXZlbiB0ZXh0IHRvIGEgZ2l2ZW4gbnVtYmVyIG9mIGNoYXJhY3RlcnNcbiAgICAvLyByZXR1cm4gdHJ1bmNhdGVkIHRleHQgdG8gMTUwIGNoYXJzLCBzYW1lIHdpdGggdGhlIG1lZGlhX2FsdF9icmllZiBydWxlXG4gICAgcHVibGljIHN0YXRpYyB0cnVuY2F0ZVRleHQodGV4dDogc3RyaW5nLCBsZW4gPSAxNTApIHtcbiAgICAgICAgaWYgKCF0ZXh0KSByZXR1cm4gdGV4dDtcbiAgICAgICAgdGV4dCA9IHRleHQudHJpbSgpO1xuICAgICAgICBpZiAodGV4dC5sZW5ndGggPiBsZW4pXG4gICAgICAgICAgICByZXR1cm4gdGV4dC5zdWJzdHJpbmcoMCwgbGVuLTEpICtcIi4uLlwiO1xuICAgICAgICByZXR1cm4gdGV4dDtcblxuICAgIH1cblxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMC0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuL1Zpc1V0aWxcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4vQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi9Db21tb25VdGlsXCI7XG5pbXBvcnQge1J1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG5leHBvcnQgY2xhc3MgVGFibGVVdGlsIHtcblxuICAgIHB1YmxpYyBzdGF0aWMgaXNEYXRhVGFibGUodGFibGVOb2RlKSB7XG4gICAgICAgIHJldHVybiAhKEFyaWFVdGlsLmhhc1JvbGUodGFibGVOb2RlLCBcIm5vbmVcIikgfHwgQXJpYVV0aWwuaGFzUm9sZSh0YWJsZU5vZGUsIFwicHJlc2VudGF0aW9uXCIpKTtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIEEgY29tcGxleCBkYXRhIHRhYmxlIGlzIGEgZGF0YSB0YWJsZSB3aXRoIGFueSBvZiB0aGUgZm9sbG93aW5nIGNoYXJhY3RlcmlzdGljczpcbiAgICAgKlxuICAgICAqIGEgdGhlYWQgZWxlbWVudCB0aGF0IGNvbnRhaW5zIHR3byBvciBtb3JlIHRyIGVsZW1lbnRzXG4gICAgICogYSB0YWJsZSB3aXRoIG1vcmUgdGhhbiBvbmUgdGhlYWQgZWxlbWVudFxuICAgICAqIGEgdGFibGUgd2l0aCB0d28gb3IgbW9yZSB0ciBlbGVtZW50cyB0aGF0IGNvbnRhaW4gb25seSB0aCBlbGVtZW50c1xuICAgICAqIGEgdGggb3IgdGQgZWxlbWVudCB3aXRoIGEgcm93c3BhbiBvciBjb2xzcGFuIGF0dHJpYnV0ZVxuICAgICAqIGEgdHIgZWxlbWVudCB0aGF0IGNvbnRhaW5zIGF0IGxlYXN0IG9uZSB0ZCBlbGVtZW50IGFuZCB0d28gb3IgbW9yZSB0aCBlbGVtZW50c1xuICAgICAqIGEgdGFibGUgd2l0aCBoZWFkZXJzIG5vdCBsb2NhdGVkIGluIHRoZSBmaXJzdCByb3cgb3IgZmlyc3QgY29sdW1uXG4gICAgICogYSB0ZCBlbGVtZW50IHdpdGggYSBoZWFkZXJzIGF0dHJpYnV0ZSB2YWx1ZSB0aGF0IGNvbnRhaW5zIG1vcmUgdGhhbiB0d28gSURSRUZzXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpc0NvbXBsZXhEYXRhVGFibGUodGFibGUpIHtcblxuICAgICAgICBpZiAoXCJBcmlhVXRpbF9pc0NvbXBsZXhEYXRhVGFibGVcIiBpbiB0YWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuICEhdGFibGUuQXJpYVV0aWxfaXNDb21wbGV4RGF0YVRhYmxlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGlzQ29tcGxleFRhYmxlID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKHRhYmxlICYmIFRhYmxlVXRpbC5pc0RhdGFUYWJsZSh0YWJsZSkpIHtcblxuICAgICAgICAgICAgbGV0IHRoTm9kZXMgPSBudWxsLFxuICAgICAgICAgICAgICAgIHRkTm9kZXMgPSBudWxsO1xuICAgICAgICAgICAgbGV0IHRyTm9kZXMgPSB0YWJsZS5nZXRFbGVtZW50c0J5VGFnTmFtZShcInRyXCIpO1xuICAgICAgICAgICAgbGV0IHRyTm9kZUNvdW50ID0gdHJOb2Rlcy5sZW5ndGg7XG4gICAgICAgICAgICBsZXQgdGROb2RlQ291bnQgPSAwLFxuICAgICAgICAgICAgICAgIHRoTm9kZUNvdW50ID0gMCxcbiAgICAgICAgICAgICAgICB0ck5vZGVzSGF2aW5nT25seVRoTm9kZXMgPSAwO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgIWlzQ29tcGxleFRhYmxlICYmIGkgPCB0ck5vZGVDb3VudDsgKytpKSB7XG5cbiAgICAgICAgICAgICAgICB0aE5vZGVzID0gdHJOb2Rlc1tpXS5nZXRFbGVtZW50c0J5VGFnTmFtZShcInRoXCIpO1xuICAgICAgICAgICAgICAgIHRkTm9kZXMgPSB0ck5vZGVzW2ldLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwidGRcIik7XG4gICAgICAgICAgICAgICAgdGhOb2RlQ291bnQgPSB0aE5vZGVzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICB0ZE5vZGVDb3VudCA9IHRkTm9kZXMubGVuZ3RoO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRkTm9kZUNvdW50ICE9PSAwKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gYSB0ciBlbGVtZW50IHRoYXQgY29udGFpbnMgYXQgbGVhc3Qgb25lIHRkIGVsZW1lbnQgYW5kIHR3byBvciBtb3JlIHRoIGVsZW1lbnRzO1xuICAgICAgICAgICAgICAgICAgICBpc0NvbXBsZXhUYWJsZSA9IHRoTm9kZUNvdW50ID4gMTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBhIHRoIGVsZW1lbnQgd2l0aCBhIHJvd3NwYW4gb3IgY29sc3BhbiBhdHRyaWJ1dGVcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7ICFpc0NvbXBsZXhUYWJsZSAmJiBqIDwgdGhOb2RlQ291bnQ7ICsraikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNDb21wbGV4VGFibGUgPSAoKHRoTm9kZXNbal0uaGFzQXR0cmlidXRlKFwicm93c3BhblwiKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoTm9kZXNbal0uaGFzQXR0cmlidXRlKFwiY29sc3BhblwiKSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tb25VdGlsLmdldEFuY2VzdG9yKHRoTm9kZXNbal0sIFwidGFibGVcIikgPT09IHRhYmxlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIGEgdGQgZWxlbWVudCB3aXRoIGEgcm93c3BhbiBvciBjb2xzcGFuIGF0dHJpYnV0ZVxuICAgICAgICAgICAgICAgICAgICAvLyBhIHRkIGVsZW1lbnQgd2l0aCBhIGhlYWRlcnMgYXR0cmlidXRlIHZhbHVlIHRoYXQgY29udGFpbnMgbW9yZSB0aGFuIHR3byBJRFJFRnNcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7ICFpc0NvbXBsZXhUYWJsZSAmJiBrIDwgdGROb2RlQ291bnQ7ICsraykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNDb21wbGV4VGFibGUgPSAoKHRkTm9kZXNba10uaGFzQXR0cmlidXRlKFwicm93c3BhblwiKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRkTm9kZXNba10uaGFzQXR0cmlidXRlKFwiY29sc3BhblwiKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0ZE5vZGVzW2tdLmhhc0F0dHJpYnV0ZShcImhlYWRlcnNcIikgJiYgQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKHRkTm9kZXNba10uZ2V0QXR0cmlidXRlKFwiaGVhZGVyc1wiKSkuc3BsaXQoXCIgXCIpLmxlbmd0aCA+IDIpKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwuZ2V0QW5jZXN0b3IodGROb2Rlc1trXSwgXCJ0YWJsZVwiKSA9PT0gdGFibGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIHR3byBvciBtb3JlIHRyIGVsZW1lbnRzIHRoYXQgY29udGFpbiBvbmx5IHRoIGVsZW1lbnRzXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aE5vZGVDb3VudCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICsrdHJOb2Rlc0hhdmluZ09ubHlUaE5vZGVzO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlzQ29tcGxleFRhYmxlID0gdHJOb2Rlc0hhdmluZ09ubHlUaE5vZGVzID09PSAyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFpc0NvbXBsZXhUYWJsZSkge1xuXG4gICAgICAgICAgICAgICAgbGV0IHRoZWFkTm9kZXMgPSB0YWJsZS5nZXRFbGVtZW50c0J5VGFnTmFtZShcInRoZWFkXCIpO1xuICAgICAgICAgICAgICAgIGxldCB0aGVhZE5vZGVzTGVuZ3RoID0gdGhlYWROb2Rlcy5sZW5ndGg7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhlYWROb2Rlc0xlbmd0aCA+IDApIHtcblxuICAgICAgICAgICAgICAgICAgICAvLyB0YWJsZSBoYXMgbW9yZSB0aGFuIG9uZSB0aGVhZCBlbGVtZW50XG4gICAgICAgICAgICAgICAgICAgIGlzQ29tcGxleFRhYmxlID0gdGhlYWROb2Rlc0xlbmd0aCA+IDE7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gYSB0aGVhZCBlbGVtZW50IHRoYXQgY29udGFpbnMgdHdvIG9yIG1vcmUgdHIgZWxlbWVudHNcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0NvbXBsZXhUYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNDb21wbGV4VGFibGUgPSB0aGVhZE5vZGVzWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwidHJcIikubGVuZ3RoID4gMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaXNDb21wbGV4VGFibGUgJiYgdHJOb2RlQ291bnQgIT09IDApIHtcbiAgICAgICAgICAgICAgICAvLyBhIHRhYmxlIHdpdGggaGVhZGVycyBub3QgbG9jYXRlZCBpbiB0aGUgZmlyc3Qgcm93IG9yIGZpcnN0IGNvbHVtblxuICAgICAgICAgICAgICAgIGlzQ29tcGxleFRhYmxlID0gdGhOb2RlQ291bnQgPiAwICYmICFUYWJsZVV0aWwudGFibGVIZWFkZXJFeGlzdHModGFibGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRhYmxlLkFyaWFVdGlsX2lzQ29tcGxleERhdGFUYWJsZSA9IGlzQ29tcGxleFRhYmxlO1xuXG4gICAgICAgIHJldHVybiBpc0NvbXBsZXhUYWJsZTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gdHJ1ZSBpZiBhIHRhYmxlIGNlbGwgaXMgaGlkZGVuIG9yIGNvbnRhaW4gbm8gZGF0YTogPHRkPjwvdGQ+XG4gICAgcHVibGljIHN0YXRpYyBpc1RhYmxlQ2VsbEVtcHR5KGNlbGwpIHtcbiAgICAgICAgaWYgKCFjZWxsIHx8ICFWaXNVdGlsLmlzTm9kZVZpc2libGUoY2VsbCkgfHwgY2VsbC5pbm5lckhUTUwucmVwbGFjZSgvJm5ic3A7L2csJyAnKS50cmltKCkubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgIFxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHRydWUgaWYgYSB0YWJsZSByb3cgaXMgaGlkZGVuIG9yIGNvbnRhaW4gbm8gZGF0YTogPHRyIC8+IG9yIDx0cj48dGQ+PC90ZD48dGQ+PC90ZD48L3RyPiBcbiAgICBwdWJsaWMgc3RhdGljIGlzVGFibGVSb3dFbXB0eShyb3cpIHtcbiAgICAgICAgaWYgKCFyb3cgfHwgIXJvdy5jZWxscyB8fCByb3cuY2VsbHMubGVuZ3RoID09PSAwIHx8ICFWaXNVdGlsLmlzTm9kZVZpc2libGUocm93KSlcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICBcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7IC8vZW1wdHlcbiAgICAgICAgZm9yIChsZXQgYz0wOyBwYXNzZWQgJiYgYyA8IHJvdy5jZWxscy5sZW5ndGg7IGMrKykge1xuICAgICAgICAgICAgbGV0IGNlbGwgPSByb3cuY2VsbHNbY107XG4gICAgICAgICAgICBwYXNzZWQgPSBUYWJsZVV0aWwuaXNUYWJsZUNlbGxFbXB0eShjZWxsKTsgICAgICAgICAgXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiBwYXNzZWQ7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHRydWUgaWYgYSB0YWJsZSdzIGhlYWRlciBpcyBpbiB0aGUgZmlyc3Qgcm93IG9yIGNvbHVtblxuICAgIHB1YmxpYyBzdGF0aWMgdGFibGVIZWFkZXJFeGlzdHMocnVsZUNvbnRleHQpIHtcblxuICAgICAgICBsZXQgcm93cyA9IHJ1bGVDb250ZXh0LnJvd3M7XG4gICAgICAgIGlmICghcm93cyB8fCByb3dzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIG5vdGUgdGhhdCB0YWJsZS5yb3dzIHJldHVybiBhbGwgYWxsIHRoZSByb3dzIGluIHRoZSB0YWJsZSwgXG4gICAgICAgIC8vIGluY2x1ZGluZyB0aGUgcm93cyBjb250YWluZWQgd2l0aGluIDx0aGVhZD4sIDx0Zm9vdD4sIGFuZCA8dGJvZHk+IGVsZW1lbnRzLiBcbiAgICAgICAgXG4gICAgICAgIC8vY2FzZSAxOiBoZWFkZXJzIGFyZSBpbiB0aGUgdmVyeSBmaXJzdCByb3cgd2l0aCBkYXRhIGluIHRib2R5IG9yIHRoZWFkLCBidXQgbm90IGluIHRmb290ICAgXG4gICAgICAgIC8vZ2V0IHRoZSBmaXJzdCByb3cgd2l0aCBkYXRhLCBpZ25vcmluZyB0aGUgcm93cyB3aXRoIG5vIGRhdGFcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGxldCBmaXJzdFJvdyA9IHJvd3NbMF07XG4gICAgICAgIGZvciAobGV0IHI9MDsgcGFzc2VkICYmIHIgPCByb3dzLmxlbmd0aDsgcisrKSB7XG4gICAgICAgICAgICBmaXJzdFJvdyA9IHJvd3Nbcl07XG4gICAgICAgICAgICAvLyBpZ25vcmUgdGhlIHJvd3MgZnJvbSB0Zm9vdFxuICAgICAgICAgICAgaWYgKGZpcnN0Um93LnBhcmVudE5vZGUgJiYgZmlyc3RSb3cucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAndGZvb3QnKSBjb250aW51ZTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcGFzc2VkID0gVGFibGVVdGlsLmlzVGFibGVSb3dFbXB0eShmaXJzdFJvdyk7ICAgICAgICAgIFxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvL3RhYmxlIGNvbnRhaW4gbm8gZGF0YTogIDx0YWJsZT48dHI+PHRkPjwvdGQ+PHRkPjwvdGQ+PC90cj48L3RhYmxlPiBcbiAgICAgICAgaWYgKHBhc3NlZClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGNlbGxzIHdpdGggZGF0YSBpbiB0aGUgZmlyc3QgZGF0YSByb3cgYXJlIGFsbCBUSCdzXG4gICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGZvciAobGV0IHI9MDsgcGFzc2VkICYmIHIgPCBmaXJzdFJvdy5jZWxscy5sZW5ndGg7IHIrKykge1xuICAgICAgICAgICAgbGV0IGNlbGwgPSBmaXJzdFJvdy5jZWxsc1tyXTtcbiAgICAgICAgICAgIHBhc3NlZCA9IFRhYmxlVXRpbC5pc1RhYmxlQ2VsbEVtcHR5KGNlbGwpIHx8IGNlbGwubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ3RoJzsgICAgICAgICAgXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmIChwYXNzZWQpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcblxuICAgICAgICAvLyBDYXNlIDI6IGhlYWRlcnMgYXJlIGluIHRoZSBmaXJzdCBjb2x1bW4gd2l0aCBkYXRhXG4gICAgICAgIC8vIEFzc3VtZSB0aGF0IHRoZSBmaXJzdCBjb2x1bW4gaGFzIGFsbCBUSCdzIG9yIGEgVEQgd2l0aG91dCBkYXRhIGluIHRoZSBmaXJzdCBjb2x1bW4uXG4gICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBwYXNzZWQgJiYgaSA8IHJvd3MubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIC8vIGlnbm9yZSB0aGUgcm93cyBmcm9tIHRmb290XG4gICAgICAgICAgICBpZiAocm93c1tpXS5wYXJlbnROb2RlICYmIHJvd3NbaV0ucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAndGZvb3QnKSBjb250aW51ZTtcblxuICAgICAgICAgICAgLy8gSWYgbm8gY2VsbHMgaW4gdGhpcyByb3csIG9yIG5vIGRhdGEgYXQgYWxsLCB0aGF0J3Mgb2theSB0b28uXG4gICAgICAgICAgICBwYXNzZWQgPSAhcm93c1tpXS5jZWxscyB8fFxuICAgICAgICAgICAgICAgIHJvd3NbaV0uY2VsbHMubGVuZ3RoID09PSAwIHx8XG4gICAgICAgICAgICAgICAgcm93c1tpXS5jZWxsc1swXS5pbm5lckhUTUwudHJpbSgpLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgICAgICAgICAgIHJvd3NbaV0uY2VsbHNbMF0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPSBcInRkXCI7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmIChwYXNzZWQpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIFxuICAgICAgICAvL2Nhc2UgMzogYWxsIHRkIGRhdGEgY2VsbHMgaGF2ZSBoZWFkZXJzIGF0dHJpYnV0ZXMgdGhhdCBwb2ludCB0byB0aGUgaWQgb2YgYSB0aCBlbGVtZW50IGluIHRoZSBzYW1lIHRhYmxlLiBcbiAgICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvdGFibGVzLmh0bWwjYXR0cmlidXRlcy1jb21tb24tdG8tdGQtYW5kLXRoLWVsZW1lbnRzXG4gICAgICAgIHBhc3NlZCA9IHRydWU7IFxuICAgICAgICBsZXQgdGhJZHMgPSBbXTtcbiAgICAgICAgbGV0IHRkSGVhZGVycyA9IFtdO1xuICAgICAgICBmb3IgKGxldCByPTA7IHBhc3NlZCAmJiByIDwgcm93cy5sZW5ndGg7IHIrKykge1xuICAgICAgICAgICAgbGV0IHJvdyA9IHJvd3Nbcl07IFxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGNlbGxzIHdpdGggZGF0YSBpbiB0aGUgbGFzdCBkYXRhIHJvdyBhcmUgYWxsIFRIJ3NcbiAgICAgICAgICAgIGZvciAobGV0IGM9MDsgYyA8IHJvdy5jZWxscy5sZW5ndGg7IGMrKykge1xuICAgICAgICAgICAgICAgIGxldCBjZWxsID0gcm93LmNlbGxzW2NdO1xuICAgICAgICAgICAgICAgIGlmIChUYWJsZVV0aWwuaXNUYWJsZUNlbGxFbXB0eShjZWxsKSkgY29udGludWU7IFxuICAgICAgICAgICAgICAgIGlmIChjZWxsLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICd0ZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjZWxsLmdldEF0dHJpYnV0ZSgnaGVhZGVycycpIHx8IGNlbGwuZ2V0QXR0cmlidXRlKCdoZWFkZXJzJykudHJpbSgpLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBDb21tb25VdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QoY2VsbC5nZXRBdHRyaWJ1dGUoJ2hlYWRlcnMnKS50cmltKCkuc3BsaXQoXCIgXCIpLCB0ZEhlYWRlcnMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2VsbC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAndGgnICYmIGNlbGwuZ2V0QXR0cmlidXRlKCdpZCcpICYmIGNlbGwuZ2V0QXR0cmlidXRlKCdpZCcpLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW0oY2VsbC5nZXRBdHRyaWJ1dGUoJ2lkJykudHJpbSgpLCB0aElkcyk7ICAgIFxuICAgICAgICAgICAgfSAgICAgIFxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZiAocGFzc2VkKSB7IC8vIGFsbCB0ZCBlbGVtZW50cyBoYXZlIGhlYWRlcnMsIHRvIGV4YW0gaWYgdGhlIGhlYWRlcnMgcG9pbnQgdG8gYSB0aCBpZFxuICAgICAgICAgICAgaWYgKHRoSWRzLmxlbmd0aCA+IDAgJiYgdGRIZWFkZXJzLmV2ZXJ5KGhlYWRlciA9PiB0aElkcy5pbmNsdWRlcyhoZWFkZXIpKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGlzTGF5b3V0VGFibGUodGFibGVOb2RlKSB7XG4gICAgICAgIHJldHVybiBBcmlhVXRpbC5oYXNSb2xlKHRhYmxlTm9kZSwgXCJwcmVzZW50YXRpb25cIikgfHwgQXJpYVV0aWwuaGFzUm9sZSh0YWJsZU5vZGUsIFwibm9uZVwiKTtcbiAgICB9XG5cbi8qIFxuICogZ2V0IGNvbmZsaWN0IEFyaWEgYW5kIEh0bWwgYXR0cmlidXRlc1xuICogcmV0dXJuOiBhIGxpc3Qgb2YgQXJpYSBhbmQgSHRtbCBhdHRyaWJ1dGUgcGFpcnMgdGhhdCBhcmUgY29uZmxpY3RcbiovXG5wdWJsaWMgc3RhdGljIGlzVGFibGVEZXNjZW5kYW50KGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KSB7XG4gICAgaWYgKCFjb250ZXh0SGllcmFyY2hpZXMpIHJldHVybiBudWxsO1xuICAgIFxuICAgIHJldHVybiBjb250ZXh0SGllcmFyY2hpZXNbXCJhcmlhXCJdLmZpbHRlcihoaWVyID0+IFtcInRhYmxlXCIsIFwiZ3JpZFwiLCBcInRyZWVncmlkXCJdLmluY2x1ZGVzKGhpZXIucm9sZSkpO1xufVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgRE9NVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NVXRpbFwiO1xuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01XYWxrZXJcIjtcbmltcG9ydCB7IERPTU1hcHBlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NTWFwcGVyXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDU1NVdGlsIH0gZnJvbSBcIi4vQ1NTVXRpbFwiO1xuaW1wb3J0IHsgQ2xpcFBhdGhVdGlsIH0gZnJvbSBcIi4vQ2xpcFBhdGhVdGlsXCI7XG5cbmV4cG9ydCBjbGFzcyBWaXNVdGlsIHtcbiAgICAvLyBUaGlzIGxpc3QgY29udGFpbnMgYSBsaXN0IG9mIGVsZW1lbnQgdGFncyB3aGljaCBjYW4gbm90IGJlIGhpZGRlbiwgd2hlbiBoaWRkZW4gaXNcbiAgICAvLyBhZGRlZCB0byB0aGVzZXMgZWxlbWVudHMgaXQgZG9lcyBub3QgZG8gYW55dGhpbmcgYXQgYWxsLlxuICAgIC8vICBhcmVhIC0tPiBhcmVhIGVsZW1lbnQgaXMgcGFydCBvZiBhIG1hcCBlbGVtZW50IGFuZCBpdCBjYW4gbm90IGJlIGhpZGRlbiBiZWNhdXNlIGl0IGlzIHVzZWQgdG9cbiAgICAvLyAgICAgICAgICAgbWFrZSBhbiBjZXJ0aWFuIHBhcnRzIG9mIGFuIG1hcCBpbnRlcmFjdGl2ZS5cbiAgICAvLyAgcGFyYW0gLS0+IGVsZW1lbnQgY2FuIG9ubHkgYmUgcGFydCBvZiBvYmplY3QgZWxtZW50IGFuZCBpdCBjYW5ub3QgYmUgaGlkZGVuIGRpcmVjdGx5LCBpdFxuICAgIC8vICAgICAgICAgICAgY2FuIG9ubHkgYmUgaGlkZGVuIGlmIHRoZSBwYXJlbnQgaXMgaGlkZGVuLlxuICAgIC8vICBhdWRpbyAtLT4gSWYgdGhpcyBlbGVtZW50IGlzIGhpZGRlbiBpdCB3aWxsIHN0aWxsIHBsYXkgdGhlIG11c2ljLCBzbyB3ZSBzaG91bGQgc3RpbGwgdHJpZ2dlclxuICAgIC8vICAgICAgICAgICAgdmlvbGF0aW9ucyBmb3IgdGhpcyBlbGVtZW50LlxuICAgIC8vIE5vdGU6IEFsbCBlbGVtZW50IHRhZ3MgdGhhdCBhcmUgYWRkZWQgaGVyZSBzaG91bGQgYmUgYWRkZWQgYXMgbG93ZXJjYXNlLCBhcyB3ZSBhcmUgdXNpbmcgaW5kZXhPZiB0byBkbyB0aGUgY2hlY2suXG4gICAgcHVibGljIHN0YXRpYyB1bmhpZGVhYmxlRWxlbWVudHMgPSBbJ2FyZWEnLCAncGFyYW0nLCAnYXVkaW8nXTtcblxuICAgIC8vIFRoaXMgbGlzdCBjb250YWlucyBhIGxpc3Qgb2YgZWxlbWVudHMgdGFncyB3aGljaCBoYXZlIGRpc3BsYXk6IG5vbmUgYnkgZGVmYXVsdCwgc2luY2Ugd2UgaGF2ZSBydWxlcyB0cmlnZ2VyaW5nXG4gICAgLy8gb24gdGhlc2VzIGVsZW1lbnRzIHdlIG5lZWQgdG8gbWFrZSB0aGVuIHZpc2libGUgYnkgZGVmYXVsdCBzbyB0aGF0IHRoZSBydWxlcyBjYW4gdHJpZ2dlciByZWdhcmRsZXNzIG9mIHRoZVxuICAgIC8vIENoZWNrIEhpZGRlbiBDb250ZW50IG9wdGlvbiBpbiB0aGUgdG9vbHMuXG4gICAgLy8gIHNjcmlwdCAtLT4gc2NyaXB0IGVsZW1lbnRzIGhhdmUgZGlzcGxheTogbm9uZSBieSBkZWZhdWx0XG4gICAgLy8gIGxpbmsgLS0+IGxpbmsgZWxlbWVudHMgaGF2ZSBkaXNwbGF5OiBub25lIGJ5IGRlZmF1bHQsIGJ1dCB0aGUgYWN0dWFsbHkgQ1NTIHNjcmlwdCBpcyBzdGlsbCBleGVjdXRlZCBzbyB3ZSBoYXZlIHRvXG4gICAgLy8gICAgICAgICAgICBtYXJrIHRoaXMgZWxlbWVudCBhcyB2aXNpYmxlIGF0IGFsbCB0aW1lcy5cbiAgICAvLyAgc3R5bGUgLS0+IHN0eWxlIGVsZW1lbnRzIGhhdmUgZGlzcGxheTogbm9uZSBieSBkZWZhdWx0LCBidXQgdGhlIGFjdHVhbGx5IENTUyBzY3JpcHQgaXMgc3RpbGwgZXhlY3V0ZWQgc28gd2UgaGF2ZSB0b1xuICAgIC8vICAgICAgICAgICAgbWFyayB0aGlzIGVsZW1lbnQgYXMgdmlzaWJsZSBhdCBhbGwgdGltZXMuXG4gICAgLy8gIGhlYWQgLS0+IGhlYWQgZWxlbWVudHMgaGF2ZSBkaXNwbGF5OiBub25lIGJ5IGRlZmF1bHQsIGJ1dCBpdCB3aWxsIHN0aWxsIGJlaGF2ZSBjb3JyZWN0XG4gICAgLy8gIHRpdGxlIC0tPiB0aXRsZSBlbGVtZW50cyBoYXZlIGRpc3BsYXk6IG5vbmUgYnkgZGVmYXVsdCwgYnV0IGl0IHdpbGwgc3RpbGwgZGlzcGxheSB0aGUgdGl0bGUuIHJlbW92ZSB0aXRsZSBmcm9tIHRoZSBsaXN0IGJlY2F1c2UgYSB0aXRsZSBjYW4gYmUgYSBjaGlsZCBvZiBhIHN2ZyBlbGVtZW50IHRvb1xuICAgIC8vICBtZXRhIC0tPiBtZXRhIGVsZW1lbnRzIGhhdmUgZGlzcGxheTogbm9uZSBieSBkZWZhdWx0LCBidXQgaXQgd2lsbCBzdGlsbCBwZXJmb3JtIHRoZSBhY3Rpb24gdGhhdCBtZXRhIGlzIHN1cHBvc2UgdG9cbiAgICAvLyAgYmFzZSAtLT4gYmFzZSBlbGVtZW50cyBoYXZlIGRpc3BsYXk6IG5vbmUgYnkgZGVmYXVsdCwgYnV0IGl0IHdpbGwgc3RpbGwgcGVyZm9ybSB0aGUgYWN0aW9uIHRoYXQgbWV0YSBpcyBzdXBwb3NlIHRvXG4gICAgLy8gIG5vc2NyaXB0IC0tPiBub3NjcmlwdCBlbGVtZW50cyBoYXZlIGRpc3BsYXk6IG5vbmUgYnkgZGVmYXVsdCwgYnV0IGl0IHdpbGwgc3RpbGwgcGVyZm9ybSB0aGUgYWN0aW9uIHRoYXQgbWV0YSBpcyBzdXBwb3NlIHRvXG4gICAgLy8gIHRlbXBsYXRlIC0tPiB0ZW1wbGF0ZSBlbGVtZW50cyBoYXZlIGRpc3BsYXk6IG5vbmUgYnkgZGVmYXVsdCwgYmVjYXVzZSB0aGV5IGFyZSBqdXN0IGEgbWVjaGFuaXNtIGZvciBob2xkaW5nIGNsaWVudC1zaWRlIGNvbnRlbnRcbiAgICAvLyAgICAgICAgICAgICAgIHRoYXQgaXMgbm90IHRvIGJlIHJlbmRlcmVkIHdoZW4gYSBwYWdlIGlzIGxvYWRlZC4gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vZG9jcy9XZWIvSFRNTC9FbGVtZW50L3RlbXBsYXRlXG4gICAgLy8gIGRhdGFsaXN0IC0tPiBkYXRhbGlzdCBlbGVtZW50cyBoYXZlIGRpc3BsYXk6IG5vbmUgYnkgZGVmYXVsdCxcbiAgICBwdWJsaWMgc3RhdGljIGhpZGRlbkJ5RGVmYXVsdEVsZW1lbnRzID0gWydzY3JpcHQnLCAnbGluaycsICdzdHlsZScsICdoZWFkJywgJ21ldGEnLCAnYmFzZScsICdub3NjcmlwdCcsICd0ZW1wbGF0ZScsICdkYXRhbGlzdCddXG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBjaGVja2luZyBpZiB0aGUgbm9kZSB0aGF0IGlzIHByb3ZpZWQgaXNcbiAgICAgKiB2aXNpYmxlIG9yIG5vdC4gRm9sbG93aW5nIGlzIGhvdyB0aGUgY2hlY2sgaXMgcGVyZm9ybWVkOlxuICAgICAqICAgIDEuIENoZWNrIGlmIHRoZSBjdXJyZW50IG5vZGUgaXMgaGlkZGVuIHdpdGggdGhlIGZvbGxvd2luZyBvcHRpb25zOlxuICAgICAqICAgICAgIENTUyAtLT4gZGlzbGF5OiBub25lXG4gICAgICogICAgICAgQ1NTIC0tPiB2aXNpYmlsaXR5OiBoaWRkZW5cbiAgICAgKiAgICAgICBhdHRyaWJ1dGUgLS0+IGhpZGRlblxuICAgICAqICAgIDIuIENoZWNrIGlmIHRoZSBhbnkgb2YgdGhlIGN1cnJlbnQgbm9kZXMgcGFyZW50cyBhcmUgaGlkZGVuIHdpdGggdGhlIHNhbWVcbiAgICAgKiAgICAgICBvcHRpb25zIGxpc3RlZCBpbiAxLlxuICAgICAqXG4gICAgICogICAgTm90ZTogSWYgZWl0aGVyIGN1cnJlbnQgbm9kZSBvciBhbnkgb2YgdGhlIHBhcmVudCBub2RlcyBhcmUgaGlkZGVuIHRoZW4gdGhpc1xuICAgICAqICAgICAgICAgIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGZhbHNlIChub2RlIGlzIG5vdCB2aXNpYmxlKS5cbiAgICAgKlxuICAgICAqICAgIE5vdGU6IG5vZGVzIHdpdGggQ1NTIHByb3BlcnRpZXMgb3BhY2l0eTowIG9yIGZpbHRlcjpvcGFjaXR5KDAlKSwgb3Igc2ltaWxhciBTVkcgbWVjaGFuaXNtczogXG4gICAgICogICAgICBUaGV5IGFyZSBub3QgY29uc2lkZXJlZCBoaWRkZW4uIFRleHQgaGlkZGVuIHdpdGggdGhlc2UgbWV0aG9kcyBjYW4gc3RpbGwgYmUgc2VsZWN0ZWQgb3IgY29waWVkLCBcbiAgICAgKiAgICAgIGFuZCB1c2VyIGFnZW50cyBzdGlsbCBleHBvc2UgaXQgaW4gdGhlaXIgYWNjZXNzaWJpbGl0eSB0cmVlcy4gIFxuICAgICAqIFxuICAgICAqICAgIE5vdGU6IG5vZGVzIGhpZGRlbiBvZmYgc2NyZWVuIG9yIGJlaGluZCBhbm90aGVyIG9iamVjdDogdGhleSBhcmUgbm90IGNvbnNpZGVyZWQgaGlkZGVuLiBcbiAgICAgKiAgICAgIFRoZXkgYXJlIGV4cG9zZWQgaW4gdGhlIGFjY2Vzc2liaWxpdHkgdHJlZSBhbmQgdGhleSBjYW4gZXZlbiBuYW1lIG9uLXNjcmVlbiBvYmplY3RzLlxuICAgICAqIFxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBub2RlIFRoZSBub2RlIHdoaWNoIHNob3VsZCBiZSBjaGVja2VkIGlmIGl0IGlzIHZpc2libGUgb3Igbm90LlxuICAgICAqIEByZXR1cm4ge2Jvb2x9IGZhbHNlIGlmIHRoZSBub2RlIGlzIE5PVCB2aXNpYmxlLCB0cnVlIG90aGVyd2lzZVxuICAgICAqXG4gICAgICogQG1lbWJlck9mIFZpc1V0aWxcbiAgICAgKi9cbiAgICAgcHVibGljIHN0YXRpYyBpc05vZGVWaXNpYmxlKG5vZGVJbjogTm9kZSkgOiBib29sZWFuIHtcblxuICAgICAgICAvLyBDaGVjayB0aGUgbm9kZVR5cGUgaWYgdGhpcyBub2RlLCBpZiB0aGlzIG5vZGUgaXMgYSB0ZXh0IG5vZGUgdGhlblxuICAgICAgICAvLyB3ZSBnZXQgdGhlIHBhcmVudG5vZGUgYW5kIHNldCB0aGF0IGFzIHRoZSBub2RlIGFzIGEgdGV4dCBub2RlcyxcbiAgICAgICAgLy8gdmlzaWJpbGl0eSBpcyBkaXJlY3RseSByZWxhdGVkIHRvIHRoZSBwYXJlbnQgbm9kZS5cbiAgICAgICAgaWYgKG5vZGVJbi5ub2RlVHlwZSA9PT0gMykge1xuICAgICAgICAgICAgbm9kZUluID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUobm9kZUluKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbm9kZSA9IG5vZGVJbiBhcyBFbGVtZW50O1xuXG4gICAgICAgIC8vIFdlIHNob3VsZCBvbmx5IGFsbG93IG5vZGVUeXBlIGVsZW1lbnQsIGFuZCBUZXh0Tm9kZSBhbGwgb3RoZXIgbm9kZXNUeXBlc1xuICAgICAgICAvLyB3ZSBjYW4gcmV0dXJuIHRoZSB2aXNpYmlsaXR5IGFzIHZpc2libGUuXG4gICAgICAgIC8vIEZvbGxvd2luZyBub2RlcyB3aWxsIGJlIHJldHVybmVkIGFzIHZpc2FibGUgYnkgZGVmYXVsdCwgc2luY2Ugd2UgY2FuIG5vdFxuICAgICAgICAvLyBhY3R1YWxseSBjaGFuZ2UgdGhlaXIgdmlzaWJpbGl0eS5cbiAgICAgICAgLy8gIE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFIC0tPiA3XG4gICAgICAgIC8vICBOb2RlLkNPTU1FTlRfTk9ERSAgICAgICAgICAgICAgICAtLT4gOFxuICAgICAgICAvLyAgOSAvKiBOb2RlLkRPQ1VNRU5UX05PREUgKi8gICAgICAgICAgICAgICAtLT4gOVxuICAgICAgICAvLyAgTm9kZS5ET0NVTUVOVF9UWVBFX05PREUgICAgICAgICAgLS0+IDEwXG4gICAgICAgIC8vICBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUgICAgICAtLT4gMTFcbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgIT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIG93bmVyRG9jdW1lbnQgaXMgcHJlc2VudCBiZWZvcmUgbW92aW5nIGZvcndhcmRcbiAgICAgICAgLy8gaW4gZGV0ZWN0aW5nIGlmIHRoZSBub2RlIGlzIHZpc2libGUgb3Igbm90LiBJbiB0aGUgY2FzZSB0aGF0IG93bmVyRG9jdW1lbnRcbiAgICAgICAgLy8gZG9lcyBub3QgZXhpc3QgdGhlbiB3ZSBzaW1wbHkgcmV0dXJuIG5vZGUgaXMgdmlzaWJsZSBieSBkZWZhdWx0LlxuICAgICAgICBpZiAoIW5vZGUub3duZXJEb2N1bWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBWYXJpYWJsZSBEZWNsYXJhdGlvblxuICAgICAgICBsZXQgY29tcFN0eWxlO1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgLy8gSW4gdGhlIGNhc2UgdGhpcyBub2RlIGlzIGEgc2NyaXB0LCBsaW5rIG9yIHN0eWxlIG5vZGUsIHJpZ2h0IGF3YXkgcmV0dXJuIG5vZGUgaXMgdmlzaWJsZVxuICAgICAgICAvLyBiZWNhdXNlIHNjcmlwdHMsIGxpbmtzIGFuZCBzdHlsZSBub2RlcyBjYW4gbm90IGJlIGhpZGRlbiBieSBIVE1MIGF0dHJpYnV0ZSBvciBDU1Mgb3IgYXJlIGhpZGRlbiBieSBkZWZhdWx0LiBCdXQgd2Ugd2FudCB0byBzY2FuXG4gICAgICAgIC8vIHRoZSBlbGVtZW50cyBldmVyeXRpbWUgYXMgdGhleSByZW5kZXIgY29udGVudCBzdGlsbCB3aGljaCBpcyBzdGlsbCB2aXNpYmxlIHRvIHVzZXJzLlxuICAgICAgICAvLyAgc2NyaXB0IC0tPiBzY3JpcHQgZWxlbWVudHMgaGF2ZSBkaXNwbGF5OiBub25lIGJ5IGRlZmF1bHRcbiAgICAgICAgLy8gIGxpbmsgLS0+IGxpbmsgZWxlbWVudHMgaGF2ZSBkaXNwbGF5OiBub25lIGJ5IGRlZmF1bHQsIGJ1dCB0aGUgYWN0dWFsbHkgQ1NTIHNjcmlwdCBpcyBzdGlsbCBleGVjdXRlZCBzbyB3ZSBoYXZlIHRvXG4gICAgICAgIC8vICAgICAgICAgICAgbWFyayB0aGlzIGVsZW1lbnQgYXMgdmlzaWJsZSBhdCBhbGwgdGltZXMuXG4gICAgICAgIC8vICBzdHlsZSAtLT4gc3R5bGUgZWxlbWVudHMgaGF2ZSBkaXNwbGF5OiBub25lIGJ5IGRlZmF1bHQsIGJ1dCB0aGUgYWN0dWFsbHkgQ1NTIHNjcmlwdCBpcyBzdGlsbCBleGVjdXRlZCBzbyB3ZSBoYXZlIHRvXG4gICAgICAgIC8vICAgICAgICAgICAgbWFyayB0aGlzIGVsZW1lbnQgYXMgdmlzaWJsZSBhdCBhbGwgdGltZXMuXG4gICAgICAgIC8vIGRhdGFsaXN0IC0tPiBJbiB0aGUgcmVuZGVyaW5nLCB0aGUgZGF0YWxpc3QgZWxlbWVudCByZXByZXNlbnRzIG5vdGhpbmcgYW5kIGl0LCBhbG9uZyB3aXRoIGl0cyBjaGlsZHJlbiwgc2hvdWxkIGJlIGhpZGRlbi5cbiAgICAgICAgaWYgKFZpc1V0aWwuaGlkZGVuQnlEZWZhdWx0RWxlbWVudHMgIT0gbnVsbCAmJiBWaXNVdGlsLmhpZGRlbkJ5RGVmYXVsdEVsZW1lbnRzICE9IHVuZGVmaW5lZCAmJiBWaXNVdGlsLmhpZGRlbkJ5RGVmYXVsdEVsZW1lbnRzLmluZGV4T2Yobm9kZU5hbWUpID4gLTEpIHtcbiAgICAgICAgICAgIC8vcmV0dXJuIHRydWU7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgY2FjaGVWYWwgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0hJRERFTlwiLCB1bmRlZmluZWQpO1xuICAgICAgICBpZiAoY2FjaGVWYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGNhY2hlVmFsO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNldCBQVF9OT0RFX0hJRERFTiB0byBmYWxzZSBmb3IgYWxsIHRoZSBub2RlcywgYmVmb3JlIHRoZSBjaGVjayBhbmQgdGhpcyB3aWxsIGJlIGNoYW5nZWQgdG9cbiAgICAgICAgLy8gdHJ1ZSB3aGVuIHdlIGRldGVjdCB0aGF0IHRoZSBub2RlIGlzIGhpZGRlbi4gV2UgaGF2ZSB0byBzZXQgaXQgdG8gZmFsc2Ugc28gdGhhdCB3ZSBrbm93XG4gICAgICAgIC8vIHRoZSBydWxlcyBoYXMgYWxyZWFkeSBiZWVuIGNoZWNrZWQuXG4gICAgICAgIGNhY2hlVmFsID0gQ2FjaGVVdGlsLnNldENhY2hlKG5vZGUsIFwiUFRfTk9ERV9ISURERU5cIiwgZmFsc2UpO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoaXMgbm9kZSBpcyB2aXNpYmxlLCB3ZSBjaGVjayBjb3VwbGUgb2YgQ1NTIHByb3BlcnRpZXMgYW5kIGhpZGRlbiBhdHRyaWJ1dGUuXG4gICAgICAgIC8vIGFyZWEsIHBhcmFtIGFuZCBhdWRpbyBlbGVtZW50cyB3ZSBkbyBub3QgY2hlY2sgaWYgdGhleSBhcmUgaGlkZGVuIGFzIGl0IGRvZXMgbm90IGFwcGx5IHRvIHRoZW0uXG4gICAgICAgIC8vIENoZWNrIHRoZSB1bmhpZGVhYmxlRWxlbWVudHMgYXJyYXkgd2hpY2ggaXMgcGFydCBvZiB0aGUgcnVsZXMsIHRvIGNoZWNrIGlmIHRoaXMgZWxlbWVudCBpcyBhbGxvd2VkIHRvIGJlIGhpZGRlbiBvciBub3RcbiAgICAgICAgLy8gaW4gdGhlIGNhc2UgdGhhdCB0aGUgZWxlbWVudCBpcyBwYXJ0IG9mIHRoZSB1bmhpZGVhYmxlRWxlbWVudHMgYXJyYXkgdGhlbiB3ZSBkbyBub3QgcnVuIHRoZSBoaWRkZW4gY2hlY2sgb24gdGhpcyBlbGVtZW50LFxuICAgICAgICAvLyBhbmQgZ28gc3RyaWdodCB0byB0aGUgcGFyZW50IG5vZGUuXG4gICAgICAgIC8vIEFycmF5IGNoZWNrIGVsZW1lbnRzIGxpa2U6XG4gICAgICAgIC8vICBhcmVhIC0tPiBhcmVhIGVsZW1lbnQgaXMgcGFydCBvZiBhIG1hcCBlbGVtZW50IGFuZCBpdCBjYW4gbm90IGJlIGhpZGRlbiBiZWNhdXNlIGl0IGlzIHVzZWQgdG9cbiAgICAgICAgLy8gICAgICAgICAgIG1ha2UgYW4gY2VydGlhbiBwYXJ0cyBvZiBhbiBtYXAgaW50ZXJhY3RpdmUuXG4gICAgICAgIC8vICBwYXJhbSAtLT4gZWxlbWVudCBjYW4gb25seSBiZSBwYXJ0IG9mIG9iamVjdCBlbG1lbnQgYW5kIGl0IGNhbm5vdCBiZSBoaWRkZW4gZGlyZWN0bHksIGl0XG4gICAgICAgIC8vICAgICAgICAgICAgY2FuIG9ubHkgYmUgaGlkZGVuIGlmIHRoZSBwYXJlbnQgaXMgaGlkZGVuLlxuICAgICAgICAvLyAgYXVkaW8gLS0+IElmIHRoaXMgZWxlbWVudCBpcyBoaWRkZW4gaXQgd2lsbCBzdGlsbCBwbGF5IHRoZSBtdXNpYywgc28gd2Ugc2hvdWxkIHN0aWxsIHRyaWdnZXJcbiAgICAgICAgLy8gICAgICAgICAgICB2aW9sYXRpb25zIGZvciB0aGlzIGVsZW1lbnQuXG4gICAgICAgIC8vIEluIHRoZSBjYXNlIHRoYXQgdW5oaWRlYWJsZUVsZW1lbnRzIGFycmF5IGlzIG5vdCBkZWZpbmVkIHRoZW4gd2UganVzdCBzY2FuIGFsbCBlbGVtZW50cyBhbmQgZG8gbm8gZmlsdGVyaW5nIGF0IGFsbC5cbiAgICAgICAgaWYgKFZpc1V0aWwudW5oaWRlYWJsZUVsZW1lbnRzID09PSBudWxsIHx8IFZpc1V0aWwudW5oaWRlYWJsZUVsZW1lbnRzID09PSB1bmRlZmluZWQgfHwgVmlzVXRpbC51bmhpZGVhYmxlRWxlbWVudHMuaW5kZXhPZihub2RlTmFtZSkgPT09IC0xKSB7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiBkZWZhdWx0VmlldyBleGlzdHMgZm9yIHRoaXMgbm9kZSwgaWYgaXQgZG9lcyB0aGVuIHVzZSB0aGlzIHRvIHJ1biB0aGUgZ2V0Q29tcHV0ZWRTdHlsZVxuICAgICAgICAgICAgLy8gZnVuY3Rpb24gdG8gZ2V0IHRoZSBDU1Mgc3R5bGUgZm9yIHRoZSBub2RlLlxuICAgICAgICAgICAgaWYgKG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldykge1xuICAgICAgICAgICAgICAgIC8vIFJ1biB0aGUgZ2V0Q29tcHV0ZWRTdHlsZSBvbiB0aGlzIG5vZGUgdG8gZmV0Y2ggdGhlIENTUyBjb21wdWF0aW9uIG9mIHRoZSBub2RlXG4gICAgICAgICAgICAgICAgY29tcFN0eWxlID0gbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUobm9kZSwgbnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IGRlZmF1bHRWaWV3IGRvZXMgbm90IGV4aXN0cyByZXR1cm4gdHJ1ZSB0byBpZGVudGlmeSB0aGF0IHRoaXNcbiAgICAgICAgICAgIC8vIG5vZGUgaXMgdmlzaWJsZSwgYmVjYXVzZSB3ZXJlIG5vdCBhYmxlIHRvIGRldGVjdCBpZiBpdCB3YXMgbm90LlxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIENhY2hlVXRpbC5zZXRDYWNoZShub2RlLCBcIlBUX05PREVfSElEREVOXCIsIHRydWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBHZXQgdGhlIGhpZGRlbiBlbGVtZW50IHByb3BlcnR5IGFuZCBoaWRkZW4gYXR0cmlidXRlXG4gICAgICAgICAgICBsZXQgaGlkZGVuQXR0cmlidXRlID0gbm9kZS5nZXRBdHRyaWJ1dGUoXCJoaWRkZW5cIik7XG4gICAgICAgICAgICBsZXQgaGlkZGVuUHJvcGVydHlDdXN0b20gPSBjYWNoZVZhbDtcbiAgICAgICAgICAgIC8vIFRvIGdldCB0aGUgaGlkZGVuIHByb3BlcnR5IHdlIG5lZWQgdG8gcGVyZm9ybSBhIHNwZWNpYWwgY2hlY2sgYXMgaW4gc29tZSBjYXNlcyB0aGUgaGlkZGVuIHByb3BlcnR5IHdpbGwgbm90IGJlXG4gICAgICAgICAgICAvLyBhIGJvb2xlYW4sIGZvciB0aGVzZXMgY2FzZXMgd2Ugc2V0IGl0IHRvIGZhbHNlIGFzIHdlIGFyZSBub3QgYWJsZSB0byBkZXRlcm1pbmUgdGhlIHRydWUgaGlkZGVuIGNvbmRpdGlvbi5cbiAgICAgICAgICAgIC8vIFRoZSByZWFzb24gZm9yIHRoaXMgaXMgYmVjYXVzZSBmb3JtIGVsZW1lbnRzIGFyZSBhYmxlIHRvIHBlcmZvcm0gYW4gb3ZlcnJpZGUsIHNvIHdoZW4gd2UgaGF2ZSBpZD1cImhpZGRlblwiIGZvciBhbiBlbGVtZW50XG4gICAgICAgICAgICAvLyB3aGljaCBpcyB1bmRlciB0aGUgZm9ybSBlbGVtZW50IHRoZW4sIG5vZGUuaGlkZGVuIGdpdmVzIHRoZSBlbGVtZW50L2xpc3Qgb2YgZWxlbWVudHMgd2hpY2ggaGF2ZSBpZD1cImhpZGRlblwiLiBSZWZlciB0b1xuICAgICAgICAgICAgLy8gbW96aWxsYSBidWc6IGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTEyNjczNTZcbiAgICAgICAgICAgIGxldCBoaWRkZW5Qcm9wZXJ0eSA9IHR5cGVvZiAobm9kZSBhcyBhbnkpLmhpZGRlbiA9PT0gXCJib29sZWFuXCIgPyAobm9kZSBhcyBhbnkpLmhpZGRlbiA6IGZhbHNlO1xuICAgICAgICAgICAgLy8gSWYgY29tcFN0eWxlIG9iamVjdCBpcyBlbXB0eSwgbm9kZSBkb2VzJ3QgaGF2ZSBoaWRkZW4gcHJvcGVydHksIG5vZGUgZG9lcyd0IGhhdmUgaGlkZGVuIGF0dHJpYnV0ZSBhbmQgZG9lcyd0IGhhdmUgY3VzdG9tIFBUXG4gICAgICAgICAgICAvLyBoaWRkZW4gcHJvcGVydHkgdGhlbiB3ZSBjYW4ganVzdCByZXR1cm4gdHJ1ZSAobm9kZSB2aXNpYmxlKSBhdCB0aGlzIHBvaW50LlxuICAgICAgICAgICAgaWYgKCFjb21wU3R5bGUgJiZcbiAgICAgICAgICAgICAgICAhaGlkZGVuUHJvcGVydHkgJiYgLy8gdGhpcyBjb3ZlcnMgZmFsc2UsIG51bGwsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIChoaWRkZW5BdHRyaWJ1dGUgPT09IG51bGwgfHwgaGlkZGVuQXR0cmlidXRlID09PSB1bmRlZmluZWQpICYmXG4gICAgICAgICAgICAgICAgIWhpZGRlblByb3BlcnR5Q3VzdG9tIC8vIFRoaXMgY292ZXJzIGZhbHNlLCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIENhY2hlVXRpbC5zZXRDYWNoZShub2RlLCBcIlBUX05PREVfSElEREVOXCIsIHRydWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IHRoZSBjb21wU3R5bGUgaXMgZGVmaW5lZCB3ZSBjaGVjayB0aGUgZm9sbG93aW5nOlxuICAgICAgICAgICAgLy8gIENTUyBzdHlsZSBkaXNwbGF5IHNldCB0byBub25lXG4gICAgICAgICAgICAvLyAgQ1NTIHN0eWxlIHZpc2liaWxpdHkgc2V0IHRvIGhpZGRlblxuICAgICAgICAgICAgLy8gICAgTm90ZTogRm9yIHRoaXMgcHJvcGVydHkgc2luY2UgaXQgaXMgaW5oZXJpdGVkLCBuZWVkIHRvIHNraXAgdGhlIGNoZWNrIG9uIHBhcmVudHMgYXNcbiAgICAgICAgICAgIC8vICAgICAgICAgIHRoZSBwYXJlbnQgY2FuIGhhdmUgaGlkZGVuIGJ1dCB0aGUgY2hpbGQgY2FuIGJlIHZpc2libGUuIFNvIHdlIG9ubHkgY2hlY2sgdGhpcyBwcm9wZXJ0eVxuICAgICAgICAgICAgLy8gICAgICAgICAgb24gY2hpbGQgZWxlbWVudHMvZWxlbWVudHMgdGhhdCBhcmUgcGFzc2VkIHRvIHRoaXMgZnVuY3Rpb24gdGhlIGZpcnN0IHRpbWUuXG4gICAgICAgICAgICAvLyAgbm9kZSBoaWRkZW4gcHJvcGVydHkgc2V0IChub2RlLmhpZGRlbilcbiAgICAgICAgICAgIC8vICBub2RlIGF0dHJpYnV0ZSBoaWRkZW4gc2V0ICh0byBhbnkgdmFsdWUpXG4gICAgICAgICAgICAvLyAgbm9kZSBjdXN0b20gaGlkZGVuIHByb3BlcnR5IHNlciAobm9kZS5QVF9OT0RFX0hJRERFTilcbiAgICAgICAgICAgIC8vIElmIGFueSBvZiB0aGUgYWJvdmUgY29uZGl0aW9ucyBhcmUgdHJ1ZSB0aGVuIHdlIHJldHVybiBmYWxzZSBhcyB0aGlzIGVsZW1lbnQgaXMgbm90IHZpc2libGVcbiAgICAgICAgICAgIGlmICgoY29tcFN0eWxlICE9PSBudWxsICYmICgoY29tcFN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ2Rpc3BsYXknKSA9PT0gJ25vbmUnIHx8XG4gICAgICAgICAgICAgICAgKCFDYWNoZVV0aWwuZ2V0Q2FjaGUobm9kZSwgXCJWaXNpYmlsaXR5X0NoZWNrX1BhcmVudFwiLCBudWxsKSAmJiBjb21wU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgndmlzaWJpbGl0eScpID09PSAnaGlkZGVuJykpKSB8fFxuICAgICAgICAgICAgICAgIChjb21wU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnZGlzcGxheScpICE9PSAnYmxvY2snICAmJiAoaGlkZGVuUHJvcGVydHkgfHwgaGlkZGVuQXR0cmlidXRlICE9IG51bGwgfHwgaGlkZGVuUHJvcGVydHlDdXN0b20pKSkpIHtcbiAgICAgICAgICAgICAgICAvLyBTZXQgYSBjdXN0b20gZXhwYW5kb3MgcHJvcGVydHkgb24gdGhlIHRoZSBub2RlIHRvIGlkZW50aWZ5IHRoYXQgaXQgaXMgaGlkZGVuLCBzbyB0aGF0IHdlIGNhbiB1c2VzXG4gICAgICAgICAgICAgICAgLy8gdXNlIHRoaXMgaW4gdGhlIHJ1bGVzIHRvIGRldGVybWluZSBpZiB0aGUgbm9kZSBpcyBoaWRkZW4gb3Igbm90LCBpZiB3ZSBuZWVkIHRvLlxuICAgICAgICAgICAgICAgIC8vIFVzZSBleHBhbmRvcyBwcm9wZXJ0eSBpbnN0ZWFkIG9mIGEgaGFzaCBtYXAgd2hpY2ggc3RvcmVzIHRoZSBlbGVtZW50cywgYWRkaW5nL2NoZWNraW5nIGV4cGFuZG9zXG4gICAgICAgICAgICAgICAgLy8gcHJvcGVydGllcyBpcyBhIGxvdCBmYXN0ZXIgcGVyZm9ybWFuY2Ugd2hpc2UuIEZvciBIYXNoIG1hcCB3ZSBuZWVkIHRvIHN0b3JlIGJhc2VkIG9uIHhwYXRoLCBhbmQgdG8gY2FsY3VsYXRlXG4gICAgICAgICAgICAgICAgLy8geHBhdGggaXQgaXMgbW9yZSBwZXJmb3JtYW5jZSBpbXBhY3QuXG4gICAgICAgICAgICAgICAgcmV0dXJuIENhY2hlVXRpbC5zZXRDYWNoZShub2RlLCBcIlBUX05PREVfSElEREVOXCIsIGZhbHNlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gY2hlY2sgY29udGVudC12aXNpYmlsaXR5OiBpZiB0aGUgY29udGVudC12aXNpYmlsaXR5IGlzIGhpZGRlbiwgdGhlbiwgcmV0dXJuIGZhbHNlIGFzIHRoZSBlbGVtZW50IGlzIG5vdCB2aXNpYmxlXG4gICAgICAgICAgICBpZiAoVmlzVXRpbC5pc0NvbnRlbnRIaWRkZW4obm9kZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQ2FjaGVVdGlsLnNldENhY2hlKG5vZGUsIFwiUFRfTk9ERV9ISURERU5cIiwgZmFsc2UpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBjaGVjayBoaWRkZW4gYnkgY2xpcC1wYXRoXG4gICAgICAgICAgICAvLyBUT0RPOiBuZWVkIHRvIGNoZWNrIGlmIGhpZGRlbiBjb250ZW50IGNvbnRhaW5zIGZvY3VzYWJsZSBlbGVtZW50cywgc2ltaWxhcmx5IHRvIG9mZnNjcmVlbiBjb250ZW50XG4gICAgICAgICAgICBpZiAoQ2xpcFBhdGhVdGlsLmlzTm9kZVZpc3VhbGx5SGlkZGVuQnlDbGlwUGF0aChub2RlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0hJRERFTlwiLCBmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgdGhlIHBhcmVudE5vZGUgZm9yIHRoaXMgbm9kZSwgYmVjdWFzZSB3ZSBoYXZlIHRvIGNoZWNrIGFsbCBwYXJlbnRzIHRvIG1ha2Ugc3VyZSB0aGV5IGRvIG5vdCBoYXZlXG4gICAgICAgIC8vIHRoZSBoaWRkZW4gQ1NTLCBwcm9wZXJ0eSBvciBhdHRyaWJ1dGUuIE9ubHkga2VlcCBjaGVja2luZyB1bnRpbCB3ZSBhcmUgYWxsIHRoZSB3YXkgYmFjayB0byB0aGUgcGFyZW50Tm9kZVxuICAgICAgICAvLyBlbGVtZW50LlxuICAgICAgICBsZXQgcGFyZW50RWxlbWVudCA9IERPTVdhbGtlci5wYXJlbnROb2RlKG5vZGUpO1xuXG4gICAgICAgIC8vIElmIHRoZSBwYXJlbnQgbm9kZSBleGlzdHMgYW5kIHRoZSBub2RldHlwZSBpcyBlbGVtZW50ICgxKSwgdGhlbiBydW4gcmVjdXJzaXZlIGNhbGwgdG8gcGVyZm9ybSB0aGUgY2hlY2tcbiAgICAgICAgLy8gYWxsIHRoZSB3YXkgdXAgdG8gdGhlIHZlcnkgcGFyZW50IG5vZGUuIFVzZSByZWN1cnNpdmUgY2FsbCBoZXJlIGluc3RlYWQgb2YgYSB3aGlsZSBsb29wIHNvIHRoYXQgd2UgZG8gbm90XG4gICAgICAgIC8vIGhhdmUgdG8gZHVwbGljYXRlIHRoZSBsb2dpYyBmb3IgY2hlY2tpbmcgaWYgdGhlIG5vZGUgaXMgdmlzaWJsZSBvciBub3QgZm9yIGFsbCB0aGUgcGFyZW50cyBzdGFydGluZyB3aXRoXG4gICAgICAgIC8vIGNoaWxkIG5vZGUuXG4gICAgICAgIGlmIChwYXJlbnRFbGVtZW50ICE9IG51bGwgJiYgcGFyZW50RWxlbWVudC5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBoYXZlIGEgcGFyZW50IGVsZW1lbnQgZ29pbmcgdGhyb3VnaCB0aGUgaXNOb2RlVmlzaWJsZSBmdW5jdGlvbiB3ZSBoYXZlIHRvIG1hcmsgaXQgYXMgc3VjaFxuICAgICAgICAgICAgLy8gc28gdGhhdCBpbiB0aGUgZnVuY3Rpb24gd2UgY2FuIHNraXAgY2hlY2tpbmcgdmlzaWJpbGl0eTogaGlkZGVuIGZvciBwYXJlbnQgZWxlbWVudHMgc2luY2UgdmlzaWJpbGl0eTogaGlkZGVuXG4gICAgICAgICAgICAvLyBpcyBpbmhlcml0ZWQsIHdoaWNoIGFsbG93cyBhIGNoaWxkIHRvIGhhdmUgYSBkaWZmZXJlbnQgc2V0dGluZyB0aGVuIHRoZSBjaGlsZC4gVGhpcyBwcm9wZXJ0eSBvbmx5IG5lZWRzIHRvIGJlIGNoZWNrZWRcbiAgICAgICAgICAgIC8vIG9uY2UgZm9yIHRoZSBmaXJzdCBlbGVtZW50IHRoYXQgaXMgcGFzc2VkIGRvd24gYW5kIHRoYXQgaXMgYWxsLiBJZ25vcmUgaXQgZm9yIGFsbCB0aGUgcGFyZW50cyB0aGF0IHdlIGl0ZXJhdGUgb3Zlci5cbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShwYXJlbnRFbGVtZW50IGFzIEVsZW1lbnQsIFwiVmlzaWJpbGl0eV9DaGVja19QYXJlbnRcIiwgdHJ1ZSk7XG5cbiAgICAgICAgICAgIC8vIENoZWNrIHVwd2FyZHMgcmVjdXJzaXZlbHksIGFuZCBzYXZlIHRoZSByZXN1bHRzIGluIGFuIHZhcmlhYmxlXG4gICAgICAgICAgICBsZXQgbm9kZVZpc2libGUgPSBWaXNVdGlsLmlzTm9kZVZpc2libGUocGFyZW50RWxlbWVudCk7XG5cbiAgICAgICAgICAgIC8vIElmIHRoZSBub2RlIGlzIGZvdW5kIHRvIG5vdCBiZSB2aXNpYmxlIHRoZW4gYWRkIHRoZSBjdXN0b20gUFRfTk9ERV9ISURERU4gdG8gdHJ1ZS5cbiAgICAgICAgICAgIC8vIHNvIHRoYXQgd2UgY2FuIHVzZSB0aGlzIGluIHRoZSBydWxlcy5cbiAgICAgICAgICAgIC8vIGlmICghbm9kZVZpc2libGUpIHtcbiAgICAgICAgICAgIC8vICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0hJRERFTlwiLCB0cnVlKTtcbiAgICAgICAgICAgIC8vIH1cblxuICAgICAgICAgICAgLy8gQ2hlY2sgdXB3YXJkcyByZWN1cnNpdmVseVxuICAgICAgICAgICAgcmV0dXJuIENhY2hlVXRpbC5zZXRDYWNoZShub2RlLCBcIlBUX05PREVfSElEREVOXCIsIG5vZGVWaXNpYmxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJldHVybiB0cnVlIChub2RlIGlzIHZpc2libGUpXG4gICAgICAgIHJldHVybiBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0hJRERFTlwiLCB0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBjaGVja2luZyBpZiB0aGUgbm9kZSB0aGF0IGlzIHZpc3VhbGx5IGhpZGRlbiBieSBjbGlwcGluZyBvciBvcGFxOlxuICAgICAqICAgIDEuIENoZWNrIGlmIHRoZSBjdXJyZW50IG5vZGUgaXMgdmlzdWFsbHkgaGlkZGVuOlxuICAgICAqICAgICAgIENTUyAtLT4gY2xpcDogcmVjdCgwcHgsIDBweCwgMHB4LCAwcHgpXG4gICAgICogICAgICAgQ1NTIC0tPiBvcGFjaXR5OiAwXG4gICAgICpcbiAgICAgKiAgICBOb3RlOiBJZiBlaXRoZXIgY3VycmVudCBub2RlIG9yIGFueSBvZiB0aGUgcGFyZW50IG5vZGVzIGFyZSB2aXN1YWxseSBoaWRkZW4gdGhlbiB0aGlzXG4gICAgICogICAgICAgICAgZnVuY3Rpb24gd2lsbCByZXR1cm4gdHJ1ZSAobm9kZSBpcyBub3QgdmlzdWFsbHkgaGlkZGVuKS5cbiAgICAgKlxuICAgICAqICAgIE5vdGU6IG5vZGVzIHdpdGggQ1NTIHByb3BlcnRpZXMgY2xpcDogcmVjdCgwcHgsIDBweCwgMHB4LCAwcHgpIG9yIG9wYWNpdHk6MCBvciBmaWx0ZXI6b3BhY2l0eSgwJSksIG9yIHNpbWlsYXIgU1ZHIG1lY2hhbmlzbXM6IFxuICAgICAqICAgICAgVGhleSBhcmUgbm90IGNvbnNpZGVyZWQgaGlkZGVuIHRvIGFuIEFULiBUZXh0IGhpZGRlbiB3aXRoIHRoZXNlIG1ldGhvZHMgY2FuIHN0aWxsIGJlIHNlbGVjdGVkIG9yIGNvcGllZCwgXG4gICAgICogICAgICBhbmQgdXNlciBhZ2VudHMgc3RpbGwgZXhwb3NlIGl0IGluIHRoZWlyIGFjY2Vzc2liaWxpdHkgdHJlZXMuICBcbiAgICAgKiBcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gbm9kZSBUaGUgbm9kZSB3aGljaCBzaG91bGQgYmUgY2hlY2tlZCBpZiBpdCBpcyB2aXN1YWxseSBoaWRkZW4gb3Igbm90LlxuICAgICAqIEByZXR1cm4ge2Jvb2x9IHRydWUgaWYgdGhlIG5vZGUgaXMgdmlzdWFsbHkgaGlkZGVuLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBWaXNVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpc05vZGVWaXN1YWxseUhpZGRlbihub2RlOiBOb2RlKSA6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIW5vZGUgfHwgbm9kZS5ub2RlVHlwZSAhPT0gMSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBcbiAgICAgICAgbGV0IGVsZW0gPSBub2RlIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAvLyBTZXQgUFRfTk9ERV9ISURERU4gdG8gZmFsc2UgZm9yIGFsbCB0aGUgbm9kZXMsIGJlZm9yZSB0aGUgY2hlY2sgYW5kIHRoaXMgd2lsbCBiZSBjaGFuZ2VkIHRvXG4gICAgICAgIC8vIHRydWUgd2hlbiB3ZSBkZXRlY3QgdGhhdCB0aGUgbm9kZSBpcyBoaWRkZW4uIFdlIGhhdmUgdG8gc2V0IGl0IHRvIGZhbHNlIHNvIHRoYXQgd2Uga25vd1xuICAgICAgICAvLyB0aGUgcnVsZXMgaGFzIGFscmVhZHkgYmVlbiBjaGVja2VkLlxuICAgICAgICBjb25zdCBoaWRkZW4gPSBDYWNoZVV0aWwuZ2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTlwiLCB1bmRlZmluZWQpO1xuICAgICAgICBpZiAoaGlkZGVuID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIGRlZmluZWQgc3R5bGVzIG9ubHkgZ2l2ZSB0aGUgc3R5bGVzIHRoYXQgY2hhbmdlZFxuICAgICAgICAgICAgY29uc3QgY29tcF9zdHlsZXMgPSBDU1NVdGlsLmdldENvbXB1dGVkU3R5bGUoZWxlbSk7XG4gICAgICAgICAgICBpZiAoKGNvbXBfc3R5bGVzWydwb3NpdGlvbiddPT09J2Fic29sdXRlJyAmJiBjb21wX3N0eWxlc1snY2xpcCddICYmIChjb21wX3N0eWxlc1snY2xpcCddIGFzIGFueSkucmVwbGFjZUFsbCgnICcsICcnKT09PSdyZWN0KDBweCwwcHgsMHB4LDBweCknKVxuICAgICAgICAgICAgICAgIHx8IChjb21wX3N0eWxlc1snb3BhY2l0eSddICYmIHBhcnNlRmxvYXQoY29tcF9zdHlsZXNbJ29wYWNpdHknXSkgPCAwLjEpKSAge1xuICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOXCIsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBHZXQgdGhlIHBhcmVudE5vZGUgZm9yIHRoaXMgbm9kZSwgYmVjdWFzZSB3ZSBoYXZlIHRvIGNoZWNrIGFsbCBwYXJlbnRzIHRvIG1ha2Ugc3VyZSB0aGV5IGRvIG5vdCBoYXZlXG4gICAgICAgICAgICAvLyB0aGUgaGlkZGVuIENTUywgcHJvcGVydHkgb3IgYXR0cmlidXRlLiBPbmx5IGtlZXAgY2hlY2tpbmcgdW50aWwgd2UgYXJlIGFsbCB0aGUgd2F5IGJhY2sgdG8gdGhlIHBhcmVudE5vZGVcbiAgICAgICAgICAgIC8vIGVsZW1lbnQuXG4gICAgICAgICAgICBsZXQgcGFyZW50RWxlbWVudCA9IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KGVsZW0pO1xuICAgICAgICAgICAgaWYgKCFwYXJlbnRFbGVtZW50KVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgICAgICAgLy8gQ2hlY2sgdXB3YXJkcyByZWN1cnNpdmVseVxuICAgICAgICAgICAgY29uc3QgaGlkID0gVmlzVXRpbC5pc05vZGVWaXN1YWxseUhpZGRlbihwYXJlbnRFbGVtZW50KTtcbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOXCIsIGhpZCk7XG4gICAgICAgICAgICByZXR1cm4gaGlkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoaWRkZW47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcmV0dXJuIHRydWUgaWYgdGhlIG5vZGUgb3IgaXRzIGFuY2VzdG9yIGlzIGhpZGRlbiBieSBDU1MgY29udGVudC12aXNpYmlsaXR5OmhpZGRlblxuICAgICAqIEF0IHRoaXMgdGltZSwgQ1NTIGNvbnRlbnQtdmlzaWJpbGl0eSBpcyBwYXJ0aWFsbHkgc3VwcG9ydGVkIGJ5IENocm9tZSAmIEVkZ2UsIGJ1dCBub3Qgc3VwcG9ydGVkIGJ5IEZpcmVmb3hcbiAgICAgKiBUaGUgaW1wbGVtZW50YXRpb24gVEVNUE9SQVJJTFkgZm9sbG93cyB0aGUgQ2hyb21lIHRlc3QgcmVzdWx0czpcbiAgICAgKiAgIGlmIGNvbnRlbnQtdmlzaWJpbGl0eTpoaWRkZW5cbiAgICAgKiAgICAgIGlmIHRoZSBlbGVtZW50IGlzIGJsb2NrLWxldmVsIChkZWZhdWx0IG9yIHNwZWNpZmllZCBieSB0aGUgdXNlciksIHRoZW4gdGhlIGVsZW1lbnQgYW5kIGl0cyBjaGlsZHJlbiBhcmUgbm9ybWFsbHkgaGlkZGVuO1xuICAgICAqICAgICAgaWYgdGhlIGVsZW1lbnQgaXMgaW5saW5lIChkZWZhdWx0IG9yIHNwZWNpZmllZCBieSB0aGUgdXNlciksIHRoZW4gdGhlIGVsZW1lbnQgYW5kIGl0cyBjaGlsZHJlbiBhcmUgbm9ybWFsbHkgTk9UIGhpZGRlbjsgXG4gICAgICogXG4gICAgICogQHBhcmFtIG5vZGVcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzQ29udGVudEhpZGRlbihub2RlOiBFbGVtZW50KSA6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBjb25zdCB2aXMgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0NvbnRlbnRIaWRkZW5cIiwgdW5kZWZpbmVkKTtcbiAgICAgICAgaWYgKHZpcyAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdmlzOyAgICBcblxuICAgICAgICBjb25zdCBzdHlsZSA9ICBnZXRDb21wdXRlZFN0eWxlKG5vZGUpO1xuICAgICAgICBpZiAoIXN0eWxlKSB7XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0NvbnRlbnRIaWRkZW5cIiwgZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbnRlbnRfdmlzaWJpbGl0eSA9IHN0eWxlLmdldFByb3BlcnR5VmFsdWUoXCJjb250ZW50LXZpc2liaWxpdHlcIik7XG4gICAgICAgIGlmIChjb250ZW50X3Zpc2liaWxpdHkgIT09ICdoaWRkZW4nKSB7XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0NvbnRlbnRIaWRkZW5cIiwgZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgXG4gICAgICAgIH0gXG4gICAgICAgIGNvbnN0IGRpc3BsYXkgPSBzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKFwiZGlzcGxheVwiKTsgXG4gICAgICAgIC8vIGlubGluZSBlbGVtZW50IG9ubHlcbiAgICAgICAgaWYgKGRpc3BsYXkgPT09ICdpbmxpbmUnKSB7XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0NvbnRlbnRIaWRkZW5cIiwgZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9ICBcbiAgICAgICAgXG4gICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShub2RlLCBcIlBUX05PREVfQ29udGVudEhpZGRlblwiLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcmV0dXJuIHRydWUgaWYgdGhlIG5vZGUgaXMgb2Zmc2NyZWVuIGJ5IENTUyBwb3NpdGlvblxuICAgICAqIEBwYXJhbSBub2RlXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpc0VsZW1lbnRPZmZzY3JlZW4obm9kZTogSFRNTEVsZW1lbnQpIDogYm9vbGVhbiB7XG4gICAgICAgIGlmICghbm9kZSkgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmIChub2RlLm5vZGVUeXBlICE9PSAxKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIFxuICAgICAgICBjb25zdCB2aXMgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUobm9kZSAsIFwiUFRfTk9ERV9PZmZzY3JlZW5cIiwgdW5kZWZpbmVkKTtcbiAgICAgICAgaWYgKHZpcyAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdmlzOyAgXG5cbiAgICAgICAgY29uc3QgbWFwcGVyIDogRE9NTWFwcGVyID0gbmV3IERPTU1hcHBlcigpO1xuICAgICAgICBjb25zdCBib3VuZHMgPSBtYXBwZXIuZ2V0VW5hZGp1c3RlZEJvdW5kcyhub2RlKTsgXG4gICAgICAgIGlmICghYm91bmRzKSB7XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX09mZnNjcmVlblwiLCB0cnVlKTsgXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKGJvdW5kc1snaGVpZ2h0J10gPT09IDAgfHwgYm91bmRzWyd3aWR0aCddID09PSAwIHx8IChib3VuZHNbJ3RvcCddK2JvdW5kc1snaGVpZ2h0J10pIDw9IDAgfHwgKGJvdW5kc1snbGVmdCddK2JvdW5kc1snd2lkdGgnXSkgPD0gMCkge1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKG5vZGUsIFwiUFRfTk9ERV9PZmZzY3JlZW5cIiwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBcblxuICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX09mZnNjcmVlblwiLCBmYWxzZSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiByZXR1cm4gdHJ1ZSBpZiB0aGUgbm9kZSBvciBpdHMgYW5jZXN0b3IgaXMgbmF0aXZlbHkgaGlkZGVuIG9yIGFyaWEtaGlkZGVuID0gJ3RydWUnXG4gICAgICogQHBhcmFtIG5vZGVcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzTm9kZUhpZGRlbkZyb21BVChub2RlOiBFbGVtZW50KSA6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgdmlzID0gQ2FjaGVVdGlsLmdldENhY2hlKG5vZGUsIFwiUFRfTk9ERV9IaWRkZW5Gcm9tQVRcIiwgdW5kZWZpbmVkKTtcbiAgICAgICAgaWYgKHZpcyAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdmlzOyAgIFxuXG4gICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKG5vZGUpIHx8IG5vZGUuZ2V0QXR0cmlidXRlKFwiYXJpYS1oaWRkZW5cIikgPT09ICd0cnVlJykge1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKG5vZGUsIFwiUFRfTk9ERV9IaWRkZW5Gcm9tQVRcIiwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSAgICBcbiAgICAgICAgbGV0IGFuY2VzdG9yID0gRE9NVXRpbC5nZXRBbmNlc3RvcldpdGhBdHRyaWJ1dGUobm9kZSwgXCJhcmlhLWhpZGRlblwiLCBcInRydWVcIik7XG4gICAgICAgIGlmIChhbmNlc3Rvcikge1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKG5vZGUsIFwiUFRfTk9ERV9IaWRkZW5Gcm9tQVRcIiwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0hpZGRlbkZyb21BVFwiLCBmYWxzZSk7ICAgIFxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcmV0dXJuIHRydWUgaWYgdGhlIG5vZGUgb3IgaXRzIGFuY2VzdG9yIGlzIG5hdGl2ZWx5IGhpZGRlbiBvciBhcmlhLWhpZGRlbiA9ICd0cnVlJ1xuICAgICAqIEBwYXJhbSBub2RlXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpc05vZGVQcmVzZW50YXRpb25hbChub2RlOiBFbGVtZW50KSA6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCByb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKG5vZGUpO1xuICAgICAgICBpZiAocm9sZSAmJiAocm9sZSA9PT0gJ25vbmUnIHx8IHJvbGUgPT09ICdwcmVzZW50YXRpb24nKSkgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiByZXR1cm4gdHJ1ZSBpZiB0aGUgZWxlbWVudCBpcyBzY3JvbGxhYmxlXG4gICAgICogQHBhcmFtIG5vZGVcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzRWxlbWVudFNjcm9sbGFibGUoZWxlbTogSFRNTEVsZW1lbnQpIDogYm9vbGVhbiB7XG4gICAgICAgIGlmICghZWxlbSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IHN0eWxlcyA9IENTU1V0aWwuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtKTtcbiAgICAgICAgaWYgKCFzdHlsZXMpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBsZXQgeF9zY3JvbGwgPSBzdHlsZXMuZ2V0UHJvcGVydHlWYWx1ZSgnb3ZlcmZsb3cteCcpO1xuICAgICAgICBsZXQgeV9zY3JvbGwgPSBzdHlsZXMuZ2V0UHJvcGVydHlWYWx1ZSgnb3ZlcmZsb3cteScpO1xuICAgICAgICAvL2NvbnNvbGUubG9nKFwiYmVmb3JlIG5vZGU9XCIrIGVsZW0ubm9kZU5hbWUgK1wiLCBpZD1cIitlbGVtLmdldEF0dHJpYnV0ZShcImlkXCIpICtcIiwgeF9zY3JvbGw9XCIreF9zY3JvbGwgKyBcIiwgeV9zY3JvbGw9XCIreV9zY3JvbGwpO1xuIFxuICAgICAgICAvLyBJZiBvdmVyZmxvdy15IGlzIGhpZGRlbiwgc2Nyb2xsLCBvciBhdXRvLCBhbmQgdGhlIG92ZXJmbG93LXggcHJvcGVydHkgaXMgdmlzaWJsZSAoZGVmYXVsdCksIHRoZSB2YWx1ZSB3aWxsIGJlIGltcGxpY2l0bHkgY29tcHV0ZWQgYXMgYXV0by5cbiAgICAgICAgaWYgKHhfc2Nyb2xsID09PSAndmlzaWJsZScgJiYgKHlfc2Nyb2xsID09PSAnaGlkZGVuJyB8fCB5X3Njcm9sbCA9PT0gJ3Njcm9sbCcgfHwgeV9zY3JvbGwgPT09ICdhdXRvJykpXG4gICAgICAgICAgICB4X3Njcm9sbCA9ICdhdXRvJztcblxuICAgICAgICAvLyBJZiBvdmVyZmxvdy14IGlzIGhpZGRlbiwgc2Nyb2xsLCBvciBhdXRvIGFuZCB0aGUgb3ZlcmZsb3cteSBwcm9wZXJ0eSBpcyB2aXNpYmxlIChkZWZhdWx0KSwgdGhlIHZhbHVlIHdpbGwgYmUgaW1wbGljaXRseSBjb21wdXRlZCBhcyBhdXRvLlxuICAgICAgICBpZiAoeV9zY3JvbGwgPT09ICd2aXNpYmxlJyAmJiAoeF9zY3JvbGwgPT09ICdoaWRkZW4nIHx8IHhfc2Nyb2xsID09PSAnc2Nyb2xsJyB8fCB4X3Njcm9sbCA9PT0gJ2F1dG8nKSlcbiAgICAgICAgICAgIHlfc2Nyb2xsID0gJ2F1dG8nO1xuXG4gICAgICAgIC8vIHNldHRpbmcgb3ZlcmZsb3cgdG8gY2xpcCBpbiBvbmUgZGlyZWN0aW9uIHdoZW4gaXQgaXNuJ3Qgc2V0IHRvIHZpc2libGUgb3IgY2xpcCBpbiB0aGUgb3RoZXIgZGlyZWN0aW9uIHJlc3VsdHMgaW4gdGhlIGNsaXAgdmFsdWUgYmVoYXZpbmcgYXMgaGlkZGVuLiBcbiAgICAgICAgaWYgKHhfc2Nyb2xsID09PSAnY2xpcCcgJiYgeV9zY3JvbGwgIT09ICd2aXNpYmxlJyAmJiB5X3Njcm9sbCAhPT0gJ2NsaXAnKVxuICAgICAgICAgICAgeF9zY3JvbGwgPSAnaGlkZGVuJztcbiAgICAgICAgaWYgKHlfc2Nyb2xsID09PSAnY2xpcCcgJiYgeF9zY3JvbGwgIT09ICd2aXNpYmxlJyAmJiB4X3Njcm9sbCAhPT0gJ2NsaXAnKVxuICAgICAgICAgICAgeV9zY3JvbGwgPSAnaGlkZGVuJztcblxuICAgICAgICAvLyBub3Qgc2Nyb2xsYWJsZTogbm8gc2Nyb2xsIGJhcnNcbiAgICAgICAgaWYgKCh4X3Njcm9sbCA9PT0gJ3Zpc2libGUnIHx8IHhfc2Nyb2xsID09PSAnaGlkZGVuJyB8fCB4X3Njcm9sbCA9PT0gJ2NsaXAnKVxuICAgICAgICAgICAgJiYgKHlfc2Nyb2xsID09PSAndmlzaWJsZScgfHwgeV9zY3JvbGwgPT09ICdoaWRkZW4nIHx8IHlfc2Nyb2xsID09PSAnY2xpcCcpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIC8vIGZhbHNlIGlmIHRoZSBvdmVyYWxsIHNjcm9sbGFibGUgZWxlbWVudCAoY2xpZW50V2lkdGggKyBzY3JvbGxiYXJXaWR0aCBhbmQgY2xpZW50SGVpZ2h0ICsgc2Nyb2xsYmFySGVpZ2h0KSBpcyB0b28gc21hbGwgdG8gYmUgdmlzaWJsZSBvbiBzY3JlZW5cbiAgICAgICAgaWYgKE1hdGgubWF4KGVsZW0ub2Zmc2V0V2lkdGgsIGVsZW0ub2Zmc2V0SGVpZ2h0KSA8IDMwIHx8IE1hdGgubWluKGVsZW0ub2Zmc2V0V2lkdGgsIGVsZW0ub2Zmc2V0SGVpZ2h0KSA8IDE1KSAgXG4gICAgICAgICAgIHJldHVybiBmYWxzZTsgXG5cbiAgICAgICAgLy8gZmFsc2UgaWYgY29udGVudCBpcyBzbWFsbGVyIHRoYW4gdGhlIHNjcm9sbGFibGUgY29udGFpbmVyOiBib3RoIHggYW5kIHkgc2Nyb2xsIGRpc3RhbmNlcyA8IGVsZW1lbnQncyBob3Jpem9udGFsL3ZlcnRpY2FsIHBhZGRpbmdcbiAgICAgICAgY29uc3QgcGFkZGluZ194ID0gQ1NTVXRpbC5nZXRQaXhlbHNGcm9tU3R5bGUoc3R5bGVzLnBhZGRpbmdMZWZ0LCBlbGVtKSArIENTU1V0aWwuZ2V0UGl4ZWxzRnJvbVN0eWxlKHN0eWxlcy5wYWRkaW5nUmlnaHQsIGVsZW0pO1xuICAgICAgICBjb25zdCBwYWRkaW5nX3kgPSBDU1NVdGlsLmdldFBpeGVsc0Zyb21TdHlsZShzdHlsZXMucGFkZGluZ1RvcCwgZWxlbSkgKyBDU1NVdGlsLmdldFBpeGVsc0Zyb21TdHlsZShzdHlsZXMucGFkZGluZ0JvdHRvbSwgZWxlbSk7XG4gICAgICAgIGlmIChlbGVtLnNjcm9sbFdpZHRoIC0gIGVsZW0uY2xpZW50V2lkdGggPCAxICsgcGFkZGluZ194IFxuICAgICAgICAgICAgJiYgZWxlbS5zY3JvbGxIZWlnaHQgLSAgZWxlbS5jbGllbnRIZWlnaHQgPCAxKyBwYWRkaW5nX3kpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxufSIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbmNvbnN0IF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0Y29uc3QgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdGNvbnN0IG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0aWYgKCEobW9kdWxlSWQgaW4gX193ZWJwYWNrX21vZHVsZXNfXykpIHtcblx0XHRkZWxldGUgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0XHRjb25zdCBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIiArIG1vZHVsZUlkICsgXCInXCIpO1xuXHRcdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0XHR0aHJvdyBlO1xuXHR9XG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5leHBvcnQgeyBDb250ZXh0IH0gZnJvbSBcIi4vdjIvY29tbW9uL0NvbnRleHRcIlxuLy8gaW1wb3J0IHsgU2ltdWxhdG9yIH0gZnJvbSBcIi4vdjIvc2ltdWxhdG9yXCJcbmltcG9ydCB7IENoZWNrZXIgfSBmcm9tIFwiLi92NC9jaGVja2VyL0NoZWNrZXJcIlxuZXhwb3J0IHsgQ2hlY2tlciB9XG5leHBvcnQgeyBBUklBTWFwcGVyIH0gZnJvbSBcIi4vdjIvYXJpYS9BUklBTWFwcGVyXCI7XG5leHBvcnQgeyBDb25maWcgfSBmcm9tIFwiLi92Mi9jb25maWcvQ29uZmlnXCI7XG5leHBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5leHBvcnQgeyBTUkNvbnRyb2xsZXIgfSBmcm9tIFwiLi92NC9zaW11bGF0b3IvU1JDb250cm9sbGVyXCI7XG5leHBvcnQgeyBTUkN1cnNvciB9IGZyb20gXCIuL3Y0L3NpbXVsYXRvci9TUkN1cnNvclwiO1xuZXhwb3J0IHsgU1JWaWV3ZXIgfSBmcm9tIFwiLi92NC9zaW11bGF0b3IvU1JWaWV3ZXJcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrRGVtbyh0aW1lb3V0PzogbnVtYmVyKSB7XG4gICAgaWYgKCF0aW1lb3V0KSB0aW1lb3V0ID0gMDtcbiAgICBsZXQgY2hlY2tlciA9IG5ldyBDaGVja2VyKCk7XG4gICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgY2hlY2tlci5jaGVjayhkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0Rlc2lnblwiXSlcbiAgICAgICAgLnRoZW4oZnVuY3Rpb24ocmVwb3J0KSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhyZXBvcnQpO1xuICAgICAgICAgICAgY29uc3QgdmFscyA9IHtcbiAgICAgICAgICAgICAgICBcIkZBSUxcIjogMCxcbiAgICAgICAgICAgICAgICBcIlBPVEVOVElBTFwiOiAxLFxuICAgICAgICAgICAgICAgIFwiTUFOVUFMXCI6IDIsXG4gICAgICAgICAgICAgICAgXCJQQVNTXCI6IDNcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IGlkeD0wOyBpZHg8cmVwb3J0LnJlc3VsdHMubGVuZ3RoOyArK2lkeCkge1xuICAgICAgICAgICAgICAgIGlmIChyZXBvcnQucmVzdWx0c1tpZHhdLnZhbHVlWzFdID09PSBcIlBBU1NcIikge1xuICAgICAgICAgICAgICAgICAgICByZXBvcnQucmVzdWx0cy5zcGxpY2UoaWR4LS0sMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVwb3J0LnJlc3VsdHMuc29ydCgoYSxiKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGEuY2F0ZWdvcnkgIT0gYi5jYXRlZ29yeSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5jYXRlZ29yeS5sb2NhbGVDb21wYXJlKGIuY2F0ZWdvcnkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoYS5wYXRoW1wiYXJpYVwiXSA9PT0gYi5wYXRoW1wiYXJpYVwiXSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsc1thLnZhbHVlWzFdXS12YWxzW2IudmFsdWVbMV1dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYS5wYXRoW1wiYXJpYVwiXS5sb2NhbGVDb21wYXJlKGIucGF0aFtcImFyaWFcIl0pO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGxldCBsYXN0UGF0aCA9IG51bGw7XG4gICAgICAgICAgICBsZXQgY2F0ZWdvcnkgPSBudWxsO1xuICAgICAgICAgICAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVwb3J0LnJlc3VsdHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoY2F0ZWdvcnkgIT09IHJlc3VsdC5jYXRlZ29yeSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2F0ZWdvcnkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RQYXRoID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeSA9IHJlc3VsdC5jYXRlZ29yeTtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5ncm91cChyZXN1bHQuY2F0ZWdvcnkpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQucGF0aFtcImFyaWFcIl0gIT0gbGFzdFBhdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RQYXRoICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmdyb3VwRW5kKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGFzdFBhdGggPSByZXN1bHQucGF0aFtcImFyaWFcIl07XG4gICAgICAgICAgICAgICAgICAgIGlmIChsYXN0UGF0aCA9PT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5ncm91cChcInBhZ2VcIik7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmdyb3VwKGxhc3RQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhyZXN1bHQudmFsdWUsIHJlc3VsdC5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgICAgICAgfSk7XG4gICAgfSwgdGltZW91dCk7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0= \ No newline at end of file diff --git a/rule-server/src/static/archives/2026.07.13/js/ace-node-debug.js b/rule-server/src/static/archives/2026.07.13/js/ace-node-debug.js new file mode 100644 index 000000000..d2519b3cc --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/js/ace-node-debug.js @@ -0,0 +1,37248 @@ +/*! + * Copyright:: 2016,2017,2019,2020- IBM, Inc + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/******/ (() => { // webpackBootstrap +/******/ "use strict"; +/******/ var __webpack_modules__ = ({ + +/***/ 9910 +(__unused_webpack_module, exports) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ARIADefinitions = void 0; +var ARIADefinitions = /** @class */ (function () { + function ARIADefinitions() { + } + ARIADefinitions.nameFromContent = function (role) { + return (role in ARIADefinitions.designPatterns) + && ARIADefinitions.designPatterns[role].nameFrom + && ARIADefinitions.designPatterns[role].nameFrom.includes("contents"); + }; + /* + * array of WAI-ARIA global states and properties + * @see https://www.w3.org/TR/wai-aria-1.2/#global_states + */ + ARIADefinitions.globalProperties = ["aria-atomic", "aria-busy", "aria-controls", "aria-current", "aria-describedby", + "aria-details", "aria-flowto", "aria-hidden", "aria-keyshortcuts", + "aria-label", "aria-labelledby", "aria-live", "aria-owns", "aria-relevant", "aria-roledescription" + // the following are deprecated in ARIA 1.2, will indicate deprecation in individual role + , + 'aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid' + ]; + //properties contains id(s) that refer to other element(s) + ARIADefinitions.referenceProperties = ["aria-owns", "aria-controls", "aria-describedby", "aria-labelledby", "aria-flowto", "aria-activedescendant"]; + // deprecated roles + ARIADefinitions.globalDeprecatedRoles = [ + 'directory', 'doc-biblioentry', 'doc-endnote' + ]; + // the following are deprecated in ARIA 1.1 for all the roles + ARIADefinitions.globalDeprecatedProperties = [ + 'aria-grabbed', 'aria-dropeffect' + ]; + /* + * XSD data types for all WAI-ARIA properties + * along with valid values when the data type is NMTOKEN + * WAI-ARIA properties data types explaned: + * type: Used to identify the type of values allowed for the WAI-ARIA property + * values: Used to identify specific values of an WAI-ARIA property when type is nmtoken + * hiddenIDRefSupported: Used to identify if the WAI-ARIA property supports referencing hidden ID + * true: refers to WAI-ARIA property supports hidden ID references + * false: refers to WAI-ARIA property does not support hidden ID references + * Default value will be set to false, if not specified. + */ + ARIADefinitions.propertyDataTypes = { + "aria-activedescendant": { + type: "http://www.w3.org/2001/XMLSchema#idref", + hiddenIDRefSupported: true + }, + "aria-atomic": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-autocomplete": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["inline", "list", "both", "none", "undefined"] //add undefined to handle value empty + }, + "aria-busy": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-checked": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "mixed", "undefined"] + }, + "aria-colcount": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-colindex": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-colspan": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-controls": { + type: "http://www.w3.org/2001/XMLSchema#idrefs", + hiddenIDRefSupported: true + }, + "aria-current": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["page", "step", "location", "date", "time", "true", "false", "undefined"] //add undefined for empty value + }, + "aria-describedby": { + type: "http://www.w3.org/2001/XMLSchema#idrefs", + hiddenIDRefSupported: true + }, + "aria-details": { + type: "http://www.w3.org/2001/XMLSchema#idrefs" + }, + "aria-disabled": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-dropeffect": { + type: "http://www.w3.org/2001/XMLSchema#nmtokens", + values: ["copy", "move", "link", "execute", "popup", "none"] + }, + "aria-errormessage": { + type: "http://www.w3.org/2001/XMLSchema#idref", + hiddenIDRefSupported: true + }, + "aria-expanded": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "undefined"] + }, + "aria-flowto": { + type: "http://www.w3.org/2001/XMLSchema#idrefs", + hiddenIDRefSupported: false + }, + "aria-grabbed": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "undefined"] + }, + "aria-haspopup": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "menu", "listbox", "tree", "grid", "dialog"] + }, + "aria-hidden": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "undefined"] + }, + "aria-invalid": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "spelling", "grammar", "undefined"] //add undefined for empty value + }, + "aria-keyshortcuts": { + type: "http://www.w3.org/2001/XMLSchema#string" + }, + "aria-label": { + type: "http://www.w3.org/2001/XMLSchema#string" + }, + "aria-labelledby": { + type: "http://www.w3.org/2001/XMLSchema#idrefs", + hiddenIDRefSupported: true + }, + "aria-level": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-live": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["off", "polite", "assertive"] + }, + "aria-modal": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-multiline": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-multiselectable": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-orientation": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["horizontal", "vertical", "undefined"] + }, + "aria-owns": { + type: "http://www.w3.org/2001/XMLSchema#idrefs", + hiddenIDRefSupported: true + }, + "aria-placeholder": { + type: "http://www.w3.org/2001/XMLSchema#string" + }, + "aria-posinset": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-pressed": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "mixed", "undefined"] + }, + "aria-readonly": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-relevant": { + type: "http://www.w3.org/2001/XMLSchema#nmtokens", + values: ["additions", "removals", "text", "all"] + }, + "aria-required": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-roledescription": { + type: "http://www.w3.org/2001/XMLSchema#string" + }, + "aria-rowcount": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-rowindex": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-rowspan": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-selected": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "undefined"] + }, + "aria-setsize": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-sort": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["ascending", "descending", "other", "none"] + }, + "aria-valuemax": { + type: "http://www.w3.org/2001/XMLSchema#decimal" + }, + "aria-valuemin": { + type: "http://www.w3.org/2001/XMLSchema#decimal" + }, + "aria-valuenow": { + type: "http://www.w3.org/2001/XMLSchema#decimal" + }, + "aria-valuetext": { + type: "http://www.w3.org/2001/XMLSchema#string" + } + }; + /* + * design patterns for concrete WAI-ARIA roles + * legitimate keys for each role include: + * + * - container: appropriate container(s) for that role + * - props: states and properties that may be associated with this role (in addition to the global states and properties listed above) + * - reqProps: required states or properties for this role + * - reqChildren: required children for this role + * - htmlEquiv: HTML equivalent for this role + * - roleType: one of widget, structure, landmark, liveRegion, window (as seen in https://www.w3.org/TR/wai-aria-1.2/#roles_categorization) + * - nameRequired: determines whether an accessible name is required for a widget (see ARIA spec.) + * - nameFrom: determines how an accessible name is supplied (author or content - see ARIA spec.) + * - deprecated: if present, indicates that the role is deprecated, and provides a list of alternative role(s) + */ + ARIADefinitions.designPatterns = { + "alert": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "liveRegion", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "alertdialog": { + container: null, + props: ["aria-modal"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "window", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "application": { + container: null, + props: ["aria-activedescendant", "aria-expanded"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: true, + nameFrom: ["author"] + }, + "article": { + container: null, + props: ["aria-posinset", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "banner": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "blockquote": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "button": { + container: null, + props: ["aria-expanded", "aria-pressed"], + reqProps: null, + reqChildren: null, + htmlEquiv: "button | input[@type='button']", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + "caption": { + container: ["figure", "grid", "table", "treegrid"], + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "cell": { + container: ["row"], + props: ["aria-colindex", "aria-colspan", "aria-rowindex", "aria-rowspan"], + reqProps: null, + reqChildren: null, + htmlEquiv: "td", + roleType: "structure", + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "checkbox": { + container: null, + props: ["aria-expanded", "aria-readonly", "aria-required"], + reqProps: ["aria-checked"], + reqChildren: null, + htmlEquiv: "input[@type='checkbox']", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-haspopup'] + }, + "code": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "columnheader": { + container: ["row"], + props: ["aria-colindex", "aria-colspan", "aria-expanded", "aria-readonly", "aria-required", "aria-rowindex", "aria-rowspan", "aria-selected", "aria-sort"], + reqProps: null, + reqChildren: null, + htmlEquiv: "th[@scope='col']", + roleType: "structure", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + "combobox": { + container: null, + props: ["aria-controls", "aria-activedescendant", "aria-autocomplete", "aria-readonly", "aria-required"], + reqProps: ["aria-expanded"], + reqChildren: [], + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"] + }, + "complementary": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "comment": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "contentinfo": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "definition": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "deletion": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "dialog": { + container: null, + props: ["aria-modal"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "window", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "directory": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecated: true, + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "doc-abstract": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-acknowledgments": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-afterword": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-appendix": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-backlink": { + container: null, + props: ["aria-disabled", "aria-expanded", "aria-haspopup"], + reqProps: null, + reqChildren: null, + htmlEquiv: "a | link", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + "doc-biblioentry": { + container: ["list"], + props: ["aria-level", "aria-posinset", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: "li", + roleType: "structure", + nameRequired: true, + nameFrom: ["author"] + }, + "doc-bibliography": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-biblioref": { + container: null, + props: ["aria-disabled", "aria-expanded", "aria-haspopup"], + reqProps: null, + reqChildren: null, + htmlEquiv: "a | link", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + "doc-chapter": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-colophon": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: true, + nameFrom: ["author"] + }, + "doc-conclusion": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-cover": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "img", + roleType: "structure", + nameRequired: false, + nameFrom: ["author"], + presentationalChildren: true + }, + "doc-credit": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-credits": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-dedication": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-endnote": { + container: ["list"], + props: ["aria-level", "aria-posinset", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: "li", + roleType: "structure", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-endnotes": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: true, + nameFrom: ["author"] + }, + "doc-epigraph": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-epilogue": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-errata": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-example": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-footnote": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-foreword": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-glossary": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-glossref": { + container: null, + props: ["aria-disabled", "aria-expanded", "aria-haspopup"], + reqProps: null, + reqChildren: null, + htmlEquiv: "a | link", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + "doc-index": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-introduction": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-noteref": { + container: null, + props: ["aria-disabled", "aria-expanded", "aria-haspopup"], + reqProps: null, + reqChildren: null, + htmlEquiv: "a | link", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + "doc-notice": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-pagebreak": { + container: null, + props: ["aria-orientation"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true + }, + "doc-pagelist": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-pagefooter": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + }, + "doc-pageheader": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + }, + "doc-part": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-preface": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-prologue": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-pullquote": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-qna": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-subtitle": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author", "contents"] + }, + "doc-tip": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-toc": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "document": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "emphasis": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "feed": { + container: null, + props: null, + reqProps: null, + reqChildren: ["article"], + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "figure": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "form": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "form", + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "generic": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "div | span", + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby", "aria-roledescription"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "graphics-document": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + nameRequired: true, + nameFrom: ["author"] + }, + "graphics-object": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + nameRequired: false, + nameFrom: ["author"] + }, + "graphics-symbol": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + nameRequired: true, + nameFrom: ["author"], + presentationalChildren: true + }, + "grid": { + container: null, + props: ["aria-activedescendant", "aria-colcount", "aria-multiselectable", "aria-readonly", "aria-rowcount"], + reqProps: null, + reqChildren: ["row", "rowgroup"], + htmlEquiv: "table", + roleType: "widget", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "gridcell": { + container: ["row"], + props: ["aria-colindex", "aria-colspan", "aria-disabled", "aria-errormessage", "aria-expanded", "aria-haspopup", "aria-invalid", "aria-readonly", "aria-required", "aria-rowindex", "aria-rowspan", "aria-selected"], + reqProps: null, + reqChildren: null, + htmlEquiv: "td", + roleType: "widget", + nameFrom: ["author", "contents"] + }, + "group": { + container: null, + props: ["aria-activedescendant"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "heading": { + container: null, + props: null, + reqProps: ["aria-level"], + reqChildren: null, + htmlEquiv: "h1 | h2 | h3 | h4 | h5 | h6", + roleType: "structure", + nameRequired: true, + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "img": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "img", + roleType: "structure", + nameRequired: true, + nameFrom: ["author"], + presentationalChildren: true, + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "image": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "img", + roleType: "structure", + nameRequired: true, + nameFrom: ["author"], + presentationalChildren: true, + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "insertion": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "link": { + container: null, + props: ["aria-expanded"], + reqProps: null, + reqChildren: null, + htmlEquiv: "a | link", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + "list": { + container: null, + props: null, + reqProps: null, + reqChildren: ["listitem"], + htmlEquiv: "ol | ul", + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "listbox": { + container: null, + props: ["aria-activedescendant", "aria-expanded", "aria-multiselectable", "aria-orientation", "aria-readonly", "aria-required"], + reqProps: null, + reqChildren: ["group", "option"], + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-haspopup'] + }, + "listitem": { + container: ["list"], + props: ["aria-level", "aria-posinset", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: "li", + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "log": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "liveRegion", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "main": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "mark": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "mark", + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "marquee": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "liveRegion", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "math": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + presentationalChildren: false, + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "menu": { + container: null, + props: ["aria-activedescendant", "aria-orientation"], + reqProps: null, + reqChildren: ["group", "menuitem", "menuitemcheckbox", "menuitemradio"], + htmlEquiv: null, + roleType: "widget", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "menubar": { + container: null, + props: ["aria-activedescendant", "aria-orientation"], + reqProps: null, + reqChildren: ["group", "menuitem", "menuitemcheckbox", "menuitemradio"], + htmlEquiv: null, + roleType: "widget", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "menuitem": { + container: ["group", "menu", "menubar"], + props: ["aria-expanded", "aria-posinset", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + "menuitemcheckbox": { + container: ["group", "menu", "menubar"], + props: ["aria-expanded", "aria-posinset", "aria-setsize"], + reqProps: ["aria-checked"], + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + "menuitemradio": { + container: ["group", "menu", "menubar"], + props: ["aria-expanded", "aria-posinset", "aria-setsize"], + reqProps: ["aria-checked"], + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + "meter": { + container: null, + props: ["aria-valuemax", "aria-valuemin", "aria-valuetext"], + reqProps: ["aria-valuenow"], + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: true, + nameFrom: ["author"], + presentationalChildren: true, + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "navigation": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "none": { + container: null, + props: [], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "note": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "option": { + container: ["group", "listbox"], + props: ["aria-selected", "aria-checked", "aria-posinset", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: "option", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "paragraph": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "presentation": { + container: null, + props: [], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "progressbar": { + container: null, + props: ["aria-valuemax", "aria-valuemin", "aria-valuenow", "aria-valuetext"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + presentationalChildren: true, + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "radio": { + container: null, + props: ["aria-posinset", "aria-setsize"], + reqProps: ["aria-checked"], + reqChildren: null, + htmlEquiv: "input[@type='radio']", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "radiogroup": { + container: null, + props: ["aria-activedescendant", "aria-orientation", "aria-readonly", "aria-required"], + reqProps: null, + reqChildren: ["radio"], + htmlEquiv: null, + roleType: "widget", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-haspopup'] + }, + "region": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "row": { + container: ["grid", "rowgroup", "table", "treegrid"], + props: ["aria-activedescendant", "aria-colindex", "aria-expanded", "aria-level", "aria-posinset", "aria-rowindex", "aria-selected", "aria-setsize"], + reqProps: null, + reqChildren: ["cell", "columnheader", "gridcell", "rowheader"], + htmlEquiv: "tr", + roleType: "structure", + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "rowgroup": { + container: ["grid", "table", "treegrid"], + props: [], + reqProps: null, + reqChildren: ["row"], + htmlEquiv: "tbody | tfoot | thead", + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "rowheader": { + container: ["row"], + props: ["aria-colindex", "aria-colspan", "aria-expanded", "aria-readonly", "aria-required", "aria-rowindex", "aria-rowspan", "aria-selected", "aria-sort"], + reqProps: null, + reqChildren: null, + htmlEquiv: "th[@scope='row']", + roleType: "structure", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + "scrollbar": { + container: null, + props: ["aria-orientation", "aria-valuemax", "aria-valuemin", "aria-valuetext"], + reqProps: ["aria-controls", "aria-valuenow"], + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: false, + nameFrom: ["author"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "search": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "searchbox": { + container: null, + props: ["aria-activedescendant", "aria-autocomplete", "aria-multiline", "aria-placeholder", "aria-readonly", "aria-required"], + reqProps: null, + reqChildren: null, + htmlEquiv: "input[@type='search']", + roleType: "widget", + nameRequired: true, + nameFrom: ["author"] + }, + "separator": { + container: null, + props: ["aria-orientation"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "slider": { + container: null, + props: ["aria-orientation", "aria-readonly", "aria-valuemax", "aria-valuemin", "aria-valuetext"], + reqProps: ["aria-valuenow"], + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + presentationalChildren: true + }, + "spinbutton": { + container: null, + props: ["aria-activedescendant", "aria-readonly", "aria-required", "aria-valuemax", "aria-valuemin", "aria-valuenow", "aria-valuetext"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-haspopup'] + }, + "status": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "liveRegion", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "strong": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "subscript": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "suggestion": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "superscript": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "switch": { + container: null, + props: ["aria-expanded", "aria-readonly", "aria-required"], + reqProps: ["aria-checked"], + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-haspopup'] + }, + "tab": { + container: ["tablist"], + props: ["aria-expanded", "aria-posinset", "aria-selected", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + "table": { + container: null, + props: ["aria-colcount", "aria-rowcount"], + reqProps: null, + reqChildren: ["row", "rowgroup", "caption"], + htmlEquiv: "table", + roleType: "structure", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "tablist": { + container: null, + props: ["aria-activedescendant", "aria-multiselectable", "aria-orientation"], + reqProps: null, + reqChildren: ["tab"], + htmlEquiv: null, + roleType: "widget", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "tabpanel": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "term": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "dfn", + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "textbox": { + container: null, + props: ["aria-activedescendant", "aria-autocomplete", "aria-multiline", "aria-placeholder", "aria-readonly", "aria-required"], + reqProps: null, + reqChildren: null, + htmlEquiv: "input[@type='text']", + roleType: "widget", + nameRequired: true, + nameFrom: ["author"] + }, + "time": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "timer": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "liveRegion", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "toolbar": { + container: null, + props: ["aria-activedescendant", "aria-orientation"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "tooltip": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "tree": { + container: null, + props: ["aria-activedescendant", "aria-multiselectable", "aria-orientation", "aria-required"], + reqProps: null, + reqChildren: ["group", "treeitem"], + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-haspopup'] + }, + "treegrid": { + container: null, + props: ["aria-activedescendant", "aria-colcount", "aria-multiselectable", "aria-orientation", "aria-readonly", "aria-required", "aria-rowcount"], + reqProps: null, + reqChildren: ["row", "rowgroup"], + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-haspopup'] + }, + "treeitem": { + container: ["group", "tree"], + props: ["aria-checked", "aria-expanded", "aria-level", "aria-posinset", "aria-selected", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + }; // end designPatterns + // copied from https://html.spec.whatwg.org/multipage/semantics-other.html#disabled-elements + // https://html.spec.whatwg.org/multipage/input.html#input-type-attr-summary + // https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/disabled + /** note: + * if a <fieldset> is disabled, the descendant form controls are all disabled except <legend> + * If an <optgroup> is disabled, the select is still interactive (unless otherwise disabled), but none of the items in the option group are selectable. + * When an element has the disabled attribute applied, the :disabled pseudo-class also applies to it. + */ + ARIADefinitions.elementsAllowedDisabled = ["button", "input", "select", "textarea", "optgroup", "option", "fieldset"]; // also form-associated custom element + ARIADefinitions.elementsAllowedRequired = ["select", "textarea"]; // remove 'input' and add to the individual element, becuase required is not supported on input@type="range", "color", "hidden" or any button types + ARIADefinitions.elementsAllowedReadOnly = ["textarea"]; // remove 'input' and add to the individual element, because readonly is not supported on input@type="checkbox", "radio", "range", "color", "file", hidden" or any button types + /* https://www.w3.org/TR/html-aria/#docconformance + * documentConformanceRequirement contains properties of the tags related to role without any additional attribute value + * documentConformanceRequirementSpecialTags contains those tags that require special considerations + */ + ARIADefinitions.documentConformanceRequirement = { + "abbr": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "address": { + implicitRole: ["group"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "article": { + implicitRole: ["article"], + validRoles: ["application", "document", "feed", "main", "none", "presentation", "region"], + globalAriaAttributesValid: true + }, + "aside": { + implicitRole: ["complementary"], + validRoles: ["doc-dedication", "doc-example", "doc-footnote", "doc-glossary", "doc-pullquote", "doc-tip", "feed", "none", "note", "presentation", "region", "search"], + globalAriaAttributesValid: true + }, + "audio": { + implicitRole: null, + validRoles: ["application"], + globalAriaAttributesValid: true + }, + "b": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "base": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "bdi": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "bdo": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "blockquote": { + implicitRole: ["blockquote"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "body": { + implicitRole: ["generic"], + validRoles: null, + otherDisallowedAriaAttributes: ['aria-hidden'], + globalAriaAttributesValid: true + }, + "br": { + implicitRole: null, + validRoles: ["none", "presentation"], + globalAriaAttributesValid: false, + otherAllowedAriaAttributes: ["aria-hidden"] + }, + "button": { + implicitRole: ["button"], + validRoles: ["checkbox", "combobox", "gridcell", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "separator", "slider", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true + }, + "canvas": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "caption": { + implicitRole: ['caption'], + validRoles: null, + globalAriaAttributesValid: true, + allowAttributesFromImplicitRole: false + }, + "cite": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "code": { + implicitRole: ["code"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "col": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "colgroup": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "data": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "datalist": { + implicitRole: ["listbox"], + validRoles: null, + globalAriaAttributesValid: false, + allowAttributesFromImplicitRole: false + }, + "dd": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true + }, + "del": { + implicitRole: ["deletion"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "details": { + implicitRole: ["group"], + validRoles: null, + globalAriaAttributesValid: true + }, + "dfn": { + implicitRole: ["term"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "dialog": { + implicitRole: ["dialog"], + validRoles: ["alertdialog"], + globalAriaAttributesValid: true + }, + "dl": { + implicitRole: null, + validRoles: ["group", "list", "none", "presentation"], + globalAriaAttributesValid: true + }, + "dt": { + implicitRole: ["term"], + validRoles: ["listitem"], + globalAriaAttributesValid: true + }, + "em": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "embed": { + implicitRole: null, + validRoles: ["application", "document", "img", "none", "presentation"], + globalAriaAttributesValid: true + }, + "fieldset": { + implicitRole: ["group"], + validRoles: ["none", "presentation", "radiogroup"], + globalAriaAttributesValid: true + }, + "figcaption": { + implicitRole: null, + validRoles: ["group", "none", "presentation"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "form": { + implicitRole: ["form"], + validRoles: ["none", "presentation", "search"], + globalAriaAttributesValid: true + }, + "head": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "hgroup": { + implicitRole: ["group"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "h1": { + implicitRole: ["heading"], + validRoles: ["doc-subtitle", "none", "presentation", "tab"], + globalAriaAttributesValid: true + }, + "h2": { + implicitRole: ["heading"], + validRoles: ["doc-subtitle", "none", "presentation", "tab"], + globalAriaAttributesValid: true + }, + "h3": { + implicitRole: ["heading"], + validRoles: ["doc-subtitle", "none", "presentation", "tab"], + globalAriaAttributesValid: true + }, + "h4": { + implicitRole: ["heading"], + validRoles: ["doc-subtitle", "none", "presentation", "tab"], + globalAriaAttributesValid: true + }, + "h5": { + implicitRole: ["heading"], + validRoles: ["doc-subtitle", "none", "presentation", "tab"], + globalAriaAttributesValid: true + }, + "h6": { + implicitRole: ["heading"], + validRoles: ["doc-subtitle", "none", "presentation", "tab"], + globalAriaAttributesValid: true + }, + "hr": { + implicitRole: ["separator"], + validRoles: ["doc-pagebreak", "none", "presentation"], + globalAriaAttributesValid: true + }, + "html": { + implicitRole: ["document"], + validRoles: null, + globalAriaAttributesValid: false, + allowAttributesFromImplicitRole: false + }, + "i": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "iframe": { + implicitRole: null, + validRoles: ["application", "document", "img", "none", "presentation"], + globalAriaAttributesValid: true + }, + "ins": { + implicitRole: ["insertion"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "kbd": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "label": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "legend": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "link": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "main": { + implicitRole: ["main"], + validRoles: null, + globalAriaAttributesValid: true + }, + "map": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "mark": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "math": { + implicitRole: ["math"], + validRoles: null, + globalAriaAttributesValid: true + }, + "menu": { + implicitRole: ["list"], + validRoles: ["group", "listbox", "menu", "menubar", "none", "presentation", "radiogroup", "tablist", "toolbar", "tree"], + globalAriaAttributesValid: true + }, + "meta": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "meter": { + implicitRole: ["meter"], + validRoles: null, + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ['aria-valuemax', 'aria-valuemin'], + allowAttributesFromImplicitRole: false + }, + "nav": { + implicitRole: ["navigation"], + validRoles: ["doc-index", "doc-pagelist", "doc-toc", "menu", "menubar", "tablist", "none", "presentation"], + globalAriaAttributesValid: true + }, + "noscript": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "object": { + implicitRole: null, + validRoles: ["application", "document", "img"], + globalAriaAttributesValid: true + }, + "ol": { + implicitRole: ["list"], + validRoles: ["group", "listbox", "menu", "menubar", "none", "presentation", "radiogroup", "tablist", "toolbar", "tree"], + globalAriaAttributesValid: true + }, + "optgroup": { + implicitRole: ["group"], + validRoles: null, + globalAriaAttributesValid: true + }, + "option": { + implicitRole: ["option"], + validRoles: null, + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-selected"] + }, + "output": { + implicitRole: ["status"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "p": { + implicitRole: ["paragraph"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "param": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "picture": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false, + otherAllowedAriaAttributes: ["aria-hidden"] + }, + "pre": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "progress": { + implicitRole: ["progressbar"], + validRoles: null, + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-valuemax"] + }, + "q": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "rp": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "rt": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "ruby": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "s": { + implicitRole: ["deletion"], + validRoles: ["any"], + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-label", "aria-labelledby"] + }, + "samp": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "script": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "search": { + implicitRole: ['search'], + validRoles: ['search', 'form', 'group', 'none', 'presentation', 'region'], + globalAriaAttributesValid: true + }, + "slot": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "small": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "source": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "span": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "strong": { + implicitRole: ["strong"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "style": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "sub": { + implicitRole: ["subscript"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "sup": { + implicitRole: ["superscript"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "svg": { + implicitRole: ["graphics-document"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "table": { + implicitRole: ["table"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "template": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "textarea": { + implicitRole: ["textbox"], + validRoles: null, + globalAriaAttributesValid: true + }, + "tfoot": { + implicitRole: ["rowgroup"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "thead": { + implicitRole: ["rowgroup"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "time": { + implicitRole: ["time"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "title": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "track": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "u": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "ul": { + implicitRole: ["list"], + validRoles: ["group", "listbox", "menu", "menubar", "none", "presentation", "radiogroup", "tablist", "toolbar", "tree"], + globalAriaAttributesValid: true + }, + "var": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "video": { + implicitRole: null, + validRoles: ["application"], + globalAriaAttributesValid: true + }, + "wbr": { + implicitRole: null, + validRoles: ["none", "presentation"], + globalAriaAttributesValid: false, + otherAllowedAriaAttributes: ["aria-hidden"] + } + }; // end documentConformanceRequirement + ARIADefinitions.documentConformanceRequirementSpecialTags = { + "a": { + "with-href": { + implicitRole: ["link"], + //roleCondition: " when non-empty href attribute is present", + validRoles: ["button", "checkbox", "doc-backlink", "doc-biblioref", "doc-glossref", "doc-noteref", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-disabled=true"] + }, + "without-href": { + implicitRole: ["generic"], + //roleCondition: " when href attribute is not present", + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "area": { + "with-href": { + implicitRole: ["link"], + //roleCondition: " when non-empty href attribute is present", + validRoles: null, + globalAriaAttributesValid: true + }, + "without-href": { + implicitRole: ["generic"], + //roleCondition: " when href attribute is not present", + validRoles: ["button", "link"], + globalAriaAttributesValid: true + } + }, + // TODO + // "autonomous custom element": { + // implicitRole: ["Role exposed from author defined ElementInternals. Otherwise no corresponding role."], + // validRoles: ["If role defined by ElementInternals", "any role", "no role Otherwise"], + // globalAriaAttributesValid: true + // }, + "div": { + "child-dl": { + implicitRole: ["generic"], + validRoles: ["presentation", "none"], + globalAriaAttributesValid: true + }, + "no-child-dl": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "figure": { + "child-figcaption": { + implicitRole: ["figure"], + validRoles: ['doc-example'], + globalAriaAttributesValid: true + }, + "no-child-figcaption": { + implicitRole: ["figure"], + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "footer": { + "des-section-article-aside-main-nav": { + implicitRole: ["generic"], + //roleCondition: " when descendant of an article, aside, main, nav or section element", + validRoles: ["doc-footnote", "group", "none", "presentation"], + globalAriaAttributesValid: true + }, + "other": { + implicitRole: ["contentinfo"], + //roleCondition: " when not a descendant of an article, aside, main, nav or section element", + validRoles: ["doc-footnote", "group", "none", "presentation"], + globalAriaAttributesValid: true + } + }, + // TODO + // "form-associated custom element": { + // implicitRole: ["Role exposed from author defined ElementInternals. Otherwise 'generic'."], + // validRoles: ["If role defined by ElementInternals", "form-related roles: button", "checkbox", "combobox", "group", "listbox", "progressbar", "radio", "radiogroup", "searchbox", "slider", "spinbutton", "switch", "textbox", "no role Otherwise"], + // globalAriaAttributesValid: true + // }, + "header": { + "des-section-article-aside-main-nav": { + implicitRole: ["generic"], + //roleCondition: " when descendant of an article, aside, main, nav or section element", + validRoles: ["group", "none", "presentation"], + globalAriaAttributesValid: true + }, + "other": { + implicitRole: ["banner"], + //roleCondition: " when not a descendant of an article, aside, main, nav or section element", + validRoles: ["group", "none", "presentation"], + globalAriaAttributesValid: true + } + }, + "img": { + "img-with-accname": { + implicitRole: ["img"], + //roleCondition: "when accessible name presents", + validRoles: ["button", "checkbox", "doc-cover", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "meter", "option", "progressbar", "radio", "scrollbar", "separator", "slider", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true + }, + "img-without-accname-empty-alt": { + implicitRole: ["presentation", "none"], + //roleCondition: "when no accessible name presents and alt=''", + validRoles: null, + globalAriaAttributesValid: false, + otherAllowedAriaAttributes: ["aria-hidden=true"] + }, + "img-without-accname-no-alt": { + implicitRole: ["img"], + //roleCondition: "when neither accessible name no alt presents", + validRoles: ["presentation", "none"], + globalAriaAttributesValid: false, + otherAllowedAriaAttributes: ["aria-hidden=true"] + } + }, + "input": { + "button": { + implicitRole: ["button"], + validRoles: ["checkbox", "combobox", "gridcell", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "slider", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true + }, + "checkbox-with-aria-pressed": { + implicitRole: ["checkbox"], + //roleCondition: " with type=checkbox and aria-pressed attribute is present", + validRoles: ["menuitemcheckbox", "option", "switch", "button"], + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-required"], + otherDisallowedAriaAttributes: ["aria-checked"] + }, + "checkbox-without-aria-pressed": { + implicitRole: ["checkbox"], + //roleCondition: " with type=checkbox and aria-pressed attribute is not present", + validRoles: ["menuitemcheckbox", "option", "switch"], + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-required"], + otherDisallowedAriaAttributes: ["aria-checked"] + }, + "color": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true + }, + "date": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-required", "aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "datetime-local": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-required", "aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "email-no-list": { + implicitRole: ["textbox"], + //roleCondition: " with type=email and no list attribute is present", + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "email-with-list": { + implicitRole: ["combobox"], + validRoles: null, + globalAriaAttributesValid: true + }, + "file": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-required"], + }, + "hidden": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "image": { + implicitRole: ["button"], + validRoles: ["checkbox", "gridcell", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "slider", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true + }, + "month": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "number": { + implicitRole: ["spinbutton"], + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"], + }, + "password": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "radio": { + implicitRole: ["radio"], + validRoles: ["menuitemradio"], + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-required"], + otherDisallowedAriaAttributes: ["aria-checked"] + }, + "range": { + implicitRole: ["slider"], + validRoles: null, + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-valuemax", "aria-valuemin"] + }, + "reset": { + implicitRole: ["button"], + validRoles: ["checkbox", "combobox", "gridcell", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "slider", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true + }, + "search-no-list": { + implicitRole: ["searchbox"], + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"] + }, + "search-with-list": { + implicitRole: ["combobox"], + validRoles: null, + globalAriaAttributesValid: true + }, + "submit": { + implicitRole: ["button"], + validRoles: ["checkbox", "combobox", "gridcell", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "slider", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true + }, + "tel-no-list": { + implicitRole: ["textbox"], + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"] + }, + "tel-with-list": { + implicitRole: ["combobox"], + validRoles: null, + globalAriaAttributesValid: true + }, + "text-no-list": { + implicitRole: ["textbox"], + validRoles: ["combobox", "searchbox", "spinbutton"], + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"] + }, + "text-with-list": { + implicitRole: ["combobox"], + validRoles: null, + globalAriaAttributesValid: true + // otherDisallowedAriaAttributes: ["aria-haspopup"] // covered in a different rule + }, + "time": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "url-no-list": { + implicitRole: ["textbox"], + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"] + }, + "url-with-list": { + implicitRole: ["combobox"], + validRoles: null, + globalAriaAttributesValid: true + }, + "week": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "default-with-list": { + // input with a missing or invalid type, with a list attribute + implicitRole: ["combobox"], + validRoles: null, + globalAriaAttributesValid: true + }, + "default-no-list": { + // input with a missing or invalid type, with a list attribute + implicitRole: ["textbox"], + validRoles: null, + globalAriaAttributesValid: true + } + }, + "li": { + "child-of-list-role": { + implicitRole: ['listitem'], + validRoles: null, + globalAriaAttributesValid: true + }, + "no-child-of-list-role": { + implicitRole: ['generic'], + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "section": { + "with-name": { + implicitRole: ["region"], + validRoles: ["alert", "alertdialog", "application", "banner", "complementary", "contentinfo", "dialog", "doc-abstract", "doc-acknowledgments", "doc-afterword", "doc-appendix", "doc-bibliography", "doc-chapter", "doc-colophon", "doc-conclusion", "doc-credit", "doc-credits", "doc-dedication", "doc-endnotes", "doc-epigraph", "doc-epilogue", "doc-errata", "doc-example", "doc-foreword", "doc-glossary", "doc-index", "doc-introduction", "doc-notice", "doc-pagelist", "doc-part", "doc-preface", "doc-prologue", "doc-pullquote", "doc-qna", "doc-toc", "document", "feed", "group", "log", "main", "marquee", "navigation", "none", "note", "presentation", "search", "status", "tabpanel"], + globalAriaAttributesValid: true + }, + "without-name": { + implicitRole: null, + validRoles: ["alert", "alertdialog", "application", "banner", "complementary", "contentinfo", "dialog", "doc-abstract", "doc-acknowledgments", "doc-afterword", "doc-appendix", "doc-bibliography", "doc-chapter", "doc-colophon", "doc-conclusion", "doc-credit", "doc-credits", "doc-dedication", "doc-endnotes", "doc-epigraph", "doc-epilogue", "doc-errata", "doc-example", "doc-foreword", "doc-glossary", "doc-index", "doc-introduction", "doc-notice", "doc-pagelist", "doc-part", "doc-preface", "doc-prologue", "doc-pullquote", "doc-qna", "doc-toc", "document", "feed", "group", "log", "main", "marquee", "navigation", "none", "note", "presentation", "search", "status", "tabpanel"], + globalAriaAttributesValid: true + } + }, + "select": { + "no-multiple-attr-size-gt1": { + //roleCondition: " with a multiple attribute or a size attribute having value greater than 1" + implicitRole: ["combobox"], + validRoles: ["menu"], + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-multiselectable"] + }, + "multiple-attr-size-gt1": { + //roleCondition: " with no multiple attribute and no size attribute having value greater than 1" + implicitRole: ["listbox"], + validRoles: null, + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-multiselectable"] + } + }, + "summary": { + "first-summary-of-detail": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-disabled", "aria-haspopup"] + }, + "no-first-summary-of-detail": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "tbody": { + "des-table": { + implicitRole: ["rowgroup"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "des-grid": { + implicitRole: ["rowgroup"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "des-treegrid": { + implicitRole: ["rowgroup"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "des-other": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "td": { + "des-table": { + implicitRole: ["cell"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-grid": { + implicitRole: ["gridcell"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-treegrid": { + implicitRole: ["gridcell"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-other": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "th": { + "des-table-row-scope": { + implicitRole: ["rowheader", "cell"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-table-column-scope": { + implicitRole: ["columnheader", "cell"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-grid-treegrid-row-scope": { + implicitRole: ["rowheader", "gridcell"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-grid-treegrid-column-scope": { + implicitRole: ["columnheader", "gridcell"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-other": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "tr": { + "des-table": { + implicitRole: ["row"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-grid": { + implicitRole: ["row"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-treegrid": { + implicitRole: ["row"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-other": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "default": { + implicitRole: null, + //roleCondition: "", + validRoles: ["any"], + globalAriaAttributesValid: true + } + }; // end of documentConformanceRequirementSpecialTags + // map aria attribute to the corresponding native attribute, apply to any element applicable + // note this mapping is for the related attributes in the same element without checking the parent tree. + // refer to https://w3c.github.io/html-aria/ + ARIADefinitions.relatedAriaHtmlAttributes = { + "aria-checked": { + conflict: [{ + ariaAttributeValue: "false", + htmlAttributeNames: ["checked"], + htmlAttributeValues: null + }], + overlapping: [{ + ariaAttributeValue: "true", + htmlAttributeNames: ["checked"], + htmlAttributeValues: null + }] + }, + "aria-disabled": { + conflict: [{ + ariaAttributeValue: "false", + htmlAttributeNames: ["disabled"], + htmlAttributeValues: null + }], + overlapping: [{ + ariaAttributeValue: "true", + htmlAttributeNames: ["disabled"], + htmlAttributeValues: null + }] + }, + "aria-hidden": { + conflict: [{ + ariaAttributeValue: "false", + htmlAttributeNames: ["hidden"], + htmlAttributeValues: ["hidden,null"] + }, + { + ariaAttributeValue: "true", + htmlAttributeNames: ["hidden"], + htmlAttributeValues: ["until-found"] + }], + overlapping: [{ + ariaAttributeValue: "true", + htmlAttributeNames: ["hidden"], + htmlAttributeValues: ["hidden,null"] + }] + }, + "aria-placeholder": { + conflict: [{ + ariaAttributeValue: null, + htmlAttributeNames: ["placeholder"], + htmlAttributeValues: null + }] + }, + "aria-valuemax": { + conflict: [{ + ariaAttributeValue: null, + htmlAttributeNames: ["max"], + htmlAttributeValues: null + }] + //overlap case covered in the role definition: Authors SHOULD NOT use aria-valuemax on any element which allows the max attribute. Use the max attribute instead. + }, + "aria-valuemin": { + conflict: [{ + ariaAttributeValue: null, + htmlAttributeNames: ["min"], + htmlAttributeValues: null + }] + ////overlap case covered in the role definition:Authors SHOULD NOT use aria-valuemin on any element which allows the min attribute. Use the min attribute instead. + }, + "aria-readonly": { + conflict: [{ + ariaAttributeValue: "false", + htmlAttributeNames: ["readonly", "contenteditable", "iscontenteditable"], + htmlAttributeValues: [null, "false", "false"] + }], + overlapping: [{ + ariaAttributeValue: "true", + htmlAttributeNames: ["readonly", "contenteditable", "iscontenteditable"], + htmlAttributeValues: [null, "true", "true"] + }] + }, + "aria-required": { + conflict: [{ + ariaAttributeValue: "false", + htmlAttributeNames: ["required"], + htmlAttributeValues: null + }], + overlapping: [{ + ariaAttributeValue: "true", + htmlAttributeNames: ["required"], + htmlAttributeValues: null + }] + }, + "aria-colspan": { + conflict: [{ + // conflict occurs if both values are different + ariaAttributeValue: "VALUE", + htmlAttributeNames: ["colspan"], + htmlAttributeValues: ["VALUE"] + }], + overlapping: [{ + // overlap occurs if both exists + ariaAttributeValue: null, + htmlAttributeNames: ["colspan"], + htmlAttributeValues: null + }] + }, + "aria-rowspan": { + conflict: [{ + // conflict occurs if both values are different + ariaAttributeValue: "VALUE", + htmlAttributeNames: ["rowspan"], + htmlAttributeValues: ["VALUE"] + }], + overlapping: [{ + // overlap occurs if both exists + ariaAttributeValue: null, + htmlAttributeNames: ["rowspan"], + htmlAttributeValues: null + }] + }, + /** "aria-autocomplete": { + conflict: [{ + // conflict occurs if both exists, aria value is only for custom widget, rather than native + ariaAttributeValue: null, + htmlAttributeNames: ["autocomplete"], + htmlAttributeValues: null + }] + } */ + }; + ARIADefinitions.containers = []; + return ARIADefinitions; +}()); +exports.ARIADefinitions = ARIADefinitions; +; +var containerArray = []; +for (var roleDesign in ARIADefinitions.designPatterns) { + var containers = ARIADefinitions.designPatterns[roleDesign].container; + if (containers !== null) { + for (var _i = 0, containers_1 = containers; _i < containers_1.length; _i++) { + var container = containers_1[_i]; + if (containerArray.indexOf(container) == -1) { + containerArray.push(container); + } + } + } +} +ARIADefinitions.containers = containerArray; + + +/***/ }, + +/***/ 9955 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ARIAMapper = void 0; +var ARIADefinitions_1 = __webpack_require__(9910); +var CommonMapper_1 = __webpack_require__(3103); +var DOMUtil_1 = __webpack_require__(1686); +var CommonUtil_1 = __webpack_require__(7139); +var AriaUtil_1 = __webpack_require__(7011); +var fragment_1 = __webpack_require__(5279); +var ARIAWalker_1 = __webpack_require__(1560); +var CacheUtil_1 = __webpack_require__(4566); +var DOMWalker_1 = __webpack_require__(3864); +var AccNameUtil_1 = __webpack_require__(1950); +var ARIAMapper = /** @class */ (function (_super) { + __extends(ARIAMapper, _super); + function ARIAMapper() { + return _super !== null && _super.apply(this, arguments) || this; + } + ARIAMapper.prototype.childrenCanHaveRole = function (node, role) { + // if (node.nodeType === 1 /* Node.ELEMENT_NODE */) { + // const elem = node as Element; + // if (elem.getAttribute("aria-hidden") === "true") { + // return false; + // } + // } + return !(role in ARIADefinitions_1.ARIADefinitions.designPatterns && ARIADefinitions_1.ARIADefinitions.designPatterns[role].presentationalChildren); + }; + ARIAMapper.prototype.getRole = function (node) { + var role = ARIAMapper.nodeToRole(node); + return role; + }; + ARIAMapper.prototype.getNamespace = function () { + return "aria"; + }; + ARIAMapper.prototype.getAttributes = function (node) { + var retVal = {}; + if (node.nodeType === 1 /* Node.ELEMENT_NODE */) { + var cacheVal = CacheUtil_1.CacheUtil.getCache(node, "ARIAMapper::getAttributes", undefined); + if (typeof cacheVal !== "undefined") + return cacheVal; + var elem = node; + for (var idx = 0; idx < elem.attributes.length; ++idx) { + var attrInfo = elem.attributes[idx]; + var name_1 = attrInfo.name.toLowerCase(); + if (name_1.startsWith("aria-")) { + retVal[name_1.substring(5)] = attrInfo.nodeValue; + } + } + // Optimize: Cache nodeName.toLowerCase() to avoid repeated calls + var nodeName = node.nodeName.toLowerCase(); + // Apply global attributes first + ARIAMapper.applyAttrRole(elem, "global", retVal); + // Apply element-specific attributes + ARIAMapper.applyAttrRole(elem, nodeName, retVal); + CacheUtil_1.CacheUtil.setCache(node, "ARIAMapper::getAttributes", retVal); + } + else if (node.nodeType === 3 /* Node.TEXT_NODE */) { + var calculators = ARIAMapper.textAttrValueCalculators; + for (var attr in calculators) { + var val = calculators[attr](node); + if (typeof val !== "undefined" && val !== null) { + retVal[attr] = val; + } + } + } + return retVal; + }; + // Optimize: Move applyAttrRole outside getAttributes to avoid function recreation + ARIAMapper.applyAttrRole = function (elem, nodeName, retVal) { + var calculators = ARIAMapper.elemAttrValueCalculators; + if (!(nodeName in calculators)) + return; + for (var attr in calculators[nodeName]) { + if (!(attr in retVal)) { + var value = calculators[nodeName][attr]; + if (typeof value !== "undefined" && value !== null) { + if (typeof value !== "string") { + value = value(elem); + } + retVal[attr] = value; + } + } + } + }; + ARIAMapper.getAriaOwnedBy = function (elem) { + var doc = fragment_1.FragmentUtil.getOwnerFragment(elem); + if (!CacheUtil_1.CacheUtil.getCache(doc, "ARIAMapper::precalcOwned", false)) { + var owners = doc.querySelectorAll("[aria-owns]"); + for (var iOwner = 0; iOwner < owners.length; ++iOwner) { + var owner = owners[iOwner]; + var ownIds = owner.getAttribute("aria-owns").split(/ +/g); + var _loop_1 = function (iId) { + var owned = doc.getElementById(ownIds[iId]); + //ignore if the aria-owns point to the element itself + //if (owned && !DOMUtil.sameNode(owner, owned)) { + // CacheUtil.setCache(owned, "aria-owned", owner); + //} + /** + * circular hierarchy check: + * (1) the owned element is neither the same element with the owner nor any ascendant of the owner + * (2) any child with aria-owns cannot point to the owner or any ascendant of the owner + */ + if (owned && !DOMUtil_1.DOMUtil.sameNode(owner, owned)) { + // check if the owned with aria-owns that points to another element + var ownedNodes = []; + var sub_owners = owned.querySelectorAll("[aria-owns]"); + for (var i = 0; i < sub_owners.length; ++i) { + var sub_owner = sub_owners[i]; + var sub_ownIds = sub_owner.getAttribute("aria-owns").split(/ +/g); + for (var j = 0; j < sub_ownIds.length; ++j) { + var ownedNode = doc.getElementById(sub_ownIds[j]); + if (ownedNode) + ownedNodes.push(ownedNode); + } + } + if (ownedNodes.length === 0) { + CacheUtil_1.CacheUtil.setCache(owned, "aria-owned", owner); + return "continue"; + } + // check if any aria-owns points to the element itself or any of it's parent + var parent_1 = owner; + var circular = false; + while (parent_1 !== null) { + var found = ownedNodes.some(function (item) { return DOMUtil_1.DOMUtil.sameNode(parent_1, item); }); + if (!found) + parent_1 = DOMWalker_1.DOMWalker.parentElement(parent_1); + else { + circular = true; + break; + } + } + if (!circular) + CacheUtil_1.CacheUtil.setCache(owned, "aria-owned", owner); + } + }; + for (var iId = 0; iId < ownIds.length; ++iId) { + _loop_1(iId); + } + } + CacheUtil_1.CacheUtil.setCache(doc, "ARIAMapper::precalcOwned", true); + } + return CacheUtil_1.CacheUtil.getCache(elem, "aria-owned", null); + }; + ARIAMapper.prototype.getNodeHierarchy = function (node) { + if (!node) + return []; + if (node.nodeType !== 1) { + var parentHierarchy = this.getNodeHierarchy(DOMWalker_1.DOMWalker.parentElement(node)); + var parentInfo = parentHierarchy.length > 0 ? parentHierarchy[parentHierarchy.length - 1] : { + role: "", + rolePath: "", + roleCount: {}, + childrenCanHaveRole: true + }; + var nodeHierarchy = []; + // Set hierarchy + for (var _i = 0, parentHierarchy_1 = parentHierarchy; _i < parentHierarchy_1.length; _i++) { + var item = parentHierarchy_1[_i]; + nodeHierarchy.push(item); + } + nodeHierarchy.push({ + attributes: {}, + bounds: this.getBounds(node), + namespace: this.getNamespace(), + node: node, + role: this.getRole(node) || null, + rolePath: parentInfo.rolePath + "/" + (this.getRole(node) || null), + roleCount: {}, + childrenCanHaveRole: parentInfo.childrenCanHaveRole + }); + return nodeHierarchy; + } + else { + var elem = node; + var nodeHierarchy = CacheUtil_1.CacheUtil.getCache(elem, "ARIAMapper::getNodeHierarchy", null); + if (!nodeHierarchy) { + // This element hasn't been processed yet - but ::reset processes them all in the right order + // Get details about the correct parent first + var parent_2 = ARIAMapper.getAriaOwnedBy(elem); + if (!parent_2) { + parent_2 = DOMWalker_1.DOMWalker.parentElement(elem); + } + while (parent_2 && parent_2.nodeType !== 1) { + parent_2 = DOMWalker_1.DOMWalker.parentElement(elem); + } + var parentHierarchy = parent_2 ? this.getNodeHierarchy(parent_2) : []; + var parentInfo = parentHierarchy.length > 0 ? parentHierarchy[parentHierarchy.length - 1] : { + role: "", + rolePath: "", + roleCount: {}, + childrenCanHaveRole: true + }; + while (parentInfo.role === null) { + parent_2 = ARIAMapper.getAriaOwnedBy(parent_2) || DOMWalker_1.DOMWalker.parentElement(parent_2); + parentHierarchy = parent_2 ? this.getNodeHierarchy(parent_2) : []; + parentInfo = parentHierarchy[parentHierarchy.length - 1]; + } + // Set initial node info + var nodeInfo = { + attributes: elem.nodeType === 1 ? this.getAttributes(elem) : {}, + bounds: this.getBounds(elem), + namespace: this.getNamespace(), + node: elem, + role: this.getRole(elem) || null, + rolePath: "", + roleCount: {}, + childrenCanHaveRole: true + }; + // Adjust role if we're within a presentational container + var presentationalContainer = !parentInfo.childrenCanHaveRole; + if (presentationalContainer) { + nodeInfo.role = null; + } + else { + nodeInfo.childrenCanHaveRole = parentInfo.childrenCanHaveRole + && this.childrenCanHaveRole(elem, nodeInfo.role); + } + // Set the paths + if (nodeInfo.role !== null) { + parentInfo.roleCount[nodeInfo.role] = (parentInfo.roleCount[nodeInfo.role] || 0) + 1; + nodeInfo.rolePath = parentInfo.rolePath + "/" + nodeInfo.role + "[" + parentInfo.roleCount[nodeInfo.role] + "]"; + } + else { + nodeInfo.rolePath = parentInfo.rolePath; + } + // Set hierarchy + nodeHierarchy = []; + for (var _a = 0, parentHierarchy_2 = parentHierarchy; _a < parentHierarchy_2.length; _a++) { + var item = parentHierarchy_2[_a]; + nodeHierarchy.push(item); + } + nodeHierarchy.push(nodeInfo); + CacheUtil_1.CacheUtil.setCache(elem, "ARIAMapper::getNodeHierarchy", nodeHierarchy); + } + return nodeHierarchy; + } + }; + ARIAMapper.prototype.reset = function (node) { + ARIAMapper.nameComputationId = 0; + this.hierarchyRole = []; + this.hierarchyResults = []; + this.hierarchyPath = [{ + rolePath: "", + roleCount: {} + }]; + // Get to the topmost node + var goodNode = node; + var next; + while (next = DOMWalker_1.DOMWalker.parentNode(goodNode)) { + goodNode = next; + } + ; + // Walk the tree and set the hierarchies in the right order + var ariaWalker = new ARIAWalker_1.ARIAWalker(goodNode, false, goodNode); + do { + if (ariaWalker.node.nodeType === 1) { + this.getNodeHierarchy(ariaWalker.node); + } + } while (ariaWalker.nextNode()); + }; + ARIAMapper.prototype.openScope = function (node) { + if (this.hierarchyRole === null) { + this.reset(node); + } + this.pushHierarchy(node); + for (var idx = 0; idx < this.hierarchyResults.length; ++idx) { + if (this.hierarchyResults[idx].role && this.hierarchyResults[idx].role[0] === "/") { + this.hierarchyResults[idx].role = (this.hierarchyResults[idx].role ? this.hierarchyResults[idx].role.substring(1) : null); + } + } + return this.hierarchyResults; + }; + ARIAMapper.prototype.pushHierarchy = function (node) { + // If we're not an element, no special handling + var nodeHierarchy = []; + // Determine our node info + nodeHierarchy = this.getNodeHierarchy(node); + var nodeInfo = nodeHierarchy[nodeHierarchy.length - 1]; + this.hierarchyRole.push(nodeInfo.role); + if (nodeInfo.role !== null) { + this.hierarchyPath.push(nodeInfo); + } + this.hierarchyResults = nodeHierarchy; + }; + ARIAMapper.prototype.closeScope = function (node) { + var retVal = []; + for (var _i = 0, _a = this.hierarchyResults; _i < _a.length; _i++) { + var res = _a[_i]; + // const temp = res.node; + // res.node = null; + // let cloned = JSON.parse(JSON.stringify(res)); + // cloned.node = res.node = temp; + // retVal.push(cloned); + retVal.push(res); + } + if (retVal.length > 0) { + retVal[retVal.length - 1].role = "/" + retVal[retVal.length - 1].role; + var parent_3 = DOMWalker_1.DOMWalker.parentElement(node); + this.hierarchyResults = parent_3 ? CacheUtil_1.CacheUtil.getCache(parent_3, "ARIAMapper::getNodeInfo", []) : []; + } + return retVal; + }; + /**public static computeName(cur: Node) : string { + ++ARIAMapper.nameComputationId; + return ARIAMapper.computeNameHelp(ARIAMapper.nameComputationId, cur, false, false); + } + + public static computeNameHelp(walkId: number, cur: Node, labelledbyTraverse: boolean, walkTraverse: boolean) : string { + // 2g. None of the other content applies to text nodes, so just do this first + if (cur.nodeType === 3 ) return cur.nodeValue; + if (cur.nodeType === 11) return ""; + if (cur.nodeType !== 1 ) { + if (walkTraverse || labelledbyTraverse) return ""; + throw new Error ("Can only compute name on Element and Text " + cur.nodeType); + } + + const elem = cur as Element; + // We've been here before - prevent recursion + if (CacheUtil.getCache(elem, "data-namewalk", null) === ""+walkId) return ""; + CacheUtil.setCache(elem, "data-namewalk", ""+walkId); + // See https://www.w3.org/TR/html-aam-1.0/#input-type-text-input-type-password-input-type-search-input-type-tel-input-type-url-and-textarea-element + + // 2a. Only show hidden content if it's referenced by a labelledby + if (!labelledbyTraverse && !VisUtil.isNodeVisible(cur)) { + return ""; + } + + // 2b. collect valid id references + if (!labelledbyTraverse && elem.hasAttribute("aria-labelledby")) { + let labelledby = elem.getAttribute("aria-labelledby").split(" "); + let validElems = []; + for (const ref of labelledby) { + const refElem = FragmentUtil.getById(cur, ref); + if (refElem && !DOMUtil.sameNode(elem, refElem)) { + validElems.push(refElem); + } + } + if (validElems.length > 0) { + let accumulated = ""; + for (const elem of validElems) { + accumulated += " " + this.computeNameHelp(walkId, elem, true, false); + } + return accumulated.trim(); + } + } + + // Since nodeToRole calls back here for form and section, we need special casing here to handle those two cases + if (["section", "form"].includes(cur.nodeName.toLowerCase())) { + if (elem.hasAttribute("aria-label") && elem.getAttribute("aria-label").trim().length > 0) { + // If I'm not an embedded control or I'm not recursing, return the aria-label + if (!labelledbyTraverse && !walkTraverse) { + return elem.getAttribute("aria-label").trim(); + } + } + if (elem.hasAttribute("title")) { + return elem.getAttribute("title"); + } + return ""; + } + + // 2c. If label or walk, and this is a control, skip to the value, otherwise provide the label + const role = ARIAMapper.nodeToRole(cur); + let isEmbeddedControl = [ + "textbox", "button", "combobox", "listbox", + "progressbar", "scrollbar", "slider", "spinbutton" + ].includes(role); + if (elem.hasAttribute("aria-label") && elem.getAttribute("aria-label").trim().length > 0) { + // If I'm not an embedded control or I'm not recursing, return the aria-label + if (!labelledbyTraverse && !walkTraverse || !isEmbeddedControl) { + return elem.getAttribute("aria-label").trim(); + } + } + + // 2d. + if (role !== "presentation" && role !== "none") { + if ((cur.nodeName.toLowerCase() === "img" || cur.nodeName.toLowerCase() === "area") && elem.hasAttribute("alt")) { + return DOMUtil.cleanWhitespace(elem.getAttribute("alt")).trim(); + } + + if (cur.nodeName.toLowerCase() === "input" && elem.hasAttribute("id") && elem.getAttribute("id").length > 0) { + let label = elem.ownerDocument.querySelector("label[for='"+elem.getAttribute("id")+"']"); + if (label) { + if (label.hasAttribute("aria-label") || (label.hasAttribute("aria-labelledby") && !CommonUtil.isIdReferToSelf(cur, label.getAttribute("aria-labelledby")))) { + return this.computeNameHelp(walkId, label, false, false); + } else { + return label.textContent; + } + } + } + if (cur.nodeName.toLowerCase() === "fieldset") { + if( (<Element>cur).querySelector("legend")){ + let legend = (<Element>cur).querySelector("legend"); + return legend.innerText; + }else{ + return this.computeNameHelp(walkId, cur, false, false); + } + + } + + } + + // 2e. + if ((walkTraverse || labelledbyTraverse) && isEmbeddedControl) { + // If the embedded control has role textbox, return its value. + if (role === "textbox") { + if (elem.nodeName.toLowerCase() === "input") { + if (elem.hasAttribute("value")) return elem.getAttribute("value"); + } else { + walkTraverse = false; + } + } + + // If the embedded control has role button, return the text alternative of the button. + if (role === "button") { + if (elem.nodeName.toLowerCase() === "input") { + let type = elem.getAttribute("type").toLowerCase(); + if (["button", "submit", "reset"].includes(type)) { + if (elem.hasAttribute("value")) return elem.getAttribute("value"); + if (type === "submit") return "Submit"; + if (type === "reset") return "Reset"; + } + } else { + walkTraverse = false; + } + } + + // TODO: If the embedded control has role combobox or listbox, return the text alternative of the chosen option. + if (role === "combobox") { + if (elem.hasAttribute("aria-activedescendant")) { + let selected = FragmentUtil.getById(elem, "aria-activedescendant"); + if (selected && !DOMUtil.sameNode(elem, selected)) { + return ARIAMapper.computeNameHelp(walkId, selected, false, false); + } + } + } + + // If the embedded control has role range (e.g., a spinbutton or slider): + if (["progressbar", "scrollbar", "slider", "spinbutton"].includes(role)) { + // If the aria-valuetext property is present, return its value, + if (elem.hasAttribute("aria-valuetext")) return elem.getAttribute("aria-valuetext"); + // Otherwise, if the aria-valuenow property is present, return its value, + if (elem.hasAttribute("aria-valuenow")) return elem.getAttribute("aria-valuenow"); + // TODO: Otherwise, use the value as specified by a host language attribute. + } + } + + // 2f. 2h. + if (walkTraverse || ARIADefinitions.nameFromContent(role) || labelledbyTraverse) { + // 2fi. Set the accumulated text to the empty string. + let accumulated = ""; + // 2fii. Check for CSS generated textual content associated with the current node and + // include it in the accumulated text. The CSS :before and :after pseudo elements [CSS2] + // can provide textual content for elements that have a content model. + // For :before pseudo elements, User agents MUST prepend CSS textual content, without + // a space, to the textual content of the current node. + // For :after pseudo elements, User agents MUST append CSS textual content, without a + // space, to the textual content of the current node. + let before = null; + before = elem.ownerDocument.defaultView.getComputedStyle(elem,"before").content; + + if (before && before !== "none") { + before = before.replace(/^"/,"").replace(/"$/,""); + accumulated += before; + } + // 2fiii. For each child node of the current node: + // Set the current node to the child node. + // Compute the text alternative of the current node beginning with step 2. Set the result + // to that text alternative. + // Append the result to the accumulated text. + if (elem.nodeName.toUpperCase() === "SLOT") { + //if no assignedNode, check its own text + if (!(elem as HTMLSlotElement).assignedNodes() || (elem as HTMLSlotElement).assignedNodes().length === 0) { + let innerText = CommonUtil.getInnerText(elem); + if (innerText && innerText !== null && innerText.trim().length > 0) + accumulated += " " + innerText; + } else { + // check text from all assigned nodes + for (const slotChild of (elem as HTMLSlotElement).assignedNodes()) { + let nextChildContent = ARIAMapper.computeNameHelp(walkId, slotChild, labelledbyTraverse, true); + accumulated += " " + nextChildContent; + } + } + } else { + let walkChild = elem.firstChild; + while (walkChild) { + let nextChildContent = ARIAMapper.computeNameHelp(walkId, walkChild, labelledbyTraverse, true); + accumulated += " " + nextChildContent; + walkChild = walkChild.nextSibling; + } + } + + let after = null; + try { + after = elem.ownerDocument.defaultView.getComputedStyle(elem,"after").content; + } catch (e) {} + + if (after && after !== "none") { + after = after.replace(/^"/,"").replace(/"$/,""); + accumulated += after; + } + // 2fiv. Return the accumulated text. + accumulated = accumulated.replace(/\s+/g," ").trim(); + if (accumulated.trim().length > 0) { + return accumulated; + } + } + + // 2i. Otherwise, if the current node has a Tooltip attribute, return its value. + if (elem.hasAttribute("title")) { + return elem.getAttribute("title"); + } + if (elem.tagName.toLowerCase() === "svg") { + let title = elem.querySelector("title"); + if (title) { + return title.textContent || title.innerText; + } + } + + return ""; + } + */ + /* if (role in ARIADefinitions.designPatterns + && ARIADefinitions.designPatterns[role].nameFrom + && ARIADefinitions.designPatterns[role].nameFrom.includes("contents")) + { + name = elem.textContent; + } + if (elem.nodeName.toLowerCase() === "input" && elem.hasAttribute("id") && elem.getAttribute("id").trim().length > 0) { + name = elem.ownerDocument.querySelector("label[for='"+elem.getAttribute("id").trim()+"']").textContent; + } + if (elem.hasAttribute("aria-label")) { + name = elem.getAttribute("aria-label"); + } + if (elem.hasAttribute("aria-labelledby")) { + name = ""; + const ids = elem.getAttribute("aria-labelledby").split(" "); + for (const id of ids) { + name += FragmentUtil.getById(elem, id).textContent + " "; + } + name = name.trim(); + } + return name; + }*/ + ARIAMapper.nodeToRole = function (node) { + if (node.nodeType === 3 /* Node.TEXT_NODE */) { + return "text"; + } + else if (node.nodeType !== 1 /* Node.ELEMENT_NODE */) { + return null; + } + var elem = node; + if (!elem || elem.nodeType !== 1 /* Node.ELEMENT_NODE */) { + return null; + } + // TO DO: use AriaUtil.getResolvedRole(elem) to replace the code following, which uses only the valid roles for the element based on the aria fallback rule + //const role = AriaUtil.getResolvedRole(elem); + //return role === "presentation" || role === "none" ? null : role; + if (elem.hasAttribute("role") && elem.getAttribute("role").trim().length > 0) { + var roleStr = elem.getAttribute("role").trim(); + var roles_2 = roleStr.split(" "); + for (var _i = 0, roles_1 = roles_2; _i < roles_1.length; _i++) { + var role_1 = roles_1[_i]; + if (role_1 === "presentation" || role_1 === "none") { + // If element is focusable, then presentation roles are to be ignored + if (!CommonUtil_1.CommonUtil.isFocusable(elem)) { + return null; + } + } + else if (role_1 in ARIADefinitions_1.ARIADefinitions.designPatterns) { + return role_1; + } + } + } + //return this.elemToImplicitRole(elem); + var roles = AriaUtil_1.AriaUtil.getImplicitRole(elem); + //console.log("node=" + node.nodeName +", role= " + (roles ? roles[0] : null) +", resolved=" + AriaUtil.getResolvedRole(elem)); + var role = !roles || roles.length === 0 ? null : roles[0]; + return role === "presentation" || role === "none" ? null : role; + //return AriaUtil.getResolvedRole(elem); + }; + //////////////////////////////////////////////////////////////////////////// + // Helper functions + //// + // https://www.w3.org/TR/html-aam-1.0/#mapping-html-to-accessibility-apis + ARIAMapper.elemAttrValueCalculators = { + "global": { + "name": function (elem) { var _a; return (_a = AccNameUtil_1.AccNameUtil.computeAccessibleName(elem)) === null || _a === void 0 ? void 0 : _a.name; } //ARIAMapper.computeName + }, + "datalist": { + // set to "true" if the datalist's selection model allows multiple option elements to be + // selected at a time, and "false" otherwise + "multiselectable": function (elem) { + var id = elem.getAttribute("id"); + if (id && id.length > 0) { + var input = elem.ownerDocument.querySelector("input[list='" + id + "']"); + return "" + (elem.getAttribute("multiple") + && (elem.getAttribute("multiple") == "true" || elem.getAttribute("multiple") == "")); + } + return null; + } + }, + "h1": { + "level": "1" + }, + "h2": { + "level": "2" + }, + "h3": { + "level": "3" + }, + "h4": { + "level": "4" + }, + "h5": { + "level": "5" + }, + "h6": { + "level": "6" + }, + "input": { + // - type="checkbox" state set to "mixed" if the element's indeterminate IDL attribute + // is true, or "true" if the element's checkedness is true, or "false" otherwise + // - type="radio" state set to "true" if the element's checkedness is true, or "false" + // otherwise. + "checked": function (elem) { + var type = elem.getAttribute("type"); + if (type === "checkbox" || type === "radio") { + return "" + elem.checked; + } + return null; + } + // - type="radio" and not in menu reflecting number of type=radio input elements + // within the radio button group + , + "setsize": function (elem) { return null; // removed by dead control flow + } + // - type="radio" and not in menu value reflecting the elements position + // within the radio button group." + , + "posinset": function (elem) { return null; // removed by dead control flow + } + // input (type attribute in the Text, Search, Telephone, URL, or E-mail states with a + // suggestions source element) combobox role, with the aria-owns property set to the same + // value as the list attribute + , + "owns": function (elem) { return null; // removed by dead control flow + } + }, + "keygen": { + "multiselectable": "false" + }, + "li": { + // Number of li elements within the ol, ul, menu + "setsize": function (elem) { + var parent = DOMUtil_1.DOMUtil.getAncestor(elem, ["ol", "ul", "menu"]); + if (!parent) + return null; + var lis = CacheUtil_1.CacheUtil.getSetCache(parent, "elemAttrValueCalculators::lis", function () { return parent.querySelectorAll("li"); }); + var otherlis = CacheUtil_1.CacheUtil.getSetCache(parent, "elemAttrValueCalculators::otherlis", function () { return parent.querySelectorAll("ol li, ul li, menu li"); }); + return "" + (lis.length - otherlis.length); + } + // Position of li element within the ol, ul, menu + , + "posinset": function (elem) { + var parent = DOMUtil_1.DOMUtil.getAncestor(elem, ["ol", "ul", "menu"]); + if (!parent) + return null; + var lis = CacheUtil_1.CacheUtil.getSetCache(parent, "elemAttrValueCalculators::lis", function () { return parent.querySelectorAll("li"); }); + var num = 0; + for (var idx = 0; idx < lis.length; ++idx) { + var li = lis[idx]; + if (DOMUtil_1.DOMUtil.sameNode(parent, DOMUtil_1.DOMUtil.getAncestor(li, ["ol", "ul", "menu"]))) { + return "" + num; + } + ++num; + } + return null; + } + }, + "menuitem": { + // type = checkbox or radio, set to "true" if the checked attribute + // is present, and "false" otherwise + "checked": function (elem) { return "" + !!(elem.getAttribute("checked") + && (elem.getAttribute("checked") == "true" || elem.getAttribute("checked") == "")); } + }, + "option": { + // set to "true" if the element's selectedness is true, or "false" otherwise. + "selected": function (elem) { return "" + !!(elem.getAttribute("selected") + && (elem.getAttribute("selected") == "true" || elem.getAttribute("selected") == "")); } + }, + "progress": { + "valuemax": function (elem) { return elem.getAttribute("max") || "1"; }, + "valuemin": function (elem) { return "0"; }, + "valuenow": function (elem) { return elem.getAttribute("value"); } + } + }; + ARIAMapper.textAttrValueCalculators = { + "name": function (node) { return node.nodeValue; } + }; + ARIAMapper.nameComputationId = 0; + return ARIAMapper; +}(CommonMapper_1.CommonMapper)); +exports.ARIAMapper = ARIAMapper; + + +/***/ }, + +/***/ 1560 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ARIAWalker = void 0; +var fragment_1 = __webpack_require__(5279); +var ARIAMapper_1 = __webpack_require__(9955); +var VisUtil_1 = __webpack_require__(3946); +var DOMWalker_1 = __webpack_require__(3864); +/** + * Walks in an ARIA order + * + * See also ../dom/DOMWalker + */ +var ARIAWalker = /** @class */ (function () { + function ARIAWalker(element, bEnd, root) { + this.root = root || element; + if (this.root.nodeType === 9) { + this.root = this.root.documentElement; + } + this.node = element; + // if (this.node.nodeType === 9) { + // this.node = (this.node as Document).documentElement + // } + this.bEndTag = (bEnd == undefined ? false : bEnd == true); + } + ARIAWalker.prototype.atRoot = function () { + if (this.ownerElement) + return false; + if (this.root === this.node) { + return true; + } + else if (this.root.isSameNode) { + return this.root.isSameNode(this.node); + } + else if (this.root.compareDocumentPosition) { + return this.root.compareDocumentPosition(this.node) === 0; + } + else { + // Not supported in this environment - try our best + return this.node.parentNode === null; + } + }; + ARIAWalker.prototype.nextNode = function () { + var skipOwned = false; + do { + skipOwned = false; + // console.log(this.node.nodeName, this.bEndTag?"END":"START", this.node.nodeType === 1 && (this.node as any).getAttribute("id")); + if (!this.bEndTag) { + var iframeNode = this.node; + var elementNode = this.node; + var slotElement = this.node; + if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && this.node.nodeName.toUpperCase() === "IFRAME" + && VisUtil_1.VisUtil.isNodeVisible(iframeNode) + && iframeNode.contentDocument + && iframeNode.contentDocument.documentElement) { + var ownerElement = this.node; + this.node = iframeNode.contentDocument.documentElement; + this.node.ownerElement = ownerElement; + } + else if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && VisUtil_1.VisUtil.isNodeVisible(elementNode) + && elementNode.shadowRoot + && elementNode.shadowRoot.firstChild) { + var ownerElement = this.node; + this.node = elementNode.shadowRoot; + this.node.ownerElement = ownerElement; + DOMWalker_1.DOMWalker.assignSlots(this.node); + } + else if (this.node.nodeType === 1 + && elementNode.nodeName.toLowerCase() === "slot" + && slotElement.assignedNodes().length > 0) { + this.node = slotElement.assignedNodes()[0]; + } + else if ((this.node.nodeType === 1 /* Node.ELEMENT_NODE */ || this.node.nodeType === 11 /* Node.DOCUMENT_FRAGMENT_NODE */) + && DOMWalker_1.DOMWalker.firstChildNotOwnedBySlot(this.node)) { + this.node = DOMWalker_1.DOMWalker.firstChildNotOwnedBySlot(this.node); + } + else { + this.bEndTag = true; + } + } + else { + if (this.atRoot()) { + return false; + } + else if (this.node.slotOwner) { + var slotOwner = this.node.slotOwner; + var nextSlotIndex = this.node.slotIndex + 1; + // delete (this.node as any).slotOwner; + // delete (this.node as any).slotIndex; + if (nextSlotIndex < slotOwner.assignedNodes().length) { + this.node = slotOwner.assignedNodes()[nextSlotIndex]; + this.bEndTag = false; + } + else { + this.node = slotOwner; + this.bEndTag = true; + } + } + else if (this.node.ownerElement) { + this.node = this.node.ownerElement; + this.bEndTag = true; + } + else if (DOMWalker_1.DOMWalker.nextSiblingNotOwnedBySlot(this.node)) { + this.node = DOMWalker_1.DOMWalker.nextSiblingNotOwnedBySlot(this.node); + this.bEndTag = false; + skipOwned = true; + } + else if (this.node.parentNode) { + if (this.node.parentNode.nodeType === 1 && this.node.parentNode.hasAttribute("aria-owns")) { + var ownIds = this.node.parentNode.getAttribute("aria-owns").split(/ +/g); + if (this.node.nodeType !== 1 || !this.node.hasAttribute("id")) { + this.node = fragment_1.FragmentUtil.getOwnerFragment(this.node).getElementById(ownIds[0]); + this.bEndTag = false; + } + else { + var idx = ownIds.indexOf(this.node.getAttribute("id")); + if (idx === ownIds.length - 1) { + // last one + this.node = this.node.parentNode; + this.bEndTag = true; + } + else { + // grab next + this.node = fragment_1.FragmentUtil.getOwnerFragment(this.node).getElementById(ownIds[idx + 1]); + this.bEndTag = false; + } + } + } + this.node = this.node.parentNode; + this.bEndTag = true; + } + else { + return false; + } + } + } while ((this.node.nodeType !== 1 /* Node.ELEMENT_NODE */ && this.node.nodeType !== 11 && this.node.nodeType !== 3 /* Node.TEXT_NODE */) + || (this.node.nodeType === 1 && this.node.getAttribute("aChecker") === "ACE") + || (skipOwned && this.node.nodeType === 1 && !!ARIAMapper_1.ARIAMapper.getAriaOwnedBy(this.node))); + return true; + }; + ARIAWalker.prototype.prevNode = function () { + var skipOwned = false; + do { + skipOwned = false; + if (this.bEndTag) { + var iframeNode = this.node; + var elementNode = this.node; + if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && this.node.nodeName.toUpperCase() === "IFRAME" + && VisUtil_1.VisUtil.isNodeVisible(iframeNode) + && iframeNode.contentDocument + && iframeNode.contentDocument.documentElement) { + var ownerElement = this.node; + this.node = iframeNode.contentDocument.documentElement; + this.node.ownerElement = ownerElement; + } + else if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && VisUtil_1.VisUtil.isNodeVisible(elementNode) + && elementNode.shadowRoot + && elementNode.shadowRoot.lastChild) { + var ownerElement = this.node; + this.node = elementNode.shadowRoot; + this.node.ownerElement = ownerElement; + DOMWalker_1.DOMWalker.assignSlots(this.node); + } + else if ((this.node.nodeType === 1 /* Node.ELEMENT_NODE */ || this.node.nodeType === 11) + && DOMWalker_1.DOMWalker.lastChildNotOwnedBySlot(this.node)) { + this.node = DOMWalker_1.DOMWalker.lastChildNotOwnedBySlot(this.node); + } + else { + this.bEndTag = false; + } + } + else { + if (this.atRoot()) { + return false; + } + else if (DOMWalker_1.DOMWalker.previousSiblingNotOwnedBySlot(this.node)) { + this.node = DOMWalker_1.DOMWalker.previousSiblingNotOwnedBySlot(this.node); + this.bEndTag = true; + } + else if (this.node.ownerElement) { + this.node = this.node.ownerElement; + this.bEndTag = false; + skipOwned = true; + } + else if (this.node.parentNode) { + if (this.node.parentNode.nodeType === 1 && this.node.parentNode.hasAttribute("aria-owns")) { + var ownIds = this.node.parentNode.getAttribute("aria-owns").split(/ +/g); + if (this.node.nodeType !== 1 || !this.node.hasAttribute("id")) { + this.node = fragment_1.FragmentUtil.getOwnerFragment(this.node).getElementById(ownIds[0]); + this.bEndTag = false; + } + else { + var idx = ownIds.indexOf(this.node.getAttribute("id")); + if (idx === ownIds.length - 1) { + // last one + this.node = this.node.parentNode; + this.bEndTag = true; + } + else { + // grab next + this.node = fragment_1.FragmentUtil.getOwnerFragment(this.node).getElementById(ownIds[idx + 1]); + this.bEndTag = false; + } + } + } + this.node = this.node.parentNode; + this.bEndTag = false; + } + else { + return false; + } + } + } while ((this.node.nodeType !== 1 /* Node.ELEMENT_NODE */ && this.node.nodeType !== 11) + || (this.node.nodeType === 1 && this.node.getAttribute("aChecker") === "ACE") + || (skipOwned && this.node.nodeType === 1 && !!ARIAMapper_1.ARIAMapper.getAriaOwnedBy(this.node))); + return true; + }; + return ARIAWalker; +}()); +exports.ARIAWalker = ARIAWalker; + + +/***/ }, + +/***/ 6858 +(__unused_webpack_module, exports) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.AncestorUtil = void 0; +var AncestorUtil = /** @class */ (function () { + function AncestorUtil() { + } + AncestorUtil.isPresentationFrame = function (contextHierarchy) { + if (contextHierarchy && contextHierarchy.dom) { + // Skip current node because we want ancestry + for (var idx = contextHierarchy.dom.length - 2; idx >= 0; --idx) { + var elem = contextHierarchy.dom[idx].node; + if (elem.nodeType === 1 + && elem.nodeName.toLowerCase() === "iframe" + && (elem.getAttribute("role") === "presentation" || elem.getAttribute("aria-hidden") === "true")) { + return true; + } + } + } + return false; + }; + AncestorUtil.isFrame = function (contextHierarchy) { + if (contextHierarchy && contextHierarchy.dom) { + // Skip current node because we want ancestry + for (var idx = contextHierarchy.dom.length - 2; idx >= 0; --idx) { + var elem = contextHierarchy.dom[idx].node; + if (elem.nodeType === 1 && elem.nodeName.toLowerCase() === "iframe") { + return true; + } + } + } + return false; + }; + return AncestorUtil; +}()); +exports.AncestorUtil = AncestorUtil; + + +/***/ }, + +/***/ 5279 +(__unused_webpack_module, exports) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.FragmentUtil = void 0; +var FragmentUtil = /** @class */ (function () { + function FragmentUtil() { + } + FragmentUtil.getOwnerFragment = function (node) { + var n = node; + while (n.parentNode && (n = n.parentNode)) { + if (n.nodeType === 11) { + return n; + } + } + return node.ownerDocument; + }; + FragmentUtil.getById = function (node, id) { + return this.getOwnerFragment(node).getElementById(id); + }; + FragmentUtil.getAncestor = function (hierarchies, elemName) { + var matches = hierarchies["dom"].filter(function (info) { return info.role === elemName; }); + return matches.length > 0 && matches[0].node || null; + }; + FragmentUtil.getAncestorWithRole = function (hierarchies, role) { + var matches = hierarchies["aria"].filter(function (info) { return info.role === role; }); + return matches.length > 0 && matches[0].node || null; + }; + return FragmentUtil; +}()); +exports.FragmentUtil = FragmentUtil; + + +/***/ }, + +/***/ 1043 +(__unused_webpack_module, exports) { + + +/****************************************************************************** + Copyright:: 2021- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.LangUtil = void 0; +// From https://www.iana.org/assignments/language-subtag-registry/language-subtag-registry +var validPrimaryLangs = [ + ["aa", "ab", "ae", "af", "ak", "am", "an", "ar", "as", "av", "ay", "az", "aaa", "aab", "aac", "aad", "aae", "aaf", "aag", "aah", "aai", "aak", "aal", "aam", "aan", "aao", "aap", "aaq", "aas", "aat", "aau", "aav", "aaw", "aax", "aaz", "aba", "abb", "abc", "abd", "abe", "abf", "abg", "abh", "abi", "abj", "abl", "abm", "abn", "abo", "abp", "abq", "abr", "abs", "abt", "abu", "abv", "abw", "abx", "aby", "abz", "aca", "acb", "acd", "ace", "acf", "ach", "aci", "ack", "acl", "acm", "acn", "acp", "acq", "acr", "acs", "act", "acu", "acv", "acw", "acx", "acy", "acz", "ada", "adb", "add", "ade", "adf", "adg", "adh", "adi", "adj", "adl", "adn", "ado", "adp", "adq", "adr", "ads", "adt", "adu", "adw", "adx", "ady", "adz", "aea", "aeb", "aec", "aed", "aee", "aek", "ael", "aem", "aen", "aeq", "aer", "aes", "aeu", "aew", "aey", "aez", "afa", "afb", "afd", "afe", "afg", "afh", "afi", "afk", "afn", "afo", "afp", "afs", "aft", "afu", "afz", "aga", "agb", "agc", "agd", "age", "agf", "agg", "agh", "agi", "agj", "agk", "agl", "agm", "agn", "ago", "agp", "agq", "agr", "ags", "agt", "agu", "agv", "agw", "agx", "agy", "agz", "aha", "ahb", "ahg", "ahh", "ahi", "ahk", "ahl", "ahm", "ahn", "aho", "ahp", "ahr", "ahs", "aht", "aia", "aib", "aic", "aid", "aie", "aif", "aig", "aih", "aii", "aij", "aik", "ail", "aim", "ain", "aio", "aip", "aiq", "air", "ais", "ait", "aiw", "aix", "aiy", "aja", "ajg", "aji", "ajn", "ajp", "ajt", "aju", "ajw", "ajz", "akb", "akc", "akd", "ake", "akf", "akg", "akh", "aki", "akj", "akk", "akl", "akm", "ako", "akp", "akq", "akr", "aks", "akt", "aku", "akv", "akw", "akx", "aky", "akz", "ala", "alc", "ald", "ale", "alf", "alg", "alh", "ali", "alj", "alk", "all", "alm", "aln", "alo", "alp", "alq", "alr", "als", "alt", "alu", "alv", "alw", "alx", "aly", "alz", "ama", "amb", "amc", "ame", "amf", "amg", "ami", "amj", "amk", "aml", "amm", "amn", "amo", "amp", "amq", "amr", "ams", "amt", "amu", "amv", "amw", "amx", "amy", "amz", "ana", "anb", "anc", "and", "ane", "anf", "ang", "anh", "ani", "anj", "ank", "anl", "anm", "ann", "ano", "anp", "anq", "anr", "ans", "ant", "anu", "anv", "anw", "anx", "any", "anz", "aoa", "aob", "aoc", "aod", "aoe", "aof", "aog", "aoh", "aoi", "aoj", "aok", "aol", "aom", "aon", "aor", "aos", "aot", "aou", "aox", "aoz", "apa", "apb", "apc", "apd", "ape", "apf", "apg", "aph", "api", "apj", "apk", "apl", "apm", "apn", "apo", "app", "apq", "apr", "aps", "apt", "apu", "apv", "apw", "apx", "apy", "apz", "aqa", "aqc", "aqd", "aqg", "aqk", "aql", "aqm", "aqn", "aqp", "aqr", "aqt", "aqz", "arb", "arc", "ard", "are", "arh", "ari", "arj", "ark", "arl", "arn", "aro", "arp", "arq", "arr", "ars", "art", "aru", "arv", "arw", "arx", "ary", "arz", "asa", "asb", "asc", "asd", "ase", "asf", "asg", "ash", "asi", "asj", "ask", "asl", "asn", "aso", "asp", "asq", "asr", "ass", "ast", "asu", "asv", "asw", "asx", "asy", "asz", "ata", "atb", "atc", "atd", "ate", "atg", "ath", "ati", "atj", "atk", "atl", "atm", "atn", "ato", "atp", "atq", "atr", "ats", "att", "atu", "atv", "atw", "atx", "aty", "atz", "aua", "aub", "auc", "aud", "aue", "auf", "aug", "auh", "aui", "auj", "auk", "aul", "aum", "aun", "auo", "aup", "auq", "aur", "aus", "aut", "auu", "auw", "aux", "auy", "auz", "avb", "avd", "avi", "avk", "avl", "avm", "avn", "avo", "avs", "avt", "avu", "avv", "awa", "awb", "awc", "awd", "awe", "awg", "awh", "awi", "awk", "awm", "awn", "awo", "awr", "aws", "awt", "awu", "awv", "aww", "awx", "awy", "axb", "axe", "axg", "axk", "axl", "axm", "axx", "aya", "ayb", "ayc", "ayd", "aye", "ayg", "ayh", "ayi", "ayk", "ayl", "ayn", "ayo", "ayp", "ayq", "ayr", "ays", "ayt", "ayu", "ayx", "ayy", "ayz", "aza", "azb", "azc", "azd", "azg", "azj", "azm", "azn", "azo", "azt", "azz"], + ["ba", "be", "bg", "bh", "bi", "bm", "bn", "bo", "br", "bs", "baa", "bab", "bac", "bad", "bae", "baf", "bag", "bah", "bai", "baj", "bal", "ban", "bao", "bap", "bar", "bas", "bat", "bau", "bav", "baw", "bax", "bay", "baz", "bba", "bbb", "bbc", "bbd", "bbe", "bbf", "bbg", "bbh", "bbi", "bbj", "bbk", "bbl", "bbm", "bbn", "bbo", "bbp", "bbq", "bbr", "bbs", "bbt", "bbu", "bbv", "bbw", "bbx", "bby", "bbz", "bca", "bcb", "bcc", "bcd", "bce", "bcf", "bcg", "bch", "bci", "bcj", "bck", "bcl", "bcm", "bcn", "bco", "bcp", "bcq", "bcr", "bcs", "bct", "bcu", "bcv", "bcw", "bcy", "bcz", "bda", "bdb", "bdc", "bdd", "bde", "bdf", "bdg", "bdh", "bdi", "bdj", "bdk", "bdl", "bdm", "bdn", "bdo", "bdp", "bdq", "bdr", "bds", "bdt", "bdu", "bdv", "bdw", "bdx", "bdy", "bdz", "bea", "beb", "bec", "bed", "bee", "bef", "beg", "beh", "bei", "bej", "bek", "bem", "beo", "bep", "beq", "ber", "bes", "bet", "beu", "bev", "bew", "bex", "bey", "bez", "bfa", "bfb", "bfc", "bfd", "bfe", "bff", "bfg", "bfh", "bfi", "bfj", "bfk", "bfl", "bfm", "bfn", "bfo", "bfp", "bfq", "bfr", "bfs", "bft", "bfu", "bfw", "bfx", "bfy", "bfz", "bga", "bgb", "bgc", "bgd", "bge", "bgf", "bgg", "bgi", "bgj", "bgk", "bgl", "bgm", "bgn", "bgo", "bgp", "bgq", "bgr", "bgs", "bgt", "bgu", "bgv", "bgw", "bgx", "bgy", "bgz", "bha", "bhb", "bhc", "bhd", "bhe", "bhf", "bhg", "bhh", "bhi", "bhj", "bhk", "bhl", "bhm", "bhn", "bho", "bhp", "bhq", "bhr", "bhs", "bht", "bhu", "bhv", "bhw", "bhx", "bhy", "bhz", "bia", "bib", "bic", "bid", "bie", "bif", "big", "bij", "bik", "bil", "bim", "bin", "bio", "bip", "biq", "bir", "bit", "biu", "biv", "biw", "bix", "biy", "biz", "bja", "bjb", "bjc", "bjd", "bje", "bjf", "bjg", "bjh", "bji", "bjj", "bjk", "bjl", "bjm", "bjn", "bjo", "bjp", "bjq", "bjr", "bjs", "bjt", "bju", "bjv", "bjw", "bjx", "bjy", "bjz", "bka", "bkb", "bkc", "bkd", "bkf", "bkg", "bkh", "bki", "bkj", "bkk", "bkl", "bkm", "bkn", "bko", "bkp", "bkq", "bkr", "bks", "bkt", "bku", "bkv", "bkw", "bkx", "bky", "bkz", "bla", "blb", "blc", "bld", "ble", "blf", "blg", "blh", "bli", "blj", "blk", "bll", "blm", "bln", "blo", "blp", "blq", "blr", "bls", "blt", "blv", "blw", "blx", "bly", "blz", "bma", "bmb", "bmc", "bmd", "bme", "bmf", "bmg", "bmh", "bmi", "bmj", "bmk", "bml", "bmm", "bmn", "bmo", "bmp", "bmq", "bmr", "bms", "bmt", "bmu", "bmv", "bmw", "bmx", "bmy", "bmz", "bna", "bnb", "bnc", "bnd", "bne", "bnf", "bng", "bni", "bnj", "bnk", "bnl", "bnm", "bnn", "bno", "bnp", "bnq", "bnr", "bns", "bnt", "bnu", "bnv", "bnw", "bnx", "bny", "bnz", "boa", "bob", "boe", "bof", "bog", "boh", "boi", "boj", "bok", "bol", "bom", "bon", "boo", "bop", "boq", "bor", "bot", "bou", "bov", "bow", "box", "boy", "boz", "bpa", "bpb", "bpd", "bpe", "bpg", "bph", "bpi", "bpj", "bpk", "bpl", "bpm", "bpn", "bpo", "bpp", "bpq", "bpr", "bps", "bpt", "bpu", "bpv", "bpw", "bpx", "bpy", "bpz", "bqa", "bqb", "bqc", "bqd", "bqf", "bqg", "bqh", "bqi", "bqj", "bqk", "bql", "bqm", "bqn", "bqo", "bqp", "bqq", "bqr", "bqs", "bqt", "bqu", "bqv", "bqw", "bqx", "bqy", "bqz", "bra", "brb", "brc", "brd", "brf", "brg", "brh", "bri", "brj", "brk", "brl", "brm", "brn", "bro", "brp", "brq", "brr", "brs", "brt", "bru", "brv", "brw", "brx", "bry", "brz", "bsa", "bsb", "bsc", "bse", "bsf", "bsg", "bsh", "bsi", "bsj", "bsk", "bsl", "bsm", "bsn", "bso", "bsp", "bsq", "bsr", "bss", "bst", "bsu", "bsv", "bsw", "bsx", "bsy", "bta", "btb", "btc", "btd", "bte", "btf", "btg", "bth", "bti", "btj", "btk", "btl", "btm", "btn", "bto", "btp", "btq", "btr", "bts", "btt", "btu", "btv", "btw", "btx", "bty", "btz", "bua", "bub", "buc", "bud", "bue", "buf", "bug", "buh", "bui", "buj", "buk", "bum", "bun", "buo", "bup", "buq", "bus", "but", "buu", "buv", "buw", "bux", "buy", "buz", "bva", "bvb", "bvc", "bvd", "bve", "bvf", "bvg", "bvh", "bvi", "bvj", "bvk", "bvl", "bvm", "bvn", "bvo", "bvp", "bvq", "bvr", "bvt", "bvu", "bvv", "bvw", "bvx", "bvy", "bvz", "bwa", "bwb", "bwc", "bwd", "bwe", "bwf", "bwg", "bwh", "bwi", "bwj", "bwk", "bwl", "bwm", "bwn", "bwo", "bwp", "bwq", "bwr", "bws", "bwt", "bwu", "bww", "bwx", "bwy", "bwz", "bxa", "bxb", "bxc", "bxd", "bxe", "bxf", "bxg", "bxh", "bxi", "bxj", "bxk", "bxl", "bxm", "bxn", "bxo", "bxp", "bxq", "bxr", "bxs", "bxu", "bxv", "bxw", "bxx", "bxz", "bya", "byb", "byc", "byd", "bye", "byf", "byg", "byh", "byi", "byj", "byk", "byl", "bym", "byn", "byo", "byp", "byq", "byr", "bys", "byt", "byv", "byw", "byx", "byy", "byz", "bza", "bzb", "bzc", "bzd", "bze", "bzf", "bzg", "bzh", "bzi", "bzj", "bzk", "bzl", "bzm", "bzn", "bzo", "bzp", "bzq", "bzr", "bzs", "bzt", "bzu", "bzv", "bzw", "bzx", "bzy", "bzz"], + ["ca", "ce", "ch", "co", "cr", "cs", "cu", "cv", "cy", "caa", "cab", "cac", "cad", "cae", "caf", "cag", "cah", "cai", "caj", "cak", "cal", "cam", "can", "cao", "cap", "caq", "car", "cas", "cau", "cav", "caw", "cax", "cay", "caz", "cba", "cbb", "cbc", "cbd", "cbe", "cbg", "cbh", "cbi", "cbj", "cbk", "cbl", "cbn", "cbo", "cbq", "cbr", "cbs", "cbt", "cbu", "cbv", "cbw", "cby", "cca", "ccc", "ccd", "cce", "ccg", "cch", "ccj", "ccl", "ccm", "ccn", "cco", "ccp", "ccq", "ccr", "ccs", "cda", "cdc", "cdd", "cde", "cdf", "cdg", "cdh", "cdi", "cdj", "cdm", "cdn", "cdo", "cdr", "cds", "cdy", "cdz", "cea", "ceb", "ceg", "cek", "cel", "cen", "cet", "cey", "cfa", "cfd", "cfg", "cfm", "cga", "cgc", "cgg", "cgk", "chb", "chc", "chd", "chf", "chg", "chh", "chj", "chk", "chl", "chm", "chn", "cho", "chp", "chq", "chr", "cht", "chw", "chx", "chy", "chz", "cia", "cib", "cic", "cid", "cie", "cih", "cik", "cim", "cin", "cip", "cir", "ciw", "ciy", "cja", "cje", "cjh", "cji", "cjk", "cjm", "cjn", "cjo", "cjp", "cjr", "cjs", "cjv", "cjy", "cka", "ckb", "ckh", "ckl", "ckm", "ckn", "cko", "ckq", "ckr", "cks", "ckt", "cku", "ckv", "ckx", "cky", "ckz", "cla", "clc", "cld", "cle", "clh", "cli", "clj", "clk", "cll", "clm", "clo", "clt", "clu", "clw", "cly", "cma", "cmc", "cme", "cmg", "cmi", "cmk", "cml", "cmm", "cmn", "cmo", "cmr", "cms", "cmt", "cna", "cnb", "cnc", "cng", "cnh", "cni", "cnk", "cnl", "cno", "cnp", "cnr", "cns", "cnt", "cnu", "cnw", "cnx", "coa", "cob", "coc", "cod", "coe", "cof", "cog", "coh", "coj", "cok", "col", "com", "con", "coo", "cop", "coq", "cot", "cou", "cov", "cow", "cox", "coy", "coz", "cpa", "cpb", "cpc", "cpe", "cpf", "cpg", "cpi", "cpn", "cpo", "cpp", "cps", "cpu", "cpx", "cpy", "cqd", "cqu", "cra", "crb", "crc", "crd", "crf", "crg", "crh", "cri", "crj", "crk", "crl", "crm", "crn", "cro", "crp", "crq", "crr", "crs", "crt", "crv", "crw", "crx", "cry", "crz", "csa", "csb", "csc", "csd", "cse", "csf", "csg", "csh", "csi", "csj", "csk", "csl", "csm", "csn", "cso", "csp", "csq", "csr", "css", "cst", "csu", "csv", "csw", "csx", "csy", "csz", "cta", "ctc", "ctd", "cte", "ctg", "cth", "ctl", "ctm", "ctn", "cto", "ctp", "cts", "ctt", "ctu", "cty", "ctz", "cua", "cub", "cuc", "cug", "cuh", "cui", "cuj", "cuk", "cul", "cum", "cuo", "cup", "cuq", "cur", "cus", "cut", "cuu", "cuv", "cuw", "cux", "cuy", "cvg", "cvn", "cwa", "cwb", "cwd", "cwe", "cwg", "cwt", "cya", "cyb", "cyo", "czh", "czk", "czn", "czo", "czt"], + ["da", "de", "dv", "dz", "daa", "dac", "dad", "dae", "daf", "dag", "dah", "dai", "daj", "dak", "dal", "dam", "dao", "dap", "daq", "dar", "das", "dau", "dav", "daw", "dax", "day", "daz", "dba", "dbb", "dbd", "dbe", "dbf", "dbg", "dbi", "dbj", "dbl", "dbm", "dbn", "dbo", "dbp", "dbq", "dbr", "dbt", "dbu", "dbv", "dbw", "dby", "dcc", "dcr", "dda", "ddd", "dde", "ddg", "ddi", "ddj", "ddn", "ddo", "ddr", "dds", "ddw", "dec", "ded", "dee", "def", "deg", "deh", "dei", "dek", "del", "dem", "den", "dep", "deq", "der", "des", "dev", "dez", "dga", "dgb", "dgc", "dgd", "dge", "dgg", "dgh", "dgi", "dgk", "dgl", "dgn", "dgo", "dgr", "dgs", "dgt", "dgu", "dgw", "dgx", "dgz", "dha", "dhd", "dhg", "dhi", "dhl", "dhm", "dhn", "dho", "dhr", "dhs", "dhu", "dhv", "dhw", "dhx", "dia", "dib", "dic", "did", "dif", "dig", "dih", "dii", "dij", "dik", "dil", "dim", "din", "dio", "dip", "diq", "dir", "dis", "dit", "diu", "diw", "dix", "diy", "diz", "dja", "djb", "djc", "djd", "dje", "djf", "dji", "djj", "djk", "djl", "djm", "djn", "djo", "djr", "dju", "djw", "dka", "dkg", "dkk", "dkl", "dkr", "dks", "dkx", "dlg", "dlk", "dlm", "dln", "dma", "dmb", "dmc", "dmd", "dme", "dmf", "dmg", "dmk", "dml", "dmm", "dmn", "dmo", "dmr", "dms", "dmu", "dmv", "dmw", "dmx", "dmy", "dna", "dnd", "dne", "dng", "dni", "dnj", "dnk", "dnn", "dno", "dnr", "dnt", "dnu", "dnv", "dnw", "dny", "doa", "dob", "doc", "doe", "dof", "doh", "doi", "dok", "dol", "don", "doo", "dop", "doq", "dor", "dos", "dot", "dov", "dow", "dox", "doy", "doz", "dpp", "dra", "drb", "drc", "drd", "dre", "drg", "drh", "dri", "drl", "drn", "dro", "drq", "drr", "drs", "drt", "dru", "drw", "dry", "dsb", "dse", "dsh", "dsi", "dsl", "dsn", "dso", "dsq", "dta", "dtb", "dtd", "dth", "dti", "dtk", "dtm", "dtn", "dto", "dtp", "dtr", "dts", "dtt", "dtu", "dty", "dua", "dub", "duc", "dud", "due", "duf", "dug", "duh", "dui", "duj", "duk", "dul", "dum", "dun", "duo", "dup", "duq", "dur", "dus", "duu", "duv", "duw", "dux", "duy", "duz", "dva", "dwa", "dwk", "dwl", "dwr", "dws", "dwu", "dww", "dwy", "dwz", "dya", "dyb", "dyd", "dyg", "dyi", "dym", "dyn", "dyo", "dyu", "dyy", "dza", "dzd", "dze", "dzg", "dzl", "dzn"], + ["ee", "el", "en", "eo", "es", "et", "eu", "eaa", "ebc", "ebg", "ebk", "ebo", "ebr", "ebu", "ecr", "ecs", "ecy", "eee", "efa", "efe", "efi", "ega", "egl", "ego", "egx", "egy", "ehs", "ehu", "eip", "eit", "eiv", "eja", "eka", "ekc", "eke", "ekg", "eki", "ekk", "ekl", "ekm", "eko", "ekp", "ekr", "eky", "ele", "elh", "eli", "elk", "elm", "elo", "elp", "elu", "elx", "ema", "emb", "eme", "emg", "emi", "emk", "emm", "emn", "emo", "emp", "emq", "ems", "emu", "emw", "emx", "emy", "emz", "ena", "enb", "enc", "end", "enf", "enh", "enl", "enm", "enn", "eno", "enq", "enr", "enu", "env", "enw", "enx", "eot", "epi", "era", "erg", "erh", "eri", "erk", "ero", "err", "ers", "ert", "erw", "ese", "esg", "esh", "esi", "esk", "esl", "esm", "esn", "eso", "esq", "ess", "esu", "esx", "esy", "etb", "etc", "eth", "etn", "eto", "etr", "ets", "ett", "etu", "etx", "etz", "euq", "eve", "evh", "evn", "ewo", "ext", "eya", "eyo", "eza", "eze"], + ["fa", "ff", "fi", "fj", "fo", "fr", "fy", "faa", "fab", "fad", "faf", "fag", "fah", "fai", "faj", "fak", "fal", "fam", "fan", "fap", "far", "fat", "fau", "fax", "fay", "faz", "fbl", "fcs", "fer", "ffi", "ffm", "fgr", "fia", "fie", "fif", "fil", "fip", "fir", "fit", "fiu", "fiw", "fkk", "fkv", "fla", "flh", "fli", "fll", "fln", "flr", "fly", "fmp", "fmu", "fnb", "fng", "fni", "fod", "foi", "fom", "fon", "for", "fos", "fox", "fpe", "fqs", "frc", "frd", "frk", "frm", "fro", "frp", "frq", "frr", "frs", "frt", "fse", "fsl", "fss", "fub", "fuc", "fud", "fue", "fuf", "fuh", "fui", "fuj", "fum", "fun", "fuq", "fur", "fut", "fuu", "fuv", "fuy", "fvr", "fwa", "fwe"], + ["ga", "gd", "gl", "gn", "gu", "gv", "gaa", "gab", "gac", "gad", "gae", "gaf", "gag", "gah", "gai", "gaj", "gak", "gal", "gam", "gan", "gao", "gap", "gaq", "gar", "gas", "gat", "gau", "gav", "gaw", "gax", "gay", "gaz", "gba", "gbb", "gbc", "gbd", "gbe", "gbf", "gbg", "gbh", "gbi", "gbj", "gbk", "gbl", "gbm", "gbn", "gbo", "gbp", "gbq", "gbr", "gbs", "gbu", "gbv", "gbw", "gbx", "gby", "gbz", "gcc", "gcd", "gce", "gcf", "gcl", "gcn", "gcr", "gct", "gda", "gdb", "gdc", "gdd", "gde", "gdf", "gdg", "gdh", "gdi", "gdj", "gdk", "gdl", "gdm", "gdn", "gdo", "gdq", "gdr", "gds", "gdt", "gdu", "gdx", "gea", "geb", "gec", "ged", "gef", "geg", "geh", "gei", "gej", "gek", "gel", "gem", "geq", "ges", "gev", "gew", "gex", "gey", "gez", "gfk", "gft", "gfx", "gga", "ggb", "ggd", "gge", "ggg", "ggk", "ggl", "ggn", "ggo", "ggr", "ggt", "ggu", "ggw", "gha", "ghc", "ghe", "ghh", "ghk", "ghl", "ghn", "gho", "ghr", "ghs", "ght", "gia", "gib", "gic", "gid", "gie", "gig", "gih", "gii", "gil", "gim", "gin", "gio", "gip", "giq", "gir", "gis", "git", "giu", "giw", "gix", "giy", "giz", "gji", "gjk", "gjm", "gjn", "gjr", "gju", "gka", "gkd", "gke", "gkn", "gko", "gkp", "gku", "glb", "glc", "gld", "glh", "gli", "glj", "glk", "gll", "glo", "glr", "glu", "glw", "gly", "gma", "gmb", "gmd", "gme", "gmg", "gmh", "gml", "gmm", "gmn", "gmq", "gmr", "gmu", "gmv", "gmw", "gmx", "gmy", "gmz", "gna", "gnb", "gnc", "gnd", "gne", "gng", "gnh", "gni", "gnj", "gnk", "gnl", "gnm", "gnn", "gno", "gnq", "gnr", "gnt", "gnu", "gnw", "gnz", "goa", "gob", "goc", "god", "goe", "gof", "gog", "goh", "goi", "goj", "gok", "gol", "gom", "gon", "goo", "gop", "goq", "gor", "gos", "got", "gou", "gow", "gox", "goy", "goz", "gpa", "gpe", "gpn", "gqa", "gqi", "gqn", "gqr", "gqu", "gra", "grb", "grc", "grd", "grg", "grh", "gri", "grj", "grk", "grm", "gro", "grq", "grr", "grs", "grt", "gru", "grv", "grw", "grx", "gry", "grz", "gse", "gsg", "gsl", "gsm", "gsn", "gso", "gsp", "gss", "gsw", "gta", "gti", "gtu", "gua", "gub", "guc", "gud", "gue", "guf", "gug", "guh", "gui", "guk", "gul", "gum", "gun", "guo", "gup", "guq", "gur", "gus", "gut", "guu", "guv", "guw", "gux", "guz", "gva", "gvc", "gve", "gvf", "gvj", "gvl", "gvm", "gvn", "gvo", "gvp", "gvr", "gvs", "gvy", "gwa", "gwb", "gwc", "gwd", "gwe", "gwf", "gwg", "gwi", "gwj", "gwm", "gwn", "gwr", "gwt", "gwu", "gww", "gwx", "gxx", "gya", "gyb", "gyd", "gye", "gyf", "gyg", "gyi", "gyl", "gym", "gyn", "gyo", "gyr", "gyy", "gyz", "gza", "gzi", "gzn"], + ["ha", "he", "hi", "ho", "hr", "ht", "hu", "hy", "hz", "haa", "hab", "hac", "had", "hae", "haf", "hag", "hah", "hai", "haj", "hak", "hal", "ham", "han", "hao", "hap", "haq", "har", "has", "hav", "haw", "hax", "hay", "haz", "hba", "hbb", "hbn", "hbo", "hbu", "hca", "hch", "hdn", "hds", "hdy", "hea", "hed", "heg", "heh", "hei", "hem", "hgm", "hgw", "hhi", "hhr", "hhy", "hia", "hib", "hid", "hif", "hig", "hih", "hii", "hij", "hik", "hil", "him", "hio", "hir", "hit", "hiw", "hix", "hji", "hka", "hke", "hkh", "hkk", "hkn", "hks", "hla", "hlb", "hld", "hle", "hlt", "hlu", "hma", "hmb", "hmc", "hmd", "hme", "hmf", "hmg", "hmh", "hmi", "hmj", "hmk", "hml", "hmm", "hmn", "hmp", "hmq", "hmr", "hms", "hmt", "hmu", "hmv", "hmw", "hmx", "hmy", "hmz", "hna", "hnd", "hne", "hng", "hnh", "hni", "hnj", "hnn", "hno", "hns", "hnu", "hoa", "hob", "hoc", "hod", "hoe", "hoh", "hoi", "hoj", "hok", "hol", "hom", "hoo", "hop", "hor", "hos", "hot", "hov", "how", "hoy", "hoz", "hpo", "hps", "hra", "hrc", "hre", "hrk", "hrm", "hro", "hrp", "hrr", "hrt", "hru", "hrw", "hrx", "hrz", "hsb", "hsh", "hsl", "hsn", "hss", "hti", "hto", "hts", "htu", "htx", "hub", "huc", "hud", "hue", "huf", "hug", "huh", "hui", "huj", "huk", "hul", "hum", "huo", "hup", "huq", "hur", "hus", "hut", "huu", "huv", "huw", "hux", "huy", "huz", "hvc", "hve", "hvk", "hvn", "hvv", "hwa", "hwc", "hwo", "hya", "hyw", "hyx"], + ["ia", "id", "ie", "ig", "ii", "ik", "in", "io", "is", "it", "iu", "iw", "iai", "ian", "iap", "iar", "iba", "ibb", "ibd", "ibe", "ibg", "ibh", "ibi", "ibl", "ibm", "ibn", "ibr", "ibu", "iby", "ica", "ich", "icl", "icr", "ida", "idb", "idc", "idd", "ide", "idi", "idr", "ids", "idt", "idu", "ifa", "ifb", "ife", "iff", "ifk", "ifm", "ifu", "ify", "igb", "ige", "igg", "igl", "igm", "ign", "igo", "igs", "igw", "ihb", "ihi", "ihp", "ihw", "iin", "iir", "ijc", "ije", "ijj", "ijn", "ijo", "ijs", "ike", "iki", "ikk", "ikl", "iko", "ikp", "ikr", "iks", "ikt", "ikv", "ikw", "ikx", "ikz", "ila", "ilb", "ilg", "ili", "ilk", "ill", "ilm", "ilo", "ilp", "ils", "ilu", "ilv", "ilw", "ima", "ime", "imi", "iml", "imn", "imo", "imr", "ims", "imy", "inb", "inc", "ine", "ing", "inh", "inj", "inl", "inm", "inn", "ino", "inp", "ins", "int", "inz", "ior", "iou", "iow", "ipi", "ipo", "iqu", "iqw", "ira", "ire", "irh", "iri", "irk", "irn", "iro", "irr", "iru", "irx", "iry", "isa", "isc", "isd", "ise", "isg", "ish", "isi", "isk", "ism", "isn", "iso", "isr", "ist", "isu", "itb", "itc", "itd", "ite", "iti", "itk", "itl", "itm", "ito", "itr", "its", "itt", "itv", "itw", "itx", "ity", "itz", "ium", "ivb", "ivv", "iwk", "iwm", "iwo", "iws", "ixc", "ixl", "iya", "iyo", "iyx", "izh", "izi", "izr", "izz"], + ["ja", "ji", "jv", "jw", "jaa", "jab", "jac", "jad", "jae", "jaf", "jah", "jaj", "jak", "jal", "jam", "jan", "jao", "jaq", "jar", "jas", "jat", "jau", "jax", "jay", "jaz", "jbe", "jbi", "jbj", "jbk", "jbm", "jbn", "jbo", "jbr", "jbt", "jbu", "jbw", "jcs", "jct", "jda", "jdg", "jdt", "jeb", "jee", "jeg", "jeh", "jei", "jek", "jel", "jen", "jer", "jet", "jeu", "jgb", "jge", "jgk", "jgo", "jhi", "jhs", "jia", "jib", "jic", "jid", "jie", "jig", "jih", "jii", "jil", "jim", "jio", "jiq", "jit", "jiu", "jiv", "jiy", "jje", "jjr", "jka", "jkm", "jko", "jkp", "jkr", "jks", "jku", "jle", "jls", "jma", "jmb", "jmc", "jmd", "jmi", "jml", "jmn", "jmr", "jms", "jmw", "jmx", "jna", "jnd", "jng", "jni", "jnj", "jnl", "jns", "job", "jod", "jog", "jor", "jos", "jow", "jpa", "jpr", "jpx", "jqr", "jra", "jrb", "jrr", "jrt", "jru", "jsl", "jua", "jub", "juc", "jud", "juh", "jui", "juk", "jul", "jum", "jun", "juo", "jup", "jur", "jus", "jut", "juu", "juw", "juy", "jvd", "jvn", "jwi", "jya", "jye", "jyy"], + ["ka", "kg", "ki", "kj", "kk", "kl", "km", "kn", "ko", "kr", "ks", "ku", "kv", "kw", "ky", "kaa", "kab", "kac", "kad", "kae", "kaf", "kag", "kah", "kai", "kaj", "kak", "kam", "kao", "kap", "kaq", "kar", "kav", "kaw", "kax", "kay", "kba", "kbb", "kbc", "kbd", "kbe", "kbf", "kbg", "kbh", "kbi", "kbj", "kbk", "kbl", "kbm", "kbn", "kbo", "kbp", "kbq", "kbr", "kbs", "kbt", "kbu", "kbv", "kbw", "kbx", "kby", "kbz", "kca", "kcb", "kcc", "kcd", "kce", "kcf", "kcg", "kch", "kci", "kcj", "kck", "kcl", "kcm", "kcn", "kco", "kcp", "kcq", "kcr", "kcs", "kct", "kcu", "kcv", "kcw", "kcx", "kcy", "kcz", "kda", "kdc", "kdd", "kde", "kdf", "kdg", "kdh", "kdi", "kdj", "kdk", "kdl", "kdm", "kdn", "kdo", "kdp", "kdq", "kdr", "kdt", "kdu", "kdv", "kdw", "kdx", "kdy", "kdz", "kea", "keb", "kec", "ked", "kee", "kef", "keg", "keh", "kei", "kej", "kek", "kel", "kem", "ken", "keo", "kep", "keq", "ker", "kes", "ket", "keu", "kev", "kew", "kex", "key", "kez", "kfa", "kfb", "kfc", "kfd", "kfe", "kff", "kfg", "kfh", "kfi", "kfj", "kfk", "kfl", "kfm", "kfn", "kfo", "kfp", "kfq", "kfr", "kfs", "kft", "kfu", "kfv", "kfw", "kfx", "kfy", "kfz", "kga", "kgb", "kgc", "kgd", "kge", "kgf", "kgg", "kgh", "kgi", "kgj", "kgk", "kgl", "kgm", "kgn", "kgo", "kgp", "kgq", "kgr", "kgs", "kgt", "kgu", "kgv", "kgw", "kgx", "kgy", "kha", "lyg", "khb", "khc", "khd", "khe", "khf", "khg", "khh", "khi", "khj", "khk", "khl", "khn", "kho", "khp", "khq", "khr", "khs", "kht", "khu", "khv", "khw", "khx", "khy", "khz", "kia", "kib", "kic", "kid", "kie", "kif", "kig", "kih", "kii", "kij", "kil", "kim", "kio", "kip", "kiq", "kis", "kit", "kiu", "kiv", "kiw", "kix", "kiy", "kiz", "kja", "kjb", "kjc", "kjd", "kje", "kjf", "kjg", "kjh", "kji", "kjj", "kjk", "kjl", "kjm", "kjn", "kjo", "kjp", "kjq", "kjr", "kjs", "kjt", "kju", "kjv", "kjx", "kjy", "kjz", "kka", "kkb", "kkc", "kkd", "kke", "kkf", "kkg", "kkh", "kki", "kkj", "kkk", "kkl", "kkm", "kkn", "kko", "kkp", "kkq", "kkr", "kks", "kkt", "kku", "kkv", "kkw", "kkx", "kky", "kkz", "kla", "klb", "klc", "kld", "kle", "klf", "klg", "klh", "kli", "klj", "klk", "kll", "klm", "kln", "klo", "klp", "klq", "klr", "kls", "klt", "klu", "klv", "klw", "klx", "kly", "klz", "kma", "kmb", "kmc", "kmd", "kme", "kmf", "kmg", "kmh", "kmi", "kmj", "kmk", "kml", "kmm", "kmn", "kmo", "kmp", "kmq", "kmr", "kms", "kmt", "kmu", "kmv", "kmw", "kmx", "kmy", "kmz", "kna", "knb", "knc", "knd", "kne", "knf", "kng", "kni", "knj", "knk", "knl", "knm", "knn", "kno", "knp", "knq", "knr", "kns", "knt", "knu", "knv", "knw", "knx", "kny", "knz", "koa", "koc", "kod", "koe", "kof", "kog", "koh", "koi", "koj", "kok", "kol", "koo", "kop", "koq", "kos", "kot", "kou", "kov", "kow", "kox", "koy", "koz", "kpa", "kpb", "kpc", "kpd", "kpe", "kpf", "kpg", "kph", "kpi", "kpj", "kpk", "kpl", "kpm", "kpn", "kpo", "kpp", "kpq", "kpr", "kps", "kpt", "kpu", "kpv", "kpw", "kpx", "kpy", "kpz", "kqa", "kqb", "kqc", "kqd", "kqe", "kqf", "kqg", "kqh", "kqi", "kqj", "kqk", "kql", "kqm", "kqn", "kqo", "kqp", "kqq", "kqr", "kqs", "kqt", "kqu", "kqv", "kqw", "kqx", "kqy", "kqz", "kra", "krb", "krc", "krd", "kre", "krf", "krh", "kri", "krj", "krk", "krl", "krm", "krn", "kro", "krp", "krr", "krs", "krt", "kru", "krv", "krw", "krx", "kry", "krz", "ksa", "ksb", "ksc", "ksd", "kse", "ksf", "ksg", "ksh", "ksi", "ksj", "ksk", "ksl", "ksm", "ksn", "kso", "ksp", "ksq", "ksr", "kss", "kst", "ksu", "ksv", "ksw", "ksx", "ksy", "ksz", "kta", "ktb", "ktc", "ktd", "kte", "ktf", "ktg", "kth", "kti", "ktj", "ktk", "ktl", "ktm", "ktn", "kto", "ktp", "ktq", "ktr", "kts", "ktt", "ktu", "ktv", "ktw", "ktx", "kty", "ktz", "kub", "kuc", "kud", "kue", "kuf", "kug", "kuh", "kui", "kuj", "kuk", "kul", "kum", "kun", "kuo", "kup", "kuq", "kus", "kut", "kuu", "kuv", "kuw", "kux", "kuy", "kuz", "kva", "kvb", "kvc", "kvd", "kve", "kvf", "kvg", "kvh", "kvi", "kvj", "kvk", "kvl", "kvm", "kvn", "kvo", "kvp", "kvq", "kvr", "kvs", "kvt", "kvu", "kvv", "kvw", "kvx", "kvy", "kvz", "kwa", "kwb", "kwc", "kwd", "kwe", "kwf", "kwg", "kwh", "kwi", "kwj", "kwk", "kwl", "kwm", "kwn", "kwo", "kwp", "kwq", "kwr", "kws", "kwt", "kwu", "kwv", "kww", "kwx", "kwy", "kwz", "kxa", "kxb", "kxc", "kxd", "kxe", "kxf", "kxh", "kxi", "kxj", "kxk", "kxl", "kxm", "kxn", "kxo", "kxp", "kxq", "kxr", "kxs", "kxt", "kxu", "kxv", "kxw", "kxx", "kxy", "kxz", "kya", "kyb", "kyc", "kyd", "kye", "kyf", "kyg", "kyh", "kyi", "kyj", "kyk", "kyl", "kym", "kyn", "kyo", "kyp", "kyq", "kyr", "kys", "kyt", "kyu", "kyv", "kyw", "kyx", "kyy", "kyz", "kza", "kzb", "kzc", "kzd", "kze", "kzf", "kzg", "kzh", "kzi", "kzj", "kzk", "kzl", "kzm", "kzn", "kzo", "kzp", "kzq", "kzr", "kzs", "kzt", "kzu", "kzv", "kzw", "kzx", "kzy", "kzz"], + ["la", "lb", "lg", "li", "ln", "lo", "lt", "lu", "lv", "laa", "lab", "lac", "lad", "lae", "laf", "lag", "lah", "lai", "laj", "lak", "lal", "lam", "lan", "lap", "laq", "lar", "las", "lau", "law", "lax", "lay", "laz", "lba", "lbb", "lbc", "lbe", "lbf", "lbg", "lbi", "lbj", "lbk", "lbl", "lbm", "lbn", "lbo", "lbq", "lbr", "lbs", "lbt", "lbu", "lbv", "lbw", "lbx", "lby", "lbz", "lcc", "lcd", "lce", "lcf", "lch", "lcl", "lcm", "lcp", "lcq", "lcs", "lda", "ldb", "ldd", "ldg", "ldh", "ldi", "ldj", "ldk", "ldl", "ldm", "ldn", "ldo", "ldp", "ldq", "lea", "leb", "lec", "led", "lee", "lef", "leg", "leh", "lei", "lej", "lek", "lel", "lem", "len", "leo", "lep", "leq", "ler", "les", "let", "leu", "lev", "lew", "lex", "ley", "lez", "lfa", "lfn", "lga", "lgb", "lgg", "lgh", "lgi", "lgk", "lgl", "lgm", "lgn", "lgq", "lgr", "lgt", "lgu", "lgz", "lha", "lhh", "lhi", "lhl", "lhm", "lhn", "lhp", "lhs", "lht", "lhu", "lia", "lib", "lic", "lid", "lie", "lif", "lig", "lih", "lii", "lij", "lik", "lil", "lio", "lip", "liq", "lir", "lis", "liu", "liv", "liw", "lix", "liy", "liz", "lja", "lje", "lji", "ljl", "ljp", "ljw", "ljx", "lka", "lkb", "lkc", "lkd", "lke", "lkh", "lki", "lkj", "lkl", "lkm", "lkn", "lko", "lkr", "lks", "lkt", "lku", "lky", "lla", "llb", "llc", "lld", "lle", "llf", "llg", "llh", "lli", "llj", "llk", "lll", "llm", "lln", "llo", "llp", "llq", "lls", "llu", "llx", "lma", "lmb", "lmc", "lmd", "lme", "lmf", "lmg", "lmh", "lmi", "lmj", "lmk", "lml", "lmm", "lmn", "lmo", "lmp", "lmq", "lmr", "lmu", "lmv", "lmw", "lmx", "lmy", "lmz", "lna", "lnb", "lnd", "lng", "lnh", "lni", "lnj", "lnl", "lnm", "lnn", "lno", "lns", "lnu", "lnw", "lnz", "loa", "lob", "loc", "loe", "lof", "log", "loh", "loi", "loj", "lok", "lol", "lom", "lon", "loo", "lop", "loq", "lor", "los", "lot", "lou", "lov", "low", "lox", "loy", "loz", "lpa", "lpe", "lpn", "lpo", "lpx", "lra", "lrc", "lre", "lrg", "lri", "lrk", "lrl", "lrm", "lrn", "lro", "lrr", "lrt", "lrv", "lrz", "lsa", "lsb", "lsd", "lse", "lsg", "lsh", "lsi", "lsl", "lsm", "lsn", "lso", "lsp", "lsr", "lss", "lst", "lsv", "lsy", "ltc", "ltg", "lth", "lti", "ltn", "lto", "lts", "ltu", "lua", "luc", "lud", "lue", "luf", "lui", "luj", "luk", "lul", "lum", "lun", "luo", "lup", "luq", "lur", "lus", "lut", "luu", "luv", "luw", "luy", "luz", "lva", "lvi", "lvk", "lvs", "lvu", "lwa", "lwe", "lwg", "lwh", "lwl", "lwm", "lwo", "lws", "lwt", "lwu", "lww", "lxm", "lya", "lyg", "lyn", "lzh", "lzl", "lzn", "lzz"], + ["mg", "mh", "mi", "mk", "ml", "mn", "mo", "mr", "ms", "mt", "my", "maa", "mab", "mad", "mae", "maf", "mag", "mai", "maj", "mak", "mam", "man", "map", "maq", "mas", "mat", "mau", "mav", "maw", "max", "maz", "mba", "mbb", "mbc", "mbd", "mbe", "mbf", "mbh", "mbi", "mbj", "mbk", "mbl", "mbm", "mbn", "mbo", "mbp", "mbq", "mbr", "mbs", "mbt", "mbu", "mbv", "mbw", "mbx", "mby", "mbz", "mca", "mcb", "mcc", "mcd", "mce", "mcf", "mcg", "mch", "mci", "mcj", "mck", "mcl", "mcm", "mcn", "mco", "mcp", "mcq", "mcr", "mcs", "mct", "mcu", "mcv", "mcw", "mcx", "mcy", "mcz", "mda", "mdb", "mdc", "mdd", "mde", "mdf", "mdg", "mdh", "mdi", "mdj", "mdk", "mdl", "mdm", "mdn", "mdp", "mdq", "mdr", "mds", "mdt", "mdu", "mdv", "mdw", "mdx", "mdy", "mdz", "mea", "meb", "mec", "med", "mee", "mef", "meg", "meh", "mei", "mej", "mek", "mel", "mem", "men", "meo", "mep", "meq", "mer", "mes", "met", "meu", "mev", "mew", "mey", "mez", "mfa", "mfb", "mfc", "mfd", "mfe", "mff", "mfg", "mfh", "mfi", "mfj", "mfk", "mfl", "mfm", "mfn", "mfo", "mfp", "mfq", "mfr", "mfs", "mft", "mfu", "mfv", "mfw", "mfx", "mfy", "mfz", "mga", "mgb", "mgc", "mgd", "mge", "mgf", "mgg", "mgh", "mgi", "mgj", "mgk", "mgl", "mgm", "mgn", "mgo", "mgp", "mgq", "mgr", "mgs", "mgt", "mgu", "mgv", "mgw", "mgx", "mgy", "mgz", "mha", "mhb", "mhc", "mhd", "mhe", "mhf", "mhg", "mhh", "mhi", "mhj", "mhk", "mhl", "mhm", "mhn", "mho", "mhp", "mhq", "mhr", "mhs", "mht", "mhu", "mhw", "mhx", "mhy", "mhz", "mia", "mib", "mic", "mid", "mie", "mif", "mig", "mih", "mii", "mij", "mik", "mil", "mim", "min", "mio", "mip", "miq", "mir", "mis", "mit", "miu", "miw", "mix", "miy", "miz", "mja", "mjb", "mjc", "mjd", "mje", "mjg", "mjh", "mji", "mjj", "mjk", "mjl", "mjm", "mjn", "mjo", "mjp", "mjq", "mjr", "mjs", "mjt", "mju", "mjv", "mjw", "mjx", "mjy", "mjz", "mka", "mkb", "mkc", "mke", "mkf", "mkg", "mkh", "mki", "mkj", "mkk", "mkl", "mkm", "mkn", "mko", "mkp", "mkq", "mkr", "mks", "mkt", "mku", "mkv", "mkw", "mkx", "mky", "mkz", "mla", "mlb", "mlc", "mld", "mle", "mlf", "mlh", "mli", "mlj", "mlk", "mll", "mlm", "mln", "mlo", "mlp", "mlq", "mlr", "mls", "mlu", "mlv", "mlw", "mlx", "mlz", "mma", "mmb", "mmc", "mmd", "mme", "mmf", "mmg", "mmh", "mmi", "mmj", "mmk", "mml", "mmm", "mmn", "mmo", "mmp", "mmq", "mmr", "mmt", "mmu", "mmv", "mmw", "mmx", "mmy", "mmz", "mna", "mnb", "mnc", "mnd", "mne", "mnf", "mng", "mnh", "mni", "mnj", "mnk", "mnl", "mnm", "mnn", "mno", "mnp", "mnq", "mnr", "mns", "mnt", "mnu", "mnv", "mnw", "mnx", "mny", "mnz", "moa", "moc", "mod", "moe", "mof", "mog", "moh", "moi", "moj", "mok", "mom", "moo", "mop", "moq", "mor", "mos", "mot", "mou", "mov", "mow", "mox", "moy", "moz", "mpa", "mpb", "mpc", "mpd", "mpe", "mpg", "mph", "mpi", "mpj", "mpk", "mpl", "mpm", "mpn", "mpo", "mpp", "mpq", "mpr", "mps", "mpt", "mpu", "mpv", "mpw", "mpx", "mpy", "mpz", "mqa", "mqb", "mqc", "mqe", "mqf", "mqg", "mqh", "mqi", "mqj", "mqk", "mql", "mqm", "mqn", "mqo", "mqp", "mqq", "mqr", "mqs", "mqt", "mqu", "mqv", "mqw", "mqx", "mqy", "mqz", "mra", "mrb", "mrc", "mrd", "mre", "mrf", "mrg", "mrh", "mrj", "mrk", "mrl", "mrm", "mrn", "mro", "mrp", "mrq", "mrr", "mrs", "mrt", "mru", "mrv", "mrw", "mrx", "mry", "mrz", "msb", "msc", "msd", "mse", "msf", "msg", "msh", "msi", "msj", "msk", "msl", "msm", "msn", "mso", "msp", "msq", "msr", "mss", "mst", "msu", "msv", "msw", "msx", "msy", "msz", "mta", "mtb", "mtc", "mtd", "mte", "mtf", "mtg", "mth", "mti", "mtj", "mtk", "mtl", "mtm", "mtn", "mto", "mtp", "mtq", "mtr", "mts", "mtt", "mtu", "mtv", "mtw", "mtx", "mty", "mua", "mub", "muc", "mud", "mue", "mug", "muh", "mui", "muj", "muk", "mul", "mum", "mun", "muo", "mup", "muq", "mur", "mus", "mut", "muu", "muv", "mux", "muy", "muz", "mva", "mvb", "mvd", "mve", "mvf", "mvg", "mvh", "mvi", "mvk", "mvl", "mvm", "mvn", "mvo", "mvp", "mvq", "mvr", "mvs", "mvt", "mvu", "mvv", "mvw", "mvx", "mvy", "mvz", "mwa", "mwb", "mwc", "mwd", "mwe", "mwf", "mwg", "mwh", "mwi", "mwj", "mwk", "mwl", "mwm", "mwn", "mwo", "mwp", "mwq", "mwr", "mws", "mwt", "mwu", "mwv", "mww", "mwx", "mwy", "mwz", "mxa", "mxb", "mxc", "mxd", "mxe", "mxf", "mxg", "mxh", "mxi", "mxj", "mxk", "mxl", "mxm", "mxn", "mxo", "mxp", "mxq", "mxr", "mxs", "mxt", "mxu", "mxv", "mxw", "mxx", "mxy", "mxz", "myb", "myc", "myd", "mye", "myf", "myg", "myh", "myi", "myj", "myk", "myl", "mym", "myn", "myo", "myp", "myq", "myr", "mys", "myt", "myu", "myv", "myw", "myx", "myy", "myz", "mza", "mzb", "mzc", "mzd", "mze", "mzg", "mzh", "mzi", "mzj", "mzk", "mzl", "mzm", "mzn", "mzo", "mzp", "mzq", "mzr", "mzs", "mzt", "mzu", "mzv", "mzw", "mzx", "mzy", "mzz"], + ["na", "nb", "nd", "ne", "ng", "nl", "nn", "no", "nr", "nv", "ny", "naa", "nab", "nac", "nad", "nae", "naf", "nag", "nah", "nai", "naj", "nak", "nal", "nam", "nan", "nao", "nap", "naq", "nar", "nas", "nat", "naw", "nax", "nay", "naz", "nba", "nbb", "nbc", "nbd", "nbe", "nbf", "nbg", "nbh", "nbi", "nbj", "nbk", "nbm", "nbn", "nbo", "nbp", "nbq", "nbr", "nbs", "nbt", "nbu", "nbv", "nbw", "nbx", "nby", "nca", "ncb", "ncc", "ncd", "nce", "ncf", "ncg", "nch", "nci", "ncj", "nck", "ncl", "ncm", "ncn", "nco", "ncp", "ncq", "ncr", "ncs", "nct", "ncu", "ncx", "ncz", "nda", "ndb", "ndc", "ndd", "ndf", "ndg", "ndh", "ndi", "ndj", "ndk", "ndl", "ndm", "ndn", "ndp", "ndq", "ndr", "nds", "ndt", "ndu", "ndv", "ndw", "ndx", "ndy", "ndz", "nea", "neb", "nec", "ned", "nee", "nef", "neg", "neh", "nei", "nej", "nek", "nem", "nen", "neo", "neq", "ner", "nes", "net", "neu", "nev", "new", "nex", "ney", "nez", "nfa", "nfd", "nfl", "nfr", "nfu", "nga", "ngb", "ngc", "ngd", "nge", "ngf", "ngg", "ngh", "ngi", "ngj", "ngk", "ngl", "ngm", "ngn", "ngo", "ngp", "ngq", "ngr", "ngs", "ngt", "ngu", "ngv", "ngw", "ngx", "ngy", "ngz", "nha", "nhb", "nhc", "nhd", "nhe", "nhf", "nhg", "nhh", "nhi", "nhk", "nhm", "nhn", "nho", "nhp", "nhq", "nhr", "nht", "nhu", "nhv", "nhw", "nhx", "nhy", "nhz", "nia", "nib", "nic", "nid", "nie", "nif", "nig", "nih", "nii", "nij", "nik", "nil", "nim", "nin", "nio", "niq", "nir", "nis", "nit", "niu", "niv", "niw", "nix", "niy", "niz", "nja", "njb", "njd", "njh", "nji", "njj", "njl", "njm", "njn", "njo", "njr", "njs", "njt", "nju", "njx", "njy", "njz", "nka", "nkb", "nkc", "nkd", "nke", "nkf", "nkg", "nkh", "nki", "nkj", "nkk", "nkm", "nkn", "nko", "nkp", "nkq", "nkr", "nks", "nkt", "nku", "nkv", "nkw", "nkx", "nkz", "nla", "nlc", "nle", "nlg", "nli", "nlj", "nlk", "nll", "nlm", "nln", "nlo", "nlq", "nlr", "nlu", "nlv", "nlw", "nlx", "nly", "nlz", "nma", "nmb", "nmc", "nmd", "nme", "nmf", "nmg", "nmh", "nmi", "nmj", "nmk", "nml", "nmm", "nmn", "nmo", "nmp", "nmq", "nmr", "nms", "nmt", "nmu", "nmv", "nmw", "nmx", "nmy", "nmz", "nna", "nnb", "nnc", "nnd", "nne", "nnf", "nng", "nnh", "nni", "nnj", "nnk", "nnl", "nnm", "nnn", "nnp", "nnq", "nnr", "nns", "nnt", "nnu", "nnv", "nnw", "nnx", "nny", "nnz", "noa", "noc", "nod", "noe", "nof", "nog", "noh", "noi", "noj", "nok", "nol", "nom", "non", "noo", "nop", "noq", "nos", "not", "nou", "nov", "now", "noy", "noz", "npa", "npb", "npg", "nph", "npi", "npl", "npn", "npo", "nps", "npu", "npx", "npy", "nqg", "nqk", "nql", "nqm", "nqn", "nqo", "nqq", "nqt", "nqy", "nra", "nrb", "nrc", "nre", "nrf", "nrg", "nri", "nrk", "nrl", "nrm", "nrn", "nrp", "nrr", "nrt", "nru", "nrx", "nrz", "nsa", "nsb", "nsc", "nsd", "nse", "nsf", "nsg", "nsh", "nsi", "nsk", "nsl", "nsm", "nsn", "nso", "nsp", "nsq", "nsr", "nss", "nst", "nsu", "nsv", "nsw", "nsx", "nsy", "nsz", "ntd", "nte", "ntg", "nti", "ntj", "ntk", "ntm", "nto", "ntp", "ntr", "nts", "ntu", "ntw", "ntx", "nty", "ntz", "nua", "nub", "nuc", "nud", "nue", "nuf", "nug", "nuh", "nui", "nuj", "nuk", "nul", "num", "nun", "nuo", "nup", "nuq", "nur", "nus", "nut", "nuu", "nuv", "nuw", "nux", "nuy", "nuz", "nvh", "nvm", "nvo", "nwa", "nwb", "nwc", "nwe", "nwg", "nwi", "nwm", "nwo", "nwr", "nwx", "nwy", "nxa", "nxd", "nxe", "nxg", "nxi", "nxk", "nxl", "nxm", "nxn", "nxo", "nxq", "nxr", "nxu", "nxx", "nyb", "nyc", "nyd", "nye", "nyf", "nyg", "nyh", "nyi", "nyj", "nyk", "nyl", "nym", "nyn", "nyo", "nyp", "nyq", "nyr", "nys", "nyt", "nyu", "nyv", "nyw", "nyx", "nyy", "nza", "nzb", "nzd", "nzi", "nzk", "nzm", "nzs", "nzu", "nzy", "nzz"], + ["oc", "oj", "om", "or", "os", "oaa", "oac", "oar", "oav", "obi", "obk", "obl", "obm", "obo", "obr", "obt", "obu", "oca", "och", "ocm", "oco", "ocu", "oda", "odk", "odt", "odu", "ofo", "ofs", "ofu", "ogb", "ogc", "oge", "ogg", "ogo", "ogu", "oht", "ohu", "oia", "oin", "ojb", "ojc", "ojg", "ojp", "ojs", "ojv", "ojw", "oka", "okb", "okc", "okd", "oke", "okg", "okh", "oki", "okj", "okk", "okl", "okm", "okn", "oko", "okr", "oks", "oku", "okv", "okx", "okz", "ola", "old", "ole", "olk", "olm", "olo", "olr", "olt", "olu", "oma", "omb", "omc", "ome", "omg", "omi", "omk", "oml", "omn", "omo", "omp", "omq", "omr", "omt", "omu", "omv", "omw", "omx", "omy", "ona", "onb", "one", "ong", "oni", "onj", "onk", "onn", "ono", "onp", "onr", "ons", "ont", "onu", "onw", "onx", "ood", "oog", "oon", "oor", "oos", "opa", "opk", "opm", "opo", "opt", "opy", "ora", "orc", "ore", "org", "orh", "orn", "oro", "orr", "ors", "ort", "oru", "orv", "orw", "orx", "ory", "orz", "osa", "osc", "osi", "osn", "oso", "osp", "ost", "osu", "osx", "ota", "otb", "otd", "ote", "oti", "otk", "otl", "otm", "otn", "oto", "otq", "otr", "ots", "ott", "otu", "otw", "otx", "oty", "otz", "oua", "oub", "oue", "oui", "oum", "oun", "ovd", "owi", "owl", "oyb", "oyd", "oym", "oyy", "ozm"], + ["pa", "pi", "pl", "ps", "pt", "paa", "pab", "pac", "pad", "pae", "paf", "pag", "pah", "pai", "pak", "pal", "pam", "pao", "pap", "paq", "par", "pas", "pat", "pau", "pav", "paw", "pax", "pay", "paz", "pbb", "pbc", "pbe", "pbf", "pbg", "pbh", "pbi", "pbl", "pbm", "pbn", "pbo", "pbp", "pbr", "pbs", "pbt", "pbu", "pbv", "pby", "pbz", "pca", "pcb", "pcc", "pcd", "pce", "pcf", "pcg", "pch", "pci", "pcj", "pck", "pcl", "pcm", "pcn", "pcp", "pcr", "pcw", "pda", "pdc", "pdi", "pdn", "pdo", "pdt", "pdu", "pea", "peb", "ped", "pee", "pef", "peg", "peh", "pei", "pej", "pek", "pel", "pem", "peo", "pep", "peq", "pes", "pev", "pex", "pey", "pez", "pfa", "pfe", "pfl", "pga", "pgd", "pgg", "pgi", "pgk", "pgl", "pgn", "pgs", "pgu", "pgy", "pgz", "pha", "phd", "phg", "phh", "phi", "phk", "phl", "phm", "phn", "pho", "phq", "phr", "pht", "phu", "phv", "phw", "pia", "pib", "pic", "pid", "pie", "pif", "pig", "pih", "pii", "pij", "pil", "pim", "pin", "pio", "pip", "pir", "pis", "pit", "piu", "piv", "piw", "pix", "piy", "piz", "pjt", "pka", "pkb", "pkc", "pkg", "pkh", "pkn", "pko", "pkp", "pkr", "pks", "pkt", "pku", "pla", "plb", "plc", "pld", "ple", "plf", "plg", "plh", "plj", "plk", "pll", "pln", "plo", "plp", "plq", "plr", "pls", "plt", "plu", "plv", "plw", "ply", "plz", "pma", "pmb", "pmc", "pmd", "pme", "pmf", "pmh", "pmi", "pmj", "pmk", "pml", "pmm", "pmn", "pmo", "pmq", "pmr", "pms", "pmt", "pmu", "pmw", "pmx", "pmy", "pmz", "pna", "pnb", "pnc", "pnd", "pne", "png", "pnh", "pni", "pnj", "pnk", "pnl", "pnm", "pnn", "pno", "pnp", "pnq", "pnr", "pns", "pnt", "pnu", "pnv", "pnw", "pnx", "pny", "pnz", "poc", "pod", "poe", "pof", "pog", "poh", "poi", "pok", "pom", "pon", "poo", "pop", "poq", "pos", "pot", "pov", "pow", "pox", "poy", "poz", "ppa", "ppe", "ppi", "ppk", "ppl", "ppm", "ppn", "ppo", "ppp", "ppq", "ppr", "pps", "ppt", "ppu", "pqa", "pqe", "pqm", "pqw", "pra", "prb", "prc", "prd", "pre", "prf", "prg", "prh", "pri", "prk", "prl", "prm", "prn", "pro", "prp", "prq", "prr", "prs", "prt", "pru", "prw", "prx", "pry", "prz", "psa", "psc", "psd", "pse", "psg", "psh", "psi", "psl", "psm", "psn", "pso", "psp", "psq", "psr", "pss", "pst", "psu", "psw", "psy", "pta", "pth", "pti", "ptn", "pto", "ptp", "ptq", "ptr", "ptt", "ptu", "ptv", "ptw", "pty", "pua", "pub", "puc", "pud", "pue", "puf", "pug", "pui", "puj", "puk", "pum", "puo", "pup", "puq", "pur", "put", "puu", "puw", "pux", "puy", "puz", "pwa", "pwb", "pwg", "pwi", "pwm", "pwn", "pwo", "pwr", "pww", "pxm", "pye", "pym", "pyn", "pys", "pyu", "pyx", "pyy", "pzn"], + ["qu", "qua", "qub", "quc", "qud", "quf", "qug", "quh", "qui", "quk", "qul", "qum", "qun", "qup", "quq", "qur", "qus", "quv", "quw", "qux", "quy", "quz", "qva", "qvc", "qve", "qvh", "qvi", "qvj", "qvl", "qvm", "qvn", "qvo", "qvp", "qvs", "qvw", "qvy", "qvz", "qwa", "qwc", "qwe", "qwh", "qwm", "qws", "qwt", "qxa", "qxc", "qxh", "qxl", "qxn", "qxo", "qxp", "qxq", "qxr", "qxs", "qxt", "qxu", "qxw", "qya", "qyp"], + ["rm", "rn", "ro", "ru", "rw", "raa", "rab", "rac", "rad", "raf", "rag", "rah", "rai", "raj", "rak", "ral", "ram", "ran", "rao", "rap", "raq", "rar", "ras", "rat", "rau", "rav", "raw", "rax", "ray", "raz", "rbb", "rbk", "rbl", "rbp", "rcf", "rdb", "rea", "reb", "ree", "reg", "rei", "rej", "rel", "rem", "ren", "rer", "res", "ret", "rey", "rga", "rge", "rgk", "rgn", "rgr", "rgs", "rgu", "rhg", "rhp", "ria", "rie", "rif", "ril", "rim", "rin", "rir", "rit", "riu", "rjg", "rji", "rjs", "rka", "rkb", "rkh", "rki", "rkm", "rkt", "rkw", "rma", "rmb", "rmc", "rmd", "rme", "rmf", "rmg", "rmh", "rmi", "rmk", "rml", "rmm", "rmn", "rmo", "rmp", "rmq", "rmr", "rms", "rmt", "rmu", "rmv", "rmw", "rmx", "rmy", "rmz", "rna", "rnd", "rng", "rnl", "rnn", "rnp", "rnr", "rnw", "roa", "rob", "roc", "rod", "roe", "rof", "rog", "rol", "rom", "roo", "rop", "ror", "rou", "row", "rpn", "rpt", "rri", "rro", "rrt", "rsb", "rsi", "rsl", "rsm", "rtc", "rth", "rtm", "rts", "rtw", "rub", "ruc", "rue", "ruf", "rug", "ruh", "rui", "ruk", "ruo", "rup", "ruq", "rut", "ruu", "ruy", "ruz", "rwa", "rwk", "rwl", "rwm", "rwo", "rwr", "rxd", "rxw", "ryn", "rys", "ryu", "rzh"], + ["sa", "sc", "sd", "se", "sg", "sh", "si", "sk", "sl", "sm", "sn", "so", "sq", "sr", "ss", "st", "su", "sv", "sw", "saa", "sab", "sac", "sad", "sae", "saf", "sah", "sai", "saj", "sak", "sal", "sam", "sao", "sap", "saq", "sar", "sas", "sat", "sau", "sav", "saw", "sax", "say", "saz", "sba", "sbb", "sbc", "sbd", "sbe", "sbf", "sbg", "sbh", "sbi", "sbj", "sbk", "sbl", "sbm", "sbn", "sbo", "sbp", "sbq", "sbr", "sbs", "sbt", "sbu", "sbv", "sbw", "sbx", "sby", "sbz", "sca", "scb", "sce", "scf", "scg", "sch", "sci", "sck", "scl", "scn", "sco", "scp", "scq", "scs", "sct", "scu", "scv", "scw", "scx", "sda", "sdb", "sdc", "sde", "sdf", "sdg", "sdh", "sdj", "sdk", "sdl", "sdm", "sdn", "sdo", "sdp", "sdq", "sdr", "sds", "sdt", "sdu", "sdv", "sdx", "sdz", "sea", "seb", "sec", "sed", "see", "sef", "seg", "seh", "sei", "sej", "sek", "sel", "sem", "sen", "seo", "sep", "seq", "ser", "ses", "set", "seu", "sev", "sew", "sey", "sez", "sfb", "sfe", "sfm", "sfs", "sfw", "sga", "sgb", "sgc", "sgd", "sge", "sgg", "sgh", "sgi", "sgj", "sgk", "sgl", "sgm", "sgn", "sgo", "sgp", "sgr", "sgs", "sgt", "sgu", "sgw", "sgx", "sgy", "sgz", "sha", "shb", "shc", "shd", "she", "shg", "shh", "shi", "shj", "shk", "shl", "shm", "shn", "sho", "shp", "shq", "shr", "shs", "sht", "shu", "shv", "shw", "shx", "shy", "shz", "sia", "sib", "sid", "sie", "sif", "sig", "sih", "sii", "sij", "sik", "sil", "sim", "sio", "sip", "siq", "sir", "sis", "sit", "siu", "siv", "siw", "six", "siy", "siz", "sja", "sjb", "sjd", "sje", "sjg", "sjk", "sjl", "sjm", "sjn", "sjo", "sjp", "sjr", "sjs", "sjt", "sju", "sjw", "ska", "skb", "skc", "skd", "ske", "skf", "skg", "skh", "ski", "skj", "skk", "skm", "skn", "sko", "skp", "skq", "skr", "sks", "skt", "sku", "skv", "skw", "skx", "sky", "skz", "sla", "slc", "sld", "sle", "slf", "slg", "slh", "sli", "slj", "sll", "slm", "sln", "slp", "slq", "slr", "sls", "slt", "slu", "slw", "slx", "sly", "slz", "sma", "smb", "smc", "smd", "smf", "smg", "smh", "smi", "smj", "smk", "sml", "smm", "smn", "smp", "smq", "smr", "sms", "smt", "smu", "smv", "smw", "smx", "smy", "smz", "snb", "snc", "sne", "snf", "sng", "snh", "sni", "snj", "snk", "snl", "snm", "snn", "sno", "snp", "snq", "snr", "sns", "snu", "snv", "snw", "snx", "sny", "snz", "soa", "sob", "soc", "sod", "soe", "sog", "soh", "soi", "soj", "sok", "sol", "son", "soo", "sop", "soq", "sor", "sos", "sou", "sov", "sow", "sox", "soy", "soz", "spb", "spc", "spd", "spe", "spg", "spi", "spk", "spl", "spm", "spn", "spo", "spp", "spq", "spr", "sps", "spt", "spu", "spv", "spx", "spy", "sqa", "sqh", "sqj", "sqk", "sqm", "sqn", "sqo", "sqq", "sqr", "sqs", "sqt", "squ", "sqx", "sra", "srb", "src", "sre", "srf", "srg", "srh", "sri", "srk", "srl", "srm", "srn", "sro", "srq", "srr", "srs", "srt", "sru", "srv", "srw", "srx", "sry", "srz", "ssa", "ssb", "ssc", "ssd", "sse", "ssf", "ssg", "ssh", "ssi", "ssj", "ssk", "ssl", "ssm", "ssn", "sso", "ssp", "ssq", "ssr", "sss", "sst", "ssu", "ssv", "ssx", "ssy", "ssz", "sta", "stb", "std", "ste", "stf", "stg", "sth", "sti", "stj", "stk", "stl", "stm", "stn", "sto", "stp", "stq", "str", "sts", "stt", "stu", "stv", "stw", "sty", "sua", "sub", "suc", "sue", "sug", "sui", "suj", "suk", "sul", "sum", "suo", "suq", "sur", "sus", "sut", "suv", "suw", "sux", "suy", "suz", "sva", "svb", "svc", "sve", "svk", "svm", "svr", "svs", "svx", "swb", "swc", "swf", "swg", "swh", "swi", "swj", "swk", "swl", "swm", "swn", "swo", "swp", "swq", "swr", "sws", "swt", "swu", "swv", "sww", "swx", "swy", "sxb", "sxc", "sxe", "sxg", "sxk", "sxl", "sxm", "sxn", "sxo", "sxr", "sxs", "sxu", "sxw", "sya", "syb", "syc", "syd", "syi", "syk", "syl", "sym", "syn", "syo", "syr", "sys", "syw", "syx", "syy", "sza", "szb", "szc", "szd", "sze", "szg", "szl", "szn", "szp", "szs", "szv", "szw", "szy"], + ["ta", "te", "tg", "th", "ti", "tk", "tl", "tn", "to", "tr", "ts", "tt", "tw", "ty", "taa", "tab", "tac", "tad", "tae", "taf", "tag", "tai", "taj", "tak", "tal", "tan", "tao", "tap", "taq", "tar", "tas", "tau", "tav", "taw", "tax", "tay", "taz", "tba", "tbb", "tbc", "tbd", "tbe", "tbf", "tbg", "tbh", "tbi", "tbj", "tbk", "tbl", "tbm", "tbn", "tbo", "tbp", "tbq", "tbr", "tbs", "tbt", "tbu", "tbv", "tbw", "tbx", "tby", "tbz", "tca", "tcb", "tcc", "tcd", "tce", "tcf", "tcg", "tch", "tci", "tck", "tcl", "tcm", "tcn", "tco", "tcp", "tcq", "tcs", "tct", "tcu", "tcw", "tcx", "tcy", "tcz", "tda", "tdb", "tdc", "tdd", "tde", "tdf", "tdg", "tdh", "tdi", "tdj", "tdk", "tdl", "tdm", "tdn", "tdo", "tdq", "tdr", "tds", "tdt", "tdu", "tdv", "tdx", "tdy", "tea", "teb", "tec", "ted", "tee", "tef", "teg", "teh", "tei", "tek", "tem", "ten", "teo", "tep", "teq", "ter", "tes", "tet", "teu", "tev", "tew", "tex", "tey", "tez", "tfi", "tfn", "tfo", "tfr", "tft", "tga", "tgb", "tgc", "tgd", "tge", "tgf", "tgg", "tgh", "tgi", "tgj", "tgn", "tgo", "tgp", "tgq", "tgr", "tgs", "tgt", "tgu", "tgv", "tgw", "tgx", "tgy", "tgz", "thc", "thd", "the", "thf", "thh", "thi", "thk", "thl", "thm", "thn", "thp", "thq", "thr", "ths", "tht", "thu", "thv", "thw", "thx", "thy", "thz", "tia", "tic", "tid", "tie", "tif", "tig", "tih", "tii", "tij", "tik", "til", "tim", "tin", "tio", "tip", "tiq", "tis", "tit", "tiu", "tiv", "tiw", "tix", "tiy", "tiz", "tja", "tjg", "tji", "tjj", "tjl", "tjm", "tjn", "tjo", "tjp", "tjs", "tju", "tjw", "tka", "tkb", "tkd", "tke", "tkf", "tkg", "tkk", "tkl", "tkm", "tkn", "tkp", "tkq", "tkr", "tks", "tkt", "tku", "tkv", "tkw", "tkx", "tkz", "tla", "tlb", "tlc", "tld", "tlf", "tlg", "tlh", "tli", "tlj", "tlk", "tll", "tlm", "tln", "tlo", "tlp", "tlq", "tlr", "tls", "tlt", "tlu", "tlv", "tlw", "tlx", "tly", "tma", "tmb", "tmc", "tmd", "tme", "tmf", "tmg", "tmh", "tmi", "tmj", "tmk", "tml", "tmm", "tmn", "tmo", "tmp", "tmq", "tmr", "tms", "tmt", "tmu", "tmv", "tmw", "tmy", "tmz", "tna", "tnb", "tnc", "tnd", "tne", "tnf", "tng", "tnh", "tni", "tnk", "tnl", "tnm", "tnn", "tno", "tnp", "tnq", "tnr", "tns", "tnt", "tnu", "tnv", "tnw", "tnx", "tny", "tnz", "tob", "toc", "tod", "toe", "tof", "tog", "toh", "toi", "toj", "tol", "tom", "too", "top", "toq", "tor", "tos", "tou", "tov", "tow", "tox", "toy", "toz", "tpa", "tpc", "tpe", "tpf", "tpg", "tpi", "tpj", "tpk", "tpl", "tpm", "tpn", "tpo", "tpp", "tpq", "tpr", "tpt", "tpu", "tpv", "tpw", "tpx", "tpy", "tpz", "tqb", "tql", "tqm", "tqn", "tqo", "tqp", "tqq", "tqr", "tqt", "tqu", "tqw", "tra", "trb", "trc", "trd", "tre", "trf", "trg", "trh", "tri", "trj", "trk", "trl", "trm", "trn", "tro", "trp", "trq", "trr", "trs", "trt", "tru", "trv", "trw", "trx", "try", "trz", "tsa", "tsb", "tsc", "tsd", "tse", "tsf", "tsg", "tsh", "tsi", "tsj", "tsk", "tsl", "tsm", "tsp", "tsq", "tsr", "tss", "tst", "tsu", "tsv", "tsw", "tsx", "tsy", "tsz", "tta", "ttb", "ttc", "ttd", "tte", "ttf", "ttg", "tth", "tti", "ttj", "ttk", "ttl", "ttm", "ttn", "tto", "ttp", "ttq", "ttr", "tts", "ttt", "ttu", "ttv", "ttw", "tty", "ttz", "tua", "tub", "tuc", "tud", "tue", "tuf", "tug", "tuh", "tui", "tuj", "tul", "tum", "tun", "tuo", "tup", "tuq", "tus", "tut", "tuu", "tuv", "tuw", "tux", "tuy", "tuz", "tva", "tvd", "tve", "tvk", "tvl", "tvm", "tvn", "tvo", "tvs", "tvt", "tvu", "tvw", "tvx", "tvy", "twa", "twb", "twc", "twd", "twe", "twf", "twg", "twh", "twl", "twm", "twn", "two", "twp", "twq", "twr", "twt", "twu", "tww", "twx", "twy", "txa", "txb", "txc", "txe", "txg", "txh", "txi", "txj", "txm", "txn", "txo", "txq", "txr", "txs", "txt", "txu", "txx", "txy", "tya", "tye", "tyh", "tyi", "tyj", "tyl", "tyn", "typ", "tyr", "tys", "tyt", "tyu", "tyv", "tyx", "tyy", "tyz", "tza", "tzh", "tzj", "tzl", "tzm", "tzn", "tzo", "tzx"], + ["ug", "uk", "ur", "uz", "uam", "uan", "uar", "uba", "ubi", "ubl", "ubr", "ubu", "uby", "uda", "ude", "udg", "udi", "udj", "udl", "udm", "udu", "ues", "ufi", "uga", "ugb", "uge", "ugn", "ugo", "ugy", "uha", "uhn", "uis", "uiv", "uji", "uka", "ukg", "ukh", "uki", "ukk", "ukl", "ukp", "ukq", "uks", "uku", "ukv", "ukw", "uky", "ula", "ulb", "ulc", "ule", "ulf", "uli", "ulk", "ull", "ulm", "uln", "ulu", "ulw", "uma", "umb", "umc", "umd", "umg", "umi", "umm", "umn", "umo", "ump", "umr", "ums", "umu", "una", "und", "une", "ung", "uni", "unk", "unm", "unn", "unp", "unr", "unu", "unx", "unz", "uok", "upi", "upv", "ura", "urb", "urc", "ure", "urf", "urg", "urh", "uri", "urj", "urk", "url", "urm", "urn", "uro", "urp", "urr", "urt", "uru", "urv", "urw", "urx", "ury", "urz", "usa", "ush", "usi", "usk", "usp", "uss", "usu", "uta", "ute", "uth", "utp", "utr", "utu", "uum", "uun", "uur", "uuu", "uve", "uvh", "uvl", "uwa", "uya", "uzn", "uzs"], + ["ve", "vi", "vo", "vaa", "vae", "vaf", "vag", "vah", "vai", "vaj", "val", "vam", "van", "vao", "vap", "var", "vas", "vau", "vav", "vay", "vbb", "vbk", "vec", "ved", "vel", "vem", "veo", "vep", "ver", "vgr", "vgt", "vic", "vid", "vif", "vig", "vil", "vin", "vis", "vit", "viv", "vka", "vki", "vkj", "vkk", "vkl", "vkm", "vkn", "vko", "vkp", "vkt", "vku", "vkz", "vlp", "vls", "vma", "vmb", "vmc", "vmd", "vme", "vmf", "vmg", "vmh", "vmi", "vmj", "vmk", "vml", "vmm", "vmp", "vmq", "vmr", "vms", "vmu", "vmv", "vmw", "vmx", "vmy", "vmz", "vnk", "vnm", "vnp", "vor", "vot", "vra", "vro", "vrs", "vrt", "vsi", "vsl", "vsv", "vto", "vum", "vun", "vut", "vwa"], + ["wa", "wo", "waa", "wab", "wac", "wad", "wae", "waf", "wag", "wah", "wai", "waj", "wak", "wal", "wam", "wan", "wao", "wap", "waq", "war", "was", "wat", "wau", "wav", "waw", "wax", "way", "waz", "wba", "wbb", "wbe", "wbf", "wbh", "wbi", "wbj", "wbk", "wbl", "wbm", "wbp", "wbq", "wbr", "wbs", "wbt", "wbv", "wbw", "wca", "wci", "wdd", "wdg", "wdj", "wdk", "wdu", "wdy", "wea", "wec", "wed", "weg", "weh", "wei", "wem", "wen", "weo", "wep", "wer", "wes", "wet", "weu", "wew", "wfg", "wga", "wgb", "wgg", "wgi", "wgo", "wgu", "wgw", "wgy", "wha", "whg", "whk", "whu", "wib", "wic", "wie", "wif", "wig", "wih", "wii", "wij", "wik", "wil", "wim", "win", "wir", "wit", "wiu", "wiv", "wiw", "wiy", "wja", "wji", "wka", "wkb", "wkd", "wkl", "wkr", "wku", "wkw", "wky", "wla", "wlc", "wle", "wlg", "wlh", "wli", "wlk", "wll", "wlm", "wlo", "wlr", "wls", "wlu", "wlv", "wlw", "wlx", "wly", "wma", "wmb", "wmc", "wmd", "wme", "wmg", "wmh", "wmi", "wmm", "wmn", "wmo", "wms", "wmt", "wmw", "wmx", "wnb", "wnc", "wnd", "wne", "wng", "wni", "wnk", "wnm", "wnn", "wno", "wnp", "wnu", "wnw", "wny", "woa", "wob", "woc", "wod", "woe", "wof", "wog", "woi", "wok", "wom", "won", "woo", "wor", "wos", "wow", "woy", "wpc", "wra", "wrb", "wrd", "wrg", "wrh", "wri", "wrk", "wrl", "wrm", "wrn", "wro", "wrp", "wrr", "wrs", "wru", "wrv", "wrw", "wrx", "wry", "wrz", "wsa", "wsg", "wsi", "wsk", "wsr", "wss", "wsu", "wsv", "wtf", "wth", "wti", "wtk", "wtm", "wtw", "wua", "wub", "wud", "wuh", "wul", "wum", "wun", "wur", "wut", "wuu", "wuv", "wux", "wuy", "wwa", "wwb", "wwo", "wwr", "www", "wxa", "wxw", "wya", "wyb", "wyi", "wym", "wyr", "wyy"], + ["xh", "xaa", "xab", "xac", "xad", "xae", "xag", "xai", "xaj", "xak", "xal", "xam", "xan", "xao", "xap", "xaq", "xar", "xas", "xat", "xau", "xav", "xaw", "xay", "xba", "xbb", "xbc", "xbd", "xbe", "xbg", "xbi", "xbj", "xbm", "xbn", "xbo", "xbp", "xbr", "xbw", "xbx", "xby", "xcb", "xcc", "xce", "xcg", "xch", "xcl", "xcm", "xcn", "xco", "xcr", "xct", "xcu", "xcv", "xcw", "xcy", "xda", "xdc", "xdk", "xdm", "xdo", "xdy", "xeb", "xed", "xeg", "xel", "xem", "xep", "xer", "xes", "xet", "xeu", "xfa", "xga", "xgb", "xgd", "xgf", "xgg", "xgi", "xgl", "xgm", "xgn", "xgr", "xgu", "xgw", "xha", "xhc", "xhd", "xhe", "xhr", "xht", "xhu", "xhv", "xia", "xib", "xii", "xil", "xin", "xip", "xir", "xis", "xiv", "xiy", "xjb", "xjt", "xka", "xkb", "xkc", "xkd", "xke", "xkf", "xkg", "xkh", "xki", "xkj", "xkk", "xkl", "xkn", "xko", "xkp", "xkq", "xkr", "xks", "xkt", "xku", "xkv", "xkw", "xkx", "xky", "xkz", "xla", "xlb", "xlc", "xld", "xle", "xlg", "xli", "xln", "xlo", "xlp", "xls", "xlu", "xly", "xma", "xmb", "xmc", "xmd", "xme", "xmf", "xmg", "xmh", "xmj", "xmk", "xml", "xmm", "xmn", "xmo", "xmp", "xmq", "xmr", "xms", "xmt", "xmu", "xmv", "xmw", "xmx", "xmy", "xmz", "xna", "xnb", "xnd", "xng", "xnh", "xni", "xnj", "xnk", "xnm", "xnn", "xno", "xnq", "xnr", "xns", "xnt", "xnu", "xny", "xnz", "xoc", "xod", "xog", "xoi", "xok", "xom", "xon", "xoo", "xop", "xor", "xow", "xpa", "xpb", "xpc", "xpd", "xpe", "xpf", "xpg", "xph", "xpi", "xpj", "xpk", "xpl", "xpm", "xpn", "xpo", "xpp", "xpq", "xpr", "xps", "xpt", "xpu", "xpv", "xpw", "xpx", "xpy", "xpz", "xqa", "xqt", "xra", "xrb", "xrd", "xre", "xrg", "xri", "xrm", "xrn", "xrq", "xrr", "xrt", "xru", "xrw", "xsa", "xsb", "xsc", "xsd", "xse", "xsh", "xsi", "xsj", "xsl", "xsm", "xsn", "xso", "xsp", "xsq", "xsr", "xss", "xsu", "xsv", "xsy", "xta", "xtb", "xtc", "xtd", "xte", "xtg", "xth", "xti", "xtj", "xtl", "xtm", "xtn", "xto", "xtp", "xtq", "xtr", "xts", "xtt", "xtu", "xtv", "xtw", "xty", "xtz", "xua", "xub", "xud", "xug", "xuj", "xul", "xum", "xun", "xuo", "xup", "xur", "xut", "xuu", "xve", "xvi", "xvn", "xvo", "xvs", "xwa", "xwc", "xwd", "xwe", "xwg", "xwj", "xwk", "xwl", "xwo", "xwr", "xwt", "xww", "xxb", "xxk", "xxm", "xxr", "xxt", "xya", "xyb", "xyj", "xyk", "xyl", "xyt", "xyy", "xzh", "xzm", "xzp"], + ["yi", "yo", "yaa", "yab", "yac", "yad", "yae", "yaf", "yag", "yah", "yai", "yaj", "yak", "yal", "yam", "yan", "yao", "yap", "yaq", "yar", "yas", "yat", "yau", "yav", "yaw", "yax", "yay", "yaz", "yba", "ybb", "ybd", "ybe", "ybh", "ybi", "ybj", "ybk", "ybl", "ybm", "ybn", "ybo", "ybx", "yby", "ych", "ycl", "ycn", "ycp", "yda", "ydd", "yde", "ydg", "ydk", "yds", "yea", "yec", "yee", "yei", "yej", "yel", "yen", "yer", "yes", "yet", "yeu", "yev", "yey", "yga", "ygi", "ygl", "ygm", "ygp", "ygr", "ygs", "ygu", "ygw", "yha", "yhd", "yhl", "yhs", "yia", "yif", "yig", "yih", "yii", "yij", "yik", "yil", "yim", "yin", "yip", "yiq", "yir", "yis", "yit", "yiu", "yiv", "yix", "yiy", "yiz", "yka", "ykg", "yki", "ykk", "ykl", "ykm", "ykn", "yko", "ykr", "ykt", "yku", "yky", "yla", "ylb", "yle", "ylg", "yli", "yll", "ylm", "yln", "ylo", "ylr", "ylu", "yly", "yma", "ymb", "ymc", "ymd", "yme", "ymg", "ymh", "ymi", "ymk", "yml", "ymm", "ymn", "ymo", "ymp", "ymq", "ymr", "yms", "ymt", "ymx", "ymz", "yna", "ynd", "yne", "yng", "ynh", "ynk", "ynl", "ynn", "yno", "ynq", "yns", "ynu", "yob", "yog", "yoi", "yok", "yol", "yom", "yon", "yos", "yot", "yox", "yoy", "ypa", "ypb", "ypg", "yph", "ypk", "ypm", "ypn", "ypo", "ypp", "ypz", "yra", "yrb", "yre", "yri", "yrk", "yrl", "yrm", "yrn", "yro", "yrs", "yrw", "yry", "ysc", "ysd", "ysg", "ysl", "ysm", "ysn", "yso", "ysp", "ysr", "yss", "ysy", "yta", "ytl", "ytp", "ytw", "yty", "yua", "yub", "yuc", "yud", "yue", "yuf", "yug", "yui", "yuj", "yuk", "yul", "yum", "yun", "yup", "yuq", "yur", "yut", "yuu", "yuw", "yux", "yuy", "yuz", "yva", "yvt", "ywa", "ywg", "ywl", "ywn", "ywq", "ywr", "ywt", "ywu", "yww", "yxa", "yxg", "yxl", "yxm", "yxu", "yxy", "yyr", "yyu", "yyz", "yzg", "yzk"], + ["za", "zh", "zu", "zaa", "zab", "zac", "zad", "zae", "zaf", "zag", "zah", "zai", "zaj", "zak", "zal", "zam", "zao", "zap", "zaq", "zar", "zas", "zat", "zau", "zav", "zaw", "zax", "zay", "zaz", "zba", "zbc", "zbe", "zbl", "zbt", "zbu", "zbw", "zca", "zch", "zdj", "zea", "zeg", "zeh", "zen", "zga", "zgb", "zgh", "zgm", "zgn", "zgr", "zhb", "zhd", "zhi", "zhn", "zhw", "zhx", "zia", "zib", "zik", "zil", "zim", "zin", "zir", "ziw", "ziz", "zka", "zkb", "zkd", "zkg", "zkh", "zkk", "zkn", "zko", "zkp", "zkr", "zkt", "zku", "zkv", "zkz", "zla", "zle", "zlj", "zlm", "zln", "zlq", "zls", "zlw", "zma", "zmb", "zmc", "zmd", "zme", "zmf", "zmg", "zmh", "zmi", "zmj", "zmk", "zml", "zmm", "zmn", "zmo", "zmp", "zmq", "zmr", "zms", "zmt", "zmu", "zmv", "zmw", "zmx", "zmy", "zmz", "zna", "znd", "zne", "zng", "znk", "zns", "zoc", "zoh", "zom", "zoo", "zoq", "zor", "zos", "zpa", "zpb", "zpc", "zpd", "zpe", "zpf", "zpg", "zph", "zpi", "zpj", "zpk", "zpl", "zpm", "zpn", "zpo", "zpp", "zpq", "zpr", "zps", "zpt", "zpu", "zpv", "zpw", "zpx", "zpy", "zpz", "zqe", "zra", "zrg", "zrn", "zro", "zrp", "zrs", "zsa", "zsk", "zsl", "zsm", "zsr", "zsu", "zte", "ztg", "ztl", "ztm", "ztn", "ztp", "ztq", "zts", "ztt", "ztu", "ztx", "zty", "zua", "zuh", "zum", "zun", "zuy", "zwa", "zxx", "zyb", "zyg", "zyj", "zyn", "zyp", "zza", "zzj"] +]; +var LangUtil = /** @class */ (function () { + function LangUtil() { + } + /* Determine if given string is a valid BCP 47 string */ + LangUtil.isBcp47 = function (langStr) { + return /^(([a-zA-Z]{2,3}(-[a-zA-Z](-[a-zA-Z]{3}){0,2})?|[a-zA-Z]{4}|[a-zA-Z]{5,8})(-[a-zA-Z]{4})?(-([a-zA-Z]{2}|[0-9]{3}))?(-([0-9a-zA-Z]{5,8}|[0-9][a-zA-Z]{3}))*(-[0-9a-wy-zA-WY-Z](-[a-zA-Z0-9]{2,8})+)*(-x(-[a-zA-Z0-9]{1,8})+)?|x(-[a-zA-Z0-9]{1,8})+|(en-GB-oed|i-ami|i-bnn|i-default|i-enochian|i-hak|i-klingon|i-lux|i-mingo|i-navajo|i-pwn|i-tao|i-tay|i-tsu|sgn-BE-FR|sgn-BE-NL|sgn-CH-DE|art-lojban|cel-gaulish|no-bok|no-nyn|zh-guoyu|zh-hakka|zh-min|zh-min-nan|zh-xiang))$/.test(langStr); + }; + LangUtil.validPrimaryLang = function (langStr) { + var primary = langStr.toLowerCase(); + if (primary.includes("-")) { + primary = primary.split("-")[0]; + } + if (!primary.match(/[a-z]{2,3}/)) + return false; + // qaa..qtz + if (primary.length === 3 + && primary.charAt(0) === "q" + && primary.charCodeAt(1) >= 97 && primary.charCodeAt(1) <= 116 + && primary.charCodeAt(2) >= 97 && primary.charCodeAt(2) <= 122) { + } + return validPrimaryLangs[primary.charCodeAt(0) - 97].includes(primary); + }; + LangUtil.matchPrimaryLang = function (lang1, lang2) { + var primary1 = lang1; + if (primary1.includes("-")) { + primary1 = primary1.split("-")[0]; + } + var primary2 = lang2; + if (primary2.includes("-")) { + primary2 = primary2.split("-")[0]; + } + return primary1.toLowerCase() === primary2.toLowerCase(); + }; + return LangUtil; +}()); +exports.LangUtil = LangUtil; + + +/***/ }, + +/***/ 3103 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.CommonMapper = void 0; +var DOMWalker_1 = __webpack_require__(3864); +var CommonMapper = /** @class */ (function () { + function CommonMapper() { + this.hierarchyRole = null; + this.hierarchyPath = null; + this.hierarchyResults = null; + } + CommonMapper.prototype.getBounds = function (node) { + return null; + }; + CommonMapper.prototype.reset = function (node) { + this.hierarchyRole = []; + this.hierarchyResults = []; + this.hierarchyPath = [{ + rolePath: "", + roleCount: {} + }]; + var ancestors = []; + var parent = DOMWalker_1.DOMWalker.parentNode(node); + while (parent && parent.nodeType != 9 /* Node.DOCUMENT_NODE */) { + ancestors.push(parent); + parent = DOMWalker_1.DOMWalker.parentNode(parent); + } + ancestors = ancestors.reverse(); + for (var _i = 0, ancestors_1 = ancestors; _i < ancestors_1.length; _i++) { + var ancestor = ancestors_1[_i]; + var siblings = []; + var sibling = ancestor.previousSibling; + while (sibling) { + siblings.push(sibling); + sibling = sibling.previousSibling; + } + siblings = siblings.reverse(); + for (var _a = 0, siblings_1 = siblings; _a < siblings_1.length; _a++) { + var sibling_1 = siblings_1[_a]; + this.pushHierarchy(sibling_1); + this.popHierarchy(); + } + this.pushHierarchy(ancestor); + } + }; + CommonMapper.prototype.pushHierarchy = function (node) { + var role = this.getRole(node) || null; + this.hierarchyRole.push(role); + if (role !== null) { + var parentPathInfo = this.hierarchyPath[this.hierarchyPath.length - 1]; + parentPathInfo.roleCount[role] = (parentPathInfo.roleCount[role] || 0) + 1; + this.hierarchyPath.push({ + "rolePath": parentPathInfo.rolePath + "/" + role + "[" + parentPathInfo.roleCount[role] + "]", + "roleCount": {} + }); + } + var attr = {}; + if (node.nodeType === 1) { + attr = this.getAttributes(node); + } + this.hierarchyResults.push({ + node: node, + namespace: this.getNamespace(), + role: role, + attributes: attr, + rolePath: this.hierarchyPath[this.hierarchyPath.length - 1].rolePath, + bounds: this.getBounds(node) + }); + }; + CommonMapper.prototype.popHierarchy = function () { + var role = this.hierarchyRole.pop(); + if (role !== null) { + this.hierarchyPath.pop(); + } + this.hierarchyResults.pop(); + }; + CommonMapper.prototype.openScope = function (node) { + if (this.hierarchyRole === null) { + this.reset(node); + } + this.pushHierarchy(node); + return this.hierarchyResults; + }; + CommonMapper.prototype.closeScope = function (node) { + var retVal = []; + for (var _i = 0, _a = this.hierarchyResults; _i < _a.length; _i++) { + var res = _a[_i]; + // const temp = res.node; + // res.node = null; + // let cloned = JSON.parse(JSON.stringify(res)); + // cloned.node = res.node = temp; + // retVal.push(cloned); + retVal.push(res); + } + retVal[retVal.length - 1].role = "/" + retVal[retVal.length - 1].role; + this.popHierarchy(); + return retVal; + }; + return CommonMapper; +}()); +exports.CommonMapper = CommonMapper; + + +/***/ }, + +/***/ 920 +(__unused_webpack_module, exports) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Context = exports.PartInfo = exports.AttrInfo = void 0; +// Context that will cause this rule to execute. +// Context syntax: +// Triggers: +// aria:role - Triggers on element with ARIA role role +// aria:role[attribute] - Triggers on elements with the equivalent logical +// aria- attribute (e.g., button[disabled] will trigger on +// <button disabled> or <div role="button" aria-disabled="true">) +// role[attribute=value] - Similar to above, with case-sensitive match +// to value +// role[attribute~value] - Similar to above, with case-insensitive match +// dom:element - Triggers on an element with the specified name +// dom:element[attribute] - Triggers on a dom element with the specified attribute +// dom:*[attribute] - Triggers on all elements with the specified attribute +// Combining triggers: +// trigger1 trigger2 - Triggers on elements with trigger2 within an +// element with trigger1 +// !trigger1 trigger2 - Triggers on elements with trigger2 not within +// element with trigger1 +// trigger1>trigger2 - Triggers on elements with trigger2 with an +// an immediate parent with trigger1 +// trigger1+trigger2 - Triggers on elements with trigger2 with an +// immediate previous sibling with trigger1 +// trigger1~trigger2 - Triggers on elements with trigger2 with an +// some earlier sibling with trigger1 +// context,context - Triggers on elements with either context +var AttrInfo = /** @class */ (function () { + function AttrInfo(inclusive, attr, eq, value) { + this.inclusive = inclusive; + this.attr = attr; + this.eq = eq; + this.value = value; + if (!inclusive + && ((typeof eq) !== "undefined" && eq.length > 0)) { + throw new Error("Cannot have !attr" + eq + " context"); + } + if (inclusive && (typeof eq) !== "undefined" && eq.length > 0 && ((typeof value) === "undefined" || value.length === 0)) { + throw new Error("Cannot have equivalence check without a value"); + } + } + AttrInfo.prototype.matches = function (context) { + var ruleAttrPart = this; + var elemAttrs = context.attributes; + if (!(ruleAttrPart.attr in elemAttrs)) { + return !ruleAttrPart.inclusive; + } + else if (!ruleAttrPart.inclusive) { + return false; + } + else if (!ruleAttrPart.eq) { + // inclusive match and I have that attribute and no equivalence defined + return true; + } + else { + // inclusive match and I have that attribute and equivalence defined + var attrValue = elemAttrs[ruleAttrPart.attr]; + if (ruleAttrPart.eq === "=") { + return ruleAttrPart.value === attrValue; + } + else if (ruleAttrPart.eq === "!=") { + return ruleAttrPart.value !== attrValue; + } + else if (ruleAttrPart.eq === "~") { + return ruleAttrPart.value === attrValue; + } + else if (ruleAttrPart.eq === "!~") { + return ruleAttrPart.value !== attrValue; + } + else { + throw new Error("Context equivalence operator not supported"); + } + } + }; + return AttrInfo; +}()); +exports.AttrInfo = AttrInfo; +var PartInfo = /** @class */ (function () { + function PartInfo(inclusive, namespace, role, attrs, connector) { + this.inclusive = inclusive; + this.namespace = namespace; + this.role = role; + this.attrs = attrs; + this.connector = connector; + if (role === "*" && !inclusive) { + throw new Error("!* context not supported"); + } + } + PartInfo.prototype.matches = function (contextHier, hierLevel) { + var rulePart = this; + var ruleRoleMatch = (rulePart.namespace in contextHier) && contextHier[rulePart.namespace][hierLevel] + && (contextHier[rulePart.namespace][hierLevel].role === rulePart.role + || contextHier[rulePart.namespace][hierLevel].role !== "none" && rulePart.role === "*"); + if (ruleRoleMatch + && rulePart.role === "*" + && rulePart.namespace === "dom" + && (contextHier[rulePart.namespace][hierLevel].role === "#text" + || contextHier[rulePart.namespace][hierLevel].role === "/#text")) { + ruleRoleMatch = false; + } + if (rulePart.inclusive && !ruleRoleMatch) + return false; + if (!rulePart.inclusive && !ruleRoleMatch) + return true; + // Match the attributes + var ruleAttrs = rulePart.attrs; + var elemContext = contextHier[rulePart.namespace][hierLevel]; + var match = true; + for (var _i = 0, ruleAttrs_1 = ruleAttrs; _i < ruleAttrs_1.length; _i++) { + var ruleAttrPart = ruleAttrs_1[_i]; + match = match && ruleAttrPart.matches(elemContext); + } + if (!rulePart.inclusive) + match = !match; + return match; + }; + return PartInfo; +}()); +exports.PartInfo = PartInfo; +var Context = /** @class */ (function () { + function Context(context) { + this.contextInfo = []; + var contextHierMatches = context.match(/!?[/a-zA-Z:0-9*\-_]+(\[[^\]]+\])*[ >+~]?/g); + var results = []; + for (var _i = 0, contextHierMatches_1 = contextHierMatches; _i < contextHierMatches_1.length; _i++) { + var part = contextHierMatches_1[_i]; + var parts = part.match(/(!?)([/a-zA-Z:0-9*\-_]+)((\[[^\]]+\])*)([ >+~]?)/); + var attrInfo = []; + for (var _a = 0, _b = parts[3].match(/\[([^\]]+)\]/g) || []; _a < _b.length; _a++) { + var attrPart = _b[_a]; + var attrParts = attrPart.match(/\[(!?)([a-z:A-Z*\-_]+)(!?[=~])?([^\]]+)?\]/); + attrInfo.push(new AttrInfo(attrParts[1] !== "!", attrParts[2].toLowerCase(), attrParts[3], attrParts[4])); + } + parts[2] = parts[2].toLowerCase(); + var nsParts = parts[2].split(":"); + var incl = parts[1] !== "!"; + var ns = nsParts.shift(); + var role = nsParts.join(":"); + var partInfo = new PartInfo(incl, ns, role, attrInfo, parts[parts.length - 1]); + results.push(partInfo); + } + this.contextInfo = results; + } + Context.cleanContext = function (context) { + context = context.toLowerCase().trim(); + context = context.replace(/ +!/g, " !"); + context = context.replace(/ +([>+~,])/g, "$1"); + context = context.replace(/([>+~,]) +/g, "$1"); + context = context.replace(/ +/g, " "); + return context.trim(); + }; + Context.parse = function (context) { + var contexts = Context.splitMultiple(Context.cleanContext(context)); + var retVal = []; + for (var i = 0; i < contexts.length; ++i) { + var ctx = new Context(contexts[i]); + retVal.push(ctx); + } + return retVal; + }; + /** + * Handles initial processing of splitting on comma - context,context + * @param context + */ + Context.splitMultiple = function (context) { + var contexts = []; + if (context) { + if (context.indexOf(",") === -1) { + contexts.push(context); + } + else { + for (var _i = 0, _a = context.split(","); _i < _a.length; _i++) { + var c = _a[_i]; + contexts.push(c); + } + } + } + return contexts; + }; + return Context; +}()); +exports.Context = Context; + + +/***/ }, + +/***/ 7301 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Engine = void 0; +var DOMWalker_1 = __webpack_require__(3864); +var Context_1 = __webpack_require__(920); +var Config_1 = __webpack_require__(4516); +var DOMMapper_1 = __webpack_require__(7507); +var DOMUtil_1 = __webpack_require__(1686); +var CacheUtil_1 = __webpack_require__(4566); +var IRule_1 = __webpack_require__(461); +var VisUtil_1 = __webpack_require__(3946); +var WrappedRule = /** @class */ (function () { + function WrappedRule(rule, parsedInfo) { + this.rule = rule; + this.parsedInfo = parsedInfo; + this.ns = this.parsedInfo.contextInfo[this.parsedInfo.contextInfo.length - 1].namespace; + Config_1.Config.DEBUG && console.log("Added Rule:", rule.id, JSON.stringify(this.parsedInfo)); + } + /** + * This function is responsible converting the node into a snippet which can be added to report. + * + * Note: This function will take the node and extract the node name and the attributes and build the snippet based on this. + * + * TODO: Future, maybe we can extract more then just single line, add more info or even add closing tags etc... + * + * @param {HTMLElement} node - The html element to convert into element snippet with node name and attributes only. + * + * @return {String} nodeSnippet - return the element snippet of the element that was provided which only contains, + * nodename and attributes. i.e. <table id=\"layout_table1\" role=\"presentation\"> + * + * @memberOf this + */ + WrappedRule.convertNodeToSnippet = function (node) { + // Variable Decleration + var nodeSnippet = ''; + // Extract the node name and add it to the node snippet + nodeSnippet += '<' + node.nodeName.toLowerCase(); + // Extract all the node attributes as an array + var nodeAttributes = node.attributes; + // In the case there are attributes on this node + if (nodeAttributes !== null && typeof nodeAttributes !== 'undefined') { + // Loop over all theses attributes and add the name and value to the nodeSnippet which will be returned + for (var i = nodeAttributes.length - 1; i >= 0; i--) { + if (nodeAttributes[i].name === "data-namewalk") + continue; + // Add the attribute name and value. + nodeSnippet += ' ' + nodeAttributes[i].name + '="' + nodeAttributes[i].value + '"'; + } + } + // Close the node + nodeSnippet += '>'; + // Return the node snippet + return nodeSnippet; + }; + /** + * This function is responsible for finding the source location for a node, which can be added to a report. + * Supports debug directives in the following forms: + * 1. An attribute on the element itself: + * ibm-a11y-debug="file.ts:10:5" + * 2. A comment node preceding the element (as a sibling or ancestor sibling): + * <!-- ibm-a11y-debug: file.ts:10:5 --> + * 3. A wrapper element (e.g. div) whose first non-whitespace child is such a comment node. + * 4. An ancestor element that carries the ibm-a11y-debug attribute. + * + * Traversal: checks the node itself for an inline attribute, then scans previous siblings at + * each ancestor level upward (also checking each ancestor element's own inline attribute), + * stopping if a blank or 'end' marker is found. + * + * @param {Node} node - The DOM node to find source info for + * @return {string | null} - The source location string, or null if not found + * + * @memberOf this + */ + WrappedRule.convertNodeToSource = function (node, enabled) { + if (enabled === void 0) { enabled = false; } + //console.log("Source Map enabled:", enabled); + if (!enabled || !node) + return null; + var DEBUG_DIRECTIVE = "ibm-a11y-debug"; + /** + * Parses a source string into a DirectiveResult. + * The source is the final resolved value — after any ':' separator has already been stripped. + * A blank value or the exact word 'end' (case-insensitive) is a stop marker. + */ + var parseSource = function (source) { + if (!source || source.toLowerCase() === 'end') { + return { found: true, stop: true }; + } + return { found: true, stop: false, source: source }; + }; + /** + * Extracts the debug-directive comment value from a node. + * Handles: + * - A comment node directly + * - A wrapper element (e.g. <div>) whose first non-whitespace child is a comment node + * + * Returns { found: true, stop: true } if the directive is blank or exactly 'end', + * returns { found: true, stop: false, source } if a valid source is found, + * or returns { found: false } if no directive is present on this node. + */ + var extractDirective = function (elem) { + if (!elem) + return { found: false }; + var commentValue = null; + if (elem.nodeType === Node.COMMENT_NODE) { + // Direct comment node + commentValue = elem.nodeValue; + } + else if (elem.nodeType === Node.ELEMENT_NODE) { + // Element wrapper (e.g. <div><!-- ibm-a11y-debug: ... --></div>) + // Find the first non-whitespace child node + var child = elem.firstChild; + while (child) { + if (child.nodeType === Node.TEXT_NODE) { + // Skip pure whitespace text nodes + if (child.nodeValue && child.nodeValue.trim().length > 0) { + // Non-whitespace text before a comment — not a directive wrapper + break; + } + } + else if (child.nodeType === Node.COMMENT_NODE) { + commentValue = child.nodeValue; + break; + } + else { + // Any other node type before a comment — not a directive wrapper + break; + } + child = child.nextSibling; + } + } + if (commentValue !== null) { + var trimmed = commentValue.trim(); + // Match exactly "ibm-a11y-debug" followed by end-of-string, whitespace, or ':' + // This prevents "ibm-a11y-debug-extra" from being treated as a directive. + if (trimmed === DEBUG_DIRECTIVE || + trimmed.startsWith(DEBUG_DIRECTIVE + ':') || + trimmed.startsWith(DEBUG_DIRECTIVE + ' ') || + trimmed.startsWith(DEBUG_DIRECTIVE + '\t')) { + // Strip the directive name and optional leading whitespace + var afterDirective = trimmed.substring(DEBUG_DIRECTIVE.length).trimStart(); + // Strip a single leading ':' separator if present + // (e.g. "ibm-a11y-debug: file.ts:10:5" → afterDirective = ": file.ts:10:5") + var source = afterDirective.startsWith(':') + ? afterDirective.substring(1).trim() + : afterDirective.trim(); + return parseSource(source); + } + } + return { found: false }; + }; + /** + * Returns the ibm-a11y-debug attribute value from an element node as a DirectiveResult, + * or { found: false } if absent. Recognises the 'end' stop marker just like comment directives. + * The attribute value is the source directly (no ':' prefix), e.g. ibm-a11y-debug="file.ts:10:5". + */ + var getInlineAttr = function (n) { + if (n.nodeType !== Node.ELEMENT_NODE) + return { found: false }; + var val = n.getAttribute(DEBUG_DIRECTIVE); + if (val === null) + return { found: false }; + // Attribute value is the source directly — no ':' separator to strip + return parseSource(val.trim()); + }; + /** + * Traverses left (previous siblings) then upward (parent) to find source info. + * Does NOT check the starting element itself — only its preceding siblings and ancestors. + * This avoids misidentifying a content node as its own source directive. + * + * At each ancestor level the function also checks the ancestor element's own inline + * ibm-a11y-debug attribute, so that a parent element can annotate all its descendants. + * + * Sibling scanning stops at the first node that is recognised as a directive (found or stop). + * Non-directive nodes (real content elements, text nodes) are skipped so that a directive + * placed further back in the sibling list is still found even if content nodes intervene. + * However, traversal does NOT cross element boundaries when scanning siblings — only + * comment nodes and dedicated wrapper elements (whose sole first child is a comment) are + * treated as transparent. + * + * Shadow DOM traversal: uses DOMWalker.parentNode() to cross shadow boundaries correctly, + * including slotted content and nested Shadow DOM (shadow-in-shadow). When the parent + * chain reaches a ShadowRoot, DOMWalker.parentNode() automatically resolves it to the + * shadow host element in the outer DOM. A plain DocumentFragment with no host returns + * null from DOMWalker.parentNode(), stopping traversal. + * + * Sibling traversal uses DOMWalker.previousSiblingNotOwnedBySlot() to skip nodes that + * are assigned to slots (and therefore logically belong to a different part of the tree). + * + * Uses an iterative approach (rather than recursion) to safely handle deeply nested + * DOM structures without risk of stack overflow. + * + * @param elem - The node whose context we are searching + * @returns The source location string, or null if not found + */ + var findSource = function (elem) { + var current = elem; + while (current) { + // Scan previous siblings for a debug directive comment or wrapper element. + // Use previousSiblingNotOwnedBySlot to skip nodes assigned to slots, which + // logically belong to a different part of the composed tree. + // Only comment nodes and dedicated wrapper elements are considered directives; + // all other node types are skipped (they do not block further scanning). + var prev = DOMWalker_1.DOMWalker.previousSiblingNotOwnedBySlot(current); + while (prev) { + var result = extractDirective(prev); + if (result.found) { + if (result.stop) + return null; + return result.source; + } + prev = DOMWalker_1.DOMWalker.previousSiblingNotOwnedBySlot(prev); + } + // No directive found among siblings — move up to parent. + // Use DOMWalker.parentNode() instead of node.parentNode directly so that: + // 1. Shadow DOM boundaries are crossed automatically (ShadowRoot → host element), + // supporting both regular and nested Shadow DOM (shadow-in-shadow). + // 2. Slotted nodes are re-parented to their slot owner rather than their + // light-DOM parent, matching the composed (rendered) tree structure. + // 3. Nodes with an ownerElement (e.g. iframe document roots) are re-parented + // to their owner element. + var parent_1 = DOMWalker_1.DOMWalker.parentNode(current); + if (!parent_1 || parent_1.nodeType === Node.DOCUMENT_NODE) { + // Reached the top of the tree (or a plain DocumentFragment with no host) + // without finding a directive. + return null; + } + // Check the parent element's own inline attribute before continuing upward. + // This allows a containing element to annotate all its descendants. + // An 'end' inline attribute on the parent stops traversal entirely. + var parentAttrResult = getInlineAttr(parent_1); + if (parentAttrResult.found) { + if (parentAttrResult.stop) + return null; + return parentAttrResult.source; + } + current = parent_1; + } + return null; + }; + // First, check for an inline attribute directive on the element itself. + // An 'end' attribute on the element itself stops traversal (returns null). + var selfAttrResult = getInlineAttr(node); + if (selfAttrResult.found) { + if (selfAttrResult.stop) + return null; + return selfAttrResult.source; + } + // Then traverse the DOM to find a preceding comment directive or ancestor attribute + return findSource(node); + }; + WrappedRule.prototype.run = function (engine, context, options, contextHierarchies) { + var startTime = new Date().getTime(); + var results; + try { + results = this.rule.run(context, options, contextHierarchies); + } + catch (e) { + var err = e; + console.error("RULE EXCEPTION:", this.rule.id, context.dom.rolePath, err.stack); + throw e; + } + var endTime = new Date().getTime(); + if (!results) + results = []; + if (!(results instanceof Array)) { + results = [results]; + } + var retVal = []; + for (var _i = 0, results_1 = results; _i < results_1.length; _i++) { + var result = results_1[_i]; + var message = engine.getMessage(this.rule.id, result.reasonId, result.messageArgs); + var path = {}; + for (var ns in context) { + path[ns] = context[ns].rolePath; + } + var ruleId = this.rule.id.replace(/^(.*)\$\$\d+$/, "$1"); + retVal.push({ + ruleId: ruleId, + value: result.value, + node: context["dom"].node, + path: path, + ruleTime: endTime - startTime, + reasonId: result.reasonId, + message: message, + messageArgs: result.messageArgs, + apiArgs: result.apiArgs, + bounds: context["dom"].bounds, + snippet: WrappedRule.convertNodeToSnippet(context["dom"].node), + source: WrappedRule.convertNodeToSource(context["dom"].node, engine.isSourceMapEnabled()) + }); + } + return retVal; + }; + return WrappedRule; +}()); +var Engine = /** @class */ (function () { + function Engine() { + this.mappers = {}; + this.ruleMap = {}; + this.wrappedRuleMap = {}; + this.nlsMap = {}; + this.helpMap = {}; + this.sourceMapEnabled = false; + this.inclRules = {}; + this.exclRules = {}; + // Need a DOM Mapper as a minimum + this.addMapper(new DOMMapper_1.DOMMapper()); + } + Engine.getLanguages = function () { + var env = typeof process !== "undefined" && typeof process.nodeType === "undefined" && process.env; + // If all else fails, default to US English + var nodeLang = "en-US"; + if (env) { + nodeLang = env.LANG || env.LANGUAGE || env.LC_ALL || env.LC_MESSAGES; + if (nodeLang && nodeLang.length > 0) { + nodeLang = nodeLang.split(".")[0].replace(/_/g, "-"); + } + else { + nodeLang = "en-US"; + } + } + return typeof navigator !== "undefined" && navigator.languages || [nodeLang]; + }; + Engine.prototype.run = function (root, options) { + if (root === null) { + return Promise.reject("null document"); + } + if (root.nodeType === 9 /* Node.DOCUMENT_NODE */) { + root = root.documentElement; + } + root.ownerDocument && (root.ownerDocument.PT_CHECK_HIDDEN_CONTENT = false); + var numNodesVisited = CacheUtil_1.CacheUtil.clearCaches(root); + var walker = new DOMWalker_1.DOMWalker(root, false, root, true); + var retVal = { + results: [], + numExecuted: 0, + ruleTime: 0, + totalTime: 0 + }; + var start = new Date().getTime(); + // Reset the role mappers + for (var namespace in this.mappers) { + this.mappers[namespace].reset(root); + } + // Initialize the context detector + var currentNodeCount = 0; + var lastReportedPercent = -1; + do { + currentNodeCount++; + // Report progress at each percentage milestone + var currentPercent = Math.floor((currentNodeCount / numNodesVisited) * 100); + if (currentPercent > lastReportedPercent) { + if (numNodesVisited > 10000) { + // if (currentPercent > 6) break; + console.log("Progress: ".concat(currentPercent, "% (").concat(currentNodeCount, "/").concat(numNodesVisited, " nodes)")); + // const ruleTimes = retVal.results.reduce((prev, cur) => { + // prev[cur.ruleId] = (prev[cur.ruleId] || 0)+cur.ruleTime; + // return prev; + // }, {}); + // for (const ruleId in ruleTimes) { + // if (ruleTimes[ruleId] > 10000) { + // console.log(`${ruleId}: ${ruleTimes[ruleId]}`); + // } + // } + // console.groupEnd(); + } + lastReportedPercent = currentPercent; + } + // Get the context information from the rule mappers + var contextHierarchies = {}; + for (var namespace in this.mappers) { + if (!walker.bEndTag) { + contextHierarchies[namespace] = this.mappers[namespace].openScope(walker.node); + // if (namespace === "dom" && walker.node.nodeType === 1 /* Node.ELEMENT_NODE */) { + // const elem = walker.node as Element; + // let id; + // if (elem.hasAttribute("id") && (id = elem.getAttribute("id").trim()).length > 0) { + // if (root.ownerDocument.getElementById(id) === elem) { + // contextHierarchies["dom"][contextHierarchies["dom"].length-1].rolePath = "//*[@id='"+id+"']"; + // } + // } + // } + } + else { + contextHierarchies[namespace] = this.mappers[namespace].closeScope(walker.node); + } + } + if (walker.node.nodeType !== 11 + && (VisUtil_1.VisUtil.isNodeVisible(walker.node) + // || walker.node.nodeName.toLowerCase() === "head" + || walker.node.nodeName.toLowerCase() === "meta" + || walker.node.nodeName.toLowerCase() === "style" + || walker.node.nodeName.toLowerCase() === "datalist" + || walker.node.nodeName.toLowerCase() === "param" + || !DOMUtil_1.DOMUtil.getAncestor(walker.node, ["body"]))) { + var context = {}; + for (var ns in contextHierarchies) { + var nsHier = contextHierarchies[ns]; + var lastHier = nsHier[nsHier.length - 1]; + context[ns] = lastHier; + } + var matchingRules = this.getMatchingRules(contextHierarchies); + var depMatch = {}; + for (var _i = 0, matchingRules_1 = matchingRules; _i < matchingRules_1.length; _i++) { + var matchingRule = matchingRules_1[_i]; + var fulfillsDependencies = true; + for (var _a = 0, _b = matchingRule.rule.dependencies || []; _a < _b.length; _a++) { + var dep = _b[_a]; + if (!depMatch[dep]) + fulfillsDependencies = false; + } + if (fulfillsDependencies) { + var results = []; + var start_1 = new Date().getTime(); + try { + results = matchingRule.run(this, context, options, contextHierarchies); + } + catch (err) { + // Wrapper shows error in console. Skip this rule as N/A + // We don't want to kill the engine + } + // If out of scope, it fulfills the dependency + if (results.length === 0) { + depMatch[matchingRule.rule.id] = true; + } + for (var _c = 0, results_2 = results; _c < results_2.length; _c++) { + var result = results_2[_c]; + retVal.results.push(result); + retVal.ruleTime += result.ruleTime; + retVal.numExecuted++; + if (result.value[1] === IRule_1.eRuleConfidence.PASS) { + depMatch[result.ruleId] = true; + } + } + } + } + } + } while (walker.nextNode()); + CacheUtil_1.CacheUtil.clearCaches(root); + retVal.totalTime = new Date().getTime() - start; + return Promise.resolve(retVal); + }; + Engine.prototype.enableRules = function (ruleIds) { + for (var ruleId in this.ruleMap) { + this.ruleMap[ruleId].enabled = false; + } + for (var _i = 0, _a = ruleIds || []; _i < _a.length; _i++) { + var ruleId = _a[_i]; + if (!(ruleId in this.ruleMap)) { + console.warn("WARNING: Rule Id", ruleId, "could not be enabled."); + } + else { + this.ruleMap[ruleId].enabled = true; + } + } + }; + Engine.prototype.getRule = function (ruleId) { + return this.ruleMap[ruleId]; + }; + Engine.prototype.getRulesIds = function () { + var retVal = []; + for (var ruleId in this.ruleMap) { + retVal.push(ruleId); + } + return retVal; + }; + Engine.prototype.addRules = function (rules) { + for (var _i = 0, rules_1 = rules; _i < rules_1.length; _i++) { + var rule = rules_1[_i]; + this.addRule(rule, true); + } + this._sortRules(); + }; + Engine.prototype.addRule = function (rule, skipSort) { + var ctxs = Context_1.Context.parse(rule.context); + var idx = 0; + var ruleId = rule.id; + if (ruleId in this.ruleMap) { + console.log("WARNING: Rule", ruleId, "already added to engine. Ignoring..."); + return; + } + this.ruleMap[ruleId] = rule; + for (var _i = 0, ctxs_1 = ctxs; _i < ctxs_1.length; _i++) { + var ctx = ctxs_1[_i]; + var wrapId = ruleId; + if (idx >= 1) { + wrapId = ruleId + "$$" + idx; + } + ++idx; + var wrappedRule = new WrappedRule(rule, ctx); + this.wrappedRuleMap[wrapId] = wrappedRule; + var parts = wrappedRule.parsedInfo.contextInfo; + var lastPart = parts[parts.length - 1]; + var triggerRole = lastPart.namespace + ":" + lastPart.role; + if (lastPart.inclusive) { + this.inclRules[triggerRole] = this.inclRules[triggerRole] || []; + this.inclRules[triggerRole].push(wrappedRule); + } + else { + this.exclRules[triggerRole] = this.exclRules[triggerRole] || []; + this.exclRules[triggerRole].push(wrappedRule); + } + } + if (!skipSort) { + this._sortRules(); + } + }; + Engine.prototype.enableSourceMap = function (enable) { + this.sourceMapEnabled = enable; + }; + Engine.prototype.isSourceMapEnabled = function () { + return this.sourceMapEnabled; + }; + Engine.prototype._sortRules = function () { + for (var role in this.inclRules) { + this.inclRules[role].sort(function (ruleA, ruleB) { + var hasDepA = ruleA.rule.dependencies && ruleA.rule.dependencies.length > 0; + var hasDepB = ruleB.rule.dependencies && ruleB.rule.dependencies.length > 0; + // If B depends on A, sort A before B + if (hasDepB && ruleB.rule.dependencies.includes(ruleA.rule.id)) + return -1; + // If A depends on B, sort B before A + if (hasDepA && ruleA.rule.dependencies.includes(ruleB.rule.id)) + return 1; + // Otherwise, doesn't matter + return 0; + }); + } + for (var role in this.exclRules) { + this.exclRules[role].sort(function (ruleA, ruleB) { + var hasDepA = ruleA.rule.dependencies && ruleA.rule.dependencies.length > 0; + var hasDepB = ruleB.rule.dependencies && ruleB.rule.dependencies.length > 0; + // If B depends on A, sort A before B + if (hasDepB && ruleB.rule.dependencies.includes(ruleA.rule.id)) + return -1; + // If A depends on B, sort B before A + if (hasDepA && ruleA.rule.dependencies.includes(ruleB.rule.id)) + return 1; + // Otherwise, doesn't matter + return 0; + }); + } + }; + Engine.prototype.addNlsMap = function (map) { + for (var key in map) { + this.nlsMap[key] = map[key]; + } + }; + Engine.prototype.addHelpMap = function (map) { + for (var key in map) { + this.helpMap[key] = map[key]; + } + }; + Engine.prototype.getMessage = function (ruleId, ruleIdx, msgArgs) { + var splitter = ruleId.indexOf("$$"); + if (splitter >= 0) { + ruleId = ruleId.substring(0, splitter); + } + if (!(ruleId in this.nlsMap)) + return ruleId; + var messageTemplate = this.nlsMap[ruleId][ruleIdx || 0]; + if (!messageTemplate) + return ruleId + "_" + ruleIdx; + return messageTemplate.replace(/\{(\d+)\}/g, function (matchedStr, matchedNum, matchedIndex) { return msgArgs[matchedNum]; }); + }; + Engine.prototype.getHelp = function (ruleId, reasonId, archiveId) { + if (!archiveId) { + // Set to the latest + archiveId = "latest"; + } + return "".concat(Config_1.Config.helpRoot, "/").concat(archiveId, "/doc").concat(this.getHelpRel(ruleId, reasonId)); + }; + Engine.prototype.getHelpRel = function (ruleId, ruleIdx) { + var splitter = ruleId.indexOf("$$"); + if (splitter >= 0) { + ruleId = ruleId.substring(0, splitter); + } + if (!(ruleId in this.helpMap)) + return ruleId; + ruleIdx = ruleIdx || 0; + var helpStr = null; + if (ruleIdx in this.helpMap[ruleId]) { + helpStr = this.helpMap[ruleId][ruleIdx || 0]; + } + else { + helpStr = this.helpMap[ruleId][0]; + } + if (!helpStr) + return ruleId + "_" + ruleIdx; + return helpStr; + }; + Engine.prototype.addMapper = function (mapper) { + this.mappers[mapper.getNamespace()] = mapper; + }; + Engine.match = function (rule, contextHier) { + var ruleParts = rule.parsedInfo.contextInfo; + var partIdx = ruleParts.length - 1; + var curNS = ruleParts[partIdx].namespace; + var curHier = contextHier[curNS][contextHier[curNS].length - 1]; + var contextNode = curHier.node; + // If the end of the rule part doesn't match the end of the hierarchy, we don't have a match + if (!ruleParts[partIdx].matches(contextHier, contextHier[curNS].length - 1)) { + return false; + } + // If there was only one part, we have a match + if (ruleParts.length === 1) { + return true; + } + // Need to deal with parent parts. To walk the hierarchy, these need to be + // all in the same namespace. Confirm that is true. + curNS = ruleParts[0].namespace; + curHier = contextHier[curNS][contextHier[curNS].length - 1]; + --partIdx; + if (ruleParts.slice(0, ruleParts.length - 1).some(function (part) { return part.namespace !== curNS; })) { + console.error("[ERROR] Rule ".concat(rule.rule.id, " has inconsitent parent namespaces")); + return false; + } + // If the target node matches the end of the hierarchy, move up past it, otherwise, start at the end + var hierIdx = contextHier[curNS].length - (curHier.node.isSameNode(contextNode) ? 2 : 1); + while (hierIdx >= 0 && partIdx >= 0) { + var part = ruleParts[partIdx]; + var matchesPart = ruleParts[partIdx].matches(contextHier, hierIdx); + if (part.connector === ">") { + if (!matchesPart) { + // Direct parent check and doesn't match + return false; + } + else { + // Direct parent check and does match + --partIdx; + --hierIdx; + } + } + else if (part.connector === " ") { + if (part.inclusive) { + // inclusive ancestor match + if (matchesPart) { + --partIdx; + } + // If doesn't match, just move up the role hierarchy + --hierIdx; + } + else if (!matchesPart) { + // exclusive ancestor match and current matches + return false; + } + else { + // exclusive ancestor match and current doesn't match - check for other ancestors + var parentMatch = false; + for (var searchIdx = hierIdx - 1; !parentMatch && searchIdx >= 0; --searchIdx) { + parentMatch = !ruleParts[partIdx].matches(contextHier, searchIdx); + } + if (parentMatch) + return false; + else + --partIdx; + } + } + else { + throw new Error("Context connector " + part.connector + " is not supported"); + } + } + return partIdx === -1; + }; + Engine.prototype.getMatchingRules = function (ctxHier) { + var matches = []; + function addMatches(rules) { + for (var _i = 0, rules_2 = rules; _i < rules_2.length; _i++) { + var rule = rules_2[_i]; + if (rule.rule.enabled && Engine.match(rule, ctxHier)) { + matches.push(rule); + } + } + } + for (var ns in ctxHier) { + var role = ns + ":" + (ctxHier[ns].length > 0 ? ctxHier[ns][ctxHier[ns].length - 1].role : "none"); + if (role in this.inclRules) { + addMatches(this.inclRules[role]); + } + for (var xRole in this.exclRules) { + if (xRole !== role) { + addMatches(this.exclRules[xRole]); + } + } + if (role !== ns + ":none") { + if (role.startsWith(ns + ":/")) { + if (ns + ":/*" in this.inclRules) { + addMatches(this.inclRules[ns + ":/*"]); + } + } + else { + if (ns + ":*" in this.inclRules) { + addMatches(this.inclRules[ns + ":*"]); + } + } + } + } + return this.sortDeps(matches); + }; + /** + * Sorts the rules in order to execute dependencies in the correct order + * @param inRules List of wrapped rules to sort + * @returns Sorted list of wrapped rules + */ + Engine.prototype.sortDeps = function (inRules) { + var depRules = []; + for (var _i = 0, inRules_1 = inRules; _i < inRules_1.length; _i++) { + var rule = inRules_1[_i]; + depRules.push(rule); + } + var retVal = []; + var idToRule = {}; + // Iterate through the rules. If that rule's dependencies can be met by rules already in the list, add it to the list + // Repeat until no changes are made to the satisfied list + // If a rule cannot be satisfied, it will never execute, so it can be dropped. + var change = false; + do { + change = false; + for (var idx = 0; idx < depRules.length; ++idx) { + var depRule = depRules[idx]; + if (depRule.rule.id in idToRule) + continue; + var allMatch = true; + if (depRule.rule.dependencies && depRule.rule.dependencies.length > 0) { + for (var _a = 0, _b = depRule.rule.dependencies; _a < _b.length; _a++) { + var depId = _b[_a]; + if (!(depId in idToRule)) { + allMatch = false; + } + } + } + // if (depRule.rule.prereqs && depRule.rule.prereqs.length > 0) { + // for (const depId of depRule.rule.prereqs) { + // if (!(depId in idToRule)) { + // allMatch = false; + // } + // } + // } + if (allMatch) { + change = true; + retVal.push(depRule); + idToRule[depRule.rule.id] = true; + depRules.splice(idx--, 1); + } + } + } while (change); + return retVal; + }; + return Engine; +}()); +exports.Engine = Engine; + + +/***/ }, + +/***/ 4516 +(__unused_webpack_module, exports) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Config = void 0; +var Config = /** @class */ (function () { + function Config() { + } + Config.DEBUG = false; + Config.helpRoot = "https://able.ibm.com/rules/archives"; + return Config; +}()); +exports.Config = Config; + + +/***/ }, + +/***/ 7507 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.DOMMapper = void 0; +var CommonMapper_1 = __webpack_require__(3103); +var CacheUtil_1 = __webpack_require__(4566); +var DOMMapper = /** @class */ (function (_super) { + __extends(DOMMapper, _super); + function DOMMapper() { + return _super !== null && _super.apply(this, arguments) || this; + } + DOMMapper.prototype.getRole = function (node) { + return node.nodeName.toLowerCase(); + }; + DOMMapper.prototype.getNamespace = function () { + return "dom"; + }; + DOMMapper.prototype.getAttributes = function (node) { + var retVal = {}; + if (node.nodeType === 1 /* Node.ELEMENT_NODE */) { + var elem = node; + for (var idx = 0; idx < elem.attributes.length; ++idx) { + var attrInfo = elem.attributes[idx]; + retVal[attrInfo.name.toLowerCase()] = attrInfo.nodeValue; + } + } + return retVal; + }; + /** + * get scaled bounds for screenshot etc. adjusted for devicePixelRatio and scroll + * @param node + * @returns + */ + DOMMapper.prototype.getBounds = function (node) { + if (node.nodeType !== 1 /*Node.ELEMENT_NODE*/) + return null; + var cachedBounds = CacheUtil_1.CacheUtil.getCache(node, "DOMMapper_Bounds", undefined); + if (typeof cachedBounds !== "undefined") { + return cachedBounds; + } + var adjustment = 1; + if (node.ownerDocument && node.ownerDocument.defaultView && node.ownerDocument.defaultView.devicePixelRatio) { + adjustment = node.ownerDocument.defaultView.devicePixelRatio; + } + var bounds = node.getBoundingClientRect(); + // Do a check whether bounds has value as we use different tool (htmlUnit, browser) to call this function + if (bounds) { + var scrollX_1 = node && node.ownerDocument && node.ownerDocument.defaultView && node.ownerDocument.defaultView.scrollX || 0; + var scrollY_1 = node && node.ownerDocument && node.ownerDocument.defaultView && node.ownerDocument.defaultView.scrollY || 0; + var ret = { + "left": Math.ceil((bounds.left + scrollX_1) * adjustment), + "top": Math.ceil((bounds.top + scrollY_1) * adjustment), + "height": Math.ceil(bounds.height * adjustment), + "width": Math.ceil(bounds.width * adjustment) + }; + CacheUtil_1.CacheUtil.setCache(node, "DOMMapper_Bounds", ret); + return ret; + } + return null; + }; + /** + * get real CSS bounds in css pixels, adjusted for scroll only + * @param node + * @returns + */ + DOMMapper.prototype.getUnadjustedBounds = function (node) { + if (node.nodeType !== 1 /*Node.ELEMENT_NODE*/) + return null; + var cachedBounds = CacheUtil_1.CacheUtil.getCache(node, "DOMMapper_UnadjustedBounds", undefined); + if (typeof cachedBounds !== "undefined") { + return cachedBounds; + } + var bounds = node.getBoundingClientRect(); + // adjusted for scroll if any + if (bounds) { + var scrollX_2 = node && node.ownerDocument && node.ownerDocument.defaultView && node.ownerDocument.defaultView.scrollX || 0; + var scrollY_2 = node && node.ownerDocument && node.ownerDocument.defaultView && node.ownerDocument.defaultView.scrollY || 0; + var ret = { + "left": Math.ceil(bounds.left + scrollX_2), + "top": Math.ceil(bounds.top + scrollY_2), + "height": Math.ceil(bounds.height), + "width": Math.ceil(bounds.width) + }; + CacheUtil_1.CacheUtil.setCache(node, "DOMMapper_UnadjustedBounds", ret); + return ret; + } + return null; + }; + return DOMMapper; +}(CommonMapper_1.CommonMapper)); +exports.DOMMapper = DOMMapper; + + +/***/ }, + +/***/ 1686 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.DOMUtil = void 0; +var DOMWalker_1 = __webpack_require__(3864); +/** + * Utility class providing helper methods for DOM manipulation and traversal operations. + * Used throughout the accessibility checker engine to navigate and analyze DOM structures. + */ +var DOMUtil = /** @class */ (function () { + function DOMUtil() { + } + /** + * Checks if a given node has an ancestor element with a node name matching any of the provided names. + * Traverses up the DOM tree from the given node until a match is found or the root is reached. + * + * @param node - The starting DOM node to check + * @param names - Array of node names (tag names) to search for in uppercase (e.g., ['TABLE', 'DIV']) + * @returns true if an ancestor with a matching name is found, false otherwise + */ + DOMUtil.hasParent = function (node, names) { + var p = DOMWalker_1.DOMWalker.parentElement(node); + while (p && !names.includes(p.nodeName)) { + p = DOMWalker_1.DOMWalker.parentElement(p); + } + return !!p; + }; + /** + * Retrieves the first ancestor element that matches any of the provided node names (case-insensitive). + * Similar to hasParent but returns the actual element reference and performs case-insensitive comparison. + * + * @param node - The starting DOM node + * @param names - Array of lowercase node names to search for (e.g., ['table', 'div']) + * @returns The matching ancestor element, or null if none found + */ + DOMUtil.getAncestor = function (node, names) { + var p = DOMWalker_1.DOMWalker.parentElement(node); + while (p && !names.includes(p.nodeName.toLowerCase())) { + p = DOMWalker_1.DOMWalker.parentElement(p); + } + return p; + }; + /** + * Determines if two nodes are the same node, with fallback strategies for different browser environments. + * Uses multiple comparison methods for cross-browser compatibility: + * 1. Strict equality (===) + * 2. isSameNode() method if available + * 3. compareDocumentPosition() (returns 0 if same node) + * 4. Returns true as last resort if no comparison method is available + * + * @param a - First node to compare + * @param b - Second node to compare + * @returns true if nodes are the same, false otherwise + */ + DOMUtil.sameNode = function (a, b) { + if (a === b) { + return true; + } + else if (a.isSameNode) { + return a.isSameNode(b); + } + else if (a.compareDocumentPosition) { + return a.compareDocumentPosition(b) === 0; + } + else { + // Not supported in this environment - try our best + return true; + } + }; + /** + * Normalizes whitespace in a string by replacing all whitespace characters + * (spaces, tabs, carriage returns, newlines) with single spaces and collapsing + * multiple consecutive spaces into one. + * + * @param s - The input string to clean + * @returns The cleaned string with normalized whitespace + * @example "Hello\n\t World" → "Hello World" + */ + DOMUtil.cleanWhitespace = function (s) { + var retVal = s.replace(/[ \t\r\n]/g, " ").replace(/ +/g, " "); + return retVal; + }; + /** + * Collapses multiple consecutive spaces into a single space. + * Unlike cleanWhitespace, only handles spaces, not other whitespace characters like tabs or newlines. + * + * @param s - The input string to clean + * @returns The string with collapsed spaces + */ + DOMUtil.cleanSpace = function (s) { + var retVal = s.replace(/ +/g, " "); + return retVal; + }; + /** + * Determines if two elements (typically table cells) belong to the same table element. + * Finds the table ancestor for each element and compares them using sameNode(). + * + * @param element1 - First element to check + * @param element2 - Second element to check + * @returns true if both elements share the same table ancestor, false otherwise + */ + DOMUtil.isInSameTable = function (element1, element2) { + if (element1 && element2) { + var parentName = ['table']; + var parent1 = DOMUtil.getAncestor(element1, parentName); + var parent2 = DOMUtil.getAncestor(element2, parentName); + if (parent1 !== null && parent2 != null && DOMUtil.sameNode(parent1, parent2)) + return true; + } + return false; + }; + /** + * Traverses up the DOM tree to find the shadow root (document fragment) that contains the given node. + * Important for handling Web Components and Shadow DOM structures in accessibility checking. + * + * @param node - The starting node + * @returns The shadow root node (nodeType 11 = DOCUMENT_FRAGMENT_NODE), or null if none found + */ + DOMUtil.shadowRootNode = function (node) { + var nd = node; + while (nd != null && nd.nodeType !== 11 /* Node.DOCUMENT_FRAGMENT_NODE */) + nd = nd.parentNode; + return nd; + }; + /** + * Creates a deep copy of an object while preserving Node references (doesn't clone Node objects). + * Useful when copying data structures that contain DOM node references, as you typically want + * to preserve those references rather than attempting to clone the nodes themselves. + * + * Behavior: + * - Primitive values: Deep copied via JSON serialization + * - Functions: Returned as-is (reference) + * - Node objects: Returned as-is (reference, not cloned) + * - Arrays/Objects: Recursively copied with the same rules + * + * @param rhs - The object to copy (right-hand side) + * @returns A copy of the object with Node references preserved + */ + DOMUtil.objectCopyWithNodeRefs = function (rhs) { + if (!rhs) + return rhs; + if (typeof rhs !== "object") { + if (typeof rhs === "function") { + return rhs; + } + else { + return JSON.parse(JSON.stringify(rhs)); + } + } + else if (rhs instanceof Node || !!rhs.nodeType) { + return rhs; + } + else { + var retVal = void 0; + if (rhs.constructor.name === "Array") { + retVal = []; + for (var _i = 0, rhs_1 = rhs; _i < rhs_1.length; _i++) { + var item = rhs_1[_i]; + retVal.push(this.objectCopyWithNodeRefs(item)); + } + } + else { + retVal = {}; + for (var key in rhs) { + retVal[key] = this.objectCopyWithNodeRefs(rhs[key]); + } + } + return retVal; + } + }; + /** + * Finds the first ancestor element that has a specific attribute with a specific value. + * Traverses up the DOM tree from the given element until a matching ancestor is found. + * + * @param element - The starting element + * @param attrName - The attribute name to search for + * @param attrValue - The expected attribute value + * @returns The matching ancestor element, or null if none found + * @example Finding an ancestor with aria-hidden="true" or data-testid="container" + */ + DOMUtil.getAncestorWithAttribute = function (element, attrName, attrValue) { + var walkNode = DOMWalker_1.DOMWalker.parentNode(element); + while (walkNode !== null) { + if (walkNode.nodeType === 1 /* Node.ELEMENT_NODE */ && walkNode.getAttribute(attrName) === attrValue) + return walkNode; + walkNode = DOMWalker_1.DOMWalker.parentNode(walkNode); + } + return null; + }; + return DOMUtil; +}()); +exports.DOMUtil = DOMUtil; + + +/***/ }, + +/***/ 3864 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.DOMWalker = void 0; +var VisUtil_1 = __webpack_require__(3946); +/** + * Walks in a DOM order + * + * Assumption that nodes of shadow DOMs call assignSlots on the shadow root before + * doing other processing in that tree. If you walk into a shadow root, the DOMWalker + * will do it automatically. + * + * See also ../aria/ARIAWalker + */ +var DOMWalker = /** @class */ (function () { + function DOMWalker(element, bEnd, root, considerHidden, DEBUG) { + this.DEBUGIDX = 0; + this.indent = 0; + this.DEBUG = !!DEBUG; + this.root = root || ((element && element.ownerDocument) ? element.ownerDocument.documentElement : element); + if (this.root.nodeType === 9) { + this.root = this.root.documentElement; + } + this.node = element; + if (this.node.nodeType === 9) { + this.node = this.node.documentElement; + } + this.bEndTag = (bEnd == undefined ? false : bEnd == true); + this.considerHidden = considerHidden || false; + } + DOMWalker.prototype.elem = function () { + return this.node.nodeType === 1 && this.node || null; + }; + DOMWalker.parentNode = function (node) { + if (node === null) + return null; + var p = node.parentNode; + if (node.slotOwner) { + p = node.slotOwner; + } + else if (node.ownerElement) { + p = node.ownerElement; + } + else if (p && p.nodeType === 11) { + if (p.host) { + p = p.host; + } + else { + p = null; + } + } + return p; + }; + DOMWalker.parentElement = function (node) { + var elem = node; + do { + elem = DOMWalker.parentNode(elem); + } while (elem && elem.nodeType !== 1); + return elem; + }; + DOMWalker.assignSlots = function (root) { + var slots = root.querySelectorAll("slot"); + for (var iSlot = 0; iSlot < slots.length; ++iSlot) { + var processSlot = slots[iSlot]; + var assignedNodes = processSlot.assignedNodes(); + for (var iAssigned = 0; iAssigned < assignedNodes.length; ++iAssigned) { + assignedNodes[iAssigned].slotOwner = processSlot; + assignedNodes[iAssigned].slotIndex = iAssigned; + } + } + }; + DOMWalker.firstChildNotOwnedBySlot = function (node) { + var retVal = node.firstChild; + while (retVal && retVal.slotOwner) { + retVal = retVal.nextSibling; + } + return retVal; + }; + DOMWalker.lastChildNotOwnedBySlot = function (node) { + var retVal = node.lastChild; + while (retVal && retVal.slotOwner) { + retVal = retVal.previousSibling; + } + return retVal; + }; + DOMWalker.nextSiblingNotOwnedBySlot = function (node) { + var retVal = node.nextSibling; + while (retVal && retVal.slotOwner) { + retVal = retVal.nextSibling; + } + return retVal; + }; + DOMWalker.previousSiblingNotOwnedBySlot = function (node) { + var retVal = node.previousSibling; + while (retVal && retVal.slotOwner) { + retVal = retVal.previousSibling; + } + return retVal; + }; + DOMWalker.prototype.atRoot = function () { + if (this.node.ownerElement) + return false; + if (this.root === this.node) { + return true; + } + else if (this.root.isSameNode) { + return this.root.isSameNode(this.node); + } + else if (this.root.compareDocumentPosition) { + return this.root.compareDocumentPosition(this.node) === 0; + } + else { + // Not supported in this environment - try our best + return this.node.parentNode === null; + } + }; + DOMWalker.prototype.nextNode = function () { + var _this = this; + var indent = function () { + var s = ""; + for (var idx = 0; idx < _this.indent; ++idx) { + s += " "; + } + return s; + }; + var DBG = false; //this.DEBUGIDX >= 7 && this.DEBUGIDX <= 10; + var startName = this.node.nodeName; + if (!this.node) { + this.bEndTag = false; + return false; + } + do { + //console.log(this.node.nodeName, this.bEndTag?"END":"START", this.node.nodeType === 1 && (this.node as any).getAttribute("id")); + if (!this.bEndTag) { + var iframeNode = this.node; + var elementNode = this.node; + var slotElement = this.node; + if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && this.node.nodeName.toUpperCase() === "IFRAME" + && (this.considerHidden ? VisUtil_1.VisUtil.isNodeVisible(iframeNode) : true) + && iframeNode.contentDocument + && iframeNode.contentDocument.documentElement) { + DBG && console.log("!!!Into Frame"); + var ownerElement = this.node; + this.node = iframeNode.contentDocument.documentElement; + this.node.ownerElement = ownerElement; + } + else if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && (this.considerHidden ? VisUtil_1.VisUtil.isNodeVisible(elementNode) : true) + && elementNode.shadowRoot + && elementNode.shadowRoot.firstChild) { + DBG && console.log("!!!Into shadow root"); + var ownerElement = this.node; + this.node = elementNode.shadowRoot; + this.node.ownerElement = ownerElement; + DOMWalker.assignSlots(this.node); + } + else if (this.node.nodeType === 1 + && elementNode.nodeName.toLowerCase() === "slot" + && slotElement.assignedNodes().length > 0) { + DBG && console.log("!!!Into slot"); + this.node = slotElement.assignedNodes()[0]; + } + else if ((this.node.nodeType === 1 /* Node.ELEMENT_NODE */ || this.node.nodeType === 11 /* Node.DOCUMENT_FRAGMENT_NODE */) + && DOMWalker.firstChildNotOwnedBySlot(this.node)) { + DBG && console.log("!!!First child"); + this.node = DOMWalker.firstChildNotOwnedBySlot(this.node); + } + else { + DBG && console.log("!!!Flip to end tag"); + this.bEndTag = true; + } + } + else { + DBG && console.log("!!!1"); + if (this.atRoot()) { + DBG && console.log("!!!Done at root"); + return false; + } + else if (this.node.slotOwner) { + var slotOwner = this.node.slotOwner; + var nextSlotIndex = this.node.slotIndex + 1; + // delete (this.node as any).slotOwner; + // delete (this.node as any).slotIndex; + if (nextSlotIndex < slotOwner.assignedNodes().length) { + DBG && console.log("!!!Next slot child"); + this.node = slotOwner.assignedNodes()[nextSlotIndex]; + this.bEndTag = false; + } + else { + DBG && console.log("!!!Back up to slot owner"); + this.node = slotOwner; + this.bEndTag = true; + } + } + else if (this.node.ownerElement) { + DBG && console.log("!!!Up to frame owner"); + this.node = this.node.ownerElement; + this.bEndTag = true; + } + else if (DOMWalker.nextSiblingNotOwnedBySlot(this.node)) { + DBG && console.log("!!!Next sibling"); + this.node = DOMWalker.nextSiblingNotOwnedBySlot(this.node); + this.bEndTag = false; + } + else if (this.node.parentNode) { + DBG && console.log("!!!Parent"); + this.node = this.node.parentNode; + this.bEndTag = true; + } + else { + DBG && console.log("!!!Done with walk"); + return false; + } + } + if (DBG && ((this.node.nodeType !== 1 && this.node.nodeType !== 11 && this.node.nodeType !== 3) + || (this.node.nodeType === 1 && this.node.getAttribute("aChecker") === "ACE"))) { + this.DEBUG && console.log(indent() + "<".concat(this.bEndTag ? "/" : "").concat(this.node.nodeName, "> (from ").concat(startName, ") ").concat(this.DEBUGIDX++, " SKIPPED")); + } + } while ((this.node.nodeType !== 1 && this.node.nodeType !== 11 && this.node.nodeType !== 3) + || (this.node.nodeType === 1 && this.node.getAttribute("aChecker") === "ACE")); + if (this.bEndTag) + this.indent -= 2; + this.DEBUG && console.log(indent() + "<".concat(this.bEndTag ? "/" : "").concat(this.node.nodeName, "> (from ").concat(startName, ") ").concat(this.DEBUGIDX++)); + this.DEBUG && this.node.slotOwner && console.log(indent() + "slotOwner: ".concat(this.node.slotOwner.nodeName)); + this.DEBUG && this.node.slotIndex && console.log(indent() + "slotIndex: ".concat(this.node.slotIndex)); + this.DEBUG && this.node.ownerElement && console.log(indent() + "ownerElement: ".concat(this.node.ownerElement.nodeName)); + if (!this.bEndTag) + this.indent += 2; + return true; + }; + DOMWalker.prototype.prevNode = function () { + do { + if (this.bEndTag) { + var iframeNode = this.node; + var elementNode = this.node; + if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && this.node.nodeName.toUpperCase() === "IFRAME" + && (this.considerHidden ? VisUtil_1.VisUtil.isNodeVisible(iframeNode) : true) + && iframeNode.contentDocument + && iframeNode.contentDocument.documentElement) { + var ownerElement = this.node; + this.node = iframeNode.contentDocument.documentElement; + this.node.ownerElement = ownerElement; + } + else if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && (this.considerHidden ? VisUtil_1.VisUtil.isNodeVisible(elementNode) : true) + && elementNode.shadowRoot + && elementNode.shadowRoot.lastChild) { + var ownerElement = this.node; + this.node = elementNode.shadowRoot; + this.node.ownerElement = ownerElement; + DOMWalker.assignSlots(this.node); + } + else if (this.node.nodeType === 1 + && elementNode.nodeName.toLowerCase() === "slot" + && elementNode.assignedNodes().length > 0) { + // Enter slot with assigned nodes - go to last assigned node + var slotElement = elementNode; + this.node = slotElement.assignedNodes()[slotElement.assignedNodes().length - 1]; + } + else if ((this.node.nodeType === 1 /* Node.ELEMENT_NODE */ || this.node.nodeType === 11) + && DOMWalker.lastChildNotOwnedBySlot(this.node)) { + this.node = DOMWalker.lastChildNotOwnedBySlot(this.node); + } + else { + this.bEndTag = false; + } + } + else { + if (this.atRoot()) { + return false; + } + else if (this.node.slotOwner) { + var slotOwner = this.node.slotOwner; + var prevSlotIndex = this.node.slotIndex - 1; + if (prevSlotIndex >= 0) { + this.node = slotOwner.assignedNodes()[prevSlotIndex]; + this.bEndTag = true; + } + else { + this.node = slotOwner; + this.bEndTag = false; + } + } + else if (DOMWalker.previousSiblingNotOwnedBySlot(this.node)) { + this.node = DOMWalker.previousSiblingNotOwnedBySlot(this.node); + this.bEndTag = true; + } + else if (this.node.ownerElement) { + this.node = this.node.ownerElement; + this.bEndTag = false; + } + else if (this.node.parentNode) { + this.node = this.node.parentNode; + this.bEndTag = false; + } + else { + return false; + } + } + } while ((this.node.nodeType !== 1 /* Node.ELEMENT_NODE */ && this.node.nodeType !== 11 && this.node.nodeType !== 3) + || (this.node.nodeType === 1 && this.node.getAttribute("aChecker") === "ACE")); + return true; + }; + return DOMWalker; +}()); +exports.DOMWalker = DOMWalker; + + +/***/ }, + +/***/ 8601 +(__unused_webpack_module, exports) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.eGuidelineType = exports.eGuidelineCategory = exports.eToolkitLevel = void 0; +var eToolkitLevel; +(function (eToolkitLevel) { + eToolkitLevel["LEVEL_ONE"] = "1"; + eToolkitLevel["LEVEL_TWO"] = "2"; + eToolkitLevel["LEVEL_THREE"] = "3"; + eToolkitLevel["LEVEL_FOUR"] = "4"; +})(eToolkitLevel = exports.eToolkitLevel || (exports.eToolkitLevel = {})); +var eGuidelineCategory; +(function (eGuidelineCategory) { + eGuidelineCategory["ACCESSIBILITY"] = "Accessibility"; + eGuidelineCategory["DESIGN"] = "Design"; + eGuidelineCategory["OTHER"] = "Other"; +})(eGuidelineCategory = exports.eGuidelineCategory || (exports.eGuidelineCategory = {})); +var eGuidelineType; +(function (eGuidelineType) { + eGuidelineType["DEFAULT"] = "default"; + eGuidelineType["EXTENSION"] = "extension"; +})(eGuidelineType = exports.eGuidelineType || (exports.eGuidelineType = {})); + + +/***/ }, + +/***/ 461 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.eRulesetType = exports.eRuleCategory = exports.eToolkitLevel = exports.RuleManual = exports.RulePotential = exports.RuleFail = exports.RuleRender = exports.RulePass = exports.eRulePolicy = exports.eRuleConfidence = void 0; +var eRuleConfidence; +(function (eRuleConfidence) { + eRuleConfidence["PASS"] = "PASS"; + eRuleConfidence["FAIL"] = "FAIL"; + eRuleConfidence["POTENTIAL"] = "POTENTIAL"; + eRuleConfidence["MANUAL"] = "MANUAL"; +})(eRuleConfidence = exports.eRuleConfidence || (exports.eRuleConfidence = {})); +var eRulePolicy; +(function (eRulePolicy) { + eRulePolicy["VIOLATION"] = "VIOLATION"; + eRulePolicy["RECOMMENDATION"] = "RECOMMENDATION"; + eRulePolicy["INFORMATION"] = "INFORMATION"; +})(eRulePolicy = exports.eRulePolicy || (exports.eRulePolicy = {})); +function RulePass(reasonId, messageArgs, apiArgs) { + if (typeof reasonId === "undefined" || reasonId === null) + throw new Error("Reason ID must be defined"); + return { + value: [eRulePolicy.INFORMATION, eRuleConfidence.PASS], + reasonId: reasonId, + messageArgs: messageArgs || [], + apiArgs: apiArgs || [] + }; +} +exports.RulePass = RulePass; +function RuleRender(reasonId, messageArgs, apiArgs) { + if (typeof reasonId === "undefined" || reasonId === null) + throw new Error("Reason ID must be defined"); + return { + value: [eRulePolicy.INFORMATION, eRuleConfidence.PASS], + reasonId: 0, + messageArgs: messageArgs || [], + apiArgs: apiArgs || [] + }; +} +exports.RuleRender = RuleRender; +function RuleFail(reasonId, messageArgs, apiArgs) { + if (typeof reasonId === "undefined" || reasonId === null) + throw new Error("Reason ID must be defined"); + return { + value: [eRulePolicy.INFORMATION, eRuleConfidence.FAIL], + reasonId: reasonId, + messageArgs: messageArgs || [], + apiArgs: apiArgs || [] + }; +} +exports.RuleFail = RuleFail; +function RulePotential(reasonId, messageArgs, apiArgs) { + if (typeof reasonId === "undefined" || reasonId === null) + throw new Error("Reason ID must be defined"); + return { + value: [eRulePolicy.INFORMATION, eRuleConfidence.POTENTIAL], + reasonId: reasonId, + messageArgs: messageArgs || [], + apiArgs: apiArgs || [] + }; +} +exports.RulePotential = RulePotential; +function RuleManual(reasonId, messageArgs, apiArgs) { + if (typeof reasonId === "undefined" || reasonId === null) + throw new Error("Reason ID must be defined"); + return { + value: [eRulePolicy.INFORMATION, eRuleConfidence.MANUAL], + reasonId: reasonId, + messageArgs: messageArgs || [], + apiArgs: apiArgs || [] + }; +} +exports.RuleManual = RuleManual; +/** + * @deprecated See ./IGuideline + */ +var IGuideline_1 = __webpack_require__(8601); +Object.defineProperty(exports, "eToolkitLevel", ({ enumerable: true, get: function () { return IGuideline_1.eToolkitLevel; } })); +/** + * @deprecated See ./IGuideline:eGuidelineCategory + */ +var IGuideline_2 = __webpack_require__(8601); +Object.defineProperty(exports, "eRuleCategory", ({ enumerable: true, get: function () { return IGuideline_2.eGuidelineCategory; } })); +/** + * @deprecated See ./IGuideline:eGuidelineType + */ +var IGuideline_3 = __webpack_require__(8601); +Object.defineProperty(exports, "eRulesetType", ({ enumerable: true, get: function () { return IGuideline_3.eGuidelineType; } })); + + +/***/ }, + +/***/ 7412 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Checker = void 0; +var IRule_1 = __webpack_require__(461); +var Engine_1 = __webpack_require__(7301); +var ARIAMapper_1 = __webpack_require__(9955); +var rulesets_1 = __webpack_require__(6160); +var checkRulesV4 = __importStar(__webpack_require__(591)); +var IGuideline_1 = __webpack_require__(8601); +var checkRules = []; +var checkNls = {}; +var checkHelp = {}; +function _initialize() { + var langs = JSON.parse(JSON.stringify(Engine_1.Engine.getLanguages())); + // Default lang to en-US if nothing else specified is found + langs.push("en-US"); + // Process V4 rules into the V2 format + for (var rulename in checkRulesV4) { + // Convert rule + var v4Rule = checkRulesV4[rulename]; + checkRules.push(v4Rule); + // Go backwards because the first lang is the preferred, so + // earlier languages will override later languages + for (var idx = langs.length - 1; idx >= 0; --idx) { + var langId = langs[idx]; + if (langId in v4Rule.messages) { + checkNls[v4Rule.id] = v4Rule.messages[langId]; + checkNls[v4Rule.id][0] = checkNls[v4Rule.id].group; + } + if (langId in v4Rule.help) { + checkHelp[v4Rule.id] = {}; + for (var reasonId in v4Rule.help[langId]) { + checkHelp[v4Rule.id][reasonId] = "/".concat(langId, "/").concat(v4Rule.help[langId][reasonId]); + } + checkNls[v4Rule.id][0] = checkNls[v4Rule.id].group; + } + } + // Convert RS + for (var _i = 0, _a = v4Rule.rulesets; _i < _a.length; _i++) { + var rsSection = _a[_i]; + for (var _b = 0, _c = rulesets_1.a11yRulesets; _b < _c.length; _b++) { + var rs = _c[_b]; + var checkRsIds = typeof rsSection.id === "string" ? [rsSection.id] : rsSection.id; + if (checkRsIds.includes(rs.id)) { + for (var _d = 0, _e = rs.checkpoints; _d < _e.length; _d++) { + var cp = _e[_d]; + var checkCPIds = typeof rsSection.num === "string" ? [rsSection.num] : rsSection.num; + if (checkCPIds.includes(cp.num)) { + cp.rules = cp.rules || []; + cp.rules.push({ + id: v4Rule.id, + reasonCodes: rsSection.reasonCodes, + level: rsSection.level, + toolkitLevel: rsSection.toolkitLevel + }); + } + } + } + } + } + } +} +_initialize(); +var Checker = /** @class */ (function () { + function Checker() { + this.guidelines = []; + /** + * @deprecated Use getGuidelines(). + */ + this.rulesets = this.guidelines; + /** + * @deprecated Use getGuidelineIds(). + */ + this.rulesetIds = []; + this.rulesetRules = {}; + this.ruleLevels = {}; + this.ruleReasonLevels = {}; + this.ruleCategory = {}; + var engine = this.engine = new Engine_1.Engine(); + engine.addMapper(new ARIAMapper_1.ARIAMapper()); + engine.addRules(checkRules); + engine.addNlsMap(checkNls); + engine.addHelpMap(checkHelp); + for (var _i = 0, a11yRulesets_1 = rulesets_1.a11yRulesets; _i < a11yRulesets_1.length; _i++) { + var rs = a11yRulesets_1[_i]; + this.addRuleset(rs); + } + } + /** + * Adds a guideline to the engine. If the id already exists, the previous guideline will be replaced. + * @param guideline + */ + Checker.prototype.addGuideline = function (guideline) { + if (guideline.id in this.rulesetRules) { + this.removeGuideline(guideline.id); + } + this.guidelines.push(guideline); + this.rulesetIds.push(guideline.id); + var ruleIds = []; + for (var _i = 0, _a = guideline.checkpoints; _i < _a.length; _i++) { + var cp = _a[_i]; + cp.rules = cp.rules || []; + for (var _b = 0, _c = cp.rules; _b < _c.length; _b++) { + var rule = _c[_b]; + if (rule.enabled !== false) { + ruleIds.push(rule.id); + //this.ruleLevels[rule.id] = this.ruleLevels[rule.id] || {}; + //this.ruleLevels[rule.id][guideline.id] = rule.level; + this.ruleReasonLevels[rule.id] = this.ruleReasonLevels[rule.id] || {}; + this.ruleReasonLevels[rule.id][guideline.id] = this.ruleReasonLevels[rule.id][guideline.id] || {}; + var code = rule.reasonCodes ? rule.reasonCodes.join('--') : "None"; + this.ruleReasonLevels[rule.id][guideline.id][code] = rule.level; + this.ruleCategory[rule.id] = this.ruleCategory[rule.id] || {}; + this.ruleCategory[rule.id][guideline.id] = guideline.category; + } + } + } + this.rulesetRules[guideline.id] = ruleIds; + }; + /** + * Enable a rule for all guidelines + * @param ruleId + */ + Checker.prototype.enableRule = function (ruleId) { + for (var _i = 0, _a = this.getGuidelines(); _i < _a.length; _i++) { + var guideline = _a[_i]; + var updated = false; + for (var _b = 0, _c = guideline.checkpoints; _b < _c.length; _b++) { + var cp = _c[_b]; + for (var _d = 0, _e = cp.rules; _d < _e.length; _d++) { + var rule = _e[_d]; + if (rule.enabled === false) { + updated = true; + delete rule.enabled; + } + } + } + if (updated) { + this.addGuideline(guideline); + } + } + }; + /** + * Disable a rule for all guidelines + * @param ruleId + */ + Checker.prototype.disableRule = function (ruleId) { + for (var _i = 0, _a = this.getGuidelines(); _i < _a.length; _i++) { + var guideline = _a[_i]; + var updated = false; + for (var _b = 0, _c = guideline.checkpoints; _b < _c.length; _b++) { + var cp = _c[_b]; + for (var _d = 0, _e = cp.rules; _d < _e.length; _d++) { + var rule = _e[_d]; + if (rule.enabled !== false) { + updated = true; + rule.enabled = false; + } + } + } + if (updated) { + this.addGuideline(guideline); + } + } + }; + /** + * Remove a guideline from the engine + * + * Generally, there isn't a good reason to do this. Users should just not select the guideline as an option in check + * @param guidelineId + */ + Checker.prototype.removeGuideline = function (guidelineId) { + if (guidelineId in this.rulesetRules) { + delete this.rulesetRules[guidelineId]; + this.rulesets = this.guidelines = this.guidelines.filter(function (guideline) { return guideline.id !== guidelineId; }); + this.rulesetIds = this.getGuidelineIds(); + } + }; + /** + * Get the guidelines available in the engine + * @returns + */ + Checker.prototype.getGuidelines = function () { + return JSON.parse(JSON.stringify(this.guidelines)); + }; + /** + * Get the ids of the guidelines available in the engine + * @returns + */ + Checker.prototype.getGuidelineIds = function () { + return this.guidelines.map(function (guideline) { return guideline.id; }); + }; + /** + * + * @deprecated See addGuideline + */ + Checker.prototype.addRuleset = function (rs) { + this.addGuideline(rs); + }; + Checker.prototype.enableSourceMap = function (enable) { + this.engine.enableSourceMap(enable); + }; + Checker.prototype.isSourceMapEnabled = function () { + return this.engine.isSourceMapEnabled(); + }; + /** + * Perform a check of the specified node/document + * @param node DOMNode or Document on which to run the check + * @param guidelineIds Guideline ids to check with to specify which rules to run + * @returns + */ + Checker.prototype.check = function (node, guidelineIds) { + // Determine which rules to run + var ruleIds = []; + // Fix the input + if (!guidelineIds) { + ruleIds = this.engine.getRulesIds(); + } + else { + if (typeof guidelineIds === "string") { + guidelineIds = [guidelineIds]; + } + for (var _i = 0, guidelineIds_1 = guidelineIds; _i < guidelineIds_1.length; _i++) { + var rsId = guidelineIds_1[_i]; + if (rsId in this.rulesetRules) { + ruleIds = ruleIds.concat(this.rulesetRules[rsId]); + } + } + } + this.engine.enableRules(ruleIds); + // Add the report levels + var myThis = this; + return this.engine.run(node) + .then(function (report) { + report.nls = {}; + for (var _i = 0, _a = report.results; _i < _a.length; _i++) { + var result = _a[_i]; + if (result.ruleId in checkNls) { + report.nls[result.ruleId] = report.nls[result.ruleId] || { + 0: checkNls[result.ruleId][0] + }; + if (result.reasonId in checkNls[result.ruleId]) { + report.nls[result.ruleId][result.reasonId] = checkNls[result.ruleId][result.reasonId]; + } + } + //result.value[0] = myThis.getLevel(guidelineIds as string[], result.ruleId); + var code = result.reasonId ? result.reasonId : "None"; + result.value[0] = myThis.getReasonLevel(guidelineIds, result.ruleId, code); + result.category = myThis.getCategory(guidelineIds, result.ruleId); + delete result.path.css; + } + return report; + }); + }; + Checker.prototype.getLevel = function (rsIds, ruleId) { + if (!rsIds) + return IRule_1.eRulePolicy.INFORMATION; + var rsInfo = this.ruleLevels[ruleId]; + var retVal = null; + if (rsIds) { + if (!(ruleId in this.ruleLevels)) { + throw new Error("Rule triggered for which we have no rule level information: " + ruleId); + } + for (var _i = 0, rsIds_1 = rsIds; _i < rsIds_1.length; _i++) { + var rsId = rsIds_1[_i]; + if (rsId in rsInfo) { + if (rsInfo[rsId] === IRule_1.eRulePolicy.VIOLATION) { + retVal = IRule_1.eRulePolicy.VIOLATION; + } + else if (rsInfo[rsId] === IRule_1.eRulePolicy.RECOMMENDATION && retVal === null) { + retVal = IRule_1.eRulePolicy.RECOMMENDATION; + } + else if (retVal === null) { + retVal = IRule_1.eRulePolicy.INFORMATION; + } + } + } + } + if (retVal === null) { + throw new Error("Rule triggered for which we have no rule level information: " + ruleId); + } + return retVal; + }; + Checker.prototype.getReasonLevel = function (rsIds, ruleId, reasonCode) { + if (!rsIds) + return IRule_1.eRulePolicy.INFORMATION; + var rsInfo = this.ruleReasonLevels[ruleId]; + var retVal = null; + if (rsIds) { + if (!(ruleId in this.ruleReasonLevels)) { + throw new Error("Rule triggered for which we have no rule level information " + ruleId); + } + var _loop_1 = function (rsId) { + if (rsId in rsInfo) { + var reCode_1 = new RegExp("(^|--)".concat(reasonCode, "($|--)")); + Object.keys(rsInfo[rsId]).forEach(function (code) { + var level = null; + if (code === 'None') + level = rsInfo[rsId]["None"]; + else if (reCode_1.test(code)) + level = rsInfo[rsId][code]; + if (level !== null) { + if (level === IRule_1.eRulePolicy.VIOLATION) { + retVal = IRule_1.eRulePolicy.VIOLATION; + } + else if (level === IRule_1.eRulePolicy.RECOMMENDATION && retVal === null) { + retVal = IRule_1.eRulePolicy.RECOMMENDATION; + } + else if (retVal === null) { + retVal = IRule_1.eRulePolicy.INFORMATION; + } + } + }); + if (retVal === null) { + retVal = IRule_1.eRulePolicy.INFORMATION; + } + } + }; + for (var _i = 0, rsIds_2 = rsIds; _i < rsIds_2.length; _i++) { + var rsId = rsIds_2[_i]; + _loop_1(rsId); + } + } + if (retVal === null) { + throw new Error("Rule triggered for which we have no rule level information: " + ruleId); + } + return retVal; + }; + Checker.prototype.getCategory = function (rsIds, ruleId) { + var rsInfo = this.ruleCategory[ruleId]; + var retVal = ""; + if (!(ruleId in this.ruleCategory)) { + return IGuideline_1.eGuidelineCategory.OTHER; + } + if (!rsIds) { + rsIds = this.getGuidelineIds(); + } + for (var _i = 0, rsIds_3 = rsIds; _i < rsIds_3.length; _i++) { + var rsId = rsIds_3[_i]; + if (rsId in rsInfo) { + return rsInfo[rsId]; + } + } + return IGuideline_1.eGuidelineCategory.OTHER; + }; + return Checker; +}()); +exports.Checker = Checker; + + +/***/ }, + +/***/ 2297 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.a_target_warning = void 0; +var CommonUtil_1 = __webpack_require__(7139); +var VisUtil_1 = __webpack_require__(3946); +var fragment_1 = __webpack_require__(5279); +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +exports.a_target_warning = { + id: "a_target_warning", + context: "dom:a[target],dom:area[target],dom:base[target]", + refactor: { + "WCAG20_A_TargetAndText": { + "Pass_0": "pass", + "Potential_1": "potential_warn" + } + }, + help: { + "en-US": { + "group": "a_target_warning.html", + "pass": "a_target_warning.html", + "potential_warn": "a_target_warning.html" + } + }, + messages: { + "en-US": { + "group": "Users should be warned in advance if their input action will open a new window", + "pass": "The user is warned in advance that the input action opens a new window", + "potential_warn": "Inform the user when their input action will open a new window" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "3.2.2", + level: IRule_2.eRulePolicy.RECOMMENDATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // skip the rule if it's AT hidden and not tabbable + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) && !CommonUtil_1.CommonUtil.isTabbable(ruleContext)) + return null; + var params = { + paramWinText: { + value: ["new window", "new tab"], + type: "array" + } + }; + var tStr = ruleContext.getAttribute("target"); + var passed = tStr == "_parent" || tStr == "_self" || tStr == "_top" || CommonUtil_1.CommonUtil.getFrameByName(ruleContext, tStr) != null; + if (!passed) { + // Name is not part of this frameset – must have potential to create new window? + // See if a new window is mentioned + var textStr = CommonUtil_1.CommonUtil.getInnerText(ruleContext); + if (ruleContext.hasAttribute("title")) + textStr += " " + ruleContext.getAttribute("title"); + // Check aria-describedby for warning text + if (ruleContext.hasAttribute("aria-describedby")) { + var describedbyIds = ruleContext.getAttribute("aria-describedby").trim().split(/\s+/); + for (var _i = 0, describedbyIds_1 = describedbyIds; _i < describedbyIds_1.length; _i++) { + var id = describedbyIds_1[_i]; + var referencedElem = fragment_1.FragmentUtil.getById(ruleContext, id); + if (referencedElem) { + var describedText = CommonUtil_1.CommonUtil.getInnerText(referencedElem); + if (describedText && describedText.trim().length > 0) { + textStr += " " + describedText; + } + } + } + } + for (var i = 0; !passed && i < params.paramWinText.value.length; ++i) + if (textStr.indexOf(params.paramWinText.value[i]) != -1) + passed = true; + } + return passed ? (0, IRule_1.RulePass)("pass") : (0, IRule_1.RulePotential)("potential_warn"); + } +}; + + +/***/ }, + +/***/ 4401 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.a_text_purpose = void 0; +var IRule_1 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +var VisUtil_1 = __webpack_require__(3946); +var IRule_2 = __webpack_require__(461); +var AccNameUtil_1 = __webpack_require__(1950); +exports.a_text_purpose = { + id: "a_text_purpose", + // doc-biblioref is a link + context: "aria:link,aria:doc-biblioref", + refactor: { + "WCAG20_A_HasText": { + "Pass_0": "pass", + "Fail_1": "fail_acc_name" + } + }, + help: { + "en-US": { + "group": "a_text_purpose.html", + "pass": "a_text_purpose.html", + "fail_acc_name": "a_text_purpose.html" + } + }, + messages: { + "en-US": { + "group": "Hyperlinks must have an accessible name for their purpose", + "pass": "Hyperlink has a description of its purpose", + "fail_acc_name": "Hyperlink has no link text, label or image with a text alternative" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: ["2.4.4", "4.1.2"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: "c487ae", + run: function (context, options) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) { + return null; + } + // Rule only passes if an element has inner content, + // in the case that there is only hidden content under the the element it is a violation + var accName_pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + var passed = (accName_pair && accName_pair.name && accName_pair.name.trim().length > 0) + /**ARIAMapper.computeName(ruleContext).trim().length > 0*/ + || CommonUtil_1.CommonUtil.nonTabableChildCheck(ruleContext); + if (!passed) { + return (0, IRule_1.RuleFail)("fail_acc_name"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ 4546 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.applet_alt_exists = void 0; +var CommonUtil_1 = __webpack_require__(7139); +var VisUtil_1 = __webpack_require__(3946); +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +exports.applet_alt_exists = { + id: "applet_alt_exists", + context: "dom:applet", + refactor: { + "WCAG20_Applet_HasAlt": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3" + } + }, + help: { + "en-US": { + "group": "applet_alt_exists.html", + "Pass_0": "applet_alt_exists.html", + "Fail_1": "applet_alt_exists.html", + "Fail_2": "applet_alt_exists.html", + "Fail_3": "applet_alt_exists.html" + } + }, + messages: { + "en-US": { + "group": "<applet> elements must provide an 'alt' attribute and an alternative description", + "Pass_0": "Rule Passed", + "Fail_1": "An <applet> element does not have an 'alt' attribute that provides a short text alternative", + "Fail_2": "The 'alt' attribute value for an <applet> element duplicates the 'code' attribute", + "Fail_3": "An <applet> element provides alternative text, but does not provide inner content" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "1.1.1", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // JCH - NO OUT OF SCOPE hidden in context + if (!CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "alt")) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + var alt = ruleContext.getAttribute("alt").trim(); + if (ruleContext.hasAttribute("code") && alt == ruleContext.getAttribute("code").trim()) { + return (0, IRule_1.RuleFail)("Fail_2"); + } + else if (!CommonUtil_1.CommonUtil.hasInnerContentHidden(ruleContext)) { + return (0, IRule_1.RuleFail)("Fail_3"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } + } +}; + + +/***/ }, + +/***/ 9292 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.application_content_accessible = void 0; +var AriaUtil_1 = __webpack_require__(7011); +var VisUtil_1 = __webpack_require__(3946); +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +exports.application_content_accessible = { + id: "application_content_accessible", + context: "aria:application", + refactor: { + "HAAC_Application_Role_Text": { + 0: "HAAC_Application_Role_Text.html", + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + 0: "application_content_accessible.html", + "Pass_0": "application_content_accessible.html", + "Potential_1": "application_content_accessible.html" + } + }, + messages: { + "en-US": { + "group": "Non-decorative static text and image content within an element with \"application\" role must be accessible", + "Pass_0": "Rule Passed", + "Potential_1": "Verify that the non-decorative static text and image content within an element with \"application\" role are accessible" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: ["1.1.1", "2.1.1"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = true; + var children = ruleContext.childNodes; + for (var i = 0; passed && i < children.length; i++) { + if (children[i].nodeType === 1) { + if (VisUtil_1.VisUtil.isNodeVisible(children[i])) { + passed = AriaUtil_1.AriaUtil.hasRoleInSemantics(children[i], "document") || AriaUtil_1.AriaUtil.hasRoleInSemantics(children[i], "article"); + } + } + else if (children[i].nodeType === 3) { + passed = children[i].nodeValue.trim().length === 0; + } + } + return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ 9605 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.area_alt_exists = void 0; +var CommonUtil_1 = __webpack_require__(7139); +var VisUtil_1 = __webpack_require__(3946); +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +exports.area_alt_exists = { + id: "area_alt_exists", + context: "dom:area", + refactor: { + "WCAG20_Area_HasAlt": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "area_alt_exists.html", + "Pass_0": "area_alt_exists.html", + "Fail_1": "area_alt_exists.html" + } + }, + messages: { + "en-US": { + "group": "<area> elements in an image map must have a text alternative", + "Pass_0": "Rule Passed", + "Fail_1": "<area> element in an image map has no text alternative" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "1.1.1", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // JCH - NO OUT OF SCOPE hidden in context + if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "alt")) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } +}; + + +/***/ }, + +/***/ 3987 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_accessiblename_exists = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var VisUtil_1 = __webpack_require__(3946); +var AccNameUtil_1 = __webpack_require__(1950); +var ARIADefinitions_1 = __webpack_require__(9910); +exports.aria_accessiblename_exists = { + id: "aria_accessiblename_exists", + context: "aria:columnheader, aria:heading, aria:rowheader, aria:graphics-document,aria:graphics-symbol, aria:img,aria:image, doc-backlink, doc-biblioentry, doc-biblioref, doc-glossref, doc-noteref, doc-pagebreak, doc-example", + help: { + "en-US": { + "pass": "aria_accessiblename_exists.html", + "fail_no_accessible_name": "aria_accessiblename_exists.html", + "fail_no_accessible_name_image": "aria_accessiblename_exists.html", + "group": "aria_accessiblename_exists.html" + } + }, + messages: { + "en-US": { + "pass": "An accessible name is provided for the element", + "fail_no_accessible_name": "Element <{0}> with \"{1}\" role has no accessible name", + "fail_no_accessible_name_image": "Element <{0}> with \"{1}\" role has no accessible name", + "group": "Elements with certain roles should have accessible names" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE, + reasonCodes: ["fail_no_accessible_name"] + }, + { + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["ARIA"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE, + reasonCodes: ["fail_no_accessible_name_image"] + }], + act: [{ "23a2a8": { "fail_no_accessible_name_image": "fail" } }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLocaleLowerCase(); + // svg element is handled in svg_graphics_labbelled rule and image rules + if (nodeName === 'svg' || nodeName === 'img') + return; + // when table element with a caption as first child + if (nodeName === 'table' + && ruleContext.firstElementChild && ruleContext.firstElementChild.nodeName.toLowerCase() === 'caption' + && ruleContext.firstElementChild.textContent && ruleContext.firstElementChild.textContent.trim().length > 0) + return (0, IRule_1.RulePass)("pass"); + var invalidRoles = AriaUtil_1.AriaUtil.getRolesUndefinedByAria(ruleContext); + if (invalidRoles && invalidRoles.length > 0) + return null; + var deprecatedRoles = AriaUtil_1.AriaUtil.getDeprecatedAriaRoles(ruleContext); + if (deprecatedRoles && deprecatedRoles.length > 0) + return null; + var deprecatedAttributes = AriaUtil_1.AriaUtil.getDeprecatedAriaAttributes(ruleContext); + if (deprecatedAttributes && deprecatedAttributes.length > 0) + return null; + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + if (!role || !ARIADefinitions_1.ARIADefinitions.designPatterns[role] || !ARIADefinitions_1.ARIADefinitions.designPatterns[role].nameRequired) + return null; + var name_pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + if (!name_pair || !name_pair.name || name_pair.name.trim().length === 0) { + if (role === 'img' || role === 'image') + return (0, IRule_1.RuleFail)("fail_no_accessible_name_image", [ruleContext.nodeName.toLowerCase(), role]); + return (0, IRule_1.RuleFail)("fail_no_accessible_name", [ruleContext.nodeName.toLowerCase(), role]); + } + return (0, IRule_1.RulePass)("pass"); + } +}; + + +/***/ }, + +/***/ 8631 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_activedescendant_tabindex_valid = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +exports.aria_activedescendant_tabindex_valid = { + id: "aria_activedescendant_tabindex_valid", + context: "dom:*[aria-activedescendant]", + refactor: { + "Rpt_Aria_InvalidTabindexForActivedescendant": { + "pass": "pass", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "pass": "aria_activedescendant_tabindex_valid.html", + "Fail_1": "aria_activedescendant_tabindex_valid.html", + "group": "aria_activedescendant_tabindex_valid.html" + } + }, + messages: { + "en-US": { + "pass": "Rule Passed", + "Fail_1": "The <{0}> element using 'aria-activedescendant' set to \"{1}\" is not tabbable", + "group": "Element using 'aria-activedescendant' property should be tabbable" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = false; + var nodeName = ruleContext.nodeName.toLowerCase(); + // Rule not supported on mobile + if (ruleContext.hasAttribute("class") && ruleContext.getAttribute("class").substring(0, 3) == "mbl") { + return null; + } + // Handle the case where the element is hidden by a disabled HTML5 attribute or aria-disabled: + // 1. In the case that this element has a disabled attribute and the element supports it, we mark this rule as passed. + // 2. In the case that this element has an aria-disabled attribute then, we mark this rule as passed. + // For both of the cases above we do not need to perform any further checks, as the element is disabled in some form or another. + if (CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) { + return null; + } + //ignore if the attribute 'aria-activedescendant' is blank + if (ruleContext.getAttribute("aria-activedescendant").trim().length === 0) + return; + // If the tabindex attribute is provided then verify that it is 0 or -1 + passed = CommonUtil_1.CommonUtil.isTabbable(ruleContext); + // pass if one of the children is tabbable. in this case, the tab will stop on the first tabbable element + if (!passed) + passed = CommonUtil_1.CommonUtil.getTabbableChildren(ruleContext) > 0; + // Build array for node token + var retToken1 = new Array(); + retToken1.push(nodeName); + // Build array for id referenced by aria-activedescendant + var retToken2 = new Array(); + retToken2.push(ruleContext.getAttribute("aria-activedescendant").split(" ").join(", ")); + //return new ValidationResult(passed, [ruleContext], '', '', passed == true ? [] : [retToken1, retToken2]); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", [retToken1.toString(), retToken2.toString()]); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ 8025 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_activedescendant_valid = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +var fragment_1 = __webpack_require__(5279); +var VisUtil_1 = __webpack_require__(3946); +var DOMUtil_1 = __webpack_require__(1686); +exports.aria_activedescendant_valid = { + id: "aria_activedescendant_valid", + context: "dom:*[aria-activedescendant]", + refactor: { + "HAAC_ActiveDescendantCheck": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3" + // "Fail_4": "Fail_4" + } + }, + help: { + "en-US": { + "Pass_0": "aria_activedescendant_valid.html", + "Fail_1": "aria_activedescendant_valid.html", + "Fail_2": "aria_activedescendant_valid.html", + "Fail_3": "aria_activedescendant_valid.html", + // "Fail_4": "aria_activedescendant_valid.html", + "group": "aria_activedescendant_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The 'aria-activedescendant' property is empty", + "Fail_2": "The 'aria-activedescendant' property references a hidden node", + "Fail_3": "Element is not a combobox, and the referenced active-descendant element is not a valid descendant", + // "Fail_4": "Element is a combobox, and the referenced active-descendant element is not controlled by this component", + "group": "The 'aria-activedescendant' property must reference the 'id' of a non-empty, non-hidden active child element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // combobox active descendants handled by 'combobox_active_descendant' + if (AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "combobox")) { + return null; + } + var descendant_id = AriaUtil_1.AriaUtil.getAriaAttribute(ruleContext, "aria-activedescendant"); + // POF1: The attribute is empty + if (!descendant_id || descendant_id.trim() === "") { + return (0, IRule_1.RuleFail)("Fail_1"); + } + var descendant = fragment_1.FragmentUtil.getById(ruleContext, descendant_id.trim()); + if (!descendant || DOMUtil_1.DOMUtil.sameNode(descendant_id, ruleContext)) { + // The referenced element doesn't exist. We let 1077 to trigger the error + return null; + } + if (!VisUtil_1.VisUtil.isNodeVisible(descendant)) { + // POF2: aria-activedescendant references a hidden node + return (0, IRule_1.RuleFail)("Fail_2"); + } + // 1. The value of aria-activedescendant refers to an element that is either a descendant of + // the element with DOM focus + if (ruleContext.contains(descendant)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + var pofId = 2; + // or is a logical descendant as indicated by the aria-owns attribute. + if (ruleContext.hasAttribute("aria-owns")) { + var owned_ids = CommonUtil_1.CommonUtil.normalizeSpacing(ruleContext.getAttribute("aria-owns").trim()).split(" "); + for (var i = 0; i < owned_ids.length; i++) { + var owned_ele = fragment_1.FragmentUtil.getById(ruleContext, owned_ids[i]); + if (owned_ele && !DOMUtil_1.DOMUtil.sameNode(owned_ele, ruleContext) && owned_ele.contains(descendant)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + } + } + // 2. The element with DOM focus is a textbox with aria-controls referring to an element that + // supports aria-activedescendant, and the value of aria-activedescendant specified for the + // textbox refers to either a descendant of the element controlled by the textbox or is a logical + // descendant of that controlled element as indicated by the aria-owns attribute. + // + if (AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "textbox") && ruleContext.hasAttribute("aria-controls")) { + pofId = 3; + var controlled_ids = CommonUtil_1.CommonUtil.normalizeSpacing(ruleContext.getAttribute("aria-controls").trim()).split(" "); + for (var i = 0; i < controlled_ids.length; i++) { + var controlled_ele = fragment_1.FragmentUtil.getById(ruleContext, controlled_ids[i]); + if (controlled_ele && !DOMUtil_1.DOMUtil.sameNode(controlled_ele, ruleContext) && controlled_ele.contains(descendant)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + if (controlled_ele.hasAttribute("aria-owns")) { + var owns_ids = CommonUtil_1.CommonUtil.normalizeSpacing(controlled_ele.getAttribute("aria-owns").trim()).split(" "); + for (var j = 0; j < owns_ids.length; j++) { + var owned_ele = fragment_1.FragmentUtil.getById(ruleContext, owns_ids[j]); + if (owned_ele && !DOMUtil_1.DOMUtil.sameNode(owned_ele, ruleContext) && owned_ele.contains(descendant)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + } + } + } + } + // POF3: I'm not a combobox, and the referenced active-descendant is not a descendant and not owned by the element + // that referenced it. + if (pofId == 3) { + return (0, IRule_1.RuleFail)("Fail_3"); + } + return null; + } +}; + + +/***/ }, + +/***/ 1198 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_application_label_unique = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var VisUtil_1 = __webpack_require__(3946); +exports.aria_application_label_unique = { + id: "aria_application_label_unique", + context: "aria:application", + refactor: { + "Rpt_Aria_MultipleApplicationLandmarks": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_application_label_unique.html", + "fail_label_not_unique": "aria_application_label_unique.html", + "group": "aria_application_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"application\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"application\" role do not have unique labels", + "group": "Each element with \"application\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "application"); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ 8001 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_application_labelled = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AccNameUtil_1 = __webpack_require__(1950); +var VisUtil_1 = __webpack_require__(3946); +exports.aria_application_labelled = { + id: "aria_application_labelled", + context: "aria:application", + refactor: { + "Rpt_Aria_ApplicationLandmarkLabel": { + "Pass_0": "pass", + "Fail_1": "fail_no_label" + } + }, + help: { + "en-US": { + "pass": "aria_application_labelled.html", + "fail_no_label": "aria_application_labelled.html", + "group": "aria_application_labelled.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"application\" role has a label that describes its purpose", + "fail_no_label": "Element with \"application\" role does not have a label", + "group": "Each element with \"application\" role must have a label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + if (!pair) { + return (0, IRule_1.RuleFail)("fail_no_label"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ 5778 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_article_label_unique = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var VisUtil_1 = __webpack_require__(3946); +var AriaUtil_1 = __webpack_require__(7011); +exports.aria_article_label_unique = { + id: "aria_article_label_unique", + context: "aria:article", + refactor: { + "Rpt_Aria_MultipleArticleRoles_Implicit": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_article_label_unique.html", + "fail_label_not_unique": "aria_article_label_unique.html", + "group": "aria_article_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"article\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"article\" role do not have unique labels", + "group": "Each element with \"article\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "article"); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ 8118 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_allowed = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var ARIADefinitions_1 = __webpack_require__(9910); +var AriaUtil_1 = __webpack_require__(7011); +exports.aria_attribute_allowed = { + id: "aria_attribute_allowed", + context: "dom:*", + refactor: { + "Rpt_Aria_ValidProperty": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "aria_attribute_allowed.html", + "Pass_0": "aria_attribute_allowed.html", + "Fail_1": "aria_attribute_allowed.html" + } + }, + messages: { + "en-US": { + "group": "ARIA attributes must be valid for the element's role", + "Pass_0": "Rule Passed", + "Fail_1": "The attribute(s) '{0}' referenced by the element <{1}> is not a valid ARIA state or property" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "4.1.2", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: "5f99a7", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var contextAttributes = ruleContext.attributes; + // This gets all elements with attributes so we still have some + // Out of Scope since not all attributes are aria + if (contextAttributes) { + var propertyDataTypes = ARIADefinitions_1.ARIADefinitions.propertyDataTypes; + var failedProperties = ""; + var testedProperties = 0; + for (var i = 0, length_1 = contextAttributes.length; i < length_1; i++) { + var attrName = contextAttributes[i].name; + if (AriaUtil_1.AriaUtil.isDefinedAriaAttribute(ruleContext, attrName)) { + testedProperties++; + // Now we just have aria attributes which can + // pass or fail based on whether there property is valid + var dataTypes = propertyDataTypes[attrName]; + if (!dataTypes) { // if property is not in valid property list + // create failedProperties comma sep list + if (failedProperties.length == 0) { + failedProperties = attrName; + } + else { + failedProperties = failedProperties + ", " + attrName; + } + } + } + } + if (testedProperties == 0) { + return null; + } + else if (failedProperties.length != 0) { + return (0, IRule_1.RuleFail)("Fail_1", [failedProperties, ruleContext.nodeName.toLowerCase()]); + } + else { + //return RulePass(1); + return (0, IRule_1.RulePass)("Pass_0"); + } + } + else { + return null; + } + // JCH - passing is based on all attributes not just aria attributes + // leading to OVER COUNTING so moved pass up + //return RulePass(1); + } +}; + + +/***/ }, + +/***/ 2242 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_conflict = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +exports.aria_attribute_conflict = { + id: "aria_attribute_conflict", + context: "dom:*[aria-required], dom:*[aria-autocomplete], dom:*[aria-readonly], dom:*[aria-disabled], dom:*[aria-placeholder]" + + ", dom:*[aria-checked], dom:*[aria-hidden], dom:*[aria-valuemax], dom:*[aria-valuemin], dom:*[aria-colspan]" + + ", dom:*[aria-rowspan]", + help: { + "en-US": { + // "pass": "aria_attribute_conflict.html", + "fail_conflict": "aria_attribute_conflict.html", + "group": "aria_attribute_conflict.html" + } + }, + messages: { + "en-US": { + // "pass": "The ARIA attribute is not conflict with the corresponding HTML attribute", + "fail_conflict": "The ARIA attribute \"{0}\" is in conflict with the corresponding HTML attribute \"{1}\"", + "group": "An ARIA attribute must not conflict with the corresponding HTML attribute" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // dependency check: if the ARIA attribute is completely invalid, skip this check + var invalidAttributes = AriaUtil_1.AriaUtil.getInvalidAriaAttributes(ruleContext); + if (invalidAttributes && invalidAttributes.length > 0) + return null; + var ret = []; + var ariaAttributes = AriaUtil_1.AriaUtil.getUserDefinedAriaAttributes(ruleContext); + if (!ariaAttributes || ariaAttributes.length === 0) + return null; + var conflictAttributes = AriaUtil_1.AriaUtil.getConflictAriaAndHtmlAttributes(ruleContext); + for (var i = 0; i < conflictAttributes.length; i++) { + ret.push((0, IRule_1.RuleFail)("fail_conflict", [conflictAttributes[i]['ariaAttr'], conflictAttributes[i]['htmlAttr']])); + if (ariaAttributes.includes(conflictAttributes[i]['ariaAttr'])) + CommonUtil_1.CommonUtil.reduceArrayItemList([conflictAttributes[i]['ariaAttr']], ariaAttributes); + } + if (ret.length > 0) + return ret; + return null; + } +}; + + +/***/ }, + +/***/ 3673 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_deprecated = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +exports.aria_attribute_deprecated = { + id: "aria_attribute_deprecated", + context: "dom:*", + help: { + "en-US": { + // "pass": "aria_attribute_deprecated.html", + "fail_aria_role": "aria_attribute_deprecated.html", + "fail_aria_attr": "aria_attribute_deprecated.html", + "fail_role_attr": "aria_attribute_deprecated.html", + "group": "aria_attribute_deprecated.html" + } + }, + messages: { + "en-US": { + // "pass": "The ARIA roles and attribute are used per specification", + "fail_aria_role": "The ARIA role \"{0}\" is deprecated in the ARIA specification", + "fail_aria_attr": "The ARIA attributes \"{0}\" are deprecated in the ARIA specification", + "fail_role_attr": "The ARIA attributes \"{0}\" are deprecated for the role \"{1}\" in the ARIA specification", + "group": "No deprecated ARIA role or attribute should be used" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["ARIA"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var ret = []; + var deprecatedRoles = AriaUtil_1.AriaUtil.getDeprecatedAriaRoles(ruleContext); + if (deprecatedRoles && deprecatedRoles.length > 0) { + for (var i = 0; i < deprecatedRoles.length; i++) + ret.push((0, IRule_1.RuleFail)('fail_aria_role', [deprecatedRoles[i]])); + } + var deprecatedAttributes = AriaUtil_1.AriaUtil.getDeprecatedAriaAttributes(ruleContext); + if (deprecatedAttributes && deprecatedAttributes.length > 0) { + for (var i = 0; i < deprecatedAttributes.length; i++) { + // "role":"any", "attribute":ariaAttrs[i]} + if (deprecatedAttributes[i].role === 'any') + ret.push((0, IRule_1.RuleFail)('fail_aria_attr', [deprecatedAttributes[i].attribute])); + else + ret.push((0, IRule_1.RuleFail)('fail_role_attr', [deprecatedAttributes[i].attribute, deprecatedAttributes[i].role])); + } + } + if (ret.length > 0) + return ret; + return null; + } +}; + + +/***/ }, + +/***/ 5080 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_exists = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +var ARIADefinitions_1 = __webpack_require__(9910); +var VisUtil_1 = __webpack_require__(3946); +exports.aria_attribute_exists = { + id: "aria_attribute_exists", + context: "dom:*[role]", + dependencies: ["aria_role_allowed"], + refactor: { + "Rpt_Aria_EmptyPropertyValue": { + "pass": "pass", + "fail_empty_attribute": "fail_empty_attribute" + } + }, + help: { + "en-US": { + "pass": "aria_attribute_exists.html", + "fail_empty_attribute": "aria_attribute_exists.html", + "group": "aria_attribute_exists.html" + } + }, + messages: { + "en-US": { + "pass": "Rule Passed", + "fail_empty_attribute": "The element attribute(s): '{0}' value is empty", + "group": "When specifying a required ARIA attribute, the value must not be empty" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: ["6a7281"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return; + var attrNameArr = new Array(); + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + var hasAttribute = CommonUtil_1.CommonUtil.hasAttribute; + var testedProperties = 0; + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + if (!role) + return; + if (designPatterns[role] && AriaUtil_1.AriaUtil.getRoleRequiredProperties(role, ruleContext) != null) { + var requiredRoleProps = AriaUtil_1.AriaUtil.getRoleRequiredProperties(role, ruleContext); + for (var i = 0, length_1 = requiredRoleProps.length; i < length_1; i++) { + var attribute = requiredRoleProps[i]; + if (hasAttribute(ruleContext, attribute)) { + testedProperties++; + var nodeValue = CommonUtil_1.CommonUtil.normalizeSpacing(ruleContext.getAttribute(requiredRoleProps[i])); + if (nodeValue.length == 0) + attrNameArr.push(requiredRoleProps[i]); + } + else if (requiredRoleProps[i] == "aria-labelledby") { + if ((role == "radiogroup") && (hasAttribute(ruleContext, "aria-label"))) { + testedProperties++; + var nodeValue = CommonUtil_1.CommonUtil.normalizeSpacing(ruleContext.getAttribute("aria-label")); + if (nodeValue.length == 0) + attrNameArr.push("aria-label"); + } + } + else if (requiredRoleProps[i] == "aria-valuenow") { + if ((role == "progressbar") && (hasAttribute(ruleContext, "aria-valuetext"))) { + testedProperties++; + var nodeValue = CommonUtil_1.CommonUtil.normalizeSpacing(ruleContext.getAttribute("aria-valuetext")); + if (nodeValue.length == 0) + attrNameArr.push("aria-valuetext"); + } + } + } + } + if (designPatterns[role]) { + var tagProperty = AriaUtil_1.AriaUtil.getElementAriaProperty(ruleContext); + var permittedRoles = []; + permittedRoles.push(role); + var allowedAttributes = AriaUtil_1.AriaUtil.getAllowedAriaAttributes(ruleContext, permittedRoles, tagProperty); + for (var i = 0, length_2 = allowedAttributes.length; i < length_2; i++) { + var attribute = allowedAttributes[i]; + if (attribute == "aria-checked" || attribute == "aria-selected" || + attribute == "aria-expanded" || attribute == "aria-orientation" || + attribute == "aria-level") { + if (hasAttribute(ruleContext, attribute)) { + testedProperties++; + var nodeValue = CommonUtil_1.CommonUtil.normalizeSpacing(ruleContext.getAttribute(attribute)); + if (nodeValue.length == 0 && !attrNameArr.includes(attribute)) { + attrNameArr.push(attribute); + } + } + } + } + } + var retMsg = new Array(); + var passed = attrNameArr.length == 0; + retMsg.push(attrNameArr.join(", ")); + //return new ValidationResult(passed, [ruleContext], attrNameArr, '', retMsg); + if (testedProperties == 0) { + return null; + } + else if (!passed) { + return (0, IRule_1.RuleFail)("fail_empty_attribute", retMsg); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ 183 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_redundant = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +exports.aria_attribute_redundant = { + id: "aria_attribute_redundant", + context: "dom:*[aria-required], dom:*[aria-autocomplete], dom:*[aria-readonly], dom:*[aria-disabled], dom:*[aria-placeholder]" + + ", dom:*[aria-checked], dom:*[aria-hidden], dom:*[aria-valuemax], dom:*[aria-valuemin], dom:*[aria-colspan]" + + ", dom:*[aria-rowspan]", + help: { + "en-US": { + "pass": "aria_attribute_redundant.html", + "fail_redundant": "aria_attribute_redundant.html", + "group": "aria_attribute_redundant.html" + } + }, + messages: { + "en-US": { + "pass": "The ARIA attribute is not redundant with a corresponding HTML attribute", + "fail_redundant": "The ARIA attribute \"{0}\" is redundant with the HTML attribute \"{1}\"", + "group": "An ARIA attribute should not be redundant with a corresponding HTML attribute" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // dependency check: if the ARIA attribute is completely invalid, skip this check + var invalidAttributes = AriaUtil_1.AriaUtil.getInvalidAriaAttributes(ruleContext); + if (invalidAttributes && invalidAttributes.length > 0) + return null; + // if conflict already reported, ignore reporting overlap + var conflictAttributes = AriaUtil_1.AriaUtil.getConflictAriaAndHtmlAttributes(ruleContext); + if (conflictAttributes && conflictAttributes.length > 0) + return null; + var domAttributes = ruleContext.attributes; + var ariaAttrs = []; + var htmlAttrs = []; + if (domAttributes) { + for (var i = 0; i < domAttributes.length; i++) { + var attrName = domAttributes[i].name.trim().toLowerCase(); + var attrValue = ruleContext.getAttribute(attrName); + if (attrValue === '') + attrValue = null; + if (attrName.substring(0, 5) === 'aria-') + ariaAttrs.push({ name: attrName, value: attrValue }); + else + htmlAttrs.push({ name: attrName, value: attrValue }); + } + } + var ret = []; + var _loop_1 = function (i) { + var examinedHtmlAtrNames = AriaUtil_1.AriaUtil.getConflictOrOverlappingHtmlAttribute(ariaAttrs[i], htmlAttrs, 'overlapping'); + if (examinedHtmlAtrNames === null) + return "continue"; + examinedHtmlAtrNames.forEach(function (item) { + if (item['result'] === 'Pass') { //pass + ret.push((0, IRule_1.RulePass)("pass")); + } + else if (item['result'] === 'Failed') { //failed + ret.push((0, IRule_1.RuleFail)("fail_redundant", [ariaAttrs[i]['name'], item['attr']])); + } + }); + }; + for (var i = 0; i < ariaAttrs.length; i++) { + _loop_1(i); + } + if (ret.length > 0) + return ret; + return null; + } +}; + + +/***/ }, + +/***/ 6805 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_required = void 0; +var ARIADefinitions_1 = __webpack_require__(9910); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +exports.aria_attribute_required = { + id: "aria_attribute_required", + context: "dom:*[role]", + dependencies: ["aria_role_allowed"], + refactor: { + "Rpt_Aria_RequiredProperties": { + "Pass_0": "pass", + "Fail_1": "fail_missing" + } + }, + help: { + "en-US": { + "group": "aria_attribute_required.html", + "pass": "aria_attribute_required.html", + "fail_missing": "aria_attribute_required.html" + } + }, + messages: { + "en-US": { + "group": "The required attributes for the element with a role must be defined", + "pass": "The required attributes for the element with the role are defined", + "fail_missing": "Element with '{0}' role does not have the required ARIA attribute(s): '{1}'" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "4.1.2", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: "4e8ab6", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var attrNameArr = new Array(); + var roleNameArr = new Array(); + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + //let implicitRole = ARIAMapper.elemToImplicitRole(ruleContext); + //let implicitRole = AriaUtil.getImplicitRole(ruleContext); + var hasAttribute = CommonUtil_1.CommonUtil.hasAttribute; + var testedRoles = 0; + var tagProperty = AriaUtil_1.AriaUtil.getElementAriaProperty(ruleContext); + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + if (!role) + return; + var requiredRoleProps = AriaUtil_1.AriaUtil.getRoleRequiredProperties(role, ruleContext); + if (designPatterns[role] && requiredRoleProps !== null) { + var allowedRoleProps = AriaUtil_1.AriaUtil.getAllowedAriaAttributes(ruleContext, role, tagProperty); + var roleMissingReqProp = false; + for (var i = 0, propertiesLength = requiredRoleProps.length; i < propertiesLength; i++) { + if (!allowedRoleProps.includes(requiredRoleProps[i])) + continue; + if (!hasAttribute(ruleContext, requiredRoleProps[i])) { + // If an aria-labelledby isn't present, an aria-label will meet the requirement. + if (requiredRoleProps[i] == "aria-labelledby") { + if ((!hasAttribute(ruleContext, "aria-label")) || (role != "radiogroup")) { + attrNameArr.push(requiredRoleProps[i]); + roleMissingReqProp = true; + } + } + else if (requiredRoleProps[i] == "aria-valuenow") { + if ((!hasAttribute(ruleContext, "aria-valuetext")) || (role != "progressbar")) { + attrNameArr.push(requiredRoleProps[i]); + roleMissingReqProp = true; + } + } + else if (requiredRoleProps[i] == "aria-controls" && role == "combobox") { + // Skip this check since aria-controls in the textbox of a combobox is already handled in rule HAAC_Combobox_Must_have_Text_Input + } + else { + attrNameArr.push(requiredRoleProps[i]); + roleMissingReqProp = true; + } + } + } + if (roleMissingReqProp == true) { + roleNameArr.push(role); + } + } + var passed = roleNameArr.length == 0 || attrNameArr.length == 0; // only aria attributes so NO OUT OF SCOPE + if (!passed) { + var retToken = new Array(); + retToken.push(roleNameArr.join(", ")); + retToken.push(attrNameArr.join(", ")); + return (0, IRule_1.RuleFail)("fail_missing", retToken); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ 1886 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_value_valid = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +var ARIADefinitions_1 = __webpack_require__(9910); +exports.aria_attribute_value_valid = { + id: "aria_attribute_value_valid", + context: "dom:*", + dependencies: ["aria_attribute_allowed"], + refactor: { + "Rpt_Aria_ValidPropertyValue": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "aria_attribute_value_valid.html", + "Pass_0": "aria_attribute_value_valid.html", + "Fail_1": "aria_attribute_value_valid.html" + } + }, + messages: { + "en-US": { + "group": "ARIA property values must be valid", + "Pass_0": "Rule Passed", + "Fail_1": "The value \"{0}\" specified for attribute '{1}' on element <{2}> is not valid" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: "6a7281", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var valueArr = new Array(); + var attrNameArr = new Array(); + var dataTypeArr = new Array(); + var propertyDataTypes = ARIADefinitions_1.ARIADefinitions.propertyDataTypes; + var contextAttributes = ruleContext.attributes; + var testedPropertyValues = 0; + if (contextAttributes) { + for (var i = 0, length_1 = contextAttributes.length; i < length_1; i++) { + var attrName = contextAttributes[i].name; + if (AriaUtil_1.AriaUtil.isDefinedAriaAttribute(ruleContext, attrName)) { + var dataTypes = propertyDataTypes[attrName]; + var nodeValue = CommonUtil_1.CommonUtil.normalizeSpacing(contextAttributes[i].nodeValue); + testedPropertyValues++; + if (dataTypes && dataTypes.values) { + if (dataTypes.values.indexOf(nodeValue) == -1) { + if (dataTypes.values.indexOf('undefined') != -1 && nodeValue.length == 0) { + //translate 'undefined' to mean '' + } + else { + // aria-relevant is represented as a space delimited list of the following values: + // additions, removals, text; or a single catch-all value all. + if (dataTypes.type === "http://www.w3.org/2001/XMLSchema#nmtokens") { + var attrValues = contextAttributes[i].nodeValue.trim().split(" "); + // if the value all is specified, it cannot have any other value + if (attrValues.length > 1 && attrValues.includes("all")) { + valueArr.push(contextAttributes[i].nodeValue.split(" ")); + attrNameArr.push(attrName); + dataTypeArr.push(dataTypes.values.toString()); + } + else { + var hash = {}; + for (var j = 0; j < attrValues.length; j++) { + // if the individual value is not in the list of allowed values + if (attrValues[j] != "" && !dataTypes.values.includes(attrValues[j])) { + if (!hash.hasOwnProperty(attrName)) { + hash[attrName] = true; + attrNameArr.push(attrName); + } + valueArr.push(attrValues[j]); + dataTypeArr.push(dataTypes.values.toString()); + } + } + } + } + else { + valueArr.push(contextAttributes[i].nodeValue.split(" ")); + attrNameArr.push(attrName); + dataTypeArr.push(dataTypes.values.toString()); + } + } + } + } + else if (dataTypes && dataTypes.type && dataTypes.type === "http://www.w3.org/2001/XMLSchema#int") { + var iVal = parseInt(nodeValue); + if (isNaN(iVal) || ("" + iVal !== nodeValue)) { + valueArr.push(nodeValue); + attrNameArr.push(attrName); + } + } + else if (dataTypes && dataTypes.type && dataTypes.type == "http://www.w3.org/2001/XMLSchema#decimal") { + var fVal = parseFloat(nodeValue); + if (isNaN(fVal)) { + valueArr.push(nodeValue); + attrNameArr.push(attrName); + } + } + else if (dataTypes && dataTypes.type && (dataTypes.type == "http://www.w3.org/2001/XMLSchema#boolean")) { + var tmpV = nodeValue.trim().toLowerCase(); + if (tmpV !== "true" && tmpV !== "false") { + valueArr.push(nodeValue); + attrNameArr.push(attrName); + } + } + else if (dataTypes && dataTypes.type && (dataTypes.type == "http://www.w3.org/2001/XMLSchema#string")) { + } + else { + testedPropertyValues--; + } + } + } + } + var retMsg = new Array(); + var passed = attrNameArr.length == 0; + retMsg.push(valueArr.join(", ")); + retMsg.push(attrNameArr.join(", ")); + retMsg.push(ruleContext.nodeName.toLowerCase()); + // retMsg.push (dataTypeArr.join(", ")); + //return new ValidationResult(passed, [ruleContext], attrNameArr, '', retMsg); + if (testedPropertyValues == 0) { + return null; + } + else if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", retMsg); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ 4078 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_banner_label_unique = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var VisUtil_1 = __webpack_require__(3946); +exports.aria_banner_label_unique = { + id: "aria_banner_label_unique", + context: "aria:banner", + refactor: { + "Rpt_Aria_MultipleBannerLandmarks_Implicit": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_banner_label_unique.html", + "fail_label_not_unique": "aria_banner_label_unique.html", + "group": "aria_banner_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"banner\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"banner\" role do not have unique labels", + "group": "Each element with \"banner\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "banner", true); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ 5750 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_banner_single = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var VisUtil_1 = __webpack_require__(3946); +exports.aria_banner_single = { + id: "aria_banner_single", + context: "dom:*[role], dom:header", + refactor: { + "Rpt_Aria_OneBannerInSiblingSet_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_banner_single.html", + "Fail_1": "aria_banner_single.html", + "group": "aria_banner_single.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Multiple elements with \"banner\" role found on the page", + "group": "A page, document, or application should only have one element with \"banner\" role" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + if (!AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "banner")) { + return null; + } + var passed = AriaUtil_1.AriaUtil.getSiblingWithRoleHidden(ruleContext, "banner", true, true) === null; + //return new ValidationResult(passed, [ruleContext], 'role', '', []); + if (passed) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } +}; + + +/***/ }, + +/***/ 85 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_child_tabbable = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +var ARIADefinitions_1 = __webpack_require__(9910); +var VisUtil_1 = __webpack_require__(3946); +exports.aria_child_tabbable = { + id: "aria_child_tabbable", + context: "dom:*[role]", + dependencies: ["aria_role_allowed"], + refactor: { + "Rpt_Aria_MissingFocusableChild": { + "pass": "pass", + "fail_missing_child": "fail_missing_child" + } + }, + help: { + "en-US": { + "pass": "aria_child_tabbable.html", + "fail_missing_child": "aria_child_tabbable.html", + "group": "aria_child_tabbable.html" + } + }, + messages: { + "en-US": { + "pass": "Rule Passed", + "fail_missing_child": "None of the descendent elements with \"{1}\" role is tabbable", + "group": "UI component must have at least one tabbable descendant for keyboard access" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip the check if the element requires presentational children only + if (AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(ruleContext) || AriaUtil_1.AriaUtil.shouldBePresentationalChild(ruleContext)) + return; + // An ARIA list is not interactive + if (AriaUtil_1.AriaUtil.hasRole(ruleContext, { "list": true, "row": true, "rowgroup": true, "table": true, "grid": true })) { + return null; + } + // Not a valid message for mobile because all elements are focusable in iOS when VoiceOver is enabled. + if (ruleContext.hasAttribute("class") && ruleContext.getAttribute("class").substring(0, 3) == "mbl") { + return null; + } + //ignore datalist element check since it will be part of a input element or hidden by default + if (ruleContext.nodeName.toLowerCase() === 'datalist') + return null; + // ignore if the element's navigation is controlled by another element, such as combobox + if (AriaUtil_1.AriaUtil.isNavigationOwnedOrControlled(ruleContext)) + return null; + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + var passed = true; + var doc = ruleContext.ownerDocument; + var hasAttribute = CommonUtil_1.CommonUtil.hasAttribute; + var roleNameArr = new Array(); + var nodeName = ""; + var inScope = false; + if (ARIADefinitions_1.ARIADefinitions.containers.includes(role)) { + var disabled = hasAttribute(ruleContext, 'aria-disabled') ? ruleContext.getAttribute("aria-disabled") : ''; + if (disabled != 'true' && !hasAttribute(ruleContext, 'aria-activedescendant') && !CommonUtil_1.CommonUtil.isTabbable(ruleContext)) { + var reqChildren = ARIADefinitions_1.ARIADefinitions.designPatterns[role].reqChildren; + if (reqChildren) { + inScope = true; + passed = false; + var xp = "descendant::*["; + for (var i = 0; i < reqChildren.length; i++) { + xp += "@role='" + reqChildren[i] + "' or "; + } + xp = xp.substring(0, xp.length - 4) + ']'; + var xpathResult = doc.evaluate(xp, ruleContext, CommonUtil_1.CommonUtil.defaultNSResolver, 0 /* XPathResult.ANY_TYPE */, null); + var r = xpathResult.iterateNext(); + while (r && !passed) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(r)) { + r = xpathResult.iterateNext(); + continue; + } + passed = CommonUtil_1.CommonUtil.isTabbable(r); + // Required child is not focusable via tabindex. See if there is a grandchild that is focusable by default or by tabindex. + if (!passed) { + var xp2 = "descendant::*"; + var xpathResult2 = doc.evaluate(xp2, r, CommonUtil_1.CommonUtil.defaultNSResolver, 0 /* XPathResult.ANY_TYPE */, null); + var r2 = xpathResult2.iterateNext(); + while (r2 && !passed) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(r2)) { + r2 = xpathResult2.iterateNext(); + continue; + } + passed = CommonUtil_1.CommonUtil.isTabbable(r); + r2 = xpathResult2.iterateNext(); + } + } + if (!passed) { + roleNameArr = r.getAttribute("role").trim().split(" "); + nodeName = r.nodeName.toLowerCase(); + } + r = xpathResult.iterateNext(); + } + } + } + } + // Variable Decleration + var retToken1 = new Array(); + var retToken2 = new Array(); + // In the case the arrays/strings are empty, that means that there is no violation so we can reset it back to passed, the reason for this + // is that we are setting passed=false while we perform a loop which causes violation to trigger even if there is no issues. Instead of + // updating the whole rule to switch from using passed in that way simply do the check at this point. + if (nodeName.length > 0 && roleNameArr.length > 0) { + retToken1.push(nodeName); + retToken2.push(roleNameArr.join(", ")); + } + else { + passed = true; + } + //return new ValidationResult(passed, [ruleContext], 'role', '', passed == true ? [] : [retToken1, retToken2]); + if (!inScope) { + return null; + } + else if (!passed) { + return (0, IRule_1.RuleFail)("fail_missing_child", [retToken1.toString(), retToken2.toString()]); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ 514 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_child_valid = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +var VisUtil_1 = __webpack_require__(3946); +exports.aria_child_valid = { + id: "aria_child_valid", + //context: "dom:*[role]", + //dependencies: ["Rpt_Aria_ValidRole"], + context: "dom:*", + dependencies: ["aria_role_valid", "aria_descendant_valid"], + help: { + "en-US": { + "group": "aria_child_valid.html", + "Pass": "aria_child_valid.html", + "Fail_no_child": "aria_child_valid.html", + "Fail_invalid_child": "aria_child_valid.html" + } + }, + messages: { + "en-US": { + "group": "An element with an ARIA role must own a required child", + "Pass": "An element with an ARIA role owns a required child", + "Fail_no_child": "The element with role \"{0}\" does not own any child element with any of the following role(s): \"{1}\"", + "Fail_invalid_child": "The element with role \"{0}\" owns the child element with the role \"{1}\" that is not one of the allowed role(s): \"{2}\"" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + // TODO: ACT: Verify mapping + act: ["bc4a75"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip the check if the element requires presentational children only + if (AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(ruleContext)) + return; + var roles = AriaUtil_1.AriaUtil.getRoles(ruleContext, false); + // if explicit role doesn't exist, get the implicit one + if (!roles || roles.length === 0) + roles = AriaUtil_1.AriaUtil.getImplicitRole(ruleContext); + //ignore if the element doesn't have any explicit or implicit role, shouldn't happen + if (!roles || roles.length === 0) + return null; + // ignore if the element contains none or presentation role + var presentationRoles = ["none", "presentation"]; + var found = roles.some(function (r) { return presentationRoles.includes(r); }); + if (found) + return null; + // For combobox, we have g1193 ... g1199 to check the values etc. + // We don't want to trigger 1152 again. So, we bypass it here. + if (roles.includes("combobox")) + return null; + var requiredChildRoles = AriaUtil_1.AriaUtil.getRequiredChildRoles(ruleContext, true); + // a 'group' role is allowed but not required for some elements so remove it if exists + if (requiredChildRoles.includes('group')) { + var index = requiredChildRoles.indexOf('group'); + if (index > -1) + requiredChildRoles.splice(index, 1); + } + /** + * ignore if a role doesn't require a child with any specific role + * the reverse might be not true - parent will be checked in Rpt_Aria_RequiredParent_Native_Host_Sematics rule + */ + if (requiredChildRoles.length == 0) + return null; + // get all the children from accessibility tree, + // including ones with aria-owns + var directATChildren = AriaUtil_1.AriaUtil.getDirectATChildren(ruleContext); + if (!directATChildren || directATChildren.length == 0) { + // the element with at least one required role dosen't contain any accessible child + /** + * When a widget is missing required owned elements due to script execution or loading, + * authors MUST mark a containing element with 'aria-busy' equal to true. + */ + var busy = ruleContext.getAttribute("aria-busy"); + if (!busy || busy !== 'true') { + var retToken = new Array(); + retToken.push(roles.join(", ")); + retToken.push(requiredChildRoles.join(", ")); + return (0, IRule_1.RuleFail)("Fail_no_child", retToken); + } + // it's 'busy' loading, ignore it + return null; + } + var violateElemRoles = new Array(); + for (var j = 0; j < directATChildren.length; j++) { + var childRoles = AriaUtil_1.AriaUtil.getRoles(directATChildren[j], false); + // if explicit role doesn't exist, get the implicit one + if (!childRoles || childRoles.length == 0) + childRoles = AriaUtil_1.AriaUtil.getImplicitRole(directATChildren[j]); + if (childRoles && childRoles.length > 0) { + /** + * when multiple roles are specified as required owned elements for a role, at least one instance of one required owned element is expected. + * the specification does not require an instance of each of the listed owned roles. + * therefore, the requirement is met if it has any one of the required roles. + */ + var found_1 = childRoles.some(function (r) { return requiredChildRoles.includes(r); }); + if (!found_1) + violateElemRoles.push(childRoles.join(", ")); + } + else { + // ignore the element since it's not semantic, shouldn't happen + } + } + if (violateElemRoles.length > 0) { + var retValues = []; + for (var i = 0; i < violateElemRoles.length; i++) { + var retToken = new Array(); + retToken.push(roles.join(", ")); + retToken.push(violateElemRoles[i]); + retToken.push(requiredChildRoles.join(", ")); + retValues.push((0, IRule_1.RuleFail)("Fail_invalid_child", retToken)); + } + return retValues; + } + return (0, IRule_1.RulePass)("Pass"); + } +}; + + +/***/ }, + +/***/ 5310 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_complementary_label_unique = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var VisUtil_1 = __webpack_require__(3946); +exports.aria_complementary_label_unique = { + id: "aria_complementary_label_unique", + context: "aria:complementary", + refactor: { + "Rpt_Aria_MultipleComplementaryLandmarks_Implicit": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_complementary_label_unique.html", + "fail_label_not_unique": "aria_complementary_label_unique.html", + "group": "aria_complementary_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"complementary\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"complementary\" role do not have unique labels", + "group": "Each element with \"complementary\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "complementary"); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ 9083 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_complementary_label_visible = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +var VisUtil_1 = __webpack_require__(3946); +exports.aria_complementary_label_visible = { + id: "aria_complementary_label_visible", + context: "dom:*[role], dom:aside", + dependencies: ["aria_complementary_labelled"], + refactor: { + "Rpt_Aria_ComplementaryLandmarkLabel_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_complementary_label_visible.html", + "Fail_1": "aria_complementary_label_visible.html", + "group": "aria_complementary_label_visible.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Element with \"complementary\" role does not have a visible label", + "group": "Each element with \"complementary\" role should have a visible label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + if (!AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "complementary")) { + return null; + } + var passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "aria-labelledby"); + //return new ValidationResult(passed, [ruleContext], 'role', '', []); + if (passed) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } +}; + + +/***/ }, + +/***/ 6049 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_complementary_labelled = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AccNameUtil_1 = __webpack_require__(1950); +var VisUtil_1 = __webpack_require__(3946); +exports.aria_complementary_labelled = { + id: "aria_complementary_labelled", + context: "aria:complementary", + refactor: { + "Rpt_Aria_ComplementaryRequiredLabel_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_complementary_labelled.html", + "Fail_1": "aria_complementary_labelled.html", + "group": "aria_complementary_labelled.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Element with \"complementary\" role does not have a label", + "group": "Each element with \"complementary\" role must have a label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + if (pair) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } +}; + + +/***/ }, + +/***/ 5099 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_content_in_landmark = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +var CacheUtil_1 = __webpack_require__(4566); +var DOMWalker_1 = __webpack_require__(3864); +var VisUtil_1 = __webpack_require__(3946); +var TableUtil_1 = __webpack_require__(9196); +exports.aria_content_in_landmark = { + id: "aria_content_in_landmark", + context: "dom:*", + refactor: { + "Rpt_Aria_OrphanedContent_Native_Host_Sematics": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_content_in_landmark.html", + "Fail_1": "aria_content_in_landmark.html", + "group": "aria_content_in_landmark.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Content is not within a landmark element", + "group": "All content must reside within an element with a landmark role" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }, + { + "id": ["WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var params = CacheUtil_1.CacheUtil.getCache(context.dom.node.ownerDocument, "aria_content_in_landmark", null); + if (!params) { + params = { + landmarks: { + value: ["banner", "complementary", "contentinfo", "form", "main", "navigation", "region", "search"], + type: "array" + }, + possibleOrphanedWidgets: { + value: ["button", "combobox", "checkbox", "grid", "heading", "link", "list", + "listbox", "menu", "menubar", "progressbar", "radio", "tablist", "textbox", "toolbar", "tree", + "treegrid" + ], + type: "array" + }, + possibleOrphanedElements: { + value: ["p", "table", "input", "textarea", "select", "button", "a", "ol", "ul", "dl", "h1", "h2", "h3", "h4", "h5", + "h6", "embed", "object", "area" + ], + type: "array" + }, + noLandmarkedRoles: { + // These roles don't require landmarks + value: ["alert", "alertdialog", "dialog", "tooltip"], + type: "array" + }, + mapLandmarks: {}, + mapPossibleOrphanedWidgets: {}, + mapPossibleOrphanedElements: {}, + mapNoLandmarkedRoles: {} + }; + // Convert arrays to maps + params.mapLandmarks = {}; + for (var i = 0; i < params.landmarks.value.length; ++i) { + params.mapLandmarks[params.landmarks.value[i]] = true; + } + params.mapPossibleOrphanedWidgets = {}; + for (var i = 0; i < params.possibleOrphanedWidgets.value.length; ++i) { + params.mapPossibleOrphanedWidgets[params.possibleOrphanedWidgets.value[i]] = true; + } + params.mapPossibleOrphanedElements = {}; + for (var i = 0; i < params.possibleOrphanedElements.value.length; ++i) { + params.mapPossibleOrphanedElements[params.possibleOrphanedElements.value[i]] = true; + } + params.mapNoLandmarkedRoles = {}; + for (var i = 0; i < params.noLandmarkedRoles.value.length; ++i) { + params.mapNoLandmarkedRoles[params.noLandmarkedRoles.value[i]] = true; + } + CacheUtil_1.CacheUtil.setCache(context.dom.node.ownerDocument, "aria_content_in_landmark", params); + } + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || // avoid diagnosing g1157 for non-visible nodes + (VisUtil_1.VisUtil.hiddenByDefaultElements != null && + VisUtil_1.VisUtil.hiddenByDefaultElements != undefined && + VisUtil_1.VisUtil.hiddenByDefaultElements.indexOf(nodeName) > -1)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + var elemsWithoutContent = ["area", "input", "embed", "button", "textarea", "select"]; + if (!CommonUtil_1.CommonUtil.hasInnerContentHidden(ruleContext) && //only trigger the rule on elements that have content + elemsWithoutContent.indexOf(nodeName) === -1) { // a few elems wihout content should not be skipped + return (0, IRule_1.RulePass)("Pass_0"); + } + // Short circuit for layout tables + if (nodeName == "table" && TableUtil_1.TableUtil.isLayoutTable(ruleContext)) { + return null; + } + // Check if it is a possible orphan + var passed = true; + var isPossibleOrphanedWidget = AriaUtil_1.AriaUtil.hasRole(ruleContext, params.mapPossibleOrphanedWidgets, true); + //exclude <link rel="stylesheet" href="xyz.css"> in the <head> and <body>(#608) + //having link in the head could cause lot of violaions + if (nodeName === 'link') { + isPossibleOrphanedWidget = false; + } + var isPossibleOrphanedElement = nodeName in params.mapPossibleOrphanedElements; + if (isPossibleOrphanedWidget || isPossibleOrphanedElement) { + // See if ancestor has landmark roles or implicit land mark roles + var parentRoles = contextHierarchies["aria"].map(function (info) { return info.role; }); + passed = parentRoles.filter(function (role) { return role in params.mapLandmarks; }).length > 0; + if (!passed) { + // Don't fail elements when a parent or sibling has failed - causes too many messages. + var walkElement = DOMWalker_1.DOMWalker.parentElement(ruleContext); + while (!passed && walkElement != null) { + passed = CacheUtil_1.CacheUtil.getCache(walkElement, "Rpt_Aria_OrphanedContent", false); + walkElement = DOMWalker_1.DOMWalker.parentElement(walkElement); + } + walkElement = ruleContext.nextElementSibling; + while (!passed && walkElement != null) { + passed = CacheUtil_1.CacheUtil.getCache(walkElement, "Rpt_Aria_OrphanedContent", false); + walkElement = walkElement.nextElementSibling; + } + walkElement = ruleContext.previousElementSibling; + while (!passed && walkElement != null) { + passed = CacheUtil_1.CacheUtil.getCache(walkElement, "Rpt_Aria_OrphanedContent", false); + walkElement = walkElement.previousElementSibling; + } + if (!passed) { + CacheUtil_1.CacheUtil.setCache(ruleContext, "Rpt_Aria_OrphanedContent", true); + // Don't trigger rule if element is a stand-alone widget + passed = CacheUtil_1.CacheUtil.getCache(ruleContext, "Rpt_Aria_OrphanedContent_NoTrigger", false) || + AriaUtil_1.AriaUtil.hasRole(ruleContext, params.mapNoLandmarkedRoles, true) || + AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, params.mapNoLandmarkedRoles, true); + if (passed) { + CacheUtil_1.CacheUtil.setCache(ruleContext, "Rpt_Aria_OrphanedContent_NoTrigger", true); + return null; + } + } + else { + return null; + } + } + } + else { + return null; + } + //return new ValidationResult(passed, [ruleContext], '', '', []); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ 2759 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_contentinfo_label_unique = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var VisUtil_1 = __webpack_require__(3946); +exports.aria_contentinfo_label_unique = { + id: "aria_contentinfo_label_unique", + context: "aria:contentinfo", + refactor: { + "Rpt_Aria_MultipleContentinfoLandmarks_Implicit": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_contentinfo_label_unique.html", + "fail_label_not_unique": "aria_contentinfo_label_unique.html", + "group": "aria_contentinfo_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"contentinfo\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"contentinfo\" role do not have unique labels", + "group": "Each element with \"contentinfo\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "contentinfo", true); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ 3141 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_contentinfo_misuse = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +var VisUtil_1 = __webpack_require__(3946); +exports.aria_contentinfo_misuse = { + id: "aria_contentinfo_misuse", + context: "dom:*[role], dom:footer, dom:address", + refactor: { + "Rpt_Aria_ContentinfoWithNoMain_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_contentinfo_misuse.html", + "Fail_1": "aria_contentinfo_misuse.html", + "group": "aria_contentinfo_misuse.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Element with \"contentinfo\" role is present without an element with \"main\" role", + "group": "Each element with \"contentinfo\" role is only permitted with an element with \"main\" role" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + //consider implicit role + if (!AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "contentinfo")) { + return null; + } + // Consider the Check Hidden Content setting that is set by the rules + var passed = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "main", true, true).length > 0; + //return new ValidationResult(passed, [ruleContext], 'role', '', []); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ 5131 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_contentinfo_single = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var VisUtil_1 = __webpack_require__(3946); +exports.aria_contentinfo_single = { + id: "aria_contentinfo_single", + context: "dom:*[role], dom:footer, dom:address", + refactor: { + "Rpt_Aria_MultipleContentinfoInSiblingSet_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_contentinfo_single.html", + "Fail_1": "aria_contentinfo_single.html", + "group": "aria_contentinfo_single.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Multiple elements with \"contentinfo\" role found on the page", + "group": "A page, document, or application should only have one element with \"contentinfo\" role" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + //find out if <footer> element has siblings as <footer> has implicit contentinfo role + if (!AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "contentinfo")) { + return null; + } + var passed = !AriaUtil_1.AriaUtil.getSiblingWithRoleHidden(ruleContext, "contentinfo", true, true); + //return new ValidationResult(passed, [ruleContext], 'role', '', []); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ 5167 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_descendant_valid = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +var VisUtil_1 = __webpack_require__(3946); +exports.aria_descendant_valid = { + id: "aria_descendant_valid", + context: "dom:*", + dependencies: ["aria_role_valid"], + help: { + "en-US": { + "group": "aria_descendant_valid.html", + "pass": "aria_descendant_valid.html", + "potential_child_implicit_role": "aria_descendant_valid.html", + "recommendation_no_impact_role": "aria_descendant_valid.html", + "fail_child_explicit_role": "aria_descendant_valid.html" + } + }, + messages: { + "en-US": { + "group": "Browsers ignore the explicit and implicit ARIA roles of the descendants of certain elements", + "pass": "The element contains valid descendants", + "potential_child_implicit_role": "The element with role \"{0}\" contains descendants with implicit roles \"{1}\" which are ignored by browsers", + "recommendation_no_impact_role": "The element with role \"{0}\" contains descendants with roles \"{1}\" which are ignored by browsers", + "fail_child_explicit_role": "The element with role \"{0}\" contains descendants with roles \"{1}\" which are ignored by browsers" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE, + reasonCodes: ["pass", "potential_child_implicit_role", "fail_child_explicit_role"] + }, { + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE, + reasonCodes: ["recommendation_no_impact_role"] + }], + // TODO: ACT: Verify mapping + act: ["307n5z"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip the check if the element doesn't require presentational children only + if (!AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(ruleContext)) + return; + var roles = AriaUtil_1.AriaUtil.getRoles(ruleContext, false); + // if explicit role doesn't exist, get the implicit one + if (!roles || roles.length === 0) + roles = AriaUtil_1.AriaUtil.getImplicitRole(ruleContext); + //ignore if the element doesn't have any explicit or implicit role, shouldn't happen + if (!roles || roles.length === 0) + return null; + // let tagName = ruleContext.tagName.toLowerCase(); + // get all the children from accessibility tree, + // including ones with aria-owns + var directATChildren = AriaUtil_1.AriaUtil.getDirectATChildren(ruleContext); + if (directATChildren && directATChildren.length > 0) { + // the element with at least one non-presentational children + var explicitRoles = new Array(); + var implicitRoles = new Array(); + var noImpactRoles = new Array(); + for (var j = 0; j < directATChildren.length; j++) { + // ignore <img> and <svg> + var tag = directATChildren[j].nodeName.toLowerCase(); + if (tag === 'img' || tag === 'svg') + continue; + // get explicit role if exists + var childRoles = AriaUtil_1.AriaUtil.getRoles(directATChildren[j], false); + if (childRoles && childRoles.length > 0) { + // separate case for role="code" + if (childRoles.includes("code")) { + noImpactRoles.push(childRoles.filter(function (role) { return role === "code"; }).join(", ")); + } + explicitRoles.push(childRoles.filter(function (role) { return role !== "code"; }).join(", ")); + } + else { + // get implicit role if exists + childRoles = AriaUtil_1.AriaUtil.getImplicitRole(directATChildren[j]); + // separate case for role="code" + if (childRoles.includes("code")) { + noImpactRoles.push(childRoles.filter(function (role) { return role === "code"; }).join(", ")); + } + if (childRoles && childRoles.length > 0) + implicitRoles.push(childRoles.filter(function (role) { return role !== "code"; }).join(", ")); + } + } + if (explicitRoles.length > 0) { + var retValues = []; + for (var i = 0; i < explicitRoles.length; i++) { + var retToken = new Array(); + retToken.push(roles.join(", ")); + retToken.push(explicitRoles[i]); + retValues.push((0, IRule_1.RuleFail)("fail_child_explicit_role", retToken)); + } + return retValues; + } + if (implicitRoles.length > 0) { + var retValues = []; + for (var i = 0; i < implicitRoles.length; i++) { + var retToken = new Array(); + retToken.push(roles.join(", ")); + retToken.push(implicitRoles[i]); + retValues.push((0, IRule_1.RulePotential)("potential_child_implicit_role", retToken)); + } + return retValues; + } + if (noImpactRoles.length > 0) { + var retValues = []; + for (var i = 0; i < noImpactRoles.length; i++) { + var retToken = new Array(); + retToken.push(roles.join(", ")); + retToken.push(noImpactRoles[i]); + retValues.push((0, IRule_1.RulePotential)("recommendation_no_impact_role", retToken)); + } + return retValues; + } + } + else + return (0, IRule_1.RulePass)("pass"); + } +}; + + +/***/ }, + +/***/ 8115 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_document_label_unique = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var VisUtil_1 = __webpack_require__(3946); +exports.aria_document_label_unique = { + id: "aria_document_label_unique", + context: "aria:document", + refactor: { + "Rpt_Aria_MultipleDocumentRoles": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_document_label_unique.html", + "fail_label_not_unique": "aria_document_label_unique.html", + "group": "aria_document_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"document\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"document\" roles do not have unique labels", + "group": "Each element with \"document\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "document", true); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ 5733 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_eventhandler_role_valid = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +exports.aria_eventhandler_role_valid = { + id: "aria_eventhandler_role_valid", + context: "dom:*[onclick],dom:*[onblur], dom:*[ondblclick], dom:*[onfocus], dom:*[onkeydown],dom:*[onkeypress], dom:*[onkeyup], dom:*[onmousedown], dom:*[onmouseup], dom:*[onmousemove], dom:*[onmouseout], dom:*[onmouseover], dom:*[onresize], dom:*[onchange]", + refactor: { + "Rpt_Aria_EventHandlerMissingRole_Native_Host_Sematics": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_eventhandler_role_valid.html", + "Fail_1": "aria_eventhandler_role_valid.html", + "group": "aria_eventhandler_role_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The <{0}> element with '{1}' does not have a valid ARIA role specified", + "group": "Elements with event handlers must have a valid ARIA role" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Don't trigger this for SVG element for now until a determination is made (by Rich) + // to support SVG at a point when the SVG a11y spec is ready. + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, "svg")) { + return null; + } + //this rule is passed if a element has attribut role + //also, passed of element has any implicit roles. + if (AriaUtil_1.AriaUtil.hasAnyRole(ruleContext, true)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + //pass if this element is received focus by default + if (CommonUtil_1.CommonUtil.isfocusableByDefault(ruleContext)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + //validate if this element has any of the given event handler's + var retToken1 = new Array(); + retToken1.push(ruleContext.nodeName.toLowerCase()); + var eventArr = new Array(); + // From WCAG20_Script_UseW3CDomFunctions + //let events = ["onblur", "onfocus", "onchange", "onclick", "oncontextmenu", "ondblclick", "onkeydown", + // "onkeypress", "onkeyup", "onload", "onmousedown", "onmouseup", "onmousemove", "onmouseout", + // "onmouseover", "onmousewheel", "onreset", "onpaste", "onresize", "onscroll", + // "onselect", "onsubmit", "onactivate", "ondeactivate", "onmouseenter", "onmouseleave"]; + var events = ["onblur", "onfocus", "onchange", "onclick", "ondblclick", "onkeydown", + "onkeypress", "onkeyup", "onmousedown", "onmouseup", "onmousemove", "onmouseout", + "onmouseover", "onresize" + ]; + for (var i = 0; i < events.length; ++i) { + if (ruleContext.hasAttribute(events[i])) + eventArr.push(events[i]); + } + var retToken2 = new Array(); + retToken2.push(eventArr.join(", ")); + //return new ValidationResult(false, [ruleContext], '', '', [retToken1, retToken2]); + return (0, IRule_1.RuleFail)("Fail_1", [retToken1.toString(), retToken2.toString()]); + } +}; + + +/***/ }, + +/***/ 5782 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_form_label_unique = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var VisUtil_1 = __webpack_require__(3946); +exports.aria_form_label_unique = { + id: "aria_form_label_unique", + context: "aria:form", + refactor: { + "Rpt_Aria_MultipleFormLandmarks_Implicit": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_form_label_unique.html", + "fail_label_not_unique": "aria_form_label_unique.html", + "group": "aria_form_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"form\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"form\" role do not have unique labels", + "group": "Each element with \"form\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "form", true); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ 6731 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_graphic_labelled = void 0; +var IRule_1 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +var VisUtil_1 = __webpack_require__(3946); +exports.aria_graphic_labelled = { + id: "aria_graphic_labelled", + context: "aria:graphics-document,aria:graphics-symbol", + refactor: { + "HAAC_Aria_SvgAlt": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3" + } + }, + help: { + "en-US": { + "group": "aria_graphic_labelled.html", + "Pass_0": "aria_graphic_labelled.html", + "Fail_1": "aria_graphic_labelled.html", + "Fail_2": "aria_graphic_labelled.html", + "Fail_3": "aria_graphic_labelled.html" + } + }, + messages: { + "en-US": { + "group": "An element with a graphics role must have a non-empty label", + "Pass_0": "Rule Passed", + "Fail_1": "Element with \"{0}\" graphics role has no label", + "Fail_2": "Element with \"{0}\" graphics role has no label or an empty label", + "Fail_3": "Element with \"{0}\" graphics role missing non-empty 'aria-label' or 'aria-labelledby'" + } + }, + rulesets: [], + act: [{ + "7d6734": { + "Pass_0": "pass", + "Fail_1": "inapplicable", + "Fail_2": "fail", + "Fail_3": "inapplicable" + } + }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + if (!ruleContext.hasAttribute("role") || !ruleContext.getAttribute("role").includes("graphics-")) + return null; + /* removed the role check role= presentation since if an element has role=img, then there needs to be a check for alt attribute regardless of the presecne of role=presentation + if (RPTUtil.hasRole(ruleContext, "presentation") || RPTUtil.hasRole(ruleContext, "none")){ + return RulePass(1); + }*/ + // If role === img, you must use an aria label + //check attributes aria-label and aria-labelledby for other tags (e.g., <div>, <span>, etc) + var passed = AriaUtil_1.AriaUtil.getAriaLabel(ruleContext).length > 0; + if (!passed && ruleContext.nodeName.toLowerCase() === "svg") { + var svgTitle = ruleContext.querySelector("title"); + passed = svgTitle && CommonUtil_1.CommonUtil.hasInnerContent(svgTitle); + } + if (!passed) { + //check title attribute + passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "title"); + // We should guide people to use alt or label - this is just a secondary approach to silence the rule. + // So, we should keep the POF from above. + // if (!passed) POF = "Fail_3"; + } + //return new ValidationResult(passed, [ruleContext], 'role', '', []); + if (passed) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_2", [ruleContext.getAttribute("role")]); + } + } +}; + + +/***/ }, + +/***/ 390 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_hidden_nontabbable = void 0; +var CommonUtil_1 = __webpack_require__(7139); +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +exports.aria_hidden_nontabbable = { + id: "aria_hidden_nontabbable", + context: "dom:*[aria-hidden=true], dom:*[aria-hidden=true] dom:*", + refactor: { + "aria_hidden_focus_misuse": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "aria_hidden_nontabbable.html", + "Pass_0": "aria_hidden_nontabbable.html", + "Fail_1": "aria_hidden_nontabbable.html" + } + }, + messages: { + "en-US": { + "group": "A hidden element should not contain any tabbable elements", + "Pass_0": "Rule Passed", + "Fail_1": "Element \"{0}\" should not be focusable within the subtree of an element with an 'aria-hidden' attribute with value 'true'" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: ["1.3.1", "4.1.2"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_TWO + }], + // TODO: ACT: Handle testcase with focus jumping away + act: "6cfa84", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (CommonUtil_1.CommonUtil.isTabbable(ruleContext)) { + return (0, IRule_1.RuleFail)("Fail_1", [nodeName]); + } + return (0, IRule_1.RulePass)("Pass_0"); + } +}; + + +/***/ }, + +/***/ 3900 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_id_unique = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +var fragment_1 = __webpack_require__(5279); +var ARIADefinitions_1 = __webpack_require__(9910); +var VisUtil_1 = __webpack_require__(3946); +exports.aria_id_unique = { + id: "aria_id_unique", + context: "dom:*", + refactor: { + "Rpt_Aria_ValidIdRef": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_id_unique.html", + "Fail_1": "aria_id_unique.html", + "group": "aria_id_unique.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The 'id' \"{0}\" specified for the ARIA property '{1}' value is not valid", + "group": "The ARIA property must reference a non-empty unique id of an existing element that is visible" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + // TODO: ACT: 6a7281 - Need a separate reason code when the property is not required. ACT says it's okay to be + // invalid when not required. I think we should still fail, but flag it as a different reason so that we can have a subset + // aligns with ACT. + act: ["59796f", "6a7281"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var pass = true; + var attrNameArr = new Array(); + var nonExistantIDs = new Array(); + var ownerDocument = fragment_1.FragmentUtil.getOwnerFragment(ruleContext); + var contextAttributes = ruleContext.attributes; + var idTokens = new Array(); + var testedReferences = 0; + if (contextAttributes) { + for (var i = 0, attrLength = contextAttributes.length; i < attrLength; i++) { + pass = true; + var attrName = contextAttributes[i].name; + if (AriaUtil_1.AriaUtil.isDefinedAriaAttribute(ruleContext, attrName)) { + var dataTypes = ARIADefinitions_1.ARIADefinitions.propertyDataTypes[attrName]; + if (dataTypes && dataTypes.type) { + var supportsOneIDRef = (dataTypes.type == "http://www.w3.org/2001/XMLSchema#idref") ? true : false; + //If the data type supports one or more id refs do error checking + if (supportsOneIDRef || (dataTypes.type == "http://www.w3.org/2001/XMLSchema#idrefs")) { + testedReferences++; + var nodeValueLength = CommonUtil_1.CommonUtil.normalizeSpacing(contextAttributes[i].nodeValue).length; + var idArray = contextAttributes[i].nodeValue.split(" "); + // Check for an empty ID Ref + if (nodeValueLength < 1) { + pass = false; + idTokens.push("\"" + contextAttributes[i].nodeValue + "\""); + } + // check to see if too many IDRefs + else if (supportsOneIDRef) { + //If has too many IDRefs it is an error + if (nodeValueLength >= 1) { + if (idArray.length > 1) { + pass = false; + // Need to capture all the IDRefs for idTokens + for (var z = 0, length_1 = idArray.length; z < length_1; ++z) { + if (idArray[z] != "") { + idTokens.push(idArray[z]); + } + } + } + } + } + // check to see if id refs are invalid + if (pass && nodeValueLength >= 1) { + for (var j = 0, length_2 = idArray.length; j < length_2; ++j) { + if (idArray[j].length > 0) { // it is an empty string if spaces are one after the other + // Get the element by Id + var elementById = ownerDocument.getElementById(idArray[j]); + // Pass if the element exists + pass = elementById != null; + // If the element exists and this is an aria attribute that doesn't support hidden ID reference + // then perform a isNodeVisible check, in the case the node is not visible then we return + // false and true otherwise. + if (pass && !dataTypes.hiddenIDRefSupported) { + pass = VisUtil_1.VisUtil.isNodeVisible(elementById); + } + if (!pass) { + if (idArray[j] != "") { + idTokens.push(idArray[j]); + } + } + // Only one of the id references need to be valid to mark the rule as passed. + // Therefore if we find a single visible element then stop checking and mark as + // passed. + else { + break; + } + } + } + } + } + } + if (!pass) + attrNameArr.push(attrName); + } + } + } + var passed = attrNameArr.length == 0; + var retToken1 = new Array(); + var retToken2 = new Array(); + var retToken3 = new Array(); + if (!passed) { + retToken2.push(attrNameArr.join(", ")); + retToken3.push(ruleContext.nodeName.toLowerCase()); + if (idTokens.length > 0) { + retToken1.push(idTokens.join(", ")); + } + } + //return new ValidationResult(passed, [ruleContext], attrNameArr, '', passed == true ? [] : [retToken1, retToken2, retToken3]); + if (testedReferences == 0) { + return null; + } + else if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", [retToken1.toString(), retToken2.toString(), retToken3.toString()]); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ 1218 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_img_labelled = void 0; +var IRule_1 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +var VisUtil_1 = __webpack_require__(3946); +exports.aria_img_labelled = { + id: "aria_img_labelled", + context: "aria:img, aria:image", + refactor: { + "HAAC_Aria_ImgAlt": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3" + } + }, + help: { + "en-US": { + "group": "aria_img_labelled.html", + "Pass_0": "aria_img_labelled.html", + "Fail_1": "aria_img_labelled.html", + "Fail_2": "aria_img_labelled.html", + "Fail_3": "aria_img_labelled.html" + } + }, + messages: { + "en-US": { + "group": "An element with \"img\" role must have a non-empty label", + "Pass_0": "Rule Passed", + "Fail_1": "Element with \"img\" role has no label", + "Fail_2": "Element with \"img\" role has no label or an empty label", + "Fail_3": "Element with \"img\" role missing non-empty 'aria-label' or 'aria-labelledby'" + } + }, + rulesets: [], + act: ["23a2a8", { + "7d6734": { + "Pass_0": "pass", + "Fail_1": "inapplicable", + "Fail_2": "fail", + "Fail_3": "inapplicable" + } + }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + if (!ruleContext.hasAttribute("role")) { + // If no role, this is implicit, and covered by WCAG20_Img_HasAlt + return null; + } + var nodeName = ruleContext.nodeName.toLocaleLowerCase(); + // svg and img elements are handled in svg_graphics_labbelled and img_alt_valid rules + if (nodeName === 'svg' || nodeName === 'img') + return; + /* removed the role check role= presentation since if an element has role=img, then there needs to be a check for alt attribute regardless of the presecne of role=presentation + if (RPTUtil.hasRole(ruleContext, "presentation") || RPTUtil.hasRole(ruleContext, "none")){ + return RulePass(1); + }*/ + /* JCH - Points of failure + * 0. Missing alt attr with value + * 1. Missing aria-label or aria-labelledby + * 2. Missing title attr with value + */ + // If role === img, you must use an aria label + //check attributes aria-label and aria-labelledby for other tags (e.g., <div>, <span>, etc) + var passed = AriaUtil_1.AriaUtil.getAriaLabel(ruleContext).length > 0; + if (!passed && ruleContext.nodeName.toLowerCase() === "svg") { + var svgTitle = ruleContext.querySelector("title"); + passed = svgTitle && CommonUtil_1.CommonUtil.hasInnerContent(svgTitle); + } + if (!passed) { + //check title attribute + passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "title"); + // We should guide people to use alt or label - this is just a secondary approach to silence the rule. + // So, we should keep the POF from above. + // if (!passed) POF = "Fail_3"; + } + //return new ValidationResult(passed, [ruleContext], 'role', '', []); + if (passed) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_2"); + } + } +}; + + +/***/ }, + +/***/ 6734 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_keyboard_handler_exists = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +var ARIADefinitions_1 = __webpack_require__(9910); +var VisUtil_1 = __webpack_require__(3946); +exports.aria_keyboard_handler_exists = { + id: "aria_keyboard_handler_exists", + context: "dom:*[role]", + dependencies: ["aria_role_allowed"], + refactor: { + "Rpt_Aria_MissingKeyboardHandler": { + "pass": "pass", + "potential_no_keyboard_access": "potential_no_keyboard_access" + } + }, + help: { + "en-US": { + "pass": "aria_keyboard_handler_exists.html", + "potential_no_keyboard_access": "aria_keyboard_handler_exists.html", + "group": "aria_keyboard_handler_exists.html" + } + }, + messages: { + "en-US": { + "pass": "Rule Passed", + "potential_no_keyboard_access": "Verify the <{0}> element with \"{1}\" role has keyboard access", + "group": "Interactive WAI_ARIA UI components must provide keyboard access" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + var passed = true; + var savedPassed = passed; + var doc = ruleContext.ownerDocument; + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + //let roles = ruleContext.getAttribute("role").trim().toLowerCase().split(/\s+/); + //only consider user specified role(s), rather than native containers + var roles = AriaUtil_1.AriaUtil.getRoles(ruleContext, false); + var nodeName = ruleContext.nodeName.toLowerCase(); + //if an explicit role is specified, the 'aria_role_redundant' rule should be triggered and addressed first, + // and the current rule should be ignored + if (nodeName === 'datalist' && roles && roles.includes("listbox")) + return null; + // Composite user interface widget roles. They act as containers that manage other, contained widgets. + var roleContainers = ["combobox", "grid", "listbox", "menu", "menubar", "radiogroup", "tablist", "tree", "treegrid"]; + for (var _i = 0, roleContainers_1 = roleContainers; _i < roleContainers_1.length; _i++) { + var role = roleContainers_1[_i]; + if (AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, role, true) != null) + // it's a descendant of a composite widget already examined + return null; + } + var hasAttribute = CommonUtil_1.CommonUtil.hasAttribute; + var roleNameArr = new Array(); + for (var j = 0; j < roles.length; ++j) { + var pattern = designPatterns[roles[j]]; + if (roleContainers.indexOf(roles[j]) >= 0) { + var disabled = hasAttribute(ruleContext, 'aria-disabled') ? ruleContext.getAttribute("aria-disabled") : ''; + if (!disabled) { + // See if there is a keyboard event handler on the parent element. + passed = (ruleContext.hasAttribute("onkeydown") || ruleContext.hasAttribute("onkeypress") || ruleContext.hasAttribute("onkeyup")); + // No keyboard event handler found on parent. See if keyboard event handlers are on required child elements. + if (!passed) { + if (!hasAttribute(ruleContext, 'aria-activedescendant')) { + var reqChildren = ARIADefinitions_1.ARIADefinitions.designPatterns[roles[j]].reqChildren; + if (reqChildren) { /* SMF TODO menubar does not have any reqChildren */ + for (var i = 0, requiredChildrenLength = reqChildren.length; i < requiredChildrenLength; i++) { + var xp = "*[contains(@role,'" + reqChildren[i] + "')]"; + var xpathResult = doc.evaluate(xp, ruleContext, CommonUtil_1.CommonUtil.defaultNSResolver, 0 /* XPathResult.ANY_TYPE */, null); + var r = xpathResult.iterateNext(); + while (r) { + passed = (r.hasAttribute("onkeydown") || r.hasAttribute("onkeypress")); + if (!passed) { + // Child did not have a key handler. See if any of the grandchildren do. + var xp2 = "descendant::*"; + var xpathResult2 = doc.evaluate(xp2, r, CommonUtil_1.CommonUtil.defaultNSResolver, 0 /* XPathResult.ANY_TYPE */, null); + var r2 = xpathResult2.iterateNext(); + while (r2 && !passed) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(r2)) { + r2 = xpathResult2.iterateNext(); + continue; + } + passed = CommonUtil_1.CommonUtil.isTabbable(r2) && + (r2.hasAttribute("onkeydown") || r2.hasAttribute("onkeypress")); + if (!passed) { + // Is this an action link? + if (r2.nodeName.toLowerCase() == "a" && r2.hasAttribute("href")) { + var href = r2.getAttribute("href"); + // Action link must start with "javascript:", must not contain a "void" and + // must have a function name following "javascript:" (i.e., href.length > 11) + passed = (href.startsWith("javascript:") && href.indexOf("void") == -1 && href.length > 11); + } + } + r2 = xpathResult2.iterateNext(); + } + } + if (!passed) { + // All the required children (or any descendants of the required children) must have keypress/keydown + // If not, it is a failure, no need to keep checking any more. + break; + } + r = xpathResult.iterateNext(); + } + } + } + else { + // The current element failed the keydown/keypress, and it does not have required children, such as menubar. + // Let's check its descendants. + var xp2 = "descendant::*"; + var xpathResult2 = doc.evaluate(xp2, ruleContext, CommonUtil_1.CommonUtil.defaultNSResolver, 0 /* XPathResult.ANY_TYPE */, null); + var r2 = xpathResult2.iterateNext(); + while (r2 && !passed) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(r2)) { + r2 = xpathResult2.iterateNext(); + continue; + } + passed = CommonUtil_1.CommonUtil.isTabbable(r2) && + (r2.hasAttribute("onkeydown") || r2.hasAttribute("onkeypress")); + if (!passed) { + // Is this an action link? + if (r2.nodeName.toLowerCase() == "a" && r2.hasAttribute("href")) { + var href = r2.getAttribute("href"); + // Action link must start with "javascript:", must not contain a "void" and + // must have a function name following "javascript:" (i.e., href.length > 11) + passed = (href.startsWith("javascript:") && href.indexOf("void") == -1 && href.length > 11); + } + } + r2 = xpathResult2.iterateNext(); + } + } + } + else { + // Attribute 'aria-activedescendant' is specified. + passed = true; + } + } + } + } + if (!passed) { + roleNameArr.push(roles[j]); + } + if (!passed && savedPassed) { + savedPassed = passed; + } + } + var retToken1 = new Array(); + retToken1.push(ruleContext.nodeName.toLowerCase()); + var retToken2 = new Array(); + retToken2.push(roleNameArr.join(", ")); + // Determine if this is referenced by a combobox. If so, leave it to the combobox rules to check + var id = ruleContext.getAttribute("id"); + if (id && id.trim().length > 0) { + if (ruleContext.ownerDocument.querySelector("*[aria-controls='".concat(id, "'][role='combobox']"))) { + return null; + } + } + return savedPassed ? (0, IRule_1.RulePass)("pass") : (0, IRule_1.RulePotential)("potential_no_keyboard_access", [retToken1.toString(), retToken2.toString()]); + } +}; + + +/***/ }, + +/***/ 9973 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_landmark_name_unique = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var ARIAMapper_1 = __webpack_require__(9955); +var DOMUtil_1 = __webpack_require__(1686); +var fragment_1 = __webpack_require__(5279); +var CacheUtil_1 = __webpack_require__(4566); +var AccNameUtil_1 = __webpack_require__(1950); +var VisUtil_1 = __webpack_require__(3946); +var CommonUtil_1 = __webpack_require__(7139); +var AriaUtil_1 = __webpack_require__(7011); +exports.aria_landmark_name_unique = { + id: "aria_landmark_name_unique", + context: "aria:complementary, aria:banner, aria:contentinfo, aria:main, aria:navigation, aria:region, aria:search, aria:form", + refactor: { + "landmark_name_unique": { + "Pass_0": "pass", + "Fail_0": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_landmark_name_unique.html", + "fail_label_not_unique": "aria_landmark_name_unique.html", + "group": "aria_landmark_name_unique.html" + } + }, + messages: { + "en-US": { + "pass": "Multiple elements with \"{0}\" landmarks within the same parent region are distinguished by unique 'aria-label' or 'aria-labelledby'", + "fail_label_not_unique": "Multiple elements with \"{0}\" landmarks within the same parent region are not distinguished from one another because they have the same \"{1}\" label", + "group": "Each landmark should have a unique 'aria-labelledby' or 'aria-label' or be nested in a different parent region" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }, + { + "id": ["WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + // TODO do I need to fiter out bad contentinfo nodes: The footer element is not a contentinfo landmark when it is a descendant of the following HTML5 sectioning elements: https://www.w3.org/TR/2017/NOTE-wai-aria-practices-1.1-20171214/examples/landmarks/HTML5.html + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // Checking if this landmark is inside a dialog element. If it is we are going to skip checking it. + /**var copyOfRuleContext = ruleContext; + var parnetNodesOfRuleContext = []; + while (copyOfRuleContext) { + parnetNodesOfRuleContext.unshift(copyOfRuleContext); + copyOfRuleContext = copyOfRuleContext.parentElement; + } + parnetNodesOfRuleContext.forEach(elem => { + if (elem !== null) { + if (elem.tagName == "DIALOG" || elem.getAttribute('role') == "dialog") { + return null // Skipping checking landmarks that happen to be inside dialog elements + } + } + }) + */ + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["DIALOG"]) !== null || AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, "dialog", true) !== null) + return null; + // Begining formCache work + var ownerDocument = fragment_1.FragmentUtil.getOwnerFragment(ruleContext); + var formCache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "aria_landmark_name_unique", null); + if (!formCache) { + // console.log("---------ENTERING FORM CACHE") + formCache = { + navigationNodes: [], + navigationNodesComputedLabels: [], + navigationNodesParents: [], + navigationNodesMatchFound: [] + }; + var navigationNodesTemp = ownerDocument.querySelectorAll('aside,[role="complementary"], footer,[role="contentinfo"], header,[role="banner"], main,[role="main"], nav,[role="navigation"], form,[role="form"], section,[role="region"],[role="search"]'); + var navigationNodes = Array.from(navigationNodesTemp); + var navigationNodesParents = []; + var navigationNodesMatchFound = []; + // This block of code filters out any nav elements that are under a dialog. As those are not ones we want to test against as we consider dialogs are separate locations from the rest of the main page. + var navigationNodesWithoutDialogs = []; + for (var i = 0; i < navigationNodes.length; i++) { + /**let a = navigationNodes[i]; + + let dialogNodeFoundFlag = false; + while (a) { + a = a.parentElement; + if (a !== null) { + if (a.tagName == "DIALOG" || a.getAttribute('role') == "dialog") { + dialogNodeFoundFlag = true; + } + } + } + if (!dialogNodeFoundFlag) { + navigationNodesWithoutDialogs.push(navigationNodes[i]) + }*/ + // ignore node that is AT hidden or in a dialog + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(navigationNodes[i]) || CommonUtil_1.CommonUtil.getAncestor(navigationNodes[i], ["DIALOG"]) !== null || AriaUtil_1.AriaUtil.getAncestorWithRole(navigationNodes[i], "dialog", true) !== null) + continue; + navigationNodesWithoutDialogs.push(navigationNodes[i]); + } + navigationNodes = navigationNodesWithoutDialogs; + for (var i = 0; i < navigationNodes.length; i++) { + // Loop over all the landmark nodes + var els = []; + var a = navigationNodes[i].parentElement; + while (a) { + els.push(a); + a = a.parentElement; + } + for (var j = 0; j < els.length; j++) { + // Loop over all the parents of the landmark nodes + // Find nearest landmark parent based on the tagName or the role attribute + var tagNameTrigger = [ + "ASIDE", + "FOOTER", + "FORM", + "HEADER", + "MAIN", + "NAV", + "SECTION", + ].includes(els[j].tagName); + var roleNameTrigger = false; + if (els[j].hasAttribute("role")) { + roleNameTrigger = [ + "complementary", + "contentinfo", + "form", + "banner", + "main", + "navigation", + "region", + "search", + ].includes(els[j].getAttribute("role")); // TODO we are not covering the case where a elemenent with multiple roles. e.g., role = "form banner". This is a improvment we might want to add in the future. + } + if (tagNameTrigger || roleNameTrigger) { + // Nearest parent-landmark found + navigationNodesParents.push(els[j]); + break; + } + if (j === els.length - 1) { + // This node is at the head of the file so it does not have a parent + navigationNodesParents.push(null); + break; + } + } + } + var navigationNodesComputedLabels = []; + for (var i = 0; i < navigationNodes.length; i++) { + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(navigationNodes[i]); + // Loop over all the landmark nodes + navigationNodesComputedLabels.push( + /**ARIAMapper.computeName(navigationNodes[i])*/ + pair && pair.name && pair.name.trim().length > 0 ? pair.name.trim() : ""); + } + for (var i = 0; i < navigationNodesParents.length; i++) { + // Loop over all the parents of the landmark nodes to find duplicates + var matchFound = false; + var pass_0_flag = false; + for (var j = 0; j < navigationNodesParents.length; j++) { + if (j === i) { + // We do not want to compare against ourselfs + continue; + } + // This if statement focus on the case where the parent landmark is null + if (navigationNodesParents[i] === null && + navigationNodesParents[j] === null) { + // We are looking at two root nodes, so we should compare them. + if (ARIAMapper_1.ARIAMapper.nodeToRole(navigationNodes[i]) === + ARIAMapper_1.ARIAMapper.nodeToRole(navigationNodes[j])) { + // Both nodes have the same role AND + if (navigationNodesComputedLabels[i] === + navigationNodesComputedLabels[j]) { + // both have the same (computed) aria-label/aria-labelledby + // if (navigationNodesComputedLabels[i] === "") { + navigationNodesMatchFound.push("fail_label_not_unique"); // Fail 0 + matchFound = true; + break; + // } + } + else { + // Same parents && same node roles BUT different computed aria-label/aria-labelledby + // We have at least a Pass_0. But we need to check all nodes to see if another one fails. So set a flag. + pass_0_flag = true; + } + } + else { + // Same parents but different node roles // Not applicable + } + } + else if (navigationNodesParents[i] === null || + navigationNodesParents[j] === null) { + // We are looking at a single root node + continue; + } + // This if statement focus on the case where the parent landmark is NOT null + if (DOMUtil_1.DOMUtil.sameNode(navigationNodesParents[i], navigationNodesParents[j])) { + // We have the same parent-landmark AND + if (ARIAMapper_1.ARIAMapper.nodeToRole(navigationNodes[i]) === + ARIAMapper_1.ARIAMapper.nodeToRole(navigationNodes[j])) { + // Both nodes have the same role AND + if (navigationNodesComputedLabels[i] === + navigationNodesComputedLabels[j]) { + // both have the same (computed) aria-label/aria-labelledby + // if (navigationNodesComputedLabels[i] === "") { + navigationNodesMatchFound.push("fail_label_not_unique"); // Fail 0 + matchFound = true; + break; + // } + } + else { + // Same parents && same node roles BUT different computed aria-label/aria-labelledby + // We have at least a Pass_0. But we need to check all nodes to see if another one fails. So set a flag. + pass_0_flag = true; + } + } + else { + // Same parents but different node roles // Not applicable + } + } + else { + // Different parents // Not applicable + } + } + if (!matchFound) { + if (pass_0_flag) { + navigationNodesMatchFound.push("pass"); + } + else { + navigationNodesMatchFound.push("null"); // This is not the keyword null on purpose. It is a spaceholder in the array so indexes match up. + } + } + } + formCache.navigationNodesComputedLabels = + navigationNodesComputedLabels; + formCache.navigationNodes = navigationNodes; + formCache.navigationNodesParents = navigationNodesParents; + formCache.navigationNodesMatchFound = navigationNodesMatchFound; + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "aria_landmark_name_unique", formCache); + // TODO Add validation that all 3 arrays are the same length + // console.log("-------------End formCache") + } // End formCache + var indexToCheck = -1; + for (var i = 0; i < formCache.navigationNodes.length; i++) { + if (ruleContext.isSameNode(formCache.navigationNodes[i])) { + indexToCheck = i; + } + } + if (indexToCheck === -1) { + return null; + } + if (formCache.navigationNodesMatchFound[indexToCheck] === "pass") { + return (0, IRule_1.RulePass)("pass", [ + ARIAMapper_1.ARIAMapper.nodeToRole(formCache.navigationNodes[indexToCheck]), + ]); + } + else if (formCache.navigationNodesMatchFound[indexToCheck] === "fail_label_not_unique") { + return (0, IRule_1.RuleFail)("fail_label_not_unique", [ + ARIAMapper_1.ARIAMapper.nodeToRole(formCache.navigationNodes[indexToCheck]), + formCache.navigationNodesComputedLabels[indexToCheck], + ]); + } + else { + return null; + } + } +}; + + +/***/ }, + +/***/ 5711 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_main_label_unique = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +var VisUtil_1 = __webpack_require__(3946); +exports.aria_main_label_unique = { + id: "aria_main_label_unique", + context: "aria:main", + refactor: { + "Rpt_Aria_MultipleMainsRequireLabel_Implicit_2": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_main_label_unique.html", + "Fail_1": "aria_main_label_unique.html", + "group": "aria_main_label_unique.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Multiple elements with \"main\" role do not have unique labels", + "group": "Each element with \"main\" role must have unique label that describes its purposes" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var contextLabel = AriaUtil_1.AriaUtil.getAriaLabel(ruleContext); + var parentDocRole = AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, "document", true); + var mains = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "main", true, true); + var result = null; + for (var i = 0; i < mains.length; ++i) { + if (mains[i] === ruleContext) + continue; + result = (0, IRule_1.RulePass)("Pass_0"); + var thisParentDocRole = AriaUtil_1.AriaUtil.getAncestorWithRole(mains[i], "document", true); + if (thisParentDocRole === parentDocRole) { + if (AriaUtil_1.AriaUtil.getAriaLabel(mains[i]) === contextLabel) { + result = (0, IRule_1.RuleFail)("Fail_1"); + break; + } + } + } + return result; + } +}; + + +/***/ }, + +/***/ 3384 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_main_label_visible = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +var VisUtil_1 = __webpack_require__(3946); +exports.aria_main_label_visible = { + id: "aria_main_label_visible", + context: "dom:body", + refactor: { + "Rpt_Aria_MultipleMainsVisibleLabel_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_main_label_visible.html", + "Fail_1": "aria_main_label_visible.html", + "group": "aria_main_label_visible.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Multiple elements with \"main\" role do not have unique visible labels", + "group": "Each element with \"main\" role should have a unique visible label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // Consider the Check Hidden Content setting that is set by the rules + //call getElementsByRoleHidden with considerImplicit flag as true + //so that the method returs <main> elements + var landmarks = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "main", true, true); + if (landmarks.length === 0 || landmarks.length === 1) { + return null; + } + var passed = AriaUtil_1.AriaUtil.hasUniqueAriaLabelledby(landmarks); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ 2762 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_navigation_label_unique = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var VisUtil_1 = __webpack_require__(3946); +exports.aria_navigation_label_unique = { + id: "aria_navigation_label_unique", + context: "aria:navigation", + refactor: { + "Rpt_Aria_MultipleNavigationLandmarks_Implicit": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_navigation_label_unique.html", + "fail_label_not_unique": "aria_navigation_label_unique.html", + "group": "aria_navigation_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"navigation\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"navigation\" role do not have unique labels", + "group": "Each element with \"navigation\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "navigation", true); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ 5757 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_parent_required = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var ARIADefinitions_1 = __webpack_require__(9910); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +var VisUtil_1 = __webpack_require__(3946); +exports.aria_parent_required = { + id: "aria_parent_required", + context: "dom:*[role]", + dependencies: ["aria_role_allowed"], + refactor: { + "Rpt_Aria_RequiredParent_Native_Host_Sematics": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "aria_parent_required.html", + "Pass_0": "aria_parent_required.html", + "Fail_1": "aria_parent_required.html" + } + }, + messages: { + "en-US": { + "group": "Each element with an implicit or explicit role must be contained within a valid element", + "Pass_0": "Rule Passed", + "Fail_1": "Element with \"{0}\" role is not contained in or owned by an element with one of the following roles: \"{1}\"" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + // TODO: ACT: Check Fail 3 + act: "ff89c9", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip the check if the element should be a presentational child of an element + if (AriaUtil_1.AriaUtil.shouldBePresentationalChild(ruleContext) || VisUtil_1.VisUtil.isNodePresentational(ruleContext)) + return; + var passed = true; + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + var roleNameArr = new Array(); + var containerRoles = new Array(); + var testedContainer = 0; + var ancestorRoles = contextHierarchies["aria"].map(function (info) { return info.role; }); + var parentRole = ancestorRoles[ancestorRoles.length - 2]; + var count = 2; + while (parentRole === 'none') { + count++; + parentRole = ancestorRoles[ancestorRoles.length - count]; + } + /**for (let j = 0, length = roles.length; j < length; ++j) { + if (designPatterns[roles[j]] && designPatterns[roles[j]].container != null) { + testedContainer++; + passed = false; + containerRoles = designPatterns[roles[j]].container; + for (let i = 0, containersLength = containerRoles.length; !passed && i < containersLength; i++) { + passed = parentRole === containerRoles[i]; + if (passed) break; + } + if (passed == false) { + roleNameArr.push(roles[j]); + } + } + } + */ + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + if (designPatterns[role] && designPatterns[role].container != null) { + testedContainer++; + passed = false; + containerRoles = designPatterns[role].container; + for (var i = 0, containersLength = containerRoles.length; !passed && i < containersLength; i++) { + passed = parentRole === containerRoles[i]; + if (passed) + break; + } + if (passed == false) { + roleNameArr.push(role); + } + } + var retToken1 = new Array(); + retToken1.push(roleNameArr.join(", ")); + var retToken2 = new Array(); + retToken2.push(containerRoles.join(", ")); + //return new ValidationResult(passed, [ruleContext], '', '', passed == true ? [] : [retToken1, retToken2]); + if (testedContainer == 0) { + return null; + } + else if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", [retToken1.toString(), retToken2.toString()]); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ 5232 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_region_label_unique = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var VisUtil_1 = __webpack_require__(3946); +exports.aria_region_label_unique = { + id: "aria_region_label_unique", + context: "aria:region", + refactor: { + "Rpt_Aria_MultipleRegionsUniqueLabel_Implicit": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_region_label_unique.html", + "fail_label_not_unique": "aria_region_label_unique.html", + "group": "aria_region_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"region\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"region\" role do not have unique labels", + "group": "Each element with \"region\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "region"); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ 1891 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_region_labelled = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +var VisUtil_1 = __webpack_require__(3946); +exports.aria_region_labelled = { + id: "aria_region_labelled", + context: "aria:region", + refactor: { + "Rpt_Aria_RegionLabel_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + // "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_0": "aria_region_labelled.html", + "Fail_1": "aria_region_labelled.html", + // "Fail_2": "aria_region_labelled.html", + "group": "aria_region_labelled.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Element with \"region\" role does not have a label", + // "Fail_2": "Element with \"region\" role is not labeled with 'aria-label' or 'aria-labelledby'", + "group": "Each element with \"region\" role must have a label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = AriaUtil_1.AriaUtil.hasAriaLabel(ruleContext) || CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "title"); + if (passed) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } +}; + + +/***/ }, + +/***/ 6142 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_role_allowed = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +exports.aria_role_allowed = { + id: "aria_role_allowed", + context: "dom:*[role]", + refactor: { + "Rpt_Aria_ValidRole": { + "Pass_0": "Pass_0", + "Fail_2": "Fail_2", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "group": "aria_role_allowed.html", + "Pass_0": "aria_role_allowed.html", + "Fail_2": "aria_role_allowed.html", + "Potential_1": "aria_role_allowed.html" + } + }, + messages: { + "en-US": { + "group": "Elements must have a valid 'role' per ARIA specification", + "Pass_0": "Rule Passed", + "Fail_2": "The role '{0}' defined on the element is not valid per ARIA specification", + "Potential_1": "Some of the roles, '{0}', defined on the element are not valid per ARIA specification" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "4.1.2", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + // TODO: ACT: Recheck + act: "674b10", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var roleStr = ruleContext.getAttribute("role").trim().toLowerCase(); + if (roleStr.length === 0) { + return null; + } + if (ruleContext.hasAttribute("aria-hidden") && ruleContext.getAttribute("aria-hidden").toLowerCase() === "true") { + return null; + } + var invalidRoles = AriaUtil_1.AriaUtil.getRolesUndefinedByAria(ruleContext); + if (!invalidRoles || invalidRoles.length === 0) + return (0, IRule_1.RulePass)("Pass_0"); + else { + var roles = roleStr.split(/\s+/); + if (invalidRoles.length === roles.length) { + return (0, IRule_1.RuleFail)("Fail_2", [invalidRoles.join(",")]); + } + else if (invalidRoles.length > 0) { + return (0, IRule_1.RulePotential)("Potential_1", [invalidRoles.join(",")]); + } + } + } +}; + + +/***/ }, + +/***/ 4863 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_role_redundant = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +exports.aria_role_redundant = { + id: "aria_role_redundant", + context: "dom:*[role]", + help: { + "en-US": { + "pass": "aria_role_redundant.html", + "fail_redundant": "aria_role_redundant.html", + "group": "aria_role_redundant.html" + } + }, + messages: { + "en-US": { + "pass": "An explicitly-assigned ARIA role is not redundant with the implicit role of the element", + "fail_redundant": "The explicitly-assigned ARIA role \"{0}\" is redundant with the implicit role of the element <{1}>", + "group": "An explicitly-assigned ARIA role should not be redundant with the implicit role of the element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["ARIA"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var elemName = ruleContext.tagName.toLowerCase(); + var ariaRoles = AriaUtil_1.AriaUtil.getRoles(ruleContext, false); + if (!ariaRoles || ariaRoles.length === 0) + return; + // the invalid role case: handled by Rpt_Aria_ValidRole. Ignore to avoid duplicated report + var role_defined = AriaUtil_1.AriaUtil.areRolesDefined(ariaRoles); + if (!role_defined) + return null; + // dependency check: if it's already failed in the parent relation, then skip this check + // comment out to report the redundant role for table element: tr, td & th + /**if (["td", "th", "tr"].includes(elemName)) { + let parentRole = TableUtil.isTableDescendant(contextHierarchies); + if (parentRole !== null && parentRole.length > 0) + return null; + }*/ + var implicitRoles = AriaUtil_1.AriaUtil.getImplicitRole(ruleContext); + if (!implicitRoles || implicitRoles.length === 0) + return (0, IRule_1.RulePass)("pass"); + var ret = []; + for (var i = 0; i < ariaRoles.length; i++) { + if (!implicitRoles.includes(ariaRoles[i])) + ret.push((0, IRule_1.RulePass)("pass")); + else + ret.push((0, IRule_1.RuleFail)("fail_redundant", [ariaRoles[i], elemName])); + } + if (ret.length > 0) + return ret; + return null; + } +}; + + +/***/ }, + +/***/ 1440 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_search_label_unique = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var VisUtil_1 = __webpack_require__(3946); +exports.aria_search_label_unique = { + id: "aria_search_label_unique", + context: "aria:search", + refactor: { + "Rpt_Aria_MultipleSearchLandmarks": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_search_label_unique.html", + "fail_label_not_unique": "aria_search_label_unique.html", + "group": "aria_search_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"search\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"search\" role do not have unique labels", + "group": "Each element with \"search\" role must have a unique label that describes its purpose" + } + }, + /** + * deprecated the rule on 01/27/2025 + * rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": eRulePolicy.VIOLATION, + "toolkitLevel": eToolkitLevel.LEVEL_THREE + }],*/ + rulesets: [{ + "id": [], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "search", true); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ 1968 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_valid = exports.aria_role_valid = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +exports.aria_role_valid = { + id: "aria_role_valid", + context: "dom:*", + dependencies: ["aria_attribute_allowed"], + refactor: { + "aria_semantics_role": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_0": "aria_role_valid.html", + "Fail_1": "aria_role_valid.html", + "Fail_2": "aria_role_valid.html", + "group": "aria_role_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The ARIA role '{0}' is not valid for the element <{1}>", + "Fail_2": "The ARIA role '{0}' is not valid for the element <{1}> and may be ignored by the browser since the element is focusable", + "group": "ARIA roles must be valid for the element to which they are assigned" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var tagName = ruleContext.tagName.toLowerCase(); + // only chek element (1) and fragment nodes (11) + if (ruleContext.nodeType !== 1 /* Node.ELEMENT_NODE */) + return null; + //skip the rule + // the invalid role case: handled by aria_role_allowed. Ignore to avoid duplicated report + var undefinedRoles = AriaUtil_1.AriaUtil.getRolesUndefinedByAria(ruleContext); + if (undefinedRoles && undefinedRoles.length > 0) + return null; + var deprecatedRoles = AriaUtil_1.AriaUtil.getDeprecatedAriaRoles(ruleContext); + if (deprecatedRoles && deprecatedRoles.length > 0) + return null; + var deprecatedAttributes = AriaUtil_1.AriaUtil.getDeprecatedAriaAttributes(ruleContext); + if (deprecatedAttributes && deprecatedAttributes.length > 0) + return null; + // dependency check: if it's already failed, then skip + if (["td", "th", "tr"].includes(tagName)) { + var parentRole = CommonUtil_1.CommonUtil.isTableDescendant(contextHierarchies); + if (parentRole !== null && parentRole.length > 0) + return null; + } + var domRoles = AriaUtil_1.AriaUtil.getUserDefinedRoles(ruleContext); + if (!domRoles || domRoles.length === 0) + return null; + // check the 'generic' role first + if (domRoles.includes('generic')) + return (0, IRule_1.RuleFail)("Fail_1", ["generic", tagName]); + var invalidRoles = AriaUtil_1.AriaUtil.getInvalidRoles(ruleContext); + if (invalidRoles === null || invalidRoles.length === 0) + return (0, IRule_1.RulePass)("Pass_0", [domRoles.join(", "), tagName]); + if (invalidRoles.includes("presentation") || invalidRoles.includes("none") && CommonUtil_1.CommonUtil.isTabbable(ruleContext)) + return (0, IRule_1.RuleFail)("Fail_2", [invalidRoles.join(", "), tagName]); + if (invalidRoles.length > 0) + return (0, IRule_1.RuleFail)("Fail_1", [invalidRoles.join(", "), tagName]); + if (domRoles.length > 0) + return (0, IRule_1.RulePass)("Pass_0", [domRoles.join(", "), tagName]); + return null; + } +}; +// This rule is in the same file because there is a dependency that aria_role_valid runs first, +// and the info is passed by cache, but there isn't a dependency in the Fail_2 scenario, so regular +// dependency cannot be used +exports.aria_attribute_valid = { + id: "aria_attribute_valid", + context: "dom:*", + // The the ARIA role is completely invalid, skip this check + dependencies: ["aria_attribute_deprecated", "aria_role_valid"], + refactor: { + "aria_attribute_allowed": { + "Pass": "Pass", + "Fail_invalid_role_attr": "Fail_invalid_role_attr", + "Fail_invalid_implicit_role_attr": "Fail_invalid_implicit_role_attr" + } + }, + help: { + "en-US": { + "group": "aria_attribute_valid.html", + "Pass": "aria_attribute_valid.html", + "Fail_invalid_role_attr": "aria_attribute_valid.html", + "Fail_invalid_implicit_role_attr": "aria_attribute_valid.html" + } + }, + messages: { + "en-US": { + "group": "ARIA attributes should be valid for the element and ARIA role to which they are assigned", + "Pass": "ARIA attributes are valid for the element and ARIA role", + "Fail_invalid_role_attr": "The ARIA attributes \"{0}\" are not valid for the element <{1}> with ARIA role \"{2}\"", + "Fail_invalid_implicit_role_attr": "The ARIA attributes \"{0}\" are not valid for the element <{1}> with implicit ARIA role \"{2}\"" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["ARIA"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: ["5c01ea", { "46ca7f": { "Pass": "pass", "Fail_invalid_role_attr": "fail", "Fail_invalid_implicit_role_attr": "fail" } }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // only chek element (1) + if (ruleContext.nodeType !== 1 /* Node.ELEMENT_NODE */) + return null; + // ignore if no aria attribute + var ariaAttributes = AriaUtil_1.AriaUtil.getUserDefinedAriaAttributes(ruleContext); + if (ariaAttributes === null || ariaAttributes.length === 0) + return null; + var roles = AriaUtil_1.AriaUtil.getUserDefinedRoles(ruleContext); + var explicit = true; + if (roles && roles.length > 0) { + // the invalid role case: handled by Rpt_Aria_ValidRole. Ignore to avoid duplicated report + if (!AriaUtil_1.AriaUtil.areRolesDefined(roles)) + return null; + } + else { + //no explicit role defined + roles = AriaUtil_1.AriaUtil.getImplicitRole(ruleContext); + explicit = false; + } + var tagName = ruleContext.tagName.toLowerCase(); + var failedAttributes = AriaUtil_1.AriaUtil.getInvalidAriaAttributes(ruleContext); + if (!failedAttributes || failedAttributes.length === 0) + return (0, IRule_1.RulePass)("Pass", [ariaAttributes.join(", "), tagName, roles.join(", ")]); + if (roles.length > 0) { + if (explicit) + return (0, IRule_1.RuleFail)("Fail_invalid_role_attr", [failedAttributes.join(", "), tagName, roles.join(", ")]); + else + return (0, IRule_1.RuleFail)("Fail_invalid_implicit_role_attr", [failedAttributes.join(", "), tagName, roles.join(", ")]); + } + return (0, IRule_1.RuleFail)("Fail_invalid_role_attr", [failedAttributes.join(", "), tagName, "none"]); + } +}; + + +/***/ }, + +/***/ 1617 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_toolbar_label_unique = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +var CacheUtil_1 = __webpack_require__(4566); +exports.aria_toolbar_label_unique = { + id: "aria_toolbar_label_unique", + context: "aria:toolbar", + refactor: { + "Rpt_Aria_MultipleToolbarUniqueLabel": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_toolbar_label_unique.html", + "Fail_1": "aria_toolbar_label_unique.html", + "group": "aria_toolbar_label_unique.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Multiple elements with \"toolbar\" roles do not have unique labels", + "group": "Each element with \"toolbar\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Consider the Check Hidden Content setting that is set by the rules + // Also, consider Implicit role checking. + var landmarks = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "toolbar", true, true); + if (landmarks.length === 0 || landmarks.length === 1) { + return null; + } + var dupes = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "aria_toolbar_label_unique", null); + if (!dupes) { + dupes = AriaUtil_1.AriaUtil.findAriaLabelDupes(landmarks); + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "aria_toolbar_label_unique", dupes); + } + var myLabel = AriaUtil_1.AriaUtil.getAriaLabel(ruleContext); + var passed = myLabel !== "" && (!(myLabel in dupes) || dupes[myLabel] <= 1); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", [myLabel]); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ 3475 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_widget_labelled = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +var ARIAMapper_1 = __webpack_require__(9955); +var fragment_1 = __webpack_require__(5279); +var ARIADefinitions_1 = __webpack_require__(9910); +var DOMUtil_1 = __webpack_require__(1686); +exports.aria_widget_labelled = { + id: "aria_widget_labelled", + context: "dom:*", + refactor: { + "Rpt_Aria_WidgetLabels_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "aria_widget_labelled.html", + "Pass_0": "aria_widget_labelled.html", + "Fail_1": "aria_widget_labelled.html" + } + }, + messages: { + "en-US": { + "group": "Interactive component must have a programmatically associated name", + "Pass_0": "Rule Passed", + "Fail_1": "Interactive component with ARIA role '{0}' does not have a programmatically associated name" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: "m6b1q3", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + /* removed the role check role= presentation and role=none since these 2 roles are not in the list of widget type roles */ + if ((ruleContext.hasAttribute("type") && + ruleContext.getAttribute("type") === "hidden") || + (AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, "combobox") && + !(AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "textbox") || + AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "searchbox")))) { + // we need to diagnose that a combobox input textbox has a label(github issue #1104) + return null; + } + var elemRole = ARIAMapper_1.ARIAMapper.nodeToRole(ruleContext); + var tagName = ruleContext.nodeName.toLowerCase(); + // Handled by input_label_exists + var skipRoles = [ + "button", + "checkbox", + "combobox", + "listbox", + "menuitemcheckbox", + "menuitemradio", + "radio", + "searchbox", + "slider", + "spinbutton", + "switch", + "textbox", + "progressbar", + "link", + ]; + if (skipRoles.includes(elemRole)) + return null; + if (tagName === "output" || + (tagName === "input" && + ruleContext.getAttribute("type") === "file")) { + } + if (!ruleContext.hasAttribute("role")) { + // Form/input elements are checked by G41, we skip them from this rule. Github issue 449 + var skipElements = [ + "input", + "textarea", + "select", + "button", + "datalist", + "optgroup", + "option", + "keygen", + "output", + "progress", + "meter", + ]; + if (skipElements.indexOf(ruleContext.nodeName.toLowerCase()) != + -1) { + return null; + } + } + // avoid diagnosing the popup list of a combobox. + var rolesToCheck = ["listbox", "tree", "grid", "dialog"]; + for (var j = 0; j < rolesToCheck.length; j++) { + if (AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, rolesToCheck[j])) { + var comboboxes = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "combobox", true, true); + for (var k = 0; k < comboboxes.length; k++) { + var combobox = comboboxes[k]; + var aria_owns = CommonUtil_1.CommonUtil.getElementAttribute(combobox, "aria-owns"); + if (aria_owns) { + var owns = CommonUtil_1.CommonUtil.normalizeSpacing(aria_owns.trim()).split(" "); + for (var i = 0; i < owns.length; i++) { + var owned = fragment_1.FragmentUtil.getById(ruleContext, owns[i]); + if (owned === ruleContext) { + return null; + } + } + } + } + } + } + var passed = true; + var prohibited = false; + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + //get attribute roles as well as implicit roles. + var roles = AriaUtil_1.AriaUtil.getRoles(ruleContext, true); + var numWidgetsTested = 0; + var interactiveRoleTypes = ["widget", "liveRegion", "window"]; + for (var i = 0, length_1 = roles.length; passed && i < length_1; ++i) { + var pattern = designPatterns[roles[i]]; + if (pattern && + pattern.nameRequired && + pattern.roleType && + interactiveRoleTypes.includes(pattern.roleType)) { + ++numWidgetsTested; + // All widgets may have an author supplied accessible name. + // Title is legal, but don't advertise its use in documentation. + // Encourage use of aria-label, aria-labelledby or html label element. + passed = + AriaUtil_1.AriaUtil.hasAriaLabel(ruleContext) || + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "title") || + CommonUtil_1.CommonUtil.getLabelForElementHidden(ruleContext, true); + if (!passed && + pattern.nameFrom && + pattern.nameFrom.indexOf("contents") >= 0) { + // See if widget's accessible name is supplied by element's inner text + // nameFrom: ["author", "contents"] + passed = CommonUtil_1.CommonUtil.hasInnerContentOrAlt(ruleContext); + } + if (!passed) { + // check if it has implicit label, like <label><input ....>abc </label> + passed = CommonUtil_1.CommonUtil.hasImplicitLabel(ruleContext); + } + if (!passed && + ruleContext.tagName.toLowerCase() === "img" && + !ruleContext.hasAttribute("role") && + ruleContext.hasAttribute("alt")) { + passed = + DOMUtil_1.DOMUtil.cleanWhitespace(ruleContext.getAttribute("alt")).trim().length > 0; + } + if (pattern.nameFrom.indexOf("prohibited") >= 0) { + prohibited = true; + } + } + } + if (numWidgetsTested === 0) { + return null; + } + else if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", [elemRole]); + } + else { + //TODO + // if (prohibited) { + // return RuleFail("Fail_2"); + // } else { + return (0, IRule_1.RulePass)("Pass_0"); + // } + } + } +}; + + +/***/ }, + +/***/ 3370 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.asciiart_alt_exists = void 0; +var IRule_1 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +exports.asciiart_alt_exists = { + id: "asciiart_alt_exists", + context: "dom:pre, dom:listing, dom:xmp, dom:plaintext", + refactor: { + "RPT_Pre_ASCIIArt": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "asciiart_alt_exists.html", + "Potential_1": "asciiart_alt_exists.html", + "group": "asciiart_alt_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that ASCII art has a text alternative", + "group": "ASCII art must have a text alternative" + } + }, + /** + * Decision in planning 9/7/23 that this rule causes more reviews that we see actual problems in content, so turn these rules off + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": eRulePolicy.VIOLATION, + "toolkitLevel": eToolkitLevel.LEVEL_ONE + }], + */ + rulesets: [], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Fix for IDWB writers. Don't trigger if content is in a code element. The code element is searched for + // in various places because of the weird way various browsers render <code><pre></pre></code. Firefox, + // HtmlUnit and Chrome all render differently. Firefox: <code></code><pre></pre> HtmlUnit: </code><pre><code></code></pre> + // See unit test CodeElementAbovePreElement.html. Don't know how RPT renders, so cover all the bases. + if (ruleContext.nodeName.toLowerCase() == "pre") { + if ((ruleContext.previousSibling && ruleContext.previousSibling.nodeName.toLowerCase() == "code") || + ruleContext.getElementsByTagName("code").length > 0 || + CommonUtil_1.CommonUtil.getAncestor(ruleContext, "code")) { + return (0, IRule_1.RulePass)("Pass_0"); + } + } + var passed = true; + var txtValue = CommonUtil_1.CommonUtil.getInnerText(ruleContext); + var nonAlphaNumericNorSpaceCount = 0; + var alphNumSameCharacterCount = 0; + var lastCharacter = ""; + // Iterate through the text content + for (var idx = 0; passed && (idx < txtValue.length); ++idx) { + var chStr = txtValue.substr(idx, 1); + // Check if it is alphanumeric or punctuation + if (/[\w!@#$%&\*().,?\[\]{}<>=":\/\\-]/.test(chStr)) { + // Detect same character sequence + if (lastCharacter == chStr) { + alphNumSameCharacterCount = alphNumSameCharacterCount + 1; + ; + } + else { + alphNumSameCharacterCount = 0; + } + } + else if (/\s/.test(chStr)) { + alphNumSameCharacterCount = 0; + } + else { + nonAlphaNumericNorSpaceCount = nonAlphaNumericNorSpaceCount + 1; + alphNumSameCharacterCount = 0; + } + lastCharacter = chStr; + // Make the decision + if (nonAlphaNumericNorSpaceCount >= 5 || alphNumSameCharacterCount >= 4) { + passed = false; + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ 9272 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.blink_css_review = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +exports.blink_css_review = { + id: "blink_css_review", + context: "dom:style, dom:*[style]", + refactor: { + "RPT_Blink_CSSTrigger1": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "group": "blink_css_review.html", + "Pass_0": "blink_css_review.html", + "Potential_1": "blink_css_review.html" + } + }, + messages: { + "en-US": { + "group": "Do not use the \"blink\" value of the 'text-decoration' property for longer than five seconds", + "Pass_0": "Rule Passed", + "Potential_1": "Check the \"blink\" value of the CSS 'text-decoration' property is not used for more than than five seconds" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "2.2.2", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var textValue = CommonUtil_1.CommonUtil.getInnerText(ruleContext); + if (ruleContext.hasAttribute('style')) { + textValue = ruleContext.getAttribute('style'); + } + var passed = textValue.toLowerCase().indexOf("text-decoration:blink") == -1; + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ 7735 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.blink_elem_deprecated = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +exports.blink_elem_deprecated = { + id: "blink_elem_deprecated", + context: "dom:blink", + refactor: { + "WCAG20_Blink_AlwaysTrigger": { + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "blink_elem_deprecated.html", + "Fail_1": "blink_elem_deprecated.html" + } + }, + messages: { + "en-US": { + "group": "Content that blinks persistently must not be used", + "Fail_1": "Content found that blinks persistently" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "2.2.2", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + // const ruleContext = context["dom"].node as Element; + return (0, IRule_1.RuleFail)("Fail_1"); + } +}; + + +/***/ }, + +/***/ 3923 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.blockquote_cite_exists = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +exports.blockquote_cite_exists = { + id: "blockquote_cite_exists", + context: "dom:blockquote", + refactor: { + "RPT_Blockquote_HasCite": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "blockquote_cite_exists.html", + "Potential_1": "blockquote_cite_exists.html", + "group": "blockquote_cite_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that <blockquote> should have a 'cite' attribute and not be used for indentation only", + "group": "Use <blockquote> only for quotations, not indentation" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "cite"); + if (!passed) { + var citeElems = CommonUtil_1.CommonUtil.getDocElementsByTag(ruleContext, "cite"); + passed = citeElems != null && citeElems.length > 0; + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ 7521 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.canvas_content_described = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var VisUtil_1 = __webpack_require__(3946); +exports.canvas_content_described = { + id: "canvas_content_described", + context: "dom:canvas", + refactor: { + "HAAC_Canvas": { + "Pass_0": "Pass_0", + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Pass_0": "canvas_content_described.html", + "Manual_1": "canvas_content_described.html", + "group": "canvas_content_described.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Manual_1": "Verify accessibility of the <canvas> element", + "group": "The <canvas> element may not be accessible" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1", "2.1.1", "4.1.2"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = ruleContext.innerHTML.trim().length > 0; + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }, + +/***/ 1852 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.caption_track_exists = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +exports.caption_track_exists = { + id: "caption_track_exists", + context: "dom:video", + refactor: { + "HAAC_Video_HasNoTrack": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "caption_track_exists.html", + "Potential_1": "caption_track_exists.html", + "group": "caption_track_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that captions are available for any meaningful audio or provide a caption track for the <video> element", + "group": "A <video> element must have a text alternative for any meaningful audio content" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.2.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = false; + // ignore decorative video if user uses aria-hidden + if (ruleContext.getAttribute("aria-hidden") === "true") { + return null; + } + var tracks = ruleContext.getElementsByTagName("track"); + for (var i = 0; i < tracks.length; ++i) { + passed = passed || tracks[i].getAttribute("kind") === 'captions'; + } + // checks for addition of dynamic tracks + if (ruleContext.textTracks && ruleContext.textTracks.length > 0) { + for (var i = 0; i < ruleContext.textTracks.length; i++) { + passed = passed || ruleContext.textTracks[i].kind === 'captions'; + } + } + if (passed) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RulePotential)("Potential_1"); + } + } +}; + + +/***/ }, + +/***/ 799 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.combobox_active_descendant = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var fragment_1 = __webpack_require__(5279); +var DOMWalker_1 = __webpack_require__(3864); +var CacheUtil_1 = __webpack_require__(4566); +var VisUtil_1 = __webpack_require__(3946); +exports.combobox_active_descendant = { + id: "combobox_active_descendant", + context: "aria:combobox", + dependencies: ["combobox_popup_reference"], + help: { + "en-US": { + "Pass": "combobox_active_descendant.html", + "Fail_missing": "combobox_active_descendant.html", + "Fail_not_in_popup": "combobox_active_descendant.html", + "Fail_active_role_invalid": "combobox_active_descendant.html", + "Fail_active_not_selected": "combobox_active_descendant.html", + "group": "combobox_active_descendant.html" + } + }, + messages: { + "en-US": { + "Pass": "'aria-activedescendant' is used appropriately for this combobox", + "Fail_missing": "The element referenced by 'aria-activedescendant' \"{0}\" does not exist", + "Fail_not_in_popup": "The element referenced by 'aria-activedescendant' \"{0}\" does not exist within the popup referenced by 'id' \"{1}\"", + "Fail_active_role_invalid": "The 'aria-activedescendant' \"{0}\" references an element with the roles \"{1}\", which does not have a valid ARIA role of 'option', 'gridcell', 'row', or 'treeitem'", + "Fail_active_not_selected": "The 'aria-activedescendant' \"{0}\" references an element that does not have 'aria-selected' set to true", + "group": "'aria-activedescendant' must be used to define focus within the combobox popup, except when using a dialog popup" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var cache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "combobox", {}); + if (!cache) + return null; + var cachedElem = cache[context["dom"].rolePath]; + if (!cachedElem) + return null; + var popupElement = cachedElem.popupElement, popupId = cachedElem.popupId; + // If this isn't defined, the combobox is probably collapsed. A reference error is + // detected in combobox_popup_reference + if (!popupElement) + return null; + // This rule only applies if the activedescendant is specified + var activeId = ruleContext.getAttribute("aria-activedescendant"); + if (!activeId || activeId.trim().length === 0) { + return null; + } + var activeElem = fragment_1.FragmentUtil.getById(ruleContext, activeId); + if (!activeElem) { + return (0, IRule_1.RuleFail)("Fail_missing", [activeId]); + } + var found = false; + // examine the children + if (popupElement) { + var nw = new DOMWalker_1.DOMWalker(popupElement); + while (!found && nw.nextNode() && nw.node != popupElement && nw.node != popupElement.nextSibling) { + if (nw.node.nodeType === 1 && VisUtil_1.VisUtil.isNodeVisible(nw.node)) { + found = nw.elem().getAttribute("id") === activeId; + } + } + } + var retVal = []; + if (!found) { + retVal.push((0, IRule_1.RulePass)("Fail_not_in_popup", [activeId, popupId])); + } + var activeRoles = AriaUtil_1.AriaUtil.getRoles(activeElem, true); + var validRoles = ["option", "gridcell", "row", "treeitem"].filter(function (validRole) { return activeRoles.includes(validRole); }); + if (validRoles.length === 0) { + retVal.push((0, IRule_1.RuleFail)("Fail_active_role_invalid", [activeId, activeRoles.join(",")])); + } + if (activeElem.getAttribute("aria-selected") !== "true") { + retVal.push((0, IRule_1.RuleFail)("Fail_active_not_selected", [activeId])); + } + if (retVal.length === 0) { + return (0, IRule_1.RulePass)("Pass"); + } + else { + return retVal; + } + } +}; + + +/***/ }, + +/***/ 4614 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.combobox_autocomplete_valid = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var DOMWalker_1 = __webpack_require__(3864); +var CacheUtil_1 = __webpack_require__(4566); +var VisUtil_1 = __webpack_require__(3946); +exports.combobox_autocomplete_valid = { + id: "combobox_autocomplete_valid", + context: "aria:combobox", + dependencies: ["combobox_popup_reference"], + refactor: { + "combobox_autocomplete": { + "Pass": "Pass", + "Fail_1": "Fail_1", + "Fail_inline": "Fail_inline" + } + }, + help: { + "en-US": { + "Pass": "combobox_autocomplete_valid.html", + "Fail_1": "combobox_autocomplete_valid.html", + "Fail_inline": "combobox_autocomplete_valid.html", + "group": "combobox_autocomplete_valid.html" + } + }, + messages: { + "en-US": { + "Pass": "The combobox does not use 'aria-autocomplete' value '\"inline\"' nor does it have 'aria-autocomplete' defined within the popup", + "Fail_1": "The combobox has the 'aria-autocomplete' attribute incorrectly set on an element within the popup referenced by \"{0}\"", + "Fail_inline": "The combobox does not support an 'aria-autocomplete' attribute value set to '\"inline\"' ", + "group": "A combobox that supports autocompletion behavior must have the 'aria-autocomplete' attribute only on its text input element with a valid value; a value of '\"inline\"' is not supported" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var cache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "combobox", {}); + if (!cache) + return null; + var cachedElem = cache[context["dom"].rolePath]; + if (!cachedElem) + return null; + var popupId = cachedElem.popupId, popupElement = cachedElem.popupElement; + var retVal = []; + if (ruleContext.getAttribute("aria-autocomplete") === "inline") { + retVal.push((0, IRule_1.RuleFail)("Fail_inline")); + } + var passed = true; + // examine the children + if (popupElement && VisUtil_1.VisUtil.isNodeVisible(popupElement)) { + // if popupElement itself has "aria-autocomplete" + passed = !popupElement.hasAttribute("aria-autocomplete"); + // if any child of popupElement has "aria-autocomplete" + if (passed && popupElement.children && popupElement.children.length > 0) { + var nw = new DOMWalker_1.DOMWalker(popupElement); + while (passed && nw.nextNode()) { + if (nw.node.nodeType === 1 && VisUtil_1.VisUtil.isNodeVisible(nw.node)) { + passed = !nw.elem().hasAttribute("aria-autocomplete"); + if (nw.bEndTag && nw.node === popupElement.lastElementChild) + break; + } + } + } + } + if (!passed) { + retVal.push((0, IRule_1.RuleFail)("Fail_1", [popupId])); + } + if (retVal.length > 0) { + return retVal; + } + else { + return (0, IRule_1.RulePass)("Pass"); + } + } +}; + + +/***/ }, + +/***/ 5952 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.combobox_design_valid = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +var VisUtil_1 = __webpack_require__(3946); +var CacheUtil_1 = __webpack_require__(4566); +function patternDetect(elem) { + // check 'explicit' role combobox and that it is not <select>. + if (elem.tagName.toLowerCase() === "select" && elem.getAttribute("role") !== "combobox") { + return "implicit"; + } + else if (elem.nodeName.toLowerCase() === "input" + && (!elem.hasAttribute("type") || elem.getAttribute("type") === "text") + && elem.hasAttribute("aria-owns") && !elem.hasAttribute("aria-controls")) { + // Looks like this is an ARIA 1.0 pattern, which the ARIA 1.2 spec says to continue to allow + return "1.0"; + } + else if (elem.nodeName.toLowerCase() !== "input" + && elem.hasAttribute("aria-owns") && !elem.hasAttribute("aria-controls")) { + // Looks like this is an ARIA 1.1 pattern, which the ARIA 1.2 spec says is now invalid + return "1.1"; + } + // Assume they're trying to do the latest, 1.2 pattern + return "1.2"; +} +exports.combobox_design_valid = { + id: "combobox_design_valid", + context: "aria:combobox", + refactor: { + "combobox_version": { + "Pass_1.0": "Pass_1.0", + "Fail_1.1": "Fail_1.1", + "Pass_1.2": "Pass_1.2" + } + }, + help: { + "en-US": { + "Pass_1.0": "combobox_design_valid.html", + "Fail_1.1": "combobox_design_valid.html", + "Pass_1.2": "combobox_design_valid.html", + "group": "combobox_design_valid.html" + } + }, + messages: { + "en-US": { + "Pass_1.0": "The combobox design pattern is detected as ARIA 1.0, which is allowed by ARIA 1.2", + "Fail_1.1": "The combobox design pattern is detected as ARIA 1.1, which is not allowed by ARIA 1.2", + "Pass_1.2": "The combobox design pattern is detected as ARIA 1.2", + "group": "The combobox design pattern must be valid for ARIA 1.2" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) { + return null; + } + var pattern = patternDetect(ruleContext); + // We don't assess native select elements here + if (pattern === "implicit") { + return null; + } + var tagName = ruleContext.tagName.toLowerCase(); + var expanded = (AriaUtil_1.AriaUtil.getAriaAttribute(ruleContext, "aria-expanded") || "").trim().toLowerCase() === "true"; + var editable = tagName === "input" && (!ruleContext.hasAttribute("type") || ruleContext.getAttribute("type").toLowerCase() === "text"); + var key = context["dom"].rolePath; + if (key) { + var cache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "combobox", {}); + if (!cache) + return null; + cache[key] = { + "inputElement": editable ? ruleContext : null, + "pattern": pattern, + "expanded": expanded + }; + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "combobox", cache); + } + else { + // No xpath? + return null; + } + if (pattern === "1.0") { + return (0, IRule_1.RulePass)("Pass_1.0"); + } + else if (pattern === "1.1") { + return (0, IRule_1.RuleFail)("Fail_1.1"); + } + else if (pattern === "1.2") { + return (0, IRule_1.RulePass)("Pass_1.2"); + } + } +}; + + +/***/ }, + +/***/ 5395 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.combobox_focusable_elements = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var DOMWalker_1 = __webpack_require__(3864); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +var CacheUtil_1 = __webpack_require__(4566); +var VisUtil_1 = __webpack_require__(3946); +exports.combobox_focusable_elements = { + id: "combobox_focusable_elements", + context: "aria:combobox", + dependencies: ["combobox_popup_reference"], + help: { + "en-US": { + "Pass": "combobox_focusable_elements.html", + "Fail_not_tabbable": "combobox_focusable_elements.html", + "Fail_tabbable_child": "combobox_focusable_elements.html", + "group": "combobox_focusable_elements.html" + } + }, + messages: { + "en-US": { + "Pass": "DOM focus is allowed only on the combobox element as required", + "Fail_not_tabbable": "The combobox element does not allow DOM focus as required", + "Fail_tabbable_child": "The popup of the combobox has DOM focus or has 'aria-activedescendant' defined, which is not allowed", + "group": "Tabbable focus for the combobox must be allowed only on the text input, except when using a dialog popup" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var cache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "combobox", {}); + if (!cache) + return null; + var cachedElem = cache[context["dom"].rolePath]; + if (!cachedElem) + return null; + var popupElement = cachedElem.popupElement, expanded = cachedElem.expanded; + // If this isn't defined, the combobox is probably collapsed. A reference error is + // detected in combobox_popup_reference + if (!popupElement) + return null; + var popupRole = AriaUtil_1.AriaUtil.getRoles(popupElement, true)[0]; + var retVal = []; + if (!CommonUtil_1.CommonUtil.isTabbable(ruleContext)) { + retVal.push((0, IRule_1.RuleFail)("Fail_not_tabbable")); + } + // Only makes sense to check the popup when expanded + // this does not apply to dialogs, return pass since the main element was focusable above + if (expanded === false || popupRole === "dialog") { + return (0, IRule_1.RulePass)("Pass"); + } + var passed = true; + // examine the children + if (popupElement && VisUtil_1.VisUtil.isNodeVisible(popupElement)) { + // if popupElement itself has "aria-activedescendant" + passed = !CommonUtil_1.CommonUtil.isTabbable(popupElement) && !AriaUtil_1.AriaUtil.getAriaAttribute(popupElement, "aria-activedescendant"); + ; + // if any child of popupElement has "aria-autocomplete" + if (passed && popupElement.children && popupElement.children.length > 0) { + var nw = new DOMWalker_1.DOMWalker(popupElement); + while (passed && nw.nextNode()) { + if (nw.node.nodeType === 1 && VisUtil_1.VisUtil.isNodeVisible(nw.node)) { + passed = !CommonUtil_1.CommonUtil.isTabbable(nw.node) && + !AriaUtil_1.AriaUtil.getAriaAttribute(nw.node, "aria-activedescendant"); + if (nw.bEndTag && nw.node === popupElement.lastElementChild) + break; + } + } + } + } + if (!passed) { + retVal.push((0, IRule_1.RuleFail)("Fail_tabbable_child")); + } + if (retVal.length === 0) { + return (0, IRule_1.RulePass)("Pass"); + } + else { + return retVal; + } + } +}; + + +/***/ }, + +/***/ 1992 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.combobox_haspopup_valid = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CacheUtil_1 = __webpack_require__(4566); +exports.combobox_haspopup_valid = { + id: "combobox_haspopup_valid", + context: "aria:combobox", + dependencies: ["combobox_popup_reference"], + refactor: { + "combobox_haspopup": { + "Pass": "Pass", + "Fail_popup_role_invalid": "Fail_popup_role_invalid", + "Fail_combobox_popup_role_mismatch": "Fail_combobox_popup_role_mismatch" + } + }, + help: { + "en-US": { + "Pass": "combobox_haspopup_valid.html", + "Fail_popup_role_invalid": "combobox_haspopup_valid.html", + "Fail_combobox_popup_role_mismatch": "combobox_haspopup_valid.html", + "group": "combobox_haspopup_valid.html" + } + }, + messages: { + "en-US": { + "Pass": "The 'aria-controls' (ARIA 1.2) or 'aria-owns' (ARIA 1.0) appropriately references a valid popup 'id' value", + "Fail_popup_role_invalid": "The 'role' value \"{0}\" of the popup element \"{1}\" should be one of \"listbox\", \"grid\", \"tree\" or \"dialog\"", + "Fail_combobox_popup_role_mismatch": "The value of the combobox 'aria-haspopup' attribute \"{0}\" does not match the 'role' value of the popup element \"{1}\"", + "group": "The combobox attribute 'aria-haspopup' value must be appropriate for the role of the element referenced by 'aria-controls' (ARIA 1.2) or 'aria-owns' (ARIA 1.0)" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var cache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "combobox", {}); + if (!cache) + return null; + var cacheKey = context["dom"].rolePath; + var cachedElem = cache[cacheKey]; + if (!cachedElem) + return null; + var popupElement = cachedElem.popupElement, popupId = cachedElem.popupId; + // If this isn't defined, the combobox is probably collapsed. A reference error is + // detected in combobox_popup_reference + if (!popupElement) + return null; + // Check that popup role is listbox, grid, tree, or dialog and that it matches the combobox + var popupRoles = AriaUtil_1.AriaUtil.getRoles(popupElement, true); + var validRoles = ["listbox", "grid", "tree", "dialog"].filter(function (validRole) { return popupRoles.includes(validRole); }); + if (validRoles.length === 0) { + return (0, IRule_1.RuleFail)("Fail_popup_role_invalid", [popupRoles.join(","), popupId]); + } + else { + var popupRole = validRoles[0]; + var haspopupVal = ruleContext.getAttribute("aria-haspopup") || "listbox"; + // Popup role must match aria-haspopup unless popupRole is listbox, then aria-haspopup should not be defined + if (haspopupVal !== popupRole) { + if (popupRole !== "listbox" || ruleContext.hasAttribute("aria-haspopup")) { + return (0, IRule_1.RuleFail)("Fail_combobox_popup_role_mismatch", [haspopupVal, popupRole]); + } + } + } + return (0, IRule_1.RulePass)("Pass"); + } +}; + + +/***/ }, + +/***/ 7955 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.combobox_popup_reference = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var fragment_1 = __webpack_require__(5279); +var CacheUtil_1 = __webpack_require__(4566); +var VisUtil_1 = __webpack_require__(3946); +exports.combobox_popup_reference = { + id: "combobox_popup_reference", + context: "aria:combobox", + dependencies: ["combobox_design_valid"], + help: { + "en-US": { + "group": "combobox_popup_reference.html", + "Pass_1.0_expanded": "combobox_popup_reference.html", + "Pass_1.0_collapsed": "combobox_popup_reference.html", + "Pass_1.2_expanded": "combobox_popup_reference.html", + "Pass_1.2_collapsed": "combobox_popup_reference.html", + "Fail_1.0_missing_owns": "combobox_popup_reference.html", + "Fail_1.2_missing_controls": "combobox_popup_reference.html", + "Fail_1.0_popup_reference_missing": "combobox_popup_reference.html", + "Fail_1.2_popup_reference_missing": "combobox_popup_reference.html", + "Fail_combobox_expanded_hidden": "combobox_popup_reference.html", + "Fail_combobox_collapsed_visible": "combobox_popup_reference.html" + } + }, + messages: { + "en-US": { + "group": "The 'aria-controls' (for ARIA 1.2) or the 'aria-owns' (for ARIA 1.0) attribute of the expanded combobox must reference a valid popup 'id' value", + "Pass_1.0_expanded": "The combobox popup referenced by 'aria-owns' (ARIA 1.0) exists and is visible", + "Pass_1.0_collapsed": "The combobox popup in its collapsed state does not reference any visible popup as required", + "Pass_1.2_expanded": "The combobox popup referenced by 'aria-controls' (ARIA 1.2) exists and is visible", + "Pass_1.2_collapsed": "The combobox popup in its collapsed state does not reference any visible popup as required", + "Fail_1.0_missing_owns": "The 'aria-owns' attribute of the expanded combobox is missing", + "Fail_1.2_missing_controls": "The 'aria-controls' attribute of the expanded combobox is missing", + "Fail_1.0_popup_reference_missing": "The 'aria-owns' attribute \"{0}\" of the expanded combobox does not reference a valid popup 'id' value", + "Fail_1.2_popup_reference_missing": "The 'aria-controls' attribute \"{0}\" of the expanded combobox does not reference a valid popup 'id' value", + "Fail_combobox_expanded_hidden": "The combobox 'aria-expanded' attribute is true, but the combobox popup is not visible", + "Fail_combobox_collapsed_visible": "The combobox 'aria-expanded' attribute is false, but the combobox popup is visible" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [{ + "4e8ab6": { + "Pass_1.0_expanded": "fail", + "Pass_1.0_collapsed": "fail", + "Pass_1.2_expanded": "pass", + "Pass_1.2_collapsed": "pass", + "Fail_1.0_missing_owns": "inapplicable", + "Fail_1.2_missing_controls": "fail", + "Fail_1.0_popup_reference_missing": "inapplicable", + "Fail_1.2_popup_reference_missing": "fail", + "Fail_combobox_expanded_hidden": "inapplicable", + "Fail_combobox_collapsed_visible": "inapplicable" + } + }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var cache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "combobox", {}); + if (!cache) + return null; + var cacheKey = context["dom"].rolePath; + var cachedElem = cache[cacheKey]; + if (!cachedElem) + return null; + var pattern = cachedElem.pattern, expanded = cachedElem.expanded; + var popupId; + var popupElement; + if (pattern === "1.0") { + if (!ruleContext.hasAttribute("aria-owns")) { + // If the combobox isn't expanded, this attribute isn't required + return !expanded ? null : (0, IRule_1.RuleFail)("Fail_1.0_missing_owns"); + } + popupId = ruleContext.getAttribute("aria-owns"); + popupElement = fragment_1.FragmentUtil.getById(ruleContext, popupId); + if (!popupElement) { + // If the combobox isn't expanded, this attribute isn't required + return !expanded ? null : (0, IRule_1.RuleFail)("Fail_1.0_popup_reference_missing", [popupId]); + } + } + else if (pattern === "1.2") { + if (!ruleContext.hasAttribute("aria-controls")) { + // If the combobox isn't expanded, this attribute isn't required + return !expanded ? null : (0, IRule_1.RuleFail)("Fail_1.2_missing_controls"); + } + popupId = ruleContext.getAttribute("aria-controls"); + popupElement = fragment_1.FragmentUtil.getById(ruleContext, popupId); + if (!popupElement) { + // If the combobox isn't expanded, this attribute isn't required + return !expanded ? null : (0, IRule_1.RuleFail)("Fail_1.2_popup_reference_missing", [popupId]); + } + } + else { + return null; + } + // We have an element, stick it in the cache and then check its role + cachedElem.popupId = popupId; + cachedElem.popupElement = popupElement; + if (expanded && !VisUtil_1.VisUtil.isNodeVisible(popupElement)) { + return (0, IRule_1.RuleFail)("Fail_combobox_expanded_hidden"); + } + else if (!expanded && VisUtil_1.VisUtil.isNodeVisible(popupElement)) { + return (0, IRule_1.RuleFail)("Fail_combobox_collapsed_visible"); + } + if (pattern === "1.0") { + if (expanded) { + return (0, IRule_1.RulePass)("Pass_1.0_expanded"); + } + else { + return (0, IRule_1.RulePass)("Pass_1.0_collapsed"); + } + } + else { + if (expanded) { + return (0, IRule_1.RulePass)("Pass_1.2_expanded"); + } + else { + return (0, IRule_1.RulePass)("Pass_1.2_collapsed"); + } + } + } +}; + + +/***/ }, + +/***/ 9531 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.debug_paths = void 0; +var IRule_1 = __webpack_require__(461); +exports.debug_paths = { + id: "debug_paths", + context: "dom:*", + help: { + "en-US": { + "group": "", + "Pass_0": "" + } + }, + messages: { + "en-US": { + "group": "", + "Pass_0": "" + } + }, + rulesets: [{ + id: ["DEBUG"], + num: "1", + level: IRule_1.eRulePolicy.INFORMATION, + toolkitLevel: IRule_1.eToolkitLevel.LEVEL_FOUR + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + ruleContext.setAttribute("domPath", context["dom"].rolePath); + ruleContext.setAttribute("ariaPath", context["aria"].rolePath); + return null; + } +}; + + +/***/ }, + +/***/ 891 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.detector_tabbable = void 0; +var CommonUtil_1 = __webpack_require__(7139); +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +exports.detector_tabbable = { + id: "detector_tabbable", + context: "dom:*", + help: { + "en-US": { + "group": "", + "Pass_0": "" + } + }, + messages: { + "en-US": { + "group": "", + "Pass_0": "" + } + }, + rulesets: [{ + id: ["EXTENSIONS"], + num: "1", + level: IRule_2.eRulePolicy.INFORMATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_FOUR + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (!CommonUtil_1.CommonUtil.isTabbable(ruleContext)) { + return null; + } + var hierContext = contextHierarchies.aria[contextHierarchies.aria.length - 1]; + return (0, IRule_1.RulePass)("Pass_0", [], [{ + name: hierContext.attributes.name, + role: hierContext.role, + tabindex: parseInt(ruleContext.getAttribute("tabindex") || "0") + }]); + } +}; + + +/***/ }, + +/***/ 7446 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.dir_attribute_valid = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +exports.dir_attribute_valid = { + id: "dir_attribute_valid", + context: "dom:*[dir]", + refactor: { + "Valerie_Elem_DirValid": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "dir_attribute_valid.html", + "Fail_1": "dir_attribute_valid.html", + "group": "dir_attribute_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Invalid value used for the 'dir' attribute", + "group": "'dir' attribute value must be \"ltr\", \"rtl\", or \"auto\"" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var dirStr = ruleContext.getAttribute("dir").toLowerCase(); + var passed = dirStr == "ltr" || dirStr == "rtl" || dirStr == "auto"; + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ 6137 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.download_keyboard_controllable = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +var VisUtil_1 = __webpack_require__(3946); +exports.download_keyboard_controllable = { + id: "download_keyboard_controllable", + context: "dom:a[href],dom:area[href]", + refactor: { + "HAAC_Media_DocumentTrigger2": { + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Manual_1": "download_keyboard_controllable.html", + "group": "download_keyboard_controllable.html" + } + }, + messages: { + "en-US": { + "Manual_1": "Verify that the file download mechanism does not cause a keyboard trap", + "group": "File download mechanisms should be keyboard-operable and preserve page focus location" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.2"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var href = ruleContext.getAttribute("href"); + var ext = CommonUtil_1.CommonUtil.getFileExt(href); + var passed = ![".docx", ".doc", ".pdf", ".odt"].includes(ext); + if (passed) + return null; + if (!passed) + return (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }, + +/***/ 6839 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.draggable_alternative_exists = void 0; +var CommonUtil_1 = __webpack_require__(7139); +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var VisUtil_1 = __webpack_require__(3946); +exports.draggable_alternative_exists = { + id: "draggable_alternative_exists", + context: "dom:*[draggable]", + dependencies: [], + help: { + "en-US": { + "group": "draggable_alternative_exists.html", + // "pass_alternative": "draggable_alternative_exists.html", + "pass_undraggable": "draggable_alternative_exists.html", + "potential_alternative": "draggable_alternative_exists.html" + } + }, + messages: { + "en-US": { + "group": "A draggable element must have a \"single pointer\" alternative", + // "pass_alternative": "The draggable element \"{0}\" has a \"single pointer\" alternative", + "pass_undraggable": "The element \"{0}\" is not draggable", + "potential_alternative": "Ensure the draggable element \"{0}\" has a \"single pointer\" alternative" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_2"], + num: ["2.5.7"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLocaleLowerCase(); + //ignore certain elements + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["pre", "code", "script", "meta"]) !== null + || nodeName === "body" || nodeName === "html") + return null; + if (ruleContext.getAttribute("draggable") === 'true') + return (0, IRule_1.RulePotential)("potential_alternative", [nodeName]); + else if (ruleContext.getAttribute("draggable") === 'false') + return (0, IRule_1.RulePass)("pass_undraggable", [nodeName]); + else + return null; + } +}; + + +/***/ }, + +/***/ 8135 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_accesskey_labelled = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +var VisUtil_1 = __webpack_require__(3946); +var ARIADefinitions_1 = __webpack_require__(9910); +var AccNameUtil_1 = __webpack_require__(1950); +exports.element_accesskey_labelled = { + id: "element_accesskey_labelled", + context: "dom:*[accesskey]", + refactor: { + "HAAC_Accesskey_NeedLabel": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "element_accesskey_labelled.html", + "Potential_1": "element_accesskey_labelled.html", + "group": "element_accesskey_labelled.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "The element with an assigned 'accesskey' attribute does not have an associated label", + "group": "An element with an assigned 'accesskey' attribute must have an associated label" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.3.2"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip if the element is tabbable, it's covered by other rules + if (CommonUtil_1.CommonUtil.isTabbable(ruleContext)) + return; + var roles = AriaUtil_1.AriaUtil.getRoles(ruleContext, true); + //skip the native element, mostly text elements + if (!roles || roles.length === 0) + return; + var patterns = ARIADefinitions_1.ARIADefinitions.designPatterns[roles[0]]; + if (!patterns || !patterns.nameFrom) + return; + // ignore if accessble name is required (checked in other rules) or prohibited (text element) + if (patterns.nameRequired || !patterns.nameFrom || patterns.nameFrom.includes("prohibited")) + return; + //special case: legend, as a child of a fieldset, delegate the accesskey command to the field of the fieldset which is covered by other rules + if (ruleContext.parentElement && ruleContext.parentElement.nodeName.toLowerCase() === 'fieldset') + return; + // check if accessible name exists + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + if (pair && pair.name && pair.name.trim().length > 0) + //if (ARIAMapper.computeName(ruleContext).trim().length > 0) + return (0, IRule_1.RulePass)("Pass_0"); + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ 507 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_accesskey_unique = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CacheUtil_1 = __webpack_require__(4566); +exports.element_accesskey_unique = { + id: "element_accesskey_unique", + context: "dom:*[accesskey]", + refactor: { + "WCAG20_Elem_UniqueAccessKey": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "element_accesskey_unique.html", + "Fail_1": "element_accesskey_unique.html", + "group": "element_accesskey_unique.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "'accesskey' attribute value on the element is not unique", + "group": "'accesskey' attribute values on each element must be unique for the page" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["HTML"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var map = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "element_accesskey_unique", {}); + var key = ruleContext.getAttribute("accesskey"); + var passed = !(key in map); + map[key] = true; + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ 3566 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_attribute_deprecated = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var DEPRECATED_ELEMENTS = [ + /** original */ + "applet", "basefont", "center", "dir", "font", "isindex", "listing", + "plaintext", "spacer", "s", "strike", "u", "xmp", + /** added from https://dev.w3.org/html5/pf-summary/obsolete.html */ + "acronym", "frame", "frameset", "noframes", "noembed", "big", "blink", "marquee", "tt", +]; +var DEPRECATED_HTML_GLOBAL_ATTRIBUTES = [ + /** original */ + "align", "link", "archive", "background", "bgcolor", "clear", "code", "color", + "compact", "face", "hspace", "language", "link", "noshade", "nowrap", "object", + "prompt", "start", "text", "version", "vlink", "vspace" +]; +var DEPRECATED_ELEMENT_ATTRIBUTES = { + /** original */ + "td": ["height", "width", "abbr", "axis", "char", "charoff", "height", "nowrap", "valign", "width", "align", "bgcolor"], + "th": ["height", "width", "abbr", "axis", "charoff", "height", "bgcolor", "align", "nowrap", "char", "valign", "width"], + "li": ["type", "value", "type"], + "ul": ["type", "compact"], + "pre": ["width"], + /** added from https://dev.w3.org/html5/pf-summary/obsolete.html */ + "meta": ["http-equiv"], + "a": ["charset", "coords", "shape", "rev", "scheme"], + "link": ["rev", "charset", "target"], + "img": ["name", "longdesc", "align", "hspace", "vspace", "border"], + "area": ["nohref"], + "head": ["profile"], + "html": ["version"], + "iframe": ["longdesc", "align", "frameborder", "marginheight", "marginwidth", "scrolling"], + "object": ["archive", "code", "codebase", "codetype", "declare", "standby", "align", "hspace", "vspace", "border"], + "param": ["type", "valuetype"], + "script": ["language"], + "body": ["alink", "background", "bgcolor", "link", "text", "vlink"], + "br": ["clear"], + "caption": ["align"], + "col": ["align", "char", "charoff", "valign", "width"], + "div": ["align"], + "dl": ["compact"], + "hr": ["align", "noshade", "size", "width", "align"], + "h2": ["align"], + "h3": ["align"], + "h4": ["align"], + "h5": ["align"], + "h6": ["align"], + "input": ["align", "usemap"], + "legend": ["align"], + "menu": ["compact"], + "ol": ["compact", "type", "type"], + "p": ["align"], + "table": ["bgcolor", "cellpadding", "cellspacing", "frame", "rules", "width", "align"], + "tbody": ["align", "char", "valign", "charoff"], + "tfoot": ["align", "charoff", "char", "valign"], + "thead": ["char", "charoff", "valign", "align"], + "tr": ["align", "bgcolor", "char", "charoff", "valign"] +}; +function arrayToContextStr(obj, type) { + var str = ""; + for (var _i = 0, obj_1 = obj; _i < obj_1.length; _i++) { + var prop = obj_1[_i]; + if (str !== '' && !str.endsWith(', ')) + str += ", "; + if (type === 'HTML_ELEMENTS') + str += 'dom:' + prop; + else if (type === 'HTML_ATTRIBUTES') + str += 'dom:*[' + prop + "]"; + } + return str; +} +function objToContextStr(obj, type) { + var str = ""; + for (var prop in obj) { + if (str !== '' && !str.endsWith(', ')) + str += ", "; + if (type === 'HTML_ELEMENT_ATTRIBUTES') { + for (var _i = 0, _a = obj[prop]; _i < _a.length; _i++) { + var item = _a[_i]; + if (str !== '' && !str.endsWith(", ")) + str += ", "; + str += 'dom:' + prop + '[' + item + ']'; + } + } + } + return str; +} +exports.element_attribute_deprecated = { + id: "element_attribute_deprecated", + context: "dom:applet, dom:basefont, dom:center, dom:dir, dom:font, dom:isindex, dom:listing, dom:menu, dom:plaintext, dom:spacer, dom:s, dom:strike, dom:u, dom:xmp, dom:acronym, dom:frame, dom:frameset, dom:noframes, dom:noembed, dom:big, dom:blink, dom:marquee, dom:ttNaNdom:*[align], dom:*[link], dom:*[archive], dom:*[background], dom:*[bgcolor], dom:*[clear], dom:*[code], dom:*[color], dom:*[compact], dom:*[face], dom:*[hspace], dom:*[language], dom:*[link], dom:*[noshade], dom:*[nowrap], dom:*[object], dom:*[prompt], dom:*[start], dom:*[text], dom:*[version], dom:*[vlink], dom:*[vspace]NaNdom:td[height], dom:td[width], dom:td[abbr], dom:td[axis], dom:td[char], dom:td[charoff], dom:td[height], dom:td[nowrap], dom:td[valign], dom:td[width], dom:td[align], dom:td[bgcolor], dom:th[height], dom:th[width], dom:th[abbr], dom:th[axis], dom:th[charoff], dom:th[height], dom:th[bgcolor], dom:th[align], dom:th[nowrap], dom:th[char], dom:th[valign], dom:th[width], dom:li[type], dom:li[value], dom:li[type], dom:ul[type], dom:ul[compact], dom:pre[width], dom:meta[http-equiv], dom:a[charset], dom:a[coords], dom:a[shape], dom:a[rev], dom:a[scheme], dom:link[rev], dom:link[charset], dom:link[target], dom:img[name], dom:img[longdesc], dom:img[align], dom:img[hspace], dom:img[vspace], dom:img[border], dom:area[nohref], dom:head[profile], dom:html[version], dom:iframe[longdesc], dom:iframe[align], dom:iframe[frameborder], dom:iframe[marginheight], dom:iframe[marginwidth], dom:iframe[scrolling], dom:object[archive], dom:object[code], dom:object[codebase], dom:object[codetype], dom:object[declare], dom:object[standby], dom:object[align], dom:object[hspace], dom:object[vspace], dom:object[border], dom:param[type], dom:param[valuetype], dom:script[language], dom:body[alink], dom:body[background], dom:body[bgcolor], dom:body[link], dom:body[text], dom:body[vlink], dom:br[clear], dom:caption[align], dom:col[align], dom:col[char], dom:col[charoff], dom:col[valign], dom:col[width], dom:div[align], dom:dl[compact], dom:hr[align], dom:hr[noshade], dom:hr[size], dom:hr[width], dom:hr[align], dom:h2[align], dom:h3[align], dom:h4[align], dom:h5[align], dom:h6[align], dom:input[align], dom:input[usemap], dom:legend[align], dom:menu[compact], dom:ol[compact], dom:ol[type], dom:ol[type], dom:p[align], dom:table[bgcolor], dom:table[cellpadding], dom:table[cellspacing], dom:table[frame], dom:table[rules], dom:table[width], dom:table[align], dom:tbody[align], dom:tbody[char], dom:tbody[valign], dom:tbody[charoff], dom:tfoot[align], dom:tfoot[charoff], dom:tfoot[char], dom:tfoot[valign], dom:thead[char], dom:thead[charoff], dom:thead[valign], dom:thead[align], dom:tr[align], dom:tr[bgcolor], dom:tr[char], dom:tr[charoff], dom:tr[valign]", + help: { + "en-US": { + "pass": "element_attribute_deprecated.html", + "fail_elem": "element_attribute_deprecated.html", + "fail_attr": "element_attribute_deprecated.html", + "fail_elem_attr": "element_attribute_deprecated.html", + "group": "element_attribute_deprecated.html" + } + }, + messages: { + "en-US": { + "pass": "Rule Passed", + "fail_elem": "The <{0}> element is deprecated in HTML 5", + "fail_attr": "The HTML attribute(s) \"{0}\" is deprecated in HTML 5", + "fail_elem_attr": "The HTML attribute(s) \"{0}\" is deprecated for the <{1}> element in HTML 5", + "group": "Avoid use of obsolete features if possible" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["HTML"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // HTMLUnit auto adds a tbody[align=left] to tables if tbody is missing! + if (ruleContext.nodeName.toLowerCase() === "tbody" && ruleContext.hasAttribute("align")) { + return (0, IRule_1.RulePass)("pass"); + } + if (ruleContext.nodeName.includes("-")) { + // This is a webcomponent element, HTML doesn't define what's deprecated + return null; + } + var nodeName = ruleContext.nodeName.toLowerCase(); + var ret = []; + // check if it's a deprecated element + if (DEPRECATED_ELEMENTS.includes(nodeName)) { + return (0, IRule_1.RuleFail)("fail_elem", [nodeName]); + } + // check if it's a deprecated HTML global attribute + var attrs = ruleContext.getAttributeNames(); + var violations = ''; + for (var _i = 0, attrs_1 = attrs; _i < attrs_1.length; _i++) { + var attr = attrs_1[_i]; + if (DEPRECATED_HTML_GLOBAL_ATTRIBUTES.includes(attr)) { + if (violations !== '') + violations += ', '; + violations += attr; + } + } + if (violations !== '') { + return (0, IRule_1.RuleFail)("fail_attr", [violations]); + } + // check if it's a deprecated HTML element & attribute + violations = ''; + if (nodeName in DEPRECATED_ELEMENT_ATTRIBUTES) { + for (var _a = 0, attrs_2 = attrs; _a < attrs_2.length; _a++) { + var attr = attrs_2[_a]; + if (DEPRECATED_ELEMENT_ATTRIBUTES[nodeName] && DEPRECATED_ELEMENT_ATTRIBUTES[nodeName].includes(attr)) { + if (violations !== '') + violations += ', '; + violations += attr; + } + } + if (violations !== '') { + return (0, IRule_1.RuleFail)("fail_elem_attr", [violations, nodeName]); + } + } + return (0, IRule_1.RulePass)("pass"); + } +}; + + +/***/ }, + +/***/ 5173 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_id_unique = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var fragment_1 = __webpack_require__(5279); +exports.element_id_unique = { + id: "element_id_unique", + context: "dom:*[id]", + refactor: { + "RPT_Elem_UniqueId": { + "Pass_0": "pass", + "Fail_1": "potential_empty", + "Fail_2": "potential_in_use" + } + }, + help: { + "en-US": { + "group": "element_id_unique.html", + "pass": "element_id_unique.html", + "potential_empty": "element_id_unique.html", + "potential_in_use": "element_id_unique.html" + } + }, + messages: { + "en-US": { + "group": "Element 'id' attribute values must be unique within a document", + "pass": "Rule Passed", + "potential_empty": "The <{0}> element has the id \"{1}\" that is empty", + "potential_in_use": "The <{0}> element has the id \"{1}\" that is already in use" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["HTML"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [{ + "3ea0c8": { + "pass": "pass", + "potential_empty": "pass", + "potential_in_use": "fail" + } + }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var id = ruleContext.getAttribute("id"); + // In the case that id is empty we should trigger a violation right away with out checking + // for uniqueness. + if (id === "") { + //return new ValidationResult(false, [ruleContext], '', '', [ruleContext.nodeName.toLowerCase(), id]); + return (0, IRule_1.RulePotential)("potential_empty", [ruleContext.nodeName.toLowerCase(), id]); + } + var element = fragment_1.FragmentUtil.getById(ruleContext, id); + var passed = element === ruleContext; + //return new ValidationResult(passed, [ruleContext], '', '', passed == true ? [] : [ruleContext.nodeName.toLowerCase(), id]); + if (!passed) { + return (0, IRule_1.RulePotential)("potential_in_use", [ruleContext.nodeName.toLowerCase(), id]); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ 6027 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_lang_valid = exports.html_lang_valid = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var lang_1 = __webpack_require__(1043); +var VisUtil_1 = __webpack_require__(3946); +var DOMWalker_1 = __webpack_require__(3864); +var AccNameUtil_1 = __webpack_require__(1950); +var validateLang = function (context) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (ruleContext.hasAttribute("lang")) { + if (nodeName !== "html" && ruleContext.getAttribute("lang") === "") { + // It's okay to have a lang="" if not on html + } + else { + var langStr = ruleContext.getAttribute("lang"); + if (!lang_1.LangUtil.validPrimaryLang(langStr)) { + return 1; + } + if (!lang_1.LangUtil.isBcp47(langStr)) { + return 2; + } + } + } + if (ruleContext.hasAttribute("xml:lang")) { + if (nodeName !== "html" && ruleContext.getAttribute("xml:lang") === "") { + // It's okay to have a lang="" if not on html + } + else { + var langStr = ruleContext.getAttribute("xml:lang"); + if (!lang_1.LangUtil.validPrimaryLang(langStr)) { + return 3; + } + if (!lang_1.LangUtil.isBcp47(langStr)) { + return 4; + } + } + } + return 0; +}; +exports.html_lang_valid = { + id: "html_lang_valid", + context: "dom:html[lang], dom:html[xml:lang]", + help: { + "en-US": { + "Pass_0": "html_lang_valid.html", + "Fail_1": "html_lang_valid.html", + "Fail_2": "html_lang_valid.html", + "Fail_3": "html_lang_valid.html", + "Fail_4": "html_lang_valid.html", + "group": "html_lang_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Lang has a valid primary lang and conforms to BCP 47", + "Fail_1": "Specified 'lang' attribute does not include a valid primary language", + "Fail_2": "Specified 'lang' attribute does not conform to BCP 47", + "Fail_3": "Specified 'xml:lang' attribute does not include a valid primary language", + "Fail_4": "Specified 'xml:lang' attribute does not conform to BCP 47", + "group": "The default human language of the page must be valid and specified in accordance with BCP 47" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [{ + "b5c3f8": { + "Pass_0": "pass", + "Fail_1": "fail", + "Fail_2": "inapplicable", + "Fail_3": "inapplicable", + "Fail_4": "inapplicable" + }, + "bf051a": { + "Pass_0": "pass", + "Fail_1": "fail", + "Fail_2": "pass", + "Fail_3": "fail", + "Fail_4": "inapplicable" + }, + // TODO: ACT: Mismatch because they don't check the html element in the same rule + // "de46e4": { + // "Pass_0": "pass", + // "Fail_1": "fail", + // "Fail_2": "pass", + // "Fail_3": "inapplicable", + // "Fail_4": "inapplicable" + // } + }], + run: function (context, options, contextHierarchies) { + var reasonCode = validateLang(context); + // This is done here instead of in validateLang so that the genHelp code will pick it up + var retArr = [ + (0, IRule_1.RulePass)("Pass_0"), + (0, IRule_1.RuleFail)("Fail_1"), + (0, IRule_1.RuleFail)("Fail_2"), + (0, IRule_1.RuleFail)("Fail_3"), + (0, IRule_1.RuleFail)("Fail_4") + ]; + return retArr[reasonCode]; + } +}; +exports.element_lang_valid = { + id: "element_lang_valid", + context: "dom:*[lang], dom:*[xml:lang]", + help: { + "en-US": { + "Pass_0": "element_lang_valid.html", + "Fail_1": "element_lang_valid.html", + "Fail_2": "element_lang_valid.html", + "Fail_3": "element_lang_valid.html", + "Fail_4": "element_lang_valid.html", + "group": "element_lang_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Lang has a valid primary lang and conforms to BCP 47", + "Fail_1": "Specified 'lang' attribute does not include a valid primary language", + "Fail_2": "Specified 'lang' attribute does not conform to BCP 47", + "Fail_3": "Specified 'xml:lang' attribute does not include a valid primary language", + "Fail_4": "Specified 'xml:lang' attribute does not conform to BCP 47", + "group": "The change in language of specific content must be valid and specified in accordance with BCP 47" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [{ + // "b5c3f8": { + // "Pass_0": "pass", + // "Fail_1": "fail", + // "Fail_2": "inapplicable", + // "Fail_3": "inapplicable", + // "Fail_4": "inapplicable" + // }, + // "bf051a": { + // "Pass_0": "pass", + // "Fail_1": "fail", + // "Fail_2": "pass", + // "Fail_3": "fail", + // "Fail_4": "inapplicable" + // }, + // TODO: ACT: Mismatch because they don't check the html element in the same rule + "de46e4": { + "Pass_0": "pass", + "Fail_1": "fail", + "Fail_2": "pass", + "Fail_3": "inapplicable", + "Fail_4": "inapplicable" + } + }], + run: function (context, options, contextHierarchies) { + // If it's the HTML node, that's handled by html_lang_valid + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (nodeName === "html") + return null; + var reasonCode = validateLang(context); + // This is done here instead of in validateLang so that the genHelp code will pick it up + var retArr = [ + (0, IRule_1.RulePass)("Pass_0"), + (0, IRule_1.RuleFail)("Fail_1"), + (0, IRule_1.RuleFail)("Fail_2"), + (0, IRule_1.RuleFail)("Fail_3"), + (0, IRule_1.RuleFail)("Fail_4") + ]; + var retVal = retArr[reasonCode]; + if (retVal.value[1] !== IRule_1.eRuleConfidence.PASS) { + // Ensure that there's actually content of this element - skip subtrees that have other lang attributes + var hasContent = false; + if (ruleContext.firstChild !== null) { + var nw = new DOMWalker_1.DOMWalker(ruleContext, false, ruleContext, true); + while (!hasContent && nw.nextNode()) { + // Skip hidden + if (nw.node.nodeType === 1) { + var element = nw.node; + if (!VisUtil_1.VisUtil.isNodeVisible(element) || element.hasAttribute("lang")) { + nw.bEndTag = true; + } + else { + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(element); + hasContent = hasContent + || element.nodeName.toLowerCase() === "img" && (pair && pair.name && pair.name.trim().length > 0) /**ARIAMapper.computeName(element).trim().length > 0*/; + } + } + else { + hasContent = hasContent + || nw.node.nodeType === 3 && nw.node.nodeValue.trim().length > 0; + } + } + } + if (!hasContent) + return null; + } + return retVal; + } +}; + + +/***/ }, + +/***/ 7515 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_mouseevent_keyboard = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +exports.element_mouseevent_keyboard = { + id: "element_mouseevent_keyboard", + context: "dom:*[ondblclick], dom:*[onmousemove], dom:*[onmousedown], dom:*[onmouseup], dom:*[onmouseover], dom:*[onmouseout], dom:*[onclick]", + refactor: { + "RPT_Elem_EventMouseAndKey": { + "Pass_0": "Pass_0", + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Pass_0": "element_mouseevent_keyboard.html", + "Manual_1": "element_mouseevent_keyboard.html", + "group": "element_mouseevent_keyboard.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Manual_1": "Confirm the <{0}> element with mouse event handler(s) '{1}' has a corresponding keyboard handler(s)", + "group": "All interactive content with mouse event handlers must have equivalent keyboard access" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + var passed = ruleContext.hasAttribute("href") || + (!ruleContext.hasAttribute("ondblclick") && + !ruleContext.hasAttribute("onmousemove") && + (!ruleContext.hasAttribute("onmousedown") || ruleContext.hasAttribute("onkeydown")) && + (!ruleContext.hasAttribute("onmouseup") || ruleContext.hasAttribute("onkeyup")) && + (!ruleContext.hasAttribute("onmouseover") || ruleContext.hasAttribute("onfocus")) && + (!ruleContext.hasAttribute("onmouseout") || ruleContext.hasAttribute("onblur")) && + (!ruleContext.hasAttribute("onclick") || ruleContext.hasAttribute("onkeypress") || + nodeName == "a" || nodeName == "button")); + var failedMouseEvents = new Array(); + if (!passed) { + //store and display event name and node name in the tokens + if (ruleContext.hasAttribute("ondblclick")) { + failedMouseEvents.push("ondblclick"); + } + if (ruleContext.hasAttribute("onmousemove")) { + failedMouseEvents.push("onmousemove"); + } + if (ruleContext.hasAttribute("onmousedown") && !ruleContext.hasAttribute("onkeydown")) { + failedMouseEvents.push("onmousedown"); + } + if (ruleContext.hasAttribute("onmouseup") && !ruleContext.hasAttribute("onkeyup")) { + failedMouseEvents.push("onmouseup"); + } + if (ruleContext.hasAttribute("onmouseover") && !ruleContext.hasAttribute("onfocus")) { + failedMouseEvents.push("onmouseover"); + } + if (ruleContext.hasAttribute("onmouseout") && !ruleContext.hasAttribute("onblur")) { + failedMouseEvents.push("onmouseout"); + } + if (ruleContext.hasAttribute("onclick") && !ruleContext.hasAttribute("onkeypress")) { + if (!(nodeName == "a" || nodeName == "button")) + failedMouseEvents.push("onclick"); + } + } + return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RuleManual)("Manual_1", [nodeName, failedMouseEvents.join(", ")]); + } +}; + + +/***/ }, + +/***/ 1704 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_orientation_unlocked = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CSSUtil_1 = __webpack_require__(4919); +var VisUtil_1 = __webpack_require__(3946); +var CacheUtil_1 = __webpack_require__(4566); +var fragment_1 = __webpack_require__(5279); +var CommonUtil_1 = __webpack_require__(7139); +exports.element_orientation_unlocked = { + id: "element_orientation_unlocked", + context: "dom:*", + help: { + "en-US": { + "pass": "element_orientation_unlocked.html", + "fail_locked": "element_orientation_unlocked.html", + "group": "element_orientation_unlocked.html" + } + }, + messages: { + "en-US": { + "pass": "The element is not restricted to either landscape or portrait orientation using CSS transform property", + "fail_locked": "The element <{0}> is restricted to either landscape or portrait orientation using CSS transform property", + "group": "Elements should not be restricted to either landscape or portrait orientation using CSS transform property" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.4"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: ['b33eff'], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip invisible element + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext)) + return null; + //skip elements + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["script", "meta", "title"])) + return null; + var nodeName = ruleContext.nodeName.toLowerCase(); + // cache the orientation result for all the elements in the page + var doc = fragment_1.FragmentUtil.getOwnerFragment(ruleContext); + var orientationTransforms = CacheUtil_1.CacheUtil.getCache(doc, "RPTUtil_MEDIA_ORIENTATION_TRANSFROM", null); + if (!orientationTransforms) { + orientationTransforms = CSSUtil_1.CSSUtil.getMediaOrientationTransform(doc); + CacheUtil_1.CacheUtil.setCache(doc, "RPTUtil_MEDIA_ORIENTATION_TRANSFROM", orientationTransforms); + } + // find if the element matches orientation selector(s) + var media_transforms = []; + Object.keys(orientationTransforms).forEach(function (key) { + Object.keys(orientationTransforms[key]).forEach(function (tag) { + if (Object.keys(orientationTransforms[key][tag]).length > 0 && CSSUtil_1.CSSUtil.selectorMatchesElem(ruleContext, tag)) { + if (orientationTransforms[key][tag].transform) + media_transforms.push(orientationTransforms[key][tag].transform); + else + media_transforms.push(orientationTransforms[key][tag]); + } + }); + }); + // no match, the element is not in media orientation transform + if (media_transforms.length === 0) + return null; + var ret = []; + var _loop_1 = function (i) { + var media_transform = media_transforms[i]; + if (typeof media_transform === 'object') + for (var key in media_transform) + media_transform = key + "(" + media_transform[key] + ")"; + var containsRotation = false; + ['rotate', 'rotate3d', 'rotateZ', 'matrix', 'matrix3d'].forEach(function (rotation) { + if (media_transform.includes(rotation)) + containsRotation = true; + }); + // no rotation transform, skip + if (!containsRotation) + return "continue"; + var degree = CSSUtil_1.CSSUtil.getRotationDegree(media_transform); + // no or 360n degree rotation + if (degree === 0) { + ret.push((0, IRule_1.RulePass)("pass")); + return "continue"; + } + /** + * calculate the original page rotation transformation, example + * html { transform: rotate(2.5deg); } + */ + var definedStyle = CSSUtil_1.CSSUtil.getDefinedStyles(ruleContext, ["transform"]); + /** + * compensate the media orientation with the page orientation + */ + if (definedStyle['transform']) { + var page_degree = CSSUtil_1.CSSUtil.getRotationDegree(definedStyle['transform']); + // rotate is additive + degree += page_degree; + } + // When degree is 1 turn (360 degree), it is not considered an orientation lock + // allow 1 degree floating range for the right angle + if (Math.abs(degree - 360) % 360 > 1) + ret.push((0, IRule_1.RuleFail)("fail_locked", [nodeName])); + else + ret.push((0, IRule_1.RulePass)("pass")); + }; + for (var i = 0; i < media_transforms.length; i++) { + _loop_1(i); + } + if (ret.length > 0) + return ret; + return null; + } +}; + + +/***/ }, + +/***/ 5053 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_scrollable_tabbable = void 0; +var CommonUtil_1 = __webpack_require__(7139); +var IRule_1 = __webpack_require__(461); +var VisUtil_1 = __webpack_require__(3946); +var AriaUtil_1 = __webpack_require__(7011); +exports.element_scrollable_tabbable = { + id: "element_scrollable_tabbable", + context: "dom:*", + dependencies: [], + help: { + "en-US": { + "group": "element_scrollable_tabbable.html", + "pass_tabbable": "element_scrollable_tabbable.html", + "pass_interactive": "element_scrollable_tabbable.html", + "fail_scrollable": "element_scrollable_tabbable.html" + } + }, + messages: { + "en-US": { + "group": "Scrollable elements should be tabbable or contain tabbable content", + "pass_tabbable": "The scrollable element is tabbable", + "pass_interactive": "The scrollable element has tabbable content", + "fail_scrollable": "The scrollable element <{0}> with non-interactive content is not tabbable" + } + }, + /** + * deprecated on 6/10/2025 due to Browser support for auto-focus of a scrollable element + * rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + num: ["2.1.1"], + level: eRulePolicy.VIOLATION, + toolkitLevel: eToolkitLevel.LEVEL_ONE + }],*/ + rulesets: [], + act: ["0ssw9k"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip elements + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["iframe", "svg", "script", "meta", "style"])) + return null; + //skip if no visible content + if (!CommonUtil_1.CommonUtil.hasInnerContent(ruleContext)) + return null; + // ignore if the element's navigation is controlled or owned by another element + if (AriaUtil_1.AriaUtil.isNavigationOwnedOrControlled(ruleContext)) + return null; + // ignore if the element is not scrollable or content withouting needing a scroll + if (!VisUtil_1.VisUtil.isElementScrollable(ruleContext)) + return null; + // pass if element is tabbable + if (CommonUtil_1.CommonUtil.isTabbable(ruleContext)) + return (0, IRule_1.RulePass)("pass_tabbable"); + // check if element content is tabbable + var count = CommonUtil_1.CommonUtil.getTabbableChildren(ruleContext); + if (count > 0) + return (0, IRule_1.RulePass)("pass_interactive"); + // ignore in Firefox if no tabindex at all (not tested in embedded or any simulator) + if (!ruleContext.hasAttribute("tabindex") && navigator.userAgent.indexOf("Firefox") > -1) + return null; + return (0, IRule_1.RuleFail)("fail_scrollable", [ruleContext.nodeName.toLowerCase()]); + } +}; + + +/***/ }, + +/***/ 4681 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_tabbable_role_valid = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +var ARIADefinitions_1 = __webpack_require__(9910); +var DOMWalker_1 = __webpack_require__(3864); +var VisUtil_1 = __webpack_require__(3946); +exports.element_tabbable_role_valid = { + id: "element_tabbable_role_valid", + context: "dom:*", + help: { + "en-US": { + "pass": "element_tabbable_role_valid.html", + "fail_invalid_role": "element_tabbable_role_valid.html", + "fail_no_valid_role": "element_tabbable_role_valid.html", + "group": "element_tabbable_role_valid.html" + } + }, + messages: { + "en-US": { + "pass": "The tabbable element has a widget role", + "fail_invalid_role": "The tabbable element's role '{0}' is not a widget role", + "fail_no_valid_role": "The tabbable element does not have a valid widget role", + "group": "A tabbable element must have a valid widget role" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }, + { + "id": ["WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext) || VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLowerCase(); + // if the element is tabbable by default with or without tabindex, let the other rules (such as widget_tabbable_single) to handle it + if (nodeName in CommonUtil_1.CommonUtil.tabTagMap) { + var value = CommonUtil_1.CommonUtil.tabTagMap[nodeName]; + if (typeof (value) === "function") { + value = value(ruleContext); + } + if (value) + return null; + } + // handle the case: no tabindex or tabindex < 0 + if (!ruleContext.hasAttribute("tabindex") || parseInt(ruleContext.getAttribute("tabindex")) < 0) + return null; + // ignore if the element's navigation is controlled by another element, such as combobox + if (AriaUtil_1.AriaUtil.isNavigationOwnedOrControlled(ruleContext)) + return null; + // ignore if the element is scrollable + if (VisUtil_1.VisUtil.isElementScrollable(ruleContext)) + return null; + // elements whose roles allow no descendants that are interactive or with a tabindex >= 0 + // this case should be handled in widget_tabbable_single and aria_child_tabbable + var roles_no_interactive_child = ["button", "checkbox", "img", "link", "menuitem", "menuitemcheckbox", "menuitemradio", + "option", "radio", "switch", "tab"]; + var parent = DOMWalker_1.DOMWalker.parentNode(ruleContext); + var parent_role = AriaUtil_1.AriaUtil.getResolvedRole(parent); + // ignore if the parent role is in roles_no_interactive_child + if (roles_no_interactive_child.includes(parent_role)) + return null; + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + if (!role) + return (0, IRule_1.RuleFail)("fail_no_valid_role"); + // ignore 'application' role that contains one or more focusable elements that do not follow a standard interaction pattern supported by a widget role:https://www.w3.org/TR/2023/PR-WAI-ARIA-1.2-20230328/#application + if (role === "application") + return null; + // handle the case: tabindex >= 0 to examine whether a widget role is setup or not + // pass if one of the roles is a widget type + // Row is weird. It's structure, but can also be widget + // Focusable separators are widgets + if (role === "row" || role === "separator" || ARIADefinitions_1.ARIADefinitions.designPatterns[role].roleType === 'widget') { + return (0, IRule_1.RulePass)("pass"); + } + return (0, IRule_1.RuleFail)("fail_invalid_role", [role]); + } +}; + + +/***/ }, + +/***/ 8050 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_tabbable_unobscured = void 0; +var CommonUtil_1 = __webpack_require__(7139); +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var VisUtil_1 = __webpack_require__(3946); +var DOMMapper_1 = __webpack_require__(7507); +var ColorUtil_1 = __webpack_require__(3883); +exports.element_tabbable_unobscured = { + id: "element_tabbable_unobscured", + context: "dom:*", + dependencies: [], + help: { + "en-US": { + "group": "element_tabbable_unobscured.html", + "pass": "element_tabbable_unobscured.html", + "potential_obscured": "element_tabbable_unobscured.html" + } + }, + messages: { + "en-US": { + "group": "When an element receives focus, it is not entirely covered by other content", + "pass": "The element is not entirely covered by other content", + "potential_obscured": "Confirm that when the element receives focus, it is not covered or, if covered by user action, can be uncovered without moving focus" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_2"], + num: ["2.4.11"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Early exit: check visibility and tabbability first + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || !CommonUtil_1.CommonUtil.isTabbable(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLocaleLowerCase(); + // Early exit: ignore certain elements + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["pre", "code", "script", "meta"]) !== null + || nodeName === "body" || nodeName === "html") + return null; + var doc = ruleContext.ownerDocument; + if (!doc) + return null; + var win = doc.defaultView; + if (!win) + return null; + // Reuse single DOMMapper instance + var mapper = new DOMMapper_1.DOMMapper(); + var bounds = mapper.getUnadjustedBounds(ruleContext); + // Early exit: bounds not available or element has no dimensions + if (!bounds || bounds.height === 0 || bounds.width === 0) + return null; + var cStyle = win.getComputedStyle(ruleContext); + if (!cStyle) + return null; + // Parse z-index once and cache + var zindex = parseInt(cStyle.zIndex === 'auto' || !cStyle.zIndex ? '0' : cStyle.zIndex); + // More specific selector to reduce iteration + var elems = doc.querySelectorAll('body *:not(script):not(style):not(meta):not(link)'); + if (!elems || elems.length === 0) + return null; + var before = true; + var boundsRight = bounds.left + bounds.width; + var boundsBottom = bounds.top + bounds.height; + // Check for obscuring elements + for (var i = 0; i < elems.length; i++) { + var elem = elems[i]; + /** + * The nodes returned from querySelectorAll are in document order. + * If two elements overlap and z-index are not defined, then the node + * rendered earlier will be overlaid by the node rendered later. + */ + // Use compareDocumentPosition to check containment relationships + // Note: compareDocumentPosition returns 0 when comparing a node to itself + var position = ruleContext.compareDocumentPosition(elem); + // DOCUMENT_POSITION_CONTAINED_BY (16): elem is contained by ruleContext + // Also handle self-comparison (position === 0) + if (position === 0 || (position & Node.DOCUMENT_POSITION_CONTAINED_BY)) { + // The next node in elems will be after the target node (ruleContext) + before = false; + continue; + } + // DOCUMENT_POSITION_CONTAINS (8): elem contains ruleContext + // Skip if element contains ruleContext or is not visible + if ((position & Node.DOCUMENT_POSITION_CONTAINS) || !VisUtil_1.VisUtil.isNodeVisible(elem)) + continue; + var bnds = mapper.getUnadjustedBounds(elem); + // Skip if no bounds or zero dimensions + if (!bnds || bnds.height === 0 || bnds.width === 0) + continue; + // Quick bounds check: does elem completely cover ruleContext? + if (bnds.top > bounds.top || bnds.left > bounds.left) + continue; + var bndsRight = bnds.left + bnds.width; + var bndsBottom = bnds.top + bnds.height; + if (bndsRight < boundsRight || bndsBottom < boundsBottom) + continue; + // Check z-index to determine if elem obscures ruleContext + var zStyle = win.getComputedStyle(elem); + if (!zStyle) + continue; + var elemZindex = parseInt(zStyle.zIndex === 'auto' || !zStyle.zIndex || isNaN(Number(zStyle.zIndex)) ? '0' : zStyle.zIndex); + // If before ruleContext in DOM order, elem must have higher z-index to obscure + // If after ruleContext in DOM order, elem can obscure with equal or higher z-index + if ((before && elemZindex > zindex) || (!before && elemZindex >= zindex)) { + // Check if element has opaque background + var hasOpaqueBackground = false; + if (zStyle.background && zStyle.background !== 'none') { + var bgColor = ColorUtil_1.ColorUtil.Color(zStyle.background); + hasOpaqueBackground = bgColor && (bgColor.alpha === undefined || bgColor.alpha > 0); + } + if (!hasOpaqueBackground && zStyle.backgroundColor) { + var bgColor = ColorUtil_1.ColorUtil.Color(zStyle.backgroundColor); + hasOpaqueBackground = bgColor && (bgColor.alpha === undefined || bgColor.alpha > 0); + } + // If element has no content and no opaque background, skip it + if (!CommonUtil_1.CommonUtil.hasInnerContentHidden(elem) && !hasOpaqueBackground) { + continue; + } + return (0, IRule_1.RulePotential)("potential_obscured", []); + } + } + return (0, IRule_1.RulePass)("pass"); + } +}; + + +/***/ }, + +/***/ 2644 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_tabbable_visible = void 0; +var CommonUtil_1 = __webpack_require__(7139); +var CSSUtil_1 = __webpack_require__(4919); +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var DOMMapper_1 = __webpack_require__(7507); +exports.element_tabbable_visible = { + id: "element_tabbable_visible", + context: "dom:*", + dependencies: [], + help: { + "en-US": { + "group": "element_tabbable_visible.html", + "pass": "element_tabbable_visible.html", + "potential_visible": "element_tabbable_visible.html" + } + }, + messages: { + "en-US": { + "group": "A tabbable element should be visible on the screen when it has keyboard focus", + "pass": "The tabbable element is visible on the screen", + "potential_visible": "Confirm the element should be tabbable and if so, it becomes visible when it has keyboard focus" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + num: ["2.4.7"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (!CommonUtil_1.CommonUtil.isTabbable(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLocaleLowerCase(); + var mapper = new DOMMapper_1.DOMMapper(); + var bounds = mapper.getUnadjustedBounds(ruleContext); + //in case the bounds not available + if (!bounds) + return null; + // Get all needed styles in a single pass through stylesheets + var allStyles = CSSUtil_1.CSSUtil.getDefinedStylesMultiple(ruleContext, ["position", "clip"], ["", ":focus"]); + var defined_styles = allStyles[""]; + var onfocus_styles = allStyles[":focus"]; + if (bounds['height'] === 0 || bounds['width'] === 0) + return (0, IRule_1.RulePotential)("potential_visible", []); + if (defined_styles['position'] === 'absolute' && defined_styles['clip'] && defined_styles['clip'].replaceAll(' ', '') === 'rect(0px,0px,0px,0px)' + && !onfocus_styles['clip']) { + /** + * note that A user can select a checkbox and radio button by selecting the button or the label text. + * When a checkbox or radio button is clipped to 0 size, it is still available to a keyboard or a screen reader. + * The rule should be passed if the label text exists and the button on-focus style is defined by the user, + * which likely incurs the changes of the label style. + */ + if (nodeName === 'input' && (ruleContext.getAttribute('type') === 'checkbox' || ruleContext.getAttribute('type') === 'radio')) { + var label = CommonUtil_1.CommonUtil.getLabelForElement(ruleContext); + if (label && !CommonUtil_1.CommonUtil.isInnerTextEmpty(label)) { + // Get additional pseudo-class styles (reuse onfocus_styles from line 60) + var pseudoStyles = CSSUtil_1.CSSUtil.getDefinedStylesMultiple(ruleContext, null, [":focus-visible", ":focus-within", ":checked", ":focus"]); + var focus_visible_styles = pseudoStyles[":focus-visible"]; + var focus_within_styles = pseudoStyles[":focus-within"]; + var checked_styles = pseudoStyles[":checked"]; + var onfocus_styles_1 = pseudoStyles[":focus"]; + if (onfocus_styles_1 || focus_visible_styles || focus_within_styles || checked_styles) + return (0, IRule_1.RulePass)("pass"); + } + } + return (0, IRule_1.RulePotential)("potential_visible", []); + } + if (bounds['top'] >= 0 && bounds['left'] >= 0) + return (0, IRule_1.RulePass)("pass"); + var default_styles = getComputedStyle(ruleContext); + var top = bounds['top']; + var left = bounds['left']; + if (Object.keys(onfocus_styles).length === 0) { + // no onfocus position change, but could be changed from js + return (0, IRule_1.RulePotential)("potential_visible", []); + } + else { + // with onfocus position change + var positions = ['absolute', 'fixed']; + if (typeof onfocus_styles['top'] !== 'undefined') { + if (positions.includes(onfocus_styles['position']) || (typeof onfocus_styles['position'] === 'undefined' && positions.includes(default_styles['position']))) { + top = onfocus_styles['top'].replace(/\D/g, ''); + } + else { + // the position is undefined and the parent's position is 'relative' + top = Number.MIN_VALUE; + } + } + if (typeof onfocus_styles['left'] !== 'undefined') { + if (positions.includes(onfocus_styles['position']) || (typeof onfocus_styles['position'] === 'undefined' && positions.includes(default_styles['position']))) { + left = onfocus_styles['left'].replace(/\D/g, ''); + } + else { + // the position is undefined and the parent's position is 'relative' + left = Number.MIN_VALUE; + } + } + } + if (top >= 0 && left >= 0) + return (0, IRule_1.RulePass)("pass"); + else + return (0, IRule_1.RulePotential)("potential_visible", []); + } +}; + + +/***/ }, + +/***/ 429 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.embed_alt_exists = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +var VisUtil_1 = __webpack_require__(3946); +exports.embed_alt_exists = { + id: "embed_alt_exists", + context: "dom:embed", + refactor: { + "RPT_Embed_HasAlt": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "embed_alt_exists.html", + "Potential_1": "embed_alt_exists.html", + "group": "embed_alt_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that the <embed> element has alternative content", + "group": "Provide alternative content for <embed> elements" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_FOUR + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "alt"); + return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ 4617 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.emoticons_alt_exists = void 0; +var IRule_1 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +exports.emoticons_alt_exists = { + id: "emoticons_alt_exists", + context: "dom:*", + refactor: { + "WCAG20_Text_Emoticons": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "emoticons_alt_exists.html", + "Potential_1": "emoticons_alt_exists.html", + "group": "emoticons_alt_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that emoticons have a text alternative", + "group": "Emoticons must have a short text alternative that describes their purpose" + } + }, + /** + * Decision in planning 9/7/23 that this rule causes more reviews that we see actual problems in content, so turn these rules off + + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": eRulePolicy.VIOLATION, + "toolkitLevel": eToolkitLevel.LEVEL_TWO + }], + */ + rulesets: [], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + emoticons: { + value: [":-)", ":)", ":o)", ":]", ":3", ":c)", ":>", "=]", "8)", "=)", ":D", "C:", + ":-D", ":D", "8D", "XD", "=D", "=3", "<=3", "<=8", "--!--", ":-(", ":(", ":c", ":<", ":[", + "D:", "D8", "D;", "D=", "DX", "v.v", ":-9", ";-)", ";)", "*)", ";]", ";D", ":-P", ":P", + ":-p", ":p", "=p", ":-Þ", ":Þ", ":-b", ":b", ":-O", ":O", "O_O", "o_o", "8O", "OwO", "O-O", + "0_o", "O_o", "O3O", "o0o ;o_o;", "o...o", "0w0", ":-/", ":/", ":\\", "=/", "=\\", ":S", ":|", + "d:-)", "qB-)", ":)~", ":-)>....", ":-X", ":X", ":-#", ":#", "O:-)", "0:3", "O:)", ":'(", ";*(", + "T_T", "TT_TT", "T.T", ":-*", ":*", "^o)", ">:)", ">;)", ">:-)", "B)", "B-)", "8)", "8-)", + "^>.>^", "^<.<^", "^>_>^", "^<_<^", "D:<", ">:(", "D-:<", ">:-(", ":-@[1]", ";(", "`_´", "D<", + "<3", "<333", "=^_^=", "=>.>=", "=<_<=", "=>.<=", "\\,,/", "\\m/", "\\m/\\>.</\\m/", "\\o/", "\\o o/", + "o/\\o", ":&", ":u" + ], + type: "[string]" + } + }; + var ruleContext = context["dom"].node; + var emoticons = validateParams.emoticons.value; + var passed = true; + var testText = ""; + var walkNode = ruleContext.firstChild; + while (walkNode) { + // Comply to the Check Hidden Content setting will be done by default as this rule triggers on each element + // and for each element it only checks that single elements text nodes and nothing else. So all inner elements will be + // covered on their own. Currently for this rule by default Check Hidden Content will work, as we are doing + // a node walk only on siblings so it would not get text nodes from other siblings at all. + // In the case in the future something chnges, just need to add && !RPTUtil.shouldNodeBeSkippedHidden(walkNode) to the below + // if. + if (walkNode.nodeName == "#text") { + testText += " " + walkNode.nodeValue; + } + walkNode = walkNode.nextSibling; + } + if (testText.trim().length > 0) { + for (var j = 0; passed && j < emoticons.length; ++j) { + var emotIdx = testText.indexOf(emoticons[j]); + var eLngth = emoticons[j].length; + while (passed && emotIdx != -1) { + // Passes if: the emoticon is not preceded by whitespace, + // or the emoticon is not followed by whitespace unless it's punctuation, + // or it's in a pre, code, or script + passed = + (emotIdx > 0 && !/\s/.test(testText.substring(emotIdx - 1, emotIdx))) || + (emotIdx < testText.length - eLngth && !/\s/.test(testText.substring(emotIdx + eLngth, emotIdx + eLngth + 1)) && + !/[.,!'"?]/.test(testText.substring(emotIdx + eLngth, emotIdx + eLngth + 1))); + // Allow usage of (: stuff :) since this is a comment in some languages + passed = passed || ((emoticons[j] == ":)" || emoticons[j] == "(:") && /\(\:.*\:\)/.test(testText)); + passed = passed || ((emoticons[j] == ";)" || emoticons[j] == "(;") && /\(\;.*\;\)/.test(testText)); + emotIdx = testText.indexOf(emoticons[j], emotIdx + 1); + } + } + } + if (!passed) { + // Don't trigger if we're not in the body or if we're in a script, pre, code + var checkAncestor = CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["pre", "code", "script", "body"]); + passed = checkAncestor == null || checkAncestor.nodeName.toLowerCase() != "body"; + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ 5460 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.error_message_exists = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var fragment_1 = __webpack_require__(5279); +var VisUtil_1 = __webpack_require__(3946); +exports.error_message_exists = { + id: "error_message_exists", + context: "dom:*[aria-invalid=true]", + refactor: { + "HAAC_Aria_ErrorMessage": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_0": "error_message_exists.html", + "Fail_1": "error_message_exists.html", + "Fail_2": "error_message_exists.html", + "group": "error_message_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Custom error message has invalid reference 'id' value", + "Fail_2": "Custom error message is not visible", + "group": "A custom error message must reference a valid 'id' value and when triggered the message must be appropriately exposed" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var aria_errMsgId = AriaUtil_1.AriaUtil.getAriaAttribute(ruleContext, "aria-errormessage"); + // If aria-errormessage is not provided, then OUT_OF_SCOPE + if (!aria_errMsgId) { + return null; + } + var msg_ele = fragment_1.FragmentUtil.getById(ruleContext, aria_errMsgId); + // POF0: Invalid id reference + if (!msg_ele) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + // POF1: Referenced element is not visible + if (!VisUtil_1.VisUtil.isNodeVisible(msg_ele)) { + return (0, IRule_1.RuleFail)("Fail_2"); + } + return (0, IRule_1.RulePass)("Pass_0"); + } +}; + + +/***/ }, + +/***/ 3399 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.fieldset_label_valid = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var fragment_1 = __webpack_require__(5279); +var CacheUtil_1 = __webpack_require__(4566); +var CommonUtil_1 = __webpack_require__(7139); +var VisUtil_1 = __webpack_require__(3946); +var AccNameUtil_1 = __webpack_require__(1950); +exports.fieldset_label_valid = { + id: "fieldset_label_valid", + context: "aria:group", + refactor: { + "group_withInputs_hasName": { + "Pass_1": "Pass_1", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_1": "fieldset_label_valid.html", + "Fail_1": "fieldset_label_valid.html", + "Fail_2": "fieldset_label_valid.html", + "group": "fieldset_label_valid.html" + } + }, + messages: { + "en-US": { + "Pass_1": "Group/Fieldset \"{0}\" with an input has a unique name", + "Fail_1": "Group/Fieldset does not have an accessible name", + "Fail_2": "Group/Fieldset \"{0}\" has a duplicate name to another group", + "group": "Groups with nested inputs must have unique accessible name" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1", "3.3.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + var ownerDocument = fragment_1.FragmentUtil.getOwnerFragment(ruleContext); + var formCache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "landmark_group_input", null); + if (!formCache) { + formCache = { + groupsWithInputs: [], + groupsWithInputsComputedLabels: [], + }; + var allGroupsTemp = ownerDocument.querySelectorAll('fieldset,[role="group"]'); + var allGroups = Array.from(allGroupsTemp); + var groupsWithInputs = []; + for (var i = 0; i < allGroups.length; i++) { + // Loop over all the group nodes + if (allGroups[i].querySelector("input")) { + groupsWithInputs.push(allGroups[i]); + } + } + var groupsWithInputsComputedLabels = []; + for (var i = 0; i < groupsWithInputs.length; i++) { + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(groupsWithInputs[i]); + // Loop over all the landmark nodes + groupsWithInputsComputedLabels.push( + /**ARIAMapper.computeName(groupsWithInputs[i])*/ + pair && pair.name && pair.name.trim().length > 0 ? pair.name.trim() : ""); + } + formCache.groupsWithInputs = groupsWithInputs; + formCache.groupsWithInputsComputedLabels = + groupsWithInputsComputedLabels; + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "landmark_group_input", formCache); + } + // formCache.groupsWithInputs.forEach(element => { + // console.log("formCache.groupsWithInputs: " +element.id) + // }); + // console.log("formCache.groupsWithInputsComputedLabels: " +formCache.groupsWithInputsComputedLabels) + // console.log("formCache.groupsWithInputsComputedLabels: " +formCache.groupsWithInputsComputedLabels.length) + var ruleContextFoundIngroupsWithInputsFlag = false; + var computedName = ""; + if (!formCache.groupsWithInputs) { + // We do not have any groups with inputs. Therefore we should skip this rule trigger. + return null; + } + for (var i = 0; i < formCache.groupsWithInputs.length; i++) { + if (ruleContext.isSameNode(formCache.groupsWithInputs[i])) { + // We have found our ruleContext in the cache + ruleContextFoundIngroupsWithInputsFlag = true; + if (formCache.groupsWithInputsComputedLabels[i] === "" || + formCache.groupsWithInputsComputedLabels[i] === null) { + // console.log("Fail_1") + return (0, IRule_1.RuleFail)("Fail_1"); + } + var foundSameNameFlag = false; + for (var j = 0; j < formCache.groupsWithInputsComputedLabels.length; j++) { + if (i == j) { + continue; + } // We do not want to compare against ourselfs + if (formCache.groupsWithInputsComputedLabels[i] === + formCache.groupsWithInputsComputedLabels[j]) { + foundSameNameFlag = true; + } + } + if (foundSameNameFlag) { + // console.log("Fail_2") + return (0, IRule_1.RuleFail)("Fail_2", [ + formCache.groupsWithInputsComputedLabels[i], + ]); + } + computedName = formCache.groupsWithInputsComputedLabels[i]; + } + } + if (!ruleContextFoundIngroupsWithInputsFlag) { + // console.log("null return") + return null; + } + // console.log("Pass_1") + return (0, IRule_1.RulePass)("Pass_1", [computedName]); + } +}; + + +/***/ }, + +/***/ 3498 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.fieldset_legend_valid = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +var VisUtil_1 = __webpack_require__(3946); +exports.fieldset_legend_valid = { + id: "fieldset_legend_valid", + context: "dom:fieldset", + refactor: { + "WCAG20_Fieldset_HasLegend": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3" + } + }, + help: { + "en-US": { + "Pass_0": "fieldset_legend_valid.html", + "Fail_1": "fieldset_legend_valid.html", + "Fail_2": "fieldset_legend_valid.html", + "Fail_3": "fieldset_legend_valid.html", + "group": "fieldset_legend_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "<fieldset> element does not have a <legend>", + "Fail_2": "<fieldset> element has more than one <legend>", + "Fail_3": "<fieldset> element <legend> is empty", + "group": " <fieldset> elements should have a single, non-empty <legend> as a label" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip if the fieldset is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return null; + // In the case a legend is hidden, we should still trigger a violations for this + var legends = CommonUtil_1.CommonUtil.getChildByTagHidden(ruleContext, "legend", true, false); + if (legends.length === 0) { + // Fieldset has NO Legend + return (0, IRule_1.RuleFail)("Fail_1"); + } + else if (legends.length > 1) { + // Fieldset has more than one legend + return (0, IRule_1.RuleFail)("Fail_2"); + } + else if (CommonUtil_1.CommonUtil.getInnerText(legends[0]).trim().length === 0) { + // Fieldset has legend but legend is empty + return (0, IRule_1.RuleFail)("Fail_3"); + } + return (0, IRule_1.RulePass)("Pass_0"); + } +}; + + +/***/ }, + +/***/ 9629 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.figure_label_exists = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var VisUtil_1 = __webpack_require__(3946); +var AccNameUtil_1 = __webpack_require__(1950); +exports.figure_label_exists = { + id: "figure_label_exists", + context: "dom:figure", + refactor: { + "HAAC_Figure_label": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "figure_label_exists.html", + "Fail_1": "figure_label_exists.html", + "group": "figure_label_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The <figure> element does not have an associated label", + "group": "A <figure> element must have an associated label" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // ignore if an explicit role is specified. this case will be covered in the aria_accessiblename_exists rules + var role = ruleContext.getAttribute("role"); + if (role) { + return null; + } + //let passed = AriaUtil.hasAriaLabel(ruleContext) || CommonUtil.attributeNonEmpty(ruleContext, "title"); + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + var passed = pair && pair.name && pair.name.trim().length > 0; + //return new ValidationResult(passed, [ruleContext], '', '', []); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", []); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ 733 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.form_font_color = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +exports.form_font_color = { + id: "form_font_color", + context: "dom:form", + refactor: { + "RPT_Font_ColorInForm": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "form_font_color.html", + "Potential_1": "form_font_color.html", + "group": "form_font_color.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Check color is not used as the only visual means to convey which fields are required", + "group": "Combine color and descriptive markup to indicate required form fields" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = true; + var fonts = ruleContext.getElementsByTagName("font"); + if (fonts != null) { + for (var i = 0; i < fonts.length; ++i) { + passed = !fonts[i].hasAttribute("color"); + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ 9797 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.form_interaction_review = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +exports.form_interaction_review = { + id: "form_interaction_review", + context: "dom:form[target]", + refactor: { + "WCAG20_Form_TargetAndText": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "form_interaction_review.html", + "Potential_1": "form_interaction_review.html", + "group": "form_interaction_review.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that interacting with content will not open pop-up windows or change the active window without informing the user", + "group": "User should be informed in advance when interacting with content causes a change of context" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.2.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + paramWinText: { + value: ["new window"], + type: "array" + } + }; + var ruleContext = context["dom"].node; + var tStr = ruleContext.getAttribute("target"); + var passed = tStr === "_parent" || tStr === "_self" || tStr === "_top" || CommonUtil_1.CommonUtil.getFrameByName(ruleContext, tStr) != null; + if (!passed) { + // Name is not part of this frameset – must have potential to create new window? + // See if a new window is mentioned + var textStr = CommonUtil_1.CommonUtil.getInnerText(ruleContext); + if (ruleContext.hasAttribute("title")) + textStr += " " + ruleContext.getAttribute("title"); + for (var i = 0; !passed && i < validateParams.paramWinText.value.length; ++i) + if (textStr.indexOf(validateParams.paramWinText.value[i]) != -1) + passed = true; + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ 7156 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.form_label_unique = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var fragment_1 = __webpack_require__(5279); +var CacheUtil_1 = __webpack_require__(4566); +exports.form_label_unique = { + id: "form_label_unique", + context: "dom:label[for]", + refactor: { + "RPT_Label_UniqueFor": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "form_label_unique.html", + "Fail_1": "form_label_unique.html", + "group": "form_label_unique.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Form control has more than one label", + "group": "Form controls should have exactly one label" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // JCH - NO OUT OF SCOPE hidden in context + var labelIds = CacheUtil_1.CacheUtil.getCache(fragment_1.FragmentUtil.getOwnerFragment(ruleContext), "RPT_Label_Single", {}); + var id = ruleContext.getAttribute("for"); + var passed = !(id in labelIds); + labelIds[id] = true; + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ 3062 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.form_submit_button_exists = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var DOMWalker_1 = __webpack_require__(3864); +exports.form_submit_button_exists = { + id: "form_submit_button_exists", + context: "dom:form", + refactor: { + "WCAG20_Form_HasSubmit": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "form_submit_button_exists.html", + "Potential_1": "form_submit_button_exists.html", + "group": "form_submit_button_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify the <form> element has a submit button or an image button", + "group": "A <form> element should have a submit button or an image button" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.2.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = false; + if (ruleContext.firstChild) { + // submit buttons are usually at the bottom - walk backwards + var nw = new DOMWalker_1.DOMWalker(ruleContext, true); + while (!passed && nw.prevNode() && nw.node != ruleContext) { + if (!nw.bEndTag) { + var nodeName = nw.node.nodeName.toLowerCase(); + if (nodeName === "input") { + var type = nw.elem().getAttribute("type"); + if (type) { + type = type.toLowerCase(); + } + passed = type === "submit" || type === "image"; + } + else if (nodeName === "button") { + passed = nw.elem().hasAttribute("type") && nw.elem().getAttribute("type").toLowerCase() === "submit"; + } + else if (nw.node.nodeType === 1) { + passed = AriaUtil_1.AriaUtil.hasRole(nw.node, "button"); + } + } + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ 3827 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.form_submit_review = void 0; +var IRule_1 = __webpack_require__(461); +exports.form_submit_review = { + id: "form_submit_review", + context: "dom:select[onchange], dom:input[onchange]", + refactor: { + "RPT_Form_ChangeEmpty": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "form_submit_review.html", + "Potential_1": "form_submit_review.html", + "group": "form_submit_review.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Confirm the form does not submit automatically without warning", + "group": "A form should not be submitted automatically without warning the user" + } + }, + /** + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.2.2"], + "level": eRulePolicy.VIOLATION, + "toolkitLevel": eToolkitLevel.LEVEL_THREE + }],*/ + //deprecate the rule on Jun 10, 2024 + rulesets: [], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = ruleContext.getAttribute("onchange").trim().length === 0; + if (passed) + return null; + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ 5498 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.frame_src_valid = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +exports.frame_src_valid = { + id: "frame_src_valid", + context: "dom:frame, dom:iframe", + refactor: { + "Valerie_Frame_SrcHtml": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "frame_src_valid.html", + "Potential_1": "frame_src_valid.html", + "group": "frame_src_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify <frame> content is accessible", + "group": "A <frame> containing non-HTML content must be made accessible" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "src") && + CommonUtil_1.CommonUtil.isHtmlExt(CommonUtil_1.CommonUtil.getFileExt(ruleContext.getAttribute("src"))); + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ 510 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.frame_title_exists = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AccNameUtil_1 = __webpack_require__(1950); +var VisUtil_1 = __webpack_require__(3946); +exports.frame_title_exists = { + id: "frame_title_exists", + context: "dom:frame, dom:iframe", + refactor: { + "WCAG20_Frame_HasTitle": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "frame_title_exists.html", + "Pass_0": "frame_title_exists.html", + "Fail_1": "frame_title_exists.html" + } + }, + messages: { + "en-US": { + "group": "Inline frames must have a unique, non-empty 'title' attribute", + "Pass_0": "Rule Passed", + "Fail_1": "Inline frame does not have a 'title' attribute", + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: "cae760", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // ignore if an explicit role is specified. this case will be covered in the aria_accessiblename_exists rules + var role = ruleContext.getAttribute("role"); + if (role) { + return null; + } + var name_pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + if (name_pair && name_pair.name && name_pair.name.trim().length > 0) { + //if (CommonUtil.attributeNonEmpty(ruleContext, "title")) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } +}; + + +/***/ }, + +/***/ 7722 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.heading_content_exists = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +exports.heading_content_exists = { + id: "heading_content_exists", + context: "dom:h1, dom:h2, dom:h3, dom:h4, dom:h5, dom:h6", + refactor: { + "RPT_Header_HasContent": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "heading_content_exists.html", + "Fail_1": "heading_content_exists.html", + "group": "heading_content_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Heading element has descriptive text", + "Fail_1": "Heading element has no descriptive content", + "group": "Heading elements must provide descriptive text" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.6"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = CommonUtil_1.CommonUtil.hasInnerContentHidden(ruleContext); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ 4597 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.heading_markup_misuse = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +exports.heading_markup_misuse = { + id: "heading_markup_misuse", + context: "dom:h1, dom:h2, dom:h3, dom:h4, dom:h5, dom:h6", + dependencies: ["heading_content_exists"], + refactor: { + "RPT_Headers_FewWords": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "heading_markup_misuse.html", + "Potential_1": "heading_markup_misuse.html", + "group": "heading_markup_misuse.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that the heading element is a genuine heading", + "group": "Heading elements must not be used for presentation" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + headingLengthThresh: { + value: 20, + type: "integer" + } + }; + var ruleContext = context["dom"].node; + var headingLengthThresh = validateParams.headingLengthThresh.value; + var passed = CommonUtil_1.CommonUtil.wordCount(CommonUtil_1.CommonUtil.getInnerText(ruleContext)) <= headingLengthThresh; + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ 2104 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.html_lang_exists = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var ancestor_1 = __webpack_require__(6858); +var lang_1 = __webpack_require__(1043); +exports.html_lang_exists = { + id: "html_lang_exists", + context: "dom:html", + refactor: { + "WCAG20_Html_HasLang": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3", + "Fail_4": "Fail_4", + "Fail_5": "Fail_5", + "Potential_5": "Potential_5", + "Potential_6": "Potential_6" + } + }, + help: { + "en-US": { + "group": "html_lang_exists.html", + "Pass_0": "html_lang_exists.html", + "Fail_1": "html_lang_exists.html", + "Fail_2": "html_lang_exists.html", + "Fail_3": "html_lang_exists.html", + "Fail_4": "html_lang_exists.html", + "Fail_5": "html_lang_exists.html", + "Potential_5": "html_lang_exists.html", + "Potential_6": "html_lang_exists.html" + } + }, + messages: { + "en-US": { + "group": "Page must identify the default language of the document with a 'lang' attribute", + "Pass_0": "Page language detected as \"{0}\"", + "Fail_1": "Page detected as XHTML 1.0, but has neither 'lang' nor 'xml:lang' attributes", + "Fail_2": "Page detected as XHTML, but does not have an 'xml:lang' attribute", + "Fail_3": "Page detected as HTML, but does not have a 'lang' attribute", + "Fail_4": "Page detected with 'lang' and 'xml:lang' attributes and primary languages do not match: \"{0}\", \"{1}\"", + "Fail_5": "Page detected with 'lang' and 'xml:lang' attributes that do not match: \"{0}\", \"{1}\"", + "Potential_5": "Page detected as XHTML 1.0 with only a 'lang' attribute. Confirm that page is only delivered via text/html mime type", + "Potential_6": "Page detected as XHTML 1.0 with only an 'xml:lang' attribute. Confirm that page is only delivered via xml mime type" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "3.1.1", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [{ + "b5c3f8": { + "Pass_0": "pass", + "Fail_1": "inapplicable", + "Fail_2": "inapplicable", + "Fail_3": "fail", + "Fail_4": "inapplicable", + "Fail_5": "inapplicable", + "Potential_5": "inapplicable", + "Potential_6": "inapplicable" + }, + "5b7ae0": { + "Pass_0": "pass", + "Fail_1": "inapplicable", + "Fail_2": "inapplicable", + "Fail_3": "inapplicable", + "Fail_4": "fail", + "Fail_5": "pass", + "Potential_5": "inapplicable", + "Potential_6": "inapplicable" + } + }], + run: function (context, options, contextHierarchies) { + // This rule does not apply inside a presentational frame + if (ancestor_1.AncestorUtil.isPresentationFrame(contextHierarchies)) { + return null; + } + var ruleContext = context["dom"].node; + var doctypeString = ruleContext.ownerDocument.doctype ? ruleContext.ownerDocument.doctype.publicId : ""; + if (!doctypeString) + doctypeString = ""; + var lang = ruleContext.getAttribute("lang"); + var langXML = ruleContext.getAttribute("xml:lang"); + if (doctypeString.includes('XHTML') && !doctypeString.includes("1.0")) { + if (!langXML) { + // XHTML != 1.0 (must have xml:lang + return (0, IRule_1.RuleFail)("Fail_2"); + } + else { + return (0, IRule_1.RulePass)("Pass_0", [langXML]); + } + } + else if (doctypeString.includes('XHTML') && doctypeString.includes("1.0")) { + // Handle XHTML 1.0 + // If neither is provided, it's a failure + if (!lang && !langXML) { + // XHTML and no lang + return (0, IRule_1.RuleFail)("Fail_1"); + } + else if (lang && langXML) { + if (lang !== langXML) { + if (!lang_1.LangUtil.validPrimaryLang(lang) || !lang_1.LangUtil.validPrimaryLang(langXML)) { + // Let Elem_Lang_Valid handle this + return null; + } + if (!lang_1.LangUtil.matchPrimaryLang(lang, langXML)) { + // XHTML and lang and xml:lang, but they don't match + return (0, IRule_1.RuleFail)("Fail_4", [lang, langXML], []); + } + else { + return (0, IRule_1.RuleFail)("Fail_5", [lang, langXML], []); + } + } + else { + // XHTML and lang and xml:lang match + return (0, IRule_1.RulePass)("Pass_0", [lang]); + } + } + else if (lang) { + // XHTML and only lang (okay if only delivered via text/html) + return (0, IRule_1.RulePotential)("Potential_5"); + } + else { + // XHTML and only xml:lang (okay if only delivered via xml mime type) + return (0, IRule_1.RulePotential)("Potential_6"); + } + } + else { + if (!lang) { + return (0, IRule_1.RuleFail)("Fail_3"); + } + else if (lang && langXML) { + // HTML5 polyglot documents + if (lang !== langXML) { + if (!lang_1.LangUtil.validPrimaryLang(lang) || !lang_1.LangUtil.validPrimaryLang(langXML)) { + // Let Elem_Lang_Valid handle this + return null; + } + if (!lang_1.LangUtil.matchPrimaryLang(lang, langXML)) { + // XHTML and lang and xml:lang, but they don't match + return (0, IRule_1.RuleFail)("Fail_4", [lang, langXML], []); + } + else { + return (0, IRule_1.RuleFail)("Fail_5", [lang, langXML], []); + } + } + else { + // XHTML and lang and xml:lang match + return (0, IRule_1.RulePass)("Pass_0", [lang]); + } + } + else { + return (0, IRule_1.RulePass)("Pass_0", [lang]); + } + } + } +}; + + +/***/ }, + +/***/ 8260 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.html_skipnav_exists = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +var fragment_1 = __webpack_require__(5279); +exports.html_skipnav_exists = { + id: "html_skipnav_exists", + context: "dom:html", + refactor: { + "RPT_Html_SkipNav": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "group": "html_skipnav_exists.html", + "Pass_0": "html_skipnav_exists.html", + "Potential_1": "html_skipnav_exists.html" + } + }, + messages: { + "en-US": { + "group": "Provide a way to bypass blocks of content that are repeated on multiple Web pages", + "Pass_0": "Rule Passed", + "Potential_1": "Verify there is a way to bypass blocks of content that are repeated on multiple Web pages" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "2.4.1", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = false; + var frames = CommonUtil_1.CommonUtil.getDocElementsByTag(ruleContext, "frame"); + var headers = CommonUtil_1.CommonUtil.getDocElementsByTag(ruleContext, "h1"); + if ((frames != null && frames.length > 0) || (headers != null && headers.length > 0)) { + // If frames or headings are used, pass + passed = true; + } + else { + // Look for skip anchors + var anchors = CommonUtil_1.CommonUtil.getDocElementsByTag(ruleContext, "a"); + var targets = {}; + for (var idx = 0; !passed && idx < anchors.length; ++idx) { + if (anchors[idx].hasAttribute("href")) { + var href = anchors[idx].href; + if (typeof href !== typeof "") { + if (href.baseVal) { + href = href.baseVal; + } + else { + href = ""; + } + } + var tmpLocation = void 0; + if (typeof (ruleContext.ownerDocument.locationFromDAP) != "undefined" && ruleContext.ownerDocument.locationFromDAP != null) { // DAP sets it + tmpLocation = ruleContext.ownerDocument.locationFromDAP; + } + else { // server scan has the location object + tmpLocation = ruleContext.ownerDocument.location; + } + var docHref = ""; + if (tmpLocation) { + docHref = tmpLocation.href; + } + // Fix weird bugs with how various parsers report on file: url's: + if (href.startsWith("file:///")) + href = "file:/" + href.substring("file:///".length); + if (docHref.startsWith("file:///")) + docHref = "file:/" + docHref.substring("file:///".length); + if (href.charAt(0) == "#" || href.startsWith(docHref + "#")) { + var target = CommonUtil_1.CommonUtil.getFileAnchor(href); + if (fragment_1.FragmentUtil.getById(ruleContext, target) != null) + passed = true; + else + targets[target] = true; + } + } + else if (anchors[idx].hasAttribute("name")) { + // Assume forward jumping targets + var name_1 = anchors[idx].getAttribute("name"); + if (name_1.indexOf("#") != -1) + name_1 = CommonUtil_1.CommonUtil.getFileAnchor(name_1); + passed = name_1 in targets; + } + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ 8920 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.iframe_interactive_tabbable = void 0; +var CommonUtil_1 = __webpack_require__(7139); +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var VisUtil_1 = __webpack_require__(3946); +var DOMMapper_1 = __webpack_require__(7507); +exports.iframe_interactive_tabbable = { + id: "iframe_interactive_tabbable", + context: "dom:iframe", + dependencies: [], + help: { + "en-US": { + "group": "iframe_interactive_tabbable.html", + "pass": "iframe_interactive_tabbable.html", + "fail_invalid": "iframe_interactive_tabbable.html" + } + }, + messages: { + "en-US": { + "group": "Iframe with interactive content should not be excluded from tab order using tabindex", + "pass": "The iframe with interactive content is not excluded from the tab order using tabindex", + "fail_invalid": "The <iframe> with interactive content is excluded from tab order using tabindex" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + num: ["2.1.1"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: ["akn7bn"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + var mapper = new DOMMapper_1.DOMMapper(); + var bounds = mapper.getUnadjustedBounds(ruleContext); + //in case the bounds not available + if (!bounds) + return null; + // ignore if iframe is too small to be visible on screen + if (Math.max(bounds['height'], bounds['width']) < 30 || Math.min(bounds['height'], bounds['width']) < 15) + return null; + // pass iframe element does not have a tabindex attribute value that is a negative number + if (!ruleContext.hasAttribute("tabindex") || parseInt(ruleContext.getAttribute("tabindex")) >= 0) + return (0, IRule_1.RulePass)("pass"); + // check iframe content + var iframElem = ruleContext; + if (!iframElem || !iframElem.contentDocument || !iframElem.contentDocument.documentElement) + return null; + var count = CommonUtil_1.CommonUtil.getTabbableChildren(ruleContext); + if (count > 0) + return (0, IRule_1.RuleFail)("fail_invalid"); + return null; + } +}; + + +/***/ }, + +/***/ 1237 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.imagebutton_alt_exists = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +exports.imagebutton_alt_exists = { + id: "imagebutton_alt_exists", + context: "dom:input", + refactor: { + "WCAG20_Input_ExplicitLabelImage": { + "Pass_0": "Pass_0", + "Pass_1": "Pass_1", + "Pass_2": "Pass_2", + "Fail": "Fail" + } + }, + help: { + "en-US": { + "Pass_0": "imagebutton_alt_exists.html", + "Pass_1": "imagebutton_alt_exists.html", + "Pass_2": "imagebutton_alt_exists.html", + "Fail": "imagebutton_alt_exists.html", + "group": "imagebutton_alt_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Image button provides alternative text using the 'alt' attribute", + "Pass_1": "Image button provides alternative text using an ARIA label", + "Pass_2": "Image button provides alternative text using the 'title' attribute", + "Fail": "The <input> element of type \"image\" has no text alternative", + "group": "The <input> element of type \"image\" should have a text alternative" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: "59796f", + run: function (context, options, contextHierarchies) { + // See https://www.w3.org/WAI/WCAG22/Techniques/failures/F65 + var ruleContext = context["dom"].node; + if (!ruleContext.hasAttribute("type") || ruleContext.getAttribute("type").toLowerCase() != "image") { + return null; + } + if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "alt")) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else if (AriaUtil_1.AriaUtil.hasAriaLabel(ruleContext)) { + return (0, IRule_1.RulePass)("Pass_1"); + } + else if (ruleContext.hasAttribute("title") && ruleContext.getAttribute("title").length > 0) { + return (0, IRule_1.RulePass)("Pass_2"); + } + return (0, IRule_1.RuleFail)("Fail"); + } +}; + + +/***/ }, + +/***/ 4101 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.imagemap_alt_exists = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +var VisUtil_1 = __webpack_require__(3946); +exports.imagemap_alt_exists = { + id: "imagemap_alt_exists", + context: "dom:img[usemap], dom:img[ismap]", + refactor: { + "HAAC_Img_UsemapAlt": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "imagemap_alt_exists.html", + "Fail_1": "imagemap_alt_exists.html", + "group": "imagemap_alt_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Image map or child <area> has no text alternative", + "group": "An image map and each <area> element in an image map must have text alternative(s)" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "alt") || + (!ruleContext.hasAttribute("ismap") && !CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "usemap")); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ 275 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_alt_background = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var VisUtil_1 = __webpack_require__(3946); +exports.img_alt_background = { + id: "img_alt_background", + context: "dom:*", + refactor: { + "HAAC_BackgroundImg_HasTextOrTitle": { + "Pass_0": "Pass_0", + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Pass_0": "img_alt_background.html", + "Manual_1": "img_alt_background.html", + "group": "img_alt_background.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Manual_1": "Verify important background image information has a text alternative in system high contrast mode", + "group": "Background images that convey important information must have a text alternative that describes the image" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var doc = ruleContext.ownerDocument; + var style = doc.defaultView.getComputedStyle(ruleContext); + if (style == null) { + return (0, IRule_1.RulePass)("Pass_0"); + } + var backgroundImgs = style.backgroundImage; + var passed = true; + if (backgroundImgs != null && backgroundImgs != "" && backgroundImgs != 'none' && backgroundImgs != 'inherit') { + if (ruleContext.innerHTML != null && ruleContext.innerHTML.trim().length != 0) { + passed = false; + } + else { + var title = ruleContext.getAttribute('title'); + if (title != null && title.length != 0) + passed = false; + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }, + +/***/ 7601 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_alt_decorative = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var VisUtil_1 = __webpack_require__(3946); +exports.img_alt_decorative = { + id: "img_alt_decorative", + context: "dom:img[alt]", + refactor: { + "WCAG20_Img_PresentationImgHasNonNullAlt": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "img_alt_decorative.html", + "Fail_1": "img_alt_decorative.html", + "group": "img_alt_decorative.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Image designated as decorative has non-null 'alt' attribute", + "group": "Image designated as decorative must have 'alt=\"\"" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = true; + if (AriaUtil_1.AriaUtil.hasRole(ruleContext, "presentation") || AriaUtil_1.AriaUtil.hasRole(ruleContext, "none")) { + passed = ruleContext.getAttribute("alt").length == 0; + } + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ 7541 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_alt_misuse = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var VisUtil_1 = __webpack_require__(3946); +exports.img_alt_misuse = { + id: "img_alt_misuse", + context: "dom:img, dom:area, dom:input", + refactor: { + "RPT_Img_AltCommonMisuse": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "img_alt_misuse.html", + "Potential_1": "img_alt_misuse.html", + "group": "img_alt_misuse.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that the file name serves as a good inline replacement for the image", + "group": "'alt' attribute value must be a good inline replacement for the image" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + badText: { + value: ["short description"], + type: "[string]" + } + }; + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLowerCase(); + var passed = true; + // Alt text check are elsewhere (See 41, 240, 455) + if (ruleContext.hasAttribute("alt")) { + var altText = ruleContext.getAttribute("alt").trim(); + if (altText.length > 0) { + var badText = validateParams.badText.value; + for (var i = 0; passed && i < badText.length; ++i) { + passed = altText.indexOf(badText[i]) == -1; + } + if (passed) { + var src = ruleContext.getAttribute((nodeName == "area") ? "href" : "src"); + // Allow it to pass if there's no src - can't determine these. + if (src != null) { + // Fail if the alt matches the src exactly + // Also fail if the alt has a . in it and either the src is in the alt or the alt is in the src + passed = src.trim() != altText && + (altText.indexOf(".") == -1 || (altText.indexOf(src) == -1 && src.indexOf(altText) == -1)); + } + } + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ 8274 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_alt_null = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var VisUtil_1 = __webpack_require__(3946); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +exports.img_alt_null = { + id: "img_alt_null", + context: "dom:img[alt]", + refactor: { + "WCAG20_Img_TitleEmptyWhenAltNull": { + "Pass_0": "pass", + "Fail_1": "fail_decorative" + } + }, + help: { + "en-US": { + "pass": "img_alt_null.html", + "fail_decorative": "img_alt_null.html", + "potential_aria_override": "img_alt_null.html", + "group": "img_alt_null.html" + } + }, + messages: { + "en-US": { + "pass": "Neither 'aria' nor 'title' attributes are used for the decorative image", + "fail_decorative": "The image 'alt' attribute is empty, but the 'title' attribute is not empty", + "potential_aria_override": "The image 'alt' attribute is empty, but the 'aria' label is not empty and overrides the 'alt' attribute", + "group": "When the intent is to mark an image as decorative with an empty 'alt' attribute, the 'aria' or 'title' attributes should not be used" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE, + reasonCodes: ["fail_decorative"] + }, + { + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["ARIA"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE, + reasonCodes: ["potential_aria_override"] + } + ], + act: [{ "46ca7f": { "potential_aria_override": "fail" } }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + if (ruleContext.getAttribute("alt").trim().length > 0) { + return null; + } + // We have a title, but alt is empty + if (AriaUtil_1.AriaUtil.getAriaLabel(ruleContext).length > 0) { + return (0, IRule_1.RulePotential)("potential_aria_override"); + } + else if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "title")) { + return (0, IRule_1.RuleFail)("fail_decorative"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ 590 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_alt_redundant = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var DOMWalker_1 = __webpack_require__(3864); +var CommonUtil_1 = __webpack_require__(7139); +exports.img_alt_redundant = { + id: "img_alt_redundant", + context: "dom:img[alt]", + refactor: { + "WCAG20_Img_LinkTextNotRedundant": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3" + } + }, + help: { + "en-US": { + "Pass_0": "img_alt_redundant.html", + "Fail_1": "img_alt_redundant.html", + "Fail_2": "img_alt_redundant.html", + "Fail_3": "img_alt_redundant.html", + "group": "img_alt_redundant.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Link text is repeated in an image 'alt' value within the same link", + "Fail_2": "Link text of previous link is repeated in image 'alt' value of a link", + "Fail_3": "Image 'alt' value within a link is repeated in link text of the link after", + "group": "The text alternative for an image within a link should not repeat the link text or adjacent link text" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1", "2.4.4"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var aNode = CommonUtil_1.CommonUtil.getAncestor(ruleContext, "a"); + //If not in an anchor, Out of Scope + if (aNode == null) + return null; + var altText = ruleContext.getAttribute("alt").trim().toLowerCase(); + if (altText.length == 0) { + // If alt text is empty, there's no text to be redundant - let a_text_purpose + // trigger in that case. + // So Out of Scope for this rule + return null; + } + var innerText = aNode.innerText; + var linkText = ""; + if (innerText != null) { + linkText = innerText.trim().toLowerCase(); + } + if (linkText.length > 0) { + if (altText == linkText) { + // Text in link + return (0, IRule_1.RuleFail)("Fail_1"); + } + } + else { + var passed = true; + //alt is non-zero, but no link text - ensure adjacent link text isn't redundant + var walk = new DOMWalker_1.DOMWalker(aNode); + while (passed && walk.prevNode()) { + // Get the node and nodeName + var node = walk.node; + var nodeName = node.nodeName.toLowerCase(); + if ((nodeName == "#text" && node.nodeValue.length > 0) || + (nodeName == "img" && CommonUtil_1.CommonUtil.attributeNonEmpty(node, "alt"))) { + break; + } + // Comply with the Check Hidden Content Setting if the a element should be checked or not + else if (nodeName === "a" && !CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(node)) { + // Text before image link + passed = (node.innerText || node.textContent || "").trim().toLowerCase() != altText; + } + } + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_2"); + } + walk = new DOMWalker_1.DOMWalker(aNode, true); + while (passed && walk.nextNode()) { + // Get the node and nodeName + var node = walk.node; + var nodeName = node.nodeName.toLowerCase(); + if ((nodeName == "#text" && node.nodeValue.length > 0) || + (nodeName == "img" && CommonUtil_1.CommonUtil.attributeNonEmpty(node, "alt"))) { + break; + } + // Comply with the Check Hidden Content Setting if the a element should be checked or not + else if (nodeName == "a" && !CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(node)) { + passed = node.innerText.trim().toLowerCase() != altText; + } + } + if (!passed) { + // Text after image link + return (0, IRule_1.RuleFail)("Fail_3"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } + } +}; + + +/***/ }, + +/***/ 8925 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_alt_valid = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var VisUtil_1 = __webpack_require__(3946); +var AccNameUtil_1 = __webpack_require__(1950); +exports.img_alt_valid = { + id: "img_alt_valid", + context: "dom:img", + refactor: { + "WCAG20_Img_HasAlt": { + "pass": "pass", + "fail_blank_alt": "fail_blank_alt", + "fail_no_alt": "fail_no_alt", + "fail_blank_title": "fail_blank_title" + } + }, + help: { + "en-US": { + "pass": "img_alt_valid.html", + "fail_blank_alt": "img_alt_valid.html", + "fail_no_alt": "img_alt_valid.html", + "fail_blank_title": "img_alt_valid.html", + "group": "img_alt_valid.html" + } + }, + messages: { + "en-US": { + "pass": "The image has an accessible name or is correctly marked as decorative or redundant", + "fail_blank_alt": "Image 'alt' attribute value consists only of blank space(s)", + "fail_no_alt": "The image has neither an accessible name nor is marked as decorative or redundant", + "fail_blank_title": "The image does not have an 'alt' attribute or ARIA label, and the 'title' attribute value consists only of blank space(s)", + "group": "Images must have accessible names unless they are decorative or redundant" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: "23a2a8", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // If not visible to the screen reader, or can be ignored + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || AccNameUtil_1.AccNameUtil.isAccessibleNameIgnorable(ruleContext)) + return null; + if (AriaUtil_1.AriaUtil.getAriaLabel(ruleContext).trim().length !== 0) { + // the img has non-empty aria label + return (0, IRule_1.RulePass)("pass"); + } + var alt = ruleContext.hasAttribute("alt") ? ruleContext.getAttribute("alt") : null; + // check title attribute + if (alt === null) { + // the img has no alt or attribute, examine the title attribute + var title = ruleContext.hasAttribute("title") ? ruleContext.getAttribute("title") : null; + if (title === null || title.length === 0) { + // no title or title is empty, examine alt further + if (alt === null) { + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext, false); + if (role === 'presentation' || role === 'none') + return (0, IRule_1.RulePass)("pass"); + return (0, IRule_1.RuleFail)("fail_no_alt"); + } + if (alt.length === 0) + return (0, IRule_1.RulePass)("pass"); + } + else { + if (title.trim().length === 0) { + // title contains blank space only (title=" ") + return (0, IRule_1.RuleFail)("fail_blank_title"); + } + // title contains some text (title="some text") + return (0, IRule_1.RulePass)("pass"); + } + } + else { + if (alt.length === 0 || alt.trim().length > 0) { + // the img has empty alt (alt="") or non-empty alt (alt="some text") + return (0, IRule_1.RulePass)("pass"); + } + else { + // alt contains blank space only (alt=" ") + return (0, IRule_1.RuleFail)("fail_blank_alt"); + } + } + } +}; + + +/***/ }, + +/***/ 9234 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_ismap_misuse = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +var VisUtil_1 = __webpack_require__(3946); +exports.img_ismap_misuse = { + id: "img_ismap_misuse", + context: "dom:img[ismap]", + refactor: { + "RPT_Img_UsemapValid": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "img_ismap_misuse.html", + "Potential_1": "img_ismap_misuse.html", + "group": "img_ismap_misuse.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Server-side image map hot-spots do not have duplicate text links", + "group": "Server-side image map hot-spots must have duplicate text links" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = false; + if (ruleContext.hasAttribute("usemap")) { + var usemap = ruleContext.getAttribute("usemap"); + usemap = usemap.trim().toLowerCase(); + var idx = usemap.indexOf("#"); + if (idx != -1) + usemap = usemap.substr(idx + 1); + if (usemap.length > 0) { + var maps = CommonUtil_1.CommonUtil.getDocElementsByTag(ruleContext, "map"); + for (var i = 0; !passed && i < maps.length; ++i) { + passed = maps[i].hasAttribute("name") && + maps[i].getAttribute("name").toLowerCase() == usemap; + } + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ 8617 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_longdesc_misuse = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +var VisUtil_1 = __webpack_require__(3946); +exports.img_longdesc_misuse = { + id: "img_longdesc_misuse", + context: "dom:img[longdesc]", + refactor: { + "RPT_Img_LongDescription2": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "img_longdesc_misuse.html", + "Potential_1": "img_longdesc_misuse.html", + "group": "img_longdesc_misuse.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that the file designated by the 'longdesc' attribute contains valid HTML content (file extension not recognized)", + "group": " The 'longdesc' attribute must reference HTML content" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var longdesc = ruleContext.getAttribute("longdesc"); + // if (longdesc is bad URL) passed = false; + var ext = CommonUtil_1.CommonUtil.getFileExt(longdesc); + var passed = ext.length != 0 && CommonUtil_1.CommonUtil.isHtmlExt(ext) + || longdesc.startsWith("#") + || longdesc.startsWith("http://") + || longdesc.startsWith("https://") + || longdesc.startsWith("data:"); + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ 591 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +// This file is automatically generated by "npm run prebuild". Do not edit +__exportStar(__webpack_require__(2297), exports); +__exportStar(__webpack_require__(4401), exports); +__exportStar(__webpack_require__(4546), exports); +__exportStar(__webpack_require__(9292), exports); +__exportStar(__webpack_require__(9605), exports); +__exportStar(__webpack_require__(3987), exports); +__exportStar(__webpack_require__(8631), exports); +__exportStar(__webpack_require__(8025), exports); +__exportStar(__webpack_require__(1198), exports); +__exportStar(__webpack_require__(8001), exports); +__exportStar(__webpack_require__(5778), exports); +__exportStar(__webpack_require__(8118), exports); +__exportStar(__webpack_require__(2242), exports); +__exportStar(__webpack_require__(3673), exports); +__exportStar(__webpack_require__(5080), exports); +__exportStar(__webpack_require__(183), exports); +__exportStar(__webpack_require__(6805), exports); +__exportStar(__webpack_require__(1886), exports); +__exportStar(__webpack_require__(4078), exports); +__exportStar(__webpack_require__(5750), exports); +__exportStar(__webpack_require__(85), exports); +__exportStar(__webpack_require__(514), exports); +__exportStar(__webpack_require__(5310), exports); +__exportStar(__webpack_require__(9083), exports); +__exportStar(__webpack_require__(6049), exports); +__exportStar(__webpack_require__(5099), exports); +__exportStar(__webpack_require__(2759), exports); +__exportStar(__webpack_require__(3141), exports); +__exportStar(__webpack_require__(5131), exports); +__exportStar(__webpack_require__(5167), exports); +__exportStar(__webpack_require__(8115), exports); +__exportStar(__webpack_require__(5733), exports); +__exportStar(__webpack_require__(5782), exports); +__exportStar(__webpack_require__(6731), exports); +__exportStar(__webpack_require__(390), exports); +__exportStar(__webpack_require__(3900), exports); +__exportStar(__webpack_require__(1218), exports); +__exportStar(__webpack_require__(6734), exports); +__exportStar(__webpack_require__(9973), exports); +__exportStar(__webpack_require__(5711), exports); +__exportStar(__webpack_require__(3384), exports); +__exportStar(__webpack_require__(2762), exports); +__exportStar(__webpack_require__(5757), exports); +__exportStar(__webpack_require__(5232), exports); +__exportStar(__webpack_require__(1891), exports); +__exportStar(__webpack_require__(6142), exports); +__exportStar(__webpack_require__(4863), exports); +__exportStar(__webpack_require__(1440), exports); +__exportStar(__webpack_require__(1968), exports); +__exportStar(__webpack_require__(1617), exports); +__exportStar(__webpack_require__(3475), exports); +__exportStar(__webpack_require__(3370), exports); +__exportStar(__webpack_require__(9272), exports); +__exportStar(__webpack_require__(7735), exports); +__exportStar(__webpack_require__(3923), exports); +__exportStar(__webpack_require__(7521), exports); +__exportStar(__webpack_require__(1852), exports); +__exportStar(__webpack_require__(799), exports); +__exportStar(__webpack_require__(4614), exports); +__exportStar(__webpack_require__(5952), exports); +__exportStar(__webpack_require__(5395), exports); +__exportStar(__webpack_require__(1992), exports); +__exportStar(__webpack_require__(7955), exports); +__exportStar(__webpack_require__(9531), exports); +__exportStar(__webpack_require__(891), exports); +__exportStar(__webpack_require__(7446), exports); +__exportStar(__webpack_require__(6137), exports); +__exportStar(__webpack_require__(6839), exports); +__exportStar(__webpack_require__(8135), exports); +__exportStar(__webpack_require__(507), exports); +__exportStar(__webpack_require__(3566), exports); +__exportStar(__webpack_require__(5173), exports); +__exportStar(__webpack_require__(6027), exports); +__exportStar(__webpack_require__(7515), exports); +__exportStar(__webpack_require__(1704), exports); +__exportStar(__webpack_require__(5053), exports); +__exportStar(__webpack_require__(4681), exports); +__exportStar(__webpack_require__(8050), exports); +__exportStar(__webpack_require__(2644), exports); +__exportStar(__webpack_require__(429), exports); +__exportStar(__webpack_require__(4617), exports); +__exportStar(__webpack_require__(5460), exports); +__exportStar(__webpack_require__(3399), exports); +__exportStar(__webpack_require__(3498), exports); +__exportStar(__webpack_require__(9629), exports); +__exportStar(__webpack_require__(733), exports); +__exportStar(__webpack_require__(9797), exports); +__exportStar(__webpack_require__(7156), exports); +__exportStar(__webpack_require__(3062), exports); +__exportStar(__webpack_require__(3827), exports); +__exportStar(__webpack_require__(5498), exports); +__exportStar(__webpack_require__(510), exports); +__exportStar(__webpack_require__(7722), exports); +__exportStar(__webpack_require__(4597), exports); +__exportStar(__webpack_require__(2104), exports); +__exportStar(__webpack_require__(8260), exports); +__exportStar(__webpack_require__(8920), exports); +__exportStar(__webpack_require__(1237), exports); +__exportStar(__webpack_require__(4101), exports); +__exportStar(__webpack_require__(275), exports); +__exportStar(__webpack_require__(7601), exports); +__exportStar(__webpack_require__(7541), exports); +__exportStar(__webpack_require__(8274), exports); +__exportStar(__webpack_require__(590), exports); +__exportStar(__webpack_require__(8925), exports); +__exportStar(__webpack_require__(9234), exports); +__exportStar(__webpack_require__(8617), exports); +__exportStar(__webpack_require__(1939), exports); +__exportStar(__webpack_require__(7726), exports); +__exportStar(__webpack_require__(3142), exports); +__exportStar(__webpack_require__(1353), exports); +__exportStar(__webpack_require__(2631), exports); +__exportStar(__webpack_require__(8550), exports); +__exportStar(__webpack_require__(8853), exports); +__exportStar(__webpack_require__(3180), exports); +__exportStar(__webpack_require__(1382), exports); +__exportStar(__webpack_require__(953), exports); +__exportStar(__webpack_require__(2222), exports); +__exportStar(__webpack_require__(4678), exports); +__exportStar(__webpack_require__(7578), exports); +__exportStar(__webpack_require__(9964), exports); +__exportStar(__webpack_require__(6401), exports); +__exportStar(__webpack_require__(1174), exports); +__exportStar(__webpack_require__(9907), exports); +__exportStar(__webpack_require__(6032), exports); +__exportStar(__webpack_require__(5622), exports); +__exportStar(__webpack_require__(2240), exports); +__exportStar(__webpack_require__(4019), exports); +__exportStar(__webpack_require__(361), exports); +__exportStar(__webpack_require__(5960), exports); +__exportStar(__webpack_require__(5515), exports); +__exportStar(__webpack_require__(8752), exports); +__exportStar(__webpack_require__(8834), exports); +__exportStar(__webpack_require__(1025), exports); +__exportStar(__webpack_require__(9116), exports); +__exportStar(__webpack_require__(435), exports); +__exportStar(__webpack_require__(6640), exports); +__exportStar(__webpack_require__(2068), exports); +__exportStar(__webpack_require__(7322), exports); +__exportStar(__webpack_require__(5702), exports); +__exportStar(__webpack_require__(1961), exports); +__exportStar(__webpack_require__(3022), exports); +__exportStar(__webpack_require__(375), exports); +__exportStar(__webpack_require__(4658), exports); +__exportStar(__webpack_require__(4605), exports); +__exportStar(__webpack_require__(5294), exports); +__exportStar(__webpack_require__(3506), exports); +__exportStar(__webpack_require__(7475), exports); +__exportStar(__webpack_require__(8064), exports); +__exportStar(__webpack_require__(7942), exports); +__exportStar(__webpack_require__(2219), exports); +__exportStar(__webpack_require__(1473), exports); +__exportStar(__webpack_require__(1912), exports); +__exportStar(__webpack_require__(6539), exports); +__exportStar(__webpack_require__(4), exports); +__exportStar(__webpack_require__(5334), exports); +__exportStar(__webpack_require__(2173), exports); +__exportStar(__webpack_require__(8349), exports); +__exportStar(__webpack_require__(8142), exports); +__exportStar(__webpack_require__(3980), exports); +__exportStar(__webpack_require__(4701), exports); +__exportStar(__webpack_require__(18), exports); +__exportStar(__webpack_require__(9314), exports); +__exportStar(__webpack_require__(1667), exports); +__exportStar(__webpack_require__(9599), exports); +__exportStar(__webpack_require__(4672), exports); +__exportStar(__webpack_require__(4353), exports); +__exportStar(__webpack_require__(7147), exports); +__exportStar(__webpack_require__(1419), exports); +__exportStar(__webpack_require__(855), exports); +__exportStar(__webpack_require__(3420), exports); +__exportStar(__webpack_require__(408), exports); + + +/***/ }, + +/***/ 1939 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_autocomplete_valid = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +var VisUtil_1 = __webpack_require__(3946); +exports.input_autocomplete_valid = { + id: "input_autocomplete_valid", + context: "dom:input[autocomplete], dom:textarea[autocomplete], dom:select[autocomplete]", + refactor: { + "WCAG21_Input_Autocomplete": { + "Pass_0": "pass", + "Fail_1": "fail_inappropriate", + "Fail_2": "fail_invalid", + "Fail_attribute_incorrect": "fail_incorrect" + } + }, + help: { + "en-US": { + "group": "input_autocomplete_valid.html", + "pass": "input_autocomplete_valid.html", + "fail_inappropriate": "input_autocomplete_valid.html", + "fail_invalid": "input_autocomplete_valid.html", + "fail_incorrect": "input_autocomplete_valid.html" + } + }, + messages: { + "en-US": { + "group": "The 'autocomplete' attribute's token(s) must be appropriate for the input form field", + "pass": "The 'autocomplete' attribute's token(s) is appropriate for the input form field", + "fail_inappropriate": "The 'autocomplete' attribute's token(s) are not appropriate for the input form field", + "fail_invalid": "The 'autocomplete' attribute's token(s) are not appropriate for an input form field of any type", + "fail_incorrect": "The 'autocomplete' attribute has an incorrect value" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.5"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [{ + "73f2c2": { + "pass": "pass", + "fail_inappropriate": "fail", + "fail_invalid": "pass", + "fail_incorrect": "fail" + } + }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) { + return null; + } + var autocompleteAttr = ruleContext.getAttribute("autocomplete").trim().toLowerCase(); + var tokens = autocompleteAttr.split(/\s+/); + if (tokens.length === 0 || autocompleteAttr.length === 0) { + return null; + } + var cache = { + "tokensOnOff": ["on", "off"], + "tokenOptionalSection": "section-", + "tokensOptionalPurpose": ["shipping", "billing"], + "tokensMandatoryGroup1_password": ["new-password", "current-password", "one-time-code"], + "tokensMandatoryGroup1_multiline": ["street-address"], + "tokensMandatoryGroup1_month": ["cc-exp"], + "tokensMandatoryGroup1_numeric": ["cc-exp-month", + "cc-exp-year", + "transaction-amount", + "bday-day", + "bday-month", + "bday-year"], + "tokensMandatoryGroup1_date": ["bday"], + "tokensMandatoryGroup1_url": ["url", "photo"], + "tokensMandatoryGroup1_text": ["name", + "honorific-prefix", + "given-name", + "additional-name", + "family-name", + "honorific-suffix", + "nickname", + "username", + "organization-title", + "organization", + "address-line1", + "address-line2", + "address-line3", + "address-level4", + "address-level3", + "address-level2", + "address-level1", + "country", + "country-name", + "postal-code", + "cc-name", + "cc-given-name", + "cc-additional-name", + "cc-family-name", + "cc-number", + "cc-csc", + "cc-type", + "transaction-currency", + "language", + "sex"], + "tokensMandatoryGroup1_all": ["name", + "honorific-prefix", + "given-name", + "additional-name", + "family-name", + "honorific-suffix", + "nickname", + "username", + "new-password", + "current-password", + "organization-title", + "organization", + "street-address", + "address-line1", + "address-line2", + "address-line3", + "address-level4", + "address-level3", + "address-level2", + "address-level1", + "country", + "country-name", + "postal-code", + "cc-name", + "cc-given-name", + "cc-additional-name", + "cc-family-name", + "cc-number", + "cc-exp", + "cc-exp-month", + "cc-exp-year", + "cc-csc", + "cc-type", + "transaction-currency", + "transaction-amount", + "language", + "bday", + "bday-day", + "bday-month", + "bday-year", + "sex", + "url", + "photo"], + "tokensOptionalGroup2": ["home", + "work", + "mobile", + "fax", + "pager"], + "tokensMandatoryGroup2_tel": ["tel"], + "tokensMandatoryGroup2_email": ["email"], + "tokensMandatoryGroup2_url": ["impp"], + "tokensMandatoryGroup2_text": ["tel-country-code", + "tel-national", + "tel-area-code", + "tel-local", + "tel-local-prefix", + "tel-local-suffix", + "tel-extension"], + "tokensMandatoryGroup2_all": ["tel", + "tel-country-code", + "tel-national", + "tel-area-code", + "tel-local", + "tel-local-prefix", + "tel-local-suffix", + "tel-extension", + "email", + "impp"], + "tokensOptionGroup1_webauthn": ["webauthn"] + }; + var valid_values = []; + for (var key in cache) + valid_values = valid_values.concat(cache[key]); + var foundMandatoryToken = false; + var foundRecognizedToken = true; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (!tokens.every(function (r) { return valid_values.includes(r) || r.startsWith(cache['tokenOptionalSection']); })) + return (0, IRule_1.RuleFail)("fail_incorrect"); + var type = ruleContext.hasAttribute("type") ? ruleContext.getAttribute("type").trim().toLowerCase() : "text"; + var tokensMandatoryGroup1 = []; + var tokensMandatoryGroup2 = []; + var tokensOptionalGroup = []; + if (nodeName === "textarea" || nodeName === "select") { + // accept all tokens + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_all; + tokensMandatoryGroup2 = cache.tokensMandatoryGroup2_all; + if (nodeName === "textarea") + tokensOptionalGroup = cache.tokensOptionGroup1_webauthn; + } + else if (nodeName === "input") { + tokensOptionalGroup = cache.tokensOptionGroup1_webauthn; + // handle the various 'input' types + switch (type) { + // Disable check for input type=hidden for now based on scrum discussion + /* + case "hidden": + // accept all tokens + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_all; + tokensMandatoryGroup2 = cache.tokensMandatoryGroup2_all; + break; + */ + case "text": + case "search": + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_text.concat(cache.tokensMandatoryGroup1_password, cache.tokensMandatoryGroup1_url, cache.tokensMandatoryGroup1_numeric, cache.tokensMandatoryGroup1_month, cache.tokensMandatoryGroup1_date); + tokensMandatoryGroup2 = cache.tokensMandatoryGroup2_all; + break; + case "password": + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_password; + break; + case "url": + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_url; + tokensMandatoryGroup2 = cache.tokensMandatoryGroup2_url; + break; + case "email": + tokensMandatoryGroup2 = cache.tokensMandatoryGroup2_email; + break; + case "tel": + tokensMandatoryGroup2 = cache.tokensMandatoryGroup2_tel; + break; + case "number": + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_numeric; + break; + case "month": + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_month; + break; + case "date": + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_date; + break; + default: + // unsupported type for this rule. + return null; + } + } + else { + // should never get here. + return null; + } + // Disable check for input type=hidden for now based on scrum discussion + var autofillMantle = /* (nodeName==="input" && type==="hidden") ? "anchor" : */ "expectation"; + if (autofillMantle === "expectation") { + // check on|off for expectation mantle. + if (tokens.includes("on") || tokens.includes("off")) { + // on|off should be the only token + if (tokens.length === 1) { + return (0, IRule_1.RulePass)("pass"); + } + else { + return (0, IRule_1.RuleFail)("fail_invalid"); + } + } + } + // check detail autofill tokens + var currIndex = 0; + var currRecognizedIndex = 0; + // check optional 'section-*' tokens + if (tokens[currIndex].startsWith(cache.tokenOptionalSection) && + tokens[currIndex].length > 8) { + currIndex++; // consume token + currRecognizedIndex++; + } + // check optional 'shipping|billing' tokens + if (tokens.length > currIndex && + cache.tokensOptionalPurpose.includes(tokens[currIndex])) { + currIndex++; // consume token + currRecognizedIndex++; + } + // check either mandatory group 1 or 2 tokens + if (tokens.length > currIndex) { + // check mandatory group 1 + if (tokensMandatoryGroup1.includes(tokens[currIndex])) { + foundMandatoryToken = true; + currIndex++; + } + else { + // check optional tokens for group 2 + if (cache.tokensOptionalGroup2.includes(tokens[currIndex])) { + currIndex++; + } + // check mandatory group 2 + if (tokensMandatoryGroup2.includes(tokens[currIndex])) { + foundMandatoryToken = true; + currIndex++; + } + } + } + // check either mandatory group 1 or 2 tokens + if (tokens.length > currRecognizedIndex) { + // check mandatory group 1 + if (cache.tokensMandatoryGroup1_all.includes(tokens[currRecognizedIndex])) { + foundRecognizedToken = true; + currRecognizedIndex++; + } + else { + // check optional tokens for group 2 + if (cache.tokensOptionalGroup2.includes(tokens[currRecognizedIndex])) { + currRecognizedIndex++; + } + // check mandatory group 2 + if (cache.tokensMandatoryGroup2_all.includes(tokens[currRecognizedIndex])) { + foundRecognizedToken = true; + currRecognizedIndex++; + } + } + } + if (tokens.length > currIndex + currRecognizedIndex) { + // check optional tokens webauthn + if (tokensOptionalGroup.includes(tokens[currIndex + currRecognizedIndex])) { + currIndex++; + } + } + if ((tokens.length > currIndex && tokensOptionalGroup.includes(tokens[currIndex])) + || (tokens.length > currRecognizedIndex && tokensOptionalGroup.includes(tokens[currRecognizedIndex]))) { + currIndex++; + currRecognizedIndex++; + } + // Only pass if we have seen either of the mandatory groups and all tokens have been consumed + if (foundMandatoryToken && tokens.length === currIndex) { + return (0, IRule_1.RulePass)("pass"); + } + else if (foundRecognizedToken && tokens.length === currRecognizedIndex) { + return (0, IRule_1.RuleFail)("fail_incorrect"); + } + else { + return (0, IRule_1.RuleFail)("fail_inappropriate"); + } + } +}; + + +/***/ }, + +/***/ 7726 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_checkboxes_grouped = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +var DOMWalker_1 = __webpack_require__(3864); +var CacheUtil_1 = __webpack_require__(4566); +var VisUtil_1 = __webpack_require__(3946); +var TableUtil_1 = __webpack_require__(9196); +exports.input_checkboxes_grouped = { + id: "input_checkboxes_grouped", + context: "dom:input[type=radio], dom:input[type=checkbox]", + refactor: { + "WCAG20_Input_RadioChkInFieldSet": { + "Pass_LoneNogroup": "pass_lonenogroup", + "Pass_Grouped": "pass_grouped", + "Pass_RadioNoName": "pass_radioNoName", + "Fail_ControlNameMismatch": "fail_controlnamemismatch", + "Fail_NotGroupedOtherGrouped": "fail_notgroupedothergrouped", + "Fail_NotGroupedOtherNotGrouped": "fail_notgroupedothernotgrouped", + "Fail_NotSameGroup": "fail_notsamegroup", + "Potential_LoneCheckbox": "potential_lonecheckbox", + "Potential_UnnamedCheckbox": "potential_unnamedcheckbox" + } + }, + help: { + "en-US": { + "group": "input_checkboxes_grouped.html", + "pass_lonenogroup": "input_checkboxes_grouped.html", + "pass_grouped": "input_checkboxes_grouped.html", + "pass_radiononame": "input_checkboxes_grouped.html", + "fail_controlnamemismatch": "input_checkboxes_grouped.html", + "fail_notgroupedothergrouped": "input_checkboxes_grouped.html", + "fail_notgroupedothernotgrouped": "input_checkboxes_grouped.html", + "fail_notsamegroup": "input_checkboxes_grouped.html", + "potential_lonecheckbox": "input_checkboxes_grouped.html", + "potential_unnamedcheckbox": "input_checkboxes_grouped.html" + } + }, + messages: { + "en-US": { + "group": "Related sets of radio buttons or checkboxes should be programmatically grouped", + "pass_lonenogroup": "{0} grouping not required for a control of this type", + "pass_grouped": "{0} input is grouped with other related controls with the same name", + "pass_radiononame": "Radio input is not grouped, but passes because it has no name to group with other radio inputs", + "fail_controlnamemismatch": "{0} input found that has the same name, \"{2}\" as a {1} input", + "fail_notgroupedothergrouped": "{0} input is not in the group with another {0} with the name \"{1}\"", + "fail_notgroupedothernotgrouped": "{0} input and others with the name \"{1}\" are not grouped together", + "fail_notsamegroup": "{0} input is in a different group than another {0} with the name \"{1}\"", + "potential_lonecheckbox": "Verify that this ungrouped checkbox input is not related to other checkboxes", + "potential_unnamedcheckbox": "Verify that this un-named, ungrouped checkbox input is not related to other checkboxes" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var getGroup = function (e) { + var retVal = CommonUtil_1.CommonUtil.getAncestor(e, "fieldset") + || AriaUtil_1.AriaUtil.getAncestorWithRole(e, "radiogroup") + || AriaUtil_1.AriaUtil.getAncestorWithRole(e, "group") + || AriaUtil_1.AriaUtil.getAncestorWithRole(e, "grid") + || AriaUtil_1.AriaUtil.getAncestorWithRole(e, "table"); + if (!retVal) { + retVal = CommonUtil_1.CommonUtil.getAncestor(e, "table"); + if (retVal && !TableUtil_1.TableUtil.isDataTable(retVal)) { + retVal = null; + } + } + return retVal; + }; + // Only radio buttons and checkboxes are in scope + var ctxType = ruleContext.getAttribute("type").toLowerCase(); + // Determine which form we're in (if any) to determine our scope + var ctxForm = AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, "form") + || CommonUtil_1.CommonUtil.getAncestor(ruleContext, "html") + || ruleContext.ownerDocument.documentElement; + // Get data about all of the visible checkboxes and radios in the scope of this form + // and cache it for all of the other inputs in this scope + var formCache = CacheUtil_1.CacheUtil.getCache(ctxForm, "input_checkboxes_grouped", null); + if (!formCache) { + formCache = { + checkboxByName: {}, + radiosByName: {}, + nameToGroup: {}, + numCheckboxes: 0, + numRadios: 0 + }; + // Get all of the checkboxes in the form or body (but not nested in something else and not hidden) + // And get a mapping of these checkboxes to + var cWalker = new DOMWalker_1.DOMWalker(ctxForm, false, ctxForm, true); + var checkboxQ = []; + var radiosQ = []; + while (cWalker.nextNode()) { + if (!cWalker.bEndTag + && cWalker.node.nodeType === 1 + && cWalker.node.nodeName.toLowerCase() === "input" + && VisUtil_1.VisUtil.isNodeVisible(cWalker.node)) { + var type = cWalker.node.getAttribute("type"); + if (type === "checkbox") { + checkboxQ.push(cWalker.node); + } + else if (type === "radio") { + radiosQ.push(cWalker.node); + } + } + } + // let checkboxQ = ctxForm.querySelectorAll("input[type=checkbox]"); + for (var idx = 0; idx < checkboxQ.length; ++idx) { + var cb = checkboxQ[idx]; + if ((AriaUtil_1.AriaUtil.getAncestorWithRole(cb, "form") + || CommonUtil_1.CommonUtil.getAncestor(ruleContext, "html") + || ruleContext.ownerDocument.documentElement) === ctxForm + && !CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(cb)) { + var name_1 = cb.getAttribute("name") || ""; + (formCache.checkboxByName[name_1] = formCache.checkboxByName[name_1] || []).push(cb); + formCache.nameToGroup[name_1] = formCache.nameToGroup[name_1] || getGroup(cb); + ++formCache.numCheckboxes; + } + } + // Get all of the radios in the form or body (but not nested in something else and not hidden) + // let radiosQ = ctxForm.querySelectorAll("input[type=radio]"); + for (var idx = 0; idx < radiosQ.length; ++idx) { + var r = radiosQ[idx]; + var radCtx = (AriaUtil_1.AriaUtil.getAncestorWithRole(r, "form") + || CommonUtil_1.CommonUtil.getAncestor(ruleContext, "html") + || ruleContext.ownerDocument.documentElement); + if (radCtx === ctxForm + && !CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(r)) { + var name_2 = r.getAttribute("name") || ""; + (formCache.radiosByName[name_2] = formCache.radiosByName[name_2] || []).push(r); + formCache.nameToGroup[name_2] = formCache.nameToGroup[name_2] || getGroup(r); + ++formCache.numRadios; + } + } + CacheUtil_1.CacheUtil.setCache(ctxForm, "input_checkboxes_grouped", formCache); + } + ///////////// Calculated everything, now check the various cases + var ctxName = ruleContext.getAttribute("name"); + var ctxGroup = getGroup(ruleContext); + ctxType = ctxType === "radio" ? "Radio" : "Checkbox"; + if (!ctxName || ctxName === "") { + // First process cases where the control is not named + if (ctxType === "Radio") { + // Radios without names don't act like groups, so don't enforce grouping + if (ctxGroup === null) { + return (0, IRule_1.RulePass)("pass_radiononame", [ctxType]); + } + else { + return (0, IRule_1.RulePass)("pass_grouped", [ctxType]); + } + } + else { + // Must be an unnamed checkbox + if (ctxGroup === null) { + if ((formCache.checkboxByName[""] || []).length > 1) { + return (0, IRule_1.RulePotential)("potential_unnamedcheckbox", [ctxType]); + } + else { + return (0, IRule_1.RulePass)("pass_lonenogroup", [ctxType]); + } + } + else { + return (0, IRule_1.RulePass)("pass_grouped", [ctxType]); + } + } + } + else { + // Considering a named checkbox + var numRadiosWithName = (formCache.radiosByName[ctxName] || []).length; + var numCheckboxesWithName = (formCache.checkboxByName[ctxName] || []).length; + // Capitalize the input type for messages + if (numRadiosWithName > 0 && numCheckboxesWithName > 0) { + // We have a naming mismatch between different controls + return (0, IRule_1.RuleFail)("fail_controlnamemismatch", [ctxType, ctxType === "checkbox" ? "radio" : "checkbox", ctxName]); + } + else if (ctxType === "Radio" && (formCache.numRadios === 1 || numRadiosWithName === 1) + || ctxType === "Checkbox" && formCache.numCheckboxes === 1) { + // This is a lone control (either only control of this type on the page, or a radio button without any others by that name) + // We pass this control in all cases + if (ctxGroup === null) { + return (0, IRule_1.RulePass)("pass_lonenogroup", [ctxType]); + } + else { + return (0, IRule_1.RulePass)("pass_grouped", [ctxType]); + } + } + else if (ctxType === "Checkbox" && formCache.numCheckboxes > 1 && numCheckboxesWithName === 1) { + // We have only one checkbox with this name, but there are other checkboxes in the form. + // If we're not grouped, ask them to examine it + if (ctxGroup === null) { + return (0, IRule_1.RulePotential)("potential_lonecheckbox", [ctxType]); + } + else { + return (0, IRule_1.RulePass)("pass_grouped", [ctxType]); + } + } + else { + // We share a name with another similar control. Are we grouped together? + if (ctxGroup === null) { + if (formCache.nameToGroup[ctxName] !== null) { + // We're not grouped, but some control with the same name is in a group + return (0, IRule_1.RuleFail)("fail_notgroupedothergrouped", [ctxType, ctxName]); + } + else { + // None of us are grouped + return (0, IRule_1.RuleFail)("fail_notgroupedothernotgrouped", [ctxType, ctxName]); + } + } + else if (formCache.nameToGroup[ctxName] !== ctxGroup) { + // We're not in the main group with the others + return (0, IRule_1.RuleFail)("fail_notsamegroup", [ctxType, ctxName]); + } + else { + // We're all grouped up! + return (0, IRule_1.RulePass)("pass_grouped", [ctxType]); + } + } + } + } +}; + + +/***/ }, + +/***/ 3142 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_fields_grouped = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +exports.input_fields_grouped = { + id: "input_fields_grouped", + context: "dom:input, dom:textarea, dom:select", + refactor: { + "WCAG20_Input_InFieldSet": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "input_fields_grouped.html", + "Potential_1": "input_fields_grouped.html", + "group": "input_fields_grouped.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Use the <fieldset> element to group logically related input elements", + "group": "Groups of logically related input elements should be contained within a <fieldset> element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Don't trigger for other input types or if we're in a fieldset + if (ruleContext.nodeName.toLowerCase() == "input" && ruleContext.hasAttribute("type")) { + var type = ruleContext.getAttribute("type").toLowerCase(); + if (type != "text" && type != "file" && type != "password") + return (0, IRule_1.RulePass)("Pass_0"); + } + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, "fieldset") != null) + return (0, IRule_1.RulePass)("Pass_0"); + // No fieldset - see if this input is all by itself - no need to group single inputs + var parent = CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["form", "body"]); + var checkTypes = ["input", "textarea", "select"]; + var passed = true; + for (var i = 0; passed && i < checkTypes.length; ++i) { + var controls = parent.getElementsByTagName(checkTypes[i]); + for (var j = 0; passed && j < controls.length; ++j) { + // Check if the node should be skipped or not based on the Check Hidden Content setting and if the node isVisible or + // not. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(controls[j])) { + continue; + } + // Note that textareas and selects will be called type='text' + var type = controls[j].hasAttribute("type") ? controls[j].getAttribute("type").toLowerCase() : "text"; + // Only fail if this is another control in the form and its type is another text-like input + passed = controls[j] == ruleContext || (type != "text" && type != "password" && type != "file"); + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ 1353 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_haspopup_conflict = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +var VisUtil_1 = __webpack_require__(3946); +exports.input_haspopup_conflict = { + id: "input_haspopup_conflict", + context: "dom:input[list][aria-haspopup]", + refactor: { + "input_haspopup_invalid": { + // "Pass": "pass", + "Potential_1": "potential_type_misuse", + "Potential_2": "potential_misuse" + } + }, + help: { + "en-US": { + "group": "input_haspopup_conflict.html", + // "pass": "input_haspopup_conflict.html", + "potential_type_misuse": "input_haspopup_conflict.html", + "potential_misuse": "input_haspopup_conflict.html", + "potential_list_notexist": "input_haspopup_conflict.html", + "fail_invalid_list_type": "input_haspopup_conflict.html", + "fail_invalid_list_elem": "input_haspopup_conflict.html" + } + }, + messages: { + "en-US": { + "group": "<input> element with a 'list' attribute should not use an explicit 'aria-haspopup' attribute", + // "pass": "The <input> element with a 'list' attribute does not use an explicit 'aria-haspopup' attribute", + "potential_type_misuse": "The <input> element with type \"{0}\" and 'list' attribute uses an explicit 'aria-haspopup' attribute", + "potential_misuse": "The <input> element with a missing or invalid type and 'list' attribute uses an explicit 'aria-haspopup' attribute", + "potential_list_notexist": "The list attribute for the <input> element is invalid", + "fail_invalid_list_type": "The list attribute for the <input> element with the type \"{0}\" is invalid", + "fail_invalid_list_elem": "The list attribute for the <input> element does not reference a datalist element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip if the fieldset is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return null; + var roles = AriaUtil_1.AriaUtil.getUserDefinedRoles(ruleContext); + // let "aria_role_valid" to handle invalid role. Only allowed role is combobox which is implicit. + if (roles && roles.length > 0 && !roles.includes('combobox')) + return null; + //triggering input types: text, search, tel, url, email, or missing or invalid + var yesTypes = ["text", "search", "tel", "url", "email", "date", "month", "week", "time", "datetime-local", "number", "range", "color"]; + var noTypes = ["file", "password", "checkbox", "radio", "submit", "reset", "image", "hidden", "button"]; + var attrValue = ruleContext.getAttribute("type"); + //missing input type for list but with aria_has_popup + if (!attrValue || attrValue.trim().length === 0) + return (0, IRule_1.RulePotential)("potential_misuse"); + attrValue = attrValue.trim().toLowerCase(); + //invalid input types for list but with aria_has_popup + if (!yesTypes.includes(attrValue) && !noTypes.includes(attrValue)) + return (0, IRule_1.RulePotential)("potential_misuse"); + // the list attribute is used for wrong input type + if (attrValue && noTypes.includes(attrValue)) + return (0, IRule_1.RuleFail)("fail_invalid_list_type"); + var list = ruleContext.getAttribute("list"); + // the list attribute is blank + if (!list || list.trim().length === 0) + return (0, IRule_1.RulePotential)("potential_list_notexist"); + var listElem = ruleContext.ownerDocument.getElementById(list); + // the list element doesn't exist + if (!listElem) + return (0, IRule_1.RuleFail)("potential_list_notexist"); + // the list element is not a datalist element + if (listElem.nodeName.toLowerCase() !== 'datalist') + return (0, IRule_1.RuleFail)("fail_invalid_list_elem"); + // valid input types for list but with aria_has_popup + if (yesTypes.includes(attrValue)) + return (0, IRule_1.RulePotential)("potential_type_misuse", [attrValue]); + // shouldn't get here + return; + } +}; + + +/***/ }, + +/***/ 2631 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_label_after = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var DOMWalker_1 = __webpack_require__(3864); +var CommonUtil_1 = __webpack_require__(7139); +exports.input_label_after = { + id: "input_label_after", + context: "dom:input", + refactor: { + "WCAG20_Input_LabelAfter": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_0": "input_label_after.html", + "Fail_1": "input_label_after.html", + "Fail_2": "input_label_after.html", + "group": "input_label_after.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Checkbox or radio button is nested in label, so label is not after the input control", + "Fail_2": "Label text is located before its associated checkbox or radio button element", + "group": "Checkboxes and radio buttons must have a label after the input control" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.3.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var type = ""; + if (ruleContext.hasAttribute("type")) + type = ruleContext.getAttribute("type").toLowerCase(); + if (type != "checkbox" && type != "radio") { + return null; + } + // Get only the non-hidden labels for element + var labelElem = CommonUtil_1.CommonUtil.getLabelForElementHidden(ruleContext, true); + if (labelElem === null || !CommonUtil_1.CommonUtil.hasInnerContentHidden(labelElem)) { + // Due to dependency, label must be done via title - this rule doesn't apply + return null; + } + var value = CommonUtil_1.CommonUtil.compareNodeOrder(labelElem, ruleContext); + var passed; + if (value === -2) { + // input nested in label + passed = false; + var walkNode = new DOMWalker_1.DOMWalker(labelElem); + walkNode.node = ruleContext; + while (!passed && walkNode.nextNode()) { + passed = ((walkNode.node.nodeName.toLowerCase() === "#text" && walkNode.node.nodeValue.trim().length > 0) + || (walkNode.node.nodeName.toLowerCase() === "span" && walkNode.node.textContent.trim().length > 0)); + } + if (!passed) { + // Input nested in label and text before input + return (0, IRule_1.RuleFail)("Fail_1"); + } + } + else { + if (value != 1) { + // label is before input + return (0, IRule_1.RuleFail)("Fail_2"); + } + } + return (0, IRule_1.RulePass)("Pass_0"); + } +}; + + +/***/ }, + +/***/ 8550 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_label_before = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +exports.input_label_before = { + id: "input_label_before", + context: "dom:input, dom:textarea, dom:select", + refactor: { + "WCAG20_Input_LabelBefore": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_0": "input_label_before.html", + "Fail_1": "input_label_before.html", + "Fail_2": "input_label_before.html", + "group": "input_label_before.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Text input is nested in label such that input precedes the label text", + "Fail_2": "Label text is located after its associated text input or <select> element", + "group": "Text inputs and <select> elements must have a label before the input control" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.3.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (ruleContext.nodeName.toLowerCase() == "input" && ruleContext.hasAttribute("type")) { + var type = ruleContext.getAttribute("type").toLowerCase(); + if (type != "text" && type != "file" && type != "password") { + return null; + } + } + // Get only the non-hidden labels for element + var labelElem = CommonUtil_1.CommonUtil.getLabelForElementHidden(ruleContext, true); + if (labelElem == null || !CommonUtil_1.CommonUtil.hasInnerContentHidden(labelElem)) { + // Due to dependency, label must be done via title - this rule doesn't apply + return null; + } + var value = CommonUtil_1.CommonUtil.compareNodeOrder(labelElem, ruleContext); + if (value === -2) { + // ignore if no label or the content for the label is only from the nested input control + var text = CommonUtil_1.CommonUtil.getInnerText(ruleContext); + if (text && text.trim().length > 0 && CommonUtil_1.CommonUtil.getInnerText(ruleContext).trim() === text.trim()) { + // Due to dependency, label must be done via title - this rule doesn't apply + return null; + } + // input nested in label + var passed = false; + var walkNode = ruleContext.previousSibling; + while (!passed && walkNode !== null) { + passed = ((walkNode.nodeName.toLowerCase() == "#text" && walkNode.nodeValue.trim().length > 0) + || (walkNode.nodeName.toLowerCase() == "span" && walkNode.textContent.trim().length > 0)); + walkNode = walkNode.previousSibling; + } + if (!passed) { + // Input nested in label and text after input + return (0, IRule_1.RuleFail)("Fail_1"); + } + } + else { + if (value != -1) { + // label is after input + return (0, IRule_1.RuleFail)("Fail_2"); + } + } + // Haven't returned yet, then I pass + return (0, IRule_1.RulePass)("Pass_0"); + } +}; + + +/***/ }, + +/***/ 8853 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_label_exists = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var VisUtil_1 = __webpack_require__(3946); +var AccNameUtil_1 = __webpack_require__(1950); +exports.input_label_exists = { + id: "input_label_exists", + context: "aria:button,aria:checkbox,aria:combobox,aria:listbox,aria:menuitemcheckbox,aria:menuitemradio,aria:radio,aria:searchbox,aria:slider,aria:spinbutton,aria:switch,aria:textbox,aria:progressbar,dom:input[type=file],dom:output,dom:meter,dom:input[type=password]", + //dependencies: ["aria_role_redundant", "aria_role_valid"], + refactor: { + "WCAG20_Input_ExplicitLabel": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_0": "input_label_exists.html", + "Fail_1": "input_label_exists.html", + "Fail_2": "input_label_exists.html", + "group": "input_label_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Form control element <{0}> has no associated label", + "Fail_2": "Form control with \"{0}\" role has no associated label", + "group": "Each form control must have an associated label" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + // TODO: ACT: https://github.com/IBMa/equal-access/issues/756 + act: ["97a4e1", "e086e5"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) { + return null; + } + var nodeName = ruleContext.nodeName.toLowerCase(); + //ignore datalist element check since it will be part of a input element or hidden by default + if (nodeName === 'datalist') + return null; + // Determine the input type + var passed = true; + var type = "text"; + if (nodeName == "input" && ruleContext.hasAttribute("type")) { + type = ruleContext.getAttribute("type").toLowerCase(); + } + else if (nodeName === "button" || AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "button")) { + type = "buttonelem"; + } + if (nodeName == "input" && type == "") { + type = "text"; + } + if (type === "image") { + // Handled by input_label_existsImage + return null; + } + /** + let POF = -1; + let textTypes = CommonUtil.input_text_types; + let buttonTypes = CommonUtil.form_button_types; + + let buttonTypesWithDefaults = ["reset", "submit"]; // 'submit' and 'reset' have visible defaults. + if (textTypes.indexOf(type) !== -1) { // If type is in the list + // Get only the non-hidden labels for elements, in the case that a label is hidden then it is a violation + // Note: label[for] does not work for ARIA defined inputs + let labelElem = ruleContext.hasAttribute("role") ? null : CommonUtil.getLabelForElementHidden(ruleContext, true); + let hasLabelElemContent = false; + if (labelElem) { + if (CommonUtil.hasInnerContentHidden(labelElem)) { + hasLabelElemContent = true; + } else if ((labelElem.getAttribute("aria-label") || "").trim().length > 0) { + hasLabelElemContent = true; + } else if (labelElem.hasAttribute("aria-labelledby")) { + let labelledByElem = FragmentUtil.getById(labelElem, labelElem.getAttribute('aria-labelledby')); + if (labelledByElem && !DOMUtil.sameNode(labelledByElem, labelElem) && CommonUtil.hasInnerContent(labelledByElem)) { + hasLabelElemContent = true; + } + } + } + passed = (!!labelElem && hasLabelElemContent) || + (!labelElem && CommonUtil.attributeNonEmpty(ruleContext, "title") || CommonUtil.attributeNonEmpty(ruleContext, "placeholder")) || + AriaUtil.getAriaLabel(ruleContext).trim().length > 0 || CommonUtil.hasImplicitLabel(ruleContext); + if (!passed) POF = 2 + textTypes.indexOf(type); + + } else if (buttonTypes.indexOf(type) !== -1) { // If type is a button + if (buttonTypesWithDefaults.indexOf(type) !== -1 && !ruleContext.hasAttribute("value")) { + // 'submit' and 'reset' have visible defaults so pass if there is no 'value' attribute + passed = true; + } else { + passed = CommonUtil.attributeNonEmpty(ruleContext, "value") || AriaUtil.hasAriaLabel(ruleContext) || CommonUtil.attributeNonEmpty(ruleContext, "title"); + if (!passed) POF = 2 + textTypes.length + buttonTypes.indexOf(type); + } + } else if (type == "buttonelem") { + // If I am an image and I have alt text - accessibility-web-engine#269 + let bAlt = false; + if (ruleContext.nodeName.toLowerCase() === "img" && ruleContext.hasAttribute("alt")) { + let alt = ruleContext.getAttribute("alt"); + if (alt.trim().length === 0) { + bAlt = false; + } else { + bAlt = true; + } + }; + passed = CommonUtil.hasInnerContentHidden(ruleContext) || AriaUtil.hasAriaLabel(ruleContext) || bAlt || CommonUtil.attributeNonEmpty(ruleContext, "title"); + + if (!passed) POF = 2 + textTypes.length + buttonTypes.length + 1; + } + + //check if a native button is labelled + if (!passed && nodeName == "button") { + if (CommonUtil.hasImplicitLabel(ruleContext)) + passed = true; + else { + let label = CommonUtil.getLabelForElement(ruleContext); + if (label && CommonUtil.hasInnerContentHidden(label)) + passed = true; + } + } + + // Rpt_Aria_ValidIdRef determines if the aria-labelledby id points to a valid element + if (!passed && (buttonTypes.indexOf(type) !== -1)) { + if (ruleContext.hasAttribute("class") && ruleContext.getAttribute("class") == "dijitOffScreen" && DOMWalker.parentElement(ruleContext).hasAttribute("widgetid")) { + // Special handling for dijit buttons + let labelId = DOMWalker.parentElement(ruleContext).getAttribute("widgetid") + "_label"; + let label = FragmentUtil.getById(ruleContext, labelId); + if (label != null) { + passed = CommonUtil.hasInnerContentHidden(label); + // This means I failed above also + if (!passed) POF = 2 + textTypes.length + buttonTypes.length + 4 + buttonTypes.indexOf(type); + } + } + } + + if (!passed && nodeName == "optgroup") { + passed = CommonUtil.attributeNonEmpty(ruleContext, "label"); + if (!passed) POF = 2 + textTypes.length + buttonTypes.length + 2; + } + if (!passed && nodeName == "option") { + // Is a non-empty value attribute also enough for an option element? + passed = CommonUtil.attributeNonEmpty(ruleContext, "label") || ruleContext.innerHTML.trim().length > 0; + if (!passed) POF = 2 + textTypes.length + buttonTypes.length + 3; + } + + if (!passed) + passed = AriaUtil.getAriaLabel(ruleContext).trim().length > 0 || CommonUtil.attributeNonEmpty(ruleContext, "title"); + + if (!passed) { + // check aria role to figure out if the accessible name can be from content + const roles = AriaUtil.getRoles(ruleContext, true); + //when multiple roles specified, only the first valid role (guaranteed by dependencies) is applied, and the others just as fallbacks + if (ARIADefinitions.designPatterns[roles[0]] && ARIADefinitions.designPatterns[roles[0]].nameFrom && ARIADefinitions.designPatterns[roles[0]].nameFrom.includes("contents")) + passed = CommonUtil.hasInnerContentHidden(ruleContext); + } + */ + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + passed = pair && pair.name && pair.name.trim().length > 0; + if (passed) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else if (ruleContext.hasAttribute("role") && ruleContext.getAttribute("role").trim().length > 0) { + return (0, IRule_1.RuleFail)("Fail_2", ruleContext.getAttribute("role").split(" ")); + } + else { + return (0, IRule_1.RuleFail)("Fail_1", [nodeName]); + } + } +}; + + +/***/ }, + +/***/ 3180 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_label_visible = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +var fragment_1 = __webpack_require__(5279); +var VisUtil_1 = __webpack_require__(3946); +var DOMUtil_1 = __webpack_require__(1686); +var AccNameUtil_1 = __webpack_require__(1950); +exports.input_label_visible = { + id: "input_label_visible", + context: "aria:button,aria:checkbox,aria:combobox,aria:listbox,aria:menuitemcheckbox,aria:menuitemradio,aria:radio,aria:searchbox,aria:slider,aria:spinbutton,aria:switch,aria:textbox", + dependencies: ["input_label_exists"], + refactor: { + "WCAG20_Input_VisibleLabel": { + "Pass_0": "pass", + "Potential_1": "potential_no_label", + "potential_placeholder_only": "potential_placeholder_only" + } + }, + help: { + "en-US": { + "pass": "input_label_visible.html", + "potential_placeholder_only": "input_label_visible.html", + "potential_no_label": "input_label_visible.html", + "group": "input_label_visible.html" + } + }, + messages: { + "en-US": { + "pass": "The input element has an associated visible label", + "potential_placeholder_only": "The ‘placeholder’ is the only visible label", + "potential_no_label": "The input element does not have an associated visible label", + "group": "An input element must have an associated visible label" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.5.3", "3.3.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + //ignore datalist element check since it will be part of a input element or hidden by default + if (nodeName === 'datalist') + return null; + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return null; + // if a control is in a table cell, the col headers can act as visible label, which is checked in table heading rule + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, "table")) + return null; + // custom widget submission is not in scope for this success criteria (IBMa/equal-access#204) if it is not associated with data entry + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + if (role && role === "button" && nodeName !== 'input' && nodeName !== 'button') { + // likely a custom widget, skip if not associated with data entry + if (!CommonUtil_1.CommonUtil.getAncestor(ruleContext, "form")) + return null; + } + // when in a combobox, only look at the input textbox. + if (AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, "combobox") && + !(AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "textbox") || AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "searchbox") || + nodeName === "input" || (nodeName === "select" && AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "combobox")))) { + return null; + } + // avoid diagnosing the popup list of a combobox. + var rolesToCheck = ["listbox", "tree", "grid", "dialog"]; + for (var j = 0; j < rolesToCheck.length; j++) { + if (AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, rolesToCheck[j])) { + var comboboxes = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "combobox", true, true); + for (var k = 0; k < comboboxes.length; k++) { + var combobox = comboboxes[k]; + var aria_owns = CommonUtil_1.CommonUtil.getElementAttribute(combobox, "aria-owns"); + if (aria_owns) { + var owns = CommonUtil_1.CommonUtil.normalizeSpacing(aria_owns.trim()).split(" "); + for (var i = 0; i < owns.length; i++) { + var owned = fragment_1.FragmentUtil.getById(ruleContext, owns[i]); + if (owned === ruleContext) { + return null; + } + } + } + } + } + } + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + // check visible label for input or button + if (nodeName === 'input' || nodeName === 'button') { + if (pair && pair.name && pair.name.trim().length > 0 && (pair.nameFrom === 'label' || pair.nameFrom === 'internal' || pair.nameFrom === 'alt')) + return (0, IRule_1.RulePass)("pass"); + } + // check if an alternative tooltip exists that can be made visible through mouseover + if (pair && pair.name && pair.name.trim().length > 0 && (pair.nameFrom === 'text' || pair.nameFrom === 'title')) + return (0, IRule_1.RulePass)("pass"); + // check if any visible text from the control. + // note that (1) the text doesn’t need to be associated with the control to form a relationship + // (2) the text doesn't need to follow accessible name requirement (e.g. nameFrom) + var text = CommonUtil_1.CommonUtil.getOnScreenInnerText(ruleContext); + if (text && text.length !== 0) + return (0, IRule_1.RulePass)("pass"); + // check if any descendant with an alternative tooltip that can be made visible through mouseover + // only consider img and svg, and other text content of the descendant is covered in the isInnerText above + var descendants = AriaUtil_1.AriaUtil.getAllDescendantsWithRoles(ruleContext, ["img", "graphics-document", "graphics-object", "graphics-symbol"], false, true); + if (descendants && descendants.length > 0) { + for (var d = 0; d < descendants.length; d++) { + if (CommonUtil_1.CommonUtil.attributeNonEmpty(descendants[d], "title") || CommonUtil_1.CommonUtil.attributeNonEmpty(descendants[d], "alt")) + return (0, IRule_1.RulePass)("pass"); + } + } + // check if there is a visible label pointed to by the aria-labelledby attribute. + if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "aria-labelledby")) { + var theLabel = ruleContext.getAttribute("aria-labelledby"); + var labelValues = theLabel.split(/\s+/); + for (var j = 0; j < labelValues.length; ++j) { + var elementById = fragment_1.FragmentUtil.getById(ruleContext, labelValues[j]); + if (elementById && !DOMUtil_1.DOMUtil.sameNode(elementById, ruleContext) && VisUtil_1.VisUtil.isNodeVisible(elementById) && CommonUtil_1.CommonUtil.hasInnerContentHidden(elementById)) { + return (0, IRule_1.RulePass)("pass"); + } + } + } + if ((nodeName === "optgroup" || nodeName == "option") && (pair && pair.name && pair.name.trim().length > 0 && (pair.nameFrom === 'label' || pair.nameFrom === 'content'))) + return (0, IRule_1.RulePass)("pass"); + // Determine if this is referenced by a combobox. If so, the label belongs to the combobox + var id = ruleContext.getAttribute("id"); + if (id && id.trim().length > 0) { + if (ruleContext.ownerDocument.querySelector("*[aria-controls='".concat(id, "'][role='combobox']"))) { + return null; + } + } + // check if a placeholder exists even though a placeholder text is not sufficient as a visible text + if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "placeholder")) + return (0, IRule_1.RulePotential)("potential_placeholder_only"); + return (0, IRule_1.RulePotential)("potential_no_label"); + } +}; + + +/***/ }, + +/***/ 1382 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_onchange_review = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +exports.input_onchange_review = { + id: "input_onchange_review", + context: "dom:input[onchange], dom:textarea[onchange], dom:select[onchange]", + refactor: { + "WCAG20_Input_HasOnchange": { + // "Pass_0": "pass", + "Potential_1": "potential_warning" + } + }, + help: { + "en-US": { + // "pass": "input_onchange_review.html", + "potential_warning": "input_onchange_review.html", + "group": "input_onchange_review.html" + } + }, + messages: { + "en-US": { + "group": "Users must be advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs", + // "pass": "The user is advised of the automatic form submission, new window opening, or focus change", + "potential_warning": "Confirm that the user is advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.2.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (ruleContext.nodeName.toLowerCase() == "input" && ruleContext.hasAttribute("type")) { + var type = ruleContext.getAttribute("type").toLowerCase(); + if (type === "hidden" || type === "submit" || type === "image" || type === "button" || type === "reset") + return null; + } + return (0, IRule_1.RulePotential)("potential_warning"); + } +}; + + +/***/ }, + +/***/ 953 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_placeholder_label_visible = void 0; +var IRule_1 = __webpack_require__(461); +exports.input_placeholder_label_visible = { + id: "input_placeholder_label_visible", + context: "dom:input[placeholder], dom:textarea[placeholder]", + refactor: { + "HAAC_Input_Placeholder": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1", + "Potential_2": "Potential_2" + } + }, + help: { + "en-US": { + "Pass_0": "input_placeholder_label_visible.html", + "Potential_1": "input_placeholder_label_visible.html", + "Potential_2": "input_placeholder_label_visible.html", + "group": "input_placeholder_label_visible.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "HTML5 placeholder is the only visible label", + "Potential_2": "Additional visible label referenced by 'aria-labelledby' is not valid", + "group": "HTML5 'placeholder' attribute must not be used as a visible label replacement" + } + }, + /** + * merge the rule into input_label_visible + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.3.2"], + "level": eRulePolicy.VIOLATION, + "toolkitLevel": eToolkitLevel.LEVEL_ONE + }], + */ + rulesets: [], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (ruleContext.hasAttribute("type")) { + var type = ruleContext.getAttribute("type").toLowerCase(); + if (type == "hidden" || type == "button") { + return (0, IRule_1.RulePass)("Pass_0"); + } + } + if (ruleContext.hasAttribute("hidden")) { + var hidden = ruleContext.getAttribute("hidden"); + if (hidden == "" || hidden.toLowerCase() == "hidden") { // when hidden is empty in the element, "" is returned, same as it has a value of "". + return (0, IRule_1.RulePass)("Pass_0"); + } + } + if (ruleContext.hasAttribute("aria-label")) { + return (0, IRule_1.RulePotential)("Potential_1"); + } + if (ruleContext.hasAttribute("aria-labelledby") && ruleContext.hasAttribute("id")) { + var id = ruleContext.getAttribute("id").trim(); + var refIds = ruleContext.getAttribute("aria-labelledby").trim().split(/\s+/); // separated by one or more white spaces + if (!refIds.includes(id)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RulePotential)("Potential_2"); + } + } + return (0, IRule_1.RulePass)("Pass_0"); + } +}; + + +/***/ }, + +/***/ 2222 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.label_content_exists = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +var fragment_1 = __webpack_require__(5279); +var DOMUtil_1 = __webpack_require__(1686); +exports.label_content_exists = { + id: "label_content_exists", + context: "dom:label", + refactor: { + "Valerie_Label_HasContent": { + "Pass_Regular": "Pass_Regular", + "Pass_AriaLabel": "Pass_AriaLabel", + "Pass_LabelledBy": "Pass_LabelledBy", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_Regular": "label_content_exists.html", + "Pass_AriaLabel": "label_content_exists.html", + "Pass_LabelledBy": "label_content_exists.html", + "Fail_1": "label_content_exists.html", + "group": "label_content_exists.html" + } + }, + messages: { + "en-US": { + "Pass_Regular": "<label> element has accessible name with inner content", + "Pass_AriaLabel": "<label> element has accessible name via 'aria-label'", + "Pass_LabelledBy": "<label> element has accessible name via 'aria-labelledby'", + "Fail_1": "The <label> element does not have descriptive text that identifies the expected input", + "group": "A <label> element must have non-empty descriptive text that identifies the purpose of the interactive component" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (CommonUtil_1.CommonUtil.hasInnerContentHidden(ruleContext)) { + return (0, IRule_1.RulePass)("Pass_Regular"); + } + else if ((ruleContext.getAttribute("aria-label") || "").trim().length > 0) { + return (0, IRule_1.RulePass)("Pass_AriaLabel"); + } + else if (ruleContext.hasAttribute("aria-labelledby")) { + var labelElem = fragment_1.FragmentUtil.getById(ruleContext, ruleContext.getAttribute('aria-labelledby')); + if (labelElem && !DOMUtil_1.DOMUtil.sameNode(labelElem, ruleContext) && CommonUtil_1.CommonUtil.hasInnerContent(labelElem)) { + return (0, IRule_1.RulePass)("Pass_LabelledBy"); + } + } + return (0, IRule_1.RuleFail)("Fail_1"); + } +}; + + +/***/ }, + +/***/ 4678 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.label_name_visible = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +var fragment_1 = __webpack_require__(5279); +var VisUtil_1 = __webpack_require__(3946); +var CSSUtil_1 = __webpack_require__(4919); +var DOMWalker_1 = __webpack_require__(3864); +exports.label_name_visible = { + id: "label_name_visible", + context: "aria:button,aria:checkbox,aria:gridcell,aria:link,aria:menuitem,aria:menuitemcheckbox,aria:menuitemradio,aria:option,aria:radio,aria:switch,aria:tab,aria:treeitem,dom:input,dom:textarea,dom:select,dom:output,dom:meter", + refactor: { + "WCAG21_Label_Accessible": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "label_name_visible.html", + "Fail_1": "label_name_visible.html", + "group": "label_name_visible.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Accessible name matches or contains the visible label text", + "Fail_1": "Accessible name does not match or contain the visible label text", + "group": "Accessible name must match or contain the visible label text" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_2"], + "num": ["2.5.3"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + // TODO: ACT: Review https://github.com/act-rules/act-rules.github.io/issues/1618 + // https://www.w3.org/WAI/WCAG21/Techniques/aria/ARIA24 + act: "2ee8b8", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || + CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) { + return null; + } + // pass if the visible text uses Material Icon font + if (CSSUtil_1.CSSUtil.isMaterialIconFont(ruleContext)) + return (0, IRule_1.RulePass)("Pass_0"); + var passed = true; + var nodeName = ruleContext.nodeName.toLowerCase(); + var isInputButton = false; + //let buttonTypes = ["button", "reset", "submit"]; //"image" + var inputType = null; + if (nodeName === "input" && ruleContext.hasAttribute("type")) { + inputType = ruleContext.getAttribute("type").toLowerCase(); + if (CommonUtil_1.CommonUtil.form_button_types.indexOf(inputType) !== -1) { + isInputButton = true; + } + } + var theLabelBy = AriaUtil_1.AriaUtil.getAriaAttribute(ruleContext, "aria-labelledby"); + if (theLabelBy && !CommonUtil_1.CommonUtil.isIdReferToSelf(ruleContext, theLabelBy) && !isInputButton) { + // skip the checks if it has an aria-labelledby since it takes precedence. + } + else { + var theLabel = null; + if (theLabelBy && !CommonUtil_1.CommonUtil.isIdReferToSelf(ruleContext, theLabelBy)) { + var labelValues = theLabelBy.split(/\s+/); + for (var j = 0; j < labelValues.length; ++j) { + var elementById = fragment_1.FragmentUtil.getById(ruleContext, labelValues[j]); + if (elementById) { + theLabel = CommonUtil_1.CommonUtil.getInnerText(elementById); + break; + } + } + } + else { + theLabel = AriaUtil_1.AriaUtil.getAriaAttribute(ruleContext, "aria-label"); + } + if (!theLabel) { + return null; + } + var text = null; + if (isInputButton) { + /* Note: Disable the alt check in images until we get confirmation + if (inputType==="image" && ruleContext.hasAttribute("alt")){ + // use 'alt' attribute as visible text + text = ruleContext.getAttribute("alt"); + }else + */ + if (ruleContext.hasAttribute("value")) { + // use 'value' attribute as visible text + text = ruleContext.getAttribute("value"); + } + else { + // use default value + if (inputType === "submit" /*||inputType==="image"*/) { + text = "submit"; + } + else if (inputType === "reset") { + text = "reset"; + } + } + } + if (!text) { + // look for a <label> element + var labelElem = CommonUtil_1.CommonUtil.getLabelForElementHidden(ruleContext, true); + if (!labelElem) { + var parentNode = DOMWalker_1.DOMWalker.parentNode(ruleContext); + if (parentNode.nodeName.toLowerCase() === "label" /*&& RPTUtil.isFirstFormElement(parentNode, ruleContext)*/) { + var parentClone = parentNode.cloneNode(true); + // exclude all form elements from the label since they might also have inner content + labelElem = CommonUtil_1.CommonUtil.removeAllFormElementsFromLabel(parentClone); + } + } + var element = labelElem ? labelElem : ruleContext; + var elementsToSkipContentCheck = ["meter", "output", "progress", "select", "textarea"]; + if (!labelElem && elementsToSkipContentCheck.indexOf(nodeName) !== -1) { + text = ""; // skip content check for some elements + } + else { + // get the visible text only + text = CommonUtil_1.CommonUtil.getOnScreenInnerText(element); + } + /* Note: Disable this alt check in images for now until we get confirmation + // Look for the alt attribute of an image which is considered visible text. + let hasImgAlt = false; + if (element.firstChild != null) { + let nw = RPTUtil.new NodeWalker(element); + while (!hasImgAlt && nw.nextNode() && nw.node != element && nw.node != element.nextSibling) { + hasImgAlt = (nw.node.nodeName.toLowerCase() == "img" && RPTUtil.attributeNonEmpty(nw.node, "alt")); + if (hasImgAlt) { + text = text ? text + nw.node.getAttribute("alt") : nw.node.getAttribute("alt"); + } + } + } + */ + } + var nonalphanumeric = /[^a-zA-Z0-9]/g; + text = text.replace(nonalphanumeric, " "); // only consider alphanumeric characters + var normalizedText = CommonUtil_1.CommonUtil.normalizeSpacing(text).toLowerCase(); // Leading and trailing whitespace and difference in case sensitivity should be ignored. + theLabel = theLabel.replace(nonalphanumeric, " "); // only consider alphanumeric characters + var normalizedLabel = CommonUtil_1.CommonUtil.normalizeSpacing(theLabel).toLowerCase(); + if (normalizedText.length > 1) { // skip non-text content. e.g., <button aria-label="close">X</button> + var location_1 = normalizedLabel.indexOf(normalizedText); + // Avoid matching partial words.e.g., text "name" should not match 'surname' or 'names' + if (location_1 >= 0 && normalizedLabel.length > normalizedText.length) { + var letters = /^[0-9a-zA-Z]+$/; + if ((location_1 + normalizedText.length) < normalizedLabel.length) { + // check ending + var theChar = normalizedLabel.charAt(location_1 + normalizedText.length); + if (theChar.match(letters)) { + passed = false; + } + } + if (passed && location_1 > 0) { + // check beginning + var theChar = normalizedLabel.charAt(location_1 - 1); + if (theChar.match(letters)) { + passed = false; + } + } + } + if (location_1 === -1) { // check that visible text content of the target is contained within its accessible name. + passed = false; + } + } + } + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ 7578 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.label_ref_valid = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var fragment_1 = __webpack_require__(5279); +var VisUtil_1 = __webpack_require__(3946); +exports.label_ref_valid = { + id: "label_ref_valid", + context: "dom:label[for]", + refactor: { + "WCAG20_Label_RefValid": { + "Pass_0": "pass", + "Fail_1": "fail_invalid" + } + }, + help: { + "en-US": { + "pass": "label_ref_valid.html", + "fail_invalid": "label_ref_valid.html", + "group": "label_ref_valid.html" + } + }, + messages: { + "en-US": { + "pass": "The 'for' attribute for a label referencea a unique non-empty 'id' attribute of a valid element", + "fail_invalid": "The value \"{0}\" of the 'for' attribute is not the 'id' of a valid element", + "group": "The 'for' attribute for a label should reference a non-empty, unique 'id' attribute of a valid element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var id = ruleContext.getAttribute("for"); + var passed = false; + var target = fragment_1.FragmentUtil.getById(ruleContext, id); + if (target) { + // ignore if both label and control are invisible + if (!VisUtil_1.VisUtil.isNodeVisible(target) && !VisUtil_1.VisUtil.isNodeVisible(ruleContext)) + return null; + passed = true; + // handles null and undefined + if (!target.hasAttribute("role")) { + // Fail if we're pointing at something that is labelled by another mechanism + var nodeName = target.nodeName.toLowerCase(); + passed = nodeName == "input" || nodeName == "select" || nodeName == "textarea" + || nodeName == "button" || nodeName == "datalist" + || nodeName == "optgroup" || nodeName == "option" + || nodeName == "keygen" || nodeName == "output" + || nodeName == "progress" || nodeName == "meter" + || nodeName == "fieldset" || nodeName == "legend"; + if (target.nodeName.toLowerCase() == "input" && target.hasAttribute("type")) { + var type = target.getAttribute("type").toLowerCase(); + passed = type == "text" || type == "password" || type == "file" || + type == "checkbox" || type == "radio" || + type == "hidden" || type == "search" || type == "tel" || type == "url" || type == "email" || //HTML 5 + type == "date" || type == "number" || type == "range" || type == "image" || //HTML 5 + type == "time" || type == "color" || // HTML 5 + type == "datetime-local" || type == "month" || type == "week"; //HTML5.1 + } + } + // Add one more check to make sure the target element is NOT hidden, in the case the target is hidden + // flag a violation regardless of what the Check Hidden Content setting is. + if (passed && !VisUtil_1.VisUtil.isNodeVisible(target)) { + passed = false; + } + } + var retToken = []; + if (!passed) { + retToken.push(id); + } + //return new ValidationResult(passed, [ruleContext], '', '', passed == true ? [] : [retToken]); + if (!passed) { + return (0, IRule_1.RuleFail)("fail_invalid", retToken); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ 9964 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.list_children_valid = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var DOMWalker_1 = __webpack_require__(3864); +exports.list_children_valid = { + id: "list_children_valid", + context: "aria:group", + refactor: { + "HAAC_List_Group_ListItem": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "list_children_valid.html", + "Fail_1": "list_children_valid.html", + "group": "list_children_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "List component with \"group\" role has children that are not <listitem> elements", + "group": "List component with \"group\" role must limit children to <listitem> elements" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var parent = DOMWalker_1.DOMWalker.parentElement(ruleContext); + if (!AriaUtil_1.AriaUtil.hasRoleInSemantics(parent, "list")) { + return null; + } + var passed = true; + var children = ruleContext.children; + for (var i = 0; passed && i < children.length; i++) { + passed = AriaUtil_1.AriaUtil.hasRoleInSemantics(children[i], "listitem"); + } + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ 6401 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.list_markup_review = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +var DOMWalker_1 = __webpack_require__(3864); +var VisUtil_1 = __webpack_require__(3946); +exports.list_markup_review = { + id: "list_markup_review", + context: "dom:*", + refactor: { + "RPT_List_UseMarkup": { + // "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + // "pass": "list_markup_review.html", + "potential_list": "list_markup_review.html", + "group": "list_markup_review.html" + } + }, + messages: { + "en-US": { + // "pass": "Proper HTML elements are used to create a list", + "potential_list": "Verify this is a list and if so, modify to use proper HTML elements for the list", + "group": "Proper HTML elements should be used to create a list" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Extract the nodeName of the context node + var nodeName = ruleContext.nodeName.toLowerCase(); + //skip the check if the element is hidden or disabled + if (CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext) || VisUtil_1.VisUtil.hiddenByDefaultElements.includes(nodeName)) + return null; + // Don't trigger if we're not in the body or if we're in a script + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["body"]) === null) + return null; + // ignore script, label and their child elements + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["script", 'label']) !== null) + return null; + // ignore all widgets and their children, and certain structure roles + var roles = AriaUtil_1.AriaUtil.getRolesWithTypes(ruleContext, ["widget"]); + // add some structure roles + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(["caption", "code", "columnheader", "figure", "list", "listitem", "math", "meter", "columnheader", "rowheader"], roles); + if (AriaUtil_1.AriaUtil.getAncestorWithRoles(ruleContext, roles) !== null) + return null; + var passed = true; + var walkNode = ruleContext.firstChild; + while (passed && walkNode) { + // Comply to the Check Hidden Content setting will be done by default as this rule triggers on each element + // and for each element it only checks that single elements text nodes and nothing else. So all inner elements will be + // covered on their own. Currently for this rule by default Check Hidden Content will work, as we are doing + // a node walk only on siblings so it would not get text nodes from other siblings at all. + // In the case in the future something changes, just need to add && !RPTUtil.shouldNodeBeSkippedHidden(walkNode) to the below + // if. + if (walkNode.nodeName == "#text") { + var txtVal = walkNode.nodeValue; + var failure = /^[ \t\r\n]*[( ]*[1-9]*[\*\-).][ \t][A-Z,a-z]+/.test(txtVal); + passed = !failure; + if (!passed) { + // Ensure that there's some sort of block level element before this + // Avoid failures due to things like <i>Some sentence</i>. New sentence. + var nw = new DOMWalker_1.DOMWalker(walkNode); + while (!passed && nw.prevNode()) { + var nodeName_1 = nw.node.nodeName.toLowerCase(); + if (["blockquote", "center", "dir", "div", "form", "h1", + "h2", "h3", "h4", "h5", "h6", "hr", "br", "menu", "p", + "pre"].includes(nodeName_1)) { + break; + } + if (nodeName_1 == "#text") { + var txt = nw.node.nodeValue; + passed = txt.length > 0 && ![" ", "\t", "\n"].includes(txt.charAt(txt.length - 1)); + } + } + } + } + walkNode = walkNode.nextSibling; + } + if (passed) + return null; + if (!passed) + return (0, IRule_1.RulePotential)("potential_list"); + } +}; + + +/***/ }, + +/***/ 1174 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.list_structure_proper = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +exports.list_structure_proper = { + id: "list_structure_proper", + context: "dom:dl, dom:ul, dom:ol, dom:dir, dom:menu, dom:li, dom:dd, dom:dt", + refactor: { + "RPT_List_Misuse": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "list_structure_proper.html", + "Potential_1": "list_structure_proper.html", + "group": "list_structure_proper.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "List element is missing or improperly structured", + "group": "List elements should only be used for lists of related items" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed; + var nodeName = ruleContext.nodeName.toLowerCase(); + // Get all the childrens of the ruleContext + var children = ruleContext.children; + if (nodeName == "dl") { + var first = ""; + var last = ""; + var walkChildren = ruleContext.firstChild; + passed = true; + var presentationalFound = false; + // If there are no childrens set as passed, since dl elements can have + // zero or more of: one or more dt elements, followed by one or more dd elements + if (!ruleContext.children || ruleContext.children.length == 0) { + passed = true; + } + else { + while (passed && walkChildren != null) { + if (walkChildren.nodeType == 1) { + var nodeName_1 = walkChildren.nodeName.toLowerCase(); + // While walking through the elements under dl, if we find a + // presentational element we move to the next element as presentational + // elements are allowed under list elements as they are only for + // formatting text nodes. + if (AriaUtil_1.AriaUtil.isPresentationalElement(walkChildren)) { + presentationalFound = true; + walkChildren = walkChildren.nextSibling; + continue; + } + // Only set to pass if we find dd or dt element, in the case of + // an element that is not supported we will catch it here. i.e. img + // element + passed = nodeName_1 == "dd" || nodeName_1 == "dt"; + // Set the first and last node depending on which is found first and last + if (first == "") + first = nodeName_1; + last = nodeName_1; + } + walkChildren = walkChildren.nextSibling; + } + // In the case that we have found dt and dd elements under dl we pass right away. + // In the case that there is no dt or dd element, but bunch of presentational elements we mark this as a + // pass. In the case that there are other elements, such as img we will still trigger a violation. + passed = (passed && first == "dt" && last == "dd") || (passed && presentationalFound); + } + } + else if (nodeName == "li") { + passed = CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["ul", "ol", "dir", "menu"]) != null; + } + else if (nodeName == "dd" || nodeName == "dt") { + passed = CommonUtil_1.CommonUtil.getAncestor(ruleContext, "dl") != null; + } + else { + var walkChildren = ruleContext.firstChild; + // Zero or more li elements are permitted inside of <ol>, <ul> or <menu> elements now as per the html5 spec. This handles the case + // when there are zero elements under the <ol>, <ul> or <menu>. + if ((nodeName == "ul" || nodeName == "ol" || nodeName == "menu") && (!ruleContext.children || ruleContext.children.length == 0)) { + passed = true; + } + else { + var liFound = false; + var presentationalFound = false; + passed = true; + while (passed && walkChildren != null) { + // While walking through the list elements, if we find a + // presentational element we skip checking as presentational + // elements are allowed under list elements as they are only for + // formatting text. + if (AriaUtil_1.AriaUtil.isPresentationalElement(walkChildren)) { + presentationalFound = true; + walkChildren = walkChildren.nextSibling; + continue; + } + // Pass if the node type is anything but 1, or in the case that it is a li element. For any other node + // it will be caught here that element is not allowed under list node. + // Furthermore in the case that there is a template element with the parent being ul/ol don't flag a violation + passed = walkChildren.nodeType != 1 || walkChildren.nodeName.toLowerCase() == "li" || (walkChildren.nodeName.toLowerCase() == "template" && (nodeName == "ul" || nodeName == "ol")); + // Set li found to true if the current element (nodeType=1) is an li element + liFound = liFound || (walkChildren.nodeType == 1 && walkChildren.nodeName.toLowerCase() == "li"); + walkChildren = walkChildren.nextSibling; + } + // In the case that it has passed and also li element is found under list node, we pass right away. + // In the case that there is no li element, but bunch of presentational elements we mark this as a + // pass. In the case that there are other elements, such as img we will still trigger a violation. + passed = (passed && liFound) || (passed && presentationalFound); + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ 9907 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.marquee_elem_avoid = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +exports.marquee_elem_avoid = { + id: "marquee_elem_avoid", + context: "dom:marquee", + refactor: { + "RPT_Marquee_Trigger": { + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Fail_1": "marquee_elem_avoid.html", + "group": "marquee_elem_avoid.html" + } + }, + messages: { + "en-US": { + "Fail_1": "Scrolling content found that uses the obsolete <marquee> element", + "group": "The <marquee> element is obsolete and should not be used" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.2.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // JCH - NO OUT OF SCOPE hidden in context + return (0, IRule_1.RuleFail)("Fail_1"); + } +}; + + +/***/ }, + +/***/ 6032 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.media_alt_brief = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var VisUtil_1 = __webpack_require__(3946); +exports.media_alt_brief = { + id: "media_alt_brief", + context: "dom:img[alt], dom:applet[alt], dom:area[alt], dom:embed[alt], dom:input[type][alt]", + refactor: { + "RPT_Media_AltBrief": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "media_alt_brief.html", + "Potential_1": "media_alt_brief.html", + "group": "media_alt_brief.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Text alternative is more than 150 characters", + "group": "Alternative text in 'alt' attribute should be brief (<150 characters)" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + maxAlt: { + value: 150, + type: "integer" + } + }; + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var altLength = ruleContext.getAttribute("alt").trim().length; + var passed = altLength <= validateParams.maxAlt.value; + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ 5622 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.media_alt_exists = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +var VisUtil_1 = __webpack_require__(3946); +exports.media_alt_exists = { + id: "media_alt_exists", + context: "dom:area[alt], dom:embed[alt]", + refactor: { + "RPT_Media_AudioVideoAltFilename": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "media_alt_exists.html", + "Potential_1": "media_alt_exists.html", + "group": "media_alt_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Filename used as label for embedded audio or video", + "group": "Audio or video on the page must have a short text alternative that describes the media content" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var uri = ""; + if (ruleContext.nodeName.toLowerCase() == "area") { + uri = ruleContext.getAttribute("href"); + } + else { + uri = ruleContext.getAttribute("src"); + } + if (uri == null) + uri = ""; + var ext = CommonUtil_1.CommonUtil.getFileExt(uri); + var isAudVid = ext.length != 0 && (CommonUtil_1.CommonUtil.isAudioExt(ext) || CommonUtil_1.CommonUtil.isVideoExt(ext)); + var altText = ruleContext.getAttribute("alt"); + var passed = !isAudVid || (altText.length > 0 && altText.indexOf(ext) == -1); + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ 2240 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.media_audio_transcribed = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +var VisUtil_1 = __webpack_require__(3946); +exports.media_audio_transcribed = { + id: "media_audio_transcribed", + context: "dom:bgsound, dom:a[href], dom:area[href], dom:embed, dom:object", + refactor: { + "RPT_Media_AudioTrigger": { + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Manual_1": "media_audio_transcribed.html", + "group": "media_audio_transcribed.html" + } + }, + messages: { + "en-US": { + "Manual_1": "Provide transcripts for audio files", + "group": "Audio information should also be available in text form" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.2.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed; + var thisNode = ruleContext.nodeName.toLowerCase(); + if (thisNode == "bgsound") { + passed = false; + } + else { + passed = !CommonUtil_1.CommonUtil.isAudioObjEmbedLink(ruleContext); + } + if (passed) + return null; // Out of Scope + if (!passed) + return (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }, + +/***/ 4019 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.media_autostart_controllable = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +exports.media_autostart_controllable = { + id: "media_autostart_controllable", + context: "dom:param[name=autoplay], dom:param[name=autostart], dom:embed[flashvars], dom:embed[src], dom:*[autostart=true], dom:*[autostart=1], dom:bgsound", + refactor: { + "RPT_Embed_AutoStart": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "media_autostart_controllable.html", + "Potential_1": "media_autostart_controllable.html", + "group": "media_autostart_controllable.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify there is a mechanism to pause or stop and control the volume for the audio that plays automatically", + "group": "Mechanism must be available to pause or stop and control the volume of the audio that plays automatically" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.4.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + var passed; + if (nodeName == "bgsound") { + passed = false; + } + else if (nodeName == "param") { + var content = ""; + if (ruleContext.hasAttribute("value")) + content = ruleContext.getAttribute("value").toLowerCase(); + passed = content.indexOf("0;") == 0 || + !(content.indexOf("true") != -1 || content.indexOf("1") != -1); + } + else if (nodeName == "embed") { + passed = true; + if (ruleContext.hasAttribute("flashvars")) { + var str = ruleContext.getAttribute("flashvars"); + passed = str.indexOf("autostart=true") == -1 && + str.indexOf("autostart=1") == -1; + } + if (passed && ruleContext.hasAttribute("src")) { + var str = ruleContext.getAttribute("src"); + passed = str.indexOf("autostart=true") == -1 && + str.indexOf("autostart=1") == -1; + } + } + if (passed && ruleContext.hasAttribute("autostart")) { + var val = ruleContext.getAttribute("autostart").toLowerCase(); + passed = val != 'true' && val != '1'; + } + return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ 361 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.media_keyboard_controllable = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var VisUtil_1 = __webpack_require__(3946); +exports.media_keyboard_controllable = { + id: "media_keyboard_controllable", + context: "dom:audio, dom:video", + refactor: { + "HAAC_Audio_Video_Trigger": { + "Pass_0": "Pass_0", + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Pass_0": "media_keyboard_controllable.html", + "Manual_1": "media_keyboard_controllable.html", + "group": "media_keyboard_controllable.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Manual_1": "Verify media using <audio> and/or <video> elements have keyboard accessible controls", + "group": "Media using <audio> and/or <video> elements must have keyboard accessible controls" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = true; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (nodeName == "audio" || nodeName === "video") { + passed = false; + } + return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }, + +/***/ 5960 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.media_live_captioned = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +exports.media_live_captioned = { + id: "media_live_captioned", + context: "dom:embed, dom:object", + refactor: { + "RPT_Media_VideoObjectTrigger": { + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Manual_1": "media_live_captioned.html", + "group": "media_live_captioned.html" + } + }, + messages: { + "en-US": { + "Manual_1": "Verify captions are provided for live media (streaming video with audio)", + "group": "Live media (streaming video with audio) should have captions for audio content" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.2.4"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = !CommonUtil_1.CommonUtil.isVideoObjEmbedLink(ruleContext); + if (passed) + return null; + if (!passed) + return (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }, + +/***/ 5515 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.media_track_available = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +var VisUtil_1 = __webpack_require__(3946); +exports.media_track_available = { + id: "media_track_available", + context: "dom:a[href], dom:area[href], dom:applet, dom:embed, dom:object", + refactor: { + "RPT_Media_VideoReferenceTrigger": { + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Manual_1": "media_track_available.html", + "group": "media_track_available.html" + } + }, + messages: { + "en-US": { + "Manual_1": "Verify availability of a user-selectable audio track with description of visual content", + "group": "Pre-recorded media should have an audio track that describes visual information" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.2.3", "1.2.5"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLowerCase(); + var passed = true; + if (nodeName == "applet") { + passed = false; + } + else { + passed = !CommonUtil_1.CommonUtil.isVideoObjEmbedLink(ruleContext); + } + if (passed) + return null; + if (!passed) + return (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }, + +/***/ 8752 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.meta_redirect_optional = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CacheUtil_1 = __webpack_require__(4566); +exports.meta_redirect_optional = { + id: "meta_redirect_optional", + context: "dom:meta[http-equiv][content]", + refactor: { + "WCAG20_Meta_RedirectZero": { + "pass": "pass", + "fail": "fail", + "fail_longrefresh": "fail_longrefresh" + } + }, + help: { + "en-US": { + "group": "meta_redirect_optional.html", + "pass": "meta_redirect_optional.html", + "fail": "meta_redirect_optional.html", + "fail_longrefresh": "meta_redirect_optional.html" + } + }, + messages: { + "en-US": { + "group": "Page should not automatically refresh without warning or option to turn it off or adjust the time limit", + "pass": "Rule Passed", + "fail": "Check page does not automatically refresh without warning or options", + "fail_longrefresh": "Check page does not automatically refresh without warning or options" + } + }, + /** + * deprecate WCAG AAA + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.2.4", "3.2.5"], + "level": eRulePolicy.VIOLATION, + "toolkitLevel": eToolkitLevel.LEVEL_THREE + }], + */ + rulesets: [{ + "id": [], + "num": ["2.2.4", "3.2.5"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + // Removed ACT bisz58 AAA + /**act: [{ + "bc659a" : { + "pass": "pass", + "fail": "fail", + "fail_longrefresh": "pass" + } + }],*/ + act: ["bisz58"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (ruleContext.getAttribute("http-equiv").toLowerCase() !== 'refresh') { + return null; + } + var doc = ruleContext.ownerDocument; + if (!doc) + return; + // check if the rule already passed or failed: only the first one tridders if multiple + if (CacheUtil_1.CacheUtil.getCache(doc, "meta_redirect_optional_done", false)) + return null; + var content = ruleContext.getAttribute("content").toLowerCase(); + if (!content || content.trim().length === 0) + return null; + var time = -1; + if (content.match(/^\d+$/)) + time = parseInt(content); + else if (content.match(/^\d+;/)) { + var pos = content.indexOf(";"); + time = parseInt(content.substring(0, pos)); + } + // Invalid content field + if (time === -1) { + return null; + } + CacheUtil_1.CacheUtil.setCache(doc, "meta_redirect_optional_done", true); + if (time === 0) + return (0, IRule_1.RulePass)("pass"); + else if (time < 72001) + return (0, IRule_1.RuleFail)("fail"); + return (0, IRule_1.RuleFail)("fail_longrefresh"); + } +}; + + +/***/ }, + +/***/ 8834 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.meta_refresh_delay = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CacheUtil_1 = __webpack_require__(4566); +exports.meta_refresh_delay = { + id: "meta_refresh_delay", + context: "dom:meta[http-equiv][content]", + refactor: { + "RPT_Meta_Refresh": { + "Pass_0": "pass", + "Potential_1": "potential_refresh" + } + }, + help: { + "en-US": { + "group": "meta_refresh_delay.html", + "pass": "meta_refresh_delay.html", + "potential_refresh": "meta_refresh_delay.html" + } + }, + messages: { + "en-US": { + "group": "Pages should not refresh automatically", + "pass": "Pages do not refresh automatically", + "potential_refresh": "Verify page is not being caused to refresh automatically", + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.2.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + //act: [ "bisz58", "bc659a" ], + act: ["bc659a"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (ruleContext.getAttribute("http-equiv").toLowerCase() !== 'refresh') + return null; + var doc = ruleContext.ownerDocument; + if (!doc) + return; + // check if the rule already passed: the first one takes priority + if (CacheUtil_1.CacheUtil.getCache(doc, "meta_refresh_delay_done", false)) + return null; + var content = ruleContext.getAttribute("content").toLowerCase(); + if (!content || content.trim().length === 0) + return null; + var time = -1; + if (content.match(/^\d+$/)) + time = parseInt(content); + else if (content.match(/^\d+;/)) { + var pos = content.indexOf(";"); + time = parseInt(content.substring(0, pos)); + } + // Invalid content field + if (time === -1) { + return null; + } + CacheUtil_1.CacheUtil.setCache(doc, "meta_refresh_delay_done", true); + if (time === 0) + return (0, IRule_1.RulePass)("pass"); + return (0, IRule_1.RulePotential)("potential_refresh"); + } +}; + + +/***/ }, + +/***/ 1025 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.meta_viewport_zoomable = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +exports.meta_viewport_zoomable = { + id: "meta_viewport_zoomable", + context: "dom:meta[name][content]", + refactor: { + "meta_viewport_zoom": { + "Pass_0": "pass", + "Potential_1": "potential_zoomable" + } + }, + help: { + "en-US": { + "group": "meta_viewport_zoomable.html", + "pass": "meta_viewport_zoomable.html", + "potential_zoomable": "meta_viewport_zoomable.html" + } + }, + messages: { + "en-US": { + "group": "The 'meta[name=viewport]' should not prevent the browser zooming the content", + "pass": "The 'meta[name=viewport]' does not prevent the browser zooming the content", + "potential_zoomable": "Confirm the 'meta[name=viewport]' with \"{0}\" can be zoomed by user" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.4.4"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [{ + "b4f0c3": { + "pass": "pass", + "potential_zoomable": "fail" + } + }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (ruleContext.getAttribute("name").toLowerCase() !== 'viewport') + return null; + var content = ruleContext.getAttribute("content").toLowerCase(); + // neither maximum-scale nor user-scalable (default yes) + if (!content || content.trim() === '' || (!content.includes('maximum-scale') && !content.includes('user-scalable'))) + return null; + var user_msg = null; + var max_msg = null; + var props = content.split(","); + var user_scale_value = 'yes'; + var maximum_scale_value = '2.0'; + for (var _i = 0, props_1 = props; _i < props_1.length; _i++) { + var prop = props_1[_i]; + var pieces = prop.trim().split('='); + if (pieces.length < 2) + continue; + if (prop.includes('user-scalable')) { + user_msg = prop; + user_scale_value = pieces[1].trim(); + if (user_scale_value.startsWith("'") || user_scale_value.startsWith('"')) { + user_scale_value = user_scale_value.substring(1, user_scale_value.length - 1); + } + } + else if (prop.includes('maximum-scale')) { + max_msg = prop; + maximum_scale_value = pieces[1].trim(); + if (maximum_scale_value.startsWith("'") || maximum_scale_value.startsWith('"')) { + maximum_scale_value = maximum_scale_value.substring(1, maximum_scale_value.length - 1).trim(); + } + } + } + var value = Number(user_scale_value); + if (!isNaN(value)) { + if (value >= 1 || value <= -1) + user_scale_value = 'yes'; + } + var maximum_scale = 2.0; + value = Number(maximum_scale_value); + if (!isNaN(value)) { + if (value < 0) + maximum_scale = 2.0; + else + maximum_scale = value; + } + else { + if (maximum_scale_value === 'yes') + maximum_scale = 1.0; + else + maximum_scale = 0.1; + } + // user-scalable is not set to 'yes', ignore maximum_scale + if (user_scale_value !== 'yes') { + return (0, IRule_1.RulePotential)("potential_zoomable", [user_msg]); + } + // user-scalable is 'yes', but maximum_scale is too small + if (maximum_scale < 2.0) { + return (0, IRule_1.RulePotential)("potential_zoomable", [max_msg]); + } + return (0, IRule_1.RulePass)("pass"); + } +}; + + +/***/ }, + +/***/ 9116 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.noembed_content_exists = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +var VisUtil_1 = __webpack_require__(3946); +exports.noembed_content_exists = { + id: "noembed_content_exists", + context: "dom:noembed", + refactor: { + "Valerie_Noembed_HasContent": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "noembed_content_exists.html", + "Potential_1": "noembed_content_exists.html", + "group": "noembed_content_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Add descriptive text to the <noembed> element", + "group": "<noembed> elements should contain descriptive text" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_FOUR + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = CommonUtil_1.CommonUtil.hasInnerContentHidden(ruleContext); + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ 435 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.object_text_exists = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var VisUtil_1 = __webpack_require__(3946); +var AccNameUtil_1 = __webpack_require__(1950); +exports.object_text_exists = { + id: "object_text_exists", + context: "dom:object", + refactor: { + "WCAG20_Object_HasText": { + "pass": "pass", + "fail_no_text_alternative": "fail_no_text_alternative" + } + }, + help: { + "en-US": { + "group": "object_text_exists.html", + "pass": "object_text_exists.html", + "fail_no_text_alternative": "object_text_exists.html" + } + }, + messages: { + "en-US": { + "group": "<object> element must have a text alternative for the content rendered by the object", + "pass": "<object> element has a text alternative", + "fail_no_text_alternative": "An <object> element does not have a text alternative" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: "8fc3b6", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // Detect if this object is of type text, by checking the object type in the case it is text then do not trigger this rule + if (ruleContext.hasAttribute("type") && (ruleContext.getAttribute("type")).indexOf("text") !== -1) { + return null; + } + // ignore if an explicit role is specified: including 'presentation', 'none', 'application', 'document' or 'img' + // this case will be covered in other rules + var role = ruleContext.getAttribute("role"); + if (role) { + return null; + } + // Per ACT, ignore embedded HTML files + var data = ruleContext.getAttribute("data"); + var ext = data && typeof data === typeof "" ? data.substring(data.lastIndexOf(".")) : ""; + if (ext === ".html" || ext === ".htm") { + return null; + } + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + var passed = pair && pair.name && pair.name.trim().length > 0; + //let passed = ARIAMapper.computeName(ruleContext).trim().length > 0; + if (passed) { + return (0, IRule_1.RulePass)("pass"); + } + else { + return (0, IRule_1.RuleFail)("fail_no_text_alternative"); + } + } +}; + + +/***/ }, + +/***/ 6640 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.page_title_exists = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +var ancestor_1 = __webpack_require__(6858); +exports.page_title_exists = { + id: "page_title_exists", + context: "dom:html", + refactor: { + "WCAG20_Doc_HasTitle": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3" + } + }, + help: { + "en-US": { + "group": "page_title_exists.html", + "Pass_0": "page_title_exists.html", + "Fail_1": "page_title_exists.html", + "Fail_2": "page_title_exists.html", + "Fail_3": "page_title_exists.html" + } + }, + messages: { + "en-US": { + "group": "The page should have a title that correctly identifies the subject of the page", + "Pass_0": "Rule Passed", + "Fail_1": "Missing <head> element so there can be no <title> element present", + "Fail_2": "Missing <title> element in <head> element", + "Fail_3": "The <title> element is empty (no innerHTML)" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [{ + "2779a5": { + "Pass_0": "pass", + "Fail_1": "pass", + "Fail_2": "fail", + "Fail_3": "fail" + } + }], + run: function (context, options, contextHierarchies) { + // This rule does not apply inside a presentational frame + if (ancestor_1.AncestorUtil.isFrame(contextHierarchies)) { + return null; + } + var ruleContext = context["dom"].node; + // First, find the head element + var findHead = ruleContext.firstChild; + var findTitle = null; + while (findHead != null) { + if (findHead.nodeName.toLowerCase() == "head") + break; + findHead = findHead.nextSibling; + } + var possibleTitles = ruleContext.querySelectorAll("title"); + for (var idx = 0; idx < possibleTitles.length; ++idx) { + if (!CommonUtil_1.CommonUtil.getAncestor(possibleTitles[idx], ["svg"])) { + findTitle = possibleTitles[idx]; + break; + } + } + if (findHead === null) { + if (!findTitle) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } + if (findTitle === null) { // don't have title second PoF + return (0, IRule_1.RuleFail)("Fail_2"); + } + // if we get here we have <head> and <title> + if (findTitle != null && CommonUtil_1.CommonUtil.getInnerText(findTitle).trim().length > 0) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { // <title> has no innerHTML third PoF + return (0, IRule_1.RuleFail)("Fail_3"); + } + } +}; + + +/***/ }, + +/***/ 2068 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.page_title_valid = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +exports.page_title_valid = { + id: "page_title_valid", + context: "dom:head dom:title", + refactor: { + "RPT_Title_Valid": { + "Pass_0": "Pass_0", + // "Fail_1": "Fail_1", + "Potential_2": "Potential_2" + } + }, + help: { + "en-US": { + "Pass_0": "page_title_valid.html", + // "Fail_1": "page_title_valid.html", + "Potential_2": "page_title_valid.html", + "group": "page_title_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + // "Fail_1": "Page <title> is empty", + "Potential_2": "Verify that using the filename as the page <title> value is descriptive", + "group": "Page <title> should be a descriptive title, rather than a filename" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var titleStr = CommonUtil_1.CommonUtil.getInnerText(ruleContext).trim(); + // allow .com, .net and .org + var titleStrLowercase = titleStr.toLowerCase(); + if (titleStrLowercase.includes(".com") || titleStrLowercase.includes(".net") || titleStrLowercase.includes(".org")) { + return (0, IRule_1.RulePass)("Pass_0", [titleStr]); + } + if (titleStr.length === 0) { + // This is covered by page_title_exists + return null; //RuleFail("Fail_1"); + } + else { + var passed = !/^\S*\.[a-zA-Z]{1,4}(?!.)|^https?:\/\/\S*/i.test(titleStr); + if (!passed) { + return (0, IRule_1.RulePotential)("Potential_2"); + } + else { + return (0, IRule_1.RulePass)("Pass_0", [titleStr]); + } + } + } +}; + + +/***/ }, + +/***/ 7322 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.script_focus_blur_review = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +exports.script_focus_blur_review = { + id: "script_focus_blur_review", + context: "dom:*[onfocus]", + refactor: { + "WCAG20_Script_FocusBlurs": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "script_focus_blur_review.html", + "Potential_1": "script_focus_blur_review.html", + "group": "script_focus_blur_review.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify script does not remove focus from content that normally receives focus", + "group": "Scripting must not remove focus from content that normally receives focus" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1", "2.4.7", "3.2.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = ruleContext.getAttribute("onfocus").indexOf(".blur(") == -1; + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ 5702 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.script_onclick_avoid = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +exports.script_onclick_avoid = { + id: "script_onclick_avoid", + context: "dom:*[onclick]", + dependencies: ["script_onclick_misuse"], + refactor: { + "RPT_Script_OnclickHTML2": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "script_onclick_avoid.html", + "Potential_1": "script_onclick_avoid.html", + "group": "script_onclick_avoid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that 'onclick' events are not used in script to emulate a link", + "group": "Scripts should not be used to emulate links" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_FOUR + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Don't trigger this for SVG element for now until a determination is made (by Rich) + // to support SVG at a point when the SVG a11y spec is ready. + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, "svg")) { + return (0, IRule_1.RulePass)("Pass_0"); + } + // If there's an aria-role specified, don't trigger this. + if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "role")) + return (0, IRule_1.RulePass)("Pass_0"); + var nodeName = ruleContext.nodeName.toLowerCase(); + var passed = nodeName == "a" || nodeName == "area" || nodeName == "input"; + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ 1961 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.script_onclick_misuse = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +exports.script_onclick_misuse = { + id: "script_onclick_misuse", + context: "dom:*[onclick]", + refactor: { + "RPT_Script_OnclickHTML1": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "script_onclick_misuse.html", + "Potential_1": "script_onclick_misuse.html", + "group": "script_onclick_misuse.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Possible use of a script to emulate a link", + "group": "Scripts should not be used to emulate links" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + failSubstring: { + value: [".asp", ".aspx", ".cfm", ".cfml", ".cgi", ".htm", ".html", ".shtm", + ".shtml", ".php", ".pl", ".py", ".shtm", ".shtml", ".xhtml", + "location.href"], + type: "[string]" + } + }; + var ruleContext = context["dom"].node; + // If there's an aria-role specified, don't trigger this. + var passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "role"); + // If this is an a or area, don't trigger if there's an href. + var nodeName = ruleContext.nodeName.toLowerCase(); + passed = passed || ((nodeName == "a" || nodeName == "area") && CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "href")); + // If the guards failed, check to see if they're looking at links + if (!passed) { + var failSubstring = validateParams.failSubstring.value; + ; + var onclick_1 = ruleContext.getAttribute("onclick").toLowerCase(); + passed = true; + for (var i = 0; passed && i < failSubstring.length; ++i) { + passed = onclick_1.indexOf(failSubstring[i]) == -1; + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ 3022 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.script_select_review = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +exports.script_select_review = { + id: "script_select_review", + context: "dom:select", + refactor: { + "WCAG20_Select_NoChangeAction": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "script_select_review.html", + "Potential_1": "script_select_review.html", + "group": "script_select_review.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that no change of context or action occurs when selection options in this component receive focus", + "group": "No changes of context should occur when a selection value receives focus" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.2.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = !ruleContext.hasAttribute("onchange") && !ruleContext.hasAttribute("onfocus"); + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ 375 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.select_options_grouped = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +exports.select_options_grouped = { + id: "select_options_grouped", + context: "dom:select", + refactor: { + "WCAG20_Select_HasOptGroup": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "select_options_grouped.html", + "Potential_1": "select_options_grouped.html", + "group": "select_options_grouped.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Group of related options may need <optgroup>", + "group": "Groups of related options within a selection list should be grouped with <optgroup>" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + paramNumOptions: { + value: 10, + type: "integer" + } + }; + var ruleContext = context["dom"].node; + // Handle the cases where optgroup is hidden, which should trigger a violations + // but in the case that Check hidden option is set then should not trigger a violation. + var passed = CommonUtil_1.CommonUtil.getChildByTagHidden(ruleContext, "optgroup", false, true).length > 0 || + CommonUtil_1.CommonUtil.getChildByTagHidden(ruleContext, "option", false, true).length <= + validateParams.paramNumOptions.value; + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ 4658 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.skip_main_described = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +var CacheUtil_1 = __webpack_require__(4566); +var VisUtil_1 = __webpack_require__(3946); +exports.skip_main_described = { + id: "skip_main_described", + context: "dom:body", + dependencies: ["skip_main_exists"], + refactor: { + "WCAG20_Body_FirstAContainsSkipText_Native_Host_Sematics": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "skip_main_described.html", + "Potential_1": "skip_main_described.html", + "group": "skip_main_described.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that if this hyperlink skips content, the description communicates where it links to", + "group": "The description of a hyperlink used to skip content must communicate where it links to" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + paramSkipText: { + value: ["skip", "jump"], + type: "[string]" + } + }; + var ruleContext = context["dom"].node; + // Get the anchors on the page + var doc = ruleContext.ownerDocument; + // Check for landmarks first + var passed; + if (CacheUtil_1.CacheUtil.getCache(ruleContext, "IBM_hasLandmarks_Implicit", null) === null) { + CacheUtil_1.CacheUtil.setCache(ruleContext, "IBM_hasLandmarks_Implicit", CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, ["application", "banner", "complementary", "contentinfo", + "form", "main", "navigation", "search" + ], true, true).length > 0); + } + passed = CacheUtil_1.CacheUtil.getCache(ruleContext, "IBM_hasLandmarks_Implicit", false); + if (!passed) { // No landmarks, check for skip links + var links = doc.links; + // Skip link should be the first one on the page with an href attribute (i.e., links[0]) + // also if the first link is hidden then we should also trigger a violation. + if (links && links.length > 0 && VisUtil_1.VisUtil.isNodeVisible(links[0])) { + var testText = CommonUtil_1.CommonUtil.getInnerText(doc.links[0]).toLowerCase(); + for (var i = 0; !passed && i < validateParams.paramSkipText.value.length; ++i) { + passed = testText.indexOf(validateParams.paramSkipText.value[i]) != -1; + } + } + else + passed = false; + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ 4605 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.skip_main_exists = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +var ancestor_1 = __webpack_require__(6858); +var CacheUtil_1 = __webpack_require__(4566); +var VisUtil_1 = __webpack_require__(3946); +exports.skip_main_exists = { + id: "skip_main_exists", + context: "dom:body", + refactor: { + "WCAG20_Body_FirstASkips_Native_Host_Sematics": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "skip_main_exists.html", + "Fail_1": "skip_main_exists.html", + "group": "skip_main_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The page does not provide a way to quickly navigate to the main content (ARIA \"main\" landmark or a skip link)", + "group": "Pages must provide a way to skip directly to the main content" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + // This rule does not apply inside a presentational frame + if (ancestor_1.AncestorUtil.isPresentationFrame(contextHierarchies)) { + return null; + } + var ruleContext = context["dom"].node; + // Get the anchors on the page + var doc = ruleContext.ownerDocument; + // Check for landmarks first + var passed; + if (CacheUtil_1.CacheUtil.getCache(ruleContext, "IBM_hasLandmarks_Implicit", null) === null) { + CacheUtil_1.CacheUtil.setCache(ruleContext, "IBM_hasLandmarks_Implicit", CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, ["application", "banner", "complementary", "contentinfo", + "form", "main", "navigation", "search" + ], true, true).length > 0); + } + passed = CacheUtil_1.CacheUtil.getCache(ruleContext, "IBM_hasLandmarks_Implicit", false); + if (!passed) { // No landmarks, check for skip links + var anchors = CommonUtil_1.CommonUtil.getDocElementsByTag(ruleContext, "a"); + // Skip anchor should be the first one on the page with an href attribute + var testAnchor = null; + for (var i = 0; i < anchors.length; ++i) { + if (anchors[i].hasAttribute("href") && VisUtil_1.VisUtil.isNodeVisible(anchors[i])) { + testAnchor = anchors[i]; + break; + } + } + // Pull out the target id + var targetId = null; + if (testAnchor != null) { + var hrefStr = testAnchor.getAttribute("href"); + var idx = hrefStr.indexOf("#"); + if (idx != -1) { + targetId = hrefStr.substring(idx + 1); + } + } + // Determine if there is an element id or named anchor on the page with this + // target id. + if (targetId != null) { + passed = doc.getElementById(targetId) != null; + for (var i = 0; !passed && i < anchors.length; ++i) { + if (!anchors[i].hasAttribute("href") && + anchors[i].hasAttribute("name") && + anchors[i].getAttribute("name") == targetId) { + passed = true; + } + } + } + } + //return new ValidationResult(passed, [ruleContext], '', '', []); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ 5294 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.style_background_decorative = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +exports.style_background_decorative = { + id: "style_background_decorative", + context: "dom:style, dom:*[style]", + refactor: { + "RPT_Style_BackgroundImage": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "style_background_decorative.html", + "Potential_1": "style_background_decorative.html", + "group": "style_background_decorative.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify the CSS background image does not convey important information", + "group": "Images included by using CSS alone must not convey important information" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + var passed = true; + if (nodeName === "link" && ruleContext.hasAttribute("rel") && + ruleContext.getAttribute("rel").toLowerCase() === "stylesheet") { + // External stylesheet - trigger + passed = CommonUtil_1.CommonUtil.triggerOnce(ruleContext, "style_background_decorative", false); + } + if (passed && nodeName === "style" || ruleContext.hasAttribute("style")) { + var styleText = void 0; + if (nodeName === "style") + styleText = CommonUtil_1.CommonUtil.getInnerText(ruleContext); + else + styleText = ruleContext.getAttribute("style"); + var bgMatches = styleText.match(/background:[^;]*/g); + if (bgMatches !== null) { + for (var i = 0; passed && i < bgMatches.length; ++i) + passed = bgMatches[i].indexOf("url(") === -1; + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ 3506 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.style_before_after_review = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CSSUtil_1 = __webpack_require__(4919); +/** + * Description: Trigger if :before and :after are used in CSS (Internal and External) with content + * Origin: WCAG 2.0 F87 + */ +exports.style_before_after_review = { + id: "style_before_after_review", + context: "dom:style, dom:link", + refactor: { + "WCAG20_Style_BeforeAfter": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "group": "style_before_after_review.html", + "Pass_0": "style_before_after_review.html", + "Potential_1": "style_before_after_review.html" + } + }, + messages: { + "en-US": { + "group": "Do not use CSS '::before' and '::after' pseudo-elements to insert non-decorative content", + "Pass_0": "Rule Passed", + "Potential_1": "Verify the '::before' and '::after' pseudo-elements do not insert non-decorative content" + } + }, + rulesets: [{ + // Turn off the rule due to the obsolete requirement + //id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + id: [], + num: "1.3.1", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = true; + //check Internal styles + if (ruleContext.nodeName.toLowerCase() === "style") { + var css = CSSUtil_1.CSSUtil.getCSSStyle(ruleContext); + for (var i = 0; passed && i < css.length; ++i) { + // Guard against bad CSS + if (css[i].selector) { + passed = (css[i].selector.indexOf(":before") === -1 && css[i].selector.indexOf(":after") === -1) || + !("content" in css[i].values) || css[i].values["content"].trim().length === 0 || css[i].values["content"].trim() === "\"\"" + || css[i].values["content"].trim() === "\'\'" || css[i].values["content"].trim() === "none" || css[i].values["content"].trim() === "attr(x)" + || css[i].values["content"].trim() === "attr(y)"; + } + } + // check special rules in the stylesheets + if (passed) { + for (var sIndex = 0; sIndex < ruleContext.ownerDocument.styleSheets.length; sIndex++) { + var sheet = ruleContext.ownerDocument.styleSheets[sIndex]; + if (sheet.ownerNode === ruleContext) { + try { + var styleRules = sheet.cssRules ? sheet.cssRules : sheet.rules; + if (styleRules) { + for (var styleRuleIndex = 0; passed && styleRuleIndex < styleRules.length; styleRuleIndex++) { + var styleRule = styleRules[styleRuleIndex]; + // check @media rules + // + // The check 'if (styleRule instanceof CSSMediaRule)' doesn't work when run in Karma(but works in DAP) + // so let's access the type directly as a workaround + var styleImportRule = void 0; + if (styleRule.type && styleRule.type === 4 /* CSSRule.MEDIA_RULE */) { + var styleMediaRule = styleRule; + var mediaRules = styleMediaRule.cssRules; + if (mediaRules) { + for (var rIndex = 0; passed && rIndex < mediaRules.length; rIndex++) { + var mRule = mediaRules[rIndex]; // selectorText not recognized + if (mRule.selectorText !== null && mRule.selectorText !== undefined) { + var rule = mRule.selectorText.toLowerCase(); + if (rule.indexOf(":before") !== -1 || rule.indexOf(":after") !== -1) { + var content = mRule.style['content']; + if (content && content.trim().length) { + if (content.trim() !== "\"\"" && + content.trim() !== "\'\'" && + content.trim() !== "none" && + content.trim() !== "attr(x)" && + content.trim() !== "attr(y)") { + passed = false; + } + } + } + } + } + } + } + // check import rules + else if (styleRule.type && styleRule.type === 3 /* CSSRule.IMPORT_RULE */ && (styleImportRule = styleRule).styleSheet) { + var rules = styleImportRule.styleSheet.cssRules ? + styleImportRule.styleSheet.cssRules : + styleImportRule.styleSheet.rules; + if (rules) { + for (var rIndex = 0; passed && rIndex < rules.length; rIndex++) { + var importedRule = rules[rIndex]; + // check @media rules + if (importedRule.type && importedRule.type === 4 /* CSSRule.MEDIA_RULE */) { + var mediaRules = importedRule.cssRules; + if (mediaRules) { + for (var mIndex = 0; mIndex < mediaRules.length; mIndex++) { + var mRule = mediaRules[mIndex]; // selectorText not recognized + if (mRule.selectorText !== null && mRule.selectorText !== undefined) { + var rule = mRule.selectorText.toLowerCase(); + if (rule.indexOf(":before") !== -1 || rule.indexOf(":after") !== -1) { + var content = mRule.style['content']; + if (content && content.trim().length) { + if (content.trim() !== "\"\"" && + content.trim() !== "\'\'" && + content.trim() !== "none" && + content.trim() !== "attr(x)" && + content.trim() !== "attr(y)") { + passed = false; + } + } + } + } + } + } + } + else if (importedRule.selectorText !== null && importedRule.selectorText !== undefined) { + var rule = importedRule.selectorText.toLowerCase(); + //support both single colon (:) and double colon (::) pseudo + if (rule.indexOf(":before") !== -1 || rule.indexOf(":after") !== -1) { + var content = importedRule.style['content']; + if (content && content.trim().length) { + if (content.trim() !== "\"\"" && + content.trim() !== "\'\'" && + content.trim() !== "none" && + content.trim() !== "attr(x)" && + content.trim() !== "attr(y)") { + passed = false; + } + } + } + } + } + } + } + } + } + } + catch (e) { + // Ignore css access issues + } + } + } + } + } + //check external styles + if (ruleContext.nodeName.toLowerCase() === "link" && ruleContext.hasAttribute("rel") && + ruleContext.getAttribute("rel").toLowerCase() === "stylesheet" && + ruleContext.hasAttribute("href") && ruleContext.getAttribute("href").trim().length !== 0) { + for (var sIndex = 0; sIndex < ruleContext.ownerDocument.styleSheets.length; sIndex++) { + var sheet = ruleContext.ownerDocument.styleSheets[sIndex]; + if (sheet && sheet.ownerNode === ruleContext) { + try { + var rules = sheet.cssRules ? sheet.cssRules : sheet.rules; + if (rules) { + for (var rIndex = 0; passed && rIndex < rules.length; rIndex++) { + var ruleFromLink = rules[rIndex]; + // check @media rules + if (ruleFromLink.type && ruleFromLink.type === 4 /* CSSRule.MEDIA_RULE */) { + var mediaRules = ruleFromLink.cssRules; + if (mediaRules) { + for (var mIndex = 0; passed && mIndex < mediaRules.length; mIndex++) { + var mRule = mediaRules[mIndex]; + if (mRule.selectorText !== null && mRule.selectorText !== undefined) { + var ruleSelTxt = mRule.selectorText.toLowerCase(); + if (ruleSelTxt.indexOf(":before") !== -1 || ruleSelTxt.indexOf(":after") !== -1) { + var content = mRule.style['content']; + if (content && content.trim().length) { + if (content.trim() !== "\"\"" && + content.trim() !== "\'\'" && + content.trim() !== "none" && + content.trim() !== "attr(x)" && + content.trim() !== "attr(y)") { + passed = false; + } + } + } + } + } + } + } + else if (rules[rIndex].selectorText !== null && rules[rIndex].selectorText !== undefined) { + var rule = rules[rIndex].selectorText.toLowerCase(); + //support both single colon (:) and double colon (::) pseudo + if (rule.indexOf(":before") !== -1 || rule.indexOf(":after") !== -1) { + var content = rules[rIndex].style['content']; + if (content && content.trim().length) { + if (content.trim() !== "\"\"" && + content.trim() !== "\'\'" && + content.trim() !== "none" && + content.trim() !== "attr(x)" && + content.trim() !== "attr(y)") { + passed = false; + } + } + } + } + } + } + } + catch (e) { + // Ignore css access issues + } + } + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ 7475 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.style_color_misuse = void 0; +var CommonUtil_1 = __webpack_require__(7139); +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var DOMWalker_1 = __webpack_require__(3864); +var CacheUtil_1 = __webpack_require__(4566); +exports.style_color_misuse = { + id: "style_color_misuse", + context: "dom:style, dom:*[style], dom:font[color], dom:link", + refactor: { + "RPT_Style_ColorSemantics1": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "group": "style_color_misuse.html", + "Pass_0": "style_color_misuse.html", + "Potential_1": "style_color_misuse.html" + } + }, + messages: { + "en-US": { + "group": "Combine color and descriptive markup to convey information", + "Pass_0": "Rule Passed", + "Potential_1": "Verify color is not used as the only visual means of conveying information" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "1.4.1", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + var styleText = ""; + if (nodeName === "style") { + styleText = CommonUtil_1.CommonUtil.getInnerText(ruleContext).toLowerCase(); + // check import + for (var sIndex = 0; sIndex < ruleContext.ownerDocument.styleSheets.length; sIndex++) { + var sheet = ruleContext.ownerDocument.styleSheets[sIndex]; + if (sheet && sheet.ownerNode === ruleContext) { + try { + var styleRules = sheet.cssRules ? sheet.cssRules : sheet.rules; + for (var styleRuleIndex = 0; styleRuleIndex < styleRules.length; styleRuleIndex++) { + var styleRule = styleRules[styleRuleIndex]; + var styleImportRule = void 0; + if (styleRule.type && styleRule.type === 3 /* CSSRule.IMPORT_RULE */ && (styleImportRule = styleRule).styleSheet) { + var importRules = styleImportRule.styleSheet.cssRules ? styleImportRule.styleSheet.cssRules : styleImportRule.styleSheet.rules; + for (var rIndex = 0; rIndex < importRules.length; rIndex++) { + var iRule = importRules[rIndex]; + styleText += iRule.cssText; + } + } + } + } + catch (e) { + // Silence css access issues + } + } + } + } + else if (ruleContext.hasAttribute("style")) { + styleText = ruleContext.getAttribute("style").toLowerCase(); + } + else if (nodeName === "link" && //check external styles + ruleContext.hasAttribute("rel") && + ruleContext.getAttribute("rel").toLowerCase() === "stylesheet" && + ruleContext.hasAttribute("href") && + ruleContext.getAttribute("href").trim().length !== 0) { + for (var sIndex = 0; sIndex < ruleContext.ownerDocument.styleSheets.length; sIndex++) { + var sheet = ruleContext.ownerDocument.styleSheets[sIndex]; + if (sheet && sheet.ownerNode === ruleContext) { + try { + var rules = sheet.cssRules ? sheet.cssRules : sheet.rules; + for (var rIndex = 0; rIndex < rules.length; rIndex++) { + styleText += rules[rIndex].cssText; + } + } + catch (e) { + // Silence css access issues + } + } + } + } + var passed = true; + // Defect 1022: Find uses of 'color' and '*background*' only + var isBgUsed = styleText.match(/\bbackground\b/i); + var theColorStyleToCheck = styleText.replace(/-color/g, ""); + var isColorUsed = theColorStyleToCheck.match(/\bcolor\b/i); + if (ruleContext.hasAttribute("color") || isColorUsed || isBgUsed) { + var goodTagNames = { + "em": "", "strong": "", "cite": "", "dfn": "", + "code": "", "samp": "", "kbd": "", "var": "", "abbr": "", "acronym": "" + }; + // Color used � are there semantics involved? + passed = nodeName in goodTagNames || + CommonUtil_1.CommonUtil.getAncestor(ruleContext, goodTagNames) !== null; + if (!passed && ruleContext.hasChildNodes()) { + var nw = new DOMWalker_1.DOMWalker(ruleContext); + while (!passed && nw.nextNode() && nw.node !== ruleContext) { + passed = nw.node.nodeName.toLowerCase() in goodTagNames; + } + } + } + // Trigger only once + if (!passed) { + var triggered = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "style_color_misuse", false); + passed = triggered; + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "style_color_misuse", true); + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ 8064 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.style_focus_visible = void 0; +var CommonUtil_1 = __webpack_require__(7139); +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CSSUtil_1 = __webpack_require__(4919); +var ColorUtil_1 = __webpack_require__(3883); +exports.style_focus_visible = { + id: "style_focus_visible", + context: "dom:*", + refactor: { + "RPT_Style_HinderFocus1": { + "Potential_1": "potential_focus_not_visible" + } + }, + help: { + "en-US": { + "group": "style_focus_visible.html", + "potential_focus_not_visible": "style_focus_visible.html", + "pass_focus_visible": "style_focus_visible.html" + } + }, + messages: { + "en-US": { + "group": "The keyboard focus indicator should be visible when default border or outline is modified by CSS", + "potential_focus_not_visible": "Check the keyboard focus indicator is visible when using CSS declaration for 'border' or 'outline'", + "pass_focus_visible": "The keyboard focus indicator is visible or is not changed from the browser default" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "2.4.7", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + skipNodes: { + value: ["table"], + type: "[string]" + }, + checkParams: { + value: ["border", "border-width", "border-style", + "border-top-width", "border-right-width", "border-bottom-width", "border-left-width", + "border-top-color", "border-right-color", "border-bottom-color", "border-left-color", + "border-top-style", "border-right-style", "border-bottom-style", "border-left-style", + "outline", "outline-width", "outline-color", "outline-style"], + type: "[string]" + } + }; + var ruleContext = context["dom"].node; + if (!CommonUtil_1.CommonUtil.isTabbable(ruleContext) || validateParams.skipNodes.value.includes(ruleContext.nodeName.toLowerCase())) { + return null; + } + // Get all styles in a single pass through stylesheets + var allStyles = CSSUtil_1.CSSUtil.getDefinedStylesMultiple(ruleContext, null, ["", ":focus", ":focus-visible", ":focus-within"]); + var normalStyles = allStyles[""]; // consider both user-defined and browser default + var focusStyles = []; + focusStyles.push(allStyles[":focus"]); + focusStyles.push(allStyles[":focus-visible"]); + focusStyles.push(allStyles[":focus-within"]); + // if focus style is defined + var styleObj = focusStyles[0]; + if (Object.keys(styleObj).length > 0) { + //pass if outline is not defined at all, browser will override + if (((!normalStyles["outline-width"] && !normalStyles["outline-style"]) + || (normalStyles["outline-width"] === '0px' || normalStyles["outline-style"] === 'none')) + && (!styleObj["outline-style"] || styleObj["outline-style"] !== 'none')) + return (0, IRule_1.RulePass)("pass_focus_visible"); + var noneStyle = false; + var numOtherStyle = 0; + for (var focusStyle in styleObj) { + if (validateParams.checkParams.value.includes(focusStyle)) { + /** + * failure case: + * 1. focus outline or border style is none and no other style (color or width) defined + * 2. focus outline or border style is same with the normal + * 3. size in focus is same or smaller than default + * 4. color contrast in focus is better + */ + var focusStyleValue = styleObj[focusStyle]; + var normalStyleValue = normalStyles[focusStyle]; + if (focusStyle.includes("style")) { + if (focusStyleValue === "none") + noneStyle = true; + else + noneStyle = false; + if (normalStyleValue && focusStyleValue !== "none" && focusStyleValue === normalStyleValue) + return (0, IRule_1.RulePotential)("potential_focus_not_visible"); + } + else if (focusStyle.includes("width")) { + numOtherStyle++; + //proximation of the width style + if (focusStyleValue === 'initial') + focusStyleValue = '2px'; + else if (focusStyleValue === 'thin') + focusStyleValue = '1px'; + else if (focusStyleValue === 'medium') + focusStyleValue = '2px'; + else if (focusStyleValue === 'thick') + focusStyleValue = '3px'; + if (normalStyleValue) { + if (normalStyleValue === 'initial') + normalStyleValue = '2px'; + else if (normalStyleValue === 'thin') + normalStyleValue = '1px'; + else if (normalStyleValue === 'medium') + normalStyleValue = '2px'; + else if (normalStyleValue === 'thick') + normalStyleValue = '3px'; + } + focusStyleValue = CSSUtil_1.CSSUtil.getPixelsFromStyle(focusStyleValue, ruleContext); + normalStyleValue = CSSUtil_1.CSSUtil.getPixelsFromStyle(normalStyleValue, ruleContext); + if (focusStyleValue == 0 || focusStyleValue <= normalStyleValue) + return (0, IRule_1.RulePotential)("potential_focus_not_visible"); + } + else if (focusStyle.includes("color")) { + numOtherStyle++; + // get the element bg color + var colorCombo = ColorUtil_1.ColorUtil.ColorCombo(ruleContext); + if (colorCombo === null) + continue; + var bg = colorCombo.bg; + if (!bg) + continue; + //proximation of the width style + if (focusStyleValue === 'initial') + focusStyleValue = 'black'; + if (normalStyleValue && normalStyleValue === 'initial') + normalStyleValue = 'black'; + // get the border/outline color as fg colors + focusStyleValue = ColorUtil_1.ColorUtil.Color(focusStyleValue); + normalStyleValue = ColorUtil_1.ColorUtil.Color(normalStyleValue); + if (focusStyleValue === null || normalStyleValue === null) + continue; + //get the border/outline color contrast ratios + var focusRatio = focusStyleValue.contrastRatio(bg); + var normalRatio = normalStyleValue.contrastRatio(bg); + if (focusRatio < 3.0 || focusRatio <= normalRatio) + return (0, IRule_1.RulePotential)("potential_focus_not_visible"); + } + else { + //other + numOtherStyle++; + if (normalStyleValue != null && focusStyleValue === normalStyleValue) + return (0, IRule_1.RulePotential)("potential_focus_not_visible"); + } + } + } + // warn if a border/outline focus style is 'none' and noe other (color and/or width) is defined + if (noneStyle && numOtherStyle === 0) + return (0, IRule_1.RulePotential)("potential_focus_not_visible"); + } + else { + // no focus style defined + // warn if normal style is defined and is not "none" + for (var normalStyle in normalStyles) { + if (validateParams.checkParams.value.includes(normalStyle)) { + var normalStyleValue = normalStyles[normalStyle]; + // ignore if border or outline style is "none" + if (normalStyleValue !== 'none') + return (0, IRule_1.RulePotential)("potential_focus_not_visible"); + } + } + } + return (0, IRule_1.RulePass)("pass_focus_visible"); + } +}; + + +/***/ }, + +/***/ 7942 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.style_highcontrast_visible = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CacheUtil_1 = __webpack_require__(4566); +exports.style_highcontrast_visible = { + id: "style_highcontrast_visible", + context: "dom:style, dom:link, dom:*[style]", + refactor: { + "RPT_Style_Trigger2": { + "Pass_0": "Pass_0", + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Pass_0": "style_highcontrast_visible.html", + "Manual_1": "style_highcontrast_visible.html", + "group": "style_highcontrast_visible.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Manual_1": "Confirm Windows high contrast mode is supported when using CSS to include, position or alter non-decorative content", + "group": "Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["1.1.1", "1.3.2", "1.4.11"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }, + { + "id": ["WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1", "1.3.2", "1.4.11"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (nodeName === "link" && + (!ruleContext.hasAttribute("rel") || ruleContext.getAttribute("rel").toLowerCase() !== "stylesheet")) + return (0, IRule_1.RulePass)("Pass_0"); + if (nodeName !== "style" && nodeName !== "link" && + ruleContext.hasAttribute("style") && ruleContext.getAttribute("style").trim().length === 0) + return (0, IRule_1.RulePass)("Pass_0"); + var triggered = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "style_highcontrast_visible", false); + var passed = triggered; + // Packages.java.lang.System.out.println(triggered); + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "style_highcontrast_visible", true); + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }, + +/***/ 2219 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.style_hover_persistent = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +exports.style_hover_persistent = { + id: "style_hover_persistent", + context: "dom:style, dom:*[style], dom:*", + help: { + "en-US": { + "Pass_0": "style_hover_persistent.html", + // "Pass_1": "style_hover_persistent.html", + "Pass_2": "style_hover_persistent.html", + "Potential_1": "style_hover_persistent.html", + "Potential_2": "style_hover_persistent.html", + "Potential_3": "style_hover_persistent.html", + "group": "style_hover_persistent.html" + } + }, + messages: { + "en-US": { + "Pass_0": "the hover: pseudo-class is not used to display content", + // "Pass_1": "content displayed via the :hover pseudo-class is a direct child of the trigger element", + "Pass_2": "content displayed via the :hover pseudo-class is the adjacent sibling of the trigger element", + "Potential_1": "Confirm the pointer can be positioned over the displayed element, not just the trigger", + "Potential_2": "Confirm the pointer can be positioned over all the information displayed on hover", + "Potential_3": "Confirm the margin style attribute has not prevented the pointer from hovering over the displayed element, not just the trigger", + "group": "The pointer should be able to move over content displayed on hover" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_2"], + "num": ["1.4.13"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var pass0 = false; + var pass1 = false; + var pass2 = false; // never happen + var potential1 = false; + var potential2 = false; + var potential3 = false; + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + var styleText = ""; + if (nodeName === "style") { + // console.log("RULE RUN ******************"); + styleText = CommonUtil_1.CommonUtil.getInnerText(ruleContext).toLowerCase(); + // check import + // console.log("ruleContext.ownerDocument.styleSheets.length = "+ruleContext.ownerDocument.styleSheets.length); + for (var sIndex = 0; sIndex < ruleContext.ownerDocument.styleSheets.length; ++sIndex) { + var sheet = ruleContext.ownerDocument.styleSheets[sIndex]; + if (sheet && sheet.ownerNode === ruleContext) { + try { + var styleRules = sheet.cssRules ? sheet.cssRules : sheet.rules; + // console.log("styleRules.length = "+styleRules.length); + for (var styleRuleIndex = 0; styleRuleIndex < styleRules.length; styleRuleIndex++) { + // console.log("**********"); + // console.log("********** FOR LOOP styleRuleIndex = "+styleRuleIndex); + var foundHover = false; + var hoverElement = ""; + var plusCombinator = false; + var tildeCombinator = false; + var afterCombinatorElement = ""; + var afterCombinatorElementDisplay = false; + var afterCombinatorElementDisplayValue = false; + var afterCombinatorElementHover = false; + var supportingElement = false; + var supportingHover = false; + var supportingHoverElementDisplayProperty = false; + var supportingHoverElementDisplayValue = false; + var adjacentPlusSibling = false; + var adjacentTildeMultipleSibling = false; + var styleRule = styleRules[styleRuleIndex]; + var ruleText = styleRules[styleRuleIndex].cssText; + // console.log("styleRules["+styleRuleIndex+"] = "+ruleText); + // 1. Check for :hover + if (ruleText.match(/:hover/g)) { + foundHover = true; + // console.log("1. found :hover = "+ foundHover); + // 2. Get hover element + hoverElement = ruleText.split(":")[0]; + // console.log("2. found element that goes with :hover = "+hoverElement); + } + else { + // console.log("1. No hover on css element so skip this rule"); + continue; // if no :hover skip this rule + } + // 3a. Check for css combinator + + // 4a. if so do we have an after combinator element + var plusTempStr = ruleText.substring(ruleText.indexOf("+") + 1); + plusTempStr = plusTempStr.trim(); + if (ruleText.match(/:hover \+/g) || ruleText.match(/:hover\+/g)) { + plusCombinator = true; + // console.log("3a. Found plusCombinator = "+ plusCombinator); + afterCombinatorElement = plusTempStr.split(" ")[0]; + // console.log("4a. Found plus afterCombinatorElement = "+afterCombinatorElement); + } + // 3b. Check for css combinator + + // 4b. if so do we have an after combinator element + if (ruleText.match(/:hover \~/g) || ruleText.match(/:hover\~/g)) { + // console.log("match = "+ruleText.match(":hover \~")); + tildeCombinator = true; + // console.log("3b. Found tildeCombinator = "+ tildeCombinator); + var plusTempStr_1 = ruleText.substring(ruleText.indexOf("~") + 1); + plusTempStr_1 = plusTempStr_1.trim(); + afterCombinatorElement = plusTempStr_1.split(" ")[0]; + // console.log("4b. Found tilde afterCombinatorElement = "+afterCombinatorElement); + } + if (!plusCombinator && !tildeCombinator) { + // NO plusCombinator or tildeCombinator so skip this rule + // console.log("NO plusCombinator or tildeCombinator so PASS"); + // console.log("**** REPORT PASS 0 HERE"); + return (0, IRule_1.RulePass)("Pass_0"); // JCH: should we have a N/A pass + } + // So now we have a css element with hover - element:hover so we have problems + // to check + // 5. Check if the after combinator element has display: property + // 6. Check if display property is not none + if (afterCombinatorElement) { + // get index of display: + // console.log("plusTempStr = "+plusTempStr); + var index = plusTempStr.indexOf("display:"); + if (index) { + afterCombinatorElementDisplay = true; + // console.log("5. Found afterCombinatorElementDisplay = "+afterCombinatorElementDisplay); + if (plusTempStr.slice(index + 8).trim().split(" ")[0] !== "none;") { + afterCombinatorElementDisplayValue = true; + // console.log("6. Found afterCombinatorElementDisplayValue not none = "+afterCombinatorElementDisplayValue); + } + else { + // console.log("afterCombinatorElementDisplayValue === none"); + // console.log("**** PUT POTENTIAL 0 HERE"); + continue; + } + } + else { + // this is bad css so it won't happen + // console.log("NO afterCombinatorElementDisplay so skip this rule"); + continue; + } + } + else { + // this is bad css so it won't happen + // console.log("NO afterCombinatorElement so skip this rule"); + continue; + } + if (afterCombinatorElementDisplayValue) + if (sheet && sheet.ownerNode === ruleContext) { + // console.log("**** At this point we have verified that we have a css element with a hover of the format span:hover + div { display: block; } with all the proper properties and values"); + // NOTE: At this point we have verified that we have a css element with a hover + // of the format span:hover + div { display: block; } + // with all the proper properties and values + try { + var styleRules2 = sheet.cssRules ? sheet.cssRules : sheet.rules; + // console.log("styleRules2.length = "+styleRules2.length); + for (var styleRuleIndex2 = 0; styleRuleIndex2 < styleRules2.length; styleRuleIndex2++) { + // Check rule for afterCominatorElement:hover + // If find afterCombinatorElement:hover see if rule has property display: value where + // value != none + // console.log("**********"); + // console.log("********** 2nd FOR styleRuleIndex2 = "+styleRuleIndex2); + var ruleText2 = styleRules[styleRuleIndex2].cssText; + // console.log("ruleText2 = ", ruleText2); + // console.log("afterCombinatorElement = "+afterCombinatorElement); + // Check all supporting elements for margin property + // If find margin STOP and REPORT ERROR + var regExString = afterCombinatorElement + " {"; + var trimRuleText2 = ruleText2.trim(); + var regIndex = trimRuleText2.indexOf(regExString); + var afterCombinatorElementProperties = trimRuleText2.slice(regIndex).trim(); + //if (!afterCombinatorElementProperties.match(/margin/g)) { + if (!trimRuleText2.match(/margin/g)) { + // console.log("No margin problem so continue on..."); + // do we have a supporting element css definitions + var supportingHoverElement = ruleText2.split(":")[0]; + supportingHoverElement = supportingHoverElement.split(" ")[0]; + // console.log("supportingHoverElement = "+supportingHoverElement); + // console.log("afterCombinatorElement = "+afterCombinatorElement); + // NEED TO CHECK FOR afterCominatorElement:hover in ONE STEP + if (supportingHoverElement === afterCombinatorElement && ruleText2.match(/:hover/g)) { + // console.log("7. Found supporting hover element same as afterCombinatorElement") + // 7. Found supporting hover element same as afterCombinatorElement + supportingElement = true; + // does supporting element have hover + // console.log("8. Supporting element has hover also = "+ foundHover); + // 8. Supporting element has hover also + supportingHover = true; + var index = ruleText2.indexOf("display:"); + // console.log("index = "+index); + if (index) { + // 9. Found supportingHoverElementDisplayProperty + supportingHoverElementDisplayProperty = true; + // console.log("9. Found supportingHoverElementDisplayProperty = "+supportingHoverElementDisplayProperty); + if (plusTempStr.slice(index + 8).trim().split(" ")[0] !== "none;") { + // 10. Found supportingHoverElementDisplayValue not none + supportingHoverElementDisplayValue = true; + // console.log("10. Found supportingHoverElementDisplayValue not none = "+supportingHoverElementDisplayValue); + // Get list of hover elements and next sibling for + + // For + there must be at least one ADJACENT sibling + if (hoverElement !== "" && plusCombinator) { + var hoverElementList = ruleContext.ownerDocument.getElementsByTagName(hoverElement.toUpperCase()); + // console.log("hoverElementList.length = "+hoverElementList.length); + // console.log("hoverElementList[0].tagName = "+hoverElementList[0].tagName); + // Get adjacent sibling + // console.log("Adjacent sibling = "+hoverElementList[0].nextElementSibling.tagName); + // console.log("afterCombinatorElement.toUpperCase() = "+afterCombinatorElement.toUpperCase()); + if (afterCombinatorElement.toUpperCase() === hoverElementList[0].nextElementSibling.tagName) { + // console.log("11a. Hover with plus has adjacent sibling.") + // 11a. Hover with plus has adjacent sibling. + adjacentPlusSibling = true; + // At this point we have verified a supporting afterCombinatorElement css rule that contains hover and display property that is not equal to none and has a hover element in the body with an adjacent sibling + // console.log("**** REPORT PASS 1 HERE"); + pass0 = true; + continue; + } + } + else if (plusCombinator) { + // console.log("11a. Main hover with + combinator has no adjacent sibling"); + if (!potential1) { + // console.log("**** PUT POTENTIAL 1 HERE"); + potential1 = true; + break; + } + continue; + } + // Get list of hover elements and determine if there are 2 or more adjacent siblings for ~ + // For ~ there must be at least one ADJACENT sibling + if (hoverElement !== "" && tildeCombinator) { + // console.log("hoverElement.toUpperCase() = "+hoverElement.toUpperCase()); + var hoverElementList = ruleContext.ownerDocument.getElementsByTagName(hoverElement.toUpperCase()); + // console.log("hoverElementList.length = "+hoverElementList.length); + // Check for two or more adjacent siblings + var siblings = []; + var sibling = hoverElementList[0].nextElementSibling; + do { + // console.log("sibling.tagName = "+sibling.tagName); + if (sibling.tagName === afterCombinatorElement.toUpperCase()) { + siblings.push(sibling); + } + else { + break; + } + } while ((sibling = sibling.nextElementSibling)); + var siblingCount = siblings.length; + // console.log("siblingCount = "+siblingCount); + // JCH TODO: what if sibling count 0 + if (siblingCount === 1) { + // console.log("11b. Hover with tilde and one adjacent sibling"); + adjacentTildeMultipleSibling = true; + // console.log("**** REPORT PASS 2 HERE"); + return (0, IRule_1.RulePass)("Pass_2"); + } + else if (siblingCount > 1) { + // console.log("Main hover with ~ combinator has two or more siblings"); + if (!potential2) { + // console.log("**** PUT POTENTIAL 2 HERE"); + return (0, IRule_1.RulePotential)("Potential_2"); + } + } + } + } + else if (plusCombinator) { + // supportingHoverElementDisplayValue + // if we make it to the last rule and supportingHoverElementDisplayValue is still false => potential1 + if (styleRuleIndex2 === styleRules2.length - 1 && supportingHoverElementDisplayValue === false) { + // console.log("NO plus supportingHoverElementDisplayProperty"); + // console.log("**** PUT POTENTIAL 1 HERE"); + return (0, IRule_1.RulePotential)("Potential_1"); + } + else { + continue; + } + } + else if (tildeCombinator) { + // if we make it to the last rule and supportingHoverElementDisplayValue is still false => potential2 + if (styleRuleIndex2 === styleRules2.length - 1 && supportingHoverElementDisplayValue === false) { + // console.log("NO plus supportingHoverElementDisplayProperty"); + // console.log("**** PUT POTENTIAL 2 HERE"); + return (0, IRule_1.RulePotential)("Potential_1"); + } + else { + continue; + } + } + // note at least one of the rules must have a display property + } + else if (plusCombinator) { + // if we make it to the last rule and supportingHoverElementDisplayProperty is still false => potential1 + if (styleRuleIndex2 === styleRules2.length - 1 && supportingHoverElementDisplayProperty === false) { + // console.log("NO plus supportingHoverElementDisplayProperty"); + // console.log("**** PUT POTENTIAL 1 HERE"); + return (0, IRule_1.RulePotential)("Potential_1"); + } + else { + continue; + } + } + else if (tildeCombinator) { + // if we make it to the last rule and supportingHoverElementDisplayProperty is still false => potential2 + if (styleRuleIndex2 === styleRules2.length - 1 && supportingHoverElementDisplayProperty === false) { + // console.log("NO tilde supportingHoverElementDisplayProperty"); + // console.log("**** PUT POTENTIAL 2 HERE"); + return (0, IRule_1.RulePotential)("Potential_1"); + } + else { + continue; + } + } + // note at least one of the rules must have a supportingElement:hover + } + else if (plusCombinator) { + // if we make it to the last rule and supportingElement is still false => potential1 + // console.log("styleRuleIndex2 = "+styleRuleIndex2); + // console.log("styleRules2.length = "+styleRules2.length); + // console.log("supportingElement = "+supportingHover); + if (styleRuleIndex2 === styleRules2.length - 1 && supportingHover === false) { + // console.log("NO plus supportingElement:hover"); + // console.log("**** PUT POTENTIAL 1 HERE"); + return (0, IRule_1.RulePotential)("Potential_1"); + } + else { + continue; + } + } + else if (tildeCombinator) { + // if we make it to the last rule and supportingElement is still false => potential2 + // console.log("styleRuleIndex2 = "+styleRuleIndex2); + // console.log("styleRules2.length = "+styleRules2.length); + // console.log("supportingElement = "+supportingHover); + if (styleRuleIndex2 === styleRules2.length - 1 && supportingHover === false) { + // console.log("NO tilde supportingElement:hover"); + // console.log("**** PUT POTENTIAL 2 HERE"); + return (0, IRule_1.RulePotential)("Potential_2"); + } + else { + continue; + } + } + } + else { + // console.log("There is a margin in the supporting element"); + if (!potential3) { + // console.log("**** PUT POTENTIAL 3 HERE"); + potential3 = true; + return (0, IRule_1.RulePotential)("Potential_3"); + } + } + } + } + catch (e) { + // Silence css access issues + } + } + } + } + catch (e) { + // Silence css access issues + } + } + } + } + // console.log("----------------------"); + // console.log("pass0 = "+pass0); + // console.log("pass1 = "+pass1); + // console.log("pass2 = "+pass2); + // console.log("potential1 = "+potential1); + // console.log("potential2 = "+potential2); + // console.log("potential3 = "+potential3); + if (pass0) + return (0, IRule_1.RulePass)("Pass_0"); + // if (pass1) return RulePass("Pass_2"); // Doesn't trigger + // if (pass2) return RulePass("Pass_3"); // Doesn't trigger + if (potential1) + return (0, IRule_1.RulePotential)("Potential_1"); + if (potential2) + return (0, IRule_1.RulePotential)("Potential_2"); + if (potential3) + return (0, IRule_1.RulePotential)("Potential_3"); + } +}; + + +/***/ }, + +/***/ 1473 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.style_viewport_resizable = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +/** + * Description: Trigger when viewport units are used for font size. + * Origin: Various + */ +exports.style_viewport_resizable = { + id: "style_viewport_resizable", + context: "dom:link, dom:style, dom:*[style]", + refactor: { + "WCAG21_Style_Viewport": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "group": "style_viewport_resizable.html", + "Pass_0": "style_viewport_resizable.html", + "Potential_1": "style_viewport_resizable.html" + } + }, + messages: { + "en-US": { + "group": "Text must scale up to 200% without loss of content or functionality", + "Pass_0": "Rule Passed", + "Potential_1": "Verify that text sized using viewport units can be resized up to 200%" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: ["1.4.4", "1.4.10"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = true; + var thePattern = /\d+(vw|vh|vmin|vmax)/gi; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (nodeName === "style") { + for (var sIndex = 0; sIndex < ruleContext.ownerDocument.styleSheets.length; sIndex++) { + var sheet = ruleContext.ownerDocument.styleSheets[sIndex]; + if (sheet.ownerNode === ruleContext) { + try { + var styleRules = sheet.cssRules ? sheet.cssRules : sheet.rules; + if (styleRules) { + for (var styleRuleIndex = 0; passed && styleRuleIndex < styleRules.length; styleRuleIndex++) { + var rule = styleRules[styleRuleIndex]; + if (rule.type && rule.type === 1 /* CSSRule.STYLE_RULE */) { + var styleRule = rule; + if (styleRule.style['fontSize']) { + var fontSize = styleRule.style['fontSize'].trim(); + var found = fontSize.match(thePattern); + if (fontSize.length && found) { + passed = false; + } + } + } + // check import rules + else if (rule.type && rule.type === 3 /* CSSRule.IMPORT_RULE */ && rule.styleSheet) { + var importRule = rule; + var rules = importRule.styleSheet.cssRules ? importRule.styleSheet.cssRules : importRule.styleSheet.rules; + if (rules) { + for (var rIndex = 0; passed && rIndex < rules.length; rIndex++) { + var importedRule = rules[rIndex]; + if (importedRule.type && importedRule.type === 1 /* CSSRule.STYLE_RULE */) { + if (importedRule.style['fontSize']) { + var fontSize = importedRule.style['fontSize'].trim(); + var found = fontSize.match(thePattern); + if (fontSize.length && found) { + passed = false; + } + } + } + } + } + } + } + } + } + catch (e) { + // Ignore css access issues + } + } + } + } + else if (nodeName === "link") { + for (var sIndex = 0; sIndex < ruleContext.ownerDocument.styleSheets.length; sIndex++) { + var sheet = ruleContext.ownerDocument.styleSheets[sIndex]; + if (sheet && sheet.ownerNode === ruleContext) { + try { + var rules = sheet.cssRules ? sheet.cssRules : sheet.rules; + if (rules) { + for (var rIndex = 0; passed && rIndex < rules.length; rIndex++) { + var ruleFromLink = rules[rIndex]; + // check rules + if (ruleFromLink.type && ruleFromLink.type === 1 /* CSSRule.STYLE_RULE */) { + if (ruleFromLink.style['fontSize']) { + var fontSize = ruleFromLink.style['fontSize'].trim(); + var found = fontSize.match(thePattern); + if (fontSize.length && found) { + passed = false; + } + } + } + } + } + } + catch (e) { + // Ignore css access issues + } + } + } + } + else { + var styleValue = ruleContext.getAttribute('style'); + if (styleValue) { + var stylePattern = /font-size:\s*\d+(vw|vh|vmin|vmax)/gi; + var found = styleValue.match(stylePattern); + if (found) { + passed = false; + } + } + } + return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ 1912 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.svg_graphics_labelled = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AccNameUtil_1 = __webpack_require__(1950); +var VisUtil_1 = __webpack_require__(3946); +exports.svg_graphics_labelled = { + id: "svg_graphics_labelled", + context: "dom:svg", + help: { + "en-US": { + "group": "svg_graphics_labelled.html", + "pass": "svg_graphics_labelled.html", + "fail_acc_name": "svg_graphics_labelled.html" + } + }, + messages: { + "en-US": { + "group": "A non-decorative SVG element must have an accessible name", + "pass": "The SVG element has an accessible name", + "fail_acc_name": "The SVG element has no accessible name" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [{ + "7d6734": { + "pass": "pass", + "fail_acc_name": "fail" + } + }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || VisUtil_1.VisUtil.isNodePresentational(ruleContext) || AccNameUtil_1.AccNameUtil.isAccessibleNameIgnorable(ruleContext)) + return null; + var name_pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + if (name_pair && name_pair.name && name_pair.name.trim().length > 0) + return (0, IRule_1.RulePass)("pass"); + return (0, IRule_1.RuleFail)("fail_acc_name"); + } +}; + + +/***/ }, + +/***/ 6539 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_aria_descendants = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +exports.table_aria_descendants = { + id: "table_aria_descendants", + context: "aria:table dom:tr[role], aria:table dom:th[role], aria:table dom:td[role], aria:grid dom:tr[role], aria:grid dom:th[role], aria:grid dom:td[role], aria:treegrid dom:tr[role], aria:treegrid dom:th[role], aria:treegrid dom:td[role]", + help: { + "en-US": { + "group": "table_aria_descendants.html", + "explicit_role": "table_aria_descendants.html" + } + }, + messages: { + "en-US": { + "group": "Table structure elements cannot specify an explicit 'role' within table containers", + "explicit_role": "An explicit ARIA 'role' is not valid for <{0}> element within an ARIA role '{1}' per the ARIA in HTML specification" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var parentRole = CommonUtil_1.CommonUtil.isTableDescendant(contextHierarchies); + // cache the result + if (parentRole === null || parentRole.length === 0) + return; + // ignore the redundancy cases: reported in the aria_role_redundant rule + var implicitRoles = AriaUtil_1.AriaUtil.getImplicitRole(ruleContext); + var explicitRoles = AriaUtil_1.AriaUtil.getRoles(ruleContext, false); + ; + if (implicitRoles && implicitRoles.length > 0 && explicitRoles && explicitRoles.length > 0 + && explicitRoles.some(function (item) { return implicitRoles.includes(item); })) + return; + return (0, IRule_1.RuleFail)("explicit_role", [context["dom"].node.nodeName.toLowerCase(), parentRole[0].role]); + } +}; + + +/***/ }, + +/***/ 4 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_caption_empty = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +exports.table_caption_empty = { + id: "table_caption_empty", + context: "dom:caption", + refactor: { + "Valerie_Caption_HasContent": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "table_caption_empty.html", + "Fail_1": "table_caption_empty.html", + "group": "table_caption_empty.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The <table> element has an empty <caption> element", + "group": "A <caption> element for a <table> element must contain descriptive text" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = CommonUtil_1.CommonUtil.hasInnerContentHidden(ruleContext); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ 5334 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_caption_nested = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +exports.table_caption_nested = { + id: "table_caption_nested", + context: "dom:caption", + refactor: { + "Valerie_Caption_InTable": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "table_caption_nested.html", + "Fail_1": "table_caption_nested.html", + "group": "table_caption_nested.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "<caption> element is not nested inside a <table> element", + "group": "The <caption> element must be nested inside the associated <table> element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = CommonUtil_1.CommonUtil.getAncestor(ruleContext, "table") != null; + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ 2173 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_headers_exists = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var TableUtil_1 = __webpack_require__(9196); +exports.table_headers_exists = { + id: "table_headers_exists", + context: "dom:table", + refactor: { + "RPT_Table_DataHeadingsAria": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "table_headers_exists.html", + "Fail_1": "table_headers_exists.html", + "group": "table_headers_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Table has no headers identified", + "group": "Data table must identify headers" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // If this is a layout table or there are no rows, the rule does not apply. + var rows = ruleContext.rows; + if (!TableUtil_1.TableUtil.isDataTable(ruleContext) || rows === null || rows.length === 0) + return null; + var passed = TableUtil_1.TableUtil.tableHeaderExists(ruleContext); + if (passed === null) + return; + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ 8349 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_headers_ref_valid = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +var DOMUtil_1 = __webpack_require__(1686); +var VisUtil_1 = __webpack_require__(3946); +var ARIAMapper_1 = __webpack_require__(9955); +exports.table_headers_ref_valid = { + id: "table_headers_ref_valid", + context: "dom:td[headers], dom:th[headers]", + help: { + "en-US": { + "Pass_0": "table_headers_ref_valid.html", + "Fail_1": "table_headers_ref_valid.html", + "Fail_2": "table_headers_ref_valid.html", + "Fail_3": "table_headers_ref_valid.html", + "Fail_4": "table_headers_ref_valid.html", + "group": "table_headers_ref_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The 'headers' attribute value \"{0}\" does not reference a valid 'id' in this document", + "Fail_2": "The 'headers' attribute value \"{0}\" refers to itself", + "Fail_3": "The 'headers' attribute value \"{0}\" does not refer to a cell in the same table", + "Fail_4": "The 'headers' attribute value \"{0}\" does not refer to a cell indicated with <th> or a role of \"columnheader\" or \"rowheader\"", + "group": "The 'headers' attribute should refer to a valid cell in the same table" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: ["a25f45"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var parentTable = CommonUtil_1.CommonUtil.getAncestor(ruleContext, "table"); + var parentRole = ARIAMapper_1.ARIAMapper.nodeToRole(parentTable); + // If this is a layout table or a simple table the rule does not apply. + if (parentTable == null || !VisUtil_1.VisUtil.isNodeVisible(parentTable) || !["table", "grid"].includes(parentRole)) + return null; + var nodeName = ruleContext.nodeName.toLowerCase(); + var doc = ruleContext.ownerDocument; + var value = ruleContext.getAttribute("headers"); + if (!value) + return null; + var ids = value.split(" "); + var invalidHeaderValues = []; + var sameNodeHeaderValues = []; + var sameTableHeaderValues = []; + var invalidElemHeaderValues = []; + for (var i = 0; i < ids.length; i++) { + var id = ids[i]; + if (id.trim() === '') + continue; + var elem = doc.getElementById(id); + if (!elem) + invalidHeaderValues.push(id); + else if (DOMUtil_1.DOMUtil.sameNode(elem, ruleContext)) + sameNodeHeaderValues.push(id); + else if (!DOMUtil_1.DOMUtil.isInSameTable(elem, ruleContext)) + sameTableHeaderValues.push(id); + else { + var elemName = elem.nodeName.toLowerCase(); + if (elemName !== 'th') { + var roles = AriaUtil_1.AriaUtil.getRoles(elem, true); + if (!roles.includes('columnheader') && !roles.includes('rowheader')) + invalidElemHeaderValues.push(id); + } + } + } + var results = []; + if (invalidHeaderValues.length != 0) + results.push((0, IRule_1.RuleFail)("Fail_1", [invalidHeaderValues.toString()])); + if (sameNodeHeaderValues.length != 0) + results.push((0, IRule_1.RuleFail)("Fail_2", [sameNodeHeaderValues.toString()])); + if (sameTableHeaderValues.length != 0) + results.push((0, IRule_1.RuleFail)("Fail_3", [sameTableHeaderValues.toString()])); + if (invalidElemHeaderValues.length != 0) + results.push((0, IRule_1.RuleFail)("Fail_4", [invalidElemHeaderValues.toString()])); + if (results.length == 0) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return results; + } + } +}; + + +/***/ }, + +/***/ 8142 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_headers_related = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +var CacheUtil_1 = __webpack_require__(4566); +var TableUtil_1 = __webpack_require__(9196); +exports.table_headers_related = { + id: "table_headers_related", + context: "dom:td, dom:th", + refactor: { + "Valerie_Table_DataCellRelationships": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "table_headers_related.html", + "Fail_1": "table_headers_related.html", + "group": "table_headers_related.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Complex table does not have headers for each cell properly defined with 'header' or 'scope'", + "group": "For a complex data table, all <th> and <td> elements must be related via 'header' or 'scope' attributes" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var parentTable = CommonUtil_1.CommonUtil.getAncestor(ruleContext, "table"); + // If this is a layout table or a simple table the rule does not apply. + if (parentTable == null || !TableUtil_1.TableUtil.isComplexDataTable(parentTable)) + return null; + // If this table hasn't been preprocessed, process it. + if (CacheUtil_1.CacheUtil.getCache(ruleContext, "table_headers_related", null) === null) { + // Build a grid that's actually usable (rowspan and colspan elements are duplicated) + // This builds a real 2d table array. + var grid = []; + for (var i = 0; i < parentTable.rows.length; ++i) { + var row = parentTable.rows[i]; + if (!grid[i]) + grid[i] = []; + for (var j = 0; j < row.cells.length; ++j) { + var cell = row.cells[j]; + CacheUtil_1.CacheUtil.setCache(cell, "table_headers_related", i + ":" + j); + var width = parseInt(cell.getAttribute("colspan")); + if (!width) + width = 1; + var height = parseInt(cell.getAttribute("rowspan")); + if (!height) + height = 1; + var gX = 0; + while (grid[i][gX]) + gX += 1; + for (var k = 0; k < height; ++k) { + if (!grid[i + k]) + grid[i + k] = []; + for (var l = 0; l < width; ++l) { + grid[i + k][gX + l] = cell; + } + } + } + } + // Iterate through the table grid and record headers that point to cells and + // cells that are pointed to by headers + var doc = ruleContext.ownerDocument; + var lookup = {}; + var scopedCols = {}; + for (var i = 0; i < grid.length; ++i) { + var rowScoped = false; + for (var j = 0; j < grid[i].length; ++j) { + var gridCell = grid[i][j]; + var gridNodeName = gridCell.nodeName.toLowerCase(); + if (gridNodeName == "th") { + if (gridCell.getAttribute("scope") == "row") { + rowScoped = true; + // If there's an axis attribute, it must be referred to by headers, + // scope is not enough. + if (!CommonUtil_1.CommonUtil.attributeNonEmpty(gridCell, "axis")) + lookup[CacheUtil_1.CacheUtil.getCache(gridCell, "table_headers_related", null)] = true; + } + else if (gridCell.getAttribute("scope") == "col") { + scopedCols[j] = true; + // If there's an axis attribute, it must be referred to by headers, + // scope is not enough. + if (!CommonUtil_1.CommonUtil.attributeNonEmpty(gridCell, "axis")) + lookup[CacheUtil_1.CacheUtil.getCache(gridCell, "table_headers_related", null)] = true; + } + // Headers can refer to other headers + if (CommonUtil_1.CommonUtil.attributeNonEmpty(gridCell, "headers")) { + var hdrs = gridCell.getAttribute("headers").split(" "); + for (var k = 0; k < hdrs.length; ++k) { + var headElem = doc.getElementById(hdrs[k].trim()); + if (headElem && CommonUtil_1.CommonUtil.getAncestor(headElem, "table") == parentTable) { + lookup[CacheUtil_1.CacheUtil.getCache(headElem, "table_headers_related", null)] = true; + } + } + } + } + else if (gridNodeName == "td") { + if (rowScoped || scopedCols[j]) { + lookup[CacheUtil_1.CacheUtil.getCache(gridCell, "table_headers_related", null)] = true; + } + else if (CommonUtil_1.CommonUtil.attributeNonEmpty(gridCell, "headers")) { + var hdrs = gridCell.getAttribute("headers").split(" "); + for (var k = 0; k < hdrs.length; ++k) { + var headElem = doc.getElementById(hdrs[k].trim()); + if (headElem && CommonUtil_1.CommonUtil.getAncestor(headElem, "table") == parentTable) { + lookup[CacheUtil_1.CacheUtil.getCache(gridCell, "table_headers_related", null)] = true; + lookup[CacheUtil_1.CacheUtil.getCache(headElem, "table_headers_related", null)] = true; + } + } + } + } + } + } + CacheUtil_1.CacheUtil.setCache(parentTable, "table_headers_related", lookup); + } + var rcInfo = CacheUtil_1.CacheUtil.getCache(ruleContext, "table_headers_related", null); + var tInfo = CacheUtil_1.CacheUtil.getCache(parentTable, "table_headers_related", null); + var passed = rcInfo && tInfo && rcInfo in tInfo; + if (!passed && rcInfo === "0:0" && + CommonUtil_1.CommonUtil.getInnerText(ruleContext).trim().length == 0) { + // We don't test if it's the upper-left cell and it's empty + return null; + } + // If the table has no th's, it may just be that this was supposed to be a layout + // table, which introduces a lot of noise. In that case, only trigger this error + // once per table. + if (!passed && parentTable.getElementsByTagName("th").length == 0) { + if (CacheUtil_1.CacheUtil.getCache(parentTable, "table_headers_related_TrigOnce", false) === true) { + passed = true; + } + else { + CacheUtil_1.CacheUtil.setCache(parentTable, "table_headers_related_TrigOnce", true); + } + } + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ 3980 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_layout_linearized = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var VisUtil_1 = __webpack_require__(3946); +var TableUtil_1 = __webpack_require__(9196); +exports.table_layout_linearized = { + id: "table_layout_linearized", + context: "dom:table", + refactor: { + "RPT_Table_LayoutTrigger": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "table_layout_linearized.html", + "Potential_1": "table_layout_linearized.html", + "group": "table_layout_linearized.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify table is not being used to format text content in columns unless the table can be linearized", + "group": "Avoid using tables to format text documents in columns unless the table can be linearized" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_FOUR + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = !TableUtil_1.TableUtil.isLayoutTable(ruleContext); + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ 4701 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_scope_valid = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +exports.table_scope_valid = { + id: "table_scope_valid", + context: "dom:td[scope], dom:th[scope]", + refactor: { + "WCAG20_Table_Scope_Valid": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_0": "table_scope_valid.html", + "Fail_1": "table_scope_valid.html", + "Fail_2": "table_scope_valid.html", + "group": "table_scope_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Value provided is invalid for the 'scope' attribute", + "Fail_2": "The 'scope' attribute should only be used on a <th> element", + "group": "Value for 'scope' attribute must be \"row\", \"col\", \"rowgroup\", or \"colgroup\"" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (nodeName === 'td') + return (0, IRule_1.RuleFail)("Fail_2"); + //only continue for 'th' + var scopeVal = ruleContext.getAttribute("scope").trim().toLowerCase(); + var passed = /^(row|col|rowgroup|colgroup)$/.test(scopeVal); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ 18 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_structure_misuse = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +var VisUtil_1 = __webpack_require__(3946); +var TableUtil_1 = __webpack_require__(9196); +exports.table_structure_misuse = { + id: "table_structure_misuse", + context: "dom:table", + refactor: { + "WCAG20_Table_Structure": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "table_structure_misuse.html", + "Fail_1": "table_structure_misuse.html", + "group": "table_structure_misuse.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The <{0}> element with \"presentation\" role or \"none\" role has structural element(s) and/or attribute(s) '{1}'", + "group": "Table elements with 'role=\"presentation\" or 'role=\"none\" should not have structural elements or attributes" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // JCH - OUT OF SCOPE hidden in context + if (TableUtil_1.TableUtil.isDataTable(ruleContext)) + return null; + if (AriaUtil_1.AriaUtil.isNodeInGrid(ruleContext)) + return null; + var errorNodes = []; + if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "summary")) + errorNodes.push(ruleContext); + var captionElems = ruleContext.getElementsByTagName("caption"); + for (var i = 0; i < captionElems.length; ++i) { + if (CommonUtil_1.CommonUtil.getAncestor(captionElems[i], "table") == ruleContext) { + // Check if the node should be skipped or not based on the Check Hidden Content setting and if the node isVisible or + // not. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(captionElems[i])) { + continue; + } + // Add the node to the errorNodes + errorNodes.push(captionElems[i]); + // Since we are not actually making use of theses errorNodes even though they are passed along with + // ValidationResult, we do not need to keep looping over and getting every single violating node under + // the rule context. This can be a future enhancenment where we actually make use of the error nodes that + // are passed along. Adding this break to speed up performance at this point. + break; // There is no point to keep adding the error nodes, stop after finding the first one + } + } + var thNodes = ruleContext.getElementsByTagName("th"); + for (var i = 0; i < thNodes.length; ++i) { + if (CommonUtil_1.CommonUtil.getAncestor(thNodes[i], "table") == ruleContext) { + // Check if the node should be skipped or not based on the Check Hidden Content setting and if the node isVisible or + // not. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(thNodes[i])) { + continue; + } + // Add the node to the errorNodes + errorNodes.push(thNodes[i]); + // Since we are not actually making use of theses errorNodes even though they are passed along with + // ValidationResult, we do not need to keep looping over and getting every single violating node under + // the rule context. This can be a future enhancenment where we actually make use of the error nodes that + // are passed along. Adding this break to speed up performance at this point. + break; // There is no point to keep adding the error nodes, stop after finding the first one + } + } + var tdNodes = ruleContext.getElementsByTagName("td"); + for (var i = 0; i < tdNodes.length; ++i) { + if ((tdNodes[i].hasAttribute("scope") || tdNodes[i].hasAttribute("headers")) && + CommonUtil_1.CommonUtil.getAncestor(tdNodes[i], "table") == ruleContext) { + // Check if the node should be skipped or not based on the Check Hidden Content setting and if the node isVisible or + // not. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(tdNodes[i])) { + continue; + } + // Add the node to the errorNodes + errorNodes.push(tdNodes[i]); + // Since we are not actually making use of theses errorNodes even though they are passed along with + // ValidationResult, we do not need to keep looping over and getting every single violating node under + // the rule context. This can be a future enhancenment where we actually make use of the error nodes that + // are passed along. Adding this break to speed up performance at this point. + break; // There is no point to keep adding the error nodes, stop after finding the first one + } + } + // Get the node name for the rule context element in this case it will always be table + var currentElementToken = ruleContext.nodeName.toLowerCase(); + // Construct a new array which will contan only the element tag for the violation elements + var structuralElementTokens = new Array(); + // Construct a seen hash that will keep trask of all the elements that were already added to the token array, to make sure + // we do not duplicate any of the elements. Duplicate element tags in the token message looks bad and confusing. + var seen = {}; + // Loop through all the violating structural elements and extract the element tag to be used as a token + for (var i = 0; i < errorNodes.length; i++) { + // Get the node name (tag name) for the violating structural element + var nodeName = errorNodes[i].nodeName.toLowerCase(); + // Only need to add the violating element once + if (!seen.hasOwnProperty(nodeName)) { + // Since we are adding the token as elements and attributes we need to handle + // the summary attribute on the ruleContext (table). We only add summary once, same as + // for elements to avoid duplication in the message. (Summary should not duplicate, but just in case) + if (nodeName == "table" && !seen.hasOwnProperty["summary"]) { + // Mark this as a new attribute + seen["summary"] = true; + // Since this is a new violating element add it to the structural element tokens array + structuralElementTokens.push("summary"); + } + else { + // Mark this as a new element + seen[nodeName] = true; + // Since this is a new violating element add it to the structural element tokens array + structuralElementTokens.push(nodeName); + } + } + } + // We need to take the array of structural elements and join them with a comma and a space to make grammatical correct in + // the message. + var structuralElementTokensStr = structuralElementTokens.join(", "); + //return new ValidationResult(errorNodes.length == 0, errorNodes, '', '', [currentElementToken, structuralElementTokens]); + if (errorNodes.length == 0) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1", [currentElementToken, structuralElementTokensStr]); + } + } +}; + + +/***/ }, + +/***/ 9314 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_summary_redundant = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +var fragment_1 = __webpack_require__(5279); +var DOMUtil_1 = __webpack_require__(1686); +exports.table_summary_redundant = { + id: "table_summary_redundant", + context: "dom:table", + refactor: { + "WCAG20_Table_CapSummRedundant": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "table_summary_redundant.html", + "Fail_1": "table_summary_redundant.html", + "group": "table_summary_redundant.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The table summary duplicates the caption", + "group": "The table summary must not duplicate the caption" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var pofId; + var passed = true; + var sumStr; + if (ruleContext.hasAttribute("summary")) { + pofId = 0; + sumStr = ruleContext.getAttribute("summary").trim().toLowerCase(); + } + else if (ruleContext.hasAttribute("aria-describedby")) { + pofId = 1; + var summaryNodeIds = ruleContext.getAttribute("aria-describedby").split(" "); + var summaryNodeConcat = ""; + for (var i = 0; i < summaryNodeIds.length; i++) { + var summaryNodeId = summaryNodeIds[i]; + if (summaryNodeId) { + var summaryNode = fragment_1.FragmentUtil.getById(ruleContext, summaryNodeId); + if (summaryNode && !DOMUtil_1.DOMUtil.sameNode(summaryNode, ruleContext)) { + summaryNodeConcat += " " + CommonUtil_1.CommonUtil.getInnerText(summaryNode).trim().toLowerCase(); + } + } + } + sumStr = summaryNodeConcat; + } + if (!sumStr) { + return null; + } + else { + var capElems = ruleContext.getElementsByTagName("caption"); + if (capElems.length === 0) { + return null; + } + else if (sumStr.length > 0) { + var capStr = CommonUtil_1.CommonUtil.getInnerText(capElems[0]).trim().toLowerCase(); + if (!sumStr.includes(capStr)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } + } + } +}; + + +/***/ }, + +/***/ 1667 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.target_spacing_sufficient = void 0; +var CommonUtil_1 = __webpack_require__(7139); +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var DOMMapper_1 = __webpack_require__(7507); +var CSSUtil_1 = __webpack_require__(4919); +var CacheUtil_1 = __webpack_require__(4566); +exports.target_spacing_sufficient = { + id: "target_spacing_sufficient", + context: "dom:*", + dependencies: [], + help: { + "en-US": { + "group": "target_spacing_sufficient.html", + "pass_spacing": "target_spacing_sufficient.html", + "pass_sized": "target_spacing_sufficient.html", + "pass_inline": "target_spacing_sufficient.html", + "pass_default": "target_spacing_sufficient.html", + "violation_spacing": "target_spacing_sufficient.html", + "recommendation_inline": "target_spacing_sufficient.html", + "potential_overlap": "target_spacing_sufficient.html" + } + }, + messages: { + "en-US": { + "group": "The target must be sufficiently sized or spaced from other targets", + "pass_spacing": "The target's spacing from other targets is sufficient", + "pass_sized": "The target’s size is more than 24 CSS pixels", + "pass_inline": "The target is in a sentence or its size is otherwise constrained by the line-height of non-target text", + "pass_default": "The target's size is determined by the user agent and is not modified by the author", + "violation_spacing": "Undersized target \"{0}\" does not have sufficient spacing of 12 CSS pixels from another target \"{1}\"", + "recommendation_inline": "Confirm the inline target \"{0}\" is sufficiently spaced from another inline target \"{1}\"", + "potential_overlap": "Ensure the overlapped target \"{0}\" meets a minimum target size or has sufficient spacing from the overlapping target \"{1}\"" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_2"], + num: ["2.5.8"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE, + reasonCodes: ["pass_spacing", "pass_sized", "pass_inline", "pass_default", "violation_spacing", "potential_overlap"] + }, + { + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_2"], + num: ["2.5.8"], + level: IRule_2.eRulePolicy.RECOMMENDATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE, + reasonCodes: ["recommendation_inline"] + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLocaleLowerCase(); + var mapper = new DOMMapper_1.DOMMapper(); + var bounds = mapper.getUnadjustedBounds(ruleContext); //context["dom"].bounds; + if (!bounds) + return null; + // ignore hidden, non-target + if (!CommonUtil_1.CommonUtil.isTarget(ruleContext)) + return null; + if (bounds.height >= 24 && bounds.width >= 24) + return (0, IRule_1.RulePass)("pass_sized"); + // check inline element: without text in the same line + var status = CSSUtil_1.CSSUtil.getInlineStatus(ruleContext); + if (status === null) + return null; + if (status.inline) { + if (status.text) { + if (status.violation === null) + return (0, IRule_1.RulePass)("pass_inline"); + else + // case 1: inline element is too close horizontally + return (0, IRule_1.RulePotential)("recommendation_inline", [nodeName, status.violation]); + } + else { + if (status.violation === null) + return (0, IRule_1.RulePass)("pass_default"); + else + // case 1: inline element is too close horizontally + return (0, IRule_1.RulePotential)("recommendation_inline", [nodeName, status.violation]); + } + } + else { + // ignore browser default + if (CSSUtil_1.CSSUtil.isTargetBrowserDefault(ruleContext)) + return (0, IRule_1.RulePass)("pass_default"); + } + var doc = ruleContext.ownerDocument; + if (!doc) { + return null; + } + var cStyle = getComputedStyle(ruleContext); + if (cStyle === null) + return null; + var zindex = cStyle.zIndex; + if (!zindex || isNaN(Number(zindex))) + zindex = "0"; + // Get the list of target elements + var targetElems = CacheUtil_1.CacheUtil.getCache(doc.documentElement, "target_spacing_sufficient::targets", undefined); + if (typeof targetElems === "undefined") { + targetElems = []; + //select all elements except itself and descendants + var elems = doc.querySelectorAll('body *:not(script):not(style)'); + for (var i = 0; i < elems.length; i++) { + var elem = elems[i]; + if (CommonUtil_1.CommonUtil.isTarget(elem)) { + targetElems.push(elem); + } + } + CacheUtil_1.CacheUtil.setCache(doc.documentElement, "target_spacing_sufficient::targets", targetElems); + } + if (!targetElems || targetElems.length === 0) + return; + var before = true; + var minX = 24; + var minY = 24; + var adjacentX = null; + var adjacentY = null; + var checked = []; //contains a list of elements that have been checked so their descendants don't need to be checked again + var _loop_1 = function (i) { + var elem = targetElems[i]; + /** + * the nodes returned from querySelectorAll is in document order + * if two elements overlap and z-index are not defined, then the node rendered earlier will be overlaid by the node rendered later + * filter out the elements that’re descendant or ancestors of the target element, nor descendant of the target element's siblings + */ + // Use compareDocumentPosition to check containment relationships + // Note: compareDocumentPosition returns 0 when comparing a node to itself + var position = ruleContext.compareDocumentPosition(elem); + // DOCUMENT_POSITION_CONTAINED_BY (16): elem is contained by ruleContext + // Also handle self-comparison (position === 0) + if (position === 0 || (position & Node.DOCUMENT_POSITION_CONTAINED_BY)) { + //the next node in elems will be after the target node (ruleContext). + before = false; + return "continue"; + } + // DOCUMENT_POSITION_CONTAINS (8): elem contains ruleContext + // ignore ascendants of the element, or itself or its ascendant already checked + if ((position & Node.DOCUMENT_POSITION_CONTAINS) || checked.some(function (item) { return item.contains(elem); })) + return "continue"; + var bnds = mapper.getUnadjustedBounds(elem); + if (!bnds) + return "continue"; + var zStyle = getComputedStyle(elem); + var z_index = '0'; + if (zStyle) { + z_index = zStyle.zIndex; + if (!z_index || isNaN(Number(z_index))) + z_index = "0"; + } + // case 2: the element overlaps the target entirely + // note when a link is inline with other target, if the link text wraps in another line in a given viewport, + // the bounds of the link may cover and the entire two lines, causing the other tagets to be overlapped, see two links in the test case: element_inline.html + if (bnds.top <= bounds.top && bnds.left <= bounds.left && bnds.top + bnds.height >= bounds.top + bounds.height + && bnds.left + bnds.width >= bounds.left + bounds.width) { + // if the target on top + if (before ? parseInt(zindex) < parseInt(z_index) : parseInt(zindex) <= parseInt(z_index)) { + return { value: null }; + } + else + return { value: (0, IRule_1.RulePotential)("potential_overlap", [nodeName, elem.nodeName.toLowerCase()]) }; + } + // case 3: if the target overlaps the element entirely + if (bounds.top <= bnds.top && bounds.left <= bnds.left && bounds.top + bounds.height >= bnds.top + bnds.height + && bounds.left + bounds.width >= bnds.left + bnds.width) { + // if the element on top + if (before ? parseInt(zindex) < parseInt(z_index) : parseInt(zindex) <= parseInt(z_index)) { + return { value: (0, IRule_1.RulePotential)("potential_overlap", [nodeName, elem.nodeName.toLowerCase()]) }; + } + else // the target on top + return { value: (0, IRule_1.RuleFail)("violation_spacing", [nodeName, elem.nodeName.toLowerCase()]) }; + } + // case 4: the element overlaps partially with the target + if ((((bounds.top >= bnds.top && bounds.top <= bnds.top + bnds.height) || (bounds.top + bounds.height <= bnds.top && bounds.top + bounds.height >= bnds.top + bnds.height)) + && ((bounds.left > bnds.left && bounds.left < bnds.left + bnds.width) || (bnds.left > bounds.left && bnds.left < bounds.left + bounds.width))) + || (((bounds.top > bnds.top && bounds.top < bnds.top + bnds.height) || (bnds.top > bounds.top && bnds.top < bounds.top + bounds.height)) + && ((bounds.left >= bnds.left && bounds.left <= bnds.left + bnds.width) || (bounds.left + bounds.width >= bnds.left && bounds.left + bounds.width <= bnds.left + bnds.width)))) { + return { value: (0, IRule_1.RulePotential)("potential_overlap", [nodeName, elem.nodeName.toLowerCase()]) }; + } + else { // no overlap with the elem, though may overlap withe other elements + var disX = 24; + var disY = 24; + // the element is in the horizontally same row with the target + if (bounds.width < 24 && ((bounds.top >= bnds.top && bounds.top <= bnds.top + bnds.height) || (bounds.top <= bnds.top && bounds.top + bounds.height > bnds.top))) + disX = Math.min(Math.abs(bounds.left - bnds.left), Math.abs(bounds.left - (bnds.left + bnds.width)), Math.abs(bounds.left + bounds.width - (bnds.left + bnds.width)), Math.abs(bounds.left + bounds.width - bnds.left)); + // the element is in the vertically same column with the target + if (bounds.height < 24 && ((bounds.left >= bnds.left && bounds.left <= bnds.left + bnds.width) || (bounds.left <= bnds.left && bounds.left + bounds.width > bnds.left))) + disY = Math.min(Math.abs(bounds.top - bnds.top), Math.abs(bounds.top - (bnds.top + bnds.height)), Math.abs(bounds.top + bounds.height - (bnds.top + bnds.height)), Math.abs(bounds.top + bounds.height - bnds.top)); + if (disX < minX) { + minX = disX; + adjacentX = elem; + } + if (disY < minY) { + minY = disY; + adjacentY = elem; + } + } + checked.push(elem); + }; + for (var i = 0; i < targetElems.length; i++) { + var state_1 = _loop_1(i); + if (typeof state_1 === "object") + return state_1.value; + } + // case 5: no overlap + insufficient target size. check spacing + if (Math.round(bounds.width / 2) + minX < 12 || Math.round(bounds.height / 2) + minY < 12) { + if (Math.round(bounds.width / 2) + minX < Math.round(bounds.height / 2) + minY) + return (0, IRule_1.RuleFail)("violation_spacing", [nodeName, adjacentX.nodeName.toLowerCase()]); + return (0, IRule_1.RuleFail)("violation_spacing", [nodeName, adjacentY.nodeName.toLowerCase()]); + } + else + return (0, IRule_1.RulePass)("pass_spacing"); + } +}; + + +/***/ }, + +/***/ 9599 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.text_block_heading = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +var DOMWalker_1 = __webpack_require__(3864); +var CSSUtil_1 = __webpack_require__(4919); +var VisUtil_1 = __webpack_require__(3946); +exports.text_block_heading = { + id: "text_block_heading", + context: "dom:p, dom:div, dom:br", + refactor: { + "RPT_Block_ShouldBeHeading": { + // "Pass_0": "pass", + "Potential_1": "potential_heading" + } + }, + help: { + "en-US": { + // "pass": "text_block_heading.html", + "potential_heading": "text_block_heading.html", + "group": "text_block_heading.html" + } + }, + messages: { + "en-US": { + // "pass": "Heading text uses a heading element or role", + "potential_heading": "Confirm this text '{0}' is used as a heading and if so, modify to use a heading element or role", + "group": "Heading text should use a heading element or role" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext) || !VisUtil_1.VisUtil.isNodeVisible(ruleContext)) + return null; + // Don't trigger if we're not in the body or if we're in a script + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["body"]) === null || CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["script"]) !== null) + return null; + var validateParams = { + numWords: { + value: 10, + type: "integer" + } + }; + var bodyFont = 0; + var body = ruleContext.ownerDocument.getElementsByTagName("body"); + if (body != null) { + var bodyStyle = getComputedStyle(body[0]); + if (bodyStyle) + bodyFont = CSSUtil_1.CSSUtil.getPixelsFromStyle(bodyStyle['font-size'], body); + } + var numWords = validateParams.numWords.value; + var wordsSeen = 0; + var wordStr = []; + var emphasizedText = false; + var nw = new DOMWalker_1.DOMWalker(ruleContext); + nw.nextNode(); + var passed = false; + while (!passed && + nw.nextNode() && + nw.node !== ruleContext && + nw.node !== DOMWalker_1.DOMWalker.parentNode(ruleContext) && + !["br", "div", "p"].includes(nw.node.nodeName.toLowerCase())) // Don't report twice + { + if (nw.node === ruleContext || CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(nw.node)) + continue; + var nwName = nw.node.nodeName.toLowerCase(); + if (nw.node.nodeType === 3) { + // for text child + if (nw.node.nodeValue.trim().length > 0 && nw.node.parentElement) { + // check it's style if the target element contains text, e.g., <p> fake heading</p> + var style = getComputedStyle(nw.node.parentElement); + if (style && (style['font-weight'] === 'bold' || style['font-weight'] >= 700 + || (style['font-size'] && style['font-size'].includes("large")) + || (style['font-size'] && bodyFont !== 0 && CSSUtil_1.CSSUtil.getPixelsFromStyle(style['font-size'], nw.node.parentElement) > bodyFont))) { + var nextStr = nw.node.nodeValue.trim(); + var wc = CommonUtil_1.CommonUtil.wordCount(nextStr); + if (wc > 0) { + wordStr.push(nextStr); + emphasizedText = true; + wordsSeen += wc; + } + passed = wordsSeen > numWords; + // Skip this node because it's emphasized + nw.bEndTag = true; + } + else { + // the node contain regular text + passed = true; + } + } + } + else if (nw.node.nodeType === 1) { + // for element child + if (nwName === "b" || nwName === "strong" || nwName === "u" || nwName === "font") { + // if the target element contains emphasis child, e.g., <p><strong>fake heading</strong></p> + var nextStr = CommonUtil_1.CommonUtil.getInnerText(nw.node); + var wc = CommonUtil_1.CommonUtil.wordCount(nextStr); + if (wc > 0) { + wordStr.push(nextStr); + emphasizedText = true; + wordsSeen += wc; + } + passed = wordsSeen > numWords; + // Skip this node because it's emphasized + nw.bEndTag = true; + } + else { + // ignore the element which has a role except 'generic', 'paragraph' or 'strong' + // ignore applet element that is deprecated anyway + var role = AriaUtil_1.AriaUtil.getResolvedRole(nw.node); + passed = (role !== null && role !== 'generic' && role !== 'paragraph' && role !== 'strong') || nwName === "applet"; + } + } + } + if (wordsSeen == 0) + passed = true; + //ignore if the string ends with “:” “,” “-” “;” or “.” + if (!passed) + passed = /[:,;\-\.]$/.test(wordStr.join(" ").trim()); + if (passed) { + return null; + } + else { + return (0, IRule_1.RulePotential)("potential_heading", [wordStr.join(" ")]); + } + } +}; + + +/***/ }, + +/***/ 4672 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.text_contrast_sufficient = void 0; +var CommonUtil_1 = __webpack_require__(7139); +var VisUtil_1 = __webpack_require__(3946); +var ColorUtil_1 = __webpack_require__(3883); +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CSSUtil_1 = __webpack_require__(4919); +exports.text_contrast_sufficient = { + id: "text_contrast_sufficient", + context: "dom:*", + refactor: { + "IBMA_Color_Contrast_WCAG2AA": { + "Pass_0": "pass", + "Fail_1": "fail_contrast", + "Potential_1": "potential_same_color" + }, + "IBMA_Color_Contrast_WCAG2AA_PV": { + "pass_0": "pass", + "potential_1": "potential_graphic_background" + } + }, + help: { + "en-US": { + "group": "text_contrast_sufficient.html", + "pass": "text_contrast_sufficient.html", + "fail_contrast": "text_contrast_sufficient.html", + "potential_same_color": "text_contrast_sufficient.html", + "potential_graphic_background": "text_contrast_sufficient.html", + "potential_text_shadow": "text_contrast_sufficient.html" + } + }, + messages: { + "en-US": { + "group": "The contrast ratio of text with its background must meet WCAG AA requirements", + "pass": "The contrast ratio of text with its background meets WCAG AA requirements", + "fail_contrast": "Text contrast of {0} with its background is less than the WCAG AA minimum requirements for text of size {1}px and weight of {2}", + "potential_same_color": "The foreground text and its background color are both detected as {3}. Verify the text meets the WCAG AA requirements for minimum contrast", + "potential_graphic_background": "Verify the contrast ratio of the text against the lightest and the darkest colors of the background meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}", + "potential_text_shadow": "Verify the contrast ratio of the text with shadow meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "1.4.3", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: ['afw4f7'], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + // avoid diagnosing elements that are not visible + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || + (VisUtil_1.VisUtil.hiddenByDefaultElements != null && + VisUtil_1.VisUtil.hiddenByDefaultElements != undefined && + VisUtil_1.VisUtil.hiddenByDefaultElements.indexOf(nodeName) > -1)) { + return null; + } + //TODO ? should only consider native disabled, ignore aria-disabled + //skip disabled element + if (CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return null; + //skip elements + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["svg", "script", "meta", "style"])) + return null; + var doc = ruleContext.ownerDocument; + if (!doc) { + return null; + } + var win = doc.defaultView; + if (!win) { + return null; + } + // Ensure that this element has children with actual text. + var childStr = CommonUtil_1.CommonUtil.getNodeText(ruleContext); + if (!CommonUtil_1.CommonUtil.isShadowHostElement(ruleContext) || (CommonUtil_1.CommonUtil.isShadowHostElement(ruleContext) && CommonUtil_1.CommonUtil.getNodeText(ruleContext.shadowRoot) === '')) { + if (childStr.trim().length == 0) + return null; + // ignore if the text does not convey anything in human language + /** + * (1) ignore non-alphanumeric or special characters in ASCI: ^(a-zA-Z\d\s) + * (2) ignore non-printable unicode characters: \u0000-\u0008\u000B-\u001F\u007F-\u009F\u2000-\u200F\u2028-\u202F\u205F-\u206F\u3000\uFEFF + * see https://stackoverflow.com/questions/3770117/what-is-the-range-of-unicode-printable-characters + * (3) for now not consider unicode special characters that are different in different languages + */ + //let regex = /[^(a-zA-Z\d\s)\u0000-\u0008\u000B-\u001F\u007F-\u009F\u2000-\u200F\u2028-\u202F\u205F-\u206F\u3000\uFEFF]+/g; + var regex = /[^(a-zA-Z\d\s)\^(\u4e00-\u9fff\u3400-\u4dbf)\u0000-\u0008\u000B-\u001F\u007F-\u009F\u2000-\u200F\u2028-\u202F\u205F-\u206F\u3000\uFEFF]+/g; + childStr = childStr.trim().replace(regex, ''); + if (childStr.trim().length === 0) + return null; + } + var elem = ruleContext; + // the child elements (rather than shadow root) of a shadow host is either re-assigned to the shadow slot if the slot exists + // or not displayed, so shouldn't be checked from the light DOM, rather it should be checked as reassginged slot element(s) in the shadow DOM. + if (CommonUtil_1.CommonUtil.isShadowHostElement(ruleContext)) { + // if it's direct text of a shadow host + if (ruleContext.shadowRoot) { + for (var node = ruleContext.firstChild; node; node = node.nextSibling) { + if (node.nodeType == 3) { + //if multiple texts exist, only need to check one + elem = node.assignedSlot; + break; + } + } + } + if (elem === null) + return; + } + var style = win.getComputedStyle(elem); + // JCH clip INFO: + // The clip property lets you specify a rectangle to clip an absolutely positioned element. + // The rectangle specified as four coordinates, all from the top-left corner of the element to be clipped. + // Property values: + // none This is default. No clipping is done + // auto No clipping will be done + // shape The only valid value is: rect (top, right, bottom, left) + // e.g., clip: rect(10px, 20px, 30px, 40px); + // Note: the four values are in the same order as margin/padding + // The rect values are positive pixel values, e.g., 10px, etc. + // margin-box Uses the margin box as the reference box + // border-box Uses the border box as the reference box + // padding-box Uses the padding box as the reference box + // content-box + // fill-box + // stroke-box + // NOTE: the CSS clip property is deprecated + // Also: clip only works if the element is absolutely positioned and can only do rectangles + // check if element visible + var visible = true; + if (style.width !== "0" && + style.height !== "0" && + style.opacity !== "0" && + style.display !== 'none' && + style.visibility !== 'hidden' && + style.overflow !== 'hidden' && + // left and right work with all absolute units + (style.left === "auto" || (style.position === 'absolute' && parseInt(style.left.replace(/[^0-9.+-]/, '')) > 0)) && + (style.left === "auto" || (style.position === 'absolute' && parseInt(style.top.replace(/[^0-9.+-]/, '')) > 0))) { + visible = true; + // console.log("element IS visible"); + // console.log("CHECK COLOR CONTRAST unless to small"); + } + else { + visible = false; + // console.log("element NOT visible"); + } + if (visible === false) { + // console.log("DO NOT CHECK COLOR CONTRAST"); + return null; + } + var clipHeight = -1; + if (style.clip !== "auto") { + var clipString = style.clip.toString(); + if (clipString.includes("rect")) { + var reBrackets = /\((.*)\)/g; + var listOfText = []; + var found = reBrackets.exec(clipString); + var foundArr = found[1].split(', '); + for (var i = 0; i < foundArr.length; i++) { + // console.log("foundArr[",i,"] = ",foundArr[i]); + listOfText.push(foundArr[i]); + } + ; + } + // console.log("listOfText = ",listOfText); + clipHeight = parseInt(listOfText[0].replace(/px/g, '')) - parseInt(listOfText[2].replace(/px/g, '')); + clipHeight = Math.abs(clipHeight); + } + // JCH clip-path INFO: + // Excellent article on clip-path: https://ishadeed.com/article/clip-path/ + // clip-path is a totally different animal with many, many different variations + // The goal was for it to not be as limited as clip + // The syntax is more complicated (as it does more) and it is different from clip, + // e.g., the above clip rectangle would be clip-path: inset(10px 20px 30px 40px); + // Note: there are no commas + // Also, it can take single values to make all sides the same, or 2 values (vert/hori). + // or 3 values (top/hori/bottom) + // And percentages can works as well as px + // + // Although there are five different shapes: inset (term used for rectangle), circle, + // ellipse, polygon, path - we will only concern ourselves with inset + // There are 7 box values: margin-box, border-box, padding-box, content-box, fill-box, stroke-box, view-box + // Box and shape values may be combined: clip-path: padding-box circle(50px at 0 100px); + // NOTE: the box values are NOT intuitive, see: https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Shapes/From_box_values#margin-box + // + // So the key question is what amount of effort do we want to invest into clip-path + // + // JCH don't do clip-path now + var clipPathHeight = -1; + // if (style.clipPath !== "auto") { + // console.log("style.clipPath = ",style.clipPath); + // console.log("style.clipPath.toString = ",style.clipPath.toString()); + // let clipString = style.clipPath.toString(); + // if (clipString.includes("inset")) { + // var reBrackets = /\((.*)\)/g; + // var listOfText = []; + // var found = reBrackets.exec(clipString); + // var foundArr = found[1].split(' '); + // for (let i=0; i<foundArr.length; i++) { + // console.log("foundArr[",i,"] = ",foundArr[i]); + // listOfText.push(foundArr[i]); + // }; + // } + // console.log("listOfText = ",listOfText); + // clipPathHeight = parseInt(listOfText[0].replace(/px/g, '')) - parseInt(listOfText[2].replace(/px/g, '')); + // clipPathHeight = Math.abs(clipHeight); + // } + // console.log("clipPathHeight = ", clipPathHeight); + // if (style.position === "absolute" && style.clip === "rect(0px, 0px, 0px, 0px)" && style.overflow !== "visible") { + // JCH arbitrarily use less that 7px for clipHeight + if (style.position === "absolute" && clipHeight < 7 && clipHeight !== -1) { + // console.log("DO NOT CHECK COLOR CONTRAST because too small"); + // Corner case where item is hidden (accessibility hiding technique) + return null; + } + // First determine the color contrast ratio + var colorCombo = ColorUtil_1.ColorUtil.ColorCombo(elem); + if (colorCombo === null) { + //some exception occurred, or not able to get color combo for some reason + console.log("unable to get color combo for element: " + elem.nodeName); + return; + } + var fg = colorCombo.fg; + var bg = colorCombo.bg; + var ratio = fg.contrastRatio(bg); + var weight = CSSUtil_1.CSSUtil.getWeightNumber(style.fontWeight); + var size = CSSUtil_1.CSSUtil.getFontInPixels(style.fontSize, elem); + var isLargeScale = size >= 24 || size >= 18.6 && weight >= 700; + if (CSSUtil_1.CSSUtil.containsCKJ(childStr)) { + // https://github.com/act-rules/act-rules.github.io/pull/2121/files + // for CJK, 22 pt or 18 pt with font-weight >= 700, 1pt = 1.333 px + isLargeScale = size >= 29.3 || size >= 24 && weight >= 700; + } + var passed = ratio >= 4.5 || (ratio >= 3 && isLargeScale); + var hasBackground = colorCombo.hasBGImage || colorCombo.hasGradient; + var textShadow = colorCombo.textShadow; + var isDisabled = CommonUtil_1.CommonUtil.isNodeDisabled(elem); + if (!isDisabled) { + var control = CommonUtil_1.CommonUtil.getControlOfLabel(elem); + if (control) { + isDisabled = CommonUtil_1.CommonUtil.isNodeDisabled(control); + } + } + if (!isDisabled && nodeName === 'label' && CommonUtil_1.CommonUtil.isDisabledByFirstChildFormElement(elem)) { + isDisabled = true; + } + if (!isDisabled && ruleContext.hasAttribute("id") && CommonUtil_1.CommonUtil.isDisabledByReferringElement(elem)) { + isDisabled = true; + } + /**setCache(ruleContext, "EXT_Color_Contrast_WCAG2AA", { + "ratio": ratio, + "isLargeScale": isLargeScale, + "weight": weight, + "size": size, + "hasBackground": hasBackground, + "isDisabled": isDisabled + });*/ + // If element or parent is disabled, this rule does not apply (but may be 3:1 in future) + if (!passed && isDisabled) { + passed = true; + } + if (!passed) { + if (hasBackground) { + // fire potential since a text on an image or gradient may be still viewable, depending on the text location on the gradient or image + return (0, IRule_1.RulePotential)("potential_graphic_background", [ratio.toFixed(2), size, weight]); + // removed by dead control flow + + } + else if (textShadow) { + // fire potential since a text with shadow may be still viewable, depending on the shadow efffects + return (0, IRule_1.RulePotential)("potential_text_shadow", [ratio.toFixed(2), size, weight]); + // removed by dead control flow + + } + else { + if (fg.toHex() === bg.toHex()) { + return (0, IRule_1.RulePotential)("potential_same_color", [ratio.toFixed(2), size, weight, fg.toHex(), bg.toHex(), colorCombo.hasBGImage, colorCombo.hasGradient]); + } + else { + return (0, IRule_1.RuleFail)("fail_contrast", [ratio.toFixed(2), size, weight, fg.toHex(), bg.toHex(), colorCombo.hasBGImage, colorCombo.hasGradient]); + } + } + } + else { + return (0, IRule_1.RulePass)("pass", [ratio.toFixed(2), size, weight, fg.toHex(), bg.toHex(), colorCombo.hasBGImage, colorCombo.hasGradient]); + } + } +}; + + +/***/ }, + +/***/ 4353 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.text_quoted_correctly = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +var VisUtil_1 = __webpack_require__(3946); +exports.text_quoted_correctly = { + id: "text_quoted_correctly", + context: "dom:*", + help: { + "en-US": { + "Pass_0": "text_quoted_correctly.html", + "Potential_1": "text_quoted_correctly.html", + "group": "text_quoted_correctly.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "If the following text is a quotation, mark it as a <q> or <blockquote> element: {0}", + "group": "Quotations should be marked with <q> or <blockquote> elements" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // ignore the check if the node is hidden + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext)) + return null; + // Don't trigger if the element is not in the body + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["body"]) === null) + return null; + var validateParams = { + minWords: { + value: 3, + type: "integer" + } + }; + var minWords = validateParams.minWords.value; + var passed = true; + var walkNode = ruleContext.firstChild; + var violatedtext = null; + // ignore the check for the text of the following elements + var ignored = ["blockquote", "q", "script", "style", "pre", "code", "ruby", "samp"]; + while (passed && walkNode) { + // Comply to the Check Hidden Content setting will be done by default as this rule triggers on each element + // and for each element it only checks that single elements text nodes and nothing else. So all inner elements will be + // covered on their own. Currently for this rule by default Check Hidden Content will work, as we are doing + // a node walk only on siblings so it would not get text nodes from other siblings at all. + // In the case in the future something chnges, just need to add && !RPTUtil.shouldNodeBeSkippedHidden(walkNode) to the below + // if. + if (walkNode.nodeName === "#text") { + var txtVal = walkNode.nodeValue; + // Do the regex tests first - should be fast + // Remove apostrophe's + txtVal = txtVal.replace(/(\S)'(\S)/g, "$1$2"); + var dblQuotes = txtVal.match(/("[^"]+")/g); + var snglQuotes = txtVal.match(/('[^']+')/g); + // Walk the parents - only continue testing if we found a quote, but + // we're not already marked up + // Also skip if we're in a script - there's lots of quotes used in scripts + if ((dblQuotes !== null || snglQuotes !== null) && + CommonUtil_1.CommonUtil.getAncestor(walkNode, ignored) === null) { + if (dblQuotes != null) { + for (var i = 0; passed && i < dblQuotes.length; ++i) + passed = CommonUtil_1.CommonUtil.wordCount(dblQuotes[i]) < minWords; + } + if (snglQuotes != null) { + for (var i = 0; passed && i < snglQuotes.length; ++i) + passed = CommonUtil_1.CommonUtil.wordCount(snglQuotes[i]) < minWords; + } + // Remove any linefeed inside the quote + // violatedtext = txtVal.replace(new RegExp("\\r?\\n|\\r","g"),""); + if (dblQuotes === null) { + violatedtext = snglQuotes.join(", ").replace(new RegExp("\\r?\\n|\\r", "g"), ""); + } + else if (snglQuotes === null) { + violatedtext = dblQuotes.join(", ").replace(new RegExp("\\r?\\n|\\r", "g"), ""); + } + else { + violatedtext = dblQuotes.concat(snglQuotes).join(", ").replace(new RegExp("\\r?\\n|\\r", "g"), ""); + } + } + } + walkNode = walkNode.nextSibling; + } + //if the violatedtext is longer than 69 chars, only keep the first 32, the " ... ", and the last 32 chars + if (!passed && violatedtext.length && violatedtext.length > 69) { + violatedtext = violatedtext.substring(0, 32) + " ... " + violatedtext.substring(violatedtext.length - 32); + } + return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RulePotential)("Potential_1", [violatedtext]); + } +}; + + +/***/ }, + +/***/ 7147 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.text_sensory_misuse = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +var CacheUtil_1 = __webpack_require__(4566); +var VisUtil_1 = __webpack_require__(3946); +exports.text_sensory_misuse = { + id: "text_sensory_misuse", + context: "dom:body, dom:body dom:*", + refactor: { + "RPT_Text_SensoryReference": { + // "Pass_0": "pass", + "Potential_1": "potential_position, potential_other" + } + }, + help: { + "en-US": { + // "pass": "text_sensory_misuse.html", + "potential_position": "text_sensory_misuse.html", + "potential_other": "text_sensory_misuse.html", + "group": "text_sensory_misuse.html" + } + }, + messages: { + "en-US": { + // "pass": "Instructions are meaningful without relying solely on shape, size, or location words", + "potential_position": "Confirm the word(s) '{0}' of the user instruction is used to indicate a logical rather than visual position", + "potential_other": "Confirm the user instruction is still understandable without the word(s) '{0}'", + "group": "Instructions should be meaningful without relying solely on shape, size, or location words" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.3"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Extract the nodeName of the context node + var nodeName = ruleContext.nodeName.toLowerCase(); + //skip the check if the element is hidden or disabled + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext) || VisUtil_1.VisUtil.hiddenByDefaultElements.includes(nodeName)) + return null; + // Don't trigger if we're not in the body or if we're in a script + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["body"]) === null) + return null; + // ignore script, link, label and their child elements + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["script", "a", 'label']) !== null) + return null; + // ignore text on landmark roles, but not on their children (e.g., section, main) + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + if (role) { + var lmRoles = AriaUtil_1.AriaUtil.getRolesWithTypes(ruleContext, ["landmark"]); + if (lmRoles && lmRoles.includes(role)) + return null; + } + // ignore all widgets and headings, and their children, and certain structure roles + var roles = AriaUtil_1.AriaUtil.getRolesWithTypes(ruleContext, ["widget", "heading"]); + // add some structure roles + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(["caption", "cell", "code", "columnheader", "definition", "figure", "list", "listitem", "math", "meter", "row", "rowgroup", "rowheader", "term"], roles); + if (AriaUtil_1.AriaUtil.getAncestorWithRoles(ruleContext, roles) !== null) + return null; + var violatedPositionText = ""; + var violatedOtherText = ""; + var walkNode = ruleContext.firstChild; + var txtVal = ""; + while (walkNode) { + // for each element it only checks that single elements text nodes and nothing else. + // all inner elements will be covered on their own. + // whitespace characters (space, newline, tab) between elements are considered a node too. + if (walkNode.nodeName === "#text") { + var txt = walkNode.nodeValue.trim(); + if (txt.length > 0) + txtVal += (txtVal.length > 0 ? ", " + txt : txt); + } + walkNode = walkNode.nextSibling; + } + if (txtVal.length > 0) { + // first to remove each exempt word with a single space in the text + var exemptRegex = getRegex(ruleContext.ownerDocument, "exemptText"); + txtVal = txtVal.replace(exemptRegex, " "); + violatedPositionText = getViolatedText(ruleContext.ownerDocument, "positionText", txtVal); + violatedOtherText = getViolatedText(ruleContext.ownerDocument, "otherText", txtVal); + } + var ret = []; + if (violatedPositionText) + ret.push((0, IRule_1.RulePotential)("potential_position", [violatedPositionText])); + if (violatedOtherText) + ret.push((0, IRule_1.RulePotential)("potential_other", [violatedOtherText])); + return ret.length == 0 ? null : ret; + } +}; +var validateParams = { + positionText: { + value: ["top-left", "top-right", "bottom-right", "bottom-left", + "top-to-bottom", "left-to-right", "bottom-to-top", "right-to-left", + "right", "left", "above", "below", "top", "bottom", + "upper", "lower", "corner", "beside" + ], + type: "[string]" + }, + otherText: { + value: ["round", "square", "shape", "rectangle", "triangle", + "size", "large", "small", "medium", "big", "huge", "tiny", "extra", + "larger", "smaller", "bigger", "little", "largest", "smallest", "biggest" + ], + type: "[string]" + }, + exemptText: { + value: ["right-click", "left-click", "right-clicking", "right-clicks", + "left-clicking", "left-clicks", "square root", "right now", "off the top" //append as needed + ], + type: "[string]" + } +}; +function getRegex(doc, type) { + if (!validateParams[type]) + return ""; + var sensoryRegex = CacheUtil_1.CacheUtil.getCache(doc, type + "_sensory_misuse", null); + if (sensoryRegex == null) { + var sensoryText = validateParams[type].value; + var regexStr = "(\s\s+|" + sensoryText[0]; + for (var j = 1; j < sensoryText.length; ++j) { + var words = sensoryText[j].trim().split(" "); + regexStr += "|" + words[0]; + if (words.length > 1) { + for (var c = 1; c < words.length; ++c) + regexStr += " +" + words[c]; + } + } + //regexStr += ")\\W"; + regexStr += ")"; + sensoryRegex = new RegExp(regexStr, "gi"); + CacheUtil_1.CacheUtil.setCache(doc, type + "_sensory_misuse", sensoryRegex); + } + return sensoryRegex; +} +function getViolatedText(doc, type, txtVal) { + if (!txtVal) + return ""; + var sensoryTextArr = validateParams[type].value; + var hash = {}, result = []; + // split the string into words + var counts = txtVal.split(/\s+/).reduce(function (map, word) { + var wordWoTrailingPunc = word.replace(/[.?!:;()'",`\]]+$/, ""); + var lcWordWoPunc = word.toLowerCase().replace(/[.?!:;()'",`\]]/g, ""); + for (var counter = 0; counter < sensoryTextArr.length; counter++) { + var a = lcWordWoPunc.indexOf(sensoryTextArr[counter]); + var sensoryWordLen = sensoryTextArr[counter].length; + var charFollowSensoryText = lcWordWoPunc.charAt(sensoryWordLen + a); + // If the word does not contains substring of sensoryTextArr[counter] + // proceed to the next loop iteration for next sensoryText. + if (a < 0) { + continue; + } + //check the following and proceeding punctuations + //let isPuncfollowing = ((charFollowSensoryText == '\-') || + var isPuncfollowing = ((charFollowSensoryText == '\.') || + (charFollowSensoryText == '\?') || (charFollowSensoryText == '\!') || + (charFollowSensoryText == '\:') || (charFollowSensoryText == '\;') || + (charFollowSensoryText == '\(') || (charFollowSensoryText == '\)') || + (charFollowSensoryText == '\'') || (charFollowSensoryText == '\"') || + (charFollowSensoryText == '\,') || (charFollowSensoryText == '.\`') || + (charFollowSensoryText == '\\') || (charFollowSensoryText == '\]')); + var isPuncPreceding = false; + if (a > 0) { + var charPrecedeSensoryText = lcWordWoPunc.charAt(a - 1); + isPuncPreceding = ((charPrecedeSensoryText == '\-') || + (charPrecedeSensoryText == '\.') || + (charPrecedeSensoryText == '\?') || (charPrecedeSensoryText == '\!') || + (charPrecedeSensoryText == '\:') || (charPrecedeSensoryText == '\;') || + (charPrecedeSensoryText == '\(') || (charPrecedeSensoryText == '\)') || + (charPrecedeSensoryText == '\'') || (charPrecedeSensoryText == '\"') || + (charPrecedeSensoryText == '\,') || (charPrecedeSensoryText == '.\`') || + (charPrecedeSensoryText == '\\') || (charPrecedeSensoryText == '\]')); + } + if (((lcWordWoPunc.length == sensoryWordLen) || (isPuncfollowing == true) || (isPuncPreceding == true))) { + if (!hash.hasOwnProperty(wordWoTrailingPunc)) { + hash[wordWoTrailingPunc] = true; + result.push(wordWoTrailingPunc); + } + counter = sensoryTextArr.length; + } + } + map[wordWoTrailingPunc] = (map[wordWoTrailingPunc] || 0) + 1; + return map; + }, Object.create(null)); + return result.join(", "); +} + + +/***/ }, + +/***/ 1419 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.text_spacing_valid = void 0; +var IRule_1 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +var VisUtil_1 = __webpack_require__(3946); +var CSSUtil_1 = __webpack_require__(4919); +var DOMMapper_1 = __webpack_require__(7507); +// Module-level constants +var STYLE_VALUE_REGEX = /(-?[\d.]+)([a-z%]*)/; +var MIN_WORD_SPACING_RATIO = 0.16; +var MIN_LETTER_SPACING_RATIO = 0.12; +var MIN_LINE_HEIGHT_RATIO = 1.5; +var IMPORTANT_SUFFIX = "!important"; +var IMPORTANT_SUFFIX_LENGTH = IMPORTANT_SUFFIX.length + 1; // +1 for the space before !important +/** + * Resolves inherited or unset style values by traversing up the DOM tree + * @param element - The element to resolve the style for + * @param property - The CSS property name + * @param currentValue - The current style value + * @returns The resolved style value + */ +function resolveInheritedStyle(element, property, currentValue) { + var _a; + if (currentValue.startsWith('inherit') || currentValue.startsWith('unset')) { + var ancestor = CSSUtil_1.CSSUtil.getAncestorWithStyles(element.parentElement, (_a = {}, _a[property] = ["*"], _a), ['inherit', 'unset']); + if (ancestor !== null) { + return CSSUtil_1.CSSUtil.getDefinedStyles(ancestor, [property])[property]; + } + else if (currentValue.startsWith('unset')) { + return "initial"; + } + } + return currentValue; +} +/** + * Removes the !important suffix from a style value + * @param styleValue - The style value potentially containing !important + * @returns The style value without !important + */ +function removeImportantSuffix(styleValue) { + return styleValue.substring(0, styleValue.length - IMPORTANT_SUFFIX_LENGTH); +} +/** + * Checks if a spacing property violates accessibility requirements + * @param element - The HTML element being checked + * @param property - The CSS property name (word-spacing, letter-spacing, line-height) + * @param styleValue - The current style value + * @param fontSize - The computed font size in pixels + * @param minRatio - The minimum ratio threshold + * @param allowUnitless - Whether unitless values are allowed (for line-height) + * @returns RuleResult indicating pass or fail + */ +function checkSpacingProperty(element, property, styleValue, fontSize, minRatio, allowUnitless) { + if (allowUnitless === void 0) { allowUnitless = false; } + // Check if !important is used + if (element.style.getPropertyPriority(property) !== 'important') { + return true; + } + // Remove !important suffix + var cleanValue = removeImportantSuffix(styleValue); + // Check for initial or normal values (computed space is 0) + if (cleanValue === 'initial' || cleanValue === 'normal') { + return false; + } + // Parse the numeric value + var numericValue = parseFloat(cleanValue); + if (isNaN(numericValue)) { + return true; + } + // Match value and unit + var parsedValue = cleanValue.trim().match(STYLE_VALUE_REGEX); + if (!parsedValue) { + return true; + } + var value = parsedValue[1], unit = parsedValue[2]; + // Handle unitless values (only for line-height) + if (unit === '') { + if (allowUnitless) { + return parseFloat(value) < minRatio ? false : true; + } + // For other properties, zero value without unit is ignored + if (parseFloat(value) === 0) { + return null; + } + } + // Skip if no unit and non-zero (error case, inapplicable) + if (unit === '' && parseFloat(value) !== 0) { + return null; + } + // Convert to pixels and check ratio + var pixels = CSSUtil_1.CSSUtil.convertValue2Pixels(unit, value, element); + if (pixels !== null && pixels / fontSize < minRatio) { + return false; + } + return true; +} +exports.text_spacing_valid = { + id: "text_spacing_valid", + context: "dom:*", + help: { + "en-US": { + "pass": "text_spacing_valid.html", + "group": "text_spacing_valid.html", + "fail_letter_spacing_style": "text_spacing_valid.html", + "fail_word_spacing_style": "text_spacing_valid.html", + "fail_line_height_style": "text_spacing_valid.html" + } + }, + messages: { + "en-US": { + "pass": "CSS !important is not used in inline style to control letter or word spacing or line height", + "group": "CSS !important should not be used in inline style to control letter or word spacing or line height", + "fail_letter_spacing_style": "CSS !important should not be used in inline ‘letter-spacing’ style", + "fail_word_spacing_style": "CSS !important should not be used in inline ‘word-spacing’ style", + "fail_line_height_style": "CSS !important should not be used in inline ‘line-height’ style" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.4.12"], + "level": IRule_1.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_1.eToolkitLevel.LEVEL_THREE + }], + act: ['9e45ec', '24afc2', '78fd32'], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Ensure that this element has children with actual text + var childStr = ""; + var childNodes = ruleContext.childNodes; + for (var i = 0; i < childNodes.length; ++i) { + if (childNodes[i].nodeType === 3) { // Text node + childStr += childNodes[i].nodeValue; + } + } + if (childStr.trim().length === 0) { + return null; + } + // Skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) { + return null; + } + // Skip the check if the element is off screen + var mapper = new DOMMapper_1.DOMMapper(); + var bounds = mapper.getUnadjustedBounds(ruleContext); + if (!bounds || bounds['top'] < 0 || bounds['left'] < 0) { + return null; + } + // Skip non-HTML elements (e.g., SVG) + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, "svg")) { + return null; + } + // Font size always resolved to 'px' + var computedStyle = getComputedStyle(ruleContext); + var fontSize = parseFloat(computedStyle.getPropertyValue('font-size')); + // Early exit optimization: Check if computed styles already pass + // If all three properties have passing values, we can skip the expensive getDefinedStyles call + var computedWordSpacing = computedStyle.getPropertyValue('word-spacing'); + var computedLetterSpacing = computedStyle.getPropertyValue('letter-spacing'); + var computedLineHeight = computedStyle.getPropertyValue('line-height'); + // Check if computed values pass the requirements + var wordSpacingPasses = true; + var letterSpacingPasses = true; + var lineHeightPasses = true; + // Check word-spacing (ignore 0px which represents default/normal) + if (computedWordSpacing) { + var wordValue = parseFloat(computedWordSpacing); + if (!isNaN(wordValue)) { + var wordPixels = CSSUtil_1.CSSUtil.convertValue2Pixels('px', wordValue.toString(), ruleContext); + if (wordPixels !== null && wordPixels / fontSize < MIN_WORD_SPACING_RATIO) { + wordSpacingPasses = false; + } + } + } + // Check letter-spacing (ignore 0px which represents default/normal) + if (computedLetterSpacing) { + var letterValue = parseFloat(computedLetterSpacing); + if (!isNaN(letterValue)) { + var letterPixels = CSSUtil_1.CSSUtil.convertValue2Pixels('px', letterValue.toString(), ruleContext); + if (letterPixels !== null && letterPixels / fontSize < MIN_LETTER_SPACING_RATIO) { + letterSpacingPasses = false; + } + } + } + // Check line-height + if (computedLineHeight) { + var lineValue = parseFloat(computedLineHeight); + if (!isNaN(lineValue)) { + // Line height can be unitless or in pixels + var match = computedLineHeight.match(STYLE_VALUE_REGEX); + if (match) { + var value = match[1], unit = match[2]; + if (unit === '' || unit === 'px') { + var ratio = unit === '' ? parseFloat(value) : parseFloat(value) / fontSize; + if (ratio < MIN_LINE_HEIGHT_RATIO) { + lineHeightPasses = false; + } + } + } + } + } + // If all computed values pass, we can skip the expensive getDefinedStyles check + if (wordSpacingPasses && letterSpacingPasses && lineHeightPasses) { + return null; + } + // Get defined styles to check for !important declarations + var styles = CSSUtil_1.CSSUtil.getDefinedStyles(ruleContext, ["word-spacing", "letter-spacing", "line-height"]); + if (Object.keys(styles).length === 0) { + return null; + } + var results = []; + // Check word-spacing + var wordStyle = styles['word-spacing']; + if (wordStyle) { + wordStyle = resolveInheritedStyle(ruleContext, 'word-spacing', wordStyle); + var result = checkSpacingProperty(ruleContext, 'word-spacing', wordStyle, fontSize, MIN_WORD_SPACING_RATIO); + results.push(result ? (0, IRule_1.RulePass)("pass") : (0, IRule_1.RuleFail)('fail_word_spacing_style')); + } + // Check letter-spacing + var letterStyle = styles['letter-spacing']; + if (letterStyle) { + letterStyle = resolveInheritedStyle(ruleContext, 'letter-spacing', letterStyle); + var result = checkSpacingProperty(ruleContext, 'letter-spacing', letterStyle, fontSize, MIN_LETTER_SPACING_RATIO); + results.push(result ? (0, IRule_1.RulePass)("pass") : (0, IRule_1.RuleFail)('fail_letter_spacing_style')); + } + // Check line-height (only if no scrollable ancestor) + var lineStyle = styles['line-height']; + var overflowStyles = { + "overflow": ['auto', 'scroll'], + "overflow-x": ['auto', 'scroll'], + "overflow-y": ['auto', 'scroll'] + }; + if (lineStyle && CSSUtil_1.CSSUtil.getAncestorWithStyles(ruleContext, overflowStyles) === null) { + lineStyle = resolveInheritedStyle(ruleContext, 'line-height', lineStyle); + var result = checkSpacingProperty(ruleContext, 'line-height', lineStyle, fontSize, MIN_LINE_HEIGHT_RATIO, true // Allow unitless values for line-height + ); + results.push(result ? (0, IRule_1.RulePass)("pass") : (0, IRule_1.RuleFail)('fail_line_height_style')); + } + return results.length > 0 ? results : null; + } +}; + + +/***/ }, + +/***/ 855 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.text_whitespace_valid = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var CommonUtil_1 = __webpack_require__(7139); +exports.text_whitespace_valid = { + id: "text_whitespace_valid", + context: "dom:*", + help: { + "en-US": { + "pass": "text_whitespace_valid.html", + "potential_text": "text_whitespace_valid.html", + "group": "text_whitespace_valid.html" + } + }, + messages: { + "en-US": { + "pass": "Rule Passed", + "potential_text": "Space characters should not be used to create space between the letters of a word", + "group": "Space characters should not be used to control spacing within a word" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Don't trigger if we're not in the body or if we're in a script + var checkAncestor = CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["body", "script", "code"]); + if (checkAncestor == null || checkAncestor.nodeName.toLowerCase() != "body") + return null; + var passed = true; + var walkNode = ruleContext.firstChild; + while (passed && walkNode) { + // Comply to the Check Hidden Content setting will be done by default as this rule triggers on each element + // and for each element it only checks that single elements text nodes and nothing else. So all inner elements will be + // covered on their own. Currently for this rule by default Check Hidden Content will work, as we are doing + // a node walk only on siblings so it would not get text nodes from other siblings at all. + // In the case in the future something chnges, just need to add && !RPTUtil.shouldNodeBeSkippedHidden(walkNode) to the below + // if. + if (walkNode.nodeName == "#text") { + var txtVal = walkNode.nodeValue; + passed = !(/(^|\s)[a-zA-Z] [a-zA-Z] [a-zA-Z]($|\s)/.test(txtVal)); + } + walkNode = walkNode.nextSibling; + } + if (passed) + return (0, IRule_1.RulePass)("pass"); + return (0, IRule_1.RulePotential)("potential_text"); + } +}; + + +/***/ }, + +/***/ 3420 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.widget_tabbable_exists = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +var ARIAMapper_1 = __webpack_require__(9955); +var DOMWalker_1 = __webpack_require__(3864); +var VisUtil_1 = __webpack_require__(3946); +exports.widget_tabbable_exists = { + id: "widget_tabbable_exists", + context: "aria:button,aria:link,aria:spinbutton,aria:tablist,aria:combobox,aria:listbox,aria:menu,aria:radiogroup,aria:tree,aria:menubar, aria:grid, aria:treegrid, aria:checkbox,aria:slider,aria:spinbutton,aria:textbox,aria:scrollbar,aria:slider,aria:spinbutton", + refactor: { + "IBMA_Focus_Tabbable": { + "pass": "pass", + "fail_no_tabbable": "fail_no_tabbable" + } + }, + help: { + "en-US": { + "pass": "widget_tabbable_exists.html", + "fail_no_tabbable": "widget_tabbable_exists.html", + "group": "widget_tabbable_exists.html" + } + }, + messages: { + "en-US": { + "pass": "Rule Passed", + "fail_no_tabbable": "Component with \"{0}\" role does not have a tabbable element", + "group": "Component must have at least one tabbable element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip the check if the element should be a presentational child of an element + if (AriaUtil_1.AriaUtil.shouldBePresentationalChild(ruleContext)) + return; + var nodeName = ruleContext.nodeName.toLowerCase(); + //ignore datalist element check since it will be part of a input element or hidden by default + if (nodeName === 'datalist') + return null; + // Composite user interface widget roles. They act as containers that manage other, contained widgets. + var roleContainers = ["combobox", "grid", "listbox", "menu", "menubar", "radiogroup", "tablist", "tree", "treegrid"]; + for (var _i = 0, roleContainers_1 = roleContainers; _i < roleContainers_1.length; _i++) { + var role_1 = roleContainers_1[_i]; + if (AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, role_1, true) != null) + // it's a descendant of a composite widget already examined + return null; + } + var role = ARIAMapper_1.ARIAMapper.nodeToRole(ruleContext); + var count = 0; + if (CommonUtil_1.CommonUtil.isTabbable(ruleContext)) { + ++count; + } + // If node has children, look for tab stops in the children + // skip the count if the element requires presentational children only + if (count < 1 && !AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(ruleContext) && ruleContext.firstChild) { + var nw = new DOMWalker_1.DOMWalker(ruleContext); + while (count < 1 && nw.nextNode() && nw.node != ruleContext) { + if (nw.node.nodeType == 1 && !nw.bEndTag && CommonUtil_1.CommonUtil.isTabbable(nw.node)) { + ++count; + } + } + } + var passed = count >= 1; + return passed ? (0, IRule_1.RulePass)("pass") : (0, IRule_1.RulePotential)("fail_no_tabbable", [role]); + } +}; + + +/***/ }, + +/***/ 408 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.widget_tabbable_single = void 0; +var IRule_1 = __webpack_require__(461); +var IRule_2 = __webpack_require__(461); +var DOMWalker_1 = __webpack_require__(3864); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +var ARIAMapper_1 = __webpack_require__(9955); +var CacheUtil_1 = __webpack_require__(4566); +var VisUtil_1 = __webpack_require__(3946); +exports.widget_tabbable_single = { + id: "widget_tabbable_single", + context: "aria:button,aria:link,aria:menuitem,aria:spinbutton,aria:tablist,aria:combobox,aria:listbox,aria:menu,aria:radiogroup,aria:tree,aria:checkbox,aria:option,aria:radio,aria:slider,aria:spinbutton,aria:textbox,aria:columnheader,aria:rowheader,aria:slider,aria:tab", + refactor: { + "IBMA_Focus_MultiTab": { + "pass": "pass", + "potential_multiple_tabbable": "potential_multiple_tabbable" + } + }, + help: { + "en-US": { + "pass": "widget_tabbable_single.html", + "potential_multiple_tabbable": "widget_tabbable_single.html", + "group": "widget_tabbable_single.html" + } + }, + messages: { + "en-US": { + "pass": "Components with a widget role should have no more than one tabbable element", + "potential_multiple_tabbable": "Component with \"{0}\" role has more than one tabbable element", + "group": "Components with a widget role must have no more than one tabbable element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1", "2.4.3"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip the check if the element should be a presentational child of an element + if (AriaUtil_1.AriaUtil.shouldBePresentationalChild(ruleContext)) + return; + var role = ARIAMapper_1.ARIAMapper.nodeToRole(ruleContext); + var count = 0; + if (CommonUtil_1.CommonUtil.isTabbable(ruleContext)) { + ++count; + } + // If node has children, look for tab stops in the children + //skip the count if the element requires presentational children only + var name = []; + if (count < 2 && !AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(ruleContext) && ruleContext.firstChild) { + var nw = new DOMWalker_1.DOMWalker(ruleContext); + while (count < 2 && nw.nextNode() && nw.node != ruleContext) { + if (nw.node.nodeType == 1 && !nw.bEndTag && CommonUtil_1.CommonUtil.isTabbable(nw.node)) { + // Radio inputs with the same name natively are only one tab stop + /**if (nw.node.nodeName.toLowerCase() === 'input' && (nw.node as Element).getAttribute("type") === 'radio') { + let curName = (nw.node as Element).getAttribute("name"); + if (name.includes(curName)) + continue; + else + name.push(curName); + }*/ + ++count; + } + } + } + var passed = count < 2; + if (!passed) + CacheUtil_1.CacheUtil.setCache(ruleContext, "widget_tabbable_single", "potential_multiple_tabbable"); + return passed ? (0, IRule_1.RulePass)("pass") : (0, IRule_1.RulePotential)("potential_multiple_tabbable", [role]); + } +}; + + +/***/ }, + +/***/ 6160 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.a11yRulesets = void 0; +// This file comes from https://raw.githubusercontent.com/act-rules/act-tools/main/src/data/sc-urls.json +var SCURLs = __importStar(__webpack_require__(8855)); +var IGuideline_1 = __webpack_require__(8601); +var SCs = []; +for (var key in SCURLs) { + SCs.push(SCURLs[key]); +} +var summaries = { + "1.1.1": "All non-text content that is presented to the user has a text alternative that serves the equivalent purpose.", + "1.2.1": "For prerecorded audio-only or video-only media, an alternative provides equivalent information.", + "1.2.2": "Captions are provided for all prerecorded audio content in synchronized media.", + "1.2.3": "An alternative for time-based media or audio description of the prerecorded video content is provided for synchronized media.", + "1.2.4": "Captions are provided for all live audio content in synchronized media.", + "1.2.5": "Audio description is provided for all prerecorded video content in synchronized media.", + "1.3.1": "Information, structure, and relationships conveyed through presentation can be programmatically determined or are available in text.", + "1.3.2": "When the sequence in which content is presented affects its meaning, a correct reading sequence can be programmatically determined.", + "1.3.3": "Instructions provided for understanding and operating content do not rely solely on sensory characteristics of components such as shape, size, visual location, orientation, or sound.", + "1.3.4": "Content does not restrict its view and operation to a single display orientation, such as portrait or landscape.", + "1.3.5": "The purpose of each input field that collects information about the user can be programmatically determined when the field serves a common purpose.", + "1.4.1": "Color is not used as the only visual means of conveying information, indicating an action, prompting a response, or distinguishing a visual element.", + "1.4.2": "If any audio plays automatically for more than 3 seconds, either a mechanism is available to pause or stop the audio, or a mechanism is available to control audio volume independently from the overall system volume level.", + "1.4.3": "The visual presentation of text and images of text has a contrast ratio of at least 4.5:1, with a 3:1 ratio for large-scale text.", + "1.4.4": "Text can be resized without assistive technology up to 200 percent without loss of content or functionality.", + "1.4.5": "If the technologies being used can achieve the visual presentation, text should not be used to convey information rather than images of text.", + "1.4.10": "Content can reflow without loss of information or functionality, and without requiring scrolling in two dimensions.", + "1.4.11": "The parts of graphical objects required to understand the content, and the visual information required to identify UI components and states, have a contrast ratio of at least 3:1 against adjacent colors.", + "1.4.12": "No loss of content or functionality occurs when users change letter, word and paragraph spacing, as well as line height.", + "1.4.13": "Where hover or focus actions cause additional content to become visible and hidden, the additional content is dismissable, hoverable and persistent.", + "2.1.1": "All functionality of the content is operable through a keyboard interface without requiring specific timings for individual keystrokes.", + "2.1.2": "If keyboard focus can be moved to a component using a keyboard interface, then focus can be moved away from that component using only a keyboard interface, and, if it requires more than unmodified arrow or tab keys or other standard exit methods, the user is advised of the method for moving focus away.", + "2.1.4": "If a keyboard shortcut is implemented using only letter, punctuation, number or symbol characters, then the shortcut can be turned off, remapped or activated only on focus.", + "2.2.1": "For each time limit that is set by the content, the user can turn off, adjust, or extend the limit.", + "2.2.2": "For moving, blinking, scrolling, or auto-updating information, the user can pause, stop, hide or adjust the information.", + "2.3.1": "Content does not contain anything that flashes more than three times in any one second period, or the flash is below the general flash and red flash thresholds.", + "2.4.1": "A mechanism is available to bypass blocks of content that are repeated on multiple Web pages.", + "2.4.2": "Web pages, non-web documents, and software have titles that describe topic or purpose.", + "2.4.3": "If content can be navigated sequentially and the navigation sequences affect meaning or operation, focusable components receive focus in an order that preserves meaning and operability.", + "2.4.4": "The purpose of each link can be determined from the link text alone or from the link text together with its programmatically determined link content.", + "2.4.5": "More than one way is available to locate a Web page within a set of Web pages, except where the Web Page is the result of, or a step in, a process.", + "2.4.6": "Headings and labels describe topic or purpose.", + "2.4.7": "Any keyboard operable user interface has a mode of operation where the keyboard focus indicator is visible.", + "2.4.11": "When an element receives focus, it is not entirely covered by other content.", + "2.5.1": "All functionality that uses multipoint or path-based gestures for operation can be operated with a single pointer without a path-based gesture.", + "2.5.2": "For functionality that can be operated using a single pointer, completion of the function is on the up-event with an ability to abort, undo or reverse the outcome.", + "2.5.3": "For user interface components with labels that include text or images of text, the accessible name contains the text that is presented visually.", + "2.5.4": "Functionality that can be operated by motion can also be operated by user interface components, and the motion trigger can be disabled.", + "2.5.8": "The size of the target for pointer inputs is at least 24 by 24 CSS pixels.", + "2.5.7": "All functionality that uses a dragging movement for operation can be achieved by a single pointer without dragging.", + "3.1.1": "The default human language of Web pages, non-Web documents, or software can be programmatically determined.", + "3.1.2": "The human language of each passage or phrase in the content can be programmatically determined.", + "3.2.1": "When any component receives focus, it does not initiate a change of context.", + "3.2.2": "Changing the setting of any user interface component does not automatically cause a change of context unless the user has been advised of the behavior before using the component.", + "3.2.3": "Navigational mechanisms that are repeated on multiple Web pages within a set of Web pages occur in the same relative order each time they are repeated, unless a change is initiated by the user.", + "3.2.4": "Components that have the same functionality within a set of Web pages are identified consistently.", + "3.2.6": "Make it easier to find help and support. If a Web page contains help mechanisms they occur in the same order relative to other page content, unless a change is initiated by the user.", + "3.3.1": "If an input error is automatically detected, the item that is in error is identified and the error is described to the user in text.", + "3.3.2": "Labels or instructions are provided when content requires user input.", + "3.3.3": "If an input error is automatically detected and suggestions for correction are known, then the suggestions are provided to the user, unless it would jeopardize the security or purpose of the content.", + "3.3.4": "For content that cause legal commitments or financial transactions for the user to occur, that modify or delete user-controllable data in data storage systems, or that submit user test responses, the user can reverse, correct, or confirm the action.", + "3.3.7": "Make it easier for users to complete multi-step processes. Don't ask for the same information twice in the same session.", + "3.3.8": "Make logins possible with less mental effort. Don't make people solve, recall, or transcribe something to log in.", + "4.1.1": "(Obsolete and removed) This requirement was originally adopted to address problems that assistive technology (AT) had directly parsing HTML. AT no longer has any need to directly parse HTML. Consequently, these problems either no longer exist or are addressed by other requirements.", + "4.1.2": "For all user interface components (including, but not limited to: form elements, links and components generated by scripts), the name and role can be programmatically determined; states, properties, and values that can be set by the user can be programmatically set; and notification of changes to these items is available to user agents, including assistive technologies.", + "4.1.3": "In content implemented using markup languages, status messages can be programmatically determined through role or properties such that they can be presented to the user by assistive technologies without receiving focus.", + "HTML": "The HTML specification issues that cause accessibility issues may be covered by other rules and will be reported under those accessibility requirements. However, some non-conforming HTML specification issues are still reported.", + "ARIA": "The ARIA specification issues that cause accessibility issues may be covered by other rules and will be reported under those accessibility requirements. However, some non-conforming ARIA specification issues are still reported.", +}; +exports.a11yRulesets = [ + // { + // id: "DEBUG", + // name: "DEBUG Rules", + // category: eRuleCategory.ACCESSIBILITY, + // description: "Rules for debugging", + // checkpoints: [{ + // num: "1", + // name: "Debug CP 1", + // wcagLevel: "A", + // summary: "Rules for Debug" + // }] + // }, + { + id: "EXTENSIONS", + name: "Extension Rules", + category: IGuideline_1.eGuidelineCategory.ACCESSIBILITY, + description: "Rules for enabling the browser extensions", + type: IGuideline_1.eGuidelineType.EXTENSION, + checkpoints: [{ + num: "1", + name: "Extension CP 1", + wcagLevel: "A", + summary: "Rules for Extension" + }] + }, + { + id: "IBM_Accessibility", + name: "IBM Accessibility 7.3", + category: IGuideline_1.eGuidelineCategory.ACCESSIBILITY, + description: "Rules for WCAG 2.0, 2.1, 2.2 A and AA plus additional IBM supplemental requirements.", + // This ruleset has all 2.0 and 2.1 checkpoints that are A or AA + checkpoints: SCs + .filter(function (sc) { return (sc.level === "A" || sc.level === "AA" || sc.level === "NA") && (sc.wcagType === "2.0" || sc.wcagType === "2.1" || sc.wcagType === "2.2" || sc.wcagType === "NA"); }) + .map(function (sc) { return ({ + num: sc.num, + scId: sc.scId, + name: sc.handle, + wcagLevel: sc.level, + summary: summaries[sc.num] + }); }) + }, + { + id: "IBM_Accessibility_next", + name: "IBM Accessibility next", + category: IGuideline_1.eGuidelineCategory.ACCESSIBILITY, + description: "Rules for WCAG 2.0, 2.1, 2.2 A and AA plus additional IBM supplemental requirements.", + // This ruleset has all 2.0 and 2.1 checkpoints that are A or AA + checkpoints: SCs + .filter(function (sc) { return (sc.level === "A" || sc.level === "AA" || sc.level === "NA") && (sc.wcagType === "2.0" || sc.wcagType === "2.1" || sc.wcagType === "2.2" || sc.wcagType === "NA"); }) + .map(function (sc) { return ({ + num: sc.num, + scId: sc.scId, + name: sc.handle, + wcagLevel: sc.level, + summary: summaries[sc.num] + }); }) + }, + { + id: "WCAG_2_2", + name: "WCAG 2.2 (A, AA)", + category: IGuideline_1.eGuidelineCategory.ACCESSIBILITY, + description: "Rules for WCAG 2.2 A & AA. This is the current W3C recommendation (specification). Content that conforms to WCAG 2.2 also conforms to WCAG 2.1.", + // This ruleset has all 2.0 and 2.1 checkpoints that are A or AA + checkpoints: SCs + .filter(function (sc) { return (sc.level === "A" || sc.level === "AA") && (sc.wcagType === "2.0" || sc.wcagType === "2.1" || sc.wcagType === "2.2"); }) + .map(function (sc) { return ({ + num: sc.num, + scId: sc.scId, + name: sc.handle, + wcagLevel: sc.level, + summary: summaries[sc.num] + }); }) + }, + { + id: "WCAG_2_1", + name: "WCAG 2.1 (A, AA)", + category: IGuideline_1.eGuidelineCategory.ACCESSIBILITY, + description: "Rules for WCAG 2.1 A & AA. Content that conforms to WCAG 2.1 also conforms to WCAG 2.0.", + // This ruleset has all 2.0 and 2.1 checkpoints that are A or AA + checkpoints: SCs + .filter(function (sc) { return (sc.level === "A" || sc.level === "AA") && (sc.wcagType === "2.0" || sc.wcagType === "2.1"); }) + .map(function (sc) { return ({ + num: sc.num, + scId: sc.scId, + name: sc.handle, + wcagLevel: sc.level, + summary: summaries[sc.num] + }); }) + }, + { + id: "WCAG_2_0", + name: "WCAG 2.0 (A, AA)", + category: IGuideline_1.eGuidelineCategory.ACCESSIBILITY, + description: "Rules for WCAG 2.0 A & AA. Referenced by US Section 508, but not the latest W3C recommendation.", + // This ruleset has all 2.0 checkpoints that are A or AA + checkpoints: SCs + .filter(function (sc) { return (sc.level === "A" || sc.level === "AA") && (sc.wcagType === "2.0"); }) + .map(function (sc) { return ({ + num: sc.num, + scId: sc.scId, + name: sc.handle, + wcagLevel: sc.level, + summary: summaries[sc.num] + }); }) + } +]; + + +/***/ }, + +/***/ 5233 +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SRController = void 0; +var SRCursor_1 = __webpack_require__(8195); +var SRRenderer_1 = __webpack_require__(7014); +var SRNavigator_1 = __webpack_require__(248); +var CacheUtil_1 = __webpack_require__(4566); +var SRUtil_1 = __webpack_require__(2165); +var VisUtil_1 = __webpack_require__(3946); +/** + * SRController class for managing screen reader simulation + * Maintains a point of regard and provides navigation functions + */ +var SRController = /** @class */ (function () { + /** + * Creates a new SRController + * @param rootElement The root element to start from (defaults to document.body) + */ + function SRController(rootElement) { + if (rootElement === void 0) { rootElement = document.body; } + this.rootElement = rootElement; + this.liveListeners = []; + this.ctrlDoc = rootElement.ownerDocument; + this.setPointOfRegard(rootElement); + this.setupMutationTracking(); + console.info("[WARNING] The SRController is a new feature that is not yet \"stable\". What this means:\n* API subject to change, even between minor versions of the checker\n* Results should be considered experimental. There are a variety of known issues, but making this available for early experimentation / feedback."); + } + SRController.getController = function (ctrlDoc) { + if (ctrlDoc === void 0) { ctrlDoc = document; } + if (!this.singleton) { + this.singleton = new SRController(ctrlDoc.body); + } + return this.singleton; + }; + SRController.prototype.disconnect = function () { + if (this.mutationObserver) { + this.mutationObserver.disconnect(); + } + }; + SRController.prototype.findAllShadowRoots = function (root) { + if (root === void 0) { root = document; } + var shadowRoots = []; + // Get all elements in the current root + var walker = this.ctrlDoc.createTreeWalker(root, NodeFilter.SHOW_ELEMENT, null); + var node; + while (node = walker.nextNode()) { + var element = node; + // Check if this element has an open shadow root + if (element.shadowRoot) { + shadowRoots.push(element.shadowRoot); + // Recursively search inside this shadow root + var nestedShadowRoots = this.findAllShadowRoots(element.shadowRoot); + shadowRoots.push.apply(shadowRoots, nestedShadowRoots); + } + } + return shadowRoots; + }; + /** + * Set up mutation tracking + * + * In the event that the point of regard is removed from the DOM, we need to get up to the nearest parent that's not being removed + */ + SRController.prototype.setupMutationTracking = function () { + var _this = this; + if (this.mutationObserver) { + this.mutationObserver.disconnect(); + } + var myThis = this; + var observer = new MutationObserver(function (mutations) { + var porNode = myThis.pointOfRegard.getNode(); + var _loop_1 = function (removalMutation) { + removalMutation.removedNodes.forEach(function (removedNode) { + if (removedNode.isSameNode(porNode) || removedNode.contains(porNode)) { + console.info("Adjusting PoR due to DOM mutation removing PoR"); //, removalMutation.target, removedNode, porNode) + porNode = removalMutation.target; + } + }); + }; + for (var _i = 0, _a = mutations.filter(function (mutation) { var _a; return ((_a = mutation.removedNodes) === null || _a === void 0 ? void 0 : _a.length) > 0; }); _i < _a.length; _i++) { + var removalMutation = _a[_i]; + _loop_1(removalMutation); + } + ; + _this.setPointOfRegard(porNode); + var _loop_2 = function (mutation) { + if (mutation.addedNodes) { + mutation.addedNodes.forEach(function (addedNode) { + // Add observation of new shadow roots + var allRoots = _this.findAllShadowRoots(addedNode); + for (var _i = 0, allRoots_2 = allRoots; _i < allRoots_2.length; _i++) { + var root = allRoots_2[_i]; + observer.observe(root, { + childList: true, + subtree: true, + characterData: true + }); + } + }); + } + var node = mutation.target; + var elem = node.nodeType === 1 ? node : node.parentElement; + if (elem + && !elem.closest("[aria-busy=\"true\"]") + && elem.getAttribute("aria-busy") !== "true") { + // Identify the live region container + var liveRegionElem = + // The element itself is a live region container + ((["polite", "assertive"].includes(elem.getAttribute("aria-live")) + || elem.nodeName.toUpperCase() === "OUTPUT" + || ["status", "log", "progressbar", "alert", "timer"].includes(elem.getAttribute("role"))) && elem) + // Or get the nearest ancestor + || elem.closest("[aria-live=\"polite\"],[aria-live=\"assertive\"],output,[role=\"status\"],[role=\"log\"],[role=\"progressbar\"],[role=\"alert\"],[role=\"timer\"]"); + var isMutationRelevant = false; + var relevance_1 = ["additions", "text"]; + if (liveRegionElem) { + // Determine what kinds of changes are 'relevant' + var relevantElem = elem.closest("[aria-relevant]"); + if (relevantElem) { + relevance_1 = relevantElem.getAttribute("aria-relevant").split(/ +/g); + } + if (liveRegionElem.getAttribute("role") === "log") { + relevance_1 = ["additions"]; + } + if (liveRegionElem.hasAttribute("aria-relevant")) { + relevance_1 = liveRegionElem.getAttribute("aria-relevant").split(/ +/g); + } + if (relevance_1.includes("all")) { + relevance_1 = ["additions", "removals", "text"]; + } + isMutationRelevant = (mutation.target.nodeType === 3 && relevance_1.includes("text")) + || (mutation.addedNodes.length > 0 && relevance_1.includes("additions")) + || (mutation.removedNodes.length > 0 && relevance_1.includes("removals")); + } + if (liveRegionElem && isMutationRelevant) { + var isAtomic_1 = liveRegionElem.getAttribute("aria-atomic") === "true" || ["alert", "status", "timer", "marquee"].includes(liveRegionElem.getAttribute("role")); + // Read the whole region if atomic + if (!isAtomic_1 && mutation.type === "characterData" && mutation.target.nodeType === 3 && !VisUtil_1.VisUtil.isNodeHiddenFromAT(mutation.target.parentElement)) { + for (var _c = 0, _d = _this.liveListeners; _c < _d.length; _c++) { + var liveListener = _d[_c]; + liveListener(mutation.target.nodeValue); + } + } + else { + var liveTarget_1 = isAtomic_1 ? liveRegionElem : mutation.target; + if (liveTarget_1.liveAnnounce) { + clearTimeout(liveTarget_1.liveAnnounce); + } + liveTarget_1.liveAnnounce = setTimeout(function () { + var results = []; + var isRemoval = (relevance_1.includes("removals") && mutation.removedNodes.length > 0); + if (isAtomic_1 || isRemoval) { + var liveCursor = new SRCursor_1.SRCursor(liveTarget_1, false); + var liveCursorEnd = new SRCursor_1.SRCursor(liveTarget_1, true); + liveCursorEnd.next(function () { return true; }); + results.push((isRemoval ? "[removed] " : "") + SRRenderer_1.SRRenderer.renderRange("item", liveCursor, liveCursorEnd)); + } + else if (relevance_1.includes("additions") && mutation.addedNodes.length > 0) { + mutation.addedNodes.forEach(function (addedNode) { + // Just render the additions + var liveCursor = new SRCursor_1.SRCursor(addedNode, false); + var liveCursorEnd = new SRCursor_1.SRCursor(addedNode, true); + liveCursorEnd.next(function () { return true; }); + results.push(SRRenderer_1.SRRenderer.renderRange("item", liveCursor, liveCursorEnd)); + }); + } + for (var _i = 0, _a = _this.liveListeners; _i < _a.length; _i++) { + var liveListener = _a[_i]; + liveListener(results.join("\n")); + } + }, 100); + } + } + } + }; + for (var _b = 0, mutations_1 = mutations; _b < mutations_1.length; _b++) { + var mutation = mutations_1[_b]; + _loop_2(mutation); + } + }); + // Need to observe all of the shadow roots + var allRoots = this.findAllShadowRoots(this.ctrlDoc.documentElement); + allRoots.push(this.ctrlDoc.documentElement); + for (var _i = 0, allRoots_1 = allRoots; _i < allRoots_1.length; _i++) { + var root = allRoots_1[_i]; + observer.observe(root, { + childList: true, + subtree: true, + characterData: true + }); + } + }; + SRController.prototype.addLiveListener = function (listener) { + this.liveListeners.push(listener); + }; + SRController.prototype.removeLiveListener = function (removeListener) { + this.liveListeners = this.liveListeners.filter(function (listener) { return listener !== removeListener; }); + }; + /** + * Get the current point of regard + * @returns The current SRCursor representing the point of regard + */ + SRController.prototype.getPointOfRegard = function () { + return this.pointOfRegard; + }; + /** + * Set the point of regard to a specific DOM node + * @param node The node to set as the point of regard + * @returns NavigationResult indicating success or failure + */ + SRController.prototype.setPointOfRegard = function (node) { + var _a; + var DEBUG = false; + DEBUG && console.group("setPointOfRegard"); + try { + this.pointOfRegard = new SRCursor_1.SRCursor(node); + // Update container state + var containerChanges = SRController.diffContainers("focus", this.pointOfRegard); + var role = this.pointOfRegard.getRole(); + var name_1 = (_a = this.pointOfRegard.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name; + return { + success: true, + renderingResult: SRRenderer_1.SRRenderer.renderCurrent("focus", this.pointOfRegard, containerChanges), + role: role, + name: name_1 + }; + } + catch (error) { + return { + success: false, + renderingResult: { + start: this.pointOfRegard.clone(), + end: this.pointOfRegard.clone(), + message: "Failed to set point of regard: ".concat(error.message) + } + }; + } + finally { + DEBUG && console.groupEnd(); + } + }; + /** + * Jump to the next element by the specified mode + * @param mode The navigation mode to use + * @returns NavigationResult indicating success or failure + */ + SRController.prototype.jumpNext = function (mode) { + var _a; + CacheUtil_1.CacheUtil.clearCaches(this.ctrlDoc.documentElement); + var oldPointOfRegard = this.pointOfRegard.clone(); + var DEBUG = false; + DEBUG && console.group("jumpNext"); + try { + var bContinue = true; + var nextJump = this.pointOfRegard.clone(); + var renderingResult = void 0; + while (bContinue && nextJump) { + var lastJump = nextJump.clone(); + nextJump = SRNavigator_1.SRNavigator.jumpNext(mode, nextJump); + if (nextJump) { + var containerChanges = SRController.diffContainers(mode, nextJump, lastJump); + if (mode === "item" && !SRNavigator_1.SRNavigator.getStartFunc(mode)(nextJump.getRole(), !nextJump.isEndTag(), nextJump.getNode())) { + containerChanges = { + entering: [], + leaving: [] + }; + } + renderingResult = SRRenderer_1.SRRenderer.renderCurrent(mode, nextJump, containerChanges); + // Keep going if the landing point is empty, unless it's certain nav modes (e.g., region) + bContinue = renderingResult.message.trim().length === 0 && !["region"].includes(mode); + } + } + if (!nextJump) { + // Restore the original point of regard + this.pointOfRegard = oldPointOfRegard; + var currentResult = SRRenderer_1.SRRenderer.renderCurrent(mode, oldPointOfRegard, { leaving: [], entering: [] }); + return { + success: false, + renderingResult: { + start: oldPointOfRegard.clone(), + end: oldPointOfRegard.clone(), + message: "No next ".concat(mode, ". ").concat((currentResult === null || currentResult === void 0 ? void 0 : currentResult.message) || "") + } + }; + } + else { + this.pointOfRegard = nextJump; + var role = this.pointOfRegard.getRole(); + var name_2 = (_a = this.pointOfRegard.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name; + // Check for container changes + DEBUG && console.log("New POR:", this.pointOfRegard.getNode(), renderingResult); + return { + success: true, + renderingResult: renderingResult, + role: role, + name: name_2 + }; + } + } + catch (error) { + console.error(error); + // Restore the original point of regard + this.pointOfRegard = oldPointOfRegard; + return { + success: false, + renderingResult: { + start: oldPointOfRegard.clone(), + end: oldPointOfRegard.clone(), + message: "Navigation error: ".concat(error.message) + } + }; + } + finally { + console.groupEnd(); + } + }; + /** + * Jump to the previous element by the specified mode + * @param mode The navigation mode to use + * @returns NavigationResult indicating success or failure + */ + SRController.prototype.jumpPrevious = function (mode) { + var _a; + CacheUtil_1.CacheUtil.clearCaches(this.ctrlDoc.documentElement); + var oldPointOfRegard = this.pointOfRegard.clone(); + try { + var bContinue = true; + var prevJump = this.pointOfRegard.clone(); + var renderingResult = void 0; + while (bContinue && prevJump) { + var lastJump = prevJump.clone(); + prevJump = SRNavigator_1.SRNavigator.jumpPrevious(mode, prevJump); + if (prevJump) { + var containerChanges = SRController.diffContainers(mode, prevJump, lastJump); + if (mode === "item" && !SRNavigator_1.SRNavigator.getStartFunc(mode)(prevJump.getRole(), !prevJump.isEndTag(), prevJump.getNode())) { + containerChanges = { + entering: [], + leaving: [] + }; + } + renderingResult = SRRenderer_1.SRRenderer.renderCurrent(mode, prevJump, containerChanges); + // Keep going if the landing point is empty, unless it's certain nav modes (e.g., region) + bContinue = renderingResult.message.trim().length === 0 && !["region"].includes(mode); + } + } + if (!prevJump) { + // Restore the original point of regard + this.pointOfRegard = oldPointOfRegard; + var currentResult = SRRenderer_1.SRRenderer.renderCurrent(mode, oldPointOfRegard, { leaving: [], entering: [] }); + return { + success: false, + renderingResult: { + start: oldPointOfRegard.clone(), + end: oldPointOfRegard.clone(), + message: "No previous ".concat(mode, ". ").concat((currentResult === null || currentResult === void 0 ? void 0 : currentResult.message) || "") + } + }; + } + else { + this.pointOfRegard = prevJump; + var role = this.pointOfRegard.getRole(); + var name_3 = (_a = this.pointOfRegard.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name; + // // Check for container changes + // const containerChanges = SRController.diffContainers(mode, this.pointOfRegard, oldPointOfRegard); + // let s = SRRenderer.renderEnter(mode, this.pointOfRegard); + // if (containerChanges.entering[containerChanges.entering.length-1] !== s) { + // containerChanges.entering.push(s); + // } + return { + success: true, + renderingResult: renderingResult, + role: role, + name: name_3 + }; + } + } + catch (error) { + console.error(error); + // Restore the original point of regard + this.pointOfRegard = oldPointOfRegard; + return { + success: false, + renderingResult: { + start: oldPointOfRegard.clone(), + end: oldPointOfRegard.clone(), + message: "Navigation error: ".concat(error.message) + } + }; + } + }; + /** + * Determine the different in containers between the two nodes + * @param newWalker The new node we're navigating to + * @param oldWalker The previous node we were at + * @returns Array of container change messages + */ + SRController.diffContainers = function (mode, newWalker, oldWalker) { + var DEBUG = false; + DEBUG && console.log("-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-"); + DEBUG && console.log("A)", oldWalker.getNode().nodeName, newWalker.getNode().nodeName); + var leaving = []; + var entering = []; + try { + var docRoot = newWalker ? + (newWalker.getNode().ownerDocument.body || newWalker.getNode().ownerDocument.documentElement) : + oldWalker ? + (oldWalker.getNode().ownerDocument.body || oldWalker.getNode().ownerDocument.documentElement) : + document.body || document.documentElement; + var walkNew = newWalker ? newWalker.clone() : (new SRCursor_1.SRCursor(docRoot)); + var walkOld = oldWalker ? oldWalker.clone() : (new SRCursor_1.SRCursor(docRoot)); + if (!walkNew.getNode().isSameNode(walkOld.getNode())) { + var commonParent = SRController.commonParent(walkNew, walkOld); + if (commonParent) { + DEBUG && console.log("B)", commonParent.getNode().nodeName); + while (commonParent.contains(walkNew)) { + DEBUG && console.log("Entering:", walkNew.getNode().nodeName); + entering.push(SRRenderer_1.SRRenderer.renderEnter(mode, walkNew, walkOld)); + walkNew.parent(); + } + entering.reverse(); + entering = entering.filter(function (s) { return s && s.trim().length > 0; }).map(function (s) { return s.trim(); }); + ; + while (commonParent.contains(walkOld)) { + DEBUG && console.log("Leaving:", walkOld.getNode().nodeName); + leaving.push(SRRenderer_1.SRRenderer.renderLeave(mode, walkOld, walkOld)); + walkOld.parent(); + } + leaving = leaving.filter(function (s) { return s && s.trim().length > 0; }).map(function (s) { return s.trim(); }); + } + } + } + catch (err) { + console.error(err); + } + DEBUG && console.log(leaving, entering); + return { + leaving: leaving, + entering: entering + }; + }; + SRController.commonParent = function (walkerOne, walkerTwo) { + if (walkerOne.contains(walkerTwo)) { + return walkerOne.clone(); + } + else if (walkerTwo.contains(walkerOne)) { + return walkerTwo.clone(); + } + else { + var commonParent = walkerOne.clone(); + while (!commonParent.contains(walkerTwo) && commonParent.parent()) + ; + if (!commonParent.contains(walkerOne) || !commonParent.contains(walkerTwo)) { + return null; + } + return commonParent; + } + }; + SRController.renderAll = function (mode) { + var ctrl = SRController.getController(); + var dialogs = ctrl.ctrlDoc.body.querySelectorAll("dialog,[role='dialog']"); + dialogs.forEach(function (dialog) { + if (SRUtil_1.SRUtil.isModalDialogElement(dialog)) { + ctrl.setPointOfRegard(dialog); + } + }); + var results = []; + // Handle the initial item first (if there is one) + var starterMsg = SRRenderer_1.SRRenderer.renderCurrent(mode, ctrl.getPointOfRegard(), { entering: [], leaving: [] }); + if (starterMsg) { + results.push(starterMsg.message); + } + var bContinue = true; + while (bContinue) { + var nextVal = ctrl.jumpNext(mode); + if (nextVal.success) { + results.push(nextVal.renderingResult.message); + } + else { + bContinue = false; + } + } + return results; + }; + SRController.renderAllDetail = function (doc, mode) { + var ctrl = SRController.getController(doc); + ctrl.setPointOfRegard(doc.body); + var dialogs = doc.body.querySelectorAll("dialog,[role='dialog']"); + dialogs.forEach(function (dialog) { + if (SRUtil_1.SRUtil.isModalDialogElement(dialog)) { + ctrl.setPointOfRegard(dialog); + } + }); + var results = []; + // Handle the initial item first (if there is one) + var starterMsg = SRRenderer_1.SRRenderer.renderCurrent(mode, ctrl.getPointOfRegard(), { entering: [], leaving: [] }); + if (starterMsg) { + results.push(starterMsg); + } + var bContinue = true; + while (bContinue) { + var nextVal = ctrl.jumpNext(mode); + if (nextVal.success) { + // mode === "item" && console.log(nextVal); + results.push(nextVal.renderingResult); + } + else { + bContinue = false; + } + } + return results; + }; + SRController.renderStructure = function (doc) { + var _a; + var modes = ["region", "heading", "item", "tab_focus", "image"]; + var details = modes.map(function (modeLabel) { return SRController.renderAllDetail(doc, modeLabel); }); + var retVal = []; + var _loop_3 = function () { + var next = (_a = details[0][0]) === null || _a === void 0 ? void 0 : _a.start; + modes.forEach(function (mode, idx) { + if (details[idx].length > 0) { + if (!next || SRCursor_1.SRCursor.compare(details[idx][0].start, next) < 0) { + next = details[idx][0].start; + } + } + }); + var nextItem = {}; + var hasValue = false; + modes.forEach(function (mode, idx) { + nextItem[mode] = ""; + if (details[idx].length > 0 && SRCursor_1.SRCursor.compare(details[idx][0].start, next) === 0) { + nextItem[mode] = details[idx].shift().message; + hasValue = nextItem[mode] !== ""; + } + }); + if (hasValue) { + var elem = next.getElement(); + var selector = elem && SRUtil_1.SRUtil.getUniqueSelector(elem); + if (selector && doc.querySelector(selector)) { + nextItem.selector = selector; + } + retVal.push(nextItem); + } + }; + while (details.some(function (detail) { return detail.length > 0; })) { + _loop_3(); + } + return retVal; + }; + return SRController; +}()); +exports.SRController = SRController; + + +/***/ }, + +/***/ 8195 +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SRCursor = void 0; +var DOMWalker_1 = __webpack_require__(3864); +var AccNameUtil_1 = __webpack_require__(1950); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +var SRUtil_1 = __webpack_require__(2165); +/** + * SRCursor (Screen Reader Cursor) class + * + * This class provides a cursor-like interface for navigating the DOM in a way that + * simulates how screen readers process and navigate content. It tracks: + * - The current node position + * - Whether it's at a start or end tag + * - The ARIA role of the current node + * - The accessible name of the current node + */ +var SRCursor = /** @class */ (function () { + /** + * Creates a new SRCursor positioned at the specified element + * @param element - The DOM node to position the cursor at + * @param bEnd - Whether to position at the end tag (true) or start tag (false) + */ + function SRCursor(element, bEnd) { + // Use DOMWalker with considerHidden=false to process all content (including hidden elements) + // This is important for screen reader simulation which needs to see all content + this.walker = new DOMWalker_1.DOMWalker(element, bEnd, undefined, false); + if (element) { + this.refreshName(); + } + } + /** + * Creates a copy of this cursor at the same position + * @returns A new SRCursor instance with the same position and properties + */ + SRCursor.prototype.clone = function () { + var retVal = new SRCursor(this.walker.node, this.walker.bEndTag); + retVal.role = this.role; + retVal.name = this.name; + return retVal; + }; + /** + * Updates the role and accessible name properties based on the current node + * This is called whenever the cursor position changes + * @private + */ + SRCursor.prototype.refreshName = function () { + if (this.walker.node.nodeType === 1) { + // Element node + this.role = AriaUtil_1.AriaUtil.getResolvedRole(this.walker.node, true); + this.name = AccNameUtil_1.AccNameUtil.computeAccessibleName(this.walker.node); + } + else if (this.walker.node.nodeType === 3) { + // Text node + this.role = "text"; + this.name = { name: this.walker.node.textContent, nameFrom: "text" }; + } + else { + // Other node types + this.role = undefined; + this.name = undefined; + } + }; + /** + * Moves the cursor to the next node that matches the provided criteria + * @param matchingFunc - Function that determines if a node matches the search criteria + * @returns true if a matching node was found, false otherwise + */ + SRCursor.prototype.next = function (matchingFunc, skipFunc) { + var _a; + var DEBUG = false; + // const DEBUG = false; + var foundNext = false; + // Get the skip info for the current spot + this.refreshName(); + DEBUG && console.group("next function"); + DEBUG && console.log(this.isEndTag() ? "/" : "", this.getNode()); + var _b = (skipFunc && skipFunc(this)) || { skipCurrent: false, skipChildren: false }, skipCurrent = _b.skipCurrent, skipChildren = _b.skipChildren; + DEBUG && console.log("skipCurrent:", skipCurrent, "skipChildren:", skipChildren); + do { + // Move as appropriate from the current spot + if (skipChildren && !this.walker.bEndTag) { + this.walker.bEndTag = true; + } + else if (!this.walker.nextNode()) { + break; + } + // Update the skip info for the new spot + this.refreshName(); + DEBUG && console.log(this.isEndTag() ? "/" : "", this.getNode()); + (_a = (skipFunc && skipFunc(this)) || { skipCurrent: false, skipChildren: false }, skipCurrent = _a.skipCurrent, skipChildren = _a.skipChildren); + DEBUG && console.log("skipCurrent:", skipCurrent, "skipChildren:", skipChildren); + // Update role based on node type + if (this.walker.node.nodeType === 1) { + this.role = AriaUtil_1.AriaUtil.getResolvedRole(this.walker.node, true); + } + else if (this.walker.node.nodeType === 3) { + this.role = "text"; + } + if (SRUtil_1.SRUtil.isModalDialogElement(this.getNode()) && this.isEndTag()) { + break; + } + if (!skipCurrent) { + // Check if this node matches our criteria + foundNext = matchingFunc(this.role, !this.walker.bEndTag, this.walker.node); + } + } while (!foundNext); + DEBUG && console.log("foundNext:", foundNext, this.isEndTag() ? "/" : "", this.getNode()); + DEBUG && console.groupEnd(); + if (foundNext) { + this.refreshName(); + } + else { + // Reset properties if no match was found + this.role = undefined; + this.name = undefined; + } + return foundNext; + }; + /** + * Moves the cursor to the previous node that matches the provided criteria + * @param matchingFunc - Function that determines if a node matches the search criteria + * @returns true if a matching node was found, false otherwise + */ + SRCursor.prototype.previous = function (matchingFunc, skipFunc) { + var _a; + var DEBUG = false; + var foundPrevious = false; + // Get the skip info for the current spot + this.refreshName(); + DEBUG && console.group("previous function"); + DEBUG && console.log(this.isEndTag(), this.getNode()); + var _b = (skipFunc && skipFunc(this)) || { skipCurrent: false, skipChildren: false }, skipCurrent = _b.skipCurrent, skipChildren = _b.skipChildren; + DEBUG && console.log(skipCurrent, skipChildren); + do { + // Move as appropriate from the current spot + if (skipChildren && this.walker.bEndTag) { + DEBUG && console.log("Skipping node"); + this.walker.bEndTag = false; + } + else if (!this.walker.prevNode()) { + break; + } + // Update the skip info for the new spot + this.refreshName(); + DEBUG && console.log(this.isEndTag(), this.getNode()); + (_a = (skipFunc && skipFunc(this)) || { skipCurrent: false, skipChildren: false }, skipCurrent = _a.skipCurrent, skipChildren = _a.skipChildren); + DEBUG && console.log(skipCurrent, skipChildren); + // Update role based on node type + if (this.walker.node.nodeType === 1) { + this.role = AriaUtil_1.AriaUtil.getResolvedRole(this.walker.node, true); + } + else if (this.walker.node.nodeType === 3) { + this.role = "text"; + } + if (SRUtil_1.SRUtil.isModalDialogElement(this.getNode()) && !this.isEndTag()) { + break; + } + if (!skipCurrent) { + // Check if this node matches our criteria + foundPrevious = matchingFunc(this.role, !this.walker.bEndTag, this.walker.node); + } + } while (!foundPrevious); + DEBUG && console.log(this.isEndTag(), this.getNode()); + DEBUG && console.groupEnd(); + if (foundPrevious) { + this.refreshName(); + } + else { + // Reset properties if no match was found + this.role = undefined; + this.name = undefined; + } + return foundPrevious; + }; + /** + * Moves the cursor to the parent node of the current node + * @param endTag - Whether to position at the end tag (true) or start tag (false) + * @returns true if successfully moved to parent, false if no parent exists + */ + SRCursor.prototype.parent = function (endTag) { + if (!this.walker.node.parentNode) + return false; + this.walker.node = this.walker.node.parentNode; + this.walker.bEndTag = endTag === true; + if (this.walker.node.nodeType === 1) { + this.role = AriaUtil_1.AriaUtil.getResolvedRole(this.walker.node, true); + this.name = AccNameUtil_1.AccNameUtil.computeAccessibleName(this.walker.node); + } + else if (this.walker.node.nodeType === 3) { + this.role = "text"; + this.name = { name: this.walker.node.textContent, nameFrom: "text" }; + } + else { + this.role = undefined; + this.name = undefined; + } + return true; + }; + /** + * Moves the cursor up the DOM tree until finding a node with a matching role or element name + * @param roles - Array of ARIA roles to match + * @param elems - Optional array of element names to match + * @returns true if a matching node was found, false otherwise + */ + SRCursor.prototype.getCurrentOrParentByRole = function (roles, elems) { + var _this = this; + var uppElems = elems ? elems.map(function (elem) { return elem.toUpperCase(); }) : []; + var matches = function (walker) { + var elem = walker.getElement(); + return roles.includes(_this.getRole()) + || (elem && !elem.hasAttribute("role") && uppElems.includes(elem.nodeName.toUpperCase())); + }; + while (!matches(this) && this.parent()) + ; + return matches(this); + }; + /** + * Creates a new cursor and moves it up the DOM tree until finding a node with a matching role or element name + * @param roles - Array of ARIA roles to match + * @param elems - Optional array of element names to match + * @returns A new cursor at the matching node, or null if no match found + */ + SRCursor.prototype.getCurrentOrParentByRoleClone = function (roles, elems) { + var retVal = this.clone(); + if (retVal.getCurrentOrParentByRole(roles, elems)) { + return retVal; + } + return null; + }; + SRCursor.prototype.getCurrentOrParentTabbableClone = function () { + var retVal = this.clone(); + while (retVal) { + var elem = retVal.getElement(); + if (retVal.isStartTag() && elem && CommonUtil_1.CommonUtil.isTabbable(elem)) { + return retVal; + } + if (!retVal.parent(false)) { + break; + } + } + return null; + }; + /** + * Gets the ARIA role of the current node + * @returns The ARIA role as a string, or undefined if not available + */ + SRCursor.prototype.getRole = function () { + return this.role; + }; + /** + * Gets the accessible name info for the current node + * @returns The AccessibleNameResult object, or undefined if not available + */ + SRCursor.prototype.getNameInfo = function () { + return this.name; + }; + /** + * Get the accessible name of the current node + */ + SRCursor.prototype.getName = function () { + // Handle one-off quirks in the name calculation + var nameInfo = this.getNameInfo(); + if (nameInfo && nameInfo.name) { + return nameInfo.name; + } + var elem = this.getElement(); + if (elem) { + var labelElem = CommonUtil_1.CommonUtil.getLabelForElementHidden(elem, true); + if (labelElem) { + return labelElem.innerText || labelElem.textContent; + } + } + }; + /** + * Sets whether the cursor is at an end tag or start tag + * @param val - True for end tag, false for start tag + */ + SRCursor.prototype.setEndTag = function (val) { + this.walker.bEndTag = val; + }; + /** + * Gets the DOM node at the current cursor position + * @returns The current DOM node + */ + SRCursor.prototype.getNode = function () { + return this.walker.node; + }; + /** + * Gets the current node as an HTMLElement if it is an element node + * @returns The current node as HTMLElement, or undefined if not an element + */ + SRCursor.prototype.getElement = function () { + if (!this.walker.node) + return undefined; + if (this.walker.node.nodeType !== 1) + return undefined; + return this.walker.node; + }; + SRCursor.prototype.getParentElement = function () { + if (!this.walker.node) + return null; + var retVal = this.clone(); + retVal.walker.node = DOMWalker_1.DOMWalker.parentElement(retVal.walker.node); + return retVal; + }; + /** + * Checks if the cursor is positioned at an end tag + * @returns true if at an end tag, false if at a start tag + */ + SRCursor.prototype.isEndTag = function () { + return this.walker.bEndTag; + }; + /** + * Checks if the cursor is positioned at an end tag + * @returns true if at an end tag, false if at a start tag + */ + SRCursor.prototype.isStartTag = function () { + return !this.walker.bEndTag; + }; + /** + * Compares the document position of two cursors + * @param one - First cursor to compare + * @param two - Second cursor to compare + * @returns 0 if equal, -1 if one is before two, 1 if one is after two + */ + SRCursor.compare = function (one, two) { + var _a, _b; + var nodeOne = (_a = one === null || one === void 0 ? void 0 : one.walker) === null || _a === void 0 ? void 0 : _a.node; + var nodeTwo = (_b = two === null || two === void 0 ? void 0 : two.walker) === null || _b === void 0 ? void 0 : _b.node; + if (!nodeOne && !nodeTwo) + return 0; + if (!nodeOne) + return 1; + if (!nodeTwo) + return -1; + var docPosition = nodeOne.compareDocumentPosition(nodeTwo); + // Handle disconnected nodes (different documents or shadow DOMs) + if (docPosition & 0x1) { + // Nodes are disconnected - they're in different trees (iframe or shadow DOM) + // Build ancestor chains using DOMWalker.parentNode (handles shadow DOM & iframes) + var ancestorsOne = [nodeOne]; + var ancestorsTwo = [nodeTwo]; + var current = nodeOne; + while (current = DOMWalker_1.DOMWalker.parentNode(current)) { + ancestorsOne.push(current); + } + current = nodeTwo; + while (current = DOMWalker_1.DOMWalker.parentNode(current)) { + ancestorsTwo.push(current); + } + // Reverse so root is first + ancestorsOne.reverse(); + ancestorsTwo.reverse(); + // Find where the paths diverge + var commonDepth = 0; + while (commonDepth < ancestorsOne.length && + commonDepth < ancestorsTwo.length && + ancestorsOne[commonDepth] === ancestorsTwo[commonDepth]) { + commonDepth++; + } + // If one path is a prefix of the other, handle containment + if (commonDepth === ancestorsOne.length) { + // nodeOne is an ancestor of nodeTwo + return one.walker.bEndTag ? 1 : -1; + } + if (commonDepth === ancestorsTwo.length) { + // nodeTwo is an ancestor of nodeOne + return two.walker.bEndTag ? -1 : 1; + } + // Compare the nodes where paths diverge + if (commonDepth > 0) { + var childOne = ancestorsOne[commonDepth]; + var childTwo = ancestorsTwo[commonDepth]; + var childPosition = childOne.compareDocumentPosition(childTwo); + if (childPosition & 0x2) + return 1; // childTwo precedes childOne + if (childPosition & 0x4) + return -1; // childOne precedes childTwo + } + // No common ancestor found - shouldn't happen in a well-formed document + return 0; + } + if (docPosition & 0x8) { + // one is contained within two + // if two is an end tag, one is before, otherwise, one is after + return two.walker.bEndTag ? -1 : 1; + } + else if (docPosition & 0x10) { + // two is contained within one + // if one is an end tag, one is after, otherwise, one is before + return one.walker.bEndTag ? 1 : -1; + } + else if (docPosition & 0x2) { + // two precedes one in the document + return 1; + } + else if (docPosition & 0x4) { + // one precedes two in the document + return -1; + } + return 0; + }; + /** + * Checks if this cursor's node contains another cursor's node + * @param other - The other cursor to check + * @returns true if this cursor contains (is a parent/ancestor of) the other cursor's node + */ + SRCursor.prototype.contains = function (other) { + return this.getNode().contains(other.getNode()) + && !this.isSameNode(other); + }; + /** + * Checks if this cursor points to the same node as another cursor + * @param other - The other cursor to compare with + * @returns true if both cursors point to the same node + */ + SRCursor.prototype.isSameNode = function (other) { + if (!other) + return false; + return this.getNode().isSameNode(other.getNode()); + }; + /** + * Checks if the current node has a non-empty accessible name + * @returns true if the node has a non-empty accessible name + */ + SRCursor.prototype.hasNonEmptyName = function () { + var _a; + return (((_a = this.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) || "").trim().length > 0; + }; + return SRCursor; +}()); +exports.SRCursor = SRCursor; + + +/***/ }, + +/***/ 248 +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SRNavigator = void 0; +var DOMWalker_1 = __webpack_require__(3864); +var AccNameUtil_1 = __webpack_require__(1950); +var SRCursor_1 = __webpack_require__(8195); +var CommonUtil_1 = __webpack_require__(7139); +var VisUtil_1 = __webpack_require__(3946); +var AriaUtil_1 = __webpack_require__(7011); +var SRNavigator; +(function (SRNavigator) { + /** + * Determine if a node is a block-level element based on its display property + * @param node The DOM node to check + * @returns true if the node is a block-level element, false otherwise + */ + function isBlockElement(node) { + var _a; + if (node.nodeType !== 1) + return false; + if (node.nodeName.toLowerCase() === "br") + return true; + var elem = node; + var mywin = elem.ownerDocument.defaultView; + var disp = (_a = mywin.getComputedStyle(elem)) === null || _a === void 0 ? void 0 : _a.display; + if (disp && disp.startsWith("table")) + return true; + if (disp === "block" && elem.style.display !== "block") { + // Is this block because it's a flex elem? + if (elem.parentElement && mywin.getComputedStyle(elem.parentElement).display === "flex") { + return false; + } + } + if (AriaUtil_1.AriaUtil.getResolvedRole(elem, true) === "link") { + var temp = new DOMWalker_1.DOMWalker(node, false, undefined, false); + temp.prevNode(); + if (!isBlockElement(temp.node)) { + return true; + } + } + return ["block", "flex", "grid", "list-item"].includes(disp); + } + function getExplicitTabindex(node) { + if (!node || node.nodeType !== 1) + return null; + var elem = node; + if (!elem.hasAttribute("tabindex")) + return null; + var tabindexValue = parseInt(elem.getAttribute("tabindex"), 10); + return Number.isNaN(tabindexValue) ? null : tabindexValue; + } + function isPositiveTabFocus(node) { + if (!node || node.nodeType !== 1) + return false; + var elem = node; + var explicitTabindex = getExplicitTabindex(elem); + return explicitTabindex !== null && explicitTabindex > 0 && CommonUtil_1.CommonUtil.isTabbable(elem); + } + function isDefaultOrZeroTabFocus(node) { + if (!node || node.nodeType !== 1) + return false; + var elem = node; + var explicitTabindex = getExplicitTabindex(elem); + return (explicitTabindex === null || explicitTabindex === 0) && CommonUtil_1.CommonUtil.isTabbable(elem); + } + function getTabFocusStartFunc(includePositiveTabindex) { + if (includePositiveTabindex === void 0) { includePositiveTabindex = true; } + return function (_role, bStartTag, node) { + if (!(node && node.nodeType === 1 && bStartTag && CommonUtil_1.CommonUtil.isTabbable(node))) + return false; + return includePositiveTabindex || isDefaultOrZeroTabFocus(node); + }; + } + /** + * Collect all tabbable elements in tab order (positive tabindex first, then document order) + * @param matchFunc Function to match tabbable elements + * @param rootNode Optional root node to start collection from (defaults to document body) + * @returns Array of cursors pointing to tabbable elements in tab order + */ + function collectTabFocusCursors(matchFunc, rootNode) { + var root = ((rootNode === null || rootNode === void 0 ? void 0 : rootNode.ownerDocument) || document).body || rootNode; + if (!root) + return []; + var walker = new SRCursor_1.SRCursor(root, false); + var skipFunc = getSkipFunc("tab_focus"); + var positiveResults = []; + var normalResults = []; + var addCursor = function (cursor) { + if (!matchFunc(cursor.getRole(), !cursor.isEndTag(), cursor.getNode())) + return; + if (isPositiveTabFocus(cursor.getNode())) { + positiveResults.push(cursor.clone()); + } + else if (isDefaultOrZeroTabFocus(cursor.getNode())) { + normalResults.push(cursor.clone()); + } + }; + addCursor(walker); + while (walker.next(function () { return true; }, skipFunc)) { + addCursor(walker); + } + positiveResults.sort(function (a, b) { + var aElem = a.getElement(); + var bElem = b.getElement(); + var aTabindex = getExplicitTabindex(aElem) || 0; + var bTabindex = getExplicitTabindex(bElem) || 0; + if (aTabindex !== bTabindex) + return bTabindex - aTabindex; + return SRCursor_1.SRCursor.compare(a, b); + }); + return positiveResults.concat(normalResults); + } + /** + * Find the index of a cursor in an array of tab focus cursors + * @param cursors Array of cursors to search + * @param walker The cursor to find + * @returns The index of the cursor, or -1 if not found + */ + function findTabFocusIndex(cursors, walker) { + return cursors.findIndex(function (cursor) { return SRCursor_1.SRCursor.compare(cursor, walker) === 0; }); + } + /** + * Get the match function for identifying start positions in a given navigation mode + * @param mode The navigation mode (e.g., "link", "heading", "button", etc.) + * @returns A function that matches elements appropriate for the navigation mode + */ + function getStartFunc(mode) { + switch (mode) { + case "link": + return function (role, bStartTag) { return (bStartTag && role === "link"); }; + case "tab_focus": + return getTabFocusStartFunc(false); + case "heading": + return function (role, bStartTag) { return (bStartTag && role === "heading"); }; + case "h1": + return function (role, bStartTag, node) { return (bStartTag && role === "heading" && node.ariaLevel === "1"); }; + case "h2": + return function (role, bStartTag, node) { return (bStartTag && role === "heading" && node.ariaLevel === "2"); }; + case "h3": + return function (role, bStartTag, node) { return (bStartTag && role === "heading" && node.ariaLevel === "3"); }; + case "h4": + return function (role, bStartTag, node) { return (bStartTag && role === "heading" && node.ariaLevel === "4"); }; + case "h5": + return function (role, bStartTag, node) { return (bStartTag && role === "heading" && node.ariaLevel === "5"); }; + case "h6": + return function (role, bStartTag, node) { return (bStartTag && role === "heading" && node.ariaLevel === "6"); }; + case "image": + return function (role, bStartTag) { return (bStartTag && ["img", "graphics-document"].includes(role)); }; + case "radio": + return function (role, bStartTag) { return (bStartTag && role === "radio"); }; + case "button": + return function (role, bStartTag) { return (bStartTag && role === "button"); }; + case "checkbox": + return function (role, bStartTag) { return (bStartTag && role === "checkbox"); }; + case "combo": + return function (role, bStartTag) { return (bStartTag && role === "combobox"); }; + case "list": + return function (role, bStartTag) { return (bStartTag && role === "list"); }; + case "listitem": + return function (role, bStartTag) { return (bStartTag && role === "listitem"); }; + case "article": + return function (role, bStartTag) { return (bStartTag && role === "article"); }; + case "table": + return function (role, bStartTag) { return (bStartTag && role === "table"); }; + case "paragraph": + return function (_role, bStartTag, node) { return (bStartTag && node.nodeName.toUpperCase() === "P"); }; + case "dom": + return function () { return true; }; + case "item": + return function (_role, bStartTag, node) { + if (!bStartTag) + return false; + if (isBlockElement(node)) + return true; + var temp = new DOMWalker_1.DOMWalker(node, !bStartTag); + if (temp.prevNode() && temp.bEndTag) { + return isBlockElement(temp.node); + } + return false; + }; + case "region": + return function (role, bStartTag, node) { + var _a, _b; + if (!bStartTag) + return false; + if (["main", "navigation", "form", "banner", "search", "contentinfo"].includes(role)) + return true; + if (role !== "region" || (node === null || node === void 0 ? void 0 : node.nodeType) !== 1) + return false; + return !!((_b = (_a = AccNameUtil_1.AccNameUtil.computeAccessibleName(node)) === null || _a === void 0 ? void 0 : _a.name) === null || _b === void 0 ? void 0 : _b.trim()); + }; + case "formcontrol": + case "editbox": + case "graphic": + case "frame": + case "division": + case "tabcontrol": + case "separator": + case "clickable": + case "mouseover": + throw new Error("NOT_IMPLEMENTED"); + } + } + SRNavigator.getStartFunc = getStartFunc; + /** + * Check if an element is within a Shadow DOM + * @param element The element to check + * @returns true if the element is in a Shadow DOM, false otherwise + */ + var isInShadowDOM = function (element) { + var root = element.getRootNode(); + return root instanceof ShadowRoot; + }; + /** + * Determine skip behavior for item navigation mode + * Handles complex visibility rules including hidden content in headings/links + * @param cursor The cursor at the current position + * @returns Object indicating whether to skip current node and/or its children, or null for default behavior + */ + var SKIP_ITEM_BEHAVIOR = function (cursor) { + var DEBUG = false; + DEBUG && console.group("SKIP_ITEM_BEHAVIOR"); + var retVal = null; + try { + var nodeType = cursor.getNode().nodeType; + var elem = cursor.getElement(); + var cursorStart = cursor.clone(); + cursorStart.setEndTag(false); + DEBUG && console.log(nodeType); + // Skip CDATA and comments completely + if ([4, 8].includes(nodeType)) + return retVal = { skipCurrent: true, skipChildren: true }; + // Only process elements and text + if (![1, 3].includes(nodeType)) + return retVal = { skipCurrent: true, skipChildren: false }; + // For text elements, Consider with relation to their parent element + if (nodeType === 3) { + elem = cursor.getNode().parentElement; + if (!elem) + return retVal = VisUtil_1.VisUtil.isNodeHiddenFromAT(elem) ? { skipCurrent: true, skipChildren: false } : null; + } + // if (!elem) console.log(cursor.getNode()); + // We have an element + // Make sure we're within the body element + if (!elem.closest("body") && !isInShadowDOM(elem)) + return retVal = { skipCurrent: true, skipChildren: false }; + // Make sure we're not in a script or style + if (elem.closest("script,style")) + return retVal = { skipCurrent: true, skipChildren: true }; + // For text nodes, we need to check visibility in context of parent heading/link + // So we'll handle text node visibility checks below with the element visibility checks + // Skip things hidden from the AT, UNLESS we're inside a heading or link + // (headings and links should include their full accessible name, including hidden parts) + // BUT only if the heading/link uses nameFrom="content" (not aria-label/aria-labelledby) + var parentHeadingOrLink = cursorStart.getCurrentOrParentByRoleClone(["heading", "link"]); + // Special case: if current element itself is a heading or link AND we're NOT inside another heading/link, + // apply normal skip rules + var currentRole = AriaUtil_1.AriaUtil.getResolvedRole(elem); + var isCurrentHeadingOrLink = currentRole === "heading" || currentRole === "link"; + if (!parentHeadingOrLink) { + // Not inside any heading/link - apply normal skip rules + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(elem)) + return retVal = { skipCurrent: true, skipChildren: nodeType === 1 }; + if (!VisUtil_1.VisUtil.isNodeVisible(elem)) + return retVal = { skipCurrent: true, skipChildren: nodeType === 1 }; + } + else { + // Check if the parent heading/link uses aria-label or aria-labelledby + var parentElem = parentHeadingOrLink.getElement(); + var nameInfo = parentHeadingOrLink.getNameInfo(); + // If nameFrom is NOT "content" or "text", skip all content (it's using aria-label/aria-labelledby) + if (nameInfo && !["content", "text"].includes(nameInfo.nameFrom)) { + // Parent uses aria-label/aria-labelledby - skip all content including nested headings/links + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(elem)) + return retVal = { skipCurrent: true, skipChildren: true }; + if (!VisUtil_1.VisUtil.isNodeVisible(elem)) + return retVal = { skipCurrent: true, skipChildren: true }; + } + else if (isCurrentHeadingOrLink) { + // Current element is a heading/link inside another heading/link with content-based name + // Don't skip it - let it through so its content can be read + // (The logic at line 183 will handle whether to skip its children) + } + else { + // nameFrom is "content", so include hidden content but skip hidden images/graphics + var role_1 = AriaUtil_1.AriaUtil.getResolvedRole(elem); + if ((role_1 === "img" || role_1 === "graphics-document") && VisUtil_1.VisUtil.isNodeHiddenFromAT(elem)) { + return retVal = { skipCurrent: true, skipChildren: true }; + } + // Don't skip other hidden content - it should be included in the accessible name + } + } + if (elem.nodeName.toUpperCase() === "BODY") + return retVal = { skipCurrent: false, skipChildren: false }; + // Skip labels that are associated with controls - they'll be read with the related input. + // Keep children so interactive content (e.g. links) inside the label still appears in + // reading/tab order. + if (elem.nodeName.toUpperCase() === "LABEL") { + if (elem.hasAttribute("for") + && document.getElementById(elem.getAttribute("for")) + && document.getElementById(elem.getAttribute("for")).getAttribute("type") !== "hidden") { + return retVal = { skipCurrent: true, skipChildren: false }; + } + else { + var nestedControl = elem.querySelector("input, select, textarea, button, [role='checkbox'], [role='combobox'], [role='listbox'], [role='menuitemcheckbox'], [role='menuitemradio'], [role='radio'], [role='searchbox'], [role='slider'], [role='spinbutton'], [role='switch'], [role='textbox']"); + if (nestedControl && nestedControl.getAttribute("type") !== "hidden") { + return retVal = { skipCurrent: true, skipChildren: false }; + } + } + } + // Skip non-interactive content that is a descendant of a for-linked label. + // Such content is already surfaced as part of the associated control's announcement. + // Interactive descendants (links, buttons, etc.) are allowed through. + { + var labelFor = elem.closest("label[for]"); + var labelForTarget = labelFor && labelFor.getAttribute("for"); + if (labelFor + && labelForTarget + && document.getElementById(labelForTarget) + && document.getElementById(labelForTarget).getAttribute("type") !== "hidden" + && !elem.closest("a[href], [role='link'], button, [role='button']")) { + return retVal = { skipCurrent: true, skipChildren: nodeType === 1 }; + } + } + var role = cursorStart.getRole(); + // If we have presentational children, read the element, skip the children + if (AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(elem)) { + return retVal = { skipCurrent: false, skipChildren: true }; + } + // Skip children of headings/links that don't use content-based names + // UNLESS we're inside another heading/link that DOES use content-based names + if (["link", "heading"].includes(role) && (!cursorStart.getName() || (!["content", "text"].includes(cursorStart.getNameInfo().nameFrom)))) { + // Check if we're inside a parent heading/link with content-based name + if (parentHeadingOrLink && parentHeadingOrLink.getNameInfo() && ["content", "text"].includes(parentHeadingOrLink.getNameInfo().nameFrom)) { + // Don't skip children - we're nested inside a content-based heading/link + } + else { + return retVal = { skipCurrent: false, skipChildren: true }; + } + } + if (elem.nodeName.toUpperCase() === "LEGEND") { + var parent_1 = DOMWalker_1.DOMWalker.parentElement(cursor.getNode()); + while (parent_1) { + if (parent_1.nodeName.toUpperCase() === 'FIELDSET') { + // Legend is within a fieldset, suppress output + return retVal = { skipCurrent: false, skipChildren: true }; + } + parent_1 = DOMWalker_1.DOMWalker.parentElement(parent_1); + } + } + if (elem && elem.nodeName.toUpperCase() === "MSUP") { + return retVal = { skipCurrent: false, skipChildren: true }; + } + if (elem.closest(".ibma-sr-overlay")) { + return retVal = { skipCurrent: true, skipChildren: true }; + } + return retVal = null; + } + finally { + DEBUG && console.log("SKIP_ITEM retVal:", retVal); + DEBUG && console.groupEnd(); + } + }; + /** + * Determine skip behavior for nested navigation modes (link, heading, image, etc.) + * Simpler than SKIP_ITEM_BEHAVIOR as it doesn't need complex heading/link content rules + * @param cursor The cursor at the current position + * @returns Object indicating whether to skip current node and/or its children, or null for default behavior + */ + var SKIP_NESTED_BEHAVIOR = function (cursor) { + var nodeType = cursor.getNode().nodeType; + var elem = cursor.getElement(); + // Only visit elements and text nodes + if (nodeType !== 1 && nodeType !== 3) + return { skipCurrent: true, skipChildren: false }; + if (nodeType === 3) + return VisUtil_1.VisUtil.isNodeHiddenFromAT(elem) ? { skipCurrent: true, skipChildren: false } : null; + // We have an elemenet + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(elem)) + return { skipCurrent: true, skipChildren: true }; + // Skip label fors - they'll be read with the related input. + // Keep children so interactive content (e.g. links) inside the label still appears in + // reading/tab order. + if (elem.nodeName.toUpperCase() === "LABEL" + && elem.hasAttribute("for") + && document.getElementById(elem.getAttribute("for")) + && document.getElementById(elem.getAttribute("for")).getAttribute("type") !== "hidden") { + return { skipCurrent: true, skipChildren: false }; + } + // Skip non-interactive content that is a descendant of a for-linked label. + // Such content is already surfaced as part of the associated control's announcement. + // Interactive descendants (links, buttons, etc.) are allowed through. + { + var labelFor = elem.closest("label[for]"); + var labelForTarget = labelFor && labelFor.getAttribute("for"); + if (labelFor + && labelForTarget + && document.getElementById(labelForTarget) + && document.getElementById(labelForTarget).getAttribute("type") !== "hidden" + && !elem.closest("a[href], [role='link'], button, [role='button']")) { + return { skipCurrent: true, skipChildren: nodeType === 1 }; + } + } + var role = cursor.getRole(); + // If we have presentational children, read the element, skip the children + if (AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(elem)) { + return { skipCurrent: false, skipChildren: true }; + } + if (elem && elem.nodeName.toUpperCase() === "MSUP") { + return { skipCurrent: true, skipChildren: true }; + } + if (elem.closest(".ibma-sr-overlay")) { + return { skipCurrent: true, skipChildren: true }; + } + return null; + }; + /** + * Get the skip function for a given navigation mode + * @param mode The navigation mode + * @returns A function that determines which nodes to skip during navigation + */ + function getSkipFunc(mode) { + switch (mode) { + case "region": + case "item": + return SKIP_ITEM_BEHAVIOR; + case "link": + case "tab_focus": + case "heading": + case "h1": + case "h2": + case "h3": + case "h4": + case "h5": + case "h6": + case "image": + return SKIP_NESTED_BEHAVIOR; + case "radio": + case "button": + case "checkbox": + case "combo": + case "list": + case "listitem": + case "article": + case "table": + case "paragraph": + case "dom": + case "formcontrol": + case "editbox": + case "graphic": + case "frame": + case "division": + case "tabcontrol": + case "separator": + case "clickable": + case "mouseover": + throw new Error("NOT_IMPLEMENTED"); + } + } + SRNavigator.getSkipFunc = getSkipFunc; + /** + * Jump to the current position or the previous matching element if current doesn't match + * @param mode The navigation mode + * @param walker The cursor at the current position + * @returns A cursor at the current or previous matching position + */ + function jumpCurrent(mode, walker) { + var matchFunc = mode === "tab_focus" ? getTabFocusStartFunc(true) : getStartFunc(mode); + if (matchFunc(walker.getRole(), !walker.isEndTag(), walker.getNode())) { + return walker.clone(); + } + else { + return jumpPrevious(mode, walker); + } + } + SRNavigator.jumpCurrent = jumpCurrent; + /** + * Jump to the end of the current element and return all intermediate item positions + * @param mode The navigation mode + * @param walker The cursor at the current position + * @returns Array of cursors representing positions from current to end + */ + function jumpCurrentEnd(mode, walker) { + if (mode === "item") { + var itemEnd = jumpNext(mode, walker); + return itemEnd ? [itemEnd] : []; + } + else { + var nameInfo = walker.getNameInfo(); + var retVal = walker.clone(); + if (nameInfo && !["content", "text"].includes(nameInfo.nameFrom)) { + // Name is just from the item itself + retVal.next(function () { return true; }); + } + else { + // Name is from the content + retVal.setEndTag(true); + retVal.next(function () { return true; }); + } + var endCursors = []; + var itemEnd = jumpNext("item", walker); + while (itemEnd && SRCursor_1.SRCursor.compare(itemEnd, retVal) < 0) { + endCursors.push(itemEnd); + itemEnd = jumpNext("item", itemEnd); + } + endCursors.push(retVal); + return mode === "tab_focus" && walker.getRole() === "link" ? [endCursors[endCursors.length - 1]] : endCursors; + } + } + SRNavigator.jumpCurrentEnd = jumpCurrentEnd; + /** + * Jump to the next matching element in the given navigation mode + * @param mode The navigation mode + * @param walker The cursor at the current position + * @returns A cursor at the next matching position, or null if none found + */ + function jumpNext(mode, walker) { + var DEBUG = false; + DEBUG && console.group("SRNavigator::jumpNext", walker.isEndTag() ? "/" : "", walker.getNode()); + try { + if (mode === "tab_focus") { + var tabFocusMatchFunc = getTabFocusStartFunc(true); + var tabFocusCursors = collectTabFocusCursors(tabFocusMatchFunc, walker.getNode()); + if (tabFocusCursors.length > 0) { + // console.log(tabFocusCursors.map(c => c.getNode())); + var currentTabFocusParentCursor = walker.getCurrentOrParentTabbableClone(); + var currentTabFocusCursor = currentTabFocusParentCursor && findTabFocusIndex(tabFocusCursors, currentTabFocusParentCursor) >= 0 ? currentTabFocusParentCursor : walker.clone(); + var currentIndex = findTabFocusIndex(tabFocusCursors, currentTabFocusCursor); + if (currentIndex >= 0) { + if (currentIndex + 1 < tabFocusCursors.length) { + return tabFocusCursors[currentIndex + 1].clone(); + } + return null; + } + return tabFocusCursors[0].clone(); + } + } + var retVal = walker.clone(); + var matchFunc = getStartFunc(mode); + var skipFunc = getSkipFunc(mode); + if (retVal.next(matchFunc, skipFunc)) { + DEBUG && console.log("SRNavigator::jumpNext result", retVal); + return retVal; + } + else { + return null; + } + } + finally { + console.groupEnd(); + } + } + SRNavigator.jumpNext = jumpNext; + /** + * Navigates to the previous element in screen reader navigation based on the specified mode. + * + * For tab_focus mode, this function attempts to move to the previous tabbable element by: + * 1. First trying to move backward using the mode's match and skip functions + * 2. If that fails, collecting all tab focus cursors and finding the previous one in the tab order + * + * @param mode - The navigation mode (e.g., "tab_focus") that determines how to navigate + * @param walker - The current cursor position in the screen reader navigation + * @returns A new cursor positioned at the previous element, or null if no previous element exists + */ + function jumpPrevious(mode, walker) { + if (mode === "tab_focus") { + var retVal_1 = walker.clone(); + var matchFunc_1 = getStartFunc(mode); + var skipFunc_1 = getSkipFunc(mode); + if (retVal_1.previous(matchFunc_1, skipFunc_1)) { + return retVal_1; + } + var tabFocusMatchFunc = getTabFocusStartFunc(true); + var tabFocusCursors = collectTabFocusCursors(tabFocusMatchFunc, walker.getNode()); + if (tabFocusCursors.length > 0) { + var currentTabFocusParentCursor = walker.getCurrentOrParentTabbableClone(); + var currentTabFocusCursor = currentTabFocusParentCursor && findTabFocusIndex(tabFocusCursors, currentTabFocusParentCursor) >= 0 ? currentTabFocusParentCursor : walker.clone(); + var currentIndex = findTabFocusIndex(tabFocusCursors, currentTabFocusCursor); + if (currentIndex > 0) { + return tabFocusCursors[currentIndex - 1].clone(); + } + } + return null; + } + var retVal = walker.clone(); + var matchFunc = getStartFunc(mode); + var skipFunc = getSkipFunc(mode); + if (retVal.previous(matchFunc, skipFunc)) { + return retVal; + } + else { + return null; + } + } + SRNavigator.jumpPrevious = jumpPrevious; +})(SRNavigator = exports.SRNavigator || (exports.SRNavigator = {})); + + +/***/ }, + +/***/ 7014 +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SRRenderer = void 0; +var AriaUtil_1 = __webpack_require__(7011); +var SRNavigator_1 = __webpack_require__(248); +var SRCursor_1 = __webpack_require__(8195); +var render_rules_1 = __webpack_require__(2151); +var common_1 = __webpack_require__(7242); +/** + * SRRenderer namespace provides functionality for simulating how screen readers + * announce content to users. It contains rules for rendering different types of + * elements and ARIA roles in various navigation modes. + * + * The renderer uses a rule-based system to determine what text should be announced + * when navigating to, within, or away from elements based on their roles and properties. + */ +var SRRenderer; +(function (SRRenderer) { + /** + * Generates the announcement text when entering an element + * + * This function looks up the appropriate rule based on the element's role or tag name + * and applies it to generate the announcement text. + * + * @param mode - The current navigation mode + * @param walker - Cursor at the current position + * @param oldWalker - Optional cursor at the previous position + * @returns Announcement text for entering the element, or null if no rule applies + */ + function renderEnter(mode, walker, oldWalker) { + var DEBUG = false; + for (var _i = 0, CONTAINER_ENTER_RULES_1 = render_rules_1.CONTAINER_ENTER_RULES; _i < CONTAINER_ENTER_RULES_1.length; _i++) { + var rule = CONTAINER_ENTER_RULES_1[_i]; + var s = rule.test(mode, walker, oldWalker); + DEBUG && console.log(mode, walker, rule, s); + if (typeof s !== "undefined" && s !== null) { + return s; + } + } + return null; + } + SRRenderer.renderEnter = renderEnter; + /** + * Generates the announcement text when leaving an element + * + * Similar to renderEnter, but applies rules for leaving elements instead. + * + * @param mode - The current navigation mode + * @param walker - Cursor at the current position + * @param oldWalker - Optional cursor at the previous position + * @returns Announcement text for leaving the element, or null if no rule applies + */ + function renderLeave(mode, walker, oldWalker) { + for (var _i = 0, CONTAINER_EXIT_RULES_1 = render_rules_1.CONTAINER_EXIT_RULES; _i < CONTAINER_EXIT_RULES_1.length; _i++) { + var rule = CONTAINER_EXIT_RULES_1[_i]; + var s = rule.test(mode, walker, oldWalker); + if (typeof s !== "undefined" && s !== null) { + return s; + } + } + return null; + } + SRRenderer.renderLeave = renderLeave; + /** + * Renders the current element and any container changes + * + * This function combines announcements for: + * - Containers being left + * - Containers being entered + * - The current element itself + * + * @param mode - The current navigation mode + * @param walker - Cursor at the current position + * @param containerChanges - Information about containers being entered or left + * @returns Combined announcement text + */ + function renderCurrent(mode, walker, containerChanges) { + var DEBUG = false; //mode === "tab_focus" && document.getElementById("fixture")?.getAttribute("class") === "tomtest"; + var startOfRender = SRNavigator_1.SRNavigator.jumpCurrent(mode, walker); + if (!startOfRender) + return null; + var endOfRenders = SRNavigator_1.SRNavigator.jumpCurrentEnd(mode, startOfRender); + if (!endOfRenders || endOfRenders.length === 0) { + endOfRenders = [null]; + } + DEBUG && console.log("AAAA", startOfRender.isStartTag(), startOfRender.getNode()); + DEBUG && console.log("BBBB", endOfRenders.map(function (val) { return val && val.isStartTag(); }), endOfRenders.map(function (val) { return val && val.getNode(); })); + var endOfRender = endOfRenders[endOfRenders.length - 1]; + var renderStr = ""; + for (var _i = 0, endOfRenders_1 = endOfRenders; _i < endOfRenders_1.length; _i++) { + var candidateEnd = endOfRenders_1[_i]; + var candidateRenderStr = SRRenderer.renderRange(mode, startOfRender, candidateEnd); + if (candidateRenderStr.trim().length > 0) { + endOfRender = candidateEnd; + renderStr = candidateRenderStr; + break; + } + } + if (renderStr === "") { + renderStr = SRRenderer.renderRange(mode, startOfRender, endOfRender); + } + DEBUG && console.log("CCCC", renderStr); + return { + start: startOfRender, + end: endOfRender, + message: (containerChanges.leaving || []).concat(containerChanges.entering || []).concat([renderStr]).join(" ").replace(/\s+/g, " ") + }; + } + SRRenderer.renderCurrent = renderCurrent; + /** + * Renders a range of elements between two cursors + * + * This function traverses the DOM from startOfRender to endOfRender, + * applying rendering rules to each element and combining the results. + * + * @param mode - The current navigation mode + * @param startOfRender - Cursor at the start of the range + * @param endOfRender - Cursor at the end of the range + * @returns Combined announcement text for the entire range + */ + function renderRange(mode, startOfRender, endOfRender) { + var _a; + var iterWalker = startOfRender.clone(); + var elemStrs = []; + var bContinue = true; + var currentLink = null; + while (bContinue) { + var elem = iterWalker.getElement(); + var node = iterWalker.getNode(); + var nodeType = node.nodeType; + var renderStrs = []; + var linkParent = AriaUtil_1.AriaUtil.getAncestorWithRole(node, "link", true); + if (linkParent && !["content", "text"].includes((_a = new SRCursor_1.SRCursor(linkParent).getNameInfo()) === null || _a === void 0 ? void 0 : _a.nameFrom)) { + // We don't consider links that announce themselves + linkParent = null; + } + for (var _i = 0, SR_RULES_1 = render_rules_1.SR_RULES; _i < SR_RULES_1.length; _i++) { + var rule = SR_RULES_1[_i]; + var s = rule.test(mode, iterWalker); + if (typeof s !== "undefined" && s !== null && s.trim().length > 0) { + if (nodeType === 1 && !iterWalker.isEndTag() && elem.getAttribute("aria-haspopup") === "menu") { + s = "[subMenu] " + s; + } + // Handle links + if (mode === "tab_focus") { + // We're in link mode + if (currentLink && (!linkParent || (linkParent && currentLink !== linkParent))) { + // We've added a string within a link (currentLink), but now we've left the link or moved to a new link + s = "".concat(s, " ").concat((0, common_1.getLinkAnnouncement)(new SRCursor_1.SRCursor(currentLink, false))); + } + } + else { + if (linkParent && (!currentLink || (currentLink !== linkParent))) { + // We're in a link, and we haven't announced this link, or we've moved to a new link + s = "".concat((0, common_1.getLinkAnnouncement)(new SRCursor_1.SRCursor(linkParent, false)), " ").concat(s); + } + } + if (s !== "") { + currentLink = linkParent; + elemStrs.push(s); + } + break; + } + } + elemStrs.push(renderStrs.filter(function (s) { return s.trim().length > 0; }).join(" ")); + bContinue = iterWalker.next(function () { return true; }, SRNavigator_1.SRNavigator.getSkipFunc(mode)) && SRCursor_1.SRCursor.compare(iterWalker, endOfRender) < 0; + } + if (mode === "tab_focus" && currentLink) { + elemStrs.push("".concat((0, common_1.getLinkAnnouncement)(new SRCursor_1.SRCursor(currentLink, false)))); + } + var retVal = elemStrs.filter(function (s) { return s.trim().length > 0; }).join(" "); + retVal = retVal.replace(/, \u0001([^\u0002]+)\u0002/g, function (match, describedByText) { + var quotedText = "\"".concat(describedByText, "\""); + var unmarkedRetVal = retVal.replace(match, ""); + return unmarkedRetVal.includes(quotedText) || unmarkedRetVal.includes(describedByText) ? "" : ", ".concat(quotedText); + }); + retVal = retVal.replace(/[\u0001\u0002]/g, ""); + return retVal; + } + SRRenderer.renderRange = renderRange; +})(SRRenderer = exports.SRRenderer || (exports.SRRenderer = {})); + + +/***/ }, + +/***/ 328 +(__unused_webpack_module, exports) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SRRendererRule = void 0; +var SRRendererRule = /** @class */ (function () { + function SRRendererRule(ruleDefinition) { + this.ruleDefinition = ruleDefinition; + } + SRRendererRule.prototype.test = function (mode, cursor, oldCursor) { + if (this.ruleDefinition.modes.includes(mode) + && (this.ruleDefinition.roles.includes(cursor.getRole()) + || this.ruleDefinition.elems.includes(cursor.getNode().nodeName.toUpperCase()))) { + for (var _i = 0, _a = this.ruleDefinition.tests; _i < _a.length; _i++) { + var test_1 = _a[_i]; + var s = test_1(cursor, oldCursor, mode); + if (typeof s === "string") + return s; + } + } + return null; + }; + return SRRendererRule; +}()); +exports.SRRendererRule = SRRendererRule; + + +/***/ }, + +/***/ 369 +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SRTableUtil = void 0; +var SRCursor_1 = __webpack_require__(8195); +/** + * TableUtil namespace provides utility functions for handling HTML tables in the accessibility simulator. + * These functions help determine cell positions, relationships, and extract header information + * to simulate how screen readers would announce table navigation. + */ +var SRTableUtil; +(function (SRTableUtil) { + /** + * Determines if the cursor is pointing to a cell element (TD or TH) + * or has a cell-related ARIA role + * @param cursor - The SRCursor to check + * @returns true if the cursor is on a cell, false otherwise + */ + function isCursorCellRole(cursor) { + if (!cursor.getElement()) + return false; + if (["cell", "rowheader", "columnheader"].includes(cursor.getRole())) { + return true; + } + return !cursor.getElement().hasAttribute("role") && ["TH", "TD"].includes(cursor.getElement().nodeName.toUpperCase()); + } + SRTableUtil.isCursorCellRole = isCursorCellRole; + /** + * Gets a cursor pointing to the current cell or the parent cell if the cursor + * is inside a cell's content + * @param cursor - The SRCursor to check + * @returns A new SRCursor pointing to the cell or null if not in a cell + */ + function getCurrentOrParentCellCursor(cursor) { + return cursor.getCurrentOrParentByRoleClone(["cell", "rowheader", "columnheader"], ["TD", "TH"]); + } + SRTableUtil.getCurrentOrParentCellCursor = getCurrentOrParentCellCursor; + /** + * Get the colspan of a cell at a given location + * @param cursor The cursor to get the colspan from + * @returns The colspan of the cell at the cursor's location or 0 if not in a column + */ + function getColSpan(cursor) { + if (!isCursorCellRole(cursor)) + return 0; + var colSpan = cursor.getElement().getAttribute("colspan"); + if (colSpan) { + return parseInt(colSpan); + } + return 1; + } + SRTableUtil.getColSpan = getColSpan; + /** + * Get the rowspan of a cell at a given location + * @param cursor The cursor to get the rowspan from + * @returns The rowspan of the cell at the cursor's location or 0 if not in a column + */ + function getRowSpan(cursor) { + if (!isCursorCellRole(cursor)) + return 0; + var rowSpan = cursor.getElement().getAttribute("rowspan"); + if (rowSpan) { + return parseInt(rowSpan); + } + return 1; + } + SRTableUtil.getRowSpan = getRowSpan; + /** + * Builds a complete model of a table's structure, accounting for rowspan and colspan + * + * This function traverses the entire table and creates a data structure that represents + * the logical grid of cells, properly handling cells that span multiple rows or columns. + * The resulting model makes it easier to determine cell relationships and positions. + * + * @param inTableCursor - A cursor within the table + * @returns A TableModel representing the complete table structure, or null if not in a table + */ + function getTableModel(inTableCursor) { + // Get a cursor pointing to the table element + var tableCursor = inTableCursor.getCurrentOrParentByRoleClone(["table"]); + if (!tableCursor) + return null; + var walkTableCursor = tableCursor.clone(); + var retVal = []; // The complete table model we're building + var curRow = []; // The current row being processed + var prevRow; // The previous row (needed for rowspan handling) + // Walk through the table's DOM structure + while (walkTableCursor.next(function () { return true; }) && !walkTableCursor.getNode().isSameNode(tableCursor.getNode())) { + if (walkTableCursor.isEndTag() && walkTableCursor.getRole() === "row") { + // Reached the end of the row, push what we have and reset + retVal.push(curRow); + prevRow = curRow; + curRow = []; + // Handle cells with rowspan from previous rows that affect this row + // This ensures cells spanning multiple rows are properly represented in the model + while (prevRow && curRow.length < prevRow.length && + ((prevRow[curRow.length].rowIndexStart + prevRow[curRow.length].rowspan - 1) >= retVal.length)) { + curRow.push(prevRow[curRow.length]); + } + } + // Process each cell in the row + if (!walkTableCursor.isEndTag() && isCursorCellRole(walkTableCursor)) { + var colspan = getColSpan(walkTableCursor); + // Create a cell model with position and spanning information + var cellInfo = { + rowIndexStart: retVal.length, + colIndexStart: curRow.length, + rowspan: getRowSpan(walkTableCursor), + colspan: colspan, + cellCursor: walkTableCursor.clone() + }; + // For cells with colspan, add the same cell info to multiple columns + for (var idx = 0; idx < colspan; ++idx) { + curRow.push(cellInfo); + } + // Continue handling cells with rowspan from previous rows + while (prevRow && curRow.length < prevRow.length && + ((prevRow[curRow.length].rowIndexStart + prevRow[curRow.length].rowspan - 1) >= retVal.length)) { + curRow.push(prevRow[curRow.length]); + } + } + } + return retVal; + } + SRTableUtil.getTableModel = getTableModel; + /** + * Gets the cell model for a specific cell in the table + * + * This function finds the CellModel object that represents a specific cell, + * which contains information about its position and spanning. + * + * @param inCellCursor - A cursor pointing to a cell or its contents + * @param tableModel - Optional pre-built table model (will be created if not provided) + * @returns The CellModel for the specified cell, or null if not found + */ + function getCellModel(inCellCursor, tableModel) { + var cellCursor = getCurrentOrParentCellCursor(inCellCursor); + if (!tableModel) { + tableModel = getTableModel(inCellCursor); + } + // Search through the table model to find the matching cell + for (var rowIndex = 0; rowIndex < tableModel.length; ++rowIndex) { + for (var colIndex = 0; colIndex < tableModel[rowIndex].length; ++colIndex) { + if (tableModel[rowIndex][colIndex].cellCursor.isSameNode(cellCursor)) { + return tableModel[rowIndex][colIndex]; + } + } + } + return null; + } + SRTableUtil.getCellModel = getCellModel; + /** + * Checks if a cell spans a specific column + * + * @param cellModel - The cell model to check + * @param colIdx - The column index to check + * @returns True if the cell contains the specified column + */ + function cellModelContainsColumn(cellModel, colIdx) { + return colIdx >= cellModel.colIndexStart && colIdx < cellModel.colIndexStart + cellModel.colspan; + } + SRTableUtil.cellModelContainsColumn = cellModelContainsColumn; + /** + * Checks if a cell spans a specific row + * + * @param cellModel - The cell model to check + * @param rowIdx - The row index to check + * @returns True if the cell contains the specified row + */ + function cellModelContainsRow(cellModel, rowIdx) { + return rowIdx >= cellModel.rowIndexStart && rowIdx < cellModel.rowIndexStart + cellModel.rowspan; + } + SRTableUtil.cellModelContainsRow = cellModelContainsRow; + /** + * Gets the row headers associated with a cell + * First checks for explicit headers attribute, then looks for row headers in the same row + * @param cursor - The SRCursor pointing to a cell + * @returns A string containing the concatenated header names + */ + function getRowHeaders(cursor) { + return ""; + } + SRTableUtil.getRowHeaders = getRowHeaders; + /** + * Gets the column headers associated with a cell + * First checks for explicit headers attribute, then looks for column headers in the same column + * @param cursor - The SRCursor pointing to a cell + * @returns A string containing the concatenated header names + */ + function getColumnHeadersForCursor(inCellCursor, tableModel) { + if (!tableModel) { + tableModel = getTableModel(inCellCursor); + if (!tableModel) + return ""; + } + var cellModel = getCellModel(inCellCursor, tableModel); + if (!cellModel) + return ""; + var cellCursor = cellModel.cellCursor; + if (!cellCursor) + return ""; + var cellElem = cellCursor.getElement(); + if (!cellElem) + return ""; + var colDatas = []; + for (var colIdx = cellModel.colIndexStart; colIdx < cellModel.colIndexStart + cellModel.colspan; ++colIdx) { + colDatas.push({ + potentialColHeaders: [], + existsDataCell: false, + colIdx: colIdx + }); + } + var potentialHeaders = []; + if (cellElem.hasAttribute("headers")) { + potentialHeaders = cellElem.getAttribute("headers") + // Split the header attribute into ids + .split(" ") + // Get the node for each id + .map(function (id) { return document.getElementById(id); }) + // Get rid of bad mappings + .filter(function (node) { return !!node; }) + // Convert to SRCursors to that we can get accessible names + .map(function (node) { return new SRCursor_1.SRCursor(node); }) + // Remove headers that aren't in the same column (ignore column headers) + .filter(function (cursor) { return colDatas.some(function (colData) { return cellModelContainsColumn(SRTableUtil.getCellModel(cursor, tableModel), colData.colIdx); }); }); + } + else { + // Get all cells in this column + // Note - if everything in this column is empty or a header cell, this is probably not a heading + for (var rowIdx = 0; rowIdx < tableModel.length; ++rowIdx) { + var _loop_1 = function (colData) { + var colIdx = colData.colIdx; + var checkInfo = tableModel[rowIdx][colIdx]; + var checkCursor = checkInfo.cellCursor; + var checkCursorElem = checkCursor.getElement(); + // If this row/col isn't found, or is the same cursor as our original cell model, or already in our list, skip, but check if it's a data cell + if (!checkInfo || !checkCursor || checkCursor.isSameNode(cellCursor) || potentialHeaders.some(function (c) { return checkCursor.isSameNode(c); })) { + colData.existsDataCell = colData.existsDataCell || (isDataCell(checkCursor) && (checkCursor.hasNonEmptyName() || colData.potentialColHeaders.length > 0)); + return "continue"; + } + var c = checkCursor.clone(); + if (checkCursor.getRole() === "columnheader") { + potentialHeaders.push(c); + colData.potentialColHeaders.push(c); + } + else if (!checkCursorElem.hasAttribute("role") && checkCursorElem.nodeName.toUpperCase() === "TH") { + if (checkCursorElem.getAttribute("scope") === "col" || checkCursorElem.getAttribute("scope") === "axis") { + potentialHeaders.push(c); + colData.potentialColHeaders.push(c); + } + else if (!checkCursorElem.hasAttribute("scope") && checkCursor.hasNonEmptyName()) { + potentialHeaders.push(c); + colData.potentialColHeaders.push(c); + } + } + else { + colData.existsDataCell = colData.existsDataCell || (isDataCell(checkCursor) && (checkCursor.hasNonEmptyName() || colData.potentialColHeaders.length > 0)); + } + }; + for (var _i = 0, colDatas_1 = colDatas; _i < colDatas_1.length; _i++) { + var colData = colDatas_1[_i]; + _loop_1(colData); + } + } + for (var _a = 0, colDatas_2 = colDatas; _a < colDatas_2.length; _a++) { + var colData = colDatas_2[_a]; + if (!colData.existsDataCell) { + colData.potentialColHeaders = []; + } + } + potentialHeaders = potentialHeaders.filter(function (one) { return colDatas.some(function (colData) { return colData.potentialColHeaders.some(function (two) { return two.isSameNode(one); }); }); }); + } + return potentialHeaders + // And then return the names of the headers + .map(function (cursor) { var _a; return ((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) || ""; }) + .map(function (s) { return s.trim(); }) + .filter(function (s) { return s.length > 0; }) + .join(", "); + } + SRTableUtil.getColumnHeadersForCursor = getColumnHeadersForCursor; + /** + * Gets the row headers associated with a cell + * First checks for explicit headers attribute, then looks for row headers in the same row + * @param cursor - The SRCursor pointing to a cell + * @returns A string containing the concatenated header names + */ + function getRowHeadersForCursor(inCellCursor, tableModel) { + if (!tableModel) { + tableModel = getTableModel(inCellCursor); + if (!tableModel) + return ""; + } + var cellModel = getCellModel(inCellCursor, tableModel); + if (!cellModel) + return ""; + var cellCursor = cellModel.cellCursor; + if (!cellCursor) + return ""; + var cellElem = cellCursor.getElement(); + if (!cellElem) + return ""; + var rowDatas = []; + for (var rowIdx = cellModel.rowIndexStart; rowIdx < cellModel.rowIndexStart + cellModel.rowspan; ++rowIdx) { + rowDatas.push({ + potentialRowHeaders: [], + existsDataCell: false, + rowIdx: rowIdx + }); + } + var potentialHeaders = []; + if (cellElem.hasAttribute("headers")) { + potentialHeaders = cellElem.getAttribute("headers") + // Split the header attribute into ids + .split(" ") + // Get the node for each id + .map(function (id) { return document.getElementById(id); }) + // Get rid of bad mappings + .filter(function (node) { return !!node; }) + // Convert to SRCursors to that we can get accessible names + .map(function (node) { return new SRCursor_1.SRCursor(node); }) + // Remove headers that aren't in the same row (ignore column headers) + .filter(function (cursor) { return rowDatas.some(function (rowData) { return cellModelContainsRow(SRTableUtil.getCellModel(cursor, tableModel), rowData.rowIdx); }); }); + } + else { + // Get all cells in the rows + // Note - if everything in the row is empty or a header cell, this is probably not a heading + var longestRow = rowDatas.reduce(function (prev, cur) { return Math.max(prev, tableModel[cur.rowIdx].length); }, 0); + for (var colIdx = 0; colIdx < longestRow; ++colIdx) { + var _loop_2 = function (rowData) { + var rowIdx = rowData.rowIdx; + if (colIdx >= tableModel[rowIdx].length) + return "continue"; + var checkInfo = tableModel[rowIdx][colIdx]; + var checkCursor = checkInfo.cellCursor; + var checkCursorElem = checkCursor.getElement(); + // If this row/col isn't found, or is the same cursor as our original cell model, or already in our list, skip, but check if it's a data cell + if (!checkInfo || !checkCursor || checkCursor.isSameNode(cellCursor) || potentialHeaders.some(function (c) { return checkCursor.isSameNode(c); })) { + rowData.existsDataCell = rowData.existsDataCell || (isDataCell(checkCursor) && (checkCursor.hasNonEmptyName() || rowData.potentialRowHeaders.length > 0)); + return "continue"; + } + var c = checkCursor.clone(); + if (checkCursor.getRole() === "rowheader") { + potentialHeaders.push(c); + rowData.potentialRowHeaders.push(c); + } + else if (!checkCursorElem.hasAttribute("role") && checkCursorElem.nodeName.toUpperCase() === "TH") { + if (checkCursorElem.getAttribute("scope") === "row" || checkCursorElem.getAttribute("scope") === "axis") { + potentialHeaders.push(c); + rowData.potentialRowHeaders.push(c); + } + else if (!checkCursorElem.hasAttribute("scope") && checkCursor.hasNonEmptyName()) { + potentialHeaders.push(c); + rowData.potentialRowHeaders.push(c); + } + } + else { + rowData.existsDataCell = rowData.existsDataCell || (isDataCell(checkCursor) && (checkCursor.hasNonEmptyName() || rowData.potentialRowHeaders.length > 0)); + } + }; + for (var _i = 0, rowDatas_1 = rowDatas; _i < rowDatas_1.length; _i++) { + var rowData = rowDatas_1[_i]; + _loop_2(rowData); + } + } + for (var _a = 0, rowDatas_2 = rowDatas; _a < rowDatas_2.length; _a++) { + var rowData = rowDatas_2[_a]; + if (!rowData.existsDataCell) { + rowData.potentialRowHeaders = []; + } + } + potentialHeaders = potentialHeaders.filter(function (one) { return rowDatas.some(function (rowData) { return rowData.potentialRowHeaders.some(function (two) { return two.isSameNode(one); }); }); }); + } + return potentialHeaders + // And then return the names of the headers + .map(function (cursor) { var _a; return ((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) || ""; }) + .map(function (s) { return s.trim(); }) + .filter(function (s) { return s.length > 0; }) + .join(", "); + } + SRTableUtil.getRowHeadersForCursor = getRowHeadersForCursor; + /** + * Determines if a cell is a data cell (not a header cell) + * + * A data cell is one with either: + * - An explicit ARIA role of "cell" + * - A TD element without an overriding role attribute + * + * @param checkCursor - The cursor to check + * @returns True if the cursor points to a data cell + */ + function isDataCell(checkCursor) { + var checkCursorElem = checkCursor.getElement(); + if (!checkCursorElem) + return false; + return checkCursor.getRole() === "cell" || (!checkCursorElem.hasAttribute("role") && checkCursorElem.nodeName.toUpperCase() === "TD"); + } + SRTableUtil.isDataCell = isDataCell; +})(SRTableUtil = exports.SRTableUtil || (exports.SRTableUtil = {})); + + +/***/ }, + +/***/ 2165 +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SRUtil = void 0; +var AriaUtil_1 = __webpack_require__(7011); +var VisUtil_1 = __webpack_require__(3946); +var SRUtil; +(function (SRUtil) { + function isModalDialogElement(node) { + if (node.nodeType !== 1) + return false; + var elem = node; + var role = AriaUtil_1.AriaUtil.getResolvedRole(elem, true); + return role === "dialog" && elem.getAttribute("aria-modal") === "true" && VisUtil_1.VisUtil.isNodeVisible(node); + } + SRUtil.isModalDialogElement = isModalDialogElement; + /** + * Generates a unique CSS selector for a specific HTML element + * The selector is built using a combination of: + * 1. Element tag name + * 2. ID (if available) + * 3. Classes (if available) + * 4. Attributes (if needed) + * 5. nth-child selectors for position in parent + * + * @param element The HTML element to generate a selector for + * @param optimized If true, creates a shorter but possibly less robust selector + * @return A CSS selector string that uniquely identifies the element + */ + function getUniqueSelector(element, optimized) { + if (optimized === void 0) { optimized = false; } + // If the element has an ID, that's the most direct way to select it + if (element.id) { + return "#".concat(CSS.escape(element.id)); + } + // If we're at the root or document element, return the tag name + if (element.isSameNode(document.documentElement) || element.isSameNode(document.body)) { + return element.tagName.toLowerCase(); + } + // Start building the selector with the tag name + var selector = element.tagName.toLowerCase(); + // Add classes if available and we're not optimizing for brevity + if (element.classList.length && !optimized) { + // Take up to 3 classes to avoid overly specific selectors + var classes = Array.from(element.classList).slice(0, 3); + selector += classes.map(function (cls) { return ".".concat(CSS.escape(cls)); }).join(''); + } + // Add distinguishing attributes if needed and not optimizing + if (!optimized) { + // Consider adding role, aria-label, or other distinctive attributes + if (element.hasAttribute('role')) { + selector += "[role=\"".concat(CSS.escape(element.getAttribute('role') || ''), "\"]"); + } + if (element.hasAttribute('aria-label')) { + var label = element.getAttribute('aria-label') || ''; + if (label.length <= 20) { // Avoid overly long selectors + selector += "[aria-label=\"".concat(CSS.escape(label), "\"]"); + } + } + // For inputs, add type attribute + if (element.tagName.toLowerCase() === 'input' && element.hasAttribute('type')) { + selector += "[type=\"".concat(CSS.escape(element.getAttribute('type') || ''), "\"]"); + } + } + // If we have a parent node, determine position among siblings + if (element.parentElement) { + // Find all siblings with the same tag + var siblings = Array.from(element.parentElement.children) + .filter(function (child) { return child.tagName === element.tagName; }); + // If there's more than one sibling with the same tag, add nth-child + if (siblings.length > 1) { + var index = siblings.indexOf(element) + 1; + selector += ":nth-of-type(".concat(index, ")"); + } + // If we're not at the root, recursively build the parent selector + // but use optimized selectors for ancestors to keep the overall selector manageable + return "".concat(getUniqueSelector(element.parentElement, true), " > ").concat(selector); + } + return selector; + } + SRUtil.getUniqueSelector = getUniqueSelector; +})(SRUtil = exports.SRUtil || (exports.SRUtil = {})); + + +/***/ }, + +/***/ 8107 +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SRViewer = exports.SROverlay = void 0; +var SRController_1 = __webpack_require__(5233); +/** + * SROverlay class for creating a UI widget to control screen reader simulation + * Provides buttons for navigation and displays results + */ +var SROverlay = /** @class */ (function () { + /** + * Creates a new SROverlay + * @param controller The SRController instance to use for navigation + */ + function SROverlay(srViewer) { + this.srViewer = srViewer; + /** Navigation modes available in the UI */ + this.navigationModes = [ + { mode: "item", label: "Item" }, + { mode: "tab_focus", label: "Tabbable" }, + { mode: "heading", label: "Heading" }, + { mode: "region", label: "Region" } + ]; + this.createOverlay(); + } + SROverlay.prototype.createDOMElement = function (elemName, attrs, styles) { + var retVal = this.srViewer.viewerDoc.createElement(elemName); + if (attrs) { + for (var key in attrs) { + retVal[key] = attrs[key]; + } + } + if (styles) { + for (var key in styles) { + retVal.style[key] = styles[key]; + } + } + return retVal; + }; + /** + * Creates the overlay UI elements and adds them to the DOM + */ + SROverlay.prototype.createOverlay = function () { + var _this = this; + // Create main container + this.container = this.createDOMElement("div", { + className: "ibma-sr-overlay" + }, { + position: 'fixed', + bottom: '0', + left: '0', + width: '100%', + backgroundColor: 'rgba(0, 0, 0, 0.8)', + color: 'white', + padding: '10px', + zIndex: '10000', + display: 'flex', + flexDirection: 'column', + gap: '10px' + }); + // Create controls container + var controlsContainer = this.createDOMElement("div", {}, { + display: "flex", flexWrap: "wrap", gap: "10px" + }); + // Create navigation mode groups + this.navigationModes.forEach(function (navMode) { + var modeGroup = _this.createDOMElement('div', {}, { + display: "flex", + alignItems: 'center', + gap: '5px', + margin: '0 10px' + }); + modeGroup.appendChild(_this.createDOMElement('span', { + textContent: navMode.label + ":" + }, {})); + // Previous button + var prevButton = _this.createDOMElement('button', { + textContent: '◀ Prev' + }, { + padding: '5px 10px', + backgroundColor: '#444', + color: 'white', + border: 'none', + borderRadius: '3px', + cursor: 'pointer' + }); + prevButton.addEventListener('click', function () { return _this.srViewer.navigatePrevious(navMode.mode); }); + modeGroup.appendChild(prevButton); + // Next button + var nextButton = _this.createDOMElement('button', { + textContent: 'Next ▶' + }, { + padding: '5px 10px', + backgroundColor: '#444', + color: 'white', + border: 'none', + borderRadius: '3px', + cursor: 'pointer' + }); + nextButton.addEventListener('click', function () { return _this.srViewer.navigateNext(navMode.mode); }); + modeGroup.appendChild(nextButton); + controlsContainer.appendChild(modeGroup); + }); + var otherButtonGroup = this.createDOMElement('div', {}, { + display: "flex", + alignItems: 'center', + gap: '5px', + margin: '0 10px' + }); + // Show all button + var showAllButton = this.createDOMElement('button', { + textContent: 'Show all' + }, { + padding: '5px 10px', + backgroundColor: '#444', + color: 'white', + border: 'none', + borderRadius: '3px', + cursor: 'pointer' + }); + showAllButton.addEventListener('click', function () { return _this.srViewer.showAll(true); }); + otherButtonGroup.appendChild(showAllButton); + // Toggle Speech Button + var toggleSpeech = this.createDOMElement('button', { + textContent: 'Toggle speech' + }, { + padding: '5px 10px', + backgroundColor: '#444', + color: 'white', + border: 'none', + borderRadius: '3px', + cursor: 'pointer' + }); + toggleSpeech.addEventListener('click', function () { return _this.srViewer.toggleSpeech(); }); + otherButtonGroup.appendChild(toggleSpeech); + controlsContainer.appendChild(otherButtonGroup); + // Create results display + this.resultsDisplay = this.createDOMElement('div', { + textContent: 'Screen reader simulation results will appear here.' + }, { + padding: '10px', + backgroundColor: 'rgba(255, 255, 255, 0.1)', + borderRadius: '3px', + minHeight: '100px', + maxHeight: '50vh', + fontFamily: 'monospace', + overflow: 'auto' + }); + // Add elements to container + this.container.appendChild(controlsContainer); + this.container.appendChild(this.resultsDisplay); + // Add to document + this.srViewer.viewerDoc.body.appendChild(this.container); + }; + /** + * Display the navigation result in the overlay + * @param result The navigation result + * @param mode The navigation mode used + * @param direction The navigation direction ('next', 'previous', or 'focus') + */ + SROverlay.prototype.displayResult = function (result, mode, direction) { + var _a, _b, _c, _d; + var displayText = ''; + if (result.success) { + // console.log("???", result); + displayText = "".concat(direction.toUpperCase(), " ").concat(mode, ": ").concat(result.renderingResult.message); + } + else { + displayText = "".concat(direction.toUpperCase(), " ").concat(mode, ": ").concat(result.renderingResult.message); + } + (_b = (_a = result.renderingResult.end) === null || _a === void 0 ? void 0 : _a.getElement()) === null || _b === void 0 ? void 0 : _b.scrollIntoView(); + (_d = (_c = result.renderingResult.start) === null || _c === void 0 ? void 0 : _c.getElement()) === null || _d === void 0 ? void 0 : _d.scrollIntoView(); + window.scrollBy(0, -200); + this.resultsDisplay.innerHTML = ""; + this.resultsDisplay.textContent = displayText; + var inspectButton = this.createDOMElement("button", { + innerText: "Debug" + }, {}); + inspectButton.addEventListener("click", function () { + var _a, _b; + console.log((_a = result.renderingResult.start) === null || _a === void 0 ? void 0 : _a.getNode(), (_b = result.renderingResult.end) === null || _b === void 0 ? void 0 : _b.getNode()); + }); + this.resultsDisplay.appendChild(inspectButton); + }; + SROverlay.prototype.displayAll = function (result) { + var _this = this; + var table = this.createDOMElement("table", {}, {}); + var headerRow = this.createDOMElement("tr", {}, {}); + var headingLabels = ["Region", "Heading", "Item", "Tabbable"]; + var headingFields = ["region", "heading", "item", "tab_focus"]; + for (var _i = 0, headingLabels_1 = headingLabels; _i < headingLabels_1.length; _i++) { + var headingLabel = headingLabels_1[_i]; + headerRow.appendChild(this.createDOMElement("th", { + scope: "col", + innerText: headingLabel + }, { + textAlign: "left", + padding: ".25rem", + margin: "0rem", + color: "white" + })); + table.appendChild(headerRow); + } + var _loop_1 = function (line) { + var dataRow = this_1.createDOMElement("tr", {}, {}); + headingFields.forEach(function (field) { + dataRow.appendChild(_this.createDOMElement("td", { + innerText: line[field] + }, { + verticalAlign: "top", + border: "solid white 1px", + padding: ".25rem", + margin: "0rem", + color: "white" + })); + }); + table.appendChild(dataRow); + }; + var this_1 = this; + for (var _a = 0, result_1 = result; _a < result_1.length; _a++) { + var line = result_1[_a]; + _loop_1(line); + } + this.resultsDisplay.innerHTML = ""; + this.resultsDisplay.appendChild(table); + }; + /** + * Remove the overlay from the DOM + */ + SROverlay.prototype.destroy = function () { + if (this.container && this.container.parentNode) { + this.container.parentNode.removeChild(this.container); + } + }; + return SROverlay; +}()); +exports.SROverlay = SROverlay; +/** + * SRViewer class for managing screen reader simulation with UI controls + */ +var SRViewer = /** @class */ (function () { + /** + * Creates a new SRViewer + * @param rootElement The root element to start from (defaults to document.body) + */ + function SRViewer(rootElement) { + if (rootElement === void 0) { rootElement = document.body; } + /** Flag to track if speech is active */ + this.isStreaming = false; + /** Flag to set if showing all */ + this.isShowingAll = false; + /** Flag to set if it should be speaking */ + this.speechEnabled = false; + this.viewerDoc = rootElement.ownerDocument; + // Create controller for the document body + this.controller = SRController_1.SRController.getController(this.viewerDoc); + // Create overlay UI + this.overlay = new SROverlay(this); + // Set up keyboard handlers + this.setupKeyboardHandlers(); + // Set up focus tracking + this.setupFocusTracking(); + // Set up mutation tracking + this.setupMutationTracking(); + } + SRViewer.prototype.showAll = function (bEnableAllMode) { + if (bEnableAllMode) { + this.isShowingAll = true; + } + var result = SRController_1.SRController.renderStructure(this.viewerDoc); + this.overlay.displayAll(result); + }; + SRViewer.prototype.toggleSpeech = function () { + this.speechEnabled = !this.speechEnabled; + }; + /** + * Navigate to the next element using the specified mode + * @param mode The navigation mode to use + */ + SRViewer.prototype.navigateNext = function (mode) { + this.isShowingAll = false; + var result = this.controller.jumpNext(mode); + this.overlay.displayResult(result, mode, 'next'); + this.speakResult(result); + }; + /** + * Navigate to the previous element using the specified mode + * @param mode The navigation mode to use + */ + SRViewer.prototype.navigatePrevious = function (mode) { + this.isShowingAll = false; + var result = this.controller.jumpPrevious(mode); + this.overlay.displayResult(result, mode, 'previous'); + this.speakResult(result); + }; + /** + * Set up keyboard event handlers for screen reader navigation + */ + SRViewer.prototype.setupKeyboardHandlers = function () { + var _this = this; + this.keyboardHandler = function (e) { + // Don't capture keyboard events when focus is in form controls + var target = e.target; + if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.tagName === 'SELECT') { + return; + } + // Handle keyboard shortcuts + if (e.ctrlKey) { + // Ctrl key stops speech + _this.stopSpeech(); + return; + } + if (e.altKey || e.metaKey) + return; + // console.log(e.key); + switch (e.key) { + case 'ArrowUp': + e.preventDefault(); + _this.navigatePrevious('item'); + break; + case ' ': + _this.isStreaming = true; + case 'ArrowDown': + e.preventDefault(); + _this.navigateNext('item'); + break; + case 'Enter': + e.preventDefault(); + _this.activateCurrentElement(); + _this.controller.setPointOfRegard(_this.viewerDoc.activeElement); + break; + case 'H': + case 'h': + if (e.shiftKey) { + e.preventDefault(); + _this.navigatePrevious('heading'); + } + else { + e.preventDefault(); + _this.navigateNext('heading'); + } + break; + case 'R': + case 'r': + if (e.shiftKey) { + e.preventDefault(); + _this.navigatePrevious('region'); + } + else { + e.preventDefault(); + _this.navigateNext('region'); + } + break; + case 'Tab': + if (e.shiftKey) { + e.preventDefault(); + _this.navigatePrevious('tab_focus'); + } + else { + e.preventDefault(); + _this.navigateNext('tab_focus'); + } + break; + } + }; + // Add the event listener + this.viewerDoc.addEventListener('keydown', this.keyboardHandler); + }; + SRViewer.prototype.speakResult = function (result) { + var _this = this; + if (!this.speechEnabled) + return; + var utterance = new SpeechSynthesisUtterance(result.renderingResult.message); + utterance.rate = 1.5; + var myThis = this; + utterance.addEventListener("end", function (event) { + if (myThis.isStreaming) { + _this.navigateNext('item'); + } + }); + speechSynthesis.cancel(); + speechSynthesis.speak(utterance); + }; + /** + * Stop speech output + */ + SRViewer.prototype.stopSpeech = function () { + this.isStreaming = false; + // Cancel any active speech synthesis + speechSynthesis.cancel(); + }; + /** + * Set up mutation tracking + */ + SRViewer.prototype.setupMutationTracking = function () { + var _this = this; + var observer = new MutationObserver(function (mutations) { + // console.log(this.isShowingAll, mutations.length); + if (_this.isShowingAll) { + var outsideOverlay = mutations.filter(function (mutation) { return mutation.target.nodeType === 1 + && !mutation.target.closest(".ibma-sr-overlay"); }); + if (outsideOverlay.length > 0) { + // console.log("Mutations",outsideOverlay); + observer.disconnect(); + var myThis_1 = _this; + myThis_1.showAll(); + setTimeout(function () { + myThis_1.showAll(); + observer.observe(_this.viewerDoc.documentElement, { + attributes: true, + childList: true, + subtree: true + }); + }, 1000); + } + } + }); + observer.observe(this.viewerDoc.documentElement, { + attributes: true, + childList: true, + subtree: true + }); + }; + /** + * Set up focus tracking to update the point of regard when focus changes + */ + SRViewer.prototype.setupFocusTracking = function () { + var _this = this; + this.focusHandler = function (e) { + // Skip if the focus is on the overlay itself + if (e.target instanceof HTMLElement) { + var target = e.target; + if (_this.overlay && target.closest('.ibma-sr-overlay')) { + return; + } + console.group("focusHandler"); + // Update the point of regard to the newly focused element + var result = _this.controller.setPointOfRegard(target); + // Announce the focus change + if (result.success) { + _this.overlay.displayResult(result, 'focus', 'focus'); + _this.speakResult(result); + } + console.groupEnd(); + } + }; + // Add the focus event listener to the document + this.viewerDoc.addEventListener('focusin', this.focusHandler); + }; + /** + * Activate (click) the element at the current point of regard + */ + SRViewer.prototype.activateCurrentElement = function () { + var currentElement = this.controller.getPointOfRegard().getElement(); + if (currentElement) { + // Announce that we're activating the element + var result = { + success: true, + renderingResult: { + message: "Activating: ".concat(currentElement.textContent || currentElement.nodeName), + start: this.controller.getPointOfRegard(), + end: this.controller.getPointOfRegard() + } + }; + this.overlay.displayResult(result, 'focus', 'focus'); + this.speakResult(result); + // Focus the element first + if (currentElement.focus) { + currentElement.focus(); + } + // Simulate a click on the element + currentElement.click(); + } + }; + /** + * Get the controller instance + * @returns The SRController instance + */ + SRViewer.prototype.getController = function () { + return this.controller; + }; + /** + * Destroy the viewer and clean up resources + */ + SRViewer.prototype.destroy = function () { + // Remove event listeners + this.viewerDoc.removeEventListener('keydown', this.keyboardHandler); + this.viewerDoc.removeEventListener('focusin', this.focusHandler); + // Stop any active speech + this.stopSpeech(); + // Destroy overlay + this.overlay.destroy(); + }; + return SRViewer; +}()); +exports.SRViewer = SRViewer; + + +/***/ }, + +/***/ 7242 +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.RULES = exports.getLinkAnnouncement = exports.getRoleDescription = exports.quoteName = exports.quoteNamePadBefore = exports.quoteNamePadAfter = void 0; +var SRCursor_1 = __webpack_require__(8195); +var SRRendererRule_1 = __webpack_require__(328); +var AriaUtil_1 = __webpack_require__(7011); +var ARIADefinitions_1 = __webpack_require__(9910); +var DOMWalker_1 = __webpack_require__(3864); +var VisUtil_1 = __webpack_require__(3946); +/** + * Provide the name, surrounded by the quoteCharBefore and quoteCharAfter and followed by the padding if the name exists + * @param cursor The cursor for which to fetch the name + * @param padding String to add after, if the name exists + * @param quoteCharBefore The string to use as the leading quote, if the name exists + * @param quoteCharBefore The string to use as the trailing quote, if the name exists + * @returns + */ +function quoteNamePadAfter(cursor, padding, quoteCharBefore, quoteCharAfter) { + return cursor.getName() + ? "".concat(quoteName(cursor)).concat(padding || ", ") + : ""; +} +exports.quoteNamePadAfter = quoteNamePadAfter; +/** + * Provide the name, surrounded by quotes and preceded by the padding if the name exists + * @param cursor The cursor for which to fetch the name + * @param padding String to add before, if the name exists (defaults to ", ") + * @returns The quoted name with leading padding, or empty string if no name exists + */ +function quoteNamePadBefore(cursor, padding) { + return cursor.getName() + ? "".concat(padding || ", ").concat(quoteName(cursor)) + : ""; +} +exports.quoteNamePadBefore = quoteNamePadBefore; +/** + * Provide the name surrounded by quote characters + * @param cursor The cursor for which to fetch the name + * @param quoteCharBefore The string to use as the leading quote (defaults to ") + * @param quoteCharAfter The string to use as the trailing quote (defaults to ") + * @returns The quoted name, or empty string if no name exists + */ +function quoteName(cursor, quoteCharBefore, quoteCharAfter) { + return cursor.getName() + ? "".concat(quoteCharBefore || '"').concat(cursor.getName()).concat(quoteCharAfter || '"') + : ""; +} +exports.quoteName = quoteName; +/** + * Get the role description for an element, using aria-roledescription if present + * Falls back to the provided default role name if aria-roledescription is not specified or empty + * @param cursor The cursor positioned at the element + * @param defaultRole The default role name to use if aria-roledescription is not present + * @returns The role description (either custom or default) + */ +function getRoleDescription(cursor, defaultRole) { + var elem = cursor.getElement(); + if (!elem) + return defaultRole; + var roleDescription = elem.getAttribute("aria-roledescription"); + if (roleDescription && roleDescription.trim().length > 0) { + return roleDescription.trim(); + } + return defaultRole; +} +exports.getRoleDescription = getRoleDescription; +/** + * Generate the screen reader announcement for a link element + * Distinguishes between same-page links (anchors) and regular links + * @param cursor The cursor positioned at the link element + * @param mode The navigation mode (affects announcement order) + * @returns The formatted link announcement string + */ +function getLinkAnnouncement(cursor, mode) { + var href = (cursor.getNode().href) || ""; + var announceStr = ""; + if (href.startsWith(document.location.href) && href.charAt(document.location.href.length) === "#") { + announceStr = "same page link"; + } + else { + announceStr = "link"; + } + var nameInfo = cursor.getNameInfo(); + if (nameInfo && !["content", "text"].includes(nameInfo.nameFrom)) { + if (mode === "tab_focus") { + return "[".concat(quoteNamePadAfter(cursor)).concat(announceStr, "]"); + } + else { + return "[".concat(announceStr).concat(quoteNamePadBefore(cursor), "]"); + } + } + return "[".concat(announceStr, "]"); +} +exports.getLinkAnnouncement = getLinkAnnouncement; +/** + * Get the description text from aria-describedby references + * Resolves all IDs in aria-describedby and concatenates their text content + * @param elem The element with aria-describedby attribute + * @param mode The navigation mode (returns empty string in "item" mode) + * @returns The formatted description text with leading comma and quotes, or empty string + */ +function getDescribedByAnnouncements(elem, mode) { + var describedBy = elem.getAttribute("aria-describedby"); + if (!describedBy) + return ""; + var descriptionElems = describedBy + .split(/\s+/) + .map(function (id) { return document.getElementById(id); }) + .filter(function (descElem) { return !!descElem; }); + var descriptionText = descriptionElems + .map(function (descElem) { var _a; return (_a = descElem.textContent) === null || _a === void 0 ? void 0 : _a.trim(); }) + .filter(function (text) { return !!text; }) + .join(" "); + if (!descriptionText || descriptionText.length === 0) + return ""; + if (mode === "item") + return ", \u0001".concat(descriptionText, "\u0002"); + return ", \"".concat(descriptionText, "\""); +} +/** + * Get state announcements for disabled, readonly, required, and invalid attributes + * @param elem The element to check for state attributes + * @returns A string with state announcements (e.g., ", disabled", ", read only", ", required", ", invalid") + */ +function getStateAnnouncements(elem) { + var states = ""; + // Check for disabled state (both attribute and aria-disabled) + if (elem.hasAttribute("disabled") || elem.getAttribute("aria-disabled") === "true") { + states += ", disabled"; + } + // Check for readonly state (both attribute and aria-readonly) + if (elem.hasAttribute("readonly") || elem.getAttribute("aria-readonly") === "true") { + states += ", read only"; + } + // Check for required state (both attribute and aria-required) + if (elem.hasAttribute("required") || elem.getAttribute("aria-required") === "true") { + states += ", required"; + } + // Check for invalid state (aria-invalid) + if (elem.getAttribute("aria-invalid") === "true") { + states += ", invalid"; + } + return states; +} +/** + * Check if a listitem contains interactive/widget elements + * Screen readers typically don't read the accessible name of a listitem when it contains interactive elements + * Uses DOMWalker to properly traverse shadow DOM and other complex structures + */ +function listitemContainsInteractiveElement(cursor) { + var elem = cursor.getElement(); + if (!elem) + return false; + // Use DOMWalker to traverse the entire subtree including shadow DOM + var walker = new DOMWalker_1.DOMWalker(elem, false, elem, false); + // Walk through all descendants + while (walker.nextNode()) { + // Only check element nodes at start tags + if (walker.node.nodeType === 1 && !walker.bEndTag) { + var role = AriaUtil_1.AriaUtil.getResolvedRole(walker.node); + if (role && ARIADefinitions_1.ARIADefinitions.designPatterns[role] && ARIADefinitions_1.ARIADefinitions.designPatterns[role].roleType === 'widget') { + return true; + } + } + } + return false; +} +/** + * Check if an iframe's content can be accessed (not cross-origin) + * Attempts to access the iframe's document to determine if it's accessible + * @param iframe The iframe element to check + * @returns true if the iframe content is accessible, false if cross-origin or blocked + */ +function canAccessFrame(iframe) { + try { + // This throws a DOMException for cross-origin frames + var doc = iframe.contentDocument || iframe.contentWindow.document; + return doc !== null; + } + catch (e) { + return false; + // if (e instanceof DOMException && e.name === 'SecurityError') { + // return false; // Cross-origin, access blocked + // } + // throw e; // Re-throw unexpected errors + } +} +exports.RULES = [ + // Single role rules - alphabetically sorted + // Button role + new SRRendererRule_1.SRRendererRule({ + roles: ["button"], + elems: [], + modes: ["item", "button", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (!cursor.isStartTag()) + return null; + var elem = cursor.getNode(); + var roleDesc = getRoleDescription(cursor, "button"); + if (elem.getAttribute("aria-pressed") === "true") { + return "[toggle ".concat(roleDesc, ", pressed").concat(quoteNamePadBefore(cursor)).concat(getDescribedByAnnouncements(elem, mode), "]"); + } + return null; + }, + function (cursor, _oldCursor, mode) { + if (!cursor.isStartTag()) + return null; + var elem = cursor.getNode(); + var roleDesc = getRoleDescription(cursor, "button"); + if (elem.getAttribute("aria-pressed") === "false") { + return "[toggle ".concat(roleDesc, ", not pressed").concat(quoteNamePadBefore(cursor)).concat(getDescribedByAnnouncements(elem, mode), "]"); + } + return null; + }, + function (cursor, _oldCursor, mode) { + if (cursor.isEndTag()) + return undefined; + var expandStr = ""; + var elem = cursor.getElement(); + var roleDesc = getRoleDescription(cursor, "button"); + if (["menu", "true"].includes(elem.getAttribute("aria-haspopup"))) { + expandStr += ", menu"; + } + if (elem.hasAttribute("aria-expanded")) { + expandStr += ", ".concat(elem.getAttribute("aria-expanded") === "true" ? "expanded" : "collapsed"); + } + expandStr += getStateAnnouncements(elem); + return "[".concat(quoteNamePadAfter(cursor)).concat(roleDesc).concat(expandStr).concat(getDescribedByAnnouncements(elem, mode), "]"); + }, + function (cursor) { if (cursor.isEndTag()) + return ""; } + ] + }), + // Checkbox role + new SRRendererRule_1.SRRendererRule({ + roles: ["checkbox"], + elems: [], + modes: ["item", "checkbox", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (cursor.isStartTag()) { + var elem = cursor.getNode(); + var roleDesc = getRoleDescription(cursor, "checkbox"); + var stateStr = ""; + if (elem.getAttribute("aria-checked") === "mixed") { + stateStr = "half checked"; + } + else { + var bChecked = false; + if (elem.hasAttribute("aria-checked")) { + bChecked = elem.getAttribute("aria-checked") === "true"; + } + else { + bChecked = elem.checked; + } + stateStr = bChecked ? "checked" : "not checked"; + } + stateStr += getStateAnnouncements(cursor.getElement()); + return "[".concat(roleDesc, ", ").concat(stateStr).concat(quoteNamePadBefore(cursor)).concat(getDescribedByAnnouncements(cursor.getElement(), mode), "]"); + } + else { + return ""; + } + } + ] + }), + // Cell, Columnheader, and Rowheader roles + new SRRendererRule_1.SRRendererRule({ + roles: ["cell", "columnheader", "rowheader"], + elems: [], + modes: ["item", "table"], + tests: [ + function (cursor) { + var _a; + if (!cursor.isStartTag()) + return null; + // Get the cell element + var cellElem = cursor.getElement(); + if (!cellElem) + return null; + // Check if the cell has any visible content by checking: + // 1. Text content (trimmed) + // 2. Child elements with roles (buttons, links, etc.) + // 3. Images with alt text + var textContent = ((_a = cellElem.textContent) === null || _a === void 0 ? void 0 : _a.trim()) || ""; + // Check for child elements with interactive roles or content + var walker = new DOMWalker_1.DOMWalker(cellElem, false, cellElem, false); + var hasContent = textContent.length > 0; + if (!hasContent) { + // Check for elements that would have content (buttons, links, images, etc.) + while (walker.nextNode()) { + if (walker.node.nodeType === 1 && !walker.bEndTag) { + var elem = walker.node; + var role = AriaUtil_1.AriaUtil.getResolvedRole(elem); + // Check for interactive elements or elements with accessible names + if (role && ARIADefinitions_1.ARIADefinitions.designPatterns[role]) { + hasContent = true; + break; + } + // Check for images with alt text + if (elem.nodeName.toUpperCase() === "IMG" && elem.hasAttribute("alt")) { + hasContent = true; + break; + } + } + } + } + // If the cell is empty, return "[blank]" + if (!hasContent) { + return "[blank]"; + } + // Otherwise, return null to let default rendering continue + return null; + } + ] + }), + // Combobox role + new SRRendererRule_1.SRRendererRule({ + roles: ["combobox"], + elems: [], + modes: ["item", "combo", "tab_focus"], + tests: [ + function (cursor) { + if (cursor.isEndTag()) + return ""; + var roleDesc = getRoleDescription(cursor, "combo box"); + var elem = cursor.getElement(); + var state = ""; + if (cursor.getNode().nodeName.toUpperCase() === "SELECT") { + state = ", collapsed"; + var selectElem = cursor.getElement(); + var valueElem = selectElem.selectedIndex >= 0 ? selectElem.options[selectElem.selectedIndex] : null; + var valueStr = ""; + if (valueElem) { + var temp = new SRCursor_1.SRCursor(valueElem, false); + valueStr = quoteNamePadBefore(temp, ", "); + } + state += getStateAnnouncements(elem); + return "[".concat(quoteNamePadAfter(cursor)).concat(roleDesc).concat(state).concat(valueStr, "]"); + } + else if (cursor.getNode().nodeName.toUpperCase() === "INPUT" && !cursor.getElement().hasAttribute("role")) { + state = getStateAnnouncements(elem); + return "[".concat(quoteNamePadAfter(cursor)).concat(roleDesc, ", has auto complete, editable, opens list").concat(state, "]"); + } + else { + if (elem.hasAttribute("aria-expanded")) { + state = ", ".concat(elem.getAttribute("aria-expanded") === "true" ? "expanded" : "collapsed"); + if (elem.hasAttribute("aria-autocomplete")) { + state += ", has auto complete"; + } + state += ", editable, opens list"; + } + state += getStateAnnouncements(elem); + return "[".concat(quoteNamePadAfter(cursor)).concat(roleDesc).concat(state, "]"); + } + } + ] + }), + // Default role (fallback) + new SRRendererRule_1.SRRendererRule({ + roles: ["default"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var _a; + return cursor.isStartTag() ? + "!!<".concat(cursor.getRole(), ">").concat((((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) + ""), "!!") : + "!!</".concat(cursor.getRole(), ">!!"); + } + ] + }), + // Deletion role + new SRRendererRule_1.SRRendererRule({ + roles: ["deletion"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { return (cursor.isStartTag() && "[deleted]" || ""); } + ] + }), + // Dialog role + new SRRendererRule_1.SRRendererRule({ + roles: ["dialog"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + return cursor.isEndTag() ? "[End of dialog]" : "[Start of dialog".concat(quoteNamePadBefore(cursor)); + } + ] + }), + // Document role + new SRRendererRule_1.SRRendererRule({ + roles: ["document", "generic"], + elems: [], + modes: ["item"], + tests: [ + function () { return ""; } + ] + }), + // Graphics document role + new SRRendererRule_1.SRRendererRule({ + roles: ["graphics-document"], + elems: [], + modes: ["item", "image"], + tests: [ + function (cursor) { + var _a, _b; + if (cursor.isStartTag() && !((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) && ((_b = cursor.getNameInfo()) === null || _b === void 0 ? void 0 : _b.name) !== "") { + // Don't announce unlabeled graphics that are hidden inside links or headings + var parentHeadingOrLink = cursor.getCurrentOrParentByRoleClone(["heading", "link"]); + if (parentHeadingOrLink && VisUtil_1.VisUtil.isNodeHiddenFromAT(cursor.getElement())) { + return ""; + } + return "[Unlabeled graphic]"; + } + return null; + }, + function (cursor) { var _a; return (cursor.isStartTag() && (((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) === "")) ? "" : null; }, + function (cursor) { var _a; return (cursor.isStartTag() && ((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) && "[graphic".concat(quoteNamePadBefore(cursor), "]")) || null; }, + function (cursor) { return (cursor.isEndTag()) ? "" : null; } + ] + }), + // Heading role + new SRRendererRule_1.SRRendererRule({ + roles: ["heading"], + elems: [], + modes: ["item", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (mode === "tab_focus" && cursor.isStartTag()) + return ""; + if (mode === "item" && cursor.isEndTag()) + return ""; + var level; + var node = cursor.getElement(); + if (node.ariaLevel) { + // Explicit aria-level attribute + level = node.ariaLevel; + } + else if (node.getAttribute('role') === 'heading') { + // role="heading" without aria-level defaults to 2 + level = '2'; + } + else { + // Native heading element (h1-h6), extract number from tag name + level = node.nodeName.substring(1); + } + var nameInfo = cursor.getNameInfo(); + if ((!nameInfo || ["content", "text"].includes(nameInfo.nameFrom)) && !(node.textContent || "").trim()) { + return ""; + } + if (nameInfo && !["content", "text"].includes(nameInfo.nameFrom)) { + return "[heading level ".concat(level).concat(quoteNamePadBefore(cursor), "]"); + } + else { + return "[heading level ".concat(level, "]"); + } + } + ] + }), + // -- in heading mode + new SRRendererRule_1.SRRendererRule({ + roles: ["heading"], + elems: [], + modes: ["heading", "h1", "h2", "h3", "h4", "h5", "h6"], + tests: [ + function (cursor) { + if (cursor.isStartTag()) { + var node = cursor.getNode(); + var level = void 0; + if (node.ariaLevel) { + // Explicit aria-level attribute + level = node.ariaLevel; + } + else if (node.getAttribute('role') === 'heading') { + // role="heading" without aria-level defaults to 2 + level = '2'; + } + else { + // Native heading element (h1-h6), extract number from tag name + level = node.nodeName.substring(1); + } + var nameInfo = cursor.getNameInfo(); + if ((!nameInfo || ["content", "text"].includes(nameInfo.nameFrom)) && !(node.textContent || "").trim()) { + return ""; + } + return "[".concat(quoteNamePadAfter(cursor), "heading level ").concat(level, "]"); + } + return ""; + } + ] + }), + // Image role + new SRRendererRule_1.SRRendererRule({ + roles: ["img"], + elems: [], + modes: ["item", "image"], + tests: [ + function (cursor) { + var _a, _b, _c; + if (cursor.isEndTag()) { + return ""; + } + else { + if (!((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) && ((_b = cursor.getNameInfo()) === null || _b === void 0 ? void 0 : _b.name) !== "") { + // Don't announce unlabeled graphics that are hidden inside links or headings + // (these were only included because of the SKIP_ITEM_BEHAVIOR change) + var parentHeadingOrLink = cursor.getCurrentOrParentByRoleClone(["heading", "link"]); + if (parentHeadingOrLink && VisUtil_1.VisUtil.isNodeHiddenFromAT(cursor.getElement())) { + return ""; + } + return "[Unlabeled graphic]"; + } + else if (((_c = cursor.getNameInfo()) === null || _c === void 0 ? void 0 : _c.name) === "") { + return ""; + } + else { + return "[graphic".concat(quoteNamePadBefore(cursor), "]"); + } + } + } + ] + }), + // Insertion role + new SRRendererRule_1.SRRendererRule({ + roles: ["insertion"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { return (cursor.isStartTag() && "[inserted]" || ""); } + ] + }), + // Link role + new SRRendererRule_1.SRRendererRule({ + roles: ["link"], + elems: [], + modes: ["item", "region", "link", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + var _a; + if (cursor.isStartTag() && !["content", "text"].includes((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.nameFrom)) { + return getLinkAnnouncement(cursor, mode); + } + return null; + } + ] + }), + // Listitem role + new SRRendererRule_1.SRRendererRule({ + roles: ["listitem"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var _a; + var isOrdered; + var parentListElem; + var walkParents = DOMWalker_1.DOMWalker.parentNode(cursor.getNode()); + while (typeof isOrdered === "undefined" && walkParents) { + if (walkParents.nodeType === 1) { + var elem = walkParents; + if (elem.hasAttribute("role")) { + if (elem.getAttribute("role") === "list") { + isOrdered = false; + parentListElem = elem; + } + } + else if (elem.nodeName.toUpperCase() === "UL") { + isOrdered = false; + parentListElem = elem; + } + else if (elem.nodeName.toUpperCase() === "OL") { + isOrdered = true; + parentListElem = elem; + } + } + walkParents = DOMWalker_1.DOMWalker.parentNode(walkParents); + } + // Check if listitem contains interactive elements + // Screen readers don't read the accessible name when interactive elements are present + var hasInteractiveContent = listitemContainsInteractiveElement(cursor); + var nameToUse = hasInteractiveContent ? "" : (((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) || ""); + var retStr = ""; + if (!isOrdered) { + var elem = cursor.getElement(); + if ((elem.nodeName.toUpperCase() === "LI" && window.getComputedStyle(elem).listStyleType === "none") + || elem.nodeName.toUpperCase() !== "LI") { + retStr = cursor.isStartTag() ? "".concat(nameToUse) : ""; + } + else { + retStr = cursor.isStartTag() ? "[bullet] ".concat(nameToUse) : ""; + } + } + else { + // For ordered lists, count sibling listitems and account for start attribute + var count = 1; // Start at 1 by default + // Get the start attribute if it exists on the <ol> element + if (parentListElem && parentListElem.nodeName.toUpperCase() === 'OL' && + parentListElem.hasAttribute('start')) { + var startValue = parseInt(parentListElem.getAttribute('start') || '1', 10); + count = isNaN(startValue) ? 1 : startValue; + } + // Count previous sibling listitems at the same level using DOMWalker + var currentElem = cursor.getElement(); + var sibling = DOMWalker_1.DOMWalker.previousSiblingNotOwnedBySlot(currentElem); + while (sibling) { + // Only count direct siblings that are listitems (element nodes only) + if (sibling.nodeType === 1) { + var siblingElem = sibling; + if (siblingElem.getAttribute('role') === 'listitem' || + siblingElem.nodeName.toUpperCase() === 'LI') { + count++; + } + } + sibling = DOMWalker_1.DOMWalker.previousSiblingNotOwnedBySlot(sibling); + } + retStr = cursor.isStartTag() ? "".concat(count, ". ").concat(nameToUse) : ""; + } + return retStr; + } + ] + }), + // Math role + new SRRendererRule_1.SRRendererRule({ + roles: ["math"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { return cursor.isEndTag() ? "[math content]" : ""; } + ] + }), + // Link role + new SRRendererRule_1.SRRendererRule({ + roles: ["menuitem"], + elems: [], + modes: ["item", "tab_focus", "region"], + tests: [ + function (cursor) { + var retVal = ""; + if (cursor.isStartTag()) { + // let isSubMenuContainer = false; + // for (let checkChildren=cursor.getNode().firstChild; !isSubMenuContainer && checkChildren !== null; checkChildren = checkChildren.nextSibling) { + // isSubMenuContainer = checkChildren.nodeName.toUpperCase() === "UL"; + // } + // if (isSubMenuContainer) return "[????menu]"; + var expandStr = ""; + var elem = cursor.getElement(); + if (elem.getAttribute("aria-haspopup") === "true") { + expandStr += ", sub-menu"; + } + if (elem.hasAttribute("aria-expanded")) { + expandStr += ", ".concat(elem.getAttribute("aria-expanded") === "true" ? "expanded" : "collapsed"); + } + retVal = "[menu".concat(expandStr); + var nameInfo = cursor.getNameInfo(); + if (nameInfo && !["content", "text"].includes(nameInfo.nameFrom)) { + retVal += quoteNamePadBefore(cursor); + } + retVal += "]"; + } + return retVal; + } + ] + }), + // Meter role + new SRRendererRule_1.SRRendererRule({ + roles: ["meter"], + elems: [], + modes: ["item", "tab_focus"], + tests: [ + function (cursor) { return cursor.isStartTag() ? "[progress bar, ".concat((cursor.getNode().value), "]") : ""; } + ] + }), + // Progressbar role + new SRRendererRule_1.SRRendererRule({ + roles: ["progressbar"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { return cursor.isStartTag() ? "[progress bar, ".concat((cursor.getNode().value), "]") : ""; } + ] + }), + // Radio role + new SRRendererRule_1.SRRendererRule({ + roles: ["radio"], + elems: [], + modes: ["item", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (cursor.isStartTag()) { + var roleDesc = getRoleDescription(cursor, "radio button"); + var bChecked = false; + if (cursor.getElement().hasAttribute("aria-checked")) { + bChecked = cursor.getElement().getAttribute("aria-checked") === "true"; + } + else { + bChecked = cursor.getNode().checked; + } + var stateStr = getStateAnnouncements(cursor.getElement()); + return "[".concat(roleDesc, ", ").concat(bChecked ? "checked" : "not checked").concat(stateStr).concat(quoteNamePadBefore(cursor)).concat(getDescribedByAnnouncements(cursor.getElement(), mode), "]"); + } + else { + return ""; + } + } + ] + }), + // Searchbox role + new SRRendererRule_1.SRRendererRule({ + roles: ["searchbox"], + elems: [], + modes: ["item", "tab_focus"], + tests: [ + function (cursor) { return cursor.isStartTag() ? "[".concat(quoteNamePadAfter(cursor), "edit]") : ""; } + ] + }), + // Separator role + new SRRendererRule_1.SRRendererRule({ + roles: ["separator"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { return (cursor.isStartTag() && "[separator]" || ""); } + ] + }), + // Slider role + new SRRendererRule_1.SRRendererRule({ + roles: ["slider"], + elems: [], + modes: ["item", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (!cursor.isStartTag()) + return ""; + var roleDesc = getRoleDescription(cursor, "slider"); + var elem = cursor.getElement(); + // Check for aria-valuenow first, then fall back to native value property + var value = elem.hasAttribute("aria-valuenow") + ? elem.getAttribute("aria-valuenow") + : cursor.getNode().value; + return "[".concat(quoteNamePadAfter(cursor)).concat(roleDesc, ", ").concat(value).concat(getDescribedByAnnouncements(cursor.getElement(), mode), "]"); + } + ] + }), + // Spinbutton role + new SRRendererRule_1.SRRendererRule({ + roles: ["spinbutton"], + elems: [], + modes: ["item", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (!cursor.isStartTag()) + return ""; + var roleDesc = getRoleDescription(cursor, "spinbutton"); + return "[".concat(quoteNamePadAfter(cursor)).concat(roleDesc, ", editable").concat(getDescribedByAnnouncements(cursor.getElement(), mode), "]"); + } + ] + }), + // Tab role + new SRRendererRule_1.SRRendererRule({ + roles: ["tab"], + elems: [], + modes: ["item", "tab_focus"], + tests: [ + function (cursor) { + if (!cursor.isStartTag()) + return ""; + var roleDesc = getRoleDescription(cursor, "tab"); + return "[".concat(roleDesc).concat(cursor.getNode().getAttribute("aria-selected") === "true" ? ", selected" : "").concat(quoteNamePadBefore(cursor), "]"); + } + ] + }), + // Tablist role + new SRRendererRule_1.SRRendererRule({ + roles: ["tablist"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + if (cursor.getNameInfo() === null) + return null; + if (cursor.isStartTag()) { + return "[group start".concat(quoteNamePadBefore(cursor), "]"); + } + else { + return "[group end".concat(quoteNamePadBefore(cursor), "]"); + } + } + ] + }), + // Tabpanel role + new SRRendererRule_1.SRRendererRule({ + roles: ["tabpanel"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + if (cursor.getNameInfo() === null) + return null; + if (cursor.isStartTag()) { + return "[Tab panel start".concat(quoteNamePadBefore(cursor), "]"); + } + else { + return "[Tab panel end".concat(quoteNamePadBefore(cursor), "]"); + } + } + ] + }), + // Text role + new SRRendererRule_1.SRRendererRule({ + roles: ["text"], + elems: [], + modes: ["item", "link", "tab_focus", "region"], + tests: [ + function (cursor) { + var _a, _b, _c, _d; + if (cursor.isEndTag() || !((_a = cursor.getParentElement()) === null || _a === void 0 ? void 0 : _a.getElement())) + return null; + var elem = (_b = cursor.getParentElement()) === null || _b === void 0 ? void 0 : _b.getElement(); + if (elem.ownerDocument.defaultView.getComputedStyle(elem).textDecorationLine === "line-through") { + return "[strikethrough] ".concat((((_c = cursor.getNameInfo()) === null || _c === void 0 ? void 0 : _c.name) + ""), " [end strikethrough]"); + } + return "".concat((((_d = cursor.getNameInfo()) === null || _d === void 0 ? void 0 : _d.name) + "")); + } + ] + }), + // -- in heading mode + new SRRendererRule_1.SRRendererRule({ + roles: ["text"], + elems: [], + modes: ["heading"], + tests: [ + function (cursor) { return ""; } + ] + }), + // Textbox role + new SRRendererRule_1.SRRendererRule({ + roles: ["textbox"], + elems: [], + modes: ["item", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + var _a; + var elem = cursor.getElement(); + if (cursor.isEndTag()) { + return mode === "item" && elem.nodeName.toUpperCase() === "TEXTAREA" ? "[out of edit]" : ""; + } + if (!cursor.isStartTag()) { + return ""; + } + var attributes = ""; + if (elem.hasAttribute("placeholder") && elem.getAttribute("placeholder").trim().length > 0) { + attributes += ", placeholder: ".concat(elem.getAttribute("placeholder")); + } + attributes += getStateAnnouncements(elem); + var isMultiline = elem.nodeName.toUpperCase() === "TEXTAREA" || elem.getAttribute("aria-multiline") === "true"; + var describedBy = getDescribedByAnnouncements(elem, mode); + if (isMultiline) { + var textContent = mode === "tab_focus" ? (_a = elem.textContent) === null || _a === void 0 ? void 0 : _a.trim() : ""; + var contentSuffix = textContent ? " ".concat(textContent) : ""; + return "[".concat(quoteNamePadAfter(cursor), "edit, multiline").concat(attributes).concat(describedBy, "]").concat(contentSuffix); + } + return "[".concat(quoteNamePadAfter(cursor), "edit").concat(attributes).concat(describedBy, "]"); + } + ] + }), + // Treeitem role + new SRRendererRule_1.SRRendererRule({ + roles: ["treeitem"], + elems: [], + modes: ["item", "tab_focus"], + tests: [ + function (cursor) { + if (cursor.isEndTag()) + return ""; + var elem = cursor.getElement(); + // Build the announcement string without the name (let content render separately) + var announcement = "[treeview item"; + // Add selected state if present + if (elem.getAttribute("aria-selected") === "true") { + announcement += ", selected"; + } + // Add expanded/collapsed state if present + if (elem.hasAttribute("aria-expanded")) { + announcement += elem.getAttribute("aria-expanded") === "true" ? ", expanded" : ", collapsed"; + } + // Add level if explicitly set or calculate from nesting + var level = elem.getAttribute("aria-level"); + if (level) { + announcement += ", level ".concat(level); + } + else { + // Calculate level by counting parent treeitems or groups using DOMWalker for shadow DOM support + var calculatedLevel = 1; + var parent_1 = DOMWalker_1.DOMWalker.parentElement(elem); + while (parent_1) { + var parentRole = AriaUtil_1.AriaUtil.getResolvedRole(parent_1); + if (parentRole === "group" || parentRole === "tree") { + // Check if this group is inside a treeitem + var groupParent = DOMWalker_1.DOMWalker.parentElement(parent_1); + while (groupParent) { + var groupParentRole = AriaUtil_1.AriaUtil.getResolvedRole(groupParent); + if (groupParentRole === "treeitem") { + calculatedLevel++; + break; + } + else if (groupParentRole === "tree") { + break; + } + groupParent = DOMWalker_1.DOMWalker.parentElement(groupParent); + } + } + parent_1 = DOMWalker_1.DOMWalker.parentElement(parent_1); + } + if (calculatedLevel > 1) { + announcement += ", level ".concat(calculatedLevel); + } + } + // Add position information (aria-posinset/aria-setsize or calculate) + var position = elem.getAttribute("aria-posinset"); + var setSize = elem.getAttribute("aria-setsize"); + if (!position || !setSize) { + // Calculate position by counting siblings with same role using DOMWalker for shadow DOM support + var pos = 0; + var total = 0; + var parent_2 = DOMWalker_1.DOMWalker.parentElement(elem); + if (parent_2) { + // Iterate through children to count treeitems + var child = DOMWalker_1.DOMWalker.firstChildNotOwnedBySlot(parent_2); + while (child) { + if (child.nodeType === 1) { // Element node + var childElem = child; + if (AriaUtil_1.AriaUtil.getResolvedRole(childElem) === "treeitem") { + total++; + if (childElem === elem) { + pos = total; + } + } + } + child = child.nextSibling; + } + } + position = pos.toString(); + setSize = total.toString(); + } + announcement += ", ".concat(position, " of ").concat(setSize, "] "); + return announcement; + } + ] + }), + // HTML Element rules + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["BODY"], + modes: ["item", "tab_focus"], + tests: [ + function (cursor) { + var titleStr = cursor.getNode().ownerDocument.title; + return cursor.isEndTag() ? "[End of document".concat(titleStr.trim().length > 0 ? ": " + titleStr.trim() : "", "]") : "[Start of document".concat(titleStr.trim().length > 0 ? ": " + titleStr.trim() : "", "]"); + } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["IFRAME"], + modes: ["item", "tab_focus"], + tests: [ + function (cursor) { + var accessWarning = canAccessFrame(cursor.getNode()) ? "" : "{Emulator unable to access frame}"; + return cursor.isEndTag() ? "" : accessWarning; + } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["BR"], + modes: ["item"], + tests: [ + function (cursor) { + try { + var walk = cursor.clone(); + // Walk until we hit the beginning of the page, find another BR, or find something with a name + while (walk.previous(function () { return true; }) && walk.getNode().nodeName.toUpperCase() !== "BR" && walk.getNameInfo() && walk.getNameInfo().name.trim().length === 0) + ; + return walk.getNode().nodeName.toUpperCase() === "BR" ? "[blank]" : null; + } + catch (err) { + console.error(err); + } + } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["DL"], + modes: ["item"], + tests: [ + function (cursor) { return ""; } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["INPUT"], + modes: ["item", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { var _a; return (cursor.isStartTag() && ((_a = cursor.getElement()) === null || _a === void 0 ? void 0 : _a.getAttribute("type")) === "password" && "[".concat(quoteNamePadAfter(cursor), "edit, protected").concat(getDescribedByAnnouncements(cursor.getElement(), mode), "]")) || null; }, + function (cursor, _oldCursor, mode) { + var _a, _b; + if (cursor.isStartTag() && ((_a = cursor.getElement()) === null || _a === void 0 ? void 0 : _a.getAttribute("type")) === "file") { + var value = ((_b = cursor.getElement()) === null || _b === void 0 ? void 0 : _b.value) || ""; + value = value === "" ? "No file chosen" : value.substring("C:\\fakepath\\".length); + return "[".concat(quoteNamePadAfter(cursor), "button").concat(getDescribedByAnnouncements(cursor.getElement(), mode), "] [").concat(quoteNamePadAfter(cursor)).concat(value, "]"); + } + return null; + }, + function (cursor, _oldCursor, mode) { + var _a; + if (cursor.isStartTag() && ((_a = cursor.getElement()) === null || _a === void 0 ? void 0 : _a.getAttribute("type")) === "color") { + var val = cursor.getElement().value; + var r = (Number("0x".concat(val.substring(1, 3))) * 100.0 / Number("0xff")).toFixed(0); + var g = (Number("0x".concat(val.substring(3, 5))) * 100.0 / Number("0xff")).toFixed(0); + var b = (Number("0x".concat(val.substring(5))) * 100.0 / Number("0xff")).toFixed(0); + return "[".concat(quoteNamePadAfter(cursor), "clickable").concat(getDescribedByAnnouncements(cursor.getElement(), mode), "] [").concat(r, "% red ").concat(g, "% green ").concat(b, "% blue]"); + } + return null; + }, + function (cursor, _oldCursor, mode) { + var _a; + if (cursor.isStartTag() && ((_a = cursor.getElement()) === null || _a === void 0 ? void 0 : _a.getAttribute("type")) === "month") { + var val = cursor.getElement().value; + var y = "0"; + var m = "0"; + if (val.trim().length > 0) { + var date = new Date(val); + y = "" + date.getFullYear(); + m = "" + (date.getMonth() + 1); + } + return "[".concat(quoteNamePadAfter(cursor), "clickable").concat(getDescribedByAnnouncements(cursor.getElement(), mode), "] [spin button, ").concat(m, "] [spin button, ").concat(y, "] [menu button] [subMenu] Show month picker"); + } + return null; + }, + function (cursor, _oldCursor, mode) { + var _a; + if (cursor.isStartTag() && ((_a = cursor.getElement()) === null || _a === void 0 ? void 0 : _a.getAttribute("type")) === "date") { + var val = cursor.getElement().value; + var y = "0"; + var m = "0"; + var day = "0"; + if (val.trim().length > 0) { + var date = new Date(val); + y = "" + date.getFullYear(); + m = "" + (date.getMonth() + 1); + day = "" + (date.getDate()); + } + return "[".concat(quoteNamePadAfter(cursor), "clickable").concat(getDescribedByAnnouncements(cursor.getElement(), mode), "] [spin button, ").concat(m, "] / [spin button, ").concat(day, "] / [spin button, ").concat(y, "] [menu button] [subMenu] Show date picker"); + } + return null; + }, + function (cursor, _oldCursor, mode) { + var _a; + if (cursor.isStartTag() && ((_a = cursor.getElement()) === null || _a === void 0 ? void 0 : _a.getAttribute("type")) === "datetime-local") { + var val = cursor.getElement().value; // 2025-09-12T04:20 + var y = "0"; + var m = "0"; + var day = "0"; + var hour = "0"; + var min = "0"; + var ampm = "0"; + if (val.trim().length > 0) { + var date = new Date(val); + y = "" + date.getFullYear(); + m = "" + (date.getMonth() + 1); + day = "" + (date.getDate()); + if (date.getHours() === 0 || date.getHours() === 12) { + hour = "12"; + } + else if (date.getHours() < 12) { + hour = "" + date.getHours(); + } + else { + hour = "" + (date.getHours() - 12); + } + min = "" + date.getMinutes(); + ampm = date.getHours() >= 12 ? "pm" : "am"; + } + return "[".concat(quoteNamePadAfter(cursor), "clickable").concat(getDescribedByAnnouncements(cursor.getElement(), mode), "] [spin button, ").concat(m, "] / [spin button, ").concat(day, "] / [spin button, ").concat(y, "] [spin button, ").concat(hour, "] : [spin button, ").concat(min, "] [spin button, ").concat(ampm, "] [menu button] [subMenu] Show local date and time picker"); + } + return null; + }, + function (cursor, _oldCursor, mode) { + var _a; + if (cursor.isStartTag() && ((_a = cursor.getElement()) === null || _a === void 0 ? void 0 : _a.getAttribute("type")) === "time") { + var val = cursor.getElement().value; // 2025-09-12T04:20 + var hour = "0"; + var min = "0"; + var ampm = "0"; + if (val.trim().length > 0) { + var date = val.split(":"); + var hours = parseInt(date[0]); + if (hours === 0 || hours === 12) { + hour = "12"; + } + else if (hours < 12) { + hour = "" + hours; + } + else { + hour = "" + (hours - 12); + } + min = date[1]; + ampm = hours >= 12 ? "pm" : "am"; + } + return "[".concat(quoteNamePadAfter(cursor), "grouping clickable").concat(getDescribedByAnnouncements(cursor.getElement(), mode), " [spin button, ").concat(hour, "] : [spin button, ").concat(min, "] [spin button, ").concat(ampm, "] [menu button] [subMenu] Show time picker [out of grouping]"); + } + return null; + }, + function (cursor, _oldCursor, mode) { + var _a; + if (cursor.isStartTag() && ((_a = cursor.getElement()) === null || _a === void 0 ? void 0 : _a.getAttribute("type")) === "week") { + var val = cursor.getElement().value; // 2025-W38 + var year = "0"; + var week = "0"; + if (val.trim().length > 0) { + var date = val.split(/-W/); + year = date[0]; + week = date[1]; + } + return "[".concat(quoteNamePadAfter(cursor), "clickable").concat(getDescribedByAnnouncements(cursor.getElement(), mode), "] [spin button, ").concat(week, "], [spin button, ").concat(year, "] [menu button] [subMenu] Show week picker"); + } + return null; + }, + function (cursor) { var _a; return ((_a = cursor.getElement()) === null || _a === void 0 ? void 0 : _a.getAttribute("type")) === "hidden" ? "" : null; }, + function (cursor) { return (cursor.isStartTag() && "!![".concat(quoteNamePadAfter(cursor), "input!!]").concat(cursor.getElement().outerHTML)) || null; } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["LI"], + modes: ["item"], + tests: [ + function (cursor) { + var _a; + // Check if listitem contains interactive elements + // Screen readers don't read the accessible name when interactive elements are present + var hasInteractiveContent = listitemContainsInteractiveElement(cursor); + var nameToUse = hasInteractiveContent ? "" : (((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) || ""); + var elem = cursor.getElement(); + if (window.getComputedStyle(elem).listStyleType === "none") { + return cursor.isStartTag() ? "".concat(nameToUse) : ""; + } + else { + return cursor.isStartTag() ? "[bullet] ".concat(nameToUse) : ""; + } + } + ] + }), + // MathML elements + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["MFRAC"], + modes: ["item"], + tests: [ + function (cursor) { return cursor.isStartTag() ? "[fraction]" : "[end fraction]"; } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["MROW"], + modes: ["item"], + tests: [ + function (cursor) { + var _a; + // Only announce over on the end tag + if (cursor.isStartTag()) + return undefined; + var fraction = cursor.getCurrentOrParentByRoleClone([], ["mfrac"]); + if (fraction && ((_a = fraction.getElement().querySelectorAll("mrow")[0]) === null || _a === void 0 ? void 0 : _a.isSameNode(cursor.getNode()))) { + return "[over]"; + } + } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["MSQRT"], + modes: ["item"], + tests: [ + function (cursor) { return cursor.isStartTag() ? "[square root]" : "[end root]"; } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["MSUP"], + modes: ["item"], + tests: [ + function (cursor) { + var _a, _b; + if (cursor.isEndTag()) + return undefined; + var mi = ((_a = cursor.getElement().querySelector("mi")) === null || _a === void 0 ? void 0 : _a.innerHTML) || ""; + var mn = ((_b = cursor.getElement().querySelector("mn")) === null || _b === void 0 ? void 0 : _b.innerHTML) || ""; + if (mn === "2") + return "".concat(mi, " [squared]"); + if (mn === "3") + return "".concat(mi, " [cubed]"); + return "".concat(mi, " [to the ").concat(mn, "]"); + } + ] + }), + // Multiple roles rules - placed at the bottom + // Default mode rules - Container elements (multiple roles) + new SRRendererRule_1.SRRendererRule({ + roles: ["article", "banner", "blockquote", "caption", "cell", "code", "columnheader", + "complementary", "contentinfo", "figure", "form", "group", "list", "main", + "mark", "navigation", "region", "row", "rowheader", "search", "table", "toolbar"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { return ""; } + ] + }), + // Default mode rules - Elements that screen readers typically ignore (multiple roles) + new SRRendererRule_1.SRRendererRule({ + roles: ["paragraph", "rowgroup", "status", "strong", "subscript", "superscript", + "term", "time", "none", "presentation"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { return ""; } + ] + }), +]; + + +/***/ }, + +/***/ 8485 +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.RULES = void 0; +var SRRendererRule_1 = __webpack_require__(328); +var SRTableUtil_1 = __webpack_require__(369); +var common_1 = __webpack_require__(7242); +var AriaUtil_1 = __webpack_require__(7011); +var ARIADefinitions_1 = __webpack_require__(9910); +var CommonUtil_1 = __webpack_require__(7139); +/** + * Generates the announcement text when entering a table cell + */ +function renderEnterTableCell(newCursor, oldCursor) { + var _a; + // We seem to be at the newline text node after the cell + if (oldCursor && ((_a = oldCursor.getNode()) === null || _a === void 0 ? void 0 : _a.nodeName) === "#text") { + oldCursor = oldCursor.clone(); + oldCursor.previous(function () { return true; }); + } + var newTableModel = SRTableUtil_1.SRTableUtil.getTableModel(newCursor); + var oldCellInfo = SRTableUtil_1.SRTableUtil.getCellModel(oldCursor, newTableModel); + var newCellInfo = SRTableUtil_1.SRTableUtil.getCellModel(newCursor, newTableModel); + if (!newCellInfo) + return ""; + var retVal = []; + // Announce row information if we've moved to a different row or the rowspan has changed + if (!oldCellInfo || oldCellInfo.rowIndexStart !== newCellInfo.rowIndexStart || oldCellInfo.rowspan !== newCellInfo.rowspan) { + // If a change in row or a change in rowSpan + var rowHeaders = SRTableUtil_1.SRTableUtil.getRowHeadersForCursor(newCursor, newTableModel); + var headerInfoStr = rowHeaders && rowHeaders.trim().length > 0 ? "\"".concat(rowHeaders, "\", ") : ""; + retVal.push("[".concat(headerInfoStr, "row ").concat((newCellInfo.rowIndexStart + 1)).concat(newCellInfo.rowspan > 1 ? " through " + (newCellInfo.rowIndexStart + newCellInfo.rowspan) : "", "]")); + } + // Announce column information if we've moved to a different column or the colspan has changed + if (!oldCellInfo || oldCellInfo.colIndexStart !== newCellInfo.colIndexStart || oldCellInfo.colspan !== newCellInfo.colspan) { + // If a change in column or a change in colspan + var columnHeaders = SRTableUtil_1.SRTableUtil.getColumnHeadersForCursor(newCursor, newTableModel); + var headerInfoStr = columnHeaders && columnHeaders.trim().length > 0 ? "\"".concat(columnHeaders, "\", ") : ""; + retVal.push("[".concat(headerInfoStr, "column ").concat((newCellInfo.colIndexStart + 1)).concat(newCellInfo.colspan > 1 ? " through " + (newCellInfo.colIndexStart + newCellInfo.colspan) : "", "]")); + } + return retVal.join(" "); +} +exports.RULES = [ + // Single role rules - alphabetically sorted + // Article role + new SRRendererRule_1.SRRendererRule({ + roles: ["article"], + elems: [], + modes: ["item", "article", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (mode === "tab_focus" && !CommonUtil_1.CommonUtil.isTabbable(cursor.getNode())) + return null; + var roleDesc = (0, common_1.getRoleDescription)(cursor, "article"); + return "[".concat((0, common_1.quoteNamePadAfter)(cursor)).concat(roleDesc, "]"); + } + ] + }), + // Banner role + new SRRendererRule_1.SRRendererRule({ + roles: ["banner"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (mode === "tab_focus" && !CommonUtil_1.CommonUtil.isTabbable(cursor.getNode())) + return null; + var roleDesc = (0, common_1.getRoleDescription)(cursor, "banner region"); + return "[".concat((0, common_1.quoteNamePadAfter)(cursor)).concat(roleDesc, "]"); + } + ] + }), + // Blockquote role + new SRRendererRule_1.SRRendererRule({ + roles: ["blockquote"], + elems: [], + modes: ["item", "region"], + tests: [ + function (_cursor) { return "[blockquote]"; } + ] + }), + // Caption role + new SRRendererRule_1.SRRendererRule({ + roles: ["caption"], + elems: [], + modes: ["item", "region"], + tests: [ + function (_cursor) { return "[caption]"; } + ] + }), + // Cell role + new SRRendererRule_1.SRRendererRule({ + roles: ["cell"], + elems: [], + modes: ["item", "table"], + tests: [ + renderEnterTableCell + ] + }), + // Columnheader role + new SRRendererRule_1.SRRendererRule({ + roles: ["columnheader"], + elems: [], + modes: ["item", "table"], + tests: [ + renderEnterTableCell + ] + }), + // Complementary role + new SRRendererRule_1.SRRendererRule({ + roles: ["complementary"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (mode === "tab_focus" && !CommonUtil_1.CommonUtil.isTabbable(cursor.getNode())) + return null; + return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "complementary region]"); + } + ] + }), + // Contentinfo role + new SRRendererRule_1.SRRendererRule({ + roles: ["contentinfo"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (mode === "tab_focus" && !CommonUtil_1.CommonUtil.isTabbable(cursor.getNode())) + return null; + return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "content info region]"); + } + ] + }), + // Figure role + new SRRendererRule_1.SRRendererRule({ + roles: ["figure"], + elems: [], + modes: ["item", "region"], + tests: [ + function (_cursor) { return "[figure]"; } + ] + }), + // Form role + new SRRendererRule_1.SRRendererRule({ + roles: ["form"], + elems: [], + modes: ["item", "region", "formcontrol"], + tests: [ + function (cursor) { + if (cursor.getNameInfo() === null) { + return "[section]"; + } + else { + return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "form region]"); + } + } + ] + }), + // Group role + new SRRendererRule_1.SRRendererRule({ + roles: ["group"], + elems: [], + modes: ["item", "region"], + tests: [ + function (cursor) { + var _a; + if (cursor.getNameInfo() === null) + return null; + if (((_a = cursor.getCurrentOrParentByRoleClone(["combobox"], ["select"])) === null || _a === void 0 ? void 0 : _a.getNode().nodeName.toUpperCase()) === "SELECT") { + return ""; + } + if (cursor.getNode().nodeName.toUpperCase() === "DETAILS") { + return "[button, ".concat(cursor.getElement().hasAttribute("open") ? "expanded" : "collapsed", "]"); + } + else { + return "[grouping".concat((0, common_1.quoteNamePadBefore)(cursor), "]"); + } + } + ] + }), + // -- tab_focus + new SRRendererRule_1.SRRendererRule({ + roles: ["group"], + elems: [], + modes: ["tab_focus"], + tests: [ + function (cursor) { + var _a; + if (cursor.getNameInfo() === null) + return null; + if (((_a = cursor.getCurrentOrParentByRoleClone(["combobox"], ["select"])) === null || _a === void 0 ? void 0 : _a.getNode().nodeName.toUpperCase()) === "SELECT") { + return ""; + } + if (cursor.getNode().nodeName.toUpperCase() === "DETAILS") { + return "[button, ".concat(cursor.getElement().hasAttribute("open") ? "expanded" : "collapsed", "]"); + } + else { + return ""; + } + } + ] + }), + // List role + new SRRendererRule_1.SRRendererRule({ + roles: ["list"], + elems: [], + modes: ["item", "list"], + tests: [ + function (cursor) { + var _a; + var node = cursor.getNode(); + var descendantListItems = document.evaluate(".//li | .//*[@role='listitem']", node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + // Count items, excluding those in other lists or within presentational containers + var numItems = 0; + for (var i = 0; i < descendantListItems.snapshotLength; i++) { + var item = descendantListItems.snapshotItem(i); + // Walk up ancestors to check for both nested lists and presentational containers + var isInOtherList = false; + var hasPresentationalAncestor = false; + var ancestor = item.parentElement; + while (ancestor && ancestor !== node) { + // Check if ancestor is another list + var ancestorRole = AriaUtil_1.AriaUtil.getResolvedRole(ancestor); + if (ancestorRole === "list" || + ancestor.nodeName.toUpperCase() === "UL" || + ancestor.nodeName.toUpperCase() === "OL") { + isInOtherList = true; + break; + } + // Check if ancestor has presentational children + if (ancestorRole && ((_a = ARIADefinitions_1.ARIADefinitions.designPatterns[ancestorRole]) === null || _a === void 0 ? void 0 : _a.presentationalChildren)) { + hasPresentationalAncestor = true; + break; + } + ancestor = ancestor.parentElement; + } + if (!isInOtherList && !hasPresentationalAncestor) { + numItems++; + } + } + if (numItems === 0) + return null; + return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "list of ").concat(numItems, " items]"); + } + ] + }), + // Main role + new SRRendererRule_1.SRRendererRule({ + roles: ["main"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (mode === "tab_focus" && !CommonUtil_1.CommonUtil.isTabbable(cursor.getNode())) + return null; + return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "main region]"); + } + ] + }), + // menubar role + new SRRendererRule_1.SRRendererRule({ + roles: ["menubar"], + elems: [], + modes: ["item", "list"], + tests: [ + function (cursor) { + var node = cursor.getNode(); + var descendantListItems = document.evaluate(".//*[@role='menuitem']", node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + var descendantListItemsInOtherLists = document.evaluate(".//*[@role='menubar']//*[@role='menuitem']|.//*[@role='menu']//*[@role='menuitem']", node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + // const descendantContainers = document.evaluate(".//*[@role='menuitem']/*[@role='menu']", node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + // const descendantContainers2 = document.evaluate(".//*[@role='menubar']//*[@role='menuitem']/*[@role='menu']|.//*[@role='menu']//*[@role='menuitem']/*[@role='menu']", node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + console.log("MENUBAR", cursor.isEndTag() ? "/" : "", cursor.getNode()); + console.log(descendantListItems, descendantListItemsInOtherLists); //, descendantContainers, descendantContainers2) + var numItems = descendantListItems.snapshotLength - descendantListItemsInOtherLists.snapshotLength; //-descendantContainers.snapshotLength+descendantContainers2.snapshotLength; + if (numItems === 0) + return null; + return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "menubar with ").concat(numItems, " items]"); + } + ] + }), + // Navigation role + new SRRendererRule_1.SRRendererRule({ + roles: ["navigation"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (mode === "tab_focus" && !CommonUtil_1.CommonUtil.isTabbable(cursor.getNode())) + return null; + var roleDesc = (0, common_1.getRoleDescription)(cursor, "navigation region"); + return "[".concat((0, common_1.quoteNamePadAfter)(cursor)).concat(roleDesc, "]"); + } + ] + }), + // Radio group role + new SRRendererRule_1.SRRendererRule({ + roles: ["radiogroup"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (cursor) { + if (cursor.getNameInfo() === null) + return null; + return "[grouping".concat((0, common_1.quoteNamePadBefore)(cursor), "]"); + } + ] + }), + // Region role + new SRRendererRule_1.SRRendererRule({ + roles: ["region"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (cursor.getNameInfo() === null) + return null; + if (mode === "tab_focus" && !CommonUtil_1.CommonUtil.isTabbable(cursor.getNode())) + return null; + var roleDesc = (0, common_1.getRoleDescription)(cursor, "region"); + return "[".concat((0, common_1.quoteNamePadAfter)(cursor)).concat(roleDesc, "]"); + } + ] + }), + // Row role + new SRRendererRule_1.SRRendererRule({ + roles: ["row"], + elems: [], + modes: ["item", "table"], + tests: [ + function () { return ""; } + ] + }), + // Rowheader role + new SRRendererRule_1.SRRendererRule({ + roles: ["rowheader"], + elems: [], + modes: ["item", "table"], + tests: [ + renderEnterTableCell + ] + }), + // Search role + new SRRendererRule_1.SRRendererRule({ + roles: ["search"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (mode === "tab_focus" && !CommonUtil_1.CommonUtil.isTabbable(cursor.getNode())) + return null; + var roleDesc = (0, common_1.getRoleDescription)(cursor, "search region"); + return "[".concat((0, common_1.quoteNamePadAfter)(cursor)).concat(roleDesc, "]"); + } + ] + }), + // Table role + new SRRendererRule_1.SRRendererRule({ + roles: ["table"], + elems: [], + modes: ["item", "table"], + tests: [ + function (cursor) { + var tableWalker = cursor.clone(); + // Get to the start of the table + while (tableWalker.getRole() !== "table" && tableWalker.previous(function () { return true; })) + ; + // Set an end to the table + var tableNode = tableWalker.getNode(); + var rows = 0; + var cols = 0; + // Sanity check that the table has content + if (tableWalker.getNode().firstChild) { + var firstRowComplete = false; + while (tableWalker.next(function () { return true; }) && !tableWalker.getNode().isSameNode(tableNode)) { + var role = tableWalker.getRole(); + if (tableWalker.isStartTag()) { + if (role === "row") { + ++rows; + } + else { + if (!firstRowComplete && ["cell", "rowheader", "columnheader"].includes(role)) { + var elem = tableWalker.getNode(); + cols += parseInt(elem.getAttribute("colspan") || "1"); + } + } + } + else if (role === "row") { + firstRowComplete = true; + } + } + } + return "[table with ".concat(rows, " ").concat(rows === 1 ? "row" : "rows", " and ").concat(cols, " ").concat(cols === 1 ? "column" : "columns").concat((0, common_1.quoteNamePadBefore)(cursor), "]"); + } + ] + }), + // Toolbar role + new SRRendererRule_1.SRRendererRule({ + roles: ["toolbar"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (mode === "tab_focus" && !CommonUtil_1.CommonUtil.isTabbable(cursor.getNode())) + return null; + return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "toolbar]"); + } + ] + }), + // HTML Element rules + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["DL"], + modes: ["item", "list"], + tests: [ + function (cursor) { + var node = cursor.getNode(); + var descendantListItems = document.evaluate(".//dt", node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + var numItems = descendantListItems.snapshotLength; + return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "definition list of ").concat(numItems, " terms]"); + } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["FIGCAPTION"], + modes: ["item"], + tests: [ + function (_cursor) { return "[caption]"; } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["MARK"], + modes: ["item"], + tests: [ + function (_cursor) { return "[highlighted]"; } + ] + }), + // Multiple roles rules - placed at the bottom + // Heading mode rules - ignore container elements in heading mode (multiple roles) + new SRRendererRule_1.SRRendererRule({ + roles: ["article", "banner", "blockquote", "caption", "cell", "columnheader", + "complementary", "contentinfo", "figure", "form", "group", "region", + "row", "rowheader", "search", "toolbar", "list", "main", "navigation", "table"], + elems: [], + modes: ["heading"], + tests: [ + function () { return ""; } + ] + }) +]; + + +/***/ }, + +/***/ 2099 +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.RULES = void 0; +var SRRendererRule_1 = __webpack_require__(328); +var common_1 = __webpack_require__(7242); +exports.RULES = [ + // Single role rules - alphabetically sorted + // Article role + new SRRendererRule_1.SRRendererRule({ + roles: ["article"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var roleDesc = (0, common_1.getRoleDescription)(cursor, "article"); + return "[out of ".concat(roleDesc, "]"); + } + ] + }), + // Banner role + new SRRendererRule_1.SRRendererRule({ + roles: ["banner"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var roleDesc = (0, common_1.getRoleDescription)(cursor, "banner region"); + return "[out of ".concat(roleDesc, "]"); + } + ] + }), + // Blockquote role + new SRRendererRule_1.SRRendererRule({ + roles: ["blockquote"], + elems: [], + modes: ["item"], + tests: [ + function (_cursor) { return "[out of blockquote]"; } + ] + }), + // Caption role + new SRRendererRule_1.SRRendererRule({ + roles: ["caption"], + elems: [], + modes: ["item"], + tests: [ + function (_cursor) { return "[out of caption]"; } + ] + }), + // Complementary role + new SRRendererRule_1.SRRendererRule({ + roles: ["complementary"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var roleDesc = (0, common_1.getRoleDescription)(cursor, "complementary region"); + return "[out of ".concat(roleDesc, "]"); + } + ] + }), + // Contentinfo role + new SRRendererRule_1.SRRendererRule({ + roles: ["contentinfo"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var roleDesc = (0, common_1.getRoleDescription)(cursor, "content info region"); + return "[out of ".concat(roleDesc, "]"); + } + ] + }), + // Figure role + new SRRendererRule_1.SRRendererRule({ + roles: ["figure"], + elems: [], + modes: ["item", "region"], + tests: [ + function (_cursor) { return "[out of figure]"; } + ] + }), + // Form role + new SRRendererRule_1.SRRendererRule({ + roles: ["form"], + elems: [], + modes: ["item", "region", "formcontrol"], + tests: [ + function (cursor) { + if (cursor.getNameInfo() === null) { + return "[out of section]"; + } + else { + return "[out of form]"; + } + } + ] + }), + // Group role + new SRRendererRule_1.SRRendererRule({ + roles: ["group"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var _a; + if (cursor.getNameInfo() === null) + return null; + if (((_a = cursor.getCurrentOrParentByRoleClone(["combobox"], ["select"])) === null || _a === void 0 ? void 0 : _a.getNode().nodeName.toUpperCase()) === "SELECT") { + return ""; + } + else + return "[out of grouping]"; + } + ] + }), + // List role + new SRRendererRule_1.SRRendererRule({ + roles: ["list"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var node = cursor.getNode(); + var descendantListItems = document.evaluate(".//li | .//*[@role='listitem']", node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + var descendantListItemsInOtherLists = document.evaluate(".//ul//li|.//ul//*[@role='listitem']|.//ol//li|.//ol//*[@role='listitem']|.//*[@role='list']//li|.//*[@role='list']//*[@role='listitem']", node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + var numItems = descendantListItems.snapshotLength - descendantListItemsInOtherLists.snapshotLength; + if (numItems === 0) + return null; + return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "out of list]"); + } + ] + }), + // Main role + new SRRendererRule_1.SRRendererRule({ + roles: ["main"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var roleDesc = (0, common_1.getRoleDescription)(cursor, "main region"); + return "[out of ".concat(roleDesc, "]"); + } + ] + }), + // menubar role + new SRRendererRule_1.SRRendererRule({ + roles: ["menubar"], + elems: [], + modes: ["item", "list"], + tests: [ + function (_cursor) { return "[out of menubar]"; } + ] + }), + // Navigation role + new SRRendererRule_1.SRRendererRule({ + roles: ["navigation"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var roleDesc = (0, common_1.getRoleDescription)(cursor, "navigation region"); + return "[out of ".concat(roleDesc, "]"); + } + ] + }), + // radiogroup role + new SRRendererRule_1.SRRendererRule({ + roles: ["radiogroup"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (_cursor) { return "[out of grouping]"; } + ] + }), + // Region role + new SRRendererRule_1.SRRendererRule({ + roles: ["region"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + if (cursor.getNameInfo() === null) + return null; + var roleDesc = (0, common_1.getRoleDescription)(cursor, "region"); + return "[out of ".concat(roleDesc, "]"); + } + ] + }), + // Search role + new SRRendererRule_1.SRRendererRule({ + roles: ["search"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var roleDesc = (0, common_1.getRoleDescription)(cursor, "search region"); + return "[out of ".concat(roleDesc, "]"); + } + ] + }), + // Table role + new SRRendererRule_1.SRRendererRule({ + roles: ["table"], + elems: [], + modes: ["item"], + tests: [ + function (_cursor) { return "[out of table]"; } + ] + }), + // Toolbar role + new SRRendererRule_1.SRRendererRule({ + roles: ["toolbar"], + elems: [], + modes: ["item"], + tests: [ + function (_cursor) { return "[out of toolbar]"; } + ] + }), + // HTML Element rules + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["ABBR"], + modes: ["item"], + tests: [ + function (cursor) { return cursor.getElement().hasAttribute("title") ? + "[".concat(cursor.getElement().getAttribute("title"), "]") : null; } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["DL"], + modes: ["item"], + tests: [ + function (_cursor) { return "[out of definition list]"; } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["FIGCAPTION"], + modes: ["item"], + tests: [ + function (_cursor) { return "[out of caption]"; } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["MARK"], + modes: ["item"], + tests: [ + function (_cursor) { return "[out of highlighted]"; } + ] + }), + // Multiple roles rules - placed at the bottom + // Region mode rules - ignore container elements in region and heading mode + new SRRendererRule_1.SRRendererRule({ + roles: ["group", "article", "banner", "blockquote", "caption", "complementary", + "contentinfo", "figure", "form", "list", "region", "main", "navigation", + "search", "table", "toolbar"], + elems: [], + modes: ["region", "heading"], + tests: [ + function () { return ""; } + ] + }), +]; + + +/***/ }, + +/***/ 2151 +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.CONTAINER_EXIT_RULES = exports.CONTAINER_ENTER_RULES = exports.SR_RULES = void 0; +var common_1 = __webpack_require__(7242); +var container_enter_1 = __webpack_require__(8485); +var containter_exit_1 = __webpack_require__(2099); +exports.SR_RULES = common_1.RULES; +exports.CONTAINER_ENTER_RULES = container_enter_1.RULES; +exports.CONTAINER_EXIT_RULES = containter_exit_1.RULES; + + +/***/ }, + +/***/ 1950 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.AccNameUtil = void 0; +var ARIADefinitions_1 = __webpack_require__(9910); +var CommonUtil_1 = __webpack_require__(7139); +var AriaUtil_1 = __webpack_require__(7011); +var VisUtil_1 = __webpack_require__(3946); +var CacheUtil_1 = __webpack_require__(4566); +var DOMWalker_1 = __webpack_require__(3864); +var DOMUtil_1 = __webpack_require__(1686); +var AccNameUtil = /** @class */ (function () { + function AccNameUtil() { + } + /** + * Computes the accessible name for an SVG element according to W3C specification + * Following the Accessible Name and Description Computation 1.1 algorithm + * https://www.w3.org/TR/accname-1.1/ + * + * @param elem The SVG element + * @returns The accessible name result or null if no accessible name is found + */ + AccNameUtil.computeAccessibleNameForSVGElementW3C = function (elem) { + if (!elem || elem.nodeName.toLowerCase() !== 'svg') + return null; + // Step 1: Check for aria-labelledby (already handled by main computeAccessibleName function) + // Step 2: Check for aria-label (already handled by main computeAccessibleName function) + // Step 3: Check for title element + var svgTitles = elem.querySelectorAll(":scope > title"); + if (svgTitles && svgTitles.length > 0) { + var text_1 = ""; + svgTitles.forEach(function (svgTitle) { + if (svgTitle && !VisUtil_1.VisUtil.isNodeHiddenFromAT(svgTitle) && !VisUtil_1.VisUtil.isNodePresentational(svgTitle)) { + var title = svgTitle.textContent; + if (title && title.trim() !== '') + text_1 += title.trim(); + } + }); + if (text_1 && text_1.trim() !== '') + return { "name": text_1.trim(), "nameFrom": "svgTitle" }; + } + // Step 4: Check for text content in SVG text elements + var textContent = ""; + var textElements = elem.querySelectorAll("text, textPath, tspan"); + if (textElements && textElements.length > 0) { + textElements.forEach(function (textElement) { + if (!VisUtil_1.VisUtil.isNodeHiddenFromAT(textElement) && !VisUtil_1.VisUtil.isNodePresentational(textElement)) { + var content = textElement.textContent; + if (content && content.trim() !== '') + textContent += " " + content.trim(); + } + }); + if (textContent.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(textContent.trim()), "nameFrom": "svgText" }; + } + // Step 5: Check for xlink:title attribute on links within SVG + var links = elem.querySelectorAll("a"); + for (var i = 0; i < links.length; i++) { + var link = links[i]; + if (!VisUtil_1.VisUtil.isNodeHiddenFromAT(link) && !VisUtil_1.VisUtil.isNodePresentational(link)) { + var xlinkTitle = link.getAttribute("xlink:title"); + if (xlinkTitle && xlinkTitle.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(xlinkTitle), "nameFrom": "svglinkTitle" }; + } + } + // Step 6: Check for aria-describedby or aria-description + var description = AriaUtil_1.AriaUtil.getAriaDescription(elem); + if (description && description.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(description), "nameFrom": "aria-description" }; + // Step 7: Check for desc element + var descElements = elem.querySelectorAll(":scope > desc"); + if (descElements && descElements.length > 0) { + var descText_1 = ""; + descElements.forEach(function (descElement) { + if (!VisUtil_1.VisUtil.isNodeHiddenFromAT(descElement) && !VisUtil_1.VisUtil.isNodePresentational(descElement)) { + var desc = descElement.textContent; + if (desc && desc.trim() !== '') + descText_1 += " " + desc.trim(); + } + }); + if (descText_1.trim() !== '') + return { "name": descText_1.trim(), "nameFrom": "svgDesc" }; + } + // Step 8: Check for title attribute + if (elem.hasAttribute("title")) { + var title = elem.getAttribute("title"); + if (title && title.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(title), "nameFrom": "title" }; + } + // No accessible name found + return null; + }; + // calculate accessible name for a given node + AccNameUtil.computeAccessibleName = function (elem) { + if (!elem) + return null; + var nodeName = elem.nodeName.toLowerCase(); + var name_pair = CacheUtil_1.CacheUtil.getCache(elem, "ELEMENT_ACCESSBLE_NAME", undefined); + if (name_pair !== undefined) + return name_pair; + // 1. name from author, or elements without a role but with aria-labelledby or aria-label + // get aria label even for the role where the name is prohibited or is 'presentation' or 'none' + var accName = AriaUtil_1.AriaUtil.getAriaLabel(elem); + if (accName && accName.trim() !== "") { + CacheUtil_1.CacheUtil.setCache(elem, "ELEMENT_ACCESSBLE_NAME", { "name": CommonUtil_1.CommonUtil.truncateText(accName), "nameFrom": "ariaLabel" }); + return { "name": CommonUtil_1.CommonUtil.truncateText(accName), "nameFrom": "ariaLabel" }; + } + // 2. accessible name mapping for native html elements + name_pair = AccNameUtil.computeAccessibleNameForNativeElement(elem); + if (name_pair) { + CacheUtil_1.CacheUtil.setCache(elem, "ELEMENT_ACCESSBLE_NAME", name_pair); + return name_pair; + } + // 3. name from native or aria attribute + /**name_pair = AccNameUtil.computeAccessibleNameFromAttribute(elem); + if (name_pair) { + CacheUtil.setCache(elem, "ELEMENT_ACCESSBLE_NAME", name_pair); + return name_pair; + }*/ + // 4. name from content for custom elements with a role + var role = AriaUtil_1.AriaUtil.getResolvedRole(elem); + if (ARIADefinitions_1.ARIADefinitions.designPatterns[role] && ARIADefinitions_1.ARIADefinitions.designPatterns[role].nameFrom.includes("contents")) { + name_pair = AccNameUtil.computeAccessibleNameFromContent(elem); + if (name_pair) { + CacheUtil_1.CacheUtil.setCache(elem, "ELEMENT_ACCESSBLE_NAME", name_pair); + return name_pair; + } + } + // 5. name from the global attribute "title" + if (elem.hasAttribute("title")) { + var title = elem.getAttribute("title").trim(); + if (title && title.trim().length > 0) { + title = CommonUtil_1.CommonUtil.truncateText(title); + CacheUtil_1.CacheUtil.setCache(elem, "ELEMENT_ACCESSBLE_NAME", { "name": title, "nameFrom": "title" }); + return { "name": title, "nameFrom": "title" }; + } + } + // 6. name from the attribute "placeholder" + if (nodeName === 'textarea' || (nodeName === 'input' && (!elem.hasAttribute("type") || CommonUtil_1.CommonUtil.input_type_with_placeholder.includes(elem.getAttribute("type"))))) { + var placeholder = elem.getAttribute("placeholder"); + if (placeholder && placeholder.trim().length > 0) { + placeholder = CommonUtil_1.CommonUtil.truncateText(placeholder); + CacheUtil_1.CacheUtil.setCache(elem, "ELEMENT_ACCESSBLE_NAME", { "name": placeholder, "nameFrom": "placeholder" }); + return { "name": placeholder, "nameFrom": "placeholder" }; + } + } + CacheUtil_1.CacheUtil.setCache(elem, "ELEMENT_ACCESSBLE_NAME", null); + return null; + }; + // calculate accessible name for native elements + AccNameUtil.computeAccessibleNameForNativeElement = function (elem) { + var nodeName = elem.nodeName.toLowerCase(); + // labellable fields + if (CommonUtil_1.CommonUtil.form_labelable_elements.includes(nodeName)) { + // Get only the non-hidden labels for element + var label = CommonUtil_1.CommonUtil.getFormFieldLabel(elem); + if (label && label.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(label), "nameFrom": "label" }; + } + // input types: button, reset, submit, image + if (nodeName === "input" && elem.hasAttribute("type")) { + if (CommonUtil_1.CommonUtil.form_button_types.includes(elem.getAttribute("type"))) { + // input types: button, reset, submit + // Get the "value" attribute for the element + var value = CommonUtil_1.CommonUtil.getElementAttribute(elem, "value"); + if (value && value.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(value), "nameFrom": "value" }; + // input 'submit' and 'reset' have visible defaults so pass if there is no explicit 'value' attribute + var type = elem.getAttribute("type"); + if (type === 'submit' || type === 'reset') + return { "name": type, "nameFrom": "internal" }; + } + else if (elem.getAttribute("type") === 'image') { + // input type = 'image' + // note that though HTML 5 spec indicates "The element's [value] attribute must be omitted", Chrome uses the value. + // Get the accessible name for the alt attribute + var alt = CommonUtil_1.CommonUtil.getElementAttribute(elem, "alt"); + if (alt && alt.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(alt), "nameFrom": "alt" }; + ; + // the visible default text for type "image" is "Submit" same with the type "submit" + //return {"name":elem.getAttribute("type"), "nameFrom": "internal"}; + } + } + // button + // note button may have a value attribute, but it's not a visible text + if (nodeName === "button") { + // first use the button text + var text = elem.innerText; + if (text && text.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "text" }; + // for image button: get the first image if exists + var image = elem.querySelector('img'); + if (image && !VisUtil_1.VisUtil.isNodeHiddenFromAT(image) && !VisUtil_1.VisUtil.isNodePresentational(image)) { + var pair = AccNameUtil.computeAccessibleName(image); + if (pair && pair.name && pair.name.trim().length > 0) + return pair; + } + // for a button with a svg image + var svg = elem.querySelector('svg'); + if (svg && !VisUtil_1.VisUtil.isNodeHiddenFromAT(svg) && !VisUtil_1.VisUtil.isNodePresentational(svg)) { + var pair = AccNameUtil.computeAccessibleName(svg); + if (pair && pair.name && pair.name.trim().length > 0) + return pair; + } + } + // fieldset + if (nodeName === "fieldset") { + // if the fieldset element's first child is a legend element, then use the subtree of the legend + var first = elem.firstElementChild; + if (first && first.nodeName.toLowerCase() === 'legend') { + // legend can be mixed text + var text = first.innerText; + if (text && text.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "legend" }; + } + } + // output + if (nodeName === "output") { + // if the associated label element exists, use concatenated accessible name(s) from labelled elements. + if (elem.hasAttribute("for")) { + var labelIDs = elem.getAttribute("for").trim().split(" "); + if (labelIDs && labelIDs.length > 0) { + var label = ""; + for (var j = 0; j < labelIDs.length; j++) { + var labelNode = elem.ownerDocument.getElementById(labelIDs[j]); + if (labelNode && !DOMUtil_1.DOMUtil.sameNode(labelNode, elem) && !VisUtil_1.VisUtil.isNodeHiddenFromAT(labelNode) && !VisUtil_1.VisUtil.isNodePresentational(labelNode)) { + var pair = AccNameUtil.computeAccessibleName(labelNode); + if (pair && pair.name && pair.name.trim().length > 0) + label += " " + CommonUtil_1.CommonUtil.normalizeSpacing(pair.name); + } + } + if (label.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(label), "nameFrom": "label" }; + } + } + } + // summary + if (nodeName === "summary") { + // use summary element subtree + var text = elem.innerText; + if (text && text.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "legend" }; + } + // details + if (nodeName === "details") { + var first = elem.firstElementChild; + if (first && first.nodeName.toLowerCase() === 'summary') { + // get accessible name from summary + var pair = AccNameUtil.computeAccessibleName(first); + if (pair && pair.name && pair.name.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(pair.name.trim()), "nameFrom": "summary" }; + } + // If no summary element as a direct child of the details element, + // the user agent should provide one with a subtree containing a localized string of the word "details". + return { "name": "details", "nameFrom": "internal" }; + } + // figure + if (nodeName === "figure") { + // if the figure element has a figcaption as a child + var caption = CommonUtil_1.CommonUtil.getChildByTagHidden(elem, "figcaption", true, false); + if (caption && caption.length > 0) { + // figcaption can be mixed text + var text = caption[0].innerText; + if (text && text.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "figcaption" }; + } + } + // img elements: use attribute "alt" + if (nodeName === "img") { + if (elem.hasAttribute("alt")) { + var alt = elem.getAttribute("alt"); + return { "name": CommonUtil_1.CommonUtil.truncateText(alt), "nameFrom": "alt" }; + } + } + // area elements: use attribute "alt" + if (nodeName === "area") { + if (elem.hasAttribute("alt")) { + var alt = elem.getAttribute("alt"); + if (alt && alt.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(alt), "nameFrom": "alt" }; + } + } + // table element + if (nodeName === "table") { + // if the figure element has a caption as the first child + var captionElem = elem.firstElementChild; + if (captionElem && captionElem.nodeName.toLowerCase() === 'caption') { + // caption can be mixed text + var caption = captionElem.innerText; + if (caption && caption.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(caption), "nameFrom": "caption" }; + } + } + // a element + if (nodeName === "a") { + // first use the link text + var text = elem.innerText; + if (text && text.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "text" }; + //for image link: get the image or svg if exists + var images = elem.querySelectorAll(":scope > img, :scope > svg"); + if (images && images.length > 0) { + var text_2 = ""; + images.forEach(function (image) { + if (!VisUtil_1.VisUtil.isNodeHiddenFromAT(image) && !VisUtil_1.VisUtil.isNodePresentational(image)) { + var pair = AccNameUtil.computeAccessibleName(image); + if (pair && pair.name && pair.name.trim().length > 0) + text_2 += " " + pair.name.trim(); + } + }); + if (text_2.trim() !== '') + return { "name": text_2.trim(), "nameFrom": "alt" }; + } + } + // optgroup + // label participate in accessible name calculation: https://www.w3.org/TR/html-aam-1.0/#att-label + // The label attribute must be specified. Its value gives the name of the group + // the value is disabled in the interface + if (nodeName === "optgroup" || nodeName === "option" || nodeName === "track") { + var label = elem.getAttribute("label"); + if (label && label.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(label), "nameFrom": "label" }; + } + // svg + if (nodeName === "svg") { + var pair = AccNameUtil.computeAccessibleNameForSVGElementW3C(elem); + if (pair && pair.name && pair.name.trim().length > 0) + return pair; + } + return null; + }; + // calculate accessible name for native elements + AccNameUtil.computeAccessibleNameForSVGElement = function (elem) { + // 1. a direct child or descendant title element + var svgTitles = elem.querySelectorAll(":scope > title"); + if (svgTitles && svgTitles.length > 0) { + var text_3 = ""; + svgTitles.forEach(function (svgTitle) { + if (svgTitle && !VisUtil_1.VisUtil.isNodeHiddenFromAT(svgTitle) && !VisUtil_1.VisUtil.isNodePresentational(svgTitle)) { + var title = svgTitle.textContent; + if (title && title.trim() !== '') + text_3 += title.trim(); + } + }); + if (text_3 && text_3.trim() !== '') + return { "name": text_3.trim(), "nameFrom": "svgTitle" }; + } + // 2. xlink:title attribute on a link + var linkTitle = elem.querySelector("a"); + if (linkTitle && !VisUtil_1.VisUtil.isNodeHiddenFromAT(linkTitle) && !VisUtil_1.VisUtil.isNodePresentational(linkTitle)) { + var link = linkTitle.getAttribute("xlink:title"); + if (link && link.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(link), "nameFrom": "svglinkTitle" }; + } + /** 3. for text container elements, the text content. + * note the SVG text content elements are: ‘text’, ‘textPath’ and ‘tspan’. + * svg element can be nested. One of the purposes is to to group SVG shapes together as a collection for responsive design. + * + * select text content excluded the text from the nested svg elements and their children + */ + var text = ""; + elem.querySelectorAll(":scope > *").forEach(function (element) { + if (element.nodeName.toLowerCase() !== 'svg' && !VisUtil_1.VisUtil.isNodeHiddenFromAT(element) && !VisUtil_1.VisUtil.isNodePresentational(element)) { + var value = CommonUtil_1.CommonUtil.getInnerText(element); + if (value && value.trim().length > 0) + text += value; + } + }); + if (text.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "svgText" }; + // 4. from aria-describedby or aria-description + var descby = AriaUtil_1.AriaUtil.getAriaDescription(elem); + if (descby && descby.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(descby), "nameFrom": "aria-description" }; + // 5. a direct child or descendant desc element + var descElems = elem.querySelectorAll(":scope > desc"); + if (descElems && descElems.length > 0) { + var text_4 = ""; + descElems.forEach(function (descElem) { + if (descElem && !VisUtil_1.VisUtil.isNodeHiddenFromAT(descElem) && !VisUtil_1.VisUtil.isNodePresentational(descElem)) { + var desc = descElem.textContent; + if (desc && desc.trim() !== '') + text_4 += desc.trim(); + } + }); + if (text_4 && text_4.trim() !== '') + return { "name": text_4.trim(), "nameFrom": "svgDesc" }; + } + }; + // calculate accessible name for custom elements marked with aria + AccNameUtil.computeAccessibleNameFromContent = function (elem) { + var nodeName = elem.nodeName.toLowerCase(); + var role = AriaUtil_1.AriaUtil.getResolvedRole(elem); + /** for acc name from content, the content from CSS pseudo-elements + * :before and :after pseudo elements [CSS2] can provide textual content for elements that have a content model. + * For :before or :after pseudo elements, user agents must prepend CSS textual content, without a space, + * to the textual content of the current node. + */ + var pair = AccNameUtil.computeAccessibleNameForCSSPseudoElement(elem, "before"); + if (pair !== null && pair.name && pair.name.trim().length > 0) + return pair; + pair = AccNameUtil.computeAccessibleNameForCSSPseudoElement(elem, "after"); + if (pair && pair.name && pair.name.trim().length > 0) + return pair; + // shadow host + if (elem.shadowRoot) { + pair = AccNameUtil.computeAccessibleNameForShadowHost(elem); + if (pair && pair.name && pair.name.trim().length > 0) + return { "name": pair.name, "nameFrom": "shadow" }; + ; + } + // slot element + if (nodeName === "slot") { + pair = AccNameUtil.computeAccessibleNameForSlotElement(elem); + if (pair && pair.name && pair.name.trim().length > 0) + return { "name": pair.name, "nameFrom": "slot" }; + } + // otherwise: get the value from the element + pair = AccNameUtil.computeAccessibleNameFromChildren(elem); + if (pair && pair.name && pair.name.trim().length > 0) + return { "name": pair.name, "nameFrom": "content" }; + // no accessible name exists + return null; + }; + // calculate accessible name from CSS generated content + AccNameUtil.computeAccessibleNameForCSSPseudoElement = function (elem, type) { + var contentElem = elem.ownerDocument.defaultView.getComputedStyle(elem, type); + if (contentElem) { + var content = contentElem.content; + if (content && content !== "none" && content !== "no" && content !== "normal") { + content = content.replace(/^"/, "").replace(/"$/, ""); + if (content.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(content), "nameFrom": "css-" + type }; + } + } + return null; + }; + // calculate accessible name for SLOT element + AccNameUtil.computeAccessibleNameForShadowHost = function (elem) { + var text = ""; + var shadowRoot = elem.shadowRoot; + if (shadowRoot) { + var children = shadowRoot.querySelectorAll('*'); + // check text from all the children elements + children.forEach(function (child) { + var pair = AccNameUtil.computeAccessibleName(child); + if (pair && pair.name && pair.name.trim().length > 0) + text += " " + pair.name.trim(); + }); + } + if (text.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "shadow-host" }; + return null; + }; + // calculate accessible name for SLOT element + AccNameUtil.computeAccessibleNameForSlotElement = function (elem) { + //if no assignedNode, check its own text + var text = ""; + if (!elem.assignedNodes() || elem.assignedNodes().length === 0) { + var pair = AccNameUtil.computeAccessibleName(elem); + if (pair && pair.name && pair.name.trim().length > 0) + text += " " + pair.name.trim(); + } + else { + // check text from all assigned nodes + for (var _i = 0, _a = elem.assignedNodes(); _i < _a.length; _i++) { + var slotChild = _a[_i]; + var pair = AccNameUtil.computeAccessibleName(slotChild); + if (pair && pair.name && pair.name.length > 0) + text += " " + pair.name.trim(); + } + } + if (text.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "content-slot" }; + return null; + }; + // calculate accessible name from children content + AccNameUtil.computeAccessibleNameFromChildren = function (elem) { + var text = ""; + //let walkChild = elem.firstChild; + var nw = new DOMWalker_1.DOMWalker(elem); + // Loop over all the childrens of the element to get the text + while (nw.nextNode() && nw.node !== elem && nw.node !== elem.parentNode) { + if (nw.bEndTag) + continue; + //while (walkChild) { + var walkChild = nw.node; + if (walkChild.nodeType === 3) { + // for the text node, get the parentnode to check visibility + var parent_1 = walkChild.parentElement; + if (!VisUtil_1.VisUtil.isNodeHiddenFromAT(parent_1) && !VisUtil_1.VisUtil.isNodePresentational(parent_1) && walkChild.nodeValue && walkChild.nodeValue.trim().length > 0) { + text += " " + walkChild.nodeValue.trim(); + } + } + else if (walkChild.nodeType === 1 && !VisUtil_1.VisUtil.isNodeHiddenFromAT(walkChild) && !VisUtil_1.VisUtil.isNodePresentational(walkChild)) { + var pair = AccNameUtil.computeAccessibleName(walkChild); + if (pair && pair.name && pair.name.length > 0) { + text += " " + pair.name.trim(); + nw.bEndTag = true; + } + // Skip children if this element only has presentational children + else if (AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(nw.node)) { + nw.bEndTag = true; + } + } + } + if (text.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "content" }; + return null; + }; + // if accessible name can be ignored for image or svg + AccNameUtil.isAccessibleNameIgnorable = function (elem) { + if (!elem) + return false; + var nodeName = elem.nodeName.toLowerCase(); + if (nodeName !== 'img' && nodeName !== 'svg') + return false; + var parent = elem.parentElement; + if (parent) { + // if the parent is a widget and has an aria label, then image/svg label is not necessary + if ((AriaUtil_1.AriaUtil.isWidget(parent) || AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(parent)) && AriaUtil_1.AriaUtil.hasAriaLabel(parent)) + return true; + } + return false; + }; + return AccNameUtil; +}()); +exports.AccNameUtil = AccNameUtil; + + +/***/ }, + +/***/ 7011 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.AriaUtil = void 0; +var CacheUtil_1 = __webpack_require__(4566); +var ARIADefinitions_1 = __webpack_require__(9910); +var ARIAMapper_1 = __webpack_require__(9955); +var DOMWalker_1 = __webpack_require__(3864); +var VisUtil_1 = __webpack_require__(3946); +var CommonUtil_1 = __webpack_require__(7139); +var AccNameUtil_1 = __webpack_require__(1950); +var fragment_1 = __webpack_require__(5279); +var DOMUtil_1 = __webpack_require__(1686); +var AriaUtil = /** @class */ (function () { + function AriaUtil() { + } + AriaUtil.isDefinedAriaAttributeAtIndex = function (ele, index) { + var attrName = ele.attributes[index].name; + return AriaUtil.isDefinedAriaAttribute(ele, attrName); + }; + /** + * this method returns user-defined aria attribute name from dom + * @param ele element + * @returns user defined aria attributes + */ + AriaUtil.getUserDefinedAriaAttributes = function (elem) { + var ariaAttributes = []; + var domAttributes = elem.attributes; + if (domAttributes) { + for (var i = 0; i < domAttributes.length; i++) { + var attrName = domAttributes[i].name.trim().toLowerCase(); + var isAria = attrName.substring(0, 5) === 'aria-'; + if (isAria) + ariaAttributes.push(attrName); + } + } + return ariaAttributes; + }; + /** + * this method returns user-defined html attribute name from dom + * @param ele element + * @returns user defined html attributes + */ + AriaUtil.getUserDefinedHtmlAttributes = function (elem) { + var htmlAttributes = []; + var domAttributes = elem.attributes; + if (domAttributes) { + for (var i = 0; i < domAttributes.length; i++) { + var attrName = domAttributes[i].name.trim().toLowerCase(); + var isAria = attrName.substring(0, 5) === 'aria-'; + if (!isAria) + htmlAttributes.push(attrName); + } + } + return htmlAttributes; + }; + /** + * this method returns user-defined aria attribute name-value pair from dom + * @param ele element + * @returns user defined aria attributes + */ + AriaUtil.getUserDefinedAriaAttributeNameValuePairs = function (elem) { + var ariaAttributes = []; + var domAttributes = elem.attributes; + if (domAttributes) { + for (var i = 0; i < domAttributes.length; i++) { + var attrName = domAttributes[i].name.trim().toLowerCase(); + var attrValue = elem.getAttribute(attrName); + if (attrValue === '') + attrValue = null; + var isAria = attrName.substring(0, 5) === 'aria-'; + if (isAria) + ariaAttributes.push({ name: attrName, value: attrValue }); + } + } + return ariaAttributes; + }; + /** + * this method returns user-defined html attribute name-value pair from dom + * @param ele element + * @returns user defined html attributes + */ + AriaUtil.getUserDefinedHtmlAttributeNameValuePairs = function (elem) { + var htmlAttributes = []; + var domAttributes = elem.attributes; + if (domAttributes) { + for (var i = 0; i < domAttributes.length; i++) { + var attrName = domAttributes[i].name.trim().toLowerCase(); + var attrValue = elem.getAttribute(attrName); + if (attrValue === '') + attrValue = null; + var isAria = attrName.substring(0, 5) === 'aria-'; + if (!isAria) + htmlAttributes.push({ name: attrName, value: attrValue }); + } + } + return htmlAttributes; + }; + /** + * This method handles implicit aria definitions, for example, an input with checked is equivalent to aria-checked="true" + */ + AriaUtil.getAriaAttribute = function (ele, attributeName) { + // If the attribute is defined, it takes precedence + var retVal = ele.getAttribute(attributeName); + if (ele.hasAttribute(attributeName) && retVal.trim() === "") { //"" is treated as false, so we need return it before the below check + return retVal; + } + // Then determine implicit values from other attributes + if (!retVal) { + var tag = ele.nodeName.toLowerCase(); + if (attributeName in AriaUtil.ariaAttributeImplicitMappings) { + if (tag in AriaUtil.ariaAttributeImplicitMappings[attributeName]) { + retVal = AriaUtil.ariaAttributeImplicitMappings[attributeName][tag]; + if (typeof (retVal) === "function") { + retVal = retVal(ele); + } + } + else if ("*" in AriaUtil.ariaAttributeImplicitMappings[attributeName]) { + retVal = AriaUtil.ariaAttributeImplicitMappings[attributeName]["*"]; + if (typeof (retVal) === "function") { + retVal = retVal(ele); + } + } + } + } + // Check role-based defaults + if (!retVal) { + var role = ARIAMapper_1.ARIAMapper.nodeToRole(ele); + if (role in AriaUtil.ariaAttributeRoleDefaults && attributeName in AriaUtil.ariaAttributeRoleDefaults[role]) { + retVal = AriaUtil.ariaAttributeRoleDefaults[role][attributeName]; + if (typeof (retVal) === "function") { + retVal = retVal(ele); + } + } + } + // Still not defined? Check global defaults + if (!retVal && attributeName in AriaUtil.ariaAttributeGlobalDefaults) { + retVal = AriaUtil.ariaAttributeGlobalDefaults[attributeName]; + } + return retVal; + }; + AriaUtil.isDefinedAriaAttribute = function (ele, attrName) { + var isDefinedAriaAttribute = false; + if (attrName.substring(0, 5) === 'aria-') { + // User agents SHOULD treat state and property attributes with a value of "" the same as they treat an absent attribute. + isDefinedAriaAttribute = ele.hasAttribute && ele.hasAttribute(attrName) && ele.getAttribute(attrName).length > 0; + } + return isDefinedAriaAttribute; + }; + /** + * WAI-ARIA’s role attribute may have a list of values, but only the first valid and supported WAI-ARIA role is used + * https://www.w3.org/TR/wai-aria-implementation/#mapping_role_table + * This function is responsible for retrieving the resoled role for an element. + * @parm {HTMLElement} ele - element for which to find role. + * + * @return string - resolved role for the element: + * explicit role: resoled from the list of values + * implicit role: if not explicitely specified, or none of the specified role values is allowed for the element + * null: if none of the specified role values is allowed for the element, neither implicit role exists + * + * @memberOf AriaUtil + */ + AriaUtil.getResolvedRole = function (elem, considerImplicitRoles) { + if (considerImplicitRoles === void 0) { considerImplicitRoles = true; } + if (!elem) + return null; + var role = CacheUtil_1.CacheUtil.getCache(elem, "RPTUTIL_ELEMENT_RESOLVED_ROLE", null); + if (role === null) { + var roles = AriaUtil.getUserDefinedRoles(elem); + var tagProperty = AriaUtil.getElementAriaProperty(elem); + var allowedRoles = AriaUtil.getAllowedAriaRoles(elem, tagProperty); + var containsGeneric = false; + if (roles && roles.length > 0 && allowedRoles && allowedRoles.length > 0) { + for (var i = 0; i < roles.length; i++) { + if (allowedRoles.includes("any") || allowedRoles.includes(roles[i])) { + if (allowedRoles.includes("any") && roles[i] === 'generic') { + containsGeneric = true; + continue; + } + role = roles[i]; + if (role === "presentation" || role === "none") { + // If element is focusable, then presentation roles are to be ignored + if (CommonUtil_1.CommonUtil.isFocusable(elem)) { + //reset rule to null + role = null; + continue; + } + } + break; + } + } + if (containsGeneric) + role = 'generic'; + } + if (role === null && considerImplicitRoles) { + var implicitRole = AriaUtil.getImplicitRole(elem); + role = implicitRole && implicitRole.length > 0 ? implicitRole[0] : undefined; + } + CacheUtil_1.CacheUtil.setCache(elem, "RPTUTIL_ELEMENT_RESOLVED_ROLE", role); + } + return role !== undefined ? role : null; + }; + /** + * This function is responsible for retrieving user defined element's roles from dom. + * @parm {HTMLElement} ele - element for which to find role. + * + * @return {List} roles - list of user defined roles in the element role attribute. + * + * @memberOf AriaUtil + */ + AriaUtil.getUserDefinedRoles = function (ele) { + return AriaUtil.getRoles(ele, false); + }; + /** + * This function is responsible for retrieving element's roles. + * This function also finds implicit roles. + * @parm {HTMLElement} ele - element for which to find role. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {List} roles - list of attribute roles and implicit roles. + * + * @memberOf AriaUtil + */ + AriaUtil.getRoles = function (ele, considerImplicitRoles) { + var roles = []; + if (ele && ele.hasAttribute && ele.hasAttribute("role")) { + var attrRoles = CommonUtil_1.CommonUtil.normalizeSpacing(ele.getAttribute("role").trim()).split(" "); + for (var i = 0; i < attrRoles.length; ++i) { + roles.push(attrRoles[i]); + } + } + //check if implicit roles exist. + //Note: element can have multiple implicit roles + if (considerImplicitRoles) { + var implicitRole = AriaUtil.getImplicitRole(ele); + if (implicitRole !== null && implicitRole.length > 0) { + //add implicit roles to the attributes roles. + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(implicitRole, roles); + } + } + return roles; + }; + /** + * Returns the implicit role of the elemement + * @parm {HTMLElement} ele - element for which to find role. + * + * @return the implicit role or [] if doesn't exist + * + * @memberOf AriaUtil + */ + AriaUtil.getImplicitRole = function (ele) { + if (!ele || ele.nodeType !== 1) + return null; + var implicitRoles = CacheUtil_1.CacheUtil.getCache(ele, "AriaUtil_ImplicitRole", null); + if (!implicitRoles) { + var tagProperty = AriaUtil.getElementAriaProperty(ele); + // check if there are any implicit roles for this element. + if (tagProperty && tagProperty.implicitRole) { + if (tagProperty.implicitRole.includes("generic")) { + // the 'generic' role is only allowed if a valid aria attribute exists. + var domAriaAttributes_1 = AriaUtil.getUserDefinedAriaAttributes(ele); + if (domAriaAttributes_1.length === 0) { + CacheUtil_1.CacheUtil.setCache(ele, "AriaUtil_ImplicitRole", []); + return []; + } + var roleAttributes = []; + var pattern = ARIADefinitions_1.ARIADefinitions.designPatterns['generic']; + if (pattern.reqProps && pattern.reqProps.length > 0) + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(pattern.reqProps, roleAttributes); + if (tagProperty.globalAriaAttributesValid) + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(ARIADefinitions_1.ARIADefinitions.globalProperties, roleAttributes); + if (pattern.deprecatedProps && pattern.deprecatedProps.length > 0) + CommonUtil_1.CommonUtil.reduceArrayItemList(pattern.deprecatedProps, roleAttributes); + // remove 'generic' role if roleAttributes doesn't contain any of domAriaAttributes + if (roleAttributes.length > 0 && !roleAttributes.some(function (attr) { return domAriaAttributes_1.includes(attr); })) { + var implicit = CommonUtil_1.CommonUtil.reduceArrayItemList(['generic'], tagProperty.implicitRole); + CacheUtil_1.CacheUtil.setCache(ele, "AriaUtil_ImplicitRole", implicit); + return implicit; + } + } + CacheUtil_1.CacheUtil.setCache(ele, "AriaUtil_ImplicitRole", tagProperty.implicitRole); + return tagProperty.implicitRole; + } + CacheUtil_1.CacheUtil.setCache(ele, "AriaUtil_ImplicitRole", []); + return []; + } + return implicitRoles; + }; + /** + * Returns the required properties of the role + * @parm {string} role - the role + * @parm {HTMLElement} ele - element for which to find role. + * + * @return {List} properties - list of properties that are required by the role + * + * @memberOf AriaUtil + */ + AriaUtil.getRoleRequiredProperties = function (role, ele) { + if (role === null) { + return null; + } + if (ARIADefinitions_1.ARIADefinitions.designPatterns[role]) { + var requiredAttributes = ARIADefinitions_1.ARIADefinitions.designPatterns[role].reqProps; + // handle special case of separator + if (role.toLowerCase() === "separator" && ele && CommonUtil_1.CommonUtil.isFocusable(ele)) { + requiredAttributes = CommonUtil_1.CommonUtil.concatUniqueArrayItemList(["aria-valuenow"], requiredAttributes || []); + } + return requiredAttributes; + } + else { + return null; + } + }; + /** + * This function is responsible for finding if a element has given role. + * This function aslo finds if element has given roles as implicit role. + * @parm {HTMLElement} ele - element for which to find role. + * @parm {list or string} roles - List or single role for which to find if element has these roles. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {List} retVal - true or false based on if th element has the specified role. + * + * @memberOf AriaUtil + * + * Consider to use hasRoleInSemantics() instead. + */ + AriaUtil.hasRole = function (ele, role, considerImplicitRoles) { + var retVal = false; + if (ele && ele.hasAttribute && ele.hasAttribute("role")) { + if (typeof (role) != typeof ("")) { + var roles = ele.getAttribute("role").trim().split(" "); + for (var i = 0; !retVal && i < roles.length; ++i) { + retVal = roles[i] in role; + } + } + else { + var roles = ele.getAttribute("role").trim().split(" "); + for (var i = 0; !retVal && i < roles.length; ++i) { + retVal = roles[i] === role; + } + } + } + //if none of the the attribute roles matched with given role + //check if implicit roles matches. + //Note: element can have multiple implicit roles + if (!retVal && considerImplicitRoles) { + var wRoles = []; + //check if there are any implicit roles for this element. + var implicitRole = AriaUtil.getImplicitRole(ele); + if (implicitRole !== null && implicitRole.length > 0) { + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(implicitRole, wRoles); + //if role is array loop thru and see if any of the implicit role present in the array + if (typeof (role) != typeof ("")) { + for (var i = 0; !retVal && i < wRoles.length; ++i) { + retVal = wRoles[i] in role; + } + } + else { + for (var i = 0; !retVal && i < wRoles.length; ++i) { + retVal = wRoles[i] === role; + } + } + } + } + return retVal; + }; + /** + * Checks if the element has the role, including the implied role if role is not explicitly specified. + * + * This function is replacing the hasRole function + * + * @parm {HTMLElement} ele - element for which to find role. + * @parm {list or string} roles - List or single role for which to find if element has these roles. + * + * @return {List} retVal - true or false based on if the element has the specified role. + * + * @memberOf AriaUtil + */ + AriaUtil.hasRoleInSemantics = function (ele, role) { + var retVal = false; + var roleSpecified = false; + if (ele && ele.hasAttribute && ele.hasAttribute("role")) { + if (typeof (role) != typeof ("")) { + var roles = ele.getAttribute("role").trim().toLowerCase().split(/\s+/); + for (var i = 0; !retVal && i < roles.length; ++i) { + roleSpecified = true; + retVal = roles[i] in role; + } + } + else { + var roles = ele.getAttribute("role").trim().toLowerCase().split(/\s+/); + for (var i = 0; !retVal && i < roles.length; ++i) { + roleSpecified = true; + retVal = roles[i] === role; + } + } + } + if (roleSpecified) { + return retVal; + } + //check if implicit roles matches. + //Note: element can have multiple implicit roles + //check if there are any implicit roles for this element. + var impRoles = AriaUtil.getImplicitRole(ele); + if (impRoles !== null && impRoles.length > 0) { + //if role is array loop thru and see if any of the implicit role present in the array + if (typeof (role) != typeof ("")) { + for (var i = 0; !retVal && i < impRoles.length; ++i) { + retVal = impRoles[i] in role; + } + } + else { + for (var i = 0; !retVal && i < impRoles.length; ++i) { + retVal = impRoles[i] === role; + } + } + } + return retVal; + }; + /** + * This function is responsible for finding if a element has given role. + * This function also checks if element has given roles as implicit roles. + * @parm {HTMLElement} ele - element for which to find role. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {bool} retVal - true or false based on if the element has the specified role. + * + * @memberOf AriaUtil + */ + AriaUtil.hasAnyRole = function (ele, considerImplicitRoles) { + var retVal = false; + if (ele && ele.hasAttribute && ele.hasAttribute("role")) { + retVal = true; + } + //check if implicit roles exist. + //Note: element can have multiple implicit roles + if (!retVal && considerImplicitRoles) { + //check if there are any implicit roles for this element. + var impRoles = AriaUtil.getImplicitRole(ele); + if (impRoles !== null && impRoles.length > 0) + retVal = true; + } + return retVal; + }; + AriaUtil.isPresentationalElement = function (node) { + // Elements extracted from https://developer.mozilla.org/en/docs/Web/HTML/Element#Inline_text_semantics, + // http://dev.w3.org/html5/html-author/#text-level-semantics and https://wiki.whatwg.org/wiki/Presentational_elements_and_attributes + var presentationalElements = ["abbr", "b", "bdi", "bdo", "br", "cite", "code", "data", "dfn", + "em", "i", "kbd", "mark", "q", "rp", "rt", "rtc", "ruby", "s", + "samp", "small", "span", "strong", "sub", "sup", "time", "u", + "var", "wbr", "a", "progress", "meter", "basefont", "big", "center", + "strike", "tt", "font", "blink", "h1", "h2", "h3", "h4", "h5", "h6", + "hr", "blockquote", "p" + ]; + return CommonUtil_1.CommonUtil.valInArray(node.nodeName.toLowerCase(), presentationalElements); + }; + /** + * return the ancestor of the given element and role. + * + * @parm {element} element - The element to start the node walk on to find parent node + * @parm {string} role - The role to search for on an element under the provided element + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {node} walkNode - A parent node of the element passed in, which has the provided role + * + * @memberOf AriaUtil + */ + AriaUtil.getAncestorWithRole = function (element, roleName, considerImplicitRoles) { + var walkNode = DOMWalker_1.DOMWalker.parentNode(element); + while (walkNode !== null) { + if (considerImplicitRoles) { + if (AriaUtil.hasRoleInSemantics(walkNode, roleName)) { + break; + } + } + else { + if (AriaUtil.hasRole(walkNode, roleName, false)) { + break; + } + } + walkNode = DOMWalker_1.DOMWalker.parentNode(walkNode); + } + return walkNode; + }; + /** + * return the ancestor of the given element and roles. + * + * @parm {element} element - The element to start the node walk on to find parent node + * @parm {array} roles - the role names to search for + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {node} walkNode - A parent node of the element passed in, which has the provided role + * + * @memberOf AriaUtil + */ + AriaUtil.getAncestorWithRoles = function (element, roleNames) { + if (!element || !roleNames || !roleNames.length || roleNames.length === 0) + return null; + var walkNode = element; + while (walkNode !== null) { + var role = AriaUtil.getResolvedRole(walkNode); + if (role !== null && + (roleNames.includes(role) || + (roleNames.includes("*") && !["presentation", "none"].includes(role)))) + return walkNode; + walkNode = DOMWalker_1.DOMWalker.parentNode(walkNode); + } + return null; + }; + /** + * return the roles with given role type. + * + * @parm {element} element - The element to start the node walk on to find parent node + * @parm {array} roleTyples - role types, such as 'widget', 'structure' etc. + * + * @return {array} roles - A parent node of the element passed in, which has the provided role + * + * @memberOf AriaUtil + */ + AriaUtil.getRolesWithTypes = function (element, types) { + if (!element || !types || !types.length || types.length === 0) + return null; + var roles = CacheUtil_1.CacheUtil.getCache(element.ownerDocument, "roles_with_given_types", null); + if (!roles || roles.length === 0) { + roles = []; + Object.entries(ARIADefinitions_1.ARIADefinitions.designPatterns).forEach(function (_a) { + var key = _a[0], value = _a[1]; + if (types.includes(value.roleType)) + roles.push(key); + }); + CacheUtil_1.CacheUtil.setCache(element.ownerDocument, "roles_with_given_types", roles); + } + return roles; + }; + /** + * return the roles with given role type. + * + * @parm {element} element - The element to start the node walk on to find parent node + * @parm {array} roleTyples - role types, such as 'widget', 'structure' etc. + * + * @return {array} roles - A parent node of the element passed in, which has the provided role + * + * @memberOf AriaUtil + */ + AriaUtil.isWidget = function (element) { + if (!element) + return false; + var widget = CacheUtil_1.CacheUtil.getCache(element.ownerDocument, "is_element_widget", null); + if (widget === null) { + var ret = false; + var role = AriaUtil.getResolvedRole(element); + if (role && ARIADefinitions_1.ARIADefinitions.designPatterns[role] && ARIADefinitions_1.ARIADefinitions.designPatterns[role].roleType === 'widget') + ret = true; + CacheUtil_1.CacheUtil.setCache(element.ownerDocument, "is_element_widget", ret); + return ret; + } + return widget; + }; + /** + * return if the element is owned or controlled by another element. + * If an ancestor of an element is owned or controlled by another element, then the element is also considered as owned or controlled. + * an element can be owned or controlled by another element through aria-owns or aria-controls + * when the DOM hierarchy cannot be used to represent the relationship. + * aria-owns attribute is used to define contextual relationship with a owning parent + * aria-controls attribute is used to associate an element with the controlling element. + * example elements with roles: combobox, scrollbar, tab, button, listbox, menu, menubar, radiogroup, tree, treegrid + * + * when an element is owned or controlled by another element, its navigation may be controlled by the parent + * through aria-activedescendants attribute or roving tabindex + * + * Note navigation with native combobox (input with a datalist) is in native focus navigation, not considered here + * + * @parm {element} element - The element to inspect + * @return {boolean} + * + * @memberOf AriaUtil + */ + AriaUtil.isNavigationOwnedOrControlled = function (element) { + if (!element) + return false; + var ownerElems = CacheUtil_1.CacheUtil.getCache(element.ownerDocument, "AriaUtil_NavigationOwnedOrControlled", null); + if (ownerElems !== null && ownerElems.length > 0) { + if (CommonUtil_1.CommonUtil.getAncestor(element, ownerElems)) + return true; + } + var role = AriaUtil.getResolvedRole(element); + if (!role) + return false; + var id = element.getAttribute("id"); + if (!id || id.trim().length === 0) + return false; + var elem = element.ownerDocument.querySelector("*[aria-controls~='".concat(id, "'], *[aria-owns~='").concat(id, "']")); + if (!elem) + return false; + var containers = ['combobox', 'scrollbar', 'button', 'tab', 'listbox', 'menu', 'menubar', 'radiogroup', 'tree', 'treegrid']; + if (containers.includes(role)) { + if (ownerElems === null) + ownerElems = []; + ownerElems.push(element); + CacheUtil_1.CacheUtil.setCache(element.ownerDocument, "AriaUtil_NavigationOwnedOrControlled", ownerElems); + return true; + } + return false; + }; + /** + * This function is responsible for finding a node which matches the role and is a sibling of the + * provided element. + * + * This function by default will not consider Check Hidden Setting at all. + * + * Note: This is a wrapper function to: AriaUtil.getSiblingWithRoleHidden + * + * @parm {element} element - The element to start the node walk on to find sibling node + * @parm {string} role - The role to search for on an element under the provided element + * + * @return {node} walkNode - A sibling node of the element passed in, which has the provided role + * + * @memberOf AriaUtil + */ + AriaUtil.getSiblingWithRole = function (element, role) { + return AriaUtil.getSiblingWithRoleHidden(element, role, false); + }; + /** + * This function is responsible for finding a node which matches the role and is a sibling of the + * provided element. + * + * This function also considers implicit roles for the elements. + * + * This function will also consider elements that are hidden based on the if the Check + * Hidden Content settings should be considered or not. + * + * @parm {element} element - The element to start the node walk on to find sibling node + * @parm {string} role - The role to search for on an element under the provided element + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * @parm {bool} considerImplicit - true or false based on if Implicit roles should be considered. + * + * @return {node} walkNode - A sibling node of the element passed in, which has the provided role + * + * @memberOf AriaUtil + */ + AriaUtil.getSiblingWithRoleHidden = function (element, role, considerHiddenSetting, considerImplicitRole) { + // Variable Declaration + var walkNode = null; + var hasRole = false; + // Only perform the check if element and role are both provided + if (element && role) { + // Fetch the next sibling element + walkNode = element.nextSibling; + // Keep looping over the next siblings to find element which matches + // the provided role. + while (walkNode !== null && !hasRole) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (considerHiddenSetting && CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(walkNode)) { + // Move on to the next node + walkNode = walkNode.nextSibling; + continue; + } + // Check if this node has the role that we need to check exists + if (considerImplicitRole) { + hasRole = AriaUtil.hasRoleInSemantics(walkNode, role); + } + else { + hasRole = AriaUtil.hasRole(walkNode, role, false); + } + // Move on to the next node + walkNode = walkNode.nextSibling; + } + // If we still have not found a node that matches the role, start a reverse look up + if (!walkNode) { + // Fetch the previous Sibling of this element + walkNode = element.previousSibling; + // Keep looping over all the previous siblings to search for an element which + // matches the provided role. + while (walkNode !== null && !hasRole) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (considerHiddenSetting && CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(walkNode)) { + // Move on to the next node + walkNode = walkNode.previousSibling; + continue; + } + // Check if this node has the role that we need to check exists + hasRole = AriaUtil.hasRole(walkNode, role, considerImplicitRole); + // Move on to the next node + walkNode = walkNode.previousSibling; + } + } + } + return walkNode; + }; + /** + * This function is responsible for getting a descendant element with the specified role, under + * the element that was provided. + * + * Note by default this function will not consider the Check Hidden Content Setting. + * + * Note: This is a wrapper function to: AriaUtil.getDescendantWithRoleHidden + * + * @parm {element} element - parent element for which we will be checking descendants for + * @parm {string} roleName - The role to look for on the descendant's elements + * + * @return {node} - The descendant element that matches the role specified (only one) + * + * @memberOf AriaUtil + */ + AriaUtil.getDescendantWithRole = function (element, roleName) { + return AriaUtil.getDescendantWithRoleHidden(element, roleName, false); + }; + /** + * This function is responsible for getting a descendant element with the specified role, under + * the element that was provided. This function aslo finds elements with implicit roles. + * + * @parm {element} element - parent element for which we will be checking descendants for + * @parm {string} roleName - The role to look for on the descendant's elements + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {node} - The descendant element that matches the role specified (only one) + * + * @memberOf AriaUtil + */ + AriaUtil.getDescendantWithRoleHidden = function (element, roleName, considerHiddenSetting, considerImplicitRoles) { + // Variable Decleration + var descendant = null; + var nw = new DOMWalker_1.DOMWalker(element); + // Loop over all the childrens of the element provided and check if the rolename provided exists + while (nw.nextNode() && nw.node != element && nw.node != element.nextSibling) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (considerHiddenSetting && CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(nw.node)) { + continue; + } + // Check if this node has the role specified, if it does then set this as the descendant and stop checking the rest of the + // nodes. + // Check if this node has the implicit roles, if it does then set this as the descendant and stop checking the rest of the + // nodes. + if (considerImplicitRoles ? AriaUtil.hasRoleInSemantics(nw.node, roleName) : AriaUtil.hasRole(nw.node, roleName, false)) { + descendant = nw.node; + break; + } + } + return descendant; + }; + /** + * This function is responsible for getting All descendant elements with the specified roles, under + * the element that was provided. This function aslo finds elements with implicit roles. + * + * @parm {element} element - parent element for which we will be checking descendants for + * @parm {string[]} roleNames - The roles to look for on the descendant's elements + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {node[]} - all descendant elements that match the roles specified + * + * @memberOf AriaUtil + */ + AriaUtil.getAllDescendantsWithRoles = function (element, roleNames, considerHiddenSetting, considerImplicitRoles) { + if (!roleNames || roleNames.length === 0) + return; + // Variable Decleration + var descendants = []; + roleNames.forEach(function (roleName) { + var kids = AriaUtil.getAllDescendantsWithRoleHidden(element, roleName, considerHiddenSetting, considerImplicitRoles); + if (kids && kids.length > 0) + descendants = descendants.concat(kids); + }); + return descendants; + }; + /** + * This function is responsible for getting All descendant elements with the specified role, under + * the element that was provided. This function aslo finds elements with implicit roles. + * + * @parm {element} element - parent element for which we will be checking descendants for + * @parm {string} roleName - The role to look for on the descendant's elements + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {node[]} - The descendant elements that match the role specified + * + * @memberOf AriaUtil + */ + AriaUtil.getAllDescendantsWithRoleHidden = function (element, roleName, considerHiddenSetting, considerImplicitRoles) { + // Variable Decleration + var descendants = []; + var nw = new DOMWalker_1.DOMWalker(element); + // Loop over all the childrens of the element provided and check if the rolename provided exists + while (nw.nextNode() && nw.node != element && nw.node != element.nextSibling) { + if (nw.bEndTag) { + continue; + } + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (considerHiddenSetting && CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(nw.node)) { + continue; + } + // Check if this node has the role specified, if it does then set this as the descendant and stop checking the rest of the + // nodes. + // Check if this node has the implicit roles, if it does then set this as the descendant and stop checking the rest of the + // nodes. + if (AriaUtil.hasRole(nw.node, roleName, considerImplicitRoles)) { + descendants.push(nw.node); + } + } + return descendants; + }; + /** + * This function is responsible for getting All direct children in AT tree with a role (exclude none and presentation) + * + * @parm {element} element - parent element for which we will be checking children for + * @return {node} - The direct child elements in AT tree that has a role + * + * @memberOf AriaUtil + */ + AriaUtil.getDirectATChildren = function (element) { + var requiredChildRoles = AriaUtil.getRequiredChildRoles(element, true); + var direct = []; + AriaUtil.retrieveDirectATChildren(element, requiredChildRoles, direct); + return direct; + }; + /** + * This function is responsible for recursively any child path till either no child or a child with a role is found (exclude none and presentation) + * + * @parm {element} element - parent element for which we will be checking children for + * @return {node} - The direct child elements in AT tree + * + * @memberOf AriaUtil + */ + AriaUtil.retrieveDirectATChildren = function (element, requiredChildRoles, direct) { + var children = []; + if (element.children !== null && element.children.length > 0) { + for (var i = 0; i < element.children.length; i++) { + children.push(element.children[i]); + } + } + // if the element contains "aria-own" attribute, then the aria-owned children need to be included too + var owned = element.getAttribute("aria-owns"); + if (owned) { + var doc = element.ownerDocument; + if (doc) { + var ownedIds = owned.split(" "); + for (var i = 0; i < ownedIds.length; i++) { + var ownedElem = doc.getElementById(ownedIds[i]); + if (ownedElem) { + children.push(ownedElem); + } + } + } + } + if (children.length > 0) { + for (var i = 0; i < children.length; i++) { + //ignore hidden and invisible child + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(children[i]) || !VisUtil_1.VisUtil.isNodeVisible(children[i])) + continue; + var roles = AriaUtil.getRoles(children[i], false); + if (roles === null || roles.length === 0) { + roles = AriaUtil.getImplicitRole(children[i]); + } + if (roles && roles !== null && roles.length > 0) { + //remove 'none' and 'presentation' + roles = roles.filter(function (role) { + return role !== "none" && role !== "presentation"; + }); + // a 'group' role is allowed but not required for some elements so remove it if exists + if (roles.includes("group") && requiredChildRoles && requiredChildRoles.includes('group')) { + roles = roles.filter(function (role) { + return role !== 'group'; + }); + } + } + if (roles && roles !== null && roles.length > 0) { + direct.push(children[i]); + } + else { + // recursive until get a return value, + AriaUtil.retrieveDirectATChildren(children[i], requiredChildRoles, direct); + } + } + return null; + } + else + return null; + }; + /** + * this function returns null or required child roles for a given element with one more roles, + * return null if the role is 'none' or 'presentation' + * @param element + * @param includeImplicit include implicit roles if no role is explicitly provided + * @returns + */ + AriaUtil.getRequiredChildRoles = function (element, includeImplicit) { + var roles = AriaUtil.getRoles(element, false); + // if explicit role doesn't exist, get the implicit one + if ((!roles || roles.length === 0) && includeImplicit) { + roles = AriaUtil.getImplicitRole(element); + } + /** + * ignore if the element doesn't have any explicit or implicit role + */ + if (!roles || roles.length === 0) { + return null; + } + /** + * ignore if the element contains none or presentation role + */ + var presentationRoles = ["none", "presentation"]; + var found = roles.some(function (r) { return presentationRoles.includes(r); }); + if (found) + return null; + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + var requiredChildRoles = new Array(); + for (var j = 0; j < roles.length; ++j) { + if (designPatterns[roles[j]] && designPatterns[roles[j]].reqChildren !== null) { + requiredChildRoles = CommonUtil_1.CommonUtil.concatUniqueArrayItemList(designPatterns[roles[j]].reqChildren, requiredChildRoles); + } + } + return requiredChildRoles; + }; + /** + * This function is responsible for getting an element referenced by aria-owns and has the + * role that was specified. + * + * Note by default this function will not consider the Check Hidden Content Setting. + * + * Note: This is a wrapper function to: AriaUtil.getAriaOwnsWithRoleHidden + * + * @parm {element} element - Element to check for aria-owns + * @parm {string} roleName - The role to look for on the aria-owns element + * + * @return {node} - The element that is referenced by aria-owns and has role specified. + * + * @memberOf AriaUtil + */ + AriaUtil.getAriaOwnsWithRole = function (element, roleName) { + return AriaUtil.getAriaOwnsWithRoleHidden(element, roleName, false); + }; + /** + * This function is responsible for getting an element referenced by aria-owns and has the + * role that was specified. This function aslo finds elements with implicit roles. + * + * @parm {element} element - Element to check for aria-owns + * @parm {string} roleName - The role to look for on the aria-owns element + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {node} - The element that is referenced by aria-owns and has role specified. + * + * @memberOf AriaUtil + */ + AriaUtil.getAriaOwnsWithRoleHidden = function (element, roleName, considerHiddenSetting, considerImplicitRoles) { + // Variable Decleration + var referencedElement = null; + var referencedElemHasRole = false; + // In the case aria-owns is not on the element just break out of this function with null + if (CommonUtil_1.CommonUtil.attributeNonEmpty(element, "aria-owns")) { + // Get the reference ID + var referenceID = element.getAttribute("aria-owns"); + // Get the element for the reference ID + referencedElement = fragment_1.FragmentUtil.getById(element, referenceID); + //ignore if the aria-owns point to the element itself + if (DOMUtil_1.DOMUtil.sameNode(element, referencedElement)) + return null; + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + if (considerHiddenSetting && referencedElement != null && CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(referencedElement)) { + referencedElemHasRole = null; + } + else { + referencedElemHasRole = AriaUtil.hasRole(referencedElement, roleName, considerImplicitRoles); + } + } + return referencedElemHasRole ? referencedElement : null; + }; + // Return true if the element has an ARIA label + AriaUtil.hasAriaLabel = function (element) { + // Rpt_Aria_ValidIdRef determines if the aria-labelledby id points to a valid element + return CommonUtil_1.CommonUtil.attributeNonEmpty(element, "aria-label") || CommonUtil_1.CommonUtil.attributeNonEmpty(element, "aria-labelledby"); + }; + // Given an array of elements, return true if the elements have unique ARIA labels + AriaUtil.hasUniqueAriaLabelsLocally = function (elements, isGlobal) { + if (elements.length === 0) + return false; + var doc = elements[0].ownerDocument; + var hasDuplicateLabels = false; + var uniqueAriaLabels = null; + if (isGlobal) { + uniqueAriaLabels = CacheUtil_1.CacheUtil.getCache(doc, "AriaUtil_HAS_UNIQUE_ARIA_LABELS", null); + } + if (uniqueAriaLabels === null) { + uniqueAriaLabels = {}; + } + for (var i = 0; !hasDuplicateLabels && i < elements.length; ++i) { + if (elements[i].hasAttribute) { + if (elements[i].hasAttribute("aria-label")) { + var ariaLabel = CommonUtil_1.CommonUtil.normalizeSpacing(elements[i].getAttribute("aria-label")).toLowerCase(); + hasDuplicateLabels = ariaLabel in uniqueAriaLabels; + uniqueAriaLabels[ariaLabel] = true; + } + else if (elements[i].hasAttribute("aria-labelledby")) { + var labelID = elements[i].getAttribute("aria-labelledby"); + var labelNode = fragment_1.FragmentUtil.getById(elements[i], labelID); + var label = ""; + if (labelNode && !DOMUtil_1.DOMUtil.sameNode(labelNode, elements[i])) { + label = AriaUtil.getTextContentExcludingScripts(labelNode); + } + var normalizedLabel = CommonUtil_1.CommonUtil.normalizeSpacing(label).toLowerCase(); + hasDuplicateLabels = normalizedLabel in uniqueAriaLabels; + uniqueAriaLabels[normalizedLabel] = true; + } + else { + // Has no label at all + hasDuplicateLabels = true; + } + } + } + if (isGlobal) { + CacheUtil_1.CacheUtil.setCache(doc, "AriaUtil_HAS_UNIQUE_ARIA_LABELS", uniqueAriaLabels); + } + return !hasDuplicateLabels; + }; + /** + * Get text content from an element, excluding script and style elements + * This is a simplified version that doesn't go through full accessible name computation + * to avoid circular dependencies when called from getAriaLabel + * + * Note: When an element is referenced by aria-labelledby, its content is included + * even if the element is hidden (per ARIA spec) + */ + AriaUtil.getTextContentExcludingScripts = function (elem) { + if (!elem) + return ""; + var text = ""; + var nw = new DOMWalker_1.DOMWalker(elem); + while (nw.nextNode() && nw.node !== elem && nw.node !== elem.parentNode) { + if (nw.bEndTag) + continue; + var node = nw.node; + var nodeName = node.nodeName ? node.nodeName.toLowerCase() : ""; + // Skip script and style elements + if (nodeName === 'script' || nodeName === 'style') { + nw.bEndTag = true; // Skip children + continue; + } + if (node.nodeType === 3) { // Text node + // Include text even from hidden elements when referenced by aria-labelledby + if (node.nodeValue && node.nodeValue.trim().length > 0) { + text += " " + node.nodeValue.trim(); + } + } + else if (node.nodeType === 1) { // Element node + // Handle images - get alt text + if (nodeName === 'img' && node.hasAttribute('alt')) { + text += " " + node.getAttribute('alt').trim(); + nw.bEndTag = true; // Skip children of img + } + // Handle input with type="image" - get alt text + else if (nodeName === 'input' && node.getAttribute('type') === 'image' && node.hasAttribute('alt')) { + text += " " + node.getAttribute('alt').trim(); + nw.bEndTag = true; // Skip children + } + } + } + return text.trim(); + }; + AriaUtil.getAriaLabel = function (ele) { + if (ele.hasAttribute) { + if (ele.hasAttribute("aria-labelledby")) { + var labelIDs = ele.getAttribute("aria-labelledby").trim().split(" "); + var normalizedLabel = ""; + for (var j = 0, length_1 = labelIDs.length; j < length_1; ++j) { + var labelID = labelIDs[j]; + var labelNode = fragment_1.FragmentUtil.getById(ele, labelID); + if (labelNode && !DOMUtil_1.DOMUtil.sameNode(labelNode, ele)) { + // Use our helper to get text content without circular dependency + var label = AriaUtil.getTextContentExcludingScripts(labelNode); + normalizedLabel += CommonUtil_1.CommonUtil.normalizeSpacing(label); + } + } + return normalizedLabel.trim(); + } + else if (ele.hasAttribute("aria-label")) { + return CommonUtil_1.CommonUtil.normalizeSpacing(ele.getAttribute("aria-label")).trim(); + } + } + return ""; + }; + AriaUtil.getAriaDescription = function (ele) { + if (!ele) + return ""; + var normalizedLabel = ""; + var desc = ele.getAttribute("aria-labelledby"); + if (desc && desc.trim().length > 0) { + var labelIDs = desc.trim().split(" "); + for (var j = 0, length_2 = labelIDs.length; j < length_2; ++j) { + var labelID = labelIDs[j]; + var labelNode = fragment_1.FragmentUtil.getById(ele, labelID); + if (labelNode && !DOMUtil_1.DOMUtil.sameNode(labelNode, ele)) { + var label = AriaUtil.getTextContentExcludingScripts(labelNode); + if (label && label.trim().length > 0) + normalizedLabel += CommonUtil_1.CommonUtil.normalizeSpacing(label).toLowerCase(); + } + } + if (normalizedLabel.trim().length > 0) + return normalizedLabel.trim(); + } + desc = ele.getAttribute("aria-description"); + if (desc && desc.trim().length > 0) + return desc.trim().toLowerCase(); + return ""; + }; + AriaUtil.findAriaLabelDupes = function (elements) { + var dupeMap = {}; + elements.forEach(function (ele) { + dupeMap[AriaUtil.getAriaLabel(ele)] = (dupeMap[AriaUtil.getAriaLabel(ele)] || 0) + 1; + }); + return dupeMap; + }; + /** + * return accessible names for all AT visible landmark elements + * @param doc + * @returns + */ + AriaUtil.getLandmarkAccNames = function (doc) { + var nameMap = CacheUtil_1.CacheUtil.getCache(doc, "AriaUtil_Landmark_AccNames", null); + if (nameMap && nameMap.length !== 0) + return nameMap; + nameMap = []; + var landmarkElems = doc.querySelectorAll('aside,[role="complementary"], footer,[role="contentinfo"], header,[role="banner"], main,[role="main"], nav,[role="navigation"], form,[role="form"], section,[role="region"], article,[role="article"], [role="search"],[role="application"],[role="document"]'); + if (landmarkElems.length === 0) { + CacheUtil_1.CacheUtil.setCache(doc, "AriaUtil_Landmark_AccNames", nameMap); + return nameMap; + } + landmarkElems.forEach(function (elem) { + // ignore node that is AT hidden or in a dialog that is considered as a separate location from the rest of the main page + if (!VisUtil_1.VisUtil.isNodeHiddenFromAT(elem) && CommonUtil_1.CommonUtil.getAncestor(elem, ["DIALOG"]) === null && AriaUtil.getAncestorWithRole(elem, "dialog", true) === null) { + var name_1 = ""; + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(elem); + if (pair && pair.name && pair.name.trim().length > 0) + name_1 = pair.name.trim(); + // check neested landmark to calculate the accessible name + var ancestors = __spreadArray([], landmarkElems, true).filter(function (e) { return e.contains(elem) && e !== elem; }); + if (ancestors.length > 1) { + ancestors.forEach(function (ancestor) { + var ancestor_pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ancestor); + if (ancestor_pair && ancestor_pair.name && ancestor_pair.name.trim().length > 0) + name_1 = ancestor_pair.name.trim() + " " + name_1; + }); + } + var role = AriaUtil.getResolvedRole(elem); + nameMap.push({ "elem": elem, "role": role, "name": name_1 }); + } + }); + CacheUtil_1.CacheUtil.setCache(doc, "AriaUtil_Landmark_AccNames", nameMap); + return nameMap; + }; + /** + * check if the given element with the landmark rolw is unique + * @param element + * @param role: a specific landmark role, or "any" for all landmark role + * @param considerNoneLabel: if consider the landmarks without a label + * @returns + */ + AriaUtil.isLandmarkNameUnique = function (element, role, considerNoneLabel) { + if (considerNoneLabel === void 0) { considerNoneLabel = false; } + var nameMap = AriaUtil.getLandmarkAccNames(element.ownerDocument); + var exist = null; + if (role === 'any') + exist = nameMap.find(function (entry) { return entry.elem === element; }); + else + exist = nameMap.find(function (entry) { return entry.elem === element && entry.role === role; }); + if (!exist) + return null; + var name = exist.name; + if (!considerNoneLabel && name === '') + return null; + for (var i = 0; i < nameMap.length; i++) { + if (nameMap[i].elem === element) + continue; + if (name === nameMap[i].name) { + if (role === 'any') + return true; + else if (nameMap[i].role === role) + return true; + } + } + return false; + }; + // Given an array of elements, return true if the elements have unique ARIA labels globally + AriaUtil.hasUniqueAriaLabels = function (elements) { + return AriaUtil.hasUniqueAriaLabelsLocally(elements, true); + }; + // Given an array of elements, return true if the elements have unique ARIA labels + AriaUtil.hasDuplicateAriaLabelsLocally = function (elements, isGlobal) { + if (elements.length === 0) + return false; + var doc = elements[0].ownerDocument; + var hasDuplicateLabels = false; + var uniqueAriaLabels = null; + var duplicateLabelNameArray = new Array(); + if (isGlobal) { + uniqueAriaLabels = CacheUtil_1.CacheUtil.getCache(doc, "AriaUtil_HAS_UNIQUE_ARIA_LABELS", null); + } + if (uniqueAriaLabels === null) { + uniqueAriaLabels = {}; + } + for (var i = 0; i < elements.length; ++i) { + if (elements[i].hasAttribute) { + if (elements[i].hasAttribute("aria-label")) { + var ariaLabel = CommonUtil_1.CommonUtil.normalizeSpacing(elements[i].getAttribute("aria-label")).toLowerCase(); + hasDuplicateLabels = ariaLabel in uniqueAriaLabels; + uniqueAriaLabels[ariaLabel] = true; + if (!(ariaLabel in duplicateLabelNameArray)) { + duplicateLabelNameArray[ariaLabel] = new Array(); + } + duplicateLabelNameArray[ariaLabel].push(elements[i].nodeName.toLowerCase()); + } + else if (elements[i].hasAttribute("aria-labelledby")) { + var labelIDs = elements[i].getAttribute("aria-labelledby").trim().split(" "); + var normalizedLabel = ""; + for (var j = 0, length_3 = labelIDs.length; j < length_3; ++j) { + var labelID = labelIDs[j]; + var labelNode = fragment_1.FragmentUtil.getById(elements[i], labelID); + if (labelNode && !DOMUtil_1.DOMUtil.sameNode(labelNode, elements[i])) { + var label = AriaUtil.getTextContentExcludingScripts(labelNode); + normalizedLabel += CommonUtil_1.CommonUtil.normalizeSpacing(label).toLowerCase(); + } + } + hasDuplicateLabels = normalizedLabel in uniqueAriaLabels; + uniqueAriaLabels[normalizedLabel] = true; + if (!(normalizedLabel in duplicateLabelNameArray)) { + duplicateLabelNameArray[normalizedLabel] = new Array(); + } + duplicateLabelNameArray[normalizedLabel].push(elements[i].nodeName.toLowerCase()); + } + } + } + if (isGlobal) { + CacheUtil_1.CacheUtil.setCache(doc, "AriaUtil_HAS_UNIQUE_ARIA_LABELS", uniqueAriaLabels); + } + return duplicateLabelNameArray; + }; + // Given an array of elements, return true if the elements have unique ARIA labels globally + AriaUtil.hasDuplicateAriaLabels = function (elements) { + return AriaUtil.hasDuplicateAriaLabelsLocally(elements, true); + }; + // Given an array of elements, return true if the elements have unique aria-labelledby attributes + AriaUtil.hasUniqueAriaLabelledby = function (elements) { + var hasDuplicateLabels = false; + var labelRefs = {}; + for (var i = 0; !hasDuplicateLabels && i < elements.length; ++i) { + if (elements[i].hasAttribute && elements[i].hasAttribute("aria-labelledby") && !CommonUtil_1.CommonUtil.isIdReferToSelf(elements[i], elements[i].getAttribute("aria-labelledby"))) { + var labelRef = CommonUtil_1.CommonUtil.normalizeSpacing(elements[i].getAttribute("aria-labelledby")); + hasDuplicateLabels = labelRef in labelRefs; + labelRefs[labelRef] = true; + } + else { + hasDuplicateLabels = true; + } + } + return !hasDuplicateLabels; + }; + /** + * this function is responsible for resolving ARIA requirements for an HTML element per ARIA in HTML + * @param ruleContext the HTML element to be examined + * @returns + */ + AriaUtil.getElementAriaProperty = function (ruleContext) { + var tagProperty = CacheUtil_1.CacheUtil.getCache(ruleContext, "AriaUtil_ElementAriaProperty", null); + if (!tagProperty) { + var tagName = null; + var name_2 = null; + if (ruleContext.tagName) { + tagName = ruleContext.tagName.toLowerCase(); + } + else if (ruleContext.nodeName) { + tagName = ruleContext.nodeName.toLowerCase(); + } + // check if the tagProperty exists in the documentConformanceRequirement hash. + tagProperty = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirement[tagName]; + // The tag needs to check some special attributes + if (tagProperty === null || tagProperty === undefined) { + var specialTagProperties = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirementSpecialTags[tagName]; + switch (tagName) { // special cases + case "a": + ruleContext.hasAttribute("href") ? tagProperty = specialTagProperties["with-href"] : tagProperty = specialTagProperties["without-href"]; + break; + case "area": + ruleContext.hasAttribute("href") ? tagProperty = specialTagProperties["with-href"] : tagProperty = specialTagProperties["without-href"]; + break; + case "figure": { + var fcs = CommonUtil_1.CommonUtil.getChildByTag(ruleContext, "figcaption"); + fcs !== null && fcs.length > 0 ? tagProperty = specialTagProperties["child-figcaption"] : tagProperty = specialTagProperties["no-child-figcaption"]; + break; + } + case "footer": + case "header": + if (AriaUtil.getAncestorWithRole(ruleContext, "article", true) !== null || AriaUtil.getAncestorWithRole(ruleContext, "complementary", true) !== null + || AriaUtil.getAncestorWithRole(ruleContext, "navigation", true) !== null || AriaUtil.getAncestorWithRole(ruleContext, "region", true) !== null + || CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["article", "aside", "main", "nav", "section"]) !== null) + tagProperty = specialTagProperties["des-section-article-aside-main-nav"]; + else + tagProperty = specialTagProperties["other"]; + break; + case "img": + var alt = ruleContext.hasAttribute("alt") ? ruleContext.getAttribute("alt") : null; + var title = ruleContext.hasAttribute("title") ? ruleContext.getAttribute("title") : null; + if (AriaUtil.getAriaLabel(ruleContext).trim().length !== 0 || (alt !== null && alt.length > 0) || (title !== null && title.length > 0)) { + // If the img has non-empty alt (alt="some text" or alt=" ") or an accessible name is provided + tagProperty = specialTagProperties["img-with-accname"]; + } + else { + if (alt !== null) { + // If the img has an empty alt (alt="") + tagProperty = specialTagProperties["img-without-accname-empty-alt"]; + } + else { + // If the img lacks an alt attribute + tagProperty = specialTagProperties["img-without-accname-no-alt"]; + } + } + break; + case "input": + if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "type")) { + var type = ruleContext.getAttribute("type").trim().toLowerCase(); + tagProperty = specialTagProperties[type]; + if (tagProperty === null || tagProperty === undefined) { + switch (type) { + case "checkbox": + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "aria-pressed") ? tagProperty = specialTagProperties["checkbox-with-aria-pressed"] : tagProperty = specialTagProperties["checkbox-without-aria-pressed"]; + break; + case "email": + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["email-with-list"] : tagProperty = specialTagProperties["email-no-list"]; + break; + case "search": + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["search-with-list"] : tagProperty = specialTagProperties["search-no-list"]; + break; + case "tel": + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["tel-with-list"] : tagProperty = specialTagProperties["tel-no-list"]; + break; + case "text": + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["text-with-list"] : tagProperty = specialTagProperties["text-no-list"]; + break; + case "url": + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["url-with-list"] : tagProperty = specialTagProperties["url-no-list"]; + break; + default: + // default + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["default-with-list"] : tagProperty = specialTagProperties["default-no-list"]; + break; + } + } + } + else { + // default type is the same as type=text + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["text-with-list"] : tagProperty = specialTagProperties["text-no-list"]; + } + break; + case "li": + specialTagProperties = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirementSpecialTags["li"]; + if (ruleContext.parentElement && AriaUtil.hasRoleInSemantics(ruleContext.parentElement, "list")) + tagProperty = specialTagProperties["child-of-list-role"]; + else + tagProperty = specialTagProperties["no-child-of-list-role"]; + break; + case "section": + //name = ARIAMapper.computeName(ruleContext); + //if (name && name.trim().length > 0) { + var label = AriaUtil.getAriaLabel(ruleContext); + if ((label && label.trim().length > 0) || CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "title")) { + tagProperty = specialTagProperties["with-name"]; + } + else { + tagProperty = specialTagProperties["without-name"]; + } + break; + case "select": + specialTagProperties = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirementSpecialTags["select"]; + if (ruleContext.hasAttribute("multiple") || + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "size") && ruleContext.getAttribute("size") > 1) + tagProperty = specialTagProperties["multiple-attr-size-gt1"]; + else + tagProperty = specialTagProperties["no-multiple-attr-size-gt1"]; + break; + case "summary": + specialTagProperties = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirementSpecialTags["summary"]; + if (ruleContext.parentElement && ruleContext.parentElement.nodeName.toLowerCase() === 'details' + && DOMUtil_1.DOMUtil.sameNode(__spreadArray([], ruleContext.parentElement.children, true).filter(function (elem) { return elem.nodeName.toLowerCase() === 'summary'; })[0], ruleContext)) + tagProperty = specialTagProperties["first-summary-of-detail"]; + else + tagProperty = specialTagProperties["no-first-summary-of-detail"]; + break; + case "tbody": + case "td": + case "tr": + if (AriaUtil.getAncestorWithRole(ruleContext, "table", true) !== null) { + tagProperty = specialTagProperties["des-table"]; + } + else { + AriaUtil.getAncestorWithRole(ruleContext, "grid", true) || AriaUtil.getAncestorWithRole(ruleContext, "treegrid", true) ? tagProperty = specialTagProperties["des-grid"] : tagProperty = specialTagProperties["des-other"]; + } + break; + case "th": + var scope = CommonUtil_1.CommonUtil.getScopeForTh(ruleContext); + if (AriaUtil.getAncestorWithRole(ruleContext, "table", true) !== null) { + if (scope === 'column') + tagProperty = specialTagProperties["des-table-column-scope"]; + else + tagProperty = specialTagProperties["des-table-row-scope"]; + } + else if (AriaUtil.getAncestorWithRole(ruleContext, "grid", true) !== null || AriaUtil.getAncestorWithRole(ruleContext, "treegrid", true) !== null) { + if (scope === 'column') + tagProperty = specialTagProperties["des-grid-treegrid-column-scope"]; + else + tagProperty = specialTagProperties["des-grid-treegrid-row-scope"]; + } + else + tagProperty = specialTagProperties["des-other"]; + break; + case "div": + var prt = ruleContext.parentElement; + prt !== null && prt.nodeName.toLowerCase() === 'dl' ? tagProperty = specialTagProperties["child-dl"] : tagProperty = specialTagProperties["no-child-dl"]; + break; + default: + tagProperty = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirementSpecialTags["default"]; + } //switch + } + } + CacheUtil_1.CacheUtil.setCache(ruleContext, "AriaUtil_ElementAriaProperty", tagProperty); + return tagProperty || null; + }; + AriaUtil.getAllowedAriaRoles = function (ruleContext, properties) { + var allowedRoles = CacheUtil_1.CacheUtil.getCache(ruleContext, "AriaUtil_AllowedAriaRoles", null); + if (!allowedRoles) { + allowedRoles = []; + var tagProperty = null; + if (properties !== null && properties !== undefined) { + tagProperty = properties; + } + else { + tagProperty = AriaUtil.getElementAriaProperty(ruleContext); + } + if (tagProperty !== null && tagProperty !== undefined) { + if (tagProperty.implicitRole !== null) { + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(tagProperty.implicitRole, allowedRoles); + } + if (tagProperty.validRoles !== null) { + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(tagProperty.validRoles, allowedRoles); + } + var implicitRoles = AriaUtil.getImplicitRole(ruleContext); + if (implicitRoles && implicitRoles.length > 0) { + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(tagProperty.validRoles, allowedRoles); + } + } + CacheUtil_1.CacheUtil.setCache(ruleContext, "AriaUtil_AllowedAriaRoles", allowedRoles); + } + return allowedRoles; + }; + AriaUtil.getAllowedAriaAttributes = function (ruleContext, roles, properties) { + var allowedAttributes = CacheUtil_1.CacheUtil.getCache(ruleContext, "AriaUtil_AllowedAriaAttributes", null); + if (!allowedAttributes) { + allowedAttributes = []; + var permittedRoles = __spreadArray([], roles, true); + var tagName = ruleContext.tagName.toLowerCase(); + var prohibitedAttributes = []; + // Element with a disabled attribute https://www.w3.org/TR/html5/disabled-elements.html + if (ARIADefinitions_1.ARIADefinitions.elementsAllowedDisabled.indexOf(tagName) > -1) { + // Use the aria-disabled attribute on any element that is allowed the disabled attribute in HTML5. + allowedAttributes = CommonUtil_1.CommonUtil.concatUniqueArrayItem("aria-disabled", allowedAttributes); + } + // Element with a required attribute http://www.the-art-of-web.com/html/html5-form-validation/ + if (ARIADefinitions_1.ARIADefinitions.elementsAllowedRequired.indexOf(tagName) > -1) { + // Use the aria-required attribute on any element that is allowed the required attribute in HTML5. + allowedAttributes = CommonUtil_1.CommonUtil.concatUniqueArrayItem("aria-required", allowedAttributes); + } + if (ARIADefinitions_1.ARIADefinitions.elementsAllowedReadOnly.indexOf(tagName) > -1) { + // Use the aria-readonly attribute on any element that is allowed the readonly attribute in HTML5. + allowedAttributes = CommonUtil_1.CommonUtil.concatUniqueArrayItem("aria-readonly", allowedAttributes); + } + var tagProperty = null; + if (properties != null && properties !== undefined) + tagProperty = properties; + else + tagProperty = AriaUtil.getElementAriaProperty(ruleContext); + if (tagProperty !== null && tagProperty !== undefined) { + // add the implicit role allowed attributes to the allowed role list if there is no specified role + // ignore if the element doesn't allow the attributes from the implicit roles + if (tagProperty.implicitRole !== null && + (permittedRoles === null || permittedRoles === undefined || permittedRoles.length === 0) + && tagProperty.allowAttributesFromImplicitRole === undefined) { + for (var i = 0; i < tagProperty.implicitRole.length; i++) { + var roleProperty = ARIADefinitions_1.ARIADefinitions.designPatterns[tagProperty.implicitRole[i]]; + if (roleProperty !== null && roleProperty !== undefined) { + var properties_1 = roleProperty.props; + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(properties_1, allowedAttributes); + properties_1 = AriaUtil.getRoleRequiredProperties(tagProperty.implicitRole[i], ruleContext); + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(properties_1, allowedAttributes); + var prohibitedProps = roleProperty.prohibitedProps; + if (prohibitedProps && prohibitedProps.length > 0) + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(prohibitedProps, prohibitedAttributes); + // special case of separator + if (tagProperty.implicitRole[i] === "separator" && CommonUtil_1.CommonUtil.isFocusable(ruleContext)) { + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(["aria-disabled", "aria-valuenow", "aria-valuemax", "aria-valuemin", "aria-valuetext"], allowedAttributes); + } + } + } + } + // Adding the global properties to the valid attribute list + if (tagProperty.globalAriaAttributesValid) { + var properties_2 = ARIADefinitions_1.ARIADefinitions.globalProperties; // global properties + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(properties_2, allowedAttributes); + } + } + // adding the other role to the allowed roles for the attributes + if (tagProperty && tagProperty.otherRolesForAttributes && tagProperty.otherRolesForAttributes.length > 0) + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(tagProperty.otherRolesForAttributes, permittedRoles); + // adding the specified role properties to the allowed attribute list + for (var i = 0; permittedRoles !== null && i < permittedRoles.length; i++) { + var roleProperties = ARIADefinitions_1.ARIADefinitions.designPatterns[permittedRoles[i]]; + if (roleProperties !== null && roleProperties !== undefined) { + // ignore the properties if the element doesn't allow attributes from the implicit role + if (!tagProperty || tagProperty.implicitRole === null || !tagProperty.implicitRole.includes(permittedRoles[i]) || (tagProperty.implicitRole.includes(permittedRoles[i]) && tagProperty.allowAttributesFromImplicitRole === undefined)) { + var properties_3 = roleProperties.props; // allowed properties + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(properties_3, allowedAttributes); + properties_3 = AriaUtil.getRoleRequiredProperties(permittedRoles[i], ruleContext); // required properties + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(properties_3, allowedAttributes); + } + var prohibitedProps = roleProperties.prohibitedProps; + if (prohibitedProps && prohibitedProps.length > 0) + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(prohibitedProps, prohibitedAttributes); + // special case for separator + if (permittedRoles[i] === "separator" && CommonUtil_1.CommonUtil.isFocusable(ruleContext)) { + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(["aria-disabled", "aria-valuemax", "aria-valuemin", "aria-valuetext"], allowedAttributes); + } + } + } + // ignore aria-level, aria-setsize or aria-posinset if "row" is not in treegrid + if (permittedRoles.includes("row") && AriaUtil.getAncestorWithRole(ruleContext, "treegrid", true) == null) { + var index = -1; + if ((index = allowedAttributes.indexOf("aria-level")) > -1) + allowedAttributes.splice(index, 1); + if ((index = allowedAttributes.indexOf("aria-setsize")) > -1) + allowedAttributes.splice(index, 1); + if ((index = allowedAttributes.indexOf("aria-posinset")) > -1) + allowedAttributes.splice(index, 1); + } + // add the other allowed attributes for the element + if (tagProperty && tagProperty.otherAllowedAriaAttributes && tagProperty.otherAllowedAriaAttributes.length > 0) { + // check attribute-value pair if exists + var allowed = []; + for (var p = 0; p < tagProperty.otherAllowedAriaAttributes.length; p++) { + var attr = tagProperty.otherAllowedAriaAttributes[p]; + if (attr.includes("=")) { + var pair = attr.split("="); + if (ruleContext.getAttribute(pair[0]) === pair[1]) + allowed.push(pair[0]); + } + else + allowed.push(attr); + } + if (allowed.length > 0) + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(allowed, allowedAttributes); + } + // add the other prohibitted attributes for the element + if (tagProperty && tagProperty.otherDisallowedAriaAttributes && tagProperty.otherDisallowedAriaAttributes.length > 0) { + // check attribute-value pair if exists + var disallowed = []; + for (var p = 0; p < tagProperty.otherDisallowedAriaAttributes.length; p++) { + var attr = tagProperty.otherDisallowedAriaAttributes[p]; + if (attr.includes("=")) { + var pair = attr.split("="); + if (ruleContext.getAttribute(pair[0]) === pair[1]) + disallowed.push(pair[0]); + } + else + disallowed.push(attr); + } + if (disallowed.length > 0) + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(disallowed, prohibitedAttributes); + } + //exclude the prohibitedAttributes from the allowedAttributes + allowedAttributes = CommonUtil_1.CommonUtil.reduceArrayItemList(prohibitedAttributes, allowedAttributes); + //exclude aria attribute for elements without implicit role and with 'Naming Prohibited' + if ((!roles || roles.length === 0) && tagProperty.implicitRole === null && tagProperty.prohibitedAriaAttributesWhenNoImplicitRole) + allowedAttributes = CommonUtil_1.CommonUtil.reduceArrayItemList(tagProperty.prohibitedAriaAttributesWhenNoImplicitRole, allowedAttributes); + CacheUtil_1.CacheUtil.setCache(ruleContext, "AriaUtil_AllowedAriaAttributes", allowedAttributes); + } + return allowedAttributes; + }; + /** + * + * @param ariaAttr + * @param htmlAttrs + * @type: conflict or overlapping + * @returns htmlAttrName, 'Pass' or null + * htmlAttrName that conflicts with the ariaAttr, + * 'Pass' with no conflict with the ariaAttr, + * or null where ariaAttr won't cause conflict + */ + AriaUtil.getConflictOrOverlappingHtmlAttribute = function (ariaAttr, htmlAttrs, type) { + var exist = ARIADefinitions_1.ARIADefinitions.relatedAriaHtmlAttributes[ariaAttr['name']]; + if (exist) { + if (!ariaAttr || ariaAttr.length == 0 || !htmlAttrs || htmlAttrs.length == 0) + return []; + var examinedHtmlAtrNames = []; + var concernTypes = null; + if (type === 'conflict') { + if (!exist.conflict || Object.keys(exist.conflict).length === 0) + return null; + concernTypes = exist.conflict; + } + else if (type === 'overlapping') { + if (!exist.overlapping || Object.keys(exist.overlapping).length === 0) + return null; + concernTypes = exist.overlapping; + } + else + return null; + var applicable = false; + var fail_1 = false; + for (var k = 0; k < concernTypes.length; k++) { + var concernAriaValue = concernTypes[k].ariaAttributeValue; + var concernHtmlNames = concernTypes[k].htmlAttributeNames; + var concernHtmlValues = concernTypes[k].htmlAttributeValues; + for (var i = 0; i < htmlAttrs.length; i++) { + var index = concernHtmlNames.indexOf(htmlAttrs[i]['name']); + if (index !== -1) { + applicable = true; + var htmlValuesInConcern = (concernHtmlValues === null || concernHtmlValues[index] === null) ? null : concernHtmlValues[index].split(","); + if (concernAriaValue === null) { + if (htmlValuesInConcern === null) { + examinedHtmlAtrNames.push({ result: 'Failed', 'attr': htmlAttrs[i]['name'] }); + fail_1 = true; + } + else if (htmlValuesInConcern.includes(htmlAttrs[i]['value'])) { + examinedHtmlAtrNames.push({ result: 'Failed', 'attr': htmlAttrs[i]['name'] }); + fail_1 = true; + } + } + else if (htmlValuesInConcern === null) { + if (concernAriaValue === ariaAttr['value']) { + examinedHtmlAtrNames.push({ result: 'Failed', 'attr': htmlAttrs[i]['name'] }); + fail_1 = true; + } + } + else if (concernAriaValue === 'VALUE' && htmlValuesInConcern.includes('VALUE') && htmlValuesInConcern[0] !== ariaAttr['value']) { + examinedHtmlAtrNames.push({ result: 'Failed', 'attr': htmlAttrs[i]['name'] }); + fail_1 = true; + } + else if (concernAriaValue === ariaAttr['value'] && htmlValuesInConcern.includes(htmlAttrs[i]['value'])) { + examinedHtmlAtrNames.push({ result: 'Failed', 'attr': htmlAttrs[i]['name'] }); + fail_1 = true; + } + } + } + } + if (applicable && !fail_1) + examinedHtmlAtrNames.push({ result: 'Pass', 'attr': '' }); + return examinedHtmlAtrNames; + } + else + return null; + }; + AriaUtil.containsPresentationalChildrenOnly = function (elem) { + var roles = AriaUtil.getRoles(elem, false); + // if explicit role doesn't exist, get the implicit one + if (!roles || roles.length === 0) + roles = AriaUtil.getImplicitRole(elem); + //ignore if the element doesn't have any explicit or implicit role, shouldn't happen + if (!roles || roles.length === 0) + return false; + for (var i = 0; roles !== null && i < roles.length; i++) { + var roleProperties = ARIADefinitions_1.ARIADefinitions.designPatterns[roles[i]]; + if (roleProperties !== null && roleProperties !== undefined) { + var presentional = roleProperties.presentationalChildren; + if (presentional === true) + return true; + } + } + return false; + }; + AriaUtil.shouldBePresentationalChild = function (element) { + var walkNode = DOMWalker_1.DOMWalker.parentElement(element); + while (walkNode) { + if (AriaUtil.containsPresentationalChildrenOnly(walkNode)) + return true; + //aria-own case: if the element is referred by an aria-won + walkNode = ARIAMapper_1.ARIAMapper.getAriaOwnedBy(walkNode) || DOMWalker_1.DOMWalker.parentElement(walkNode); + } + return false; + }; + /* + * check if any explicit role specified for the element is a valid ARIA role + * return: null if no explicit role is defined, + * true if the role(s) are defined in ARIA + * false if any role is not defined in ARIA +*/ + AriaUtil.areRolesDefined = function (roles) { + if (!roles || roles.length === 0) + return null; + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + for (var _i = 0, roles_1 = roles; _i < roles_1.length; _i++) { + var role = roles_1[_i]; + if (!(role.toLowerCase() in designPatterns)) + return false; + } + return true; + }; + /* + * check if any explicit role specified for the element is a valid ARIA role + * return: null if no explicit role is defined, + * true if the role(s) are defined in ARIA + * false if any role is not defined in ARIA + */ + AriaUtil.getInvalidRoles = function (ruleContext) { + var domRoles = AriaUtil.getUserDefinedRoles(ruleContext); + if (!domRoles || domRoles.length === 0) + return null; + // check the 'generic' role first + if (domRoles && domRoles.includes('generic')) + return ["generic"]; + // Failing roles + var failRoleTokens = []; + // Passing roles + var passRoleTokens = []; + var tagProperty = AriaUtil.getElementAriaProperty(ruleContext); + var allowedRoles = AriaUtil.getAllowedAriaRoles(ruleContext, tagProperty); + if (!allowedRoles || allowedRoles.length === 0) + return domRoles; + var invalidRoles = []; + if (allowedRoles.includes('any')) + return []; + for (var i = 0; i < domRoles.length; i++) + if (!allowedRoles.includes(domRoles[i]) && !invalidRoles.includes(domRoles[i])) + invalidRoles.push(domRoles[i]); + return invalidRoles; + }; + /* + * check if any explicit role specified for the element is not defined in ARIA + * return: list of specified roles not defined in ARIA + */ + AriaUtil.getRolesUndefinedByAria = function (element) { + if (!element) + return null; + var roles = AriaUtil.getRoles(element, false); + var undefinedRoles = []; + if (roles && roles.length > 0) { + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + for (var i = 0; i < roles.length; i++) { + if (!(roles[i] in designPatterns)) { + undefinedRoles.push(roles[i]); + } + } + } + return undefinedRoles; + }; + /* + * this method first checks explicit roles, if no explicit role, it will check the implicit role + * return: null if any explicit role is invalid, + * a list of invalid attributes + * empty list if all attributes are valid, or no aria attributes are specified + */ + AriaUtil.getInvalidAriaAttributes = function (ruleContext) { + var roles = AriaUtil.getUserDefinedRoles(ruleContext); + // the invalid role case: handled by Rpt_Aria_ValidRole. Ignore to avoid duplicated report + // for mutiple roles, skip if any role is invalid + var defined = AriaUtil.areRolesDefined(roles); + if (defined !== null && !defined) + return null; + var attrs = []; + if (!roles || roles.length == 0) + roles = AriaUtil.getImplicitRole(ruleContext); + var aria_attrs = AriaUtil.getUserDefinedAriaAttributes(ruleContext); + var tagProperty = AriaUtil.getElementAriaProperty(ruleContext); + // Attributes allowed on this node + var allowedAttributes = AriaUtil.getAllowedAriaAttributes(ruleContext, roles, tagProperty); + if (aria_attrs) { + for (var i = 0; i < aria_attrs.length; i++) { + var attrName = aria_attrs[i].trim().toLowerCase(); + if (!allowedAttributes.includes(attrName) && !attrs.includes(attrName)) + attrs.push(attrName); + } + } + return attrs; + }; + /* + * get conflict Aria and Html attributes + * return: a list of Aria and Html attribute pairs that are conflict + */ + AriaUtil.getConflictAriaAndHtmlAttributes = function (elem) { + var ariaAttrs = AriaUtil.getUserDefinedAriaAttributeNameValuePairs(elem); + var htmlAttrs = AriaUtil.getUserDefinedHtmlAttributeNameValuePairs(elem); + var ret = []; + if (ariaAttrs && ariaAttrs.length > 0 && htmlAttrs && htmlAttrs.length > 0) { + var _loop_1 = function (i) { + var examinedHtmlAtrNames = AriaUtil.getConflictOrOverlappingHtmlAttribute(ariaAttrs[i], htmlAttrs, 'conflict'); + if (examinedHtmlAtrNames === null) + return "continue"; + examinedHtmlAtrNames.forEach(function (item) { + if (item['result'] === 'Failed') //failed + ret.push({ 'ariaAttr': ariaAttrs[i]['name'], 'htmlAttr': item['attr'] }); + }); + }; + for (var i = 0; i < ariaAttrs.length; i++) { + _loop_1(i); + } + } + return ret; + }; + /* + * get deprecated Aria roles + * return: a list of deprecated Aria roles + */ + AriaUtil.getDeprecatedAriaRoles = function (element) { + if (!element) + return null; + var roles = AriaUtil.getRoles(element, false); + var ret = []; + if (roles && roles.length > 0) { + var globalDeprecatedRoles = ARIADefinitions_1.ARIADefinitions.globalDeprecatedRoles; + for (var i = 0; i < roles.length; i++) { + if (globalDeprecatedRoles.includes(roles[i])) + ret.push(roles[i]); + } + } + return ret; + }; + /* + * get deprecated Aria role-attributes + * return: a list of deprecated Aria role-attributes paris + * for global the role is marked as 'any' + */ + AriaUtil.getDeprecatedAriaAttributes = function (element) { + if (!element) + return null; + var domAttributes = element.attributes; + var ariaAttrs = []; + if (domAttributes) { + for (var i = 0; i < domAttributes.length; i++) { + var attrName = domAttributes[i].name; + if (attrName.substring(0, 5) === 'aria-') + ariaAttrs.push(attrName); + } + } + if (ariaAttrs.length === 0) + return []; + var ret = []; + var globalDeprecatedAttributes = ARIADefinitions_1.ARIADefinitions.globalDeprecatedProperties; + for (var i = 0; i < ariaAttrs.length; i++) { + if (globalDeprecatedAttributes.includes(ariaAttrs[i])) + ret.push({ "role": "any", "attribute": ariaAttrs[i] }); + } + var roles = AriaUtil.getRoles(element, false); + if (roles && roles.length > 0) { + for (var i = 0; i < roles.length; i++) { + var roleWithDeprecatedAttributes = ARIADefinitions_1.ARIADefinitions.designPatterns[roles[i]]; + if (roleWithDeprecatedAttributes) { + var deprecatedAttriNames = roleWithDeprecatedAttributes['deprecatedProps']; + if (deprecatedAttriNames && deprecatedAttriNames.length > 0) { + for (var j = 0; j < ariaAttrs.length; j++) { + if (deprecatedAttriNames.includes(ariaAttrs[j])) + ret.push({ "role": roles[i], "attribute": ariaAttrs[j] }); + } + } + } + } + } + return ret; + }; + AriaUtil.isNodeInGrid = function (node) { + return AriaUtil.getAncestorWithRole(node, "grid") != null; + }; + // This list contains a list of elements tags which have display: none by default, since we have rules triggering + AriaUtil.navLinkKeywords = ['start', 'next', 'prev', 'previous', 'contents', 'index']; + // This list contains a list of rule ids for the rules that have to check for hidden content regardless of the Check Hidden + // Content Setting. This means that when the engine is actually determine which elements to mass to the rules, it will always + // pass theses rules no matter what the Check Hidden Content Setting is. + AriaUtil.rulesThatHaveToCheckHidden = ['RPT_Elem_UniqueId']; + // https://www.w3.org/TR/wai-aria-1.1/#introstates + AriaUtil.ariaAttributeRoleDefaults = { + "alert": { + "aria-live": "assertive", + "aria-atomic": "true" + }, + "combobox": { + "aria-haspopup": "listbox" + }, + "listbox": { + "aria-orientation": "vertical" + }, + "log": { + "aria-live": "polite" + }, + "menu": { + "aria-orientation": "vertical" + }, + "menubar": { + "aria-orientation": "horizontal" + }, + "meter": { + "aria-valuemin": "0", + "aria-valuemax": "100" + }, + "option": { + "aria-selected": "false" + }, + "progressbar": { + "aria-valuemin": "0", + "aria-valuemax": "100" + }, + "scrollbar": { + "aria-orientation": "vertical", + "aria-valuemin": "0", + "aria-valuemax": "100" + }, + "separator": { + "aria-orientation": "horizontal", + "aria-valuemin": "0", + "aria-valuemax": "100" + }, + "slider": { + "aria-orientation": "horizontal", + "aria-valuemin": "0", + "aria-valuemax": "100" + }, + "spinbutton": { + // Not sure how to encode min/max (or now in 1.2 - "has no value") + //"aria-valuenow": "0" TODO: at risk: maybe delete after ARIA 1.2 reaches proposed rec + // Probably just delete spinbutton from this list completely and let user agents handle "defaults" + }, + "status": { + "aria-live": "polite", + "aria-atomic": "true" + }, + "tab": { + "aria-selected": "false" + }, + "tablist": { + "aria-orientation": "horizontal" + }, + "toolbar": { + "aria-orientation": "horizontal" + }, + "tree": { + "aria-orientation": "vertical" + } + }; + // https://www.w3.org/TR/wai-aria-1.1/#aria-atomic + AriaUtil.ariaAttributeGlobalDefaults = { + "aria-atomic": "false", + "aria-autocomplete": "none", + "aria-busy": "false", + "aria-checked": undefined, + "aria-current": "false", + "aria-disabled": "false", + "aria-dropeffect": "none", + "aria-expanded": undefined, + "aria-grabbed": undefined, + "aria-haspopup": "false", + "aria-hidden": undefined, + "aria-invalid": "false", + "aria-live": "off", + "aria-modal": "false", + "aria-multiline": "false", + "aria-multiselectable": "false", + "aria-orientation": undefined, + "aria-pressed": undefined, + "aria-readonly": "false", + //"aria-relevant": "additions text", TODO: are multiple values supported? + "aria-required": "false", + "aria-selected": undefined, + "aria-sort": "none" + }; + // https://www.w3.org/TR/html-aam-1.0/#html-attribute-state-and-property-mappings + AriaUtil.ariaAttributeImplicitMappings = { + "aria-autocomplete": { + "form": function (e) { + return "off" === e.getAttribute("autocomplete") ? "none" : "both"; + }, + "input": function (e) { + return "off" === e.getAttribute("autocomplete") ? "none" : "both"; + }, + "select": function (e) { + return "off" === e.getAttribute("autocomplete") ? "none" : "both"; + }, + "textarea": function (e) { + return "off" === e.getAttribute("autocomplete") ? "none" : "both"; + } + }, + "aria-checked": { + "input": function (e) { + if (e.hasAttribute("indeterminate")) + return "mixed"; + return "" + e.hasAttribute("checked"); + }, + "menuitem": function (e) { + if (e.hasAttribute("indeterminate")) + return "mixed"; + return "" + e.hasAttribute("checked"); + }, + "*": function (e) { + if (e.hasAttribute("indeterminate")) + return "mixed"; + }, + }, + "aria-disabled": { + "button": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + }, + "fieldset": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + }, + "input": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + }, + "optgroup": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + }, + "option": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + }, + "select": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + }, + "textarea": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + } + }, + "aria-expanded": { + "details": function (e) { + return e.getAttribute("open"); + }, + "dialog": function (e) { + return e.getAttribute("open"); + } + }, + "aria-multiselectable": { + "select": function (e) { + if (e.hasAttribute("multiple")) + return "true"; + return; + } + }, + "aria-placeholder": { + "input": function (e) { + return e.getAttribute("placeholder"); + }, + "textarea": function (e) { + return e.getAttribute("placeholder"); + } + }, + "aria-required": { + "input": function (e) { + return e.getAttribute("required"); + }, + "select": function (e) { + return e.getAttribute("required"); + }, + "textarea": function (e) { + return e.getAttribute("required"); + } + } + }; + return AriaUtil; +}()); +exports.AriaUtil = AriaUtil; + + +/***/ }, + +/***/ 4919 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.CSSUtil = void 0; +var CacheUtil_1 = __webpack_require__(4566); +var CommonUtil_1 = __webpack_require__(7139); +var AriaUtil_1 = __webpack_require__(7011); +var DOMMapper_1 = __webpack_require__(7507); +var DOMWalker_1 = __webpack_require__(3864); +var CSSUtil = /** @class */ (function () { + function CSSUtil() { + } + CSSUtil.selectorMatchesElem = function (element, selector) { + // Early return for empty selector (before try-catch for performance) + if (!selector || selector.length === 0 || selector.trim() === "") + return false; + try { + // Modern standard method + if (typeof element.matches === "function") { + return element.matches(selector); + } + // Vendor-prefixed fallbacks (older browsers) + if (typeof element.webkitMatchesSelector === "function") { + return element.webkitMatchesSelector(selector); + } + if (typeof element.msMatchesSelector === "function") { + return element.msMatchesSelector(selector); + } + // Legacy method (deprecated but kept for compatibility) + if (typeof element.matchesSelector === "function") { + return element.matchesSelector(selector); + } + // Fallback: use querySelectorAll and check if element is in results + var doc = element.ownerDocument || element.document; + if (!doc) + return false; + var matches = doc.querySelectorAll(selector); + // Use Array.from for better performance with modern engines + return Array.from(matches).includes(element); + } + catch (err) { + // Bad selector? Doesn't match then... + return false; + } + }; + /** + * Returns the style computed for this element + * @param elem + */ + CSSUtil.getComputedStyle = function (elem, pseudoElt) { + if (!elem) + return null; + var doc = elem.ownerDocument; + var win = doc.defaultView; + return win.getComputedStyle(elem, pseudoElt); + }; + /** + * Parse and cache all stylesheet rules at the document level + * Returns an array of parsed rule objects with selector and style information + */ + CSSUtil.getParsedStylesheetRules = function (ownerDoc) { + // Check if we already have cached parsed rules for this document + var cachedRules = CacheUtil_1.CacheUtil.getCache(ownerDoc, "RPTUtil_ParsedStylesheetRules", null); + if (cachedRules) { + return cachedRules; + } + var parsedRules = []; + // Iterate through all of the stylesheets and rules + for (var ssIndex = 0; ssIndex < ownerDoc.styleSheets.length; ++ssIndex) { + var sheet = ownerDoc.styleSheets[ssIndex]; + try { + if (sheet && sheet.cssRules) { + for (var rIndex = 0; rIndex < sheet.cssRules.length; ++rIndex) { + var rule = sheet.cssRules[rIndex]; + var fullRuleSelector = rule.selectorText; + if (fullRuleSelector) { + var pseudoMatch = fullRuleSelector.match(/^(.*)(:[a-zA-Z-]*)$/); + var hasPseudoClass = !!pseudoMatch; + var selMain = hasPseudoClass ? pseudoMatch[1] : fullRuleSelector; + var selPseudo = hasPseudoClass ? pseudoMatch[2] : ""; + parsedRules.push({ + fullRuleSelector: fullRuleSelector, + hasPseudoClass: hasPseudoClass, + selMain: selMain, + selPseudo: selPseudo, + style: rule.style + }); + } + } + } + } + catch (err) { + if (!err.toString().includes("Cannot access rules") && + !err.toString().includes("SecurityError:")) { + throw err; + } + } + } + // Cache the parsed rules at the document level + CacheUtil_1.CacheUtil.setCache(ownerDoc, "RPTUtil_ParsedStylesheetRules", parsedRules); + return parsedRules; + }; + /** + * Private helper method to fill style maps from a CSSStyleDeclaration + * Handles CSS property priorities and the "all" shorthand property + */ + CSSUtil.fillStyle = function (maps, style) { + for (var sIndex = 0; sIndex < style.length; ++sIndex) { + if (style[sIndex] === "all" && style[style[sIndex]]) { + for (var _i = 0, maps_1 = maps; _i < maps_1.length; _i++) { + var map = maps_1[_i]; + for (var key in map) { + delete map[key]; + } + } + break; + } + else { + var key = style[sIndex]; + for (var _a = 0, maps_2 = maps; _a < maps_2.length; _a++) { + var map = maps_2[_a]; + var priority = style.getPropertyPriority(key); + if (key in map && map[key].endsWith("!important")) { + if (priority === "important" && + !map[key].startsWith("inherit") && + !map[key].startsWith("unset")) + map[key] = style[key] + " !important"; + else + continue; + } + else + map[key] = + style[key] + + (priority === "important" ? " !important" : ""); + } + } + } + }; + /** + * Private helper method that consolidates the logic for getting defined styles + * Used by both getDefinedStyles and getDefinedStylesMultiple + */ + CSSUtil.getDefinedStylesInternal = function (elem, props, pseudoClasses) { + var results = {}; + var definedStylesMap = {}; + var definedStylePseudoMap = {}; + // Initialize result objects for all pseudo-classes + for (var _i = 0, pseudoClasses_1 = pseudoClasses; _i < pseudoClasses_1.length; _i++) { + var pseudoClass = pseudoClasses_1[_i]; + definedStylesMap[pseudoClass] = {}; + definedStylePseudoMap[pseudoClass] = {}; + } + // Get pre-parsed stylesheet rules from cache + var parsedRules = CSSUtil.getParsedStylesheetRules(elem.ownerDocument); + // Check once if we need to handle :focus pseudo-class + var hasFocusPseudo = pseudoClasses.includes(":focus"); + var _loop_1 = function (parsedRule) { + if (props !== null && !props.some(function (prop) { return !!parsedRule.style[prop]; })) { + return "continue"; + } + var selPseudo = parsedRule.selPseudo; + var hasPseudoClass = parsedRule.hasPseudoClass; + // Handle :focus-within replacement once per rule if needed + var selMain = parsedRule.selMain; + if (hasFocusPseudo && selPseudo === ":focus") { + // If this element has focus, remove focus-within from parents + selMain = selMain.replace(/([ >][^+~ >]+):focus-within/g, "$1"); + } + // Cache selector matching result (only once per rule, not per pseudo-class) + var selectorMatches = CSSUtil.selectorMatchesElem(elem, selMain); + // Only process if selector matches + if (selectorMatches) { + // Process for each pseudo-class + for (var _c = 0, pseudoClasses_3 = pseudoClasses; _c < pseudoClasses_3.length; _c++) { + var pseudoClass = pseudoClasses_3[_c]; + // Cache map references to avoid repeated lookups + var styleMap = definedStylesMap[pseudoClass]; + var pseudoMap = definedStylePseudoMap[pseudoClass]; + // Get styles of non-pseudo selectors + if (!hasPseudoClass) { + CSSUtil.fillStyle([styleMap, pseudoMap], parsedRule.style); + } + // Get styles for matching pseudo-class + if (selPseudo === pseudoClass) { + CSSUtil.fillStyle([pseudoMap], parsedRule.style); + } + } + } + }; + // Process each cached rule + for (var _a = 0, parsedRules_1 = parsedRules; _a < parsedRules_1.length; _a++) { + var parsedRule = parsedRules_1[_a]; + _loop_1(parsedRule); + } + // Handle element styles and build results in one pass + for (var _b = 0, pseudoClasses_2 = pseudoClasses; _b < pseudoClasses_2.length; _b++) { + var pseudoClass = pseudoClasses_2[_b]; + var styleMap = definedStylesMap[pseudoClass]; + var pseudoMap = definedStylePseudoMap[pseudoClass]; + // Add element's inline styles + CSSUtil.fillStyle([styleMap, pseudoMap], elem.style); + // Build results + if (pseudoClass === "") { + results[pseudoClass] = styleMap; + } + else { + // For pseudo-classes, return only styles that differ from default + var diffStyles = {}; + var keys = Object.keys(pseudoMap); + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + if (pseudoMap[key] !== styleMap[key]) { + diffStyles[key] = pseudoMap[key]; + } + } + results[pseudoClass] = diffStyles; + } + } + return results; + }; + /** + * Returns the style defined for this element for multiple pseudo-classes in a single pass + * + * This is more efficient than calling getDefinedStyles multiple times as it only + * iterates through stylesheets once. + * + * @param {HTMLElement} elem + * @param {string[]} props Properties for which we are looking for (allows us to skip elem matching unnecessarily) + * @param {string[]} pseudoClasses - Array of pseudo-classes to retrieve. Use "" for default (no pseudo-class). + * @returns {Object} Object mapping each pseudo-class to its defined styles + */ + CSSUtil.getDefinedStylesMultiple = function (elem, props, pseudoClasses) { + if (!elem) + return null; + var results = {}; + // Create cache key that includes props filter + // Use "all" for null props, or sorted comma-separated list for specific props + var propsKey = props === null ? "all" : props.slice().sort().join(","); + // Check cache first - see if we have all requested pseudo-classes cached + var allCachedStyles = CacheUtil_1.CacheUtil.getCache(elem, "RPTUtil_DefinedStyles", null); + if (!allCachedStyles) { + allCachedStyles = {}; + } + // Get or create the cache bucket for this props filter + var cachedStyles = allCachedStyles[propsKey]; + var missingPseudoClasses = []; + if (cachedStyles) { + // Check which pseudo-classes are already cached + for (var _i = 0, pseudoClasses_4 = pseudoClasses; _i < pseudoClasses_4.length; _i++) { + var pseudoClass = pseudoClasses_4[_i]; + if (cachedStyles[pseudoClass] !== undefined) { + results[pseudoClass] = cachedStyles[pseudoClass]; + } + else { + missingPseudoClasses.push(pseudoClass); + } + } + // If all are cached, return immediately + if (missingPseudoClasses.length === 0) { + return results; + } + } + else { + cachedStyles = {}; + missingPseudoClasses = pseudoClasses; + } + // Only process missing pseudo-classes using the internal helper + if (missingPseudoClasses.length > 0) { + var newResults = CSSUtil.getDefinedStylesInternal(elem, props, missingPseudoClasses); + // Merge new results with cached results + for (var _a = 0, missingPseudoClasses_1 = missingPseudoClasses; _a < missingPseudoClasses_1.length; _a++) { + var pseudoClass = missingPseudoClasses_1[_a]; + results[pseudoClass] = newResults[pseudoClass]; + cachedStyles[pseudoClass] = newResults[pseudoClass]; + } + // Update cache with all styles (existing + new) + allCachedStyles[propsKey] = cachedStyles; + CacheUtil_1.CacheUtil.setCache(elem, "RPTUtil_DefinedStyles", allCachedStyles); + } + return results; + }; + /** + * Returns the style defined for this element + * + * This differs from the computed style in that the computed style will return + * styles defined by the user agent. This will only return styles defined by the + * application + * if rotation transform is used, the computed style returns the resolved matrix + * while the defined style return the transform function(s) + * for example, for 'transform: rotate(2.5deg);', the computed style returns 'matrix(-0.0436194, 0.999048, -0.999048, -0.0436194, 0, 0)' + * and the defined style returns 'rotate(2.5deg)' + * + * change the type of the parameter pseudoClass from PseudoClass to string to include both pseudo classes (e.g., :focus, :checked) + * and pseudo elements (e.g., ::before, ::after). + * + * @param {HTMLElement} elem + * @param {string[]} props Properties for which we are looking for (allows us to skip elem matching unnecessarily) + * @param {string} [pseudoClass] If specified, will return values that are different + * than when the pseudoClass does not match. + */ + CSSUtil.getDefinedStyles = function (elem, props, pseudoClass) { + if (!elem) + return null; + // Create cache key that includes props filter + // Use "all" for null props, or sorted comma-separated list for specific props + var propsKey = props === null ? "all" : props.slice().sort().join(","); + var pseudoKey = pseudoClass || ""; + // Check cache first - use shared cache structure with getDefinedStylesMultiple + var allCachedStyles = CacheUtil_1.CacheUtil.getCache(elem, "RPTUtil_DefinedStyles", null); + if (!allCachedStyles) { + allCachedStyles = {}; + } + // Get or create the cache bucket for this props filter + var cachedStyles = allCachedStyles[propsKey]; + if (!cachedStyles) { + cachedStyles = {}; + } + if (cachedStyles[pseudoKey] !== undefined) { + return cachedStyles[pseudoKey]; + } + // Use the internal helper method with a single pseudo-class + var results = CSSUtil.getDefinedStylesInternal(elem, props, [pseudoKey]); + var result = results[pseudoKey]; + // Cache the result + cachedStyles[pseudoKey] = result; + allCachedStyles[propsKey] = cachedStyles; + CacheUtil_1.CacheUtil.setCache(elem, "RPTUtil_DefinedStyles", allCachedStyles); + return result; + }; + /** + * Returns the media query defined for the document + * Get media orientation transforms from stylesheets with caching + * Returns transform/rotate properties for elements within media queries + * + * @param {Document} doc + */ + CSSUtil.getMediaOrientationTransform = function (doc) { + // Check if we already have cached media orientation transforms for this document + var cachedTransforms = CacheUtil_1.CacheUtil.getCache(doc, "RPTUtil_MediaOrientationTransforms", null); + if (cachedTransforms) { + return cachedTransforms; + } + var orientationTransforms = {}; + // Iterate through all of the stylesheets and rules + for (var ssIndex = 0; ssIndex < doc.styleSheets.length; ++ssIndex) { + var sheet = doc.styleSheets[ssIndex]; + try { + if (sheet && sheet.cssRules) { + for (var rIndex = 0; rIndex < sheet.cssRules.length; ++rIndex) { + var sheetRule = sheet.cssRules[rIndex]; + if (4 /* CSSRule.MEDIA_RULE */ === sheetRule.MEDIA_RULE) { + var rule = sheetRule; + if (rule && rule.media) { + var mediaList = rule.media; + for (var i = 0; i < mediaList.length; i++) { + if (!mediaList.item(i)) + continue; + var mediaKey = mediaList.item(i).toLocaleLowerCase(); + var elem_transforms = orientationTransforms[mediaKey]; + if (!elem_transforms) + elem_transforms = {}; + var styleRules = rule.cssRules; + for (var j = 0; j < styleRules.length; ++j) { + if (1 /* CSSRule.STYLE_RULE */ === styleRules[j].STYLE_RULE) { + var styleRule = styleRules[j]; + var selector = styleRule.selectorText; + if (selector) { + var transforms = {}; + var styles = styleRule.style; + for (var s = 0; s < styles.length; ++s) { + var key = styles[s]; + var keyLower = key.toLocaleLowerCase(); + if (keyLower === "transform") { + if (key === "all" && styles[key]) { + transforms = {}; + break; + } + else { + transforms[key] = styles[key]; + } + } + else if (keyLower === "rotate") { + transforms[key] = styles[key]; + } + } + if (Object.keys(transforms).length > 0) { + elem_transforms[selector] = transforms; + } + } + } + } + if (Object.keys(elem_transforms).length > 0) { + orientationTransforms[mediaKey] = elem_transforms; + } + } + } + } + } + } + } + catch (err) { + if (!err.toString().includes("Cannot access rules") && + !err.toString().includes("SecurityError:")) { + throw err; + } + } + } + // Cache the media orientation transforms at the document level + CacheUtil_1.CacheUtil.setCache(doc, "RPTUtil_MediaOrientationTransforms", orientationTransforms); + return orientationTransforms; + }; + /** + * convert given rotation transform functions to the degree transformed. + * If multiple functions are given, then the functions are applied linearly in the order. + * rotation_transform function example: rotate(45deg), rotate(2turn), rotate(2rad), rotate3d(1, 1, 1, 45deg), + * rotate(2rad) rotate3d(1, 1, 1, 45deg) + * @param rotation_transform + */ + CSSUtil.getRotationDegree = function (rotation_transform) { + var degree = 0; + try { + if (!rotation_transform) + return degree; + // normalize the rotation_transform + rotation_transform = rotation_transform.replaceAll(", ", ","); + var transform_functions = rotation_transform.split(" "); + for (var i = 0; i < transform_functions.length; i++) { + var transform_function = transform_functions[i].trim(); + if (transform_function === "") + continue; + if (transform_function.startsWith("rotate3d")) { + // example: rotate3d(1, 1, 1, 45deg); + var left = transform_function.indexOf("("); + var right = transform_function.indexOf(")"); + if (left !== -1 && right !== -1) { + var matrix = transform_function.substring(left + 1, right); + var values = void 0; + if (matrix) + values = matrix.split(","); + if (values && values.length === 4) { + var rotation = values[3]; + if (!rotation) + continue; + rotation = rotation.trim(); + if (rotation.endsWith("turn")) { + var num = rotation.substring(0, rotation.length - 4); + num = parseFloat(num); + if (!isNaN(num)) + degree = num * 360; + } + else if (rotation.endsWith("rad")) { + var num = rotation.substring(0, rotation.length - 3); + num = parseFloat(num); + if (!isNaN(num)) + degree = (num * 180) / Math.PI; + } + else if (rotation.endsWith("deg")) { + var num = rotation.substring(0, rotation.length - 3); + num = parseFloat(num); + if (!isNaN(num)) + degree += num; + } + } + } + } + else if (transform_function.startsWith("rotate") || + transform_function.startsWith("rotateZ")) { + // example: rotate(45deg); + var left = transform_function.indexOf("("); + var right = transform_function.indexOf(")"); + if (left !== -1 && right !== -1) { + var rotation = transform_function.substring(left + 1, right); + if (!rotation) + continue; + rotation = rotation.trim(); + if (rotation.endsWith("turn")) { + var num = rotation.substring(0, rotation.length - 4); + num = parseFloat(num); + if (!isNaN(num)) + degree = num * 360; + } + else if (rotation.endsWith("rad")) { + var num = rotation.substring(0, rotation.length - 3); + num = parseFloat(num); + if (!isNaN(num)) + degree = (num * 180) / Math.PI; + } + else if (rotation.endsWith("deg")) { + var num = rotation.substring(0, rotation.length - 3); + num = parseFloat(num); + if (!isNaN(num)) + degree += num; + } + } + } + else if (transform_function.startsWith("matrix3d")) { + // calculate the three Euler angles + var left = transform_function.indexOf("("); + var right = transform_function.indexOf(")"); + if (left !== -1 && right !== -1) { + var matrix = transform_function.substring(left + 1, right); + var values = null; + if (matrix) + values = matrix.split(","); + if (values !== null) { + var z_angle = Math.atan2(values[4], values[5]); + degree += Math.round(Math.round((z_angle * 180) / Math.PI)); + } + } + } + else if (transform_function.startsWith("matrix")) { + // calculate the three Euler angles + var left = transform_function.indexOf("("); + var right = transform_function.indexOf(")"); + if (left !== -1 && right !== -1) { + var matrix = transform_function.substring(left + 1, right); + var values = null; + if (matrix) + values = matrix.split(","); + if (values !== null) { + var z_angle = Math.atan2(values[1], values[0]); + degree += Math.round(Math.round((z_angle * 180) / Math.PI)); + } + } + } + } + while (degree >= 360) + degree -= 360; + } + catch (err) { + console.log("Cannot retrieve rotation degree: " + err); + throw err; + } + return degree; + }; + /** + * Convert CSS style string values to pixels. + * + * @param value style value in string, such as 3rem, 230px etc. + * @param target element. + * @return value in pixels + */ + CSSUtil.getPixelsFromStyle = function (value, elem) { + if (!value) + return 0; + var regex = /(-?[\d.]+)([a-z%]*)/; + var parsed = value.trim().match(regex); + if (parsed === null) + return 0; + if (parsed[2] === "" || parsed[1] === 0) + //no zero value without unit which is considered as error, so implicable + return 0; + var pixels = CSSUtil.convertValue2Pixels(parsed[2], parsed[1], elem); + return pixels === null ? pixels : parseFloat(pixels); + }; + /** + * Convert absolute CSS numerical values to pixels. + * + * @param unitValue in string + * @param target element. + * @return value in pixels + */ + CSSUtil.convertValue2Pixels = function (unit, unitValue, elem) { + if (unitValue === 0) + return 0; + if (!unit) + unit = "px"; + var supportedUnits = { + // absolute unit + px: function (value) { return value; }, + cm: function (value) { return value * 37.8; }, + mm: function (value) { return value * 3.78; }, + q: function (value) { return value * 0.95; }, + in: function (value) { return value * 96; }, + pc: function (value) { return value * 16; }, + pt: function (value) { return value * 1.33; }, + // relative unit + rem: function (value) { + return value * + parseFloat(getComputedStyle(elem.ownerDocument.documentElement).getPropertyValue("font-size")); + }, + em: function (value) { + return value * + parseFloat(getComputedStyle(elem).getPropertyValue("font-size")); + }, + vw: function (value) { + return (value / 100) * elem.ownerDocument.defaultView.innerWidth; + }, + vh: function (value) { + return (value / 100) * elem.ownerDocument.defaultView.innerHeight; + }, + "%": function (value) { + return (value / 100) * + parseFloat(getComputedStyle(elem).getPropertyValue("font-size")); + }, + }; + if (unit in supportedUnits) + return supportedUnits[unit](unitValue); + return null; + }; + /* + * Returns if the font for visible text of the element is defined by material icons + * + * @param {HTMLElement} elem + */ + CSSUtil.isMaterialIconFont = function (elem) { + // TODO: check the existence material icons using fetch in node 18+ + // for now (node 16) just dertermine if the stylesheet for the 'Material Icons' exists statically. note that the loading of the font stylesheet occurs at run time. + //list of known material icons and stylesheet link + var known_icons = { + "Material Icons": "https://fonts.googleapis.com/icon?family=Material+Icons", + }; + var known_css_classes = { + "material-icons": "https://fonts.googleapis.com/icon?family=Material+Icons", + }; + // material icon font can be defined either by font-family: 'Material Icons' or by class="material-icons" + var styles = CSSUtil.getDefinedStyles(elem, ["font-family"]); + var fontFamily = styles["font-family"]; + var found = false; + // font-family specifies a prioritized list of one or more font family names + if (fontFamily && + fontFamily.split(",")[0].replace(/['"]+/g, "").trim() in known_icons) + found = true; + if (!found) { + var list = elem.classList; + for (var css_class in known_css_classes) { + if (list.contains(css_class)) { + found = true; + break; + } + } + } + if (!found) + return false; + var passed = false; + // check if the stylesheet for the 'Material Icons' exists statically + var sheets = elem.ownerDocument.styleSheets; + for (var s = 0; s < sheets.length; s++) { + if (sheets && + sheets.length > 0 && + Object.values(known_icons).indexOf(sheets[s].href) > -1) { + passed = true; + break; + } + } + return passed; + }; + CSSUtil.getWeightNumber = function (styleVal) { + var map = { + light: 100, + bold: 700, + }; + var retVal = parseInt(styleVal); + if (retVal) + return retVal; + if (styleVal in map) + return map[styleVal]; + return 400; + }; + CSSUtil.getFontInPixels = function (styleVal, elem) { + var map = { + "xx-small": 16, + "x-small": 10, + small: 13, + medium: 16, + large: 18, + "x-large": 24, + "xx-large": 32, + }; + var value = parseFloat(styleVal); + if (!value) { + return map[styleVal]; + } + var units = styleVal.substring(("" + value).length); + /** + if (units === "" || units === "px") return value; + if (units === "em") return value * 16; + if (units === "%") return value / 100 * 16; + if (units === "pt") return value * 4 / 3; + return Math.round(value); + */ + return CSSUtil.convertValue2Pixels(units, value, elem); + }; + CSSUtil.getCSSStyle = function (element) { + var styleText = ""; + if (element === null) + return []; + if (element.IBM_CSS_THB) + return element.IBM_CSS_THB; + var nodeName = element.nodeName.toLowerCase(); + if (nodeName === "style") { + styleText = element.innerText; + if (styleText === undefined || styleText.trim() === "") + styleText = element.textContent; + } + else if (element.hasAttribute("style")) { + styleText = element.getAttribute("style"); + } + else + return []; + if (styleText === null || styleText.trim().length === 0) + return []; + //remove comment blocks + var re = /(\/\*+(?:(?:(?:[^\*])+)|(?:[\*]+(?!\/)))[*]+\/)|\/\/.*/g; + var subst = " "; + styleText = styleText.replace(re, subst); + // Find all "key : val;" pairs with various whitespace inbetween + var rKeyVals = /\s*([^:\s]+)\s*:\s*([^;$}]+)\s*(;|$)/g; + // Find all "selector { csskeyvals } with various whitespace inbetween + var rSelectors = /\s*([^{]*){([^}]*)}/g; + if (styleText.indexOf("{") === -1) { + var keyVals = {}; + var m = void 0; + while ((m = rKeyVals.exec(styleText)) != null) { + keyVals[m[1]] = m[2].trim().toLowerCase(); + } + var retVal = [ + { + selector: null, + values: keyVals, + }, + ]; + element.IBM_CSS_THB = retVal; + return retVal; + } + else { + var retVal = []; + var m = void 0; + var m2 = void 0; + while ((m = rSelectors.exec(styleText)) != null) { + var keyVals = {}; + var selKey = m[1]; + var selVal = m[2]; + while ((m2 = rKeyVals.exec(selVal)) != null) { + keyVals[m2[1]] = m2[2].trim().toLowerCase(); + } + retVal.push({ + selector: selKey, + values: keyVals, + }); + } + element.IBM_CSS_THB = retVal; + return retVal; + } + }; + /** + * an "inline" CSS display property tells the element to fit itself on the same line. An 'inline' element's width and height are ignored. + * some element has default inline property, such as <span>, <a> + * most formatting elements inherent inline property, such as <em>, <strong>, <i>, <small> + * other inline elements: <abbr> <acronym> <b> <bdo> <big> <br> <cite> <code> <dfn> <em> <i> <input> <kbd> <label> + * <map> <object> <output> <q> <samp> <script> <select> <small> <span> <strong> <sub> <sup> <textarea> <time> <tt> <var> + * an "inline-block" element still place element in the same line without breaking the line, but the element's width and height are applied. + * inline-block elements: img, button, select, meter, progress, marguee, also in Chrome: textarea, input + * A block-level element always starts on a new line, and the browsers automatically add some space (a margin) before and after the element. + * block-level elements: <address> <article> <aside> <blockquote> <canvas> <dd> <div> <dl> <dt> <fieldset> <figcaption> <figure> <footer> <form> + * <h1>-<h6> <header> <hr> <li> <main> <nav> <noscript> <ol> <p> <pre> <section> <table> <tfoot> <ul> <video> + * + * return: if it's inline element and { inline: true | false, text: true | false, violation: null | {node} } + */ + CSSUtil.getInlineStatus = function (element) { + if (!element) + return null; + var elem_styl = getComputedStyle(element); + if (!elem_styl) + return null; + var status = { inline: false, text: false, violation: null }; + var udisplay = elem_styl.getPropertyValue("display"); + // inline element only + if (udisplay !== "inline") + return status; + status.inline = true; + var parent = element.parentElement; + if (!parent) + return status; + var mapper = new DOMMapper_1.DOMMapper(); + var bounds = mapper.getUnadjustedBounds(element); + var style = getComputedStyle(parent); + var display = style.getPropertyValue("display"); + // an inline element is inside a block. note <body> is a block element too + if (display !== "block" && display !== "inline-block") { + //parent is inline element + if (!CommonUtil_1.CommonUtil.isInnerTextOnlyEmpty(parent)) + status.text = true; + return status; + } + /** + * @returns "yes"": inline with text, "no": inline without text, + * "violation": not spacing enough to neiboring inline target + * "block": block element, + */ + function isInlineWithText(node, before) { + // note browsers insert Text nodes to represent whitespaces. + if (node.nodeType === Node.TEXT_NODE) { + if (node.nodeValue && node.nodeValue.trim().length > 0) + return "yes"; + else + return "no"; + } + else if (node.nodeType === Node.ELEMENT_NODE) { + // special case: <br> is styled 'inline' by default, but change the line + if (node.nodeName.toLowerCase() === "br") + return "block"; + var cStyle = getComputedStyle(node); + var cDisplay = cStyle.getPropertyValue("display"); + if (cDisplay === "inline") { + if (CommonUtil_1.CommonUtil.isTarget(node)) { + if (bounds.width < 24) { + // check if the horizontal spacing is sufficient + var bnds = mapper.getUnadjustedBounds(node); + if ((before && (Math.round(bounds.width / 2) + bounds.left - bnds.left < 24)) + || (!before && (Math.round(bounds.width / 2) + bounds.left - (bnds.left + bnds.width) < 24))) { + status.violation = node.nodeName.toLowerCase(); + return "violation"; + } + else + return "no"; + } + } + if (!CommonUtil_1.CommonUtil.isInnerTextOnlyEmpty(node)) + return "yes"; + return "no"; + } + else + return "block"; + } + else + return "block"; + } + // an inline element is inside a block. note <body> is a block element too + // one or more inline elements with text in the same line: <target>, text<target>, <target>text, <inline>+text<target>, <target><inline>+text, text<target><inline>+ + var walkNode = element.nextSibling; + while (walkNode) { + var inlineText = isInlineWithText(walkNode, true); + if (inlineText === "yes") { + status.text = true; + break; + } + if (inlineText === "block") { + break; + } + walkNode = walkNode.nextSibling; + } + walkNode = element.previousSibling; + while (walkNode) { + var inlineText = isInlineWithText(walkNode, false); + if (inlineText === "yes") { + status.text = true; + break; + } + if (inlineText === "block") { + break; + } + walkNode = walkNode.previousSibling; + } + return status; + }; + /** + * a target is en element that accept a pointer action (click or touch) + * a target is a browser default if it's a native widget (no user defined role) without user style + */ + CSSUtil.isTargetBrowserDefault = function (element) { + if (!element) + return false; + // user defined widget + var roles = AriaUtil_1.AriaUtil.getRoles(element, false); + if (roles && roles.length > 0) + return false; + // no user style to space control size, including use of font + var styles = CSSUtil.getDefinedStyles(element, [ + "line-height", "height", "width", "min-height", "min-width", + "font-size", "margin-top", "margin-bottom", "margin-left", "margin-right" + ]); + if (styles["line-height"] || + styles["height"] || + styles["width"] || + styles["min-height"] || + styles["min-width"] || + styles["font-size"] || + styles["margin-top"] || + styles["margin-bottom"] || + styles["margin-left"] || + styles["margin-right"]) + return false; + return true; + }; + /* + * string contains CJK (chinese, japaneses, or korea) + * return: boolean + */ + CSSUtil.containsCKJ = function (text) { + if (!text) + return false; + // https://en.wikipedia.org/wiki/CJK_Unified_Ideographs https://ayaka.shn.hk/hanregex/ + var regex = /(?:[\u4e00-\u9fff\u3400-\u4dbf])+/g; + var replaced = text.trim().replace(regex, ""); + if (replaced.length === text.trim().length) + return false; + return true; + }; + /** + * Return the ancestor with the given style properties. + * Searches up the DOM tree to find an ancestor that has ALL specified style properties + * with values matching the criteria. + * + * @param {element} elem - The element to start the node walk on to find parent node + * @param {Object} styleProps - The style properties and values of the parent to search for. + * such as {"overflow":['auto', 'scroll'], "overflow-x":['auto', 'scroll']} + * or {"overflow":['*'], "overflow-x":['*']}, The '*' for any value to check the existence of the style prop. + * @param {Array} excludedValues - style values that should be ignored. + * @return {Element|null} - An ancestor element that has all the specified style properties, or null if none found + * @memberOf CSSUtil + */ + CSSUtil.getAncestorWithStyles = function (elem, styleProps, excludedValues) { + if (excludedValues === void 0) { excludedValues = []; } + // Create a cache key that includes the style properties being searched for + var cacheKey = "AriaUtil_AncestorWithStyles_" + JSON.stringify(styleProps) + "_" + JSON.stringify(excludedValues); + // Check if we already have a cached result for this specific query + var cachedResult = CacheUtil_1.CacheUtil.getCache(elem, cacheKey, null); + if (cachedResult !== null) { + return cachedResult === "NOT_FOUND" ? null : cachedResult; + } + // Start with the element itself (not just parent) to maintain backward compatibility + var walkNode = elem; + while (walkNode !== null) { + // Skip if not an HTMLElement (e.g., SVGElement) + // Use nodeType check instead of instanceof to work across different document contexts + if (walkNode.nodeType !== 1 || walkNode.namespaceURI === "http://www.w3.org/2000/svg") { + walkNode = DOMWalker_1.DOMWalker.parentElement(walkNode); + continue; + } + var styles = CSSUtil.getDefinedStyles(walkNode, Object.keys(styleProps)); + // Check if ANY specified style property matches the criteria (OR logic) + for (var styleProp in styleProps) { + var value = styles[styleProp]; + if (!value) { + // Property not defined on this element, try next property + continue; + } + // Remove !important suffix for comparison + value = value.split(" ")[0]; + // Check if value should be excluded + if (excludedValues.includes(value)) { + continue; + } + // Check if value matches the criteria + var acceptedValues = styleProps[styleProp]; + if (acceptedValues.includes('*')) { + // Any value is acceptable (just checking existence) + CacheUtil_1.CacheUtil.setCache(elem, cacheKey, walkNode); + return walkNode; + } + else if (acceptedValues.includes(value)) { + // Value matches one of the accepted values + CacheUtil_1.CacheUtil.setCache(elem, cacheKey, walkNode); + return walkNode; + } + } + walkNode = DOMWalker_1.DOMWalker.parentElement(walkNode); + } + // No matching element or ancestor found - cache this result to avoid re-searching + CacheUtil_1.CacheUtil.setCache(elem, cacheKey, "NOT_FOUND"); + return null; + }; + /** + * return an array [value, Unit] from a value-unit combo string + * @param valueUnitCombo, such as 20px, 2rem + * @returns + */ + CSSUtil.getValueUnitPair = function (valueUnitCombo) { + if (!valueUnitCombo) + return null; + if (Number.isInteger(valueUnitCombo)) + return ["px", valueUnitCombo]; + var value = parseInt(valueUnitCombo); + if (isNaN(value)) + return null; + valueUnitCombo = valueUnitCombo.trim().toLowerCase(); + var match = valueUnitCombo.trim().match(/([a-z]+)$/); + var unit = 'px'; + if (match) + unit = match[1]; + return [unit, value]; + }; + return CSSUtil; +}()); +exports.CSSUtil = CSSUtil; + + +/***/ }, + +/***/ 4566 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.CacheUtil = void 0; +var DOMWalker_1 = __webpack_require__(3864); +var CacheUtil = /** @class */ (function () { + function CacheUtil() { + } + /* Return a pointer to the given global variable + * with its initial value as given */ + CacheUtil.getCache = function (cacheSpot, keyName, initValue) { + if (!cacheSpot) + return undefined; + var cacheObj = (cacheSpot.nodeType === 9 /* Node.DOCUMENT_NODE */ || cacheSpot.nodeType === 11 /* Node.DOCUMENT_FRAGMENT_NODE */) ? cacheSpot : cacheSpot; + if (cacheObj.aceCache === undefined) { + cacheObj.aceCache = {}; + } + if (cacheObj.aceCache[keyName] === undefined) { + cacheObj.aceCache[keyName] = initValue; + } + return cacheObj.aceCache[keyName]; + }; + CacheUtil.setCache = function (cacheSpot, globalName, value) { + if (!cacheSpot) + return undefined; + var cacheObj = (cacheSpot.nodeType === 9 /* Node.DOCUMENT_NODE */ || cacheSpot.nodeType === 11 /* Node.DOCUMENT_FRAGMENT_NODE */) ? cacheSpot : cacheSpot; + if (cacheObj.aceCache === undefined) { + cacheObj.aceCache = {}; + } + cacheObj.aceCache[globalName] = value; + return value; + }; + CacheUtil.getSetCache = function (cacheSpot, keyName, initFunc) { + if (!cacheSpot) + return undefined; + var cacheObj = (cacheSpot.nodeType === 9 /* Node.DOCUMENT_NODE */ || cacheSpot.nodeType === 11 /* Node.DOCUMENT_FRAGMENT_NODE */) ? cacheSpot : cacheSpot; + if (cacheObj.aceCache === undefined) { + cacheObj.aceCache = {}; + } + if (cacheObj.aceCache[keyName] === undefined || typeof cacheObj.aceCache[keyName] === "undefined") { + cacheObj.aceCache[keyName] = initFunc(); + } + return cacheObj.aceCache[keyName]; + }; + CacheUtil.clearCaches = function (cacheRoot) { + var numNodesVisited = 0; + delete cacheRoot.ownerDocument.aceCache; + var nw = new DOMWalker_1.DOMWalker(cacheRoot, false, cacheRoot, true); + do { + ++numNodesVisited; + delete nw.node.aceCache; + nw.node.ownerDocument && delete nw.node.ownerDocument.aceCache; + } while (nw.nextNode()); + return numNodesVisited; + }; + return CacheUtil; +}()); +exports.CacheUtil = CacheUtil; + + +/***/ }, + +/***/ 167 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ClipPathUtil = void 0; +var CacheUtil_1 = __webpack_require__(4566); +var CSSUtil_1 = __webpack_require__(4919); +var ClipPathUtil = /** @class */ (function () { + function ClipPathUtil() { + } + /** + * This function is responsible for checking if the node that is visually hidden by css clip-path: + * + * Note 1: If either current node or any of the parent nodes are visually hidden then this + * function will return true (node is not visually hidden). + * + * Note 2: nodes with CSS properties clip-path, the content is not considered hidden to an AT. Text hidden with these methods + * can still be reedable by screen readers. + * Note 3: if a link, form control, or other focusable element is given this style, the element would be focusable but not visible, + * keyboard users might be confused. + * + * @parm {Node} node The node which should be checked if it is visually hidden or not. + * @return {bool} true if the node is visually hidden, false otherwise + * + * @memberOf VisUtil + */ + ClipPathUtil.isNodeVisuallyHiddenByClipPath = function (node) { + if (!node || node.nodeType !== 1) + return false; + var elem = node; + var hidden = CacheUtil_1.CacheUtil.getCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", undefined); + if (hidden !== undefined) + return hidden; + var style = CSSUtil_1.CSSUtil.getComputedStyle(elem); + var width = parseInt(style.width); //always in px + var height = parseInt(style.height); //always in px + var path = style['clip-path']; + if (!path || path.trim() === 'none' || path.trim() === '') { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + path = path.trim().replace(/\s+/g, ' ').toLowerCase(); + var index = path.indexOf("inset("); + if (index !== -1) { + var round_index = path.indexOf("round"); + var str = path.substring(path.indexOf("(") + 1, path.indexOf(")")); + if (round_index !== -1) + str = path.substring(path.indexOf("(") + 1, round_index); + var numbers = str.trim().split(" "); + // When one value is specified, it applies the same inset to all four sides + if (numbers.length === 1) { + var ret = ClipPathUtil.isClippedByInset(elem, numbers[0], numbers[0], numbers[0], numbers[0]); + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", ret); + return ret; + } + // When two values are specified, the first value applies to the top and bottom, the second to the left and right. + if (numbers.length === 2) { + var ret = ClipPathUtil.isClippedByInset(elem, numbers[0], numbers[1], numbers[0], numbers[1]); + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", ret); + return ret; + } + // When three values are specified, the first applies to the top, the second to the right and left, the third to the bottom. + if (numbers.length === 3) { + var ret = ClipPathUtil.isClippedByInset(elem, numbers[0], numbers[1], numbers[1], numbers[2]); + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", ret); + return ret; + } + // When four values are specified, the values apply to the top, right, bottom, and left in that order (clockwise). + if (numbers.length === 4) { + var ret = ClipPathUtil.isClippedByInset(elem, numbers[0], numbers[1], numbers[2], numbers[3]); + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", ret); + return ret; + } + } + index = path.indexOf("rect("); + if (index !== -1) { + var round_index = path.indexOf("round"); + var str = path.substring(path.indexOf("(") + 1, path.indexOf(")")); + if (round_index !== -1) + str = path.substring(path.indexOf("(") + 1, round_index); + var numbers = str.trim().split(" "); + /** + * The first (top) and third (bottom) values are distances from the top edge of the containing block, + * and the second (right) and fourth (left) values are distances from the left edge of the containing block. + * The second (right) and third (bottom) values are clamped by the fourth (left) and first (top) values, respectively, + * + * If auto is used for the first (top) or fourth (left) value, the value of auto is 0, + * and if used for the second (right) or third (bottom) value, the value of auto is 100%. + */ + if (numbers[0] === 'auto') + numbers[0] = '0px'; + if (numbers[3] === 'auto') + numbers[3] = '0px'; + if (numbers[1] === 'auto') + numbers[1] = '100%'; + if (numbers[2] === 'auto') + numbers[2] = '100%'; + // to prevent the bottom edge from crossing over the top edge and right edge from crossing over the left edge. + // for example, rect(10px 0 0 20px) is clamped to rect(10px 20px 10px 20px) + numbers[2] = Math.max(numbers[0], numbers[2]); + numbers[1] = Math.max(numbers[1], numbers[3]); + var top_1 = parseInt(numbers[0]); + if (isNaN(top_1)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + if (numbers[0].endsWith("%")) + top_1 = top_1 * height / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(top_1); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + top_1 = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (top_1 >= height) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + var left = parseInt(numbers[3]); + if (isNaN(left)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + if (numbers[3].endsWith("%")) + left = left * width / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(left); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + left = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (left >= width) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + var right = parseInt(numbers[1]); + if (isNaN(right)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + if (numbers[1].endsWith("%")) + right = right * width / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(right); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + right = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + var bottom = parseInt(numbers[2]); + if (isNaN(bottom)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + if (numbers[2].endsWith("%")) + bottom = bottom * height / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(bottom); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + bottom = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if ((bottom - top_1) <= ClipPathUtil.THRESHOLD || (right - left) <= ClipPathUtil.THRESHOLD) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + index = path.indexOf("xywh("); + if (index !== -1) { + var round_index = path.indexOf("round"); + var str = path.substring(path.indexOf("(") + 1, path.indexOf(")")); + if (round_index !== -1) + str = path.substring(path.indexOf("(") + 1, round_index); + var numbers = str.trim().split(" "); + var x = parseInt(numbers[0]); + if (isNaN(x)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + if (numbers[0].endsWith("%")) + x = x * width / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(top); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + x = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (x >= width) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + var y = parseInt(numbers[1]); + if (isNaN(y)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + if (numbers[1].endsWith("%")) + y = y * height / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(y); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + scrollY = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (y >= height) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + var w = parseInt(numbers[2]); + if (isNaN(w)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + if (numbers[2].endsWith("%")) + w = w * width / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(w); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + w = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (w <= ClipPathUtil.THRESHOLD) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", true); + return true; + } + var h = parseInt(numbers[3]); + if (isNaN(h)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + if (numbers[3].endsWith("%")) + h = h * height / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(h); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + h = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (h <= ClipPathUtil.THRESHOLD) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + index = path.indexOf("circle("); + if (index !== -1) { + var str = path.substring(path.indexOf("(") + 1, path.indexOf(")")); + var numbers = str.trim().split(" "); + var radius = parseInt(numbers[0]); + if (isNaN(radius)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + if (numbers[0].endsWith("%")) { + var short = width > height ? height : width; + radius = radius * short / 100; + } + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(radius); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + radius = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (radius <= ClipPathUtil.THRESHOLD) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + index = path.indexOf("ellipse("); + if (index !== -1) { + var str = path.substring(path.indexOf("(") + 1, path.indexOf(")")); + var numbers = str.trim().split(" "); + // ellipse(closest-side farthest-side at 30% 40%); + if (numbers.length > 3 && numbers[0] === 'closest-side' && numbers[1] === 'farthest-side' && numbers[2] === 'at') { + var radius = parseInt(numbers[3]); + if (numbers.length === 4) { + if (numbers[3].endsWith("%")) { + var value = width > height ? height : width; + radius = radius * value / 100; + } + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(radius); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + radius = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (radius <= ClipPathUtil.THRESHOLD) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + else if (numbers.length === 5) { + for (var i = 3; i < numbers.length; i++) { + var radius_1 = parseInt(numbers[i]); + if (numbers[i].endsWith("%")) { + var value = (i === 3) ? width : height; + radius_1 = radius_1 * value / 100; + } + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(radius_1); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + radius_1 = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (radius_1 <= ClipPathUtil.THRESHOLD) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + // ellipse(40% 50% at left); + var at_index = path.indexOf("at"); + str = path.substring(path.indexOf("(") + 1, path.indexOf(")")); + if (at_index !== -1) + str = path.substring(path.indexOf("(") + 1, at_index); + numbers = str.trim().split(" "); + if (numbers.length !== 2) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + for (var i = 0; i < numbers.length; i++) { + var radius = parseInt(numbers[i]); + if (numbers[i].endsWith("%")) { + var value = (i === 0) ? width : height; + radius = radius * value / 100; + } + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(radius); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + radius = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (radius <= ClipPathUtil.THRESHOLD) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + index = path.indexOf("polygon("); + if (index !== -1) { + var str = path.substring(path.indexOf("(") + 1, path.indexOf(")")); + var numbers = str.trim().split(","); + // polygon(nonzero|evenodd, 0% 0%, 50% 50%, 0% 100%) + if (numbers[0] === 'nonzero' || numbers[0] === 'evenodd') + numbers.shift(); + var y = 0; + var x = 0; + var changed_x = false; + var changed_y = false; + for (var i = 0; i < numbers.length; i++) { + var coordinates = numbers[i].trim().split(" "); + if (coordinates.length != 2) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + var coordinate_xy = [0, 0]; + for (var i_1 = 0; i_1 < 2; i_1++) { + var value = parseInt(coordinates[i_1]); + if (isNaN(value)) + return false; + if (coordinates[i_1].endsWith("%")) + coordinate_xy[i_1] = (i_1 === 0) ? value * width / 100 : value * height / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(coordinates[i_1]); + if (!pair) + return false; + coordinate_xy[i_1] = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + } + if (i === 0) { + x = coordinate_xy[0]; + y = coordinate_xy[1]; + } + if (Math.abs(coordinate_xy[0] - x) >= ClipPathUtil.THRESHOLD) + changed_x = true; + if (Math.abs(coordinate_xy[1] - y) >= ClipPathUtil.THRESHOLD) + changed_y = true; + } + if (changed_x && changed_y) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + }; + ClipPathUtil.isClippedByInset = function (elem, top, right, bottom, left) { + if (right === void 0) { right = '0px'; } + if (bottom === void 0) { bottom = '0px'; } + if (left === void 0) { left = '0px'; } + var style = CSSUtil_1.CSSUtil.getComputedStyle(elem); + var width = parseInt(style.width); //always in px + var height = parseInt(style.height); //always in px + // top + var top_value = parseInt(top); + if (isNaN(top_value)) + return false; + if (top.endsWith("%")) + top_value = top_value * height / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(top); + if (!pair) + return false; + top_value = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + //inset outside of the container + if (top_value > height) + return false; + // right + var right_value = parseInt(right); + if (isNaN(right_value)) + return false; + if (right.endsWith("%")) + right_value = right_value * width / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(right); + if (!pair) + return false; + right_value = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + //inset outside of the container + if (right_value > width) + return false; + // bottom + var bottom_value = parseInt(bottom); + if (isNaN(bottom_value)) + return false; + if (bottom.endsWith("%")) + bottom_value = bottom_value * height / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(bottom); + if (!pair) + return false; + bottom_value = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + //inset outside of the container + if (bottom_value > height) + return false; + // left + var left_value = parseInt(left); + if (isNaN(left_value)) + return false; + if (left.endsWith("%")) + left_value = left_value * width / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(left); + if (!pair) + return false; + left_value = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + //inset outside of the container + if (left_value > width) + return false; + if (height - (top_value + bottom_value) <= ClipPathUtil.THRESHOLD || width - (right_value + left_value) <= ClipPathUtil.THRESHOLD) + return true; + return false; + }; + ClipPathUtil.THRESHOLD = 5; // 5px + return ClipPathUtil; +}()); +exports.ClipPathUtil = ClipPathUtil; + + +/***/ }, + +/***/ 3883 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ColorObj = exports.ColorUtil = void 0; +var DOMWalker_1 = __webpack_require__(3864); +var ColorUtil = /** @class */ (function () { + function ColorUtil() { + } + // Rewrite the color object to account for alpha + ColorUtil.Color = function (cssStyleColor) { + if (!cssStyleColor) + return null; + cssStyleColor = cssStyleColor.toLowerCase(); + if (cssStyleColor === "transparent") + return new ColorObj(255, 255, 255, 0); + if (cssStyleColor in ColorUtil.CSSColorLookup) + cssStyleColor = ColorUtil.CSSColorLookup[cssStyleColor]; + if (cssStyleColor.startsWith("rgb(")) { + var rgbRegex = /\s*rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/; + var m = cssStyleColor.match(rgbRegex); + if (m === null) + return null; + else { + return new ColorObj(m[1], m[2], m[3]); + } + } + else if (cssStyleColor.startsWith("rgba(")) { + var rgbRegex = /\s*rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(.+)\s*\)/; + var m = cssStyleColor.match(rgbRegex); + if (m === null) + return null; + else { + return new ColorObj(m[1], m[2], m[3], m[4]); + } + } + else if (cssStyleColor.charAt(0) != "#") { + return null; + } + else { + if (cssStyleColor.length === 4) { + // The three-digit RGB (#rgb) is converted to six-digit form (#rrggbb) by replicating digits + // (https://www.w3.org/TR/css-color-3/#rgb-color) + cssStyleColor = "#" + cssStyleColor.charAt(1).repeat(2) + + cssStyleColor.charAt(2).repeat(2) + + cssStyleColor.charAt(3).repeat(2); + } + var thisRed = parseInt(cssStyleColor.substring(1, 3), 16); + var thisGreen = parseInt(cssStyleColor.substring(3, 5), 16); + var thisBlue = parseInt(cssStyleColor.substring(5, 7), 16); + return new ColorObj(thisRed, thisGreen, thisBlue); + } + // return null; // Unreachable + }; + ; + ColorUtil.ColorCombo = function (ruleContext) { + try { + var doc = ruleContext.ownerDocument; + if (!doc) { + return null; + } + var win = doc.defaultView; + if (!win) { + return null; + } + var ancestors = []; + var walkNode = ruleContext; + while (walkNode) { + if (walkNode.nodeType === 1) + ancestors.push(walkNode); + walkNode = DOMWalker_1.DOMWalker.parentElement(walkNode); + } + var retVal = { + "hasGradient": false, + "hasBGImage": false, + "textShadow": false, + "fg": null, + "bg": null + }; + // start + var cStyle = win.getComputedStyle(ruleContext); + var compStyleColor = cStyle.color; + if (!compStyleColor) + compStyleColor = "black"; + var fg = ColorUtil.Color(compStyleColor); + var reColor = /transparent|rgba?\([^)]+\)/gi; + var guessGradColor = function (gradList, bgColor, fgColor) { + try { + // If there's only one color, return that + if (typeof gradList.length === "undefined") + return gradList; + var overallWorst = null; + var overallWorstRatio = null; + for (var iGrad = 1; iGrad < gradList.length; ++iGrad) { + var worstColor = gradList[iGrad - 1]; + var worstRatio = fgColor.contrastRatio(gradList[iGrad - 1]); + var step = .1; + var idx = 0; + while (step > .0001) { + while (idx + step <= 1 && worstRatio > fgColor.contrastRatio(gradList[iGrad].mix(gradList[iGrad - 1], idx + step).getOverlayColor(bgColor))) { + worstColor = gradList[iGrad].mix(gradList[iGrad - 1], idx + step).getOverlayColor(bgColor); + worstRatio = fgColor.contrastRatio(worstColor); + idx = idx + step; + } + while (idx - step >= 0 && worstRatio > fgColor.contrastRatio(gradList[iGrad].mix(gradList[iGrad - 1], idx - step).getOverlayColor(bgColor))) { + worstColor = gradList[iGrad].mix(gradList[iGrad - 1], idx - step).getOverlayColor(bgColor); + worstRatio = fgColor.contrastRatio(worstColor); + idx = idx - step; + } + step = step / 10; + } + if (overallWorstRatio === null || overallWorstRatio > worstRatio) { + overallWorstRatio = worstRatio; + overallWorst = worstColor; + } + } + return overallWorst; // return the darkest color + } + catch (e) { + console.log(e); + } + return bgColor; + }; + var priorStackBG = ColorUtil.Color("white"); + var thisStackOpacity = null; + var thisStackAlpha = null; + var thisStackBG = null; + // Ancestors processed from the topmost parent toward the child + while (ancestors.length > 0) { + var procNext = ancestors.pop(); + //var procNext = ancestors.splice(0, 1)[0]; + // cStyle is the computed style of this layer + var cStyle = win.getComputedStyle(procNext); + if (cStyle === null) + continue; + // thisBgColor is the color of this layer or null if the layer is transparent + var thisBgColor = null; + if (cStyle.backgroundColor && cStyle.backgroundColor != "transparent" && cStyle.backgroundColor != "rgba(0, 0, 0, 0)") { + thisBgColor = ColorUtil.Color(cStyle.backgroundColor); + } + // If there is a gradient involved, set thisBgColor to the worst color combination available against the foreground + if (cStyle.backgroundImage && cStyle.backgroundImage.indexOf && cStyle.backgroundImage.indexOf("gradient") != -1) { + var gradColors = cStyle.backgroundImage.match(reColor); + if (gradColors) { + var gradColorComp = []; + for (var i = 0; i < gradColors.length; ++i) { + if (!gradColors[i].length) { + gradColors.splice(i--, 1); + } + else { + var colorComp = ColorUtil.Color(gradColors[i]); + if (colorComp.alpha !== undefined && colorComp.alpha < 1) { + // mix the grdient bg color wit parent bg if alpha < 1 + var compStackBg = thisStackBG || priorStackBG; + colorComp = colorComp.getOverlayColor(compStackBg); + } + gradColorComp.push(colorComp); + } + } + thisBgColor = guessGradColor(gradColorComp, thisStackBG || priorStackBG, fg); + } + } + // Handle non-solid opacity + if (thisStackOpacity === null || (cStyle.opacity && cStyle.opacity.length > 0 && parseFloat(cStyle.opacity) < 1)) { + // New stack, reset + if (thisStackBG != null) { + // Overlay + thisStackBG.alpha = thisStackOpacity * thisStackAlpha; + priorStackBG = thisStackBG.getOverlayColor(priorStackBG); + } + thisStackOpacity = 1.0; + thisStackAlpha = null; + thisStackBG = null; + if (cStyle.opacity && cStyle.opacity.length > 0) { + thisStackOpacity = parseFloat(cStyle.opacity); + } + if (thisBgColor != null) { + thisStackBG = thisBgColor; + thisStackAlpha = thisStackBG.alpha || 1.0; + delete thisStackBG.alpha; + if (thisStackOpacity === 1.0 && thisStackAlpha === 1.0) { + retVal.hasBGImage = false; + retVal.hasGradient = false; + } + } + } + // Handle solid color backgrounds and gradient color backgrounds + else if (thisBgColor != null) { + // If this stack already has a background color, blend it + if (thisStackBG === null) { + thisStackBG = thisBgColor; + thisStackAlpha = thisStackBG.alpha || 1.0; + delete thisStackBG.alpha; + } + else { + thisStackBG = thisBgColor.getOverlayColor(thisStackBG); + //thisStackAlpha = thisBgColor.alpha || 1.0; + thisStackAlpha = thisStackBG.alpha || 1.0; + } + // #526: If thisBgColor had an alpha value, it may not expose through thisStackBG in the above code + // We can't wipe out the gradient info if this layer was transparent + if (thisStackOpacity === 1.0 && thisStackAlpha === 1.0 && (thisStackBG.alpha || 1.0) === 1.0 && (thisBgColor.alpha || 1.0) === 0) // removed by dead control flow +{} + } + if (cStyle.backgroundImage && cStyle.backgroundImage != "none") { + if (cStyle.backgroundImage.indexOf && cStyle.backgroundImage.indexOf("gradient") != -1) { + retVal.hasGradient = true; + } + else { + retVal.hasBGImage = true; + } + } + } + if (thisStackBG != null) { + fg = fg.getOverlayColor(thisStackBG); + delete fg.alpha; + } + fg.alpha = (fg.alpha || 1) * thisStackOpacity; + fg = fg.getOverlayColor(priorStackBG); + if (thisStackBG != null) { + thisStackBG.alpha = thisStackOpacity * thisStackAlpha; + priorStackBG = thisStackBG.getOverlayColor(priorStackBG); + } + retVal.fg = fg; + retVal.bg = priorStackBG; + if (cStyle.textShadow && cStyle.textShadow !== 'none') + retVal.textShadow = true; + return retVal; + } + catch (err) { + // something happened, then... + return null; + } + }; + ; + ColorUtil.CSSColorLookup = { + "aliceblue": "#f0f8ff", + "antiquewhite": "#faebd7", + "aqua": "#00ffff", + "aquamarine": "#7fffd4", + "azure": "#f0ffff", + "beige": "#f5f5dc", + "bisque": "#ffe4c4", + "black": "#000000", + "blanchedalmond": "#ffebcd", + "blue": "#0000ff", + "blueviolet": "#8a2be2", + "brown": "#a52a2a", + "burlywood": "#deb887", + "cadetblue": "#5f9ea0", + "chartreuse": "#7fff00", + "chocolate": "#d2691e", + "coral": "#ff7f50", + "cornflowerblue": "#6495ed", + "cornsilk": "#fff8dc", + "crimson": "#dc143c", + "cyan": "#00ffff", + "darkblue": "#00008b", + "darkcyan": "#008b8b", + "darkgoldenrod": "#b8860b", + "darkgray": "#a9a9a9", + "darkgreen": "#006400", + "darkkhaki": "#bdb76b", + "darkmagenta": "#8b008b", + "darkolivegreen": "#556b2f", + "darkorange": "#ff8c00", + "darkorchid": "#9932cc", + "darkred": "#8b0000", + "darksalmon": "#e9967a", + "darkseagreen": "#8fbc8f", + "darkslateblue": "#483d8b", + "darkslategray": "#2f4f4f", + "darkturquoise": "#00ced1", + "darkviolet": "#9400d3", + "deeppink": "#ff1493", + "deepskyblue": "#00bfff", + "dimgray": "#696969", + "dodgerblue": "#1e90ff", + "firebrick": "#b22222", + "floralwhite": "#fffaf0", + "forestgreen": "#228b22", + "fuchsia": "#ff00ff", + "gainsboro": "#dcdcdc", + "ghostwhite": "#f8f8ff", + "gold": "#ffd700", + "goldenrod": "#daa520", + "gray": "#808080", + "green": "#008000", + "greenyellow": "#adff2f", + "honeydew": "#f0fff0", + "hotpink": "#ff69b4", + "indianred": "#cd5c5c", + "indigo": "#4b0082", + "ivory": "#fffff0", + "khaki": "#f0e68c", + "lavender": "#e6e6fa", + "lavenderblush": "#fff0f5", + "lawngreen": "#7cfc00", + "lemonchiffon": "#fffacd", + "lightblue": "#add8e6", + "lightcoral": "#f08080", + "lightcyan": "#e0ffff", + "lightgoldenrodyellow": "#fafad2", + "lightgrey": "#d3d3d3", + "lightgreen": "#90ee90", + "lightpink": "#ffb6c1", + "lightsalmon": "#ffa07a", + "lightseagreen": "#20b2aa", + "lightskyblue": "#87cefa", + "lightslategray": "#778899", + "lightsteelblue": "#b0c4de", + "lightyellow": "#ffffe0", + "lime": "#00ff00", + "limegreen": "#32cd32", + "linen": "#faf0e6", + "magenta": "#ff00ff", + "maroon": "#800000", + "mediumaquamarine": "#66cdaa", + "mediumblue": "#0000cd", + "mediumorchid": "#ba55d3", + "mediumpurple": "#9370d8", + "mediumseagreen": "#3cb371", + "mediumslateblue": "#7b68ee", + "mediumspringgreen": "#00fa9a", + "mediumturquoise": "#48d1cc", + "mediumvioletred": "#c71585", + "midnightblue": "#191970", + "mintcream": "#f5fffa", + "mistyrose": "#ffe4e1", + "moccasin": "#ffe4b5", + "navajowhite": "#ffdead", + "navy": "#000080", + "oldlace": "#fdf5e6", + "olive": "#808000", + "olivedrab": "#6b8e23", + "orange": "#ffa500", + "orangered": "#ff4500", + "orchid": "#da70d6", + "palegoldenrod": "#eee8aa", + "palegreen": "#98fb98", + "paleturquoise": "#afeeee", + "palevioletred": "#d87093", + "papayawhip": "#ffefd5", + "peachpuff": "#ffdab9", + "peru": "#cd853f", + "pink": "#ffc0cb", + "plum": "#dda0dd", + "powderblue": "#b0e0e6", + "purple": "#800080", + "red": "#ff0000", + "rosybrown": "#bc8f8f", + "royalblue": "#4169e1", + "saddlebrown": "#8b4513", + "salmon": "#fa8072", + "sandybrown": "#f4a460", + "seagreen": "#2e8b57", + "seashell": "#fff5ee", + "sienna": "#a0522d", + "silver": "#c0c0c0", + "skyblue": "#87ceeb", + "slateblue": "#6a5acd", + "slategray": "#708090", + "snow": "#fffafa", + "springgreen": "#00ff7f", + "steelblue": "#4682b4", + "tan": "#d2b48c", + "teal": "#008080", + "thistle": "#d8bfd8", + "tomato": "#ff6347", + "turquoise": "#40e0d0", + "violet": "#ee82ee", + "wheat": "#f5deb3", + "white": "#ffffff", + "whitesmoke": "#f5f5f5", + "yellow": "#ffff00", + "yellowgreen": "#9acd32", + "buttontext": "rgba(0, 0, 0, 0.847)", + "buttonface": "#ffffff", + "graytext": "rgba(0, 0, 0, 0.247)" + }; + return ColorUtil; +}()); +exports.ColorUtil = ColorUtil; +var ColorObj = /** @class */ (function () { + function ColorObj(red, green, blue, alpha) { + function fixComponent(comp) { + if (typeof (comp) != typeof ("")) + return comp; + var compStr = comp; + compStr = compStr.trim(); + if (compStr[compStr.length - 1] != "%") + return parseInt(compStr); + return Math.round(parseFloat(compStr.substring(0, compStr.length - 1)) * 2.55); + } + this.red = fixComponent(red); + this.green = fixComponent(green); + this.blue = fixComponent(blue); + if (typeof (alpha) != "undefined") { + this.alpha = (typeof (alpha) === typeof ("")) ? parseFloat(alpha) : alpha; + } + } + ColorObj.prototype.toHexHelp = function (value) { + var retVal = Math.round(value).toString(16); + if (retVal.length === 1) + return "0" + retVal; + return retVal; + }; + ; + ColorObj.prototype.toHex = function () { + return "#" + this.toHexHelp(this.red) + this.toHexHelp(this.green) + this.toHexHelp(this.blue); + }; + ; + ColorObj.prototype.contrastRatio = function (bgColor) { + var fgColor = this; + if (typeof (this.alpha) != "undefined") + fgColor = this.getOverlayColor(bgColor); + var lum1 = fgColor.relativeLuminance(); + if (!bgColor.relativeLuminance) { + var s = ""; + for (var key in bgColor) { + s += key + "\n"; + } + alert(bgColor); + alert(s); + } + var lum2 = bgColor.relativeLuminance(); + var ratio = (lum1 > lum2) ? (lum1 + .05) / (lum2 + .05) : (lum2 + .05) / (lum1 + .05); + return ratio; + }; + ; + ColorObj.prototype.relativeLuminance = function () { + var R = this.red / 255.0; + var G = this.green / 255.0; + var B = this.blue / 255.0; + R = R <= .04045 ? R / 12.92 : Math.pow((R + .055) / 1.055, 2.4); + G = G <= .04045 ? G / 12.92 : Math.pow((G + .055) / 1.055, 2.4); + B = B <= .04045 ? B / 12.92 : Math.pow((B + .055) / 1.055, 2.4); + return 0.2126 * R + 0.7152 * G + 0.0722 * B; + }; + ; + ColorObj.prototype.mix = function (color2, percThis) { + if (typeof (this.alpha) === "undefined" && typeof (color2.alpha) === "undefined") { + return new ColorObj(percThis * this.red + (1 - percThis) * color2.red, percThis * this.green + (1 - percThis) * color2.green, percThis * this.blue + (1 - percThis) * color2.blue); + } + else { + var alphaThis = this.alpha ? this.alpha : 1; + var alphaOther = color2.alpha ? color2.alpha : 1; + return new ColorObj(percThis * this.red + (1 - percThis) * color2.red, percThis * this.green + (1 - percThis) * color2.green, percThis * this.blue + (1 - percThis) * color2.blue, percThis * alphaThis + (1 - percThis) * alphaOther); + } + }; + ; + ColorObj.prototype.getOverlayColor = function (bgColor) { + if (typeof (this.alpha) === "undefined" || this.alpha >= 1) { + // No mixing required - it's opaque + return this; + } + if (this.alpha < 0) { + // Haac.Error.logError("Invalid alpha value"); + return null; + } + if (typeof (bgColor.alpha) != "undefined" && bgColor.alpha < 1) { + // Haac.Error.logError("Cannot mix with a background alpha"); + return null; + } + var retVal = this.mix(bgColor, this.alpha); + delete retVal.alpha; + return retVal; + }; + ColorObj.fromCSSColor = function (cssStyleColor) { + var thisRed = -1; + var thisGreen = -1; + var thisBlue = -1; + cssStyleColor = cssStyleColor.toLowerCase(); + if (cssStyleColor.startsWith("rgb(")) { + var rgbRegex = /\s*rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/; + var m = cssStyleColor.match(rgbRegex); + if (m === null) + return null; + else { + thisRed = m[1]; + thisGreen = m[2]; + thisBlue = m[3]; + } + } + else if (cssStyleColor.startsWith("rgba(")) { + var rgbRegex = /\s*rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(.+)\s*\)/; + var m = cssStyleColor.match(rgbRegex); + if (m === null) + return null; + else { + thisRed = m[1]; + thisGreen = m[2]; + thisBlue = m[3]; + } + } + else { + if (cssStyleColor.charAt(0) != "#") { + if (cssStyleColor in ColorUtil.CSSColorLookup) + cssStyleColor = ColorUtil.CSSColorLookup[cssStyleColor]; + else + return null; + } + var fromHex = function (val) { + var lookup = { + "a": 10, + "b": 11, + "c": 12, + "d": 13, + "e": 14, + "f": 15 + }; + var retVal = 0; + for (var i = 0; i < val.length; ++i) { + retVal = retVal * 16 + + parseInt(val.charAt(i) in lookup ? lookup[val.charAt(i)] : val.charAt(i)); + } + return retVal; + }; + if (cssStyleColor.length === 4) { + // The three-digit RGB (#rgb) is converted to six-digit form (#rrggbb) by replicating digits + // (https://www.w3.org/TR/css-color-3/#rgb-color) + cssStyleColor = "#" + cssStyleColor.charAt(1).repeat(2) + + cssStyleColor.charAt(2).repeat(2) + + cssStyleColor.charAt(3).repeat(2); + } + thisRed = fromHex(cssStyleColor.substring(1, 3)); + thisGreen = fromHex(cssStyleColor.substring(3, 5)); + thisBlue = fromHex(cssStyleColor.substring(5, 7)); + } + return new ColorObj(thisRed, thisGreen, thisBlue); + }; + return ColorObj; +}()); +exports.ColorObj = ColorObj; + + +/***/ }, + +/***/ 7139 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.CommonUtil = void 0; +var ARIADefinitions_1 = __webpack_require__(9910); +var CacheUtil_1 = __webpack_require__(4566); +var AriaUtil_1 = __webpack_require__(7011); +var AccNameUtil_1 = __webpack_require__(1950); +var VisUtil_1 = __webpack_require__(3946); +var DOMUtil_1 = __webpack_require__(1686); +var DOMWalker_1 = __webpack_require__(3864); +var fragment_1 = __webpack_require__(5279); +var CommonUtil = /** @class */ (function () { + function CommonUtil() { + } + CommonUtil.wordCount = function (str) { + str = str.trim(); + if (str.length === 0) + return 0; + return str.split(/\s+/g).length; + }; + /** + * Note that this only detects if the element itself is in the tab order. + * However, this element may delegate focus to another element via aria-activedescendant. + * Also, focus varies by browser... sticking to things that are focusable on Chrome and Firefox. + */ + CommonUtil.isTabbable = function (element) { + // Using https://allyjs.io/data-tables/focusable.html + // Handle the explicit cases first + if (!VisUtil_1.VisUtil.isNodeVisible(element)) + return false; + if (element.hasAttribute("inert") || DOMUtil_1.DOMUtil.getAncestorWithAttribute(element, "inert", "")) + return false; + if (element.hasAttribute("tabindex")) { + return parseInt(element.getAttribute("tabindex")) >= 0; + } + // Explicit cases handled - now the implicit + var nodeName = element.nodeName.toLowerCase(); + if (nodeName in CommonUtil.tabTagMap) { + var retVal = CommonUtil.tabTagMap[nodeName]; + if (typeof (retVal) === "function") { + retVal = retVal(element); + } + return retVal; + } + else { + if (element.hasAttribute("contenteditable")) + return true; + return false; + } + }; + /** + * Test if the ele node is focusable + */ + CommonUtil.isFocusable = function (ele) { + if (ele === "undefined" || ele === null) { + return false; + } + return CommonUtil.isTabbable(ele); + }; + /** + * Note that this only detects if the element itself is interactive, but not onclick event. + */ + CommonUtil.isClickable = function (element) { + if (!VisUtil_1.VisUtil.isNodeVisible(element)) + return false; + // native focusable element + var nodeName = element.nodeName.toLowerCase(); + if (nodeName in CommonUtil.tabTagMap) { + var retVal = CommonUtil.tabTagMap[nodeName]; + if (typeof (retVal) === "function") { + retVal = retVal(element); + } + return retVal; + } + else { + //custom widget + if (AriaUtil_1.AriaUtil.isWidget(element) && element.hasAttribute("tabindex")) { + return true; + } + } + return false; + }; + /* + * get conflict Aria and Html attributes + * return: a list of Aria and Html attribute pairs that are conflict + */ + CommonUtil.isTableDescendant = function (contextHierarchies) { + if (!contextHierarchies) + return null; + return contextHierarchies["aria"].filter(function (hier) { return ["table", "grid", "treegrid"].includes(hier.role); }); + }; + CommonUtil.tabIndexLEZero = function (elem) { + if (CommonUtil.hasAttribute(elem, "tabindex")) { + if (elem.getAttribute("tabindex").match(/^-?\d+$/)) { + var tabindexValue = parseInt(elem.getAttribute("tabindex")); + return tabindexValue === 0 || tabindexValue === -1; + } + } + return false; + }; + /** + * get number of tabbable children + * @param element + */ + CommonUtil.getTabbableChildren = function (element) { + var count = 0; + // If node has children, look for tab stops in the children + if (element.firstChild || element.nodeName.toUpperCase() === "IFRAME") { + var nw = new DOMWalker_1.DOMWalker(element); + while (nw.nextNode() && nw.node != element) { + if (nw.node.nodeType == 1 && !nw.bEndTag && CommonUtil.isTabbable(nw.node)) { + ++count; + } + } + } + return count; + }; + CommonUtil.normalizeSpacing = function (s) { + if (!s) + return ''; + return s.trim().replace(/\s+/g, ' '); + }; + ; + //TODO: function does not handle equivalents for roles: row, link, header, button + // But it may not have to. Bug reports have been about radio buttons and checkboxes. + CommonUtil.isHtmlEquiv = function (node, htmlEquiv) { + var retVal = false; + if (node) { + var nodeName = node.nodeName.toLowerCase(); + if (nodeName === "input") { + var type = node.getAttribute("type").toLowerCase(); + if (type) { + if (htmlEquiv.indexOf("checkbox") != -1) { + retVal = type === "checkbox"; + } + else if (htmlEquiv.indexOf("radio") != -1) { + retVal = type === "radio"; + } + } + } + } + return retVal; + }; + CommonUtil.nonExistantIDs = function (node, targetids) { + var returnnotfoundids = ''; + if (CommonUtil.normalizeSpacing(targetids).length < 1) + return returnnotfoundids; + var targetArray = targetids.split(" "); + var doc = node.ownerDocument; + for (var i = 0; i < targetArray.length; i++) { + var xp = "//*[@id='" + targetArray[i] + "']"; + var xpathResult = doc.evaluate(xp, node, doc.defaultNSResolver, 0 /* XPathResult.ANY_TYPE */, null); + var r = xpathResult.iterateNext(); + if (!r) + returnnotfoundids += targetArray[i] + ', '; + } + if (CommonUtil.normalizeSpacing(returnnotfoundids).length >= 2) + returnnotfoundids = returnnotfoundids.substring(0, returnnotfoundids.length - 2); + else + returnnotfoundids = ''; + return returnnotfoundids; + }; + CommonUtil.getDocElementsByTag = function (elem, tagName) { + var doc = fragment_1.FragmentUtil.getOwnerFragment(elem); + tagName = tagName.toLowerCase(); + var cache = CacheUtil_1.CacheUtil.getCache(doc, "RPT_DOCELEMSBYTAG", {}); + if (!(tagName in cache)) { + cache[tagName] = doc.querySelectorAll(tagName); + CacheUtil_1.CacheUtil.setCache(doc, "RPT_DOCELEMSBYTAG", cache); + } + return cache[tagName]; + }; + /** + * This function is responsible for get a list of all the child elemnts which match the tag + * name provided. + * + * Note: This is a wrapper function to: AriaUtil.getChildByTagHidden + * + * @parm {element} parentElem - The parent element + * @parm {string} tagName - The tag to search for under the parent element + * @parm {boolean} ignoreHidden - true if hidden elements with the tag should ignored from the list + * false if the hidden elements should be added + * + * @return {List} retVal - list of all the elements which matched the tag under the parent that were provided. + * + * @memberOf AriaUtil + */ + CommonUtil.getChildByTag = function (parentElem, tagName) { + return CommonUtil.getChildByTagHidden(parentElem, tagName, false, false); + }; + /** + * This function is responsible for get a list of all the child elemnts which match the tag + * name provided. + * + * @parm {element} parentElem - The parent element + * @parm {string} tagName - The tag to search for under the parent element + * @parm {boolean} ignoreHidden - true if hidden elements with the tag should ignored from the list + * false if the hidden elements should be added + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * + * @return {List} retVal - list of all the elements which matched the tag under the parent that were provided. + * + * @memberOf AriaUtil + */ + CommonUtil.getChildByTagHidden = function (parentElem, tagName, ignoreHidden, considerHiddenSetting) { + // Variable Decleration + var retVal = []; + var child = parentElem.firstChild; + // Loop over all the child elements of the parent to build a list of all the elements that + // match the tagName provided + while (child != null) { + // Only include the children into the return array if they match with tagname. + if (child.nodeName.toLowerCase() === tagName) { + // In the case that ignorehidden was set to true, then perform a isNodeVisible check + // and in the case the node is not visilble we more to theses then move to the next node. + // Perform a couple of checks to determine if hidden elements should be ignored or not. + // 1. When ignoreHidden is set to true upfront, then perform a isNodeVisible + // 2. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2.1. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + if ((ignoreHidden || (considerHiddenSetting && !CommonUtil.shouldCheckHiddenContent(child))) && !VisUtil_1.VisUtil.isNodeVisible(child)) { + // Move on to the next element + child = child.nextSibling; + continue; + } + // Push the element + retVal.push(child); + } + // Move to the next sibling element + child = child.nextSibling; + } + return retVal; + }; + /** + * This function is responsible for finding a list of elements that match given roles(s). + * This function by defauly will not consider Check Hidden Setting at all. + * This function by defauly will not consider implicit roles. + * Note: This is a wrapper function to: AriaUtil.getElementsByRoleHidden + * + * @parm {document} doc - The document node + * @parm {list or string} roles - List or single role for which to return elements based on. + * + * @return {List} retVal - list of all the elements which matched the role(s) that were provided. + * + * @memberOf AriaUtil + */ + CommonUtil.getElementsByRole = function (doc, roles) { + return CommonUtil.getElementsByRoleHidden(doc, roles, false, false); + }; + /** + * This function is responsible for finding a list of elements that match given roles(s). + * This function aslo finds elements with implicit roles. + * This function will also consider elements that are hidden based on the if the Check + * Hidden Content settings should be considered or not. + * + * @parm {document} doc - The document node + * @parm {list or string} roles - List or single role for which to return elements based on. + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {List} retVal - list of all the elements which matched the role(s) that were provided. + * + * @memberOf AriaUtil + */ + CommonUtil.getElementsByRoleHidden = function (doc, roles, considerHiddenSetting, considerImplicitRoles) { + // In the case that the role to element assoication is already made, and available in the global hasAttribute + // we can just use that one instead of building a new one. + var roleToElems = null; + if (considerImplicitRoles) { + roleToElems = CacheUtil_1.CacheUtil.getCache(doc, "AriaUtil_GETELEMENTSBY_ROLE_IMPLICIT", null); + } + else { + roleToElems = CacheUtil_1.CacheUtil.getCache(doc, "AriaUtil_GETELEMENTSBY_ROLE", null); + } + // Build the new role to element, this is where we loop through all the elements and extract all the + // elements bsaed on roles. + if (roleToElems === null) { + // Re-initialize the roleToElems hash + roleToElems = {}; + // Get the body of the doc + var root = doc.body; + // Keep looping until we are at the very parent node of the entire page, so that we can loop through + // all the nodes. + while (DOMWalker_1.DOMWalker.parentNode(root) !== null) { + // Get the parentNode + root = DOMWalker_1.DOMWalker.parentNode(root); + } + // Build a nodewalter based of the root node, this node walter will be use loop over all the nodes + // and build the roles to Element coralation + var nw = new DOMWalker_1.DOMWalker(root); + // Loop over the entire doc/list of nodes to build the role to element map + // Note: This will build an roleToElems hash which is in the following format. + // roleToElems = { + // document: [{div},{abbr},{var}], + // main: [{div}], + // navigation: [{div}] + // } + while (nw.nextNode()) { + if (!nw.elem()) + continue; + // Only check the elements which have the role attribute assiciated to them + if (!nw.bEndTag) { + var wRoles = []; + //check if the node has role attributes + if (nw.elem() && nw.elem().hasAttribute("role")) { + // Extract all the roles that are assigned to this element, can have multiple roles on one + // element split by space, so we need to extract all of them into an array. + wRoles = nw.elem().getAttribute("role").split(" "); + } + if (nw.elem() && wRoles.length === 0 && considerImplicitRoles) { + //check if there are any implicit roles for this element. + var implicitRole = AriaUtil_1.AriaUtil.getImplicitRole(nw.node); + if (implicitRole !== null && implicitRole.length > 0) + wRoles = implicitRole; + } + if (wRoles.length === 0) { + continue; + } + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (considerHiddenSetting && CommonUtil.shouldNodeBeSkippedHidden(nw.node)) { + continue; + } + // Loop through all the roles and assigned this node to all thes roles + for (var i = 0; i < wRoles.length; ++i) { + // In the case that the role key is not already in the roleToElems hash, construct the + // add the key and assign empty array. + if (!(wRoles[i] in roleToElems)) { + roleToElems[wRoles[i]] = []; + } + // Add the node to the array for the role + roleToElems[wRoles[i]].push(nw.node); + } + } + } + // Set the roleToElems hash map as a global variable + if (considerImplicitRoles) { + CacheUtil_1.CacheUtil.setCache(doc, "AriaUtil_GETELEMENTSBY_ROLE_IMPLICIT", roleToElems); + } + else { + CacheUtil_1.CacheUtil.setCache(doc, "AriaUtil_GETELEMENTSBY_ROLE", roleToElems); + } + } + // Initilize the return value + var retVal = []; + // Handle the cases where the provided role is a string and not an array, + // for this case we take the string and put it into an array + if (typeof (roles) === "string") { + var role = roles; + roles = []; + roles.push(role); + } + // Loop through the roles that were provided and find the list of elements for this roles + // and add them to the return value. + if (roles.length) { + // loop over all the roles + for (var i = 0; i < roles.length; ++i) { + // Extract the role from the array + var nextRole = roles[i]; + // Fetch the list of all the elements for this role + var copyRoles = roleToElems[nextRole]; + // If there are elements to copy to another array, then perform the copy + if (copyRoles) { + // Loop over all the elements which are to be copied + for (var j = 0; j < copyRoles.length; ++j) { + // Add this element to the return val + retVal.push(copyRoles[j]); + } + } + } + } + return retVal; + }; + /** + * a target is en element that accept a pointer action (click or touch) + * + */ + CommonUtil.isTarget = function (element) { + if (!element || element.nodeType !== 1 + || ["html", "body"].includes(element.nodeName.toLowerCase()) + || CommonUtil.getAncestor(element, ["svg", "pre", "code", "script", "meta", 'head']) !== null + || !VisUtil_1.VisUtil.isNodeVisible(element) || VisUtil_1.VisUtil.isNodeVisuallyHidden(element) + || CommonUtil.isNodeDisabled(element) || VisUtil_1.VisUtil.isElementOffscreen(element)) + return false; + if (CommonUtil.isClickable(element)) + return true; + var role = AriaUtil_1.AriaUtil.getResolvedRole(element); + if (!role) + return false; + var target_roles = ["listitem", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "switch", "treeitem"]; + if (target_roles.includes(role)) { + // find the proper parent elements + var parent_1 = element.parentElement; + if (parent_1) { + var parent_role = AriaUtil_1.AriaUtil.getResolvedRole(parent_1); + // datalist, fieldset, optgroup, etc. may be just used for grouping purpose, so go up to the parent + if (parent_role === 'group') + parent_1 = parent_1.parentElement; + } + if (parent_1 && CommonUtil.isTarget(parent_1)) + return true; + } + return false; + }; + CommonUtil.getFileExt = function (url) { + var m = url.match(/\.(([^;?#\.]|^$)+)([;?#]|$)/); + if (m != null && m.length >= 2) { + return "." + m[1]; + } + return ""; + }; + CommonUtil.getFileAnchor = function (url) { + var m = url.match(/#(([^;?\.]|^$)+)([;?]|$)/); + if (m != null && m.length >= 2) { + return m[1]; + } + return ""; + }; + CommonUtil.checkObjEmbed = function (node, extTest, mimeTest) { + var nodeName = node.nodeName.toLowerCase(); + if (nodeName != "object" && nodeName != "embed" && + nodeName != "a" && nodeName != "area") + return false; + var retVal = false; + // Check mime type + if (!retVal && node.hasAttribute("type")) { + var mime = node.getAttribute("type").toLowerCase(); + retVal = mimeTest(mime); + } + if (!retVal && node.hasAttribute("codetype")) { + var mime = node.getAttribute("codetype"); + retVal = mimeTest(mime); + } + // Check the filename + if (!retVal) { + var filename = ""; + if (nodeName === "embed") { + filename = node.getAttribute("src"); + } + else if (nodeName === "a" || nodeName === "area") { + filename = node.getAttribute("href"); + } + else if (node.hasAttribute("data")) { + filename = node.getAttribute("data"); + } + if (filename === null) + filename = ""; + var ext = CommonUtil.getFileExt(filename); + retVal = extTest(ext); + } + // Check for filenames in the params + if (!retVal && nodeName === "object") { + // In the case that Check Hidden Option is set then comply with that setting + var params = CommonUtil.getChildByTagHidden(node, "param", false, true); + for (var i = 0; !retVal && params != null && i < params.length; ++i) { + retVal = params[i].hasAttribute("value") && + extTest(CommonUtil.getFileExt(params[i].getAttribute("value"))); + } + } + return retVal; + }; + CommonUtil.isAudioObjEmbedLink = function (node) { + return CommonUtil.checkObjEmbed(node, CommonUtil.isAudioExt, function (mime) { + return mime.startsWith("audio"); + }); + }; + CommonUtil.isAudioExt = function (ext) { + var audio_extensions = [".aif", ".aifc", ".aiff", ".air", ".asf", ".au", ".cda", + ".dsm", ".dss", ".dwd", ".iff", ".kar", ".m1a", ".med", + ".mp2", ".mp3", ".mpa", ".pcm", ".ra", ".ram", ".rm", + ".sam", ".sf", ".sf2", ".smp", ".snd", ".svx", ".ul", + ".voc", ".wav", ".wma", ".wve" + ]; + return CommonUtil.valInArray(ext.toLowerCase(), audio_extensions); + }; + CommonUtil.isVideoObjEmbedLink = function (node) { + return CommonUtil.checkObjEmbed(node, CommonUtil.isVideoExt, function (mime) { + return mime.startsWith("video") || + mime.startsWith("application/x-shockwave-flash"); + }); + }; + CommonUtil.isVideoExt = function (ext) { + var video_extensions = [".asf", ".avi", ".divx", ".dv", ".m1v", ".m2p", ".m2v", ".moov", + ".mov", ".mp4", ".mpeg", ".mpg", ".mpv", ".ogm", ".omf", ".qt", + ".rm", ".rv", ".smi", ".smil", ".swf", ".vob", ".wmv", ".rmvb", + ".mvb" + ]; + return CommonUtil.valInArray(ext.toLowerCase(), video_extensions); + }; + CommonUtil.isImageObjEmbedLink = function (node) { + return CommonUtil.checkObjEmbed(node, CommonUtil.isImgExt, function (mime) { + return mime.startsWith("image"); + }); + }; + CommonUtil.isImgExt = function (ext) { + return CommonUtil.valInArray(ext.toLowerCase(), CommonUtil.image_extensions); + }; + CommonUtil.isHtmlExt = function (ext) { + var html_extensions = [".asp", ".aspx", ".cfm", ".cfml", ".cgi", ".htm", ".html", ".shtm", + ".shtml", ".php", ".pl", ".py", ".shtm", ".shtml", ".xhtml" + ]; + return CommonUtil.valInArray(ext.toLowerCase(), html_extensions); + }; + CommonUtil.hasTriggered = function (doc, id) { + return CacheUtil_1.CacheUtil.getCache(doc, id, false); + }; + CommonUtil.triggerOnce = function (doc, id, passed) { + if (passed) + return true; + var triggered = CacheUtil_1.CacheUtil.getCache(doc, id, false); + CacheUtil_1.CacheUtil.setCache(doc, id, true); + return triggered; + }; + /* determine if the given value exists in the given array */ + CommonUtil.valInArray = function (value, arr) { + for (var idx in arr) { + if (arr[idx] === value) + return true; + } + return false; + }; + /** + * return the ancestor of the given element + * @param tagNames string, array, or dictionary containing the tags to search for + */ + CommonUtil.getAncestor = function (element, tagNames) { + var walkNode = element; + while (walkNode !== null) { + var thisTag = walkNode.nodeName.toLowerCase(); + if (typeof (tagNames) === "string") { + if (thisTag === tagNames.toLowerCase()) { + break; + } + } + else if (tagNames.length) { + for (var idx in tagNames) { + if (tagNames[idx] === thisTag) + return walkNode; + } + } + else if (thisTag in tagNames) { + break; + } + walkNode = DOMWalker_1.DOMWalker.parentNode(walkNode); + } + return walkNode; + }; + // return true if element1 and element2 are siblings + CommonUtil.isSibling = function (element1, element2) { + if (element1 && element2) { + var node = null; + if (DOMWalker_1.DOMWalker.parentNode(element1) && DOMWalker_1.DOMWalker.parentNode(element1).firstChild) { + node = DOMWalker_1.DOMWalker.parentNode(element1).firstChild; + } + while (node) { + if (node === element2) + return true; + node = node.nextSibling; + } + } + return false; + }; + CommonUtil.isDescendant = function (parent, child) { + var node = DOMWalker_1.DOMWalker.parentNode(child); + while (node != null) { + if (node === parent) { + return true; + } + node = DOMWalker_1.DOMWalker.parentNode(node); + } + return false; + }; + //check if the first form control child is disabled + CommonUtil.isDisabledByFirstChildFormElement = function (element) { + var formElements = ["input", "textarea", "select", "keygen", "progress", "meter", "output"]; + if (element.firstChild != null) { + var nw = new DOMWalker_1.DOMWalker(element); + while (nw.nextNode()) { + if (formElements.includes(nw.node.nodeName.toLowerCase())) { + if (CommonUtil.isNodeDisabled(nw.node)) + return true; + return false; + } + } + } + return false; + }; + CommonUtil.isDisabledByReferringElement = function (element) { + var id = element.getAttribute("id"); + var doc = element.ownerDocument; + var root = doc.body; + while (DOMWalker_1.DOMWalker.parentNode(root) !== null) { + // Get the parentNode + root = DOMWalker_1.DOMWalker.parentNode(root); + } + var nw = new DOMWalker_1.DOMWalker(root); + while (nw.nextNode()) { + // check the element whose 'aria-describedby' equals to the id + if (nw.node && nw.node.nodeType === 1 && nw.elem()) { + var AriaDescribedbyIDArray = (nw.elem().getAttribute("aria-describedby") || "").split(" "); + if (AriaDescribedbyIDArray.includes(id) && CommonUtil.isNodeDisabled(nw.node)) { + return true; + } + } + } + }; + /** get element containing label for the given element + * @deprecated Deprecated because the function name is misleading. Use getLabelForElement(element) instead + */ + CommonUtil.getInputLabel = function (element) { + return CommonUtil.getLabelForElement(element); + }; + /** + * This function is responsible for getting the element containing the label for the given element. + * + * Note: This is a wrapper function to: AriaUtil.getLabelForElementHidden + * + * @parm {element} element - The element for which to get the label element for. + * + * @return {element} element - return the element for the label, otherwise null + * + * @memberOf AriaUtil + */ + CommonUtil.getLabelForElement = function (element) { + return CommonUtil.getLabelForElementHidden(element, false); + }; + /** + * This function is responsible for getting the element containing the label for the given element. + * + * This function will return null if the containing lable element is hidden, when the ignoreHidden option + * is set to true. + * + * @parm {element} element - The element for which to get the label element for. + * @parm {boolean} ignoreHidden - true if hidden elements with label should be ignored from the list + * false if the hidden elements should be added + * + * @return {element} element - return the element for the label, otherwise null + * + * @memberOf AriaUtil + */ + CommonUtil.getLabelForElementHidden = function (element, ignoreHidden) { + // Check if the global AriaUtil_LABELS hash is available, as this will contain the label nodes based on + // for attribute. + //if (!getCache(element.ownerDocument,"AriaUtil_LABELS", null)) { + var root = element.getRootNode(); + if (!CacheUtil_1.CacheUtil.getCache((root.nodeType === 11) ? root : root, "AriaUtil_LABELS", null)) { + // Variable Decleration + var idToLabel = {}; + // Get all the label elements in the entire doc + var labelNodes = CommonUtil.getDocElementsByTag(element, "label"); + // Loop over all the label nodes, in the case the label node has a for attribute, + // extract that attribute and add this node to the hash if it is visible. + for (var i = 0; i < labelNodes.length; ++i) { + if (labelNodes[i].hasAttribute("for")) { + // If ignore hidden is specified and the node is not visible we do not add it to the + // labelNodes hash. + if (ignoreHidden && !VisUtil_1.VisUtil.isNodeVisible(labelNodes[i])) { + continue; + } + idToLabel[labelNodes[i].getAttribute("for")] = labelNodes[i]; + } + } + // Add the built hash to the ownerDocument (document), to be used later to fast retrival + //setCache(element.ownerDocument, "AriaUtil_LABELS", idToLabel); + CacheUtil_1.CacheUtil.setCache((root.nodeType === 11) ? root : root, "AriaUtil_LABELS", idToLabel); + } + // If this element has an id attribute, get the corosponding label element + if (element.hasAttribute("id")) { + // Fetch the id attribute + var ctrlId = element.getAttribute("id"); + // Return the corosponding label element. + // Note: in the case that the the id is not found in the hash that means, it does not exists or is hidden + if (ctrlId.trim().length > 0) { + //return getCache(element.getRootNode().ownerDocument,"AriaUtil_LABELS",{})[ctrlId]; + return CacheUtil_1.CacheUtil.getCache((root.nodeType === 11) ? root : root, "AriaUtil_LABELS", {})[ctrlId]; + } + } + return null; + }; + /* Return specified element attribute if present else return null */ + CommonUtil.getElementAttribute = function (element, attr) { + //return (element && element.hasAttribute && element.hasAttribute(attr)) ? element.getAttribute(attr) : null; + if (!attr || !element || !element.hasAttribute || !element.hasAttribute(attr)) + return null; + var atrValue = element.getAttribute(attr); + if (!ARIADefinitions_1.ARIADefinitions.referenceProperties.includes(attr)) + return atrValue; + //attr is a reference to other elements(s) + var values = atrValue.split(/ +/g); + //ignore if none of the referred element(s) exist or all point to the element itself + var exist = false; + for (var id = 0; values < values.length; ++id) { + var referred = document.getElementById(values[id]); + if (referred && !DOMUtil_1.DOMUtil.sameNode(referred, element)) { + exist = true; + break; + } + } + return exist ? atrValue : null; + }; + // Return true if element has valid implicit label + CommonUtil.hasImplicitLabel = function (element) { + var parentNode = CommonUtil.getAncestor(element, "label"); + // Test a) if the parent is a label which is the implicit label + // b) if the form element is the first child of the label + // c) if the form element requires an implicit or explicit label : "input", "textarea", "select", "keygen", "progress", "meter", "output" + // d) form elements which may have a label: button + // form elements that do not require implicit or explicit label element are: + // "optgroup", "option", "datalist"(added later). These were handled differently in the main rule, might need to refactor the code later + if (parentNode && parentNode.tagName.toLowerCase() === "label" && CommonUtil.isFirstFormElement(parentNode, element)) { + var parentClone = parentNode.cloneNode(true); + // exclude all form elements from the label since they might also have inner content + parentClone = CommonUtil.removeAllFormElementsFromLabel(parentClone); + return CommonUtil.hasInnerContentHidden(parentClone); + } + else { + return false; + } + }; + // Return the implicit label of the given form field + CommonUtil.getImplicitLabel = function (element) { + var parentNode = CommonUtil.getAncestor(element, "label"); + // Test a) if the parent is a label which is the implicit label + // b) if the form element is the first child of the label + // c) if the form element requires an implicit or explicit label : "input", "textarea", "select", "keygen", "progress", "meter", "output" + // d) form elements which may have a label: button + // form elements that do not require implicit or explicit label element are: + // "optgroup", "option", "datalist"(added later). These were handled differently in the main rule, might need to refactor the code later + if (parentNode && parentNode.tagName.toLowerCase() === "label" && CommonUtil.isFirstFormElement(parentNode, element)) { + var parentClone = parentNode.cloneNode(true); + // exclude all form elements from the label since they might also have inner content + parentClone = CommonUtil.removeAllFormElementsFromLabel(parentClone); + var label = CommonUtil.getInnerText(parentClone); + return label && label.trim() !== '' ? label.trim() : null; + } + else + return null; + }; + /** + * This function is responsible for getting the label for a form field element. + * + * + * @parm {element} element - The element from which to get the label. + * + * @return {string} text - return the label text or null + * + * @memberOf AriaUtil + */ + CommonUtil.getFormFieldLabel = function (elem) { + // get the label from the attribute "for" of the label element + // Get only the non-hidden labels for element + var value = ""; + var label = null; + var labelElem = CommonUtil.getLabelForElementHidden(elem, true); + if (labelElem) { + // value directly from element text + label = labelElem.innerText; // ignore hidden text + } + else { + /** if it's not label with for attribute, then find implicit label + * cases for explict label: + * <label for='my'></label><input id='my'/> + * <label for='my'><input id='my'/></label> + * cases for implicit label: + * <label><input /></label> + */ + labelElem = CommonUtil.getAncestor(elem, "label"); + if (labelElem && labelElem.tagName.toLowerCase() === "label" && CommonUtil.isFirstFormElement(labelElem, elem)) { + var parentClone = labelElem.cloneNode(true); + // exclude all the text from the first form element since they might also + // have inner content that is part of innerText + parentClone = CommonUtil.removeAllFormElementsFromLabel(parentClone); + label = CommonUtil.getInnerText(parentClone); + } + else + return null; + } + if (label && label.trim() !== "") + value += label.trim(); + // value from child element attribute + label = CommonUtil.getLabelTextFromAttribute(labelElem, true); + if (label && label.trim() !== "") + value += label.trim(); + // wired case: get aria label from label element itself just in case (though name prohibited from aria in html) + label = AriaUtil_1.AriaUtil.getAriaLabel(labelElem); + if (label && label.trim() !== "") + value += label.trim(); + return value.trim(); + }; + /** + * calculate label from embedded control: https://w3c.github.io/accname/ + * @param {element} labelElem label element + * @param {boolean} ignoreHidden - true if hidden elements with label should be ignored from the list + * false if the hidden elements should be added + * @returns label text or '' + * + * note the assumption is the labelElem refers either to a labelled element by 'for' attribute + * or its first form field is labbelled element + */ + CommonUtil.getLabelTextFromAttribute = function (labelElem, ignoreHidden) { + // label either points to a labelable element by its for attribute or the first element child + // get the labelled elment if it's an implicit label + var labeledElem = null; + for (var i = 0; i < labelElem.children.length; i++) { + var child = labelElem.children.item(i); + if (CommonUtil.form_labelable_elements.includes(child.nodeName.toLowerCase())) { + labeledElem = child; + break; + } + } + var nw = new DOMWalker_1.DOMWalker(labelElem); + var text = ''; + while (nw.nextNode() && nw.node !== labelElem) { + // only check element children + if (nw.node && nw.node.nodeType === 1 && nw.elem()) { + var elem = nw.elem(); + // ignore if it's hidden, or labelled element, or first form element if not labeled by for attribute + if ((ignoreHidden && (VisUtil_1.VisUtil.isNodeHiddenFromAT(elem) || VisUtil_1.VisUtil.isNodePresentational(elem))) + || (labeledElem && labeledElem.contains(elem))) + continue; + var role = AriaUtil_1.AriaUtil.getResolvedRole(elem); + // textbox etc. return its text value + if (role === "textbox") { + var name_1 = elem.getAttribute("value"); + if (name_1 && name_1.trim().length > 0) + text += ' ' + name_1.trim(); + } + else if (role === "combobox" || role === "listbox") { + // for combobox or listbox roles, return the text alternative of the chosen option. + var selectedId = elem.getAttribute("aria-activedescendant") || elem.getAttribute("aria-selected") || elem.getAttribute("aria-checked"); + if (selectedId) { + var selectedOption = elem.ownerDocument.getElementById(selectedId); + if (selectedOption && !DOMUtil_1.DOMUtil.sameNode(elem, selectedOption)) { + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(selectedOption); + if (pair && pair.name) + text += ' ' + pair.name.trim(); + } + } + } + else if (["progressbar", "scrollbar", "slider", "spinbutton", "meter"].includes(role)) { + // for range role type, including "progressbar", "scrollbar", "slider", "spinbutton" roles + // If the aria-valuetext property is present, return its value + var value_1 = elem.getAttribute("aria-valuetext"); + if (value_1 && value_1.trim().length > 0) + text += ' ' + value_1.trim(); + // Otherwise, if the aria-valuenow property is present, return its value, + value_1 = elem.getAttribute("aria-valuenow"); + if (value_1 && value_1.trim().length > 0) + text += ' ' + value_1.trim(); + // finally use native value attribute + value_1 = elem.getAttribute("value"); + if (value_1 && value_1.trim().length > 0) + text += ' ' + value_1.trim(); + } + // get aria label from the element + var value = AriaUtil_1.AriaUtil.getAriaLabel(elem); + if (value && value.trim() !== "") + text += ' ' + value.trim(); + } + } + return text.trim(); + }; + CommonUtil.isFirstFormElement = function (parentNode, element) { + //let formElementsRequiringLabel = ["input", "textarea", "select", "keygen", "progress", "meter", "output"]; + if (parentNode.firstChild != null) { + var nw = new DOMWalker_1.DOMWalker(parentNode); + while (nw.nextNode()) { + if (CommonUtil.form_labelable_elements.indexOf(nw.node.nodeName.toLowerCase()) !== -1) { + return nw.node === element; + } + } + } + return false; + }; + // check if the element is a shadow host or descendant of a shadow host, but not a descedant of the shadow root of the host (to be assigned to shadow slot or ignored) + CommonUtil.isShadowHostElement = function (element) { + if (CommonUtil.isShadowElement(element)) + return false; + var walkNode = element; + while (walkNode) { + if (walkNode.shadowRoot) + return true; + walkNode = DOMWalker_1.DOMWalker.parentElement(walkNode); + } + return false; + }; + //check if an element is in a shadow tree + CommonUtil.isShadowElement = function (element) { + var root = element.getRootNode(); + if (root.toString() === "[object ShadowRoot]") + return true; + return false; + }; + CommonUtil.removeAllFormElementsFromLabel = function (element) { + var formElements = ["input", "textarea", "select", "button", "datalist", "optgroup", "option", "keygen", "output", "progress", "meter"]; + var childNodes = element.childNodes; + for (var i = 0; i < childNodes.length; i++) { + if (formElements.indexOf(childNodes[i].nodeName.toLowerCase()) > -1) { + element.removeChild(childNodes[i]); + } + } + return element; + }; + /** + * @param element + * @param idStr + * @returns true if any one (if multiple Ids) id points to itself + */ + CommonUtil.isIdReferToSelf = function (element, idStr) { + if (!idStr || idStr.trim() === '') + return false; + var ids = idStr.trim().split(" "); + for (var j = 0, length_1 = ids.length; j < length_1; ++j) { + var referredNode = fragment_1.FragmentUtil.getById(element, ids[j]); + if (referredNode && DOMUtil_1.DOMUtil.sameNode(referredNode, element)) + return true; + } + return false; + }; + /* Determine the node depth of the given element */ + CommonUtil.nodeDepth = function (element) { + var depth = 0; + var walkNode = element; + while (walkNode !== null) { + walkNode = DOMWalker_1.DOMWalker.parentNode(walkNode); + depth = depth + 1; + } + return depth; + }; + /* compare node order of the 2 given nodes */ + /* returns + * 0 if the nodes are equal + * 1 if node b is before node a + * -1 if node a is before node b + * 2 if node a is nested in node b + * -2 if node b is nested in node a + * null if either node is null or their parent nodes are not equal + */ + CommonUtil.compareNodeOrder = function (nodeA, nodeB) { + if (nodeA === nodeB) + return 0; + var aDepth = CommonUtil.nodeDepth(nodeA); + var bDepth = CommonUtil.nodeDepth(nodeB); + if (bDepth > aDepth) { + for (var i = 0; i < bDepth - aDepth; ++i) + nodeB = DOMWalker_1.DOMWalker.parentNode(nodeB); + if (nodeA === nodeB) // Node B nested in Node A + return -2; + } + else if (aDepth > bDepth) { + for (var i = 0; i < aDepth - bDepth; ++i) + nodeA = DOMWalker_1.DOMWalker.parentNode(nodeA); + if (nodeA === nodeB) // Node A nested in Node B + return 2; + } + while (nodeA != null && nodeB != null && DOMWalker_1.DOMWalker.parentNode(nodeA) != DOMWalker_1.DOMWalker.parentNode(nodeB)) { + nodeA = DOMWalker_1.DOMWalker.parentNode(nodeA); + nodeB = DOMWalker_1.DOMWalker.parentNode(nodeB); + } + if (nodeA === null || nodeB === null || DOMWalker_1.DOMWalker.parentNode(nodeA) != DOMWalker_1.DOMWalker.parentNode(nodeB)) + return null; + while (nodeB != null && nodeB != nodeA) + nodeB = nodeB.previousSibling; + if (nodeB === null) // nodeB before nodeA + return 1; + else + return -1; + }; + /** + * Determine if the given attribute of the given element is not empty + * @memberOf AriaUtil + */ + CommonUtil.attributeNonEmpty = function (element, attrStr) { + return element.hasAttribute(attrStr) && element.getAttribute(attrStr).trim().length > 0; + }; + /* Return a pointer to the given frame, null if not found */ + CommonUtil.getFrameByName = function (ruleContext, frameName) { + var window = ruleContext.ownerDocument.defaultView; + var frameList = [window]; + var idx = 0; + while (idx < frameList.length) { + try { + if (frameList[idx].name === frameName) + return frameList[idx]; + for (var i = 0; i < frameList[idx].frames.length; ++i) { + try { + // Ensure it's a real frame and avoid recursion + if (frameList[idx].frames[i] && !frameList.includes(frameList[idx].frames[i])) { + frameList.push(frameList[idx].frames[i]); + } + } + catch (e) { } + } + } + catch (e) { } + ++idx; + } + return null; + }; + CommonUtil.defaultNSResolver = function (prefix) { + var uri; + switch (prefix) { + case 'html': + uri = 'http://www.w3.org/1999/xhtml'; + case 'x2': + uri = 'http://www.w3.org/TR/xhtml2'; + case 'x': + uri = 'http://www.w3.org/1999/xhtml'; + case 'xhtml': + uri = 'http://www.w3.org/1999/xhtml'; + default: + uri = null; + } + return uri; + }; + //checking if only the inner text is empty or not + CommonUtil.isInnerTextOnlyEmpty = function (element) { + // Get the innerText of the element + var text = element.innerText; + if ((text === undefined || text === null || text.trim().length === 0) && element.nodeName.toLowerCase() !== 'slot' && element.textContent !== undefined) { + //ignore slot because its text will be filled by the corresponding content in the light DOM + // innerText is sometimes 'undefined' in headless mode, or null if the element is invisible or not erxpanded + // so we try textContent as a workaround + text = element.textContent; + } + var retVal = !(text !== null && text.trim().length > 0); + if (element.nodeType === 1 && element.nodeName.toLowerCase() === "slot") { + //TODO: need to conside its own content, a slot may have its own content or assigned content + for (var _i = 0, _a = element.assignedNodes(); _i < _a.length; _i++) { + var slotElem = _a[_i]; + retVal = retVal && CommonUtil.isInnerTextEmpty(slotElem); + } + } + // Trim the inner text and verify that it is not empty. + return retVal; + }; + /* Return the inner text of the given element */ + CommonUtil.getInnerText = function (element) { + var retVal = element.innerText; + if (retVal === undefined || retVal === null || retVal.trim() === "") + retVal = element.textContent; + return retVal; + }; + /** + * return onscreen innerText only. + * This function should return the same result as innerText if no offscreen content exists + * + * @parm {element} node The node which should be checked it has inner text or not. + * @return {null | string} null if element has empty inner text, text otherwise + * + * @memberOf AriaUtil + */ + CommonUtil.getOnScreenInnerText = function (element) { + if (!element) + return null; + if (element.nodeType === 3) + return element.nodeValue(); + var text = ""; + var nw = new DOMWalker_1.DOMWalker(element); + // Loop over all the childrens of the element to get the text + while (nw.nextNode() && nw.node !== element && nw.node !== element.parentNode) { + if (nw.bEndTag) + continue; + if (nw.node.nodeType === 1 && (VisUtil_1.VisUtil.hiddenByDefaultElements.includes(nw.node.nodeName.toLowerCase()) || !VisUtil_1.VisUtil.isNodeVisible(nw.node) || VisUtil_1.VisUtil.isElementOffscreen(nw.node))) { + /** special case for svg <title> element: + * text in a <title> element is not rendered as part of the graphic, but browsers usually display it as a tooltip + * note some svg elements, such as title, desc, have a bounds {"left":0,"top":0,"height":0,"width":0} + */ + if (nw.node.nodeName.toLowerCase() === 'title' && CommonUtil.getAncestor(nw.node, "svg")) + continue; + if (nw.node.nextSibling) { + if (nw.node.nextSibling.nodeType === 3 && nw.node.nextSibling.nodeValue && nw.node.nextSibling.nodeValue.trim() !== '') + text += ' ' + nw.node.nextSibling.nodeValue.trim(); + nw.node = nw.node.nextSibling; + continue; + } + else + break; + } + if (nw.node.nodeType === 3 && nw.node.nodeValue && nw.node.nodeValue.trim() !== '') { + text += ' ' + nw.node.nodeValue.trim(); + } + } + return text.trim(); + }; + /** Return the text content of the given node + * this is different than innerText or textContent that return text content of a node and its descendants + */ + CommonUtil.getNodeText = function (element) { + if (!element) + return ""; + var text = ""; + var childNodes = element.childNodes; + for (var i = 0; i < childNodes.length; ++i) { + if (childNodes[i].nodeType == 3) { + text += childNodes[i].nodeValue; + } + } + return text; + }; + /** + * This function is responsible for checking if elements inner text is empty or not. + * + * @parm {element} node The node which should be checked it has inner text or not. + * @return {bool} true if element has empty inner text, false otherwise + * + * @memberOf AriaUtil + */ + CommonUtil.isInnerTextEmpty = function (element) { + // Get the innerText of the element + var text = CommonUtil.getInnerText(element); + // Trim the inner text and verify that it is not empty. + return !(text != null && text.trim().length > 0); + }; + CommonUtil.hasInnerContent = function (element) { + var text = CommonUtil.getInnerText(element); + var hasContent = (text !== null && text.trim().length > 0); + if (element.firstChild !== null) { + var nw = new DOMWalker_1.DOMWalker(element); + while (!hasContent && nw.nextNode()) { + hasContent = (nw.node.nodeName.toLowerCase() === "img" && + CommonUtil.attributeNonEmpty(nw.node, "alt")); + } + } + return hasContent; + }; + /** + * This function is responsible for determine if an element has inner content. + * This function also considers cases where inner text is hidden, which now will + * be classified as does not have hidden content. + * + * @parm {element} node The node which should be checked it has inner text or not. + * @return {bool} true if element has empty inner text, false otherwise + * + * @memberOf AriaUtil + */ + CommonUtil.hasInnerContentHidden = function (element) { + return CommonUtil.hasInnerContentHiddenHyperLink(element, false); + }; + CommonUtil.svgHasName = function (element) { + return CommonUtil.attributeNonEmpty(element, "aria-label") + || CommonUtil.attributeNonEmpty(element, "aria-labelledby") + || !!element.querySelector(":scope > title"); + }; + CommonUtil.hasInnerContentHiddenHyperLink = function (element, hyperlink_flag) { + if (!element) + return false; + // Variable Decleration + var childElement = element.firstElementChild; + var hasContent = false; + // In the case that the childElement is not null then we need to check each of the elements + // to make sure that the elements are not all hidden. + if (childElement != null) { + // Get the nodewalter of the element node, so that we can loop over it and verify + // that the elements under the element are not completly hidden. + var nw = new DOMWalker_1.DOMWalker(element); + // Loop over all the nodes until there are no more nodes or we have determine that there is content under + // this parent element. + while (!hasContent && nw.nextNode() && nw.node != element) { + // Get the next node + var node = nw.node; + // In the case an img element is present with alt then we can mark this as pass + // otherwise keep checking all the other elements. Make sure that this image element is not hidden. + hasContent = (node.nodeName.toLowerCase() === "img" + && (CommonUtil.attributeNonEmpty(node, "alt") || CommonUtil.attributeNonEmpty(node, "title")) + && !VisUtil_1.VisUtil.isNodeHiddenFromAT(node) && !VisUtil_1.VisUtil.isNodePresentational(node)) || (node.nodeName.toLowerCase() === "svg" + && CommonUtil.svgHasName(node)); + // Now we check if this node is of type element, visible + if (!hasContent && node.nodeType === 1 && !VisUtil_1.VisUtil.isNodeHiddenFromAT(node) && !VisUtil_1.VisUtil.isNodePresentational(node)) { + // Check if the innerText of the element is empty or not + hasContent = !CommonUtil.isInnerTextOnlyEmpty(node); + if (!hasContent && hyperlink_flag === true) { + hasContent = CommonUtil.attributeNonEmpty(node, "aria-label") || CommonUtil.attributeNonEmpty(node, "aria-labelledby"); + var doc = node.ownerDocument; + if (doc) { + var win = doc.defaultView; + if (win) { + var cStyle = win.getComputedStyle(node); + if (!hasContent && cStyle != null) { + // console.log(cStyle.backgroundImage); + // console.log(cStyle.content) + hasContent = ((cStyle.backgroundImage && cStyle.backgroundImage.indexOf) || cStyle.content) && CommonUtil.attributeNonEmpty(node, "alt"); + } + } + } + } + } + // Check for cases where there is text node after an element under the parent + // In the case we detect nodetype as text node and the patent of the text node is + // the same element we are checking has Inner content for then get the inner content of this + // text node. + if (node.nodeType === 3 && DOMWalker_1.DOMWalker.parentElement(node) === element) { + // Check if the innerText of the element is empty or not + hasContent = !CommonUtil.isInnerTextEmpty(node); + } + } + } + // In the case there are no child elements then we can simply perform the check for only innertext + // the img with alt case will be covered in the above if, as img is considers as an element. + else { + // Check if the innerText of the element is empty or not + hasContent = !CommonUtil.isInnerTextEmpty(element); + } + return hasContent; + }; + CommonUtil.hasInnerContentOrAlt = function (element) { + var text = CommonUtil.getInnerText(element); + var hasContent = (text != null && text.trim().length > 0) || CommonUtil.attributeNonEmpty(element, "alt"); + if (element.firstChild != null) { + var nw = new DOMWalker_1.DOMWalker(element); + while (!hasContent && nw.nextNode() && nw.node != element) { + hasContent = (nw.node.nodeName.toLowerCase() === "img" && + CommonUtil.attributeNonEmpty(nw.node, "alt")); + if (!hasContent + && (AriaUtil_1.AriaUtil.hasRole(nw.node, "button", true) || AriaUtil_1.AriaUtil.hasRole(nw.node, "textbox")) + && (AriaUtil_1.AriaUtil.hasAriaLabel(nw.node) || CommonUtil.attributeNonEmpty(nw.node, "title") || CommonUtil.getLabelForElementHidden(nw.elem(), true))) { + hasContent = true; + } + } + } + return hasContent; + }; + CommonUtil.concatUniqueArrayItem = function (item, arr) { + arr.indexOf(item) === -1 && item !== null ? arr.push(item) : false; + return arr; + }; + CommonUtil.concatUniqueArrayItemList = function (itemList, arr) { + for (var i = 0; itemList !== null && i < itemList.length; i++) { + arr = CommonUtil.concatUniqueArrayItem(itemList[i], arr); + } + return arr; + }; + /** + * remove array items from a given array + * @param itemList items to be removed from arr + * @param arr the array + * @returns + */ + CommonUtil.reduceArrayItemList = function (itemList, arr) { + if (arr && arr.length > 0 && itemList && itemList.length > 0) { + var result = arr.filter(function (value) { + return !itemList.includes(value); + }); + return result; + } + return arr; + }; + CommonUtil.getScopeForTh = function (element) { + /** https://www.w3.org/TR/html5/tabular-data.html#header-and-data-cell-semantics + * A header cell anchored at the slot with coordinate (x, y) with width width and height height is + * said to be a column header if any of the following conditions are true: + * * The cell's scope attribute is in the column state, or + * * The cell's scope attribute is in the auto state, and there are no data cells in any of + * the cells covering slots with y-coordinates y .. y+height-1. + * A header cell anchored at the slot with coordinate (x, y) with width width and height height is + * said to be a row header if any of the following conditions are true: + * * The cell's scope attribute is in the row state, or + * * The cell's scope attribute is in the auto state, the cell is not a column header, and there are + * no data cells in any of the cells covering slots with x-coordinates x .. x+width-1. + */ + // Note: auto is default scope + // Easiest answer is if scope is specified + if (element.hasAttribute("scope")) { + var scope = element.getAttribute("scope").toLowerCase(); + if (scope === "row" || scope === 'rowgroup') + return "row"; + if (scope === "col" || scope === 'colgroup') + return "column"; + } + // scope is auto, default (without a scope) or invalid value. + // if all the sibling elements are th, then return "columnheader" + var siblings = __spreadArray([], element.parentElement.children, true).filter(function (node) { return node.nodeType === 1 && node.tagName.toLowerCase() != "th"; }); + if (siblings === null || siblings.length === 0) + return "column"; + else + return "row"; + }; + CommonUtil.getControlOfLabel = function (node) { + // Handle the easy case of label -> for + var labelAncestor = CommonUtil.getAncestor(node, "label"); + if (labelAncestor && labelAncestor.hasAttribute("for")) { + return fragment_1.FragmentUtil.getById(node, labelAncestor.getAttribute("for")); + } + // Create a dictionary containing ids of parent nodes + var idDict = {}; + var parentWalk = node; + while (parentWalk) { + if (parentWalk.nodeType === 1 /* Node.ELEMENT_NODE */) { + var ancestor = parentWalk; + if (ancestor.hasAttribute("id")) { + idDict[ancestor.getAttribute("id")] = true; + } + } + parentWalk = DOMWalker_1.DOMWalker.parentNode(parentWalk); + } + // Early return if no ancestor IDs found + if (Object.keys(idDict).length === 0) { + return null; + } + // Cache aria-labelledby attribute if node is an element + var nodeAriaLabelledBy = node.nodeType === 1 ? node.getAttribute("aria-labelledby") : null; + // Iterate through controls that use aria-labelledby and see if any of them reference one of my ancestor ids + var inputsUsingLabelledBy = CacheUtil_1.CacheUtil.getSetCache(node.ownerDocument, "CommonUtil::getControlOfLabel", function () { return node.ownerDocument.querySelectorAll("*[aria-labelledby]"); }); + for (var idx = 0; idx < inputsUsingLabelledBy.length; ++idx) { + var inputUsingLabelledBy = inputsUsingLabelledBy[idx]; + var ariaLabelledBy = inputUsingLabelledBy.getAttribute("aria-labelledby"); + var sp = ariaLabelledBy.split(" "); + for (var _i = 0, sp_1 = sp; _i < sp_1.length; _i++) { + var id = sp_1[_i]; + if (id in idDict && !CommonUtil.isIdReferToSelf(node, nodeAriaLabelledBy)) { + return inputUsingLabelledBy; + } + } + } + // Find the cases where we're within an aria labelledby + return null; + }; + /** + * This function is responsible for checking if the node that is provied is + * disabled or not. Following is how the check is performed: + * 1. Check if the current node is disabled with the following options: + * attribute --> disabled + * Also needs to be "button", "input", "select", "textarea", "optgroup", "option", + * "menuitem", "fieldset" nodes (in array elementsAllowedDisabled) + * attribute --> aria-disabled="true" + * 2. Check if any of the current nodes parents are disabled with the same + * options listed in 1. + * + * Note: If either current node or any of the parent nodes are disabled then this + * function will return true (node is disabled). + * + * @parm {HTMLElement} node - The node which should be checked if it is disabled or not. + * @return {bool} true if the node is disabled, false otherwise + * + * @memberOf AriaUtil + */ + CommonUtil.isNodeDisabled = function (node) { + // Set PT_NODE_DISABLED to false for all the nodes, before the check and this will be changed to + // true when we detect that the node is disabled. We have to set it to false so that we know + // the node has already been checked. Only set it to false if the setting is undefined or null + // as if it is defined we do not wnat to reset it. As if it is true then we should make use of it + // to speed up the check. + var PT_NODE_DISABLED = CacheUtil_1.CacheUtil.getCache(node, "PT_NODE_DISABLED", undefined); + if (typeof PT_NODE_DISABLED !== "undefined") + return PT_NODE_DISABLED; + PT_NODE_DISABLED = false; + // Check the nodeType of this node, if this node is a text node then + // we get the parentnode and set that as the node as a text nodes, + // disabled is directly related to the parent node. + if (node.nodeType === 3) { + node = DOMWalker_1.DOMWalker.parentNode(node); + } + // Variable Declaration + var nodeName = node.nodeName.toLowerCase(); + // Get the disabled element property, disabled and aria-disabled attribute and check that it is true + var disabledAttribute = node.hasAttribute("disabled"); + var disabledPropertyCustom = PT_NODE_DISABLED; + var ariaDisabledAttribute = node.hasAttribute('aria-disabled') && node.getAttribute("aria-disabled") === 'true'; + // If this node has disabled attribute and the node allows disabled attribute, then return true. + // Disabled attribute is only allowed on "button", "input", "select", "textarea", "optgroup", "option", "menuitem", "fieldset" + // In the case aria-disabled is set to true, then also return true + if (disabledPropertyCustom || (disabledAttribute && ARIADefinitions_1.ARIADefinitions.elementsAllowedDisabled.indexOf(nodeName) > -1) || ariaDisabledAttribute) { + PT_NODE_DISABLED = true; + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_DISABLED", PT_NODE_DISABLED); + return true; + } + // Get the parentNode for this node, becuase we have to check all parents to make sure they do not have + // disabled attribute. Only keep checking until we are all the way back to the parentNode + // element. + var parentElement = DOMWalker_1.DOMWalker.parentNode(node); + // If the parent node exists and the nodetype is element (1), then run recursive call to perform the check + // all the way up to the very parent node. Use recursive call here instead of a while loop so that we do not + // have to duplicate the logic for checking if the node is disabled or not for all the parents starting with + // child node. + if (parentElement != null && parentElement.nodeType === 1) { + // Check upwards recursively, and save the results in an variable + var nodeDisabled = CommonUtil.isNodeDisabled(parentElement); + // If the node is found to be disabled then add the custom PT_NODE_DISABLED to true. + // so that we can use this next time, to quickly determine if node is disabled or not. + // This is extra percaution, the isNodeDisabled function already sets this. + if (nodeDisabled) { + PT_NODE_DISABLED = true; + } + // Check upwards recursively + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_DISABLED", PT_NODE_DISABLED); + return nodeDisabled; + } + // Return false (node is not disabled) + return false; + }; + /** + * This function is responsible for determine if hidden content should be checked + * in rules. + * + * @parm {element} node - A node so that the document can be accessed to check for the + * option. Can be document element or a simple node element. + * @return {bool} true if hidden content should be checked, false otherwise + * + * @memberOf AriaUtil + */ + CommonUtil.shouldCheckHiddenContent = function (node) { + return false; + }; + /** + * This function is responsible for determining if node should be skipped from checking or not, based + * on the Check Hidden Content settings and if the node is visible or not. + * + * @parm {element} node - Node to check if it is visible or not based on the Check Hidden Content + * setting. + * + * @return {bool} true if node should be skipped, false otherwise + * + * @memberOf AriaUtil + */ + CommonUtil.shouldNodeBeSkippedHidden = function (node) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we + // return true to identify that the node should not be scanned/added to any hash/array. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (!CommonUtil.shouldCheckHiddenContent(node) && !VisUtil_1.VisUtil.isNodeVisible(node)) { + return true; + } + return false; + }; + CommonUtil.isfocusableByDefault = function (node) { + var focusableElements = ['input', 'select', 'button', 'textarea', 'option', 'area']; + if (node.nodeName.toLowerCase() === "a" && CommonUtil.hasAttribute(node, 'href')) + return true; + if (node.nodeName.toLowerCase() === "area" && CommonUtil.hasAttribute(node, 'href')) + return true; + if (focusableElements.indexOf(node.nodeName.toLowerCase()) !== -1) + return true; + return false; + }; + /** + * This function check if a non-tabable node has valid tabable content. + * If it is tabable (the tabindex is not speicified or is not -1), returns false; + * If it is non-tabable, but a child is tabable and does not have element content, returns false; + * Otherwise, returns true. + */ + CommonUtil.nonTabableChildCheck = function (element) { + if (!element.hasAttribute("tabindex") || + (parseInt(element.getAttribute("tabindex")) != -1)) { + return false; + } + var nw = new DOMWalker_1.DOMWalker(element); + while (nw.nextNode()) { + var child = nw.elem(); + if (child === null) { // Text node. usually is a cartridge return. + continue; + } + if (child.hasAttribute("tabindex") && + (parseInt(child.getAttribute("tabindex")) != -1) && + !CommonUtil.hasInnerContent(child)) { + return false; + } + } + return true; + }; + CommonUtil.hasAttribute = function (element, attributeName) { + var hasAttribute = false; + if (element.hasAttribute) { + hasAttribute = element.hasAttribute(attributeName); + } + else if (element.attributes && element.attributes.getNamedItem) { + var attr = element.attributes.getNamedItem(attributeName); + hasAttribute = attr && attr.specified; + } + return hasAttribute; + }; + // truncate the given text to a given number of characters + // return truncated text to 150 chars, same with the media_alt_brief rule + CommonUtil.truncateText = function (text, len) { + if (len === void 0) { len = 150; } + if (!text) + return text; + text = text.trim(); + if (text.length > len) + return text.substring(0, len - 1) + "..."; + return text; + }; + CommonUtil.input_type_with_placeholder = ["text", "search", "tel", "url", "email", "password", "number"]; + CommonUtil.input_text_types = [ + "text", "file", "password", + "checkbox", "radio", + "search", "tel", "url", "email", + "date", "number", "range", + "time", "color" + ]; + CommonUtil.input_time_types = [ + "date", "month", "week", "time", "datetime-local" + ]; + CommonUtil.input_other_types = [ + "range", "color", "checkbox", "radio", "file", "image" + ]; + CommonUtil.form_button_types = [ + "button", "reset", "submit" + ]; + CommonUtil.form_labelable_elements = ["input", "textarea", "select", "keygen", "progress", "meter", "output", "button"]; + CommonUtil.tabTagMap = { + "button": function (element) { + return !element.hasAttribute("disabled"); + }, + "iframe": true, + "input": function (element) { + if (element.hasAttribute("disabled") || element.getAttribute("type") === "hidden") + return false; + if (element.getAttribute("type") === "radio") { + var name_2 = element.getAttribute("name"); + if (!name_2 || name_2.trim().length === 0) + return true; //single radio, no group + var doc = element.ownerDocument; + var group = doc.querySelectorAll("input[type='radio'][name='" + name_2.trim() + "']"); + if (group.length === 0 || group.length === 1) + return true; //single radio with the name, no others in group + var checked = null; + for (var i = 0; i < group.length; i++) { + if (group[i].checked) + checked = group[i]; + } + //only last one applies if multiple radios with 'checked' attributes + if (checked !== null) { + if (DOMUtil_1.DOMUtil.sameNode(checked, element)) + return true; + return false; + } + else { + // if nothing checked yet, return true if it's the first element + if (DOMUtil_1.DOMUtil.sameNode(group[0], element)) + return true; + return false; + } + } + else + return true; + }, + "select": function (element) { + return !element.hasAttribute("disabled"); + }, + "textarea": function (element) { + if (element.hasAttribute("disabled") || element.getAttribute("type") === "hidden") + return false; + return true; + }, + /**"div": function (element) { + return element.hasAttribute("contenteditable"); + },*/ + "a": function (element) { + // xlink:href?? see svg + return element.hasAttribute("href"); + }, + "area": function (element) { + return element.hasAttribute("href"); + }, + "audio": function (element) { + return element.hasAttribute("controls"); + }, + "video": function (element) { + return element.hasAttribute("controls"); + }, + "summary": function (element) { + // first summary child of a details element is automatically focusable + return element.parentElement && element.parentElement.nodeName.toLowerCase() === 'details' + && DOMUtil_1.DOMUtil.sameNode(__spreadArray([], element.parentElement.children, true).filter(function (elem) { return elem.nodeName.toLowerCase() === 'summary'; })[0], element); + }, + "details": function (element) { + //details element without a direct summary child is automatically focusable + return element.children && __spreadArray([], element.children, true).filter(function (elem) { return elem.nodeName.toLowerCase() === 'summary'; }).length === 0; + } + }; + CommonUtil.image_extensions = [".bmp", ".gif", ".jpg", ".jpeg", ".pcx", ".png"]; + return CommonUtil; +}()); +exports.CommonUtil = CommonUtil; + + +/***/ }, + +/***/ 9196 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.TableUtil = void 0; +var VisUtil_1 = __webpack_require__(3946); +var AriaUtil_1 = __webpack_require__(7011); +var CommonUtil_1 = __webpack_require__(7139); +var TableUtil = /** @class */ (function () { + function TableUtil() { + } + TableUtil.isDataTable = function (tableNode) { + return !(AriaUtil_1.AriaUtil.hasRole(tableNode, "none") || AriaUtil_1.AriaUtil.hasRole(tableNode, "presentation")); + }; + /* + * A complex data table is a data table with any of the following characteristics: + * + * a thead element that contains two or more tr elements + * a table with more than one thead element + * a table with two or more tr elements that contain only th elements + * a th or td element with a rowspan or colspan attribute + * a tr element that contains at least one td element and two or more th elements + * a table with headers not located in the first row or first column + * a td element with a headers attribute value that contains more than two IDREFs + */ + TableUtil.isComplexDataTable = function (table) { + if ("AriaUtil_isComplexDataTable" in table) { + return !!table.AriaUtil_isComplexDataTable; + } + var isComplexTable = false; + if (table && TableUtil.isDataTable(table)) { + var thNodes = null, tdNodes = null; + var trNodes = table.getElementsByTagName("tr"); + var trNodeCount = trNodes.length; + var tdNodeCount = 0, thNodeCount = 0, trNodesHavingOnlyThNodes = 0; + for (var i = 0; !isComplexTable && i < trNodeCount; ++i) { + thNodes = trNodes[i].getElementsByTagName("th"); + tdNodes = trNodes[i].getElementsByTagName("td"); + thNodeCount = thNodes.length; + tdNodeCount = tdNodes.length; + if (tdNodeCount !== 0) { + // a tr element that contains at least one td element and two or more th elements; + isComplexTable = thNodeCount > 1; + // a th element with a rowspan or colspan attribute + for (var j = 0; !isComplexTable && j < thNodeCount; ++j) { + isComplexTable = ((thNodes[j].hasAttribute("rowspan") || + thNodes[j].hasAttribute("colspan")) && + CommonUtil_1.CommonUtil.getAncestor(thNodes[j], "table") === table); + } + // a td element with a rowspan or colspan attribute + // a td element with a headers attribute value that contains more than two IDREFs + for (var k = 0; !isComplexTable && k < tdNodeCount; ++k) { + isComplexTable = ((tdNodes[k].hasAttribute("rowspan") || + tdNodes[k].hasAttribute("colspan") || + (tdNodes[k].hasAttribute("headers") && CommonUtil_1.CommonUtil.normalizeSpacing(tdNodes[k].getAttribute("headers")).split(" ").length > 2)) && + CommonUtil_1.CommonUtil.getAncestor(tdNodes[k], "table") === table); + } + } + else { + // two or more tr elements that contain only th elements + if (thNodeCount > 0) { + ++trNodesHavingOnlyThNodes; + } + isComplexTable = trNodesHavingOnlyThNodes === 2; + } + } + if (!isComplexTable) { + var theadNodes = table.getElementsByTagName("thead"); + var theadNodesLength = theadNodes.length; + if (theadNodesLength > 0) { + // table has more than one thead element + isComplexTable = theadNodesLength > 1; + // a thead element that contains two or more tr elements + if (!isComplexTable) { + isComplexTable = theadNodes[0].getElementsByTagName("tr").length > 1; + } + } + } + if (!isComplexTable && trNodeCount !== 0) { + // a table with headers not located in the first row or first column + isComplexTable = thNodeCount > 0 && !TableUtil.tableHeaderExists(table); + } + } + table.AriaUtil_isComplexDataTable = isComplexTable; + return isComplexTable; + }; + // Return true if a table cell is hidden or contain no data: <td></td> + TableUtil.isTableCellEmpty = function (cell) { + if (!cell || !VisUtil_1.VisUtil.isNodeVisible(cell) || cell.innerHTML.replace(/&nbsp;/g, ' ').trim().length === 0) + return true; + return false; + }; + // Return true if a table row is hidden or contain no data: <tr /> or <tr><td></td><td></td></tr> + TableUtil.isTableRowEmpty = function (row) { + if (!row || !row.cells || row.cells.length === 0 || !VisUtil_1.VisUtil.isNodeVisible(row)) + return true; + var passed = true; //empty + for (var c = 0; passed && c < row.cells.length; c++) { + var cell = row.cells[c]; + passed = TableUtil.isTableCellEmpty(cell); + } + return passed; + }; + // Return true if a table's header is in the first row or column + TableUtil.tableHeaderExists = function (ruleContext) { + var rows = ruleContext.rows; + if (!rows || rows.length === 0) + return null; + // note that table.rows return all all the rows in the table, + // including the rows contained within <thead>, <tfoot>, and <tbody> elements. + //case 1: headers are in the very first row with data in tbody or thead, but not in tfoot + //get the first row with data, ignoring the rows with no data + var passed = true; + var firstRow = rows[0]; + for (var r = 0; passed && r < rows.length; r++) { + firstRow = rows[r]; + // ignore the rows from tfoot + if (firstRow.parentNode && firstRow.parentNode.nodeName.toLowerCase() === 'tfoot') + continue; + passed = TableUtil.isTableRowEmpty(firstRow); + } + //table contain no data: <table><tr><td></td><td></td></tr></table> + if (passed) + return null; + // Check if the cells with data in the first data row are all TH's + passed = true; + for (var r = 0; passed && r < firstRow.cells.length; r++) { + var cell = firstRow.cells[r]; + passed = TableUtil.isTableCellEmpty(cell) || cell.nodeName.toLowerCase() === 'th'; + } + if (passed) + return true; + // Case 2: headers are in the first column with data + // Assume that the first column has all TH's or a TD without data in the first column. + passed = true; + for (var i = 0; passed && i < rows.length; ++i) { + // ignore the rows from tfoot + if (rows[i].parentNode && rows[i].parentNode.nodeName.toLowerCase() === 'tfoot') + continue; + // If no cells in this row, or no data at all, that's okay too. + passed = !rows[i].cells || + rows[i].cells.length === 0 || + rows[i].cells[0].innerHTML.trim().length === 0 || + rows[i].cells[0].nodeName.toLowerCase() != "td"; + } + if (passed) + return true; + //case 3: all td data cells have headers attributes that point to the id of a th element in the same table. + // https://html.spec.whatwg.org/multipage/tables.html#attributes-common-to-td-and-th-elements + passed = true; + var thIds = []; + var tdHeaders = []; + for (var r = 0; passed && r < rows.length; r++) { + var row = rows[r]; + // Check if the cells with data in the last data row are all TH's + for (var c = 0; c < row.cells.length; c++) { + var cell = row.cells[c]; + if (TableUtil.isTableCellEmpty(cell)) + continue; + if (cell.nodeName.toLowerCase() === 'td') { + if (!cell.getAttribute('headers') || cell.getAttribute('headers').trim().length === 0) + passed = false; + else + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(cell.getAttribute('headers').trim().split(" "), tdHeaders); + } + else if (cell.nodeName.toLowerCase() === 'th' && cell.getAttribute('id') && cell.getAttribute('id').trim().length > 0) + CommonUtil_1.CommonUtil.concatUniqueArrayItem(cell.getAttribute('id').trim(), thIds); + } + } + if (passed) { // all td elements have headers, to exam if the headers point to a th id + if (thIds.length > 0 && tdHeaders.every(function (header) { return thIds.includes(header); })) + return true; + } + return false; + }; + TableUtil.isLayoutTable = function (tableNode) { + return AriaUtil_1.AriaUtil.hasRole(tableNode, "presentation") || AriaUtil_1.AriaUtil.hasRole(tableNode, "none"); + }; + /* + * get conflict Aria and Html attributes + * return: a list of Aria and Html attribute pairs that are conflict + */ + TableUtil.isTableDescendant = function (contextHierarchies) { + if (!contextHierarchies) + return null; + return contextHierarchies["aria"].filter(function (hier) { return ["table", "grid", "treegrid"].includes(hier.role); }); + }; + return TableUtil; +}()); +exports.TableUtil = TableUtil; + + +/***/ }, + +/***/ 3946 +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.VisUtil = void 0; +var CacheUtil_1 = __webpack_require__(4566); +var DOMUtil_1 = __webpack_require__(1686); +var DOMWalker_1 = __webpack_require__(3864); +var DOMMapper_1 = __webpack_require__(7507); +var AriaUtil_1 = __webpack_require__(7011); +var CSSUtil_1 = __webpack_require__(4919); +var ClipPathUtil_1 = __webpack_require__(167); +var VisUtil = /** @class */ (function () { + function VisUtil() { + } + /** + * This function is responsible for checking if the node that is provied is + * visible or not. Following is how the check is performed: + * 1. Check if the current node is hidden with the following options: + * CSS --> dislay: none + * CSS --> visibility: hidden + * attribute --> hidden + * 2. Check if the any of the current nodes parents are hidden with the same + * options listed in 1. + * + * Note: If either current node or any of the parent nodes are hidden then this + * function will return false (node is not visible). + * + * Note: nodes with CSS properties opacity:0 or filter:opacity(0%), or similar SVG mechanisms: + * They are not considered hidden. Text hidden with these methods can still be selected or copied, + * and user agents still expose it in their accessibility trees. + * + * Note: nodes hidden off screen or behind another object: they are not considered hidden. + * They are exposed in the accessibility tree and they can even name on-screen objects. + * + * @parm {element} node The node which should be checked if it is visible or not. + * @return {bool} false if the node is NOT visible, true otherwise + * + * @memberOf VisUtil + */ + VisUtil.isNodeVisible = function (nodeIn) { + // Check the nodeType if this node, if this node is a text node then + // we get the parentnode and set that as the node as a text nodes, + // visibility is directly related to the parent node. + if (nodeIn.nodeType === 3) { + nodeIn = DOMWalker_1.DOMWalker.parentNode(nodeIn); + } + var node = nodeIn; + // We should only allow nodeType element, and TextNode all other nodesTypes + // we can return the visibility as visible. + // Following nodes will be returned as visable by default, since we can not + // actually change their visibility. + // Node.PROCESSING_INSTRUCTION_NODE --> 7 + // Node.COMMENT_NODE --> 8 + // 9 /* Node.DOCUMENT_NODE */ --> 9 + // Node.DOCUMENT_TYPE_NODE --> 10 + // Node.DOCUMENT_FRAGMENT_NODE --> 11 + if (node.nodeType !== 1) { + return true; + } + // Make sure that the ownerDocument is present before moving forward + // in detecting if the node is visible or not. In the case that ownerDocument + // does not exist then we simply return node is visible by default. + if (!node.ownerDocument) { + return true; + } + // Variable Declaration + var compStyle; + var nodeName = node.nodeName.toLowerCase(); + // In the case this node is a script, link or style node, right away return node is visible + // because scripts, links and style nodes can not be hidden by HTML attribute or CSS or are hidden by default. But we want to scan + // the elements everytime as they render content still which is still visible to users. + // script --> script elements have display: none by default + // link --> link elements have display: none by default, but the actually CSS script is still executed so we have to + // mark this element as visible at all times. + // style --> style elements have display: none by default, but the actually CSS script is still executed so we have to + // mark this element as visible at all times. + // datalist --> In the rendering, the datalist element represents nothing and it, along with its children, should be hidden. + if (VisUtil.hiddenByDefaultElements != null && VisUtil.hiddenByDefaultElements != undefined && VisUtil.hiddenByDefaultElements.indexOf(nodeName) > -1) { + //return true; + return false; + } + var cacheVal = CacheUtil_1.CacheUtil.getCache(node, "PT_NODE_HIDDEN", undefined); + if (cacheVal !== undefined) { + return cacheVal; + } + // Set PT_NODE_HIDDEN to false for all the nodes, before the check and this will be changed to + // true when we detect that the node is hidden. We have to set it to false so that we know + // the rules has already been checked. + cacheVal = CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", false); + // Check if this node is visible, we check couple of CSS properties and hidden attribute. + // area, param and audio elements we do not check if they are hidden as it does not apply to them. + // Check the unhideableElements array which is part of the rules, to check if this element is allowed to be hidden or not + // in the case that the element is part of the unhideableElements array then we do not run the hidden check on this element, + // and go stright to the parent node. + // Array check elements like: + // area --> area element is part of a map element and it can not be hidden because it is used to + // make an certian parts of an map interactive. + // param --> element can only be part of object elment and it cannot be hidden directly, it + // can only be hidden if the parent is hidden. + // audio --> If this element is hidden it will still play the music, so we should still trigger + // violations for this element. + // In the case that unhideableElements array is not defined then we just scan all elements and do no filtering at all. + if (VisUtil.unhideableElements === null || VisUtil.unhideableElements === undefined || VisUtil.unhideableElements.indexOf(nodeName) === -1) { + // Check if defaultView exists for this node, if it does then use this to run the getComputedStyle + // function to get the CSS style for the node. + if (node.ownerDocument.defaultView) { + // Run the getComputedStyle on this node to fetch the CSS compuation of the node + compStyle = node.ownerDocument.defaultView.getComputedStyle(node, null); + } + // In the case that defaultView does not exists return true to identify that this + // node is visible, because were not able to detect if it was not. + else { + return CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", true); + } + // Get the hidden element property and hidden attribute + var hiddenAttribute = node.getAttribute("hidden"); + var hiddenPropertyCustom = cacheVal; + // To get the hidden property we need to perform a special check as in some cases the hidden property will not be + // a boolean, for theses cases we set it to false as we are not able to determine the true hidden condition. + // The reason for this is because form elements are able to perform an override, so when we have id="hidden" for an element + // which is under the form element then, node.hidden gives the element/list of elements which have id="hidden". Refer to + // mozilla bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1267356 + var hiddenProperty = typeof node.hidden === "boolean" ? node.hidden : false; + // If compStyle object is empty, node does't have hidden property, node does't have hidden attribute and does't have custom PT + // hidden property then we can just return true (node visible) at this point. + if (!compStyle && + !hiddenProperty && // this covers false, null, or undefined + (hiddenAttribute === null || hiddenAttribute === undefined) && + !hiddenPropertyCustom // This covers false, null or undefined + ) { + return CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", true); + } + // In the case that the compStyle is defined we check the following: + // CSS style display set to none + // CSS style visibility set to hidden + // Note: For this property since it is inherited, need to skip the check on parents as + // the parent can have hidden but the child can be visible. So we only check this property + // on child elements/elements that are passed to this function the first time. + // node hidden property set (node.hidden) + // node attribute hidden set (to any value) + // node custom hidden property ser (node.PT_NODE_HIDDEN) + // If any of the above conditions are true then we return false as this element is not visible + if ((compStyle !== null && ((compStyle.getPropertyValue('display') === 'none' || + (!CacheUtil_1.CacheUtil.getCache(node, "Visibility_Check_Parent", null) && compStyle.getPropertyValue('visibility') === 'hidden'))) || + (compStyle.getPropertyValue('display') !== 'block' && (hiddenProperty || hiddenAttribute != null || hiddenPropertyCustom)))) { + // Set a custom expandos property on the the node to identify that it is hidden, so that we can uses + // use this in the rules to determine if the node is hidden or not, if we need to. + // Use expandos property instead of a hash map which stores the elements, adding/checking expandos + // properties is a lot faster performance whise. For Hash map we need to store based on xpath, and to calculate + // xpath it is more performance impact. + return CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", false); + } + // check content-visibility: if the content-visibility is hidden, then, return false as the element is not visible + if (VisUtil.isContentHidden(node)) { + return CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", false); + } + // check hidden by clip-path + // TODO: need to check if hidden content contains focusable elements, similarly to offscreen content + if (ClipPathUtil_1.ClipPathUtil.isNodeVisuallyHiddenByClipPath(node)) { + return CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", false); + } + } + // Get the parentNode for this node, becuase we have to check all parents to make sure they do not have + // the hidden CSS, property or attribute. Only keep checking until we are all the way back to the parentNode + // element. + var parentElement = DOMWalker_1.DOMWalker.parentNode(node); + // If the parent node exists and the nodetype is element (1), then run recursive call to perform the check + // all the way up to the very parent node. Use recursive call here instead of a while loop so that we do not + // have to duplicate the logic for checking if the node is visible or not for all the parents starting with + // child node. + if (parentElement != null && parentElement.nodeType === 1) { + // When we have a parent element going through the isNodeVisible function we have to mark it as such + // so that in the function we can skip checking visibility: hidden for parent elements since visibility: hidden + // is inherited, which allows a child to have a different setting then the child. This property only needs to be checked + // once for the first element that is passed down and that is all. Ignore it for all the parents that we iterate over. + CacheUtil_1.CacheUtil.setCache(parentElement, "Visibility_Check_Parent", true); + // Check upwards recursively, and save the results in an variable + var nodeVisible = VisUtil.isNodeVisible(parentElement); + // If the node is found to not be visible then add the custom PT_NODE_HIDDEN to true. + // so that we can use this in the rules. + // if (!nodeVisible) { + // CacheUtil.setCache(node, "PT_NODE_HIDDEN", true); + // } + // Check upwards recursively + return CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", nodeVisible); + } + // Return true (node is visible) + return CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", true); + }; + /** + * This function is responsible for checking if the node that is visually hidden by clipping or opaq: + * 1. Check if the current node is visually hidden: + * CSS --> clip: rect(0px, 0px, 0px, 0px) + * CSS --> opacity: 0 + * + * Note: If either current node or any of the parent nodes are visually hidden then this + * function will return true (node is not visually hidden). + * + * Note: nodes with CSS properties clip: rect(0px, 0px, 0px, 0px) or opacity:0 or filter:opacity(0%), or similar SVG mechanisms: + * They are not considered hidden to an AT. Text hidden with these methods can still be selected or copied, + * and user agents still expose it in their accessibility trees. + * + * @parm {element} node The node which should be checked if it is visually hidden or not. + * @return {bool} true if the node is visually hidden, false otherwise + * + * @memberOf VisUtil + */ + VisUtil.isNodeVisuallyHidden = function (node) { + if (!node || node.nodeType !== 1) + return false; + var elem = node; + // Set PT_NODE_HIDDEN to false for all the nodes, before the check and this will be changed to + // true when we detect that the node is hidden. We have to set it to false so that we know + // the rules has already been checked. + var hidden = CacheUtil_1.CacheUtil.getCache(elem, "PT_NODE_VISUALLY_HIDDEN", undefined); + if (hidden === undefined) { + // defined styles only give the styles that changed + var comp_styles = CSSUtil_1.CSSUtil.getComputedStyle(elem); + if ((comp_styles['position'] === 'absolute' && comp_styles['clip'] && comp_styles['clip'].replaceAll(' ', '') === 'rect(0px,0px,0px,0px)') + || (comp_styles['opacity'] && parseFloat(comp_styles['opacity']) < 0.1)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN", true); + return true; + } + // Get the parentNode for this node, becuase we have to check all parents to make sure they do not have + // the hidden CSS, property or attribute. Only keep checking until we are all the way back to the parentNode + // element. + var parentElement = DOMWalker_1.DOMWalker.parentElement(elem); + if (!parentElement) + return false; + // Check upwards recursively + var hid = VisUtil.isNodeVisuallyHidden(parentElement); + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN", hid); + return hid; + } + return hidden; + }; + /** + * return true if the node or its ancestor is hidden by CSS content-visibility:hidden + * At this time, CSS content-visibility is partially supported by Chrome & Edge, but not supported by Firefox + * The implementation TEMPORARILY follows the Chrome test results: + * if content-visibility:hidden + * if the element is block-level (default or specified by the user), then the element and its children are normally hidden; + * if the element is inline (default or specified by the user), then the element and its children are normally NOT hidden; + * + * @param node + */ + VisUtil.isContentHidden = function (node) { + if (!node) + return false; + var vis = CacheUtil_1.CacheUtil.getCache(node, "PT_NODE_ContentHidden", undefined); + if (vis !== undefined) + return vis; + var style = getComputedStyle(node); + if (!style) { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_ContentHidden", false); + return false; + } + var content_visibility = style.getPropertyValue("content-visibility"); + if (content_visibility !== 'hidden') { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_ContentHidden", false); + return false; + } + var display = style.getPropertyValue("display"); + // inline element only + if (display === 'inline') { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_ContentHidden", false); + return false; + } + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_ContentHidden", true); + return true; + }; + /** + * return true if the node is offscreen by CSS position + * @param node + */ + VisUtil.isElementOffscreen = function (node) { + if (!node) + return true; + if (node.nodeType !== 1) + return false; + var vis = CacheUtil_1.CacheUtil.getCache(node, "PT_NODE_Offscreen", undefined); + if (vis !== undefined) + return vis; + var mapper = new DOMMapper_1.DOMMapper(); + var bounds = mapper.getUnadjustedBounds(node); + if (!bounds) { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_Offscreen", true); + return true; + } + if (bounds['height'] === 0 || bounds['width'] === 0 || (bounds['top'] + bounds['height']) <= 0 || (bounds['left'] + bounds['width']) <= 0) { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_Offscreen", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_Offscreen", false); + return false; + }; + /** + * return true if the node or its ancestor is natively hidden or aria-hidden = 'true' + * @param node + */ + VisUtil.isNodeHiddenFromAT = function (node) { + if (!node) + return false; + var vis = CacheUtil_1.CacheUtil.getCache(node, "PT_NODE_HiddenFromAT", undefined); + if (vis !== undefined) + return vis; + if (!VisUtil.isNodeVisible(node) || node.getAttribute("aria-hidden") === 'true') { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HiddenFromAT", true); + return true; + } + var ancestor = DOMUtil_1.DOMUtil.getAncestorWithAttribute(node, "aria-hidden", "true"); + if (ancestor) { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HiddenFromAT", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HiddenFromAT", false); + return false; + }; + /** + * return true if the node or its ancestor is natively hidden or aria-hidden = 'true' + * @param node + */ + VisUtil.isNodePresentational = function (node) { + var role = AriaUtil_1.AriaUtil.getResolvedRole(node); + if (role && (role === 'none' || role === 'presentation')) + return true; + return false; + }; + /** + * return true if the element is scrollable + * @param node + */ + VisUtil.isElementScrollable = function (elem) { + if (!elem) + return false; + var styles = CSSUtil_1.CSSUtil.getComputedStyle(elem); + if (!styles) + return false; + var x_scroll = styles.getPropertyValue('overflow-x'); + var y_scroll = styles.getPropertyValue('overflow-y'); + //console.log("before node="+ elem.nodeName +", id="+elem.getAttribute("id") +", x_scroll="+x_scroll + ", y_scroll="+y_scroll); + // If overflow-y is hidden, scroll, or auto, and the overflow-x property is visible (default), the value will be implicitly computed as auto. + if (x_scroll === 'visible' && (y_scroll === 'hidden' || y_scroll === 'scroll' || y_scroll === 'auto')) + x_scroll = 'auto'; + // If overflow-x is hidden, scroll, or auto and the overflow-y property is visible (default), the value will be implicitly computed as auto. + if (y_scroll === 'visible' && (x_scroll === 'hidden' || x_scroll === 'scroll' || x_scroll === 'auto')) + y_scroll = 'auto'; + // setting overflow to clip in one direction when it isn't set to visible or clip in the other direction results in the clip value behaving as hidden. + if (x_scroll === 'clip' && y_scroll !== 'visible' && y_scroll !== 'clip') + x_scroll = 'hidden'; + if (y_scroll === 'clip' && x_scroll !== 'visible' && x_scroll !== 'clip') + y_scroll = 'hidden'; + // not scrollable: no scroll bars + if ((x_scroll === 'visible' || x_scroll === 'hidden' || x_scroll === 'clip') + && (y_scroll === 'visible' || y_scroll === 'hidden' || y_scroll === 'clip')) + return false; + // false if the overall scrollable element (clientWidth + scrollbarWidth and clientHeight + scrollbarHeight) is too small to be visible on screen + if (Math.max(elem.offsetWidth, elem.offsetHeight) < 30 || Math.min(elem.offsetWidth, elem.offsetHeight) < 15) + return false; + // false if content is smaller than the scrollable container: both x and y scroll distances < element's horizontal/vertical padding + var padding_x = CSSUtil_1.CSSUtil.getPixelsFromStyle(styles.paddingLeft, elem) + CSSUtil_1.CSSUtil.getPixelsFromStyle(styles.paddingRight, elem); + var padding_y = CSSUtil_1.CSSUtil.getPixelsFromStyle(styles.paddingTop, elem) + CSSUtil_1.CSSUtil.getPixelsFromStyle(styles.paddingBottom, elem); + if (elem.scrollWidth - elem.clientWidth < 1 + padding_x + && elem.scrollHeight - elem.clientHeight < 1 + padding_y) + return false; + return true; + }; + // This list contains a list of element tags which can not be hidden, when hidden is + // added to theses elements it does not do anything at all. + // area --> area element is part of a map element and it can not be hidden because it is used to + // make an certian parts of an map interactive. + // param --> element can only be part of object elment and it cannot be hidden directly, it + // can only be hidden if the parent is hidden. + // audio --> If this element is hidden it will still play the music, so we should still trigger + // violations for this element. + // Note: All element tags that are added here should be added as lowercase, as we are using indexOf to do the check. + VisUtil.unhideableElements = ['area', 'param', 'audio']; + // This list contains a list of elements tags which have display: none by default, since we have rules triggering + // on theses elements we need to make then visible by default so that the rules can trigger regardless of the + // Check Hidden Content option in the tools. + // script --> script elements have display: none by default + // link --> link elements have display: none by default, but the actually CSS script is still executed so we have to + // mark this element as visible at all times. + // style --> style elements have display: none by default, but the actually CSS script is still executed so we have to + // mark this element as visible at all times. + // head --> head elements have display: none by default, but it will still behave correct + // title --> title elements have display: none by default, but it will still display the title. remove title from the list because a title can be a child of a svg element too + // meta --> meta elements have display: none by default, but it will still perform the action that meta is suppose to + // base --> base elements have display: none by default, but it will still perform the action that meta is suppose to + // noscript --> noscript elements have display: none by default, but it will still perform the action that meta is suppose to + // template --> template elements have display: none by default, because they are just a mechanism for holding client-side content + // that is not to be rendered when a page is loaded. https://developer.mozilla.org/en/docs/Web/HTML/Element/template + // datalist --> datalist elements have display: none by default, + VisUtil.hiddenByDefaultElements = ['script', 'link', 'style', 'head', 'meta', 'base', 'noscript', 'template', 'datalist']; + return VisUtil; +}()); +exports.VisUtil = VisUtil; + + +/***/ }, + +/***/ 8855 +(module) { + +module.exports = /*#__PURE__*/JSON.parse('{"1.1.1":{"num":"1.1.1","url":"https://www.w3.org/TR/WCAG22/#non-text-content","scId":"WCAG2:non-text-content","scAltId":["text-equiv-all"],"test":"WCAG2:text-equiv-all","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#non-text-content","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/non-text-content.html","handle":"Non-text Content","level":"A","wcagType":"2.0"},"1.2.1":{"num":"1.2.1","url":"https://www.w3.org/TR/WCAG22/#audio-only-and-video-only-prerecorded","scId":"WCAG2:audio-only-and-video-only-prerecorded","scAltId":["media-equiv-av-only-alt"],"test":"WCAG2:media-equiv-av-only-alt","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-only-and-video-only-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-only-and-video-only-prerecorded.html","handle":"Audio-only and Video-only (Prerecorded)","level":"A","wcagType":"2.0"},"1.2.2":{"num":"1.2.2","url":"https://www.w3.org/TR/WCAG22/#captions-prerecorded","scId":"WCAG2:captions-prerecorded","scAltId":["media-equiv-captions"],"test":"WCAG2:media-equiv-captions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#captions-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/captions-prerecorded.html","handle":"Captions (Prerecorded)","level":"A","wcagType":"2.0"},"1.2.3":{"num":"1.2.3","url":"https://www.w3.org/TR/WCAG22/#audio-description-or-media-alternative-prerecorded","scId":"WCAG2:audio-description-or-media-alternative-prerecorded","scAltId":["media-equiv-audio-desc"],"test":"WCAG2:media-equiv-audio-desc","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-description-or-media-alternative-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-description-or-media-alternative-prerecorded.html","handle":"Audio Description or Media Alternative (Prerecorded)","level":"A","wcagType":"2.0"},"1.2.4":{"num":"1.2.4","url":"https://www.w3.org/TR/WCAG22/#captions-live","scId":"WCAG2:captions-live","scAltId":["media-equiv-real-time-captions"],"test":"WCAG2:media-equiv-real-time-captions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#captions-live","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/captions-live.html","handle":"Captions (Live)","level":"AA","wcagType":"2.0"},"1.2.5":{"num":"1.2.5","url":"https://www.w3.org/TR/WCAG22/#audio-description-prerecorded","scId":"WCAG2:audio-description-prerecorded","scAltId":["media-equiv-audio-desc-only"],"test":"WCAG2:media-equiv-audio-desc-only","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-description-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-description-prerecorded.html","handle":"Audio Description (Prerecorded)","level":"AA","wcagType":"2.0"},"1.2.6":{"num":"1.2.6","url":"https://www.w3.org/TR/WCAG22/#sign-language-prerecorded","scId":"WCAG2:sign-language-prerecorded","scAltId":["media-equiv-sign"],"test":"WCAG2:media-equiv-sign","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#sign-language-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/sign-language-prerecorded.html","handle":"Sign Language (Prerecorded)","level":"AAA","wcagType":"2.0"},"1.2.7":{"num":"1.2.7","url":"https://www.w3.org/TR/WCAG22/#extended-audio-description-prerecorded","scId":"WCAG2:extended-audio-description-prerecorded","scAltId":["media-equiv-extended-ad"],"test":"WCAG2:media-equiv-extended-ad","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#extended-audio-description-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/extended-audio-description-prerecorded.html","handle":"Extended Audio Description (Prerecorded)","level":"AAA","wcagType":"2.0"},"1.2.8":{"num":"1.2.8","url":"https://www.w3.org/TR/WCAG22/#media-alternative-prerecorded","scId":"WCAG2:media-alternative-prerecorded","scAltId":["media-equiv-text-doc"],"test":"WCAG2:media-equiv-text-doc","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#media-alternative-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/media-alternative-prerecorded.html","handle":"Media Alternative (Prerecorded)","level":"AAA","wcagType":"2.0"},"1.2.9":{"num":"1.2.9","url":"https://www.w3.org/TR/WCAG22/#audio-only-live","scId":"WCAG2:audio-only-live","scAltId":["media-equiv-live-audio-only"],"test":"WCAG2:media-equiv-live-audio-only","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-only-live","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-only-live.html","handle":"Audio-only (Live)","level":"AAA","wcagType":"2.0"},"1.3.1":{"num":"1.3.1","url":"https://www.w3.org/TR/WCAG22/#info-and-relationships","scId":"WCAG2:info-and-relationships","scAltId":["content-structure-separation-programmatic"],"test":"WCAG2:content-structure-separation-programmatic","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#info-and-relationships","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/info-and-relationships.html","handle":"Info and Relationships","level":"A","wcagType":"2.0"},"1.3.2":{"num":"1.3.2","url":"https://www.w3.org/TR/WCAG22/#meaningful-sequence","scId":"WCAG2:meaningful-sequence","scAltId":["content-structure-separation-sequence"],"test":"WCAG2:content-structure-separation-sequence","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#meaningful-sequence","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/meaningful-sequence.html","handle":"Meaningful Sequence","level":"A","wcagType":"2.0"},"1.3.3":{"num":"1.3.3","url":"https://www.w3.org/TR/WCAG22/#sensory-characteristics","scId":"WCAG2:sensory-characteristics","scAltId":["content-structure-separation-understanding"],"test":"WCAG2:content-structure-separation-understanding","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#sensory-characteristics","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/sensory-characteristics.html","handle":"Sensory Characteristics","level":"A","wcagType":"2.0"},"1.3.4":{"num":"1.3.4","url":"https://www.w3.org/TR/WCAG22/#orientation","scId":"WCAG2:orientation","scAltId":[],"test":"WCAG2:orientation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#orientation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/orientation.html","handle":"Orientation","level":"AA","wcagType":"2.1"},"1.3.5":{"num":"1.3.5","url":"https://www.w3.org/TR/WCAG22/#identify-input-purpose","scId":"WCAG2:identify-input-purpose","scAltId":[],"test":"WCAG2:identify-input-purpose","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#identify-input-purpose","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/identify-input-purpose.html","handle":"Identify Input Purpose","level":"AA","wcagType":"2.1"},"1.3.6":{"num":"1.3.6","url":"https://www.w3.org/TR/WCAG22/#identify-purpose","scId":"WCAG2:identify-purpose","scAltId":[],"test":"WCAG2:identify-purpose","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#identify-purpose","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/identify-purpose.html","handle":"Identify Purpose","level":"AAA","wcagType":"2.1"},"1.4.1":{"num":"1.4.1","url":"https://www.w3.org/TR/WCAG22/#use-of-color","scId":"WCAG2:use-of-color","scAltId":["visual-audio-contrast-without-color"],"test":"WCAG2:visual-audio-contrast-without-color","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#use-of-color","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/use-of-color.html","handle":"Use of Color","level":"A","wcagType":"2.0"},"1.4.2":{"num":"1.4.2","url":"https://www.w3.org/TR/WCAG22/#audio-control","scId":"WCAG2:audio-control","scAltId":["visual-audio-contrast-dis-audio"],"test":"WCAG2:visual-audio-contrast-dis-audio","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-control","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-control.html","handle":"Audio Control","level":"A","wcagType":"2.0"},"1.4.3":{"num":"1.4.3","url":"https://www.w3.org/TR/WCAG22/#contrast-minimum","scId":"WCAG2:contrast-minimum","scAltId":["visual-audio-contrast-contrast"],"test":"WCAG2:visual-audio-contrast-contrast","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#contrast-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/contrast-minimum.html","handle":"Contrast (Minimum)","level":"AA","wcagType":"2.0"},"1.4.4":{"num":"1.4.4","url":"https://www.w3.org/TR/WCAG22/#resize-text","scId":"WCAG2:resize-text","scAltId":["visual-audio-contrast-scale"],"test":"WCAG2:visual-audio-contrast-scale","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#resize-text","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/resize-text.html","handle":"Resize text","level":"AA","wcagType":"2.0"},"1.4.5":{"num":"1.4.5","url":"https://www.w3.org/TR/WCAG22/#images-of-text","scId":"WCAG2:images-of-text","scAltId":["visual-audio-contrast-text-presentation"],"test":"WCAG2:visual-audio-contrast-text-presentation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#images-of-text","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/images-of-text.html","handle":"Images of Text","level":"AA","wcagType":"2.0"},"1.4.6":{"num":"1.4.6","url":"https://www.w3.org/TR/WCAG22/#contrast-enhanced","scId":"WCAG2:contrast-enhanced","scAltId":["visual-audio-contrast7"],"test":"WCAG2:visual-audio-contrast7","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#contrast-enhanced","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/contrast-enhanced.html","handle":"Contrast (Enhanced)","level":"AAA","wcagType":"2.0"},"1.4.7":{"num":"1.4.7","url":"https://www.w3.org/TR/WCAG22/#low-or-no-background-audio","scId":"WCAG2:low-or-no-background-audio","scAltId":["visual-audio-contrast-noaudio"],"test":"WCAG2:visual-audio-contrast-noaudio","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#low-or-no-background-audio","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/low-or-no-background-audio.html","handle":"Low or No Background Audio","level":"AAA","wcagType":"2.0"},"1.4.8":{"num":"1.4.8","url":"https://www.w3.org/TR/WCAG22/#visual-presentation","scId":"WCAG2:visual-presentation","scAltId":["visual-audio-contrast-visual-presentation"],"test":"WCAG2:visual-audio-contrast-visual-presentation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#visual-presentation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/visual-presentation.html","handle":"Visual Presentation","level":"AAA","wcagType":"2.0"},"1.4.9":{"num":"1.4.9","url":"https://www.w3.org/TR/WCAG22/#images-of-text-no-exception","scId":"WCAG2:images-of-text-no-exception","scAltId":["visual-audio-contrast-text-images"],"test":"WCAG2:visual-audio-contrast-text-images","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#images-of-text-no-exception","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/images-of-text-no-exception.html","handle":"Images of Text (No Exception)","level":"AAA","wcagType":"2.0"},"1.4.10":{"num":"1.4.10","url":"https://www.w3.org/TR/WCAG22/#reflow","scId":"WCAG2:reflow","scAltId":[],"test":"WCAG2:reflow","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#reflow","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/reflow.html","handle":"Reflow","level":"AA","wcagType":"2.1"},"1.4.11":{"num":"1.4.11","url":"https://www.w3.org/TR/WCAG22/#non-text-contrast","scId":"WCAG2:non-text-contrast","scAltId":[],"test":"WCAG2:non-text-contrast","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#non-text-contrast","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/non-text-contrast.html","handle":"Non-text Contrast","level":"AA","wcagType":"2.1"},"1.4.12":{"num":"1.4.12","url":"https://www.w3.org/TR/WCAG22/#text-spacing","scId":"WCAG2:text-spacing","scAltId":[],"test":"WCAG2:text-spacing","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#text-spacing","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/text-spacing.html","handle":"Text Spacing","level":"AA","wcagType":"2.1"},"1.4.13":{"num":"1.4.13","url":"https://www.w3.org/TR/WCAG22/#content-on-hover-or-focus","scId":"WCAG2:content-on-hover-or-focus","scAltId":[],"test":"WCAG2:content-on-hover-or-focus","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#content-on-hover-or-focus","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/content-on-hover-or-focus.html","handle":"Content on Hover or Focus","level":"AA","wcagType":"2.1"},"2.1.1":{"num":"2.1.1","url":"https://www.w3.org/TR/WCAG22/#keyboard","scId":"WCAG2:keyboard","scAltId":["keyboard-operation-keyboard-operable"],"test":"WCAG2:keyboard-operation-keyboard-operable","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#keyboard","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/keyboard.html","handle":"Keyboard","level":"A","wcagType":"2.0"},"2.1.2":{"num":"2.1.2","url":"https://www.w3.org/TR/WCAG22/#no-keyboard-trap","scId":"WCAG2:no-keyboard-trap","scAltId":["keyboard-operation-trapping"],"test":"WCAG2:keyboard-operation-trapping","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#no-keyboard-trap","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/no-keyboard-trap.html","handle":"No Keyboard Trap","level":"A","wcagType":"2.0"},"2.1.3":{"num":"2.1.3","url":"https://www.w3.org/TR/WCAG22/#keyboard-no-exception","scId":"WCAG2:keyboard-no-exception","scAltId":["keyboard-operation-all-funcs"],"test":"WCAG2:keyboard-operation-all-funcs","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#keyboard-no-exception","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/keyboard-no-exception.html","handle":"Keyboard (No Exception)","level":"AAA","wcagType":"2.0"},"2.1.4":{"num":"2.1.4","url":"https://www.w3.org/TR/WCAG22/#character-key-shortcuts","scId":"WCAG2:character-key-shortcuts","scAltId":[],"test":"WCAG2:WCAG2:character-key-shortcuts","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#character-key-shortcuts","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/character-key-shortcuts.html","handle":"Character Key Shortcuts","level":"A","wcagType":"2.1"},"2.2.1":{"num":"2.2.1","url":"https://www.w3.org/TR/WCAG22/#timing-adjustable","scId":"WCAG2:timing-adjustable","scAltId":["time-limits-required-behaviors"],"test":"WCAG2:time-limits-required-behaviors","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#timing-adjustable","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/timing-adjustable.html","handle":"Timing Adjustable","level":"A","wcagType":"2.0"},"2.2.2":{"num":"2.2.2","url":"https://www.w3.org/TR/WCAG22/#pause-stop-hide","scId":"WCAG2:pause-stop-hide","scAltId":["time-limits-pause"],"test":"WCAG2:time-limits-pause","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pause-stop-hide","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pause-stop-hide.html","handle":"Pause, Stop, Hide","level":"A","wcagType":"2.0"},"2.2.3":{"num":"2.2.3","url":"https://www.w3.org/TR/WCAG22/#no-timing","scId":"WCAG2:no-timing","scAltId":["time-limits-no-exceptions"],"test":"WCAG2:time-limits-no-exceptions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#no-timing","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/no-timing.html","handle":"No Timing","level":"AAA","wcagType":"2.0"},"2.2.4":{"num":"2.2.4","url":"https://www.w3.org/TR/WCAG22/#interruptions","scId":"WCAG2:interruptions","scAltId":["time-limits-postponed"],"test":"WCAG2:time-limits-postponed","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#interruptions","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/interruptions.html","handle":"Interruptions","level":"AAA","wcagType":"2.0"},"2.2.5":{"num":"2.2.5","url":"https://www.w3.org/TR/WCAG22/#re-authenticating","scId":"WCAG2:re-authenticating","scAltId":["time-limits-server-timeout"],"test":"WCAG2:time-limits-server-timeout","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#re-authenticating","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/re-authenticating.html","handle":"Re-authenticating","level":"AAA","wcagType":"2.0"},"2.2.6":{"num":"2.2.6","url":"https://www.w3.org/TR/WCAG22/#timeouts","scId":"WCAG2:timeouts","scAltId":[],"test":"WCAG2:WCAG2:timeouts","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#timeouts","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/timeouts.html","handle":"Timeouts","level":"AAA","wcagType":"2.1"},"2.3.1":{"num":"2.3.1","url":"https://www.w3.org/TR/WCAG22/#three-flashes-or-below-threshold","scId":"WCAG2:three-flashes-or-below-threshold","scAltId":["seizure-does-not-violate"],"test":"WCAG2:seizure-does-not-violate","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#three-flashes-or-below-threshold","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/three-flashes-or-below-threshold.html","handle":"Three Flashes or Below Threshold","level":"A","wcagType":"2.0"},"2.3.2":{"num":"2.3.2","url":"https://www.w3.org/TR/WCAG22/#three-flashes","scId":"WCAG2:three-flashes","scAltId":["seizure-three-times"],"test":"WCAG2:seizure-three-times","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#three-flashes","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/three-flashes.html","handle":"Three Flashes","level":"AAA","wcagType":"2.0"},"2.3.3":{"num":"2.3.3","url":"https://www.w3.org/TR/WCAG22/#animation-from-interactions","scId":"WCAG2:animation-from-interactions","scAltId":[],"test":"WCAG2:WCAG2:animation-from-interactions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#animation-from-interactions","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/animation-from-interactions.html","handle":"Animation from Interactions","level":"AAA","wcagType":"2.1"},"2.4.1":{"num":"2.4.1","url":"https://www.w3.org/TR/WCAG22/#bypass-blocks","scId":"WCAG2:bypass-blocks","scAltId":["navigation-mechanisms-skip"],"test":"WCAG2:navigation-mechanisms-skip","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#bypass-blocks","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/bypass-blocks.html","handle":"Bypass Blocks","level":"A","wcagType":"2.0"},"2.4.2":{"num":"2.4.2","url":"https://www.w3.org/TR/WCAG22/#page-titled","scId":"WCAG2:page-titled","scAltId":["navigation-mechanisms-title"],"test":"WCAG2:navigation-mechanisms-title","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#page-titled","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/page-titled.html","handle":"Page Titled","level":"A","wcagType":"2.0"},"2.4.3":{"num":"2.4.3","url":"https://www.w3.org/TR/WCAG22/#focus-order","scId":"WCAG2:focus-order","scAltId":["navigation-mechanisms-focus-order"],"test":"WCAG2:navigation-mechanisms-focus-order","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-order","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-order.html","handle":"Focus Order","level":"A","wcagType":"2.0"},"2.4.4":{"num":"2.4.4","url":"https://www.w3.org/TR/WCAG22/#link-purpose-in-context","scId":"WCAG2:link-purpose-in-context","scAltId":["navigation-mechanisms-refs"],"test":"WCAG2:navigation-mechanisms-refs","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#link-purpose-in-context","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/link-purpose-in-context.html","handle":"Link Purpose (In Context)","level":"A","wcagType":"2.0"},"2.4.5":{"num":"2.4.5","url":"https://www.w3.org/TR/WCAG22/#multiple-ways","scId":"WCAG2:multiple-ways","scAltId":["navigation-mechanisms-mult-loc"],"test":"WCAG2:navigation-mechanisms-mult-loc","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#multiple-ways","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/multiple-ways.html","handle":"Multiple Ways","level":"AA","wcagType":"2.0"},"2.4.6":{"num":"2.4.6","url":"https://www.w3.org/TR/WCAG22/#headings-and-labels","scId":"WCAG2:headings-and-labels","scAltId":["navigation-mechanisms-descriptive"],"test":"WCAG2:navigation-mechanisms-descriptive","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#headings-and-labels","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/headings-and-labels.html","handle":"Headings and Labels","level":"AA","wcagType":"2.0"},"2.4.7":{"num":"2.4.7","url":"https://www.w3.org/TR/WCAG22/#focus-visible","scId":"WCAG2:focus-visible","scAltId":["navigation-mechanisms-focus-visible"],"test":"WCAG2:navigation-mechanisms-focus-visible","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-visible","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-visible.html","handle":"Focus Visible","level":"AA","wcagType":"2.0"},"2.4.8":{"num":"2.4.8","url":"https://www.w3.org/TR/WCAG22/#location","scId":"WCAG2:location","scAltId":["navigation-mechanisms-location"],"test":"WCAG2:navigation-mechanisms-location","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#location","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/location.html","handle":"Location","level":"AAA","wcagType":"2.0"},"2.4.9":{"num":"2.4.9","url":"https://www.w3.org/TR/WCAG22/#link-purpose-link-only","scId":"WCAG2:link-purpose-link-only","scAltId":["navigation-mechanisms-link"],"test":"WCAG2:navigation-mechanisms-link","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#link-purpose-link-only","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/link-purpose-link-only.html","handle":"Link Purpose (Link Only)","level":"AAA","wcagType":"2.0"},"2.4.10":{"num":"2.4.10","url":"https://www.w3.org/TR/WCAG22/#section-headings","scId":"WCAG2:section-headings","scAltId":["navigation-mechanisms-headings"],"test":"WCAG2:navigation-mechanisms-headings","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#section-headings","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/section-headings.html","handle":"Section Headings","level":"AAA","wcagType":"2.0"},"2.4.11":{"num":"2.4.11","url":"https://www.w3.org/TR/WCAG22/#focus-not-obscured-minimum","scId":"WCAG2:focus-not-obscured-minimum","scAltId":["focus-not-obscured-minimum-alt"],"test":"WCAG2:focus-not-obscured-minimum-test","howToMeetUrl":"https://www.w3.org/TR/WCAG22/#focus-not-obscured-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-not-obscured-minimum.html","handle":"Focus Not Obscured (Minimum)","level":"AA","wcagType":"2.2"},"2.4.12":{"num":"2.4.12","url":"https://www.w3.org/TR/WCAG22/#focus-not-obscured-enhanced","scId":"WCAG2:focus-not-obscured-enhanced","scAltId":[],"test":"WCAG2:focus-not-obscured-enhanced-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-not-obscured-enhanced","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-not-obscured-enhanced.html","handle":"Focus Not Obscured (Enhanced)","level":"AAA","wcagType":"2.2"},"2.4.13":{"num":"2.4.13","url":"https://www.w3.org/TR/WCAG22/#focus-appearance","scId":"WCAG2:focus-appearance","scAltId":[],"test":"WCAG2:focus-appearance","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-appearance","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-appearance.html","handle":"Focus Appearance","level":"AAA","wcagType":"2.2"},"2.5.1":{"num":"2.5.1","url":"https://www.w3.org/TR/WCAG22/#pointer-gestures","scId":"WCAG2:pointer-gestures","scAltId":[],"test":"WCAG2:pointer-gestures-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pointer-gestures","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pointer-gestures.html","handle":"Pointer Gestures","level":"A","wcagType":"2.1"},"2.5.2":{"num":"2.5.2","url":"https://www.w3.org/TR/WCAG22/#pointer-cancellation","scId":"WCAG2:pointer-cancellation","scAltId":[],"test":"WCAG2:WCAG2:pointer-cancellation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pointer-cancellation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pointer-cancellation.html","handle":"Pointer Cancellation","level":"A","wcagType":"2.1"},"2.5.3":{"num":"2.5.3","url":"https://www.w3.org/TR/WCAG22/#label-in-name","scId":"WCAG2:label-in-name","scAltId":[],"test":"WCAG2:WCAG2:label-in-name","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#label-in-name","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/label-in-name.html","handle":"Label in Name","level":"A","wcagType":"2.1"},"2.5.4":{"num":"2.5.4","url":"https://www.w3.org/TR/WCAG22/#motion-actuation","scId":"WCAG2:motion-actuation","scAltId":[],"test":"WCAG2:WCAG2:motion-actuation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#motion-actuation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/motion-actuation.html","handle":"Motion Actuation","level":"A","wcagType":"2.1"},"2.5.5":{"num":"2.5.5","url":"https://www.w3.org/TR/WCAG22/#target-size","scId":"WCAG2:target-size","scAltId":[],"test":"WCAG2:WCAG2:target-size","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#target-size","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/target-size.html","handle":"Target Size","level":"AAA","wcagType":"2.1"},"2.5.6":{"num":"2.5.6","url":"https://www.w3.org/TR/WCAG22/#concurrent-input-mechanisms","scId":"WCAG2:concurrent-input-mechanisms","scAltId":[],"test":"WCAG2:WCAG2:concurrent-input-mechanisms","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#concurrent-input-mechanisms","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/concurrent-input-mechanisms.html","handle":"Concurrent Input Mechanisms","level":"AAA","wcagType":"2.1"},"2.5.7":{"num":"2.5.7","url":"https://www.w3.org/TR/WCAG22/#dragging-movements","scId":"WCAG2:dragging-movement","scAltId":["dragging-movement-alt"],"test":"WCAG2:dragging-movement-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/Understanding/dragging-movements.html","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/dragging-movements.html","handle":"Dragging Movement","level":"AA","wcagType":"2.2"},"2.5.8":{"num":"2.5.8","url":"https://www.w3.org/TR/WCAG22/#target-size-minimum","scId":"WCAG2:minimum-target-size","scAltId":["minimum-target-size-alt"],"test":"WCAG2:minimum-target-size-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#target-size-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/target-size-minimum.html","handle":"Minimum Target Size","level":"AA","wcagType":"2.2"},"3.1.1":{"num":"3.1.1","url":"https://www.w3.org/TR/WCAG22/#language-of-page","scId":"WCAG2:language-of-page","scAltId":["meaning-doc-lang-id"],"test":"WCAG2:meaning-doc-lang-id","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#language-of-page","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/language-of-page.html","handle":"Language of Page","level":"A","wcagType":"2.0"},"3.1.2":{"num":"3.1.2","url":"https://www.w3.org/TR/WCAG22/#language-of-parts","scId":"WCAG2:language-of-parts","scAltId":["meaning-other-lang-id"],"test":"WCAG2:meaning-other-lang-id","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#language-of-parts","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/language-of-parts.html","handle":"Language of Parts","level":"AA","wcagType":"2.0"},"3.1.3":{"num":"3.1.3","url":"https://www.w3.org/TR/WCAG22/#unusual-words","scId":"WCAG2:unusual-words","scAltId":["meaning-idioms"],"test":"WCAG2:meaning-idioms","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#unusual-words","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/unusual-words.html","handle":"Unusual Words","level":"AAA","wcagType":"2.0"},"3.1.4":{"num":"3.1.4","url":"https://www.w3.org/TR/WCAG22/#abbreviations","scId":"WCAG2:abbreviations","scAltId":["meaning-located"],"test":"WCAG2:meaning-located","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#abbreviations","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/abbreviations.html","handle":"Abbreviations","level":"AAA","wcagType":"2.0"},"3.1.5":{"num":"3.1.5","url":"https://www.w3.org/TR/WCAG22/#reading-level","scId":"WCAG2:reading-level","scAltId":["meaning-supplements"],"test":"WCAG2:meaning-supplements","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#reading-level","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/reading-level.html","handle":"Reading Level","level":"AAA","wcagType":"2.0"},"3.1.6":{"num":"3.1.6","url":"https://www.w3.org/TR/WCAG22/#pronunciation","scId":"WCAG2:pronunciation","scAltId":["meaning-pronunciation"],"test":"WCAG2:meaning-pronunciation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pronunciation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pronunciation.html","handle":"Pronunciation","level":"AAA","wcagType":"2.0"},"3.2.1":{"num":"3.2.1","url":"https://www.w3.org/TR/WCAG22/#on-focus","scId":"WCAG2:on-focus","scAltId":["consistent-behavior-receive-focus"],"test":"WCAG2:consistent-behavior-receive-focus","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#on-focus","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/on-focus.html","handle":"On Focus","level":"A","wcagType":"2.0"},"3.2.2":{"num":"3.2.2","url":"https://www.w3.org/TR/WCAG22/#on-input","scId":"WCAG2:on-input","scAltId":["consistent-behavior-unpredictable-change"],"test":"WCAG2:consistent-behavior-unpredictable-change","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#on-input","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/on-input.html","handle":"On Input","level":"A","wcagType":"2.0"},"3.2.3":{"num":"3.2.3","url":"https://www.w3.org/TR/WCAG22/#consistent-navigation","scId":"WCAG2:consistent-navigation","scAltId":["consistent-behavior-consistent-locations"],"test":"WCAG2:consistent-behavior-consistent-locations","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#consistent-navigation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/consistent-navigation.html","handle":"Consistent Navigation","level":"AA","wcagType":"2.0"},"3.2.4":{"num":"3.2.4","url":"https://www.w3.org/TR/WCAG22/#consistent-identification","scId":"WCAG2:consistent-identification","scAltId":["consistent-behavior-consistent-functionality"],"test":"WCAG2:consistent-behavior-consistent-functionality","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#consistent-identification","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/consistent-identification.html","handle":"Consistent Identification","level":"AA","wcagType":"2.0"},"3.2.5":{"num":"3.2.5","url":"https://www.w3.org/TR/WCAG22/#change-on-request","scId":"WCAG2:change-on-request","scAltId":["consistent-behavior-no-extreme-changes-context"],"test":"WCAG2:consistent-behavior-no-extreme-changes-context","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#change-on-request","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/change-on-request.html","handle":"Change on Request","level":"AAA","wcagType":"2.0"},"3.2.6":{"num":"3.2.6","url":"https://www.w3.org/TR/WCAG22/#consistent-help","scId":"WCAG2:consistent-help","scAltId":["consistent-help-alt"],"test":"WCAG2:consistent-help-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#consistent-help","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/consistent-help.html","handle":"Consistent Help","level":"AA","wcagType":"2.2"},"3.3.1":{"num":"3.3.1","url":"https://www.w3.org/TR/WCAG22/#error-identification","scId":"WCAG2:error-identification","scAltId":["minimize-error-identified"],"test":"WCAG2:minimize-error-identified","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-identification","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-identification.html","handle":"Error Identification","level":"A","wcagType":"2.0"},"3.3.2":{"num":"3.3.2","url":"https://www.w3.org/TR/WCAG22/#labels-or-instructions","scId":"WCAG2:labels-or-instructions","scAltId":["minimize-error-cues"],"test":"WCAG2:minimize-error-cues","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#labels-or-instructions","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/labels-or-instructions.html","handle":"Labels or Instructions","level":"A","wcagType":"2.0"},"3.3.3":{"num":"3.3.3","url":"https://www.w3.org/TR/WCAG22/#error-suggestion","scId":"WCAG2:error-suggestion","scAltId":["minimize-error-suggestions"],"test":"WCAG2:minimize-error-suggestions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-suggestion","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-suggestion.html","handle":"Error Suggestion","level":"AA","wcagType":"2.0"},"3.3.4":{"num":"3.3.4","url":"https://www.w3.org/TR/WCAG22/#error-prevention-legal-financial-data","scId":"WCAG2:error-prevention-legal-financial-data","scAltId":["minimize-error-reversible"],"test":"WCAG2:minimize-error-reversible","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-prevention-legal-financial-data","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-prevention-legal-financial-data.html","handle":"Error Prevention (Legal, Financial, Data)","level":"AA","wcagType":"2.0"},"3.3.5":{"num":"3.3.5","url":"https://www.w3.org/TR/WCAG22/#help","scId":"WCAG2:help","scAltId":["minimize-error-context-help"],"test":"WCAG2:minimize-error-context-help","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#help","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/help.html","handle":"Help","level":"AAA","wcagType":"2.0"},"3.3.6":{"num":"3.3.6","url":"https://www.w3.org/TR/WCAG22/#error-prevention-all","scId":"WCAG2:error-prevention-all","scAltId":["minimize-error-reversible-all"],"test":"WCAG2:minimize-error-reversible-all","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-prevention-all","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-prevention-all.html","handle":"Error Prevention (All)","level":"AAA","wcagType":"2.0"},"3.3.7":{"num":"3.3.7","url":"https://www.w3.org/TR/WCAG22/#redundant-entry","scId":"WCAG2:redundant-entry","scAltId":["redundant-entry-alt"],"test":"WCAG2:redundant-entry-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#redundant-entry","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/redundant-entry.html","handle":"Redundant Entry","level":"AA","wcagType":"2.2"},"3.3.8":{"num":"3.3.8","url":"https://www.w3.org/TR/WCAG22/#accessible-authentication-minimum","scId":"WCAG2:accessible-authentication-minimum","scAltId":["accessible-authentication-minimum-alt"],"test":"WCAG2:accessible-authentication-minimum-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#accessible-authentication-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/accessible-authentication-minimum.html","handle":"Accessible Authentication (Minimum)","level":"AA","wcagType":"2.2"},"3.3.9":{"num":"3.3.9","url":"https://www.w3.org/TR/WCAG22/#accessible-authentication-enhanced","scId":"WCAG2:accessible-authentication-enhanced","scAltId":[],"test":"WCAG2:accessible-authentication-enhanced","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#accessible-authentication-enhanced","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/accessible-authentication-enhanced.html","handle":"Accessible Authentication (Enhanced)","level":"AAA","wcagType":"2.2"},"4.1.1":{"num":"4.1.1","url":"https://www.w3.org/TR/WCAG22/#parsing","scId":"WCAG2:parsing","scAltId":["ensure-compat-parses"],"test":"WCAG2:ensure-compat-parses","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/?versions=2.1#parsing","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/parsing.html","handle":"Parsing","level":"A","wcagType":"2.0"},"4.1.2":{"num":"4.1.2","url":"https://www.w3.org/TR/WCAG22/#name-role-value","scId":"WCAG2:name-role-value","scAltId":["ensure-compat-rsv"],"test":"WCAG2:ensure-compat-rsv","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#name-role-value","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/name-role-value.html","handle":"Name, Role, Value","level":"A","wcagType":"2.0"},"4.1.3":{"num":"4.1.3","url":"https://www.w3.org/TR/WCAG22/#status-messages","scId":"WCAG2:status-messages","scAltId":[],"test":"WCAG2:status-messages","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#status-messages","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/status-messages.html","handle":"Status Messages","level":"AA","wcagType":"2.1"},"HTML":{"num":"HTML","url":"https://html.spec.whatwg.org/multipage/","scId":"","scAltId":[],"test":"","howToMeetUrl":"https://html.spec.whatwg.org/multipage/","understandingUrl":"https://html.spec.whatwg.org/multipage/","handle":"specification","level":"NA","wcagType":"NA"},"ARIA":{"num":"ARIA","url":"https://www.w3.org/TR/wai-aria-1.2/","scId":"","scAltId":[],"test":"","howToMeetUrl":"https://www.w3.org/TR/wai-aria-1.2/","understandingUrl":"https://www.w3.org/TR/wai-aria-1.2/","handle":"specification","level":"NA","wcagType":"NA"}}'); + +/***/ } + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ const __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ const cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ const module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +let __webpack_exports__ = {}; +// This entry needs to be wrapped in an IIFE because it uses a non-standard name for the exports (exports). +(() => { +let exports = __webpack_exports__; + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.checkDemo = exports.SRViewer = exports.SRCursor = exports.SRController = exports.DOMWalker = exports.Config = exports.ARIAMapper = exports.Checker = exports.Context = void 0; +var Context_1 = __webpack_require__(920); +Object.defineProperty(exports, "Context", ({ enumerable: true, get: function () { return Context_1.Context; } })); +// import { Simulator } from "./v2/simulator" +var Checker_1 = __webpack_require__(7412); +Object.defineProperty(exports, "Checker", ({ enumerable: true, get: function () { return Checker_1.Checker; } })); +var ARIAMapper_1 = __webpack_require__(9955); +Object.defineProperty(exports, "ARIAMapper", ({ enumerable: true, get: function () { return ARIAMapper_1.ARIAMapper; } })); +var Config_1 = __webpack_require__(4516); +Object.defineProperty(exports, "Config", ({ enumerable: true, get: function () { return Config_1.Config; } })); +var DOMWalker_1 = __webpack_require__(3864); +Object.defineProperty(exports, "DOMWalker", ({ enumerable: true, get: function () { return DOMWalker_1.DOMWalker; } })); +var SRController_1 = __webpack_require__(5233); +Object.defineProperty(exports, "SRController", ({ enumerable: true, get: function () { return SRController_1.SRController; } })); +var SRCursor_1 = __webpack_require__(8195); +Object.defineProperty(exports, "SRCursor", ({ enumerable: true, get: function () { return SRCursor_1.SRCursor; } })); +var SRViewer_1 = __webpack_require__(8107); +Object.defineProperty(exports, "SRViewer", ({ enumerable: true, get: function () { return SRViewer_1.SRViewer; } })); +function checkDemo(timeout) { + if (!timeout) + timeout = 0; + var checker = new Checker_1.Checker(); + setTimeout(function () { + checker.check(document.documentElement, ["IBM_Accessibility", "IBM_Design"]) + .then(function (report) { + console.log(report); + var vals = { + "FAIL": 0, + "POTENTIAL": 1, + "MANUAL": 2, + "PASS": 3 + }; + for (var idx = 0; idx < report.results.length; ++idx) { + if (report.results[idx].value[1] === "PASS") { + report.results.splice(idx--, 1); + } + } + report.results.sort(function (a, b) { + if (a.category != b.category) { + return a.category.localeCompare(b.category); + } + if (a.path["aria"] === b.path["aria"]) { + return vals[a.value[1]] - vals[b.value[1]]; + } + return a.path["aria"].localeCompare(b.path["aria"]); + }); + var lastPath = null; + var category = null; + for (var _i = 0, _a = report.results; _i < _a.length; _i++) { + var result = _a[_i]; + if (category !== result.category) { + if (category !== null) { + console.groupEnd(); + console.groupEnd(); + lastPath = null; + } + category = result.category; + console.group(result.category); + } + if (result.path["aria"] != lastPath) { + if (lastPath !== null) { + console.groupEnd(); + } + lastPath = result.path["aria"]; + if (lastPath === "") { + console.group("page"); + } + else { + console.group(lastPath); + } + } + console.log(result.value, result.message); + } + console.groupEnd(); + console.groupEnd(); + }); + }, timeout); +} +exports.checkDemo = checkDemo; + +})(); + +module.exports = __webpack_exports__; +/******/ })() +; \ No newline at end of file diff --git a/rule-server/src/static/archives/2026.07.13/js/ace-node.js b/rule-server/src/static/archives/2026.07.13/js/ace-node.js new file mode 100644 index 000000000..830b21d06 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/js/ace-node.js @@ -0,0 +1,2 @@ +/*! For license information please see ace-node.js.LICENSE.txt */ +(()=>{"use strict";var e={9910(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.ARIADefinitions=void 0;var i=function(){function e(){}return e.nameFromContent=function(t){return t in e.designPatterns&&e.designPatterns[t].nameFrom&&e.designPatterns[t].nameFrom.includes("contents")},e.globalProperties=["aria-atomic","aria-busy","aria-controls","aria-current","aria-describedby","aria-details","aria-flowto","aria-hidden","aria-keyshortcuts","aria-label","aria-labelledby","aria-live","aria-owns","aria-relevant","aria-roledescription","aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"],e.referenceProperties=["aria-owns","aria-controls","aria-describedby","aria-labelledby","aria-flowto","aria-activedescendant"],e.globalDeprecatedRoles=["directory","doc-biblioentry","doc-endnote"],e.globalDeprecatedProperties=["aria-grabbed","aria-dropeffect"],e.propertyDataTypes={"aria-activedescendant":{type:"http://www.w3.org/2001/XMLSchema#idref",hiddenIDRefSupported:!0},"aria-atomic":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-autocomplete":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["inline","list","both","none","undefined"]},"aria-busy":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-checked":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","mixed","undefined"]},"aria-colcount":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-colindex":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-colspan":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-controls":{type:"http://www.w3.org/2001/XMLSchema#idrefs",hiddenIDRefSupported:!0},"aria-current":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["page","step","location","date","time","true","false","undefined"]},"aria-describedby":{type:"http://www.w3.org/2001/XMLSchema#idrefs",hiddenIDRefSupported:!0},"aria-details":{type:"http://www.w3.org/2001/XMLSchema#idrefs"},"aria-disabled":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-dropeffect":{type:"http://www.w3.org/2001/XMLSchema#nmtokens",values:["copy","move","link","execute","popup","none"]},"aria-errormessage":{type:"http://www.w3.org/2001/XMLSchema#idref",hiddenIDRefSupported:!0},"aria-expanded":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","undefined"]},"aria-flowto":{type:"http://www.w3.org/2001/XMLSchema#idrefs",hiddenIDRefSupported:!1},"aria-grabbed":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","undefined"]},"aria-haspopup":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","menu","listbox","tree","grid","dialog"]},"aria-hidden":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","undefined"]},"aria-invalid":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","spelling","grammar","undefined"]},"aria-keyshortcuts":{type:"http://www.w3.org/2001/XMLSchema#string"},"aria-label":{type:"http://www.w3.org/2001/XMLSchema#string"},"aria-labelledby":{type:"http://www.w3.org/2001/XMLSchema#idrefs",hiddenIDRefSupported:!0},"aria-level":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-live":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["off","polite","assertive"]},"aria-modal":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-multiline":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-multiselectable":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-orientation":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["horizontal","vertical","undefined"]},"aria-owns":{type:"http://www.w3.org/2001/XMLSchema#idrefs",hiddenIDRefSupported:!0},"aria-placeholder":{type:"http://www.w3.org/2001/XMLSchema#string"},"aria-posinset":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-pressed":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","mixed","undefined"]},"aria-readonly":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-relevant":{type:"http://www.w3.org/2001/XMLSchema#nmtokens",values:["additions","removals","text","all"]},"aria-required":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-roledescription":{type:"http://www.w3.org/2001/XMLSchema#string"},"aria-rowcount":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-rowindex":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-rowspan":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-selected":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","undefined"]},"aria-setsize":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-sort":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["ascending","descending","other","none"]},"aria-valuemax":{type:"http://www.w3.org/2001/XMLSchema#decimal"},"aria-valuemin":{type:"http://www.w3.org/2001/XMLSchema#decimal"},"aria-valuenow":{type:"http://www.w3.org/2001/XMLSchema#decimal"},"aria-valuetext":{type:"http://www.w3.org/2001/XMLSchema#string"}},e.designPatterns={alert:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"liveRegion",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},alertdialog:{container:null,props:["aria-modal"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"window",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},application:{container:null,props:["aria-activedescendant","aria-expanded"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!0,nameFrom:["author"]},article:{container:null,props:["aria-posinset","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},banner:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},blockquote:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},button:{container:null,props:["aria-expanded","aria-pressed"],reqProps:null,reqChildren:null,htmlEquiv:"button | input[@type='button']",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-invalid"]},caption:{container:["figure","grid","table","treegrid"],props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},cell:{container:["row"],props:["aria-colindex","aria-colspan","aria-rowindex","aria-rowspan"],reqProps:null,reqChildren:null,htmlEquiv:"td",roleType:"structure",nameFrom:["author","contents"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},checkbox:{container:null,props:["aria-expanded","aria-readonly","aria-required"],reqProps:["aria-checked"],reqChildren:null,htmlEquiv:"input[@type='checkbox']",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-haspopup"]},code:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},columnheader:{container:["row"],props:["aria-colindex","aria-colspan","aria-expanded","aria-readonly","aria-required","aria-rowindex","aria-rowspan","aria-selected","aria-sort"],reqProps:null,reqChildren:null,htmlEquiv:"th[@scope='col']",roleType:"structure",nameRequired:!0,nameFrom:["author","contents"]},combobox:{container:null,props:["aria-controls","aria-activedescendant","aria-autocomplete","aria-readonly","aria-required"],reqProps:["aria-expanded"],reqChildren:[],htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"]},complementary:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},comment:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author","contents"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},contentinfo:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},definition:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},deletion:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},dialog:{container:null,props:["aria-modal"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"window",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},directory:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecated:!0,deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},"doc-abstract":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-acknowledgments":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-afterword":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-appendix":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-backlink":{container:null,props:["aria-disabled","aria-expanded","aria-haspopup"],reqProps:null,reqChildren:null,htmlEquiv:"a | link",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"]},"doc-biblioentry":{container:["list"],props:["aria-level","aria-posinset","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:"li",roleType:"structure",nameRequired:!0,nameFrom:["author"]},"doc-bibliography":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-biblioref":{container:null,props:["aria-disabled","aria-expanded","aria-haspopup"],reqProps:null,reqChildren:null,htmlEquiv:"a | link",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"]},"doc-chapter":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-colophon":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!0,nameFrom:["author"]},"doc-conclusion":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-cover":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"img",roleType:"structure",nameRequired:!1,nameFrom:["author"],presentationalChildren:!0},"doc-credit":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-credits":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-dedication":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-endnote":{container:["list"],props:["aria-level","aria-posinset","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:"li",roleType:"structure",nameRequired:!1,nameFrom:["author"]},"doc-endnotes":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!0,nameFrom:["author"]},"doc-epigraph":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-epilogue":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-errata":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-example":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-footnote":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-foreword":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-glossary":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-glossref":{container:null,props:["aria-disabled","aria-expanded","aria-haspopup"],reqProps:null,reqChildren:null,htmlEquiv:"a | link",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"]},"doc-index":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-introduction":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-noteref":{container:null,props:["aria-disabled","aria-expanded","aria-haspopup"],reqProps:null,reqChildren:null,htmlEquiv:"a | link",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"]},"doc-notice":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author"]},"doc-pagebreak":{container:null,props:["aria-orientation"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0},"doc-pagelist":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-pagefooter":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"]},"doc-pageheader":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"]},"doc-part":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-preface":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-prologue":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-pullquote":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author"]},"doc-qna":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-subtitle":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author","contents"]},"doc-tip":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author"]},"doc-toc":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},document:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},emphasis:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},feed:{container:null,props:null,reqProps:null,reqChildren:["article"],htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},figure:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},form:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"form",roleType:"landmark",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},generic:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"div | span",roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby","aria-roledescription"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},"graphics-document":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,nameRequired:!0,nameFrom:["author"]},"graphics-object":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,nameRequired:!1,nameFrom:["author"]},"graphics-symbol":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,nameRequired:!0,nameFrom:["author"],presentationalChildren:!0},grid:{container:null,props:["aria-activedescendant","aria-colcount","aria-multiselectable","aria-readonly","aria-rowcount"],reqProps:null,reqChildren:["row","rowgroup"],htmlEquiv:"table",roleType:"widget",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},gridcell:{container:["row"],props:["aria-colindex","aria-colspan","aria-disabled","aria-errormessage","aria-expanded","aria-haspopup","aria-invalid","aria-readonly","aria-required","aria-rowindex","aria-rowspan","aria-selected"],reqProps:null,reqChildren:null,htmlEquiv:"td",roleType:"widget",nameFrom:["author","contents"]},group:{container:null,props:["aria-activedescendant"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},heading:{container:null,props:null,reqProps:["aria-level"],reqChildren:null,htmlEquiv:"h1 | h2 | h3 | h4 | h5 | h6",roleType:"structure",nameRequired:!0,nameFrom:["author","contents"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},img:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"img",roleType:"structure",nameRequired:!0,nameFrom:["author"],presentationalChildren:!0,deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},image:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"img",roleType:"structure",nameRequired:!0,nameFrom:["author"],presentationalChildren:!0,deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},insertion:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},link:{container:null,props:["aria-expanded"],reqProps:null,reqChildren:null,htmlEquiv:"a | link",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],deprecatedProps:["aria-errormessage","aria-invalid"]},list:{container:null,props:null,reqProps:null,reqChildren:["listitem"],htmlEquiv:"ol | ul",roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},listbox:{container:null,props:["aria-activedescendant","aria-expanded","aria-multiselectable","aria-orientation","aria-readonly","aria-required"],reqProps:null,reqChildren:["group","option"],htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-haspopup"]},listitem:{container:["list"],props:["aria-level","aria-posinset","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:"li",roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},log:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"liveRegion",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},main:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},mark:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"mark",roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},marquee:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"liveRegion",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},math:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],presentationalChildren:!1,deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},menu:{container:null,props:["aria-activedescendant","aria-orientation"],reqProps:null,reqChildren:["group","menuitem","menuitemcheckbox","menuitemradio"],htmlEquiv:null,roleType:"widget",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},menubar:{container:null,props:["aria-activedescendant","aria-orientation"],reqProps:null,reqChildren:["group","menuitem","menuitemcheckbox","menuitemradio"],htmlEquiv:null,roleType:"widget",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},menuitem:{container:["group","menu","menubar"],props:["aria-expanded","aria-posinset","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],deprecatedProps:["aria-errormessage","aria-invalid"]},menuitemcheckbox:{container:["group","menu","menubar"],props:["aria-expanded","aria-posinset","aria-setsize"],reqProps:["aria-checked"],reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-invalid"]},menuitemradio:{container:["group","menu","menubar"],props:["aria-expanded","aria-posinset","aria-setsize"],reqProps:["aria-checked"],reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-invalid"]},meter:{container:null,props:["aria-valuemax","aria-valuemin","aria-valuetext"],reqProps:["aria-valuenow"],reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!0,nameFrom:["author"],presentationalChildren:!0,deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},navigation:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},none:{container:null,props:[],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},note:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},option:{container:["group","listbox"],props:["aria-selected","aria-checked","aria-posinset","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:"option",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},paragraph:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},presentation:{container:null,props:[],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},progressbar:{container:null,props:["aria-valuemax","aria-valuemin","aria-valuenow","aria-valuetext"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],presentationalChildren:!0,deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},radio:{container:null,props:["aria-posinset","aria-setsize"],reqProps:["aria-checked"],reqChildren:null,htmlEquiv:"input[@type='radio']",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},radiogroup:{container:null,props:["aria-activedescendant","aria-orientation","aria-readonly","aria-required"],reqProps:null,reqChildren:["radio"],htmlEquiv:null,roleType:"widget",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-haspopup"]},region:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},row:{container:["grid","rowgroup","table","treegrid"],props:["aria-activedescendant","aria-colindex","aria-expanded","aria-level","aria-posinset","aria-rowindex","aria-selected","aria-setsize"],reqProps:null,reqChildren:["cell","columnheader","gridcell","rowheader"],htmlEquiv:"tr",roleType:"structure",nameFrom:["author","contents"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},rowgroup:{container:["grid","table","treegrid"],props:[],reqProps:null,reqChildren:["row"],htmlEquiv:"tbody | tfoot | thead",roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},rowheader:{container:["row"],props:["aria-colindex","aria-colspan","aria-expanded","aria-readonly","aria-required","aria-rowindex","aria-rowspan","aria-selected","aria-sort"],reqProps:null,reqChildren:null,htmlEquiv:"th[@scope='row']",roleType:"structure",nameRequired:!0,nameFrom:["author","contents"]},scrollbar:{container:null,props:["aria-orientation","aria-valuemax","aria-valuemin","aria-valuetext"],reqProps:["aria-controls","aria-valuenow"],reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!1,nameFrom:["author"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},search:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},searchbox:{container:null,props:["aria-activedescendant","aria-autocomplete","aria-multiline","aria-placeholder","aria-readonly","aria-required"],reqProps:null,reqChildren:null,htmlEquiv:"input[@type='search']",roleType:"widget",nameRequired:!0,nameFrom:["author"]},separator:{container:null,props:["aria-orientation"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},slider:{container:null,props:["aria-orientation","aria-readonly","aria-valuemax","aria-valuemin","aria-valuetext"],reqProps:["aria-valuenow"],reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],presentationalChildren:!0},spinbutton:{container:null,props:["aria-activedescendant","aria-readonly","aria-required","aria-valuemax","aria-valuemin","aria-valuenow","aria-valuetext"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-haspopup"]},status:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"liveRegion",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},strong:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},subscript:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},suggestion:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},superscript:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},switch:{container:null,props:["aria-expanded","aria-readonly","aria-required"],reqProps:["aria-checked"],reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-haspopup"]},tab:{container:["tablist"],props:["aria-expanded","aria-posinset","aria-selected","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-invalid"]},table:{container:null,props:["aria-colcount","aria-rowcount"],reqProps:null,reqChildren:["row","rowgroup","caption"],htmlEquiv:"table",roleType:"structure",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},tablist:{container:null,props:["aria-activedescendant","aria-multiselectable","aria-orientation"],reqProps:null,reqChildren:["tab"],htmlEquiv:null,roleType:"widget",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},tabpanel:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},term:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"dfn",roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},textbox:{container:null,props:["aria-activedescendant","aria-autocomplete","aria-multiline","aria-placeholder","aria-readonly","aria-required"],reqProps:null,reqChildren:null,htmlEquiv:"input[@type='text']",roleType:"widget",nameRequired:!0,nameFrom:["author"]},time:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},timer:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"liveRegion",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},toolbar:{container:null,props:["aria-activedescendant","aria-orientation"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},tooltip:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author","contents"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},tree:{container:null,props:["aria-activedescendant","aria-multiselectable","aria-orientation","aria-required"],reqProps:null,reqChildren:["group","treeitem"],htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-haspopup"]},treegrid:{container:null,props:["aria-activedescendant","aria-colcount","aria-multiselectable","aria-orientation","aria-readonly","aria-required","aria-rowcount"],reqProps:null,reqChildren:["row","rowgroup"],htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-haspopup"]},treeitem:{container:["group","tree"],props:["aria-checked","aria-expanded","aria-level","aria-posinset","aria-selected","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],deprecatedProps:["aria-errormessage","aria-invalid"]}},e.elementsAllowedDisabled=["button","input","select","textarea","optgroup","option","fieldset"],e.elementsAllowedRequired=["select","textarea"],e.elementsAllowedReadOnly=["textarea"],e.documentConformanceRequirement={abbr:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},address:{implicitRole:["group"],validRoles:["any"],globalAriaAttributesValid:!0},article:{implicitRole:["article"],validRoles:["application","document","feed","main","none","presentation","region"],globalAriaAttributesValid:!0},aside:{implicitRole:["complementary"],validRoles:["doc-dedication","doc-example","doc-footnote","doc-glossary","doc-pullquote","doc-tip","feed","none","note","presentation","region","search"],globalAriaAttributesValid:!0},audio:{implicitRole:null,validRoles:["application"],globalAriaAttributesValid:!0},b:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},base:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},bdi:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},bdo:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},blockquote:{implicitRole:["blockquote"],validRoles:["any"],globalAriaAttributesValid:!0},body:{implicitRole:["generic"],validRoles:null,otherDisallowedAriaAttributes:["aria-hidden"],globalAriaAttributesValid:!0},br:{implicitRole:null,validRoles:["none","presentation"],globalAriaAttributesValid:!1,otherAllowedAriaAttributes:["aria-hidden"]},button:{implicitRole:["button"],validRoles:["checkbox","combobox","gridcell","link","menuitem","menuitemcheckbox","menuitemradio","option","radio","separator","slider","switch","tab","treeitem"],globalAriaAttributesValid:!0},canvas:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0},caption:{implicitRole:["caption"],validRoles:null,globalAriaAttributesValid:!0,allowAttributesFromImplicitRole:!1},cite:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},code:{implicitRole:["code"],validRoles:["any"],globalAriaAttributesValid:!0},col:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},colgroup:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},data:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},datalist:{implicitRole:["listbox"],validRoles:null,globalAriaAttributesValid:!1,allowAttributesFromImplicitRole:!1},dd:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0},del:{implicitRole:["deletion"],validRoles:["any"],globalAriaAttributesValid:!0},details:{implicitRole:["group"],validRoles:null,globalAriaAttributesValid:!0},dfn:{implicitRole:["term"],validRoles:["any"],globalAriaAttributesValid:!0},dialog:{implicitRole:["dialog"],validRoles:["alertdialog"],globalAriaAttributesValid:!0},dl:{implicitRole:null,validRoles:["group","list","none","presentation"],globalAriaAttributesValid:!0},dt:{implicitRole:["term"],validRoles:["listitem"],globalAriaAttributesValid:!0},em:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0},embed:{implicitRole:null,validRoles:["application","document","img","none","presentation"],globalAriaAttributesValid:!0},fieldset:{implicitRole:["group"],validRoles:["none","presentation","radiogroup"],globalAriaAttributesValid:!0},figcaption:{implicitRole:null,validRoles:["group","none","presentation"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},form:{implicitRole:["form"],validRoles:["none","presentation","search"],globalAriaAttributesValid:!0},head:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},hgroup:{implicitRole:["group"],validRoles:["any"],globalAriaAttributesValid:!0},h1:{implicitRole:["heading"],validRoles:["doc-subtitle","none","presentation","tab"],globalAriaAttributesValid:!0},h2:{implicitRole:["heading"],validRoles:["doc-subtitle","none","presentation","tab"],globalAriaAttributesValid:!0},h3:{implicitRole:["heading"],validRoles:["doc-subtitle","none","presentation","tab"],globalAriaAttributesValid:!0},h4:{implicitRole:["heading"],validRoles:["doc-subtitle","none","presentation","tab"],globalAriaAttributesValid:!0},h5:{implicitRole:["heading"],validRoles:["doc-subtitle","none","presentation","tab"],globalAriaAttributesValid:!0},h6:{implicitRole:["heading"],validRoles:["doc-subtitle","none","presentation","tab"],globalAriaAttributesValid:!0},hr:{implicitRole:["separator"],validRoles:["doc-pagebreak","none","presentation"],globalAriaAttributesValid:!0},html:{implicitRole:["document"],validRoles:null,globalAriaAttributesValid:!1,allowAttributesFromImplicitRole:!1},i:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},iframe:{implicitRole:null,validRoles:["application","document","img","none","presentation"],globalAriaAttributesValid:!0},ins:{implicitRole:["insertion"],validRoles:["any"],globalAriaAttributesValid:!0},kbd:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},label:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},legend:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},link:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},main:{implicitRole:["main"],validRoles:null,globalAriaAttributesValid:!0},map:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},mark:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},math:{implicitRole:["math"],validRoles:null,globalAriaAttributesValid:!0},menu:{implicitRole:["list"],validRoles:["group","listbox","menu","menubar","none","presentation","radiogroup","tablist","toolbar","tree"],globalAriaAttributesValid:!0},meta:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},meter:{implicitRole:["meter"],validRoles:null,globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-valuemax","aria-valuemin"],allowAttributesFromImplicitRole:!1},nav:{implicitRole:["navigation"],validRoles:["doc-index","doc-pagelist","doc-toc","menu","menubar","tablist","none","presentation"],globalAriaAttributesValid:!0},noscript:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},object:{implicitRole:null,validRoles:["application","document","img"],globalAriaAttributesValid:!0},ol:{implicitRole:["list"],validRoles:["group","listbox","menu","menubar","none","presentation","radiogroup","tablist","toolbar","tree"],globalAriaAttributesValid:!0},optgroup:{implicitRole:["group"],validRoles:null,globalAriaAttributesValid:!0},option:{implicitRole:["option"],validRoles:null,globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-selected"]},output:{implicitRole:["status"],validRoles:["any"],globalAriaAttributesValid:!0},p:{implicitRole:["paragraph"],validRoles:["any"],globalAriaAttributesValid:!0},param:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},picture:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1,otherAllowedAriaAttributes:["aria-hidden"]},pre:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},progress:{implicitRole:["progressbar"],validRoles:null,globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-valuemax"]},q:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},rp:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0},rt:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},ruby:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0},s:{implicitRole:["deletion"],validRoles:["any"],globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-label","aria-labelledby"]},samp:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},script:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},search:{implicitRole:["search"],validRoles:["search","form","group","none","presentation","region"],globalAriaAttributesValid:!0},slot:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},small:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},source:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},span:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},strong:{implicitRole:["strong"],validRoles:["any"],globalAriaAttributesValid:!0},style:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},sub:{implicitRole:["subscript"],validRoles:["any"],globalAriaAttributesValid:!0},sup:{implicitRole:["superscript"],validRoles:["any"],globalAriaAttributesValid:!0},svg:{implicitRole:["graphics-document"],validRoles:["any"],globalAriaAttributesValid:!0},table:{implicitRole:["table"],validRoles:["any"],globalAriaAttributesValid:!0},template:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},textarea:{implicitRole:["textbox"],validRoles:null,globalAriaAttributesValid:!0},tfoot:{implicitRole:["rowgroup"],validRoles:["any"],globalAriaAttributesValid:!0},thead:{implicitRole:["rowgroup"],validRoles:["any"],globalAriaAttributesValid:!0},time:{implicitRole:["time"],validRoles:["any"],globalAriaAttributesValid:!0},title:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},track:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},u:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},ul:{implicitRole:["list"],validRoles:["group","listbox","menu","menubar","none","presentation","radiogroup","tablist","toolbar","tree"],globalAriaAttributesValid:!0},var:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},video:{implicitRole:null,validRoles:["application"],globalAriaAttributesValid:!0},wbr:{implicitRole:null,validRoles:["none","presentation"],globalAriaAttributesValid:!1,otherAllowedAriaAttributes:["aria-hidden"]}},e.documentConformanceRequirementSpecialTags={a:{"with-href":{implicitRole:["link"],validRoles:["button","checkbox","doc-backlink","doc-biblioref","doc-glossref","doc-noteref","menuitem","menuitemcheckbox","menuitemradio","option","radio","switch","tab","treeitem"],globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-disabled=true"]},"without-href":{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0}},area:{"with-href":{implicitRole:["link"],validRoles:null,globalAriaAttributesValid:!0},"without-href":{implicitRole:["generic"],validRoles:["button","link"],globalAriaAttributesValid:!0}},div:{"child-dl":{implicitRole:["generic"],validRoles:["presentation","none"],globalAriaAttributesValid:!0},"no-child-dl":{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0}},figure:{"child-figcaption":{implicitRole:["figure"],validRoles:["doc-example"],globalAriaAttributesValid:!0},"no-child-figcaption":{implicitRole:["figure"],validRoles:["any"],globalAriaAttributesValid:!0}},footer:{"des-section-article-aside-main-nav":{implicitRole:["generic"],validRoles:["doc-footnote","group","none","presentation"],globalAriaAttributesValid:!0},other:{implicitRole:["contentinfo"],validRoles:["doc-footnote","group","none","presentation"],globalAriaAttributesValid:!0}},header:{"des-section-article-aside-main-nav":{implicitRole:["generic"],validRoles:["group","none","presentation"],globalAriaAttributesValid:!0},other:{implicitRole:["banner"],validRoles:["group","none","presentation"],globalAriaAttributesValid:!0}},img:{"img-with-accname":{implicitRole:["img"],validRoles:["button","checkbox","doc-cover","link","menuitem","menuitemcheckbox","menuitemradio","meter","option","progressbar","radio","scrollbar","separator","slider","switch","tab","treeitem"],globalAriaAttributesValid:!0},"img-without-accname-empty-alt":{implicitRole:["presentation","none"],validRoles:null,globalAriaAttributesValid:!1,otherAllowedAriaAttributes:["aria-hidden=true"]},"img-without-accname-no-alt":{implicitRole:["img"],validRoles:["presentation","none"],globalAriaAttributesValid:!1,otherAllowedAriaAttributes:["aria-hidden=true"]}},input:{button:{implicitRole:["button"],validRoles:["checkbox","combobox","gridcell","link","menuitem","menuitemcheckbox","menuitemradio","option","radio","slider","switch","tab","treeitem"],globalAriaAttributesValid:!0},"checkbox-with-aria-pressed":{implicitRole:["checkbox"],validRoles:["menuitemcheckbox","option","switch","button"],globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-required"],otherDisallowedAriaAttributes:["aria-checked"]},"checkbox-without-aria-pressed":{implicitRole:["checkbox"],validRoles:["menuitemcheckbox","option","switch"],globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-required"],otherDisallowedAriaAttributes:["aria-checked"]},color:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0},date:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-required","aria-readonly"],otherRolesForAttributes:["textbox"]},"datetime-local":{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-required","aria-readonly"],otherRolesForAttributes:["textbox"]},"email-no-list":{implicitRole:["textbox"],validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"],otherRolesForAttributes:["textbox"]},"email-with-list":{implicitRole:["combobox"],validRoles:null,globalAriaAttributesValid:!0},file:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-required"]},hidden:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},image:{implicitRole:["button"],validRoles:["checkbox","gridcell","link","menuitem","menuitemcheckbox","menuitemradio","option","radio","slider","switch","tab","treeitem"],globalAriaAttributesValid:!0},month:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-readonly"],otherRolesForAttributes:["textbox"]},number:{implicitRole:["spinbutton"],validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"]},password:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"],otherRolesForAttributes:["textbox"]},radio:{implicitRole:["radio"],validRoles:["menuitemradio"],globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-required"],otherDisallowedAriaAttributes:["aria-checked"]},range:{implicitRole:["slider"],validRoles:null,globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-valuemax","aria-valuemin"]},reset:{implicitRole:["button"],validRoles:["checkbox","combobox","gridcell","link","menuitem","menuitemcheckbox","menuitemradio","option","radio","slider","switch","tab","treeitem"],globalAriaAttributesValid:!0},"search-no-list":{implicitRole:["searchbox"],validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"]},"search-with-list":{implicitRole:["combobox"],validRoles:null,globalAriaAttributesValid:!0},submit:{implicitRole:["button"],validRoles:["checkbox","combobox","gridcell","link","menuitem","menuitemcheckbox","menuitemradio","option","radio","slider","switch","tab","treeitem"],globalAriaAttributesValid:!0},"tel-no-list":{implicitRole:["textbox"],validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"]},"tel-with-list":{implicitRole:["combobox"],validRoles:null,globalAriaAttributesValid:!0},"text-no-list":{implicitRole:["textbox"],validRoles:["combobox","searchbox","spinbutton"],globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"]},"text-with-list":{implicitRole:["combobox"],validRoles:null,globalAriaAttributesValid:!0},time:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-readonly"],otherRolesForAttributes:["textbox"]},"url-no-list":{implicitRole:["textbox"],validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"]},"url-with-list":{implicitRole:["combobox"],validRoles:null,globalAriaAttributesValid:!0},week:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-readonly"],otherRolesForAttributes:["textbox"]},"default-with-list":{implicitRole:["combobox"],validRoles:null,globalAriaAttributesValid:!0},"default-no-list":{implicitRole:["textbox"],validRoles:null,globalAriaAttributesValid:!0}},li:{"child-of-list-role":{implicitRole:["listitem"],validRoles:null,globalAriaAttributesValid:!0},"no-child-of-list-role":{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0}},section:{"with-name":{implicitRole:["region"],validRoles:["alert","alertdialog","application","banner","complementary","contentinfo","dialog","doc-abstract","doc-acknowledgments","doc-afterword","doc-appendix","doc-bibliography","doc-chapter","doc-colophon","doc-conclusion","doc-credit","doc-credits","doc-dedication","doc-endnotes","doc-epigraph","doc-epilogue","doc-errata","doc-example","doc-foreword","doc-glossary","doc-index","doc-introduction","doc-notice","doc-pagelist","doc-part","doc-preface","doc-prologue","doc-pullquote","doc-qna","doc-toc","document","feed","group","log","main","marquee","navigation","none","note","presentation","search","status","tabpanel"],globalAriaAttributesValid:!0},"without-name":{implicitRole:null,validRoles:["alert","alertdialog","application","banner","complementary","contentinfo","dialog","doc-abstract","doc-acknowledgments","doc-afterword","doc-appendix","doc-bibliography","doc-chapter","doc-colophon","doc-conclusion","doc-credit","doc-credits","doc-dedication","doc-endnotes","doc-epigraph","doc-epilogue","doc-errata","doc-example","doc-foreword","doc-glossary","doc-index","doc-introduction","doc-notice","doc-pagelist","doc-part","doc-preface","doc-prologue","doc-pullquote","doc-qna","doc-toc","document","feed","group","log","main","marquee","navigation","none","note","presentation","search","status","tabpanel"],globalAriaAttributesValid:!0}},select:{"no-multiple-attr-size-gt1":{implicitRole:["combobox"],validRoles:["menu"],globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-multiselectable"]},"multiple-attr-size-gt1":{implicitRole:["listbox"],validRoles:null,globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-multiselectable"]}},summary:{"first-summary-of-detail":{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-disabled","aria-haspopup"]},"no-first-summary-of-detail":{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0}},tbody:{"des-table":{implicitRole:["rowgroup"],validRoles:["any"],globalAriaAttributesValid:!0},"des-grid":{implicitRole:["rowgroup"],validRoles:["any"],globalAriaAttributesValid:!0},"des-treegrid":{implicitRole:["rowgroup"],validRoles:["any"],globalAriaAttributesValid:!0},"des-other":{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0}},td:{"des-table":{implicitRole:["cell"],validRoles:null,globalAriaAttributesValid:!0},"des-grid":{implicitRole:["gridcell"],validRoles:null,globalAriaAttributesValid:!0},"des-treegrid":{implicitRole:["gridcell"],validRoles:null,globalAriaAttributesValid:!0},"des-other":{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0}},th:{"des-table-row-scope":{implicitRole:["rowheader","cell"],validRoles:null,globalAriaAttributesValid:!0},"des-table-column-scope":{implicitRole:["columnheader","cell"],validRoles:null,globalAriaAttributesValid:!0},"des-grid-treegrid-row-scope":{implicitRole:["rowheader","gridcell"],validRoles:null,globalAriaAttributesValid:!0},"des-grid-treegrid-column-scope":{implicitRole:["columnheader","gridcell"],validRoles:null,globalAriaAttributesValid:!0},"des-other":{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0}},tr:{"des-table":{implicitRole:["row"],validRoles:null,globalAriaAttributesValid:!0},"des-grid":{implicitRole:["row"],validRoles:null,globalAriaAttributesValid:!0},"des-treegrid":{implicitRole:["row"],validRoles:null,globalAriaAttributesValid:!0},"des-other":{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0}},default:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0}},e.relatedAriaHtmlAttributes={"aria-checked":{conflict:[{ariaAttributeValue:"false",htmlAttributeNames:["checked"],htmlAttributeValues:null}],overlapping:[{ariaAttributeValue:"true",htmlAttributeNames:["checked"],htmlAttributeValues:null}]},"aria-disabled":{conflict:[{ariaAttributeValue:"false",htmlAttributeNames:["disabled"],htmlAttributeValues:null}],overlapping:[{ariaAttributeValue:"true",htmlAttributeNames:["disabled"],htmlAttributeValues:null}]},"aria-hidden":{conflict:[{ariaAttributeValue:"false",htmlAttributeNames:["hidden"],htmlAttributeValues:["hidden,null"]},{ariaAttributeValue:"true",htmlAttributeNames:["hidden"],htmlAttributeValues:["until-found"]}],overlapping:[{ariaAttributeValue:"true",htmlAttributeNames:["hidden"],htmlAttributeValues:["hidden,null"]}]},"aria-placeholder":{conflict:[{ariaAttributeValue:null,htmlAttributeNames:["placeholder"],htmlAttributeValues:null}]},"aria-valuemax":{conflict:[{ariaAttributeValue:null,htmlAttributeNames:["max"],htmlAttributeValues:null}]},"aria-valuemin":{conflict:[{ariaAttributeValue:null,htmlAttributeNames:["min"],htmlAttributeValues:null}]},"aria-readonly":{conflict:[{ariaAttributeValue:"false",htmlAttributeNames:["readonly","contenteditable","iscontenteditable"],htmlAttributeValues:[null,"false","false"]}],overlapping:[{ariaAttributeValue:"true",htmlAttributeNames:["readonly","contenteditable","iscontenteditable"],htmlAttributeValues:[null,"true","true"]}]},"aria-required":{conflict:[{ariaAttributeValue:"false",htmlAttributeNames:["required"],htmlAttributeValues:null}],overlapping:[{ariaAttributeValue:"true",htmlAttributeNames:["required"],htmlAttributeValues:null}]},"aria-colspan":{conflict:[{ariaAttributeValue:"VALUE",htmlAttributeNames:["colspan"],htmlAttributeValues:["VALUE"]}],overlapping:[{ariaAttributeValue:null,htmlAttributeNames:["colspan"],htmlAttributeValues:null}]},"aria-rowspan":{conflict:[{ariaAttributeValue:"VALUE",htmlAttributeNames:["rowspan"],htmlAttributeValues:["VALUE"]}],overlapping:[{ariaAttributeValue:null,htmlAttributeNames:["rowspan"],htmlAttributeValues:null}]}},e.containers=[],e}();t.ARIADefinitions=i;var a=[];for(var n in i.designPatterns){var l=i.designPatterns[n].container;if(null!==l)for(var r=0,o=l;r<o.length;r++){var s=o[r];-1==a.indexOf(s)&&a.push(s)}}i.containers=a},9955(e,t,i){var a,n=this&&this.__extends||(a=function(e,t){return a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i])},a(e,t)},function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function i(){this.constructor=e}a(e,t),e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)});Object.defineProperty(t,"__esModule",{value:!0}),t.ARIAMapper=void 0;var l=i(9910),r=i(3103),o=i(1686),s=i(7139),u=i(7011),d=i(5279),c=i(1560),m=i(4566),p=i(3864),h=i(1950),g=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.childrenCanHaveRole=function(e,t){return!(t in l.ARIADefinitions.designPatterns&&l.ARIADefinitions.designPatterns[t].presentationalChildren)},t.prototype.getRole=function(e){return t.nodeToRole(e)},t.prototype.getNamespace=function(){return"aria"},t.prototype.getAttributes=function(e){var i={};if(1===e.nodeType){var a=m.CacheUtil.getCache(e,"ARIAMapper::getAttributes",void 0);if(void 0!==a)return a;for(var n=e,l=0;l<n.attributes.length;++l){var r=n.attributes[l],o=r.name.toLowerCase();o.startsWith("aria-")&&(i[o.substring(5)]=r.nodeValue)}var s=e.nodeName.toLowerCase();t.applyAttrRole(n,"global",i),t.applyAttrRole(n,s,i),m.CacheUtil.setCache(e,"ARIAMapper::getAttributes",i)}else if(3===e.nodeType){var u=t.textAttrValueCalculators;for(var d in u){var c=u[d](e);null!=c&&(i[d]=c)}}return i},t.applyAttrRole=function(e,i,a){var n=t.elemAttrValueCalculators;if(i in n)for(var l in n[i])if(!(l in a)){var r=n[i][l];null!=r&&("string"!=typeof r&&(r=r(e)),a[l]=r)}},t.getAriaOwnedBy=function(e){var t=d.FragmentUtil.getOwnerFragment(e);if(!m.CacheUtil.getCache(t,"ARIAMapper::precalcOwned",!1)){for(var i=t.querySelectorAll("[aria-owns]"),a=0;a<i.length;++a)for(var n=i[a],l=n.getAttribute("aria-owns").split(/ +/g),r=function(e){var i=t.getElementById(l[e]);if(i&&!o.DOMUtil.sameNode(n,i)){for(var a=[],r=i.querySelectorAll("[aria-owns]"),s=0;s<r.length;++s)for(var u=r[s].getAttribute("aria-owns").split(/ +/g),d=0;d<u.length;++d){var c=t.getElementById(u[d]);c&&a.push(c)}if(0===a.length)return m.CacheUtil.setCache(i,"aria-owned",n),"continue";for(var h=n,g=!1;null!==h;){if(a.some(function(e){return o.DOMUtil.sameNode(h,e)})){g=!0;break}h=p.DOMWalker.parentElement(h)}g||m.CacheUtil.setCache(i,"aria-owned",n)}},s=0;s<l.length;++s)r(s);m.CacheUtil.setCache(t,"ARIAMapper::precalcOwned",!0)}return m.CacheUtil.getCache(e,"aria-owned",null)},t.prototype.getNodeHierarchy=function(e){if(!e)return[];if(1!==e.nodeType){for(var i=(s=this.getNodeHierarchy(p.DOMWalker.parentElement(e))).length>0?s[s.length-1]:{role:"",rolePath:"",roleCount:{},childrenCanHaveRole:!0},a=[],n=0,l=s;n<l.length;n++){var r=l[n];a.push(r)}return a.push({attributes:{},bounds:this.getBounds(e),namespace:this.getNamespace(),node:e,role:this.getRole(e)||null,rolePath:i.rolePath+"/"+(this.getRole(e)||null),roleCount:{},childrenCanHaveRole:i.childrenCanHaveRole}),a}var o=e;if(!(a=m.CacheUtil.getCache(o,"ARIAMapper::getNodeHierarchy",null))){var s,u=t.getAriaOwnedBy(o);for(u||(u=p.DOMWalker.parentElement(o));u&&1!==u.nodeType;)u=p.DOMWalker.parentElement(o);for(i=(s=u?this.getNodeHierarchy(u):[]).length>0?s[s.length-1]:{role:"",rolePath:"",roleCount:{},childrenCanHaveRole:!0};null===i.role;)i=(s=(u=t.getAriaOwnedBy(u)||p.DOMWalker.parentElement(u))?this.getNodeHierarchy(u):[])[s.length-1];var d={attributes:1===o.nodeType?this.getAttributes(o):{},bounds:this.getBounds(o),namespace:this.getNamespace(),node:o,role:this.getRole(o)||null,rolePath:"",roleCount:{},childrenCanHaveRole:!0};i.childrenCanHaveRole?d.childrenCanHaveRole=i.childrenCanHaveRole&&this.childrenCanHaveRole(o,d.role):d.role=null,null!==d.role?(i.roleCount[d.role]=(i.roleCount[d.role]||0)+1,d.rolePath=i.rolePath+"/"+d.role+"["+i.roleCount[d.role]+"]"):d.rolePath=i.rolePath,a=[];for(var c=0,h=s;c<h.length;c++)r=h[c],a.push(r);a.push(d),m.CacheUtil.setCache(o,"ARIAMapper::getNodeHierarchy",a)}return a},t.prototype.reset=function(e){t.nameComputationId=0,this.hierarchyRole=[],this.hierarchyResults=[],this.hierarchyPath=[{rolePath:"",roleCount:{}}];for(var i,a=e;i=p.DOMWalker.parentNode(a);)a=i;var n=new c.ARIAWalker(a,!1,a);do{1===n.node.nodeType&&this.getNodeHierarchy(n.node)}while(n.nextNode())},t.prototype.openScope=function(e){null===this.hierarchyRole&&this.reset(e),this.pushHierarchy(e);for(var t=0;t<this.hierarchyResults.length;++t)this.hierarchyResults[t].role&&"/"===this.hierarchyResults[t].role[0]&&(this.hierarchyResults[t].role=this.hierarchyResults[t].role?this.hierarchyResults[t].role.substring(1):null);return this.hierarchyResults},t.prototype.pushHierarchy=function(e){var t,i=(t=this.getNodeHierarchy(e))[t.length-1];this.hierarchyRole.push(i.role),null!==i.role&&this.hierarchyPath.push(i),this.hierarchyResults=t},t.prototype.closeScope=function(e){for(var t=[],i=0,a=this.hierarchyResults;i<a.length;i++){var n=a[i];t.push(n)}if(t.length>0){t[t.length-1].role="/"+t[t.length-1].role;var l=p.DOMWalker.parentElement(e);this.hierarchyResults=l?m.CacheUtil.getCache(l,"ARIAMapper::getNodeInfo",[]):[]}return t},t.nodeToRole=function(e){if(3===e.nodeType)return"text";if(1!==e.nodeType)return null;var t=e;if(!t||1!==t.nodeType)return null;if(t.hasAttribute("role")&&t.getAttribute("role").trim().length>0)for(var i=0,a=t.getAttribute("role").trim().split(" ");i<a.length;i++){var n=a[i];if("presentation"===n||"none"===n){if(!s.CommonUtil.isFocusable(t))return null}else if(n in l.ARIADefinitions.designPatterns)return n}var r=u.AriaUtil.getImplicitRole(t),o=r&&0!==r.length?r[0]:null;return"presentation"===o||"none"===o?null:o},t.elemAttrValueCalculators={global:{name:function(e){var t;return null===(t=h.AccNameUtil.computeAccessibleName(e))||void 0===t?void 0:t.name}},datalist:{multiselectable:function(e){var t=e.getAttribute("id");return t&&t.length>0?(e.ownerDocument.querySelector("input[list='"+t+"']"),""+(e.getAttribute("multiple")&&("true"==e.getAttribute("multiple")||""==e.getAttribute("multiple")))):null}},h1:{level:"1"},h2:{level:"2"},h3:{level:"3"},h4:{level:"4"},h5:{level:"5"},h6:{level:"6"},input:{checked:function(e){var t=e.getAttribute("type");return"checkbox"===t||"radio"===t?""+e.checked:null},setsize:function(e){return null},posinset:function(e){return null},owns:function(e){return null}},keygen:{multiselectable:"false"},li:{setsize:function(e){var t=o.DOMUtil.getAncestor(e,["ol","ul","menu"]);if(!t)return null;var i=m.CacheUtil.getSetCache(t,"elemAttrValueCalculators::lis",function(){return t.querySelectorAll("li")}),a=m.CacheUtil.getSetCache(t,"elemAttrValueCalculators::otherlis",function(){return t.querySelectorAll("ol li, ul li, menu li")});return""+(i.length-a.length)},posinset:function(e){var t=o.DOMUtil.getAncestor(e,["ol","ul","menu"]);if(!t)return null;for(var i=m.CacheUtil.getSetCache(t,"elemAttrValueCalculators::lis",function(){return t.querySelectorAll("li")}),a=0,n=0;n<i.length;++n){var l=i[n];if(o.DOMUtil.sameNode(t,o.DOMUtil.getAncestor(l,["ol","ul","menu"])))return""+a;++a}return null}},menuitem:{checked:function(e){return""+!(!e.getAttribute("checked")||"true"!=e.getAttribute("checked")&&""!=e.getAttribute("checked"))}},option:{selected:function(e){return""+!(!e.getAttribute("selected")||"true"!=e.getAttribute("selected")&&""!=e.getAttribute("selected"))}},progress:{valuemax:function(e){return e.getAttribute("max")||"1"},valuemin:function(e){return"0"},valuenow:function(e){return e.getAttribute("value")}}},t.textAttrValueCalculators={name:function(e){return e.nodeValue}},t.nameComputationId=0,t}(r.CommonMapper);t.ARIAMapper=g},1560(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.ARIAWalker=void 0;var a=i(5279),n=i(9955),l=i(3946),r=i(3864),o=function(){function e(e,t,i){this.root=i||e,9===this.root.nodeType&&(this.root=this.root.documentElement),this.node=e,this.bEndTag=null!=t&&1==t}return e.prototype.atRoot=function(){return!this.ownerElement&&(this.root===this.node||(this.root.isSameNode?this.root.isSameNode(this.node):this.root.compareDocumentPosition?0===this.root.compareDocumentPosition(this.node):null===this.node.parentNode))},e.prototype.nextNode=function(){var e=!1;do{if(e=!1,this.bEndTag){if(this.atRoot())return!1;if(this.node.slotOwner){var t=this.node.slotOwner,i=this.node.slotIndex+1;i<t.assignedNodes().length?(this.node=t.assignedNodes()[i],this.bEndTag=!1):(this.node=t,this.bEndTag=!0)}else if(this.node.ownerElement)this.node=this.node.ownerElement,this.bEndTag=!0;else if(r.DOMWalker.nextSiblingNotOwnedBySlot(this.node))this.node=r.DOMWalker.nextSiblingNotOwnedBySlot(this.node),this.bEndTag=!1,e=!0;else{if(!this.node.parentNode)return!1;if(1===this.node.parentNode.nodeType&&this.node.parentNode.hasAttribute("aria-owns")){var o=this.node.parentNode.getAttribute("aria-owns").split(/ +/g);if(1===this.node.nodeType&&this.node.hasAttribute("id")){var s=o.indexOf(this.node.getAttribute("id"));s===o.length-1?(this.node=this.node.parentNode,this.bEndTag=!0):(this.node=a.FragmentUtil.getOwnerFragment(this.node).getElementById(o[s+1]),this.bEndTag=!1)}else this.node=a.FragmentUtil.getOwnerFragment(this.node).getElementById(o[0]),this.bEndTag=!1}this.node=this.node.parentNode,this.bEndTag=!0}}else{var u=this.node,d=this.node,c=this.node;if(1===this.node.nodeType&&"IFRAME"===this.node.nodeName.toUpperCase()&&l.VisUtil.isNodeVisible(u)&&u.contentDocument&&u.contentDocument.documentElement){var m=this.node;this.node=u.contentDocument.documentElement,this.node.ownerElement=m}else 1===this.node.nodeType&&l.VisUtil.isNodeVisible(d)&&d.shadowRoot&&d.shadowRoot.firstChild?(m=this.node,this.node=d.shadowRoot,this.node.ownerElement=m,r.DOMWalker.assignSlots(this.node)):1===this.node.nodeType&&"slot"===d.nodeName.toLowerCase()&&c.assignedNodes().length>0?this.node=c.assignedNodes()[0]:1!==this.node.nodeType&&11!==this.node.nodeType||!r.DOMWalker.firstChildNotOwnedBySlot(this.node)?this.bEndTag=!0:this.node=r.DOMWalker.firstChildNotOwnedBySlot(this.node)}}while(1!==this.node.nodeType&&11!==this.node.nodeType&&3!==this.node.nodeType||1===this.node.nodeType&&"ACE"===this.node.getAttribute("aChecker")||e&&1===this.node.nodeType&&n.ARIAMapper.getAriaOwnedBy(this.node));return!0},e.prototype.prevNode=function(){var e=!1;do{if(e=!1,this.bEndTag){var t=this.node,i=this.node;if(1===this.node.nodeType&&"IFRAME"===this.node.nodeName.toUpperCase()&&l.VisUtil.isNodeVisible(t)&&t.contentDocument&&t.contentDocument.documentElement){var o=this.node;this.node=t.contentDocument.documentElement,this.node.ownerElement=o}else 1===this.node.nodeType&&l.VisUtil.isNodeVisible(i)&&i.shadowRoot&&i.shadowRoot.lastChild?(o=this.node,this.node=i.shadowRoot,this.node.ownerElement=o,r.DOMWalker.assignSlots(this.node)):1!==this.node.nodeType&&11!==this.node.nodeType||!r.DOMWalker.lastChildNotOwnedBySlot(this.node)?this.bEndTag=!1:this.node=r.DOMWalker.lastChildNotOwnedBySlot(this.node)}else{if(this.atRoot())return!1;if(r.DOMWalker.previousSiblingNotOwnedBySlot(this.node))this.node=r.DOMWalker.previousSiblingNotOwnedBySlot(this.node),this.bEndTag=!0;else if(this.node.ownerElement)this.node=this.node.ownerElement,this.bEndTag=!1,e=!0;else{if(!this.node.parentNode)return!1;if(1===this.node.parentNode.nodeType&&this.node.parentNode.hasAttribute("aria-owns")){var s=this.node.parentNode.getAttribute("aria-owns").split(/ +/g);if(1===this.node.nodeType&&this.node.hasAttribute("id")){var u=s.indexOf(this.node.getAttribute("id"));u===s.length-1?(this.node=this.node.parentNode,this.bEndTag=!0):(this.node=a.FragmentUtil.getOwnerFragment(this.node).getElementById(s[u+1]),this.bEndTag=!1)}else this.node=a.FragmentUtil.getOwnerFragment(this.node).getElementById(s[0]),this.bEndTag=!1}this.node=this.node.parentNode,this.bEndTag=!1}}}while(1!==this.node.nodeType&&11!==this.node.nodeType||1===this.node.nodeType&&"ACE"===this.node.getAttribute("aChecker")||e&&1===this.node.nodeType&&n.ARIAMapper.getAriaOwnedBy(this.node));return!0},e}();t.ARIAWalker=o},6858(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.AncestorUtil=void 0;var i=function(){function e(){}return e.isPresentationFrame=function(e){if(e&&e.dom)for(var t=e.dom.length-2;t>=0;--t){var i=e.dom[t].node;if(1===i.nodeType&&"iframe"===i.nodeName.toLowerCase()&&("presentation"===i.getAttribute("role")||"true"===i.getAttribute("aria-hidden")))return!0}return!1},e.isFrame=function(e){if(e&&e.dom)for(var t=e.dom.length-2;t>=0;--t){var i=e.dom[t].node;if(1===i.nodeType&&"iframe"===i.nodeName.toLowerCase())return!0}return!1},e}();t.AncestorUtil=i},5279(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.FragmentUtil=void 0;var i=function(){function e(){}return e.getOwnerFragment=function(e){for(var t=e;t.parentNode&&(t=t.parentNode);)if(11===t.nodeType)return t;return e.ownerDocument},e.getById=function(e,t){return this.getOwnerFragment(e).getElementById(t)},e.getAncestor=function(e,t){var i=e.dom.filter(function(e){return e.role===t});return i.length>0&&i[0].node||null},e.getAncestorWithRole=function(e,t){var i=e.aria.filter(function(e){return e.role===t});return i.length>0&&i[0].node||null},e}();t.FragmentUtil=i},1043(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.LangUtil=void 0;var i=[["aa","ab","ae","af","ak","am","an","ar","as","av","ay","az","aaa","aab","aac","aad","aae","aaf","aag","aah","aai","aak","aal","aam","aan","aao","aap","aaq","aas","aat","aau","aav","aaw","aax","aaz","aba","abb","abc","abd","abe","abf","abg","abh","abi","abj","abl","abm","abn","abo","abp","abq","abr","abs","abt","abu","abv","abw","abx","aby","abz","aca","acb","acd","ace","acf","ach","aci","ack","acl","acm","acn","acp","acq","acr","acs","act","acu","acv","acw","acx","acy","acz","ada","adb","add","ade","adf","adg","adh","adi","adj","adl","adn","ado","adp","adq","adr","ads","adt","adu","adw","adx","ady","adz","aea","aeb","aec","aed","aee","aek","ael","aem","aen","aeq","aer","aes","aeu","aew","aey","aez","afa","afb","afd","afe","afg","afh","afi","afk","afn","afo","afp","afs","aft","afu","afz","aga","agb","agc","agd","age","agf","agg","agh","agi","agj","agk","agl","agm","agn","ago","agp","agq","agr","ags","agt","agu","agv","agw","agx","agy","agz","aha","ahb","ahg","ahh","ahi","ahk","ahl","ahm","ahn","aho","ahp","ahr","ahs","aht","aia","aib","aic","aid","aie","aif","aig","aih","aii","aij","aik","ail","aim","ain","aio","aip","aiq","air","ais","ait","aiw","aix","aiy","aja","ajg","aji","ajn","ajp","ajt","aju","ajw","ajz","akb","akc","akd","ake","akf","akg","akh","aki","akj","akk","akl","akm","ako","akp","akq","akr","aks","akt","aku","akv","akw","akx","aky","akz","ala","alc","ald","ale","alf","alg","alh","ali","alj","alk","all","alm","aln","alo","alp","alq","alr","als","alt","alu","alv","alw","alx","aly","alz","ama","amb","amc","ame","amf","amg","ami","amj","amk","aml","amm","amn","amo","amp","amq","amr","ams","amt","amu","amv","amw","amx","amy","amz","ana","anb","anc","and","ane","anf","ang","anh","ani","anj","ank","anl","anm","ann","ano","anp","anq","anr","ans","ant","anu","anv","anw","anx","any","anz","aoa","aob","aoc","aod","aoe","aof","aog","aoh","aoi","aoj","aok","aol","aom","aon","aor","aos","aot","aou","aox","aoz","apa","apb","apc","apd","ape","apf","apg","aph","api","apj","apk","apl","apm","apn","apo","app","apq","apr","aps","apt","apu","apv","apw","apx","apy","apz","aqa","aqc","aqd","aqg","aqk","aql","aqm","aqn","aqp","aqr","aqt","aqz","arb","arc","ard","are","arh","ari","arj","ark","arl","arn","aro","arp","arq","arr","ars","art","aru","arv","arw","arx","ary","arz","asa","asb","asc","asd","ase","asf","asg","ash","asi","asj","ask","asl","asn","aso","asp","asq","asr","ass","ast","asu","asv","asw","asx","asy","asz","ata","atb","atc","atd","ate","atg","ath","ati","atj","atk","atl","atm","atn","ato","atp","atq","atr","ats","att","atu","atv","atw","atx","aty","atz","aua","aub","auc","aud","aue","auf","aug","auh","aui","auj","auk","aul","aum","aun","auo","aup","auq","aur","aus","aut","auu","auw","aux","auy","auz","avb","avd","avi","avk","avl","avm","avn","avo","avs","avt","avu","avv","awa","awb","awc","awd","awe","awg","awh","awi","awk","awm","awn","awo","awr","aws","awt","awu","awv","aww","awx","awy","axb","axe","axg","axk","axl","axm","axx","aya","ayb","ayc","ayd","aye","ayg","ayh","ayi","ayk","ayl","ayn","ayo","ayp","ayq","ayr","ays","ayt","ayu","ayx","ayy","ayz","aza","azb","azc","azd","azg","azj","azm","azn","azo","azt","azz"],["ba","be","bg","bh","bi","bm","bn","bo","br","bs","baa","bab","bac","bad","bae","baf","bag","bah","bai","baj","bal","ban","bao","bap","bar","bas","bat","bau","bav","baw","bax","bay","baz","bba","bbb","bbc","bbd","bbe","bbf","bbg","bbh","bbi","bbj","bbk","bbl","bbm","bbn","bbo","bbp","bbq","bbr","bbs","bbt","bbu","bbv","bbw","bbx","bby","bbz","bca","bcb","bcc","bcd","bce","bcf","bcg","bch","bci","bcj","bck","bcl","bcm","bcn","bco","bcp","bcq","bcr","bcs","bct","bcu","bcv","bcw","bcy","bcz","bda","bdb","bdc","bdd","bde","bdf","bdg","bdh","bdi","bdj","bdk","bdl","bdm","bdn","bdo","bdp","bdq","bdr","bds","bdt","bdu","bdv","bdw","bdx","bdy","bdz","bea","beb","bec","bed","bee","bef","beg","beh","bei","bej","bek","bem","beo","bep","beq","ber","bes","bet","beu","bev","bew","bex","bey","bez","bfa","bfb","bfc","bfd","bfe","bff","bfg","bfh","bfi","bfj","bfk","bfl","bfm","bfn","bfo","bfp","bfq","bfr","bfs","bft","bfu","bfw","bfx","bfy","bfz","bga","bgb","bgc","bgd","bge","bgf","bgg","bgi","bgj","bgk","bgl","bgm","bgn","bgo","bgp","bgq","bgr","bgs","bgt","bgu","bgv","bgw","bgx","bgy","bgz","bha","bhb","bhc","bhd","bhe","bhf","bhg","bhh","bhi","bhj","bhk","bhl","bhm","bhn","bho","bhp","bhq","bhr","bhs","bht","bhu","bhv","bhw","bhx","bhy","bhz","bia","bib","bic","bid","bie","bif","big","bij","bik","bil","bim","bin","bio","bip","biq","bir","bit","biu","biv","biw","bix","biy","biz","bja","bjb","bjc","bjd","bje","bjf","bjg","bjh","bji","bjj","bjk","bjl","bjm","bjn","bjo","bjp","bjq","bjr","bjs","bjt","bju","bjv","bjw","bjx","bjy","bjz","bka","bkb","bkc","bkd","bkf","bkg","bkh","bki","bkj","bkk","bkl","bkm","bkn","bko","bkp","bkq","bkr","bks","bkt","bku","bkv","bkw","bkx","bky","bkz","bla","blb","blc","bld","ble","blf","blg","blh","bli","blj","blk","bll","blm","bln","blo","blp","blq","blr","bls","blt","blv","blw","blx","bly","blz","bma","bmb","bmc","bmd","bme","bmf","bmg","bmh","bmi","bmj","bmk","bml","bmm","bmn","bmo","bmp","bmq","bmr","bms","bmt","bmu","bmv","bmw","bmx","bmy","bmz","bna","bnb","bnc","bnd","bne","bnf","bng","bni","bnj","bnk","bnl","bnm","bnn","bno","bnp","bnq","bnr","bns","bnt","bnu","bnv","bnw","bnx","bny","bnz","boa","bob","boe","bof","bog","boh","boi","boj","bok","bol","bom","bon","boo","bop","boq","bor","bot","bou","bov","bow","box","boy","boz","bpa","bpb","bpd","bpe","bpg","bph","bpi","bpj","bpk","bpl","bpm","bpn","bpo","bpp","bpq","bpr","bps","bpt","bpu","bpv","bpw","bpx","bpy","bpz","bqa","bqb","bqc","bqd","bqf","bqg","bqh","bqi","bqj","bqk","bql","bqm","bqn","bqo","bqp","bqq","bqr","bqs","bqt","bqu","bqv","bqw","bqx","bqy","bqz","bra","brb","brc","brd","brf","brg","brh","bri","brj","brk","brl","brm","brn","bro","brp","brq","brr","brs","brt","bru","brv","brw","brx","bry","brz","bsa","bsb","bsc","bse","bsf","bsg","bsh","bsi","bsj","bsk","bsl","bsm","bsn","bso","bsp","bsq","bsr","bss","bst","bsu","bsv","bsw","bsx","bsy","bta","btb","btc","btd","bte","btf","btg","bth","bti","btj","btk","btl","btm","btn","bto","btp","btq","btr","bts","btt","btu","btv","btw","btx","bty","btz","bua","bub","buc","bud","bue","buf","bug","buh","bui","buj","buk","bum","bun","buo","bup","buq","bus","but","buu","buv","buw","bux","buy","buz","bva","bvb","bvc","bvd","bve","bvf","bvg","bvh","bvi","bvj","bvk","bvl","bvm","bvn","bvo","bvp","bvq","bvr","bvt","bvu","bvv","bvw","bvx","bvy","bvz","bwa","bwb","bwc","bwd","bwe","bwf","bwg","bwh","bwi","bwj","bwk","bwl","bwm","bwn","bwo","bwp","bwq","bwr","bws","bwt","bwu","bww","bwx","bwy","bwz","bxa","bxb","bxc","bxd","bxe","bxf","bxg","bxh","bxi","bxj","bxk","bxl","bxm","bxn","bxo","bxp","bxq","bxr","bxs","bxu","bxv","bxw","bxx","bxz","bya","byb","byc","byd","bye","byf","byg","byh","byi","byj","byk","byl","bym","byn","byo","byp","byq","byr","bys","byt","byv","byw","byx","byy","byz","bza","bzb","bzc","bzd","bze","bzf","bzg","bzh","bzi","bzj","bzk","bzl","bzm","bzn","bzo","bzp","bzq","bzr","bzs","bzt","bzu","bzv","bzw","bzx","bzy","bzz"],["ca","ce","ch","co","cr","cs","cu","cv","cy","caa","cab","cac","cad","cae","caf","cag","cah","cai","caj","cak","cal","cam","can","cao","cap","caq","car","cas","cau","cav","caw","cax","cay","caz","cba","cbb","cbc","cbd","cbe","cbg","cbh","cbi","cbj","cbk","cbl","cbn","cbo","cbq","cbr","cbs","cbt","cbu","cbv","cbw","cby","cca","ccc","ccd","cce","ccg","cch","ccj","ccl","ccm","ccn","cco","ccp","ccq","ccr","ccs","cda","cdc","cdd","cde","cdf","cdg","cdh","cdi","cdj","cdm","cdn","cdo","cdr","cds","cdy","cdz","cea","ceb","ceg","cek","cel","cen","cet","cey","cfa","cfd","cfg","cfm","cga","cgc","cgg","cgk","chb","chc","chd","chf","chg","chh","chj","chk","chl","chm","chn","cho","chp","chq","chr","cht","chw","chx","chy","chz","cia","cib","cic","cid","cie","cih","cik","cim","cin","cip","cir","ciw","ciy","cja","cje","cjh","cji","cjk","cjm","cjn","cjo","cjp","cjr","cjs","cjv","cjy","cka","ckb","ckh","ckl","ckm","ckn","cko","ckq","ckr","cks","ckt","cku","ckv","ckx","cky","ckz","cla","clc","cld","cle","clh","cli","clj","clk","cll","clm","clo","clt","clu","clw","cly","cma","cmc","cme","cmg","cmi","cmk","cml","cmm","cmn","cmo","cmr","cms","cmt","cna","cnb","cnc","cng","cnh","cni","cnk","cnl","cno","cnp","cnr","cns","cnt","cnu","cnw","cnx","coa","cob","coc","cod","coe","cof","cog","coh","coj","cok","col","com","con","coo","cop","coq","cot","cou","cov","cow","cox","coy","coz","cpa","cpb","cpc","cpe","cpf","cpg","cpi","cpn","cpo","cpp","cps","cpu","cpx","cpy","cqd","cqu","cra","crb","crc","crd","crf","crg","crh","cri","crj","crk","crl","crm","crn","cro","crp","crq","crr","crs","crt","crv","crw","crx","cry","crz","csa","csb","csc","csd","cse","csf","csg","csh","csi","csj","csk","csl","csm","csn","cso","csp","csq","csr","css","cst","csu","csv","csw","csx","csy","csz","cta","ctc","ctd","cte","ctg","cth","ctl","ctm","ctn","cto","ctp","cts","ctt","ctu","cty","ctz","cua","cub","cuc","cug","cuh","cui","cuj","cuk","cul","cum","cuo","cup","cuq","cur","cus","cut","cuu","cuv","cuw","cux","cuy","cvg","cvn","cwa","cwb","cwd","cwe","cwg","cwt","cya","cyb","cyo","czh","czk","czn","czo","czt"],["da","de","dv","dz","daa","dac","dad","dae","daf","dag","dah","dai","daj","dak","dal","dam","dao","dap","daq","dar","das","dau","dav","daw","dax","day","daz","dba","dbb","dbd","dbe","dbf","dbg","dbi","dbj","dbl","dbm","dbn","dbo","dbp","dbq","dbr","dbt","dbu","dbv","dbw","dby","dcc","dcr","dda","ddd","dde","ddg","ddi","ddj","ddn","ddo","ddr","dds","ddw","dec","ded","dee","def","deg","deh","dei","dek","del","dem","den","dep","deq","der","des","dev","dez","dga","dgb","dgc","dgd","dge","dgg","dgh","dgi","dgk","dgl","dgn","dgo","dgr","dgs","dgt","dgu","dgw","dgx","dgz","dha","dhd","dhg","dhi","dhl","dhm","dhn","dho","dhr","dhs","dhu","dhv","dhw","dhx","dia","dib","dic","did","dif","dig","dih","dii","dij","dik","dil","dim","din","dio","dip","diq","dir","dis","dit","diu","diw","dix","diy","diz","dja","djb","djc","djd","dje","djf","dji","djj","djk","djl","djm","djn","djo","djr","dju","djw","dka","dkg","dkk","dkl","dkr","dks","dkx","dlg","dlk","dlm","dln","dma","dmb","dmc","dmd","dme","dmf","dmg","dmk","dml","dmm","dmn","dmo","dmr","dms","dmu","dmv","dmw","dmx","dmy","dna","dnd","dne","dng","dni","dnj","dnk","dnn","dno","dnr","dnt","dnu","dnv","dnw","dny","doa","dob","doc","doe","dof","doh","doi","dok","dol","don","doo","dop","doq","dor","dos","dot","dov","dow","dox","doy","doz","dpp","dra","drb","drc","drd","dre","drg","drh","dri","drl","drn","dro","drq","drr","drs","drt","dru","drw","dry","dsb","dse","dsh","dsi","dsl","dsn","dso","dsq","dta","dtb","dtd","dth","dti","dtk","dtm","dtn","dto","dtp","dtr","dts","dtt","dtu","dty","dua","dub","duc","dud","due","duf","dug","duh","dui","duj","duk","dul","dum","dun","duo","dup","duq","dur","dus","duu","duv","duw","dux","duy","duz","dva","dwa","dwk","dwl","dwr","dws","dwu","dww","dwy","dwz","dya","dyb","dyd","dyg","dyi","dym","dyn","dyo","dyu","dyy","dza","dzd","dze","dzg","dzl","dzn"],["ee","el","en","eo","es","et","eu","eaa","ebc","ebg","ebk","ebo","ebr","ebu","ecr","ecs","ecy","eee","efa","efe","efi","ega","egl","ego","egx","egy","ehs","ehu","eip","eit","eiv","eja","eka","ekc","eke","ekg","eki","ekk","ekl","ekm","eko","ekp","ekr","eky","ele","elh","eli","elk","elm","elo","elp","elu","elx","ema","emb","eme","emg","emi","emk","emm","emn","emo","emp","emq","ems","emu","emw","emx","emy","emz","ena","enb","enc","end","enf","enh","enl","enm","enn","eno","enq","enr","enu","env","enw","enx","eot","epi","era","erg","erh","eri","erk","ero","err","ers","ert","erw","ese","esg","esh","esi","esk","esl","esm","esn","eso","esq","ess","esu","esx","esy","etb","etc","eth","etn","eto","etr","ets","ett","etu","etx","etz","euq","eve","evh","evn","ewo","ext","eya","eyo","eza","eze"],["fa","ff","fi","fj","fo","fr","fy","faa","fab","fad","faf","fag","fah","fai","faj","fak","fal","fam","fan","fap","far","fat","fau","fax","fay","faz","fbl","fcs","fer","ffi","ffm","fgr","fia","fie","fif","fil","fip","fir","fit","fiu","fiw","fkk","fkv","fla","flh","fli","fll","fln","flr","fly","fmp","fmu","fnb","fng","fni","fod","foi","fom","fon","for","fos","fox","fpe","fqs","frc","frd","frk","frm","fro","frp","frq","frr","frs","frt","fse","fsl","fss","fub","fuc","fud","fue","fuf","fuh","fui","fuj","fum","fun","fuq","fur","fut","fuu","fuv","fuy","fvr","fwa","fwe"],["ga","gd","gl","gn","gu","gv","gaa","gab","gac","gad","gae","gaf","gag","gah","gai","gaj","gak","gal","gam","gan","gao","gap","gaq","gar","gas","gat","gau","gav","gaw","gax","gay","gaz","gba","gbb","gbc","gbd","gbe","gbf","gbg","gbh","gbi","gbj","gbk","gbl","gbm","gbn","gbo","gbp","gbq","gbr","gbs","gbu","gbv","gbw","gbx","gby","gbz","gcc","gcd","gce","gcf","gcl","gcn","gcr","gct","gda","gdb","gdc","gdd","gde","gdf","gdg","gdh","gdi","gdj","gdk","gdl","gdm","gdn","gdo","gdq","gdr","gds","gdt","gdu","gdx","gea","geb","gec","ged","gef","geg","geh","gei","gej","gek","gel","gem","geq","ges","gev","gew","gex","gey","gez","gfk","gft","gfx","gga","ggb","ggd","gge","ggg","ggk","ggl","ggn","ggo","ggr","ggt","ggu","ggw","gha","ghc","ghe","ghh","ghk","ghl","ghn","gho","ghr","ghs","ght","gia","gib","gic","gid","gie","gig","gih","gii","gil","gim","gin","gio","gip","giq","gir","gis","git","giu","giw","gix","giy","giz","gji","gjk","gjm","gjn","gjr","gju","gka","gkd","gke","gkn","gko","gkp","gku","glb","glc","gld","glh","gli","glj","glk","gll","glo","glr","glu","glw","gly","gma","gmb","gmd","gme","gmg","gmh","gml","gmm","gmn","gmq","gmr","gmu","gmv","gmw","gmx","gmy","gmz","gna","gnb","gnc","gnd","gne","gng","gnh","gni","gnj","gnk","gnl","gnm","gnn","gno","gnq","gnr","gnt","gnu","gnw","gnz","goa","gob","goc","god","goe","gof","gog","goh","goi","goj","gok","gol","gom","gon","goo","gop","goq","gor","gos","got","gou","gow","gox","goy","goz","gpa","gpe","gpn","gqa","gqi","gqn","gqr","gqu","gra","grb","grc","grd","grg","grh","gri","grj","grk","grm","gro","grq","grr","grs","grt","gru","grv","grw","grx","gry","grz","gse","gsg","gsl","gsm","gsn","gso","gsp","gss","gsw","gta","gti","gtu","gua","gub","guc","gud","gue","guf","gug","guh","gui","guk","gul","gum","gun","guo","gup","guq","gur","gus","gut","guu","guv","guw","gux","guz","gva","gvc","gve","gvf","gvj","gvl","gvm","gvn","gvo","gvp","gvr","gvs","gvy","gwa","gwb","gwc","gwd","gwe","gwf","gwg","gwi","gwj","gwm","gwn","gwr","gwt","gwu","gww","gwx","gxx","gya","gyb","gyd","gye","gyf","gyg","gyi","gyl","gym","gyn","gyo","gyr","gyy","gyz","gza","gzi","gzn"],["ha","he","hi","ho","hr","ht","hu","hy","hz","haa","hab","hac","had","hae","haf","hag","hah","hai","haj","hak","hal","ham","han","hao","hap","haq","har","has","hav","haw","hax","hay","haz","hba","hbb","hbn","hbo","hbu","hca","hch","hdn","hds","hdy","hea","hed","heg","heh","hei","hem","hgm","hgw","hhi","hhr","hhy","hia","hib","hid","hif","hig","hih","hii","hij","hik","hil","him","hio","hir","hit","hiw","hix","hji","hka","hke","hkh","hkk","hkn","hks","hla","hlb","hld","hle","hlt","hlu","hma","hmb","hmc","hmd","hme","hmf","hmg","hmh","hmi","hmj","hmk","hml","hmm","hmn","hmp","hmq","hmr","hms","hmt","hmu","hmv","hmw","hmx","hmy","hmz","hna","hnd","hne","hng","hnh","hni","hnj","hnn","hno","hns","hnu","hoa","hob","hoc","hod","hoe","hoh","hoi","hoj","hok","hol","hom","hoo","hop","hor","hos","hot","hov","how","hoy","hoz","hpo","hps","hra","hrc","hre","hrk","hrm","hro","hrp","hrr","hrt","hru","hrw","hrx","hrz","hsb","hsh","hsl","hsn","hss","hti","hto","hts","htu","htx","hub","huc","hud","hue","huf","hug","huh","hui","huj","huk","hul","hum","huo","hup","huq","hur","hus","hut","huu","huv","huw","hux","huy","huz","hvc","hve","hvk","hvn","hvv","hwa","hwc","hwo","hya","hyw","hyx"],["ia","id","ie","ig","ii","ik","in","io","is","it","iu","iw","iai","ian","iap","iar","iba","ibb","ibd","ibe","ibg","ibh","ibi","ibl","ibm","ibn","ibr","ibu","iby","ica","ich","icl","icr","ida","idb","idc","idd","ide","idi","idr","ids","idt","idu","ifa","ifb","ife","iff","ifk","ifm","ifu","ify","igb","ige","igg","igl","igm","ign","igo","igs","igw","ihb","ihi","ihp","ihw","iin","iir","ijc","ije","ijj","ijn","ijo","ijs","ike","iki","ikk","ikl","iko","ikp","ikr","iks","ikt","ikv","ikw","ikx","ikz","ila","ilb","ilg","ili","ilk","ill","ilm","ilo","ilp","ils","ilu","ilv","ilw","ima","ime","imi","iml","imn","imo","imr","ims","imy","inb","inc","ine","ing","inh","inj","inl","inm","inn","ino","inp","ins","int","inz","ior","iou","iow","ipi","ipo","iqu","iqw","ira","ire","irh","iri","irk","irn","iro","irr","iru","irx","iry","isa","isc","isd","ise","isg","ish","isi","isk","ism","isn","iso","isr","ist","isu","itb","itc","itd","ite","iti","itk","itl","itm","ito","itr","its","itt","itv","itw","itx","ity","itz","ium","ivb","ivv","iwk","iwm","iwo","iws","ixc","ixl","iya","iyo","iyx","izh","izi","izr","izz"],["ja","ji","jv","jw","jaa","jab","jac","jad","jae","jaf","jah","jaj","jak","jal","jam","jan","jao","jaq","jar","jas","jat","jau","jax","jay","jaz","jbe","jbi","jbj","jbk","jbm","jbn","jbo","jbr","jbt","jbu","jbw","jcs","jct","jda","jdg","jdt","jeb","jee","jeg","jeh","jei","jek","jel","jen","jer","jet","jeu","jgb","jge","jgk","jgo","jhi","jhs","jia","jib","jic","jid","jie","jig","jih","jii","jil","jim","jio","jiq","jit","jiu","jiv","jiy","jje","jjr","jka","jkm","jko","jkp","jkr","jks","jku","jle","jls","jma","jmb","jmc","jmd","jmi","jml","jmn","jmr","jms","jmw","jmx","jna","jnd","jng","jni","jnj","jnl","jns","job","jod","jog","jor","jos","jow","jpa","jpr","jpx","jqr","jra","jrb","jrr","jrt","jru","jsl","jua","jub","juc","jud","juh","jui","juk","jul","jum","jun","juo","jup","jur","jus","jut","juu","juw","juy","jvd","jvn","jwi","jya","jye","jyy"],["ka","kg","ki","kj","kk","kl","km","kn","ko","kr","ks","ku","kv","kw","ky","kaa","kab","kac","kad","kae","kaf","kag","kah","kai","kaj","kak","kam","kao","kap","kaq","kar","kav","kaw","kax","kay","kba","kbb","kbc","kbd","kbe","kbf","kbg","kbh","kbi","kbj","kbk","kbl","kbm","kbn","kbo","kbp","kbq","kbr","kbs","kbt","kbu","kbv","kbw","kbx","kby","kbz","kca","kcb","kcc","kcd","kce","kcf","kcg","kch","kci","kcj","kck","kcl","kcm","kcn","kco","kcp","kcq","kcr","kcs","kct","kcu","kcv","kcw","kcx","kcy","kcz","kda","kdc","kdd","kde","kdf","kdg","kdh","kdi","kdj","kdk","kdl","kdm","kdn","kdo","kdp","kdq","kdr","kdt","kdu","kdv","kdw","kdx","kdy","kdz","kea","keb","kec","ked","kee","kef","keg","keh","kei","kej","kek","kel","kem","ken","keo","kep","keq","ker","kes","ket","keu","kev","kew","kex","key","kez","kfa","kfb","kfc","kfd","kfe","kff","kfg","kfh","kfi","kfj","kfk","kfl","kfm","kfn","kfo","kfp","kfq","kfr","kfs","kft","kfu","kfv","kfw","kfx","kfy","kfz","kga","kgb","kgc","kgd","kge","kgf","kgg","kgh","kgi","kgj","kgk","kgl","kgm","kgn","kgo","kgp","kgq","kgr","kgs","kgt","kgu","kgv","kgw","kgx","kgy","kha","lyg","khb","khc","khd","khe","khf","khg","khh","khi","khj","khk","khl","khn","kho","khp","khq","khr","khs","kht","khu","khv","khw","khx","khy","khz","kia","kib","kic","kid","kie","kif","kig","kih","kii","kij","kil","kim","kio","kip","kiq","kis","kit","kiu","kiv","kiw","kix","kiy","kiz","kja","kjb","kjc","kjd","kje","kjf","kjg","kjh","kji","kjj","kjk","kjl","kjm","kjn","kjo","kjp","kjq","kjr","kjs","kjt","kju","kjv","kjx","kjy","kjz","kka","kkb","kkc","kkd","kke","kkf","kkg","kkh","kki","kkj","kkk","kkl","kkm","kkn","kko","kkp","kkq","kkr","kks","kkt","kku","kkv","kkw","kkx","kky","kkz","kla","klb","klc","kld","kle","klf","klg","klh","kli","klj","klk","kll","klm","kln","klo","klp","klq","klr","kls","klt","klu","klv","klw","klx","kly","klz","kma","kmb","kmc","kmd","kme","kmf","kmg","kmh","kmi","kmj","kmk","kml","kmm","kmn","kmo","kmp","kmq","kmr","kms","kmt","kmu","kmv","kmw","kmx","kmy","kmz","kna","knb","knc","knd","kne","knf","kng","kni","knj","knk","knl","knm","knn","kno","knp","knq","knr","kns","knt","knu","knv","knw","knx","kny","knz","koa","koc","kod","koe","kof","kog","koh","koi","koj","kok","kol","koo","kop","koq","kos","kot","kou","kov","kow","kox","koy","koz","kpa","kpb","kpc","kpd","kpe","kpf","kpg","kph","kpi","kpj","kpk","kpl","kpm","kpn","kpo","kpp","kpq","kpr","kps","kpt","kpu","kpv","kpw","kpx","kpy","kpz","kqa","kqb","kqc","kqd","kqe","kqf","kqg","kqh","kqi","kqj","kqk","kql","kqm","kqn","kqo","kqp","kqq","kqr","kqs","kqt","kqu","kqv","kqw","kqx","kqy","kqz","kra","krb","krc","krd","kre","krf","krh","kri","krj","krk","krl","krm","krn","kro","krp","krr","krs","krt","kru","krv","krw","krx","kry","krz","ksa","ksb","ksc","ksd","kse","ksf","ksg","ksh","ksi","ksj","ksk","ksl","ksm","ksn","kso","ksp","ksq","ksr","kss","kst","ksu","ksv","ksw","ksx","ksy","ksz","kta","ktb","ktc","ktd","kte","ktf","ktg","kth","kti","ktj","ktk","ktl","ktm","ktn","kto","ktp","ktq","ktr","kts","ktt","ktu","ktv","ktw","ktx","kty","ktz","kub","kuc","kud","kue","kuf","kug","kuh","kui","kuj","kuk","kul","kum","kun","kuo","kup","kuq","kus","kut","kuu","kuv","kuw","kux","kuy","kuz","kva","kvb","kvc","kvd","kve","kvf","kvg","kvh","kvi","kvj","kvk","kvl","kvm","kvn","kvo","kvp","kvq","kvr","kvs","kvt","kvu","kvv","kvw","kvx","kvy","kvz","kwa","kwb","kwc","kwd","kwe","kwf","kwg","kwh","kwi","kwj","kwk","kwl","kwm","kwn","kwo","kwp","kwq","kwr","kws","kwt","kwu","kwv","kww","kwx","kwy","kwz","kxa","kxb","kxc","kxd","kxe","kxf","kxh","kxi","kxj","kxk","kxl","kxm","kxn","kxo","kxp","kxq","kxr","kxs","kxt","kxu","kxv","kxw","kxx","kxy","kxz","kya","kyb","kyc","kyd","kye","kyf","kyg","kyh","kyi","kyj","kyk","kyl","kym","kyn","kyo","kyp","kyq","kyr","kys","kyt","kyu","kyv","kyw","kyx","kyy","kyz","kza","kzb","kzc","kzd","kze","kzf","kzg","kzh","kzi","kzj","kzk","kzl","kzm","kzn","kzo","kzp","kzq","kzr","kzs","kzt","kzu","kzv","kzw","kzx","kzy","kzz"],["la","lb","lg","li","ln","lo","lt","lu","lv","laa","lab","lac","lad","lae","laf","lag","lah","lai","laj","lak","lal","lam","lan","lap","laq","lar","las","lau","law","lax","lay","laz","lba","lbb","lbc","lbe","lbf","lbg","lbi","lbj","lbk","lbl","lbm","lbn","lbo","lbq","lbr","lbs","lbt","lbu","lbv","lbw","lbx","lby","lbz","lcc","lcd","lce","lcf","lch","lcl","lcm","lcp","lcq","lcs","lda","ldb","ldd","ldg","ldh","ldi","ldj","ldk","ldl","ldm","ldn","ldo","ldp","ldq","lea","leb","lec","led","lee","lef","leg","leh","lei","lej","lek","lel","lem","len","leo","lep","leq","ler","les","let","leu","lev","lew","lex","ley","lez","lfa","lfn","lga","lgb","lgg","lgh","lgi","lgk","lgl","lgm","lgn","lgq","lgr","lgt","lgu","lgz","lha","lhh","lhi","lhl","lhm","lhn","lhp","lhs","lht","lhu","lia","lib","lic","lid","lie","lif","lig","lih","lii","lij","lik","lil","lio","lip","liq","lir","lis","liu","liv","liw","lix","liy","liz","lja","lje","lji","ljl","ljp","ljw","ljx","lka","lkb","lkc","lkd","lke","lkh","lki","lkj","lkl","lkm","lkn","lko","lkr","lks","lkt","lku","lky","lla","llb","llc","lld","lle","llf","llg","llh","lli","llj","llk","lll","llm","lln","llo","llp","llq","lls","llu","llx","lma","lmb","lmc","lmd","lme","lmf","lmg","lmh","lmi","lmj","lmk","lml","lmm","lmn","lmo","lmp","lmq","lmr","lmu","lmv","lmw","lmx","lmy","lmz","lna","lnb","lnd","lng","lnh","lni","lnj","lnl","lnm","lnn","lno","lns","lnu","lnw","lnz","loa","lob","loc","loe","lof","log","loh","loi","loj","lok","lol","lom","lon","loo","lop","loq","lor","los","lot","lou","lov","low","lox","loy","loz","lpa","lpe","lpn","lpo","lpx","lra","lrc","lre","lrg","lri","lrk","lrl","lrm","lrn","lro","lrr","lrt","lrv","lrz","lsa","lsb","lsd","lse","lsg","lsh","lsi","lsl","lsm","lsn","lso","lsp","lsr","lss","lst","lsv","lsy","ltc","ltg","lth","lti","ltn","lto","lts","ltu","lua","luc","lud","lue","luf","lui","luj","luk","lul","lum","lun","luo","lup","luq","lur","lus","lut","luu","luv","luw","luy","luz","lva","lvi","lvk","lvs","lvu","lwa","lwe","lwg","lwh","lwl","lwm","lwo","lws","lwt","lwu","lww","lxm","lya","lyg","lyn","lzh","lzl","lzn","lzz"],["mg","mh","mi","mk","ml","mn","mo","mr","ms","mt","my","maa","mab","mad","mae","maf","mag","mai","maj","mak","mam","man","map","maq","mas","mat","mau","mav","maw","max","maz","mba","mbb","mbc","mbd","mbe","mbf","mbh","mbi","mbj","mbk","mbl","mbm","mbn","mbo","mbp","mbq","mbr","mbs","mbt","mbu","mbv","mbw","mbx","mby","mbz","mca","mcb","mcc","mcd","mce","mcf","mcg","mch","mci","mcj","mck","mcl","mcm","mcn","mco","mcp","mcq","mcr","mcs","mct","mcu","mcv","mcw","mcx","mcy","mcz","mda","mdb","mdc","mdd","mde","mdf","mdg","mdh","mdi","mdj","mdk","mdl","mdm","mdn","mdp","mdq","mdr","mds","mdt","mdu","mdv","mdw","mdx","mdy","mdz","mea","meb","mec","med","mee","mef","meg","meh","mei","mej","mek","mel","mem","men","meo","mep","meq","mer","mes","met","meu","mev","mew","mey","mez","mfa","mfb","mfc","mfd","mfe","mff","mfg","mfh","mfi","mfj","mfk","mfl","mfm","mfn","mfo","mfp","mfq","mfr","mfs","mft","mfu","mfv","mfw","mfx","mfy","mfz","mga","mgb","mgc","mgd","mge","mgf","mgg","mgh","mgi","mgj","mgk","mgl","mgm","mgn","mgo","mgp","mgq","mgr","mgs","mgt","mgu","mgv","mgw","mgx","mgy","mgz","mha","mhb","mhc","mhd","mhe","mhf","mhg","mhh","mhi","mhj","mhk","mhl","mhm","mhn","mho","mhp","mhq","mhr","mhs","mht","mhu","mhw","mhx","mhy","mhz","mia","mib","mic","mid","mie","mif","mig","mih","mii","mij","mik","mil","mim","min","mio","mip","miq","mir","mis","mit","miu","miw","mix","miy","miz","mja","mjb","mjc","mjd","mje","mjg","mjh","mji","mjj","mjk","mjl","mjm","mjn","mjo","mjp","mjq","mjr","mjs","mjt","mju","mjv","mjw","mjx","mjy","mjz","mka","mkb","mkc","mke","mkf","mkg","mkh","mki","mkj","mkk","mkl","mkm","mkn","mko","mkp","mkq","mkr","mks","mkt","mku","mkv","mkw","mkx","mky","mkz","mla","mlb","mlc","mld","mle","mlf","mlh","mli","mlj","mlk","mll","mlm","mln","mlo","mlp","mlq","mlr","mls","mlu","mlv","mlw","mlx","mlz","mma","mmb","mmc","mmd","mme","mmf","mmg","mmh","mmi","mmj","mmk","mml","mmm","mmn","mmo","mmp","mmq","mmr","mmt","mmu","mmv","mmw","mmx","mmy","mmz","mna","mnb","mnc","mnd","mne","mnf","mng","mnh","mni","mnj","mnk","mnl","mnm","mnn","mno","mnp","mnq","mnr","mns","mnt","mnu","mnv","mnw","mnx","mny","mnz","moa","moc","mod","moe","mof","mog","moh","moi","moj","mok","mom","moo","mop","moq","mor","mos","mot","mou","mov","mow","mox","moy","moz","mpa","mpb","mpc","mpd","mpe","mpg","mph","mpi","mpj","mpk","mpl","mpm","mpn","mpo","mpp","mpq","mpr","mps","mpt","mpu","mpv","mpw","mpx","mpy","mpz","mqa","mqb","mqc","mqe","mqf","mqg","mqh","mqi","mqj","mqk","mql","mqm","mqn","mqo","mqp","mqq","mqr","mqs","mqt","mqu","mqv","mqw","mqx","mqy","mqz","mra","mrb","mrc","mrd","mre","mrf","mrg","mrh","mrj","mrk","mrl","mrm","mrn","mro","mrp","mrq","mrr","mrs","mrt","mru","mrv","mrw","mrx","mry","mrz","msb","msc","msd","mse","msf","msg","msh","msi","msj","msk","msl","msm","msn","mso","msp","msq","msr","mss","mst","msu","msv","msw","msx","msy","msz","mta","mtb","mtc","mtd","mte","mtf","mtg","mth","mti","mtj","mtk","mtl","mtm","mtn","mto","mtp","mtq","mtr","mts","mtt","mtu","mtv","mtw","mtx","mty","mua","mub","muc","mud","mue","mug","muh","mui","muj","muk","mul","mum","mun","muo","mup","muq","mur","mus","mut","muu","muv","mux","muy","muz","mva","mvb","mvd","mve","mvf","mvg","mvh","mvi","mvk","mvl","mvm","mvn","mvo","mvp","mvq","mvr","mvs","mvt","mvu","mvv","mvw","mvx","mvy","mvz","mwa","mwb","mwc","mwd","mwe","mwf","mwg","mwh","mwi","mwj","mwk","mwl","mwm","mwn","mwo","mwp","mwq","mwr","mws","mwt","mwu","mwv","mww","mwx","mwy","mwz","mxa","mxb","mxc","mxd","mxe","mxf","mxg","mxh","mxi","mxj","mxk","mxl","mxm","mxn","mxo","mxp","mxq","mxr","mxs","mxt","mxu","mxv","mxw","mxx","mxy","mxz","myb","myc","myd","mye","myf","myg","myh","myi","myj","myk","myl","mym","myn","myo","myp","myq","myr","mys","myt","myu","myv","myw","myx","myy","myz","mza","mzb","mzc","mzd","mze","mzg","mzh","mzi","mzj","mzk","mzl","mzm","mzn","mzo","mzp","mzq","mzr","mzs","mzt","mzu","mzv","mzw","mzx","mzy","mzz"],["na","nb","nd","ne","ng","nl","nn","no","nr","nv","ny","naa","nab","nac","nad","nae","naf","nag","nah","nai","naj","nak","nal","nam","nan","nao","nap","naq","nar","nas","nat","naw","nax","nay","naz","nba","nbb","nbc","nbd","nbe","nbf","nbg","nbh","nbi","nbj","nbk","nbm","nbn","nbo","nbp","nbq","nbr","nbs","nbt","nbu","nbv","nbw","nbx","nby","nca","ncb","ncc","ncd","nce","ncf","ncg","nch","nci","ncj","nck","ncl","ncm","ncn","nco","ncp","ncq","ncr","ncs","nct","ncu","ncx","ncz","nda","ndb","ndc","ndd","ndf","ndg","ndh","ndi","ndj","ndk","ndl","ndm","ndn","ndp","ndq","ndr","nds","ndt","ndu","ndv","ndw","ndx","ndy","ndz","nea","neb","nec","ned","nee","nef","neg","neh","nei","nej","nek","nem","nen","neo","neq","ner","nes","net","neu","nev","new","nex","ney","nez","nfa","nfd","nfl","nfr","nfu","nga","ngb","ngc","ngd","nge","ngf","ngg","ngh","ngi","ngj","ngk","ngl","ngm","ngn","ngo","ngp","ngq","ngr","ngs","ngt","ngu","ngv","ngw","ngx","ngy","ngz","nha","nhb","nhc","nhd","nhe","nhf","nhg","nhh","nhi","nhk","nhm","nhn","nho","nhp","nhq","nhr","nht","nhu","nhv","nhw","nhx","nhy","nhz","nia","nib","nic","nid","nie","nif","nig","nih","nii","nij","nik","nil","nim","nin","nio","niq","nir","nis","nit","niu","niv","niw","nix","niy","niz","nja","njb","njd","njh","nji","njj","njl","njm","njn","njo","njr","njs","njt","nju","njx","njy","njz","nka","nkb","nkc","nkd","nke","nkf","nkg","nkh","nki","nkj","nkk","nkm","nkn","nko","nkp","nkq","nkr","nks","nkt","nku","nkv","nkw","nkx","nkz","nla","nlc","nle","nlg","nli","nlj","nlk","nll","nlm","nln","nlo","nlq","nlr","nlu","nlv","nlw","nlx","nly","nlz","nma","nmb","nmc","nmd","nme","nmf","nmg","nmh","nmi","nmj","nmk","nml","nmm","nmn","nmo","nmp","nmq","nmr","nms","nmt","nmu","nmv","nmw","nmx","nmy","nmz","nna","nnb","nnc","nnd","nne","nnf","nng","nnh","nni","nnj","nnk","nnl","nnm","nnn","nnp","nnq","nnr","nns","nnt","nnu","nnv","nnw","nnx","nny","nnz","noa","noc","nod","noe","nof","nog","noh","noi","noj","nok","nol","nom","non","noo","nop","noq","nos","not","nou","nov","now","noy","noz","npa","npb","npg","nph","npi","npl","npn","npo","nps","npu","npx","npy","nqg","nqk","nql","nqm","nqn","nqo","nqq","nqt","nqy","nra","nrb","nrc","nre","nrf","nrg","nri","nrk","nrl","nrm","nrn","nrp","nrr","nrt","nru","nrx","nrz","nsa","nsb","nsc","nsd","nse","nsf","nsg","nsh","nsi","nsk","nsl","nsm","nsn","nso","nsp","nsq","nsr","nss","nst","nsu","nsv","nsw","nsx","nsy","nsz","ntd","nte","ntg","nti","ntj","ntk","ntm","nto","ntp","ntr","nts","ntu","ntw","ntx","nty","ntz","nua","nub","nuc","nud","nue","nuf","nug","nuh","nui","nuj","nuk","nul","num","nun","nuo","nup","nuq","nur","nus","nut","nuu","nuv","nuw","nux","nuy","nuz","nvh","nvm","nvo","nwa","nwb","nwc","nwe","nwg","nwi","nwm","nwo","nwr","nwx","nwy","nxa","nxd","nxe","nxg","nxi","nxk","nxl","nxm","nxn","nxo","nxq","nxr","nxu","nxx","nyb","nyc","nyd","nye","nyf","nyg","nyh","nyi","nyj","nyk","nyl","nym","nyn","nyo","nyp","nyq","nyr","nys","nyt","nyu","nyv","nyw","nyx","nyy","nza","nzb","nzd","nzi","nzk","nzm","nzs","nzu","nzy","nzz"],["oc","oj","om","or","os","oaa","oac","oar","oav","obi","obk","obl","obm","obo","obr","obt","obu","oca","och","ocm","oco","ocu","oda","odk","odt","odu","ofo","ofs","ofu","ogb","ogc","oge","ogg","ogo","ogu","oht","ohu","oia","oin","ojb","ojc","ojg","ojp","ojs","ojv","ojw","oka","okb","okc","okd","oke","okg","okh","oki","okj","okk","okl","okm","okn","oko","okr","oks","oku","okv","okx","okz","ola","old","ole","olk","olm","olo","olr","olt","olu","oma","omb","omc","ome","omg","omi","omk","oml","omn","omo","omp","omq","omr","omt","omu","omv","omw","omx","omy","ona","onb","one","ong","oni","onj","onk","onn","ono","onp","onr","ons","ont","onu","onw","onx","ood","oog","oon","oor","oos","opa","opk","opm","opo","opt","opy","ora","orc","ore","org","orh","orn","oro","orr","ors","ort","oru","orv","orw","orx","ory","orz","osa","osc","osi","osn","oso","osp","ost","osu","osx","ota","otb","otd","ote","oti","otk","otl","otm","otn","oto","otq","otr","ots","ott","otu","otw","otx","oty","otz","oua","oub","oue","oui","oum","oun","ovd","owi","owl","oyb","oyd","oym","oyy","ozm"],["pa","pi","pl","ps","pt","paa","pab","pac","pad","pae","paf","pag","pah","pai","pak","pal","pam","pao","pap","paq","par","pas","pat","pau","pav","paw","pax","pay","paz","pbb","pbc","pbe","pbf","pbg","pbh","pbi","pbl","pbm","pbn","pbo","pbp","pbr","pbs","pbt","pbu","pbv","pby","pbz","pca","pcb","pcc","pcd","pce","pcf","pcg","pch","pci","pcj","pck","pcl","pcm","pcn","pcp","pcr","pcw","pda","pdc","pdi","pdn","pdo","pdt","pdu","pea","peb","ped","pee","pef","peg","peh","pei","pej","pek","pel","pem","peo","pep","peq","pes","pev","pex","pey","pez","pfa","pfe","pfl","pga","pgd","pgg","pgi","pgk","pgl","pgn","pgs","pgu","pgy","pgz","pha","phd","phg","phh","phi","phk","phl","phm","phn","pho","phq","phr","pht","phu","phv","phw","pia","pib","pic","pid","pie","pif","pig","pih","pii","pij","pil","pim","pin","pio","pip","pir","pis","pit","piu","piv","piw","pix","piy","piz","pjt","pka","pkb","pkc","pkg","pkh","pkn","pko","pkp","pkr","pks","pkt","pku","pla","plb","plc","pld","ple","plf","plg","plh","plj","plk","pll","pln","plo","plp","plq","plr","pls","plt","plu","plv","plw","ply","plz","pma","pmb","pmc","pmd","pme","pmf","pmh","pmi","pmj","pmk","pml","pmm","pmn","pmo","pmq","pmr","pms","pmt","pmu","pmw","pmx","pmy","pmz","pna","pnb","pnc","pnd","pne","png","pnh","pni","pnj","pnk","pnl","pnm","pnn","pno","pnp","pnq","pnr","pns","pnt","pnu","pnv","pnw","pnx","pny","pnz","poc","pod","poe","pof","pog","poh","poi","pok","pom","pon","poo","pop","poq","pos","pot","pov","pow","pox","poy","poz","ppa","ppe","ppi","ppk","ppl","ppm","ppn","ppo","ppp","ppq","ppr","pps","ppt","ppu","pqa","pqe","pqm","pqw","pra","prb","prc","prd","pre","prf","prg","prh","pri","prk","prl","prm","prn","pro","prp","prq","prr","prs","prt","pru","prw","prx","pry","prz","psa","psc","psd","pse","psg","psh","psi","psl","psm","psn","pso","psp","psq","psr","pss","pst","psu","psw","psy","pta","pth","pti","ptn","pto","ptp","ptq","ptr","ptt","ptu","ptv","ptw","pty","pua","pub","puc","pud","pue","puf","pug","pui","puj","puk","pum","puo","pup","puq","pur","put","puu","puw","pux","puy","puz","pwa","pwb","pwg","pwi","pwm","pwn","pwo","pwr","pww","pxm","pye","pym","pyn","pys","pyu","pyx","pyy","pzn"],["qu","qua","qub","quc","qud","quf","qug","quh","qui","quk","qul","qum","qun","qup","quq","qur","qus","quv","quw","qux","quy","quz","qva","qvc","qve","qvh","qvi","qvj","qvl","qvm","qvn","qvo","qvp","qvs","qvw","qvy","qvz","qwa","qwc","qwe","qwh","qwm","qws","qwt","qxa","qxc","qxh","qxl","qxn","qxo","qxp","qxq","qxr","qxs","qxt","qxu","qxw","qya","qyp"],["rm","rn","ro","ru","rw","raa","rab","rac","rad","raf","rag","rah","rai","raj","rak","ral","ram","ran","rao","rap","raq","rar","ras","rat","rau","rav","raw","rax","ray","raz","rbb","rbk","rbl","rbp","rcf","rdb","rea","reb","ree","reg","rei","rej","rel","rem","ren","rer","res","ret","rey","rga","rge","rgk","rgn","rgr","rgs","rgu","rhg","rhp","ria","rie","rif","ril","rim","rin","rir","rit","riu","rjg","rji","rjs","rka","rkb","rkh","rki","rkm","rkt","rkw","rma","rmb","rmc","rmd","rme","rmf","rmg","rmh","rmi","rmk","rml","rmm","rmn","rmo","rmp","rmq","rmr","rms","rmt","rmu","rmv","rmw","rmx","rmy","rmz","rna","rnd","rng","rnl","rnn","rnp","rnr","rnw","roa","rob","roc","rod","roe","rof","rog","rol","rom","roo","rop","ror","rou","row","rpn","rpt","rri","rro","rrt","rsb","rsi","rsl","rsm","rtc","rth","rtm","rts","rtw","rub","ruc","rue","ruf","rug","ruh","rui","ruk","ruo","rup","ruq","rut","ruu","ruy","ruz","rwa","rwk","rwl","rwm","rwo","rwr","rxd","rxw","ryn","rys","ryu","rzh"],["sa","sc","sd","se","sg","sh","si","sk","sl","sm","sn","so","sq","sr","ss","st","su","sv","sw","saa","sab","sac","sad","sae","saf","sah","sai","saj","sak","sal","sam","sao","sap","saq","sar","sas","sat","sau","sav","saw","sax","say","saz","sba","sbb","sbc","sbd","sbe","sbf","sbg","sbh","sbi","sbj","sbk","sbl","sbm","sbn","sbo","sbp","sbq","sbr","sbs","sbt","sbu","sbv","sbw","sbx","sby","sbz","sca","scb","sce","scf","scg","sch","sci","sck","scl","scn","sco","scp","scq","scs","sct","scu","scv","scw","scx","sda","sdb","sdc","sde","sdf","sdg","sdh","sdj","sdk","sdl","sdm","sdn","sdo","sdp","sdq","sdr","sds","sdt","sdu","sdv","sdx","sdz","sea","seb","sec","sed","see","sef","seg","seh","sei","sej","sek","sel","sem","sen","seo","sep","seq","ser","ses","set","seu","sev","sew","sey","sez","sfb","sfe","sfm","sfs","sfw","sga","sgb","sgc","sgd","sge","sgg","sgh","sgi","sgj","sgk","sgl","sgm","sgn","sgo","sgp","sgr","sgs","sgt","sgu","sgw","sgx","sgy","sgz","sha","shb","shc","shd","she","shg","shh","shi","shj","shk","shl","shm","shn","sho","shp","shq","shr","shs","sht","shu","shv","shw","shx","shy","shz","sia","sib","sid","sie","sif","sig","sih","sii","sij","sik","sil","sim","sio","sip","siq","sir","sis","sit","siu","siv","siw","six","siy","siz","sja","sjb","sjd","sje","sjg","sjk","sjl","sjm","sjn","sjo","sjp","sjr","sjs","sjt","sju","sjw","ska","skb","skc","skd","ske","skf","skg","skh","ski","skj","skk","skm","skn","sko","skp","skq","skr","sks","skt","sku","skv","skw","skx","sky","skz","sla","slc","sld","sle","slf","slg","slh","sli","slj","sll","slm","sln","slp","slq","slr","sls","slt","slu","slw","slx","sly","slz","sma","smb","smc","smd","smf","smg","smh","smi","smj","smk","sml","smm","smn","smp","smq","smr","sms","smt","smu","smv","smw","smx","smy","smz","snb","snc","sne","snf","sng","snh","sni","snj","snk","snl","snm","snn","sno","snp","snq","snr","sns","snu","snv","snw","snx","sny","snz","soa","sob","soc","sod","soe","sog","soh","soi","soj","sok","sol","son","soo","sop","soq","sor","sos","sou","sov","sow","sox","soy","soz","spb","spc","spd","spe","spg","spi","spk","spl","spm","spn","spo","spp","spq","spr","sps","spt","spu","spv","spx","spy","sqa","sqh","sqj","sqk","sqm","sqn","sqo","sqq","sqr","sqs","sqt","squ","sqx","sra","srb","src","sre","srf","srg","srh","sri","srk","srl","srm","srn","sro","srq","srr","srs","srt","sru","srv","srw","srx","sry","srz","ssa","ssb","ssc","ssd","sse","ssf","ssg","ssh","ssi","ssj","ssk","ssl","ssm","ssn","sso","ssp","ssq","ssr","sss","sst","ssu","ssv","ssx","ssy","ssz","sta","stb","std","ste","stf","stg","sth","sti","stj","stk","stl","stm","stn","sto","stp","stq","str","sts","stt","stu","stv","stw","sty","sua","sub","suc","sue","sug","sui","suj","suk","sul","sum","suo","suq","sur","sus","sut","suv","suw","sux","suy","suz","sva","svb","svc","sve","svk","svm","svr","svs","svx","swb","swc","swf","swg","swh","swi","swj","swk","swl","swm","swn","swo","swp","swq","swr","sws","swt","swu","swv","sww","swx","swy","sxb","sxc","sxe","sxg","sxk","sxl","sxm","sxn","sxo","sxr","sxs","sxu","sxw","sya","syb","syc","syd","syi","syk","syl","sym","syn","syo","syr","sys","syw","syx","syy","sza","szb","szc","szd","sze","szg","szl","szn","szp","szs","szv","szw","szy"],["ta","te","tg","th","ti","tk","tl","tn","to","tr","ts","tt","tw","ty","taa","tab","tac","tad","tae","taf","tag","tai","taj","tak","tal","tan","tao","tap","taq","tar","tas","tau","tav","taw","tax","tay","taz","tba","tbb","tbc","tbd","tbe","tbf","tbg","tbh","tbi","tbj","tbk","tbl","tbm","tbn","tbo","tbp","tbq","tbr","tbs","tbt","tbu","tbv","tbw","tbx","tby","tbz","tca","tcb","tcc","tcd","tce","tcf","tcg","tch","tci","tck","tcl","tcm","tcn","tco","tcp","tcq","tcs","tct","tcu","tcw","tcx","tcy","tcz","tda","tdb","tdc","tdd","tde","tdf","tdg","tdh","tdi","tdj","tdk","tdl","tdm","tdn","tdo","tdq","tdr","tds","tdt","tdu","tdv","tdx","tdy","tea","teb","tec","ted","tee","tef","teg","teh","tei","tek","tem","ten","teo","tep","teq","ter","tes","tet","teu","tev","tew","tex","tey","tez","tfi","tfn","tfo","tfr","tft","tga","tgb","tgc","tgd","tge","tgf","tgg","tgh","tgi","tgj","tgn","tgo","tgp","tgq","tgr","tgs","tgt","tgu","tgv","tgw","tgx","tgy","tgz","thc","thd","the","thf","thh","thi","thk","thl","thm","thn","thp","thq","thr","ths","tht","thu","thv","thw","thx","thy","thz","tia","tic","tid","tie","tif","tig","tih","tii","tij","tik","til","tim","tin","tio","tip","tiq","tis","tit","tiu","tiv","tiw","tix","tiy","tiz","tja","tjg","tji","tjj","tjl","tjm","tjn","tjo","tjp","tjs","tju","tjw","tka","tkb","tkd","tke","tkf","tkg","tkk","tkl","tkm","tkn","tkp","tkq","tkr","tks","tkt","tku","tkv","tkw","tkx","tkz","tla","tlb","tlc","tld","tlf","tlg","tlh","tli","tlj","tlk","tll","tlm","tln","tlo","tlp","tlq","tlr","tls","tlt","tlu","tlv","tlw","tlx","tly","tma","tmb","tmc","tmd","tme","tmf","tmg","tmh","tmi","tmj","tmk","tml","tmm","tmn","tmo","tmp","tmq","tmr","tms","tmt","tmu","tmv","tmw","tmy","tmz","tna","tnb","tnc","tnd","tne","tnf","tng","tnh","tni","tnk","tnl","tnm","tnn","tno","tnp","tnq","tnr","tns","tnt","tnu","tnv","tnw","tnx","tny","tnz","tob","toc","tod","toe","tof","tog","toh","toi","toj","tol","tom","too","top","toq","tor","tos","tou","tov","tow","tox","toy","toz","tpa","tpc","tpe","tpf","tpg","tpi","tpj","tpk","tpl","tpm","tpn","tpo","tpp","tpq","tpr","tpt","tpu","tpv","tpw","tpx","tpy","tpz","tqb","tql","tqm","tqn","tqo","tqp","tqq","tqr","tqt","tqu","tqw","tra","trb","trc","trd","tre","trf","trg","trh","tri","trj","trk","trl","trm","trn","tro","trp","trq","trr","trs","trt","tru","trv","trw","trx","try","trz","tsa","tsb","tsc","tsd","tse","tsf","tsg","tsh","tsi","tsj","tsk","tsl","tsm","tsp","tsq","tsr","tss","tst","tsu","tsv","tsw","tsx","tsy","tsz","tta","ttb","ttc","ttd","tte","ttf","ttg","tth","tti","ttj","ttk","ttl","ttm","ttn","tto","ttp","ttq","ttr","tts","ttt","ttu","ttv","ttw","tty","ttz","tua","tub","tuc","tud","tue","tuf","tug","tuh","tui","tuj","tul","tum","tun","tuo","tup","tuq","tus","tut","tuu","tuv","tuw","tux","tuy","tuz","tva","tvd","tve","tvk","tvl","tvm","tvn","tvo","tvs","tvt","tvu","tvw","tvx","tvy","twa","twb","twc","twd","twe","twf","twg","twh","twl","twm","twn","two","twp","twq","twr","twt","twu","tww","twx","twy","txa","txb","txc","txe","txg","txh","txi","txj","txm","txn","txo","txq","txr","txs","txt","txu","txx","txy","tya","tye","tyh","tyi","tyj","tyl","tyn","typ","tyr","tys","tyt","tyu","tyv","tyx","tyy","tyz","tza","tzh","tzj","tzl","tzm","tzn","tzo","tzx"],["ug","uk","ur","uz","uam","uan","uar","uba","ubi","ubl","ubr","ubu","uby","uda","ude","udg","udi","udj","udl","udm","udu","ues","ufi","uga","ugb","uge","ugn","ugo","ugy","uha","uhn","uis","uiv","uji","uka","ukg","ukh","uki","ukk","ukl","ukp","ukq","uks","uku","ukv","ukw","uky","ula","ulb","ulc","ule","ulf","uli","ulk","ull","ulm","uln","ulu","ulw","uma","umb","umc","umd","umg","umi","umm","umn","umo","ump","umr","ums","umu","una","und","une","ung","uni","unk","unm","unn","unp","unr","unu","unx","unz","uok","upi","upv","ura","urb","urc","ure","urf","urg","urh","uri","urj","urk","url","urm","urn","uro","urp","urr","urt","uru","urv","urw","urx","ury","urz","usa","ush","usi","usk","usp","uss","usu","uta","ute","uth","utp","utr","utu","uum","uun","uur","uuu","uve","uvh","uvl","uwa","uya","uzn","uzs"],["ve","vi","vo","vaa","vae","vaf","vag","vah","vai","vaj","val","vam","van","vao","vap","var","vas","vau","vav","vay","vbb","vbk","vec","ved","vel","vem","veo","vep","ver","vgr","vgt","vic","vid","vif","vig","vil","vin","vis","vit","viv","vka","vki","vkj","vkk","vkl","vkm","vkn","vko","vkp","vkt","vku","vkz","vlp","vls","vma","vmb","vmc","vmd","vme","vmf","vmg","vmh","vmi","vmj","vmk","vml","vmm","vmp","vmq","vmr","vms","vmu","vmv","vmw","vmx","vmy","vmz","vnk","vnm","vnp","vor","vot","vra","vro","vrs","vrt","vsi","vsl","vsv","vto","vum","vun","vut","vwa"],["wa","wo","waa","wab","wac","wad","wae","waf","wag","wah","wai","waj","wak","wal","wam","wan","wao","wap","waq","war","was","wat","wau","wav","waw","wax","way","waz","wba","wbb","wbe","wbf","wbh","wbi","wbj","wbk","wbl","wbm","wbp","wbq","wbr","wbs","wbt","wbv","wbw","wca","wci","wdd","wdg","wdj","wdk","wdu","wdy","wea","wec","wed","weg","weh","wei","wem","wen","weo","wep","wer","wes","wet","weu","wew","wfg","wga","wgb","wgg","wgi","wgo","wgu","wgw","wgy","wha","whg","whk","whu","wib","wic","wie","wif","wig","wih","wii","wij","wik","wil","wim","win","wir","wit","wiu","wiv","wiw","wiy","wja","wji","wka","wkb","wkd","wkl","wkr","wku","wkw","wky","wla","wlc","wle","wlg","wlh","wli","wlk","wll","wlm","wlo","wlr","wls","wlu","wlv","wlw","wlx","wly","wma","wmb","wmc","wmd","wme","wmg","wmh","wmi","wmm","wmn","wmo","wms","wmt","wmw","wmx","wnb","wnc","wnd","wne","wng","wni","wnk","wnm","wnn","wno","wnp","wnu","wnw","wny","woa","wob","woc","wod","woe","wof","wog","woi","wok","wom","won","woo","wor","wos","wow","woy","wpc","wra","wrb","wrd","wrg","wrh","wri","wrk","wrl","wrm","wrn","wro","wrp","wrr","wrs","wru","wrv","wrw","wrx","wry","wrz","wsa","wsg","wsi","wsk","wsr","wss","wsu","wsv","wtf","wth","wti","wtk","wtm","wtw","wua","wub","wud","wuh","wul","wum","wun","wur","wut","wuu","wuv","wux","wuy","wwa","wwb","wwo","wwr","www","wxa","wxw","wya","wyb","wyi","wym","wyr","wyy"],["xh","xaa","xab","xac","xad","xae","xag","xai","xaj","xak","xal","xam","xan","xao","xap","xaq","xar","xas","xat","xau","xav","xaw","xay","xba","xbb","xbc","xbd","xbe","xbg","xbi","xbj","xbm","xbn","xbo","xbp","xbr","xbw","xbx","xby","xcb","xcc","xce","xcg","xch","xcl","xcm","xcn","xco","xcr","xct","xcu","xcv","xcw","xcy","xda","xdc","xdk","xdm","xdo","xdy","xeb","xed","xeg","xel","xem","xep","xer","xes","xet","xeu","xfa","xga","xgb","xgd","xgf","xgg","xgi","xgl","xgm","xgn","xgr","xgu","xgw","xha","xhc","xhd","xhe","xhr","xht","xhu","xhv","xia","xib","xii","xil","xin","xip","xir","xis","xiv","xiy","xjb","xjt","xka","xkb","xkc","xkd","xke","xkf","xkg","xkh","xki","xkj","xkk","xkl","xkn","xko","xkp","xkq","xkr","xks","xkt","xku","xkv","xkw","xkx","xky","xkz","xla","xlb","xlc","xld","xle","xlg","xli","xln","xlo","xlp","xls","xlu","xly","xma","xmb","xmc","xmd","xme","xmf","xmg","xmh","xmj","xmk","xml","xmm","xmn","xmo","xmp","xmq","xmr","xms","xmt","xmu","xmv","xmw","xmx","xmy","xmz","xna","xnb","xnd","xng","xnh","xni","xnj","xnk","xnm","xnn","xno","xnq","xnr","xns","xnt","xnu","xny","xnz","xoc","xod","xog","xoi","xok","xom","xon","xoo","xop","xor","xow","xpa","xpb","xpc","xpd","xpe","xpf","xpg","xph","xpi","xpj","xpk","xpl","xpm","xpn","xpo","xpp","xpq","xpr","xps","xpt","xpu","xpv","xpw","xpx","xpy","xpz","xqa","xqt","xra","xrb","xrd","xre","xrg","xri","xrm","xrn","xrq","xrr","xrt","xru","xrw","xsa","xsb","xsc","xsd","xse","xsh","xsi","xsj","xsl","xsm","xsn","xso","xsp","xsq","xsr","xss","xsu","xsv","xsy","xta","xtb","xtc","xtd","xte","xtg","xth","xti","xtj","xtl","xtm","xtn","xto","xtp","xtq","xtr","xts","xtt","xtu","xtv","xtw","xty","xtz","xua","xub","xud","xug","xuj","xul","xum","xun","xuo","xup","xur","xut","xuu","xve","xvi","xvn","xvo","xvs","xwa","xwc","xwd","xwe","xwg","xwj","xwk","xwl","xwo","xwr","xwt","xww","xxb","xxk","xxm","xxr","xxt","xya","xyb","xyj","xyk","xyl","xyt","xyy","xzh","xzm","xzp"],["yi","yo","yaa","yab","yac","yad","yae","yaf","yag","yah","yai","yaj","yak","yal","yam","yan","yao","yap","yaq","yar","yas","yat","yau","yav","yaw","yax","yay","yaz","yba","ybb","ybd","ybe","ybh","ybi","ybj","ybk","ybl","ybm","ybn","ybo","ybx","yby","ych","ycl","ycn","ycp","yda","ydd","yde","ydg","ydk","yds","yea","yec","yee","yei","yej","yel","yen","yer","yes","yet","yeu","yev","yey","yga","ygi","ygl","ygm","ygp","ygr","ygs","ygu","ygw","yha","yhd","yhl","yhs","yia","yif","yig","yih","yii","yij","yik","yil","yim","yin","yip","yiq","yir","yis","yit","yiu","yiv","yix","yiy","yiz","yka","ykg","yki","ykk","ykl","ykm","ykn","yko","ykr","ykt","yku","yky","yla","ylb","yle","ylg","yli","yll","ylm","yln","ylo","ylr","ylu","yly","yma","ymb","ymc","ymd","yme","ymg","ymh","ymi","ymk","yml","ymm","ymn","ymo","ymp","ymq","ymr","yms","ymt","ymx","ymz","yna","ynd","yne","yng","ynh","ynk","ynl","ynn","yno","ynq","yns","ynu","yob","yog","yoi","yok","yol","yom","yon","yos","yot","yox","yoy","ypa","ypb","ypg","yph","ypk","ypm","ypn","ypo","ypp","ypz","yra","yrb","yre","yri","yrk","yrl","yrm","yrn","yro","yrs","yrw","yry","ysc","ysd","ysg","ysl","ysm","ysn","yso","ysp","ysr","yss","ysy","yta","ytl","ytp","ytw","yty","yua","yub","yuc","yud","yue","yuf","yug","yui","yuj","yuk","yul","yum","yun","yup","yuq","yur","yut","yuu","yuw","yux","yuy","yuz","yva","yvt","ywa","ywg","ywl","ywn","ywq","ywr","ywt","ywu","yww","yxa","yxg","yxl","yxm","yxu","yxy","yyr","yyu","yyz","yzg","yzk"],["za","zh","zu","zaa","zab","zac","zad","zae","zaf","zag","zah","zai","zaj","zak","zal","zam","zao","zap","zaq","zar","zas","zat","zau","zav","zaw","zax","zay","zaz","zba","zbc","zbe","zbl","zbt","zbu","zbw","zca","zch","zdj","zea","zeg","zeh","zen","zga","zgb","zgh","zgm","zgn","zgr","zhb","zhd","zhi","zhn","zhw","zhx","zia","zib","zik","zil","zim","zin","zir","ziw","ziz","zka","zkb","zkd","zkg","zkh","zkk","zkn","zko","zkp","zkr","zkt","zku","zkv","zkz","zla","zle","zlj","zlm","zln","zlq","zls","zlw","zma","zmb","zmc","zmd","zme","zmf","zmg","zmh","zmi","zmj","zmk","zml","zmm","zmn","zmo","zmp","zmq","zmr","zms","zmt","zmu","zmv","zmw","zmx","zmy","zmz","zna","znd","zne","zng","znk","zns","zoc","zoh","zom","zoo","zoq","zor","zos","zpa","zpb","zpc","zpd","zpe","zpf","zpg","zph","zpi","zpj","zpk","zpl","zpm","zpn","zpo","zpp","zpq","zpr","zps","zpt","zpu","zpv","zpw","zpx","zpy","zpz","zqe","zra","zrg","zrn","zro","zrp","zrs","zsa","zsk","zsl","zsm","zsr","zsu","zte","ztg","ztl","ztm","ztn","ztp","ztq","zts","ztt","ztu","ztx","zty","zua","zuh","zum","zun","zuy","zwa","zxx","zyb","zyg","zyj","zyn","zyp","zza","zzj"]],a=function(){function e(){}return e.isBcp47=function(e){return/^(([a-zA-Z]{2,3}(-[a-zA-Z](-[a-zA-Z]{3}){0,2})?|[a-zA-Z]{4}|[a-zA-Z]{5,8})(-[a-zA-Z]{4})?(-([a-zA-Z]{2}|[0-9]{3}))?(-([0-9a-zA-Z]{5,8}|[0-9][a-zA-Z]{3}))*(-[0-9a-wy-zA-WY-Z](-[a-zA-Z0-9]{2,8})+)*(-x(-[a-zA-Z0-9]{1,8})+)?|x(-[a-zA-Z0-9]{1,8})+|(en-GB-oed|i-ami|i-bnn|i-default|i-enochian|i-hak|i-klingon|i-lux|i-mingo|i-navajo|i-pwn|i-tao|i-tay|i-tsu|sgn-BE-FR|sgn-BE-NL|sgn-CH-DE|art-lojban|cel-gaulish|no-bok|no-nyn|zh-guoyu|zh-hakka|zh-min|zh-min-nan|zh-xiang))$/.test(e)},e.validPrimaryLang=function(e){var t=e.toLowerCase();return t.includes("-")&&(t=t.split("-")[0]),!!t.match(/[a-z]{2,3}/)&&(3===t.length&&"q"===t.charAt(0)&&t.charCodeAt(1)>=97&&t.charCodeAt(1)<=116&&t.charCodeAt(2)>=97&&t.charCodeAt(2),i[t.charCodeAt(0)-97].includes(t))},e.matchPrimaryLang=function(e,t){var i=e;i.includes("-")&&(i=i.split("-")[0]);var a=t;return a.includes("-")&&(a=a.split("-")[0]),i.toLowerCase()===a.toLowerCase()},e}();t.LangUtil=a},3103(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.CommonMapper=void 0;var a=i(3864),n=function(){function e(){this.hierarchyRole=null,this.hierarchyPath=null,this.hierarchyResults=null}return e.prototype.getBounds=function(e){return null},e.prototype.reset=function(e){this.hierarchyRole=[],this.hierarchyResults=[],this.hierarchyPath=[{rolePath:"",roleCount:{}}];for(var t=[],i=a.DOMWalker.parentNode(e);i&&9!=i.nodeType;)t.push(i),i=a.DOMWalker.parentNode(i);for(var n=0,l=t=t.reverse();n<l.length;n++){for(var r=l[n],o=[],s=r.previousSibling;s;)o.push(s),s=s.previousSibling;for(var u=0,d=o=o.reverse();u<d.length;u++){var c=d[u];this.pushHierarchy(c),this.popHierarchy()}this.pushHierarchy(r)}},e.prototype.pushHierarchy=function(e){var t=this.getRole(e)||null;if(this.hierarchyRole.push(t),null!==t){var i=this.hierarchyPath[this.hierarchyPath.length-1];i.roleCount[t]=(i.roleCount[t]||0)+1,this.hierarchyPath.push({rolePath:i.rolePath+"/"+t+"["+i.roleCount[t]+"]",roleCount:{}})}var a={};1===e.nodeType&&(a=this.getAttributes(e)),this.hierarchyResults.push({node:e,namespace:this.getNamespace(),role:t,attributes:a,rolePath:this.hierarchyPath[this.hierarchyPath.length-1].rolePath,bounds:this.getBounds(e)})},e.prototype.popHierarchy=function(){null!==this.hierarchyRole.pop()&&this.hierarchyPath.pop(),this.hierarchyResults.pop()},e.prototype.openScope=function(e){return null===this.hierarchyRole&&this.reset(e),this.pushHierarchy(e),this.hierarchyResults},e.prototype.closeScope=function(e){for(var t=[],i=0,a=this.hierarchyResults;i<a.length;i++){var n=a[i];t.push(n)}return t[t.length-1].role="/"+t[t.length-1].role,this.popHierarchy(),t},e}();t.CommonMapper=n},920(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.Context=t.PartInfo=t.AttrInfo=void 0;var i=function(){function e(e,t,i,a){if(this.inclusive=e,this.attr=t,this.eq=i,this.value=a,!e&&void 0!==i&&i.length>0)throw new Error("Cannot have !attr"+i+" context");if(e&&void 0!==i&&i.length>0&&(void 0===a||0===a.length))throw new Error("Cannot have equivalence check without a value")}return e.prototype.matches=function(e){var t=this,i=e.attributes;if(t.attr in i){if(t.inclusive){if(t.eq){var a=i[t.attr];if("="===t.eq)return t.value===a;if("!="===t.eq)return t.value!==a;if("~"===t.eq)return t.value===a;if("!~"===t.eq)return t.value!==a;throw new Error("Context equivalence operator not supported")}return!0}return!1}return!t.inclusive},e}();t.AttrInfo=i;var a=function(){function e(e,t,i,a,n){if(this.inclusive=e,this.namespace=t,this.role=i,this.attrs=a,this.connector=n,"*"===i&&!e)throw new Error("!* context not supported")}return e.prototype.matches=function(e,t){var i=this,a=i.namespace in e&&e[i.namespace][t]&&(e[i.namespace][t].role===i.role||"none"!==e[i.namespace][t].role&&"*"===i.role);if(!a||"*"!==i.role||"dom"!==i.namespace||"#text"!==e[i.namespace][t].role&&"/#text"!==e[i.namespace][t].role||(a=!1),i.inclusive&&!a)return!1;if(!i.inclusive&&!a)return!0;for(var n=i.attrs,l=e[i.namespace][t],r=!0,o=0,s=n;o<s.length;o++){var u=s[o];r=r&&u.matches(l)}return i.inclusive||(r=!r),r},e}();t.PartInfo=a;var n=function(){function e(e){this.contextInfo=[];for(var t=[],n=0,l=e.match(/!?[/a-zA-Z:0-9*\-_]+(\[[^\]]+\])*[ >+~]?/g);n<l.length;n++){for(var r=l[n].match(/(!?)([/a-zA-Z:0-9*\-_]+)((\[[^\]]+\])*)([ >+~]?)/),o=[],s=0,u=r[3].match(/\[([^\]]+)\]/g)||[];s<u.length;s++){var d=u[s].match(/\[(!?)([a-z:A-Z*\-_]+)(!?[=~])?([^\]]+)?\]/);o.push(new i("!"!==d[1],d[2].toLowerCase(),d[3],d[4]))}r[2]=r[2].toLowerCase();var c=r[2].split(":"),m="!"!==r[1],p=c.shift(),h=c.join(":"),g=new a(m,p,h,o,r[r.length-1]);t.push(g)}this.contextInfo=t}return e.cleanContext=function(e){return(e=(e=(e=(e=(e=e.toLowerCase().trim()).replace(/ +!/g," !")).replace(/ +([>+~,])/g,"$1")).replace(/([>+~,]) +/g,"$1")).replace(/ +/g," ")).trim()},e.parse=function(t){for(var i=e.splitMultiple(e.cleanContext(t)),a=[],n=0;n<i.length;++n){var l=new e(i[n]);a.push(l)}return a},e.splitMultiple=function(e){var t=[];if(e)if(-1===e.indexOf(","))t.push(e);else for(var i=0,a=e.split(",");i<a.length;i++){var n=a[i];t.push(n)}return t},e}();t.Context=n},7301(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.Engine=void 0;var a=i(3864),n=i(920),l=i(4516),r=i(7507),o=i(1686),s=i(4566),u=i(461),d=i(3946),c=function(){function e(e,t){this.rule=e,this.parsedInfo=t,this.ns=this.parsedInfo.contextInfo[this.parsedInfo.contextInfo.length-1].namespace,l.Config.DEBUG&&console.log("Added Rule:",e.id,JSON.stringify(this.parsedInfo))}return e.convertNodeToSnippet=function(e){var t="";t+="<"+e.nodeName.toLowerCase();var i=e.attributes;if(null!=i)for(var a=i.length-1;a>=0;a--)"data-namewalk"!==i[a].name&&(t+=" "+i[a].name+'="'+i[a].value+'"');return t+">"},e.convertNodeToSource=function(e,t){if(void 0===t&&(t=!1),!t||!e)return null;var i="ibm-a11y-debug",n=function(e){return e&&"end"!==e.toLowerCase()?{found:!0,stop:!1,source:e}:{found:!0,stop:!0}},l=function(e){if(!e)return{found:!1};var t=null;if(e.nodeType===Node.COMMENT_NODE)t=e.nodeValue;else if(e.nodeType===Node.ELEMENT_NODE)for(var a=e.firstChild;a;){if(a.nodeType!==Node.TEXT_NODE){if(a.nodeType===Node.COMMENT_NODE){t=a.nodeValue;break}break}if(a.nodeValue&&a.nodeValue.trim().length>0)break;a=a.nextSibling}if(null!==t){var l=t.trim();if(l===i||l.startsWith(i+":")||l.startsWith(i+" ")||l.startsWith(i+"\t")){var r=l.substring(14).trimStart(),o=r.startsWith(":")?r.substring(1).trim():r.trim();return n(o)}}return{found:!1}},r=function(e){if(e.nodeType!==Node.ELEMENT_NODE)return{found:!1};var t=e.getAttribute(i);return null===t?{found:!1}:n(t.trim())},o=r(e);return o.found?o.stop?null:o.source:function(e){for(var t=e;t;){for(var i=a.DOMWalker.previousSiblingNotOwnedBySlot(t);i;){var n=l(i);if(n.found)return n.stop?null:n.source;i=a.DOMWalker.previousSiblingNotOwnedBySlot(i)}var o=a.DOMWalker.parentNode(t);if(!o||o.nodeType===Node.DOCUMENT_NODE)return null;var s=r(o);if(s.found)return s.stop?null:s.source;t=o}return null}(e)},e.prototype.run=function(t,i,a,n){var l,r=(new Date).getTime();try{l=this.rule.run(i,a,n)}catch(e){var o=e;throw console.error("RULE EXCEPTION:",this.rule.id,i.dom.rolePath,o.stack),e}var s=(new Date).getTime();l||(l=[]),l instanceof Array||(l=[l]);for(var u=[],d=0,c=l;d<c.length;d++){var m=c[d],p=t.getMessage(this.rule.id,m.reasonId,m.messageArgs),h={};for(var g in i)h[g]=i[g].rolePath;var b=this.rule.id.replace(/^(.*)\$\$\d+$/,"$1");u.push({ruleId:b,value:m.value,node:i.dom.node,path:h,ruleTime:s-r,reasonId:m.reasonId,message:p,messageArgs:m.messageArgs,apiArgs:m.apiArgs,bounds:i.dom.bounds,snippet:e.convertNodeToSnippet(i.dom.node),source:e.convertNodeToSource(i.dom.node,t.isSourceMapEnabled())})}return u},e}(),m=function(){function e(){this.mappers={},this.ruleMap={},this.wrappedRuleMap={},this.nlsMap={},this.helpMap={},this.sourceMapEnabled=!1,this.inclRules={},this.exclRules={},this.addMapper(new r.DOMMapper)}return e.getLanguages=function(){var e="undefined"!=typeof process&&void 0===process.nodeType&&process.env,t="en-US";return e&&(t=(t=e.LANG||e.LANGUAGE||e.LC_ALL||e.LC_MESSAGES)&&t.length>0?t.split(".")[0].replace(/_/g,"-"):"en-US"),"undefined"!=typeof navigator&&navigator.languages||[t]},e.prototype.run=function(e,t){if(null===e)return Promise.reject("null document");9===e.nodeType&&(e=e.documentElement),e.ownerDocument&&(e.ownerDocument.PT_CHECK_HIDDEN_CONTENT=!1);var i=s.CacheUtil.clearCaches(e),n=new a.DOMWalker(e,!1,e,!0),l={results:[],numExecuted:0,ruleTime:0,totalTime:0},r=(new Date).getTime();for(var c in this.mappers)this.mappers[c].reset(e);var m=0,p=-1;do{m++;var h=Math.floor(m/i*100);h>p&&(i>1e4&&console.log("Progress: ".concat(h,"% (").concat(m,"/").concat(i," nodes)")),p=h);var g={};for(var c in this.mappers)n.bEndTag?g[c]=this.mappers[c].closeScope(n.node):g[c]=this.mappers[c].openScope(n.node);if(11!==n.node.nodeType&&(d.VisUtil.isNodeVisible(n.node)||"meta"===n.node.nodeName.toLowerCase()||"style"===n.node.nodeName.toLowerCase()||"datalist"===n.node.nodeName.toLowerCase()||"param"===n.node.nodeName.toLowerCase()||!o.DOMUtil.getAncestor(n.node,["body"]))){var b={};for(var _ in g){var f=g[_],v=f[f.length-1];b[_]=v}for(var A={},w=0,y=this.getMatchingRules(g);w<y.length;w++){for(var C=y[w],k=!0,R=0,x=C.rule.dependencies||[];R<x.length;R++)A[x[R]]||(k=!1);if(k){var P=[];(new Date).getTime();try{P=C.run(this,b,t,g)}catch(e){}0===P.length&&(A[C.rule.id]=!0);for(var T=0,U=P;T<U.length;T++){var I=U[T];l.results.push(I),l.ruleTime+=I.ruleTime,l.numExecuted++,I.value[1]===u.eRuleConfidence.PASS&&(A[I.ruleId]=!0)}}}}}while(n.nextNode());return s.CacheUtil.clearCaches(e),l.totalTime=(new Date).getTime()-r,Promise.resolve(l)},e.prototype.enableRules=function(e){for(var t in this.ruleMap)this.ruleMap[t].enabled=!1;for(var i=0,a=e||[];i<a.length;i++)(t=a[i])in this.ruleMap?this.ruleMap[t].enabled=!0:console.warn("WARNING: Rule Id",t,"could not be enabled.")},e.prototype.getRule=function(e){return this.ruleMap[e]},e.prototype.getRulesIds=function(){var e=[];for(var t in this.ruleMap)e.push(t);return e},e.prototype.addRules=function(e){for(var t=0,i=e;t<i.length;t++){var a=i[t];this.addRule(a,!0)}this._sortRules()},e.prototype.addRule=function(e,t){var i=n.Context.parse(e.context),a=0,l=e.id;if(l in this.ruleMap)console.log("WARNING: Rule",l,"already added to engine. Ignoring...");else{this.ruleMap[l]=e;for(var r=0,o=i;r<o.length;r++){var s=o[r],u=l;a>=1&&(u=l+"$$"+a),++a;var d=new c(e,s);this.wrappedRuleMap[u]=d;var m=d.parsedInfo.contextInfo,p=m[m.length-1],h=p.namespace+":"+p.role;p.inclusive?(this.inclRules[h]=this.inclRules[h]||[],this.inclRules[h].push(d)):(this.exclRules[h]=this.exclRules[h]||[],this.exclRules[h].push(d))}t||this._sortRules()}},e.prototype.enableSourceMap=function(e){this.sourceMapEnabled=e},e.prototype.isSourceMapEnabled=function(){return this.sourceMapEnabled},e.prototype._sortRules=function(){for(var e in this.inclRules)this.inclRules[e].sort(function(e,t){var i=e.rule.dependencies&&e.rule.dependencies.length>0;return t.rule.dependencies&&t.rule.dependencies.length>0&&t.rule.dependencies.includes(e.rule.id)?-1:i&&e.rule.dependencies.includes(t.rule.id)?1:0});for(var e in this.exclRules)this.exclRules[e].sort(function(e,t){var i=e.rule.dependencies&&e.rule.dependencies.length>0;return t.rule.dependencies&&t.rule.dependencies.length>0&&t.rule.dependencies.includes(e.rule.id)?-1:i&&e.rule.dependencies.includes(t.rule.id)?1:0})},e.prototype.addNlsMap=function(e){for(var t in e)this.nlsMap[t]=e[t]},e.prototype.addHelpMap=function(e){for(var t in e)this.helpMap[t]=e[t]},e.prototype.getMessage=function(e,t,i){var a=e.indexOf("$$");if(a>=0&&(e=e.substring(0,a)),!(e in this.nlsMap))return e;var n=this.nlsMap[e][t||0];return n?n.replace(/\{(\d+)\}/g,function(e,t,a){return i[t]}):e+"_"+t},e.prototype.getHelp=function(e,t,i){return i||(i="latest"),"".concat(l.Config.helpRoot,"/").concat(i,"/doc").concat(this.getHelpRel(e,t))},e.prototype.getHelpRel=function(e,t){var i=e.indexOf("$$");return i>=0&&(e=e.substring(0,i)),e in this.helpMap?((t=t||0)in this.helpMap[e]?this.helpMap[e][t||0]:this.helpMap[e][0])||e+"_"+t:e},e.prototype.addMapper=function(e){this.mappers[e.getNamespace()]=e},e.match=function(e,t){var i=e.parsedInfo.contextInfo,a=i.length-1,n=i[a].namespace,l=t[n][t[n].length-1],r=l.node;if(!i[a].matches(t,t[n].length-1))return!1;if(1===i.length)return!0;if(l=t[n=i[0].namespace][t[n].length-1],--a,i.slice(0,i.length-1).some(function(e){return e.namespace!==n}))return console.error("[ERROR] Rule ".concat(e.rule.id," has inconsitent parent namespaces")),!1;for(var o=t[n].length-(l.node.isSameNode(r)?2:1);o>=0&&a>=0;){var s=i[a],u=i[a].matches(t,o);if(">"===s.connector){if(!u)return!1;--a,--o}else{if(" "!==s.connector)throw new Error("Context connector "+s.connector+" is not supported");if(s.inclusive)u&&--a,--o;else{if(!u)return!1;for(var d=!1,c=o-1;!d&&c>=0;--c)d=!i[a].matches(t,c);if(d)return!1;--a}}}return-1===a},e.prototype.getMatchingRules=function(t){var i=[];function a(a){for(var n=0,l=a;n<l.length;n++){var r=l[n];r.rule.enabled&&e.match(r,t)&&i.push(r)}}for(var n in t){var l=n+":"+(t[n].length>0?t[n][t[n].length-1].role:"none");for(var r in l in this.inclRules&&a(this.inclRules[l]),this.exclRules)r!==l&&a(this.exclRules[r]);l!==n+":none"&&(l.startsWith(n+":/")?n+":/*"in this.inclRules&&a(this.inclRules[n+":/*"]):n+":*"in this.inclRules&&a(this.inclRules[n+":*"]))}return this.sortDeps(i)},e.prototype.sortDeps=function(e){for(var t=[],i=0,a=e;i<a.length;i++){var n=a[i];t.push(n)}var l=[],r={},o=!1;do{o=!1;for(var s=0;s<t.length;++s){var u=t[s];if(!(u.rule.id in r)){var d=!0;if(u.rule.dependencies&&u.rule.dependencies.length>0)for(var c=0,m=u.rule.dependencies;c<m.length;c++)m[c]in r||(d=!1);d&&(o=!0,l.push(u),r[u.rule.id]=!0,t.splice(s--,1))}}}while(o);return l},e}();t.Engine=m},4516(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.Config=void 0;var i=function(){function e(){}return e.DEBUG=!1,e.helpRoot="https://able.ibm.com/rules/archives",e}();t.Config=i},7507(e,t,i){var a,n=this&&this.__extends||(a=function(e,t){return a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i])},a(e,t)},function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function i(){this.constructor=e}a(e,t),e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)});Object.defineProperty(t,"__esModule",{value:!0}),t.DOMMapper=void 0;var l=i(3103),r=i(4566),o=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.getRole=function(e){return e.nodeName.toLowerCase()},t.prototype.getNamespace=function(){return"dom"},t.prototype.getAttributes=function(e){var t={};if(1===e.nodeType)for(var i=e,a=0;a<i.attributes.length;++a){var n=i.attributes[a];t[n.name.toLowerCase()]=n.nodeValue}return t},t.prototype.getBounds=function(e){if(1!==e.nodeType)return null;var t=r.CacheUtil.getCache(e,"DOMMapper_Bounds",void 0);if(void 0!==t)return t;var i=1;e.ownerDocument&&e.ownerDocument.defaultView&&e.ownerDocument.defaultView.devicePixelRatio&&(i=e.ownerDocument.defaultView.devicePixelRatio);var a=e.getBoundingClientRect();if(a){var n=e&&e.ownerDocument&&e.ownerDocument.defaultView&&e.ownerDocument.defaultView.scrollX||0,l=e&&e.ownerDocument&&e.ownerDocument.defaultView&&e.ownerDocument.defaultView.scrollY||0,o={left:Math.ceil((a.left+n)*i),top:Math.ceil((a.top+l)*i),height:Math.ceil(a.height*i),width:Math.ceil(a.width*i)};return r.CacheUtil.setCache(e,"DOMMapper_Bounds",o),o}return null},t.prototype.getUnadjustedBounds=function(e){if(1!==e.nodeType)return null;var t=r.CacheUtil.getCache(e,"DOMMapper_UnadjustedBounds",void 0);if(void 0!==t)return t;var i=e.getBoundingClientRect();if(i){var a=e&&e.ownerDocument&&e.ownerDocument.defaultView&&e.ownerDocument.defaultView.scrollX||0,n=e&&e.ownerDocument&&e.ownerDocument.defaultView&&e.ownerDocument.defaultView.scrollY||0,l={left:Math.ceil(i.left+a),top:Math.ceil(i.top+n),height:Math.ceil(i.height),width:Math.ceil(i.width)};return r.CacheUtil.setCache(e,"DOMMapper_UnadjustedBounds",l),l}return null},t}(l.CommonMapper);t.DOMMapper=o},1686(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.DOMUtil=void 0;var a=i(3864),n=function(){function e(){}return e.hasParent=function(e,t){for(var i=a.DOMWalker.parentElement(e);i&&!t.includes(i.nodeName);)i=a.DOMWalker.parentElement(i);return!!i},e.getAncestor=function(e,t){for(var i=a.DOMWalker.parentElement(e);i&&!t.includes(i.nodeName.toLowerCase());)i=a.DOMWalker.parentElement(i);return i},e.sameNode=function(e,t){return e===t||(e.isSameNode?e.isSameNode(t):!e.compareDocumentPosition||0===e.compareDocumentPosition(t))},e.cleanWhitespace=function(e){return e.replace(/[ \t\r\n]/g," ").replace(/ +/g," ")},e.cleanSpace=function(e){return e.replace(/ +/g," ")},e.isInSameTable=function(t,i){if(t&&i){var a=["table"],n=e.getAncestor(t,a),l=e.getAncestor(i,a);if(null!==n&&null!=l&&e.sameNode(n,l))return!0}return!1},e.shadowRootNode=function(e){for(var t=e;null!=t&&11!==t.nodeType;)t=t.parentNode;return t},e.objectCopyWithNodeRefs=function(e){if(!e)return e;if("object"!=typeof e)return"function"==typeof e?e:JSON.parse(JSON.stringify(e));if(e instanceof Node||e.nodeType)return e;var t=void 0;if("Array"===e.constructor.name){t=[];for(var i=0,a=e;i<a.length;i++){var n=a[i];t.push(this.objectCopyWithNodeRefs(n))}}else for(var l in t={},e)t[l]=this.objectCopyWithNodeRefs(e[l]);return t},e.getAncestorWithAttribute=function(e,t,i){for(var n=a.DOMWalker.parentNode(e);null!==n;){if(1===n.nodeType&&n.getAttribute(t)===i)return n;n=a.DOMWalker.parentNode(n)}return null},e}();t.DOMUtil=n},3864(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.DOMWalker=void 0;var a=i(3946),n=function(){function e(e,t,i,a,n){this.DEBUGIDX=0,this.indent=0,this.DEBUG=!!n,this.root=i||(e&&e.ownerDocument?e.ownerDocument.documentElement:e),9===this.root.nodeType&&(this.root=this.root.documentElement),this.node=e,9===this.node.nodeType&&(this.node=this.node.documentElement),this.bEndTag=null!=t&&1==t,this.considerHidden=a||!1}return e.prototype.elem=function(){return 1===this.node.nodeType&&this.node||null},e.parentNode=function(e){if(null===e)return null;var t=e.parentNode;return e.slotOwner?t=e.slotOwner:e.ownerElement?t=e.ownerElement:t&&11===t.nodeType&&(t=t.host?t.host:null),t},e.parentElement=function(t){var i=t;do{i=e.parentNode(i)}while(i&&1!==i.nodeType);return i},e.assignSlots=function(e){for(var t=e.querySelectorAll("slot"),i=0;i<t.length;++i)for(var a=t[i],n=a.assignedNodes(),l=0;l<n.length;++l)n[l].slotOwner=a,n[l].slotIndex=l},e.firstChildNotOwnedBySlot=function(e){for(var t=e.firstChild;t&&t.slotOwner;)t=t.nextSibling;return t},e.lastChildNotOwnedBySlot=function(e){for(var t=e.lastChild;t&&t.slotOwner;)t=t.previousSibling;return t},e.nextSiblingNotOwnedBySlot=function(e){for(var t=e.nextSibling;t&&t.slotOwner;)t=t.nextSibling;return t},e.previousSiblingNotOwnedBySlot=function(e){for(var t=e.previousSibling;t&&t.slotOwner;)t=t.previousSibling;return t},e.prototype.atRoot=function(){return!this.node.ownerElement&&(this.root===this.node||(this.root.isSameNode?this.root.isSameNode(this.node):this.root.compareDocumentPosition?0===this.root.compareDocumentPosition(this.node):null===this.node.parentNode))},e.prototype.nextNode=function(){var t=this,i=function(){for(var e="",i=0;i<t.indent;++i)e+=" ";return e},n=this.node.nodeName;if(!this.node)return this.bEndTag=!1,!1;do{if(this.bEndTag){if(this.atRoot())return!1;if(this.node.slotOwner){var l=this.node.slotOwner,r=this.node.slotIndex+1;r<l.assignedNodes().length?(this.node=l.assignedNodes()[r],this.bEndTag=!1):(this.node=l,this.bEndTag=!0)}else if(this.node.ownerElement)this.node=this.node.ownerElement,this.bEndTag=!0;else if(e.nextSiblingNotOwnedBySlot(this.node))this.node=e.nextSiblingNotOwnedBySlot(this.node),this.bEndTag=!1;else{if(!this.node.parentNode)return!1;this.node=this.node.parentNode,this.bEndTag=!0}}else{var o=this.node,s=this.node,u=this.node;if(1===this.node.nodeType&&"IFRAME"===this.node.nodeName.toUpperCase()&&(!this.considerHidden||a.VisUtil.isNodeVisible(o))&&o.contentDocument&&o.contentDocument.documentElement){var d=this.node;this.node=o.contentDocument.documentElement,this.node.ownerElement=d}else 1===this.node.nodeType&&(!this.considerHidden||a.VisUtil.isNodeVisible(s))&&s.shadowRoot&&s.shadowRoot.firstChild?(d=this.node,this.node=s.shadowRoot,this.node.ownerElement=d,e.assignSlots(this.node)):1===this.node.nodeType&&"slot"===s.nodeName.toLowerCase()&&u.assignedNodes().length>0?this.node=u.assignedNodes()[0]:1!==this.node.nodeType&&11!==this.node.nodeType||!e.firstChildNotOwnedBySlot(this.node)?this.bEndTag=!0:this.node=e.firstChildNotOwnedBySlot(this.node)}}while(1!==this.node.nodeType&&11!==this.node.nodeType&&3!==this.node.nodeType||1===this.node.nodeType&&"ACE"===this.node.getAttribute("aChecker"));return this.bEndTag&&(this.indent-=2),this.DEBUG&&console.log(i()+"<".concat(this.bEndTag?"/":"").concat(this.node.nodeName,"> (from ").concat(n,") ").concat(this.DEBUGIDX++)),this.DEBUG&&this.node.slotOwner&&console.log(i()+"slotOwner: ".concat(this.node.slotOwner.nodeName)),this.DEBUG&&this.node.slotIndex&&console.log(i()+"slotIndex: ".concat(this.node.slotIndex)),this.DEBUG&&this.node.ownerElement&&console.log(i()+"ownerElement: ".concat(this.node.ownerElement.nodeName)),this.bEndTag||(this.indent+=2),!0},e.prototype.prevNode=function(){do{if(this.bEndTag){var t=this.node,i=this.node;if(1===this.node.nodeType&&"IFRAME"===this.node.nodeName.toUpperCase()&&(!this.considerHidden||a.VisUtil.isNodeVisible(t))&&t.contentDocument&&t.contentDocument.documentElement){var n=this.node;this.node=t.contentDocument.documentElement,this.node.ownerElement=n}else if(1===this.node.nodeType&&(!this.considerHidden||a.VisUtil.isNodeVisible(i))&&i.shadowRoot&&i.shadowRoot.lastChild)n=this.node,this.node=i.shadowRoot,this.node.ownerElement=n,e.assignSlots(this.node);else if(1===this.node.nodeType&&"slot"===i.nodeName.toLowerCase()&&i.assignedNodes().length>0){var l=i;this.node=l.assignedNodes()[l.assignedNodes().length-1]}else 1!==this.node.nodeType&&11!==this.node.nodeType||!e.lastChildNotOwnedBySlot(this.node)?this.bEndTag=!1:this.node=e.lastChildNotOwnedBySlot(this.node)}else{if(this.atRoot())return!1;if(this.node.slotOwner){var r=this.node.slotOwner,o=this.node.slotIndex-1;o>=0?(this.node=r.assignedNodes()[o],this.bEndTag=!0):(this.node=r,this.bEndTag=!1)}else if(e.previousSiblingNotOwnedBySlot(this.node))this.node=e.previousSiblingNotOwnedBySlot(this.node),this.bEndTag=!0;else if(this.node.ownerElement)this.node=this.node.ownerElement,this.bEndTag=!1;else{if(!this.node.parentNode)return!1;this.node=this.node.parentNode,this.bEndTag=!1}}}while(1!==this.node.nodeType&&11!==this.node.nodeType&&3!==this.node.nodeType||1===this.node.nodeType&&"ACE"===this.node.getAttribute("aChecker"));return!0},e}();t.DOMWalker=n},8601(e,t){var i,a,n;Object.defineProperty(t,"__esModule",{value:!0}),t.eGuidelineType=t.eGuidelineCategory=t.eToolkitLevel=void 0,(n=t.eToolkitLevel||(t.eToolkitLevel={})).LEVEL_ONE="1",n.LEVEL_TWO="2",n.LEVEL_THREE="3",n.LEVEL_FOUR="4",(a=t.eGuidelineCategory||(t.eGuidelineCategory={})).ACCESSIBILITY="Accessibility",a.DESIGN="Design",a.OTHER="Other",(i=t.eGuidelineType||(t.eGuidelineType={})).DEFAULT="default",i.EXTENSION="extension"},461(e,t,i){var a,n;Object.defineProperty(t,"__esModule",{value:!0}),t.eRulesetType=t.eRuleCategory=t.eToolkitLevel=t.RuleManual=t.RulePotential=t.RuleFail=t.RuleRender=t.RulePass=t.eRulePolicy=t.eRuleConfidence=void 0,function(e){e.PASS="PASS",e.FAIL="FAIL",e.POTENTIAL="POTENTIAL",e.MANUAL="MANUAL"}(a=t.eRuleConfidence||(t.eRuleConfidence={})),function(e){e.VIOLATION="VIOLATION",e.RECOMMENDATION="RECOMMENDATION",e.INFORMATION="INFORMATION"}(n=t.eRulePolicy||(t.eRulePolicy={})),t.RulePass=function(e,t,i){if(null==e)throw new Error("Reason ID must be defined");return{value:[n.INFORMATION,a.PASS],reasonId:e,messageArgs:t||[],apiArgs:i||[]}},t.RuleRender=function(e,t,i){if(null==e)throw new Error("Reason ID must be defined");return{value:[n.INFORMATION,a.PASS],reasonId:0,messageArgs:t||[],apiArgs:i||[]}},t.RuleFail=function(e,t,i){if(null==e)throw new Error("Reason ID must be defined");return{value:[n.INFORMATION,a.FAIL],reasonId:e,messageArgs:t||[],apiArgs:i||[]}},t.RulePotential=function(e,t,i){if(null==e)throw new Error("Reason ID must be defined");return{value:[n.INFORMATION,a.POTENTIAL],reasonId:e,messageArgs:t||[],apiArgs:i||[]}},t.RuleManual=function(e,t,i){if(null==e)throw new Error("Reason ID must be defined");return{value:[n.INFORMATION,a.MANUAL],reasonId:e,messageArgs:t||[],apiArgs:i||[]}};var l=i(8601);Object.defineProperty(t,"eToolkitLevel",{enumerable:!0,get:function(){return l.eToolkitLevel}});var r=i(8601);Object.defineProperty(t,"eRuleCategory",{enumerable:!0,get:function(){return r.eGuidelineCategory}});var o=i(8601);Object.defineProperty(t,"eRulesetType",{enumerable:!0,get:function(){return o.eGuidelineType}})},7412(e,t,i){var a=this&&this.__createBinding||(Object.create?function(e,t,i,a){void 0===a&&(a=i);var n=Object.getOwnPropertyDescriptor(t,i);n&&!("get"in n?!t.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,a,n)}:function(e,t,i,a){void 0===a&&(a=i),e[a]=t[i]}),n=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),l=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&a(t,e,i);return n(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.Checker=void 0;var r=i(461),o=i(7301),s=i(9955),u=i(6160),d=l(i(591)),c=i(8601),m=[],p={},h={};!function(){var e=JSON.parse(JSON.stringify(o.Engine.getLanguages()));for(var t in e.push("en-US"),d){var i=d[t];m.push(i);for(var a=e.length-1;a>=0;--a){var n=e[a];if(n in i.messages&&(p[i.id]=i.messages[n],p[i.id][0]=p[i.id].group),n in i.help){for(var l in h[i.id]={},i.help[n])h[i.id][l]="/".concat(n,"/").concat(i.help[n][l]);p[i.id][0]=p[i.id].group}}for(var r=0,s=i.rulesets;r<s.length;r++)for(var c=s[r],g=0,b=u.a11yRulesets;g<b.length;g++){var _=b[g];if(("string"==typeof c.id?[c.id]:c.id).includes(_.id))for(var f=0,v=_.checkpoints;f<v.length;f++){var A=v[f];("string"==typeof c.num?[c.num]:c.num).includes(A.num)&&(A.rules=A.rules||[],A.rules.push({id:i.id,reasonCodes:c.reasonCodes,level:c.level,toolkitLevel:c.toolkitLevel}))}}}}();var g=function(){function e(){this.guidelines=[],this.rulesets=this.guidelines,this.rulesetIds=[],this.rulesetRules={},this.ruleLevels={},this.ruleReasonLevels={},this.ruleCategory={};var e=this.engine=new o.Engine;e.addMapper(new s.ARIAMapper),e.addRules(m),e.addNlsMap(p),e.addHelpMap(h);for(var t=0,i=u.a11yRulesets;t<i.length;t++){var a=i[t];this.addRuleset(a)}}return e.prototype.addGuideline=function(e){e.id in this.rulesetRules&&this.removeGuideline(e.id),this.guidelines.push(e),this.rulesetIds.push(e.id);for(var t=[],i=0,a=e.checkpoints;i<a.length;i++){var n=a[i];n.rules=n.rules||[];for(var l=0,r=n.rules;l<r.length;l++){var o=r[l];if(!1!==o.enabled){t.push(o.id),this.ruleReasonLevels[o.id]=this.ruleReasonLevels[o.id]||{},this.ruleReasonLevels[o.id][e.id]=this.ruleReasonLevels[o.id][e.id]||{};var s=o.reasonCodes?o.reasonCodes.join("--"):"None";this.ruleReasonLevels[o.id][e.id][s]=o.level,this.ruleCategory[o.id]=this.ruleCategory[o.id]||{},this.ruleCategory[o.id][e.id]=e.category}}}this.rulesetRules[e.id]=t},e.prototype.enableRule=function(e){for(var t=0,i=this.getGuidelines();t<i.length;t++){for(var a=i[t],n=!1,l=0,r=a.checkpoints;l<r.length;l++)for(var o=0,s=r[l].rules;o<s.length;o++){var u=s[o];!1===u.enabled&&(n=!0,delete u.enabled)}n&&this.addGuideline(a)}},e.prototype.disableRule=function(e){for(var t=0,i=this.getGuidelines();t<i.length;t++){for(var a=i[t],n=!1,l=0,r=a.checkpoints;l<r.length;l++)for(var o=0,s=r[l].rules;o<s.length;o++){var u=s[o];!1!==u.enabled&&(n=!0,u.enabled=!1)}n&&this.addGuideline(a)}},e.prototype.removeGuideline=function(e){e in this.rulesetRules&&(delete this.rulesetRules[e],this.rulesets=this.guidelines=this.guidelines.filter(function(t){return t.id!==e}),this.rulesetIds=this.getGuidelineIds())},e.prototype.getGuidelines=function(){return JSON.parse(JSON.stringify(this.guidelines))},e.prototype.getGuidelineIds=function(){return this.guidelines.map(function(e){return e.id})},e.prototype.addRuleset=function(e){this.addGuideline(e)},e.prototype.enableSourceMap=function(e){this.engine.enableSourceMap(e)},e.prototype.isSourceMapEnabled=function(){return this.engine.isSourceMapEnabled()},e.prototype.check=function(e,t){var i=[];if(t){"string"==typeof t&&(t=[t]);for(var a=0,n=t;a<n.length;a++){var l=n[a];l in this.rulesetRules&&(i=i.concat(this.rulesetRules[l]))}}else i=this.engine.getRulesIds();this.engine.enableRules(i);var r=this;return this.engine.run(e).then(function(e){e.nls={};for(var i=0,a=e.results;i<a.length;i++){var n=a[i];n.ruleId in p&&(e.nls[n.ruleId]=e.nls[n.ruleId]||{0:p[n.ruleId][0]},n.reasonId in p[n.ruleId]&&(e.nls[n.ruleId][n.reasonId]=p[n.ruleId][n.reasonId]));var l=n.reasonId?n.reasonId:"None";n.value[0]=r.getReasonLevel(t,n.ruleId,l),n.category=r.getCategory(t,n.ruleId),delete n.path.css}return e})},e.prototype.getLevel=function(e,t){if(!e)return r.eRulePolicy.INFORMATION;var i=this.ruleLevels[t],a=null;if(e){if(!(t in this.ruleLevels))throw new Error("Rule triggered for which we have no rule level information: "+t);for(var n=0,l=e;n<l.length;n++){var o=l[n];o in i&&(i[o]===r.eRulePolicy.VIOLATION?a=r.eRulePolicy.VIOLATION:i[o]===r.eRulePolicy.RECOMMENDATION&&null===a?a=r.eRulePolicy.RECOMMENDATION:null===a&&(a=r.eRulePolicy.INFORMATION))}}if(null===a)throw new Error("Rule triggered for which we have no rule level information: "+t);return a},e.prototype.getReasonLevel=function(e,t,i){if(!e)return r.eRulePolicy.INFORMATION;var a=this.ruleReasonLevels[t],n=null;if(e){if(!(t in this.ruleReasonLevels))throw new Error("Rule triggered for which we have no rule level information "+t);for(var l=function(e){if(e in a){var t=new RegExp("(^|--)".concat(i,"($|--)"));Object.keys(a[e]).forEach(function(i){var l=null;"None"===i?l=a[e].None:t.test(i)&&(l=a[e][i]),null!==l&&(l===r.eRulePolicy.VIOLATION?n=r.eRulePolicy.VIOLATION:l===r.eRulePolicy.RECOMMENDATION&&null===n?n=r.eRulePolicy.RECOMMENDATION:null===n&&(n=r.eRulePolicy.INFORMATION))}),null===n&&(n=r.eRulePolicy.INFORMATION)}},o=0,s=e;o<s.length;o++)l(s[o])}if(null===n)throw new Error("Rule triggered for which we have no rule level information: "+t);return n},e.prototype.getCategory=function(e,t){var i=this.ruleCategory[t];if(!(t in this.ruleCategory))return c.eGuidelineCategory.OTHER;e||(e=this.getGuidelineIds());for(var a=0,n=e;a<n.length;a++){var l=n[a];if(l in i)return i[l]}return c.eGuidelineCategory.OTHER},e}();t.Checker=g},2297(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.a_target_warning=void 0;var a=i(7139),n=i(3946),l=i(5279),r=i(461),o=i(461);t.a_target_warning={id:"a_target_warning",context:"dom:a[target],dom:area[target],dom:base[target]",refactor:{WCAG20_A_TargetAndText:{Pass_0:"pass",Potential_1:"potential_warn"}},help:{"en-US":{group:"a_target_warning.html",pass:"a_target_warning.html",potential_warn:"a_target_warning.html"}},messages:{"en-US":{group:"Users should be warned in advance if their input action will open a new window",pass:"The user is warned in advance that the input action opens a new window",potential_warn:"Inform the user when their input action will open a new window"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"3.2.2",level:o.eRulePolicy.RECOMMENDATION,toolkitLevel:o.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var o=e.dom.node;if(n.VisUtil.isNodeHiddenFromAT(o)&&!a.CommonUtil.isTabbable(o))return null;var s={paramWinText:{value:["new window","new tab"],type:"array"}},u=o.getAttribute("target"),d="_parent"==u||"_self"==u||"_top"==u||null!=a.CommonUtil.getFrameByName(o,u);if(!d){var c=a.CommonUtil.getInnerText(o);if(o.hasAttribute("title")&&(c+=" "+o.getAttribute("title")),o.hasAttribute("aria-describedby"))for(var m=0,p=o.getAttribute("aria-describedby").trim().split(/\s+/);m<p.length;m++){var h=p[m],g=l.FragmentUtil.getById(o,h);if(g){var b=a.CommonUtil.getInnerText(g);b&&b.trim().length>0&&(c+=" "+b)}}for(var _=0;!d&&_<s.paramWinText.value.length;++_)-1!=c.indexOf(s.paramWinText.value[_])&&(d=!0)}return d?(0,r.RulePass)("pass"):(0,r.RulePotential)("potential_warn")}}},4401(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.a_text_purpose=void 0;var a=i(461),n=i(7139),l=i(3946),r=i(461),o=i(1950);t.a_text_purpose={id:"a_text_purpose",context:"aria:link,aria:doc-biblioref",refactor:{WCAG20_A_HasText:{Pass_0:"pass",Fail_1:"fail_acc_name"}},help:{"en-US":{group:"a_text_purpose.html",pass:"a_text_purpose.html",fail_acc_name:"a_text_purpose.html"}},messages:{"en-US":{group:"Hyperlinks must have an accessible name for their purpose",pass:"Hyperlink has a description of its purpose",fail_acc_name:"Hyperlink has no link text, label or image with a text alternative"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:["2.4.4","4.1.2"],level:r.eRulePolicy.VIOLATION,toolkitLevel:r.eToolkitLevel.LEVEL_TWO}],act:"c487ae",run:function(e,t){var i=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(i)||n.CommonUtil.isNodeDisabled(i))return null;var r=o.AccNameUtil.computeAccessibleName(i);return r&&r.name&&r.name.trim().length>0||n.CommonUtil.nonTabableChildCheck(i)?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_acc_name")}}},4546(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.applet_alt_exists=void 0;var a=i(7139),n=i(3946),l=i(461),r=i(461);t.applet_alt_exists={id:"applet_alt_exists",context:"dom:applet",refactor:{WCAG20_Applet_HasAlt:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{group:"applet_alt_exists.html",Pass_0:"applet_alt_exists.html",Fail_1:"applet_alt_exists.html",Fail_2:"applet_alt_exists.html",Fail_3:"applet_alt_exists.html"}},messages:{"en-US":{group:"<applet> elements must provide an 'alt' attribute and an alternative description",Pass_0:"Rule Passed",Fail_1:"An <applet> element does not have an 'alt' attribute that provides a short text alternative",Fail_2:"The 'alt' attribute value for an <applet> element duplicates the 'code' attribute",Fail_3:"An <applet> element provides alternative text, but does not provide inner content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"1.1.1",level:r.eRulePolicy.VIOLATION,toolkitLevel:r.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var r=e.dom.node;if(n.VisUtil.isNodeHiddenFromAT(r))return null;if(a.CommonUtil.attributeNonEmpty(r,"alt")){var o=r.getAttribute("alt").trim();return r.hasAttribute("code")&&o==r.getAttribute("code").trim()?(0,l.RuleFail)("Fail_2"):a.CommonUtil.hasInnerContentHidden(r)?(0,l.RulePass)("Pass_0"):(0,l.RuleFail)("Fail_3")}return(0,l.RuleFail)("Fail_1")}}},9292(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.application_content_accessible=void 0;var a=i(7011),n=i(3946),l=i(461),r=i(461);t.application_content_accessible={id:"application_content_accessible",context:"aria:application",refactor:{HAAC_Application_Role_Text:{0:"HAAC_Application_Role_Text.html",Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{0:"application_content_accessible.html",Pass_0:"application_content_accessible.html",Potential_1:"application_content_accessible.html"}},messages:{"en-US":{group:'Non-decorative static text and image content within an element with "application" role must be accessible',Pass_0:"Rule Passed",Potential_1:'Verify that the non-decorative static text and image content within an element with "application" role are accessible'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:["1.1.1","2.1.1"],level:r.eRulePolicy.VIOLATION,toolkitLevel:r.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){for(var r=!0,o=e.dom.node.childNodes,s=0;r&&s<o.length;s++)1===o[s].nodeType?n.VisUtil.isNodeVisible(o[s])&&(r=a.AriaUtil.hasRoleInSemantics(o[s],"document")||a.AriaUtil.hasRoleInSemantics(o[s],"article")):3===o[s].nodeType&&(r=0===o[s].nodeValue.trim().length);return r?(0,l.RulePass)("Pass_0"):(0,l.RulePotential)("Potential_1")}}},9605(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.area_alt_exists=void 0;var a=i(7139),n=i(3946),l=i(461),r=i(461);t.area_alt_exists={id:"area_alt_exists",context:"dom:area",refactor:{WCAG20_Area_HasAlt:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"area_alt_exists.html",Pass_0:"area_alt_exists.html",Fail_1:"area_alt_exists.html"}},messages:{"en-US":{group:"<area> elements in an image map must have a text alternative",Pass_0:"Rule Passed",Fail_1:"<area> element in an image map has no text alternative"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"1.1.1",level:r.eRulePolicy.VIOLATION,toolkitLevel:r.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var r=e.dom.node;return n.VisUtil.isNodeHiddenFromAT(r)?null:a.CommonUtil.attributeNonEmpty(r,"alt")?(0,l.RulePass)("Pass_0"):(0,l.RuleFail)("Fail_1")}}},3987(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_accessiblename_exists=void 0;var a=i(461),n=i(461),l=i(7011),r=i(3946),o=i(1950),s=i(9910);t.aria_accessiblename_exists={id:"aria_accessiblename_exists",context:"aria:columnheader, aria:heading, aria:rowheader, aria:graphics-document,aria:graphics-symbol, aria:img,aria:image, doc-backlink, doc-biblioentry, doc-biblioref, doc-glossref, doc-noteref, doc-pagebreak, doc-example",help:{"en-US":{pass:"aria_accessiblename_exists.html",fail_no_accessible_name:"aria_accessiblename_exists.html",fail_no_accessible_name_image:"aria_accessiblename_exists.html",group:"aria_accessiblename_exists.html"}},messages:{"en-US":{pass:"An accessible name is provided for the element",fail_no_accessible_name:'Element <{0}> with "{1}" role has no accessible name',fail_no_accessible_name_image:'Element <{0}> with "{1}" role has no accessible name',group:"Elements with certain roles should have accessible names"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE,reasonCodes:["fail_no_accessible_name"]},{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["ARIA"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE,reasonCodes:["fail_no_accessible_name_image"]}],act:[{"23a2a8":{fail_no_accessible_name_image:"fail"}}],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var u=n.nodeName.toLocaleLowerCase();if("svg"!==u&&"img"!==u){if("table"===u&&n.firstElementChild&&"caption"===n.firstElementChild.nodeName.toLowerCase()&&n.firstElementChild.textContent&&n.firstElementChild.textContent.trim().length>0)return(0,a.RulePass)("pass");var d=l.AriaUtil.getRolesUndefinedByAria(n);if(d&&d.length>0)return null;var c=l.AriaUtil.getDeprecatedAriaRoles(n);if(c&&c.length>0)return null;var m=l.AriaUtil.getDeprecatedAriaAttributes(n);if(m&&m.length>0)return null;var p=l.AriaUtil.getResolvedRole(n);if(!p||!s.ARIADefinitions.designPatterns[p]||!s.ARIADefinitions.designPatterns[p].nameRequired)return null;var h=o.AccNameUtil.computeAccessibleName(n);return h&&h.name&&0!==h.name.trim().length?(0,a.RulePass)("pass"):"img"===p||"image"===p?(0,a.RuleFail)("fail_no_accessible_name_image",[n.nodeName.toLowerCase(),p]):(0,a.RuleFail)("fail_no_accessible_name",[n.nodeName.toLowerCase(),p])}}}},8631(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_activedescendant_tabindex_valid=void 0;var a=i(461),n=i(461),l=i(7139);t.aria_activedescendant_tabindex_valid={id:"aria_activedescendant_tabindex_valid",context:"dom:*[aria-activedescendant]",refactor:{Rpt_Aria_InvalidTabindexForActivedescendant:{pass:"pass",Fail_1:"Fail_1"}},help:{"en-US":{pass:"aria_activedescendant_tabindex_valid.html",Fail_1:"aria_activedescendant_tabindex_valid.html",group:"aria_activedescendant_tabindex_valid.html"}},messages:{"en-US":{pass:"Rule Passed",Fail_1:"The <{0}> element using 'aria-activedescendant' set to \"{1}\" is not tabbable",group:"Element using 'aria-activedescendant' property should be tabbable"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,r=!1,o=n.nodeName.toLowerCase();if(n.hasAttribute("class")&&"mbl"==n.getAttribute("class").substring(0,3))return null;if(l.CommonUtil.isNodeDisabled(n))return null;if(0!==n.getAttribute("aria-activedescendant").trim().length){(r=l.CommonUtil.isTabbable(n))||(r=l.CommonUtil.getTabbableChildren(n)>0);var s=new Array;s.push(o);var u=new Array;return u.push(n.getAttribute("aria-activedescendant").split(" ").join(", ")),r?(0,a.RulePass)("pass"):(0,a.RuleFail)("Fail_1",[s.toString(),u.toString()])}}}},8025(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_activedescendant_valid=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(5279),s=i(3946),u=i(1686);t.aria_activedescendant_valid={id:"aria_activedescendant_valid",context:"dom:*[aria-activedescendant]",refactor:{HAAC_ActiveDescendantCheck:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{Pass_0:"aria_activedescendant_valid.html",Fail_1:"aria_activedescendant_valid.html",Fail_2:"aria_activedescendant_valid.html",Fail_3:"aria_activedescendant_valid.html",group:"aria_activedescendant_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The 'aria-activedescendant' property is empty",Fail_2:"The 'aria-activedescendant' property references a hidden node",Fail_3:"Element is not a combobox, and the referenced active-descendant element is not a valid descendant",group:"The 'aria-activedescendant' property must reference the 'id' of a non-empty, non-hidden active child element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.AriaUtil.hasRoleInSemantics(n,"combobox"))return null;var d=l.AriaUtil.getAriaAttribute(n,"aria-activedescendant");if(!d||""===d.trim())return(0,a.RuleFail)("Fail_1");var c=o.FragmentUtil.getById(n,d.trim());if(!c||u.DOMUtil.sameNode(d,n))return null;if(!s.VisUtil.isNodeVisible(c))return(0,a.RuleFail)("Fail_2");if(n.contains(c))return(0,a.RulePass)("Pass_0");var m=2;if(n.hasAttribute("aria-owns"))for(var p=r.CommonUtil.normalizeSpacing(n.getAttribute("aria-owns").trim()).split(" "),h=0;h<p.length;h++)if((v=o.FragmentUtil.getById(n,p[h]))&&!u.DOMUtil.sameNode(v,n)&&v.contains(c))return(0,a.RulePass)("Pass_0");if(l.AriaUtil.hasRoleInSemantics(n,"textbox")&&n.hasAttribute("aria-controls")){m=3;var g=r.CommonUtil.normalizeSpacing(n.getAttribute("aria-controls").trim()).split(" ");for(h=0;h<g.length;h++){var b=o.FragmentUtil.getById(n,g[h]);if(b&&!u.DOMUtil.sameNode(b,n)&&b.contains(c))return(0,a.RulePass)("Pass_0");if(b.hasAttribute("aria-owns"))for(var _=r.CommonUtil.normalizeSpacing(b.getAttribute("aria-owns").trim()).split(" "),f=0;f<_.length;f++){var v;if((v=o.FragmentUtil.getById(n,_[f]))&&!u.DOMUtil.sameNode(v,n)&&v.contains(c))return(0,a.RulePass)("Pass_0")}}}return 3==m?(0,a.RuleFail)("Fail_3"):null}}},1198(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_application_label_unique=void 0;var a=i(461),n=i(461),l=i(7011),r=i(3946);t.aria_application_label_unique={id:"aria_application_label_unique",context:"aria:application",refactor:{Rpt_Aria_MultipleApplicationLandmarks:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_application_label_unique.html",fail_label_not_unique:"aria_application_label_unique.html",group:"aria_application_label_unique.html"}},messages:{"en-US":{pass:'The element with "application" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "application" role do not have unique labels',group:'Each element with "application" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var o=l.AriaUtil.isLandmarkNameUnique(n,"application");return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},8001(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_application_labelled=void 0;var a=i(461),n=i(461),l=i(1950),r=i(3946);t.aria_application_labelled={id:"aria_application_labelled",context:"aria:application",refactor:{Rpt_Aria_ApplicationLandmarkLabel:{Pass_0:"pass",Fail_1:"fail_no_label"}},help:{"en-US":{pass:"aria_application_labelled.html",fail_no_label:"aria_application_labelled.html",group:"aria_application_labelled.html"}},messages:{"en-US":{pass:'The element with "application" role has a label that describes its purpose',fail_no_label:'Element with "application" role does not have a label',group:'Each element with "application" role must have a label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;return r.VisUtil.isNodeHiddenFromAT(n)?null:l.AccNameUtil.computeAccessibleName(n)?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_no_label")}}},5778(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_article_label_unique=void 0;var a=i(461),n=i(461),l=i(3946),r=i(7011);t.aria_article_label_unique={id:"aria_article_label_unique",context:"aria:article",refactor:{Rpt_Aria_MultipleArticleRoles_Implicit:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_article_label_unique.html",fail_label_not_unique:"aria_article_label_unique.html",group:"aria_article_label_unique.html"}},messages:{"en-US":{pass:'The element with "article" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "article" role do not have unique labels',group:'Each element with "article" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var o=r.AriaUtil.isLandmarkNameUnique(n,"article");return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},8118(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_allowed=void 0;var a=i(461),n=i(461),l=i(9910),r=i(7011);t.aria_attribute_allowed={id:"aria_attribute_allowed",context:"dom:*",refactor:{Rpt_Aria_ValidProperty:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"aria_attribute_allowed.html",Pass_0:"aria_attribute_allowed.html",Fail_1:"aria_attribute_allowed.html"}},messages:{"en-US":{group:"ARIA attributes must be valid for the element's role",Pass_0:"Rule Passed",Fail_1:"The attribute(s) '{0}' referenced by the element <{1}> is not a valid ARIA state or property"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"4.1.2",level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:"5f99a7",run:function(e,t,i){var n=e.dom.node,o=n.attributes;if(o){for(var s=l.ARIADefinitions.propertyDataTypes,u="",d=0,c=0,m=o.length;c<m;c++){var p=o[c].name;r.AriaUtil.isDefinedAriaAttribute(n,p)&&(d++,s[p]||(u=0==u.length?p:u+", "+p))}return 0==d?null:0!=u.length?(0,a.RuleFail)("Fail_1",[u,n.nodeName.toLowerCase()]):(0,a.RulePass)("Pass_0")}return null}}},2242(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_conflict=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139);t.aria_attribute_conflict={id:"aria_attribute_conflict",context:"dom:*[aria-required], dom:*[aria-autocomplete], dom:*[aria-readonly], dom:*[aria-disabled], dom:*[aria-placeholder], dom:*[aria-checked], dom:*[aria-hidden], dom:*[aria-valuemax], dom:*[aria-valuemin], dom:*[aria-colspan], dom:*[aria-rowspan]",help:{"en-US":{fail_conflict:"aria_attribute_conflict.html",group:"aria_attribute_conflict.html"}},messages:{"en-US":{fail_conflict:'The ARIA attribute "{0}" is in conflict with the corresponding HTML attribute "{1}"',group:"An ARIA attribute must not conflict with the corresponding HTML attribute"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,o=l.AriaUtil.getInvalidAriaAttributes(n);if(o&&o.length>0)return null;var s=[],u=l.AriaUtil.getUserDefinedAriaAttributes(n);if(!u||0===u.length)return null;for(var d=l.AriaUtil.getConflictAriaAndHtmlAttributes(n),c=0;c<d.length;c++)s.push((0,a.RuleFail)("fail_conflict",[d[c].ariaAttr,d[c].htmlAttr])),u.includes(d[c].ariaAttr)&&r.CommonUtil.reduceArrayItemList([d[c].ariaAttr],u);return s.length>0?s:null}}},3673(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_deprecated=void 0;var a=i(461),n=i(461),l=i(7011);t.aria_attribute_deprecated={id:"aria_attribute_deprecated",context:"dom:*",help:{"en-US":{fail_aria_role:"aria_attribute_deprecated.html",fail_aria_attr:"aria_attribute_deprecated.html",fail_role_attr:"aria_attribute_deprecated.html",group:"aria_attribute_deprecated.html"}},messages:{"en-US":{fail_aria_role:'The ARIA role "{0}" is deprecated in the ARIA specification',fail_aria_attr:'The ARIA attributes "{0}" are deprecated in the ARIA specification',fail_role_attr:'The ARIA attributes "{0}" are deprecated for the role "{1}" in the ARIA specification',group:"No deprecated ARIA role or attribute should be used"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["ARIA"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,r=[],o=l.AriaUtil.getDeprecatedAriaRoles(n);if(o&&o.length>0)for(var s=0;s<o.length;s++)r.push((0,a.RuleFail)("fail_aria_role",[o[s]]));var u=l.AriaUtil.getDeprecatedAriaAttributes(n);if(u&&u.length>0)for(s=0;s<u.length;s++)"any"===u[s].role?r.push((0,a.RuleFail)("fail_aria_attr",[u[s].attribute])):r.push((0,a.RuleFail)("fail_role_attr",[u[s].attribute,u[s].role]));return r.length>0?r:null}}},5080(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_exists=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(9910),s=i(3946);t.aria_attribute_exists={id:"aria_attribute_exists",context:"dom:*[role]",dependencies:["aria_role_allowed"],refactor:{Rpt_Aria_EmptyPropertyValue:{pass:"pass",fail_empty_attribute:"fail_empty_attribute"}},help:{"en-US":{pass:"aria_attribute_exists.html",fail_empty_attribute:"aria_attribute_exists.html",group:"aria_attribute_exists.html"}},messages:{"en-US":{pass:"Rule Passed",fail_empty_attribute:"The element attribute(s): '{0}' value is empty",group:"When specifying a required ARIA attribute, the value must not be empty"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:["6a7281"],run:function(e,t,i){var n=e.dom.node;if(!s.VisUtil.isNodeHiddenFromAT(n)){var u=new Array,d=o.ARIADefinitions.designPatterns,c=r.CommonUtil.hasAttribute,m=0,p=l.AriaUtil.getResolvedRole(n);if(p){if(d[p]&&null!=l.AriaUtil.getRoleRequiredProperties(p,n))for(var h=l.AriaUtil.getRoleRequiredProperties(p,n),g=0,b=h.length;g<b;g++)c(n,w=h[g])?(m++,0==r.CommonUtil.normalizeSpacing(n.getAttribute(h[g])).length&&u.push(h[g])):"aria-labelledby"==h[g]?"radiogroup"==p&&c(n,"aria-label")&&(m++,0==r.CommonUtil.normalizeSpacing(n.getAttribute("aria-label")).length&&u.push("aria-label")):"aria-valuenow"==h[g]&&"progressbar"==p&&c(n,"aria-valuetext")&&(m++,0==r.CommonUtil.normalizeSpacing(n.getAttribute("aria-valuetext")).length&&u.push("aria-valuetext"));if(d[p]){var _=l.AriaUtil.getElementAriaProperty(n),f=[];f.push(p);for(var v=l.AriaUtil.getAllowedAriaAttributes(n,f,_),A=(g=0,v.length);g<A;g++){var w;"aria-checked"!=(w=v[g])&&"aria-selected"!=w&&"aria-expanded"!=w&&"aria-orientation"!=w&&"aria-level"!=w||c(n,w)&&(m++,0!=r.CommonUtil.normalizeSpacing(n.getAttribute(w)).length||u.includes(w)||u.push(w))}}var y=new Array,C=0==u.length;return y.push(u.join(", ")),0==m?null:C?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_empty_attribute",y)}}}}},183(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_redundant=void 0;var a=i(461),n=i(461),l=i(7011);t.aria_attribute_redundant={id:"aria_attribute_redundant",context:"dom:*[aria-required], dom:*[aria-autocomplete], dom:*[aria-readonly], dom:*[aria-disabled], dom:*[aria-placeholder], dom:*[aria-checked], dom:*[aria-hidden], dom:*[aria-valuemax], dom:*[aria-valuemin], dom:*[aria-colspan], dom:*[aria-rowspan]",help:{"en-US":{pass:"aria_attribute_redundant.html",fail_redundant:"aria_attribute_redundant.html",group:"aria_attribute_redundant.html"}},messages:{"en-US":{pass:"The ARIA attribute is not redundant with a corresponding HTML attribute",fail_redundant:'The ARIA attribute "{0}" is redundant with the HTML attribute "{1}"',group:"An ARIA attribute should not be redundant with a corresponding HTML attribute"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,r=l.AriaUtil.getInvalidAriaAttributes(n);if(r&&r.length>0)return null;var o=l.AriaUtil.getConflictAriaAndHtmlAttributes(n);if(o&&o.length>0)return null;var s=n.attributes,u=[],d=[];if(s)for(var c=0;c<s.length;c++){var m=s[c].name.trim().toLowerCase(),p=n.getAttribute(m);""===p&&(p=null),"aria-"===m.substring(0,5)?u.push({name:m,value:p}):d.push({name:m,value:p})}var h=[],g=function(e){var t=l.AriaUtil.getConflictOrOverlappingHtmlAttribute(u[e],d,"overlapping");if(null===t)return"continue";t.forEach(function(t){"Pass"===t.result?h.push((0,a.RulePass)("pass")):"Failed"===t.result&&h.push((0,a.RuleFail)("fail_redundant",[u[e].name,t.attr]))})};for(c=0;c<u.length;c++)g(c);return h.length>0?h:null}}},6805(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_required=void 0;var a=i(9910),n=i(7011),l=i(7139),r=i(461),o=i(461);t.aria_attribute_required={id:"aria_attribute_required",context:"dom:*[role]",dependencies:["aria_role_allowed"],refactor:{Rpt_Aria_RequiredProperties:{Pass_0:"pass",Fail_1:"fail_missing"}},help:{"en-US":{group:"aria_attribute_required.html",pass:"aria_attribute_required.html",fail_missing:"aria_attribute_required.html"}},messages:{"en-US":{group:"The required attributes for the element with a role must be defined",pass:"The required attributes for the element with the role are defined",fail_missing:"Element with '{0}' role does not have the required ARIA attribute(s): '{1}'"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"4.1.2",level:o.eRulePolicy.VIOLATION,toolkitLevel:o.eToolkitLevel.LEVEL_ONE}],act:"4e8ab6",run:function(e,t,i){var o=e.dom.node,s=new Array,u=new Array,d=a.ARIADefinitions.designPatterns,c=l.CommonUtil.hasAttribute,m=n.AriaUtil.getElementAriaProperty(o),p=n.AriaUtil.getResolvedRole(o);if(p){var h=n.AriaUtil.getRoleRequiredProperties(p,o);if(d[p]&&null!==h){for(var g=n.AriaUtil.getAllowedAriaAttributes(o,p,m),b=!1,_=0,f=h.length;_<f;_++)g.includes(h[_])&&(c(o,h[_])||("aria-labelledby"==h[_]?c(o,"aria-label")&&"radiogroup"==p||(s.push(h[_]),b=!0):"aria-valuenow"==h[_]?c(o,"aria-valuetext")&&"progressbar"==p||(s.push(h[_]),b=!0):"aria-controls"==h[_]&&"combobox"==p||(s.push(h[_]),b=!0)));1==b&&u.push(p)}if(0==u.length||0==s.length)return(0,r.RulePass)("pass");var v=new Array;return v.push(u.join(", ")),v.push(s.join(", ")),(0,r.RuleFail)("fail_missing",v)}}}},1886(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_value_valid=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(9910);t.aria_attribute_value_valid={id:"aria_attribute_value_valid",context:"dom:*",dependencies:["aria_attribute_allowed"],refactor:{Rpt_Aria_ValidPropertyValue:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"aria_attribute_value_valid.html",Pass_0:"aria_attribute_value_valid.html",Fail_1:"aria_attribute_value_valid.html"}},messages:{"en-US":{group:"ARIA property values must be valid",Pass_0:"Rule Passed",Fail_1:"The value \"{0}\" specified for attribute '{1}' on element <{2}> is not valid"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:"6a7281",run:function(e,t,i){var n=e.dom.node,s=new Array,u=new Array,d=new Array,c=o.ARIADefinitions.propertyDataTypes,m=n.attributes,p=0;if(m)for(var h=0,g=m.length;h<g;h++){var b=m[h].name;if(l.AriaUtil.isDefinedAriaAttribute(n,b)){var _=c[b],f=r.CommonUtil.normalizeSpacing(m[h].nodeValue);if(p++,_&&_.values){if(-1==_.values.indexOf(f))if(-1!=_.values.indexOf("undefined")&&0==f.length);else if("http://www.w3.org/2001/XMLSchema#nmtokens"===_.type){var v=m[h].nodeValue.trim().split(" ");if(v.length>1&&v.includes("all"))s.push(m[h].nodeValue.split(" ")),u.push(b),d.push(_.values.toString());else for(var A={},w=0;w<v.length;w++)""==v[w]||_.values.includes(v[w])||(A.hasOwnProperty(b)||(A[b]=!0,u.push(b)),s.push(v[w]),d.push(_.values.toString()))}else s.push(m[h].nodeValue.split(" ")),u.push(b),d.push(_.values.toString())}else if(_&&_.type&&"http://www.w3.org/2001/XMLSchema#int"===_.type){var y=parseInt(f);(isNaN(y)||""+y!==f)&&(s.push(f),u.push(b))}else if(_&&_.type&&"http://www.w3.org/2001/XMLSchema#decimal"==_.type){var C=parseFloat(f);isNaN(C)&&(s.push(f),u.push(b))}else if(_&&_.type&&"http://www.w3.org/2001/XMLSchema#boolean"==_.type){var k=f.trim().toLowerCase();"true"!==k&&"false"!==k&&(s.push(f),u.push(b))}else _&&_.type&&"http://www.w3.org/2001/XMLSchema#string"==_.type||p--}}var R=new Array,x=0==u.length;return R.push(s.join(", ")),R.push(u.join(", ")),R.push(n.nodeName.toLowerCase()),0==p?null:x?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",R)}}},4078(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_banner_label_unique=void 0;var a=i(461),n=i(461),l=i(7011),r=i(3946);t.aria_banner_label_unique={id:"aria_banner_label_unique",context:"aria:banner",refactor:{Rpt_Aria_MultipleBannerLandmarks_Implicit:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_banner_label_unique.html",fail_label_not_unique:"aria_banner_label_unique.html",group:"aria_banner_label_unique.html"}},messages:{"en-US":{pass:'The element with "banner" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "banner" role do not have unique labels',group:'Each element with "banner" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var o=l.AriaUtil.isLandmarkNameUnique(n,"banner",!0);return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},5750(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_banner_single=void 0;var a=i(461),n=i(461),l=i(7011),r=i(3946);t.aria_banner_single={id:"aria_banner_single",context:"dom:*[role], dom:header",refactor:{Rpt_Aria_OneBannerInSiblingSet_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_banner_single.html",Fail_1:"aria_banner_single.html",group:"aria_banner_single.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "banner" role found on the page',group:'A page, document, or application should only have one element with "banner" role'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;return r.VisUtil.isNodeHiddenFromAT(n)?null:l.AriaUtil.hasRoleInSemantics(n,"banner")?null===l.AriaUtil.getSiblingWithRoleHidden(n,"banner",!0,!0)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1"):null}}},85(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_child_tabbable=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(9910),s=i(3946);t.aria_child_tabbable={id:"aria_child_tabbable",context:"dom:*[role]",dependencies:["aria_role_allowed"],refactor:{Rpt_Aria_MissingFocusableChild:{pass:"pass",fail_missing_child:"fail_missing_child"}},help:{"en-US":{pass:"aria_child_tabbable.html",fail_missing_child:"aria_child_tabbable.html",group:"aria_child_tabbable.html"}},messages:{"en-US":{pass:"Rule Passed",fail_missing_child:'None of the descendent elements with "{1}" role is tabbable',group:"UI component must have at least one tabbable descendant for keyboard access"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(!(s.VisUtil.isNodeHiddenFromAT(n)||r.CommonUtil.isNodeDisabled(n)||l.AriaUtil.containsPresentationalChildrenOnly(n)||l.AriaUtil.shouldBePresentationalChild(n))){if(l.AriaUtil.hasRole(n,{list:!0,row:!0,rowgroup:!0,table:!0,grid:!0}))return null;if(n.hasAttribute("class")&&"mbl"==n.getAttribute("class").substring(0,3))return null;if("datalist"===n.nodeName.toLowerCase())return null;if(l.AriaUtil.isNavigationOwnedOrControlled(n))return null;var u=l.AriaUtil.getResolvedRole(n),d=!0,c=n.ownerDocument,m=r.CommonUtil.hasAttribute,p=new Array,h="",g=!1;if(o.ARIADefinitions.containers.includes(u)&&"true"!=(m(n,"aria-disabled")?n.getAttribute("aria-disabled"):"")&&!m(n,"aria-activedescendant")&&!r.CommonUtil.isTabbable(n)){var b=o.ARIADefinitions.designPatterns[u].reqChildren;if(b){g=!0,d=!1;for(var _="descendant::*[",f=0;f<b.length;f++)_+="@role='"+b[f]+"' or ";_=_.substring(0,_.length-4)+"]";for(var v=c.evaluate(_,n,r.CommonUtil.defaultNSResolver,0,null),A=v.iterateNext();A&&!d;)if(r.CommonUtil.shouldNodeBeSkippedHidden(A))A=v.iterateNext();else{if(!(d=r.CommonUtil.isTabbable(A)))for(var w=c.evaluate("descendant::*",A,r.CommonUtil.defaultNSResolver,0,null),y=w.iterateNext();y&&!d;)r.CommonUtil.shouldNodeBeSkippedHidden(y)||(d=r.CommonUtil.isTabbable(A)),y=w.iterateNext();d||(p=A.getAttribute("role").trim().split(" "),h=A.nodeName.toLowerCase()),A=v.iterateNext()}}}var C=new Array,k=new Array;return h.length>0&&p.length>0?(C.push(h),k.push(p.join(", "))):d=!0,g?d?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_missing_child",[C.toString(),k.toString()]):null}}}},514(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_child_valid=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(3946);t.aria_child_valid={id:"aria_child_valid",context:"dom:*",dependencies:["aria_role_valid","aria_descendant_valid"],help:{"en-US":{group:"aria_child_valid.html",Pass:"aria_child_valid.html",Fail_no_child:"aria_child_valid.html",Fail_invalid_child:"aria_child_valid.html"}},messages:{"en-US":{group:"An element with an ARIA role must own a required child",Pass:"An element with an ARIA role owns a required child",Fail_no_child:'The element with role "{0}" does not own any child element with any of the following role(s): "{1}"',Fail_invalid_child:'The element with role "{0}" owns the child element with the role "{1}" that is not one of the allowed role(s): "{2}"'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:["bc4a75"],run:function(e,t,i){var n=e.dom.node;if(!o.VisUtil.isNodeHiddenFromAT(n)&&!r.CommonUtil.isNodeDisabled(n)&&!l.AriaUtil.containsPresentationalChildrenOnly(n)){var s=l.AriaUtil.getRoles(n,!1);if(s&&0!==s.length||(s=l.AriaUtil.getImplicitRole(n)),!s||0===s.length)return null;var u=["none","presentation"];if(s.some(function(e){return u.includes(e)}))return null;if(s.includes("combobox"))return null;var d=l.AriaUtil.getRequiredChildRoles(n,!0);if(d.includes("group")){var c=d.indexOf("group");c>-1&&d.splice(c,1)}if(0==d.length)return null;var m=l.AriaUtil.getDirectATChildren(n);if(!m||0==m.length){var p=n.getAttribute("aria-busy");return p&&"true"===p?null:((v=new Array).push(s.join(", ")),v.push(d.join(", ")),(0,a.RuleFail)("Fail_no_child",v))}for(var h=new Array,g=0;g<m.length;g++){var b=l.AriaUtil.getRoles(m[g],!1);b&&0!=b.length||(b=l.AriaUtil.getImplicitRole(m[g])),b&&b.length>0&&(b.some(function(e){return d.includes(e)})||h.push(b.join(", ")))}if(h.length>0){for(var _=[],f=0;f<h.length;f++){var v;(v=new Array).push(s.join(", ")),v.push(h[f]),v.push(d.join(", ")),_.push((0,a.RuleFail)("Fail_invalid_child",v))}return _}return(0,a.RulePass)("Pass")}}}},5310(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_complementary_label_unique=void 0;var a=i(461),n=i(461),l=i(7011),r=i(3946);t.aria_complementary_label_unique={id:"aria_complementary_label_unique",context:"aria:complementary",refactor:{Rpt_Aria_MultipleComplementaryLandmarks_Implicit:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_complementary_label_unique.html",fail_label_not_unique:"aria_complementary_label_unique.html",group:"aria_complementary_label_unique.html"}},messages:{"en-US":{pass:'The element with "complementary" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "complementary" role do not have unique labels',group:'Each element with "complementary" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var o=l.AriaUtil.isLandmarkNameUnique(n,"complementary");return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},9083(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_complementary_label_visible=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(3946);t.aria_complementary_label_visible={id:"aria_complementary_label_visible",context:"dom:*[role], dom:aside",dependencies:["aria_complementary_labelled"],refactor:{Rpt_Aria_ComplementaryLandmarkLabel_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_complementary_label_visible.html",Fail_1:"aria_complementary_label_visible.html",group:"aria_complementary_label_visible.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Element with "complementary" role does not have a visible label',group:'Each element with "complementary" role should have a visible label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;return o.VisUtil.isNodeHiddenFromAT(n)?null:l.AriaUtil.hasRoleInSemantics(n,"complementary")?r.CommonUtil.attributeNonEmpty(n,"aria-labelledby")?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1"):null}}},6049(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_complementary_labelled=void 0;var a=i(461),n=i(461),l=i(1950),r=i(3946);t.aria_complementary_labelled={id:"aria_complementary_labelled",context:"aria:complementary",refactor:{Rpt_Aria_ComplementaryRequiredLabel_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_complementary_labelled.html",Fail_1:"aria_complementary_labelled.html",group:"aria_complementary_labelled.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Element with "complementary" role does not have a label',group:'Each element with "complementary" role must have a label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;return r.VisUtil.isNodeHiddenFromAT(n)?null:l.AccNameUtil.computeAccessibleName(n)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},5099(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_content_in_landmark=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(4566),s=i(3864),u=i(3946),d=i(9196);t.aria_content_in_landmark={id:"aria_content_in_landmark",context:"dom:*",refactor:{Rpt_Aria_OrphanedContent_Native_Host_Sematics:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_content_in_landmark.html",Fail_1:"aria_content_in_landmark.html",group:"aria_content_in_landmark.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Content is not within a landmark element",group:"All content must reside within an element with a landmark role"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE},{id:["WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=o.CacheUtil.getCache(e.dom.node.ownerDocument,"aria_content_in_landmark",null);if(!n){(n={landmarks:{value:["banner","complementary","contentinfo","form","main","navigation","region","search"],type:"array"},possibleOrphanedWidgets:{value:["button","combobox","checkbox","grid","heading","link","list","listbox","menu","menubar","progressbar","radio","tablist","textbox","toolbar","tree","treegrid"],type:"array"},possibleOrphanedElements:{value:["p","table","input","textarea","select","button","a","ol","ul","dl","h1","h2","h3","h4","h5","h6","embed","object","area"],type:"array"},noLandmarkedRoles:{value:["alert","alertdialog","dialog","tooltip"],type:"array"},mapLandmarks:{},mapPossibleOrphanedWidgets:{},mapPossibleOrphanedElements:{},mapNoLandmarkedRoles:{}}).mapLandmarks={};for(var c=0;c<n.landmarks.value.length;++c)n.mapLandmarks[n.landmarks.value[c]]=!0;for(n.mapPossibleOrphanedWidgets={},c=0;c<n.possibleOrphanedWidgets.value.length;++c)n.mapPossibleOrphanedWidgets[n.possibleOrphanedWidgets.value[c]]=!0;for(n.mapPossibleOrphanedElements={},c=0;c<n.possibleOrphanedElements.value.length;++c)n.mapPossibleOrphanedElements[n.possibleOrphanedElements.value[c]]=!0;for(n.mapNoLandmarkedRoles={},c=0;c<n.noLandmarkedRoles.value.length;++c)n.mapNoLandmarkedRoles[n.noLandmarkedRoles.value[c]]=!0;o.CacheUtil.setCache(e.dom.node.ownerDocument,"aria_content_in_landmark",n)}var m=e.dom.node,p=m.nodeName.toLowerCase();if(!u.VisUtil.isNodeVisible(m)||null!=u.VisUtil.hiddenByDefaultElements&&null!=u.VisUtil.hiddenByDefaultElements&&u.VisUtil.hiddenByDefaultElements.indexOf(p)>-1)return(0,a.RulePass)("Pass_0");if(!r.CommonUtil.hasInnerContentHidden(m)&&-1===["area","input","embed","button","textarea","select"].indexOf(p))return(0,a.RulePass)("Pass_0");if("table"==p&&d.TableUtil.isLayoutTable(m))return null;var h=!0,g=l.AriaUtil.hasRole(m,n.mapPossibleOrphanedWidgets,!0);"link"===p&&(g=!1);var b=p in n.mapPossibleOrphanedElements;if(!g&&!b)return null;if(!(h=i.aria.map(function(e){return e.role}).filter(function(e){return e in n.mapLandmarks}).length>0)){for(var _=s.DOMWalker.parentElement(m);!h&&null!=_;)h=o.CacheUtil.getCache(_,"Rpt_Aria_OrphanedContent",!1),_=s.DOMWalker.parentElement(_);for(_=m.nextElementSibling;!h&&null!=_;)h=o.CacheUtil.getCache(_,"Rpt_Aria_OrphanedContent",!1),_=_.nextElementSibling;for(_=m.previousElementSibling;!h&&null!=_;)h=o.CacheUtil.getCache(_,"Rpt_Aria_OrphanedContent",!1),_=_.previousElementSibling;if(h)return null;if(o.CacheUtil.setCache(m,"Rpt_Aria_OrphanedContent",!0),h=o.CacheUtil.getCache(m,"Rpt_Aria_OrphanedContent_NoTrigger",!1)||l.AriaUtil.hasRole(m,n.mapNoLandmarkedRoles,!0)||l.AriaUtil.getAncestorWithRole(m,n.mapNoLandmarkedRoles,!0))return o.CacheUtil.setCache(m,"Rpt_Aria_OrphanedContent_NoTrigger",!0),null}return h?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},2759(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_contentinfo_label_unique=void 0;var a=i(461),n=i(461),l=i(7011),r=i(3946);t.aria_contentinfo_label_unique={id:"aria_contentinfo_label_unique",context:"aria:contentinfo",refactor:{Rpt_Aria_MultipleContentinfoLandmarks_Implicit:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_contentinfo_label_unique.html",fail_label_not_unique:"aria_contentinfo_label_unique.html",group:"aria_contentinfo_label_unique.html"}},messages:{"en-US":{pass:'The element with "contentinfo" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "contentinfo" role do not have unique labels',group:'Each element with "contentinfo" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var o=l.AriaUtil.isLandmarkNameUnique(n,"contentinfo",!0);return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},3141(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_contentinfo_misuse=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(3946);t.aria_contentinfo_misuse={id:"aria_contentinfo_misuse",context:"dom:*[role], dom:footer, dom:address",refactor:{Rpt_Aria_ContentinfoWithNoMain_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_contentinfo_misuse.html",Fail_1:"aria_contentinfo_misuse.html",group:"aria_contentinfo_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Element with "contentinfo" role is present without an element with "main" role',group:'Each element with "contentinfo" role is only permitted with an element with "main" role'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;return o.VisUtil.isNodeHiddenFromAT(n)?null:l.AriaUtil.hasRoleInSemantics(n,"contentinfo")?r.CommonUtil.getElementsByRoleHidden(n.ownerDocument,"main",!0,!0).length>0?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1"):null}}},5131(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_contentinfo_single=void 0;var a=i(461),n=i(461),l=i(7011),r=i(3946);t.aria_contentinfo_single={id:"aria_contentinfo_single",context:"dom:*[role], dom:footer, dom:address",refactor:{Rpt_Aria_MultipleContentinfoInSiblingSet_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_contentinfo_single.html",Fail_1:"aria_contentinfo_single.html",group:"aria_contentinfo_single.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "contentinfo" role found on the page',group:'A page, document, or application should only have one element with "contentinfo" role'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;return r.VisUtil.isNodeHiddenFromAT(n)?null:l.AriaUtil.hasRoleInSemantics(n,"contentinfo")?l.AriaUtil.getSiblingWithRoleHidden(n,"contentinfo",!0,!0)?(0,a.RuleFail)("Fail_1"):(0,a.RulePass)("Pass_0"):null}}},5167(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_descendant_valid=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(3946);t.aria_descendant_valid={id:"aria_descendant_valid",context:"dom:*",dependencies:["aria_role_valid"],help:{"en-US":{group:"aria_descendant_valid.html",pass:"aria_descendant_valid.html",potential_child_implicit_role:"aria_descendant_valid.html",recommendation_no_impact_role:"aria_descendant_valid.html",fail_child_explicit_role:"aria_descendant_valid.html"}},messages:{"en-US":{group:"Browsers ignore the explicit and implicit ARIA roles of the descendants of certain elements",pass:"The element contains valid descendants",potential_child_implicit_role:'The element with role "{0}" contains descendants with implicit roles "{1}" which are ignored by browsers',recommendation_no_impact_role:'The element with role "{0}" contains descendants with roles "{1}" which are ignored by browsers',fail_child_explicit_role:'The element with role "{0}" contains descendants with roles "{1}" which are ignored by browsers'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE,reasonCodes:["pass","potential_child_implicit_role","fail_child_explicit_role"]},{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE,reasonCodes:["recommendation_no_impact_role"]}],act:["307n5z"],run:function(e,t,i){var n=e.dom.node;if(!o.VisUtil.isNodeHiddenFromAT(n)&&!r.CommonUtil.isNodeDisabled(n)&&l.AriaUtil.containsPresentationalChildrenOnly(n)){var s=l.AriaUtil.getRoles(n,!1);if(s&&0!==s.length||(s=l.AriaUtil.getImplicitRole(n)),!s||0===s.length)return null;var u=l.AriaUtil.getDirectATChildren(n);if(!(u&&u.length>0))return(0,a.RulePass)("pass");for(var d=new Array,c=new Array,m=new Array,p=0;p<u.length;p++){var h=u[p].nodeName.toLowerCase();if("img"!==h&&"svg"!==h){var g=l.AriaUtil.getRoles(u[p],!1);g&&g.length>0?(g.includes("code")&&m.push(g.filter(function(e){return"code"===e}).join(", ")),d.push(g.filter(function(e){return"code"!==e}).join(", "))):((g=l.AriaUtil.getImplicitRole(u[p])).includes("code")&&m.push(g.filter(function(e){return"code"===e}).join(", ")),g&&g.length>0&&c.push(g.filter(function(e){return"code"!==e}).join(", ")))}}if(d.length>0){for(var b=[],_=0;_<d.length;_++)(f=new Array).push(s.join(", ")),f.push(d[_]),b.push((0,a.RuleFail)("fail_child_explicit_role",f));return b}if(c.length>0){for(b=[],_=0;_<c.length;_++)(f=new Array).push(s.join(", ")),f.push(c[_]),b.push((0,a.RulePotential)("potential_child_implicit_role",f));return b}if(m.length>0){for(b=[],_=0;_<m.length;_++){var f;(f=new Array).push(s.join(", ")),f.push(m[_]),b.push((0,a.RulePotential)("recommendation_no_impact_role",f))}return b}}}}},8115(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_document_label_unique=void 0;var a=i(461),n=i(461),l=i(7011),r=i(3946);t.aria_document_label_unique={id:"aria_document_label_unique",context:"aria:document",refactor:{Rpt_Aria_MultipleDocumentRoles:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_document_label_unique.html",fail_label_not_unique:"aria_document_label_unique.html",group:"aria_document_label_unique.html"}},messages:{"en-US":{pass:'The element with "document" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "document" roles do not have unique labels',group:'Each element with "document" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var o=l.AriaUtil.isLandmarkNameUnique(n,"document",!0);return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},5733(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_eventhandler_role_valid=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139);t.aria_eventhandler_role_valid={id:"aria_eventhandler_role_valid",context:"dom:*[onclick],dom:*[onblur], dom:*[ondblclick], dom:*[onfocus], dom:*[onkeydown],dom:*[onkeypress], dom:*[onkeyup], dom:*[onmousedown], dom:*[onmouseup], dom:*[onmousemove], dom:*[onmouseout], dom:*[onmouseover], dom:*[onresize], dom:*[onchange]",refactor:{Rpt_Aria_EventHandlerMissingRole_Native_Host_Sematics:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_eventhandler_role_valid.html",Fail_1:"aria_eventhandler_role_valid.html",group:"aria_eventhandler_role_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The <{0}> element with '{1}' does not have a valid ARIA role specified",group:"Elements with event handlers must have a valid ARIA role"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.CommonUtil.getAncestor(n,"svg"))return null;if(l.AriaUtil.hasAnyRole(n,!0))return(0,a.RulePass)("Pass_0");if(r.CommonUtil.isfocusableByDefault(n))return(0,a.RulePass)("Pass_0");var o=new Array;o.push(n.nodeName.toLowerCase());for(var s=new Array,u=["onblur","onfocus","onchange","onclick","ondblclick","onkeydown","onkeypress","onkeyup","onmousedown","onmouseup","onmousemove","onmouseout","onmouseover","onresize"],d=0;d<u.length;++d)n.hasAttribute(u[d])&&s.push(u[d]);var c=new Array;return c.push(s.join(", ")),(0,a.RuleFail)("Fail_1",[o.toString(),c.toString()])}}},5782(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_form_label_unique=void 0;var a=i(461),n=i(461),l=i(7011),r=i(3946);t.aria_form_label_unique={id:"aria_form_label_unique",context:"aria:form",refactor:{Rpt_Aria_MultipleFormLandmarks_Implicit:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_form_label_unique.html",fail_label_not_unique:"aria_form_label_unique.html",group:"aria_form_label_unique.html"}},messages:{"en-US":{pass:'The element with "form" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "form" role do not have unique labels',group:'Each element with "form" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var o=l.AriaUtil.isLandmarkNameUnique(n,"form",!0);return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},6731(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_graphic_labelled=void 0;var a=i(461),n=i(7011),l=i(7139),r=i(3946);t.aria_graphic_labelled={id:"aria_graphic_labelled",context:"aria:graphics-document,aria:graphics-symbol",refactor:{HAAC_Aria_SvgAlt:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{group:"aria_graphic_labelled.html",Pass_0:"aria_graphic_labelled.html",Fail_1:"aria_graphic_labelled.html",Fail_2:"aria_graphic_labelled.html",Fail_3:"aria_graphic_labelled.html"}},messages:{"en-US":{group:"An element with a graphics role must have a non-empty label",Pass_0:"Rule Passed",Fail_1:'Element with "{0}" graphics role has no label',Fail_2:'Element with "{0}" graphics role has no label or an empty label',Fail_3:"Element with \"{0}\" graphics role missing non-empty 'aria-label' or 'aria-labelledby'"}},rulesets:[],act:[{"7d6734":{Pass_0:"pass",Fail_1:"inapplicable",Fail_2:"fail",Fail_3:"inapplicable"}}],run:function(e,t,i){var o=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(o))return null;if(!o.hasAttribute("role")||!o.getAttribute("role").includes("graphics-"))return null;var s=n.AriaUtil.getAriaLabel(o).length>0;if(!s&&"svg"===o.nodeName.toLowerCase()){var u=o.querySelector("title");s=u&&l.CommonUtil.hasInnerContent(u)}return s||(s=l.CommonUtil.attributeNonEmpty(o,"title")),s?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_2",[o.getAttribute("role")])}}},390(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_hidden_nontabbable=void 0;var a=i(7139),n=i(461),l=i(461);t.aria_hidden_nontabbable={id:"aria_hidden_nontabbable",context:"dom:*[aria-hidden=true], dom:*[aria-hidden=true] dom:*",refactor:{aria_hidden_focus_misuse:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"aria_hidden_nontabbable.html",Pass_0:"aria_hidden_nontabbable.html",Fail_1:"aria_hidden_nontabbable.html"}},messages:{"en-US":{group:"A hidden element should not contain any tabbable elements",Pass_0:"Rule Passed",Fail_1:"Element \"{0}\" should not be focusable within the subtree of an element with an 'aria-hidden' attribute with value 'true'"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:["1.3.1","4.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_TWO}],act:"6cfa84",run:function(e,t,i){var l=e.dom.node,r=l.nodeName.toLowerCase();return a.CommonUtil.isTabbable(l)?(0,n.RuleFail)("Fail_1",[r]):(0,n.RulePass)("Pass_0")}}},3900(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_id_unique=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(5279),s=i(9910),u=i(3946);t.aria_id_unique={id:"aria_id_unique",context:"dom:*",refactor:{Rpt_Aria_ValidIdRef:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_id_unique.html",Fail_1:"aria_id_unique.html",group:"aria_id_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The 'id' \"{0}\" specified for the ARIA property '{1}' value is not valid",group:"The ARIA property must reference a non-empty unique id of an existing element that is visible"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:["59796f","6a7281"],run:function(e,t,i){var n=e.dom.node,d=!0,c=new Array,m=(new Array,o.FragmentUtil.getOwnerFragment(n)),p=n.attributes,h=new Array,g=0;if(p)for(var b=0,_=p.length;b<_;b++){d=!0;var f=p[b].name;if(l.AriaUtil.isDefinedAriaAttribute(n,f)){var v=s.ARIADefinitions.propertyDataTypes[f];if(v&&v.type){var A="http://www.w3.org/2001/XMLSchema#idref"==v.type;if(A||"http://www.w3.org/2001/XMLSchema#idrefs"==v.type){g++;var w=r.CommonUtil.normalizeSpacing(p[b].nodeValue).length,y=p[b].nodeValue.split(" ");if(w<1)d=!1,h.push('"'+p[b].nodeValue+'"');else if(A&&w>=1&&y.length>1){d=!1;for(var C=0,k=y.length;C<k;++C)""!=y[C]&&h.push(y[C])}if(d&&w>=1)for(var R=0,x=y.length;R<x;++R)if(y[R].length>0){var P=m.getElementById(y[R]);if((d=null!=P)&&!v.hiddenIDRefSupported&&(d=u.VisUtil.isNodeVisible(P)),d)break;""!=y[R]&&h.push(y[R])}}}d||c.push(f)}}var T=0==c.length,U=new Array,I=new Array,E=new Array;return T||(I.push(c.join(", ")),E.push(n.nodeName.toLowerCase()),h.length>0&&U.push(h.join(", "))),0==g?null:T?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[U.toString(),I.toString(),E.toString()])}}},1218(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_img_labelled=void 0;var a=i(461),n=i(7011),l=i(7139),r=i(3946);t.aria_img_labelled={id:"aria_img_labelled",context:"aria:img, aria:image",refactor:{HAAC_Aria_ImgAlt:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{group:"aria_img_labelled.html",Pass_0:"aria_img_labelled.html",Fail_1:"aria_img_labelled.html",Fail_2:"aria_img_labelled.html",Fail_3:"aria_img_labelled.html"}},messages:{"en-US":{group:'An element with "img" role must have a non-empty label',Pass_0:"Rule Passed",Fail_1:'Element with "img" role has no label',Fail_2:'Element with "img" role has no label or an empty label',Fail_3:"Element with \"img\" role missing non-empty 'aria-label' or 'aria-labelledby'"}},rulesets:[],act:["23a2a8",{"7d6734":{Pass_0:"pass",Fail_1:"inapplicable",Fail_2:"fail",Fail_3:"inapplicable"}}],run:function(e,t,i){var o=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(o))return null;if(!o.hasAttribute("role"))return null;var s=o.nodeName.toLocaleLowerCase();if("svg"!==s&&"img"!==s){var u=n.AriaUtil.getAriaLabel(o).length>0;if(!u&&"svg"===o.nodeName.toLowerCase()){var d=o.querySelector("title");u=d&&l.CommonUtil.hasInnerContent(d)}return u||(u=l.CommonUtil.attributeNonEmpty(o,"title")),u?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_2")}}}},6734(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_keyboard_handler_exists=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(9910),s=i(3946);t.aria_keyboard_handler_exists={id:"aria_keyboard_handler_exists",context:"dom:*[role]",dependencies:["aria_role_allowed"],refactor:{Rpt_Aria_MissingKeyboardHandler:{pass:"pass",potential_no_keyboard_access:"potential_no_keyboard_access"}},help:{"en-US":{pass:"aria_keyboard_handler_exists.html",potential_no_keyboard_access:"aria_keyboard_handler_exists.html",group:"aria_keyboard_handler_exists.html"}},messages:{"en-US":{pass:"Rule Passed",potential_no_keyboard_access:'Verify the <{0}> element with "{1}" role has keyboard access',group:"Interactive WAI_ARIA UI components must provide keyboard access"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(!s.VisUtil.isNodeHiddenFromAT(n)&&!r.CommonUtil.isNodeDisabled(n)){var u=!0,d=u,c=n.ownerDocument,m=o.ARIADefinitions.designPatterns,p=l.AriaUtil.getRoles(n,!1);if("datalist"===n.nodeName.toLowerCase()&&p&&p.includes("listbox"))return null;for(var h=["combobox","grid","listbox","menu","menubar","radiogroup","tablist","tree","treegrid"],g=0,b=h;g<b.length;g++){var _=b[g];if(null!=l.AriaUtil.getAncestorWithRole(n,_,!0))return null}for(var f=r.CommonUtil.hasAttribute,v=new Array,A=0;A<p.length;++A){if(m[p[A]],h.indexOf(p[A])>=0&&!(f(n,"aria-disabled")&&n.getAttribute("aria-disabled")||(u=n.hasAttribute("onkeydown")||n.hasAttribute("onkeypress")||n.hasAttribute("onkeyup"))))if(f(n,"aria-activedescendant"))u=!0;else{var w,y=o.ARIADefinitions.designPatterns[p[A]].reqChildren;if(y)for(var C=0,k=y.length;C<k;C++)for(var R="*[contains(@role,'"+y[C]+"')]",x=c.evaluate(R,n,r.CommonUtil.defaultNSResolver,0,null),P=x.iterateNext();P;){if(!(u=P.hasAttribute("onkeydown")||P.hasAttribute("onkeypress")))for(var T="descendant::*",U=(w=c.evaluate(T,P,r.CommonUtil.defaultNSResolver,0,null)).iterateNext();U&&!u;)r.CommonUtil.shouldNodeBeSkippedHidden(U)||(u=r.CommonUtil.isTabbable(U)&&(U.hasAttribute("onkeydown")||U.hasAttribute("onkeypress")))||"a"==U.nodeName.toLowerCase()&&U.hasAttribute("href")&&(u=(I=U.getAttribute("href")).startsWith("javascript:")&&-1==I.indexOf("void")&&I.length>11),U=w.iterateNext();if(!u)break;P=x.iterateNext()}else for(T="descendant::*",U=(w=c.evaluate(T,n,r.CommonUtil.defaultNSResolver,0,null)).iterateNext();U&&!u;)if(r.CommonUtil.shouldNodeBeSkippedHidden(U))U=w.iterateNext();else{var I;(u=r.CommonUtil.isTabbable(U)&&(U.hasAttribute("onkeydown")||U.hasAttribute("onkeypress")))||"a"==U.nodeName.toLowerCase()&&U.hasAttribute("href")&&(u=(I=U.getAttribute("href")).startsWith("javascript:")&&-1==I.indexOf("void")&&I.length>11),U=w.iterateNext()}}u||v.push(p[A]),!u&&d&&(d=u)}var E=new Array;E.push(n.nodeName.toLowerCase());var N=new Array;N.push(v.join(", "));var L=n.getAttribute("id");return L&&L.trim().length>0&&n.ownerDocument.querySelector("*[aria-controls='".concat(L,"'][role='combobox']"))?null:d?(0,a.RulePass)("pass"):(0,a.RulePotential)("potential_no_keyboard_access",[E.toString(),N.toString()])}}}},9973(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_landmark_name_unique=void 0;var a=i(461),n=i(461),l=i(9955),r=i(1686),o=i(5279),s=i(4566),u=i(1950),d=i(3946),c=i(7139),m=i(7011);t.aria_landmark_name_unique={id:"aria_landmark_name_unique",context:"aria:complementary, aria:banner, aria:contentinfo, aria:main, aria:navigation, aria:region, aria:search, aria:form",refactor:{landmark_name_unique:{Pass_0:"pass",Fail_0:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_landmark_name_unique.html",fail_label_not_unique:"aria_landmark_name_unique.html",group:"aria_landmark_name_unique.html"}},messages:{"en-US":{pass:"Multiple elements with \"{0}\" landmarks within the same parent region are distinguished by unique 'aria-label' or 'aria-labelledby'",fail_label_not_unique:'Multiple elements with "{0}" landmarks within the same parent region are not distinguished from one another because they have the same "{1}" label',group:"Each landmark should have a unique 'aria-labelledby' or 'aria-label' or be nested in a different parent region"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE},{id:["WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(d.VisUtil.isNodeHiddenFromAT(n))return null;if(null!==c.CommonUtil.getAncestor(n,["DIALOG"])||null!==m.AriaUtil.getAncestorWithRole(n,"dialog",!0))return null;var p=o.FragmentUtil.getOwnerFragment(n),h=s.CacheUtil.getCache(n.ownerDocument,"aria_landmark_name_unique",null);if(!h){h={navigationNodes:[],navigationNodesComputedLabels:[],navigationNodesParents:[],navigationNodesMatchFound:[]};for(var g=p.querySelectorAll('aside,[role="complementary"], footer,[role="contentinfo"], header,[role="banner"], main,[role="main"], nav,[role="navigation"], form,[role="form"], section,[role="region"],[role="search"]'),b=Array.from(g),_=[],f=[],v=[],A=0;A<b.length;A++)d.VisUtil.isNodeHiddenFromAT(b[A])||null!==c.CommonUtil.getAncestor(b[A],["DIALOG"])||null!==m.AriaUtil.getAncestorWithRole(b[A],"dialog",!0)||v.push(b[A]);for(b=v,A=0;A<b.length;A++){for(var w=[],y=b[A].parentElement;y;)w.push(y),y=y.parentElement;for(var C=0;C<w.length;C++){var k=["ASIDE","FOOTER","FORM","HEADER","MAIN","NAV","SECTION"].includes(w[C].tagName),R=!1;if(w[C].hasAttribute("role")&&(R=["complementary","contentinfo","form","banner","main","navigation","region","search"].includes(w[C].getAttribute("role"))),k||R){_.push(w[C]);break}if(C===w.length-1){_.push(null);break}}}var x=[];for(A=0;A<b.length;A++){var P=u.AccNameUtil.computeAccessibleName(b[A]);x.push(P&&P.name&&P.name.trim().length>0?P.name.trim():"")}for(A=0;A<_.length;A++){var T=!1,U=!1;for(C=0;C<_.length;C++)if(C!==A){if(null===_[A]&&null===_[C]){if(l.ARIAMapper.nodeToRole(b[A])===l.ARIAMapper.nodeToRole(b[C])){if(x[A]===x[C]){f.push("fail_label_not_unique"),T=!0;break}U=!0}}else if(null===_[A]||null===_[C])continue;if(r.DOMUtil.sameNode(_[A],_[C])&&l.ARIAMapper.nodeToRole(b[A])===l.ARIAMapper.nodeToRole(b[C])){if(x[A]===x[C]){f.push("fail_label_not_unique"),T=!0;break}U=!0}}T||(U?f.push("pass"):f.push("null"))}h.navigationNodesComputedLabels=x,h.navigationNodes=b,h.navigationNodesParents=_,h.navigationNodesMatchFound=f,s.CacheUtil.setCache(n.ownerDocument,"aria_landmark_name_unique",h)}var I=-1;for(A=0;A<h.navigationNodes.length;A++)n.isSameNode(h.navigationNodes[A])&&(I=A);return-1===I?null:"pass"===h.navigationNodesMatchFound[I]?(0,a.RulePass)("pass",[l.ARIAMapper.nodeToRole(h.navigationNodes[I])]):"fail_label_not_unique"===h.navigationNodesMatchFound[I]?(0,a.RuleFail)("fail_label_not_unique",[l.ARIAMapper.nodeToRole(h.navigationNodes[I]),h.navigationNodesComputedLabels[I]]):null}}},5711(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_main_label_unique=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(3946);t.aria_main_label_unique={id:"aria_main_label_unique",context:"aria:main",refactor:{Rpt_Aria_MultipleMainsRequireLabel_Implicit_2:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_main_label_unique.html",Fail_1:"aria_main_label_unique.html",group:"aria_main_label_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "main" role do not have unique labels',group:'Each element with "main" role must have unique label that describes its purposes'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(o.VisUtil.isNodeHiddenFromAT(n))return null;for(var s=l.AriaUtil.getAriaLabel(n),u=l.AriaUtil.getAncestorWithRole(n,"document",!0),d=r.CommonUtil.getElementsByRoleHidden(n.ownerDocument,"main",!0,!0),c=null,m=0;m<d.length;++m)if(d[m]!==n&&(c=(0,a.RulePass)("Pass_0"),l.AriaUtil.getAncestorWithRole(d[m],"document",!0)===u&&l.AriaUtil.getAriaLabel(d[m])===s)){c=(0,a.RuleFail)("Fail_1");break}return c}}},3384(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_main_label_visible=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(3946);t.aria_main_label_visible={id:"aria_main_label_visible",context:"dom:body",refactor:{Rpt_Aria_MultipleMainsVisibleLabel_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_main_label_visible.html",Fail_1:"aria_main_label_visible.html",group:"aria_main_label_visible.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "main" role do not have unique visible labels',group:'Each element with "main" role should have a unique visible label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(o.VisUtil.isNodeHiddenFromAT(n))return null;var s=r.CommonUtil.getElementsByRoleHidden(n.ownerDocument,"main",!0,!0);return 0===s.length||1===s.length?null:l.AriaUtil.hasUniqueAriaLabelledby(s)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},2762(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_navigation_label_unique=void 0;var a=i(461),n=i(461),l=i(7011),r=i(3946);t.aria_navigation_label_unique={id:"aria_navigation_label_unique",context:"aria:navigation",refactor:{Rpt_Aria_MultipleNavigationLandmarks_Implicit:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_navigation_label_unique.html",fail_label_not_unique:"aria_navigation_label_unique.html",group:"aria_navigation_label_unique.html"}},messages:{"en-US":{pass:'The element with "navigation" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "navigation" role do not have unique labels',group:'Each element with "navigation" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var o=l.AriaUtil.isLandmarkNameUnique(n,"navigation",!0);return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},5757(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_parent_required=void 0;var a=i(461),n=i(461),l=i(9910),r=i(7011),o=i(7139),s=i(3946);t.aria_parent_required={id:"aria_parent_required",context:"dom:*[role]",dependencies:["aria_role_allowed"],refactor:{Rpt_Aria_RequiredParent_Native_Host_Sematics:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"aria_parent_required.html",Pass_0:"aria_parent_required.html",Fail_1:"aria_parent_required.html"}},messages:{"en-US":{group:"Each element with an implicit or explicit role must be contained within a valid element",Pass_0:"Rule Passed",Fail_1:'Element with "{0}" role is not contained in or owned by an element with one of the following roles: "{1}"'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:"ff89c9",run:function(e,t,i){var n=e.dom.node;if(!(s.VisUtil.isNodeHiddenFromAT(n)||o.CommonUtil.isNodeDisabled(n)||r.AriaUtil.shouldBePresentationalChild(n)||s.VisUtil.isNodePresentational(n))){for(var u=!0,d=l.ARIADefinitions.designPatterns,c=new Array,m=new Array,p=0,h=i.aria.map(function(e){return e.role}),g=h[h.length-2],b=2;"none"===g;)b++,g=h[h.length-b];var _=r.AriaUtil.getResolvedRole(n);if(d[_]&&null!=d[_].container){p++,u=!1;for(var f=0,v=(m=d[_].container).length;!u&&f<v&&!(u=g===m[f]);f++);0==u&&c.push(_)}var A=new Array;A.push(c.join(", "));var w=new Array;return w.push(m.join(", ")),0==p?null:u?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[A.toString(),w.toString()])}}}},5232(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_region_label_unique=void 0;var a=i(461),n=i(461),l=i(7011),r=i(3946);t.aria_region_label_unique={id:"aria_region_label_unique",context:"aria:region",refactor:{Rpt_Aria_MultipleRegionsUniqueLabel_Implicit:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_region_label_unique.html",fail_label_not_unique:"aria_region_label_unique.html",group:"aria_region_label_unique.html"}},messages:{"en-US":{pass:'The element with "region" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "region" role do not have unique labels',group:'Each element with "region" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var o=l.AriaUtil.isLandmarkNameUnique(n,"region");return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},1891(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_region_labelled=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(3946);t.aria_region_labelled={id:"aria_region_labelled",context:"aria:region",refactor:{Rpt_Aria_RegionLabel_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_region_labelled.html",Fail_1:"aria_region_labelled.html",group:"aria_region_labelled.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Element with "region" role does not have a label',group:'Each element with "region" role must have a label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;return o.VisUtil.isNodeHiddenFromAT(n)?null:l.AriaUtil.hasAriaLabel(n)||r.CommonUtil.attributeNonEmpty(n,"title")?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},6142(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_role_allowed=void 0;var a=i(461),n=i(461),l=i(7011);t.aria_role_allowed={id:"aria_role_allowed",context:"dom:*[role]",refactor:{Rpt_Aria_ValidRole:{Pass_0:"Pass_0",Fail_2:"Fail_2",Potential_1:"Potential_1"}},help:{"en-US":{group:"aria_role_allowed.html",Pass_0:"aria_role_allowed.html",Fail_2:"aria_role_allowed.html",Potential_1:"aria_role_allowed.html"}},messages:{"en-US":{group:"Elements must have a valid 'role' per ARIA specification",Pass_0:"Rule Passed",Fail_2:"The role '{0}' defined on the element is not valid per ARIA specification",Potential_1:"Some of the roles, '{0}', defined on the element are not valid per ARIA specification"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"4.1.2",level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:"674b10",run:function(e,t,i){var n=e.dom.node,r=n.getAttribute("role").trim().toLowerCase();if(0===r.length)return null;if(n.hasAttribute("aria-hidden")&&"true"===n.getAttribute("aria-hidden").toLowerCase())return null;var o=l.AriaUtil.getRolesUndefinedByAria(n);if(!o||0===o.length)return(0,a.RulePass)("Pass_0");var s=r.split(/\s+/);return o.length===s.length?(0,a.RuleFail)("Fail_2",[o.join(",")]):o.length>0?(0,a.RulePotential)("Potential_1",[o.join(",")]):void 0}}},4863(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_role_redundant=void 0;var a=i(461),n=i(461),l=i(7011);t.aria_role_redundant={id:"aria_role_redundant",context:"dom:*[role]",help:{"en-US":{pass:"aria_role_redundant.html",fail_redundant:"aria_role_redundant.html",group:"aria_role_redundant.html"}},messages:{"en-US":{pass:"An explicitly-assigned ARIA role is not redundant with the implicit role of the element",fail_redundant:'The explicitly-assigned ARIA role "{0}" is redundant with the implicit role of the element <{1}>',group:"An explicitly-assigned ARIA role should not be redundant with the implicit role of the element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["ARIA"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,r=n.tagName.toLowerCase(),o=l.AriaUtil.getRoles(n,!1);if(o&&0!==o.length){if(!l.AriaUtil.areRolesDefined(o))return null;var s=l.AriaUtil.getImplicitRole(n);if(!s||0===s.length)return(0,a.RulePass)("pass");for(var u=[],d=0;d<o.length;d++)s.includes(o[d])?u.push((0,a.RuleFail)("fail_redundant",[o[d],r])):u.push((0,a.RulePass)("pass"));return u.length>0?u:null}}}},1440(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_search_label_unique=void 0;var a=i(461),n=i(461),l=i(7011),r=i(3946);t.aria_search_label_unique={id:"aria_search_label_unique",context:"aria:search",refactor:{Rpt_Aria_MultipleSearchLandmarks:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_search_label_unique.html",fail_label_not_unique:"aria_search_label_unique.html",group:"aria_search_label_unique.html"}},messages:{"en-US":{pass:'The element with "search" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "search" role do not have unique labels',group:'Each element with "search" role must have a unique label that describes its purpose'}},rulesets:[{id:[],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var o=l.AriaUtil.isLandmarkNameUnique(n,"search",!0);return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},1968(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_valid=t.aria_role_valid=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139);t.aria_role_valid={id:"aria_role_valid",context:"dom:*",dependencies:["aria_attribute_allowed"],refactor:{aria_semantics_role:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_0:"aria_role_valid.html",Fail_1:"aria_role_valid.html",Fail_2:"aria_role_valid.html",group:"aria_role_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The ARIA role '{0}' is not valid for the element <{1}>",Fail_2:"The ARIA role '{0}' is not valid for the element <{1}> and may be ignored by the browser since the element is focusable",group:"ARIA roles must be valid for the element to which they are assigned"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,o=n.tagName.toLowerCase();if(1!==n.nodeType)return null;var s=l.AriaUtil.getRolesUndefinedByAria(n);if(s&&s.length>0)return null;var u=l.AriaUtil.getDeprecatedAriaRoles(n);if(u&&u.length>0)return null;var d=l.AriaUtil.getDeprecatedAriaAttributes(n);if(d&&d.length>0)return null;if(["td","th","tr"].includes(o)){var c=r.CommonUtil.isTableDescendant(i);if(null!==c&&c.length>0)return null}var m=l.AriaUtil.getUserDefinedRoles(n);if(!m||0===m.length)return null;if(m.includes("generic"))return(0,a.RuleFail)("Fail_1",["generic",o]);var p=l.AriaUtil.getInvalidRoles(n);return null===p||0===p.length?(0,a.RulePass)("Pass_0",[m.join(", "),o]):p.includes("presentation")||p.includes("none")&&r.CommonUtil.isTabbable(n)?(0,a.RuleFail)("Fail_2",[p.join(", "),o]):p.length>0?(0,a.RuleFail)("Fail_1",[p.join(", "),o]):m.length>0?(0,a.RulePass)("Pass_0",[m.join(", "),o]):null}},t.aria_attribute_valid={id:"aria_attribute_valid",context:"dom:*",dependencies:["aria_attribute_deprecated","aria_role_valid"],refactor:{aria_attribute_allowed:{Pass:"Pass",Fail_invalid_role_attr:"Fail_invalid_role_attr",Fail_invalid_implicit_role_attr:"Fail_invalid_implicit_role_attr"}},help:{"en-US":{group:"aria_attribute_valid.html",Pass:"aria_attribute_valid.html",Fail_invalid_role_attr:"aria_attribute_valid.html",Fail_invalid_implicit_role_attr:"aria_attribute_valid.html"}},messages:{"en-US":{group:"ARIA attributes should be valid for the element and ARIA role to which they are assigned",Pass:"ARIA attributes are valid for the element and ARIA role",Fail_invalid_role_attr:'The ARIA attributes "{0}" are not valid for the element <{1}> with ARIA role "{2}"',Fail_invalid_implicit_role_attr:'The ARIA attributes "{0}" are not valid for the element <{1}> with implicit ARIA role "{2}"'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["ARIA"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:["5c01ea",{"46ca7f":{Pass:"pass",Fail_invalid_role_attr:"fail",Fail_invalid_implicit_role_attr:"fail"}}],run:function(e,t,i){var n=e.dom.node;if(1!==n.nodeType)return null;var r=l.AriaUtil.getUserDefinedAriaAttributes(n);if(null===r||0===r.length)return null;var o=l.AriaUtil.getUserDefinedRoles(n),s=!0;if(o&&o.length>0){if(!l.AriaUtil.areRolesDefined(o))return null}else o=l.AriaUtil.getImplicitRole(n),s=!1;var u=n.tagName.toLowerCase(),d=l.AriaUtil.getInvalidAriaAttributes(n);return d&&0!==d.length?o.length>0?s?(0,a.RuleFail)("Fail_invalid_role_attr",[d.join(", "),u,o.join(", ")]):(0,a.RuleFail)("Fail_invalid_implicit_role_attr",[d.join(", "),u,o.join(", ")]):(0,a.RuleFail)("Fail_invalid_role_attr",[d.join(", "),u,"none"]):(0,a.RulePass)("Pass",[r.join(", "),u,o.join(", ")])}}},1617(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_toolbar_label_unique=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(4566);t.aria_toolbar_label_unique={id:"aria_toolbar_label_unique",context:"aria:toolbar",refactor:{Rpt_Aria_MultipleToolbarUniqueLabel:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_toolbar_label_unique.html",Fail_1:"aria_toolbar_label_unique.html",group:"aria_toolbar_label_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "toolbar" roles do not have unique labels',group:'Each element with "toolbar" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,s=r.CommonUtil.getElementsByRoleHidden(n.ownerDocument,"toolbar",!0,!0);if(0===s.length||1===s.length)return null;var u=o.CacheUtil.getCache(n.ownerDocument,"aria_toolbar_label_unique",null);u||(u=l.AriaUtil.findAriaLabelDupes(s),o.CacheUtil.setCache(n.ownerDocument,"aria_toolbar_label_unique",u));var d=l.AriaUtil.getAriaLabel(n);return""!==d&&(!(d in u)||u[d]<=1)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[d])}}},3475(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_widget_labelled=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(9955),s=i(5279),u=i(9910),d=i(1686);t.aria_widget_labelled={id:"aria_widget_labelled",context:"dom:*",refactor:{Rpt_Aria_WidgetLabels_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"aria_widget_labelled.html",Pass_0:"aria_widget_labelled.html",Fail_1:"aria_widget_labelled.html"}},messages:{"en-US":{group:"Interactive component must have a programmatically associated name",Pass_0:"Rule Passed",Fail_1:"Interactive component with ARIA role '{0}' does not have a programmatically associated name"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:"m6b1q3",run:function(e,t,i){var n=e.dom.node;if(n.hasAttribute("type")&&"hidden"===n.getAttribute("type")||l.AriaUtil.getAncestorWithRole(n,"combobox")&&!l.AriaUtil.hasRoleInSemantics(n,"textbox")&&!l.AriaUtil.hasRoleInSemantics(n,"searchbox"))return null;var c=o.ARIAMapper.nodeToRole(n),m=n.nodeName.toLowerCase();if(["button","checkbox","combobox","listbox","menuitemcheckbox","menuitemradio","radio","searchbox","slider","spinbutton","switch","textbox","progressbar","link"].includes(c))return null;if("output"===m||"input"===m&&n.getAttribute("type"),!n.hasAttribute("role")&&-1!=["input","textarea","select","button","datalist","optgroup","option","keygen","output","progress","meter"].indexOf(n.nodeName.toLowerCase()))return null;for(var p=["listbox","tree","grid","dialog"],h=0;h<p.length;h++)if(l.AriaUtil.hasRoleInSemantics(n,p[h]))for(var g=r.CommonUtil.getElementsByRoleHidden(n.ownerDocument,"combobox",!0,!0),b=0;b<g.length;b++){var _=g[b],f=r.CommonUtil.getElementAttribute(_,"aria-owns");if(f)for(var v=r.CommonUtil.normalizeSpacing(f.trim()).split(" "),A=0;A<v.length;A++)if(s.FragmentUtil.getById(n,v[A])===n)return null}for(var w=!0,y=u.ARIADefinitions.designPatterns,C=l.AriaUtil.getRoles(n,!0),k=0,R=["widget","liveRegion","window"],x=(A=0,C.length);w&&A<x;++A){var P=y[C[A]];P&&P.nameRequired&&P.roleType&&R.includes(P.roleType)&&(++k,!(w=l.AriaUtil.hasAriaLabel(n)||r.CommonUtil.attributeNonEmpty(n,"title")||r.CommonUtil.getLabelForElementHidden(n,!0))&&P.nameFrom&&P.nameFrom.indexOf("contents")>=0&&(w=r.CommonUtil.hasInnerContentOrAlt(n)),w||(w=r.CommonUtil.hasImplicitLabel(n)),w||"img"!==n.tagName.toLowerCase()||n.hasAttribute("role")||!n.hasAttribute("alt")||(w=d.DOMUtil.cleanWhitespace(n.getAttribute("alt")).trim().length>0),P.nameFrom.indexOf("prohibited"))}return 0===k?null:w?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[c])}}},3370(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.asciiart_alt_exists=void 0;var a=i(461),n=i(7139);t.asciiart_alt_exists={id:"asciiart_alt_exists",context:"dom:pre, dom:listing, dom:xmp, dom:plaintext",refactor:{RPT_Pre_ASCIIArt:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"asciiart_alt_exists.html",Potential_1:"asciiart_alt_exists.html",group:"asciiart_alt_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that ASCII art has a text alternative",group:"ASCII art must have a text alternative"}},rulesets:[],act:[],run:function(e,t,i){var l=e.dom.node;if("pre"==l.nodeName.toLowerCase()&&(l.previousSibling&&"code"==l.previousSibling.nodeName.toLowerCase()||l.getElementsByTagName("code").length>0||n.CommonUtil.getAncestor(l,"code")))return(0,a.RulePass)("Pass_0");for(var r=!0,o=n.CommonUtil.getInnerText(l),s=0,u=0,d="",c=0;r&&c<o.length;++c){var m=o.substr(c,1);/[\w!@#$%&\*().,?\[\]{}<>=":\/\\-]/.test(m)?d==m?u+=1:u=0:(/\s/.test(m)||(s+=1),u=0),d=m,(s>=5||u>=4)&&(r=!1)}return r?(0,a.RulePass)("Pass_0"):r?void 0:(0,a.RulePotential)("Potential_1")}}},9272(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.blink_css_review=void 0;var a=i(461),n=i(461),l=i(7139);t.blink_css_review={id:"blink_css_review",context:"dom:style, dom:*[style]",refactor:{RPT_Blink_CSSTrigger1:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{group:"blink_css_review.html",Pass_0:"blink_css_review.html",Potential_1:"blink_css_review.html"}},messages:{"en-US":{group:"Do not use the \"blink\" value of the 'text-decoration' property for longer than five seconds",Pass_0:"Rule Passed",Potential_1:"Check the \"blink\" value of the CSS 'text-decoration' property is not used for more than than five seconds"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"2.2.2",level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node,r=l.CommonUtil.getInnerText(n);n.hasAttribute("style")&&(r=n.getAttribute("style"));var o=-1==r.toLowerCase().indexOf("text-decoration:blink");return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},7735(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.blink_elem_deprecated=void 0;var a=i(461),n=i(461);t.blink_elem_deprecated={id:"blink_elem_deprecated",context:"dom:blink",refactor:{WCAG20_Blink_AlwaysTrigger:{Fail_1:"Fail_1"}},help:{"en-US":{group:"blink_elem_deprecated.html",Fail_1:"blink_elem_deprecated.html"}},messages:{"en-US":{group:"Content that blinks persistently must not be used",Fail_1:"Content found that blinks persistently"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"2.2.2",level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){return(0,a.RuleFail)("Fail_1")}}},3923(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.blockquote_cite_exists=void 0;var a=i(461),n=i(461),l=i(7139);t.blockquote_cite_exists={id:"blockquote_cite_exists",context:"dom:blockquote",refactor:{RPT_Blockquote_HasCite:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"blockquote_cite_exists.html",Potential_1:"blockquote_cite_exists.html",group:"blockquote_cite_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that <blockquote> should have a 'cite' attribute and not be used for indentation only",group:"Use <blockquote> only for quotations, not indentation"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,r=l.CommonUtil.attributeNonEmpty(n,"cite");if(!r){var o=l.CommonUtil.getDocElementsByTag(n,"cite");r=null!=o&&o.length>0}return r?(0,a.RulePass)("Pass_0"):r?void 0:(0,a.RulePotential)("Potential_1")}}},7521(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.canvas_content_described=void 0;var a=i(461),n=i(461),l=i(3946);t.canvas_content_described={id:"canvas_content_described",context:"dom:canvas",refactor:{HAAC_Canvas:{Pass_0:"Pass_0",Manual_1:"Manual_1"}},help:{"en-US":{Pass_0:"canvas_content_described.html",Manual_1:"canvas_content_described.html",group:"canvas_content_described.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Manual_1:"Verify accessibility of the <canvas> element",group:"The <canvas> element may not be accessible"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1","2.1.1","4.1.2"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var r=n.innerHTML.trim().length>0;return r?(0,a.RulePass)("Pass_0"):r?void 0:(0,a.RuleManual)("Manual_1")}}},1852(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.caption_track_exists=void 0;var a=i(461),n=i(461);t.caption_track_exists={id:"caption_track_exists",context:"dom:video",refactor:{HAAC_Video_HasNoTrack:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"caption_track_exists.html",Potential_1:"caption_track_exists.html",group:"caption_track_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that captions are available for any meaningful audio or provide a caption track for the <video> element",group:"A <video> element must have a text alternative for any meaningful audio content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.2.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,l=!1;if("true"===n.getAttribute("aria-hidden"))return null;for(var r=n.getElementsByTagName("track"),o=0;o<r.length;++o)l=l||"captions"===r[o].getAttribute("kind");if(n.textTracks&&n.textTracks.length>0)for(o=0;o<n.textTracks.length;o++)l=l||"captions"===n.textTracks[o].kind;return l?(0,a.RulePass)("Pass_0"):(0,a.RulePotential)("Potential_1")}}},799(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.combobox_active_descendant=void 0;var a=i(461),n=i(461),l=i(7011),r=i(5279),o=i(3864),s=i(4566),u=i(3946);t.combobox_active_descendant={id:"combobox_active_descendant",context:"aria:combobox",dependencies:["combobox_popup_reference"],help:{"en-US":{Pass:"combobox_active_descendant.html",Fail_missing:"combobox_active_descendant.html",Fail_not_in_popup:"combobox_active_descendant.html",Fail_active_role_invalid:"combobox_active_descendant.html",Fail_active_not_selected:"combobox_active_descendant.html",group:"combobox_active_descendant.html"}},messages:{"en-US":{Pass:"'aria-activedescendant' is used appropriately for this combobox",Fail_missing:"The element referenced by 'aria-activedescendant' \"{0}\" does not exist",Fail_not_in_popup:"The element referenced by 'aria-activedescendant' \"{0}\" does not exist within the popup referenced by 'id' \"{1}\"",Fail_active_role_invalid:"The 'aria-activedescendant' \"{0}\" references an element with the roles \"{1}\", which does not have a valid ARIA role of 'option', 'gridcell', 'row', or 'treeitem'",Fail_active_not_selected:"The 'aria-activedescendant' \"{0}\" references an element that does not have 'aria-selected' set to true",group:"'aria-activedescendant' must be used to define focus within the combobox popup, except when using a dialog popup"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,d=s.CacheUtil.getCache(n.ownerDocument,"combobox",{});if(!d)return null;var c=d[e.dom.rolePath];if(!c)return null;var m=c.popupElement,p=c.popupId;if(!m)return null;var h=n.getAttribute("aria-activedescendant");if(!h||0===h.trim().length)return null;var g=r.FragmentUtil.getById(n,h);if(!g)return(0,a.RuleFail)("Fail_missing",[h]);var b=!1;if(m)for(var _=new o.DOMWalker(m);!b&&_.nextNode()&&_.node!=m&&_.node!=m.nextSibling;)1===_.node.nodeType&&u.VisUtil.isNodeVisible(_.node)&&(b=_.elem().getAttribute("id")===h);var f=[];b||f.push((0,a.RulePass)("Fail_not_in_popup",[h,p]));var v=l.AriaUtil.getRoles(g,!0);return 0===["option","gridcell","row","treeitem"].filter(function(e){return v.includes(e)}).length&&f.push((0,a.RuleFail)("Fail_active_role_invalid",[h,v.join(",")])),"true"!==g.getAttribute("aria-selected")&&f.push((0,a.RuleFail)("Fail_active_not_selected",[h])),0===f.length?(0,a.RulePass)("Pass"):f}}},4614(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.combobox_autocomplete_valid=void 0;var a=i(461),n=i(461),l=i(3864),r=i(4566),o=i(3946);t.combobox_autocomplete_valid={id:"combobox_autocomplete_valid",context:"aria:combobox",dependencies:["combobox_popup_reference"],refactor:{combobox_autocomplete:{Pass:"Pass",Fail_1:"Fail_1",Fail_inline:"Fail_inline"}},help:{"en-US":{Pass:"combobox_autocomplete_valid.html",Fail_1:"combobox_autocomplete_valid.html",Fail_inline:"combobox_autocomplete_valid.html",group:"combobox_autocomplete_valid.html"}},messages:{"en-US":{Pass:"The combobox does not use 'aria-autocomplete' value '\"inline\"' nor does it have 'aria-autocomplete' defined within the popup",Fail_1:"The combobox has the 'aria-autocomplete' attribute incorrectly set on an element within the popup referenced by \"{0}\"",Fail_inline:"The combobox does not support an 'aria-autocomplete' attribute value set to '\"inline\"' ",group:"A combobox that supports autocompletion behavior must have the 'aria-autocomplete' attribute only on its text input element with a valid value; a value of '\"inline\"' is not supported"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,s=r.CacheUtil.getCache(n.ownerDocument,"combobox",{});if(!s)return null;var u=s[e.dom.rolePath];if(!u)return null;var d=u.popupId,c=u.popupElement,m=[];"inline"===n.getAttribute("aria-autocomplete")&&m.push((0,a.RuleFail)("Fail_inline"));var p=!0;if(c&&o.VisUtil.isNodeVisible(c)&&(p=!c.hasAttribute("aria-autocomplete"))&&c.children&&c.children.length>0)for(var h=new l.DOMWalker(c);p&&h.nextNode()&&(1!==h.node.nodeType||!o.VisUtil.isNodeVisible(h.node)||(p=!h.elem().hasAttribute("aria-autocomplete"),!h.bEndTag||h.node!==c.lastElementChild)););return p||m.push((0,a.RuleFail)("Fail_1",[d])),m.length>0?m:(0,a.RulePass)("Pass")}}},5952(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.combobox_design_valid=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(3946),s=i(4566);t.combobox_design_valid={id:"combobox_design_valid",context:"aria:combobox",refactor:{combobox_version:{"Pass_1.0":"Pass_1.0","Fail_1.1":"Fail_1.1","Pass_1.2":"Pass_1.2"}},help:{"en-US":{"Pass_1.0":"combobox_design_valid.html","Fail_1.1":"combobox_design_valid.html","Pass_1.2":"combobox_design_valid.html",group:"combobox_design_valid.html"}},messages:{"en-US":{"Pass_1.0":"The combobox design pattern is detected as ARIA 1.0, which is allowed by ARIA 1.2","Fail_1.1":"The combobox design pattern is detected as ARIA 1.1, which is not allowed by ARIA 1.2","Pass_1.2":"The combobox design pattern is detected as ARIA 1.2",group:"The combobox design pattern must be valid for ARIA 1.2"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(!o.VisUtil.isNodeVisible(n)||r.CommonUtil.isNodeDisabled(n))return null;var u,d="select"===(u=n).tagName.toLowerCase()&&"combobox"!==u.getAttribute("role")?"implicit":"input"!==u.nodeName.toLowerCase()||u.hasAttribute("type")&&"text"!==u.getAttribute("type")||!u.hasAttribute("aria-owns")||u.hasAttribute("aria-controls")?"input"!==u.nodeName.toLowerCase()&&u.hasAttribute("aria-owns")&&!u.hasAttribute("aria-controls")?"1.1":"1.2":"1.0";if("implicit"===d)return null;var c=n.tagName.toLowerCase(),m="true"===(l.AriaUtil.getAriaAttribute(n,"aria-expanded")||"").trim().toLowerCase(),p="input"===c&&(!n.hasAttribute("type")||"text"===n.getAttribute("type").toLowerCase()),h=e.dom.rolePath;if(!h)return null;var g=s.CacheUtil.getCache(n.ownerDocument,"combobox",{});return g?(g[h]={inputElement:p?n:null,pattern:d,expanded:m},s.CacheUtil.setCache(n.ownerDocument,"combobox",g),"1.0"===d?(0,a.RulePass)("Pass_1.0"):"1.1"===d?(0,a.RuleFail)("Fail_1.1"):"1.2"===d?(0,a.RulePass)("Pass_1.2"):void 0):null}}},5395(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.combobox_focusable_elements=void 0;var a=i(461),n=i(461),l=i(3864),r=i(7011),o=i(7139),s=i(4566),u=i(3946);t.combobox_focusable_elements={id:"combobox_focusable_elements",context:"aria:combobox",dependencies:["combobox_popup_reference"],help:{"en-US":{Pass:"combobox_focusable_elements.html",Fail_not_tabbable:"combobox_focusable_elements.html",Fail_tabbable_child:"combobox_focusable_elements.html",group:"combobox_focusable_elements.html"}},messages:{"en-US":{Pass:"DOM focus is allowed only on the combobox element as required",Fail_not_tabbable:"The combobox element does not allow DOM focus as required",Fail_tabbable_child:"The popup of the combobox has DOM focus or has 'aria-activedescendant' defined, which is not allowed",group:"Tabbable focus for the combobox must be allowed only on the text input, except when using a dialog popup"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,d=s.CacheUtil.getCache(n.ownerDocument,"combobox",{});if(!d)return null;var c=d[e.dom.rolePath];if(!c)return null;var m=c.popupElement,p=c.expanded;if(!m)return null;var h=r.AriaUtil.getRoles(m,!0)[0],g=[];if(o.CommonUtil.isTabbable(n)||g.push((0,a.RuleFail)("Fail_not_tabbable")),!1===p||"dialog"===h)return(0,a.RulePass)("Pass");var b=!0;if(m&&u.VisUtil.isNodeVisible(m)&&(b=!o.CommonUtil.isTabbable(m)&&!r.AriaUtil.getAriaAttribute(m,"aria-activedescendant"))&&m.children&&m.children.length>0)for(var _=new l.DOMWalker(m);b&&_.nextNode()&&(1!==_.node.nodeType||!u.VisUtil.isNodeVisible(_.node)||(b=!o.CommonUtil.isTabbable(_.node)&&!r.AriaUtil.getAriaAttribute(_.node,"aria-activedescendant"),!_.bEndTag||_.node!==m.lastElementChild)););return b||g.push((0,a.RuleFail)("Fail_tabbable_child")),0===g.length?(0,a.RulePass)("Pass"):g}}},1992(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.combobox_haspopup_valid=void 0;var a=i(461),n=i(461),l=i(7011),r=i(4566);t.combobox_haspopup_valid={id:"combobox_haspopup_valid",context:"aria:combobox",dependencies:["combobox_popup_reference"],refactor:{combobox_haspopup:{Pass:"Pass",Fail_popup_role_invalid:"Fail_popup_role_invalid",Fail_combobox_popup_role_mismatch:"Fail_combobox_popup_role_mismatch"}},help:{"en-US":{Pass:"combobox_haspopup_valid.html",Fail_popup_role_invalid:"combobox_haspopup_valid.html",Fail_combobox_popup_role_mismatch:"combobox_haspopup_valid.html",group:"combobox_haspopup_valid.html"}},messages:{"en-US":{Pass:"The 'aria-controls' (ARIA 1.2) or 'aria-owns' (ARIA 1.0) appropriately references a valid popup 'id' value",Fail_popup_role_invalid:'The \'role\' value "{0}" of the popup element "{1}" should be one of "listbox", "grid", "tree" or "dialog"',Fail_combobox_popup_role_mismatch:"The value of the combobox 'aria-haspopup' attribute \"{0}\" does not match the 'role' value of the popup element \"{1}\"",group:"The combobox attribute 'aria-haspopup' value must be appropriate for the role of the element referenced by 'aria-controls' (ARIA 1.2) or 'aria-owns' (ARIA 1.0)"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,o=r.CacheUtil.getCache(n.ownerDocument,"combobox",{});if(!o)return null;var s=o[e.dom.rolePath];if(!s)return null;var u=s.popupElement,d=s.popupId;if(!u)return null;var c=l.AriaUtil.getRoles(u,!0),m=["listbox","grid","tree","dialog"].filter(function(e){return c.includes(e)});if(0===m.length)return(0,a.RuleFail)("Fail_popup_role_invalid",[c.join(","),d]);var p=m[0],h=n.getAttribute("aria-haspopup")||"listbox";return h===p||"listbox"===p&&!n.hasAttribute("aria-haspopup")?(0,a.RulePass)("Pass"):(0,a.RuleFail)("Fail_combobox_popup_role_mismatch",[h,p])}}},7955(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.combobox_popup_reference=void 0;var a=i(461),n=i(461),l=i(5279),r=i(4566),o=i(3946);t.combobox_popup_reference={id:"combobox_popup_reference",context:"aria:combobox",dependencies:["combobox_design_valid"],help:{"en-US":{group:"combobox_popup_reference.html","Pass_1.0_expanded":"combobox_popup_reference.html","Pass_1.0_collapsed":"combobox_popup_reference.html","Pass_1.2_expanded":"combobox_popup_reference.html","Pass_1.2_collapsed":"combobox_popup_reference.html","Fail_1.0_missing_owns":"combobox_popup_reference.html","Fail_1.2_missing_controls":"combobox_popup_reference.html","Fail_1.0_popup_reference_missing":"combobox_popup_reference.html","Fail_1.2_popup_reference_missing":"combobox_popup_reference.html",Fail_combobox_expanded_hidden:"combobox_popup_reference.html",Fail_combobox_collapsed_visible:"combobox_popup_reference.html"}},messages:{"en-US":{group:"The 'aria-controls' (for ARIA 1.2) or the 'aria-owns' (for ARIA 1.0) attribute of the expanded combobox must reference a valid popup 'id' value","Pass_1.0_expanded":"The combobox popup referenced by 'aria-owns' (ARIA 1.0) exists and is visible","Pass_1.0_collapsed":"The combobox popup in its collapsed state does not reference any visible popup as required","Pass_1.2_expanded":"The combobox popup referenced by 'aria-controls' (ARIA 1.2) exists and is visible","Pass_1.2_collapsed":"The combobox popup in its collapsed state does not reference any visible popup as required","Fail_1.0_missing_owns":"The 'aria-owns' attribute of the expanded combobox is missing","Fail_1.2_missing_controls":"The 'aria-controls' attribute of the expanded combobox is missing","Fail_1.0_popup_reference_missing":"The 'aria-owns' attribute \"{0}\" of the expanded combobox does not reference a valid popup 'id' value","Fail_1.2_popup_reference_missing":"The 'aria-controls' attribute \"{0}\" of the expanded combobox does not reference a valid popup 'id' value",Fail_combobox_expanded_hidden:"The combobox 'aria-expanded' attribute is true, but the combobox popup is not visible",Fail_combobox_collapsed_visible:"The combobox 'aria-expanded' attribute is false, but the combobox popup is visible"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[{"4e8ab6":{"Pass_1.0_expanded":"fail","Pass_1.0_collapsed":"fail","Pass_1.2_expanded":"pass","Pass_1.2_collapsed":"pass","Fail_1.0_missing_owns":"inapplicable","Fail_1.2_missing_controls":"fail","Fail_1.0_popup_reference_missing":"inapplicable","Fail_1.2_popup_reference_missing":"fail",Fail_combobox_expanded_hidden:"inapplicable",Fail_combobox_collapsed_visible:"inapplicable"}}],run:function(e,t,i){var n=e.dom.node,s=r.CacheUtil.getCache(n.ownerDocument,"combobox",{});if(!s)return null;var u=s[e.dom.rolePath];if(!u)return null;var d,c,m=u.pattern,p=u.expanded;if("1.0"===m){if(!n.hasAttribute("aria-owns"))return p?(0,a.RuleFail)("Fail_1.0_missing_owns"):null;if(d=n.getAttribute("aria-owns"),!(c=l.FragmentUtil.getById(n,d)))return p?(0,a.RuleFail)("Fail_1.0_popup_reference_missing",[d]):null}else{if("1.2"!==m)return null;if(!n.hasAttribute("aria-controls"))return p?(0,a.RuleFail)("Fail_1.2_missing_controls"):null;if(d=n.getAttribute("aria-controls"),!(c=l.FragmentUtil.getById(n,d)))return p?(0,a.RuleFail)("Fail_1.2_popup_reference_missing",[d]):null}return u.popupId=d,u.popupElement=c,p&&!o.VisUtil.isNodeVisible(c)?(0,a.RuleFail)("Fail_combobox_expanded_hidden"):!p&&o.VisUtil.isNodeVisible(c)?(0,a.RuleFail)("Fail_combobox_collapsed_visible"):"1.0"===m?p?(0,a.RulePass)("Pass_1.0_expanded"):(0,a.RulePass)("Pass_1.0_collapsed"):p?(0,a.RulePass)("Pass_1.2_expanded"):(0,a.RulePass)("Pass_1.2_collapsed")}}},9531(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.debug_paths=void 0;var a=i(461);t.debug_paths={id:"debug_paths",context:"dom:*",help:{"en-US":{group:"",Pass_0:""}},messages:{"en-US":{group:"",Pass_0:""}},rulesets:[{id:["DEBUG"],num:"1",level:a.eRulePolicy.INFORMATION,toolkitLevel:a.eToolkitLevel.LEVEL_FOUR}],act:[],run:function(e,t,i){var a=e.dom.node;return a.setAttribute("domPath",e.dom.rolePath),a.setAttribute("ariaPath",e.aria.rolePath),null}}},891(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.detector_tabbable=void 0;var a=i(7139),n=i(461),l=i(461);t.detector_tabbable={id:"detector_tabbable",context:"dom:*",help:{"en-US":{group:"",Pass_0:""}},messages:{"en-US":{group:"",Pass_0:""}},rulesets:[{id:["EXTENSIONS"],num:"1",level:l.eRulePolicy.INFORMATION,toolkitLevel:l.eToolkitLevel.LEVEL_FOUR}],act:[],run:function(e,t,i){var l=e.dom.node;if(!a.CommonUtil.isTabbable(l))return null;var r=i.aria[i.aria.length-1];return(0,n.RulePass)("Pass_0",[],[{name:r.attributes.name,role:r.role,tabindex:parseInt(l.getAttribute("tabindex")||"0")}])}}},7446(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.dir_attribute_valid=void 0;var a=i(461),n=i(461);t.dir_attribute_valid={id:"dir_attribute_valid",context:"dom:*[dir]",refactor:{Valerie_Elem_DirValid:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"dir_attribute_valid.html",Fail_1:"dir_attribute_valid.html",group:"dir_attribute_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Invalid value used for the 'dir' attribute",group:'\'dir\' attribute value must be "ltr", "rtl", or "auto"'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node.getAttribute("dir").toLowerCase();return"ltr"==n||"rtl"==n||"auto"==n?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},6137(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.download_keyboard_controllable=void 0;var a=i(461),n=i(461),l=i(7139),r=i(3946);t.download_keyboard_controllable={id:"download_keyboard_controllable",context:"dom:a[href],dom:area[href]",refactor:{HAAC_Media_DocumentTrigger2:{Manual_1:"Manual_1"}},help:{"en-US":{Manual_1:"download_keyboard_controllable.html",group:"download_keyboard_controllable.html"}},messages:{"en-US":{Manual_1:"Verify that the file download mechanism does not cause a keyboard trap",group:"File download mechanisms should be keyboard-operable and preserve page focus location"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.2"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var o=n.getAttribute("href"),s=l.CommonUtil.getFileExt(o),u=![".docx",".doc",".pdf",".odt"].includes(s);return u?null:u?void 0:(0,a.RuleManual)("Manual_1")}}},6839(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.draggable_alternative_exists=void 0;var a=i(7139),n=i(461),l=i(461),r=i(3946);t.draggable_alternative_exists={id:"draggable_alternative_exists",context:"dom:*[draggable]",dependencies:[],help:{"en-US":{group:"draggable_alternative_exists.html",pass_undraggable:"draggable_alternative_exists.html",potential_alternative:"draggable_alternative_exists.html"}},messages:{"en-US":{group:'A draggable element must have a "single pointer" alternative',pass_undraggable:'The element "{0}" is not draggable',potential_alternative:'Ensure the draggable element "{0}" has a "single pointer" alternative'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_2"],num:["2.5.7"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node;if(!r.VisUtil.isNodeVisible(l))return null;var o=l.nodeName.toLocaleLowerCase();return null!==a.CommonUtil.getAncestor(l,["pre","code","script","meta"])||"body"===o||"html"===o?null:"true"===l.getAttribute("draggable")?(0,n.RulePotential)("potential_alternative",[o]):"false"===l.getAttribute("draggable")?(0,n.RulePass)("pass_undraggable",[o]):null}}},8135(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_accesskey_labelled=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(3946),s=i(9910),u=i(1950);t.element_accesskey_labelled={id:"element_accesskey_labelled",context:"dom:*[accesskey]",refactor:{HAAC_Accesskey_NeedLabel:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"element_accesskey_labelled.html",Potential_1:"element_accesskey_labelled.html",group:"element_accesskey_labelled.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"The element with an assigned 'accesskey' attribute does not have an associated label",group:"An element with an assigned 'accesskey' attribute must have an associated label"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.3.2"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(o.VisUtil.isNodeVisible(n)&&!r.CommonUtil.isNodeDisabled(n)&&!r.CommonUtil.isTabbable(n)){var d=l.AriaUtil.getRoles(n,!0);if(d&&0!==d.length){var c=s.ARIADefinitions.designPatterns[d[0]];if(c&&c.nameFrom&&!c.nameRequired&&c.nameFrom&&!c.nameFrom.includes("prohibited")&&(!n.parentElement||"fieldset"!==n.parentElement.nodeName.toLowerCase())){var m=u.AccNameUtil.computeAccessibleName(n);return m&&m.name&&m.name.trim().length>0?(0,a.RulePass)("Pass_0"):(0,a.RulePotential)("Potential_1")}}}}}},507(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_accesskey_unique=void 0;var a=i(461),n=i(461),l=i(4566);t.element_accesskey_unique={id:"element_accesskey_unique",context:"dom:*[accesskey]",refactor:{WCAG20_Elem_UniqueAccessKey:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"element_accesskey_unique.html",Fail_1:"element_accesskey_unique.html",group:"element_accesskey_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"'accesskey' attribute value on the element is not unique",group:"'accesskey' attribute values on each element must be unique for the page"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["HTML"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,r=l.CacheUtil.getCache(n.ownerDocument,"element_accesskey_unique",{}),o=n.getAttribute("accesskey"),s=!(o in r);return r[o]=!0,s?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},3566(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_attribute_deprecated=void 0;var a=i(461),n=i(461),l=["applet","basefont","center","dir","font","isindex","listing","plaintext","spacer","s","strike","u","xmp","acronym","frame","frameset","noframes","noembed","big","blink","marquee","tt"],r=["align","link","archive","background","bgcolor","clear","code","color","compact","face","hspace","language","link","noshade","nowrap","object","prompt","start","text","version","vlink","vspace"],o={td:["height","width","abbr","axis","char","charoff","height","nowrap","valign","width","align","bgcolor"],th:["height","width","abbr","axis","charoff","height","bgcolor","align","nowrap","char","valign","width"],li:["type","value","type"],ul:["type","compact"],pre:["width"],meta:["http-equiv"],a:["charset","coords","shape","rev","scheme"],link:["rev","charset","target"],img:["name","longdesc","align","hspace","vspace","border"],area:["nohref"],head:["profile"],html:["version"],iframe:["longdesc","align","frameborder","marginheight","marginwidth","scrolling"],object:["archive","code","codebase","codetype","declare","standby","align","hspace","vspace","border"],param:["type","valuetype"],script:["language"],body:["alink","background","bgcolor","link","text","vlink"],br:["clear"],caption:["align"],col:["align","char","charoff","valign","width"],div:["align"],dl:["compact"],hr:["align","noshade","size","width","align"],h2:["align"],h3:["align"],h4:["align"],h5:["align"],h6:["align"],input:["align","usemap"],legend:["align"],menu:["compact"],ol:["compact","type","type"],p:["align"],table:["bgcolor","cellpadding","cellspacing","frame","rules","width","align"],tbody:["align","char","valign","charoff"],tfoot:["align","charoff","char","valign"],thead:["char","charoff","valign","align"],tr:["align","bgcolor","char","charoff","valign"]};t.element_attribute_deprecated={id:"element_attribute_deprecated",context:"dom:applet, dom:basefont, dom:center, dom:dir, dom:font, dom:isindex, dom:listing, dom:menu, dom:plaintext, dom:spacer, dom:s, dom:strike, dom:u, dom:xmp, dom:acronym, dom:frame, dom:frameset, dom:noframes, dom:noembed, dom:big, dom:blink, dom:marquee, dom:ttNaNdom:*[align], dom:*[link], dom:*[archive], dom:*[background], dom:*[bgcolor], dom:*[clear], dom:*[code], dom:*[color], dom:*[compact], dom:*[face], dom:*[hspace], dom:*[language], dom:*[link], dom:*[noshade], dom:*[nowrap], dom:*[object], dom:*[prompt], dom:*[start], dom:*[text], dom:*[version], dom:*[vlink], dom:*[vspace]NaNdom:td[height], dom:td[width], dom:td[abbr], dom:td[axis], dom:td[char], dom:td[charoff], dom:td[height], dom:td[nowrap], dom:td[valign], dom:td[width], dom:td[align], dom:td[bgcolor], dom:th[height], dom:th[width], dom:th[abbr], dom:th[axis], dom:th[charoff], dom:th[height], dom:th[bgcolor], dom:th[align], dom:th[nowrap], dom:th[char], dom:th[valign], dom:th[width], dom:li[type], dom:li[value], dom:li[type], dom:ul[type], dom:ul[compact], dom:pre[width], dom:meta[http-equiv], dom:a[charset], dom:a[coords], dom:a[shape], dom:a[rev], dom:a[scheme], dom:link[rev], dom:link[charset], dom:link[target], dom:img[name], dom:img[longdesc], dom:img[align], dom:img[hspace], dom:img[vspace], dom:img[border], dom:area[nohref], dom:head[profile], dom:html[version], dom:iframe[longdesc], dom:iframe[align], dom:iframe[frameborder], dom:iframe[marginheight], dom:iframe[marginwidth], dom:iframe[scrolling], dom:object[archive], dom:object[code], dom:object[codebase], dom:object[codetype], dom:object[declare], dom:object[standby], dom:object[align], dom:object[hspace], dom:object[vspace], dom:object[border], dom:param[type], dom:param[valuetype], dom:script[language], dom:body[alink], dom:body[background], dom:body[bgcolor], dom:body[link], dom:body[text], dom:body[vlink], dom:br[clear], dom:caption[align], dom:col[align], dom:col[char], dom:col[charoff], dom:col[valign], dom:col[width], dom:div[align], dom:dl[compact], dom:hr[align], dom:hr[noshade], dom:hr[size], dom:hr[width], dom:hr[align], dom:h2[align], dom:h3[align], dom:h4[align], dom:h5[align], dom:h6[align], dom:input[align], dom:input[usemap], dom:legend[align], dom:menu[compact], dom:ol[compact], dom:ol[type], dom:ol[type], dom:p[align], dom:table[bgcolor], dom:table[cellpadding], dom:table[cellspacing], dom:table[frame], dom:table[rules], dom:table[width], dom:table[align], dom:tbody[align], dom:tbody[char], dom:tbody[valign], dom:tbody[charoff], dom:tfoot[align], dom:tfoot[charoff], dom:tfoot[char], dom:tfoot[valign], dom:thead[char], dom:thead[charoff], dom:thead[valign], dom:thead[align], dom:tr[align], dom:tr[bgcolor], dom:tr[char], dom:tr[charoff], dom:tr[valign]",help:{"en-US":{pass:"element_attribute_deprecated.html",fail_elem:"element_attribute_deprecated.html",fail_attr:"element_attribute_deprecated.html",fail_elem_attr:"element_attribute_deprecated.html",group:"element_attribute_deprecated.html"}},messages:{"en-US":{pass:"Rule Passed",fail_elem:"The <{0}> element is deprecated in HTML 5",fail_attr:'The HTML attribute(s) "{0}" is deprecated in HTML 5',fail_elem_attr:'The HTML attribute(s) "{0}" is deprecated for the <{1}> element in HTML 5',group:"Avoid use of obsolete features if possible"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["HTML"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if("tbody"===n.nodeName.toLowerCase()&&n.hasAttribute("align"))return(0,a.RulePass)("pass");if(n.nodeName.includes("-"))return null;var s=n.nodeName.toLowerCase();if(l.includes(s))return(0,a.RuleFail)("fail_elem",[s]);for(var u=n.getAttributeNames(),d="",c=0,m=u;c<m.length;c++){var p=m[c];r.includes(p)&&(""!==d&&(d+=", "),d+=p)}if(""!==d)return(0,a.RuleFail)("fail_attr",[d]);if(d="",s in o){for(var h=0,g=u;h<g.length;h++)p=g[h],o[s]&&o[s].includes(p)&&(""!==d&&(d+=", "),d+=p);if(""!==d)return(0,a.RuleFail)("fail_elem_attr",[d,s])}return(0,a.RulePass)("pass")}}},5173(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_id_unique=void 0;var a=i(461),n=i(461),l=i(5279);t.element_id_unique={id:"element_id_unique",context:"dom:*[id]",refactor:{RPT_Elem_UniqueId:{Pass_0:"pass",Fail_1:"potential_empty",Fail_2:"potential_in_use"}},help:{"en-US":{group:"element_id_unique.html",pass:"element_id_unique.html",potential_empty:"element_id_unique.html",potential_in_use:"element_id_unique.html"}},messages:{"en-US":{group:"Element 'id' attribute values must be unique within a document",pass:"Rule Passed",potential_empty:'The <{0}> element has the id "{1}" that is empty',potential_in_use:'The <{0}> element has the id "{1}" that is already in use'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["HTML"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[{"3ea0c8":{pass:"pass",potential_empty:"pass",potential_in_use:"fail"}}],run:function(e,t,i){var n=e.dom.node,r=n.getAttribute("id");return""===r?(0,a.RulePotential)("potential_empty",[n.nodeName.toLowerCase(),r]):l.FragmentUtil.getById(n,r)===n?(0,a.RulePass)("pass"):(0,a.RulePotential)("potential_in_use",[n.nodeName.toLowerCase(),r])}}},6027(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_lang_valid=t.html_lang_valid=void 0;var a=i(461),n=i(461),l=i(1043),r=i(3946),o=i(3864),s=i(1950),u=function(e){var t=e.dom.node,i=t.nodeName.toLowerCase();if(t.hasAttribute("lang"))if("html"!==i&&""===t.getAttribute("lang"));else{var a=t.getAttribute("lang");if(!l.LangUtil.validPrimaryLang(a))return 1;if(!l.LangUtil.isBcp47(a))return 2}if(t.hasAttribute("xml:lang"))if("html"!==i&&""===t.getAttribute("xml:lang"));else{if(a=t.getAttribute("xml:lang"),!l.LangUtil.validPrimaryLang(a))return 3;if(!l.LangUtil.isBcp47(a))return 4}return 0};t.html_lang_valid={id:"html_lang_valid",context:"dom:html[lang], dom:html[xml:lang]",help:{"en-US":{Pass_0:"html_lang_valid.html",Fail_1:"html_lang_valid.html",Fail_2:"html_lang_valid.html",Fail_3:"html_lang_valid.html",Fail_4:"html_lang_valid.html",group:"html_lang_valid.html"}},messages:{"en-US":{Pass_0:"Lang has a valid primary lang and conforms to BCP 47",Fail_1:"Specified 'lang' attribute does not include a valid primary language",Fail_2:"Specified 'lang' attribute does not conform to BCP 47",Fail_3:"Specified 'xml:lang' attribute does not include a valid primary language",Fail_4:"Specified 'xml:lang' attribute does not conform to BCP 47",group:"The default human language of the page must be valid and specified in accordance with BCP 47"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[{b5c3f8:{Pass_0:"pass",Fail_1:"fail",Fail_2:"inapplicable",Fail_3:"inapplicable",Fail_4:"inapplicable"},bf051a:{Pass_0:"pass",Fail_1:"fail",Fail_2:"pass",Fail_3:"fail",Fail_4:"inapplicable"}}],run:function(e,t,i){var n=u(e);return[(0,a.RulePass)("Pass_0"),(0,a.RuleFail)("Fail_1"),(0,a.RuleFail)("Fail_2"),(0,a.RuleFail)("Fail_3"),(0,a.RuleFail)("Fail_4")][n]}},t.element_lang_valid={id:"element_lang_valid",context:"dom:*[lang], dom:*[xml:lang]",help:{"en-US":{Pass_0:"element_lang_valid.html",Fail_1:"element_lang_valid.html",Fail_2:"element_lang_valid.html",Fail_3:"element_lang_valid.html",Fail_4:"element_lang_valid.html",group:"element_lang_valid.html"}},messages:{"en-US":{Pass_0:"Lang has a valid primary lang and conforms to BCP 47",Fail_1:"Specified 'lang' attribute does not include a valid primary language",Fail_2:"Specified 'lang' attribute does not conform to BCP 47",Fail_3:"Specified 'xml:lang' attribute does not include a valid primary language",Fail_4:"Specified 'xml:lang' attribute does not conform to BCP 47",group:"The change in language of specific content must be valid and specified in accordance with BCP 47"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[{de46e4:{Pass_0:"pass",Fail_1:"fail",Fail_2:"pass",Fail_3:"inapplicable",Fail_4:"inapplicable"}}],run:function(e,t,i){var n=e.dom.node;if("html"===n.nodeName.toLowerCase())return null;var l=u(e),d=[(0,a.RulePass)("Pass_0"),(0,a.RuleFail)("Fail_1"),(0,a.RuleFail)("Fail_2"),(0,a.RuleFail)("Fail_3"),(0,a.RuleFail)("Fail_4")][l];if(d.value[1]!==a.eRuleConfidence.PASS){var c=!1;if(null!==n.firstChild)for(var m=new o.DOMWalker(n,!1,n,!0);!c&&m.nextNode();)if(1===m.node.nodeType){var p=m.node;if(!r.VisUtil.isNodeVisible(p)||p.hasAttribute("lang"))m.bEndTag=!0;else{var h=s.AccNameUtil.computeAccessibleName(p);c=c||"img"===p.nodeName.toLowerCase()&&h&&h.name&&h.name.trim().length>0}}else c=c||3===m.node.nodeType&&m.node.nodeValue.trim().length>0;if(!c)return null}return d}}},7515(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_mouseevent_keyboard=void 0;var a=i(461),n=i(461);t.element_mouseevent_keyboard={id:"element_mouseevent_keyboard",context:"dom:*[ondblclick], dom:*[onmousemove], dom:*[onmousedown], dom:*[onmouseup], dom:*[onmouseover], dom:*[onmouseout], dom:*[onclick]",refactor:{RPT_Elem_EventMouseAndKey:{Pass_0:"Pass_0",Manual_1:"Manual_1"}},help:{"en-US":{Pass_0:"element_mouseevent_keyboard.html",Manual_1:"element_mouseevent_keyboard.html",group:"element_mouseevent_keyboard.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Manual_1:"Confirm the <{0}> element with mouse event handler(s) '{1}' has a corresponding keyboard handler(s)",group:"All interactive content with mouse event handlers must have equivalent keyboard access"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,l=n.nodeName.toLowerCase(),r=n.hasAttribute("href")||!n.hasAttribute("ondblclick")&&!n.hasAttribute("onmousemove")&&(!n.hasAttribute("onmousedown")||n.hasAttribute("onkeydown"))&&(!n.hasAttribute("onmouseup")||n.hasAttribute("onkeyup"))&&(!n.hasAttribute("onmouseover")||n.hasAttribute("onfocus"))&&(!n.hasAttribute("onmouseout")||n.hasAttribute("onblur"))&&(!n.hasAttribute("onclick")||n.hasAttribute("onkeypress")||"a"==l||"button"==l),o=new Array;return r||(n.hasAttribute("ondblclick")&&o.push("ondblclick"),n.hasAttribute("onmousemove")&&o.push("onmousemove"),n.hasAttribute("onmousedown")&&!n.hasAttribute("onkeydown")&&o.push("onmousedown"),n.hasAttribute("onmouseup")&&!n.hasAttribute("onkeyup")&&o.push("onmouseup"),n.hasAttribute("onmouseover")&&!n.hasAttribute("onfocus")&&o.push("onmouseover"),n.hasAttribute("onmouseout")&&!n.hasAttribute("onblur")&&o.push("onmouseout"),n.hasAttribute("onclick")&&!n.hasAttribute("onkeypress")&&"a"!=l&&"button"!=l&&o.push("onclick")),r?(0,a.RulePass)("Pass_0"):(0,a.RuleManual)("Manual_1",[l,o.join(", ")])}}},1704(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_orientation_unlocked=void 0;var a=i(461),n=i(461),l=i(4919),r=i(3946),o=i(4566),s=i(5279),u=i(7139);t.element_orientation_unlocked={id:"element_orientation_unlocked",context:"dom:*",help:{"en-US":{pass:"element_orientation_unlocked.html",fail_locked:"element_orientation_unlocked.html",group:"element_orientation_unlocked.html"}},messages:{"en-US":{pass:"The element is not restricted to either landscape or portrait orientation using CSS transform property",fail_locked:"The element <{0}> is restricted to either landscape or portrait orientation using CSS transform property",group:"Elements should not be restricted to either landscape or portrait orientation using CSS transform property"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.4"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:["b33eff"],run:function(e,t,i){var n=e.dom.node;if(!r.VisUtil.isNodeVisible(n))return null;if(u.CommonUtil.getAncestor(n,["script","meta","title"]))return null;var d=n.nodeName.toLowerCase(),c=s.FragmentUtil.getOwnerFragment(n),m=o.CacheUtil.getCache(c,"RPTUtil_MEDIA_ORIENTATION_TRANSFROM",null);m||(m=l.CSSUtil.getMediaOrientationTransform(c),o.CacheUtil.setCache(c,"RPTUtil_MEDIA_ORIENTATION_TRANSFROM",m));var p=[];if(Object.keys(m).forEach(function(e){Object.keys(m[e]).forEach(function(t){Object.keys(m[e][t]).length>0&&l.CSSUtil.selectorMatchesElem(n,t)&&(m[e][t].transform?p.push(m[e][t].transform):p.push(m[e][t]))})}),0===p.length)return null;for(var h=[],g=function(e){var t=p[e];if("object"==typeof t)for(var i in t)t=i+"("+t[i]+")";var r=!1;if(["rotate","rotate3d","rotateZ","matrix","matrix3d"].forEach(function(e){t.includes(e)&&(r=!0)}),!r)return"continue";var o=l.CSSUtil.getRotationDegree(t);if(0===o)return h.push((0,a.RulePass)("pass")),"continue";var s=l.CSSUtil.getDefinedStyles(n,["transform"]);s.transform&&(o+=l.CSSUtil.getRotationDegree(s.transform)),Math.abs(o-360)%360>1?h.push((0,a.RuleFail)("fail_locked",[d])):h.push((0,a.RulePass)("pass"))},b=0;b<p.length;b++)g(b);return h.length>0?h:null}}},5053(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_scrollable_tabbable=void 0;var a=i(7139),n=i(461),l=i(3946),r=i(7011);t.element_scrollable_tabbable={id:"element_scrollable_tabbable",context:"dom:*",dependencies:[],help:{"en-US":{group:"element_scrollable_tabbable.html",pass_tabbable:"element_scrollable_tabbable.html",pass_interactive:"element_scrollable_tabbable.html",fail_scrollable:"element_scrollable_tabbable.html"}},messages:{"en-US":{group:"Scrollable elements should be tabbable or contain tabbable content",pass_tabbable:"The scrollable element is tabbable",pass_interactive:"The scrollable element has tabbable content",fail_scrollable:"The scrollable element <{0}> with non-interactive content is not tabbable"}},rulesets:[],act:["0ssw9k"],run:function(e,t,i){var o=e.dom.node;if(l.VisUtil.isNodeVisible(o)&&!a.CommonUtil.isNodeDisabled(o))return a.CommonUtil.getAncestor(o,["iframe","svg","script","meta","style"])?null:a.CommonUtil.hasInnerContent(o)?r.AriaUtil.isNavigationOwnedOrControlled(o)?null:l.VisUtil.isElementScrollable(o)?a.CommonUtil.isTabbable(o)?(0,n.RulePass)("pass_tabbable"):a.CommonUtil.getTabbableChildren(o)>0?(0,n.RulePass)("pass_interactive"):!o.hasAttribute("tabindex")&&navigator.userAgent.indexOf("Firefox")>-1?null:(0,n.RuleFail)("fail_scrollable",[o.nodeName.toLowerCase()]):null:null}}},4681(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_tabbable_role_valid=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(9910),s=i(3864),u=i(3946);t.element_tabbable_role_valid={id:"element_tabbable_role_valid",context:"dom:*",help:{"en-US":{pass:"element_tabbable_role_valid.html",fail_invalid_role:"element_tabbable_role_valid.html",fail_no_valid_role:"element_tabbable_role_valid.html",group:"element_tabbable_role_valid.html"}},messages:{"en-US":{pass:"The tabbable element has a widget role",fail_invalid_role:"The tabbable element's role '{0}' is not a widget role",fail_no_valid_role:"The tabbable element does not have a valid widget role",group:"A tabbable element must have a valid widget role"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE},{id:["WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.CommonUtil.isNodeDisabled(n)||u.VisUtil.isNodeHiddenFromAT(n))return null;var d=n.nodeName.toLowerCase();if(d in r.CommonUtil.tabTagMap){var c=r.CommonUtil.tabTagMap[d];if("function"==typeof c&&(c=c(n)),c)return null}if(!n.hasAttribute("tabindex")||parseInt(n.getAttribute("tabindex"))<0)return null;if(l.AriaUtil.isNavigationOwnedOrControlled(n))return null;if(u.VisUtil.isElementScrollable(n))return null;var m=s.DOMWalker.parentNode(n),p=l.AriaUtil.getResolvedRole(m);if(["button","checkbox","img","link","menuitem","menuitemcheckbox","menuitemradio","option","radio","switch","tab"].includes(p))return null;var h=l.AriaUtil.getResolvedRole(n);return h?"application"===h?null:"row"===h||"separator"===h||"widget"===o.ARIADefinitions.designPatterns[h].roleType?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_invalid_role",[h]):(0,a.RuleFail)("fail_no_valid_role")}}},8050(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_tabbable_unobscured=void 0;var a=i(7139),n=i(461),l=i(461),r=i(3946),o=i(7507),s=i(3883);t.element_tabbable_unobscured={id:"element_tabbable_unobscured",context:"dom:*",dependencies:[],help:{"en-US":{group:"element_tabbable_unobscured.html",pass:"element_tabbable_unobscured.html",potential_obscured:"element_tabbable_unobscured.html"}},messages:{"en-US":{group:"When an element receives focus, it is not entirely covered by other content",pass:"The element is not entirely covered by other content",potential_obscured:"Confirm that when the element receives focus, it is not covered or, if covered by user action, can be uncovered without moving focus"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_2"],num:["2.4.11"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node;if(!r.VisUtil.isNodeVisible(l)||!a.CommonUtil.isTabbable(l))return null;var u=l.nodeName.toLocaleLowerCase();if(null!==a.CommonUtil.getAncestor(l,["pre","code","script","meta"])||"body"===u||"html"===u)return null;var d=l.ownerDocument;if(!d)return null;var c=d.defaultView;if(!c)return null;var m=new o.DOMMapper,p=m.getUnadjustedBounds(l);if(!p||0===p.height||0===p.width)return null;var h=c.getComputedStyle(l);if(!h)return null;var g=parseInt("auto"!==h.zIndex&&h.zIndex?h.zIndex:"0"),b=d.querySelectorAll("body *:not(script):not(style):not(meta):not(link)");if(!b||0===b.length)return null;for(var _=!0,f=p.left+p.width,v=p.top+p.height,A=0;A<b.length;A++){var w=b[A],y=l.compareDocumentPosition(w);if(0===y||y&Node.DOCUMENT_POSITION_CONTAINED_BY)_=!1;else if(!(y&Node.DOCUMENT_POSITION_CONTAINS)&&r.VisUtil.isNodeVisible(w)){var C=m.getUnadjustedBounds(w);if(C&&0!==C.height&&0!==C.width&&!(C.top>p.top||C.left>p.left)){var k=C.left+C.width,R=C.top+C.height;if(!(k<f||R<v)){var x=c.getComputedStyle(w);if(x){var P=parseInt("auto"===x.zIndex||!x.zIndex||isNaN(Number(x.zIndex))?"0":x.zIndex);if(_&&P>g||!_&&P>=g){var T,U=!1;if(x.background&&"none"!==x.background&&(U=(T=s.ColorUtil.Color(x.background))&&(void 0===T.alpha||T.alpha>0)),!U&&x.backgroundColor&&(U=(T=s.ColorUtil.Color(x.backgroundColor))&&(void 0===T.alpha||T.alpha>0)),!a.CommonUtil.hasInnerContentHidden(w)&&!U)continue;return(0,n.RulePotential)("potential_obscured",[])}}}}}}return(0,n.RulePass)("pass")}}},2644(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_tabbable_visible=void 0;var a=i(7139),n=i(4919),l=i(461),r=i(461),o=i(7507);t.element_tabbable_visible={id:"element_tabbable_visible",context:"dom:*",dependencies:[],help:{"en-US":{group:"element_tabbable_visible.html",pass:"element_tabbable_visible.html",potential_visible:"element_tabbable_visible.html"}},messages:{"en-US":{group:"A tabbable element should be visible on the screen when it has keyboard focus",pass:"The tabbable element is visible on the screen",potential_visible:"Confirm the element should be tabbable and if so, it becomes visible when it has keyboard focus"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.7"],level:r.eRulePolicy.VIOLATION,toolkitLevel:r.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var r=e.dom.node;if(!a.CommonUtil.isTabbable(r))return null;var s=r.nodeName.toLocaleLowerCase(),u=(new o.DOMMapper).getUnadjustedBounds(r);if(!u)return null;var d=n.CSSUtil.getDefinedStylesMultiple(r,["position","clip"],["",":focus"]),c=d[""],m=d[":focus"];if(0===u.height||0===u.width)return(0,l.RulePotential)("potential_visible",[]);if("absolute"===c.position&&c.clip&&"rect(0px,0px,0px,0px)"===c.clip.replaceAll(" ","")&&!m.clip){if("input"===s&&("checkbox"===r.getAttribute("type")||"radio"===r.getAttribute("type"))){var p=a.CommonUtil.getLabelForElement(r);if(p&&!a.CommonUtil.isInnerTextEmpty(p)){var h=n.CSSUtil.getDefinedStylesMultiple(r,null,[":focus-visible",":focus-within",":checked",":focus"]),g=h[":focus-visible"],b=h[":focus-within"],_=h[":checked"];if(h[":focus"]||g||b||_)return(0,l.RulePass)("pass")}}return(0,l.RulePotential)("potential_visible",[])}if(u.top>=0&&u.left>=0)return(0,l.RulePass)("pass");var f=getComputedStyle(r),v=u.top,A=u.left;if(0===Object.keys(m).length)return(0,l.RulePotential)("potential_visible",[]);var w=["absolute","fixed"];return void 0!==m.top&&(v=w.includes(m.position)||void 0===m.position&&w.includes(f.position)?m.top.replace(/\D/g,""):Number.MIN_VALUE),void 0!==m.left&&(A=w.includes(m.position)||void 0===m.position&&w.includes(f.position)?m.left.replace(/\D/g,""):Number.MIN_VALUE),v>=0&&A>=0?(0,l.RulePass)("pass"):(0,l.RulePotential)("potential_visible",[])}}},429(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.embed_alt_exists=void 0;var a=i(461),n=i(461),l=i(7139),r=i(3946);t.embed_alt_exists={id:"embed_alt_exists",context:"dom:embed",refactor:{RPT_Embed_HasAlt:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"embed_alt_exists.html",Potential_1:"embed_alt_exists.html",group:"embed_alt_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that the <embed> element has alternative content",group:"Provide alternative content for <embed> elements"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_FOUR}],act:[],run:function(e,t,i){var n=e.dom.node;return r.VisUtil.isNodeHiddenFromAT(n)?null:l.CommonUtil.attributeNonEmpty(n,"alt")?(0,a.RulePass)("Pass_0"):(0,a.RulePotential)("Potential_1")}}},4617(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.emoticons_alt_exists=void 0;var a=i(461),n=i(7139);t.emoticons_alt_exists={id:"emoticons_alt_exists",context:"dom:*",refactor:{WCAG20_Text_Emoticons:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"emoticons_alt_exists.html",Potential_1:"emoticons_alt_exists.html",group:"emoticons_alt_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that emoticons have a text alternative",group:"Emoticons must have a short text alternative that describes their purpose"}},rulesets:[],act:[],run:function(e,t,i){for(var l=e.dom.node,r=[":-)",":)",":o)",":]",":3",":c)",":>","=]","8)","=)",":D","C:",":-D",":D","8D","XD","=D","=3","<=3","<=8","--!--",":-(",":(",":c",":<",":[","D:","D8","D;","D=","DX","v.v",":-9",";-)",";)","*)",";]",";D",":-P",":P",":-p",":p","=p",":-Þ",":Þ",":-b",":b",":-O",":O","O_O","o_o","8O","OwO","O-O","0_o","O_o","O3O","o0o ;o_o;","o...o","0w0",":-/",":/",":\\","=/","=\\",":S",":|","d:-)","qB-)",":)~",":-)>....",":-X",":X",":-#",":#","O:-)","0:3","O:)",":'(",";*(","T_T","TT_TT","T.T",":-*",":*","^o)",">:)",">;)",">:-)","B)","B-)","8)","8-)","^>.>^","^<.<^","^>_>^","^<_<^","D:<",">:(","D-:<",">:-(",":-@[1]",";(","`_´","D<","<3","<333","=^_^=","=>.>=","=<_<=","=>.<=","\\,,/","\\m/","\\m/\\>.</\\m/","\\o/","\\o o/","o/\\o",":&",":u"],o=!0,s="",u=l.firstChild;u;)"#text"==u.nodeName&&(s+=" "+u.nodeValue),u=u.nextSibling;if(s.trim().length>0)for(var d=0;o&&d<r.length;++d)for(var c=s.indexOf(r[d]),m=r[d].length;o&&-1!=c;)o=(o=(o=c>0&&!/\s/.test(s.substring(c-1,c))||c<s.length-m&&!/\s/.test(s.substring(c+m,c+m+1))&&!/[.,!'"?]/.test(s.substring(c+m,c+m+1)))||(":)"==r[d]||"(:"==r[d])&&/\(\:.*\:\)/.test(s))||(";)"==r[d]||"(;"==r[d])&&/\(\;.*\;\)/.test(s),c=s.indexOf(r[d],c+1);if(!o){var p=n.CommonUtil.getAncestor(l,["pre","code","script","body"]);o=null==p||"body"!=p.nodeName.toLowerCase()}return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},5460(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.error_message_exists=void 0;var a=i(461),n=i(461),l=i(7011),r=i(5279),o=i(3946);t.error_message_exists={id:"error_message_exists",context:"dom:*[aria-invalid=true]",refactor:{HAAC_Aria_ErrorMessage:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_0:"error_message_exists.html",Fail_1:"error_message_exists.html",Fail_2:"error_message_exists.html",group:"error_message_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Custom error message has invalid reference 'id' value",Fail_2:"Custom error message is not visible",group:"A custom error message must reference a valid 'id' value and when triggered the message must be appropriately exposed"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,s=l.AriaUtil.getAriaAttribute(n,"aria-errormessage");if(!s)return null;var u=r.FragmentUtil.getById(n,s);return u?o.VisUtil.isNodeVisible(u)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_2"):(0,a.RuleFail)("Fail_1")}}},3399(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.fieldset_label_valid=void 0;var a=i(461),n=i(461),l=i(5279),r=i(4566),o=i(7139),s=i(3946),u=i(1950);t.fieldset_label_valid={id:"fieldset_label_valid",context:"aria:group",refactor:{group_withInputs_hasName:{Pass_1:"Pass_1",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_1:"fieldset_label_valid.html",Fail_1:"fieldset_label_valid.html",Fail_2:"fieldset_label_valid.html",group:"fieldset_label_valid.html"}},messages:{"en-US":{Pass_1:'Group/Fieldset "{0}" with an input has a unique name',Fail_1:"Group/Fieldset does not have an accessible name",Fail_2:'Group/Fieldset "{0}" has a duplicate name to another group',group:"Groups with nested inputs must have unique accessible name"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1","3.3.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(!s.VisUtil.isNodeHiddenFromAT(n)&&!o.CommonUtil.isNodeDisabled(n)){var d=l.FragmentUtil.getOwnerFragment(n),c=r.CacheUtil.getCache(n.ownerDocument,"landmark_group_input",null);if(!c){c={groupsWithInputs:[],groupsWithInputsComputedLabels:[]};for(var m=d.querySelectorAll('fieldset,[role="group"]'),p=Array.from(m),h=[],g=0;g<p.length;g++)p[g].querySelector("input")&&h.push(p[g]);var b=[];for(g=0;g<h.length;g++){var _=u.AccNameUtil.computeAccessibleName(h[g]);b.push(_&&_.name&&_.name.trim().length>0?_.name.trim():"")}c.groupsWithInputs=h,c.groupsWithInputsComputedLabels=b,r.CacheUtil.setCache(n.ownerDocument,"landmark_group_input",c)}var f=!1,v="";if(!c.groupsWithInputs)return null;for(g=0;g<c.groupsWithInputs.length;g++)if(n.isSameNode(c.groupsWithInputs[g])){if(f=!0,""===c.groupsWithInputsComputedLabels[g]||null===c.groupsWithInputsComputedLabels[g])return(0,a.RuleFail)("Fail_1");for(var A=!1,w=0;w<c.groupsWithInputsComputedLabels.length;w++)g!=w&&c.groupsWithInputsComputedLabels[g]===c.groupsWithInputsComputedLabels[w]&&(A=!0);if(A)return(0,a.RuleFail)("Fail_2",[c.groupsWithInputsComputedLabels[g]]);v=c.groupsWithInputsComputedLabels[g]}return f?(0,a.RulePass)("Pass_1",[v]):null}}}},3498(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.fieldset_legend_valid=void 0;var a=i(461),n=i(461),l=i(7139),r=i(3946);t.fieldset_legend_valid={id:"fieldset_legend_valid",context:"dom:fieldset",refactor:{WCAG20_Fieldset_HasLegend:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{Pass_0:"fieldset_legend_valid.html",Fail_1:"fieldset_legend_valid.html",Fail_2:"fieldset_legend_valid.html",Fail_3:"fieldset_legend_valid.html",group:"fieldset_legend_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"<fieldset> element does not have a <legend>",Fail_2:"<fieldset> element has more than one <legend>",Fail_3:"<fieldset> element <legend> is empty",group:" <fieldset> elements should have a single, non-empty <legend> as a label"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n)||l.CommonUtil.isNodeDisabled(n))return null;var o=l.CommonUtil.getChildByTagHidden(n,"legend",!0,!1);return 0===o.length?(0,a.RuleFail)("Fail_1"):o.length>1?(0,a.RuleFail)("Fail_2"):0===l.CommonUtil.getInnerText(o[0]).trim().length?(0,a.RuleFail)("Fail_3"):(0,a.RulePass)("Pass_0")}}},9629(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.figure_label_exists=void 0;var a=i(461),n=i(461),l=i(3946),r=i(1950);t.figure_label_exists={id:"figure_label_exists",context:"dom:figure",refactor:{HAAC_Figure_label:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"figure_label_exists.html",Fail_1:"figure_label_exists.html",group:"figure_label_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The <figure> element does not have an associated label",group:"A <figure> element must have an associated label"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;if(n.getAttribute("role"))return null;var o=r.AccNameUtil.computeAccessibleName(n);return o&&o.name&&o.name.trim().length>0?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[])}}},733(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.form_font_color=void 0;var a=i(461),n=i(461);t.form_font_color={id:"form_font_color",context:"dom:form",refactor:{RPT_Font_ColorInForm:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"form_font_color.html",Potential_1:"form_font_color.html",group:"form_font_color.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Check color is not used as the only visual means to convey which fields are required",group:"Combine color and descriptive markup to indicate required form fields"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.4.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=!0,l=e.dom.node.getElementsByTagName("font");if(null!=l)for(var r=0;r<l.length;++r)n=!l[r].hasAttribute("color");return n?(0,a.RulePass)("Pass_0"):n?void 0:(0,a.RulePotential)("Potential_1")}}},9797(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.form_interaction_review=void 0;var a=i(461),n=i(461),l=i(7139);t.form_interaction_review={id:"form_interaction_review",context:"dom:form[target]",refactor:{WCAG20_Form_TargetAndText:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"form_interaction_review.html",Potential_1:"form_interaction_review.html",group:"form_interaction_review.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that interacting with content will not open pop-up windows or change the active window without informing the user",group:"User should be informed in advance when interacting with content causes a change of context"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.2.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n={paramWinText:{value:["new window"],type:"array"}},r=e.dom.node,o=r.getAttribute("target"),s="_parent"===o||"_self"===o||"_top"===o||null!=l.CommonUtil.getFrameByName(r,o);if(!s){var u=l.CommonUtil.getInnerText(r);r.hasAttribute("title")&&(u+=" "+r.getAttribute("title"));for(var d=0;!s&&d<n.paramWinText.value.length;++d)-1!=u.indexOf(n.paramWinText.value[d])&&(s=!0)}return s?(0,a.RulePass)("Pass_0"):s?void 0:(0,a.RulePotential)("Potential_1")}}},7156(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.form_label_unique=void 0;var a=i(461),n=i(461),l=i(5279),r=i(4566);t.form_label_unique={id:"form_label_unique",context:"dom:label[for]",refactor:{RPT_Label_UniqueFor:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"form_label_unique.html",Fail_1:"form_label_unique.html",group:"form_label_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Form control has more than one label",group:"Form controls should have exactly one label"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,o=r.CacheUtil.getCache(l.FragmentUtil.getOwnerFragment(n),"RPT_Label_Single",{}),s=n.getAttribute("for"),u=!(s in o);return o[s]=!0,u?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},3062(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.form_submit_button_exists=void 0;var a=i(461),n=i(461),l=i(7011),r=i(3864);t.form_submit_button_exists={id:"form_submit_button_exists",context:"dom:form",refactor:{WCAG20_Form_HasSubmit:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"form_submit_button_exists.html",Potential_1:"form_submit_button_exists.html",group:"form_submit_button_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify the <form> element has a submit button or an image button",group:"A <form> element should have a submit button or an image button"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.2.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,o=!1;if(n.firstChild)for(var s=new r.DOMWalker(n,!0);!o&&s.prevNode()&&s.node!=n;)if(!s.bEndTag){var u=s.node.nodeName.toLowerCase();if("input"===u){var d=s.elem().getAttribute("type");d&&(d=d.toLowerCase()),o="submit"===d||"image"===d}else"button"===u?o=s.elem().hasAttribute("type")&&"submit"===s.elem().getAttribute("type").toLowerCase():1===s.node.nodeType&&(o=l.AriaUtil.hasRole(s.node,"button"))}return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},3827(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.form_submit_review=void 0;var a=i(461);t.form_submit_review={id:"form_submit_review",context:"dom:select[onchange], dom:input[onchange]",refactor:{RPT_Form_ChangeEmpty:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"form_submit_review.html",Potential_1:"form_submit_review.html",group:"form_submit_review.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Confirm the form does not submit automatically without warning",group:"A form should not be submitted automatically without warning the user"}},rulesets:[],act:[],run:function(e,t,i){var n=0===e.dom.node.getAttribute("onchange").trim().length;return n?null:n?void 0:(0,a.RulePotential)("Potential_1")}}},5498(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.frame_src_valid=void 0;var a=i(461),n=i(461),l=i(7139);t.frame_src_valid={id:"frame_src_valid",context:"dom:frame, dom:iframe",refactor:{Valerie_Frame_SrcHtml:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"frame_src_valid.html",Potential_1:"frame_src_valid.html",group:"frame_src_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify <frame> content is accessible",group:"A <frame> containing non-HTML content must be made accessible"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,r=l.CommonUtil.attributeNonEmpty(n,"src")&&l.CommonUtil.isHtmlExt(l.CommonUtil.getFileExt(n.getAttribute("src")));return r?(0,a.RulePass)("Pass_0"):r?void 0:(0,a.RulePotential)("Potential_1")}}},510(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.frame_title_exists=void 0;var a=i(461),n=i(461),l=i(1950),r=i(3946);t.frame_title_exists={id:"frame_title_exists",context:"dom:frame, dom:iframe",refactor:{WCAG20_Frame_HasTitle:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"frame_title_exists.html",Pass_0:"frame_title_exists.html",Fail_1:"frame_title_exists.html"}},messages:{"en-US":{group:"Inline frames must have a unique, non-empty 'title' attribute",Pass_0:"Rule Passed",Fail_1:"Inline frame does not have a 'title' attribute"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:"cae760",run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;if(n.getAttribute("role"))return null;var o=l.AccNameUtil.computeAccessibleName(n);return o&&o.name&&o.name.trim().length>0?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},7722(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.heading_content_exists=void 0;var a=i(461),n=i(461),l=i(7139);t.heading_content_exists={id:"heading_content_exists",context:"dom:h1, dom:h2, dom:h3, dom:h4, dom:h5, dom:h6",refactor:{RPT_Header_HasContent:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"heading_content_exists.html",Fail_1:"heading_content_exists.html",group:"heading_content_exists.html"}},messages:{"en-US":{Pass_0:"Heading element has descriptive text",Fail_1:"Heading element has no descriptive content",group:"Heading elements must provide descriptive text"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.6"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;return l.CommonUtil.hasInnerContentHidden(n)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},4597(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.heading_markup_misuse=void 0;var a=i(461),n=i(461),l=i(7139);t.heading_markup_misuse={id:"heading_markup_misuse",context:"dom:h1, dom:h2, dom:h3, dom:h4, dom:h5, dom:h6",dependencies:["heading_content_exists"],refactor:{RPT_Headers_FewWords:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"heading_markup_misuse.html",Potential_1:"heading_markup_misuse.html",group:"heading_markup_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that the heading element is a genuine heading",group:"Heading elements must not be used for presentation"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node,r=l.CommonUtil.wordCount(l.CommonUtil.getInnerText(n))<=20;return r?(0,a.RulePass)("Pass_0"):r?void 0:(0,a.RulePotential)("Potential_1")}}},2104(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.html_lang_exists=void 0;var a=i(461),n=i(461),l=i(6858),r=i(1043);t.html_lang_exists={id:"html_lang_exists",context:"dom:html",refactor:{WCAG20_Html_HasLang:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3",Fail_4:"Fail_4",Fail_5:"Fail_5",Potential_5:"Potential_5",Potential_6:"Potential_6"}},help:{"en-US":{group:"html_lang_exists.html",Pass_0:"html_lang_exists.html",Fail_1:"html_lang_exists.html",Fail_2:"html_lang_exists.html",Fail_3:"html_lang_exists.html",Fail_4:"html_lang_exists.html",Fail_5:"html_lang_exists.html",Potential_5:"html_lang_exists.html",Potential_6:"html_lang_exists.html"}},messages:{"en-US":{group:"Page must identify the default language of the document with a 'lang' attribute",Pass_0:'Page language detected as "{0}"',Fail_1:"Page detected as XHTML 1.0, but has neither 'lang' nor 'xml:lang' attributes",Fail_2:"Page detected as XHTML, but does not have an 'xml:lang' attribute",Fail_3:"Page detected as HTML, but does not have a 'lang' attribute",Fail_4:"Page detected with 'lang' and 'xml:lang' attributes and primary languages do not match: \"{0}\", \"{1}\"",Fail_5:"Page detected with 'lang' and 'xml:lang' attributes that do not match: \"{0}\", \"{1}\"",Potential_5:"Page detected as XHTML 1.0 with only a 'lang' attribute. Confirm that page is only delivered via text/html mime type",Potential_6:"Page detected as XHTML 1.0 with only an 'xml:lang' attribute. Confirm that page is only delivered via xml mime type"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"3.1.1",level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[{b5c3f8:{Pass_0:"pass",Fail_1:"inapplicable",Fail_2:"inapplicable",Fail_3:"fail",Fail_4:"inapplicable",Fail_5:"inapplicable",Potential_5:"inapplicable",Potential_6:"inapplicable"},"5b7ae0":{Pass_0:"pass",Fail_1:"inapplicable",Fail_2:"inapplicable",Fail_3:"inapplicable",Fail_4:"fail",Fail_5:"pass",Potential_5:"inapplicable",Potential_6:"inapplicable"}}],run:function(e,t,i){if(l.AncestorUtil.isPresentationFrame(i))return null;var n=e.dom.node,o=n.ownerDocument.doctype?n.ownerDocument.doctype.publicId:"";o||(o="");var s=n.getAttribute("lang"),u=n.getAttribute("xml:lang");return o.includes("XHTML")&&!o.includes("1.0")?u?(0,a.RulePass)("Pass_0",[u]):(0,a.RuleFail)("Fail_2"):o.includes("XHTML")&&o.includes("1.0")?s||u?s&&u?s!==u?r.LangUtil.validPrimaryLang(s)&&r.LangUtil.validPrimaryLang(u)?r.LangUtil.matchPrimaryLang(s,u)?(0,a.RuleFail)("Fail_5",[s,u],[]):(0,a.RuleFail)("Fail_4",[s,u],[]):null:(0,a.RulePass)("Pass_0",[s]):s?(0,a.RulePotential)("Potential_5"):(0,a.RulePotential)("Potential_6"):(0,a.RuleFail)("Fail_1"):s?s&&u&&s!==u?r.LangUtil.validPrimaryLang(s)&&r.LangUtil.validPrimaryLang(u)?r.LangUtil.matchPrimaryLang(s,u)?(0,a.RuleFail)("Fail_5",[s,u],[]):(0,a.RuleFail)("Fail_4",[s,u],[]):null:(0,a.RulePass)("Pass_0",[s]):(0,a.RuleFail)("Fail_3")}}},8260(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.html_skipnav_exists=void 0;var a=i(461),n=i(461),l=i(7139),r=i(5279);t.html_skipnav_exists={id:"html_skipnav_exists",context:"dom:html",refactor:{RPT_Html_SkipNav:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{group:"html_skipnav_exists.html",Pass_0:"html_skipnav_exists.html",Potential_1:"html_skipnav_exists.html"}},messages:{"en-US":{group:"Provide a way to bypass blocks of content that are repeated on multiple Web pages",Pass_0:"Rule Passed",Potential_1:"Verify there is a way to bypass blocks of content that are repeated on multiple Web pages"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"2.4.1",level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,o=!1,s=l.CommonUtil.getDocElementsByTag(n,"frame"),u=l.CommonUtil.getDocElementsByTag(n,"h1");if(null!=s&&s.length>0||null!=u&&u.length>0)o=!0;else for(var d=l.CommonUtil.getDocElementsByTag(n,"a"),c={},m=0;!o&&m<d.length;++m)if(d[m].hasAttribute("href")){var p=d[m].href;"string"!=typeof p&&(p=p.baseVal?p.baseVal:"");var h,g="";if((h=void 0!==n.ownerDocument.locationFromDAP&&null!=n.ownerDocument.locationFromDAP?n.ownerDocument.locationFromDAP:n.ownerDocument.location)&&(g=h.href),p.startsWith("file:///")&&(p="file:/"+p.substring(8)),g.startsWith("file:///")&&(g="file:/"+g.substring(8)),"#"==p.charAt(0)||p.startsWith(g+"#")){var b=l.CommonUtil.getFileAnchor(p);null!=r.FragmentUtil.getById(n,b)?o=!0:c[b]=!0}}else if(d[m].hasAttribute("name")){var _=d[m].getAttribute("name");-1!=_.indexOf("#")&&(_=l.CommonUtil.getFileAnchor(_)),o=_ in c}return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},8920(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.iframe_interactive_tabbable=void 0;var a=i(7139),n=i(461),l=i(461),r=i(3946),o=i(7507);t.iframe_interactive_tabbable={id:"iframe_interactive_tabbable",context:"dom:iframe",dependencies:[],help:{"en-US":{group:"iframe_interactive_tabbable.html",pass:"iframe_interactive_tabbable.html",fail_invalid:"iframe_interactive_tabbable.html"}},messages:{"en-US":{group:"Iframe with interactive content should not be excluded from tab order using tabindex",pass:"The iframe with interactive content is not excluded from the tab order using tabindex",fail_invalid:"The <iframe> with interactive content is excluded from tab order using tabindex"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:["akn7bn"],run:function(e,t,i){var l=e.dom.node;if(!r.VisUtil.isNodeHiddenFromAT(l)&&!a.CommonUtil.isNodeDisabled(l)){var s=(new o.DOMMapper).getUnadjustedBounds(l);if(!s)return null;if(Math.max(s.height,s.width)<30||Math.min(s.height,s.width)<15)return null;if(!l.hasAttribute("tabindex")||parseInt(l.getAttribute("tabindex"))>=0)return(0,n.RulePass)("pass");var u=l;return u&&u.contentDocument&&u.contentDocument.documentElement&&a.CommonUtil.getTabbableChildren(l)>0?(0,n.RuleFail)("fail_invalid"):null}}}},1237(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.imagebutton_alt_exists=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139);t.imagebutton_alt_exists={id:"imagebutton_alt_exists",context:"dom:input",refactor:{WCAG20_Input_ExplicitLabelImage:{Pass_0:"Pass_0",Pass_1:"Pass_1",Pass_2:"Pass_2",Fail:"Fail"}},help:{"en-US":{Pass_0:"imagebutton_alt_exists.html",Pass_1:"imagebutton_alt_exists.html",Pass_2:"imagebutton_alt_exists.html",Fail:"imagebutton_alt_exists.html",group:"imagebutton_alt_exists.html"}},messages:{"en-US":{Pass_0:"Image button provides alternative text using the 'alt' attribute",Pass_1:"Image button provides alternative text using an ARIA label",Pass_2:"Image button provides alternative text using the 'title' attribute",Fail:'The <input> element of type "image" has no text alternative',group:'The <input> element of type "image" should have a text alternative'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:"59796f",run:function(e,t,i){var n=e.dom.node;return n.hasAttribute("type")&&"image"==n.getAttribute("type").toLowerCase()?r.CommonUtil.attributeNonEmpty(n,"alt")?(0,a.RulePass)("Pass_0"):l.AriaUtil.hasAriaLabel(n)?(0,a.RulePass)("Pass_1"):n.hasAttribute("title")&&n.getAttribute("title").length>0?(0,a.RulePass)("Pass_2"):(0,a.RuleFail)("Fail"):null}}},4101(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.imagemap_alt_exists=void 0;var a=i(461),n=i(461),l=i(7139),r=i(3946);t.imagemap_alt_exists={id:"imagemap_alt_exists",context:"dom:img[usemap], dom:img[ismap]",refactor:{HAAC_Img_UsemapAlt:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"imagemap_alt_exists.html",Fail_1:"imagemap_alt_exists.html",group:"imagemap_alt_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Image map or child <area> has no text alternative",group:"An image map and each <area> element in an image map must have text alternative(s)"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;return r.VisUtil.isNodeHiddenFromAT(n)?null:l.CommonUtil.attributeNonEmpty(n,"alt")||!n.hasAttribute("ismap")&&!l.CommonUtil.attributeNonEmpty(n,"usemap")?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},275(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.img_alt_background=void 0;var a=i(461),n=i(461),l=i(3946);t.img_alt_background={id:"img_alt_background",context:"dom:*",refactor:{HAAC_BackgroundImg_HasTextOrTitle:{Pass_0:"Pass_0",Manual_1:"Manual_1"}},help:{"en-US":{Pass_0:"img_alt_background.html",Manual_1:"img_alt_background.html",group:"img_alt_background.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Manual_1:"Verify important background image information has a text alternative in system high contrast mode",group:"Background images that convey important information must have a text alternative that describes the image"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var r=n.ownerDocument.defaultView.getComputedStyle(n);if(null==r)return(0,a.RulePass)("Pass_0");var o=r.backgroundImage,s=!0;if(null!=o&&""!=o&&"none"!=o&&"inherit"!=o)if(null!=n.innerHTML&&0!=n.innerHTML.trim().length)s=!1;else{var u=n.getAttribute("title");null!=u&&0!=u.length&&(s=!1)}return s?(0,a.RulePass)("Pass_0"):s?void 0:(0,a.RuleManual)("Manual_1")}}},7601(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.img_alt_decorative=void 0;var a=i(461),n=i(461),l=i(7011),r=i(3946);t.img_alt_decorative={id:"img_alt_decorative",context:"dom:img[alt]",refactor:{WCAG20_Img_PresentationImgHasNonNullAlt:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"img_alt_decorative.html",Fail_1:"img_alt_decorative.html",group:"img_alt_decorative.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Image designated as decorative has non-null 'alt' attribute",group:'Image designated as decorative must have \'alt=""'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var o=!0;return(l.AriaUtil.hasRole(n,"presentation")||l.AriaUtil.hasRole(n,"none"))&&(o=0==n.getAttribute("alt").length),o?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},7541(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.img_alt_misuse=void 0;var a=i(461),n=i(461),l=i(3946);t.img_alt_misuse={id:"img_alt_misuse",context:"dom:img, dom:area, dom:input",refactor:{RPT_Img_AltCommonMisuse:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"img_alt_misuse.html",Potential_1:"img_alt_misuse.html",group:"img_alt_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that the file name serves as a good inline replacement for the image",group:"'alt' attribute value must be a good inline replacement for the image"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var r=n.nodeName.toLowerCase(),o=!0;if(n.hasAttribute("alt")){var s=n.getAttribute("alt").trim();if(s.length>0){for(var u=["short description"],d=0;o&&d<u.length;++d)o=-1==s.indexOf(u[d]);if(o){var c=n.getAttribute("area"==r?"href":"src");null!=c&&(o=c.trim()!=s&&(-1==s.indexOf(".")||-1==s.indexOf(c)&&-1==c.indexOf(s)))}}}return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},8274(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.img_alt_null=void 0;var a=i(461),n=i(461),l=i(3946),r=i(7011),o=i(7139);t.img_alt_null={id:"img_alt_null",context:"dom:img[alt]",refactor:{WCAG20_Img_TitleEmptyWhenAltNull:{Pass_0:"pass",Fail_1:"fail_decorative"}},help:{"en-US":{pass:"img_alt_null.html",fail_decorative:"img_alt_null.html",potential_aria_override:"img_alt_null.html",group:"img_alt_null.html"}},messages:{"en-US":{pass:"Neither 'aria' nor 'title' attributes are used for the decorative image",fail_decorative:"The image 'alt' attribute is empty, but the 'title' attribute is not empty",potential_aria_override:"The image 'alt' attribute is empty, but the 'aria' label is not empty and overrides the 'alt' attribute",group:"When the intent is to mark an image as decorative with an empty 'alt' attribute, the 'aria' or 'title' attributes should not be used"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE,reasonCodes:["fail_decorative"]},{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["ARIA"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE,reasonCodes:["potential_aria_override"]}],act:[{"46ca7f":{potential_aria_override:"fail"}}],run:function(e,t,i){var n=e.dom.node;return l.VisUtil.isNodeHiddenFromAT(n)||n.getAttribute("alt").trim().length>0?null:r.AriaUtil.getAriaLabel(n).length>0?(0,a.RulePotential)("potential_aria_override"):o.CommonUtil.attributeNonEmpty(n,"title")?(0,a.RuleFail)("fail_decorative"):(0,a.RulePass)("pass")}}},590(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.img_alt_redundant=void 0;var a=i(461),n=i(461),l=i(3864),r=i(7139);t.img_alt_redundant={id:"img_alt_redundant",context:"dom:img[alt]",refactor:{WCAG20_Img_LinkTextNotRedundant:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{Pass_0:"img_alt_redundant.html",Fail_1:"img_alt_redundant.html",Fail_2:"img_alt_redundant.html",Fail_3:"img_alt_redundant.html",group:"img_alt_redundant.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Link text is repeated in an image 'alt' value within the same link",Fail_2:"Link text of previous link is repeated in image 'alt' value of a link",Fail_3:"Image 'alt' value within a link is repeated in link text of the link after",group:"The text alternative for an image within a link should not repeat the link text or adjacent link text"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1","2.4.4"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node,o=r.CommonUtil.getAncestor(n,"a");if(null==o)return null;var s=n.getAttribute("alt").trim().toLowerCase();if(0==s.length)return null;var u=o.innerText,d="";if(null!=u&&(d=u.trim().toLowerCase()),!(d.length>0)){for(var c=!0,m=new l.DOMWalker(o);c&&m.prevNode()&&!("#text"==(h=(p=m.node).nodeName.toLowerCase())&&p.nodeValue.length>0||"img"==h&&r.CommonUtil.attributeNonEmpty(p,"alt"));)"a"!==h||r.CommonUtil.shouldNodeBeSkippedHidden(p)||(c=(p.innerText||p.textContent||"").trim().toLowerCase()!=s);if(!c)return(0,a.RuleFail)("Fail_2");for(m=new l.DOMWalker(o,!0);c&&m.nextNode();){var p,h;if("#text"==(h=(p=m.node).nodeName.toLowerCase())&&p.nodeValue.length>0||"img"==h&&r.CommonUtil.attributeNonEmpty(p,"alt"))break;"a"!=h||r.CommonUtil.shouldNodeBeSkippedHidden(p)||(c=p.innerText.trim().toLowerCase()!=s)}return c?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_3")}return s==d?(0,a.RuleFail)("Fail_1"):void 0}}},8925(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.img_alt_valid=void 0;var a=i(461),n=i(461),l=i(7011),r=i(3946),o=i(1950);t.img_alt_valid={id:"img_alt_valid",context:"dom:img",refactor:{WCAG20_Img_HasAlt:{pass:"pass",fail_blank_alt:"fail_blank_alt",fail_no_alt:"fail_no_alt",fail_blank_title:"fail_blank_title"}},help:{"en-US":{pass:"img_alt_valid.html",fail_blank_alt:"img_alt_valid.html",fail_no_alt:"img_alt_valid.html",fail_blank_title:"img_alt_valid.html",group:"img_alt_valid.html"}},messages:{"en-US":{pass:"The image has an accessible name or is correctly marked as decorative or redundant",fail_blank_alt:"Image 'alt' attribute value consists only of blank space(s)",fail_no_alt:"The image has neither an accessible name nor is marked as decorative or redundant",fail_blank_title:"The image does not have an 'alt' attribute or ARIA label, and the 'title' attribute value consists only of blank space(s)",group:"Images must have accessible names unless they are decorative or redundant"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:"23a2a8",run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n)||o.AccNameUtil.isAccessibleNameIgnorable(n))return null;if(0!==l.AriaUtil.getAriaLabel(n).trim().length)return(0,a.RulePass)("pass");var s=n.hasAttribute("alt")?n.getAttribute("alt"):null;if(null!==s)return 0===s.length||s.trim().length>0?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_blank_alt");var u=n.hasAttribute("title")?n.getAttribute("title"):null;if(null!==u&&0!==u.length)return 0===u.trim().length?(0,a.RuleFail)("fail_blank_title"):(0,a.RulePass)("pass");if(null===s){var d=l.AriaUtil.getResolvedRole(n,!1);return"presentation"===d||"none"===d?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_no_alt")}return 0===s.length?(0,a.RulePass)("pass"):void 0}}},9234(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.img_ismap_misuse=void 0;var a=i(461),n=i(461),l=i(7139),r=i(3946);t.img_ismap_misuse={id:"img_ismap_misuse",context:"dom:img[ismap]",refactor:{RPT_Img_UsemapValid:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"img_ismap_misuse.html",Potential_1:"img_ismap_misuse.html",group:"img_ismap_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Server-side image map hot-spots do not have duplicate text links",group:"Server-side image map hot-spots must have duplicate text links"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var o=!1;if(n.hasAttribute("usemap")){var s=n.getAttribute("usemap"),u=(s=s.trim().toLowerCase()).indexOf("#");if(-1!=u&&(s=s.substr(u+1)),s.length>0)for(var d=l.CommonUtil.getDocElementsByTag(n,"map"),c=0;!o&&c<d.length;++c)o=d[c].hasAttribute("name")&&d[c].getAttribute("name").toLowerCase()==s}return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},8617(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.img_longdesc_misuse=void 0;var a=i(461),n=i(461),l=i(7139),r=i(3946);t.img_longdesc_misuse={id:"img_longdesc_misuse",context:"dom:img[longdesc]",refactor:{RPT_Img_LongDescription2:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"img_longdesc_misuse.html",Potential_1:"img_longdesc_misuse.html",group:"img_longdesc_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that the file designated by the 'longdesc' attribute contains valid HTML content (file extension not recognized)",group:" The 'longdesc' attribute must reference HTML content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var o=n.getAttribute("longdesc"),s=l.CommonUtil.getFileExt(o),u=0!=s.length&&l.CommonUtil.isHtmlExt(s)||o.startsWith("#")||o.startsWith("http://")||o.startsWith("https://")||o.startsWith("data:");return u?(0,a.RulePass)("Pass_0"):u?void 0:(0,a.RulePotential)("Potential_1")}}},591(e,t,i){var a=this&&this.__createBinding||(Object.create?function(e,t,i,a){void 0===a&&(a=i);var n=Object.getOwnPropertyDescriptor(t,i);n&&!("get"in n?!t.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,a,n)}:function(e,t,i,a){void 0===a&&(a=i),e[a]=t[i]}),n=this&&this.__exportStar||function(e,t){for(var i in e)"default"===i||Object.prototype.hasOwnProperty.call(t,i)||a(t,e,i)};Object.defineProperty(t,"__esModule",{value:!0}),n(i(2297),t),n(i(4401),t),n(i(4546),t),n(i(9292),t),n(i(9605),t),n(i(3987),t),n(i(8631),t),n(i(8025),t),n(i(1198),t),n(i(8001),t),n(i(5778),t),n(i(8118),t),n(i(2242),t),n(i(3673),t),n(i(5080),t),n(i(183),t),n(i(6805),t),n(i(1886),t),n(i(4078),t),n(i(5750),t),n(i(85),t),n(i(514),t),n(i(5310),t),n(i(9083),t),n(i(6049),t),n(i(5099),t),n(i(2759),t),n(i(3141),t),n(i(5131),t),n(i(5167),t),n(i(8115),t),n(i(5733),t),n(i(5782),t),n(i(6731),t),n(i(390),t),n(i(3900),t),n(i(1218),t),n(i(6734),t),n(i(9973),t),n(i(5711),t),n(i(3384),t),n(i(2762),t),n(i(5757),t),n(i(5232),t),n(i(1891),t),n(i(6142),t),n(i(4863),t),n(i(1440),t),n(i(1968),t),n(i(1617),t),n(i(3475),t),n(i(3370),t),n(i(9272),t),n(i(7735),t),n(i(3923),t),n(i(7521),t),n(i(1852),t),n(i(799),t),n(i(4614),t),n(i(5952),t),n(i(5395),t),n(i(1992),t),n(i(7955),t),n(i(9531),t),n(i(891),t),n(i(7446),t),n(i(6137),t),n(i(6839),t),n(i(8135),t),n(i(507),t),n(i(3566),t),n(i(5173),t),n(i(6027),t),n(i(7515),t),n(i(1704),t),n(i(5053),t),n(i(4681),t),n(i(8050),t),n(i(2644),t),n(i(429),t),n(i(4617),t),n(i(5460),t),n(i(3399),t),n(i(3498),t),n(i(9629),t),n(i(733),t),n(i(9797),t),n(i(7156),t),n(i(3062),t),n(i(3827),t),n(i(5498),t),n(i(510),t),n(i(7722),t),n(i(4597),t),n(i(2104),t),n(i(8260),t),n(i(8920),t),n(i(1237),t),n(i(4101),t),n(i(275),t),n(i(7601),t),n(i(7541),t),n(i(8274),t),n(i(590),t),n(i(8925),t),n(i(9234),t),n(i(8617),t),n(i(1939),t),n(i(7726),t),n(i(3142),t),n(i(1353),t),n(i(2631),t),n(i(8550),t),n(i(8853),t),n(i(3180),t),n(i(1382),t),n(i(953),t),n(i(2222),t),n(i(4678),t),n(i(7578),t),n(i(9964),t),n(i(6401),t),n(i(1174),t),n(i(9907),t),n(i(6032),t),n(i(5622),t),n(i(2240),t),n(i(4019),t),n(i(361),t),n(i(5960),t),n(i(5515),t),n(i(8752),t),n(i(8834),t),n(i(1025),t),n(i(9116),t),n(i(435),t),n(i(6640),t),n(i(2068),t),n(i(7322),t),n(i(5702),t),n(i(1961),t),n(i(3022),t),n(i(375),t),n(i(4658),t),n(i(4605),t),n(i(5294),t),n(i(3506),t),n(i(7475),t),n(i(8064),t),n(i(7942),t),n(i(2219),t),n(i(1473),t),n(i(1912),t),n(i(6539),t),n(i(4),t),n(i(5334),t),n(i(2173),t),n(i(8349),t),n(i(8142),t),n(i(3980),t),n(i(4701),t),n(i(18),t),n(i(9314),t),n(i(1667),t),n(i(9599),t),n(i(4672),t),n(i(4353),t),n(i(7147),t),n(i(1419),t),n(i(855),t),n(i(3420),t),n(i(408),t)},1939(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_autocomplete_valid=void 0;var a=i(461),n=i(461),l=i(7139),r=i(3946);t.input_autocomplete_valid={id:"input_autocomplete_valid",context:"dom:input[autocomplete], dom:textarea[autocomplete], dom:select[autocomplete]",refactor:{WCAG21_Input_Autocomplete:{Pass_0:"pass",Fail_1:"fail_inappropriate",Fail_2:"fail_invalid",Fail_attribute_incorrect:"fail_incorrect"}},help:{"en-US":{group:"input_autocomplete_valid.html",pass:"input_autocomplete_valid.html",fail_inappropriate:"input_autocomplete_valid.html",fail_invalid:"input_autocomplete_valid.html",fail_incorrect:"input_autocomplete_valid.html"}},messages:{"en-US":{group:"The 'autocomplete' attribute's token(s) must be appropriate for the input form field",pass:"The 'autocomplete' attribute's token(s) is appropriate for the input form field",fail_inappropriate:"The 'autocomplete' attribute's token(s) are not appropriate for the input form field",fail_invalid:"The 'autocomplete' attribute's token(s) are not appropriate for an input form field of any type",fail_incorrect:"The 'autocomplete' attribute has an incorrect value"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.5"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[{"73f2c2":{pass:"pass",fail_inappropriate:"fail",fail_invalid:"pass",fail_incorrect:"fail"}}],run:function(e,t,i){var n=e.dom.node;if(!r.VisUtil.isNodeVisible(n)||l.CommonUtil.isNodeDisabled(n))return null;var o=n.getAttribute("autocomplete").trim().toLowerCase(),s=o.split(/\s+/);if(0===s.length||0===o.length)return null;var u={tokensOnOff:["on","off"],tokenOptionalSection:"section-",tokensOptionalPurpose:["shipping","billing"],tokensMandatoryGroup1_password:["new-password","current-password","one-time-code"],tokensMandatoryGroup1_multiline:["street-address"],tokensMandatoryGroup1_month:["cc-exp"],tokensMandatoryGroup1_numeric:["cc-exp-month","cc-exp-year","transaction-amount","bday-day","bday-month","bday-year"],tokensMandatoryGroup1_date:["bday"],tokensMandatoryGroup1_url:["url","photo"],tokensMandatoryGroup1_text:["name","honorific-prefix","given-name","additional-name","family-name","honorific-suffix","nickname","username","organization-title","organization","address-line1","address-line2","address-line3","address-level4","address-level3","address-level2","address-level1","country","country-name","postal-code","cc-name","cc-given-name","cc-additional-name","cc-family-name","cc-number","cc-csc","cc-type","transaction-currency","language","sex"],tokensMandatoryGroup1_all:["name","honorific-prefix","given-name","additional-name","family-name","honorific-suffix","nickname","username","new-password","current-password","organization-title","organization","street-address","address-line1","address-line2","address-line3","address-level4","address-level3","address-level2","address-level1","country","country-name","postal-code","cc-name","cc-given-name","cc-additional-name","cc-family-name","cc-number","cc-exp","cc-exp-month","cc-exp-year","cc-csc","cc-type","transaction-currency","transaction-amount","language","bday","bday-day","bday-month","bday-year","sex","url","photo"],tokensOptionalGroup2:["home","work","mobile","fax","pager"],tokensMandatoryGroup2_tel:["tel"],tokensMandatoryGroup2_email:["email"],tokensMandatoryGroup2_url:["impp"],tokensMandatoryGroup2_text:["tel-country-code","tel-national","tel-area-code","tel-local","tel-local-prefix","tel-local-suffix","tel-extension"],tokensMandatoryGroup2_all:["tel","tel-country-code","tel-national","tel-area-code","tel-local","tel-local-prefix","tel-local-suffix","tel-extension","email","impp"],tokensOptionGroup1_webauthn:["webauthn"]},d=[];for(var c in u)d=d.concat(u[c]);var m=!1,p=!0,h=n.nodeName.toLowerCase();if(!s.every(function(e){return d.includes(e)||e.startsWith(u.tokenOptionalSection)}))return(0,a.RuleFail)("fail_incorrect");var g=n.hasAttribute("type")?n.getAttribute("type").trim().toLowerCase():"text",b=[],_=[],f=[];if("textarea"===h||"select"===h)b=u.tokensMandatoryGroup1_all,_=u.tokensMandatoryGroup2_all,"textarea"===h&&(f=u.tokensOptionGroup1_webauthn);else{if("input"!==h)return null;switch(f=u.tokensOptionGroup1_webauthn,g){case"text":case"search":b=u.tokensMandatoryGroup1_text.concat(u.tokensMandatoryGroup1_password,u.tokensMandatoryGroup1_url,u.tokensMandatoryGroup1_numeric,u.tokensMandatoryGroup1_month,u.tokensMandatoryGroup1_date),_=u.tokensMandatoryGroup2_all;break;case"password":b=u.tokensMandatoryGroup1_password;break;case"url":b=u.tokensMandatoryGroup1_url,_=u.tokensMandatoryGroup2_url;break;case"email":_=u.tokensMandatoryGroup2_email;break;case"tel":_=u.tokensMandatoryGroup2_tel;break;case"number":b=u.tokensMandatoryGroup1_numeric;break;case"month":b=u.tokensMandatoryGroup1_month;break;case"date":b=u.tokensMandatoryGroup1_date;break;default:return null}}if(s.includes("on")||s.includes("off"))return 1===s.length?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_invalid");var v=0,A=0;return s[v].startsWith(u.tokenOptionalSection)&&s[v].length>8&&(v++,A++),s.length>v&&u.tokensOptionalPurpose.includes(s[v])&&(v++,A++),s.length>v&&(b.includes(s[v])?(m=!0,v++):(u.tokensOptionalGroup2.includes(s[v])&&v++,_.includes(s[v])&&(m=!0,v++))),s.length>A&&(u.tokensMandatoryGroup1_all.includes(s[A])?(p=!0,A++):(u.tokensOptionalGroup2.includes(s[A])&&A++,u.tokensMandatoryGroup2_all.includes(s[A])&&(p=!0,A++))),s.length>v+A&&f.includes(s[v+A])&&v++,(s.length>v&&f.includes(s[v])||s.length>A&&f.includes(s[A]))&&(v++,A++),m&&s.length===v?(0,a.RulePass)("pass"):p&&s.length===A?(0,a.RuleFail)("fail_incorrect"):(0,a.RuleFail)("fail_inappropriate")}}},7726(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_checkboxes_grouped=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(3864),s=i(4566),u=i(3946),d=i(9196);t.input_checkboxes_grouped={id:"input_checkboxes_grouped",context:"dom:input[type=radio], dom:input[type=checkbox]",refactor:{WCAG20_Input_RadioChkInFieldSet:{Pass_LoneNogroup:"pass_lonenogroup",Pass_Grouped:"pass_grouped",Pass_RadioNoName:"pass_radioNoName",Fail_ControlNameMismatch:"fail_controlnamemismatch",Fail_NotGroupedOtherGrouped:"fail_notgroupedothergrouped",Fail_NotGroupedOtherNotGrouped:"fail_notgroupedothernotgrouped",Fail_NotSameGroup:"fail_notsamegroup",Potential_LoneCheckbox:"potential_lonecheckbox",Potential_UnnamedCheckbox:"potential_unnamedcheckbox"}},help:{"en-US":{group:"input_checkboxes_grouped.html",pass_lonenogroup:"input_checkboxes_grouped.html",pass_grouped:"input_checkboxes_grouped.html",pass_radiononame:"input_checkboxes_grouped.html",fail_controlnamemismatch:"input_checkboxes_grouped.html",fail_notgroupedothergrouped:"input_checkboxes_grouped.html",fail_notgroupedothernotgrouped:"input_checkboxes_grouped.html",fail_notsamegroup:"input_checkboxes_grouped.html",potential_lonecheckbox:"input_checkboxes_grouped.html",potential_unnamedcheckbox:"input_checkboxes_grouped.html"}},messages:{"en-US":{group:"Related sets of radio buttons or checkboxes should be programmatically grouped",pass_lonenogroup:"{0} grouping not required for a control of this type",pass_grouped:"{0} input is grouped with other related controls with the same name",pass_radiononame:"Radio input is not grouped, but passes because it has no name to group with other radio inputs",fail_controlnamemismatch:'{0} input found that has the same name, "{2}" as a {1} input',fail_notgroupedothergrouped:'{0} input is not in the group with another {0} with the name "{1}"',fail_notgroupedothernotgrouped:'{0} input and others with the name "{1}" are not grouped together',fail_notsamegroup:'{0} input is in a different group than another {0} with the name "{1}"',potential_lonecheckbox:"Verify that this ungrouped checkbox input is not related to other checkboxes",potential_unnamedcheckbox:"Verify that this un-named, ungrouped checkbox input is not related to other checkboxes"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node;if(u.VisUtil.isNodeHiddenFromAT(n))return null;var c=function(e){var t=r.CommonUtil.getAncestor(e,"fieldset")||l.AriaUtil.getAncestorWithRole(e,"radiogroup")||l.AriaUtil.getAncestorWithRole(e,"group")||l.AriaUtil.getAncestorWithRole(e,"grid")||l.AriaUtil.getAncestorWithRole(e,"table");return t||(t=r.CommonUtil.getAncestor(e,"table"))&&!d.TableUtil.isDataTable(t)&&(t=null),t},m=n.getAttribute("type").toLowerCase(),p=l.AriaUtil.getAncestorWithRole(n,"form")||r.CommonUtil.getAncestor(n,"html")||n.ownerDocument.documentElement,h=s.CacheUtil.getCache(p,"input_checkboxes_grouped",null);if(!h){h={checkboxByName:{},radiosByName:{},nameToGroup:{},numCheckboxes:0,numRadios:0};for(var g=new o.DOMWalker(p,!1,p,!0),b=[],_=[];g.nextNode();)if(!g.bEndTag&&1===g.node.nodeType&&"input"===g.node.nodeName.toLowerCase()&&u.VisUtil.isNodeVisible(g.node)){var f=g.node.getAttribute("type");"checkbox"===f?b.push(g.node):"radio"===f&&_.push(g.node)}for(var v=0;v<b.length;++v){var A=b[v];if((l.AriaUtil.getAncestorWithRole(A,"form")||r.CommonUtil.getAncestor(n,"html")||n.ownerDocument.documentElement)===p&&!r.CommonUtil.shouldNodeBeSkippedHidden(A)){var w=A.getAttribute("name")||"";(h.checkboxByName[w]=h.checkboxByName[w]||[]).push(A),h.nameToGroup[w]=h.nameToGroup[w]||c(A),++h.numCheckboxes}}for(v=0;v<_.length;++v){var y=_[v];if((l.AriaUtil.getAncestorWithRole(y,"form")||r.CommonUtil.getAncestor(n,"html")||n.ownerDocument.documentElement)===p&&!r.CommonUtil.shouldNodeBeSkippedHidden(y)){var C=y.getAttribute("name")||"";(h.radiosByName[C]=h.radiosByName[C]||[]).push(y),h.nameToGroup[C]=h.nameToGroup[C]||c(y),++h.numRadios}}s.CacheUtil.setCache(p,"input_checkboxes_grouped",h)}var k=n.getAttribute("name"),R=c(n);if(m="radio"===m?"Radio":"Checkbox",k&&""!==k){var x=(h.radiosByName[k]||[]).length,P=(h.checkboxByName[k]||[]).length;return x>0&&P>0?(0,a.RuleFail)("fail_controlnamemismatch",[m,"checkbox"===m?"radio":"checkbox",k]):"Radio"===m&&(1===h.numRadios||1===x)||"Checkbox"===m&&1===h.numCheckboxes?null===R?(0,a.RulePass)("pass_lonenogroup",[m]):(0,a.RulePass)("pass_grouped",[m]):"Checkbox"===m&&h.numCheckboxes>1&&1===P?null===R?(0,a.RulePotential)("potential_lonecheckbox",[m]):(0,a.RulePass)("pass_grouped",[m]):null===R?null!==h.nameToGroup[k]?(0,a.RuleFail)("fail_notgroupedothergrouped",[m,k]):(0,a.RuleFail)("fail_notgroupedothernotgrouped",[m,k]):h.nameToGroup[k]!==R?(0,a.RuleFail)("fail_notsamegroup",[m,k]):(0,a.RulePass)("pass_grouped",[m])}return"Radio"===m?null===R?(0,a.RulePass)("pass_radiononame",[m]):(0,a.RulePass)("pass_grouped",[m]):null===R?(h.checkboxByName[""]||[]).length>1?(0,a.RulePotential)("potential_unnamedcheckbox",[m]):(0,a.RulePass)("pass_lonenogroup",[m]):(0,a.RulePass)("pass_grouped",[m])}}},3142(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_fields_grouped=void 0;var a=i(461),n=i(461),l=i(7139);t.input_fields_grouped={id:"input_fields_grouped",context:"dom:input, dom:textarea, dom:select",refactor:{WCAG20_Input_InFieldSet:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"input_fields_grouped.html",Potential_1:"input_fields_grouped.html",group:"input_fields_grouped.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Use the <fieldset> element to group logically related input elements",group:"Groups of logically related input elements should be contained within a <fieldset> element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node;if("input"==n.nodeName.toLowerCase()&&n.hasAttribute("type")&&"text"!=(m=n.getAttribute("type").toLowerCase())&&"file"!=m&&"password"!=m)return(0,a.RulePass)("Pass_0");if(null!=l.CommonUtil.getAncestor(n,"fieldset"))return(0,a.RulePass)("Pass_0");for(var r=l.CommonUtil.getAncestor(n,["form","body"]),o=["input","textarea","select"],s=!0,u=0;s&&u<o.length;++u)for(var d=r.getElementsByTagName(o[u]),c=0;s&&c<d.length;++c)if(!l.CommonUtil.shouldNodeBeSkippedHidden(d[c])){var m=d[c].hasAttribute("type")?d[c].getAttribute("type").toLowerCase():"text";s=d[c]==n||"text"!=m&&"password"!=m&&"file"!=m}return s?(0,a.RulePass)("Pass_0"):s?void 0:(0,a.RulePotential)("Potential_1")}}},1353(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_haspopup_conflict=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(3946);t.input_haspopup_conflict={id:"input_haspopup_conflict",context:"dom:input[list][aria-haspopup]",refactor:{input_haspopup_invalid:{Potential_1:"potential_type_misuse",Potential_2:"potential_misuse"}},help:{"en-US":{group:"input_haspopup_conflict.html",potential_type_misuse:"input_haspopup_conflict.html",potential_misuse:"input_haspopup_conflict.html",potential_list_notexist:"input_haspopup_conflict.html",fail_invalid_list_type:"input_haspopup_conflict.html",fail_invalid_list_elem:"input_haspopup_conflict.html"}},messages:{"en-US":{group:"<input> element with a 'list' attribute should not use an explicit 'aria-haspopup' attribute",potential_type_misuse:"The <input> element with type \"{0}\" and 'list' attribute uses an explicit 'aria-haspopup' attribute",potential_misuse:"The <input> element with a missing or invalid type and 'list' attribute uses an explicit 'aria-haspopup' attribute",potential_list_notexist:"The list attribute for the <input> element is invalid",fail_invalid_list_type:'The list attribute for the <input> element with the type "{0}" is invalid',fail_invalid_list_elem:"The list attribute for the <input> element does not reference a datalist element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(o.VisUtil.isNodeHiddenFromAT(n)||r.CommonUtil.isNodeDisabled(n))return null;var s=l.AriaUtil.getUserDefinedRoles(n);if(s&&s.length>0&&!s.includes("combobox"))return null;var u=["text","search","tel","url","email","date","month","week","time","datetime-local","number","range","color"],d=["file","password","checkbox","radio","submit","reset","image","hidden","button"],c=n.getAttribute("type");if(!c||0===c.trim().length)return(0,a.RulePotential)("potential_misuse");if(c=c.trim().toLowerCase(),!u.includes(c)&&!d.includes(c))return(0,a.RulePotential)("potential_misuse");if(c&&d.includes(c))return(0,a.RuleFail)("fail_invalid_list_type");var m=n.getAttribute("list");if(!m||0===m.trim().length)return(0,a.RulePotential)("potential_list_notexist");var p=n.ownerDocument.getElementById(m);return p?"datalist"!==p.nodeName.toLowerCase()?(0,a.RuleFail)("fail_invalid_list_elem"):u.includes(c)?(0,a.RulePotential)("potential_type_misuse",[c]):void 0:(0,a.RuleFail)("potential_list_notexist")}}},2631(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_label_after=void 0;var a=i(461),n=i(461),l=i(3864),r=i(7139);t.input_label_after={id:"input_label_after",context:"dom:input",refactor:{WCAG20_Input_LabelAfter:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_0:"input_label_after.html",Fail_1:"input_label_after.html",Fail_2:"input_label_after.html",group:"input_label_after.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Checkbox or radio button is nested in label, so label is not after the input control",Fail_2:"Label text is located before its associated checkbox or radio button element",group:"Checkboxes and radio buttons must have a label after the input control"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.3.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,o="";if(n.hasAttribute("type")&&(o=n.getAttribute("type").toLowerCase()),"checkbox"!=o&&"radio"!=o)return null;var s=r.CommonUtil.getLabelForElementHidden(n,!0);if(null===s||!r.CommonUtil.hasInnerContentHidden(s))return null;var u,d=r.CommonUtil.compareNodeOrder(s,n);if(-2===d){u=!1;var c=new l.DOMWalker(s);for(c.node=n;!u&&c.nextNode();)u="#text"===c.node.nodeName.toLowerCase()&&c.node.nodeValue.trim().length>0||"span"===c.node.nodeName.toLowerCase()&&c.node.textContent.trim().length>0;if(!u)return(0,a.RuleFail)("Fail_1")}else if(1!=d)return(0,a.RuleFail)("Fail_2");return(0,a.RulePass)("Pass_0")}}},8550(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_label_before=void 0;var a=i(461),n=i(461),l=i(7139);t.input_label_before={id:"input_label_before",context:"dom:input, dom:textarea, dom:select",refactor:{WCAG20_Input_LabelBefore:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_0:"input_label_before.html",Fail_1:"input_label_before.html",Fail_2:"input_label_before.html",group:"input_label_before.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Text input is nested in label such that input precedes the label text",Fail_2:"Label text is located after its associated text input or <select> element",group:"Text inputs and <select> elements must have a label before the input control"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.3.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if("input"==n.nodeName.toLowerCase()&&n.hasAttribute("type")){var r=n.getAttribute("type").toLowerCase();if("text"!=r&&"file"!=r&&"password"!=r)return null}var o=l.CommonUtil.getLabelForElementHidden(n,!0);if(null==o||!l.CommonUtil.hasInnerContentHidden(o))return null;var s=l.CommonUtil.compareNodeOrder(o,n);if(-2===s){var u=l.CommonUtil.getInnerText(n);if(u&&u.trim().length>0&&l.CommonUtil.getInnerText(n).trim()===u.trim())return null;for(var d=!1,c=n.previousSibling;!d&&null!==c;)d="#text"==c.nodeName.toLowerCase()&&c.nodeValue.trim().length>0||"span"==c.nodeName.toLowerCase()&&c.textContent.trim().length>0,c=c.previousSibling;if(!d)return(0,a.RuleFail)("Fail_1")}else if(-1!=s)return(0,a.RuleFail)("Fail_2");return(0,a.RulePass)("Pass_0")}}},8853(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_label_exists=void 0;var a=i(461),n=i(461),l=i(7011),r=i(3946),o=i(1950);t.input_label_exists={id:"input_label_exists",context:"aria:button,aria:checkbox,aria:combobox,aria:listbox,aria:menuitemcheckbox,aria:menuitemradio,aria:radio,aria:searchbox,aria:slider,aria:spinbutton,aria:switch,aria:textbox,aria:progressbar,dom:input[type=file],dom:output,dom:meter,dom:input[type=password]",refactor:{WCAG20_Input_ExplicitLabel:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_0:"input_label_exists.html",Fail_1:"input_label_exists.html",Fail_2:"input_label_exists.html",group:"input_label_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Form control element <{0}> has no associated label",Fail_2:'Form control with "{0}" role has no associated label',group:"Each form control must have an associated label"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:["97a4e1","e086e5"],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var s=n.nodeName.toLowerCase();if("datalist"===s)return null;var u="text";if("input"==s&&n.hasAttribute("type")?u=n.getAttribute("type").toLowerCase():("button"===s||l.AriaUtil.hasRoleInSemantics(n,"button"))&&(u="buttonelem"),"input"==s&&""==u&&(u="text"),"image"===u)return null;var d=o.AccNameUtil.computeAccessibleName(n);return d&&d.name&&d.name.trim().length>0?(0,a.RulePass)("Pass_0"):n.hasAttribute("role")&&n.getAttribute("role").trim().length>0?(0,a.RuleFail)("Fail_2",n.getAttribute("role").split(" ")):(0,a.RuleFail)("Fail_1",[s])}}},3180(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_label_visible=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(5279),s=i(3946),u=i(1686),d=i(1950);t.input_label_visible={id:"input_label_visible",context:"aria:button,aria:checkbox,aria:combobox,aria:listbox,aria:menuitemcheckbox,aria:menuitemradio,aria:radio,aria:searchbox,aria:slider,aria:spinbutton,aria:switch,aria:textbox",dependencies:["input_label_exists"],refactor:{WCAG20_Input_VisibleLabel:{Pass_0:"pass",Potential_1:"potential_no_label",potential_placeholder_only:"potential_placeholder_only"}},help:{"en-US":{pass:"input_label_visible.html",potential_placeholder_only:"input_label_visible.html",potential_no_label:"input_label_visible.html",group:"input_label_visible.html"}},messages:{"en-US":{pass:"The input element has an associated visible label",potential_placeholder_only:"The ‘placeholder’ is the only visible label",potential_no_label:"The input element does not have an associated visible label",group:"An input element must have an associated visible label"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.5.3","3.3.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,c=n.nodeName.toLowerCase();if("datalist"===c)return null;if(!s.VisUtil.isNodeVisible(n)||r.CommonUtil.isNodeDisabled(n))return null;if(r.CommonUtil.getAncestor(n,"table"))return null;var m=l.AriaUtil.getResolvedRole(n);if(m&&"button"===m&&"input"!==c&&"button"!==c&&!r.CommonUtil.getAncestor(n,"form"))return null;if(l.AriaUtil.getAncestorWithRole(n,"combobox")&&!(l.AriaUtil.hasRoleInSemantics(n,"textbox")||l.AriaUtil.hasRoleInSemantics(n,"searchbox")||"input"===c||"select"===c&&l.AriaUtil.hasRoleInSemantics(n,"combobox")))return null;for(var p=["listbox","tree","grid","dialog"],h=0;h<p.length;h++)if(l.AriaUtil.hasRoleInSemantics(n,p[h]))for(var g=r.CommonUtil.getElementsByRoleHidden(n.ownerDocument,"combobox",!0,!0),b=0;b<g.length;b++){var _=g[b],f=r.CommonUtil.getElementAttribute(_,"aria-owns");if(f)for(var v=r.CommonUtil.normalizeSpacing(f.trim()).split(" "),A=0;A<v.length;A++)if(o.FragmentUtil.getById(n,v[A])===n)return null}var w=d.AccNameUtil.computeAccessibleName(n);if(("input"===c||"button"===c)&&w&&w.name&&w.name.trim().length>0&&("label"===w.nameFrom||"internal"===w.nameFrom||"alt"===w.nameFrom))return(0,a.RulePass)("pass");if(w&&w.name&&w.name.trim().length>0&&("text"===w.nameFrom||"title"===w.nameFrom))return(0,a.RulePass)("pass");var y=r.CommonUtil.getOnScreenInnerText(n);if(y&&0!==y.length)return(0,a.RulePass)("pass");var C=l.AriaUtil.getAllDescendantsWithRoles(n,["img","graphics-document","graphics-object","graphics-symbol"],!1,!0);if(C&&C.length>0)for(var k=0;k<C.length;k++)if(r.CommonUtil.attributeNonEmpty(C[k],"title")||r.CommonUtil.attributeNonEmpty(C[k],"alt"))return(0,a.RulePass)("pass");if(r.CommonUtil.attributeNonEmpty(n,"aria-labelledby")){var R=n.getAttribute("aria-labelledby").split(/\s+/);for(h=0;h<R.length;++h){var x=o.FragmentUtil.getById(n,R[h]);if(x&&!u.DOMUtil.sameNode(x,n)&&s.VisUtil.isNodeVisible(x)&&r.CommonUtil.hasInnerContentHidden(x))return(0,a.RulePass)("pass")}}if(("optgroup"===c||"option"==c)&&w&&w.name&&w.name.trim().length>0&&("label"===w.nameFrom||"content"===w.nameFrom))return(0,a.RulePass)("pass");var P=n.getAttribute("id");return P&&P.trim().length>0&&n.ownerDocument.querySelector("*[aria-controls='".concat(P,"'][role='combobox']"))?null:r.CommonUtil.attributeNonEmpty(n,"placeholder")?(0,a.RulePotential)("potential_placeholder_only"):(0,a.RulePotential)("potential_no_label")}}},1382(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_onchange_review=void 0;var a=i(461),n=i(461);t.input_onchange_review={id:"input_onchange_review",context:"dom:input[onchange], dom:textarea[onchange], dom:select[onchange]",refactor:{WCAG20_Input_HasOnchange:{Potential_1:"potential_warning"}},help:{"en-US":{potential_warning:"input_onchange_review.html",group:"input_onchange_review.html"}},messages:{"en-US":{group:"Users must be advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs",potential_warning:"Confirm that the user is advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.2.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if("input"==n.nodeName.toLowerCase()&&n.hasAttribute("type")){var l=n.getAttribute("type").toLowerCase();if("hidden"===l||"submit"===l||"image"===l||"button"===l||"reset"===l)return null}return(0,a.RulePotential)("potential_warning")}}},953(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_placeholder_label_visible=void 0;var a=i(461);t.input_placeholder_label_visible={id:"input_placeholder_label_visible",context:"dom:input[placeholder], dom:textarea[placeholder]",refactor:{HAAC_Input_Placeholder:{Pass_0:"Pass_0",Potential_1:"Potential_1",Potential_2:"Potential_2"}},help:{"en-US":{Pass_0:"input_placeholder_label_visible.html",Potential_1:"input_placeholder_label_visible.html",Potential_2:"input_placeholder_label_visible.html",group:"input_placeholder_label_visible.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"HTML5 placeholder is the only visible label",Potential_2:"Additional visible label referenced by 'aria-labelledby' is not valid",group:"HTML5 'placeholder' attribute must not be used as a visible label replacement"}},rulesets:[],act:[],run:function(e,t,i){var n=e.dom.node;if(n.hasAttribute("type")){var l=n.getAttribute("type").toLowerCase();if("hidden"==l||"button"==l)return(0,a.RulePass)("Pass_0")}if(n.hasAttribute("hidden")){var r=n.getAttribute("hidden");if(""==r||"hidden"==r.toLowerCase())return(0,a.RulePass)("Pass_0")}if(n.hasAttribute("aria-label"))return(0,a.RulePotential)("Potential_1");if(n.hasAttribute("aria-labelledby")&&n.hasAttribute("id")){var o=n.getAttribute("id").trim();return n.getAttribute("aria-labelledby").trim().split(/\s+/).includes(o)?(0,a.RulePotential)("Potential_2"):(0,a.RulePass)("Pass_0")}return(0,a.RulePass)("Pass_0")}}},2222(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.label_content_exists=void 0;var a=i(461),n=i(461),l=i(7139),r=i(5279),o=i(1686);t.label_content_exists={id:"label_content_exists",context:"dom:label",refactor:{Valerie_Label_HasContent:{Pass_Regular:"Pass_Regular",Pass_AriaLabel:"Pass_AriaLabel",Pass_LabelledBy:"Pass_LabelledBy",Fail_1:"Fail_1"}},help:{"en-US":{Pass_Regular:"label_content_exists.html",Pass_AriaLabel:"label_content_exists.html",Pass_LabelledBy:"label_content_exists.html",Fail_1:"label_content_exists.html",group:"label_content_exists.html"}},messages:{"en-US":{Pass_Regular:"<label> element has accessible name with inner content",Pass_AriaLabel:"<label> element has accessible name via 'aria-label'",Pass_LabelledBy:"<label> element has accessible name via 'aria-labelledby'",Fail_1:"The <label> element does not have descriptive text that identifies the expected input",group:"A <label> element must have non-empty descriptive text that identifies the purpose of the interactive component"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.CommonUtil.hasInnerContentHidden(n))return(0,a.RulePass)("Pass_Regular");if((n.getAttribute("aria-label")||"").trim().length>0)return(0,a.RulePass)("Pass_AriaLabel");if(n.hasAttribute("aria-labelledby")){var s=r.FragmentUtil.getById(n,n.getAttribute("aria-labelledby"));if(s&&!o.DOMUtil.sameNode(s,n)&&l.CommonUtil.hasInnerContent(s))return(0,a.RulePass)("Pass_LabelledBy")}return(0,a.RuleFail)("Fail_1")}}},4678(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.label_name_visible=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(5279),s=i(3946),u=i(4919),d=i(3864);t.label_name_visible={id:"label_name_visible",context:"aria:button,aria:checkbox,aria:gridcell,aria:link,aria:menuitem,aria:menuitemcheckbox,aria:menuitemradio,aria:option,aria:radio,aria:switch,aria:tab,aria:treeitem,dom:input,dom:textarea,dom:select,dom:output,dom:meter",refactor:{WCAG21_Label_Accessible:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"label_name_visible.html",Fail_1:"label_name_visible.html",group:"label_name_visible.html"}},messages:{"en-US":{Pass_0:"Accessible name matches or contains the visible label text",Fail_1:"Accessible name does not match or contain the visible label text",group:"Accessible name must match or contain the visible label text"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_2"],num:["2.5.3"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:"2ee8b8",run:function(e,t,i){var n=e.dom.node;if(!s.VisUtil.isNodeVisible(n)||r.CommonUtil.isNodeDisabled(n))return null;if(u.CSSUtil.isMaterialIconFont(n))return(0,a.RulePass)("Pass_0");var c=!0,m=n.nodeName.toLowerCase(),p=!1,h=null;"input"===m&&n.hasAttribute("type")&&(h=n.getAttribute("type").toLowerCase(),-1!==r.CommonUtil.form_button_types.indexOf(h)&&(p=!0));var g=l.AriaUtil.getAriaAttribute(n,"aria-labelledby");if(!g||r.CommonUtil.isIdReferToSelf(n,g)||p){var b=null;if(g&&!r.CommonUtil.isIdReferToSelf(n,g))for(var _=g.split(/\s+/),f=0;f<_.length;++f){var v=o.FragmentUtil.getById(n,_[f]);if(v){b=r.CommonUtil.getInnerText(v);break}}else b=l.AriaUtil.getAriaAttribute(n,"aria-label");if(!b)return null;var A=null;if(p&&(n.hasAttribute("value")?A=n.getAttribute("value"):"submit"===h?A="submit":"reset"===h&&(A="reset")),!A){var w=r.CommonUtil.getLabelForElementHidden(n,!0);if(!w){var y=d.DOMWalker.parentNode(n);if("label"===y.nodeName.toLowerCase()){var C=y.cloneNode(!0);w=r.CommonUtil.removeAllFormElementsFromLabel(C)}}var k=w||n;A=w||-1===["meter","output","progress","select","textarea"].indexOf(m)?r.CommonUtil.getOnScreenInnerText(k):""}var R=/[^a-zA-Z0-9]/g;A=A.replace(R," ");var x=r.CommonUtil.normalizeSpacing(A).toLowerCase();b=b.replace(R," ");var P=r.CommonUtil.normalizeSpacing(b).toLowerCase();if(x.length>1){var T=P.indexOf(x);if(T>=0&&P.length>x.length){var U=/^[0-9a-zA-Z]+$/;T+x.length<P.length&&P.charAt(T+x.length).match(U)&&(c=!1),c&&T>0&&P.charAt(T-1).match(U)&&(c=!1)}-1===T&&(c=!1)}}return c?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},7578(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.label_ref_valid=void 0;var a=i(461),n=i(461),l=i(5279),r=i(3946);t.label_ref_valid={id:"label_ref_valid",context:"dom:label[for]",refactor:{WCAG20_Label_RefValid:{Pass_0:"pass",Fail_1:"fail_invalid"}},help:{"en-US":{pass:"label_ref_valid.html",fail_invalid:"label_ref_valid.html",group:"label_ref_valid.html"}},messages:{"en-US":{pass:"The 'for' attribute for a label referencea a unique non-empty 'id' attribute of a valid element",fail_invalid:"The value \"{0}\" of the 'for' attribute is not the 'id' of a valid element",group:"The 'for' attribute for a label should reference a non-empty, unique 'id' attribute of a valid element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,o=n.getAttribute("for"),s=!1,u=l.FragmentUtil.getById(n,o);if(u){if(!r.VisUtil.isNodeVisible(u)&&!r.VisUtil.isNodeVisible(n))return null;if(s=!0,!u.hasAttribute("role")){var d=u.nodeName.toLowerCase();if(s="input"==d||"select"==d||"textarea"==d||"button"==d||"datalist"==d||"optgroup"==d||"option"==d||"keygen"==d||"output"==d||"progress"==d||"meter"==d||"fieldset"==d||"legend"==d,"input"==u.nodeName.toLowerCase()&&u.hasAttribute("type")){var c=u.getAttribute("type").toLowerCase();s="text"==c||"password"==c||"file"==c||"checkbox"==c||"radio"==c||"hidden"==c||"search"==c||"tel"==c||"url"==c||"email"==c||"date"==c||"number"==c||"range"==c||"image"==c||"time"==c||"color"==c||"datetime-local"==c||"month"==c||"week"==c}}s&&!r.VisUtil.isNodeVisible(u)&&(s=!1)}var m=[];return s||m.push(o),s?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_invalid",m)}}},9964(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.list_children_valid=void 0;var a=i(461),n=i(461),l=i(7011),r=i(3864);t.list_children_valid={id:"list_children_valid",context:"aria:group",refactor:{HAAC_List_Group_ListItem:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"list_children_valid.html",Fail_1:"list_children_valid.html",group:"list_children_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'List component with "group" role has children that are not <listitem> elements',group:'List component with "group" role must limit children to <listitem> elements'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,o=r.DOMWalker.parentElement(n);if(!l.AriaUtil.hasRoleInSemantics(o,"list"))return null;for(var s=!0,u=n.children,d=0;s&&d<u.length;d++)s=l.AriaUtil.hasRoleInSemantics(u[d],"listitem");return s?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},6401(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.list_markup_review=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(3864),s=i(3946);t.list_markup_review={id:"list_markup_review",context:"dom:*",refactor:{RPT_List_UseMarkup:{Potential_1:"Potential_1"}},help:{"en-US":{potential_list:"list_markup_review.html",group:"list_markup_review.html"}},messages:{"en-US":{potential_list:"Verify this is a list and if so, modify to use proper HTML elements for the list",group:"Proper HTML elements should be used to create a list"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,u=n.nodeName.toLowerCase();if(r.CommonUtil.isNodeDisabled(n)||s.VisUtil.hiddenByDefaultElements.includes(u))return null;if(null===r.CommonUtil.getAncestor(n,["body"]))return null;if(null!==r.CommonUtil.getAncestor(n,["script","label"]))return null;var d=l.AriaUtil.getRolesWithTypes(n,["widget"]);if(r.CommonUtil.concatUniqueArrayItemList(["caption","code","columnheader","figure","list","listitem","math","meter","columnheader","rowheader"],d),null!==l.AriaUtil.getAncestorWithRoles(n,d))return null;for(var c=!0,m=n.firstChild;c&&m;){if("#text"==m.nodeName){var p=m.nodeValue;if(!(c=!/^[ \t\r\n]*[( ]*[1-9]*[\*\-).][ \t][A-Z,a-z]+/.test(p)))for(var h=new o.DOMWalker(m);!c&&h.prevNode();){var g=h.node.nodeName.toLowerCase();if(["blockquote","center","dir","div","form","h1","h2","h3","h4","h5","h6","hr","br","menu","p","pre"].includes(g))break;if("#text"==g){var b=h.node.nodeValue;c=b.length>0&&![" ","\t","\n"].includes(b.charAt(b.length-1))}}}m=m.nextSibling}return c?null:c?void 0:(0,a.RulePotential)("potential_list")}}},1174(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.list_structure_proper=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139);t.list_structure_proper={id:"list_structure_proper",context:"dom:dl, dom:ul, dom:ol, dom:dir, dom:menu, dom:li, dom:dd, dom:dt",refactor:{RPT_List_Misuse:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"list_structure_proper.html",Potential_1:"list_structure_proper.html",group:"list_structure_proper.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"List element is missing or improperly structured",group:"List elements should only be used for lists of related items"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n,o=e.dom.node,s=o.nodeName.toLowerCase();if(o.children,"dl"==s){var u="",d="",c=o.firstChild;n=!0;var m=!1;if(o.children&&0!=o.children.length){for(;n&&null!=c;){if(1==c.nodeType){var p=c.nodeName.toLowerCase();if(l.AriaUtil.isPresentationalElement(c)){m=!0,c=c.nextSibling;continue}n="dd"==p||"dt"==p,""==u&&(u=p),d=p}c=c.nextSibling}n=n&&"dt"==u&&"dd"==d||n&&m}else n=!0}else if("li"==s)n=null!=r.CommonUtil.getAncestor(o,["ul","ol","dir","menu"]);else if("dd"==s||"dt"==s)n=null!=r.CommonUtil.getAncestor(o,"dl");else if(c=o.firstChild,"ul"!=s&&"ol"!=s&&"menu"!=s||o.children&&0!=o.children.length){var h=!1;for(m=!1,n=!0;n&&null!=c;)l.AriaUtil.isPresentationalElement(c)?(m=!0,c=c.nextSibling):(n=1!=c.nodeType||"li"==c.nodeName.toLowerCase()||"template"==c.nodeName.toLowerCase()&&("ul"==s||"ol"==s),h=h||1==c.nodeType&&"li"==c.nodeName.toLowerCase(),c=c.nextSibling);n=n&&h||n&&m}else n=!0;return n?(0,a.RulePass)("Pass_0"):n?void 0:(0,a.RulePotential)("Potential_1")}}},9907(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.marquee_elem_avoid=void 0;var a=i(461),n=i(461);t.marquee_elem_avoid={id:"marquee_elem_avoid",context:"dom:marquee",refactor:{RPT_Marquee_Trigger:{Fail_1:"Fail_1"}},help:{"en-US":{Fail_1:"marquee_elem_avoid.html",group:"marquee_elem_avoid.html"}},messages:{"en-US":{Fail_1:"Scrolling content found that uses the obsolete <marquee> element",group:"The <marquee> element is obsolete and should not be used"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.2.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){return e.dom.node,(0,a.RuleFail)("Fail_1")}}},6032(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.media_alt_brief=void 0;var a=i(461),n=i(461),l=i(3946);t.media_alt_brief={id:"media_alt_brief",context:"dom:img[alt], dom:applet[alt], dom:area[alt], dom:embed[alt], dom:input[type][alt]",refactor:{RPT_Media_AltBrief:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"media_alt_brief.html",Potential_1:"media_alt_brief.html",group:"media_alt_brief.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Text alternative is more than 150 characters",group:"Alternative text in 'alt' attribute should be brief (<150 characters)"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var r=n.getAttribute("alt").trim().length<=150;return r?(0,a.RulePass)("Pass_0"):r?void 0:(0,a.RulePotential)("Potential_1")}}},5622(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.media_alt_exists=void 0;var a=i(461),n=i(461),l=i(7139),r=i(3946);t.media_alt_exists={id:"media_alt_exists",context:"dom:area[alt], dom:embed[alt]",refactor:{RPT_Media_AudioVideoAltFilename:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"media_alt_exists.html",Potential_1:"media_alt_exists.html",group:"media_alt_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Filename used as label for embedded audio or video",group:"Audio or video on the page must have a short text alternative that describes the media content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var o="";null==(o="area"==n.nodeName.toLowerCase()?n.getAttribute("href"):n.getAttribute("src"))&&(o="");var s=l.CommonUtil.getFileExt(o),u=0!=s.length&&(l.CommonUtil.isAudioExt(s)||l.CommonUtil.isVideoExt(s)),d=n.getAttribute("alt"),c=!u||d.length>0&&-1==d.indexOf(s);return c?(0,a.RulePass)("Pass_0"):c?void 0:(0,a.RulePotential)("Potential_1")}}},2240(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.media_audio_transcribed=void 0;var a=i(461),n=i(461),l=i(7139),r=i(3946);t.media_audio_transcribed={id:"media_audio_transcribed",context:"dom:bgsound, dom:a[href], dom:area[href], dom:embed, dom:object",refactor:{RPT_Media_AudioTrigger:{Manual_1:"Manual_1"}},help:{"en-US":{Manual_1:"media_audio_transcribed.html",group:"media_audio_transcribed.html"}},messages:{"en-US":{Manual_1:"Provide transcripts for audio files",group:"Audio information should also be available in text form"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.2.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n,o=e.dom.node;return r.VisUtil.isNodeHiddenFromAT(o)||(n="bgsound"!=o.nodeName.toLowerCase()&&!l.CommonUtil.isAudioObjEmbedLink(o))?null:n?void 0:(0,a.RuleManual)("Manual_1")}}},4019(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.media_autostart_controllable=void 0;var a=i(461),n=i(461);t.media_autostart_controllable={id:"media_autostart_controllable",context:"dom:param[name=autoplay], dom:param[name=autostart], dom:embed[flashvars], dom:embed[src], dom:*[autostart=true], dom:*[autostart=1], dom:bgsound",refactor:{RPT_Embed_AutoStart:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"media_autostart_controllable.html",Potential_1:"media_autostart_controllable.html",group:"media_autostart_controllable.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify there is a mechanism to pause or stop and control the volume for the audio that plays automatically",group:"Mechanism must be available to pause or stop and control the volume of the audio that plays automatically"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.4.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n,l=e.dom.node,r=l.nodeName.toLowerCase();if("bgsound"==r)n=!1;else if("param"==r){var o="";l.hasAttribute("value")&&(o=l.getAttribute("value").toLowerCase()),n=0==o.indexOf("0;")||!(-1!=o.indexOf("true")||-1!=o.indexOf("1"))}else if("embed"==r){var s;n=!0,l.hasAttribute("flashvars")&&(n=-1==(s=l.getAttribute("flashvars")).indexOf("autostart=true")&&-1==s.indexOf("autostart=1")),n&&l.hasAttribute("src")&&(n=-1==(s=l.getAttribute("src")).indexOf("autostart=true")&&-1==s.indexOf("autostart=1"))}if(n&&l.hasAttribute("autostart")){var u=l.getAttribute("autostart").toLowerCase();n="true"!=u&&"1"!=u}return n?(0,a.RulePass)("Pass_0"):(0,a.RulePotential)("Potential_1")}}},361(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.media_keyboard_controllable=void 0;var a=i(461),n=i(461),l=i(3946);t.media_keyboard_controllable={id:"media_keyboard_controllable",context:"dom:audio, dom:video",refactor:{HAAC_Audio_Video_Trigger:{Pass_0:"Pass_0",Manual_1:"Manual_1"}},help:{"en-US":{Pass_0:"media_keyboard_controllable.html",Manual_1:"media_keyboard_controllable.html",group:"media_keyboard_controllable.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Manual_1:"Verify media using <audio> and/or <video> elements have keyboard accessible controls",group:"Media using <audio> and/or <video> elements must have keyboard accessible controls"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var r=!0,o=n.nodeName.toLowerCase();return"audio"!=o&&"video"!==o||(r=!1),r?(0,a.RulePass)("Pass_0"):(0,a.RuleManual)("Manual_1")}}},5960(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.media_live_captioned=void 0;var a=i(461),n=i(461),l=i(7139);t.media_live_captioned={id:"media_live_captioned",context:"dom:embed, dom:object",refactor:{RPT_Media_VideoObjectTrigger:{Manual_1:"Manual_1"}},help:{"en-US":{Manual_1:"media_live_captioned.html",group:"media_live_captioned.html"}},messages:{"en-US":{Manual_1:"Verify captions are provided for live media (streaming video with audio)",group:"Live media (streaming video with audio) should have captions for audio content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.2.4"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,r=!l.CommonUtil.isVideoObjEmbedLink(n);return r?null:r?void 0:(0,a.RuleManual)("Manual_1")}}},5515(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.media_track_available=void 0;var a=i(461),n=i(461),l=i(7139),r=i(3946);t.media_track_available={id:"media_track_available",context:"dom:a[href], dom:area[href], dom:applet, dom:embed, dom:object",refactor:{RPT_Media_VideoReferenceTrigger:{Manual_1:"Manual_1"}},help:{"en-US":{Manual_1:"media_track_available.html",group:"media_track_available.html"}},messages:{"en-US":{Manual_1:"Verify availability of a user-selectable audio track with description of visual content",group:"Pre-recorded media should have an audio track that describes visual information"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.2.3","1.2.5"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var o;return(o="applet"!=n.nodeName.toLowerCase()&&!l.CommonUtil.isVideoObjEmbedLink(n))?null:o?void 0:(0,a.RuleManual)("Manual_1")}}},8752(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.meta_redirect_optional=void 0;var a=i(461),n=i(461),l=i(4566);t.meta_redirect_optional={id:"meta_redirect_optional",context:"dom:meta[http-equiv][content]",refactor:{WCAG20_Meta_RedirectZero:{pass:"pass",fail:"fail",fail_longrefresh:"fail_longrefresh"}},help:{"en-US":{group:"meta_redirect_optional.html",pass:"meta_redirect_optional.html",fail:"meta_redirect_optional.html",fail_longrefresh:"meta_redirect_optional.html"}},messages:{"en-US":{group:"Page should not automatically refresh without warning or option to turn it off or adjust the time limit",pass:"Rule Passed",fail:"Check page does not automatically refresh without warning or options",fail_longrefresh:"Check page does not automatically refresh without warning or options"}},rulesets:[{id:[],num:["2.2.4","3.2.5"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:["bisz58"],run:function(e,t,i){var n=e.dom.node;if("refresh"!==n.getAttribute("http-equiv").toLowerCase())return null;var r=n.ownerDocument;if(r){if(l.CacheUtil.getCache(r,"meta_redirect_optional_done",!1))return null;var o=n.getAttribute("content").toLowerCase();if(!o||0===o.trim().length)return null;var s=-1;if(o.match(/^\d+$/))s=parseInt(o);else if(o.match(/^\d+;/)){var u=o.indexOf(";");s=parseInt(o.substring(0,u))}return-1===s?null:(l.CacheUtil.setCache(r,"meta_redirect_optional_done",!0),0===s?(0,a.RulePass)("pass"):s<72001?(0,a.RuleFail)("fail"):(0,a.RuleFail)("fail_longrefresh"))}}}},8834(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.meta_refresh_delay=void 0;var a=i(461),n=i(461),l=i(4566);t.meta_refresh_delay={id:"meta_refresh_delay",context:"dom:meta[http-equiv][content]",refactor:{RPT_Meta_Refresh:{Pass_0:"pass",Potential_1:"potential_refresh"}},help:{"en-US":{group:"meta_refresh_delay.html",pass:"meta_refresh_delay.html",potential_refresh:"meta_refresh_delay.html"}},messages:{"en-US":{group:"Pages should not refresh automatically",pass:"Pages do not refresh automatically",potential_refresh:"Verify page is not being caused to refresh automatically"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.2.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:["bc659a"],run:function(e,t,i){var n=e.dom.node;if("refresh"!==n.getAttribute("http-equiv").toLowerCase())return null;var r=n.ownerDocument;if(r){if(l.CacheUtil.getCache(r,"meta_refresh_delay_done",!1))return null;var o=n.getAttribute("content").toLowerCase();if(!o||0===o.trim().length)return null;var s=-1;if(o.match(/^\d+$/))s=parseInt(o);else if(o.match(/^\d+;/)){var u=o.indexOf(";");s=parseInt(o.substring(0,u))}return-1===s?null:(l.CacheUtil.setCache(r,"meta_refresh_delay_done",!0),0===s?(0,a.RulePass)("pass"):(0,a.RulePotential)("potential_refresh"))}}}},1025(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.meta_viewport_zoomable=void 0;var a=i(461),n=i(461);t.meta_viewport_zoomable={id:"meta_viewport_zoomable",context:"dom:meta[name][content]",refactor:{meta_viewport_zoom:{Pass_0:"pass",Potential_1:"potential_zoomable"}},help:{"en-US":{group:"meta_viewport_zoomable.html",pass:"meta_viewport_zoomable.html",potential_zoomable:"meta_viewport_zoomable.html"}},messages:{"en-US":{group:"The 'meta[name=viewport]' should not prevent the browser zooming the content",pass:"The 'meta[name=viewport]' does not prevent the browser zooming the content",potential_zoomable:"Confirm the 'meta[name=viewport]' with \"{0}\" can be zoomed by user"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.4.4"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[{b4f0c3:{pass:"pass",potential_zoomable:"fail"}}],run:function(e,t,i){var n=e.dom.node;if("viewport"!==n.getAttribute("name").toLowerCase())return null;var l=n.getAttribute("content").toLowerCase();if(!l||""===l.trim()||!l.includes("maximum-scale")&&!l.includes("user-scalable"))return null;for(var r=null,o=null,s="yes",u="2.0",d=0,c=l.split(",");d<c.length;d++){var m=c[d],p=m.trim().split("=");p.length<2||(m.includes("user-scalable")?(r=m,((s=p[1].trim()).startsWith("'")||s.startsWith('"'))&&(s=s.substring(1,s.length-1))):m.includes("maximum-scale")&&(o=m,((u=p[1].trim()).startsWith("'")||u.startsWith('"'))&&(u=u.substring(1,u.length-1).trim())))}var h=Number(s);isNaN(h)||(h>=1||h<=-1)&&(s="yes");var g;return h=Number(u),g=isNaN(h)?"yes"===u?1:.1:h<0?2:h,"yes"!==s?(0,a.RulePotential)("potential_zoomable",[r]):g<2?(0,a.RulePotential)("potential_zoomable",[o]):(0,a.RulePass)("pass")}}},9116(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.noembed_content_exists=void 0;var a=i(461),n=i(461),l=i(7139),r=i(3946);t.noembed_content_exists={id:"noembed_content_exists",context:"dom:noembed",refactor:{Valerie_Noembed_HasContent:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"noembed_content_exists.html",Potential_1:"noembed_content_exists.html",group:"noembed_content_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Add descriptive text to the <noembed> element",group:"<noembed> elements should contain descriptive text"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_FOUR}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var o=l.CommonUtil.hasInnerContentHidden(n);return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},435(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.object_text_exists=void 0;var a=i(461),n=i(461),l=i(3946),r=i(1950);t.object_text_exists={id:"object_text_exists",context:"dom:object",refactor:{WCAG20_Object_HasText:{pass:"pass",fail_no_text_alternative:"fail_no_text_alternative"}},help:{"en-US":{group:"object_text_exists.html",pass:"object_text_exists.html",fail_no_text_alternative:"object_text_exists.html"}},messages:{"en-US":{group:"<object> element must have a text alternative for the content rendered by the object",pass:"<object> element has a text alternative",fail_no_text_alternative:"An <object> element does not have a text alternative"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:"8fc3b6",run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;if(n.hasAttribute("type")&&-1!==n.getAttribute("type").indexOf("text"))return null;if(n.getAttribute("role"))return null;var o=n.getAttribute("data"),s=o&&"string"==typeof o?o.substring(o.lastIndexOf(".")):"";if(".html"===s||".htm"===s)return null;var u=r.AccNameUtil.computeAccessibleName(n);return u&&u.name&&u.name.trim().length>0?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_no_text_alternative")}}},6640(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.page_title_exists=void 0;var a=i(461),n=i(461),l=i(7139),r=i(6858);t.page_title_exists={id:"page_title_exists",context:"dom:html",refactor:{WCAG20_Doc_HasTitle:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{group:"page_title_exists.html",Pass_0:"page_title_exists.html",Fail_1:"page_title_exists.html",Fail_2:"page_title_exists.html",Fail_3:"page_title_exists.html"}},messages:{"en-US":{group:"The page should have a title that correctly identifies the subject of the page",Pass_0:"Rule Passed",Fail_1:"Missing <head> element so there can be no <title> element present",Fail_2:"Missing <title> element in <head> element",Fail_3:"The <title> element is empty (no innerHTML)"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[{"2779a5":{Pass_0:"pass",Fail_1:"pass",Fail_2:"fail",Fail_3:"fail"}}],run:function(e,t,i){if(r.AncestorUtil.isFrame(i))return null;for(var n=e.dom.node,o=n.firstChild,s=null;null!=o&&"head"!=o.nodeName.toLowerCase();)o=o.nextSibling;for(var u=n.querySelectorAll("title"),d=0;d<u.length;++d)if(!l.CommonUtil.getAncestor(u[d],["svg"])){s=u[d];break}return null!==o||s?null===s?(0,a.RuleFail)("Fail_2"):null!=s&&l.CommonUtil.getInnerText(s).trim().length>0?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_3"):(0,a.RuleFail)("Fail_1")}}},2068(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.page_title_valid=void 0;var a=i(461),n=i(461),l=i(7139);t.page_title_valid={id:"page_title_valid",context:"dom:head dom:title",refactor:{RPT_Title_Valid:{Pass_0:"Pass_0",Potential_2:"Potential_2"}},help:{"en-US":{Pass_0:"page_title_valid.html",Potential_2:"page_title_valid.html",group:"page_title_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_2:"Verify that using the filename as the page <title> value is descriptive",group:"Page <title> should be a descriptive title, rather than a filename"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,r=l.CommonUtil.getInnerText(n).trim(),o=r.toLowerCase();return o.includes(".com")||o.includes(".net")||o.includes(".org")?(0,a.RulePass)("Pass_0",[r]):0===r.length?null:/^\S*\.[a-zA-Z]{1,4}(?!.)|^https?:\/\/\S*/i.test(r)?(0,a.RulePotential)("Potential_2"):(0,a.RulePass)("Pass_0",[r])}}},7322(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.script_focus_blur_review=void 0;var a=i(461),n=i(461);t.script_focus_blur_review={id:"script_focus_blur_review",context:"dom:*[onfocus]",refactor:{WCAG20_Script_FocusBlurs:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"script_focus_blur_review.html",Potential_1:"script_focus_blur_review.html",group:"script_focus_blur_review.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify script does not remove focus from content that normally receives focus",group:"Scripting must not remove focus from content that normally receives focus"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1","2.4.7","3.2.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=-1==e.dom.node.getAttribute("onfocus").indexOf(".blur(");return n?(0,a.RulePass)("Pass_0"):n?void 0:(0,a.RulePotential)("Potential_1")}}},5702(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.script_onclick_avoid=void 0;var a=i(461),n=i(461),l=i(7139);t.script_onclick_avoid={id:"script_onclick_avoid",context:"dom:*[onclick]",dependencies:["script_onclick_misuse"],refactor:{RPT_Script_OnclickHTML2:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"script_onclick_avoid.html",Potential_1:"script_onclick_avoid.html",group:"script_onclick_avoid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that 'onclick' events are not used in script to emulate a link",group:"Scripts should not be used to emulate links"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_FOUR}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.CommonUtil.getAncestor(n,"svg"))return(0,a.RulePass)("Pass_0");if(l.CommonUtil.attributeNonEmpty(n,"role"))return(0,a.RulePass)("Pass_0");var r=n.nodeName.toLowerCase(),o="a"==r||"area"==r||"input"==r;return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},1961(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.script_onclick_misuse=void 0;var a=i(461),n=i(461),l=i(7139);t.script_onclick_misuse={id:"script_onclick_misuse",context:"dom:*[onclick]",refactor:{RPT_Script_OnclickHTML1:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"script_onclick_misuse.html",Potential_1:"script_onclick_misuse.html",group:"script_onclick_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Possible use of a script to emulate a link",group:"Scripts should not be used to emulate links"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,r=l.CommonUtil.attributeNonEmpty(n,"role"),o=n.nodeName.toLowerCase();if(!(r=r||("a"==o||"area"==o)&&l.CommonUtil.attributeNonEmpty(n,"href"))){var s=[".asp",".aspx",".cfm",".cfml",".cgi",".htm",".html",".shtm",".shtml",".php",".pl",".py",".shtm",".shtml",".xhtml","location.href"],u=n.getAttribute("onclick").toLowerCase();r=!0;for(var d=0;r&&d<s.length;++d)r=-1==u.indexOf(s[d])}return r?(0,a.RulePass)("Pass_0"):r?void 0:(0,a.RulePotential)("Potential_1")}}},3022(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.script_select_review=void 0;var a=i(461),n=i(461);t.script_select_review={id:"script_select_review",context:"dom:select",refactor:{WCAG20_Select_NoChangeAction:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"script_select_review.html",Potential_1:"script_select_review.html",group:"script_select_review.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that no change of context or action occurs when selection options in this component receive focus",group:"No changes of context should occur when a selection value receives focus"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.2.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,l=!n.hasAttribute("onchange")&&!n.hasAttribute("onfocus");return l?(0,a.RulePass)("Pass_0"):l?void 0:(0,a.RulePotential)("Potential_1")}}},375(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.select_options_grouped=void 0;var a=i(461),n=i(461),l=i(7139);t.select_options_grouped={id:"select_options_grouped",context:"dom:select",refactor:{WCAG20_Select_HasOptGroup:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"select_options_grouped.html",Potential_1:"select_options_grouped.html",group:"select_options_grouped.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Group of related options may need <optgroup>",group:"Groups of related options within a selection list should be grouped with <optgroup>"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,r=l.CommonUtil.getChildByTagHidden(n,"optgroup",!1,!0).length>0||l.CommonUtil.getChildByTagHidden(n,"option",!1,!0).length<=10;return r?(0,a.RulePass)("Pass_0"):r?void 0:(0,a.RulePotential)("Potential_1")}}},4658(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.skip_main_described=void 0;var a=i(461),n=i(461),l=i(7139),r=i(4566),o=i(3946);t.skip_main_described={id:"skip_main_described",context:"dom:body",dependencies:["skip_main_exists"],refactor:{WCAG20_Body_FirstAContainsSkipText_Native_Host_Sematics:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"skip_main_described.html",Potential_1:"skip_main_described.html",group:"skip_main_described.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that if this hyperlink skips content, the description communicates where it links to",group:"The description of a hyperlink used to skip content must communicate where it links to"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n,s={paramSkipText:{value:["skip","jump"],type:"[string]"}},u=e.dom.node,d=u.ownerDocument;if(null===r.CacheUtil.getCache(u,"IBM_hasLandmarks_Implicit",null)&&r.CacheUtil.setCache(u,"IBM_hasLandmarks_Implicit",l.CommonUtil.getElementsByRoleHidden(u.ownerDocument,["application","banner","complementary","contentinfo","form","main","navigation","search"],!0,!0).length>0),!(n=r.CacheUtil.getCache(u,"IBM_hasLandmarks_Implicit",!1))){var c=d.links;if(c&&c.length>0&&o.VisUtil.isNodeVisible(c[0]))for(var m=l.CommonUtil.getInnerText(d.links[0]).toLowerCase(),p=0;!n&&p<s.paramSkipText.value.length;++p)n=-1!=m.indexOf(s.paramSkipText.value[p]);else n=!1}return n?(0,a.RulePass)("Pass_0"):n?void 0:(0,a.RulePotential)("Potential_1")}}},4605(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.skip_main_exists=void 0;var a=i(461),n=i(461),l=i(7139),r=i(6858),o=i(4566),s=i(3946);t.skip_main_exists={id:"skip_main_exists",context:"dom:body",refactor:{WCAG20_Body_FirstASkips_Native_Host_Sematics:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"skip_main_exists.html",Fail_1:"skip_main_exists.html",group:"skip_main_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'The page does not provide a way to quickly navigate to the main content (ARIA "main" landmark or a skip link)',group:"Pages must provide a way to skip directly to the main content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){if(r.AncestorUtil.isPresentationFrame(i))return null;var n,u=e.dom.node,d=u.ownerDocument;if(null===o.CacheUtil.getCache(u,"IBM_hasLandmarks_Implicit",null)&&o.CacheUtil.setCache(u,"IBM_hasLandmarks_Implicit",l.CommonUtil.getElementsByRoleHidden(u.ownerDocument,["application","banner","complementary","contentinfo","form","main","navigation","search"],!0,!0).length>0),!(n=o.CacheUtil.getCache(u,"IBM_hasLandmarks_Implicit",!1))){for(var c=l.CommonUtil.getDocElementsByTag(u,"a"),m=null,p=0;p<c.length;++p)if(c[p].hasAttribute("href")&&s.VisUtil.isNodeVisible(c[p])){m=c[p];break}var h=null;if(null!=m){var g=m.getAttribute("href"),b=g.indexOf("#");-1!=b&&(h=g.substring(b+1))}if(null!=h)for(n=null!=d.getElementById(h),p=0;!n&&p<c.length;++p)!c[p].hasAttribute("href")&&c[p].hasAttribute("name")&&c[p].getAttribute("name")==h&&(n=!0)}return n?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},5294(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.style_background_decorative=void 0;var a=i(461),n=i(461),l=i(7139);t.style_background_decorative={id:"style_background_decorative",context:"dom:style, dom:*[style]",refactor:{RPT_Style_BackgroundImage:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"style_background_decorative.html",Potential_1:"style_background_decorative.html",group:"style_background_decorative.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify the CSS background image does not convey important information",group:"Images included by using CSS alone must not convey important information"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,r=n.nodeName.toLowerCase(),o=!0;if("link"===r&&n.hasAttribute("rel")&&"stylesheet"===n.getAttribute("rel").toLowerCase()&&(o=l.CommonUtil.triggerOnce(n,"style_background_decorative",!1)),o&&"style"===r||n.hasAttribute("style")){var s=("style"===r?l.CommonUtil.getInnerText(n):n.getAttribute("style")).match(/background:[^;]*/g);if(null!==s)for(var u=0;o&&u<s.length;++u)o=-1===s[u].indexOf("url(")}return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},3506(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.style_before_after_review=void 0;var a=i(461),n=i(461),l=i(4919);t.style_before_after_review={id:"style_before_after_review",context:"dom:style, dom:link",refactor:{WCAG20_Style_BeforeAfter:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{group:"style_before_after_review.html",Pass_0:"style_before_after_review.html",Potential_1:"style_before_after_review.html"}},messages:{"en-US":{group:"Do not use CSS '::before' and '::after' pseudo-elements to insert non-decorative content",Pass_0:"Rule Passed",Potential_1:"Verify the '::before' and '::after' pseudo-elements do not insert non-decorative content"}},rulesets:[{id:[],num:"1.3.1",level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,r=!0;if("style"===n.nodeName.toLowerCase()){for(var o=l.CSSUtil.getCSSStyle(n),s=0;r&&s<o.length;++s)o[s].selector&&(r=-1===o[s].selector.indexOf(":before")&&-1===o[s].selector.indexOf(":after")||!("content"in o[s].values)||0===o[s].values.content.trim().length||'""'===o[s].values.content.trim()||"''"===o[s].values.content.trim()||"none"===o[s].values.content.trim()||"attr(x)"===o[s].values.content.trim()||"attr(y)"===o[s].values.content.trim());if(r)for(var u=0;u<n.ownerDocument.styleSheets.length;u++)if((_=n.ownerDocument.styleSheets[u]).ownerNode===n)try{var d=_.cssRules?_.cssRules:_.rules;if(d)for(var c=0;r&&c<d.length;c++){var m=d[c],p=void 0;if(m.type&&4===m.type){if(v=m.cssRules)for(var h=0;r&&h<v.length;h++)null!==(w=v[h]).selectorText&&void 0!==w.selectorText&&(-1===(C=w.selectorText.toLowerCase()).indexOf(":before")&&-1===C.indexOf(":after")||(k=w.style.content)&&k.trim().length&&'""'!==k.trim()&&"''"!==k.trim()&&"none"!==k.trim()&&"attr(x)"!==k.trim()&&"attr(y)"!==k.trim()&&(r=!1))}else if(m.type&&3===m.type&&(p=m).styleSheet&&(f=p.styleSheet.cssRules?p.styleSheet.cssRules:p.styleSheet.rules))for(h=0;r&&h<f.length;h++){var g=f[h];if(g.type&&4===g.type){if(v=g.cssRules)for(var b=0;b<v.length;b++)null!==(w=v[b]).selectorText&&void 0!==w.selectorText&&(-1===(C=w.selectorText.toLowerCase()).indexOf(":before")&&-1===C.indexOf(":after")||(k=w.style.content)&&k.trim().length&&'""'!==k.trim()&&"''"!==k.trim()&&"none"!==k.trim()&&"attr(x)"!==k.trim()&&"attr(y)"!==k.trim()&&(r=!1))}else null!==g.selectorText&&void 0!==g.selectorText&&(-1===(C=g.selectorText.toLowerCase()).indexOf(":before")&&-1===C.indexOf(":after")||(k=g.style.content)&&k.trim().length&&'""'!==k.trim()&&"''"!==k.trim()&&"none"!==k.trim()&&"attr(x)"!==k.trim()&&"attr(y)"!==k.trim()&&(r=!1))}}}catch(e){}}if("link"===n.nodeName.toLowerCase()&&n.hasAttribute("rel")&&"stylesheet"===n.getAttribute("rel").toLowerCase()&&n.hasAttribute("href")&&0!==n.getAttribute("href").trim().length)for(u=0;u<n.ownerDocument.styleSheets.length;u++){var _;if((_=n.ownerDocument.styleSheets[u])&&_.ownerNode===n)try{var f;if(f=_.cssRules?_.cssRules:_.rules)for(h=0;r&&h<f.length;h++){var v,A=f[h];if(A.type&&4===A.type){if(v=A.cssRules)for(b=0;r&&b<v.length;b++){var w;if(null!==(w=v[b]).selectorText&&void 0!==w.selectorText){var y=w.selectorText.toLowerCase();-1===y.indexOf(":before")&&-1===y.indexOf(":after")||(k=w.style.content)&&k.trim().length&&'""'!==k.trim()&&"''"!==k.trim()&&"none"!==k.trim()&&"attr(x)"!==k.trim()&&"attr(y)"!==k.trim()&&(r=!1)}}}else if(null!==f[h].selectorText&&void 0!==f[h].selectorText){var C,k;-1===(C=f[h].selectorText.toLowerCase()).indexOf(":before")&&-1===C.indexOf(":after")||(k=f[h].style.content)&&k.trim().length&&'""'!==k.trim()&&"''"!==k.trim()&&"none"!==k.trim()&&"attr(x)"!==k.trim()&&"attr(y)"!==k.trim()&&(r=!1)}}}catch(e){}}return r?(0,a.RulePass)("Pass_0"):r?void 0:(0,a.RulePotential)("Potential_1")}}},7475(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.style_color_misuse=void 0;var a=i(7139),n=i(461),l=i(461),r=i(3864),o=i(4566);t.style_color_misuse={id:"style_color_misuse",context:"dom:style, dom:*[style], dom:font[color], dom:link",refactor:{RPT_Style_ColorSemantics1:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{group:"style_color_misuse.html",Pass_0:"style_color_misuse.html",Potential_1:"style_color_misuse.html"}},messages:{"en-US":{group:"Combine color and descriptive markup to convey information",Pass_0:"Rule Passed",Potential_1:"Verify color is not used as the only visual means of conveying information"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"1.4.1",level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var l=e.dom.node,s=l.nodeName.toLowerCase(),u="";if("style"===s){u=a.CommonUtil.getInnerText(l).toLowerCase();for(var d=0;d<l.ownerDocument.styleSheets.length;d++)if((_=l.ownerDocument.styleSheets[d])&&_.ownerNode===l)try{for(var c=_.cssRules?_.cssRules:_.rules,m=0;m<c.length;m++){var p=c[m],h=void 0;if(p.type&&3===p.type&&(h=p).styleSheet)for(var g=h.styleSheet.cssRules?h.styleSheet.cssRules:h.styleSheet.rules,b=0;b<g.length;b++)u+=g[b].cssText}}catch(e){}}else if(l.hasAttribute("style"))u=l.getAttribute("style").toLowerCase();else if("link"===s&&l.hasAttribute("rel")&&"stylesheet"===l.getAttribute("rel").toLowerCase()&&l.hasAttribute("href")&&0!==l.getAttribute("href").trim().length)for(d=0;d<l.ownerDocument.styleSheets.length;d++){var _;if((_=l.ownerDocument.styleSheets[d])&&_.ownerNode===l)try{var f=_.cssRules?_.cssRules:_.rules;for(b=0;b<f.length;b++)u+=f[b].cssText}catch(e){}}var v=!0,A=u.match(/\bbackground\b/i),w=u.replace(/-color/g,"").match(/\bcolor\b/i);if(l.hasAttribute("color")||w||A){var y={em:"",strong:"",cite:"",dfn:"",code:"",samp:"",kbd:"",var:"",abbr:"",acronym:""};if(!(v=s in y||null!==a.CommonUtil.getAncestor(l,y))&&l.hasChildNodes())for(var C=new r.DOMWalker(l);!v&&C.nextNode()&&C.node!==l;)v=C.node.nodeName.toLowerCase()in y}return v||(v=o.CacheUtil.getCache(l.ownerDocument,"style_color_misuse",!1),o.CacheUtil.setCache(l.ownerDocument,"style_color_misuse",!0)),v?(0,n.RulePass)("Pass_0"):v?void 0:(0,n.RulePotential)("Potential_1")}}},8064(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.style_focus_visible=void 0;var a=i(7139),n=i(461),l=i(461),r=i(4919),o=i(3883);t.style_focus_visible={id:"style_focus_visible",context:"dom:*",refactor:{RPT_Style_HinderFocus1:{Potential_1:"potential_focus_not_visible"}},help:{"en-US":{group:"style_focus_visible.html",potential_focus_not_visible:"style_focus_visible.html",pass_focus_visible:"style_focus_visible.html"}},messages:{"en-US":{group:"The keyboard focus indicator should be visible when default border or outline is modified by CSS",potential_focus_not_visible:"Check the keyboard focus indicator is visible when using CSS declaration for 'border' or 'outline'",pass_focus_visible:"The keyboard focus indicator is visible or is not changed from the browser default"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"2.4.7",level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l={skipNodes:{value:["table"],type:"[string]"},checkParams:{value:["border","border-width","border-style","border-top-width","border-right-width","border-bottom-width","border-left-width","border-top-color","border-right-color","border-bottom-color","border-left-color","border-top-style","border-right-style","border-bottom-style","border-left-style","outline","outline-width","outline-color","outline-style"],type:"[string]"}},s=e.dom.node;if(!a.CommonUtil.isTabbable(s)||l.skipNodes.value.includes(s.nodeName.toLowerCase()))return null;var u=r.CSSUtil.getDefinedStylesMultiple(s,null,["",":focus",":focus-visible",":focus-within"]),d=u[""],c=[];c.push(u[":focus"]),c.push(u[":focus-visible"]),c.push(u[":focus-within"]);var m=c[0];if(Object.keys(m).length>0){if(!((d["outline-width"]||d["outline-style"])&&"0px"!==d["outline-width"]&&"none"!==d["outline-style"]||m["outline-style"]&&"none"===m["outline-style"]))return(0,n.RulePass)("pass_focus_visible");var p=!1,h=0;for(var g in m)if(l.checkParams.value.includes(g)){var b=m[g],_=d[g];if(g.includes("style")){if(p="none"===b,_&&"none"!==b&&b===_)return(0,n.RulePotential)("potential_focus_not_visible")}else if(g.includes("width")){if(h++,"initial"===b?b="2px":"thin"===b?b="1px":"medium"===b?b="2px":"thick"===b&&(b="3px"),_&&("initial"===_?_="2px":"thin"===_?_="1px":"medium"===_?_="2px":"thick"===_&&(_="3px")),b=r.CSSUtil.getPixelsFromStyle(b,s),_=r.CSSUtil.getPixelsFromStyle(_,s),0==b||b<=_)return(0,n.RulePotential)("potential_focus_not_visible")}else if(g.includes("color")){h++;var f=o.ColorUtil.ColorCombo(s);if(null===f)continue;var v=f.bg;if(!v)continue;if("initial"===b&&(b="black"),_&&"initial"===_&&(_="black"),b=o.ColorUtil.Color(b),_=o.ColorUtil.Color(_),null===b||null===_)continue;var A=b.contrastRatio(v),w=_.contrastRatio(v);if(A<3||A<=w)return(0,n.RulePotential)("potential_focus_not_visible")}else if(h++,null!=_&&b===_)return(0,n.RulePotential)("potential_focus_not_visible")}if(p&&0===h)return(0,n.RulePotential)("potential_focus_not_visible")}else for(var y in d)if(l.checkParams.value.includes(y)&&"none"!==(_=d[y]))return(0,n.RulePotential)("potential_focus_not_visible");return(0,n.RulePass)("pass_focus_visible")}}},7942(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.style_highcontrast_visible=void 0;var a=i(461),n=i(461),l=i(4566);t.style_highcontrast_visible={id:"style_highcontrast_visible",context:"dom:style, dom:link, dom:*[style]",refactor:{RPT_Style_Trigger2:{Pass_0:"Pass_0",Manual_1:"Manual_1"}},help:{"en-US":{Pass_0:"style_highcontrast_visible.html",Manual_1:"style_highcontrast_visible.html",group:"style_highcontrast_visible.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Manual_1:"Confirm Windows high contrast mode is supported when using CSS to include, position or alter non-decorative content",group:"Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["1.1.1","1.3.2","1.4.11"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE},{id:["WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1","1.3.2","1.4.11"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,r=n.nodeName.toLowerCase();if("link"===r&&(!n.hasAttribute("rel")||"stylesheet"!==n.getAttribute("rel").toLowerCase()))return(0,a.RulePass)("Pass_0");if("style"!==r&&"link"!==r&&n.hasAttribute("style")&&0===n.getAttribute("style").trim().length)return(0,a.RulePass)("Pass_0");var o=l.CacheUtil.getCache(n.ownerDocument,"style_highcontrast_visible",!1);return l.CacheUtil.setCache(n.ownerDocument,"style_highcontrast_visible",!0),o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RuleManual)("Manual_1")}}},2219(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.style_hover_persistent=void 0;var a=i(461),n=i(461),l=i(7139);t.style_hover_persistent={id:"style_hover_persistent",context:"dom:style, dom:*[style], dom:*",help:{"en-US":{Pass_0:"style_hover_persistent.html",Pass_2:"style_hover_persistent.html",Potential_1:"style_hover_persistent.html",Potential_2:"style_hover_persistent.html",Potential_3:"style_hover_persistent.html",group:"style_hover_persistent.html"}},messages:{"en-US":{Pass_0:"the hover: pseudo-class is not used to display content",Pass_2:"content displayed via the :hover pseudo-class is the adjacent sibling of the trigger element",Potential_1:"Confirm the pointer can be positioned over the displayed element, not just the trigger",Potential_2:"Confirm the pointer can be positioned over all the information displayed on hover",Potential_3:"Confirm the margin style attribute has not prevented the pointer from hovering over the displayed element, not just the trigger",group:"The pointer should be able to move over content displayed on hover"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_2"],num:["1.4.13"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=!1,r=!1,o=!1,s=e.dom.node;if("style"===s.nodeName.toLowerCase()){l.CommonUtil.getInnerText(s).toLowerCase();for(var u=0;u<s.ownerDocument.styleSheets.length;++u){var d=s.ownerDocument.styleSheets[u];if(d&&d.ownerNode===s)try{for(var c=d.cssRules?d.cssRules:d.rules,m=0;m<c.length;m++){var p="",h=!1,g=!1,b="",_=!1,f=!1,v=!1,A=(c[m],c[m].cssText);if(A.match(/:hover/g)){p=A.split(":")[0];var w=A.substring(A.indexOf("+")+1);if(w=w.trim(),(A.match(/:hover \+/g)||A.match(/:hover\+/g))&&(h=!0,b=w.split(" ")[0]),A.match(/:hover \~/g)||A.match(/:hover\~/g)){g=!0;var y=A.substring(A.indexOf("~")+1);b=(y=y.trim()).split(" ")[0]}if(!h&&!g)return(0,a.RulePass)("Pass_0");if(b&&(I=w.indexOf("display:"))&&"none;"!==w.slice(I+8).trim().split(" ")[0]&&d&&d.ownerNode===s)try{for(var C=d.cssRules?d.cssRules:d.rules,k=0;k<C.length;k++){var R=c[k].cssText,x=b+" {",P=R.trim(),T=P.indexOf(x);if(P.slice(T).trim(),P.match(/margin/g)){if(!o)return o=!0,(0,a.RulePotential)("Potential_3")}else{var U=R.split(":")[0];if((U=U.split(" ")[0])===b&&R.match(/:hover/g)){var I;if(_=!0,I=R.indexOf("display:"))if(f=!0,"none;"!==w.slice(I+8).trim().split(" ")[0]){if(v=!0,""!==p&&h){var E=s.ownerDocument.getElementsByTagName(p.toUpperCase());if(b.toUpperCase()===E[0].nextElementSibling.tagName){n=!0;continue}}else if(h){if(!r){r=!0;break}continue}if(""!==p&&g){E=s.ownerDocument.getElementsByTagName(p.toUpperCase());var N=[],L=E[0].nextElementSibling;do{if(L.tagName!==b.toUpperCase())break;N.push(L)}while(L=L.nextElementSibling);var S=N.length;if(1===S)return(0,a.RulePass)("Pass_2");if(S>1)return(0,a.RulePotential)("Potential_2")}}else{if(h){if(k===C.length-1&&!1===v)return(0,a.RulePotential)("Potential_1");continue}if(g){if(k===C.length-1&&!1===v)return(0,a.RulePotential)("Potential_1");continue}}else{if(h){if(k===C.length-1&&!1===f)return(0,a.RulePotential)("Potential_1");continue}if(g){if(k===C.length-1&&!1===f)return(0,a.RulePotential)("Potential_1");continue}}}else{if(h){if(k===C.length-1&&!1===_)return(0,a.RulePotential)("Potential_1");continue}if(g){if(k===C.length-1&&!1===_)return(0,a.RulePotential)("Potential_2");continue}}}}}catch(e){}}}}catch(e){}}}return n?(0,a.RulePass)("Pass_0"):r?(0,a.RulePotential)("Potential_1"):o?(0,a.RulePotential)("Potential_3"):void 0}}},1473(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.style_viewport_resizable=void 0;var a=i(461),n=i(461);t.style_viewport_resizable={id:"style_viewport_resizable",context:"dom:link, dom:style, dom:*[style]",refactor:{WCAG21_Style_Viewport:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{group:"style_viewport_resizable.html",Pass_0:"style_viewport_resizable.html",Potential_1:"style_viewport_resizable.html"}},messages:{"en-US":{group:"Text must scale up to 200% without loss of content or functionality",Pass_0:"Rule Passed",Potential_1:"Verify that text sized using viewport units can be resized up to 200%"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:["1.4.4","1.4.10"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,l=!0,r=/\d+(vw|vh|vmin|vmax)/gi,o=n.nodeName.toLowerCase();if("style"===o){for(var s=0;s<n.ownerDocument.styleSheets.length;s++)if((_=n.ownerDocument.styleSheets[s]).ownerNode===n)try{var u=_.cssRules?_.cssRules:_.rules;if(u)for(var d=0;l&&d<u.length;d++){var c=u[d];if(c.type&&1===c.type){var m=c;if(m.style.fontSize){var p=(v=m.style.fontSize.trim()).match(r);v.length&&p&&(l=!1)}}else if(c.type&&3===c.type&&c.styleSheet){var h=c;if(f=h.styleSheet.cssRules?h.styleSheet.cssRules:h.styleSheet.rules)for(var g=0;l&&g<f.length;g++){var b=f[g];b.type&&1===b.type&&b.style.fontSize&&(p=(v=b.style.fontSize.trim()).match(r),v.length&&p&&(l=!1))}}}}catch(e){}}else if("link"===o)for(s=0;s<n.ownerDocument.styleSheets.length;s++){var _;if((_=n.ownerDocument.styleSheets[s])&&_.ownerNode===n)try{var f;if(f=_.cssRules?_.cssRules:_.rules)for(g=0;l&&g<f.length;g++){var v,A=f[g];if(A.type&&1===A.type&&A.style.fontSize)p=(v=A.style.fontSize.trim()).match(r),v.length&&p&&(l=!1)}}catch(e){}}else{var w=n.getAttribute("style");w&&(p=w.match(/font-size:\s*\d+(vw|vh|vmin|vmax)/gi))&&(l=!1)}return l?(0,a.RulePass)("Pass_0"):(0,a.RulePotential)("Potential_1")}}},1912(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.svg_graphics_labelled=void 0;var a=i(461),n=i(461),l=i(1950),r=i(3946);t.svg_graphics_labelled={id:"svg_graphics_labelled",context:"dom:svg",help:{"en-US":{group:"svg_graphics_labelled.html",pass:"svg_graphics_labelled.html",fail_acc_name:"svg_graphics_labelled.html"}},messages:{"en-US":{group:"A non-decorative SVG element must have an accessible name",pass:"The SVG element has an accessible name",fail_acc_name:"The SVG element has no accessible name"}},rulesets:[{id:["IBM_Accessibility","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[{"7d6734":{pass:"pass",fail_acc_name:"fail"}}],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n)||r.VisUtil.isNodePresentational(n)||l.AccNameUtil.isAccessibleNameIgnorable(n))return null;var o=l.AccNameUtil.computeAccessibleName(n);return o&&o.name&&o.name.trim().length>0?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_acc_name")}}},6539(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_aria_descendants=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139);t.table_aria_descendants={id:"table_aria_descendants",context:"aria:table dom:tr[role], aria:table dom:th[role], aria:table dom:td[role], aria:grid dom:tr[role], aria:grid dom:th[role], aria:grid dom:td[role], aria:treegrid dom:tr[role], aria:treegrid dom:th[role], aria:treegrid dom:td[role]",help:{"en-US":{group:"table_aria_descendants.html",explicit_role:"table_aria_descendants.html"}},messages:{"en-US":{group:"Table structure elements cannot specify an explicit 'role' within table containers",explicit_role:"An explicit ARIA 'role' is not valid for <{0}> element within an ARIA role '{1}' per the ARIA in HTML specification"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,o=r.CommonUtil.isTableDescendant(i);if(null!==o&&0!==o.length){var s=l.AriaUtil.getImplicitRole(n),u=l.AriaUtil.getRoles(n,!1);if(!(s&&s.length>0&&u&&u.length>0&&u.some(function(e){return s.includes(e)})))return(0,a.RuleFail)("explicit_role",[e.dom.node.nodeName.toLowerCase(),o[0].role])}}}},4(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_caption_empty=void 0;var a=i(461),n=i(461),l=i(7139);t.table_caption_empty={id:"table_caption_empty",context:"dom:caption",refactor:{Valerie_Caption_HasContent:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"table_caption_empty.html",Fail_1:"table_caption_empty.html",group:"table_caption_empty.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The <table> element has an empty <caption> element",group:"A <caption> element for a <table> element must contain descriptive text"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;return l.CommonUtil.hasInnerContentHidden(n)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},5334(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_caption_nested=void 0;var a=i(461),n=i(461),l=i(7139);t.table_caption_nested={id:"table_caption_nested",context:"dom:caption",refactor:{Valerie_Caption_InTable:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"table_caption_nested.html",Fail_1:"table_caption_nested.html",group:"table_caption_nested.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"<caption> element is not nested inside a <table> element",group:"The <caption> element must be nested inside the associated <table> element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;return null!=l.CommonUtil.getAncestor(n,"table")?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},2173(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_headers_exists=void 0;var a=i(461),n=i(461),l=i(9196);t.table_headers_exists={id:"table_headers_exists",context:"dom:table",refactor:{RPT_Table_DataHeadingsAria:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"table_headers_exists.html",Fail_1:"table_headers_exists.html",group:"table_headers_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Table has no headers identified",group:"Data table must identify headers"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,r=n.rows;if(!l.TableUtil.isDataTable(n)||null===r||0===r.length)return null;var o=l.TableUtil.tableHeaderExists(n);return null!==o?o?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1"):void 0}}},8349(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_headers_ref_valid=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(1686),s=i(3946),u=i(9955);t.table_headers_ref_valid={id:"table_headers_ref_valid",context:"dom:td[headers], dom:th[headers]",help:{"en-US":{Pass_0:"table_headers_ref_valid.html",Fail_1:"table_headers_ref_valid.html",Fail_2:"table_headers_ref_valid.html",Fail_3:"table_headers_ref_valid.html",Fail_4:"table_headers_ref_valid.html",group:"table_headers_ref_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The 'headers' attribute value \"{0}\" does not reference a valid 'id' in this document",Fail_2:"The 'headers' attribute value \"{0}\" refers to itself",Fail_3:"The 'headers' attribute value \"{0}\" does not refer to a cell in the same table",Fail_4:'The \'headers\' attribute value "{0}" does not refer to a cell indicated with <th> or a role of "columnheader" or "rowheader"',group:"The 'headers' attribute should refer to a valid cell in the same table"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:["a25f45"],run:function(e,t,i){var n=e.dom.node,d=r.CommonUtil.getAncestor(n,"table"),c=u.ARIAMapper.nodeToRole(d);if(null==d||!s.VisUtil.isNodeVisible(d)||!["table","grid"].includes(c))return null;n.nodeName.toLowerCase();var m=n.ownerDocument,p=n.getAttribute("headers");if(!p)return null;for(var h=p.split(" "),g=[],b=[],_=[],f=[],v=0;v<h.length;v++){var A=h[v];if(""!==A.trim()){var w=m.getElementById(A);if(w)if(o.DOMUtil.sameNode(w,n))b.push(A);else if(o.DOMUtil.isInSameTable(w,n)){if("th"!==w.nodeName.toLowerCase()){var y=l.AriaUtil.getRoles(w,!0);y.includes("columnheader")||y.includes("rowheader")||f.push(A)}}else _.push(A);else g.push(A)}}var C=[];return 0!=g.length&&C.push((0,a.RuleFail)("Fail_1",[g.toString()])),0!=b.length&&C.push((0,a.RuleFail)("Fail_2",[b.toString()])),0!=_.length&&C.push((0,a.RuleFail)("Fail_3",[_.toString()])),0!=f.length&&C.push((0,a.RuleFail)("Fail_4",[f.toString()])),0==C.length?(0,a.RulePass)("Pass_0"):C}}},8142(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_headers_related=void 0;var a=i(461),n=i(461),l=i(7139),r=i(4566),o=i(9196);t.table_headers_related={id:"table_headers_related",context:"dom:td, dom:th",refactor:{Valerie_Table_DataCellRelationships:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"table_headers_related.html",Fail_1:"table_headers_related.html",group:"table_headers_related.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Complex table does not have headers for each cell properly defined with 'header' or 'scope'",group:"For a complex data table, all <th> and <td> elements must be related via 'header' or 'scope' attributes"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node,s=l.CommonUtil.getAncestor(n,"table");if(null==s||!o.TableUtil.isComplexDataTable(s))return null;if(null===r.CacheUtil.getCache(n,"table_headers_related",null)){for(var u=[],d=0;d<s.rows.length;++d){var c=s.rows[d];u[d]||(u[d]=[]);for(var m=0;m<c.cells.length;++m){var p=c.cells[m];r.CacheUtil.setCache(p,"table_headers_related",d+":"+m);var h=parseInt(p.getAttribute("colspan"));h||(h=1);var g=parseInt(p.getAttribute("rowspan"));g||(g=1);for(var b=0;u[d][b];)b+=1;for(var _=0;_<g;++_){u[d+_]||(u[d+_]=[]);for(var f=0;f<h;++f)u[d+_][b+f]=p}}}var v=n.ownerDocument,A={},w={};for(d=0;d<u.length;++d){var y=!1;for(m=0;m<u[d].length;++m){var C=u[d][m],k=C.nodeName.toLowerCase();if("th"==k){if("row"==C.getAttribute("scope")?(y=!0,l.CommonUtil.attributeNonEmpty(C,"axis")||(A[r.CacheUtil.getCache(C,"table_headers_related",null)]=!0)):"col"==C.getAttribute("scope")&&(w[m]=!0,l.CommonUtil.attributeNonEmpty(C,"axis")||(A[r.CacheUtil.getCache(C,"table_headers_related",null)]=!0)),l.CommonUtil.attributeNonEmpty(C,"headers")){var R=C.getAttribute("headers").split(" ");for(_=0;_<R.length;++_)(x=v.getElementById(R[_].trim()))&&l.CommonUtil.getAncestor(x,"table")==s&&(A[r.CacheUtil.getCache(x,"table_headers_related",null)]=!0)}}else if("td"==k)if(y||w[m])A[r.CacheUtil.getCache(C,"table_headers_related",null)]=!0;else if(l.CommonUtil.attributeNonEmpty(C,"headers"))for(R=C.getAttribute("headers").split(" "),_=0;_<R.length;++_){var x;(x=v.getElementById(R[_].trim()))&&l.CommonUtil.getAncestor(x,"table")==s&&(A[r.CacheUtil.getCache(C,"table_headers_related",null)]=!0,A[r.CacheUtil.getCache(x,"table_headers_related",null)]=!0)}}}r.CacheUtil.setCache(s,"table_headers_related",A)}var P=r.CacheUtil.getCache(n,"table_headers_related",null),T=r.CacheUtil.getCache(s,"table_headers_related",null),U=P&&T&&P in T;return U||"0:0"!==P||0!=l.CommonUtil.getInnerText(n).trim().length?(U||0!=s.getElementsByTagName("th").length||(!0===r.CacheUtil.getCache(s,"table_headers_related_TrigOnce",!1)?U=!0:r.CacheUtil.setCache(s,"table_headers_related_TrigOnce",!0)),U?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")):null}}},3980(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_layout_linearized=void 0;var a=i(461),n=i(461),l=i(3946),r=i(9196);t.table_layout_linearized={id:"table_layout_linearized",context:"dom:table",refactor:{RPT_Table_LayoutTrigger:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"table_layout_linearized.html",Potential_1:"table_layout_linearized.html",group:"table_layout_linearized.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify table is not being used to format text content in columns unless the table can be linearized",group:"Avoid using tables to format text documents in columns unless the table can be linearized"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_FOUR}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var o=!r.TableUtil.isLayoutTable(n);return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},4701(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_scope_valid=void 0;var a=i(461),n=i(461);t.table_scope_valid={id:"table_scope_valid",context:"dom:td[scope], dom:th[scope]",refactor:{WCAG20_Table_Scope_Valid:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_0:"table_scope_valid.html",Fail_1:"table_scope_valid.html",Fail_2:"table_scope_valid.html",group:"table_scope_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Value provided is invalid for the 'scope' attribute",Fail_2:"The 'scope' attribute should only be used on a <th> element",group:'Value for \'scope\' attribute must be "row", "col", "rowgroup", or "colgroup"'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node;if("td"===n.nodeName.toLowerCase())return(0,a.RuleFail)("Fail_2");var l=n.getAttribute("scope").trim().toLowerCase();return/^(row|col|rowgroup|colgroup)$/.test(l)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},18(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_structure_misuse=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(3946),s=i(9196);t.table_structure_misuse={id:"table_structure_misuse",context:"dom:table",refactor:{WCAG20_Table_Structure:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"table_structure_misuse.html",Fail_1:"table_structure_misuse.html",group:"table_structure_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'The <{0}> element with "presentation" role or "none" role has structural element(s) and/or attribute(s) \'{1}\'',group:'Table elements with \'role="presentation" or \'role="none" should not have structural elements or attributes'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node;if(o.VisUtil.isNodeHiddenFromAT(n))return null;if(s.TableUtil.isDataTable(n))return null;if(l.AriaUtil.isNodeInGrid(n))return null;var u=[];r.CommonUtil.attributeNonEmpty(n,"summary")&&u.push(n);for(var d=n.getElementsByTagName("caption"),c=0;c<d.length;++c)if(r.CommonUtil.getAncestor(d[c],"table")==n){if(r.CommonUtil.shouldNodeBeSkippedHidden(d[c]))continue;u.push(d[c]);break}var m=n.getElementsByTagName("th");for(c=0;c<m.length;++c)if(r.CommonUtil.getAncestor(m[c],"table")==n){if(r.CommonUtil.shouldNodeBeSkippedHidden(m[c]))continue;u.push(m[c]);break}var p=n.getElementsByTagName("td");for(c=0;c<p.length;++c)if((p[c].hasAttribute("scope")||p[c].hasAttribute("headers"))&&r.CommonUtil.getAncestor(p[c],"table")==n){if(r.CommonUtil.shouldNodeBeSkippedHidden(p[c]))continue;u.push(p[c]);break}var h=n.nodeName.toLowerCase(),g=new Array,b={};for(c=0;c<u.length;c++){var _=u[c].nodeName.toLowerCase();b.hasOwnProperty(_)||("table"!=_||b.hasOwnProperty.summary?(b[_]=!0,g.push(_)):(b.summary=!0,g.push("summary")))}var f=g.join(", ");return 0==u.length?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[h,f])}}},9314(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_summary_redundant=void 0;var a=i(461),n=i(461),l=i(7139),r=i(5279),o=i(1686);t.table_summary_redundant={id:"table_summary_redundant",context:"dom:table",refactor:{WCAG20_Table_CapSummRedundant:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"table_summary_redundant.html",Fail_1:"table_summary_redundant.html",group:"table_summary_redundant.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The table summary duplicates the caption",group:"The table summary must not duplicate the caption"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n,s=e.dom.node;if(s.hasAttribute("summary"))n=s.getAttribute("summary").trim().toLowerCase();else if(s.hasAttribute("aria-describedby")){for(var u=s.getAttribute("aria-describedby").split(" "),d="",c=0;c<u.length;c++){var m=u[c];if(m){var p=r.FragmentUtil.getById(s,m);p&&!o.DOMUtil.sameNode(p,s)&&(d+=" "+l.CommonUtil.getInnerText(p).trim().toLowerCase())}}n=d}if(!n)return null;var h=s.getElementsByTagName("caption");if(0===h.length)return null;if(n.length>0){var g=l.CommonUtil.getInnerText(h[0]).trim().toLowerCase();return n.includes(g)?(0,a.RuleFail)("Fail_1"):(0,a.RulePass)("Pass_0")}}}},1667(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.target_spacing_sufficient=void 0;var a=i(7139),n=i(461),l=i(461),r=i(7507),o=i(4919),s=i(4566);t.target_spacing_sufficient={id:"target_spacing_sufficient",context:"dom:*",dependencies:[],help:{"en-US":{group:"target_spacing_sufficient.html",pass_spacing:"target_spacing_sufficient.html",pass_sized:"target_spacing_sufficient.html",pass_inline:"target_spacing_sufficient.html",pass_default:"target_spacing_sufficient.html",violation_spacing:"target_spacing_sufficient.html",recommendation_inline:"target_spacing_sufficient.html",potential_overlap:"target_spacing_sufficient.html"}},messages:{"en-US":{group:"The target must be sufficiently sized or spaced from other targets",pass_spacing:"The target's spacing from other targets is sufficient",pass_sized:"The target’s size is more than 24 CSS pixels",pass_inline:"The target is in a sentence or its size is otherwise constrained by the line-height of non-target text",pass_default:"The target's size is determined by the user agent and is not modified by the author",violation_spacing:'Undersized target "{0}" does not have sufficient spacing of 12 CSS pixels from another target "{1}"',recommendation_inline:'Confirm the inline target "{0}" is sufficiently spaced from another inline target "{1}"',potential_overlap:'Ensure the overlapped target "{0}" meets a minimum target size or has sufficient spacing from the overlapping target "{1}"'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_2"],num:["2.5.8"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE,reasonCodes:["pass_spacing","pass_sized","pass_inline","pass_default","violation_spacing","potential_overlap"]},{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_2"],num:["2.5.8"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE,reasonCodes:["recommendation_inline"]}],act:[],run:function(e,t,i){var l=e.dom.node,u=l.nodeName.toLocaleLowerCase(),d=new r.DOMMapper,c=d.getUnadjustedBounds(l);if(!c)return null;if(!a.CommonUtil.isTarget(l))return null;if(c.height>=24&&c.width>=24)return(0,n.RulePass)("pass_sized");var m=o.CSSUtil.getInlineStatus(l);if(null===m)return null;if(m.inline)return m.text?null===m.violation?(0,n.RulePass)("pass_inline"):(0,n.RulePotential)("recommendation_inline",[u,m.violation]):null===m.violation?(0,n.RulePass)("pass_default"):(0,n.RulePotential)("recommendation_inline",[u,m.violation]);if(o.CSSUtil.isTargetBrowserDefault(l))return(0,n.RulePass)("pass_default");var p=l.ownerDocument;if(!p)return null;var h=getComputedStyle(l);if(null===h)return null;var g=h.zIndex;g&&!isNaN(Number(g))||(g="0");var b=s.CacheUtil.getCache(p.documentElement,"target_spacing_sufficient::targets",void 0);if(void 0===b){b=[];for(var _=p.querySelectorAll("body *:not(script):not(style)"),f=0;f<_.length;f++){var v=_[f];a.CommonUtil.isTarget(v)&&b.push(v)}s.CacheUtil.setCache(p.documentElement,"target_spacing_sufficient::targets",b)}if(b&&0!==b.length){var A=!0,w=24,y=24,C=null,k=null,R=[],x=function(e){var t=b[e],i=l.compareDocumentPosition(t);if(0===i||i&Node.DOCUMENT_POSITION_CONTAINED_BY)return A=!1,"continue";if(i&Node.DOCUMENT_POSITION_CONTAINS||R.some(function(e){return e.contains(t)}))return"continue";var a=d.getUnadjustedBounds(t);if(!a)return"continue";var r=getComputedStyle(t),o="0";if(r&&((o=r.zIndex)&&!isNaN(Number(o))||(o="0")),a.top<=c.top&&a.left<=c.left&&a.top+a.height>=c.top+c.height&&a.left+a.width>=c.left+c.width)return(A?parseInt(g)<parseInt(o):parseInt(g)<=parseInt(o))?{value:null}:{value:(0,n.RulePotential)("potential_overlap",[u,t.nodeName.toLowerCase()])};if(c.top<=a.top&&c.left<=a.left&&c.top+c.height>=a.top+a.height&&c.left+c.width>=a.left+a.width)return(A?parseInt(g)<parseInt(o):parseInt(g)<=parseInt(o))?{value:(0,n.RulePotential)("potential_overlap",[u,t.nodeName.toLowerCase()])}:{value:(0,n.RuleFail)("violation_spacing",[u,t.nodeName.toLowerCase()])};if((c.top>=a.top&&c.top<=a.top+a.height||c.top+c.height<=a.top&&c.top+c.height>=a.top+a.height)&&(c.left>a.left&&c.left<a.left+a.width||a.left>c.left&&a.left<c.left+c.width)||(c.top>a.top&&c.top<a.top+a.height||a.top>c.top&&a.top<c.top+c.height)&&(c.left>=a.left&&c.left<=a.left+a.width||c.left+c.width>=a.left&&c.left+c.width<=a.left+a.width))return{value:(0,n.RulePotential)("potential_overlap",[u,t.nodeName.toLowerCase()])};var s=24,m=24;c.width<24&&(c.top>=a.top&&c.top<=a.top+a.height||c.top<=a.top&&c.top+c.height>a.top)&&(s=Math.min(Math.abs(c.left-a.left),Math.abs(c.left-(a.left+a.width)),Math.abs(c.left+c.width-(a.left+a.width)),Math.abs(c.left+c.width-a.left))),c.height<24&&(c.left>=a.left&&c.left<=a.left+a.width||c.left<=a.left&&c.left+c.width>a.left)&&(m=Math.min(Math.abs(c.top-a.top),Math.abs(c.top-(a.top+a.height)),Math.abs(c.top+c.height-(a.top+a.height)),Math.abs(c.top+c.height-a.top))),s<w&&(w=s,C=t),m<y&&(y=m,k=t),R.push(t)};for(f=0;f<b.length;f++){var P=x(f);if("object"==typeof P)return P.value}return Math.round(c.width/2)+w<12||Math.round(c.height/2)+y<12?Math.round(c.width/2)+w<Math.round(c.height/2)+y?(0,n.RuleFail)("violation_spacing",[u,C.nodeName.toLowerCase()]):(0,n.RuleFail)("violation_spacing",[u,k.nodeName.toLowerCase()]):(0,n.RulePass)("pass_spacing")}}}},9599(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.text_block_heading=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(3864),s=i(4919),u=i(3946);t.text_block_heading={id:"text_block_heading",context:"dom:p, dom:div, dom:br",refactor:{RPT_Block_ShouldBeHeading:{Potential_1:"potential_heading"}},help:{"en-US":{potential_heading:"text_block_heading.html",group:"text_block_heading.html"}},messages:{"en-US":{potential_heading:"Confirm this text '{0}' is used as a heading and if so, modify to use a heading element or role",group:"Heading text should use a heading element or role"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.CommonUtil.isNodeDisabled(n)||!u.VisUtil.isNodeVisible(n))return null;if(null===r.CommonUtil.getAncestor(n,["body"])||null!==r.CommonUtil.getAncestor(n,["script"]))return null;var d=0,c=n.ownerDocument.getElementsByTagName("body");if(null!=c){var m=getComputedStyle(c[0]);m&&(d=s.CSSUtil.getPixelsFromStyle(m["font-size"],c))}var p=0,h=[],g=new o.DOMWalker(n);g.nextNode();for(var b=!1;!b&&g.nextNode()&&g.node!==n&&g.node!==o.DOMWalker.parentNode(n)&&!["br","div","p"].includes(g.node.nodeName.toLowerCase());)if(g.node!==n&&!r.CommonUtil.shouldNodeBeSkippedHidden(g.node)){var _=g.node.nodeName.toLowerCase();if(3===g.node.nodeType){if(g.node.nodeValue.trim().length>0&&g.node.parentElement){var f=getComputedStyle(g.node.parentElement);if(f&&("bold"===f["font-weight"]||f["font-weight"]>=700||f["font-size"]&&f["font-size"].includes("large")||f["font-size"]&&0!==d&&s.CSSUtil.getPixelsFromStyle(f["font-size"],g.node.parentElement)>d)){var v=g.node.nodeValue.trim();(A=r.CommonUtil.wordCount(v))>0&&(h.push(v),p+=A),b=p>10,g.bEndTag=!0}else b=!0}}else if(1===g.node.nodeType)if("b"===_||"strong"===_||"u"===_||"font"===_){var A;v=r.CommonUtil.getInnerText(g.node),(A=r.CommonUtil.wordCount(v))>0&&(h.push(v),p+=A),b=p>10,g.bEndTag=!0}else{var w=l.AriaUtil.getResolvedRole(g.node);b=null!==w&&"generic"!==w&&"paragraph"!==w&&"strong"!==w||"applet"===_}}return 0==p&&(b=!0),b||(b=/[:,;\-\.]$/.test(h.join(" ").trim())),b?null:(0,a.RulePotential)("potential_heading",[h.join(" ")])}}},4672(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.text_contrast_sufficient=void 0;var a=i(7139),n=i(3946),l=i(3883),r=i(461),o=i(461),s=i(4919);t.text_contrast_sufficient={id:"text_contrast_sufficient",context:"dom:*",refactor:{IBMA_Color_Contrast_WCAG2AA:{Pass_0:"pass",Fail_1:"fail_contrast",Potential_1:"potential_same_color"},IBMA_Color_Contrast_WCAG2AA_PV:{pass_0:"pass",potential_1:"potential_graphic_background"}},help:{"en-US":{group:"text_contrast_sufficient.html",pass:"text_contrast_sufficient.html",fail_contrast:"text_contrast_sufficient.html",potential_same_color:"text_contrast_sufficient.html",potential_graphic_background:"text_contrast_sufficient.html",potential_text_shadow:"text_contrast_sufficient.html"}},messages:{"en-US":{group:"The contrast ratio of text with its background must meet WCAG AA requirements",pass:"The contrast ratio of text with its background meets WCAG AA requirements",fail_contrast:"Text contrast of {0} with its background is less than the WCAG AA minimum requirements for text of size {1}px and weight of {2}",potential_same_color:"The foreground text and its background color are both detected as {3}. Verify the text meets the WCAG AA requirements for minimum contrast",potential_graphic_background:"Verify the contrast ratio of the text against the lightest and the darkest colors of the background meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}",potential_text_shadow:"Verify the contrast ratio of the text with shadow meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"1.4.3",level:o.eRulePolicy.VIOLATION,toolkitLevel:o.eToolkitLevel.LEVEL_ONE}],act:["afw4f7"],run:function(e,t,i){var o=e.dom.node,u=o.nodeName.toLowerCase();if(!n.VisUtil.isNodeVisible(o)||null!=n.VisUtil.hiddenByDefaultElements&&null!=n.VisUtil.hiddenByDefaultElements&&n.VisUtil.hiddenByDefaultElements.indexOf(u)>-1)return null;if(a.CommonUtil.isNodeDisabled(o))return null;if(a.CommonUtil.getAncestor(o,["svg","script","meta","style"]))return null;var d=o.ownerDocument;if(!d)return null;var c=d.defaultView;if(!c)return null;var m=a.CommonUtil.getNodeText(o);if(!a.CommonUtil.isShadowHostElement(o)||a.CommonUtil.isShadowHostElement(o)&&""===a.CommonUtil.getNodeText(o.shadowRoot)){if(0==m.trim().length)return null;if(0===(m=m.trim().replace(/[^(a-zA-Z\d\s)\^(\u4e00-\u9fff\u3400-\u4dbf)\u0000-\u0008\u000B-\u001F\u007F-\u009F\u2000-\u200F\u2028-\u202F\u205F-\u206F\u3000\uFEFF]+/g,"")).trim().length)return null}var p=o;if(a.CommonUtil.isShadowHostElement(o)){if(o.shadowRoot)for(var h=o.firstChild;h;h=h.nextSibling)if(3==h.nodeType){p=h.assignedSlot;break}if(null===p)return}var g=c.getComputedStyle(p);if(!1==("0"!==g.width&&"0"!==g.height&&"0"!==g.opacity&&"none"!==g.display&&"hidden"!==g.visibility&&"hidden"!==g.overflow&&("auto"===g.left||"absolute"===g.position&&parseInt(g.left.replace(/[^0-9.+-]/,""))>0)&&("auto"===g.left||"absolute"===g.position&&parseInt(g.top.replace(/[^0-9.+-]/,""))>0)))return null;var b=-1;if("auto"!==g.clip){var _=g.clip.toString();if(_.includes("rect"))for(var f=[],v=/\((.*)\)/g.exec(_)[1].split(", "),A=0;A<v.length;A++)f.push(v[A]);b=parseInt(f[0].replace(/px/g,""))-parseInt(f[2].replace(/px/g,"")),b=Math.abs(b)}if("absolute"===g.position&&b<7&&-1!==b)return null;var w=l.ColorUtil.ColorCombo(p);if(null!==w){var y=w.fg,C=w.bg,k=y.contrastRatio(C),R=s.CSSUtil.getWeightNumber(g.fontWeight),x=s.CSSUtil.getFontInPixels(g.fontSize,p),P=x>=24||x>=18.6&&R>=700;s.CSSUtil.containsCKJ(m)&&(P=x>=29.3||x>=24&&R>=700);var T=k>=4.5||k>=3&&P,U=w.hasBGImage||w.hasGradient,I=w.textShadow,E=a.CommonUtil.isNodeDisabled(p);if(!E){var N=a.CommonUtil.getControlOfLabel(p);N&&(E=a.CommonUtil.isNodeDisabled(N))}return!E&&"label"===u&&a.CommonUtil.isDisabledByFirstChildFormElement(p)&&(E=!0),!E&&o.hasAttribute("id")&&a.CommonUtil.isDisabledByReferringElement(p)&&(E=!0),!T&&E&&(T=!0),T?(0,r.RulePass)("pass",[k.toFixed(2),x,R,y.toHex(),C.toHex(),w.hasBGImage,w.hasGradient]):U?(0,r.RulePotential)("potential_graphic_background",[k.toFixed(2),x,R]):I?(0,r.RulePotential)("potential_text_shadow",[k.toFixed(2),x,R]):y.toHex()===C.toHex()?(0,r.RulePotential)("potential_same_color",[k.toFixed(2),x,R,y.toHex(),C.toHex(),w.hasBGImage,w.hasGradient]):(0,r.RuleFail)("fail_contrast",[k.toFixed(2),x,R,y.toHex(),C.toHex(),w.hasBGImage,w.hasGradient])}console.log("unable to get color combo for element: "+p.nodeName)}}},4353(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.text_quoted_correctly=void 0;var a=i(461),n=i(461),l=i(7139),r=i(3946);t.text_quoted_correctly={id:"text_quoted_correctly",context:"dom:*",help:{"en-US":{Pass_0:"text_quoted_correctly.html",Potential_1:"text_quoted_correctly.html",group:"text_quoted_correctly.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"If the following text is a quotation, mark it as a <q> or <blockquote> element: {0}",group:"Quotations should be marked with <q> or <blockquote> elements"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(!r.VisUtil.isNodeVisible(n))return null;if(null===l.CommonUtil.getAncestor(n,["body"]))return null;for(var o=!0,s=n.firstChild,u=null,d=["blockquote","q","script","style","pre","code","ruby","samp"];o&&s;){if("#text"===s.nodeName){var c=s.nodeValue,m=(c=c.replace(/(\S)'(\S)/g,"$1$2")).match(/("[^"]+")/g),p=c.match(/('[^']+')/g);if((null!==m||null!==p)&&null===l.CommonUtil.getAncestor(s,d)){if(null!=m)for(var h=0;o&&h<m.length;++h)o=l.CommonUtil.wordCount(m[h])<3;if(null!=p)for(h=0;o&&h<p.length;++h)o=l.CommonUtil.wordCount(p[h])<3;u=null===m?p.join(", ").replace(new RegExp("\\r?\\n|\\r","g"),""):null===p?m.join(", ").replace(new RegExp("\\r?\\n|\\r","g"),""):m.concat(p).join(", ").replace(new RegExp("\\r?\\n|\\r","g"),"")}}s=s.nextSibling}return!o&&u.length&&u.length>69&&(u=u.substring(0,32)+" ... "+u.substring(u.length-32)),o?(0,a.RulePass)("Pass_0"):(0,a.RulePotential)("Potential_1",[u])}}},7147(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.text_sensory_misuse=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(4566),s=i(3946);t.text_sensory_misuse={id:"text_sensory_misuse",context:"dom:body, dom:body dom:*",refactor:{RPT_Text_SensoryReference:{Potential_1:"potential_position, potential_other"}},help:{"en-US":{potential_position:"text_sensory_misuse.html",potential_other:"text_sensory_misuse.html",group:"text_sensory_misuse.html"}},messages:{"en-US":{potential_position:"Confirm the word(s) '{0}' of the user instruction is used to indicate a logical rather than visual position",potential_other:"Confirm the user instruction is still understandable without the word(s) '{0}'",group:"Instructions should be meaningful without relying solely on shape, size, or location words"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.3"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node,c=n.nodeName.toLowerCase();if(!s.VisUtil.isNodeVisible(n)||r.CommonUtil.isNodeDisabled(n)||s.VisUtil.hiddenByDefaultElements.includes(c))return null;if(null===r.CommonUtil.getAncestor(n,["body"]))return null;if(null!==r.CommonUtil.getAncestor(n,["script","a","label"]))return null;var m=l.AriaUtil.getResolvedRole(n);if(m){var p=l.AriaUtil.getRolesWithTypes(n,["landmark"]);if(p&&p.includes(m))return null}var h=l.AriaUtil.getRolesWithTypes(n,["widget","heading"]);if(r.CommonUtil.concatUniqueArrayItemList(["caption","cell","code","columnheader","definition","figure","list","listitem","math","meter","row","rowgroup","rowheader","term"],h),null!==l.AriaUtil.getAncestorWithRoles(n,h))return null;for(var g="",b="",_=n.firstChild,f="";_;){if("#text"===_.nodeName){var v=_.nodeValue.trim();v.length>0&&(f+=f.length>0?", "+v:v)}_=_.nextSibling}if(f.length>0){var A=function(e,t){if(!u[t])return"";var i=o.CacheUtil.getCache(e,t+"_sensory_misuse",null);if(null==i){for(var a=u[t].value,n="(ss+|"+a[0],l=1;l<a.length;++l){var r=a[l].trim().split(" ");if(n+="|"+r[0],r.length>1)for(var s=1;s<r.length;++s)n+=" +"+r[s]}n+=")",i=new RegExp(n,"gi"),o.CacheUtil.setCache(e,t+"_sensory_misuse",i)}return i}(n.ownerDocument,"exemptText");f=f.replace(A," "),g=d(n.ownerDocument,"positionText",f),b=d(n.ownerDocument,"otherText",f)}var w=[];return g&&w.push((0,a.RulePotential)("potential_position",[g])),b&&w.push((0,a.RulePotential)("potential_other",[b])),0==w.length?null:w}};var u={positionText:{value:["top-left","top-right","bottom-right","bottom-left","top-to-bottom","left-to-right","bottom-to-top","right-to-left","right","left","above","below","top","bottom","upper","lower","corner","beside"],type:"[string]"},otherText:{value:["round","square","shape","rectangle","triangle","size","large","small","medium","big","huge","tiny","extra","larger","smaller","bigger","little","largest","smallest","biggest"],type:"[string]"},exemptText:{value:["right-click","left-click","right-clicking","right-clicks","left-clicking","left-clicks","square root","right now","off the top"],type:"[string]"}};function d(e,t,i){if(!i)return"";var a=u[t].value,n={},l=[];return i.split(/\s+/).reduce(function(e,t){for(var i=t.replace(/[.?!:;()'",`\]]+$/,""),r=t.toLowerCase().replace(/[.?!:;()'",`\]]/g,""),o=0;o<a.length;o++){var s=r.indexOf(a[o]),u=a[o].length,d=r.charAt(u+s);if(!(s<0)){var c="."==d||"?"==d||"!"==d||":"==d||";"==d||"("==d||")"==d||"'"==d||'"'==d||","==d||".`"==d||"\\"==d||"]"==d,m=!1;if(s>0){var p=r.charAt(s-1);m="-"==p||"."==p||"?"==p||"!"==p||":"==p||";"==p||"("==p||")"==p||"'"==p||'"'==p||","==p||".`"==p||"\\"==p||"]"==p}r.length!=u&&1!=c&&1!=m||(n.hasOwnProperty(i)||(n[i]=!0,l.push(i)),o=a.length)}}return e[i]=(e[i]||0)+1,e},Object.create(null)),l.join(", ")}},1419(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.text_spacing_valid=void 0;var a=i(461),n=i(7139),l=i(3946),r=i(4919),o=i(7507),s=/(-?[\d.]+)([a-z%]*)/;function u(e,t,i){var a;if(i.startsWith("inherit")||i.startsWith("unset")){var n=r.CSSUtil.getAncestorWithStyles(e.parentElement,((a={})[t]=["*"],a),["inherit","unset"]);if(null!==n)return r.CSSUtil.getDefinedStyles(n,[t])[t];if(i.startsWith("unset"))return"initial"}return i}function d(e,t,i,a,n,l){if(void 0===l&&(l=!1),"important"!==e.style.getPropertyPriority(t))return!0;var o=function(e){return e.substring(0,e.length-11)}(i);if("initial"===o||"normal"===o)return!1;var u=parseFloat(o);if(isNaN(u))return!0;var d=o.trim().match(s);if(!d)return!0;var c=d[1],m=d[2];if(""===m){if(l)return!(parseFloat(c)<n);if(0===parseFloat(c))return null}if(""===m&&0!==parseFloat(c))return null;var p=r.CSSUtil.convertValue2Pixels(m,c,e);return!(null!==p&&p/a<n)}t.text_spacing_valid={id:"text_spacing_valid",context:"dom:*",help:{"en-US":{pass:"text_spacing_valid.html",group:"text_spacing_valid.html",fail_letter_spacing_style:"text_spacing_valid.html",fail_word_spacing_style:"text_spacing_valid.html",fail_line_height_style:"text_spacing_valid.html"}},messages:{"en-US":{pass:"CSS !important is not used in inline style to control letter or word spacing or line height",group:"CSS !important should not be used in inline style to control letter or word spacing or line height",fail_letter_spacing_style:"CSS !important should not be used in inline ‘letter-spacing’ style",fail_word_spacing_style:"CSS !important should not be used in inline ‘word-spacing’ style",fail_line_height_style:"CSS !important should not be used in inline ‘line-height’ style"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.4.12"],level:a.eRulePolicy.VIOLATION,toolkitLevel:a.eToolkitLevel.LEVEL_THREE}],act:["9e45ec","24afc2","78fd32"],run:function(e,t,i){for(var c=e.dom.node,m="",p=c.childNodes,h=0;h<p.length;++h)3===p[h].nodeType&&(m+=p[h].nodeValue);if(0===m.trim().length)return null;if(l.VisUtil.isNodeHiddenFromAT(c)||n.CommonUtil.isNodeDisabled(c))return null;var g=(new o.DOMMapper).getUnadjustedBounds(c);if(!g||g.top<0||g.left<0)return null;if(n.CommonUtil.getAncestor(c,"svg"))return null;var b=getComputedStyle(c),_=parseFloat(b.getPropertyValue("font-size")),f=b.getPropertyValue("word-spacing"),v=b.getPropertyValue("letter-spacing"),A=b.getPropertyValue("line-height"),w=!0,y=!0,C=!0;if(f){var k=parseFloat(f);if(!isNaN(k)){var R=r.CSSUtil.convertValue2Pixels("px",k.toString(),c);null!==R&&R/_<.16&&(w=!1)}}if(v){var x=parseFloat(v);if(!isNaN(x)){var P=r.CSSUtil.convertValue2Pixels("px",x.toString(),c);null!==P&&P/_<.12&&(y=!1)}}if(A){var T=parseFloat(A);if(!isNaN(T)){var U=A.match(s);if(U){var I=U[1],E=U[2];""!==E&&"px"!==E||(""===E?parseFloat(I):parseFloat(I)/_)<1.5&&(C=!1)}}}if(w&&y&&C)return null;var N=r.CSSUtil.getDefinedStyles(c,["word-spacing","letter-spacing","line-height"]);if(0===Object.keys(N).length)return null;var L=[],S=N["word-spacing"];if(S){var O=d(c,"word-spacing",S=u(c,"word-spacing",S),_,.16);L.push(O?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_word_spacing_style"))}var q=N["letter-spacing"];q&&(O=d(c,"letter-spacing",q=u(c,"letter-spacing",q),_,.12),L.push(O?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_letter_spacing_style")));var W=N["line-height"];return W&&null===r.CSSUtil.getAncestorWithStyles(c,{overflow:["auto","scroll"],"overflow-x":["auto","scroll"],"overflow-y":["auto","scroll"]})&&(O=d(c,"line-height",W=u(c,"line-height",W),_,1.5,!0),L.push(O?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_line_height_style"))),L.length>0?L:null}}},855(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.text_whitespace_valid=void 0;var a=i(461),n=i(461),l=i(7139);t.text_whitespace_valid={id:"text_whitespace_valid",context:"dom:*",help:{"en-US":{pass:"text_whitespace_valid.html",potential_text:"text_whitespace_valid.html",group:"text_whitespace_valid.html"}},messages:{"en-US":{pass:"Rule Passed",potential_text:"Space characters should not be used to create space between the letters of a word",group:"Space characters should not be used to control spacing within a word"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,r=l.CommonUtil.getAncestor(n,["body","script","code"]);if(null==r||"body"!=r.nodeName.toLowerCase())return null;for(var o=!0,s=n.firstChild;o&&s;){if("#text"==s.nodeName){var u=s.nodeValue;o=!/(^|\s)[a-zA-Z] [a-zA-Z] [a-zA-Z]($|\s)/.test(u)}s=s.nextSibling}return o?(0,a.RulePass)("pass"):(0,a.RulePotential)("potential_text")}}},3420(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.widget_tabbable_exists=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(9955),s=i(3864),u=i(3946);t.widget_tabbable_exists={id:"widget_tabbable_exists",context:"aria:button,aria:link,aria:spinbutton,aria:tablist,aria:combobox,aria:listbox,aria:menu,aria:radiogroup,aria:tree,aria:menubar, aria:grid, aria:treegrid, aria:checkbox,aria:slider,aria:spinbutton,aria:textbox,aria:scrollbar,aria:slider,aria:spinbutton",refactor:{IBMA_Focus_Tabbable:{pass:"pass",fail_no_tabbable:"fail_no_tabbable"}},help:{"en-US":{pass:"widget_tabbable_exists.html",fail_no_tabbable:"widget_tabbable_exists.html",group:"widget_tabbable_exists.html"}},messages:{"en-US":{pass:"Rule Passed",fail_no_tabbable:'Component with "{0}" role does not have a tabbable element',group:"Component must have at least one tabbable element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(!u.VisUtil.isNodeHiddenFromAT(n)&&!r.CommonUtil.isNodeDisabled(n)&&!l.AriaUtil.shouldBePresentationalChild(n)){if("datalist"===n.nodeName.toLowerCase())return null;for(var d=0,c=["combobox","grid","listbox","menu","menubar","radiogroup","tablist","tree","treegrid"];d<c.length;d++){var m=c[d];if(null!=l.AriaUtil.getAncestorWithRole(n,m,!0))return null}var p=o.ARIAMapper.nodeToRole(n),h=0;if(r.CommonUtil.isTabbable(n)&&++h,h<1&&!l.AriaUtil.containsPresentationalChildrenOnly(n)&&n.firstChild)for(var g=new s.DOMWalker(n);h<1&&g.nextNode()&&g.node!=n;)1==g.node.nodeType&&!g.bEndTag&&r.CommonUtil.isTabbable(g.node)&&++h;return h>=1?(0,a.RulePass)("pass"):(0,a.RulePotential)("fail_no_tabbable",[p])}}}},408(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.widget_tabbable_single=void 0;var a=i(461),n=i(461),l=i(3864),r=i(7011),o=i(7139),s=i(9955),u=i(4566),d=i(3946);t.widget_tabbable_single={id:"widget_tabbable_single",context:"aria:button,aria:link,aria:menuitem,aria:spinbutton,aria:tablist,aria:combobox,aria:listbox,aria:menu,aria:radiogroup,aria:tree,aria:checkbox,aria:option,aria:radio,aria:slider,aria:spinbutton,aria:textbox,aria:columnheader,aria:rowheader,aria:slider,aria:tab",refactor:{IBMA_Focus_MultiTab:{pass:"pass",potential_multiple_tabbable:"potential_multiple_tabbable"}},help:{"en-US":{pass:"widget_tabbable_single.html",potential_multiple_tabbable:"widget_tabbable_single.html",group:"widget_tabbable_single.html"}},messages:{"en-US":{pass:"Components with a widget role should have no more than one tabbable element",potential_multiple_tabbable:'Component with "{0}" role has more than one tabbable element',group:"Components with a widget role must have no more than one tabbable element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1","2.4.3"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(!d.VisUtil.isNodeHiddenFromAT(n)&&!o.CommonUtil.isNodeDisabled(n)&&!r.AriaUtil.shouldBePresentationalChild(n)){var c=s.ARIAMapper.nodeToRole(n),m=0;if(o.CommonUtil.isTabbable(n)&&++m,m<2&&!r.AriaUtil.containsPresentationalChildrenOnly(n)&&n.firstChild)for(var p=new l.DOMWalker(n);m<2&&p.nextNode()&&p.node!=n;)1==p.node.nodeType&&!p.bEndTag&&o.CommonUtil.isTabbable(p.node)&&++m;var h=m<2;return h||u.CacheUtil.setCache(n,"widget_tabbable_single","potential_multiple_tabbable"),h?(0,a.RulePass)("pass"):(0,a.RulePotential)("potential_multiple_tabbable",[c])}}}},6160(e,t,i){var a=this&&this.__createBinding||(Object.create?function(e,t,i,a){void 0===a&&(a=i);var n=Object.getOwnPropertyDescriptor(t,i);n&&!("get"in n?!t.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,a,n)}:function(e,t,i,a){void 0===a&&(a=i),e[a]=t[i]}),n=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),l=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&a(t,e,i);return n(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.a11yRulesets=void 0;var r=l(i(8855)),o=i(8601),s=[];for(var u in r)s.push(r[u]);var d={"1.1.1":"All non-text content that is presented to the user has a text alternative that serves the equivalent purpose.","1.2.1":"For prerecorded audio-only or video-only media, an alternative provides equivalent information.","1.2.2":"Captions are provided for all prerecorded audio content in synchronized media.","1.2.3":"An alternative for time-based media or audio description of the prerecorded video content is provided for synchronized media.","1.2.4":"Captions are provided for all live audio content in synchronized media.","1.2.5":"Audio description is provided for all prerecorded video content in synchronized media.","1.3.1":"Information, structure, and relationships conveyed through presentation can be programmatically determined or are available in text.","1.3.2":"When the sequence in which content is presented affects its meaning, a correct reading sequence can be programmatically determined.","1.3.3":"Instructions provided for understanding and operating content do not rely solely on sensory characteristics of components such as shape, size, visual location, orientation, or sound.","1.3.4":"Content does not restrict its view and operation to a single display orientation, such as portrait or landscape.","1.3.5":"The purpose of each input field that collects information about the user can be programmatically determined when the field serves a common purpose.","1.4.1":"Color is not used as the only visual means of conveying information, indicating an action, prompting a response, or distinguishing a visual element.","1.4.2":"If any audio plays automatically for more than 3 seconds, either a mechanism is available to pause or stop the audio, or a mechanism is available to control audio volume independently from the overall system volume level.","1.4.3":"The visual presentation of text and images of text has a contrast ratio of at least 4.5:1, with a 3:1 ratio for large-scale text.","1.4.4":"Text can be resized without assistive technology up to 200 percent without loss of content or functionality.","1.4.5":"If the technologies being used can achieve the visual presentation, text should not be used to convey information rather than images of text.","1.4.10":"Content can reflow without loss of information or functionality, and without requiring scrolling in two dimensions.","1.4.11":"The parts of graphical objects required to understand the content, and the visual information required to identify UI components and states, have a contrast ratio of at least 3:1 against adjacent colors.","1.4.12":"No loss of content or functionality occurs when users change letter, word and paragraph spacing, as well as line height.","1.4.13":"Where hover or focus actions cause additional content to become visible and hidden, the additional content is dismissable, hoverable and persistent.","2.1.1":"All functionality of the content is operable through a keyboard interface without requiring specific timings for individual keystrokes.","2.1.2":"If keyboard focus can be moved to a component using a keyboard interface, then focus can be moved away from that component using only a keyboard interface, and, if it requires more than unmodified arrow or tab keys or other standard exit methods, the user is advised of the method for moving focus away.","2.1.4":"If a keyboard shortcut is implemented using only letter, punctuation, number or symbol characters, then the shortcut can be turned off, remapped or activated only on focus.","2.2.1":"For each time limit that is set by the content, the user can turn off, adjust, or extend the limit.","2.2.2":"For moving, blinking, scrolling, or auto-updating information, the user can pause, stop, hide or adjust the information.","2.3.1":"Content does not contain anything that flashes more than three times in any one second period, or the flash is below the general flash and red flash thresholds.","2.4.1":"A mechanism is available to bypass blocks of content that are repeated on multiple Web pages.","2.4.2":"Web pages, non-web documents, and software have titles that describe topic or purpose.","2.4.3":"If content can be navigated sequentially and the navigation sequences affect meaning or operation, focusable components receive focus in an order that preserves meaning and operability.","2.4.4":"The purpose of each link can be determined from the link text alone or from the link text together with its programmatically determined link content.","2.4.5":"More than one way is available to locate a Web page within a set of Web pages, except where the Web Page is the result of, or a step in, a process.","2.4.6":"Headings and labels describe topic or purpose.","2.4.7":"Any keyboard operable user interface has a mode of operation where the keyboard focus indicator is visible.","2.4.11":"When an element receives focus, it is not entirely covered by other content.","2.5.1":"All functionality that uses multipoint or path-based gestures for operation can be operated with a single pointer without a path-based gesture.","2.5.2":"For functionality that can be operated using a single pointer, completion of the function is on the up-event with an ability to abort, undo or reverse the outcome.","2.5.3":"For user interface components with labels that include text or images of text, the accessible name contains the text that is presented visually.","2.5.4":"Functionality that can be operated by motion can also be operated by user interface components, and the motion trigger can be disabled.","2.5.8":"The size of the target for pointer inputs is at least 24 by 24 CSS pixels.","2.5.7":"All functionality that uses a dragging movement for operation can be achieved by a single pointer without dragging.","3.1.1":"The default human language of Web pages, non-Web documents, or software can be programmatically determined.","3.1.2":"The human language of each passage or phrase in the content can be programmatically determined.","3.2.1":"When any component receives focus, it does not initiate a change of context.","3.2.2":"Changing the setting of any user interface component does not automatically cause a change of context unless the user has been advised of the behavior before using the component.","3.2.3":"Navigational mechanisms that are repeated on multiple Web pages within a set of Web pages occur in the same relative order each time they are repeated, unless a change is initiated by the user.","3.2.4":"Components that have the same functionality within a set of Web pages are identified consistently.","3.2.6":"Make it easier to find help and support. If a Web page contains help mechanisms they occur in the same order relative to other page content, unless a change is initiated by the user.","3.3.1":"If an input error is automatically detected, the item that is in error is identified and the error is described to the user in text.","3.3.2":"Labels or instructions are provided when content requires user input.","3.3.3":"If an input error is automatically detected and suggestions for correction are known, then the suggestions are provided to the user, unless it would jeopardize the security or purpose of the content.","3.3.4":"For content that cause legal commitments or financial transactions for the user to occur, that modify or delete user-controllable data in data storage systems, or that submit user test responses, the user can reverse, correct, or confirm the action.","3.3.7":"Make it easier for users to complete multi-step processes. Don't ask for the same information twice in the same session.","3.3.8":"Make logins possible with less mental effort. Don't make people solve, recall, or transcribe something to log in.","4.1.1":"(Obsolete and removed) This requirement was originally adopted to address problems that assistive technology (AT) had directly parsing HTML. AT no longer has any need to directly parse HTML. Consequently, these problems either no longer exist or are addressed by other requirements.","4.1.2":"For all user interface components (including, but not limited to: form elements, links and components generated by scripts), the name and role can be programmatically determined; states, properties, and values that can be set by the user can be programmatically set; and notification of changes to these items is available to user agents, including assistive technologies.","4.1.3":"In content implemented using markup languages, status messages can be programmatically determined through role or properties such that they can be presented to the user by assistive technologies without receiving focus.",HTML:"The HTML specification issues that cause accessibility issues may be covered by other rules and will be reported under those accessibility requirements. However, some non-conforming HTML specification issues are still reported.",ARIA:"The ARIA specification issues that cause accessibility issues may be covered by other rules and will be reported under those accessibility requirements. However, some non-conforming ARIA specification issues are still reported."};t.a11yRulesets=[{id:"EXTENSIONS",name:"Extension Rules",category:o.eGuidelineCategory.ACCESSIBILITY,description:"Rules for enabling the browser extensions",type:o.eGuidelineType.EXTENSION,checkpoints:[{num:"1",name:"Extension CP 1",wcagLevel:"A",summary:"Rules for Extension"}]},{id:"IBM_Accessibility",name:"IBM Accessibility 7.3",category:o.eGuidelineCategory.ACCESSIBILITY,description:"Rules for WCAG 2.0, 2.1, 2.2 A and AA plus additional IBM supplemental requirements.",checkpoints:s.filter(function(e){return!("A"!==e.level&&"AA"!==e.level&&"NA"!==e.level||"2.0"!==e.wcagType&&"2.1"!==e.wcagType&&"2.2"!==e.wcagType&&"NA"!==e.wcagType)}).map(function(e){return{num:e.num,scId:e.scId,name:e.handle,wcagLevel:e.level,summary:d[e.num]}})},{id:"IBM_Accessibility_next",name:"IBM Accessibility next",category:o.eGuidelineCategory.ACCESSIBILITY,description:"Rules for WCAG 2.0, 2.1, 2.2 A and AA plus additional IBM supplemental requirements.",checkpoints:s.filter(function(e){return!("A"!==e.level&&"AA"!==e.level&&"NA"!==e.level||"2.0"!==e.wcagType&&"2.1"!==e.wcagType&&"2.2"!==e.wcagType&&"NA"!==e.wcagType)}).map(function(e){return{num:e.num,scId:e.scId,name:e.handle,wcagLevel:e.level,summary:d[e.num]}})},{id:"WCAG_2_2",name:"WCAG 2.2 (A, AA)",category:o.eGuidelineCategory.ACCESSIBILITY,description:"Rules for WCAG 2.2 A & AA. This is the current W3C recommendation (specification). Content that conforms to WCAG 2.2 also conforms to WCAG 2.1.",checkpoints:s.filter(function(e){return!("A"!==e.level&&"AA"!==e.level||"2.0"!==e.wcagType&&"2.1"!==e.wcagType&&"2.2"!==e.wcagType)}).map(function(e){return{num:e.num,scId:e.scId,name:e.handle,wcagLevel:e.level,summary:d[e.num]}})},{id:"WCAG_2_1",name:"WCAG 2.1 (A, AA)",category:o.eGuidelineCategory.ACCESSIBILITY,description:"Rules for WCAG 2.1 A & AA. Content that conforms to WCAG 2.1 also conforms to WCAG 2.0.",checkpoints:s.filter(function(e){return!("A"!==e.level&&"AA"!==e.level||"2.0"!==e.wcagType&&"2.1"!==e.wcagType)}).map(function(e){return{num:e.num,scId:e.scId,name:e.handle,wcagLevel:e.level,summary:d[e.num]}})},{id:"WCAG_2_0",name:"WCAG 2.0 (A, AA)",category:o.eGuidelineCategory.ACCESSIBILITY,description:"Rules for WCAG 2.0 A & AA. Referenced by US Section 508, but not the latest W3C recommendation.",checkpoints:s.filter(function(e){return("A"===e.level||"AA"===e.level)&&"2.0"===e.wcagType}).map(function(e){return{num:e.num,scId:e.scId,name:e.handle,wcagLevel:e.level,summary:d[e.num]}})}]},5233(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.SRController=void 0;var a=i(8195),n=i(7014),l=i(248),r=i(4566),o=i(2165),s=i(3946),u=function(){function e(e){void 0===e&&(e=document.body),this.rootElement=e,this.liveListeners=[],this.ctrlDoc=e.ownerDocument,this.setPointOfRegard(e),this.setupMutationTracking(),console.info('[WARNING] The SRController is a new feature that is not yet "stable". What this means:\n* API subject to change, even between minor versions of the checker\n* Results should be considered experimental. There are a variety of known issues, but making this available for early experimentation / feedback.')}return e.getController=function(t){return void 0===t&&(t=document),this.singleton||(this.singleton=new e(t.body)),this.singleton},e.prototype.disconnect=function(){this.mutationObserver&&this.mutationObserver.disconnect()},e.prototype.findAllShadowRoots=function(e){void 0===e&&(e=document);for(var t,i=[],a=this.ctrlDoc.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,null);t=a.nextNode();){var n=t;if(n.shadowRoot){i.push(n.shadowRoot);var l=this.findAllShadowRoots(n.shadowRoot);i.push.apply(i,l)}}return i},e.prototype.setupMutationTracking=function(){var e=this;this.mutationObserver&&this.mutationObserver.disconnect();var t=this,i=new MutationObserver(function(l){for(var r=t.pointOfRegard.getNode(),o=function(e){e.removedNodes.forEach(function(t){(t.isSameNode(r)||t.contains(r))&&(console.info("Adjusting PoR due to DOM mutation removing PoR"),r=e.target)})},u=0,d=l.filter(function(e){var t;return(null===(t=e.removedNodes)||void 0===t?void 0:t.length)>0});u<d.length;u++)o(d[u]);e.setPointOfRegard(r);for(var c=function(t){t.addedNodes&&t.addedNodes.forEach(function(t){for(var a=0,n=e.findAllShadowRoots(t);a<n.length;a++){var l=n[a];i.observe(l,{childList:!0,subtree:!0,characterData:!0})}});var l=t.target,r=1===l.nodeType?l:l.parentElement;if(r&&!r.closest('[aria-busy="true"]')&&"true"!==r.getAttribute("aria-busy")){var o=(["polite","assertive"].includes(r.getAttribute("aria-live"))||"OUTPUT"===r.nodeName.toUpperCase()||["status","log","progressbar","alert","timer"].includes(r.getAttribute("role")))&&r||r.closest('[aria-live="polite"],[aria-live="assertive"],output,[role="status"],[role="log"],[role="progressbar"],[role="alert"],[role="timer"]'),u=!1,d=["additions","text"];if(o){var c=r.closest("[aria-relevant]");c&&(d=c.getAttribute("aria-relevant").split(/ +/g)),"log"===o.getAttribute("role")&&(d=["additions"]),o.hasAttribute("aria-relevant")&&(d=o.getAttribute("aria-relevant").split(/ +/g)),d.includes("all")&&(d=["additions","removals","text"]),u=3===t.target.nodeType&&d.includes("text")||t.addedNodes.length>0&&d.includes("additions")||t.removedNodes.length>0&&d.includes("removals")}if(o&&u){var m="true"===o.getAttribute("aria-atomic")||["alert","status","timer","marquee"].includes(o.getAttribute("role"));if(m||"characterData"!==t.type||3!==t.target.nodeType||s.VisUtil.isNodeHiddenFromAT(t.target.parentElement)){var p=m?o:t.target;p.liveAnnounce&&clearTimeout(p.liveAnnounce),p.liveAnnounce=setTimeout(function(){var i=[],l=d.includes("removals")&&t.removedNodes.length>0;if(m||l){var r=new a.SRCursor(p,!1),o=new a.SRCursor(p,!0);o.next(function(){return!0}),i.push((l?"[removed] ":"")+n.SRRenderer.renderRange("item",r,o))}else d.includes("additions")&&t.addedNodes.length>0&&t.addedNodes.forEach(function(e){var t=new a.SRCursor(e,!1),l=new a.SRCursor(e,!0);l.next(function(){return!0}),i.push(n.SRRenderer.renderRange("item",t,l))});for(var s=0,u=e.liveListeners;s<u.length;s++)(0,u[s])(i.join("\n"))},100)}else for(var h=0,g=e.liveListeners;h<g.length;h++)(0,g[h])(t.target.nodeValue)}}},m=0,p=l;m<p.length;m++)c(p[m])}),l=this.findAllShadowRoots(this.ctrlDoc.documentElement);l.push(this.ctrlDoc.documentElement);for(var r=0,o=l;r<o.length;r++){var u=o[r];i.observe(u,{childList:!0,subtree:!0,characterData:!0})}},e.prototype.addLiveListener=function(e){this.liveListeners.push(e)},e.prototype.removeLiveListener=function(e){this.liveListeners=this.liveListeners.filter(function(t){return t!==e})},e.prototype.getPointOfRegard=function(){return this.pointOfRegard},e.prototype.setPointOfRegard=function(t){var i;try{this.pointOfRegard=new a.SRCursor(t);var l=e.diffContainers("focus",this.pointOfRegard),r=this.pointOfRegard.getRole(),o=null===(i=this.pointOfRegard.getNameInfo())||void 0===i?void 0:i.name;return{success:!0,renderingResult:n.SRRenderer.renderCurrent("focus",this.pointOfRegard,l),role:r,name:o}}catch(e){return{success:!1,renderingResult:{start:this.pointOfRegard.clone(),end:this.pointOfRegard.clone(),message:"Failed to set point of regard: ".concat(e.message)}}}},e.prototype.jumpNext=function(t){var i;r.CacheUtil.clearCaches(this.ctrlDoc.documentElement);var a=this.pointOfRegard.clone();try{for(var o=!0,s=this.pointOfRegard.clone(),u=void 0;o&&s;){var d=s.clone();if(s=l.SRNavigator.jumpNext(t,s)){var c=e.diffContainers(t,s,d);"item"!==t||l.SRNavigator.getStartFunc(t)(s.getRole(),!s.isEndTag(),s.getNode())||(c={entering:[],leaving:[]}),o=0===(u=n.SRRenderer.renderCurrent(t,s,c)).message.trim().length&&!["region"].includes(t)}}if(s)return this.pointOfRegard=s,{success:!0,renderingResult:u,role:this.pointOfRegard.getRole(),name:null===(i=this.pointOfRegard.getNameInfo())||void 0===i?void 0:i.name};this.pointOfRegard=a;var m=n.SRRenderer.renderCurrent(t,a,{leaving:[],entering:[]});return{success:!1,renderingResult:{start:a.clone(),end:a.clone(),message:"No next ".concat(t,". ").concat((null==m?void 0:m.message)||"")}}}catch(e){return console.error(e),this.pointOfRegard=a,{success:!1,renderingResult:{start:a.clone(),end:a.clone(),message:"Navigation error: ".concat(e.message)}}}finally{console.groupEnd()}},e.prototype.jumpPrevious=function(t){var i;r.CacheUtil.clearCaches(this.ctrlDoc.documentElement);var a=this.pointOfRegard.clone();try{for(var o=!0,s=this.pointOfRegard.clone(),u=void 0;o&&s;){var d=s.clone();if(s=l.SRNavigator.jumpPrevious(t,s)){var c=e.diffContainers(t,s,d);"item"!==t||l.SRNavigator.getStartFunc(t)(s.getRole(),!s.isEndTag(),s.getNode())||(c={entering:[],leaving:[]}),o=0===(u=n.SRRenderer.renderCurrent(t,s,c)).message.trim().length&&!["region"].includes(t)}}if(s)return this.pointOfRegard=s,{success:!0,renderingResult:u,role:this.pointOfRegard.getRole(),name:null===(i=this.pointOfRegard.getNameInfo())||void 0===i?void 0:i.name};this.pointOfRegard=a;var m=n.SRRenderer.renderCurrent(t,a,{leaving:[],entering:[]});return{success:!1,renderingResult:{start:a.clone(),end:a.clone(),message:"No previous ".concat(t,". ").concat((null==m?void 0:m.message)||"")}}}catch(e){return console.error(e),this.pointOfRegard=a,{success:!1,renderingResult:{start:a.clone(),end:a.clone(),message:"Navigation error: ".concat(e.message)}}}},e.diffContainers=function(t,i,l){var r=[],o=[];try{var s=i?i.getNode().ownerDocument.body||i.getNode().ownerDocument.documentElement:l?l.getNode().ownerDocument.body||l.getNode().ownerDocument.documentElement:document.body||document.documentElement,u=i?i.clone():new a.SRCursor(s),d=l?l.clone():new a.SRCursor(s);if(!u.getNode().isSameNode(d.getNode())){var c=e.commonParent(u,d);if(c){for(;c.contains(u);)o.push(n.SRRenderer.renderEnter(t,u,d)),u.parent();for(o.reverse(),o=o.filter(function(e){return e&&e.trim().length>0}).map(function(e){return e.trim()});c.contains(d);)r.push(n.SRRenderer.renderLeave(t,d,d)),d.parent();r=r.filter(function(e){return e&&e.trim().length>0}).map(function(e){return e.trim()})}}}catch(e){console.error(e)}return{leaving:r,entering:o}},e.commonParent=function(e,t){if(e.contains(t))return e.clone();if(t.contains(e))return t.clone();for(var i=e.clone();!i.contains(t)&&i.parent(););return i.contains(e)&&i.contains(t)?i:null},e.renderAll=function(t){var i=e.getController();i.ctrlDoc.body.querySelectorAll("dialog,[role='dialog']").forEach(function(e){o.SRUtil.isModalDialogElement(e)&&i.setPointOfRegard(e)});var a=[],l=n.SRRenderer.renderCurrent(t,i.getPointOfRegard(),{entering:[],leaving:[]});l&&a.push(l.message);for(var r=!0;r;){var s=i.jumpNext(t);s.success?a.push(s.renderingResult.message):r=!1}return a},e.renderAllDetail=function(t,i){var a=e.getController(t);a.setPointOfRegard(t.body),t.body.querySelectorAll("dialog,[role='dialog']").forEach(function(e){o.SRUtil.isModalDialogElement(e)&&a.setPointOfRegard(e)});var l=[],r=n.SRRenderer.renderCurrent(i,a.getPointOfRegard(),{entering:[],leaving:[]});r&&l.push(r);for(var s=!0;s;){var u=a.jumpNext(i);u.success?l.push(u.renderingResult):s=!1}return l},e.renderStructure=function(t){for(var i,n=["region","heading","item","tab_focus","image"],l=n.map(function(i){return e.renderAllDetail(t,i)}),r=[],s=function(){var e=null===(i=l[0][0])||void 0===i?void 0:i.start;n.forEach(function(t,i){l[i].length>0&&(!e||a.SRCursor.compare(l[i][0].start,e)<0)&&(e=l[i][0].start)});var s={},u=!1;if(n.forEach(function(t,i){s[t]="",l[i].length>0&&0===a.SRCursor.compare(l[i][0].start,e)&&(s[t]=l[i].shift().message,u=""!==s[t])}),u){var d=e.getElement(),c=d&&o.SRUtil.getUniqueSelector(d);c&&t.querySelector(c)&&(s.selector=c),r.push(s)}};l.some(function(e){return e.length>0});)s();return r},e}();t.SRController=u},8195(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.SRCursor=void 0;var a=i(3864),n=i(1950),l=i(7011),r=i(7139),o=i(2165),s=function(){function e(e,t){this.walker=new a.DOMWalker(e,t,void 0,!1),e&&this.refreshName()}return e.prototype.clone=function(){var t=new e(this.walker.node,this.walker.bEndTag);return t.role=this.role,t.name=this.name,t},e.prototype.refreshName=function(){1===this.walker.node.nodeType?(this.role=l.AriaUtil.getResolvedRole(this.walker.node,!0),this.name=n.AccNameUtil.computeAccessibleName(this.walker.node)):3===this.walker.node.nodeType?(this.role="text",this.name={name:this.walker.node.textContent,nameFrom:"text"}):(this.role=void 0,this.name=void 0)},e.prototype.next=function(e,t){var i,a=!1;this.refreshName();var n=t&&t(this)||{skipCurrent:!1,skipChildren:!1},r=n.skipCurrent,s=n.skipChildren;do{if(s&&!this.walker.bEndTag)this.walker.bEndTag=!0;else if(!this.walker.nextNode())break;if(this.refreshName(),r=(i=t&&t(this)||{skipCurrent:!1,skipChildren:!1}).skipCurrent,s=i.skipChildren,1===this.walker.node.nodeType?this.role=l.AriaUtil.getResolvedRole(this.walker.node,!0):3===this.walker.node.nodeType&&(this.role="text"),o.SRUtil.isModalDialogElement(this.getNode())&&this.isEndTag())break;r||(a=e(this.role,!this.walker.bEndTag,this.walker.node))}while(!a);return a?this.refreshName():(this.role=void 0,this.name=void 0),a},e.prototype.previous=function(e,t){var i,a=!1;this.refreshName();var n=t&&t(this)||{skipCurrent:!1,skipChildren:!1},r=n.skipCurrent,s=n.skipChildren;do{if(s&&this.walker.bEndTag)this.walker.bEndTag=!1;else if(!this.walker.prevNode())break;if(this.refreshName(),r=(i=t&&t(this)||{skipCurrent:!1,skipChildren:!1}).skipCurrent,s=i.skipChildren,1===this.walker.node.nodeType?this.role=l.AriaUtil.getResolvedRole(this.walker.node,!0):3===this.walker.node.nodeType&&(this.role="text"),o.SRUtil.isModalDialogElement(this.getNode())&&!this.isEndTag())break;r||(a=e(this.role,!this.walker.bEndTag,this.walker.node))}while(!a);return a?this.refreshName():(this.role=void 0,this.name=void 0),a},e.prototype.parent=function(e){return!!this.walker.node.parentNode&&(this.walker.node=this.walker.node.parentNode,this.walker.bEndTag=!0===e,1===this.walker.node.nodeType?(this.role=l.AriaUtil.getResolvedRole(this.walker.node,!0),this.name=n.AccNameUtil.computeAccessibleName(this.walker.node)):3===this.walker.node.nodeType?(this.role="text",this.name={name:this.walker.node.textContent,nameFrom:"text"}):(this.role=void 0,this.name=void 0),!0)},e.prototype.getCurrentOrParentByRole=function(e,t){for(var i=this,a=t?t.map(function(e){return e.toUpperCase()}):[],n=function(t){var n=t.getElement();return e.includes(i.getRole())||n&&!n.hasAttribute("role")&&a.includes(n.nodeName.toUpperCase())};!n(this)&&this.parent(););return n(this)},e.prototype.getCurrentOrParentByRoleClone=function(e,t){var i=this.clone();return i.getCurrentOrParentByRole(e,t)?i:null},e.prototype.getCurrentOrParentTabbableClone=function(){for(var e=this.clone();e;){var t=e.getElement();if(e.isStartTag()&&t&&r.CommonUtil.isTabbable(t))return e;if(!e.parent(!1))break}return null},e.prototype.getRole=function(){return this.role},e.prototype.getNameInfo=function(){return this.name},e.prototype.getName=function(){var e=this.getNameInfo();if(e&&e.name)return e.name;var t=this.getElement();if(t){var i=r.CommonUtil.getLabelForElementHidden(t,!0);if(i)return i.innerText||i.textContent}},e.prototype.setEndTag=function(e){this.walker.bEndTag=e},e.prototype.getNode=function(){return this.walker.node},e.prototype.getElement=function(){if(this.walker.node&&1===this.walker.node.nodeType)return this.walker.node},e.prototype.getParentElement=function(){if(!this.walker.node)return null;var e=this.clone();return e.walker.node=a.DOMWalker.parentElement(e.walker.node),e},e.prototype.isEndTag=function(){return this.walker.bEndTag},e.prototype.isStartTag=function(){return!this.walker.bEndTag},e.compare=function(e,t){var i,n,l=null===(i=null==e?void 0:e.walker)||void 0===i?void 0:i.node,r=null===(n=null==t?void 0:t.walker)||void 0===n?void 0:n.node;if(!l&&!r)return 0;if(!l)return 1;if(!r)return-1;var o=l.compareDocumentPosition(r);if(1&o){for(var s=[l],u=[r],d=l;d=a.DOMWalker.parentNode(d);)s.push(d);for(d=r;d=a.DOMWalker.parentNode(d);)u.push(d);s.reverse(),u.reverse();for(var c=0;c<s.length&&c<u.length&&s[c]===u[c];)c++;if(c===s.length)return e.walker.bEndTag?1:-1;if(c===u.length)return t.walker.bEndTag?-1:1;if(c>0){var m=s[c],p=u[c],h=m.compareDocumentPosition(p);if(2&h)return 1;if(4&h)return-1}return 0}return 8&o?t.walker.bEndTag?-1:1:16&o?e.walker.bEndTag?1:-1:2&o?1:4&o?-1:0},e.prototype.contains=function(e){return this.getNode().contains(e.getNode())&&!this.isSameNode(e)},e.prototype.isSameNode=function(e){return!!e&&this.getNode().isSameNode(e.getNode())},e.prototype.hasNonEmptyName=function(){var e;return((null===(e=this.getNameInfo())||void 0===e?void 0:e.name)||"").trim().length>0},e}();t.SRCursor=s},248(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.SRNavigator=void 0;var a=i(3864),n=i(1950),l=i(8195),r=i(7139),o=i(3946),s=i(7011);!function(e){function t(e){var i;if(1!==e.nodeType)return!1;if("br"===e.nodeName.toLowerCase())return!0;var n=e,l=n.ownerDocument.defaultView,r=null===(i=l.getComputedStyle(n))||void 0===i?void 0:i.display;if(r&&r.startsWith("table"))return!0;if("block"===r&&"block"!==n.style.display&&n.parentElement&&"flex"===l.getComputedStyle(n.parentElement).display)return!1;if("link"===s.AriaUtil.getResolvedRole(n,!0)){var o=new a.DOMWalker(e,!1,void 0,!1);if(o.prevNode(),!t(o.node))return!0}return["block","flex","grid","list-item"].includes(r)}function i(e){if(!e||1!==e.nodeType)return null;var t=e;if(!t.hasAttribute("tabindex"))return null;var i=parseInt(t.getAttribute("tabindex"),10);return Number.isNaN(i)?null:i}function u(e){if(!e||1!==e.nodeType)return!1;var t=e,a=i(t);return(null===a||0===a)&&r.CommonUtil.isTabbable(t)}function d(e){return void 0===e&&(e=!0),function(t,i,a){return!!(a&&1===a.nodeType&&i&&r.CommonUtil.isTabbable(a))&&(e||u(a))}}function c(e,t){var a=((null==t?void 0:t.ownerDocument)||document).body||t;if(!a)return[];var n=new l.SRCursor(a,!1),o=b("tab_focus"),s=[],d=[],c=function(t){e(t.getRole(),!t.isEndTag(),t.getNode())&&(function(e){if(!e||1!==e.nodeType)return!1;var t=e,a=i(t);return null!==a&&a>0&&r.CommonUtil.isTabbable(t)}(t.getNode())?s.push(t.clone()):u(t.getNode())&&d.push(t.clone()))};for(c(n);n.next(function(){return!0},o);)c(n);return s.sort(function(e,t){var a=e.getElement(),n=t.getElement(),r=i(a)||0,o=i(n)||0;return r!==o?o-r:l.SRCursor.compare(e,t)}),s.concat(d)}function m(e,t){return e.findIndex(function(e){return 0===l.SRCursor.compare(e,t)})}function p(e){switch(e){case"link":return function(e,t){return t&&"link"===e};case"tab_focus":return d(!1);case"heading":return function(e,t){return t&&"heading"===e};case"h1":return function(e,t,i){return t&&"heading"===e&&"1"===i.ariaLevel};case"h2":return function(e,t,i){return t&&"heading"===e&&"2"===i.ariaLevel};case"h3":return function(e,t,i){return t&&"heading"===e&&"3"===i.ariaLevel};case"h4":return function(e,t,i){return t&&"heading"===e&&"4"===i.ariaLevel};case"h5":return function(e,t,i){return t&&"heading"===e&&"5"===i.ariaLevel};case"h6":return function(e,t,i){return t&&"heading"===e&&"6"===i.ariaLevel};case"image":return function(e,t){return t&&["img","graphics-document"].includes(e)};case"radio":return function(e,t){return t&&"radio"===e};case"button":return function(e,t){return t&&"button"===e};case"checkbox":return function(e,t){return t&&"checkbox"===e};case"combo":return function(e,t){return t&&"combobox"===e};case"list":return function(e,t){return t&&"list"===e};case"listitem":return function(e,t){return t&&"listitem"===e};case"article":return function(e,t){return t&&"article"===e};case"table":return function(e,t){return t&&"table"===e};case"paragraph":return function(e,t,i){return t&&"P"===i.nodeName.toUpperCase()};case"dom":return function(){return!0};case"item":return function(e,i,n){if(!i)return!1;if(t(n))return!0;var l=new a.DOMWalker(n,!i);return!(!l.prevNode()||!l.bEndTag)&&t(l.node)};case"region":return function(e,t,i){var a,l;return!!t&&(!!["main","navigation","form","banner","search","contentinfo"].includes(e)||"region"===e&&1===(null==i?void 0:i.nodeType)&&!!(null===(l=null===(a=n.AccNameUtil.computeAccessibleName(i))||void 0===a?void 0:a.name)||void 0===l?void 0:l.trim()))};case"formcontrol":case"editbox":case"graphic":case"frame":case"division":case"tabcontrol":case"separator":case"clickable":case"mouseover":throw new Error("NOT_IMPLEMENTED")}}e.getStartFunc=p;var h=function(e){var t;try{var i=e.getNode().nodeType,n=e.getElement(),l=e.clone();if(l.setEndTag(!1),[4,8].includes(i))return{skipCurrent:!0,skipChildren:!0};if(![1,3].includes(i))return{skipCurrent:!0,skipChildren:!1};if(3===i&&!(n=e.getNode().parentElement))return o.VisUtil.isNodeHiddenFromAT(n)?{skipCurrent:!0,skipChildren:!1}:null;if(!(n.closest("body")||(t=n,t.getRootNode()instanceof ShadowRoot)))return{skipCurrent:!0,skipChildren:!1};if(n.closest("script,style"))return{skipCurrent:!0,skipChildren:!0};var r=l.getCurrentOrParentByRoleClone(["heading","link"]),u=s.AriaUtil.getResolvedRole(n),d="heading"===u||"link"===u;if(r){r.getElement();var c=r.getNameInfo();if(c&&!["content","text"].includes(c.nameFrom)){if(o.VisUtil.isNodeHiddenFromAT(n))return{skipCurrent:!0,skipChildren:!0};if(!o.VisUtil.isNodeVisible(n))return{skipCurrent:!0,skipChildren:!0}}else if(d);else{var m=s.AriaUtil.getResolvedRole(n);if(("img"===m||"graphics-document"===m)&&o.VisUtil.isNodeHiddenFromAT(n))return{skipCurrent:!0,skipChildren:!0}}}else{if(o.VisUtil.isNodeHiddenFromAT(n))return{skipCurrent:!0,skipChildren:1===i};if(!o.VisUtil.isNodeVisible(n))return{skipCurrent:!0,skipChildren:1===i}}if("BODY"===n.nodeName.toUpperCase())return{skipCurrent:!1,skipChildren:!1};if("LABEL"===n.nodeName.toUpperCase()){if(n.hasAttribute("for")&&document.getElementById(n.getAttribute("for"))&&"hidden"!==document.getElementById(n.getAttribute("for")).getAttribute("type"))return{skipCurrent:!0,skipChildren:!1};var p=n.querySelector("input, select, textarea, button, [role='checkbox'], [role='combobox'], [role='listbox'], [role='menuitemcheckbox'], [role='menuitemradio'], [role='radio'], [role='searchbox'], [role='slider'], [role='spinbutton'], [role='switch'], [role='textbox']");if(p&&"hidden"!==p.getAttribute("type"))return{skipCurrent:!0,skipChildren:!1}}var h=n.closest("label[for]"),g=h&&h.getAttribute("for");if(h&&g&&document.getElementById(g)&&"hidden"!==document.getElementById(g).getAttribute("type")&&!n.closest("a[href], [role='link'], button, [role='button']"))return{skipCurrent:!0,skipChildren:1===i};var b=l.getRole();if(s.AriaUtil.containsPresentationalChildrenOnly(n))return{skipCurrent:!1,skipChildren:!0};if(["link","heading"].includes(b)&&(!l.getName()||!["content","text"].includes(l.getNameInfo().nameFrom))&&!(r&&r.getNameInfo()&&["content","text"].includes(r.getNameInfo().nameFrom)))return{skipCurrent:!1,skipChildren:!0};if("LEGEND"===n.nodeName.toUpperCase())for(var _=a.DOMWalker.parentElement(e.getNode());_;){if("FIELDSET"===_.nodeName.toUpperCase())return{skipCurrent:!1,skipChildren:!0};_=a.DOMWalker.parentElement(_)}return n&&"MSUP"===n.nodeName.toUpperCase()?{skipCurrent:!1,skipChildren:!0}:n.closest(".ibma-sr-overlay")?{skipCurrent:!0,skipChildren:!0}:null}finally{}},g=function(e){var t=e.getNode().nodeType,i=e.getElement();if(1!==t&&3!==t)return{skipCurrent:!0,skipChildren:!1};if(3===t)return o.VisUtil.isNodeHiddenFromAT(i)?{skipCurrent:!0,skipChildren:!1}:null;if(o.VisUtil.isNodeHiddenFromAT(i))return{skipCurrent:!0,skipChildren:!0};if("LABEL"===i.nodeName.toUpperCase()&&i.hasAttribute("for")&&document.getElementById(i.getAttribute("for"))&&"hidden"!==document.getElementById(i.getAttribute("for")).getAttribute("type"))return{skipCurrent:!0,skipChildren:!1};var a=i.closest("label[for]"),n=a&&a.getAttribute("for");return a&&n&&document.getElementById(n)&&"hidden"!==document.getElementById(n).getAttribute("type")&&!i.closest("a[href], [role='link'], button, [role='button']")?{skipCurrent:!0,skipChildren:1===t}:(e.getRole(),s.AriaUtil.containsPresentationalChildrenOnly(i)?{skipCurrent:!1,skipChildren:!0}:i&&"MSUP"===i.nodeName.toUpperCase()||i.closest(".ibma-sr-overlay")?{skipCurrent:!0,skipChildren:!0}:null)};function b(e){switch(e){case"region":case"item":return h;case"link":case"tab_focus":case"heading":case"h1":case"h2":case"h3":case"h4":case"h5":case"h6":case"image":return g;case"radio":case"button":case"checkbox":case"combo":case"list":case"listitem":case"article":case"table":case"paragraph":case"dom":case"formcontrol":case"editbox":case"graphic":case"frame":case"division":case"tabcontrol":case"separator":case"clickable":case"mouseover":throw new Error("NOT_IMPLEMENTED")}}function _(e,t){try{if("tab_focus"===e){var i=c(d(!0),t.getNode());if(i.length>0){var a=t.getCurrentOrParentTabbableClone(),n=a&&m(i,a)>=0?a:t.clone(),l=m(i,n);return l>=0?l+1<i.length?i[l+1].clone():null:i[0].clone()}}var r=t.clone(),o=p(e),s=b(e);return r.next(o,s)?r:null}finally{console.groupEnd()}}function f(e,t){if("tab_focus"===e){var i=t.clone(),a=p(e),n=b(e);if(i.previous(a,n))return i;var l=c(d(!0),t.getNode());if(l.length>0){var r=t.getCurrentOrParentTabbableClone(),o=r&&m(l,r)>=0?r:t.clone(),s=m(l,o);if(s>0)return l[s-1].clone()}return null}var u=t.clone(),h=p(e),g=b(e);return u.previous(h,g)?u:null}e.getSkipFunc=b,e.jumpCurrent=function(e,t){return("tab_focus"===e?d(!0):p(e))(t.getRole(),!t.isEndTag(),t.getNode())?t.clone():f(e,t)},e.jumpCurrentEnd=function(e,t){if("item"===e)return(r=_(e,t))?[r]:[];var i=t.getNameInfo(),a=t.clone();i&&!["content","text"].includes(i.nameFrom)||a.setEndTag(!0),a.next(function(){return!0});for(var n=[],r=_("item",t);r&&l.SRCursor.compare(r,a)<0;)n.push(r),r=_("item",r);return n.push(a),"tab_focus"===e&&"link"===t.getRole()?[n[n.length-1]]:n},e.jumpNext=_,e.jumpPrevious=f}(t.SRNavigator||(t.SRNavigator={}))},7014(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.SRRenderer=void 0;var a,n=i(7011),l=i(248),r=i(8195),o=i(2151),s=i(7242);(a=t.SRRenderer||(t.SRRenderer={})).renderEnter=function(e,t,i){for(var a=0,n=o.CONTAINER_ENTER_RULES;a<n.length;a++){var l=n[a].test(e,t,i);if(null!=l)return l}return null},a.renderLeave=function(e,t,i){for(var a=0,n=o.CONTAINER_EXIT_RULES;a<n.length;a++){var l=n[a].test(e,t,i);if(null!=l)return l}return null},a.renderCurrent=function(e,t,i){var n=l.SRNavigator.jumpCurrent(e,t);if(!n)return null;var r=l.SRNavigator.jumpCurrentEnd(e,n);r&&0!==r.length||(r=[null]);for(var o=r[r.length-1],s="",u=0,d=r;u<d.length;u++){var c=d[u],m=a.renderRange(e,n,c);if(m.trim().length>0){o=c,s=m;break}}return""===s&&(s=a.renderRange(e,n,o)),{start:n,end:o,message:(i.leaving||[]).concat(i.entering||[]).concat([s]).join(" ").replace(/\s+/g," ")}},a.renderRange=function(e,t,i){for(var a,u=t.clone(),d=[],c=!0,m=null;c;){var p=u.getElement(),h=u.getNode(),g=h.nodeType,b=n.AriaUtil.getAncestorWithRole(h,"link",!0);b&&!["content","text"].includes(null===(a=new r.SRCursor(b).getNameInfo())||void 0===a?void 0:a.nameFrom)&&(b=null);for(var _=0,f=o.SR_RULES;_<f.length;_++){var v=f[_].test(e,u);if(null!=v&&v.trim().length>0){1!==g||u.isEndTag()||"menu"!==p.getAttribute("aria-haspopup")||(v="[subMenu] "+v),"tab_focus"===e?m&&(!b||b&&m!==b)&&(v="".concat(v," ").concat((0,s.getLinkAnnouncement)(new r.SRCursor(m,!1)))):!b||m&&m===b||(v="".concat((0,s.getLinkAnnouncement)(new r.SRCursor(b,!1))," ").concat(v)),""!==v&&(m=b,d.push(v));break}}d.push([].filter(function(e){return e.trim().length>0}).join(" ")),c=u.next(function(){return!0},l.SRNavigator.getSkipFunc(e))&&r.SRCursor.compare(u,i)<0}"tab_focus"===e&&m&&d.push("".concat((0,s.getLinkAnnouncement)(new r.SRCursor(m,!1))));var A=d.filter(function(e){return e.trim().length>0}).join(" ");return A=(A=A.replace(/, \u0001([^\u0002]+)\u0002/g,function(e,t){var i='"'.concat(t,'"'),a=A.replace(e,"");return a.includes(i)||a.includes(t)?"":", ".concat(i)})).replace(/[\u0001\u0002]/g,"")}},328(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.SRRendererRule=void 0;var i=function(){function e(e){this.ruleDefinition=e}return e.prototype.test=function(e,t,i){if(this.ruleDefinition.modes.includes(e)&&(this.ruleDefinition.roles.includes(t.getRole())||this.ruleDefinition.elems.includes(t.getNode().nodeName.toUpperCase())))for(var a=0,n=this.ruleDefinition.tests;a<n.length;a++){var l=(0,n[a])(t,i,e);if("string"==typeof l)return l}return null},e}();t.SRRendererRule=i},369(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.SRTableUtil=void 0;var a=i(8195);!function(e){function t(e){return!!e.getElement()&&(!!["cell","rowheader","columnheader"].includes(e.getRole())||!e.getElement().hasAttribute("role")&&["TH","TD"].includes(e.getElement().nodeName.toUpperCase()))}function i(e){return e.getCurrentOrParentByRoleClone(["cell","rowheader","columnheader"],["TD","TH"])}function n(e){if(!t(e))return 0;var i=e.getElement().getAttribute("colspan");return i?parseInt(i):1}function l(e){if(!t(e))return 0;var i=e.getElement().getAttribute("rowspan");return i?parseInt(i):1}function r(e){var i=e.getCurrentOrParentByRoleClone(["table"]);if(!i)return null;for(var a,r=i.clone(),o=[],s=[];r.next(function(){return!0})&&!r.getNode().isSameNode(i.getNode());){if(r.isEndTag()&&"row"===r.getRole())for(o.push(s),a=s,s=[];a&&s.length<a.length&&a[s.length].rowIndexStart+a[s.length].rowspan-1>=o.length;)s.push(a[s.length]);if(!r.isEndTag()&&t(r)){for(var u=n(r),d={rowIndexStart:o.length,colIndexStart:s.length,rowspan:l(r),colspan:u,cellCursor:r.clone()},c=0;c<u;++c)s.push(d);for(;a&&s.length<a.length&&a[s.length].rowIndexStart+a[s.length].rowspan-1>=o.length;)s.push(a[s.length])}}return o}function o(e,t){var a=i(e);t||(t=r(e));for(var n=0;n<t.length;++n)for(var l=0;l<t[n].length;++l)if(t[n][l].cellCursor.isSameNode(a))return t[n][l];return null}function s(e,t){return t>=e.colIndexStart&&t<e.colIndexStart+e.colspan}function u(e,t){return t>=e.rowIndexStart&&t<e.rowIndexStart+e.rowspan}function d(e){var t=e.getElement();return!!t&&("cell"===e.getRole()||!t.hasAttribute("role")&&"TD"===t.nodeName.toUpperCase())}e.isCursorCellRole=t,e.getCurrentOrParentCellCursor=i,e.getColSpan=n,e.getRowSpan=l,e.getTableModel=r,e.getCellModel=o,e.cellModelContainsColumn=s,e.cellModelContainsRow=u,e.getRowHeaders=function(e){return""},e.getColumnHeadersForCursor=function(t,i){if(!i&&!(i=r(t)))return"";var n=o(t,i);if(!n)return"";var l=n.cellCursor;if(!l)return"";var u=l.getElement();if(!u)return"";for(var c=[],m=n.colIndexStart;m<n.colIndexStart+n.colspan;++m)c.push({potentialColHeaders:[],existsDataCell:!1,colIdx:m});var p=[];if(u.hasAttribute("headers"))p=u.getAttribute("headers").split(" ").map(function(e){return document.getElementById(e)}).filter(function(e){return!!e}).map(function(e){return new a.SRCursor(e)}).filter(function(t){return c.some(function(a){return s(e.getCellModel(t,i),a.colIdx)})});else{for(var h=0;h<i.length;++h)for(var g=function(e){var t=e.colIdx,a=i[h][t],n=a.cellCursor,r=n.getElement();if(!a||!n||n.isSameNode(l)||p.some(function(e){return n.isSameNode(e)}))return e.existsDataCell=e.existsDataCell||d(n)&&(n.hasNonEmptyName()||e.potentialColHeaders.length>0),"continue";var o=n.clone();"columnheader"===n.getRole()?(p.push(o),e.potentialColHeaders.push(o)):r.hasAttribute("role")||"TH"!==r.nodeName.toUpperCase()?e.existsDataCell=e.existsDataCell||d(n)&&(n.hasNonEmptyName()||e.potentialColHeaders.length>0):("col"===r.getAttribute("scope")||"axis"===r.getAttribute("scope")||!r.hasAttribute("scope")&&n.hasNonEmptyName())&&(p.push(o),e.potentialColHeaders.push(o))},b=0,_=c;b<_.length;b++)g(A=_[b]);for(var f=0,v=c;f<v.length;f++){var A;(A=v[f]).existsDataCell||(A.potentialColHeaders=[])}p=p.filter(function(e){return c.some(function(t){return t.potentialColHeaders.some(function(t){return t.isSameNode(e)})})})}return p.map(function(e){var t;return(null===(t=e.getNameInfo())||void 0===t?void 0:t.name)||""}).map(function(e){return e.trim()}).filter(function(e){return e.length>0}).join(", ")},e.getRowHeadersForCursor=function(t,i){if(!i&&!(i=r(t)))return"";var n=o(t,i);if(!n)return"";var l=n.cellCursor;if(!l)return"";var s=l.getElement();if(!s)return"";for(var c=[],m=n.rowIndexStart;m<n.rowIndexStart+n.rowspan;++m)c.push({potentialRowHeaders:[],existsDataCell:!1,rowIdx:m});var p=[];if(s.hasAttribute("headers"))p=s.getAttribute("headers").split(" ").map(function(e){return document.getElementById(e)}).filter(function(e){return!!e}).map(function(e){return new a.SRCursor(e)}).filter(function(t){return c.some(function(a){return u(e.getCellModel(t,i),a.rowIdx)})});else{for(var h=c.reduce(function(e,t){return Math.max(e,i[t.rowIdx].length)},0),g=0;g<h;++g)for(var b=function(e){var t=e.rowIdx;if(g>=i[t].length)return"continue";var a=i[t][g],n=a.cellCursor,r=n.getElement();if(!a||!n||n.isSameNode(l)||p.some(function(e){return n.isSameNode(e)}))return e.existsDataCell=e.existsDataCell||d(n)&&(n.hasNonEmptyName()||e.potentialRowHeaders.length>0),"continue";var o=n.clone();"rowheader"===n.getRole()?(p.push(o),e.potentialRowHeaders.push(o)):r.hasAttribute("role")||"TH"!==r.nodeName.toUpperCase()?e.existsDataCell=e.existsDataCell||d(n)&&(n.hasNonEmptyName()||e.potentialRowHeaders.length>0):("row"===r.getAttribute("scope")||"axis"===r.getAttribute("scope")||!r.hasAttribute("scope")&&n.hasNonEmptyName())&&(p.push(o),e.potentialRowHeaders.push(o))},_=0,f=c;_<f.length;_++)b(w=f[_]);for(var v=0,A=c;v<A.length;v++){var w;(w=A[v]).existsDataCell||(w.potentialRowHeaders=[])}p=p.filter(function(e){return c.some(function(t){return t.potentialRowHeaders.some(function(t){return t.isSameNode(e)})})})}return p.map(function(e){var t;return(null===(t=e.getNameInfo())||void 0===t?void 0:t.name)||""}).map(function(e){return e.trim()}).filter(function(e){return e.length>0}).join(", ")},e.isDataCell=d}(t.SRTableUtil||(t.SRTableUtil={}))},2165(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.SRUtil=void 0;var a,n=i(7011),l=i(3946);(a=t.SRUtil||(t.SRUtil={})).isModalDialogElement=function(e){if(1!==e.nodeType)return!1;var t=e;return"dialog"===n.AriaUtil.getResolvedRole(t,!0)&&"true"===t.getAttribute("aria-modal")&&l.VisUtil.isNodeVisible(e)},a.getUniqueSelector=function e(t,i){if(void 0===i&&(i=!1),t.id)return"#".concat(CSS.escape(t.id));if(t.isSameNode(document.documentElement)||t.isSameNode(document.body))return t.tagName.toLowerCase();var a=t.tagName.toLowerCase();if(t.classList.length&&!i&&(a+=Array.from(t.classList).slice(0,3).map(function(e){return".".concat(CSS.escape(e))}).join("")),!i){if(t.hasAttribute("role")&&(a+='[role="'.concat(CSS.escape(t.getAttribute("role")||""),'"]')),t.hasAttribute("aria-label")){var n=t.getAttribute("aria-label")||"";n.length<=20&&(a+='[aria-label="'.concat(CSS.escape(n),'"]'))}"input"===t.tagName.toLowerCase()&&t.hasAttribute("type")&&(a+='[type="'.concat(CSS.escape(t.getAttribute("type")||""),'"]'))}if(t.parentElement){var l=Array.from(t.parentElement.children).filter(function(e){return e.tagName===t.tagName});if(l.length>1){var r=l.indexOf(t)+1;a+=":nth-of-type(".concat(r,")")}return"".concat(e(t.parentElement,!0)," > ").concat(a)}return a}},8107(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.SRViewer=t.SROverlay=void 0;var a=i(5233),n=function(){function e(e){this.srViewer=e,this.navigationModes=[{mode:"item",label:"Item"},{mode:"tab_focus",label:"Tabbable"},{mode:"heading",label:"Heading"},{mode:"region",label:"Region"}],this.createOverlay()}return e.prototype.createDOMElement=function(e,t,i){var a=this.srViewer.viewerDoc.createElement(e);if(t)for(var n in t)a[n]=t[n];if(i)for(var n in i)a.style[n]=i[n];return a},e.prototype.createOverlay=function(){var e=this;this.container=this.createDOMElement("div",{className:"ibma-sr-overlay"},{position:"fixed",bottom:"0",left:"0",width:"100%",backgroundColor:"rgba(0, 0, 0, 0.8)",color:"white",padding:"10px",zIndex:"10000",display:"flex",flexDirection:"column",gap:"10px"});var t=this.createDOMElement("div",{},{display:"flex",flexWrap:"wrap",gap:"10px"});this.navigationModes.forEach(function(i){var a=e.createDOMElement("div",{},{display:"flex",alignItems:"center",gap:"5px",margin:"0 10px"});a.appendChild(e.createDOMElement("span",{textContent:i.label+":"},{}));var n=e.createDOMElement("button",{textContent:"◀ Prev"},{padding:"5px 10px",backgroundColor:"#444",color:"white",border:"none",borderRadius:"3px",cursor:"pointer"});n.addEventListener("click",function(){return e.srViewer.navigatePrevious(i.mode)}),a.appendChild(n);var l=e.createDOMElement("button",{textContent:"Next ▶"},{padding:"5px 10px",backgroundColor:"#444",color:"white",border:"none",borderRadius:"3px",cursor:"pointer"});l.addEventListener("click",function(){return e.srViewer.navigateNext(i.mode)}),a.appendChild(l),t.appendChild(a)});var i=this.createDOMElement("div",{},{display:"flex",alignItems:"center",gap:"5px",margin:"0 10px"}),a=this.createDOMElement("button",{textContent:"Show all"},{padding:"5px 10px",backgroundColor:"#444",color:"white",border:"none",borderRadius:"3px",cursor:"pointer"});a.addEventListener("click",function(){return e.srViewer.showAll(!0)}),i.appendChild(a);var n=this.createDOMElement("button",{textContent:"Toggle speech"},{padding:"5px 10px",backgroundColor:"#444",color:"white",border:"none",borderRadius:"3px",cursor:"pointer"});n.addEventListener("click",function(){return e.srViewer.toggleSpeech()}),i.appendChild(n),t.appendChild(i),this.resultsDisplay=this.createDOMElement("div",{textContent:"Screen reader simulation results will appear here."},{padding:"10px",backgroundColor:"rgba(255, 255, 255, 0.1)",borderRadius:"3px",minHeight:"100px",maxHeight:"50vh",fontFamily:"monospace",overflow:"auto"}),this.container.appendChild(t),this.container.appendChild(this.resultsDisplay),this.srViewer.viewerDoc.body.appendChild(this.container)},e.prototype.displayResult=function(e,t,i){var a,n,l,r,o="";e.success,o="".concat(i.toUpperCase()," ").concat(t,": ").concat(e.renderingResult.message),null===(n=null===(a=e.renderingResult.end)||void 0===a?void 0:a.getElement())||void 0===n||n.scrollIntoView(),null===(r=null===(l=e.renderingResult.start)||void 0===l?void 0:l.getElement())||void 0===r||r.scrollIntoView(),window.scrollBy(0,-200),this.resultsDisplay.innerHTML="",this.resultsDisplay.textContent=o;var s=this.createDOMElement("button",{innerText:"Debug"},{});s.addEventListener("click",function(){var t,i;console.log(null===(t=e.renderingResult.start)||void 0===t?void 0:t.getNode(),null===(i=e.renderingResult.end)||void 0===i?void 0:i.getNode())}),this.resultsDisplay.appendChild(s)},e.prototype.displayAll=function(e){for(var t=this,i=this.createDOMElement("table",{},{}),a=this.createDOMElement("tr",{},{}),n=["region","heading","item","tab_focus"],l=0,r=["Region","Heading","Item","Tabbable"];l<r.length;l++){var o=r[l];a.appendChild(this.createDOMElement("th",{scope:"col",innerText:o},{textAlign:"left",padding:".25rem",margin:"0rem",color:"white"})),i.appendChild(a)}for(var s=function(e){var a=u.createDOMElement("tr",{},{});n.forEach(function(i){a.appendChild(t.createDOMElement("td",{innerText:e[i]},{verticalAlign:"top",border:"solid white 1px",padding:".25rem",margin:"0rem",color:"white"}))}),i.appendChild(a)},u=this,d=0,c=e;d<c.length;d++)s(c[d]);this.resultsDisplay.innerHTML="",this.resultsDisplay.appendChild(i)},e.prototype.destroy=function(){this.container&&this.container.parentNode&&this.container.parentNode.removeChild(this.container)},e}();t.SROverlay=n;var l=function(){function e(e){void 0===e&&(e=document.body),this.isStreaming=!1,this.isShowingAll=!1,this.speechEnabled=!1,this.viewerDoc=e.ownerDocument,this.controller=a.SRController.getController(this.viewerDoc),this.overlay=new n(this),this.setupKeyboardHandlers(),this.setupFocusTracking(),this.setupMutationTracking()}return e.prototype.showAll=function(e){e&&(this.isShowingAll=!0);var t=a.SRController.renderStructure(this.viewerDoc);this.overlay.displayAll(t)},e.prototype.toggleSpeech=function(){this.speechEnabled=!this.speechEnabled},e.prototype.navigateNext=function(e){this.isShowingAll=!1;var t=this.controller.jumpNext(e);this.overlay.displayResult(t,e,"next"),this.speakResult(t)},e.prototype.navigatePrevious=function(e){this.isShowingAll=!1;var t=this.controller.jumpPrevious(e);this.overlay.displayResult(t,e,"previous"),this.speakResult(t)},e.prototype.setupKeyboardHandlers=function(){var e=this;this.keyboardHandler=function(t){var i=t.target;if("INPUT"!==i.tagName&&"TEXTAREA"!==i.tagName&&"SELECT"!==i.tagName)if(t.ctrlKey)e.stopSpeech();else if(!t.altKey&&!t.metaKey)switch(t.key){case"ArrowUp":t.preventDefault(),e.navigatePrevious("item");break;case" ":e.isStreaming=!0;case"ArrowDown":t.preventDefault(),e.navigateNext("item");break;case"Enter":t.preventDefault(),e.activateCurrentElement(),e.controller.setPointOfRegard(e.viewerDoc.activeElement);break;case"H":case"h":t.shiftKey?(t.preventDefault(),e.navigatePrevious("heading")):(t.preventDefault(),e.navigateNext("heading"));break;case"R":case"r":t.shiftKey?(t.preventDefault(),e.navigatePrevious("region")):(t.preventDefault(),e.navigateNext("region"));break;case"Tab":t.shiftKey?(t.preventDefault(),e.navigatePrevious("tab_focus")):(t.preventDefault(),e.navigateNext("tab_focus"))}},this.viewerDoc.addEventListener("keydown",this.keyboardHandler)},e.prototype.speakResult=function(e){var t=this;if(this.speechEnabled){var i=new SpeechSynthesisUtterance(e.renderingResult.message);i.rate=1.5;var a=this;i.addEventListener("end",function(e){a.isStreaming&&t.navigateNext("item")}),speechSynthesis.cancel(),speechSynthesis.speak(i)}},e.prototype.stopSpeech=function(){this.isStreaming=!1,speechSynthesis.cancel()},e.prototype.setupMutationTracking=function(){var e=this,t=new MutationObserver(function(i){if(e.isShowingAll&&i.filter(function(e){return 1===e.target.nodeType&&!e.target.closest(".ibma-sr-overlay")}).length>0){t.disconnect();var a=e;a.showAll(),setTimeout(function(){a.showAll(),t.observe(e.viewerDoc.documentElement,{attributes:!0,childList:!0,subtree:!0})},1e3)}});t.observe(this.viewerDoc.documentElement,{attributes:!0,childList:!0,subtree:!0})},e.prototype.setupFocusTracking=function(){var e=this;this.focusHandler=function(t){if(t.target instanceof HTMLElement){var i=t.target;if(e.overlay&&i.closest(".ibma-sr-overlay"))return;console.group("focusHandler");var a=e.controller.setPointOfRegard(i);a.success&&(e.overlay.displayResult(a,"focus","focus"),e.speakResult(a)),console.groupEnd()}},this.viewerDoc.addEventListener("focusin",this.focusHandler)},e.prototype.activateCurrentElement=function(){var e=this.controller.getPointOfRegard().getElement();if(e){var t={success:!0,renderingResult:{message:"Activating: ".concat(e.textContent||e.nodeName),start:this.controller.getPointOfRegard(),end:this.controller.getPointOfRegard()}};this.overlay.displayResult(t,"focus","focus"),this.speakResult(t),e.focus&&e.focus(),e.click()}},e.prototype.getController=function(){return this.controller},e.prototype.destroy=function(){this.viewerDoc.removeEventListener("keydown",this.keyboardHandler),this.viewerDoc.removeEventListener("focusin",this.focusHandler),this.stopSpeech(),this.overlay.destroy()},e}();t.SRViewer=l},7242(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.RULES=t.getLinkAnnouncement=t.getRoleDescription=t.quoteName=t.quoteNamePadBefore=t.quoteNamePadAfter=void 0;var a=i(8195),n=i(328),l=i(7011),r=i(9910),o=i(3864),s=i(3946);function u(e,t,i,a){return e.getName()?"".concat(c(e)).concat(t||", "):""}function d(e,t){return e.getName()?"".concat(t||", ").concat(c(e)):""}function c(e,t,i){return e.getName()?"".concat(t||'"').concat(e.getName()).concat(i||'"'):""}function m(e,t){var i=e.getElement();if(!i)return t;var a=i.getAttribute("aria-roledescription");return a&&a.trim().length>0?a.trim():t}function p(e,t){var i,a=e.getNode().href||"";i=a.startsWith(document.location.href)&&"#"===a.charAt(document.location.href.length)?"same page link":"link";var n=e.getNameInfo();return n&&!["content","text"].includes(n.nameFrom)?"tab_focus"===t?"[".concat(u(e)).concat(i,"]"):"[".concat(i).concat(d(e),"]"):"[".concat(i,"]")}function h(e,t){var i=e.getAttribute("aria-describedby");if(!i)return"";var a=i.split(/\s+/).map(function(e){return document.getElementById(e)}).filter(function(e){return!!e}).map(function(e){var t;return null===(t=e.textContent)||void 0===t?void 0:t.trim()}).filter(function(e){return!!e}).join(" ");return a&&0!==a.length?"item"===t?", ".concat(a,""):', "'.concat(a,'"'):""}function g(e){var t="";return(e.hasAttribute("disabled")||"true"===e.getAttribute("aria-disabled"))&&(t+=", disabled"),(e.hasAttribute("readonly")||"true"===e.getAttribute("aria-readonly"))&&(t+=", read only"),(e.hasAttribute("required")||"true"===e.getAttribute("aria-required"))&&(t+=", required"),"true"===e.getAttribute("aria-invalid")&&(t+=", invalid"),t}function b(e){var t=e.getElement();if(!t)return!1;for(var i=new o.DOMWalker(t,!1,t,!1);i.nextNode();)if(1===i.node.nodeType&&!i.bEndTag){var a=l.AriaUtil.getResolvedRole(i.node);if(a&&r.ARIADefinitions.designPatterns[a]&&"widget"===r.ARIADefinitions.designPatterns[a].roleType)return!0}return!1}t.quoteNamePadAfter=u,t.quoteNamePadBefore=d,t.quoteName=c,t.getRoleDescription=m,t.getLinkAnnouncement=p,t.RULES=[new n.SRRendererRule({roles:["button"],elems:[],modes:["item","button","tab_focus"],tests:[function(e,t,i){if(!e.isStartTag())return null;var a=e.getNode(),n=m(e,"button");return"true"===a.getAttribute("aria-pressed")?"[toggle ".concat(n,", pressed").concat(d(e)).concat(h(a,i),"]"):null},function(e,t,i){if(!e.isStartTag())return null;var a=e.getNode(),n=m(e,"button");return"false"===a.getAttribute("aria-pressed")?"[toggle ".concat(n,", not pressed").concat(d(e)).concat(h(a,i),"]"):null},function(e,t,i){if(!e.isEndTag()){var a="",n=e.getElement(),l=m(e,"button");return["menu","true"].includes(n.getAttribute("aria-haspopup"))&&(a+=", menu"),n.hasAttribute("aria-expanded")&&(a+=", ".concat("true"===n.getAttribute("aria-expanded")?"expanded":"collapsed")),a+=g(n),"[".concat(u(e)).concat(l).concat(a).concat(h(n,i),"]")}},function(e){if(e.isEndTag())return""}]}),new n.SRRendererRule({roles:["checkbox"],elems:[],modes:["item","checkbox","tab_focus"],tests:[function(e,t,i){if(e.isStartTag()){var a=e.getNode(),n=m(e,"checkbox"),l="";return l="mixed"===a.getAttribute("aria-checked")?"half checked":(a.hasAttribute("aria-checked")?"true"===a.getAttribute("aria-checked"):a.checked)?"checked":"not checked",l+=g(e.getElement()),"[".concat(n,", ").concat(l).concat(d(e)).concat(h(e.getElement(),i),"]")}return""}]}),new n.SRRendererRule({roles:["cell","columnheader","rowheader"],elems:[],modes:["item","table"],tests:[function(e){var t;if(!e.isStartTag())return null;var i=e.getElement();if(!i)return null;var a=(null===(t=i.textContent)||void 0===t?void 0:t.trim())||"",n=new o.DOMWalker(i,!1,i,!1),s=a.length>0;if(!s)for(;n.nextNode();)if(1===n.node.nodeType&&!n.bEndTag){var u=n.node,d=l.AriaUtil.getResolvedRole(u);if(d&&r.ARIADefinitions.designPatterns[d]){s=!0;break}if("IMG"===u.nodeName.toUpperCase()&&u.hasAttribute("alt")){s=!0;break}}return s?null:"[blank]"}]}),new n.SRRendererRule({roles:["combobox"],elems:[],modes:["item","combo","tab_focus"],tests:[function(e){if(e.isEndTag())return"";var t=m(e,"combo box"),i=e.getElement(),n="";if("SELECT"===e.getNode().nodeName.toUpperCase()){n=", collapsed";var l=e.getElement(),r=l.selectedIndex>=0?l.options[l.selectedIndex]:null,o="";return r&&(o=d(new a.SRCursor(r,!1),", ")),n+=g(i),"[".concat(u(e)).concat(t).concat(n).concat(o,"]")}return"INPUT"!==e.getNode().nodeName.toUpperCase()||e.getElement().hasAttribute("role")?(i.hasAttribute("aria-expanded")&&(n=", ".concat("true"===i.getAttribute("aria-expanded")?"expanded":"collapsed"),i.hasAttribute("aria-autocomplete")&&(n+=", has auto complete"),n+=", editable, opens list"),n+=g(i),"[".concat(u(e)).concat(t).concat(n,"]")):(n=g(i),"[".concat(u(e)).concat(t,", has auto complete, editable, opens list").concat(n,"]"))}]}),new n.SRRendererRule({roles:["default"],elems:[],modes:["item"],tests:[function(e){var t;return e.isStartTag()?"!!<".concat(e.getRole(),">").concat((null===(t=e.getNameInfo())||void 0===t?void 0:t.name)+"","!!"):"!!</".concat(e.getRole(),">!!")}]}),new n.SRRendererRule({roles:["deletion"],elems:[],modes:["item"],tests:[function(e){return e.isStartTag()?"[deleted]":""}]}),new n.SRRendererRule({roles:["dialog"],elems:[],modes:["item"],tests:[function(e){return e.isEndTag()?"[End of dialog]":"[Start of dialog".concat(d(e))}]}),new n.SRRendererRule({roles:["document","generic"],elems:[],modes:["item"],tests:[function(){return""}]}),new n.SRRendererRule({roles:["graphics-document"],elems:[],modes:["item","image"],tests:[function(e){var t,i;return e.isStartTag()&&!(null===(t=e.getNameInfo())||void 0===t?void 0:t.name)&&""!==(null===(i=e.getNameInfo())||void 0===i?void 0:i.name)?e.getCurrentOrParentByRoleClone(["heading","link"])&&s.VisUtil.isNodeHiddenFromAT(e.getElement())?"":"[Unlabeled graphic]":null},function(e){var t;return e.isStartTag()&&""===(null===(t=e.getNameInfo())||void 0===t?void 0:t.name)?"":null},function(e){var t;return e.isStartTag()&&(null===(t=e.getNameInfo())||void 0===t?void 0:t.name)&&"[graphic".concat(d(e),"]")||null},function(e){return e.isEndTag()?"":null}]}),new n.SRRendererRule({roles:["heading"],elems:[],modes:["item","tab_focus"],tests:[function(e,t,i){if("tab_focus"===i&&e.isStartTag())return"";if("item"===i&&e.isEndTag())return"";var a,n=e.getElement();a=n.ariaLevel?n.ariaLevel:"heading"===n.getAttribute("role")?"2":n.nodeName.substring(1);var l=e.getNameInfo();return l&&!["content","text"].includes(l.nameFrom)||(n.textContent||"").trim()?l&&!["content","text"].includes(l.nameFrom)?"[heading level ".concat(a).concat(d(e),"]"):"[heading level ".concat(a,"]"):""}]}),new n.SRRendererRule({roles:["heading"],elems:[],modes:["heading","h1","h2","h3","h4","h5","h6"],tests:[function(e){if(e.isStartTag()){var t,i=e.getNode();t=i.ariaLevel?i.ariaLevel:"heading"===i.getAttribute("role")?"2":i.nodeName.substring(1);var a=e.getNameInfo();return a&&!["content","text"].includes(a.nameFrom)||(i.textContent||"").trim()?"[".concat(u(e),"heading level ").concat(t,"]"):""}return""}]}),new n.SRRendererRule({roles:["img"],elems:[],modes:["item","image"],tests:[function(e){var t,i,a;return e.isEndTag()?"":(null===(t=e.getNameInfo())||void 0===t?void 0:t.name)||""===(null===(i=e.getNameInfo())||void 0===i?void 0:i.name)?""===(null===(a=e.getNameInfo())||void 0===a?void 0:a.name)?"":"[graphic".concat(d(e),"]"):e.getCurrentOrParentByRoleClone(["heading","link"])&&s.VisUtil.isNodeHiddenFromAT(e.getElement())?"":"[Unlabeled graphic]"}]}),new n.SRRendererRule({roles:["insertion"],elems:[],modes:["item"],tests:[function(e){return e.isStartTag()?"[inserted]":""}]}),new n.SRRendererRule({roles:["link"],elems:[],modes:["item","region","link","tab_focus"],tests:[function(e,t,i){var a;return e.isStartTag()&&!["content","text"].includes(null===(a=e.getNameInfo())||void 0===a?void 0:a.nameFrom)?p(e,i):null}]}),new n.SRRendererRule({roles:["listitem"],elems:[],modes:["item"],tests:[function(e){for(var t,i,a,n=o.DOMWalker.parentNode(e.getNode());void 0===i&&n;)1===n.nodeType&&((p=n).hasAttribute("role")?"list"===p.getAttribute("role")&&(i=!1,a=p):"UL"===p.nodeName.toUpperCase()?(i=!1,a=p):"OL"===p.nodeName.toUpperCase()&&(i=!0,a=p)),n=o.DOMWalker.parentNode(n);var l=b(e)?"":(null===(t=e.getNameInfo())||void 0===t?void 0:t.name)||"",r="";if(i){var s=1;if(a&&"OL"===a.nodeName.toUpperCase()&&a.hasAttribute("start")){var u=parseInt(a.getAttribute("start")||"1",10);s=isNaN(u)?1:u}for(var d=e.getElement(),c=o.DOMWalker.previousSiblingNotOwnedBySlot(d);c;){if(1===c.nodeType){var m=c;"listitem"!==m.getAttribute("role")&&"LI"!==m.nodeName.toUpperCase()||s++}c=o.DOMWalker.previousSiblingNotOwnedBySlot(c)}r=e.isStartTag()?"".concat(s,". ").concat(l):""}else{var p;r="LI"===(p=e.getElement()).nodeName.toUpperCase()&&"none"===window.getComputedStyle(p).listStyleType||"LI"!==p.nodeName.toUpperCase()?e.isStartTag()?"".concat(l):"":e.isStartTag()?"[bullet] ".concat(l):""}return r}]}),new n.SRRendererRule({roles:["math"],elems:[],modes:["item"],tests:[function(e){return e.isEndTag()?"[math content]":""}]}),new n.SRRendererRule({roles:["menuitem"],elems:[],modes:["item","tab_focus","region"],tests:[function(e){var t="";if(e.isStartTag()){var i="",a=e.getElement();"true"===a.getAttribute("aria-haspopup")&&(i+=", sub-menu"),a.hasAttribute("aria-expanded")&&(i+=", ".concat("true"===a.getAttribute("aria-expanded")?"expanded":"collapsed")),t="[menu".concat(i);var n=e.getNameInfo();n&&!["content","text"].includes(n.nameFrom)&&(t+=d(e)),t+="]"}return t}]}),new n.SRRendererRule({roles:["meter"],elems:[],modes:["item","tab_focus"],tests:[function(e){return e.isStartTag()?"[progress bar, ".concat(e.getNode().value,"]"):""}]}),new n.SRRendererRule({roles:["progressbar"],elems:[],modes:["item"],tests:[function(e){return e.isStartTag()?"[progress bar, ".concat(e.getNode().value,"]"):""}]}),new n.SRRendererRule({roles:["radio"],elems:[],modes:["item","tab_focus"],tests:[function(e,t,i){if(e.isStartTag()){var a,n=m(e,"radio button");a=e.getElement().hasAttribute("aria-checked")?"true"===e.getElement().getAttribute("aria-checked"):e.getNode().checked;var l=g(e.getElement());return"[".concat(n,", ").concat(a?"checked":"not checked").concat(l).concat(d(e)).concat(h(e.getElement(),i),"]")}return""}]}),new n.SRRendererRule({roles:["searchbox"],elems:[],modes:["item","tab_focus"],tests:[function(e){return e.isStartTag()?"[".concat(u(e),"edit]"):""}]}),new n.SRRendererRule({roles:["separator"],elems:[],modes:["item"],tests:[function(e){return e.isStartTag()?"[separator]":""}]}),new n.SRRendererRule({roles:["slider"],elems:[],modes:["item","tab_focus"],tests:[function(e,t,i){if(!e.isStartTag())return"";var a=m(e,"slider"),n=e.getElement(),l=n.hasAttribute("aria-valuenow")?n.getAttribute("aria-valuenow"):e.getNode().value;return"[".concat(u(e)).concat(a,", ").concat(l).concat(h(e.getElement(),i),"]")}]}),new n.SRRendererRule({roles:["spinbutton"],elems:[],modes:["item","tab_focus"],tests:[function(e,t,i){if(!e.isStartTag())return"";var a=m(e,"spinbutton");return"[".concat(u(e)).concat(a,", editable").concat(h(e.getElement(),i),"]")}]}),new n.SRRendererRule({roles:["tab"],elems:[],modes:["item","tab_focus"],tests:[function(e){if(!e.isStartTag())return"";var t=m(e,"tab");return"[".concat(t).concat("true"===e.getNode().getAttribute("aria-selected")?", selected":"").concat(d(e),"]")}]}),new n.SRRendererRule({roles:["tablist"],elems:[],modes:["item"],tests:[function(e){return null===e.getNameInfo()?null:e.isStartTag()?"[group start".concat(d(e),"]"):"[group end".concat(d(e),"]")}]}),new n.SRRendererRule({roles:["tabpanel"],elems:[],modes:["item"],tests:[function(e){return null===e.getNameInfo()?null:e.isStartTag()?"[Tab panel start".concat(d(e),"]"):"[Tab panel end".concat(d(e),"]")}]}),new n.SRRendererRule({roles:["text"],elems:[],modes:["item","link","tab_focus","region"],tests:[function(e){var t,i,a,n;if(e.isEndTag()||!(null===(t=e.getParentElement())||void 0===t?void 0:t.getElement()))return null;var l=null===(i=e.getParentElement())||void 0===i?void 0:i.getElement();return"line-through"===l.ownerDocument.defaultView.getComputedStyle(l).textDecorationLine?"[strikethrough] ".concat((null===(a=e.getNameInfo())||void 0===a?void 0:a.name)+""," [end strikethrough]"):"".concat((null===(n=e.getNameInfo())||void 0===n?void 0:n.name)+"")}]}),new n.SRRendererRule({roles:["text"],elems:[],modes:["heading"],tests:[function(e){return""}]}),new n.SRRendererRule({roles:["textbox"],elems:[],modes:["item","tab_focus"],tests:[function(e,t,i){var a,n=e.getElement();if(e.isEndTag())return"item"===i&&"TEXTAREA"===n.nodeName.toUpperCase()?"[out of edit]":"";if(!e.isStartTag())return"";var l="";n.hasAttribute("placeholder")&&n.getAttribute("placeholder").trim().length>0&&(l+=", placeholder: ".concat(n.getAttribute("placeholder"))),l+=g(n);var r="TEXTAREA"===n.nodeName.toUpperCase()||"true"===n.getAttribute("aria-multiline"),o=h(n,i);if(r){var s="tab_focus"===i?null===(a=n.textContent)||void 0===a?void 0:a.trim():"",d=s?" ".concat(s):"";return"[".concat(u(e),"edit, multiline").concat(l).concat(o,"]").concat(d)}return"[".concat(u(e),"edit").concat(l).concat(o,"]")}]}),new n.SRRendererRule({roles:["treeitem"],elems:[],modes:["item","tab_focus"],tests:[function(e){if(e.isEndTag())return"";var t=e.getElement(),i="[treeview item";"true"===t.getAttribute("aria-selected")&&(i+=", selected"),t.hasAttribute("aria-expanded")&&(i+="true"===t.getAttribute("aria-expanded")?", expanded":", collapsed");var a=t.getAttribute("aria-level");if(a)i+=", level ".concat(a);else{for(var n=1,r=o.DOMWalker.parentElement(t);r;){var s=l.AriaUtil.getResolvedRole(r);if("group"===s||"tree"===s)for(var u=o.DOMWalker.parentElement(r);u;){var d=l.AriaUtil.getResolvedRole(u);if("treeitem"===d){n++;break}if("tree"===d)break;u=o.DOMWalker.parentElement(u)}r=o.DOMWalker.parentElement(r)}n>1&&(i+=", level ".concat(n))}var c=t.getAttribute("aria-posinset"),m=t.getAttribute("aria-setsize");if(!c||!m){var p=0,h=0,g=o.DOMWalker.parentElement(t);if(g)for(var b=o.DOMWalker.firstChildNotOwnedBySlot(g);b;){if(1===b.nodeType){var _=b;"treeitem"===l.AriaUtil.getResolvedRole(_)&&(h++,_===t&&(p=h))}b=b.nextSibling}c=p.toString(),m=h.toString()}return i+", ".concat(c," of ").concat(m,"] ")}]}),new n.SRRendererRule({roles:[],elems:["BODY"],modes:["item","tab_focus"],tests:[function(e){var t=e.getNode().ownerDocument.title;return e.isEndTag()?"[End of document".concat(t.trim().length>0?": "+t.trim():"","]"):"[Start of document".concat(t.trim().length>0?": "+t.trim():"","]")}]}),new n.SRRendererRule({roles:[],elems:["IFRAME"],modes:["item","tab_focus"],tests:[function(e){var t=function(e){try{return null!==(e.contentDocument||e.contentWindow.document)}catch(e){return!1}}(e.getNode())?"":"{Emulator unable to access frame}";return e.isEndTag()?"":t}]}),new n.SRRendererRule({roles:[],elems:["BR"],modes:["item"],tests:[function(e){try{for(var t=e.clone();t.previous(function(){return!0})&&"BR"!==t.getNode().nodeName.toUpperCase()&&t.getNameInfo()&&0===t.getNameInfo().name.trim().length;);return"BR"===t.getNode().nodeName.toUpperCase()?"[blank]":null}catch(e){console.error(e)}}]}),new n.SRRendererRule({roles:[],elems:["DL"],modes:["item"],tests:[function(e){return""}]}),new n.SRRendererRule({roles:[],elems:["INPUT"],modes:["item","tab_focus"],tests:[function(e,t,i){var a;return e.isStartTag()&&"password"===(null===(a=e.getElement())||void 0===a?void 0:a.getAttribute("type"))&&"[".concat(u(e),"edit, protected").concat(h(e.getElement(),i),"]")||null},function(e,t,i){var a,n;if(e.isStartTag()&&"file"===(null===(a=e.getElement())||void 0===a?void 0:a.getAttribute("type"))){var l=(null===(n=e.getElement())||void 0===n?void 0:n.value)||"";return l=""===l?"No file chosen":l.substring(12),"[".concat(u(e),"button").concat(h(e.getElement(),i),"] [").concat(u(e)).concat(l,"]")}return null},function(e,t,i){var a;if(e.isStartTag()&&"color"===(null===(a=e.getElement())||void 0===a?void 0:a.getAttribute("type"))){var n=e.getElement().value,l=(100*Number("0x".concat(n.substring(1,3)))/Number("0xff")).toFixed(0),r=(100*Number("0x".concat(n.substring(3,5)))/Number("0xff")).toFixed(0),o=(100*Number("0x".concat(n.substring(5)))/Number("0xff")).toFixed(0);return"[".concat(u(e),"clickable").concat(h(e.getElement(),i),"] [").concat(l,"% red ").concat(r,"% green ").concat(o,"% blue]")}return null},function(e,t,i){var a;if(e.isStartTag()&&"month"===(null===(a=e.getElement())||void 0===a?void 0:a.getAttribute("type"))){var n=e.getElement().value,l="0",r="0";if(n.trim().length>0){var o=new Date(n);l=""+o.getFullYear(),r=""+(o.getMonth()+1)}return"[".concat(u(e),"clickable").concat(h(e.getElement(),i),"] [spin button, ").concat(r,"] [spin button, ").concat(l,"] [menu button] [subMenu] Show month picker")}return null},function(e,t,i){var a;if(e.isStartTag()&&"date"===(null===(a=e.getElement())||void 0===a?void 0:a.getAttribute("type"))){var n=e.getElement().value,l="0",r="0",o="0";if(n.trim().length>0){var s=new Date(n);l=""+s.getFullYear(),r=""+(s.getMonth()+1),o=""+s.getDate()}return"[".concat(u(e),"clickable").concat(h(e.getElement(),i),"] [spin button, ").concat(r,"] / [spin button, ").concat(o,"] / [spin button, ").concat(l,"] [menu button] [subMenu] Show date picker")}return null},function(e,t,i){var a;if(e.isStartTag()&&"datetime-local"===(null===(a=e.getElement())||void 0===a?void 0:a.getAttribute("type"))){var n=e.getElement().value,l="0",r="0",o="0",s="0",d="0",c="0";if(n.trim().length>0){var m=new Date(n);l=""+m.getFullYear(),r=""+(m.getMonth()+1),o=""+m.getDate(),s=0===m.getHours()||12===m.getHours()?"12":m.getHours()<12?""+m.getHours():""+(m.getHours()-12),d=""+m.getMinutes(),c=m.getHours()>=12?"pm":"am"}return"[".concat(u(e),"clickable").concat(h(e.getElement(),i),"] [spin button, ").concat(r,"] / [spin button, ").concat(o,"] / [spin button, ").concat(l,"] [spin button, ").concat(s,"] : [spin button, ").concat(d,"] [spin button, ").concat(c,"] [menu button] [subMenu] Show local date and time picker")}return null},function(e,t,i){var a;if(e.isStartTag()&&"time"===(null===(a=e.getElement())||void 0===a?void 0:a.getAttribute("type"))){var n=e.getElement().value,l="0",r="0",o="0";if(n.trim().length>0){var s=n.split(":"),d=parseInt(s[0]);l=0===d||12===d?"12":d<12?""+d:""+(d-12),r=s[1],o=d>=12?"pm":"am"}return"[".concat(u(e),"grouping clickable").concat(h(e.getElement(),i)," [spin button, ").concat(l,"] : [spin button, ").concat(r,"] [spin button, ").concat(o,"] [menu button] [subMenu] Show time picker [out of grouping]")}return null},function(e,t,i){var a;if(e.isStartTag()&&"week"===(null===(a=e.getElement())||void 0===a?void 0:a.getAttribute("type"))){var n=e.getElement().value,l="0",r="0";if(n.trim().length>0){var o=n.split(/-W/);l=o[0],r=o[1]}return"[".concat(u(e),"clickable").concat(h(e.getElement(),i),"] [spin button, ").concat(r,"], [spin button, ").concat(l,"] [menu button] [subMenu] Show week picker")}return null},function(e){var t;return"hidden"===(null===(t=e.getElement())||void 0===t?void 0:t.getAttribute("type"))?"":null},function(e){return e.isStartTag()&&"!![".concat(u(e),"input!!]").concat(e.getElement().outerHTML)||null}]}),new n.SRRendererRule({roles:[],elems:["LI"],modes:["item"],tests:[function(e){var t,i=b(e)?"":(null===(t=e.getNameInfo())||void 0===t?void 0:t.name)||"",a=e.getElement();return"none"===window.getComputedStyle(a).listStyleType?e.isStartTag()?"".concat(i):"":e.isStartTag()?"[bullet] ".concat(i):""}]}),new n.SRRendererRule({roles:[],elems:["MFRAC"],modes:["item"],tests:[function(e){return e.isStartTag()?"[fraction]":"[end fraction]"}]}),new n.SRRendererRule({roles:[],elems:["MROW"],modes:["item"],tests:[function(e){var t;if(!e.isStartTag()){var i=e.getCurrentOrParentByRoleClone([],["mfrac"]);return i&&(null===(t=i.getElement().querySelectorAll("mrow")[0])||void 0===t?void 0:t.isSameNode(e.getNode()))?"[over]":void 0}}]}),new n.SRRendererRule({roles:[],elems:["MSQRT"],modes:["item"],tests:[function(e){return e.isStartTag()?"[square root]":"[end root]"}]}),new n.SRRendererRule({roles:[],elems:["MSUP"],modes:["item"],tests:[function(e){var t,i;if(!e.isEndTag()){var a=(null===(t=e.getElement().querySelector("mi"))||void 0===t?void 0:t.innerHTML)||"",n=(null===(i=e.getElement().querySelector("mn"))||void 0===i?void 0:i.innerHTML)||"";return"2"===n?"".concat(a," [squared]"):"3"===n?"".concat(a," [cubed]"):"".concat(a," [to the ").concat(n,"]")}}]}),new n.SRRendererRule({roles:["article","banner","blockquote","caption","cell","code","columnheader","complementary","contentinfo","figure","form","group","list","main","mark","navigation","region","row","rowheader","search","table","toolbar"],elems:[],modes:["item"],tests:[function(e){return""}]}),new n.SRRendererRule({roles:["paragraph","rowgroup","status","strong","subscript","superscript","term","time","none","presentation"],elems:[],modes:["item"],tests:[function(e){return""}]})]},8485(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.RULES=void 0;var a=i(328),n=i(369),l=i(7242),r=i(7011),o=i(9910),s=i(7139);function u(e,t){var i;t&&"#text"===(null===(i=t.getNode())||void 0===i?void 0:i.nodeName)&&(t=t.clone()).previous(function(){return!0});var a=n.SRTableUtil.getTableModel(e),l=n.SRTableUtil.getCellModel(t,a),r=n.SRTableUtil.getCellModel(e,a);if(!r)return"";var o=[];if(!l||l.rowIndexStart!==r.rowIndexStart||l.rowspan!==r.rowspan){var s=n.SRTableUtil.getRowHeadersForCursor(e,a),u=s&&s.trim().length>0?'"'.concat(s,'", '):"";o.push("[".concat(u,"row ").concat(r.rowIndexStart+1).concat(r.rowspan>1?" through "+(r.rowIndexStart+r.rowspan):"","]"))}if(!l||l.colIndexStart!==r.colIndexStart||l.colspan!==r.colspan){var d=n.SRTableUtil.getColumnHeadersForCursor(e,a);u=d&&d.trim().length>0?'"'.concat(d,'", '):"",o.push("[".concat(u,"column ").concat(r.colIndexStart+1).concat(r.colspan>1?" through "+(r.colIndexStart+r.colspan):"","]"))}return o.join(" ")}t.RULES=[new a.SRRendererRule({roles:["article"],elems:[],modes:["item","article","tab_focus"],tests:[function(e,t,i){if("tab_focus"===i&&!s.CommonUtil.isTabbable(e.getNode()))return null;var a=(0,l.getRoleDescription)(e,"article");return"[".concat((0,l.quoteNamePadAfter)(e)).concat(a,"]")}]}),new a.SRRendererRule({roles:["banner"],elems:[],modes:["item","region","tab_focus"],tests:[function(e,t,i){if("tab_focus"===i&&!s.CommonUtil.isTabbable(e.getNode()))return null;var a=(0,l.getRoleDescription)(e,"banner region");return"[".concat((0,l.quoteNamePadAfter)(e)).concat(a,"]")}]}),new a.SRRendererRule({roles:["blockquote"],elems:[],modes:["item","region"],tests:[function(e){return"[blockquote]"}]}),new a.SRRendererRule({roles:["caption"],elems:[],modes:["item","region"],tests:[function(e){return"[caption]"}]}),new a.SRRendererRule({roles:["cell"],elems:[],modes:["item","table"],tests:[u]}),new a.SRRendererRule({roles:["columnheader"],elems:[],modes:["item","table"],tests:[u]}),new a.SRRendererRule({roles:["complementary"],elems:[],modes:["item","region","tab_focus"],tests:[function(e,t,i){return"tab_focus"!==i||s.CommonUtil.isTabbable(e.getNode())?"[".concat((0,l.quoteNamePadAfter)(e),"complementary region]"):null}]}),new a.SRRendererRule({roles:["contentinfo"],elems:[],modes:["item","region","tab_focus"],tests:[function(e,t,i){return"tab_focus"!==i||s.CommonUtil.isTabbable(e.getNode())?"[".concat((0,l.quoteNamePadAfter)(e),"content info region]"):null}]}),new a.SRRendererRule({roles:["figure"],elems:[],modes:["item","region"],tests:[function(e){return"[figure]"}]}),new a.SRRendererRule({roles:["form"],elems:[],modes:["item","region","formcontrol"],tests:[function(e){return null===e.getNameInfo()?"[section]":"[".concat((0,l.quoteNamePadAfter)(e),"form region]")}]}),new a.SRRendererRule({roles:["group"],elems:[],modes:["item","region"],tests:[function(e){var t;return null===e.getNameInfo()?null:"SELECT"===(null===(t=e.getCurrentOrParentByRoleClone(["combobox"],["select"]))||void 0===t?void 0:t.getNode().nodeName.toUpperCase())?"":"DETAILS"===e.getNode().nodeName.toUpperCase()?"[button, ".concat(e.getElement().hasAttribute("open")?"expanded":"collapsed","]"):"[grouping".concat((0,l.quoteNamePadBefore)(e),"]")}]}),new a.SRRendererRule({roles:["group"],elems:[],modes:["tab_focus"],tests:[function(e){var t;return null===e.getNameInfo()?null:"SELECT"===(null===(t=e.getCurrentOrParentByRoleClone(["combobox"],["select"]))||void 0===t?void 0:t.getNode().nodeName.toUpperCase())?"":"DETAILS"===e.getNode().nodeName.toUpperCase()?"[button, ".concat(e.getElement().hasAttribute("open")?"expanded":"collapsed","]"):""}]}),new a.SRRendererRule({roles:["list"],elems:[],modes:["item","list"],tests:[function(e){for(var t,i=e.getNode(),a=document.evaluate(".//li | .//*[@role='listitem']",i,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null),n=0,s=0;s<a.snapshotLength;s++){for(var u=!1,d=!1,c=a.snapshotItem(s).parentElement;c&&c!==i;){var m=r.AriaUtil.getResolvedRole(c);if("list"===m||"UL"===c.nodeName.toUpperCase()||"OL"===c.nodeName.toUpperCase()){u=!0;break}if(m&&(null===(t=o.ARIADefinitions.designPatterns[m])||void 0===t?void 0:t.presentationalChildren)){d=!0;break}c=c.parentElement}u||d||n++}return 0===n?null:"[".concat((0,l.quoteNamePadAfter)(e),"list of ").concat(n," items]")}]}),new a.SRRendererRule({roles:["main"],elems:[],modes:["item","region","tab_focus"],tests:[function(e,t,i){return"tab_focus"!==i||s.CommonUtil.isTabbable(e.getNode())?"[".concat((0,l.quoteNamePadAfter)(e),"main region]"):null}]}),new a.SRRendererRule({roles:["menubar"],elems:[],modes:["item","list"],tests:[function(e){var t=e.getNode(),i=document.evaluate(".//*[@role='menuitem']",t,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null),a=document.evaluate(".//*[@role='menubar']//*[@role='menuitem']|.//*[@role='menu']//*[@role='menuitem']",t,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null);console.log("MENUBAR",e.isEndTag()?"/":"",e.getNode()),console.log(i,a);var n=i.snapshotLength-a.snapshotLength;return 0===n?null:"[".concat((0,l.quoteNamePadAfter)(e),"menubar with ").concat(n," items]")}]}),new a.SRRendererRule({roles:["navigation"],elems:[],modes:["item","region","tab_focus"],tests:[function(e,t,i){if("tab_focus"===i&&!s.CommonUtil.isTabbable(e.getNode()))return null;var a=(0,l.getRoleDescription)(e,"navigation region");return"[".concat((0,l.quoteNamePadAfter)(e)).concat(a,"]")}]}),new a.SRRendererRule({roles:["radiogroup"],elems:[],modes:["item","region","tab_focus"],tests:[function(e){return null===e.getNameInfo()?null:"[grouping".concat((0,l.quoteNamePadBefore)(e),"]")}]}),new a.SRRendererRule({roles:["region"],elems:[],modes:["item","region","tab_focus"],tests:[function(e,t,i){if(null===e.getNameInfo())return null;if("tab_focus"===i&&!s.CommonUtil.isTabbable(e.getNode()))return null;var a=(0,l.getRoleDescription)(e,"region");return"[".concat((0,l.quoteNamePadAfter)(e)).concat(a,"]")}]}),new a.SRRendererRule({roles:["row"],elems:[],modes:["item","table"],tests:[function(){return""}]}),new a.SRRendererRule({roles:["rowheader"],elems:[],modes:["item","table"],tests:[u]}),new a.SRRendererRule({roles:["search"],elems:[],modes:["item","region","tab_focus"],tests:[function(e,t,i){if("tab_focus"===i&&!s.CommonUtil.isTabbable(e.getNode()))return null;var a=(0,l.getRoleDescription)(e,"search region");return"[".concat((0,l.quoteNamePadAfter)(e)).concat(a,"]")}]}),new a.SRRendererRule({roles:["table"],elems:[],modes:["item","table"],tests:[function(e){for(var t=e.clone();"table"!==t.getRole()&&t.previous(function(){return!0}););var i=t.getNode(),a=0,n=0;if(t.getNode().firstChild)for(var r=!1;t.next(function(){return!0})&&!t.getNode().isSameNode(i);){var o=t.getRole();if(t.isStartTag()){if("row"===o)++a;else if(!r&&["cell","rowheader","columnheader"].includes(o)){var s=t.getNode();n+=parseInt(s.getAttribute("colspan")||"1")}}else"row"===o&&(r=!0)}return"[table with ".concat(a," ").concat(1===a?"row":"rows"," and ").concat(n," ").concat(1===n?"column":"columns").concat((0,l.quoteNamePadBefore)(e),"]")}]}),new a.SRRendererRule({roles:["toolbar"],elems:[],modes:["item","region","tab_focus"],tests:[function(e,t,i){return"tab_focus"!==i||s.CommonUtil.isTabbable(e.getNode())?"[".concat((0,l.quoteNamePadAfter)(e),"toolbar]"):null}]}),new a.SRRendererRule({roles:[],elems:["DL"],modes:["item","list"],tests:[function(e){var t=e.getNode(),i=document.evaluate(".//dt",t,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null).snapshotLength;return"[".concat((0,l.quoteNamePadAfter)(e),"definition list of ").concat(i," terms]")}]}),new a.SRRendererRule({roles:[],elems:["FIGCAPTION"],modes:["item"],tests:[function(e){return"[caption]"}]}),new a.SRRendererRule({roles:[],elems:["MARK"],modes:["item"],tests:[function(e){return"[highlighted]"}]}),new a.SRRendererRule({roles:["article","banner","blockquote","caption","cell","columnheader","complementary","contentinfo","figure","form","group","region","row","rowheader","search","toolbar","list","main","navigation","table"],elems:[],modes:["heading"],tests:[function(){return""}]})]},2099(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.RULES=void 0;var a=i(328),n=i(7242);t.RULES=[new a.SRRendererRule({roles:["article"],elems:[],modes:["item"],tests:[function(e){var t=(0,n.getRoleDescription)(e,"article");return"[out of ".concat(t,"]")}]}),new a.SRRendererRule({roles:["banner"],elems:[],modes:["item"],tests:[function(e){var t=(0,n.getRoleDescription)(e,"banner region");return"[out of ".concat(t,"]")}]}),new a.SRRendererRule({roles:["blockquote"],elems:[],modes:["item"],tests:[function(e){return"[out of blockquote]"}]}),new a.SRRendererRule({roles:["caption"],elems:[],modes:["item"],tests:[function(e){return"[out of caption]"}]}),new a.SRRendererRule({roles:["complementary"],elems:[],modes:["item"],tests:[function(e){var t=(0,n.getRoleDescription)(e,"complementary region");return"[out of ".concat(t,"]")}]}),new a.SRRendererRule({roles:["contentinfo"],elems:[],modes:["item"],tests:[function(e){var t=(0,n.getRoleDescription)(e,"content info region");return"[out of ".concat(t,"]")}]}),new a.SRRendererRule({roles:["figure"],elems:[],modes:["item","region"],tests:[function(e){return"[out of figure]"}]}),new a.SRRendererRule({roles:["form"],elems:[],modes:["item","region","formcontrol"],tests:[function(e){return null===e.getNameInfo()?"[out of section]":"[out of form]"}]}),new a.SRRendererRule({roles:["group"],elems:[],modes:["item"],tests:[function(e){var t;return null===e.getNameInfo()?null:"SELECT"===(null===(t=e.getCurrentOrParentByRoleClone(["combobox"],["select"]))||void 0===t?void 0:t.getNode().nodeName.toUpperCase())?"":"[out of grouping]"}]}),new a.SRRendererRule({roles:["list"],elems:[],modes:["item"],tests:[function(e){var t=e.getNode(),i=document.evaluate(".//li | .//*[@role='listitem']",t,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null),a=document.evaluate(".//ul//li|.//ul//*[@role='listitem']|.//ol//li|.//ol//*[@role='listitem']|.//*[@role='list']//li|.//*[@role='list']//*[@role='listitem']",t,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null);return 0===i.snapshotLength-a.snapshotLength?null:"[".concat((0,n.quoteNamePadAfter)(e),"out of list]")}]}),new a.SRRendererRule({roles:["main"],elems:[],modes:["item"],tests:[function(e){var t=(0,n.getRoleDescription)(e,"main region");return"[out of ".concat(t,"]")}]}),new a.SRRendererRule({roles:["menubar"],elems:[],modes:["item","list"],tests:[function(e){return"[out of menubar]"}]}),new a.SRRendererRule({roles:["navigation"],elems:[],modes:["item"],tests:[function(e){var t=(0,n.getRoleDescription)(e,"navigation region");return"[out of ".concat(t,"]")}]}),new a.SRRendererRule({roles:["radiogroup"],elems:[],modes:["item","region","tab_focus"],tests:[function(e){return"[out of grouping]"}]}),new a.SRRendererRule({roles:["region"],elems:[],modes:["item"],tests:[function(e){if(null===e.getNameInfo())return null;var t=(0,n.getRoleDescription)(e,"region");return"[out of ".concat(t,"]")}]}),new a.SRRendererRule({roles:["search"],elems:[],modes:["item"],tests:[function(e){var t=(0,n.getRoleDescription)(e,"search region");return"[out of ".concat(t,"]")}]}),new a.SRRendererRule({roles:["table"],elems:[],modes:["item"],tests:[function(e){return"[out of table]"}]}),new a.SRRendererRule({roles:["toolbar"],elems:[],modes:["item"],tests:[function(e){return"[out of toolbar]"}]}),new a.SRRendererRule({roles:[],elems:["ABBR"],modes:["item"],tests:[function(e){return e.getElement().hasAttribute("title")?"[".concat(e.getElement().getAttribute("title"),"]"):null}]}),new a.SRRendererRule({roles:[],elems:["DL"],modes:["item"],tests:[function(e){return"[out of definition list]"}]}),new a.SRRendererRule({roles:[],elems:["FIGCAPTION"],modes:["item"],tests:[function(e){return"[out of caption]"}]}),new a.SRRendererRule({roles:[],elems:["MARK"],modes:["item"],tests:[function(e){return"[out of highlighted]"}]}),new a.SRRendererRule({roles:["group","article","banner","blockquote","caption","complementary","contentinfo","figure","form","list","region","main","navigation","search","table","toolbar"],elems:[],modes:["region","heading"],tests:[function(){return""}]})]},2151(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.CONTAINER_EXIT_RULES=t.CONTAINER_ENTER_RULES=t.SR_RULES=void 0;var a=i(7242),n=i(8485),l=i(2099);t.SR_RULES=a.RULES,t.CONTAINER_ENTER_RULES=n.RULES,t.CONTAINER_EXIT_RULES=l.RULES},1950(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.AccNameUtil=void 0;var a=i(9910),n=i(7139),l=i(7011),r=i(3946),o=i(4566),s=i(3864),u=i(1686),d=function(){function e(){}return e.computeAccessibleNameForSVGElementW3C=function(e){if(!e||"svg"!==e.nodeName.toLowerCase())return null;var t=e.querySelectorAll(":scope > title");if(t&&t.length>0){var i="";if(t.forEach(function(e){if(e&&!r.VisUtil.isNodeHiddenFromAT(e)&&!r.VisUtil.isNodePresentational(e)){var t=e.textContent;t&&""!==t.trim()&&(i+=t.trim())}}),i&&""!==i.trim())return{name:i.trim(),nameFrom:"svgTitle"}}var a="",o=e.querySelectorAll("text, textPath, tspan");if(o&&o.length>0&&(o.forEach(function(e){if(!r.VisUtil.isNodeHiddenFromAT(e)&&!r.VisUtil.isNodePresentational(e)){var t=e.textContent;t&&""!==t.trim()&&(a+=" "+t.trim())}}),""!==a.trim()))return{name:n.CommonUtil.truncateText(a.trim()),nameFrom:"svgText"};for(var s=e.querySelectorAll("a"),u=0;u<s.length;u++){var d=s[u];if(!r.VisUtil.isNodeHiddenFromAT(d)&&!r.VisUtil.isNodePresentational(d)){var c=d.getAttribute("xlink:title");if(c&&""!==c.trim())return{name:n.CommonUtil.truncateText(c),nameFrom:"svglinkTitle"}}}var m=l.AriaUtil.getAriaDescription(e);if(m&&""!==m.trim())return{name:n.CommonUtil.truncateText(m),nameFrom:"aria-description"};var p=e.querySelectorAll(":scope > desc");if(p&&p.length>0){var h="";if(p.forEach(function(e){if(!r.VisUtil.isNodeHiddenFromAT(e)&&!r.VisUtil.isNodePresentational(e)){var t=e.textContent;t&&""!==t.trim()&&(h+=" "+t.trim())}}),""!==h.trim())return{name:h.trim(),nameFrom:"svgDesc"}}if(e.hasAttribute("title")){var g=e.getAttribute("title");if(g&&""!==g.trim())return{name:n.CommonUtil.truncateText(g),nameFrom:"title"}}return null},e.computeAccessibleName=function(t){if(!t)return null;var i=t.nodeName.toLowerCase(),r=o.CacheUtil.getCache(t,"ELEMENT_ACCESSBLE_NAME",void 0);if(void 0!==r)return r;var s=l.AriaUtil.getAriaLabel(t);if(s&&""!==s.trim())return o.CacheUtil.setCache(t,"ELEMENT_ACCESSBLE_NAME",{name:n.CommonUtil.truncateText(s),nameFrom:"ariaLabel"}),{name:n.CommonUtil.truncateText(s),nameFrom:"ariaLabel"};if(r=e.computeAccessibleNameForNativeElement(t))return o.CacheUtil.setCache(t,"ELEMENT_ACCESSBLE_NAME",r),r;var u=l.AriaUtil.getResolvedRole(t);if(a.ARIADefinitions.designPatterns[u]&&a.ARIADefinitions.designPatterns[u].nameFrom.includes("contents")&&(r=e.computeAccessibleNameFromContent(t)))return o.CacheUtil.setCache(t,"ELEMENT_ACCESSBLE_NAME",r),r;if(t.hasAttribute("title")){var d=t.getAttribute("title").trim();if(d&&d.trim().length>0)return d=n.CommonUtil.truncateText(d),o.CacheUtil.setCache(t,"ELEMENT_ACCESSBLE_NAME",{name:d,nameFrom:"title"}),{name:d,nameFrom:"title"}}if("textarea"===i||"input"===i&&(!t.hasAttribute("type")||n.CommonUtil.input_type_with_placeholder.includes(t.getAttribute("type")))){var c=t.getAttribute("placeholder");if(c&&c.trim().length>0)return c=n.CommonUtil.truncateText(c),o.CacheUtil.setCache(t,"ELEMENT_ACCESSBLE_NAME",{name:c,nameFrom:"placeholder"}),{name:c,nameFrom:"placeholder"}}return o.CacheUtil.setCache(t,"ELEMENT_ACCESSBLE_NAME",null),null},e.computeAccessibleNameForNativeElement=function(t){var i,a,l=t.nodeName.toLowerCase();if(n.CommonUtil.form_labelable_elements.includes(l)&&(p=n.CommonUtil.getFormFieldLabel(t))&&""!==p.trim())return{name:n.CommonUtil.truncateText(p),nameFrom:"label"};if("input"===l&&t.hasAttribute("type"))if(n.CommonUtil.form_button_types.includes(t.getAttribute("type"))){var o=n.CommonUtil.getElementAttribute(t,"value");if(o&&""!==o.trim())return{name:n.CommonUtil.truncateText(o),nameFrom:"value"};var s=t.getAttribute("type");if("submit"===s||"reset"===s)return{name:s,nameFrom:"internal"}}else if("image"===t.getAttribute("type")&&(b=n.CommonUtil.getElementAttribute(t,"alt"))&&""!==b.trim())return{name:n.CommonUtil.truncateText(b),nameFrom:"alt"};if("button"===l){if((v=t.innerText)&&""!==v.trim())return{name:n.CommonUtil.truncateText(v),nameFrom:"text"};var d=t.querySelector("img");if(d&&!r.VisUtil.isNodeHiddenFromAT(d)&&!r.VisUtil.isNodePresentational(d)&&(a=e.computeAccessibleName(d))&&a.name&&a.name.trim().length>0)return a;var c=t.querySelector("svg");if(c&&!r.VisUtil.isNodeHiddenFromAT(c)&&!r.VisUtil.isNodePresentational(c)&&(a=e.computeAccessibleName(c))&&a.name&&a.name.trim().length>0)return a}if("fieldset"===l&&(i=t.firstElementChild)&&"legend"===i.nodeName.toLowerCase()&&(v=i.innerText)&&v.trim().length>0)return{name:n.CommonUtil.truncateText(v),nameFrom:"legend"};if("output"===l&&t.hasAttribute("for")){var m=t.getAttribute("for").trim().split(" ");if(m&&m.length>0){for(var p="",h=0;h<m.length;h++){var g=t.ownerDocument.getElementById(m[h]);!g||u.DOMUtil.sameNode(g,t)||r.VisUtil.isNodeHiddenFromAT(g)||r.VisUtil.isNodePresentational(g)||(a=e.computeAccessibleName(g))&&a.name&&a.name.trim().length>0&&(p+=" "+n.CommonUtil.normalizeSpacing(a.name))}if(p.trim().length>0)return{name:n.CommonUtil.truncateText(p),nameFrom:"label"}}}if("summary"===l&&(v=t.innerText)&&v.trim().length>0)return{name:n.CommonUtil.truncateText(v),nameFrom:"legend"};if("details"===l)return(i=t.firstElementChild)&&"summary"===i.nodeName.toLowerCase()&&(a=e.computeAccessibleName(i))&&a.name&&a.name.trim().length>0?{name:n.CommonUtil.truncateText(a.name.trim()),nameFrom:"summary"}:{name:"details",nameFrom:"internal"};if("figure"===l&&(_=n.CommonUtil.getChildByTagHidden(t,"figcaption",!0,!1))&&_.length>0&&(v=_[0].innerText)&&v.trim().length>0)return{name:n.CommonUtil.truncateText(v),nameFrom:"figcaption"};if("img"===l&&t.hasAttribute("alt")){var b=t.getAttribute("alt");return{name:n.CommonUtil.truncateText(b),nameFrom:"alt"}}if("area"===l&&t.hasAttribute("alt")&&(b=t.getAttribute("alt"))&&b.trim().length>0)return{name:n.CommonUtil.truncateText(b),nameFrom:"alt"};if("table"===l){var _,f=t.firstElementChild;if(f&&"caption"===f.nodeName.toLowerCase()&&(_=f.innerText)&&_.trim().length>0)return{name:n.CommonUtil.truncateText(_),nameFrom:"caption"}}if("a"===l){var v;if((v=t.innerText)&&""!==v.trim())return{name:n.CommonUtil.truncateText(v),nameFrom:"text"};var A=t.querySelectorAll(":scope > img, :scope > svg");if(A&&A.length>0){var w="";if(A.forEach(function(t){if(!r.VisUtil.isNodeHiddenFromAT(t)&&!r.VisUtil.isNodePresentational(t)){var i=e.computeAccessibleName(t);i&&i.name&&i.name.trim().length>0&&(w+=" "+i.name.trim())}}),""!==w.trim())return{name:w.trim(),nameFrom:"alt"}}}return("optgroup"===l||"option"===l||"track"===l)&&(p=t.getAttribute("label"))&&p.trim().length>0?{name:n.CommonUtil.truncateText(p),nameFrom:"label"}:"svg"===l&&(a=e.computeAccessibleNameForSVGElementW3C(t))&&a.name&&a.name.trim().length>0?a:null},e.computeAccessibleNameForSVGElement=function(e){var t=e.querySelectorAll(":scope > title");if(t&&t.length>0){var i="";if(t.forEach(function(e){if(e&&!r.VisUtil.isNodeHiddenFromAT(e)&&!r.VisUtil.isNodePresentational(e)){var t=e.textContent;t&&""!==t.trim()&&(i+=t.trim())}}),i&&""!==i.trim())return{name:i.trim(),nameFrom:"svgTitle"}}var a=e.querySelector("a");if(a&&!r.VisUtil.isNodeHiddenFromAT(a)&&!r.VisUtil.isNodePresentational(a)){var o=a.getAttribute("xlink:title");if(o&&""!==o.trim())return{name:n.CommonUtil.truncateText(o),nameFrom:"svglinkTitle"}}var s="";if(e.querySelectorAll(":scope > *").forEach(function(e){if("svg"!==e.nodeName.toLowerCase()&&!r.VisUtil.isNodeHiddenFromAT(e)&&!r.VisUtil.isNodePresentational(e)){var t=n.CommonUtil.getInnerText(e);t&&t.trim().length>0&&(s+=t)}}),""!==s.trim())return{name:n.CommonUtil.truncateText(s),nameFrom:"svgText"};var u=l.AriaUtil.getAriaDescription(e);if(u&&u.trim().length>0)return{name:n.CommonUtil.truncateText(u),nameFrom:"aria-description"};var d=e.querySelectorAll(":scope > desc");if(d&&d.length>0){var c="";if(d.forEach(function(e){if(e&&!r.VisUtil.isNodeHiddenFromAT(e)&&!r.VisUtil.isNodePresentational(e)){var t=e.textContent;t&&""!==t.trim()&&(c+=t.trim())}}),c&&""!==c.trim())return{name:c.trim(),nameFrom:"svgDesc"}}},e.computeAccessibleNameFromContent=function(t){var i=t.nodeName.toLowerCase(),a=(l.AriaUtil.getResolvedRole(t),e.computeAccessibleNameForCSSPseudoElement(t,"before"));return null!==a&&a.name&&a.name.trim().length>0||(a=e.computeAccessibleNameForCSSPseudoElement(t,"after"))&&a.name&&a.name.trim().length>0?a:t.shadowRoot&&(a=e.computeAccessibleNameForShadowHost(t))&&a.name&&a.name.trim().length>0?{name:a.name,nameFrom:"shadow"}:"slot"===i&&(a=e.computeAccessibleNameForSlotElement(t))&&a.name&&a.name.trim().length>0?{name:a.name,nameFrom:"slot"}:(a=e.computeAccessibleNameFromChildren(t))&&a.name&&a.name.trim().length>0?{name:a.name,nameFrom:"content"}:null},e.computeAccessibleNameForCSSPseudoElement=function(e,t){var i=e.ownerDocument.defaultView.getComputedStyle(e,t);if(i){var a=i.content;if(a&&"none"!==a&&"no"!==a&&"normal"!==a&&(a=a.replace(/^"/,"").replace(/"$/,"")).trim().length>0)return{name:n.CommonUtil.truncateText(a),nameFrom:"css-"+t}}return null},e.computeAccessibleNameForShadowHost=function(t){var i="",a=t.shadowRoot;return a&&a.querySelectorAll("*").forEach(function(t){var a=e.computeAccessibleName(t);a&&a.name&&a.name.trim().length>0&&(i+=" "+a.name.trim())}),i.trim().length>0?{name:n.CommonUtil.truncateText(i),nameFrom:"shadow-host"}:null},e.computeAccessibleNameForSlotElement=function(t){var i="";if(t.assignedNodes()&&0!==t.assignedNodes().length)for(var a=0,l=t.assignedNodes();a<l.length;a++){var r,o=l[a];(r=e.computeAccessibleName(o))&&r.name&&r.name.length>0&&(i+=" "+r.name.trim())}else(r=e.computeAccessibleName(t))&&r.name&&r.name.trim().length>0&&(i+=" "+r.name.trim());return i.trim().length>0?{name:n.CommonUtil.truncateText(i),nameFrom:"content-slot"}:null},e.computeAccessibleNameFromChildren=function(t){for(var i="",a=new s.DOMWalker(t);a.nextNode()&&a.node!==t&&a.node!==t.parentNode;)if(!a.bEndTag){var o=a.node;if(3===o.nodeType){var u=o.parentElement;!r.VisUtil.isNodeHiddenFromAT(u)&&!r.VisUtil.isNodePresentational(u)&&o.nodeValue&&o.nodeValue.trim().length>0&&(i+=" "+o.nodeValue.trim())}else if(1===o.nodeType&&!r.VisUtil.isNodeHiddenFromAT(o)&&!r.VisUtil.isNodePresentational(o)){var d=e.computeAccessibleName(o);d&&d.name&&d.name.length>0?(i+=" "+d.name.trim(),a.bEndTag=!0):l.AriaUtil.containsPresentationalChildrenOnly(a.node)&&(a.bEndTag=!0)}}return i.trim().length>0?{name:n.CommonUtil.truncateText(i),nameFrom:"content"}:null},e.isAccessibleNameIgnorable=function(e){if(!e)return!1;var t=e.nodeName.toLowerCase();if("img"!==t&&"svg"!==t)return!1;var i=e.parentElement;return!(!i||!l.AriaUtil.isWidget(i)&&!l.AriaUtil.containsPresentationalChildrenOnly(i)||!l.AriaUtil.hasAriaLabel(i))},e}();t.AccNameUtil=d},7011(e,t,i){var a=this&&this.__spreadArray||function(e,t,i){if(i||2===arguments.length)for(var a,n=0,l=t.length;n<l;n++)!a&&n in t||(a||(a=Array.prototype.slice.call(t,0,n)),a[n]=t[n]);return e.concat(a||Array.prototype.slice.call(t))};Object.defineProperty(t,"__esModule",{value:!0}),t.AriaUtil=void 0;var n=i(4566),l=i(9910),r=i(9955),o=i(3864),s=i(3946),u=i(7139),d=i(1950),c=i(5279),m=i(1686),p=function(){function e(){}return e.isDefinedAriaAttributeAtIndex=function(t,i){var a=t.attributes[i].name;return e.isDefinedAriaAttribute(t,a)},e.getUserDefinedAriaAttributes=function(e){var t=[],i=e.attributes;if(i)for(var a=0;a<i.length;a++){var n=i[a].name.trim().toLowerCase();"aria-"===n.substring(0,5)&&t.push(n)}return t},e.getUserDefinedHtmlAttributes=function(e){var t=[],i=e.attributes;if(i)for(var a=0;a<i.length;a++){var n=i[a].name.trim().toLowerCase();"aria-"===n.substring(0,5)||t.push(n)}return t},e.getUserDefinedAriaAttributeNameValuePairs=function(e){var t=[],i=e.attributes;if(i)for(var a=0;a<i.length;a++){var n=i[a].name.trim().toLowerCase(),l=e.getAttribute(n);""===l&&(l=null),"aria-"===n.substring(0,5)&&t.push({name:n,value:l})}return t},e.getUserDefinedHtmlAttributeNameValuePairs=function(e){var t=[],i=e.attributes;if(i)for(var a=0;a<i.length;a++){var n=i[a].name.trim().toLowerCase(),l=e.getAttribute(n);""===l&&(l=null),"aria-"===n.substring(0,5)||t.push({name:n,value:l})}return t},e.getAriaAttribute=function(t,i){var a=t.getAttribute(i);if(t.hasAttribute(i)&&""===a.trim())return a;if(!a){var n=t.nodeName.toLowerCase();i in e.ariaAttributeImplicitMappings&&(n in e.ariaAttributeImplicitMappings[i]?"function"==typeof(a=e.ariaAttributeImplicitMappings[i][n])&&(a=a(t)):"*"in e.ariaAttributeImplicitMappings[i]&&"function"==typeof(a=e.ariaAttributeImplicitMappings[i]["*"])&&(a=a(t)))}if(!a){var l=r.ARIAMapper.nodeToRole(t);l in e.ariaAttributeRoleDefaults&&i in e.ariaAttributeRoleDefaults[l]&&"function"==typeof(a=e.ariaAttributeRoleDefaults[l][i])&&(a=a(t))}return!a&&i in e.ariaAttributeGlobalDefaults&&(a=e.ariaAttributeGlobalDefaults[i]),a},e.isDefinedAriaAttribute=function(e,t){var i=!1;return"aria-"===t.substring(0,5)&&(i=e.hasAttribute&&e.hasAttribute(t)&&e.getAttribute(t).length>0),i},e.getResolvedRole=function(t,i){if(void 0===i&&(i=!0),!t)return null;var a=n.CacheUtil.getCache(t,"RPTUTIL_ELEMENT_RESOLVED_ROLE",null);if(null===a){var l=e.getUserDefinedRoles(t),r=e.getElementAriaProperty(t),o=e.getAllowedAriaRoles(t,r),s=!1;if(l&&l.length>0&&o&&o.length>0){for(var d=0;d<l.length;d++)if(o.includes("any")||o.includes(l[d])){if(o.includes("any")&&"generic"===l[d]){s=!0;continue}if(("presentation"===(a=l[d])||"none"===a)&&u.CommonUtil.isFocusable(t)){a=null;continue}break}s&&(a="generic")}if(null===a&&i){var c=e.getImplicitRole(t);a=c&&c.length>0?c[0]:void 0}n.CacheUtil.setCache(t,"RPTUTIL_ELEMENT_RESOLVED_ROLE",a)}return void 0!==a?a:null},e.getUserDefinedRoles=function(t){return e.getRoles(t,!1)},e.getRoles=function(t,i){var a=[];if(t&&t.hasAttribute&&t.hasAttribute("role"))for(var n=u.CommonUtil.normalizeSpacing(t.getAttribute("role").trim()).split(" "),l=0;l<n.length;++l)a.push(n[l]);if(i){var r=e.getImplicitRole(t);null!==r&&r.length>0&&u.CommonUtil.concatUniqueArrayItemList(r,a)}return a},e.getImplicitRole=function(t){if(!t||1!==t.nodeType)return null;var i=n.CacheUtil.getCache(t,"AriaUtil_ImplicitRole",null);if(!i){var a=e.getElementAriaProperty(t);if(a&&a.implicitRole){if(a.implicitRole.includes("generic")){var r=e.getUserDefinedAriaAttributes(t);if(0===r.length)return n.CacheUtil.setCache(t,"AriaUtil_ImplicitRole",[]),[];var o=[],s=l.ARIADefinitions.designPatterns.generic;if(s.reqProps&&s.reqProps.length>0&&u.CommonUtil.concatUniqueArrayItemList(s.reqProps,o),a.globalAriaAttributesValid&&u.CommonUtil.concatUniqueArrayItemList(l.ARIADefinitions.globalProperties,o),s.deprecatedProps&&s.deprecatedProps.length>0&&u.CommonUtil.reduceArrayItemList(s.deprecatedProps,o),o.length>0&&!o.some(function(e){return r.includes(e)})){var d=u.CommonUtil.reduceArrayItemList(["generic"],a.implicitRole);return n.CacheUtil.setCache(t,"AriaUtil_ImplicitRole",d),d}}return n.CacheUtil.setCache(t,"AriaUtil_ImplicitRole",a.implicitRole),a.implicitRole}return n.CacheUtil.setCache(t,"AriaUtil_ImplicitRole",[]),[]}return i},e.getRoleRequiredProperties=function(e,t){if(null===e)return null;if(l.ARIADefinitions.designPatterns[e]){var i=l.ARIADefinitions.designPatterns[e].reqProps;return"separator"===e.toLowerCase()&&t&&u.CommonUtil.isFocusable(t)&&(i=u.CommonUtil.concatUniqueArrayItemList(["aria-valuenow"],i||[])),i}return null},e.hasRole=function(t,i,a){var n=!1;if(t&&t.hasAttribute&&t.hasAttribute("role"))if("string"!=typeof i)for(var l=t.getAttribute("role").trim().split(" "),r=0;!n&&r<l.length;++r)n=l[r]in i;else for(l=t.getAttribute("role").trim().split(" "),r=0;!n&&r<l.length;++r)n=l[r]===i;if(!n&&a){var o=[],s=e.getImplicitRole(t);if(null!==s&&s.length>0)if(u.CommonUtil.concatUniqueArrayItemList(s,o),"string"!=typeof i)for(r=0;!n&&r<o.length;++r)n=o[r]in i;else for(r=0;!n&&r<o.length;++r)n=o[r]===i}return n},e.hasRoleInSemantics=function(t,i){var a=!1,n=!1;if(t&&t.hasAttribute&&t.hasAttribute("role"))if("string"!=typeof i)for(var l=t.getAttribute("role").trim().toLowerCase().split(/\s+/),r=0;!a&&r<l.length;++r)n=!0,a=l[r]in i;else for(l=t.getAttribute("role").trim().toLowerCase().split(/\s+/),r=0;!a&&r<l.length;++r)n=!0,a=l[r]===i;if(n)return a;var o=e.getImplicitRole(t);if(null!==o&&o.length>0)if("string"!=typeof i)for(r=0;!a&&r<o.length;++r)a=o[r]in i;else for(r=0;!a&&r<o.length;++r)a=o[r]===i;return a},e.hasAnyRole=function(t,i){var a=!1;if(t&&t.hasAttribute&&t.hasAttribute("role")&&(a=!0),!a&&i){var n=e.getImplicitRole(t);null!==n&&n.length>0&&(a=!0)}return a},e.isPresentationalElement=function(e){return u.CommonUtil.valInArray(e.nodeName.toLowerCase(),["abbr","b","bdi","bdo","br","cite","code","data","dfn","em","i","kbd","mark","q","rp","rt","rtc","ruby","s","samp","small","span","strong","sub","sup","time","u","var","wbr","a","progress","meter","basefont","big","center","strike","tt","font","blink","h1","h2","h3","h4","h5","h6","hr","blockquote","p"])},e.getAncestorWithRole=function(t,i,a){for(var n=o.DOMWalker.parentNode(t);null!==n;){if(a){if(e.hasRoleInSemantics(n,i))break}else if(e.hasRole(n,i,!1))break;n=o.DOMWalker.parentNode(n)}return n},e.getAncestorWithRoles=function(t,i){if(!t||!i||!i.length||0===i.length)return null;for(var a=t;null!==a;){var n=e.getResolvedRole(a);if(null!==n&&(i.includes(n)||i.includes("*")&&!["presentation","none"].includes(n)))return a;a=o.DOMWalker.parentNode(a)}return null},e.getRolesWithTypes=function(e,t){if(!e||!t||!t.length||0===t.length)return null;var i=n.CacheUtil.getCache(e.ownerDocument,"roles_with_given_types",null);return i&&0!==i.length||(i=[],Object.entries(l.ARIADefinitions.designPatterns).forEach(function(e){var a=e[0],n=e[1];t.includes(n.roleType)&&i.push(a)}),n.CacheUtil.setCache(e.ownerDocument,"roles_with_given_types",i)),i},e.isWidget=function(t){if(!t)return!1;var i=n.CacheUtil.getCache(t.ownerDocument,"is_element_widget",null);if(null===i){var a=!1,r=e.getResolvedRole(t);return r&&l.ARIADefinitions.designPatterns[r]&&"widget"===l.ARIADefinitions.designPatterns[r].roleType&&(a=!0),n.CacheUtil.setCache(t.ownerDocument,"is_element_widget",a),a}return i},e.isNavigationOwnedOrControlled=function(t){if(!t)return!1;var i=n.CacheUtil.getCache(t.ownerDocument,"AriaUtil_NavigationOwnedOrControlled",null);if(null!==i&&i.length>0&&u.CommonUtil.getAncestor(t,i))return!0;var a=e.getResolvedRole(t);if(!a)return!1;var l=t.getAttribute("id");return!(!l||0===l.trim().length)&&(!!t.ownerDocument.querySelector("*[aria-controls~='".concat(l,"'], *[aria-owns~='").concat(l,"']"))&&(!!["combobox","scrollbar","button","tab","listbox","menu","menubar","radiogroup","tree","treegrid"].includes(a)&&(null===i&&(i=[]),i.push(t),n.CacheUtil.setCache(t.ownerDocument,"AriaUtil_NavigationOwnedOrControlled",i),!0)))},e.getSiblingWithRole=function(t,i){return e.getSiblingWithRoleHidden(t,i,!1)},e.getSiblingWithRoleHidden=function(t,i,a,n){var l=null,r=!1;if(t&&i){for(l=t.nextSibling;null!==l&&!r;)a&&u.CommonUtil.shouldNodeBeSkippedHidden(l)||(r=n?e.hasRoleInSemantics(l,i):e.hasRole(l,i,!1)),l=l.nextSibling;if(!l)for(l=t.previousSibling;null!==l&&!r;)a&&u.CommonUtil.shouldNodeBeSkippedHidden(l)||(r=e.hasRole(l,i,n)),l=l.previousSibling}return l},e.getDescendantWithRole=function(t,i){return e.getDescendantWithRoleHidden(t,i,!1)},e.getDescendantWithRoleHidden=function(t,i,a,n){for(var l=null,r=new o.DOMWalker(t);r.nextNode()&&r.node!=t&&r.node!=t.nextSibling;)if((!a||!u.CommonUtil.shouldNodeBeSkippedHidden(r.node))&&(n?e.hasRoleInSemantics(r.node,i):e.hasRole(r.node,i,!1))){l=r.node;break}return l},e.getAllDescendantsWithRoles=function(t,i,a,n){if(i&&0!==i.length){var l=[];return i.forEach(function(i){var r=e.getAllDescendantsWithRoleHidden(t,i,a,n);r&&r.length>0&&(l=l.concat(r))}),l}},e.getAllDescendantsWithRoleHidden=function(t,i,a,n){for(var l=[],r=new o.DOMWalker(t);r.nextNode()&&r.node!=t&&r.node!=t.nextSibling;)r.bEndTag||a&&u.CommonUtil.shouldNodeBeSkippedHidden(r.node)||e.hasRole(r.node,i,n)&&l.push(r.node);return l},e.getDirectATChildren=function(t){var i=e.getRequiredChildRoles(t,!0),a=[];return e.retrieveDirectATChildren(t,i,a),a},e.retrieveDirectATChildren=function(t,i,a){var n=[];if(null!==t.children&&t.children.length>0)for(var l=0;l<t.children.length;l++)n.push(t.children[l]);var r=t.getAttribute("aria-owns");if(r){var o=t.ownerDocument;if(o){var u=r.split(" ");for(l=0;l<u.length;l++){var d=o.getElementById(u[l]);d&&n.push(d)}}}if(n.length>0){for(l=0;l<n.length;l++)if(!s.VisUtil.isNodeHiddenFromAT(n[l])&&s.VisUtil.isNodeVisible(n[l])){var c=e.getRoles(n[l],!1);null!==c&&0!==c.length||(c=e.getImplicitRole(n[l])),c&&null!==c&&c.length>0&&(c=c.filter(function(e){return"none"!==e&&"presentation"!==e})).includes("group")&&i&&i.includes("group")&&(c=c.filter(function(e){return"group"!==e})),c&&null!==c&&c.length>0?a.push(n[l]):e.retrieveDirectATChildren(n[l],i,a)}return null}return null},e.getRequiredChildRoles=function(t,i){var a=e.getRoles(t,!1);if(a&&0!==a.length||!i||(a=e.getImplicitRole(t)),!a||0===a.length)return null;var n=["none","presentation"];if(a.some(function(e){return n.includes(e)}))return null;for(var r=l.ARIADefinitions.designPatterns,o=new Array,s=0;s<a.length;++s)r[a[s]]&&null!==r[a[s]].reqChildren&&(o=u.CommonUtil.concatUniqueArrayItemList(r[a[s]].reqChildren,o));return o},e.getAriaOwnsWithRole=function(t,i){return e.getAriaOwnsWithRoleHidden(t,i,!1)},e.getAriaOwnsWithRoleHidden=function(t,i,a,n){var l=null,r=!1;if(u.CommonUtil.attributeNonEmpty(t,"aria-owns")){var o=t.getAttribute("aria-owns");if(l=c.FragmentUtil.getById(t,o),m.DOMUtil.sameNode(t,l))return null;r=a&&null!=l&&u.CommonUtil.shouldNodeBeSkippedHidden(l)?null:e.hasRole(l,i,n)}return r?l:null},e.hasAriaLabel=function(e){return u.CommonUtil.attributeNonEmpty(e,"aria-label")||u.CommonUtil.attributeNonEmpty(e,"aria-labelledby")},e.hasUniqueAriaLabelsLocally=function(t,i){if(0===t.length)return!1;var a=t[0].ownerDocument,l=!1,r=null;i&&(r=n.CacheUtil.getCache(a,"AriaUtil_HAS_UNIQUE_ARIA_LABELS",null)),null===r&&(r={});for(var o=0;!l&&o<t.length;++o)if(t[o].hasAttribute)if(t[o].hasAttribute("aria-label")){var s=u.CommonUtil.normalizeSpacing(t[o].getAttribute("aria-label")).toLowerCase();l=s in r,r[s]=!0}else if(t[o].hasAttribute("aria-labelledby")){var d=t[o].getAttribute("aria-labelledby"),p=c.FragmentUtil.getById(t[o],d),h="";p&&!m.DOMUtil.sameNode(p,t[o])&&(h=e.getTextContentExcludingScripts(p));var g=u.CommonUtil.normalizeSpacing(h).toLowerCase();l=g in r,r[g]=!0}else l=!0;return i&&n.CacheUtil.setCache(a,"AriaUtil_HAS_UNIQUE_ARIA_LABELS",r),!l},e.getTextContentExcludingScripts=function(e){if(!e)return"";for(var t="",i=new o.DOMWalker(e);i.nextNode()&&i.node!==e&&i.node!==e.parentNode;)if(!i.bEndTag){var a=i.node,n=a.nodeName?a.nodeName.toLowerCase():"";"script"!==n&&"style"!==n?3===a.nodeType?a.nodeValue&&a.nodeValue.trim().length>0&&(t+=" "+a.nodeValue.trim()):1===a.nodeType&&("img"===n&&a.hasAttribute("alt")||"input"===n&&"image"===a.getAttribute("type")&&a.hasAttribute("alt"))&&(t+=" "+a.getAttribute("alt").trim(),i.bEndTag=!0):i.bEndTag=!0}return t.trim()},e.getAriaLabel=function(t){if(t.hasAttribute){if(t.hasAttribute("aria-labelledby")){for(var i=t.getAttribute("aria-labelledby").trim().split(" "),a="",n=0,l=i.length;n<l;++n){var r=i[n],o=c.FragmentUtil.getById(t,r);if(o&&!m.DOMUtil.sameNode(o,t)){var s=e.getTextContentExcludingScripts(o);a+=u.CommonUtil.normalizeSpacing(s)}}return a.trim()}if(t.hasAttribute("aria-label"))return u.CommonUtil.normalizeSpacing(t.getAttribute("aria-label")).trim()}return""},e.getAriaDescription=function(t){if(!t)return"";var i="",a=t.getAttribute("aria-labelledby");if(a&&a.trim().length>0){for(var n=a.trim().split(" "),l=0,r=n.length;l<r;++l){var o=n[l],s=c.FragmentUtil.getById(t,o);if(s&&!m.DOMUtil.sameNode(s,t)){var d=e.getTextContentExcludingScripts(s);d&&d.trim().length>0&&(i+=u.CommonUtil.normalizeSpacing(d).toLowerCase())}}if(i.trim().length>0)return i.trim()}return(a=t.getAttribute("aria-description"))&&a.trim().length>0?a.trim().toLowerCase():""},e.findAriaLabelDupes=function(t){var i={};return t.forEach(function(t){i[e.getAriaLabel(t)]=(i[e.getAriaLabel(t)]||0)+1}),i},e.getLandmarkAccNames=function(t){var i=n.CacheUtil.getCache(t,"AriaUtil_Landmark_AccNames",null);if(i&&0!==i.length)return i;i=[];var l=t.querySelectorAll('aside,[role="complementary"], footer,[role="contentinfo"], header,[role="banner"], main,[role="main"], nav,[role="navigation"], form,[role="form"], section,[role="region"], article,[role="article"], [role="search"],[role="application"],[role="document"]');return 0===l.length?(n.CacheUtil.setCache(t,"AriaUtil_Landmark_AccNames",i),i):(l.forEach(function(t){if(!s.VisUtil.isNodeHiddenFromAT(t)&&null===u.CommonUtil.getAncestor(t,["DIALOG"])&&null===e.getAncestorWithRole(t,"dialog",!0)){var n="",r=d.AccNameUtil.computeAccessibleName(t);r&&r.name&&r.name.trim().length>0&&(n=r.name.trim());var o=a([],l,!0).filter(function(e){return e.contains(t)&&e!==t});o.length>1&&o.forEach(function(e){var t=d.AccNameUtil.computeAccessibleName(e);t&&t.name&&t.name.trim().length>0&&(n=t.name.trim()+" "+n)});var c=e.getResolvedRole(t);i.push({elem:t,role:c,name:n})}}),n.CacheUtil.setCache(t,"AriaUtil_Landmark_AccNames",i),i)},e.isLandmarkNameUnique=function(t,i,a){void 0===a&&(a=!1);var n,l=e.getLandmarkAccNames(t.ownerDocument);if(!(n="any"===i?l.find(function(e){return e.elem===t}):l.find(function(e){return e.elem===t&&e.role===i})))return null;var r=n.name;if(!a&&""===r)return null;for(var o=0;o<l.length;o++)if(l[o].elem!==t&&r===l[o].name){if("any"===i)return!0;if(l[o].role===i)return!0}return!1},e.hasUniqueAriaLabels=function(t){return e.hasUniqueAriaLabelsLocally(t,!0)},e.hasDuplicateAriaLabelsLocally=function(t,i){if(0===t.length)return!1;var a=t[0].ownerDocument,l=null,r=new Array;i&&(l=n.CacheUtil.getCache(a,"AriaUtil_HAS_UNIQUE_ARIA_LABELS",null)),null===l&&(l={});for(var o=0;o<t.length;++o)if(t[o].hasAttribute)if(t[o].hasAttribute("aria-label")){var s=u.CommonUtil.normalizeSpacing(t[o].getAttribute("aria-label")).toLowerCase();l[s]=!0,s in r||(r[s]=new Array),r[s].push(t[o].nodeName.toLowerCase())}else if(t[o].hasAttribute("aria-labelledby")){for(var d=t[o].getAttribute("aria-labelledby").trim().split(" "),p="",h=0,g=d.length;h<g;++h){var b=d[h],_=c.FragmentUtil.getById(t[o],b);if(_&&!m.DOMUtil.sameNode(_,t[o])){var f=e.getTextContentExcludingScripts(_);p+=u.CommonUtil.normalizeSpacing(f).toLowerCase()}}l[p]=!0,p in r||(r[p]=new Array),r[p].push(t[o].nodeName.toLowerCase())}return i&&n.CacheUtil.setCache(a,"AriaUtil_HAS_UNIQUE_ARIA_LABELS",l),r},e.hasDuplicateAriaLabels=function(t){return e.hasDuplicateAriaLabelsLocally(t,!0)},e.hasUniqueAriaLabelledby=function(e){for(var t=!1,i={},a=0;!t&&a<e.length;++a)if(e[a].hasAttribute&&e[a].hasAttribute("aria-labelledby")&&!u.CommonUtil.isIdReferToSelf(e[a],e[a].getAttribute("aria-labelledby"))){var n=u.CommonUtil.normalizeSpacing(e[a].getAttribute("aria-labelledby"));t=n in i,i[n]=!0}else t=!0;return!t},e.getElementAriaProperty=function(t){var i=n.CacheUtil.getCache(t,"AriaUtil_ElementAriaProperty",null);if(!i){var r=null;if(t.tagName?r=t.tagName.toLowerCase():t.nodeName&&(r=t.nodeName.toLowerCase()),null==(i=l.ARIADefinitions.documentConformanceRequirement[r])){var o=l.ARIADefinitions.documentConformanceRequirementSpecialTags[r];switch(r){case"a":case"area":i=t.hasAttribute("href")?o["with-href"]:o["without-href"];break;case"figure":var s=u.CommonUtil.getChildByTag(t,"figcaption");i=null!==s&&s.length>0?o["child-figcaption"]:o["no-child-figcaption"];break;case"footer":case"header":i=null!==e.getAncestorWithRole(t,"article",!0)||null!==e.getAncestorWithRole(t,"complementary",!0)||null!==e.getAncestorWithRole(t,"navigation",!0)||null!==e.getAncestorWithRole(t,"region",!0)||null!==u.CommonUtil.getAncestor(t,["article","aside","main","nav","section"])?o["des-section-article-aside-main-nav"]:o.other;break;case"img":var d=t.hasAttribute("alt")?t.getAttribute("alt"):null,c=t.hasAttribute("title")?t.getAttribute("title"):null;i=0!==e.getAriaLabel(t).trim().length||null!==d&&d.length>0||null!==c&&c.length>0?o["img-with-accname"]:null!==d?o["img-without-accname-empty-alt"]:o["img-without-accname-no-alt"];break;case"input":if(u.CommonUtil.attributeNonEmpty(t,"type")){var p=t.getAttribute("type").trim().toLowerCase();if(null==(i=o[p]))switch(p){case"checkbox":i=u.CommonUtil.attributeNonEmpty(t,"aria-pressed")?o["checkbox-with-aria-pressed"]:o["checkbox-without-aria-pressed"];break;case"email":i=u.CommonUtil.attributeNonEmpty(t,"list")?o["email-with-list"]:o["email-no-list"];break;case"search":i=u.CommonUtil.attributeNonEmpty(t,"list")?o["search-with-list"]:o["search-no-list"];break;case"tel":i=u.CommonUtil.attributeNonEmpty(t,"list")?o["tel-with-list"]:o["tel-no-list"];break;case"text":i=u.CommonUtil.attributeNonEmpty(t,"list")?o["text-with-list"]:o["text-no-list"];break;case"url":i=u.CommonUtil.attributeNonEmpty(t,"list")?o["url-with-list"]:o["url-no-list"];break;default:i=u.CommonUtil.attributeNonEmpty(t,"list")?o["default-with-list"]:o["default-no-list"]}}else i=u.CommonUtil.attributeNonEmpty(t,"list")?o["text-with-list"]:o["text-no-list"];break;case"li":o=l.ARIADefinitions.documentConformanceRequirementSpecialTags.li,i=t.parentElement&&e.hasRoleInSemantics(t.parentElement,"list")?o["child-of-list-role"]:o["no-child-of-list-role"];break;case"section":var h=e.getAriaLabel(t);i=h&&h.trim().length>0||u.CommonUtil.attributeNonEmpty(t,"title")?o["with-name"]:o["without-name"];break;case"select":o=l.ARIADefinitions.documentConformanceRequirementSpecialTags.select,i=t.hasAttribute("multiple")||u.CommonUtil.attributeNonEmpty(t,"size")&&t.getAttribute("size")>1?o["multiple-attr-size-gt1"]:o["no-multiple-attr-size-gt1"];break;case"summary":o=l.ARIADefinitions.documentConformanceRequirementSpecialTags.summary,i=t.parentElement&&"details"===t.parentElement.nodeName.toLowerCase()&&m.DOMUtil.sameNode(a([],t.parentElement.children,!0).filter(function(e){return"summary"===e.nodeName.toLowerCase()})[0],t)?o["first-summary-of-detail"]:o["no-first-summary-of-detail"];break;case"tbody":case"td":case"tr":i=null!==e.getAncestorWithRole(t,"table",!0)?o["des-table"]:e.getAncestorWithRole(t,"grid",!0)||e.getAncestorWithRole(t,"treegrid",!0)?o["des-grid"]:o["des-other"];break;case"th":var g=u.CommonUtil.getScopeForTh(t);i=null!==e.getAncestorWithRole(t,"table",!0)?"column"===g?o["des-table-column-scope"]:o["des-table-row-scope"]:null!==e.getAncestorWithRole(t,"grid",!0)||null!==e.getAncestorWithRole(t,"treegrid",!0)?"column"===g?o["des-grid-treegrid-column-scope"]:o["des-grid-treegrid-row-scope"]:o["des-other"];break;case"div":var b=t.parentElement;i=null!==b&&"dl"===b.nodeName.toLowerCase()?o["child-dl"]:o["no-child-dl"];break;default:i=l.ARIADefinitions.documentConformanceRequirementSpecialTags.default}}}return n.CacheUtil.setCache(t,"AriaUtil_ElementAriaProperty",i),i||null},e.getAllowedAriaRoles=function(t,i){var a=n.CacheUtil.getCache(t,"AriaUtil_AllowedAriaRoles",null);if(!a){a=[];var l;if(null!=(l=null!=i?i:e.getElementAriaProperty(t))){null!==l.implicitRole&&u.CommonUtil.concatUniqueArrayItemList(l.implicitRole,a),null!==l.validRoles&&u.CommonUtil.concatUniqueArrayItemList(l.validRoles,a);var r=e.getImplicitRole(t);r&&r.length>0&&u.CommonUtil.concatUniqueArrayItemList(l.validRoles,a)}n.CacheUtil.setCache(t,"AriaUtil_AllowedAriaRoles",a)}return a},e.getAllowedAriaAttributes=function(t,i,r){var o=n.CacheUtil.getCache(t,"AriaUtil_AllowedAriaAttributes",null);if(!o){o=[];var s=a([],i,!0),d=t.tagName.toLowerCase(),c=[];l.ARIADefinitions.elementsAllowedDisabled.indexOf(d)>-1&&(o=u.CommonUtil.concatUniqueArrayItem("aria-disabled",o)),l.ARIADefinitions.elementsAllowedRequired.indexOf(d)>-1&&(o=u.CommonUtil.concatUniqueArrayItem("aria-required",o)),l.ARIADefinitions.elementsAllowedReadOnly.indexOf(d)>-1&&(o=u.CommonUtil.concatUniqueArrayItem("aria-readonly",o));var m=null;if(null!=(m=null!=r&&void 0!==r?r:e.getElementAriaProperty(t))){if(null!==m.implicitRole&&(null==s||0===s.length)&&void 0===m.allowAttributesFromImplicitRole)for(var p=0;p<m.implicitRole.length;p++){var h=l.ARIADefinitions.designPatterns[m.implicitRole[p]];if(null!=h){var g=h.props;u.CommonUtil.concatUniqueArrayItemList(g,o),g=e.getRoleRequiredProperties(m.implicitRole[p],t),u.CommonUtil.concatUniqueArrayItemList(g,o),(v=h.prohibitedProps)&&v.length>0&&u.CommonUtil.concatUniqueArrayItemList(v,c),"separator"===m.implicitRole[p]&&u.CommonUtil.isFocusable(t)&&u.CommonUtil.concatUniqueArrayItemList(["aria-disabled","aria-valuenow","aria-valuemax","aria-valuemin","aria-valuetext"],o)}}if(m.globalAriaAttributesValid){var b=l.ARIADefinitions.globalProperties;u.CommonUtil.concatUniqueArrayItemList(b,o)}}for(m&&m.otherRolesForAttributes&&m.otherRolesForAttributes.length>0&&u.CommonUtil.concatUniqueArrayItemList(m.otherRolesForAttributes,s),p=0;null!==s&&p<s.length;p++){var _=l.ARIADefinitions.designPatterns[s[p]];if(null!=_){if(!m||null===m.implicitRole||!m.implicitRole.includes(s[p])||m.implicitRole.includes(s[p])&&void 0===m.allowAttributesFromImplicitRole){var f=_.props;u.CommonUtil.concatUniqueArrayItemList(f,o),f=e.getRoleRequiredProperties(s[p],t),u.CommonUtil.concatUniqueArrayItemList(f,o)}var v;(v=_.prohibitedProps)&&v.length>0&&u.CommonUtil.concatUniqueArrayItemList(v,c),"separator"===s[p]&&u.CommonUtil.isFocusable(t)&&u.CommonUtil.concatUniqueArrayItemList(["aria-disabled","aria-valuemax","aria-valuemin","aria-valuetext"],o)}}if(s.includes("row")&&null==e.getAncestorWithRole(t,"treegrid",!0)){var A=-1;(A=o.indexOf("aria-level"))>-1&&o.splice(A,1),(A=o.indexOf("aria-setsize"))>-1&&o.splice(A,1),(A=o.indexOf("aria-posinset"))>-1&&o.splice(A,1)}if(m&&m.otherAllowedAriaAttributes&&m.otherAllowedAriaAttributes.length>0){for(var w=[],y=0;y<m.otherAllowedAriaAttributes.length;y++)if((R=m.otherAllowedAriaAttributes[y]).includes("=")){var C=R.split("=");t.getAttribute(C[0])===C[1]&&w.push(C[0])}else w.push(R);w.length>0&&u.CommonUtil.concatUniqueArrayItemList(w,o)}if(m&&m.otherDisallowedAriaAttributes&&m.otherDisallowedAriaAttributes.length>0){var k=[];for(y=0;y<m.otherDisallowedAriaAttributes.length;y++){var R;(R=m.otherDisallowedAriaAttributes[y]).includes("=")?(C=R.split("="),t.getAttribute(C[0])===C[1]&&k.push(C[0])):k.push(R)}k.length>0&&u.CommonUtil.concatUniqueArrayItemList(k,c)}o=u.CommonUtil.reduceArrayItemList(c,o),i&&0!==i.length||null!==m.implicitRole||!m.prohibitedAriaAttributesWhenNoImplicitRole||(o=u.CommonUtil.reduceArrayItemList(m.prohibitedAriaAttributesWhenNoImplicitRole,o)),n.CacheUtil.setCache(t,"AriaUtil_AllowedAriaAttributes",o)}return o},e.getConflictOrOverlappingHtmlAttribute=function(e,t,i){var a=l.ARIADefinitions.relatedAriaHtmlAttributes[e.name];if(a){if(!e||0==e.length||!t||0==t.length)return[];var n=[],r=null;if("conflict"===i){if(!a.conflict||0===Object.keys(a.conflict).length)return null;r=a.conflict}else{if("overlapping"!==i)return null;if(!a.overlapping||0===Object.keys(a.overlapping).length)return null;r=a.overlapping}for(var o=!1,s=!1,u=0;u<r.length;u++)for(var d=r[u].ariaAttributeValue,c=r[u].htmlAttributeNames,m=r[u].htmlAttributeValues,p=0;p<t.length;p++){var h=c.indexOf(t[p].name);if(-1!==h){o=!0;var g=null===m||null===m[h]?null:m[h].split(",");null===d?(null===g||g.includes(t[p].value))&&(n.push({result:"Failed",attr:t[p].name}),s=!0):null===g?d===e.value&&(n.push({result:"Failed",attr:t[p].name}),s=!0):("VALUE"===d&&g.includes("VALUE")&&g[0]!==e.value||d===e.value&&g.includes(t[p].value))&&(n.push({result:"Failed",attr:t[p].name}),s=!0)}}return o&&!s&&n.push({result:"Pass",attr:""}),n}return null},e.containsPresentationalChildrenOnly=function(t){var i=e.getRoles(t,!1);if(i&&0!==i.length||(i=e.getImplicitRole(t)),!i||0===i.length)return!1;for(var a=0;null!==i&&a<i.length;a++){var n=l.ARIADefinitions.designPatterns[i[a]];if(null!=n&&!0===n.presentationalChildren)return!0}return!1},e.shouldBePresentationalChild=function(t){for(var i=o.DOMWalker.parentElement(t);i;){if(e.containsPresentationalChildrenOnly(i))return!0;i=r.ARIAMapper.getAriaOwnedBy(i)||o.DOMWalker.parentElement(i)}return!1},e.areRolesDefined=function(e){if(!e||0===e.length)return null;for(var t=l.ARIADefinitions.designPatterns,i=0,a=e;i<a.length;i++)if(!(a[i].toLowerCase()in t))return!1;return!0},e.getInvalidRoles=function(t){var i=e.getUserDefinedRoles(t);if(!i||0===i.length)return null;if(i&&i.includes("generic"))return["generic"];var a=e.getElementAriaProperty(t),n=e.getAllowedAriaRoles(t,a);if(!n||0===n.length)return i;var l=[];if(n.includes("any"))return[];for(var r=0;r<i.length;r++)n.includes(i[r])||l.includes(i[r])||l.push(i[r]);return l},e.getRolesUndefinedByAria=function(t){if(!t)return null;var i=e.getRoles(t,!1),a=[];if(i&&i.length>0)for(var n=l.ARIADefinitions.designPatterns,r=0;r<i.length;r++)i[r]in n||a.push(i[r]);return a},e.getInvalidAriaAttributes=function(t){var i=e.getUserDefinedRoles(t),a=e.areRolesDefined(i);if(null!==a&&!a)return null;var n=[];i&&0!=i.length||(i=e.getImplicitRole(t));var l=e.getUserDefinedAriaAttributes(t),r=e.getElementAriaProperty(t),o=e.getAllowedAriaAttributes(t,i,r);if(l)for(var s=0;s<l.length;s++){var u=l[s].trim().toLowerCase();o.includes(u)||n.includes(u)||n.push(u)}return n},e.getConflictAriaAndHtmlAttributes=function(t){var i=e.getUserDefinedAriaAttributeNameValuePairs(t),a=e.getUserDefinedHtmlAttributeNameValuePairs(t),n=[];if(i&&i.length>0&&a&&a.length>0)for(var l=function(t){var l=e.getConflictOrOverlappingHtmlAttribute(i[t],a,"conflict");if(null===l)return"continue";l.forEach(function(e){"Failed"===e.result&&n.push({ariaAttr:i[t].name,htmlAttr:e.attr})})},r=0;r<i.length;r++)l(r);return n},e.getDeprecatedAriaRoles=function(t){if(!t)return null;var i=e.getRoles(t,!1),a=[];if(i&&i.length>0)for(var n=l.ARIADefinitions.globalDeprecatedRoles,r=0;r<i.length;r++)n.includes(i[r])&&a.push(i[r]);return a},e.getDeprecatedAriaAttributes=function(t){if(!t)return null;var i=t.attributes,a=[];if(i)for(var n=0;n<i.length;n++){var r=i[n].name;"aria-"===r.substring(0,5)&&a.push(r)}if(0===a.length)return[];var o=[],s=l.ARIADefinitions.globalDeprecatedProperties;for(n=0;n<a.length;n++)s.includes(a[n])&&o.push({role:"any",attribute:a[n]});var u=e.getRoles(t,!1);if(u&&u.length>0)for(n=0;n<u.length;n++){var d=l.ARIADefinitions.designPatterns[u[n]];if(d){var c=d.deprecatedProps;if(c&&c.length>0)for(var m=0;m<a.length;m++)c.includes(a[m])&&o.push({role:u[n],attribute:a[m]})}}return o},e.isNodeInGrid=function(t){return null!=e.getAncestorWithRole(t,"grid")},e.navLinkKeywords=["start","next","prev","previous","contents","index"],e.rulesThatHaveToCheckHidden=["RPT_Elem_UniqueId"],e.ariaAttributeRoleDefaults={alert:{"aria-live":"assertive","aria-atomic":"true"},combobox:{"aria-haspopup":"listbox"},listbox:{"aria-orientation":"vertical"},log:{"aria-live":"polite"},menu:{"aria-orientation":"vertical"},menubar:{"aria-orientation":"horizontal"},meter:{"aria-valuemin":"0","aria-valuemax":"100"},option:{"aria-selected":"false"},progressbar:{"aria-valuemin":"0","aria-valuemax":"100"},scrollbar:{"aria-orientation":"vertical","aria-valuemin":"0","aria-valuemax":"100"},separator:{"aria-orientation":"horizontal","aria-valuemin":"0","aria-valuemax":"100"},slider:{"aria-orientation":"horizontal","aria-valuemin":"0","aria-valuemax":"100"},spinbutton:{},status:{"aria-live":"polite","aria-atomic":"true"},tab:{"aria-selected":"false"},tablist:{"aria-orientation":"horizontal"},toolbar:{"aria-orientation":"horizontal"},tree:{"aria-orientation":"vertical"}},e.ariaAttributeGlobalDefaults={"aria-atomic":"false","aria-autocomplete":"none","aria-busy":"false","aria-checked":void 0,"aria-current":"false","aria-disabled":"false","aria-dropeffect":"none","aria-expanded":void 0,"aria-grabbed":void 0,"aria-haspopup":"false","aria-hidden":void 0,"aria-invalid":"false","aria-live":"off","aria-modal":"false","aria-multiline":"false","aria-multiselectable":"false","aria-orientation":void 0,"aria-pressed":void 0,"aria-readonly":"false","aria-required":"false","aria-selected":void 0,"aria-sort":"none"},e.ariaAttributeImplicitMappings={"aria-autocomplete":{form:function(e){return"off"===e.getAttribute("autocomplete")?"none":"both"},input:function(e){return"off"===e.getAttribute("autocomplete")?"none":"both"},select:function(e){return"off"===e.getAttribute("autocomplete")?"none":"both"},textarea:function(e){return"off"===e.getAttribute("autocomplete")?"none":"both"}},"aria-checked":{input:function(e){return e.hasAttribute("indeterminate")?"mixed":""+e.hasAttribute("checked")},menuitem:function(e){return e.hasAttribute("indeterminate")?"mixed":""+e.hasAttribute("checked")},"*":function(e){if(e.hasAttribute("indeterminate"))return"mixed"}},"aria-disabled":{button:function(e){return e.hasAttribute("disabled")?"true":"false"},fieldset:function(e){return e.hasAttribute("disabled")?"true":"false"},input:function(e){return e.hasAttribute("disabled")?"true":"false"},optgroup:function(e){return e.hasAttribute("disabled")?"true":"false"},option:function(e){return e.hasAttribute("disabled")?"true":"false"},select:function(e){return e.hasAttribute("disabled")?"true":"false"},textarea:function(e){return e.hasAttribute("disabled")?"true":"false"}},"aria-expanded":{details:function(e){return e.getAttribute("open")},dialog:function(e){return e.getAttribute("open")}},"aria-multiselectable":{select:function(e){if(e.hasAttribute("multiple"))return"true"}},"aria-placeholder":{input:function(e){return e.getAttribute("placeholder")},textarea:function(e){return e.getAttribute("placeholder")}},"aria-required":{input:function(e){return e.getAttribute("required")},select:function(e){return e.getAttribute("required")},textarea:function(e){return e.getAttribute("required")}}},e}();t.AriaUtil=p},4919(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.CSSUtil=void 0;var a=i(4566),n=i(7139),l=i(7011),r=i(7507),o=i(3864),s=function(){function e(){}return e.selectorMatchesElem=function(e,t){if(!t||0===t.length||""===t.trim())return!1;try{if("function"==typeof e.matches)return e.matches(t);if("function"==typeof e.webkitMatchesSelector)return e.webkitMatchesSelector(t);if("function"==typeof e.msMatchesSelector)return e.msMatchesSelector(t);if("function"==typeof e.matchesSelector)return e.matchesSelector(t);var i=e.ownerDocument||e.document;if(!i)return!1;var a=i.querySelectorAll(t);return Array.from(a).includes(e)}catch(e){return!1}},e.getComputedStyle=function(e,t){return e?e.ownerDocument.defaultView.getComputedStyle(e,t):null},e.getParsedStylesheetRules=function(e){var t=a.CacheUtil.getCache(e,"RPTUtil_ParsedStylesheetRules",null);if(t)return t;for(var i=[],n=0;n<e.styleSheets.length;++n){var l=e.styleSheets[n];try{if(l&&l.cssRules)for(var r=0;r<l.cssRules.length;++r){var o=l.cssRules[r],s=o.selectorText;if(s){var u=s.match(/^(.*)(:[a-zA-Z-]*)$/),d=!!u,c=d?u[1]:s,m=d?u[2]:"";i.push({fullRuleSelector:s,hasPseudoClass:d,selMain:c,selPseudo:m,style:o.style})}}}catch(e){if(!e.toString().includes("Cannot access rules")&&!e.toString().includes("SecurityError:"))throw e}}return a.CacheUtil.setCache(e,"RPTUtil_ParsedStylesheetRules",i),i},e.fillStyle=function(e,t){for(var i=0;i<t.length;++i){if("all"===t[i]&&t[t[i]]){for(var a=0,n=e;a<n.length;a++){var l=n[a];for(var r in l)delete l[r]}break}r=t[i];for(var o=0,s=e;o<s.length;o++){l=s[o];var u=t.getPropertyPriority(r);if(r in l&&l[r].endsWith("!important")){if("important"!==u||l[r].startsWith("inherit")||l[r].startsWith("unset"))continue;l[r]=t[r]+" !important"}else l[r]=t[r]+("important"===u?" !important":"")}}},e.getDefinedStylesInternal=function(t,i,a){for(var n={},l={},r={},o=0,s=a;o<s.length;o++){var u=s[o];l[u]={},r[u]={}}for(var d=e.getParsedStylesheetRules(t.ownerDocument),c=a.includes(":focus"),m=function(n){if(null!==i&&!i.some(function(e){return!!n.style[e]}))return"continue";var o=n.selPseudo,s=n.hasPseudoClass,u=n.selMain;if(c&&":focus"===o&&(u=u.replace(/([ >][^+~ >]+):focus-within/g,"$1")),e.selectorMatchesElem(t,u))for(var d=0,m=a;d<m.length;d++){var p=m[d],h=l[p],g=r[p];s||e.fillStyle([h,g],n.style),o===p&&e.fillStyle([g],n.style)}},p=0,h=d;p<h.length;p++)m(h[p]);for(var g=0,b=a;g<b.length;g++){u=b[g];var _=l[u],f=r[u];if(e.fillStyle([_,f],t.style),""===u)n[u]=_;else{for(var v={},A=Object.keys(f),w=0;w<A.length;w++){var y=A[w];f[y]!==_[y]&&(v[y]=f[y])}n[u]=v}}return n},e.getDefinedStylesMultiple=function(t,i,n){if(!t)return null;var l={},r=null===i?"all":i.slice().sort().join(","),o=a.CacheUtil.getCache(t,"RPTUtil_DefinedStyles",null);o||(o={});var s=o[r],u=[];if(s){for(var d=0,c=n;d<c.length;d++)void 0!==s[g=c[d]]?l[g]=s[g]:u.push(g);if(0===u.length)return l}else s={},u=n;if(u.length>0){for(var m=e.getDefinedStylesInternal(t,i,u),p=0,h=u;p<h.length;p++){var g;l[g=h[p]]=m[g],s[g]=m[g]}o[r]=s,a.CacheUtil.setCache(t,"RPTUtil_DefinedStyles",o)}return l},e.getDefinedStyles=function(t,i,n){if(!t)return null;var l=null===i?"all":i.slice().sort().join(","),r=n||"",o=a.CacheUtil.getCache(t,"RPTUtil_DefinedStyles",null);o||(o={});var s=o[l];if(s||(s={}),void 0!==s[r])return s[r];var u=e.getDefinedStylesInternal(t,i,[r])[r];return s[r]=u,o[l]=s,a.CacheUtil.setCache(t,"RPTUtil_DefinedStyles",o),u},e.getMediaOrientationTransform=function(e){var t=a.CacheUtil.getCache(e,"RPTUtil_MediaOrientationTransforms",null);if(t)return t;for(var i={},n=0;n<e.styleSheets.length;++n){var l=e.styleSheets[n];try{if(l&&l.cssRules)for(var r=0;r<l.cssRules.length;++r){var o=l.cssRules[r];if(4===o.MEDIA_RULE){var s=o;if(s&&s.media)for(var u=s.media,d=0;d<u.length;d++)if(u.item(d)){var c=u.item(d).toLocaleLowerCase(),m=i[c];m||(m={});for(var p=s.cssRules,h=0;h<p.length;++h)if(1===p[h].STYLE_RULE){var g=p[h],b=g.selectorText;if(b){for(var _={},f=g.style,v=0;v<f.length;++v){var A=f[v],w=A.toLocaleLowerCase();if("transform"===w){if("all"===A&&f[A]){_={};break}_[A]=f[A]}else"rotate"===w&&(_[A]=f[A])}Object.keys(_).length>0&&(m[b]=_)}}Object.keys(m).length>0&&(i[c]=m)}}}}catch(e){if(!e.toString().includes("Cannot access rules")&&!e.toString().includes("SecurityError:"))throw e}}return a.CacheUtil.setCache(e,"RPTUtil_MediaOrientationTransforms",i),i},e.getRotationDegree=function(e){var t=0;try{if(!e)return t;for(var i=(e=e.replaceAll(", ",",")).split(" "),a=0;a<i.length;a++){var n=i[a].trim();if(""!==n)if(n.startsWith("rotate3d")){var l=n.indexOf("("),r=n.indexOf(")");if(-1!==l&&-1!==r){var o=n.substring(l+1,r),s=void 0;if(o&&(s=o.split(",")),s&&4===s.length){if(!(d=s[3]))continue;if((d=d.trim()).endsWith("turn")){var u=d.substring(0,d.length-4);u=parseFloat(u),isNaN(u)||(t=360*u)}else d.endsWith("rad")?(u=d.substring(0,d.length-3),u=parseFloat(u),isNaN(u)||(t=180*u/Math.PI)):d.endsWith("deg")&&(u=d.substring(0,d.length-3),u=parseFloat(u),isNaN(u)||(t+=u))}}}else if(n.startsWith("rotate")||n.startsWith("rotateZ")){if(l=n.indexOf("("),r=n.indexOf(")"),-1!==l&&-1!==r){var d;if(!(d=n.substring(l+1,r)))continue;(d=d.trim()).endsWith("turn")?(u=d.substring(0,d.length-4),u=parseFloat(u),isNaN(u)||(t=360*u)):d.endsWith("rad")?(u=d.substring(0,d.length-3),u=parseFloat(u),isNaN(u)||(t=180*u/Math.PI)):d.endsWith("deg")&&(u=d.substring(0,d.length-3),u=parseFloat(u),isNaN(u)||(t+=u))}}else if(n.startsWith("matrix3d")){if(l=n.indexOf("("),r=n.indexOf(")"),-1!==l&&-1!==r&&(o=n.substring(l+1,r),s=null,o&&(s=o.split(",")),null!==s)){var c=Math.atan2(s[4],s[5]);t+=Math.round(Math.round(180*c/Math.PI))}}else n.startsWith("matrix")&&(l=n.indexOf("("),r=n.indexOf(")"),-1!==l&&-1!==r&&(o=n.substring(l+1,r),s=null,o&&(s=o.split(",")),null!==s&&(c=Math.atan2(s[1],s[0]),t+=Math.round(Math.round(180*c/Math.PI)))))}for(;t>=360;)t-=360}catch(e){throw console.log("Cannot retrieve rotation degree: "+e),e}return t},e.getPixelsFromStyle=function(t,i){if(!t)return 0;var a=t.trim().match(/(-?[\d.]+)([a-z%]*)/);if(null===a)return 0;if(""===a[2]||0===a[1])return 0;var n=e.convertValue2Pixels(a[2],a[1],i);return null===n?n:parseFloat(n)},e.convertValue2Pixels=function(e,t,i){if(0===t)return 0;e||(e="px");var a={px:function(e){return e},cm:function(e){return 37.8*e},mm:function(e){return 3.78*e},q:function(e){return.95*e},in:function(e){return 96*e},pc:function(e){return 16*e},pt:function(e){return 1.33*e},rem:function(e){return e*parseFloat(getComputedStyle(i.ownerDocument.documentElement).getPropertyValue("font-size"))},em:function(e){return e*parseFloat(getComputedStyle(i).getPropertyValue("font-size"))},vw:function(e){return e/100*i.ownerDocument.defaultView.innerWidth},vh:function(e){return e/100*i.ownerDocument.defaultView.innerHeight},"%":function(e){return e/100*parseFloat(getComputedStyle(i).getPropertyValue("font-size"))}};return e in a?a[e](t):null},e.isMaterialIconFont=function(t){var i={"Material Icons":"https://fonts.googleapis.com/icon?family=Material+Icons"},a=e.getDefinedStyles(t,["font-family"])["font-family"],n=!1;if(a&&a.split(",")[0].replace(/['"]+/g,"").trim()in i&&(n=!0),!n){var l=t.classList;for(var r in{"material-icons":"https://fonts.googleapis.com/icon?family=Material+Icons"})if(l.contains(r)){n=!0;break}}if(!n)return!1;for(var o=!1,s=t.ownerDocument.styleSheets,u=0;u<s.length;u++)if(s&&s.length>0&&Object.values(i).indexOf(s[u].href)>-1){o=!0;break}return o},e.getWeightNumber=function(e){var t={light:100,bold:700};return parseInt(e)||(e in t?t[e]:400)},e.getFontInPixels=function(t,i){var a=parseFloat(t);if(!a)return{"xx-small":16,"x-small":10,small:13,medium:16,large:18,"x-large":24,"xx-large":32}[t];var n=t.substring((""+a).length);return e.convertValue2Pixels(n,a,i)},e.getCSSStyle=function(e){var t="";if(null===e)return[];if(e.IBM_CSS_THB)return e.IBM_CSS_THB;if("style"===e.nodeName.toLowerCase())void 0!==(t=e.innerText)&&""!==t.trim()||(t=e.textContent);else{if(!e.hasAttribute("style"))return[];t=e.getAttribute("style")}if(null===t||0===t.trim().length)return[];var i=/\s*([^:\s]+)\s*:\s*([^;$}]+)\s*(;|$)/g,a=/\s*([^{]*){([^}]*)}/g;if(-1===(t=t.replace(/(\/\*+(?:(?:(?:[^\*])+)|(?:[\*]+(?!\/)))[*]+\/)|\/\/.*/g," ")).indexOf("{")){for(var n={},l=void 0;null!=(l=i.exec(t));)n[l[1]]=l[2].trim().toLowerCase();var r=[{selector:null,values:n}];return e.IBM_CSS_THB=r,r}r=[],l=void 0;for(var o=void 0;null!=(l=a.exec(t));){n={};for(var s=l[1],u=l[2];null!=(o=i.exec(u));)n[o[1]]=o[2].trim().toLowerCase();r.push({selector:s,values:n})}return e.IBM_CSS_THB=r,r},e.getInlineStatus=function(e){if(!e)return null;var t=getComputedStyle(e);if(!t)return null;var i={inline:!1,text:!1,violation:null};if("inline"!==t.getPropertyValue("display"))return i;i.inline=!0;var a=e.parentElement;if(!a)return i;var l=new r.DOMMapper,o=l.getUnadjustedBounds(e),s=getComputedStyle(a).getPropertyValue("display");if("block"!==s&&"inline-block"!==s)return n.CommonUtil.isInnerTextOnlyEmpty(a)||(i.text=!0),i;function u(e,t){if(e.nodeType===Node.TEXT_NODE)return e.nodeValue&&e.nodeValue.trim().length>0?"yes":"no";if(e.nodeType===Node.ELEMENT_NODE){if("br"===e.nodeName.toLowerCase())return"block";if("inline"===getComputedStyle(e).getPropertyValue("display")){if(n.CommonUtil.isTarget(e)&&o.width<24){var a=l.getUnadjustedBounds(e);return t&&Math.round(o.width/2)+o.left-a.left<24||!t&&Math.round(o.width/2)+o.left-(a.left+a.width)<24?(i.violation=e.nodeName.toLowerCase(),"violation"):"no"}return n.CommonUtil.isInnerTextOnlyEmpty(e)?"no":"yes"}return"block"}return"block"}for(var d=e.nextSibling;d;){if("yes"===(c=u(d,!0))){i.text=!0;break}if("block"===c)break;d=d.nextSibling}for(d=e.previousSibling;d;){var c;if("yes"===(c=u(d,!1))){i.text=!0;break}if("block"===c)break;d=d.previousSibling}return i},e.isTargetBrowserDefault=function(t){if(!t)return!1;var i=l.AriaUtil.getRoles(t,!1);if(i&&i.length>0)return!1;var a=e.getDefinedStyles(t,["line-height","height","width","min-height","min-width","font-size","margin-top","margin-bottom","margin-left","margin-right"]);return!(a["line-height"]||a.height||a.width||a["min-height"]||a["min-width"]||a["font-size"]||a["margin-top"]||a["margin-bottom"]||a["margin-left"]||a["margin-right"])},e.containsCKJ=function(e){return!!e&&e.trim().replace(/(?:[\u4e00-\u9fff\u3400-\u4dbf])+/g,"").length!==e.trim().length},e.getAncestorWithStyles=function(t,i,n){void 0===n&&(n=[]);var l="AriaUtil_AncestorWithStyles_"+JSON.stringify(i)+"_"+JSON.stringify(n),r=a.CacheUtil.getCache(t,l,null);if(null!==r)return"NOT_FOUND"===r?null:r;for(var s=t;null!==s;)if(1===s.nodeType&&"http://www.w3.org/2000/svg"!==s.namespaceURI){var u=e.getDefinedStyles(s,Object.keys(i));for(var d in i){var c=u[d];if(c&&(c=c.split(" ")[0],!n.includes(c))){var m=i[d];if(m.includes("*"))return a.CacheUtil.setCache(t,l,s),s;if(m.includes(c))return a.CacheUtil.setCache(t,l,s),s}}s=o.DOMWalker.parentElement(s)}else s=o.DOMWalker.parentElement(s);return a.CacheUtil.setCache(t,l,"NOT_FOUND"),null},e.getValueUnitPair=function(e){if(!e)return null;if(Number.isInteger(e))return["px",e];var t=parseInt(e);if(isNaN(t))return null;var i=(e=e.trim().toLowerCase()).trim().match(/([a-z]+)$/),a="px";return i&&(a=i[1]),[a,t]},e}();t.CSSUtil=s},4566(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.CacheUtil=void 0;var a=i(3864),n=function(){function e(){}return e.getCache=function(e,t,i){if(e){var a=(9===e.nodeType||e.nodeType,e);return void 0===a.aceCache&&(a.aceCache={}),void 0===a.aceCache[t]&&(a.aceCache[t]=i),a.aceCache[t]}},e.setCache=function(e,t,i){if(e){var a=(9===e.nodeType||e.nodeType,e);return void 0===a.aceCache&&(a.aceCache={}),a.aceCache[t]=i,i}},e.getSetCache=function(e,t,i){if(e){var a=(9===e.nodeType||e.nodeType,e);return void 0===a.aceCache&&(a.aceCache={}),void 0!==a.aceCache[t]&&void 0!==a.aceCache[t]||(a.aceCache[t]=i()),a.aceCache[t]}},e.clearCaches=function(e){var t=0;delete e.ownerDocument.aceCache;var i=new a.DOMWalker(e,!1,e,!0);do{++t,delete i.node.aceCache,i.node.ownerDocument&&delete i.node.ownerDocument.aceCache}while(i.nextNode());return t},e}();t.CacheUtil=n},167(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.ClipPathUtil=void 0;var a=i(4566),n=i(4919),l=function(){function e(){}return e.isNodeVisuallyHiddenByClipPath=function(t){if(!t||1!==t.nodeType)return!1;var i=t,l=a.CacheUtil.getCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",void 0);if(void 0!==l)return l;var r=n.CSSUtil.getComputedStyle(i),o=parseInt(r.width),s=parseInt(r.height),u=r["clip-path"];if(!u||"none"===u.trim()||""===u.trim())return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;var d=(u=u.trim().replace(/\s+/g," ").toLowerCase()).indexOf("inset(");if(-1!==d){var c=u.indexOf("round"),m=u.substring(u.indexOf("(")+1,u.indexOf(")"));if(-1!==c&&(m=u.substring(u.indexOf("(")+1,c)),1===(f=m.trim().split(" ")).length){var p=e.isClippedByInset(i,f[0],f[0],f[0],f[0]);return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",p),p}if(2===f.length)return p=e.isClippedByInset(i,f[0],f[1],f[0],f[1]),a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",p),p;if(3===f.length)return p=e.isClippedByInset(i,f[0],f[1],f[1],f[2]),a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",p),p;if(4===f.length)return p=e.isClippedByInset(i,f[0],f[1],f[2],f[3]),a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",p),p}if(-1!==(d=u.indexOf("rect("))){c=u.indexOf("round"),m=u.substring(u.indexOf("(")+1,u.indexOf(")")),-1!==c&&(m=u.substring(u.indexOf("(")+1,c)),"auto"===(f=m.trim().split(" "))[0]&&(f[0]="0px"),"auto"===f[3]&&(f[3]="0px"),"auto"===f[1]&&(f[1]="100%"),"auto"===f[2]&&(f[2]="100%"),f[2]=Math.max(f[0],f[2]),f[1]=Math.max(f[1],f[3]);var h=parseInt(f[0]);if(isNaN(h))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;if(f[0].endsWith("%"))h=h*s/100;else{if(!(L=n.CSSUtil.getValueUnitPair(h)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;h=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}if(h>=s)return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;var g=parseInt(f[3]);if(isNaN(g))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;if(f[3].endsWith("%"))g=g*o/100;else{if(!(L=n.CSSUtil.getValueUnitPair(g)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;g=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}if(g>=o)return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;var b=parseInt(f[1]);if(isNaN(b))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;if(f[1].endsWith("%"))b=b*o/100;else{if(!(L=n.CSSUtil.getValueUnitPair(b)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;b=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}var _=parseInt(f[2]);if(isNaN(_))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;if(f[2].endsWith("%"))_=_*s/100;else{if(!(L=n.CSSUtil.getValueUnitPair(_)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;_=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}return _-h<=e.THRESHOLD||b-g<=e.THRESHOLD?(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!0),!0):(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1)}if(-1!==(d=u.indexOf("xywh("))){c=u.indexOf("round"),m=u.substring(u.indexOf("(")+1,u.indexOf(")")),-1!==c&&(m=u.substring(u.indexOf("(")+1,c));var f=m.trim().split(" "),v=parseInt(f[0]);if(isNaN(v))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;if(f[0].endsWith("%"))v=v*o/100;else{if(!(L=n.CSSUtil.getValueUnitPair(top)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;v=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}if(v>=o)return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;var A=parseInt(f[1]);if(isNaN(A))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;if(f[1].endsWith("%"))A=A*s/100;else{if(!(L=n.CSSUtil.getValueUnitPair(A)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;scrollY=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}if(A>=s)return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;var w=parseInt(f[2]);if(isNaN(w))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;if(f[2].endsWith("%"))w=w*o/100;else{if(!(L=n.CSSUtil.getValueUnitPair(w)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;w=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}if(w<=e.THRESHOLD)return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!0),!0;var y=parseInt(f[3]);if(isNaN(y))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;if(f[3].endsWith("%"))y=y*s/100;else{if(!(L=n.CSSUtil.getValueUnitPair(y)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;y=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}return y<=e.THRESHOLD?(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!0),!0):(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1)}if(-1!==(d=u.indexOf("circle("))){f=(m=u.substring(u.indexOf("(")+1,u.indexOf(")"))).trim().split(" ");var C=parseInt(f[0]);if(isNaN(C))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;if(f[0].endsWith("%"))C=C*(o>s?s:o)/100;else{if(!(L=n.CSSUtil.getValueUnitPair(C)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;C=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}return C<=e.THRESHOLD?(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!0),!0):(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1)}if(-1!==(d=u.indexOf("ellipse("))){if((f=(m=u.substring(u.indexOf("(")+1,u.indexOf(")"))).trim().split(" ")).length>3&&"closest-side"===f[0]&&"farthest-side"===f[1]&&"at"===f[2]){if(C=parseInt(f[3]),4===f.length){if(f[3].endsWith("%"))C=C*(N=o>s?s:o)/100;else{if(!(L=n.CSSUtil.getValueUnitPair(C)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;C=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}return C<=e.THRESHOLD?(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!0),!0):(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1)}if(5===f.length)for(var k=3;k<f.length;k++){var R=parseInt(f[k]);if(f[k].endsWith("%"))R=R*(N=3===k?o:s)/100;else{if(!(L=n.CSSUtil.getValueUnitPair(R)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;R=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}return R<=e.THRESHOLD?(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!0),!0):(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1)}return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1}var x=u.indexOf("at");if(m=u.substring(u.indexOf("(")+1,u.indexOf(")")),-1!==x&&(m=u.substring(u.indexOf("(")+1,x)),2!==(f=m.trim().split(" ")).length)return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;for(k=0;k<f.length;k++){if(C=parseInt(f[k]),f[k].endsWith("%"))C=C*(N=0===k?o:s)/100;else{if(!(L=n.CSSUtil.getValueUnitPair(C)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;C=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}return C<=e.THRESHOLD?(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!0),!0):(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1)}return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1}if(-1!==(d=u.indexOf("polygon("))){"nonzero"!==(f=(m=u.substring(u.indexOf("(")+1,u.indexOf(")"))).trim().split(","))[0]&&"evenodd"!==f[0]||f.shift(),A=0,v=0;var P=!1,T=!1;for(k=0;k<f.length;k++){var U=f[k].trim().split(" ");if(2!=U.length)return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;for(var I=[0,0],E=0;E<2;E++){var N=parseInt(U[E]);if(isNaN(N))return!1;if(U[E].endsWith("%"))I[E]=0===E?N*o/100:N*s/100;else{var L;if(!(L=n.CSSUtil.getValueUnitPair(U[E])))return!1;I[E]=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}}0===k&&(v=I[0],A=I[1]),Math.abs(I[0]-v)>=e.THRESHOLD&&(P=!0),Math.abs(I[1]-A)>=e.THRESHOLD&&(T=!0)}return P&&T?(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1):(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!0),!0)}return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1},e.isClippedByInset=function(t,i,a,l,r){void 0===a&&(a="0px"),void 0===l&&(l="0px"),void 0===r&&(r="0px");var o=n.CSSUtil.getComputedStyle(t),s=parseInt(o.width),u=parseInt(o.height),d=parseInt(i);if(isNaN(d))return!1;if(i.endsWith("%"))d=d*u/100;else{if(!(h=n.CSSUtil.getValueUnitPair(i)))return!1;d=n.CSSUtil.convertValue2Pixels(h[0],h[1],t)}if(d>u)return!1;var c=parseInt(a);if(isNaN(c))return!1;if(a.endsWith("%"))c=c*s/100;else{if(!(h=n.CSSUtil.getValueUnitPair(a)))return!1;c=n.CSSUtil.convertValue2Pixels(h[0],h[1],t)}if(c>s)return!1;var m=parseInt(l);if(isNaN(m))return!1;if(l.endsWith("%"))m=m*u/100;else{if(!(h=n.CSSUtil.getValueUnitPair(l)))return!1;m=n.CSSUtil.convertValue2Pixels(h[0],h[1],t)}if(m>u)return!1;var p=parseInt(r);if(isNaN(p))return!1;if(r.endsWith("%"))p=p*s/100;else{var h;if(!(h=n.CSSUtil.getValueUnitPair(r)))return!1;p=n.CSSUtil.convertValue2Pixels(h[0],h[1],t)}return!(p>s)&&(u-(d+m)<=e.THRESHOLD||s-(c+p)<=e.THRESHOLD)},e.THRESHOLD=5,e}();t.ClipPathUtil=l},3883(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.ColorObj=t.ColorUtil=void 0;var a=i(3864),n=function(){function e(){}return e.Color=function(t){if(!t)return null;if("transparent"===(t=t.toLowerCase()))return new l(255,255,255,0);if(t in e.CSSColorLookup&&(t=e.CSSColorLookup[t]),t.startsWith("rgb(")){var i=/\s*rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/;return null===(a=t.match(i))?null:new l(a[1],a[2],a[3])}var a;if(t.startsWith("rgba("))return i=/\s*rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(.+)\s*\)/,null===(a=t.match(i))?null:new l(a[1],a[2],a[3],a[4]);if("#"!=t.charAt(0))return null;4===t.length&&(t="#"+t.charAt(1).repeat(2)+t.charAt(2).repeat(2)+t.charAt(3).repeat(2));var n=parseInt(t.substring(1,3),16),r=parseInt(t.substring(3,5),16),o=parseInt(t.substring(5,7),16);return new l(n,r,o)},e.ColorCombo=function(t){try{var i=t.ownerDocument;if(!i)return null;var n=i.defaultView;if(!n)return null;for(var l=[],r=t;r;)1===r.nodeType&&l.push(r),r=a.DOMWalker.parentElement(r);var o={hasGradient:!1,hasBGImage:!1,textShadow:!1,fg:null,bg:null},s=(b=n.getComputedStyle(t)).color;s||(s="black");for(var u=e.Color(s),d=/transparent|rgba?\([^)]+\)/gi,c=function(e,t,i){try{if(void 0===e.length)return e;for(var a=null,n=null,l=1;l<e.length;++l){for(var r=e[l-1],o=i.contrastRatio(e[l-1]),s=.1,u=0;s>1e-4;){for(;u+s<=1&&o>i.contrastRatio(e[l].mix(e[l-1],u+s).getOverlayColor(t));)r=e[l].mix(e[l-1],u+s).getOverlayColor(t),o=i.contrastRatio(r),u+=s;for(;u-s>=0&&o>i.contrastRatio(e[l].mix(e[l-1],u-s).getOverlayColor(t));)r=e[l].mix(e[l-1],u-s).getOverlayColor(t),o=i.contrastRatio(r),u-=s;s/=10}(null===n||n>o)&&(n=o,a=r)}return a}catch(e){console.log(e)}return t},m=e.Color("white"),p=null,h=null,g=null;l.length>0;){var b,_=l.pop();if(null!==(b=n.getComputedStyle(_))){var f=null;if(b.backgroundColor&&"transparent"!=b.backgroundColor&&"rgba(0, 0, 0, 0)"!=b.backgroundColor&&(f=e.Color(b.backgroundColor)),b.backgroundImage&&b.backgroundImage.indexOf&&-1!=b.backgroundImage.indexOf("gradient")){var v=b.backgroundImage.match(d);if(v){for(var A=[],w=0;w<v.length;++w)if(v[w].length){var y=e.Color(v[w]);if(void 0!==y.alpha&&y.alpha<1){var C=g||m;y=y.getOverlayColor(C)}A.push(y)}else v.splice(w--,1);f=c(A,g||m,u)}}null===p||b.opacity&&b.opacity.length>0&&parseFloat(b.opacity)<1?(null!=g&&(g.alpha=p*h,m=g.getOverlayColor(m)),p=1,h=null,g=null,b.opacity&&b.opacity.length>0&&(p=parseFloat(b.opacity)),null!=f&&(h=(g=f).alpha||1,delete g.alpha,1===p&&1===h&&(o.hasBGImage=!1,o.hasGradient=!1))):null!=f&&(null===g?(h=(g=f).alpha||1,delete g.alpha):h=(g=f.getOverlayColor(g)).alpha||1,1===p&&1===h&&1===(g.alpha||1)&&f.alpha),b.backgroundImage&&"none"!=b.backgroundImage&&(b.backgroundImage.indexOf&&-1!=b.backgroundImage.indexOf("gradient")?o.hasGradient=!0:o.hasBGImage=!0)}}return null!=g&&delete(u=u.getOverlayColor(g)).alpha,u.alpha=(u.alpha||1)*p,u=u.getOverlayColor(m),null!=g&&(g.alpha=p*h,m=g.getOverlayColor(m)),o.fg=u,o.bg=m,b.textShadow&&"none"!==b.textShadow&&(o.textShadow=!0),o}catch(e){return null}},e.CSSColorLookup={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",green:"#008000",greenyellow:"#adff2f",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgrey:"#d3d3d3",lightgreen:"#90ee90",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370d8",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#d87093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32",buttontext:"rgba(0, 0, 0, 0.847)",buttonface:"#ffffff",graytext:"rgba(0, 0, 0, 0.247)"},e}();t.ColorUtil=n;var l=function(){function e(e,t,i,a){function n(e){if("string"!=typeof e)return e;var t=e;return"%"!=(t=t.trim())[t.length-1]?parseInt(t):Math.round(2.55*parseFloat(t.substring(0,t.length-1)))}this.red=n(e),this.green=n(t),this.blue=n(i),void 0!==a&&(this.alpha="string"==typeof a?parseFloat(a):a)}return e.prototype.toHexHelp=function(e){var t=Math.round(e).toString(16);return 1===t.length?"0"+t:t},e.prototype.toHex=function(){return"#"+this.toHexHelp(this.red)+this.toHexHelp(this.green)+this.toHexHelp(this.blue)},e.prototype.contrastRatio=function(e){var t=this;void 0!==this.alpha&&(t=this.getOverlayColor(e));var i=t.relativeLuminance();if(!e.relativeLuminance){var a="";for(var n in e)a+=n+"\n";alert(e),alert(a)}var l=e.relativeLuminance();return i>l?(i+.05)/(l+.05):(l+.05)/(i+.05)},e.prototype.relativeLuminance=function(){var e=this.red/255,t=this.green/255,i=this.blue/255;return.2126*(e=e<=.04045?e/12.92:Math.pow((e+.055)/1.055,2.4))+.7152*(t=t<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4))+.0722*(i<=.04045?i/12.92:Math.pow((i+.055)/1.055,2.4))},e.prototype.mix=function(t,i){if(void 0===this.alpha&&void 0===t.alpha)return new e(i*this.red+(1-i)*t.red,i*this.green+(1-i)*t.green,i*this.blue+(1-i)*t.blue);var a=this.alpha?this.alpha:1,n=t.alpha?t.alpha:1;return new e(i*this.red+(1-i)*t.red,i*this.green+(1-i)*t.green,i*this.blue+(1-i)*t.blue,i*a+(1-i)*n)},e.prototype.getOverlayColor=function(e){if(void 0===this.alpha||this.alpha>=1)return this;if(this.alpha<0)return null;if(void 0!==e.alpha&&e.alpha<1)return null;var t=this.mix(e,this.alpha);return delete t.alpha,t},e.fromCSSColor=function(t){var i=-1,a=-1,l=-1;if((t=t.toLowerCase()).startsWith("rgb(")){var r=/\s*rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/;if(null===(o=t.match(r)))return null;i=o[1],a=o[2],l=o[3]}else if(t.startsWith("rgba(")){var o;if(r=/\s*rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(.+)\s*\)/,null===(o=t.match(r)))return null;i=o[1],a=o[2],l=o[3]}else{if("#"!=t.charAt(0)){if(!(t in n.CSSColorLookup))return null;t=n.CSSColorLookup[t]}var s=function(e){for(var t={a:10,b:11,c:12,d:13,e:14,f:15},i=0,a=0;a<e.length;++a)i=16*i+parseInt(e.charAt(a)in t?t[e.charAt(a)]:e.charAt(a));return i};4===t.length&&(t="#"+t.charAt(1).repeat(2)+t.charAt(2).repeat(2)+t.charAt(3).repeat(2)),i=s(t.substring(1,3)),a=s(t.substring(3,5)),l=s(t.substring(5,7))}return new e(i,a,l)},e}();t.ColorObj=l},7139(e,t,i){var a=this&&this.__spreadArray||function(e,t,i){if(i||2===arguments.length)for(var a,n=0,l=t.length;n<l;n++)!a&&n in t||(a||(a=Array.prototype.slice.call(t,0,n)),a[n]=t[n]);return e.concat(a||Array.prototype.slice.call(t))};Object.defineProperty(t,"__esModule",{value:!0}),t.CommonUtil=void 0;var n=i(9910),l=i(4566),r=i(7011),o=i(1950),s=i(3946),u=i(1686),d=i(3864),c=i(5279),m=function(){function e(){}return e.wordCount=function(e){return 0===(e=e.trim()).length?0:e.split(/\s+/g).length},e.isTabbable=function(t){if(!s.VisUtil.isNodeVisible(t))return!1;if(t.hasAttribute("inert")||u.DOMUtil.getAncestorWithAttribute(t,"inert",""))return!1;if(t.hasAttribute("tabindex"))return parseInt(t.getAttribute("tabindex"))>=0;var i=t.nodeName.toLowerCase();if(i in e.tabTagMap){var a=e.tabTagMap[i];return"function"==typeof a&&(a=a(t)),a}return!!t.hasAttribute("contenteditable")},e.isFocusable=function(t){return"undefined"!==t&&null!==t&&e.isTabbable(t)},e.isClickable=function(t){if(!s.VisUtil.isNodeVisible(t))return!1;var i=t.nodeName.toLowerCase();if(i in e.tabTagMap){var a=e.tabTagMap[i];return"function"==typeof a&&(a=a(t)),a}return!(!r.AriaUtil.isWidget(t)||!t.hasAttribute("tabindex"))},e.isTableDescendant=function(e){return e?e.aria.filter(function(e){return["table","grid","treegrid"].includes(e.role)}):null},e.tabIndexLEZero=function(t){if(e.hasAttribute(t,"tabindex")&&t.getAttribute("tabindex").match(/^-?\d+$/)){var i=parseInt(t.getAttribute("tabindex"));return 0===i||-1===i}return!1},e.getTabbableChildren=function(t){var i=0;if(t.firstChild||"IFRAME"===t.nodeName.toUpperCase())for(var a=new d.DOMWalker(t);a.nextNode()&&a.node!=t;)1==a.node.nodeType&&!a.bEndTag&&e.isTabbable(a.node)&&++i;return i},e.normalizeSpacing=function(e){return e?e.trim().replace(/\s+/g," "):""},e.isHtmlEquiv=function(e,t){var i=!1;if(e&&"input"===e.nodeName.toLowerCase()){var a=e.getAttribute("type").toLowerCase();a&&(-1!=t.indexOf("checkbox")?i="checkbox"===a:-1!=t.indexOf("radio")&&(i="radio"===a))}return i},e.nonExistantIDs=function(t,i){var a="";if(e.normalizeSpacing(i).length<1)return a;for(var n=i.split(" "),l=t.ownerDocument,r=0;r<n.length;r++){var o="//*[@id='"+n[r]+"']";l.evaluate(o,t,l.defaultNSResolver,0,null).iterateNext()||(a+=n[r]+", ")}return e.normalizeSpacing(a).length>=2?a.substring(0,a.length-2):""},e.getDocElementsByTag=function(e,t){var i=c.FragmentUtil.getOwnerFragment(e);t=t.toLowerCase();var a=l.CacheUtil.getCache(i,"RPT_DOCELEMSBYTAG",{});return t in a||(a[t]=i.querySelectorAll(t),l.CacheUtil.setCache(i,"RPT_DOCELEMSBYTAG",a)),a[t]},e.getChildByTag=function(t,i){return e.getChildByTagHidden(t,i,!1,!1)},e.getChildByTagHidden=function(t,i,a,n){for(var l=[],r=t.firstChild;null!=r;){if(r.nodeName.toLowerCase()===i){if((a||n&&!e.shouldCheckHiddenContent(r))&&!s.VisUtil.isNodeVisible(r)){r=r.nextSibling;continue}l.push(r)}r=r.nextSibling}return l},e.getElementsByRole=function(t,i){return e.getElementsByRoleHidden(t,i,!1,!1)},e.getElementsByRoleHidden=function(t,i,a,n){var o=null;if(null===(o=n?l.CacheUtil.getCache(t,"AriaUtil_GETELEMENTSBY_ROLE_IMPLICIT",null):l.CacheUtil.getCache(t,"AriaUtil_GETELEMENTSBY_ROLE",null))){o={};for(var s=t.body;null!==d.DOMWalker.parentNode(s);)s=d.DOMWalker.parentNode(s);for(var u=new d.DOMWalker(s);u.nextNode();)if(u.elem()&&!u.bEndTag){var c=[];if(u.elem()&&u.elem().hasAttribute("role")&&(c=u.elem().getAttribute("role").split(" ")),u.elem()&&0===c.length&&n){var m=r.AriaUtil.getImplicitRole(u.node);null!==m&&m.length>0&&(c=m)}if(0===c.length)continue;if(a&&e.shouldNodeBeSkippedHidden(u.node))continue;for(var p=0;p<c.length;++p)c[p]in o||(o[c[p]]=[]),o[c[p]].push(u.node)}n?l.CacheUtil.setCache(t,"AriaUtil_GETELEMENTSBY_ROLE_IMPLICIT",o):l.CacheUtil.setCache(t,"AriaUtil_GETELEMENTSBY_ROLE",o)}var h=[];if("string"==typeof i){var g=i;(i=[]).push(g)}if(i.length)for(p=0;p<i.length;++p){var b=o[i[p]];if(b)for(var _=0;_<b.length;++_)h.push(b[_])}return h},e.isTarget=function(t){if(!t||1!==t.nodeType||["html","body"].includes(t.nodeName.toLowerCase())||null!==e.getAncestor(t,["svg","pre","code","script","meta","head"])||!s.VisUtil.isNodeVisible(t)||s.VisUtil.isNodeVisuallyHidden(t)||e.isNodeDisabled(t)||s.VisUtil.isElementOffscreen(t))return!1;if(e.isClickable(t))return!0;var i=r.AriaUtil.getResolvedRole(t);if(!i)return!1;if(["listitem","menuitem","menuitemcheckbox","menuitemradio","option","radio","switch","treeitem"].includes(i)){var a=t.parentElement;if(a&&"group"===r.AriaUtil.getResolvedRole(a)&&(a=a.parentElement),a&&e.isTarget(a))return!0}return!1},e.getFileExt=function(e){var t=e.match(/\.(([^;?#\.]|^$)+)([;?#]|$)/);return null!=t&&t.length>=2?"."+t[1]:""},e.getFileAnchor=function(e){var t=e.match(/#(([^;?\.]|^$)+)([;?]|$)/);return null!=t&&t.length>=2?t[1]:""},e.checkObjEmbed=function(t,i,a){var n=t.nodeName.toLowerCase();if("object"!=n&&"embed"!=n&&"a"!=n&&"area"!=n)return!1;var l=!1;if(!l&&t.hasAttribute("type")&&(l=a(t.getAttribute("type").toLowerCase())),!l&&t.hasAttribute("codetype")&&(l=a(t.getAttribute("codetype"))),!l){var r="";"embed"===n?r=t.getAttribute("src"):"a"===n||"area"===n?r=t.getAttribute("href"):t.hasAttribute("data")&&(r=t.getAttribute("data")),null===r&&(r=""),l=i(e.getFileExt(r))}if(!l&&"object"===n)for(var o=e.getChildByTagHidden(t,"param",!1,!0),s=0;!l&&null!=o&&s<o.length;++s)l=o[s].hasAttribute("value")&&i(e.getFileExt(o[s].getAttribute("value")));return l},e.isAudioObjEmbedLink=function(t){return e.checkObjEmbed(t,e.isAudioExt,function(e){return e.startsWith("audio")})},e.isAudioExt=function(t){return e.valInArray(t.toLowerCase(),[".aif",".aifc",".aiff",".air",".asf",".au",".cda",".dsm",".dss",".dwd",".iff",".kar",".m1a",".med",".mp2",".mp3",".mpa",".pcm",".ra",".ram",".rm",".sam",".sf",".sf2",".smp",".snd",".svx",".ul",".voc",".wav",".wma",".wve"])},e.isVideoObjEmbedLink=function(t){return e.checkObjEmbed(t,e.isVideoExt,function(e){return e.startsWith("video")||e.startsWith("application/x-shockwave-flash")})},e.isVideoExt=function(t){return e.valInArray(t.toLowerCase(),[".asf",".avi",".divx",".dv",".m1v",".m2p",".m2v",".moov",".mov",".mp4",".mpeg",".mpg",".mpv",".ogm",".omf",".qt",".rm",".rv",".smi",".smil",".swf",".vob",".wmv",".rmvb",".mvb"])},e.isImageObjEmbedLink=function(t){return e.checkObjEmbed(t,e.isImgExt,function(e){return e.startsWith("image")})},e.isImgExt=function(t){return e.valInArray(t.toLowerCase(),e.image_extensions)},e.isHtmlExt=function(t){return e.valInArray(t.toLowerCase(),[".asp",".aspx",".cfm",".cfml",".cgi",".htm",".html",".shtm",".shtml",".php",".pl",".py",".shtm",".shtml",".xhtml"])},e.hasTriggered=function(e,t){return l.CacheUtil.getCache(e,t,!1)},e.triggerOnce=function(e,t,i){if(i)return!0;var a=l.CacheUtil.getCache(e,t,!1);return l.CacheUtil.setCache(e,t,!0),a},e.valInArray=function(e,t){for(var i in t)if(t[i]===e)return!0;return!1},e.getAncestor=function(e,t){for(var i=e;null!==i;){var a=i.nodeName.toLowerCase();if("string"==typeof t){if(a===t.toLowerCase())break}else if(t.length){for(var n in t)if(t[n]===a)return i}else if(a in t)break;i=d.DOMWalker.parentNode(i)}return i},e.isSibling=function(e,t){if(e&&t){var i=null;for(d.DOMWalker.parentNode(e)&&d.DOMWalker.parentNode(e).firstChild&&(i=d.DOMWalker.parentNode(e).firstChild);i;){if(i===t)return!0;i=i.nextSibling}}return!1},e.isDescendant=function(e,t){for(var i=d.DOMWalker.parentNode(t);null!=i;){if(i===e)return!0;i=d.DOMWalker.parentNode(i)}return!1},e.isDisabledByFirstChildFormElement=function(t){var i=["input","textarea","select","keygen","progress","meter","output"];if(null!=t.firstChild)for(var a=new d.DOMWalker(t);a.nextNode();)if(i.includes(a.node.nodeName.toLowerCase()))return!!e.isNodeDisabled(a.node);return!1},e.isDisabledByReferringElement=function(t){for(var i=t.getAttribute("id"),a=t.ownerDocument.body;null!==d.DOMWalker.parentNode(a);)a=d.DOMWalker.parentNode(a);for(var n=new d.DOMWalker(a);n.nextNode();)if(n.node&&1===n.node.nodeType&&n.elem()&&(n.elem().getAttribute("aria-describedby")||"").split(" ").includes(i)&&e.isNodeDisabled(n.node))return!0},e.getInputLabel=function(t){return e.getLabelForElement(t)},e.getLabelForElement=function(t){return e.getLabelForElementHidden(t,!1)},e.getLabelForElementHidden=function(t,i){var a=t.getRootNode();if(!l.CacheUtil.getCache((a.nodeType,a),"AriaUtil_LABELS",null)){for(var n={},r=e.getDocElementsByTag(t,"label"),o=0;o<r.length;++o)if(r[o].hasAttribute("for")){if(i&&!s.VisUtil.isNodeVisible(r[o]))continue;n[r[o].getAttribute("for")]=r[o]}l.CacheUtil.setCache((a.nodeType,a),"AriaUtil_LABELS",n)}if(t.hasAttribute("id")){var u=t.getAttribute("id");if(u.trim().length>0)return l.CacheUtil.getCache((a.nodeType,a),"AriaUtil_LABELS",{})[u]}return null},e.getElementAttribute=function(e,t){if(!(t&&e&&e.hasAttribute&&e.hasAttribute(t)))return null;var i=e.getAttribute(t);if(!n.ARIADefinitions.referenceProperties.includes(t))return i;for(var a=i.split(/ +/g),l=!1,r=0;a<a.length;++r){var o=document.getElementById(a[r]);if(o&&!u.DOMUtil.sameNode(o,e)){l=!0;break}}return l?i:null},e.hasImplicitLabel=function(t){var i=e.getAncestor(t,"label");if(i&&"label"===i.tagName.toLowerCase()&&e.isFirstFormElement(i,t)){var a=i.cloneNode(!0);return a=e.removeAllFormElementsFromLabel(a),e.hasInnerContentHidden(a)}return!1},e.getImplicitLabel=function(t){var i=e.getAncestor(t,"label");if(i&&"label"===i.tagName.toLowerCase()&&e.isFirstFormElement(i,t)){var a=i.cloneNode(!0);a=e.removeAllFormElementsFromLabel(a);var n=e.getInnerText(a);return n&&""!==n.trim()?n.trim():null}return null},e.getFormFieldLabel=function(t){var i="",a=null,n=e.getLabelForElementHidden(t,!0);if(n)a=n.innerText;else{if(!(n=e.getAncestor(t,"label"))||"label"!==n.tagName.toLowerCase()||!e.isFirstFormElement(n,t))return null;var l=n.cloneNode(!0);l=e.removeAllFormElementsFromLabel(l),a=e.getInnerText(l)}return a&&""!==a.trim()&&(i+=a.trim()),(a=e.getLabelTextFromAttribute(n,!0))&&""!==a.trim()&&(i+=a.trim()),(a=r.AriaUtil.getAriaLabel(n))&&""!==a.trim()&&(i+=a.trim()),i.trim()},e.getLabelTextFromAttribute=function(t,i){for(var a=null,n=0;n<t.children.length;n++){var l=t.children.item(n);if(e.form_labelable_elements.includes(l.nodeName.toLowerCase())){a=l;break}}for(var c=new d.DOMWalker(t),m="";c.nextNode()&&c.node!==t;)if(c.node&&1===c.node.nodeType&&c.elem()){var p=c.elem();if(i&&(s.VisUtil.isNodeHiddenFromAT(p)||s.VisUtil.isNodePresentational(p))||a&&a.contains(p))continue;var h=r.AriaUtil.getResolvedRole(p);if("textbox"===h){var g=p.getAttribute("value");g&&g.trim().length>0&&(m+=" "+g.trim())}else if("combobox"===h||"listbox"===h){var b=p.getAttribute("aria-activedescendant")||p.getAttribute("aria-selected")||p.getAttribute("aria-checked");if(b){var _=p.ownerDocument.getElementById(b);if(_&&!u.DOMUtil.sameNode(p,_)){var f=o.AccNameUtil.computeAccessibleName(_);f&&f.name&&(m+=" "+f.name.trim())}}}else if(["progressbar","scrollbar","slider","spinbutton","meter"].includes(h)){var v=p.getAttribute("aria-valuetext");v&&v.trim().length>0&&(m+=" "+v.trim()),(v=p.getAttribute("aria-valuenow"))&&v.trim().length>0&&(m+=" "+v.trim()),(v=p.getAttribute("value"))&&v.trim().length>0&&(m+=" "+v.trim())}var A=r.AriaUtil.getAriaLabel(p);A&&""!==A.trim()&&(m+=" "+A.trim())}return m.trim()},e.isFirstFormElement=function(t,i){if(null!=t.firstChild)for(var a=new d.DOMWalker(t);a.nextNode();)if(-1!==e.form_labelable_elements.indexOf(a.node.nodeName.toLowerCase()))return a.node===i;return!1},e.isShadowHostElement=function(t){if(e.isShadowElement(t))return!1;for(var i=t;i;){if(i.shadowRoot)return!0;i=d.DOMWalker.parentElement(i)}return!1},e.isShadowElement=function(e){return"[object ShadowRoot]"===e.getRootNode().toString()},e.removeAllFormElementsFromLabel=function(e){for(var t=["input","textarea","select","button","datalist","optgroup","option","keygen","output","progress","meter"],i=e.childNodes,a=0;a<i.length;a++)t.indexOf(i[a].nodeName.toLowerCase())>-1&&e.removeChild(i[a]);return e},e.isIdReferToSelf=function(e,t){if(!t||""===t.trim())return!1;for(var i=t.trim().split(" "),a=0,n=i.length;a<n;++a){var l=c.FragmentUtil.getById(e,i[a]);if(l&&u.DOMUtil.sameNode(l,e))return!0}return!1},e.nodeDepth=function(e){for(var t=0,i=e;null!==i;)i=d.DOMWalker.parentNode(i),t+=1;return t},e.compareNodeOrder=function(t,i){if(t===i)return 0;var a=e.nodeDepth(t),n=e.nodeDepth(i);if(n>a){for(var l=0;l<n-a;++l)i=d.DOMWalker.parentNode(i);if(t===i)return-2}else if(a>n){for(l=0;l<a-n;++l)t=d.DOMWalker.parentNode(t);if(t===i)return 2}for(;null!=t&&null!=i&&d.DOMWalker.parentNode(t)!=d.DOMWalker.parentNode(i);)t=d.DOMWalker.parentNode(t),i=d.DOMWalker.parentNode(i);if(null===t||null===i||d.DOMWalker.parentNode(t)!=d.DOMWalker.parentNode(i))return null;for(;null!=i&&i!=t;)i=i.previousSibling;return null===i?1:-1},e.attributeNonEmpty=function(e,t){return e.hasAttribute(t)&&e.getAttribute(t).trim().length>0},e.getFrameByName=function(e,t){for(var i=[e.ownerDocument.defaultView],a=0;a<i.length;){try{if(i[a].name===t)return i[a];for(var n=0;n<i[a].frames.length;++n)try{i[a].frames[n]&&!i.includes(i[a].frames[n])&&i.push(i[a].frames[n])}catch(e){}}catch(e){}++a}return null},e.defaultNSResolver=function(e){var t;switch(e){case"html":t="http://www.w3.org/1999/xhtml";case"x2":t="http://www.w3.org/TR/xhtml2";case"x":t="http://www.w3.org/1999/xhtml";case"xhtml":t="http://www.w3.org/1999/xhtml";default:t=null}return t},e.isInnerTextOnlyEmpty=function(t){var i=t.innerText;null!=i&&0!==i.trim().length||"slot"===t.nodeName.toLowerCase()||void 0===t.textContent||(i=t.textContent);var a=!(null!==i&&i.trim().length>0);if(1===t.nodeType&&"slot"===t.nodeName.toLowerCase())for(var n=0,l=t.assignedNodes();n<l.length;n++){var r=l[n];a=a&&e.isInnerTextEmpty(r)}return a},e.getInnerText=function(e){var t=e.innerText;return null!=t&&""!==t.trim()||(t=e.textContent),t},e.getOnScreenInnerText=function(t){if(!t)return null;if(3===t.nodeType)return t.nodeValue();for(var i="",a=new d.DOMWalker(t);a.nextNode()&&a.node!==t&&a.node!==t.parentNode;)if(!a.bEndTag){if(1===a.node.nodeType&&(s.VisUtil.hiddenByDefaultElements.includes(a.node.nodeName.toLowerCase())||!s.VisUtil.isNodeVisible(a.node)||s.VisUtil.isElementOffscreen(a.node))){if("title"===a.node.nodeName.toLowerCase()&&e.getAncestor(a.node,"svg"))continue;if(a.node.nextSibling){3===a.node.nextSibling.nodeType&&a.node.nextSibling.nodeValue&&""!==a.node.nextSibling.nodeValue.trim()&&(i+=" "+a.node.nextSibling.nodeValue.trim()),a.node=a.node.nextSibling;continue}break}3===a.node.nodeType&&a.node.nodeValue&&""!==a.node.nodeValue.trim()&&(i+=" "+a.node.nodeValue.trim())}return i.trim()},e.getNodeText=function(e){if(!e)return"";for(var t="",i=e.childNodes,a=0;a<i.length;++a)3==i[a].nodeType&&(t+=i[a].nodeValue);return t},e.isInnerTextEmpty=function(t){var i=e.getInnerText(t);return!(null!=i&&i.trim().length>0)},e.hasInnerContent=function(t){var i=e.getInnerText(t),a=null!==i&&i.trim().length>0;if(null!==t.firstChild)for(var n=new d.DOMWalker(t);!a&&n.nextNode();)a="img"===n.node.nodeName.toLowerCase()&&e.attributeNonEmpty(n.node,"alt");return a},e.hasInnerContentHidden=function(t){return e.hasInnerContentHiddenHyperLink(t,!1)},e.svgHasName=function(t){return e.attributeNonEmpty(t,"aria-label")||e.attributeNonEmpty(t,"aria-labelledby")||!!t.querySelector(":scope > title")},e.hasInnerContentHiddenHyperLink=function(t,i){if(!t)return!1;var a=!1;if(null!=t.firstElementChild)for(var n=new d.DOMWalker(t);!a&&n.nextNode()&&n.node!=t;){var l=n.node;if(!((a="img"===l.nodeName.toLowerCase()&&(e.attributeNonEmpty(l,"alt")||e.attributeNonEmpty(l,"title"))&&!s.VisUtil.isNodeHiddenFromAT(l)&&!s.VisUtil.isNodePresentational(l)||"svg"===l.nodeName.toLowerCase()&&e.svgHasName(l))||1!==l.nodeType||s.VisUtil.isNodeHiddenFromAT(l)||s.VisUtil.isNodePresentational(l)||(a=!e.isInnerTextOnlyEmpty(l))||!0!==i)){a=e.attributeNonEmpty(l,"aria-label")||e.attributeNonEmpty(l,"aria-labelledby");var r=l.ownerDocument;if(r){var o=r.defaultView;if(o){var u=o.getComputedStyle(l);a||null==u||(a=(u.backgroundImage&&u.backgroundImage.indexOf||u.content)&&e.attributeNonEmpty(l,"alt"))}}}3===l.nodeType&&d.DOMWalker.parentElement(l)===t&&(a=!e.isInnerTextEmpty(l))}else a=!e.isInnerTextEmpty(t);return a},e.hasInnerContentOrAlt=function(t){var i=e.getInnerText(t),a=null!=i&&i.trim().length>0||e.attributeNonEmpty(t,"alt");if(null!=t.firstChild)for(var n=new d.DOMWalker(t);!a&&n.nextNode()&&n.node!=t;)!(a="img"===n.node.nodeName.toLowerCase()&&e.attributeNonEmpty(n.node,"alt"))&&(r.AriaUtil.hasRole(n.node,"button",!0)||r.AriaUtil.hasRole(n.node,"textbox"))&&(r.AriaUtil.hasAriaLabel(n.node)||e.attributeNonEmpty(n.node,"title")||e.getLabelForElementHidden(n.elem(),!0))&&(a=!0);return a},e.concatUniqueArrayItem=function(e,t){return-1===t.indexOf(e)&&null!==e&&t.push(e),t},e.concatUniqueArrayItemList=function(t,i){for(var a=0;null!==t&&a<t.length;a++)i=e.concatUniqueArrayItem(t[a],i);return i},e.reduceArrayItemList=function(e,t){return t&&t.length>0&&e&&e.length>0?t.filter(function(t){return!e.includes(t)}):t},e.getScopeForTh=function(e){if(e.hasAttribute("scope")){var t=e.getAttribute("scope").toLowerCase();if("row"===t||"rowgroup"===t)return"row";if("col"===t||"colgroup"===t)return"column"}var i=a([],e.parentElement.children,!0).filter(function(e){return 1===e.nodeType&&"th"!=e.tagName.toLowerCase()});return null===i||0===i.length?"column":"row"},e.getControlOfLabel=function(t){var i=e.getAncestor(t,"label");if(i&&i.hasAttribute("for"))return c.FragmentUtil.getById(t,i.getAttribute("for"));for(var a={},n=t;n;){if(1===n.nodeType){var r=n;r.hasAttribute("id")&&(a[r.getAttribute("id")]=!0)}n=d.DOMWalker.parentNode(n)}if(0===Object.keys(a).length)return null;for(var o=1===t.nodeType?t.getAttribute("aria-labelledby"):null,s=l.CacheUtil.getSetCache(t.ownerDocument,"CommonUtil::getControlOfLabel",function(){return t.ownerDocument.querySelectorAll("*[aria-labelledby]")}),u=0;u<s.length;++u)for(var m=s[u],p=0,h=m.getAttribute("aria-labelledby").split(" ");p<h.length;p++)if(h[p]in a&&!e.isIdReferToSelf(t,o))return m;return null},e.isNodeDisabled=function(t){var i=l.CacheUtil.getCache(t,"PT_NODE_DISABLED",void 0);if(void 0!==i)return i;i=!1,3===t.nodeType&&(t=d.DOMWalker.parentNode(t));var a=t.nodeName.toLowerCase(),r=t.hasAttribute("disabled"),o=i,s=t.hasAttribute("aria-disabled")&&"true"===t.getAttribute("aria-disabled");if(o||r&&n.ARIADefinitions.elementsAllowedDisabled.indexOf(a)>-1||s)return i=!0,l.CacheUtil.setCache(t,"PT_NODE_DISABLED",i),!0;var u=d.DOMWalker.parentNode(t);if(null!=u&&1===u.nodeType){var c=e.isNodeDisabled(u);return c&&(i=!0),l.CacheUtil.setCache(t,"PT_NODE_DISABLED",i),c}return!1},e.shouldCheckHiddenContent=function(e){return!1},e.shouldNodeBeSkippedHidden=function(t){return!e.shouldCheckHiddenContent(t)&&!s.VisUtil.isNodeVisible(t)},e.isfocusableByDefault=function(t){return!("a"!==t.nodeName.toLowerCase()||!e.hasAttribute(t,"href"))||!("area"!==t.nodeName.toLowerCase()||!e.hasAttribute(t,"href"))||-1!==["input","select","button","textarea","option","area"].indexOf(t.nodeName.toLowerCase())},e.nonTabableChildCheck=function(t){if(!t.hasAttribute("tabindex")||-1!=parseInt(t.getAttribute("tabindex")))return!1;for(var i=new d.DOMWalker(t);i.nextNode();){var a=i.elem();if(null!==a&&a.hasAttribute("tabindex")&&-1!=parseInt(a.getAttribute("tabindex"))&&!e.hasInnerContent(a))return!1}return!0},e.hasAttribute=function(e,t){var i=!1;if(e.hasAttribute)i=e.hasAttribute(t);else if(e.attributes&&e.attributes.getNamedItem){var a=e.attributes.getNamedItem(t);i=a&&a.specified}return i},e.truncateText=function(e,t){return void 0===t&&(t=150),e&&(e=e.trim()).length>t?e.substring(0,t-1)+"...":e},e.input_type_with_placeholder=["text","search","tel","url","email","password","number"],e.input_text_types=["text","file","password","checkbox","radio","search","tel","url","email","date","number","range","time","color"],e.input_time_types=["date","month","week","time","datetime-local"],e.input_other_types=["range","color","checkbox","radio","file","image"],e.form_button_types=["button","reset","submit"],e.form_labelable_elements=["input","textarea","select","keygen","progress","meter","output","button"],e.tabTagMap={button:function(e){return!e.hasAttribute("disabled")},iframe:!0,input:function(e){if(e.hasAttribute("disabled")||"hidden"===e.getAttribute("type"))return!1;if("radio"===e.getAttribute("type")){var t=e.getAttribute("name");if(!t||0===t.trim().length)return!0;var i=e.ownerDocument.querySelectorAll("input[type='radio'][name='"+t.trim()+"']");if(0===i.length||1===i.length)return!0;for(var a=null,n=0;n<i.length;n++)i[n].checked&&(a=i[n]);return null!==a?!!u.DOMUtil.sameNode(a,e):!!u.DOMUtil.sameNode(i[0],e)}return!0},select:function(e){return!e.hasAttribute("disabled")},textarea:function(e){return!e.hasAttribute("disabled")&&"hidden"!==e.getAttribute("type")},a:function(e){return e.hasAttribute("href")},area:function(e){return e.hasAttribute("href")},audio:function(e){return e.hasAttribute("controls")},video:function(e){return e.hasAttribute("controls")},summary:function(e){return e.parentElement&&"details"===e.parentElement.nodeName.toLowerCase()&&u.DOMUtil.sameNode(a([],e.parentElement.children,!0).filter(function(e){return"summary"===e.nodeName.toLowerCase()})[0],e)},details:function(e){return e.children&&0===a([],e.children,!0).filter(function(e){return"summary"===e.nodeName.toLowerCase()}).length}},e.image_extensions=[".bmp",".gif",".jpg",".jpeg",".pcx",".png"],e}();t.CommonUtil=m},9196(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.TableUtil=void 0;var a=i(3946),n=i(7011),l=i(7139),r=function(){function e(){}return e.isDataTable=function(e){return!(n.AriaUtil.hasRole(e,"none")||n.AriaUtil.hasRole(e,"presentation"))},e.isComplexDataTable=function(t){if("AriaUtil_isComplexDataTable"in t)return!!t.AriaUtil_isComplexDataTable;var i=!1;if(t&&e.isDataTable(t)){for(var a=null,n=null,r=t.getElementsByTagName("tr"),o=r.length,s=0,u=0,d=0,c=0;!i&&c<o;++c)if(a=r[c].getElementsByTagName("th"),n=r[c].getElementsByTagName("td"),u=a.length,0!==(s=n.length)){i=u>1;for(var m=0;!i&&m<u;++m)i=(a[m].hasAttribute("rowspan")||a[m].hasAttribute("colspan"))&&l.CommonUtil.getAncestor(a[m],"table")===t;for(var p=0;!i&&p<s;++p)i=(n[p].hasAttribute("rowspan")||n[p].hasAttribute("colspan")||n[p].hasAttribute("headers")&&l.CommonUtil.normalizeSpacing(n[p].getAttribute("headers")).split(" ").length>2)&&l.CommonUtil.getAncestor(n[p],"table")===t}else u>0&&++d,i=2===d;if(!i){var h=t.getElementsByTagName("thead"),g=h.length;g>0&&((i=g>1)||(i=h[0].getElementsByTagName("tr").length>1))}i||0===o||(i=u>0&&!e.tableHeaderExists(t))}return t.AriaUtil_isComplexDataTable=i,i},e.isTableCellEmpty=function(e){return!e||!a.VisUtil.isNodeVisible(e)||0===e.innerHTML.replace(/&nbsp;/g," ").trim().length},e.isTableRowEmpty=function(t){if(!t||!t.cells||0===t.cells.length||!a.VisUtil.isNodeVisible(t))return!0;for(var i=!0,n=0;i&&n<t.cells.length;n++){var l=t.cells[n];i=e.isTableCellEmpty(l)}return i},e.tableHeaderExists=function(t){var i=t.rows;if(!i||0===i.length)return null;for(var a=!0,n=i[0],r=0;a&&r<i.length;r++)(n=i[r]).parentNode&&"tfoot"===n.parentNode.nodeName.toLowerCase()||(a=e.isTableRowEmpty(n));if(a)return null;for(a=!0,r=0;a&&r<n.cells.length;r++){var o=n.cells[r];a=e.isTableCellEmpty(o)||"th"===o.nodeName.toLowerCase()}if(a)return!0;a=!0;for(var s=0;a&&s<i.length;++s)i[s].parentNode&&"tfoot"===i[s].parentNode.nodeName.toLowerCase()||(a=!i[s].cells||0===i[s].cells.length||0===i[s].cells[0].innerHTML.trim().length||"td"!=i[s].cells[0].nodeName.toLowerCase());if(a)return!0;a=!0;var u=[],d=[];for(r=0;a&&r<i.length;r++)for(var c=i[r],m=0;m<c.cells.length;m++)o=c.cells[m],e.isTableCellEmpty(o)||("td"===o.nodeName.toLowerCase()?o.getAttribute("headers")&&0!==o.getAttribute("headers").trim().length?l.CommonUtil.concatUniqueArrayItemList(o.getAttribute("headers").trim().split(" "),d):a=!1:"th"===o.nodeName.toLowerCase()&&o.getAttribute("id")&&o.getAttribute("id").trim().length>0&&l.CommonUtil.concatUniqueArrayItem(o.getAttribute("id").trim(),u));return!!(a&&u.length>0&&d.every(function(e){return u.includes(e)}))},e.isLayoutTable=function(e){return n.AriaUtil.hasRole(e,"presentation")||n.AriaUtil.hasRole(e,"none")},e.isTableDescendant=function(e){return e?e.aria.filter(function(e){return["table","grid","treegrid"].includes(e.role)}):null},e}();t.TableUtil=r},3946(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.VisUtil=void 0;var a=i(4566),n=i(1686),l=i(3864),r=i(7507),o=i(7011),s=i(4919),u=i(167),d=function(){function e(){}return e.isNodeVisible=function(t){3===t.nodeType&&(t=l.DOMWalker.parentNode(t));var i,n=t;if(1!==n.nodeType)return!0;if(!n.ownerDocument)return!0;var r=n.nodeName.toLowerCase();if(null!=e.hiddenByDefaultElements&&null!=e.hiddenByDefaultElements&&e.hiddenByDefaultElements.indexOf(r)>-1)return!1;var o=a.CacheUtil.getCache(n,"PT_NODE_HIDDEN",void 0);if(void 0!==o)return o;if(o=a.CacheUtil.setCache(n,"PT_NODE_HIDDEN",!1),null===e.unhideableElements||void 0===e.unhideableElements||-1===e.unhideableElements.indexOf(r)){if(!n.ownerDocument.defaultView)return a.CacheUtil.setCache(n,"PT_NODE_HIDDEN",!0);i=n.ownerDocument.defaultView.getComputedStyle(n,null);var s=n.getAttribute("hidden"),d=o,c="boolean"==typeof n.hidden&&n.hidden;if(!i&&!c&&null==s&&!d)return a.CacheUtil.setCache(n,"PT_NODE_HIDDEN",!0);if(null!==i&&("none"===i.getPropertyValue("display")||!a.CacheUtil.getCache(n,"Visibility_Check_Parent",null)&&"hidden"===i.getPropertyValue("visibility"))||"block"!==i.getPropertyValue("display")&&(c||null!=s||d))return a.CacheUtil.setCache(n,"PT_NODE_HIDDEN",!1);if(e.isContentHidden(n))return a.CacheUtil.setCache(n,"PT_NODE_HIDDEN",!1);if(u.ClipPathUtil.isNodeVisuallyHiddenByClipPath(n))return a.CacheUtil.setCache(n,"PT_NODE_HIDDEN",!1)}var m=l.DOMWalker.parentNode(n);if(null!=m&&1===m.nodeType){a.CacheUtil.setCache(m,"Visibility_Check_Parent",!0);var p=e.isNodeVisible(m);return a.CacheUtil.setCache(n,"PT_NODE_HIDDEN",p)}return a.CacheUtil.setCache(n,"PT_NODE_HIDDEN",!0)},e.isNodeVisuallyHidden=function(t){if(!t||1!==t.nodeType)return!1;var i=t,n=a.CacheUtil.getCache(i,"PT_NODE_VISUALLY_HIDDEN",void 0);if(void 0===n){var r=s.CSSUtil.getComputedStyle(i);if("absolute"===r.position&&r.clip&&"rect(0px,0px,0px,0px)"===r.clip.replaceAll(" ","")||r.opacity&&parseFloat(r.opacity)<.1)return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN",!0),!0;var o=l.DOMWalker.parentElement(i);if(!o)return!1;var u=e.isNodeVisuallyHidden(o);return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN",u),u}return n},e.isContentHidden=function(e){if(!e)return!1;var t=a.CacheUtil.getCache(e,"PT_NODE_ContentHidden",void 0);if(void 0!==t)return t;var i=getComputedStyle(e);return i?"hidden"!==i.getPropertyValue("content-visibility")||"inline"===i.getPropertyValue("display")?(a.CacheUtil.setCache(e,"PT_NODE_ContentHidden",!1),!1):(a.CacheUtil.setCache(e,"PT_NODE_ContentHidden",!0),!0):(a.CacheUtil.setCache(e,"PT_NODE_ContentHidden",!1),!1)},e.isElementOffscreen=function(e){if(!e)return!0;if(1!==e.nodeType)return!1;var t=a.CacheUtil.getCache(e,"PT_NODE_Offscreen",void 0);if(void 0!==t)return t;var i=(new r.DOMMapper).getUnadjustedBounds(e);return i?0===i.height||0===i.width||i.top+i.height<=0||i.left+i.width<=0?(a.CacheUtil.setCache(e,"PT_NODE_Offscreen",!0),!0):(a.CacheUtil.setCache(e,"PT_NODE_Offscreen",!1),!1):(a.CacheUtil.setCache(e,"PT_NODE_Offscreen",!0),!0)},e.isNodeHiddenFromAT=function(t){if(!t)return!1;var i=a.CacheUtil.getCache(t,"PT_NODE_HiddenFromAT",void 0);return void 0!==i?i:e.isNodeVisible(t)&&"true"!==t.getAttribute("aria-hidden")?n.DOMUtil.getAncestorWithAttribute(t,"aria-hidden","true")?(a.CacheUtil.setCache(t,"PT_NODE_HiddenFromAT",!0),!0):(a.CacheUtil.setCache(t,"PT_NODE_HiddenFromAT",!1),!1):(a.CacheUtil.setCache(t,"PT_NODE_HiddenFromAT",!0),!0)},e.isNodePresentational=function(e){var t=o.AriaUtil.getResolvedRole(e);return!(!t||"none"!==t&&"presentation"!==t)},e.isElementScrollable=function(e){if(!e)return!1;var t=s.CSSUtil.getComputedStyle(e);if(!t)return!1;var i=t.getPropertyValue("overflow-x"),a=t.getPropertyValue("overflow-y");if("visible"!==i||"hidden"!==a&&"scroll"!==a&&"auto"!==a||(i="auto"),"visible"!==a||"hidden"!==i&&"scroll"!==i&&"auto"!==i||(a="auto"),"clip"===i&&"visible"!==a&&"clip"!==a&&(i="hidden"),"clip"===a&&"visible"!==i&&"clip"!==i&&(a="hidden"),!("visible"!==i&&"hidden"!==i&&"clip"!==i||"visible"!==a&&"hidden"!==a&&"clip"!==a))return!1;if(Math.max(e.offsetWidth,e.offsetHeight)<30||Math.min(e.offsetWidth,e.offsetHeight)<15)return!1;var n=s.CSSUtil.getPixelsFromStyle(t.paddingLeft,e)+s.CSSUtil.getPixelsFromStyle(t.paddingRight,e),l=s.CSSUtil.getPixelsFromStyle(t.paddingTop,e)+s.CSSUtil.getPixelsFromStyle(t.paddingBottom,e);return!(e.scrollWidth-e.clientWidth<1+n&&e.scrollHeight-e.clientHeight<1+l)},e.unhideableElements=["area","param","audio"],e.hiddenByDefaultElements=["script","link","style","head","meta","base","noscript","template","datalist"],e}();t.VisUtil=d},8855(e){e.exports=JSON.parse('{"1.1.1":{"num":"1.1.1","url":"https://www.w3.org/TR/WCAG22/#non-text-content","scId":"WCAG2:non-text-content","scAltId":["text-equiv-all"],"test":"WCAG2:text-equiv-all","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#non-text-content","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/non-text-content.html","handle":"Non-text Content","level":"A","wcagType":"2.0"},"1.2.1":{"num":"1.2.1","url":"https://www.w3.org/TR/WCAG22/#audio-only-and-video-only-prerecorded","scId":"WCAG2:audio-only-and-video-only-prerecorded","scAltId":["media-equiv-av-only-alt"],"test":"WCAG2:media-equiv-av-only-alt","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-only-and-video-only-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-only-and-video-only-prerecorded.html","handle":"Audio-only and Video-only (Prerecorded)","level":"A","wcagType":"2.0"},"1.2.2":{"num":"1.2.2","url":"https://www.w3.org/TR/WCAG22/#captions-prerecorded","scId":"WCAG2:captions-prerecorded","scAltId":["media-equiv-captions"],"test":"WCAG2:media-equiv-captions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#captions-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/captions-prerecorded.html","handle":"Captions (Prerecorded)","level":"A","wcagType":"2.0"},"1.2.3":{"num":"1.2.3","url":"https://www.w3.org/TR/WCAG22/#audio-description-or-media-alternative-prerecorded","scId":"WCAG2:audio-description-or-media-alternative-prerecorded","scAltId":["media-equiv-audio-desc"],"test":"WCAG2:media-equiv-audio-desc","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-description-or-media-alternative-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-description-or-media-alternative-prerecorded.html","handle":"Audio Description or Media Alternative (Prerecorded)","level":"A","wcagType":"2.0"},"1.2.4":{"num":"1.2.4","url":"https://www.w3.org/TR/WCAG22/#captions-live","scId":"WCAG2:captions-live","scAltId":["media-equiv-real-time-captions"],"test":"WCAG2:media-equiv-real-time-captions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#captions-live","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/captions-live.html","handle":"Captions (Live)","level":"AA","wcagType":"2.0"},"1.2.5":{"num":"1.2.5","url":"https://www.w3.org/TR/WCAG22/#audio-description-prerecorded","scId":"WCAG2:audio-description-prerecorded","scAltId":["media-equiv-audio-desc-only"],"test":"WCAG2:media-equiv-audio-desc-only","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-description-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-description-prerecorded.html","handle":"Audio Description (Prerecorded)","level":"AA","wcagType":"2.0"},"1.2.6":{"num":"1.2.6","url":"https://www.w3.org/TR/WCAG22/#sign-language-prerecorded","scId":"WCAG2:sign-language-prerecorded","scAltId":["media-equiv-sign"],"test":"WCAG2:media-equiv-sign","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#sign-language-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/sign-language-prerecorded.html","handle":"Sign Language (Prerecorded)","level":"AAA","wcagType":"2.0"},"1.2.7":{"num":"1.2.7","url":"https://www.w3.org/TR/WCAG22/#extended-audio-description-prerecorded","scId":"WCAG2:extended-audio-description-prerecorded","scAltId":["media-equiv-extended-ad"],"test":"WCAG2:media-equiv-extended-ad","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#extended-audio-description-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/extended-audio-description-prerecorded.html","handle":"Extended Audio Description (Prerecorded)","level":"AAA","wcagType":"2.0"},"1.2.8":{"num":"1.2.8","url":"https://www.w3.org/TR/WCAG22/#media-alternative-prerecorded","scId":"WCAG2:media-alternative-prerecorded","scAltId":["media-equiv-text-doc"],"test":"WCAG2:media-equiv-text-doc","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#media-alternative-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/media-alternative-prerecorded.html","handle":"Media Alternative (Prerecorded)","level":"AAA","wcagType":"2.0"},"1.2.9":{"num":"1.2.9","url":"https://www.w3.org/TR/WCAG22/#audio-only-live","scId":"WCAG2:audio-only-live","scAltId":["media-equiv-live-audio-only"],"test":"WCAG2:media-equiv-live-audio-only","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-only-live","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-only-live.html","handle":"Audio-only (Live)","level":"AAA","wcagType":"2.0"},"1.3.1":{"num":"1.3.1","url":"https://www.w3.org/TR/WCAG22/#info-and-relationships","scId":"WCAG2:info-and-relationships","scAltId":["content-structure-separation-programmatic"],"test":"WCAG2:content-structure-separation-programmatic","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#info-and-relationships","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/info-and-relationships.html","handle":"Info and Relationships","level":"A","wcagType":"2.0"},"1.3.2":{"num":"1.3.2","url":"https://www.w3.org/TR/WCAG22/#meaningful-sequence","scId":"WCAG2:meaningful-sequence","scAltId":["content-structure-separation-sequence"],"test":"WCAG2:content-structure-separation-sequence","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#meaningful-sequence","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/meaningful-sequence.html","handle":"Meaningful Sequence","level":"A","wcagType":"2.0"},"1.3.3":{"num":"1.3.3","url":"https://www.w3.org/TR/WCAG22/#sensory-characteristics","scId":"WCAG2:sensory-characteristics","scAltId":["content-structure-separation-understanding"],"test":"WCAG2:content-structure-separation-understanding","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#sensory-characteristics","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/sensory-characteristics.html","handle":"Sensory Characteristics","level":"A","wcagType":"2.0"},"1.3.4":{"num":"1.3.4","url":"https://www.w3.org/TR/WCAG22/#orientation","scId":"WCAG2:orientation","scAltId":[],"test":"WCAG2:orientation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#orientation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/orientation.html","handle":"Orientation","level":"AA","wcagType":"2.1"},"1.3.5":{"num":"1.3.5","url":"https://www.w3.org/TR/WCAG22/#identify-input-purpose","scId":"WCAG2:identify-input-purpose","scAltId":[],"test":"WCAG2:identify-input-purpose","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#identify-input-purpose","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/identify-input-purpose.html","handle":"Identify Input Purpose","level":"AA","wcagType":"2.1"},"1.3.6":{"num":"1.3.6","url":"https://www.w3.org/TR/WCAG22/#identify-purpose","scId":"WCAG2:identify-purpose","scAltId":[],"test":"WCAG2:identify-purpose","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#identify-purpose","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/identify-purpose.html","handle":"Identify Purpose","level":"AAA","wcagType":"2.1"},"1.4.1":{"num":"1.4.1","url":"https://www.w3.org/TR/WCAG22/#use-of-color","scId":"WCAG2:use-of-color","scAltId":["visual-audio-contrast-without-color"],"test":"WCAG2:visual-audio-contrast-without-color","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#use-of-color","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/use-of-color.html","handle":"Use of Color","level":"A","wcagType":"2.0"},"1.4.2":{"num":"1.4.2","url":"https://www.w3.org/TR/WCAG22/#audio-control","scId":"WCAG2:audio-control","scAltId":["visual-audio-contrast-dis-audio"],"test":"WCAG2:visual-audio-contrast-dis-audio","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-control","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-control.html","handle":"Audio Control","level":"A","wcagType":"2.0"},"1.4.3":{"num":"1.4.3","url":"https://www.w3.org/TR/WCAG22/#contrast-minimum","scId":"WCAG2:contrast-minimum","scAltId":["visual-audio-contrast-contrast"],"test":"WCAG2:visual-audio-contrast-contrast","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#contrast-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/contrast-minimum.html","handle":"Contrast (Minimum)","level":"AA","wcagType":"2.0"},"1.4.4":{"num":"1.4.4","url":"https://www.w3.org/TR/WCAG22/#resize-text","scId":"WCAG2:resize-text","scAltId":["visual-audio-contrast-scale"],"test":"WCAG2:visual-audio-contrast-scale","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#resize-text","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/resize-text.html","handle":"Resize text","level":"AA","wcagType":"2.0"},"1.4.5":{"num":"1.4.5","url":"https://www.w3.org/TR/WCAG22/#images-of-text","scId":"WCAG2:images-of-text","scAltId":["visual-audio-contrast-text-presentation"],"test":"WCAG2:visual-audio-contrast-text-presentation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#images-of-text","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/images-of-text.html","handle":"Images of Text","level":"AA","wcagType":"2.0"},"1.4.6":{"num":"1.4.6","url":"https://www.w3.org/TR/WCAG22/#contrast-enhanced","scId":"WCAG2:contrast-enhanced","scAltId":["visual-audio-contrast7"],"test":"WCAG2:visual-audio-contrast7","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#contrast-enhanced","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/contrast-enhanced.html","handle":"Contrast (Enhanced)","level":"AAA","wcagType":"2.0"},"1.4.7":{"num":"1.4.7","url":"https://www.w3.org/TR/WCAG22/#low-or-no-background-audio","scId":"WCAG2:low-or-no-background-audio","scAltId":["visual-audio-contrast-noaudio"],"test":"WCAG2:visual-audio-contrast-noaudio","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#low-or-no-background-audio","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/low-or-no-background-audio.html","handle":"Low or No Background Audio","level":"AAA","wcagType":"2.0"},"1.4.8":{"num":"1.4.8","url":"https://www.w3.org/TR/WCAG22/#visual-presentation","scId":"WCAG2:visual-presentation","scAltId":["visual-audio-contrast-visual-presentation"],"test":"WCAG2:visual-audio-contrast-visual-presentation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#visual-presentation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/visual-presentation.html","handle":"Visual Presentation","level":"AAA","wcagType":"2.0"},"1.4.9":{"num":"1.4.9","url":"https://www.w3.org/TR/WCAG22/#images-of-text-no-exception","scId":"WCAG2:images-of-text-no-exception","scAltId":["visual-audio-contrast-text-images"],"test":"WCAG2:visual-audio-contrast-text-images","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#images-of-text-no-exception","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/images-of-text-no-exception.html","handle":"Images of Text (No Exception)","level":"AAA","wcagType":"2.0"},"1.4.10":{"num":"1.4.10","url":"https://www.w3.org/TR/WCAG22/#reflow","scId":"WCAG2:reflow","scAltId":[],"test":"WCAG2:reflow","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#reflow","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/reflow.html","handle":"Reflow","level":"AA","wcagType":"2.1"},"1.4.11":{"num":"1.4.11","url":"https://www.w3.org/TR/WCAG22/#non-text-contrast","scId":"WCAG2:non-text-contrast","scAltId":[],"test":"WCAG2:non-text-contrast","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#non-text-contrast","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/non-text-contrast.html","handle":"Non-text Contrast","level":"AA","wcagType":"2.1"},"1.4.12":{"num":"1.4.12","url":"https://www.w3.org/TR/WCAG22/#text-spacing","scId":"WCAG2:text-spacing","scAltId":[],"test":"WCAG2:text-spacing","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#text-spacing","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/text-spacing.html","handle":"Text Spacing","level":"AA","wcagType":"2.1"},"1.4.13":{"num":"1.4.13","url":"https://www.w3.org/TR/WCAG22/#content-on-hover-or-focus","scId":"WCAG2:content-on-hover-or-focus","scAltId":[],"test":"WCAG2:content-on-hover-or-focus","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#content-on-hover-or-focus","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/content-on-hover-or-focus.html","handle":"Content on Hover or Focus","level":"AA","wcagType":"2.1"},"2.1.1":{"num":"2.1.1","url":"https://www.w3.org/TR/WCAG22/#keyboard","scId":"WCAG2:keyboard","scAltId":["keyboard-operation-keyboard-operable"],"test":"WCAG2:keyboard-operation-keyboard-operable","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#keyboard","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/keyboard.html","handle":"Keyboard","level":"A","wcagType":"2.0"},"2.1.2":{"num":"2.1.2","url":"https://www.w3.org/TR/WCAG22/#no-keyboard-trap","scId":"WCAG2:no-keyboard-trap","scAltId":["keyboard-operation-trapping"],"test":"WCAG2:keyboard-operation-trapping","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#no-keyboard-trap","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/no-keyboard-trap.html","handle":"No Keyboard Trap","level":"A","wcagType":"2.0"},"2.1.3":{"num":"2.1.3","url":"https://www.w3.org/TR/WCAG22/#keyboard-no-exception","scId":"WCAG2:keyboard-no-exception","scAltId":["keyboard-operation-all-funcs"],"test":"WCAG2:keyboard-operation-all-funcs","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#keyboard-no-exception","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/keyboard-no-exception.html","handle":"Keyboard (No Exception)","level":"AAA","wcagType":"2.0"},"2.1.4":{"num":"2.1.4","url":"https://www.w3.org/TR/WCAG22/#character-key-shortcuts","scId":"WCAG2:character-key-shortcuts","scAltId":[],"test":"WCAG2:WCAG2:character-key-shortcuts","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#character-key-shortcuts","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/character-key-shortcuts.html","handle":"Character Key Shortcuts","level":"A","wcagType":"2.1"},"2.2.1":{"num":"2.2.1","url":"https://www.w3.org/TR/WCAG22/#timing-adjustable","scId":"WCAG2:timing-adjustable","scAltId":["time-limits-required-behaviors"],"test":"WCAG2:time-limits-required-behaviors","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#timing-adjustable","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/timing-adjustable.html","handle":"Timing Adjustable","level":"A","wcagType":"2.0"},"2.2.2":{"num":"2.2.2","url":"https://www.w3.org/TR/WCAG22/#pause-stop-hide","scId":"WCAG2:pause-stop-hide","scAltId":["time-limits-pause"],"test":"WCAG2:time-limits-pause","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pause-stop-hide","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pause-stop-hide.html","handle":"Pause, Stop, Hide","level":"A","wcagType":"2.0"},"2.2.3":{"num":"2.2.3","url":"https://www.w3.org/TR/WCAG22/#no-timing","scId":"WCAG2:no-timing","scAltId":["time-limits-no-exceptions"],"test":"WCAG2:time-limits-no-exceptions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#no-timing","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/no-timing.html","handle":"No Timing","level":"AAA","wcagType":"2.0"},"2.2.4":{"num":"2.2.4","url":"https://www.w3.org/TR/WCAG22/#interruptions","scId":"WCAG2:interruptions","scAltId":["time-limits-postponed"],"test":"WCAG2:time-limits-postponed","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#interruptions","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/interruptions.html","handle":"Interruptions","level":"AAA","wcagType":"2.0"},"2.2.5":{"num":"2.2.5","url":"https://www.w3.org/TR/WCAG22/#re-authenticating","scId":"WCAG2:re-authenticating","scAltId":["time-limits-server-timeout"],"test":"WCAG2:time-limits-server-timeout","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#re-authenticating","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/re-authenticating.html","handle":"Re-authenticating","level":"AAA","wcagType":"2.0"},"2.2.6":{"num":"2.2.6","url":"https://www.w3.org/TR/WCAG22/#timeouts","scId":"WCAG2:timeouts","scAltId":[],"test":"WCAG2:WCAG2:timeouts","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#timeouts","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/timeouts.html","handle":"Timeouts","level":"AAA","wcagType":"2.1"},"2.3.1":{"num":"2.3.1","url":"https://www.w3.org/TR/WCAG22/#three-flashes-or-below-threshold","scId":"WCAG2:three-flashes-or-below-threshold","scAltId":["seizure-does-not-violate"],"test":"WCAG2:seizure-does-not-violate","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#three-flashes-or-below-threshold","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/three-flashes-or-below-threshold.html","handle":"Three Flashes or Below Threshold","level":"A","wcagType":"2.0"},"2.3.2":{"num":"2.3.2","url":"https://www.w3.org/TR/WCAG22/#three-flashes","scId":"WCAG2:three-flashes","scAltId":["seizure-three-times"],"test":"WCAG2:seizure-three-times","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#three-flashes","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/three-flashes.html","handle":"Three Flashes","level":"AAA","wcagType":"2.0"},"2.3.3":{"num":"2.3.3","url":"https://www.w3.org/TR/WCAG22/#animation-from-interactions","scId":"WCAG2:animation-from-interactions","scAltId":[],"test":"WCAG2:WCAG2:animation-from-interactions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#animation-from-interactions","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/animation-from-interactions.html","handle":"Animation from Interactions","level":"AAA","wcagType":"2.1"},"2.4.1":{"num":"2.4.1","url":"https://www.w3.org/TR/WCAG22/#bypass-blocks","scId":"WCAG2:bypass-blocks","scAltId":["navigation-mechanisms-skip"],"test":"WCAG2:navigation-mechanisms-skip","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#bypass-blocks","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/bypass-blocks.html","handle":"Bypass Blocks","level":"A","wcagType":"2.0"},"2.4.2":{"num":"2.4.2","url":"https://www.w3.org/TR/WCAG22/#page-titled","scId":"WCAG2:page-titled","scAltId":["navigation-mechanisms-title"],"test":"WCAG2:navigation-mechanisms-title","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#page-titled","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/page-titled.html","handle":"Page Titled","level":"A","wcagType":"2.0"},"2.4.3":{"num":"2.4.3","url":"https://www.w3.org/TR/WCAG22/#focus-order","scId":"WCAG2:focus-order","scAltId":["navigation-mechanisms-focus-order"],"test":"WCAG2:navigation-mechanisms-focus-order","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-order","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-order.html","handle":"Focus Order","level":"A","wcagType":"2.0"},"2.4.4":{"num":"2.4.4","url":"https://www.w3.org/TR/WCAG22/#link-purpose-in-context","scId":"WCAG2:link-purpose-in-context","scAltId":["navigation-mechanisms-refs"],"test":"WCAG2:navigation-mechanisms-refs","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#link-purpose-in-context","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/link-purpose-in-context.html","handle":"Link Purpose (In Context)","level":"A","wcagType":"2.0"},"2.4.5":{"num":"2.4.5","url":"https://www.w3.org/TR/WCAG22/#multiple-ways","scId":"WCAG2:multiple-ways","scAltId":["navigation-mechanisms-mult-loc"],"test":"WCAG2:navigation-mechanisms-mult-loc","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#multiple-ways","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/multiple-ways.html","handle":"Multiple Ways","level":"AA","wcagType":"2.0"},"2.4.6":{"num":"2.4.6","url":"https://www.w3.org/TR/WCAG22/#headings-and-labels","scId":"WCAG2:headings-and-labels","scAltId":["navigation-mechanisms-descriptive"],"test":"WCAG2:navigation-mechanisms-descriptive","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#headings-and-labels","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/headings-and-labels.html","handle":"Headings and Labels","level":"AA","wcagType":"2.0"},"2.4.7":{"num":"2.4.7","url":"https://www.w3.org/TR/WCAG22/#focus-visible","scId":"WCAG2:focus-visible","scAltId":["navigation-mechanisms-focus-visible"],"test":"WCAG2:navigation-mechanisms-focus-visible","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-visible","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-visible.html","handle":"Focus Visible","level":"AA","wcagType":"2.0"},"2.4.8":{"num":"2.4.8","url":"https://www.w3.org/TR/WCAG22/#location","scId":"WCAG2:location","scAltId":["navigation-mechanisms-location"],"test":"WCAG2:navigation-mechanisms-location","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#location","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/location.html","handle":"Location","level":"AAA","wcagType":"2.0"},"2.4.9":{"num":"2.4.9","url":"https://www.w3.org/TR/WCAG22/#link-purpose-link-only","scId":"WCAG2:link-purpose-link-only","scAltId":["navigation-mechanisms-link"],"test":"WCAG2:navigation-mechanisms-link","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#link-purpose-link-only","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/link-purpose-link-only.html","handle":"Link Purpose (Link Only)","level":"AAA","wcagType":"2.0"},"2.4.10":{"num":"2.4.10","url":"https://www.w3.org/TR/WCAG22/#section-headings","scId":"WCAG2:section-headings","scAltId":["navigation-mechanisms-headings"],"test":"WCAG2:navigation-mechanisms-headings","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#section-headings","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/section-headings.html","handle":"Section Headings","level":"AAA","wcagType":"2.0"},"2.4.11":{"num":"2.4.11","url":"https://www.w3.org/TR/WCAG22/#focus-not-obscured-minimum","scId":"WCAG2:focus-not-obscured-minimum","scAltId":["focus-not-obscured-minimum-alt"],"test":"WCAG2:focus-not-obscured-minimum-test","howToMeetUrl":"https://www.w3.org/TR/WCAG22/#focus-not-obscured-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-not-obscured-minimum.html","handle":"Focus Not Obscured (Minimum)","level":"AA","wcagType":"2.2"},"2.4.12":{"num":"2.4.12","url":"https://www.w3.org/TR/WCAG22/#focus-not-obscured-enhanced","scId":"WCAG2:focus-not-obscured-enhanced","scAltId":[],"test":"WCAG2:focus-not-obscured-enhanced-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-not-obscured-enhanced","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-not-obscured-enhanced.html","handle":"Focus Not Obscured (Enhanced)","level":"AAA","wcagType":"2.2"},"2.4.13":{"num":"2.4.13","url":"https://www.w3.org/TR/WCAG22/#focus-appearance","scId":"WCAG2:focus-appearance","scAltId":[],"test":"WCAG2:focus-appearance","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-appearance","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-appearance.html","handle":"Focus Appearance","level":"AAA","wcagType":"2.2"},"2.5.1":{"num":"2.5.1","url":"https://www.w3.org/TR/WCAG22/#pointer-gestures","scId":"WCAG2:pointer-gestures","scAltId":[],"test":"WCAG2:pointer-gestures-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pointer-gestures","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pointer-gestures.html","handle":"Pointer Gestures","level":"A","wcagType":"2.1"},"2.5.2":{"num":"2.5.2","url":"https://www.w3.org/TR/WCAG22/#pointer-cancellation","scId":"WCAG2:pointer-cancellation","scAltId":[],"test":"WCAG2:WCAG2:pointer-cancellation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pointer-cancellation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pointer-cancellation.html","handle":"Pointer Cancellation","level":"A","wcagType":"2.1"},"2.5.3":{"num":"2.5.3","url":"https://www.w3.org/TR/WCAG22/#label-in-name","scId":"WCAG2:label-in-name","scAltId":[],"test":"WCAG2:WCAG2:label-in-name","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#label-in-name","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/label-in-name.html","handle":"Label in Name","level":"A","wcagType":"2.1"},"2.5.4":{"num":"2.5.4","url":"https://www.w3.org/TR/WCAG22/#motion-actuation","scId":"WCAG2:motion-actuation","scAltId":[],"test":"WCAG2:WCAG2:motion-actuation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#motion-actuation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/motion-actuation.html","handle":"Motion Actuation","level":"A","wcagType":"2.1"},"2.5.5":{"num":"2.5.5","url":"https://www.w3.org/TR/WCAG22/#target-size","scId":"WCAG2:target-size","scAltId":[],"test":"WCAG2:WCAG2:target-size","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#target-size","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/target-size.html","handle":"Target Size","level":"AAA","wcagType":"2.1"},"2.5.6":{"num":"2.5.6","url":"https://www.w3.org/TR/WCAG22/#concurrent-input-mechanisms","scId":"WCAG2:concurrent-input-mechanisms","scAltId":[],"test":"WCAG2:WCAG2:concurrent-input-mechanisms","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#concurrent-input-mechanisms","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/concurrent-input-mechanisms.html","handle":"Concurrent Input Mechanisms","level":"AAA","wcagType":"2.1"},"2.5.7":{"num":"2.5.7","url":"https://www.w3.org/TR/WCAG22/#dragging-movements","scId":"WCAG2:dragging-movement","scAltId":["dragging-movement-alt"],"test":"WCAG2:dragging-movement-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/Understanding/dragging-movements.html","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/dragging-movements.html","handle":"Dragging Movement","level":"AA","wcagType":"2.2"},"2.5.8":{"num":"2.5.8","url":"https://www.w3.org/TR/WCAG22/#target-size-minimum","scId":"WCAG2:minimum-target-size","scAltId":["minimum-target-size-alt"],"test":"WCAG2:minimum-target-size-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#target-size-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/target-size-minimum.html","handle":"Minimum Target Size","level":"AA","wcagType":"2.2"},"3.1.1":{"num":"3.1.1","url":"https://www.w3.org/TR/WCAG22/#language-of-page","scId":"WCAG2:language-of-page","scAltId":["meaning-doc-lang-id"],"test":"WCAG2:meaning-doc-lang-id","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#language-of-page","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/language-of-page.html","handle":"Language of Page","level":"A","wcagType":"2.0"},"3.1.2":{"num":"3.1.2","url":"https://www.w3.org/TR/WCAG22/#language-of-parts","scId":"WCAG2:language-of-parts","scAltId":["meaning-other-lang-id"],"test":"WCAG2:meaning-other-lang-id","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#language-of-parts","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/language-of-parts.html","handle":"Language of Parts","level":"AA","wcagType":"2.0"},"3.1.3":{"num":"3.1.3","url":"https://www.w3.org/TR/WCAG22/#unusual-words","scId":"WCAG2:unusual-words","scAltId":["meaning-idioms"],"test":"WCAG2:meaning-idioms","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#unusual-words","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/unusual-words.html","handle":"Unusual Words","level":"AAA","wcagType":"2.0"},"3.1.4":{"num":"3.1.4","url":"https://www.w3.org/TR/WCAG22/#abbreviations","scId":"WCAG2:abbreviations","scAltId":["meaning-located"],"test":"WCAG2:meaning-located","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#abbreviations","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/abbreviations.html","handle":"Abbreviations","level":"AAA","wcagType":"2.0"},"3.1.5":{"num":"3.1.5","url":"https://www.w3.org/TR/WCAG22/#reading-level","scId":"WCAG2:reading-level","scAltId":["meaning-supplements"],"test":"WCAG2:meaning-supplements","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#reading-level","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/reading-level.html","handle":"Reading Level","level":"AAA","wcagType":"2.0"},"3.1.6":{"num":"3.1.6","url":"https://www.w3.org/TR/WCAG22/#pronunciation","scId":"WCAG2:pronunciation","scAltId":["meaning-pronunciation"],"test":"WCAG2:meaning-pronunciation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pronunciation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pronunciation.html","handle":"Pronunciation","level":"AAA","wcagType":"2.0"},"3.2.1":{"num":"3.2.1","url":"https://www.w3.org/TR/WCAG22/#on-focus","scId":"WCAG2:on-focus","scAltId":["consistent-behavior-receive-focus"],"test":"WCAG2:consistent-behavior-receive-focus","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#on-focus","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/on-focus.html","handle":"On Focus","level":"A","wcagType":"2.0"},"3.2.2":{"num":"3.2.2","url":"https://www.w3.org/TR/WCAG22/#on-input","scId":"WCAG2:on-input","scAltId":["consistent-behavior-unpredictable-change"],"test":"WCAG2:consistent-behavior-unpredictable-change","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#on-input","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/on-input.html","handle":"On Input","level":"A","wcagType":"2.0"},"3.2.3":{"num":"3.2.3","url":"https://www.w3.org/TR/WCAG22/#consistent-navigation","scId":"WCAG2:consistent-navigation","scAltId":["consistent-behavior-consistent-locations"],"test":"WCAG2:consistent-behavior-consistent-locations","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#consistent-navigation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/consistent-navigation.html","handle":"Consistent Navigation","level":"AA","wcagType":"2.0"},"3.2.4":{"num":"3.2.4","url":"https://www.w3.org/TR/WCAG22/#consistent-identification","scId":"WCAG2:consistent-identification","scAltId":["consistent-behavior-consistent-functionality"],"test":"WCAG2:consistent-behavior-consistent-functionality","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#consistent-identification","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/consistent-identification.html","handle":"Consistent Identification","level":"AA","wcagType":"2.0"},"3.2.5":{"num":"3.2.5","url":"https://www.w3.org/TR/WCAG22/#change-on-request","scId":"WCAG2:change-on-request","scAltId":["consistent-behavior-no-extreme-changes-context"],"test":"WCAG2:consistent-behavior-no-extreme-changes-context","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#change-on-request","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/change-on-request.html","handle":"Change on Request","level":"AAA","wcagType":"2.0"},"3.2.6":{"num":"3.2.6","url":"https://www.w3.org/TR/WCAG22/#consistent-help","scId":"WCAG2:consistent-help","scAltId":["consistent-help-alt"],"test":"WCAG2:consistent-help-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#consistent-help","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/consistent-help.html","handle":"Consistent Help","level":"AA","wcagType":"2.2"},"3.3.1":{"num":"3.3.1","url":"https://www.w3.org/TR/WCAG22/#error-identification","scId":"WCAG2:error-identification","scAltId":["minimize-error-identified"],"test":"WCAG2:minimize-error-identified","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-identification","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-identification.html","handle":"Error Identification","level":"A","wcagType":"2.0"},"3.3.2":{"num":"3.3.2","url":"https://www.w3.org/TR/WCAG22/#labels-or-instructions","scId":"WCAG2:labels-or-instructions","scAltId":["minimize-error-cues"],"test":"WCAG2:minimize-error-cues","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#labels-or-instructions","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/labels-or-instructions.html","handle":"Labels or Instructions","level":"A","wcagType":"2.0"},"3.3.3":{"num":"3.3.3","url":"https://www.w3.org/TR/WCAG22/#error-suggestion","scId":"WCAG2:error-suggestion","scAltId":["minimize-error-suggestions"],"test":"WCAG2:minimize-error-suggestions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-suggestion","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-suggestion.html","handle":"Error Suggestion","level":"AA","wcagType":"2.0"},"3.3.4":{"num":"3.3.4","url":"https://www.w3.org/TR/WCAG22/#error-prevention-legal-financial-data","scId":"WCAG2:error-prevention-legal-financial-data","scAltId":["minimize-error-reversible"],"test":"WCAG2:minimize-error-reversible","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-prevention-legal-financial-data","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-prevention-legal-financial-data.html","handle":"Error Prevention (Legal, Financial, Data)","level":"AA","wcagType":"2.0"},"3.3.5":{"num":"3.3.5","url":"https://www.w3.org/TR/WCAG22/#help","scId":"WCAG2:help","scAltId":["minimize-error-context-help"],"test":"WCAG2:minimize-error-context-help","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#help","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/help.html","handle":"Help","level":"AAA","wcagType":"2.0"},"3.3.6":{"num":"3.3.6","url":"https://www.w3.org/TR/WCAG22/#error-prevention-all","scId":"WCAG2:error-prevention-all","scAltId":["minimize-error-reversible-all"],"test":"WCAG2:minimize-error-reversible-all","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-prevention-all","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-prevention-all.html","handle":"Error Prevention (All)","level":"AAA","wcagType":"2.0"},"3.3.7":{"num":"3.3.7","url":"https://www.w3.org/TR/WCAG22/#redundant-entry","scId":"WCAG2:redundant-entry","scAltId":["redundant-entry-alt"],"test":"WCAG2:redundant-entry-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#redundant-entry","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/redundant-entry.html","handle":"Redundant Entry","level":"AA","wcagType":"2.2"},"3.3.8":{"num":"3.3.8","url":"https://www.w3.org/TR/WCAG22/#accessible-authentication-minimum","scId":"WCAG2:accessible-authentication-minimum","scAltId":["accessible-authentication-minimum-alt"],"test":"WCAG2:accessible-authentication-minimum-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#accessible-authentication-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/accessible-authentication-minimum.html","handle":"Accessible Authentication (Minimum)","level":"AA","wcagType":"2.2"},"3.3.9":{"num":"3.3.9","url":"https://www.w3.org/TR/WCAG22/#accessible-authentication-enhanced","scId":"WCAG2:accessible-authentication-enhanced","scAltId":[],"test":"WCAG2:accessible-authentication-enhanced","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#accessible-authentication-enhanced","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/accessible-authentication-enhanced.html","handle":"Accessible Authentication (Enhanced)","level":"AAA","wcagType":"2.2"},"4.1.1":{"num":"4.1.1","url":"https://www.w3.org/TR/WCAG22/#parsing","scId":"WCAG2:parsing","scAltId":["ensure-compat-parses"],"test":"WCAG2:ensure-compat-parses","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/?versions=2.1#parsing","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/parsing.html","handle":"Parsing","level":"A","wcagType":"2.0"},"4.1.2":{"num":"4.1.2","url":"https://www.w3.org/TR/WCAG22/#name-role-value","scId":"WCAG2:name-role-value","scAltId":["ensure-compat-rsv"],"test":"WCAG2:ensure-compat-rsv","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#name-role-value","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/name-role-value.html","handle":"Name, Role, Value","level":"A","wcagType":"2.0"},"4.1.3":{"num":"4.1.3","url":"https://www.w3.org/TR/WCAG22/#status-messages","scId":"WCAG2:status-messages","scAltId":[],"test":"WCAG2:status-messages","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#status-messages","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/status-messages.html","handle":"Status Messages","level":"AA","wcagType":"2.1"},"HTML":{"num":"HTML","url":"https://html.spec.whatwg.org/multipage/","scId":"","scAltId":[],"test":"","howToMeetUrl":"https://html.spec.whatwg.org/multipage/","understandingUrl":"https://html.spec.whatwg.org/multipage/","handle":"specification","level":"NA","wcagType":"NA"},"ARIA":{"num":"ARIA","url":"https://www.w3.org/TR/wai-aria-1.2/","scId":"","scAltId":[],"test":"","howToMeetUrl":"https://www.w3.org/TR/wai-aria-1.2/","understandingUrl":"https://www.w3.org/TR/wai-aria-1.2/","handle":"specification","level":"NA","wcagType":"NA"}}')}};const t={};function i(a){const n=t[a];if(void 0!==n)return n.exports;const l=t[a]={exports:{}};return e[a].call(l.exports,l,l.exports,i),l.exports}let a={};(()=>{let e=a;Object.defineProperty(e,"__esModule",{value:!0}),e.checkDemo=e.SRViewer=e.SRCursor=e.SRController=e.DOMWalker=e.Config=e.ARIAMapper=e.Checker=e.Context=void 0;var t=i(920);Object.defineProperty(e,"Context",{enumerable:!0,get:function(){return t.Context}});var n=i(7412);Object.defineProperty(e,"Checker",{enumerable:!0,get:function(){return n.Checker}});var l=i(9955);Object.defineProperty(e,"ARIAMapper",{enumerable:!0,get:function(){return l.ARIAMapper}});var r=i(4516);Object.defineProperty(e,"Config",{enumerable:!0,get:function(){return r.Config}});var o=i(3864);Object.defineProperty(e,"DOMWalker",{enumerable:!0,get:function(){return o.DOMWalker}});var s=i(5233);Object.defineProperty(e,"SRController",{enumerable:!0,get:function(){return s.SRController}});var u=i(8195);Object.defineProperty(e,"SRCursor",{enumerable:!0,get:function(){return u.SRCursor}});var d=i(8107);Object.defineProperty(e,"SRViewer",{enumerable:!0,get:function(){return d.SRViewer}}),e.checkDemo=function(e){e||(e=0);var t=new n.Checker;setTimeout(function(){t.check(document.documentElement,["IBM_Accessibility","IBM_Design"]).then(function(e){console.log(e);for(var t={FAIL:0,POTENTIAL:1,MANUAL:2,PASS:3},i=0;i<e.results.length;++i)"PASS"===e.results[i].value[1]&&e.results.splice(i--,1);e.results.sort(function(e,i){return e.category!=i.category?e.category.localeCompare(i.category):e.path.aria===i.path.aria?t[e.value[1]]-t[i.value[1]]:e.path.aria.localeCompare(i.path.aria)});for(var a=null,n=null,l=0,r=e.results;l<r.length;l++){var o=r[l];n!==o.category&&(null!==n&&(console.groupEnd(),console.groupEnd(),a=null),n=o.category,console.group(o.category)),o.path.aria!=a&&(null!==a&&console.groupEnd(),""===(a=o.path.aria)?console.group("page"):console.group(a)),console.log(o.value,o.message)}console.groupEnd(),console.groupEnd()})},e)}})(),module.exports=a})(); \ No newline at end of file diff --git a/rule-server/src/static/archives/2026.07.13/js/ace-node.js.LICENSE.txt b/rule-server/src/static/archives/2026.07.13/js/ace-node.js.LICENSE.txt new file mode 100644 index 000000000..614ccacb5 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/js/ace-node.js.LICENSE.txt @@ -0,0 +1,15 @@ +/*! + * Copyright:: 2016,2017,2019,2020- IBM, Inc + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ diff --git a/rule-server/src/static/archives/2026.07.13/js/ace-sr-debug.js b/rule-server/src/static/archives/2026.07.13/js/ace-sr-debug.js new file mode 100644 index 000000000..e88b7f6e8 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/js/ace-sr-debug.js @@ -0,0 +1,37896 @@ +/*! + * Copyright:: 2016,2017,2019,2020- IBM, Inc + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var ace; +/******/ (() => { // webpackBootstrap +/******/ "use strict"; +/******/ var __webpack_modules__ = ({ + +/***/ "./src/v2/aria/ARIADefinitions.ts" +/*!****************************************!*\ + !*** ./src/v2/aria/ARIADefinitions.ts ***! + \****************************************/ +(__unused_webpack_module, exports) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ARIADefinitions = void 0; +var ARIADefinitions = /** @class */ (function () { + function ARIADefinitions() { + } + ARIADefinitions.nameFromContent = function (role) { + return (role in ARIADefinitions.designPatterns) + && ARIADefinitions.designPatterns[role].nameFrom + && ARIADefinitions.designPatterns[role].nameFrom.includes("contents"); + }; + /* + * array of WAI-ARIA global states and properties + * @see https://www.w3.org/TR/wai-aria-1.2/#global_states + */ + ARIADefinitions.globalProperties = ["aria-atomic", "aria-busy", "aria-controls", "aria-current", "aria-describedby", + "aria-details", "aria-flowto", "aria-hidden", "aria-keyshortcuts", + "aria-label", "aria-labelledby", "aria-live", "aria-owns", "aria-relevant", "aria-roledescription" + // the following are deprecated in ARIA 1.2, will indicate deprecation in individual role + , + 'aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid' + ]; + //properties contains id(s) that refer to other element(s) + ARIADefinitions.referenceProperties = ["aria-owns", "aria-controls", "aria-describedby", "aria-labelledby", "aria-flowto", "aria-activedescendant"]; + // deprecated roles + ARIADefinitions.globalDeprecatedRoles = [ + 'directory', 'doc-biblioentry', 'doc-endnote' + ]; + // the following are deprecated in ARIA 1.1 for all the roles + ARIADefinitions.globalDeprecatedProperties = [ + 'aria-grabbed', 'aria-dropeffect' + ]; + /* + * XSD data types for all WAI-ARIA properties + * along with valid values when the data type is NMTOKEN + * WAI-ARIA properties data types explaned: + * type: Used to identify the type of values allowed for the WAI-ARIA property + * values: Used to identify specific values of an WAI-ARIA property when type is nmtoken + * hiddenIDRefSupported: Used to identify if the WAI-ARIA property supports referencing hidden ID + * true: refers to WAI-ARIA property supports hidden ID references + * false: refers to WAI-ARIA property does not support hidden ID references + * Default value will be set to false, if not specified. + */ + ARIADefinitions.propertyDataTypes = { + "aria-activedescendant": { + type: "http://www.w3.org/2001/XMLSchema#idref", + hiddenIDRefSupported: true + }, + "aria-atomic": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-autocomplete": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["inline", "list", "both", "none", "undefined"] //add undefined to handle value empty + }, + "aria-busy": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-checked": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "mixed", "undefined"] + }, + "aria-colcount": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-colindex": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-colspan": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-controls": { + type: "http://www.w3.org/2001/XMLSchema#idrefs", + hiddenIDRefSupported: true + }, + "aria-current": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["page", "step", "location", "date", "time", "true", "false", "undefined"] //add undefined for empty value + }, + "aria-describedby": { + type: "http://www.w3.org/2001/XMLSchema#idrefs", + hiddenIDRefSupported: true + }, + "aria-details": { + type: "http://www.w3.org/2001/XMLSchema#idrefs" + }, + "aria-disabled": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-dropeffect": { + type: "http://www.w3.org/2001/XMLSchema#nmtokens", + values: ["copy", "move", "link", "execute", "popup", "none"] + }, + "aria-errormessage": { + type: "http://www.w3.org/2001/XMLSchema#idref", + hiddenIDRefSupported: true + }, + "aria-expanded": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "undefined"] + }, + "aria-flowto": { + type: "http://www.w3.org/2001/XMLSchema#idrefs", + hiddenIDRefSupported: false + }, + "aria-grabbed": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "undefined"] + }, + "aria-haspopup": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "menu", "listbox", "tree", "grid", "dialog"] + }, + "aria-hidden": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "undefined"] + }, + "aria-invalid": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "spelling", "grammar", "undefined"] //add undefined for empty value + }, + "aria-keyshortcuts": { + type: "http://www.w3.org/2001/XMLSchema#string" + }, + "aria-label": { + type: "http://www.w3.org/2001/XMLSchema#string" + }, + "aria-labelledby": { + type: "http://www.w3.org/2001/XMLSchema#idrefs", + hiddenIDRefSupported: true + }, + "aria-level": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-live": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["off", "polite", "assertive"] + }, + "aria-modal": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-multiline": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-multiselectable": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-orientation": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["horizontal", "vertical", "undefined"] + }, + "aria-owns": { + type: "http://www.w3.org/2001/XMLSchema#idrefs", + hiddenIDRefSupported: true + }, + "aria-placeholder": { + type: "http://www.w3.org/2001/XMLSchema#string" + }, + "aria-posinset": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-pressed": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "mixed", "undefined"] + }, + "aria-readonly": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-relevant": { + type: "http://www.w3.org/2001/XMLSchema#nmtokens", + values: ["additions", "removals", "text", "all"] + }, + "aria-required": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-roledescription": { + type: "http://www.w3.org/2001/XMLSchema#string" + }, + "aria-rowcount": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-rowindex": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-rowspan": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-selected": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "undefined"] + }, + "aria-setsize": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-sort": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["ascending", "descending", "other", "none"] + }, + "aria-valuemax": { + type: "http://www.w3.org/2001/XMLSchema#decimal" + }, + "aria-valuemin": { + type: "http://www.w3.org/2001/XMLSchema#decimal" + }, + "aria-valuenow": { + type: "http://www.w3.org/2001/XMLSchema#decimal" + }, + "aria-valuetext": { + type: "http://www.w3.org/2001/XMLSchema#string" + } + }; + /* + * design patterns for concrete WAI-ARIA roles + * legitimate keys for each role include: + * + * - container: appropriate container(s) for that role + * - props: states and properties that may be associated with this role (in addition to the global states and properties listed above) + * - reqProps: required states or properties for this role + * - reqChildren: required children for this role + * - htmlEquiv: HTML equivalent for this role + * - roleType: one of widget, structure, landmark, liveRegion, window (as seen in https://www.w3.org/TR/wai-aria-1.2/#roles_categorization) + * - nameRequired: determines whether an accessible name is required for a widget (see ARIA spec.) + * - nameFrom: determines how an accessible name is supplied (author or content - see ARIA spec.) + * - deprecated: if present, indicates that the role is deprecated, and provides a list of alternative role(s) + */ + ARIADefinitions.designPatterns = { + "alert": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "liveRegion", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "alertdialog": { + container: null, + props: ["aria-modal"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "window", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "application": { + container: null, + props: ["aria-activedescendant", "aria-expanded"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: true, + nameFrom: ["author"] + }, + "article": { + container: null, + props: ["aria-posinset", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "banner": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "blockquote": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "button": { + container: null, + props: ["aria-expanded", "aria-pressed"], + reqProps: null, + reqChildren: null, + htmlEquiv: "button | input[@type='button']", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + "caption": { + container: ["figure", "grid", "table", "treegrid"], + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "cell": { + container: ["row"], + props: ["aria-colindex", "aria-colspan", "aria-rowindex", "aria-rowspan"], + reqProps: null, + reqChildren: null, + htmlEquiv: "td", + roleType: "structure", + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "checkbox": { + container: null, + props: ["aria-expanded", "aria-readonly", "aria-required"], + reqProps: ["aria-checked"], + reqChildren: null, + htmlEquiv: "input[@type='checkbox']", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-haspopup'] + }, + "code": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "columnheader": { + container: ["row"], + props: ["aria-colindex", "aria-colspan", "aria-expanded", "aria-readonly", "aria-required", "aria-rowindex", "aria-rowspan", "aria-selected", "aria-sort"], + reqProps: null, + reqChildren: null, + htmlEquiv: "th[@scope='col']", + roleType: "structure", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + "combobox": { + container: null, + props: ["aria-controls", "aria-activedescendant", "aria-autocomplete", "aria-readonly", "aria-required"], + reqProps: ["aria-expanded"], + reqChildren: [], + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"] + }, + "complementary": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "comment": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "contentinfo": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "definition": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "deletion": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "dialog": { + container: null, + props: ["aria-modal"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "window", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "directory": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecated: true, + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "doc-abstract": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-acknowledgments": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-afterword": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-appendix": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-backlink": { + container: null, + props: ["aria-disabled", "aria-expanded", "aria-haspopup"], + reqProps: null, + reqChildren: null, + htmlEquiv: "a | link", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + "doc-biblioentry": { + container: ["list"], + props: ["aria-level", "aria-posinset", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: "li", + roleType: "structure", + nameRequired: true, + nameFrom: ["author"] + }, + "doc-bibliography": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-biblioref": { + container: null, + props: ["aria-disabled", "aria-expanded", "aria-haspopup"], + reqProps: null, + reqChildren: null, + htmlEquiv: "a | link", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + "doc-chapter": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-colophon": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: true, + nameFrom: ["author"] + }, + "doc-conclusion": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-cover": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "img", + roleType: "structure", + nameRequired: false, + nameFrom: ["author"], + presentationalChildren: true + }, + "doc-credit": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-credits": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-dedication": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-endnote": { + container: ["list"], + props: ["aria-level", "aria-posinset", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: "li", + roleType: "structure", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-endnotes": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: true, + nameFrom: ["author"] + }, + "doc-epigraph": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-epilogue": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-errata": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-example": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-footnote": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-foreword": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-glossary": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-glossref": { + container: null, + props: ["aria-disabled", "aria-expanded", "aria-haspopup"], + reqProps: null, + reqChildren: null, + htmlEquiv: "a | link", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + "doc-index": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-introduction": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-noteref": { + container: null, + props: ["aria-disabled", "aria-expanded", "aria-haspopup"], + reqProps: null, + reqChildren: null, + htmlEquiv: "a | link", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + "doc-notice": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-pagebreak": { + container: null, + props: ["aria-orientation"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true + }, + "doc-pagelist": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-pagefooter": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + }, + "doc-pageheader": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + }, + "doc-part": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-preface": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-prologue": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-pullquote": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-qna": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-subtitle": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author", "contents"] + }, + "doc-tip": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-toc": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "document": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "emphasis": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "feed": { + container: null, + props: null, + reqProps: null, + reqChildren: ["article"], + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "figure": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "form": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "form", + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "generic": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "div | span", + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby", "aria-roledescription"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "graphics-document": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + nameRequired: true, + nameFrom: ["author"] + }, + "graphics-object": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + nameRequired: false, + nameFrom: ["author"] + }, + "graphics-symbol": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + nameRequired: true, + nameFrom: ["author"], + presentationalChildren: true + }, + "grid": { + container: null, + props: ["aria-activedescendant", "aria-colcount", "aria-multiselectable", "aria-readonly", "aria-rowcount"], + reqProps: null, + reqChildren: ["row", "rowgroup"], + htmlEquiv: "table", + roleType: "widget", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "gridcell": { + container: ["row"], + props: ["aria-colindex", "aria-colspan", "aria-disabled", "aria-errormessage", "aria-expanded", "aria-haspopup", "aria-invalid", "aria-readonly", "aria-required", "aria-rowindex", "aria-rowspan", "aria-selected"], + reqProps: null, + reqChildren: null, + htmlEquiv: "td", + roleType: "widget", + nameFrom: ["author", "contents"] + }, + "group": { + container: null, + props: ["aria-activedescendant"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "heading": { + container: null, + props: null, + reqProps: ["aria-level"], + reqChildren: null, + htmlEquiv: "h1 | h2 | h3 | h4 | h5 | h6", + roleType: "structure", + nameRequired: true, + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "img": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "img", + roleType: "structure", + nameRequired: true, + nameFrom: ["author"], + presentationalChildren: true, + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "image": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "img", + roleType: "structure", + nameRequired: true, + nameFrom: ["author"], + presentationalChildren: true, + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "insertion": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "link": { + container: null, + props: ["aria-expanded"], + reqProps: null, + reqChildren: null, + htmlEquiv: "a | link", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + "list": { + container: null, + props: null, + reqProps: null, + reqChildren: ["listitem"], + htmlEquiv: "ol | ul", + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "listbox": { + container: null, + props: ["aria-activedescendant", "aria-expanded", "aria-multiselectable", "aria-orientation", "aria-readonly", "aria-required"], + reqProps: null, + reqChildren: ["group", "option"], + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-haspopup'] + }, + "listitem": { + container: ["list"], + props: ["aria-level", "aria-posinset", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: "li", + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "log": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "liveRegion", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "main": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "mark": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "mark", + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "marquee": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "liveRegion", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "math": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + presentationalChildren: false, + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "menu": { + container: null, + props: ["aria-activedescendant", "aria-orientation"], + reqProps: null, + reqChildren: ["group", "menuitem", "menuitemcheckbox", "menuitemradio"], + htmlEquiv: null, + roleType: "widget", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "menubar": { + container: null, + props: ["aria-activedescendant", "aria-orientation"], + reqProps: null, + reqChildren: ["group", "menuitem", "menuitemcheckbox", "menuitemradio"], + htmlEquiv: null, + roleType: "widget", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "menuitem": { + container: ["group", "menu", "menubar"], + props: ["aria-expanded", "aria-posinset", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + "menuitemcheckbox": { + container: ["group", "menu", "menubar"], + props: ["aria-expanded", "aria-posinset", "aria-setsize"], + reqProps: ["aria-checked"], + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + "menuitemradio": { + container: ["group", "menu", "menubar"], + props: ["aria-expanded", "aria-posinset", "aria-setsize"], + reqProps: ["aria-checked"], + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + "meter": { + container: null, + props: ["aria-valuemax", "aria-valuemin", "aria-valuetext"], + reqProps: ["aria-valuenow"], + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: true, + nameFrom: ["author"], + presentationalChildren: true, + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "navigation": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "none": { + container: null, + props: [], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "note": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "option": { + container: ["group", "listbox"], + props: ["aria-selected", "aria-checked", "aria-posinset", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: "option", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "paragraph": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "presentation": { + container: null, + props: [], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "progressbar": { + container: null, + props: ["aria-valuemax", "aria-valuemin", "aria-valuenow", "aria-valuetext"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + presentationalChildren: true, + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "radio": { + container: null, + props: ["aria-posinset", "aria-setsize"], + reqProps: ["aria-checked"], + reqChildren: null, + htmlEquiv: "input[@type='radio']", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "radiogroup": { + container: null, + props: ["aria-activedescendant", "aria-orientation", "aria-readonly", "aria-required"], + reqProps: null, + reqChildren: ["radio"], + htmlEquiv: null, + roleType: "widget", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-haspopup'] + }, + "region": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "row": { + container: ["grid", "rowgroup", "table", "treegrid"], + props: ["aria-activedescendant", "aria-colindex", "aria-expanded", "aria-level", "aria-posinset", "aria-rowindex", "aria-selected", "aria-setsize"], + reqProps: null, + reqChildren: ["cell", "columnheader", "gridcell", "rowheader"], + htmlEquiv: "tr", + roleType: "structure", + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "rowgroup": { + container: ["grid", "table", "treegrid"], + props: [], + reqProps: null, + reqChildren: ["row"], + htmlEquiv: "tbody | tfoot | thead", + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "rowheader": { + container: ["row"], + props: ["aria-colindex", "aria-colspan", "aria-expanded", "aria-readonly", "aria-required", "aria-rowindex", "aria-rowspan", "aria-selected", "aria-sort"], + reqProps: null, + reqChildren: null, + htmlEquiv: "th[@scope='row']", + roleType: "structure", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + "scrollbar": { + container: null, + props: ["aria-orientation", "aria-valuemax", "aria-valuemin", "aria-valuetext"], + reqProps: ["aria-controls", "aria-valuenow"], + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: false, + nameFrom: ["author"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "search": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "searchbox": { + container: null, + props: ["aria-activedescendant", "aria-autocomplete", "aria-multiline", "aria-placeholder", "aria-readonly", "aria-required"], + reqProps: null, + reqChildren: null, + htmlEquiv: "input[@type='search']", + roleType: "widget", + nameRequired: true, + nameFrom: ["author"] + }, + "separator": { + container: null, + props: ["aria-orientation"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "slider": { + container: null, + props: ["aria-orientation", "aria-readonly", "aria-valuemax", "aria-valuemin", "aria-valuetext"], + reqProps: ["aria-valuenow"], + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + presentationalChildren: true + }, + "spinbutton": { + container: null, + props: ["aria-activedescendant", "aria-readonly", "aria-required", "aria-valuemax", "aria-valuemin", "aria-valuenow", "aria-valuetext"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-haspopup'] + }, + "status": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "liveRegion", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "strong": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "subscript": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "suggestion": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "superscript": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "switch": { + container: null, + props: ["aria-expanded", "aria-readonly", "aria-required"], + reqProps: ["aria-checked"], + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-haspopup'] + }, + "tab": { + container: ["tablist"], + props: ["aria-expanded", "aria-posinset", "aria-selected", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + "table": { + container: null, + props: ["aria-colcount", "aria-rowcount"], + reqProps: null, + reqChildren: ["row", "rowgroup", "caption"], + htmlEquiv: "table", + roleType: "structure", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "tablist": { + container: null, + props: ["aria-activedescendant", "aria-multiselectable", "aria-orientation"], + reqProps: null, + reqChildren: ["tab"], + htmlEquiv: null, + roleType: "widget", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "tabpanel": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "term": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "dfn", + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "textbox": { + container: null, + props: ["aria-activedescendant", "aria-autocomplete", "aria-multiline", "aria-placeholder", "aria-readonly", "aria-required"], + reqProps: null, + reqChildren: null, + htmlEquiv: "input[@type='text']", + roleType: "widget", + nameRequired: true, + nameFrom: ["author"] + }, + "time": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "timer": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "liveRegion", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "toolbar": { + container: null, + props: ["aria-activedescendant", "aria-orientation"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "tooltip": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "tree": { + container: null, + props: ["aria-activedescendant", "aria-multiselectable", "aria-orientation", "aria-required"], + reqProps: null, + reqChildren: ["group", "treeitem"], + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-haspopup'] + }, + "treegrid": { + container: null, + props: ["aria-activedescendant", "aria-colcount", "aria-multiselectable", "aria-orientation", "aria-readonly", "aria-required", "aria-rowcount"], + reqProps: null, + reqChildren: ["row", "rowgroup"], + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-haspopup'] + }, + "treeitem": { + container: ["group", "tree"], + props: ["aria-checked", "aria-expanded", "aria-level", "aria-posinset", "aria-selected", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + }; // end designPatterns + // copied from https://html.spec.whatwg.org/multipage/semantics-other.html#disabled-elements + // https://html.spec.whatwg.org/multipage/input.html#input-type-attr-summary + // https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/disabled + /** note: + * if a <fieldset> is disabled, the descendant form controls are all disabled except <legend> + * If an <optgroup> is disabled, the select is still interactive (unless otherwise disabled), but none of the items in the option group are selectable. + * When an element has the disabled attribute applied, the :disabled pseudo-class also applies to it. + */ + ARIADefinitions.elementsAllowedDisabled = ["button", "input", "select", "textarea", "optgroup", "option", "fieldset"]; // also form-associated custom element + ARIADefinitions.elementsAllowedRequired = ["select", "textarea"]; // remove 'input' and add to the individual element, becuase required is not supported on input@type="range", "color", "hidden" or any button types + ARIADefinitions.elementsAllowedReadOnly = ["textarea"]; // remove 'input' and add to the individual element, because readonly is not supported on input@type="checkbox", "radio", "range", "color", "file", hidden" or any button types + /* https://www.w3.org/TR/html-aria/#docconformance + * documentConformanceRequirement contains properties of the tags related to role without any additional attribute value + * documentConformanceRequirementSpecialTags contains those tags that require special considerations + */ + ARIADefinitions.documentConformanceRequirement = { + "abbr": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "address": { + implicitRole: ["group"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "article": { + implicitRole: ["article"], + validRoles: ["application", "document", "feed", "main", "none", "presentation", "region"], + globalAriaAttributesValid: true + }, + "aside": { + implicitRole: ["complementary"], + validRoles: ["doc-dedication", "doc-example", "doc-footnote", "doc-glossary", "doc-pullquote", "doc-tip", "feed", "none", "note", "presentation", "region", "search"], + globalAriaAttributesValid: true + }, + "audio": { + implicitRole: null, + validRoles: ["application"], + globalAriaAttributesValid: true + }, + "b": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "base": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "bdi": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "bdo": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "blockquote": { + implicitRole: ["blockquote"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "body": { + implicitRole: ["generic"], + validRoles: null, + otherDisallowedAriaAttributes: ['aria-hidden'], + globalAriaAttributesValid: true + }, + "br": { + implicitRole: null, + validRoles: ["none", "presentation"], + globalAriaAttributesValid: false, + otherAllowedAriaAttributes: ["aria-hidden"] + }, + "button": { + implicitRole: ["button"], + validRoles: ["checkbox", "combobox", "gridcell", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "separator", "slider", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true + }, + "canvas": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "caption": { + implicitRole: ['caption'], + validRoles: null, + globalAriaAttributesValid: true, + allowAttributesFromImplicitRole: false + }, + "cite": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "code": { + implicitRole: ["code"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "col": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "colgroup": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "data": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "datalist": { + implicitRole: ["listbox"], + validRoles: null, + globalAriaAttributesValid: false, + allowAttributesFromImplicitRole: false + }, + "dd": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true + }, + "del": { + implicitRole: ["deletion"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "details": { + implicitRole: ["group"], + validRoles: null, + globalAriaAttributesValid: true + }, + "dfn": { + implicitRole: ["term"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "dialog": { + implicitRole: ["dialog"], + validRoles: ["alertdialog"], + globalAriaAttributesValid: true + }, + "dl": { + implicitRole: null, + validRoles: ["group", "list", "none", "presentation"], + globalAriaAttributesValid: true + }, + "dt": { + implicitRole: ["term"], + validRoles: ["listitem"], + globalAriaAttributesValid: true + }, + "em": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "embed": { + implicitRole: null, + validRoles: ["application", "document", "img", "none", "presentation"], + globalAriaAttributesValid: true + }, + "fieldset": { + implicitRole: ["group"], + validRoles: ["none", "presentation", "radiogroup"], + globalAriaAttributesValid: true + }, + "figcaption": { + implicitRole: null, + validRoles: ["group", "none", "presentation"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "form": { + implicitRole: ["form"], + validRoles: ["none", "presentation", "search"], + globalAriaAttributesValid: true + }, + "head": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "hgroup": { + implicitRole: ["group"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "h1": { + implicitRole: ["heading"], + validRoles: ["doc-subtitle", "none", "presentation", "tab"], + globalAriaAttributesValid: true + }, + "h2": { + implicitRole: ["heading"], + validRoles: ["doc-subtitle", "none", "presentation", "tab"], + globalAriaAttributesValid: true + }, + "h3": { + implicitRole: ["heading"], + validRoles: ["doc-subtitle", "none", "presentation", "tab"], + globalAriaAttributesValid: true + }, + "h4": { + implicitRole: ["heading"], + validRoles: ["doc-subtitle", "none", "presentation", "tab"], + globalAriaAttributesValid: true + }, + "h5": { + implicitRole: ["heading"], + validRoles: ["doc-subtitle", "none", "presentation", "tab"], + globalAriaAttributesValid: true + }, + "h6": { + implicitRole: ["heading"], + validRoles: ["doc-subtitle", "none", "presentation", "tab"], + globalAriaAttributesValid: true + }, + "hr": { + implicitRole: ["separator"], + validRoles: ["doc-pagebreak", "none", "presentation"], + globalAriaAttributesValid: true + }, + "html": { + implicitRole: ["document"], + validRoles: null, + globalAriaAttributesValid: false, + allowAttributesFromImplicitRole: false + }, + "i": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "iframe": { + implicitRole: null, + validRoles: ["application", "document", "img", "none", "presentation"], + globalAriaAttributesValid: true + }, + "ins": { + implicitRole: ["insertion"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "kbd": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "label": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "legend": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "link": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "main": { + implicitRole: ["main"], + validRoles: null, + globalAriaAttributesValid: true + }, + "map": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "mark": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "math": { + implicitRole: ["math"], + validRoles: null, + globalAriaAttributesValid: true + }, + "menu": { + implicitRole: ["list"], + validRoles: ["group", "listbox", "menu", "menubar", "none", "presentation", "radiogroup", "tablist", "toolbar", "tree"], + globalAriaAttributesValid: true + }, + "meta": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "meter": { + implicitRole: ["meter"], + validRoles: null, + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ['aria-valuemax', 'aria-valuemin'], + allowAttributesFromImplicitRole: false + }, + "nav": { + implicitRole: ["navigation"], + validRoles: ["doc-index", "doc-pagelist", "doc-toc", "menu", "menubar", "tablist", "none", "presentation"], + globalAriaAttributesValid: true + }, + "noscript": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "object": { + implicitRole: null, + validRoles: ["application", "document", "img"], + globalAriaAttributesValid: true + }, + "ol": { + implicitRole: ["list"], + validRoles: ["group", "listbox", "menu", "menubar", "none", "presentation", "radiogroup", "tablist", "toolbar", "tree"], + globalAriaAttributesValid: true + }, + "optgroup": { + implicitRole: ["group"], + validRoles: null, + globalAriaAttributesValid: true + }, + "option": { + implicitRole: ["option"], + validRoles: null, + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-selected"] + }, + "output": { + implicitRole: ["status"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "p": { + implicitRole: ["paragraph"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "param": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "picture": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false, + otherAllowedAriaAttributes: ["aria-hidden"] + }, + "pre": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "progress": { + implicitRole: ["progressbar"], + validRoles: null, + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-valuemax"] + }, + "q": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "rp": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "rt": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "ruby": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "s": { + implicitRole: ["deletion"], + validRoles: ["any"], + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-label", "aria-labelledby"] + }, + "samp": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "script": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "search": { + implicitRole: ['search'], + validRoles: ['search', 'form', 'group', 'none', 'presentation', 'region'], + globalAriaAttributesValid: true + }, + "slot": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "small": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "source": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "span": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "strong": { + implicitRole: ["strong"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "style": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "sub": { + implicitRole: ["subscript"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "sup": { + implicitRole: ["superscript"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "svg": { + implicitRole: ["graphics-document"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "table": { + implicitRole: ["table"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "template": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "textarea": { + implicitRole: ["textbox"], + validRoles: null, + globalAriaAttributesValid: true + }, + "tfoot": { + implicitRole: ["rowgroup"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "thead": { + implicitRole: ["rowgroup"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "time": { + implicitRole: ["time"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "title": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "track": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "u": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "ul": { + implicitRole: ["list"], + validRoles: ["group", "listbox", "menu", "menubar", "none", "presentation", "radiogroup", "tablist", "toolbar", "tree"], + globalAriaAttributesValid: true + }, + "var": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "video": { + implicitRole: null, + validRoles: ["application"], + globalAriaAttributesValid: true + }, + "wbr": { + implicitRole: null, + validRoles: ["none", "presentation"], + globalAriaAttributesValid: false, + otherAllowedAriaAttributes: ["aria-hidden"] + } + }; // end documentConformanceRequirement + ARIADefinitions.documentConformanceRequirementSpecialTags = { + "a": { + "with-href": { + implicitRole: ["link"], + //roleCondition: " when non-empty href attribute is present", + validRoles: ["button", "checkbox", "doc-backlink", "doc-biblioref", "doc-glossref", "doc-noteref", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-disabled=true"] + }, + "without-href": { + implicitRole: ["generic"], + //roleCondition: " when href attribute is not present", + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "area": { + "with-href": { + implicitRole: ["link"], + //roleCondition: " when non-empty href attribute is present", + validRoles: null, + globalAriaAttributesValid: true + }, + "without-href": { + implicitRole: ["generic"], + //roleCondition: " when href attribute is not present", + validRoles: ["button", "link"], + globalAriaAttributesValid: true + } + }, + // TODO + // "autonomous custom element": { + // implicitRole: ["Role exposed from author defined ElementInternals. Otherwise no corresponding role."], + // validRoles: ["If role defined by ElementInternals", "any role", "no role Otherwise"], + // globalAriaAttributesValid: true + // }, + "div": { + "child-dl": { + implicitRole: ["generic"], + validRoles: ["presentation", "none"], + globalAriaAttributesValid: true + }, + "no-child-dl": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "figure": { + "child-figcaption": { + implicitRole: ["figure"], + validRoles: ['doc-example'], + globalAriaAttributesValid: true + }, + "no-child-figcaption": { + implicitRole: ["figure"], + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "footer": { + "des-section-article-aside-main-nav": { + implicitRole: ["generic"], + //roleCondition: " when descendant of an article, aside, main, nav or section element", + validRoles: ["doc-footnote", "group", "none", "presentation"], + globalAriaAttributesValid: true + }, + "other": { + implicitRole: ["contentinfo"], + //roleCondition: " when not a descendant of an article, aside, main, nav or section element", + validRoles: ["doc-footnote", "group", "none", "presentation"], + globalAriaAttributesValid: true + } + }, + // TODO + // "form-associated custom element": { + // implicitRole: ["Role exposed from author defined ElementInternals. Otherwise 'generic'."], + // validRoles: ["If role defined by ElementInternals", "form-related roles: button", "checkbox", "combobox", "group", "listbox", "progressbar", "radio", "radiogroup", "searchbox", "slider", "spinbutton", "switch", "textbox", "no role Otherwise"], + // globalAriaAttributesValid: true + // }, + "header": { + "des-section-article-aside-main-nav": { + implicitRole: ["generic"], + //roleCondition: " when descendant of an article, aside, main, nav or section element", + validRoles: ["group", "none", "presentation"], + globalAriaAttributesValid: true + }, + "other": { + implicitRole: ["banner"], + //roleCondition: " when not a descendant of an article, aside, main, nav or section element", + validRoles: ["group", "none", "presentation"], + globalAriaAttributesValid: true + } + }, + "img": { + "img-with-accname": { + implicitRole: ["img"], + //roleCondition: "when accessible name presents", + validRoles: ["button", "checkbox", "doc-cover", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "meter", "option", "progressbar", "radio", "scrollbar", "separator", "slider", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true + }, + "img-without-accname-empty-alt": { + implicitRole: ["presentation", "none"], + //roleCondition: "when no accessible name presents and alt=''", + validRoles: null, + globalAriaAttributesValid: false, + otherAllowedAriaAttributes: ["aria-hidden=true"] + }, + "img-without-accname-no-alt": { + implicitRole: ["img"], + //roleCondition: "when neither accessible name no alt presents", + validRoles: ["presentation", "none"], + globalAriaAttributesValid: false, + otherAllowedAriaAttributes: ["aria-hidden=true"] + } + }, + "input": { + "button": { + implicitRole: ["button"], + validRoles: ["checkbox", "combobox", "gridcell", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "slider", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true + }, + "checkbox-with-aria-pressed": { + implicitRole: ["checkbox"], + //roleCondition: " with type=checkbox and aria-pressed attribute is present", + validRoles: ["menuitemcheckbox", "option", "switch", "button"], + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-required"], + otherDisallowedAriaAttributes: ["aria-checked"] + }, + "checkbox-without-aria-pressed": { + implicitRole: ["checkbox"], + //roleCondition: " with type=checkbox and aria-pressed attribute is not present", + validRoles: ["menuitemcheckbox", "option", "switch"], + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-required"], + otherDisallowedAriaAttributes: ["aria-checked"] + }, + "color": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true + }, + "date": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-required", "aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "datetime-local": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-required", "aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "email-no-list": { + implicitRole: ["textbox"], + //roleCondition: " with type=email and no list attribute is present", + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "email-with-list": { + implicitRole: ["combobox"], + validRoles: null, + globalAriaAttributesValid: true + }, + "file": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-required"], + }, + "hidden": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "image": { + implicitRole: ["button"], + validRoles: ["checkbox", "gridcell", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "slider", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true + }, + "month": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "number": { + implicitRole: ["spinbutton"], + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"], + }, + "password": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "radio": { + implicitRole: ["radio"], + validRoles: ["menuitemradio"], + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-required"], + otherDisallowedAriaAttributes: ["aria-checked"] + }, + "range": { + implicitRole: ["slider"], + validRoles: null, + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-valuemax", "aria-valuemin"] + }, + "reset": { + implicitRole: ["button"], + validRoles: ["checkbox", "combobox", "gridcell", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "slider", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true + }, + "search-no-list": { + implicitRole: ["searchbox"], + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"] + }, + "search-with-list": { + implicitRole: ["combobox"], + validRoles: null, + globalAriaAttributesValid: true + }, + "submit": { + implicitRole: ["button"], + validRoles: ["checkbox", "combobox", "gridcell", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "slider", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true + }, + "tel-no-list": { + implicitRole: ["textbox"], + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"] + }, + "tel-with-list": { + implicitRole: ["combobox"], + validRoles: null, + globalAriaAttributesValid: true + }, + "text-no-list": { + implicitRole: ["textbox"], + validRoles: ["combobox", "searchbox", "spinbutton"], + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"] + }, + "text-with-list": { + implicitRole: ["combobox"], + validRoles: null, + globalAriaAttributesValid: true + // otherDisallowedAriaAttributes: ["aria-haspopup"] // covered in a different rule + }, + "time": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "url-no-list": { + implicitRole: ["textbox"], + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"] + }, + "url-with-list": { + implicitRole: ["combobox"], + validRoles: null, + globalAriaAttributesValid: true + }, + "week": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "default-with-list": { + // input with a missing or invalid type, with a list attribute + implicitRole: ["combobox"], + validRoles: null, + globalAriaAttributesValid: true + }, + "default-no-list": { + // input with a missing or invalid type, with a list attribute + implicitRole: ["textbox"], + validRoles: null, + globalAriaAttributesValid: true + } + }, + "li": { + "child-of-list-role": { + implicitRole: ['listitem'], + validRoles: null, + globalAriaAttributesValid: true + }, + "no-child-of-list-role": { + implicitRole: ['generic'], + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "section": { + "with-name": { + implicitRole: ["region"], + validRoles: ["alert", "alertdialog", "application", "banner", "complementary", "contentinfo", "dialog", "doc-abstract", "doc-acknowledgments", "doc-afterword", "doc-appendix", "doc-bibliography", "doc-chapter", "doc-colophon", "doc-conclusion", "doc-credit", "doc-credits", "doc-dedication", "doc-endnotes", "doc-epigraph", "doc-epilogue", "doc-errata", "doc-example", "doc-foreword", "doc-glossary", "doc-index", "doc-introduction", "doc-notice", "doc-pagelist", "doc-part", "doc-preface", "doc-prologue", "doc-pullquote", "doc-qna", "doc-toc", "document", "feed", "group", "log", "main", "marquee", "navigation", "none", "note", "presentation", "search", "status", "tabpanel"], + globalAriaAttributesValid: true + }, + "without-name": { + implicitRole: null, + validRoles: ["alert", "alertdialog", "application", "banner", "complementary", "contentinfo", "dialog", "doc-abstract", "doc-acknowledgments", "doc-afterword", "doc-appendix", "doc-bibliography", "doc-chapter", "doc-colophon", "doc-conclusion", "doc-credit", "doc-credits", "doc-dedication", "doc-endnotes", "doc-epigraph", "doc-epilogue", "doc-errata", "doc-example", "doc-foreword", "doc-glossary", "doc-index", "doc-introduction", "doc-notice", "doc-pagelist", "doc-part", "doc-preface", "doc-prologue", "doc-pullquote", "doc-qna", "doc-toc", "document", "feed", "group", "log", "main", "marquee", "navigation", "none", "note", "presentation", "search", "status", "tabpanel"], + globalAriaAttributesValid: true + } + }, + "select": { + "no-multiple-attr-size-gt1": { + //roleCondition: " with a multiple attribute or a size attribute having value greater than 1" + implicitRole: ["combobox"], + validRoles: ["menu"], + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-multiselectable"] + }, + "multiple-attr-size-gt1": { + //roleCondition: " with no multiple attribute and no size attribute having value greater than 1" + implicitRole: ["listbox"], + validRoles: null, + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-multiselectable"] + } + }, + "summary": { + "first-summary-of-detail": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-disabled", "aria-haspopup"] + }, + "no-first-summary-of-detail": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "tbody": { + "des-table": { + implicitRole: ["rowgroup"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "des-grid": { + implicitRole: ["rowgroup"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "des-treegrid": { + implicitRole: ["rowgroup"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "des-other": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "td": { + "des-table": { + implicitRole: ["cell"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-grid": { + implicitRole: ["gridcell"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-treegrid": { + implicitRole: ["gridcell"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-other": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "th": { + "des-table-row-scope": { + implicitRole: ["rowheader", "cell"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-table-column-scope": { + implicitRole: ["columnheader", "cell"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-grid-treegrid-row-scope": { + implicitRole: ["rowheader", "gridcell"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-grid-treegrid-column-scope": { + implicitRole: ["columnheader", "gridcell"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-other": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "tr": { + "des-table": { + implicitRole: ["row"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-grid": { + implicitRole: ["row"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-treegrid": { + implicitRole: ["row"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-other": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "default": { + implicitRole: null, + //roleCondition: "", + validRoles: ["any"], + globalAriaAttributesValid: true + } + }; // end of documentConformanceRequirementSpecialTags + // map aria attribute to the corresponding native attribute, apply to any element applicable + // note this mapping is for the related attributes in the same element without checking the parent tree. + // refer to https://w3c.github.io/html-aria/ + ARIADefinitions.relatedAriaHtmlAttributes = { + "aria-checked": { + conflict: [{ + ariaAttributeValue: "false", + htmlAttributeNames: ["checked"], + htmlAttributeValues: null + }], + overlapping: [{ + ariaAttributeValue: "true", + htmlAttributeNames: ["checked"], + htmlAttributeValues: null + }] + }, + "aria-disabled": { + conflict: [{ + ariaAttributeValue: "false", + htmlAttributeNames: ["disabled"], + htmlAttributeValues: null + }], + overlapping: [{ + ariaAttributeValue: "true", + htmlAttributeNames: ["disabled"], + htmlAttributeValues: null + }] + }, + "aria-hidden": { + conflict: [{ + ariaAttributeValue: "false", + htmlAttributeNames: ["hidden"], + htmlAttributeValues: ["hidden,null"] + }, + { + ariaAttributeValue: "true", + htmlAttributeNames: ["hidden"], + htmlAttributeValues: ["until-found"] + }], + overlapping: [{ + ariaAttributeValue: "true", + htmlAttributeNames: ["hidden"], + htmlAttributeValues: ["hidden,null"] + }] + }, + "aria-placeholder": { + conflict: [{ + ariaAttributeValue: null, + htmlAttributeNames: ["placeholder"], + htmlAttributeValues: null + }] + }, + "aria-valuemax": { + conflict: [{ + ariaAttributeValue: null, + htmlAttributeNames: ["max"], + htmlAttributeValues: null + }] + //overlap case covered in the role definition: Authors SHOULD NOT use aria-valuemax on any element which allows the max attribute. Use the max attribute instead. + }, + "aria-valuemin": { + conflict: [{ + ariaAttributeValue: null, + htmlAttributeNames: ["min"], + htmlAttributeValues: null + }] + ////overlap case covered in the role definition:Authors SHOULD NOT use aria-valuemin on any element which allows the min attribute. Use the min attribute instead. + }, + "aria-readonly": { + conflict: [{ + ariaAttributeValue: "false", + htmlAttributeNames: ["readonly", "contenteditable", "iscontenteditable"], + htmlAttributeValues: [null, "false", "false"] + }], + overlapping: [{ + ariaAttributeValue: "true", + htmlAttributeNames: ["readonly", "contenteditable", "iscontenteditable"], + htmlAttributeValues: [null, "true", "true"] + }] + }, + "aria-required": { + conflict: [{ + ariaAttributeValue: "false", + htmlAttributeNames: ["required"], + htmlAttributeValues: null + }], + overlapping: [{ + ariaAttributeValue: "true", + htmlAttributeNames: ["required"], + htmlAttributeValues: null + }] + }, + "aria-colspan": { + conflict: [{ + // conflict occurs if both values are different + ariaAttributeValue: "VALUE", + htmlAttributeNames: ["colspan"], + htmlAttributeValues: ["VALUE"] + }], + overlapping: [{ + // overlap occurs if both exists + ariaAttributeValue: null, + htmlAttributeNames: ["colspan"], + htmlAttributeValues: null + }] + }, + "aria-rowspan": { + conflict: [{ + // conflict occurs if both values are different + ariaAttributeValue: "VALUE", + htmlAttributeNames: ["rowspan"], + htmlAttributeValues: ["VALUE"] + }], + overlapping: [{ + // overlap occurs if both exists + ariaAttributeValue: null, + htmlAttributeNames: ["rowspan"], + htmlAttributeValues: null + }] + }, + /** "aria-autocomplete": { + conflict: [{ + // conflict occurs if both exists, aria value is only for custom widget, rather than native + ariaAttributeValue: null, + htmlAttributeNames: ["autocomplete"], + htmlAttributeValues: null + }] + } */ + }; + ARIADefinitions.containers = []; + return ARIADefinitions; +}()); +exports.ARIADefinitions = ARIADefinitions; +; +var containerArray = []; +for (var roleDesign in ARIADefinitions.designPatterns) { + var containers = ARIADefinitions.designPatterns[roleDesign].container; + if (containers !== null) { + for (var _i = 0, containers_1 = containers; _i < containers_1.length; _i++) { + var container = containers_1[_i]; + if (containerArray.indexOf(container) == -1) { + containerArray.push(container); + } + } + } +} +ARIADefinitions.containers = containerArray; + + +/***/ }, + +/***/ "./src/v2/aria/ARIAMapper.ts" +/*!***********************************!*\ + !*** ./src/v2/aria/ARIAMapper.ts ***! + \***********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ARIAMapper = void 0; +var ARIADefinitions_1 = __webpack_require__(/*! ./ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var CommonMapper_1 = __webpack_require__(/*! ../common/CommonMapper */ "./src/v2/common/CommonMapper.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../../v4/util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../../v4/util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var ARIAWalker_1 = __webpack_require__(/*! ./ARIAWalker */ "./src/v2/aria/ARIAWalker.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../../v4/util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../../v4/util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var ARIAMapper = /** @class */ (function (_super) { + __extends(ARIAMapper, _super); + function ARIAMapper() { + return _super !== null && _super.apply(this, arguments) || this; + } + ARIAMapper.prototype.childrenCanHaveRole = function (node, role) { + // if (node.nodeType === 1 /* Node.ELEMENT_NODE */) { + // const elem = node as Element; + // if (elem.getAttribute("aria-hidden") === "true") { + // return false; + // } + // } + return !(role in ARIADefinitions_1.ARIADefinitions.designPatterns && ARIADefinitions_1.ARIADefinitions.designPatterns[role].presentationalChildren); + }; + ARIAMapper.prototype.getRole = function (node) { + var role = ARIAMapper.nodeToRole(node); + return role; + }; + ARIAMapper.prototype.getNamespace = function () { + return "aria"; + }; + ARIAMapper.prototype.getAttributes = function (node) { + var retVal = {}; + if (node.nodeType === 1 /* Node.ELEMENT_NODE */) { + var cacheVal = CacheUtil_1.CacheUtil.getCache(node, "ARIAMapper::getAttributes", undefined); + if (typeof cacheVal !== "undefined") + return cacheVal; + var elem = node; + for (var idx = 0; idx < elem.attributes.length; ++idx) { + var attrInfo = elem.attributes[idx]; + var name_1 = attrInfo.name.toLowerCase(); + if (name_1.startsWith("aria-")) { + retVal[name_1.substring(5)] = attrInfo.nodeValue; + } + } + // Optimize: Cache nodeName.toLowerCase() to avoid repeated calls + var nodeName = node.nodeName.toLowerCase(); + // Apply global attributes first + ARIAMapper.applyAttrRole(elem, "global", retVal); + // Apply element-specific attributes + ARIAMapper.applyAttrRole(elem, nodeName, retVal); + CacheUtil_1.CacheUtil.setCache(node, "ARIAMapper::getAttributes", retVal); + } + else if (node.nodeType === 3 /* Node.TEXT_NODE */) { + var calculators = ARIAMapper.textAttrValueCalculators; + for (var attr in calculators) { + var val = calculators[attr](node); + if (typeof val !== "undefined" && val !== null) { + retVal[attr] = val; + } + } + } + return retVal; + }; + // Optimize: Move applyAttrRole outside getAttributes to avoid function recreation + ARIAMapper.applyAttrRole = function (elem, nodeName, retVal) { + var calculators = ARIAMapper.elemAttrValueCalculators; + if (!(nodeName in calculators)) + return; + for (var attr in calculators[nodeName]) { + if (!(attr in retVal)) { + var value = calculators[nodeName][attr]; + if (typeof value !== "undefined" && value !== null) { + if (typeof value !== "string") { + value = value(elem); + } + retVal[attr] = value; + } + } + } + }; + ARIAMapper.getAriaOwnedBy = function (elem) { + var doc = fragment_1.FragmentUtil.getOwnerFragment(elem); + if (!CacheUtil_1.CacheUtil.getCache(doc, "ARIAMapper::precalcOwned", false)) { + var owners = doc.querySelectorAll("[aria-owns]"); + for (var iOwner = 0; iOwner < owners.length; ++iOwner) { + var owner = owners[iOwner]; + var ownIds = owner.getAttribute("aria-owns").split(/ +/g); + var _loop_1 = function (iId) { + var owned = doc.getElementById(ownIds[iId]); + //ignore if the aria-owns point to the element itself + //if (owned && !DOMUtil.sameNode(owner, owned)) { + // CacheUtil.setCache(owned, "aria-owned", owner); + //} + /** + * circular hierarchy check: + * (1) the owned element is neither the same element with the owner nor any ascendant of the owner + * (2) any child with aria-owns cannot point to the owner or any ascendant of the owner + */ + if (owned && !DOMUtil_1.DOMUtil.sameNode(owner, owned)) { + // check if the owned with aria-owns that points to another element + var ownedNodes = []; + var sub_owners = owned.querySelectorAll("[aria-owns]"); + for (var i = 0; i < sub_owners.length; ++i) { + var sub_owner = sub_owners[i]; + var sub_ownIds = sub_owner.getAttribute("aria-owns").split(/ +/g); + for (var j = 0; j < sub_ownIds.length; ++j) { + var ownedNode = doc.getElementById(sub_ownIds[j]); + if (ownedNode) + ownedNodes.push(ownedNode); + } + } + if (ownedNodes.length === 0) { + CacheUtil_1.CacheUtil.setCache(owned, "aria-owned", owner); + return "continue"; + } + // check if any aria-owns points to the element itself or any of it's parent + var parent_1 = owner; + var circular = false; + while (parent_1 !== null) { + var found = ownedNodes.some(function (item) { return DOMUtil_1.DOMUtil.sameNode(parent_1, item); }); + if (!found) + parent_1 = DOMWalker_1.DOMWalker.parentElement(parent_1); + else { + circular = true; + break; + } + } + if (!circular) + CacheUtil_1.CacheUtil.setCache(owned, "aria-owned", owner); + } + }; + for (var iId = 0; iId < ownIds.length; ++iId) { + _loop_1(iId); + } + } + CacheUtil_1.CacheUtil.setCache(doc, "ARIAMapper::precalcOwned", true); + } + return CacheUtil_1.CacheUtil.getCache(elem, "aria-owned", null); + }; + ARIAMapper.prototype.getNodeHierarchy = function (node) { + if (!node) + return []; + if (node.nodeType !== 1) { + var parentHierarchy = this.getNodeHierarchy(DOMWalker_1.DOMWalker.parentElement(node)); + var parentInfo = parentHierarchy.length > 0 ? parentHierarchy[parentHierarchy.length - 1] : { + role: "", + rolePath: "", + roleCount: {}, + childrenCanHaveRole: true + }; + var nodeHierarchy = []; + // Set hierarchy + for (var _i = 0, parentHierarchy_1 = parentHierarchy; _i < parentHierarchy_1.length; _i++) { + var item = parentHierarchy_1[_i]; + nodeHierarchy.push(item); + } + nodeHierarchy.push({ + attributes: {}, + bounds: this.getBounds(node), + namespace: this.getNamespace(), + node: node, + role: this.getRole(node) || null, + rolePath: parentInfo.rolePath + "/" + (this.getRole(node) || null), + roleCount: {}, + childrenCanHaveRole: parentInfo.childrenCanHaveRole + }); + return nodeHierarchy; + } + else { + var elem = node; + var nodeHierarchy = CacheUtil_1.CacheUtil.getCache(elem, "ARIAMapper::getNodeHierarchy", null); + if (!nodeHierarchy) { + // This element hasn't been processed yet - but ::reset processes them all in the right order + // Get details about the correct parent first + var parent_2 = ARIAMapper.getAriaOwnedBy(elem); + if (!parent_2) { + parent_2 = DOMWalker_1.DOMWalker.parentElement(elem); + } + while (parent_2 && parent_2.nodeType !== 1) { + parent_2 = DOMWalker_1.DOMWalker.parentElement(elem); + } + var parentHierarchy = parent_2 ? this.getNodeHierarchy(parent_2) : []; + var parentInfo = parentHierarchy.length > 0 ? parentHierarchy[parentHierarchy.length - 1] : { + role: "", + rolePath: "", + roleCount: {}, + childrenCanHaveRole: true + }; + while (parentInfo.role === null) { + parent_2 = ARIAMapper.getAriaOwnedBy(parent_2) || DOMWalker_1.DOMWalker.parentElement(parent_2); + parentHierarchy = parent_2 ? this.getNodeHierarchy(parent_2) : []; + parentInfo = parentHierarchy[parentHierarchy.length - 1]; + } + // Set initial node info + var nodeInfo = { + attributes: elem.nodeType === 1 ? this.getAttributes(elem) : {}, + bounds: this.getBounds(elem), + namespace: this.getNamespace(), + node: elem, + role: this.getRole(elem) || null, + rolePath: "", + roleCount: {}, + childrenCanHaveRole: true + }; + // Adjust role if we're within a presentational container + var presentationalContainer = !parentInfo.childrenCanHaveRole; + if (presentationalContainer) { + nodeInfo.role = null; + } + else { + nodeInfo.childrenCanHaveRole = parentInfo.childrenCanHaveRole + && this.childrenCanHaveRole(elem, nodeInfo.role); + } + // Set the paths + if (nodeInfo.role !== null) { + parentInfo.roleCount[nodeInfo.role] = (parentInfo.roleCount[nodeInfo.role] || 0) + 1; + nodeInfo.rolePath = parentInfo.rolePath + "/" + nodeInfo.role + "[" + parentInfo.roleCount[nodeInfo.role] + "]"; + } + else { + nodeInfo.rolePath = parentInfo.rolePath; + } + // Set hierarchy + nodeHierarchy = []; + for (var _a = 0, parentHierarchy_2 = parentHierarchy; _a < parentHierarchy_2.length; _a++) { + var item = parentHierarchy_2[_a]; + nodeHierarchy.push(item); + } + nodeHierarchy.push(nodeInfo); + CacheUtil_1.CacheUtil.setCache(elem, "ARIAMapper::getNodeHierarchy", nodeHierarchy); + } + return nodeHierarchy; + } + }; + ARIAMapper.prototype.reset = function (node) { + ARIAMapper.nameComputationId = 0; + this.hierarchyRole = []; + this.hierarchyResults = []; + this.hierarchyPath = [{ + rolePath: "", + roleCount: {} + }]; + // Get to the topmost node + var goodNode = node; + var next; + while (next = DOMWalker_1.DOMWalker.parentNode(goodNode)) { + goodNode = next; + } + ; + // Walk the tree and set the hierarchies in the right order + var ariaWalker = new ARIAWalker_1.ARIAWalker(goodNode, false, goodNode); + do { + if (ariaWalker.node.nodeType === 1) { + this.getNodeHierarchy(ariaWalker.node); + } + } while (ariaWalker.nextNode()); + }; + ARIAMapper.prototype.openScope = function (node) { + if (this.hierarchyRole === null) { + this.reset(node); + } + this.pushHierarchy(node); + for (var idx = 0; idx < this.hierarchyResults.length; ++idx) { + if (this.hierarchyResults[idx].role && this.hierarchyResults[idx].role[0] === "/") { + this.hierarchyResults[idx].role = (this.hierarchyResults[idx].role ? this.hierarchyResults[idx].role.substring(1) : null); + } + } + return this.hierarchyResults; + }; + ARIAMapper.prototype.pushHierarchy = function (node) { + // If we're not an element, no special handling + var nodeHierarchy = []; + // Determine our node info + nodeHierarchy = this.getNodeHierarchy(node); + var nodeInfo = nodeHierarchy[nodeHierarchy.length - 1]; + this.hierarchyRole.push(nodeInfo.role); + if (nodeInfo.role !== null) { + this.hierarchyPath.push(nodeInfo); + } + this.hierarchyResults = nodeHierarchy; + }; + ARIAMapper.prototype.closeScope = function (node) { + var retVal = []; + for (var _i = 0, _a = this.hierarchyResults; _i < _a.length; _i++) { + var res = _a[_i]; + // const temp = res.node; + // res.node = null; + // let cloned = JSON.parse(JSON.stringify(res)); + // cloned.node = res.node = temp; + // retVal.push(cloned); + retVal.push(res); + } + if (retVal.length > 0) { + retVal[retVal.length - 1].role = "/" + retVal[retVal.length - 1].role; + var parent_3 = DOMWalker_1.DOMWalker.parentElement(node); + this.hierarchyResults = parent_3 ? CacheUtil_1.CacheUtil.getCache(parent_3, "ARIAMapper::getNodeInfo", []) : []; + } + return retVal; + }; + /**public static computeName(cur: Node) : string { + ++ARIAMapper.nameComputationId; + return ARIAMapper.computeNameHelp(ARIAMapper.nameComputationId, cur, false, false); + } + + public static computeNameHelp(walkId: number, cur: Node, labelledbyTraverse: boolean, walkTraverse: boolean) : string { + // 2g. None of the other content applies to text nodes, so just do this first + if (cur.nodeType === 3 ) return cur.nodeValue; + if (cur.nodeType === 11) return ""; + if (cur.nodeType !== 1 ) { + if (walkTraverse || labelledbyTraverse) return ""; + throw new Error ("Can only compute name on Element and Text " + cur.nodeType); + } + + const elem = cur as Element; + // We've been here before - prevent recursion + if (CacheUtil.getCache(elem, "data-namewalk", null) === ""+walkId) return ""; + CacheUtil.setCache(elem, "data-namewalk", ""+walkId); + // See https://www.w3.org/TR/html-aam-1.0/#input-type-text-input-type-password-input-type-search-input-type-tel-input-type-url-and-textarea-element + + // 2a. Only show hidden content if it's referenced by a labelledby + if (!labelledbyTraverse && !VisUtil.isNodeVisible(cur)) { + return ""; + } + + // 2b. collect valid id references + if (!labelledbyTraverse && elem.hasAttribute("aria-labelledby")) { + let labelledby = elem.getAttribute("aria-labelledby").split(" "); + let validElems = []; + for (const ref of labelledby) { + const refElem = FragmentUtil.getById(cur, ref); + if (refElem && !DOMUtil.sameNode(elem, refElem)) { + validElems.push(refElem); + } + } + if (validElems.length > 0) { + let accumulated = ""; + for (const elem of validElems) { + accumulated += " " + this.computeNameHelp(walkId, elem, true, false); + } + return accumulated.trim(); + } + } + + // Since nodeToRole calls back here for form and section, we need special casing here to handle those two cases + if (["section", "form"].includes(cur.nodeName.toLowerCase())) { + if (elem.hasAttribute("aria-label") && elem.getAttribute("aria-label").trim().length > 0) { + // If I'm not an embedded control or I'm not recursing, return the aria-label + if (!labelledbyTraverse && !walkTraverse) { + return elem.getAttribute("aria-label").trim(); + } + } + if (elem.hasAttribute("title")) { + return elem.getAttribute("title"); + } + return ""; + } + + // 2c. If label or walk, and this is a control, skip to the value, otherwise provide the label + const role = ARIAMapper.nodeToRole(cur); + let isEmbeddedControl = [ + "textbox", "button", "combobox", "listbox", + "progressbar", "scrollbar", "slider", "spinbutton" + ].includes(role); + if (elem.hasAttribute("aria-label") && elem.getAttribute("aria-label").trim().length > 0) { + // If I'm not an embedded control or I'm not recursing, return the aria-label + if (!labelledbyTraverse && !walkTraverse || !isEmbeddedControl) { + return elem.getAttribute("aria-label").trim(); + } + } + + // 2d. + if (role !== "presentation" && role !== "none") { + if ((cur.nodeName.toLowerCase() === "img" || cur.nodeName.toLowerCase() === "area") && elem.hasAttribute("alt")) { + return DOMUtil.cleanWhitespace(elem.getAttribute("alt")).trim(); + } + + if (cur.nodeName.toLowerCase() === "input" && elem.hasAttribute("id") && elem.getAttribute("id").length > 0) { + let label = elem.ownerDocument.querySelector("label[for='"+elem.getAttribute("id")+"']"); + if (label) { + if (label.hasAttribute("aria-label") || (label.hasAttribute("aria-labelledby") && !CommonUtil.isIdReferToSelf(cur, label.getAttribute("aria-labelledby")))) { + return this.computeNameHelp(walkId, label, false, false); + } else { + return label.textContent; + } + } + } + if (cur.nodeName.toLowerCase() === "fieldset") { + if( (<Element>cur).querySelector("legend")){ + let legend = (<Element>cur).querySelector("legend"); + return legend.innerText; + }else{ + return this.computeNameHelp(walkId, cur, false, false); + } + + } + + } + + // 2e. + if ((walkTraverse || labelledbyTraverse) && isEmbeddedControl) { + // If the embedded control has role textbox, return its value. + if (role === "textbox") { + if (elem.nodeName.toLowerCase() === "input") { + if (elem.hasAttribute("value")) return elem.getAttribute("value"); + } else { + walkTraverse = false; + } + } + + // If the embedded control has role button, return the text alternative of the button. + if (role === "button") { + if (elem.nodeName.toLowerCase() === "input") { + let type = elem.getAttribute("type").toLowerCase(); + if (["button", "submit", "reset"].includes(type)) { + if (elem.hasAttribute("value")) return elem.getAttribute("value"); + if (type === "submit") return "Submit"; + if (type === "reset") return "Reset"; + } + } else { + walkTraverse = false; + } + } + + // TODO: If the embedded control has role combobox or listbox, return the text alternative of the chosen option. + if (role === "combobox") { + if (elem.hasAttribute("aria-activedescendant")) { + let selected = FragmentUtil.getById(elem, "aria-activedescendant"); + if (selected && !DOMUtil.sameNode(elem, selected)) { + return ARIAMapper.computeNameHelp(walkId, selected, false, false); + } + } + } + + // If the embedded control has role range (e.g., a spinbutton or slider): + if (["progressbar", "scrollbar", "slider", "spinbutton"].includes(role)) { + // If the aria-valuetext property is present, return its value, + if (elem.hasAttribute("aria-valuetext")) return elem.getAttribute("aria-valuetext"); + // Otherwise, if the aria-valuenow property is present, return its value, + if (elem.hasAttribute("aria-valuenow")) return elem.getAttribute("aria-valuenow"); + // TODO: Otherwise, use the value as specified by a host language attribute. + } + } + + // 2f. 2h. + if (walkTraverse || ARIADefinitions.nameFromContent(role) || labelledbyTraverse) { + // 2fi. Set the accumulated text to the empty string. + let accumulated = ""; + // 2fii. Check for CSS generated textual content associated with the current node and + // include it in the accumulated text. The CSS :before and :after pseudo elements [CSS2] + // can provide textual content for elements that have a content model. + // For :before pseudo elements, User agents MUST prepend CSS textual content, without + // a space, to the textual content of the current node. + // For :after pseudo elements, User agents MUST append CSS textual content, without a + // space, to the textual content of the current node. + let before = null; + before = elem.ownerDocument.defaultView.getComputedStyle(elem,"before").content; + + if (before && before !== "none") { + before = before.replace(/^"/,"").replace(/"$/,""); + accumulated += before; + } + // 2fiii. For each child node of the current node: + // Set the current node to the child node. + // Compute the text alternative of the current node beginning with step 2. Set the result + // to that text alternative. + // Append the result to the accumulated text. + if (elem.nodeName.toUpperCase() === "SLOT") { + //if no assignedNode, check its own text + if (!(elem as HTMLSlotElement).assignedNodes() || (elem as HTMLSlotElement).assignedNodes().length === 0) { + let innerText = CommonUtil.getInnerText(elem); + if (innerText && innerText !== null && innerText.trim().length > 0) + accumulated += " " + innerText; + } else { + // check text from all assigned nodes + for (const slotChild of (elem as HTMLSlotElement).assignedNodes()) { + let nextChildContent = ARIAMapper.computeNameHelp(walkId, slotChild, labelledbyTraverse, true); + accumulated += " " + nextChildContent; + } + } + } else { + let walkChild = elem.firstChild; + while (walkChild) { + let nextChildContent = ARIAMapper.computeNameHelp(walkId, walkChild, labelledbyTraverse, true); + accumulated += " " + nextChildContent; + walkChild = walkChild.nextSibling; + } + } + + let after = null; + try { + after = elem.ownerDocument.defaultView.getComputedStyle(elem,"after").content; + } catch (e) {} + + if (after && after !== "none") { + after = after.replace(/^"/,"").replace(/"$/,""); + accumulated += after; + } + // 2fiv. Return the accumulated text. + accumulated = accumulated.replace(/\s+/g," ").trim(); + if (accumulated.trim().length > 0) { + return accumulated; + } + } + + // 2i. Otherwise, if the current node has a Tooltip attribute, return its value. + if (elem.hasAttribute("title")) { + return elem.getAttribute("title"); + } + if (elem.tagName.toLowerCase() === "svg") { + let title = elem.querySelector("title"); + if (title) { + return title.textContent || title.innerText; + } + } + + return ""; + } + */ + /* if (role in ARIADefinitions.designPatterns + && ARIADefinitions.designPatterns[role].nameFrom + && ARIADefinitions.designPatterns[role].nameFrom.includes("contents")) + { + name = elem.textContent; + } + if (elem.nodeName.toLowerCase() === "input" && elem.hasAttribute("id") && elem.getAttribute("id").trim().length > 0) { + name = elem.ownerDocument.querySelector("label[for='"+elem.getAttribute("id").trim()+"']").textContent; + } + if (elem.hasAttribute("aria-label")) { + name = elem.getAttribute("aria-label"); + } + if (elem.hasAttribute("aria-labelledby")) { + name = ""; + const ids = elem.getAttribute("aria-labelledby").split(" "); + for (const id of ids) { + name += FragmentUtil.getById(elem, id).textContent + " "; + } + name = name.trim(); + } + return name; + }*/ + ARIAMapper.nodeToRole = function (node) { + if (node.nodeType === 3 /* Node.TEXT_NODE */) { + return "text"; + } + else if (node.nodeType !== 1 /* Node.ELEMENT_NODE */) { + return null; + } + var elem = node; + if (!elem || elem.nodeType !== 1 /* Node.ELEMENT_NODE */) { + return null; + } + // TO DO: use AriaUtil.getResolvedRole(elem) to replace the code following, which uses only the valid roles for the element based on the aria fallback rule + //const role = AriaUtil.getResolvedRole(elem); + //return role === "presentation" || role === "none" ? null : role; + if (elem.hasAttribute("role") && elem.getAttribute("role").trim().length > 0) { + var roleStr = elem.getAttribute("role").trim(); + var roles_2 = roleStr.split(" "); + for (var _i = 0, roles_1 = roles_2; _i < roles_1.length; _i++) { + var role_1 = roles_1[_i]; + if (role_1 === "presentation" || role_1 === "none") { + // If element is focusable, then presentation roles are to be ignored + if (!CommonUtil_1.CommonUtil.isFocusable(elem)) { + return null; + } + } + else if (role_1 in ARIADefinitions_1.ARIADefinitions.designPatterns) { + return role_1; + } + } + } + //return this.elemToImplicitRole(elem); + var roles = AriaUtil_1.AriaUtil.getImplicitRole(elem); + //console.log("node=" + node.nodeName +", role= " + (roles ? roles[0] : null) +", resolved=" + AriaUtil.getResolvedRole(elem)); + var role = !roles || roles.length === 0 ? null : roles[0]; + return role === "presentation" || role === "none" ? null : role; + //return AriaUtil.getResolvedRole(elem); + }; + //////////////////////////////////////////////////////////////////////////// + // Helper functions + //// + // https://www.w3.org/TR/html-aam-1.0/#mapping-html-to-accessibility-apis + ARIAMapper.elemAttrValueCalculators = { + "global": { + "name": function (elem) { var _a; return (_a = AccNameUtil_1.AccNameUtil.computeAccessibleName(elem)) === null || _a === void 0 ? void 0 : _a.name; } //ARIAMapper.computeName + }, + "datalist": { + // set to "true" if the datalist's selection model allows multiple option elements to be + // selected at a time, and "false" otherwise + "multiselectable": function (elem) { + var id = elem.getAttribute("id"); + if (id && id.length > 0) { + var input = elem.ownerDocument.querySelector("input[list='" + id + "']"); + return "" + (elem.getAttribute("multiple") + && (elem.getAttribute("multiple") == "true" || elem.getAttribute("multiple") == "")); + } + return null; + } + }, + "h1": { + "level": "1" + }, + "h2": { + "level": "2" + }, + "h3": { + "level": "3" + }, + "h4": { + "level": "4" + }, + "h5": { + "level": "5" + }, + "h6": { + "level": "6" + }, + "input": { + // - type="checkbox" state set to "mixed" if the element's indeterminate IDL attribute + // is true, or "true" if the element's checkedness is true, or "false" otherwise + // - type="radio" state set to "true" if the element's checkedness is true, or "false" + // otherwise. + "checked": function (elem) { + var type = elem.getAttribute("type"); + if (type === "checkbox" || type === "radio") { + return "" + elem.checked; + } + return null; + } + // - type="radio" and not in menu reflecting number of type=radio input elements + // within the radio button group + , + "setsize": function (elem) { return null; // removed by dead control flow + } + // - type="radio" and not in menu value reflecting the elements position + // within the radio button group." + , + "posinset": function (elem) { return null; // removed by dead control flow + } + // input (type attribute in the Text, Search, Telephone, URL, or E-mail states with a + // suggestions source element) combobox role, with the aria-owns property set to the same + // value as the list attribute + , + "owns": function (elem) { return null; // removed by dead control flow + } + }, + "keygen": { + "multiselectable": "false" + }, + "li": { + // Number of li elements within the ol, ul, menu + "setsize": function (elem) { + var parent = DOMUtil_1.DOMUtil.getAncestor(elem, ["ol", "ul", "menu"]); + if (!parent) + return null; + var lis = CacheUtil_1.CacheUtil.getSetCache(parent, "elemAttrValueCalculators::lis", function () { return parent.querySelectorAll("li"); }); + var otherlis = CacheUtil_1.CacheUtil.getSetCache(parent, "elemAttrValueCalculators::otherlis", function () { return parent.querySelectorAll("ol li, ul li, menu li"); }); + return "" + (lis.length - otherlis.length); + } + // Position of li element within the ol, ul, menu + , + "posinset": function (elem) { + var parent = DOMUtil_1.DOMUtil.getAncestor(elem, ["ol", "ul", "menu"]); + if (!parent) + return null; + var lis = CacheUtil_1.CacheUtil.getSetCache(parent, "elemAttrValueCalculators::lis", function () { return parent.querySelectorAll("li"); }); + var num = 0; + for (var idx = 0; idx < lis.length; ++idx) { + var li = lis[idx]; + if (DOMUtil_1.DOMUtil.sameNode(parent, DOMUtil_1.DOMUtil.getAncestor(li, ["ol", "ul", "menu"]))) { + return "" + num; + } + ++num; + } + return null; + } + }, + "menuitem": { + // type = checkbox or radio, set to "true" if the checked attribute + // is present, and "false" otherwise + "checked": function (elem) { return "" + !!(elem.getAttribute("checked") + && (elem.getAttribute("checked") == "true" || elem.getAttribute("checked") == "")); } + }, + "option": { + // set to "true" if the element's selectedness is true, or "false" otherwise. + "selected": function (elem) { return "" + !!(elem.getAttribute("selected") + && (elem.getAttribute("selected") == "true" || elem.getAttribute("selected") == "")); } + }, + "progress": { + "valuemax": function (elem) { return elem.getAttribute("max") || "1"; }, + "valuemin": function (elem) { return "0"; }, + "valuenow": function (elem) { return elem.getAttribute("value"); } + } + }; + ARIAMapper.textAttrValueCalculators = { + "name": function (node) { return node.nodeValue; } + }; + ARIAMapper.nameComputationId = 0; + return ARIAMapper; +}(CommonMapper_1.CommonMapper)); +exports.ARIAMapper = ARIAMapper; + + +/***/ }, + +/***/ "./src/v2/aria/ARIAWalker.ts" +/*!***********************************!*\ + !*** ./src/v2/aria/ARIAWalker.ts ***! + \***********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ARIAWalker = void 0; +var fragment_1 = __webpack_require__(/*! ../checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var ARIAMapper_1 = __webpack_require__(/*! ./ARIAMapper */ "./src/v2/aria/ARIAMapper.ts"); +var VisUtil_1 = __webpack_require__(/*! ../../v4/util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +/** + * Walks in an ARIA order + * + * See also ../dom/DOMWalker + */ +var ARIAWalker = /** @class */ (function () { + function ARIAWalker(element, bEnd, root) { + this.root = root || element; + if (this.root.nodeType === 9) { + this.root = this.root.documentElement; + } + this.node = element; + // if (this.node.nodeType === 9) { + // this.node = (this.node as Document).documentElement + // } + this.bEndTag = (bEnd == undefined ? false : bEnd == true); + } + ARIAWalker.prototype.atRoot = function () { + if (this.ownerElement) + return false; + if (this.root === this.node) { + return true; + } + else if (this.root.isSameNode) { + return this.root.isSameNode(this.node); + } + else if (this.root.compareDocumentPosition) { + return this.root.compareDocumentPosition(this.node) === 0; + } + else { + // Not supported in this environment - try our best + return this.node.parentNode === null; + } + }; + ARIAWalker.prototype.nextNode = function () { + var skipOwned = false; + do { + skipOwned = false; + // console.log(this.node.nodeName, this.bEndTag?"END":"START", this.node.nodeType === 1 && (this.node as any).getAttribute("id")); + if (!this.bEndTag) { + var iframeNode = this.node; + var elementNode = this.node; + var slotElement = this.node; + if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && this.node.nodeName.toUpperCase() === "IFRAME" + && VisUtil_1.VisUtil.isNodeVisible(iframeNode) + && iframeNode.contentDocument + && iframeNode.contentDocument.documentElement) { + var ownerElement = this.node; + this.node = iframeNode.contentDocument.documentElement; + this.node.ownerElement = ownerElement; + } + else if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && VisUtil_1.VisUtil.isNodeVisible(elementNode) + && elementNode.shadowRoot + && elementNode.shadowRoot.firstChild) { + var ownerElement = this.node; + this.node = elementNode.shadowRoot; + this.node.ownerElement = ownerElement; + DOMWalker_1.DOMWalker.assignSlots(this.node); + } + else if (this.node.nodeType === 1 + && elementNode.nodeName.toLowerCase() === "slot" + && slotElement.assignedNodes().length > 0) { + this.node = slotElement.assignedNodes()[0]; + } + else if ((this.node.nodeType === 1 /* Node.ELEMENT_NODE */ || this.node.nodeType === 11 /* Node.DOCUMENT_FRAGMENT_NODE */) + && DOMWalker_1.DOMWalker.firstChildNotOwnedBySlot(this.node)) { + this.node = DOMWalker_1.DOMWalker.firstChildNotOwnedBySlot(this.node); + } + else { + this.bEndTag = true; + } + } + else { + if (this.atRoot()) { + return false; + } + else if (this.node.slotOwner) { + var slotOwner = this.node.slotOwner; + var nextSlotIndex = this.node.slotIndex + 1; + // delete (this.node as any).slotOwner; + // delete (this.node as any).slotIndex; + if (nextSlotIndex < slotOwner.assignedNodes().length) { + this.node = slotOwner.assignedNodes()[nextSlotIndex]; + this.bEndTag = false; + } + else { + this.node = slotOwner; + this.bEndTag = true; + } + } + else if (this.node.ownerElement) { + this.node = this.node.ownerElement; + this.bEndTag = true; + } + else if (DOMWalker_1.DOMWalker.nextSiblingNotOwnedBySlot(this.node)) { + this.node = DOMWalker_1.DOMWalker.nextSiblingNotOwnedBySlot(this.node); + this.bEndTag = false; + skipOwned = true; + } + else if (this.node.parentNode) { + if (this.node.parentNode.nodeType === 1 && this.node.parentNode.hasAttribute("aria-owns")) { + var ownIds = this.node.parentNode.getAttribute("aria-owns").split(/ +/g); + if (this.node.nodeType !== 1 || !this.node.hasAttribute("id")) { + this.node = fragment_1.FragmentUtil.getOwnerFragment(this.node).getElementById(ownIds[0]); + this.bEndTag = false; + } + else { + var idx = ownIds.indexOf(this.node.getAttribute("id")); + if (idx === ownIds.length - 1) { + // last one + this.node = this.node.parentNode; + this.bEndTag = true; + } + else { + // grab next + this.node = fragment_1.FragmentUtil.getOwnerFragment(this.node).getElementById(ownIds[idx + 1]); + this.bEndTag = false; + } + } + } + this.node = this.node.parentNode; + this.bEndTag = true; + } + else { + return false; + } + } + } while ((this.node.nodeType !== 1 /* Node.ELEMENT_NODE */ && this.node.nodeType !== 11 && this.node.nodeType !== 3 /* Node.TEXT_NODE */) + || (this.node.nodeType === 1 && this.node.getAttribute("aChecker") === "ACE") + || (skipOwned && this.node.nodeType === 1 && !!ARIAMapper_1.ARIAMapper.getAriaOwnedBy(this.node))); + return true; + }; + ARIAWalker.prototype.prevNode = function () { + var skipOwned = false; + do { + skipOwned = false; + if (this.bEndTag) { + var iframeNode = this.node; + var elementNode = this.node; + if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && this.node.nodeName.toUpperCase() === "IFRAME" + && VisUtil_1.VisUtil.isNodeVisible(iframeNode) + && iframeNode.contentDocument + && iframeNode.contentDocument.documentElement) { + var ownerElement = this.node; + this.node = iframeNode.contentDocument.documentElement; + this.node.ownerElement = ownerElement; + } + else if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && VisUtil_1.VisUtil.isNodeVisible(elementNode) + && elementNode.shadowRoot + && elementNode.shadowRoot.lastChild) { + var ownerElement = this.node; + this.node = elementNode.shadowRoot; + this.node.ownerElement = ownerElement; + DOMWalker_1.DOMWalker.assignSlots(this.node); + } + else if ((this.node.nodeType === 1 /* Node.ELEMENT_NODE */ || this.node.nodeType === 11) + && DOMWalker_1.DOMWalker.lastChildNotOwnedBySlot(this.node)) { + this.node = DOMWalker_1.DOMWalker.lastChildNotOwnedBySlot(this.node); + } + else { + this.bEndTag = false; + } + } + else { + if (this.atRoot()) { + return false; + } + else if (DOMWalker_1.DOMWalker.previousSiblingNotOwnedBySlot(this.node)) { + this.node = DOMWalker_1.DOMWalker.previousSiblingNotOwnedBySlot(this.node); + this.bEndTag = true; + } + else if (this.node.ownerElement) { + this.node = this.node.ownerElement; + this.bEndTag = false; + skipOwned = true; + } + else if (this.node.parentNode) { + if (this.node.parentNode.nodeType === 1 && this.node.parentNode.hasAttribute("aria-owns")) { + var ownIds = this.node.parentNode.getAttribute("aria-owns").split(/ +/g); + if (this.node.nodeType !== 1 || !this.node.hasAttribute("id")) { + this.node = fragment_1.FragmentUtil.getOwnerFragment(this.node).getElementById(ownIds[0]); + this.bEndTag = false; + } + else { + var idx = ownIds.indexOf(this.node.getAttribute("id")); + if (idx === ownIds.length - 1) { + // last one + this.node = this.node.parentNode; + this.bEndTag = true; + } + else { + // grab next + this.node = fragment_1.FragmentUtil.getOwnerFragment(this.node).getElementById(ownIds[idx + 1]); + this.bEndTag = false; + } + } + } + this.node = this.node.parentNode; + this.bEndTag = false; + } + else { + return false; + } + } + } while ((this.node.nodeType !== 1 /* Node.ELEMENT_NODE */ && this.node.nodeType !== 11) + || (this.node.nodeType === 1 && this.node.getAttribute("aChecker") === "ACE") + || (skipOwned && this.node.nodeType === 1 && !!ARIAMapper_1.ARIAMapper.getAriaOwnedBy(this.node))); + return true; + }; + return ARIAWalker; +}()); +exports.ARIAWalker = ARIAWalker; + + +/***/ }, + +/***/ "./src/v2/checker/accessibility/util/ancestor.ts" +/*!*******************************************************!*\ + !*** ./src/v2/checker/accessibility/util/ancestor.ts ***! + \*******************************************************/ +(__unused_webpack_module, exports) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.AncestorUtil = void 0; +var AncestorUtil = /** @class */ (function () { + function AncestorUtil() { + } + AncestorUtil.isPresentationFrame = function (contextHierarchy) { + if (contextHierarchy && contextHierarchy.dom) { + // Skip current node because we want ancestry + for (var idx = contextHierarchy.dom.length - 2; idx >= 0; --idx) { + var elem = contextHierarchy.dom[idx].node; + if (elem.nodeType === 1 + && elem.nodeName.toLowerCase() === "iframe" + && (elem.getAttribute("role") === "presentation" || elem.getAttribute("aria-hidden") === "true")) { + return true; + } + } + } + return false; + }; + AncestorUtil.isFrame = function (contextHierarchy) { + if (contextHierarchy && contextHierarchy.dom) { + // Skip current node because we want ancestry + for (var idx = contextHierarchy.dom.length - 2; idx >= 0; --idx) { + var elem = contextHierarchy.dom[idx].node; + if (elem.nodeType === 1 && elem.nodeName.toLowerCase() === "iframe") { + return true; + } + } + } + return false; + }; + return AncestorUtil; +}()); +exports.AncestorUtil = AncestorUtil; + + +/***/ }, + +/***/ "./src/v2/checker/accessibility/util/fragment.ts" +/*!*******************************************************!*\ + !*** ./src/v2/checker/accessibility/util/fragment.ts ***! + \*******************************************************/ +(__unused_webpack_module, exports) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.FragmentUtil = void 0; +var FragmentUtil = /** @class */ (function () { + function FragmentUtil() { + } + FragmentUtil.getOwnerFragment = function (node) { + var n = node; + while (n.parentNode && (n = n.parentNode)) { + if (n.nodeType === 11) { + return n; + } + } + return node.ownerDocument; + }; + FragmentUtil.getById = function (node, id) { + return this.getOwnerFragment(node).getElementById(id); + }; + FragmentUtil.getAncestor = function (hierarchies, elemName) { + var matches = hierarchies["dom"].filter(function (info) { return info.role === elemName; }); + return matches.length > 0 && matches[0].node || null; + }; + FragmentUtil.getAncestorWithRole = function (hierarchies, role) { + var matches = hierarchies["aria"].filter(function (info) { return info.role === role; }); + return matches.length > 0 && matches[0].node || null; + }; + return FragmentUtil; +}()); +exports.FragmentUtil = FragmentUtil; + + +/***/ }, + +/***/ "./src/v2/checker/accessibility/util/lang.ts" +/*!***************************************************!*\ + !*** ./src/v2/checker/accessibility/util/lang.ts ***! + \***************************************************/ +(__unused_webpack_module, exports) { + + +/****************************************************************************** + Copyright:: 2021- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.LangUtil = void 0; +// From https://www.iana.org/assignments/language-subtag-registry/language-subtag-registry +var validPrimaryLangs = [ + ["aa", "ab", "ae", "af", "ak", "am", "an", "ar", "as", "av", "ay", "az", "aaa", "aab", "aac", "aad", "aae", "aaf", "aag", "aah", "aai", "aak", "aal", "aam", "aan", "aao", "aap", "aaq", "aas", "aat", "aau", "aav", "aaw", "aax", "aaz", "aba", "abb", "abc", "abd", "abe", "abf", "abg", "abh", "abi", "abj", "abl", "abm", "abn", "abo", "abp", "abq", "abr", "abs", "abt", "abu", "abv", "abw", "abx", "aby", "abz", "aca", "acb", "acd", "ace", "acf", "ach", "aci", "ack", "acl", "acm", "acn", "acp", "acq", "acr", "acs", "act", "acu", "acv", "acw", "acx", "acy", "acz", "ada", "adb", "add", "ade", "adf", "adg", "adh", "adi", "adj", "adl", "adn", "ado", "adp", "adq", "adr", "ads", "adt", "adu", "adw", "adx", "ady", "adz", "aea", "aeb", "aec", "aed", "aee", "aek", "ael", "aem", "aen", "aeq", "aer", "aes", "aeu", "aew", "aey", "aez", "afa", "afb", "afd", "afe", "afg", "afh", "afi", "afk", "afn", "afo", "afp", "afs", "aft", "afu", "afz", "aga", "agb", "agc", "agd", "age", "agf", "agg", "agh", "agi", "agj", "agk", "agl", "agm", "agn", "ago", "agp", "agq", "agr", "ags", "agt", "agu", "agv", "agw", "agx", "agy", "agz", "aha", "ahb", "ahg", "ahh", "ahi", "ahk", "ahl", "ahm", "ahn", "aho", "ahp", "ahr", "ahs", "aht", "aia", "aib", "aic", "aid", "aie", "aif", "aig", "aih", "aii", "aij", "aik", "ail", "aim", "ain", "aio", "aip", "aiq", "air", "ais", "ait", "aiw", "aix", "aiy", "aja", "ajg", "aji", "ajn", "ajp", "ajt", "aju", "ajw", "ajz", "akb", "akc", "akd", "ake", "akf", "akg", "akh", "aki", "akj", "akk", "akl", "akm", "ako", "akp", "akq", "akr", "aks", "akt", "aku", "akv", "akw", "akx", "aky", "akz", "ala", "alc", "ald", "ale", "alf", "alg", "alh", "ali", "alj", "alk", "all", "alm", "aln", "alo", "alp", "alq", "alr", "als", "alt", "alu", "alv", "alw", "alx", "aly", "alz", "ama", "amb", "amc", "ame", "amf", "amg", "ami", "amj", "amk", "aml", "amm", "amn", "amo", "amp", "amq", "amr", "ams", "amt", "amu", "amv", "amw", "amx", "amy", "amz", "ana", "anb", "anc", "and", "ane", "anf", "ang", "anh", "ani", "anj", "ank", "anl", "anm", "ann", "ano", "anp", "anq", "anr", "ans", "ant", "anu", "anv", "anw", "anx", "any", "anz", "aoa", "aob", "aoc", "aod", "aoe", "aof", "aog", "aoh", "aoi", "aoj", "aok", "aol", "aom", "aon", "aor", "aos", "aot", "aou", "aox", "aoz", "apa", "apb", "apc", "apd", "ape", "apf", "apg", "aph", "api", "apj", "apk", "apl", "apm", "apn", "apo", "app", "apq", "apr", "aps", "apt", "apu", "apv", "apw", "apx", "apy", "apz", "aqa", "aqc", "aqd", "aqg", "aqk", "aql", "aqm", "aqn", "aqp", "aqr", "aqt", "aqz", "arb", "arc", "ard", "are", "arh", "ari", "arj", "ark", "arl", "arn", "aro", "arp", "arq", "arr", "ars", "art", "aru", "arv", "arw", "arx", "ary", "arz", "asa", "asb", "asc", "asd", "ase", "asf", "asg", "ash", "asi", "asj", "ask", "asl", "asn", "aso", "asp", "asq", "asr", "ass", "ast", "asu", "asv", "asw", "asx", "asy", "asz", "ata", "atb", "atc", "atd", "ate", "atg", "ath", "ati", "atj", "atk", "atl", "atm", "atn", "ato", "atp", "atq", "atr", "ats", "att", "atu", "atv", "atw", "atx", "aty", "atz", "aua", "aub", "auc", "aud", "aue", "auf", "aug", "auh", "aui", "auj", "auk", "aul", "aum", "aun", "auo", "aup", "auq", "aur", "aus", "aut", "auu", "auw", "aux", "auy", "auz", "avb", "avd", "avi", "avk", "avl", "avm", "avn", "avo", "avs", "avt", "avu", "avv", "awa", "awb", "awc", "awd", "awe", "awg", "awh", "awi", "awk", "awm", "awn", "awo", "awr", "aws", "awt", "awu", "awv", "aww", "awx", "awy", "axb", "axe", "axg", "axk", "axl", "axm", "axx", "aya", "ayb", "ayc", "ayd", "aye", "ayg", "ayh", "ayi", "ayk", "ayl", "ayn", "ayo", "ayp", "ayq", "ayr", "ays", "ayt", "ayu", "ayx", "ayy", "ayz", "aza", "azb", "azc", "azd", "azg", "azj", "azm", "azn", "azo", "azt", "azz"], + ["ba", "be", "bg", "bh", "bi", "bm", "bn", "bo", "br", "bs", "baa", "bab", "bac", "bad", "bae", "baf", "bag", "bah", "bai", "baj", "bal", "ban", "bao", "bap", "bar", "bas", "bat", "bau", "bav", "baw", "bax", "bay", "baz", "bba", "bbb", "bbc", "bbd", "bbe", "bbf", "bbg", "bbh", "bbi", "bbj", "bbk", "bbl", "bbm", "bbn", "bbo", "bbp", "bbq", "bbr", "bbs", "bbt", "bbu", "bbv", "bbw", "bbx", "bby", "bbz", "bca", "bcb", "bcc", "bcd", "bce", "bcf", "bcg", "bch", "bci", "bcj", "bck", "bcl", "bcm", "bcn", "bco", "bcp", "bcq", "bcr", "bcs", "bct", "bcu", "bcv", "bcw", "bcy", "bcz", "bda", "bdb", "bdc", "bdd", "bde", "bdf", "bdg", "bdh", "bdi", "bdj", "bdk", "bdl", "bdm", "bdn", "bdo", "bdp", "bdq", "bdr", "bds", "bdt", "bdu", "bdv", "bdw", "bdx", "bdy", "bdz", "bea", "beb", "bec", "bed", "bee", "bef", "beg", "beh", "bei", "bej", "bek", "bem", "beo", "bep", "beq", "ber", "bes", "bet", "beu", "bev", "bew", "bex", "bey", "bez", "bfa", "bfb", "bfc", "bfd", "bfe", "bff", "bfg", "bfh", "bfi", "bfj", "bfk", "bfl", "bfm", "bfn", "bfo", "bfp", "bfq", "bfr", "bfs", "bft", "bfu", "bfw", "bfx", "bfy", "bfz", "bga", "bgb", "bgc", "bgd", "bge", "bgf", "bgg", "bgi", "bgj", "bgk", "bgl", "bgm", "bgn", "bgo", "bgp", "bgq", "bgr", "bgs", "bgt", "bgu", "bgv", "bgw", "bgx", "bgy", "bgz", "bha", "bhb", "bhc", "bhd", "bhe", "bhf", "bhg", "bhh", "bhi", "bhj", "bhk", "bhl", "bhm", "bhn", "bho", "bhp", "bhq", "bhr", "bhs", "bht", "bhu", "bhv", "bhw", "bhx", "bhy", "bhz", "bia", "bib", "bic", "bid", "bie", "bif", "big", "bij", "bik", "bil", "bim", "bin", "bio", "bip", "biq", "bir", "bit", "biu", "biv", "biw", "bix", "biy", "biz", "bja", "bjb", "bjc", "bjd", "bje", "bjf", "bjg", "bjh", "bji", "bjj", "bjk", "bjl", "bjm", "bjn", "bjo", "bjp", "bjq", "bjr", "bjs", "bjt", "bju", "bjv", "bjw", "bjx", "bjy", "bjz", "bka", "bkb", "bkc", "bkd", "bkf", "bkg", "bkh", "bki", "bkj", "bkk", "bkl", "bkm", "bkn", "bko", "bkp", "bkq", "bkr", "bks", "bkt", "bku", "bkv", "bkw", "bkx", "bky", "bkz", "bla", "blb", "blc", "bld", "ble", "blf", "blg", "blh", "bli", "blj", "blk", "bll", "blm", "bln", "blo", "blp", "blq", "blr", "bls", "blt", "blv", "blw", "blx", "bly", "blz", "bma", "bmb", "bmc", "bmd", "bme", "bmf", "bmg", "bmh", "bmi", "bmj", "bmk", "bml", "bmm", "bmn", "bmo", "bmp", "bmq", "bmr", "bms", "bmt", "bmu", "bmv", "bmw", "bmx", "bmy", "bmz", "bna", "bnb", "bnc", "bnd", "bne", "bnf", "bng", "bni", "bnj", "bnk", "bnl", "bnm", "bnn", "bno", "bnp", "bnq", "bnr", "bns", "bnt", "bnu", "bnv", "bnw", "bnx", "bny", "bnz", "boa", "bob", "boe", "bof", "bog", "boh", "boi", "boj", "bok", "bol", "bom", "bon", "boo", "bop", "boq", "bor", "bot", "bou", "bov", "bow", "box", "boy", "boz", "bpa", "bpb", "bpd", "bpe", "bpg", "bph", "bpi", "bpj", "bpk", "bpl", "bpm", "bpn", "bpo", "bpp", "bpq", "bpr", "bps", "bpt", "bpu", "bpv", "bpw", "bpx", "bpy", "bpz", "bqa", "bqb", "bqc", "bqd", "bqf", "bqg", "bqh", "bqi", "bqj", "bqk", "bql", "bqm", "bqn", "bqo", "bqp", "bqq", "bqr", "bqs", "bqt", "bqu", "bqv", "bqw", "bqx", "bqy", "bqz", "bra", "brb", "brc", "brd", "brf", "brg", "brh", "bri", "brj", "brk", "brl", "brm", "brn", "bro", "brp", "brq", "brr", "brs", "brt", "bru", "brv", "brw", "brx", "bry", "brz", "bsa", "bsb", "bsc", "bse", "bsf", "bsg", "bsh", "bsi", "bsj", "bsk", "bsl", "bsm", "bsn", "bso", "bsp", "bsq", "bsr", "bss", "bst", "bsu", "bsv", "bsw", "bsx", "bsy", "bta", "btb", "btc", "btd", "bte", "btf", "btg", "bth", "bti", "btj", "btk", "btl", "btm", "btn", "bto", "btp", "btq", "btr", "bts", "btt", "btu", "btv", "btw", "btx", "bty", "btz", "bua", "bub", "buc", "bud", "bue", "buf", "bug", "buh", "bui", "buj", "buk", "bum", "bun", "buo", "bup", "buq", "bus", "but", "buu", "buv", "buw", "bux", "buy", "buz", "bva", "bvb", "bvc", "bvd", "bve", "bvf", "bvg", "bvh", "bvi", "bvj", "bvk", "bvl", "bvm", "bvn", "bvo", "bvp", "bvq", "bvr", "bvt", "bvu", "bvv", "bvw", "bvx", "bvy", "bvz", "bwa", "bwb", "bwc", "bwd", "bwe", "bwf", "bwg", "bwh", "bwi", "bwj", "bwk", "bwl", "bwm", "bwn", "bwo", "bwp", "bwq", "bwr", "bws", "bwt", "bwu", "bww", "bwx", "bwy", "bwz", "bxa", "bxb", "bxc", "bxd", "bxe", "bxf", "bxg", "bxh", "bxi", "bxj", "bxk", "bxl", "bxm", "bxn", "bxo", "bxp", "bxq", "bxr", "bxs", "bxu", "bxv", "bxw", "bxx", "bxz", "bya", "byb", "byc", "byd", "bye", "byf", "byg", "byh", "byi", "byj", "byk", "byl", "bym", "byn", "byo", "byp", "byq", "byr", "bys", "byt", "byv", "byw", "byx", "byy", "byz", "bza", "bzb", "bzc", "bzd", "bze", "bzf", "bzg", "bzh", "bzi", "bzj", "bzk", "bzl", "bzm", "bzn", "bzo", "bzp", "bzq", "bzr", "bzs", "bzt", "bzu", "bzv", "bzw", "bzx", "bzy", "bzz"], + ["ca", "ce", "ch", "co", "cr", "cs", "cu", "cv", "cy", "caa", "cab", "cac", "cad", "cae", "caf", "cag", "cah", "cai", "caj", "cak", "cal", "cam", "can", "cao", "cap", "caq", "car", "cas", "cau", "cav", "caw", "cax", "cay", "caz", "cba", "cbb", "cbc", "cbd", "cbe", "cbg", "cbh", "cbi", "cbj", "cbk", "cbl", "cbn", "cbo", "cbq", "cbr", "cbs", "cbt", "cbu", "cbv", "cbw", "cby", "cca", "ccc", "ccd", "cce", "ccg", "cch", "ccj", "ccl", "ccm", "ccn", "cco", "ccp", "ccq", "ccr", "ccs", "cda", "cdc", "cdd", "cde", "cdf", "cdg", "cdh", "cdi", "cdj", "cdm", "cdn", "cdo", "cdr", "cds", "cdy", "cdz", "cea", "ceb", "ceg", "cek", "cel", "cen", "cet", "cey", "cfa", "cfd", "cfg", "cfm", "cga", "cgc", "cgg", "cgk", "chb", "chc", "chd", "chf", "chg", "chh", "chj", "chk", "chl", "chm", "chn", "cho", "chp", "chq", "chr", "cht", "chw", "chx", "chy", "chz", "cia", "cib", "cic", "cid", "cie", "cih", "cik", "cim", "cin", "cip", "cir", "ciw", "ciy", "cja", "cje", "cjh", "cji", "cjk", "cjm", "cjn", "cjo", "cjp", "cjr", "cjs", "cjv", "cjy", "cka", "ckb", "ckh", "ckl", "ckm", "ckn", "cko", "ckq", "ckr", "cks", "ckt", "cku", "ckv", "ckx", "cky", "ckz", "cla", "clc", "cld", "cle", "clh", "cli", "clj", "clk", "cll", "clm", "clo", "clt", "clu", "clw", "cly", "cma", "cmc", "cme", "cmg", "cmi", "cmk", "cml", "cmm", "cmn", "cmo", "cmr", "cms", "cmt", "cna", "cnb", "cnc", "cng", "cnh", "cni", "cnk", "cnl", "cno", "cnp", "cnr", "cns", "cnt", "cnu", "cnw", "cnx", "coa", "cob", "coc", "cod", "coe", "cof", "cog", "coh", "coj", "cok", "col", "com", "con", "coo", "cop", "coq", "cot", "cou", "cov", "cow", "cox", "coy", "coz", "cpa", "cpb", "cpc", "cpe", "cpf", "cpg", "cpi", "cpn", "cpo", "cpp", "cps", "cpu", "cpx", "cpy", "cqd", "cqu", "cra", "crb", "crc", "crd", "crf", "crg", "crh", "cri", "crj", "crk", "crl", "crm", "crn", "cro", "crp", "crq", "crr", "crs", "crt", "crv", "crw", "crx", "cry", "crz", "csa", "csb", "csc", "csd", "cse", "csf", "csg", "csh", "csi", "csj", "csk", "csl", "csm", "csn", "cso", "csp", "csq", "csr", "css", "cst", "csu", "csv", "csw", "csx", "csy", "csz", "cta", "ctc", "ctd", "cte", "ctg", "cth", "ctl", "ctm", "ctn", "cto", "ctp", "cts", "ctt", "ctu", "cty", "ctz", "cua", "cub", "cuc", "cug", "cuh", "cui", "cuj", "cuk", "cul", "cum", "cuo", "cup", "cuq", "cur", "cus", "cut", "cuu", "cuv", "cuw", "cux", "cuy", "cvg", "cvn", "cwa", "cwb", "cwd", "cwe", "cwg", "cwt", "cya", "cyb", "cyo", "czh", "czk", "czn", "czo", "czt"], + ["da", "de", "dv", "dz", "daa", "dac", "dad", "dae", "daf", "dag", "dah", "dai", "daj", "dak", "dal", "dam", "dao", "dap", "daq", "dar", "das", "dau", "dav", "daw", "dax", "day", "daz", "dba", "dbb", "dbd", "dbe", "dbf", "dbg", "dbi", "dbj", "dbl", "dbm", "dbn", "dbo", "dbp", "dbq", "dbr", "dbt", "dbu", "dbv", "dbw", "dby", "dcc", "dcr", "dda", "ddd", "dde", "ddg", "ddi", "ddj", "ddn", "ddo", "ddr", "dds", "ddw", "dec", "ded", "dee", "def", "deg", "deh", "dei", "dek", "del", "dem", "den", "dep", "deq", "der", "des", "dev", "dez", "dga", "dgb", "dgc", "dgd", "dge", "dgg", "dgh", "dgi", "dgk", "dgl", "dgn", "dgo", "dgr", "dgs", "dgt", "dgu", "dgw", "dgx", "dgz", "dha", "dhd", "dhg", "dhi", "dhl", "dhm", "dhn", "dho", "dhr", "dhs", "dhu", "dhv", "dhw", "dhx", "dia", "dib", "dic", "did", "dif", "dig", "dih", "dii", "dij", "dik", "dil", "dim", "din", "dio", "dip", "diq", "dir", "dis", "dit", "diu", "diw", "dix", "diy", "diz", "dja", "djb", "djc", "djd", "dje", "djf", "dji", "djj", "djk", "djl", "djm", "djn", "djo", "djr", "dju", "djw", "dka", "dkg", "dkk", "dkl", "dkr", "dks", "dkx", "dlg", "dlk", "dlm", "dln", "dma", "dmb", "dmc", "dmd", "dme", "dmf", "dmg", "dmk", "dml", "dmm", "dmn", "dmo", "dmr", "dms", "dmu", "dmv", "dmw", "dmx", "dmy", "dna", "dnd", "dne", "dng", "dni", "dnj", "dnk", "dnn", "dno", "dnr", "dnt", "dnu", "dnv", "dnw", "dny", "doa", "dob", "doc", "doe", "dof", "doh", "doi", "dok", "dol", "don", "doo", "dop", "doq", "dor", "dos", "dot", "dov", "dow", "dox", "doy", "doz", "dpp", "dra", "drb", "drc", "drd", "dre", "drg", "drh", "dri", "drl", "drn", "dro", "drq", "drr", "drs", "drt", "dru", "drw", "dry", "dsb", "dse", "dsh", "dsi", "dsl", "dsn", "dso", "dsq", "dta", "dtb", "dtd", "dth", "dti", "dtk", "dtm", "dtn", "dto", "dtp", "dtr", "dts", "dtt", "dtu", "dty", "dua", "dub", "duc", "dud", "due", "duf", "dug", "duh", "dui", "duj", "duk", "dul", "dum", "dun", "duo", "dup", "duq", "dur", "dus", "duu", "duv", "duw", "dux", "duy", "duz", "dva", "dwa", "dwk", "dwl", "dwr", "dws", "dwu", "dww", "dwy", "dwz", "dya", "dyb", "dyd", "dyg", "dyi", "dym", "dyn", "dyo", "dyu", "dyy", "dza", "dzd", "dze", "dzg", "dzl", "dzn"], + ["ee", "el", "en", "eo", "es", "et", "eu", "eaa", "ebc", "ebg", "ebk", "ebo", "ebr", "ebu", "ecr", "ecs", "ecy", "eee", "efa", "efe", "efi", "ega", "egl", "ego", "egx", "egy", "ehs", "ehu", "eip", "eit", "eiv", "eja", "eka", "ekc", "eke", "ekg", "eki", "ekk", "ekl", "ekm", "eko", "ekp", "ekr", "eky", "ele", "elh", "eli", "elk", "elm", "elo", "elp", "elu", "elx", "ema", "emb", "eme", "emg", "emi", "emk", "emm", "emn", "emo", "emp", "emq", "ems", "emu", "emw", "emx", "emy", "emz", "ena", "enb", "enc", "end", "enf", "enh", "enl", "enm", "enn", "eno", "enq", "enr", "enu", "env", "enw", "enx", "eot", "epi", "era", "erg", "erh", "eri", "erk", "ero", "err", "ers", "ert", "erw", "ese", "esg", "esh", "esi", "esk", "esl", "esm", "esn", "eso", "esq", "ess", "esu", "esx", "esy", "etb", "etc", "eth", "etn", "eto", "etr", "ets", "ett", "etu", "etx", "etz", "euq", "eve", "evh", "evn", "ewo", "ext", "eya", "eyo", "eza", "eze"], + ["fa", "ff", "fi", "fj", "fo", "fr", "fy", "faa", "fab", "fad", "faf", "fag", "fah", "fai", "faj", "fak", "fal", "fam", "fan", "fap", "far", "fat", "fau", "fax", "fay", "faz", "fbl", "fcs", "fer", "ffi", "ffm", "fgr", "fia", "fie", "fif", "fil", "fip", "fir", "fit", "fiu", "fiw", "fkk", "fkv", "fla", "flh", "fli", "fll", "fln", "flr", "fly", "fmp", "fmu", "fnb", "fng", "fni", "fod", "foi", "fom", "fon", "for", "fos", "fox", "fpe", "fqs", "frc", "frd", "frk", "frm", "fro", "frp", "frq", "frr", "frs", "frt", "fse", "fsl", "fss", "fub", "fuc", "fud", "fue", "fuf", "fuh", "fui", "fuj", "fum", "fun", "fuq", "fur", "fut", "fuu", "fuv", "fuy", "fvr", "fwa", "fwe"], + ["ga", "gd", "gl", "gn", "gu", "gv", "gaa", "gab", "gac", "gad", "gae", "gaf", "gag", "gah", "gai", "gaj", "gak", "gal", "gam", "gan", "gao", "gap", "gaq", "gar", "gas", "gat", "gau", "gav", "gaw", "gax", "gay", "gaz", "gba", "gbb", "gbc", "gbd", "gbe", "gbf", "gbg", "gbh", "gbi", "gbj", "gbk", "gbl", "gbm", "gbn", "gbo", "gbp", "gbq", "gbr", "gbs", "gbu", "gbv", "gbw", "gbx", "gby", "gbz", "gcc", "gcd", "gce", "gcf", "gcl", "gcn", "gcr", "gct", "gda", "gdb", "gdc", "gdd", "gde", "gdf", "gdg", "gdh", "gdi", "gdj", "gdk", "gdl", "gdm", "gdn", "gdo", "gdq", "gdr", "gds", "gdt", "gdu", "gdx", "gea", "geb", "gec", "ged", "gef", "geg", "geh", "gei", "gej", "gek", "gel", "gem", "geq", "ges", "gev", "gew", "gex", "gey", "gez", "gfk", "gft", "gfx", "gga", "ggb", "ggd", "gge", "ggg", "ggk", "ggl", "ggn", "ggo", "ggr", "ggt", "ggu", "ggw", "gha", "ghc", "ghe", "ghh", "ghk", "ghl", "ghn", "gho", "ghr", "ghs", "ght", "gia", "gib", "gic", "gid", "gie", "gig", "gih", "gii", "gil", "gim", "gin", "gio", "gip", "giq", "gir", "gis", "git", "giu", "giw", "gix", "giy", "giz", "gji", "gjk", "gjm", "gjn", "gjr", "gju", "gka", "gkd", "gke", "gkn", "gko", "gkp", "gku", "glb", "glc", "gld", "glh", "gli", "glj", "glk", "gll", "glo", "glr", "glu", "glw", "gly", "gma", "gmb", "gmd", "gme", "gmg", "gmh", "gml", "gmm", "gmn", "gmq", "gmr", "gmu", "gmv", "gmw", "gmx", "gmy", "gmz", "gna", "gnb", "gnc", "gnd", "gne", "gng", "gnh", "gni", "gnj", "gnk", "gnl", "gnm", "gnn", "gno", "gnq", "gnr", "gnt", "gnu", "gnw", "gnz", "goa", "gob", "goc", "god", "goe", "gof", "gog", "goh", "goi", "goj", "gok", "gol", "gom", "gon", "goo", "gop", "goq", "gor", "gos", "got", "gou", "gow", "gox", "goy", "goz", "gpa", "gpe", "gpn", "gqa", "gqi", "gqn", "gqr", "gqu", "gra", "grb", "grc", "grd", "grg", "grh", "gri", "grj", "grk", "grm", "gro", "grq", "grr", "grs", "grt", "gru", "grv", "grw", "grx", "gry", "grz", "gse", "gsg", "gsl", "gsm", "gsn", "gso", "gsp", "gss", "gsw", "gta", "gti", "gtu", "gua", "gub", "guc", "gud", "gue", "guf", "gug", "guh", "gui", "guk", "gul", "gum", "gun", "guo", "gup", "guq", "gur", "gus", "gut", "guu", "guv", "guw", "gux", "guz", "gva", "gvc", "gve", "gvf", "gvj", "gvl", "gvm", "gvn", "gvo", "gvp", "gvr", "gvs", "gvy", "gwa", "gwb", "gwc", "gwd", "gwe", "gwf", "gwg", "gwi", "gwj", "gwm", "gwn", "gwr", "gwt", "gwu", "gww", "gwx", "gxx", "gya", "gyb", "gyd", "gye", "gyf", "gyg", "gyi", "gyl", "gym", "gyn", "gyo", "gyr", "gyy", "gyz", "gza", "gzi", "gzn"], + ["ha", "he", "hi", "ho", "hr", "ht", "hu", "hy", "hz", "haa", "hab", "hac", "had", "hae", "haf", "hag", "hah", "hai", "haj", "hak", "hal", "ham", "han", "hao", "hap", "haq", "har", "has", "hav", "haw", "hax", "hay", "haz", "hba", "hbb", "hbn", "hbo", "hbu", "hca", "hch", "hdn", "hds", "hdy", "hea", "hed", "heg", "heh", "hei", "hem", "hgm", "hgw", "hhi", "hhr", "hhy", "hia", "hib", "hid", "hif", "hig", "hih", "hii", "hij", "hik", "hil", "him", "hio", "hir", "hit", "hiw", "hix", "hji", "hka", "hke", "hkh", "hkk", "hkn", "hks", "hla", "hlb", "hld", "hle", "hlt", "hlu", "hma", "hmb", "hmc", "hmd", "hme", "hmf", "hmg", "hmh", "hmi", "hmj", "hmk", "hml", "hmm", "hmn", "hmp", "hmq", "hmr", "hms", "hmt", "hmu", "hmv", "hmw", "hmx", "hmy", "hmz", "hna", "hnd", "hne", "hng", "hnh", "hni", "hnj", "hnn", "hno", "hns", "hnu", "hoa", "hob", "hoc", "hod", "hoe", "hoh", "hoi", "hoj", "hok", "hol", "hom", "hoo", "hop", "hor", "hos", "hot", "hov", "how", "hoy", "hoz", "hpo", "hps", "hra", "hrc", "hre", "hrk", "hrm", "hro", "hrp", "hrr", "hrt", "hru", "hrw", "hrx", "hrz", "hsb", "hsh", "hsl", "hsn", "hss", "hti", "hto", "hts", "htu", "htx", "hub", "huc", "hud", "hue", "huf", "hug", "huh", "hui", "huj", "huk", "hul", "hum", "huo", "hup", "huq", "hur", "hus", "hut", "huu", "huv", "huw", "hux", "huy", "huz", "hvc", "hve", "hvk", "hvn", "hvv", "hwa", "hwc", "hwo", "hya", "hyw", "hyx"], + ["ia", "id", "ie", "ig", "ii", "ik", "in", "io", "is", "it", "iu", "iw", "iai", "ian", "iap", "iar", "iba", "ibb", "ibd", "ibe", "ibg", "ibh", "ibi", "ibl", "ibm", "ibn", "ibr", "ibu", "iby", "ica", "ich", "icl", "icr", "ida", "idb", "idc", "idd", "ide", "idi", "idr", "ids", "idt", "idu", "ifa", "ifb", "ife", "iff", "ifk", "ifm", "ifu", "ify", "igb", "ige", "igg", "igl", "igm", "ign", "igo", "igs", "igw", "ihb", "ihi", "ihp", "ihw", "iin", "iir", "ijc", "ije", "ijj", "ijn", "ijo", "ijs", "ike", "iki", "ikk", "ikl", "iko", "ikp", "ikr", "iks", "ikt", "ikv", "ikw", "ikx", "ikz", "ila", "ilb", "ilg", "ili", "ilk", "ill", "ilm", "ilo", "ilp", "ils", "ilu", "ilv", "ilw", "ima", "ime", "imi", "iml", "imn", "imo", "imr", "ims", "imy", "inb", "inc", "ine", "ing", "inh", "inj", "inl", "inm", "inn", "ino", "inp", "ins", "int", "inz", "ior", "iou", "iow", "ipi", "ipo", "iqu", "iqw", "ira", "ire", "irh", "iri", "irk", "irn", "iro", "irr", "iru", "irx", "iry", "isa", "isc", "isd", "ise", "isg", "ish", "isi", "isk", "ism", "isn", "iso", "isr", "ist", "isu", "itb", "itc", "itd", "ite", "iti", "itk", "itl", "itm", "ito", "itr", "its", "itt", "itv", "itw", "itx", "ity", "itz", "ium", "ivb", "ivv", "iwk", "iwm", "iwo", "iws", "ixc", "ixl", "iya", "iyo", "iyx", "izh", "izi", "izr", "izz"], + ["ja", "ji", "jv", "jw", "jaa", "jab", "jac", "jad", "jae", "jaf", "jah", "jaj", "jak", "jal", "jam", "jan", "jao", "jaq", "jar", "jas", "jat", "jau", "jax", "jay", "jaz", "jbe", "jbi", "jbj", "jbk", "jbm", "jbn", "jbo", "jbr", "jbt", "jbu", "jbw", "jcs", "jct", "jda", "jdg", "jdt", "jeb", "jee", "jeg", "jeh", "jei", "jek", "jel", "jen", "jer", "jet", "jeu", "jgb", "jge", "jgk", "jgo", "jhi", "jhs", "jia", "jib", "jic", "jid", "jie", "jig", "jih", "jii", "jil", "jim", "jio", "jiq", "jit", "jiu", "jiv", "jiy", "jje", "jjr", "jka", "jkm", "jko", "jkp", "jkr", "jks", "jku", "jle", "jls", "jma", "jmb", "jmc", "jmd", "jmi", "jml", "jmn", "jmr", "jms", "jmw", "jmx", "jna", "jnd", "jng", "jni", "jnj", "jnl", "jns", "job", "jod", "jog", "jor", "jos", "jow", "jpa", "jpr", "jpx", "jqr", "jra", "jrb", "jrr", "jrt", "jru", "jsl", "jua", "jub", "juc", "jud", "juh", "jui", "juk", "jul", "jum", "jun", "juo", "jup", "jur", "jus", "jut", "juu", "juw", "juy", "jvd", "jvn", "jwi", "jya", "jye", "jyy"], + ["ka", "kg", "ki", "kj", "kk", "kl", "km", "kn", "ko", "kr", "ks", "ku", "kv", "kw", "ky", "kaa", "kab", "kac", "kad", "kae", "kaf", "kag", "kah", "kai", "kaj", "kak", "kam", "kao", "kap", "kaq", "kar", "kav", "kaw", "kax", "kay", "kba", "kbb", "kbc", "kbd", "kbe", "kbf", "kbg", "kbh", "kbi", "kbj", "kbk", "kbl", "kbm", "kbn", "kbo", "kbp", "kbq", "kbr", "kbs", "kbt", "kbu", "kbv", "kbw", "kbx", "kby", "kbz", "kca", "kcb", "kcc", "kcd", "kce", "kcf", "kcg", "kch", "kci", "kcj", "kck", "kcl", "kcm", "kcn", "kco", "kcp", "kcq", "kcr", "kcs", "kct", "kcu", "kcv", "kcw", "kcx", "kcy", "kcz", "kda", "kdc", "kdd", "kde", "kdf", "kdg", "kdh", "kdi", "kdj", "kdk", "kdl", "kdm", "kdn", "kdo", "kdp", "kdq", "kdr", "kdt", "kdu", "kdv", "kdw", "kdx", "kdy", "kdz", "kea", "keb", "kec", "ked", "kee", "kef", "keg", "keh", "kei", "kej", "kek", "kel", "kem", "ken", "keo", "kep", "keq", "ker", "kes", "ket", "keu", "kev", "kew", "kex", "key", "kez", "kfa", "kfb", "kfc", "kfd", "kfe", "kff", "kfg", "kfh", "kfi", "kfj", "kfk", "kfl", "kfm", "kfn", "kfo", "kfp", "kfq", "kfr", "kfs", "kft", "kfu", "kfv", "kfw", "kfx", "kfy", "kfz", "kga", "kgb", "kgc", "kgd", "kge", "kgf", "kgg", "kgh", "kgi", "kgj", "kgk", "kgl", "kgm", "kgn", "kgo", "kgp", "kgq", "kgr", "kgs", "kgt", "kgu", "kgv", "kgw", "kgx", "kgy", "kha", "lyg", "khb", "khc", "khd", "khe", "khf", "khg", "khh", "khi", "khj", "khk", "khl", "khn", "kho", "khp", "khq", "khr", "khs", "kht", "khu", "khv", "khw", "khx", "khy", "khz", "kia", "kib", "kic", "kid", "kie", "kif", "kig", "kih", "kii", "kij", "kil", "kim", "kio", "kip", "kiq", "kis", "kit", "kiu", "kiv", "kiw", "kix", "kiy", "kiz", "kja", "kjb", "kjc", "kjd", "kje", "kjf", "kjg", "kjh", "kji", "kjj", "kjk", "kjl", "kjm", "kjn", "kjo", "kjp", "kjq", "kjr", "kjs", "kjt", "kju", "kjv", "kjx", "kjy", "kjz", "kka", "kkb", "kkc", "kkd", "kke", "kkf", "kkg", "kkh", "kki", "kkj", "kkk", "kkl", "kkm", "kkn", "kko", "kkp", "kkq", "kkr", "kks", "kkt", "kku", "kkv", "kkw", "kkx", "kky", "kkz", "kla", "klb", "klc", "kld", "kle", "klf", "klg", "klh", "kli", "klj", "klk", "kll", "klm", "kln", "klo", "klp", "klq", "klr", "kls", "klt", "klu", "klv", "klw", "klx", "kly", "klz", "kma", "kmb", "kmc", "kmd", "kme", "kmf", "kmg", "kmh", "kmi", "kmj", "kmk", "kml", "kmm", "kmn", "kmo", "kmp", "kmq", "kmr", "kms", "kmt", "kmu", "kmv", "kmw", "kmx", "kmy", "kmz", "kna", "knb", "knc", "knd", "kne", "knf", "kng", "kni", "knj", "knk", "knl", "knm", "knn", "kno", "knp", "knq", "knr", "kns", "knt", "knu", "knv", "knw", "knx", "kny", "knz", "koa", "koc", "kod", "koe", "kof", "kog", "koh", "koi", "koj", "kok", "kol", "koo", "kop", "koq", "kos", "kot", "kou", "kov", "kow", "kox", "koy", "koz", "kpa", "kpb", "kpc", "kpd", "kpe", "kpf", "kpg", "kph", "kpi", "kpj", "kpk", "kpl", "kpm", "kpn", "kpo", "kpp", "kpq", "kpr", "kps", "kpt", "kpu", "kpv", "kpw", "kpx", "kpy", "kpz", "kqa", "kqb", "kqc", "kqd", "kqe", "kqf", "kqg", "kqh", "kqi", "kqj", "kqk", "kql", "kqm", "kqn", "kqo", "kqp", "kqq", "kqr", "kqs", "kqt", "kqu", "kqv", "kqw", "kqx", "kqy", "kqz", "kra", "krb", "krc", "krd", "kre", "krf", "krh", "kri", "krj", "krk", "krl", "krm", "krn", "kro", "krp", "krr", "krs", "krt", "kru", "krv", "krw", "krx", "kry", "krz", "ksa", "ksb", "ksc", "ksd", "kse", "ksf", "ksg", "ksh", "ksi", "ksj", "ksk", "ksl", "ksm", "ksn", "kso", "ksp", "ksq", "ksr", "kss", "kst", "ksu", "ksv", "ksw", "ksx", "ksy", "ksz", "kta", "ktb", "ktc", "ktd", "kte", "ktf", "ktg", "kth", "kti", "ktj", "ktk", "ktl", "ktm", "ktn", "kto", "ktp", "ktq", "ktr", "kts", "ktt", "ktu", "ktv", "ktw", "ktx", "kty", "ktz", "kub", "kuc", "kud", "kue", "kuf", "kug", "kuh", "kui", "kuj", "kuk", "kul", "kum", "kun", "kuo", "kup", "kuq", "kus", "kut", "kuu", "kuv", "kuw", "kux", "kuy", "kuz", "kva", "kvb", "kvc", "kvd", "kve", "kvf", "kvg", "kvh", "kvi", "kvj", "kvk", "kvl", "kvm", "kvn", "kvo", "kvp", "kvq", "kvr", "kvs", "kvt", "kvu", "kvv", "kvw", "kvx", "kvy", "kvz", "kwa", "kwb", "kwc", "kwd", "kwe", "kwf", "kwg", "kwh", "kwi", "kwj", "kwk", "kwl", "kwm", "kwn", "kwo", "kwp", "kwq", "kwr", "kws", "kwt", "kwu", "kwv", "kww", "kwx", "kwy", "kwz", "kxa", "kxb", "kxc", "kxd", "kxe", "kxf", "kxh", "kxi", "kxj", "kxk", "kxl", "kxm", "kxn", "kxo", "kxp", "kxq", "kxr", "kxs", "kxt", "kxu", "kxv", "kxw", "kxx", "kxy", "kxz", "kya", "kyb", "kyc", "kyd", "kye", "kyf", "kyg", "kyh", "kyi", "kyj", "kyk", "kyl", "kym", "kyn", "kyo", "kyp", "kyq", "kyr", "kys", "kyt", "kyu", "kyv", "kyw", "kyx", "kyy", "kyz", "kza", "kzb", "kzc", "kzd", "kze", "kzf", "kzg", "kzh", "kzi", "kzj", "kzk", "kzl", "kzm", "kzn", "kzo", "kzp", "kzq", "kzr", "kzs", "kzt", "kzu", "kzv", "kzw", "kzx", "kzy", "kzz"], + ["la", "lb", "lg", "li", "ln", "lo", "lt", "lu", "lv", "laa", "lab", "lac", "lad", "lae", "laf", "lag", "lah", "lai", "laj", "lak", "lal", "lam", "lan", "lap", "laq", "lar", "las", "lau", "law", "lax", "lay", "laz", "lba", "lbb", "lbc", "lbe", "lbf", "lbg", "lbi", "lbj", "lbk", "lbl", "lbm", "lbn", "lbo", "lbq", "lbr", "lbs", "lbt", "lbu", "lbv", "lbw", "lbx", "lby", "lbz", "lcc", "lcd", "lce", "lcf", "lch", "lcl", "lcm", "lcp", "lcq", "lcs", "lda", "ldb", "ldd", "ldg", "ldh", "ldi", "ldj", "ldk", "ldl", "ldm", "ldn", "ldo", "ldp", "ldq", "lea", "leb", "lec", "led", "lee", "lef", "leg", "leh", "lei", "lej", "lek", "lel", "lem", "len", "leo", "lep", "leq", "ler", "les", "let", "leu", "lev", "lew", "lex", "ley", "lez", "lfa", "lfn", "lga", "lgb", "lgg", "lgh", "lgi", "lgk", "lgl", "lgm", "lgn", "lgq", "lgr", "lgt", "lgu", "lgz", "lha", "lhh", "lhi", "lhl", "lhm", "lhn", "lhp", "lhs", "lht", "lhu", "lia", "lib", "lic", "lid", "lie", "lif", "lig", "lih", "lii", "lij", "lik", "lil", "lio", "lip", "liq", "lir", "lis", "liu", "liv", "liw", "lix", "liy", "liz", "lja", "lje", "lji", "ljl", "ljp", "ljw", "ljx", "lka", "lkb", "lkc", "lkd", "lke", "lkh", "lki", "lkj", "lkl", "lkm", "lkn", "lko", "lkr", "lks", "lkt", "lku", "lky", "lla", "llb", "llc", "lld", "lle", "llf", "llg", "llh", "lli", "llj", "llk", "lll", "llm", "lln", "llo", "llp", "llq", "lls", "llu", "llx", "lma", "lmb", "lmc", "lmd", "lme", "lmf", "lmg", "lmh", "lmi", "lmj", "lmk", "lml", "lmm", "lmn", "lmo", "lmp", "lmq", "lmr", "lmu", "lmv", "lmw", "lmx", "lmy", "lmz", "lna", "lnb", "lnd", "lng", "lnh", "lni", "lnj", "lnl", "lnm", "lnn", "lno", "lns", "lnu", "lnw", "lnz", "loa", "lob", "loc", "loe", "lof", "log", "loh", "loi", "loj", "lok", "lol", "lom", "lon", "loo", "lop", "loq", "lor", "los", "lot", "lou", "lov", "low", "lox", "loy", "loz", "lpa", "lpe", "lpn", "lpo", "lpx", "lra", "lrc", "lre", "lrg", "lri", "lrk", "lrl", "lrm", "lrn", "lro", "lrr", "lrt", "lrv", "lrz", "lsa", "lsb", "lsd", "lse", "lsg", "lsh", "lsi", "lsl", "lsm", "lsn", "lso", "lsp", "lsr", "lss", "lst", "lsv", "lsy", "ltc", "ltg", "lth", "lti", "ltn", "lto", "lts", "ltu", "lua", "luc", "lud", "lue", "luf", "lui", "luj", "luk", "lul", "lum", "lun", "luo", "lup", "luq", "lur", "lus", "lut", "luu", "luv", "luw", "luy", "luz", "lva", "lvi", "lvk", "lvs", "lvu", "lwa", "lwe", "lwg", "lwh", "lwl", "lwm", "lwo", "lws", "lwt", "lwu", "lww", "lxm", "lya", "lyg", "lyn", "lzh", "lzl", "lzn", "lzz"], + ["mg", "mh", "mi", "mk", "ml", "mn", "mo", "mr", "ms", "mt", "my", "maa", "mab", "mad", "mae", "maf", "mag", "mai", "maj", "mak", "mam", "man", "map", "maq", "mas", "mat", "mau", "mav", "maw", "max", "maz", "mba", "mbb", "mbc", "mbd", "mbe", "mbf", "mbh", "mbi", "mbj", "mbk", "mbl", "mbm", "mbn", "mbo", "mbp", "mbq", "mbr", "mbs", "mbt", "mbu", "mbv", "mbw", "mbx", "mby", "mbz", "mca", "mcb", "mcc", "mcd", "mce", "mcf", "mcg", "mch", "mci", "mcj", "mck", "mcl", "mcm", "mcn", "mco", "mcp", "mcq", "mcr", "mcs", "mct", "mcu", "mcv", "mcw", "mcx", "mcy", "mcz", "mda", "mdb", "mdc", "mdd", "mde", "mdf", "mdg", "mdh", "mdi", "mdj", "mdk", "mdl", "mdm", "mdn", "mdp", "mdq", "mdr", "mds", "mdt", "mdu", "mdv", "mdw", "mdx", "mdy", "mdz", "mea", "meb", "mec", "med", "mee", "mef", "meg", "meh", "mei", "mej", "mek", "mel", "mem", "men", "meo", "mep", "meq", "mer", "mes", "met", "meu", "mev", "mew", "mey", "mez", "mfa", "mfb", "mfc", "mfd", "mfe", "mff", "mfg", "mfh", "mfi", "mfj", "mfk", "mfl", "mfm", "mfn", "mfo", "mfp", "mfq", "mfr", "mfs", "mft", "mfu", "mfv", "mfw", "mfx", "mfy", "mfz", "mga", "mgb", "mgc", "mgd", "mge", "mgf", "mgg", "mgh", "mgi", "mgj", "mgk", "mgl", "mgm", "mgn", "mgo", "mgp", "mgq", "mgr", "mgs", "mgt", "mgu", "mgv", "mgw", "mgx", "mgy", "mgz", "mha", "mhb", "mhc", "mhd", "mhe", "mhf", "mhg", "mhh", "mhi", "mhj", "mhk", "mhl", "mhm", "mhn", "mho", "mhp", "mhq", "mhr", "mhs", "mht", "mhu", "mhw", "mhx", "mhy", "mhz", "mia", "mib", "mic", "mid", "mie", "mif", "mig", "mih", "mii", "mij", "mik", "mil", "mim", "min", "mio", "mip", "miq", "mir", "mis", "mit", "miu", "miw", "mix", "miy", "miz", "mja", "mjb", "mjc", "mjd", "mje", "mjg", "mjh", "mji", "mjj", "mjk", "mjl", "mjm", "mjn", "mjo", "mjp", "mjq", "mjr", "mjs", "mjt", "mju", "mjv", "mjw", "mjx", "mjy", "mjz", "mka", "mkb", "mkc", "mke", "mkf", "mkg", "mkh", "mki", "mkj", "mkk", "mkl", "mkm", "mkn", "mko", "mkp", "mkq", "mkr", "mks", "mkt", "mku", "mkv", "mkw", "mkx", "mky", "mkz", "mla", "mlb", "mlc", "mld", "mle", "mlf", "mlh", "mli", "mlj", "mlk", "mll", "mlm", "mln", "mlo", "mlp", "mlq", "mlr", "mls", "mlu", "mlv", "mlw", "mlx", "mlz", "mma", "mmb", "mmc", "mmd", "mme", "mmf", "mmg", "mmh", "mmi", "mmj", "mmk", "mml", "mmm", "mmn", "mmo", "mmp", "mmq", "mmr", "mmt", "mmu", "mmv", "mmw", "mmx", "mmy", "mmz", "mna", "mnb", "mnc", "mnd", "mne", "mnf", "mng", "mnh", "mni", "mnj", "mnk", "mnl", "mnm", "mnn", "mno", "mnp", "mnq", "mnr", "mns", "mnt", "mnu", "mnv", "mnw", "mnx", "mny", "mnz", "moa", "moc", "mod", "moe", "mof", "mog", "moh", "moi", "moj", "mok", "mom", "moo", "mop", "moq", "mor", "mos", "mot", "mou", "mov", "mow", "mox", "moy", "moz", "mpa", "mpb", "mpc", "mpd", "mpe", "mpg", "mph", "mpi", "mpj", "mpk", "mpl", "mpm", "mpn", "mpo", "mpp", "mpq", "mpr", "mps", "mpt", "mpu", "mpv", "mpw", "mpx", "mpy", "mpz", "mqa", "mqb", "mqc", "mqe", "mqf", "mqg", "mqh", "mqi", "mqj", "mqk", "mql", "mqm", "mqn", "mqo", "mqp", "mqq", "mqr", "mqs", "mqt", "mqu", "mqv", "mqw", "mqx", "mqy", "mqz", "mra", "mrb", "mrc", "mrd", "mre", "mrf", "mrg", "mrh", "mrj", "mrk", "mrl", "mrm", "mrn", "mro", "mrp", "mrq", "mrr", "mrs", "mrt", "mru", "mrv", "mrw", "mrx", "mry", "mrz", "msb", "msc", "msd", "mse", "msf", "msg", "msh", "msi", "msj", "msk", "msl", "msm", "msn", "mso", "msp", "msq", "msr", "mss", "mst", "msu", "msv", "msw", "msx", "msy", "msz", "mta", "mtb", "mtc", "mtd", "mte", "mtf", "mtg", "mth", "mti", "mtj", "mtk", "mtl", "mtm", "mtn", "mto", "mtp", "mtq", "mtr", "mts", "mtt", "mtu", "mtv", "mtw", "mtx", "mty", "mua", "mub", "muc", "mud", "mue", "mug", "muh", "mui", "muj", "muk", "mul", "mum", "mun", "muo", "mup", "muq", "mur", "mus", "mut", "muu", "muv", "mux", "muy", "muz", "mva", "mvb", "mvd", "mve", "mvf", "mvg", "mvh", "mvi", "mvk", "mvl", "mvm", "mvn", "mvo", "mvp", "mvq", "mvr", "mvs", "mvt", "mvu", "mvv", "mvw", "mvx", "mvy", "mvz", "mwa", "mwb", "mwc", "mwd", "mwe", "mwf", "mwg", "mwh", "mwi", "mwj", "mwk", "mwl", "mwm", "mwn", "mwo", "mwp", "mwq", "mwr", "mws", "mwt", "mwu", "mwv", "mww", "mwx", "mwy", "mwz", "mxa", "mxb", "mxc", "mxd", "mxe", "mxf", "mxg", "mxh", "mxi", "mxj", "mxk", "mxl", "mxm", "mxn", "mxo", "mxp", "mxq", "mxr", "mxs", "mxt", "mxu", "mxv", "mxw", "mxx", "mxy", "mxz", "myb", "myc", "myd", "mye", "myf", "myg", "myh", "myi", "myj", "myk", "myl", "mym", "myn", "myo", "myp", "myq", "myr", "mys", "myt", "myu", "myv", "myw", "myx", "myy", "myz", "mza", "mzb", "mzc", "mzd", "mze", "mzg", "mzh", "mzi", "mzj", "mzk", "mzl", "mzm", "mzn", "mzo", "mzp", "mzq", "mzr", "mzs", "mzt", "mzu", "mzv", "mzw", "mzx", "mzy", "mzz"], + ["na", "nb", "nd", "ne", "ng", "nl", "nn", "no", "nr", "nv", "ny", "naa", "nab", "nac", "nad", "nae", "naf", "nag", "nah", "nai", "naj", "nak", "nal", "nam", "nan", "nao", "nap", "naq", "nar", "nas", "nat", "naw", "nax", "nay", "naz", "nba", "nbb", "nbc", "nbd", "nbe", "nbf", "nbg", "nbh", "nbi", "nbj", "nbk", "nbm", "nbn", "nbo", "nbp", "nbq", "nbr", "nbs", "nbt", "nbu", "nbv", "nbw", "nbx", "nby", "nca", "ncb", "ncc", "ncd", "nce", "ncf", "ncg", "nch", "nci", "ncj", "nck", "ncl", "ncm", "ncn", "nco", "ncp", "ncq", "ncr", "ncs", "nct", "ncu", "ncx", "ncz", "nda", "ndb", "ndc", "ndd", "ndf", "ndg", "ndh", "ndi", "ndj", "ndk", "ndl", "ndm", "ndn", "ndp", "ndq", "ndr", "nds", "ndt", "ndu", "ndv", "ndw", "ndx", "ndy", "ndz", "nea", "neb", "nec", "ned", "nee", "nef", "neg", "neh", "nei", "nej", "nek", "nem", "nen", "neo", "neq", "ner", "nes", "net", "neu", "nev", "new", "nex", "ney", "nez", "nfa", "nfd", "nfl", "nfr", "nfu", "nga", "ngb", "ngc", "ngd", "nge", "ngf", "ngg", "ngh", "ngi", "ngj", "ngk", "ngl", "ngm", "ngn", "ngo", "ngp", "ngq", "ngr", "ngs", "ngt", "ngu", "ngv", "ngw", "ngx", "ngy", "ngz", "nha", "nhb", "nhc", "nhd", "nhe", "nhf", "nhg", "nhh", "nhi", "nhk", "nhm", "nhn", "nho", "nhp", "nhq", "nhr", "nht", "nhu", "nhv", "nhw", "nhx", "nhy", "nhz", "nia", "nib", "nic", "nid", "nie", "nif", "nig", "nih", "nii", "nij", "nik", "nil", "nim", "nin", "nio", "niq", "nir", "nis", "nit", "niu", "niv", "niw", "nix", "niy", "niz", "nja", "njb", "njd", "njh", "nji", "njj", "njl", "njm", "njn", "njo", "njr", "njs", "njt", "nju", "njx", "njy", "njz", "nka", "nkb", "nkc", "nkd", "nke", "nkf", "nkg", "nkh", "nki", "nkj", "nkk", "nkm", "nkn", "nko", "nkp", "nkq", "nkr", "nks", "nkt", "nku", "nkv", "nkw", "nkx", "nkz", "nla", "nlc", "nle", "nlg", "nli", "nlj", "nlk", "nll", "nlm", "nln", "nlo", "nlq", "nlr", "nlu", "nlv", "nlw", "nlx", "nly", "nlz", "nma", "nmb", "nmc", "nmd", "nme", "nmf", "nmg", "nmh", "nmi", "nmj", "nmk", "nml", "nmm", "nmn", "nmo", "nmp", "nmq", "nmr", "nms", "nmt", "nmu", "nmv", "nmw", "nmx", "nmy", "nmz", "nna", "nnb", "nnc", "nnd", "nne", "nnf", "nng", "nnh", "nni", "nnj", "nnk", "nnl", "nnm", "nnn", "nnp", "nnq", "nnr", "nns", "nnt", "nnu", "nnv", "nnw", "nnx", "nny", "nnz", "noa", "noc", "nod", "noe", "nof", "nog", "noh", "noi", "noj", "nok", "nol", "nom", "non", "noo", "nop", "noq", "nos", "not", "nou", "nov", "now", "noy", "noz", "npa", "npb", "npg", "nph", "npi", "npl", "npn", "npo", "nps", "npu", "npx", "npy", "nqg", "nqk", "nql", "nqm", "nqn", "nqo", "nqq", "nqt", "nqy", "nra", "nrb", "nrc", "nre", "nrf", "nrg", "nri", "nrk", "nrl", "nrm", "nrn", "nrp", "nrr", "nrt", "nru", "nrx", "nrz", "nsa", "nsb", "nsc", "nsd", "nse", "nsf", "nsg", "nsh", "nsi", "nsk", "nsl", "nsm", "nsn", "nso", "nsp", "nsq", "nsr", "nss", "nst", "nsu", "nsv", "nsw", "nsx", "nsy", "nsz", "ntd", "nte", "ntg", "nti", "ntj", "ntk", "ntm", "nto", "ntp", "ntr", "nts", "ntu", "ntw", "ntx", "nty", "ntz", "nua", "nub", "nuc", "nud", "nue", "nuf", "nug", "nuh", "nui", "nuj", "nuk", "nul", "num", "nun", "nuo", "nup", "nuq", "nur", "nus", "nut", "nuu", "nuv", "nuw", "nux", "nuy", "nuz", "nvh", "nvm", "nvo", "nwa", "nwb", "nwc", "nwe", "nwg", "nwi", "nwm", "nwo", "nwr", "nwx", "nwy", "nxa", "nxd", "nxe", "nxg", "nxi", "nxk", "nxl", "nxm", "nxn", "nxo", "nxq", "nxr", "nxu", "nxx", "nyb", "nyc", "nyd", "nye", "nyf", "nyg", "nyh", "nyi", "nyj", "nyk", "nyl", "nym", "nyn", "nyo", "nyp", "nyq", "nyr", "nys", "nyt", "nyu", "nyv", "nyw", "nyx", "nyy", "nza", "nzb", "nzd", "nzi", "nzk", "nzm", "nzs", "nzu", "nzy", "nzz"], + ["oc", "oj", "om", "or", "os", "oaa", "oac", "oar", "oav", "obi", "obk", "obl", "obm", "obo", "obr", "obt", "obu", "oca", "och", "ocm", "oco", "ocu", "oda", "odk", "odt", "odu", "ofo", "ofs", "ofu", "ogb", "ogc", "oge", "ogg", "ogo", "ogu", "oht", "ohu", "oia", "oin", "ojb", "ojc", "ojg", "ojp", "ojs", "ojv", "ojw", "oka", "okb", "okc", "okd", "oke", "okg", "okh", "oki", "okj", "okk", "okl", "okm", "okn", "oko", "okr", "oks", "oku", "okv", "okx", "okz", "ola", "old", "ole", "olk", "olm", "olo", "olr", "olt", "olu", "oma", "omb", "omc", "ome", "omg", "omi", "omk", "oml", "omn", "omo", "omp", "omq", "omr", "omt", "omu", "omv", "omw", "omx", "omy", "ona", "onb", "one", "ong", "oni", "onj", "onk", "onn", "ono", "onp", "onr", "ons", "ont", "onu", "onw", "onx", "ood", "oog", "oon", "oor", "oos", "opa", "opk", "opm", "opo", "opt", "opy", "ora", "orc", "ore", "org", "orh", "orn", "oro", "orr", "ors", "ort", "oru", "orv", "orw", "orx", "ory", "orz", "osa", "osc", "osi", "osn", "oso", "osp", "ost", "osu", "osx", "ota", "otb", "otd", "ote", "oti", "otk", "otl", "otm", "otn", "oto", "otq", "otr", "ots", "ott", "otu", "otw", "otx", "oty", "otz", "oua", "oub", "oue", "oui", "oum", "oun", "ovd", "owi", "owl", "oyb", "oyd", "oym", "oyy", "ozm"], + ["pa", "pi", "pl", "ps", "pt", "paa", "pab", "pac", "pad", "pae", "paf", "pag", "pah", "pai", "pak", "pal", "pam", "pao", "pap", "paq", "par", "pas", "pat", "pau", "pav", "paw", "pax", "pay", "paz", "pbb", "pbc", "pbe", "pbf", "pbg", "pbh", "pbi", "pbl", "pbm", "pbn", "pbo", "pbp", "pbr", "pbs", "pbt", "pbu", "pbv", "pby", "pbz", "pca", "pcb", "pcc", "pcd", "pce", "pcf", "pcg", "pch", "pci", "pcj", "pck", "pcl", "pcm", "pcn", "pcp", "pcr", "pcw", "pda", "pdc", "pdi", "pdn", "pdo", "pdt", "pdu", "pea", "peb", "ped", "pee", "pef", "peg", "peh", "pei", "pej", "pek", "pel", "pem", "peo", "pep", "peq", "pes", "pev", "pex", "pey", "pez", "pfa", "pfe", "pfl", "pga", "pgd", "pgg", "pgi", "pgk", "pgl", "pgn", "pgs", "pgu", "pgy", "pgz", "pha", "phd", "phg", "phh", "phi", "phk", "phl", "phm", "phn", "pho", "phq", "phr", "pht", "phu", "phv", "phw", "pia", "pib", "pic", "pid", "pie", "pif", "pig", "pih", "pii", "pij", "pil", "pim", "pin", "pio", "pip", "pir", "pis", "pit", "piu", "piv", "piw", "pix", "piy", "piz", "pjt", "pka", "pkb", "pkc", "pkg", "pkh", "pkn", "pko", "pkp", "pkr", "pks", "pkt", "pku", "pla", "plb", "plc", "pld", "ple", "plf", "plg", "plh", "plj", "plk", "pll", "pln", "plo", "plp", "plq", "plr", "pls", "plt", "plu", "plv", "plw", "ply", "plz", "pma", "pmb", "pmc", "pmd", "pme", "pmf", "pmh", "pmi", "pmj", "pmk", "pml", "pmm", "pmn", "pmo", "pmq", "pmr", "pms", "pmt", "pmu", "pmw", "pmx", "pmy", "pmz", "pna", "pnb", "pnc", "pnd", "pne", "png", "pnh", "pni", "pnj", "pnk", "pnl", "pnm", "pnn", "pno", "pnp", "pnq", "pnr", "pns", "pnt", "pnu", "pnv", "pnw", "pnx", "pny", "pnz", "poc", "pod", "poe", "pof", "pog", "poh", "poi", "pok", "pom", "pon", "poo", "pop", "poq", "pos", "pot", "pov", "pow", "pox", "poy", "poz", "ppa", "ppe", "ppi", "ppk", "ppl", "ppm", "ppn", "ppo", "ppp", "ppq", "ppr", "pps", "ppt", "ppu", "pqa", "pqe", "pqm", "pqw", "pra", "prb", "prc", "prd", "pre", "prf", "prg", "prh", "pri", "prk", "prl", "prm", "prn", "pro", "prp", "prq", "prr", "prs", "prt", "pru", "prw", "prx", "pry", "prz", "psa", "psc", "psd", "pse", "psg", "psh", "psi", "psl", "psm", "psn", "pso", "psp", "psq", "psr", "pss", "pst", "psu", "psw", "psy", "pta", "pth", "pti", "ptn", "pto", "ptp", "ptq", "ptr", "ptt", "ptu", "ptv", "ptw", "pty", "pua", "pub", "puc", "pud", "pue", "puf", "pug", "pui", "puj", "puk", "pum", "puo", "pup", "puq", "pur", "put", "puu", "puw", "pux", "puy", "puz", "pwa", "pwb", "pwg", "pwi", "pwm", "pwn", "pwo", "pwr", "pww", "pxm", "pye", "pym", "pyn", "pys", "pyu", "pyx", "pyy", "pzn"], + ["qu", "qua", "qub", "quc", "qud", "quf", "qug", "quh", "qui", "quk", "qul", "qum", "qun", "qup", "quq", "qur", "qus", "quv", "quw", "qux", "quy", "quz", "qva", "qvc", "qve", "qvh", "qvi", "qvj", "qvl", "qvm", "qvn", "qvo", "qvp", "qvs", "qvw", "qvy", "qvz", "qwa", "qwc", "qwe", "qwh", "qwm", "qws", "qwt", "qxa", "qxc", "qxh", "qxl", "qxn", "qxo", "qxp", "qxq", "qxr", "qxs", "qxt", "qxu", "qxw", "qya", "qyp"], + ["rm", "rn", "ro", "ru", "rw", "raa", "rab", "rac", "rad", "raf", "rag", "rah", "rai", "raj", "rak", "ral", "ram", "ran", "rao", "rap", "raq", "rar", "ras", "rat", "rau", "rav", "raw", "rax", "ray", "raz", "rbb", "rbk", "rbl", "rbp", "rcf", "rdb", "rea", "reb", "ree", "reg", "rei", "rej", "rel", "rem", "ren", "rer", "res", "ret", "rey", "rga", "rge", "rgk", "rgn", "rgr", "rgs", "rgu", "rhg", "rhp", "ria", "rie", "rif", "ril", "rim", "rin", "rir", "rit", "riu", "rjg", "rji", "rjs", "rka", "rkb", "rkh", "rki", "rkm", "rkt", "rkw", "rma", "rmb", "rmc", "rmd", "rme", "rmf", "rmg", "rmh", "rmi", "rmk", "rml", "rmm", "rmn", "rmo", "rmp", "rmq", "rmr", "rms", "rmt", "rmu", "rmv", "rmw", "rmx", "rmy", "rmz", "rna", "rnd", "rng", "rnl", "rnn", "rnp", "rnr", "rnw", "roa", "rob", "roc", "rod", "roe", "rof", "rog", "rol", "rom", "roo", "rop", "ror", "rou", "row", "rpn", "rpt", "rri", "rro", "rrt", "rsb", "rsi", "rsl", "rsm", "rtc", "rth", "rtm", "rts", "rtw", "rub", "ruc", "rue", "ruf", "rug", "ruh", "rui", "ruk", "ruo", "rup", "ruq", "rut", "ruu", "ruy", "ruz", "rwa", "rwk", "rwl", "rwm", "rwo", "rwr", "rxd", "rxw", "ryn", "rys", "ryu", "rzh"], + ["sa", "sc", "sd", "se", "sg", "sh", "si", "sk", "sl", "sm", "sn", "so", "sq", "sr", "ss", "st", "su", "sv", "sw", "saa", "sab", "sac", "sad", "sae", "saf", "sah", "sai", "saj", "sak", "sal", "sam", "sao", "sap", "saq", "sar", "sas", "sat", "sau", "sav", "saw", "sax", "say", "saz", "sba", "sbb", "sbc", "sbd", "sbe", "sbf", "sbg", "sbh", "sbi", "sbj", "sbk", "sbl", "sbm", "sbn", "sbo", "sbp", "sbq", "sbr", "sbs", "sbt", "sbu", "sbv", "sbw", "sbx", "sby", "sbz", "sca", "scb", "sce", "scf", "scg", "sch", "sci", "sck", "scl", "scn", "sco", "scp", "scq", "scs", "sct", "scu", "scv", "scw", "scx", "sda", "sdb", "sdc", "sde", "sdf", "sdg", "sdh", "sdj", "sdk", "sdl", "sdm", "sdn", "sdo", "sdp", "sdq", "sdr", "sds", "sdt", "sdu", "sdv", "sdx", "sdz", "sea", "seb", "sec", "sed", "see", "sef", "seg", "seh", "sei", "sej", "sek", "sel", "sem", "sen", "seo", "sep", "seq", "ser", "ses", "set", "seu", "sev", "sew", "sey", "sez", "sfb", "sfe", "sfm", "sfs", "sfw", "sga", "sgb", "sgc", "sgd", "sge", "sgg", "sgh", "sgi", "sgj", "sgk", "sgl", "sgm", "sgn", "sgo", "sgp", "sgr", "sgs", "sgt", "sgu", "sgw", "sgx", "sgy", "sgz", "sha", "shb", "shc", "shd", "she", "shg", "shh", "shi", "shj", "shk", "shl", "shm", "shn", "sho", "shp", "shq", "shr", "shs", "sht", "shu", "shv", "shw", "shx", "shy", "shz", "sia", "sib", "sid", "sie", "sif", "sig", "sih", "sii", "sij", "sik", "sil", "sim", "sio", "sip", "siq", "sir", "sis", "sit", "siu", "siv", "siw", "six", "siy", "siz", "sja", "sjb", "sjd", "sje", "sjg", "sjk", "sjl", "sjm", "sjn", "sjo", "sjp", "sjr", "sjs", "sjt", "sju", "sjw", "ska", "skb", "skc", "skd", "ske", "skf", "skg", "skh", "ski", "skj", "skk", "skm", "skn", "sko", "skp", "skq", "skr", "sks", "skt", "sku", "skv", "skw", "skx", "sky", "skz", "sla", "slc", "sld", "sle", "slf", "slg", "slh", "sli", "slj", "sll", "slm", "sln", "slp", "slq", "slr", "sls", "slt", "slu", "slw", "slx", "sly", "slz", "sma", "smb", "smc", "smd", "smf", "smg", "smh", "smi", "smj", "smk", "sml", "smm", "smn", "smp", "smq", "smr", "sms", "smt", "smu", "smv", "smw", "smx", "smy", "smz", "snb", "snc", "sne", "snf", "sng", "snh", "sni", "snj", "snk", "snl", "snm", "snn", "sno", "snp", "snq", "snr", "sns", "snu", "snv", "snw", "snx", "sny", "snz", "soa", "sob", "soc", "sod", "soe", "sog", "soh", "soi", "soj", "sok", "sol", "son", "soo", "sop", "soq", "sor", "sos", "sou", "sov", "sow", "sox", "soy", "soz", "spb", "spc", "spd", "spe", "spg", "spi", "spk", "spl", "spm", "spn", "spo", "spp", "spq", "spr", "sps", "spt", "spu", "spv", "spx", "spy", "sqa", "sqh", "sqj", "sqk", "sqm", "sqn", "sqo", "sqq", "sqr", "sqs", "sqt", "squ", "sqx", "sra", "srb", "src", "sre", "srf", "srg", "srh", "sri", "srk", "srl", "srm", "srn", "sro", "srq", "srr", "srs", "srt", "sru", "srv", "srw", "srx", "sry", "srz", "ssa", "ssb", "ssc", "ssd", "sse", "ssf", "ssg", "ssh", "ssi", "ssj", "ssk", "ssl", "ssm", "ssn", "sso", "ssp", "ssq", "ssr", "sss", "sst", "ssu", "ssv", "ssx", "ssy", "ssz", "sta", "stb", "std", "ste", "stf", "stg", "sth", "sti", "stj", "stk", "stl", "stm", "stn", "sto", "stp", "stq", "str", "sts", "stt", "stu", "stv", "stw", "sty", "sua", "sub", "suc", "sue", "sug", "sui", "suj", "suk", "sul", "sum", "suo", "suq", "sur", "sus", "sut", "suv", "suw", "sux", "suy", "suz", "sva", "svb", "svc", "sve", "svk", "svm", "svr", "svs", "svx", "swb", "swc", "swf", "swg", "swh", "swi", "swj", "swk", "swl", "swm", "swn", "swo", "swp", "swq", "swr", "sws", "swt", "swu", "swv", "sww", "swx", "swy", "sxb", "sxc", "sxe", "sxg", "sxk", "sxl", "sxm", "sxn", "sxo", "sxr", "sxs", "sxu", "sxw", "sya", "syb", "syc", "syd", "syi", "syk", "syl", "sym", "syn", "syo", "syr", "sys", "syw", "syx", "syy", "sza", "szb", "szc", "szd", "sze", "szg", "szl", "szn", "szp", "szs", "szv", "szw", "szy"], + ["ta", "te", "tg", "th", "ti", "tk", "tl", "tn", "to", "tr", "ts", "tt", "tw", "ty", "taa", "tab", "tac", "tad", "tae", "taf", "tag", "tai", "taj", "tak", "tal", "tan", "tao", "tap", "taq", "tar", "tas", "tau", "tav", "taw", "tax", "tay", "taz", "tba", "tbb", "tbc", "tbd", "tbe", "tbf", "tbg", "tbh", "tbi", "tbj", "tbk", "tbl", "tbm", "tbn", "tbo", "tbp", "tbq", "tbr", "tbs", "tbt", "tbu", "tbv", "tbw", "tbx", "tby", "tbz", "tca", "tcb", "tcc", "tcd", "tce", "tcf", "tcg", "tch", "tci", "tck", "tcl", "tcm", "tcn", "tco", "tcp", "tcq", "tcs", "tct", "tcu", "tcw", "tcx", "tcy", "tcz", "tda", "tdb", "tdc", "tdd", "tde", "tdf", "tdg", "tdh", "tdi", "tdj", "tdk", "tdl", "tdm", "tdn", "tdo", "tdq", "tdr", "tds", "tdt", "tdu", "tdv", "tdx", "tdy", "tea", "teb", "tec", "ted", "tee", "tef", "teg", "teh", "tei", "tek", "tem", "ten", "teo", "tep", "teq", "ter", "tes", "tet", "teu", "tev", "tew", "tex", "tey", "tez", "tfi", "tfn", "tfo", "tfr", "tft", "tga", "tgb", "tgc", "tgd", "tge", "tgf", "tgg", "tgh", "tgi", "tgj", "tgn", "tgo", "tgp", "tgq", "tgr", "tgs", "tgt", "tgu", "tgv", "tgw", "tgx", "tgy", "tgz", "thc", "thd", "the", "thf", "thh", "thi", "thk", "thl", "thm", "thn", "thp", "thq", "thr", "ths", "tht", "thu", "thv", "thw", "thx", "thy", "thz", "tia", "tic", "tid", "tie", "tif", "tig", "tih", "tii", "tij", "tik", "til", "tim", "tin", "tio", "tip", "tiq", "tis", "tit", "tiu", "tiv", "tiw", "tix", "tiy", "tiz", "tja", "tjg", "tji", "tjj", "tjl", "tjm", "tjn", "tjo", "tjp", "tjs", "tju", "tjw", "tka", "tkb", "tkd", "tke", "tkf", "tkg", "tkk", "tkl", "tkm", "tkn", "tkp", "tkq", "tkr", "tks", "tkt", "tku", "tkv", "tkw", "tkx", "tkz", "tla", "tlb", "tlc", "tld", "tlf", "tlg", "tlh", "tli", "tlj", "tlk", "tll", "tlm", "tln", "tlo", "tlp", "tlq", "tlr", "tls", "tlt", "tlu", "tlv", "tlw", "tlx", "tly", "tma", "tmb", "tmc", "tmd", "tme", "tmf", "tmg", "tmh", "tmi", "tmj", "tmk", "tml", "tmm", "tmn", "tmo", "tmp", "tmq", "tmr", "tms", "tmt", "tmu", "tmv", "tmw", "tmy", "tmz", "tna", "tnb", "tnc", "tnd", "tne", "tnf", "tng", "tnh", "tni", "tnk", "tnl", "tnm", "tnn", "tno", "tnp", "tnq", "tnr", "tns", "tnt", "tnu", "tnv", "tnw", "tnx", "tny", "tnz", "tob", "toc", "tod", "toe", "tof", "tog", "toh", "toi", "toj", "tol", "tom", "too", "top", "toq", "tor", "tos", "tou", "tov", "tow", "tox", "toy", "toz", "tpa", "tpc", "tpe", "tpf", "tpg", "tpi", "tpj", "tpk", "tpl", "tpm", "tpn", "tpo", "tpp", "tpq", "tpr", "tpt", "tpu", "tpv", "tpw", "tpx", "tpy", "tpz", "tqb", "tql", "tqm", "tqn", "tqo", "tqp", "tqq", "tqr", "tqt", "tqu", "tqw", "tra", "trb", "trc", "trd", "tre", "trf", "trg", "trh", "tri", "trj", "trk", "trl", "trm", "trn", "tro", "trp", "trq", "trr", "trs", "trt", "tru", "trv", "trw", "trx", "try", "trz", "tsa", "tsb", "tsc", "tsd", "tse", "tsf", "tsg", "tsh", "tsi", "tsj", "tsk", "tsl", "tsm", "tsp", "tsq", "tsr", "tss", "tst", "tsu", "tsv", "tsw", "tsx", "tsy", "tsz", "tta", "ttb", "ttc", "ttd", "tte", "ttf", "ttg", "tth", "tti", "ttj", "ttk", "ttl", "ttm", "ttn", "tto", "ttp", "ttq", "ttr", "tts", "ttt", "ttu", "ttv", "ttw", "tty", "ttz", "tua", "tub", "tuc", "tud", "tue", "tuf", "tug", "tuh", "tui", "tuj", "tul", "tum", "tun", "tuo", "tup", "tuq", "tus", "tut", "tuu", "tuv", "tuw", "tux", "tuy", "tuz", "tva", "tvd", "tve", "tvk", "tvl", "tvm", "tvn", "tvo", "tvs", "tvt", "tvu", "tvw", "tvx", "tvy", "twa", "twb", "twc", "twd", "twe", "twf", "twg", "twh", "twl", "twm", "twn", "two", "twp", "twq", "twr", "twt", "twu", "tww", "twx", "twy", "txa", "txb", "txc", "txe", "txg", "txh", "txi", "txj", "txm", "txn", "txo", "txq", "txr", "txs", "txt", "txu", "txx", "txy", "tya", "tye", "tyh", "tyi", "tyj", "tyl", "tyn", "typ", "tyr", "tys", "tyt", "tyu", "tyv", "tyx", "tyy", "tyz", "tza", "tzh", "tzj", "tzl", "tzm", "tzn", "tzo", "tzx"], + ["ug", "uk", "ur", "uz", "uam", "uan", "uar", "uba", "ubi", "ubl", "ubr", "ubu", "uby", "uda", "ude", "udg", "udi", "udj", "udl", "udm", "udu", "ues", "ufi", "uga", "ugb", "uge", "ugn", "ugo", "ugy", "uha", "uhn", "uis", "uiv", "uji", "uka", "ukg", "ukh", "uki", "ukk", "ukl", "ukp", "ukq", "uks", "uku", "ukv", "ukw", "uky", "ula", "ulb", "ulc", "ule", "ulf", "uli", "ulk", "ull", "ulm", "uln", "ulu", "ulw", "uma", "umb", "umc", "umd", "umg", "umi", "umm", "umn", "umo", "ump", "umr", "ums", "umu", "una", "und", "une", "ung", "uni", "unk", "unm", "unn", "unp", "unr", "unu", "unx", "unz", "uok", "upi", "upv", "ura", "urb", "urc", "ure", "urf", "urg", "urh", "uri", "urj", "urk", "url", "urm", "urn", "uro", "urp", "urr", "urt", "uru", "urv", "urw", "urx", "ury", "urz", "usa", "ush", "usi", "usk", "usp", "uss", "usu", "uta", "ute", "uth", "utp", "utr", "utu", "uum", "uun", "uur", "uuu", "uve", "uvh", "uvl", "uwa", "uya", "uzn", "uzs"], + ["ve", "vi", "vo", "vaa", "vae", "vaf", "vag", "vah", "vai", "vaj", "val", "vam", "van", "vao", "vap", "var", "vas", "vau", "vav", "vay", "vbb", "vbk", "vec", "ved", "vel", "vem", "veo", "vep", "ver", "vgr", "vgt", "vic", "vid", "vif", "vig", "vil", "vin", "vis", "vit", "viv", "vka", "vki", "vkj", "vkk", "vkl", "vkm", "vkn", "vko", "vkp", "vkt", "vku", "vkz", "vlp", "vls", "vma", "vmb", "vmc", "vmd", "vme", "vmf", "vmg", "vmh", "vmi", "vmj", "vmk", "vml", "vmm", "vmp", "vmq", "vmr", "vms", "vmu", "vmv", "vmw", "vmx", "vmy", "vmz", "vnk", "vnm", "vnp", "vor", "vot", "vra", "vro", "vrs", "vrt", "vsi", "vsl", "vsv", "vto", "vum", "vun", "vut", "vwa"], + ["wa", "wo", "waa", "wab", "wac", "wad", "wae", "waf", "wag", "wah", "wai", "waj", "wak", "wal", "wam", "wan", "wao", "wap", "waq", "war", "was", "wat", "wau", "wav", "waw", "wax", "way", "waz", "wba", "wbb", "wbe", "wbf", "wbh", "wbi", "wbj", "wbk", "wbl", "wbm", "wbp", "wbq", "wbr", "wbs", "wbt", "wbv", "wbw", "wca", "wci", "wdd", "wdg", "wdj", "wdk", "wdu", "wdy", "wea", "wec", "wed", "weg", "weh", "wei", "wem", "wen", "weo", "wep", "wer", "wes", "wet", "weu", "wew", "wfg", "wga", "wgb", "wgg", "wgi", "wgo", "wgu", "wgw", "wgy", "wha", "whg", "whk", "whu", "wib", "wic", "wie", "wif", "wig", "wih", "wii", "wij", "wik", "wil", "wim", "win", "wir", "wit", "wiu", "wiv", "wiw", "wiy", "wja", "wji", "wka", "wkb", "wkd", "wkl", "wkr", "wku", "wkw", "wky", "wla", "wlc", "wle", "wlg", "wlh", "wli", "wlk", "wll", "wlm", "wlo", "wlr", "wls", "wlu", "wlv", "wlw", "wlx", "wly", "wma", "wmb", "wmc", "wmd", "wme", "wmg", "wmh", "wmi", "wmm", "wmn", "wmo", "wms", "wmt", "wmw", "wmx", "wnb", "wnc", "wnd", "wne", "wng", "wni", "wnk", "wnm", "wnn", "wno", "wnp", "wnu", "wnw", "wny", "woa", "wob", "woc", "wod", "woe", "wof", "wog", "woi", "wok", "wom", "won", "woo", "wor", "wos", "wow", "woy", "wpc", "wra", "wrb", "wrd", "wrg", "wrh", "wri", "wrk", "wrl", "wrm", "wrn", "wro", "wrp", "wrr", "wrs", "wru", "wrv", "wrw", "wrx", "wry", "wrz", "wsa", "wsg", "wsi", "wsk", "wsr", "wss", "wsu", "wsv", "wtf", "wth", "wti", "wtk", "wtm", "wtw", "wua", "wub", "wud", "wuh", "wul", "wum", "wun", "wur", "wut", "wuu", "wuv", "wux", "wuy", "wwa", "wwb", "wwo", "wwr", "www", "wxa", "wxw", "wya", "wyb", "wyi", "wym", "wyr", "wyy"], + ["xh", "xaa", "xab", "xac", "xad", "xae", "xag", "xai", "xaj", "xak", "xal", "xam", "xan", "xao", "xap", "xaq", "xar", "xas", "xat", "xau", "xav", "xaw", "xay", "xba", "xbb", "xbc", "xbd", "xbe", "xbg", "xbi", "xbj", "xbm", "xbn", "xbo", "xbp", "xbr", "xbw", "xbx", "xby", "xcb", "xcc", "xce", "xcg", "xch", "xcl", "xcm", "xcn", "xco", "xcr", "xct", "xcu", "xcv", "xcw", "xcy", "xda", "xdc", "xdk", "xdm", "xdo", "xdy", "xeb", "xed", "xeg", "xel", "xem", "xep", "xer", "xes", "xet", "xeu", "xfa", "xga", "xgb", "xgd", "xgf", "xgg", "xgi", "xgl", "xgm", "xgn", "xgr", "xgu", "xgw", "xha", "xhc", "xhd", "xhe", "xhr", "xht", "xhu", "xhv", "xia", "xib", "xii", "xil", "xin", "xip", "xir", "xis", "xiv", "xiy", "xjb", "xjt", "xka", "xkb", "xkc", "xkd", "xke", "xkf", "xkg", "xkh", "xki", "xkj", "xkk", "xkl", "xkn", "xko", "xkp", "xkq", "xkr", "xks", "xkt", "xku", "xkv", "xkw", "xkx", "xky", "xkz", "xla", "xlb", "xlc", "xld", "xle", "xlg", "xli", "xln", "xlo", "xlp", "xls", "xlu", "xly", "xma", "xmb", "xmc", "xmd", "xme", "xmf", "xmg", "xmh", "xmj", "xmk", "xml", "xmm", "xmn", "xmo", "xmp", "xmq", "xmr", "xms", "xmt", "xmu", "xmv", "xmw", "xmx", "xmy", "xmz", "xna", "xnb", "xnd", "xng", "xnh", "xni", "xnj", "xnk", "xnm", "xnn", "xno", "xnq", "xnr", "xns", "xnt", "xnu", "xny", "xnz", "xoc", "xod", "xog", "xoi", "xok", "xom", "xon", "xoo", "xop", "xor", "xow", "xpa", "xpb", "xpc", "xpd", "xpe", "xpf", "xpg", "xph", "xpi", "xpj", "xpk", "xpl", "xpm", "xpn", "xpo", "xpp", "xpq", "xpr", "xps", "xpt", "xpu", "xpv", "xpw", "xpx", "xpy", "xpz", "xqa", "xqt", "xra", "xrb", "xrd", "xre", "xrg", "xri", "xrm", "xrn", "xrq", "xrr", "xrt", "xru", "xrw", "xsa", "xsb", "xsc", "xsd", "xse", "xsh", "xsi", "xsj", "xsl", "xsm", "xsn", "xso", "xsp", "xsq", "xsr", "xss", "xsu", "xsv", "xsy", "xta", "xtb", "xtc", "xtd", "xte", "xtg", "xth", "xti", "xtj", "xtl", "xtm", "xtn", "xto", "xtp", "xtq", "xtr", "xts", "xtt", "xtu", "xtv", "xtw", "xty", "xtz", "xua", "xub", "xud", "xug", "xuj", "xul", "xum", "xun", "xuo", "xup", "xur", "xut", "xuu", "xve", "xvi", "xvn", "xvo", "xvs", "xwa", "xwc", "xwd", "xwe", "xwg", "xwj", "xwk", "xwl", "xwo", "xwr", "xwt", "xww", "xxb", "xxk", "xxm", "xxr", "xxt", "xya", "xyb", "xyj", "xyk", "xyl", "xyt", "xyy", "xzh", "xzm", "xzp"], + ["yi", "yo", "yaa", "yab", "yac", "yad", "yae", "yaf", "yag", "yah", "yai", "yaj", "yak", "yal", "yam", "yan", "yao", "yap", "yaq", "yar", "yas", "yat", "yau", "yav", "yaw", "yax", "yay", "yaz", "yba", "ybb", "ybd", "ybe", "ybh", "ybi", "ybj", "ybk", "ybl", "ybm", "ybn", "ybo", "ybx", "yby", "ych", "ycl", "ycn", "ycp", "yda", "ydd", "yde", "ydg", "ydk", "yds", "yea", "yec", "yee", "yei", "yej", "yel", "yen", "yer", "yes", "yet", "yeu", "yev", "yey", "yga", "ygi", "ygl", "ygm", "ygp", "ygr", "ygs", "ygu", "ygw", "yha", "yhd", "yhl", "yhs", "yia", "yif", "yig", "yih", "yii", "yij", "yik", "yil", "yim", "yin", "yip", "yiq", "yir", "yis", "yit", "yiu", "yiv", "yix", "yiy", "yiz", "yka", "ykg", "yki", "ykk", "ykl", "ykm", "ykn", "yko", "ykr", "ykt", "yku", "yky", "yla", "ylb", "yle", "ylg", "yli", "yll", "ylm", "yln", "ylo", "ylr", "ylu", "yly", "yma", "ymb", "ymc", "ymd", "yme", "ymg", "ymh", "ymi", "ymk", "yml", "ymm", "ymn", "ymo", "ymp", "ymq", "ymr", "yms", "ymt", "ymx", "ymz", "yna", "ynd", "yne", "yng", "ynh", "ynk", "ynl", "ynn", "yno", "ynq", "yns", "ynu", "yob", "yog", "yoi", "yok", "yol", "yom", "yon", "yos", "yot", "yox", "yoy", "ypa", "ypb", "ypg", "yph", "ypk", "ypm", "ypn", "ypo", "ypp", "ypz", "yra", "yrb", "yre", "yri", "yrk", "yrl", "yrm", "yrn", "yro", "yrs", "yrw", "yry", "ysc", "ysd", "ysg", "ysl", "ysm", "ysn", "yso", "ysp", "ysr", "yss", "ysy", "yta", "ytl", "ytp", "ytw", "yty", "yua", "yub", "yuc", "yud", "yue", "yuf", "yug", "yui", "yuj", "yuk", "yul", "yum", "yun", "yup", "yuq", "yur", "yut", "yuu", "yuw", "yux", "yuy", "yuz", "yva", "yvt", "ywa", "ywg", "ywl", "ywn", "ywq", "ywr", "ywt", "ywu", "yww", "yxa", "yxg", "yxl", "yxm", "yxu", "yxy", "yyr", "yyu", "yyz", "yzg", "yzk"], + ["za", "zh", "zu", "zaa", "zab", "zac", "zad", "zae", "zaf", "zag", "zah", "zai", "zaj", "zak", "zal", "zam", "zao", "zap", "zaq", "zar", "zas", "zat", "zau", "zav", "zaw", "zax", "zay", "zaz", "zba", "zbc", "zbe", "zbl", "zbt", "zbu", "zbw", "zca", "zch", "zdj", "zea", "zeg", "zeh", "zen", "zga", "zgb", "zgh", "zgm", "zgn", "zgr", "zhb", "zhd", "zhi", "zhn", "zhw", "zhx", "zia", "zib", "zik", "zil", "zim", "zin", "zir", "ziw", "ziz", "zka", "zkb", "zkd", "zkg", "zkh", "zkk", "zkn", "zko", "zkp", "zkr", "zkt", "zku", "zkv", "zkz", "zla", "zle", "zlj", "zlm", "zln", "zlq", "zls", "zlw", "zma", "zmb", "zmc", "zmd", "zme", "zmf", "zmg", "zmh", "zmi", "zmj", "zmk", "zml", "zmm", "zmn", "zmo", "zmp", "zmq", "zmr", "zms", "zmt", "zmu", "zmv", "zmw", "zmx", "zmy", "zmz", "zna", "znd", "zne", "zng", "znk", "zns", "zoc", "zoh", "zom", "zoo", "zoq", "zor", "zos", "zpa", "zpb", "zpc", "zpd", "zpe", "zpf", "zpg", "zph", "zpi", "zpj", "zpk", "zpl", "zpm", "zpn", "zpo", "zpp", "zpq", "zpr", "zps", "zpt", "zpu", "zpv", "zpw", "zpx", "zpy", "zpz", "zqe", "zra", "zrg", "zrn", "zro", "zrp", "zrs", "zsa", "zsk", "zsl", "zsm", "zsr", "zsu", "zte", "ztg", "ztl", "ztm", "ztn", "ztp", "ztq", "zts", "ztt", "ztu", "ztx", "zty", "zua", "zuh", "zum", "zun", "zuy", "zwa", "zxx", "zyb", "zyg", "zyj", "zyn", "zyp", "zza", "zzj"] +]; +var LangUtil = /** @class */ (function () { + function LangUtil() { + } + /* Determine if given string is a valid BCP 47 string */ + LangUtil.isBcp47 = function (langStr) { + return /^(([a-zA-Z]{2,3}(-[a-zA-Z](-[a-zA-Z]{3}){0,2})?|[a-zA-Z]{4}|[a-zA-Z]{5,8})(-[a-zA-Z]{4})?(-([a-zA-Z]{2}|[0-9]{3}))?(-([0-9a-zA-Z]{5,8}|[0-9][a-zA-Z]{3}))*(-[0-9a-wy-zA-WY-Z](-[a-zA-Z0-9]{2,8})+)*(-x(-[a-zA-Z0-9]{1,8})+)?|x(-[a-zA-Z0-9]{1,8})+|(en-GB-oed|i-ami|i-bnn|i-default|i-enochian|i-hak|i-klingon|i-lux|i-mingo|i-navajo|i-pwn|i-tao|i-tay|i-tsu|sgn-BE-FR|sgn-BE-NL|sgn-CH-DE|art-lojban|cel-gaulish|no-bok|no-nyn|zh-guoyu|zh-hakka|zh-min|zh-min-nan|zh-xiang))$/.test(langStr); + }; + LangUtil.validPrimaryLang = function (langStr) { + var primary = langStr.toLowerCase(); + if (primary.includes("-")) { + primary = primary.split("-")[0]; + } + if (!primary.match(/[a-z]{2,3}/)) + return false; + // qaa..qtz + if (primary.length === 3 + && primary.charAt(0) === "q" + && primary.charCodeAt(1) >= 97 && primary.charCodeAt(1) <= 116 + && primary.charCodeAt(2) >= 97 && primary.charCodeAt(2) <= 122) { + } + return validPrimaryLangs[primary.charCodeAt(0) - 97].includes(primary); + }; + LangUtil.matchPrimaryLang = function (lang1, lang2) { + var primary1 = lang1; + if (primary1.includes("-")) { + primary1 = primary1.split("-")[0]; + } + var primary2 = lang2; + if (primary2.includes("-")) { + primary2 = primary2.split("-")[0]; + } + return primary1.toLowerCase() === primary2.toLowerCase(); + }; + return LangUtil; +}()); +exports.LangUtil = LangUtil; + + +/***/ }, + +/***/ "./src/v2/common/CommonMapper.ts" +/*!***************************************!*\ + !*** ./src/v2/common/CommonMapper.ts ***! + \***************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.CommonMapper = void 0; +var DOMWalker_1 = __webpack_require__(/*! ../dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var CommonMapper = /** @class */ (function () { + function CommonMapper() { + this.hierarchyRole = null; + this.hierarchyPath = null; + this.hierarchyResults = null; + } + CommonMapper.prototype.getBounds = function (node) { + return null; + }; + CommonMapper.prototype.reset = function (node) { + this.hierarchyRole = []; + this.hierarchyResults = []; + this.hierarchyPath = [{ + rolePath: "", + roleCount: {} + }]; + var ancestors = []; + var parent = DOMWalker_1.DOMWalker.parentNode(node); + while (parent && parent.nodeType != 9 /* Node.DOCUMENT_NODE */) { + ancestors.push(parent); + parent = DOMWalker_1.DOMWalker.parentNode(parent); + } + ancestors = ancestors.reverse(); + for (var _i = 0, ancestors_1 = ancestors; _i < ancestors_1.length; _i++) { + var ancestor = ancestors_1[_i]; + var siblings = []; + var sibling = ancestor.previousSibling; + while (sibling) { + siblings.push(sibling); + sibling = sibling.previousSibling; + } + siblings = siblings.reverse(); + for (var _a = 0, siblings_1 = siblings; _a < siblings_1.length; _a++) { + var sibling_1 = siblings_1[_a]; + this.pushHierarchy(sibling_1); + this.popHierarchy(); + } + this.pushHierarchy(ancestor); + } + }; + CommonMapper.prototype.pushHierarchy = function (node) { + var role = this.getRole(node) || null; + this.hierarchyRole.push(role); + if (role !== null) { + var parentPathInfo = this.hierarchyPath[this.hierarchyPath.length - 1]; + parentPathInfo.roleCount[role] = (parentPathInfo.roleCount[role] || 0) + 1; + this.hierarchyPath.push({ + "rolePath": parentPathInfo.rolePath + "/" + role + "[" + parentPathInfo.roleCount[role] + "]", + "roleCount": {} + }); + } + var attr = {}; + if (node.nodeType === 1) { + attr = this.getAttributes(node); + } + this.hierarchyResults.push({ + node: node, + namespace: this.getNamespace(), + role: role, + attributes: attr, + rolePath: this.hierarchyPath[this.hierarchyPath.length - 1].rolePath, + bounds: this.getBounds(node) + }); + }; + CommonMapper.prototype.popHierarchy = function () { + var role = this.hierarchyRole.pop(); + if (role !== null) { + this.hierarchyPath.pop(); + } + this.hierarchyResults.pop(); + }; + CommonMapper.prototype.openScope = function (node) { + if (this.hierarchyRole === null) { + this.reset(node); + } + this.pushHierarchy(node); + return this.hierarchyResults; + }; + CommonMapper.prototype.closeScope = function (node) { + var retVal = []; + for (var _i = 0, _a = this.hierarchyResults; _i < _a.length; _i++) { + var res = _a[_i]; + // const temp = res.node; + // res.node = null; + // let cloned = JSON.parse(JSON.stringify(res)); + // cloned.node = res.node = temp; + // retVal.push(cloned); + retVal.push(res); + } + retVal[retVal.length - 1].role = "/" + retVal[retVal.length - 1].role; + this.popHierarchy(); + return retVal; + }; + return CommonMapper; +}()); +exports.CommonMapper = CommonMapper; + + +/***/ }, + +/***/ "./src/v2/common/Context.ts" +/*!**********************************!*\ + !*** ./src/v2/common/Context.ts ***! + \**********************************/ +(__unused_webpack_module, exports) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Context = exports.PartInfo = exports.AttrInfo = void 0; +// Context that will cause this rule to execute. +// Context syntax: +// Triggers: +// aria:role - Triggers on element with ARIA role role +// aria:role[attribute] - Triggers on elements with the equivalent logical +// aria- attribute (e.g., button[disabled] will trigger on +// <button disabled> or <div role="button" aria-disabled="true">) +// role[attribute=value] - Similar to above, with case-sensitive match +// to value +// role[attribute~value] - Similar to above, with case-insensitive match +// dom:element - Triggers on an element with the specified name +// dom:element[attribute] - Triggers on a dom element with the specified attribute +// dom:*[attribute] - Triggers on all elements with the specified attribute +// Combining triggers: +// trigger1 trigger2 - Triggers on elements with trigger2 within an +// element with trigger1 +// !trigger1 trigger2 - Triggers on elements with trigger2 not within +// element with trigger1 +// trigger1>trigger2 - Triggers on elements with trigger2 with an +// an immediate parent with trigger1 +// trigger1+trigger2 - Triggers on elements with trigger2 with an +// immediate previous sibling with trigger1 +// trigger1~trigger2 - Triggers on elements with trigger2 with an +// some earlier sibling with trigger1 +// context,context - Triggers on elements with either context +var AttrInfo = /** @class */ (function () { + function AttrInfo(inclusive, attr, eq, value) { + this.inclusive = inclusive; + this.attr = attr; + this.eq = eq; + this.value = value; + if (!inclusive + && ((typeof eq) !== "undefined" && eq.length > 0)) { + throw new Error("Cannot have !attr" + eq + " context"); + } + if (inclusive && (typeof eq) !== "undefined" && eq.length > 0 && ((typeof value) === "undefined" || value.length === 0)) { + throw new Error("Cannot have equivalence check without a value"); + } + } + AttrInfo.prototype.matches = function (context) { + var ruleAttrPart = this; + var elemAttrs = context.attributes; + if (!(ruleAttrPart.attr in elemAttrs)) { + return !ruleAttrPart.inclusive; + } + else if (!ruleAttrPart.inclusive) { + return false; + } + else if (!ruleAttrPart.eq) { + // inclusive match and I have that attribute and no equivalence defined + return true; + } + else { + // inclusive match and I have that attribute and equivalence defined + var attrValue = elemAttrs[ruleAttrPart.attr]; + if (ruleAttrPart.eq === "=") { + return ruleAttrPart.value === attrValue; + } + else if (ruleAttrPart.eq === "!=") { + return ruleAttrPart.value !== attrValue; + } + else if (ruleAttrPart.eq === "~") { + return ruleAttrPart.value === attrValue; + } + else if (ruleAttrPart.eq === "!~") { + return ruleAttrPart.value !== attrValue; + } + else { + throw new Error("Context equivalence operator not supported"); + } + } + }; + return AttrInfo; +}()); +exports.AttrInfo = AttrInfo; +var PartInfo = /** @class */ (function () { + function PartInfo(inclusive, namespace, role, attrs, connector) { + this.inclusive = inclusive; + this.namespace = namespace; + this.role = role; + this.attrs = attrs; + this.connector = connector; + if (role === "*" && !inclusive) { + throw new Error("!* context not supported"); + } + } + PartInfo.prototype.matches = function (contextHier, hierLevel) { + var rulePart = this; + var ruleRoleMatch = (rulePart.namespace in contextHier) && contextHier[rulePart.namespace][hierLevel] + && (contextHier[rulePart.namespace][hierLevel].role === rulePart.role + || contextHier[rulePart.namespace][hierLevel].role !== "none" && rulePart.role === "*"); + if (ruleRoleMatch + && rulePart.role === "*" + && rulePart.namespace === "dom" + && (contextHier[rulePart.namespace][hierLevel].role === "#text" + || contextHier[rulePart.namespace][hierLevel].role === "/#text")) { + ruleRoleMatch = false; + } + if (rulePart.inclusive && !ruleRoleMatch) + return false; + if (!rulePart.inclusive && !ruleRoleMatch) + return true; + // Match the attributes + var ruleAttrs = rulePart.attrs; + var elemContext = contextHier[rulePart.namespace][hierLevel]; + var match = true; + for (var _i = 0, ruleAttrs_1 = ruleAttrs; _i < ruleAttrs_1.length; _i++) { + var ruleAttrPart = ruleAttrs_1[_i]; + match = match && ruleAttrPart.matches(elemContext); + } + if (!rulePart.inclusive) + match = !match; + return match; + }; + return PartInfo; +}()); +exports.PartInfo = PartInfo; +var Context = /** @class */ (function () { + function Context(context) { + this.contextInfo = []; + var contextHierMatches = context.match(/!?[/a-zA-Z:0-9*\-_]+(\[[^\]]+\])*[ >+~]?/g); + var results = []; + for (var _i = 0, contextHierMatches_1 = contextHierMatches; _i < contextHierMatches_1.length; _i++) { + var part = contextHierMatches_1[_i]; + var parts = part.match(/(!?)([/a-zA-Z:0-9*\-_]+)((\[[^\]]+\])*)([ >+~]?)/); + var attrInfo = []; + for (var _a = 0, _b = parts[3].match(/\[([^\]]+)\]/g) || []; _a < _b.length; _a++) { + var attrPart = _b[_a]; + var attrParts = attrPart.match(/\[(!?)([a-z:A-Z*\-_]+)(!?[=~])?([^\]]+)?\]/); + attrInfo.push(new AttrInfo(attrParts[1] !== "!", attrParts[2].toLowerCase(), attrParts[3], attrParts[4])); + } + parts[2] = parts[2].toLowerCase(); + var nsParts = parts[2].split(":"); + var incl = parts[1] !== "!"; + var ns = nsParts.shift(); + var role = nsParts.join(":"); + var partInfo = new PartInfo(incl, ns, role, attrInfo, parts[parts.length - 1]); + results.push(partInfo); + } + this.contextInfo = results; + } + Context.cleanContext = function (context) { + context = context.toLowerCase().trim(); + context = context.replace(/ +!/g, " !"); + context = context.replace(/ +([>+~,])/g, "$1"); + context = context.replace(/([>+~,]) +/g, "$1"); + context = context.replace(/ +/g, " "); + return context.trim(); + }; + Context.parse = function (context) { + var contexts = Context.splitMultiple(Context.cleanContext(context)); + var retVal = []; + for (var i = 0; i < contexts.length; ++i) { + var ctx = new Context(contexts[i]); + retVal.push(ctx); + } + return retVal; + }; + /** + * Handles initial processing of splitting on comma - context,context + * @param context + */ + Context.splitMultiple = function (context) { + var contexts = []; + if (context) { + if (context.indexOf(",") === -1) { + contexts.push(context); + } + else { + for (var _i = 0, _a = context.split(","); _i < _a.length; _i++) { + var c = _a[_i]; + contexts.push(c); + } + } + } + return contexts; + }; + return Context; +}()); +exports.Context = Context; + + +/***/ }, + +/***/ "./src/v2/common/Engine.ts" +/*!*********************************!*\ + !*** ./src/v2/common/Engine.ts ***! + \*********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Engine = void 0; +var DOMWalker_1 = __webpack_require__(/*! ../dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var Context_1 = __webpack_require__(/*! ./Context */ "./src/v2/common/Context.ts"); +var Config_1 = __webpack_require__(/*! ../config/Config */ "./src/v2/config/Config.ts"); +var DOMMapper_1 = __webpack_require__(/*! ../dom/DOMMapper */ "./src/v2/dom/DOMMapper.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../../v4/util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../../v4/api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../../v4/util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var WrappedRule = /** @class */ (function () { + function WrappedRule(rule, parsedInfo) { + this.rule = rule; + this.parsedInfo = parsedInfo; + this.ns = this.parsedInfo.contextInfo[this.parsedInfo.contextInfo.length - 1].namespace; + Config_1.Config.DEBUG && console.log("Added Rule:", rule.id, JSON.stringify(this.parsedInfo)); + } + /** + * This function is responsible converting the node into a snippet which can be added to report. + * + * Note: This function will take the node and extract the node name and the attributes and build the snippet based on this. + * + * TODO: Future, maybe we can extract more then just single line, add more info or even add closing tags etc... + * + * @param {HTMLElement} node - The html element to convert into element snippet with node name and attributes only. + * + * @return {String} nodeSnippet - return the element snippet of the element that was provided which only contains, + * nodename and attributes. i.e. <table id=\"layout_table1\" role=\"presentation\"> + * + * @memberOf this + */ + WrappedRule.convertNodeToSnippet = function (node) { + // Variable Decleration + var nodeSnippet = ''; + // Extract the node name and add it to the node snippet + nodeSnippet += '<' + node.nodeName.toLowerCase(); + // Extract all the node attributes as an array + var nodeAttributes = node.attributes; + // In the case there are attributes on this node + if (nodeAttributes !== null && typeof nodeAttributes !== 'undefined') { + // Loop over all theses attributes and add the name and value to the nodeSnippet which will be returned + for (var i = nodeAttributes.length - 1; i >= 0; i--) { + if (nodeAttributes[i].name === "data-namewalk") + continue; + // Add the attribute name and value. + nodeSnippet += ' ' + nodeAttributes[i].name + '="' + nodeAttributes[i].value + '"'; + } + } + // Close the node + nodeSnippet += '>'; + // Return the node snippet + return nodeSnippet; + }; + /** + * This function is responsible for finding the source location for a node, which can be added to a report. + * Supports debug directives in the following forms: + * 1. An attribute on the element itself: + * ibm-a11y-debug="file.ts:10:5" + * 2. A comment node preceding the element (as a sibling or ancestor sibling): + * <!-- ibm-a11y-debug: file.ts:10:5 --> + * 3. A wrapper element (e.g. div) whose first non-whitespace child is such a comment node. + * 4. An ancestor element that carries the ibm-a11y-debug attribute. + * + * Traversal: checks the node itself for an inline attribute, then scans previous siblings at + * each ancestor level upward (also checking each ancestor element's own inline attribute), + * stopping if a blank or 'end' marker is found. + * + * @param {Node} node - The DOM node to find source info for + * @return {string | null} - The source location string, or null if not found + * + * @memberOf this + */ + WrappedRule.convertNodeToSource = function (node, enabled) { + if (enabled === void 0) { enabled = false; } + //console.log("Source Map enabled:", enabled); + if (!enabled || !node) + return null; + var DEBUG_DIRECTIVE = "ibm-a11y-debug"; + /** + * Parses a source string into a DirectiveResult. + * The source is the final resolved value — after any ':' separator has already been stripped. + * A blank value or the exact word 'end' (case-insensitive) is a stop marker. + */ + var parseSource = function (source) { + if (!source || source.toLowerCase() === 'end') { + return { found: true, stop: true }; + } + return { found: true, stop: false, source: source }; + }; + /** + * Extracts the debug-directive comment value from a node. + * Handles: + * - A comment node directly + * - A wrapper element (e.g. <div>) whose first non-whitespace child is a comment node + * + * Returns { found: true, stop: true } if the directive is blank or exactly 'end', + * returns { found: true, stop: false, source } if a valid source is found, + * or returns { found: false } if no directive is present on this node. + */ + var extractDirective = function (elem) { + if (!elem) + return { found: false }; + var commentValue = null; + if (elem.nodeType === Node.COMMENT_NODE) { + // Direct comment node + commentValue = elem.nodeValue; + } + else if (elem.nodeType === Node.ELEMENT_NODE) { + // Element wrapper (e.g. <div><!-- ibm-a11y-debug: ... --></div>) + // Find the first non-whitespace child node + var child = elem.firstChild; + while (child) { + if (child.nodeType === Node.TEXT_NODE) { + // Skip pure whitespace text nodes + if (child.nodeValue && child.nodeValue.trim().length > 0) { + // Non-whitespace text before a comment — not a directive wrapper + break; + } + } + else if (child.nodeType === Node.COMMENT_NODE) { + commentValue = child.nodeValue; + break; + } + else { + // Any other node type before a comment — not a directive wrapper + break; + } + child = child.nextSibling; + } + } + if (commentValue !== null) { + var trimmed = commentValue.trim(); + // Match exactly "ibm-a11y-debug" followed by end-of-string, whitespace, or ':' + // This prevents "ibm-a11y-debug-extra" from being treated as a directive. + if (trimmed === DEBUG_DIRECTIVE || + trimmed.startsWith(DEBUG_DIRECTIVE + ':') || + trimmed.startsWith(DEBUG_DIRECTIVE + ' ') || + trimmed.startsWith(DEBUG_DIRECTIVE + '\t')) { + // Strip the directive name and optional leading whitespace + var afterDirective = trimmed.substring(DEBUG_DIRECTIVE.length).trimStart(); + // Strip a single leading ':' separator if present + // (e.g. "ibm-a11y-debug: file.ts:10:5" → afterDirective = ": file.ts:10:5") + var source = afterDirective.startsWith(':') + ? afterDirective.substring(1).trim() + : afterDirective.trim(); + return parseSource(source); + } + } + return { found: false }; + }; + /** + * Returns the ibm-a11y-debug attribute value from an element node as a DirectiveResult, + * or { found: false } if absent. Recognises the 'end' stop marker just like comment directives. + * The attribute value is the source directly (no ':' prefix), e.g. ibm-a11y-debug="file.ts:10:5". + */ + var getInlineAttr = function (n) { + if (n.nodeType !== Node.ELEMENT_NODE) + return { found: false }; + var val = n.getAttribute(DEBUG_DIRECTIVE); + if (val === null) + return { found: false }; + // Attribute value is the source directly — no ':' separator to strip + return parseSource(val.trim()); + }; + /** + * Traverses left (previous siblings) then upward (parent) to find source info. + * Does NOT check the starting element itself — only its preceding siblings and ancestors. + * This avoids misidentifying a content node as its own source directive. + * + * At each ancestor level the function also checks the ancestor element's own inline + * ibm-a11y-debug attribute, so that a parent element can annotate all its descendants. + * + * Sibling scanning stops at the first node that is recognised as a directive (found or stop). + * Non-directive nodes (real content elements, text nodes) are skipped so that a directive + * placed further back in the sibling list is still found even if content nodes intervene. + * However, traversal does NOT cross element boundaries when scanning siblings — only + * comment nodes and dedicated wrapper elements (whose sole first child is a comment) are + * treated as transparent. + * + * Shadow DOM traversal: uses DOMWalker.parentNode() to cross shadow boundaries correctly, + * including slotted content and nested Shadow DOM (shadow-in-shadow). When the parent + * chain reaches a ShadowRoot, DOMWalker.parentNode() automatically resolves it to the + * shadow host element in the outer DOM. A plain DocumentFragment with no host returns + * null from DOMWalker.parentNode(), stopping traversal. + * + * Sibling traversal uses DOMWalker.previousSiblingNotOwnedBySlot() to skip nodes that + * are assigned to slots (and therefore logically belong to a different part of the tree). + * + * Uses an iterative approach (rather than recursion) to safely handle deeply nested + * DOM structures without risk of stack overflow. + * + * @param elem - The node whose context we are searching + * @returns The source location string, or null if not found + */ + var findSource = function (elem) { + var current = elem; + while (current) { + // Scan previous siblings for a debug directive comment or wrapper element. + // Use previousSiblingNotOwnedBySlot to skip nodes assigned to slots, which + // logically belong to a different part of the composed tree. + // Only comment nodes and dedicated wrapper elements are considered directives; + // all other node types are skipped (they do not block further scanning). + var prev = DOMWalker_1.DOMWalker.previousSiblingNotOwnedBySlot(current); + while (prev) { + var result = extractDirective(prev); + if (result.found) { + if (result.stop) + return null; + return result.source; + } + prev = DOMWalker_1.DOMWalker.previousSiblingNotOwnedBySlot(prev); + } + // No directive found among siblings — move up to parent. + // Use DOMWalker.parentNode() instead of node.parentNode directly so that: + // 1. Shadow DOM boundaries are crossed automatically (ShadowRoot → host element), + // supporting both regular and nested Shadow DOM (shadow-in-shadow). + // 2. Slotted nodes are re-parented to their slot owner rather than their + // light-DOM parent, matching the composed (rendered) tree structure. + // 3. Nodes with an ownerElement (e.g. iframe document roots) are re-parented + // to their owner element. + var parent_1 = DOMWalker_1.DOMWalker.parentNode(current); + if (!parent_1 || parent_1.nodeType === Node.DOCUMENT_NODE) { + // Reached the top of the tree (or a plain DocumentFragment with no host) + // without finding a directive. + return null; + } + // Check the parent element's own inline attribute before continuing upward. + // This allows a containing element to annotate all its descendants. + // An 'end' inline attribute on the parent stops traversal entirely. + var parentAttrResult = getInlineAttr(parent_1); + if (parentAttrResult.found) { + if (parentAttrResult.stop) + return null; + return parentAttrResult.source; + } + current = parent_1; + } + return null; + }; + // First, check for an inline attribute directive on the element itself. + // An 'end' attribute on the element itself stops traversal (returns null). + var selfAttrResult = getInlineAttr(node); + if (selfAttrResult.found) { + if (selfAttrResult.stop) + return null; + return selfAttrResult.source; + } + // Then traverse the DOM to find a preceding comment directive or ancestor attribute + return findSource(node); + }; + WrappedRule.prototype.run = function (engine, context, options, contextHierarchies) { + var startTime = new Date().getTime(); + var results; + try { + results = this.rule.run(context, options, contextHierarchies); + } + catch (e) { + var err = e; + console.error("RULE EXCEPTION:", this.rule.id, context.dom.rolePath, err.stack); + throw e; + } + var endTime = new Date().getTime(); + if (!results) + results = []; + if (!(results instanceof Array)) { + results = [results]; + } + var retVal = []; + for (var _i = 0, results_1 = results; _i < results_1.length; _i++) { + var result = results_1[_i]; + var message = engine.getMessage(this.rule.id, result.reasonId, result.messageArgs); + var path = {}; + for (var ns in context) { + path[ns] = context[ns].rolePath; + } + var ruleId = this.rule.id.replace(/^(.*)\$\$\d+$/, "$1"); + retVal.push({ + ruleId: ruleId, + value: result.value, + node: context["dom"].node, + path: path, + ruleTime: endTime - startTime, + reasonId: result.reasonId, + message: message, + messageArgs: result.messageArgs, + apiArgs: result.apiArgs, + bounds: context["dom"].bounds, + snippet: WrappedRule.convertNodeToSnippet(context["dom"].node), + source: WrappedRule.convertNodeToSource(context["dom"].node, engine.isSourceMapEnabled()) + }); + } + return retVal; + }; + return WrappedRule; +}()); +var Engine = /** @class */ (function () { + function Engine() { + this.mappers = {}; + this.ruleMap = {}; + this.wrappedRuleMap = {}; + this.nlsMap = {}; + this.helpMap = {}; + this.sourceMapEnabled = false; + this.inclRules = {}; + this.exclRules = {}; + // Need a DOM Mapper as a minimum + this.addMapper(new DOMMapper_1.DOMMapper()); + } + Engine.getLanguages = function () { + var env = typeof process !== "undefined" && typeof process.nodeType === "undefined" && process.env; + // If all else fails, default to US English + var nodeLang = "en-US"; + if (env) { + nodeLang = env.LANG || env.LANGUAGE || env.LC_ALL || env.LC_MESSAGES; + if (nodeLang && nodeLang.length > 0) { + nodeLang = nodeLang.split(".")[0].replace(/_/g, "-"); + } + else { + nodeLang = "en-US"; + } + } + return typeof navigator !== "undefined" && navigator.languages || [nodeLang]; + }; + Engine.prototype.run = function (root, options) { + if (root === null) { + return Promise.reject("null document"); + } + if (root.nodeType === 9 /* Node.DOCUMENT_NODE */) { + root = root.documentElement; + } + root.ownerDocument && (root.ownerDocument.PT_CHECK_HIDDEN_CONTENT = false); + var numNodesVisited = CacheUtil_1.CacheUtil.clearCaches(root); + var walker = new DOMWalker_1.DOMWalker(root, false, root, true); + var retVal = { + results: [], + numExecuted: 0, + ruleTime: 0, + totalTime: 0 + }; + var start = new Date().getTime(); + // Reset the role mappers + for (var namespace in this.mappers) { + this.mappers[namespace].reset(root); + } + // Initialize the context detector + var currentNodeCount = 0; + var lastReportedPercent = -1; + do { + currentNodeCount++; + // Report progress at each percentage milestone + var currentPercent = Math.floor((currentNodeCount / numNodesVisited) * 100); + if (currentPercent > lastReportedPercent) { + if (numNodesVisited > 10000) { + // if (currentPercent > 6) break; + console.log("Progress: ".concat(currentPercent, "% (").concat(currentNodeCount, "/").concat(numNodesVisited, " nodes)")); + // const ruleTimes = retVal.results.reduce((prev, cur) => { + // prev[cur.ruleId] = (prev[cur.ruleId] || 0)+cur.ruleTime; + // return prev; + // }, {}); + // for (const ruleId in ruleTimes) { + // if (ruleTimes[ruleId] > 10000) { + // console.log(`${ruleId}: ${ruleTimes[ruleId]}`); + // } + // } + // console.groupEnd(); + } + lastReportedPercent = currentPercent; + } + // Get the context information from the rule mappers + var contextHierarchies = {}; + for (var namespace in this.mappers) { + if (!walker.bEndTag) { + contextHierarchies[namespace] = this.mappers[namespace].openScope(walker.node); + // if (namespace === "dom" && walker.node.nodeType === 1 /* Node.ELEMENT_NODE */) { + // const elem = walker.node as Element; + // let id; + // if (elem.hasAttribute("id") && (id = elem.getAttribute("id").trim()).length > 0) { + // if (root.ownerDocument.getElementById(id) === elem) { + // contextHierarchies["dom"][contextHierarchies["dom"].length-1].rolePath = "//*[@id='"+id+"']"; + // } + // } + // } + } + else { + contextHierarchies[namespace] = this.mappers[namespace].closeScope(walker.node); + } + } + if (walker.node.nodeType !== 11 + && (VisUtil_1.VisUtil.isNodeVisible(walker.node) + // || walker.node.nodeName.toLowerCase() === "head" + || walker.node.nodeName.toLowerCase() === "meta" + || walker.node.nodeName.toLowerCase() === "style" + || walker.node.nodeName.toLowerCase() === "datalist" + || walker.node.nodeName.toLowerCase() === "param" + || !DOMUtil_1.DOMUtil.getAncestor(walker.node, ["body"]))) { + var context = {}; + for (var ns in contextHierarchies) { + var nsHier = contextHierarchies[ns]; + var lastHier = nsHier[nsHier.length - 1]; + context[ns] = lastHier; + } + var matchingRules = this.getMatchingRules(contextHierarchies); + var depMatch = {}; + for (var _i = 0, matchingRules_1 = matchingRules; _i < matchingRules_1.length; _i++) { + var matchingRule = matchingRules_1[_i]; + var fulfillsDependencies = true; + for (var _a = 0, _b = matchingRule.rule.dependencies || []; _a < _b.length; _a++) { + var dep = _b[_a]; + if (!depMatch[dep]) + fulfillsDependencies = false; + } + if (fulfillsDependencies) { + var results = []; + var start_1 = new Date().getTime(); + try { + results = matchingRule.run(this, context, options, contextHierarchies); + } + catch (err) { + // Wrapper shows error in console. Skip this rule as N/A + // We don't want to kill the engine + } + // If out of scope, it fulfills the dependency + if (results.length === 0) { + depMatch[matchingRule.rule.id] = true; + } + for (var _c = 0, results_2 = results; _c < results_2.length; _c++) { + var result = results_2[_c]; + retVal.results.push(result); + retVal.ruleTime += result.ruleTime; + retVal.numExecuted++; + if (result.value[1] === IRule_1.eRuleConfidence.PASS) { + depMatch[result.ruleId] = true; + } + } + } + } + } + } while (walker.nextNode()); + CacheUtil_1.CacheUtil.clearCaches(root); + retVal.totalTime = new Date().getTime() - start; + return Promise.resolve(retVal); + }; + Engine.prototype.enableRules = function (ruleIds) { + for (var ruleId in this.ruleMap) { + this.ruleMap[ruleId].enabled = false; + } + for (var _i = 0, _a = ruleIds || []; _i < _a.length; _i++) { + var ruleId = _a[_i]; + if (!(ruleId in this.ruleMap)) { + console.warn("WARNING: Rule Id", ruleId, "could not be enabled."); + } + else { + this.ruleMap[ruleId].enabled = true; + } + } + }; + Engine.prototype.getRule = function (ruleId) { + return this.ruleMap[ruleId]; + }; + Engine.prototype.getRulesIds = function () { + var retVal = []; + for (var ruleId in this.ruleMap) { + retVal.push(ruleId); + } + return retVal; + }; + Engine.prototype.addRules = function (rules) { + for (var _i = 0, rules_1 = rules; _i < rules_1.length; _i++) { + var rule = rules_1[_i]; + this.addRule(rule, true); + } + this._sortRules(); + }; + Engine.prototype.addRule = function (rule, skipSort) { + var ctxs = Context_1.Context.parse(rule.context); + var idx = 0; + var ruleId = rule.id; + if (ruleId in this.ruleMap) { + console.log("WARNING: Rule", ruleId, "already added to engine. Ignoring..."); + return; + } + this.ruleMap[ruleId] = rule; + for (var _i = 0, ctxs_1 = ctxs; _i < ctxs_1.length; _i++) { + var ctx = ctxs_1[_i]; + var wrapId = ruleId; + if (idx >= 1) { + wrapId = ruleId + "$$" + idx; + } + ++idx; + var wrappedRule = new WrappedRule(rule, ctx); + this.wrappedRuleMap[wrapId] = wrappedRule; + var parts = wrappedRule.parsedInfo.contextInfo; + var lastPart = parts[parts.length - 1]; + var triggerRole = lastPart.namespace + ":" + lastPart.role; + if (lastPart.inclusive) { + this.inclRules[triggerRole] = this.inclRules[triggerRole] || []; + this.inclRules[triggerRole].push(wrappedRule); + } + else { + this.exclRules[triggerRole] = this.exclRules[triggerRole] || []; + this.exclRules[triggerRole].push(wrappedRule); + } + } + if (!skipSort) { + this._sortRules(); + } + }; + Engine.prototype.enableSourceMap = function (enable) { + this.sourceMapEnabled = enable; + }; + Engine.prototype.isSourceMapEnabled = function () { + return this.sourceMapEnabled; + }; + Engine.prototype._sortRules = function () { + for (var role in this.inclRules) { + this.inclRules[role].sort(function (ruleA, ruleB) { + var hasDepA = ruleA.rule.dependencies && ruleA.rule.dependencies.length > 0; + var hasDepB = ruleB.rule.dependencies && ruleB.rule.dependencies.length > 0; + // If B depends on A, sort A before B + if (hasDepB && ruleB.rule.dependencies.includes(ruleA.rule.id)) + return -1; + // If A depends on B, sort B before A + if (hasDepA && ruleA.rule.dependencies.includes(ruleB.rule.id)) + return 1; + // Otherwise, doesn't matter + return 0; + }); + } + for (var role in this.exclRules) { + this.exclRules[role].sort(function (ruleA, ruleB) { + var hasDepA = ruleA.rule.dependencies && ruleA.rule.dependencies.length > 0; + var hasDepB = ruleB.rule.dependencies && ruleB.rule.dependencies.length > 0; + // If B depends on A, sort A before B + if (hasDepB && ruleB.rule.dependencies.includes(ruleA.rule.id)) + return -1; + // If A depends on B, sort B before A + if (hasDepA && ruleA.rule.dependencies.includes(ruleB.rule.id)) + return 1; + // Otherwise, doesn't matter + return 0; + }); + } + }; + Engine.prototype.addNlsMap = function (map) { + for (var key in map) { + this.nlsMap[key] = map[key]; + } + }; + Engine.prototype.addHelpMap = function (map) { + for (var key in map) { + this.helpMap[key] = map[key]; + } + }; + Engine.prototype.getMessage = function (ruleId, ruleIdx, msgArgs) { + var splitter = ruleId.indexOf("$$"); + if (splitter >= 0) { + ruleId = ruleId.substring(0, splitter); + } + if (!(ruleId in this.nlsMap)) + return ruleId; + var messageTemplate = this.nlsMap[ruleId][ruleIdx || 0]; + if (!messageTemplate) + return ruleId + "_" + ruleIdx; + return messageTemplate.replace(/\{(\d+)\}/g, function (matchedStr, matchedNum, matchedIndex) { return msgArgs[matchedNum]; }); + }; + Engine.prototype.getHelp = function (ruleId, reasonId, archiveId) { + if (!archiveId) { + // Set to the latest + archiveId = "latest"; + } + return "".concat(Config_1.Config.helpRoot, "/").concat(archiveId, "/doc").concat(this.getHelpRel(ruleId, reasonId)); + }; + Engine.prototype.getHelpRel = function (ruleId, ruleIdx) { + var splitter = ruleId.indexOf("$$"); + if (splitter >= 0) { + ruleId = ruleId.substring(0, splitter); + } + if (!(ruleId in this.helpMap)) + return ruleId; + ruleIdx = ruleIdx || 0; + var helpStr = null; + if (ruleIdx in this.helpMap[ruleId]) { + helpStr = this.helpMap[ruleId][ruleIdx || 0]; + } + else { + helpStr = this.helpMap[ruleId][0]; + } + if (!helpStr) + return ruleId + "_" + ruleIdx; + return helpStr; + }; + Engine.prototype.addMapper = function (mapper) { + this.mappers[mapper.getNamespace()] = mapper; + }; + Engine.match = function (rule, contextHier) { + var ruleParts = rule.parsedInfo.contextInfo; + var partIdx = ruleParts.length - 1; + var curNS = ruleParts[partIdx].namespace; + var curHier = contextHier[curNS][contextHier[curNS].length - 1]; + var contextNode = curHier.node; + // If the end of the rule part doesn't match the end of the hierarchy, we don't have a match + if (!ruleParts[partIdx].matches(contextHier, contextHier[curNS].length - 1)) { + return false; + } + // If there was only one part, we have a match + if (ruleParts.length === 1) { + return true; + } + // Need to deal with parent parts. To walk the hierarchy, these need to be + // all in the same namespace. Confirm that is true. + curNS = ruleParts[0].namespace; + curHier = contextHier[curNS][contextHier[curNS].length - 1]; + --partIdx; + if (ruleParts.slice(0, ruleParts.length - 1).some(function (part) { return part.namespace !== curNS; })) { + console.error("[ERROR] Rule ".concat(rule.rule.id, " has inconsitent parent namespaces")); + return false; + } + // If the target node matches the end of the hierarchy, move up past it, otherwise, start at the end + var hierIdx = contextHier[curNS].length - (curHier.node.isSameNode(contextNode) ? 2 : 1); + while (hierIdx >= 0 && partIdx >= 0) { + var part = ruleParts[partIdx]; + var matchesPart = ruleParts[partIdx].matches(contextHier, hierIdx); + if (part.connector === ">") { + if (!matchesPart) { + // Direct parent check and doesn't match + return false; + } + else { + // Direct parent check and does match + --partIdx; + --hierIdx; + } + } + else if (part.connector === " ") { + if (part.inclusive) { + // inclusive ancestor match + if (matchesPart) { + --partIdx; + } + // If doesn't match, just move up the role hierarchy + --hierIdx; + } + else if (!matchesPart) { + // exclusive ancestor match and current matches + return false; + } + else { + // exclusive ancestor match and current doesn't match - check for other ancestors + var parentMatch = false; + for (var searchIdx = hierIdx - 1; !parentMatch && searchIdx >= 0; --searchIdx) { + parentMatch = !ruleParts[partIdx].matches(contextHier, searchIdx); + } + if (parentMatch) + return false; + else + --partIdx; + } + } + else { + throw new Error("Context connector " + part.connector + " is not supported"); + } + } + return partIdx === -1; + }; + Engine.prototype.getMatchingRules = function (ctxHier) { + var matches = []; + function addMatches(rules) { + for (var _i = 0, rules_2 = rules; _i < rules_2.length; _i++) { + var rule = rules_2[_i]; + if (rule.rule.enabled && Engine.match(rule, ctxHier)) { + matches.push(rule); + } + } + } + for (var ns in ctxHier) { + var role = ns + ":" + (ctxHier[ns].length > 0 ? ctxHier[ns][ctxHier[ns].length - 1].role : "none"); + if (role in this.inclRules) { + addMatches(this.inclRules[role]); + } + for (var xRole in this.exclRules) { + if (xRole !== role) { + addMatches(this.exclRules[xRole]); + } + } + if (role !== ns + ":none") { + if (role.startsWith(ns + ":/")) { + if (ns + ":/*" in this.inclRules) { + addMatches(this.inclRules[ns + ":/*"]); + } + } + else { + if (ns + ":*" in this.inclRules) { + addMatches(this.inclRules[ns + ":*"]); + } + } + } + } + return this.sortDeps(matches); + }; + /** + * Sorts the rules in order to execute dependencies in the correct order + * @param inRules List of wrapped rules to sort + * @returns Sorted list of wrapped rules + */ + Engine.prototype.sortDeps = function (inRules) { + var depRules = []; + for (var _i = 0, inRules_1 = inRules; _i < inRules_1.length; _i++) { + var rule = inRules_1[_i]; + depRules.push(rule); + } + var retVal = []; + var idToRule = {}; + // Iterate through the rules. If that rule's dependencies can be met by rules already in the list, add it to the list + // Repeat until no changes are made to the satisfied list + // If a rule cannot be satisfied, it will never execute, so it can be dropped. + var change = false; + do { + change = false; + for (var idx = 0; idx < depRules.length; ++idx) { + var depRule = depRules[idx]; + if (depRule.rule.id in idToRule) + continue; + var allMatch = true; + if (depRule.rule.dependencies && depRule.rule.dependencies.length > 0) { + for (var _a = 0, _b = depRule.rule.dependencies; _a < _b.length; _a++) { + var depId = _b[_a]; + if (!(depId in idToRule)) { + allMatch = false; + } + } + } + // if (depRule.rule.prereqs && depRule.rule.prereqs.length > 0) { + // for (const depId of depRule.rule.prereqs) { + // if (!(depId in idToRule)) { + // allMatch = false; + // } + // } + // } + if (allMatch) { + change = true; + retVal.push(depRule); + idToRule[depRule.rule.id] = true; + depRules.splice(idx--, 1); + } + } + } while (change); + return retVal; + }; + return Engine; +}()); +exports.Engine = Engine; + + +/***/ }, + +/***/ "./src/v2/config/Config.ts" +/*!*********************************!*\ + !*** ./src/v2/config/Config.ts ***! + \*********************************/ +(__unused_webpack_module, exports) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Config = void 0; +var Config = /** @class */ (function () { + function Config() { + } + Config.DEBUG = false; + Config.helpRoot = "https://able.ibm.com/rules/archives"; + return Config; +}()); +exports.Config = Config; + + +/***/ }, + +/***/ "./src/v2/dom/DOMMapper.ts" +/*!*********************************!*\ + !*** ./src/v2/dom/DOMMapper.ts ***! + \*********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.DOMMapper = void 0; +var CommonMapper_1 = __webpack_require__(/*! ../common/CommonMapper */ "./src/v2/common/CommonMapper.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../../v4/util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var DOMMapper = /** @class */ (function (_super) { + __extends(DOMMapper, _super); + function DOMMapper() { + return _super !== null && _super.apply(this, arguments) || this; + } + DOMMapper.prototype.getRole = function (node) { + return node.nodeName.toLowerCase(); + }; + DOMMapper.prototype.getNamespace = function () { + return "dom"; + }; + DOMMapper.prototype.getAttributes = function (node) { + var retVal = {}; + if (node.nodeType === 1 /* Node.ELEMENT_NODE */) { + var elem = node; + for (var idx = 0; idx < elem.attributes.length; ++idx) { + var attrInfo = elem.attributes[idx]; + retVal[attrInfo.name.toLowerCase()] = attrInfo.nodeValue; + } + } + return retVal; + }; + /** + * get scaled bounds for screenshot etc. adjusted for devicePixelRatio and scroll + * @param node + * @returns + */ + DOMMapper.prototype.getBounds = function (node) { + if (node.nodeType !== 1 /*Node.ELEMENT_NODE*/) + return null; + var cachedBounds = CacheUtil_1.CacheUtil.getCache(node, "DOMMapper_Bounds", undefined); + if (typeof cachedBounds !== "undefined") { + return cachedBounds; + } + var adjustment = 1; + if (node.ownerDocument && node.ownerDocument.defaultView && node.ownerDocument.defaultView.devicePixelRatio) { + adjustment = node.ownerDocument.defaultView.devicePixelRatio; + } + var bounds = node.getBoundingClientRect(); + // Do a check whether bounds has value as we use different tool (htmlUnit, browser) to call this function + if (bounds) { + var scrollX_1 = node && node.ownerDocument && node.ownerDocument.defaultView && node.ownerDocument.defaultView.scrollX || 0; + var scrollY_1 = node && node.ownerDocument && node.ownerDocument.defaultView && node.ownerDocument.defaultView.scrollY || 0; + var ret = { + "left": Math.ceil((bounds.left + scrollX_1) * adjustment), + "top": Math.ceil((bounds.top + scrollY_1) * adjustment), + "height": Math.ceil(bounds.height * adjustment), + "width": Math.ceil(bounds.width * adjustment) + }; + CacheUtil_1.CacheUtil.setCache(node, "DOMMapper_Bounds", ret); + return ret; + } + return null; + }; + /** + * get real CSS bounds in css pixels, adjusted for scroll only + * @param node + * @returns + */ + DOMMapper.prototype.getUnadjustedBounds = function (node) { + if (node.nodeType !== 1 /*Node.ELEMENT_NODE*/) + return null; + var cachedBounds = CacheUtil_1.CacheUtil.getCache(node, "DOMMapper_UnadjustedBounds", undefined); + if (typeof cachedBounds !== "undefined") { + return cachedBounds; + } + var bounds = node.getBoundingClientRect(); + // adjusted for scroll if any + if (bounds) { + var scrollX_2 = node && node.ownerDocument && node.ownerDocument.defaultView && node.ownerDocument.defaultView.scrollX || 0; + var scrollY_2 = node && node.ownerDocument && node.ownerDocument.defaultView && node.ownerDocument.defaultView.scrollY || 0; + var ret = { + "left": Math.ceil(bounds.left + scrollX_2), + "top": Math.ceil(bounds.top + scrollY_2), + "height": Math.ceil(bounds.height), + "width": Math.ceil(bounds.width) + }; + CacheUtil_1.CacheUtil.setCache(node, "DOMMapper_UnadjustedBounds", ret); + return ret; + } + return null; + }; + return DOMMapper; +}(CommonMapper_1.CommonMapper)); +exports.DOMMapper = DOMMapper; + + +/***/ }, + +/***/ "./src/v2/dom/DOMUtil.ts" +/*!*******************************!*\ + !*** ./src/v2/dom/DOMUtil.ts ***! + \*******************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.DOMUtil = void 0; +var DOMWalker_1 = __webpack_require__(/*! ./DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +/** + * Utility class providing helper methods for DOM manipulation and traversal operations. + * Used throughout the accessibility checker engine to navigate and analyze DOM structures. + */ +var DOMUtil = /** @class */ (function () { + function DOMUtil() { + } + /** + * Checks if a given node has an ancestor element with a node name matching any of the provided names. + * Traverses up the DOM tree from the given node until a match is found or the root is reached. + * + * @param node - The starting DOM node to check + * @param names - Array of node names (tag names) to search for in uppercase (e.g., ['TABLE', 'DIV']) + * @returns true if an ancestor with a matching name is found, false otherwise + */ + DOMUtil.hasParent = function (node, names) { + var p = DOMWalker_1.DOMWalker.parentElement(node); + while (p && !names.includes(p.nodeName)) { + p = DOMWalker_1.DOMWalker.parentElement(p); + } + return !!p; + }; + /** + * Retrieves the first ancestor element that matches any of the provided node names (case-insensitive). + * Similar to hasParent but returns the actual element reference and performs case-insensitive comparison. + * + * @param node - The starting DOM node + * @param names - Array of lowercase node names to search for (e.g., ['table', 'div']) + * @returns The matching ancestor element, or null if none found + */ + DOMUtil.getAncestor = function (node, names) { + var p = DOMWalker_1.DOMWalker.parentElement(node); + while (p && !names.includes(p.nodeName.toLowerCase())) { + p = DOMWalker_1.DOMWalker.parentElement(p); + } + return p; + }; + /** + * Determines if two nodes are the same node, with fallback strategies for different browser environments. + * Uses multiple comparison methods for cross-browser compatibility: + * 1. Strict equality (===) + * 2. isSameNode() method if available + * 3. compareDocumentPosition() (returns 0 if same node) + * 4. Returns true as last resort if no comparison method is available + * + * @param a - First node to compare + * @param b - Second node to compare + * @returns true if nodes are the same, false otherwise + */ + DOMUtil.sameNode = function (a, b) { + if (a === b) { + return true; + } + else if (a.isSameNode) { + return a.isSameNode(b); + } + else if (a.compareDocumentPosition) { + return a.compareDocumentPosition(b) === 0; + } + else { + // Not supported in this environment - try our best + return true; + } + }; + /** + * Normalizes whitespace in a string by replacing all whitespace characters + * (spaces, tabs, carriage returns, newlines) with single spaces and collapsing + * multiple consecutive spaces into one. + * + * @param s - The input string to clean + * @returns The cleaned string with normalized whitespace + * @example "Hello\n\t World" → "Hello World" + */ + DOMUtil.cleanWhitespace = function (s) { + var retVal = s.replace(/[ \t\r\n]/g, " ").replace(/ +/g, " "); + return retVal; + }; + /** + * Collapses multiple consecutive spaces into a single space. + * Unlike cleanWhitespace, only handles spaces, not other whitespace characters like tabs or newlines. + * + * @param s - The input string to clean + * @returns The string with collapsed spaces + */ + DOMUtil.cleanSpace = function (s) { + var retVal = s.replace(/ +/g, " "); + return retVal; + }; + /** + * Determines if two elements (typically table cells) belong to the same table element. + * Finds the table ancestor for each element and compares them using sameNode(). + * + * @param element1 - First element to check + * @param element2 - Second element to check + * @returns true if both elements share the same table ancestor, false otherwise + */ + DOMUtil.isInSameTable = function (element1, element2) { + if (element1 && element2) { + var parentName = ['table']; + var parent1 = DOMUtil.getAncestor(element1, parentName); + var parent2 = DOMUtil.getAncestor(element2, parentName); + if (parent1 !== null && parent2 != null && DOMUtil.sameNode(parent1, parent2)) + return true; + } + return false; + }; + /** + * Traverses up the DOM tree to find the shadow root (document fragment) that contains the given node. + * Important for handling Web Components and Shadow DOM structures in accessibility checking. + * + * @param node - The starting node + * @returns The shadow root node (nodeType 11 = DOCUMENT_FRAGMENT_NODE), or null if none found + */ + DOMUtil.shadowRootNode = function (node) { + var nd = node; + while (nd != null && nd.nodeType !== 11 /* Node.DOCUMENT_FRAGMENT_NODE */) + nd = nd.parentNode; + return nd; + }; + /** + * Creates a deep copy of an object while preserving Node references (doesn't clone Node objects). + * Useful when copying data structures that contain DOM node references, as you typically want + * to preserve those references rather than attempting to clone the nodes themselves. + * + * Behavior: + * - Primitive values: Deep copied via JSON serialization + * - Functions: Returned as-is (reference) + * - Node objects: Returned as-is (reference, not cloned) + * - Arrays/Objects: Recursively copied with the same rules + * + * @param rhs - The object to copy (right-hand side) + * @returns A copy of the object with Node references preserved + */ + DOMUtil.objectCopyWithNodeRefs = function (rhs) { + if (!rhs) + return rhs; + if (typeof rhs !== "object") { + if (typeof rhs === "function") { + return rhs; + } + else { + return JSON.parse(JSON.stringify(rhs)); + } + } + else if (rhs instanceof Node || !!rhs.nodeType) { + return rhs; + } + else { + var retVal = void 0; + if (rhs.constructor.name === "Array") { + retVal = []; + for (var _i = 0, rhs_1 = rhs; _i < rhs_1.length; _i++) { + var item = rhs_1[_i]; + retVal.push(this.objectCopyWithNodeRefs(item)); + } + } + else { + retVal = {}; + for (var key in rhs) { + retVal[key] = this.objectCopyWithNodeRefs(rhs[key]); + } + } + return retVal; + } + }; + /** + * Finds the first ancestor element that has a specific attribute with a specific value. + * Traverses up the DOM tree from the given element until a matching ancestor is found. + * + * @param element - The starting element + * @param attrName - The attribute name to search for + * @param attrValue - The expected attribute value + * @returns The matching ancestor element, or null if none found + * @example Finding an ancestor with aria-hidden="true" or data-testid="container" + */ + DOMUtil.getAncestorWithAttribute = function (element, attrName, attrValue) { + var walkNode = DOMWalker_1.DOMWalker.parentNode(element); + while (walkNode !== null) { + if (walkNode.nodeType === 1 /* Node.ELEMENT_NODE */ && walkNode.getAttribute(attrName) === attrValue) + return walkNode; + walkNode = DOMWalker_1.DOMWalker.parentNode(walkNode); + } + return null; + }; + return DOMUtil; +}()); +exports.DOMUtil = DOMUtil; + + +/***/ }, + +/***/ "./src/v2/dom/DOMWalker.ts" +/*!*********************************!*\ + !*** ./src/v2/dom/DOMWalker.ts ***! + \*********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.DOMWalker = void 0; +var VisUtil_1 = __webpack_require__(/*! ../../v4/util/VisUtil */ "./src/v4/util/VisUtil.ts"); +/** + * Walks in a DOM order + * + * Assumption that nodes of shadow DOMs call assignSlots on the shadow root before + * doing other processing in that tree. If you walk into a shadow root, the DOMWalker + * will do it automatically. + * + * See also ../aria/ARIAWalker + */ +var DOMWalker = /** @class */ (function () { + function DOMWalker(element, bEnd, root, considerHidden, DEBUG) { + this.DEBUGIDX = 0; + this.indent = 0; + this.DEBUG = !!DEBUG; + this.root = root || ((element && element.ownerDocument) ? element.ownerDocument.documentElement : element); + if (this.root.nodeType === 9) { + this.root = this.root.documentElement; + } + this.node = element; + if (this.node.nodeType === 9) { + this.node = this.node.documentElement; + } + this.bEndTag = (bEnd == undefined ? false : bEnd == true); + this.considerHidden = considerHidden || false; + } + DOMWalker.prototype.elem = function () { + return this.node.nodeType === 1 && this.node || null; + }; + DOMWalker.parentNode = function (node) { + if (node === null) + return null; + var p = node.parentNode; + if (node.slotOwner) { + p = node.slotOwner; + } + else if (node.ownerElement) { + p = node.ownerElement; + } + else if (p && p.nodeType === 11) { + if (p.host) { + p = p.host; + } + else { + p = null; + } + } + return p; + }; + DOMWalker.parentElement = function (node) { + var elem = node; + do { + elem = DOMWalker.parentNode(elem); + } while (elem && elem.nodeType !== 1); + return elem; + }; + DOMWalker.assignSlots = function (root) { + var slots = root.querySelectorAll("slot"); + for (var iSlot = 0; iSlot < slots.length; ++iSlot) { + var processSlot = slots[iSlot]; + var assignedNodes = processSlot.assignedNodes(); + for (var iAssigned = 0; iAssigned < assignedNodes.length; ++iAssigned) { + assignedNodes[iAssigned].slotOwner = processSlot; + assignedNodes[iAssigned].slotIndex = iAssigned; + } + } + }; + DOMWalker.firstChildNotOwnedBySlot = function (node) { + var retVal = node.firstChild; + while (retVal && retVal.slotOwner) { + retVal = retVal.nextSibling; + } + return retVal; + }; + DOMWalker.lastChildNotOwnedBySlot = function (node) { + var retVal = node.lastChild; + while (retVal && retVal.slotOwner) { + retVal = retVal.previousSibling; + } + return retVal; + }; + DOMWalker.nextSiblingNotOwnedBySlot = function (node) { + var retVal = node.nextSibling; + while (retVal && retVal.slotOwner) { + retVal = retVal.nextSibling; + } + return retVal; + }; + DOMWalker.previousSiblingNotOwnedBySlot = function (node) { + var retVal = node.previousSibling; + while (retVal && retVal.slotOwner) { + retVal = retVal.previousSibling; + } + return retVal; + }; + DOMWalker.prototype.atRoot = function () { + if (this.node.ownerElement) + return false; + if (this.root === this.node) { + return true; + } + else if (this.root.isSameNode) { + return this.root.isSameNode(this.node); + } + else if (this.root.compareDocumentPosition) { + return this.root.compareDocumentPosition(this.node) === 0; + } + else { + // Not supported in this environment - try our best + return this.node.parentNode === null; + } + }; + DOMWalker.prototype.nextNode = function () { + var _this = this; + var indent = function () { + var s = ""; + for (var idx = 0; idx < _this.indent; ++idx) { + s += " "; + } + return s; + }; + var DBG = false; //this.DEBUGIDX >= 7 && this.DEBUGIDX <= 10; + var startName = this.node.nodeName; + if (!this.node) { + this.bEndTag = false; + return false; + } + do { + //console.log(this.node.nodeName, this.bEndTag?"END":"START", this.node.nodeType === 1 && (this.node as any).getAttribute("id")); + if (!this.bEndTag) { + var iframeNode = this.node; + var elementNode = this.node; + var slotElement = this.node; + if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && this.node.nodeName.toUpperCase() === "IFRAME" + && (this.considerHidden ? VisUtil_1.VisUtil.isNodeVisible(iframeNode) : true) + && iframeNode.contentDocument + && iframeNode.contentDocument.documentElement) { + DBG && console.log("!!!Into Frame"); + var ownerElement = this.node; + this.node = iframeNode.contentDocument.documentElement; + this.node.ownerElement = ownerElement; + } + else if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && (this.considerHidden ? VisUtil_1.VisUtil.isNodeVisible(elementNode) : true) + && elementNode.shadowRoot + && elementNode.shadowRoot.firstChild) { + DBG && console.log("!!!Into shadow root"); + var ownerElement = this.node; + this.node = elementNode.shadowRoot; + this.node.ownerElement = ownerElement; + DOMWalker.assignSlots(this.node); + } + else if (this.node.nodeType === 1 + && elementNode.nodeName.toLowerCase() === "slot" + && slotElement.assignedNodes().length > 0) { + DBG && console.log("!!!Into slot"); + this.node = slotElement.assignedNodes()[0]; + } + else if ((this.node.nodeType === 1 /* Node.ELEMENT_NODE */ || this.node.nodeType === 11 /* Node.DOCUMENT_FRAGMENT_NODE */) + && DOMWalker.firstChildNotOwnedBySlot(this.node)) { + DBG && console.log("!!!First child"); + this.node = DOMWalker.firstChildNotOwnedBySlot(this.node); + } + else { + DBG && console.log("!!!Flip to end tag"); + this.bEndTag = true; + } + } + else { + DBG && console.log("!!!1"); + if (this.atRoot()) { + DBG && console.log("!!!Done at root"); + return false; + } + else if (this.node.slotOwner) { + var slotOwner = this.node.slotOwner; + var nextSlotIndex = this.node.slotIndex + 1; + // delete (this.node as any).slotOwner; + // delete (this.node as any).slotIndex; + if (nextSlotIndex < slotOwner.assignedNodes().length) { + DBG && console.log("!!!Next slot child"); + this.node = slotOwner.assignedNodes()[nextSlotIndex]; + this.bEndTag = false; + } + else { + DBG && console.log("!!!Back up to slot owner"); + this.node = slotOwner; + this.bEndTag = true; + } + } + else if (this.node.ownerElement) { + DBG && console.log("!!!Up to frame owner"); + this.node = this.node.ownerElement; + this.bEndTag = true; + } + else if (DOMWalker.nextSiblingNotOwnedBySlot(this.node)) { + DBG && console.log("!!!Next sibling"); + this.node = DOMWalker.nextSiblingNotOwnedBySlot(this.node); + this.bEndTag = false; + } + else if (this.node.parentNode) { + DBG && console.log("!!!Parent"); + this.node = this.node.parentNode; + this.bEndTag = true; + } + else { + DBG && console.log("!!!Done with walk"); + return false; + } + } + if (DBG && ((this.node.nodeType !== 1 && this.node.nodeType !== 11 && this.node.nodeType !== 3) + || (this.node.nodeType === 1 && this.node.getAttribute("aChecker") === "ACE"))) { + this.DEBUG && console.log(indent() + "<".concat(this.bEndTag ? "/" : "").concat(this.node.nodeName, "> (from ").concat(startName, ") ").concat(this.DEBUGIDX++, " SKIPPED")); + } + } while ((this.node.nodeType !== 1 && this.node.nodeType !== 11 && this.node.nodeType !== 3) + || (this.node.nodeType === 1 && this.node.getAttribute("aChecker") === "ACE")); + if (this.bEndTag) + this.indent -= 2; + this.DEBUG && console.log(indent() + "<".concat(this.bEndTag ? "/" : "").concat(this.node.nodeName, "> (from ").concat(startName, ") ").concat(this.DEBUGIDX++)); + this.DEBUG && this.node.slotOwner && console.log(indent() + "slotOwner: ".concat(this.node.slotOwner.nodeName)); + this.DEBUG && this.node.slotIndex && console.log(indent() + "slotIndex: ".concat(this.node.slotIndex)); + this.DEBUG && this.node.ownerElement && console.log(indent() + "ownerElement: ".concat(this.node.ownerElement.nodeName)); + if (!this.bEndTag) + this.indent += 2; + return true; + }; + DOMWalker.prototype.prevNode = function () { + do { + if (this.bEndTag) { + var iframeNode = this.node; + var elementNode = this.node; + if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && this.node.nodeName.toUpperCase() === "IFRAME" + && (this.considerHidden ? VisUtil_1.VisUtil.isNodeVisible(iframeNode) : true) + && iframeNode.contentDocument + && iframeNode.contentDocument.documentElement) { + var ownerElement = this.node; + this.node = iframeNode.contentDocument.documentElement; + this.node.ownerElement = ownerElement; + } + else if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && (this.considerHidden ? VisUtil_1.VisUtil.isNodeVisible(elementNode) : true) + && elementNode.shadowRoot + && elementNode.shadowRoot.lastChild) { + var ownerElement = this.node; + this.node = elementNode.shadowRoot; + this.node.ownerElement = ownerElement; + DOMWalker.assignSlots(this.node); + } + else if (this.node.nodeType === 1 + && elementNode.nodeName.toLowerCase() === "slot" + && elementNode.assignedNodes().length > 0) { + // Enter slot with assigned nodes - go to last assigned node + var slotElement = elementNode; + this.node = slotElement.assignedNodes()[slotElement.assignedNodes().length - 1]; + } + else if ((this.node.nodeType === 1 /* Node.ELEMENT_NODE */ || this.node.nodeType === 11) + && DOMWalker.lastChildNotOwnedBySlot(this.node)) { + this.node = DOMWalker.lastChildNotOwnedBySlot(this.node); + } + else { + this.bEndTag = false; + } + } + else { + if (this.atRoot()) { + return false; + } + else if (this.node.slotOwner) { + var slotOwner = this.node.slotOwner; + var prevSlotIndex = this.node.slotIndex - 1; + if (prevSlotIndex >= 0) { + this.node = slotOwner.assignedNodes()[prevSlotIndex]; + this.bEndTag = true; + } + else { + this.node = slotOwner; + this.bEndTag = false; + } + } + else if (DOMWalker.previousSiblingNotOwnedBySlot(this.node)) { + this.node = DOMWalker.previousSiblingNotOwnedBySlot(this.node); + this.bEndTag = true; + } + else if (this.node.ownerElement) { + this.node = this.node.ownerElement; + this.bEndTag = false; + } + else if (this.node.parentNode) { + this.node = this.node.parentNode; + this.bEndTag = false; + } + else { + return false; + } + } + } while ((this.node.nodeType !== 1 /* Node.ELEMENT_NODE */ && this.node.nodeType !== 11 && this.node.nodeType !== 3) + || (this.node.nodeType === 1 && this.node.getAttribute("aChecker") === "ACE")); + return true; + }; + return DOMWalker; +}()); +exports.DOMWalker = DOMWalker; + + +/***/ }, + +/***/ "./src/v4/api/IGuideline.ts" +/*!**********************************!*\ + !*** ./src/v4/api/IGuideline.ts ***! + \**********************************/ +(__unused_webpack_module, exports) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.eGuidelineType = exports.eGuidelineCategory = exports.eToolkitLevel = void 0; +var eToolkitLevel; +(function (eToolkitLevel) { + eToolkitLevel["LEVEL_ONE"] = "1"; + eToolkitLevel["LEVEL_TWO"] = "2"; + eToolkitLevel["LEVEL_THREE"] = "3"; + eToolkitLevel["LEVEL_FOUR"] = "4"; +})(eToolkitLevel = exports.eToolkitLevel || (exports.eToolkitLevel = {})); +var eGuidelineCategory; +(function (eGuidelineCategory) { + eGuidelineCategory["ACCESSIBILITY"] = "Accessibility"; + eGuidelineCategory["DESIGN"] = "Design"; + eGuidelineCategory["OTHER"] = "Other"; +})(eGuidelineCategory = exports.eGuidelineCategory || (exports.eGuidelineCategory = {})); +var eGuidelineType; +(function (eGuidelineType) { + eGuidelineType["DEFAULT"] = "default"; + eGuidelineType["EXTENSION"] = "extension"; +})(eGuidelineType = exports.eGuidelineType || (exports.eGuidelineType = {})); + + +/***/ }, + +/***/ "./src/v4/api/IRule.ts" +/*!*****************************!*\ + !*** ./src/v4/api/IRule.ts ***! + \*****************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.eRulesetType = exports.eRuleCategory = exports.eToolkitLevel = exports.RuleManual = exports.RulePotential = exports.RuleFail = exports.RuleRender = exports.RulePass = exports.eRulePolicy = exports.eRuleConfidence = void 0; +var eRuleConfidence; +(function (eRuleConfidence) { + eRuleConfidence["PASS"] = "PASS"; + eRuleConfidence["FAIL"] = "FAIL"; + eRuleConfidence["POTENTIAL"] = "POTENTIAL"; + eRuleConfidence["MANUAL"] = "MANUAL"; +})(eRuleConfidence = exports.eRuleConfidence || (exports.eRuleConfidence = {})); +var eRulePolicy; +(function (eRulePolicy) { + eRulePolicy["VIOLATION"] = "VIOLATION"; + eRulePolicy["RECOMMENDATION"] = "RECOMMENDATION"; + eRulePolicy["INFORMATION"] = "INFORMATION"; +})(eRulePolicy = exports.eRulePolicy || (exports.eRulePolicy = {})); +function RulePass(reasonId, messageArgs, apiArgs) { + if (typeof reasonId === "undefined" || reasonId === null) + throw new Error("Reason ID must be defined"); + return { + value: [eRulePolicy.INFORMATION, eRuleConfidence.PASS], + reasonId: reasonId, + messageArgs: messageArgs || [], + apiArgs: apiArgs || [] + }; +} +exports.RulePass = RulePass; +function RuleRender(reasonId, messageArgs, apiArgs) { + if (typeof reasonId === "undefined" || reasonId === null) + throw new Error("Reason ID must be defined"); + return { + value: [eRulePolicy.INFORMATION, eRuleConfidence.PASS], + reasonId: 0, + messageArgs: messageArgs || [], + apiArgs: apiArgs || [] + }; +} +exports.RuleRender = RuleRender; +function RuleFail(reasonId, messageArgs, apiArgs) { + if (typeof reasonId === "undefined" || reasonId === null) + throw new Error("Reason ID must be defined"); + return { + value: [eRulePolicy.INFORMATION, eRuleConfidence.FAIL], + reasonId: reasonId, + messageArgs: messageArgs || [], + apiArgs: apiArgs || [] + }; +} +exports.RuleFail = RuleFail; +function RulePotential(reasonId, messageArgs, apiArgs) { + if (typeof reasonId === "undefined" || reasonId === null) + throw new Error("Reason ID must be defined"); + return { + value: [eRulePolicy.INFORMATION, eRuleConfidence.POTENTIAL], + reasonId: reasonId, + messageArgs: messageArgs || [], + apiArgs: apiArgs || [] + }; +} +exports.RulePotential = RulePotential; +function RuleManual(reasonId, messageArgs, apiArgs) { + if (typeof reasonId === "undefined" || reasonId === null) + throw new Error("Reason ID must be defined"); + return { + value: [eRulePolicy.INFORMATION, eRuleConfidence.MANUAL], + reasonId: reasonId, + messageArgs: messageArgs || [], + apiArgs: apiArgs || [] + }; +} +exports.RuleManual = RuleManual; +/** + * @deprecated See ./IGuideline + */ +var IGuideline_1 = __webpack_require__(/*! ./IGuideline */ "./src/v4/api/IGuideline.ts"); +Object.defineProperty(exports, "eToolkitLevel", ({ enumerable: true, get: function () { return IGuideline_1.eToolkitLevel; } })); +/** + * @deprecated See ./IGuideline:eGuidelineCategory + */ +var IGuideline_2 = __webpack_require__(/*! ./IGuideline */ "./src/v4/api/IGuideline.ts"); +Object.defineProperty(exports, "eRuleCategory", ({ enumerable: true, get: function () { return IGuideline_2.eGuidelineCategory; } })); +/** + * @deprecated See ./IGuideline:eGuidelineType + */ +var IGuideline_3 = __webpack_require__(/*! ./IGuideline */ "./src/v4/api/IGuideline.ts"); +Object.defineProperty(exports, "eRulesetType", ({ enumerable: true, get: function () { return IGuideline_3.eGuidelineType; } })); + + +/***/ }, + +/***/ "./src/v4/checker/Checker.ts" +/*!***********************************!*\ + !*** ./src/v4/checker/Checker.ts ***! + \***********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Checker = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var Engine_1 = __webpack_require__(/*! ../../v2/common/Engine */ "./src/v2/common/Engine.ts"); +var ARIAMapper_1 = __webpack_require__(/*! ../../v2/aria/ARIAMapper */ "./src/v2/aria/ARIAMapper.ts"); +var rulesets_1 = __webpack_require__(/*! ../rulesets */ "./src/v4/rulesets.ts"); +var checkRulesV4 = __importStar(__webpack_require__(/*! ../rules */ "./src/v4/rules/index.ts")); +var IGuideline_1 = __webpack_require__(/*! ../api/IGuideline */ "./src/v4/api/IGuideline.ts"); +var checkRules = []; +var checkNls = {}; +var checkHelp = {}; +function _initialize() { + var langs = JSON.parse(JSON.stringify(Engine_1.Engine.getLanguages())); + // Default lang to en-US if nothing else specified is found + langs.push("en-US"); + // Process V4 rules into the V2 format + for (var rulename in checkRulesV4) { + // Convert rule + var v4Rule = checkRulesV4[rulename]; + checkRules.push(v4Rule); + // Go backwards because the first lang is the preferred, so + // earlier languages will override later languages + for (var idx = langs.length - 1; idx >= 0; --idx) { + var langId = langs[idx]; + if (langId in v4Rule.messages) { + checkNls[v4Rule.id] = v4Rule.messages[langId]; + checkNls[v4Rule.id][0] = checkNls[v4Rule.id].group; + } + if (langId in v4Rule.help) { + checkHelp[v4Rule.id] = {}; + for (var reasonId in v4Rule.help[langId]) { + checkHelp[v4Rule.id][reasonId] = "/".concat(langId, "/").concat(v4Rule.help[langId][reasonId]); + } + checkNls[v4Rule.id][0] = checkNls[v4Rule.id].group; + } + } + // Convert RS + for (var _i = 0, _a = v4Rule.rulesets; _i < _a.length; _i++) { + var rsSection = _a[_i]; + for (var _b = 0, _c = rulesets_1.a11yRulesets; _b < _c.length; _b++) { + var rs = _c[_b]; + var checkRsIds = typeof rsSection.id === "string" ? [rsSection.id] : rsSection.id; + if (checkRsIds.includes(rs.id)) { + for (var _d = 0, _e = rs.checkpoints; _d < _e.length; _d++) { + var cp = _e[_d]; + var checkCPIds = typeof rsSection.num === "string" ? [rsSection.num] : rsSection.num; + if (checkCPIds.includes(cp.num)) { + cp.rules = cp.rules || []; + cp.rules.push({ + id: v4Rule.id, + reasonCodes: rsSection.reasonCodes, + level: rsSection.level, + toolkitLevel: rsSection.toolkitLevel + }); + } + } + } + } + } + } +} +_initialize(); +var Checker = /** @class */ (function () { + function Checker() { + this.guidelines = []; + /** + * @deprecated Use getGuidelines(). + */ + this.rulesets = this.guidelines; + /** + * @deprecated Use getGuidelineIds(). + */ + this.rulesetIds = []; + this.rulesetRules = {}; + this.ruleLevels = {}; + this.ruleReasonLevels = {}; + this.ruleCategory = {}; + var engine = this.engine = new Engine_1.Engine(); + engine.addMapper(new ARIAMapper_1.ARIAMapper()); + engine.addRules(checkRules); + engine.addNlsMap(checkNls); + engine.addHelpMap(checkHelp); + for (var _i = 0, a11yRulesets_1 = rulesets_1.a11yRulesets; _i < a11yRulesets_1.length; _i++) { + var rs = a11yRulesets_1[_i]; + this.addRuleset(rs); + } + } + /** + * Adds a guideline to the engine. If the id already exists, the previous guideline will be replaced. + * @param guideline + */ + Checker.prototype.addGuideline = function (guideline) { + if (guideline.id in this.rulesetRules) { + this.removeGuideline(guideline.id); + } + this.guidelines.push(guideline); + this.rulesetIds.push(guideline.id); + var ruleIds = []; + for (var _i = 0, _a = guideline.checkpoints; _i < _a.length; _i++) { + var cp = _a[_i]; + cp.rules = cp.rules || []; + for (var _b = 0, _c = cp.rules; _b < _c.length; _b++) { + var rule = _c[_b]; + if (rule.enabled !== false) { + ruleIds.push(rule.id); + //this.ruleLevels[rule.id] = this.ruleLevels[rule.id] || {}; + //this.ruleLevels[rule.id][guideline.id] = rule.level; + this.ruleReasonLevels[rule.id] = this.ruleReasonLevels[rule.id] || {}; + this.ruleReasonLevels[rule.id][guideline.id] = this.ruleReasonLevels[rule.id][guideline.id] || {}; + var code = rule.reasonCodes ? rule.reasonCodes.join('--') : "None"; + this.ruleReasonLevels[rule.id][guideline.id][code] = rule.level; + this.ruleCategory[rule.id] = this.ruleCategory[rule.id] || {}; + this.ruleCategory[rule.id][guideline.id] = guideline.category; + } + } + } + this.rulesetRules[guideline.id] = ruleIds; + }; + /** + * Enable a rule for all guidelines + * @param ruleId + */ + Checker.prototype.enableRule = function (ruleId) { + for (var _i = 0, _a = this.getGuidelines(); _i < _a.length; _i++) { + var guideline = _a[_i]; + var updated = false; + for (var _b = 0, _c = guideline.checkpoints; _b < _c.length; _b++) { + var cp = _c[_b]; + for (var _d = 0, _e = cp.rules; _d < _e.length; _d++) { + var rule = _e[_d]; + if (rule.enabled === false) { + updated = true; + delete rule.enabled; + } + } + } + if (updated) { + this.addGuideline(guideline); + } + } + }; + /** + * Disable a rule for all guidelines + * @param ruleId + */ + Checker.prototype.disableRule = function (ruleId) { + for (var _i = 0, _a = this.getGuidelines(); _i < _a.length; _i++) { + var guideline = _a[_i]; + var updated = false; + for (var _b = 0, _c = guideline.checkpoints; _b < _c.length; _b++) { + var cp = _c[_b]; + for (var _d = 0, _e = cp.rules; _d < _e.length; _d++) { + var rule = _e[_d]; + if (rule.enabled !== false) { + updated = true; + rule.enabled = false; + } + } + } + if (updated) { + this.addGuideline(guideline); + } + } + }; + /** + * Remove a guideline from the engine + * + * Generally, there isn't a good reason to do this. Users should just not select the guideline as an option in check + * @param guidelineId + */ + Checker.prototype.removeGuideline = function (guidelineId) { + if (guidelineId in this.rulesetRules) { + delete this.rulesetRules[guidelineId]; + this.rulesets = this.guidelines = this.guidelines.filter(function (guideline) { return guideline.id !== guidelineId; }); + this.rulesetIds = this.getGuidelineIds(); + } + }; + /** + * Get the guidelines available in the engine + * @returns + */ + Checker.prototype.getGuidelines = function () { + return JSON.parse(JSON.stringify(this.guidelines)); + }; + /** + * Get the ids of the guidelines available in the engine + * @returns + */ + Checker.prototype.getGuidelineIds = function () { + return this.guidelines.map(function (guideline) { return guideline.id; }); + }; + /** + * + * @deprecated See addGuideline + */ + Checker.prototype.addRuleset = function (rs) { + this.addGuideline(rs); + }; + Checker.prototype.enableSourceMap = function (enable) { + this.engine.enableSourceMap(enable); + }; + Checker.prototype.isSourceMapEnabled = function () { + return this.engine.isSourceMapEnabled(); + }; + /** + * Perform a check of the specified node/document + * @param node DOMNode or Document on which to run the check + * @param guidelineIds Guideline ids to check with to specify which rules to run + * @returns + */ + Checker.prototype.check = function (node, guidelineIds) { + // Determine which rules to run + var ruleIds = []; + // Fix the input + if (!guidelineIds) { + ruleIds = this.engine.getRulesIds(); + } + else { + if (typeof guidelineIds === "string") { + guidelineIds = [guidelineIds]; + } + for (var _i = 0, guidelineIds_1 = guidelineIds; _i < guidelineIds_1.length; _i++) { + var rsId = guidelineIds_1[_i]; + if (rsId in this.rulesetRules) { + ruleIds = ruleIds.concat(this.rulesetRules[rsId]); + } + } + } + this.engine.enableRules(ruleIds); + // Add the report levels + var myThis = this; + return this.engine.run(node) + .then(function (report) { + report.nls = {}; + for (var _i = 0, _a = report.results; _i < _a.length; _i++) { + var result = _a[_i]; + if (result.ruleId in checkNls) { + report.nls[result.ruleId] = report.nls[result.ruleId] || { + 0: checkNls[result.ruleId][0] + }; + if (result.reasonId in checkNls[result.ruleId]) { + report.nls[result.ruleId][result.reasonId] = checkNls[result.ruleId][result.reasonId]; + } + } + //result.value[0] = myThis.getLevel(guidelineIds as string[], result.ruleId); + var code = result.reasonId ? result.reasonId : "None"; + result.value[0] = myThis.getReasonLevel(guidelineIds, result.ruleId, code); + result.category = myThis.getCategory(guidelineIds, result.ruleId); + delete result.path.css; + } + return report; + }); + }; + Checker.prototype.getLevel = function (rsIds, ruleId) { + if (!rsIds) + return IRule_1.eRulePolicy.INFORMATION; + var rsInfo = this.ruleLevels[ruleId]; + var retVal = null; + if (rsIds) { + if (!(ruleId in this.ruleLevels)) { + throw new Error("Rule triggered for which we have no rule level information: " + ruleId); + } + for (var _i = 0, rsIds_1 = rsIds; _i < rsIds_1.length; _i++) { + var rsId = rsIds_1[_i]; + if (rsId in rsInfo) { + if (rsInfo[rsId] === IRule_1.eRulePolicy.VIOLATION) { + retVal = IRule_1.eRulePolicy.VIOLATION; + } + else if (rsInfo[rsId] === IRule_1.eRulePolicy.RECOMMENDATION && retVal === null) { + retVal = IRule_1.eRulePolicy.RECOMMENDATION; + } + else if (retVal === null) { + retVal = IRule_1.eRulePolicy.INFORMATION; + } + } + } + } + if (retVal === null) { + throw new Error("Rule triggered for which we have no rule level information: " + ruleId); + } + return retVal; + }; + Checker.prototype.getReasonLevel = function (rsIds, ruleId, reasonCode) { + if (!rsIds) + return IRule_1.eRulePolicy.INFORMATION; + var rsInfo = this.ruleReasonLevels[ruleId]; + var retVal = null; + if (rsIds) { + if (!(ruleId in this.ruleReasonLevels)) { + throw new Error("Rule triggered for which we have no rule level information " + ruleId); + } + var _loop_1 = function (rsId) { + if (rsId in rsInfo) { + var reCode_1 = new RegExp("(^|--)".concat(reasonCode, "($|--)")); + Object.keys(rsInfo[rsId]).forEach(function (code) { + var level = null; + if (code === 'None') + level = rsInfo[rsId]["None"]; + else if (reCode_1.test(code)) + level = rsInfo[rsId][code]; + if (level !== null) { + if (level === IRule_1.eRulePolicy.VIOLATION) { + retVal = IRule_1.eRulePolicy.VIOLATION; + } + else if (level === IRule_1.eRulePolicy.RECOMMENDATION && retVal === null) { + retVal = IRule_1.eRulePolicy.RECOMMENDATION; + } + else if (retVal === null) { + retVal = IRule_1.eRulePolicy.INFORMATION; + } + } + }); + if (retVal === null) { + retVal = IRule_1.eRulePolicy.INFORMATION; + } + } + }; + for (var _i = 0, rsIds_2 = rsIds; _i < rsIds_2.length; _i++) { + var rsId = rsIds_2[_i]; + _loop_1(rsId); + } + } + if (retVal === null) { + throw new Error("Rule triggered for which we have no rule level information: " + ruleId); + } + return retVal; + }; + Checker.prototype.getCategory = function (rsIds, ruleId) { + var rsInfo = this.ruleCategory[ruleId]; + var retVal = ""; + if (!(ruleId in this.ruleCategory)) { + return IGuideline_1.eGuidelineCategory.OTHER; + } + if (!rsIds) { + rsIds = this.getGuidelineIds(); + } + for (var _i = 0, rsIds_3 = rsIds; _i < rsIds_3.length; _i++) { + var rsId = rsIds_3[_i]; + if (rsId in rsInfo) { + return rsInfo[rsId]; + } + } + return IGuideline_1.eGuidelineCategory.OTHER; + }; + return Checker; +}()); +exports.Checker = Checker; + + +/***/ }, + +/***/ "./src/v4/rules/a_target_warning.ts" +/*!******************************************!*\ + !*** ./src/v4/rules/a_target_warning.ts ***! + \******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.a_target_warning = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.a_target_warning = { + id: "a_target_warning", + context: "dom:a[target],dom:area[target],dom:base[target]", + refactor: { + "WCAG20_A_TargetAndText": { + "Pass_0": "pass", + "Potential_1": "potential_warn" + } + }, + help: { + "en-US": { + "group": "a_target_warning.html", + "pass": "a_target_warning.html", + "potential_warn": "a_target_warning.html" + } + }, + messages: { + "en-US": { + "group": "Users should be warned in advance if their input action will open a new window", + "pass": "The user is warned in advance that the input action opens a new window", + "potential_warn": "Inform the user when their input action will open a new window" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "3.2.2", + level: IRule_2.eRulePolicy.RECOMMENDATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // skip the rule if it's AT hidden and not tabbable + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) && !CommonUtil_1.CommonUtil.isTabbable(ruleContext)) + return null; + var params = { + paramWinText: { + value: ["new window", "new tab"], + type: "array" + } + }; + var tStr = ruleContext.getAttribute("target"); + var passed = tStr == "_parent" || tStr == "_self" || tStr == "_top" || CommonUtil_1.CommonUtil.getFrameByName(ruleContext, tStr) != null; + if (!passed) { + // Name is not part of this frameset – must have potential to create new window? + // See if a new window is mentioned + var textStr = CommonUtil_1.CommonUtil.getInnerText(ruleContext); + if (ruleContext.hasAttribute("title")) + textStr += " " + ruleContext.getAttribute("title"); + // Check aria-describedby for warning text + if (ruleContext.hasAttribute("aria-describedby")) { + var describedbyIds = ruleContext.getAttribute("aria-describedby").trim().split(/\s+/); + for (var _i = 0, describedbyIds_1 = describedbyIds; _i < describedbyIds_1.length; _i++) { + var id = describedbyIds_1[_i]; + var referencedElem = fragment_1.FragmentUtil.getById(ruleContext, id); + if (referencedElem) { + var describedText = CommonUtil_1.CommonUtil.getInnerText(referencedElem); + if (describedText && describedText.trim().length > 0) { + textStr += " " + describedText; + } + } + } + } + for (var i = 0; !passed && i < params.paramWinText.value.length; ++i) + if (textStr.indexOf(params.paramWinText.value[i]) != -1) + passed = true; + } + return passed ? (0, IRule_1.RulePass)("pass") : (0, IRule_1.RulePotential)("potential_warn"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/a_text_purpose.ts" +/*!****************************************!*\ + !*** ./src/v4/rules/a_text_purpose.ts ***! + \****************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.a_text_purpose = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +exports.a_text_purpose = { + id: "a_text_purpose", + // doc-biblioref is a link + context: "aria:link,aria:doc-biblioref", + refactor: { + "WCAG20_A_HasText": { + "Pass_0": "pass", + "Fail_1": "fail_acc_name" + } + }, + help: { + "en-US": { + "group": "a_text_purpose.html", + "pass": "a_text_purpose.html", + "fail_acc_name": "a_text_purpose.html" + } + }, + messages: { + "en-US": { + "group": "Hyperlinks must have an accessible name for their purpose", + "pass": "Hyperlink has a description of its purpose", + "fail_acc_name": "Hyperlink has no link text, label or image with a text alternative" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: ["2.4.4", "4.1.2"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: "c487ae", + run: function (context, options) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) { + return null; + } + // Rule only passes if an element has inner content, + // in the case that there is only hidden content under the the element it is a violation + var accName_pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + var passed = (accName_pair && accName_pair.name && accName_pair.name.trim().length > 0) + /**ARIAMapper.computeName(ruleContext).trim().length > 0*/ + || CommonUtil_1.CommonUtil.nonTabableChildCheck(ruleContext); + if (!passed) { + return (0, IRule_1.RuleFail)("fail_acc_name"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/applet_alt_exists.ts" +/*!*******************************************!*\ + !*** ./src/v4/rules/applet_alt_exists.ts ***! + \*******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.applet_alt_exists = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.applet_alt_exists = { + id: "applet_alt_exists", + context: "dom:applet", + refactor: { + "WCAG20_Applet_HasAlt": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3" + } + }, + help: { + "en-US": { + "group": "applet_alt_exists.html", + "Pass_0": "applet_alt_exists.html", + "Fail_1": "applet_alt_exists.html", + "Fail_2": "applet_alt_exists.html", + "Fail_3": "applet_alt_exists.html" + } + }, + messages: { + "en-US": { + "group": "<applet> elements must provide an 'alt' attribute and an alternative description", + "Pass_0": "Rule Passed", + "Fail_1": "An <applet> element does not have an 'alt' attribute that provides a short text alternative", + "Fail_2": "The 'alt' attribute value for an <applet> element duplicates the 'code' attribute", + "Fail_3": "An <applet> element provides alternative text, but does not provide inner content" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "1.1.1", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // JCH - NO OUT OF SCOPE hidden in context + if (!CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "alt")) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + var alt = ruleContext.getAttribute("alt").trim(); + if (ruleContext.hasAttribute("code") && alt == ruleContext.getAttribute("code").trim()) { + return (0, IRule_1.RuleFail)("Fail_2"); + } + else if (!CommonUtil_1.CommonUtil.hasInnerContentHidden(ruleContext)) { + return (0, IRule_1.RuleFail)("Fail_3"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/application_content_accessible.ts" +/*!********************************************************!*\ + !*** ./src/v4/rules/application_content_accessible.ts ***! + \********************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.application_content_accessible = void 0; +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.application_content_accessible = { + id: "application_content_accessible", + context: "aria:application", + refactor: { + "HAAC_Application_Role_Text": { + 0: "HAAC_Application_Role_Text.html", + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + 0: "application_content_accessible.html", + "Pass_0": "application_content_accessible.html", + "Potential_1": "application_content_accessible.html" + } + }, + messages: { + "en-US": { + "group": "Non-decorative static text and image content within an element with \"application\" role must be accessible", + "Pass_0": "Rule Passed", + "Potential_1": "Verify that the non-decorative static text and image content within an element with \"application\" role are accessible" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: ["1.1.1", "2.1.1"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = true; + var children = ruleContext.childNodes; + for (var i = 0; passed && i < children.length; i++) { + if (children[i].nodeType === 1) { + if (VisUtil_1.VisUtil.isNodeVisible(children[i])) { + passed = AriaUtil_1.AriaUtil.hasRoleInSemantics(children[i], "document") || AriaUtil_1.AriaUtil.hasRoleInSemantics(children[i], "article"); + } + } + else if (children[i].nodeType === 3) { + passed = children[i].nodeValue.trim().length === 0; + } + } + return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/area_alt_exists.ts" +/*!*****************************************!*\ + !*** ./src/v4/rules/area_alt_exists.ts ***! + \*****************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.area_alt_exists = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.area_alt_exists = { + id: "area_alt_exists", + context: "dom:area", + refactor: { + "WCAG20_Area_HasAlt": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "area_alt_exists.html", + "Pass_0": "area_alt_exists.html", + "Fail_1": "area_alt_exists.html" + } + }, + messages: { + "en-US": { + "group": "<area> elements in an image map must have a text alternative", + "Pass_0": "Rule Passed", + "Fail_1": "<area> element in an image map has no text alternative" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "1.1.1", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // JCH - NO OUT OF SCOPE hidden in context + if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "alt")) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_accessiblename_exists.ts" +/*!****************************************************!*\ + !*** ./src/v4/rules/aria_accessiblename_exists.ts ***! + \****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_accessiblename_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +exports.aria_accessiblename_exists = { + id: "aria_accessiblename_exists", + context: "aria:columnheader, aria:heading, aria:rowheader, aria:graphics-document,aria:graphics-symbol, aria:img,aria:image, doc-backlink, doc-biblioentry, doc-biblioref, doc-glossref, doc-noteref, doc-pagebreak, doc-example", + help: { + "en-US": { + "pass": "aria_accessiblename_exists.html", + "fail_no_accessible_name": "aria_accessiblename_exists.html", + "fail_no_accessible_name_image": "aria_accessiblename_exists.html", + "group": "aria_accessiblename_exists.html" + } + }, + messages: { + "en-US": { + "pass": "An accessible name is provided for the element", + "fail_no_accessible_name": "Element <{0}> with \"{1}\" role has no accessible name", + "fail_no_accessible_name_image": "Element <{0}> with \"{1}\" role has no accessible name", + "group": "Elements with certain roles should have accessible names" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE, + reasonCodes: ["fail_no_accessible_name"] + }, + { + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["ARIA"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE, + reasonCodes: ["fail_no_accessible_name_image"] + }], + act: [{ "23a2a8": { "fail_no_accessible_name_image": "fail" } }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLocaleLowerCase(); + // svg element is handled in svg_graphics_labbelled rule and image rules + if (nodeName === 'svg' || nodeName === 'img') + return; + // when table element with a caption as first child + if (nodeName === 'table' + && ruleContext.firstElementChild && ruleContext.firstElementChild.nodeName.toLowerCase() === 'caption' + && ruleContext.firstElementChild.textContent && ruleContext.firstElementChild.textContent.trim().length > 0) + return (0, IRule_1.RulePass)("pass"); + var invalidRoles = AriaUtil_1.AriaUtil.getRolesUndefinedByAria(ruleContext); + if (invalidRoles && invalidRoles.length > 0) + return null; + var deprecatedRoles = AriaUtil_1.AriaUtil.getDeprecatedAriaRoles(ruleContext); + if (deprecatedRoles && deprecatedRoles.length > 0) + return null; + var deprecatedAttributes = AriaUtil_1.AriaUtil.getDeprecatedAriaAttributes(ruleContext); + if (deprecatedAttributes && deprecatedAttributes.length > 0) + return null; + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + if (!role || !ARIADefinitions_1.ARIADefinitions.designPatterns[role] || !ARIADefinitions_1.ARIADefinitions.designPatterns[role].nameRequired) + return null; + var name_pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + if (!name_pair || !name_pair.name || name_pair.name.trim().length === 0) { + if (role === 'img' || role === 'image') + return (0, IRule_1.RuleFail)("fail_no_accessible_name_image", [ruleContext.nodeName.toLowerCase(), role]); + return (0, IRule_1.RuleFail)("fail_no_accessible_name", [ruleContext.nodeName.toLowerCase(), role]); + } + return (0, IRule_1.RulePass)("pass"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_activedescendant_tabindex_valid.ts" +/*!**************************************************************!*\ + !*** ./src/v4/rules/aria_activedescendant_tabindex_valid.ts ***! + \**************************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_activedescendant_tabindex_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.aria_activedescendant_tabindex_valid = { + id: "aria_activedescendant_tabindex_valid", + context: "dom:*[aria-activedescendant]", + refactor: { + "Rpt_Aria_InvalidTabindexForActivedescendant": { + "pass": "pass", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "pass": "aria_activedescendant_tabindex_valid.html", + "Fail_1": "aria_activedescendant_tabindex_valid.html", + "group": "aria_activedescendant_tabindex_valid.html" + } + }, + messages: { + "en-US": { + "pass": "Rule Passed", + "Fail_1": "The <{0}> element using 'aria-activedescendant' set to \"{1}\" is not tabbable", + "group": "Element using 'aria-activedescendant' property should be tabbable" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = false; + var nodeName = ruleContext.nodeName.toLowerCase(); + // Rule not supported on mobile + if (ruleContext.hasAttribute("class") && ruleContext.getAttribute("class").substring(0, 3) == "mbl") { + return null; + } + // Handle the case where the element is hidden by a disabled HTML5 attribute or aria-disabled: + // 1. In the case that this element has a disabled attribute and the element supports it, we mark this rule as passed. + // 2. In the case that this element has an aria-disabled attribute then, we mark this rule as passed. + // For both of the cases above we do not need to perform any further checks, as the element is disabled in some form or another. + if (CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) { + return null; + } + //ignore if the attribute 'aria-activedescendant' is blank + if (ruleContext.getAttribute("aria-activedescendant").trim().length === 0) + return; + // If the tabindex attribute is provided then verify that it is 0 or -1 + passed = CommonUtil_1.CommonUtil.isTabbable(ruleContext); + // pass if one of the children is tabbable. in this case, the tab will stop on the first tabbable element + if (!passed) + passed = CommonUtil_1.CommonUtil.getTabbableChildren(ruleContext) > 0; + // Build array for node token + var retToken1 = new Array(); + retToken1.push(nodeName); + // Build array for id referenced by aria-activedescendant + var retToken2 = new Array(); + retToken2.push(ruleContext.getAttribute("aria-activedescendant").split(" ").join(", ")); + //return new ValidationResult(passed, [ruleContext], '', '', passed == true ? [] : [retToken1, retToken2]); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", [retToken1.toString(), retToken2.toString()]); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_activedescendant_valid.ts" +/*!*****************************************************!*\ + !*** ./src/v4/rules/aria_activedescendant_valid.ts ***! + \*****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_activedescendant_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +exports.aria_activedescendant_valid = { + id: "aria_activedescendant_valid", + context: "dom:*[aria-activedescendant]", + refactor: { + "HAAC_ActiveDescendantCheck": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3" + // "Fail_4": "Fail_4" + } + }, + help: { + "en-US": { + "Pass_0": "aria_activedescendant_valid.html", + "Fail_1": "aria_activedescendant_valid.html", + "Fail_2": "aria_activedescendant_valid.html", + "Fail_3": "aria_activedescendant_valid.html", + // "Fail_4": "aria_activedescendant_valid.html", + "group": "aria_activedescendant_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The 'aria-activedescendant' property is empty", + "Fail_2": "The 'aria-activedescendant' property references a hidden node", + "Fail_3": "Element is not a combobox, and the referenced active-descendant element is not a valid descendant", + // "Fail_4": "Element is a combobox, and the referenced active-descendant element is not controlled by this component", + "group": "The 'aria-activedescendant' property must reference the 'id' of a non-empty, non-hidden active child element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // combobox active descendants handled by 'combobox_active_descendant' + if (AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "combobox")) { + return null; + } + var descendant_id = AriaUtil_1.AriaUtil.getAriaAttribute(ruleContext, "aria-activedescendant"); + // POF1: The attribute is empty + if (!descendant_id || descendant_id.trim() === "") { + return (0, IRule_1.RuleFail)("Fail_1"); + } + var descendant = fragment_1.FragmentUtil.getById(ruleContext, descendant_id.trim()); + if (!descendant || DOMUtil_1.DOMUtil.sameNode(descendant_id, ruleContext)) { + // The referenced element doesn't exist. We let 1077 to trigger the error + return null; + } + if (!VisUtil_1.VisUtil.isNodeVisible(descendant)) { + // POF2: aria-activedescendant references a hidden node + return (0, IRule_1.RuleFail)("Fail_2"); + } + // 1. The value of aria-activedescendant refers to an element that is either a descendant of + // the element with DOM focus + if (ruleContext.contains(descendant)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + var pofId = 2; + // or is a logical descendant as indicated by the aria-owns attribute. + if (ruleContext.hasAttribute("aria-owns")) { + var owned_ids = CommonUtil_1.CommonUtil.normalizeSpacing(ruleContext.getAttribute("aria-owns").trim()).split(" "); + for (var i = 0; i < owned_ids.length; i++) { + var owned_ele = fragment_1.FragmentUtil.getById(ruleContext, owned_ids[i]); + if (owned_ele && !DOMUtil_1.DOMUtil.sameNode(owned_ele, ruleContext) && owned_ele.contains(descendant)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + } + } + // 2. The element with DOM focus is a textbox with aria-controls referring to an element that + // supports aria-activedescendant, and the value of aria-activedescendant specified for the + // textbox refers to either a descendant of the element controlled by the textbox or is a logical + // descendant of that controlled element as indicated by the aria-owns attribute. + // + if (AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "textbox") && ruleContext.hasAttribute("aria-controls")) { + pofId = 3; + var controlled_ids = CommonUtil_1.CommonUtil.normalizeSpacing(ruleContext.getAttribute("aria-controls").trim()).split(" "); + for (var i = 0; i < controlled_ids.length; i++) { + var controlled_ele = fragment_1.FragmentUtil.getById(ruleContext, controlled_ids[i]); + if (controlled_ele && !DOMUtil_1.DOMUtil.sameNode(controlled_ele, ruleContext) && controlled_ele.contains(descendant)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + if (controlled_ele.hasAttribute("aria-owns")) { + var owns_ids = CommonUtil_1.CommonUtil.normalizeSpacing(controlled_ele.getAttribute("aria-owns").trim()).split(" "); + for (var j = 0; j < owns_ids.length; j++) { + var owned_ele = fragment_1.FragmentUtil.getById(ruleContext, owns_ids[j]); + if (owned_ele && !DOMUtil_1.DOMUtil.sameNode(owned_ele, ruleContext) && owned_ele.contains(descendant)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + } + } + } + } + // POF3: I'm not a combobox, and the referenced active-descendant is not a descendant and not owned by the element + // that referenced it. + if (pofId == 3) { + return (0, IRule_1.RuleFail)("Fail_3"); + } + return null; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_application_label_unique.ts" +/*!*******************************************************!*\ + !*** ./src/v4/rules/aria_application_label_unique.ts ***! + \*******************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_application_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_application_label_unique = { + id: "aria_application_label_unique", + context: "aria:application", + refactor: { + "Rpt_Aria_MultipleApplicationLandmarks": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_application_label_unique.html", + "fail_label_not_unique": "aria_application_label_unique.html", + "group": "aria_application_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"application\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"application\" role do not have unique labels", + "group": "Each element with \"application\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "application"); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_application_labelled.ts" +/*!***************************************************!*\ + !*** ./src/v4/rules/aria_application_labelled.ts ***! + \***************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_application_labelled = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_application_labelled = { + id: "aria_application_labelled", + context: "aria:application", + refactor: { + "Rpt_Aria_ApplicationLandmarkLabel": { + "Pass_0": "pass", + "Fail_1": "fail_no_label" + } + }, + help: { + "en-US": { + "pass": "aria_application_labelled.html", + "fail_no_label": "aria_application_labelled.html", + "group": "aria_application_labelled.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"application\" role has a label that describes its purpose", + "fail_no_label": "Element with \"application\" role does not have a label", + "group": "Each element with \"application\" role must have a label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + if (!pair) { + return (0, IRule_1.RuleFail)("fail_no_label"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_article_label_unique.ts" +/*!***************************************************!*\ + !*** ./src/v4/rules/aria_article_label_unique.ts ***! + \***************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_article_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +exports.aria_article_label_unique = { + id: "aria_article_label_unique", + context: "aria:article", + refactor: { + "Rpt_Aria_MultipleArticleRoles_Implicit": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_article_label_unique.html", + "fail_label_not_unique": "aria_article_label_unique.html", + "group": "aria_article_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"article\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"article\" role do not have unique labels", + "group": "Each element with \"article\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "article"); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_attribute_allowed.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/aria_attribute_allowed.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_allowed = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +exports.aria_attribute_allowed = { + id: "aria_attribute_allowed", + context: "dom:*", + refactor: { + "Rpt_Aria_ValidProperty": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "aria_attribute_allowed.html", + "Pass_0": "aria_attribute_allowed.html", + "Fail_1": "aria_attribute_allowed.html" + } + }, + messages: { + "en-US": { + "group": "ARIA attributes must be valid for the element's role", + "Pass_0": "Rule Passed", + "Fail_1": "The attribute(s) '{0}' referenced by the element <{1}> is not a valid ARIA state or property" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "4.1.2", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: "5f99a7", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var contextAttributes = ruleContext.attributes; + // This gets all elements with attributes so we still have some + // Out of Scope since not all attributes are aria + if (contextAttributes) { + var propertyDataTypes = ARIADefinitions_1.ARIADefinitions.propertyDataTypes; + var failedProperties = ""; + var testedProperties = 0; + for (var i = 0, length_1 = contextAttributes.length; i < length_1; i++) { + var attrName = contextAttributes[i].name; + if (AriaUtil_1.AriaUtil.isDefinedAriaAttribute(ruleContext, attrName)) { + testedProperties++; + // Now we just have aria attributes which can + // pass or fail based on whether there property is valid + var dataTypes = propertyDataTypes[attrName]; + if (!dataTypes) { // if property is not in valid property list + // create failedProperties comma sep list + if (failedProperties.length == 0) { + failedProperties = attrName; + } + else { + failedProperties = failedProperties + ", " + attrName; + } + } + } + } + if (testedProperties == 0) { + return null; + } + else if (failedProperties.length != 0) { + return (0, IRule_1.RuleFail)("Fail_1", [failedProperties, ruleContext.nodeName.toLowerCase()]); + } + else { + //return RulePass(1); + return (0, IRule_1.RulePass)("Pass_0"); + } + } + else { + return null; + } + // JCH - passing is based on all attributes not just aria attributes + // leading to OVER COUNTING so moved pass up + //return RulePass(1); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_attribute_conflict.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/aria_attribute_conflict.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_conflict = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.aria_attribute_conflict = { + id: "aria_attribute_conflict", + context: "dom:*[aria-required], dom:*[aria-autocomplete], dom:*[aria-readonly], dom:*[aria-disabled], dom:*[aria-placeholder]" + + ", dom:*[aria-checked], dom:*[aria-hidden], dom:*[aria-valuemax], dom:*[aria-valuemin], dom:*[aria-colspan]" + + ", dom:*[aria-rowspan]", + help: { + "en-US": { + // "pass": "aria_attribute_conflict.html", + "fail_conflict": "aria_attribute_conflict.html", + "group": "aria_attribute_conflict.html" + } + }, + messages: { + "en-US": { + // "pass": "The ARIA attribute is not conflict with the corresponding HTML attribute", + "fail_conflict": "The ARIA attribute \"{0}\" is in conflict with the corresponding HTML attribute \"{1}\"", + "group": "An ARIA attribute must not conflict with the corresponding HTML attribute" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // dependency check: if the ARIA attribute is completely invalid, skip this check + var invalidAttributes = AriaUtil_1.AriaUtil.getInvalidAriaAttributes(ruleContext); + if (invalidAttributes && invalidAttributes.length > 0) + return null; + var ret = []; + var ariaAttributes = AriaUtil_1.AriaUtil.getUserDefinedAriaAttributes(ruleContext); + if (!ariaAttributes || ariaAttributes.length === 0) + return null; + var conflictAttributes = AriaUtil_1.AriaUtil.getConflictAriaAndHtmlAttributes(ruleContext); + for (var i = 0; i < conflictAttributes.length; i++) { + ret.push((0, IRule_1.RuleFail)("fail_conflict", [conflictAttributes[i]['ariaAttr'], conflictAttributes[i]['htmlAttr']])); + if (ariaAttributes.includes(conflictAttributes[i]['ariaAttr'])) + CommonUtil_1.CommonUtil.reduceArrayItemList([conflictAttributes[i]['ariaAttr']], ariaAttributes); + } + if (ret.length > 0) + return ret; + return null; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_attribute_deprecated.ts" +/*!***************************************************!*\ + !*** ./src/v4/rules/aria_attribute_deprecated.ts ***! + \***************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_deprecated = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +exports.aria_attribute_deprecated = { + id: "aria_attribute_deprecated", + context: "dom:*", + help: { + "en-US": { + // "pass": "aria_attribute_deprecated.html", + "fail_aria_role": "aria_attribute_deprecated.html", + "fail_aria_attr": "aria_attribute_deprecated.html", + "fail_role_attr": "aria_attribute_deprecated.html", + "group": "aria_attribute_deprecated.html" + } + }, + messages: { + "en-US": { + // "pass": "The ARIA roles and attribute are used per specification", + "fail_aria_role": "The ARIA role \"{0}\" is deprecated in the ARIA specification", + "fail_aria_attr": "The ARIA attributes \"{0}\" are deprecated in the ARIA specification", + "fail_role_attr": "The ARIA attributes \"{0}\" are deprecated for the role \"{1}\" in the ARIA specification", + "group": "No deprecated ARIA role or attribute should be used" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["ARIA"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var ret = []; + var deprecatedRoles = AriaUtil_1.AriaUtil.getDeprecatedAriaRoles(ruleContext); + if (deprecatedRoles && deprecatedRoles.length > 0) { + for (var i = 0; i < deprecatedRoles.length; i++) + ret.push((0, IRule_1.RuleFail)('fail_aria_role', [deprecatedRoles[i]])); + } + var deprecatedAttributes = AriaUtil_1.AriaUtil.getDeprecatedAriaAttributes(ruleContext); + if (deprecatedAttributes && deprecatedAttributes.length > 0) { + for (var i = 0; i < deprecatedAttributes.length; i++) { + // "role":"any", "attribute":ariaAttrs[i]} + if (deprecatedAttributes[i].role === 'any') + ret.push((0, IRule_1.RuleFail)('fail_aria_attr', [deprecatedAttributes[i].attribute])); + else + ret.push((0, IRule_1.RuleFail)('fail_role_attr', [deprecatedAttributes[i].attribute, deprecatedAttributes[i].role])); + } + } + if (ret.length > 0) + return ret; + return null; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_attribute_exists.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/aria_attribute_exists.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_attribute_exists = { + id: "aria_attribute_exists", + context: "dom:*[role]", + dependencies: ["aria_role_allowed"], + refactor: { + "Rpt_Aria_EmptyPropertyValue": { + "pass": "pass", + "fail_empty_attribute": "fail_empty_attribute" + } + }, + help: { + "en-US": { + "pass": "aria_attribute_exists.html", + "fail_empty_attribute": "aria_attribute_exists.html", + "group": "aria_attribute_exists.html" + } + }, + messages: { + "en-US": { + "pass": "Rule Passed", + "fail_empty_attribute": "The element attribute(s): '{0}' value is empty", + "group": "When specifying a required ARIA attribute, the value must not be empty" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: ["6a7281"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return; + var attrNameArr = new Array(); + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + var hasAttribute = CommonUtil_1.CommonUtil.hasAttribute; + var testedProperties = 0; + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + if (!role) + return; + if (designPatterns[role] && AriaUtil_1.AriaUtil.getRoleRequiredProperties(role, ruleContext) != null) { + var requiredRoleProps = AriaUtil_1.AriaUtil.getRoleRequiredProperties(role, ruleContext); + for (var i = 0, length_1 = requiredRoleProps.length; i < length_1; i++) { + var attribute = requiredRoleProps[i]; + if (hasAttribute(ruleContext, attribute)) { + testedProperties++; + var nodeValue = CommonUtil_1.CommonUtil.normalizeSpacing(ruleContext.getAttribute(requiredRoleProps[i])); + if (nodeValue.length == 0) + attrNameArr.push(requiredRoleProps[i]); + } + else if (requiredRoleProps[i] == "aria-labelledby") { + if ((role == "radiogroup") && (hasAttribute(ruleContext, "aria-label"))) { + testedProperties++; + var nodeValue = CommonUtil_1.CommonUtil.normalizeSpacing(ruleContext.getAttribute("aria-label")); + if (nodeValue.length == 0) + attrNameArr.push("aria-label"); + } + } + else if (requiredRoleProps[i] == "aria-valuenow") { + if ((role == "progressbar") && (hasAttribute(ruleContext, "aria-valuetext"))) { + testedProperties++; + var nodeValue = CommonUtil_1.CommonUtil.normalizeSpacing(ruleContext.getAttribute("aria-valuetext")); + if (nodeValue.length == 0) + attrNameArr.push("aria-valuetext"); + } + } + } + } + if (designPatterns[role]) { + var tagProperty = AriaUtil_1.AriaUtil.getElementAriaProperty(ruleContext); + var permittedRoles = []; + permittedRoles.push(role); + var allowedAttributes = AriaUtil_1.AriaUtil.getAllowedAriaAttributes(ruleContext, permittedRoles, tagProperty); + for (var i = 0, length_2 = allowedAttributes.length; i < length_2; i++) { + var attribute = allowedAttributes[i]; + if (attribute == "aria-checked" || attribute == "aria-selected" || + attribute == "aria-expanded" || attribute == "aria-orientation" || + attribute == "aria-level") { + if (hasAttribute(ruleContext, attribute)) { + testedProperties++; + var nodeValue = CommonUtil_1.CommonUtil.normalizeSpacing(ruleContext.getAttribute(attribute)); + if (nodeValue.length == 0 && !attrNameArr.includes(attribute)) { + attrNameArr.push(attribute); + } + } + } + } + } + var retMsg = new Array(); + var passed = attrNameArr.length == 0; + retMsg.push(attrNameArr.join(", ")); + //return new ValidationResult(passed, [ruleContext], attrNameArr, '', retMsg); + if (testedProperties == 0) { + return null; + } + else if (!passed) { + return (0, IRule_1.RuleFail)("fail_empty_attribute", retMsg); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_attribute_redundant.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/aria_attribute_redundant.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_redundant = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +exports.aria_attribute_redundant = { + id: "aria_attribute_redundant", + context: "dom:*[aria-required], dom:*[aria-autocomplete], dom:*[aria-readonly], dom:*[aria-disabled], dom:*[aria-placeholder]" + + ", dom:*[aria-checked], dom:*[aria-hidden], dom:*[aria-valuemax], dom:*[aria-valuemin], dom:*[aria-colspan]" + + ", dom:*[aria-rowspan]", + help: { + "en-US": { + "pass": "aria_attribute_redundant.html", + "fail_redundant": "aria_attribute_redundant.html", + "group": "aria_attribute_redundant.html" + } + }, + messages: { + "en-US": { + "pass": "The ARIA attribute is not redundant with a corresponding HTML attribute", + "fail_redundant": "The ARIA attribute \"{0}\" is redundant with the HTML attribute \"{1}\"", + "group": "An ARIA attribute should not be redundant with a corresponding HTML attribute" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // dependency check: if the ARIA attribute is completely invalid, skip this check + var invalidAttributes = AriaUtil_1.AriaUtil.getInvalidAriaAttributes(ruleContext); + if (invalidAttributes && invalidAttributes.length > 0) + return null; + // if conflict already reported, ignore reporting overlap + var conflictAttributes = AriaUtil_1.AriaUtil.getConflictAriaAndHtmlAttributes(ruleContext); + if (conflictAttributes && conflictAttributes.length > 0) + return null; + var domAttributes = ruleContext.attributes; + var ariaAttrs = []; + var htmlAttrs = []; + if (domAttributes) { + for (var i = 0; i < domAttributes.length; i++) { + var attrName = domAttributes[i].name.trim().toLowerCase(); + var attrValue = ruleContext.getAttribute(attrName); + if (attrValue === '') + attrValue = null; + if (attrName.substring(0, 5) === 'aria-') + ariaAttrs.push({ name: attrName, value: attrValue }); + else + htmlAttrs.push({ name: attrName, value: attrValue }); + } + } + var ret = []; + var _loop_1 = function (i) { + var examinedHtmlAtrNames = AriaUtil_1.AriaUtil.getConflictOrOverlappingHtmlAttribute(ariaAttrs[i], htmlAttrs, 'overlapping'); + if (examinedHtmlAtrNames === null) + return "continue"; + examinedHtmlAtrNames.forEach(function (item) { + if (item['result'] === 'Pass') { //pass + ret.push((0, IRule_1.RulePass)("pass")); + } + else if (item['result'] === 'Failed') { //failed + ret.push((0, IRule_1.RuleFail)("fail_redundant", [ariaAttrs[i]['name'], item['attr']])); + } + }); + }; + for (var i = 0; i < ariaAttrs.length; i++) { + _loop_1(i); + } + if (ret.length > 0) + return ret; + return null; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_attribute_required.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/aria_attribute_required.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_required = void 0; +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.aria_attribute_required = { + id: "aria_attribute_required", + context: "dom:*[role]", + dependencies: ["aria_role_allowed"], + refactor: { + "Rpt_Aria_RequiredProperties": { + "Pass_0": "pass", + "Fail_1": "fail_missing" + } + }, + help: { + "en-US": { + "group": "aria_attribute_required.html", + "pass": "aria_attribute_required.html", + "fail_missing": "aria_attribute_required.html" + } + }, + messages: { + "en-US": { + "group": "The required attributes for the element with a role must be defined", + "pass": "The required attributes for the element with the role are defined", + "fail_missing": "Element with '{0}' role does not have the required ARIA attribute(s): '{1}'" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "4.1.2", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: "4e8ab6", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var attrNameArr = new Array(); + var roleNameArr = new Array(); + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + //let implicitRole = ARIAMapper.elemToImplicitRole(ruleContext); + //let implicitRole = AriaUtil.getImplicitRole(ruleContext); + var hasAttribute = CommonUtil_1.CommonUtil.hasAttribute; + var testedRoles = 0; + var tagProperty = AriaUtil_1.AriaUtil.getElementAriaProperty(ruleContext); + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + if (!role) + return; + var requiredRoleProps = AriaUtil_1.AriaUtil.getRoleRequiredProperties(role, ruleContext); + if (designPatterns[role] && requiredRoleProps !== null) { + var allowedRoleProps = AriaUtil_1.AriaUtil.getAllowedAriaAttributes(ruleContext, role, tagProperty); + var roleMissingReqProp = false; + for (var i = 0, propertiesLength = requiredRoleProps.length; i < propertiesLength; i++) { + if (!allowedRoleProps.includes(requiredRoleProps[i])) + continue; + if (!hasAttribute(ruleContext, requiredRoleProps[i])) { + // If an aria-labelledby isn't present, an aria-label will meet the requirement. + if (requiredRoleProps[i] == "aria-labelledby") { + if ((!hasAttribute(ruleContext, "aria-label")) || (role != "radiogroup")) { + attrNameArr.push(requiredRoleProps[i]); + roleMissingReqProp = true; + } + } + else if (requiredRoleProps[i] == "aria-valuenow") { + if ((!hasAttribute(ruleContext, "aria-valuetext")) || (role != "progressbar")) { + attrNameArr.push(requiredRoleProps[i]); + roleMissingReqProp = true; + } + } + else if (requiredRoleProps[i] == "aria-controls" && role == "combobox") { + // Skip this check since aria-controls in the textbox of a combobox is already handled in rule HAAC_Combobox_Must_have_Text_Input + } + else { + attrNameArr.push(requiredRoleProps[i]); + roleMissingReqProp = true; + } + } + } + if (roleMissingReqProp == true) { + roleNameArr.push(role); + } + } + var passed = roleNameArr.length == 0 || attrNameArr.length == 0; // only aria attributes so NO OUT OF SCOPE + if (!passed) { + var retToken = new Array(); + retToken.push(roleNameArr.join(", ")); + retToken.push(attrNameArr.join(", ")); + return (0, IRule_1.RuleFail)("fail_missing", retToken); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_attribute_value_valid.ts" +/*!****************************************************!*\ + !*** ./src/v4/rules/aria_attribute_value_valid.ts ***! + \****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_value_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +exports.aria_attribute_value_valid = { + id: "aria_attribute_value_valid", + context: "dom:*", + dependencies: ["aria_attribute_allowed"], + refactor: { + "Rpt_Aria_ValidPropertyValue": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "aria_attribute_value_valid.html", + "Pass_0": "aria_attribute_value_valid.html", + "Fail_1": "aria_attribute_value_valid.html" + } + }, + messages: { + "en-US": { + "group": "ARIA property values must be valid", + "Pass_0": "Rule Passed", + "Fail_1": "The value \"{0}\" specified for attribute '{1}' on element <{2}> is not valid" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: "6a7281", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var valueArr = new Array(); + var attrNameArr = new Array(); + var dataTypeArr = new Array(); + var propertyDataTypes = ARIADefinitions_1.ARIADefinitions.propertyDataTypes; + var contextAttributes = ruleContext.attributes; + var testedPropertyValues = 0; + if (contextAttributes) { + for (var i = 0, length_1 = contextAttributes.length; i < length_1; i++) { + var attrName = contextAttributes[i].name; + if (AriaUtil_1.AriaUtil.isDefinedAriaAttribute(ruleContext, attrName)) { + var dataTypes = propertyDataTypes[attrName]; + var nodeValue = CommonUtil_1.CommonUtil.normalizeSpacing(contextAttributes[i].nodeValue); + testedPropertyValues++; + if (dataTypes && dataTypes.values) { + if (dataTypes.values.indexOf(nodeValue) == -1) { + if (dataTypes.values.indexOf('undefined') != -1 && nodeValue.length == 0) { + //translate 'undefined' to mean '' + } + else { + // aria-relevant is represented as a space delimited list of the following values: + // additions, removals, text; or a single catch-all value all. + if (dataTypes.type === "http://www.w3.org/2001/XMLSchema#nmtokens") { + var attrValues = contextAttributes[i].nodeValue.trim().split(" "); + // if the value all is specified, it cannot have any other value + if (attrValues.length > 1 && attrValues.includes("all")) { + valueArr.push(contextAttributes[i].nodeValue.split(" ")); + attrNameArr.push(attrName); + dataTypeArr.push(dataTypes.values.toString()); + } + else { + var hash = {}; + for (var j = 0; j < attrValues.length; j++) { + // if the individual value is not in the list of allowed values + if (attrValues[j] != "" && !dataTypes.values.includes(attrValues[j])) { + if (!hash.hasOwnProperty(attrName)) { + hash[attrName] = true; + attrNameArr.push(attrName); + } + valueArr.push(attrValues[j]); + dataTypeArr.push(dataTypes.values.toString()); + } + } + } + } + else { + valueArr.push(contextAttributes[i].nodeValue.split(" ")); + attrNameArr.push(attrName); + dataTypeArr.push(dataTypes.values.toString()); + } + } + } + } + else if (dataTypes && dataTypes.type && dataTypes.type === "http://www.w3.org/2001/XMLSchema#int") { + var iVal = parseInt(nodeValue); + if (isNaN(iVal) || ("" + iVal !== nodeValue)) { + valueArr.push(nodeValue); + attrNameArr.push(attrName); + } + } + else if (dataTypes && dataTypes.type && dataTypes.type == "http://www.w3.org/2001/XMLSchema#decimal") { + var fVal = parseFloat(nodeValue); + if (isNaN(fVal)) { + valueArr.push(nodeValue); + attrNameArr.push(attrName); + } + } + else if (dataTypes && dataTypes.type && (dataTypes.type == "http://www.w3.org/2001/XMLSchema#boolean")) { + var tmpV = nodeValue.trim().toLowerCase(); + if (tmpV !== "true" && tmpV !== "false") { + valueArr.push(nodeValue); + attrNameArr.push(attrName); + } + } + else if (dataTypes && dataTypes.type && (dataTypes.type == "http://www.w3.org/2001/XMLSchema#string")) { + } + else { + testedPropertyValues--; + } + } + } + } + var retMsg = new Array(); + var passed = attrNameArr.length == 0; + retMsg.push(valueArr.join(", ")); + retMsg.push(attrNameArr.join(", ")); + retMsg.push(ruleContext.nodeName.toLowerCase()); + // retMsg.push (dataTypeArr.join(", ")); + //return new ValidationResult(passed, [ruleContext], attrNameArr, '', retMsg); + if (testedPropertyValues == 0) { + return null; + } + else if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", retMsg); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_banner_label_unique.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/aria_banner_label_unique.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_banner_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_banner_label_unique = { + id: "aria_banner_label_unique", + context: "aria:banner", + refactor: { + "Rpt_Aria_MultipleBannerLandmarks_Implicit": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_banner_label_unique.html", + "fail_label_not_unique": "aria_banner_label_unique.html", + "group": "aria_banner_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"banner\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"banner\" role do not have unique labels", + "group": "Each element with \"banner\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "banner", true); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_banner_single.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/aria_banner_single.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_banner_single = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_banner_single = { + id: "aria_banner_single", + context: "dom:*[role], dom:header", + refactor: { + "Rpt_Aria_OneBannerInSiblingSet_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_banner_single.html", + "Fail_1": "aria_banner_single.html", + "group": "aria_banner_single.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Multiple elements with \"banner\" role found on the page", + "group": "A page, document, or application should only have one element with \"banner\" role" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + if (!AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "banner")) { + return null; + } + var passed = AriaUtil_1.AriaUtil.getSiblingWithRoleHidden(ruleContext, "banner", true, true) === null; + //return new ValidationResult(passed, [ruleContext], 'role', '', []); + if (passed) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_child_tabbable.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/aria_child_tabbable.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_child_tabbable = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_child_tabbable = { + id: "aria_child_tabbable", + context: "dom:*[role]", + dependencies: ["aria_role_allowed"], + refactor: { + "Rpt_Aria_MissingFocusableChild": { + "pass": "pass", + "fail_missing_child": "fail_missing_child" + } + }, + help: { + "en-US": { + "pass": "aria_child_tabbable.html", + "fail_missing_child": "aria_child_tabbable.html", + "group": "aria_child_tabbable.html" + } + }, + messages: { + "en-US": { + "pass": "Rule Passed", + "fail_missing_child": "None of the descendent elements with \"{1}\" role is tabbable", + "group": "UI component must have at least one tabbable descendant for keyboard access" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip the check if the element requires presentational children only + if (AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(ruleContext) || AriaUtil_1.AriaUtil.shouldBePresentationalChild(ruleContext)) + return; + // An ARIA list is not interactive + if (AriaUtil_1.AriaUtil.hasRole(ruleContext, { "list": true, "row": true, "rowgroup": true, "table": true, "grid": true })) { + return null; + } + // Not a valid message for mobile because all elements are focusable in iOS when VoiceOver is enabled. + if (ruleContext.hasAttribute("class") && ruleContext.getAttribute("class").substring(0, 3) == "mbl") { + return null; + } + //ignore datalist element check since it will be part of a input element or hidden by default + if (ruleContext.nodeName.toLowerCase() === 'datalist') + return null; + // ignore if the element's navigation is controlled by another element, such as combobox + if (AriaUtil_1.AriaUtil.isNavigationOwnedOrControlled(ruleContext)) + return null; + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + var passed = true; + var doc = ruleContext.ownerDocument; + var hasAttribute = CommonUtil_1.CommonUtil.hasAttribute; + var roleNameArr = new Array(); + var nodeName = ""; + var inScope = false; + if (ARIADefinitions_1.ARIADefinitions.containers.includes(role)) { + var disabled = hasAttribute(ruleContext, 'aria-disabled') ? ruleContext.getAttribute("aria-disabled") : ''; + if (disabled != 'true' && !hasAttribute(ruleContext, 'aria-activedescendant') && !CommonUtil_1.CommonUtil.isTabbable(ruleContext)) { + var reqChildren = ARIADefinitions_1.ARIADefinitions.designPatterns[role].reqChildren; + if (reqChildren) { + inScope = true; + passed = false; + var xp = "descendant::*["; + for (var i = 0; i < reqChildren.length; i++) { + xp += "@role='" + reqChildren[i] + "' or "; + } + xp = xp.substring(0, xp.length - 4) + ']'; + var xpathResult = doc.evaluate(xp, ruleContext, CommonUtil_1.CommonUtil.defaultNSResolver, 0 /* XPathResult.ANY_TYPE */, null); + var r = xpathResult.iterateNext(); + while (r && !passed) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(r)) { + r = xpathResult.iterateNext(); + continue; + } + passed = CommonUtil_1.CommonUtil.isTabbable(r); + // Required child is not focusable via tabindex. See if there is a grandchild that is focusable by default or by tabindex. + if (!passed) { + var xp2 = "descendant::*"; + var xpathResult2 = doc.evaluate(xp2, r, CommonUtil_1.CommonUtil.defaultNSResolver, 0 /* XPathResult.ANY_TYPE */, null); + var r2 = xpathResult2.iterateNext(); + while (r2 && !passed) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(r2)) { + r2 = xpathResult2.iterateNext(); + continue; + } + passed = CommonUtil_1.CommonUtil.isTabbable(r); + r2 = xpathResult2.iterateNext(); + } + } + if (!passed) { + roleNameArr = r.getAttribute("role").trim().split(" "); + nodeName = r.nodeName.toLowerCase(); + } + r = xpathResult.iterateNext(); + } + } + } + } + // Variable Decleration + var retToken1 = new Array(); + var retToken2 = new Array(); + // In the case the arrays/strings are empty, that means that there is no violation so we can reset it back to passed, the reason for this + // is that we are setting passed=false while we perform a loop which causes violation to trigger even if there is no issues. Instead of + // updating the whole rule to switch from using passed in that way simply do the check at this point. + if (nodeName.length > 0 && roleNameArr.length > 0) { + retToken1.push(nodeName); + retToken2.push(roleNameArr.join(", ")); + } + else { + passed = true; + } + //return new ValidationResult(passed, [ruleContext], 'role', '', passed == true ? [] : [retToken1, retToken2]); + if (!inScope) { + return null; + } + else if (!passed) { + return (0, IRule_1.RuleFail)("fail_missing_child", [retToken1.toString(), retToken2.toString()]); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_child_valid.ts" +/*!******************************************!*\ + !*** ./src/v4/rules/aria_child_valid.ts ***! + \******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_child_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_child_valid = { + id: "aria_child_valid", + //context: "dom:*[role]", + //dependencies: ["Rpt_Aria_ValidRole"], + context: "dom:*", + dependencies: ["aria_role_valid", "aria_descendant_valid"], + help: { + "en-US": { + "group": "aria_child_valid.html", + "Pass": "aria_child_valid.html", + "Fail_no_child": "aria_child_valid.html", + "Fail_invalid_child": "aria_child_valid.html" + } + }, + messages: { + "en-US": { + "group": "An element with an ARIA role must own a required child", + "Pass": "An element with an ARIA role owns a required child", + "Fail_no_child": "The element with role \"{0}\" does not own any child element with any of the following role(s): \"{1}\"", + "Fail_invalid_child": "The element with role \"{0}\" owns the child element with the role \"{1}\" that is not one of the allowed role(s): \"{2}\"" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + // TODO: ACT: Verify mapping + act: ["bc4a75"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip the check if the element requires presentational children only + if (AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(ruleContext)) + return; + var roles = AriaUtil_1.AriaUtil.getRoles(ruleContext, false); + // if explicit role doesn't exist, get the implicit one + if (!roles || roles.length === 0) + roles = AriaUtil_1.AriaUtil.getImplicitRole(ruleContext); + //ignore if the element doesn't have any explicit or implicit role, shouldn't happen + if (!roles || roles.length === 0) + return null; + // ignore if the element contains none or presentation role + var presentationRoles = ["none", "presentation"]; + var found = roles.some(function (r) { return presentationRoles.includes(r); }); + if (found) + return null; + // For combobox, we have g1193 ... g1199 to check the values etc. + // We don't want to trigger 1152 again. So, we bypass it here. + if (roles.includes("combobox")) + return null; + var requiredChildRoles = AriaUtil_1.AriaUtil.getRequiredChildRoles(ruleContext, true); + // a 'group' role is allowed but not required for some elements so remove it if exists + if (requiredChildRoles.includes('group')) { + var index = requiredChildRoles.indexOf('group'); + if (index > -1) + requiredChildRoles.splice(index, 1); + } + /** + * ignore if a role doesn't require a child with any specific role + * the reverse might be not true - parent will be checked in Rpt_Aria_RequiredParent_Native_Host_Sematics rule + */ + if (requiredChildRoles.length == 0) + return null; + // get all the children from accessibility tree, + // including ones with aria-owns + var directATChildren = AriaUtil_1.AriaUtil.getDirectATChildren(ruleContext); + if (!directATChildren || directATChildren.length == 0) { + // the element with at least one required role dosen't contain any accessible child + /** + * When a widget is missing required owned elements due to script execution or loading, + * authors MUST mark a containing element with 'aria-busy' equal to true. + */ + var busy = ruleContext.getAttribute("aria-busy"); + if (!busy || busy !== 'true') { + var retToken = new Array(); + retToken.push(roles.join(", ")); + retToken.push(requiredChildRoles.join(", ")); + return (0, IRule_1.RuleFail)("Fail_no_child", retToken); + } + // it's 'busy' loading, ignore it + return null; + } + var violateElemRoles = new Array(); + for (var j = 0; j < directATChildren.length; j++) { + var childRoles = AriaUtil_1.AriaUtil.getRoles(directATChildren[j], false); + // if explicit role doesn't exist, get the implicit one + if (!childRoles || childRoles.length == 0) + childRoles = AriaUtil_1.AriaUtil.getImplicitRole(directATChildren[j]); + if (childRoles && childRoles.length > 0) { + /** + * when multiple roles are specified as required owned elements for a role, at least one instance of one required owned element is expected. + * the specification does not require an instance of each of the listed owned roles. + * therefore, the requirement is met if it has any one of the required roles. + */ + var found_1 = childRoles.some(function (r) { return requiredChildRoles.includes(r); }); + if (!found_1) + violateElemRoles.push(childRoles.join(", ")); + } + else { + // ignore the element since it's not semantic, shouldn't happen + } + } + if (violateElemRoles.length > 0) { + var retValues = []; + for (var i = 0; i < violateElemRoles.length; i++) { + var retToken = new Array(); + retToken.push(roles.join(", ")); + retToken.push(violateElemRoles[i]); + retToken.push(requiredChildRoles.join(", ")); + retValues.push((0, IRule_1.RuleFail)("Fail_invalid_child", retToken)); + } + return retValues; + } + return (0, IRule_1.RulePass)("Pass"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_complementary_label_unique.ts" +/*!*********************************************************!*\ + !*** ./src/v4/rules/aria_complementary_label_unique.ts ***! + \*********************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_complementary_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_complementary_label_unique = { + id: "aria_complementary_label_unique", + context: "aria:complementary", + refactor: { + "Rpt_Aria_MultipleComplementaryLandmarks_Implicit": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_complementary_label_unique.html", + "fail_label_not_unique": "aria_complementary_label_unique.html", + "group": "aria_complementary_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"complementary\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"complementary\" role do not have unique labels", + "group": "Each element with \"complementary\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "complementary"); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_complementary_label_visible.ts" +/*!**********************************************************!*\ + !*** ./src/v4/rules/aria_complementary_label_visible.ts ***! + \**********************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_complementary_label_visible = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_complementary_label_visible = { + id: "aria_complementary_label_visible", + context: "dom:*[role], dom:aside", + dependencies: ["aria_complementary_labelled"], + refactor: { + "Rpt_Aria_ComplementaryLandmarkLabel_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_complementary_label_visible.html", + "Fail_1": "aria_complementary_label_visible.html", + "group": "aria_complementary_label_visible.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Element with \"complementary\" role does not have a visible label", + "group": "Each element with \"complementary\" role should have a visible label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + if (!AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "complementary")) { + return null; + } + var passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "aria-labelledby"); + //return new ValidationResult(passed, [ruleContext], 'role', '', []); + if (passed) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_complementary_labelled.ts" +/*!*****************************************************!*\ + !*** ./src/v4/rules/aria_complementary_labelled.ts ***! + \*****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_complementary_labelled = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_complementary_labelled = { + id: "aria_complementary_labelled", + context: "aria:complementary", + refactor: { + "Rpt_Aria_ComplementaryRequiredLabel_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_complementary_labelled.html", + "Fail_1": "aria_complementary_labelled.html", + "group": "aria_complementary_labelled.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Element with \"complementary\" role does not have a label", + "group": "Each element with \"complementary\" role must have a label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + if (pair) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_content_in_landmark.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/aria_content_in_landmark.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_content_in_landmark = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var TableUtil_1 = __webpack_require__(/*! ../util/TableUtil */ "./src/v4/util/TableUtil.ts"); +exports.aria_content_in_landmark = { + id: "aria_content_in_landmark", + context: "dom:*", + refactor: { + "Rpt_Aria_OrphanedContent_Native_Host_Sematics": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_content_in_landmark.html", + "Fail_1": "aria_content_in_landmark.html", + "group": "aria_content_in_landmark.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Content is not within a landmark element", + "group": "All content must reside within an element with a landmark role" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }, + { + "id": ["WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var params = CacheUtil_1.CacheUtil.getCache(context.dom.node.ownerDocument, "aria_content_in_landmark", null); + if (!params) { + params = { + landmarks: { + value: ["banner", "complementary", "contentinfo", "form", "main", "navigation", "region", "search"], + type: "array" + }, + possibleOrphanedWidgets: { + value: ["button", "combobox", "checkbox", "grid", "heading", "link", "list", + "listbox", "menu", "menubar", "progressbar", "radio", "tablist", "textbox", "toolbar", "tree", + "treegrid" + ], + type: "array" + }, + possibleOrphanedElements: { + value: ["p", "table", "input", "textarea", "select", "button", "a", "ol", "ul", "dl", "h1", "h2", "h3", "h4", "h5", + "h6", "embed", "object", "area" + ], + type: "array" + }, + noLandmarkedRoles: { + // These roles don't require landmarks + value: ["alert", "alertdialog", "dialog", "tooltip"], + type: "array" + }, + mapLandmarks: {}, + mapPossibleOrphanedWidgets: {}, + mapPossibleOrphanedElements: {}, + mapNoLandmarkedRoles: {} + }; + // Convert arrays to maps + params.mapLandmarks = {}; + for (var i = 0; i < params.landmarks.value.length; ++i) { + params.mapLandmarks[params.landmarks.value[i]] = true; + } + params.mapPossibleOrphanedWidgets = {}; + for (var i = 0; i < params.possibleOrphanedWidgets.value.length; ++i) { + params.mapPossibleOrphanedWidgets[params.possibleOrphanedWidgets.value[i]] = true; + } + params.mapPossibleOrphanedElements = {}; + for (var i = 0; i < params.possibleOrphanedElements.value.length; ++i) { + params.mapPossibleOrphanedElements[params.possibleOrphanedElements.value[i]] = true; + } + params.mapNoLandmarkedRoles = {}; + for (var i = 0; i < params.noLandmarkedRoles.value.length; ++i) { + params.mapNoLandmarkedRoles[params.noLandmarkedRoles.value[i]] = true; + } + CacheUtil_1.CacheUtil.setCache(context.dom.node.ownerDocument, "aria_content_in_landmark", params); + } + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || // avoid diagnosing g1157 for non-visible nodes + (VisUtil_1.VisUtil.hiddenByDefaultElements != null && + VisUtil_1.VisUtil.hiddenByDefaultElements != undefined && + VisUtil_1.VisUtil.hiddenByDefaultElements.indexOf(nodeName) > -1)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + var elemsWithoutContent = ["area", "input", "embed", "button", "textarea", "select"]; + if (!CommonUtil_1.CommonUtil.hasInnerContentHidden(ruleContext) && //only trigger the rule on elements that have content + elemsWithoutContent.indexOf(nodeName) === -1) { // a few elems wihout content should not be skipped + return (0, IRule_1.RulePass)("Pass_0"); + } + // Short circuit for layout tables + if (nodeName == "table" && TableUtil_1.TableUtil.isLayoutTable(ruleContext)) { + return null; + } + // Check if it is a possible orphan + var passed = true; + var isPossibleOrphanedWidget = AriaUtil_1.AriaUtil.hasRole(ruleContext, params.mapPossibleOrphanedWidgets, true); + //exclude <link rel="stylesheet" href="xyz.css"> in the <head> and <body>(#608) + //having link in the head could cause lot of violaions + if (nodeName === 'link') { + isPossibleOrphanedWidget = false; + } + var isPossibleOrphanedElement = nodeName in params.mapPossibleOrphanedElements; + if (isPossibleOrphanedWidget || isPossibleOrphanedElement) { + // See if ancestor has landmark roles or implicit land mark roles + var parentRoles = contextHierarchies["aria"].map(function (info) { return info.role; }); + passed = parentRoles.filter(function (role) { return role in params.mapLandmarks; }).length > 0; + if (!passed) { + // Don't fail elements when a parent or sibling has failed - causes too many messages. + var walkElement = DOMWalker_1.DOMWalker.parentElement(ruleContext); + while (!passed && walkElement != null) { + passed = CacheUtil_1.CacheUtil.getCache(walkElement, "Rpt_Aria_OrphanedContent", false); + walkElement = DOMWalker_1.DOMWalker.parentElement(walkElement); + } + walkElement = ruleContext.nextElementSibling; + while (!passed && walkElement != null) { + passed = CacheUtil_1.CacheUtil.getCache(walkElement, "Rpt_Aria_OrphanedContent", false); + walkElement = walkElement.nextElementSibling; + } + walkElement = ruleContext.previousElementSibling; + while (!passed && walkElement != null) { + passed = CacheUtil_1.CacheUtil.getCache(walkElement, "Rpt_Aria_OrphanedContent", false); + walkElement = walkElement.previousElementSibling; + } + if (!passed) { + CacheUtil_1.CacheUtil.setCache(ruleContext, "Rpt_Aria_OrphanedContent", true); + // Don't trigger rule if element is a stand-alone widget + passed = CacheUtil_1.CacheUtil.getCache(ruleContext, "Rpt_Aria_OrphanedContent_NoTrigger", false) || + AriaUtil_1.AriaUtil.hasRole(ruleContext, params.mapNoLandmarkedRoles, true) || + AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, params.mapNoLandmarkedRoles, true); + if (passed) { + CacheUtil_1.CacheUtil.setCache(ruleContext, "Rpt_Aria_OrphanedContent_NoTrigger", true); + return null; + } + } + else { + return null; + } + } + } + else { + return null; + } + //return new ValidationResult(passed, [ruleContext], '', '', []); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_contentinfo_label_unique.ts" +/*!*******************************************************!*\ + !*** ./src/v4/rules/aria_contentinfo_label_unique.ts ***! + \*******************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_contentinfo_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_contentinfo_label_unique = { + id: "aria_contentinfo_label_unique", + context: "aria:contentinfo", + refactor: { + "Rpt_Aria_MultipleContentinfoLandmarks_Implicit": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_contentinfo_label_unique.html", + "fail_label_not_unique": "aria_contentinfo_label_unique.html", + "group": "aria_contentinfo_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"contentinfo\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"contentinfo\" role do not have unique labels", + "group": "Each element with \"contentinfo\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "contentinfo", true); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_contentinfo_misuse.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/aria_contentinfo_misuse.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_contentinfo_misuse = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_contentinfo_misuse = { + id: "aria_contentinfo_misuse", + context: "dom:*[role], dom:footer, dom:address", + refactor: { + "Rpt_Aria_ContentinfoWithNoMain_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_contentinfo_misuse.html", + "Fail_1": "aria_contentinfo_misuse.html", + "group": "aria_contentinfo_misuse.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Element with \"contentinfo\" role is present without an element with \"main\" role", + "group": "Each element with \"contentinfo\" role is only permitted with an element with \"main\" role" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + //consider implicit role + if (!AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "contentinfo")) { + return null; + } + // Consider the Check Hidden Content setting that is set by the rules + var passed = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "main", true, true).length > 0; + //return new ValidationResult(passed, [ruleContext], 'role', '', []); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_contentinfo_single.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/aria_contentinfo_single.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_contentinfo_single = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_contentinfo_single = { + id: "aria_contentinfo_single", + context: "dom:*[role], dom:footer, dom:address", + refactor: { + "Rpt_Aria_MultipleContentinfoInSiblingSet_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_contentinfo_single.html", + "Fail_1": "aria_contentinfo_single.html", + "group": "aria_contentinfo_single.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Multiple elements with \"contentinfo\" role found on the page", + "group": "A page, document, or application should only have one element with \"contentinfo\" role" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + //find out if <footer> element has siblings as <footer> has implicit contentinfo role + if (!AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "contentinfo")) { + return null; + } + var passed = !AriaUtil_1.AriaUtil.getSiblingWithRoleHidden(ruleContext, "contentinfo", true, true); + //return new ValidationResult(passed, [ruleContext], 'role', '', []); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_descendant_valid.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/aria_descendant_valid.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_descendant_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_descendant_valid = { + id: "aria_descendant_valid", + context: "dom:*", + dependencies: ["aria_role_valid"], + help: { + "en-US": { + "group": "aria_descendant_valid.html", + "pass": "aria_descendant_valid.html", + "potential_child_implicit_role": "aria_descendant_valid.html", + "recommendation_no_impact_role": "aria_descendant_valid.html", + "fail_child_explicit_role": "aria_descendant_valid.html" + } + }, + messages: { + "en-US": { + "group": "Browsers ignore the explicit and implicit ARIA roles of the descendants of certain elements", + "pass": "The element contains valid descendants", + "potential_child_implicit_role": "The element with role \"{0}\" contains descendants with implicit roles \"{1}\" which are ignored by browsers", + "recommendation_no_impact_role": "The element with role \"{0}\" contains descendants with roles \"{1}\" which are ignored by browsers", + "fail_child_explicit_role": "The element with role \"{0}\" contains descendants with roles \"{1}\" which are ignored by browsers" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE, + reasonCodes: ["pass", "potential_child_implicit_role", "fail_child_explicit_role"] + }, { + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE, + reasonCodes: ["recommendation_no_impact_role"] + }], + // TODO: ACT: Verify mapping + act: ["307n5z"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip the check if the element doesn't require presentational children only + if (!AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(ruleContext)) + return; + var roles = AriaUtil_1.AriaUtil.getRoles(ruleContext, false); + // if explicit role doesn't exist, get the implicit one + if (!roles || roles.length === 0) + roles = AriaUtil_1.AriaUtil.getImplicitRole(ruleContext); + //ignore if the element doesn't have any explicit or implicit role, shouldn't happen + if (!roles || roles.length === 0) + return null; + // let tagName = ruleContext.tagName.toLowerCase(); + // get all the children from accessibility tree, + // including ones with aria-owns + var directATChildren = AriaUtil_1.AriaUtil.getDirectATChildren(ruleContext); + if (directATChildren && directATChildren.length > 0) { + // the element with at least one non-presentational children + var explicitRoles = new Array(); + var implicitRoles = new Array(); + var noImpactRoles = new Array(); + for (var j = 0; j < directATChildren.length; j++) { + // ignore <img> and <svg> + var tag = directATChildren[j].nodeName.toLowerCase(); + if (tag === 'img' || tag === 'svg') + continue; + // get explicit role if exists + var childRoles = AriaUtil_1.AriaUtil.getRoles(directATChildren[j], false); + if (childRoles && childRoles.length > 0) { + // separate case for role="code" + if (childRoles.includes("code")) { + noImpactRoles.push(childRoles.filter(function (role) { return role === "code"; }).join(", ")); + } + explicitRoles.push(childRoles.filter(function (role) { return role !== "code"; }).join(", ")); + } + else { + // get implicit role if exists + childRoles = AriaUtil_1.AriaUtil.getImplicitRole(directATChildren[j]); + // separate case for role="code" + if (childRoles.includes("code")) { + noImpactRoles.push(childRoles.filter(function (role) { return role === "code"; }).join(", ")); + } + if (childRoles && childRoles.length > 0) + implicitRoles.push(childRoles.filter(function (role) { return role !== "code"; }).join(", ")); + } + } + if (explicitRoles.length > 0) { + var retValues = []; + for (var i = 0; i < explicitRoles.length; i++) { + var retToken = new Array(); + retToken.push(roles.join(", ")); + retToken.push(explicitRoles[i]); + retValues.push((0, IRule_1.RuleFail)("fail_child_explicit_role", retToken)); + } + return retValues; + } + if (implicitRoles.length > 0) { + var retValues = []; + for (var i = 0; i < implicitRoles.length; i++) { + var retToken = new Array(); + retToken.push(roles.join(", ")); + retToken.push(implicitRoles[i]); + retValues.push((0, IRule_1.RulePotential)("potential_child_implicit_role", retToken)); + } + return retValues; + } + if (noImpactRoles.length > 0) { + var retValues = []; + for (var i = 0; i < noImpactRoles.length; i++) { + var retToken = new Array(); + retToken.push(roles.join(", ")); + retToken.push(noImpactRoles[i]); + retValues.push((0, IRule_1.RulePotential)("recommendation_no_impact_role", retToken)); + } + return retValues; + } + } + else + return (0, IRule_1.RulePass)("pass"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_document_label_unique.ts" +/*!****************************************************!*\ + !*** ./src/v4/rules/aria_document_label_unique.ts ***! + \****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_document_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_document_label_unique = { + id: "aria_document_label_unique", + context: "aria:document", + refactor: { + "Rpt_Aria_MultipleDocumentRoles": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_document_label_unique.html", + "fail_label_not_unique": "aria_document_label_unique.html", + "group": "aria_document_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"document\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"document\" roles do not have unique labels", + "group": "Each element with \"document\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "document", true); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_eventhandler_role_valid.ts" +/*!******************************************************!*\ + !*** ./src/v4/rules/aria_eventhandler_role_valid.ts ***! + \******************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_eventhandler_role_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.aria_eventhandler_role_valid = { + id: "aria_eventhandler_role_valid", + context: "dom:*[onclick],dom:*[onblur], dom:*[ondblclick], dom:*[onfocus], dom:*[onkeydown],dom:*[onkeypress], dom:*[onkeyup], dom:*[onmousedown], dom:*[onmouseup], dom:*[onmousemove], dom:*[onmouseout], dom:*[onmouseover], dom:*[onresize], dom:*[onchange]", + refactor: { + "Rpt_Aria_EventHandlerMissingRole_Native_Host_Sematics": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_eventhandler_role_valid.html", + "Fail_1": "aria_eventhandler_role_valid.html", + "group": "aria_eventhandler_role_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The <{0}> element with '{1}' does not have a valid ARIA role specified", + "group": "Elements with event handlers must have a valid ARIA role" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Don't trigger this for SVG element for now until a determination is made (by Rich) + // to support SVG at a point when the SVG a11y spec is ready. + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, "svg")) { + return null; + } + //this rule is passed if a element has attribut role + //also, passed of element has any implicit roles. + if (AriaUtil_1.AriaUtil.hasAnyRole(ruleContext, true)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + //pass if this element is received focus by default + if (CommonUtil_1.CommonUtil.isfocusableByDefault(ruleContext)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + //validate if this element has any of the given event handler's + var retToken1 = new Array(); + retToken1.push(ruleContext.nodeName.toLowerCase()); + var eventArr = new Array(); + // From WCAG20_Script_UseW3CDomFunctions + //let events = ["onblur", "onfocus", "onchange", "onclick", "oncontextmenu", "ondblclick", "onkeydown", + // "onkeypress", "onkeyup", "onload", "onmousedown", "onmouseup", "onmousemove", "onmouseout", + // "onmouseover", "onmousewheel", "onreset", "onpaste", "onresize", "onscroll", + // "onselect", "onsubmit", "onactivate", "ondeactivate", "onmouseenter", "onmouseleave"]; + var events = ["onblur", "onfocus", "onchange", "onclick", "ondblclick", "onkeydown", + "onkeypress", "onkeyup", "onmousedown", "onmouseup", "onmousemove", "onmouseout", + "onmouseover", "onresize" + ]; + for (var i = 0; i < events.length; ++i) { + if (ruleContext.hasAttribute(events[i])) + eventArr.push(events[i]); + } + var retToken2 = new Array(); + retToken2.push(eventArr.join(", ")); + //return new ValidationResult(false, [ruleContext], '', '', [retToken1, retToken2]); + return (0, IRule_1.RuleFail)("Fail_1", [retToken1.toString(), retToken2.toString()]); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_form_label_unique.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/aria_form_label_unique.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_form_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_form_label_unique = { + id: "aria_form_label_unique", + context: "aria:form", + refactor: { + "Rpt_Aria_MultipleFormLandmarks_Implicit": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_form_label_unique.html", + "fail_label_not_unique": "aria_form_label_unique.html", + "group": "aria_form_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"form\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"form\" role do not have unique labels", + "group": "Each element with \"form\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "form", true); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_graphic_labelled.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/aria_graphic_labelled.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_graphic_labelled = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_graphic_labelled = { + id: "aria_graphic_labelled", + context: "aria:graphics-document,aria:graphics-symbol", + refactor: { + "HAAC_Aria_SvgAlt": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3" + } + }, + help: { + "en-US": { + "group": "aria_graphic_labelled.html", + "Pass_0": "aria_graphic_labelled.html", + "Fail_1": "aria_graphic_labelled.html", + "Fail_2": "aria_graphic_labelled.html", + "Fail_3": "aria_graphic_labelled.html" + } + }, + messages: { + "en-US": { + "group": "An element with a graphics role must have a non-empty label", + "Pass_0": "Rule Passed", + "Fail_1": "Element with \"{0}\" graphics role has no label", + "Fail_2": "Element with \"{0}\" graphics role has no label or an empty label", + "Fail_3": "Element with \"{0}\" graphics role missing non-empty 'aria-label' or 'aria-labelledby'" + } + }, + rulesets: [], + act: [{ + "7d6734": { + "Pass_0": "pass", + "Fail_1": "inapplicable", + "Fail_2": "fail", + "Fail_3": "inapplicable" + } + }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + if (!ruleContext.hasAttribute("role") || !ruleContext.getAttribute("role").includes("graphics-")) + return null; + /* removed the role check role= presentation since if an element has role=img, then there needs to be a check for alt attribute regardless of the presecne of role=presentation + if (RPTUtil.hasRole(ruleContext, "presentation") || RPTUtil.hasRole(ruleContext, "none")){ + return RulePass(1); + }*/ + // If role === img, you must use an aria label + //check attributes aria-label and aria-labelledby for other tags (e.g., <div>, <span>, etc) + var passed = AriaUtil_1.AriaUtil.getAriaLabel(ruleContext).length > 0; + if (!passed && ruleContext.nodeName.toLowerCase() === "svg") { + var svgTitle = ruleContext.querySelector("title"); + passed = svgTitle && CommonUtil_1.CommonUtil.hasInnerContent(svgTitle); + } + if (!passed) { + //check title attribute + passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "title"); + // We should guide people to use alt or label - this is just a secondary approach to silence the rule. + // So, we should keep the POF from above. + // if (!passed) POF = "Fail_3"; + } + //return new ValidationResult(passed, [ruleContext], 'role', '', []); + if (passed) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_2", [ruleContext.getAttribute("role")]); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_hidden_nontabbable.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/aria_hidden_nontabbable.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_hidden_nontabbable = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.aria_hidden_nontabbable = { + id: "aria_hidden_nontabbable", + context: "dom:*[aria-hidden=true], dom:*[aria-hidden=true] dom:*", + refactor: { + "aria_hidden_focus_misuse": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "aria_hidden_nontabbable.html", + "Pass_0": "aria_hidden_nontabbable.html", + "Fail_1": "aria_hidden_nontabbable.html" + } + }, + messages: { + "en-US": { + "group": "A hidden element should not contain any tabbable elements", + "Pass_0": "Rule Passed", + "Fail_1": "Element \"{0}\" should not be focusable within the subtree of an element with an 'aria-hidden' attribute with value 'true'" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: ["1.3.1", "4.1.2"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_TWO + }], + // TODO: ACT: Handle testcase with focus jumping away + act: "6cfa84", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (CommonUtil_1.CommonUtil.isTabbable(ruleContext)) { + return (0, IRule_1.RuleFail)("Fail_1", [nodeName]); + } + return (0, IRule_1.RulePass)("Pass_0"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_id_unique.ts" +/*!****************************************!*\ + !*** ./src/v4/rules/aria_id_unique.ts ***! + \****************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_id_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_id_unique = { + id: "aria_id_unique", + context: "dom:*", + refactor: { + "Rpt_Aria_ValidIdRef": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_id_unique.html", + "Fail_1": "aria_id_unique.html", + "group": "aria_id_unique.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The 'id' \"{0}\" specified for the ARIA property '{1}' value is not valid", + "group": "The ARIA property must reference a non-empty unique id of an existing element that is visible" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + // TODO: ACT: 6a7281 - Need a separate reason code when the property is not required. ACT says it's okay to be + // invalid when not required. I think we should still fail, but flag it as a different reason so that we can have a subset + // aligns with ACT. + act: ["59796f", "6a7281"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var pass = true; + var attrNameArr = new Array(); + var nonExistantIDs = new Array(); + var ownerDocument = fragment_1.FragmentUtil.getOwnerFragment(ruleContext); + var contextAttributes = ruleContext.attributes; + var idTokens = new Array(); + var testedReferences = 0; + if (contextAttributes) { + for (var i = 0, attrLength = contextAttributes.length; i < attrLength; i++) { + pass = true; + var attrName = contextAttributes[i].name; + if (AriaUtil_1.AriaUtil.isDefinedAriaAttribute(ruleContext, attrName)) { + var dataTypes = ARIADefinitions_1.ARIADefinitions.propertyDataTypes[attrName]; + if (dataTypes && dataTypes.type) { + var supportsOneIDRef = (dataTypes.type == "http://www.w3.org/2001/XMLSchema#idref") ? true : false; + //If the data type supports one or more id refs do error checking + if (supportsOneIDRef || (dataTypes.type == "http://www.w3.org/2001/XMLSchema#idrefs")) { + testedReferences++; + var nodeValueLength = CommonUtil_1.CommonUtil.normalizeSpacing(contextAttributes[i].nodeValue).length; + var idArray = contextAttributes[i].nodeValue.split(" "); + // Check for an empty ID Ref + if (nodeValueLength < 1) { + pass = false; + idTokens.push("\"" + contextAttributes[i].nodeValue + "\""); + } + // check to see if too many IDRefs + else if (supportsOneIDRef) { + //If has too many IDRefs it is an error + if (nodeValueLength >= 1) { + if (idArray.length > 1) { + pass = false; + // Need to capture all the IDRefs for idTokens + for (var z = 0, length_1 = idArray.length; z < length_1; ++z) { + if (idArray[z] != "") { + idTokens.push(idArray[z]); + } + } + } + } + } + // check to see if id refs are invalid + if (pass && nodeValueLength >= 1) { + for (var j = 0, length_2 = idArray.length; j < length_2; ++j) { + if (idArray[j].length > 0) { // it is an empty string if spaces are one after the other + // Get the element by Id + var elementById = ownerDocument.getElementById(idArray[j]); + // Pass if the element exists + pass = elementById != null; + // If the element exists and this is an aria attribute that doesn't support hidden ID reference + // then perform a isNodeVisible check, in the case the node is not visible then we return + // false and true otherwise. + if (pass && !dataTypes.hiddenIDRefSupported) { + pass = VisUtil_1.VisUtil.isNodeVisible(elementById); + } + if (!pass) { + if (idArray[j] != "") { + idTokens.push(idArray[j]); + } + } + // Only one of the id references need to be valid to mark the rule as passed. + // Therefore if we find a single visible element then stop checking and mark as + // passed. + else { + break; + } + } + } + } + } + } + if (!pass) + attrNameArr.push(attrName); + } + } + } + var passed = attrNameArr.length == 0; + var retToken1 = new Array(); + var retToken2 = new Array(); + var retToken3 = new Array(); + if (!passed) { + retToken2.push(attrNameArr.join(", ")); + retToken3.push(ruleContext.nodeName.toLowerCase()); + if (idTokens.length > 0) { + retToken1.push(idTokens.join(", ")); + } + } + //return new ValidationResult(passed, [ruleContext], attrNameArr, '', passed == true ? [] : [retToken1, retToken2, retToken3]); + if (testedReferences == 0) { + return null; + } + else if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", [retToken1.toString(), retToken2.toString(), retToken3.toString()]); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_img_labelled.ts" +/*!*******************************************!*\ + !*** ./src/v4/rules/aria_img_labelled.ts ***! + \*******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_img_labelled = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_img_labelled = { + id: "aria_img_labelled", + context: "aria:img, aria:image", + refactor: { + "HAAC_Aria_ImgAlt": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3" + } + }, + help: { + "en-US": { + "group": "aria_img_labelled.html", + "Pass_0": "aria_img_labelled.html", + "Fail_1": "aria_img_labelled.html", + "Fail_2": "aria_img_labelled.html", + "Fail_3": "aria_img_labelled.html" + } + }, + messages: { + "en-US": { + "group": "An element with \"img\" role must have a non-empty label", + "Pass_0": "Rule Passed", + "Fail_1": "Element with \"img\" role has no label", + "Fail_2": "Element with \"img\" role has no label or an empty label", + "Fail_3": "Element with \"img\" role missing non-empty 'aria-label' or 'aria-labelledby'" + } + }, + rulesets: [], + act: ["23a2a8", { + "7d6734": { + "Pass_0": "pass", + "Fail_1": "inapplicable", + "Fail_2": "fail", + "Fail_3": "inapplicable" + } + }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + if (!ruleContext.hasAttribute("role")) { + // If no role, this is implicit, and covered by WCAG20_Img_HasAlt + return null; + } + var nodeName = ruleContext.nodeName.toLocaleLowerCase(); + // svg and img elements are handled in svg_graphics_labbelled and img_alt_valid rules + if (nodeName === 'svg' || nodeName === 'img') + return; + /* removed the role check role= presentation since if an element has role=img, then there needs to be a check for alt attribute regardless of the presecne of role=presentation + if (RPTUtil.hasRole(ruleContext, "presentation") || RPTUtil.hasRole(ruleContext, "none")){ + return RulePass(1); + }*/ + /* JCH - Points of failure + * 0. Missing alt attr with value + * 1. Missing aria-label or aria-labelledby + * 2. Missing title attr with value + */ + // If role === img, you must use an aria label + //check attributes aria-label and aria-labelledby for other tags (e.g., <div>, <span>, etc) + var passed = AriaUtil_1.AriaUtil.getAriaLabel(ruleContext).length > 0; + if (!passed && ruleContext.nodeName.toLowerCase() === "svg") { + var svgTitle = ruleContext.querySelector("title"); + passed = svgTitle && CommonUtil_1.CommonUtil.hasInnerContent(svgTitle); + } + if (!passed) { + //check title attribute + passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "title"); + // We should guide people to use alt or label - this is just a secondary approach to silence the rule. + // So, we should keep the POF from above. + // if (!passed) POF = "Fail_3"; + } + //return new ValidationResult(passed, [ruleContext], 'role', '', []); + if (passed) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_2"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_keyboard_handler_exists.ts" +/*!******************************************************!*\ + !*** ./src/v4/rules/aria_keyboard_handler_exists.ts ***! + \******************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_keyboard_handler_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_keyboard_handler_exists = { + id: "aria_keyboard_handler_exists", + context: "dom:*[role]", + dependencies: ["aria_role_allowed"], + refactor: { + "Rpt_Aria_MissingKeyboardHandler": { + "pass": "pass", + "potential_no_keyboard_access": "potential_no_keyboard_access" + } + }, + help: { + "en-US": { + "pass": "aria_keyboard_handler_exists.html", + "potential_no_keyboard_access": "aria_keyboard_handler_exists.html", + "group": "aria_keyboard_handler_exists.html" + } + }, + messages: { + "en-US": { + "pass": "Rule Passed", + "potential_no_keyboard_access": "Verify the <{0}> element with \"{1}\" role has keyboard access", + "group": "Interactive WAI_ARIA UI components must provide keyboard access" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + var passed = true; + var savedPassed = passed; + var doc = ruleContext.ownerDocument; + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + //let roles = ruleContext.getAttribute("role").trim().toLowerCase().split(/\s+/); + //only consider user specified role(s), rather than native containers + var roles = AriaUtil_1.AriaUtil.getRoles(ruleContext, false); + var nodeName = ruleContext.nodeName.toLowerCase(); + //if an explicit role is specified, the 'aria_role_redundant' rule should be triggered and addressed first, + // and the current rule should be ignored + if (nodeName === 'datalist' && roles && roles.includes("listbox")) + return null; + // Composite user interface widget roles. They act as containers that manage other, contained widgets. + var roleContainers = ["combobox", "grid", "listbox", "menu", "menubar", "radiogroup", "tablist", "tree", "treegrid"]; + for (var _i = 0, roleContainers_1 = roleContainers; _i < roleContainers_1.length; _i++) { + var role = roleContainers_1[_i]; + if (AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, role, true) != null) + // it's a descendant of a composite widget already examined + return null; + } + var hasAttribute = CommonUtil_1.CommonUtil.hasAttribute; + var roleNameArr = new Array(); + for (var j = 0; j < roles.length; ++j) { + var pattern = designPatterns[roles[j]]; + if (roleContainers.indexOf(roles[j]) >= 0) { + var disabled = hasAttribute(ruleContext, 'aria-disabled') ? ruleContext.getAttribute("aria-disabled") : ''; + if (!disabled) { + // See if there is a keyboard event handler on the parent element. + passed = (ruleContext.hasAttribute("onkeydown") || ruleContext.hasAttribute("onkeypress") || ruleContext.hasAttribute("onkeyup")); + // No keyboard event handler found on parent. See if keyboard event handlers are on required child elements. + if (!passed) { + if (!hasAttribute(ruleContext, 'aria-activedescendant')) { + var reqChildren = ARIADefinitions_1.ARIADefinitions.designPatterns[roles[j]].reqChildren; + if (reqChildren) { /* SMF TODO menubar does not have any reqChildren */ + for (var i = 0, requiredChildrenLength = reqChildren.length; i < requiredChildrenLength; i++) { + var xp = "*[contains(@role,'" + reqChildren[i] + "')]"; + var xpathResult = doc.evaluate(xp, ruleContext, CommonUtil_1.CommonUtil.defaultNSResolver, 0 /* XPathResult.ANY_TYPE */, null); + var r = xpathResult.iterateNext(); + while (r) { + passed = (r.hasAttribute("onkeydown") || r.hasAttribute("onkeypress")); + if (!passed) { + // Child did not have a key handler. See if any of the grandchildren do. + var xp2 = "descendant::*"; + var xpathResult2 = doc.evaluate(xp2, r, CommonUtil_1.CommonUtil.defaultNSResolver, 0 /* XPathResult.ANY_TYPE */, null); + var r2 = xpathResult2.iterateNext(); + while (r2 && !passed) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(r2)) { + r2 = xpathResult2.iterateNext(); + continue; + } + passed = CommonUtil_1.CommonUtil.isTabbable(r2) && + (r2.hasAttribute("onkeydown") || r2.hasAttribute("onkeypress")); + if (!passed) { + // Is this an action link? + if (r2.nodeName.toLowerCase() == "a" && r2.hasAttribute("href")) { + var href = r2.getAttribute("href"); + // Action link must start with "javascript:", must not contain a "void" and + // must have a function name following "javascript:" (i.e., href.length > 11) + passed = (href.startsWith("javascript:") && href.indexOf("void") == -1 && href.length > 11); + } + } + r2 = xpathResult2.iterateNext(); + } + } + if (!passed) { + // All the required children (or any descendants of the required children) must have keypress/keydown + // If not, it is a failure, no need to keep checking any more. + break; + } + r = xpathResult.iterateNext(); + } + } + } + else { + // The current element failed the keydown/keypress, and it does not have required children, such as menubar. + // Let's check its descendants. + var xp2 = "descendant::*"; + var xpathResult2 = doc.evaluate(xp2, ruleContext, CommonUtil_1.CommonUtil.defaultNSResolver, 0 /* XPathResult.ANY_TYPE */, null); + var r2 = xpathResult2.iterateNext(); + while (r2 && !passed) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(r2)) { + r2 = xpathResult2.iterateNext(); + continue; + } + passed = CommonUtil_1.CommonUtil.isTabbable(r2) && + (r2.hasAttribute("onkeydown") || r2.hasAttribute("onkeypress")); + if (!passed) { + // Is this an action link? + if (r2.nodeName.toLowerCase() == "a" && r2.hasAttribute("href")) { + var href = r2.getAttribute("href"); + // Action link must start with "javascript:", must not contain a "void" and + // must have a function name following "javascript:" (i.e., href.length > 11) + passed = (href.startsWith("javascript:") && href.indexOf("void") == -1 && href.length > 11); + } + } + r2 = xpathResult2.iterateNext(); + } + } + } + else { + // Attribute 'aria-activedescendant' is specified. + passed = true; + } + } + } + } + if (!passed) { + roleNameArr.push(roles[j]); + } + if (!passed && savedPassed) { + savedPassed = passed; + } + } + var retToken1 = new Array(); + retToken1.push(ruleContext.nodeName.toLowerCase()); + var retToken2 = new Array(); + retToken2.push(roleNameArr.join(", ")); + // Determine if this is referenced by a combobox. If so, leave it to the combobox rules to check + var id = ruleContext.getAttribute("id"); + if (id && id.trim().length > 0) { + if (ruleContext.ownerDocument.querySelector("*[aria-controls='".concat(id, "'][role='combobox']"))) { + return null; + } + } + return savedPassed ? (0, IRule_1.RulePass)("pass") : (0, IRule_1.RulePotential)("potential_no_keyboard_access", [retToken1.toString(), retToken2.toString()]); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_landmark_name_unique.ts" +/*!***************************************************!*\ + !*** ./src/v4/rules/aria_landmark_name_unique.ts ***! + \***************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_landmark_name_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var ARIAMapper_1 = __webpack_require__(/*! ../../v2/aria/ARIAMapper */ "./src/v2/aria/ARIAMapper.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +exports.aria_landmark_name_unique = { + id: "aria_landmark_name_unique", + context: "aria:complementary, aria:banner, aria:contentinfo, aria:main, aria:navigation, aria:region, aria:search, aria:form", + refactor: { + "landmark_name_unique": { + "Pass_0": "pass", + "Fail_0": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_landmark_name_unique.html", + "fail_label_not_unique": "aria_landmark_name_unique.html", + "group": "aria_landmark_name_unique.html" + } + }, + messages: { + "en-US": { + "pass": "Multiple elements with \"{0}\" landmarks within the same parent region are distinguished by unique 'aria-label' or 'aria-labelledby'", + "fail_label_not_unique": "Multiple elements with \"{0}\" landmarks within the same parent region are not distinguished from one another because they have the same \"{1}\" label", + "group": "Each landmark should have a unique 'aria-labelledby' or 'aria-label' or be nested in a different parent region" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }, + { + "id": ["WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + // TODO do I need to fiter out bad contentinfo nodes: The footer element is not a contentinfo landmark when it is a descendant of the following HTML5 sectioning elements: https://www.w3.org/TR/2017/NOTE-wai-aria-practices-1.1-20171214/examples/landmarks/HTML5.html + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // Checking if this landmark is inside a dialog element. If it is we are going to skip checking it. + /**var copyOfRuleContext = ruleContext; + var parnetNodesOfRuleContext = []; + while (copyOfRuleContext) { + parnetNodesOfRuleContext.unshift(copyOfRuleContext); + copyOfRuleContext = copyOfRuleContext.parentElement; + } + parnetNodesOfRuleContext.forEach(elem => { + if (elem !== null) { + if (elem.tagName == "DIALOG" || elem.getAttribute('role') == "dialog") { + return null // Skipping checking landmarks that happen to be inside dialog elements + } + } + }) + */ + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["DIALOG"]) !== null || AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, "dialog", true) !== null) + return null; + // Begining formCache work + var ownerDocument = fragment_1.FragmentUtil.getOwnerFragment(ruleContext); + var formCache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "aria_landmark_name_unique", null); + if (!formCache) { + // console.log("---------ENTERING FORM CACHE") + formCache = { + navigationNodes: [], + navigationNodesComputedLabels: [], + navigationNodesParents: [], + navigationNodesMatchFound: [] + }; + var navigationNodesTemp = ownerDocument.querySelectorAll('aside,[role="complementary"], footer,[role="contentinfo"], header,[role="banner"], main,[role="main"], nav,[role="navigation"], form,[role="form"], section,[role="region"],[role="search"]'); + var navigationNodes = Array.from(navigationNodesTemp); + var navigationNodesParents = []; + var navigationNodesMatchFound = []; + // This block of code filters out any nav elements that are under a dialog. As those are not ones we want to test against as we consider dialogs are separate locations from the rest of the main page. + var navigationNodesWithoutDialogs = []; + for (var i = 0; i < navigationNodes.length; i++) { + /**let a = navigationNodes[i]; + + let dialogNodeFoundFlag = false; + while (a) { + a = a.parentElement; + if (a !== null) { + if (a.tagName == "DIALOG" || a.getAttribute('role') == "dialog") { + dialogNodeFoundFlag = true; + } + } + } + if (!dialogNodeFoundFlag) { + navigationNodesWithoutDialogs.push(navigationNodes[i]) + }*/ + // ignore node that is AT hidden or in a dialog + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(navigationNodes[i]) || CommonUtil_1.CommonUtil.getAncestor(navigationNodes[i], ["DIALOG"]) !== null || AriaUtil_1.AriaUtil.getAncestorWithRole(navigationNodes[i], "dialog", true) !== null) + continue; + navigationNodesWithoutDialogs.push(navigationNodes[i]); + } + navigationNodes = navigationNodesWithoutDialogs; + for (var i = 0; i < navigationNodes.length; i++) { + // Loop over all the landmark nodes + var els = []; + var a = navigationNodes[i].parentElement; + while (a) { + els.push(a); + a = a.parentElement; + } + for (var j = 0; j < els.length; j++) { + // Loop over all the parents of the landmark nodes + // Find nearest landmark parent based on the tagName or the role attribute + var tagNameTrigger = [ + "ASIDE", + "FOOTER", + "FORM", + "HEADER", + "MAIN", + "NAV", + "SECTION", + ].includes(els[j].tagName); + var roleNameTrigger = false; + if (els[j].hasAttribute("role")) { + roleNameTrigger = [ + "complementary", + "contentinfo", + "form", + "banner", + "main", + "navigation", + "region", + "search", + ].includes(els[j].getAttribute("role")); // TODO we are not covering the case where a elemenent with multiple roles. e.g., role = "form banner". This is a improvment we might want to add in the future. + } + if (tagNameTrigger || roleNameTrigger) { + // Nearest parent-landmark found + navigationNodesParents.push(els[j]); + break; + } + if (j === els.length - 1) { + // This node is at the head of the file so it does not have a parent + navigationNodesParents.push(null); + break; + } + } + } + var navigationNodesComputedLabels = []; + for (var i = 0; i < navigationNodes.length; i++) { + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(navigationNodes[i]); + // Loop over all the landmark nodes + navigationNodesComputedLabels.push( + /**ARIAMapper.computeName(navigationNodes[i])*/ + pair && pair.name && pair.name.trim().length > 0 ? pair.name.trim() : ""); + } + for (var i = 0; i < navigationNodesParents.length; i++) { + // Loop over all the parents of the landmark nodes to find duplicates + var matchFound = false; + var pass_0_flag = false; + for (var j = 0; j < navigationNodesParents.length; j++) { + if (j === i) { + // We do not want to compare against ourselfs + continue; + } + // This if statement focus on the case where the parent landmark is null + if (navigationNodesParents[i] === null && + navigationNodesParents[j] === null) { + // We are looking at two root nodes, so we should compare them. + if (ARIAMapper_1.ARIAMapper.nodeToRole(navigationNodes[i]) === + ARIAMapper_1.ARIAMapper.nodeToRole(navigationNodes[j])) { + // Both nodes have the same role AND + if (navigationNodesComputedLabels[i] === + navigationNodesComputedLabels[j]) { + // both have the same (computed) aria-label/aria-labelledby + // if (navigationNodesComputedLabels[i] === "") { + navigationNodesMatchFound.push("fail_label_not_unique"); // Fail 0 + matchFound = true; + break; + // } + } + else { + // Same parents && same node roles BUT different computed aria-label/aria-labelledby + // We have at least a Pass_0. But we need to check all nodes to see if another one fails. So set a flag. + pass_0_flag = true; + } + } + else { + // Same parents but different node roles // Not applicable + } + } + else if (navigationNodesParents[i] === null || + navigationNodesParents[j] === null) { + // We are looking at a single root node + continue; + } + // This if statement focus on the case where the parent landmark is NOT null + if (DOMUtil_1.DOMUtil.sameNode(navigationNodesParents[i], navigationNodesParents[j])) { + // We have the same parent-landmark AND + if (ARIAMapper_1.ARIAMapper.nodeToRole(navigationNodes[i]) === + ARIAMapper_1.ARIAMapper.nodeToRole(navigationNodes[j])) { + // Both nodes have the same role AND + if (navigationNodesComputedLabels[i] === + navigationNodesComputedLabels[j]) { + // both have the same (computed) aria-label/aria-labelledby + // if (navigationNodesComputedLabels[i] === "") { + navigationNodesMatchFound.push("fail_label_not_unique"); // Fail 0 + matchFound = true; + break; + // } + } + else { + // Same parents && same node roles BUT different computed aria-label/aria-labelledby + // We have at least a Pass_0. But we need to check all nodes to see if another one fails. So set a flag. + pass_0_flag = true; + } + } + else { + // Same parents but different node roles // Not applicable + } + } + else { + // Different parents // Not applicable + } + } + if (!matchFound) { + if (pass_0_flag) { + navigationNodesMatchFound.push("pass"); + } + else { + navigationNodesMatchFound.push("null"); // This is not the keyword null on purpose. It is a spaceholder in the array so indexes match up. + } + } + } + formCache.navigationNodesComputedLabels = + navigationNodesComputedLabels; + formCache.navigationNodes = navigationNodes; + formCache.navigationNodesParents = navigationNodesParents; + formCache.navigationNodesMatchFound = navigationNodesMatchFound; + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "aria_landmark_name_unique", formCache); + // TODO Add validation that all 3 arrays are the same length + // console.log("-------------End formCache") + } // End formCache + var indexToCheck = -1; + for (var i = 0; i < formCache.navigationNodes.length; i++) { + if (ruleContext.isSameNode(formCache.navigationNodes[i])) { + indexToCheck = i; + } + } + if (indexToCheck === -1) { + return null; + } + if (formCache.navigationNodesMatchFound[indexToCheck] === "pass") { + return (0, IRule_1.RulePass)("pass", [ + ARIAMapper_1.ARIAMapper.nodeToRole(formCache.navigationNodes[indexToCheck]), + ]); + } + else if (formCache.navigationNodesMatchFound[indexToCheck] === "fail_label_not_unique") { + return (0, IRule_1.RuleFail)("fail_label_not_unique", [ + ARIAMapper_1.ARIAMapper.nodeToRole(formCache.navigationNodes[indexToCheck]), + formCache.navigationNodesComputedLabels[indexToCheck], + ]); + } + else { + return null; + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_main_label_unique.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/aria_main_label_unique.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_main_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_main_label_unique = { + id: "aria_main_label_unique", + context: "aria:main", + refactor: { + "Rpt_Aria_MultipleMainsRequireLabel_Implicit_2": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_main_label_unique.html", + "Fail_1": "aria_main_label_unique.html", + "group": "aria_main_label_unique.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Multiple elements with \"main\" role do not have unique labels", + "group": "Each element with \"main\" role must have unique label that describes its purposes" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var contextLabel = AriaUtil_1.AriaUtil.getAriaLabel(ruleContext); + var parentDocRole = AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, "document", true); + var mains = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "main", true, true); + var result = null; + for (var i = 0; i < mains.length; ++i) { + if (mains[i] === ruleContext) + continue; + result = (0, IRule_1.RulePass)("Pass_0"); + var thisParentDocRole = AriaUtil_1.AriaUtil.getAncestorWithRole(mains[i], "document", true); + if (thisParentDocRole === parentDocRole) { + if (AriaUtil_1.AriaUtil.getAriaLabel(mains[i]) === contextLabel) { + result = (0, IRule_1.RuleFail)("Fail_1"); + break; + } + } + } + return result; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_main_label_visible.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/aria_main_label_visible.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_main_label_visible = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_main_label_visible = { + id: "aria_main_label_visible", + context: "dom:body", + refactor: { + "Rpt_Aria_MultipleMainsVisibleLabel_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_main_label_visible.html", + "Fail_1": "aria_main_label_visible.html", + "group": "aria_main_label_visible.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Multiple elements with \"main\" role do not have unique visible labels", + "group": "Each element with \"main\" role should have a unique visible label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // Consider the Check Hidden Content setting that is set by the rules + //call getElementsByRoleHidden with considerImplicit flag as true + //so that the method returs <main> elements + var landmarks = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "main", true, true); + if (landmarks.length === 0 || landmarks.length === 1) { + return null; + } + var passed = AriaUtil_1.AriaUtil.hasUniqueAriaLabelledby(landmarks); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_navigation_label_unique.ts" +/*!******************************************************!*\ + !*** ./src/v4/rules/aria_navigation_label_unique.ts ***! + \******************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_navigation_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_navigation_label_unique = { + id: "aria_navigation_label_unique", + context: "aria:navigation", + refactor: { + "Rpt_Aria_MultipleNavigationLandmarks_Implicit": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_navigation_label_unique.html", + "fail_label_not_unique": "aria_navigation_label_unique.html", + "group": "aria_navigation_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"navigation\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"navigation\" role do not have unique labels", + "group": "Each element with \"navigation\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "navigation", true); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_parent_required.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/aria_parent_required.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_parent_required = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_parent_required = { + id: "aria_parent_required", + context: "dom:*[role]", + dependencies: ["aria_role_allowed"], + refactor: { + "Rpt_Aria_RequiredParent_Native_Host_Sematics": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "aria_parent_required.html", + "Pass_0": "aria_parent_required.html", + "Fail_1": "aria_parent_required.html" + } + }, + messages: { + "en-US": { + "group": "Each element with an implicit or explicit role must be contained within a valid element", + "Pass_0": "Rule Passed", + "Fail_1": "Element with \"{0}\" role is not contained in or owned by an element with one of the following roles: \"{1}\"" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + // TODO: ACT: Check Fail 3 + act: "ff89c9", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip the check if the element should be a presentational child of an element + if (AriaUtil_1.AriaUtil.shouldBePresentationalChild(ruleContext) || VisUtil_1.VisUtil.isNodePresentational(ruleContext)) + return; + var passed = true; + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + var roleNameArr = new Array(); + var containerRoles = new Array(); + var testedContainer = 0; + var ancestorRoles = contextHierarchies["aria"].map(function (info) { return info.role; }); + var parentRole = ancestorRoles[ancestorRoles.length - 2]; + var count = 2; + while (parentRole === 'none') { + count++; + parentRole = ancestorRoles[ancestorRoles.length - count]; + } + /**for (let j = 0, length = roles.length; j < length; ++j) { + if (designPatterns[roles[j]] && designPatterns[roles[j]].container != null) { + testedContainer++; + passed = false; + containerRoles = designPatterns[roles[j]].container; + for (let i = 0, containersLength = containerRoles.length; !passed && i < containersLength; i++) { + passed = parentRole === containerRoles[i]; + if (passed) break; + } + if (passed == false) { + roleNameArr.push(roles[j]); + } + } + } + */ + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + if (designPatterns[role] && designPatterns[role].container != null) { + testedContainer++; + passed = false; + containerRoles = designPatterns[role].container; + for (var i = 0, containersLength = containerRoles.length; !passed && i < containersLength; i++) { + passed = parentRole === containerRoles[i]; + if (passed) + break; + } + if (passed == false) { + roleNameArr.push(role); + } + } + var retToken1 = new Array(); + retToken1.push(roleNameArr.join(", ")); + var retToken2 = new Array(); + retToken2.push(containerRoles.join(", ")); + //return new ValidationResult(passed, [ruleContext], '', '', passed == true ? [] : [retToken1, retToken2]); + if (testedContainer == 0) { + return null; + } + else if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", [retToken1.toString(), retToken2.toString()]); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_region_label_unique.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/aria_region_label_unique.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_region_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_region_label_unique = { + id: "aria_region_label_unique", + context: "aria:region", + refactor: { + "Rpt_Aria_MultipleRegionsUniqueLabel_Implicit": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_region_label_unique.html", + "fail_label_not_unique": "aria_region_label_unique.html", + "group": "aria_region_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"region\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"region\" role do not have unique labels", + "group": "Each element with \"region\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "region"); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_region_labelled.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/aria_region_labelled.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_region_labelled = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_region_labelled = { + id: "aria_region_labelled", + context: "aria:region", + refactor: { + "Rpt_Aria_RegionLabel_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + // "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_0": "aria_region_labelled.html", + "Fail_1": "aria_region_labelled.html", + // "Fail_2": "aria_region_labelled.html", + "group": "aria_region_labelled.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Element with \"region\" role does not have a label", + // "Fail_2": "Element with \"region\" role is not labeled with 'aria-label' or 'aria-labelledby'", + "group": "Each element with \"region\" role must have a label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = AriaUtil_1.AriaUtil.hasAriaLabel(ruleContext) || CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "title"); + if (passed) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_role_allowed.ts" +/*!*******************************************!*\ + !*** ./src/v4/rules/aria_role_allowed.ts ***! + \*******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_role_allowed = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +exports.aria_role_allowed = { + id: "aria_role_allowed", + context: "dom:*[role]", + refactor: { + "Rpt_Aria_ValidRole": { + "Pass_0": "Pass_0", + "Fail_2": "Fail_2", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "group": "aria_role_allowed.html", + "Pass_0": "aria_role_allowed.html", + "Fail_2": "aria_role_allowed.html", + "Potential_1": "aria_role_allowed.html" + } + }, + messages: { + "en-US": { + "group": "Elements must have a valid 'role' per ARIA specification", + "Pass_0": "Rule Passed", + "Fail_2": "The role '{0}' defined on the element is not valid per ARIA specification", + "Potential_1": "Some of the roles, '{0}', defined on the element are not valid per ARIA specification" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "4.1.2", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + // TODO: ACT: Recheck + act: "674b10", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var roleStr = ruleContext.getAttribute("role").trim().toLowerCase(); + if (roleStr.length === 0) { + return null; + } + if (ruleContext.hasAttribute("aria-hidden") && ruleContext.getAttribute("aria-hidden").toLowerCase() === "true") { + return null; + } + var invalidRoles = AriaUtil_1.AriaUtil.getRolesUndefinedByAria(ruleContext); + if (!invalidRoles || invalidRoles.length === 0) + return (0, IRule_1.RulePass)("Pass_0"); + else { + var roles = roleStr.split(/\s+/); + if (invalidRoles.length === roles.length) { + return (0, IRule_1.RuleFail)("Fail_2", [invalidRoles.join(",")]); + } + else if (invalidRoles.length > 0) { + return (0, IRule_1.RulePotential)("Potential_1", [invalidRoles.join(",")]); + } + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_role_redundant.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/aria_role_redundant.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_role_redundant = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +exports.aria_role_redundant = { + id: "aria_role_redundant", + context: "dom:*[role]", + help: { + "en-US": { + "pass": "aria_role_redundant.html", + "fail_redundant": "aria_role_redundant.html", + "group": "aria_role_redundant.html" + } + }, + messages: { + "en-US": { + "pass": "An explicitly-assigned ARIA role is not redundant with the implicit role of the element", + "fail_redundant": "The explicitly-assigned ARIA role \"{0}\" is redundant with the implicit role of the element <{1}>", + "group": "An explicitly-assigned ARIA role should not be redundant with the implicit role of the element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["ARIA"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var elemName = ruleContext.tagName.toLowerCase(); + var ariaRoles = AriaUtil_1.AriaUtil.getRoles(ruleContext, false); + if (!ariaRoles || ariaRoles.length === 0) + return; + // the invalid role case: handled by Rpt_Aria_ValidRole. Ignore to avoid duplicated report + var role_defined = AriaUtil_1.AriaUtil.areRolesDefined(ariaRoles); + if (!role_defined) + return null; + // dependency check: if it's already failed in the parent relation, then skip this check + // comment out to report the redundant role for table element: tr, td & th + /**if (["td", "th", "tr"].includes(elemName)) { + let parentRole = TableUtil.isTableDescendant(contextHierarchies); + if (parentRole !== null && parentRole.length > 0) + return null; + }*/ + var implicitRoles = AriaUtil_1.AriaUtil.getImplicitRole(ruleContext); + if (!implicitRoles || implicitRoles.length === 0) + return (0, IRule_1.RulePass)("pass"); + var ret = []; + for (var i = 0; i < ariaRoles.length; i++) { + if (!implicitRoles.includes(ariaRoles[i])) + ret.push((0, IRule_1.RulePass)("pass")); + else + ret.push((0, IRule_1.RuleFail)("fail_redundant", [ariaRoles[i], elemName])); + } + if (ret.length > 0) + return ret; + return null; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_search_label_unique.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/aria_search_label_unique.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_search_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_search_label_unique = { + id: "aria_search_label_unique", + context: "aria:search", + refactor: { + "Rpt_Aria_MultipleSearchLandmarks": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_search_label_unique.html", + "fail_label_not_unique": "aria_search_label_unique.html", + "group": "aria_search_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"search\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"search\" role do not have unique labels", + "group": "Each element with \"search\" role must have a unique label that describes its purpose" + } + }, + /** + * deprecated the rule on 01/27/2025 + * rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": eRulePolicy.VIOLATION, + "toolkitLevel": eToolkitLevel.LEVEL_THREE + }],*/ + rulesets: [{ + "id": [], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "search", true); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_semantics.ts" +/*!****************************************!*\ + !*** ./src/v4/rules/aria_semantics.ts ***! + \****************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_valid = exports.aria_role_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.aria_role_valid = { + id: "aria_role_valid", + context: "dom:*", + dependencies: ["aria_attribute_allowed"], + refactor: { + "aria_semantics_role": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_0": "aria_role_valid.html", + "Fail_1": "aria_role_valid.html", + "Fail_2": "aria_role_valid.html", + "group": "aria_role_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The ARIA role '{0}' is not valid for the element <{1}>", + "Fail_2": "The ARIA role '{0}' is not valid for the element <{1}> and may be ignored by the browser since the element is focusable", + "group": "ARIA roles must be valid for the element to which they are assigned" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var tagName = ruleContext.tagName.toLowerCase(); + // only chek element (1) and fragment nodes (11) + if (ruleContext.nodeType !== 1 /* Node.ELEMENT_NODE */) + return null; + //skip the rule + // the invalid role case: handled by aria_role_allowed. Ignore to avoid duplicated report + var undefinedRoles = AriaUtil_1.AriaUtil.getRolesUndefinedByAria(ruleContext); + if (undefinedRoles && undefinedRoles.length > 0) + return null; + var deprecatedRoles = AriaUtil_1.AriaUtil.getDeprecatedAriaRoles(ruleContext); + if (deprecatedRoles && deprecatedRoles.length > 0) + return null; + var deprecatedAttributes = AriaUtil_1.AriaUtil.getDeprecatedAriaAttributes(ruleContext); + if (deprecatedAttributes && deprecatedAttributes.length > 0) + return null; + // dependency check: if it's already failed, then skip + if (["td", "th", "tr"].includes(tagName)) { + var parentRole = CommonUtil_1.CommonUtil.isTableDescendant(contextHierarchies); + if (parentRole !== null && parentRole.length > 0) + return null; + } + var domRoles = AriaUtil_1.AriaUtil.getUserDefinedRoles(ruleContext); + if (!domRoles || domRoles.length === 0) + return null; + // check the 'generic' role first + if (domRoles.includes('generic')) + return (0, IRule_1.RuleFail)("Fail_1", ["generic", tagName]); + var invalidRoles = AriaUtil_1.AriaUtil.getInvalidRoles(ruleContext); + if (invalidRoles === null || invalidRoles.length === 0) + return (0, IRule_1.RulePass)("Pass_0", [domRoles.join(", "), tagName]); + if (invalidRoles.includes("presentation") || invalidRoles.includes("none") && CommonUtil_1.CommonUtil.isTabbable(ruleContext)) + return (0, IRule_1.RuleFail)("Fail_2", [invalidRoles.join(", "), tagName]); + if (invalidRoles.length > 0) + return (0, IRule_1.RuleFail)("Fail_1", [invalidRoles.join(", "), tagName]); + if (domRoles.length > 0) + return (0, IRule_1.RulePass)("Pass_0", [domRoles.join(", "), tagName]); + return null; + } +}; +// This rule is in the same file because there is a dependency that aria_role_valid runs first, +// and the info is passed by cache, but there isn't a dependency in the Fail_2 scenario, so regular +// dependency cannot be used +exports.aria_attribute_valid = { + id: "aria_attribute_valid", + context: "dom:*", + // The the ARIA role is completely invalid, skip this check + dependencies: ["aria_attribute_deprecated", "aria_role_valid"], + refactor: { + "aria_attribute_allowed": { + "Pass": "Pass", + "Fail_invalid_role_attr": "Fail_invalid_role_attr", + "Fail_invalid_implicit_role_attr": "Fail_invalid_implicit_role_attr" + } + }, + help: { + "en-US": { + "group": "aria_attribute_valid.html", + "Pass": "aria_attribute_valid.html", + "Fail_invalid_role_attr": "aria_attribute_valid.html", + "Fail_invalid_implicit_role_attr": "aria_attribute_valid.html" + } + }, + messages: { + "en-US": { + "group": "ARIA attributes should be valid for the element and ARIA role to which they are assigned", + "Pass": "ARIA attributes are valid for the element and ARIA role", + "Fail_invalid_role_attr": "The ARIA attributes \"{0}\" are not valid for the element <{1}> with ARIA role \"{2}\"", + "Fail_invalid_implicit_role_attr": "The ARIA attributes \"{0}\" are not valid for the element <{1}> with implicit ARIA role \"{2}\"" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["ARIA"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: ["5c01ea", { "46ca7f": { "Pass": "pass", "Fail_invalid_role_attr": "fail", "Fail_invalid_implicit_role_attr": "fail" } }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // only chek element (1) + if (ruleContext.nodeType !== 1 /* Node.ELEMENT_NODE */) + return null; + // ignore if no aria attribute + var ariaAttributes = AriaUtil_1.AriaUtil.getUserDefinedAriaAttributes(ruleContext); + if (ariaAttributes === null || ariaAttributes.length === 0) + return null; + var roles = AriaUtil_1.AriaUtil.getUserDefinedRoles(ruleContext); + var explicit = true; + if (roles && roles.length > 0) { + // the invalid role case: handled by Rpt_Aria_ValidRole. Ignore to avoid duplicated report + if (!AriaUtil_1.AriaUtil.areRolesDefined(roles)) + return null; + } + else { + //no explicit role defined + roles = AriaUtil_1.AriaUtil.getImplicitRole(ruleContext); + explicit = false; + } + var tagName = ruleContext.tagName.toLowerCase(); + var failedAttributes = AriaUtil_1.AriaUtil.getInvalidAriaAttributes(ruleContext); + if (!failedAttributes || failedAttributes.length === 0) + return (0, IRule_1.RulePass)("Pass", [ariaAttributes.join(", "), tagName, roles.join(", ")]); + if (roles.length > 0) { + if (explicit) + return (0, IRule_1.RuleFail)("Fail_invalid_role_attr", [failedAttributes.join(", "), tagName, roles.join(", ")]); + else + return (0, IRule_1.RuleFail)("Fail_invalid_implicit_role_attr", [failedAttributes.join(", "), tagName, roles.join(", ")]); + } + return (0, IRule_1.RuleFail)("Fail_invalid_role_attr", [failedAttributes.join(", "), tagName, "none"]); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_toolbar_label_unique.ts" +/*!***************************************************!*\ + !*** ./src/v4/rules/aria_toolbar_label_unique.ts ***! + \***************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_toolbar_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +exports.aria_toolbar_label_unique = { + id: "aria_toolbar_label_unique", + context: "aria:toolbar", + refactor: { + "Rpt_Aria_MultipleToolbarUniqueLabel": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_toolbar_label_unique.html", + "Fail_1": "aria_toolbar_label_unique.html", + "group": "aria_toolbar_label_unique.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Multiple elements with \"toolbar\" roles do not have unique labels", + "group": "Each element with \"toolbar\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Consider the Check Hidden Content setting that is set by the rules + // Also, consider Implicit role checking. + var landmarks = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "toolbar", true, true); + if (landmarks.length === 0 || landmarks.length === 1) { + return null; + } + var dupes = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "aria_toolbar_label_unique", null); + if (!dupes) { + dupes = AriaUtil_1.AriaUtil.findAriaLabelDupes(landmarks); + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "aria_toolbar_label_unique", dupes); + } + var myLabel = AriaUtil_1.AriaUtil.getAriaLabel(ruleContext); + var passed = myLabel !== "" && (!(myLabel in dupes) || dupes[myLabel] <= 1); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", [myLabel]); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_widget_labelled.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/aria_widget_labelled.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_widget_labelled = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var ARIAMapper_1 = __webpack_require__(/*! ../../v2/aria/ARIAMapper */ "./src/v2/aria/ARIAMapper.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +exports.aria_widget_labelled = { + id: "aria_widget_labelled", + context: "dom:*", + refactor: { + "Rpt_Aria_WidgetLabels_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "aria_widget_labelled.html", + "Pass_0": "aria_widget_labelled.html", + "Fail_1": "aria_widget_labelled.html" + } + }, + messages: { + "en-US": { + "group": "Interactive component must have a programmatically associated name", + "Pass_0": "Rule Passed", + "Fail_1": "Interactive component with ARIA role '{0}' does not have a programmatically associated name" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: "m6b1q3", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + /* removed the role check role= presentation and role=none since these 2 roles are not in the list of widget type roles */ + if ((ruleContext.hasAttribute("type") && + ruleContext.getAttribute("type") === "hidden") || + (AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, "combobox") && + !(AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "textbox") || + AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "searchbox")))) { + // we need to diagnose that a combobox input textbox has a label(github issue #1104) + return null; + } + var elemRole = ARIAMapper_1.ARIAMapper.nodeToRole(ruleContext); + var tagName = ruleContext.nodeName.toLowerCase(); + // Handled by input_label_exists + var skipRoles = [ + "button", + "checkbox", + "combobox", + "listbox", + "menuitemcheckbox", + "menuitemradio", + "radio", + "searchbox", + "slider", + "spinbutton", + "switch", + "textbox", + "progressbar", + "link", + ]; + if (skipRoles.includes(elemRole)) + return null; + if (tagName === "output" || + (tagName === "input" && + ruleContext.getAttribute("type") === "file")) { + } + if (!ruleContext.hasAttribute("role")) { + // Form/input elements are checked by G41, we skip them from this rule. Github issue 449 + var skipElements = [ + "input", + "textarea", + "select", + "button", + "datalist", + "optgroup", + "option", + "keygen", + "output", + "progress", + "meter", + ]; + if (skipElements.indexOf(ruleContext.nodeName.toLowerCase()) != + -1) { + return null; + } + } + // avoid diagnosing the popup list of a combobox. + var rolesToCheck = ["listbox", "tree", "grid", "dialog"]; + for (var j = 0; j < rolesToCheck.length; j++) { + if (AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, rolesToCheck[j])) { + var comboboxes = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "combobox", true, true); + for (var k = 0; k < comboboxes.length; k++) { + var combobox = comboboxes[k]; + var aria_owns = CommonUtil_1.CommonUtil.getElementAttribute(combobox, "aria-owns"); + if (aria_owns) { + var owns = CommonUtil_1.CommonUtil.normalizeSpacing(aria_owns.trim()).split(" "); + for (var i = 0; i < owns.length; i++) { + var owned = fragment_1.FragmentUtil.getById(ruleContext, owns[i]); + if (owned === ruleContext) { + return null; + } + } + } + } + } + } + var passed = true; + var prohibited = false; + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + //get attribute roles as well as implicit roles. + var roles = AriaUtil_1.AriaUtil.getRoles(ruleContext, true); + var numWidgetsTested = 0; + var interactiveRoleTypes = ["widget", "liveRegion", "window"]; + for (var i = 0, length_1 = roles.length; passed && i < length_1; ++i) { + var pattern = designPatterns[roles[i]]; + if (pattern && + pattern.nameRequired && + pattern.roleType && + interactiveRoleTypes.includes(pattern.roleType)) { + ++numWidgetsTested; + // All widgets may have an author supplied accessible name. + // Title is legal, but don't advertise its use in documentation. + // Encourage use of aria-label, aria-labelledby or html label element. + passed = + AriaUtil_1.AriaUtil.hasAriaLabel(ruleContext) || + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "title") || + CommonUtil_1.CommonUtil.getLabelForElementHidden(ruleContext, true); + if (!passed && + pattern.nameFrom && + pattern.nameFrom.indexOf("contents") >= 0) { + // See if widget's accessible name is supplied by element's inner text + // nameFrom: ["author", "contents"] + passed = CommonUtil_1.CommonUtil.hasInnerContentOrAlt(ruleContext); + } + if (!passed) { + // check if it has implicit label, like <label><input ....>abc </label> + passed = CommonUtil_1.CommonUtil.hasImplicitLabel(ruleContext); + } + if (!passed && + ruleContext.tagName.toLowerCase() === "img" && + !ruleContext.hasAttribute("role") && + ruleContext.hasAttribute("alt")) { + passed = + DOMUtil_1.DOMUtil.cleanWhitespace(ruleContext.getAttribute("alt")).trim().length > 0; + } + if (pattern.nameFrom.indexOf("prohibited") >= 0) { + prohibited = true; + } + } + } + if (numWidgetsTested === 0) { + return null; + } + else if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", [elemRole]); + } + else { + //TODO + // if (prohibited) { + // return RuleFail("Fail_2"); + // } else { + return (0, IRule_1.RulePass)("Pass_0"); + // } + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/asciiart_alt_exists.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/asciiart_alt_exists.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.asciiart_alt_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.asciiart_alt_exists = { + id: "asciiart_alt_exists", + context: "dom:pre, dom:listing, dom:xmp, dom:plaintext", + refactor: { + "RPT_Pre_ASCIIArt": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "asciiart_alt_exists.html", + "Potential_1": "asciiart_alt_exists.html", + "group": "asciiart_alt_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that ASCII art has a text alternative", + "group": "ASCII art must have a text alternative" + } + }, + /** + * Decision in planning 9/7/23 that this rule causes more reviews that we see actual problems in content, so turn these rules off + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": eRulePolicy.VIOLATION, + "toolkitLevel": eToolkitLevel.LEVEL_ONE + }], + */ + rulesets: [], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Fix for IDWB writers. Don't trigger if content is in a code element. The code element is searched for + // in various places because of the weird way various browsers render <code><pre></pre></code. Firefox, + // HtmlUnit and Chrome all render differently. Firefox: <code></code><pre></pre> HtmlUnit: </code><pre><code></code></pre> + // See unit test CodeElementAbovePreElement.html. Don't know how RPT renders, so cover all the bases. + if (ruleContext.nodeName.toLowerCase() == "pre") { + if ((ruleContext.previousSibling && ruleContext.previousSibling.nodeName.toLowerCase() == "code") || + ruleContext.getElementsByTagName("code").length > 0 || + CommonUtil_1.CommonUtil.getAncestor(ruleContext, "code")) { + return (0, IRule_1.RulePass)("Pass_0"); + } + } + var passed = true; + var txtValue = CommonUtil_1.CommonUtil.getInnerText(ruleContext); + var nonAlphaNumericNorSpaceCount = 0; + var alphNumSameCharacterCount = 0; + var lastCharacter = ""; + // Iterate through the text content + for (var idx = 0; passed && (idx < txtValue.length); ++idx) { + var chStr = txtValue.substr(idx, 1); + // Check if it is alphanumeric or punctuation + if (/[\w!@#$%&\*().,?\[\]{}<>=":\/\\-]/.test(chStr)) { + // Detect same character sequence + if (lastCharacter == chStr) { + alphNumSameCharacterCount = alphNumSameCharacterCount + 1; + ; + } + else { + alphNumSameCharacterCount = 0; + } + } + else if (/\s/.test(chStr)) { + alphNumSameCharacterCount = 0; + } + else { + nonAlphaNumericNorSpaceCount = nonAlphaNumericNorSpaceCount + 1; + alphNumSameCharacterCount = 0; + } + lastCharacter = chStr; + // Make the decision + if (nonAlphaNumericNorSpaceCount >= 5 || alphNumSameCharacterCount >= 4) { + passed = false; + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/blink_css_review.ts" +/*!******************************************!*\ + !*** ./src/v4/rules/blink_css_review.ts ***! + \******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.blink_css_review = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.blink_css_review = { + id: "blink_css_review", + context: "dom:style, dom:*[style]", + refactor: { + "RPT_Blink_CSSTrigger1": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "group": "blink_css_review.html", + "Pass_0": "blink_css_review.html", + "Potential_1": "blink_css_review.html" + } + }, + messages: { + "en-US": { + "group": "Do not use the \"blink\" value of the 'text-decoration' property for longer than five seconds", + "Pass_0": "Rule Passed", + "Potential_1": "Check the \"blink\" value of the CSS 'text-decoration' property is not used for more than than five seconds" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "2.2.2", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var textValue = CommonUtil_1.CommonUtil.getInnerText(ruleContext); + if (ruleContext.hasAttribute('style')) { + textValue = ruleContext.getAttribute('style'); + } + var passed = textValue.toLowerCase().indexOf("text-decoration:blink") == -1; + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/blink_elem_deprecated.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/blink_elem_deprecated.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.blink_elem_deprecated = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.blink_elem_deprecated = { + id: "blink_elem_deprecated", + context: "dom:blink", + refactor: { + "WCAG20_Blink_AlwaysTrigger": { + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "blink_elem_deprecated.html", + "Fail_1": "blink_elem_deprecated.html" + } + }, + messages: { + "en-US": { + "group": "Content that blinks persistently must not be used", + "Fail_1": "Content found that blinks persistently" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "2.2.2", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + // const ruleContext = context["dom"].node as Element; + return (0, IRule_1.RuleFail)("Fail_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/blockquote_cite_exists.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/blockquote_cite_exists.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.blockquote_cite_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.blockquote_cite_exists = { + id: "blockquote_cite_exists", + context: "dom:blockquote", + refactor: { + "RPT_Blockquote_HasCite": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "blockquote_cite_exists.html", + "Potential_1": "blockquote_cite_exists.html", + "group": "blockquote_cite_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that <blockquote> should have a 'cite' attribute and not be used for indentation only", + "group": "Use <blockquote> only for quotations, not indentation" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "cite"); + if (!passed) { + var citeElems = CommonUtil_1.CommonUtil.getDocElementsByTag(ruleContext, "cite"); + passed = citeElems != null && citeElems.length > 0; + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/canvas_content_described.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/canvas_content_described.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.canvas_content_described = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.canvas_content_described = { + id: "canvas_content_described", + context: "dom:canvas", + refactor: { + "HAAC_Canvas": { + "Pass_0": "Pass_0", + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Pass_0": "canvas_content_described.html", + "Manual_1": "canvas_content_described.html", + "group": "canvas_content_described.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Manual_1": "Verify accessibility of the <canvas> element", + "group": "The <canvas> element may not be accessible" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1", "2.1.1", "4.1.2"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = ruleContext.innerHTML.trim().length > 0; + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/caption_track_exists.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/caption_track_exists.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.caption_track_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.caption_track_exists = { + id: "caption_track_exists", + context: "dom:video", + refactor: { + "HAAC_Video_HasNoTrack": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "caption_track_exists.html", + "Potential_1": "caption_track_exists.html", + "group": "caption_track_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that captions are available for any meaningful audio or provide a caption track for the <video> element", + "group": "A <video> element must have a text alternative for any meaningful audio content" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.2.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = false; + // ignore decorative video if user uses aria-hidden + if (ruleContext.getAttribute("aria-hidden") === "true") { + return null; + } + var tracks = ruleContext.getElementsByTagName("track"); + for (var i = 0; i < tracks.length; ++i) { + passed = passed || tracks[i].getAttribute("kind") === 'captions'; + } + // checks for addition of dynamic tracks + if (ruleContext.textTracks && ruleContext.textTracks.length > 0) { + for (var i = 0; i < ruleContext.textTracks.length; i++) { + passed = passed || ruleContext.textTracks[i].kind === 'captions'; + } + } + if (passed) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RulePotential)("Potential_1"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/combobox_active_descendant.ts" +/*!****************************************************!*\ + !*** ./src/v4/rules/combobox_active_descendant.ts ***! + \****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.combobox_active_descendant = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.combobox_active_descendant = { + id: "combobox_active_descendant", + context: "aria:combobox", + dependencies: ["combobox_popup_reference"], + help: { + "en-US": { + "Pass": "combobox_active_descendant.html", + "Fail_missing": "combobox_active_descendant.html", + "Fail_not_in_popup": "combobox_active_descendant.html", + "Fail_active_role_invalid": "combobox_active_descendant.html", + "Fail_active_not_selected": "combobox_active_descendant.html", + "group": "combobox_active_descendant.html" + } + }, + messages: { + "en-US": { + "Pass": "'aria-activedescendant' is used appropriately for this combobox", + "Fail_missing": "The element referenced by 'aria-activedescendant' \"{0}\" does not exist", + "Fail_not_in_popup": "The element referenced by 'aria-activedescendant' \"{0}\" does not exist within the popup referenced by 'id' \"{1}\"", + "Fail_active_role_invalid": "The 'aria-activedescendant' \"{0}\" references an element with the roles \"{1}\", which does not have a valid ARIA role of 'option', 'gridcell', 'row', or 'treeitem'", + "Fail_active_not_selected": "The 'aria-activedescendant' \"{0}\" references an element that does not have 'aria-selected' set to true", + "group": "'aria-activedescendant' must be used to define focus within the combobox popup, except when using a dialog popup" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var cache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "combobox", {}); + if (!cache) + return null; + var cachedElem = cache[context["dom"].rolePath]; + if (!cachedElem) + return null; + var popupElement = cachedElem.popupElement, popupId = cachedElem.popupId; + // If this isn't defined, the combobox is probably collapsed. A reference error is + // detected in combobox_popup_reference + if (!popupElement) + return null; + // This rule only applies if the activedescendant is specified + var activeId = ruleContext.getAttribute("aria-activedescendant"); + if (!activeId || activeId.trim().length === 0) { + return null; + } + var activeElem = fragment_1.FragmentUtil.getById(ruleContext, activeId); + if (!activeElem) { + return (0, IRule_1.RuleFail)("Fail_missing", [activeId]); + } + var found = false; + // examine the children + if (popupElement) { + var nw = new DOMWalker_1.DOMWalker(popupElement); + while (!found && nw.nextNode() && nw.node != popupElement && nw.node != popupElement.nextSibling) { + if (nw.node.nodeType === 1 && VisUtil_1.VisUtil.isNodeVisible(nw.node)) { + found = nw.elem().getAttribute("id") === activeId; + } + } + } + var retVal = []; + if (!found) { + retVal.push((0, IRule_1.RulePass)("Fail_not_in_popup", [activeId, popupId])); + } + var activeRoles = AriaUtil_1.AriaUtil.getRoles(activeElem, true); + var validRoles = ["option", "gridcell", "row", "treeitem"].filter(function (validRole) { return activeRoles.includes(validRole); }); + if (validRoles.length === 0) { + retVal.push((0, IRule_1.RuleFail)("Fail_active_role_invalid", [activeId, activeRoles.join(",")])); + } + if (activeElem.getAttribute("aria-selected") !== "true") { + retVal.push((0, IRule_1.RuleFail)("Fail_active_not_selected", [activeId])); + } + if (retVal.length === 0) { + return (0, IRule_1.RulePass)("Pass"); + } + else { + return retVal; + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/combobox_autocomplete_valid.ts" +/*!*****************************************************!*\ + !*** ./src/v4/rules/combobox_autocomplete_valid.ts ***! + \*****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.combobox_autocomplete_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.combobox_autocomplete_valid = { + id: "combobox_autocomplete_valid", + context: "aria:combobox", + dependencies: ["combobox_popup_reference"], + refactor: { + "combobox_autocomplete": { + "Pass": "Pass", + "Fail_1": "Fail_1", + "Fail_inline": "Fail_inline" + } + }, + help: { + "en-US": { + "Pass": "combobox_autocomplete_valid.html", + "Fail_1": "combobox_autocomplete_valid.html", + "Fail_inline": "combobox_autocomplete_valid.html", + "group": "combobox_autocomplete_valid.html" + } + }, + messages: { + "en-US": { + "Pass": "The combobox does not use 'aria-autocomplete' value '\"inline\"' nor does it have 'aria-autocomplete' defined within the popup", + "Fail_1": "The combobox has the 'aria-autocomplete' attribute incorrectly set on an element within the popup referenced by \"{0}\"", + "Fail_inline": "The combobox does not support an 'aria-autocomplete' attribute value set to '\"inline\"' ", + "group": "A combobox that supports autocompletion behavior must have the 'aria-autocomplete' attribute only on its text input element with a valid value; a value of '\"inline\"' is not supported" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var cache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "combobox", {}); + if (!cache) + return null; + var cachedElem = cache[context["dom"].rolePath]; + if (!cachedElem) + return null; + var popupId = cachedElem.popupId, popupElement = cachedElem.popupElement; + var retVal = []; + if (ruleContext.getAttribute("aria-autocomplete") === "inline") { + retVal.push((0, IRule_1.RuleFail)("Fail_inline")); + } + var passed = true; + // examine the children + if (popupElement && VisUtil_1.VisUtil.isNodeVisible(popupElement)) { + // if popupElement itself has "aria-autocomplete" + passed = !popupElement.hasAttribute("aria-autocomplete"); + // if any child of popupElement has "aria-autocomplete" + if (passed && popupElement.children && popupElement.children.length > 0) { + var nw = new DOMWalker_1.DOMWalker(popupElement); + while (passed && nw.nextNode()) { + if (nw.node.nodeType === 1 && VisUtil_1.VisUtil.isNodeVisible(nw.node)) { + passed = !nw.elem().hasAttribute("aria-autocomplete"); + if (nw.bEndTag && nw.node === popupElement.lastElementChild) + break; + } + } + } + } + if (!passed) { + retVal.push((0, IRule_1.RuleFail)("Fail_1", [popupId])); + } + if (retVal.length > 0) { + return retVal; + } + else { + return (0, IRule_1.RulePass)("Pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/combobox_design_valid.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/combobox_design_valid.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.combobox_design_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +function patternDetect(elem) { + // check 'explicit' role combobox and that it is not <select>. + if (elem.tagName.toLowerCase() === "select" && elem.getAttribute("role") !== "combobox") { + return "implicit"; + } + else if (elem.nodeName.toLowerCase() === "input" + && (!elem.hasAttribute("type") || elem.getAttribute("type") === "text") + && elem.hasAttribute("aria-owns") && !elem.hasAttribute("aria-controls")) { + // Looks like this is an ARIA 1.0 pattern, which the ARIA 1.2 spec says to continue to allow + return "1.0"; + } + else if (elem.nodeName.toLowerCase() !== "input" + && elem.hasAttribute("aria-owns") && !elem.hasAttribute("aria-controls")) { + // Looks like this is an ARIA 1.1 pattern, which the ARIA 1.2 spec says is now invalid + return "1.1"; + } + // Assume they're trying to do the latest, 1.2 pattern + return "1.2"; +} +exports.combobox_design_valid = { + id: "combobox_design_valid", + context: "aria:combobox", + refactor: { + "combobox_version": { + "Pass_1.0": "Pass_1.0", + "Fail_1.1": "Fail_1.1", + "Pass_1.2": "Pass_1.2" + } + }, + help: { + "en-US": { + "Pass_1.0": "combobox_design_valid.html", + "Fail_1.1": "combobox_design_valid.html", + "Pass_1.2": "combobox_design_valid.html", + "group": "combobox_design_valid.html" + } + }, + messages: { + "en-US": { + "Pass_1.0": "The combobox design pattern is detected as ARIA 1.0, which is allowed by ARIA 1.2", + "Fail_1.1": "The combobox design pattern is detected as ARIA 1.1, which is not allowed by ARIA 1.2", + "Pass_1.2": "The combobox design pattern is detected as ARIA 1.2", + "group": "The combobox design pattern must be valid for ARIA 1.2" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) { + return null; + } + var pattern = patternDetect(ruleContext); + // We don't assess native select elements here + if (pattern === "implicit") { + return null; + } + var tagName = ruleContext.tagName.toLowerCase(); + var expanded = (AriaUtil_1.AriaUtil.getAriaAttribute(ruleContext, "aria-expanded") || "").trim().toLowerCase() === "true"; + var editable = tagName === "input" && (!ruleContext.hasAttribute("type") || ruleContext.getAttribute("type").toLowerCase() === "text"); + var key = context["dom"].rolePath; + if (key) { + var cache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "combobox", {}); + if (!cache) + return null; + cache[key] = { + "inputElement": editable ? ruleContext : null, + "pattern": pattern, + "expanded": expanded + }; + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "combobox", cache); + } + else { + // No xpath? + return null; + } + if (pattern === "1.0") { + return (0, IRule_1.RulePass)("Pass_1.0"); + } + else if (pattern === "1.1") { + return (0, IRule_1.RuleFail)("Fail_1.1"); + } + else if (pattern === "1.2") { + return (0, IRule_1.RulePass)("Pass_1.2"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/combobox_focusable_elements.ts" +/*!*****************************************************!*\ + !*** ./src/v4/rules/combobox_focusable_elements.ts ***! + \*****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.combobox_focusable_elements = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.combobox_focusable_elements = { + id: "combobox_focusable_elements", + context: "aria:combobox", + dependencies: ["combobox_popup_reference"], + help: { + "en-US": { + "Pass": "combobox_focusable_elements.html", + "Fail_not_tabbable": "combobox_focusable_elements.html", + "Fail_tabbable_child": "combobox_focusable_elements.html", + "group": "combobox_focusable_elements.html" + } + }, + messages: { + "en-US": { + "Pass": "DOM focus is allowed only on the combobox element as required", + "Fail_not_tabbable": "The combobox element does not allow DOM focus as required", + "Fail_tabbable_child": "The popup of the combobox has DOM focus or has 'aria-activedescendant' defined, which is not allowed", + "group": "Tabbable focus for the combobox must be allowed only on the text input, except when using a dialog popup" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var cache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "combobox", {}); + if (!cache) + return null; + var cachedElem = cache[context["dom"].rolePath]; + if (!cachedElem) + return null; + var popupElement = cachedElem.popupElement, expanded = cachedElem.expanded; + // If this isn't defined, the combobox is probably collapsed. A reference error is + // detected in combobox_popup_reference + if (!popupElement) + return null; + var popupRole = AriaUtil_1.AriaUtil.getRoles(popupElement, true)[0]; + var retVal = []; + if (!CommonUtil_1.CommonUtil.isTabbable(ruleContext)) { + retVal.push((0, IRule_1.RuleFail)("Fail_not_tabbable")); + } + // Only makes sense to check the popup when expanded + // this does not apply to dialogs, return pass since the main element was focusable above + if (expanded === false || popupRole === "dialog") { + return (0, IRule_1.RulePass)("Pass"); + } + var passed = true; + // examine the children + if (popupElement && VisUtil_1.VisUtil.isNodeVisible(popupElement)) { + // if popupElement itself has "aria-activedescendant" + passed = !CommonUtil_1.CommonUtil.isTabbable(popupElement) && !AriaUtil_1.AriaUtil.getAriaAttribute(popupElement, "aria-activedescendant"); + ; + // if any child of popupElement has "aria-autocomplete" + if (passed && popupElement.children && popupElement.children.length > 0) { + var nw = new DOMWalker_1.DOMWalker(popupElement); + while (passed && nw.nextNode()) { + if (nw.node.nodeType === 1 && VisUtil_1.VisUtil.isNodeVisible(nw.node)) { + passed = !CommonUtil_1.CommonUtil.isTabbable(nw.node) && + !AriaUtil_1.AriaUtil.getAriaAttribute(nw.node, "aria-activedescendant"); + if (nw.bEndTag && nw.node === popupElement.lastElementChild) + break; + } + } + } + } + if (!passed) { + retVal.push((0, IRule_1.RuleFail)("Fail_tabbable_child")); + } + if (retVal.length === 0) { + return (0, IRule_1.RulePass)("Pass"); + } + else { + return retVal; + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/combobox_haspopup_valid.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/combobox_haspopup_valid.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.combobox_haspopup_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +exports.combobox_haspopup_valid = { + id: "combobox_haspopup_valid", + context: "aria:combobox", + dependencies: ["combobox_popup_reference"], + refactor: { + "combobox_haspopup": { + "Pass": "Pass", + "Fail_popup_role_invalid": "Fail_popup_role_invalid", + "Fail_combobox_popup_role_mismatch": "Fail_combobox_popup_role_mismatch" + } + }, + help: { + "en-US": { + "Pass": "combobox_haspopup_valid.html", + "Fail_popup_role_invalid": "combobox_haspopup_valid.html", + "Fail_combobox_popup_role_mismatch": "combobox_haspopup_valid.html", + "group": "combobox_haspopup_valid.html" + } + }, + messages: { + "en-US": { + "Pass": "The 'aria-controls' (ARIA 1.2) or 'aria-owns' (ARIA 1.0) appropriately references a valid popup 'id' value", + "Fail_popup_role_invalid": "The 'role' value \"{0}\" of the popup element \"{1}\" should be one of \"listbox\", \"grid\", \"tree\" or \"dialog\"", + "Fail_combobox_popup_role_mismatch": "The value of the combobox 'aria-haspopup' attribute \"{0}\" does not match the 'role' value of the popup element \"{1}\"", + "group": "The combobox attribute 'aria-haspopup' value must be appropriate for the role of the element referenced by 'aria-controls' (ARIA 1.2) or 'aria-owns' (ARIA 1.0)" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var cache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "combobox", {}); + if (!cache) + return null; + var cacheKey = context["dom"].rolePath; + var cachedElem = cache[cacheKey]; + if (!cachedElem) + return null; + var popupElement = cachedElem.popupElement, popupId = cachedElem.popupId; + // If this isn't defined, the combobox is probably collapsed. A reference error is + // detected in combobox_popup_reference + if (!popupElement) + return null; + // Check that popup role is listbox, grid, tree, or dialog and that it matches the combobox + var popupRoles = AriaUtil_1.AriaUtil.getRoles(popupElement, true); + var validRoles = ["listbox", "grid", "tree", "dialog"].filter(function (validRole) { return popupRoles.includes(validRole); }); + if (validRoles.length === 0) { + return (0, IRule_1.RuleFail)("Fail_popup_role_invalid", [popupRoles.join(","), popupId]); + } + else { + var popupRole = validRoles[0]; + var haspopupVal = ruleContext.getAttribute("aria-haspopup") || "listbox"; + // Popup role must match aria-haspopup unless popupRole is listbox, then aria-haspopup should not be defined + if (haspopupVal !== popupRole) { + if (popupRole !== "listbox" || ruleContext.hasAttribute("aria-haspopup")) { + return (0, IRule_1.RuleFail)("Fail_combobox_popup_role_mismatch", [haspopupVal, popupRole]); + } + } + } + return (0, IRule_1.RulePass)("Pass"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/combobox_popup_reference.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/combobox_popup_reference.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.combobox_popup_reference = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.combobox_popup_reference = { + id: "combobox_popup_reference", + context: "aria:combobox", + dependencies: ["combobox_design_valid"], + help: { + "en-US": { + "group": "combobox_popup_reference.html", + "Pass_1.0_expanded": "combobox_popup_reference.html", + "Pass_1.0_collapsed": "combobox_popup_reference.html", + "Pass_1.2_expanded": "combobox_popup_reference.html", + "Pass_1.2_collapsed": "combobox_popup_reference.html", + "Fail_1.0_missing_owns": "combobox_popup_reference.html", + "Fail_1.2_missing_controls": "combobox_popup_reference.html", + "Fail_1.0_popup_reference_missing": "combobox_popup_reference.html", + "Fail_1.2_popup_reference_missing": "combobox_popup_reference.html", + "Fail_combobox_expanded_hidden": "combobox_popup_reference.html", + "Fail_combobox_collapsed_visible": "combobox_popup_reference.html" + } + }, + messages: { + "en-US": { + "group": "The 'aria-controls' (for ARIA 1.2) or the 'aria-owns' (for ARIA 1.0) attribute of the expanded combobox must reference a valid popup 'id' value", + "Pass_1.0_expanded": "The combobox popup referenced by 'aria-owns' (ARIA 1.0) exists and is visible", + "Pass_1.0_collapsed": "The combobox popup in its collapsed state does not reference any visible popup as required", + "Pass_1.2_expanded": "The combobox popup referenced by 'aria-controls' (ARIA 1.2) exists and is visible", + "Pass_1.2_collapsed": "The combobox popup in its collapsed state does not reference any visible popup as required", + "Fail_1.0_missing_owns": "The 'aria-owns' attribute of the expanded combobox is missing", + "Fail_1.2_missing_controls": "The 'aria-controls' attribute of the expanded combobox is missing", + "Fail_1.0_popup_reference_missing": "The 'aria-owns' attribute \"{0}\" of the expanded combobox does not reference a valid popup 'id' value", + "Fail_1.2_popup_reference_missing": "The 'aria-controls' attribute \"{0}\" of the expanded combobox does not reference a valid popup 'id' value", + "Fail_combobox_expanded_hidden": "The combobox 'aria-expanded' attribute is true, but the combobox popup is not visible", + "Fail_combobox_collapsed_visible": "The combobox 'aria-expanded' attribute is false, but the combobox popup is visible" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [{ + "4e8ab6": { + "Pass_1.0_expanded": "fail", + "Pass_1.0_collapsed": "fail", + "Pass_1.2_expanded": "pass", + "Pass_1.2_collapsed": "pass", + "Fail_1.0_missing_owns": "inapplicable", + "Fail_1.2_missing_controls": "fail", + "Fail_1.0_popup_reference_missing": "inapplicable", + "Fail_1.2_popup_reference_missing": "fail", + "Fail_combobox_expanded_hidden": "inapplicable", + "Fail_combobox_collapsed_visible": "inapplicable" + } + }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var cache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "combobox", {}); + if (!cache) + return null; + var cacheKey = context["dom"].rolePath; + var cachedElem = cache[cacheKey]; + if (!cachedElem) + return null; + var pattern = cachedElem.pattern, expanded = cachedElem.expanded; + var popupId; + var popupElement; + if (pattern === "1.0") { + if (!ruleContext.hasAttribute("aria-owns")) { + // If the combobox isn't expanded, this attribute isn't required + return !expanded ? null : (0, IRule_1.RuleFail)("Fail_1.0_missing_owns"); + } + popupId = ruleContext.getAttribute("aria-owns"); + popupElement = fragment_1.FragmentUtil.getById(ruleContext, popupId); + if (!popupElement) { + // If the combobox isn't expanded, this attribute isn't required + return !expanded ? null : (0, IRule_1.RuleFail)("Fail_1.0_popup_reference_missing", [popupId]); + } + } + else if (pattern === "1.2") { + if (!ruleContext.hasAttribute("aria-controls")) { + // If the combobox isn't expanded, this attribute isn't required + return !expanded ? null : (0, IRule_1.RuleFail)("Fail_1.2_missing_controls"); + } + popupId = ruleContext.getAttribute("aria-controls"); + popupElement = fragment_1.FragmentUtil.getById(ruleContext, popupId); + if (!popupElement) { + // If the combobox isn't expanded, this attribute isn't required + return !expanded ? null : (0, IRule_1.RuleFail)("Fail_1.2_popup_reference_missing", [popupId]); + } + } + else { + return null; + } + // We have an element, stick it in the cache and then check its role + cachedElem.popupId = popupId; + cachedElem.popupElement = popupElement; + if (expanded && !VisUtil_1.VisUtil.isNodeVisible(popupElement)) { + return (0, IRule_1.RuleFail)("Fail_combobox_expanded_hidden"); + } + else if (!expanded && VisUtil_1.VisUtil.isNodeVisible(popupElement)) { + return (0, IRule_1.RuleFail)("Fail_combobox_collapsed_visible"); + } + if (pattern === "1.0") { + if (expanded) { + return (0, IRule_1.RulePass)("Pass_1.0_expanded"); + } + else { + return (0, IRule_1.RulePass)("Pass_1.0_collapsed"); + } + } + else { + if (expanded) { + return (0, IRule_1.RulePass)("Pass_1.2_expanded"); + } + else { + return (0, IRule_1.RulePass)("Pass_1.2_collapsed"); + } + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/debug_paths.ts" +/*!*************************************!*\ + !*** ./src/v4/rules/debug_paths.ts ***! + \*************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.debug_paths = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.debug_paths = { + id: "debug_paths", + context: "dom:*", + help: { + "en-US": { + "group": "", + "Pass_0": "" + } + }, + messages: { + "en-US": { + "group": "", + "Pass_0": "" + } + }, + rulesets: [{ + id: ["DEBUG"], + num: "1", + level: IRule_1.eRulePolicy.INFORMATION, + toolkitLevel: IRule_1.eToolkitLevel.LEVEL_FOUR + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + ruleContext.setAttribute("domPath", context["dom"].rolePath); + ruleContext.setAttribute("ariaPath", context["aria"].rolePath); + return null; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/detector_tabbable.ts" +/*!*******************************************!*\ + !*** ./src/v4/rules/detector_tabbable.ts ***! + \*******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.detector_tabbable = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.detector_tabbable = { + id: "detector_tabbable", + context: "dom:*", + help: { + "en-US": { + "group": "", + "Pass_0": "" + } + }, + messages: { + "en-US": { + "group": "", + "Pass_0": "" + } + }, + rulesets: [{ + id: ["EXTENSIONS"], + num: "1", + level: IRule_2.eRulePolicy.INFORMATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_FOUR + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (!CommonUtil_1.CommonUtil.isTabbable(ruleContext)) { + return null; + } + var hierContext = contextHierarchies.aria[contextHierarchies.aria.length - 1]; + return (0, IRule_1.RulePass)("Pass_0", [], [{ + name: hierContext.attributes.name, + role: hierContext.role, + tabindex: parseInt(ruleContext.getAttribute("tabindex") || "0") + }]); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/dir_attribute_valid.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/dir_attribute_valid.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.dir_attribute_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.dir_attribute_valid = { + id: "dir_attribute_valid", + context: "dom:*[dir]", + refactor: { + "Valerie_Elem_DirValid": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "dir_attribute_valid.html", + "Fail_1": "dir_attribute_valid.html", + "group": "dir_attribute_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Invalid value used for the 'dir' attribute", + "group": "'dir' attribute value must be \"ltr\", \"rtl\", or \"auto\"" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var dirStr = ruleContext.getAttribute("dir").toLowerCase(); + var passed = dirStr == "ltr" || dirStr == "rtl" || dirStr == "auto"; + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/download_keyboard_controllable.ts" +/*!********************************************************!*\ + !*** ./src/v4/rules/download_keyboard_controllable.ts ***! + \********************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.download_keyboard_controllable = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.download_keyboard_controllable = { + id: "download_keyboard_controllable", + context: "dom:a[href],dom:area[href]", + refactor: { + "HAAC_Media_DocumentTrigger2": { + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Manual_1": "download_keyboard_controllable.html", + "group": "download_keyboard_controllable.html" + } + }, + messages: { + "en-US": { + "Manual_1": "Verify that the file download mechanism does not cause a keyboard trap", + "group": "File download mechanisms should be keyboard-operable and preserve page focus location" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.2"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var href = ruleContext.getAttribute("href"); + var ext = CommonUtil_1.CommonUtil.getFileExt(href); + var passed = ![".docx", ".doc", ".pdf", ".odt"].includes(ext); + if (passed) + return null; + if (!passed) + return (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/draggable_alternative_exists.ts" +/*!******************************************************!*\ + !*** ./src/v4/rules/draggable_alternative_exists.ts ***! + \******************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.draggable_alternative_exists = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.draggable_alternative_exists = { + id: "draggable_alternative_exists", + context: "dom:*[draggable]", + dependencies: [], + help: { + "en-US": { + "group": "draggable_alternative_exists.html", + // "pass_alternative": "draggable_alternative_exists.html", + "pass_undraggable": "draggable_alternative_exists.html", + "potential_alternative": "draggable_alternative_exists.html" + } + }, + messages: { + "en-US": { + "group": "A draggable element must have a \"single pointer\" alternative", + // "pass_alternative": "The draggable element \"{0}\" has a \"single pointer\" alternative", + "pass_undraggable": "The element \"{0}\" is not draggable", + "potential_alternative": "Ensure the draggable element \"{0}\" has a \"single pointer\" alternative" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_2"], + num: ["2.5.7"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLocaleLowerCase(); + //ignore certain elements + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["pre", "code", "script", "meta"]) !== null + || nodeName === "body" || nodeName === "html") + return null; + if (ruleContext.getAttribute("draggable") === 'true') + return (0, IRule_1.RulePotential)("potential_alternative", [nodeName]); + else if (ruleContext.getAttribute("draggable") === 'false') + return (0, IRule_1.RulePass)("pass_undraggable", [nodeName]); + else + return null; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/element_accesskey_labelled.ts" +/*!****************************************************!*\ + !*** ./src/v4/rules/element_accesskey_labelled.ts ***! + \****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_accesskey_labelled = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +exports.element_accesskey_labelled = { + id: "element_accesskey_labelled", + context: "dom:*[accesskey]", + refactor: { + "HAAC_Accesskey_NeedLabel": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "element_accesskey_labelled.html", + "Potential_1": "element_accesskey_labelled.html", + "group": "element_accesskey_labelled.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "The element with an assigned 'accesskey' attribute does not have an associated label", + "group": "An element with an assigned 'accesskey' attribute must have an associated label" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.3.2"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip if the element is tabbable, it's covered by other rules + if (CommonUtil_1.CommonUtil.isTabbable(ruleContext)) + return; + var roles = AriaUtil_1.AriaUtil.getRoles(ruleContext, true); + //skip the native element, mostly text elements + if (!roles || roles.length === 0) + return; + var patterns = ARIADefinitions_1.ARIADefinitions.designPatterns[roles[0]]; + if (!patterns || !patterns.nameFrom) + return; + // ignore if accessble name is required (checked in other rules) or prohibited (text element) + if (patterns.nameRequired || !patterns.nameFrom || patterns.nameFrom.includes("prohibited")) + return; + //special case: legend, as a child of a fieldset, delegate the accesskey command to the field of the fieldset which is covered by other rules + if (ruleContext.parentElement && ruleContext.parentElement.nodeName.toLowerCase() === 'fieldset') + return; + // check if accessible name exists + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + if (pair && pair.name && pair.name.trim().length > 0) + //if (ARIAMapper.computeName(ruleContext).trim().length > 0) + return (0, IRule_1.RulePass)("Pass_0"); + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/element_accesskey_unique.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/element_accesskey_unique.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_accesskey_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +exports.element_accesskey_unique = { + id: "element_accesskey_unique", + context: "dom:*[accesskey]", + refactor: { + "WCAG20_Elem_UniqueAccessKey": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "element_accesskey_unique.html", + "Fail_1": "element_accesskey_unique.html", + "group": "element_accesskey_unique.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "'accesskey' attribute value on the element is not unique", + "group": "'accesskey' attribute values on each element must be unique for the page" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["HTML"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var map = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "element_accesskey_unique", {}); + var key = ruleContext.getAttribute("accesskey"); + var passed = !(key in map); + map[key] = true; + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/element_attribute_deprecated.ts" +/*!******************************************************!*\ + !*** ./src/v4/rules/element_attribute_deprecated.ts ***! + \******************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_attribute_deprecated = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var DEPRECATED_ELEMENTS = [ + /** original */ + "applet", "basefont", "center", "dir", "font", "isindex", "listing", + "plaintext", "spacer", "s", "strike", "u", "xmp", + /** added from https://dev.w3.org/html5/pf-summary/obsolete.html */ + "acronym", "frame", "frameset", "noframes", "noembed", "big", "blink", "marquee", "tt", +]; +var DEPRECATED_HTML_GLOBAL_ATTRIBUTES = [ + /** original */ + "align", "link", "archive", "background", "bgcolor", "clear", "code", "color", + "compact", "face", "hspace", "language", "link", "noshade", "nowrap", "object", + "prompt", "start", "text", "version", "vlink", "vspace" +]; +var DEPRECATED_ELEMENT_ATTRIBUTES = { + /** original */ + "td": ["height", "width", "abbr", "axis", "char", "charoff", "height", "nowrap", "valign", "width", "align", "bgcolor"], + "th": ["height", "width", "abbr", "axis", "charoff", "height", "bgcolor", "align", "nowrap", "char", "valign", "width"], + "li": ["type", "value", "type"], + "ul": ["type", "compact"], + "pre": ["width"], + /** added from https://dev.w3.org/html5/pf-summary/obsolete.html */ + "meta": ["http-equiv"], + "a": ["charset", "coords", "shape", "rev", "scheme"], + "link": ["rev", "charset", "target"], + "img": ["name", "longdesc", "align", "hspace", "vspace", "border"], + "area": ["nohref"], + "head": ["profile"], + "html": ["version"], + "iframe": ["longdesc", "align", "frameborder", "marginheight", "marginwidth", "scrolling"], + "object": ["archive", "code", "codebase", "codetype", "declare", "standby", "align", "hspace", "vspace", "border"], + "param": ["type", "valuetype"], + "script": ["language"], + "body": ["alink", "background", "bgcolor", "link", "text", "vlink"], + "br": ["clear"], + "caption": ["align"], + "col": ["align", "char", "charoff", "valign", "width"], + "div": ["align"], + "dl": ["compact"], + "hr": ["align", "noshade", "size", "width", "align"], + "h2": ["align"], + "h3": ["align"], + "h4": ["align"], + "h5": ["align"], + "h6": ["align"], + "input": ["align", "usemap"], + "legend": ["align"], + "menu": ["compact"], + "ol": ["compact", "type", "type"], + "p": ["align"], + "table": ["bgcolor", "cellpadding", "cellspacing", "frame", "rules", "width", "align"], + "tbody": ["align", "char", "valign", "charoff"], + "tfoot": ["align", "charoff", "char", "valign"], + "thead": ["char", "charoff", "valign", "align"], + "tr": ["align", "bgcolor", "char", "charoff", "valign"] +}; +function arrayToContextStr(obj, type) { + var str = ""; + for (var _i = 0, obj_1 = obj; _i < obj_1.length; _i++) { + var prop = obj_1[_i]; + if (str !== '' && !str.endsWith(', ')) + str += ", "; + if (type === 'HTML_ELEMENTS') + str += 'dom:' + prop; + else if (type === 'HTML_ATTRIBUTES') + str += 'dom:*[' + prop + "]"; + } + return str; +} +function objToContextStr(obj, type) { + var str = ""; + for (var prop in obj) { + if (str !== '' && !str.endsWith(', ')) + str += ", "; + if (type === 'HTML_ELEMENT_ATTRIBUTES') { + for (var _i = 0, _a = obj[prop]; _i < _a.length; _i++) { + var item = _a[_i]; + if (str !== '' && !str.endsWith(", ")) + str += ", "; + str += 'dom:' + prop + '[' + item + ']'; + } + } + } + return str; +} +exports.element_attribute_deprecated = { + id: "element_attribute_deprecated", + context: "dom:applet, dom:basefont, dom:center, dom:dir, dom:font, dom:isindex, dom:listing, dom:menu, dom:plaintext, dom:spacer, dom:s, dom:strike, dom:u, dom:xmp, dom:acronym, dom:frame, dom:frameset, dom:noframes, dom:noembed, dom:big, dom:blink, dom:marquee, dom:ttNaNdom:*[align], dom:*[link], dom:*[archive], dom:*[background], dom:*[bgcolor], dom:*[clear], dom:*[code], dom:*[color], dom:*[compact], dom:*[face], dom:*[hspace], dom:*[language], dom:*[link], dom:*[noshade], dom:*[nowrap], dom:*[object], dom:*[prompt], dom:*[start], dom:*[text], dom:*[version], dom:*[vlink], dom:*[vspace]NaNdom:td[height], dom:td[width], dom:td[abbr], dom:td[axis], dom:td[char], dom:td[charoff], dom:td[height], dom:td[nowrap], dom:td[valign], dom:td[width], dom:td[align], dom:td[bgcolor], dom:th[height], dom:th[width], dom:th[abbr], dom:th[axis], dom:th[charoff], dom:th[height], dom:th[bgcolor], dom:th[align], dom:th[nowrap], dom:th[char], dom:th[valign], dom:th[width], dom:li[type], dom:li[value], dom:li[type], dom:ul[type], dom:ul[compact], dom:pre[width], dom:meta[http-equiv], dom:a[charset], dom:a[coords], dom:a[shape], dom:a[rev], dom:a[scheme], dom:link[rev], dom:link[charset], dom:link[target], dom:img[name], dom:img[longdesc], dom:img[align], dom:img[hspace], dom:img[vspace], dom:img[border], dom:area[nohref], dom:head[profile], dom:html[version], dom:iframe[longdesc], dom:iframe[align], dom:iframe[frameborder], dom:iframe[marginheight], dom:iframe[marginwidth], dom:iframe[scrolling], dom:object[archive], dom:object[code], dom:object[codebase], dom:object[codetype], dom:object[declare], dom:object[standby], dom:object[align], dom:object[hspace], dom:object[vspace], dom:object[border], dom:param[type], dom:param[valuetype], dom:script[language], dom:body[alink], dom:body[background], dom:body[bgcolor], dom:body[link], dom:body[text], dom:body[vlink], dom:br[clear], dom:caption[align], dom:col[align], dom:col[char], dom:col[charoff], dom:col[valign], dom:col[width], dom:div[align], dom:dl[compact], dom:hr[align], dom:hr[noshade], dom:hr[size], dom:hr[width], dom:hr[align], dom:h2[align], dom:h3[align], dom:h4[align], dom:h5[align], dom:h6[align], dom:input[align], dom:input[usemap], dom:legend[align], dom:menu[compact], dom:ol[compact], dom:ol[type], dom:ol[type], dom:p[align], dom:table[bgcolor], dom:table[cellpadding], dom:table[cellspacing], dom:table[frame], dom:table[rules], dom:table[width], dom:table[align], dom:tbody[align], dom:tbody[char], dom:tbody[valign], dom:tbody[charoff], dom:tfoot[align], dom:tfoot[charoff], dom:tfoot[char], dom:tfoot[valign], dom:thead[char], dom:thead[charoff], dom:thead[valign], dom:thead[align], dom:tr[align], dom:tr[bgcolor], dom:tr[char], dom:tr[charoff], dom:tr[valign]", + help: { + "en-US": { + "pass": "element_attribute_deprecated.html", + "fail_elem": "element_attribute_deprecated.html", + "fail_attr": "element_attribute_deprecated.html", + "fail_elem_attr": "element_attribute_deprecated.html", + "group": "element_attribute_deprecated.html" + } + }, + messages: { + "en-US": { + "pass": "Rule Passed", + "fail_elem": "The <{0}> element is deprecated in HTML 5", + "fail_attr": "The HTML attribute(s) \"{0}\" is deprecated in HTML 5", + "fail_elem_attr": "The HTML attribute(s) \"{0}\" is deprecated for the <{1}> element in HTML 5", + "group": "Avoid use of obsolete features if possible" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["HTML"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // HTMLUnit auto adds a tbody[align=left] to tables if tbody is missing! + if (ruleContext.nodeName.toLowerCase() === "tbody" && ruleContext.hasAttribute("align")) { + return (0, IRule_1.RulePass)("pass"); + } + if (ruleContext.nodeName.includes("-")) { + // This is a webcomponent element, HTML doesn't define what's deprecated + return null; + } + var nodeName = ruleContext.nodeName.toLowerCase(); + var ret = []; + // check if it's a deprecated element + if (DEPRECATED_ELEMENTS.includes(nodeName)) { + return (0, IRule_1.RuleFail)("fail_elem", [nodeName]); + } + // check if it's a deprecated HTML global attribute + var attrs = ruleContext.getAttributeNames(); + var violations = ''; + for (var _i = 0, attrs_1 = attrs; _i < attrs_1.length; _i++) { + var attr = attrs_1[_i]; + if (DEPRECATED_HTML_GLOBAL_ATTRIBUTES.includes(attr)) { + if (violations !== '') + violations += ', '; + violations += attr; + } + } + if (violations !== '') { + return (0, IRule_1.RuleFail)("fail_attr", [violations]); + } + // check if it's a deprecated HTML element & attribute + violations = ''; + if (nodeName in DEPRECATED_ELEMENT_ATTRIBUTES) { + for (var _a = 0, attrs_2 = attrs; _a < attrs_2.length; _a++) { + var attr = attrs_2[_a]; + if (DEPRECATED_ELEMENT_ATTRIBUTES[nodeName] && DEPRECATED_ELEMENT_ATTRIBUTES[nodeName].includes(attr)) { + if (violations !== '') + violations += ', '; + violations += attr; + } + } + if (violations !== '') { + return (0, IRule_1.RuleFail)("fail_elem_attr", [violations, nodeName]); + } + } + return (0, IRule_1.RulePass)("pass"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/element_id_unique.ts" +/*!*******************************************!*\ + !*** ./src/v4/rules/element_id_unique.ts ***! + \*******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_id_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +exports.element_id_unique = { + id: "element_id_unique", + context: "dom:*[id]", + refactor: { + "RPT_Elem_UniqueId": { + "Pass_0": "pass", + "Fail_1": "potential_empty", + "Fail_2": "potential_in_use" + } + }, + help: { + "en-US": { + "group": "element_id_unique.html", + "pass": "element_id_unique.html", + "potential_empty": "element_id_unique.html", + "potential_in_use": "element_id_unique.html" + } + }, + messages: { + "en-US": { + "group": "Element 'id' attribute values must be unique within a document", + "pass": "Rule Passed", + "potential_empty": "The <{0}> element has the id \"{1}\" that is empty", + "potential_in_use": "The <{0}> element has the id \"{1}\" that is already in use" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["HTML"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [{ + "3ea0c8": { + "pass": "pass", + "potential_empty": "pass", + "potential_in_use": "fail" + } + }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var id = ruleContext.getAttribute("id"); + // In the case that id is empty we should trigger a violation right away with out checking + // for uniqueness. + if (id === "") { + //return new ValidationResult(false, [ruleContext], '', '', [ruleContext.nodeName.toLowerCase(), id]); + return (0, IRule_1.RulePotential)("potential_empty", [ruleContext.nodeName.toLowerCase(), id]); + } + var element = fragment_1.FragmentUtil.getById(ruleContext, id); + var passed = element === ruleContext; + //return new ValidationResult(passed, [ruleContext], '', '', passed == true ? [] : [ruleContext.nodeName.toLowerCase(), id]); + if (!passed) { + return (0, IRule_1.RulePotential)("potential_in_use", [ruleContext.nodeName.toLowerCase(), id]); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/element_lang_valid.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/element_lang_valid.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_lang_valid = exports.html_lang_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var lang_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/lang */ "./src/v2/checker/accessibility/util/lang.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var validateLang = function (context) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (ruleContext.hasAttribute("lang")) { + if (nodeName !== "html" && ruleContext.getAttribute("lang") === "") { + // It's okay to have a lang="" if not on html + } + else { + var langStr = ruleContext.getAttribute("lang"); + if (!lang_1.LangUtil.validPrimaryLang(langStr)) { + return 1; + } + if (!lang_1.LangUtil.isBcp47(langStr)) { + return 2; + } + } + } + if (ruleContext.hasAttribute("xml:lang")) { + if (nodeName !== "html" && ruleContext.getAttribute("xml:lang") === "") { + // It's okay to have a lang="" if not on html + } + else { + var langStr = ruleContext.getAttribute("xml:lang"); + if (!lang_1.LangUtil.validPrimaryLang(langStr)) { + return 3; + } + if (!lang_1.LangUtil.isBcp47(langStr)) { + return 4; + } + } + } + return 0; +}; +exports.html_lang_valid = { + id: "html_lang_valid", + context: "dom:html[lang], dom:html[xml:lang]", + help: { + "en-US": { + "Pass_0": "html_lang_valid.html", + "Fail_1": "html_lang_valid.html", + "Fail_2": "html_lang_valid.html", + "Fail_3": "html_lang_valid.html", + "Fail_4": "html_lang_valid.html", + "group": "html_lang_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Lang has a valid primary lang and conforms to BCP 47", + "Fail_1": "Specified 'lang' attribute does not include a valid primary language", + "Fail_2": "Specified 'lang' attribute does not conform to BCP 47", + "Fail_3": "Specified 'xml:lang' attribute does not include a valid primary language", + "Fail_4": "Specified 'xml:lang' attribute does not conform to BCP 47", + "group": "The default human language of the page must be valid and specified in accordance with BCP 47" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [{ + "b5c3f8": { + "Pass_0": "pass", + "Fail_1": "fail", + "Fail_2": "inapplicable", + "Fail_3": "inapplicable", + "Fail_4": "inapplicable" + }, + "bf051a": { + "Pass_0": "pass", + "Fail_1": "fail", + "Fail_2": "pass", + "Fail_3": "fail", + "Fail_4": "inapplicable" + }, + // TODO: ACT: Mismatch because they don't check the html element in the same rule + // "de46e4": { + // "Pass_0": "pass", + // "Fail_1": "fail", + // "Fail_2": "pass", + // "Fail_3": "inapplicable", + // "Fail_4": "inapplicable" + // } + }], + run: function (context, options, contextHierarchies) { + var reasonCode = validateLang(context); + // This is done here instead of in validateLang so that the genHelp code will pick it up + var retArr = [ + (0, IRule_1.RulePass)("Pass_0"), + (0, IRule_1.RuleFail)("Fail_1"), + (0, IRule_1.RuleFail)("Fail_2"), + (0, IRule_1.RuleFail)("Fail_3"), + (0, IRule_1.RuleFail)("Fail_4") + ]; + return retArr[reasonCode]; + } +}; +exports.element_lang_valid = { + id: "element_lang_valid", + context: "dom:*[lang], dom:*[xml:lang]", + help: { + "en-US": { + "Pass_0": "element_lang_valid.html", + "Fail_1": "element_lang_valid.html", + "Fail_2": "element_lang_valid.html", + "Fail_3": "element_lang_valid.html", + "Fail_4": "element_lang_valid.html", + "group": "element_lang_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Lang has a valid primary lang and conforms to BCP 47", + "Fail_1": "Specified 'lang' attribute does not include a valid primary language", + "Fail_2": "Specified 'lang' attribute does not conform to BCP 47", + "Fail_3": "Specified 'xml:lang' attribute does not include a valid primary language", + "Fail_4": "Specified 'xml:lang' attribute does not conform to BCP 47", + "group": "The change in language of specific content must be valid and specified in accordance with BCP 47" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [{ + // "b5c3f8": { + // "Pass_0": "pass", + // "Fail_1": "fail", + // "Fail_2": "inapplicable", + // "Fail_3": "inapplicable", + // "Fail_4": "inapplicable" + // }, + // "bf051a": { + // "Pass_0": "pass", + // "Fail_1": "fail", + // "Fail_2": "pass", + // "Fail_3": "fail", + // "Fail_4": "inapplicable" + // }, + // TODO: ACT: Mismatch because they don't check the html element in the same rule + "de46e4": { + "Pass_0": "pass", + "Fail_1": "fail", + "Fail_2": "pass", + "Fail_3": "inapplicable", + "Fail_4": "inapplicable" + } + }], + run: function (context, options, contextHierarchies) { + // If it's the HTML node, that's handled by html_lang_valid + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (nodeName === "html") + return null; + var reasonCode = validateLang(context); + // This is done here instead of in validateLang so that the genHelp code will pick it up + var retArr = [ + (0, IRule_1.RulePass)("Pass_0"), + (0, IRule_1.RuleFail)("Fail_1"), + (0, IRule_1.RuleFail)("Fail_2"), + (0, IRule_1.RuleFail)("Fail_3"), + (0, IRule_1.RuleFail)("Fail_4") + ]; + var retVal = retArr[reasonCode]; + if (retVal.value[1] !== IRule_1.eRuleConfidence.PASS) { + // Ensure that there's actually content of this element - skip subtrees that have other lang attributes + var hasContent = false; + if (ruleContext.firstChild !== null) { + var nw = new DOMWalker_1.DOMWalker(ruleContext, false, ruleContext, true); + while (!hasContent && nw.nextNode()) { + // Skip hidden + if (nw.node.nodeType === 1) { + var element = nw.node; + if (!VisUtil_1.VisUtil.isNodeVisible(element) || element.hasAttribute("lang")) { + nw.bEndTag = true; + } + else { + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(element); + hasContent = hasContent + || element.nodeName.toLowerCase() === "img" && (pair && pair.name && pair.name.trim().length > 0) /**ARIAMapper.computeName(element).trim().length > 0*/; + } + } + else { + hasContent = hasContent + || nw.node.nodeType === 3 && nw.node.nodeValue.trim().length > 0; + } + } + } + if (!hasContent) + return null; + } + return retVal; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/element_mouseevent_keyboard.ts" +/*!*****************************************************!*\ + !*** ./src/v4/rules/element_mouseevent_keyboard.ts ***! + \*****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_mouseevent_keyboard = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.element_mouseevent_keyboard = { + id: "element_mouseevent_keyboard", + context: "dom:*[ondblclick], dom:*[onmousemove], dom:*[onmousedown], dom:*[onmouseup], dom:*[onmouseover], dom:*[onmouseout], dom:*[onclick]", + refactor: { + "RPT_Elem_EventMouseAndKey": { + "Pass_0": "Pass_0", + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Pass_0": "element_mouseevent_keyboard.html", + "Manual_1": "element_mouseevent_keyboard.html", + "group": "element_mouseevent_keyboard.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Manual_1": "Confirm the <{0}> element with mouse event handler(s) '{1}' has a corresponding keyboard handler(s)", + "group": "All interactive content with mouse event handlers must have equivalent keyboard access" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + var passed = ruleContext.hasAttribute("href") || + (!ruleContext.hasAttribute("ondblclick") && + !ruleContext.hasAttribute("onmousemove") && + (!ruleContext.hasAttribute("onmousedown") || ruleContext.hasAttribute("onkeydown")) && + (!ruleContext.hasAttribute("onmouseup") || ruleContext.hasAttribute("onkeyup")) && + (!ruleContext.hasAttribute("onmouseover") || ruleContext.hasAttribute("onfocus")) && + (!ruleContext.hasAttribute("onmouseout") || ruleContext.hasAttribute("onblur")) && + (!ruleContext.hasAttribute("onclick") || ruleContext.hasAttribute("onkeypress") || + nodeName == "a" || nodeName == "button")); + var failedMouseEvents = new Array(); + if (!passed) { + //store and display event name and node name in the tokens + if (ruleContext.hasAttribute("ondblclick")) { + failedMouseEvents.push("ondblclick"); + } + if (ruleContext.hasAttribute("onmousemove")) { + failedMouseEvents.push("onmousemove"); + } + if (ruleContext.hasAttribute("onmousedown") && !ruleContext.hasAttribute("onkeydown")) { + failedMouseEvents.push("onmousedown"); + } + if (ruleContext.hasAttribute("onmouseup") && !ruleContext.hasAttribute("onkeyup")) { + failedMouseEvents.push("onmouseup"); + } + if (ruleContext.hasAttribute("onmouseover") && !ruleContext.hasAttribute("onfocus")) { + failedMouseEvents.push("onmouseover"); + } + if (ruleContext.hasAttribute("onmouseout") && !ruleContext.hasAttribute("onblur")) { + failedMouseEvents.push("onmouseout"); + } + if (ruleContext.hasAttribute("onclick") && !ruleContext.hasAttribute("onkeypress")) { + if (!(nodeName == "a" || nodeName == "button")) + failedMouseEvents.push("onclick"); + } + } + return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RuleManual)("Manual_1", [nodeName, failedMouseEvents.join(", ")]); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/element_orientation_unlocked.ts" +/*!******************************************************!*\ + !*** ./src/v4/rules/element_orientation_unlocked.ts ***! + \******************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_orientation_unlocked = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CSSUtil_1 = __webpack_require__(/*! ../util/CSSUtil */ "./src/v4/util/CSSUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.element_orientation_unlocked = { + id: "element_orientation_unlocked", + context: "dom:*", + help: { + "en-US": { + "pass": "element_orientation_unlocked.html", + "fail_locked": "element_orientation_unlocked.html", + "group": "element_orientation_unlocked.html" + } + }, + messages: { + "en-US": { + "pass": "The element is not restricted to either landscape or portrait orientation using CSS transform property", + "fail_locked": "The element <{0}> is restricted to either landscape or portrait orientation using CSS transform property", + "group": "Elements should not be restricted to either landscape or portrait orientation using CSS transform property" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.4"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: ['b33eff'], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip invisible element + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext)) + return null; + //skip elements + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["script", "meta", "title"])) + return null; + var nodeName = ruleContext.nodeName.toLowerCase(); + // cache the orientation result for all the elements in the page + var doc = fragment_1.FragmentUtil.getOwnerFragment(ruleContext); + var orientationTransforms = CacheUtil_1.CacheUtil.getCache(doc, "RPTUtil_MEDIA_ORIENTATION_TRANSFROM", null); + if (!orientationTransforms) { + orientationTransforms = CSSUtil_1.CSSUtil.getMediaOrientationTransform(doc); + CacheUtil_1.CacheUtil.setCache(doc, "RPTUtil_MEDIA_ORIENTATION_TRANSFROM", orientationTransforms); + } + // find if the element matches orientation selector(s) + var media_transforms = []; + Object.keys(orientationTransforms).forEach(function (key) { + Object.keys(orientationTransforms[key]).forEach(function (tag) { + if (Object.keys(orientationTransforms[key][tag]).length > 0 && CSSUtil_1.CSSUtil.selectorMatchesElem(ruleContext, tag)) { + if (orientationTransforms[key][tag].transform) + media_transforms.push(orientationTransforms[key][tag].transform); + else + media_transforms.push(orientationTransforms[key][tag]); + } + }); + }); + // no match, the element is not in media orientation transform + if (media_transforms.length === 0) + return null; + var ret = []; + var _loop_1 = function (i) { + var media_transform = media_transforms[i]; + if (typeof media_transform === 'object') + for (var key in media_transform) + media_transform = key + "(" + media_transform[key] + ")"; + var containsRotation = false; + ['rotate', 'rotate3d', 'rotateZ', 'matrix', 'matrix3d'].forEach(function (rotation) { + if (media_transform.includes(rotation)) + containsRotation = true; + }); + // no rotation transform, skip + if (!containsRotation) + return "continue"; + var degree = CSSUtil_1.CSSUtil.getRotationDegree(media_transform); + // no or 360n degree rotation + if (degree === 0) { + ret.push((0, IRule_1.RulePass)("pass")); + return "continue"; + } + /** + * calculate the original page rotation transformation, example + * html { transform: rotate(2.5deg); } + */ + var definedStyle = CSSUtil_1.CSSUtil.getDefinedStyles(ruleContext, ["transform"]); + /** + * compensate the media orientation with the page orientation + */ + if (definedStyle['transform']) { + var page_degree = CSSUtil_1.CSSUtil.getRotationDegree(definedStyle['transform']); + // rotate is additive + degree += page_degree; + } + // When degree is 1 turn (360 degree), it is not considered an orientation lock + // allow 1 degree floating range for the right angle + if (Math.abs(degree - 360) % 360 > 1) + ret.push((0, IRule_1.RuleFail)("fail_locked", [nodeName])); + else + ret.push((0, IRule_1.RulePass)("pass")); + }; + for (var i = 0; i < media_transforms.length; i++) { + _loop_1(i); + } + if (ret.length > 0) + return ret; + return null; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/element_scrollable_tabbable.ts" +/*!*****************************************************!*\ + !*** ./src/v4/rules/element_scrollable_tabbable.ts ***! + \*****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_scrollable_tabbable = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +exports.element_scrollable_tabbable = { + id: "element_scrollable_tabbable", + context: "dom:*", + dependencies: [], + help: { + "en-US": { + "group": "element_scrollable_tabbable.html", + "pass_tabbable": "element_scrollable_tabbable.html", + "pass_interactive": "element_scrollable_tabbable.html", + "fail_scrollable": "element_scrollable_tabbable.html" + } + }, + messages: { + "en-US": { + "group": "Scrollable elements should be tabbable or contain tabbable content", + "pass_tabbable": "The scrollable element is tabbable", + "pass_interactive": "The scrollable element has tabbable content", + "fail_scrollable": "The scrollable element <{0}> with non-interactive content is not tabbable" + } + }, + /** + * deprecated on 6/10/2025 due to Browser support for auto-focus of a scrollable element + * rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + num: ["2.1.1"], + level: eRulePolicy.VIOLATION, + toolkitLevel: eToolkitLevel.LEVEL_ONE + }],*/ + rulesets: [], + act: ["0ssw9k"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip elements + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["iframe", "svg", "script", "meta", "style"])) + return null; + //skip if no visible content + if (!CommonUtil_1.CommonUtil.hasInnerContent(ruleContext)) + return null; + // ignore if the element's navigation is controlled or owned by another element + if (AriaUtil_1.AriaUtil.isNavigationOwnedOrControlled(ruleContext)) + return null; + // ignore if the element is not scrollable or content withouting needing a scroll + if (!VisUtil_1.VisUtil.isElementScrollable(ruleContext)) + return null; + // pass if element is tabbable + if (CommonUtil_1.CommonUtil.isTabbable(ruleContext)) + return (0, IRule_1.RulePass)("pass_tabbable"); + // check if element content is tabbable + var count = CommonUtil_1.CommonUtil.getTabbableChildren(ruleContext); + if (count > 0) + return (0, IRule_1.RulePass)("pass_interactive"); + // ignore in Firefox if no tabindex at all (not tested in embedded or any simulator) + if (!ruleContext.hasAttribute("tabindex") && navigator.userAgent.indexOf("Firefox") > -1) + return null; + return (0, IRule_1.RuleFail)("fail_scrollable", [ruleContext.nodeName.toLowerCase()]); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/element_tabbable_role_valid.ts" +/*!*****************************************************!*\ + !*** ./src/v4/rules/element_tabbable_role_valid.ts ***! + \*****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_tabbable_role_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.element_tabbable_role_valid = { + id: "element_tabbable_role_valid", + context: "dom:*", + help: { + "en-US": { + "pass": "element_tabbable_role_valid.html", + "fail_invalid_role": "element_tabbable_role_valid.html", + "fail_no_valid_role": "element_tabbable_role_valid.html", + "group": "element_tabbable_role_valid.html" + } + }, + messages: { + "en-US": { + "pass": "The tabbable element has a widget role", + "fail_invalid_role": "The tabbable element's role '{0}' is not a widget role", + "fail_no_valid_role": "The tabbable element does not have a valid widget role", + "group": "A tabbable element must have a valid widget role" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }, + { + "id": ["WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext) || VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLowerCase(); + // if the element is tabbable by default with or without tabindex, let the other rules (such as widget_tabbable_single) to handle it + if (nodeName in CommonUtil_1.CommonUtil.tabTagMap) { + var value = CommonUtil_1.CommonUtil.tabTagMap[nodeName]; + if (typeof (value) === "function") { + value = value(ruleContext); + } + if (value) + return null; + } + // handle the case: no tabindex or tabindex < 0 + if (!ruleContext.hasAttribute("tabindex") || parseInt(ruleContext.getAttribute("tabindex")) < 0) + return null; + // ignore if the element's navigation is controlled by another element, such as combobox + if (AriaUtil_1.AriaUtil.isNavigationOwnedOrControlled(ruleContext)) + return null; + // ignore if the element is scrollable + if (VisUtil_1.VisUtil.isElementScrollable(ruleContext)) + return null; + // elements whose roles allow no descendants that are interactive or with a tabindex >= 0 + // this case should be handled in widget_tabbable_single and aria_child_tabbable + var roles_no_interactive_child = ["button", "checkbox", "img", "link", "menuitem", "menuitemcheckbox", "menuitemradio", + "option", "radio", "switch", "tab"]; + var parent = DOMWalker_1.DOMWalker.parentNode(ruleContext); + var parent_role = AriaUtil_1.AriaUtil.getResolvedRole(parent); + // ignore if the parent role is in roles_no_interactive_child + if (roles_no_interactive_child.includes(parent_role)) + return null; + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + if (!role) + return (0, IRule_1.RuleFail)("fail_no_valid_role"); + // ignore 'application' role that contains one or more focusable elements that do not follow a standard interaction pattern supported by a widget role:https://www.w3.org/TR/2023/PR-WAI-ARIA-1.2-20230328/#application + if (role === "application") + return null; + // handle the case: tabindex >= 0 to examine whether a widget role is setup or not + // pass if one of the roles is a widget type + // Row is weird. It's structure, but can also be widget + // Focusable separators are widgets + if (role === "row" || role === "separator" || ARIADefinitions_1.ARIADefinitions.designPatterns[role].roleType === 'widget') { + return (0, IRule_1.RulePass)("pass"); + } + return (0, IRule_1.RuleFail)("fail_invalid_role", [role]); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/element_tabbable_unobscured.ts" +/*!*****************************************************!*\ + !*** ./src/v4/rules/element_tabbable_unobscured.ts ***! + \*****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_tabbable_unobscured = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var DOMMapper_1 = __webpack_require__(/*! ../../v2/dom/DOMMapper */ "./src/v2/dom/DOMMapper.ts"); +var ColorUtil_1 = __webpack_require__(/*! ../util/ColorUtil */ "./src/v4/util/ColorUtil.ts"); +exports.element_tabbable_unobscured = { + id: "element_tabbable_unobscured", + context: "dom:*", + dependencies: [], + help: { + "en-US": { + "group": "element_tabbable_unobscured.html", + "pass": "element_tabbable_unobscured.html", + "potential_obscured": "element_tabbable_unobscured.html" + } + }, + messages: { + "en-US": { + "group": "When an element receives focus, it is not entirely covered by other content", + "pass": "The element is not entirely covered by other content", + "potential_obscured": "Confirm that when the element receives focus, it is not covered or, if covered by user action, can be uncovered without moving focus" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_2"], + num: ["2.4.11"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Early exit: check visibility and tabbability first + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || !CommonUtil_1.CommonUtil.isTabbable(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLocaleLowerCase(); + // Early exit: ignore certain elements + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["pre", "code", "script", "meta"]) !== null + || nodeName === "body" || nodeName === "html") + return null; + var doc = ruleContext.ownerDocument; + if (!doc) + return null; + var win = doc.defaultView; + if (!win) + return null; + // Reuse single DOMMapper instance + var mapper = new DOMMapper_1.DOMMapper(); + var bounds = mapper.getUnadjustedBounds(ruleContext); + // Early exit: bounds not available or element has no dimensions + if (!bounds || bounds.height === 0 || bounds.width === 0) + return null; + var cStyle = win.getComputedStyle(ruleContext); + if (!cStyle) + return null; + // Parse z-index once and cache + var zindex = parseInt(cStyle.zIndex === 'auto' || !cStyle.zIndex ? '0' : cStyle.zIndex); + // More specific selector to reduce iteration + var elems = doc.querySelectorAll('body *:not(script):not(style):not(meta):not(link)'); + if (!elems || elems.length === 0) + return null; + var before = true; + var boundsRight = bounds.left + bounds.width; + var boundsBottom = bounds.top + bounds.height; + // Check for obscuring elements + for (var i = 0; i < elems.length; i++) { + var elem = elems[i]; + /** + * The nodes returned from querySelectorAll are in document order. + * If two elements overlap and z-index are not defined, then the node + * rendered earlier will be overlaid by the node rendered later. + */ + // Use compareDocumentPosition to check containment relationships + // Note: compareDocumentPosition returns 0 when comparing a node to itself + var position = ruleContext.compareDocumentPosition(elem); + // DOCUMENT_POSITION_CONTAINED_BY (16): elem is contained by ruleContext + // Also handle self-comparison (position === 0) + if (position === 0 || (position & Node.DOCUMENT_POSITION_CONTAINED_BY)) { + // The next node in elems will be after the target node (ruleContext) + before = false; + continue; + } + // DOCUMENT_POSITION_CONTAINS (8): elem contains ruleContext + // Skip if element contains ruleContext or is not visible + if ((position & Node.DOCUMENT_POSITION_CONTAINS) || !VisUtil_1.VisUtil.isNodeVisible(elem)) + continue; + var bnds = mapper.getUnadjustedBounds(elem); + // Skip if no bounds or zero dimensions + if (!bnds || bnds.height === 0 || bnds.width === 0) + continue; + // Quick bounds check: does elem completely cover ruleContext? + if (bnds.top > bounds.top || bnds.left > bounds.left) + continue; + var bndsRight = bnds.left + bnds.width; + var bndsBottom = bnds.top + bnds.height; + if (bndsRight < boundsRight || bndsBottom < boundsBottom) + continue; + // Check z-index to determine if elem obscures ruleContext + var zStyle = win.getComputedStyle(elem); + if (!zStyle) + continue; + var elemZindex = parseInt(zStyle.zIndex === 'auto' || !zStyle.zIndex || isNaN(Number(zStyle.zIndex)) ? '0' : zStyle.zIndex); + // If before ruleContext in DOM order, elem must have higher z-index to obscure + // If after ruleContext in DOM order, elem can obscure with equal or higher z-index + if ((before && elemZindex > zindex) || (!before && elemZindex >= zindex)) { + // Check if element has opaque background + var hasOpaqueBackground = false; + if (zStyle.background && zStyle.background !== 'none') { + var bgColor = ColorUtil_1.ColorUtil.Color(zStyle.background); + hasOpaqueBackground = bgColor && (bgColor.alpha === undefined || bgColor.alpha > 0); + } + if (!hasOpaqueBackground && zStyle.backgroundColor) { + var bgColor = ColorUtil_1.ColorUtil.Color(zStyle.backgroundColor); + hasOpaqueBackground = bgColor && (bgColor.alpha === undefined || bgColor.alpha > 0); + } + // If element has no content and no opaque background, skip it + if (!CommonUtil_1.CommonUtil.hasInnerContentHidden(elem) && !hasOpaqueBackground) { + continue; + } + return (0, IRule_1.RulePotential)("potential_obscured", []); + } + } + return (0, IRule_1.RulePass)("pass"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/element_tabbable_visible.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/element_tabbable_visible.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_tabbable_visible = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var CSSUtil_1 = __webpack_require__(/*! ../util/CSSUtil */ "./src/v4/util/CSSUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var DOMMapper_1 = __webpack_require__(/*! ../../v2/dom/DOMMapper */ "./src/v2/dom/DOMMapper.ts"); +exports.element_tabbable_visible = { + id: "element_tabbable_visible", + context: "dom:*", + dependencies: [], + help: { + "en-US": { + "group": "element_tabbable_visible.html", + "pass": "element_tabbable_visible.html", + "potential_visible": "element_tabbable_visible.html" + } + }, + messages: { + "en-US": { + "group": "A tabbable element should be visible on the screen when it has keyboard focus", + "pass": "The tabbable element is visible on the screen", + "potential_visible": "Confirm the element should be tabbable and if so, it becomes visible when it has keyboard focus" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + num: ["2.4.7"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (!CommonUtil_1.CommonUtil.isTabbable(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLocaleLowerCase(); + var mapper = new DOMMapper_1.DOMMapper(); + var bounds = mapper.getUnadjustedBounds(ruleContext); + //in case the bounds not available + if (!bounds) + return null; + // Get all needed styles in a single pass through stylesheets + var allStyles = CSSUtil_1.CSSUtil.getDefinedStylesMultiple(ruleContext, ["position", "clip"], ["", ":focus"]); + var defined_styles = allStyles[""]; + var onfocus_styles = allStyles[":focus"]; + if (bounds['height'] === 0 || bounds['width'] === 0) + return (0, IRule_1.RulePotential)("potential_visible", []); + if (defined_styles['position'] === 'absolute' && defined_styles['clip'] && defined_styles['clip'].replaceAll(' ', '') === 'rect(0px,0px,0px,0px)' + && !onfocus_styles['clip']) { + /** + * note that A user can select a checkbox and radio button by selecting the button or the label text. + * When a checkbox or radio button is clipped to 0 size, it is still available to a keyboard or a screen reader. + * The rule should be passed if the label text exists and the button on-focus style is defined by the user, + * which likely incurs the changes of the label style. + */ + if (nodeName === 'input' && (ruleContext.getAttribute('type') === 'checkbox' || ruleContext.getAttribute('type') === 'radio')) { + var label = CommonUtil_1.CommonUtil.getLabelForElement(ruleContext); + if (label && !CommonUtil_1.CommonUtil.isInnerTextEmpty(label)) { + // Get additional pseudo-class styles (reuse onfocus_styles from line 60) + var pseudoStyles = CSSUtil_1.CSSUtil.getDefinedStylesMultiple(ruleContext, null, [":focus-visible", ":focus-within", ":checked", ":focus"]); + var focus_visible_styles = pseudoStyles[":focus-visible"]; + var focus_within_styles = pseudoStyles[":focus-within"]; + var checked_styles = pseudoStyles[":checked"]; + var onfocus_styles_1 = pseudoStyles[":focus"]; + if (onfocus_styles_1 || focus_visible_styles || focus_within_styles || checked_styles) + return (0, IRule_1.RulePass)("pass"); + } + } + return (0, IRule_1.RulePotential)("potential_visible", []); + } + if (bounds['top'] >= 0 && bounds['left'] >= 0) + return (0, IRule_1.RulePass)("pass"); + var default_styles = getComputedStyle(ruleContext); + var top = bounds['top']; + var left = bounds['left']; + if (Object.keys(onfocus_styles).length === 0) { + // no onfocus position change, but could be changed from js + return (0, IRule_1.RulePotential)("potential_visible", []); + } + else { + // with onfocus position change + var positions = ['absolute', 'fixed']; + if (typeof onfocus_styles['top'] !== 'undefined') { + if (positions.includes(onfocus_styles['position']) || (typeof onfocus_styles['position'] === 'undefined' && positions.includes(default_styles['position']))) { + top = onfocus_styles['top'].replace(/\D/g, ''); + } + else { + // the position is undefined and the parent's position is 'relative' + top = Number.MIN_VALUE; + } + } + if (typeof onfocus_styles['left'] !== 'undefined') { + if (positions.includes(onfocus_styles['position']) || (typeof onfocus_styles['position'] === 'undefined' && positions.includes(default_styles['position']))) { + left = onfocus_styles['left'].replace(/\D/g, ''); + } + else { + // the position is undefined and the parent's position is 'relative' + left = Number.MIN_VALUE; + } + } + } + if (top >= 0 && left >= 0) + return (0, IRule_1.RulePass)("pass"); + else + return (0, IRule_1.RulePotential)("potential_visible", []); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/embed_alt_exists.ts" +/*!******************************************!*\ + !*** ./src/v4/rules/embed_alt_exists.ts ***! + \******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.embed_alt_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.embed_alt_exists = { + id: "embed_alt_exists", + context: "dom:embed", + refactor: { + "RPT_Embed_HasAlt": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "embed_alt_exists.html", + "Potential_1": "embed_alt_exists.html", + "group": "embed_alt_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that the <embed> element has alternative content", + "group": "Provide alternative content for <embed> elements" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_FOUR + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "alt"); + return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/emoticons_alt_exists.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/emoticons_alt_exists.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.emoticons_alt_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.emoticons_alt_exists = { + id: "emoticons_alt_exists", + context: "dom:*", + refactor: { + "WCAG20_Text_Emoticons": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "emoticons_alt_exists.html", + "Potential_1": "emoticons_alt_exists.html", + "group": "emoticons_alt_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that emoticons have a text alternative", + "group": "Emoticons must have a short text alternative that describes their purpose" + } + }, + /** + * Decision in planning 9/7/23 that this rule causes more reviews that we see actual problems in content, so turn these rules off + + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": eRulePolicy.VIOLATION, + "toolkitLevel": eToolkitLevel.LEVEL_TWO + }], + */ + rulesets: [], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + emoticons: { + value: [":-)", ":)", ":o)", ":]", ":3", ":c)", ":>", "=]", "8)", "=)", ":D", "C:", + ":-D", ":D", "8D", "XD", "=D", "=3", "<=3", "<=8", "--!--", ":-(", ":(", ":c", ":<", ":[", + "D:", "D8", "D;", "D=", "DX", "v.v", ":-9", ";-)", ";)", "*)", ";]", ";D", ":-P", ":P", + ":-p", ":p", "=p", ":-Þ", ":Þ", ":-b", ":b", ":-O", ":O", "O_O", "o_o", "8O", "OwO", "O-O", + "0_o", "O_o", "O3O", "o0o ;o_o;", "o...o", "0w0", ":-/", ":/", ":\\", "=/", "=\\", ":S", ":|", + "d:-)", "qB-)", ":)~", ":-)>....", ":-X", ":X", ":-#", ":#", "O:-)", "0:3", "O:)", ":'(", ";*(", + "T_T", "TT_TT", "T.T", ":-*", ":*", "^o)", ">:)", ">;)", ">:-)", "B)", "B-)", "8)", "8-)", + "^>.>^", "^<.<^", "^>_>^", "^<_<^", "D:<", ">:(", "D-:<", ">:-(", ":-@[1]", ";(", "`_´", "D<", + "<3", "<333", "=^_^=", "=>.>=", "=<_<=", "=>.<=", "\\,,/", "\\m/", "\\m/\\>.</\\m/", "\\o/", "\\o o/", + "o/\\o", ":&", ":u" + ], + type: "[string]" + } + }; + var ruleContext = context["dom"].node; + var emoticons = validateParams.emoticons.value; + var passed = true; + var testText = ""; + var walkNode = ruleContext.firstChild; + while (walkNode) { + // Comply to the Check Hidden Content setting will be done by default as this rule triggers on each element + // and for each element it only checks that single elements text nodes and nothing else. So all inner elements will be + // covered on their own. Currently for this rule by default Check Hidden Content will work, as we are doing + // a node walk only on siblings so it would not get text nodes from other siblings at all. + // In the case in the future something chnges, just need to add && !RPTUtil.shouldNodeBeSkippedHidden(walkNode) to the below + // if. + if (walkNode.nodeName == "#text") { + testText += " " + walkNode.nodeValue; + } + walkNode = walkNode.nextSibling; + } + if (testText.trim().length > 0) { + for (var j = 0; passed && j < emoticons.length; ++j) { + var emotIdx = testText.indexOf(emoticons[j]); + var eLngth = emoticons[j].length; + while (passed && emotIdx != -1) { + // Passes if: the emoticon is not preceded by whitespace, + // or the emoticon is not followed by whitespace unless it's punctuation, + // or it's in a pre, code, or script + passed = + (emotIdx > 0 && !/\s/.test(testText.substring(emotIdx - 1, emotIdx))) || + (emotIdx < testText.length - eLngth && !/\s/.test(testText.substring(emotIdx + eLngth, emotIdx + eLngth + 1)) && + !/[.,!'"?]/.test(testText.substring(emotIdx + eLngth, emotIdx + eLngth + 1))); + // Allow usage of (: stuff :) since this is a comment in some languages + passed = passed || ((emoticons[j] == ":)" || emoticons[j] == "(:") && /\(\:.*\:\)/.test(testText)); + passed = passed || ((emoticons[j] == ";)" || emoticons[j] == "(;") && /\(\;.*\;\)/.test(testText)); + emotIdx = testText.indexOf(emoticons[j], emotIdx + 1); + } + } + } + if (!passed) { + // Don't trigger if we're not in the body or if we're in a script, pre, code + var checkAncestor = CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["pre", "code", "script", "body"]); + passed = checkAncestor == null || checkAncestor.nodeName.toLowerCase() != "body"; + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/error_message_exists.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/error_message_exists.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.error_message_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.error_message_exists = { + id: "error_message_exists", + context: "dom:*[aria-invalid=true]", + refactor: { + "HAAC_Aria_ErrorMessage": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_0": "error_message_exists.html", + "Fail_1": "error_message_exists.html", + "Fail_2": "error_message_exists.html", + "group": "error_message_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Custom error message has invalid reference 'id' value", + "Fail_2": "Custom error message is not visible", + "group": "A custom error message must reference a valid 'id' value and when triggered the message must be appropriately exposed" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var aria_errMsgId = AriaUtil_1.AriaUtil.getAriaAttribute(ruleContext, "aria-errormessage"); + // If aria-errormessage is not provided, then OUT_OF_SCOPE + if (!aria_errMsgId) { + return null; + } + var msg_ele = fragment_1.FragmentUtil.getById(ruleContext, aria_errMsgId); + // POF0: Invalid id reference + if (!msg_ele) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + // POF1: Referenced element is not visible + if (!VisUtil_1.VisUtil.isNodeVisible(msg_ele)) { + return (0, IRule_1.RuleFail)("Fail_2"); + } + return (0, IRule_1.RulePass)("Pass_0"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/fieldset_label_valid.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/fieldset_label_valid.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.fieldset_label_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +exports.fieldset_label_valid = { + id: "fieldset_label_valid", + context: "aria:group", + refactor: { + "group_withInputs_hasName": { + "Pass_1": "Pass_1", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_1": "fieldset_label_valid.html", + "Fail_1": "fieldset_label_valid.html", + "Fail_2": "fieldset_label_valid.html", + "group": "fieldset_label_valid.html" + } + }, + messages: { + "en-US": { + "Pass_1": "Group/Fieldset \"{0}\" with an input has a unique name", + "Fail_1": "Group/Fieldset does not have an accessible name", + "Fail_2": "Group/Fieldset \"{0}\" has a duplicate name to another group", + "group": "Groups with nested inputs must have unique accessible name" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1", "3.3.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + var ownerDocument = fragment_1.FragmentUtil.getOwnerFragment(ruleContext); + var formCache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "landmark_group_input", null); + if (!formCache) { + formCache = { + groupsWithInputs: [], + groupsWithInputsComputedLabels: [], + }; + var allGroupsTemp = ownerDocument.querySelectorAll('fieldset,[role="group"]'); + var allGroups = Array.from(allGroupsTemp); + var groupsWithInputs = []; + for (var i = 0; i < allGroups.length; i++) { + // Loop over all the group nodes + if (allGroups[i].querySelector("input")) { + groupsWithInputs.push(allGroups[i]); + } + } + var groupsWithInputsComputedLabels = []; + for (var i = 0; i < groupsWithInputs.length; i++) { + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(groupsWithInputs[i]); + // Loop over all the landmark nodes + groupsWithInputsComputedLabels.push( + /**ARIAMapper.computeName(groupsWithInputs[i])*/ + pair && pair.name && pair.name.trim().length > 0 ? pair.name.trim() : ""); + } + formCache.groupsWithInputs = groupsWithInputs; + formCache.groupsWithInputsComputedLabels = + groupsWithInputsComputedLabels; + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "landmark_group_input", formCache); + } + // formCache.groupsWithInputs.forEach(element => { + // console.log("formCache.groupsWithInputs: " +element.id) + // }); + // console.log("formCache.groupsWithInputsComputedLabels: " +formCache.groupsWithInputsComputedLabels) + // console.log("formCache.groupsWithInputsComputedLabels: " +formCache.groupsWithInputsComputedLabels.length) + var ruleContextFoundIngroupsWithInputsFlag = false; + var computedName = ""; + if (!formCache.groupsWithInputs) { + // We do not have any groups with inputs. Therefore we should skip this rule trigger. + return null; + } + for (var i = 0; i < formCache.groupsWithInputs.length; i++) { + if (ruleContext.isSameNode(formCache.groupsWithInputs[i])) { + // We have found our ruleContext in the cache + ruleContextFoundIngroupsWithInputsFlag = true; + if (formCache.groupsWithInputsComputedLabels[i] === "" || + formCache.groupsWithInputsComputedLabels[i] === null) { + // console.log("Fail_1") + return (0, IRule_1.RuleFail)("Fail_1"); + } + var foundSameNameFlag = false; + for (var j = 0; j < formCache.groupsWithInputsComputedLabels.length; j++) { + if (i == j) { + continue; + } // We do not want to compare against ourselfs + if (formCache.groupsWithInputsComputedLabels[i] === + formCache.groupsWithInputsComputedLabels[j]) { + foundSameNameFlag = true; + } + } + if (foundSameNameFlag) { + // console.log("Fail_2") + return (0, IRule_1.RuleFail)("Fail_2", [ + formCache.groupsWithInputsComputedLabels[i], + ]); + } + computedName = formCache.groupsWithInputsComputedLabels[i]; + } + } + if (!ruleContextFoundIngroupsWithInputsFlag) { + // console.log("null return") + return null; + } + // console.log("Pass_1") + return (0, IRule_1.RulePass)("Pass_1", [computedName]); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/fieldset_legend_valid.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/fieldset_legend_valid.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.fieldset_legend_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.fieldset_legend_valid = { + id: "fieldset_legend_valid", + context: "dom:fieldset", + refactor: { + "WCAG20_Fieldset_HasLegend": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3" + } + }, + help: { + "en-US": { + "Pass_0": "fieldset_legend_valid.html", + "Fail_1": "fieldset_legend_valid.html", + "Fail_2": "fieldset_legend_valid.html", + "Fail_3": "fieldset_legend_valid.html", + "group": "fieldset_legend_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "<fieldset> element does not have a <legend>", + "Fail_2": "<fieldset> element has more than one <legend>", + "Fail_3": "<fieldset> element <legend> is empty", + "group": " <fieldset> elements should have a single, non-empty <legend> as a label" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip if the fieldset is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return null; + // In the case a legend is hidden, we should still trigger a violations for this + var legends = CommonUtil_1.CommonUtil.getChildByTagHidden(ruleContext, "legend", true, false); + if (legends.length === 0) { + // Fieldset has NO Legend + return (0, IRule_1.RuleFail)("Fail_1"); + } + else if (legends.length > 1) { + // Fieldset has more than one legend + return (0, IRule_1.RuleFail)("Fail_2"); + } + else if (CommonUtil_1.CommonUtil.getInnerText(legends[0]).trim().length === 0) { + // Fieldset has legend but legend is empty + return (0, IRule_1.RuleFail)("Fail_3"); + } + return (0, IRule_1.RulePass)("Pass_0"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/figure_label_exists.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/figure_label_exists.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.figure_label_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +exports.figure_label_exists = { + id: "figure_label_exists", + context: "dom:figure", + refactor: { + "HAAC_Figure_label": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "figure_label_exists.html", + "Fail_1": "figure_label_exists.html", + "group": "figure_label_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The <figure> element does not have an associated label", + "group": "A <figure> element must have an associated label" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // ignore if an explicit role is specified. this case will be covered in the aria_accessiblename_exists rules + var role = ruleContext.getAttribute("role"); + if (role) { + return null; + } + //let passed = AriaUtil.hasAriaLabel(ruleContext) || CommonUtil.attributeNonEmpty(ruleContext, "title"); + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + var passed = pair && pair.name && pair.name.trim().length > 0; + //return new ValidationResult(passed, [ruleContext], '', '', []); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", []); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/form_font_color.ts" +/*!*****************************************!*\ + !*** ./src/v4/rules/form_font_color.ts ***! + \*****************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.form_font_color = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.form_font_color = { + id: "form_font_color", + context: "dom:form", + refactor: { + "RPT_Font_ColorInForm": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "form_font_color.html", + "Potential_1": "form_font_color.html", + "group": "form_font_color.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Check color is not used as the only visual means to convey which fields are required", + "group": "Combine color and descriptive markup to indicate required form fields" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = true; + var fonts = ruleContext.getElementsByTagName("font"); + if (fonts != null) { + for (var i = 0; i < fonts.length; ++i) { + passed = !fonts[i].hasAttribute("color"); + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/form_interaction_review.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/form_interaction_review.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.form_interaction_review = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.form_interaction_review = { + id: "form_interaction_review", + context: "dom:form[target]", + refactor: { + "WCAG20_Form_TargetAndText": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "form_interaction_review.html", + "Potential_1": "form_interaction_review.html", + "group": "form_interaction_review.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that interacting with content will not open pop-up windows or change the active window without informing the user", + "group": "User should be informed in advance when interacting with content causes a change of context" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.2.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + paramWinText: { + value: ["new window"], + type: "array" + } + }; + var ruleContext = context["dom"].node; + var tStr = ruleContext.getAttribute("target"); + var passed = tStr === "_parent" || tStr === "_self" || tStr === "_top" || CommonUtil_1.CommonUtil.getFrameByName(ruleContext, tStr) != null; + if (!passed) { + // Name is not part of this frameset – must have potential to create new window? + // See if a new window is mentioned + var textStr = CommonUtil_1.CommonUtil.getInnerText(ruleContext); + if (ruleContext.hasAttribute("title")) + textStr += " " + ruleContext.getAttribute("title"); + for (var i = 0; !passed && i < validateParams.paramWinText.value.length; ++i) + if (textStr.indexOf(validateParams.paramWinText.value[i]) != -1) + passed = true; + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/form_label_unique.ts" +/*!*******************************************!*\ + !*** ./src/v4/rules/form_label_unique.ts ***! + \*******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.form_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +exports.form_label_unique = { + id: "form_label_unique", + context: "dom:label[for]", + refactor: { + "RPT_Label_UniqueFor": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "form_label_unique.html", + "Fail_1": "form_label_unique.html", + "group": "form_label_unique.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Form control has more than one label", + "group": "Form controls should have exactly one label" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // JCH - NO OUT OF SCOPE hidden in context + var labelIds = CacheUtil_1.CacheUtil.getCache(fragment_1.FragmentUtil.getOwnerFragment(ruleContext), "RPT_Label_Single", {}); + var id = ruleContext.getAttribute("for"); + var passed = !(id in labelIds); + labelIds[id] = true; + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/form_submit_button_exists.ts" +/*!***************************************************!*\ + !*** ./src/v4/rules/form_submit_button_exists.ts ***! + \***************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.form_submit_button_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +exports.form_submit_button_exists = { + id: "form_submit_button_exists", + context: "dom:form", + refactor: { + "WCAG20_Form_HasSubmit": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "form_submit_button_exists.html", + "Potential_1": "form_submit_button_exists.html", + "group": "form_submit_button_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify the <form> element has a submit button or an image button", + "group": "A <form> element should have a submit button or an image button" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.2.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = false; + if (ruleContext.firstChild) { + // submit buttons are usually at the bottom - walk backwards + var nw = new DOMWalker_1.DOMWalker(ruleContext, true); + while (!passed && nw.prevNode() && nw.node != ruleContext) { + if (!nw.bEndTag) { + var nodeName = nw.node.nodeName.toLowerCase(); + if (nodeName === "input") { + var type = nw.elem().getAttribute("type"); + if (type) { + type = type.toLowerCase(); + } + passed = type === "submit" || type === "image"; + } + else if (nodeName === "button") { + passed = nw.elem().hasAttribute("type") && nw.elem().getAttribute("type").toLowerCase() === "submit"; + } + else if (nw.node.nodeType === 1) { + passed = AriaUtil_1.AriaUtil.hasRole(nw.node, "button"); + } + } + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/form_submit_review.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/form_submit_review.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.form_submit_review = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.form_submit_review = { + id: "form_submit_review", + context: "dom:select[onchange], dom:input[onchange]", + refactor: { + "RPT_Form_ChangeEmpty": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "form_submit_review.html", + "Potential_1": "form_submit_review.html", + "group": "form_submit_review.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Confirm the form does not submit automatically without warning", + "group": "A form should not be submitted automatically without warning the user" + } + }, + /** + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.2.2"], + "level": eRulePolicy.VIOLATION, + "toolkitLevel": eToolkitLevel.LEVEL_THREE + }],*/ + //deprecate the rule on Jun 10, 2024 + rulesets: [], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = ruleContext.getAttribute("onchange").trim().length === 0; + if (passed) + return null; + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/frame_src_valid.ts" +/*!*****************************************!*\ + !*** ./src/v4/rules/frame_src_valid.ts ***! + \*****************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.frame_src_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.frame_src_valid = { + id: "frame_src_valid", + context: "dom:frame, dom:iframe", + refactor: { + "Valerie_Frame_SrcHtml": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "frame_src_valid.html", + "Potential_1": "frame_src_valid.html", + "group": "frame_src_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify <frame> content is accessible", + "group": "A <frame> containing non-HTML content must be made accessible" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "src") && + CommonUtil_1.CommonUtil.isHtmlExt(CommonUtil_1.CommonUtil.getFileExt(ruleContext.getAttribute("src"))); + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/frame_title_exists.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/frame_title_exists.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.frame_title_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.frame_title_exists = { + id: "frame_title_exists", + context: "dom:frame, dom:iframe", + refactor: { + "WCAG20_Frame_HasTitle": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "frame_title_exists.html", + "Pass_0": "frame_title_exists.html", + "Fail_1": "frame_title_exists.html" + } + }, + messages: { + "en-US": { + "group": "Inline frames must have a unique, non-empty 'title' attribute", + "Pass_0": "Rule Passed", + "Fail_1": "Inline frame does not have a 'title' attribute", + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: "cae760", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // ignore if an explicit role is specified. this case will be covered in the aria_accessiblename_exists rules + var role = ruleContext.getAttribute("role"); + if (role) { + return null; + } + var name_pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + if (name_pair && name_pair.name && name_pair.name.trim().length > 0) { + //if (CommonUtil.attributeNonEmpty(ruleContext, "title")) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/heading_content_exists.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/heading_content_exists.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.heading_content_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.heading_content_exists = { + id: "heading_content_exists", + context: "dom:h1, dom:h2, dom:h3, dom:h4, dom:h5, dom:h6", + refactor: { + "RPT_Header_HasContent": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "heading_content_exists.html", + "Fail_1": "heading_content_exists.html", + "group": "heading_content_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Heading element has descriptive text", + "Fail_1": "Heading element has no descriptive content", + "group": "Heading elements must provide descriptive text" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.6"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = CommonUtil_1.CommonUtil.hasInnerContentHidden(ruleContext); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/heading_markup_misuse.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/heading_markup_misuse.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.heading_markup_misuse = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.heading_markup_misuse = { + id: "heading_markup_misuse", + context: "dom:h1, dom:h2, dom:h3, dom:h4, dom:h5, dom:h6", + dependencies: ["heading_content_exists"], + refactor: { + "RPT_Headers_FewWords": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "heading_markup_misuse.html", + "Potential_1": "heading_markup_misuse.html", + "group": "heading_markup_misuse.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that the heading element is a genuine heading", + "group": "Heading elements must not be used for presentation" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + headingLengthThresh: { + value: 20, + type: "integer" + } + }; + var ruleContext = context["dom"].node; + var headingLengthThresh = validateParams.headingLengthThresh.value; + var passed = CommonUtil_1.CommonUtil.wordCount(CommonUtil_1.CommonUtil.getInnerText(ruleContext)) <= headingLengthThresh; + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/html_lang_exists.ts" +/*!******************************************!*\ + !*** ./src/v4/rules/html_lang_exists.ts ***! + \******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.html_lang_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var ancestor_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/ancestor */ "./src/v2/checker/accessibility/util/ancestor.ts"); +var lang_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/lang */ "./src/v2/checker/accessibility/util/lang.ts"); +exports.html_lang_exists = { + id: "html_lang_exists", + context: "dom:html", + refactor: { + "WCAG20_Html_HasLang": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3", + "Fail_4": "Fail_4", + "Fail_5": "Fail_5", + "Potential_5": "Potential_5", + "Potential_6": "Potential_6" + } + }, + help: { + "en-US": { + "group": "html_lang_exists.html", + "Pass_0": "html_lang_exists.html", + "Fail_1": "html_lang_exists.html", + "Fail_2": "html_lang_exists.html", + "Fail_3": "html_lang_exists.html", + "Fail_4": "html_lang_exists.html", + "Fail_5": "html_lang_exists.html", + "Potential_5": "html_lang_exists.html", + "Potential_6": "html_lang_exists.html" + } + }, + messages: { + "en-US": { + "group": "Page must identify the default language of the document with a 'lang' attribute", + "Pass_0": "Page language detected as \"{0}\"", + "Fail_1": "Page detected as XHTML 1.0, but has neither 'lang' nor 'xml:lang' attributes", + "Fail_2": "Page detected as XHTML, but does not have an 'xml:lang' attribute", + "Fail_3": "Page detected as HTML, but does not have a 'lang' attribute", + "Fail_4": "Page detected with 'lang' and 'xml:lang' attributes and primary languages do not match: \"{0}\", \"{1}\"", + "Fail_5": "Page detected with 'lang' and 'xml:lang' attributes that do not match: \"{0}\", \"{1}\"", + "Potential_5": "Page detected as XHTML 1.0 with only a 'lang' attribute. Confirm that page is only delivered via text/html mime type", + "Potential_6": "Page detected as XHTML 1.0 with only an 'xml:lang' attribute. Confirm that page is only delivered via xml mime type" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "3.1.1", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [{ + "b5c3f8": { + "Pass_0": "pass", + "Fail_1": "inapplicable", + "Fail_2": "inapplicable", + "Fail_3": "fail", + "Fail_4": "inapplicable", + "Fail_5": "inapplicable", + "Potential_5": "inapplicable", + "Potential_6": "inapplicable" + }, + "5b7ae0": { + "Pass_0": "pass", + "Fail_1": "inapplicable", + "Fail_2": "inapplicable", + "Fail_3": "inapplicable", + "Fail_4": "fail", + "Fail_5": "pass", + "Potential_5": "inapplicable", + "Potential_6": "inapplicable" + } + }], + run: function (context, options, contextHierarchies) { + // This rule does not apply inside a presentational frame + if (ancestor_1.AncestorUtil.isPresentationFrame(contextHierarchies)) { + return null; + } + var ruleContext = context["dom"].node; + var doctypeString = ruleContext.ownerDocument.doctype ? ruleContext.ownerDocument.doctype.publicId : ""; + if (!doctypeString) + doctypeString = ""; + var lang = ruleContext.getAttribute("lang"); + var langXML = ruleContext.getAttribute("xml:lang"); + if (doctypeString.includes('XHTML') && !doctypeString.includes("1.0")) { + if (!langXML) { + // XHTML != 1.0 (must have xml:lang + return (0, IRule_1.RuleFail)("Fail_2"); + } + else { + return (0, IRule_1.RulePass)("Pass_0", [langXML]); + } + } + else if (doctypeString.includes('XHTML') && doctypeString.includes("1.0")) { + // Handle XHTML 1.0 + // If neither is provided, it's a failure + if (!lang && !langXML) { + // XHTML and no lang + return (0, IRule_1.RuleFail)("Fail_1"); + } + else if (lang && langXML) { + if (lang !== langXML) { + if (!lang_1.LangUtil.validPrimaryLang(lang) || !lang_1.LangUtil.validPrimaryLang(langXML)) { + // Let Elem_Lang_Valid handle this + return null; + } + if (!lang_1.LangUtil.matchPrimaryLang(lang, langXML)) { + // XHTML and lang and xml:lang, but they don't match + return (0, IRule_1.RuleFail)("Fail_4", [lang, langXML], []); + } + else { + return (0, IRule_1.RuleFail)("Fail_5", [lang, langXML], []); + } + } + else { + // XHTML and lang and xml:lang match + return (0, IRule_1.RulePass)("Pass_0", [lang]); + } + } + else if (lang) { + // XHTML and only lang (okay if only delivered via text/html) + return (0, IRule_1.RulePotential)("Potential_5"); + } + else { + // XHTML and only xml:lang (okay if only delivered via xml mime type) + return (0, IRule_1.RulePotential)("Potential_6"); + } + } + else { + if (!lang) { + return (0, IRule_1.RuleFail)("Fail_3"); + } + else if (lang && langXML) { + // HTML5 polyglot documents + if (lang !== langXML) { + if (!lang_1.LangUtil.validPrimaryLang(lang) || !lang_1.LangUtil.validPrimaryLang(langXML)) { + // Let Elem_Lang_Valid handle this + return null; + } + if (!lang_1.LangUtil.matchPrimaryLang(lang, langXML)) { + // XHTML and lang and xml:lang, but they don't match + return (0, IRule_1.RuleFail)("Fail_4", [lang, langXML], []); + } + else { + return (0, IRule_1.RuleFail)("Fail_5", [lang, langXML], []); + } + } + else { + // XHTML and lang and xml:lang match + return (0, IRule_1.RulePass)("Pass_0", [lang]); + } + } + else { + return (0, IRule_1.RulePass)("Pass_0", [lang]); + } + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/html_skipnav_exists.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/html_skipnav_exists.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.html_skipnav_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +exports.html_skipnav_exists = { + id: "html_skipnav_exists", + context: "dom:html", + refactor: { + "RPT_Html_SkipNav": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "group": "html_skipnav_exists.html", + "Pass_0": "html_skipnav_exists.html", + "Potential_1": "html_skipnav_exists.html" + } + }, + messages: { + "en-US": { + "group": "Provide a way to bypass blocks of content that are repeated on multiple Web pages", + "Pass_0": "Rule Passed", + "Potential_1": "Verify there is a way to bypass blocks of content that are repeated on multiple Web pages" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "2.4.1", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = false; + var frames = CommonUtil_1.CommonUtil.getDocElementsByTag(ruleContext, "frame"); + var headers = CommonUtil_1.CommonUtil.getDocElementsByTag(ruleContext, "h1"); + if ((frames != null && frames.length > 0) || (headers != null && headers.length > 0)) { + // If frames or headings are used, pass + passed = true; + } + else { + // Look for skip anchors + var anchors = CommonUtil_1.CommonUtil.getDocElementsByTag(ruleContext, "a"); + var targets = {}; + for (var idx = 0; !passed && idx < anchors.length; ++idx) { + if (anchors[idx].hasAttribute("href")) { + var href = anchors[idx].href; + if (typeof href !== typeof "") { + if (href.baseVal) { + href = href.baseVal; + } + else { + href = ""; + } + } + var tmpLocation = void 0; + if (typeof (ruleContext.ownerDocument.locationFromDAP) != "undefined" && ruleContext.ownerDocument.locationFromDAP != null) { // DAP sets it + tmpLocation = ruleContext.ownerDocument.locationFromDAP; + } + else { // server scan has the location object + tmpLocation = ruleContext.ownerDocument.location; + } + var docHref = ""; + if (tmpLocation) { + docHref = tmpLocation.href; + } + // Fix weird bugs with how various parsers report on file: url's: + if (href.startsWith("file:///")) + href = "file:/" + href.substring("file:///".length); + if (docHref.startsWith("file:///")) + docHref = "file:/" + docHref.substring("file:///".length); + if (href.charAt(0) == "#" || href.startsWith(docHref + "#")) { + var target = CommonUtil_1.CommonUtil.getFileAnchor(href); + if (fragment_1.FragmentUtil.getById(ruleContext, target) != null) + passed = true; + else + targets[target] = true; + } + } + else if (anchors[idx].hasAttribute("name")) { + // Assume forward jumping targets + var name_1 = anchors[idx].getAttribute("name"); + if (name_1.indexOf("#") != -1) + name_1 = CommonUtil_1.CommonUtil.getFileAnchor(name_1); + passed = name_1 in targets; + } + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/iframe_interactive_tabbable.ts" +/*!*****************************************************!*\ + !*** ./src/v4/rules/iframe_interactive_tabbable.ts ***! + \*****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.iframe_interactive_tabbable = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var DOMMapper_1 = __webpack_require__(/*! ../../v2/dom/DOMMapper */ "./src/v2/dom/DOMMapper.ts"); +exports.iframe_interactive_tabbable = { + id: "iframe_interactive_tabbable", + context: "dom:iframe", + dependencies: [], + help: { + "en-US": { + "group": "iframe_interactive_tabbable.html", + "pass": "iframe_interactive_tabbable.html", + "fail_invalid": "iframe_interactive_tabbable.html" + } + }, + messages: { + "en-US": { + "group": "Iframe with interactive content should not be excluded from tab order using tabindex", + "pass": "The iframe with interactive content is not excluded from the tab order using tabindex", + "fail_invalid": "The <iframe> with interactive content is excluded from tab order using tabindex" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + num: ["2.1.1"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: ["akn7bn"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + var mapper = new DOMMapper_1.DOMMapper(); + var bounds = mapper.getUnadjustedBounds(ruleContext); + //in case the bounds not available + if (!bounds) + return null; + // ignore if iframe is too small to be visible on screen + if (Math.max(bounds['height'], bounds['width']) < 30 || Math.min(bounds['height'], bounds['width']) < 15) + return null; + // pass iframe element does not have a tabindex attribute value that is a negative number + if (!ruleContext.hasAttribute("tabindex") || parseInt(ruleContext.getAttribute("tabindex")) >= 0) + return (0, IRule_1.RulePass)("pass"); + // check iframe content + var iframElem = ruleContext; + if (!iframElem || !iframElem.contentDocument || !iframElem.contentDocument.documentElement) + return null; + var count = CommonUtil_1.CommonUtil.getTabbableChildren(ruleContext); + if (count > 0) + return (0, IRule_1.RuleFail)("fail_invalid"); + return null; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/imagebutton_alt_exists.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/imagebutton_alt_exists.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.imagebutton_alt_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.imagebutton_alt_exists = { + id: "imagebutton_alt_exists", + context: "dom:input", + refactor: { + "WCAG20_Input_ExplicitLabelImage": { + "Pass_0": "Pass_0", + "Pass_1": "Pass_1", + "Pass_2": "Pass_2", + "Fail": "Fail" + } + }, + help: { + "en-US": { + "Pass_0": "imagebutton_alt_exists.html", + "Pass_1": "imagebutton_alt_exists.html", + "Pass_2": "imagebutton_alt_exists.html", + "Fail": "imagebutton_alt_exists.html", + "group": "imagebutton_alt_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Image button provides alternative text using the 'alt' attribute", + "Pass_1": "Image button provides alternative text using an ARIA label", + "Pass_2": "Image button provides alternative text using the 'title' attribute", + "Fail": "The <input> element of type \"image\" has no text alternative", + "group": "The <input> element of type \"image\" should have a text alternative" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: "59796f", + run: function (context, options, contextHierarchies) { + // See https://www.w3.org/WAI/WCAG22/Techniques/failures/F65 + var ruleContext = context["dom"].node; + if (!ruleContext.hasAttribute("type") || ruleContext.getAttribute("type").toLowerCase() != "image") { + return null; + } + if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "alt")) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else if (AriaUtil_1.AriaUtil.hasAriaLabel(ruleContext)) { + return (0, IRule_1.RulePass)("Pass_1"); + } + else if (ruleContext.hasAttribute("title") && ruleContext.getAttribute("title").length > 0) { + return (0, IRule_1.RulePass)("Pass_2"); + } + return (0, IRule_1.RuleFail)("Fail"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/imagemap_alt_exists.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/imagemap_alt_exists.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.imagemap_alt_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.imagemap_alt_exists = { + id: "imagemap_alt_exists", + context: "dom:img[usemap], dom:img[ismap]", + refactor: { + "HAAC_Img_UsemapAlt": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "imagemap_alt_exists.html", + "Fail_1": "imagemap_alt_exists.html", + "group": "imagemap_alt_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Image map or child <area> has no text alternative", + "group": "An image map and each <area> element in an image map must have text alternative(s)" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "alt") || + (!ruleContext.hasAttribute("ismap") && !CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "usemap")); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/img_alt_background.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/img_alt_background.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_alt_background = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.img_alt_background = { + id: "img_alt_background", + context: "dom:*", + refactor: { + "HAAC_BackgroundImg_HasTextOrTitle": { + "Pass_0": "Pass_0", + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Pass_0": "img_alt_background.html", + "Manual_1": "img_alt_background.html", + "group": "img_alt_background.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Manual_1": "Verify important background image information has a text alternative in system high contrast mode", + "group": "Background images that convey important information must have a text alternative that describes the image" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var doc = ruleContext.ownerDocument; + var style = doc.defaultView.getComputedStyle(ruleContext); + if (style == null) { + return (0, IRule_1.RulePass)("Pass_0"); + } + var backgroundImgs = style.backgroundImage; + var passed = true; + if (backgroundImgs != null && backgroundImgs != "" && backgroundImgs != 'none' && backgroundImgs != 'inherit') { + if (ruleContext.innerHTML != null && ruleContext.innerHTML.trim().length != 0) { + passed = false; + } + else { + var title = ruleContext.getAttribute('title'); + if (title != null && title.length != 0) + passed = false; + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/img_alt_decorative.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/img_alt_decorative.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_alt_decorative = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.img_alt_decorative = { + id: "img_alt_decorative", + context: "dom:img[alt]", + refactor: { + "WCAG20_Img_PresentationImgHasNonNullAlt": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "img_alt_decorative.html", + "Fail_1": "img_alt_decorative.html", + "group": "img_alt_decorative.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Image designated as decorative has non-null 'alt' attribute", + "group": "Image designated as decorative must have 'alt=\"\"" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = true; + if (AriaUtil_1.AriaUtil.hasRole(ruleContext, "presentation") || AriaUtil_1.AriaUtil.hasRole(ruleContext, "none")) { + passed = ruleContext.getAttribute("alt").length == 0; + } + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/img_alt_misuse.ts" +/*!****************************************!*\ + !*** ./src/v4/rules/img_alt_misuse.ts ***! + \****************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_alt_misuse = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.img_alt_misuse = { + id: "img_alt_misuse", + context: "dom:img, dom:area, dom:input", + refactor: { + "RPT_Img_AltCommonMisuse": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "img_alt_misuse.html", + "Potential_1": "img_alt_misuse.html", + "group": "img_alt_misuse.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that the file name serves as a good inline replacement for the image", + "group": "'alt' attribute value must be a good inline replacement for the image" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + badText: { + value: ["short description"], + type: "[string]" + } + }; + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLowerCase(); + var passed = true; + // Alt text check are elsewhere (See 41, 240, 455) + if (ruleContext.hasAttribute("alt")) { + var altText = ruleContext.getAttribute("alt").trim(); + if (altText.length > 0) { + var badText = validateParams.badText.value; + for (var i = 0; passed && i < badText.length; ++i) { + passed = altText.indexOf(badText[i]) == -1; + } + if (passed) { + var src = ruleContext.getAttribute((nodeName == "area") ? "href" : "src"); + // Allow it to pass if there's no src - can't determine these. + if (src != null) { + // Fail if the alt matches the src exactly + // Also fail if the alt has a . in it and either the src is in the alt or the alt is in the src + passed = src.trim() != altText && + (altText.indexOf(".") == -1 || (altText.indexOf(src) == -1 && src.indexOf(altText) == -1)); + } + } + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/img_alt_null.ts" +/*!**************************************!*\ + !*** ./src/v4/rules/img_alt_null.ts ***! + \**************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_alt_null = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.img_alt_null = { + id: "img_alt_null", + context: "dom:img[alt]", + refactor: { + "WCAG20_Img_TitleEmptyWhenAltNull": { + "Pass_0": "pass", + "Fail_1": "fail_decorative" + } + }, + help: { + "en-US": { + "pass": "img_alt_null.html", + "fail_decorative": "img_alt_null.html", + "potential_aria_override": "img_alt_null.html", + "group": "img_alt_null.html" + } + }, + messages: { + "en-US": { + "pass": "Neither 'aria' nor 'title' attributes are used for the decorative image", + "fail_decorative": "The image 'alt' attribute is empty, but the 'title' attribute is not empty", + "potential_aria_override": "The image 'alt' attribute is empty, but the 'aria' label is not empty and overrides the 'alt' attribute", + "group": "When the intent is to mark an image as decorative with an empty 'alt' attribute, the 'aria' or 'title' attributes should not be used" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE, + reasonCodes: ["fail_decorative"] + }, + { + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["ARIA"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE, + reasonCodes: ["potential_aria_override"] + } + ], + act: [{ "46ca7f": { "potential_aria_override": "fail" } }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + if (ruleContext.getAttribute("alt").trim().length > 0) { + return null; + } + // We have a title, but alt is empty + if (AriaUtil_1.AriaUtil.getAriaLabel(ruleContext).length > 0) { + return (0, IRule_1.RulePotential)("potential_aria_override"); + } + else if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "title")) { + return (0, IRule_1.RuleFail)("fail_decorative"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/img_alt_redundant.ts" +/*!*******************************************!*\ + !*** ./src/v4/rules/img_alt_redundant.ts ***! + \*******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_alt_redundant = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.img_alt_redundant = { + id: "img_alt_redundant", + context: "dom:img[alt]", + refactor: { + "WCAG20_Img_LinkTextNotRedundant": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3" + } + }, + help: { + "en-US": { + "Pass_0": "img_alt_redundant.html", + "Fail_1": "img_alt_redundant.html", + "Fail_2": "img_alt_redundant.html", + "Fail_3": "img_alt_redundant.html", + "group": "img_alt_redundant.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Link text is repeated in an image 'alt' value within the same link", + "Fail_2": "Link text of previous link is repeated in image 'alt' value of a link", + "Fail_3": "Image 'alt' value within a link is repeated in link text of the link after", + "group": "The text alternative for an image within a link should not repeat the link text or adjacent link text" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1", "2.4.4"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var aNode = CommonUtil_1.CommonUtil.getAncestor(ruleContext, "a"); + //If not in an anchor, Out of Scope + if (aNode == null) + return null; + var altText = ruleContext.getAttribute("alt").trim().toLowerCase(); + if (altText.length == 0) { + // If alt text is empty, there's no text to be redundant - let a_text_purpose + // trigger in that case. + // So Out of Scope for this rule + return null; + } + var innerText = aNode.innerText; + var linkText = ""; + if (innerText != null) { + linkText = innerText.trim().toLowerCase(); + } + if (linkText.length > 0) { + if (altText == linkText) { + // Text in link + return (0, IRule_1.RuleFail)("Fail_1"); + } + } + else { + var passed = true; + //alt is non-zero, but no link text - ensure adjacent link text isn't redundant + var walk = new DOMWalker_1.DOMWalker(aNode); + while (passed && walk.prevNode()) { + // Get the node and nodeName + var node = walk.node; + var nodeName = node.nodeName.toLowerCase(); + if ((nodeName == "#text" && node.nodeValue.length > 0) || + (nodeName == "img" && CommonUtil_1.CommonUtil.attributeNonEmpty(node, "alt"))) { + break; + } + // Comply with the Check Hidden Content Setting if the a element should be checked or not + else if (nodeName === "a" && !CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(node)) { + // Text before image link + passed = (node.innerText || node.textContent || "").trim().toLowerCase() != altText; + } + } + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_2"); + } + walk = new DOMWalker_1.DOMWalker(aNode, true); + while (passed && walk.nextNode()) { + // Get the node and nodeName + var node = walk.node; + var nodeName = node.nodeName.toLowerCase(); + if ((nodeName == "#text" && node.nodeValue.length > 0) || + (nodeName == "img" && CommonUtil_1.CommonUtil.attributeNonEmpty(node, "alt"))) { + break; + } + // Comply with the Check Hidden Content Setting if the a element should be checked or not + else if (nodeName == "a" && !CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(node)) { + passed = node.innerText.trim().toLowerCase() != altText; + } + } + if (!passed) { + // Text after image link + return (0, IRule_1.RuleFail)("Fail_3"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/img_alt_valid.ts" +/*!***************************************!*\ + !*** ./src/v4/rules/img_alt_valid.ts ***! + \***************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_alt_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +exports.img_alt_valid = { + id: "img_alt_valid", + context: "dom:img", + refactor: { + "WCAG20_Img_HasAlt": { + "pass": "pass", + "fail_blank_alt": "fail_blank_alt", + "fail_no_alt": "fail_no_alt", + "fail_blank_title": "fail_blank_title" + } + }, + help: { + "en-US": { + "pass": "img_alt_valid.html", + "fail_blank_alt": "img_alt_valid.html", + "fail_no_alt": "img_alt_valid.html", + "fail_blank_title": "img_alt_valid.html", + "group": "img_alt_valid.html" + } + }, + messages: { + "en-US": { + "pass": "The image has an accessible name or is correctly marked as decorative or redundant", + "fail_blank_alt": "Image 'alt' attribute value consists only of blank space(s)", + "fail_no_alt": "The image has neither an accessible name nor is marked as decorative or redundant", + "fail_blank_title": "The image does not have an 'alt' attribute or ARIA label, and the 'title' attribute value consists only of blank space(s)", + "group": "Images must have accessible names unless they are decorative or redundant" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: "23a2a8", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // If not visible to the screen reader, or can be ignored + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || AccNameUtil_1.AccNameUtil.isAccessibleNameIgnorable(ruleContext)) + return null; + if (AriaUtil_1.AriaUtil.getAriaLabel(ruleContext).trim().length !== 0) { + // the img has non-empty aria label + return (0, IRule_1.RulePass)("pass"); + } + var alt = ruleContext.hasAttribute("alt") ? ruleContext.getAttribute("alt") : null; + // check title attribute + if (alt === null) { + // the img has no alt or attribute, examine the title attribute + var title = ruleContext.hasAttribute("title") ? ruleContext.getAttribute("title") : null; + if (title === null || title.length === 0) { + // no title or title is empty, examine alt further + if (alt === null) { + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext, false); + if (role === 'presentation' || role === 'none') + return (0, IRule_1.RulePass)("pass"); + return (0, IRule_1.RuleFail)("fail_no_alt"); + } + if (alt.length === 0) + return (0, IRule_1.RulePass)("pass"); + } + else { + if (title.trim().length === 0) { + // title contains blank space only (title=" ") + return (0, IRule_1.RuleFail)("fail_blank_title"); + } + // title contains some text (title="some text") + return (0, IRule_1.RulePass)("pass"); + } + } + else { + if (alt.length === 0 || alt.trim().length > 0) { + // the img has empty alt (alt="") or non-empty alt (alt="some text") + return (0, IRule_1.RulePass)("pass"); + } + else { + // alt contains blank space only (alt=" ") + return (0, IRule_1.RuleFail)("fail_blank_alt"); + } + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/img_ismap_misuse.ts" +/*!******************************************!*\ + !*** ./src/v4/rules/img_ismap_misuse.ts ***! + \******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_ismap_misuse = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.img_ismap_misuse = { + id: "img_ismap_misuse", + context: "dom:img[ismap]", + refactor: { + "RPT_Img_UsemapValid": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "img_ismap_misuse.html", + "Potential_1": "img_ismap_misuse.html", + "group": "img_ismap_misuse.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Server-side image map hot-spots do not have duplicate text links", + "group": "Server-side image map hot-spots must have duplicate text links" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = false; + if (ruleContext.hasAttribute("usemap")) { + var usemap = ruleContext.getAttribute("usemap"); + usemap = usemap.trim().toLowerCase(); + var idx = usemap.indexOf("#"); + if (idx != -1) + usemap = usemap.substr(idx + 1); + if (usemap.length > 0) { + var maps = CommonUtil_1.CommonUtil.getDocElementsByTag(ruleContext, "map"); + for (var i = 0; !passed && i < maps.length; ++i) { + passed = maps[i].hasAttribute("name") && + maps[i].getAttribute("name").toLowerCase() == usemap; + } + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/img_longdesc_misuse.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/img_longdesc_misuse.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_longdesc_misuse = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.img_longdesc_misuse = { + id: "img_longdesc_misuse", + context: "dom:img[longdesc]", + refactor: { + "RPT_Img_LongDescription2": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "img_longdesc_misuse.html", + "Potential_1": "img_longdesc_misuse.html", + "group": "img_longdesc_misuse.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that the file designated by the 'longdesc' attribute contains valid HTML content (file extension not recognized)", + "group": " The 'longdesc' attribute must reference HTML content" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var longdesc = ruleContext.getAttribute("longdesc"); + // if (longdesc is bad URL) passed = false; + var ext = CommonUtil_1.CommonUtil.getFileExt(longdesc); + var passed = ext.length != 0 && CommonUtil_1.CommonUtil.isHtmlExt(ext) + || longdesc.startsWith("#") + || longdesc.startsWith("http://") + || longdesc.startsWith("https://") + || longdesc.startsWith("data:"); + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/index.ts" +/*!*******************************!*\ + !*** ./src/v4/rules/index.ts ***! + \*******************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +// This file is automatically generated by "npm run prebuild". Do not edit +__exportStar(__webpack_require__(/*! ./a_target_warning */ "./src/v4/rules/a_target_warning.ts"), exports); +__exportStar(__webpack_require__(/*! ./a_text_purpose */ "./src/v4/rules/a_text_purpose.ts"), exports); +__exportStar(__webpack_require__(/*! ./applet_alt_exists */ "./src/v4/rules/applet_alt_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./application_content_accessible */ "./src/v4/rules/application_content_accessible.ts"), exports); +__exportStar(__webpack_require__(/*! ./area_alt_exists */ "./src/v4/rules/area_alt_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_accessiblename_exists */ "./src/v4/rules/aria_accessiblename_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_activedescendant_tabindex_valid */ "./src/v4/rules/aria_activedescendant_tabindex_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_activedescendant_valid */ "./src/v4/rules/aria_activedescendant_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_application_label_unique */ "./src/v4/rules/aria_application_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_application_labelled */ "./src/v4/rules/aria_application_labelled.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_article_label_unique */ "./src/v4/rules/aria_article_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_attribute_allowed */ "./src/v4/rules/aria_attribute_allowed.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_attribute_conflict */ "./src/v4/rules/aria_attribute_conflict.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_attribute_deprecated */ "./src/v4/rules/aria_attribute_deprecated.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_attribute_exists */ "./src/v4/rules/aria_attribute_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_attribute_redundant */ "./src/v4/rules/aria_attribute_redundant.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_attribute_required */ "./src/v4/rules/aria_attribute_required.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_attribute_value_valid */ "./src/v4/rules/aria_attribute_value_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_banner_label_unique */ "./src/v4/rules/aria_banner_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_banner_single */ "./src/v4/rules/aria_banner_single.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_child_tabbable */ "./src/v4/rules/aria_child_tabbable.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_child_valid */ "./src/v4/rules/aria_child_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_complementary_label_unique */ "./src/v4/rules/aria_complementary_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_complementary_label_visible */ "./src/v4/rules/aria_complementary_label_visible.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_complementary_labelled */ "./src/v4/rules/aria_complementary_labelled.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_content_in_landmark */ "./src/v4/rules/aria_content_in_landmark.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_contentinfo_label_unique */ "./src/v4/rules/aria_contentinfo_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_contentinfo_misuse */ "./src/v4/rules/aria_contentinfo_misuse.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_contentinfo_single */ "./src/v4/rules/aria_contentinfo_single.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_descendant_valid */ "./src/v4/rules/aria_descendant_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_document_label_unique */ "./src/v4/rules/aria_document_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_eventhandler_role_valid */ "./src/v4/rules/aria_eventhandler_role_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_form_label_unique */ "./src/v4/rules/aria_form_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_graphic_labelled */ "./src/v4/rules/aria_graphic_labelled.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_hidden_nontabbable */ "./src/v4/rules/aria_hidden_nontabbable.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_id_unique */ "./src/v4/rules/aria_id_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_img_labelled */ "./src/v4/rules/aria_img_labelled.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_keyboard_handler_exists */ "./src/v4/rules/aria_keyboard_handler_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_landmark_name_unique */ "./src/v4/rules/aria_landmark_name_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_main_label_unique */ "./src/v4/rules/aria_main_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_main_label_visible */ "./src/v4/rules/aria_main_label_visible.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_navigation_label_unique */ "./src/v4/rules/aria_navigation_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_parent_required */ "./src/v4/rules/aria_parent_required.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_region_label_unique */ "./src/v4/rules/aria_region_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_region_labelled */ "./src/v4/rules/aria_region_labelled.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_role_allowed */ "./src/v4/rules/aria_role_allowed.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_role_redundant */ "./src/v4/rules/aria_role_redundant.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_search_label_unique */ "./src/v4/rules/aria_search_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_semantics */ "./src/v4/rules/aria_semantics.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_toolbar_label_unique */ "./src/v4/rules/aria_toolbar_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_widget_labelled */ "./src/v4/rules/aria_widget_labelled.ts"), exports); +__exportStar(__webpack_require__(/*! ./asciiart_alt_exists */ "./src/v4/rules/asciiart_alt_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./blink_css_review */ "./src/v4/rules/blink_css_review.ts"), exports); +__exportStar(__webpack_require__(/*! ./blink_elem_deprecated */ "./src/v4/rules/blink_elem_deprecated.ts"), exports); +__exportStar(__webpack_require__(/*! ./blockquote_cite_exists */ "./src/v4/rules/blockquote_cite_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./canvas_content_described */ "./src/v4/rules/canvas_content_described.ts"), exports); +__exportStar(__webpack_require__(/*! ./caption_track_exists */ "./src/v4/rules/caption_track_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./combobox_active_descendant */ "./src/v4/rules/combobox_active_descendant.ts"), exports); +__exportStar(__webpack_require__(/*! ./combobox_autocomplete_valid */ "./src/v4/rules/combobox_autocomplete_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./combobox_design_valid */ "./src/v4/rules/combobox_design_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./combobox_focusable_elements */ "./src/v4/rules/combobox_focusable_elements.ts"), exports); +__exportStar(__webpack_require__(/*! ./combobox_haspopup_valid */ "./src/v4/rules/combobox_haspopup_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./combobox_popup_reference */ "./src/v4/rules/combobox_popup_reference.ts"), exports); +__exportStar(__webpack_require__(/*! ./debug_paths */ "./src/v4/rules/debug_paths.ts"), exports); +__exportStar(__webpack_require__(/*! ./detector_tabbable */ "./src/v4/rules/detector_tabbable.ts"), exports); +__exportStar(__webpack_require__(/*! ./dir_attribute_valid */ "./src/v4/rules/dir_attribute_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./download_keyboard_controllable */ "./src/v4/rules/download_keyboard_controllable.ts"), exports); +__exportStar(__webpack_require__(/*! ./draggable_alternative_exists */ "./src/v4/rules/draggable_alternative_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_accesskey_labelled */ "./src/v4/rules/element_accesskey_labelled.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_accesskey_unique */ "./src/v4/rules/element_accesskey_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_attribute_deprecated */ "./src/v4/rules/element_attribute_deprecated.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_id_unique */ "./src/v4/rules/element_id_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_lang_valid */ "./src/v4/rules/element_lang_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_mouseevent_keyboard */ "./src/v4/rules/element_mouseevent_keyboard.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_orientation_unlocked */ "./src/v4/rules/element_orientation_unlocked.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_scrollable_tabbable */ "./src/v4/rules/element_scrollable_tabbable.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_tabbable_role_valid */ "./src/v4/rules/element_tabbable_role_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_tabbable_unobscured */ "./src/v4/rules/element_tabbable_unobscured.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_tabbable_visible */ "./src/v4/rules/element_tabbable_visible.ts"), exports); +__exportStar(__webpack_require__(/*! ./embed_alt_exists */ "./src/v4/rules/embed_alt_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./emoticons_alt_exists */ "./src/v4/rules/emoticons_alt_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./error_message_exists */ "./src/v4/rules/error_message_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./fieldset_label_valid */ "./src/v4/rules/fieldset_label_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./fieldset_legend_valid */ "./src/v4/rules/fieldset_legend_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./figure_label_exists */ "./src/v4/rules/figure_label_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./form_font_color */ "./src/v4/rules/form_font_color.ts"), exports); +__exportStar(__webpack_require__(/*! ./form_interaction_review */ "./src/v4/rules/form_interaction_review.ts"), exports); +__exportStar(__webpack_require__(/*! ./form_label_unique */ "./src/v4/rules/form_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./form_submit_button_exists */ "./src/v4/rules/form_submit_button_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./form_submit_review */ "./src/v4/rules/form_submit_review.ts"), exports); +__exportStar(__webpack_require__(/*! ./frame_src_valid */ "./src/v4/rules/frame_src_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./frame_title_exists */ "./src/v4/rules/frame_title_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./heading_content_exists */ "./src/v4/rules/heading_content_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./heading_markup_misuse */ "./src/v4/rules/heading_markup_misuse.ts"), exports); +__exportStar(__webpack_require__(/*! ./html_lang_exists */ "./src/v4/rules/html_lang_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./html_skipnav_exists */ "./src/v4/rules/html_skipnav_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./iframe_interactive_tabbable */ "./src/v4/rules/iframe_interactive_tabbable.ts"), exports); +__exportStar(__webpack_require__(/*! ./imagebutton_alt_exists */ "./src/v4/rules/imagebutton_alt_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./imagemap_alt_exists */ "./src/v4/rules/imagemap_alt_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./img_alt_background */ "./src/v4/rules/img_alt_background.ts"), exports); +__exportStar(__webpack_require__(/*! ./img_alt_decorative */ "./src/v4/rules/img_alt_decorative.ts"), exports); +__exportStar(__webpack_require__(/*! ./img_alt_misuse */ "./src/v4/rules/img_alt_misuse.ts"), exports); +__exportStar(__webpack_require__(/*! ./img_alt_null */ "./src/v4/rules/img_alt_null.ts"), exports); +__exportStar(__webpack_require__(/*! ./img_alt_redundant */ "./src/v4/rules/img_alt_redundant.ts"), exports); +__exportStar(__webpack_require__(/*! ./img_alt_valid */ "./src/v4/rules/img_alt_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./img_ismap_misuse */ "./src/v4/rules/img_ismap_misuse.ts"), exports); +__exportStar(__webpack_require__(/*! ./img_longdesc_misuse */ "./src/v4/rules/img_longdesc_misuse.ts"), exports); +__exportStar(__webpack_require__(/*! ./input_autocomplete_valid */ "./src/v4/rules/input_autocomplete_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./input_checkboxes_grouped */ "./src/v4/rules/input_checkboxes_grouped.ts"), exports); +__exportStar(__webpack_require__(/*! ./input_fields_grouped */ "./src/v4/rules/input_fields_grouped.ts"), exports); +__exportStar(__webpack_require__(/*! ./input_haspopup_conflict */ "./src/v4/rules/input_haspopup_conflict.ts"), exports); +__exportStar(__webpack_require__(/*! ./input_label_after */ "./src/v4/rules/input_label_after.ts"), exports); +__exportStar(__webpack_require__(/*! ./input_label_before */ "./src/v4/rules/input_label_before.ts"), exports); +__exportStar(__webpack_require__(/*! ./input_label_exists */ "./src/v4/rules/input_label_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./input_label_visible */ "./src/v4/rules/input_label_visible.ts"), exports); +__exportStar(__webpack_require__(/*! ./input_onchange_review */ "./src/v4/rules/input_onchange_review.ts"), exports); +__exportStar(__webpack_require__(/*! ./input_placeholder_label_visible */ "./src/v4/rules/input_placeholder_label_visible.ts"), exports); +__exportStar(__webpack_require__(/*! ./label_content_exists */ "./src/v4/rules/label_content_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./label_name_visible */ "./src/v4/rules/label_name_visible.ts"), exports); +__exportStar(__webpack_require__(/*! ./label_ref_valid */ "./src/v4/rules/label_ref_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./list_children_valid */ "./src/v4/rules/list_children_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./list_markup_review */ "./src/v4/rules/list_markup_review.ts"), exports); +__exportStar(__webpack_require__(/*! ./list_structure_proper */ "./src/v4/rules/list_structure_proper.ts"), exports); +__exportStar(__webpack_require__(/*! ./marquee_elem_avoid */ "./src/v4/rules/marquee_elem_avoid.ts"), exports); +__exportStar(__webpack_require__(/*! ./media_alt_brief */ "./src/v4/rules/media_alt_brief.ts"), exports); +__exportStar(__webpack_require__(/*! ./media_alt_exists */ "./src/v4/rules/media_alt_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./media_audio_transcribed */ "./src/v4/rules/media_audio_transcribed.ts"), exports); +__exportStar(__webpack_require__(/*! ./media_autostart_controllable */ "./src/v4/rules/media_autostart_controllable.ts"), exports); +__exportStar(__webpack_require__(/*! ./media_keyboard_controllable */ "./src/v4/rules/media_keyboard_controllable.ts"), exports); +__exportStar(__webpack_require__(/*! ./media_live_captioned */ "./src/v4/rules/media_live_captioned.ts"), exports); +__exportStar(__webpack_require__(/*! ./media_track_available */ "./src/v4/rules/media_track_available.ts"), exports); +__exportStar(__webpack_require__(/*! ./meta_redirect_optional */ "./src/v4/rules/meta_redirect_optional.ts"), exports); +__exportStar(__webpack_require__(/*! ./meta_refresh_delay */ "./src/v4/rules/meta_refresh_delay.ts"), exports); +__exportStar(__webpack_require__(/*! ./meta_viewport_zoomable */ "./src/v4/rules/meta_viewport_zoomable.ts"), exports); +__exportStar(__webpack_require__(/*! ./noembed_content_exists */ "./src/v4/rules/noembed_content_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./object_text_exists */ "./src/v4/rules/object_text_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./page_title_exists */ "./src/v4/rules/page_title_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./page_title_valid */ "./src/v4/rules/page_title_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./script_focus_blur_review */ "./src/v4/rules/script_focus_blur_review.ts"), exports); +__exportStar(__webpack_require__(/*! ./script_onclick_avoid */ "./src/v4/rules/script_onclick_avoid.ts"), exports); +__exportStar(__webpack_require__(/*! ./script_onclick_misuse */ "./src/v4/rules/script_onclick_misuse.ts"), exports); +__exportStar(__webpack_require__(/*! ./script_select_review */ "./src/v4/rules/script_select_review.ts"), exports); +__exportStar(__webpack_require__(/*! ./select_options_grouped */ "./src/v4/rules/select_options_grouped.ts"), exports); +__exportStar(__webpack_require__(/*! ./skip_main_described */ "./src/v4/rules/skip_main_described.ts"), exports); +__exportStar(__webpack_require__(/*! ./skip_main_exists */ "./src/v4/rules/skip_main_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./style_background_decorative */ "./src/v4/rules/style_background_decorative.ts"), exports); +__exportStar(__webpack_require__(/*! ./style_before_after_review */ "./src/v4/rules/style_before_after_review.ts"), exports); +__exportStar(__webpack_require__(/*! ./style_color_misuse */ "./src/v4/rules/style_color_misuse.ts"), exports); +__exportStar(__webpack_require__(/*! ./style_focus_visible */ "./src/v4/rules/style_focus_visible.ts"), exports); +__exportStar(__webpack_require__(/*! ./style_highcontrast_visible */ "./src/v4/rules/style_highcontrast_visible.ts"), exports); +__exportStar(__webpack_require__(/*! ./style_hover_persistent */ "./src/v4/rules/style_hover_persistent.ts"), exports); +__exportStar(__webpack_require__(/*! ./style_viewport_resizable */ "./src/v4/rules/style_viewport_resizable.ts"), exports); +__exportStar(__webpack_require__(/*! ./svg_graphics_labelled */ "./src/v4/rules/svg_graphics_labelled.ts"), exports); +__exportStar(__webpack_require__(/*! ./table_aria_descendants */ "./src/v4/rules/table_aria_descendants.ts"), exports); +__exportStar(__webpack_require__(/*! ./table_caption_empty */ "./src/v4/rules/table_caption_empty.ts"), exports); +__exportStar(__webpack_require__(/*! ./table_caption_nested */ "./src/v4/rules/table_caption_nested.ts"), exports); +__exportStar(__webpack_require__(/*! ./table_headers_exists */ "./src/v4/rules/table_headers_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./table_headers_ref_valid */ "./src/v4/rules/table_headers_ref_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./table_headers_related */ "./src/v4/rules/table_headers_related.ts"), exports); +__exportStar(__webpack_require__(/*! ./table_layout_linearized */ "./src/v4/rules/table_layout_linearized.ts"), exports); +__exportStar(__webpack_require__(/*! ./table_scope_valid */ "./src/v4/rules/table_scope_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./table_structure_misuse */ "./src/v4/rules/table_structure_misuse.ts"), exports); +__exportStar(__webpack_require__(/*! ./table_summary_redundant */ "./src/v4/rules/table_summary_redundant.ts"), exports); +__exportStar(__webpack_require__(/*! ./target_spacing_sufficient */ "./src/v4/rules/target_spacing_sufficient.ts"), exports); +__exportStar(__webpack_require__(/*! ./text_block_heading */ "./src/v4/rules/text_block_heading.ts"), exports); +__exportStar(__webpack_require__(/*! ./text_contrast_sufficient */ "./src/v4/rules/text_contrast_sufficient.ts"), exports); +__exportStar(__webpack_require__(/*! ./text_quoted_correctly */ "./src/v4/rules/text_quoted_correctly.ts"), exports); +__exportStar(__webpack_require__(/*! ./text_sensory_misuse */ "./src/v4/rules/text_sensory_misuse.ts"), exports); +__exportStar(__webpack_require__(/*! ./text_spacing_valid */ "./src/v4/rules/text_spacing_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./text_whitespace_valid */ "./src/v4/rules/text_whitespace_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./widget_tabbable_exists */ "./src/v4/rules/widget_tabbable_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./widget_tabbable_single */ "./src/v4/rules/widget_tabbable_single.ts"), exports); + + +/***/ }, + +/***/ "./src/v4/rules/input_autocomplete_valid.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/input_autocomplete_valid.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_autocomplete_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.input_autocomplete_valid = { + id: "input_autocomplete_valid", + context: "dom:input[autocomplete], dom:textarea[autocomplete], dom:select[autocomplete]", + refactor: { + "WCAG21_Input_Autocomplete": { + "Pass_0": "pass", + "Fail_1": "fail_inappropriate", + "Fail_2": "fail_invalid", + "Fail_attribute_incorrect": "fail_incorrect" + } + }, + help: { + "en-US": { + "group": "input_autocomplete_valid.html", + "pass": "input_autocomplete_valid.html", + "fail_inappropriate": "input_autocomplete_valid.html", + "fail_invalid": "input_autocomplete_valid.html", + "fail_incorrect": "input_autocomplete_valid.html" + } + }, + messages: { + "en-US": { + "group": "The 'autocomplete' attribute's token(s) must be appropriate for the input form field", + "pass": "The 'autocomplete' attribute's token(s) is appropriate for the input form field", + "fail_inappropriate": "The 'autocomplete' attribute's token(s) are not appropriate for the input form field", + "fail_invalid": "The 'autocomplete' attribute's token(s) are not appropriate for an input form field of any type", + "fail_incorrect": "The 'autocomplete' attribute has an incorrect value" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.5"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [{ + "73f2c2": { + "pass": "pass", + "fail_inappropriate": "fail", + "fail_invalid": "pass", + "fail_incorrect": "fail" + } + }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) { + return null; + } + var autocompleteAttr = ruleContext.getAttribute("autocomplete").trim().toLowerCase(); + var tokens = autocompleteAttr.split(/\s+/); + if (tokens.length === 0 || autocompleteAttr.length === 0) { + return null; + } + var cache = { + "tokensOnOff": ["on", "off"], + "tokenOptionalSection": "section-", + "tokensOptionalPurpose": ["shipping", "billing"], + "tokensMandatoryGroup1_password": ["new-password", "current-password", "one-time-code"], + "tokensMandatoryGroup1_multiline": ["street-address"], + "tokensMandatoryGroup1_month": ["cc-exp"], + "tokensMandatoryGroup1_numeric": ["cc-exp-month", + "cc-exp-year", + "transaction-amount", + "bday-day", + "bday-month", + "bday-year"], + "tokensMandatoryGroup1_date": ["bday"], + "tokensMandatoryGroup1_url": ["url", "photo"], + "tokensMandatoryGroup1_text": ["name", + "honorific-prefix", + "given-name", + "additional-name", + "family-name", + "honorific-suffix", + "nickname", + "username", + "organization-title", + "organization", + "address-line1", + "address-line2", + "address-line3", + "address-level4", + "address-level3", + "address-level2", + "address-level1", + "country", + "country-name", + "postal-code", + "cc-name", + "cc-given-name", + "cc-additional-name", + "cc-family-name", + "cc-number", + "cc-csc", + "cc-type", + "transaction-currency", + "language", + "sex"], + "tokensMandatoryGroup1_all": ["name", + "honorific-prefix", + "given-name", + "additional-name", + "family-name", + "honorific-suffix", + "nickname", + "username", + "new-password", + "current-password", + "organization-title", + "organization", + "street-address", + "address-line1", + "address-line2", + "address-line3", + "address-level4", + "address-level3", + "address-level2", + "address-level1", + "country", + "country-name", + "postal-code", + "cc-name", + "cc-given-name", + "cc-additional-name", + "cc-family-name", + "cc-number", + "cc-exp", + "cc-exp-month", + "cc-exp-year", + "cc-csc", + "cc-type", + "transaction-currency", + "transaction-amount", + "language", + "bday", + "bday-day", + "bday-month", + "bday-year", + "sex", + "url", + "photo"], + "tokensOptionalGroup2": ["home", + "work", + "mobile", + "fax", + "pager"], + "tokensMandatoryGroup2_tel": ["tel"], + "tokensMandatoryGroup2_email": ["email"], + "tokensMandatoryGroup2_url": ["impp"], + "tokensMandatoryGroup2_text": ["tel-country-code", + "tel-national", + "tel-area-code", + "tel-local", + "tel-local-prefix", + "tel-local-suffix", + "tel-extension"], + "tokensMandatoryGroup2_all": ["tel", + "tel-country-code", + "tel-national", + "tel-area-code", + "tel-local", + "tel-local-prefix", + "tel-local-suffix", + "tel-extension", + "email", + "impp"], + "tokensOptionGroup1_webauthn": ["webauthn"] + }; + var valid_values = []; + for (var key in cache) + valid_values = valid_values.concat(cache[key]); + var foundMandatoryToken = false; + var foundRecognizedToken = true; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (!tokens.every(function (r) { return valid_values.includes(r) || r.startsWith(cache['tokenOptionalSection']); })) + return (0, IRule_1.RuleFail)("fail_incorrect"); + var type = ruleContext.hasAttribute("type") ? ruleContext.getAttribute("type").trim().toLowerCase() : "text"; + var tokensMandatoryGroup1 = []; + var tokensMandatoryGroup2 = []; + var tokensOptionalGroup = []; + if (nodeName === "textarea" || nodeName === "select") { + // accept all tokens + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_all; + tokensMandatoryGroup2 = cache.tokensMandatoryGroup2_all; + if (nodeName === "textarea") + tokensOptionalGroup = cache.tokensOptionGroup1_webauthn; + } + else if (nodeName === "input") { + tokensOptionalGroup = cache.tokensOptionGroup1_webauthn; + // handle the various 'input' types + switch (type) { + // Disable check for input type=hidden for now based on scrum discussion + /* + case "hidden": + // accept all tokens + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_all; + tokensMandatoryGroup2 = cache.tokensMandatoryGroup2_all; + break; + */ + case "text": + case "search": + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_text.concat(cache.tokensMandatoryGroup1_password, cache.tokensMandatoryGroup1_url, cache.tokensMandatoryGroup1_numeric, cache.tokensMandatoryGroup1_month, cache.tokensMandatoryGroup1_date); + tokensMandatoryGroup2 = cache.tokensMandatoryGroup2_all; + break; + case "password": + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_password; + break; + case "url": + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_url; + tokensMandatoryGroup2 = cache.tokensMandatoryGroup2_url; + break; + case "email": + tokensMandatoryGroup2 = cache.tokensMandatoryGroup2_email; + break; + case "tel": + tokensMandatoryGroup2 = cache.tokensMandatoryGroup2_tel; + break; + case "number": + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_numeric; + break; + case "month": + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_month; + break; + case "date": + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_date; + break; + default: + // unsupported type for this rule. + return null; + } + } + else { + // should never get here. + return null; + } + // Disable check for input type=hidden for now based on scrum discussion + var autofillMantle = /* (nodeName==="input" && type==="hidden") ? "anchor" : */ "expectation"; + if (autofillMantle === "expectation") { + // check on|off for expectation mantle. + if (tokens.includes("on") || tokens.includes("off")) { + // on|off should be the only token + if (tokens.length === 1) { + return (0, IRule_1.RulePass)("pass"); + } + else { + return (0, IRule_1.RuleFail)("fail_invalid"); + } + } + } + // check detail autofill tokens + var currIndex = 0; + var currRecognizedIndex = 0; + // check optional 'section-*' tokens + if (tokens[currIndex].startsWith(cache.tokenOptionalSection) && + tokens[currIndex].length > 8) { + currIndex++; // consume token + currRecognizedIndex++; + } + // check optional 'shipping|billing' tokens + if (tokens.length > currIndex && + cache.tokensOptionalPurpose.includes(tokens[currIndex])) { + currIndex++; // consume token + currRecognizedIndex++; + } + // check either mandatory group 1 or 2 tokens + if (tokens.length > currIndex) { + // check mandatory group 1 + if (tokensMandatoryGroup1.includes(tokens[currIndex])) { + foundMandatoryToken = true; + currIndex++; + } + else { + // check optional tokens for group 2 + if (cache.tokensOptionalGroup2.includes(tokens[currIndex])) { + currIndex++; + } + // check mandatory group 2 + if (tokensMandatoryGroup2.includes(tokens[currIndex])) { + foundMandatoryToken = true; + currIndex++; + } + } + } + // check either mandatory group 1 or 2 tokens + if (tokens.length > currRecognizedIndex) { + // check mandatory group 1 + if (cache.tokensMandatoryGroup1_all.includes(tokens[currRecognizedIndex])) { + foundRecognizedToken = true; + currRecognizedIndex++; + } + else { + // check optional tokens for group 2 + if (cache.tokensOptionalGroup2.includes(tokens[currRecognizedIndex])) { + currRecognizedIndex++; + } + // check mandatory group 2 + if (cache.tokensMandatoryGroup2_all.includes(tokens[currRecognizedIndex])) { + foundRecognizedToken = true; + currRecognizedIndex++; + } + } + } + if (tokens.length > currIndex + currRecognizedIndex) { + // check optional tokens webauthn + if (tokensOptionalGroup.includes(tokens[currIndex + currRecognizedIndex])) { + currIndex++; + } + } + if ((tokens.length > currIndex && tokensOptionalGroup.includes(tokens[currIndex])) + || (tokens.length > currRecognizedIndex && tokensOptionalGroup.includes(tokens[currRecognizedIndex]))) { + currIndex++; + currRecognizedIndex++; + } + // Only pass if we have seen either of the mandatory groups and all tokens have been consumed + if (foundMandatoryToken && tokens.length === currIndex) { + return (0, IRule_1.RulePass)("pass"); + } + else if (foundRecognizedToken && tokens.length === currRecognizedIndex) { + return (0, IRule_1.RuleFail)("fail_incorrect"); + } + else { + return (0, IRule_1.RuleFail)("fail_inappropriate"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/input_checkboxes_grouped.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/input_checkboxes_grouped.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_checkboxes_grouped = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var TableUtil_1 = __webpack_require__(/*! ../util/TableUtil */ "./src/v4/util/TableUtil.ts"); +exports.input_checkboxes_grouped = { + id: "input_checkboxes_grouped", + context: "dom:input[type=radio], dom:input[type=checkbox]", + refactor: { + "WCAG20_Input_RadioChkInFieldSet": { + "Pass_LoneNogroup": "pass_lonenogroup", + "Pass_Grouped": "pass_grouped", + "Pass_RadioNoName": "pass_radioNoName", + "Fail_ControlNameMismatch": "fail_controlnamemismatch", + "Fail_NotGroupedOtherGrouped": "fail_notgroupedothergrouped", + "Fail_NotGroupedOtherNotGrouped": "fail_notgroupedothernotgrouped", + "Fail_NotSameGroup": "fail_notsamegroup", + "Potential_LoneCheckbox": "potential_lonecheckbox", + "Potential_UnnamedCheckbox": "potential_unnamedcheckbox" + } + }, + help: { + "en-US": { + "group": "input_checkboxes_grouped.html", + "pass_lonenogroup": "input_checkboxes_grouped.html", + "pass_grouped": "input_checkboxes_grouped.html", + "pass_radiononame": "input_checkboxes_grouped.html", + "fail_controlnamemismatch": "input_checkboxes_grouped.html", + "fail_notgroupedothergrouped": "input_checkboxes_grouped.html", + "fail_notgroupedothernotgrouped": "input_checkboxes_grouped.html", + "fail_notsamegroup": "input_checkboxes_grouped.html", + "potential_lonecheckbox": "input_checkboxes_grouped.html", + "potential_unnamedcheckbox": "input_checkboxes_grouped.html" + } + }, + messages: { + "en-US": { + "group": "Related sets of radio buttons or checkboxes should be programmatically grouped", + "pass_lonenogroup": "{0} grouping not required for a control of this type", + "pass_grouped": "{0} input is grouped with other related controls with the same name", + "pass_radiononame": "Radio input is not grouped, but passes because it has no name to group with other radio inputs", + "fail_controlnamemismatch": "{0} input found that has the same name, \"{2}\" as a {1} input", + "fail_notgroupedothergrouped": "{0} input is not in the group with another {0} with the name \"{1}\"", + "fail_notgroupedothernotgrouped": "{0} input and others with the name \"{1}\" are not grouped together", + "fail_notsamegroup": "{0} input is in a different group than another {0} with the name \"{1}\"", + "potential_lonecheckbox": "Verify that this ungrouped checkbox input is not related to other checkboxes", + "potential_unnamedcheckbox": "Verify that this un-named, ungrouped checkbox input is not related to other checkboxes" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var getGroup = function (e) { + var retVal = CommonUtil_1.CommonUtil.getAncestor(e, "fieldset") + || AriaUtil_1.AriaUtil.getAncestorWithRole(e, "radiogroup") + || AriaUtil_1.AriaUtil.getAncestorWithRole(e, "group") + || AriaUtil_1.AriaUtil.getAncestorWithRole(e, "grid") + || AriaUtil_1.AriaUtil.getAncestorWithRole(e, "table"); + if (!retVal) { + retVal = CommonUtil_1.CommonUtil.getAncestor(e, "table"); + if (retVal && !TableUtil_1.TableUtil.isDataTable(retVal)) { + retVal = null; + } + } + return retVal; + }; + // Only radio buttons and checkboxes are in scope + var ctxType = ruleContext.getAttribute("type").toLowerCase(); + // Determine which form we're in (if any) to determine our scope + var ctxForm = AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, "form") + || CommonUtil_1.CommonUtil.getAncestor(ruleContext, "html") + || ruleContext.ownerDocument.documentElement; + // Get data about all of the visible checkboxes and radios in the scope of this form + // and cache it for all of the other inputs in this scope + var formCache = CacheUtil_1.CacheUtil.getCache(ctxForm, "input_checkboxes_grouped", null); + if (!formCache) { + formCache = { + checkboxByName: {}, + radiosByName: {}, + nameToGroup: {}, + numCheckboxes: 0, + numRadios: 0 + }; + // Get all of the checkboxes in the form or body (but not nested in something else and not hidden) + // And get a mapping of these checkboxes to + var cWalker = new DOMWalker_1.DOMWalker(ctxForm, false, ctxForm, true); + var checkboxQ = []; + var radiosQ = []; + while (cWalker.nextNode()) { + if (!cWalker.bEndTag + && cWalker.node.nodeType === 1 + && cWalker.node.nodeName.toLowerCase() === "input" + && VisUtil_1.VisUtil.isNodeVisible(cWalker.node)) { + var type = cWalker.node.getAttribute("type"); + if (type === "checkbox") { + checkboxQ.push(cWalker.node); + } + else if (type === "radio") { + radiosQ.push(cWalker.node); + } + } + } + // let checkboxQ = ctxForm.querySelectorAll("input[type=checkbox]"); + for (var idx = 0; idx < checkboxQ.length; ++idx) { + var cb = checkboxQ[idx]; + if ((AriaUtil_1.AriaUtil.getAncestorWithRole(cb, "form") + || CommonUtil_1.CommonUtil.getAncestor(ruleContext, "html") + || ruleContext.ownerDocument.documentElement) === ctxForm + && !CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(cb)) { + var name_1 = cb.getAttribute("name") || ""; + (formCache.checkboxByName[name_1] = formCache.checkboxByName[name_1] || []).push(cb); + formCache.nameToGroup[name_1] = formCache.nameToGroup[name_1] || getGroup(cb); + ++formCache.numCheckboxes; + } + } + // Get all of the radios in the form or body (but not nested in something else and not hidden) + // let radiosQ = ctxForm.querySelectorAll("input[type=radio]"); + for (var idx = 0; idx < radiosQ.length; ++idx) { + var r = radiosQ[idx]; + var radCtx = (AriaUtil_1.AriaUtil.getAncestorWithRole(r, "form") + || CommonUtil_1.CommonUtil.getAncestor(ruleContext, "html") + || ruleContext.ownerDocument.documentElement); + if (radCtx === ctxForm + && !CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(r)) { + var name_2 = r.getAttribute("name") || ""; + (formCache.radiosByName[name_2] = formCache.radiosByName[name_2] || []).push(r); + formCache.nameToGroup[name_2] = formCache.nameToGroup[name_2] || getGroup(r); + ++formCache.numRadios; + } + } + CacheUtil_1.CacheUtil.setCache(ctxForm, "input_checkboxes_grouped", formCache); + } + ///////////// Calculated everything, now check the various cases + var ctxName = ruleContext.getAttribute("name"); + var ctxGroup = getGroup(ruleContext); + ctxType = ctxType === "radio" ? "Radio" : "Checkbox"; + if (!ctxName || ctxName === "") { + // First process cases where the control is not named + if (ctxType === "Radio") { + // Radios without names don't act like groups, so don't enforce grouping + if (ctxGroup === null) { + return (0, IRule_1.RulePass)("pass_radiononame", [ctxType]); + } + else { + return (0, IRule_1.RulePass)("pass_grouped", [ctxType]); + } + } + else { + // Must be an unnamed checkbox + if (ctxGroup === null) { + if ((formCache.checkboxByName[""] || []).length > 1) { + return (0, IRule_1.RulePotential)("potential_unnamedcheckbox", [ctxType]); + } + else { + return (0, IRule_1.RulePass)("pass_lonenogroup", [ctxType]); + } + } + else { + return (0, IRule_1.RulePass)("pass_grouped", [ctxType]); + } + } + } + else { + // Considering a named checkbox + var numRadiosWithName = (formCache.radiosByName[ctxName] || []).length; + var numCheckboxesWithName = (formCache.checkboxByName[ctxName] || []).length; + // Capitalize the input type for messages + if (numRadiosWithName > 0 && numCheckboxesWithName > 0) { + // We have a naming mismatch between different controls + return (0, IRule_1.RuleFail)("fail_controlnamemismatch", [ctxType, ctxType === "checkbox" ? "radio" : "checkbox", ctxName]); + } + else if (ctxType === "Radio" && (formCache.numRadios === 1 || numRadiosWithName === 1) + || ctxType === "Checkbox" && formCache.numCheckboxes === 1) { + // This is a lone control (either only control of this type on the page, or a radio button without any others by that name) + // We pass this control in all cases + if (ctxGroup === null) { + return (0, IRule_1.RulePass)("pass_lonenogroup", [ctxType]); + } + else { + return (0, IRule_1.RulePass)("pass_grouped", [ctxType]); + } + } + else if (ctxType === "Checkbox" && formCache.numCheckboxes > 1 && numCheckboxesWithName === 1) { + // We have only one checkbox with this name, but there are other checkboxes in the form. + // If we're not grouped, ask them to examine it + if (ctxGroup === null) { + return (0, IRule_1.RulePotential)("potential_lonecheckbox", [ctxType]); + } + else { + return (0, IRule_1.RulePass)("pass_grouped", [ctxType]); + } + } + else { + // We share a name with another similar control. Are we grouped together? + if (ctxGroup === null) { + if (formCache.nameToGroup[ctxName] !== null) { + // We're not grouped, but some control with the same name is in a group + return (0, IRule_1.RuleFail)("fail_notgroupedothergrouped", [ctxType, ctxName]); + } + else { + // None of us are grouped + return (0, IRule_1.RuleFail)("fail_notgroupedothernotgrouped", [ctxType, ctxName]); + } + } + else if (formCache.nameToGroup[ctxName] !== ctxGroup) { + // We're not in the main group with the others + return (0, IRule_1.RuleFail)("fail_notsamegroup", [ctxType, ctxName]); + } + else { + // We're all grouped up! + return (0, IRule_1.RulePass)("pass_grouped", [ctxType]); + } + } + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/input_fields_grouped.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/input_fields_grouped.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_fields_grouped = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.input_fields_grouped = { + id: "input_fields_grouped", + context: "dom:input, dom:textarea, dom:select", + refactor: { + "WCAG20_Input_InFieldSet": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "input_fields_grouped.html", + "Potential_1": "input_fields_grouped.html", + "group": "input_fields_grouped.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Use the <fieldset> element to group logically related input elements", + "group": "Groups of logically related input elements should be contained within a <fieldset> element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Don't trigger for other input types or if we're in a fieldset + if (ruleContext.nodeName.toLowerCase() == "input" && ruleContext.hasAttribute("type")) { + var type = ruleContext.getAttribute("type").toLowerCase(); + if (type != "text" && type != "file" && type != "password") + return (0, IRule_1.RulePass)("Pass_0"); + } + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, "fieldset") != null) + return (0, IRule_1.RulePass)("Pass_0"); + // No fieldset - see if this input is all by itself - no need to group single inputs + var parent = CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["form", "body"]); + var checkTypes = ["input", "textarea", "select"]; + var passed = true; + for (var i = 0; passed && i < checkTypes.length; ++i) { + var controls = parent.getElementsByTagName(checkTypes[i]); + for (var j = 0; passed && j < controls.length; ++j) { + // Check if the node should be skipped or not based on the Check Hidden Content setting and if the node isVisible or + // not. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(controls[j])) { + continue; + } + // Note that textareas and selects will be called type='text' + var type = controls[j].hasAttribute("type") ? controls[j].getAttribute("type").toLowerCase() : "text"; + // Only fail if this is another control in the form and its type is another text-like input + passed = controls[j] == ruleContext || (type != "text" && type != "password" && type != "file"); + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/input_haspopup_conflict.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/input_haspopup_conflict.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_haspopup_conflict = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.input_haspopup_conflict = { + id: "input_haspopup_conflict", + context: "dom:input[list][aria-haspopup]", + refactor: { + "input_haspopup_invalid": { + // "Pass": "pass", + "Potential_1": "potential_type_misuse", + "Potential_2": "potential_misuse" + } + }, + help: { + "en-US": { + "group": "input_haspopup_conflict.html", + // "pass": "input_haspopup_conflict.html", + "potential_type_misuse": "input_haspopup_conflict.html", + "potential_misuse": "input_haspopup_conflict.html", + "potential_list_notexist": "input_haspopup_conflict.html", + "fail_invalid_list_type": "input_haspopup_conflict.html", + "fail_invalid_list_elem": "input_haspopup_conflict.html" + } + }, + messages: { + "en-US": { + "group": "<input> element with a 'list' attribute should not use an explicit 'aria-haspopup' attribute", + // "pass": "The <input> element with a 'list' attribute does not use an explicit 'aria-haspopup' attribute", + "potential_type_misuse": "The <input> element with type \"{0}\" and 'list' attribute uses an explicit 'aria-haspopup' attribute", + "potential_misuse": "The <input> element with a missing or invalid type and 'list' attribute uses an explicit 'aria-haspopup' attribute", + "potential_list_notexist": "The list attribute for the <input> element is invalid", + "fail_invalid_list_type": "The list attribute for the <input> element with the type \"{0}\" is invalid", + "fail_invalid_list_elem": "The list attribute for the <input> element does not reference a datalist element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip if the fieldset is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return null; + var roles = AriaUtil_1.AriaUtil.getUserDefinedRoles(ruleContext); + // let "aria_role_valid" to handle invalid role. Only allowed role is combobox which is implicit. + if (roles && roles.length > 0 && !roles.includes('combobox')) + return null; + //triggering input types: text, search, tel, url, email, or missing or invalid + var yesTypes = ["text", "search", "tel", "url", "email", "date", "month", "week", "time", "datetime-local", "number", "range", "color"]; + var noTypes = ["file", "password", "checkbox", "radio", "submit", "reset", "image", "hidden", "button"]; + var attrValue = ruleContext.getAttribute("type"); + //missing input type for list but with aria_has_popup + if (!attrValue || attrValue.trim().length === 0) + return (0, IRule_1.RulePotential)("potential_misuse"); + attrValue = attrValue.trim().toLowerCase(); + //invalid input types for list but with aria_has_popup + if (!yesTypes.includes(attrValue) && !noTypes.includes(attrValue)) + return (0, IRule_1.RulePotential)("potential_misuse"); + // the list attribute is used for wrong input type + if (attrValue && noTypes.includes(attrValue)) + return (0, IRule_1.RuleFail)("fail_invalid_list_type"); + var list = ruleContext.getAttribute("list"); + // the list attribute is blank + if (!list || list.trim().length === 0) + return (0, IRule_1.RulePotential)("potential_list_notexist"); + var listElem = ruleContext.ownerDocument.getElementById(list); + // the list element doesn't exist + if (!listElem) + return (0, IRule_1.RuleFail)("potential_list_notexist"); + // the list element is not a datalist element + if (listElem.nodeName.toLowerCase() !== 'datalist') + return (0, IRule_1.RuleFail)("fail_invalid_list_elem"); + // valid input types for list but with aria_has_popup + if (yesTypes.includes(attrValue)) + return (0, IRule_1.RulePotential)("potential_type_misuse", [attrValue]); + // shouldn't get here + return; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/input_label_after.ts" +/*!*******************************************!*\ + !*** ./src/v4/rules/input_label_after.ts ***! + \*******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_label_after = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.input_label_after = { + id: "input_label_after", + context: "dom:input", + refactor: { + "WCAG20_Input_LabelAfter": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_0": "input_label_after.html", + "Fail_1": "input_label_after.html", + "Fail_2": "input_label_after.html", + "group": "input_label_after.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Checkbox or radio button is nested in label, so label is not after the input control", + "Fail_2": "Label text is located before its associated checkbox or radio button element", + "group": "Checkboxes and radio buttons must have a label after the input control" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.3.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var type = ""; + if (ruleContext.hasAttribute("type")) + type = ruleContext.getAttribute("type").toLowerCase(); + if (type != "checkbox" && type != "radio") { + return null; + } + // Get only the non-hidden labels for element + var labelElem = CommonUtil_1.CommonUtil.getLabelForElementHidden(ruleContext, true); + if (labelElem === null || !CommonUtil_1.CommonUtil.hasInnerContentHidden(labelElem)) { + // Due to dependency, label must be done via title - this rule doesn't apply + return null; + } + var value = CommonUtil_1.CommonUtil.compareNodeOrder(labelElem, ruleContext); + var passed; + if (value === -2) { + // input nested in label + passed = false; + var walkNode = new DOMWalker_1.DOMWalker(labelElem); + walkNode.node = ruleContext; + while (!passed && walkNode.nextNode()) { + passed = ((walkNode.node.nodeName.toLowerCase() === "#text" && walkNode.node.nodeValue.trim().length > 0) + || (walkNode.node.nodeName.toLowerCase() === "span" && walkNode.node.textContent.trim().length > 0)); + } + if (!passed) { + // Input nested in label and text before input + return (0, IRule_1.RuleFail)("Fail_1"); + } + } + else { + if (value != 1) { + // label is before input + return (0, IRule_1.RuleFail)("Fail_2"); + } + } + return (0, IRule_1.RulePass)("Pass_0"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/input_label_before.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/input_label_before.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_label_before = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.input_label_before = { + id: "input_label_before", + context: "dom:input, dom:textarea, dom:select", + refactor: { + "WCAG20_Input_LabelBefore": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_0": "input_label_before.html", + "Fail_1": "input_label_before.html", + "Fail_2": "input_label_before.html", + "group": "input_label_before.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Text input is nested in label such that input precedes the label text", + "Fail_2": "Label text is located after its associated text input or <select> element", + "group": "Text inputs and <select> elements must have a label before the input control" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.3.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (ruleContext.nodeName.toLowerCase() == "input" && ruleContext.hasAttribute("type")) { + var type = ruleContext.getAttribute("type").toLowerCase(); + if (type != "text" && type != "file" && type != "password") { + return null; + } + } + // Get only the non-hidden labels for element + var labelElem = CommonUtil_1.CommonUtil.getLabelForElementHidden(ruleContext, true); + if (labelElem == null || !CommonUtil_1.CommonUtil.hasInnerContentHidden(labelElem)) { + // Due to dependency, label must be done via title - this rule doesn't apply + return null; + } + var value = CommonUtil_1.CommonUtil.compareNodeOrder(labelElem, ruleContext); + if (value === -2) { + // ignore if no label or the content for the label is only from the nested input control + var text = CommonUtil_1.CommonUtil.getInnerText(ruleContext); + if (text && text.trim().length > 0 && CommonUtil_1.CommonUtil.getInnerText(ruleContext).trim() === text.trim()) { + // Due to dependency, label must be done via title - this rule doesn't apply + return null; + } + // input nested in label + var passed = false; + var walkNode = ruleContext.previousSibling; + while (!passed && walkNode !== null) { + passed = ((walkNode.nodeName.toLowerCase() == "#text" && walkNode.nodeValue.trim().length > 0) + || (walkNode.nodeName.toLowerCase() == "span" && walkNode.textContent.trim().length > 0)); + walkNode = walkNode.previousSibling; + } + if (!passed) { + // Input nested in label and text after input + return (0, IRule_1.RuleFail)("Fail_1"); + } + } + else { + if (value != -1) { + // label is after input + return (0, IRule_1.RuleFail)("Fail_2"); + } + } + // Haven't returned yet, then I pass + return (0, IRule_1.RulePass)("Pass_0"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/input_label_exists.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/input_label_exists.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_label_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +exports.input_label_exists = { + id: "input_label_exists", + context: "aria:button,aria:checkbox,aria:combobox,aria:listbox,aria:menuitemcheckbox,aria:menuitemradio,aria:radio,aria:searchbox,aria:slider,aria:spinbutton,aria:switch,aria:textbox,aria:progressbar,dom:input[type=file],dom:output,dom:meter,dom:input[type=password]", + //dependencies: ["aria_role_redundant", "aria_role_valid"], + refactor: { + "WCAG20_Input_ExplicitLabel": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_0": "input_label_exists.html", + "Fail_1": "input_label_exists.html", + "Fail_2": "input_label_exists.html", + "group": "input_label_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Form control element <{0}> has no associated label", + "Fail_2": "Form control with \"{0}\" role has no associated label", + "group": "Each form control must have an associated label" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + // TODO: ACT: https://github.com/IBMa/equal-access/issues/756 + act: ["97a4e1", "e086e5"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) { + return null; + } + var nodeName = ruleContext.nodeName.toLowerCase(); + //ignore datalist element check since it will be part of a input element or hidden by default + if (nodeName === 'datalist') + return null; + // Determine the input type + var passed = true; + var type = "text"; + if (nodeName == "input" && ruleContext.hasAttribute("type")) { + type = ruleContext.getAttribute("type").toLowerCase(); + } + else if (nodeName === "button" || AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "button")) { + type = "buttonelem"; + } + if (nodeName == "input" && type == "") { + type = "text"; + } + if (type === "image") { + // Handled by input_label_existsImage + return null; + } + /** + let POF = -1; + let textTypes = CommonUtil.input_text_types; + let buttonTypes = CommonUtil.form_button_types; + + let buttonTypesWithDefaults = ["reset", "submit"]; // 'submit' and 'reset' have visible defaults. + if (textTypes.indexOf(type) !== -1) { // If type is in the list + // Get only the non-hidden labels for elements, in the case that a label is hidden then it is a violation + // Note: label[for] does not work for ARIA defined inputs + let labelElem = ruleContext.hasAttribute("role") ? null : CommonUtil.getLabelForElementHidden(ruleContext, true); + let hasLabelElemContent = false; + if (labelElem) { + if (CommonUtil.hasInnerContentHidden(labelElem)) { + hasLabelElemContent = true; + } else if ((labelElem.getAttribute("aria-label") || "").trim().length > 0) { + hasLabelElemContent = true; + } else if (labelElem.hasAttribute("aria-labelledby")) { + let labelledByElem = FragmentUtil.getById(labelElem, labelElem.getAttribute('aria-labelledby')); + if (labelledByElem && !DOMUtil.sameNode(labelledByElem, labelElem) && CommonUtil.hasInnerContent(labelledByElem)) { + hasLabelElemContent = true; + } + } + } + passed = (!!labelElem && hasLabelElemContent) || + (!labelElem && CommonUtil.attributeNonEmpty(ruleContext, "title") || CommonUtil.attributeNonEmpty(ruleContext, "placeholder")) || + AriaUtil.getAriaLabel(ruleContext).trim().length > 0 || CommonUtil.hasImplicitLabel(ruleContext); + if (!passed) POF = 2 + textTypes.indexOf(type); + + } else if (buttonTypes.indexOf(type) !== -1) { // If type is a button + if (buttonTypesWithDefaults.indexOf(type) !== -1 && !ruleContext.hasAttribute("value")) { + // 'submit' and 'reset' have visible defaults so pass if there is no 'value' attribute + passed = true; + } else { + passed = CommonUtil.attributeNonEmpty(ruleContext, "value") || AriaUtil.hasAriaLabel(ruleContext) || CommonUtil.attributeNonEmpty(ruleContext, "title"); + if (!passed) POF = 2 + textTypes.length + buttonTypes.indexOf(type); + } + } else if (type == "buttonelem") { + // If I am an image and I have alt text - accessibility-web-engine#269 + let bAlt = false; + if (ruleContext.nodeName.toLowerCase() === "img" && ruleContext.hasAttribute("alt")) { + let alt = ruleContext.getAttribute("alt"); + if (alt.trim().length === 0) { + bAlt = false; + } else { + bAlt = true; + } + }; + passed = CommonUtil.hasInnerContentHidden(ruleContext) || AriaUtil.hasAriaLabel(ruleContext) || bAlt || CommonUtil.attributeNonEmpty(ruleContext, "title"); + + if (!passed) POF = 2 + textTypes.length + buttonTypes.length + 1; + } + + //check if a native button is labelled + if (!passed && nodeName == "button") { + if (CommonUtil.hasImplicitLabel(ruleContext)) + passed = true; + else { + let label = CommonUtil.getLabelForElement(ruleContext); + if (label && CommonUtil.hasInnerContentHidden(label)) + passed = true; + } + } + + // Rpt_Aria_ValidIdRef determines if the aria-labelledby id points to a valid element + if (!passed && (buttonTypes.indexOf(type) !== -1)) { + if (ruleContext.hasAttribute("class") && ruleContext.getAttribute("class") == "dijitOffScreen" && DOMWalker.parentElement(ruleContext).hasAttribute("widgetid")) { + // Special handling for dijit buttons + let labelId = DOMWalker.parentElement(ruleContext).getAttribute("widgetid") + "_label"; + let label = FragmentUtil.getById(ruleContext, labelId); + if (label != null) { + passed = CommonUtil.hasInnerContentHidden(label); + // This means I failed above also + if (!passed) POF = 2 + textTypes.length + buttonTypes.length + 4 + buttonTypes.indexOf(type); + } + } + } + + if (!passed && nodeName == "optgroup") { + passed = CommonUtil.attributeNonEmpty(ruleContext, "label"); + if (!passed) POF = 2 + textTypes.length + buttonTypes.length + 2; + } + if (!passed && nodeName == "option") { + // Is a non-empty value attribute also enough for an option element? + passed = CommonUtil.attributeNonEmpty(ruleContext, "label") || ruleContext.innerHTML.trim().length > 0; + if (!passed) POF = 2 + textTypes.length + buttonTypes.length + 3; + } + + if (!passed) + passed = AriaUtil.getAriaLabel(ruleContext).trim().length > 0 || CommonUtil.attributeNonEmpty(ruleContext, "title"); + + if (!passed) { + // check aria role to figure out if the accessible name can be from content + const roles = AriaUtil.getRoles(ruleContext, true); + //when multiple roles specified, only the first valid role (guaranteed by dependencies) is applied, and the others just as fallbacks + if (ARIADefinitions.designPatterns[roles[0]] && ARIADefinitions.designPatterns[roles[0]].nameFrom && ARIADefinitions.designPatterns[roles[0]].nameFrom.includes("contents")) + passed = CommonUtil.hasInnerContentHidden(ruleContext); + } + */ + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + passed = pair && pair.name && pair.name.trim().length > 0; + if (passed) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else if (ruleContext.hasAttribute("role") && ruleContext.getAttribute("role").trim().length > 0) { + return (0, IRule_1.RuleFail)("Fail_2", ruleContext.getAttribute("role").split(" ")); + } + else { + return (0, IRule_1.RuleFail)("Fail_1", [nodeName]); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/input_label_visible.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/input_label_visible.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_label_visible = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +exports.input_label_visible = { + id: "input_label_visible", + context: "aria:button,aria:checkbox,aria:combobox,aria:listbox,aria:menuitemcheckbox,aria:menuitemradio,aria:radio,aria:searchbox,aria:slider,aria:spinbutton,aria:switch,aria:textbox", + dependencies: ["input_label_exists"], + refactor: { + "WCAG20_Input_VisibleLabel": { + "Pass_0": "pass", + "Potential_1": "potential_no_label", + "potential_placeholder_only": "potential_placeholder_only" + } + }, + help: { + "en-US": { + "pass": "input_label_visible.html", + "potential_placeholder_only": "input_label_visible.html", + "potential_no_label": "input_label_visible.html", + "group": "input_label_visible.html" + } + }, + messages: { + "en-US": { + "pass": "The input element has an associated visible label", + "potential_placeholder_only": "The ‘placeholder’ is the only visible label", + "potential_no_label": "The input element does not have an associated visible label", + "group": "An input element must have an associated visible label" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.5.3", "3.3.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + //ignore datalist element check since it will be part of a input element or hidden by default + if (nodeName === 'datalist') + return null; + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return null; + // if a control is in a table cell, the col headers can act as visible label, which is checked in table heading rule + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, "table")) + return null; + // custom widget submission is not in scope for this success criteria (IBMa/equal-access#204) if it is not associated with data entry + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + if (role && role === "button" && nodeName !== 'input' && nodeName !== 'button') { + // likely a custom widget, skip if not associated with data entry + if (!CommonUtil_1.CommonUtil.getAncestor(ruleContext, "form")) + return null; + } + // when in a combobox, only look at the input textbox. + if (AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, "combobox") && + !(AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "textbox") || AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "searchbox") || + nodeName === "input" || (nodeName === "select" && AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "combobox")))) { + return null; + } + // avoid diagnosing the popup list of a combobox. + var rolesToCheck = ["listbox", "tree", "grid", "dialog"]; + for (var j = 0; j < rolesToCheck.length; j++) { + if (AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, rolesToCheck[j])) { + var comboboxes = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "combobox", true, true); + for (var k = 0; k < comboboxes.length; k++) { + var combobox = comboboxes[k]; + var aria_owns = CommonUtil_1.CommonUtil.getElementAttribute(combobox, "aria-owns"); + if (aria_owns) { + var owns = CommonUtil_1.CommonUtil.normalizeSpacing(aria_owns.trim()).split(" "); + for (var i = 0; i < owns.length; i++) { + var owned = fragment_1.FragmentUtil.getById(ruleContext, owns[i]); + if (owned === ruleContext) { + return null; + } + } + } + } + } + } + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + // check visible label for input or button + if (nodeName === 'input' || nodeName === 'button') { + if (pair && pair.name && pair.name.trim().length > 0 && (pair.nameFrom === 'label' || pair.nameFrom === 'internal' || pair.nameFrom === 'alt')) + return (0, IRule_1.RulePass)("pass"); + } + // check if an alternative tooltip exists that can be made visible through mouseover + if (pair && pair.name && pair.name.trim().length > 0 && (pair.nameFrom === 'text' || pair.nameFrom === 'title')) + return (0, IRule_1.RulePass)("pass"); + // check if any visible text from the control. + // note that (1) the text doesn’t need to be associated with the control to form a relationship + // (2) the text doesn't need to follow accessible name requirement (e.g. nameFrom) + var text = CommonUtil_1.CommonUtil.getOnScreenInnerText(ruleContext); + if (text && text.length !== 0) + return (0, IRule_1.RulePass)("pass"); + // check if any descendant with an alternative tooltip that can be made visible through mouseover + // only consider img and svg, and other text content of the descendant is covered in the isInnerText above + var descendants = AriaUtil_1.AriaUtil.getAllDescendantsWithRoles(ruleContext, ["img", "graphics-document", "graphics-object", "graphics-symbol"], false, true); + if (descendants && descendants.length > 0) { + for (var d = 0; d < descendants.length; d++) { + if (CommonUtil_1.CommonUtil.attributeNonEmpty(descendants[d], "title") || CommonUtil_1.CommonUtil.attributeNonEmpty(descendants[d], "alt")) + return (0, IRule_1.RulePass)("pass"); + } + } + // check if there is a visible label pointed to by the aria-labelledby attribute. + if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "aria-labelledby")) { + var theLabel = ruleContext.getAttribute("aria-labelledby"); + var labelValues = theLabel.split(/\s+/); + for (var j = 0; j < labelValues.length; ++j) { + var elementById = fragment_1.FragmentUtil.getById(ruleContext, labelValues[j]); + if (elementById && !DOMUtil_1.DOMUtil.sameNode(elementById, ruleContext) && VisUtil_1.VisUtil.isNodeVisible(elementById) && CommonUtil_1.CommonUtil.hasInnerContentHidden(elementById)) { + return (0, IRule_1.RulePass)("pass"); + } + } + } + if ((nodeName === "optgroup" || nodeName == "option") && (pair && pair.name && pair.name.trim().length > 0 && (pair.nameFrom === 'label' || pair.nameFrom === 'content'))) + return (0, IRule_1.RulePass)("pass"); + // Determine if this is referenced by a combobox. If so, the label belongs to the combobox + var id = ruleContext.getAttribute("id"); + if (id && id.trim().length > 0) { + if (ruleContext.ownerDocument.querySelector("*[aria-controls='".concat(id, "'][role='combobox']"))) { + return null; + } + } + // check if a placeholder exists even though a placeholder text is not sufficient as a visible text + if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "placeholder")) + return (0, IRule_1.RulePotential)("potential_placeholder_only"); + return (0, IRule_1.RulePotential)("potential_no_label"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/input_onchange_review.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/input_onchange_review.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_onchange_review = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.input_onchange_review = { + id: "input_onchange_review", + context: "dom:input[onchange], dom:textarea[onchange], dom:select[onchange]", + refactor: { + "WCAG20_Input_HasOnchange": { + // "Pass_0": "pass", + "Potential_1": "potential_warning" + } + }, + help: { + "en-US": { + // "pass": "input_onchange_review.html", + "potential_warning": "input_onchange_review.html", + "group": "input_onchange_review.html" + } + }, + messages: { + "en-US": { + "group": "Users must be advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs", + // "pass": "The user is advised of the automatic form submission, new window opening, or focus change", + "potential_warning": "Confirm that the user is advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.2.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (ruleContext.nodeName.toLowerCase() == "input" && ruleContext.hasAttribute("type")) { + var type = ruleContext.getAttribute("type").toLowerCase(); + if (type === "hidden" || type === "submit" || type === "image" || type === "button" || type === "reset") + return null; + } + return (0, IRule_1.RulePotential)("potential_warning"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/input_placeholder_label_visible.ts" +/*!*********************************************************!*\ + !*** ./src/v4/rules/input_placeholder_label_visible.ts ***! + \*********************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_placeholder_label_visible = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.input_placeholder_label_visible = { + id: "input_placeholder_label_visible", + context: "dom:input[placeholder], dom:textarea[placeholder]", + refactor: { + "HAAC_Input_Placeholder": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1", + "Potential_2": "Potential_2" + } + }, + help: { + "en-US": { + "Pass_0": "input_placeholder_label_visible.html", + "Potential_1": "input_placeholder_label_visible.html", + "Potential_2": "input_placeholder_label_visible.html", + "group": "input_placeholder_label_visible.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "HTML5 placeholder is the only visible label", + "Potential_2": "Additional visible label referenced by 'aria-labelledby' is not valid", + "group": "HTML5 'placeholder' attribute must not be used as a visible label replacement" + } + }, + /** + * merge the rule into input_label_visible + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.3.2"], + "level": eRulePolicy.VIOLATION, + "toolkitLevel": eToolkitLevel.LEVEL_ONE + }], + */ + rulesets: [], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (ruleContext.hasAttribute("type")) { + var type = ruleContext.getAttribute("type").toLowerCase(); + if (type == "hidden" || type == "button") { + return (0, IRule_1.RulePass)("Pass_0"); + } + } + if (ruleContext.hasAttribute("hidden")) { + var hidden = ruleContext.getAttribute("hidden"); + if (hidden == "" || hidden.toLowerCase() == "hidden") { // when hidden is empty in the element, "" is returned, same as it has a value of "". + return (0, IRule_1.RulePass)("Pass_0"); + } + } + if (ruleContext.hasAttribute("aria-label")) { + return (0, IRule_1.RulePotential)("Potential_1"); + } + if (ruleContext.hasAttribute("aria-labelledby") && ruleContext.hasAttribute("id")) { + var id = ruleContext.getAttribute("id").trim(); + var refIds = ruleContext.getAttribute("aria-labelledby").trim().split(/\s+/); // separated by one or more white spaces + if (!refIds.includes(id)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RulePotential)("Potential_2"); + } + } + return (0, IRule_1.RulePass)("Pass_0"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/label_content_exists.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/label_content_exists.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.label_content_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +exports.label_content_exists = { + id: "label_content_exists", + context: "dom:label", + refactor: { + "Valerie_Label_HasContent": { + "Pass_Regular": "Pass_Regular", + "Pass_AriaLabel": "Pass_AriaLabel", + "Pass_LabelledBy": "Pass_LabelledBy", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_Regular": "label_content_exists.html", + "Pass_AriaLabel": "label_content_exists.html", + "Pass_LabelledBy": "label_content_exists.html", + "Fail_1": "label_content_exists.html", + "group": "label_content_exists.html" + } + }, + messages: { + "en-US": { + "Pass_Regular": "<label> element has accessible name with inner content", + "Pass_AriaLabel": "<label> element has accessible name via 'aria-label'", + "Pass_LabelledBy": "<label> element has accessible name via 'aria-labelledby'", + "Fail_1": "The <label> element does not have descriptive text that identifies the expected input", + "group": "A <label> element must have non-empty descriptive text that identifies the purpose of the interactive component" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (CommonUtil_1.CommonUtil.hasInnerContentHidden(ruleContext)) { + return (0, IRule_1.RulePass)("Pass_Regular"); + } + else if ((ruleContext.getAttribute("aria-label") || "").trim().length > 0) { + return (0, IRule_1.RulePass)("Pass_AriaLabel"); + } + else if (ruleContext.hasAttribute("aria-labelledby")) { + var labelElem = fragment_1.FragmentUtil.getById(ruleContext, ruleContext.getAttribute('aria-labelledby')); + if (labelElem && !DOMUtil_1.DOMUtil.sameNode(labelElem, ruleContext) && CommonUtil_1.CommonUtil.hasInnerContent(labelElem)) { + return (0, IRule_1.RulePass)("Pass_LabelledBy"); + } + } + return (0, IRule_1.RuleFail)("Fail_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/label_name_visible.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/label_name_visible.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.label_name_visible = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var CSSUtil_1 = __webpack_require__(/*! ../util/CSSUtil */ "./src/v4/util/CSSUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +exports.label_name_visible = { + id: "label_name_visible", + context: "aria:button,aria:checkbox,aria:gridcell,aria:link,aria:menuitem,aria:menuitemcheckbox,aria:menuitemradio,aria:option,aria:radio,aria:switch,aria:tab,aria:treeitem,dom:input,dom:textarea,dom:select,dom:output,dom:meter", + refactor: { + "WCAG21_Label_Accessible": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "label_name_visible.html", + "Fail_1": "label_name_visible.html", + "group": "label_name_visible.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Accessible name matches or contains the visible label text", + "Fail_1": "Accessible name does not match or contain the visible label text", + "group": "Accessible name must match or contain the visible label text" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_2"], + "num": ["2.5.3"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + // TODO: ACT: Review https://github.com/act-rules/act-rules.github.io/issues/1618 + // https://www.w3.org/WAI/WCAG21/Techniques/aria/ARIA24 + act: "2ee8b8", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || + CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) { + return null; + } + // pass if the visible text uses Material Icon font + if (CSSUtil_1.CSSUtil.isMaterialIconFont(ruleContext)) + return (0, IRule_1.RulePass)("Pass_0"); + var passed = true; + var nodeName = ruleContext.nodeName.toLowerCase(); + var isInputButton = false; + //let buttonTypes = ["button", "reset", "submit"]; //"image" + var inputType = null; + if (nodeName === "input" && ruleContext.hasAttribute("type")) { + inputType = ruleContext.getAttribute("type").toLowerCase(); + if (CommonUtil_1.CommonUtil.form_button_types.indexOf(inputType) !== -1) { + isInputButton = true; + } + } + var theLabelBy = AriaUtil_1.AriaUtil.getAriaAttribute(ruleContext, "aria-labelledby"); + if (theLabelBy && !CommonUtil_1.CommonUtil.isIdReferToSelf(ruleContext, theLabelBy) && !isInputButton) { + // skip the checks if it has an aria-labelledby since it takes precedence. + } + else { + var theLabel = null; + if (theLabelBy && !CommonUtil_1.CommonUtil.isIdReferToSelf(ruleContext, theLabelBy)) { + var labelValues = theLabelBy.split(/\s+/); + for (var j = 0; j < labelValues.length; ++j) { + var elementById = fragment_1.FragmentUtil.getById(ruleContext, labelValues[j]); + if (elementById) { + theLabel = CommonUtil_1.CommonUtil.getInnerText(elementById); + break; + } + } + } + else { + theLabel = AriaUtil_1.AriaUtil.getAriaAttribute(ruleContext, "aria-label"); + } + if (!theLabel) { + return null; + } + var text = null; + if (isInputButton) { + /* Note: Disable the alt check in images until we get confirmation + if (inputType==="image" && ruleContext.hasAttribute("alt")){ + // use 'alt' attribute as visible text + text = ruleContext.getAttribute("alt"); + }else + */ + if (ruleContext.hasAttribute("value")) { + // use 'value' attribute as visible text + text = ruleContext.getAttribute("value"); + } + else { + // use default value + if (inputType === "submit" /*||inputType==="image"*/) { + text = "submit"; + } + else if (inputType === "reset") { + text = "reset"; + } + } + } + if (!text) { + // look for a <label> element + var labelElem = CommonUtil_1.CommonUtil.getLabelForElementHidden(ruleContext, true); + if (!labelElem) { + var parentNode = DOMWalker_1.DOMWalker.parentNode(ruleContext); + if (parentNode.nodeName.toLowerCase() === "label" /*&& RPTUtil.isFirstFormElement(parentNode, ruleContext)*/) { + var parentClone = parentNode.cloneNode(true); + // exclude all form elements from the label since they might also have inner content + labelElem = CommonUtil_1.CommonUtil.removeAllFormElementsFromLabel(parentClone); + } + } + var element = labelElem ? labelElem : ruleContext; + var elementsToSkipContentCheck = ["meter", "output", "progress", "select", "textarea"]; + if (!labelElem && elementsToSkipContentCheck.indexOf(nodeName) !== -1) { + text = ""; // skip content check for some elements + } + else { + // get the visible text only + text = CommonUtil_1.CommonUtil.getOnScreenInnerText(element); + } + /* Note: Disable this alt check in images for now until we get confirmation + // Look for the alt attribute of an image which is considered visible text. + let hasImgAlt = false; + if (element.firstChild != null) { + let nw = RPTUtil.new NodeWalker(element); + while (!hasImgAlt && nw.nextNode() && nw.node != element && nw.node != element.nextSibling) { + hasImgAlt = (nw.node.nodeName.toLowerCase() == "img" && RPTUtil.attributeNonEmpty(nw.node, "alt")); + if (hasImgAlt) { + text = text ? text + nw.node.getAttribute("alt") : nw.node.getAttribute("alt"); + } + } + } + */ + } + var nonalphanumeric = /[^a-zA-Z0-9]/g; + text = text.replace(nonalphanumeric, " "); // only consider alphanumeric characters + var normalizedText = CommonUtil_1.CommonUtil.normalizeSpacing(text).toLowerCase(); // Leading and trailing whitespace and difference in case sensitivity should be ignored. + theLabel = theLabel.replace(nonalphanumeric, " "); // only consider alphanumeric characters + var normalizedLabel = CommonUtil_1.CommonUtil.normalizeSpacing(theLabel).toLowerCase(); + if (normalizedText.length > 1) { // skip non-text content. e.g., <button aria-label="close">X</button> + var location_1 = normalizedLabel.indexOf(normalizedText); + // Avoid matching partial words.e.g., text "name" should not match 'surname' or 'names' + if (location_1 >= 0 && normalizedLabel.length > normalizedText.length) { + var letters = /^[0-9a-zA-Z]+$/; + if ((location_1 + normalizedText.length) < normalizedLabel.length) { + // check ending + var theChar = normalizedLabel.charAt(location_1 + normalizedText.length); + if (theChar.match(letters)) { + passed = false; + } + } + if (passed && location_1 > 0) { + // check beginning + var theChar = normalizedLabel.charAt(location_1 - 1); + if (theChar.match(letters)) { + passed = false; + } + } + } + if (location_1 === -1) { // check that visible text content of the target is contained within its accessible name. + passed = false; + } + } + } + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/label_ref_valid.ts" +/*!*****************************************!*\ + !*** ./src/v4/rules/label_ref_valid.ts ***! + \*****************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.label_ref_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.label_ref_valid = { + id: "label_ref_valid", + context: "dom:label[for]", + refactor: { + "WCAG20_Label_RefValid": { + "Pass_0": "pass", + "Fail_1": "fail_invalid" + } + }, + help: { + "en-US": { + "pass": "label_ref_valid.html", + "fail_invalid": "label_ref_valid.html", + "group": "label_ref_valid.html" + } + }, + messages: { + "en-US": { + "pass": "The 'for' attribute for a label referencea a unique non-empty 'id' attribute of a valid element", + "fail_invalid": "The value \"{0}\" of the 'for' attribute is not the 'id' of a valid element", + "group": "The 'for' attribute for a label should reference a non-empty, unique 'id' attribute of a valid element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var id = ruleContext.getAttribute("for"); + var passed = false; + var target = fragment_1.FragmentUtil.getById(ruleContext, id); + if (target) { + // ignore if both label and control are invisible + if (!VisUtil_1.VisUtil.isNodeVisible(target) && !VisUtil_1.VisUtil.isNodeVisible(ruleContext)) + return null; + passed = true; + // handles null and undefined + if (!target.hasAttribute("role")) { + // Fail if we're pointing at something that is labelled by another mechanism + var nodeName = target.nodeName.toLowerCase(); + passed = nodeName == "input" || nodeName == "select" || nodeName == "textarea" + || nodeName == "button" || nodeName == "datalist" + || nodeName == "optgroup" || nodeName == "option" + || nodeName == "keygen" || nodeName == "output" + || nodeName == "progress" || nodeName == "meter" + || nodeName == "fieldset" || nodeName == "legend"; + if (target.nodeName.toLowerCase() == "input" && target.hasAttribute("type")) { + var type = target.getAttribute("type").toLowerCase(); + passed = type == "text" || type == "password" || type == "file" || + type == "checkbox" || type == "radio" || + type == "hidden" || type == "search" || type == "tel" || type == "url" || type == "email" || //HTML 5 + type == "date" || type == "number" || type == "range" || type == "image" || //HTML 5 + type == "time" || type == "color" || // HTML 5 + type == "datetime-local" || type == "month" || type == "week"; //HTML5.1 + } + } + // Add one more check to make sure the target element is NOT hidden, in the case the target is hidden + // flag a violation regardless of what the Check Hidden Content setting is. + if (passed && !VisUtil_1.VisUtil.isNodeVisible(target)) { + passed = false; + } + } + var retToken = []; + if (!passed) { + retToken.push(id); + } + //return new ValidationResult(passed, [ruleContext], '', '', passed == true ? [] : [retToken]); + if (!passed) { + return (0, IRule_1.RuleFail)("fail_invalid", retToken); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/list_children_valid.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/list_children_valid.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.list_children_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +exports.list_children_valid = { + id: "list_children_valid", + context: "aria:group", + refactor: { + "HAAC_List_Group_ListItem": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "list_children_valid.html", + "Fail_1": "list_children_valid.html", + "group": "list_children_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "List component with \"group\" role has children that are not <listitem> elements", + "group": "List component with \"group\" role must limit children to <listitem> elements" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var parent = DOMWalker_1.DOMWalker.parentElement(ruleContext); + if (!AriaUtil_1.AriaUtil.hasRoleInSemantics(parent, "list")) { + return null; + } + var passed = true; + var children = ruleContext.children; + for (var i = 0; passed && i < children.length; i++) { + passed = AriaUtil_1.AriaUtil.hasRoleInSemantics(children[i], "listitem"); + } + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/list_markup_review.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/list_markup_review.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.list_markup_review = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.list_markup_review = { + id: "list_markup_review", + context: "dom:*", + refactor: { + "RPT_List_UseMarkup": { + // "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + // "pass": "list_markup_review.html", + "potential_list": "list_markup_review.html", + "group": "list_markup_review.html" + } + }, + messages: { + "en-US": { + // "pass": "Proper HTML elements are used to create a list", + "potential_list": "Verify this is a list and if so, modify to use proper HTML elements for the list", + "group": "Proper HTML elements should be used to create a list" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Extract the nodeName of the context node + var nodeName = ruleContext.nodeName.toLowerCase(); + //skip the check if the element is hidden or disabled + if (CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext) || VisUtil_1.VisUtil.hiddenByDefaultElements.includes(nodeName)) + return null; + // Don't trigger if we're not in the body or if we're in a script + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["body"]) === null) + return null; + // ignore script, label and their child elements + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["script", 'label']) !== null) + return null; + // ignore all widgets and their children, and certain structure roles + var roles = AriaUtil_1.AriaUtil.getRolesWithTypes(ruleContext, ["widget"]); + // add some structure roles + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(["caption", "code", "columnheader", "figure", "list", "listitem", "math", "meter", "columnheader", "rowheader"], roles); + if (AriaUtil_1.AriaUtil.getAncestorWithRoles(ruleContext, roles) !== null) + return null; + var passed = true; + var walkNode = ruleContext.firstChild; + while (passed && walkNode) { + // Comply to the Check Hidden Content setting will be done by default as this rule triggers on each element + // and for each element it only checks that single elements text nodes and nothing else. So all inner elements will be + // covered on their own. Currently for this rule by default Check Hidden Content will work, as we are doing + // a node walk only on siblings so it would not get text nodes from other siblings at all. + // In the case in the future something changes, just need to add && !RPTUtil.shouldNodeBeSkippedHidden(walkNode) to the below + // if. + if (walkNode.nodeName == "#text") { + var txtVal = walkNode.nodeValue; + var failure = /^[ \t\r\n]*[( ]*[1-9]*[\*\-).][ \t][A-Z,a-z]+/.test(txtVal); + passed = !failure; + if (!passed) { + // Ensure that there's some sort of block level element before this + // Avoid failures due to things like <i>Some sentence</i>. New sentence. + var nw = new DOMWalker_1.DOMWalker(walkNode); + while (!passed && nw.prevNode()) { + var nodeName_1 = nw.node.nodeName.toLowerCase(); + if (["blockquote", "center", "dir", "div", "form", "h1", + "h2", "h3", "h4", "h5", "h6", "hr", "br", "menu", "p", + "pre"].includes(nodeName_1)) { + break; + } + if (nodeName_1 == "#text") { + var txt = nw.node.nodeValue; + passed = txt.length > 0 && ![" ", "\t", "\n"].includes(txt.charAt(txt.length - 1)); + } + } + } + } + walkNode = walkNode.nextSibling; + } + if (passed) + return null; + if (!passed) + return (0, IRule_1.RulePotential)("potential_list"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/list_structure_proper.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/list_structure_proper.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.list_structure_proper = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.list_structure_proper = { + id: "list_structure_proper", + context: "dom:dl, dom:ul, dom:ol, dom:dir, dom:menu, dom:li, dom:dd, dom:dt", + refactor: { + "RPT_List_Misuse": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "list_structure_proper.html", + "Potential_1": "list_structure_proper.html", + "group": "list_structure_proper.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "List element is missing or improperly structured", + "group": "List elements should only be used for lists of related items" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed; + var nodeName = ruleContext.nodeName.toLowerCase(); + // Get all the childrens of the ruleContext + var children = ruleContext.children; + if (nodeName == "dl") { + var first = ""; + var last = ""; + var walkChildren = ruleContext.firstChild; + passed = true; + var presentationalFound = false; + // If there are no childrens set as passed, since dl elements can have + // zero or more of: one or more dt elements, followed by one or more dd elements + if (!ruleContext.children || ruleContext.children.length == 0) { + passed = true; + } + else { + while (passed && walkChildren != null) { + if (walkChildren.nodeType == 1) { + var nodeName_1 = walkChildren.nodeName.toLowerCase(); + // While walking through the elements under dl, if we find a + // presentational element we move to the next element as presentational + // elements are allowed under list elements as they are only for + // formatting text nodes. + if (AriaUtil_1.AriaUtil.isPresentationalElement(walkChildren)) { + presentationalFound = true; + walkChildren = walkChildren.nextSibling; + continue; + } + // Only set to pass if we find dd or dt element, in the case of + // an element that is not supported we will catch it here. i.e. img + // element + passed = nodeName_1 == "dd" || nodeName_1 == "dt"; + // Set the first and last node depending on which is found first and last + if (first == "") + first = nodeName_1; + last = nodeName_1; + } + walkChildren = walkChildren.nextSibling; + } + // In the case that we have found dt and dd elements under dl we pass right away. + // In the case that there is no dt or dd element, but bunch of presentational elements we mark this as a + // pass. In the case that there are other elements, such as img we will still trigger a violation. + passed = (passed && first == "dt" && last == "dd") || (passed && presentationalFound); + } + } + else if (nodeName == "li") { + passed = CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["ul", "ol", "dir", "menu"]) != null; + } + else if (nodeName == "dd" || nodeName == "dt") { + passed = CommonUtil_1.CommonUtil.getAncestor(ruleContext, "dl") != null; + } + else { + var walkChildren = ruleContext.firstChild; + // Zero or more li elements are permitted inside of <ol>, <ul> or <menu> elements now as per the html5 spec. This handles the case + // when there are zero elements under the <ol>, <ul> or <menu>. + if ((nodeName == "ul" || nodeName == "ol" || nodeName == "menu") && (!ruleContext.children || ruleContext.children.length == 0)) { + passed = true; + } + else { + var liFound = false; + var presentationalFound = false; + passed = true; + while (passed && walkChildren != null) { + // While walking through the list elements, if we find a + // presentational element we skip checking as presentational + // elements are allowed under list elements as they are only for + // formatting text. + if (AriaUtil_1.AriaUtil.isPresentationalElement(walkChildren)) { + presentationalFound = true; + walkChildren = walkChildren.nextSibling; + continue; + } + // Pass if the node type is anything but 1, or in the case that it is a li element. For any other node + // it will be caught here that element is not allowed under list node. + // Furthermore in the case that there is a template element with the parent being ul/ol don't flag a violation + passed = walkChildren.nodeType != 1 || walkChildren.nodeName.toLowerCase() == "li" || (walkChildren.nodeName.toLowerCase() == "template" && (nodeName == "ul" || nodeName == "ol")); + // Set li found to true if the current element (nodeType=1) is an li element + liFound = liFound || (walkChildren.nodeType == 1 && walkChildren.nodeName.toLowerCase() == "li"); + walkChildren = walkChildren.nextSibling; + } + // In the case that it has passed and also li element is found under list node, we pass right away. + // In the case that there is no li element, but bunch of presentational elements we mark this as a + // pass. In the case that there are other elements, such as img we will still trigger a violation. + passed = (passed && liFound) || (passed && presentationalFound); + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/marquee_elem_avoid.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/marquee_elem_avoid.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.marquee_elem_avoid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.marquee_elem_avoid = { + id: "marquee_elem_avoid", + context: "dom:marquee", + refactor: { + "RPT_Marquee_Trigger": { + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Fail_1": "marquee_elem_avoid.html", + "group": "marquee_elem_avoid.html" + } + }, + messages: { + "en-US": { + "Fail_1": "Scrolling content found that uses the obsolete <marquee> element", + "group": "The <marquee> element is obsolete and should not be used" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.2.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // JCH - NO OUT OF SCOPE hidden in context + return (0, IRule_1.RuleFail)("Fail_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/media_alt_brief.ts" +/*!*****************************************!*\ + !*** ./src/v4/rules/media_alt_brief.ts ***! + \*****************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.media_alt_brief = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.media_alt_brief = { + id: "media_alt_brief", + context: "dom:img[alt], dom:applet[alt], dom:area[alt], dom:embed[alt], dom:input[type][alt]", + refactor: { + "RPT_Media_AltBrief": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "media_alt_brief.html", + "Potential_1": "media_alt_brief.html", + "group": "media_alt_brief.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Text alternative is more than 150 characters", + "group": "Alternative text in 'alt' attribute should be brief (<150 characters)" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + maxAlt: { + value: 150, + type: "integer" + } + }; + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var altLength = ruleContext.getAttribute("alt").trim().length; + var passed = altLength <= validateParams.maxAlt.value; + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/media_alt_exists.ts" +/*!******************************************!*\ + !*** ./src/v4/rules/media_alt_exists.ts ***! + \******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.media_alt_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.media_alt_exists = { + id: "media_alt_exists", + context: "dom:area[alt], dom:embed[alt]", + refactor: { + "RPT_Media_AudioVideoAltFilename": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "media_alt_exists.html", + "Potential_1": "media_alt_exists.html", + "group": "media_alt_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Filename used as label for embedded audio or video", + "group": "Audio or video on the page must have a short text alternative that describes the media content" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var uri = ""; + if (ruleContext.nodeName.toLowerCase() == "area") { + uri = ruleContext.getAttribute("href"); + } + else { + uri = ruleContext.getAttribute("src"); + } + if (uri == null) + uri = ""; + var ext = CommonUtil_1.CommonUtil.getFileExt(uri); + var isAudVid = ext.length != 0 && (CommonUtil_1.CommonUtil.isAudioExt(ext) || CommonUtil_1.CommonUtil.isVideoExt(ext)); + var altText = ruleContext.getAttribute("alt"); + var passed = !isAudVid || (altText.length > 0 && altText.indexOf(ext) == -1); + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/media_audio_transcribed.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/media_audio_transcribed.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.media_audio_transcribed = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.media_audio_transcribed = { + id: "media_audio_transcribed", + context: "dom:bgsound, dom:a[href], dom:area[href], dom:embed, dom:object", + refactor: { + "RPT_Media_AudioTrigger": { + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Manual_1": "media_audio_transcribed.html", + "group": "media_audio_transcribed.html" + } + }, + messages: { + "en-US": { + "Manual_1": "Provide transcripts for audio files", + "group": "Audio information should also be available in text form" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.2.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed; + var thisNode = ruleContext.nodeName.toLowerCase(); + if (thisNode == "bgsound") { + passed = false; + } + else { + passed = !CommonUtil_1.CommonUtil.isAudioObjEmbedLink(ruleContext); + } + if (passed) + return null; // Out of Scope + if (!passed) + return (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/media_autostart_controllable.ts" +/*!******************************************************!*\ + !*** ./src/v4/rules/media_autostart_controllable.ts ***! + \******************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.media_autostart_controllable = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.media_autostart_controllable = { + id: "media_autostart_controllable", + context: "dom:param[name=autoplay], dom:param[name=autostart], dom:embed[flashvars], dom:embed[src], dom:*[autostart=true], dom:*[autostart=1], dom:bgsound", + refactor: { + "RPT_Embed_AutoStart": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "media_autostart_controllable.html", + "Potential_1": "media_autostart_controllable.html", + "group": "media_autostart_controllable.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify there is a mechanism to pause or stop and control the volume for the audio that plays automatically", + "group": "Mechanism must be available to pause or stop and control the volume of the audio that plays automatically" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.4.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + var passed; + if (nodeName == "bgsound") { + passed = false; + } + else if (nodeName == "param") { + var content = ""; + if (ruleContext.hasAttribute("value")) + content = ruleContext.getAttribute("value").toLowerCase(); + passed = content.indexOf("0;") == 0 || + !(content.indexOf("true") != -1 || content.indexOf("1") != -1); + } + else if (nodeName == "embed") { + passed = true; + if (ruleContext.hasAttribute("flashvars")) { + var str = ruleContext.getAttribute("flashvars"); + passed = str.indexOf("autostart=true") == -1 && + str.indexOf("autostart=1") == -1; + } + if (passed && ruleContext.hasAttribute("src")) { + var str = ruleContext.getAttribute("src"); + passed = str.indexOf("autostart=true") == -1 && + str.indexOf("autostart=1") == -1; + } + } + if (passed && ruleContext.hasAttribute("autostart")) { + var val = ruleContext.getAttribute("autostart").toLowerCase(); + passed = val != 'true' && val != '1'; + } + return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/media_keyboard_controllable.ts" +/*!*****************************************************!*\ + !*** ./src/v4/rules/media_keyboard_controllable.ts ***! + \*****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.media_keyboard_controllable = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.media_keyboard_controllable = { + id: "media_keyboard_controllable", + context: "dom:audio, dom:video", + refactor: { + "HAAC_Audio_Video_Trigger": { + "Pass_0": "Pass_0", + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Pass_0": "media_keyboard_controllable.html", + "Manual_1": "media_keyboard_controllable.html", + "group": "media_keyboard_controllable.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Manual_1": "Verify media using <audio> and/or <video> elements have keyboard accessible controls", + "group": "Media using <audio> and/or <video> elements must have keyboard accessible controls" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = true; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (nodeName == "audio" || nodeName === "video") { + passed = false; + } + return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/media_live_captioned.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/media_live_captioned.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.media_live_captioned = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.media_live_captioned = { + id: "media_live_captioned", + context: "dom:embed, dom:object", + refactor: { + "RPT_Media_VideoObjectTrigger": { + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Manual_1": "media_live_captioned.html", + "group": "media_live_captioned.html" + } + }, + messages: { + "en-US": { + "Manual_1": "Verify captions are provided for live media (streaming video with audio)", + "group": "Live media (streaming video with audio) should have captions for audio content" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.2.4"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = !CommonUtil_1.CommonUtil.isVideoObjEmbedLink(ruleContext); + if (passed) + return null; + if (!passed) + return (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/media_track_available.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/media_track_available.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.media_track_available = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.media_track_available = { + id: "media_track_available", + context: "dom:a[href], dom:area[href], dom:applet, dom:embed, dom:object", + refactor: { + "RPT_Media_VideoReferenceTrigger": { + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Manual_1": "media_track_available.html", + "group": "media_track_available.html" + } + }, + messages: { + "en-US": { + "Manual_1": "Verify availability of a user-selectable audio track with description of visual content", + "group": "Pre-recorded media should have an audio track that describes visual information" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.2.3", "1.2.5"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLowerCase(); + var passed = true; + if (nodeName == "applet") { + passed = false; + } + else { + passed = !CommonUtil_1.CommonUtil.isVideoObjEmbedLink(ruleContext); + } + if (passed) + return null; + if (!passed) + return (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/meta_redirect_optional.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/meta_redirect_optional.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.meta_redirect_optional = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +exports.meta_redirect_optional = { + id: "meta_redirect_optional", + context: "dom:meta[http-equiv][content]", + refactor: { + "WCAG20_Meta_RedirectZero": { + "pass": "pass", + "fail": "fail", + "fail_longrefresh": "fail_longrefresh" + } + }, + help: { + "en-US": { + "group": "meta_redirect_optional.html", + "pass": "meta_redirect_optional.html", + "fail": "meta_redirect_optional.html", + "fail_longrefresh": "meta_redirect_optional.html" + } + }, + messages: { + "en-US": { + "group": "Page should not automatically refresh without warning or option to turn it off or adjust the time limit", + "pass": "Rule Passed", + "fail": "Check page does not automatically refresh without warning or options", + "fail_longrefresh": "Check page does not automatically refresh without warning or options" + } + }, + /** + * deprecate WCAG AAA + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.2.4", "3.2.5"], + "level": eRulePolicy.VIOLATION, + "toolkitLevel": eToolkitLevel.LEVEL_THREE + }], + */ + rulesets: [{ + "id": [], + "num": ["2.2.4", "3.2.5"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + // Removed ACT bisz58 AAA + /**act: [{ + "bc659a" : { + "pass": "pass", + "fail": "fail", + "fail_longrefresh": "pass" + } + }],*/ + act: ["bisz58"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (ruleContext.getAttribute("http-equiv").toLowerCase() !== 'refresh') { + return null; + } + var doc = ruleContext.ownerDocument; + if (!doc) + return; + // check if the rule already passed or failed: only the first one tridders if multiple + if (CacheUtil_1.CacheUtil.getCache(doc, "meta_redirect_optional_done", false)) + return null; + var content = ruleContext.getAttribute("content").toLowerCase(); + if (!content || content.trim().length === 0) + return null; + var time = -1; + if (content.match(/^\d+$/)) + time = parseInt(content); + else if (content.match(/^\d+;/)) { + var pos = content.indexOf(";"); + time = parseInt(content.substring(0, pos)); + } + // Invalid content field + if (time === -1) { + return null; + } + CacheUtil_1.CacheUtil.setCache(doc, "meta_redirect_optional_done", true); + if (time === 0) + return (0, IRule_1.RulePass)("pass"); + else if (time < 72001) + return (0, IRule_1.RuleFail)("fail"); + return (0, IRule_1.RuleFail)("fail_longrefresh"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/meta_refresh_delay.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/meta_refresh_delay.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.meta_refresh_delay = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +exports.meta_refresh_delay = { + id: "meta_refresh_delay", + context: "dom:meta[http-equiv][content]", + refactor: { + "RPT_Meta_Refresh": { + "Pass_0": "pass", + "Potential_1": "potential_refresh" + } + }, + help: { + "en-US": { + "group": "meta_refresh_delay.html", + "pass": "meta_refresh_delay.html", + "potential_refresh": "meta_refresh_delay.html" + } + }, + messages: { + "en-US": { + "group": "Pages should not refresh automatically", + "pass": "Pages do not refresh automatically", + "potential_refresh": "Verify page is not being caused to refresh automatically", + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.2.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + //act: [ "bisz58", "bc659a" ], + act: ["bc659a"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (ruleContext.getAttribute("http-equiv").toLowerCase() !== 'refresh') + return null; + var doc = ruleContext.ownerDocument; + if (!doc) + return; + // check if the rule already passed: the first one takes priority + if (CacheUtil_1.CacheUtil.getCache(doc, "meta_refresh_delay_done", false)) + return null; + var content = ruleContext.getAttribute("content").toLowerCase(); + if (!content || content.trim().length === 0) + return null; + var time = -1; + if (content.match(/^\d+$/)) + time = parseInt(content); + else if (content.match(/^\d+;/)) { + var pos = content.indexOf(";"); + time = parseInt(content.substring(0, pos)); + } + // Invalid content field + if (time === -1) { + return null; + } + CacheUtil_1.CacheUtil.setCache(doc, "meta_refresh_delay_done", true); + if (time === 0) + return (0, IRule_1.RulePass)("pass"); + return (0, IRule_1.RulePotential)("potential_refresh"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/meta_viewport_zoomable.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/meta_viewport_zoomable.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.meta_viewport_zoomable = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.meta_viewport_zoomable = { + id: "meta_viewport_zoomable", + context: "dom:meta[name][content]", + refactor: { + "meta_viewport_zoom": { + "Pass_0": "pass", + "Potential_1": "potential_zoomable" + } + }, + help: { + "en-US": { + "group": "meta_viewport_zoomable.html", + "pass": "meta_viewport_zoomable.html", + "potential_zoomable": "meta_viewport_zoomable.html" + } + }, + messages: { + "en-US": { + "group": "The 'meta[name=viewport]' should not prevent the browser zooming the content", + "pass": "The 'meta[name=viewport]' does not prevent the browser zooming the content", + "potential_zoomable": "Confirm the 'meta[name=viewport]' with \"{0}\" can be zoomed by user" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.4.4"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [{ + "b4f0c3": { + "pass": "pass", + "potential_zoomable": "fail" + } + }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (ruleContext.getAttribute("name").toLowerCase() !== 'viewport') + return null; + var content = ruleContext.getAttribute("content").toLowerCase(); + // neither maximum-scale nor user-scalable (default yes) + if (!content || content.trim() === '' || (!content.includes('maximum-scale') && !content.includes('user-scalable'))) + return null; + var user_msg = null; + var max_msg = null; + var props = content.split(","); + var user_scale_value = 'yes'; + var maximum_scale_value = '2.0'; + for (var _i = 0, props_1 = props; _i < props_1.length; _i++) { + var prop = props_1[_i]; + var pieces = prop.trim().split('='); + if (pieces.length < 2) + continue; + if (prop.includes('user-scalable')) { + user_msg = prop; + user_scale_value = pieces[1].trim(); + if (user_scale_value.startsWith("'") || user_scale_value.startsWith('"')) { + user_scale_value = user_scale_value.substring(1, user_scale_value.length - 1); + } + } + else if (prop.includes('maximum-scale')) { + max_msg = prop; + maximum_scale_value = pieces[1].trim(); + if (maximum_scale_value.startsWith("'") || maximum_scale_value.startsWith('"')) { + maximum_scale_value = maximum_scale_value.substring(1, maximum_scale_value.length - 1).trim(); + } + } + } + var value = Number(user_scale_value); + if (!isNaN(value)) { + if (value >= 1 || value <= -1) + user_scale_value = 'yes'; + } + var maximum_scale = 2.0; + value = Number(maximum_scale_value); + if (!isNaN(value)) { + if (value < 0) + maximum_scale = 2.0; + else + maximum_scale = value; + } + else { + if (maximum_scale_value === 'yes') + maximum_scale = 1.0; + else + maximum_scale = 0.1; + } + // user-scalable is not set to 'yes', ignore maximum_scale + if (user_scale_value !== 'yes') { + return (0, IRule_1.RulePotential)("potential_zoomable", [user_msg]); + } + // user-scalable is 'yes', but maximum_scale is too small + if (maximum_scale < 2.0) { + return (0, IRule_1.RulePotential)("potential_zoomable", [max_msg]); + } + return (0, IRule_1.RulePass)("pass"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/noembed_content_exists.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/noembed_content_exists.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.noembed_content_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.noembed_content_exists = { + id: "noembed_content_exists", + context: "dom:noembed", + refactor: { + "Valerie_Noembed_HasContent": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "noembed_content_exists.html", + "Potential_1": "noembed_content_exists.html", + "group": "noembed_content_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Add descriptive text to the <noembed> element", + "group": "<noembed> elements should contain descriptive text" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_FOUR + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = CommonUtil_1.CommonUtil.hasInnerContentHidden(ruleContext); + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/object_text_exists.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/object_text_exists.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.object_text_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +exports.object_text_exists = { + id: "object_text_exists", + context: "dom:object", + refactor: { + "WCAG20_Object_HasText": { + "pass": "pass", + "fail_no_text_alternative": "fail_no_text_alternative" + } + }, + help: { + "en-US": { + "group": "object_text_exists.html", + "pass": "object_text_exists.html", + "fail_no_text_alternative": "object_text_exists.html" + } + }, + messages: { + "en-US": { + "group": "<object> element must have a text alternative for the content rendered by the object", + "pass": "<object> element has a text alternative", + "fail_no_text_alternative": "An <object> element does not have a text alternative" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: "8fc3b6", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // Detect if this object is of type text, by checking the object type in the case it is text then do not trigger this rule + if (ruleContext.hasAttribute("type") && (ruleContext.getAttribute("type")).indexOf("text") !== -1) { + return null; + } + // ignore if an explicit role is specified: including 'presentation', 'none', 'application', 'document' or 'img' + // this case will be covered in other rules + var role = ruleContext.getAttribute("role"); + if (role) { + return null; + } + // Per ACT, ignore embedded HTML files + var data = ruleContext.getAttribute("data"); + var ext = data && typeof data === typeof "" ? data.substring(data.lastIndexOf(".")) : ""; + if (ext === ".html" || ext === ".htm") { + return null; + } + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + var passed = pair && pair.name && pair.name.trim().length > 0; + //let passed = ARIAMapper.computeName(ruleContext).trim().length > 0; + if (passed) { + return (0, IRule_1.RulePass)("pass"); + } + else { + return (0, IRule_1.RuleFail)("fail_no_text_alternative"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/page_title_exists.ts" +/*!*******************************************!*\ + !*** ./src/v4/rules/page_title_exists.ts ***! + \*******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.page_title_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var ancestor_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/ancestor */ "./src/v2/checker/accessibility/util/ancestor.ts"); +exports.page_title_exists = { + id: "page_title_exists", + context: "dom:html", + refactor: { + "WCAG20_Doc_HasTitle": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3" + } + }, + help: { + "en-US": { + "group": "page_title_exists.html", + "Pass_0": "page_title_exists.html", + "Fail_1": "page_title_exists.html", + "Fail_2": "page_title_exists.html", + "Fail_3": "page_title_exists.html" + } + }, + messages: { + "en-US": { + "group": "The page should have a title that correctly identifies the subject of the page", + "Pass_0": "Rule Passed", + "Fail_1": "Missing <head> element so there can be no <title> element present", + "Fail_2": "Missing <title> element in <head> element", + "Fail_3": "The <title> element is empty (no innerHTML)" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [{ + "2779a5": { + "Pass_0": "pass", + "Fail_1": "pass", + "Fail_2": "fail", + "Fail_3": "fail" + } + }], + run: function (context, options, contextHierarchies) { + // This rule does not apply inside a presentational frame + if (ancestor_1.AncestorUtil.isFrame(contextHierarchies)) { + return null; + } + var ruleContext = context["dom"].node; + // First, find the head element + var findHead = ruleContext.firstChild; + var findTitle = null; + while (findHead != null) { + if (findHead.nodeName.toLowerCase() == "head") + break; + findHead = findHead.nextSibling; + } + var possibleTitles = ruleContext.querySelectorAll("title"); + for (var idx = 0; idx < possibleTitles.length; ++idx) { + if (!CommonUtil_1.CommonUtil.getAncestor(possibleTitles[idx], ["svg"])) { + findTitle = possibleTitles[idx]; + break; + } + } + if (findHead === null) { + if (!findTitle) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } + if (findTitle === null) { // don't have title second PoF + return (0, IRule_1.RuleFail)("Fail_2"); + } + // if we get here we have <head> and <title> + if (findTitle != null && CommonUtil_1.CommonUtil.getInnerText(findTitle).trim().length > 0) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { // <title> has no innerHTML third PoF + return (0, IRule_1.RuleFail)("Fail_3"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/page_title_valid.ts" +/*!******************************************!*\ + !*** ./src/v4/rules/page_title_valid.ts ***! + \******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.page_title_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.page_title_valid = { + id: "page_title_valid", + context: "dom:head dom:title", + refactor: { + "RPT_Title_Valid": { + "Pass_0": "Pass_0", + // "Fail_1": "Fail_1", + "Potential_2": "Potential_2" + } + }, + help: { + "en-US": { + "Pass_0": "page_title_valid.html", + // "Fail_1": "page_title_valid.html", + "Potential_2": "page_title_valid.html", + "group": "page_title_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + // "Fail_1": "Page <title> is empty", + "Potential_2": "Verify that using the filename as the page <title> value is descriptive", + "group": "Page <title> should be a descriptive title, rather than a filename" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var titleStr = CommonUtil_1.CommonUtil.getInnerText(ruleContext).trim(); + // allow .com, .net and .org + var titleStrLowercase = titleStr.toLowerCase(); + if (titleStrLowercase.includes(".com") || titleStrLowercase.includes(".net") || titleStrLowercase.includes(".org")) { + return (0, IRule_1.RulePass)("Pass_0", [titleStr]); + } + if (titleStr.length === 0) { + // This is covered by page_title_exists + return null; //RuleFail("Fail_1"); + } + else { + var passed = !/^\S*\.[a-zA-Z]{1,4}(?!.)|^https?:\/\/\S*/i.test(titleStr); + if (!passed) { + return (0, IRule_1.RulePotential)("Potential_2"); + } + else { + return (0, IRule_1.RulePass)("Pass_0", [titleStr]); + } + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/script_focus_blur_review.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/script_focus_blur_review.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.script_focus_blur_review = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.script_focus_blur_review = { + id: "script_focus_blur_review", + context: "dom:*[onfocus]", + refactor: { + "WCAG20_Script_FocusBlurs": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "script_focus_blur_review.html", + "Potential_1": "script_focus_blur_review.html", + "group": "script_focus_blur_review.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify script does not remove focus from content that normally receives focus", + "group": "Scripting must not remove focus from content that normally receives focus" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1", "2.4.7", "3.2.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = ruleContext.getAttribute("onfocus").indexOf(".blur(") == -1; + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/script_onclick_avoid.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/script_onclick_avoid.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.script_onclick_avoid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.script_onclick_avoid = { + id: "script_onclick_avoid", + context: "dom:*[onclick]", + dependencies: ["script_onclick_misuse"], + refactor: { + "RPT_Script_OnclickHTML2": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "script_onclick_avoid.html", + "Potential_1": "script_onclick_avoid.html", + "group": "script_onclick_avoid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that 'onclick' events are not used in script to emulate a link", + "group": "Scripts should not be used to emulate links" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_FOUR + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Don't trigger this for SVG element for now until a determination is made (by Rich) + // to support SVG at a point when the SVG a11y spec is ready. + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, "svg")) { + return (0, IRule_1.RulePass)("Pass_0"); + } + // If there's an aria-role specified, don't trigger this. + if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "role")) + return (0, IRule_1.RulePass)("Pass_0"); + var nodeName = ruleContext.nodeName.toLowerCase(); + var passed = nodeName == "a" || nodeName == "area" || nodeName == "input"; + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/script_onclick_misuse.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/script_onclick_misuse.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.script_onclick_misuse = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.script_onclick_misuse = { + id: "script_onclick_misuse", + context: "dom:*[onclick]", + refactor: { + "RPT_Script_OnclickHTML1": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "script_onclick_misuse.html", + "Potential_1": "script_onclick_misuse.html", + "group": "script_onclick_misuse.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Possible use of a script to emulate a link", + "group": "Scripts should not be used to emulate links" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + failSubstring: { + value: [".asp", ".aspx", ".cfm", ".cfml", ".cgi", ".htm", ".html", ".shtm", + ".shtml", ".php", ".pl", ".py", ".shtm", ".shtml", ".xhtml", + "location.href"], + type: "[string]" + } + }; + var ruleContext = context["dom"].node; + // If there's an aria-role specified, don't trigger this. + var passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "role"); + // If this is an a or area, don't trigger if there's an href. + var nodeName = ruleContext.nodeName.toLowerCase(); + passed = passed || ((nodeName == "a" || nodeName == "area") && CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "href")); + // If the guards failed, check to see if they're looking at links + if (!passed) { + var failSubstring = validateParams.failSubstring.value; + ; + var onclick_1 = ruleContext.getAttribute("onclick").toLowerCase(); + passed = true; + for (var i = 0; passed && i < failSubstring.length; ++i) { + passed = onclick_1.indexOf(failSubstring[i]) == -1; + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/script_select_review.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/script_select_review.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.script_select_review = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.script_select_review = { + id: "script_select_review", + context: "dom:select", + refactor: { + "WCAG20_Select_NoChangeAction": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "script_select_review.html", + "Potential_1": "script_select_review.html", + "group": "script_select_review.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that no change of context or action occurs when selection options in this component receive focus", + "group": "No changes of context should occur when a selection value receives focus" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.2.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = !ruleContext.hasAttribute("onchange") && !ruleContext.hasAttribute("onfocus"); + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/select_options_grouped.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/select_options_grouped.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.select_options_grouped = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.select_options_grouped = { + id: "select_options_grouped", + context: "dom:select", + refactor: { + "WCAG20_Select_HasOptGroup": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "select_options_grouped.html", + "Potential_1": "select_options_grouped.html", + "group": "select_options_grouped.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Group of related options may need <optgroup>", + "group": "Groups of related options within a selection list should be grouped with <optgroup>" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + paramNumOptions: { + value: 10, + type: "integer" + } + }; + var ruleContext = context["dom"].node; + // Handle the cases where optgroup is hidden, which should trigger a violations + // but in the case that Check hidden option is set then should not trigger a violation. + var passed = CommonUtil_1.CommonUtil.getChildByTagHidden(ruleContext, "optgroup", false, true).length > 0 || + CommonUtil_1.CommonUtil.getChildByTagHidden(ruleContext, "option", false, true).length <= + validateParams.paramNumOptions.value; + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/skip_main_described.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/skip_main_described.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.skip_main_described = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.skip_main_described = { + id: "skip_main_described", + context: "dom:body", + dependencies: ["skip_main_exists"], + refactor: { + "WCAG20_Body_FirstAContainsSkipText_Native_Host_Sematics": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "skip_main_described.html", + "Potential_1": "skip_main_described.html", + "group": "skip_main_described.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that if this hyperlink skips content, the description communicates where it links to", + "group": "The description of a hyperlink used to skip content must communicate where it links to" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + paramSkipText: { + value: ["skip", "jump"], + type: "[string]" + } + }; + var ruleContext = context["dom"].node; + // Get the anchors on the page + var doc = ruleContext.ownerDocument; + // Check for landmarks first + var passed; + if (CacheUtil_1.CacheUtil.getCache(ruleContext, "IBM_hasLandmarks_Implicit", null) === null) { + CacheUtil_1.CacheUtil.setCache(ruleContext, "IBM_hasLandmarks_Implicit", CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, ["application", "banner", "complementary", "contentinfo", + "form", "main", "navigation", "search" + ], true, true).length > 0); + } + passed = CacheUtil_1.CacheUtil.getCache(ruleContext, "IBM_hasLandmarks_Implicit", false); + if (!passed) { // No landmarks, check for skip links + var links = doc.links; + // Skip link should be the first one on the page with an href attribute (i.e., links[0]) + // also if the first link is hidden then we should also trigger a violation. + if (links && links.length > 0 && VisUtil_1.VisUtil.isNodeVisible(links[0])) { + var testText = CommonUtil_1.CommonUtil.getInnerText(doc.links[0]).toLowerCase(); + for (var i = 0; !passed && i < validateParams.paramSkipText.value.length; ++i) { + passed = testText.indexOf(validateParams.paramSkipText.value[i]) != -1; + } + } + else + passed = false; + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/skip_main_exists.ts" +/*!******************************************!*\ + !*** ./src/v4/rules/skip_main_exists.ts ***! + \******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.skip_main_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var ancestor_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/ancestor */ "./src/v2/checker/accessibility/util/ancestor.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.skip_main_exists = { + id: "skip_main_exists", + context: "dom:body", + refactor: { + "WCAG20_Body_FirstASkips_Native_Host_Sematics": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "skip_main_exists.html", + "Fail_1": "skip_main_exists.html", + "group": "skip_main_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The page does not provide a way to quickly navigate to the main content (ARIA \"main\" landmark or a skip link)", + "group": "Pages must provide a way to skip directly to the main content" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + // This rule does not apply inside a presentational frame + if (ancestor_1.AncestorUtil.isPresentationFrame(contextHierarchies)) { + return null; + } + var ruleContext = context["dom"].node; + // Get the anchors on the page + var doc = ruleContext.ownerDocument; + // Check for landmarks first + var passed; + if (CacheUtil_1.CacheUtil.getCache(ruleContext, "IBM_hasLandmarks_Implicit", null) === null) { + CacheUtil_1.CacheUtil.setCache(ruleContext, "IBM_hasLandmarks_Implicit", CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, ["application", "banner", "complementary", "contentinfo", + "form", "main", "navigation", "search" + ], true, true).length > 0); + } + passed = CacheUtil_1.CacheUtil.getCache(ruleContext, "IBM_hasLandmarks_Implicit", false); + if (!passed) { // No landmarks, check for skip links + var anchors = CommonUtil_1.CommonUtil.getDocElementsByTag(ruleContext, "a"); + // Skip anchor should be the first one on the page with an href attribute + var testAnchor = null; + for (var i = 0; i < anchors.length; ++i) { + if (anchors[i].hasAttribute("href") && VisUtil_1.VisUtil.isNodeVisible(anchors[i])) { + testAnchor = anchors[i]; + break; + } + } + // Pull out the target id + var targetId = null; + if (testAnchor != null) { + var hrefStr = testAnchor.getAttribute("href"); + var idx = hrefStr.indexOf("#"); + if (idx != -1) { + targetId = hrefStr.substring(idx + 1); + } + } + // Determine if there is an element id or named anchor on the page with this + // target id. + if (targetId != null) { + passed = doc.getElementById(targetId) != null; + for (var i = 0; !passed && i < anchors.length; ++i) { + if (!anchors[i].hasAttribute("href") && + anchors[i].hasAttribute("name") && + anchors[i].getAttribute("name") == targetId) { + passed = true; + } + } + } + } + //return new ValidationResult(passed, [ruleContext], '', '', []); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/style_background_decorative.ts" +/*!*****************************************************!*\ + !*** ./src/v4/rules/style_background_decorative.ts ***! + \*****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.style_background_decorative = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.style_background_decorative = { + id: "style_background_decorative", + context: "dom:style, dom:*[style]", + refactor: { + "RPT_Style_BackgroundImage": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "style_background_decorative.html", + "Potential_1": "style_background_decorative.html", + "group": "style_background_decorative.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify the CSS background image does not convey important information", + "group": "Images included by using CSS alone must not convey important information" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + var passed = true; + if (nodeName === "link" && ruleContext.hasAttribute("rel") && + ruleContext.getAttribute("rel").toLowerCase() === "stylesheet") { + // External stylesheet - trigger + passed = CommonUtil_1.CommonUtil.triggerOnce(ruleContext, "style_background_decorative", false); + } + if (passed && nodeName === "style" || ruleContext.hasAttribute("style")) { + var styleText = void 0; + if (nodeName === "style") + styleText = CommonUtil_1.CommonUtil.getInnerText(ruleContext); + else + styleText = ruleContext.getAttribute("style"); + var bgMatches = styleText.match(/background:[^;]*/g); + if (bgMatches !== null) { + for (var i = 0; passed && i < bgMatches.length; ++i) + passed = bgMatches[i].indexOf("url(") === -1; + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/style_before_after_review.ts" +/*!***************************************************!*\ + !*** ./src/v4/rules/style_before_after_review.ts ***! + \***************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.style_before_after_review = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CSSUtil_1 = __webpack_require__(/*! ../util/CSSUtil */ "./src/v4/util/CSSUtil.ts"); +/** + * Description: Trigger if :before and :after are used in CSS (Internal and External) with content + * Origin: WCAG 2.0 F87 + */ +exports.style_before_after_review = { + id: "style_before_after_review", + context: "dom:style, dom:link", + refactor: { + "WCAG20_Style_BeforeAfter": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "group": "style_before_after_review.html", + "Pass_0": "style_before_after_review.html", + "Potential_1": "style_before_after_review.html" + } + }, + messages: { + "en-US": { + "group": "Do not use CSS '::before' and '::after' pseudo-elements to insert non-decorative content", + "Pass_0": "Rule Passed", + "Potential_1": "Verify the '::before' and '::after' pseudo-elements do not insert non-decorative content" + } + }, + rulesets: [{ + // Turn off the rule due to the obsolete requirement + //id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + id: [], + num: "1.3.1", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = true; + //check Internal styles + if (ruleContext.nodeName.toLowerCase() === "style") { + var css = CSSUtil_1.CSSUtil.getCSSStyle(ruleContext); + for (var i = 0; passed && i < css.length; ++i) { + // Guard against bad CSS + if (css[i].selector) { + passed = (css[i].selector.indexOf(":before") === -1 && css[i].selector.indexOf(":after") === -1) || + !("content" in css[i].values) || css[i].values["content"].trim().length === 0 || css[i].values["content"].trim() === "\"\"" + || css[i].values["content"].trim() === "\'\'" || css[i].values["content"].trim() === "none" || css[i].values["content"].trim() === "attr(x)" + || css[i].values["content"].trim() === "attr(y)"; + } + } + // check special rules in the stylesheets + if (passed) { + for (var sIndex = 0; sIndex < ruleContext.ownerDocument.styleSheets.length; sIndex++) { + var sheet = ruleContext.ownerDocument.styleSheets[sIndex]; + if (sheet.ownerNode === ruleContext) { + try { + var styleRules = sheet.cssRules ? sheet.cssRules : sheet.rules; + if (styleRules) { + for (var styleRuleIndex = 0; passed && styleRuleIndex < styleRules.length; styleRuleIndex++) { + var styleRule = styleRules[styleRuleIndex]; + // check @media rules + // + // The check 'if (styleRule instanceof CSSMediaRule)' doesn't work when run in Karma(but works in DAP) + // so let's access the type directly as a workaround + var styleImportRule = void 0; + if (styleRule.type && styleRule.type === 4 /* CSSRule.MEDIA_RULE */) { + var styleMediaRule = styleRule; + var mediaRules = styleMediaRule.cssRules; + if (mediaRules) { + for (var rIndex = 0; passed && rIndex < mediaRules.length; rIndex++) { + var mRule = mediaRules[rIndex]; // selectorText not recognized + if (mRule.selectorText !== null && mRule.selectorText !== undefined) { + var rule = mRule.selectorText.toLowerCase(); + if (rule.indexOf(":before") !== -1 || rule.indexOf(":after") !== -1) { + var content = mRule.style['content']; + if (content && content.trim().length) { + if (content.trim() !== "\"\"" && + content.trim() !== "\'\'" && + content.trim() !== "none" && + content.trim() !== "attr(x)" && + content.trim() !== "attr(y)") { + passed = false; + } + } + } + } + } + } + } + // check import rules + else if (styleRule.type && styleRule.type === 3 /* CSSRule.IMPORT_RULE */ && (styleImportRule = styleRule).styleSheet) { + var rules = styleImportRule.styleSheet.cssRules ? + styleImportRule.styleSheet.cssRules : + styleImportRule.styleSheet.rules; + if (rules) { + for (var rIndex = 0; passed && rIndex < rules.length; rIndex++) { + var importedRule = rules[rIndex]; + // check @media rules + if (importedRule.type && importedRule.type === 4 /* CSSRule.MEDIA_RULE */) { + var mediaRules = importedRule.cssRules; + if (mediaRules) { + for (var mIndex = 0; mIndex < mediaRules.length; mIndex++) { + var mRule = mediaRules[mIndex]; // selectorText not recognized + if (mRule.selectorText !== null && mRule.selectorText !== undefined) { + var rule = mRule.selectorText.toLowerCase(); + if (rule.indexOf(":before") !== -1 || rule.indexOf(":after") !== -1) { + var content = mRule.style['content']; + if (content && content.trim().length) { + if (content.trim() !== "\"\"" && + content.trim() !== "\'\'" && + content.trim() !== "none" && + content.trim() !== "attr(x)" && + content.trim() !== "attr(y)") { + passed = false; + } + } + } + } + } + } + } + else if (importedRule.selectorText !== null && importedRule.selectorText !== undefined) { + var rule = importedRule.selectorText.toLowerCase(); + //support both single colon (:) and double colon (::) pseudo + if (rule.indexOf(":before") !== -1 || rule.indexOf(":after") !== -1) { + var content = importedRule.style['content']; + if (content && content.trim().length) { + if (content.trim() !== "\"\"" && + content.trim() !== "\'\'" && + content.trim() !== "none" && + content.trim() !== "attr(x)" && + content.trim() !== "attr(y)") { + passed = false; + } + } + } + } + } + } + } + } + } + } + catch (e) { + // Ignore css access issues + } + } + } + } + } + //check external styles + if (ruleContext.nodeName.toLowerCase() === "link" && ruleContext.hasAttribute("rel") && + ruleContext.getAttribute("rel").toLowerCase() === "stylesheet" && + ruleContext.hasAttribute("href") && ruleContext.getAttribute("href").trim().length !== 0) { + for (var sIndex = 0; sIndex < ruleContext.ownerDocument.styleSheets.length; sIndex++) { + var sheet = ruleContext.ownerDocument.styleSheets[sIndex]; + if (sheet && sheet.ownerNode === ruleContext) { + try { + var rules = sheet.cssRules ? sheet.cssRules : sheet.rules; + if (rules) { + for (var rIndex = 0; passed && rIndex < rules.length; rIndex++) { + var ruleFromLink = rules[rIndex]; + // check @media rules + if (ruleFromLink.type && ruleFromLink.type === 4 /* CSSRule.MEDIA_RULE */) { + var mediaRules = ruleFromLink.cssRules; + if (mediaRules) { + for (var mIndex = 0; passed && mIndex < mediaRules.length; mIndex++) { + var mRule = mediaRules[mIndex]; + if (mRule.selectorText !== null && mRule.selectorText !== undefined) { + var ruleSelTxt = mRule.selectorText.toLowerCase(); + if (ruleSelTxt.indexOf(":before") !== -1 || ruleSelTxt.indexOf(":after") !== -1) { + var content = mRule.style['content']; + if (content && content.trim().length) { + if (content.trim() !== "\"\"" && + content.trim() !== "\'\'" && + content.trim() !== "none" && + content.trim() !== "attr(x)" && + content.trim() !== "attr(y)") { + passed = false; + } + } + } + } + } + } + } + else if (rules[rIndex].selectorText !== null && rules[rIndex].selectorText !== undefined) { + var rule = rules[rIndex].selectorText.toLowerCase(); + //support both single colon (:) and double colon (::) pseudo + if (rule.indexOf(":before") !== -1 || rule.indexOf(":after") !== -1) { + var content = rules[rIndex].style['content']; + if (content && content.trim().length) { + if (content.trim() !== "\"\"" && + content.trim() !== "\'\'" && + content.trim() !== "none" && + content.trim() !== "attr(x)" && + content.trim() !== "attr(y)") { + passed = false; + } + } + } + } + } + } + } + catch (e) { + // Ignore css access issues + } + } + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/style_color_misuse.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/style_color_misuse.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.style_color_misuse = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +exports.style_color_misuse = { + id: "style_color_misuse", + context: "dom:style, dom:*[style], dom:font[color], dom:link", + refactor: { + "RPT_Style_ColorSemantics1": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "group": "style_color_misuse.html", + "Pass_0": "style_color_misuse.html", + "Potential_1": "style_color_misuse.html" + } + }, + messages: { + "en-US": { + "group": "Combine color and descriptive markup to convey information", + "Pass_0": "Rule Passed", + "Potential_1": "Verify color is not used as the only visual means of conveying information" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "1.4.1", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + var styleText = ""; + if (nodeName === "style") { + styleText = CommonUtil_1.CommonUtil.getInnerText(ruleContext).toLowerCase(); + // check import + for (var sIndex = 0; sIndex < ruleContext.ownerDocument.styleSheets.length; sIndex++) { + var sheet = ruleContext.ownerDocument.styleSheets[sIndex]; + if (sheet && sheet.ownerNode === ruleContext) { + try { + var styleRules = sheet.cssRules ? sheet.cssRules : sheet.rules; + for (var styleRuleIndex = 0; styleRuleIndex < styleRules.length; styleRuleIndex++) { + var styleRule = styleRules[styleRuleIndex]; + var styleImportRule = void 0; + if (styleRule.type && styleRule.type === 3 /* CSSRule.IMPORT_RULE */ && (styleImportRule = styleRule).styleSheet) { + var importRules = styleImportRule.styleSheet.cssRules ? styleImportRule.styleSheet.cssRules : styleImportRule.styleSheet.rules; + for (var rIndex = 0; rIndex < importRules.length; rIndex++) { + var iRule = importRules[rIndex]; + styleText += iRule.cssText; + } + } + } + } + catch (e) { + // Silence css access issues + } + } + } + } + else if (ruleContext.hasAttribute("style")) { + styleText = ruleContext.getAttribute("style").toLowerCase(); + } + else if (nodeName === "link" && //check external styles + ruleContext.hasAttribute("rel") && + ruleContext.getAttribute("rel").toLowerCase() === "stylesheet" && + ruleContext.hasAttribute("href") && + ruleContext.getAttribute("href").trim().length !== 0) { + for (var sIndex = 0; sIndex < ruleContext.ownerDocument.styleSheets.length; sIndex++) { + var sheet = ruleContext.ownerDocument.styleSheets[sIndex]; + if (sheet && sheet.ownerNode === ruleContext) { + try { + var rules = sheet.cssRules ? sheet.cssRules : sheet.rules; + for (var rIndex = 0; rIndex < rules.length; rIndex++) { + styleText += rules[rIndex].cssText; + } + } + catch (e) { + // Silence css access issues + } + } + } + } + var passed = true; + // Defect 1022: Find uses of 'color' and '*background*' only + var isBgUsed = styleText.match(/\bbackground\b/i); + var theColorStyleToCheck = styleText.replace(/-color/g, ""); + var isColorUsed = theColorStyleToCheck.match(/\bcolor\b/i); + if (ruleContext.hasAttribute("color") || isColorUsed || isBgUsed) { + var goodTagNames = { + "em": "", "strong": "", "cite": "", "dfn": "", + "code": "", "samp": "", "kbd": "", "var": "", "abbr": "", "acronym": "" + }; + // Color used � are there semantics involved? + passed = nodeName in goodTagNames || + CommonUtil_1.CommonUtil.getAncestor(ruleContext, goodTagNames) !== null; + if (!passed && ruleContext.hasChildNodes()) { + var nw = new DOMWalker_1.DOMWalker(ruleContext); + while (!passed && nw.nextNode() && nw.node !== ruleContext) { + passed = nw.node.nodeName.toLowerCase() in goodTagNames; + } + } + } + // Trigger only once + if (!passed) { + var triggered = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "style_color_misuse", false); + passed = triggered; + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "style_color_misuse", true); + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/style_focus_visible.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/style_focus_visible.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.style_focus_visible = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CSSUtil_1 = __webpack_require__(/*! ../util/CSSUtil */ "./src/v4/util/CSSUtil.ts"); +var ColorUtil_1 = __webpack_require__(/*! ../util/ColorUtil */ "./src/v4/util/ColorUtil.ts"); +exports.style_focus_visible = { + id: "style_focus_visible", + context: "dom:*", + refactor: { + "RPT_Style_HinderFocus1": { + "Potential_1": "potential_focus_not_visible" + } + }, + help: { + "en-US": { + "group": "style_focus_visible.html", + "potential_focus_not_visible": "style_focus_visible.html", + "pass_focus_visible": "style_focus_visible.html" + } + }, + messages: { + "en-US": { + "group": "The keyboard focus indicator should be visible when default border or outline is modified by CSS", + "potential_focus_not_visible": "Check the keyboard focus indicator is visible when using CSS declaration for 'border' or 'outline'", + "pass_focus_visible": "The keyboard focus indicator is visible or is not changed from the browser default" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "2.4.7", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + skipNodes: { + value: ["table"], + type: "[string]" + }, + checkParams: { + value: ["border", "border-width", "border-style", + "border-top-width", "border-right-width", "border-bottom-width", "border-left-width", + "border-top-color", "border-right-color", "border-bottom-color", "border-left-color", + "border-top-style", "border-right-style", "border-bottom-style", "border-left-style", + "outline", "outline-width", "outline-color", "outline-style"], + type: "[string]" + } + }; + var ruleContext = context["dom"].node; + if (!CommonUtil_1.CommonUtil.isTabbable(ruleContext) || validateParams.skipNodes.value.includes(ruleContext.nodeName.toLowerCase())) { + return null; + } + // Get all styles in a single pass through stylesheets + var allStyles = CSSUtil_1.CSSUtil.getDefinedStylesMultiple(ruleContext, null, ["", ":focus", ":focus-visible", ":focus-within"]); + var normalStyles = allStyles[""]; // consider both user-defined and browser default + var focusStyles = []; + focusStyles.push(allStyles[":focus"]); + focusStyles.push(allStyles[":focus-visible"]); + focusStyles.push(allStyles[":focus-within"]); + // if focus style is defined + var styleObj = focusStyles[0]; + if (Object.keys(styleObj).length > 0) { + //pass if outline is not defined at all, browser will override + if (((!normalStyles["outline-width"] && !normalStyles["outline-style"]) + || (normalStyles["outline-width"] === '0px' || normalStyles["outline-style"] === 'none')) + && (!styleObj["outline-style"] || styleObj["outline-style"] !== 'none')) + return (0, IRule_1.RulePass)("pass_focus_visible"); + var noneStyle = false; + var numOtherStyle = 0; + for (var focusStyle in styleObj) { + if (validateParams.checkParams.value.includes(focusStyle)) { + /** + * failure case: + * 1. focus outline or border style is none and no other style (color or width) defined + * 2. focus outline or border style is same with the normal + * 3. size in focus is same or smaller than default + * 4. color contrast in focus is better + */ + var focusStyleValue = styleObj[focusStyle]; + var normalStyleValue = normalStyles[focusStyle]; + if (focusStyle.includes("style")) { + if (focusStyleValue === "none") + noneStyle = true; + else + noneStyle = false; + if (normalStyleValue && focusStyleValue !== "none" && focusStyleValue === normalStyleValue) + return (0, IRule_1.RulePotential)("potential_focus_not_visible"); + } + else if (focusStyle.includes("width")) { + numOtherStyle++; + //proximation of the width style + if (focusStyleValue === 'initial') + focusStyleValue = '2px'; + else if (focusStyleValue === 'thin') + focusStyleValue = '1px'; + else if (focusStyleValue === 'medium') + focusStyleValue = '2px'; + else if (focusStyleValue === 'thick') + focusStyleValue = '3px'; + if (normalStyleValue) { + if (normalStyleValue === 'initial') + normalStyleValue = '2px'; + else if (normalStyleValue === 'thin') + normalStyleValue = '1px'; + else if (normalStyleValue === 'medium') + normalStyleValue = '2px'; + else if (normalStyleValue === 'thick') + normalStyleValue = '3px'; + } + focusStyleValue = CSSUtil_1.CSSUtil.getPixelsFromStyle(focusStyleValue, ruleContext); + normalStyleValue = CSSUtil_1.CSSUtil.getPixelsFromStyle(normalStyleValue, ruleContext); + if (focusStyleValue == 0 || focusStyleValue <= normalStyleValue) + return (0, IRule_1.RulePotential)("potential_focus_not_visible"); + } + else if (focusStyle.includes("color")) { + numOtherStyle++; + // get the element bg color + var colorCombo = ColorUtil_1.ColorUtil.ColorCombo(ruleContext); + if (colorCombo === null) + continue; + var bg = colorCombo.bg; + if (!bg) + continue; + //proximation of the width style + if (focusStyleValue === 'initial') + focusStyleValue = 'black'; + if (normalStyleValue && normalStyleValue === 'initial') + normalStyleValue = 'black'; + // get the border/outline color as fg colors + focusStyleValue = ColorUtil_1.ColorUtil.Color(focusStyleValue); + normalStyleValue = ColorUtil_1.ColorUtil.Color(normalStyleValue); + if (focusStyleValue === null || normalStyleValue === null) + continue; + //get the border/outline color contrast ratios + var focusRatio = focusStyleValue.contrastRatio(bg); + var normalRatio = normalStyleValue.contrastRatio(bg); + if (focusRatio < 3.0 || focusRatio <= normalRatio) + return (0, IRule_1.RulePotential)("potential_focus_not_visible"); + } + else { + //other + numOtherStyle++; + if (normalStyleValue != null && focusStyleValue === normalStyleValue) + return (0, IRule_1.RulePotential)("potential_focus_not_visible"); + } + } + } + // warn if a border/outline focus style is 'none' and noe other (color and/or width) is defined + if (noneStyle && numOtherStyle === 0) + return (0, IRule_1.RulePotential)("potential_focus_not_visible"); + } + else { + // no focus style defined + // warn if normal style is defined and is not "none" + for (var normalStyle in normalStyles) { + if (validateParams.checkParams.value.includes(normalStyle)) { + var normalStyleValue = normalStyles[normalStyle]; + // ignore if border or outline style is "none" + if (normalStyleValue !== 'none') + return (0, IRule_1.RulePotential)("potential_focus_not_visible"); + } + } + } + return (0, IRule_1.RulePass)("pass_focus_visible"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/style_highcontrast_visible.ts" +/*!****************************************************!*\ + !*** ./src/v4/rules/style_highcontrast_visible.ts ***! + \****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.style_highcontrast_visible = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +exports.style_highcontrast_visible = { + id: "style_highcontrast_visible", + context: "dom:style, dom:link, dom:*[style]", + refactor: { + "RPT_Style_Trigger2": { + "Pass_0": "Pass_0", + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Pass_0": "style_highcontrast_visible.html", + "Manual_1": "style_highcontrast_visible.html", + "group": "style_highcontrast_visible.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Manual_1": "Confirm Windows high contrast mode is supported when using CSS to include, position or alter non-decorative content", + "group": "Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["1.1.1", "1.3.2", "1.4.11"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }, + { + "id": ["WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1", "1.3.2", "1.4.11"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (nodeName === "link" && + (!ruleContext.hasAttribute("rel") || ruleContext.getAttribute("rel").toLowerCase() !== "stylesheet")) + return (0, IRule_1.RulePass)("Pass_0"); + if (nodeName !== "style" && nodeName !== "link" && + ruleContext.hasAttribute("style") && ruleContext.getAttribute("style").trim().length === 0) + return (0, IRule_1.RulePass)("Pass_0"); + var triggered = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "style_highcontrast_visible", false); + var passed = triggered; + // Packages.java.lang.System.out.println(triggered); + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "style_highcontrast_visible", true); + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/style_hover_persistent.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/style_hover_persistent.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.style_hover_persistent = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.style_hover_persistent = { + id: "style_hover_persistent", + context: "dom:style, dom:*[style], dom:*", + help: { + "en-US": { + "Pass_0": "style_hover_persistent.html", + // "Pass_1": "style_hover_persistent.html", + "Pass_2": "style_hover_persistent.html", + "Potential_1": "style_hover_persistent.html", + "Potential_2": "style_hover_persistent.html", + "Potential_3": "style_hover_persistent.html", + "group": "style_hover_persistent.html" + } + }, + messages: { + "en-US": { + "Pass_0": "the hover: pseudo-class is not used to display content", + // "Pass_1": "content displayed via the :hover pseudo-class is a direct child of the trigger element", + "Pass_2": "content displayed via the :hover pseudo-class is the adjacent sibling of the trigger element", + "Potential_1": "Confirm the pointer can be positioned over the displayed element, not just the trigger", + "Potential_2": "Confirm the pointer can be positioned over all the information displayed on hover", + "Potential_3": "Confirm the margin style attribute has not prevented the pointer from hovering over the displayed element, not just the trigger", + "group": "The pointer should be able to move over content displayed on hover" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_2"], + "num": ["1.4.13"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var pass0 = false; + var pass1 = false; + var pass2 = false; // never happen + var potential1 = false; + var potential2 = false; + var potential3 = false; + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + var styleText = ""; + if (nodeName === "style") { + // console.log("RULE RUN ******************"); + styleText = CommonUtil_1.CommonUtil.getInnerText(ruleContext).toLowerCase(); + // check import + // console.log("ruleContext.ownerDocument.styleSheets.length = "+ruleContext.ownerDocument.styleSheets.length); + for (var sIndex = 0; sIndex < ruleContext.ownerDocument.styleSheets.length; ++sIndex) { + var sheet = ruleContext.ownerDocument.styleSheets[sIndex]; + if (sheet && sheet.ownerNode === ruleContext) { + try { + var styleRules = sheet.cssRules ? sheet.cssRules : sheet.rules; + // console.log("styleRules.length = "+styleRules.length); + for (var styleRuleIndex = 0; styleRuleIndex < styleRules.length; styleRuleIndex++) { + // console.log("**********"); + // console.log("********** FOR LOOP styleRuleIndex = "+styleRuleIndex); + var foundHover = false; + var hoverElement = ""; + var plusCombinator = false; + var tildeCombinator = false; + var afterCombinatorElement = ""; + var afterCombinatorElementDisplay = false; + var afterCombinatorElementDisplayValue = false; + var afterCombinatorElementHover = false; + var supportingElement = false; + var supportingHover = false; + var supportingHoverElementDisplayProperty = false; + var supportingHoverElementDisplayValue = false; + var adjacentPlusSibling = false; + var adjacentTildeMultipleSibling = false; + var styleRule = styleRules[styleRuleIndex]; + var ruleText = styleRules[styleRuleIndex].cssText; + // console.log("styleRules["+styleRuleIndex+"] = "+ruleText); + // 1. Check for :hover + if (ruleText.match(/:hover/g)) { + foundHover = true; + // console.log("1. found :hover = "+ foundHover); + // 2. Get hover element + hoverElement = ruleText.split(":")[0]; + // console.log("2. found element that goes with :hover = "+hoverElement); + } + else { + // console.log("1. No hover on css element so skip this rule"); + continue; // if no :hover skip this rule + } + // 3a. Check for css combinator + + // 4a. if so do we have an after combinator element + var plusTempStr = ruleText.substring(ruleText.indexOf("+") + 1); + plusTempStr = plusTempStr.trim(); + if (ruleText.match(/:hover \+/g) || ruleText.match(/:hover\+/g)) { + plusCombinator = true; + // console.log("3a. Found plusCombinator = "+ plusCombinator); + afterCombinatorElement = plusTempStr.split(" ")[0]; + // console.log("4a. Found plus afterCombinatorElement = "+afterCombinatorElement); + } + // 3b. Check for css combinator + + // 4b. if so do we have an after combinator element + if (ruleText.match(/:hover \~/g) || ruleText.match(/:hover\~/g)) { + // console.log("match = "+ruleText.match(":hover \~")); + tildeCombinator = true; + // console.log("3b. Found tildeCombinator = "+ tildeCombinator); + var plusTempStr_1 = ruleText.substring(ruleText.indexOf("~") + 1); + plusTempStr_1 = plusTempStr_1.trim(); + afterCombinatorElement = plusTempStr_1.split(" ")[0]; + // console.log("4b. Found tilde afterCombinatorElement = "+afterCombinatorElement); + } + if (!plusCombinator && !tildeCombinator) { + // NO plusCombinator or tildeCombinator so skip this rule + // console.log("NO plusCombinator or tildeCombinator so PASS"); + // console.log("**** REPORT PASS 0 HERE"); + return (0, IRule_1.RulePass)("Pass_0"); // JCH: should we have a N/A pass + } + // So now we have a css element with hover - element:hover so we have problems + // to check + // 5. Check if the after combinator element has display: property + // 6. Check if display property is not none + if (afterCombinatorElement) { + // get index of display: + // console.log("plusTempStr = "+plusTempStr); + var index = plusTempStr.indexOf("display:"); + if (index) { + afterCombinatorElementDisplay = true; + // console.log("5. Found afterCombinatorElementDisplay = "+afterCombinatorElementDisplay); + if (plusTempStr.slice(index + 8).trim().split(" ")[0] !== "none;") { + afterCombinatorElementDisplayValue = true; + // console.log("6. Found afterCombinatorElementDisplayValue not none = "+afterCombinatorElementDisplayValue); + } + else { + // console.log("afterCombinatorElementDisplayValue === none"); + // console.log("**** PUT POTENTIAL 0 HERE"); + continue; + } + } + else { + // this is bad css so it won't happen + // console.log("NO afterCombinatorElementDisplay so skip this rule"); + continue; + } + } + else { + // this is bad css so it won't happen + // console.log("NO afterCombinatorElement so skip this rule"); + continue; + } + if (afterCombinatorElementDisplayValue) + if (sheet && sheet.ownerNode === ruleContext) { + // console.log("**** At this point we have verified that we have a css element with a hover of the format span:hover + div { display: block; } with all the proper properties and values"); + // NOTE: At this point we have verified that we have a css element with a hover + // of the format span:hover + div { display: block; } + // with all the proper properties and values + try { + var styleRules2 = sheet.cssRules ? sheet.cssRules : sheet.rules; + // console.log("styleRules2.length = "+styleRules2.length); + for (var styleRuleIndex2 = 0; styleRuleIndex2 < styleRules2.length; styleRuleIndex2++) { + // Check rule for afterCominatorElement:hover + // If find afterCombinatorElement:hover see if rule has property display: value where + // value != none + // console.log("**********"); + // console.log("********** 2nd FOR styleRuleIndex2 = "+styleRuleIndex2); + var ruleText2 = styleRules[styleRuleIndex2].cssText; + // console.log("ruleText2 = ", ruleText2); + // console.log("afterCombinatorElement = "+afterCombinatorElement); + // Check all supporting elements for margin property + // If find margin STOP and REPORT ERROR + var regExString = afterCombinatorElement + " {"; + var trimRuleText2 = ruleText2.trim(); + var regIndex = trimRuleText2.indexOf(regExString); + var afterCombinatorElementProperties = trimRuleText2.slice(regIndex).trim(); + //if (!afterCombinatorElementProperties.match(/margin/g)) { + if (!trimRuleText2.match(/margin/g)) { + // console.log("No margin problem so continue on..."); + // do we have a supporting element css definitions + var supportingHoverElement = ruleText2.split(":")[0]; + supportingHoverElement = supportingHoverElement.split(" ")[0]; + // console.log("supportingHoverElement = "+supportingHoverElement); + // console.log("afterCombinatorElement = "+afterCombinatorElement); + // NEED TO CHECK FOR afterCominatorElement:hover in ONE STEP + if (supportingHoverElement === afterCombinatorElement && ruleText2.match(/:hover/g)) { + // console.log("7. Found supporting hover element same as afterCombinatorElement") + // 7. Found supporting hover element same as afterCombinatorElement + supportingElement = true; + // does supporting element have hover + // console.log("8. Supporting element has hover also = "+ foundHover); + // 8. Supporting element has hover also + supportingHover = true; + var index = ruleText2.indexOf("display:"); + // console.log("index = "+index); + if (index) { + // 9. Found supportingHoverElementDisplayProperty + supportingHoverElementDisplayProperty = true; + // console.log("9. Found supportingHoverElementDisplayProperty = "+supportingHoverElementDisplayProperty); + if (plusTempStr.slice(index + 8).trim().split(" ")[0] !== "none;") { + // 10. Found supportingHoverElementDisplayValue not none + supportingHoverElementDisplayValue = true; + // console.log("10. Found supportingHoverElementDisplayValue not none = "+supportingHoverElementDisplayValue); + // Get list of hover elements and next sibling for + + // For + there must be at least one ADJACENT sibling + if (hoverElement !== "" && plusCombinator) { + var hoverElementList = ruleContext.ownerDocument.getElementsByTagName(hoverElement.toUpperCase()); + // console.log("hoverElementList.length = "+hoverElementList.length); + // console.log("hoverElementList[0].tagName = "+hoverElementList[0].tagName); + // Get adjacent sibling + // console.log("Adjacent sibling = "+hoverElementList[0].nextElementSibling.tagName); + // console.log("afterCombinatorElement.toUpperCase() = "+afterCombinatorElement.toUpperCase()); + if (afterCombinatorElement.toUpperCase() === hoverElementList[0].nextElementSibling.tagName) { + // console.log("11a. Hover with plus has adjacent sibling.") + // 11a. Hover with plus has adjacent sibling. + adjacentPlusSibling = true; + // At this point we have verified a supporting afterCombinatorElement css rule that contains hover and display property that is not equal to none and has a hover element in the body with an adjacent sibling + // console.log("**** REPORT PASS 1 HERE"); + pass0 = true; + continue; + } + } + else if (plusCombinator) { + // console.log("11a. Main hover with + combinator has no adjacent sibling"); + if (!potential1) { + // console.log("**** PUT POTENTIAL 1 HERE"); + potential1 = true; + break; + } + continue; + } + // Get list of hover elements and determine if there are 2 or more adjacent siblings for ~ + // For ~ there must be at least one ADJACENT sibling + if (hoverElement !== "" && tildeCombinator) { + // console.log("hoverElement.toUpperCase() = "+hoverElement.toUpperCase()); + var hoverElementList = ruleContext.ownerDocument.getElementsByTagName(hoverElement.toUpperCase()); + // console.log("hoverElementList.length = "+hoverElementList.length); + // Check for two or more adjacent siblings + var siblings = []; + var sibling = hoverElementList[0].nextElementSibling; + do { + // console.log("sibling.tagName = "+sibling.tagName); + if (sibling.tagName === afterCombinatorElement.toUpperCase()) { + siblings.push(sibling); + } + else { + break; + } + } while ((sibling = sibling.nextElementSibling)); + var siblingCount = siblings.length; + // console.log("siblingCount = "+siblingCount); + // JCH TODO: what if sibling count 0 + if (siblingCount === 1) { + // console.log("11b. Hover with tilde and one adjacent sibling"); + adjacentTildeMultipleSibling = true; + // console.log("**** REPORT PASS 2 HERE"); + return (0, IRule_1.RulePass)("Pass_2"); + } + else if (siblingCount > 1) { + // console.log("Main hover with ~ combinator has two or more siblings"); + if (!potential2) { + // console.log("**** PUT POTENTIAL 2 HERE"); + return (0, IRule_1.RulePotential)("Potential_2"); + } + } + } + } + else if (plusCombinator) { + // supportingHoverElementDisplayValue + // if we make it to the last rule and supportingHoverElementDisplayValue is still false => potential1 + if (styleRuleIndex2 === styleRules2.length - 1 && supportingHoverElementDisplayValue === false) { + // console.log("NO plus supportingHoverElementDisplayProperty"); + // console.log("**** PUT POTENTIAL 1 HERE"); + return (0, IRule_1.RulePotential)("Potential_1"); + } + else { + continue; + } + } + else if (tildeCombinator) { + // if we make it to the last rule and supportingHoverElementDisplayValue is still false => potential2 + if (styleRuleIndex2 === styleRules2.length - 1 && supportingHoverElementDisplayValue === false) { + // console.log("NO plus supportingHoverElementDisplayProperty"); + // console.log("**** PUT POTENTIAL 2 HERE"); + return (0, IRule_1.RulePotential)("Potential_1"); + } + else { + continue; + } + } + // note at least one of the rules must have a display property + } + else if (plusCombinator) { + // if we make it to the last rule and supportingHoverElementDisplayProperty is still false => potential1 + if (styleRuleIndex2 === styleRules2.length - 1 && supportingHoverElementDisplayProperty === false) { + // console.log("NO plus supportingHoverElementDisplayProperty"); + // console.log("**** PUT POTENTIAL 1 HERE"); + return (0, IRule_1.RulePotential)("Potential_1"); + } + else { + continue; + } + } + else if (tildeCombinator) { + // if we make it to the last rule and supportingHoverElementDisplayProperty is still false => potential2 + if (styleRuleIndex2 === styleRules2.length - 1 && supportingHoverElementDisplayProperty === false) { + // console.log("NO tilde supportingHoverElementDisplayProperty"); + // console.log("**** PUT POTENTIAL 2 HERE"); + return (0, IRule_1.RulePotential)("Potential_1"); + } + else { + continue; + } + } + // note at least one of the rules must have a supportingElement:hover + } + else if (plusCombinator) { + // if we make it to the last rule and supportingElement is still false => potential1 + // console.log("styleRuleIndex2 = "+styleRuleIndex2); + // console.log("styleRules2.length = "+styleRules2.length); + // console.log("supportingElement = "+supportingHover); + if (styleRuleIndex2 === styleRules2.length - 1 && supportingHover === false) { + // console.log("NO plus supportingElement:hover"); + // console.log("**** PUT POTENTIAL 1 HERE"); + return (0, IRule_1.RulePotential)("Potential_1"); + } + else { + continue; + } + } + else if (tildeCombinator) { + // if we make it to the last rule and supportingElement is still false => potential2 + // console.log("styleRuleIndex2 = "+styleRuleIndex2); + // console.log("styleRules2.length = "+styleRules2.length); + // console.log("supportingElement = "+supportingHover); + if (styleRuleIndex2 === styleRules2.length - 1 && supportingHover === false) { + // console.log("NO tilde supportingElement:hover"); + // console.log("**** PUT POTENTIAL 2 HERE"); + return (0, IRule_1.RulePotential)("Potential_2"); + } + else { + continue; + } + } + } + else { + // console.log("There is a margin in the supporting element"); + if (!potential3) { + // console.log("**** PUT POTENTIAL 3 HERE"); + potential3 = true; + return (0, IRule_1.RulePotential)("Potential_3"); + } + } + } + } + catch (e) { + // Silence css access issues + } + } + } + } + catch (e) { + // Silence css access issues + } + } + } + } + // console.log("----------------------"); + // console.log("pass0 = "+pass0); + // console.log("pass1 = "+pass1); + // console.log("pass2 = "+pass2); + // console.log("potential1 = "+potential1); + // console.log("potential2 = "+potential2); + // console.log("potential3 = "+potential3); + if (pass0) + return (0, IRule_1.RulePass)("Pass_0"); + // if (pass1) return RulePass("Pass_2"); // Doesn't trigger + // if (pass2) return RulePass("Pass_3"); // Doesn't trigger + if (potential1) + return (0, IRule_1.RulePotential)("Potential_1"); + if (potential2) + return (0, IRule_1.RulePotential)("Potential_2"); + if (potential3) + return (0, IRule_1.RulePotential)("Potential_3"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/style_viewport_resizable.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/style_viewport_resizable.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.style_viewport_resizable = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +/** + * Description: Trigger when viewport units are used for font size. + * Origin: Various + */ +exports.style_viewport_resizable = { + id: "style_viewport_resizable", + context: "dom:link, dom:style, dom:*[style]", + refactor: { + "WCAG21_Style_Viewport": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "group": "style_viewport_resizable.html", + "Pass_0": "style_viewport_resizable.html", + "Potential_1": "style_viewport_resizable.html" + } + }, + messages: { + "en-US": { + "group": "Text must scale up to 200% without loss of content or functionality", + "Pass_0": "Rule Passed", + "Potential_1": "Verify that text sized using viewport units can be resized up to 200%" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: ["1.4.4", "1.4.10"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = true; + var thePattern = /\d+(vw|vh|vmin|vmax)/gi; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (nodeName === "style") { + for (var sIndex = 0; sIndex < ruleContext.ownerDocument.styleSheets.length; sIndex++) { + var sheet = ruleContext.ownerDocument.styleSheets[sIndex]; + if (sheet.ownerNode === ruleContext) { + try { + var styleRules = sheet.cssRules ? sheet.cssRules : sheet.rules; + if (styleRules) { + for (var styleRuleIndex = 0; passed && styleRuleIndex < styleRules.length; styleRuleIndex++) { + var rule = styleRules[styleRuleIndex]; + if (rule.type && rule.type === 1 /* CSSRule.STYLE_RULE */) { + var styleRule = rule; + if (styleRule.style['fontSize']) { + var fontSize = styleRule.style['fontSize'].trim(); + var found = fontSize.match(thePattern); + if (fontSize.length && found) { + passed = false; + } + } + } + // check import rules + else if (rule.type && rule.type === 3 /* CSSRule.IMPORT_RULE */ && rule.styleSheet) { + var importRule = rule; + var rules = importRule.styleSheet.cssRules ? importRule.styleSheet.cssRules : importRule.styleSheet.rules; + if (rules) { + for (var rIndex = 0; passed && rIndex < rules.length; rIndex++) { + var importedRule = rules[rIndex]; + if (importedRule.type && importedRule.type === 1 /* CSSRule.STYLE_RULE */) { + if (importedRule.style['fontSize']) { + var fontSize = importedRule.style['fontSize'].trim(); + var found = fontSize.match(thePattern); + if (fontSize.length && found) { + passed = false; + } + } + } + } + } + } + } + } + } + catch (e) { + // Ignore css access issues + } + } + } + } + else if (nodeName === "link") { + for (var sIndex = 0; sIndex < ruleContext.ownerDocument.styleSheets.length; sIndex++) { + var sheet = ruleContext.ownerDocument.styleSheets[sIndex]; + if (sheet && sheet.ownerNode === ruleContext) { + try { + var rules = sheet.cssRules ? sheet.cssRules : sheet.rules; + if (rules) { + for (var rIndex = 0; passed && rIndex < rules.length; rIndex++) { + var ruleFromLink = rules[rIndex]; + // check rules + if (ruleFromLink.type && ruleFromLink.type === 1 /* CSSRule.STYLE_RULE */) { + if (ruleFromLink.style['fontSize']) { + var fontSize = ruleFromLink.style['fontSize'].trim(); + var found = fontSize.match(thePattern); + if (fontSize.length && found) { + passed = false; + } + } + } + } + } + } + catch (e) { + // Ignore css access issues + } + } + } + } + else { + var styleValue = ruleContext.getAttribute('style'); + if (styleValue) { + var stylePattern = /font-size:\s*\d+(vw|vh|vmin|vmax)/gi; + var found = styleValue.match(stylePattern); + if (found) { + passed = false; + } + } + } + return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/svg_graphics_labelled.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/svg_graphics_labelled.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.svg_graphics_labelled = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.svg_graphics_labelled = { + id: "svg_graphics_labelled", + context: "dom:svg", + help: { + "en-US": { + "group": "svg_graphics_labelled.html", + "pass": "svg_graphics_labelled.html", + "fail_acc_name": "svg_graphics_labelled.html" + } + }, + messages: { + "en-US": { + "group": "A non-decorative SVG element must have an accessible name", + "pass": "The SVG element has an accessible name", + "fail_acc_name": "The SVG element has no accessible name" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [{ + "7d6734": { + "pass": "pass", + "fail_acc_name": "fail" + } + }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || VisUtil_1.VisUtil.isNodePresentational(ruleContext) || AccNameUtil_1.AccNameUtil.isAccessibleNameIgnorable(ruleContext)) + return null; + var name_pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + if (name_pair && name_pair.name && name_pair.name.trim().length > 0) + return (0, IRule_1.RulePass)("pass"); + return (0, IRule_1.RuleFail)("fail_acc_name"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/table_aria_descendants.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/table_aria_descendants.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_aria_descendants = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.table_aria_descendants = { + id: "table_aria_descendants", + context: "aria:table dom:tr[role], aria:table dom:th[role], aria:table dom:td[role], aria:grid dom:tr[role], aria:grid dom:th[role], aria:grid dom:td[role], aria:treegrid dom:tr[role], aria:treegrid dom:th[role], aria:treegrid dom:td[role]", + help: { + "en-US": { + "group": "table_aria_descendants.html", + "explicit_role": "table_aria_descendants.html" + } + }, + messages: { + "en-US": { + "group": "Table structure elements cannot specify an explicit 'role' within table containers", + "explicit_role": "An explicit ARIA 'role' is not valid for <{0}> element within an ARIA role '{1}' per the ARIA in HTML specification" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var parentRole = CommonUtil_1.CommonUtil.isTableDescendant(contextHierarchies); + // cache the result + if (parentRole === null || parentRole.length === 0) + return; + // ignore the redundancy cases: reported in the aria_role_redundant rule + var implicitRoles = AriaUtil_1.AriaUtil.getImplicitRole(ruleContext); + var explicitRoles = AriaUtil_1.AriaUtil.getRoles(ruleContext, false); + ; + if (implicitRoles && implicitRoles.length > 0 && explicitRoles && explicitRoles.length > 0 + && explicitRoles.some(function (item) { return implicitRoles.includes(item); })) + return; + return (0, IRule_1.RuleFail)("explicit_role", [context["dom"].node.nodeName.toLowerCase(), parentRole[0].role]); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/table_caption_empty.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/table_caption_empty.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_caption_empty = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.table_caption_empty = { + id: "table_caption_empty", + context: "dom:caption", + refactor: { + "Valerie_Caption_HasContent": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "table_caption_empty.html", + "Fail_1": "table_caption_empty.html", + "group": "table_caption_empty.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The <table> element has an empty <caption> element", + "group": "A <caption> element for a <table> element must contain descriptive text" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = CommonUtil_1.CommonUtil.hasInnerContentHidden(ruleContext); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/table_caption_nested.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/table_caption_nested.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_caption_nested = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.table_caption_nested = { + id: "table_caption_nested", + context: "dom:caption", + refactor: { + "Valerie_Caption_InTable": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "table_caption_nested.html", + "Fail_1": "table_caption_nested.html", + "group": "table_caption_nested.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "<caption> element is not nested inside a <table> element", + "group": "The <caption> element must be nested inside the associated <table> element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = CommonUtil_1.CommonUtil.getAncestor(ruleContext, "table") != null; + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/table_headers_exists.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/table_headers_exists.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_headers_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var TableUtil_1 = __webpack_require__(/*! ../util/TableUtil */ "./src/v4/util/TableUtil.ts"); +exports.table_headers_exists = { + id: "table_headers_exists", + context: "dom:table", + refactor: { + "RPT_Table_DataHeadingsAria": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "table_headers_exists.html", + "Fail_1": "table_headers_exists.html", + "group": "table_headers_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Table has no headers identified", + "group": "Data table must identify headers" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // If this is a layout table or there are no rows, the rule does not apply. + var rows = ruleContext.rows; + if (!TableUtil_1.TableUtil.isDataTable(ruleContext) || rows === null || rows.length === 0) + return null; + var passed = TableUtil_1.TableUtil.tableHeaderExists(ruleContext); + if (passed === null) + return; + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/table_headers_ref_valid.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/table_headers_ref_valid.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_headers_ref_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var ARIAMapper_1 = __webpack_require__(/*! ../../v2/aria/ARIAMapper */ "./src/v2/aria/ARIAMapper.ts"); +exports.table_headers_ref_valid = { + id: "table_headers_ref_valid", + context: "dom:td[headers], dom:th[headers]", + help: { + "en-US": { + "Pass_0": "table_headers_ref_valid.html", + "Fail_1": "table_headers_ref_valid.html", + "Fail_2": "table_headers_ref_valid.html", + "Fail_3": "table_headers_ref_valid.html", + "Fail_4": "table_headers_ref_valid.html", + "group": "table_headers_ref_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The 'headers' attribute value \"{0}\" does not reference a valid 'id' in this document", + "Fail_2": "The 'headers' attribute value \"{0}\" refers to itself", + "Fail_3": "The 'headers' attribute value \"{0}\" does not refer to a cell in the same table", + "Fail_4": "The 'headers' attribute value \"{0}\" does not refer to a cell indicated with <th> or a role of \"columnheader\" or \"rowheader\"", + "group": "The 'headers' attribute should refer to a valid cell in the same table" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: ["a25f45"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var parentTable = CommonUtil_1.CommonUtil.getAncestor(ruleContext, "table"); + var parentRole = ARIAMapper_1.ARIAMapper.nodeToRole(parentTable); + // If this is a layout table or a simple table the rule does not apply. + if (parentTable == null || !VisUtil_1.VisUtil.isNodeVisible(parentTable) || !["table", "grid"].includes(parentRole)) + return null; + var nodeName = ruleContext.nodeName.toLowerCase(); + var doc = ruleContext.ownerDocument; + var value = ruleContext.getAttribute("headers"); + if (!value) + return null; + var ids = value.split(" "); + var invalidHeaderValues = []; + var sameNodeHeaderValues = []; + var sameTableHeaderValues = []; + var invalidElemHeaderValues = []; + for (var i = 0; i < ids.length; i++) { + var id = ids[i]; + if (id.trim() === '') + continue; + var elem = doc.getElementById(id); + if (!elem) + invalidHeaderValues.push(id); + else if (DOMUtil_1.DOMUtil.sameNode(elem, ruleContext)) + sameNodeHeaderValues.push(id); + else if (!DOMUtil_1.DOMUtil.isInSameTable(elem, ruleContext)) + sameTableHeaderValues.push(id); + else { + var elemName = elem.nodeName.toLowerCase(); + if (elemName !== 'th') { + var roles = AriaUtil_1.AriaUtil.getRoles(elem, true); + if (!roles.includes('columnheader') && !roles.includes('rowheader')) + invalidElemHeaderValues.push(id); + } + } + } + var results = []; + if (invalidHeaderValues.length != 0) + results.push((0, IRule_1.RuleFail)("Fail_1", [invalidHeaderValues.toString()])); + if (sameNodeHeaderValues.length != 0) + results.push((0, IRule_1.RuleFail)("Fail_2", [sameNodeHeaderValues.toString()])); + if (sameTableHeaderValues.length != 0) + results.push((0, IRule_1.RuleFail)("Fail_3", [sameTableHeaderValues.toString()])); + if (invalidElemHeaderValues.length != 0) + results.push((0, IRule_1.RuleFail)("Fail_4", [invalidElemHeaderValues.toString()])); + if (results.length == 0) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return results; + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/table_headers_related.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/table_headers_related.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_headers_related = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var TableUtil_1 = __webpack_require__(/*! ../util/TableUtil */ "./src/v4/util/TableUtil.ts"); +exports.table_headers_related = { + id: "table_headers_related", + context: "dom:td, dom:th", + refactor: { + "Valerie_Table_DataCellRelationships": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "table_headers_related.html", + "Fail_1": "table_headers_related.html", + "group": "table_headers_related.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Complex table does not have headers for each cell properly defined with 'header' or 'scope'", + "group": "For a complex data table, all <th> and <td> elements must be related via 'header' or 'scope' attributes" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var parentTable = CommonUtil_1.CommonUtil.getAncestor(ruleContext, "table"); + // If this is a layout table or a simple table the rule does not apply. + if (parentTable == null || !TableUtil_1.TableUtil.isComplexDataTable(parentTable)) + return null; + // If this table hasn't been preprocessed, process it. + if (CacheUtil_1.CacheUtil.getCache(ruleContext, "table_headers_related", null) === null) { + // Build a grid that's actually usable (rowspan and colspan elements are duplicated) + // This builds a real 2d table array. + var grid = []; + for (var i = 0; i < parentTable.rows.length; ++i) { + var row = parentTable.rows[i]; + if (!grid[i]) + grid[i] = []; + for (var j = 0; j < row.cells.length; ++j) { + var cell = row.cells[j]; + CacheUtil_1.CacheUtil.setCache(cell, "table_headers_related", i + ":" + j); + var width = parseInt(cell.getAttribute("colspan")); + if (!width) + width = 1; + var height = parseInt(cell.getAttribute("rowspan")); + if (!height) + height = 1; + var gX = 0; + while (grid[i][gX]) + gX += 1; + for (var k = 0; k < height; ++k) { + if (!grid[i + k]) + grid[i + k] = []; + for (var l = 0; l < width; ++l) { + grid[i + k][gX + l] = cell; + } + } + } + } + // Iterate through the table grid and record headers that point to cells and + // cells that are pointed to by headers + var doc = ruleContext.ownerDocument; + var lookup = {}; + var scopedCols = {}; + for (var i = 0; i < grid.length; ++i) { + var rowScoped = false; + for (var j = 0; j < grid[i].length; ++j) { + var gridCell = grid[i][j]; + var gridNodeName = gridCell.nodeName.toLowerCase(); + if (gridNodeName == "th") { + if (gridCell.getAttribute("scope") == "row") { + rowScoped = true; + // If there's an axis attribute, it must be referred to by headers, + // scope is not enough. + if (!CommonUtil_1.CommonUtil.attributeNonEmpty(gridCell, "axis")) + lookup[CacheUtil_1.CacheUtil.getCache(gridCell, "table_headers_related", null)] = true; + } + else if (gridCell.getAttribute("scope") == "col") { + scopedCols[j] = true; + // If there's an axis attribute, it must be referred to by headers, + // scope is not enough. + if (!CommonUtil_1.CommonUtil.attributeNonEmpty(gridCell, "axis")) + lookup[CacheUtil_1.CacheUtil.getCache(gridCell, "table_headers_related", null)] = true; + } + // Headers can refer to other headers + if (CommonUtil_1.CommonUtil.attributeNonEmpty(gridCell, "headers")) { + var hdrs = gridCell.getAttribute("headers").split(" "); + for (var k = 0; k < hdrs.length; ++k) { + var headElem = doc.getElementById(hdrs[k].trim()); + if (headElem && CommonUtil_1.CommonUtil.getAncestor(headElem, "table") == parentTable) { + lookup[CacheUtil_1.CacheUtil.getCache(headElem, "table_headers_related", null)] = true; + } + } + } + } + else if (gridNodeName == "td") { + if (rowScoped || scopedCols[j]) { + lookup[CacheUtil_1.CacheUtil.getCache(gridCell, "table_headers_related", null)] = true; + } + else if (CommonUtil_1.CommonUtil.attributeNonEmpty(gridCell, "headers")) { + var hdrs = gridCell.getAttribute("headers").split(" "); + for (var k = 0; k < hdrs.length; ++k) { + var headElem = doc.getElementById(hdrs[k].trim()); + if (headElem && CommonUtil_1.CommonUtil.getAncestor(headElem, "table") == parentTable) { + lookup[CacheUtil_1.CacheUtil.getCache(gridCell, "table_headers_related", null)] = true; + lookup[CacheUtil_1.CacheUtil.getCache(headElem, "table_headers_related", null)] = true; + } + } + } + } + } + } + CacheUtil_1.CacheUtil.setCache(parentTable, "table_headers_related", lookup); + } + var rcInfo = CacheUtil_1.CacheUtil.getCache(ruleContext, "table_headers_related", null); + var tInfo = CacheUtil_1.CacheUtil.getCache(parentTable, "table_headers_related", null); + var passed = rcInfo && tInfo && rcInfo in tInfo; + if (!passed && rcInfo === "0:0" && + CommonUtil_1.CommonUtil.getInnerText(ruleContext).trim().length == 0) { + // We don't test if it's the upper-left cell and it's empty + return null; + } + // If the table has no th's, it may just be that this was supposed to be a layout + // table, which introduces a lot of noise. In that case, only trigger this error + // once per table. + if (!passed && parentTable.getElementsByTagName("th").length == 0) { + if (CacheUtil_1.CacheUtil.getCache(parentTable, "table_headers_related_TrigOnce", false) === true) { + passed = true; + } + else { + CacheUtil_1.CacheUtil.setCache(parentTable, "table_headers_related_TrigOnce", true); + } + } + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/table_layout_linearized.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/table_layout_linearized.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_layout_linearized = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var TableUtil_1 = __webpack_require__(/*! ../util/TableUtil */ "./src/v4/util/TableUtil.ts"); +exports.table_layout_linearized = { + id: "table_layout_linearized", + context: "dom:table", + refactor: { + "RPT_Table_LayoutTrigger": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "table_layout_linearized.html", + "Potential_1": "table_layout_linearized.html", + "group": "table_layout_linearized.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify table is not being used to format text content in columns unless the table can be linearized", + "group": "Avoid using tables to format text documents in columns unless the table can be linearized" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_FOUR + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = !TableUtil_1.TableUtil.isLayoutTable(ruleContext); + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/table_scope_valid.ts" +/*!*******************************************!*\ + !*** ./src/v4/rules/table_scope_valid.ts ***! + \*******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_scope_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.table_scope_valid = { + id: "table_scope_valid", + context: "dom:td[scope], dom:th[scope]", + refactor: { + "WCAG20_Table_Scope_Valid": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_0": "table_scope_valid.html", + "Fail_1": "table_scope_valid.html", + "Fail_2": "table_scope_valid.html", + "group": "table_scope_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Value provided is invalid for the 'scope' attribute", + "Fail_2": "The 'scope' attribute should only be used on a <th> element", + "group": "Value for 'scope' attribute must be \"row\", \"col\", \"rowgroup\", or \"colgroup\"" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (nodeName === 'td') + return (0, IRule_1.RuleFail)("Fail_2"); + //only continue for 'th' + var scopeVal = ruleContext.getAttribute("scope").trim().toLowerCase(); + var passed = /^(row|col|rowgroup|colgroup)$/.test(scopeVal); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/table_structure_misuse.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/table_structure_misuse.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_structure_misuse = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var TableUtil_1 = __webpack_require__(/*! ../util/TableUtil */ "./src/v4/util/TableUtil.ts"); +exports.table_structure_misuse = { + id: "table_structure_misuse", + context: "dom:table", + refactor: { + "WCAG20_Table_Structure": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "table_structure_misuse.html", + "Fail_1": "table_structure_misuse.html", + "group": "table_structure_misuse.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The <{0}> element with \"presentation\" role or \"none\" role has structural element(s) and/or attribute(s) '{1}'", + "group": "Table elements with 'role=\"presentation\" or 'role=\"none\" should not have structural elements or attributes" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // JCH - OUT OF SCOPE hidden in context + if (TableUtil_1.TableUtil.isDataTable(ruleContext)) + return null; + if (AriaUtil_1.AriaUtil.isNodeInGrid(ruleContext)) + return null; + var errorNodes = []; + if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "summary")) + errorNodes.push(ruleContext); + var captionElems = ruleContext.getElementsByTagName("caption"); + for (var i = 0; i < captionElems.length; ++i) { + if (CommonUtil_1.CommonUtil.getAncestor(captionElems[i], "table") == ruleContext) { + // Check if the node should be skipped or not based on the Check Hidden Content setting and if the node isVisible or + // not. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(captionElems[i])) { + continue; + } + // Add the node to the errorNodes + errorNodes.push(captionElems[i]); + // Since we are not actually making use of theses errorNodes even though they are passed along with + // ValidationResult, we do not need to keep looping over and getting every single violating node under + // the rule context. This can be a future enhancenment where we actually make use of the error nodes that + // are passed along. Adding this break to speed up performance at this point. + break; // There is no point to keep adding the error nodes, stop after finding the first one + } + } + var thNodes = ruleContext.getElementsByTagName("th"); + for (var i = 0; i < thNodes.length; ++i) { + if (CommonUtil_1.CommonUtil.getAncestor(thNodes[i], "table") == ruleContext) { + // Check if the node should be skipped or not based on the Check Hidden Content setting and if the node isVisible or + // not. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(thNodes[i])) { + continue; + } + // Add the node to the errorNodes + errorNodes.push(thNodes[i]); + // Since we are not actually making use of theses errorNodes even though they are passed along with + // ValidationResult, we do not need to keep looping over and getting every single violating node under + // the rule context. This can be a future enhancenment where we actually make use of the error nodes that + // are passed along. Adding this break to speed up performance at this point. + break; // There is no point to keep adding the error nodes, stop after finding the first one + } + } + var tdNodes = ruleContext.getElementsByTagName("td"); + for (var i = 0; i < tdNodes.length; ++i) { + if ((tdNodes[i].hasAttribute("scope") || tdNodes[i].hasAttribute("headers")) && + CommonUtil_1.CommonUtil.getAncestor(tdNodes[i], "table") == ruleContext) { + // Check if the node should be skipped or not based on the Check Hidden Content setting and if the node isVisible or + // not. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(tdNodes[i])) { + continue; + } + // Add the node to the errorNodes + errorNodes.push(tdNodes[i]); + // Since we are not actually making use of theses errorNodes even though they are passed along with + // ValidationResult, we do not need to keep looping over and getting every single violating node under + // the rule context. This can be a future enhancenment where we actually make use of the error nodes that + // are passed along. Adding this break to speed up performance at this point. + break; // There is no point to keep adding the error nodes, stop after finding the first one + } + } + // Get the node name for the rule context element in this case it will always be table + var currentElementToken = ruleContext.nodeName.toLowerCase(); + // Construct a new array which will contan only the element tag for the violation elements + var structuralElementTokens = new Array(); + // Construct a seen hash that will keep trask of all the elements that were already added to the token array, to make sure + // we do not duplicate any of the elements. Duplicate element tags in the token message looks bad and confusing. + var seen = {}; + // Loop through all the violating structural elements and extract the element tag to be used as a token + for (var i = 0; i < errorNodes.length; i++) { + // Get the node name (tag name) for the violating structural element + var nodeName = errorNodes[i].nodeName.toLowerCase(); + // Only need to add the violating element once + if (!seen.hasOwnProperty(nodeName)) { + // Since we are adding the token as elements and attributes we need to handle + // the summary attribute on the ruleContext (table). We only add summary once, same as + // for elements to avoid duplication in the message. (Summary should not duplicate, but just in case) + if (nodeName == "table" && !seen.hasOwnProperty["summary"]) { + // Mark this as a new attribute + seen["summary"] = true; + // Since this is a new violating element add it to the structural element tokens array + structuralElementTokens.push("summary"); + } + else { + // Mark this as a new element + seen[nodeName] = true; + // Since this is a new violating element add it to the structural element tokens array + structuralElementTokens.push(nodeName); + } + } + } + // We need to take the array of structural elements and join them with a comma and a space to make grammatical correct in + // the message. + var structuralElementTokensStr = structuralElementTokens.join(", "); + //return new ValidationResult(errorNodes.length == 0, errorNodes, '', '', [currentElementToken, structuralElementTokens]); + if (errorNodes.length == 0) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1", [currentElementToken, structuralElementTokensStr]); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/table_summary_redundant.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/table_summary_redundant.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_summary_redundant = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +exports.table_summary_redundant = { + id: "table_summary_redundant", + context: "dom:table", + refactor: { + "WCAG20_Table_CapSummRedundant": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "table_summary_redundant.html", + "Fail_1": "table_summary_redundant.html", + "group": "table_summary_redundant.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The table summary duplicates the caption", + "group": "The table summary must not duplicate the caption" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var pofId; + var passed = true; + var sumStr; + if (ruleContext.hasAttribute("summary")) { + pofId = 0; + sumStr = ruleContext.getAttribute("summary").trim().toLowerCase(); + } + else if (ruleContext.hasAttribute("aria-describedby")) { + pofId = 1; + var summaryNodeIds = ruleContext.getAttribute("aria-describedby").split(" "); + var summaryNodeConcat = ""; + for (var i = 0; i < summaryNodeIds.length; i++) { + var summaryNodeId = summaryNodeIds[i]; + if (summaryNodeId) { + var summaryNode = fragment_1.FragmentUtil.getById(ruleContext, summaryNodeId); + if (summaryNode && !DOMUtil_1.DOMUtil.sameNode(summaryNode, ruleContext)) { + summaryNodeConcat += " " + CommonUtil_1.CommonUtil.getInnerText(summaryNode).trim().toLowerCase(); + } + } + } + sumStr = summaryNodeConcat; + } + if (!sumStr) { + return null; + } + else { + var capElems = ruleContext.getElementsByTagName("caption"); + if (capElems.length === 0) { + return null; + } + else if (sumStr.length > 0) { + var capStr = CommonUtil_1.CommonUtil.getInnerText(capElems[0]).trim().toLowerCase(); + if (!sumStr.includes(capStr)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/target_spacing_sufficient.ts" +/*!***************************************************!*\ + !*** ./src/v4/rules/target_spacing_sufficient.ts ***! + \***************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.target_spacing_sufficient = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var DOMMapper_1 = __webpack_require__(/*! ../../v2/dom/DOMMapper */ "./src/v2/dom/DOMMapper.ts"); +var CSSUtil_1 = __webpack_require__(/*! ../util/CSSUtil */ "./src/v4/util/CSSUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +exports.target_spacing_sufficient = { + id: "target_spacing_sufficient", + context: "dom:*", + dependencies: [], + help: { + "en-US": { + "group": "target_spacing_sufficient.html", + "pass_spacing": "target_spacing_sufficient.html", + "pass_sized": "target_spacing_sufficient.html", + "pass_inline": "target_spacing_sufficient.html", + "pass_default": "target_spacing_sufficient.html", + "violation_spacing": "target_spacing_sufficient.html", + "recommendation_inline": "target_spacing_sufficient.html", + "potential_overlap": "target_spacing_sufficient.html" + } + }, + messages: { + "en-US": { + "group": "The target must be sufficiently sized or spaced from other targets", + "pass_spacing": "The target's spacing from other targets is sufficient", + "pass_sized": "The target’s size is more than 24 CSS pixels", + "pass_inline": "The target is in a sentence or its size is otherwise constrained by the line-height of non-target text", + "pass_default": "The target's size is determined by the user agent and is not modified by the author", + "violation_spacing": "Undersized target \"{0}\" does not have sufficient spacing of 12 CSS pixels from another target \"{1}\"", + "recommendation_inline": "Confirm the inline target \"{0}\" is sufficiently spaced from another inline target \"{1}\"", + "potential_overlap": "Ensure the overlapped target \"{0}\" meets a minimum target size or has sufficient spacing from the overlapping target \"{1}\"" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_2"], + num: ["2.5.8"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE, + reasonCodes: ["pass_spacing", "pass_sized", "pass_inline", "pass_default", "violation_spacing", "potential_overlap"] + }, + { + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_2"], + num: ["2.5.8"], + level: IRule_2.eRulePolicy.RECOMMENDATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE, + reasonCodes: ["recommendation_inline"] + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLocaleLowerCase(); + var mapper = new DOMMapper_1.DOMMapper(); + var bounds = mapper.getUnadjustedBounds(ruleContext); //context["dom"].bounds; + if (!bounds) + return null; + // ignore hidden, non-target + if (!CommonUtil_1.CommonUtil.isTarget(ruleContext)) + return null; + if (bounds.height >= 24 && bounds.width >= 24) + return (0, IRule_1.RulePass)("pass_sized"); + // check inline element: without text in the same line + var status = CSSUtil_1.CSSUtil.getInlineStatus(ruleContext); + if (status === null) + return null; + if (status.inline) { + if (status.text) { + if (status.violation === null) + return (0, IRule_1.RulePass)("pass_inline"); + else + // case 1: inline element is too close horizontally + return (0, IRule_1.RulePotential)("recommendation_inline", [nodeName, status.violation]); + } + else { + if (status.violation === null) + return (0, IRule_1.RulePass)("pass_default"); + else + // case 1: inline element is too close horizontally + return (0, IRule_1.RulePotential)("recommendation_inline", [nodeName, status.violation]); + } + } + else { + // ignore browser default + if (CSSUtil_1.CSSUtil.isTargetBrowserDefault(ruleContext)) + return (0, IRule_1.RulePass)("pass_default"); + } + var doc = ruleContext.ownerDocument; + if (!doc) { + return null; + } + var cStyle = getComputedStyle(ruleContext); + if (cStyle === null) + return null; + var zindex = cStyle.zIndex; + if (!zindex || isNaN(Number(zindex))) + zindex = "0"; + // Get the list of target elements + var targetElems = CacheUtil_1.CacheUtil.getCache(doc.documentElement, "target_spacing_sufficient::targets", undefined); + if (typeof targetElems === "undefined") { + targetElems = []; + //select all elements except itself and descendants + var elems = doc.querySelectorAll('body *:not(script):not(style)'); + for (var i = 0; i < elems.length; i++) { + var elem = elems[i]; + if (CommonUtil_1.CommonUtil.isTarget(elem)) { + targetElems.push(elem); + } + } + CacheUtil_1.CacheUtil.setCache(doc.documentElement, "target_spacing_sufficient::targets", targetElems); + } + if (!targetElems || targetElems.length === 0) + return; + var before = true; + var minX = 24; + var minY = 24; + var adjacentX = null; + var adjacentY = null; + var checked = []; //contains a list of elements that have been checked so their descendants don't need to be checked again + var _loop_1 = function (i) { + var elem = targetElems[i]; + /** + * the nodes returned from querySelectorAll is in document order + * if two elements overlap and z-index are not defined, then the node rendered earlier will be overlaid by the node rendered later + * filter out the elements that’re descendant or ancestors of the target element, nor descendant of the target element's siblings + */ + // Use compareDocumentPosition to check containment relationships + // Note: compareDocumentPosition returns 0 when comparing a node to itself + var position = ruleContext.compareDocumentPosition(elem); + // DOCUMENT_POSITION_CONTAINED_BY (16): elem is contained by ruleContext + // Also handle self-comparison (position === 0) + if (position === 0 || (position & Node.DOCUMENT_POSITION_CONTAINED_BY)) { + //the next node in elems will be after the target node (ruleContext). + before = false; + return "continue"; + } + // DOCUMENT_POSITION_CONTAINS (8): elem contains ruleContext + // ignore ascendants of the element, or itself or its ascendant already checked + if ((position & Node.DOCUMENT_POSITION_CONTAINS) || checked.some(function (item) { return item.contains(elem); })) + return "continue"; + var bnds = mapper.getUnadjustedBounds(elem); + if (!bnds) + return "continue"; + var zStyle = getComputedStyle(elem); + var z_index = '0'; + if (zStyle) { + z_index = zStyle.zIndex; + if (!z_index || isNaN(Number(z_index))) + z_index = "0"; + } + // case 2: the element overlaps the target entirely + // note when a link is inline with other target, if the link text wraps in another line in a given viewport, + // the bounds of the link may cover and the entire two lines, causing the other tagets to be overlapped, see two links in the test case: element_inline.html + if (bnds.top <= bounds.top && bnds.left <= bounds.left && bnds.top + bnds.height >= bounds.top + bounds.height + && bnds.left + bnds.width >= bounds.left + bounds.width) { + // if the target on top + if (before ? parseInt(zindex) < parseInt(z_index) : parseInt(zindex) <= parseInt(z_index)) { + return { value: null }; + } + else + return { value: (0, IRule_1.RulePotential)("potential_overlap", [nodeName, elem.nodeName.toLowerCase()]) }; + } + // case 3: if the target overlaps the element entirely + if (bounds.top <= bnds.top && bounds.left <= bnds.left && bounds.top + bounds.height >= bnds.top + bnds.height + && bounds.left + bounds.width >= bnds.left + bnds.width) { + // if the element on top + if (before ? parseInt(zindex) < parseInt(z_index) : parseInt(zindex) <= parseInt(z_index)) { + return { value: (0, IRule_1.RulePotential)("potential_overlap", [nodeName, elem.nodeName.toLowerCase()]) }; + } + else // the target on top + return { value: (0, IRule_1.RuleFail)("violation_spacing", [nodeName, elem.nodeName.toLowerCase()]) }; + } + // case 4: the element overlaps partially with the target + if ((((bounds.top >= bnds.top && bounds.top <= bnds.top + bnds.height) || (bounds.top + bounds.height <= bnds.top && bounds.top + bounds.height >= bnds.top + bnds.height)) + && ((bounds.left > bnds.left && bounds.left < bnds.left + bnds.width) || (bnds.left > bounds.left && bnds.left < bounds.left + bounds.width))) + || (((bounds.top > bnds.top && bounds.top < bnds.top + bnds.height) || (bnds.top > bounds.top && bnds.top < bounds.top + bounds.height)) + && ((bounds.left >= bnds.left && bounds.left <= bnds.left + bnds.width) || (bounds.left + bounds.width >= bnds.left && bounds.left + bounds.width <= bnds.left + bnds.width)))) { + return { value: (0, IRule_1.RulePotential)("potential_overlap", [nodeName, elem.nodeName.toLowerCase()]) }; + } + else { // no overlap with the elem, though may overlap withe other elements + var disX = 24; + var disY = 24; + // the element is in the horizontally same row with the target + if (bounds.width < 24 && ((bounds.top >= bnds.top && bounds.top <= bnds.top + bnds.height) || (bounds.top <= bnds.top && bounds.top + bounds.height > bnds.top))) + disX = Math.min(Math.abs(bounds.left - bnds.left), Math.abs(bounds.left - (bnds.left + bnds.width)), Math.abs(bounds.left + bounds.width - (bnds.left + bnds.width)), Math.abs(bounds.left + bounds.width - bnds.left)); + // the element is in the vertically same column with the target + if (bounds.height < 24 && ((bounds.left >= bnds.left && bounds.left <= bnds.left + bnds.width) || (bounds.left <= bnds.left && bounds.left + bounds.width > bnds.left))) + disY = Math.min(Math.abs(bounds.top - bnds.top), Math.abs(bounds.top - (bnds.top + bnds.height)), Math.abs(bounds.top + bounds.height - (bnds.top + bnds.height)), Math.abs(bounds.top + bounds.height - bnds.top)); + if (disX < minX) { + minX = disX; + adjacentX = elem; + } + if (disY < minY) { + minY = disY; + adjacentY = elem; + } + } + checked.push(elem); + }; + for (var i = 0; i < targetElems.length; i++) { + var state_1 = _loop_1(i); + if (typeof state_1 === "object") + return state_1.value; + } + // case 5: no overlap + insufficient target size. check spacing + if (Math.round(bounds.width / 2) + minX < 12 || Math.round(bounds.height / 2) + minY < 12) { + if (Math.round(bounds.width / 2) + minX < Math.round(bounds.height / 2) + minY) + return (0, IRule_1.RuleFail)("violation_spacing", [nodeName, adjacentX.nodeName.toLowerCase()]); + return (0, IRule_1.RuleFail)("violation_spacing", [nodeName, adjacentY.nodeName.toLowerCase()]); + } + else + return (0, IRule_1.RulePass)("pass_spacing"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/text_block_heading.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/text_block_heading.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.text_block_heading = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var CSSUtil_1 = __webpack_require__(/*! ../util/CSSUtil */ "./src/v4/util/CSSUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.text_block_heading = { + id: "text_block_heading", + context: "dom:p, dom:div, dom:br", + refactor: { + "RPT_Block_ShouldBeHeading": { + // "Pass_0": "pass", + "Potential_1": "potential_heading" + } + }, + help: { + "en-US": { + // "pass": "text_block_heading.html", + "potential_heading": "text_block_heading.html", + "group": "text_block_heading.html" + } + }, + messages: { + "en-US": { + // "pass": "Heading text uses a heading element or role", + "potential_heading": "Confirm this text '{0}' is used as a heading and if so, modify to use a heading element or role", + "group": "Heading text should use a heading element or role" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext) || !VisUtil_1.VisUtil.isNodeVisible(ruleContext)) + return null; + // Don't trigger if we're not in the body or if we're in a script + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["body"]) === null || CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["script"]) !== null) + return null; + var validateParams = { + numWords: { + value: 10, + type: "integer" + } + }; + var bodyFont = 0; + var body = ruleContext.ownerDocument.getElementsByTagName("body"); + if (body != null) { + var bodyStyle = getComputedStyle(body[0]); + if (bodyStyle) + bodyFont = CSSUtil_1.CSSUtil.getPixelsFromStyle(bodyStyle['font-size'], body); + } + var numWords = validateParams.numWords.value; + var wordsSeen = 0; + var wordStr = []; + var emphasizedText = false; + var nw = new DOMWalker_1.DOMWalker(ruleContext); + nw.nextNode(); + var passed = false; + while (!passed && + nw.nextNode() && + nw.node !== ruleContext && + nw.node !== DOMWalker_1.DOMWalker.parentNode(ruleContext) && + !["br", "div", "p"].includes(nw.node.nodeName.toLowerCase())) // Don't report twice + { + if (nw.node === ruleContext || CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(nw.node)) + continue; + var nwName = nw.node.nodeName.toLowerCase(); + if (nw.node.nodeType === 3) { + // for text child + if (nw.node.nodeValue.trim().length > 0 && nw.node.parentElement) { + // check it's style if the target element contains text, e.g., <p> fake heading</p> + var style = getComputedStyle(nw.node.parentElement); + if (style && (style['font-weight'] === 'bold' || style['font-weight'] >= 700 + || (style['font-size'] && style['font-size'].includes("large")) + || (style['font-size'] && bodyFont !== 0 && CSSUtil_1.CSSUtil.getPixelsFromStyle(style['font-size'], nw.node.parentElement) > bodyFont))) { + var nextStr = nw.node.nodeValue.trim(); + var wc = CommonUtil_1.CommonUtil.wordCount(nextStr); + if (wc > 0) { + wordStr.push(nextStr); + emphasizedText = true; + wordsSeen += wc; + } + passed = wordsSeen > numWords; + // Skip this node because it's emphasized + nw.bEndTag = true; + } + else { + // the node contain regular text + passed = true; + } + } + } + else if (nw.node.nodeType === 1) { + // for element child + if (nwName === "b" || nwName === "strong" || nwName === "u" || nwName === "font") { + // if the target element contains emphasis child, e.g., <p><strong>fake heading</strong></p> + var nextStr = CommonUtil_1.CommonUtil.getInnerText(nw.node); + var wc = CommonUtil_1.CommonUtil.wordCount(nextStr); + if (wc > 0) { + wordStr.push(nextStr); + emphasizedText = true; + wordsSeen += wc; + } + passed = wordsSeen > numWords; + // Skip this node because it's emphasized + nw.bEndTag = true; + } + else { + // ignore the element which has a role except 'generic', 'paragraph' or 'strong' + // ignore applet element that is deprecated anyway + var role = AriaUtil_1.AriaUtil.getResolvedRole(nw.node); + passed = (role !== null && role !== 'generic' && role !== 'paragraph' && role !== 'strong') || nwName === "applet"; + } + } + } + if (wordsSeen == 0) + passed = true; + //ignore if the string ends with “:” “,” “-” “;” or “.” + if (!passed) + passed = /[:,;\-\.]$/.test(wordStr.join(" ").trim()); + if (passed) { + return null; + } + else { + return (0, IRule_1.RulePotential)("potential_heading", [wordStr.join(" ")]); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/text_contrast_sufficient.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/text_contrast_sufficient.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.text_contrast_sufficient = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var ColorUtil_1 = __webpack_require__(/*! ../util/ColorUtil */ "./src/v4/util/ColorUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CSSUtil_1 = __webpack_require__(/*! ../util/CSSUtil */ "./src/v4/util/CSSUtil.ts"); +exports.text_contrast_sufficient = { + id: "text_contrast_sufficient", + context: "dom:*", + refactor: { + "IBMA_Color_Contrast_WCAG2AA": { + "Pass_0": "pass", + "Fail_1": "fail_contrast", + "Potential_1": "potential_same_color" + }, + "IBMA_Color_Contrast_WCAG2AA_PV": { + "pass_0": "pass", + "potential_1": "potential_graphic_background" + } + }, + help: { + "en-US": { + "group": "text_contrast_sufficient.html", + "pass": "text_contrast_sufficient.html", + "fail_contrast": "text_contrast_sufficient.html", + "potential_same_color": "text_contrast_sufficient.html", + "potential_graphic_background": "text_contrast_sufficient.html", + "potential_text_shadow": "text_contrast_sufficient.html" + } + }, + messages: { + "en-US": { + "group": "The contrast ratio of text with its background must meet WCAG AA requirements", + "pass": "The contrast ratio of text with its background meets WCAG AA requirements", + "fail_contrast": "Text contrast of {0} with its background is less than the WCAG AA minimum requirements for text of size {1}px and weight of {2}", + "potential_same_color": "The foreground text and its background color are both detected as {3}. Verify the text meets the WCAG AA requirements for minimum contrast", + "potential_graphic_background": "Verify the contrast ratio of the text against the lightest and the darkest colors of the background meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}", + "potential_text_shadow": "Verify the contrast ratio of the text with shadow meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "1.4.3", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: ['afw4f7'], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + // avoid diagnosing elements that are not visible + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || + (VisUtil_1.VisUtil.hiddenByDefaultElements != null && + VisUtil_1.VisUtil.hiddenByDefaultElements != undefined && + VisUtil_1.VisUtil.hiddenByDefaultElements.indexOf(nodeName) > -1)) { + return null; + } + //TODO ? should only consider native disabled, ignore aria-disabled + //skip disabled element + if (CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return null; + //skip elements + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["svg", "script", "meta", "style"])) + return null; + var doc = ruleContext.ownerDocument; + if (!doc) { + return null; + } + var win = doc.defaultView; + if (!win) { + return null; + } + // Ensure that this element has children with actual text. + var childStr = CommonUtil_1.CommonUtil.getNodeText(ruleContext); + if (!CommonUtil_1.CommonUtil.isShadowHostElement(ruleContext) || (CommonUtil_1.CommonUtil.isShadowHostElement(ruleContext) && CommonUtil_1.CommonUtil.getNodeText(ruleContext.shadowRoot) === '')) { + if (childStr.trim().length == 0) + return null; + // ignore if the text does not convey anything in human language + /** + * (1) ignore non-alphanumeric or special characters in ASCI: ^(a-zA-Z\d\s) + * (2) ignore non-printable unicode characters: \u0000-\u0008\u000B-\u001F\u007F-\u009F\u2000-\u200F\u2028-\u202F\u205F-\u206F\u3000\uFEFF + * see https://stackoverflow.com/questions/3770117/what-is-the-range-of-unicode-printable-characters + * (3) for now not consider unicode special characters that are different in different languages + */ + //let regex = /[^(a-zA-Z\d\s)\u0000-\u0008\u000B-\u001F\u007F-\u009F\u2000-\u200F\u2028-\u202F\u205F-\u206F\u3000\uFEFF]+/g; + var regex = /[^(a-zA-Z\d\s)\^(\u4e00-\u9fff\u3400-\u4dbf)\u0000-\u0008\u000B-\u001F\u007F-\u009F\u2000-\u200F\u2028-\u202F\u205F-\u206F\u3000\uFEFF]+/g; + childStr = childStr.trim().replace(regex, ''); + if (childStr.trim().length === 0) + return null; + } + var elem = ruleContext; + // the child elements (rather than shadow root) of a shadow host is either re-assigned to the shadow slot if the slot exists + // or not displayed, so shouldn't be checked from the light DOM, rather it should be checked as reassginged slot element(s) in the shadow DOM. + if (CommonUtil_1.CommonUtil.isShadowHostElement(ruleContext)) { + // if it's direct text of a shadow host + if (ruleContext.shadowRoot) { + for (var node = ruleContext.firstChild; node; node = node.nextSibling) { + if (node.nodeType == 3) { + //if multiple texts exist, only need to check one + elem = node.assignedSlot; + break; + } + } + } + if (elem === null) + return; + } + var style = win.getComputedStyle(elem); + // JCH clip INFO: + // The clip property lets you specify a rectangle to clip an absolutely positioned element. + // The rectangle specified as four coordinates, all from the top-left corner of the element to be clipped. + // Property values: + // none This is default. No clipping is done + // auto No clipping will be done + // shape The only valid value is: rect (top, right, bottom, left) + // e.g., clip: rect(10px, 20px, 30px, 40px); + // Note: the four values are in the same order as margin/padding + // The rect values are positive pixel values, e.g., 10px, etc. + // margin-box Uses the margin box as the reference box + // border-box Uses the border box as the reference box + // padding-box Uses the padding box as the reference box + // content-box + // fill-box + // stroke-box + // NOTE: the CSS clip property is deprecated + // Also: clip only works if the element is absolutely positioned and can only do rectangles + // check if element visible + var visible = true; + if (style.width !== "0" && + style.height !== "0" && + style.opacity !== "0" && + style.display !== 'none' && + style.visibility !== 'hidden' && + style.overflow !== 'hidden' && + // left and right work with all absolute units + (style.left === "auto" || (style.position === 'absolute' && parseInt(style.left.replace(/[^0-9.+-]/, '')) > 0)) && + (style.left === "auto" || (style.position === 'absolute' && parseInt(style.top.replace(/[^0-9.+-]/, '')) > 0))) { + visible = true; + // console.log("element IS visible"); + // console.log("CHECK COLOR CONTRAST unless to small"); + } + else { + visible = false; + // console.log("element NOT visible"); + } + if (visible === false) { + // console.log("DO NOT CHECK COLOR CONTRAST"); + return null; + } + var clipHeight = -1; + if (style.clip !== "auto") { + var clipString = style.clip.toString(); + if (clipString.includes("rect")) { + var reBrackets = /\((.*)\)/g; + var listOfText = []; + var found = reBrackets.exec(clipString); + var foundArr = found[1].split(', '); + for (var i = 0; i < foundArr.length; i++) { + // console.log("foundArr[",i,"] = ",foundArr[i]); + listOfText.push(foundArr[i]); + } + ; + } + // console.log("listOfText = ",listOfText); + clipHeight = parseInt(listOfText[0].replace(/px/g, '')) - parseInt(listOfText[2].replace(/px/g, '')); + clipHeight = Math.abs(clipHeight); + } + // JCH clip-path INFO: + // Excellent article on clip-path: https://ishadeed.com/article/clip-path/ + // clip-path is a totally different animal with many, many different variations + // The goal was for it to not be as limited as clip + // The syntax is more complicated (as it does more) and it is different from clip, + // e.g., the above clip rectangle would be clip-path: inset(10px 20px 30px 40px); + // Note: there are no commas + // Also, it can take single values to make all sides the same, or 2 values (vert/hori). + // or 3 values (top/hori/bottom) + // And percentages can works as well as px + // + // Although there are five different shapes: inset (term used for rectangle), circle, + // ellipse, polygon, path - we will only concern ourselves with inset + // There are 7 box values: margin-box, border-box, padding-box, content-box, fill-box, stroke-box, view-box + // Box and shape values may be combined: clip-path: padding-box circle(50px at 0 100px); + // NOTE: the box values are NOT intuitive, see: https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Shapes/From_box_values#margin-box + // + // So the key question is what amount of effort do we want to invest into clip-path + // + // JCH don't do clip-path now + var clipPathHeight = -1; + // if (style.clipPath !== "auto") { + // console.log("style.clipPath = ",style.clipPath); + // console.log("style.clipPath.toString = ",style.clipPath.toString()); + // let clipString = style.clipPath.toString(); + // if (clipString.includes("inset")) { + // var reBrackets = /\((.*)\)/g; + // var listOfText = []; + // var found = reBrackets.exec(clipString); + // var foundArr = found[1].split(' '); + // for (let i=0; i<foundArr.length; i++) { + // console.log("foundArr[",i,"] = ",foundArr[i]); + // listOfText.push(foundArr[i]); + // }; + // } + // console.log("listOfText = ",listOfText); + // clipPathHeight = parseInt(listOfText[0].replace(/px/g, '')) - parseInt(listOfText[2].replace(/px/g, '')); + // clipPathHeight = Math.abs(clipHeight); + // } + // console.log("clipPathHeight = ", clipPathHeight); + // if (style.position === "absolute" && style.clip === "rect(0px, 0px, 0px, 0px)" && style.overflow !== "visible") { + // JCH arbitrarily use less that 7px for clipHeight + if (style.position === "absolute" && clipHeight < 7 && clipHeight !== -1) { + // console.log("DO NOT CHECK COLOR CONTRAST because too small"); + // Corner case where item is hidden (accessibility hiding technique) + return null; + } + // First determine the color contrast ratio + var colorCombo = ColorUtil_1.ColorUtil.ColorCombo(elem); + if (colorCombo === null) { + //some exception occurred, or not able to get color combo for some reason + console.log("unable to get color combo for element: " + elem.nodeName); + return; + } + var fg = colorCombo.fg; + var bg = colorCombo.bg; + var ratio = fg.contrastRatio(bg); + var weight = CSSUtil_1.CSSUtil.getWeightNumber(style.fontWeight); + var size = CSSUtil_1.CSSUtil.getFontInPixels(style.fontSize, elem); + var isLargeScale = size >= 24 || size >= 18.6 && weight >= 700; + if (CSSUtil_1.CSSUtil.containsCKJ(childStr)) { + // https://github.com/act-rules/act-rules.github.io/pull/2121/files + // for CJK, 22 pt or 18 pt with font-weight >= 700, 1pt = 1.333 px + isLargeScale = size >= 29.3 || size >= 24 && weight >= 700; + } + var passed = ratio >= 4.5 || (ratio >= 3 && isLargeScale); + var hasBackground = colorCombo.hasBGImage || colorCombo.hasGradient; + var textShadow = colorCombo.textShadow; + var isDisabled = CommonUtil_1.CommonUtil.isNodeDisabled(elem); + if (!isDisabled) { + var control = CommonUtil_1.CommonUtil.getControlOfLabel(elem); + if (control) { + isDisabled = CommonUtil_1.CommonUtil.isNodeDisabled(control); + } + } + if (!isDisabled && nodeName === 'label' && CommonUtil_1.CommonUtil.isDisabledByFirstChildFormElement(elem)) { + isDisabled = true; + } + if (!isDisabled && ruleContext.hasAttribute("id") && CommonUtil_1.CommonUtil.isDisabledByReferringElement(elem)) { + isDisabled = true; + } + /**setCache(ruleContext, "EXT_Color_Contrast_WCAG2AA", { + "ratio": ratio, + "isLargeScale": isLargeScale, + "weight": weight, + "size": size, + "hasBackground": hasBackground, + "isDisabled": isDisabled + });*/ + // If element or parent is disabled, this rule does not apply (but may be 3:1 in future) + if (!passed && isDisabled) { + passed = true; + } + if (!passed) { + if (hasBackground) { + // fire potential since a text on an image or gradient may be still viewable, depending on the text location on the gradient or image + return (0, IRule_1.RulePotential)("potential_graphic_background", [ratio.toFixed(2), size, weight]); + // removed by dead control flow + + } + else if (textShadow) { + // fire potential since a text with shadow may be still viewable, depending on the shadow efffects + return (0, IRule_1.RulePotential)("potential_text_shadow", [ratio.toFixed(2), size, weight]); + // removed by dead control flow + + } + else { + if (fg.toHex() === bg.toHex()) { + return (0, IRule_1.RulePotential)("potential_same_color", [ratio.toFixed(2), size, weight, fg.toHex(), bg.toHex(), colorCombo.hasBGImage, colorCombo.hasGradient]); + } + else { + return (0, IRule_1.RuleFail)("fail_contrast", [ratio.toFixed(2), size, weight, fg.toHex(), bg.toHex(), colorCombo.hasBGImage, colorCombo.hasGradient]); + } + } + } + else { + return (0, IRule_1.RulePass)("pass", [ratio.toFixed(2), size, weight, fg.toHex(), bg.toHex(), colorCombo.hasBGImage, colorCombo.hasGradient]); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/text_quoted_correctly.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/text_quoted_correctly.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.text_quoted_correctly = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.text_quoted_correctly = { + id: "text_quoted_correctly", + context: "dom:*", + help: { + "en-US": { + "Pass_0": "text_quoted_correctly.html", + "Potential_1": "text_quoted_correctly.html", + "group": "text_quoted_correctly.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "If the following text is a quotation, mark it as a <q> or <blockquote> element: {0}", + "group": "Quotations should be marked with <q> or <blockquote> elements" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // ignore the check if the node is hidden + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext)) + return null; + // Don't trigger if the element is not in the body + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["body"]) === null) + return null; + var validateParams = { + minWords: { + value: 3, + type: "integer" + } + }; + var minWords = validateParams.minWords.value; + var passed = true; + var walkNode = ruleContext.firstChild; + var violatedtext = null; + // ignore the check for the text of the following elements + var ignored = ["blockquote", "q", "script", "style", "pre", "code", "ruby", "samp"]; + while (passed && walkNode) { + // Comply to the Check Hidden Content setting will be done by default as this rule triggers on each element + // and for each element it only checks that single elements text nodes and nothing else. So all inner elements will be + // covered on their own. Currently for this rule by default Check Hidden Content will work, as we are doing + // a node walk only on siblings so it would not get text nodes from other siblings at all. + // In the case in the future something chnges, just need to add && !RPTUtil.shouldNodeBeSkippedHidden(walkNode) to the below + // if. + if (walkNode.nodeName === "#text") { + var txtVal = walkNode.nodeValue; + // Do the regex tests first - should be fast + // Remove apostrophe's + txtVal = txtVal.replace(/(\S)'(\S)/g, "$1$2"); + var dblQuotes = txtVal.match(/("[^"]+")/g); + var snglQuotes = txtVal.match(/('[^']+')/g); + // Walk the parents - only continue testing if we found a quote, but + // we're not already marked up + // Also skip if we're in a script - there's lots of quotes used in scripts + if ((dblQuotes !== null || snglQuotes !== null) && + CommonUtil_1.CommonUtil.getAncestor(walkNode, ignored) === null) { + if (dblQuotes != null) { + for (var i = 0; passed && i < dblQuotes.length; ++i) + passed = CommonUtil_1.CommonUtil.wordCount(dblQuotes[i]) < minWords; + } + if (snglQuotes != null) { + for (var i = 0; passed && i < snglQuotes.length; ++i) + passed = CommonUtil_1.CommonUtil.wordCount(snglQuotes[i]) < minWords; + } + // Remove any linefeed inside the quote + // violatedtext = txtVal.replace(new RegExp("\\r?\\n|\\r","g"),""); + if (dblQuotes === null) { + violatedtext = snglQuotes.join(", ").replace(new RegExp("\\r?\\n|\\r", "g"), ""); + } + else if (snglQuotes === null) { + violatedtext = dblQuotes.join(", ").replace(new RegExp("\\r?\\n|\\r", "g"), ""); + } + else { + violatedtext = dblQuotes.concat(snglQuotes).join(", ").replace(new RegExp("\\r?\\n|\\r", "g"), ""); + } + } + } + walkNode = walkNode.nextSibling; + } + //if the violatedtext is longer than 69 chars, only keep the first 32, the " ... ", and the last 32 chars + if (!passed && violatedtext.length && violatedtext.length > 69) { + violatedtext = violatedtext.substring(0, 32) + " ... " + violatedtext.substring(violatedtext.length - 32); + } + return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RulePotential)("Potential_1", [violatedtext]); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/text_sensory_misuse.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/text_sensory_misuse.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.text_sensory_misuse = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.text_sensory_misuse = { + id: "text_sensory_misuse", + context: "dom:body, dom:body dom:*", + refactor: { + "RPT_Text_SensoryReference": { + // "Pass_0": "pass", + "Potential_1": "potential_position, potential_other" + } + }, + help: { + "en-US": { + // "pass": "text_sensory_misuse.html", + "potential_position": "text_sensory_misuse.html", + "potential_other": "text_sensory_misuse.html", + "group": "text_sensory_misuse.html" + } + }, + messages: { + "en-US": { + // "pass": "Instructions are meaningful without relying solely on shape, size, or location words", + "potential_position": "Confirm the word(s) '{0}' of the user instruction is used to indicate a logical rather than visual position", + "potential_other": "Confirm the user instruction is still understandable without the word(s) '{0}'", + "group": "Instructions should be meaningful without relying solely on shape, size, or location words" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.3"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Extract the nodeName of the context node + var nodeName = ruleContext.nodeName.toLowerCase(); + //skip the check if the element is hidden or disabled + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext) || VisUtil_1.VisUtil.hiddenByDefaultElements.includes(nodeName)) + return null; + // Don't trigger if we're not in the body or if we're in a script + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["body"]) === null) + return null; + // ignore script, link, label and their child elements + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["script", "a", 'label']) !== null) + return null; + // ignore text on landmark roles, but not on their children (e.g., section, main) + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + if (role) { + var lmRoles = AriaUtil_1.AriaUtil.getRolesWithTypes(ruleContext, ["landmark"]); + if (lmRoles && lmRoles.includes(role)) + return null; + } + // ignore all widgets and headings, and their children, and certain structure roles + var roles = AriaUtil_1.AriaUtil.getRolesWithTypes(ruleContext, ["widget", "heading"]); + // add some structure roles + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(["caption", "cell", "code", "columnheader", "definition", "figure", "list", "listitem", "math", "meter", "row", "rowgroup", "rowheader", "term"], roles); + if (AriaUtil_1.AriaUtil.getAncestorWithRoles(ruleContext, roles) !== null) + return null; + var violatedPositionText = ""; + var violatedOtherText = ""; + var walkNode = ruleContext.firstChild; + var txtVal = ""; + while (walkNode) { + // for each element it only checks that single elements text nodes and nothing else. + // all inner elements will be covered on their own. + // whitespace characters (space, newline, tab) between elements are considered a node too. + if (walkNode.nodeName === "#text") { + var txt = walkNode.nodeValue.trim(); + if (txt.length > 0) + txtVal += (txtVal.length > 0 ? ", " + txt : txt); + } + walkNode = walkNode.nextSibling; + } + if (txtVal.length > 0) { + // first to remove each exempt word with a single space in the text + var exemptRegex = getRegex(ruleContext.ownerDocument, "exemptText"); + txtVal = txtVal.replace(exemptRegex, " "); + violatedPositionText = getViolatedText(ruleContext.ownerDocument, "positionText", txtVal); + violatedOtherText = getViolatedText(ruleContext.ownerDocument, "otherText", txtVal); + } + var ret = []; + if (violatedPositionText) + ret.push((0, IRule_1.RulePotential)("potential_position", [violatedPositionText])); + if (violatedOtherText) + ret.push((0, IRule_1.RulePotential)("potential_other", [violatedOtherText])); + return ret.length == 0 ? null : ret; + } +}; +var validateParams = { + positionText: { + value: ["top-left", "top-right", "bottom-right", "bottom-left", + "top-to-bottom", "left-to-right", "bottom-to-top", "right-to-left", + "right", "left", "above", "below", "top", "bottom", + "upper", "lower", "corner", "beside" + ], + type: "[string]" + }, + otherText: { + value: ["round", "square", "shape", "rectangle", "triangle", + "size", "large", "small", "medium", "big", "huge", "tiny", "extra", + "larger", "smaller", "bigger", "little", "largest", "smallest", "biggest" + ], + type: "[string]" + }, + exemptText: { + value: ["right-click", "left-click", "right-clicking", "right-clicks", + "left-clicking", "left-clicks", "square root", "right now", "off the top" //append as needed + ], + type: "[string]" + } +}; +function getRegex(doc, type) { + if (!validateParams[type]) + return ""; + var sensoryRegex = CacheUtil_1.CacheUtil.getCache(doc, type + "_sensory_misuse", null); + if (sensoryRegex == null) { + var sensoryText = validateParams[type].value; + var regexStr = "(\s\s+|" + sensoryText[0]; + for (var j = 1; j < sensoryText.length; ++j) { + var words = sensoryText[j].trim().split(" "); + regexStr += "|" + words[0]; + if (words.length > 1) { + for (var c = 1; c < words.length; ++c) + regexStr += " +" + words[c]; + } + } + //regexStr += ")\\W"; + regexStr += ")"; + sensoryRegex = new RegExp(regexStr, "gi"); + CacheUtil_1.CacheUtil.setCache(doc, type + "_sensory_misuse", sensoryRegex); + } + return sensoryRegex; +} +function getViolatedText(doc, type, txtVal) { + if (!txtVal) + return ""; + var sensoryTextArr = validateParams[type].value; + var hash = {}, result = []; + // split the string into words + var counts = txtVal.split(/\s+/).reduce(function (map, word) { + var wordWoTrailingPunc = word.replace(/[.?!:;()'",`\]]+$/, ""); + var lcWordWoPunc = word.toLowerCase().replace(/[.?!:;()'",`\]]/g, ""); + for (var counter = 0; counter < sensoryTextArr.length; counter++) { + var a = lcWordWoPunc.indexOf(sensoryTextArr[counter]); + var sensoryWordLen = sensoryTextArr[counter].length; + var charFollowSensoryText = lcWordWoPunc.charAt(sensoryWordLen + a); + // If the word does not contains substring of sensoryTextArr[counter] + // proceed to the next loop iteration for next sensoryText. + if (a < 0) { + continue; + } + //check the following and proceeding punctuations + //let isPuncfollowing = ((charFollowSensoryText == '\-') || + var isPuncfollowing = ((charFollowSensoryText == '\.') || + (charFollowSensoryText == '\?') || (charFollowSensoryText == '\!') || + (charFollowSensoryText == '\:') || (charFollowSensoryText == '\;') || + (charFollowSensoryText == '\(') || (charFollowSensoryText == '\)') || + (charFollowSensoryText == '\'') || (charFollowSensoryText == '\"') || + (charFollowSensoryText == '\,') || (charFollowSensoryText == '.\`') || + (charFollowSensoryText == '\\') || (charFollowSensoryText == '\]')); + var isPuncPreceding = false; + if (a > 0) { + var charPrecedeSensoryText = lcWordWoPunc.charAt(a - 1); + isPuncPreceding = ((charPrecedeSensoryText == '\-') || + (charPrecedeSensoryText == '\.') || + (charPrecedeSensoryText == '\?') || (charPrecedeSensoryText == '\!') || + (charPrecedeSensoryText == '\:') || (charPrecedeSensoryText == '\;') || + (charPrecedeSensoryText == '\(') || (charPrecedeSensoryText == '\)') || + (charPrecedeSensoryText == '\'') || (charPrecedeSensoryText == '\"') || + (charPrecedeSensoryText == '\,') || (charPrecedeSensoryText == '.\`') || + (charPrecedeSensoryText == '\\') || (charPrecedeSensoryText == '\]')); + } + if (((lcWordWoPunc.length == sensoryWordLen) || (isPuncfollowing == true) || (isPuncPreceding == true))) { + if (!hash.hasOwnProperty(wordWoTrailingPunc)) { + hash[wordWoTrailingPunc] = true; + result.push(wordWoTrailingPunc); + } + counter = sensoryTextArr.length; + } + } + map[wordWoTrailingPunc] = (map[wordWoTrailingPunc] || 0) + 1; + return map; + }, Object.create(null)); + return result.join(", "); +} + + +/***/ }, + +/***/ "./src/v4/rules/text_spacing_valid.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/text_spacing_valid.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.text_spacing_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var CSSUtil_1 = __webpack_require__(/*! ../util/CSSUtil */ "./src/v4/util/CSSUtil.ts"); +var DOMMapper_1 = __webpack_require__(/*! ../../v2/dom/DOMMapper */ "./src/v2/dom/DOMMapper.ts"); +// Module-level constants +var STYLE_VALUE_REGEX = /(-?[\d.]+)([a-z%]*)/; +var MIN_WORD_SPACING_RATIO = 0.16; +var MIN_LETTER_SPACING_RATIO = 0.12; +var MIN_LINE_HEIGHT_RATIO = 1.5; +var IMPORTANT_SUFFIX = "!important"; +var IMPORTANT_SUFFIX_LENGTH = IMPORTANT_SUFFIX.length + 1; // +1 for the space before !important +/** + * Resolves inherited or unset style values by traversing up the DOM tree + * @param element - The element to resolve the style for + * @param property - The CSS property name + * @param currentValue - The current style value + * @returns The resolved style value + */ +function resolveInheritedStyle(element, property, currentValue) { + var _a; + if (currentValue.startsWith('inherit') || currentValue.startsWith('unset')) { + var ancestor = CSSUtil_1.CSSUtil.getAncestorWithStyles(element.parentElement, (_a = {}, _a[property] = ["*"], _a), ['inherit', 'unset']); + if (ancestor !== null) { + return CSSUtil_1.CSSUtil.getDefinedStyles(ancestor, [property])[property]; + } + else if (currentValue.startsWith('unset')) { + return "initial"; + } + } + return currentValue; +} +/** + * Removes the !important suffix from a style value + * @param styleValue - The style value potentially containing !important + * @returns The style value without !important + */ +function removeImportantSuffix(styleValue) { + return styleValue.substring(0, styleValue.length - IMPORTANT_SUFFIX_LENGTH); +} +/** + * Checks if a spacing property violates accessibility requirements + * @param element - The HTML element being checked + * @param property - The CSS property name (word-spacing, letter-spacing, line-height) + * @param styleValue - The current style value + * @param fontSize - The computed font size in pixels + * @param minRatio - The minimum ratio threshold + * @param allowUnitless - Whether unitless values are allowed (for line-height) + * @returns RuleResult indicating pass or fail + */ +function checkSpacingProperty(element, property, styleValue, fontSize, minRatio, allowUnitless) { + if (allowUnitless === void 0) { allowUnitless = false; } + // Check if !important is used + if (element.style.getPropertyPriority(property) !== 'important') { + return true; + } + // Remove !important suffix + var cleanValue = removeImportantSuffix(styleValue); + // Check for initial or normal values (computed space is 0) + if (cleanValue === 'initial' || cleanValue === 'normal') { + return false; + } + // Parse the numeric value + var numericValue = parseFloat(cleanValue); + if (isNaN(numericValue)) { + return true; + } + // Match value and unit + var parsedValue = cleanValue.trim().match(STYLE_VALUE_REGEX); + if (!parsedValue) { + return true; + } + var value = parsedValue[1], unit = parsedValue[2]; + // Handle unitless values (only for line-height) + if (unit === '') { + if (allowUnitless) { + return parseFloat(value) < minRatio ? false : true; + } + // For other properties, zero value without unit is ignored + if (parseFloat(value) === 0) { + return null; + } + } + // Skip if no unit and non-zero (error case, inapplicable) + if (unit === '' && parseFloat(value) !== 0) { + return null; + } + // Convert to pixels and check ratio + var pixels = CSSUtil_1.CSSUtil.convertValue2Pixels(unit, value, element); + if (pixels !== null && pixels / fontSize < minRatio) { + return false; + } + return true; +} +exports.text_spacing_valid = { + id: "text_spacing_valid", + context: "dom:*", + help: { + "en-US": { + "pass": "text_spacing_valid.html", + "group": "text_spacing_valid.html", + "fail_letter_spacing_style": "text_spacing_valid.html", + "fail_word_spacing_style": "text_spacing_valid.html", + "fail_line_height_style": "text_spacing_valid.html" + } + }, + messages: { + "en-US": { + "pass": "CSS !important is not used in inline style to control letter or word spacing or line height", + "group": "CSS !important should not be used in inline style to control letter or word spacing or line height", + "fail_letter_spacing_style": "CSS !important should not be used in inline ‘letter-spacing’ style", + "fail_word_spacing_style": "CSS !important should not be used in inline ‘word-spacing’ style", + "fail_line_height_style": "CSS !important should not be used in inline ‘line-height’ style" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.4.12"], + "level": IRule_1.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_1.eToolkitLevel.LEVEL_THREE + }], + act: ['9e45ec', '24afc2', '78fd32'], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Ensure that this element has children with actual text + var childStr = ""; + var childNodes = ruleContext.childNodes; + for (var i = 0; i < childNodes.length; ++i) { + if (childNodes[i].nodeType === 3) { // Text node + childStr += childNodes[i].nodeValue; + } + } + if (childStr.trim().length === 0) { + return null; + } + // Skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) { + return null; + } + // Skip the check if the element is off screen + var mapper = new DOMMapper_1.DOMMapper(); + var bounds = mapper.getUnadjustedBounds(ruleContext); + if (!bounds || bounds['top'] < 0 || bounds['left'] < 0) { + return null; + } + // Skip non-HTML elements (e.g., SVG) + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, "svg")) { + return null; + } + // Font size always resolved to 'px' + var computedStyle = getComputedStyle(ruleContext); + var fontSize = parseFloat(computedStyle.getPropertyValue('font-size')); + // Early exit optimization: Check if computed styles already pass + // If all three properties have passing values, we can skip the expensive getDefinedStyles call + var computedWordSpacing = computedStyle.getPropertyValue('word-spacing'); + var computedLetterSpacing = computedStyle.getPropertyValue('letter-spacing'); + var computedLineHeight = computedStyle.getPropertyValue('line-height'); + // Check if computed values pass the requirements + var wordSpacingPasses = true; + var letterSpacingPasses = true; + var lineHeightPasses = true; + // Check word-spacing (ignore 0px which represents default/normal) + if (computedWordSpacing) { + var wordValue = parseFloat(computedWordSpacing); + if (!isNaN(wordValue)) { + var wordPixels = CSSUtil_1.CSSUtil.convertValue2Pixels('px', wordValue.toString(), ruleContext); + if (wordPixels !== null && wordPixels / fontSize < MIN_WORD_SPACING_RATIO) { + wordSpacingPasses = false; + } + } + } + // Check letter-spacing (ignore 0px which represents default/normal) + if (computedLetterSpacing) { + var letterValue = parseFloat(computedLetterSpacing); + if (!isNaN(letterValue)) { + var letterPixels = CSSUtil_1.CSSUtil.convertValue2Pixels('px', letterValue.toString(), ruleContext); + if (letterPixels !== null && letterPixels / fontSize < MIN_LETTER_SPACING_RATIO) { + letterSpacingPasses = false; + } + } + } + // Check line-height + if (computedLineHeight) { + var lineValue = parseFloat(computedLineHeight); + if (!isNaN(lineValue)) { + // Line height can be unitless or in pixels + var match = computedLineHeight.match(STYLE_VALUE_REGEX); + if (match) { + var value = match[1], unit = match[2]; + if (unit === '' || unit === 'px') { + var ratio = unit === '' ? parseFloat(value) : parseFloat(value) / fontSize; + if (ratio < MIN_LINE_HEIGHT_RATIO) { + lineHeightPasses = false; + } + } + } + } + } + // If all computed values pass, we can skip the expensive getDefinedStyles check + if (wordSpacingPasses && letterSpacingPasses && lineHeightPasses) { + return null; + } + // Get defined styles to check for !important declarations + var styles = CSSUtil_1.CSSUtil.getDefinedStyles(ruleContext, ["word-spacing", "letter-spacing", "line-height"]); + if (Object.keys(styles).length === 0) { + return null; + } + var results = []; + // Check word-spacing + var wordStyle = styles['word-spacing']; + if (wordStyle) { + wordStyle = resolveInheritedStyle(ruleContext, 'word-spacing', wordStyle); + var result = checkSpacingProperty(ruleContext, 'word-spacing', wordStyle, fontSize, MIN_WORD_SPACING_RATIO); + results.push(result ? (0, IRule_1.RulePass)("pass") : (0, IRule_1.RuleFail)('fail_word_spacing_style')); + } + // Check letter-spacing + var letterStyle = styles['letter-spacing']; + if (letterStyle) { + letterStyle = resolveInheritedStyle(ruleContext, 'letter-spacing', letterStyle); + var result = checkSpacingProperty(ruleContext, 'letter-spacing', letterStyle, fontSize, MIN_LETTER_SPACING_RATIO); + results.push(result ? (0, IRule_1.RulePass)("pass") : (0, IRule_1.RuleFail)('fail_letter_spacing_style')); + } + // Check line-height (only if no scrollable ancestor) + var lineStyle = styles['line-height']; + var overflowStyles = { + "overflow": ['auto', 'scroll'], + "overflow-x": ['auto', 'scroll'], + "overflow-y": ['auto', 'scroll'] + }; + if (lineStyle && CSSUtil_1.CSSUtil.getAncestorWithStyles(ruleContext, overflowStyles) === null) { + lineStyle = resolveInheritedStyle(ruleContext, 'line-height', lineStyle); + var result = checkSpacingProperty(ruleContext, 'line-height', lineStyle, fontSize, MIN_LINE_HEIGHT_RATIO, true // Allow unitless values for line-height + ); + results.push(result ? (0, IRule_1.RulePass)("pass") : (0, IRule_1.RuleFail)('fail_line_height_style')); + } + return results.length > 0 ? results : null; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/text_whitespace_valid.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/text_whitespace_valid.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.text_whitespace_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.text_whitespace_valid = { + id: "text_whitespace_valid", + context: "dom:*", + help: { + "en-US": { + "pass": "text_whitespace_valid.html", + "potential_text": "text_whitespace_valid.html", + "group": "text_whitespace_valid.html" + } + }, + messages: { + "en-US": { + "pass": "Rule Passed", + "potential_text": "Space characters should not be used to create space between the letters of a word", + "group": "Space characters should not be used to control spacing within a word" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Don't trigger if we're not in the body or if we're in a script + var checkAncestor = CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["body", "script", "code"]); + if (checkAncestor == null || checkAncestor.nodeName.toLowerCase() != "body") + return null; + var passed = true; + var walkNode = ruleContext.firstChild; + while (passed && walkNode) { + // Comply to the Check Hidden Content setting will be done by default as this rule triggers on each element + // and for each element it only checks that single elements text nodes and nothing else. So all inner elements will be + // covered on their own. Currently for this rule by default Check Hidden Content will work, as we are doing + // a node walk only on siblings so it would not get text nodes from other siblings at all. + // In the case in the future something chnges, just need to add && !RPTUtil.shouldNodeBeSkippedHidden(walkNode) to the below + // if. + if (walkNode.nodeName == "#text") { + var txtVal = walkNode.nodeValue; + passed = !(/(^|\s)[a-zA-Z] [a-zA-Z] [a-zA-Z]($|\s)/.test(txtVal)); + } + walkNode = walkNode.nextSibling; + } + if (passed) + return (0, IRule_1.RulePass)("pass"); + return (0, IRule_1.RulePotential)("potential_text"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/widget_tabbable_exists.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/widget_tabbable_exists.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.widget_tabbable_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var ARIAMapper_1 = __webpack_require__(/*! ../../v2/aria/ARIAMapper */ "./src/v2/aria/ARIAMapper.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.widget_tabbable_exists = { + id: "widget_tabbable_exists", + context: "aria:button,aria:link,aria:spinbutton,aria:tablist,aria:combobox,aria:listbox,aria:menu,aria:radiogroup,aria:tree,aria:menubar, aria:grid, aria:treegrid, aria:checkbox,aria:slider,aria:spinbutton,aria:textbox,aria:scrollbar,aria:slider,aria:spinbutton", + refactor: { + "IBMA_Focus_Tabbable": { + "pass": "pass", + "fail_no_tabbable": "fail_no_tabbable" + } + }, + help: { + "en-US": { + "pass": "widget_tabbable_exists.html", + "fail_no_tabbable": "widget_tabbable_exists.html", + "group": "widget_tabbable_exists.html" + } + }, + messages: { + "en-US": { + "pass": "Rule Passed", + "fail_no_tabbable": "Component with \"{0}\" role does not have a tabbable element", + "group": "Component must have at least one tabbable element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip the check if the element should be a presentational child of an element + if (AriaUtil_1.AriaUtil.shouldBePresentationalChild(ruleContext)) + return; + var nodeName = ruleContext.nodeName.toLowerCase(); + //ignore datalist element check since it will be part of a input element or hidden by default + if (nodeName === 'datalist') + return null; + // Composite user interface widget roles. They act as containers that manage other, contained widgets. + var roleContainers = ["combobox", "grid", "listbox", "menu", "menubar", "radiogroup", "tablist", "tree", "treegrid"]; + for (var _i = 0, roleContainers_1 = roleContainers; _i < roleContainers_1.length; _i++) { + var role_1 = roleContainers_1[_i]; + if (AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, role_1, true) != null) + // it's a descendant of a composite widget already examined + return null; + } + var role = ARIAMapper_1.ARIAMapper.nodeToRole(ruleContext); + var count = 0; + if (CommonUtil_1.CommonUtil.isTabbable(ruleContext)) { + ++count; + } + // If node has children, look for tab stops in the children + // skip the count if the element requires presentational children only + if (count < 1 && !AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(ruleContext) && ruleContext.firstChild) { + var nw = new DOMWalker_1.DOMWalker(ruleContext); + while (count < 1 && nw.nextNode() && nw.node != ruleContext) { + if (nw.node.nodeType == 1 && !nw.bEndTag && CommonUtil_1.CommonUtil.isTabbable(nw.node)) { + ++count; + } + } + } + var passed = count >= 1; + return passed ? (0, IRule_1.RulePass)("pass") : (0, IRule_1.RulePotential)("fail_no_tabbable", [role]); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/widget_tabbable_single.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/widget_tabbable_single.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.widget_tabbable_single = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var ARIAMapper_1 = __webpack_require__(/*! ../../v2/aria/ARIAMapper */ "./src/v2/aria/ARIAMapper.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.widget_tabbable_single = { + id: "widget_tabbable_single", + context: "aria:button,aria:link,aria:menuitem,aria:spinbutton,aria:tablist,aria:combobox,aria:listbox,aria:menu,aria:radiogroup,aria:tree,aria:checkbox,aria:option,aria:radio,aria:slider,aria:spinbutton,aria:textbox,aria:columnheader,aria:rowheader,aria:slider,aria:tab", + refactor: { + "IBMA_Focus_MultiTab": { + "pass": "pass", + "potential_multiple_tabbable": "potential_multiple_tabbable" + } + }, + help: { + "en-US": { + "pass": "widget_tabbable_single.html", + "potential_multiple_tabbable": "widget_tabbable_single.html", + "group": "widget_tabbable_single.html" + } + }, + messages: { + "en-US": { + "pass": "Components with a widget role should have no more than one tabbable element", + "potential_multiple_tabbable": "Component with \"{0}\" role has more than one tabbable element", + "group": "Components with a widget role must have no more than one tabbable element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1", "2.4.3"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip the check if the element should be a presentational child of an element + if (AriaUtil_1.AriaUtil.shouldBePresentationalChild(ruleContext)) + return; + var role = ARIAMapper_1.ARIAMapper.nodeToRole(ruleContext); + var count = 0; + if (CommonUtil_1.CommonUtil.isTabbable(ruleContext)) { + ++count; + } + // If node has children, look for tab stops in the children + //skip the count if the element requires presentational children only + var name = []; + if (count < 2 && !AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(ruleContext) && ruleContext.firstChild) { + var nw = new DOMWalker_1.DOMWalker(ruleContext); + while (count < 2 && nw.nextNode() && nw.node != ruleContext) { + if (nw.node.nodeType == 1 && !nw.bEndTag && CommonUtil_1.CommonUtil.isTabbable(nw.node)) { + // Radio inputs with the same name natively are only one tab stop + /**if (nw.node.nodeName.toLowerCase() === 'input' && (nw.node as Element).getAttribute("type") === 'radio') { + let curName = (nw.node as Element).getAttribute("name"); + if (name.includes(curName)) + continue; + else + name.push(curName); + }*/ + ++count; + } + } + } + var passed = count < 2; + if (!passed) + CacheUtil_1.CacheUtil.setCache(ruleContext, "widget_tabbable_single", "potential_multiple_tabbable"); + return passed ? (0, IRule_1.RulePass)("pass") : (0, IRule_1.RulePotential)("potential_multiple_tabbable", [role]); + } +}; + + +/***/ }, + +/***/ "./src/v4/rulesets.ts" +/*!****************************!*\ + !*** ./src/v4/rulesets.ts ***! + \****************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.a11yRulesets = void 0; +// This file comes from https://raw.githubusercontent.com/act-rules/act-tools/main/src/data/sc-urls.json +var SCURLs = __importStar(__webpack_require__(/*! ./sc-urls.json */ "./src/v4/sc-urls.json")); +var IGuideline_1 = __webpack_require__(/*! ./api/IGuideline */ "./src/v4/api/IGuideline.ts"); +var SCs = []; +for (var key in SCURLs) { + SCs.push(SCURLs[key]); +} +var summaries = { + "1.1.1": "All non-text content that is presented to the user has a text alternative that serves the equivalent purpose.", + "1.2.1": "For prerecorded audio-only or video-only media, an alternative provides equivalent information.", + "1.2.2": "Captions are provided for all prerecorded audio content in synchronized media.", + "1.2.3": "An alternative for time-based media or audio description of the prerecorded video content is provided for synchronized media.", + "1.2.4": "Captions are provided for all live audio content in synchronized media.", + "1.2.5": "Audio description is provided for all prerecorded video content in synchronized media.", + "1.3.1": "Information, structure, and relationships conveyed through presentation can be programmatically determined or are available in text.", + "1.3.2": "When the sequence in which content is presented affects its meaning, a correct reading sequence can be programmatically determined.", + "1.3.3": "Instructions provided for understanding and operating content do not rely solely on sensory characteristics of components such as shape, size, visual location, orientation, or sound.", + "1.3.4": "Content does not restrict its view and operation to a single display orientation, such as portrait or landscape.", + "1.3.5": "The purpose of each input field that collects information about the user can be programmatically determined when the field serves a common purpose.", + "1.4.1": "Color is not used as the only visual means of conveying information, indicating an action, prompting a response, or distinguishing a visual element.", + "1.4.2": "If any audio plays automatically for more than 3 seconds, either a mechanism is available to pause or stop the audio, or a mechanism is available to control audio volume independently from the overall system volume level.", + "1.4.3": "The visual presentation of text and images of text has a contrast ratio of at least 4.5:1, with a 3:1 ratio for large-scale text.", + "1.4.4": "Text can be resized without assistive technology up to 200 percent without loss of content or functionality.", + "1.4.5": "If the technologies being used can achieve the visual presentation, text should not be used to convey information rather than images of text.", + "1.4.10": "Content can reflow without loss of information or functionality, and without requiring scrolling in two dimensions.", + "1.4.11": "The parts of graphical objects required to understand the content, and the visual information required to identify UI components and states, have a contrast ratio of at least 3:1 against adjacent colors.", + "1.4.12": "No loss of content or functionality occurs when users change letter, word and paragraph spacing, as well as line height.", + "1.4.13": "Where hover or focus actions cause additional content to become visible and hidden, the additional content is dismissable, hoverable and persistent.", + "2.1.1": "All functionality of the content is operable through a keyboard interface without requiring specific timings for individual keystrokes.", + "2.1.2": "If keyboard focus can be moved to a component using a keyboard interface, then focus can be moved away from that component using only a keyboard interface, and, if it requires more than unmodified arrow or tab keys or other standard exit methods, the user is advised of the method for moving focus away.", + "2.1.4": "If a keyboard shortcut is implemented using only letter, punctuation, number or symbol characters, then the shortcut can be turned off, remapped or activated only on focus.", + "2.2.1": "For each time limit that is set by the content, the user can turn off, adjust, or extend the limit.", + "2.2.2": "For moving, blinking, scrolling, or auto-updating information, the user can pause, stop, hide or adjust the information.", + "2.3.1": "Content does not contain anything that flashes more than three times in any one second period, or the flash is below the general flash and red flash thresholds.", + "2.4.1": "A mechanism is available to bypass blocks of content that are repeated on multiple Web pages.", + "2.4.2": "Web pages, non-web documents, and software have titles that describe topic or purpose.", + "2.4.3": "If content can be navigated sequentially and the navigation sequences affect meaning or operation, focusable components receive focus in an order that preserves meaning and operability.", + "2.4.4": "The purpose of each link can be determined from the link text alone or from the link text together with its programmatically determined link content.", + "2.4.5": "More than one way is available to locate a Web page within a set of Web pages, except where the Web Page is the result of, or a step in, a process.", + "2.4.6": "Headings and labels describe topic or purpose.", + "2.4.7": "Any keyboard operable user interface has a mode of operation where the keyboard focus indicator is visible.", + "2.4.11": "When an element receives focus, it is not entirely covered by other content.", + "2.5.1": "All functionality that uses multipoint or path-based gestures for operation can be operated with a single pointer without a path-based gesture.", + "2.5.2": "For functionality that can be operated using a single pointer, completion of the function is on the up-event with an ability to abort, undo or reverse the outcome.", + "2.5.3": "For user interface components with labels that include text or images of text, the accessible name contains the text that is presented visually.", + "2.5.4": "Functionality that can be operated by motion can also be operated by user interface components, and the motion trigger can be disabled.", + "2.5.8": "The size of the target for pointer inputs is at least 24 by 24 CSS pixels.", + "2.5.7": "All functionality that uses a dragging movement for operation can be achieved by a single pointer without dragging.", + "3.1.1": "The default human language of Web pages, non-Web documents, or software can be programmatically determined.", + "3.1.2": "The human language of each passage or phrase in the content can be programmatically determined.", + "3.2.1": "When any component receives focus, it does not initiate a change of context.", + "3.2.2": "Changing the setting of any user interface component does not automatically cause a change of context unless the user has been advised of the behavior before using the component.", + "3.2.3": "Navigational mechanisms that are repeated on multiple Web pages within a set of Web pages occur in the same relative order each time they are repeated, unless a change is initiated by the user.", + "3.2.4": "Components that have the same functionality within a set of Web pages are identified consistently.", + "3.2.6": "Make it easier to find help and support. If a Web page contains help mechanisms they occur in the same order relative to other page content, unless a change is initiated by the user.", + "3.3.1": "If an input error is automatically detected, the item that is in error is identified and the error is described to the user in text.", + "3.3.2": "Labels or instructions are provided when content requires user input.", + "3.3.3": "If an input error is automatically detected and suggestions for correction are known, then the suggestions are provided to the user, unless it would jeopardize the security or purpose of the content.", + "3.3.4": "For content that cause legal commitments or financial transactions for the user to occur, that modify or delete user-controllable data in data storage systems, or that submit user test responses, the user can reverse, correct, or confirm the action.", + "3.3.7": "Make it easier for users to complete multi-step processes. Don't ask for the same information twice in the same session.", + "3.3.8": "Make logins possible with less mental effort. Don't make people solve, recall, or transcribe something to log in.", + "4.1.1": "(Obsolete and removed) This requirement was originally adopted to address problems that assistive technology (AT) had directly parsing HTML. AT no longer has any need to directly parse HTML. Consequently, these problems either no longer exist or are addressed by other requirements.", + "4.1.2": "For all user interface components (including, but not limited to: form elements, links and components generated by scripts), the name and role can be programmatically determined; states, properties, and values that can be set by the user can be programmatically set; and notification of changes to these items is available to user agents, including assistive technologies.", + "4.1.3": "In content implemented using markup languages, status messages can be programmatically determined through role or properties such that they can be presented to the user by assistive technologies without receiving focus.", + "HTML": "The HTML specification issues that cause accessibility issues may be covered by other rules and will be reported under those accessibility requirements. However, some non-conforming HTML specification issues are still reported.", + "ARIA": "The ARIA specification issues that cause accessibility issues may be covered by other rules and will be reported under those accessibility requirements. However, some non-conforming ARIA specification issues are still reported.", +}; +exports.a11yRulesets = [ + // { + // id: "DEBUG", + // name: "DEBUG Rules", + // category: eRuleCategory.ACCESSIBILITY, + // description: "Rules for debugging", + // checkpoints: [{ + // num: "1", + // name: "Debug CP 1", + // wcagLevel: "A", + // summary: "Rules for Debug" + // }] + // }, + { + id: "EXTENSIONS", + name: "Extension Rules", + category: IGuideline_1.eGuidelineCategory.ACCESSIBILITY, + description: "Rules for enabling the browser extensions", + type: IGuideline_1.eGuidelineType.EXTENSION, + checkpoints: [{ + num: "1", + name: "Extension CP 1", + wcagLevel: "A", + summary: "Rules for Extension" + }] + }, + { + id: "IBM_Accessibility", + name: "IBM Accessibility 7.3", + category: IGuideline_1.eGuidelineCategory.ACCESSIBILITY, + description: "Rules for WCAG 2.0, 2.1, 2.2 A and AA plus additional IBM supplemental requirements.", + // This ruleset has all 2.0 and 2.1 checkpoints that are A or AA + checkpoints: SCs + .filter(function (sc) { return (sc.level === "A" || sc.level === "AA" || sc.level === "NA") && (sc.wcagType === "2.0" || sc.wcagType === "2.1" || sc.wcagType === "2.2" || sc.wcagType === "NA"); }) + .map(function (sc) { return ({ + num: sc.num, + scId: sc.scId, + name: sc.handle, + wcagLevel: sc.level, + summary: summaries[sc.num] + }); }) + }, + { + id: "IBM_Accessibility_next", + name: "IBM Accessibility next", + category: IGuideline_1.eGuidelineCategory.ACCESSIBILITY, + description: "Rules for WCAG 2.0, 2.1, 2.2 A and AA plus additional IBM supplemental requirements.", + // This ruleset has all 2.0 and 2.1 checkpoints that are A or AA + checkpoints: SCs + .filter(function (sc) { return (sc.level === "A" || sc.level === "AA" || sc.level === "NA") && (sc.wcagType === "2.0" || sc.wcagType === "2.1" || sc.wcagType === "2.2" || sc.wcagType === "NA"); }) + .map(function (sc) { return ({ + num: sc.num, + scId: sc.scId, + name: sc.handle, + wcagLevel: sc.level, + summary: summaries[sc.num] + }); }) + }, + { + id: "WCAG_2_2", + name: "WCAG 2.2 (A, AA)", + category: IGuideline_1.eGuidelineCategory.ACCESSIBILITY, + description: "Rules for WCAG 2.2 A & AA. This is the current W3C recommendation (specification). Content that conforms to WCAG 2.2 also conforms to WCAG 2.1.", + // This ruleset has all 2.0 and 2.1 checkpoints that are A or AA + checkpoints: SCs + .filter(function (sc) { return (sc.level === "A" || sc.level === "AA") && (sc.wcagType === "2.0" || sc.wcagType === "2.1" || sc.wcagType === "2.2"); }) + .map(function (sc) { return ({ + num: sc.num, + scId: sc.scId, + name: sc.handle, + wcagLevel: sc.level, + summary: summaries[sc.num] + }); }) + }, + { + id: "WCAG_2_1", + name: "WCAG 2.1 (A, AA)", + category: IGuideline_1.eGuidelineCategory.ACCESSIBILITY, + description: "Rules for WCAG 2.1 A & AA. Content that conforms to WCAG 2.1 also conforms to WCAG 2.0.", + // This ruleset has all 2.0 and 2.1 checkpoints that are A or AA + checkpoints: SCs + .filter(function (sc) { return (sc.level === "A" || sc.level === "AA") && (sc.wcagType === "2.0" || sc.wcagType === "2.1"); }) + .map(function (sc) { return ({ + num: sc.num, + scId: sc.scId, + name: sc.handle, + wcagLevel: sc.level, + summary: summaries[sc.num] + }); }) + }, + { + id: "WCAG_2_0", + name: "WCAG 2.0 (A, AA)", + category: IGuideline_1.eGuidelineCategory.ACCESSIBILITY, + description: "Rules for WCAG 2.0 A & AA. Referenced by US Section 508, but not the latest W3C recommendation.", + // This ruleset has all 2.0 checkpoints that are A or AA + checkpoints: SCs + .filter(function (sc) { return (sc.level === "A" || sc.level === "AA") && (sc.wcagType === "2.0"); }) + .map(function (sc) { return ({ + num: sc.num, + scId: sc.scId, + name: sc.handle, + wcagLevel: sc.level, + summary: summaries[sc.num] + }); }) + } +]; + + +/***/ }, + +/***/ "./src/v4/simulator/SRController.ts" +/*!******************************************!*\ + !*** ./src/v4/simulator/SRController.ts ***! + \******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SRController = void 0; +var SRCursor_1 = __webpack_require__(/*! ./SRCursor */ "./src/v4/simulator/SRCursor.ts"); +var SRRenderer_1 = __webpack_require__(/*! ./SRRenderer */ "./src/v4/simulator/SRRenderer.ts"); +var SRNavigator_1 = __webpack_require__(/*! ./SRNavigator */ "./src/v4/simulator/SRNavigator.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var SRUtil_1 = __webpack_require__(/*! ./SRUtil */ "./src/v4/simulator/SRUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +/** + * SRController class for managing screen reader simulation + * Maintains a point of regard and provides navigation functions + */ +var SRController = /** @class */ (function () { + /** + * Creates a new SRController + * @param rootElement The root element to start from (defaults to document.body) + */ + function SRController(rootElement) { + if (rootElement === void 0) { rootElement = document.body; } + this.rootElement = rootElement; + this.liveListeners = []; + this.ctrlDoc = rootElement.ownerDocument; + this.setPointOfRegard(rootElement); + this.setupMutationTracking(); + console.info("[WARNING] The SRController is a new feature that is not yet \"stable\". What this means:\n* API subject to change, even between minor versions of the checker\n* Results should be considered experimental. There are a variety of known issues, but making this available for early experimentation / feedback."); + } + SRController.getController = function (ctrlDoc) { + if (ctrlDoc === void 0) { ctrlDoc = document; } + if (!this.singleton) { + this.singleton = new SRController(ctrlDoc.body); + } + return this.singleton; + }; + SRController.prototype.disconnect = function () { + if (this.mutationObserver) { + this.mutationObserver.disconnect(); + } + }; + SRController.prototype.findAllShadowRoots = function (root) { + if (root === void 0) { root = document; } + var shadowRoots = []; + // Get all elements in the current root + var walker = this.ctrlDoc.createTreeWalker(root, NodeFilter.SHOW_ELEMENT, null); + var node; + while (node = walker.nextNode()) { + var element = node; + // Check if this element has an open shadow root + if (element.shadowRoot) { + shadowRoots.push(element.shadowRoot); + // Recursively search inside this shadow root + var nestedShadowRoots = this.findAllShadowRoots(element.shadowRoot); + shadowRoots.push.apply(shadowRoots, nestedShadowRoots); + } + } + return shadowRoots; + }; + /** + * Set up mutation tracking + * + * In the event that the point of regard is removed from the DOM, we need to get up to the nearest parent that's not being removed + */ + SRController.prototype.setupMutationTracking = function () { + var _this = this; + if (this.mutationObserver) { + this.mutationObserver.disconnect(); + } + var myThis = this; + var observer = new MutationObserver(function (mutations) { + var porNode = myThis.pointOfRegard.getNode(); + var _loop_1 = function (removalMutation) { + removalMutation.removedNodes.forEach(function (removedNode) { + if (removedNode.isSameNode(porNode) || removedNode.contains(porNode)) { + console.info("Adjusting PoR due to DOM mutation removing PoR"); //, removalMutation.target, removedNode, porNode) + porNode = removalMutation.target; + } + }); + }; + for (var _i = 0, _a = mutations.filter(function (mutation) { var _a; return ((_a = mutation.removedNodes) === null || _a === void 0 ? void 0 : _a.length) > 0; }); _i < _a.length; _i++) { + var removalMutation = _a[_i]; + _loop_1(removalMutation); + } + ; + _this.setPointOfRegard(porNode); + var _loop_2 = function (mutation) { + if (mutation.addedNodes) { + mutation.addedNodes.forEach(function (addedNode) { + // Add observation of new shadow roots + var allRoots = _this.findAllShadowRoots(addedNode); + for (var _i = 0, allRoots_2 = allRoots; _i < allRoots_2.length; _i++) { + var root = allRoots_2[_i]; + observer.observe(root, { + childList: true, + subtree: true, + characterData: true + }); + } + }); + } + var node = mutation.target; + var elem = node.nodeType === 1 ? node : node.parentElement; + if (elem + && !elem.closest("[aria-busy=\"true\"]") + && elem.getAttribute("aria-busy") !== "true") { + // Identify the live region container + var liveRegionElem = + // The element itself is a live region container + ((["polite", "assertive"].includes(elem.getAttribute("aria-live")) + || elem.nodeName.toUpperCase() === "OUTPUT" + || ["status", "log", "progressbar", "alert", "timer"].includes(elem.getAttribute("role"))) && elem) + // Or get the nearest ancestor + || elem.closest("[aria-live=\"polite\"],[aria-live=\"assertive\"],output,[role=\"status\"],[role=\"log\"],[role=\"progressbar\"],[role=\"alert\"],[role=\"timer\"]"); + var isMutationRelevant = false; + var relevance_1 = ["additions", "text"]; + if (liveRegionElem) { + // Determine what kinds of changes are 'relevant' + var relevantElem = elem.closest("[aria-relevant]"); + if (relevantElem) { + relevance_1 = relevantElem.getAttribute("aria-relevant").split(/ +/g); + } + if (liveRegionElem.getAttribute("role") === "log") { + relevance_1 = ["additions"]; + } + if (liveRegionElem.hasAttribute("aria-relevant")) { + relevance_1 = liveRegionElem.getAttribute("aria-relevant").split(/ +/g); + } + if (relevance_1.includes("all")) { + relevance_1 = ["additions", "removals", "text"]; + } + isMutationRelevant = (mutation.target.nodeType === 3 && relevance_1.includes("text")) + || (mutation.addedNodes.length > 0 && relevance_1.includes("additions")) + || (mutation.removedNodes.length > 0 && relevance_1.includes("removals")); + } + if (liveRegionElem && isMutationRelevant) { + var isAtomic_1 = liveRegionElem.getAttribute("aria-atomic") === "true" || ["alert", "status", "timer", "marquee"].includes(liveRegionElem.getAttribute("role")); + // Read the whole region if atomic + if (!isAtomic_1 && mutation.type === "characterData" && mutation.target.nodeType === 3 && !VisUtil_1.VisUtil.isNodeHiddenFromAT(mutation.target.parentElement)) { + for (var _c = 0, _d = _this.liveListeners; _c < _d.length; _c++) { + var liveListener = _d[_c]; + liveListener(mutation.target.nodeValue); + } + } + else { + var liveTarget_1 = isAtomic_1 ? liveRegionElem : mutation.target; + if (liveTarget_1.liveAnnounce) { + clearTimeout(liveTarget_1.liveAnnounce); + } + liveTarget_1.liveAnnounce = setTimeout(function () { + var results = []; + var isRemoval = (relevance_1.includes("removals") && mutation.removedNodes.length > 0); + if (isAtomic_1 || isRemoval) { + var liveCursor = new SRCursor_1.SRCursor(liveTarget_1, false); + var liveCursorEnd = new SRCursor_1.SRCursor(liveTarget_1, true); + liveCursorEnd.next(function () { return true; }); + results.push((isRemoval ? "[removed] " : "") + SRRenderer_1.SRRenderer.renderRange("item", liveCursor, liveCursorEnd)); + } + else if (relevance_1.includes("additions") && mutation.addedNodes.length > 0) { + mutation.addedNodes.forEach(function (addedNode) { + // Just render the additions + var liveCursor = new SRCursor_1.SRCursor(addedNode, false); + var liveCursorEnd = new SRCursor_1.SRCursor(addedNode, true); + liveCursorEnd.next(function () { return true; }); + results.push(SRRenderer_1.SRRenderer.renderRange("item", liveCursor, liveCursorEnd)); + }); + } + for (var _i = 0, _a = _this.liveListeners; _i < _a.length; _i++) { + var liveListener = _a[_i]; + liveListener(results.join("\n")); + } + }, 100); + } + } + } + }; + for (var _b = 0, mutations_1 = mutations; _b < mutations_1.length; _b++) { + var mutation = mutations_1[_b]; + _loop_2(mutation); + } + }); + // Need to observe all of the shadow roots + var allRoots = this.findAllShadowRoots(this.ctrlDoc.documentElement); + allRoots.push(this.ctrlDoc.documentElement); + for (var _i = 0, allRoots_1 = allRoots; _i < allRoots_1.length; _i++) { + var root = allRoots_1[_i]; + observer.observe(root, { + childList: true, + subtree: true, + characterData: true + }); + } + }; + SRController.prototype.addLiveListener = function (listener) { + this.liveListeners.push(listener); + }; + SRController.prototype.removeLiveListener = function (removeListener) { + this.liveListeners = this.liveListeners.filter(function (listener) { return listener !== removeListener; }); + }; + /** + * Get the current point of regard + * @returns The current SRCursor representing the point of regard + */ + SRController.prototype.getPointOfRegard = function () { + return this.pointOfRegard; + }; + /** + * Set the point of regard to a specific DOM node + * @param node The node to set as the point of regard + * @returns NavigationResult indicating success or failure + */ + SRController.prototype.setPointOfRegard = function (node) { + var _a; + var DEBUG = false; + DEBUG && console.group("setPointOfRegard"); + try { + this.pointOfRegard = new SRCursor_1.SRCursor(node); + // Update container state + var containerChanges = SRController.diffContainers("focus", this.pointOfRegard); + var role = this.pointOfRegard.getRole(); + var name_1 = (_a = this.pointOfRegard.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name; + return { + success: true, + renderingResult: SRRenderer_1.SRRenderer.renderCurrent("focus", this.pointOfRegard, containerChanges), + role: role, + name: name_1 + }; + } + catch (error) { + return { + success: false, + renderingResult: { + start: this.pointOfRegard.clone(), + end: this.pointOfRegard.clone(), + message: "Failed to set point of regard: ".concat(error.message) + } + }; + } + finally { + DEBUG && console.groupEnd(); + } + }; + /** + * Jump to the next element by the specified mode + * @param mode The navigation mode to use + * @returns NavigationResult indicating success or failure + */ + SRController.prototype.jumpNext = function (mode) { + var _a; + CacheUtil_1.CacheUtil.clearCaches(this.ctrlDoc.documentElement); + var oldPointOfRegard = this.pointOfRegard.clone(); + var DEBUG = false; + DEBUG && console.group("jumpNext"); + try { + var bContinue = true; + var nextJump = this.pointOfRegard.clone(); + var renderingResult = void 0; + while (bContinue && nextJump) { + var lastJump = nextJump.clone(); + nextJump = SRNavigator_1.SRNavigator.jumpNext(mode, nextJump); + if (nextJump) { + var containerChanges = SRController.diffContainers(mode, nextJump, lastJump); + if (mode === "item" && !SRNavigator_1.SRNavigator.getStartFunc(mode)(nextJump.getRole(), !nextJump.isEndTag(), nextJump.getNode())) { + containerChanges = { + entering: [], + leaving: [] + }; + } + renderingResult = SRRenderer_1.SRRenderer.renderCurrent(mode, nextJump, containerChanges); + // Keep going if the landing point is empty, unless it's certain nav modes (e.g., region) + bContinue = renderingResult.message.trim().length === 0 && !["region"].includes(mode); + } + } + if (!nextJump) { + // Restore the original point of regard + this.pointOfRegard = oldPointOfRegard; + var currentResult = SRRenderer_1.SRRenderer.renderCurrent(mode, oldPointOfRegard, { leaving: [], entering: [] }); + return { + success: false, + renderingResult: { + start: oldPointOfRegard.clone(), + end: oldPointOfRegard.clone(), + message: "No next ".concat(mode, ". ").concat((currentResult === null || currentResult === void 0 ? void 0 : currentResult.message) || "") + } + }; + } + else { + this.pointOfRegard = nextJump; + var role = this.pointOfRegard.getRole(); + var name_2 = (_a = this.pointOfRegard.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name; + // Check for container changes + DEBUG && console.log("New POR:", this.pointOfRegard.getNode(), renderingResult); + return { + success: true, + renderingResult: renderingResult, + role: role, + name: name_2 + }; + } + } + catch (error) { + console.error(error); + // Restore the original point of regard + this.pointOfRegard = oldPointOfRegard; + return { + success: false, + renderingResult: { + start: oldPointOfRegard.clone(), + end: oldPointOfRegard.clone(), + message: "Navigation error: ".concat(error.message) + } + }; + } + finally { + console.groupEnd(); + } + }; + /** + * Jump to the previous element by the specified mode + * @param mode The navigation mode to use + * @returns NavigationResult indicating success or failure + */ + SRController.prototype.jumpPrevious = function (mode) { + var _a; + CacheUtil_1.CacheUtil.clearCaches(this.ctrlDoc.documentElement); + var oldPointOfRegard = this.pointOfRegard.clone(); + try { + var bContinue = true; + var prevJump = this.pointOfRegard.clone(); + var renderingResult = void 0; + while (bContinue && prevJump) { + var lastJump = prevJump.clone(); + prevJump = SRNavigator_1.SRNavigator.jumpPrevious(mode, prevJump); + if (prevJump) { + var containerChanges = SRController.diffContainers(mode, prevJump, lastJump); + if (mode === "item" && !SRNavigator_1.SRNavigator.getStartFunc(mode)(prevJump.getRole(), !prevJump.isEndTag(), prevJump.getNode())) { + containerChanges = { + entering: [], + leaving: [] + }; + } + renderingResult = SRRenderer_1.SRRenderer.renderCurrent(mode, prevJump, containerChanges); + // Keep going if the landing point is empty, unless it's certain nav modes (e.g., region) + bContinue = renderingResult.message.trim().length === 0 && !["region"].includes(mode); + } + } + if (!prevJump) { + // Restore the original point of regard + this.pointOfRegard = oldPointOfRegard; + var currentResult = SRRenderer_1.SRRenderer.renderCurrent(mode, oldPointOfRegard, { leaving: [], entering: [] }); + return { + success: false, + renderingResult: { + start: oldPointOfRegard.clone(), + end: oldPointOfRegard.clone(), + message: "No previous ".concat(mode, ". ").concat((currentResult === null || currentResult === void 0 ? void 0 : currentResult.message) || "") + } + }; + } + else { + this.pointOfRegard = prevJump; + var role = this.pointOfRegard.getRole(); + var name_3 = (_a = this.pointOfRegard.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name; + // // Check for container changes + // const containerChanges = SRController.diffContainers(mode, this.pointOfRegard, oldPointOfRegard); + // let s = SRRenderer.renderEnter(mode, this.pointOfRegard); + // if (containerChanges.entering[containerChanges.entering.length-1] !== s) { + // containerChanges.entering.push(s); + // } + return { + success: true, + renderingResult: renderingResult, + role: role, + name: name_3 + }; + } + } + catch (error) { + console.error(error); + // Restore the original point of regard + this.pointOfRegard = oldPointOfRegard; + return { + success: false, + renderingResult: { + start: oldPointOfRegard.clone(), + end: oldPointOfRegard.clone(), + message: "Navigation error: ".concat(error.message) + } + }; + } + }; + /** + * Determine the different in containers between the two nodes + * @param newWalker The new node we're navigating to + * @param oldWalker The previous node we were at + * @returns Array of container change messages + */ + SRController.diffContainers = function (mode, newWalker, oldWalker) { + var DEBUG = false; + DEBUG && console.log("-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-"); + DEBUG && console.log("A)", oldWalker.getNode().nodeName, newWalker.getNode().nodeName); + var leaving = []; + var entering = []; + try { + var docRoot = newWalker ? + (newWalker.getNode().ownerDocument.body || newWalker.getNode().ownerDocument.documentElement) : + oldWalker ? + (oldWalker.getNode().ownerDocument.body || oldWalker.getNode().ownerDocument.documentElement) : + document.body || document.documentElement; + var walkNew = newWalker ? newWalker.clone() : (new SRCursor_1.SRCursor(docRoot)); + var walkOld = oldWalker ? oldWalker.clone() : (new SRCursor_1.SRCursor(docRoot)); + if (!walkNew.getNode().isSameNode(walkOld.getNode())) { + var commonParent = SRController.commonParent(walkNew, walkOld); + if (commonParent) { + DEBUG && console.log("B)", commonParent.getNode().nodeName); + while (commonParent.contains(walkNew)) { + DEBUG && console.log("Entering:", walkNew.getNode().nodeName); + entering.push(SRRenderer_1.SRRenderer.renderEnter(mode, walkNew, walkOld)); + walkNew.parent(); + } + entering.reverse(); + entering = entering.filter(function (s) { return s && s.trim().length > 0; }).map(function (s) { return s.trim(); }); + ; + while (commonParent.contains(walkOld)) { + DEBUG && console.log("Leaving:", walkOld.getNode().nodeName); + leaving.push(SRRenderer_1.SRRenderer.renderLeave(mode, walkOld, walkOld)); + walkOld.parent(); + } + leaving = leaving.filter(function (s) { return s && s.trim().length > 0; }).map(function (s) { return s.trim(); }); + } + } + } + catch (err) { + console.error(err); + } + DEBUG && console.log(leaving, entering); + return { + leaving: leaving, + entering: entering + }; + }; + SRController.commonParent = function (walkerOne, walkerTwo) { + if (walkerOne.contains(walkerTwo)) { + return walkerOne.clone(); + } + else if (walkerTwo.contains(walkerOne)) { + return walkerTwo.clone(); + } + else { + var commonParent = walkerOne.clone(); + while (!commonParent.contains(walkerTwo) && commonParent.parent()) + ; + if (!commonParent.contains(walkerOne) || !commonParent.contains(walkerTwo)) { + return null; + } + return commonParent; + } + }; + SRController.renderAll = function (mode) { + var ctrl = SRController.getController(); + var dialogs = ctrl.ctrlDoc.body.querySelectorAll("dialog,[role='dialog']"); + dialogs.forEach(function (dialog) { + if (SRUtil_1.SRUtil.isModalDialogElement(dialog)) { + ctrl.setPointOfRegard(dialog); + } + }); + var results = []; + // Handle the initial item first (if there is one) + var starterMsg = SRRenderer_1.SRRenderer.renderCurrent(mode, ctrl.getPointOfRegard(), { entering: [], leaving: [] }); + if (starterMsg) { + results.push(starterMsg.message); + } + var bContinue = true; + while (bContinue) { + var nextVal = ctrl.jumpNext(mode); + if (nextVal.success) { + results.push(nextVal.renderingResult.message); + } + else { + bContinue = false; + } + } + return results; + }; + SRController.renderAllDetail = function (doc, mode) { + var ctrl = SRController.getController(doc); + ctrl.setPointOfRegard(doc.body); + var dialogs = doc.body.querySelectorAll("dialog,[role='dialog']"); + dialogs.forEach(function (dialog) { + if (SRUtil_1.SRUtil.isModalDialogElement(dialog)) { + ctrl.setPointOfRegard(dialog); + } + }); + var results = []; + // Handle the initial item first (if there is one) + var starterMsg = SRRenderer_1.SRRenderer.renderCurrent(mode, ctrl.getPointOfRegard(), { entering: [], leaving: [] }); + if (starterMsg) { + results.push(starterMsg); + } + var bContinue = true; + while (bContinue) { + var nextVal = ctrl.jumpNext(mode); + if (nextVal.success) { + // mode === "item" && console.log(nextVal); + results.push(nextVal.renderingResult); + } + else { + bContinue = false; + } + } + return results; + }; + SRController.renderStructure = function (doc) { + var _a; + var modes = ["region", "heading", "item", "tab_focus", "image"]; + var details = modes.map(function (modeLabel) { return SRController.renderAllDetail(doc, modeLabel); }); + var retVal = []; + var _loop_3 = function () { + var next = (_a = details[0][0]) === null || _a === void 0 ? void 0 : _a.start; + modes.forEach(function (mode, idx) { + if (details[idx].length > 0) { + if (!next || SRCursor_1.SRCursor.compare(details[idx][0].start, next) < 0) { + next = details[idx][0].start; + } + } + }); + var nextItem = {}; + var hasValue = false; + modes.forEach(function (mode, idx) { + nextItem[mode] = ""; + if (details[idx].length > 0 && SRCursor_1.SRCursor.compare(details[idx][0].start, next) === 0) { + nextItem[mode] = details[idx].shift().message; + hasValue = nextItem[mode] !== ""; + } + }); + if (hasValue) { + var elem = next.getElement(); + var selector = elem && SRUtil_1.SRUtil.getUniqueSelector(elem); + if (selector && doc.querySelector(selector)) { + nextItem.selector = selector; + } + retVal.push(nextItem); + } + }; + while (details.some(function (detail) { return detail.length > 0; })) { + _loop_3(); + } + return retVal; + }; + return SRController; +}()); +exports.SRController = SRController; + + +/***/ }, + +/***/ "./src/v4/simulator/SRCursor.ts" +/*!**************************************!*\ + !*** ./src/v4/simulator/SRCursor.ts ***! + \**************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SRCursor = void 0; +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var SRUtil_1 = __webpack_require__(/*! ./SRUtil */ "./src/v4/simulator/SRUtil.ts"); +/** + * SRCursor (Screen Reader Cursor) class + * + * This class provides a cursor-like interface for navigating the DOM in a way that + * simulates how screen readers process and navigate content. It tracks: + * - The current node position + * - Whether it's at a start or end tag + * - The ARIA role of the current node + * - The accessible name of the current node + */ +var SRCursor = /** @class */ (function () { + /** + * Creates a new SRCursor positioned at the specified element + * @param element - The DOM node to position the cursor at + * @param bEnd - Whether to position at the end tag (true) or start tag (false) + */ + function SRCursor(element, bEnd) { + // Use DOMWalker with considerHidden=false to process all content (including hidden elements) + // This is important for screen reader simulation which needs to see all content + this.walker = new DOMWalker_1.DOMWalker(element, bEnd, undefined, false); + if (element) { + this.refreshName(); + } + } + /** + * Creates a copy of this cursor at the same position + * @returns A new SRCursor instance with the same position and properties + */ + SRCursor.prototype.clone = function () { + var retVal = new SRCursor(this.walker.node, this.walker.bEndTag); + retVal.role = this.role; + retVal.name = this.name; + return retVal; + }; + /** + * Updates the role and accessible name properties based on the current node + * This is called whenever the cursor position changes + * @private + */ + SRCursor.prototype.refreshName = function () { + if (this.walker.node.nodeType === 1) { + // Element node + this.role = AriaUtil_1.AriaUtil.getResolvedRole(this.walker.node, true); + this.name = AccNameUtil_1.AccNameUtil.computeAccessibleName(this.walker.node); + } + else if (this.walker.node.nodeType === 3) { + // Text node + this.role = "text"; + this.name = { name: this.walker.node.textContent, nameFrom: "text" }; + } + else { + // Other node types + this.role = undefined; + this.name = undefined; + } + }; + /** + * Moves the cursor to the next node that matches the provided criteria + * @param matchingFunc - Function that determines if a node matches the search criteria + * @returns true if a matching node was found, false otherwise + */ + SRCursor.prototype.next = function (matchingFunc, skipFunc) { + var _a; + var DEBUG = false; + // const DEBUG = false; + var foundNext = false; + // Get the skip info for the current spot + this.refreshName(); + DEBUG && console.group("next function"); + DEBUG && console.log(this.isEndTag() ? "/" : "", this.getNode()); + var _b = (skipFunc && skipFunc(this)) || { skipCurrent: false, skipChildren: false }, skipCurrent = _b.skipCurrent, skipChildren = _b.skipChildren; + DEBUG && console.log("skipCurrent:", skipCurrent, "skipChildren:", skipChildren); + do { + // Move as appropriate from the current spot + if (skipChildren && !this.walker.bEndTag) { + this.walker.bEndTag = true; + } + else if (!this.walker.nextNode()) { + break; + } + // Update the skip info for the new spot + this.refreshName(); + DEBUG && console.log(this.isEndTag() ? "/" : "", this.getNode()); + (_a = (skipFunc && skipFunc(this)) || { skipCurrent: false, skipChildren: false }, skipCurrent = _a.skipCurrent, skipChildren = _a.skipChildren); + DEBUG && console.log("skipCurrent:", skipCurrent, "skipChildren:", skipChildren); + // Update role based on node type + if (this.walker.node.nodeType === 1) { + this.role = AriaUtil_1.AriaUtil.getResolvedRole(this.walker.node, true); + } + else if (this.walker.node.nodeType === 3) { + this.role = "text"; + } + if (SRUtil_1.SRUtil.isModalDialogElement(this.getNode()) && this.isEndTag()) { + break; + } + if (!skipCurrent) { + // Check if this node matches our criteria + foundNext = matchingFunc(this.role, !this.walker.bEndTag, this.walker.node); + } + } while (!foundNext); + DEBUG && console.log("foundNext:", foundNext, this.isEndTag() ? "/" : "", this.getNode()); + DEBUG && console.groupEnd(); + if (foundNext) { + this.refreshName(); + } + else { + // Reset properties if no match was found + this.role = undefined; + this.name = undefined; + } + return foundNext; + }; + /** + * Moves the cursor to the previous node that matches the provided criteria + * @param matchingFunc - Function that determines if a node matches the search criteria + * @returns true if a matching node was found, false otherwise + */ + SRCursor.prototype.previous = function (matchingFunc, skipFunc) { + var _a; + var DEBUG = false; + var foundPrevious = false; + // Get the skip info for the current spot + this.refreshName(); + DEBUG && console.group("previous function"); + DEBUG && console.log(this.isEndTag(), this.getNode()); + var _b = (skipFunc && skipFunc(this)) || { skipCurrent: false, skipChildren: false }, skipCurrent = _b.skipCurrent, skipChildren = _b.skipChildren; + DEBUG && console.log(skipCurrent, skipChildren); + do { + // Move as appropriate from the current spot + if (skipChildren && this.walker.bEndTag) { + DEBUG && console.log("Skipping node"); + this.walker.bEndTag = false; + } + else if (!this.walker.prevNode()) { + break; + } + // Update the skip info for the new spot + this.refreshName(); + DEBUG && console.log(this.isEndTag(), this.getNode()); + (_a = (skipFunc && skipFunc(this)) || { skipCurrent: false, skipChildren: false }, skipCurrent = _a.skipCurrent, skipChildren = _a.skipChildren); + DEBUG && console.log(skipCurrent, skipChildren); + // Update role based on node type + if (this.walker.node.nodeType === 1) { + this.role = AriaUtil_1.AriaUtil.getResolvedRole(this.walker.node, true); + } + else if (this.walker.node.nodeType === 3) { + this.role = "text"; + } + if (SRUtil_1.SRUtil.isModalDialogElement(this.getNode()) && !this.isEndTag()) { + break; + } + if (!skipCurrent) { + // Check if this node matches our criteria + foundPrevious = matchingFunc(this.role, !this.walker.bEndTag, this.walker.node); + } + } while (!foundPrevious); + DEBUG && console.log(this.isEndTag(), this.getNode()); + DEBUG && console.groupEnd(); + if (foundPrevious) { + this.refreshName(); + } + else { + // Reset properties if no match was found + this.role = undefined; + this.name = undefined; + } + return foundPrevious; + }; + /** + * Moves the cursor to the parent node of the current node + * @param endTag - Whether to position at the end tag (true) or start tag (false) + * @returns true if successfully moved to parent, false if no parent exists + */ + SRCursor.prototype.parent = function (endTag) { + if (!this.walker.node.parentNode) + return false; + this.walker.node = this.walker.node.parentNode; + this.walker.bEndTag = endTag === true; + if (this.walker.node.nodeType === 1) { + this.role = AriaUtil_1.AriaUtil.getResolvedRole(this.walker.node, true); + this.name = AccNameUtil_1.AccNameUtil.computeAccessibleName(this.walker.node); + } + else if (this.walker.node.nodeType === 3) { + this.role = "text"; + this.name = { name: this.walker.node.textContent, nameFrom: "text" }; + } + else { + this.role = undefined; + this.name = undefined; + } + return true; + }; + /** + * Moves the cursor up the DOM tree until finding a node with a matching role or element name + * @param roles - Array of ARIA roles to match + * @param elems - Optional array of element names to match + * @returns true if a matching node was found, false otherwise + */ + SRCursor.prototype.getCurrentOrParentByRole = function (roles, elems) { + var _this = this; + var uppElems = elems ? elems.map(function (elem) { return elem.toUpperCase(); }) : []; + var matches = function (walker) { + var elem = walker.getElement(); + return roles.includes(_this.getRole()) + || (elem && !elem.hasAttribute("role") && uppElems.includes(elem.nodeName.toUpperCase())); + }; + while (!matches(this) && this.parent()) + ; + return matches(this); + }; + /** + * Creates a new cursor and moves it up the DOM tree until finding a node with a matching role or element name + * @param roles - Array of ARIA roles to match + * @param elems - Optional array of element names to match + * @returns A new cursor at the matching node, or null if no match found + */ + SRCursor.prototype.getCurrentOrParentByRoleClone = function (roles, elems) { + var retVal = this.clone(); + if (retVal.getCurrentOrParentByRole(roles, elems)) { + return retVal; + } + return null; + }; + SRCursor.prototype.getCurrentOrParentTabbableClone = function () { + var retVal = this.clone(); + while (retVal) { + var elem = retVal.getElement(); + if (retVal.isStartTag() && elem && CommonUtil_1.CommonUtil.isTabbable(elem)) { + return retVal; + } + if (!retVal.parent(false)) { + break; + } + } + return null; + }; + /** + * Gets the ARIA role of the current node + * @returns The ARIA role as a string, or undefined if not available + */ + SRCursor.prototype.getRole = function () { + return this.role; + }; + /** + * Gets the accessible name info for the current node + * @returns The AccessibleNameResult object, or undefined if not available + */ + SRCursor.prototype.getNameInfo = function () { + return this.name; + }; + /** + * Get the accessible name of the current node + */ + SRCursor.prototype.getName = function () { + // Handle one-off quirks in the name calculation + var nameInfo = this.getNameInfo(); + if (nameInfo && nameInfo.name) { + return nameInfo.name; + } + var elem = this.getElement(); + if (elem) { + var labelElem = CommonUtil_1.CommonUtil.getLabelForElementHidden(elem, true); + if (labelElem) { + return labelElem.innerText || labelElem.textContent; + } + } + }; + /** + * Sets whether the cursor is at an end tag or start tag + * @param val - True for end tag, false for start tag + */ + SRCursor.prototype.setEndTag = function (val) { + this.walker.bEndTag = val; + }; + /** + * Gets the DOM node at the current cursor position + * @returns The current DOM node + */ + SRCursor.prototype.getNode = function () { + return this.walker.node; + }; + /** + * Gets the current node as an HTMLElement if it is an element node + * @returns The current node as HTMLElement, or undefined if not an element + */ + SRCursor.prototype.getElement = function () { + if (!this.walker.node) + return undefined; + if (this.walker.node.nodeType !== 1) + return undefined; + return this.walker.node; + }; + SRCursor.prototype.getParentElement = function () { + if (!this.walker.node) + return null; + var retVal = this.clone(); + retVal.walker.node = DOMWalker_1.DOMWalker.parentElement(retVal.walker.node); + return retVal; + }; + /** + * Checks if the cursor is positioned at an end tag + * @returns true if at an end tag, false if at a start tag + */ + SRCursor.prototype.isEndTag = function () { + return this.walker.bEndTag; + }; + /** + * Checks if the cursor is positioned at an end tag + * @returns true if at an end tag, false if at a start tag + */ + SRCursor.prototype.isStartTag = function () { + return !this.walker.bEndTag; + }; + /** + * Compares the document position of two cursors + * @param one - First cursor to compare + * @param two - Second cursor to compare + * @returns 0 if equal, -1 if one is before two, 1 if one is after two + */ + SRCursor.compare = function (one, two) { + var _a, _b; + var nodeOne = (_a = one === null || one === void 0 ? void 0 : one.walker) === null || _a === void 0 ? void 0 : _a.node; + var nodeTwo = (_b = two === null || two === void 0 ? void 0 : two.walker) === null || _b === void 0 ? void 0 : _b.node; + if (!nodeOne && !nodeTwo) + return 0; + if (!nodeOne) + return 1; + if (!nodeTwo) + return -1; + var docPosition = nodeOne.compareDocumentPosition(nodeTwo); + // Handle disconnected nodes (different documents or shadow DOMs) + if (docPosition & 0x1) { + // Nodes are disconnected - they're in different trees (iframe or shadow DOM) + // Build ancestor chains using DOMWalker.parentNode (handles shadow DOM & iframes) + var ancestorsOne = [nodeOne]; + var ancestorsTwo = [nodeTwo]; + var current = nodeOne; + while (current = DOMWalker_1.DOMWalker.parentNode(current)) { + ancestorsOne.push(current); + } + current = nodeTwo; + while (current = DOMWalker_1.DOMWalker.parentNode(current)) { + ancestorsTwo.push(current); + } + // Reverse so root is first + ancestorsOne.reverse(); + ancestorsTwo.reverse(); + // Find where the paths diverge + var commonDepth = 0; + while (commonDepth < ancestorsOne.length && + commonDepth < ancestorsTwo.length && + ancestorsOne[commonDepth] === ancestorsTwo[commonDepth]) { + commonDepth++; + } + // If one path is a prefix of the other, handle containment + if (commonDepth === ancestorsOne.length) { + // nodeOne is an ancestor of nodeTwo + return one.walker.bEndTag ? 1 : -1; + } + if (commonDepth === ancestorsTwo.length) { + // nodeTwo is an ancestor of nodeOne + return two.walker.bEndTag ? -1 : 1; + } + // Compare the nodes where paths diverge + if (commonDepth > 0) { + var childOne = ancestorsOne[commonDepth]; + var childTwo = ancestorsTwo[commonDepth]; + var childPosition = childOne.compareDocumentPosition(childTwo); + if (childPosition & 0x2) + return 1; // childTwo precedes childOne + if (childPosition & 0x4) + return -1; // childOne precedes childTwo + } + // No common ancestor found - shouldn't happen in a well-formed document + return 0; + } + if (docPosition & 0x8) { + // one is contained within two + // if two is an end tag, one is before, otherwise, one is after + return two.walker.bEndTag ? -1 : 1; + } + else if (docPosition & 0x10) { + // two is contained within one + // if one is an end tag, one is after, otherwise, one is before + return one.walker.bEndTag ? 1 : -1; + } + else if (docPosition & 0x2) { + // two precedes one in the document + return 1; + } + else if (docPosition & 0x4) { + // one precedes two in the document + return -1; + } + return 0; + }; + /** + * Checks if this cursor's node contains another cursor's node + * @param other - The other cursor to check + * @returns true if this cursor contains (is a parent/ancestor of) the other cursor's node + */ + SRCursor.prototype.contains = function (other) { + return this.getNode().contains(other.getNode()) + && !this.isSameNode(other); + }; + /** + * Checks if this cursor points to the same node as another cursor + * @param other - The other cursor to compare with + * @returns true if both cursors point to the same node + */ + SRCursor.prototype.isSameNode = function (other) { + if (!other) + return false; + return this.getNode().isSameNode(other.getNode()); + }; + /** + * Checks if the current node has a non-empty accessible name + * @returns true if the node has a non-empty accessible name + */ + SRCursor.prototype.hasNonEmptyName = function () { + var _a; + return (((_a = this.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) || "").trim().length > 0; + }; + return SRCursor; +}()); +exports.SRCursor = SRCursor; + + +/***/ }, + +/***/ "./src/v4/simulator/SRNavigator.ts" +/*!*****************************************!*\ + !*** ./src/v4/simulator/SRNavigator.ts ***! + \*****************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SRNavigator = void 0; +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var SRCursor_1 = __webpack_require__(/*! ./SRCursor */ "./src/v4/simulator/SRCursor.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var SRNavigator; +(function (SRNavigator) { + /** + * Determine if a node is a block-level element based on its display property + * @param node The DOM node to check + * @returns true if the node is a block-level element, false otherwise + */ + function isBlockElement(node) { + var _a; + if (node.nodeType !== 1) + return false; + if (node.nodeName.toLowerCase() === "br") + return true; + var elem = node; + var mywin = elem.ownerDocument.defaultView; + var disp = (_a = mywin.getComputedStyle(elem)) === null || _a === void 0 ? void 0 : _a.display; + if (disp && disp.startsWith("table")) + return true; + if (disp === "block" && elem.style.display !== "block") { + // Is this block because it's a flex elem? + if (elem.parentElement && mywin.getComputedStyle(elem.parentElement).display === "flex") { + return false; + } + } + if (AriaUtil_1.AriaUtil.getResolvedRole(elem, true) === "link") { + var temp = new DOMWalker_1.DOMWalker(node, false, undefined, false); + temp.prevNode(); + if (!isBlockElement(temp.node)) { + return true; + } + } + return ["block", "flex", "grid", "list-item"].includes(disp); + } + function getExplicitTabindex(node) { + if (!node || node.nodeType !== 1) + return null; + var elem = node; + if (!elem.hasAttribute("tabindex")) + return null; + var tabindexValue = parseInt(elem.getAttribute("tabindex"), 10); + return Number.isNaN(tabindexValue) ? null : tabindexValue; + } + function isPositiveTabFocus(node) { + if (!node || node.nodeType !== 1) + return false; + var elem = node; + var explicitTabindex = getExplicitTabindex(elem); + return explicitTabindex !== null && explicitTabindex > 0 && CommonUtil_1.CommonUtil.isTabbable(elem); + } + function isDefaultOrZeroTabFocus(node) { + if (!node || node.nodeType !== 1) + return false; + var elem = node; + var explicitTabindex = getExplicitTabindex(elem); + return (explicitTabindex === null || explicitTabindex === 0) && CommonUtil_1.CommonUtil.isTabbable(elem); + } + function getTabFocusStartFunc(includePositiveTabindex) { + if (includePositiveTabindex === void 0) { includePositiveTabindex = true; } + return function (_role, bStartTag, node) { + if (!(node && node.nodeType === 1 && bStartTag && CommonUtil_1.CommonUtil.isTabbable(node))) + return false; + return includePositiveTabindex || isDefaultOrZeroTabFocus(node); + }; + } + /** + * Collect all tabbable elements in tab order (positive tabindex first, then document order) + * @param matchFunc Function to match tabbable elements + * @param rootNode Optional root node to start collection from (defaults to document body) + * @returns Array of cursors pointing to tabbable elements in tab order + */ + function collectTabFocusCursors(matchFunc, rootNode) { + var root = ((rootNode === null || rootNode === void 0 ? void 0 : rootNode.ownerDocument) || document).body || rootNode; + if (!root) + return []; + var walker = new SRCursor_1.SRCursor(root, false); + var skipFunc = getSkipFunc("tab_focus"); + var positiveResults = []; + var normalResults = []; + var addCursor = function (cursor) { + if (!matchFunc(cursor.getRole(), !cursor.isEndTag(), cursor.getNode())) + return; + if (isPositiveTabFocus(cursor.getNode())) { + positiveResults.push(cursor.clone()); + } + else if (isDefaultOrZeroTabFocus(cursor.getNode())) { + normalResults.push(cursor.clone()); + } + }; + addCursor(walker); + while (walker.next(function () { return true; }, skipFunc)) { + addCursor(walker); + } + positiveResults.sort(function (a, b) { + var aElem = a.getElement(); + var bElem = b.getElement(); + var aTabindex = getExplicitTabindex(aElem) || 0; + var bTabindex = getExplicitTabindex(bElem) || 0; + if (aTabindex !== bTabindex) + return bTabindex - aTabindex; + return SRCursor_1.SRCursor.compare(a, b); + }); + return positiveResults.concat(normalResults); + } + /** + * Find the index of a cursor in an array of tab focus cursors + * @param cursors Array of cursors to search + * @param walker The cursor to find + * @returns The index of the cursor, or -1 if not found + */ + function findTabFocusIndex(cursors, walker) { + return cursors.findIndex(function (cursor) { return SRCursor_1.SRCursor.compare(cursor, walker) === 0; }); + } + /** + * Get the match function for identifying start positions in a given navigation mode + * @param mode The navigation mode (e.g., "link", "heading", "button", etc.) + * @returns A function that matches elements appropriate for the navigation mode + */ + function getStartFunc(mode) { + switch (mode) { + case "link": + return function (role, bStartTag) { return (bStartTag && role === "link"); }; + case "tab_focus": + return getTabFocusStartFunc(false); + case "heading": + return function (role, bStartTag) { return (bStartTag && role === "heading"); }; + case "h1": + return function (role, bStartTag, node) { return (bStartTag && role === "heading" && node.ariaLevel === "1"); }; + case "h2": + return function (role, bStartTag, node) { return (bStartTag && role === "heading" && node.ariaLevel === "2"); }; + case "h3": + return function (role, bStartTag, node) { return (bStartTag && role === "heading" && node.ariaLevel === "3"); }; + case "h4": + return function (role, bStartTag, node) { return (bStartTag && role === "heading" && node.ariaLevel === "4"); }; + case "h5": + return function (role, bStartTag, node) { return (bStartTag && role === "heading" && node.ariaLevel === "5"); }; + case "h6": + return function (role, bStartTag, node) { return (bStartTag && role === "heading" && node.ariaLevel === "6"); }; + case "image": + return function (role, bStartTag) { return (bStartTag && ["img", "graphics-document"].includes(role)); }; + case "radio": + return function (role, bStartTag) { return (bStartTag && role === "radio"); }; + case "button": + return function (role, bStartTag) { return (bStartTag && role === "button"); }; + case "checkbox": + return function (role, bStartTag) { return (bStartTag && role === "checkbox"); }; + case "combo": + return function (role, bStartTag) { return (bStartTag && role === "combobox"); }; + case "list": + return function (role, bStartTag) { return (bStartTag && role === "list"); }; + case "listitem": + return function (role, bStartTag) { return (bStartTag && role === "listitem"); }; + case "article": + return function (role, bStartTag) { return (bStartTag && role === "article"); }; + case "table": + return function (role, bStartTag) { return (bStartTag && role === "table"); }; + case "paragraph": + return function (_role, bStartTag, node) { return (bStartTag && node.nodeName.toUpperCase() === "P"); }; + case "dom": + return function () { return true; }; + case "item": + return function (_role, bStartTag, node) { + if (!bStartTag) + return false; + if (isBlockElement(node)) + return true; + var temp = new DOMWalker_1.DOMWalker(node, !bStartTag); + if (temp.prevNode() && temp.bEndTag) { + return isBlockElement(temp.node); + } + return false; + }; + case "region": + return function (role, bStartTag, node) { + var _a, _b; + if (!bStartTag) + return false; + if (["main", "navigation", "form", "banner", "search", "contentinfo"].includes(role)) + return true; + if (role !== "region" || (node === null || node === void 0 ? void 0 : node.nodeType) !== 1) + return false; + return !!((_b = (_a = AccNameUtil_1.AccNameUtil.computeAccessibleName(node)) === null || _a === void 0 ? void 0 : _a.name) === null || _b === void 0 ? void 0 : _b.trim()); + }; + case "formcontrol": + case "editbox": + case "graphic": + case "frame": + case "division": + case "tabcontrol": + case "separator": + case "clickable": + case "mouseover": + throw new Error("NOT_IMPLEMENTED"); + } + } + SRNavigator.getStartFunc = getStartFunc; + /** + * Check if an element is within a Shadow DOM + * @param element The element to check + * @returns true if the element is in a Shadow DOM, false otherwise + */ + var isInShadowDOM = function (element) { + var root = element.getRootNode(); + return root instanceof ShadowRoot; + }; + /** + * Determine skip behavior for item navigation mode + * Handles complex visibility rules including hidden content in headings/links + * @param cursor The cursor at the current position + * @returns Object indicating whether to skip current node and/or its children, or null for default behavior + */ + var SKIP_ITEM_BEHAVIOR = function (cursor) { + var DEBUG = false; + DEBUG && console.group("SKIP_ITEM_BEHAVIOR"); + var retVal = null; + try { + var nodeType = cursor.getNode().nodeType; + var elem = cursor.getElement(); + var cursorStart = cursor.clone(); + cursorStart.setEndTag(false); + DEBUG && console.log(nodeType); + // Skip CDATA and comments completely + if ([4, 8].includes(nodeType)) + return retVal = { skipCurrent: true, skipChildren: true }; + // Only process elements and text + if (![1, 3].includes(nodeType)) + return retVal = { skipCurrent: true, skipChildren: false }; + // For text elements, Consider with relation to their parent element + if (nodeType === 3) { + elem = cursor.getNode().parentElement; + if (!elem) + return retVal = VisUtil_1.VisUtil.isNodeHiddenFromAT(elem) ? { skipCurrent: true, skipChildren: false } : null; + } + // if (!elem) console.log(cursor.getNode()); + // We have an element + // Make sure we're within the body element + if (!elem.closest("body") && !isInShadowDOM(elem)) + return retVal = { skipCurrent: true, skipChildren: false }; + // Make sure we're not in a script or style + if (elem.closest("script,style")) + return retVal = { skipCurrent: true, skipChildren: true }; + // For text nodes, we need to check visibility in context of parent heading/link + // So we'll handle text node visibility checks below with the element visibility checks + // Skip things hidden from the AT, UNLESS we're inside a heading or link + // (headings and links should include their full accessible name, including hidden parts) + // BUT only if the heading/link uses nameFrom="content" (not aria-label/aria-labelledby) + var parentHeadingOrLink = cursorStart.getCurrentOrParentByRoleClone(["heading", "link"]); + // Special case: if current element itself is a heading or link AND we're NOT inside another heading/link, + // apply normal skip rules + var currentRole = AriaUtil_1.AriaUtil.getResolvedRole(elem); + var isCurrentHeadingOrLink = currentRole === "heading" || currentRole === "link"; + if (!parentHeadingOrLink) { + // Not inside any heading/link - apply normal skip rules + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(elem)) + return retVal = { skipCurrent: true, skipChildren: nodeType === 1 }; + if (!VisUtil_1.VisUtil.isNodeVisible(elem)) + return retVal = { skipCurrent: true, skipChildren: nodeType === 1 }; + } + else { + // Check if the parent heading/link uses aria-label or aria-labelledby + var parentElem = parentHeadingOrLink.getElement(); + var nameInfo = parentHeadingOrLink.getNameInfo(); + // If nameFrom is NOT "content" or "text", skip all content (it's using aria-label/aria-labelledby) + if (nameInfo && !["content", "text"].includes(nameInfo.nameFrom)) { + // Parent uses aria-label/aria-labelledby - skip all content including nested headings/links + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(elem)) + return retVal = { skipCurrent: true, skipChildren: true }; + if (!VisUtil_1.VisUtil.isNodeVisible(elem)) + return retVal = { skipCurrent: true, skipChildren: true }; + } + else if (isCurrentHeadingOrLink) { + // Current element is a heading/link inside another heading/link with content-based name + // Don't skip it - let it through so its content can be read + // (The logic at line 183 will handle whether to skip its children) + } + else { + // nameFrom is "content", so include hidden content but skip hidden images/graphics + var role_1 = AriaUtil_1.AriaUtil.getResolvedRole(elem); + if ((role_1 === "img" || role_1 === "graphics-document") && VisUtil_1.VisUtil.isNodeHiddenFromAT(elem)) { + return retVal = { skipCurrent: true, skipChildren: true }; + } + // Don't skip other hidden content - it should be included in the accessible name + } + } + if (elem.nodeName.toUpperCase() === "BODY") + return retVal = { skipCurrent: false, skipChildren: false }; + // Skip labels that are associated with controls - they'll be read with the related input. + // Keep children so interactive content (e.g. links) inside the label still appears in + // reading/tab order. + if (elem.nodeName.toUpperCase() === "LABEL") { + if (elem.hasAttribute("for") + && document.getElementById(elem.getAttribute("for")) + && document.getElementById(elem.getAttribute("for")).getAttribute("type") !== "hidden") { + return retVal = { skipCurrent: true, skipChildren: false }; + } + else { + var nestedControl = elem.querySelector("input, select, textarea, button, [role='checkbox'], [role='combobox'], [role='listbox'], [role='menuitemcheckbox'], [role='menuitemradio'], [role='radio'], [role='searchbox'], [role='slider'], [role='spinbutton'], [role='switch'], [role='textbox']"); + if (nestedControl && nestedControl.getAttribute("type") !== "hidden") { + return retVal = { skipCurrent: true, skipChildren: false }; + } + } + } + // Skip non-interactive content that is a descendant of a for-linked label. + // Such content is already surfaced as part of the associated control's announcement. + // Interactive descendants (links, buttons, etc.) are allowed through. + { + var labelFor = elem.closest("label[for]"); + var labelForTarget = labelFor && labelFor.getAttribute("for"); + if (labelFor + && labelForTarget + && document.getElementById(labelForTarget) + && document.getElementById(labelForTarget).getAttribute("type") !== "hidden" + && !elem.closest("a[href], [role='link'], button, [role='button']")) { + return retVal = { skipCurrent: true, skipChildren: nodeType === 1 }; + } + } + var role = cursorStart.getRole(); + // If we have presentational children, read the element, skip the children + if (AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(elem)) { + return retVal = { skipCurrent: false, skipChildren: true }; + } + // Skip children of headings/links that don't use content-based names + // UNLESS we're inside another heading/link that DOES use content-based names + if (["link", "heading"].includes(role) && (!cursorStart.getName() || (!["content", "text"].includes(cursorStart.getNameInfo().nameFrom)))) { + // Check if we're inside a parent heading/link with content-based name + if (parentHeadingOrLink && parentHeadingOrLink.getNameInfo() && ["content", "text"].includes(parentHeadingOrLink.getNameInfo().nameFrom)) { + // Don't skip children - we're nested inside a content-based heading/link + } + else { + return retVal = { skipCurrent: false, skipChildren: true }; + } + } + if (elem.nodeName.toUpperCase() === "LEGEND") { + var parent_1 = DOMWalker_1.DOMWalker.parentElement(cursor.getNode()); + while (parent_1) { + if (parent_1.nodeName.toUpperCase() === 'FIELDSET') { + // Legend is within a fieldset, suppress output + return retVal = { skipCurrent: false, skipChildren: true }; + } + parent_1 = DOMWalker_1.DOMWalker.parentElement(parent_1); + } + } + if (elem && elem.nodeName.toUpperCase() === "MSUP") { + return retVal = { skipCurrent: false, skipChildren: true }; + } + if (elem.closest(".ibma-sr-overlay")) { + return retVal = { skipCurrent: true, skipChildren: true }; + } + return retVal = null; + } + finally { + DEBUG && console.log("SKIP_ITEM retVal:", retVal); + DEBUG && console.groupEnd(); + } + }; + /** + * Determine skip behavior for nested navigation modes (link, heading, image, etc.) + * Simpler than SKIP_ITEM_BEHAVIOR as it doesn't need complex heading/link content rules + * @param cursor The cursor at the current position + * @returns Object indicating whether to skip current node and/or its children, or null for default behavior + */ + var SKIP_NESTED_BEHAVIOR = function (cursor) { + var nodeType = cursor.getNode().nodeType; + var elem = cursor.getElement(); + // Only visit elements and text nodes + if (nodeType !== 1 && nodeType !== 3) + return { skipCurrent: true, skipChildren: false }; + if (nodeType === 3) + return VisUtil_1.VisUtil.isNodeHiddenFromAT(elem) ? { skipCurrent: true, skipChildren: false } : null; + // We have an elemenet + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(elem)) + return { skipCurrent: true, skipChildren: true }; + // Skip label fors - they'll be read with the related input. + // Keep children so interactive content (e.g. links) inside the label still appears in + // reading/tab order. + if (elem.nodeName.toUpperCase() === "LABEL" + && elem.hasAttribute("for") + && document.getElementById(elem.getAttribute("for")) + && document.getElementById(elem.getAttribute("for")).getAttribute("type") !== "hidden") { + return { skipCurrent: true, skipChildren: false }; + } + // Skip non-interactive content that is a descendant of a for-linked label. + // Such content is already surfaced as part of the associated control's announcement. + // Interactive descendants (links, buttons, etc.) are allowed through. + { + var labelFor = elem.closest("label[for]"); + var labelForTarget = labelFor && labelFor.getAttribute("for"); + if (labelFor + && labelForTarget + && document.getElementById(labelForTarget) + && document.getElementById(labelForTarget).getAttribute("type") !== "hidden" + && !elem.closest("a[href], [role='link'], button, [role='button']")) { + return { skipCurrent: true, skipChildren: nodeType === 1 }; + } + } + var role = cursor.getRole(); + // If we have presentational children, read the element, skip the children + if (AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(elem)) { + return { skipCurrent: false, skipChildren: true }; + } + if (elem && elem.nodeName.toUpperCase() === "MSUP") { + return { skipCurrent: true, skipChildren: true }; + } + if (elem.closest(".ibma-sr-overlay")) { + return { skipCurrent: true, skipChildren: true }; + } + return null; + }; + /** + * Get the skip function for a given navigation mode + * @param mode The navigation mode + * @returns A function that determines which nodes to skip during navigation + */ + function getSkipFunc(mode) { + switch (mode) { + case "region": + case "item": + return SKIP_ITEM_BEHAVIOR; + case "link": + case "tab_focus": + case "heading": + case "h1": + case "h2": + case "h3": + case "h4": + case "h5": + case "h6": + case "image": + return SKIP_NESTED_BEHAVIOR; + case "radio": + case "button": + case "checkbox": + case "combo": + case "list": + case "listitem": + case "article": + case "table": + case "paragraph": + case "dom": + case "formcontrol": + case "editbox": + case "graphic": + case "frame": + case "division": + case "tabcontrol": + case "separator": + case "clickable": + case "mouseover": + throw new Error("NOT_IMPLEMENTED"); + } + } + SRNavigator.getSkipFunc = getSkipFunc; + /** + * Jump to the current position or the previous matching element if current doesn't match + * @param mode The navigation mode + * @param walker The cursor at the current position + * @returns A cursor at the current or previous matching position + */ + function jumpCurrent(mode, walker) { + var matchFunc = mode === "tab_focus" ? getTabFocusStartFunc(true) : getStartFunc(mode); + if (matchFunc(walker.getRole(), !walker.isEndTag(), walker.getNode())) { + return walker.clone(); + } + else { + return jumpPrevious(mode, walker); + } + } + SRNavigator.jumpCurrent = jumpCurrent; + /** + * Jump to the end of the current element and return all intermediate item positions + * @param mode The navigation mode + * @param walker The cursor at the current position + * @returns Array of cursors representing positions from current to end + */ + function jumpCurrentEnd(mode, walker) { + if (mode === "item") { + var itemEnd = jumpNext(mode, walker); + return itemEnd ? [itemEnd] : []; + } + else { + var nameInfo = walker.getNameInfo(); + var retVal = walker.clone(); + if (nameInfo && !["content", "text"].includes(nameInfo.nameFrom)) { + // Name is just from the item itself + retVal.next(function () { return true; }); + } + else { + // Name is from the content + retVal.setEndTag(true); + retVal.next(function () { return true; }); + } + var endCursors = []; + var itemEnd = jumpNext("item", walker); + while (itemEnd && SRCursor_1.SRCursor.compare(itemEnd, retVal) < 0) { + endCursors.push(itemEnd); + itemEnd = jumpNext("item", itemEnd); + } + endCursors.push(retVal); + return mode === "tab_focus" && walker.getRole() === "link" ? [endCursors[endCursors.length - 1]] : endCursors; + } + } + SRNavigator.jumpCurrentEnd = jumpCurrentEnd; + /** + * Jump to the next matching element in the given navigation mode + * @param mode The navigation mode + * @param walker The cursor at the current position + * @returns A cursor at the next matching position, or null if none found + */ + function jumpNext(mode, walker) { + var DEBUG = false; + DEBUG && console.group("SRNavigator::jumpNext", walker.isEndTag() ? "/" : "", walker.getNode()); + try { + if (mode === "tab_focus") { + var tabFocusMatchFunc = getTabFocusStartFunc(true); + var tabFocusCursors = collectTabFocusCursors(tabFocusMatchFunc, walker.getNode()); + if (tabFocusCursors.length > 0) { + // console.log(tabFocusCursors.map(c => c.getNode())); + var currentTabFocusParentCursor = walker.getCurrentOrParentTabbableClone(); + var currentTabFocusCursor = currentTabFocusParentCursor && findTabFocusIndex(tabFocusCursors, currentTabFocusParentCursor) >= 0 ? currentTabFocusParentCursor : walker.clone(); + var currentIndex = findTabFocusIndex(tabFocusCursors, currentTabFocusCursor); + if (currentIndex >= 0) { + if (currentIndex + 1 < tabFocusCursors.length) { + return tabFocusCursors[currentIndex + 1].clone(); + } + return null; + } + return tabFocusCursors[0].clone(); + } + } + var retVal = walker.clone(); + var matchFunc = getStartFunc(mode); + var skipFunc = getSkipFunc(mode); + if (retVal.next(matchFunc, skipFunc)) { + DEBUG && console.log("SRNavigator::jumpNext result", retVal); + return retVal; + } + else { + return null; + } + } + finally { + console.groupEnd(); + } + } + SRNavigator.jumpNext = jumpNext; + /** + * Navigates to the previous element in screen reader navigation based on the specified mode. + * + * For tab_focus mode, this function attempts to move to the previous tabbable element by: + * 1. First trying to move backward using the mode's match and skip functions + * 2. If that fails, collecting all tab focus cursors and finding the previous one in the tab order + * + * @param mode - The navigation mode (e.g., "tab_focus") that determines how to navigate + * @param walker - The current cursor position in the screen reader navigation + * @returns A new cursor positioned at the previous element, or null if no previous element exists + */ + function jumpPrevious(mode, walker) { + if (mode === "tab_focus") { + var retVal_1 = walker.clone(); + var matchFunc_1 = getStartFunc(mode); + var skipFunc_1 = getSkipFunc(mode); + if (retVal_1.previous(matchFunc_1, skipFunc_1)) { + return retVal_1; + } + var tabFocusMatchFunc = getTabFocusStartFunc(true); + var tabFocusCursors = collectTabFocusCursors(tabFocusMatchFunc, walker.getNode()); + if (tabFocusCursors.length > 0) { + var currentTabFocusParentCursor = walker.getCurrentOrParentTabbableClone(); + var currentTabFocusCursor = currentTabFocusParentCursor && findTabFocusIndex(tabFocusCursors, currentTabFocusParentCursor) >= 0 ? currentTabFocusParentCursor : walker.clone(); + var currentIndex = findTabFocusIndex(tabFocusCursors, currentTabFocusCursor); + if (currentIndex > 0) { + return tabFocusCursors[currentIndex - 1].clone(); + } + } + return null; + } + var retVal = walker.clone(); + var matchFunc = getStartFunc(mode); + var skipFunc = getSkipFunc(mode); + if (retVal.previous(matchFunc, skipFunc)) { + return retVal; + } + else { + return null; + } + } + SRNavigator.jumpPrevious = jumpPrevious; +})(SRNavigator = exports.SRNavigator || (exports.SRNavigator = {})); + + +/***/ }, + +/***/ "./src/v4/simulator/SRRenderer.ts" +/*!****************************************!*\ + !*** ./src/v4/simulator/SRRenderer.ts ***! + \****************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SRRenderer = void 0; +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var SRNavigator_1 = __webpack_require__(/*! ./SRNavigator */ "./src/v4/simulator/SRNavigator.ts"); +var SRCursor_1 = __webpack_require__(/*! ./SRCursor */ "./src/v4/simulator/SRCursor.ts"); +var render_rules_1 = __webpack_require__(/*! ./render_rules */ "./src/v4/simulator/render_rules/index.ts"); +var common_1 = __webpack_require__(/*! ./render_rules/common */ "./src/v4/simulator/render_rules/common.ts"); +/** + * SRRenderer namespace provides functionality for simulating how screen readers + * announce content to users. It contains rules for rendering different types of + * elements and ARIA roles in various navigation modes. + * + * The renderer uses a rule-based system to determine what text should be announced + * when navigating to, within, or away from elements based on their roles and properties. + */ +var SRRenderer; +(function (SRRenderer) { + /** + * Generates the announcement text when entering an element + * + * This function looks up the appropriate rule based on the element's role or tag name + * and applies it to generate the announcement text. + * + * @param mode - The current navigation mode + * @param walker - Cursor at the current position + * @param oldWalker - Optional cursor at the previous position + * @returns Announcement text for entering the element, or null if no rule applies + */ + function renderEnter(mode, walker, oldWalker) { + var DEBUG = false; + for (var _i = 0, CONTAINER_ENTER_RULES_1 = render_rules_1.CONTAINER_ENTER_RULES; _i < CONTAINER_ENTER_RULES_1.length; _i++) { + var rule = CONTAINER_ENTER_RULES_1[_i]; + var s = rule.test(mode, walker, oldWalker); + DEBUG && console.log(mode, walker, rule, s); + if (typeof s !== "undefined" && s !== null) { + return s; + } + } + return null; + } + SRRenderer.renderEnter = renderEnter; + /** + * Generates the announcement text when leaving an element + * + * Similar to renderEnter, but applies rules for leaving elements instead. + * + * @param mode - The current navigation mode + * @param walker - Cursor at the current position + * @param oldWalker - Optional cursor at the previous position + * @returns Announcement text for leaving the element, or null if no rule applies + */ + function renderLeave(mode, walker, oldWalker) { + for (var _i = 0, CONTAINER_EXIT_RULES_1 = render_rules_1.CONTAINER_EXIT_RULES; _i < CONTAINER_EXIT_RULES_1.length; _i++) { + var rule = CONTAINER_EXIT_RULES_1[_i]; + var s = rule.test(mode, walker, oldWalker); + if (typeof s !== "undefined" && s !== null) { + return s; + } + } + return null; + } + SRRenderer.renderLeave = renderLeave; + /** + * Renders the current element and any container changes + * + * This function combines announcements for: + * - Containers being left + * - Containers being entered + * - The current element itself + * + * @param mode - The current navigation mode + * @param walker - Cursor at the current position + * @param containerChanges - Information about containers being entered or left + * @returns Combined announcement text + */ + function renderCurrent(mode, walker, containerChanges) { + var DEBUG = false; //mode === "tab_focus" && document.getElementById("fixture")?.getAttribute("class") === "tomtest"; + var startOfRender = SRNavigator_1.SRNavigator.jumpCurrent(mode, walker); + if (!startOfRender) + return null; + var endOfRenders = SRNavigator_1.SRNavigator.jumpCurrentEnd(mode, startOfRender); + if (!endOfRenders || endOfRenders.length === 0) { + endOfRenders = [null]; + } + DEBUG && console.log("AAAA", startOfRender.isStartTag(), startOfRender.getNode()); + DEBUG && console.log("BBBB", endOfRenders.map(function (val) { return val && val.isStartTag(); }), endOfRenders.map(function (val) { return val && val.getNode(); })); + var endOfRender = endOfRenders[endOfRenders.length - 1]; + var renderStr = ""; + for (var _i = 0, endOfRenders_1 = endOfRenders; _i < endOfRenders_1.length; _i++) { + var candidateEnd = endOfRenders_1[_i]; + var candidateRenderStr = SRRenderer.renderRange(mode, startOfRender, candidateEnd); + if (candidateRenderStr.trim().length > 0) { + endOfRender = candidateEnd; + renderStr = candidateRenderStr; + break; + } + } + if (renderStr === "") { + renderStr = SRRenderer.renderRange(mode, startOfRender, endOfRender); + } + DEBUG && console.log("CCCC", renderStr); + return { + start: startOfRender, + end: endOfRender, + message: (containerChanges.leaving || []).concat(containerChanges.entering || []).concat([renderStr]).join(" ").replace(/\s+/g, " ") + }; + } + SRRenderer.renderCurrent = renderCurrent; + /** + * Renders a range of elements between two cursors + * + * This function traverses the DOM from startOfRender to endOfRender, + * applying rendering rules to each element and combining the results. + * + * @param mode - The current navigation mode + * @param startOfRender - Cursor at the start of the range + * @param endOfRender - Cursor at the end of the range + * @returns Combined announcement text for the entire range + */ + function renderRange(mode, startOfRender, endOfRender) { + var _a; + var iterWalker = startOfRender.clone(); + var elemStrs = []; + var bContinue = true; + var currentLink = null; + while (bContinue) { + var elem = iterWalker.getElement(); + var node = iterWalker.getNode(); + var nodeType = node.nodeType; + var renderStrs = []; + var linkParent = AriaUtil_1.AriaUtil.getAncestorWithRole(node, "link", true); + if (linkParent && !["content", "text"].includes((_a = new SRCursor_1.SRCursor(linkParent).getNameInfo()) === null || _a === void 0 ? void 0 : _a.nameFrom)) { + // We don't consider links that announce themselves + linkParent = null; + } + for (var _i = 0, SR_RULES_1 = render_rules_1.SR_RULES; _i < SR_RULES_1.length; _i++) { + var rule = SR_RULES_1[_i]; + var s = rule.test(mode, iterWalker); + if (typeof s !== "undefined" && s !== null && s.trim().length > 0) { + if (nodeType === 1 && !iterWalker.isEndTag() && elem.getAttribute("aria-haspopup") === "menu") { + s = "[subMenu] " + s; + } + // Handle links + if (mode === "tab_focus") { + // We're in link mode + if (currentLink && (!linkParent || (linkParent && currentLink !== linkParent))) { + // We've added a string within a link (currentLink), but now we've left the link or moved to a new link + s = "".concat(s, " ").concat((0, common_1.getLinkAnnouncement)(new SRCursor_1.SRCursor(currentLink, false))); + } + } + else { + if (linkParent && (!currentLink || (currentLink !== linkParent))) { + // We're in a link, and we haven't announced this link, or we've moved to a new link + s = "".concat((0, common_1.getLinkAnnouncement)(new SRCursor_1.SRCursor(linkParent, false)), " ").concat(s); + } + } + if (s !== "") { + currentLink = linkParent; + elemStrs.push(s); + } + break; + } + } + elemStrs.push(renderStrs.filter(function (s) { return s.trim().length > 0; }).join(" ")); + bContinue = iterWalker.next(function () { return true; }, SRNavigator_1.SRNavigator.getSkipFunc(mode)) && SRCursor_1.SRCursor.compare(iterWalker, endOfRender) < 0; + } + if (mode === "tab_focus" && currentLink) { + elemStrs.push("".concat((0, common_1.getLinkAnnouncement)(new SRCursor_1.SRCursor(currentLink, false)))); + } + var retVal = elemStrs.filter(function (s) { return s.trim().length > 0; }).join(" "); + retVal = retVal.replace(/, \u0001([^\u0002]+)\u0002/g, function (match, describedByText) { + var quotedText = "\"".concat(describedByText, "\""); + var unmarkedRetVal = retVal.replace(match, ""); + return unmarkedRetVal.includes(quotedText) || unmarkedRetVal.includes(describedByText) ? "" : ", ".concat(quotedText); + }); + retVal = retVal.replace(/[\u0001\u0002]/g, ""); + return retVal; + } + SRRenderer.renderRange = renderRange; +})(SRRenderer = exports.SRRenderer || (exports.SRRenderer = {})); + + +/***/ }, + +/***/ "./src/v4/simulator/SRRendererRule.ts" +/*!********************************************!*\ + !*** ./src/v4/simulator/SRRendererRule.ts ***! + \********************************************/ +(__unused_webpack_module, exports) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SRRendererRule = void 0; +var SRRendererRule = /** @class */ (function () { + function SRRendererRule(ruleDefinition) { + this.ruleDefinition = ruleDefinition; + } + SRRendererRule.prototype.test = function (mode, cursor, oldCursor) { + if (this.ruleDefinition.modes.includes(mode) + && (this.ruleDefinition.roles.includes(cursor.getRole()) + || this.ruleDefinition.elems.includes(cursor.getNode().nodeName.toUpperCase()))) { + for (var _i = 0, _a = this.ruleDefinition.tests; _i < _a.length; _i++) { + var test_1 = _a[_i]; + var s = test_1(cursor, oldCursor, mode); + if (typeof s === "string") + return s; + } + } + return null; + }; + return SRRendererRule; +}()); +exports.SRRendererRule = SRRendererRule; + + +/***/ }, + +/***/ "./src/v4/simulator/SRTableUtil.ts" +/*!*****************************************!*\ + !*** ./src/v4/simulator/SRTableUtil.ts ***! + \*****************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SRTableUtil = void 0; +var SRCursor_1 = __webpack_require__(/*! ./SRCursor */ "./src/v4/simulator/SRCursor.ts"); +/** + * TableUtil namespace provides utility functions for handling HTML tables in the accessibility simulator. + * These functions help determine cell positions, relationships, and extract header information + * to simulate how screen readers would announce table navigation. + */ +var SRTableUtil; +(function (SRTableUtil) { + /** + * Determines if the cursor is pointing to a cell element (TD or TH) + * or has a cell-related ARIA role + * @param cursor - The SRCursor to check + * @returns true if the cursor is on a cell, false otherwise + */ + function isCursorCellRole(cursor) { + if (!cursor.getElement()) + return false; + if (["cell", "rowheader", "columnheader"].includes(cursor.getRole())) { + return true; + } + return !cursor.getElement().hasAttribute("role") && ["TH", "TD"].includes(cursor.getElement().nodeName.toUpperCase()); + } + SRTableUtil.isCursorCellRole = isCursorCellRole; + /** + * Gets a cursor pointing to the current cell or the parent cell if the cursor + * is inside a cell's content + * @param cursor - The SRCursor to check + * @returns A new SRCursor pointing to the cell or null if not in a cell + */ + function getCurrentOrParentCellCursor(cursor) { + return cursor.getCurrentOrParentByRoleClone(["cell", "rowheader", "columnheader"], ["TD", "TH"]); + } + SRTableUtil.getCurrentOrParentCellCursor = getCurrentOrParentCellCursor; + /** + * Get the colspan of a cell at a given location + * @param cursor The cursor to get the colspan from + * @returns The colspan of the cell at the cursor's location or 0 if not in a column + */ + function getColSpan(cursor) { + if (!isCursorCellRole(cursor)) + return 0; + var colSpan = cursor.getElement().getAttribute("colspan"); + if (colSpan) { + return parseInt(colSpan); + } + return 1; + } + SRTableUtil.getColSpan = getColSpan; + /** + * Get the rowspan of a cell at a given location + * @param cursor The cursor to get the rowspan from + * @returns The rowspan of the cell at the cursor's location or 0 if not in a column + */ + function getRowSpan(cursor) { + if (!isCursorCellRole(cursor)) + return 0; + var rowSpan = cursor.getElement().getAttribute("rowspan"); + if (rowSpan) { + return parseInt(rowSpan); + } + return 1; + } + SRTableUtil.getRowSpan = getRowSpan; + /** + * Builds a complete model of a table's structure, accounting for rowspan and colspan + * + * This function traverses the entire table and creates a data structure that represents + * the logical grid of cells, properly handling cells that span multiple rows or columns. + * The resulting model makes it easier to determine cell relationships and positions. + * + * @param inTableCursor - A cursor within the table + * @returns A TableModel representing the complete table structure, or null if not in a table + */ + function getTableModel(inTableCursor) { + // Get a cursor pointing to the table element + var tableCursor = inTableCursor.getCurrentOrParentByRoleClone(["table"]); + if (!tableCursor) + return null; + var walkTableCursor = tableCursor.clone(); + var retVal = []; // The complete table model we're building + var curRow = []; // The current row being processed + var prevRow; // The previous row (needed for rowspan handling) + // Walk through the table's DOM structure + while (walkTableCursor.next(function () { return true; }) && !walkTableCursor.getNode().isSameNode(tableCursor.getNode())) { + if (walkTableCursor.isEndTag() && walkTableCursor.getRole() === "row") { + // Reached the end of the row, push what we have and reset + retVal.push(curRow); + prevRow = curRow; + curRow = []; + // Handle cells with rowspan from previous rows that affect this row + // This ensures cells spanning multiple rows are properly represented in the model + while (prevRow && curRow.length < prevRow.length && + ((prevRow[curRow.length].rowIndexStart + prevRow[curRow.length].rowspan - 1) >= retVal.length)) { + curRow.push(prevRow[curRow.length]); + } + } + // Process each cell in the row + if (!walkTableCursor.isEndTag() && isCursorCellRole(walkTableCursor)) { + var colspan = getColSpan(walkTableCursor); + // Create a cell model with position and spanning information + var cellInfo = { + rowIndexStart: retVal.length, + colIndexStart: curRow.length, + rowspan: getRowSpan(walkTableCursor), + colspan: colspan, + cellCursor: walkTableCursor.clone() + }; + // For cells with colspan, add the same cell info to multiple columns + for (var idx = 0; idx < colspan; ++idx) { + curRow.push(cellInfo); + } + // Continue handling cells with rowspan from previous rows + while (prevRow && curRow.length < prevRow.length && + ((prevRow[curRow.length].rowIndexStart + prevRow[curRow.length].rowspan - 1) >= retVal.length)) { + curRow.push(prevRow[curRow.length]); + } + } + } + return retVal; + } + SRTableUtil.getTableModel = getTableModel; + /** + * Gets the cell model for a specific cell in the table + * + * This function finds the CellModel object that represents a specific cell, + * which contains information about its position and spanning. + * + * @param inCellCursor - A cursor pointing to a cell or its contents + * @param tableModel - Optional pre-built table model (will be created if not provided) + * @returns The CellModel for the specified cell, or null if not found + */ + function getCellModel(inCellCursor, tableModel) { + var cellCursor = getCurrentOrParentCellCursor(inCellCursor); + if (!tableModel) { + tableModel = getTableModel(inCellCursor); + } + // Search through the table model to find the matching cell + for (var rowIndex = 0; rowIndex < tableModel.length; ++rowIndex) { + for (var colIndex = 0; colIndex < tableModel[rowIndex].length; ++colIndex) { + if (tableModel[rowIndex][colIndex].cellCursor.isSameNode(cellCursor)) { + return tableModel[rowIndex][colIndex]; + } + } + } + return null; + } + SRTableUtil.getCellModel = getCellModel; + /** + * Checks if a cell spans a specific column + * + * @param cellModel - The cell model to check + * @param colIdx - The column index to check + * @returns True if the cell contains the specified column + */ + function cellModelContainsColumn(cellModel, colIdx) { + return colIdx >= cellModel.colIndexStart && colIdx < cellModel.colIndexStart + cellModel.colspan; + } + SRTableUtil.cellModelContainsColumn = cellModelContainsColumn; + /** + * Checks if a cell spans a specific row + * + * @param cellModel - The cell model to check + * @param rowIdx - The row index to check + * @returns True if the cell contains the specified row + */ + function cellModelContainsRow(cellModel, rowIdx) { + return rowIdx >= cellModel.rowIndexStart && rowIdx < cellModel.rowIndexStart + cellModel.rowspan; + } + SRTableUtil.cellModelContainsRow = cellModelContainsRow; + /** + * Gets the row headers associated with a cell + * First checks for explicit headers attribute, then looks for row headers in the same row + * @param cursor - The SRCursor pointing to a cell + * @returns A string containing the concatenated header names + */ + function getRowHeaders(cursor) { + return ""; + } + SRTableUtil.getRowHeaders = getRowHeaders; + /** + * Gets the column headers associated with a cell + * First checks for explicit headers attribute, then looks for column headers in the same column + * @param cursor - The SRCursor pointing to a cell + * @returns A string containing the concatenated header names + */ + function getColumnHeadersForCursor(inCellCursor, tableModel) { + if (!tableModel) { + tableModel = getTableModel(inCellCursor); + if (!tableModel) + return ""; + } + var cellModel = getCellModel(inCellCursor, tableModel); + if (!cellModel) + return ""; + var cellCursor = cellModel.cellCursor; + if (!cellCursor) + return ""; + var cellElem = cellCursor.getElement(); + if (!cellElem) + return ""; + var colDatas = []; + for (var colIdx = cellModel.colIndexStart; colIdx < cellModel.colIndexStart + cellModel.colspan; ++colIdx) { + colDatas.push({ + potentialColHeaders: [], + existsDataCell: false, + colIdx: colIdx + }); + } + var potentialHeaders = []; + if (cellElem.hasAttribute("headers")) { + potentialHeaders = cellElem.getAttribute("headers") + // Split the header attribute into ids + .split(" ") + // Get the node for each id + .map(function (id) { return document.getElementById(id); }) + // Get rid of bad mappings + .filter(function (node) { return !!node; }) + // Convert to SRCursors to that we can get accessible names + .map(function (node) { return new SRCursor_1.SRCursor(node); }) + // Remove headers that aren't in the same column (ignore column headers) + .filter(function (cursor) { return colDatas.some(function (colData) { return cellModelContainsColumn(SRTableUtil.getCellModel(cursor, tableModel), colData.colIdx); }); }); + } + else { + // Get all cells in this column + // Note - if everything in this column is empty or a header cell, this is probably not a heading + for (var rowIdx = 0; rowIdx < tableModel.length; ++rowIdx) { + var _loop_1 = function (colData) { + var colIdx = colData.colIdx; + var checkInfo = tableModel[rowIdx][colIdx]; + var checkCursor = checkInfo.cellCursor; + var checkCursorElem = checkCursor.getElement(); + // If this row/col isn't found, or is the same cursor as our original cell model, or already in our list, skip, but check if it's a data cell + if (!checkInfo || !checkCursor || checkCursor.isSameNode(cellCursor) || potentialHeaders.some(function (c) { return checkCursor.isSameNode(c); })) { + colData.existsDataCell = colData.existsDataCell || (isDataCell(checkCursor) && (checkCursor.hasNonEmptyName() || colData.potentialColHeaders.length > 0)); + return "continue"; + } + var c = checkCursor.clone(); + if (checkCursor.getRole() === "columnheader") { + potentialHeaders.push(c); + colData.potentialColHeaders.push(c); + } + else if (!checkCursorElem.hasAttribute("role") && checkCursorElem.nodeName.toUpperCase() === "TH") { + if (checkCursorElem.getAttribute("scope") === "col" || checkCursorElem.getAttribute("scope") === "axis") { + potentialHeaders.push(c); + colData.potentialColHeaders.push(c); + } + else if (!checkCursorElem.hasAttribute("scope") && checkCursor.hasNonEmptyName()) { + potentialHeaders.push(c); + colData.potentialColHeaders.push(c); + } + } + else { + colData.existsDataCell = colData.existsDataCell || (isDataCell(checkCursor) && (checkCursor.hasNonEmptyName() || colData.potentialColHeaders.length > 0)); + } + }; + for (var _i = 0, colDatas_1 = colDatas; _i < colDatas_1.length; _i++) { + var colData = colDatas_1[_i]; + _loop_1(colData); + } + } + for (var _a = 0, colDatas_2 = colDatas; _a < colDatas_2.length; _a++) { + var colData = colDatas_2[_a]; + if (!colData.existsDataCell) { + colData.potentialColHeaders = []; + } + } + potentialHeaders = potentialHeaders.filter(function (one) { return colDatas.some(function (colData) { return colData.potentialColHeaders.some(function (two) { return two.isSameNode(one); }); }); }); + } + return potentialHeaders + // And then return the names of the headers + .map(function (cursor) { var _a; return ((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) || ""; }) + .map(function (s) { return s.trim(); }) + .filter(function (s) { return s.length > 0; }) + .join(", "); + } + SRTableUtil.getColumnHeadersForCursor = getColumnHeadersForCursor; + /** + * Gets the row headers associated with a cell + * First checks for explicit headers attribute, then looks for row headers in the same row + * @param cursor - The SRCursor pointing to a cell + * @returns A string containing the concatenated header names + */ + function getRowHeadersForCursor(inCellCursor, tableModel) { + if (!tableModel) { + tableModel = getTableModel(inCellCursor); + if (!tableModel) + return ""; + } + var cellModel = getCellModel(inCellCursor, tableModel); + if (!cellModel) + return ""; + var cellCursor = cellModel.cellCursor; + if (!cellCursor) + return ""; + var cellElem = cellCursor.getElement(); + if (!cellElem) + return ""; + var rowDatas = []; + for (var rowIdx = cellModel.rowIndexStart; rowIdx < cellModel.rowIndexStart + cellModel.rowspan; ++rowIdx) { + rowDatas.push({ + potentialRowHeaders: [], + existsDataCell: false, + rowIdx: rowIdx + }); + } + var potentialHeaders = []; + if (cellElem.hasAttribute("headers")) { + potentialHeaders = cellElem.getAttribute("headers") + // Split the header attribute into ids + .split(" ") + // Get the node for each id + .map(function (id) { return document.getElementById(id); }) + // Get rid of bad mappings + .filter(function (node) { return !!node; }) + // Convert to SRCursors to that we can get accessible names + .map(function (node) { return new SRCursor_1.SRCursor(node); }) + // Remove headers that aren't in the same row (ignore column headers) + .filter(function (cursor) { return rowDatas.some(function (rowData) { return cellModelContainsRow(SRTableUtil.getCellModel(cursor, tableModel), rowData.rowIdx); }); }); + } + else { + // Get all cells in the rows + // Note - if everything in the row is empty or a header cell, this is probably not a heading + var longestRow = rowDatas.reduce(function (prev, cur) { return Math.max(prev, tableModel[cur.rowIdx].length); }, 0); + for (var colIdx = 0; colIdx < longestRow; ++colIdx) { + var _loop_2 = function (rowData) { + var rowIdx = rowData.rowIdx; + if (colIdx >= tableModel[rowIdx].length) + return "continue"; + var checkInfo = tableModel[rowIdx][colIdx]; + var checkCursor = checkInfo.cellCursor; + var checkCursorElem = checkCursor.getElement(); + // If this row/col isn't found, or is the same cursor as our original cell model, or already in our list, skip, but check if it's a data cell + if (!checkInfo || !checkCursor || checkCursor.isSameNode(cellCursor) || potentialHeaders.some(function (c) { return checkCursor.isSameNode(c); })) { + rowData.existsDataCell = rowData.existsDataCell || (isDataCell(checkCursor) && (checkCursor.hasNonEmptyName() || rowData.potentialRowHeaders.length > 0)); + return "continue"; + } + var c = checkCursor.clone(); + if (checkCursor.getRole() === "rowheader") { + potentialHeaders.push(c); + rowData.potentialRowHeaders.push(c); + } + else if (!checkCursorElem.hasAttribute("role") && checkCursorElem.nodeName.toUpperCase() === "TH") { + if (checkCursorElem.getAttribute("scope") === "row" || checkCursorElem.getAttribute("scope") === "axis") { + potentialHeaders.push(c); + rowData.potentialRowHeaders.push(c); + } + else if (!checkCursorElem.hasAttribute("scope") && checkCursor.hasNonEmptyName()) { + potentialHeaders.push(c); + rowData.potentialRowHeaders.push(c); + } + } + else { + rowData.existsDataCell = rowData.existsDataCell || (isDataCell(checkCursor) && (checkCursor.hasNonEmptyName() || rowData.potentialRowHeaders.length > 0)); + } + }; + for (var _i = 0, rowDatas_1 = rowDatas; _i < rowDatas_1.length; _i++) { + var rowData = rowDatas_1[_i]; + _loop_2(rowData); + } + } + for (var _a = 0, rowDatas_2 = rowDatas; _a < rowDatas_2.length; _a++) { + var rowData = rowDatas_2[_a]; + if (!rowData.existsDataCell) { + rowData.potentialRowHeaders = []; + } + } + potentialHeaders = potentialHeaders.filter(function (one) { return rowDatas.some(function (rowData) { return rowData.potentialRowHeaders.some(function (two) { return two.isSameNode(one); }); }); }); + } + return potentialHeaders + // And then return the names of the headers + .map(function (cursor) { var _a; return ((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) || ""; }) + .map(function (s) { return s.trim(); }) + .filter(function (s) { return s.length > 0; }) + .join(", "); + } + SRTableUtil.getRowHeadersForCursor = getRowHeadersForCursor; + /** + * Determines if a cell is a data cell (not a header cell) + * + * A data cell is one with either: + * - An explicit ARIA role of "cell" + * - A TD element without an overriding role attribute + * + * @param checkCursor - The cursor to check + * @returns True if the cursor points to a data cell + */ + function isDataCell(checkCursor) { + var checkCursorElem = checkCursor.getElement(); + if (!checkCursorElem) + return false; + return checkCursor.getRole() === "cell" || (!checkCursorElem.hasAttribute("role") && checkCursorElem.nodeName.toUpperCase() === "TD"); + } + SRTableUtil.isDataCell = isDataCell; +})(SRTableUtil = exports.SRTableUtil || (exports.SRTableUtil = {})); + + +/***/ }, + +/***/ "./src/v4/simulator/SRUtil.ts" +/*!************************************!*\ + !*** ./src/v4/simulator/SRUtil.ts ***! + \************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SRUtil = void 0; +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var SRUtil; +(function (SRUtil) { + function isModalDialogElement(node) { + if (node.nodeType !== 1) + return false; + var elem = node; + var role = AriaUtil_1.AriaUtil.getResolvedRole(elem, true); + return role === "dialog" && elem.getAttribute("aria-modal") === "true" && VisUtil_1.VisUtil.isNodeVisible(node); + } + SRUtil.isModalDialogElement = isModalDialogElement; + /** + * Generates a unique CSS selector for a specific HTML element + * The selector is built using a combination of: + * 1. Element tag name + * 2. ID (if available) + * 3. Classes (if available) + * 4. Attributes (if needed) + * 5. nth-child selectors for position in parent + * + * @param element The HTML element to generate a selector for + * @param optimized If true, creates a shorter but possibly less robust selector + * @return A CSS selector string that uniquely identifies the element + */ + function getUniqueSelector(element, optimized) { + if (optimized === void 0) { optimized = false; } + // If the element has an ID, that's the most direct way to select it + if (element.id) { + return "#".concat(CSS.escape(element.id)); + } + // If we're at the root or document element, return the tag name + if (element.isSameNode(document.documentElement) || element.isSameNode(document.body)) { + return element.tagName.toLowerCase(); + } + // Start building the selector with the tag name + var selector = element.tagName.toLowerCase(); + // Add classes if available and we're not optimizing for brevity + if (element.classList.length && !optimized) { + // Take up to 3 classes to avoid overly specific selectors + var classes = Array.from(element.classList).slice(0, 3); + selector += classes.map(function (cls) { return ".".concat(CSS.escape(cls)); }).join(''); + } + // Add distinguishing attributes if needed and not optimizing + if (!optimized) { + // Consider adding role, aria-label, or other distinctive attributes + if (element.hasAttribute('role')) { + selector += "[role=\"".concat(CSS.escape(element.getAttribute('role') || ''), "\"]"); + } + if (element.hasAttribute('aria-label')) { + var label = element.getAttribute('aria-label') || ''; + if (label.length <= 20) { // Avoid overly long selectors + selector += "[aria-label=\"".concat(CSS.escape(label), "\"]"); + } + } + // For inputs, add type attribute + if (element.tagName.toLowerCase() === 'input' && element.hasAttribute('type')) { + selector += "[type=\"".concat(CSS.escape(element.getAttribute('type') || ''), "\"]"); + } + } + // If we have a parent node, determine position among siblings + if (element.parentElement) { + // Find all siblings with the same tag + var siblings = Array.from(element.parentElement.children) + .filter(function (child) { return child.tagName === element.tagName; }); + // If there's more than one sibling with the same tag, add nth-child + if (siblings.length > 1) { + var index = siblings.indexOf(element) + 1; + selector += ":nth-of-type(".concat(index, ")"); + } + // If we're not at the root, recursively build the parent selector + // but use optimized selectors for ancestors to keep the overall selector manageable + return "".concat(getUniqueSelector(element.parentElement, true), " > ").concat(selector); + } + return selector; + } + SRUtil.getUniqueSelector = getUniqueSelector; +})(SRUtil = exports.SRUtil || (exports.SRUtil = {})); + + +/***/ }, + +/***/ "./src/v4/simulator/SRViewer.ts" +/*!**************************************!*\ + !*** ./src/v4/simulator/SRViewer.ts ***! + \**************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SRViewer = exports.SROverlay = void 0; +var SRController_1 = __webpack_require__(/*! ./SRController */ "./src/v4/simulator/SRController.ts"); +/** + * SROverlay class for creating a UI widget to control screen reader simulation + * Provides buttons for navigation and displays results + */ +var SROverlay = /** @class */ (function () { + /** + * Creates a new SROverlay + * @param controller The SRController instance to use for navigation + */ + function SROverlay(srViewer) { + this.srViewer = srViewer; + /** Navigation modes available in the UI */ + this.navigationModes = [ + { mode: "item", label: "Item" }, + { mode: "tab_focus", label: "Tabbable" }, + { mode: "heading", label: "Heading" }, + { mode: "region", label: "Region" } + ]; + this.createOverlay(); + } + SROverlay.prototype.createDOMElement = function (elemName, attrs, styles) { + var retVal = this.srViewer.viewerDoc.createElement(elemName); + if (attrs) { + for (var key in attrs) { + retVal[key] = attrs[key]; + } + } + if (styles) { + for (var key in styles) { + retVal.style[key] = styles[key]; + } + } + return retVal; + }; + /** + * Creates the overlay UI elements and adds them to the DOM + */ + SROverlay.prototype.createOverlay = function () { + var _this = this; + // Create main container + this.container = this.createDOMElement("div", { + className: "ibma-sr-overlay" + }, { + position: 'fixed', + bottom: '0', + left: '0', + width: '100%', + backgroundColor: 'rgba(0, 0, 0, 0.8)', + color: 'white', + padding: '10px', + zIndex: '10000', + display: 'flex', + flexDirection: 'column', + gap: '10px' + }); + // Create controls container + var controlsContainer = this.createDOMElement("div", {}, { + display: "flex", flexWrap: "wrap", gap: "10px" + }); + // Create navigation mode groups + this.navigationModes.forEach(function (navMode) { + var modeGroup = _this.createDOMElement('div', {}, { + display: "flex", + alignItems: 'center', + gap: '5px', + margin: '0 10px' + }); + modeGroup.appendChild(_this.createDOMElement('span', { + textContent: navMode.label + ":" + }, {})); + // Previous button + var prevButton = _this.createDOMElement('button', { + textContent: '◀ Prev' + }, { + padding: '5px 10px', + backgroundColor: '#444', + color: 'white', + border: 'none', + borderRadius: '3px', + cursor: 'pointer' + }); + prevButton.addEventListener('click', function () { return _this.srViewer.navigatePrevious(navMode.mode); }); + modeGroup.appendChild(prevButton); + // Next button + var nextButton = _this.createDOMElement('button', { + textContent: 'Next ▶' + }, { + padding: '5px 10px', + backgroundColor: '#444', + color: 'white', + border: 'none', + borderRadius: '3px', + cursor: 'pointer' + }); + nextButton.addEventListener('click', function () { return _this.srViewer.navigateNext(navMode.mode); }); + modeGroup.appendChild(nextButton); + controlsContainer.appendChild(modeGroup); + }); + var otherButtonGroup = this.createDOMElement('div', {}, { + display: "flex", + alignItems: 'center', + gap: '5px', + margin: '0 10px' + }); + // Show all button + var showAllButton = this.createDOMElement('button', { + textContent: 'Show all' + }, { + padding: '5px 10px', + backgroundColor: '#444', + color: 'white', + border: 'none', + borderRadius: '3px', + cursor: 'pointer' + }); + showAllButton.addEventListener('click', function () { return _this.srViewer.showAll(true); }); + otherButtonGroup.appendChild(showAllButton); + // Toggle Speech Button + var toggleSpeech = this.createDOMElement('button', { + textContent: 'Toggle speech' + }, { + padding: '5px 10px', + backgroundColor: '#444', + color: 'white', + border: 'none', + borderRadius: '3px', + cursor: 'pointer' + }); + toggleSpeech.addEventListener('click', function () { return _this.srViewer.toggleSpeech(); }); + otherButtonGroup.appendChild(toggleSpeech); + controlsContainer.appendChild(otherButtonGroup); + // Create results display + this.resultsDisplay = this.createDOMElement('div', { + textContent: 'Screen reader simulation results will appear here.' + }, { + padding: '10px', + backgroundColor: 'rgba(255, 255, 255, 0.1)', + borderRadius: '3px', + minHeight: '100px', + maxHeight: '50vh', + fontFamily: 'monospace', + overflow: 'auto' + }); + // Add elements to container + this.container.appendChild(controlsContainer); + this.container.appendChild(this.resultsDisplay); + // Add to document + this.srViewer.viewerDoc.body.appendChild(this.container); + }; + /** + * Display the navigation result in the overlay + * @param result The navigation result + * @param mode The navigation mode used + * @param direction The navigation direction ('next', 'previous', or 'focus') + */ + SROverlay.prototype.displayResult = function (result, mode, direction) { + var _a, _b, _c, _d; + var displayText = ''; + if (result.success) { + // console.log("???", result); + displayText = "".concat(direction.toUpperCase(), " ").concat(mode, ": ").concat(result.renderingResult.message); + } + else { + displayText = "".concat(direction.toUpperCase(), " ").concat(mode, ": ").concat(result.renderingResult.message); + } + (_b = (_a = result.renderingResult.end) === null || _a === void 0 ? void 0 : _a.getElement()) === null || _b === void 0 ? void 0 : _b.scrollIntoView(); + (_d = (_c = result.renderingResult.start) === null || _c === void 0 ? void 0 : _c.getElement()) === null || _d === void 0 ? void 0 : _d.scrollIntoView(); + window.scrollBy(0, -200); + this.resultsDisplay.innerHTML = ""; + this.resultsDisplay.textContent = displayText; + var inspectButton = this.createDOMElement("button", { + innerText: "Debug" + }, {}); + inspectButton.addEventListener("click", function () { + var _a, _b; + console.log((_a = result.renderingResult.start) === null || _a === void 0 ? void 0 : _a.getNode(), (_b = result.renderingResult.end) === null || _b === void 0 ? void 0 : _b.getNode()); + }); + this.resultsDisplay.appendChild(inspectButton); + }; + SROverlay.prototype.displayAll = function (result) { + var _this = this; + var table = this.createDOMElement("table", {}, {}); + var headerRow = this.createDOMElement("tr", {}, {}); + var headingLabels = ["Region", "Heading", "Item", "Tabbable"]; + var headingFields = ["region", "heading", "item", "tab_focus"]; + for (var _i = 0, headingLabels_1 = headingLabels; _i < headingLabels_1.length; _i++) { + var headingLabel = headingLabels_1[_i]; + headerRow.appendChild(this.createDOMElement("th", { + scope: "col", + innerText: headingLabel + }, { + textAlign: "left", + padding: ".25rem", + margin: "0rem", + color: "white" + })); + table.appendChild(headerRow); + } + var _loop_1 = function (line) { + var dataRow = this_1.createDOMElement("tr", {}, {}); + headingFields.forEach(function (field) { + dataRow.appendChild(_this.createDOMElement("td", { + innerText: line[field] + }, { + verticalAlign: "top", + border: "solid white 1px", + padding: ".25rem", + margin: "0rem", + color: "white" + })); + }); + table.appendChild(dataRow); + }; + var this_1 = this; + for (var _a = 0, result_1 = result; _a < result_1.length; _a++) { + var line = result_1[_a]; + _loop_1(line); + } + this.resultsDisplay.innerHTML = ""; + this.resultsDisplay.appendChild(table); + }; + /** + * Remove the overlay from the DOM + */ + SROverlay.prototype.destroy = function () { + if (this.container && this.container.parentNode) { + this.container.parentNode.removeChild(this.container); + } + }; + return SROverlay; +}()); +exports.SROverlay = SROverlay; +/** + * SRViewer class for managing screen reader simulation with UI controls + */ +var SRViewer = /** @class */ (function () { + /** + * Creates a new SRViewer + * @param rootElement The root element to start from (defaults to document.body) + */ + function SRViewer(rootElement) { + if (rootElement === void 0) { rootElement = document.body; } + /** Flag to track if speech is active */ + this.isStreaming = false; + /** Flag to set if showing all */ + this.isShowingAll = false; + /** Flag to set if it should be speaking */ + this.speechEnabled = false; + this.viewerDoc = rootElement.ownerDocument; + // Create controller for the document body + this.controller = SRController_1.SRController.getController(this.viewerDoc); + // Create overlay UI + this.overlay = new SROverlay(this); + // Set up keyboard handlers + this.setupKeyboardHandlers(); + // Set up focus tracking + this.setupFocusTracking(); + // Set up mutation tracking + this.setupMutationTracking(); + } + SRViewer.prototype.showAll = function (bEnableAllMode) { + if (bEnableAllMode) { + this.isShowingAll = true; + } + var result = SRController_1.SRController.renderStructure(this.viewerDoc); + this.overlay.displayAll(result); + }; + SRViewer.prototype.toggleSpeech = function () { + this.speechEnabled = !this.speechEnabled; + }; + /** + * Navigate to the next element using the specified mode + * @param mode The navigation mode to use + */ + SRViewer.prototype.navigateNext = function (mode) { + this.isShowingAll = false; + var result = this.controller.jumpNext(mode); + this.overlay.displayResult(result, mode, 'next'); + this.speakResult(result); + }; + /** + * Navigate to the previous element using the specified mode + * @param mode The navigation mode to use + */ + SRViewer.prototype.navigatePrevious = function (mode) { + this.isShowingAll = false; + var result = this.controller.jumpPrevious(mode); + this.overlay.displayResult(result, mode, 'previous'); + this.speakResult(result); + }; + /** + * Set up keyboard event handlers for screen reader navigation + */ + SRViewer.prototype.setupKeyboardHandlers = function () { + var _this = this; + this.keyboardHandler = function (e) { + // Don't capture keyboard events when focus is in form controls + var target = e.target; + if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.tagName === 'SELECT') { + return; + } + // Handle keyboard shortcuts + if (e.ctrlKey) { + // Ctrl key stops speech + _this.stopSpeech(); + return; + } + if (e.altKey || e.metaKey) + return; + // console.log(e.key); + switch (e.key) { + case 'ArrowUp': + e.preventDefault(); + _this.navigatePrevious('item'); + break; + case ' ': + _this.isStreaming = true; + case 'ArrowDown': + e.preventDefault(); + _this.navigateNext('item'); + break; + case 'Enter': + e.preventDefault(); + _this.activateCurrentElement(); + _this.controller.setPointOfRegard(_this.viewerDoc.activeElement); + break; + case 'H': + case 'h': + if (e.shiftKey) { + e.preventDefault(); + _this.navigatePrevious('heading'); + } + else { + e.preventDefault(); + _this.navigateNext('heading'); + } + break; + case 'R': + case 'r': + if (e.shiftKey) { + e.preventDefault(); + _this.navigatePrevious('region'); + } + else { + e.preventDefault(); + _this.navigateNext('region'); + } + break; + case 'Tab': + if (e.shiftKey) { + e.preventDefault(); + _this.navigatePrevious('tab_focus'); + } + else { + e.preventDefault(); + _this.navigateNext('tab_focus'); + } + break; + } + }; + // Add the event listener + this.viewerDoc.addEventListener('keydown', this.keyboardHandler); + }; + SRViewer.prototype.speakResult = function (result) { + var _this = this; + if (!this.speechEnabled) + return; + var utterance = new SpeechSynthesisUtterance(result.renderingResult.message); + utterance.rate = 1.5; + var myThis = this; + utterance.addEventListener("end", function (event) { + if (myThis.isStreaming) { + _this.navigateNext('item'); + } + }); + speechSynthesis.cancel(); + speechSynthesis.speak(utterance); + }; + /** + * Stop speech output + */ + SRViewer.prototype.stopSpeech = function () { + this.isStreaming = false; + // Cancel any active speech synthesis + speechSynthesis.cancel(); + }; + /** + * Set up mutation tracking + */ + SRViewer.prototype.setupMutationTracking = function () { + var _this = this; + var observer = new MutationObserver(function (mutations) { + // console.log(this.isShowingAll, mutations.length); + if (_this.isShowingAll) { + var outsideOverlay = mutations.filter(function (mutation) { return mutation.target.nodeType === 1 + && !mutation.target.closest(".ibma-sr-overlay"); }); + if (outsideOverlay.length > 0) { + // console.log("Mutations",outsideOverlay); + observer.disconnect(); + var myThis_1 = _this; + myThis_1.showAll(); + setTimeout(function () { + myThis_1.showAll(); + observer.observe(_this.viewerDoc.documentElement, { + attributes: true, + childList: true, + subtree: true + }); + }, 1000); + } + } + }); + observer.observe(this.viewerDoc.documentElement, { + attributes: true, + childList: true, + subtree: true + }); + }; + /** + * Set up focus tracking to update the point of regard when focus changes + */ + SRViewer.prototype.setupFocusTracking = function () { + var _this = this; + this.focusHandler = function (e) { + // Skip if the focus is on the overlay itself + if (e.target instanceof HTMLElement) { + var target = e.target; + if (_this.overlay && target.closest('.ibma-sr-overlay')) { + return; + } + console.group("focusHandler"); + // Update the point of regard to the newly focused element + var result = _this.controller.setPointOfRegard(target); + // Announce the focus change + if (result.success) { + _this.overlay.displayResult(result, 'focus', 'focus'); + _this.speakResult(result); + } + console.groupEnd(); + } + }; + // Add the focus event listener to the document + this.viewerDoc.addEventListener('focusin', this.focusHandler); + }; + /** + * Activate (click) the element at the current point of regard + */ + SRViewer.prototype.activateCurrentElement = function () { + var currentElement = this.controller.getPointOfRegard().getElement(); + if (currentElement) { + // Announce that we're activating the element + var result = { + success: true, + renderingResult: { + message: "Activating: ".concat(currentElement.textContent || currentElement.nodeName), + start: this.controller.getPointOfRegard(), + end: this.controller.getPointOfRegard() + } + }; + this.overlay.displayResult(result, 'focus', 'focus'); + this.speakResult(result); + // Focus the element first + if (currentElement.focus) { + currentElement.focus(); + } + // Simulate a click on the element + currentElement.click(); + } + }; + /** + * Get the controller instance + * @returns The SRController instance + */ + SRViewer.prototype.getController = function () { + return this.controller; + }; + /** + * Destroy the viewer and clean up resources + */ + SRViewer.prototype.destroy = function () { + // Remove event listeners + this.viewerDoc.removeEventListener('keydown', this.keyboardHandler); + this.viewerDoc.removeEventListener('focusin', this.focusHandler); + // Stop any active speech + this.stopSpeech(); + // Destroy overlay + this.overlay.destroy(); + }; + return SRViewer; +}()); +exports.SRViewer = SRViewer; + + +/***/ }, + +/***/ "./src/v4/simulator/render_rules/common.ts" +/*!*************************************************!*\ + !*** ./src/v4/simulator/render_rules/common.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.RULES = exports.getLinkAnnouncement = exports.getRoleDescription = exports.quoteName = exports.quoteNamePadBefore = exports.quoteNamePadAfter = void 0; +var SRCursor_1 = __webpack_require__(/*! ../SRCursor */ "./src/v4/simulator/SRCursor.ts"); +var SRRendererRule_1 = __webpack_require__(/*! ../SRRendererRule */ "./src/v4/simulator/SRRendererRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var VisUtil_1 = __webpack_require__(/*! ../../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +/** + * Provide the name, surrounded by the quoteCharBefore and quoteCharAfter and followed by the padding if the name exists + * @param cursor The cursor for which to fetch the name + * @param padding String to add after, if the name exists + * @param quoteCharBefore The string to use as the leading quote, if the name exists + * @param quoteCharBefore The string to use as the trailing quote, if the name exists + * @returns + */ +function quoteNamePadAfter(cursor, padding, quoteCharBefore, quoteCharAfter) { + return cursor.getName() + ? "".concat(quoteName(cursor)).concat(padding || ", ") + : ""; +} +exports.quoteNamePadAfter = quoteNamePadAfter; +/** + * Provide the name, surrounded by quotes and preceded by the padding if the name exists + * @param cursor The cursor for which to fetch the name + * @param padding String to add before, if the name exists (defaults to ", ") + * @returns The quoted name with leading padding, or empty string if no name exists + */ +function quoteNamePadBefore(cursor, padding) { + return cursor.getName() + ? "".concat(padding || ", ").concat(quoteName(cursor)) + : ""; +} +exports.quoteNamePadBefore = quoteNamePadBefore; +/** + * Provide the name surrounded by quote characters + * @param cursor The cursor for which to fetch the name + * @param quoteCharBefore The string to use as the leading quote (defaults to ") + * @param quoteCharAfter The string to use as the trailing quote (defaults to ") + * @returns The quoted name, or empty string if no name exists + */ +function quoteName(cursor, quoteCharBefore, quoteCharAfter) { + return cursor.getName() + ? "".concat(quoteCharBefore || '"').concat(cursor.getName()).concat(quoteCharAfter || '"') + : ""; +} +exports.quoteName = quoteName; +/** + * Get the role description for an element, using aria-roledescription if present + * Falls back to the provided default role name if aria-roledescription is not specified or empty + * @param cursor The cursor positioned at the element + * @param defaultRole The default role name to use if aria-roledescription is not present + * @returns The role description (either custom or default) + */ +function getRoleDescription(cursor, defaultRole) { + var elem = cursor.getElement(); + if (!elem) + return defaultRole; + var roleDescription = elem.getAttribute("aria-roledescription"); + if (roleDescription && roleDescription.trim().length > 0) { + return roleDescription.trim(); + } + return defaultRole; +} +exports.getRoleDescription = getRoleDescription; +/** + * Generate the screen reader announcement for a link element + * Distinguishes between same-page links (anchors) and regular links + * @param cursor The cursor positioned at the link element + * @param mode The navigation mode (affects announcement order) + * @returns The formatted link announcement string + */ +function getLinkAnnouncement(cursor, mode) { + var href = (cursor.getNode().href) || ""; + var announceStr = ""; + if (href.startsWith(document.location.href) && href.charAt(document.location.href.length) === "#") { + announceStr = "same page link"; + } + else { + announceStr = "link"; + } + var nameInfo = cursor.getNameInfo(); + if (nameInfo && !["content", "text"].includes(nameInfo.nameFrom)) { + if (mode === "tab_focus") { + return "[".concat(quoteNamePadAfter(cursor)).concat(announceStr, "]"); + } + else { + return "[".concat(announceStr).concat(quoteNamePadBefore(cursor), "]"); + } + } + return "[".concat(announceStr, "]"); +} +exports.getLinkAnnouncement = getLinkAnnouncement; +/** + * Get the description text from aria-describedby references + * Resolves all IDs in aria-describedby and concatenates their text content + * @param elem The element with aria-describedby attribute + * @param mode The navigation mode (returns empty string in "item" mode) + * @returns The formatted description text with leading comma and quotes, or empty string + */ +function getDescribedByAnnouncements(elem, mode) { + var describedBy = elem.getAttribute("aria-describedby"); + if (!describedBy) + return ""; + var descriptionElems = describedBy + .split(/\s+/) + .map(function (id) { return document.getElementById(id); }) + .filter(function (descElem) { return !!descElem; }); + var descriptionText = descriptionElems + .map(function (descElem) { var _a; return (_a = descElem.textContent) === null || _a === void 0 ? void 0 : _a.trim(); }) + .filter(function (text) { return !!text; }) + .join(" "); + if (!descriptionText || descriptionText.length === 0) + return ""; + if (mode === "item") + return ", \u0001".concat(descriptionText, "\u0002"); + return ", \"".concat(descriptionText, "\""); +} +/** + * Get state announcements for disabled, readonly, required, and invalid attributes + * @param elem The element to check for state attributes + * @returns A string with state announcements (e.g., ", disabled", ", read only", ", required", ", invalid") + */ +function getStateAnnouncements(elem) { + var states = ""; + // Check for disabled state (both attribute and aria-disabled) + if (elem.hasAttribute("disabled") || elem.getAttribute("aria-disabled") === "true") { + states += ", disabled"; + } + // Check for readonly state (both attribute and aria-readonly) + if (elem.hasAttribute("readonly") || elem.getAttribute("aria-readonly") === "true") { + states += ", read only"; + } + // Check for required state (both attribute and aria-required) + if (elem.hasAttribute("required") || elem.getAttribute("aria-required") === "true") { + states += ", required"; + } + // Check for invalid state (aria-invalid) + if (elem.getAttribute("aria-invalid") === "true") { + states += ", invalid"; + } + return states; +} +/** + * Check if a listitem contains interactive/widget elements + * Screen readers typically don't read the accessible name of a listitem when it contains interactive elements + * Uses DOMWalker to properly traverse shadow DOM and other complex structures + */ +function listitemContainsInteractiveElement(cursor) { + var elem = cursor.getElement(); + if (!elem) + return false; + // Use DOMWalker to traverse the entire subtree including shadow DOM + var walker = new DOMWalker_1.DOMWalker(elem, false, elem, false); + // Walk through all descendants + while (walker.nextNode()) { + // Only check element nodes at start tags + if (walker.node.nodeType === 1 && !walker.bEndTag) { + var role = AriaUtil_1.AriaUtil.getResolvedRole(walker.node); + if (role && ARIADefinitions_1.ARIADefinitions.designPatterns[role] && ARIADefinitions_1.ARIADefinitions.designPatterns[role].roleType === 'widget') { + return true; + } + } + } + return false; +} +/** + * Check if an iframe's content can be accessed (not cross-origin) + * Attempts to access the iframe's document to determine if it's accessible + * @param iframe The iframe element to check + * @returns true if the iframe content is accessible, false if cross-origin or blocked + */ +function canAccessFrame(iframe) { + try { + // This throws a DOMException for cross-origin frames + var doc = iframe.contentDocument || iframe.contentWindow.document; + return doc !== null; + } + catch (e) { + return false; + // if (e instanceof DOMException && e.name === 'SecurityError') { + // return false; // Cross-origin, access blocked + // } + // throw e; // Re-throw unexpected errors + } +} +exports.RULES = [ + // Single role rules - alphabetically sorted + // Button role + new SRRendererRule_1.SRRendererRule({ + roles: ["button"], + elems: [], + modes: ["item", "button", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (!cursor.isStartTag()) + return null; + var elem = cursor.getNode(); + var roleDesc = getRoleDescription(cursor, "button"); + if (elem.getAttribute("aria-pressed") === "true") { + return "[toggle ".concat(roleDesc, ", pressed").concat(quoteNamePadBefore(cursor)).concat(getDescribedByAnnouncements(elem, mode), "]"); + } + return null; + }, + function (cursor, _oldCursor, mode) { + if (!cursor.isStartTag()) + return null; + var elem = cursor.getNode(); + var roleDesc = getRoleDescription(cursor, "button"); + if (elem.getAttribute("aria-pressed") === "false") { + return "[toggle ".concat(roleDesc, ", not pressed").concat(quoteNamePadBefore(cursor)).concat(getDescribedByAnnouncements(elem, mode), "]"); + } + return null; + }, + function (cursor, _oldCursor, mode) { + if (cursor.isEndTag()) + return undefined; + var expandStr = ""; + var elem = cursor.getElement(); + var roleDesc = getRoleDescription(cursor, "button"); + if (["menu", "true"].includes(elem.getAttribute("aria-haspopup"))) { + expandStr += ", menu"; + } + if (elem.hasAttribute("aria-expanded")) { + expandStr += ", ".concat(elem.getAttribute("aria-expanded") === "true" ? "expanded" : "collapsed"); + } + expandStr += getStateAnnouncements(elem); + return "[".concat(quoteNamePadAfter(cursor)).concat(roleDesc).concat(expandStr).concat(getDescribedByAnnouncements(elem, mode), "]"); + }, + function (cursor) { if (cursor.isEndTag()) + return ""; } + ] + }), + // Checkbox role + new SRRendererRule_1.SRRendererRule({ + roles: ["checkbox"], + elems: [], + modes: ["item", "checkbox", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (cursor.isStartTag()) { + var elem = cursor.getNode(); + var roleDesc = getRoleDescription(cursor, "checkbox"); + var stateStr = ""; + if (elem.getAttribute("aria-checked") === "mixed") { + stateStr = "half checked"; + } + else { + var bChecked = false; + if (elem.hasAttribute("aria-checked")) { + bChecked = elem.getAttribute("aria-checked") === "true"; + } + else { + bChecked = elem.checked; + } + stateStr = bChecked ? "checked" : "not checked"; + } + stateStr += getStateAnnouncements(cursor.getElement()); + return "[".concat(roleDesc, ", ").concat(stateStr).concat(quoteNamePadBefore(cursor)).concat(getDescribedByAnnouncements(cursor.getElement(), mode), "]"); + } + else { + return ""; + } + } + ] + }), + // Cell, Columnheader, and Rowheader roles + new SRRendererRule_1.SRRendererRule({ + roles: ["cell", "columnheader", "rowheader"], + elems: [], + modes: ["item", "table"], + tests: [ + function (cursor) { + var _a; + if (!cursor.isStartTag()) + return null; + // Get the cell element + var cellElem = cursor.getElement(); + if (!cellElem) + return null; + // Check if the cell has any visible content by checking: + // 1. Text content (trimmed) + // 2. Child elements with roles (buttons, links, etc.) + // 3. Images with alt text + var textContent = ((_a = cellElem.textContent) === null || _a === void 0 ? void 0 : _a.trim()) || ""; + // Check for child elements with interactive roles or content + var walker = new DOMWalker_1.DOMWalker(cellElem, false, cellElem, false); + var hasContent = textContent.length > 0; + if (!hasContent) { + // Check for elements that would have content (buttons, links, images, etc.) + while (walker.nextNode()) { + if (walker.node.nodeType === 1 && !walker.bEndTag) { + var elem = walker.node; + var role = AriaUtil_1.AriaUtil.getResolvedRole(elem); + // Check for interactive elements or elements with accessible names + if (role && ARIADefinitions_1.ARIADefinitions.designPatterns[role]) { + hasContent = true; + break; + } + // Check for images with alt text + if (elem.nodeName.toUpperCase() === "IMG" && elem.hasAttribute("alt")) { + hasContent = true; + break; + } + } + } + } + // If the cell is empty, return "[blank]" + if (!hasContent) { + return "[blank]"; + } + // Otherwise, return null to let default rendering continue + return null; + } + ] + }), + // Combobox role + new SRRendererRule_1.SRRendererRule({ + roles: ["combobox"], + elems: [], + modes: ["item", "combo", "tab_focus"], + tests: [ + function (cursor) { + if (cursor.isEndTag()) + return ""; + var roleDesc = getRoleDescription(cursor, "combo box"); + var elem = cursor.getElement(); + var state = ""; + if (cursor.getNode().nodeName.toUpperCase() === "SELECT") { + state = ", collapsed"; + var selectElem = cursor.getElement(); + var valueElem = selectElem.selectedIndex >= 0 ? selectElem.options[selectElem.selectedIndex] : null; + var valueStr = ""; + if (valueElem) { + var temp = new SRCursor_1.SRCursor(valueElem, false); + valueStr = quoteNamePadBefore(temp, ", "); + } + state += getStateAnnouncements(elem); + return "[".concat(quoteNamePadAfter(cursor)).concat(roleDesc).concat(state).concat(valueStr, "]"); + } + else if (cursor.getNode().nodeName.toUpperCase() === "INPUT" && !cursor.getElement().hasAttribute("role")) { + state = getStateAnnouncements(elem); + return "[".concat(quoteNamePadAfter(cursor)).concat(roleDesc, ", has auto complete, editable, opens list").concat(state, "]"); + } + else { + if (elem.hasAttribute("aria-expanded")) { + state = ", ".concat(elem.getAttribute("aria-expanded") === "true" ? "expanded" : "collapsed"); + if (elem.hasAttribute("aria-autocomplete")) { + state += ", has auto complete"; + } + state += ", editable, opens list"; + } + state += getStateAnnouncements(elem); + return "[".concat(quoteNamePadAfter(cursor)).concat(roleDesc).concat(state, "]"); + } + } + ] + }), + // Default role (fallback) + new SRRendererRule_1.SRRendererRule({ + roles: ["default"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var _a; + return cursor.isStartTag() ? + "!!<".concat(cursor.getRole(), ">").concat((((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) + ""), "!!") : + "!!</".concat(cursor.getRole(), ">!!"); + } + ] + }), + // Deletion role + new SRRendererRule_1.SRRendererRule({ + roles: ["deletion"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { return (cursor.isStartTag() && "[deleted]" || ""); } + ] + }), + // Dialog role + new SRRendererRule_1.SRRendererRule({ + roles: ["dialog"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + return cursor.isEndTag() ? "[End of dialog]" : "[Start of dialog".concat(quoteNamePadBefore(cursor)); + } + ] + }), + // Document role + new SRRendererRule_1.SRRendererRule({ + roles: ["document", "generic"], + elems: [], + modes: ["item"], + tests: [ + function () { return ""; } + ] + }), + // Graphics document role + new SRRendererRule_1.SRRendererRule({ + roles: ["graphics-document"], + elems: [], + modes: ["item", "image"], + tests: [ + function (cursor) { + var _a, _b; + if (cursor.isStartTag() && !((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) && ((_b = cursor.getNameInfo()) === null || _b === void 0 ? void 0 : _b.name) !== "") { + // Don't announce unlabeled graphics that are hidden inside links or headings + var parentHeadingOrLink = cursor.getCurrentOrParentByRoleClone(["heading", "link"]); + if (parentHeadingOrLink && VisUtil_1.VisUtil.isNodeHiddenFromAT(cursor.getElement())) { + return ""; + } + return "[Unlabeled graphic]"; + } + return null; + }, + function (cursor) { var _a; return (cursor.isStartTag() && (((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) === "")) ? "" : null; }, + function (cursor) { var _a; return (cursor.isStartTag() && ((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) && "[graphic".concat(quoteNamePadBefore(cursor), "]")) || null; }, + function (cursor) { return (cursor.isEndTag()) ? "" : null; } + ] + }), + // Heading role + new SRRendererRule_1.SRRendererRule({ + roles: ["heading"], + elems: [], + modes: ["item", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (mode === "tab_focus" && cursor.isStartTag()) + return ""; + if (mode === "item" && cursor.isEndTag()) + return ""; + var level; + var node = cursor.getElement(); + if (node.ariaLevel) { + // Explicit aria-level attribute + level = node.ariaLevel; + } + else if (node.getAttribute('role') === 'heading') { + // role="heading" without aria-level defaults to 2 + level = '2'; + } + else { + // Native heading element (h1-h6), extract number from tag name + level = node.nodeName.substring(1); + } + var nameInfo = cursor.getNameInfo(); + if ((!nameInfo || ["content", "text"].includes(nameInfo.nameFrom)) && !(node.textContent || "").trim()) { + return ""; + } + if (nameInfo && !["content", "text"].includes(nameInfo.nameFrom)) { + return "[heading level ".concat(level).concat(quoteNamePadBefore(cursor), "]"); + } + else { + return "[heading level ".concat(level, "]"); + } + } + ] + }), + // -- in heading mode + new SRRendererRule_1.SRRendererRule({ + roles: ["heading"], + elems: [], + modes: ["heading", "h1", "h2", "h3", "h4", "h5", "h6"], + tests: [ + function (cursor) { + if (cursor.isStartTag()) { + var node = cursor.getNode(); + var level = void 0; + if (node.ariaLevel) { + // Explicit aria-level attribute + level = node.ariaLevel; + } + else if (node.getAttribute('role') === 'heading') { + // role="heading" without aria-level defaults to 2 + level = '2'; + } + else { + // Native heading element (h1-h6), extract number from tag name + level = node.nodeName.substring(1); + } + var nameInfo = cursor.getNameInfo(); + if ((!nameInfo || ["content", "text"].includes(nameInfo.nameFrom)) && !(node.textContent || "").trim()) { + return ""; + } + return "[".concat(quoteNamePadAfter(cursor), "heading level ").concat(level, "]"); + } + return ""; + } + ] + }), + // Image role + new SRRendererRule_1.SRRendererRule({ + roles: ["img"], + elems: [], + modes: ["item", "image"], + tests: [ + function (cursor) { + var _a, _b, _c; + if (cursor.isEndTag()) { + return ""; + } + else { + if (!((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) && ((_b = cursor.getNameInfo()) === null || _b === void 0 ? void 0 : _b.name) !== "") { + // Don't announce unlabeled graphics that are hidden inside links or headings + // (these were only included because of the SKIP_ITEM_BEHAVIOR change) + var parentHeadingOrLink = cursor.getCurrentOrParentByRoleClone(["heading", "link"]); + if (parentHeadingOrLink && VisUtil_1.VisUtil.isNodeHiddenFromAT(cursor.getElement())) { + return ""; + } + return "[Unlabeled graphic]"; + } + else if (((_c = cursor.getNameInfo()) === null || _c === void 0 ? void 0 : _c.name) === "") { + return ""; + } + else { + return "[graphic".concat(quoteNamePadBefore(cursor), "]"); + } + } + } + ] + }), + // Insertion role + new SRRendererRule_1.SRRendererRule({ + roles: ["insertion"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { return (cursor.isStartTag() && "[inserted]" || ""); } + ] + }), + // Link role + new SRRendererRule_1.SRRendererRule({ + roles: ["link"], + elems: [], + modes: ["item", "region", "link", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + var _a; + if (cursor.isStartTag() && !["content", "text"].includes((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.nameFrom)) { + return getLinkAnnouncement(cursor, mode); + } + return null; + } + ] + }), + // Listitem role + new SRRendererRule_1.SRRendererRule({ + roles: ["listitem"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var _a; + var isOrdered; + var parentListElem; + var walkParents = DOMWalker_1.DOMWalker.parentNode(cursor.getNode()); + while (typeof isOrdered === "undefined" && walkParents) { + if (walkParents.nodeType === 1) { + var elem = walkParents; + if (elem.hasAttribute("role")) { + if (elem.getAttribute("role") === "list") { + isOrdered = false; + parentListElem = elem; + } + } + else if (elem.nodeName.toUpperCase() === "UL") { + isOrdered = false; + parentListElem = elem; + } + else if (elem.nodeName.toUpperCase() === "OL") { + isOrdered = true; + parentListElem = elem; + } + } + walkParents = DOMWalker_1.DOMWalker.parentNode(walkParents); + } + // Check if listitem contains interactive elements + // Screen readers don't read the accessible name when interactive elements are present + var hasInteractiveContent = listitemContainsInteractiveElement(cursor); + var nameToUse = hasInteractiveContent ? "" : (((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) || ""); + var retStr = ""; + if (!isOrdered) { + var elem = cursor.getElement(); + if ((elem.nodeName.toUpperCase() === "LI" && window.getComputedStyle(elem).listStyleType === "none") + || elem.nodeName.toUpperCase() !== "LI") { + retStr = cursor.isStartTag() ? "".concat(nameToUse) : ""; + } + else { + retStr = cursor.isStartTag() ? "[bullet] ".concat(nameToUse) : ""; + } + } + else { + // For ordered lists, count sibling listitems and account for start attribute + var count = 1; // Start at 1 by default + // Get the start attribute if it exists on the <ol> element + if (parentListElem && parentListElem.nodeName.toUpperCase() === 'OL' && + parentListElem.hasAttribute('start')) { + var startValue = parseInt(parentListElem.getAttribute('start') || '1', 10); + count = isNaN(startValue) ? 1 : startValue; + } + // Count previous sibling listitems at the same level using DOMWalker + var currentElem = cursor.getElement(); + var sibling = DOMWalker_1.DOMWalker.previousSiblingNotOwnedBySlot(currentElem); + while (sibling) { + // Only count direct siblings that are listitems (element nodes only) + if (sibling.nodeType === 1) { + var siblingElem = sibling; + if (siblingElem.getAttribute('role') === 'listitem' || + siblingElem.nodeName.toUpperCase() === 'LI') { + count++; + } + } + sibling = DOMWalker_1.DOMWalker.previousSiblingNotOwnedBySlot(sibling); + } + retStr = cursor.isStartTag() ? "".concat(count, ". ").concat(nameToUse) : ""; + } + return retStr; + } + ] + }), + // Math role + new SRRendererRule_1.SRRendererRule({ + roles: ["math"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { return cursor.isEndTag() ? "[math content]" : ""; } + ] + }), + // Link role + new SRRendererRule_1.SRRendererRule({ + roles: ["menuitem"], + elems: [], + modes: ["item", "tab_focus", "region"], + tests: [ + function (cursor) { + var retVal = ""; + if (cursor.isStartTag()) { + // let isSubMenuContainer = false; + // for (let checkChildren=cursor.getNode().firstChild; !isSubMenuContainer && checkChildren !== null; checkChildren = checkChildren.nextSibling) { + // isSubMenuContainer = checkChildren.nodeName.toUpperCase() === "UL"; + // } + // if (isSubMenuContainer) return "[????menu]"; + var expandStr = ""; + var elem = cursor.getElement(); + if (elem.getAttribute("aria-haspopup") === "true") { + expandStr += ", sub-menu"; + } + if (elem.hasAttribute("aria-expanded")) { + expandStr += ", ".concat(elem.getAttribute("aria-expanded") === "true" ? "expanded" : "collapsed"); + } + retVal = "[menu".concat(expandStr); + var nameInfo = cursor.getNameInfo(); + if (nameInfo && !["content", "text"].includes(nameInfo.nameFrom)) { + retVal += quoteNamePadBefore(cursor); + } + retVal += "]"; + } + return retVal; + } + ] + }), + // Meter role + new SRRendererRule_1.SRRendererRule({ + roles: ["meter"], + elems: [], + modes: ["item", "tab_focus"], + tests: [ + function (cursor) { return cursor.isStartTag() ? "[progress bar, ".concat((cursor.getNode().value), "]") : ""; } + ] + }), + // Progressbar role + new SRRendererRule_1.SRRendererRule({ + roles: ["progressbar"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { return cursor.isStartTag() ? "[progress bar, ".concat((cursor.getNode().value), "]") : ""; } + ] + }), + // Radio role + new SRRendererRule_1.SRRendererRule({ + roles: ["radio"], + elems: [], + modes: ["item", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (cursor.isStartTag()) { + var roleDesc = getRoleDescription(cursor, "radio button"); + var bChecked = false; + if (cursor.getElement().hasAttribute("aria-checked")) { + bChecked = cursor.getElement().getAttribute("aria-checked") === "true"; + } + else { + bChecked = cursor.getNode().checked; + } + var stateStr = getStateAnnouncements(cursor.getElement()); + return "[".concat(roleDesc, ", ").concat(bChecked ? "checked" : "not checked").concat(stateStr).concat(quoteNamePadBefore(cursor)).concat(getDescribedByAnnouncements(cursor.getElement(), mode), "]"); + } + else { + return ""; + } + } + ] + }), + // Searchbox role + new SRRendererRule_1.SRRendererRule({ + roles: ["searchbox"], + elems: [], + modes: ["item", "tab_focus"], + tests: [ + function (cursor) { return cursor.isStartTag() ? "[".concat(quoteNamePadAfter(cursor), "edit]") : ""; } + ] + }), + // Separator role + new SRRendererRule_1.SRRendererRule({ + roles: ["separator"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { return (cursor.isStartTag() && "[separator]" || ""); } + ] + }), + // Slider role + new SRRendererRule_1.SRRendererRule({ + roles: ["slider"], + elems: [], + modes: ["item", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (!cursor.isStartTag()) + return ""; + var roleDesc = getRoleDescription(cursor, "slider"); + var elem = cursor.getElement(); + // Check for aria-valuenow first, then fall back to native value property + var value = elem.hasAttribute("aria-valuenow") + ? elem.getAttribute("aria-valuenow") + : cursor.getNode().value; + return "[".concat(quoteNamePadAfter(cursor)).concat(roleDesc, ", ").concat(value).concat(getDescribedByAnnouncements(cursor.getElement(), mode), "]"); + } + ] + }), + // Spinbutton role + new SRRendererRule_1.SRRendererRule({ + roles: ["spinbutton"], + elems: [], + modes: ["item", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (!cursor.isStartTag()) + return ""; + var roleDesc = getRoleDescription(cursor, "spinbutton"); + return "[".concat(quoteNamePadAfter(cursor)).concat(roleDesc, ", editable").concat(getDescribedByAnnouncements(cursor.getElement(), mode), "]"); + } + ] + }), + // Tab role + new SRRendererRule_1.SRRendererRule({ + roles: ["tab"], + elems: [], + modes: ["item", "tab_focus"], + tests: [ + function (cursor) { + if (!cursor.isStartTag()) + return ""; + var roleDesc = getRoleDescription(cursor, "tab"); + return "[".concat(roleDesc).concat(cursor.getNode().getAttribute("aria-selected") === "true" ? ", selected" : "").concat(quoteNamePadBefore(cursor), "]"); + } + ] + }), + // Tablist role + new SRRendererRule_1.SRRendererRule({ + roles: ["tablist"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + if (cursor.getNameInfo() === null) + return null; + if (cursor.isStartTag()) { + return "[group start".concat(quoteNamePadBefore(cursor), "]"); + } + else { + return "[group end".concat(quoteNamePadBefore(cursor), "]"); + } + } + ] + }), + // Tabpanel role + new SRRendererRule_1.SRRendererRule({ + roles: ["tabpanel"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + if (cursor.getNameInfo() === null) + return null; + if (cursor.isStartTag()) { + return "[Tab panel start".concat(quoteNamePadBefore(cursor), "]"); + } + else { + return "[Tab panel end".concat(quoteNamePadBefore(cursor), "]"); + } + } + ] + }), + // Text role + new SRRendererRule_1.SRRendererRule({ + roles: ["text"], + elems: [], + modes: ["item", "link", "tab_focus", "region"], + tests: [ + function (cursor) { + var _a, _b, _c, _d; + if (cursor.isEndTag() || !((_a = cursor.getParentElement()) === null || _a === void 0 ? void 0 : _a.getElement())) + return null; + var elem = (_b = cursor.getParentElement()) === null || _b === void 0 ? void 0 : _b.getElement(); + if (elem.ownerDocument.defaultView.getComputedStyle(elem).textDecorationLine === "line-through") { + return "[strikethrough] ".concat((((_c = cursor.getNameInfo()) === null || _c === void 0 ? void 0 : _c.name) + ""), " [end strikethrough]"); + } + return "".concat((((_d = cursor.getNameInfo()) === null || _d === void 0 ? void 0 : _d.name) + "")); + } + ] + }), + // -- in heading mode + new SRRendererRule_1.SRRendererRule({ + roles: ["text"], + elems: [], + modes: ["heading"], + tests: [ + function (cursor) { return ""; } + ] + }), + // Textbox role + new SRRendererRule_1.SRRendererRule({ + roles: ["textbox"], + elems: [], + modes: ["item", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + var _a; + var elem = cursor.getElement(); + if (cursor.isEndTag()) { + return mode === "item" && elem.nodeName.toUpperCase() === "TEXTAREA" ? "[out of edit]" : ""; + } + if (!cursor.isStartTag()) { + return ""; + } + var attributes = ""; + if (elem.hasAttribute("placeholder") && elem.getAttribute("placeholder").trim().length > 0) { + attributes += ", placeholder: ".concat(elem.getAttribute("placeholder")); + } + attributes += getStateAnnouncements(elem); + var isMultiline = elem.nodeName.toUpperCase() === "TEXTAREA" || elem.getAttribute("aria-multiline") === "true"; + var describedBy = getDescribedByAnnouncements(elem, mode); + if (isMultiline) { + var textContent = mode === "tab_focus" ? (_a = elem.textContent) === null || _a === void 0 ? void 0 : _a.trim() : ""; + var contentSuffix = textContent ? " ".concat(textContent) : ""; + return "[".concat(quoteNamePadAfter(cursor), "edit, multiline").concat(attributes).concat(describedBy, "]").concat(contentSuffix); + } + return "[".concat(quoteNamePadAfter(cursor), "edit").concat(attributes).concat(describedBy, "]"); + } + ] + }), + // Treeitem role + new SRRendererRule_1.SRRendererRule({ + roles: ["treeitem"], + elems: [], + modes: ["item", "tab_focus"], + tests: [ + function (cursor) { + if (cursor.isEndTag()) + return ""; + var elem = cursor.getElement(); + // Build the announcement string without the name (let content render separately) + var announcement = "[treeview item"; + // Add selected state if present + if (elem.getAttribute("aria-selected") === "true") { + announcement += ", selected"; + } + // Add expanded/collapsed state if present + if (elem.hasAttribute("aria-expanded")) { + announcement += elem.getAttribute("aria-expanded") === "true" ? ", expanded" : ", collapsed"; + } + // Add level if explicitly set or calculate from nesting + var level = elem.getAttribute("aria-level"); + if (level) { + announcement += ", level ".concat(level); + } + else { + // Calculate level by counting parent treeitems or groups using DOMWalker for shadow DOM support + var calculatedLevel = 1; + var parent_1 = DOMWalker_1.DOMWalker.parentElement(elem); + while (parent_1) { + var parentRole = AriaUtil_1.AriaUtil.getResolvedRole(parent_1); + if (parentRole === "group" || parentRole === "tree") { + // Check if this group is inside a treeitem + var groupParent = DOMWalker_1.DOMWalker.parentElement(parent_1); + while (groupParent) { + var groupParentRole = AriaUtil_1.AriaUtil.getResolvedRole(groupParent); + if (groupParentRole === "treeitem") { + calculatedLevel++; + break; + } + else if (groupParentRole === "tree") { + break; + } + groupParent = DOMWalker_1.DOMWalker.parentElement(groupParent); + } + } + parent_1 = DOMWalker_1.DOMWalker.parentElement(parent_1); + } + if (calculatedLevel > 1) { + announcement += ", level ".concat(calculatedLevel); + } + } + // Add position information (aria-posinset/aria-setsize or calculate) + var position = elem.getAttribute("aria-posinset"); + var setSize = elem.getAttribute("aria-setsize"); + if (!position || !setSize) { + // Calculate position by counting siblings with same role using DOMWalker for shadow DOM support + var pos = 0; + var total = 0; + var parent_2 = DOMWalker_1.DOMWalker.parentElement(elem); + if (parent_2) { + // Iterate through children to count treeitems + var child = DOMWalker_1.DOMWalker.firstChildNotOwnedBySlot(parent_2); + while (child) { + if (child.nodeType === 1) { // Element node + var childElem = child; + if (AriaUtil_1.AriaUtil.getResolvedRole(childElem) === "treeitem") { + total++; + if (childElem === elem) { + pos = total; + } + } + } + child = child.nextSibling; + } + } + position = pos.toString(); + setSize = total.toString(); + } + announcement += ", ".concat(position, " of ").concat(setSize, "] "); + return announcement; + } + ] + }), + // HTML Element rules + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["BODY"], + modes: ["item", "tab_focus"], + tests: [ + function (cursor) { + var titleStr = cursor.getNode().ownerDocument.title; + return cursor.isEndTag() ? "[End of document".concat(titleStr.trim().length > 0 ? ": " + titleStr.trim() : "", "]") : "[Start of document".concat(titleStr.trim().length > 0 ? ": " + titleStr.trim() : "", "]"); + } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["IFRAME"], + modes: ["item", "tab_focus"], + tests: [ + function (cursor) { + var accessWarning = canAccessFrame(cursor.getNode()) ? "" : "{Emulator unable to access frame}"; + return cursor.isEndTag() ? "" : accessWarning; + } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["BR"], + modes: ["item"], + tests: [ + function (cursor) { + try { + var walk = cursor.clone(); + // Walk until we hit the beginning of the page, find another BR, or find something with a name + while (walk.previous(function () { return true; }) && walk.getNode().nodeName.toUpperCase() !== "BR" && walk.getNameInfo() && walk.getNameInfo().name.trim().length === 0) + ; + return walk.getNode().nodeName.toUpperCase() === "BR" ? "[blank]" : null; + } + catch (err) { + console.error(err); + } + } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["DL"], + modes: ["item"], + tests: [ + function (cursor) { return ""; } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["INPUT"], + modes: ["item", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { var _a; return (cursor.isStartTag() && ((_a = cursor.getElement()) === null || _a === void 0 ? void 0 : _a.getAttribute("type")) === "password" && "[".concat(quoteNamePadAfter(cursor), "edit, protected").concat(getDescribedByAnnouncements(cursor.getElement(), mode), "]")) || null; }, + function (cursor, _oldCursor, mode) { + var _a, _b; + if (cursor.isStartTag() && ((_a = cursor.getElement()) === null || _a === void 0 ? void 0 : _a.getAttribute("type")) === "file") { + var value = ((_b = cursor.getElement()) === null || _b === void 0 ? void 0 : _b.value) || ""; + value = value === "" ? "No file chosen" : value.substring("C:\\fakepath\\".length); + return "[".concat(quoteNamePadAfter(cursor), "button").concat(getDescribedByAnnouncements(cursor.getElement(), mode), "] [").concat(quoteNamePadAfter(cursor)).concat(value, "]"); + } + return null; + }, + function (cursor, _oldCursor, mode) { + var _a; + if (cursor.isStartTag() && ((_a = cursor.getElement()) === null || _a === void 0 ? void 0 : _a.getAttribute("type")) === "color") { + var val = cursor.getElement().value; + var r = (Number("0x".concat(val.substring(1, 3))) * 100.0 / Number("0xff")).toFixed(0); + var g = (Number("0x".concat(val.substring(3, 5))) * 100.0 / Number("0xff")).toFixed(0); + var b = (Number("0x".concat(val.substring(5))) * 100.0 / Number("0xff")).toFixed(0); + return "[".concat(quoteNamePadAfter(cursor), "clickable").concat(getDescribedByAnnouncements(cursor.getElement(), mode), "] [").concat(r, "% red ").concat(g, "% green ").concat(b, "% blue]"); + } + return null; + }, + function (cursor, _oldCursor, mode) { + var _a; + if (cursor.isStartTag() && ((_a = cursor.getElement()) === null || _a === void 0 ? void 0 : _a.getAttribute("type")) === "month") { + var val = cursor.getElement().value; + var y = "0"; + var m = "0"; + if (val.trim().length > 0) { + var date = new Date(val); + y = "" + date.getFullYear(); + m = "" + (date.getMonth() + 1); + } + return "[".concat(quoteNamePadAfter(cursor), "clickable").concat(getDescribedByAnnouncements(cursor.getElement(), mode), "] [spin button, ").concat(m, "] [spin button, ").concat(y, "] [menu button] [subMenu] Show month picker"); + } + return null; + }, + function (cursor, _oldCursor, mode) { + var _a; + if (cursor.isStartTag() && ((_a = cursor.getElement()) === null || _a === void 0 ? void 0 : _a.getAttribute("type")) === "date") { + var val = cursor.getElement().value; + var y = "0"; + var m = "0"; + var day = "0"; + if (val.trim().length > 0) { + var date = new Date(val); + y = "" + date.getFullYear(); + m = "" + (date.getMonth() + 1); + day = "" + (date.getDate()); + } + return "[".concat(quoteNamePadAfter(cursor), "clickable").concat(getDescribedByAnnouncements(cursor.getElement(), mode), "] [spin button, ").concat(m, "] / [spin button, ").concat(day, "] / [spin button, ").concat(y, "] [menu button] [subMenu] Show date picker"); + } + return null; + }, + function (cursor, _oldCursor, mode) { + var _a; + if (cursor.isStartTag() && ((_a = cursor.getElement()) === null || _a === void 0 ? void 0 : _a.getAttribute("type")) === "datetime-local") { + var val = cursor.getElement().value; // 2025-09-12T04:20 + var y = "0"; + var m = "0"; + var day = "0"; + var hour = "0"; + var min = "0"; + var ampm = "0"; + if (val.trim().length > 0) { + var date = new Date(val); + y = "" + date.getFullYear(); + m = "" + (date.getMonth() + 1); + day = "" + (date.getDate()); + if (date.getHours() === 0 || date.getHours() === 12) { + hour = "12"; + } + else if (date.getHours() < 12) { + hour = "" + date.getHours(); + } + else { + hour = "" + (date.getHours() - 12); + } + min = "" + date.getMinutes(); + ampm = date.getHours() >= 12 ? "pm" : "am"; + } + return "[".concat(quoteNamePadAfter(cursor), "clickable").concat(getDescribedByAnnouncements(cursor.getElement(), mode), "] [spin button, ").concat(m, "] / [spin button, ").concat(day, "] / [spin button, ").concat(y, "] [spin button, ").concat(hour, "] : [spin button, ").concat(min, "] [spin button, ").concat(ampm, "] [menu button] [subMenu] Show local date and time picker"); + } + return null; + }, + function (cursor, _oldCursor, mode) { + var _a; + if (cursor.isStartTag() && ((_a = cursor.getElement()) === null || _a === void 0 ? void 0 : _a.getAttribute("type")) === "time") { + var val = cursor.getElement().value; // 2025-09-12T04:20 + var hour = "0"; + var min = "0"; + var ampm = "0"; + if (val.trim().length > 0) { + var date = val.split(":"); + var hours = parseInt(date[0]); + if (hours === 0 || hours === 12) { + hour = "12"; + } + else if (hours < 12) { + hour = "" + hours; + } + else { + hour = "" + (hours - 12); + } + min = date[1]; + ampm = hours >= 12 ? "pm" : "am"; + } + return "[".concat(quoteNamePadAfter(cursor), "grouping clickable").concat(getDescribedByAnnouncements(cursor.getElement(), mode), " [spin button, ").concat(hour, "] : [spin button, ").concat(min, "] [spin button, ").concat(ampm, "] [menu button] [subMenu] Show time picker [out of grouping]"); + } + return null; + }, + function (cursor, _oldCursor, mode) { + var _a; + if (cursor.isStartTag() && ((_a = cursor.getElement()) === null || _a === void 0 ? void 0 : _a.getAttribute("type")) === "week") { + var val = cursor.getElement().value; // 2025-W38 + var year = "0"; + var week = "0"; + if (val.trim().length > 0) { + var date = val.split(/-W/); + year = date[0]; + week = date[1]; + } + return "[".concat(quoteNamePadAfter(cursor), "clickable").concat(getDescribedByAnnouncements(cursor.getElement(), mode), "] [spin button, ").concat(week, "], [spin button, ").concat(year, "] [menu button] [subMenu] Show week picker"); + } + return null; + }, + function (cursor) { var _a; return ((_a = cursor.getElement()) === null || _a === void 0 ? void 0 : _a.getAttribute("type")) === "hidden" ? "" : null; }, + function (cursor) { return (cursor.isStartTag() && "!![".concat(quoteNamePadAfter(cursor), "input!!]").concat(cursor.getElement().outerHTML)) || null; } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["LI"], + modes: ["item"], + tests: [ + function (cursor) { + var _a; + // Check if listitem contains interactive elements + // Screen readers don't read the accessible name when interactive elements are present + var hasInteractiveContent = listitemContainsInteractiveElement(cursor); + var nameToUse = hasInteractiveContent ? "" : (((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) || ""); + var elem = cursor.getElement(); + if (window.getComputedStyle(elem).listStyleType === "none") { + return cursor.isStartTag() ? "".concat(nameToUse) : ""; + } + else { + return cursor.isStartTag() ? "[bullet] ".concat(nameToUse) : ""; + } + } + ] + }), + // MathML elements + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["MFRAC"], + modes: ["item"], + tests: [ + function (cursor) { return cursor.isStartTag() ? "[fraction]" : "[end fraction]"; } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["MROW"], + modes: ["item"], + tests: [ + function (cursor) { + var _a; + // Only announce over on the end tag + if (cursor.isStartTag()) + return undefined; + var fraction = cursor.getCurrentOrParentByRoleClone([], ["mfrac"]); + if (fraction && ((_a = fraction.getElement().querySelectorAll("mrow")[0]) === null || _a === void 0 ? void 0 : _a.isSameNode(cursor.getNode()))) { + return "[over]"; + } + } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["MSQRT"], + modes: ["item"], + tests: [ + function (cursor) { return cursor.isStartTag() ? "[square root]" : "[end root]"; } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["MSUP"], + modes: ["item"], + tests: [ + function (cursor) { + var _a, _b; + if (cursor.isEndTag()) + return undefined; + var mi = ((_a = cursor.getElement().querySelector("mi")) === null || _a === void 0 ? void 0 : _a.innerHTML) || ""; + var mn = ((_b = cursor.getElement().querySelector("mn")) === null || _b === void 0 ? void 0 : _b.innerHTML) || ""; + if (mn === "2") + return "".concat(mi, " [squared]"); + if (mn === "3") + return "".concat(mi, " [cubed]"); + return "".concat(mi, " [to the ").concat(mn, "]"); + } + ] + }), + // Multiple roles rules - placed at the bottom + // Default mode rules - Container elements (multiple roles) + new SRRendererRule_1.SRRendererRule({ + roles: ["article", "banner", "blockquote", "caption", "cell", "code", "columnheader", + "complementary", "contentinfo", "figure", "form", "group", "list", "main", + "mark", "navigation", "region", "row", "rowheader", "search", "table", "toolbar"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { return ""; } + ] + }), + // Default mode rules - Elements that screen readers typically ignore (multiple roles) + new SRRendererRule_1.SRRendererRule({ + roles: ["paragraph", "rowgroup", "status", "strong", "subscript", "superscript", + "term", "time", "none", "presentation"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { return ""; } + ] + }), +]; + + +/***/ }, + +/***/ "./src/v4/simulator/render_rules/container_enter.ts" +/*!**********************************************************!*\ + !*** ./src/v4/simulator/render_rules/container_enter.ts ***! + \**********************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.RULES = void 0; +var SRRendererRule_1 = __webpack_require__(/*! ../SRRendererRule */ "./src/v4/simulator/SRRendererRule.ts"); +var SRTableUtil_1 = __webpack_require__(/*! ../SRTableUtil */ "./src/v4/simulator/SRTableUtil.ts"); +var common_1 = __webpack_require__(/*! ./common */ "./src/v4/simulator/render_rules/common.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +/** + * Generates the announcement text when entering a table cell + */ +function renderEnterTableCell(newCursor, oldCursor) { + var _a; + // We seem to be at the newline text node after the cell + if (oldCursor && ((_a = oldCursor.getNode()) === null || _a === void 0 ? void 0 : _a.nodeName) === "#text") { + oldCursor = oldCursor.clone(); + oldCursor.previous(function () { return true; }); + } + var newTableModel = SRTableUtil_1.SRTableUtil.getTableModel(newCursor); + var oldCellInfo = SRTableUtil_1.SRTableUtil.getCellModel(oldCursor, newTableModel); + var newCellInfo = SRTableUtil_1.SRTableUtil.getCellModel(newCursor, newTableModel); + if (!newCellInfo) + return ""; + var retVal = []; + // Announce row information if we've moved to a different row or the rowspan has changed + if (!oldCellInfo || oldCellInfo.rowIndexStart !== newCellInfo.rowIndexStart || oldCellInfo.rowspan !== newCellInfo.rowspan) { + // If a change in row or a change in rowSpan + var rowHeaders = SRTableUtil_1.SRTableUtil.getRowHeadersForCursor(newCursor, newTableModel); + var headerInfoStr = rowHeaders && rowHeaders.trim().length > 0 ? "\"".concat(rowHeaders, "\", ") : ""; + retVal.push("[".concat(headerInfoStr, "row ").concat((newCellInfo.rowIndexStart + 1)).concat(newCellInfo.rowspan > 1 ? " through " + (newCellInfo.rowIndexStart + newCellInfo.rowspan) : "", "]")); + } + // Announce column information if we've moved to a different column or the colspan has changed + if (!oldCellInfo || oldCellInfo.colIndexStart !== newCellInfo.colIndexStart || oldCellInfo.colspan !== newCellInfo.colspan) { + // If a change in column or a change in colspan + var columnHeaders = SRTableUtil_1.SRTableUtil.getColumnHeadersForCursor(newCursor, newTableModel); + var headerInfoStr = columnHeaders && columnHeaders.trim().length > 0 ? "\"".concat(columnHeaders, "\", ") : ""; + retVal.push("[".concat(headerInfoStr, "column ").concat((newCellInfo.colIndexStart + 1)).concat(newCellInfo.colspan > 1 ? " through " + (newCellInfo.colIndexStart + newCellInfo.colspan) : "", "]")); + } + return retVal.join(" "); +} +exports.RULES = [ + // Single role rules - alphabetically sorted + // Article role + new SRRendererRule_1.SRRendererRule({ + roles: ["article"], + elems: [], + modes: ["item", "article", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (mode === "tab_focus" && !CommonUtil_1.CommonUtil.isTabbable(cursor.getNode())) + return null; + var roleDesc = (0, common_1.getRoleDescription)(cursor, "article"); + return "[".concat((0, common_1.quoteNamePadAfter)(cursor)).concat(roleDesc, "]"); + } + ] + }), + // Banner role + new SRRendererRule_1.SRRendererRule({ + roles: ["banner"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (mode === "tab_focus" && !CommonUtil_1.CommonUtil.isTabbable(cursor.getNode())) + return null; + var roleDesc = (0, common_1.getRoleDescription)(cursor, "banner region"); + return "[".concat((0, common_1.quoteNamePadAfter)(cursor)).concat(roleDesc, "]"); + } + ] + }), + // Blockquote role + new SRRendererRule_1.SRRendererRule({ + roles: ["blockquote"], + elems: [], + modes: ["item", "region"], + tests: [ + function (_cursor) { return "[blockquote]"; } + ] + }), + // Caption role + new SRRendererRule_1.SRRendererRule({ + roles: ["caption"], + elems: [], + modes: ["item", "region"], + tests: [ + function (_cursor) { return "[caption]"; } + ] + }), + // Cell role + new SRRendererRule_1.SRRendererRule({ + roles: ["cell"], + elems: [], + modes: ["item", "table"], + tests: [ + renderEnterTableCell + ] + }), + // Columnheader role + new SRRendererRule_1.SRRendererRule({ + roles: ["columnheader"], + elems: [], + modes: ["item", "table"], + tests: [ + renderEnterTableCell + ] + }), + // Complementary role + new SRRendererRule_1.SRRendererRule({ + roles: ["complementary"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (mode === "tab_focus" && !CommonUtil_1.CommonUtil.isTabbable(cursor.getNode())) + return null; + return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "complementary region]"); + } + ] + }), + // Contentinfo role + new SRRendererRule_1.SRRendererRule({ + roles: ["contentinfo"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (mode === "tab_focus" && !CommonUtil_1.CommonUtil.isTabbable(cursor.getNode())) + return null; + return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "content info region]"); + } + ] + }), + // Figure role + new SRRendererRule_1.SRRendererRule({ + roles: ["figure"], + elems: [], + modes: ["item", "region"], + tests: [ + function (_cursor) { return "[figure]"; } + ] + }), + // Form role + new SRRendererRule_1.SRRendererRule({ + roles: ["form"], + elems: [], + modes: ["item", "region", "formcontrol"], + tests: [ + function (cursor) { + if (cursor.getNameInfo() === null) { + return "[section]"; + } + else { + return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "form region]"); + } + } + ] + }), + // Group role + new SRRendererRule_1.SRRendererRule({ + roles: ["group"], + elems: [], + modes: ["item", "region"], + tests: [ + function (cursor) { + var _a; + if (cursor.getNameInfo() === null) + return null; + if (((_a = cursor.getCurrentOrParentByRoleClone(["combobox"], ["select"])) === null || _a === void 0 ? void 0 : _a.getNode().nodeName.toUpperCase()) === "SELECT") { + return ""; + } + if (cursor.getNode().nodeName.toUpperCase() === "DETAILS") { + return "[button, ".concat(cursor.getElement().hasAttribute("open") ? "expanded" : "collapsed", "]"); + } + else { + return "[grouping".concat((0, common_1.quoteNamePadBefore)(cursor), "]"); + } + } + ] + }), + // -- tab_focus + new SRRendererRule_1.SRRendererRule({ + roles: ["group"], + elems: [], + modes: ["tab_focus"], + tests: [ + function (cursor) { + var _a; + if (cursor.getNameInfo() === null) + return null; + if (((_a = cursor.getCurrentOrParentByRoleClone(["combobox"], ["select"])) === null || _a === void 0 ? void 0 : _a.getNode().nodeName.toUpperCase()) === "SELECT") { + return ""; + } + if (cursor.getNode().nodeName.toUpperCase() === "DETAILS") { + return "[button, ".concat(cursor.getElement().hasAttribute("open") ? "expanded" : "collapsed", "]"); + } + else { + return ""; + } + } + ] + }), + // List role + new SRRendererRule_1.SRRendererRule({ + roles: ["list"], + elems: [], + modes: ["item", "list"], + tests: [ + function (cursor) { + var _a; + var node = cursor.getNode(); + var descendantListItems = document.evaluate(".//li | .//*[@role='listitem']", node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + // Count items, excluding those in other lists or within presentational containers + var numItems = 0; + for (var i = 0; i < descendantListItems.snapshotLength; i++) { + var item = descendantListItems.snapshotItem(i); + // Walk up ancestors to check for both nested lists and presentational containers + var isInOtherList = false; + var hasPresentationalAncestor = false; + var ancestor = item.parentElement; + while (ancestor && ancestor !== node) { + // Check if ancestor is another list + var ancestorRole = AriaUtil_1.AriaUtil.getResolvedRole(ancestor); + if (ancestorRole === "list" || + ancestor.nodeName.toUpperCase() === "UL" || + ancestor.nodeName.toUpperCase() === "OL") { + isInOtherList = true; + break; + } + // Check if ancestor has presentational children + if (ancestorRole && ((_a = ARIADefinitions_1.ARIADefinitions.designPatterns[ancestorRole]) === null || _a === void 0 ? void 0 : _a.presentationalChildren)) { + hasPresentationalAncestor = true; + break; + } + ancestor = ancestor.parentElement; + } + if (!isInOtherList && !hasPresentationalAncestor) { + numItems++; + } + } + if (numItems === 0) + return null; + return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "list of ").concat(numItems, " items]"); + } + ] + }), + // Main role + new SRRendererRule_1.SRRendererRule({ + roles: ["main"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (mode === "tab_focus" && !CommonUtil_1.CommonUtil.isTabbable(cursor.getNode())) + return null; + return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "main region]"); + } + ] + }), + // menubar role + new SRRendererRule_1.SRRendererRule({ + roles: ["menubar"], + elems: [], + modes: ["item", "list"], + tests: [ + function (cursor) { + var node = cursor.getNode(); + var descendantListItems = document.evaluate(".//*[@role='menuitem']", node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + var descendantListItemsInOtherLists = document.evaluate(".//*[@role='menubar']//*[@role='menuitem']|.//*[@role='menu']//*[@role='menuitem']", node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + // const descendantContainers = document.evaluate(".//*[@role='menuitem']/*[@role='menu']", node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + // const descendantContainers2 = document.evaluate(".//*[@role='menubar']//*[@role='menuitem']/*[@role='menu']|.//*[@role='menu']//*[@role='menuitem']/*[@role='menu']", node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + console.log("MENUBAR", cursor.isEndTag() ? "/" : "", cursor.getNode()); + console.log(descendantListItems, descendantListItemsInOtherLists); //, descendantContainers, descendantContainers2) + var numItems = descendantListItems.snapshotLength - descendantListItemsInOtherLists.snapshotLength; //-descendantContainers.snapshotLength+descendantContainers2.snapshotLength; + if (numItems === 0) + return null; + return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "menubar with ").concat(numItems, " items]"); + } + ] + }), + // Navigation role + new SRRendererRule_1.SRRendererRule({ + roles: ["navigation"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (mode === "tab_focus" && !CommonUtil_1.CommonUtil.isTabbable(cursor.getNode())) + return null; + var roleDesc = (0, common_1.getRoleDescription)(cursor, "navigation region"); + return "[".concat((0, common_1.quoteNamePadAfter)(cursor)).concat(roleDesc, "]"); + } + ] + }), + // Radio group role + new SRRendererRule_1.SRRendererRule({ + roles: ["radiogroup"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (cursor) { + if (cursor.getNameInfo() === null) + return null; + return "[grouping".concat((0, common_1.quoteNamePadBefore)(cursor), "]"); + } + ] + }), + // Region role + new SRRendererRule_1.SRRendererRule({ + roles: ["region"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (cursor.getNameInfo() === null) + return null; + if (mode === "tab_focus" && !CommonUtil_1.CommonUtil.isTabbable(cursor.getNode())) + return null; + var roleDesc = (0, common_1.getRoleDescription)(cursor, "region"); + return "[".concat((0, common_1.quoteNamePadAfter)(cursor)).concat(roleDesc, "]"); + } + ] + }), + // Row role + new SRRendererRule_1.SRRendererRule({ + roles: ["row"], + elems: [], + modes: ["item", "table"], + tests: [ + function () { return ""; } + ] + }), + // Rowheader role + new SRRendererRule_1.SRRendererRule({ + roles: ["rowheader"], + elems: [], + modes: ["item", "table"], + tests: [ + renderEnterTableCell + ] + }), + // Search role + new SRRendererRule_1.SRRendererRule({ + roles: ["search"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (mode === "tab_focus" && !CommonUtil_1.CommonUtil.isTabbable(cursor.getNode())) + return null; + var roleDesc = (0, common_1.getRoleDescription)(cursor, "search region"); + return "[".concat((0, common_1.quoteNamePadAfter)(cursor)).concat(roleDesc, "]"); + } + ] + }), + // Table role + new SRRendererRule_1.SRRendererRule({ + roles: ["table"], + elems: [], + modes: ["item", "table"], + tests: [ + function (cursor) { + var tableWalker = cursor.clone(); + // Get to the start of the table + while (tableWalker.getRole() !== "table" && tableWalker.previous(function () { return true; })) + ; + // Set an end to the table + var tableNode = tableWalker.getNode(); + var rows = 0; + var cols = 0; + // Sanity check that the table has content + if (tableWalker.getNode().firstChild) { + var firstRowComplete = false; + while (tableWalker.next(function () { return true; }) && !tableWalker.getNode().isSameNode(tableNode)) { + var role = tableWalker.getRole(); + if (tableWalker.isStartTag()) { + if (role === "row") { + ++rows; + } + else { + if (!firstRowComplete && ["cell", "rowheader", "columnheader"].includes(role)) { + var elem = tableWalker.getNode(); + cols += parseInt(elem.getAttribute("colspan") || "1"); + } + } + } + else if (role === "row") { + firstRowComplete = true; + } + } + } + return "[table with ".concat(rows, " ").concat(rows === 1 ? "row" : "rows", " and ").concat(cols, " ").concat(cols === 1 ? "column" : "columns").concat((0, common_1.quoteNamePadBefore)(cursor), "]"); + } + ] + }), + // Toolbar role + new SRRendererRule_1.SRRendererRule({ + roles: ["toolbar"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (mode === "tab_focus" && !CommonUtil_1.CommonUtil.isTabbable(cursor.getNode())) + return null; + return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "toolbar]"); + } + ] + }), + // HTML Element rules + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["DL"], + modes: ["item", "list"], + tests: [ + function (cursor) { + var node = cursor.getNode(); + var descendantListItems = document.evaluate(".//dt", node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + var numItems = descendantListItems.snapshotLength; + return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "definition list of ").concat(numItems, " terms]"); + } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["FIGCAPTION"], + modes: ["item"], + tests: [ + function (_cursor) { return "[caption]"; } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["MARK"], + modes: ["item"], + tests: [ + function (_cursor) { return "[highlighted]"; } + ] + }), + // Multiple roles rules - placed at the bottom + // Heading mode rules - ignore container elements in heading mode (multiple roles) + new SRRendererRule_1.SRRendererRule({ + roles: ["article", "banner", "blockquote", "caption", "cell", "columnheader", + "complementary", "contentinfo", "figure", "form", "group", "region", + "row", "rowheader", "search", "toolbar", "list", "main", "navigation", "table"], + elems: [], + modes: ["heading"], + tests: [ + function () { return ""; } + ] + }) +]; + + +/***/ }, + +/***/ "./src/v4/simulator/render_rules/containter_exit.ts" +/*!**********************************************************!*\ + !*** ./src/v4/simulator/render_rules/containter_exit.ts ***! + \**********************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.RULES = void 0; +var SRRendererRule_1 = __webpack_require__(/*! ../SRRendererRule */ "./src/v4/simulator/SRRendererRule.ts"); +var common_1 = __webpack_require__(/*! ./common */ "./src/v4/simulator/render_rules/common.ts"); +exports.RULES = [ + // Single role rules - alphabetically sorted + // Article role + new SRRendererRule_1.SRRendererRule({ + roles: ["article"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var roleDesc = (0, common_1.getRoleDescription)(cursor, "article"); + return "[out of ".concat(roleDesc, "]"); + } + ] + }), + // Banner role + new SRRendererRule_1.SRRendererRule({ + roles: ["banner"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var roleDesc = (0, common_1.getRoleDescription)(cursor, "banner region"); + return "[out of ".concat(roleDesc, "]"); + } + ] + }), + // Blockquote role + new SRRendererRule_1.SRRendererRule({ + roles: ["blockquote"], + elems: [], + modes: ["item"], + tests: [ + function (_cursor) { return "[out of blockquote]"; } + ] + }), + // Caption role + new SRRendererRule_1.SRRendererRule({ + roles: ["caption"], + elems: [], + modes: ["item"], + tests: [ + function (_cursor) { return "[out of caption]"; } + ] + }), + // Complementary role + new SRRendererRule_1.SRRendererRule({ + roles: ["complementary"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var roleDesc = (0, common_1.getRoleDescription)(cursor, "complementary region"); + return "[out of ".concat(roleDesc, "]"); + } + ] + }), + // Contentinfo role + new SRRendererRule_1.SRRendererRule({ + roles: ["contentinfo"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var roleDesc = (0, common_1.getRoleDescription)(cursor, "content info region"); + return "[out of ".concat(roleDesc, "]"); + } + ] + }), + // Figure role + new SRRendererRule_1.SRRendererRule({ + roles: ["figure"], + elems: [], + modes: ["item", "region"], + tests: [ + function (_cursor) { return "[out of figure]"; } + ] + }), + // Form role + new SRRendererRule_1.SRRendererRule({ + roles: ["form"], + elems: [], + modes: ["item", "region", "formcontrol"], + tests: [ + function (cursor) { + if (cursor.getNameInfo() === null) { + return "[out of section]"; + } + else { + return "[out of form]"; + } + } + ] + }), + // Group role + new SRRendererRule_1.SRRendererRule({ + roles: ["group"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var _a; + if (cursor.getNameInfo() === null) + return null; + if (((_a = cursor.getCurrentOrParentByRoleClone(["combobox"], ["select"])) === null || _a === void 0 ? void 0 : _a.getNode().nodeName.toUpperCase()) === "SELECT") { + return ""; + } + else + return "[out of grouping]"; + } + ] + }), + // List role + new SRRendererRule_1.SRRendererRule({ + roles: ["list"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var node = cursor.getNode(); + var descendantListItems = document.evaluate(".//li | .//*[@role='listitem']", node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + var descendantListItemsInOtherLists = document.evaluate(".//ul//li|.//ul//*[@role='listitem']|.//ol//li|.//ol//*[@role='listitem']|.//*[@role='list']//li|.//*[@role='list']//*[@role='listitem']", node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + var numItems = descendantListItems.snapshotLength - descendantListItemsInOtherLists.snapshotLength; + if (numItems === 0) + return null; + return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "out of list]"); + } + ] + }), + // Main role + new SRRendererRule_1.SRRendererRule({ + roles: ["main"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var roleDesc = (0, common_1.getRoleDescription)(cursor, "main region"); + return "[out of ".concat(roleDesc, "]"); + } + ] + }), + // menubar role + new SRRendererRule_1.SRRendererRule({ + roles: ["menubar"], + elems: [], + modes: ["item", "list"], + tests: [ + function (_cursor) { return "[out of menubar]"; } + ] + }), + // Navigation role + new SRRendererRule_1.SRRendererRule({ + roles: ["navigation"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var roleDesc = (0, common_1.getRoleDescription)(cursor, "navigation region"); + return "[out of ".concat(roleDesc, "]"); + } + ] + }), + // radiogroup role + new SRRendererRule_1.SRRendererRule({ + roles: ["radiogroup"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (_cursor) { return "[out of grouping]"; } + ] + }), + // Region role + new SRRendererRule_1.SRRendererRule({ + roles: ["region"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + if (cursor.getNameInfo() === null) + return null; + var roleDesc = (0, common_1.getRoleDescription)(cursor, "region"); + return "[out of ".concat(roleDesc, "]"); + } + ] + }), + // Search role + new SRRendererRule_1.SRRendererRule({ + roles: ["search"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var roleDesc = (0, common_1.getRoleDescription)(cursor, "search region"); + return "[out of ".concat(roleDesc, "]"); + } + ] + }), + // Table role + new SRRendererRule_1.SRRendererRule({ + roles: ["table"], + elems: [], + modes: ["item"], + tests: [ + function (_cursor) { return "[out of table]"; } + ] + }), + // Toolbar role + new SRRendererRule_1.SRRendererRule({ + roles: ["toolbar"], + elems: [], + modes: ["item"], + tests: [ + function (_cursor) { return "[out of toolbar]"; } + ] + }), + // HTML Element rules + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["ABBR"], + modes: ["item"], + tests: [ + function (cursor) { return cursor.getElement().hasAttribute("title") ? + "[".concat(cursor.getElement().getAttribute("title"), "]") : null; } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["DL"], + modes: ["item"], + tests: [ + function (_cursor) { return "[out of definition list]"; } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["FIGCAPTION"], + modes: ["item"], + tests: [ + function (_cursor) { return "[out of caption]"; } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["MARK"], + modes: ["item"], + tests: [ + function (_cursor) { return "[out of highlighted]"; } + ] + }), + // Multiple roles rules - placed at the bottom + // Region mode rules - ignore container elements in region and heading mode + new SRRendererRule_1.SRRendererRule({ + roles: ["group", "article", "banner", "blockquote", "caption", "complementary", + "contentinfo", "figure", "form", "list", "region", "main", "navigation", + "search", "table", "toolbar"], + elems: [], + modes: ["region", "heading"], + tests: [ + function () { return ""; } + ] + }), +]; + + +/***/ }, + +/***/ "./src/v4/simulator/render_rules/index.ts" +/*!************************************************!*\ + !*** ./src/v4/simulator/render_rules/index.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.CONTAINER_EXIT_RULES = exports.CONTAINER_ENTER_RULES = exports.SR_RULES = void 0; +var common_1 = __webpack_require__(/*! ./common */ "./src/v4/simulator/render_rules/common.ts"); +var container_enter_1 = __webpack_require__(/*! ./container_enter */ "./src/v4/simulator/render_rules/container_enter.ts"); +var containter_exit_1 = __webpack_require__(/*! ./containter_exit */ "./src/v4/simulator/render_rules/containter_exit.ts"); +exports.SR_RULES = common_1.RULES; +exports.CONTAINER_ENTER_RULES = container_enter_1.RULES; +exports.CONTAINER_EXIT_RULES = containter_exit_1.RULES; + + +/***/ }, + +/***/ "./src/v4/util/AccNameUtil.ts" +/*!************************************!*\ + !*** ./src/v4/util/AccNameUtil.ts ***! + \************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.AccNameUtil = void 0; +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var CommonUtil_1 = __webpack_require__(/*! ./CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var AriaUtil_1 = __webpack_require__(/*! ./AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ./VisUtil */ "./src/v4/util/VisUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ./CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +var AccNameUtil = /** @class */ (function () { + function AccNameUtil() { + } + /** + * Computes the accessible name for an SVG element according to W3C specification + * Following the Accessible Name and Description Computation 1.1 algorithm + * https://www.w3.org/TR/accname-1.1/ + * + * @param elem The SVG element + * @returns The accessible name result or null if no accessible name is found + */ + AccNameUtil.computeAccessibleNameForSVGElementW3C = function (elem) { + if (!elem || elem.nodeName.toLowerCase() !== 'svg') + return null; + // Step 1: Check for aria-labelledby (already handled by main computeAccessibleName function) + // Step 2: Check for aria-label (already handled by main computeAccessibleName function) + // Step 3: Check for title element + var svgTitles = elem.querySelectorAll(":scope > title"); + if (svgTitles && svgTitles.length > 0) { + var text_1 = ""; + svgTitles.forEach(function (svgTitle) { + if (svgTitle && !VisUtil_1.VisUtil.isNodeHiddenFromAT(svgTitle) && !VisUtil_1.VisUtil.isNodePresentational(svgTitle)) { + var title = svgTitle.textContent; + if (title && title.trim() !== '') + text_1 += title.trim(); + } + }); + if (text_1 && text_1.trim() !== '') + return { "name": text_1.trim(), "nameFrom": "svgTitle" }; + } + // Step 4: Check for text content in SVG text elements + var textContent = ""; + var textElements = elem.querySelectorAll("text, textPath, tspan"); + if (textElements && textElements.length > 0) { + textElements.forEach(function (textElement) { + if (!VisUtil_1.VisUtil.isNodeHiddenFromAT(textElement) && !VisUtil_1.VisUtil.isNodePresentational(textElement)) { + var content = textElement.textContent; + if (content && content.trim() !== '') + textContent += " " + content.trim(); + } + }); + if (textContent.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(textContent.trim()), "nameFrom": "svgText" }; + } + // Step 5: Check for xlink:title attribute on links within SVG + var links = elem.querySelectorAll("a"); + for (var i = 0; i < links.length; i++) { + var link = links[i]; + if (!VisUtil_1.VisUtil.isNodeHiddenFromAT(link) && !VisUtil_1.VisUtil.isNodePresentational(link)) { + var xlinkTitle = link.getAttribute("xlink:title"); + if (xlinkTitle && xlinkTitle.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(xlinkTitle), "nameFrom": "svglinkTitle" }; + } + } + // Step 6: Check for aria-describedby or aria-description + var description = AriaUtil_1.AriaUtil.getAriaDescription(elem); + if (description && description.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(description), "nameFrom": "aria-description" }; + // Step 7: Check for desc element + var descElements = elem.querySelectorAll(":scope > desc"); + if (descElements && descElements.length > 0) { + var descText_1 = ""; + descElements.forEach(function (descElement) { + if (!VisUtil_1.VisUtil.isNodeHiddenFromAT(descElement) && !VisUtil_1.VisUtil.isNodePresentational(descElement)) { + var desc = descElement.textContent; + if (desc && desc.trim() !== '') + descText_1 += " " + desc.trim(); + } + }); + if (descText_1.trim() !== '') + return { "name": descText_1.trim(), "nameFrom": "svgDesc" }; + } + // Step 8: Check for title attribute + if (elem.hasAttribute("title")) { + var title = elem.getAttribute("title"); + if (title && title.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(title), "nameFrom": "title" }; + } + // No accessible name found + return null; + }; + // calculate accessible name for a given node + AccNameUtil.computeAccessibleName = function (elem) { + if (!elem) + return null; + var nodeName = elem.nodeName.toLowerCase(); + var name_pair = CacheUtil_1.CacheUtil.getCache(elem, "ELEMENT_ACCESSBLE_NAME", undefined); + if (name_pair !== undefined) + return name_pair; + // 1. name from author, or elements without a role but with aria-labelledby or aria-label + // get aria label even for the role where the name is prohibited or is 'presentation' or 'none' + var accName = AriaUtil_1.AriaUtil.getAriaLabel(elem); + if (accName && accName.trim() !== "") { + CacheUtil_1.CacheUtil.setCache(elem, "ELEMENT_ACCESSBLE_NAME", { "name": CommonUtil_1.CommonUtil.truncateText(accName), "nameFrom": "ariaLabel" }); + return { "name": CommonUtil_1.CommonUtil.truncateText(accName), "nameFrom": "ariaLabel" }; + } + // 2. accessible name mapping for native html elements + name_pair = AccNameUtil.computeAccessibleNameForNativeElement(elem); + if (name_pair) { + CacheUtil_1.CacheUtil.setCache(elem, "ELEMENT_ACCESSBLE_NAME", name_pair); + return name_pair; + } + // 3. name from native or aria attribute + /**name_pair = AccNameUtil.computeAccessibleNameFromAttribute(elem); + if (name_pair) { + CacheUtil.setCache(elem, "ELEMENT_ACCESSBLE_NAME", name_pair); + return name_pair; + }*/ + // 4. name from content for custom elements with a role + var role = AriaUtil_1.AriaUtil.getResolvedRole(elem); + if (ARIADefinitions_1.ARIADefinitions.designPatterns[role] && ARIADefinitions_1.ARIADefinitions.designPatterns[role].nameFrom.includes("contents")) { + name_pair = AccNameUtil.computeAccessibleNameFromContent(elem); + if (name_pair) { + CacheUtil_1.CacheUtil.setCache(elem, "ELEMENT_ACCESSBLE_NAME", name_pair); + return name_pair; + } + } + // 5. name from the global attribute "title" + if (elem.hasAttribute("title")) { + var title = elem.getAttribute("title").trim(); + if (title && title.trim().length > 0) { + title = CommonUtil_1.CommonUtil.truncateText(title); + CacheUtil_1.CacheUtil.setCache(elem, "ELEMENT_ACCESSBLE_NAME", { "name": title, "nameFrom": "title" }); + return { "name": title, "nameFrom": "title" }; + } + } + // 6. name from the attribute "placeholder" + if (nodeName === 'textarea' || (nodeName === 'input' && (!elem.hasAttribute("type") || CommonUtil_1.CommonUtil.input_type_with_placeholder.includes(elem.getAttribute("type"))))) { + var placeholder = elem.getAttribute("placeholder"); + if (placeholder && placeholder.trim().length > 0) { + placeholder = CommonUtil_1.CommonUtil.truncateText(placeholder); + CacheUtil_1.CacheUtil.setCache(elem, "ELEMENT_ACCESSBLE_NAME", { "name": placeholder, "nameFrom": "placeholder" }); + return { "name": placeholder, "nameFrom": "placeholder" }; + } + } + CacheUtil_1.CacheUtil.setCache(elem, "ELEMENT_ACCESSBLE_NAME", null); + return null; + }; + // calculate accessible name for native elements + AccNameUtil.computeAccessibleNameForNativeElement = function (elem) { + var nodeName = elem.nodeName.toLowerCase(); + // labellable fields + if (CommonUtil_1.CommonUtil.form_labelable_elements.includes(nodeName)) { + // Get only the non-hidden labels for element + var label = CommonUtil_1.CommonUtil.getFormFieldLabel(elem); + if (label && label.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(label), "nameFrom": "label" }; + } + // input types: button, reset, submit, image + if (nodeName === "input" && elem.hasAttribute("type")) { + if (CommonUtil_1.CommonUtil.form_button_types.includes(elem.getAttribute("type"))) { + // input types: button, reset, submit + // Get the "value" attribute for the element + var value = CommonUtil_1.CommonUtil.getElementAttribute(elem, "value"); + if (value && value.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(value), "nameFrom": "value" }; + // input 'submit' and 'reset' have visible defaults so pass if there is no explicit 'value' attribute + var type = elem.getAttribute("type"); + if (type === 'submit' || type === 'reset') + return { "name": type, "nameFrom": "internal" }; + } + else if (elem.getAttribute("type") === 'image') { + // input type = 'image' + // note that though HTML 5 spec indicates "The element's [value] attribute must be omitted", Chrome uses the value. + // Get the accessible name for the alt attribute + var alt = CommonUtil_1.CommonUtil.getElementAttribute(elem, "alt"); + if (alt && alt.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(alt), "nameFrom": "alt" }; + ; + // the visible default text for type "image" is "Submit" same with the type "submit" + //return {"name":elem.getAttribute("type"), "nameFrom": "internal"}; + } + } + // button + // note button may have a value attribute, but it's not a visible text + if (nodeName === "button") { + // first use the button text + var text = elem.innerText; + if (text && text.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "text" }; + // for image button: get the first image if exists + var image = elem.querySelector('img'); + if (image && !VisUtil_1.VisUtil.isNodeHiddenFromAT(image) && !VisUtil_1.VisUtil.isNodePresentational(image)) { + var pair = AccNameUtil.computeAccessibleName(image); + if (pair && pair.name && pair.name.trim().length > 0) + return pair; + } + // for a button with a svg image + var svg = elem.querySelector('svg'); + if (svg && !VisUtil_1.VisUtil.isNodeHiddenFromAT(svg) && !VisUtil_1.VisUtil.isNodePresentational(svg)) { + var pair = AccNameUtil.computeAccessibleName(svg); + if (pair && pair.name && pair.name.trim().length > 0) + return pair; + } + } + // fieldset + if (nodeName === "fieldset") { + // if the fieldset element's first child is a legend element, then use the subtree of the legend + var first = elem.firstElementChild; + if (first && first.nodeName.toLowerCase() === 'legend') { + // legend can be mixed text + var text = first.innerText; + if (text && text.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "legend" }; + } + } + // output + if (nodeName === "output") { + // if the associated label element exists, use concatenated accessible name(s) from labelled elements. + if (elem.hasAttribute("for")) { + var labelIDs = elem.getAttribute("for").trim().split(" "); + if (labelIDs && labelIDs.length > 0) { + var label = ""; + for (var j = 0; j < labelIDs.length; j++) { + var labelNode = elem.ownerDocument.getElementById(labelIDs[j]); + if (labelNode && !DOMUtil_1.DOMUtil.sameNode(labelNode, elem) && !VisUtil_1.VisUtil.isNodeHiddenFromAT(labelNode) && !VisUtil_1.VisUtil.isNodePresentational(labelNode)) { + var pair = AccNameUtil.computeAccessibleName(labelNode); + if (pair && pair.name && pair.name.trim().length > 0) + label += " " + CommonUtil_1.CommonUtil.normalizeSpacing(pair.name); + } + } + if (label.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(label), "nameFrom": "label" }; + } + } + } + // summary + if (nodeName === "summary") { + // use summary element subtree + var text = elem.innerText; + if (text && text.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "legend" }; + } + // details + if (nodeName === "details") { + var first = elem.firstElementChild; + if (first && first.nodeName.toLowerCase() === 'summary') { + // get accessible name from summary + var pair = AccNameUtil.computeAccessibleName(first); + if (pair && pair.name && pair.name.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(pair.name.trim()), "nameFrom": "summary" }; + } + // If no summary element as a direct child of the details element, + // the user agent should provide one with a subtree containing a localized string of the word "details". + return { "name": "details", "nameFrom": "internal" }; + } + // figure + if (nodeName === "figure") { + // if the figure element has a figcaption as a child + var caption = CommonUtil_1.CommonUtil.getChildByTagHidden(elem, "figcaption", true, false); + if (caption && caption.length > 0) { + // figcaption can be mixed text + var text = caption[0].innerText; + if (text && text.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "figcaption" }; + } + } + // img elements: use attribute "alt" + if (nodeName === "img") { + if (elem.hasAttribute("alt")) { + var alt = elem.getAttribute("alt"); + return { "name": CommonUtil_1.CommonUtil.truncateText(alt), "nameFrom": "alt" }; + } + } + // area elements: use attribute "alt" + if (nodeName === "area") { + if (elem.hasAttribute("alt")) { + var alt = elem.getAttribute("alt"); + if (alt && alt.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(alt), "nameFrom": "alt" }; + } + } + // table element + if (nodeName === "table") { + // if the figure element has a caption as the first child + var captionElem = elem.firstElementChild; + if (captionElem && captionElem.nodeName.toLowerCase() === 'caption') { + // caption can be mixed text + var caption = captionElem.innerText; + if (caption && caption.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(caption), "nameFrom": "caption" }; + } + } + // a element + if (nodeName === "a") { + // first use the link text + var text = elem.innerText; + if (text && text.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "text" }; + //for image link: get the image or svg if exists + var images = elem.querySelectorAll(":scope > img, :scope > svg"); + if (images && images.length > 0) { + var text_2 = ""; + images.forEach(function (image) { + if (!VisUtil_1.VisUtil.isNodeHiddenFromAT(image) && !VisUtil_1.VisUtil.isNodePresentational(image)) { + var pair = AccNameUtil.computeAccessibleName(image); + if (pair && pair.name && pair.name.trim().length > 0) + text_2 += " " + pair.name.trim(); + } + }); + if (text_2.trim() !== '') + return { "name": text_2.trim(), "nameFrom": "alt" }; + } + } + // optgroup + // label participate in accessible name calculation: https://www.w3.org/TR/html-aam-1.0/#att-label + // The label attribute must be specified. Its value gives the name of the group + // the value is disabled in the interface + if (nodeName === "optgroup" || nodeName === "option" || nodeName === "track") { + var label = elem.getAttribute("label"); + if (label && label.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(label), "nameFrom": "label" }; + } + // svg + if (nodeName === "svg") { + var pair = AccNameUtil.computeAccessibleNameForSVGElementW3C(elem); + if (pair && pair.name && pair.name.trim().length > 0) + return pair; + } + return null; + }; + // calculate accessible name for native elements + AccNameUtil.computeAccessibleNameForSVGElement = function (elem) { + // 1. a direct child or descendant title element + var svgTitles = elem.querySelectorAll(":scope > title"); + if (svgTitles && svgTitles.length > 0) { + var text_3 = ""; + svgTitles.forEach(function (svgTitle) { + if (svgTitle && !VisUtil_1.VisUtil.isNodeHiddenFromAT(svgTitle) && !VisUtil_1.VisUtil.isNodePresentational(svgTitle)) { + var title = svgTitle.textContent; + if (title && title.trim() !== '') + text_3 += title.trim(); + } + }); + if (text_3 && text_3.trim() !== '') + return { "name": text_3.trim(), "nameFrom": "svgTitle" }; + } + // 2. xlink:title attribute on a link + var linkTitle = elem.querySelector("a"); + if (linkTitle && !VisUtil_1.VisUtil.isNodeHiddenFromAT(linkTitle) && !VisUtil_1.VisUtil.isNodePresentational(linkTitle)) { + var link = linkTitle.getAttribute("xlink:title"); + if (link && link.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(link), "nameFrom": "svglinkTitle" }; + } + /** 3. for text container elements, the text content. + * note the SVG text content elements are: ‘text’, ‘textPath’ and ‘tspan’. + * svg element can be nested. One of the purposes is to to group SVG shapes together as a collection for responsive design. + * + * select text content excluded the text from the nested svg elements and their children + */ + var text = ""; + elem.querySelectorAll(":scope > *").forEach(function (element) { + if (element.nodeName.toLowerCase() !== 'svg' && !VisUtil_1.VisUtil.isNodeHiddenFromAT(element) && !VisUtil_1.VisUtil.isNodePresentational(element)) { + var value = CommonUtil_1.CommonUtil.getInnerText(element); + if (value && value.trim().length > 0) + text += value; + } + }); + if (text.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "svgText" }; + // 4. from aria-describedby or aria-description + var descby = AriaUtil_1.AriaUtil.getAriaDescription(elem); + if (descby && descby.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(descby), "nameFrom": "aria-description" }; + // 5. a direct child or descendant desc element + var descElems = elem.querySelectorAll(":scope > desc"); + if (descElems && descElems.length > 0) { + var text_4 = ""; + descElems.forEach(function (descElem) { + if (descElem && !VisUtil_1.VisUtil.isNodeHiddenFromAT(descElem) && !VisUtil_1.VisUtil.isNodePresentational(descElem)) { + var desc = descElem.textContent; + if (desc && desc.trim() !== '') + text_4 += desc.trim(); + } + }); + if (text_4 && text_4.trim() !== '') + return { "name": text_4.trim(), "nameFrom": "svgDesc" }; + } + }; + // calculate accessible name for custom elements marked with aria + AccNameUtil.computeAccessibleNameFromContent = function (elem) { + var nodeName = elem.nodeName.toLowerCase(); + var role = AriaUtil_1.AriaUtil.getResolvedRole(elem); + /** for acc name from content, the content from CSS pseudo-elements + * :before and :after pseudo elements [CSS2] can provide textual content for elements that have a content model. + * For :before or :after pseudo elements, user agents must prepend CSS textual content, without a space, + * to the textual content of the current node. + */ + var pair = AccNameUtil.computeAccessibleNameForCSSPseudoElement(elem, "before"); + if (pair !== null && pair.name && pair.name.trim().length > 0) + return pair; + pair = AccNameUtil.computeAccessibleNameForCSSPseudoElement(elem, "after"); + if (pair && pair.name && pair.name.trim().length > 0) + return pair; + // shadow host + if (elem.shadowRoot) { + pair = AccNameUtil.computeAccessibleNameForShadowHost(elem); + if (pair && pair.name && pair.name.trim().length > 0) + return { "name": pair.name, "nameFrom": "shadow" }; + ; + } + // slot element + if (nodeName === "slot") { + pair = AccNameUtil.computeAccessibleNameForSlotElement(elem); + if (pair && pair.name && pair.name.trim().length > 0) + return { "name": pair.name, "nameFrom": "slot" }; + } + // otherwise: get the value from the element + pair = AccNameUtil.computeAccessibleNameFromChildren(elem); + if (pair && pair.name && pair.name.trim().length > 0) + return { "name": pair.name, "nameFrom": "content" }; + // no accessible name exists + return null; + }; + // calculate accessible name from CSS generated content + AccNameUtil.computeAccessibleNameForCSSPseudoElement = function (elem, type) { + var contentElem = elem.ownerDocument.defaultView.getComputedStyle(elem, type); + if (contentElem) { + var content = contentElem.content; + if (content && content !== "none" && content !== "no" && content !== "normal") { + content = content.replace(/^"/, "").replace(/"$/, ""); + if (content.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(content), "nameFrom": "css-" + type }; + } + } + return null; + }; + // calculate accessible name for SLOT element + AccNameUtil.computeAccessibleNameForShadowHost = function (elem) { + var text = ""; + var shadowRoot = elem.shadowRoot; + if (shadowRoot) { + var children = shadowRoot.querySelectorAll('*'); + // check text from all the children elements + children.forEach(function (child) { + var pair = AccNameUtil.computeAccessibleName(child); + if (pair && pair.name && pair.name.trim().length > 0) + text += " " + pair.name.trim(); + }); + } + if (text.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "shadow-host" }; + return null; + }; + // calculate accessible name for SLOT element + AccNameUtil.computeAccessibleNameForSlotElement = function (elem) { + //if no assignedNode, check its own text + var text = ""; + if (!elem.assignedNodes() || elem.assignedNodes().length === 0) { + var pair = AccNameUtil.computeAccessibleName(elem); + if (pair && pair.name && pair.name.trim().length > 0) + text += " " + pair.name.trim(); + } + else { + // check text from all assigned nodes + for (var _i = 0, _a = elem.assignedNodes(); _i < _a.length; _i++) { + var slotChild = _a[_i]; + var pair = AccNameUtil.computeAccessibleName(slotChild); + if (pair && pair.name && pair.name.length > 0) + text += " " + pair.name.trim(); + } + } + if (text.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "content-slot" }; + return null; + }; + // calculate accessible name from children content + AccNameUtil.computeAccessibleNameFromChildren = function (elem) { + var text = ""; + //let walkChild = elem.firstChild; + var nw = new DOMWalker_1.DOMWalker(elem); + // Loop over all the childrens of the element to get the text + while (nw.nextNode() && nw.node !== elem && nw.node !== elem.parentNode) { + if (nw.bEndTag) + continue; + //while (walkChild) { + var walkChild = nw.node; + if (walkChild.nodeType === 3) { + // for the text node, get the parentnode to check visibility + var parent_1 = walkChild.parentElement; + if (!VisUtil_1.VisUtil.isNodeHiddenFromAT(parent_1) && !VisUtil_1.VisUtil.isNodePresentational(parent_1) && walkChild.nodeValue && walkChild.nodeValue.trim().length > 0) { + text += " " + walkChild.nodeValue.trim(); + } + } + else if (walkChild.nodeType === 1 && !VisUtil_1.VisUtil.isNodeHiddenFromAT(walkChild) && !VisUtil_1.VisUtil.isNodePresentational(walkChild)) { + var pair = AccNameUtil.computeAccessibleName(walkChild); + if (pair && pair.name && pair.name.length > 0) { + text += " " + pair.name.trim(); + nw.bEndTag = true; + } + // Skip children if this element only has presentational children + else if (AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(nw.node)) { + nw.bEndTag = true; + } + } + } + if (text.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "content" }; + return null; + }; + // if accessible name can be ignored for image or svg + AccNameUtil.isAccessibleNameIgnorable = function (elem) { + if (!elem) + return false; + var nodeName = elem.nodeName.toLowerCase(); + if (nodeName !== 'img' && nodeName !== 'svg') + return false; + var parent = elem.parentElement; + if (parent) { + // if the parent is a widget and has an aria label, then image/svg label is not necessary + if ((AriaUtil_1.AriaUtil.isWidget(parent) || AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(parent)) && AriaUtil_1.AriaUtil.hasAriaLabel(parent)) + return true; + } + return false; + }; + return AccNameUtil; +}()); +exports.AccNameUtil = AccNameUtil; + + +/***/ }, + +/***/ "./src/v4/util/AriaUtil.ts" +/*!*********************************!*\ + !*** ./src/v4/util/AriaUtil.ts ***! + \*********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.AriaUtil = void 0; +var CacheUtil_1 = __webpack_require__(/*! ./CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var ARIAMapper_1 = __webpack_require__(/*! ../../v2/aria/ARIAMapper */ "./src/v2/aria/ARIAMapper.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var VisUtil_1 = __webpack_require__(/*! ./VisUtil */ "./src/v4/util/VisUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ./CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ./AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +var AriaUtil = /** @class */ (function () { + function AriaUtil() { + } + AriaUtil.isDefinedAriaAttributeAtIndex = function (ele, index) { + var attrName = ele.attributes[index].name; + return AriaUtil.isDefinedAriaAttribute(ele, attrName); + }; + /** + * this method returns user-defined aria attribute name from dom + * @param ele element + * @returns user defined aria attributes + */ + AriaUtil.getUserDefinedAriaAttributes = function (elem) { + var ariaAttributes = []; + var domAttributes = elem.attributes; + if (domAttributes) { + for (var i = 0; i < domAttributes.length; i++) { + var attrName = domAttributes[i].name.trim().toLowerCase(); + var isAria = attrName.substring(0, 5) === 'aria-'; + if (isAria) + ariaAttributes.push(attrName); + } + } + return ariaAttributes; + }; + /** + * this method returns user-defined html attribute name from dom + * @param ele element + * @returns user defined html attributes + */ + AriaUtil.getUserDefinedHtmlAttributes = function (elem) { + var htmlAttributes = []; + var domAttributes = elem.attributes; + if (domAttributes) { + for (var i = 0; i < domAttributes.length; i++) { + var attrName = domAttributes[i].name.trim().toLowerCase(); + var isAria = attrName.substring(0, 5) === 'aria-'; + if (!isAria) + htmlAttributes.push(attrName); + } + } + return htmlAttributes; + }; + /** + * this method returns user-defined aria attribute name-value pair from dom + * @param ele element + * @returns user defined aria attributes + */ + AriaUtil.getUserDefinedAriaAttributeNameValuePairs = function (elem) { + var ariaAttributes = []; + var domAttributes = elem.attributes; + if (domAttributes) { + for (var i = 0; i < domAttributes.length; i++) { + var attrName = domAttributes[i].name.trim().toLowerCase(); + var attrValue = elem.getAttribute(attrName); + if (attrValue === '') + attrValue = null; + var isAria = attrName.substring(0, 5) === 'aria-'; + if (isAria) + ariaAttributes.push({ name: attrName, value: attrValue }); + } + } + return ariaAttributes; + }; + /** + * this method returns user-defined html attribute name-value pair from dom + * @param ele element + * @returns user defined html attributes + */ + AriaUtil.getUserDefinedHtmlAttributeNameValuePairs = function (elem) { + var htmlAttributes = []; + var domAttributes = elem.attributes; + if (domAttributes) { + for (var i = 0; i < domAttributes.length; i++) { + var attrName = domAttributes[i].name.trim().toLowerCase(); + var attrValue = elem.getAttribute(attrName); + if (attrValue === '') + attrValue = null; + var isAria = attrName.substring(0, 5) === 'aria-'; + if (!isAria) + htmlAttributes.push({ name: attrName, value: attrValue }); + } + } + return htmlAttributes; + }; + /** + * This method handles implicit aria definitions, for example, an input with checked is equivalent to aria-checked="true" + */ + AriaUtil.getAriaAttribute = function (ele, attributeName) { + // If the attribute is defined, it takes precedence + var retVal = ele.getAttribute(attributeName); + if (ele.hasAttribute(attributeName) && retVal.trim() === "") { //"" is treated as false, so we need return it before the below check + return retVal; + } + // Then determine implicit values from other attributes + if (!retVal) { + var tag = ele.nodeName.toLowerCase(); + if (attributeName in AriaUtil.ariaAttributeImplicitMappings) { + if (tag in AriaUtil.ariaAttributeImplicitMappings[attributeName]) { + retVal = AriaUtil.ariaAttributeImplicitMappings[attributeName][tag]; + if (typeof (retVal) === "function") { + retVal = retVal(ele); + } + } + else if ("*" in AriaUtil.ariaAttributeImplicitMappings[attributeName]) { + retVal = AriaUtil.ariaAttributeImplicitMappings[attributeName]["*"]; + if (typeof (retVal) === "function") { + retVal = retVal(ele); + } + } + } + } + // Check role-based defaults + if (!retVal) { + var role = ARIAMapper_1.ARIAMapper.nodeToRole(ele); + if (role in AriaUtil.ariaAttributeRoleDefaults && attributeName in AriaUtil.ariaAttributeRoleDefaults[role]) { + retVal = AriaUtil.ariaAttributeRoleDefaults[role][attributeName]; + if (typeof (retVal) === "function") { + retVal = retVal(ele); + } + } + } + // Still not defined? Check global defaults + if (!retVal && attributeName in AriaUtil.ariaAttributeGlobalDefaults) { + retVal = AriaUtil.ariaAttributeGlobalDefaults[attributeName]; + } + return retVal; + }; + AriaUtil.isDefinedAriaAttribute = function (ele, attrName) { + var isDefinedAriaAttribute = false; + if (attrName.substring(0, 5) === 'aria-') { + // User agents SHOULD treat state and property attributes with a value of "" the same as they treat an absent attribute. + isDefinedAriaAttribute = ele.hasAttribute && ele.hasAttribute(attrName) && ele.getAttribute(attrName).length > 0; + } + return isDefinedAriaAttribute; + }; + /** + * WAI-ARIA’s role attribute may have a list of values, but only the first valid and supported WAI-ARIA role is used + * https://www.w3.org/TR/wai-aria-implementation/#mapping_role_table + * This function is responsible for retrieving the resoled role for an element. + * @parm {HTMLElement} ele - element for which to find role. + * + * @return string - resolved role for the element: + * explicit role: resoled from the list of values + * implicit role: if not explicitely specified, or none of the specified role values is allowed for the element + * null: if none of the specified role values is allowed for the element, neither implicit role exists + * + * @memberOf AriaUtil + */ + AriaUtil.getResolvedRole = function (elem, considerImplicitRoles) { + if (considerImplicitRoles === void 0) { considerImplicitRoles = true; } + if (!elem) + return null; + var role = CacheUtil_1.CacheUtil.getCache(elem, "RPTUTIL_ELEMENT_RESOLVED_ROLE", null); + if (role === null) { + var roles = AriaUtil.getUserDefinedRoles(elem); + var tagProperty = AriaUtil.getElementAriaProperty(elem); + var allowedRoles = AriaUtil.getAllowedAriaRoles(elem, tagProperty); + var containsGeneric = false; + if (roles && roles.length > 0 && allowedRoles && allowedRoles.length > 0) { + for (var i = 0; i < roles.length; i++) { + if (allowedRoles.includes("any") || allowedRoles.includes(roles[i])) { + if (allowedRoles.includes("any") && roles[i] === 'generic') { + containsGeneric = true; + continue; + } + role = roles[i]; + if (role === "presentation" || role === "none") { + // If element is focusable, then presentation roles are to be ignored + if (CommonUtil_1.CommonUtil.isFocusable(elem)) { + //reset rule to null + role = null; + continue; + } + } + break; + } + } + if (containsGeneric) + role = 'generic'; + } + if (role === null && considerImplicitRoles) { + var implicitRole = AriaUtil.getImplicitRole(elem); + role = implicitRole && implicitRole.length > 0 ? implicitRole[0] : undefined; + } + CacheUtil_1.CacheUtil.setCache(elem, "RPTUTIL_ELEMENT_RESOLVED_ROLE", role); + } + return role !== undefined ? role : null; + }; + /** + * This function is responsible for retrieving user defined element's roles from dom. + * @parm {HTMLElement} ele - element for which to find role. + * + * @return {List} roles - list of user defined roles in the element role attribute. + * + * @memberOf AriaUtil + */ + AriaUtil.getUserDefinedRoles = function (ele) { + return AriaUtil.getRoles(ele, false); + }; + /** + * This function is responsible for retrieving element's roles. + * This function also finds implicit roles. + * @parm {HTMLElement} ele - element for which to find role. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {List} roles - list of attribute roles and implicit roles. + * + * @memberOf AriaUtil + */ + AriaUtil.getRoles = function (ele, considerImplicitRoles) { + var roles = []; + if (ele && ele.hasAttribute && ele.hasAttribute("role")) { + var attrRoles = CommonUtil_1.CommonUtil.normalizeSpacing(ele.getAttribute("role").trim()).split(" "); + for (var i = 0; i < attrRoles.length; ++i) { + roles.push(attrRoles[i]); + } + } + //check if implicit roles exist. + //Note: element can have multiple implicit roles + if (considerImplicitRoles) { + var implicitRole = AriaUtil.getImplicitRole(ele); + if (implicitRole !== null && implicitRole.length > 0) { + //add implicit roles to the attributes roles. + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(implicitRole, roles); + } + } + return roles; + }; + /** + * Returns the implicit role of the elemement + * @parm {HTMLElement} ele - element for which to find role. + * + * @return the implicit role or [] if doesn't exist + * + * @memberOf AriaUtil + */ + AriaUtil.getImplicitRole = function (ele) { + if (!ele || ele.nodeType !== 1) + return null; + var implicitRoles = CacheUtil_1.CacheUtil.getCache(ele, "AriaUtil_ImplicitRole", null); + if (!implicitRoles) { + var tagProperty = AriaUtil.getElementAriaProperty(ele); + // check if there are any implicit roles for this element. + if (tagProperty && tagProperty.implicitRole) { + if (tagProperty.implicitRole.includes("generic")) { + // the 'generic' role is only allowed if a valid aria attribute exists. + var domAriaAttributes_1 = AriaUtil.getUserDefinedAriaAttributes(ele); + if (domAriaAttributes_1.length === 0) { + CacheUtil_1.CacheUtil.setCache(ele, "AriaUtil_ImplicitRole", []); + return []; + } + var roleAttributes = []; + var pattern = ARIADefinitions_1.ARIADefinitions.designPatterns['generic']; + if (pattern.reqProps && pattern.reqProps.length > 0) + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(pattern.reqProps, roleAttributes); + if (tagProperty.globalAriaAttributesValid) + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(ARIADefinitions_1.ARIADefinitions.globalProperties, roleAttributes); + if (pattern.deprecatedProps && pattern.deprecatedProps.length > 0) + CommonUtil_1.CommonUtil.reduceArrayItemList(pattern.deprecatedProps, roleAttributes); + // remove 'generic' role if roleAttributes doesn't contain any of domAriaAttributes + if (roleAttributes.length > 0 && !roleAttributes.some(function (attr) { return domAriaAttributes_1.includes(attr); })) { + var implicit = CommonUtil_1.CommonUtil.reduceArrayItemList(['generic'], tagProperty.implicitRole); + CacheUtil_1.CacheUtil.setCache(ele, "AriaUtil_ImplicitRole", implicit); + return implicit; + } + } + CacheUtil_1.CacheUtil.setCache(ele, "AriaUtil_ImplicitRole", tagProperty.implicitRole); + return tagProperty.implicitRole; + } + CacheUtil_1.CacheUtil.setCache(ele, "AriaUtil_ImplicitRole", []); + return []; + } + return implicitRoles; + }; + /** + * Returns the required properties of the role + * @parm {string} role - the role + * @parm {HTMLElement} ele - element for which to find role. + * + * @return {List} properties - list of properties that are required by the role + * + * @memberOf AriaUtil + */ + AriaUtil.getRoleRequiredProperties = function (role, ele) { + if (role === null) { + return null; + } + if (ARIADefinitions_1.ARIADefinitions.designPatterns[role]) { + var requiredAttributes = ARIADefinitions_1.ARIADefinitions.designPatterns[role].reqProps; + // handle special case of separator + if (role.toLowerCase() === "separator" && ele && CommonUtil_1.CommonUtil.isFocusable(ele)) { + requiredAttributes = CommonUtil_1.CommonUtil.concatUniqueArrayItemList(["aria-valuenow"], requiredAttributes || []); + } + return requiredAttributes; + } + else { + return null; + } + }; + /** + * This function is responsible for finding if a element has given role. + * This function aslo finds if element has given roles as implicit role. + * @parm {HTMLElement} ele - element for which to find role. + * @parm {list or string} roles - List or single role for which to find if element has these roles. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {List} retVal - true or false based on if th element has the specified role. + * + * @memberOf AriaUtil + * + * Consider to use hasRoleInSemantics() instead. + */ + AriaUtil.hasRole = function (ele, role, considerImplicitRoles) { + var retVal = false; + if (ele && ele.hasAttribute && ele.hasAttribute("role")) { + if (typeof (role) != typeof ("")) { + var roles = ele.getAttribute("role").trim().split(" "); + for (var i = 0; !retVal && i < roles.length; ++i) { + retVal = roles[i] in role; + } + } + else { + var roles = ele.getAttribute("role").trim().split(" "); + for (var i = 0; !retVal && i < roles.length; ++i) { + retVal = roles[i] === role; + } + } + } + //if none of the the attribute roles matched with given role + //check if implicit roles matches. + //Note: element can have multiple implicit roles + if (!retVal && considerImplicitRoles) { + var wRoles = []; + //check if there are any implicit roles for this element. + var implicitRole = AriaUtil.getImplicitRole(ele); + if (implicitRole !== null && implicitRole.length > 0) { + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(implicitRole, wRoles); + //if role is array loop thru and see if any of the implicit role present in the array + if (typeof (role) != typeof ("")) { + for (var i = 0; !retVal && i < wRoles.length; ++i) { + retVal = wRoles[i] in role; + } + } + else { + for (var i = 0; !retVal && i < wRoles.length; ++i) { + retVal = wRoles[i] === role; + } + } + } + } + return retVal; + }; + /** + * Checks if the element has the role, including the implied role if role is not explicitly specified. + * + * This function is replacing the hasRole function + * + * @parm {HTMLElement} ele - element for which to find role. + * @parm {list or string} roles - List or single role for which to find if element has these roles. + * + * @return {List} retVal - true or false based on if the element has the specified role. + * + * @memberOf AriaUtil + */ + AriaUtil.hasRoleInSemantics = function (ele, role) { + var retVal = false; + var roleSpecified = false; + if (ele && ele.hasAttribute && ele.hasAttribute("role")) { + if (typeof (role) != typeof ("")) { + var roles = ele.getAttribute("role").trim().toLowerCase().split(/\s+/); + for (var i = 0; !retVal && i < roles.length; ++i) { + roleSpecified = true; + retVal = roles[i] in role; + } + } + else { + var roles = ele.getAttribute("role").trim().toLowerCase().split(/\s+/); + for (var i = 0; !retVal && i < roles.length; ++i) { + roleSpecified = true; + retVal = roles[i] === role; + } + } + } + if (roleSpecified) { + return retVal; + } + //check if implicit roles matches. + //Note: element can have multiple implicit roles + //check if there are any implicit roles for this element. + var impRoles = AriaUtil.getImplicitRole(ele); + if (impRoles !== null && impRoles.length > 0) { + //if role is array loop thru and see if any of the implicit role present in the array + if (typeof (role) != typeof ("")) { + for (var i = 0; !retVal && i < impRoles.length; ++i) { + retVal = impRoles[i] in role; + } + } + else { + for (var i = 0; !retVal && i < impRoles.length; ++i) { + retVal = impRoles[i] === role; + } + } + } + return retVal; + }; + /** + * This function is responsible for finding if a element has given role. + * This function also checks if element has given roles as implicit roles. + * @parm {HTMLElement} ele - element for which to find role. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {bool} retVal - true or false based on if the element has the specified role. + * + * @memberOf AriaUtil + */ + AriaUtil.hasAnyRole = function (ele, considerImplicitRoles) { + var retVal = false; + if (ele && ele.hasAttribute && ele.hasAttribute("role")) { + retVal = true; + } + //check if implicit roles exist. + //Note: element can have multiple implicit roles + if (!retVal && considerImplicitRoles) { + //check if there are any implicit roles for this element. + var impRoles = AriaUtil.getImplicitRole(ele); + if (impRoles !== null && impRoles.length > 0) + retVal = true; + } + return retVal; + }; + AriaUtil.isPresentationalElement = function (node) { + // Elements extracted from https://developer.mozilla.org/en/docs/Web/HTML/Element#Inline_text_semantics, + // http://dev.w3.org/html5/html-author/#text-level-semantics and https://wiki.whatwg.org/wiki/Presentational_elements_and_attributes + var presentationalElements = ["abbr", "b", "bdi", "bdo", "br", "cite", "code", "data", "dfn", + "em", "i", "kbd", "mark", "q", "rp", "rt", "rtc", "ruby", "s", + "samp", "small", "span", "strong", "sub", "sup", "time", "u", + "var", "wbr", "a", "progress", "meter", "basefont", "big", "center", + "strike", "tt", "font", "blink", "h1", "h2", "h3", "h4", "h5", "h6", + "hr", "blockquote", "p" + ]; + return CommonUtil_1.CommonUtil.valInArray(node.nodeName.toLowerCase(), presentationalElements); + }; + /** + * return the ancestor of the given element and role. + * + * @parm {element} element - The element to start the node walk on to find parent node + * @parm {string} role - The role to search for on an element under the provided element + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {node} walkNode - A parent node of the element passed in, which has the provided role + * + * @memberOf AriaUtil + */ + AriaUtil.getAncestorWithRole = function (element, roleName, considerImplicitRoles) { + var walkNode = DOMWalker_1.DOMWalker.parentNode(element); + while (walkNode !== null) { + if (considerImplicitRoles) { + if (AriaUtil.hasRoleInSemantics(walkNode, roleName)) { + break; + } + } + else { + if (AriaUtil.hasRole(walkNode, roleName, false)) { + break; + } + } + walkNode = DOMWalker_1.DOMWalker.parentNode(walkNode); + } + return walkNode; + }; + /** + * return the ancestor of the given element and roles. + * + * @parm {element} element - The element to start the node walk on to find parent node + * @parm {array} roles - the role names to search for + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {node} walkNode - A parent node of the element passed in, which has the provided role + * + * @memberOf AriaUtil + */ + AriaUtil.getAncestorWithRoles = function (element, roleNames) { + if (!element || !roleNames || !roleNames.length || roleNames.length === 0) + return null; + var walkNode = element; + while (walkNode !== null) { + var role = AriaUtil.getResolvedRole(walkNode); + if (role !== null && + (roleNames.includes(role) || + (roleNames.includes("*") && !["presentation", "none"].includes(role)))) + return walkNode; + walkNode = DOMWalker_1.DOMWalker.parentNode(walkNode); + } + return null; + }; + /** + * return the roles with given role type. + * + * @parm {element} element - The element to start the node walk on to find parent node + * @parm {array} roleTyples - role types, such as 'widget', 'structure' etc. + * + * @return {array} roles - A parent node of the element passed in, which has the provided role + * + * @memberOf AriaUtil + */ + AriaUtil.getRolesWithTypes = function (element, types) { + if (!element || !types || !types.length || types.length === 0) + return null; + var roles = CacheUtil_1.CacheUtil.getCache(element.ownerDocument, "roles_with_given_types", null); + if (!roles || roles.length === 0) { + roles = []; + Object.entries(ARIADefinitions_1.ARIADefinitions.designPatterns).forEach(function (_a) { + var key = _a[0], value = _a[1]; + if (types.includes(value.roleType)) + roles.push(key); + }); + CacheUtil_1.CacheUtil.setCache(element.ownerDocument, "roles_with_given_types", roles); + } + return roles; + }; + /** + * return the roles with given role type. + * + * @parm {element} element - The element to start the node walk on to find parent node + * @parm {array} roleTyples - role types, such as 'widget', 'structure' etc. + * + * @return {array} roles - A parent node of the element passed in, which has the provided role + * + * @memberOf AriaUtil + */ + AriaUtil.isWidget = function (element) { + if (!element) + return false; + var widget = CacheUtil_1.CacheUtil.getCache(element.ownerDocument, "is_element_widget", null); + if (widget === null) { + var ret = false; + var role = AriaUtil.getResolvedRole(element); + if (role && ARIADefinitions_1.ARIADefinitions.designPatterns[role] && ARIADefinitions_1.ARIADefinitions.designPatterns[role].roleType === 'widget') + ret = true; + CacheUtil_1.CacheUtil.setCache(element.ownerDocument, "is_element_widget", ret); + return ret; + } + return widget; + }; + /** + * return if the element is owned or controlled by another element. + * If an ancestor of an element is owned or controlled by another element, then the element is also considered as owned or controlled. + * an element can be owned or controlled by another element through aria-owns or aria-controls + * when the DOM hierarchy cannot be used to represent the relationship. + * aria-owns attribute is used to define contextual relationship with a owning parent + * aria-controls attribute is used to associate an element with the controlling element. + * example elements with roles: combobox, scrollbar, tab, button, listbox, menu, menubar, radiogroup, tree, treegrid + * + * when an element is owned or controlled by another element, its navigation may be controlled by the parent + * through aria-activedescendants attribute or roving tabindex + * + * Note navigation with native combobox (input with a datalist) is in native focus navigation, not considered here + * + * @parm {element} element - The element to inspect + * @return {boolean} + * + * @memberOf AriaUtil + */ + AriaUtil.isNavigationOwnedOrControlled = function (element) { + if (!element) + return false; + var ownerElems = CacheUtil_1.CacheUtil.getCache(element.ownerDocument, "AriaUtil_NavigationOwnedOrControlled", null); + if (ownerElems !== null && ownerElems.length > 0) { + if (CommonUtil_1.CommonUtil.getAncestor(element, ownerElems)) + return true; + } + var role = AriaUtil.getResolvedRole(element); + if (!role) + return false; + var id = element.getAttribute("id"); + if (!id || id.trim().length === 0) + return false; + var elem = element.ownerDocument.querySelector("*[aria-controls~='".concat(id, "'], *[aria-owns~='").concat(id, "']")); + if (!elem) + return false; + var containers = ['combobox', 'scrollbar', 'button', 'tab', 'listbox', 'menu', 'menubar', 'radiogroup', 'tree', 'treegrid']; + if (containers.includes(role)) { + if (ownerElems === null) + ownerElems = []; + ownerElems.push(element); + CacheUtil_1.CacheUtil.setCache(element.ownerDocument, "AriaUtil_NavigationOwnedOrControlled", ownerElems); + return true; + } + return false; + }; + /** + * This function is responsible for finding a node which matches the role and is a sibling of the + * provided element. + * + * This function by default will not consider Check Hidden Setting at all. + * + * Note: This is a wrapper function to: AriaUtil.getSiblingWithRoleHidden + * + * @parm {element} element - The element to start the node walk on to find sibling node + * @parm {string} role - The role to search for on an element under the provided element + * + * @return {node} walkNode - A sibling node of the element passed in, which has the provided role + * + * @memberOf AriaUtil + */ + AriaUtil.getSiblingWithRole = function (element, role) { + return AriaUtil.getSiblingWithRoleHidden(element, role, false); + }; + /** + * This function is responsible for finding a node which matches the role and is a sibling of the + * provided element. + * + * This function also considers implicit roles for the elements. + * + * This function will also consider elements that are hidden based on the if the Check + * Hidden Content settings should be considered or not. + * + * @parm {element} element - The element to start the node walk on to find sibling node + * @parm {string} role - The role to search for on an element under the provided element + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * @parm {bool} considerImplicit - true or false based on if Implicit roles should be considered. + * + * @return {node} walkNode - A sibling node of the element passed in, which has the provided role + * + * @memberOf AriaUtil + */ + AriaUtil.getSiblingWithRoleHidden = function (element, role, considerHiddenSetting, considerImplicitRole) { + // Variable Declaration + var walkNode = null; + var hasRole = false; + // Only perform the check if element and role are both provided + if (element && role) { + // Fetch the next sibling element + walkNode = element.nextSibling; + // Keep looping over the next siblings to find element which matches + // the provided role. + while (walkNode !== null && !hasRole) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (considerHiddenSetting && CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(walkNode)) { + // Move on to the next node + walkNode = walkNode.nextSibling; + continue; + } + // Check if this node has the role that we need to check exists + if (considerImplicitRole) { + hasRole = AriaUtil.hasRoleInSemantics(walkNode, role); + } + else { + hasRole = AriaUtil.hasRole(walkNode, role, false); + } + // Move on to the next node + walkNode = walkNode.nextSibling; + } + // If we still have not found a node that matches the role, start a reverse look up + if (!walkNode) { + // Fetch the previous Sibling of this element + walkNode = element.previousSibling; + // Keep looping over all the previous siblings to search for an element which + // matches the provided role. + while (walkNode !== null && !hasRole) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (considerHiddenSetting && CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(walkNode)) { + // Move on to the next node + walkNode = walkNode.previousSibling; + continue; + } + // Check if this node has the role that we need to check exists + hasRole = AriaUtil.hasRole(walkNode, role, considerImplicitRole); + // Move on to the next node + walkNode = walkNode.previousSibling; + } + } + } + return walkNode; + }; + /** + * This function is responsible for getting a descendant element with the specified role, under + * the element that was provided. + * + * Note by default this function will not consider the Check Hidden Content Setting. + * + * Note: This is a wrapper function to: AriaUtil.getDescendantWithRoleHidden + * + * @parm {element} element - parent element for which we will be checking descendants for + * @parm {string} roleName - The role to look for on the descendant's elements + * + * @return {node} - The descendant element that matches the role specified (only one) + * + * @memberOf AriaUtil + */ + AriaUtil.getDescendantWithRole = function (element, roleName) { + return AriaUtil.getDescendantWithRoleHidden(element, roleName, false); + }; + /** + * This function is responsible for getting a descendant element with the specified role, under + * the element that was provided. This function aslo finds elements with implicit roles. + * + * @parm {element} element - parent element for which we will be checking descendants for + * @parm {string} roleName - The role to look for on the descendant's elements + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {node} - The descendant element that matches the role specified (only one) + * + * @memberOf AriaUtil + */ + AriaUtil.getDescendantWithRoleHidden = function (element, roleName, considerHiddenSetting, considerImplicitRoles) { + // Variable Decleration + var descendant = null; + var nw = new DOMWalker_1.DOMWalker(element); + // Loop over all the childrens of the element provided and check if the rolename provided exists + while (nw.nextNode() && nw.node != element && nw.node != element.nextSibling) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (considerHiddenSetting && CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(nw.node)) { + continue; + } + // Check if this node has the role specified, if it does then set this as the descendant and stop checking the rest of the + // nodes. + // Check if this node has the implicit roles, if it does then set this as the descendant and stop checking the rest of the + // nodes. + if (considerImplicitRoles ? AriaUtil.hasRoleInSemantics(nw.node, roleName) : AriaUtil.hasRole(nw.node, roleName, false)) { + descendant = nw.node; + break; + } + } + return descendant; + }; + /** + * This function is responsible for getting All descendant elements with the specified roles, under + * the element that was provided. This function aslo finds elements with implicit roles. + * + * @parm {element} element - parent element for which we will be checking descendants for + * @parm {string[]} roleNames - The roles to look for on the descendant's elements + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {node[]} - all descendant elements that match the roles specified + * + * @memberOf AriaUtil + */ + AriaUtil.getAllDescendantsWithRoles = function (element, roleNames, considerHiddenSetting, considerImplicitRoles) { + if (!roleNames || roleNames.length === 0) + return; + // Variable Decleration + var descendants = []; + roleNames.forEach(function (roleName) { + var kids = AriaUtil.getAllDescendantsWithRoleHidden(element, roleName, considerHiddenSetting, considerImplicitRoles); + if (kids && kids.length > 0) + descendants = descendants.concat(kids); + }); + return descendants; + }; + /** + * This function is responsible for getting All descendant elements with the specified role, under + * the element that was provided. This function aslo finds elements with implicit roles. + * + * @parm {element} element - parent element for which we will be checking descendants for + * @parm {string} roleName - The role to look for on the descendant's elements + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {node[]} - The descendant elements that match the role specified + * + * @memberOf AriaUtil + */ + AriaUtil.getAllDescendantsWithRoleHidden = function (element, roleName, considerHiddenSetting, considerImplicitRoles) { + // Variable Decleration + var descendants = []; + var nw = new DOMWalker_1.DOMWalker(element); + // Loop over all the childrens of the element provided and check if the rolename provided exists + while (nw.nextNode() && nw.node != element && nw.node != element.nextSibling) { + if (nw.bEndTag) { + continue; + } + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (considerHiddenSetting && CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(nw.node)) { + continue; + } + // Check if this node has the role specified, if it does then set this as the descendant and stop checking the rest of the + // nodes. + // Check if this node has the implicit roles, if it does then set this as the descendant and stop checking the rest of the + // nodes. + if (AriaUtil.hasRole(nw.node, roleName, considerImplicitRoles)) { + descendants.push(nw.node); + } + } + return descendants; + }; + /** + * This function is responsible for getting All direct children in AT tree with a role (exclude none and presentation) + * + * @parm {element} element - parent element for which we will be checking children for + * @return {node} - The direct child elements in AT tree that has a role + * + * @memberOf AriaUtil + */ + AriaUtil.getDirectATChildren = function (element) { + var requiredChildRoles = AriaUtil.getRequiredChildRoles(element, true); + var direct = []; + AriaUtil.retrieveDirectATChildren(element, requiredChildRoles, direct); + return direct; + }; + /** + * This function is responsible for recursively any child path till either no child or a child with a role is found (exclude none and presentation) + * + * @parm {element} element - parent element for which we will be checking children for + * @return {node} - The direct child elements in AT tree + * + * @memberOf AriaUtil + */ + AriaUtil.retrieveDirectATChildren = function (element, requiredChildRoles, direct) { + var children = []; + if (element.children !== null && element.children.length > 0) { + for (var i = 0; i < element.children.length; i++) { + children.push(element.children[i]); + } + } + // if the element contains "aria-own" attribute, then the aria-owned children need to be included too + var owned = element.getAttribute("aria-owns"); + if (owned) { + var doc = element.ownerDocument; + if (doc) { + var ownedIds = owned.split(" "); + for (var i = 0; i < ownedIds.length; i++) { + var ownedElem = doc.getElementById(ownedIds[i]); + if (ownedElem) { + children.push(ownedElem); + } + } + } + } + if (children.length > 0) { + for (var i = 0; i < children.length; i++) { + //ignore hidden and invisible child + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(children[i]) || !VisUtil_1.VisUtil.isNodeVisible(children[i])) + continue; + var roles = AriaUtil.getRoles(children[i], false); + if (roles === null || roles.length === 0) { + roles = AriaUtil.getImplicitRole(children[i]); + } + if (roles && roles !== null && roles.length > 0) { + //remove 'none' and 'presentation' + roles = roles.filter(function (role) { + return role !== "none" && role !== "presentation"; + }); + // a 'group' role is allowed but not required for some elements so remove it if exists + if (roles.includes("group") && requiredChildRoles && requiredChildRoles.includes('group')) { + roles = roles.filter(function (role) { + return role !== 'group'; + }); + } + } + if (roles && roles !== null && roles.length > 0) { + direct.push(children[i]); + } + else { + // recursive until get a return value, + AriaUtil.retrieveDirectATChildren(children[i], requiredChildRoles, direct); + } + } + return null; + } + else + return null; + }; + /** + * this function returns null or required child roles for a given element with one more roles, + * return null if the role is 'none' or 'presentation' + * @param element + * @param includeImplicit include implicit roles if no role is explicitly provided + * @returns + */ + AriaUtil.getRequiredChildRoles = function (element, includeImplicit) { + var roles = AriaUtil.getRoles(element, false); + // if explicit role doesn't exist, get the implicit one + if ((!roles || roles.length === 0) && includeImplicit) { + roles = AriaUtil.getImplicitRole(element); + } + /** + * ignore if the element doesn't have any explicit or implicit role + */ + if (!roles || roles.length === 0) { + return null; + } + /** + * ignore if the element contains none or presentation role + */ + var presentationRoles = ["none", "presentation"]; + var found = roles.some(function (r) { return presentationRoles.includes(r); }); + if (found) + return null; + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + var requiredChildRoles = new Array(); + for (var j = 0; j < roles.length; ++j) { + if (designPatterns[roles[j]] && designPatterns[roles[j]].reqChildren !== null) { + requiredChildRoles = CommonUtil_1.CommonUtil.concatUniqueArrayItemList(designPatterns[roles[j]].reqChildren, requiredChildRoles); + } + } + return requiredChildRoles; + }; + /** + * This function is responsible for getting an element referenced by aria-owns and has the + * role that was specified. + * + * Note by default this function will not consider the Check Hidden Content Setting. + * + * Note: This is a wrapper function to: AriaUtil.getAriaOwnsWithRoleHidden + * + * @parm {element} element - Element to check for aria-owns + * @parm {string} roleName - The role to look for on the aria-owns element + * + * @return {node} - The element that is referenced by aria-owns and has role specified. + * + * @memberOf AriaUtil + */ + AriaUtil.getAriaOwnsWithRole = function (element, roleName) { + return AriaUtil.getAriaOwnsWithRoleHidden(element, roleName, false); + }; + /** + * This function is responsible for getting an element referenced by aria-owns and has the + * role that was specified. This function aslo finds elements with implicit roles. + * + * @parm {element} element - Element to check for aria-owns + * @parm {string} roleName - The role to look for on the aria-owns element + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {node} - The element that is referenced by aria-owns and has role specified. + * + * @memberOf AriaUtil + */ + AriaUtil.getAriaOwnsWithRoleHidden = function (element, roleName, considerHiddenSetting, considerImplicitRoles) { + // Variable Decleration + var referencedElement = null; + var referencedElemHasRole = false; + // In the case aria-owns is not on the element just break out of this function with null + if (CommonUtil_1.CommonUtil.attributeNonEmpty(element, "aria-owns")) { + // Get the reference ID + var referenceID = element.getAttribute("aria-owns"); + // Get the element for the reference ID + referencedElement = fragment_1.FragmentUtil.getById(element, referenceID); + //ignore if the aria-owns point to the element itself + if (DOMUtil_1.DOMUtil.sameNode(element, referencedElement)) + return null; + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + if (considerHiddenSetting && referencedElement != null && CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(referencedElement)) { + referencedElemHasRole = null; + } + else { + referencedElemHasRole = AriaUtil.hasRole(referencedElement, roleName, considerImplicitRoles); + } + } + return referencedElemHasRole ? referencedElement : null; + }; + // Return true if the element has an ARIA label + AriaUtil.hasAriaLabel = function (element) { + // Rpt_Aria_ValidIdRef determines if the aria-labelledby id points to a valid element + return CommonUtil_1.CommonUtil.attributeNonEmpty(element, "aria-label") || CommonUtil_1.CommonUtil.attributeNonEmpty(element, "aria-labelledby"); + }; + // Given an array of elements, return true if the elements have unique ARIA labels + AriaUtil.hasUniqueAriaLabelsLocally = function (elements, isGlobal) { + if (elements.length === 0) + return false; + var doc = elements[0].ownerDocument; + var hasDuplicateLabels = false; + var uniqueAriaLabels = null; + if (isGlobal) { + uniqueAriaLabels = CacheUtil_1.CacheUtil.getCache(doc, "AriaUtil_HAS_UNIQUE_ARIA_LABELS", null); + } + if (uniqueAriaLabels === null) { + uniqueAriaLabels = {}; + } + for (var i = 0; !hasDuplicateLabels && i < elements.length; ++i) { + if (elements[i].hasAttribute) { + if (elements[i].hasAttribute("aria-label")) { + var ariaLabel = CommonUtil_1.CommonUtil.normalizeSpacing(elements[i].getAttribute("aria-label")).toLowerCase(); + hasDuplicateLabels = ariaLabel in uniqueAriaLabels; + uniqueAriaLabels[ariaLabel] = true; + } + else if (elements[i].hasAttribute("aria-labelledby")) { + var labelID = elements[i].getAttribute("aria-labelledby"); + var labelNode = fragment_1.FragmentUtil.getById(elements[i], labelID); + var label = ""; + if (labelNode && !DOMUtil_1.DOMUtil.sameNode(labelNode, elements[i])) { + label = AriaUtil.getTextContentExcludingScripts(labelNode); + } + var normalizedLabel = CommonUtil_1.CommonUtil.normalizeSpacing(label).toLowerCase(); + hasDuplicateLabels = normalizedLabel in uniqueAriaLabels; + uniqueAriaLabels[normalizedLabel] = true; + } + else { + // Has no label at all + hasDuplicateLabels = true; + } + } + } + if (isGlobal) { + CacheUtil_1.CacheUtil.setCache(doc, "AriaUtil_HAS_UNIQUE_ARIA_LABELS", uniqueAriaLabels); + } + return !hasDuplicateLabels; + }; + /** + * Get text content from an element, excluding script and style elements + * This is a simplified version that doesn't go through full accessible name computation + * to avoid circular dependencies when called from getAriaLabel + * + * Note: When an element is referenced by aria-labelledby, its content is included + * even if the element is hidden (per ARIA spec) + */ + AriaUtil.getTextContentExcludingScripts = function (elem) { + if (!elem) + return ""; + var text = ""; + var nw = new DOMWalker_1.DOMWalker(elem); + while (nw.nextNode() && nw.node !== elem && nw.node !== elem.parentNode) { + if (nw.bEndTag) + continue; + var node = nw.node; + var nodeName = node.nodeName ? node.nodeName.toLowerCase() : ""; + // Skip script and style elements + if (nodeName === 'script' || nodeName === 'style') { + nw.bEndTag = true; // Skip children + continue; + } + if (node.nodeType === 3) { // Text node + // Include text even from hidden elements when referenced by aria-labelledby + if (node.nodeValue && node.nodeValue.trim().length > 0) { + text += " " + node.nodeValue.trim(); + } + } + else if (node.nodeType === 1) { // Element node + // Handle images - get alt text + if (nodeName === 'img' && node.hasAttribute('alt')) { + text += " " + node.getAttribute('alt').trim(); + nw.bEndTag = true; // Skip children of img + } + // Handle input with type="image" - get alt text + else if (nodeName === 'input' && node.getAttribute('type') === 'image' && node.hasAttribute('alt')) { + text += " " + node.getAttribute('alt').trim(); + nw.bEndTag = true; // Skip children + } + } + } + return text.trim(); + }; + AriaUtil.getAriaLabel = function (ele) { + if (ele.hasAttribute) { + if (ele.hasAttribute("aria-labelledby")) { + var labelIDs = ele.getAttribute("aria-labelledby").trim().split(" "); + var normalizedLabel = ""; + for (var j = 0, length_1 = labelIDs.length; j < length_1; ++j) { + var labelID = labelIDs[j]; + var labelNode = fragment_1.FragmentUtil.getById(ele, labelID); + if (labelNode && !DOMUtil_1.DOMUtil.sameNode(labelNode, ele)) { + // Use our helper to get text content without circular dependency + var label = AriaUtil.getTextContentExcludingScripts(labelNode); + normalizedLabel += CommonUtil_1.CommonUtil.normalizeSpacing(label); + } + } + return normalizedLabel.trim(); + } + else if (ele.hasAttribute("aria-label")) { + return CommonUtil_1.CommonUtil.normalizeSpacing(ele.getAttribute("aria-label")).trim(); + } + } + return ""; + }; + AriaUtil.getAriaDescription = function (ele) { + if (!ele) + return ""; + var normalizedLabel = ""; + var desc = ele.getAttribute("aria-labelledby"); + if (desc && desc.trim().length > 0) { + var labelIDs = desc.trim().split(" "); + for (var j = 0, length_2 = labelIDs.length; j < length_2; ++j) { + var labelID = labelIDs[j]; + var labelNode = fragment_1.FragmentUtil.getById(ele, labelID); + if (labelNode && !DOMUtil_1.DOMUtil.sameNode(labelNode, ele)) { + var label = AriaUtil.getTextContentExcludingScripts(labelNode); + if (label && label.trim().length > 0) + normalizedLabel += CommonUtil_1.CommonUtil.normalizeSpacing(label).toLowerCase(); + } + } + if (normalizedLabel.trim().length > 0) + return normalizedLabel.trim(); + } + desc = ele.getAttribute("aria-description"); + if (desc && desc.trim().length > 0) + return desc.trim().toLowerCase(); + return ""; + }; + AriaUtil.findAriaLabelDupes = function (elements) { + var dupeMap = {}; + elements.forEach(function (ele) { + dupeMap[AriaUtil.getAriaLabel(ele)] = (dupeMap[AriaUtil.getAriaLabel(ele)] || 0) + 1; + }); + return dupeMap; + }; + /** + * return accessible names for all AT visible landmark elements + * @param doc + * @returns + */ + AriaUtil.getLandmarkAccNames = function (doc) { + var nameMap = CacheUtil_1.CacheUtil.getCache(doc, "AriaUtil_Landmark_AccNames", null); + if (nameMap && nameMap.length !== 0) + return nameMap; + nameMap = []; + var landmarkElems = doc.querySelectorAll('aside,[role="complementary"], footer,[role="contentinfo"], header,[role="banner"], main,[role="main"], nav,[role="navigation"], form,[role="form"], section,[role="region"], article,[role="article"], [role="search"],[role="application"],[role="document"]'); + if (landmarkElems.length === 0) { + CacheUtil_1.CacheUtil.setCache(doc, "AriaUtil_Landmark_AccNames", nameMap); + return nameMap; + } + landmarkElems.forEach(function (elem) { + // ignore node that is AT hidden or in a dialog that is considered as a separate location from the rest of the main page + if (!VisUtil_1.VisUtil.isNodeHiddenFromAT(elem) && CommonUtil_1.CommonUtil.getAncestor(elem, ["DIALOG"]) === null && AriaUtil.getAncestorWithRole(elem, "dialog", true) === null) { + var name_1 = ""; + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(elem); + if (pair && pair.name && pair.name.trim().length > 0) + name_1 = pair.name.trim(); + // check neested landmark to calculate the accessible name + var ancestors = __spreadArray([], landmarkElems, true).filter(function (e) { return e.contains(elem) && e !== elem; }); + if (ancestors.length > 1) { + ancestors.forEach(function (ancestor) { + var ancestor_pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ancestor); + if (ancestor_pair && ancestor_pair.name && ancestor_pair.name.trim().length > 0) + name_1 = ancestor_pair.name.trim() + " " + name_1; + }); + } + var role = AriaUtil.getResolvedRole(elem); + nameMap.push({ "elem": elem, "role": role, "name": name_1 }); + } + }); + CacheUtil_1.CacheUtil.setCache(doc, "AriaUtil_Landmark_AccNames", nameMap); + return nameMap; + }; + /** + * check if the given element with the landmark rolw is unique + * @param element + * @param role: a specific landmark role, or "any" for all landmark role + * @param considerNoneLabel: if consider the landmarks without a label + * @returns + */ + AriaUtil.isLandmarkNameUnique = function (element, role, considerNoneLabel) { + if (considerNoneLabel === void 0) { considerNoneLabel = false; } + var nameMap = AriaUtil.getLandmarkAccNames(element.ownerDocument); + var exist = null; + if (role === 'any') + exist = nameMap.find(function (entry) { return entry.elem === element; }); + else + exist = nameMap.find(function (entry) { return entry.elem === element && entry.role === role; }); + if (!exist) + return null; + var name = exist.name; + if (!considerNoneLabel && name === '') + return null; + for (var i = 0; i < nameMap.length; i++) { + if (nameMap[i].elem === element) + continue; + if (name === nameMap[i].name) { + if (role === 'any') + return true; + else if (nameMap[i].role === role) + return true; + } + } + return false; + }; + // Given an array of elements, return true if the elements have unique ARIA labels globally + AriaUtil.hasUniqueAriaLabels = function (elements) { + return AriaUtil.hasUniqueAriaLabelsLocally(elements, true); + }; + // Given an array of elements, return true if the elements have unique ARIA labels + AriaUtil.hasDuplicateAriaLabelsLocally = function (elements, isGlobal) { + if (elements.length === 0) + return false; + var doc = elements[0].ownerDocument; + var hasDuplicateLabels = false; + var uniqueAriaLabels = null; + var duplicateLabelNameArray = new Array(); + if (isGlobal) { + uniqueAriaLabels = CacheUtil_1.CacheUtil.getCache(doc, "AriaUtil_HAS_UNIQUE_ARIA_LABELS", null); + } + if (uniqueAriaLabels === null) { + uniqueAriaLabels = {}; + } + for (var i = 0; i < elements.length; ++i) { + if (elements[i].hasAttribute) { + if (elements[i].hasAttribute("aria-label")) { + var ariaLabel = CommonUtil_1.CommonUtil.normalizeSpacing(elements[i].getAttribute("aria-label")).toLowerCase(); + hasDuplicateLabels = ariaLabel in uniqueAriaLabels; + uniqueAriaLabels[ariaLabel] = true; + if (!(ariaLabel in duplicateLabelNameArray)) { + duplicateLabelNameArray[ariaLabel] = new Array(); + } + duplicateLabelNameArray[ariaLabel].push(elements[i].nodeName.toLowerCase()); + } + else if (elements[i].hasAttribute("aria-labelledby")) { + var labelIDs = elements[i].getAttribute("aria-labelledby").trim().split(" "); + var normalizedLabel = ""; + for (var j = 0, length_3 = labelIDs.length; j < length_3; ++j) { + var labelID = labelIDs[j]; + var labelNode = fragment_1.FragmentUtil.getById(elements[i], labelID); + if (labelNode && !DOMUtil_1.DOMUtil.sameNode(labelNode, elements[i])) { + var label = AriaUtil.getTextContentExcludingScripts(labelNode); + normalizedLabel += CommonUtil_1.CommonUtil.normalizeSpacing(label).toLowerCase(); + } + } + hasDuplicateLabels = normalizedLabel in uniqueAriaLabels; + uniqueAriaLabels[normalizedLabel] = true; + if (!(normalizedLabel in duplicateLabelNameArray)) { + duplicateLabelNameArray[normalizedLabel] = new Array(); + } + duplicateLabelNameArray[normalizedLabel].push(elements[i].nodeName.toLowerCase()); + } + } + } + if (isGlobal) { + CacheUtil_1.CacheUtil.setCache(doc, "AriaUtil_HAS_UNIQUE_ARIA_LABELS", uniqueAriaLabels); + } + return duplicateLabelNameArray; + }; + // Given an array of elements, return true if the elements have unique ARIA labels globally + AriaUtil.hasDuplicateAriaLabels = function (elements) { + return AriaUtil.hasDuplicateAriaLabelsLocally(elements, true); + }; + // Given an array of elements, return true if the elements have unique aria-labelledby attributes + AriaUtil.hasUniqueAriaLabelledby = function (elements) { + var hasDuplicateLabels = false; + var labelRefs = {}; + for (var i = 0; !hasDuplicateLabels && i < elements.length; ++i) { + if (elements[i].hasAttribute && elements[i].hasAttribute("aria-labelledby") && !CommonUtil_1.CommonUtil.isIdReferToSelf(elements[i], elements[i].getAttribute("aria-labelledby"))) { + var labelRef = CommonUtil_1.CommonUtil.normalizeSpacing(elements[i].getAttribute("aria-labelledby")); + hasDuplicateLabels = labelRef in labelRefs; + labelRefs[labelRef] = true; + } + else { + hasDuplicateLabels = true; + } + } + return !hasDuplicateLabels; + }; + /** + * this function is responsible for resolving ARIA requirements for an HTML element per ARIA in HTML + * @param ruleContext the HTML element to be examined + * @returns + */ + AriaUtil.getElementAriaProperty = function (ruleContext) { + var tagProperty = CacheUtil_1.CacheUtil.getCache(ruleContext, "AriaUtil_ElementAriaProperty", null); + if (!tagProperty) { + var tagName = null; + var name_2 = null; + if (ruleContext.tagName) { + tagName = ruleContext.tagName.toLowerCase(); + } + else if (ruleContext.nodeName) { + tagName = ruleContext.nodeName.toLowerCase(); + } + // check if the tagProperty exists in the documentConformanceRequirement hash. + tagProperty = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirement[tagName]; + // The tag needs to check some special attributes + if (tagProperty === null || tagProperty === undefined) { + var specialTagProperties = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirementSpecialTags[tagName]; + switch (tagName) { // special cases + case "a": + ruleContext.hasAttribute("href") ? tagProperty = specialTagProperties["with-href"] : tagProperty = specialTagProperties["without-href"]; + break; + case "area": + ruleContext.hasAttribute("href") ? tagProperty = specialTagProperties["with-href"] : tagProperty = specialTagProperties["without-href"]; + break; + case "figure": { + var fcs = CommonUtil_1.CommonUtil.getChildByTag(ruleContext, "figcaption"); + fcs !== null && fcs.length > 0 ? tagProperty = specialTagProperties["child-figcaption"] : tagProperty = specialTagProperties["no-child-figcaption"]; + break; + } + case "footer": + case "header": + if (AriaUtil.getAncestorWithRole(ruleContext, "article", true) !== null || AriaUtil.getAncestorWithRole(ruleContext, "complementary", true) !== null + || AriaUtil.getAncestorWithRole(ruleContext, "navigation", true) !== null || AriaUtil.getAncestorWithRole(ruleContext, "region", true) !== null + || CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["article", "aside", "main", "nav", "section"]) !== null) + tagProperty = specialTagProperties["des-section-article-aside-main-nav"]; + else + tagProperty = specialTagProperties["other"]; + break; + case "img": + var alt = ruleContext.hasAttribute("alt") ? ruleContext.getAttribute("alt") : null; + var title = ruleContext.hasAttribute("title") ? ruleContext.getAttribute("title") : null; + if (AriaUtil.getAriaLabel(ruleContext).trim().length !== 0 || (alt !== null && alt.length > 0) || (title !== null && title.length > 0)) { + // If the img has non-empty alt (alt="some text" or alt=" ") or an accessible name is provided + tagProperty = specialTagProperties["img-with-accname"]; + } + else { + if (alt !== null) { + // If the img has an empty alt (alt="") + tagProperty = specialTagProperties["img-without-accname-empty-alt"]; + } + else { + // If the img lacks an alt attribute + tagProperty = specialTagProperties["img-without-accname-no-alt"]; + } + } + break; + case "input": + if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "type")) { + var type = ruleContext.getAttribute("type").trim().toLowerCase(); + tagProperty = specialTagProperties[type]; + if (tagProperty === null || tagProperty === undefined) { + switch (type) { + case "checkbox": + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "aria-pressed") ? tagProperty = specialTagProperties["checkbox-with-aria-pressed"] : tagProperty = specialTagProperties["checkbox-without-aria-pressed"]; + break; + case "email": + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["email-with-list"] : tagProperty = specialTagProperties["email-no-list"]; + break; + case "search": + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["search-with-list"] : tagProperty = specialTagProperties["search-no-list"]; + break; + case "tel": + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["tel-with-list"] : tagProperty = specialTagProperties["tel-no-list"]; + break; + case "text": + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["text-with-list"] : tagProperty = specialTagProperties["text-no-list"]; + break; + case "url": + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["url-with-list"] : tagProperty = specialTagProperties["url-no-list"]; + break; + default: + // default + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["default-with-list"] : tagProperty = specialTagProperties["default-no-list"]; + break; + } + } + } + else { + // default type is the same as type=text + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["text-with-list"] : tagProperty = specialTagProperties["text-no-list"]; + } + break; + case "li": + specialTagProperties = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirementSpecialTags["li"]; + if (ruleContext.parentElement && AriaUtil.hasRoleInSemantics(ruleContext.parentElement, "list")) + tagProperty = specialTagProperties["child-of-list-role"]; + else + tagProperty = specialTagProperties["no-child-of-list-role"]; + break; + case "section": + //name = ARIAMapper.computeName(ruleContext); + //if (name && name.trim().length > 0) { + var label = AriaUtil.getAriaLabel(ruleContext); + if ((label && label.trim().length > 0) || CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "title")) { + tagProperty = specialTagProperties["with-name"]; + } + else { + tagProperty = specialTagProperties["without-name"]; + } + break; + case "select": + specialTagProperties = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirementSpecialTags["select"]; + if (ruleContext.hasAttribute("multiple") || + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "size") && ruleContext.getAttribute("size") > 1) + tagProperty = specialTagProperties["multiple-attr-size-gt1"]; + else + tagProperty = specialTagProperties["no-multiple-attr-size-gt1"]; + break; + case "summary": + specialTagProperties = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirementSpecialTags["summary"]; + if (ruleContext.parentElement && ruleContext.parentElement.nodeName.toLowerCase() === 'details' + && DOMUtil_1.DOMUtil.sameNode(__spreadArray([], ruleContext.parentElement.children, true).filter(function (elem) { return elem.nodeName.toLowerCase() === 'summary'; })[0], ruleContext)) + tagProperty = specialTagProperties["first-summary-of-detail"]; + else + tagProperty = specialTagProperties["no-first-summary-of-detail"]; + break; + case "tbody": + case "td": + case "tr": + if (AriaUtil.getAncestorWithRole(ruleContext, "table", true) !== null) { + tagProperty = specialTagProperties["des-table"]; + } + else { + AriaUtil.getAncestorWithRole(ruleContext, "grid", true) || AriaUtil.getAncestorWithRole(ruleContext, "treegrid", true) ? tagProperty = specialTagProperties["des-grid"] : tagProperty = specialTagProperties["des-other"]; + } + break; + case "th": + var scope = CommonUtil_1.CommonUtil.getScopeForTh(ruleContext); + if (AriaUtil.getAncestorWithRole(ruleContext, "table", true) !== null) { + if (scope === 'column') + tagProperty = specialTagProperties["des-table-column-scope"]; + else + tagProperty = specialTagProperties["des-table-row-scope"]; + } + else if (AriaUtil.getAncestorWithRole(ruleContext, "grid", true) !== null || AriaUtil.getAncestorWithRole(ruleContext, "treegrid", true) !== null) { + if (scope === 'column') + tagProperty = specialTagProperties["des-grid-treegrid-column-scope"]; + else + tagProperty = specialTagProperties["des-grid-treegrid-row-scope"]; + } + else + tagProperty = specialTagProperties["des-other"]; + break; + case "div": + var prt = ruleContext.parentElement; + prt !== null && prt.nodeName.toLowerCase() === 'dl' ? tagProperty = specialTagProperties["child-dl"] : tagProperty = specialTagProperties["no-child-dl"]; + break; + default: + tagProperty = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirementSpecialTags["default"]; + } //switch + } + } + CacheUtil_1.CacheUtil.setCache(ruleContext, "AriaUtil_ElementAriaProperty", tagProperty); + return tagProperty || null; + }; + AriaUtil.getAllowedAriaRoles = function (ruleContext, properties) { + var allowedRoles = CacheUtil_1.CacheUtil.getCache(ruleContext, "AriaUtil_AllowedAriaRoles", null); + if (!allowedRoles) { + allowedRoles = []; + var tagProperty = null; + if (properties !== null && properties !== undefined) { + tagProperty = properties; + } + else { + tagProperty = AriaUtil.getElementAriaProperty(ruleContext); + } + if (tagProperty !== null && tagProperty !== undefined) { + if (tagProperty.implicitRole !== null) { + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(tagProperty.implicitRole, allowedRoles); + } + if (tagProperty.validRoles !== null) { + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(tagProperty.validRoles, allowedRoles); + } + var implicitRoles = AriaUtil.getImplicitRole(ruleContext); + if (implicitRoles && implicitRoles.length > 0) { + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(tagProperty.validRoles, allowedRoles); + } + } + CacheUtil_1.CacheUtil.setCache(ruleContext, "AriaUtil_AllowedAriaRoles", allowedRoles); + } + return allowedRoles; + }; + AriaUtil.getAllowedAriaAttributes = function (ruleContext, roles, properties) { + var allowedAttributes = CacheUtil_1.CacheUtil.getCache(ruleContext, "AriaUtil_AllowedAriaAttributes", null); + if (!allowedAttributes) { + allowedAttributes = []; + var permittedRoles = __spreadArray([], roles, true); + var tagName = ruleContext.tagName.toLowerCase(); + var prohibitedAttributes = []; + // Element with a disabled attribute https://www.w3.org/TR/html5/disabled-elements.html + if (ARIADefinitions_1.ARIADefinitions.elementsAllowedDisabled.indexOf(tagName) > -1) { + // Use the aria-disabled attribute on any element that is allowed the disabled attribute in HTML5. + allowedAttributes = CommonUtil_1.CommonUtil.concatUniqueArrayItem("aria-disabled", allowedAttributes); + } + // Element with a required attribute http://www.the-art-of-web.com/html/html5-form-validation/ + if (ARIADefinitions_1.ARIADefinitions.elementsAllowedRequired.indexOf(tagName) > -1) { + // Use the aria-required attribute on any element that is allowed the required attribute in HTML5. + allowedAttributes = CommonUtil_1.CommonUtil.concatUniqueArrayItem("aria-required", allowedAttributes); + } + if (ARIADefinitions_1.ARIADefinitions.elementsAllowedReadOnly.indexOf(tagName) > -1) { + // Use the aria-readonly attribute on any element that is allowed the readonly attribute in HTML5. + allowedAttributes = CommonUtil_1.CommonUtil.concatUniqueArrayItem("aria-readonly", allowedAttributes); + } + var tagProperty = null; + if (properties != null && properties !== undefined) + tagProperty = properties; + else + tagProperty = AriaUtil.getElementAriaProperty(ruleContext); + if (tagProperty !== null && tagProperty !== undefined) { + // add the implicit role allowed attributes to the allowed role list if there is no specified role + // ignore if the element doesn't allow the attributes from the implicit roles + if (tagProperty.implicitRole !== null && + (permittedRoles === null || permittedRoles === undefined || permittedRoles.length === 0) + && tagProperty.allowAttributesFromImplicitRole === undefined) { + for (var i = 0; i < tagProperty.implicitRole.length; i++) { + var roleProperty = ARIADefinitions_1.ARIADefinitions.designPatterns[tagProperty.implicitRole[i]]; + if (roleProperty !== null && roleProperty !== undefined) { + var properties_1 = roleProperty.props; + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(properties_1, allowedAttributes); + properties_1 = AriaUtil.getRoleRequiredProperties(tagProperty.implicitRole[i], ruleContext); + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(properties_1, allowedAttributes); + var prohibitedProps = roleProperty.prohibitedProps; + if (prohibitedProps && prohibitedProps.length > 0) + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(prohibitedProps, prohibitedAttributes); + // special case of separator + if (tagProperty.implicitRole[i] === "separator" && CommonUtil_1.CommonUtil.isFocusable(ruleContext)) { + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(["aria-disabled", "aria-valuenow", "aria-valuemax", "aria-valuemin", "aria-valuetext"], allowedAttributes); + } + } + } + } + // Adding the global properties to the valid attribute list + if (tagProperty.globalAriaAttributesValid) { + var properties_2 = ARIADefinitions_1.ARIADefinitions.globalProperties; // global properties + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(properties_2, allowedAttributes); + } + } + // adding the other role to the allowed roles for the attributes + if (tagProperty && tagProperty.otherRolesForAttributes && tagProperty.otherRolesForAttributes.length > 0) + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(tagProperty.otherRolesForAttributes, permittedRoles); + // adding the specified role properties to the allowed attribute list + for (var i = 0; permittedRoles !== null && i < permittedRoles.length; i++) { + var roleProperties = ARIADefinitions_1.ARIADefinitions.designPatterns[permittedRoles[i]]; + if (roleProperties !== null && roleProperties !== undefined) { + // ignore the properties if the element doesn't allow attributes from the implicit role + if (!tagProperty || tagProperty.implicitRole === null || !tagProperty.implicitRole.includes(permittedRoles[i]) || (tagProperty.implicitRole.includes(permittedRoles[i]) && tagProperty.allowAttributesFromImplicitRole === undefined)) { + var properties_3 = roleProperties.props; // allowed properties + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(properties_3, allowedAttributes); + properties_3 = AriaUtil.getRoleRequiredProperties(permittedRoles[i], ruleContext); // required properties + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(properties_3, allowedAttributes); + } + var prohibitedProps = roleProperties.prohibitedProps; + if (prohibitedProps && prohibitedProps.length > 0) + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(prohibitedProps, prohibitedAttributes); + // special case for separator + if (permittedRoles[i] === "separator" && CommonUtil_1.CommonUtil.isFocusable(ruleContext)) { + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(["aria-disabled", "aria-valuemax", "aria-valuemin", "aria-valuetext"], allowedAttributes); + } + } + } + // ignore aria-level, aria-setsize or aria-posinset if "row" is not in treegrid + if (permittedRoles.includes("row") && AriaUtil.getAncestorWithRole(ruleContext, "treegrid", true) == null) { + var index = -1; + if ((index = allowedAttributes.indexOf("aria-level")) > -1) + allowedAttributes.splice(index, 1); + if ((index = allowedAttributes.indexOf("aria-setsize")) > -1) + allowedAttributes.splice(index, 1); + if ((index = allowedAttributes.indexOf("aria-posinset")) > -1) + allowedAttributes.splice(index, 1); + } + // add the other allowed attributes for the element + if (tagProperty && tagProperty.otherAllowedAriaAttributes && tagProperty.otherAllowedAriaAttributes.length > 0) { + // check attribute-value pair if exists + var allowed = []; + for (var p = 0; p < tagProperty.otherAllowedAriaAttributes.length; p++) { + var attr = tagProperty.otherAllowedAriaAttributes[p]; + if (attr.includes("=")) { + var pair = attr.split("="); + if (ruleContext.getAttribute(pair[0]) === pair[1]) + allowed.push(pair[0]); + } + else + allowed.push(attr); + } + if (allowed.length > 0) + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(allowed, allowedAttributes); + } + // add the other prohibitted attributes for the element + if (tagProperty && tagProperty.otherDisallowedAriaAttributes && tagProperty.otherDisallowedAriaAttributes.length > 0) { + // check attribute-value pair if exists + var disallowed = []; + for (var p = 0; p < tagProperty.otherDisallowedAriaAttributes.length; p++) { + var attr = tagProperty.otherDisallowedAriaAttributes[p]; + if (attr.includes("=")) { + var pair = attr.split("="); + if (ruleContext.getAttribute(pair[0]) === pair[1]) + disallowed.push(pair[0]); + } + else + disallowed.push(attr); + } + if (disallowed.length > 0) + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(disallowed, prohibitedAttributes); + } + //exclude the prohibitedAttributes from the allowedAttributes + allowedAttributes = CommonUtil_1.CommonUtil.reduceArrayItemList(prohibitedAttributes, allowedAttributes); + //exclude aria attribute for elements without implicit role and with 'Naming Prohibited' + if ((!roles || roles.length === 0) && tagProperty.implicitRole === null && tagProperty.prohibitedAriaAttributesWhenNoImplicitRole) + allowedAttributes = CommonUtil_1.CommonUtil.reduceArrayItemList(tagProperty.prohibitedAriaAttributesWhenNoImplicitRole, allowedAttributes); + CacheUtil_1.CacheUtil.setCache(ruleContext, "AriaUtil_AllowedAriaAttributes", allowedAttributes); + } + return allowedAttributes; + }; + /** + * + * @param ariaAttr + * @param htmlAttrs + * @type: conflict or overlapping + * @returns htmlAttrName, 'Pass' or null + * htmlAttrName that conflicts with the ariaAttr, + * 'Pass' with no conflict with the ariaAttr, + * or null where ariaAttr won't cause conflict + */ + AriaUtil.getConflictOrOverlappingHtmlAttribute = function (ariaAttr, htmlAttrs, type) { + var exist = ARIADefinitions_1.ARIADefinitions.relatedAriaHtmlAttributes[ariaAttr['name']]; + if (exist) { + if (!ariaAttr || ariaAttr.length == 0 || !htmlAttrs || htmlAttrs.length == 0) + return []; + var examinedHtmlAtrNames = []; + var concernTypes = null; + if (type === 'conflict') { + if (!exist.conflict || Object.keys(exist.conflict).length === 0) + return null; + concernTypes = exist.conflict; + } + else if (type === 'overlapping') { + if (!exist.overlapping || Object.keys(exist.overlapping).length === 0) + return null; + concernTypes = exist.overlapping; + } + else + return null; + var applicable = false; + var fail_1 = false; + for (var k = 0; k < concernTypes.length; k++) { + var concernAriaValue = concernTypes[k].ariaAttributeValue; + var concernHtmlNames = concernTypes[k].htmlAttributeNames; + var concernHtmlValues = concernTypes[k].htmlAttributeValues; + for (var i = 0; i < htmlAttrs.length; i++) { + var index = concernHtmlNames.indexOf(htmlAttrs[i]['name']); + if (index !== -1) { + applicable = true; + var htmlValuesInConcern = (concernHtmlValues === null || concernHtmlValues[index] === null) ? null : concernHtmlValues[index].split(","); + if (concernAriaValue === null) { + if (htmlValuesInConcern === null) { + examinedHtmlAtrNames.push({ result: 'Failed', 'attr': htmlAttrs[i]['name'] }); + fail_1 = true; + } + else if (htmlValuesInConcern.includes(htmlAttrs[i]['value'])) { + examinedHtmlAtrNames.push({ result: 'Failed', 'attr': htmlAttrs[i]['name'] }); + fail_1 = true; + } + } + else if (htmlValuesInConcern === null) { + if (concernAriaValue === ariaAttr['value']) { + examinedHtmlAtrNames.push({ result: 'Failed', 'attr': htmlAttrs[i]['name'] }); + fail_1 = true; + } + } + else if (concernAriaValue === 'VALUE' && htmlValuesInConcern.includes('VALUE') && htmlValuesInConcern[0] !== ariaAttr['value']) { + examinedHtmlAtrNames.push({ result: 'Failed', 'attr': htmlAttrs[i]['name'] }); + fail_1 = true; + } + else if (concernAriaValue === ariaAttr['value'] && htmlValuesInConcern.includes(htmlAttrs[i]['value'])) { + examinedHtmlAtrNames.push({ result: 'Failed', 'attr': htmlAttrs[i]['name'] }); + fail_1 = true; + } + } + } + } + if (applicable && !fail_1) + examinedHtmlAtrNames.push({ result: 'Pass', 'attr': '' }); + return examinedHtmlAtrNames; + } + else + return null; + }; + AriaUtil.containsPresentationalChildrenOnly = function (elem) { + var roles = AriaUtil.getRoles(elem, false); + // if explicit role doesn't exist, get the implicit one + if (!roles || roles.length === 0) + roles = AriaUtil.getImplicitRole(elem); + //ignore if the element doesn't have any explicit or implicit role, shouldn't happen + if (!roles || roles.length === 0) + return false; + for (var i = 0; roles !== null && i < roles.length; i++) { + var roleProperties = ARIADefinitions_1.ARIADefinitions.designPatterns[roles[i]]; + if (roleProperties !== null && roleProperties !== undefined) { + var presentional = roleProperties.presentationalChildren; + if (presentional === true) + return true; + } + } + return false; + }; + AriaUtil.shouldBePresentationalChild = function (element) { + var walkNode = DOMWalker_1.DOMWalker.parentElement(element); + while (walkNode) { + if (AriaUtil.containsPresentationalChildrenOnly(walkNode)) + return true; + //aria-own case: if the element is referred by an aria-won + walkNode = ARIAMapper_1.ARIAMapper.getAriaOwnedBy(walkNode) || DOMWalker_1.DOMWalker.parentElement(walkNode); + } + return false; + }; + /* + * check if any explicit role specified for the element is a valid ARIA role + * return: null if no explicit role is defined, + * true if the role(s) are defined in ARIA + * false if any role is not defined in ARIA +*/ + AriaUtil.areRolesDefined = function (roles) { + if (!roles || roles.length === 0) + return null; + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + for (var _i = 0, roles_1 = roles; _i < roles_1.length; _i++) { + var role = roles_1[_i]; + if (!(role.toLowerCase() in designPatterns)) + return false; + } + return true; + }; + /* + * check if any explicit role specified for the element is a valid ARIA role + * return: null if no explicit role is defined, + * true if the role(s) are defined in ARIA + * false if any role is not defined in ARIA + */ + AriaUtil.getInvalidRoles = function (ruleContext) { + var domRoles = AriaUtil.getUserDefinedRoles(ruleContext); + if (!domRoles || domRoles.length === 0) + return null; + // check the 'generic' role first + if (domRoles && domRoles.includes('generic')) + return ["generic"]; + // Failing roles + var failRoleTokens = []; + // Passing roles + var passRoleTokens = []; + var tagProperty = AriaUtil.getElementAriaProperty(ruleContext); + var allowedRoles = AriaUtil.getAllowedAriaRoles(ruleContext, tagProperty); + if (!allowedRoles || allowedRoles.length === 0) + return domRoles; + var invalidRoles = []; + if (allowedRoles.includes('any')) + return []; + for (var i = 0; i < domRoles.length; i++) + if (!allowedRoles.includes(domRoles[i]) && !invalidRoles.includes(domRoles[i])) + invalidRoles.push(domRoles[i]); + return invalidRoles; + }; + /* + * check if any explicit role specified for the element is not defined in ARIA + * return: list of specified roles not defined in ARIA + */ + AriaUtil.getRolesUndefinedByAria = function (element) { + if (!element) + return null; + var roles = AriaUtil.getRoles(element, false); + var undefinedRoles = []; + if (roles && roles.length > 0) { + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + for (var i = 0; i < roles.length; i++) { + if (!(roles[i] in designPatterns)) { + undefinedRoles.push(roles[i]); + } + } + } + return undefinedRoles; + }; + /* + * this method first checks explicit roles, if no explicit role, it will check the implicit role + * return: null if any explicit role is invalid, + * a list of invalid attributes + * empty list if all attributes are valid, or no aria attributes are specified + */ + AriaUtil.getInvalidAriaAttributes = function (ruleContext) { + var roles = AriaUtil.getUserDefinedRoles(ruleContext); + // the invalid role case: handled by Rpt_Aria_ValidRole. Ignore to avoid duplicated report + // for mutiple roles, skip if any role is invalid + var defined = AriaUtil.areRolesDefined(roles); + if (defined !== null && !defined) + return null; + var attrs = []; + if (!roles || roles.length == 0) + roles = AriaUtil.getImplicitRole(ruleContext); + var aria_attrs = AriaUtil.getUserDefinedAriaAttributes(ruleContext); + var tagProperty = AriaUtil.getElementAriaProperty(ruleContext); + // Attributes allowed on this node + var allowedAttributes = AriaUtil.getAllowedAriaAttributes(ruleContext, roles, tagProperty); + if (aria_attrs) { + for (var i = 0; i < aria_attrs.length; i++) { + var attrName = aria_attrs[i].trim().toLowerCase(); + if (!allowedAttributes.includes(attrName) && !attrs.includes(attrName)) + attrs.push(attrName); + } + } + return attrs; + }; + /* + * get conflict Aria and Html attributes + * return: a list of Aria and Html attribute pairs that are conflict + */ + AriaUtil.getConflictAriaAndHtmlAttributes = function (elem) { + var ariaAttrs = AriaUtil.getUserDefinedAriaAttributeNameValuePairs(elem); + var htmlAttrs = AriaUtil.getUserDefinedHtmlAttributeNameValuePairs(elem); + var ret = []; + if (ariaAttrs && ariaAttrs.length > 0 && htmlAttrs && htmlAttrs.length > 0) { + var _loop_1 = function (i) { + var examinedHtmlAtrNames = AriaUtil.getConflictOrOverlappingHtmlAttribute(ariaAttrs[i], htmlAttrs, 'conflict'); + if (examinedHtmlAtrNames === null) + return "continue"; + examinedHtmlAtrNames.forEach(function (item) { + if (item['result'] === 'Failed') //failed + ret.push({ 'ariaAttr': ariaAttrs[i]['name'], 'htmlAttr': item['attr'] }); + }); + }; + for (var i = 0; i < ariaAttrs.length; i++) { + _loop_1(i); + } + } + return ret; + }; + /* + * get deprecated Aria roles + * return: a list of deprecated Aria roles + */ + AriaUtil.getDeprecatedAriaRoles = function (element) { + if (!element) + return null; + var roles = AriaUtil.getRoles(element, false); + var ret = []; + if (roles && roles.length > 0) { + var globalDeprecatedRoles = ARIADefinitions_1.ARIADefinitions.globalDeprecatedRoles; + for (var i = 0; i < roles.length; i++) { + if (globalDeprecatedRoles.includes(roles[i])) + ret.push(roles[i]); + } + } + return ret; + }; + /* + * get deprecated Aria role-attributes + * return: a list of deprecated Aria role-attributes paris + * for global the role is marked as 'any' + */ + AriaUtil.getDeprecatedAriaAttributes = function (element) { + if (!element) + return null; + var domAttributes = element.attributes; + var ariaAttrs = []; + if (domAttributes) { + for (var i = 0; i < domAttributes.length; i++) { + var attrName = domAttributes[i].name; + if (attrName.substring(0, 5) === 'aria-') + ariaAttrs.push(attrName); + } + } + if (ariaAttrs.length === 0) + return []; + var ret = []; + var globalDeprecatedAttributes = ARIADefinitions_1.ARIADefinitions.globalDeprecatedProperties; + for (var i = 0; i < ariaAttrs.length; i++) { + if (globalDeprecatedAttributes.includes(ariaAttrs[i])) + ret.push({ "role": "any", "attribute": ariaAttrs[i] }); + } + var roles = AriaUtil.getRoles(element, false); + if (roles && roles.length > 0) { + for (var i = 0; i < roles.length; i++) { + var roleWithDeprecatedAttributes = ARIADefinitions_1.ARIADefinitions.designPatterns[roles[i]]; + if (roleWithDeprecatedAttributes) { + var deprecatedAttriNames = roleWithDeprecatedAttributes['deprecatedProps']; + if (deprecatedAttriNames && deprecatedAttriNames.length > 0) { + for (var j = 0; j < ariaAttrs.length; j++) { + if (deprecatedAttriNames.includes(ariaAttrs[j])) + ret.push({ "role": roles[i], "attribute": ariaAttrs[j] }); + } + } + } + } + } + return ret; + }; + AriaUtil.isNodeInGrid = function (node) { + return AriaUtil.getAncestorWithRole(node, "grid") != null; + }; + // This list contains a list of elements tags which have display: none by default, since we have rules triggering + AriaUtil.navLinkKeywords = ['start', 'next', 'prev', 'previous', 'contents', 'index']; + // This list contains a list of rule ids for the rules that have to check for hidden content regardless of the Check Hidden + // Content Setting. This means that when the engine is actually determine which elements to mass to the rules, it will always + // pass theses rules no matter what the Check Hidden Content Setting is. + AriaUtil.rulesThatHaveToCheckHidden = ['RPT_Elem_UniqueId']; + // https://www.w3.org/TR/wai-aria-1.1/#introstates + AriaUtil.ariaAttributeRoleDefaults = { + "alert": { + "aria-live": "assertive", + "aria-atomic": "true" + }, + "combobox": { + "aria-haspopup": "listbox" + }, + "listbox": { + "aria-orientation": "vertical" + }, + "log": { + "aria-live": "polite" + }, + "menu": { + "aria-orientation": "vertical" + }, + "menubar": { + "aria-orientation": "horizontal" + }, + "meter": { + "aria-valuemin": "0", + "aria-valuemax": "100" + }, + "option": { + "aria-selected": "false" + }, + "progressbar": { + "aria-valuemin": "0", + "aria-valuemax": "100" + }, + "scrollbar": { + "aria-orientation": "vertical", + "aria-valuemin": "0", + "aria-valuemax": "100" + }, + "separator": { + "aria-orientation": "horizontal", + "aria-valuemin": "0", + "aria-valuemax": "100" + }, + "slider": { + "aria-orientation": "horizontal", + "aria-valuemin": "0", + "aria-valuemax": "100" + }, + "spinbutton": { + // Not sure how to encode min/max (or now in 1.2 - "has no value") + //"aria-valuenow": "0" TODO: at risk: maybe delete after ARIA 1.2 reaches proposed rec + // Probably just delete spinbutton from this list completely and let user agents handle "defaults" + }, + "status": { + "aria-live": "polite", + "aria-atomic": "true" + }, + "tab": { + "aria-selected": "false" + }, + "tablist": { + "aria-orientation": "horizontal" + }, + "toolbar": { + "aria-orientation": "horizontal" + }, + "tree": { + "aria-orientation": "vertical" + } + }; + // https://www.w3.org/TR/wai-aria-1.1/#aria-atomic + AriaUtil.ariaAttributeGlobalDefaults = { + "aria-atomic": "false", + "aria-autocomplete": "none", + "aria-busy": "false", + "aria-checked": undefined, + "aria-current": "false", + "aria-disabled": "false", + "aria-dropeffect": "none", + "aria-expanded": undefined, + "aria-grabbed": undefined, + "aria-haspopup": "false", + "aria-hidden": undefined, + "aria-invalid": "false", + "aria-live": "off", + "aria-modal": "false", + "aria-multiline": "false", + "aria-multiselectable": "false", + "aria-orientation": undefined, + "aria-pressed": undefined, + "aria-readonly": "false", + //"aria-relevant": "additions text", TODO: are multiple values supported? + "aria-required": "false", + "aria-selected": undefined, + "aria-sort": "none" + }; + // https://www.w3.org/TR/html-aam-1.0/#html-attribute-state-and-property-mappings + AriaUtil.ariaAttributeImplicitMappings = { + "aria-autocomplete": { + "form": function (e) { + return "off" === e.getAttribute("autocomplete") ? "none" : "both"; + }, + "input": function (e) { + return "off" === e.getAttribute("autocomplete") ? "none" : "both"; + }, + "select": function (e) { + return "off" === e.getAttribute("autocomplete") ? "none" : "both"; + }, + "textarea": function (e) { + return "off" === e.getAttribute("autocomplete") ? "none" : "both"; + } + }, + "aria-checked": { + "input": function (e) { + if (e.hasAttribute("indeterminate")) + return "mixed"; + return "" + e.hasAttribute("checked"); + }, + "menuitem": function (e) { + if (e.hasAttribute("indeterminate")) + return "mixed"; + return "" + e.hasAttribute("checked"); + }, + "*": function (e) { + if (e.hasAttribute("indeterminate")) + return "mixed"; + }, + }, + "aria-disabled": { + "button": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + }, + "fieldset": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + }, + "input": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + }, + "optgroup": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + }, + "option": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + }, + "select": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + }, + "textarea": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + } + }, + "aria-expanded": { + "details": function (e) { + return e.getAttribute("open"); + }, + "dialog": function (e) { + return e.getAttribute("open"); + } + }, + "aria-multiselectable": { + "select": function (e) { + if (e.hasAttribute("multiple")) + return "true"; + return; + } + }, + "aria-placeholder": { + "input": function (e) { + return e.getAttribute("placeholder"); + }, + "textarea": function (e) { + return e.getAttribute("placeholder"); + } + }, + "aria-required": { + "input": function (e) { + return e.getAttribute("required"); + }, + "select": function (e) { + return e.getAttribute("required"); + }, + "textarea": function (e) { + return e.getAttribute("required"); + } + } + }; + return AriaUtil; +}()); +exports.AriaUtil = AriaUtil; + + +/***/ }, + +/***/ "./src/v4/util/CSSUtil.ts" +/*!********************************!*\ + !*** ./src/v4/util/CSSUtil.ts ***! + \********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.CSSUtil = void 0; +var CacheUtil_1 = __webpack_require__(/*! ./CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ./CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var AriaUtil_1 = __webpack_require__(/*! ./AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var DOMMapper_1 = __webpack_require__(/*! ../../v2/dom/DOMMapper */ "./src/v2/dom/DOMMapper.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var CSSUtil = /** @class */ (function () { + function CSSUtil() { + } + CSSUtil.selectorMatchesElem = function (element, selector) { + // Early return for empty selector (before try-catch for performance) + if (!selector || selector.length === 0 || selector.trim() === "") + return false; + try { + // Modern standard method + if (typeof element.matches === "function") { + return element.matches(selector); + } + // Vendor-prefixed fallbacks (older browsers) + if (typeof element.webkitMatchesSelector === "function") { + return element.webkitMatchesSelector(selector); + } + if (typeof element.msMatchesSelector === "function") { + return element.msMatchesSelector(selector); + } + // Legacy method (deprecated but kept for compatibility) + if (typeof element.matchesSelector === "function") { + return element.matchesSelector(selector); + } + // Fallback: use querySelectorAll and check if element is in results + var doc = element.ownerDocument || element.document; + if (!doc) + return false; + var matches = doc.querySelectorAll(selector); + // Use Array.from for better performance with modern engines + return Array.from(matches).includes(element); + } + catch (err) { + // Bad selector? Doesn't match then... + return false; + } + }; + /** + * Returns the style computed for this element + * @param elem + */ + CSSUtil.getComputedStyle = function (elem, pseudoElt) { + if (!elem) + return null; + var doc = elem.ownerDocument; + var win = doc.defaultView; + return win.getComputedStyle(elem, pseudoElt); + }; + /** + * Parse and cache all stylesheet rules at the document level + * Returns an array of parsed rule objects with selector and style information + */ + CSSUtil.getParsedStylesheetRules = function (ownerDoc) { + // Check if we already have cached parsed rules for this document + var cachedRules = CacheUtil_1.CacheUtil.getCache(ownerDoc, "RPTUtil_ParsedStylesheetRules", null); + if (cachedRules) { + return cachedRules; + } + var parsedRules = []; + // Iterate through all of the stylesheets and rules + for (var ssIndex = 0; ssIndex < ownerDoc.styleSheets.length; ++ssIndex) { + var sheet = ownerDoc.styleSheets[ssIndex]; + try { + if (sheet && sheet.cssRules) { + for (var rIndex = 0; rIndex < sheet.cssRules.length; ++rIndex) { + var rule = sheet.cssRules[rIndex]; + var fullRuleSelector = rule.selectorText; + if (fullRuleSelector) { + var pseudoMatch = fullRuleSelector.match(/^(.*)(:[a-zA-Z-]*)$/); + var hasPseudoClass = !!pseudoMatch; + var selMain = hasPseudoClass ? pseudoMatch[1] : fullRuleSelector; + var selPseudo = hasPseudoClass ? pseudoMatch[2] : ""; + parsedRules.push({ + fullRuleSelector: fullRuleSelector, + hasPseudoClass: hasPseudoClass, + selMain: selMain, + selPseudo: selPseudo, + style: rule.style + }); + } + } + } + } + catch (err) { + if (!err.toString().includes("Cannot access rules") && + !err.toString().includes("SecurityError:")) { + throw err; + } + } + } + // Cache the parsed rules at the document level + CacheUtil_1.CacheUtil.setCache(ownerDoc, "RPTUtil_ParsedStylesheetRules", parsedRules); + return parsedRules; + }; + /** + * Private helper method to fill style maps from a CSSStyleDeclaration + * Handles CSS property priorities and the "all" shorthand property + */ + CSSUtil.fillStyle = function (maps, style) { + for (var sIndex = 0; sIndex < style.length; ++sIndex) { + if (style[sIndex] === "all" && style[style[sIndex]]) { + for (var _i = 0, maps_1 = maps; _i < maps_1.length; _i++) { + var map = maps_1[_i]; + for (var key in map) { + delete map[key]; + } + } + break; + } + else { + var key = style[sIndex]; + for (var _a = 0, maps_2 = maps; _a < maps_2.length; _a++) { + var map = maps_2[_a]; + var priority = style.getPropertyPriority(key); + if (key in map && map[key].endsWith("!important")) { + if (priority === "important" && + !map[key].startsWith("inherit") && + !map[key].startsWith("unset")) + map[key] = style[key] + " !important"; + else + continue; + } + else + map[key] = + style[key] + + (priority === "important" ? " !important" : ""); + } + } + } + }; + /** + * Private helper method that consolidates the logic for getting defined styles + * Used by both getDefinedStyles and getDefinedStylesMultiple + */ + CSSUtil.getDefinedStylesInternal = function (elem, props, pseudoClasses) { + var results = {}; + var definedStylesMap = {}; + var definedStylePseudoMap = {}; + // Initialize result objects for all pseudo-classes + for (var _i = 0, pseudoClasses_1 = pseudoClasses; _i < pseudoClasses_1.length; _i++) { + var pseudoClass = pseudoClasses_1[_i]; + definedStylesMap[pseudoClass] = {}; + definedStylePseudoMap[pseudoClass] = {}; + } + // Get pre-parsed stylesheet rules from cache + var parsedRules = CSSUtil.getParsedStylesheetRules(elem.ownerDocument); + // Check once if we need to handle :focus pseudo-class + var hasFocusPseudo = pseudoClasses.includes(":focus"); + var _loop_1 = function (parsedRule) { + if (props !== null && !props.some(function (prop) { return !!parsedRule.style[prop]; })) { + return "continue"; + } + var selPseudo = parsedRule.selPseudo; + var hasPseudoClass = parsedRule.hasPseudoClass; + // Handle :focus-within replacement once per rule if needed + var selMain = parsedRule.selMain; + if (hasFocusPseudo && selPseudo === ":focus") { + // If this element has focus, remove focus-within from parents + selMain = selMain.replace(/([ >][^+~ >]+):focus-within/g, "$1"); + } + // Cache selector matching result (only once per rule, not per pseudo-class) + var selectorMatches = CSSUtil.selectorMatchesElem(elem, selMain); + // Only process if selector matches + if (selectorMatches) { + // Process for each pseudo-class + for (var _c = 0, pseudoClasses_3 = pseudoClasses; _c < pseudoClasses_3.length; _c++) { + var pseudoClass = pseudoClasses_3[_c]; + // Cache map references to avoid repeated lookups + var styleMap = definedStylesMap[pseudoClass]; + var pseudoMap = definedStylePseudoMap[pseudoClass]; + // Get styles of non-pseudo selectors + if (!hasPseudoClass) { + CSSUtil.fillStyle([styleMap, pseudoMap], parsedRule.style); + } + // Get styles for matching pseudo-class + if (selPseudo === pseudoClass) { + CSSUtil.fillStyle([pseudoMap], parsedRule.style); + } + } + } + }; + // Process each cached rule + for (var _a = 0, parsedRules_1 = parsedRules; _a < parsedRules_1.length; _a++) { + var parsedRule = parsedRules_1[_a]; + _loop_1(parsedRule); + } + // Handle element styles and build results in one pass + for (var _b = 0, pseudoClasses_2 = pseudoClasses; _b < pseudoClasses_2.length; _b++) { + var pseudoClass = pseudoClasses_2[_b]; + var styleMap = definedStylesMap[pseudoClass]; + var pseudoMap = definedStylePseudoMap[pseudoClass]; + // Add element's inline styles + CSSUtil.fillStyle([styleMap, pseudoMap], elem.style); + // Build results + if (pseudoClass === "") { + results[pseudoClass] = styleMap; + } + else { + // For pseudo-classes, return only styles that differ from default + var diffStyles = {}; + var keys = Object.keys(pseudoMap); + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + if (pseudoMap[key] !== styleMap[key]) { + diffStyles[key] = pseudoMap[key]; + } + } + results[pseudoClass] = diffStyles; + } + } + return results; + }; + /** + * Returns the style defined for this element for multiple pseudo-classes in a single pass + * + * This is more efficient than calling getDefinedStyles multiple times as it only + * iterates through stylesheets once. + * + * @param {HTMLElement} elem + * @param {string[]} props Properties for which we are looking for (allows us to skip elem matching unnecessarily) + * @param {string[]} pseudoClasses - Array of pseudo-classes to retrieve. Use "" for default (no pseudo-class). + * @returns {Object} Object mapping each pseudo-class to its defined styles + */ + CSSUtil.getDefinedStylesMultiple = function (elem, props, pseudoClasses) { + if (!elem) + return null; + var results = {}; + // Create cache key that includes props filter + // Use "all" for null props, or sorted comma-separated list for specific props + var propsKey = props === null ? "all" : props.slice().sort().join(","); + // Check cache first - see if we have all requested pseudo-classes cached + var allCachedStyles = CacheUtil_1.CacheUtil.getCache(elem, "RPTUtil_DefinedStyles", null); + if (!allCachedStyles) { + allCachedStyles = {}; + } + // Get or create the cache bucket for this props filter + var cachedStyles = allCachedStyles[propsKey]; + var missingPseudoClasses = []; + if (cachedStyles) { + // Check which pseudo-classes are already cached + for (var _i = 0, pseudoClasses_4 = pseudoClasses; _i < pseudoClasses_4.length; _i++) { + var pseudoClass = pseudoClasses_4[_i]; + if (cachedStyles[pseudoClass] !== undefined) { + results[pseudoClass] = cachedStyles[pseudoClass]; + } + else { + missingPseudoClasses.push(pseudoClass); + } + } + // If all are cached, return immediately + if (missingPseudoClasses.length === 0) { + return results; + } + } + else { + cachedStyles = {}; + missingPseudoClasses = pseudoClasses; + } + // Only process missing pseudo-classes using the internal helper + if (missingPseudoClasses.length > 0) { + var newResults = CSSUtil.getDefinedStylesInternal(elem, props, missingPseudoClasses); + // Merge new results with cached results + for (var _a = 0, missingPseudoClasses_1 = missingPseudoClasses; _a < missingPseudoClasses_1.length; _a++) { + var pseudoClass = missingPseudoClasses_1[_a]; + results[pseudoClass] = newResults[pseudoClass]; + cachedStyles[pseudoClass] = newResults[pseudoClass]; + } + // Update cache with all styles (existing + new) + allCachedStyles[propsKey] = cachedStyles; + CacheUtil_1.CacheUtil.setCache(elem, "RPTUtil_DefinedStyles", allCachedStyles); + } + return results; + }; + /** + * Returns the style defined for this element + * + * This differs from the computed style in that the computed style will return + * styles defined by the user agent. This will only return styles defined by the + * application + * if rotation transform is used, the computed style returns the resolved matrix + * while the defined style return the transform function(s) + * for example, for 'transform: rotate(2.5deg);', the computed style returns 'matrix(-0.0436194, 0.999048, -0.999048, -0.0436194, 0, 0)' + * and the defined style returns 'rotate(2.5deg)' + * + * change the type of the parameter pseudoClass from PseudoClass to string to include both pseudo classes (e.g., :focus, :checked) + * and pseudo elements (e.g., ::before, ::after). + * + * @param {HTMLElement} elem + * @param {string[]} props Properties for which we are looking for (allows us to skip elem matching unnecessarily) + * @param {string} [pseudoClass] If specified, will return values that are different + * than when the pseudoClass does not match. + */ + CSSUtil.getDefinedStyles = function (elem, props, pseudoClass) { + if (!elem) + return null; + // Create cache key that includes props filter + // Use "all" for null props, or sorted comma-separated list for specific props + var propsKey = props === null ? "all" : props.slice().sort().join(","); + var pseudoKey = pseudoClass || ""; + // Check cache first - use shared cache structure with getDefinedStylesMultiple + var allCachedStyles = CacheUtil_1.CacheUtil.getCache(elem, "RPTUtil_DefinedStyles", null); + if (!allCachedStyles) { + allCachedStyles = {}; + } + // Get or create the cache bucket for this props filter + var cachedStyles = allCachedStyles[propsKey]; + if (!cachedStyles) { + cachedStyles = {}; + } + if (cachedStyles[pseudoKey] !== undefined) { + return cachedStyles[pseudoKey]; + } + // Use the internal helper method with a single pseudo-class + var results = CSSUtil.getDefinedStylesInternal(elem, props, [pseudoKey]); + var result = results[pseudoKey]; + // Cache the result + cachedStyles[pseudoKey] = result; + allCachedStyles[propsKey] = cachedStyles; + CacheUtil_1.CacheUtil.setCache(elem, "RPTUtil_DefinedStyles", allCachedStyles); + return result; + }; + /** + * Returns the media query defined for the document + * Get media orientation transforms from stylesheets with caching + * Returns transform/rotate properties for elements within media queries + * + * @param {Document} doc + */ + CSSUtil.getMediaOrientationTransform = function (doc) { + // Check if we already have cached media orientation transforms for this document + var cachedTransforms = CacheUtil_1.CacheUtil.getCache(doc, "RPTUtil_MediaOrientationTransforms", null); + if (cachedTransforms) { + return cachedTransforms; + } + var orientationTransforms = {}; + // Iterate through all of the stylesheets and rules + for (var ssIndex = 0; ssIndex < doc.styleSheets.length; ++ssIndex) { + var sheet = doc.styleSheets[ssIndex]; + try { + if (sheet && sheet.cssRules) { + for (var rIndex = 0; rIndex < sheet.cssRules.length; ++rIndex) { + var sheetRule = sheet.cssRules[rIndex]; + if (4 /* CSSRule.MEDIA_RULE */ === sheetRule.MEDIA_RULE) { + var rule = sheetRule; + if (rule && rule.media) { + var mediaList = rule.media; + for (var i = 0; i < mediaList.length; i++) { + if (!mediaList.item(i)) + continue; + var mediaKey = mediaList.item(i).toLocaleLowerCase(); + var elem_transforms = orientationTransforms[mediaKey]; + if (!elem_transforms) + elem_transforms = {}; + var styleRules = rule.cssRules; + for (var j = 0; j < styleRules.length; ++j) { + if (1 /* CSSRule.STYLE_RULE */ === styleRules[j].STYLE_RULE) { + var styleRule = styleRules[j]; + var selector = styleRule.selectorText; + if (selector) { + var transforms = {}; + var styles = styleRule.style; + for (var s = 0; s < styles.length; ++s) { + var key = styles[s]; + var keyLower = key.toLocaleLowerCase(); + if (keyLower === "transform") { + if (key === "all" && styles[key]) { + transforms = {}; + break; + } + else { + transforms[key] = styles[key]; + } + } + else if (keyLower === "rotate") { + transforms[key] = styles[key]; + } + } + if (Object.keys(transforms).length > 0) { + elem_transforms[selector] = transforms; + } + } + } + } + if (Object.keys(elem_transforms).length > 0) { + orientationTransforms[mediaKey] = elem_transforms; + } + } + } + } + } + } + } + catch (err) { + if (!err.toString().includes("Cannot access rules") && + !err.toString().includes("SecurityError:")) { + throw err; + } + } + } + // Cache the media orientation transforms at the document level + CacheUtil_1.CacheUtil.setCache(doc, "RPTUtil_MediaOrientationTransforms", orientationTransforms); + return orientationTransforms; + }; + /** + * convert given rotation transform functions to the degree transformed. + * If multiple functions are given, then the functions are applied linearly in the order. + * rotation_transform function example: rotate(45deg), rotate(2turn), rotate(2rad), rotate3d(1, 1, 1, 45deg), + * rotate(2rad) rotate3d(1, 1, 1, 45deg) + * @param rotation_transform + */ + CSSUtil.getRotationDegree = function (rotation_transform) { + var degree = 0; + try { + if (!rotation_transform) + return degree; + // normalize the rotation_transform + rotation_transform = rotation_transform.replaceAll(", ", ","); + var transform_functions = rotation_transform.split(" "); + for (var i = 0; i < transform_functions.length; i++) { + var transform_function = transform_functions[i].trim(); + if (transform_function === "") + continue; + if (transform_function.startsWith("rotate3d")) { + // example: rotate3d(1, 1, 1, 45deg); + var left = transform_function.indexOf("("); + var right = transform_function.indexOf(")"); + if (left !== -1 && right !== -1) { + var matrix = transform_function.substring(left + 1, right); + var values = void 0; + if (matrix) + values = matrix.split(","); + if (values && values.length === 4) { + var rotation = values[3]; + if (!rotation) + continue; + rotation = rotation.trim(); + if (rotation.endsWith("turn")) { + var num = rotation.substring(0, rotation.length - 4); + num = parseFloat(num); + if (!isNaN(num)) + degree = num * 360; + } + else if (rotation.endsWith("rad")) { + var num = rotation.substring(0, rotation.length - 3); + num = parseFloat(num); + if (!isNaN(num)) + degree = (num * 180) / Math.PI; + } + else if (rotation.endsWith("deg")) { + var num = rotation.substring(0, rotation.length - 3); + num = parseFloat(num); + if (!isNaN(num)) + degree += num; + } + } + } + } + else if (transform_function.startsWith("rotate") || + transform_function.startsWith("rotateZ")) { + // example: rotate(45deg); + var left = transform_function.indexOf("("); + var right = transform_function.indexOf(")"); + if (left !== -1 && right !== -1) { + var rotation = transform_function.substring(left + 1, right); + if (!rotation) + continue; + rotation = rotation.trim(); + if (rotation.endsWith("turn")) { + var num = rotation.substring(0, rotation.length - 4); + num = parseFloat(num); + if (!isNaN(num)) + degree = num * 360; + } + else if (rotation.endsWith("rad")) { + var num = rotation.substring(0, rotation.length - 3); + num = parseFloat(num); + if (!isNaN(num)) + degree = (num * 180) / Math.PI; + } + else if (rotation.endsWith("deg")) { + var num = rotation.substring(0, rotation.length - 3); + num = parseFloat(num); + if (!isNaN(num)) + degree += num; + } + } + } + else if (transform_function.startsWith("matrix3d")) { + // calculate the three Euler angles + var left = transform_function.indexOf("("); + var right = transform_function.indexOf(")"); + if (left !== -1 && right !== -1) { + var matrix = transform_function.substring(left + 1, right); + var values = null; + if (matrix) + values = matrix.split(","); + if (values !== null) { + var z_angle = Math.atan2(values[4], values[5]); + degree += Math.round(Math.round((z_angle * 180) / Math.PI)); + } + } + } + else if (transform_function.startsWith("matrix")) { + // calculate the three Euler angles + var left = transform_function.indexOf("("); + var right = transform_function.indexOf(")"); + if (left !== -1 && right !== -1) { + var matrix = transform_function.substring(left + 1, right); + var values = null; + if (matrix) + values = matrix.split(","); + if (values !== null) { + var z_angle = Math.atan2(values[1], values[0]); + degree += Math.round(Math.round((z_angle * 180) / Math.PI)); + } + } + } + } + while (degree >= 360) + degree -= 360; + } + catch (err) { + console.log("Cannot retrieve rotation degree: " + err); + throw err; + } + return degree; + }; + /** + * Convert CSS style string values to pixels. + * + * @param value style value in string, such as 3rem, 230px etc. + * @param target element. + * @return value in pixels + */ + CSSUtil.getPixelsFromStyle = function (value, elem) { + if (!value) + return 0; + var regex = /(-?[\d.]+)([a-z%]*)/; + var parsed = value.trim().match(regex); + if (parsed === null) + return 0; + if (parsed[2] === "" || parsed[1] === 0) + //no zero value without unit which is considered as error, so implicable + return 0; + var pixels = CSSUtil.convertValue2Pixels(parsed[2], parsed[1], elem); + return pixels === null ? pixels : parseFloat(pixels); + }; + /** + * Convert absolute CSS numerical values to pixels. + * + * @param unitValue in string + * @param target element. + * @return value in pixels + */ + CSSUtil.convertValue2Pixels = function (unit, unitValue, elem) { + if (unitValue === 0) + return 0; + if (!unit) + unit = "px"; + var supportedUnits = { + // absolute unit + px: function (value) { return value; }, + cm: function (value) { return value * 37.8; }, + mm: function (value) { return value * 3.78; }, + q: function (value) { return value * 0.95; }, + in: function (value) { return value * 96; }, + pc: function (value) { return value * 16; }, + pt: function (value) { return value * 1.33; }, + // relative unit + rem: function (value) { + return value * + parseFloat(getComputedStyle(elem.ownerDocument.documentElement).getPropertyValue("font-size")); + }, + em: function (value) { + return value * + parseFloat(getComputedStyle(elem).getPropertyValue("font-size")); + }, + vw: function (value) { + return (value / 100) * elem.ownerDocument.defaultView.innerWidth; + }, + vh: function (value) { + return (value / 100) * elem.ownerDocument.defaultView.innerHeight; + }, + "%": function (value) { + return (value / 100) * + parseFloat(getComputedStyle(elem).getPropertyValue("font-size")); + }, + }; + if (unit in supportedUnits) + return supportedUnits[unit](unitValue); + return null; + }; + /* + * Returns if the font for visible text of the element is defined by material icons + * + * @param {HTMLElement} elem + */ + CSSUtil.isMaterialIconFont = function (elem) { + // TODO: check the existence material icons using fetch in node 18+ + // for now (node 16) just dertermine if the stylesheet for the 'Material Icons' exists statically. note that the loading of the font stylesheet occurs at run time. + //list of known material icons and stylesheet link + var known_icons = { + "Material Icons": "https://fonts.googleapis.com/icon?family=Material+Icons", + }; + var known_css_classes = { + "material-icons": "https://fonts.googleapis.com/icon?family=Material+Icons", + }; + // material icon font can be defined either by font-family: 'Material Icons' or by class="material-icons" + var styles = CSSUtil.getDefinedStyles(elem, ["font-family"]); + var fontFamily = styles["font-family"]; + var found = false; + // font-family specifies a prioritized list of one or more font family names + if (fontFamily && + fontFamily.split(",")[0].replace(/['"]+/g, "").trim() in known_icons) + found = true; + if (!found) { + var list = elem.classList; + for (var css_class in known_css_classes) { + if (list.contains(css_class)) { + found = true; + break; + } + } + } + if (!found) + return false; + var passed = false; + // check if the stylesheet for the 'Material Icons' exists statically + var sheets = elem.ownerDocument.styleSheets; + for (var s = 0; s < sheets.length; s++) { + if (sheets && + sheets.length > 0 && + Object.values(known_icons).indexOf(sheets[s].href) > -1) { + passed = true; + break; + } + } + return passed; + }; + CSSUtil.getWeightNumber = function (styleVal) { + var map = { + light: 100, + bold: 700, + }; + var retVal = parseInt(styleVal); + if (retVal) + return retVal; + if (styleVal in map) + return map[styleVal]; + return 400; + }; + CSSUtil.getFontInPixels = function (styleVal, elem) { + var map = { + "xx-small": 16, + "x-small": 10, + small: 13, + medium: 16, + large: 18, + "x-large": 24, + "xx-large": 32, + }; + var value = parseFloat(styleVal); + if (!value) { + return map[styleVal]; + } + var units = styleVal.substring(("" + value).length); + /** + if (units === "" || units === "px") return value; + if (units === "em") return value * 16; + if (units === "%") return value / 100 * 16; + if (units === "pt") return value * 4 / 3; + return Math.round(value); + */ + return CSSUtil.convertValue2Pixels(units, value, elem); + }; + CSSUtil.getCSSStyle = function (element) { + var styleText = ""; + if (element === null) + return []; + if (element.IBM_CSS_THB) + return element.IBM_CSS_THB; + var nodeName = element.nodeName.toLowerCase(); + if (nodeName === "style") { + styleText = element.innerText; + if (styleText === undefined || styleText.trim() === "") + styleText = element.textContent; + } + else if (element.hasAttribute("style")) { + styleText = element.getAttribute("style"); + } + else + return []; + if (styleText === null || styleText.trim().length === 0) + return []; + //remove comment blocks + var re = /(\/\*+(?:(?:(?:[^\*])+)|(?:[\*]+(?!\/)))[*]+\/)|\/\/.*/g; + var subst = " "; + styleText = styleText.replace(re, subst); + // Find all "key : val;" pairs with various whitespace inbetween + var rKeyVals = /\s*([^:\s]+)\s*:\s*([^;$}]+)\s*(;|$)/g; + // Find all "selector { csskeyvals } with various whitespace inbetween + var rSelectors = /\s*([^{]*){([^}]*)}/g; + if (styleText.indexOf("{") === -1) { + var keyVals = {}; + var m = void 0; + while ((m = rKeyVals.exec(styleText)) != null) { + keyVals[m[1]] = m[2].trim().toLowerCase(); + } + var retVal = [ + { + selector: null, + values: keyVals, + }, + ]; + element.IBM_CSS_THB = retVal; + return retVal; + } + else { + var retVal = []; + var m = void 0; + var m2 = void 0; + while ((m = rSelectors.exec(styleText)) != null) { + var keyVals = {}; + var selKey = m[1]; + var selVal = m[2]; + while ((m2 = rKeyVals.exec(selVal)) != null) { + keyVals[m2[1]] = m2[2].trim().toLowerCase(); + } + retVal.push({ + selector: selKey, + values: keyVals, + }); + } + element.IBM_CSS_THB = retVal; + return retVal; + } + }; + /** + * an "inline" CSS display property tells the element to fit itself on the same line. An 'inline' element's width and height are ignored. + * some element has default inline property, such as <span>, <a> + * most formatting elements inherent inline property, such as <em>, <strong>, <i>, <small> + * other inline elements: <abbr> <acronym> <b> <bdo> <big> <br> <cite> <code> <dfn> <em> <i> <input> <kbd> <label> + * <map> <object> <output> <q> <samp> <script> <select> <small> <span> <strong> <sub> <sup> <textarea> <time> <tt> <var> + * an "inline-block" element still place element in the same line without breaking the line, but the element's width and height are applied. + * inline-block elements: img, button, select, meter, progress, marguee, also in Chrome: textarea, input + * A block-level element always starts on a new line, and the browsers automatically add some space (a margin) before and after the element. + * block-level elements: <address> <article> <aside> <blockquote> <canvas> <dd> <div> <dl> <dt> <fieldset> <figcaption> <figure> <footer> <form> + * <h1>-<h6> <header> <hr> <li> <main> <nav> <noscript> <ol> <p> <pre> <section> <table> <tfoot> <ul> <video> + * + * return: if it's inline element and { inline: true | false, text: true | false, violation: null | {node} } + */ + CSSUtil.getInlineStatus = function (element) { + if (!element) + return null; + var elem_styl = getComputedStyle(element); + if (!elem_styl) + return null; + var status = { inline: false, text: false, violation: null }; + var udisplay = elem_styl.getPropertyValue("display"); + // inline element only + if (udisplay !== "inline") + return status; + status.inline = true; + var parent = element.parentElement; + if (!parent) + return status; + var mapper = new DOMMapper_1.DOMMapper(); + var bounds = mapper.getUnadjustedBounds(element); + var style = getComputedStyle(parent); + var display = style.getPropertyValue("display"); + // an inline element is inside a block. note <body> is a block element too + if (display !== "block" && display !== "inline-block") { + //parent is inline element + if (!CommonUtil_1.CommonUtil.isInnerTextOnlyEmpty(parent)) + status.text = true; + return status; + } + /** + * @returns "yes"": inline with text, "no": inline without text, + * "violation": not spacing enough to neiboring inline target + * "block": block element, + */ + function isInlineWithText(node, before) { + // note browsers insert Text nodes to represent whitespaces. + if (node.nodeType === Node.TEXT_NODE) { + if (node.nodeValue && node.nodeValue.trim().length > 0) + return "yes"; + else + return "no"; + } + else if (node.nodeType === Node.ELEMENT_NODE) { + // special case: <br> is styled 'inline' by default, but change the line + if (node.nodeName.toLowerCase() === "br") + return "block"; + var cStyle = getComputedStyle(node); + var cDisplay = cStyle.getPropertyValue("display"); + if (cDisplay === "inline") { + if (CommonUtil_1.CommonUtil.isTarget(node)) { + if (bounds.width < 24) { + // check if the horizontal spacing is sufficient + var bnds = mapper.getUnadjustedBounds(node); + if ((before && (Math.round(bounds.width / 2) + bounds.left - bnds.left < 24)) + || (!before && (Math.round(bounds.width / 2) + bounds.left - (bnds.left + bnds.width) < 24))) { + status.violation = node.nodeName.toLowerCase(); + return "violation"; + } + else + return "no"; + } + } + if (!CommonUtil_1.CommonUtil.isInnerTextOnlyEmpty(node)) + return "yes"; + return "no"; + } + else + return "block"; + } + else + return "block"; + } + // an inline element is inside a block. note <body> is a block element too + // one or more inline elements with text in the same line: <target>, text<target>, <target>text, <inline>+text<target>, <target><inline>+text, text<target><inline>+ + var walkNode = element.nextSibling; + while (walkNode) { + var inlineText = isInlineWithText(walkNode, true); + if (inlineText === "yes") { + status.text = true; + break; + } + if (inlineText === "block") { + break; + } + walkNode = walkNode.nextSibling; + } + walkNode = element.previousSibling; + while (walkNode) { + var inlineText = isInlineWithText(walkNode, false); + if (inlineText === "yes") { + status.text = true; + break; + } + if (inlineText === "block") { + break; + } + walkNode = walkNode.previousSibling; + } + return status; + }; + /** + * a target is en element that accept a pointer action (click or touch) + * a target is a browser default if it's a native widget (no user defined role) without user style + */ + CSSUtil.isTargetBrowserDefault = function (element) { + if (!element) + return false; + // user defined widget + var roles = AriaUtil_1.AriaUtil.getRoles(element, false); + if (roles && roles.length > 0) + return false; + // no user style to space control size, including use of font + var styles = CSSUtil.getDefinedStyles(element, [ + "line-height", "height", "width", "min-height", "min-width", + "font-size", "margin-top", "margin-bottom", "margin-left", "margin-right" + ]); + if (styles["line-height"] || + styles["height"] || + styles["width"] || + styles["min-height"] || + styles["min-width"] || + styles["font-size"] || + styles["margin-top"] || + styles["margin-bottom"] || + styles["margin-left"] || + styles["margin-right"]) + return false; + return true; + }; + /* + * string contains CJK (chinese, japaneses, or korea) + * return: boolean + */ + CSSUtil.containsCKJ = function (text) { + if (!text) + return false; + // https://en.wikipedia.org/wiki/CJK_Unified_Ideographs https://ayaka.shn.hk/hanregex/ + var regex = /(?:[\u4e00-\u9fff\u3400-\u4dbf])+/g; + var replaced = text.trim().replace(regex, ""); + if (replaced.length === text.trim().length) + return false; + return true; + }; + /** + * Return the ancestor with the given style properties. + * Searches up the DOM tree to find an ancestor that has ALL specified style properties + * with values matching the criteria. + * + * @param {element} elem - The element to start the node walk on to find parent node + * @param {Object} styleProps - The style properties and values of the parent to search for. + * such as {"overflow":['auto', 'scroll'], "overflow-x":['auto', 'scroll']} + * or {"overflow":['*'], "overflow-x":['*']}, The '*' for any value to check the existence of the style prop. + * @param {Array} excludedValues - style values that should be ignored. + * @return {Element|null} - An ancestor element that has all the specified style properties, or null if none found + * @memberOf CSSUtil + */ + CSSUtil.getAncestorWithStyles = function (elem, styleProps, excludedValues) { + if (excludedValues === void 0) { excludedValues = []; } + // Create a cache key that includes the style properties being searched for + var cacheKey = "AriaUtil_AncestorWithStyles_" + JSON.stringify(styleProps) + "_" + JSON.stringify(excludedValues); + // Check if we already have a cached result for this specific query + var cachedResult = CacheUtil_1.CacheUtil.getCache(elem, cacheKey, null); + if (cachedResult !== null) { + return cachedResult === "NOT_FOUND" ? null : cachedResult; + } + // Start with the element itself (not just parent) to maintain backward compatibility + var walkNode = elem; + while (walkNode !== null) { + // Skip if not an HTMLElement (e.g., SVGElement) + // Use nodeType check instead of instanceof to work across different document contexts + if (walkNode.nodeType !== 1 || walkNode.namespaceURI === "http://www.w3.org/2000/svg") { + walkNode = DOMWalker_1.DOMWalker.parentElement(walkNode); + continue; + } + var styles = CSSUtil.getDefinedStyles(walkNode, Object.keys(styleProps)); + // Check if ANY specified style property matches the criteria (OR logic) + for (var styleProp in styleProps) { + var value = styles[styleProp]; + if (!value) { + // Property not defined on this element, try next property + continue; + } + // Remove !important suffix for comparison + value = value.split(" ")[0]; + // Check if value should be excluded + if (excludedValues.includes(value)) { + continue; + } + // Check if value matches the criteria + var acceptedValues = styleProps[styleProp]; + if (acceptedValues.includes('*')) { + // Any value is acceptable (just checking existence) + CacheUtil_1.CacheUtil.setCache(elem, cacheKey, walkNode); + return walkNode; + } + else if (acceptedValues.includes(value)) { + // Value matches one of the accepted values + CacheUtil_1.CacheUtil.setCache(elem, cacheKey, walkNode); + return walkNode; + } + } + walkNode = DOMWalker_1.DOMWalker.parentElement(walkNode); + } + // No matching element or ancestor found - cache this result to avoid re-searching + CacheUtil_1.CacheUtil.setCache(elem, cacheKey, "NOT_FOUND"); + return null; + }; + /** + * return an array [value, Unit] from a value-unit combo string + * @param valueUnitCombo, such as 20px, 2rem + * @returns + */ + CSSUtil.getValueUnitPair = function (valueUnitCombo) { + if (!valueUnitCombo) + return null; + if (Number.isInteger(valueUnitCombo)) + return ["px", valueUnitCombo]; + var value = parseInt(valueUnitCombo); + if (isNaN(value)) + return null; + valueUnitCombo = valueUnitCombo.trim().toLowerCase(); + var match = valueUnitCombo.trim().match(/([a-z]+)$/); + var unit = 'px'; + if (match) + unit = match[1]; + return [unit, value]; + }; + return CSSUtil; +}()); +exports.CSSUtil = CSSUtil; + + +/***/ }, + +/***/ "./src/v4/util/CacheUtil.ts" +/*!**********************************!*\ + !*** ./src/v4/util/CacheUtil.ts ***! + \**********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.CacheUtil = void 0; +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var CacheUtil = /** @class */ (function () { + function CacheUtil() { + } + /* Return a pointer to the given global variable + * with its initial value as given */ + CacheUtil.getCache = function (cacheSpot, keyName, initValue) { + if (!cacheSpot) + return undefined; + var cacheObj = (cacheSpot.nodeType === 9 /* Node.DOCUMENT_NODE */ || cacheSpot.nodeType === 11 /* Node.DOCUMENT_FRAGMENT_NODE */) ? cacheSpot : cacheSpot; + if (cacheObj.aceCache === undefined) { + cacheObj.aceCache = {}; + } + if (cacheObj.aceCache[keyName] === undefined) { + cacheObj.aceCache[keyName] = initValue; + } + return cacheObj.aceCache[keyName]; + }; + CacheUtil.setCache = function (cacheSpot, globalName, value) { + if (!cacheSpot) + return undefined; + var cacheObj = (cacheSpot.nodeType === 9 /* Node.DOCUMENT_NODE */ || cacheSpot.nodeType === 11 /* Node.DOCUMENT_FRAGMENT_NODE */) ? cacheSpot : cacheSpot; + if (cacheObj.aceCache === undefined) { + cacheObj.aceCache = {}; + } + cacheObj.aceCache[globalName] = value; + return value; + }; + CacheUtil.getSetCache = function (cacheSpot, keyName, initFunc) { + if (!cacheSpot) + return undefined; + var cacheObj = (cacheSpot.nodeType === 9 /* Node.DOCUMENT_NODE */ || cacheSpot.nodeType === 11 /* Node.DOCUMENT_FRAGMENT_NODE */) ? cacheSpot : cacheSpot; + if (cacheObj.aceCache === undefined) { + cacheObj.aceCache = {}; + } + if (cacheObj.aceCache[keyName] === undefined || typeof cacheObj.aceCache[keyName] === "undefined") { + cacheObj.aceCache[keyName] = initFunc(); + } + return cacheObj.aceCache[keyName]; + }; + CacheUtil.clearCaches = function (cacheRoot) { + var numNodesVisited = 0; + delete cacheRoot.ownerDocument.aceCache; + var nw = new DOMWalker_1.DOMWalker(cacheRoot, false, cacheRoot, true); + do { + ++numNodesVisited; + delete nw.node.aceCache; + nw.node.ownerDocument && delete nw.node.ownerDocument.aceCache; + } while (nw.nextNode()); + return numNodesVisited; + }; + return CacheUtil; +}()); +exports.CacheUtil = CacheUtil; + + +/***/ }, + +/***/ "./src/v4/util/ClipPathUtil.ts" +/*!*************************************!*\ + !*** ./src/v4/util/ClipPathUtil.ts ***! + \*************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ClipPathUtil = void 0; +var CacheUtil_1 = __webpack_require__(/*! ./CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var CSSUtil_1 = __webpack_require__(/*! ./CSSUtil */ "./src/v4/util/CSSUtil.ts"); +var ClipPathUtil = /** @class */ (function () { + function ClipPathUtil() { + } + /** + * This function is responsible for checking if the node that is visually hidden by css clip-path: + * + * Note 1: If either current node or any of the parent nodes are visually hidden then this + * function will return true (node is not visually hidden). + * + * Note 2: nodes with CSS properties clip-path, the content is not considered hidden to an AT. Text hidden with these methods + * can still be reedable by screen readers. + * Note 3: if a link, form control, or other focusable element is given this style, the element would be focusable but not visible, + * keyboard users might be confused. + * + * @parm {Node} node The node which should be checked if it is visually hidden or not. + * @return {bool} true if the node is visually hidden, false otherwise + * + * @memberOf VisUtil + */ + ClipPathUtil.isNodeVisuallyHiddenByClipPath = function (node) { + if (!node || node.nodeType !== 1) + return false; + var elem = node; + var hidden = CacheUtil_1.CacheUtil.getCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", undefined); + if (hidden !== undefined) + return hidden; + var style = CSSUtil_1.CSSUtil.getComputedStyle(elem); + var width = parseInt(style.width); //always in px + var height = parseInt(style.height); //always in px + var path = style['clip-path']; + if (!path || path.trim() === 'none' || path.trim() === '') { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + path = path.trim().replace(/\s+/g, ' ').toLowerCase(); + var index = path.indexOf("inset("); + if (index !== -1) { + var round_index = path.indexOf("round"); + var str = path.substring(path.indexOf("(") + 1, path.indexOf(")")); + if (round_index !== -1) + str = path.substring(path.indexOf("(") + 1, round_index); + var numbers = str.trim().split(" "); + // When one value is specified, it applies the same inset to all four sides + if (numbers.length === 1) { + var ret = ClipPathUtil.isClippedByInset(elem, numbers[0], numbers[0], numbers[0], numbers[0]); + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", ret); + return ret; + } + // When two values are specified, the first value applies to the top and bottom, the second to the left and right. + if (numbers.length === 2) { + var ret = ClipPathUtil.isClippedByInset(elem, numbers[0], numbers[1], numbers[0], numbers[1]); + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", ret); + return ret; + } + // When three values are specified, the first applies to the top, the second to the right and left, the third to the bottom. + if (numbers.length === 3) { + var ret = ClipPathUtil.isClippedByInset(elem, numbers[0], numbers[1], numbers[1], numbers[2]); + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", ret); + return ret; + } + // When four values are specified, the values apply to the top, right, bottom, and left in that order (clockwise). + if (numbers.length === 4) { + var ret = ClipPathUtil.isClippedByInset(elem, numbers[0], numbers[1], numbers[2], numbers[3]); + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", ret); + return ret; + } + } + index = path.indexOf("rect("); + if (index !== -1) { + var round_index = path.indexOf("round"); + var str = path.substring(path.indexOf("(") + 1, path.indexOf(")")); + if (round_index !== -1) + str = path.substring(path.indexOf("(") + 1, round_index); + var numbers = str.trim().split(" "); + /** + * The first (top) and third (bottom) values are distances from the top edge of the containing block, + * and the second (right) and fourth (left) values are distances from the left edge of the containing block. + * The second (right) and third (bottom) values are clamped by the fourth (left) and first (top) values, respectively, + * + * If auto is used for the first (top) or fourth (left) value, the value of auto is 0, + * and if used for the second (right) or third (bottom) value, the value of auto is 100%. + */ + if (numbers[0] === 'auto') + numbers[0] = '0px'; + if (numbers[3] === 'auto') + numbers[3] = '0px'; + if (numbers[1] === 'auto') + numbers[1] = '100%'; + if (numbers[2] === 'auto') + numbers[2] = '100%'; + // to prevent the bottom edge from crossing over the top edge and right edge from crossing over the left edge. + // for example, rect(10px 0 0 20px) is clamped to rect(10px 20px 10px 20px) + numbers[2] = Math.max(numbers[0], numbers[2]); + numbers[1] = Math.max(numbers[1], numbers[3]); + var top_1 = parseInt(numbers[0]); + if (isNaN(top_1)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + if (numbers[0].endsWith("%")) + top_1 = top_1 * height / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(top_1); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + top_1 = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (top_1 >= height) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + var left = parseInt(numbers[3]); + if (isNaN(left)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + if (numbers[3].endsWith("%")) + left = left * width / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(left); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + left = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (left >= width) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + var right = parseInt(numbers[1]); + if (isNaN(right)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + if (numbers[1].endsWith("%")) + right = right * width / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(right); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + right = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + var bottom = parseInt(numbers[2]); + if (isNaN(bottom)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + if (numbers[2].endsWith("%")) + bottom = bottom * height / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(bottom); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + bottom = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if ((bottom - top_1) <= ClipPathUtil.THRESHOLD || (right - left) <= ClipPathUtil.THRESHOLD) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + index = path.indexOf("xywh("); + if (index !== -1) { + var round_index = path.indexOf("round"); + var str = path.substring(path.indexOf("(") + 1, path.indexOf(")")); + if (round_index !== -1) + str = path.substring(path.indexOf("(") + 1, round_index); + var numbers = str.trim().split(" "); + var x = parseInt(numbers[0]); + if (isNaN(x)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + if (numbers[0].endsWith("%")) + x = x * width / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(top); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + x = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (x >= width) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + var y = parseInt(numbers[1]); + if (isNaN(y)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + if (numbers[1].endsWith("%")) + y = y * height / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(y); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + scrollY = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (y >= height) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + var w = parseInt(numbers[2]); + if (isNaN(w)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + if (numbers[2].endsWith("%")) + w = w * width / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(w); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + w = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (w <= ClipPathUtil.THRESHOLD) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", true); + return true; + } + var h = parseInt(numbers[3]); + if (isNaN(h)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + if (numbers[3].endsWith("%")) + h = h * height / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(h); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + h = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (h <= ClipPathUtil.THRESHOLD) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + index = path.indexOf("circle("); + if (index !== -1) { + var str = path.substring(path.indexOf("(") + 1, path.indexOf(")")); + var numbers = str.trim().split(" "); + var radius = parseInt(numbers[0]); + if (isNaN(radius)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + if (numbers[0].endsWith("%")) { + var short = width > height ? height : width; + radius = radius * short / 100; + } + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(radius); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + radius = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (radius <= ClipPathUtil.THRESHOLD) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + index = path.indexOf("ellipse("); + if (index !== -1) { + var str = path.substring(path.indexOf("(") + 1, path.indexOf(")")); + var numbers = str.trim().split(" "); + // ellipse(closest-side farthest-side at 30% 40%); + if (numbers.length > 3 && numbers[0] === 'closest-side' && numbers[1] === 'farthest-side' && numbers[2] === 'at') { + var radius = parseInt(numbers[3]); + if (numbers.length === 4) { + if (numbers[3].endsWith("%")) { + var value = width > height ? height : width; + radius = radius * value / 100; + } + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(radius); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + radius = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (radius <= ClipPathUtil.THRESHOLD) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + else if (numbers.length === 5) { + for (var i = 3; i < numbers.length; i++) { + var radius_1 = parseInt(numbers[i]); + if (numbers[i].endsWith("%")) { + var value = (i === 3) ? width : height; + radius_1 = radius_1 * value / 100; + } + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(radius_1); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + radius_1 = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (radius_1 <= ClipPathUtil.THRESHOLD) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + // ellipse(40% 50% at left); + var at_index = path.indexOf("at"); + str = path.substring(path.indexOf("(") + 1, path.indexOf(")")); + if (at_index !== -1) + str = path.substring(path.indexOf("(") + 1, at_index); + numbers = str.trim().split(" "); + if (numbers.length !== 2) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + for (var i = 0; i < numbers.length; i++) { + var radius = parseInt(numbers[i]); + if (numbers[i].endsWith("%")) { + var value = (i === 0) ? width : height; + radius = radius * value / 100; + } + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(radius); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + radius = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (radius <= ClipPathUtil.THRESHOLD) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + index = path.indexOf("polygon("); + if (index !== -1) { + var str = path.substring(path.indexOf("(") + 1, path.indexOf(")")); + var numbers = str.trim().split(","); + // polygon(nonzero|evenodd, 0% 0%, 50% 50%, 0% 100%) + if (numbers[0] === 'nonzero' || numbers[0] === 'evenodd') + numbers.shift(); + var y = 0; + var x = 0; + var changed_x = false; + var changed_y = false; + for (var i = 0; i < numbers.length; i++) { + var coordinates = numbers[i].trim().split(" "); + if (coordinates.length != 2) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + var coordinate_xy = [0, 0]; + for (var i_1 = 0; i_1 < 2; i_1++) { + var value = parseInt(coordinates[i_1]); + if (isNaN(value)) + return false; + if (coordinates[i_1].endsWith("%")) + coordinate_xy[i_1] = (i_1 === 0) ? value * width / 100 : value * height / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(coordinates[i_1]); + if (!pair) + return false; + coordinate_xy[i_1] = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + } + if (i === 0) { + x = coordinate_xy[0]; + y = coordinate_xy[1]; + } + if (Math.abs(coordinate_xy[0] - x) >= ClipPathUtil.THRESHOLD) + changed_x = true; + if (Math.abs(coordinate_xy[1] - y) >= ClipPathUtil.THRESHOLD) + changed_y = true; + } + if (changed_x && changed_y) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + }; + ClipPathUtil.isClippedByInset = function (elem, top, right, bottom, left) { + if (right === void 0) { right = '0px'; } + if (bottom === void 0) { bottom = '0px'; } + if (left === void 0) { left = '0px'; } + var style = CSSUtil_1.CSSUtil.getComputedStyle(elem); + var width = parseInt(style.width); //always in px + var height = parseInt(style.height); //always in px + // top + var top_value = parseInt(top); + if (isNaN(top_value)) + return false; + if (top.endsWith("%")) + top_value = top_value * height / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(top); + if (!pair) + return false; + top_value = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + //inset outside of the container + if (top_value > height) + return false; + // right + var right_value = parseInt(right); + if (isNaN(right_value)) + return false; + if (right.endsWith("%")) + right_value = right_value * width / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(right); + if (!pair) + return false; + right_value = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + //inset outside of the container + if (right_value > width) + return false; + // bottom + var bottom_value = parseInt(bottom); + if (isNaN(bottom_value)) + return false; + if (bottom.endsWith("%")) + bottom_value = bottom_value * height / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(bottom); + if (!pair) + return false; + bottom_value = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + //inset outside of the container + if (bottom_value > height) + return false; + // left + var left_value = parseInt(left); + if (isNaN(left_value)) + return false; + if (left.endsWith("%")) + left_value = left_value * width / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(left); + if (!pair) + return false; + left_value = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + //inset outside of the container + if (left_value > width) + return false; + if (height - (top_value + bottom_value) <= ClipPathUtil.THRESHOLD || width - (right_value + left_value) <= ClipPathUtil.THRESHOLD) + return true; + return false; + }; + ClipPathUtil.THRESHOLD = 5; // 5px + return ClipPathUtil; +}()); +exports.ClipPathUtil = ClipPathUtil; + + +/***/ }, + +/***/ "./src/v4/util/ColorUtil.ts" +/*!**********************************!*\ + !*** ./src/v4/util/ColorUtil.ts ***! + \**********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ColorObj = exports.ColorUtil = void 0; +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var ColorUtil = /** @class */ (function () { + function ColorUtil() { + } + // Rewrite the color object to account for alpha + ColorUtil.Color = function (cssStyleColor) { + if (!cssStyleColor) + return null; + cssStyleColor = cssStyleColor.toLowerCase(); + if (cssStyleColor === "transparent") + return new ColorObj(255, 255, 255, 0); + if (cssStyleColor in ColorUtil.CSSColorLookup) + cssStyleColor = ColorUtil.CSSColorLookup[cssStyleColor]; + if (cssStyleColor.startsWith("rgb(")) { + var rgbRegex = /\s*rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/; + var m = cssStyleColor.match(rgbRegex); + if (m === null) + return null; + else { + return new ColorObj(m[1], m[2], m[3]); + } + } + else if (cssStyleColor.startsWith("rgba(")) { + var rgbRegex = /\s*rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(.+)\s*\)/; + var m = cssStyleColor.match(rgbRegex); + if (m === null) + return null; + else { + return new ColorObj(m[1], m[2], m[3], m[4]); + } + } + else if (cssStyleColor.charAt(0) != "#") { + return null; + } + else { + if (cssStyleColor.length === 4) { + // The three-digit RGB (#rgb) is converted to six-digit form (#rrggbb) by replicating digits + // (https://www.w3.org/TR/css-color-3/#rgb-color) + cssStyleColor = "#" + cssStyleColor.charAt(1).repeat(2) + + cssStyleColor.charAt(2).repeat(2) + + cssStyleColor.charAt(3).repeat(2); + } + var thisRed = parseInt(cssStyleColor.substring(1, 3), 16); + var thisGreen = parseInt(cssStyleColor.substring(3, 5), 16); + var thisBlue = parseInt(cssStyleColor.substring(5, 7), 16); + return new ColorObj(thisRed, thisGreen, thisBlue); + } + // return null; // Unreachable + }; + ; + ColorUtil.ColorCombo = function (ruleContext) { + try { + var doc = ruleContext.ownerDocument; + if (!doc) { + return null; + } + var win = doc.defaultView; + if (!win) { + return null; + } + var ancestors = []; + var walkNode = ruleContext; + while (walkNode) { + if (walkNode.nodeType === 1) + ancestors.push(walkNode); + walkNode = DOMWalker_1.DOMWalker.parentElement(walkNode); + } + var retVal = { + "hasGradient": false, + "hasBGImage": false, + "textShadow": false, + "fg": null, + "bg": null + }; + // start + var cStyle = win.getComputedStyle(ruleContext); + var compStyleColor = cStyle.color; + if (!compStyleColor) + compStyleColor = "black"; + var fg = ColorUtil.Color(compStyleColor); + var reColor = /transparent|rgba?\([^)]+\)/gi; + var guessGradColor = function (gradList, bgColor, fgColor) { + try { + // If there's only one color, return that + if (typeof gradList.length === "undefined") + return gradList; + var overallWorst = null; + var overallWorstRatio = null; + for (var iGrad = 1; iGrad < gradList.length; ++iGrad) { + var worstColor = gradList[iGrad - 1]; + var worstRatio = fgColor.contrastRatio(gradList[iGrad - 1]); + var step = .1; + var idx = 0; + while (step > .0001) { + while (idx + step <= 1 && worstRatio > fgColor.contrastRatio(gradList[iGrad].mix(gradList[iGrad - 1], idx + step).getOverlayColor(bgColor))) { + worstColor = gradList[iGrad].mix(gradList[iGrad - 1], idx + step).getOverlayColor(bgColor); + worstRatio = fgColor.contrastRatio(worstColor); + idx = idx + step; + } + while (idx - step >= 0 && worstRatio > fgColor.contrastRatio(gradList[iGrad].mix(gradList[iGrad - 1], idx - step).getOverlayColor(bgColor))) { + worstColor = gradList[iGrad].mix(gradList[iGrad - 1], idx - step).getOverlayColor(bgColor); + worstRatio = fgColor.contrastRatio(worstColor); + idx = idx - step; + } + step = step / 10; + } + if (overallWorstRatio === null || overallWorstRatio > worstRatio) { + overallWorstRatio = worstRatio; + overallWorst = worstColor; + } + } + return overallWorst; // return the darkest color + } + catch (e) { + console.log(e); + } + return bgColor; + }; + var priorStackBG = ColorUtil.Color("white"); + var thisStackOpacity = null; + var thisStackAlpha = null; + var thisStackBG = null; + // Ancestors processed from the topmost parent toward the child + while (ancestors.length > 0) { + var procNext = ancestors.pop(); + //var procNext = ancestors.splice(0, 1)[0]; + // cStyle is the computed style of this layer + var cStyle = win.getComputedStyle(procNext); + if (cStyle === null) + continue; + // thisBgColor is the color of this layer or null if the layer is transparent + var thisBgColor = null; + if (cStyle.backgroundColor && cStyle.backgroundColor != "transparent" && cStyle.backgroundColor != "rgba(0, 0, 0, 0)") { + thisBgColor = ColorUtil.Color(cStyle.backgroundColor); + } + // If there is a gradient involved, set thisBgColor to the worst color combination available against the foreground + if (cStyle.backgroundImage && cStyle.backgroundImage.indexOf && cStyle.backgroundImage.indexOf("gradient") != -1) { + var gradColors = cStyle.backgroundImage.match(reColor); + if (gradColors) { + var gradColorComp = []; + for (var i = 0; i < gradColors.length; ++i) { + if (!gradColors[i].length) { + gradColors.splice(i--, 1); + } + else { + var colorComp = ColorUtil.Color(gradColors[i]); + if (colorComp.alpha !== undefined && colorComp.alpha < 1) { + // mix the grdient bg color wit parent bg if alpha < 1 + var compStackBg = thisStackBG || priorStackBG; + colorComp = colorComp.getOverlayColor(compStackBg); + } + gradColorComp.push(colorComp); + } + } + thisBgColor = guessGradColor(gradColorComp, thisStackBG || priorStackBG, fg); + } + } + // Handle non-solid opacity + if (thisStackOpacity === null || (cStyle.opacity && cStyle.opacity.length > 0 && parseFloat(cStyle.opacity) < 1)) { + // New stack, reset + if (thisStackBG != null) { + // Overlay + thisStackBG.alpha = thisStackOpacity * thisStackAlpha; + priorStackBG = thisStackBG.getOverlayColor(priorStackBG); + } + thisStackOpacity = 1.0; + thisStackAlpha = null; + thisStackBG = null; + if (cStyle.opacity && cStyle.opacity.length > 0) { + thisStackOpacity = parseFloat(cStyle.opacity); + } + if (thisBgColor != null) { + thisStackBG = thisBgColor; + thisStackAlpha = thisStackBG.alpha || 1.0; + delete thisStackBG.alpha; + if (thisStackOpacity === 1.0 && thisStackAlpha === 1.0) { + retVal.hasBGImage = false; + retVal.hasGradient = false; + } + } + } + // Handle solid color backgrounds and gradient color backgrounds + else if (thisBgColor != null) { + // If this stack already has a background color, blend it + if (thisStackBG === null) { + thisStackBG = thisBgColor; + thisStackAlpha = thisStackBG.alpha || 1.0; + delete thisStackBG.alpha; + } + else { + thisStackBG = thisBgColor.getOverlayColor(thisStackBG); + //thisStackAlpha = thisBgColor.alpha || 1.0; + thisStackAlpha = thisStackBG.alpha || 1.0; + } + // #526: If thisBgColor had an alpha value, it may not expose through thisStackBG in the above code + // We can't wipe out the gradient info if this layer was transparent + if (thisStackOpacity === 1.0 && thisStackAlpha === 1.0 && (thisStackBG.alpha || 1.0) === 1.0 && (thisBgColor.alpha || 1.0) === 0) // removed by dead control flow +{} + } + if (cStyle.backgroundImage && cStyle.backgroundImage != "none") { + if (cStyle.backgroundImage.indexOf && cStyle.backgroundImage.indexOf("gradient") != -1) { + retVal.hasGradient = true; + } + else { + retVal.hasBGImage = true; + } + } + } + if (thisStackBG != null) { + fg = fg.getOverlayColor(thisStackBG); + delete fg.alpha; + } + fg.alpha = (fg.alpha || 1) * thisStackOpacity; + fg = fg.getOverlayColor(priorStackBG); + if (thisStackBG != null) { + thisStackBG.alpha = thisStackOpacity * thisStackAlpha; + priorStackBG = thisStackBG.getOverlayColor(priorStackBG); + } + retVal.fg = fg; + retVal.bg = priorStackBG; + if (cStyle.textShadow && cStyle.textShadow !== 'none') + retVal.textShadow = true; + return retVal; + } + catch (err) { + // something happened, then... + return null; + } + }; + ; + ColorUtil.CSSColorLookup = { + "aliceblue": "#f0f8ff", + "antiquewhite": "#faebd7", + "aqua": "#00ffff", + "aquamarine": "#7fffd4", + "azure": "#f0ffff", + "beige": "#f5f5dc", + "bisque": "#ffe4c4", + "black": "#000000", + "blanchedalmond": "#ffebcd", + "blue": "#0000ff", + "blueviolet": "#8a2be2", + "brown": "#a52a2a", + "burlywood": "#deb887", + "cadetblue": "#5f9ea0", + "chartreuse": "#7fff00", + "chocolate": "#d2691e", + "coral": "#ff7f50", + "cornflowerblue": "#6495ed", + "cornsilk": "#fff8dc", + "crimson": "#dc143c", + "cyan": "#00ffff", + "darkblue": "#00008b", + "darkcyan": "#008b8b", + "darkgoldenrod": "#b8860b", + "darkgray": "#a9a9a9", + "darkgreen": "#006400", + "darkkhaki": "#bdb76b", + "darkmagenta": "#8b008b", + "darkolivegreen": "#556b2f", + "darkorange": "#ff8c00", + "darkorchid": "#9932cc", + "darkred": "#8b0000", + "darksalmon": "#e9967a", + "darkseagreen": "#8fbc8f", + "darkslateblue": "#483d8b", + "darkslategray": "#2f4f4f", + "darkturquoise": "#00ced1", + "darkviolet": "#9400d3", + "deeppink": "#ff1493", + "deepskyblue": "#00bfff", + "dimgray": "#696969", + "dodgerblue": "#1e90ff", + "firebrick": "#b22222", + "floralwhite": "#fffaf0", + "forestgreen": "#228b22", + "fuchsia": "#ff00ff", + "gainsboro": "#dcdcdc", + "ghostwhite": "#f8f8ff", + "gold": "#ffd700", + "goldenrod": "#daa520", + "gray": "#808080", + "green": "#008000", + "greenyellow": "#adff2f", + "honeydew": "#f0fff0", + "hotpink": "#ff69b4", + "indianred": "#cd5c5c", + "indigo": "#4b0082", + "ivory": "#fffff0", + "khaki": "#f0e68c", + "lavender": "#e6e6fa", + "lavenderblush": "#fff0f5", + "lawngreen": "#7cfc00", + "lemonchiffon": "#fffacd", + "lightblue": "#add8e6", + "lightcoral": "#f08080", + "lightcyan": "#e0ffff", + "lightgoldenrodyellow": "#fafad2", + "lightgrey": "#d3d3d3", + "lightgreen": "#90ee90", + "lightpink": "#ffb6c1", + "lightsalmon": "#ffa07a", + "lightseagreen": "#20b2aa", + "lightskyblue": "#87cefa", + "lightslategray": "#778899", + "lightsteelblue": "#b0c4de", + "lightyellow": "#ffffe0", + "lime": "#00ff00", + "limegreen": "#32cd32", + "linen": "#faf0e6", + "magenta": "#ff00ff", + "maroon": "#800000", + "mediumaquamarine": "#66cdaa", + "mediumblue": "#0000cd", + "mediumorchid": "#ba55d3", + "mediumpurple": "#9370d8", + "mediumseagreen": "#3cb371", + "mediumslateblue": "#7b68ee", + "mediumspringgreen": "#00fa9a", + "mediumturquoise": "#48d1cc", + "mediumvioletred": "#c71585", + "midnightblue": "#191970", + "mintcream": "#f5fffa", + "mistyrose": "#ffe4e1", + "moccasin": "#ffe4b5", + "navajowhite": "#ffdead", + "navy": "#000080", + "oldlace": "#fdf5e6", + "olive": "#808000", + "olivedrab": "#6b8e23", + "orange": "#ffa500", + "orangered": "#ff4500", + "orchid": "#da70d6", + "palegoldenrod": "#eee8aa", + "palegreen": "#98fb98", + "paleturquoise": "#afeeee", + "palevioletred": "#d87093", + "papayawhip": "#ffefd5", + "peachpuff": "#ffdab9", + "peru": "#cd853f", + "pink": "#ffc0cb", + "plum": "#dda0dd", + "powderblue": "#b0e0e6", + "purple": "#800080", + "red": "#ff0000", + "rosybrown": "#bc8f8f", + "royalblue": "#4169e1", + "saddlebrown": "#8b4513", + "salmon": "#fa8072", + "sandybrown": "#f4a460", + "seagreen": "#2e8b57", + "seashell": "#fff5ee", + "sienna": "#a0522d", + "silver": "#c0c0c0", + "skyblue": "#87ceeb", + "slateblue": "#6a5acd", + "slategray": "#708090", + "snow": "#fffafa", + "springgreen": "#00ff7f", + "steelblue": "#4682b4", + "tan": "#d2b48c", + "teal": "#008080", + "thistle": "#d8bfd8", + "tomato": "#ff6347", + "turquoise": "#40e0d0", + "violet": "#ee82ee", + "wheat": "#f5deb3", + "white": "#ffffff", + "whitesmoke": "#f5f5f5", + "yellow": "#ffff00", + "yellowgreen": "#9acd32", + "buttontext": "rgba(0, 0, 0, 0.847)", + "buttonface": "#ffffff", + "graytext": "rgba(0, 0, 0, 0.247)" + }; + return ColorUtil; +}()); +exports.ColorUtil = ColorUtil; +var ColorObj = /** @class */ (function () { + function ColorObj(red, green, blue, alpha) { + function fixComponent(comp) { + if (typeof (comp) != typeof ("")) + return comp; + var compStr = comp; + compStr = compStr.trim(); + if (compStr[compStr.length - 1] != "%") + return parseInt(compStr); + return Math.round(parseFloat(compStr.substring(0, compStr.length - 1)) * 2.55); + } + this.red = fixComponent(red); + this.green = fixComponent(green); + this.blue = fixComponent(blue); + if (typeof (alpha) != "undefined") { + this.alpha = (typeof (alpha) === typeof ("")) ? parseFloat(alpha) : alpha; + } + } + ColorObj.prototype.toHexHelp = function (value) { + var retVal = Math.round(value).toString(16); + if (retVal.length === 1) + return "0" + retVal; + return retVal; + }; + ; + ColorObj.prototype.toHex = function () { + return "#" + this.toHexHelp(this.red) + this.toHexHelp(this.green) + this.toHexHelp(this.blue); + }; + ; + ColorObj.prototype.contrastRatio = function (bgColor) { + var fgColor = this; + if (typeof (this.alpha) != "undefined") + fgColor = this.getOverlayColor(bgColor); + var lum1 = fgColor.relativeLuminance(); + if (!bgColor.relativeLuminance) { + var s = ""; + for (var key in bgColor) { + s += key + "\n"; + } + alert(bgColor); + alert(s); + } + var lum2 = bgColor.relativeLuminance(); + var ratio = (lum1 > lum2) ? (lum1 + .05) / (lum2 + .05) : (lum2 + .05) / (lum1 + .05); + return ratio; + }; + ; + ColorObj.prototype.relativeLuminance = function () { + var R = this.red / 255.0; + var G = this.green / 255.0; + var B = this.blue / 255.0; + R = R <= .04045 ? R / 12.92 : Math.pow((R + .055) / 1.055, 2.4); + G = G <= .04045 ? G / 12.92 : Math.pow((G + .055) / 1.055, 2.4); + B = B <= .04045 ? B / 12.92 : Math.pow((B + .055) / 1.055, 2.4); + return 0.2126 * R + 0.7152 * G + 0.0722 * B; + }; + ; + ColorObj.prototype.mix = function (color2, percThis) { + if (typeof (this.alpha) === "undefined" && typeof (color2.alpha) === "undefined") { + return new ColorObj(percThis * this.red + (1 - percThis) * color2.red, percThis * this.green + (1 - percThis) * color2.green, percThis * this.blue + (1 - percThis) * color2.blue); + } + else { + var alphaThis = this.alpha ? this.alpha : 1; + var alphaOther = color2.alpha ? color2.alpha : 1; + return new ColorObj(percThis * this.red + (1 - percThis) * color2.red, percThis * this.green + (1 - percThis) * color2.green, percThis * this.blue + (1 - percThis) * color2.blue, percThis * alphaThis + (1 - percThis) * alphaOther); + } + }; + ; + ColorObj.prototype.getOverlayColor = function (bgColor) { + if (typeof (this.alpha) === "undefined" || this.alpha >= 1) { + // No mixing required - it's opaque + return this; + } + if (this.alpha < 0) { + // Haac.Error.logError("Invalid alpha value"); + return null; + } + if (typeof (bgColor.alpha) != "undefined" && bgColor.alpha < 1) { + // Haac.Error.logError("Cannot mix with a background alpha"); + return null; + } + var retVal = this.mix(bgColor, this.alpha); + delete retVal.alpha; + return retVal; + }; + ColorObj.fromCSSColor = function (cssStyleColor) { + var thisRed = -1; + var thisGreen = -1; + var thisBlue = -1; + cssStyleColor = cssStyleColor.toLowerCase(); + if (cssStyleColor.startsWith("rgb(")) { + var rgbRegex = /\s*rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/; + var m = cssStyleColor.match(rgbRegex); + if (m === null) + return null; + else { + thisRed = m[1]; + thisGreen = m[2]; + thisBlue = m[3]; + } + } + else if (cssStyleColor.startsWith("rgba(")) { + var rgbRegex = /\s*rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(.+)\s*\)/; + var m = cssStyleColor.match(rgbRegex); + if (m === null) + return null; + else { + thisRed = m[1]; + thisGreen = m[2]; + thisBlue = m[3]; + } + } + else { + if (cssStyleColor.charAt(0) != "#") { + if (cssStyleColor in ColorUtil.CSSColorLookup) + cssStyleColor = ColorUtil.CSSColorLookup[cssStyleColor]; + else + return null; + } + var fromHex = function (val) { + var lookup = { + "a": 10, + "b": 11, + "c": 12, + "d": 13, + "e": 14, + "f": 15 + }; + var retVal = 0; + for (var i = 0; i < val.length; ++i) { + retVal = retVal * 16 + + parseInt(val.charAt(i) in lookup ? lookup[val.charAt(i)] : val.charAt(i)); + } + return retVal; + }; + if (cssStyleColor.length === 4) { + // The three-digit RGB (#rgb) is converted to six-digit form (#rrggbb) by replicating digits + // (https://www.w3.org/TR/css-color-3/#rgb-color) + cssStyleColor = "#" + cssStyleColor.charAt(1).repeat(2) + + cssStyleColor.charAt(2).repeat(2) + + cssStyleColor.charAt(3).repeat(2); + } + thisRed = fromHex(cssStyleColor.substring(1, 3)); + thisGreen = fromHex(cssStyleColor.substring(3, 5)); + thisBlue = fromHex(cssStyleColor.substring(5, 7)); + } + return new ColorObj(thisRed, thisGreen, thisBlue); + }; + return ColorObj; +}()); +exports.ColorObj = ColorObj; + + +/***/ }, + +/***/ "./src/v4/util/CommonUtil.ts" +/*!***********************************!*\ + !*** ./src/v4/util/CommonUtil.ts ***! + \***********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.CommonUtil = void 0; +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var CacheUtil_1 = __webpack_require__(/*! ./CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var AriaUtil_1 = __webpack_require__(/*! ./AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ./AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ./VisUtil */ "./src/v4/util/VisUtil.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var CommonUtil = /** @class */ (function () { + function CommonUtil() { + } + CommonUtil.wordCount = function (str) { + str = str.trim(); + if (str.length === 0) + return 0; + return str.split(/\s+/g).length; + }; + /** + * Note that this only detects if the element itself is in the tab order. + * However, this element may delegate focus to another element via aria-activedescendant. + * Also, focus varies by browser... sticking to things that are focusable on Chrome and Firefox. + */ + CommonUtil.isTabbable = function (element) { + // Using https://allyjs.io/data-tables/focusable.html + // Handle the explicit cases first + if (!VisUtil_1.VisUtil.isNodeVisible(element)) + return false; + if (element.hasAttribute("inert") || DOMUtil_1.DOMUtil.getAncestorWithAttribute(element, "inert", "")) + return false; + if (element.hasAttribute("tabindex")) { + return parseInt(element.getAttribute("tabindex")) >= 0; + } + // Explicit cases handled - now the implicit + var nodeName = element.nodeName.toLowerCase(); + if (nodeName in CommonUtil.tabTagMap) { + var retVal = CommonUtil.tabTagMap[nodeName]; + if (typeof (retVal) === "function") { + retVal = retVal(element); + } + return retVal; + } + else { + if (element.hasAttribute("contenteditable")) + return true; + return false; + } + }; + /** + * Test if the ele node is focusable + */ + CommonUtil.isFocusable = function (ele) { + if (ele === "undefined" || ele === null) { + return false; + } + return CommonUtil.isTabbable(ele); + }; + /** + * Note that this only detects if the element itself is interactive, but not onclick event. + */ + CommonUtil.isClickable = function (element) { + if (!VisUtil_1.VisUtil.isNodeVisible(element)) + return false; + // native focusable element + var nodeName = element.nodeName.toLowerCase(); + if (nodeName in CommonUtil.tabTagMap) { + var retVal = CommonUtil.tabTagMap[nodeName]; + if (typeof (retVal) === "function") { + retVal = retVal(element); + } + return retVal; + } + else { + //custom widget + if (AriaUtil_1.AriaUtil.isWidget(element) && element.hasAttribute("tabindex")) { + return true; + } + } + return false; + }; + /* + * get conflict Aria and Html attributes + * return: a list of Aria and Html attribute pairs that are conflict + */ + CommonUtil.isTableDescendant = function (contextHierarchies) { + if (!contextHierarchies) + return null; + return contextHierarchies["aria"].filter(function (hier) { return ["table", "grid", "treegrid"].includes(hier.role); }); + }; + CommonUtil.tabIndexLEZero = function (elem) { + if (CommonUtil.hasAttribute(elem, "tabindex")) { + if (elem.getAttribute("tabindex").match(/^-?\d+$/)) { + var tabindexValue = parseInt(elem.getAttribute("tabindex")); + return tabindexValue === 0 || tabindexValue === -1; + } + } + return false; + }; + /** + * get number of tabbable children + * @param element + */ + CommonUtil.getTabbableChildren = function (element) { + var count = 0; + // If node has children, look for tab stops in the children + if (element.firstChild || element.nodeName.toUpperCase() === "IFRAME") { + var nw = new DOMWalker_1.DOMWalker(element); + while (nw.nextNode() && nw.node != element) { + if (nw.node.nodeType == 1 && !nw.bEndTag && CommonUtil.isTabbable(nw.node)) { + ++count; + } + } + } + return count; + }; + CommonUtil.normalizeSpacing = function (s) { + if (!s) + return ''; + return s.trim().replace(/\s+/g, ' '); + }; + ; + //TODO: function does not handle equivalents for roles: row, link, header, button + // But it may not have to. Bug reports have been about radio buttons and checkboxes. + CommonUtil.isHtmlEquiv = function (node, htmlEquiv) { + var retVal = false; + if (node) { + var nodeName = node.nodeName.toLowerCase(); + if (nodeName === "input") { + var type = node.getAttribute("type").toLowerCase(); + if (type) { + if (htmlEquiv.indexOf("checkbox") != -1) { + retVal = type === "checkbox"; + } + else if (htmlEquiv.indexOf("radio") != -1) { + retVal = type === "radio"; + } + } + } + } + return retVal; + }; + CommonUtil.nonExistantIDs = function (node, targetids) { + var returnnotfoundids = ''; + if (CommonUtil.normalizeSpacing(targetids).length < 1) + return returnnotfoundids; + var targetArray = targetids.split(" "); + var doc = node.ownerDocument; + for (var i = 0; i < targetArray.length; i++) { + var xp = "//*[@id='" + targetArray[i] + "']"; + var xpathResult = doc.evaluate(xp, node, doc.defaultNSResolver, 0 /* XPathResult.ANY_TYPE */, null); + var r = xpathResult.iterateNext(); + if (!r) + returnnotfoundids += targetArray[i] + ', '; + } + if (CommonUtil.normalizeSpacing(returnnotfoundids).length >= 2) + returnnotfoundids = returnnotfoundids.substring(0, returnnotfoundids.length - 2); + else + returnnotfoundids = ''; + return returnnotfoundids; + }; + CommonUtil.getDocElementsByTag = function (elem, tagName) { + var doc = fragment_1.FragmentUtil.getOwnerFragment(elem); + tagName = tagName.toLowerCase(); + var cache = CacheUtil_1.CacheUtil.getCache(doc, "RPT_DOCELEMSBYTAG", {}); + if (!(tagName in cache)) { + cache[tagName] = doc.querySelectorAll(tagName); + CacheUtil_1.CacheUtil.setCache(doc, "RPT_DOCELEMSBYTAG", cache); + } + return cache[tagName]; + }; + /** + * This function is responsible for get a list of all the child elemnts which match the tag + * name provided. + * + * Note: This is a wrapper function to: AriaUtil.getChildByTagHidden + * + * @parm {element} parentElem - The parent element + * @parm {string} tagName - The tag to search for under the parent element + * @parm {boolean} ignoreHidden - true if hidden elements with the tag should ignored from the list + * false if the hidden elements should be added + * + * @return {List} retVal - list of all the elements which matched the tag under the parent that were provided. + * + * @memberOf AriaUtil + */ + CommonUtil.getChildByTag = function (parentElem, tagName) { + return CommonUtil.getChildByTagHidden(parentElem, tagName, false, false); + }; + /** + * This function is responsible for get a list of all the child elemnts which match the tag + * name provided. + * + * @parm {element} parentElem - The parent element + * @parm {string} tagName - The tag to search for under the parent element + * @parm {boolean} ignoreHidden - true if hidden elements with the tag should ignored from the list + * false if the hidden elements should be added + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * + * @return {List} retVal - list of all the elements which matched the tag under the parent that were provided. + * + * @memberOf AriaUtil + */ + CommonUtil.getChildByTagHidden = function (parentElem, tagName, ignoreHidden, considerHiddenSetting) { + // Variable Decleration + var retVal = []; + var child = parentElem.firstChild; + // Loop over all the child elements of the parent to build a list of all the elements that + // match the tagName provided + while (child != null) { + // Only include the children into the return array if they match with tagname. + if (child.nodeName.toLowerCase() === tagName) { + // In the case that ignorehidden was set to true, then perform a isNodeVisible check + // and in the case the node is not visilble we more to theses then move to the next node. + // Perform a couple of checks to determine if hidden elements should be ignored or not. + // 1. When ignoreHidden is set to true upfront, then perform a isNodeVisible + // 2. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2.1. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + if ((ignoreHidden || (considerHiddenSetting && !CommonUtil.shouldCheckHiddenContent(child))) && !VisUtil_1.VisUtil.isNodeVisible(child)) { + // Move on to the next element + child = child.nextSibling; + continue; + } + // Push the element + retVal.push(child); + } + // Move to the next sibling element + child = child.nextSibling; + } + return retVal; + }; + /** + * This function is responsible for finding a list of elements that match given roles(s). + * This function by defauly will not consider Check Hidden Setting at all. + * This function by defauly will not consider implicit roles. + * Note: This is a wrapper function to: AriaUtil.getElementsByRoleHidden + * + * @parm {document} doc - The document node + * @parm {list or string} roles - List or single role for which to return elements based on. + * + * @return {List} retVal - list of all the elements which matched the role(s) that were provided. + * + * @memberOf AriaUtil + */ + CommonUtil.getElementsByRole = function (doc, roles) { + return CommonUtil.getElementsByRoleHidden(doc, roles, false, false); + }; + /** + * This function is responsible for finding a list of elements that match given roles(s). + * This function aslo finds elements with implicit roles. + * This function will also consider elements that are hidden based on the if the Check + * Hidden Content settings should be considered or not. + * + * @parm {document} doc - The document node + * @parm {list or string} roles - List or single role for which to return elements based on. + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {List} retVal - list of all the elements which matched the role(s) that were provided. + * + * @memberOf AriaUtil + */ + CommonUtil.getElementsByRoleHidden = function (doc, roles, considerHiddenSetting, considerImplicitRoles) { + // In the case that the role to element assoication is already made, and available in the global hasAttribute + // we can just use that one instead of building a new one. + var roleToElems = null; + if (considerImplicitRoles) { + roleToElems = CacheUtil_1.CacheUtil.getCache(doc, "AriaUtil_GETELEMENTSBY_ROLE_IMPLICIT", null); + } + else { + roleToElems = CacheUtil_1.CacheUtil.getCache(doc, "AriaUtil_GETELEMENTSBY_ROLE", null); + } + // Build the new role to element, this is where we loop through all the elements and extract all the + // elements bsaed on roles. + if (roleToElems === null) { + // Re-initialize the roleToElems hash + roleToElems = {}; + // Get the body of the doc + var root = doc.body; + // Keep looping until we are at the very parent node of the entire page, so that we can loop through + // all the nodes. + while (DOMWalker_1.DOMWalker.parentNode(root) !== null) { + // Get the parentNode + root = DOMWalker_1.DOMWalker.parentNode(root); + } + // Build a nodewalter based of the root node, this node walter will be use loop over all the nodes + // and build the roles to Element coralation + var nw = new DOMWalker_1.DOMWalker(root); + // Loop over the entire doc/list of nodes to build the role to element map + // Note: This will build an roleToElems hash which is in the following format. + // roleToElems = { + // document: [{div},{abbr},{var}], + // main: [{div}], + // navigation: [{div}] + // } + while (nw.nextNode()) { + if (!nw.elem()) + continue; + // Only check the elements which have the role attribute assiciated to them + if (!nw.bEndTag) { + var wRoles = []; + //check if the node has role attributes + if (nw.elem() && nw.elem().hasAttribute("role")) { + // Extract all the roles that are assigned to this element, can have multiple roles on one + // element split by space, so we need to extract all of them into an array. + wRoles = nw.elem().getAttribute("role").split(" "); + } + if (nw.elem() && wRoles.length === 0 && considerImplicitRoles) { + //check if there are any implicit roles for this element. + var implicitRole = AriaUtil_1.AriaUtil.getImplicitRole(nw.node); + if (implicitRole !== null && implicitRole.length > 0) + wRoles = implicitRole; + } + if (wRoles.length === 0) { + continue; + } + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (considerHiddenSetting && CommonUtil.shouldNodeBeSkippedHidden(nw.node)) { + continue; + } + // Loop through all the roles and assigned this node to all thes roles + for (var i = 0; i < wRoles.length; ++i) { + // In the case that the role key is not already in the roleToElems hash, construct the + // add the key and assign empty array. + if (!(wRoles[i] in roleToElems)) { + roleToElems[wRoles[i]] = []; + } + // Add the node to the array for the role + roleToElems[wRoles[i]].push(nw.node); + } + } + } + // Set the roleToElems hash map as a global variable + if (considerImplicitRoles) { + CacheUtil_1.CacheUtil.setCache(doc, "AriaUtil_GETELEMENTSBY_ROLE_IMPLICIT", roleToElems); + } + else { + CacheUtil_1.CacheUtil.setCache(doc, "AriaUtil_GETELEMENTSBY_ROLE", roleToElems); + } + } + // Initilize the return value + var retVal = []; + // Handle the cases where the provided role is a string and not an array, + // for this case we take the string and put it into an array + if (typeof (roles) === "string") { + var role = roles; + roles = []; + roles.push(role); + } + // Loop through the roles that were provided and find the list of elements for this roles + // and add them to the return value. + if (roles.length) { + // loop over all the roles + for (var i = 0; i < roles.length; ++i) { + // Extract the role from the array + var nextRole = roles[i]; + // Fetch the list of all the elements for this role + var copyRoles = roleToElems[nextRole]; + // If there are elements to copy to another array, then perform the copy + if (copyRoles) { + // Loop over all the elements which are to be copied + for (var j = 0; j < copyRoles.length; ++j) { + // Add this element to the return val + retVal.push(copyRoles[j]); + } + } + } + } + return retVal; + }; + /** + * a target is en element that accept a pointer action (click or touch) + * + */ + CommonUtil.isTarget = function (element) { + if (!element || element.nodeType !== 1 + || ["html", "body"].includes(element.nodeName.toLowerCase()) + || CommonUtil.getAncestor(element, ["svg", "pre", "code", "script", "meta", 'head']) !== null + || !VisUtil_1.VisUtil.isNodeVisible(element) || VisUtil_1.VisUtil.isNodeVisuallyHidden(element) + || CommonUtil.isNodeDisabled(element) || VisUtil_1.VisUtil.isElementOffscreen(element)) + return false; + if (CommonUtil.isClickable(element)) + return true; + var role = AriaUtil_1.AriaUtil.getResolvedRole(element); + if (!role) + return false; + var target_roles = ["listitem", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "switch", "treeitem"]; + if (target_roles.includes(role)) { + // find the proper parent elements + var parent_1 = element.parentElement; + if (parent_1) { + var parent_role = AriaUtil_1.AriaUtil.getResolvedRole(parent_1); + // datalist, fieldset, optgroup, etc. may be just used for grouping purpose, so go up to the parent + if (parent_role === 'group') + parent_1 = parent_1.parentElement; + } + if (parent_1 && CommonUtil.isTarget(parent_1)) + return true; + } + return false; + }; + CommonUtil.getFileExt = function (url) { + var m = url.match(/\.(([^;?#\.]|^$)+)([;?#]|$)/); + if (m != null && m.length >= 2) { + return "." + m[1]; + } + return ""; + }; + CommonUtil.getFileAnchor = function (url) { + var m = url.match(/#(([^;?\.]|^$)+)([;?]|$)/); + if (m != null && m.length >= 2) { + return m[1]; + } + return ""; + }; + CommonUtil.checkObjEmbed = function (node, extTest, mimeTest) { + var nodeName = node.nodeName.toLowerCase(); + if (nodeName != "object" && nodeName != "embed" && + nodeName != "a" && nodeName != "area") + return false; + var retVal = false; + // Check mime type + if (!retVal && node.hasAttribute("type")) { + var mime = node.getAttribute("type").toLowerCase(); + retVal = mimeTest(mime); + } + if (!retVal && node.hasAttribute("codetype")) { + var mime = node.getAttribute("codetype"); + retVal = mimeTest(mime); + } + // Check the filename + if (!retVal) { + var filename = ""; + if (nodeName === "embed") { + filename = node.getAttribute("src"); + } + else if (nodeName === "a" || nodeName === "area") { + filename = node.getAttribute("href"); + } + else if (node.hasAttribute("data")) { + filename = node.getAttribute("data"); + } + if (filename === null) + filename = ""; + var ext = CommonUtil.getFileExt(filename); + retVal = extTest(ext); + } + // Check for filenames in the params + if (!retVal && nodeName === "object") { + // In the case that Check Hidden Option is set then comply with that setting + var params = CommonUtil.getChildByTagHidden(node, "param", false, true); + for (var i = 0; !retVal && params != null && i < params.length; ++i) { + retVal = params[i].hasAttribute("value") && + extTest(CommonUtil.getFileExt(params[i].getAttribute("value"))); + } + } + return retVal; + }; + CommonUtil.isAudioObjEmbedLink = function (node) { + return CommonUtil.checkObjEmbed(node, CommonUtil.isAudioExt, function (mime) { + return mime.startsWith("audio"); + }); + }; + CommonUtil.isAudioExt = function (ext) { + var audio_extensions = [".aif", ".aifc", ".aiff", ".air", ".asf", ".au", ".cda", + ".dsm", ".dss", ".dwd", ".iff", ".kar", ".m1a", ".med", + ".mp2", ".mp3", ".mpa", ".pcm", ".ra", ".ram", ".rm", + ".sam", ".sf", ".sf2", ".smp", ".snd", ".svx", ".ul", + ".voc", ".wav", ".wma", ".wve" + ]; + return CommonUtil.valInArray(ext.toLowerCase(), audio_extensions); + }; + CommonUtil.isVideoObjEmbedLink = function (node) { + return CommonUtil.checkObjEmbed(node, CommonUtil.isVideoExt, function (mime) { + return mime.startsWith("video") || + mime.startsWith("application/x-shockwave-flash"); + }); + }; + CommonUtil.isVideoExt = function (ext) { + var video_extensions = [".asf", ".avi", ".divx", ".dv", ".m1v", ".m2p", ".m2v", ".moov", + ".mov", ".mp4", ".mpeg", ".mpg", ".mpv", ".ogm", ".omf", ".qt", + ".rm", ".rv", ".smi", ".smil", ".swf", ".vob", ".wmv", ".rmvb", + ".mvb" + ]; + return CommonUtil.valInArray(ext.toLowerCase(), video_extensions); + }; + CommonUtil.isImageObjEmbedLink = function (node) { + return CommonUtil.checkObjEmbed(node, CommonUtil.isImgExt, function (mime) { + return mime.startsWith("image"); + }); + }; + CommonUtil.isImgExt = function (ext) { + return CommonUtil.valInArray(ext.toLowerCase(), CommonUtil.image_extensions); + }; + CommonUtil.isHtmlExt = function (ext) { + var html_extensions = [".asp", ".aspx", ".cfm", ".cfml", ".cgi", ".htm", ".html", ".shtm", + ".shtml", ".php", ".pl", ".py", ".shtm", ".shtml", ".xhtml" + ]; + return CommonUtil.valInArray(ext.toLowerCase(), html_extensions); + }; + CommonUtil.hasTriggered = function (doc, id) { + return CacheUtil_1.CacheUtil.getCache(doc, id, false); + }; + CommonUtil.triggerOnce = function (doc, id, passed) { + if (passed) + return true; + var triggered = CacheUtil_1.CacheUtil.getCache(doc, id, false); + CacheUtil_1.CacheUtil.setCache(doc, id, true); + return triggered; + }; + /* determine if the given value exists in the given array */ + CommonUtil.valInArray = function (value, arr) { + for (var idx in arr) { + if (arr[idx] === value) + return true; + } + return false; + }; + /** + * return the ancestor of the given element + * @param tagNames string, array, or dictionary containing the tags to search for + */ + CommonUtil.getAncestor = function (element, tagNames) { + var walkNode = element; + while (walkNode !== null) { + var thisTag = walkNode.nodeName.toLowerCase(); + if (typeof (tagNames) === "string") { + if (thisTag === tagNames.toLowerCase()) { + break; + } + } + else if (tagNames.length) { + for (var idx in tagNames) { + if (tagNames[idx] === thisTag) + return walkNode; + } + } + else if (thisTag in tagNames) { + break; + } + walkNode = DOMWalker_1.DOMWalker.parentNode(walkNode); + } + return walkNode; + }; + // return true if element1 and element2 are siblings + CommonUtil.isSibling = function (element1, element2) { + if (element1 && element2) { + var node = null; + if (DOMWalker_1.DOMWalker.parentNode(element1) && DOMWalker_1.DOMWalker.parentNode(element1).firstChild) { + node = DOMWalker_1.DOMWalker.parentNode(element1).firstChild; + } + while (node) { + if (node === element2) + return true; + node = node.nextSibling; + } + } + return false; + }; + CommonUtil.isDescendant = function (parent, child) { + var node = DOMWalker_1.DOMWalker.parentNode(child); + while (node != null) { + if (node === parent) { + return true; + } + node = DOMWalker_1.DOMWalker.parentNode(node); + } + return false; + }; + //check if the first form control child is disabled + CommonUtil.isDisabledByFirstChildFormElement = function (element) { + var formElements = ["input", "textarea", "select", "keygen", "progress", "meter", "output"]; + if (element.firstChild != null) { + var nw = new DOMWalker_1.DOMWalker(element); + while (nw.nextNode()) { + if (formElements.includes(nw.node.nodeName.toLowerCase())) { + if (CommonUtil.isNodeDisabled(nw.node)) + return true; + return false; + } + } + } + return false; + }; + CommonUtil.isDisabledByReferringElement = function (element) { + var id = element.getAttribute("id"); + var doc = element.ownerDocument; + var root = doc.body; + while (DOMWalker_1.DOMWalker.parentNode(root) !== null) { + // Get the parentNode + root = DOMWalker_1.DOMWalker.parentNode(root); + } + var nw = new DOMWalker_1.DOMWalker(root); + while (nw.nextNode()) { + // check the element whose 'aria-describedby' equals to the id + if (nw.node && nw.node.nodeType === 1 && nw.elem()) { + var AriaDescribedbyIDArray = (nw.elem().getAttribute("aria-describedby") || "").split(" "); + if (AriaDescribedbyIDArray.includes(id) && CommonUtil.isNodeDisabled(nw.node)) { + return true; + } + } + } + }; + /** get element containing label for the given element + * @deprecated Deprecated because the function name is misleading. Use getLabelForElement(element) instead + */ + CommonUtil.getInputLabel = function (element) { + return CommonUtil.getLabelForElement(element); + }; + /** + * This function is responsible for getting the element containing the label for the given element. + * + * Note: This is a wrapper function to: AriaUtil.getLabelForElementHidden + * + * @parm {element} element - The element for which to get the label element for. + * + * @return {element} element - return the element for the label, otherwise null + * + * @memberOf AriaUtil + */ + CommonUtil.getLabelForElement = function (element) { + return CommonUtil.getLabelForElementHidden(element, false); + }; + /** + * This function is responsible for getting the element containing the label for the given element. + * + * This function will return null if the containing lable element is hidden, when the ignoreHidden option + * is set to true. + * + * @parm {element} element - The element for which to get the label element for. + * @parm {boolean} ignoreHidden - true if hidden elements with label should be ignored from the list + * false if the hidden elements should be added + * + * @return {element} element - return the element for the label, otherwise null + * + * @memberOf AriaUtil + */ + CommonUtil.getLabelForElementHidden = function (element, ignoreHidden) { + // Check if the global AriaUtil_LABELS hash is available, as this will contain the label nodes based on + // for attribute. + //if (!getCache(element.ownerDocument,"AriaUtil_LABELS", null)) { + var root = element.getRootNode(); + if (!CacheUtil_1.CacheUtil.getCache((root.nodeType === 11) ? root : root, "AriaUtil_LABELS", null)) { + // Variable Decleration + var idToLabel = {}; + // Get all the label elements in the entire doc + var labelNodes = CommonUtil.getDocElementsByTag(element, "label"); + // Loop over all the label nodes, in the case the label node has a for attribute, + // extract that attribute and add this node to the hash if it is visible. + for (var i = 0; i < labelNodes.length; ++i) { + if (labelNodes[i].hasAttribute("for")) { + // If ignore hidden is specified and the node is not visible we do not add it to the + // labelNodes hash. + if (ignoreHidden && !VisUtil_1.VisUtil.isNodeVisible(labelNodes[i])) { + continue; + } + idToLabel[labelNodes[i].getAttribute("for")] = labelNodes[i]; + } + } + // Add the built hash to the ownerDocument (document), to be used later to fast retrival + //setCache(element.ownerDocument, "AriaUtil_LABELS", idToLabel); + CacheUtil_1.CacheUtil.setCache((root.nodeType === 11) ? root : root, "AriaUtil_LABELS", idToLabel); + } + // If this element has an id attribute, get the corosponding label element + if (element.hasAttribute("id")) { + // Fetch the id attribute + var ctrlId = element.getAttribute("id"); + // Return the corosponding label element. + // Note: in the case that the the id is not found in the hash that means, it does not exists or is hidden + if (ctrlId.trim().length > 0) { + //return getCache(element.getRootNode().ownerDocument,"AriaUtil_LABELS",{})[ctrlId]; + return CacheUtil_1.CacheUtil.getCache((root.nodeType === 11) ? root : root, "AriaUtil_LABELS", {})[ctrlId]; + } + } + return null; + }; + /* Return specified element attribute if present else return null */ + CommonUtil.getElementAttribute = function (element, attr) { + //return (element && element.hasAttribute && element.hasAttribute(attr)) ? element.getAttribute(attr) : null; + if (!attr || !element || !element.hasAttribute || !element.hasAttribute(attr)) + return null; + var atrValue = element.getAttribute(attr); + if (!ARIADefinitions_1.ARIADefinitions.referenceProperties.includes(attr)) + return atrValue; + //attr is a reference to other elements(s) + var values = atrValue.split(/ +/g); + //ignore if none of the referred element(s) exist or all point to the element itself + var exist = false; + for (var id = 0; values < values.length; ++id) { + var referred = document.getElementById(values[id]); + if (referred && !DOMUtil_1.DOMUtil.sameNode(referred, element)) { + exist = true; + break; + } + } + return exist ? atrValue : null; + }; + // Return true if element has valid implicit label + CommonUtil.hasImplicitLabel = function (element) { + var parentNode = CommonUtil.getAncestor(element, "label"); + // Test a) if the parent is a label which is the implicit label + // b) if the form element is the first child of the label + // c) if the form element requires an implicit or explicit label : "input", "textarea", "select", "keygen", "progress", "meter", "output" + // d) form elements which may have a label: button + // form elements that do not require implicit or explicit label element are: + // "optgroup", "option", "datalist"(added later). These were handled differently in the main rule, might need to refactor the code later + if (parentNode && parentNode.tagName.toLowerCase() === "label" && CommonUtil.isFirstFormElement(parentNode, element)) { + var parentClone = parentNode.cloneNode(true); + // exclude all form elements from the label since they might also have inner content + parentClone = CommonUtil.removeAllFormElementsFromLabel(parentClone); + return CommonUtil.hasInnerContentHidden(parentClone); + } + else { + return false; + } + }; + // Return the implicit label of the given form field + CommonUtil.getImplicitLabel = function (element) { + var parentNode = CommonUtil.getAncestor(element, "label"); + // Test a) if the parent is a label which is the implicit label + // b) if the form element is the first child of the label + // c) if the form element requires an implicit or explicit label : "input", "textarea", "select", "keygen", "progress", "meter", "output" + // d) form elements which may have a label: button + // form elements that do not require implicit or explicit label element are: + // "optgroup", "option", "datalist"(added later). These were handled differently in the main rule, might need to refactor the code later + if (parentNode && parentNode.tagName.toLowerCase() === "label" && CommonUtil.isFirstFormElement(parentNode, element)) { + var parentClone = parentNode.cloneNode(true); + // exclude all form elements from the label since they might also have inner content + parentClone = CommonUtil.removeAllFormElementsFromLabel(parentClone); + var label = CommonUtil.getInnerText(parentClone); + return label && label.trim() !== '' ? label.trim() : null; + } + else + return null; + }; + /** + * This function is responsible for getting the label for a form field element. + * + * + * @parm {element} element - The element from which to get the label. + * + * @return {string} text - return the label text or null + * + * @memberOf AriaUtil + */ + CommonUtil.getFormFieldLabel = function (elem) { + // get the label from the attribute "for" of the label element + // Get only the non-hidden labels for element + var value = ""; + var label = null; + var labelElem = CommonUtil.getLabelForElementHidden(elem, true); + if (labelElem) { + // value directly from element text + label = labelElem.innerText; // ignore hidden text + } + else { + /** if it's not label with for attribute, then find implicit label + * cases for explict label: + * <label for='my'></label><input id='my'/> + * <label for='my'><input id='my'/></label> + * cases for implicit label: + * <label><input /></label> + */ + labelElem = CommonUtil.getAncestor(elem, "label"); + if (labelElem && labelElem.tagName.toLowerCase() === "label" && CommonUtil.isFirstFormElement(labelElem, elem)) { + var parentClone = labelElem.cloneNode(true); + // exclude all the text from the first form element since they might also + // have inner content that is part of innerText + parentClone = CommonUtil.removeAllFormElementsFromLabel(parentClone); + label = CommonUtil.getInnerText(parentClone); + } + else + return null; + } + if (label && label.trim() !== "") + value += label.trim(); + // value from child element attribute + label = CommonUtil.getLabelTextFromAttribute(labelElem, true); + if (label && label.trim() !== "") + value += label.trim(); + // wired case: get aria label from label element itself just in case (though name prohibited from aria in html) + label = AriaUtil_1.AriaUtil.getAriaLabel(labelElem); + if (label && label.trim() !== "") + value += label.trim(); + return value.trim(); + }; + /** + * calculate label from embedded control: https://w3c.github.io/accname/ + * @param {element} labelElem label element + * @param {boolean} ignoreHidden - true if hidden elements with label should be ignored from the list + * false if the hidden elements should be added + * @returns label text or '' + * + * note the assumption is the labelElem refers either to a labelled element by 'for' attribute + * or its first form field is labbelled element + */ + CommonUtil.getLabelTextFromAttribute = function (labelElem, ignoreHidden) { + // label either points to a labelable element by its for attribute or the first element child + // get the labelled elment if it's an implicit label + var labeledElem = null; + for (var i = 0; i < labelElem.children.length; i++) { + var child = labelElem.children.item(i); + if (CommonUtil.form_labelable_elements.includes(child.nodeName.toLowerCase())) { + labeledElem = child; + break; + } + } + var nw = new DOMWalker_1.DOMWalker(labelElem); + var text = ''; + while (nw.nextNode() && nw.node !== labelElem) { + // only check element children + if (nw.node && nw.node.nodeType === 1 && nw.elem()) { + var elem = nw.elem(); + // ignore if it's hidden, or labelled element, or first form element if not labeled by for attribute + if ((ignoreHidden && (VisUtil_1.VisUtil.isNodeHiddenFromAT(elem) || VisUtil_1.VisUtil.isNodePresentational(elem))) + || (labeledElem && labeledElem.contains(elem))) + continue; + var role = AriaUtil_1.AriaUtil.getResolvedRole(elem); + // textbox etc. return its text value + if (role === "textbox") { + var name_1 = elem.getAttribute("value"); + if (name_1 && name_1.trim().length > 0) + text += ' ' + name_1.trim(); + } + else if (role === "combobox" || role === "listbox") { + // for combobox or listbox roles, return the text alternative of the chosen option. + var selectedId = elem.getAttribute("aria-activedescendant") || elem.getAttribute("aria-selected") || elem.getAttribute("aria-checked"); + if (selectedId) { + var selectedOption = elem.ownerDocument.getElementById(selectedId); + if (selectedOption && !DOMUtil_1.DOMUtil.sameNode(elem, selectedOption)) { + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(selectedOption); + if (pair && pair.name) + text += ' ' + pair.name.trim(); + } + } + } + else if (["progressbar", "scrollbar", "slider", "spinbutton", "meter"].includes(role)) { + // for range role type, including "progressbar", "scrollbar", "slider", "spinbutton" roles + // If the aria-valuetext property is present, return its value + var value_1 = elem.getAttribute("aria-valuetext"); + if (value_1 && value_1.trim().length > 0) + text += ' ' + value_1.trim(); + // Otherwise, if the aria-valuenow property is present, return its value, + value_1 = elem.getAttribute("aria-valuenow"); + if (value_1 && value_1.trim().length > 0) + text += ' ' + value_1.trim(); + // finally use native value attribute + value_1 = elem.getAttribute("value"); + if (value_1 && value_1.trim().length > 0) + text += ' ' + value_1.trim(); + } + // get aria label from the element + var value = AriaUtil_1.AriaUtil.getAriaLabel(elem); + if (value && value.trim() !== "") + text += ' ' + value.trim(); + } + } + return text.trim(); + }; + CommonUtil.isFirstFormElement = function (parentNode, element) { + //let formElementsRequiringLabel = ["input", "textarea", "select", "keygen", "progress", "meter", "output"]; + if (parentNode.firstChild != null) { + var nw = new DOMWalker_1.DOMWalker(parentNode); + while (nw.nextNode()) { + if (CommonUtil.form_labelable_elements.indexOf(nw.node.nodeName.toLowerCase()) !== -1) { + return nw.node === element; + } + } + } + return false; + }; + // check if the element is a shadow host or descendant of a shadow host, but not a descedant of the shadow root of the host (to be assigned to shadow slot or ignored) + CommonUtil.isShadowHostElement = function (element) { + if (CommonUtil.isShadowElement(element)) + return false; + var walkNode = element; + while (walkNode) { + if (walkNode.shadowRoot) + return true; + walkNode = DOMWalker_1.DOMWalker.parentElement(walkNode); + } + return false; + }; + //check if an element is in a shadow tree + CommonUtil.isShadowElement = function (element) { + var root = element.getRootNode(); + if (root.toString() === "[object ShadowRoot]") + return true; + return false; + }; + CommonUtil.removeAllFormElementsFromLabel = function (element) { + var formElements = ["input", "textarea", "select", "button", "datalist", "optgroup", "option", "keygen", "output", "progress", "meter"]; + var childNodes = element.childNodes; + for (var i = 0; i < childNodes.length; i++) { + if (formElements.indexOf(childNodes[i].nodeName.toLowerCase()) > -1) { + element.removeChild(childNodes[i]); + } + } + return element; + }; + /** + * @param element + * @param idStr + * @returns true if any one (if multiple Ids) id points to itself + */ + CommonUtil.isIdReferToSelf = function (element, idStr) { + if (!idStr || idStr.trim() === '') + return false; + var ids = idStr.trim().split(" "); + for (var j = 0, length_1 = ids.length; j < length_1; ++j) { + var referredNode = fragment_1.FragmentUtil.getById(element, ids[j]); + if (referredNode && DOMUtil_1.DOMUtil.sameNode(referredNode, element)) + return true; + } + return false; + }; + /* Determine the node depth of the given element */ + CommonUtil.nodeDepth = function (element) { + var depth = 0; + var walkNode = element; + while (walkNode !== null) { + walkNode = DOMWalker_1.DOMWalker.parentNode(walkNode); + depth = depth + 1; + } + return depth; + }; + /* compare node order of the 2 given nodes */ + /* returns + * 0 if the nodes are equal + * 1 if node b is before node a + * -1 if node a is before node b + * 2 if node a is nested in node b + * -2 if node b is nested in node a + * null if either node is null or their parent nodes are not equal + */ + CommonUtil.compareNodeOrder = function (nodeA, nodeB) { + if (nodeA === nodeB) + return 0; + var aDepth = CommonUtil.nodeDepth(nodeA); + var bDepth = CommonUtil.nodeDepth(nodeB); + if (bDepth > aDepth) { + for (var i = 0; i < bDepth - aDepth; ++i) + nodeB = DOMWalker_1.DOMWalker.parentNode(nodeB); + if (nodeA === nodeB) // Node B nested in Node A + return -2; + } + else if (aDepth > bDepth) { + for (var i = 0; i < aDepth - bDepth; ++i) + nodeA = DOMWalker_1.DOMWalker.parentNode(nodeA); + if (nodeA === nodeB) // Node A nested in Node B + return 2; + } + while (nodeA != null && nodeB != null && DOMWalker_1.DOMWalker.parentNode(nodeA) != DOMWalker_1.DOMWalker.parentNode(nodeB)) { + nodeA = DOMWalker_1.DOMWalker.parentNode(nodeA); + nodeB = DOMWalker_1.DOMWalker.parentNode(nodeB); + } + if (nodeA === null || nodeB === null || DOMWalker_1.DOMWalker.parentNode(nodeA) != DOMWalker_1.DOMWalker.parentNode(nodeB)) + return null; + while (nodeB != null && nodeB != nodeA) + nodeB = nodeB.previousSibling; + if (nodeB === null) // nodeB before nodeA + return 1; + else + return -1; + }; + /** + * Determine if the given attribute of the given element is not empty + * @memberOf AriaUtil + */ + CommonUtil.attributeNonEmpty = function (element, attrStr) { + return element.hasAttribute(attrStr) && element.getAttribute(attrStr).trim().length > 0; + }; + /* Return a pointer to the given frame, null if not found */ + CommonUtil.getFrameByName = function (ruleContext, frameName) { + var window = ruleContext.ownerDocument.defaultView; + var frameList = [window]; + var idx = 0; + while (idx < frameList.length) { + try { + if (frameList[idx].name === frameName) + return frameList[idx]; + for (var i = 0; i < frameList[idx].frames.length; ++i) { + try { + // Ensure it's a real frame and avoid recursion + if (frameList[idx].frames[i] && !frameList.includes(frameList[idx].frames[i])) { + frameList.push(frameList[idx].frames[i]); + } + } + catch (e) { } + } + } + catch (e) { } + ++idx; + } + return null; + }; + CommonUtil.defaultNSResolver = function (prefix) { + var uri; + switch (prefix) { + case 'html': + uri = 'http://www.w3.org/1999/xhtml'; + case 'x2': + uri = 'http://www.w3.org/TR/xhtml2'; + case 'x': + uri = 'http://www.w3.org/1999/xhtml'; + case 'xhtml': + uri = 'http://www.w3.org/1999/xhtml'; + default: + uri = null; + } + return uri; + }; + //checking if only the inner text is empty or not + CommonUtil.isInnerTextOnlyEmpty = function (element) { + // Get the innerText of the element + var text = element.innerText; + if ((text === undefined || text === null || text.trim().length === 0) && element.nodeName.toLowerCase() !== 'slot' && element.textContent !== undefined) { + //ignore slot because its text will be filled by the corresponding content in the light DOM + // innerText is sometimes 'undefined' in headless mode, or null if the element is invisible or not erxpanded + // so we try textContent as a workaround + text = element.textContent; + } + var retVal = !(text !== null && text.trim().length > 0); + if (element.nodeType === 1 && element.nodeName.toLowerCase() === "slot") { + //TODO: need to conside its own content, a slot may have its own content or assigned content + for (var _i = 0, _a = element.assignedNodes(); _i < _a.length; _i++) { + var slotElem = _a[_i]; + retVal = retVal && CommonUtil.isInnerTextEmpty(slotElem); + } + } + // Trim the inner text and verify that it is not empty. + return retVal; + }; + /* Return the inner text of the given element */ + CommonUtil.getInnerText = function (element) { + var retVal = element.innerText; + if (retVal === undefined || retVal === null || retVal.trim() === "") + retVal = element.textContent; + return retVal; + }; + /** + * return onscreen innerText only. + * This function should return the same result as innerText if no offscreen content exists + * + * @parm {element} node The node which should be checked it has inner text or not. + * @return {null | string} null if element has empty inner text, text otherwise + * + * @memberOf AriaUtil + */ + CommonUtil.getOnScreenInnerText = function (element) { + if (!element) + return null; + if (element.nodeType === 3) + return element.nodeValue(); + var text = ""; + var nw = new DOMWalker_1.DOMWalker(element); + // Loop over all the childrens of the element to get the text + while (nw.nextNode() && nw.node !== element && nw.node !== element.parentNode) { + if (nw.bEndTag) + continue; + if (nw.node.nodeType === 1 && (VisUtil_1.VisUtil.hiddenByDefaultElements.includes(nw.node.nodeName.toLowerCase()) || !VisUtil_1.VisUtil.isNodeVisible(nw.node) || VisUtil_1.VisUtil.isElementOffscreen(nw.node))) { + /** special case for svg <title> element: + * text in a <title> element is not rendered as part of the graphic, but browsers usually display it as a tooltip + * note some svg elements, such as title, desc, have a bounds {"left":0,"top":0,"height":0,"width":0} + */ + if (nw.node.nodeName.toLowerCase() === 'title' && CommonUtil.getAncestor(nw.node, "svg")) + continue; + if (nw.node.nextSibling) { + if (nw.node.nextSibling.nodeType === 3 && nw.node.nextSibling.nodeValue && nw.node.nextSibling.nodeValue.trim() !== '') + text += ' ' + nw.node.nextSibling.nodeValue.trim(); + nw.node = nw.node.nextSibling; + continue; + } + else + break; + } + if (nw.node.nodeType === 3 && nw.node.nodeValue && nw.node.nodeValue.trim() !== '') { + text += ' ' + nw.node.nodeValue.trim(); + } + } + return text.trim(); + }; + /** Return the text content of the given node + * this is different than innerText or textContent that return text content of a node and its descendants + */ + CommonUtil.getNodeText = function (element) { + if (!element) + return ""; + var text = ""; + var childNodes = element.childNodes; + for (var i = 0; i < childNodes.length; ++i) { + if (childNodes[i].nodeType == 3) { + text += childNodes[i].nodeValue; + } + } + return text; + }; + /** + * This function is responsible for checking if elements inner text is empty or not. + * + * @parm {element} node The node which should be checked it has inner text or not. + * @return {bool} true if element has empty inner text, false otherwise + * + * @memberOf AriaUtil + */ + CommonUtil.isInnerTextEmpty = function (element) { + // Get the innerText of the element + var text = CommonUtil.getInnerText(element); + // Trim the inner text and verify that it is not empty. + return !(text != null && text.trim().length > 0); + }; + CommonUtil.hasInnerContent = function (element) { + var text = CommonUtil.getInnerText(element); + var hasContent = (text !== null && text.trim().length > 0); + if (element.firstChild !== null) { + var nw = new DOMWalker_1.DOMWalker(element); + while (!hasContent && nw.nextNode()) { + hasContent = (nw.node.nodeName.toLowerCase() === "img" && + CommonUtil.attributeNonEmpty(nw.node, "alt")); + } + } + return hasContent; + }; + /** + * This function is responsible for determine if an element has inner content. + * This function also considers cases where inner text is hidden, which now will + * be classified as does not have hidden content. + * + * @parm {element} node The node which should be checked it has inner text or not. + * @return {bool} true if element has empty inner text, false otherwise + * + * @memberOf AriaUtil + */ + CommonUtil.hasInnerContentHidden = function (element) { + return CommonUtil.hasInnerContentHiddenHyperLink(element, false); + }; + CommonUtil.svgHasName = function (element) { + return CommonUtil.attributeNonEmpty(element, "aria-label") + || CommonUtil.attributeNonEmpty(element, "aria-labelledby") + || !!element.querySelector(":scope > title"); + }; + CommonUtil.hasInnerContentHiddenHyperLink = function (element, hyperlink_flag) { + if (!element) + return false; + // Variable Decleration + var childElement = element.firstElementChild; + var hasContent = false; + // In the case that the childElement is not null then we need to check each of the elements + // to make sure that the elements are not all hidden. + if (childElement != null) { + // Get the nodewalter of the element node, so that we can loop over it and verify + // that the elements under the element are not completly hidden. + var nw = new DOMWalker_1.DOMWalker(element); + // Loop over all the nodes until there are no more nodes or we have determine that there is content under + // this parent element. + while (!hasContent && nw.nextNode() && nw.node != element) { + // Get the next node + var node = nw.node; + // In the case an img element is present with alt then we can mark this as pass + // otherwise keep checking all the other elements. Make sure that this image element is not hidden. + hasContent = (node.nodeName.toLowerCase() === "img" + && (CommonUtil.attributeNonEmpty(node, "alt") || CommonUtil.attributeNonEmpty(node, "title")) + && !VisUtil_1.VisUtil.isNodeHiddenFromAT(node) && !VisUtil_1.VisUtil.isNodePresentational(node)) || (node.nodeName.toLowerCase() === "svg" + && CommonUtil.svgHasName(node)); + // Now we check if this node is of type element, visible + if (!hasContent && node.nodeType === 1 && !VisUtil_1.VisUtil.isNodeHiddenFromAT(node) && !VisUtil_1.VisUtil.isNodePresentational(node)) { + // Check if the innerText of the element is empty or not + hasContent = !CommonUtil.isInnerTextOnlyEmpty(node); + if (!hasContent && hyperlink_flag === true) { + hasContent = CommonUtil.attributeNonEmpty(node, "aria-label") || CommonUtil.attributeNonEmpty(node, "aria-labelledby"); + var doc = node.ownerDocument; + if (doc) { + var win = doc.defaultView; + if (win) { + var cStyle = win.getComputedStyle(node); + if (!hasContent && cStyle != null) { + // console.log(cStyle.backgroundImage); + // console.log(cStyle.content) + hasContent = ((cStyle.backgroundImage && cStyle.backgroundImage.indexOf) || cStyle.content) && CommonUtil.attributeNonEmpty(node, "alt"); + } + } + } + } + } + // Check for cases where there is text node after an element under the parent + // In the case we detect nodetype as text node and the patent of the text node is + // the same element we are checking has Inner content for then get the inner content of this + // text node. + if (node.nodeType === 3 && DOMWalker_1.DOMWalker.parentElement(node) === element) { + // Check if the innerText of the element is empty or not + hasContent = !CommonUtil.isInnerTextEmpty(node); + } + } + } + // In the case there are no child elements then we can simply perform the check for only innertext + // the img with alt case will be covered in the above if, as img is considers as an element. + else { + // Check if the innerText of the element is empty or not + hasContent = !CommonUtil.isInnerTextEmpty(element); + } + return hasContent; + }; + CommonUtil.hasInnerContentOrAlt = function (element) { + var text = CommonUtil.getInnerText(element); + var hasContent = (text != null && text.trim().length > 0) || CommonUtil.attributeNonEmpty(element, "alt"); + if (element.firstChild != null) { + var nw = new DOMWalker_1.DOMWalker(element); + while (!hasContent && nw.nextNode() && nw.node != element) { + hasContent = (nw.node.nodeName.toLowerCase() === "img" && + CommonUtil.attributeNonEmpty(nw.node, "alt")); + if (!hasContent + && (AriaUtil_1.AriaUtil.hasRole(nw.node, "button", true) || AriaUtil_1.AriaUtil.hasRole(nw.node, "textbox")) + && (AriaUtil_1.AriaUtil.hasAriaLabel(nw.node) || CommonUtil.attributeNonEmpty(nw.node, "title") || CommonUtil.getLabelForElementHidden(nw.elem(), true))) { + hasContent = true; + } + } + } + return hasContent; + }; + CommonUtil.concatUniqueArrayItem = function (item, arr) { + arr.indexOf(item) === -1 && item !== null ? arr.push(item) : false; + return arr; + }; + CommonUtil.concatUniqueArrayItemList = function (itemList, arr) { + for (var i = 0; itemList !== null && i < itemList.length; i++) { + arr = CommonUtil.concatUniqueArrayItem(itemList[i], arr); + } + return arr; + }; + /** + * remove array items from a given array + * @param itemList items to be removed from arr + * @param arr the array + * @returns + */ + CommonUtil.reduceArrayItemList = function (itemList, arr) { + if (arr && arr.length > 0 && itemList && itemList.length > 0) { + var result = arr.filter(function (value) { + return !itemList.includes(value); + }); + return result; + } + return arr; + }; + CommonUtil.getScopeForTh = function (element) { + /** https://www.w3.org/TR/html5/tabular-data.html#header-and-data-cell-semantics + * A header cell anchored at the slot with coordinate (x, y) with width width and height height is + * said to be a column header if any of the following conditions are true: + * * The cell's scope attribute is in the column state, or + * * The cell's scope attribute is in the auto state, and there are no data cells in any of + * the cells covering slots with y-coordinates y .. y+height-1. + * A header cell anchored at the slot with coordinate (x, y) with width width and height height is + * said to be a row header if any of the following conditions are true: + * * The cell's scope attribute is in the row state, or + * * The cell's scope attribute is in the auto state, the cell is not a column header, and there are + * no data cells in any of the cells covering slots with x-coordinates x .. x+width-1. + */ + // Note: auto is default scope + // Easiest answer is if scope is specified + if (element.hasAttribute("scope")) { + var scope = element.getAttribute("scope").toLowerCase(); + if (scope === "row" || scope === 'rowgroup') + return "row"; + if (scope === "col" || scope === 'colgroup') + return "column"; + } + // scope is auto, default (without a scope) or invalid value. + // if all the sibling elements are th, then return "columnheader" + var siblings = __spreadArray([], element.parentElement.children, true).filter(function (node) { return node.nodeType === 1 && node.tagName.toLowerCase() != "th"; }); + if (siblings === null || siblings.length === 0) + return "column"; + else + return "row"; + }; + CommonUtil.getControlOfLabel = function (node) { + // Handle the easy case of label -> for + var labelAncestor = CommonUtil.getAncestor(node, "label"); + if (labelAncestor && labelAncestor.hasAttribute("for")) { + return fragment_1.FragmentUtil.getById(node, labelAncestor.getAttribute("for")); + } + // Create a dictionary containing ids of parent nodes + var idDict = {}; + var parentWalk = node; + while (parentWalk) { + if (parentWalk.nodeType === 1 /* Node.ELEMENT_NODE */) { + var ancestor = parentWalk; + if (ancestor.hasAttribute("id")) { + idDict[ancestor.getAttribute("id")] = true; + } + } + parentWalk = DOMWalker_1.DOMWalker.parentNode(parentWalk); + } + // Early return if no ancestor IDs found + if (Object.keys(idDict).length === 0) { + return null; + } + // Cache aria-labelledby attribute if node is an element + var nodeAriaLabelledBy = node.nodeType === 1 ? node.getAttribute("aria-labelledby") : null; + // Iterate through controls that use aria-labelledby and see if any of them reference one of my ancestor ids + var inputsUsingLabelledBy = CacheUtil_1.CacheUtil.getSetCache(node.ownerDocument, "CommonUtil::getControlOfLabel", function () { return node.ownerDocument.querySelectorAll("*[aria-labelledby]"); }); + for (var idx = 0; idx < inputsUsingLabelledBy.length; ++idx) { + var inputUsingLabelledBy = inputsUsingLabelledBy[idx]; + var ariaLabelledBy = inputUsingLabelledBy.getAttribute("aria-labelledby"); + var sp = ariaLabelledBy.split(" "); + for (var _i = 0, sp_1 = sp; _i < sp_1.length; _i++) { + var id = sp_1[_i]; + if (id in idDict && !CommonUtil.isIdReferToSelf(node, nodeAriaLabelledBy)) { + return inputUsingLabelledBy; + } + } + } + // Find the cases where we're within an aria labelledby + return null; + }; + /** + * This function is responsible for checking if the node that is provied is + * disabled or not. Following is how the check is performed: + * 1. Check if the current node is disabled with the following options: + * attribute --> disabled + * Also needs to be "button", "input", "select", "textarea", "optgroup", "option", + * "menuitem", "fieldset" nodes (in array elementsAllowedDisabled) + * attribute --> aria-disabled="true" + * 2. Check if any of the current nodes parents are disabled with the same + * options listed in 1. + * + * Note: If either current node or any of the parent nodes are disabled then this + * function will return true (node is disabled). + * + * @parm {HTMLElement} node - The node which should be checked if it is disabled or not. + * @return {bool} true if the node is disabled, false otherwise + * + * @memberOf AriaUtil + */ + CommonUtil.isNodeDisabled = function (node) { + // Set PT_NODE_DISABLED to false for all the nodes, before the check and this will be changed to + // true when we detect that the node is disabled. We have to set it to false so that we know + // the node has already been checked. Only set it to false if the setting is undefined or null + // as if it is defined we do not wnat to reset it. As if it is true then we should make use of it + // to speed up the check. + var PT_NODE_DISABLED = CacheUtil_1.CacheUtil.getCache(node, "PT_NODE_DISABLED", undefined); + if (typeof PT_NODE_DISABLED !== "undefined") + return PT_NODE_DISABLED; + PT_NODE_DISABLED = false; + // Check the nodeType of this node, if this node is a text node then + // we get the parentnode and set that as the node as a text nodes, + // disabled is directly related to the parent node. + if (node.nodeType === 3) { + node = DOMWalker_1.DOMWalker.parentNode(node); + } + // Variable Declaration + var nodeName = node.nodeName.toLowerCase(); + // Get the disabled element property, disabled and aria-disabled attribute and check that it is true + var disabledAttribute = node.hasAttribute("disabled"); + var disabledPropertyCustom = PT_NODE_DISABLED; + var ariaDisabledAttribute = node.hasAttribute('aria-disabled') && node.getAttribute("aria-disabled") === 'true'; + // If this node has disabled attribute and the node allows disabled attribute, then return true. + // Disabled attribute is only allowed on "button", "input", "select", "textarea", "optgroup", "option", "menuitem", "fieldset" + // In the case aria-disabled is set to true, then also return true + if (disabledPropertyCustom || (disabledAttribute && ARIADefinitions_1.ARIADefinitions.elementsAllowedDisabled.indexOf(nodeName) > -1) || ariaDisabledAttribute) { + PT_NODE_DISABLED = true; + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_DISABLED", PT_NODE_DISABLED); + return true; + } + // Get the parentNode for this node, becuase we have to check all parents to make sure they do not have + // disabled attribute. Only keep checking until we are all the way back to the parentNode + // element. + var parentElement = DOMWalker_1.DOMWalker.parentNode(node); + // If the parent node exists and the nodetype is element (1), then run recursive call to perform the check + // all the way up to the very parent node. Use recursive call here instead of a while loop so that we do not + // have to duplicate the logic for checking if the node is disabled or not for all the parents starting with + // child node. + if (parentElement != null && parentElement.nodeType === 1) { + // Check upwards recursively, and save the results in an variable + var nodeDisabled = CommonUtil.isNodeDisabled(parentElement); + // If the node is found to be disabled then add the custom PT_NODE_DISABLED to true. + // so that we can use this next time, to quickly determine if node is disabled or not. + // This is extra percaution, the isNodeDisabled function already sets this. + if (nodeDisabled) { + PT_NODE_DISABLED = true; + } + // Check upwards recursively + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_DISABLED", PT_NODE_DISABLED); + return nodeDisabled; + } + // Return false (node is not disabled) + return false; + }; + /** + * This function is responsible for determine if hidden content should be checked + * in rules. + * + * @parm {element} node - A node so that the document can be accessed to check for the + * option. Can be document element or a simple node element. + * @return {bool} true if hidden content should be checked, false otherwise + * + * @memberOf AriaUtil + */ + CommonUtil.shouldCheckHiddenContent = function (node) { + return false; + }; + /** + * This function is responsible for determining if node should be skipped from checking or not, based + * on the Check Hidden Content settings and if the node is visible or not. + * + * @parm {element} node - Node to check if it is visible or not based on the Check Hidden Content + * setting. + * + * @return {bool} true if node should be skipped, false otherwise + * + * @memberOf AriaUtil + */ + CommonUtil.shouldNodeBeSkippedHidden = function (node) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we + // return true to identify that the node should not be scanned/added to any hash/array. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (!CommonUtil.shouldCheckHiddenContent(node) && !VisUtil_1.VisUtil.isNodeVisible(node)) { + return true; + } + return false; + }; + CommonUtil.isfocusableByDefault = function (node) { + var focusableElements = ['input', 'select', 'button', 'textarea', 'option', 'area']; + if (node.nodeName.toLowerCase() === "a" && CommonUtil.hasAttribute(node, 'href')) + return true; + if (node.nodeName.toLowerCase() === "area" && CommonUtil.hasAttribute(node, 'href')) + return true; + if (focusableElements.indexOf(node.nodeName.toLowerCase()) !== -1) + return true; + return false; + }; + /** + * This function check if a non-tabable node has valid tabable content. + * If it is tabable (the tabindex is not speicified or is not -1), returns false; + * If it is non-tabable, but a child is tabable and does not have element content, returns false; + * Otherwise, returns true. + */ + CommonUtil.nonTabableChildCheck = function (element) { + if (!element.hasAttribute("tabindex") || + (parseInt(element.getAttribute("tabindex")) != -1)) { + return false; + } + var nw = new DOMWalker_1.DOMWalker(element); + while (nw.nextNode()) { + var child = nw.elem(); + if (child === null) { // Text node. usually is a cartridge return. + continue; + } + if (child.hasAttribute("tabindex") && + (parseInt(child.getAttribute("tabindex")) != -1) && + !CommonUtil.hasInnerContent(child)) { + return false; + } + } + return true; + }; + CommonUtil.hasAttribute = function (element, attributeName) { + var hasAttribute = false; + if (element.hasAttribute) { + hasAttribute = element.hasAttribute(attributeName); + } + else if (element.attributes && element.attributes.getNamedItem) { + var attr = element.attributes.getNamedItem(attributeName); + hasAttribute = attr && attr.specified; + } + return hasAttribute; + }; + // truncate the given text to a given number of characters + // return truncated text to 150 chars, same with the media_alt_brief rule + CommonUtil.truncateText = function (text, len) { + if (len === void 0) { len = 150; } + if (!text) + return text; + text = text.trim(); + if (text.length > len) + return text.substring(0, len - 1) + "..."; + return text; + }; + CommonUtil.input_type_with_placeholder = ["text", "search", "tel", "url", "email", "password", "number"]; + CommonUtil.input_text_types = [ + "text", "file", "password", + "checkbox", "radio", + "search", "tel", "url", "email", + "date", "number", "range", + "time", "color" + ]; + CommonUtil.input_time_types = [ + "date", "month", "week", "time", "datetime-local" + ]; + CommonUtil.input_other_types = [ + "range", "color", "checkbox", "radio", "file", "image" + ]; + CommonUtil.form_button_types = [ + "button", "reset", "submit" + ]; + CommonUtil.form_labelable_elements = ["input", "textarea", "select", "keygen", "progress", "meter", "output", "button"]; + CommonUtil.tabTagMap = { + "button": function (element) { + return !element.hasAttribute("disabled"); + }, + "iframe": true, + "input": function (element) { + if (element.hasAttribute("disabled") || element.getAttribute("type") === "hidden") + return false; + if (element.getAttribute("type") === "radio") { + var name_2 = element.getAttribute("name"); + if (!name_2 || name_2.trim().length === 0) + return true; //single radio, no group + var doc = element.ownerDocument; + var group = doc.querySelectorAll("input[type='radio'][name='" + name_2.trim() + "']"); + if (group.length === 0 || group.length === 1) + return true; //single radio with the name, no others in group + var checked = null; + for (var i = 0; i < group.length; i++) { + if (group[i].checked) + checked = group[i]; + } + //only last one applies if multiple radios with 'checked' attributes + if (checked !== null) { + if (DOMUtil_1.DOMUtil.sameNode(checked, element)) + return true; + return false; + } + else { + // if nothing checked yet, return true if it's the first element + if (DOMUtil_1.DOMUtil.sameNode(group[0], element)) + return true; + return false; + } + } + else + return true; + }, + "select": function (element) { + return !element.hasAttribute("disabled"); + }, + "textarea": function (element) { + if (element.hasAttribute("disabled") || element.getAttribute("type") === "hidden") + return false; + return true; + }, + /**"div": function (element) { + return element.hasAttribute("contenteditable"); + },*/ + "a": function (element) { + // xlink:href?? see svg + return element.hasAttribute("href"); + }, + "area": function (element) { + return element.hasAttribute("href"); + }, + "audio": function (element) { + return element.hasAttribute("controls"); + }, + "video": function (element) { + return element.hasAttribute("controls"); + }, + "summary": function (element) { + // first summary child of a details element is automatically focusable + return element.parentElement && element.parentElement.nodeName.toLowerCase() === 'details' + && DOMUtil_1.DOMUtil.sameNode(__spreadArray([], element.parentElement.children, true).filter(function (elem) { return elem.nodeName.toLowerCase() === 'summary'; })[0], element); + }, + "details": function (element) { + //details element without a direct summary child is automatically focusable + return element.children && __spreadArray([], element.children, true).filter(function (elem) { return elem.nodeName.toLowerCase() === 'summary'; }).length === 0; + } + }; + CommonUtil.image_extensions = [".bmp", ".gif", ".jpg", ".jpeg", ".pcx", ".png"]; + return CommonUtil; +}()); +exports.CommonUtil = CommonUtil; + + +/***/ }, + +/***/ "./src/v4/util/TableUtil.ts" +/*!**********************************!*\ + !*** ./src/v4/util/TableUtil.ts ***! + \**********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.TableUtil = void 0; +var VisUtil_1 = __webpack_require__(/*! ./VisUtil */ "./src/v4/util/VisUtil.ts"); +var AriaUtil_1 = __webpack_require__(/*! ./AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ./CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var TableUtil = /** @class */ (function () { + function TableUtil() { + } + TableUtil.isDataTable = function (tableNode) { + return !(AriaUtil_1.AriaUtil.hasRole(tableNode, "none") || AriaUtil_1.AriaUtil.hasRole(tableNode, "presentation")); + }; + /* + * A complex data table is a data table with any of the following characteristics: + * + * a thead element that contains two or more tr elements + * a table with more than one thead element + * a table with two or more tr elements that contain only th elements + * a th or td element with a rowspan or colspan attribute + * a tr element that contains at least one td element and two or more th elements + * a table with headers not located in the first row or first column + * a td element with a headers attribute value that contains more than two IDREFs + */ + TableUtil.isComplexDataTable = function (table) { + if ("AriaUtil_isComplexDataTable" in table) { + return !!table.AriaUtil_isComplexDataTable; + } + var isComplexTable = false; + if (table && TableUtil.isDataTable(table)) { + var thNodes = null, tdNodes = null; + var trNodes = table.getElementsByTagName("tr"); + var trNodeCount = trNodes.length; + var tdNodeCount = 0, thNodeCount = 0, trNodesHavingOnlyThNodes = 0; + for (var i = 0; !isComplexTable && i < trNodeCount; ++i) { + thNodes = trNodes[i].getElementsByTagName("th"); + tdNodes = trNodes[i].getElementsByTagName("td"); + thNodeCount = thNodes.length; + tdNodeCount = tdNodes.length; + if (tdNodeCount !== 0) { + // a tr element that contains at least one td element and two or more th elements; + isComplexTable = thNodeCount > 1; + // a th element with a rowspan or colspan attribute + for (var j = 0; !isComplexTable && j < thNodeCount; ++j) { + isComplexTable = ((thNodes[j].hasAttribute("rowspan") || + thNodes[j].hasAttribute("colspan")) && + CommonUtil_1.CommonUtil.getAncestor(thNodes[j], "table") === table); + } + // a td element with a rowspan or colspan attribute + // a td element with a headers attribute value that contains more than two IDREFs + for (var k = 0; !isComplexTable && k < tdNodeCount; ++k) { + isComplexTable = ((tdNodes[k].hasAttribute("rowspan") || + tdNodes[k].hasAttribute("colspan") || + (tdNodes[k].hasAttribute("headers") && CommonUtil_1.CommonUtil.normalizeSpacing(tdNodes[k].getAttribute("headers")).split(" ").length > 2)) && + CommonUtil_1.CommonUtil.getAncestor(tdNodes[k], "table") === table); + } + } + else { + // two or more tr elements that contain only th elements + if (thNodeCount > 0) { + ++trNodesHavingOnlyThNodes; + } + isComplexTable = trNodesHavingOnlyThNodes === 2; + } + } + if (!isComplexTable) { + var theadNodes = table.getElementsByTagName("thead"); + var theadNodesLength = theadNodes.length; + if (theadNodesLength > 0) { + // table has more than one thead element + isComplexTable = theadNodesLength > 1; + // a thead element that contains two or more tr elements + if (!isComplexTable) { + isComplexTable = theadNodes[0].getElementsByTagName("tr").length > 1; + } + } + } + if (!isComplexTable && trNodeCount !== 0) { + // a table with headers not located in the first row or first column + isComplexTable = thNodeCount > 0 && !TableUtil.tableHeaderExists(table); + } + } + table.AriaUtil_isComplexDataTable = isComplexTable; + return isComplexTable; + }; + // Return true if a table cell is hidden or contain no data: <td></td> + TableUtil.isTableCellEmpty = function (cell) { + if (!cell || !VisUtil_1.VisUtil.isNodeVisible(cell) || cell.innerHTML.replace(/&nbsp;/g, ' ').trim().length === 0) + return true; + return false; + }; + // Return true if a table row is hidden or contain no data: <tr /> or <tr><td></td><td></td></tr> + TableUtil.isTableRowEmpty = function (row) { + if (!row || !row.cells || row.cells.length === 0 || !VisUtil_1.VisUtil.isNodeVisible(row)) + return true; + var passed = true; //empty + for (var c = 0; passed && c < row.cells.length; c++) { + var cell = row.cells[c]; + passed = TableUtil.isTableCellEmpty(cell); + } + return passed; + }; + // Return true if a table's header is in the first row or column + TableUtil.tableHeaderExists = function (ruleContext) { + var rows = ruleContext.rows; + if (!rows || rows.length === 0) + return null; + // note that table.rows return all all the rows in the table, + // including the rows contained within <thead>, <tfoot>, and <tbody> elements. + //case 1: headers are in the very first row with data in tbody or thead, but not in tfoot + //get the first row with data, ignoring the rows with no data + var passed = true; + var firstRow = rows[0]; + for (var r = 0; passed && r < rows.length; r++) { + firstRow = rows[r]; + // ignore the rows from tfoot + if (firstRow.parentNode && firstRow.parentNode.nodeName.toLowerCase() === 'tfoot') + continue; + passed = TableUtil.isTableRowEmpty(firstRow); + } + //table contain no data: <table><tr><td></td><td></td></tr></table> + if (passed) + return null; + // Check if the cells with data in the first data row are all TH's + passed = true; + for (var r = 0; passed && r < firstRow.cells.length; r++) { + var cell = firstRow.cells[r]; + passed = TableUtil.isTableCellEmpty(cell) || cell.nodeName.toLowerCase() === 'th'; + } + if (passed) + return true; + // Case 2: headers are in the first column with data + // Assume that the first column has all TH's or a TD without data in the first column. + passed = true; + for (var i = 0; passed && i < rows.length; ++i) { + // ignore the rows from tfoot + if (rows[i].parentNode && rows[i].parentNode.nodeName.toLowerCase() === 'tfoot') + continue; + // If no cells in this row, or no data at all, that's okay too. + passed = !rows[i].cells || + rows[i].cells.length === 0 || + rows[i].cells[0].innerHTML.trim().length === 0 || + rows[i].cells[0].nodeName.toLowerCase() != "td"; + } + if (passed) + return true; + //case 3: all td data cells have headers attributes that point to the id of a th element in the same table. + // https://html.spec.whatwg.org/multipage/tables.html#attributes-common-to-td-and-th-elements + passed = true; + var thIds = []; + var tdHeaders = []; + for (var r = 0; passed && r < rows.length; r++) { + var row = rows[r]; + // Check if the cells with data in the last data row are all TH's + for (var c = 0; c < row.cells.length; c++) { + var cell = row.cells[c]; + if (TableUtil.isTableCellEmpty(cell)) + continue; + if (cell.nodeName.toLowerCase() === 'td') { + if (!cell.getAttribute('headers') || cell.getAttribute('headers').trim().length === 0) + passed = false; + else + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(cell.getAttribute('headers').trim().split(" "), tdHeaders); + } + else if (cell.nodeName.toLowerCase() === 'th' && cell.getAttribute('id') && cell.getAttribute('id').trim().length > 0) + CommonUtil_1.CommonUtil.concatUniqueArrayItem(cell.getAttribute('id').trim(), thIds); + } + } + if (passed) { // all td elements have headers, to exam if the headers point to a th id + if (thIds.length > 0 && tdHeaders.every(function (header) { return thIds.includes(header); })) + return true; + } + return false; + }; + TableUtil.isLayoutTable = function (tableNode) { + return AriaUtil_1.AriaUtil.hasRole(tableNode, "presentation") || AriaUtil_1.AriaUtil.hasRole(tableNode, "none"); + }; + /* + * get conflict Aria and Html attributes + * return: a list of Aria and Html attribute pairs that are conflict + */ + TableUtil.isTableDescendant = function (contextHierarchies) { + if (!contextHierarchies) + return null; + return contextHierarchies["aria"].filter(function (hier) { return ["table", "grid", "treegrid"].includes(hier.role); }); + }; + return TableUtil; +}()); +exports.TableUtil = TableUtil; + + +/***/ }, + +/***/ "./src/v4/util/VisUtil.ts" +/*!********************************!*\ + !*** ./src/v4/util/VisUtil.ts ***! + \********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.VisUtil = void 0; +var CacheUtil_1 = __webpack_require__(/*! ./CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var DOMMapper_1 = __webpack_require__(/*! ../../v2/dom/DOMMapper */ "./src/v2/dom/DOMMapper.ts"); +var AriaUtil_1 = __webpack_require__(/*! ./AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CSSUtil_1 = __webpack_require__(/*! ./CSSUtil */ "./src/v4/util/CSSUtil.ts"); +var ClipPathUtil_1 = __webpack_require__(/*! ./ClipPathUtil */ "./src/v4/util/ClipPathUtil.ts"); +var VisUtil = /** @class */ (function () { + function VisUtil() { + } + /** + * This function is responsible for checking if the node that is provied is + * visible or not. Following is how the check is performed: + * 1. Check if the current node is hidden with the following options: + * CSS --> dislay: none + * CSS --> visibility: hidden + * attribute --> hidden + * 2. Check if the any of the current nodes parents are hidden with the same + * options listed in 1. + * + * Note: If either current node or any of the parent nodes are hidden then this + * function will return false (node is not visible). + * + * Note: nodes with CSS properties opacity:0 or filter:opacity(0%), or similar SVG mechanisms: + * They are not considered hidden. Text hidden with these methods can still be selected or copied, + * and user agents still expose it in their accessibility trees. + * + * Note: nodes hidden off screen or behind another object: they are not considered hidden. + * They are exposed in the accessibility tree and they can even name on-screen objects. + * + * @parm {element} node The node which should be checked if it is visible or not. + * @return {bool} false if the node is NOT visible, true otherwise + * + * @memberOf VisUtil + */ + VisUtil.isNodeVisible = function (nodeIn) { + // Check the nodeType if this node, if this node is a text node then + // we get the parentnode and set that as the node as a text nodes, + // visibility is directly related to the parent node. + if (nodeIn.nodeType === 3) { + nodeIn = DOMWalker_1.DOMWalker.parentNode(nodeIn); + } + var node = nodeIn; + // We should only allow nodeType element, and TextNode all other nodesTypes + // we can return the visibility as visible. + // Following nodes will be returned as visable by default, since we can not + // actually change their visibility. + // Node.PROCESSING_INSTRUCTION_NODE --> 7 + // Node.COMMENT_NODE --> 8 + // 9 /* Node.DOCUMENT_NODE */ --> 9 + // Node.DOCUMENT_TYPE_NODE --> 10 + // Node.DOCUMENT_FRAGMENT_NODE --> 11 + if (node.nodeType !== 1) { + return true; + } + // Make sure that the ownerDocument is present before moving forward + // in detecting if the node is visible or not. In the case that ownerDocument + // does not exist then we simply return node is visible by default. + if (!node.ownerDocument) { + return true; + } + // Variable Declaration + var compStyle; + var nodeName = node.nodeName.toLowerCase(); + // In the case this node is a script, link or style node, right away return node is visible + // because scripts, links and style nodes can not be hidden by HTML attribute or CSS or are hidden by default. But we want to scan + // the elements everytime as they render content still which is still visible to users. + // script --> script elements have display: none by default + // link --> link elements have display: none by default, but the actually CSS script is still executed so we have to + // mark this element as visible at all times. + // style --> style elements have display: none by default, but the actually CSS script is still executed so we have to + // mark this element as visible at all times. + // datalist --> In the rendering, the datalist element represents nothing and it, along with its children, should be hidden. + if (VisUtil.hiddenByDefaultElements != null && VisUtil.hiddenByDefaultElements != undefined && VisUtil.hiddenByDefaultElements.indexOf(nodeName) > -1) { + //return true; + return false; + } + var cacheVal = CacheUtil_1.CacheUtil.getCache(node, "PT_NODE_HIDDEN", undefined); + if (cacheVal !== undefined) { + return cacheVal; + } + // Set PT_NODE_HIDDEN to false for all the nodes, before the check and this will be changed to + // true when we detect that the node is hidden. We have to set it to false so that we know + // the rules has already been checked. + cacheVal = CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", false); + // Check if this node is visible, we check couple of CSS properties and hidden attribute. + // area, param and audio elements we do not check if they are hidden as it does not apply to them. + // Check the unhideableElements array which is part of the rules, to check if this element is allowed to be hidden or not + // in the case that the element is part of the unhideableElements array then we do not run the hidden check on this element, + // and go stright to the parent node. + // Array check elements like: + // area --> area element is part of a map element and it can not be hidden because it is used to + // make an certian parts of an map interactive. + // param --> element can only be part of object elment and it cannot be hidden directly, it + // can only be hidden if the parent is hidden. + // audio --> If this element is hidden it will still play the music, so we should still trigger + // violations for this element. + // In the case that unhideableElements array is not defined then we just scan all elements and do no filtering at all. + if (VisUtil.unhideableElements === null || VisUtil.unhideableElements === undefined || VisUtil.unhideableElements.indexOf(nodeName) === -1) { + // Check if defaultView exists for this node, if it does then use this to run the getComputedStyle + // function to get the CSS style for the node. + if (node.ownerDocument.defaultView) { + // Run the getComputedStyle on this node to fetch the CSS compuation of the node + compStyle = node.ownerDocument.defaultView.getComputedStyle(node, null); + } + // In the case that defaultView does not exists return true to identify that this + // node is visible, because were not able to detect if it was not. + else { + return CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", true); + } + // Get the hidden element property and hidden attribute + var hiddenAttribute = node.getAttribute("hidden"); + var hiddenPropertyCustom = cacheVal; + // To get the hidden property we need to perform a special check as in some cases the hidden property will not be + // a boolean, for theses cases we set it to false as we are not able to determine the true hidden condition. + // The reason for this is because form elements are able to perform an override, so when we have id="hidden" for an element + // which is under the form element then, node.hidden gives the element/list of elements which have id="hidden". Refer to + // mozilla bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1267356 + var hiddenProperty = typeof node.hidden === "boolean" ? node.hidden : false; + // If compStyle object is empty, node does't have hidden property, node does't have hidden attribute and does't have custom PT + // hidden property then we can just return true (node visible) at this point. + if (!compStyle && + !hiddenProperty && // this covers false, null, or undefined + (hiddenAttribute === null || hiddenAttribute === undefined) && + !hiddenPropertyCustom // This covers false, null or undefined + ) { + return CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", true); + } + // In the case that the compStyle is defined we check the following: + // CSS style display set to none + // CSS style visibility set to hidden + // Note: For this property since it is inherited, need to skip the check on parents as + // the parent can have hidden but the child can be visible. So we only check this property + // on child elements/elements that are passed to this function the first time. + // node hidden property set (node.hidden) + // node attribute hidden set (to any value) + // node custom hidden property ser (node.PT_NODE_HIDDEN) + // If any of the above conditions are true then we return false as this element is not visible + if ((compStyle !== null && ((compStyle.getPropertyValue('display') === 'none' || + (!CacheUtil_1.CacheUtil.getCache(node, "Visibility_Check_Parent", null) && compStyle.getPropertyValue('visibility') === 'hidden'))) || + (compStyle.getPropertyValue('display') !== 'block' && (hiddenProperty || hiddenAttribute != null || hiddenPropertyCustom)))) { + // Set a custom expandos property on the the node to identify that it is hidden, so that we can uses + // use this in the rules to determine if the node is hidden or not, if we need to. + // Use expandos property instead of a hash map which stores the elements, adding/checking expandos + // properties is a lot faster performance whise. For Hash map we need to store based on xpath, and to calculate + // xpath it is more performance impact. + return CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", false); + } + // check content-visibility: if the content-visibility is hidden, then, return false as the element is not visible + if (VisUtil.isContentHidden(node)) { + return CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", false); + } + // check hidden by clip-path + // TODO: need to check if hidden content contains focusable elements, similarly to offscreen content + if (ClipPathUtil_1.ClipPathUtil.isNodeVisuallyHiddenByClipPath(node)) { + return CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", false); + } + } + // Get the parentNode for this node, becuase we have to check all parents to make sure they do not have + // the hidden CSS, property or attribute. Only keep checking until we are all the way back to the parentNode + // element. + var parentElement = DOMWalker_1.DOMWalker.parentNode(node); + // If the parent node exists and the nodetype is element (1), then run recursive call to perform the check + // all the way up to the very parent node. Use recursive call here instead of a while loop so that we do not + // have to duplicate the logic for checking if the node is visible or not for all the parents starting with + // child node. + if (parentElement != null && parentElement.nodeType === 1) { + // When we have a parent element going through the isNodeVisible function we have to mark it as such + // so that in the function we can skip checking visibility: hidden for parent elements since visibility: hidden + // is inherited, which allows a child to have a different setting then the child. This property only needs to be checked + // once for the first element that is passed down and that is all. Ignore it for all the parents that we iterate over. + CacheUtil_1.CacheUtil.setCache(parentElement, "Visibility_Check_Parent", true); + // Check upwards recursively, and save the results in an variable + var nodeVisible = VisUtil.isNodeVisible(parentElement); + // If the node is found to not be visible then add the custom PT_NODE_HIDDEN to true. + // so that we can use this in the rules. + // if (!nodeVisible) { + // CacheUtil.setCache(node, "PT_NODE_HIDDEN", true); + // } + // Check upwards recursively + return CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", nodeVisible); + } + // Return true (node is visible) + return CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", true); + }; + /** + * This function is responsible for checking if the node that is visually hidden by clipping or opaq: + * 1. Check if the current node is visually hidden: + * CSS --> clip: rect(0px, 0px, 0px, 0px) + * CSS --> opacity: 0 + * + * Note: If either current node or any of the parent nodes are visually hidden then this + * function will return true (node is not visually hidden). + * + * Note: nodes with CSS properties clip: rect(0px, 0px, 0px, 0px) or opacity:0 or filter:opacity(0%), or similar SVG mechanisms: + * They are not considered hidden to an AT. Text hidden with these methods can still be selected or copied, + * and user agents still expose it in their accessibility trees. + * + * @parm {element} node The node which should be checked if it is visually hidden or not. + * @return {bool} true if the node is visually hidden, false otherwise + * + * @memberOf VisUtil + */ + VisUtil.isNodeVisuallyHidden = function (node) { + if (!node || node.nodeType !== 1) + return false; + var elem = node; + // Set PT_NODE_HIDDEN to false for all the nodes, before the check and this will be changed to + // true when we detect that the node is hidden. We have to set it to false so that we know + // the rules has already been checked. + var hidden = CacheUtil_1.CacheUtil.getCache(elem, "PT_NODE_VISUALLY_HIDDEN", undefined); + if (hidden === undefined) { + // defined styles only give the styles that changed + var comp_styles = CSSUtil_1.CSSUtil.getComputedStyle(elem); + if ((comp_styles['position'] === 'absolute' && comp_styles['clip'] && comp_styles['clip'].replaceAll(' ', '') === 'rect(0px,0px,0px,0px)') + || (comp_styles['opacity'] && parseFloat(comp_styles['opacity']) < 0.1)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN", true); + return true; + } + // Get the parentNode for this node, becuase we have to check all parents to make sure they do not have + // the hidden CSS, property or attribute. Only keep checking until we are all the way back to the parentNode + // element. + var parentElement = DOMWalker_1.DOMWalker.parentElement(elem); + if (!parentElement) + return false; + // Check upwards recursively + var hid = VisUtil.isNodeVisuallyHidden(parentElement); + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN", hid); + return hid; + } + return hidden; + }; + /** + * return true if the node or its ancestor is hidden by CSS content-visibility:hidden + * At this time, CSS content-visibility is partially supported by Chrome & Edge, but not supported by Firefox + * The implementation TEMPORARILY follows the Chrome test results: + * if content-visibility:hidden + * if the element is block-level (default or specified by the user), then the element and its children are normally hidden; + * if the element is inline (default or specified by the user), then the element and its children are normally NOT hidden; + * + * @param node + */ + VisUtil.isContentHidden = function (node) { + if (!node) + return false; + var vis = CacheUtil_1.CacheUtil.getCache(node, "PT_NODE_ContentHidden", undefined); + if (vis !== undefined) + return vis; + var style = getComputedStyle(node); + if (!style) { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_ContentHidden", false); + return false; + } + var content_visibility = style.getPropertyValue("content-visibility"); + if (content_visibility !== 'hidden') { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_ContentHidden", false); + return false; + } + var display = style.getPropertyValue("display"); + // inline element only + if (display === 'inline') { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_ContentHidden", false); + return false; + } + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_ContentHidden", true); + return true; + }; + /** + * return true if the node is offscreen by CSS position + * @param node + */ + VisUtil.isElementOffscreen = function (node) { + if (!node) + return true; + if (node.nodeType !== 1) + return false; + var vis = CacheUtil_1.CacheUtil.getCache(node, "PT_NODE_Offscreen", undefined); + if (vis !== undefined) + return vis; + var mapper = new DOMMapper_1.DOMMapper(); + var bounds = mapper.getUnadjustedBounds(node); + if (!bounds) { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_Offscreen", true); + return true; + } + if (bounds['height'] === 0 || bounds['width'] === 0 || (bounds['top'] + bounds['height']) <= 0 || (bounds['left'] + bounds['width']) <= 0) { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_Offscreen", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_Offscreen", false); + return false; + }; + /** + * return true if the node or its ancestor is natively hidden or aria-hidden = 'true' + * @param node + */ + VisUtil.isNodeHiddenFromAT = function (node) { + if (!node) + return false; + var vis = CacheUtil_1.CacheUtil.getCache(node, "PT_NODE_HiddenFromAT", undefined); + if (vis !== undefined) + return vis; + if (!VisUtil.isNodeVisible(node) || node.getAttribute("aria-hidden") === 'true') { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HiddenFromAT", true); + return true; + } + var ancestor = DOMUtil_1.DOMUtil.getAncestorWithAttribute(node, "aria-hidden", "true"); + if (ancestor) { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HiddenFromAT", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HiddenFromAT", false); + return false; + }; + /** + * return true if the node or its ancestor is natively hidden or aria-hidden = 'true' + * @param node + */ + VisUtil.isNodePresentational = function (node) { + var role = AriaUtil_1.AriaUtil.getResolvedRole(node); + if (role && (role === 'none' || role === 'presentation')) + return true; + return false; + }; + /** + * return true if the element is scrollable + * @param node + */ + VisUtil.isElementScrollable = function (elem) { + if (!elem) + return false; + var styles = CSSUtil_1.CSSUtil.getComputedStyle(elem); + if (!styles) + return false; + var x_scroll = styles.getPropertyValue('overflow-x'); + var y_scroll = styles.getPropertyValue('overflow-y'); + //console.log("before node="+ elem.nodeName +", id="+elem.getAttribute("id") +", x_scroll="+x_scroll + ", y_scroll="+y_scroll); + // If overflow-y is hidden, scroll, or auto, and the overflow-x property is visible (default), the value will be implicitly computed as auto. + if (x_scroll === 'visible' && (y_scroll === 'hidden' || y_scroll === 'scroll' || y_scroll === 'auto')) + x_scroll = 'auto'; + // If overflow-x is hidden, scroll, or auto and the overflow-y property is visible (default), the value will be implicitly computed as auto. + if (y_scroll === 'visible' && (x_scroll === 'hidden' || x_scroll === 'scroll' || x_scroll === 'auto')) + y_scroll = 'auto'; + // setting overflow to clip in one direction when it isn't set to visible or clip in the other direction results in the clip value behaving as hidden. + if (x_scroll === 'clip' && y_scroll !== 'visible' && y_scroll !== 'clip') + x_scroll = 'hidden'; + if (y_scroll === 'clip' && x_scroll !== 'visible' && x_scroll !== 'clip') + y_scroll = 'hidden'; + // not scrollable: no scroll bars + if ((x_scroll === 'visible' || x_scroll === 'hidden' || x_scroll === 'clip') + && (y_scroll === 'visible' || y_scroll === 'hidden' || y_scroll === 'clip')) + return false; + // false if the overall scrollable element (clientWidth + scrollbarWidth and clientHeight + scrollbarHeight) is too small to be visible on screen + if (Math.max(elem.offsetWidth, elem.offsetHeight) < 30 || Math.min(elem.offsetWidth, elem.offsetHeight) < 15) + return false; + // false if content is smaller than the scrollable container: both x and y scroll distances < element's horizontal/vertical padding + var padding_x = CSSUtil_1.CSSUtil.getPixelsFromStyle(styles.paddingLeft, elem) + CSSUtil_1.CSSUtil.getPixelsFromStyle(styles.paddingRight, elem); + var padding_y = CSSUtil_1.CSSUtil.getPixelsFromStyle(styles.paddingTop, elem) + CSSUtil_1.CSSUtil.getPixelsFromStyle(styles.paddingBottom, elem); + if (elem.scrollWidth - elem.clientWidth < 1 + padding_x + && elem.scrollHeight - elem.clientHeight < 1 + padding_y) + return false; + return true; + }; + // This list contains a list of element tags which can not be hidden, when hidden is + // added to theses elements it does not do anything at all. + // area --> area element is part of a map element and it can not be hidden because it is used to + // make an certian parts of an map interactive. + // param --> element can only be part of object elment and it cannot be hidden directly, it + // can only be hidden if the parent is hidden. + // audio --> If this element is hidden it will still play the music, so we should still trigger + // violations for this element. + // Note: All element tags that are added here should be added as lowercase, as we are using indexOf to do the check. + VisUtil.unhideableElements = ['area', 'param', 'audio']; + // This list contains a list of elements tags which have display: none by default, since we have rules triggering + // on theses elements we need to make then visible by default so that the rules can trigger regardless of the + // Check Hidden Content option in the tools. + // script --> script elements have display: none by default + // link --> link elements have display: none by default, but the actually CSS script is still executed so we have to + // mark this element as visible at all times. + // style --> style elements have display: none by default, but the actually CSS script is still executed so we have to + // mark this element as visible at all times. + // head --> head elements have display: none by default, but it will still behave correct + // title --> title elements have display: none by default, but it will still display the title. remove title from the list because a title can be a child of a svg element too + // meta --> meta elements have display: none by default, but it will still perform the action that meta is suppose to + // base --> base elements have display: none by default, but it will still perform the action that meta is suppose to + // noscript --> noscript elements have display: none by default, but it will still perform the action that meta is suppose to + // template --> template elements have display: none by default, because they are just a mechanism for holding client-side content + // that is not to be rendered when a page is loaded. https://developer.mozilla.org/en/docs/Web/HTML/Element/template + // datalist --> datalist elements have display: none by default, + VisUtil.hiddenByDefaultElements = ['script', 'link', 'style', 'head', 'meta', 'base', 'noscript', 'template', 'datalist']; + return VisUtil; +}()); +exports.VisUtil = VisUtil; + + +/***/ }, + +/***/ "./src/v4/sc-urls.json" +/*!*****************************!*\ + !*** ./src/v4/sc-urls.json ***! + \*****************************/ +(module) { + +module.exports = /*#__PURE__*/JSON.parse('{"1.1.1":{"num":"1.1.1","url":"https://www.w3.org/TR/WCAG22/#non-text-content","scId":"WCAG2:non-text-content","scAltId":["text-equiv-all"],"test":"WCAG2:text-equiv-all","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#non-text-content","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/non-text-content.html","handle":"Non-text Content","level":"A","wcagType":"2.0"},"1.2.1":{"num":"1.2.1","url":"https://www.w3.org/TR/WCAG22/#audio-only-and-video-only-prerecorded","scId":"WCAG2:audio-only-and-video-only-prerecorded","scAltId":["media-equiv-av-only-alt"],"test":"WCAG2:media-equiv-av-only-alt","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-only-and-video-only-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-only-and-video-only-prerecorded.html","handle":"Audio-only and Video-only (Prerecorded)","level":"A","wcagType":"2.0"},"1.2.2":{"num":"1.2.2","url":"https://www.w3.org/TR/WCAG22/#captions-prerecorded","scId":"WCAG2:captions-prerecorded","scAltId":["media-equiv-captions"],"test":"WCAG2:media-equiv-captions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#captions-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/captions-prerecorded.html","handle":"Captions (Prerecorded)","level":"A","wcagType":"2.0"},"1.2.3":{"num":"1.2.3","url":"https://www.w3.org/TR/WCAG22/#audio-description-or-media-alternative-prerecorded","scId":"WCAG2:audio-description-or-media-alternative-prerecorded","scAltId":["media-equiv-audio-desc"],"test":"WCAG2:media-equiv-audio-desc","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-description-or-media-alternative-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-description-or-media-alternative-prerecorded.html","handle":"Audio Description or Media Alternative (Prerecorded)","level":"A","wcagType":"2.0"},"1.2.4":{"num":"1.2.4","url":"https://www.w3.org/TR/WCAG22/#captions-live","scId":"WCAG2:captions-live","scAltId":["media-equiv-real-time-captions"],"test":"WCAG2:media-equiv-real-time-captions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#captions-live","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/captions-live.html","handle":"Captions (Live)","level":"AA","wcagType":"2.0"},"1.2.5":{"num":"1.2.5","url":"https://www.w3.org/TR/WCAG22/#audio-description-prerecorded","scId":"WCAG2:audio-description-prerecorded","scAltId":["media-equiv-audio-desc-only"],"test":"WCAG2:media-equiv-audio-desc-only","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-description-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-description-prerecorded.html","handle":"Audio Description (Prerecorded)","level":"AA","wcagType":"2.0"},"1.2.6":{"num":"1.2.6","url":"https://www.w3.org/TR/WCAG22/#sign-language-prerecorded","scId":"WCAG2:sign-language-prerecorded","scAltId":["media-equiv-sign"],"test":"WCAG2:media-equiv-sign","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#sign-language-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/sign-language-prerecorded.html","handle":"Sign Language (Prerecorded)","level":"AAA","wcagType":"2.0"},"1.2.7":{"num":"1.2.7","url":"https://www.w3.org/TR/WCAG22/#extended-audio-description-prerecorded","scId":"WCAG2:extended-audio-description-prerecorded","scAltId":["media-equiv-extended-ad"],"test":"WCAG2:media-equiv-extended-ad","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#extended-audio-description-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/extended-audio-description-prerecorded.html","handle":"Extended Audio Description (Prerecorded)","level":"AAA","wcagType":"2.0"},"1.2.8":{"num":"1.2.8","url":"https://www.w3.org/TR/WCAG22/#media-alternative-prerecorded","scId":"WCAG2:media-alternative-prerecorded","scAltId":["media-equiv-text-doc"],"test":"WCAG2:media-equiv-text-doc","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#media-alternative-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/media-alternative-prerecorded.html","handle":"Media Alternative (Prerecorded)","level":"AAA","wcagType":"2.0"},"1.2.9":{"num":"1.2.9","url":"https://www.w3.org/TR/WCAG22/#audio-only-live","scId":"WCAG2:audio-only-live","scAltId":["media-equiv-live-audio-only"],"test":"WCAG2:media-equiv-live-audio-only","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-only-live","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-only-live.html","handle":"Audio-only (Live)","level":"AAA","wcagType":"2.0"},"1.3.1":{"num":"1.3.1","url":"https://www.w3.org/TR/WCAG22/#info-and-relationships","scId":"WCAG2:info-and-relationships","scAltId":["content-structure-separation-programmatic"],"test":"WCAG2:content-structure-separation-programmatic","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#info-and-relationships","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/info-and-relationships.html","handle":"Info and Relationships","level":"A","wcagType":"2.0"},"1.3.2":{"num":"1.3.2","url":"https://www.w3.org/TR/WCAG22/#meaningful-sequence","scId":"WCAG2:meaningful-sequence","scAltId":["content-structure-separation-sequence"],"test":"WCAG2:content-structure-separation-sequence","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#meaningful-sequence","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/meaningful-sequence.html","handle":"Meaningful Sequence","level":"A","wcagType":"2.0"},"1.3.3":{"num":"1.3.3","url":"https://www.w3.org/TR/WCAG22/#sensory-characteristics","scId":"WCAG2:sensory-characteristics","scAltId":["content-structure-separation-understanding"],"test":"WCAG2:content-structure-separation-understanding","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#sensory-characteristics","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/sensory-characteristics.html","handle":"Sensory Characteristics","level":"A","wcagType":"2.0"},"1.3.4":{"num":"1.3.4","url":"https://www.w3.org/TR/WCAG22/#orientation","scId":"WCAG2:orientation","scAltId":[],"test":"WCAG2:orientation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#orientation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/orientation.html","handle":"Orientation","level":"AA","wcagType":"2.1"},"1.3.5":{"num":"1.3.5","url":"https://www.w3.org/TR/WCAG22/#identify-input-purpose","scId":"WCAG2:identify-input-purpose","scAltId":[],"test":"WCAG2:identify-input-purpose","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#identify-input-purpose","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/identify-input-purpose.html","handle":"Identify Input Purpose","level":"AA","wcagType":"2.1"},"1.3.6":{"num":"1.3.6","url":"https://www.w3.org/TR/WCAG22/#identify-purpose","scId":"WCAG2:identify-purpose","scAltId":[],"test":"WCAG2:identify-purpose","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#identify-purpose","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/identify-purpose.html","handle":"Identify Purpose","level":"AAA","wcagType":"2.1"},"1.4.1":{"num":"1.4.1","url":"https://www.w3.org/TR/WCAG22/#use-of-color","scId":"WCAG2:use-of-color","scAltId":["visual-audio-contrast-without-color"],"test":"WCAG2:visual-audio-contrast-without-color","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#use-of-color","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/use-of-color.html","handle":"Use of Color","level":"A","wcagType":"2.0"},"1.4.2":{"num":"1.4.2","url":"https://www.w3.org/TR/WCAG22/#audio-control","scId":"WCAG2:audio-control","scAltId":["visual-audio-contrast-dis-audio"],"test":"WCAG2:visual-audio-contrast-dis-audio","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-control","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-control.html","handle":"Audio Control","level":"A","wcagType":"2.0"},"1.4.3":{"num":"1.4.3","url":"https://www.w3.org/TR/WCAG22/#contrast-minimum","scId":"WCAG2:contrast-minimum","scAltId":["visual-audio-contrast-contrast"],"test":"WCAG2:visual-audio-contrast-contrast","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#contrast-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/contrast-minimum.html","handle":"Contrast (Minimum)","level":"AA","wcagType":"2.0"},"1.4.4":{"num":"1.4.4","url":"https://www.w3.org/TR/WCAG22/#resize-text","scId":"WCAG2:resize-text","scAltId":["visual-audio-contrast-scale"],"test":"WCAG2:visual-audio-contrast-scale","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#resize-text","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/resize-text.html","handle":"Resize text","level":"AA","wcagType":"2.0"},"1.4.5":{"num":"1.4.5","url":"https://www.w3.org/TR/WCAG22/#images-of-text","scId":"WCAG2:images-of-text","scAltId":["visual-audio-contrast-text-presentation"],"test":"WCAG2:visual-audio-contrast-text-presentation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#images-of-text","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/images-of-text.html","handle":"Images of Text","level":"AA","wcagType":"2.0"},"1.4.6":{"num":"1.4.6","url":"https://www.w3.org/TR/WCAG22/#contrast-enhanced","scId":"WCAG2:contrast-enhanced","scAltId":["visual-audio-contrast7"],"test":"WCAG2:visual-audio-contrast7","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#contrast-enhanced","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/contrast-enhanced.html","handle":"Contrast (Enhanced)","level":"AAA","wcagType":"2.0"},"1.4.7":{"num":"1.4.7","url":"https://www.w3.org/TR/WCAG22/#low-or-no-background-audio","scId":"WCAG2:low-or-no-background-audio","scAltId":["visual-audio-contrast-noaudio"],"test":"WCAG2:visual-audio-contrast-noaudio","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#low-or-no-background-audio","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/low-or-no-background-audio.html","handle":"Low or No Background Audio","level":"AAA","wcagType":"2.0"},"1.4.8":{"num":"1.4.8","url":"https://www.w3.org/TR/WCAG22/#visual-presentation","scId":"WCAG2:visual-presentation","scAltId":["visual-audio-contrast-visual-presentation"],"test":"WCAG2:visual-audio-contrast-visual-presentation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#visual-presentation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/visual-presentation.html","handle":"Visual Presentation","level":"AAA","wcagType":"2.0"},"1.4.9":{"num":"1.4.9","url":"https://www.w3.org/TR/WCAG22/#images-of-text-no-exception","scId":"WCAG2:images-of-text-no-exception","scAltId":["visual-audio-contrast-text-images"],"test":"WCAG2:visual-audio-contrast-text-images","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#images-of-text-no-exception","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/images-of-text-no-exception.html","handle":"Images of Text (No Exception)","level":"AAA","wcagType":"2.0"},"1.4.10":{"num":"1.4.10","url":"https://www.w3.org/TR/WCAG22/#reflow","scId":"WCAG2:reflow","scAltId":[],"test":"WCAG2:reflow","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#reflow","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/reflow.html","handle":"Reflow","level":"AA","wcagType":"2.1"},"1.4.11":{"num":"1.4.11","url":"https://www.w3.org/TR/WCAG22/#non-text-contrast","scId":"WCAG2:non-text-contrast","scAltId":[],"test":"WCAG2:non-text-contrast","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#non-text-contrast","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/non-text-contrast.html","handle":"Non-text Contrast","level":"AA","wcagType":"2.1"},"1.4.12":{"num":"1.4.12","url":"https://www.w3.org/TR/WCAG22/#text-spacing","scId":"WCAG2:text-spacing","scAltId":[],"test":"WCAG2:text-spacing","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#text-spacing","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/text-spacing.html","handle":"Text Spacing","level":"AA","wcagType":"2.1"},"1.4.13":{"num":"1.4.13","url":"https://www.w3.org/TR/WCAG22/#content-on-hover-or-focus","scId":"WCAG2:content-on-hover-or-focus","scAltId":[],"test":"WCAG2:content-on-hover-or-focus","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#content-on-hover-or-focus","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/content-on-hover-or-focus.html","handle":"Content on Hover or Focus","level":"AA","wcagType":"2.1"},"2.1.1":{"num":"2.1.1","url":"https://www.w3.org/TR/WCAG22/#keyboard","scId":"WCAG2:keyboard","scAltId":["keyboard-operation-keyboard-operable"],"test":"WCAG2:keyboard-operation-keyboard-operable","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#keyboard","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/keyboard.html","handle":"Keyboard","level":"A","wcagType":"2.0"},"2.1.2":{"num":"2.1.2","url":"https://www.w3.org/TR/WCAG22/#no-keyboard-trap","scId":"WCAG2:no-keyboard-trap","scAltId":["keyboard-operation-trapping"],"test":"WCAG2:keyboard-operation-trapping","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#no-keyboard-trap","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/no-keyboard-trap.html","handle":"No Keyboard Trap","level":"A","wcagType":"2.0"},"2.1.3":{"num":"2.1.3","url":"https://www.w3.org/TR/WCAG22/#keyboard-no-exception","scId":"WCAG2:keyboard-no-exception","scAltId":["keyboard-operation-all-funcs"],"test":"WCAG2:keyboard-operation-all-funcs","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#keyboard-no-exception","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/keyboard-no-exception.html","handle":"Keyboard (No Exception)","level":"AAA","wcagType":"2.0"},"2.1.4":{"num":"2.1.4","url":"https://www.w3.org/TR/WCAG22/#character-key-shortcuts","scId":"WCAG2:character-key-shortcuts","scAltId":[],"test":"WCAG2:WCAG2:character-key-shortcuts","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#character-key-shortcuts","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/character-key-shortcuts.html","handle":"Character Key Shortcuts","level":"A","wcagType":"2.1"},"2.2.1":{"num":"2.2.1","url":"https://www.w3.org/TR/WCAG22/#timing-adjustable","scId":"WCAG2:timing-adjustable","scAltId":["time-limits-required-behaviors"],"test":"WCAG2:time-limits-required-behaviors","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#timing-adjustable","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/timing-adjustable.html","handle":"Timing Adjustable","level":"A","wcagType":"2.0"},"2.2.2":{"num":"2.2.2","url":"https://www.w3.org/TR/WCAG22/#pause-stop-hide","scId":"WCAG2:pause-stop-hide","scAltId":["time-limits-pause"],"test":"WCAG2:time-limits-pause","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pause-stop-hide","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pause-stop-hide.html","handle":"Pause, Stop, Hide","level":"A","wcagType":"2.0"},"2.2.3":{"num":"2.2.3","url":"https://www.w3.org/TR/WCAG22/#no-timing","scId":"WCAG2:no-timing","scAltId":["time-limits-no-exceptions"],"test":"WCAG2:time-limits-no-exceptions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#no-timing","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/no-timing.html","handle":"No Timing","level":"AAA","wcagType":"2.0"},"2.2.4":{"num":"2.2.4","url":"https://www.w3.org/TR/WCAG22/#interruptions","scId":"WCAG2:interruptions","scAltId":["time-limits-postponed"],"test":"WCAG2:time-limits-postponed","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#interruptions","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/interruptions.html","handle":"Interruptions","level":"AAA","wcagType":"2.0"},"2.2.5":{"num":"2.2.5","url":"https://www.w3.org/TR/WCAG22/#re-authenticating","scId":"WCAG2:re-authenticating","scAltId":["time-limits-server-timeout"],"test":"WCAG2:time-limits-server-timeout","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#re-authenticating","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/re-authenticating.html","handle":"Re-authenticating","level":"AAA","wcagType":"2.0"},"2.2.6":{"num":"2.2.6","url":"https://www.w3.org/TR/WCAG22/#timeouts","scId":"WCAG2:timeouts","scAltId":[],"test":"WCAG2:WCAG2:timeouts","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#timeouts","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/timeouts.html","handle":"Timeouts","level":"AAA","wcagType":"2.1"},"2.3.1":{"num":"2.3.1","url":"https://www.w3.org/TR/WCAG22/#three-flashes-or-below-threshold","scId":"WCAG2:three-flashes-or-below-threshold","scAltId":["seizure-does-not-violate"],"test":"WCAG2:seizure-does-not-violate","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#three-flashes-or-below-threshold","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/three-flashes-or-below-threshold.html","handle":"Three Flashes or Below Threshold","level":"A","wcagType":"2.0"},"2.3.2":{"num":"2.3.2","url":"https://www.w3.org/TR/WCAG22/#three-flashes","scId":"WCAG2:three-flashes","scAltId":["seizure-three-times"],"test":"WCAG2:seizure-three-times","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#three-flashes","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/three-flashes.html","handle":"Three Flashes","level":"AAA","wcagType":"2.0"},"2.3.3":{"num":"2.3.3","url":"https://www.w3.org/TR/WCAG22/#animation-from-interactions","scId":"WCAG2:animation-from-interactions","scAltId":[],"test":"WCAG2:WCAG2:animation-from-interactions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#animation-from-interactions","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/animation-from-interactions.html","handle":"Animation from Interactions","level":"AAA","wcagType":"2.1"},"2.4.1":{"num":"2.4.1","url":"https://www.w3.org/TR/WCAG22/#bypass-blocks","scId":"WCAG2:bypass-blocks","scAltId":["navigation-mechanisms-skip"],"test":"WCAG2:navigation-mechanisms-skip","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#bypass-blocks","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/bypass-blocks.html","handle":"Bypass Blocks","level":"A","wcagType":"2.0"},"2.4.2":{"num":"2.4.2","url":"https://www.w3.org/TR/WCAG22/#page-titled","scId":"WCAG2:page-titled","scAltId":["navigation-mechanisms-title"],"test":"WCAG2:navigation-mechanisms-title","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#page-titled","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/page-titled.html","handle":"Page Titled","level":"A","wcagType":"2.0"},"2.4.3":{"num":"2.4.3","url":"https://www.w3.org/TR/WCAG22/#focus-order","scId":"WCAG2:focus-order","scAltId":["navigation-mechanisms-focus-order"],"test":"WCAG2:navigation-mechanisms-focus-order","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-order","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-order.html","handle":"Focus Order","level":"A","wcagType":"2.0"},"2.4.4":{"num":"2.4.4","url":"https://www.w3.org/TR/WCAG22/#link-purpose-in-context","scId":"WCAG2:link-purpose-in-context","scAltId":["navigation-mechanisms-refs"],"test":"WCAG2:navigation-mechanisms-refs","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#link-purpose-in-context","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/link-purpose-in-context.html","handle":"Link Purpose (In Context)","level":"A","wcagType":"2.0"},"2.4.5":{"num":"2.4.5","url":"https://www.w3.org/TR/WCAG22/#multiple-ways","scId":"WCAG2:multiple-ways","scAltId":["navigation-mechanisms-mult-loc"],"test":"WCAG2:navigation-mechanisms-mult-loc","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#multiple-ways","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/multiple-ways.html","handle":"Multiple Ways","level":"AA","wcagType":"2.0"},"2.4.6":{"num":"2.4.6","url":"https://www.w3.org/TR/WCAG22/#headings-and-labels","scId":"WCAG2:headings-and-labels","scAltId":["navigation-mechanisms-descriptive"],"test":"WCAG2:navigation-mechanisms-descriptive","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#headings-and-labels","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/headings-and-labels.html","handle":"Headings and Labels","level":"AA","wcagType":"2.0"},"2.4.7":{"num":"2.4.7","url":"https://www.w3.org/TR/WCAG22/#focus-visible","scId":"WCAG2:focus-visible","scAltId":["navigation-mechanisms-focus-visible"],"test":"WCAG2:navigation-mechanisms-focus-visible","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-visible","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-visible.html","handle":"Focus Visible","level":"AA","wcagType":"2.0"},"2.4.8":{"num":"2.4.8","url":"https://www.w3.org/TR/WCAG22/#location","scId":"WCAG2:location","scAltId":["navigation-mechanisms-location"],"test":"WCAG2:navigation-mechanisms-location","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#location","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/location.html","handle":"Location","level":"AAA","wcagType":"2.0"},"2.4.9":{"num":"2.4.9","url":"https://www.w3.org/TR/WCAG22/#link-purpose-link-only","scId":"WCAG2:link-purpose-link-only","scAltId":["navigation-mechanisms-link"],"test":"WCAG2:navigation-mechanisms-link","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#link-purpose-link-only","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/link-purpose-link-only.html","handle":"Link Purpose (Link Only)","level":"AAA","wcagType":"2.0"},"2.4.10":{"num":"2.4.10","url":"https://www.w3.org/TR/WCAG22/#section-headings","scId":"WCAG2:section-headings","scAltId":["navigation-mechanisms-headings"],"test":"WCAG2:navigation-mechanisms-headings","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#section-headings","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/section-headings.html","handle":"Section Headings","level":"AAA","wcagType":"2.0"},"2.4.11":{"num":"2.4.11","url":"https://www.w3.org/TR/WCAG22/#focus-not-obscured-minimum","scId":"WCAG2:focus-not-obscured-minimum","scAltId":["focus-not-obscured-minimum-alt"],"test":"WCAG2:focus-not-obscured-minimum-test","howToMeetUrl":"https://www.w3.org/TR/WCAG22/#focus-not-obscured-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-not-obscured-minimum.html","handle":"Focus Not Obscured (Minimum)","level":"AA","wcagType":"2.2"},"2.4.12":{"num":"2.4.12","url":"https://www.w3.org/TR/WCAG22/#focus-not-obscured-enhanced","scId":"WCAG2:focus-not-obscured-enhanced","scAltId":[],"test":"WCAG2:focus-not-obscured-enhanced-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-not-obscured-enhanced","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-not-obscured-enhanced.html","handle":"Focus Not Obscured (Enhanced)","level":"AAA","wcagType":"2.2"},"2.4.13":{"num":"2.4.13","url":"https://www.w3.org/TR/WCAG22/#focus-appearance","scId":"WCAG2:focus-appearance","scAltId":[],"test":"WCAG2:focus-appearance","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-appearance","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-appearance.html","handle":"Focus Appearance","level":"AAA","wcagType":"2.2"},"2.5.1":{"num":"2.5.1","url":"https://www.w3.org/TR/WCAG22/#pointer-gestures","scId":"WCAG2:pointer-gestures","scAltId":[],"test":"WCAG2:pointer-gestures-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pointer-gestures","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pointer-gestures.html","handle":"Pointer Gestures","level":"A","wcagType":"2.1"},"2.5.2":{"num":"2.5.2","url":"https://www.w3.org/TR/WCAG22/#pointer-cancellation","scId":"WCAG2:pointer-cancellation","scAltId":[],"test":"WCAG2:WCAG2:pointer-cancellation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pointer-cancellation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pointer-cancellation.html","handle":"Pointer Cancellation","level":"A","wcagType":"2.1"},"2.5.3":{"num":"2.5.3","url":"https://www.w3.org/TR/WCAG22/#label-in-name","scId":"WCAG2:label-in-name","scAltId":[],"test":"WCAG2:WCAG2:label-in-name","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#label-in-name","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/label-in-name.html","handle":"Label in Name","level":"A","wcagType":"2.1"},"2.5.4":{"num":"2.5.4","url":"https://www.w3.org/TR/WCAG22/#motion-actuation","scId":"WCAG2:motion-actuation","scAltId":[],"test":"WCAG2:WCAG2:motion-actuation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#motion-actuation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/motion-actuation.html","handle":"Motion Actuation","level":"A","wcagType":"2.1"},"2.5.5":{"num":"2.5.5","url":"https://www.w3.org/TR/WCAG22/#target-size","scId":"WCAG2:target-size","scAltId":[],"test":"WCAG2:WCAG2:target-size","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#target-size","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/target-size.html","handle":"Target Size","level":"AAA","wcagType":"2.1"},"2.5.6":{"num":"2.5.6","url":"https://www.w3.org/TR/WCAG22/#concurrent-input-mechanisms","scId":"WCAG2:concurrent-input-mechanisms","scAltId":[],"test":"WCAG2:WCAG2:concurrent-input-mechanisms","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#concurrent-input-mechanisms","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/concurrent-input-mechanisms.html","handle":"Concurrent Input Mechanisms","level":"AAA","wcagType":"2.1"},"2.5.7":{"num":"2.5.7","url":"https://www.w3.org/TR/WCAG22/#dragging-movements","scId":"WCAG2:dragging-movement","scAltId":["dragging-movement-alt"],"test":"WCAG2:dragging-movement-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/Understanding/dragging-movements.html","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/dragging-movements.html","handle":"Dragging Movement","level":"AA","wcagType":"2.2"},"2.5.8":{"num":"2.5.8","url":"https://www.w3.org/TR/WCAG22/#target-size-minimum","scId":"WCAG2:minimum-target-size","scAltId":["minimum-target-size-alt"],"test":"WCAG2:minimum-target-size-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#target-size-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/target-size-minimum.html","handle":"Minimum Target Size","level":"AA","wcagType":"2.2"},"3.1.1":{"num":"3.1.1","url":"https://www.w3.org/TR/WCAG22/#language-of-page","scId":"WCAG2:language-of-page","scAltId":["meaning-doc-lang-id"],"test":"WCAG2:meaning-doc-lang-id","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#language-of-page","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/language-of-page.html","handle":"Language of Page","level":"A","wcagType":"2.0"},"3.1.2":{"num":"3.1.2","url":"https://www.w3.org/TR/WCAG22/#language-of-parts","scId":"WCAG2:language-of-parts","scAltId":["meaning-other-lang-id"],"test":"WCAG2:meaning-other-lang-id","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#language-of-parts","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/language-of-parts.html","handle":"Language of Parts","level":"AA","wcagType":"2.0"},"3.1.3":{"num":"3.1.3","url":"https://www.w3.org/TR/WCAG22/#unusual-words","scId":"WCAG2:unusual-words","scAltId":["meaning-idioms"],"test":"WCAG2:meaning-idioms","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#unusual-words","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/unusual-words.html","handle":"Unusual Words","level":"AAA","wcagType":"2.0"},"3.1.4":{"num":"3.1.4","url":"https://www.w3.org/TR/WCAG22/#abbreviations","scId":"WCAG2:abbreviations","scAltId":["meaning-located"],"test":"WCAG2:meaning-located","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#abbreviations","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/abbreviations.html","handle":"Abbreviations","level":"AAA","wcagType":"2.0"},"3.1.5":{"num":"3.1.5","url":"https://www.w3.org/TR/WCAG22/#reading-level","scId":"WCAG2:reading-level","scAltId":["meaning-supplements"],"test":"WCAG2:meaning-supplements","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#reading-level","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/reading-level.html","handle":"Reading Level","level":"AAA","wcagType":"2.0"},"3.1.6":{"num":"3.1.6","url":"https://www.w3.org/TR/WCAG22/#pronunciation","scId":"WCAG2:pronunciation","scAltId":["meaning-pronunciation"],"test":"WCAG2:meaning-pronunciation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pronunciation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pronunciation.html","handle":"Pronunciation","level":"AAA","wcagType":"2.0"},"3.2.1":{"num":"3.2.1","url":"https://www.w3.org/TR/WCAG22/#on-focus","scId":"WCAG2:on-focus","scAltId":["consistent-behavior-receive-focus"],"test":"WCAG2:consistent-behavior-receive-focus","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#on-focus","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/on-focus.html","handle":"On Focus","level":"A","wcagType":"2.0"},"3.2.2":{"num":"3.2.2","url":"https://www.w3.org/TR/WCAG22/#on-input","scId":"WCAG2:on-input","scAltId":["consistent-behavior-unpredictable-change"],"test":"WCAG2:consistent-behavior-unpredictable-change","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#on-input","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/on-input.html","handle":"On Input","level":"A","wcagType":"2.0"},"3.2.3":{"num":"3.2.3","url":"https://www.w3.org/TR/WCAG22/#consistent-navigation","scId":"WCAG2:consistent-navigation","scAltId":["consistent-behavior-consistent-locations"],"test":"WCAG2:consistent-behavior-consistent-locations","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#consistent-navigation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/consistent-navigation.html","handle":"Consistent Navigation","level":"AA","wcagType":"2.0"},"3.2.4":{"num":"3.2.4","url":"https://www.w3.org/TR/WCAG22/#consistent-identification","scId":"WCAG2:consistent-identification","scAltId":["consistent-behavior-consistent-functionality"],"test":"WCAG2:consistent-behavior-consistent-functionality","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#consistent-identification","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/consistent-identification.html","handle":"Consistent Identification","level":"AA","wcagType":"2.0"},"3.2.5":{"num":"3.2.5","url":"https://www.w3.org/TR/WCAG22/#change-on-request","scId":"WCAG2:change-on-request","scAltId":["consistent-behavior-no-extreme-changes-context"],"test":"WCAG2:consistent-behavior-no-extreme-changes-context","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#change-on-request","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/change-on-request.html","handle":"Change on Request","level":"AAA","wcagType":"2.0"},"3.2.6":{"num":"3.2.6","url":"https://www.w3.org/TR/WCAG22/#consistent-help","scId":"WCAG2:consistent-help","scAltId":["consistent-help-alt"],"test":"WCAG2:consistent-help-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#consistent-help","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/consistent-help.html","handle":"Consistent Help","level":"AA","wcagType":"2.2"},"3.3.1":{"num":"3.3.1","url":"https://www.w3.org/TR/WCAG22/#error-identification","scId":"WCAG2:error-identification","scAltId":["minimize-error-identified"],"test":"WCAG2:minimize-error-identified","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-identification","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-identification.html","handle":"Error Identification","level":"A","wcagType":"2.0"},"3.3.2":{"num":"3.3.2","url":"https://www.w3.org/TR/WCAG22/#labels-or-instructions","scId":"WCAG2:labels-or-instructions","scAltId":["minimize-error-cues"],"test":"WCAG2:minimize-error-cues","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#labels-or-instructions","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/labels-or-instructions.html","handle":"Labels or Instructions","level":"A","wcagType":"2.0"},"3.3.3":{"num":"3.3.3","url":"https://www.w3.org/TR/WCAG22/#error-suggestion","scId":"WCAG2:error-suggestion","scAltId":["minimize-error-suggestions"],"test":"WCAG2:minimize-error-suggestions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-suggestion","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-suggestion.html","handle":"Error Suggestion","level":"AA","wcagType":"2.0"},"3.3.4":{"num":"3.3.4","url":"https://www.w3.org/TR/WCAG22/#error-prevention-legal-financial-data","scId":"WCAG2:error-prevention-legal-financial-data","scAltId":["minimize-error-reversible"],"test":"WCAG2:minimize-error-reversible","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-prevention-legal-financial-data","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-prevention-legal-financial-data.html","handle":"Error Prevention (Legal, Financial, Data)","level":"AA","wcagType":"2.0"},"3.3.5":{"num":"3.3.5","url":"https://www.w3.org/TR/WCAG22/#help","scId":"WCAG2:help","scAltId":["minimize-error-context-help"],"test":"WCAG2:minimize-error-context-help","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#help","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/help.html","handle":"Help","level":"AAA","wcagType":"2.0"},"3.3.6":{"num":"3.3.6","url":"https://www.w3.org/TR/WCAG22/#error-prevention-all","scId":"WCAG2:error-prevention-all","scAltId":["minimize-error-reversible-all"],"test":"WCAG2:minimize-error-reversible-all","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-prevention-all","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-prevention-all.html","handle":"Error Prevention (All)","level":"AAA","wcagType":"2.0"},"3.3.7":{"num":"3.3.7","url":"https://www.w3.org/TR/WCAG22/#redundant-entry","scId":"WCAG2:redundant-entry","scAltId":["redundant-entry-alt"],"test":"WCAG2:redundant-entry-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#redundant-entry","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/redundant-entry.html","handle":"Redundant Entry","level":"AA","wcagType":"2.2"},"3.3.8":{"num":"3.3.8","url":"https://www.w3.org/TR/WCAG22/#accessible-authentication-minimum","scId":"WCAG2:accessible-authentication-minimum","scAltId":["accessible-authentication-minimum-alt"],"test":"WCAG2:accessible-authentication-minimum-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#accessible-authentication-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/accessible-authentication-minimum.html","handle":"Accessible Authentication (Minimum)","level":"AA","wcagType":"2.2"},"3.3.9":{"num":"3.3.9","url":"https://www.w3.org/TR/WCAG22/#accessible-authentication-enhanced","scId":"WCAG2:accessible-authentication-enhanced","scAltId":[],"test":"WCAG2:accessible-authentication-enhanced","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#accessible-authentication-enhanced","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/accessible-authentication-enhanced.html","handle":"Accessible Authentication (Enhanced)","level":"AAA","wcagType":"2.2"},"4.1.1":{"num":"4.1.1","url":"https://www.w3.org/TR/WCAG22/#parsing","scId":"WCAG2:parsing","scAltId":["ensure-compat-parses"],"test":"WCAG2:ensure-compat-parses","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/?versions=2.1#parsing","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/parsing.html","handle":"Parsing","level":"A","wcagType":"2.0"},"4.1.2":{"num":"4.1.2","url":"https://www.w3.org/TR/WCAG22/#name-role-value","scId":"WCAG2:name-role-value","scAltId":["ensure-compat-rsv"],"test":"WCAG2:ensure-compat-rsv","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#name-role-value","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/name-role-value.html","handle":"Name, Role, Value","level":"A","wcagType":"2.0"},"4.1.3":{"num":"4.1.3","url":"https://www.w3.org/TR/WCAG22/#status-messages","scId":"WCAG2:status-messages","scAltId":[],"test":"WCAG2:status-messages","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#status-messages","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/status-messages.html","handle":"Status Messages","level":"AA","wcagType":"2.1"},"HTML":{"num":"HTML","url":"https://html.spec.whatwg.org/multipage/","scId":"","scAltId":[],"test":"","howToMeetUrl":"https://html.spec.whatwg.org/multipage/","understandingUrl":"https://html.spec.whatwg.org/multipage/","handle":"specification","level":"NA","wcagType":"NA"},"ARIA":{"num":"ARIA","url":"https://www.w3.org/TR/wai-aria-1.2/","scId":"","scAltId":[],"test":"","howToMeetUrl":"https://www.w3.org/TR/wai-aria-1.2/","understandingUrl":"https://www.w3.org/TR/wai-aria-1.2/","handle":"specification","level":"NA","wcagType":"NA"}}'); + +/***/ } + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ const __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ const cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ const module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ if (!(moduleId in __webpack_modules__)) { +/******/ delete __webpack_module_cache__[moduleId]; +/******/ const e = new Error("Cannot find module '" + moduleId + "'"); +/******/ e.code = 'MODULE_NOT_FOUND'; +/******/ throw e; +/******/ } +/******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +let __webpack_exports__ = {}; +// This entry needs to be wrapped in an IIFE because it needs to be isolated against other modules in the chunk. +(() => { +let exports = __webpack_exports__; +/*!**********************!*\ + !*** ./src/index.ts ***! + \**********************/ + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.checkDemo = exports.SRViewer = exports.SRCursor = exports.SRController = exports.DOMWalker = exports.Config = exports.ARIAMapper = exports.Checker = exports.Context = void 0; +var Context_1 = __webpack_require__(/*! ./v2/common/Context */ "./src/v2/common/Context.ts"); +Object.defineProperty(exports, "Context", ({ enumerable: true, get: function () { return Context_1.Context; } })); +// import { Simulator } from "./v2/simulator" +var Checker_1 = __webpack_require__(/*! ./v4/checker/Checker */ "./src/v4/checker/Checker.ts"); +Object.defineProperty(exports, "Checker", ({ enumerable: true, get: function () { return Checker_1.Checker; } })); +var ARIAMapper_1 = __webpack_require__(/*! ./v2/aria/ARIAMapper */ "./src/v2/aria/ARIAMapper.ts"); +Object.defineProperty(exports, "ARIAMapper", ({ enumerable: true, get: function () { return ARIAMapper_1.ARIAMapper; } })); +var Config_1 = __webpack_require__(/*! ./v2/config/Config */ "./src/v2/config/Config.ts"); +Object.defineProperty(exports, "Config", ({ enumerable: true, get: function () { return Config_1.Config; } })); +var DOMWalker_1 = __webpack_require__(/*! ./v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +Object.defineProperty(exports, "DOMWalker", ({ enumerable: true, get: function () { return DOMWalker_1.DOMWalker; } })); +var SRController_1 = __webpack_require__(/*! ./v4/simulator/SRController */ "./src/v4/simulator/SRController.ts"); +Object.defineProperty(exports, "SRController", ({ enumerable: true, get: function () { return SRController_1.SRController; } })); +var SRCursor_1 = __webpack_require__(/*! ./v4/simulator/SRCursor */ "./src/v4/simulator/SRCursor.ts"); +Object.defineProperty(exports, "SRCursor", ({ enumerable: true, get: function () { return SRCursor_1.SRCursor; } })); +var SRViewer_1 = __webpack_require__(/*! ./v4/simulator/SRViewer */ "./src/v4/simulator/SRViewer.ts"); +Object.defineProperty(exports, "SRViewer", ({ enumerable: true, get: function () { return SRViewer_1.SRViewer; } })); +function checkDemo(timeout) { + if (!timeout) + timeout = 0; + var checker = new Checker_1.Checker(); + setTimeout(function () { + checker.check(document.documentElement, ["IBM_Accessibility", "IBM_Design"]) + .then(function (report) { + console.log(report); + var vals = { + "FAIL": 0, + "POTENTIAL": 1, + "MANUAL": 2, + "PASS": 3 + }; + for (var idx = 0; idx < report.results.length; ++idx) { + if (report.results[idx].value[1] === "PASS") { + report.results.splice(idx--, 1); + } + } + report.results.sort(function (a, b) { + if (a.category != b.category) { + return a.category.localeCompare(b.category); + } + if (a.path["aria"] === b.path["aria"]) { + return vals[a.value[1]] - vals[b.value[1]]; + } + return a.path["aria"].localeCompare(b.path["aria"]); + }); + var lastPath = null; + var category = null; + for (var _i = 0, _a = report.results; _i < _a.length; _i++) { + var result = _a[_i]; + if (category !== result.category) { + if (category !== null) { + console.groupEnd(); + console.groupEnd(); + lastPath = null; + } + category = result.category; + console.group(result.category); + } + if (result.path["aria"] != lastPath) { + if (lastPath !== null) { + console.groupEnd(); + } + lastPath = result.path["aria"]; + if (lastPath === "") { + console.group("page"); + } + else { + console.group(lastPath); + } + } + console.log(result.value, result.message); + } + console.groupEnd(); + console.groupEnd(); + }); + }, timeout); +} +exports.checkDemo = checkDemo; + +})(); + +ace = __webpack_exports__; +/******/ })() +; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,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LEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQzdtRyxDQUFFLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDeDFILENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUM3aUUsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUM1ekQsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDenhCLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDM2pCLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDeGtFLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQ25xQyxDQUFFLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQ2xsQyxDQUFFLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDeDFCLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUMzNUgsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDempFLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUN2MUgsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUMzK0YsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQy9pQyxDQUFFLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQy9uRSxDQUFFLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDblcsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUMzOUIsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDN3BHLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUN4cUcsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUN4eUIsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDbmpCLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQ2gzQyxDQUFFLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDbjVELENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQzE4QyxDQUFFLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0NBQzdtQyxDQUFDO0FBR0Y7SUFBQTtJQXFDQSxDQUFDO0lBbkNHLHdEQUF3RDtJQUMxQyxnQkFBTyxHQUFyQixVQUFzQixPQUFlO1FBQ2pD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LENBQUMsR0FBRyxJQUFJLE1BQU0sQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLEdBQUcsSUFBSSxNQUFNLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLEdBQUcsR0FBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7bUJBQ2xLLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7bUJBQzNJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsSUFBSSxNQUFNLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7dUJBQ3JJLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLE1BQU0sQ0FB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LENBQUMsTUFBTSxDQUFDLENBQUM7cUJBQ3pCO3lCQUFNO3dCQUNILE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7cUJBQzNCO2lCQUNKO2dCQUNELE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDN0M7WUFDRCxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbkIsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3ZCLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ2hCLENBQUM7QUF4REQsOEJBd0RDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3YyL2FyaWEvQVJJQURlZmluaXRpb25zLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92Mi9hcmlhL0FSSUFNYXBwZXIudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3YyL2FyaWEvQVJJQVdhbGtlci50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvYW5jZXN0b3IudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sYW5nLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92Mi9jb21tb24vQ29tbW9uTWFwcGVyLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92Mi9jb21tb24vQ29udGV4dC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjIvY29tbW9uL0VuZ2luZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjIvY29uZmlnL0NvbmZpZy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjIvZG9tL0RPTU1hcHBlci50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjIvZG9tL0RPTVV0aWwudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3YyL2RvbS9ET01XYWxrZXIudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L2FwaS9JR3VpZGVsaW5lLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9hcGkvSVJ1bGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L2NoZWNrZXIvQ2hlY2tlci50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYV90YXJnZXRfd2FybmluZy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYV90ZXh0X3B1cnBvc2UudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FwcGxldF9hbHRfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcHBsaWNhdGlvbl9jb250ZW50X2FjY2Vzc2libGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyZWFfYWx0X2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9hY2Nlc3NpYmxlbmFtZV9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfYWN0aXZlZGVzY2VuZGFudF90YWJpbmRleF92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9hY3RpdmVkZXNjZW5kYW50X3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2FwcGxpY2F0aW9uX2xhYmVsX3VuaXF1ZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9hcHBsaWNhdGlvbl9sYWJlbGxlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9hcnRpY2xlX2xhYmVsX3VuaXF1ZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9hdHRyaWJ1dGVfYWxsb3dlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9hdHRyaWJ1dGVfY29uZmxpY3QudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfYXR0cmlidXRlX2RlcHJlY2F0ZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfYXR0cmlidXRlX2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9hdHRyaWJ1dGVfcmVkdW5kYW50LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2F0dHJpYnV0ZV9yZXF1aXJlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9hdHRyaWJ1dGVfdmFsdWVfdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfYmFubmVyX2xhYmVsX3VuaXF1ZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9iYW5uZXJfc2luZ2xlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2NoaWxkX3RhYmJhYmxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2NoaWxkX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxfdW5pcXVlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxfdmlzaWJsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsbGVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2NvbnRlbnRfaW5fbGFuZG1hcmsudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfY29udGVudGluZm9fbGFiZWxfdW5pcXVlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2NvbnRlbnRpbmZvX21pc3VzZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9jb250ZW50aW5mb19zaW5nbGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfZGVzY2VuZGFudF92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9kb2N1bWVudF9sYWJlbF91bmlxdWUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfZXZlbnRoYW5kbGVyX3JvbGVfdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfZm9ybV9sYWJlbF91bmlxdWUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfZ3JhcGhpY19sYWJlbGxlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9oaWRkZW5fbm9udGFiYmFibGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfaWRfdW5pcXVlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2ltZ19sYWJlbGxlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9rZXlib2FyZF9oYW5kbGVyX2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9sYW5kbWFya19uYW1lX3VuaXF1ZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9tYWluX2xhYmVsX3VuaXF1ZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9tYWluX2xhYmVsX3Zpc2libGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfbmF2aWdhdGlvbl9sYWJlbF91bmlxdWUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfcGFyZW50X3JlcXVpcmVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX3JlZ2lvbl9sYWJlbF91bmlxdWUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfcmVnaW9uX2xhYmVsbGVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX3JvbGVfYWxsb3dlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9yb2xlX3JlZHVuZGFudC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9zZWFyY2hfbGFiZWxfdW5pcXVlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX3NlbWFudGljcy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV90b29sYmFyX2xhYmVsX3VuaXF1ZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV93aWRnZXRfbGFiZWxsZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FzY2lpYXJ0X2FsdF9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2JsaW5rX2Nzc19yZXZpZXcudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2JsaW5rX2VsZW1fZGVwcmVjYXRlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYmxvY2txdW90ZV9jaXRlX2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvY2FudmFzX2NvbnRlbnRfZGVzY3JpYmVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9jYXB0aW9uX3RyYWNrX2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvY29tYm9ib3hfYWN0aXZlX2Rlc2NlbmRhbnQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2NvbWJvYm94X2F1dG9jb21wbGV0ZV92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvY29tYm9ib3hfZGVzaWduX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9jb21ib2JveF9mb2N1c2FibGVfZWxlbWVudHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2NvbWJvYm94X2hhc3BvcHVwX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9jb21ib2JveF9wb3B1cF9yZWZlcmVuY2UudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2RlYnVnX3BhdGhzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9kZXRlY3Rvcl90YWJiYWJsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZGlyX2F0dHJpYnV0ZV92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZG93bmxvYWRfa2V5Ym9hcmRfY29udHJvbGxhYmxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9kcmFnZ2FibGVfYWx0ZXJuYXRpdmVfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9lbGVtZW50X2FjY2Vzc2tleV9sYWJlbGxlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZWxlbWVudF9hY2Nlc3NrZXlfdW5pcXVlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9lbGVtZW50X2F0dHJpYnV0ZV9kZXByZWNhdGVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9lbGVtZW50X2lkX3VuaXF1ZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZWxlbWVudF9sYW5nX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9lbGVtZW50X21vdXNlZXZlbnRfa2V5Ym9hcmQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2VsZW1lbnRfb3JpZW50YXRpb25fdW5sb2NrZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2VsZW1lbnRfc2Nyb2xsYWJsZV90YWJiYWJsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZWxlbWVudF90YWJiYWJsZV9yb2xlX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9lbGVtZW50X3RhYmJhYmxlX3Vub2JzY3VyZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2VsZW1lbnRfdGFiYmFibGVfdmlzaWJsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZW1iZWRfYWx0X2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZW1vdGljb25zX2FsdF9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2Vycm9yX21lc3NhZ2VfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9maWVsZHNldF9sYWJlbF92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZmllbGRzZXRfbGVnZW5kX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9maWd1cmVfbGFiZWxfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9mb3JtX2ZvbnRfY29sb3IudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2Zvcm1faW50ZXJhY3Rpb25fcmV2aWV3LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9mb3JtX2xhYmVsX3VuaXF1ZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZm9ybV9zdWJtaXRfYnV0dG9uX2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZm9ybV9zdWJtaXRfcmV2aWV3LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9mcmFtZV9zcmNfdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2ZyYW1lX3RpdGxlX2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaGVhZGluZ19jb250ZW50X2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaGVhZGluZ19tYXJrdXBfbWlzdXNlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9odG1sX2xhbmdfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9odG1sX3NraXBuYXZfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pZnJhbWVfaW50ZXJhY3RpdmVfdGFiYmFibGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2ltYWdlYnV0dG9uX2FsdF9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2ltYWdlbWFwX2FsdF9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2ltZ19hbHRfYmFja2dyb3VuZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW1nX2FsdF9kZWNvcmF0aXZlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pbWdfYWx0X21pc3VzZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW1nX2FsdF9udWxsLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pbWdfYWx0X3JlZHVuZGFudC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW1nX2FsdF92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW1nX2lzbWFwX21pc3VzZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW1nX2xvbmdkZXNjX21pc3VzZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2lucHV0X2F1dG9jb21wbGV0ZV92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW5wdXRfY2hlY2tib3hlc19ncm91cGVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pbnB1dF9maWVsZHNfZ3JvdXBlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW5wdXRfaGFzcG9wdXBfY29uZmxpY3QudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2lucHV0X2xhYmVsX2FmdGVyLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pbnB1dF9sYWJlbF9iZWZvcmUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2lucHV0X2xhYmVsX2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW5wdXRfbGFiZWxfdmlzaWJsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW5wdXRfb25jaGFuZ2VfcmV2aWV3LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pbnB1dF9wbGFjZWhvbGRlcl9sYWJlbF92aXNpYmxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9sYWJlbF9jb250ZW50X2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvbGFiZWxfbmFtZV92aXNpYmxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9sYWJlbF9yZWZfdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2xpc3RfY2hpbGRyZW5fdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2xpc3RfbWFya3VwX3Jldmlldy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvbGlzdF9zdHJ1Y3R1cmVfcHJvcGVyLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9tYXJxdWVlX2VsZW1fYXZvaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL21lZGlhX2FsdF9icmllZi50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvbWVkaWFfYWx0X2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvbWVkaWFfYXVkaW9fdHJhbnNjcmliZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL21lZGlhX2F1dG9zdGFydF9jb250cm9sbGFibGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL21lZGlhX2tleWJvYXJkX2NvbnRyb2xsYWJsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvbWVkaWFfbGl2ZV9jYXB0aW9uZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL21lZGlhX3RyYWNrX2F2YWlsYWJsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvbWV0YV9yZWRpcmVjdF9vcHRpb25hbC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvbWV0YV9yZWZyZXNoX2RlbGF5LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9tZXRhX3ZpZXdwb3J0X3pvb21hYmxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9ub2VtYmVkX2NvbnRlbnRfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9vYmplY3RfdGV4dF9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3BhZ2VfdGl0bGVfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9wYWdlX3RpdGxlX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9zY3JpcHRfZm9jdXNfYmx1cl9yZXZpZXcudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3NjcmlwdF9vbmNsaWNrX2F2b2lkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9zY3JpcHRfb25jbGlja19taXN1c2UudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3NjcmlwdF9zZWxlY3RfcmV2aWV3LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9zZWxlY3Rfb3B0aW9uc19ncm91cGVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9za2lwX21haW5fZGVzY3JpYmVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9za2lwX21haW5fZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9zdHlsZV9iYWNrZ3JvdW5kX2RlY29yYXRpdmUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3N0eWxlX2JlZm9yZV9hZnRlcl9yZXZpZXcudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3N0eWxlX2NvbG9yX21pc3VzZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvc3R5bGVfZm9jdXNfdmlzaWJsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvc3R5bGVfaGlnaGNvbnRyYXN0X3Zpc2libGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3N0eWxlX2hvdmVyX3BlcnNpc3RlbnQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3N0eWxlX3ZpZXdwb3J0X3Jlc2l6YWJsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvc3ZnX2dyYXBoaWNzX2xhYmVsbGVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy90YWJsZV9hcmlhX2Rlc2NlbmRhbnRzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy90YWJsZV9jYXB0aW9uX2VtcHR5LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy90YWJsZV9jYXB0aW9uX25lc3RlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvdGFibGVfaGVhZGVyc19leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3RhYmxlX2hlYWRlcnNfcmVmX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy90YWJsZV9oZWFkZXJzX3JlbGF0ZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3RhYmxlX2xheW91dF9saW5lYXJpemVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy90YWJsZV9zY29wZV92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvdGFibGVfc3RydWN0dXJlX21pc3VzZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvdGFibGVfc3VtbWFyeV9yZWR1bmRhbnQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3RhcmdldF9zcGFjaW5nX3N1ZmZpY2llbnQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3RleHRfYmxvY2tfaGVhZGluZy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvdGV4dF9jb250cmFzdF9zdWZmaWNpZW50LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy90ZXh0X3F1b3RlZF9jb3JyZWN0bHkudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3RleHRfc2Vuc29yeV9taXN1c2UudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3RleHRfc3BhY2luZ192YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvdGV4dF93aGl0ZXNwYWNlX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy93aWRnZXRfdGFiYmFibGVfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy93aWRnZXRfdGFiYmFibGVfc2luZ2xlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlc2V0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvc2ltdWxhdG9yL1NSQ29udHJvbGxlci50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvc2ltdWxhdG9yL1NSQ3Vyc29yLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9zaW11bGF0b3IvU1JOYXZpZ2F0b3IudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3NpbXVsYXRvci9TUlJlbmRlcmVyLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9zaW11bGF0b3IvU1JSZW5kZXJlclJ1bGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3NpbXVsYXRvci9TUlRhYmxlVXRpbC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvc2ltdWxhdG9yL1NSVXRpbC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvc2ltdWxhdG9yL1NSVmlld2VyLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9zaW11bGF0b3IvcmVuZGVyX3J1bGVzL2NvbW1vbi50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvc2ltdWxhdG9yL3JlbmRlcl9ydWxlcy9jb250YWluZXJfZW50ZXIudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3NpbXVsYXRvci9yZW5kZXJfcnVsZXMvY29udGFpbnRlcl9leGl0LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9zaW11bGF0b3IvcmVuZGVyX3J1bGVzL2luZGV4LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC91dGlsL0FjY05hbWVVdGlsLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC91dGlsL0FyaWFVdGlsLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC91dGlsL0NTU1V0aWwudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3V0aWwvQ2FjaGVVdGlsLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC91dGlsL0NsaXBQYXRoVXRpbC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvdXRpbC9Db2xvclV0aWwudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3V0aWwvQ29tbW9uVXRpbC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvdXRpbC9UYWJsZVV0aWwudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3V0aWwvVmlzVXRpbC50cyIsIndlYnBhY2s6Ly9hY2Uvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMC0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuLypnbG9iYWwgT3BlbkFqYXgqL1xuLy8gYWxsIHJlZmVyZW5jZXMgdG8gV0FJLUFSSUEgc3BlY2lmaWNhdGlvbiBpcyB0aGUgV0FJLUFSSUEgMS4yXG4vLyBodHRwczovL3d3dy53My5vcmcvVFIvd2FpLWFyaWEtMS4yL1xuXG5leHBvcnQgdHlwZSBJRG9jdW1lbnRDb25mb3JtYW5jZVJlcXVpcmVtZW50ID0ge1xuICAgIGltcGxpY2l0Um9sZTogc3RyaW5nW10sXG4gICAgdmFsaWRSb2xlczogc3RyaW5nW10sXG4gICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogYm9vbGVhbixcbiAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlcz86IHN0cmluZ1tdLCBcbiAgICBvdGhlckRpc2FsbG93ZWRBcmlhQXR0cmlidXRlcz86IHN0cmluZ1tdLFxuICAgIG90aGVyUm9sZXNGb3JBdHRyaWJ1dGVzPzogc3RyaW5nW10sIC8vcm9sZXMsIG90aGVyIHRoYW4gaW1wbGljaXQgYW5kIHZhbGlkIHJvbGVzLCB3aG9zZSBhdHRyaWJ1dGVzIGFyZSBhbHNvIGFsbG93ZWRcbiAgICAvLyBhIGZldyBlbGVtZW50cyAoc3VjaCBhcyBkYXRhbGlzdCwgaHRtbCwgY2FwdGlvbikgdGhhdCBoYXZlIGFuIGltcGxpY2l0IHJvbGUgYnV0IGRpc2FsbG93IHNvbWUgb3IgYWxsIGF0dHJpYnV0ZXMgYWxsb3dlZCBmb3IgdGhlIHJvbGUuXG4gICAgYWxsb3dBdHRyaWJ1dGVzRnJvbUltcGxpY2l0Um9sZT86IGJvb2xlYW4sXG4gICAgcHJvaGliaXRlZEFyaWFBdHRyaWJ1dGVzV2hlbk5vSW1wbGljaXRSb2xlPzogc3RyaW5nW10gIC8vc29tZSBlbGVtZW50cyAodmFyLGFiYnIgZXRjLikgaGF2ZSBubyBpbXBsaWNpdCByb2xlIGJ1dCBuYW1pbmcgcHJvaGliaXRlZCAgIFxufVxuXG5leHBvcnQgY2xhc3MgQVJJQURlZmluaXRpb25zIHtcbiAgICBzdGF0aWMgbmFtZUZyb21Db250ZW50KHJvbGU6IHN0cmluZykgOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIChyb2xlIGluIEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJucykgXG4gICAgICAgICAgICAmJiBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNbcm9sZV0ubmFtZUZyb20gXG4gICAgICAgICAgICAmJiBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNbcm9sZV0ubmFtZUZyb20uaW5jbHVkZXMoXCJjb250ZW50c1wiKTtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIGFycmF5IG9mIFdBSS1BUklBIGdsb2JhbCBzdGF0ZXMgYW5kIHByb3BlcnRpZXNcbiAgICAgKiBAc2VlIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93YWktYXJpYS0xLjIvI2dsb2JhbF9zdGF0ZXNcbiAgICAgKi9cbiAgICBzdGF0aWMgZ2xvYmFsUHJvcGVydGllcyA6IHN0cmluZ1tdID0gW1wiYXJpYS1hdG9taWNcIiwgXCJhcmlhLWJ1c3lcIiwgXCJhcmlhLWNvbnRyb2xzXCIsIFwiYXJpYS1jdXJyZW50XCIsIFwiYXJpYS1kZXNjcmliZWRieVwiLCBcbiAgICAgICAgXCJhcmlhLWRldGFpbHNcIiwgXCJhcmlhLWZsb3d0b1wiLCBcImFyaWEtaGlkZGVuXCIsIFwiYXJpYS1rZXlzaG9ydGN1dHNcIixcbiAgICAgICAgXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCIsIFwiYXJpYS1saXZlXCIsIFwiYXJpYS1vd25zXCIsIFwiYXJpYS1yZWxldmFudFwiLCBcImFyaWEtcm9sZWRlc2NyaXB0aW9uXCJcbiAgICAgICAgLy8gdGhlIGZvbGxvd2luZyBhcmUgZGVwcmVjYXRlZCBpbiBBUklBIDEuMiwgd2lsbCBpbmRpY2F0ZSBkZXByZWNhdGlvbiBpbiBpbmRpdmlkdWFsIHJvbGVcbiAgICAgICAgLCAnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCdcbiAgICBdO1xuXG4gICAgLy9wcm9wZXJ0aWVzIGNvbnRhaW5zIGlkKHMpIHRoYXQgcmVmZXIgdG8gb3RoZXIgZWxlbWVudChzKVxuICAgIHN0YXRpYyByZWZlcmVuY2VQcm9wZXJ0aWVzIDogc3RyaW5nW10gPSBbXCJhcmlhLW93bnNcIiwgXCJhcmlhLWNvbnRyb2xzXCIsIFwiYXJpYS1kZXNjcmliZWRieVwiLCBcImFyaWEtbGFiZWxsZWRieVwiLCBcImFyaWEtZmxvd3RvXCIsIFwiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCJdO1xuXG4gICAgLy8gZGVwcmVjYXRlZCByb2xlc1xuICAgIHN0YXRpYyBnbG9iYWxEZXByZWNhdGVkUm9sZXMgOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgJ2RpcmVjdG9yeScsICdkb2MtYmlibGlvZW50cnknLCAnZG9jLWVuZG5vdGUnXG4gICAgXTtcblxuICAgIC8vIHRoZSBmb2xsb3dpbmcgYXJlIGRlcHJlY2F0ZWQgaW4gQVJJQSAxLjEgZm9yIGFsbCB0aGUgcm9sZXNcbiAgICBzdGF0aWMgZ2xvYmFsRGVwcmVjYXRlZFByb3BlcnRpZXMgOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgJ2FyaWEtZ3JhYmJlZCcsICdhcmlhLWRyb3BlZmZlY3QnXG4gICAgXTtcbiAgICBcbiAgICAvKlxuICAgICAqIFhTRCBkYXRhIHR5cGVzIGZvciBhbGwgV0FJLUFSSUEgcHJvcGVydGllc1xuICAgICAqIGFsb25nIHdpdGggdmFsaWQgdmFsdWVzIHdoZW4gdGhlIGRhdGEgdHlwZSBpcyBOTVRPS0VOXG4gICAgICogV0FJLUFSSUEgcHJvcGVydGllcyBkYXRhIHR5cGVzIGV4cGxhbmVkOlxuICAgICAqICB0eXBlOiBVc2VkIHRvIGlkZW50aWZ5IHRoZSB0eXBlIG9mIHZhbHVlcyBhbGxvd2VkIGZvciB0aGUgV0FJLUFSSUEgcHJvcGVydHlcbiAgICAgKiAgdmFsdWVzOiBVc2VkIHRvIGlkZW50aWZ5IHNwZWNpZmljIHZhbHVlcyBvZiBhbiBXQUktQVJJQSBwcm9wZXJ0eSB3aGVuIHR5cGUgaXMgbm10b2tlblxuICAgICAqICBoaWRkZW5JRFJlZlN1cHBvcnRlZDogVXNlZCB0byBpZGVudGlmeSBpZiB0aGUgV0FJLUFSSUEgcHJvcGVydHkgc3VwcG9ydHMgcmVmZXJlbmNpbmcgaGlkZGVuIElEXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHRydWU6IHJlZmVycyB0byBXQUktQVJJQSBwcm9wZXJ0eSBzdXBwb3J0cyBoaWRkZW4gSUQgcmVmZXJlbmNlc1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZTogcmVmZXJzIHRvIFdBSS1BUklBIHByb3BlcnR5IGRvZXMgbm90IHN1cHBvcnQgaGlkZGVuIElEIHJlZmVyZW5jZXNcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQgdmFsdWUgd2lsbCBiZSBzZXQgdG8gZmFsc2UsIGlmIG5vdCBzcGVjaWZpZWQuXG4gICAgICovXG4gICAgc3RhdGljIHByb3BlcnR5RGF0YVR5cGVzIDogeyBcbiAgICAgICAgW3Byb3A6IHN0cmluZ10gOiB7IFxuICAgICAgICAgICAgdHlwZTogc3RyaW5nLCBcbiAgICAgICAgICAgIGhpZGRlbklEUmVmU3VwcG9ydGVkPzogYm9vbGVhbixcbiAgICAgICAgICAgIHZhbHVlcz86IHN0cmluZ1tdIFxuICAgICAgICB9XG4gICAgfSA9IHtcbiAgICAgICAgXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpZHJlZlwiLFxuICAgICAgICAgICAgaGlkZGVuSURSZWZTdXBwb3J0ZWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWF0b21pY1wiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2Jvb2xlYW5cIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtYXV0b2NvbXBsZXRlXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjbm10b2tlblwiLFxuICAgICAgICAgICAgdmFsdWVzOiBbXCJpbmxpbmVcIiwgXCJsaXN0XCIsIFwiYm90aFwiLCBcIm5vbmVcIiwgXCJ1bmRlZmluZWRcIl0gLy9hZGQgdW5kZWZpbmVkIHRvIGhhbmRsZSB2YWx1ZSBlbXB0eVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtYnVzeVwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2Jvb2xlYW5cIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtY2hlY2tlZFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI25tdG9rZW5cIixcbiAgICAgICAgICAgIHZhbHVlczogW1widHJ1ZVwiLCBcImZhbHNlXCIsIFwibWl4ZWRcIiwgXCJ1bmRlZmluZWRcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWNvbGNvdW50XCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaW50XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWNvbGluZGV4XCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaW50XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWNvbHNwYW5cIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpbnRcIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtY29udHJvbHNcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpZHJlZnNcIixcbiAgICAgICAgICAgIGhpZGRlbklEUmVmU3VwcG9ydGVkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1jdXJyZW50XCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjbm10b2tlblwiLFxuICAgICAgICAgICAgdmFsdWVzOiBbXCJwYWdlXCIsIFwic3RlcFwiLCBcImxvY2F0aW9uXCIsIFwiZGF0ZVwiLCBcInRpbWVcIiwgXCJ0cnVlXCIsIFwiZmFsc2VcIiwgXCJ1bmRlZmluZWRcIl0gLy9hZGQgdW5kZWZpbmVkIGZvciBlbXB0eSB2YWx1ZVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtZGVzY3JpYmVkYnlcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpZHJlZnNcIixcbiAgICAgICAgICAgIGhpZGRlbklEUmVmU3VwcG9ydGVkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1kZXRhaWxzXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaWRyZWZzXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWRpc2FibGVkXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjYm9vbGVhblwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1kcm9wZWZmZWN0XCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjbm10b2tlbnNcIixcbiAgICAgICAgICAgIHZhbHVlczogW1wiY29weVwiLCBcIm1vdmVcIiwgXCJsaW5rXCIsIFwiZXhlY3V0ZVwiLCBcInBvcHVwXCIsIFwibm9uZVwiXVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtZXJyb3JtZXNzYWdlXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaWRyZWZcIixcbiAgICAgICAgICAgIGhpZGRlbklEUmVmU3VwcG9ydGVkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1leHBhbmRlZFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI25tdG9rZW5cIixcbiAgICAgICAgICAgIHZhbHVlczogW1widHJ1ZVwiLCBcImZhbHNlXCIsIFwidW5kZWZpbmVkXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1mbG93dG9cIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpZHJlZnNcIixcbiAgICAgICAgICAgIGhpZGRlbklEUmVmU3VwcG9ydGVkOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtZ3JhYmJlZFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI25tdG9rZW5cIixcbiAgICAgICAgICAgIHZhbHVlczogW1widHJ1ZVwiLCBcImZhbHNlXCIsIFwidW5kZWZpbmVkXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1oYXNwb3B1cFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI25tdG9rZW5cIixcbiAgICAgICAgICAgIHZhbHVlczogW1widHJ1ZVwiLCBcImZhbHNlXCIsIFwibWVudVwiLCBcImxpc3Rib3hcIiwgXCJ0cmVlXCIsIFwiZ3JpZFwiLCBcImRpYWxvZ1wiXVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtaGlkZGVuXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjbm10b2tlblwiLFxuICAgICAgICAgICAgdmFsdWVzOiBbXCJ0cnVlXCIsIFwiZmFsc2VcIiwgXCJ1bmRlZmluZWRcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWludmFsaWRcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNubXRva2VuXCIsXG4gICAgICAgICAgICB2YWx1ZXM6IFtcInRydWVcIiwgXCJmYWxzZVwiLCBcInNwZWxsaW5nXCIsIFwiZ3JhbW1hclwiLCBcInVuZGVmaW5lZFwiXSAvL2FkZCB1bmRlZmluZWQgZm9yIGVtcHR5IHZhbHVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1rZXlzaG9ydGN1dHNcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNzdHJpbmdcIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtbGFiZWxcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNzdHJpbmdcIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtbGFiZWxsZWRieVwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2lkcmVmc1wiLFxuICAgICAgICAgICAgaGlkZGVuSURSZWZTdXBwb3J0ZWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWxldmVsXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaW50XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWxpdmVcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNubXRva2VuXCIsXG4gICAgICAgICAgICB2YWx1ZXM6IFtcIm9mZlwiLCBcInBvbGl0ZVwiLCBcImFzc2VydGl2ZVwiXVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtbW9kYWxcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNib29sZWFuXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLW11bHRpbGluZVwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2Jvb2xlYW5cIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtbXVsdGlzZWxlY3RhYmxlXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjYm9vbGVhblwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1vcmllbnRhdGlvblwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI25tdG9rZW5cIixcbiAgICAgICAgICAgIHZhbHVlczogW1wiaG9yaXpvbnRhbFwiLCBcInZlcnRpY2FsXCIsIFwidW5kZWZpbmVkXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1vd25zXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaWRyZWZzXCIsXG4gICAgICAgICAgICBoaWRkZW5JRFJlZlN1cHBvcnRlZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtcGxhY2Vob2xkZXJcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNzdHJpbmdcIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtcG9zaW5zZXRcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpbnRcIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtcHJlc3NlZFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI25tdG9rZW5cIixcbiAgICAgICAgICAgIHZhbHVlczogW1widHJ1ZVwiLCBcImZhbHNlXCIsIFwibWl4ZWRcIiwgXCJ1bmRlZmluZWRcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXJlYWRvbmx5XCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjYm9vbGVhblwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1yZWxldmFudFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI25tdG9rZW5zXCIsXG4gICAgICAgICAgICB2YWx1ZXM6IFtcImFkZGl0aW9uc1wiLCBcInJlbW92YWxzXCIsIFwidGV4dFwiLCBcImFsbFwiXVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtcmVxdWlyZWRcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNib29sZWFuXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXJvbGVkZXNjcmlwdGlvblwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI3N0cmluZ1wiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1yb3djb3VudFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2ludFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1yb3dpbmRleFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2ludFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1yb3dzcGFuXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaW50XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXNlbGVjdGVkXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjbm10b2tlblwiLFxuICAgICAgICAgICAgdmFsdWVzOiBbXCJ0cnVlXCIsIFwiZmFsc2VcIiwgXCJ1bmRlZmluZWRcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXNldHNpemVcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpbnRcIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtc29ydFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI25tdG9rZW5cIixcbiAgICAgICAgICAgIHZhbHVlczogW1wiYXNjZW5kaW5nXCIsIFwiZGVzY2VuZGluZ1wiLCBcIm90aGVyXCIsIFwibm9uZVwiXVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtdmFsdWVtYXhcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNkZWNpbWFsXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXZhbHVlbWluXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjZGVjaW1hbFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS12YWx1ZW5vd1wiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2RlY2ltYWxcIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtdmFsdWV0ZXh0XCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjc3RyaW5nXCJcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qXG4gICAgICogZGVzaWduIHBhdHRlcm5zIGZvciBjb25jcmV0ZSBXQUktQVJJQSByb2xlc1xuICAgICAqIGxlZ2l0aW1hdGUga2V5cyBmb3IgZWFjaCByb2xlIGluY2x1ZGU6XG4gICAgICpcbiAgICAgKiAtIGNvbnRhaW5lcjogYXBwcm9wcmlhdGUgY29udGFpbmVyKHMpIGZvciB0aGF0IHJvbGVcbiAgICAgKiAtIHByb3BzOiBzdGF0ZXMgYW5kIHByb3BlcnRpZXMgdGhhdCBtYXkgYmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcm9sZSAoaW4gYWRkaXRpb24gdG8gdGhlIGdsb2JhbCBzdGF0ZXMgYW5kIHByb3BlcnRpZXMgbGlzdGVkIGFib3ZlKVxuICAgICAqIC0gcmVxUHJvcHM6IHJlcXVpcmVkIHN0YXRlcyBvciBwcm9wZXJ0aWVzIGZvciB0aGlzIHJvbGVcbiAgICAgKiAtIHJlcUNoaWxkcmVuOiByZXF1aXJlZCBjaGlsZHJlbiBmb3IgdGhpcyByb2xlXG4gICAgICogLSBodG1sRXF1aXY6IEhUTUwgZXF1aXZhbGVudCBmb3IgdGhpcyByb2xlXG4gICAgICogLSByb2xlVHlwZTogb25lIG9mIHdpZGdldCwgc3RydWN0dXJlLCBsYW5kbWFyaywgbGl2ZVJlZ2lvbiwgd2luZG93IChhcyBzZWVuIGluIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93YWktYXJpYS0xLjIvI3JvbGVzX2NhdGVnb3JpemF0aW9uKVxuICAgICAqIC0gbmFtZVJlcXVpcmVkOiBkZXRlcm1pbmVzIHdoZXRoZXIgYW4gYWNjZXNzaWJsZSBuYW1lIGlzIHJlcXVpcmVkIGZvciBhIHdpZGdldCAoc2VlIEFSSUEgc3BlYy4pXG4gICAgICogLSBuYW1lRnJvbTogZGV0ZXJtaW5lcyBob3cgYW4gYWNjZXNzaWJsZSBuYW1lIGlzIHN1cHBsaWVkIChhdXRob3Igb3IgY29udGVudCAtIHNlZSBBUklBIHNwZWMuKVxuICAgICAqIC0gZGVwcmVjYXRlZDogaWYgcHJlc2VudCwgaW5kaWNhdGVzIHRoYXQgdGhlIHJvbGUgaXMgZGVwcmVjYXRlZCwgYW5kIHByb3ZpZGVzIGEgbGlzdCBvZiBhbHRlcm5hdGl2ZSByb2xlKHMpXG4gICAgICovXG4gICAgc3RhdGljIGRlc2lnblBhdHRlcm5zIDoge1xuICAgICAgICBbcm9sZTogc3RyaW5nXToge1xuICAgICAgICAgICAgY29udGFpbmVyOiBzdHJpbmdbXSxcbiAgICAgICAgICAgIHByb3BzOiBzdHJpbmdbXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBzdHJpbmdbXSxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBzdHJpbmdbXSxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogc3RyaW5nLFxuICAgICAgICAgICAgcm9sZVR5cGU/OiBzdHJpbmcsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ/OiBib29sZWFuLFxuICAgICAgICAgICAgbmFtZUZyb20/OiBzdHJpbmdbXSxcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsQ2hpbGRyZW4/OiBib29sZWFuLFxuICAgICAgICAgICAgZGVwcmVjYXRlZD86IGJvb2xlYW4sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM/OiBzdHJpbmdbXVxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzPzogc3RyaW5nW11cbiAgICAgICAgfVxuICAgIH0gPSB7XG4gICAgICAgIFwiYWxlcnRcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGl2ZVJlZ2lvblwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiYWxlcnRkaWFsb2dcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtbW9kYWxcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2luZG93XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJhcHBsaWNhdGlvblwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIsIFwiYXJpYS1leHBhbmRlZFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIiwgLy8gb3IgY2FuIGJlIFwid2lkZ2V0XCJcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJhcnRpY2xlXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLXBvc2luc2V0XCIsIFwiYXJpYS1zZXRzaXplXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJiYW5uZXJcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiYmxvY2txdW90ZVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiYnV0dG9uXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWV4cGFuZGVkXCIsIFwiYXJpYS1wcmVzc2VkXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJidXR0b24gfCBpbnB1dFtAdHlwZT0nYnV0dG9uJ11cIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdLFxuICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxDaGlsZHJlbjogdHJ1ZSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImNhcHRpb25cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBbXCJmaWd1cmVcIiwgXCJncmlkXCIsIFwidGFibGVcIiwgXCJ0cmVlZ3JpZFwiXSxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcInByb2hpYml0ZWRcIl0sXG4gICAgICAgICAgICBwcm9oaWJpdGVkUHJvcHM6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiY2VsbFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IFtcInJvd1wiXSxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWNvbGluZGV4XCIsIFwiYXJpYS1jb2xzcGFuXCIsIFwiYXJpYS1yb3dpbmRleFwiLCBcImFyaWEtcm93c3BhblwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwidGRcIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImNoZWNrYm94XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWV4cGFuZGVkXCIsIFwiYXJpYS1yZWFkb25seVwiLCBcImFyaWEtcmVxdWlyZWRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogW1wiYXJpYS1jaGVja2VkXCJdLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwiaW5wdXRbQHR5cGU9J2NoZWNrYm94J11cIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdLFxuICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxDaGlsZHJlbjogdHJ1ZSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWhhc3BvcHVwJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJjb2RlXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcInByb2hpYml0ZWRcIl0sXG4gICAgICAgICAgICBwcm9oaWJpdGVkUHJvcHM6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiY29sdW1uaGVhZGVyXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogW1wicm93XCJdLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtY29saW5kZXhcIiwgXCJhcmlhLWNvbHNwYW5cIiwgXCJhcmlhLWV4cGFuZGVkXCIsIFwiYXJpYS1yZWFkb25seVwiLCBcImFyaWEtcmVxdWlyZWRcIiwgXCJhcmlhLXJvd2luZGV4XCIsIFwiYXJpYS1yb3dzcGFuXCIsIFwiYXJpYS1zZWxlY3RlZFwiLCBcImFyaWEtc29ydFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwidGhbQHNjb3BlPSdjb2wnXVwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl0gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJjb21ib2JveFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1jb250cm9sc1wiLCBcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiLCBcImFyaWEtYXV0b2NvbXBsZXRlXCIsIFwiYXJpYS1yZWFkb25seVwiLCBcImFyaWEtcmVxdWlyZWRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogW1wiYXJpYS1leHBhbmRlZFwiXSwgLy8gYXJpYS1jb250cm9scyBpc24ndCBhY3R1YWxseSByZXF1aXJlZCB3aGVuIGFyaWEtZXhwYW5kZWQ9XCJmYWxzZVwiXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogW10sXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJjb21wbGVtZW50YXJ5XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImNvbW1lbnRcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImNvbnRlbnRpbmZvXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImRlZmluaXRpb25cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wicHJvaGliaXRlZFwiXSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRQcm9wczogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJkZWxldGlvblwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJwcm9oaWJpdGVkXCJdLFxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImRpYWxvZ1wiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1tb2RhbFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aW5kb3dcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcbiAgICAgICAgXCJkaXJlY3RvcnlcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZDogdHJ1ZSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gIFxuICAgICAgICB9LCBcbiAgICAgICAgXCJkb2MtYWJzdHJhY3RcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWFja25vd2xlZGdtZW50c1wiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtYWZ0ZXJ3b3JkXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1hcHBlbmRpeFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtYmFja2xpbmtcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtZGlzYWJsZWRcIiwgXCJhcmlhLWV4cGFuZGVkXCIsIFwiYXJpYS1oYXNwb3B1cFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwiYSB8IGxpbmtcIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWJpYmxpb2VudHJ5XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogW1wibGlzdFwiXSxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWxldmVsXCIsIFwiYXJpYS1wb3NpbnNldFwiLCBcImFyaWEtc2V0c2l6ZVwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwibGlcIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1iaWJsaW9ncmFwaHlcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWJpYmxpb3JlZlwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1kaXNhYmxlZFwiLCBcImFyaWEtZXhwYW5kZWRcIiwgXCJhcmlhLWhhc3BvcHVwXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJhIHwgbGlua1wiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtY2hhcHRlclwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtY29sb3Bob25cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtY29uY2x1c2lvblwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtY292ZXJcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImltZ1wiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsQ2hpbGRyZW46IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtY3JlZGl0XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1jcmVkaXRzXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1kZWRpY2F0aW9uXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1lbmRub3RlXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogW1wibGlzdFwiXSxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWxldmVsXCIsIFwiYXJpYS1wb3NpbnNldFwiLCBcImFyaWEtc2V0c2l6ZVwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwibGlcIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtZW5kbm90ZXNcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtZXBpZ3JhcGhcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWVwaWxvZ3VlXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1lcnJhdGFcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWV4YW1wbGVcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWZvb3Rub3RlXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1mb3Jld29yZFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtZ2xvc3NhcnlcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWdsb3NzcmVmXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWRpc2FibGVkXCIsIFwiYXJpYS1leHBhbmRlZFwiLCBcImFyaWEtaGFzcG9wdXBcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImEgfCBsaW5rXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1pbmRleFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtaW50cm9kdWN0aW9uXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1ub3RlcmVmXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWRpc2FibGVkXCIsIFwiYXJpYS1leHBhbmRlZFwiLCBcImFyaWEtaGFzcG9wdXBcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImEgfCBsaW5rXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1ub3RpY2VcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1wYWdlYnJlYWtcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtb3JpZW50YXRpb25cIl0sIC8vIGFyaWEtZGlzYWJsZWQsIGFyaWEtdmFsdWVtYXgsIGFyaWEtdmFsdWVtaW4sIGFyaWEtdmFsdWV0ZXh0IGFyZSB2YWxpZCBpZiBmb2N1c2FibGUuIFRoaXMgaXMgaGFuZGxlZCBpbiB0aGUgY29kZS5cbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLCAvLyBhcmlhLXZhbHVlbm93IGlzIHJlcXVpcmVkIGlmIGZvY3VzYWJsZS4gVGhpcyBpcyBoYW5kbGVkIGluIHRoZSBjb2RlLlxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIiwgLy8gb3Igd2lkZ2V0IGlmIGZvY3VzYWJsZVxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdLFxuICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxDaGlsZHJlbjogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1wYWdlbGlzdFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtcGFnZWZvb3RlclwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcInByb2hpYml0ZWRcIl0sXG4gICAgICAgICAgICBwcm9oaWJpdGVkUHJvcHM6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl0sXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLXBhZ2VoZWFkZXJcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJwcm9oaWJpdGVkXCJdLFxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdLFxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1wYXJ0XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1wcmVmYWNlXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1wcm9sb2d1ZVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtcHVsbHF1b3RlXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtcW5hXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1zdWJ0aXRsZVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtdGlwXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtdG9jXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvY3VtZW50XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiZW1waGFzaXNcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wicHJvaGliaXRlZFwiXSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRQcm9wczogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJmZWVkXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogW1wiYXJ0aWNsZVwiXSxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJmaWd1cmVcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImZvcm1cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImZvcm1cIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJnZW5lcmljXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJkaXYgfCBzcGFuXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJwcm9oaWJpdGVkXCJdLFxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCIsIFwiYXJpYS1yb2xlZGVzY3JpcHRpb25cIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiZ3JhcGhpY3MtZG9jdW1lbnRcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgXCJncmFwaGljcy1vYmplY3RcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIFwiZ3JhcGhpY3Mtc3ltYm9sXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBwcmVzZW50YXRpb25hbENoaWxkcmVuOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICBcImdyaWRcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiLCBcImFyaWEtY29sY291bnRcIiwgXCJhcmlhLW11bHRpc2VsZWN0YWJsZVwiLCBcImFyaWEtcmVhZG9ubHlcIiwgXCJhcmlhLXJvd2NvdW50XCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogW1wicm93XCIsIFwicm93Z3JvdXBcIl0sIC8vIHJvd2dyb3VwIGlzIG5vdCByZXF1aXJlZCwgYnV0IGl0IGlzIGFsbG93ZWRcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJ0YWJsZVwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiZ3JpZGNlbGxcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBbXCJyb3dcIl0sXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1jb2xpbmRleFwiLCBcImFyaWEtY29sc3BhblwiLCBcImFyaWEtZGlzYWJsZWRcIiwgXCJhcmlhLWVycm9ybWVzc2FnZVwiLCBcImFyaWEtZXhwYW5kZWRcIiwgXCJhcmlhLWhhc3BvcHVwXCIsIFwiYXJpYS1pbnZhbGlkXCIsIFwiYXJpYS1yZWFkb25seVwiLCBcImFyaWEtcmVxdWlyZWRcIiwgXCJhcmlhLXJvd2luZGV4XCIsIFwiYXJpYS1yb3dzcGFuXCIsIFwiYXJpYS1zZWxlY3RlZFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwidGRcIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJncm91cFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiaGVhZGluZ1wiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBbXCJhcmlhLWxldmVsXCJdLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwiaDEgfCBoMiB8IGgzIHwgaDQgfCBoNSB8IGg2XCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJpbWdcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImltZ1wiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxDaGlsZHJlbjogdHJ1ZSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJpbWFnZVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwiaW1nXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBwcmVzZW50YXRpb25hbENoaWxkcmVuOiB0cnVlLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImluc2VydGlvblwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJwcm9oaWJpdGVkXCJdLFxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImxpbmtcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtZXhwYW5kZWRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImEgfCBsaW5rXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImxpc3RcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBbXCJsaXN0aXRlbVwiXSxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJvbCB8IHVsXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwibGlzdGJveFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIsIFwiYXJpYS1leHBhbmRlZFwiLCBcImFyaWEtbXVsdGlzZWxlY3RhYmxlXCIsIFwiYXJpYS1vcmllbnRhdGlvblwiLCBcImFyaWEtcmVhZG9ubHlcIiwgXCJhcmlhLXJlcXVpcmVkXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogW1wiZ3JvdXBcIiwgXCJvcHRpb25cIl0sIC8vIGdyb3VwIGlzIG5vdCByZXF1aXJlZCwgYnV0IGl0IGlzIGFsbG93ZWRcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWhhc3BvcHVwJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJsaXN0aXRlbVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IFtcImxpc3RcIl0sXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1sZXZlbFwiLCBcImFyaWEtcG9zaW5zZXRcIiwgXCJhcmlhLXNldHNpemVcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImxpXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwibG9nXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxpdmVSZWdpb25cIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwibWFpblwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJtYXJrXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJtYXJrXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJwcm9oaWJpdGVkXCJdLFxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcIm1hcnF1ZWVcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGl2ZVJlZ2lvblwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwibWF0aFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBwcmVzZW50YXRpb25hbENoaWxkcmVuOiBmYWxzZSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJtZW51XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIiwgXCJhcmlhLW9yaWVudGF0aW9uXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogW1wiZ3JvdXBcIiwgXCJtZW51aXRlbVwiLCBcIm1lbnVpdGVtY2hlY2tib3hcIiwgXCJtZW51aXRlbXJhZGlvXCJdLCAvLyBncm91cCBpcyBub3QgcmVxdWlyZWQsIGJ1dCBpdCBpcyBhbGxvd2VkXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJtZW51YmFyXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIiwgXCJhcmlhLW9yaWVudGF0aW9uXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogW1wiZ3JvdXBcIiwgXCJtZW51aXRlbVwiLCBcIm1lbnVpdGVtY2hlY2tib3hcIiwgXCJtZW51aXRlbXJhZGlvXCJdLCAvLyBncm91cCBpcyBub3QgcmVxdWlyZWQsIGJ1dCBpdCBpcyBhbGxvd2VkXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsIFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwibWVudWl0ZW1cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBbXCJncm91cFwiLCBcIm1lbnVcIiwgXCJtZW51YmFyXCJdLCAvLyBncm91cCBvbmx5IGNvdW50cyBhcyBhIHZhbGlkIGNvbnRhaW5lciBpZiBpdCBpcyBjb250YWluZWQgaW4gYSBtZW51IG9yIG1lbnViYXJcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWV4cGFuZGVkXCIsIFwiYXJpYS1wb3NpbnNldFwiLCBcImFyaWEtc2V0c2l6ZVwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIFwibWVudWl0ZW1jaGVja2JveFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IFtcImdyb3VwXCIsIFwibWVudVwiLCBcIm1lbnViYXJcIl0sIC8vIGdyb3VwIG9ubHkgY291bnRzIGFzIGEgdmFsaWQgY29udGFpbmVyIGlmIGl0IGlzIGNvbnRhaW5lZCBpbiBhIG1lbnUgb3IgbWVudWJhclxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtZXhwYW5kZWRcIiwgXCJhcmlhLXBvc2luc2V0XCIsIFwiYXJpYS1zZXRzaXplXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IFtcImFyaWEtY2hlY2tlZFwiXSxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl0sXG4gICAgICAgICAgICBwcmVzZW50YXRpb25hbENoaWxkcmVuOiB0cnVlLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwibWVudWl0ZW1yYWRpb1wiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IFtcImdyb3VwXCIsIFwibWVudVwiLCBcIm1lbnViYXJcIl0sIC8vIGdyb3VwIG9ubHkgY291bnRzIGFzIGEgdmFsaWQgY29udGFpbmVyIGlmIGl0IGlzIGNvbnRhaW5lZCBpbiBhIG1lbnUgb3IgbWVudWJhclxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtZXhwYW5kZWRcIiwgXCJhcmlhLXBvc2luc2V0XCIsIFwiYXJpYS1zZXRzaXplXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IFtcImFyaWEtY2hlY2tlZFwiXSxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl0sXG4gICAgICAgICAgICBwcmVzZW50YXRpb25hbENoaWxkcmVuOiB0cnVlLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwibWV0ZXJcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtdmFsdWVtYXhcIiwgXCJhcmlhLXZhbHVlbWluXCIsIFwiYXJpYS12YWx1ZXRleHRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogW1wiYXJpYS12YWx1ZW5vd1wiXSxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxDaGlsZHJlbjogdHJ1ZSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJuYXZpZ2F0aW9uXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcIm5vbmVcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcInByb2hpYml0ZWRcIl0sXG4gICAgICAgICAgICBwcm9oaWJpdGVkUHJvcHM6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwibm90ZVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwib3B0aW9uXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogW1wiZ3JvdXBcIiwgXCJsaXN0Ym94XCJdLCAvLyBncm91cCBvbmx5IGNvdW50cyBhcyBhIHZhbGlkIGNvbnRhaW5lciBpZiBpdCBpcyBjb250YWluZWQgaW4gYSBsaXN0Ym94XG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1zZWxlY3RlZFwiLCBcImFyaWEtY2hlY2tlZFwiLCBcImFyaWEtcG9zaW5zZXRcIiwgXCJhcmlhLXNldHNpemVcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCwgLy8gXCJhcmlhLXNlbGVjdGVkXCIgaGFzIGEgZGVmYXVsdFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwib3B0aW9uXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXSxcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsQ2hpbGRyZW46IHRydWUsXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInBhcmFncmFwaFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJwcm9oaWJpdGVkXCJdLFxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInByZXNlbnRhdGlvblwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW10sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wicHJvaGliaXRlZFwiXSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRQcm9wczogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJwcm9ncmVzc2JhclwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS12YWx1ZW1heFwiLCBcImFyaWEtdmFsdWVtaW5cIiwgXCJhcmlhLXZhbHVlbm93XCIsIFwiYXJpYS12YWx1ZXRleHRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxDaGlsZHJlbjogdHJ1ZSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJyYWRpb1wiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1wb3NpbnNldFwiLCBcImFyaWEtc2V0c2l6ZVwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBbXCJhcmlhLWNoZWNrZWRcIl0sXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJpbnB1dFtAdHlwZT0ncmFkaW8nXVwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl0sXG4gICAgICAgICAgICBwcmVzZW50YXRpb25hbENoaWxkcmVuOiB0cnVlLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJyYWRpb2dyb3VwXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIiwgXCJhcmlhLW9yaWVudGF0aW9uXCIsIFwiYXJpYS1yZWFkb25seVwiLCBcImFyaWEtcmVxdWlyZWRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBbXCJyYWRpb1wiXSxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1oYXNwb3B1cCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwicmVnaW9uXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInJvd1wiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IFtcImdyaWRcIiwgXCJyb3dncm91cFwiLCBcInRhYmxlXCIsIFwidHJlZWdyaWRcIl0sXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIsIFwiYXJpYS1jb2xpbmRleFwiLCBcImFyaWEtZXhwYW5kZWRcIiwgXCJhcmlhLWxldmVsXCIsIFwiYXJpYS1wb3NpbnNldFwiLCBcImFyaWEtcm93aW5kZXhcIiwgXCJhcmlhLXNlbGVjdGVkXCIsIFwiYXJpYS1zZXRzaXplXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogW1wiY2VsbFwiLCBcImNvbHVtbmhlYWRlclwiLCBcImdyaWRjZWxsXCIsIFwicm93aGVhZGVyXCJdLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcInRyXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwicm93Z3JvdXBcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBbXCJncmlkXCIsIFwidGFibGVcIiwgXCJ0cmVlZ3JpZFwiXSxcbiAgICAgICAgICAgIHByb3BzOiBbXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IFtcInJvd1wiXSxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJ0Ym9keSB8IHRmb290IHwgdGhlYWRcIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJyb3doZWFkZXJcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBbXCJyb3dcIl0sXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1jb2xpbmRleFwiLCBcImFyaWEtY29sc3BhblwiLCBcImFyaWEtZXhwYW5kZWRcIiwgXCJhcmlhLXJlYWRvbmx5XCIsIFwiYXJpYS1yZXF1aXJlZFwiLCBcImFyaWEtcm93aW5kZXhcIiwgXCJhcmlhLXJvd3NwYW5cIiwgXCJhcmlhLXNlbGVjdGVkXCIsIFwiYXJpYS1zb3J0XCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJ0aFtAc2NvcGU9J3JvdyddXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXVxuICAgICAgICB9LFxuXG4gICAgICAgIFwic2Nyb2xsYmFyXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLW9yaWVudGF0aW9uXCIsIFwiYXJpYS12YWx1ZW1heFwiLCBcImFyaWEtdmFsdWVtaW5cIiwgXCJhcmlhLXZhbHVldGV4dFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBbXCJhcmlhLWNvbnRyb2xzXCIsIFwiYXJpYS12YWx1ZW5vd1wiXSxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsQ2hpbGRyZW46IHRydWUsXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInNlYXJjaFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJzZWFyY2hib3hcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiLCBcImFyaWEtYXV0b2NvbXBsZXRlXCIsIFwiYXJpYS1tdWx0aWxpbmVcIiwgXCJhcmlhLXBsYWNlaG9sZGVyXCIsIFwiYXJpYS1yZWFkb25seVwiLCBcImFyaWEtcmVxdWlyZWRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImlucHV0W0B0eXBlPSdzZWFyY2gnXVwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJzZXBhcmF0b3JcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtb3JpZW50YXRpb25cIl0sIC8vIGFyaWEtZGlzYWJsZWQsIGFyaWEtdmFsdWVtYXgsIGFyaWEtdmFsdWVtaW4sIGFyaWEtdmFsdWV0ZXh0IGFyZSB2YWxpZCBpZiBmb2N1c2FibGUuIFRoaXMgaXMgaGFuZGxlZCBpbiB0aGUgY29kZS5cbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLCAvLyBhcmlhLXZhbHVlbm93IGlzIHJlcXVpcmVkIGlmIGZvY3VzYWJsZS4gVGhpcyBpcyBoYW5kbGVkIGluIHRoZSBjb2RlLlxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIiwgLy8gb3Igd2lkZ2V0IGlmIGZvY3VzYWJsZVxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsQ2hpbGRyZW46IHRydWUsXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInNsaWRlclwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1vcmllbnRhdGlvblwiLCBcImFyaWEtcmVhZG9ubHlcIiwgXCJhcmlhLXZhbHVlbWF4XCIsIFwiYXJpYS12YWx1ZW1pblwiLCBcImFyaWEtdmFsdWV0ZXh0XCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IFtcImFyaWEtdmFsdWVub3dcIl0sXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsQ2hpbGRyZW46IHRydWVcbiAgICAgICAgfSxcblxuICAgICAgICBcInNwaW5idXR0b25cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiLCBcImFyaWEtcmVhZG9ubHlcIiwgXCJhcmlhLXJlcXVpcmVkXCIsIFwiYXJpYS12YWx1ZW1heFwiLCBcImFyaWEtdmFsdWVtaW5cIiwgXCJhcmlhLXZhbHVlbm93XCIsIFwiYXJpYS12YWx1ZXRleHRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtaGFzcG9wdXAnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInN0YXR1c1wiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsaXZlUmVnaW9uXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInN0cm9uZ1wiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJwcm9oaWJpdGVkXCJdLFxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInN1YnNjcmlwdFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJwcm9oaWJpdGVkXCJdLFxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInN1Z2dlc3Rpb25cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wicHJvaGliaXRlZFwiXSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRQcm9wczogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJzdXBlcnNjcmlwdFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJwcm9oaWJpdGVkXCJdLFxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInN3aXRjaFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1leHBhbmRlZFwiLCBcImFyaWEtcmVhZG9ubHlcIiwgXCJhcmlhLXJlcXVpcmVkXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IFtcImFyaWEtY2hlY2tlZFwiXSxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl0sXG4gICAgICAgICAgICBwcmVzZW50YXRpb25hbENoaWxkcmVuOiB0cnVlLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtaGFzcG9wdXAnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInRhYlwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IFtcInRhYmxpc3RcIl0sXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1leHBhbmRlZFwiLCBcImFyaWEtcG9zaW5zZXRcIiwgXCJhcmlhLXNlbGVjdGVkXCIsIFwiYXJpYS1zZXRzaXplXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdLFxuICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxDaGlsZHJlbjogdHJ1ZSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInRhYmxlXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWNvbGNvdW50XCIsIFwiYXJpYS1yb3djb3VudFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IFtcInJvd1wiLCBcInJvd2dyb3VwXCIsIFwiY2FwdGlvblwiXSwgLy8gcm93Z3JvdXAgYW5kIGNhcHRpb24gYXJlIG5vdCByZXF1aXJlZCwgYnV0IGl0IGlzIGFsbG93ZWRcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJ0YWJsZVwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJ0YWJsaXN0XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIiwgXCJhcmlhLW11bHRpc2VsZWN0YWJsZVwiLCBcImFyaWEtb3JpZW50YXRpb25cIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBbXCJ0YWJcIl0sXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsIFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwidGFicGFuZWxcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInRlcm1cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImRmblwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wicHJvaGliaXRlZFwiXSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRQcm9wczogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJ0ZXh0Ym94XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIiwgXCJhcmlhLWF1dG9jb21wbGV0ZVwiLCBcImFyaWEtbXVsdGlsaW5lXCIsIFwiYXJpYS1wbGFjZWhvbGRlclwiLCBcImFyaWEtcmVhZG9ubHlcIiwgXCJhcmlhLXJlcXVpcmVkXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJpbnB1dFtAdHlwZT0ndGV4dCddXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcblxuICAgICAgICBcInRpbWVcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wicHJvaGliaXRlZFwiXSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRQcm9wczogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJ0aW1lclwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsaXZlUmVnaW9uXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInRvb2xiYXJcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiLCBcImFyaWEtb3JpZW50YXRpb25cIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJ0b29sdGlwXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSwgLy8gQVJJQSAxLjIgaGFzIHRoaXMgYXMgbmFtZVJlcXVpcmVkOiB0cnVlLCBidXQgQVJJQSAxLjMgcmVtb3ZlZCBpdCBiZWNhdXNlIGl0IG1ha2VzIG5vIHNlbnNlIHRvIHJlcXVpcmUgYSBuYW1lIG9uIGEgdG9vbHRpcC5cbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJ0cmVlXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIiwgXCJhcmlhLW11bHRpc2VsZWN0YWJsZVwiLCBcImFyaWEtb3JpZW50YXRpb25cIiwgXCJhcmlhLXJlcXVpcmVkXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogW1wiZ3JvdXBcIiwgXCJ0cmVlaXRlbVwiXSwgLy8gZ3JvdXAgaXMgbm90IHJlcXVpcmVkLCBidXQgaXQgaXMgYWxsb3dlZFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtaGFzcG9wdXAnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInRyZWVncmlkXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIiwgXCJhcmlhLWNvbGNvdW50XCIsIFwiYXJpYS1tdWx0aXNlbGVjdGFibGVcIiwgXCJhcmlhLW9yaWVudGF0aW9uXCIsIFwiYXJpYS1yZWFkb25seVwiLCBcImFyaWEtcmVxdWlyZWRcIiwgXCJhcmlhLXJvd2NvdW50XCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogW1wicm93XCIsIFwicm93Z3JvdXBcIl0sIC8vIHJvd2dyb3VwIGlzIG5vdCByZXF1aXJlZCwgYnV0IGl0IGlzIGFsbG93ZWRcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWhhc3BvcHVwJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJ0cmVlaXRlbVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IFtcImdyb3VwXCIsIFwidHJlZVwiXSxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWNoZWNrZWRcIiwgXCJhcmlhLWV4cGFuZGVkXCIsIFwiYXJpYS1sZXZlbFwiLCBcImFyaWEtcG9zaW5zZXRcIiwgXCJhcmlhLXNlbGVjdGVkXCIsIFwiYXJpYS1zZXRzaXplXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuICAgIH0gLy8gZW5kIGRlc2lnblBhdHRlcm5zXG5cbiAgICAvLyBjb3BpZWQgZnJvbSBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zZW1hbnRpY3Mtb3RoZXIuaHRtbCNkaXNhYmxlZC1lbGVtZW50c1xuICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2lucHV0Lmh0bWwjaW5wdXQtdHlwZS1hdHRyLXN1bW1hcnlcbiAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML0F0dHJpYnV0ZXMvZGlzYWJsZWRcbiAgICAvKiogbm90ZTpcbiAgICAgICogaWYgYSA8ZmllbGRzZXQ+IGlzIGRpc2FibGVkLCB0aGUgZGVzY2VuZGFudCBmb3JtIGNvbnRyb2xzIGFyZSBhbGwgZGlzYWJsZWQgZXhjZXB0IDxsZWdlbmQ+XG4gICAgICAqIElmIGFuIDxvcHRncm91cD4gaXMgZGlzYWJsZWQsIHRoZSBzZWxlY3QgaXMgc3RpbGwgaW50ZXJhY3RpdmUgKHVubGVzcyBvdGhlcndpc2UgZGlzYWJsZWQpLCBidXQgbm9uZSBvZiB0aGUgaXRlbXMgaW4gdGhlIG9wdGlvbiBncm91cCBhcmUgc2VsZWN0YWJsZS5cbiAgICAgICogV2hlbiBhbiBlbGVtZW50IGhhcyB0aGUgZGlzYWJsZWQgYXR0cmlidXRlIGFwcGxpZWQsIHRoZSA6ZGlzYWJsZWQgcHNldWRvLWNsYXNzIGFsc28gYXBwbGllcyB0byBpdC4gXG4gICAgICovXG4gICAgc3RhdGljIGVsZW1lbnRzQWxsb3dlZERpc2FibGVkID0gW1wiYnV0dG9uXCIsIFwiaW5wdXRcIiwgXCJzZWxlY3RcIiwgXCJ0ZXh0YXJlYVwiLCBcIm9wdGdyb3VwXCIsIFwib3B0aW9uXCIsIFwiZmllbGRzZXRcIl07IC8vIGFsc28gZm9ybS1hc3NvY2lhdGVkIGN1c3RvbSBlbGVtZW50XG4gICAgc3RhdGljIGVsZW1lbnRzQWxsb3dlZFJlcXVpcmVkID0gW1wic2VsZWN0XCIsIFwidGV4dGFyZWFcIl07IC8vIHJlbW92ZSAnaW5wdXQnIGFuZCBhZGQgdG8gdGhlIGluZGl2aWR1YWwgZWxlbWVudCwgYmVjdWFzZSByZXF1aXJlZCBpcyBub3Qgc3VwcG9ydGVkIG9uIGlucHV0QHR5cGU9XCJyYW5nZVwiLCBcImNvbG9yXCIsIFwiaGlkZGVuXCIgb3IgYW55IGJ1dHRvbiB0eXBlc1xuICAgIHN0YXRpYyBlbGVtZW50c0FsbG93ZWRSZWFkT25seSA9IFtcInRleHRhcmVhXCJdOyAvLyByZW1vdmUgJ2lucHV0JyBhbmQgYWRkIHRvIHRoZSBpbmRpdmlkdWFsIGVsZW1lbnQsIGJlY2F1c2UgcmVhZG9ubHkgaXMgbm90IHN1cHBvcnRlZCBvbiBpbnB1dEB0eXBlPVwiY2hlY2tib3hcIiwgXCJyYWRpb1wiLCBcInJhbmdlXCIsIFwiY29sb3JcIiwgXCJmaWxlXCIsIGhpZGRlblwiIG9yIGFueSBidXR0b24gdHlwZXNcblxuXG4gICAgLyogaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWwtYXJpYS8jZG9jY29uZm9ybWFuY2VcbiAgICAgICAgKiBkb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnQgY29udGFpbnMgcHJvcGVydGllcyBvZiB0aGUgdGFncyByZWxhdGVkIHRvIHJvbGUgd2l0aG91dCBhbnkgYWRkaXRpb25hbCBhdHRyaWJ1dGUgdmFsdWVcbiAgICAgICAgKiBkb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnRTcGVjaWFsVGFncyBjb250YWlucyB0aG9zZSB0YWdzIHRoYXQgcmVxdWlyZSBzcGVjaWFsIGNvbnNpZGVyYXRpb25zXG4gICAgICAgICovXG4gICAgc3RhdGljIGRvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudDoge1xuICAgICAgICBbcm9sZTogc3RyaW5nXTogSURvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudFxuICAgIH0gPSB7XG4gICAgICAgIFwiYWJiclwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgcHJvaGliaXRlZEFyaWFBdHRyaWJ1dGVzV2hlbk5vSW1wbGljaXRSb2xlOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiYWRkcmVzc1wiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdyb3VwXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImFydGljbGVcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJhcnRpY2xlXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYXBwbGljYXRpb25cIiwgXCJkb2N1bWVudFwiLCBcImZlZWRcIiwgXCJtYWluXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiLCBcInJlZ2lvblwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJhc2lkZVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImNvbXBsZW1lbnRhcnlcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJkb2MtZGVkaWNhdGlvblwiLCBcImRvYy1leGFtcGxlXCIsIFwiZG9jLWZvb3Rub3RlXCIsIFwiZG9jLWdsb3NzYXJ5XCIsIFwiZG9jLXB1bGxxdW90ZVwiLCBcImRvYy10aXBcIiwgXCJmZWVkXCIsIFwibm9uZVwiLCBcIm5vdGVcIiwgXCJwcmVzZW50YXRpb25cIiwgXCJyZWdpb25cIiwgXCJzZWFyY2hcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXVkaW9cIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYXBwbGljYXRpb25cIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYlwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdlbmVyaWNcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYmFzZVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgXCJiZGlcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImJkb1wiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdlbmVyaWNcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYmxvY2txdW90ZVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImJsb2NrcXVvdGVcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYm9keVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdlbmVyaWNcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgb3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFsnYXJpYS1oaWRkZW4nXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJiclwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2UsXG4gICAgICAgICAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1oaWRkZW5cIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJidXR0b25cIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJidXR0b25cIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJjaGVja2JveFwiLCBcImNvbWJvYm94XCIsIFwiZ3JpZGNlbGxcIiwgXCJsaW5rXCIsIFwibWVudWl0ZW1cIiwgXCJtZW51aXRlbWNoZWNrYm94XCIsIFwibWVudWl0ZW1yYWRpb1wiLCBcIm9wdGlvblwiLCBcInJhZGlvXCIsXCJzZXBhcmF0b3JcIiwgXCJzbGlkZXJcIiwgXCJzd2l0Y2hcIiwgXCJ0YWJcIiwgXCJ0cmVlaXRlbVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJjYW52YXNcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImNhcHRpb25cIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbJ2NhcHRpb24nXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgYWxsb3dBdHRyaWJ1dGVzRnJvbUltcGxpY2l0Um9sZTogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgXCJjaXRlXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICBwcm9oaWJpdGVkQXJpYUF0dHJpYnV0ZXNXaGVuTm9JbXBsaWNpdFJvbGU6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJjb2RlXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiY29kZVwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJjb2xcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwiY29sZ3JvdXBcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwiZGF0YVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdlbmVyaWNcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiZGF0YWxpc3RcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJsaXN0Ym94XCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlLFxuICAgICAgICAgICAgYWxsb3dBdHRyaWJ1dGVzRnJvbUltcGxpY2l0Um9sZTogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgXCJkZFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImRlbFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImRlbGV0aW9uXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImRldGFpbHNcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJncm91cFwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiZGZuXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1widGVybVwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJkaWFsb2dcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJkaWFsb2dcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbGVydGRpYWxvZ1wiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICBcImRsXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImdyb3VwXCIsIFwibGlzdFwiLCBcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiZHRcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJ0ZXJtXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wibGlzdGl0ZW1cIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiZW1cIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImVtYmVkXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFwcGxpY2F0aW9uXCIsIFwiZG9jdW1lbnRcIiwgXCJpbWdcIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImZpZWxkc2V0XCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ3JvdXBcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCIsIFwicmFkaW9ncm91cFwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJmaWdjYXB0aW9uXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImdyb3VwXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICBwcm9oaWJpdGVkQXJpYUF0dHJpYnV0ZXNXaGVuTm9JbXBsaWNpdFJvbGU6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJmb3JtXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZm9ybVwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIiwgXCJzZWFyY2hcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiaGVhZFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgXCJoZ3JvdXBcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJncm91cFwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJoMVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImhlYWRpbmdcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJkb2Mtc3VidGl0bGVcIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCIsIFwidGFiXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImgyXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiaGVhZGluZ1wiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImRvYy1zdWJ0aXRsZVwiLCBcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIiwgXCJ0YWJcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiaDNcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJoZWFkaW5nXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiZG9jLXN1YnRpdGxlXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiLCBcInRhYlwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJoNFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImhlYWRpbmdcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJkb2Mtc3VidGl0bGVcIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCIsIFwidGFiXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImg1XCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiaGVhZGluZ1wiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImRvYy1zdWJ0aXRsZVwiLCBcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIiwgXCJ0YWJcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiaDZcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJoZWFkaW5nXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiZG9jLXN1YnRpdGxlXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiLCBcInRhYlwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJoclwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInNlcGFyYXRvclwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImRvYy1wYWdlYnJlYWtcIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImh0bWxcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJkb2N1bWVudFwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZSxcbiAgICAgICAgICAgIGFsbG93QXR0cmlidXRlc0Zyb21JbXBsaWNpdFJvbGU6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwiaVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdlbmVyaWNcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiaWZyYW1lXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFwcGxpY2F0aW9uXCIsIFwiZG9jdW1lbnRcIiwgXCJpbWdcIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImluc1wiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImluc2VydGlvblwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJrYmRcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRBcmlhQXR0cmlidXRlc1doZW5Ob0ltcGxpY2l0Um9sZTogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXVxuICAgICAgICB9LFxuICAgICAgICBcImxhYmVsXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgcHJvaGliaXRlZEFyaWFBdHRyaWJ1dGVzV2hlbk5vSW1wbGljaXRSb2xlOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwibGVnZW5kXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgcHJvaGliaXRlZEFyaWFBdHRyaWJ1dGVzV2hlbk5vSW1wbGljaXRSb2xlOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwibGlua1wiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgXCJtYWluXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wibWFpblwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwibWFwXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcIm1hcmtcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRBcmlhQXR0cmlidXRlc1doZW5Ob0ltcGxpY2l0Um9sZTogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXVxuICAgICAgICB9LFxuICAgICAgICBcIm1hdGhcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJtYXRoXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJtZW51XCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wibGlzdFwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImdyb3VwXCIsIFwibGlzdGJveFwiLCBcIm1lbnVcIiwgXCJtZW51YmFyXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiLCBcInJhZGlvZ3JvdXBcIiwgXCJ0YWJsaXN0XCIsIFwidG9vbGJhclwiLCBcInRyZWVcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwibWV0YVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgXCJtZXRlclwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcIm1ldGVyXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICBvdGhlckRpc2FsbG93ZWRBcmlhQXR0cmlidXRlczogWydhcmlhLXZhbHVlbWF4JywgJ2FyaWEtdmFsdWVtaW4nXSxcbiAgICAgICAgICAgIGFsbG93QXR0cmlidXRlc0Zyb21JbXBsaWNpdFJvbGU6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwibmF2XCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wibmF2aWdhdGlvblwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImRvYy1pbmRleFwiLCBcImRvYy1wYWdlbGlzdFwiLCBcImRvYy10b2NcIiwgXCJtZW51XCIsIFwibWVudWJhclwiLCBcInRhYmxpc3RcIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcIm5vc2NyaXB0XCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcIm9iamVjdFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhcHBsaWNhdGlvblwiLCBcImRvY3VtZW50XCIsIFwiaW1nXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcIm9sXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wibGlzdFwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImdyb3VwXCIsIFwibGlzdGJveFwiLCBcIm1lbnVcIiwgXCJtZW51YmFyXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiLCBcInJhZGlvZ3JvdXBcIiwgXCJ0YWJsaXN0XCIsIFwidG9vbGJhclwiLCBcInRyZWVcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwib3B0Z3JvdXBcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJncm91cFwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwib3B0aW9uXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wib3B0aW9uXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICBvdGhlckRpc2FsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1zZWxlY3RlZFwiXVxuICAgICAgICB9LFxuICAgICAgICBcIm91dHB1dFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInN0YXR1c1wiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJwXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wicGFyYWdyYXBoXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInBhcmFtXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcInBpY3R1cmVcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlLFxuICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtaGlkZGVuXCJdIFxuICAgICAgICB9LFxuICAgICAgICBcInByZVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdlbmVyaWNcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwicHJvZ3Jlc3NcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJwcm9ncmVzc2JhclwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgb3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtdmFsdWVtYXhcIl0gXG4gICAgICAgIH0sXG4gICAgICAgIFwicVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdlbmVyaWNcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwicnBcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInJ0XCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICBwcm9oaWJpdGVkQXJpYUF0dHJpYnV0ZXNXaGVuTm9JbXBsaWNpdFJvbGU6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJydWJ5XCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJzXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZGVsZXRpb25cIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgb3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJzYW1wXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ2VuZXJpY1wiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJzY3JpcHRcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwic2VhcmNoXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogWydzZWFyY2gnXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFsnc2VhcmNoJywgJ2Zvcm0nLCAnZ3JvdXAnLCAnbm9uZScsICdwcmVzZW50YXRpb24nLCAncmVnaW9uJ10sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwic2xvdFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgXCJzbWFsbFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdlbmVyaWNcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwic291cmNlXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcInNwYW5cIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInN0cm9uZ1wiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInN0cm9uZ1wiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJzdHlsZVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgXCJzdWJcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJzdWJzY3JpcHRcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwic3VwXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wic3VwZXJzY3JpcHRcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwic3ZnXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ3JhcGhpY3MtZG9jdW1lbnRcIl0sIC8vIGFzIGRlZmluZWQgYnkgU1ZHIEFBTVxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInRhYmxlXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1widGFibGVcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwidGVtcGxhdGVcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwidGV4dGFyZWFcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJ0ZXh0Ym94XCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJ0Zm9vdFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInJvd2dyb3VwXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInRoZWFkXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wicm93Z3JvdXBcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwidGltZVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInRpbWVcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwidGl0bGVcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwidHJhY2tcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwidVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdlbmVyaWNcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwidWxcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJsaXN0XCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiZ3JvdXBcIiwgXCJsaXN0Ym94XCIsIFwibWVudVwiLCBcIm1lbnViYXJcIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCIsIFwicmFkaW9ncm91cFwiLCBcInRhYmxpc3RcIiwgXCJ0b29sYmFyXCIsIFwidHJlZVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJ2YXJcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRBcmlhQXR0cmlidXRlc1doZW5Ob0ltcGxpY2l0Um9sZTogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXVxuICAgICAgICB9LFxuICAgICAgICBcInZpZGVvXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFwcGxpY2F0aW9uXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcIndiclwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2UsXG4gICAgICAgICAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1oaWRkZW5cIl1cbiAgICAgICAgfVxuICAgIH0gLy8gZW5kIGRvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudFxuXG4gICAgc3RhdGljIGRvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudFNwZWNpYWxUYWdzOiB7XG4gICAgICAgIFtyb2xlOiBzdHJpbmddOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddIDogSURvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudFxuICAgICAgICB9IHwgSURvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudFxuICAgIH0gPSB7XG4gICAgICAgIFwiYVwiOiB7XG4gICAgICAgICAgICBcIndpdGgtaHJlZlwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJsaW5rXCJdLFxuICAgICAgICAgICAgICAgIC8vcm9sZUNvbmRpdGlvbjogXCIgd2hlbiBub24tZW1wdHkgaHJlZiBhdHRyaWJ1dGUgaXMgcHJlc2VudFwiLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImJ1dHRvblwiLCBcImNoZWNrYm94XCIsIFwiZG9jLWJhY2tsaW5rXCIsIFwiZG9jLWJpYmxpb3JlZlwiLCBcImRvYy1nbG9zc3JlZlwiLCBcImRvYy1ub3RlcmVmXCIsIFwibWVudWl0ZW1cIiwgXCJtZW51aXRlbWNoZWNrYm94XCIsIFwibWVudWl0ZW1yYWRpb1wiLCBcIm9wdGlvblwiLCBcInJhZGlvXCIsIFwic3dpdGNoXCIsIFwidGFiXCIsIFwidHJlZWl0ZW1cIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvdGhlckRpc2FsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1kaXNhYmxlZD10cnVlXCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJ3aXRob3V0LWhyZWZcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ2VuZXJpY1wiXSxcbiAgICAgICAgICAgICAgICAvL3JvbGVDb25kaXRpb246IFwiIHdoZW4gaHJlZiBhdHRyaWJ1dGUgaXMgbm90IHByZXNlbnRcIixcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcImFyZWFcIjoge1xuICAgICAgICAgICAgXCJ3aXRoLWhyZWZcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wibGlua1wiXSxcbiAgICAgICAgICAgICAgICAvL3JvbGVDb25kaXRpb246IFwiIHdoZW4gbm9uLWVtcHR5IGhyZWYgYXR0cmlidXRlIGlzIHByZXNlbnRcIixcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIndpdGhvdXQtaHJlZlwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgICAgIC8vcm9sZUNvbmRpdGlvbjogXCIgd2hlbiBocmVmIGF0dHJpYnV0ZSBpcyBub3QgcHJlc2VudFwiLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImJ1dHRvblwiLCBcImxpbmtcIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuLy8gVE9ET1xuLy8gICAgICAgIFwiYXV0b25vbW91cyBjdXN0b20gZWxlbWVudFwiOiB7XG4vLyAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiUm9sZSBleHBvc2VkIGZyb20gYXV0aG9yIGRlZmluZWQgRWxlbWVudEludGVybmFscy4gT3RoZXJ3aXNlIG5vIGNvcnJlc3BvbmRpbmcgcm9sZS5cIl0sXG4vLyAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcIklmIHJvbGUgZGVmaW5lZCBieSBFbGVtZW50SW50ZXJuYWxzXCIsIFwiYW55IHJvbGVcIiwgXCJubyByb2xlIE90aGVyd2lzZVwiXSxcbi8vICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuLy8gICAgICAgIH0sXG4gICAgICAgIFwiZGl2XCI6IHtcbiAgICAgICAgICAgIFwiY2hpbGQtZGxcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ2VuZXJpY1wiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJwcmVzZW50YXRpb25cIiwgXCJub25lXCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm5vLWNoaWxkLWRsXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdlbmVyaWNcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJmaWd1cmVcIjoge1xuICAgICAgICAgICAgXCJjaGlsZC1maWdjYXB0aW9uXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImZpZ3VyZVwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbJ2RvYy1leGFtcGxlJ10sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwibm8tY2hpbGQtZmlnY2FwdGlvblwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJmaWd1cmVcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJmb290ZXJcIjoge1xuICAgICAgICAgICAgXCJkZXMtc2VjdGlvbi1hcnRpY2xlLWFzaWRlLW1haW4tbmF2XCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdlbmVyaWNcIl0sXG4gICAgICAgICAgICAgICAgLy9yb2xlQ29uZGl0aW9uOiBcIiB3aGVuIGRlc2NlbmRhbnQgb2YgYW4gYXJ0aWNsZSwgYXNpZGUsIG1haW4sIG5hdiBvciBzZWN0aW9uIGVsZW1lbnRcIixcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJkb2MtZm9vdG5vdGVcIiwgXCJncm91cFwiLCBcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwib3RoZXJcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiY29udGVudGluZm9cIl0sXG4gICAgICAgICAgICAgICAgLy9yb2xlQ29uZGl0aW9uOiBcIiB3aGVuIG5vdCBhIGRlc2NlbmRhbnQgb2YgYW4gYXJ0aWNsZSwgYXNpZGUsIG1haW4sIG5hdiBvciBzZWN0aW9uIGVsZW1lbnRcIixcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJkb2MtZm9vdG5vdGVcIiwgXCJncm91cFwiLCBcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuLy8gVE9ET1xuLy8gICAgICAgIFwiZm9ybS1hc3NvY2lhdGVkIGN1c3RvbSBlbGVtZW50XCI6IHtcbi8vICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJSb2xlIGV4cG9zZWQgZnJvbSBhdXRob3IgZGVmaW5lZCBFbGVtZW50SW50ZXJuYWxzLiBPdGhlcndpc2UgJ2dlbmVyaWMnLlwiXSxcbi8vICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiSWYgcm9sZSBkZWZpbmVkIGJ5IEVsZW1lbnRJbnRlcm5hbHNcIiwgXCJmb3JtLXJlbGF0ZWQgcm9sZXM6IGJ1dHRvblwiLCBcImNoZWNrYm94XCIsIFwiY29tYm9ib3hcIiwgXCJncm91cFwiLCBcImxpc3Rib3hcIiwgXCJwcm9ncmVzc2JhclwiLCBcInJhZGlvXCIsIFwicmFkaW9ncm91cFwiLCBcInNlYXJjaGJveFwiLCBcInNsaWRlclwiLCBcInNwaW5idXR0b25cIiwgXCJzd2l0Y2hcIiwgXCJ0ZXh0Ym94XCIsIFwibm8gcm9sZSBPdGhlcndpc2VcIl0sXG4vLyAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbi8vICAgICAgICB9LFxuXG4gICAgICAgIFwiaGVhZGVyXCI6IHtcbiAgICAgICAgICAgIFwiZGVzLXNlY3Rpb24tYXJ0aWNsZS1hc2lkZS1tYWluLW5hdlwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgICAgIC8vcm9sZUNvbmRpdGlvbjogXCIgd2hlbiBkZXNjZW5kYW50IG9mIGFuIGFydGljbGUsIGFzaWRlLCBtYWluLCBuYXYgb3Igc2VjdGlvbiBlbGVtZW50XCIsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiZ3JvdXBcIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm90aGVyXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImJhbm5lclwiXSxcbiAgICAgICAgICAgICAgICAvL3JvbGVDb25kaXRpb246IFwiIHdoZW4gbm90IGEgZGVzY2VuZGFudCBvZiBhbiBhcnRpY2xlLCBhc2lkZSwgbWFpbiwgbmF2IG9yIHNlY3Rpb24gZWxlbWVudFwiLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImdyb3VwXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSxcbiAgICAgICAgXCJpbWdcIjoge1xuICAgICAgICAgICAgXCJpbWctd2l0aC1hY2NuYW1lXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImltZ1wiXSxcbiAgICAgICAgICAgICAgICAvL3JvbGVDb25kaXRpb246IFwid2hlbiBhY2Nlc3NpYmxlIG5hbWUgcHJlc2VudHNcIixcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJidXR0b25cIiwgXCJjaGVja2JveFwiLCBcImRvYy1jb3ZlclwiLCBcImxpbmtcIiwgXCJtZW51aXRlbVwiLCBcIm1lbnVpdGVtY2hlY2tib3hcIiwgXCJtZW51aXRlbXJhZGlvXCIsIFwibWV0ZXJcIiwgXCJvcHRpb25cIiwgXCJwcm9ncmVzc2JhclwiLCBcInJhZGlvXCIsIFwic2Nyb2xsYmFyXCIsIFwic2VwYXJhdG9yXCIsIFwic2xpZGVyXCIsIFwic3dpdGNoXCIsIFwidGFiXCIsIFwidHJlZWl0ZW1cIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiaW1nLXdpdGhvdXQtYWNjbmFtZS1lbXB0eS1hbHRcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wicHJlc2VudGF0aW9uXCIsIFwibm9uZVwiXSxcbiAgICAgICAgICAgICAgICAvL3JvbGVDb25kaXRpb246IFwid2hlbiBubyBhY2Nlc3NpYmxlIG5hbWUgcHJlc2VudHMgYW5kIGFsdD0nJ1wiLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2UsIFxuICAgICAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLWhpZGRlbj10cnVlXCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJpbWctd2l0aG91dC1hY2NuYW1lLW5vLWFsdFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJpbWdcIl0sXG4gICAgICAgICAgICAgICAgLy9yb2xlQ29uZGl0aW9uOiBcIndoZW4gbmVpdGhlciBhY2Nlc3NpYmxlIG5hbWUgbm8gYWx0IHByZXNlbnRzXCIsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wicHJlc2VudGF0aW9uXCIsIFwibm9uZVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZSwgXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtaGlkZGVuPXRydWVcIl1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJpbnB1dFwiOiB7XG4gICAgICAgICAgICBcImJ1dHRvblwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJidXR0b25cIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiY2hlY2tib3hcIiwgXCJjb21ib2JveFwiLCBcImdyaWRjZWxsXCIsIFwibGlua1wiLCBcIm1lbnVpdGVtXCIsIFwibWVudWl0ZW1jaGVja2JveFwiLCBcIm1lbnVpdGVtcmFkaW9cIiwgXCJvcHRpb25cIiwgXCJyYWRpb1wiLCBcInNsaWRlclwiLCBcInN3aXRjaFwiLCBcInRhYlwiLCBcInRyZWVpdGVtXCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImNoZWNrYm94LXdpdGgtYXJpYS1wcmVzc2VkXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImNoZWNrYm94XCJdLFxuICAgICAgICAgICAgICAgIC8vcm9sZUNvbmRpdGlvbjogXCIgd2l0aCB0eXBlPWNoZWNrYm94IGFuZCBhcmlhLXByZXNzZWQgYXR0cmlidXRlIGlzIHByZXNlbnRcIixcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJtZW51aXRlbWNoZWNrYm94XCIsIFwib3B0aW9uXCIsIFwic3dpdGNoXCIsIFwiYnV0dG9uXCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtcmVxdWlyZWRcIl0sXG4gICAgICAgICAgICAgICAgb3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtY2hlY2tlZFwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiY2hlY2tib3gtd2l0aG91dC1hcmlhLXByZXNzZWRcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiY2hlY2tib3hcIl0sXG4gICAgICAgICAgICAgICAgLy9yb2xlQ29uZGl0aW9uOiBcIiB3aXRoIHR5cGU9Y2hlY2tib3ggYW5kIGFyaWEtcHJlc3NlZCBhdHRyaWJ1dGUgaXMgbm90IHByZXNlbnRcIixcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJtZW51aXRlbWNoZWNrYm94XCIsIFwib3B0aW9uXCIsIFwic3dpdGNoXCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtcmVxdWlyZWRcIl0sXG4gICAgICAgICAgICAgICAgb3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtY2hlY2tlZFwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiY29sb3JcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImRhdGVcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtcmVxdWlyZWRcIiwgXCJhcmlhLXJlYWRvbmx5XCJdLFxuICAgICAgICAgICAgICAgIG90aGVyUm9sZXNGb3JBdHRyaWJ1dGVzOiBbXCJ0ZXh0Ym94XCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJkYXRldGltZS1sb2NhbFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1yZXF1aXJlZFwiLCBcImFyaWEtcmVhZG9ubHlcIl0sXG4gICAgICAgICAgICAgICAgb3RoZXJSb2xlc0ZvckF0dHJpYnV0ZXM6IFtcInRleHRib3hcIl1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImVtYWlsLW5vLWxpc3RcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1widGV4dGJveFwiXSxcbiAgICAgICAgICAgICAgICAvL3JvbGVDb25kaXRpb246IFwiIHdpdGggdHlwZT1lbWFpbCBhbmQgbm8gbGlzdCBhdHRyaWJ1dGUgaXMgcHJlc2VudFwiLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1wbGFjZWhvbGRlclwiLCBcImFyaWEtcmVxdWlyZWRcIiwgXCJhcmlhLXJlYWRvbmx5XCJdLFxuICAgICAgICAgICAgICAgIG90aGVyUm9sZXNGb3JBdHRyaWJ1dGVzOiBbXCJ0ZXh0Ym94XCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJlbWFpbC13aXRoLWxpc3RcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiY29tYm9ib3hcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJmaWxlXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLXJlcXVpcmVkXCJdLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiaGlkZGVuXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiaW1hZ2VcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiYnV0dG9uXCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImNoZWNrYm94XCIsIFwiZ3JpZGNlbGxcIiwgXCJsaW5rXCIsIFwibWVudWl0ZW1cIiwgXCJtZW51aXRlbWNoZWNrYm94XCIsIFwibWVudWl0ZW1yYWRpb1wiLCBcIm9wdGlvblwiLCBcInJhZGlvXCIsIFwic2xpZGVyXCIsIFwic3dpdGNoXCIsIFwidGFiXCIsIFwidHJlZWl0ZW1cIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwibW9udGhcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtcmVhZG9ubHlcIl0sXG4gICAgICAgICAgICAgICAgb3RoZXJSb2xlc0ZvckF0dHJpYnV0ZXM6IFtcInRleHRib3hcIl1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm51bWJlclwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJzcGluYnV0dG9uXCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1wbGFjZWhvbGRlclwiLCBcImFyaWEtcmVxdWlyZWRcIiwgXCJhcmlhLXJlYWRvbmx5XCJdLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwicGFzc3dvcmRcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtcGxhY2Vob2xkZXJcIiwgXCJhcmlhLXJlcXVpcmVkXCIsIFwiYXJpYS1yZWFkb25seVwiXSxcbiAgICAgICAgICAgICAgICBvdGhlclJvbGVzRm9yQXR0cmlidXRlczogW1widGV4dGJveFwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwicmFkaW9cIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wicmFkaW9cIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wibWVudWl0ZW1yYWRpb1wiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLXJlcXVpcmVkXCJdLFxuICAgICAgICAgICAgICAgIG90aGVyRGlzYWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLWNoZWNrZWRcIl1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInJhbmdlXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInNsaWRlclwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtdmFsdWVtYXhcIiwgXCJhcmlhLXZhbHVlbWluXCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJyZXNldFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJidXR0b25cIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiY2hlY2tib3hcIiwgXCJjb21ib2JveFwiLCBcImdyaWRjZWxsXCIsIFwibGlua1wiLCBcIm1lbnVpdGVtXCIsIFwibWVudWl0ZW1jaGVja2JveFwiLCBcIm1lbnVpdGVtcmFkaW9cIiwgXCJvcHRpb25cIiwgXCJyYWRpb1wiLCBcInNsaWRlclwiLCBcInN3aXRjaFwiLCBcInRhYlwiLCBcInRyZWVpdGVtXCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInNlYXJjaC1uby1saXN0XCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInNlYXJjaGJveFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtcGxhY2Vob2xkZXJcIiwgXCJhcmlhLXJlcXVpcmVkXCIsIFwiYXJpYS1yZWFkb25seVwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwic2VhcmNoLXdpdGgtbGlzdFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJjb21ib2JveFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInN1Ym1pdFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJidXR0b25cIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiY2hlY2tib3hcIiwgXCJjb21ib2JveFwiLCBcImdyaWRjZWxsXCIsIFwibGlua1wiLCBcIm1lbnVpdGVtXCIsIFwibWVudWl0ZW1jaGVja2JveFwiLCBcIm1lbnVpdGVtcmFkaW9cIiwgXCJvcHRpb25cIiwgXCJyYWRpb1wiLCBcInNsaWRlclwiLCBcInN3aXRjaFwiLCBcInRhYlwiLCBcInRyZWVpdGVtXCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInRlbC1uby1saXN0XCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInRleHRib3hcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLXBsYWNlaG9sZGVyXCIsIFwiYXJpYS1yZXF1aXJlZFwiLCBcImFyaWEtcmVhZG9ubHlcIl1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInRlbC13aXRoLWxpc3RcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiY29tYm9ib3hcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJ0ZXh0LW5vLWxpc3RcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1widGV4dGJveFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJjb21ib2JveFwiLCBcInNlYXJjaGJveFwiLCBcInNwaW5idXR0b25cIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1wbGFjZWhvbGRlclwiLCBcImFyaWEtcmVxdWlyZWRcIiwgXCJhcmlhLXJlYWRvbmx5XCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJ0ZXh0LXdpdGgtbGlzdFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJjb21ib2JveFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgICAgICAvLyBvdGhlckRpc2FsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1oYXNwb3B1cFwiXSAgLy8gY292ZXJlZCBpbiBhIGRpZmZlcmVudCBydWxlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJ0aW1lXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLXJlYWRvbmx5XCJdLFxuICAgICAgICAgICAgICAgIG90aGVyUm9sZXNGb3JBdHRyaWJ1dGVzOiBbXCJ0ZXh0Ym94XCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJ1cmwtbm8tbGlzdFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJ0ZXh0Ym94XCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1wbGFjZWhvbGRlclwiLCBcImFyaWEtcmVxdWlyZWRcIiwgXCJhcmlhLXJlYWRvbmx5XCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJ1cmwtd2l0aC1saXN0XCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImNvbWJvYm94XCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwid2Vla1wiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1yZWFkb25seVwiXSxcbiAgICAgICAgICAgICAgICBvdGhlclJvbGVzRm9yQXR0cmlidXRlczogW1widGV4dGJveFwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZGVmYXVsdC13aXRoLWxpc3RcIjoge1xuICAgICAgICAgICAgICAgIC8vIGlucHV0IHdpdGggYSBtaXNzaW5nIG9yIGludmFsaWQgdHlwZSwgd2l0aCBhIGxpc3QgYXR0cmlidXRlXG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJjb21ib2JveFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImRlZmF1bHQtbm8tbGlzdFwiOiB7XG4gICAgICAgICAgICAgICAgLy8gaW5wdXQgd2l0aCBhIG1pc3Npbmcgb3IgaW52YWxpZCB0eXBlLCB3aXRoIGEgbGlzdCBhdHRyaWJ1dGVcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInRleHRib3hcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwibGlcIjoge1xuICAgICAgICAgICAgXCJjaGlsZC1vZi1saXN0LXJvbGVcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogWydsaXN0aXRlbSddLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwibm8tY2hpbGQtb2YtbGlzdC1yb2xlXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFsnZ2VuZXJpYyddLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwic2VjdGlvblwiOiB7XG4gICAgICAgICAgICBcIndpdGgtbmFtZVwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJyZWdpb25cIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYWxlcnRcIiwgXCJhbGVydGRpYWxvZ1wiLCBcImFwcGxpY2F0aW9uXCIsIFwiYmFubmVyXCIsIFwiY29tcGxlbWVudGFyeVwiLCBcImNvbnRlbnRpbmZvXCIsIFwiZGlhbG9nXCIsIFwiZG9jLWFic3RyYWN0XCIsIFwiZG9jLWFja25vd2xlZGdtZW50c1wiLCBcImRvYy1hZnRlcndvcmRcIiwgXCJkb2MtYXBwZW5kaXhcIiwgXCJkb2MtYmlibGlvZ3JhcGh5XCIsIFwiZG9jLWNoYXB0ZXJcIiwgXCJkb2MtY29sb3Bob25cIiwgXCJkb2MtY29uY2x1c2lvblwiLCBcImRvYy1jcmVkaXRcIiwgXCJkb2MtY3JlZGl0c1wiLCBcImRvYy1kZWRpY2F0aW9uXCIsIFwiZG9jLWVuZG5vdGVzXCIsIFwiZG9jLWVwaWdyYXBoXCIsIFwiZG9jLWVwaWxvZ3VlXCIsIFwiZG9jLWVycmF0YVwiLCBcImRvYy1leGFtcGxlXCIsIFwiZG9jLWZvcmV3b3JkXCIsIFwiZG9jLWdsb3NzYXJ5XCIsIFwiZG9jLWluZGV4XCIsIFwiZG9jLWludHJvZHVjdGlvblwiLCBcImRvYy1ub3RpY2VcIiwgXCJkb2MtcGFnZWxpc3RcIiwgXCJkb2MtcGFydFwiLCBcImRvYy1wcmVmYWNlXCIsIFwiZG9jLXByb2xvZ3VlXCIsIFwiZG9jLXB1bGxxdW90ZVwiLCBcImRvYy1xbmFcIiwgXCJkb2MtdG9jXCIsIFwiZG9jdW1lbnRcIiwgXCJmZWVkXCIsIFwiZ3JvdXBcIiwgXCJsb2dcIiwgXCJtYWluXCIsIFwibWFycXVlZVwiLCBcIm5hdmlnYXRpb25cIiwgXCJub25lXCIsIFwibm90ZVwiLCBcInByZXNlbnRhdGlvblwiLCBcInNlYXJjaFwiLCBcInN0YXR1c1wiLCBcInRhYnBhbmVsXCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIndpdGhvdXQtbmFtZVwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFsZXJ0XCIsIFwiYWxlcnRkaWFsb2dcIiwgXCJhcHBsaWNhdGlvblwiLCBcImJhbm5lclwiLCBcImNvbXBsZW1lbnRhcnlcIiwgXCJjb250ZW50aW5mb1wiLCBcImRpYWxvZ1wiLCBcImRvYy1hYnN0cmFjdFwiLCBcImRvYy1hY2tub3dsZWRnbWVudHNcIiwgXCJkb2MtYWZ0ZXJ3b3JkXCIsIFwiZG9jLWFwcGVuZGl4XCIsIFwiZG9jLWJpYmxpb2dyYXBoeVwiLCBcImRvYy1jaGFwdGVyXCIsIFwiZG9jLWNvbG9waG9uXCIsIFwiZG9jLWNvbmNsdXNpb25cIiwgXCJkb2MtY3JlZGl0XCIsIFwiZG9jLWNyZWRpdHNcIiwgXCJkb2MtZGVkaWNhdGlvblwiLCBcImRvYy1lbmRub3Rlc1wiLCBcImRvYy1lcGlncmFwaFwiLCBcImRvYy1lcGlsb2d1ZVwiLCBcImRvYy1lcnJhdGFcIiwgXCJkb2MtZXhhbXBsZVwiLCBcImRvYy1mb3Jld29yZFwiLCBcImRvYy1nbG9zc2FyeVwiLCBcImRvYy1pbmRleFwiLCBcImRvYy1pbnRyb2R1Y3Rpb25cIiwgXCJkb2Mtbm90aWNlXCIsIFwiZG9jLXBhZ2VsaXN0XCIsIFwiZG9jLXBhcnRcIiwgXCJkb2MtcHJlZmFjZVwiLCBcImRvYy1wcm9sb2d1ZVwiLCBcImRvYy1wdWxscXVvdGVcIiwgXCJkb2MtcW5hXCIsIFwiZG9jLXRvY1wiLCBcImRvY3VtZW50XCIsIFwiZmVlZFwiLCBcImdyb3VwXCIsIFwibG9nXCIsIFwibWFpblwiLCBcIm1hcnF1ZWVcIiwgXCJuYXZpZ2F0aW9uXCIsIFwibm9uZVwiLCBcIm5vdGVcIiwgXCJwcmVzZW50YXRpb25cIiwgXCJzZWFyY2hcIiwgXCJzdGF0dXNcIiwgXCJ0YWJwYW5lbFwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwic2VsZWN0XCI6IHtcbiAgICAgICAgICAgIFwibm8tbXVsdGlwbGUtYXR0ci1zaXplLWd0MVwiOiB7XG4gICAgICAgICAgICAgICAgLy9yb2xlQ29uZGl0aW9uOiBcIiB3aXRoIGEgbXVsdGlwbGUgYXR0cmlidXRlIG9yIGEgc2l6ZSBhdHRyaWJ1dGUgaGF2aW5nIHZhbHVlIGdyZWF0ZXIgdGhhbiAxXCJcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImNvbWJvYm94XCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcIm1lbnVcIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvdGhlckRpc2FsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1tdWx0aXNlbGVjdGFibGVcIl1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm11bHRpcGxlLWF0dHItc2l6ZS1ndDFcIjoge1xuICAgICAgICAgICAgICAgIC8vcm9sZUNvbmRpdGlvbjogXCIgd2l0aCBubyBtdWx0aXBsZSBhdHRyaWJ1dGUgYW5kIG5vIHNpemUgYXR0cmlidXRlIGhhdmluZyB2YWx1ZSBncmVhdGVyIHRoYW4gMVwiXG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJsaXN0Ym94XCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvdGhlckRpc2FsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1tdWx0aXNlbGVjdGFibGVcIl1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJzdW1tYXJ5XCI6IHtcbiAgICAgICAgICAgIFwiZmlyc3Qtc3VtbWFyeS1vZi1kZXRhaWxcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtZGlzYWJsZWRcIiwgXCJhcmlhLWhhc3BvcHVwXCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJuby1maXJzdC1zdW1tYXJ5LW9mLWRldGFpbFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwidGJvZHlcIjoge1xuICAgICAgICAgICAgXCJkZXMtdGFibGVcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wicm93Z3JvdXBcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImRlcy1ncmlkXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInJvd2dyb3VwXCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJkZXMtdHJlZWdyaWRcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wicm93Z3JvdXBcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImRlcy1vdGhlclwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwidGRcIjoge1xuICAgICAgICAgICAgXCJkZXMtdGFibGVcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiY2VsbFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImRlcy1ncmlkXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdyaWRjZWxsXCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZGVzLXRyZWVncmlkXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdyaWRjZWxsXCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZGVzLW90aGVyXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJ0aFwiOiB7XG4gICAgICAgICAgICBcImRlcy10YWJsZS1yb3ctc2NvcGVcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wicm93aGVhZGVyXCIsIFwiY2VsbFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImRlcy10YWJsZS1jb2x1bW4tc2NvcGVcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiY29sdW1uaGVhZGVyXCIsIFwiY2VsbFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImRlcy1ncmlkLXRyZWVncmlkLXJvdy1zY29wZVwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJyb3doZWFkZXJcIiwgXCJncmlkY2VsbFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImRlcy1ncmlkLXRyZWVncmlkLWNvbHVtbi1zY29wZVwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJjb2x1bW5oZWFkZXJcIiwgXCJncmlkY2VsbFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImRlcy1vdGhlclwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwidHJcIjoge1xuICAgICAgICAgICAgXCJkZXMtdGFibGVcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wicm93XCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZGVzLWdyaWRcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wicm93XCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZGVzLXRyZWVncmlkXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInJvd1wiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImRlcy1vdGhlclwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICBcImRlZmF1bHRcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgLy9yb2xlQ29uZGl0aW9uOiBcIlwiLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9XG4gICAgfSAvLyBlbmQgb2YgZG9jdW1lbnRDb25mb3JtYW5jZVJlcXVpcmVtZW50U3BlY2lhbFRhZ3NcblxuICAgIC8vIG1hcCBhcmlhIGF0dHJpYnV0ZSB0byB0aGUgY29ycmVzcG9uZGluZyBuYXRpdmUgYXR0cmlidXRlLCBhcHBseSB0byBhbnkgZWxlbWVudCBhcHBsaWNhYmxlXG4gICAgLy8gbm90ZSB0aGlzIG1hcHBpbmcgaXMgZm9yIHRoZSByZWxhdGVkIGF0dHJpYnV0ZXMgaW4gdGhlIHNhbWUgZWxlbWVudCB3aXRob3V0IGNoZWNraW5nIHRoZSBwYXJlbnQgdHJlZS5cbiAgICAvLyByZWZlciB0byBodHRwczovL3czYy5naXRodWIuaW8vaHRtbC1hcmlhL1xuICAgIHN0YXRpYyByZWxhdGVkQXJpYUh0bWxBdHRyaWJ1dGVzOiB7XG4gICAgICAgIFthcmlhQXR0cjogc3RyaW5nXSA6IHtcbiAgICAgICAgICAgIGNvbmZsaWN0OiB7XG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBzdHJpbmcgfCBudWxsLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogc3RyaW5nW10sXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZVZhbHVlczogc3RyaW5nW10gfCBudWxsXG4gICAgICAgICAgICB9W10sXG4gICAgICAgICAgICBvdmVybGFwcGluZz86IHsgICAgXG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBzdHJpbmcgfCBudWxsLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogc3RyaW5nW10sXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZVZhbHVlczogc3RyaW5nW10gfCBudWxsXG4gICAgICAgICAgICB9W11cbiAgICAgICAgfSBcbiAgICB9ID0gIHtcbiAgICAgICAgXCJhcmlhLWNoZWNrZWRcIjoge1xuICAgICAgICAgICAgY29uZmxpY3Q6IFt7XG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBcImZhbHNlXCIsXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZU5hbWVzOiBbXCJjaGVja2VkXCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IG51bGxcbiAgICAgICAgICAgIH1dLFxuICAgICAgICAgICAgb3ZlcmxhcHBpbmc6IFt7ICAgIFxuICAgICAgICAgICAgICAgIGFyaWFBdHRyaWJ1dGVWYWx1ZTogXCJ0cnVlXCIsXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZU5hbWVzOiBbXCJjaGVja2VkXCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IG51bGxcbiAgICAgICAgICAgIH1dXG4gICAgICAgIH0sICAgIFxuICAgICAgICBcImFyaWEtZGlzYWJsZWRcIjoge1xuICAgICAgICAgICAgY29uZmxpY3Q6IFt7XG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBcImZhbHNlXCIsXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZU5hbWVzOiBbXCJkaXNhYmxlZFwiXSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlVmFsdWVzOiBudWxsXG4gICAgICAgICAgICB9XSxcbiAgICAgICAgICAgIG92ZXJsYXBwaW5nOiBbeyAgICBcbiAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlVmFsdWU6IFwidHJ1ZVwiLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wiZGlzYWJsZWRcIl0sXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZVZhbHVlczogbnVsbFxuICAgICAgICAgICAgfV1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWhpZGRlblwiOiB7XG4gICAgICAgICAgICBjb25mbGljdDogW3tcbiAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlVmFsdWU6IFwiZmFsc2VcIixcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IFtcImhpZGRlblwiXSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlVmFsdWVzOiBbXCJoaWRkZW4sbnVsbFwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlVmFsdWU6IFwidHJ1ZVwiLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wiaGlkZGVuXCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IFtcInVudGlsLWZvdW5kXCJdXG4gICAgICAgICAgICB9XSxcbiAgICAgICAgICAgIG92ZXJsYXBwaW5nOiBbeyAgICBcbiAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlVmFsdWU6IFwidHJ1ZVwiLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wiaGlkZGVuXCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IFtcImhpZGRlbixudWxsXCJdXG4gICAgICAgICAgICB9XVxuICAgICAgICB9LCAgICBcbiAgICAgICAgXCJhcmlhLXBsYWNlaG9sZGVyXCI6IHtcbiAgICAgICAgICAgIGNvbmZsaWN0OiBbe1xuICAgICAgICAgICAgICAgIGFyaWFBdHRyaWJ1dGVWYWx1ZTogbnVsbCxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IFtcInBsYWNlaG9sZGVyXCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IG51bGxcbiAgICAgICAgICAgIH1dXG4gICAgICAgIH0sICAgIFxuICAgICAgICBcImFyaWEtdmFsdWVtYXhcIjoge1xuICAgICAgICAgICAgY29uZmxpY3Q6IFt7XG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBudWxsLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wibWF4XCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IG51bGxcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgICAvL292ZXJsYXAgY2FzZSBjb3ZlcmVkIGluIHRoZSByb2xlIGRlZmluaXRpb246IEF1dGhvcnMgU0hPVUxEIE5PVCB1c2UgYXJpYS12YWx1ZW1heCBvbiBhbnkgZWxlbWVudCB3aGljaCBhbGxvd3MgdGhlIG1heCBhdHRyaWJ1dGUuIFVzZSB0aGUgbWF4IGF0dHJpYnV0ZSBpbnN0ZWFkLiBcbiAgICAgICAgfSwgICAgXG4gICAgICAgIFwiYXJpYS12YWx1ZW1pblwiOiB7XG4gICAgICAgICAgICBjb25mbGljdDogW3tcbiAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlVmFsdWU6IG51bGwsXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZU5hbWVzOiBbXCJtaW5cIl0sXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZVZhbHVlczogbnVsbFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICAgIC8vLy9vdmVybGFwIGNhc2UgY292ZXJlZCBpbiB0aGUgcm9sZSBkZWZpbml0aW9uOkF1dGhvcnMgU0hPVUxEIE5PVCB1c2UgYXJpYS12YWx1ZW1pbiBvbiBhbnkgZWxlbWVudCB3aGljaCBhbGxvd3MgdGhlIG1pbiBhdHRyaWJ1dGUuIFVzZSB0aGUgbWluIGF0dHJpYnV0ZSBpbnN0ZWFkLlxuICAgICAgICB9LCAgICBcbiAgICAgICAgXCJhcmlhLXJlYWRvbmx5XCI6IHtcbiAgICAgICAgICAgIGNvbmZsaWN0OiBbe1xuICAgICAgICAgICAgICAgIGFyaWFBdHRyaWJ1dGVWYWx1ZTogXCJmYWxzZVwiLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wicmVhZG9ubHlcIiwgXCJjb250ZW50ZWRpdGFibGVcIiwgXCJpc2NvbnRlbnRlZGl0YWJsZVwiXSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlVmFsdWVzOiBbbnVsbCwgXCJmYWxzZVwiLCBcImZhbHNlXCJdXG4gICAgICAgICAgICB9XSxcbiAgICAgICAgICAgIG92ZXJsYXBwaW5nOiBbeyAgICBcbiAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlVmFsdWU6IFwidHJ1ZVwiLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wicmVhZG9ubHlcIiwgXCJjb250ZW50ZWRpdGFibGVcIiwgXCJpc2NvbnRlbnRlZGl0YWJsZVwiXSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlVmFsdWVzOiBbbnVsbCwgXCJ0cnVlXCIsIFwidHJ1ZVwiXVxuICAgICAgICAgICAgfV1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXJlcXVpcmVkXCI6IHtcbiAgICAgICAgICAgIGNvbmZsaWN0OiBbe1xuICAgICAgICAgICAgICAgIGFyaWFBdHRyaWJ1dGVWYWx1ZTogXCJmYWxzZVwiLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wicmVxdWlyZWRcIl0sXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZVZhbHVlczogbnVsbFxuICAgICAgICAgICAgfV0sXG4gICAgICAgICAgICBvdmVybGFwcGluZzogW3sgICAgXG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBcInRydWVcIixcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IFtcInJlcXVpcmVkXCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IG51bGxcbiAgICAgICAgICAgIH1dXG4gICAgICAgIH0sICAgICAgICBcbiAgICAgICAgXCJhcmlhLWNvbHNwYW5cIjoge1xuICAgICAgICAgICAgY29uZmxpY3Q6IFt7XG4gICAgICAgICAgICAgICAgLy8gY29uZmxpY3Qgb2NjdXJzIGlmIGJvdGggdmFsdWVzIGFyZSBkaWZmZXJlbnRcbiAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlVmFsdWU6IFwiVkFMVUVcIixcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IFtcImNvbHNwYW5cIl0sXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZVZhbHVlczogW1wiVkFMVUVcIl1cbiAgICAgICAgICAgIH1dLFxuICAgICAgICAgICAgb3ZlcmxhcHBpbmc6IFt7ICAgIFxuICAgICAgICAgICAgICAgIC8vIG92ZXJsYXAgb2NjdXJzIGlmIGJvdGggZXhpc3RzXG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBudWxsLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wiY29sc3BhblwiXSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlVmFsdWVzOiBudWxsXG4gICAgICAgICAgICB9XVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtcm93c3BhblwiOiB7XG4gICAgICAgICAgICBjb25mbGljdDogW3tcbiAgICAgICAgICAgICAgICAvLyBjb25mbGljdCBvY2N1cnMgaWYgYm90aCB2YWx1ZXMgYXJlIGRpZmZlcmVudFxuICAgICAgICAgICAgICAgIGFyaWFBdHRyaWJ1dGVWYWx1ZTogXCJWQUxVRVwiLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wicm93c3BhblwiXSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlVmFsdWVzOiBbXCJWQUxVRVwiXVxuICAgICAgICAgICAgfV0sXG4gICAgICAgICAgICBvdmVybGFwcGluZzogW3sgICBcbiAgICAgICAgICAgICAgICAvLyBvdmVybGFwIG9jY3VycyBpZiBib3RoIGV4aXN0cyBcbiAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlVmFsdWU6IG51bGwsXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZU5hbWVzOiBbXCJyb3dzcGFuXCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IG51bGxcbiAgICAgICAgICAgIH1dXG4gICAgICAgIH0sXG4gICAgICAgIC8qKiBcImFyaWEtYXV0b2NvbXBsZXRlXCI6IHtcbiAgICAgICAgICAgIGNvbmZsaWN0OiBbe1xuICAgICAgICAgICAgICAgIC8vIGNvbmZsaWN0IG9jY3VycyBpZiBib3RoIGV4aXN0cywgYXJpYSB2YWx1ZSBpcyBvbmx5IGZvciBjdXN0b20gd2lkZ2V0LCByYXRoZXIgdGhhbiBuYXRpdmVcbiAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlVmFsdWU6IG51bGwsXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZU5hbWVzOiBbXCJhdXRvY29tcGxldGVcIl0sXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZVZhbHVlczogbnVsbFxuICAgICAgICAgICAgfV1cbiAgICAgICAgfSAqLyBcbiAgICB9XG5cbiAgICBzdGF0aWMgY29udGFpbmVycyA9IFtdXG59O1xuXG5sZXQgY29udGFpbmVyQXJyYXkgPSBbXTtcblxuZm9yIChjb25zdCByb2xlRGVzaWduIGluIEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJucykge1xuICAgIGNvbnN0IGNvbnRhaW5lcnMgPSBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNbcm9sZURlc2lnbl0uY29udGFpbmVyO1xuICAgIGlmIChjb250YWluZXJzICE9PSBudWxsKSB7XG4gICAgICAgIGZvciAoY29uc3QgY29udGFpbmVyIG9mIGNvbnRhaW5lcnMpIHtcbiAgICAgICAgICAgIGlmIChjb250YWluZXJBcnJheS5pbmRleE9mKGNvbnRhaW5lcikgPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBjb250YWluZXJBcnJheS5wdXNoKGNvbnRhaW5lcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5BUklBRGVmaW5pdGlvbnMuY29udGFpbmVycyA9IGNvbnRhaW5lckFycmF5O1xuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBBUklBRGVmaW5pdGlvbnMgfSBmcm9tIFwiLi9BUklBRGVmaW5pdGlvbnNcIjtcbmltcG9ydCB7IENvbW1vbk1hcHBlciB9IGZyb20gXCIuLi9jb21tb24vQ29tbW9uTWFwcGVyXCI7XG5pbXBvcnQgeyBET01VdGlsIH0gZnJvbSBcIi4uL2RvbS9ET01VdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uLy4uL3Y0L3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vLi4vdjQvdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG5pbXBvcnQgeyBJTWFwUmVzdWx0IH0gZnJvbSBcIi4uLy4uL3Y0L2FwaS9JTWFwcGVyXCI7XG5pbXBvcnQgeyBBUklBV2Fsa2VyIH0gZnJvbSBcIi4vQVJJQVdhbGtlclwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4uLy4uL3Y0L3V0aWwvQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vZG9tL0RPTVdhbGtlclwiO1xuaW1wb3J0IHsgQWNjTmFtZVV0aWwgfSBmcm9tIFwiLi4vLi4vdjQvdXRpbC9BY2NOYW1lVXRpbFwiO1xuXG50eXBlIEVsZW1DYWxjID0gKGVsZW06IEVsZW1lbnQpID0+IHN0cmluZztcbnR5cGUgTm9kZUNhbGMgPSAobm9kZTogTm9kZSkgPT4gc3RyaW5nO1xuXG5leHBvcnQgY2xhc3MgQVJJQU1hcHBlciBleHRlbmRzIENvbW1vbk1hcHBlciB7XG4gICAgY2hpbGRyZW5DYW5IYXZlUm9sZShub2RlOiBOb2RlLCByb2xlOiBzdHJpbmcpIDogYm9vbGVhbiB7XG4gICAgICAgIC8vIGlmIChub2RlLm5vZGVUeXBlID09PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovKSB7XG4gICAgICAgIC8vICAgICBjb25zdCBlbGVtID0gbm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyAgICAgaWYgKGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1oaWRkZW5cIikgPT09IFwidHJ1ZVwiKSB7XG4gICAgICAgIC8vICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyB9XG4gICAgICAgIHJldHVybiAhKHJvbGUgaW4gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zICYmIEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlXS5wcmVzZW50YXRpb25hbENoaWxkcmVuKTtcbiAgICB9XG4gICAgZ2V0Um9sZShub2RlOiBOb2RlKSA6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHJvbGUgPSBBUklBTWFwcGVyLm5vZGVUb1JvbGUobm9kZSk7XG4gICAgICAgIHJldHVybiByb2xlO1xuICAgIH1cbiAgICBnZXROYW1lc3BhY2UoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIFwiYXJpYVwiXG4gICAgfVxuICAgIGdldEF0dHJpYnV0ZXMobm9kZTogTm9kZSkgOiB7IFtrZXk6c3RyaW5nXTogc3RyaW5nIH0ge1xuICAgICAgICBsZXQgcmV0VmFsID0ge307XG4gICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovKSB7XG4gICAgICAgICAgICBjb25zdCBjYWNoZVZhbCA9IENhY2hlVXRpbC5nZXRDYWNoZShub2RlIGFzIEhUTUxFbGVtZW50LCBcIkFSSUFNYXBwZXI6OmdldEF0dHJpYnV0ZXNcIiwgdW5kZWZpbmVkKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY2FjaGVWYWwgIT09IFwidW5kZWZpbmVkXCIpIHJldHVybiBjYWNoZVZhbDtcbiAgICAgICAgICAgIGNvbnN0IGVsZW0gPSBub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICBmb3IgKGxldCBpZHg9MDsgaWR4PGVsZW0uYXR0cmlidXRlcy5sZW5ndGg7ICsraWR4KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYXR0ckluZm8gPSBlbGVtLmF0dHJpYnV0ZXNbaWR4XTtcbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gYXR0ckluZm8ubmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoXCJhcmlhLVwiKSkge1xuICAgICAgICAgICAgICAgICAgICByZXRWYWxbbmFtZS5zdWJzdHJpbmcoNSldID0gYXR0ckluZm8ubm9kZVZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gT3B0aW1pemU6IENhY2hlIG5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgdG8gYXZvaWQgcmVwZWF0ZWQgY2FsbHNcbiAgICAgICAgICAgIGNvbnN0IG5vZGVOYW1lID0gbm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBBcHBseSBnbG9iYWwgYXR0cmlidXRlcyBmaXJzdFxuICAgICAgICAgICAgQVJJQU1hcHBlci5hcHBseUF0dHJSb2xlKGVsZW0sIFwiZ2xvYmFsXCIsIHJldFZhbCk7XG4gICAgICAgICAgICAvLyBBcHBseSBlbGVtZW50LXNwZWNpZmljIGF0dHJpYnV0ZXNcbiAgICAgICAgICAgIEFSSUFNYXBwZXIuYXBwbHlBdHRyUm9sZShlbGVtLCBub2RlTmFtZSwgcmV0VmFsKTtcbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShub2RlIGFzIEhUTUxFbGVtZW50LCBcIkFSSUFNYXBwZXI6OmdldEF0dHJpYnV0ZXNcIiwgcmV0VmFsKTtcbiAgICAgICAgfSBlbHNlIGlmIChub2RlLm5vZGVUeXBlID09PSAzIC8qIE5vZGUuVEVYVF9OT0RFICovKSB7XG4gICAgICAgICAgICBjb25zdCBjYWxjdWxhdG9ycyA9IEFSSUFNYXBwZXIudGV4dEF0dHJWYWx1ZUNhbGN1bGF0b3JzO1xuICAgICAgICAgICAgZm9yIChjb25zdCBhdHRyIGluIGNhbGN1bGF0b3JzKSB7XG4gICAgICAgICAgICAgICAgbGV0IHZhbCA9IGNhbGN1bGF0b3JzW2F0dHJdKG5vZGUpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsICE9PSBcInVuZGVmaW5lZFwiICYmIHZhbCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICByZXRWYWxbYXR0cl0gPSB2YWw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgLy8gT3B0aW1pemU6IE1vdmUgYXBwbHlBdHRyUm9sZSBvdXRzaWRlIGdldEF0dHJpYnV0ZXMgdG8gYXZvaWQgZnVuY3Rpb24gcmVjcmVhdGlvblxuICAgIHByaXZhdGUgc3RhdGljIGFwcGx5QXR0clJvbGUoZWxlbTogRWxlbWVudCwgbm9kZU5hbWU6IHN0cmluZywgcmV0VmFsOiB7IFtrZXk6c3RyaW5nXTogc3RyaW5nIH0pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY2FsY3VsYXRvcnMgPSBBUklBTWFwcGVyLmVsZW1BdHRyVmFsdWVDYWxjdWxhdG9ycztcbiAgICAgICAgaWYgKCEobm9kZU5hbWUgaW4gY2FsY3VsYXRvcnMpKSByZXR1cm47XG4gICAgICAgIFxuICAgICAgICBmb3IgKGNvbnN0IGF0dHIgaW4gY2FsY3VsYXRvcnNbbm9kZU5hbWVdKSB7XG4gICAgICAgICAgICBpZiAoIShhdHRyIGluIHJldFZhbCkpIHtcbiAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSBjYWxjdWxhdG9yc1tub2RlTmFtZV1bYXR0cl07XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9ICh2YWx1ZSBhcyBFbGVtQ2FsYykoZWxlbSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsW2F0dHJdID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGdldEFyaWFPd25lZEJ5KGVsZW06IEhUTUxFbGVtZW50KSA6IEhUTUxFbGVtZW50IHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IGRvYyA9IEZyYWdtZW50VXRpbC5nZXRPd25lckZyYWdtZW50KGVsZW0pO1xuICAgICAgICBpZiAoIUNhY2hlVXRpbC5nZXRDYWNoZShkb2MsIFwiQVJJQU1hcHBlcjo6cHJlY2FsY093bmVkXCIsIGZhbHNlKSkge1xuICAgICAgICAgICAgY29uc3Qgb3duZXJzID0gZG9jLnF1ZXJ5U2VsZWN0b3JBbGwoXCJbYXJpYS1vd25zXVwiKTtcbiAgICAgICAgICAgIGZvciAobGV0IGlPd25lciA9IDA7IGlPd25lciA8IG93bmVycy5sZW5ndGg7ICsraU93bmVyKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3duZXIgPSBvd25lcnNbaU93bmVyXTtcbiAgICAgICAgICAgICAgICBjb25zdCBvd25JZHMgPSBvd25lci5nZXRBdHRyaWJ1dGUoXCJhcmlhLW93bnNcIikuc3BsaXQoLyArL2cpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGlJZD0wOyBpSWQgPCBvd25JZHMubGVuZ3RoOyArK2lJZCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvd25lZCA9IGRvYy5nZXRFbGVtZW50QnlJZChvd25JZHNbaUlkXSk7XG4gICAgICAgICAgICAgICAgICAgIC8vaWdub3JlIGlmIHRoZSBhcmlhLW93bnMgcG9pbnQgdG8gdGhlIGVsZW1lbnQgaXRzZWxmXG4gICAgICAgICAgICAgICAgICAgIC8vaWYgKG93bmVkICYmICFET01VdGlsLnNhbWVOb2RlKG93bmVyLCBvd25lZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgQ2FjaGVVdGlsLnNldENhY2hlKG93bmVkLCBcImFyaWEtb3duZWRcIiwgb3duZXIpO1xuICAgICAgICAgICAgICAgICAgICAvL31cbiAgICAgICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICAgICAqICBjaXJjdWxhciBoaWVyYXJjaHkgY2hlY2s6XG4gICAgICAgICAgICAgICAgICAgICAqICAoMSkgdGhlIG93bmVkIGVsZW1lbnQgaXMgbmVpdGhlciB0aGUgc2FtZSBlbGVtZW50IHdpdGggdGhlIG93bmVyIG5vciBhbnkgYXNjZW5kYW50IG9mIHRoZSBvd25lclxuICAgICAgICAgICAgICAgICAgICAgKiAgKDIpIGFueSBjaGlsZCB3aXRoIGFyaWEtb3ducyBjYW5ub3QgcG9pbnQgdG8gdGhlIG93bmVyIG9yIGFueSBhc2NlbmRhbnQgb2YgdGhlIG93bmVyXG4gICAgICAgICAgICAgICAgICAgICAqLyBcbiAgICAgICAgICAgICAgICAgICAgaWYgKG93bmVkICYmICFET01VdGlsLnNhbWVOb2RlKG93bmVyLCBvd25lZCkpIHsgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZSBvd25lZCB3aXRoIGFyaWEtb3ducyB0aGF0IHBvaW50cyB0byBhbm90aGVyIGVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvd25lZE5vZGVzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdWJfb3duZXJzID0gb3duZWQucXVlcnlTZWxlY3RvckFsbChcIlthcmlhLW93bnNdXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdWJfb3duZXJzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3ViX293bmVyID0gc3ViX293bmVyc1tpXTsgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3ViX293bklkcyA9IHN1Yl9vd25lci5nZXRBdHRyaWJ1dGUoXCJhcmlhLW93bnNcIikuc3BsaXQoLyArL2cpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGo9MDsgaiA8IHN1Yl9vd25JZHMubGVuZ3RoOyArK2opIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3duZWROb2RlID0gZG9jLmdldEVsZW1lbnRCeUlkKHN1Yl9vd25JZHNbal0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3duZWROb2RlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZWROb2Rlcy5wdXNoKG93bmVkTm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvd25lZE5vZGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShvd25lZCwgXCJhcmlhLW93bmVkXCIsIG93bmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiBhbnkgYXJpYS1vd25zIHBvaW50cyB0byB0aGUgZWxlbWVudCBpdHNlbGYgb3IgYW55IG9mIGl0J3MgcGFyZW50XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGFyZW50IDogRWxlbWVudCA9IG93bmVyOyAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNpcmN1bGFyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocGFyZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZm91bmQgPSBvd25lZE5vZGVzLnNvbWUoaXRlbSA9PiBET01VdGlsLnNhbWVOb2RlKHBhcmVudCwgaXRlbSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudCA9IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KHBhcmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaXJjdWxhciA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gICBcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2lyY3VsYXIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKG93bmVkLCBcImFyaWEtb3duZWRcIiwgb3duZXIpOyAgICBcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShkb2MsIFwiQVJJQU1hcHBlcjo6cHJlY2FsY093bmVkXCIsIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBDYWNoZVV0aWwuZ2V0Q2FjaGUoZWxlbSwgXCJhcmlhLW93bmVkXCIsIG51bGwpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0Tm9kZUhpZXJhcmNoeShub2RlOiBOb2RlKSB7XG4gICAgICAgIGlmICghbm9kZSkgcmV0dXJuIFtdO1xuICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSAhPT0gMSkge1xuICAgICAgICAgICAgbGV0IHBhcmVudEhpZXJhcmNoeSA9IHRoaXMuZ2V0Tm9kZUhpZXJhcmNoeShET01XYWxrZXIucGFyZW50RWxlbWVudChub2RlKSk7XG4gICAgICAgICAgICBsZXQgcGFyZW50SW5mbyA9IHBhcmVudEhpZXJhcmNoeS5sZW5ndGggPiAwID8gcGFyZW50SGllcmFyY2h5W3BhcmVudEhpZXJhcmNoeS5sZW5ndGgtMV0gOiB7XG4gICAgICAgICAgICAgICAgcm9sZTogXCJcIixcbiAgICAgICAgICAgICAgICByb2xlUGF0aDogXCJcIixcbiAgICAgICAgICAgICAgICByb2xlQ291bnQ6IHt9LFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuQ2FuSGF2ZVJvbGU6IHRydWVcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBsZXQgbm9kZUhpZXJhcmNoeSA9IFtdO1xuICAgICAgICAgICAgLy8gU2V0IGhpZXJhcmNoeVxuICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHBhcmVudEhpZXJhcmNoeSkge1xuICAgICAgICAgICAgICAgIG5vZGVIaWVyYXJjaHkucHVzaChpdGVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5vZGVIaWVyYXJjaHkucHVzaCh7XG4gICAgICAgICAgICAgICAgYXR0cmlidXRlczoge30sXG4gICAgICAgICAgICAgICAgYm91bmRzOiB0aGlzLmdldEJvdW5kcyhub2RlKSxcbiAgICAgICAgICAgICAgICBuYW1lc3BhY2U6IHRoaXMuZ2V0TmFtZXNwYWNlKCksXG4gICAgICAgICAgICAgICAgbm9kZTogbm9kZSxcbiAgICAgICAgICAgICAgICByb2xlOiB0aGlzLmdldFJvbGUobm9kZSkgfHwgbnVsbCxcbiAgICAgICAgICAgICAgICByb2xlUGF0aDogcGFyZW50SW5mby5yb2xlUGF0aCtcIi9cIisodGhpcy5nZXRSb2xlKG5vZGUpIHx8IG51bGwpLFxuICAgICAgICAgICAgICAgIHJvbGVDb3VudDoge30sXG4gICAgICAgICAgICAgICAgY2hpbGRyZW5DYW5IYXZlUm9sZTogcGFyZW50SW5mby5jaGlsZHJlbkNhbkhhdmVSb2xlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBub2RlSGllcmFyY2h5O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IGVsZW0gPSBub2RlIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgbGV0IG5vZGVIaWVyYXJjaHkgOiBBcnJheTx7XG4gICAgICAgICAgICAgICAgcm9sZTogc3RyaW5nLFxuICAgICAgICAgICAgICAgIHJvbGVQYXRoOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgcm9sZUNvdW50OiB7XG4gICAgICAgICAgICAgICAgICAgIFtyb2xlOiBzdHJpbmddOiBudW1iZXJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2hpbGRyZW5DYW5IYXZlUm9sZTogYm9vbGVhblxuICAgICAgICAgICAgfT4gPSBDYWNoZVV0aWwuZ2V0Q2FjaGUoZWxlbSwgXCJBUklBTWFwcGVyOjpnZXROb2RlSGllcmFyY2h5XCIsIG51bGwpO1xuICAgICAgICAgICAgaWYgKCFub2RlSGllcmFyY2h5KSB7XG4gICAgICAgICAgICAgICAgLy8gVGhpcyBlbGVtZW50IGhhc24ndCBiZWVuIHByb2Nlc3NlZCB5ZXQgLSBidXQgOjpyZXNldCBwcm9jZXNzZXMgdGhlbSBhbGwgaW4gdGhlIHJpZ2h0IG9yZGVyXG5cbiAgICAgICAgICAgICAgICAvLyBHZXQgZGV0YWlscyBhYm91dCB0aGUgY29ycmVjdCBwYXJlbnQgZmlyc3RcbiAgICAgICAgICAgICAgICBsZXQgcGFyZW50ID0gQVJJQU1hcHBlci5nZXRBcmlhT3duZWRCeShlbGVtKTtcbiAgICAgICAgICAgICAgICBpZiAoIXBhcmVudCkge1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBET01XYWxrZXIucGFyZW50RWxlbWVudChlbGVtKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICB9IFxuICAgICAgICAgICAgICAgIHdoaWxlIChwYXJlbnQgJiYgcGFyZW50Lm5vZGVUeXBlICE9PSAxKSB7IFxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBET01XYWxrZXIucGFyZW50RWxlbWVudChlbGVtKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHBhcmVudEhpZXJhcmNoeSA9IHBhcmVudCA/IHRoaXMuZ2V0Tm9kZUhpZXJhcmNoeShwYXJlbnQpIDogW107XG4gICAgICAgICAgICAgICAgbGV0IHBhcmVudEluZm8gPSBwYXJlbnRIaWVyYXJjaHkubGVuZ3RoID4gMCA/IHBhcmVudEhpZXJhcmNoeVtwYXJlbnRIaWVyYXJjaHkubGVuZ3RoLTFdIDoge1xuICAgICAgICAgICAgICAgICAgICByb2xlOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICByb2xlUGF0aDogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgcm9sZUNvdW50OiB7fSxcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW5DYW5IYXZlUm9sZTogdHJ1ZVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgd2hpbGUgKHBhcmVudEluZm8ucm9sZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBBUklBTWFwcGVyLmdldEFyaWFPd25lZEJ5KHBhcmVudCkgfHwgRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQocGFyZW50KSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50SGllcmFyY2h5ID0gcGFyZW50ID8gdGhpcy5nZXROb2RlSGllcmFyY2h5KHBhcmVudCkgOiBbXTtcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50SW5mbyA9IHBhcmVudEhpZXJhcmNoeVtwYXJlbnRIaWVyYXJjaHkubGVuZ3RoLTFdO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFNldCBpbml0aWFsIG5vZGUgaW5mb1xuICAgICAgICAgICAgICAgIGxldCBub2RlSW5mbyA6IHtcbiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgW3JvbGU6IHN0cmluZ106IHN0cmluZ1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJvdW5kczogYW55LFxuICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgbm9kZTogSFRNTEVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIHJvbGU6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgcm9sZVBhdGg6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgcm9sZUNvdW50OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBbcm9sZTogc3RyaW5nXTogbnVtYmVyXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW5DYW5IYXZlUm9sZTogYm9vbGVhblxuICAgICAgICAgICAgICAgIH0gPSB7XG4gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IGVsZW0ubm9kZVR5cGUgPT09IDEgPyB0aGlzLmdldEF0dHJpYnV0ZXMoZWxlbSk6IHt9LCAgIFxuICAgICAgICAgICAgICAgICAgICBib3VuZHM6IHRoaXMuZ2V0Qm91bmRzKGVsZW0pLFxuICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U6IHRoaXMuZ2V0TmFtZXNwYWNlKCksXG4gICAgICAgICAgICAgICAgICAgIG5vZGU6IGVsZW0sXG4gICAgICAgICAgICAgICAgICAgIHJvbGU6IHRoaXMuZ2V0Um9sZShlbGVtKSB8fCBudWxsLFxuICAgICAgICAgICAgICAgICAgICByb2xlUGF0aDogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgcm9sZUNvdW50OiB7fSxcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW5DYW5IYXZlUm9sZTogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIEFkanVzdCByb2xlIGlmIHdlJ3JlIHdpdGhpbiBhIHByZXNlbnRhdGlvbmFsIGNvbnRhaW5lclxuICAgICAgICAgICAgICAgIGxldCBwcmVzZW50YXRpb25hbENvbnRhaW5lciA9ICFwYXJlbnRJbmZvLmNoaWxkcmVuQ2FuSGF2ZVJvbGU7XG4gICAgICAgICAgICAgICAgaWYgKHByZXNlbnRhdGlvbmFsQ29udGFpbmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGVJbmZvLnJvbGUgPSBudWxsO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGVJbmZvLmNoaWxkcmVuQ2FuSGF2ZVJvbGUgPSBwYXJlbnRJbmZvLmNoaWxkcmVuQ2FuSGF2ZVJvbGUgXG4gICAgICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLmNoaWxkcmVuQ2FuSGF2ZVJvbGUoZWxlbSwgbm9kZUluZm8ucm9sZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gU2V0IHRoZSBwYXRoc1xuICAgICAgICAgICAgICAgIGlmIChub2RlSW5mby5yb2xlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudEluZm8ucm9sZUNvdW50W25vZGVJbmZvLnJvbGVdID0gKHBhcmVudEluZm8ucm9sZUNvdW50W25vZGVJbmZvLnJvbGVdIHx8IDApICsgMTsgXG4gICAgICAgICAgICAgICAgICAgIG5vZGVJbmZvLnJvbGVQYXRoID0gcGFyZW50SW5mby5yb2xlUGF0aCtcIi9cIitub2RlSW5mby5yb2xlK1wiW1wiK3BhcmVudEluZm8ucm9sZUNvdW50W25vZGVJbmZvLnJvbGVdK1wiXVwiO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGVJbmZvLnJvbGVQYXRoID0gcGFyZW50SW5mby5yb2xlUGF0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIFNldCBoaWVyYXJjaHlcbiAgICAgICAgICAgICAgICBub2RlSGllcmFyY2h5ID0gW11cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgcGFyZW50SGllcmFyY2h5KSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGVIaWVyYXJjaHkucHVzaChpdGVtKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbm9kZUhpZXJhcmNoeS5wdXNoKG5vZGVJbmZvKTtcbiAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJBUklBTWFwcGVyOjpnZXROb2RlSGllcmFyY2h5XCIsIG5vZGVIaWVyYXJjaHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5vZGVIaWVyYXJjaHk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXNldChub2RlOiBOb2RlKSB7XG4gICAgICAgIEFSSUFNYXBwZXIubmFtZUNvbXB1dGF0aW9uSWQgPSAwO1xuICAgICAgICB0aGlzLmhpZXJhcmNoeVJvbGUgPSBbXTtcbiAgICAgICAgdGhpcy5oaWVyYXJjaHlSZXN1bHRzID0gW107XG4gICAgICAgIHRoaXMuaGllcmFyY2h5UGF0aCA9IFt7XG4gICAgICAgICAgICByb2xlUGF0aDogXCJcIixcbiAgICAgICAgICAgIHJvbGVDb3VudDoge31cbiAgICAgICAgfV07XG4gICAgICAgIC8vIEdldCB0byB0aGUgdG9wbW9zdCBub2RlXG4gICAgICAgIGxldCBnb29kTm9kZSA9IG5vZGU7XG4gICAgICAgIGxldCBuZXh0O1xuICAgICAgICB3aGlsZSAobmV4dCA9IERPTVdhbGtlci5wYXJlbnROb2RlKGdvb2ROb2RlKSkge1xuICAgICAgICAgICAgZ29vZE5vZGUgPSBuZXh0O1xuICAgICAgICB9O1xuICAgICAgICAvLyBXYWxrIHRoZSB0cmVlIGFuZCBzZXQgdGhlIGhpZXJhcmNoaWVzIGluIHRoZSByaWdodCBvcmRlclxuICAgICAgICBsZXQgYXJpYVdhbGtlciA9IG5ldyBBUklBV2Fsa2VyKGdvb2ROb2RlLCBmYWxzZSwgZ29vZE5vZGUpO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICBpZiAoYXJpYVdhbGtlci5ub2RlLm5vZGVUeXBlID09PSAxKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5nZXROb2RlSGllcmFyY2h5KGFyaWFXYWxrZXIubm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gd2hpbGUgKGFyaWFXYWxrZXIubmV4dE5vZGUoKSk7XG4gICAgfVxuXG4gICAgb3BlblNjb3BlKG5vZGU6IE5vZGUpOiBJTWFwUmVzdWx0W10ge1xuICAgICAgICBpZiAodGhpcy5oaWVyYXJjaHlSb2xlID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0KG5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucHVzaEhpZXJhcmNoeShub2RlKVxuICAgICAgICBmb3IgKGxldCBpZHg9MDsgaWR4PHRoaXMuaGllcmFyY2h5UmVzdWx0cy5sZW5ndGg7ICsraWR4KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oaWVyYXJjaHlSZXN1bHRzW2lkeF0ucm9sZSAmJiB0aGlzLmhpZXJhcmNoeVJlc3VsdHNbaWR4XS5yb2xlWzBdID09PSBcIi9cIikge1xuICAgICAgICAgICAgICAgIHRoaXMuaGllcmFyY2h5UmVzdWx0c1tpZHhdLnJvbGUgPSAodGhpcy5oaWVyYXJjaHlSZXN1bHRzW2lkeF0ucm9sZSA/IHRoaXMuaGllcmFyY2h5UmVzdWx0c1tpZHhdLnJvbGUuc3Vic3RyaW5nKDEpIDogbnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuaGllcmFyY2h5UmVzdWx0cztcbiAgICB9XG5cbiAgICBwdXNoSGllcmFyY2h5KG5vZGU6IE5vZGUpIHtcbiAgICAgICAgLy8gSWYgd2UncmUgbm90IGFuIGVsZW1lbnQsIG5vIHNwZWNpYWwgaGFuZGxpbmdcbiAgICAgICAgbGV0IG5vZGVIaWVyYXJjaHkgPSBbXVxuICAgICAgICAvLyBEZXRlcm1pbmUgb3VyIG5vZGUgaW5mb1xuICAgICAgICBub2RlSGllcmFyY2h5ID0gdGhpcy5nZXROb2RlSGllcmFyY2h5KG5vZGUpO1xuICAgICAgICBsZXQgbm9kZUluZm8gPSBub2RlSGllcmFyY2h5W25vZGVIaWVyYXJjaHkubGVuZ3RoLTFdO1xuICAgICAgICB0aGlzLmhpZXJhcmNoeVJvbGUucHVzaChub2RlSW5mby5yb2xlKTtcbiAgICAgICAgaWYgKG5vZGVJbmZvLnJvbGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuaGllcmFyY2h5UGF0aC5wdXNoKG5vZGVJbmZvKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaGllcmFyY2h5UmVzdWx0cyA9IG5vZGVIaWVyYXJjaHk7XG4gICAgfVxuXG4gICAgY2xvc2VTY29wZShub2RlOiBOb2RlKTogSU1hcFJlc3VsdFtdIHtcbiAgICAgICAgbGV0IHJldFZhbCA6IElNYXBSZXN1bHRbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHJlcyBvZiB0aGlzLmhpZXJhcmNoeVJlc3VsdHMpIHtcbiAgICAgICAgICAgIC8vIGNvbnN0IHRlbXAgPSByZXMubm9kZTtcbiAgICAgICAgICAgIC8vIHJlcy5ub2RlID0gbnVsbDtcbiAgICAgICAgICAgIC8vIGxldCBjbG9uZWQgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHJlcykpO1xuICAgICAgICAgICAgLy8gY2xvbmVkLm5vZGUgPSByZXMubm9kZSA9IHRlbXA7IFxuICAgICAgICAgICAgLy8gcmV0VmFsLnB1c2goY2xvbmVkKTtcbiAgICAgICAgICAgIHJldFZhbC5wdXNoKHJlcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJldFZhbC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXRWYWxbcmV0VmFsLmxlbmd0aC0xXS5yb2xlID0gXCIvXCIrcmV0VmFsW3JldFZhbC5sZW5ndGgtMV0ucm9sZVxuICAgICAgICAgICAgbGV0IHBhcmVudCA9IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KG5vZGUpO1xuICAgICAgICAgICAgdGhpcy5oaWVyYXJjaHlSZXN1bHRzID0gcGFyZW50ID8gQ2FjaGVVdGlsLmdldENhY2hlKHBhcmVudCBhcyBIVE1MRWxlbWVudCwgXCJBUklBTWFwcGVyOjpnZXROb2RlSW5mb1wiLCBbXSkgOiBbXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAvLyBIZWxwZXIgZnVuY3Rpb25zXG4gICAgLy8vL1xuXG4gICAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWwtYWFtLTEuMC8jbWFwcGluZy1odG1sLXRvLWFjY2Vzc2liaWxpdHktYXBpc1xuICAgIHB1YmxpYyBzdGF0aWMgZWxlbUF0dHJWYWx1ZUNhbGN1bGF0b3JzOiB7IFtub2RlTmFtZTpzdHJpbmddOiB7IFthdHRyOnN0cmluZ106IHN0cmluZyB8IEVsZW1DYWxjIH19ID0ge1xuICAgICAgICBcImdsb2JhbFwiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogZWxlbSA9PiBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWUoZWxlbSk/Lm5hbWUgIC8vQVJJQU1hcHBlci5jb21wdXRlTmFtZVxuICAgICAgICB9XG4gICAgICAgICwgXCJkYXRhbGlzdFwiOiB7XG4gICAgICAgICAgICAvLyBzZXQgdG8gXCJ0cnVlXCIgaWYgdGhlIGRhdGFsaXN0J3Mgc2VsZWN0aW9uIG1vZGVsIGFsbG93cyBtdWx0aXBsZSBvcHRpb24gZWxlbWVudHMgdG8gYmVcbiAgICAgICAgICAgIC8vIHNlbGVjdGVkIGF0IGEgdGltZSwgYW5kIFwiZmFsc2VcIiBvdGhlcndpc2VcbiAgICAgICAgICAgIFwibXVsdGlzZWxlY3RhYmxlXCI6IGVsZW0gPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlkID0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJpZFwiKTtcbiAgICAgICAgICAgICAgICBpZiAoaWQgJiYgaWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgaW5wdXQgPSBlbGVtLm93bmVyRG9jdW1lbnQucXVlcnlTZWxlY3RvcihcImlucHV0W2xpc3Q9J1wiK2lkK1wiJ11cIik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIlwiKyhlbGVtLmdldEF0dHJpYnV0ZShcIm11bHRpcGxlXCIpIFxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGVsZW0uZ2V0QXR0cmlidXRlKFwibXVsdGlwbGVcIik9PVwidHJ1ZVwiIHx8IGVsZW0uZ2V0QXR0cmlidXRlKFwibXVsdGlwbGVcIik9PVwiXCIpKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAsIFwiaDFcIjoge1xuICAgICAgICAgICAgXCJsZXZlbFwiOiBcIjFcIlxuICAgICAgICB9XG4gICAgICAgICwgXCJoMlwiOiB7XG4gICAgICAgICAgICBcImxldmVsXCI6IFwiMlwiXG4gICAgICAgIH1cbiAgICAgICAgLCBcImgzXCI6IHtcbiAgICAgICAgICAgIFwibGV2ZWxcIjogXCIzXCJcbiAgICAgICAgfVxuICAgICAgICAsIFwiaDRcIjoge1xuICAgICAgICAgICAgXCJsZXZlbFwiOiBcIjRcIlxuICAgICAgICB9XG4gICAgICAgICwgXCJoNVwiOiB7XG4gICAgICAgICAgICBcImxldmVsXCI6IFwiNVwiXG4gICAgICAgIH1cbiAgICAgICAgLCBcImg2XCI6IHtcbiAgICAgICAgICAgIFwibGV2ZWxcIjogXCI2XCJcbiAgICAgICAgfVxuICAgICAgICAsIFwiaW5wdXRcIjoge1xuICAgICAgICAgICAgLy8gLSB0eXBlPVwiY2hlY2tib3hcIiBzdGF0ZSBzZXQgdG8gXCJtaXhlZFwiIGlmIHRoZSBlbGVtZW50J3MgaW5kZXRlcm1pbmF0ZSBJREwgYXR0cmlidXRlXG4gICAgICAgICAgICAvLyBpcyB0cnVlLCBvciBcInRydWVcIiBpZiB0aGUgZWxlbWVudCdzIGNoZWNrZWRuZXNzIGlzIHRydWUsIG9yIFwiZmFsc2VcIiBvdGhlcndpc2VcbiAgICAgICAgICAgIC8vIC0gdHlwZT1cInJhZGlvXCIgc3RhdGUgc2V0IHRvIFwidHJ1ZVwiIGlmIHRoZSBlbGVtZW50J3MgY2hlY2tlZG5lc3MgaXMgdHJ1ZSwgb3IgXCJmYWxzZVwiXG4gICAgICAgICAgICAvLyBvdGhlcndpc2UuXG4gICAgICAgICAgICBcImNoZWNrZWRcIjogZWxlbSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdHlwZSA9IGVsZW0uZ2V0QXR0cmlidXRlKFwidHlwZVwiKTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gXCJjaGVja2JveFwiIHx8IHR5cGUgPT09IFwicmFkaW9cIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJcIisoZWxlbSBhcyBIVE1MSW5wdXRFbGVtZW50KS5jaGVja2VkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIC0gdHlwZT1cInJhZGlvXCIgYW5kIG5vdCBpbiBtZW51IHJlZmxlY3RpbmcgbnVtYmVyIG9mIHR5cGU9cmFkaW8gaW5wdXQgZWxlbWVudHMgXG4gICAgICAgICAgICAvLyB3aXRoaW4gdGhlIHJhZGlvIGJ1dHRvbiBncm91cFxuICAgICAgICAgICAgLCBcInNldHNpemVcIjogZWxlbSA9PiB7IHJldHVybiBudWxsOyB0aHJvdyBuZXcgRXJyb3IoXCJOT1QgSU1QTEVNRU5URURcIik7IH1cbiAgICAgICAgICAgIC8vIC0gdHlwZT1cInJhZGlvXCIgYW5kIG5vdCBpbiBtZW51IHZhbHVlIHJlZmxlY3RpbmcgdGhlIGVsZW1lbnRzIHBvc2l0aW9uIFxuICAgICAgICAgICAgLy8gd2l0aGluIHRoZSByYWRpbyBidXR0b24gZ3JvdXAuXCJcbiAgICAgICAgICAgICwgXCJwb3NpbnNldFwiOiBlbGVtID0+IHsgcmV0dXJuIG51bGw7IHRocm93IG5ldyBFcnJvcihcIk5PVCBJTVBMRU1FTlRFRFwiKTsgfVxuICAgICAgICAgICAgLy8gaW5wdXQgKHR5cGUgYXR0cmlidXRlIGluIHRoZSBUZXh0LCBTZWFyY2gsIFRlbGVwaG9uZSwgVVJMLCBvciBFLW1haWwgc3RhdGVzIHdpdGggYSBcbiAgICAgICAgICAgIC8vIHN1Z2dlc3Rpb25zIHNvdXJjZSBlbGVtZW50KSBjb21ib2JveCByb2xlLCB3aXRoIHRoZSBhcmlhLW93bnMgcHJvcGVydHkgc2V0IHRvIHRoZSBzYW1lXG4gICAgICAgICAgICAvLyB2YWx1ZSBhcyB0aGUgbGlzdCBhdHRyaWJ1dGVcbiAgICAgICAgICAgICwgXCJvd25zXCI6IGVsZW0gPT4geyByZXR1cm4gbnVsbDsgdGhyb3cgbmV3IEVycm9yKFwiTk9UIElNUExFTUVOVEVEXCIpOyB9XG4gICAgICAgIH1cbiAgICAgICAgLCBcImtleWdlblwiOiB7XG4gICAgICAgICAgICBcIm11bHRpc2VsZWN0YWJsZVwiOiBcImZhbHNlXCJcbiAgICAgICAgfVxuICAgICAgICAsIFwibGlcIjoge1xuICAgICAgICAgICAgLy8gTnVtYmVyIG9mIGxpIGVsZW1lbnRzIHdpdGhpbiB0aGUgb2wsIHVsLCBtZW51XG4gICAgICAgICAgICBcInNldHNpemVcIjogZWxlbSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyZW50ID0gRE9NVXRpbC5nZXRBbmNlc3RvcihlbGVtLCBbXCJvbFwiLCBcInVsXCIsIFwibWVudVwiXSk7XG4gICAgICAgICAgICAgICAgaWYgKCFwYXJlbnQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxpcyA9IENhY2hlVXRpbC5nZXRTZXRDYWNoZShwYXJlbnQsIFwiZWxlbUF0dHJWYWx1ZUNhbGN1bGF0b3JzOjpsaXNcIiwgKCkgPT4gcGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJsaVwiKSk7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3RoZXJsaXMgPSBDYWNoZVV0aWwuZ2V0U2V0Q2FjaGUocGFyZW50LCBcImVsZW1BdHRyVmFsdWVDYWxjdWxhdG9yczo6b3RoZXJsaXNcIiwgKCkgPT4gcGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJvbCBsaSwgdWwgbGksIG1lbnUgbGlcIikpO1xuICAgICAgICAgICAgICAgIHJldHVybiBcIlwiKyhsaXMubGVuZ3RoLW90aGVybGlzLmxlbmd0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBQb3NpdGlvbiBvZiBsaSBlbGVtZW50IHdpdGhpbiB0aGUgb2wsIHVsLCBtZW51XG4gICAgICAgICAgICAsIFwicG9zaW5zZXRcIjogZWxlbSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyZW50ID0gRE9NVXRpbC5nZXRBbmNlc3RvcihlbGVtLCBbXCJvbFwiLCBcInVsXCIsIFwibWVudVwiXSlcbiAgICAgICAgICAgICAgICBpZiAoIXBhcmVudCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgY29uc3QgbGlzID0gQ2FjaGVVdGlsLmdldFNldENhY2hlKHBhcmVudCwgXCJlbGVtQXR0clZhbHVlQ2FsY3VsYXRvcnM6Omxpc1wiLCAoKSA9PiBwYXJlbnQucXVlcnlTZWxlY3RvckFsbChcImxpXCIpKTtcbiAgICAgICAgICAgICAgICBsZXQgbnVtID0gMDtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpZHg9MDsgaWR4PGxpcy5sZW5ndGg7ICsraWR4KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpID0gbGlzW2lkeF07XG4gICAgICAgICAgICAgICAgICAgIGlmIChET01VdGlsLnNhbWVOb2RlKHBhcmVudCwgRE9NVXRpbC5nZXRBbmNlc3RvcihsaSwgW1wib2xcIiwgXCJ1bFwiLCBcIm1lbnVcIl0pKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiXCIrbnVtO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICsrbnVtO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAsIFwibWVudWl0ZW1cIjoge1xuICAgICAgICAgICAgLy8gdHlwZSA9IGNoZWNrYm94IG9yIHJhZGlvLCBzZXQgdG8gXCJ0cnVlXCIgaWYgdGhlIGNoZWNrZWQgYXR0cmlidXRlIFxuICAgICAgICAgICAgLy8gaXMgcHJlc2VudCwgYW5kIFwiZmFsc2VcIiBvdGhlcndpc2VcbiAgICAgICAgICAgIFwiY2hlY2tlZFwiOiBlbGVtID0+IFwiXCIrISEoZWxlbS5nZXRBdHRyaWJ1dGUoXCJjaGVja2VkXCIpIFxuICAgICAgICAgICAgICAgICYmIChlbGVtLmdldEF0dHJpYnV0ZShcImNoZWNrZWRcIik9PVwidHJ1ZVwiIHx8IGVsZW0uZ2V0QXR0cmlidXRlKFwiY2hlY2tlZFwiKT09XCJcIikpXG4gICAgICAgIH1cbiAgICAgICAgLCBcIm9wdGlvblwiOiB7XG4gICAgICAgICAgICAvLyBzZXQgdG8gXCJ0cnVlXCIgaWYgdGhlIGVsZW1lbnQncyBzZWxlY3RlZG5lc3MgaXMgdHJ1ZSwgb3IgXCJmYWxzZVwiIG90aGVyd2lzZS5cbiAgICAgICAgICAgIFwic2VsZWN0ZWRcIjogZWxlbSA9PiBcIlwiKyEhKGVsZW0uZ2V0QXR0cmlidXRlKFwic2VsZWN0ZWRcIikgXG4gICAgICAgICAgICAgICAgJiYgKGVsZW0uZ2V0QXR0cmlidXRlKFwic2VsZWN0ZWRcIik9PVwidHJ1ZVwiIHx8IGVsZW0uZ2V0QXR0cmlidXRlKFwic2VsZWN0ZWRcIik9PVwiXCIpKVxuICAgICAgICB9XG4gICAgICAgICwgXCJwcm9ncmVzc1wiOiB7XG4gICAgICAgICAgICBcInZhbHVlbWF4XCI6IGVsZW0gPT4gZWxlbS5nZXRBdHRyaWJ1dGUoXCJtYXhcIikgfHwgXCIxXCJcbiAgICAgICAgICAgICwgXCJ2YWx1ZW1pblwiOiBlbGVtID0+IFwiMFwiXG4gICAgICAgICAgICAsIFwidmFsdWVub3dcIjogZWxlbSA9PiBlbGVtLmdldEF0dHJpYnV0ZShcInZhbHVlXCIpXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgdGV4dEF0dHJWYWx1ZUNhbGN1bGF0b3JzOiB7IFthdHRyOnN0cmluZ106IE5vZGVDYWxjIH0gPSB7XG4gICAgICAgIFwibmFtZVwiOiBub2RlID0+IG5vZGUubm9kZVZhbHVlXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgbmFtZUNvbXB1dGF0aW9uSWQgPSAwO1xuICAgIC8qKnB1YmxpYyBzdGF0aWMgY29tcHV0ZU5hbWUoY3VyOiBOb2RlKSA6IHN0cmluZyB7XG4gICAgICAgICsrQVJJQU1hcHBlci5uYW1lQ29tcHV0YXRpb25JZDtcbiAgICAgICAgcmV0dXJuIEFSSUFNYXBwZXIuY29tcHV0ZU5hbWVIZWxwKEFSSUFNYXBwZXIubmFtZUNvbXB1dGF0aW9uSWQsIGN1ciwgZmFsc2UsIGZhbHNlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNvbXB1dGVOYW1lSGVscCh3YWxrSWQ6IG51bWJlciwgY3VyOiBOb2RlLCBsYWJlbGxlZGJ5VHJhdmVyc2U6IGJvb2xlYW4sIHdhbGtUcmF2ZXJzZTogYm9vbGVhbikgOiBzdHJpbmcge1xuICAgICAgICAvLyAyZy4gTm9uZSBvZiB0aGUgb3RoZXIgY29udGVudCBhcHBsaWVzIHRvIHRleHQgbm9kZXMsIHNvIGp1c3QgZG8gdGhpcyBmaXJzdFxuICAgICAgICBpZiAoY3VyLm5vZGVUeXBlID09PSAzICkgcmV0dXJuIGN1ci5ub2RlVmFsdWU7XG4gICAgICAgIGlmIChjdXIubm9kZVR5cGUgPT09IDExKSByZXR1cm4gXCJcIjtcbiAgICAgICAgaWYgKGN1ci5ub2RlVHlwZSAhPT0gMSApIHtcbiAgICAgICAgICAgIGlmICh3YWxrVHJhdmVyc2UgfHwgbGFiZWxsZWRieVRyYXZlcnNlKSByZXR1cm4gXCJcIjtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvciAoXCJDYW4gb25seSBjb21wdXRlIG5hbWUgb24gRWxlbWVudCBhbmQgVGV4dCBcIiArIGN1ci5ub2RlVHlwZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBlbGVtID0gY3VyIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vIFdlJ3ZlIGJlZW4gaGVyZSBiZWZvcmUgLSBwcmV2ZW50IHJlY3Vyc2lvblxuICAgICAgICBpZiAoQ2FjaGVVdGlsLmdldENhY2hlKGVsZW0sIFwiZGF0YS1uYW1ld2Fsa1wiLCBudWxsKSA9PT0gXCJcIit3YWxrSWQpIHJldHVybiBcIlwiO1xuICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJkYXRhLW5hbWV3YWxrXCIsIFwiXCIrd2Fsa0lkKTtcbiAgICAgICAgLy8gU2VlIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sLWFhbS0xLjAvI2lucHV0LXR5cGUtdGV4dC1pbnB1dC10eXBlLXBhc3N3b3JkLWlucHV0LXR5cGUtc2VhcmNoLWlucHV0LXR5cGUtdGVsLWlucHV0LXR5cGUtdXJsLWFuZC10ZXh0YXJlYS1lbGVtZW50XG5cbiAgICAgICAgLy8gMmEuIE9ubHkgc2hvdyBoaWRkZW4gY29udGVudCBpZiBpdCdzIHJlZmVyZW5jZWQgYnkgYSBsYWJlbGxlZGJ5XG4gICAgICAgIGlmICghbGFiZWxsZWRieVRyYXZlcnNlICYmICFWaXNVdGlsLmlzTm9kZVZpc2libGUoY3VyKSkge1xuICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAyYi4gY29sbGVjdCB2YWxpZCBpZCByZWZlcmVuY2VzXG4gICAgICAgIGlmICghbGFiZWxsZWRieVRyYXZlcnNlICYmIGVsZW0uaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpKSB7XG4gICAgICAgICAgICBsZXQgbGFiZWxsZWRieSA9IGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgIGxldCB2YWxpZEVsZW1zID0gW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJlZiBvZiBsYWJlbGxlZGJ5KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVmRWxlbSA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKGN1ciwgcmVmKTtcbiAgICAgICAgICAgICAgICBpZiAocmVmRWxlbSAmJiAhRE9NVXRpbC5zYW1lTm9kZShlbGVtLCByZWZFbGVtKSkge1xuICAgICAgICAgICAgICAgICAgICB2YWxpZEVsZW1zLnB1c2gocmVmRWxlbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHZhbGlkRWxlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCBhY2N1bXVsYXRlZCA9IFwiXCI7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBlbGVtIG9mIHZhbGlkRWxlbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgYWNjdW11bGF0ZWQgKz0gXCIgXCIgKyB0aGlzLmNvbXB1dGVOYW1lSGVscCh3YWxrSWQsIGVsZW0sIHRydWUsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjY3VtdWxhdGVkLnRyaW0oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNpbmNlIG5vZGVUb1JvbGUgY2FsbHMgYmFjayBoZXJlIGZvciBmb3JtIGFuZCBzZWN0aW9uLCB3ZSBuZWVkIHNwZWNpYWwgY2FzaW5nIGhlcmUgdG8gaGFuZGxlIHRob3NlIHR3byBjYXNlc1xuICAgICAgICBpZiAoW1wic2VjdGlvblwiLCBcImZvcm1cIl0uaW5jbHVkZXMoY3VyLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICAgICAgICBpZiAoZWxlbS5oYXNBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIpICYmIGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKS50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIC8vIElmIEknbSBub3QgYW4gZW1iZWRkZWQgY29udHJvbCBvciBJJ20gbm90IHJlY3Vyc2luZywgcmV0dXJuIHRoZSBhcmlhLWxhYmVsXG4gICAgICAgICAgICAgICAgaWYgKCFsYWJlbGxlZGJ5VHJhdmVyc2UgJiYgIXdhbGtUcmF2ZXJzZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIpLnRyaW0oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZWxlbS5oYXNBdHRyaWJ1dGUoXCJ0aXRsZVwiKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZShcInRpdGxlXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAyYy4gSWYgbGFiZWwgb3Igd2FsaywgYW5kIHRoaXMgaXMgYSBjb250cm9sLCBza2lwIHRvIHRoZSB2YWx1ZSwgb3RoZXJ3aXNlIHByb3ZpZGUgdGhlIGxhYmVsXG4gICAgICAgIGNvbnN0IHJvbGUgPSBBUklBTWFwcGVyLm5vZGVUb1JvbGUoY3VyKTtcbiAgICAgICAgbGV0IGlzRW1iZWRkZWRDb250cm9sID0gW1xuICAgICAgICAgICAgXCJ0ZXh0Ym94XCIsIFwiYnV0dG9uXCIsIFwiY29tYm9ib3hcIiwgXCJsaXN0Ym94XCIsIFxuICAgICAgICAgICAgXCJwcm9ncmVzc2JhclwiLCBcInNjcm9sbGJhclwiLCBcInNsaWRlclwiLCBcInNwaW5idXR0b25cIlxuICAgICAgICBdLmluY2x1ZGVzKHJvbGUpO1xuICAgICAgICBpZiAoZWxlbS5oYXNBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIpICYmIGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKS50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy8gSWYgSSdtIG5vdCBhbiBlbWJlZGRlZCBjb250cm9sIG9yIEknbSBub3QgcmVjdXJzaW5nLCByZXR1cm4gdGhlIGFyaWEtbGFiZWxcbiAgICAgICAgICAgIGlmICghbGFiZWxsZWRieVRyYXZlcnNlICYmICF3YWxrVHJhdmVyc2UgfHwgIWlzRW1iZWRkZWRDb250cm9sKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKS50cmltKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyAyZC4gXG4gICAgICAgIGlmIChyb2xlICE9PSBcInByZXNlbnRhdGlvblwiICYmIHJvbGUgIT09IFwibm9uZVwiKSB7XG4gICAgICAgICAgICBpZiAoKGN1ci5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImltZ1wiIHx8IGN1ci5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImFyZWFcIikgJiYgZWxlbS5oYXNBdHRyaWJ1dGUoXCJhbHRcIikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gRE9NVXRpbC5jbGVhbldoaXRlc3BhY2UoZWxlbS5nZXRBdHRyaWJ1dGUoXCJhbHRcIikpLnRyaW0oKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGN1ci5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImlucHV0XCIgJiYgZWxlbS5oYXNBdHRyaWJ1dGUoXCJpZFwiKSAmJiBlbGVtLmdldEF0dHJpYnV0ZShcImlkXCIpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgbGFiZWwgPSBlbGVtLm93bmVyRG9jdW1lbnQucXVlcnlTZWxlY3RvcihcImxhYmVsW2Zvcj0nXCIrZWxlbS5nZXRBdHRyaWJ1dGUoXCJpZFwiKStcIiddXCIpO1xuICAgICAgICAgICAgICAgIGlmIChsYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobGFiZWwuaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKSB8fCAobGFiZWwuaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpICYmICFDb21tb25VdGlsLmlzSWRSZWZlclRvU2VsZihjdXIsIGxhYmVsLmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKSkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb21wdXRlTmFtZUhlbHAod2Fsa0lkLCBsYWJlbCwgZmFsc2UsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsYWJlbC50ZXh0Q29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjdXIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJmaWVsZHNldFwiKSB7XG4gICAgICAgICAgICAgICAgaWYoICg8RWxlbWVudD5jdXIpLnF1ZXJ5U2VsZWN0b3IoXCJsZWdlbmRcIikpe1xuICAgICAgICAgICAgICAgICAgICBsZXQgbGVnZW5kID0gKDxFbGVtZW50PmN1cikucXVlcnlTZWxlY3RvcihcImxlZ2VuZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlZ2VuZC5pbm5lclRleHQ7XG4gICAgICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXB1dGVOYW1lSGVscCh3YWxrSWQsIGN1ciwgZmFsc2UsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDJlLlxuICAgICAgICBpZiAoKHdhbGtUcmF2ZXJzZSB8fCBsYWJlbGxlZGJ5VHJhdmVyc2UpICYmIGlzRW1iZWRkZWRDb250cm9sKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGUgZW1iZWRkZWQgY29udHJvbCBoYXMgcm9sZSB0ZXh0Ym94LCByZXR1cm4gaXRzIHZhbHVlLlxuICAgICAgICAgICAgaWYgKHJvbGUgPT09IFwidGV4dGJveFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbnB1dFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcInZhbHVlXCIpKSByZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB3YWxrVHJhdmVyc2UgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIElmIHRoZSBlbWJlZGRlZCBjb250cm9sIGhhcyByb2xlIGJ1dHRvbiwgcmV0dXJuIHRoZSB0ZXh0IGFsdGVybmF0aXZlIG9mIHRoZSBidXR0b24uXG4gICAgICAgICAgICBpZiAocm9sZSA9PT0gXCJidXR0b25cIikge1xuICAgICAgICAgICAgICAgIGlmIChlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiaW5wdXRcIikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdHlwZSA9IGVsZW0uZ2V0QXR0cmlidXRlKFwidHlwZVwiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoW1wiYnV0dG9uXCIsIFwic3VibWl0XCIsIFwicmVzZXRcIl0uaW5jbHVkZXModHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcInZhbHVlXCIpKSByZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09PSBcInN1Ym1pdFwiKSByZXR1cm4gXCJTdWJtaXRcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09PSBcInJlc2V0XCIpIHJldHVybiBcIlJlc2V0XCI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB3YWxrVHJhdmVyc2UgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFRPRE86IElmIHRoZSBlbWJlZGRlZCBjb250cm9sIGhhcyByb2xlIGNvbWJvYm94IG9yIGxpc3Rib3gsIHJldHVybiB0aGUgdGV4dCBhbHRlcm5hdGl2ZSBvZiB0aGUgY2hvc2VuIG9wdGlvbi5cbiAgICAgICAgICAgIGlmIChyb2xlID09PSBcImNvbWJvYm94XCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbS5oYXNBdHRyaWJ1dGUoXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNlbGVjdGVkID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQoZWxlbSwgXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZCAmJiAhRE9NVXRpbC5zYW1lTm9kZShlbGVtLCBzZWxlY3RlZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBUklBTWFwcGVyLmNvbXB1dGVOYW1lSGVscCh3YWxrSWQsIHNlbGVjdGVkLCBmYWxzZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJZiB0aGUgZW1iZWRkZWQgY29udHJvbCBoYXMgcm9sZSByYW5nZSAoZS5nLiwgYSBzcGluYnV0dG9uIG9yIHNsaWRlcik6XG4gICAgICAgICAgICBpZiAoW1wicHJvZ3Jlc3NiYXJcIiwgXCJzY3JvbGxiYXJcIiwgXCJzbGlkZXJcIiwgXCJzcGluYnV0dG9uXCJdLmluY2x1ZGVzKHJvbGUpKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIGFyaWEtdmFsdWV0ZXh0IHByb3BlcnR5IGlzIHByZXNlbnQsIHJldHVybiBpdHMgdmFsdWUsXG4gICAgICAgICAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwiYXJpYS12YWx1ZXRleHRcIikpIHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtdmFsdWV0ZXh0XCIpO1xuICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgaWYgdGhlIGFyaWEtdmFsdWVub3cgcHJvcGVydHkgaXMgcHJlc2VudCwgcmV0dXJuIGl0cyB2YWx1ZSxcbiAgICAgICAgICAgICAgICBpZiAoZWxlbS5oYXNBdHRyaWJ1dGUoXCJhcmlhLXZhbHVlbm93XCIpKSByZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLXZhbHVlbm93XCIpO1xuICAgICAgICAgICAgICAgIC8vIFRPRE86IE90aGVyd2lzZSwgdXNlIHRoZSB2YWx1ZSBhcyBzcGVjaWZpZWQgYnkgYSBob3N0IGxhbmd1YWdlIGF0dHJpYnV0ZS5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDJmLiAyaC5cbiAgICAgICAgaWYgKHdhbGtUcmF2ZXJzZSB8fCBBUklBRGVmaW5pdGlvbnMubmFtZUZyb21Db250ZW50KHJvbGUpIHx8IGxhYmVsbGVkYnlUcmF2ZXJzZSkge1xuICAgICAgICAgICAgLy8gMmZpLiBTZXQgdGhlIGFjY3VtdWxhdGVkIHRleHQgdG8gdGhlIGVtcHR5IHN0cmluZy5cbiAgICAgICAgICAgIGxldCBhY2N1bXVsYXRlZCA9IFwiXCI7XG4gICAgICAgICAgICAvLyAyZmlpLiBDaGVjayBmb3IgQ1NTIGdlbmVyYXRlZCB0ZXh0dWFsIGNvbnRlbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IG5vZGUgYW5kIFxuICAgICAgICAgICAgLy8gaW5jbHVkZSBpdCBpbiB0aGUgYWNjdW11bGF0ZWQgdGV4dC4gVGhlIENTUyA6YmVmb3JlIGFuZCA6YWZ0ZXIgcHNldWRvIGVsZW1lbnRzIFtDU1MyXSBcbiAgICAgICAgICAgIC8vIGNhbiBwcm92aWRlIHRleHR1YWwgY29udGVudCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIGEgY29udGVudCBtb2RlbC5cbiAgICAgICAgICAgIC8vICAgRm9yIDpiZWZvcmUgcHNldWRvIGVsZW1lbnRzLCBVc2VyIGFnZW50cyBNVVNUIHByZXBlbmQgQ1NTIHRleHR1YWwgY29udGVudCwgd2l0aG91dCBcbiAgICAgICAgICAgIC8vICAgICBhIHNwYWNlLCB0byB0aGUgdGV4dHVhbCBjb250ZW50IG9mIHRoZSBjdXJyZW50IG5vZGUuXG4gICAgICAgICAgICAvLyAgIEZvciA6YWZ0ZXIgcHNldWRvIGVsZW1lbnRzLCBVc2VyIGFnZW50cyBNVVNUIGFwcGVuZCBDU1MgdGV4dHVhbCBjb250ZW50LCB3aXRob3V0IGEgXG4gICAgICAgICAgICAvLyAgICAgc3BhY2UsIHRvIHRoZSB0ZXh0dWFsIGNvbnRlbnQgb2YgdGhlIGN1cnJlbnQgbm9kZS5cbiAgICAgICAgICAgIGxldCBiZWZvcmUgPSBudWxsO1xuICAgICAgICAgICAgYmVmb3JlID0gZWxlbS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoZWxlbSxcImJlZm9yZVwiKS5jb250ZW50O1xuXG4gICAgICAgICAgICBpZiAoYmVmb3JlICYmIGJlZm9yZSAhPT0gXCJub25lXCIpIHtcbiAgICAgICAgICAgICAgICBiZWZvcmUgPSBiZWZvcmUucmVwbGFjZSgvXlwiLyxcIlwiKS5yZXBsYWNlKC9cIiQvLFwiXCIpO1xuICAgICAgICAgICAgICAgIGFjY3VtdWxhdGVkICs9IGJlZm9yZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIDJmaWlpLiBGb3IgZWFjaCBjaGlsZCBub2RlIG9mIHRoZSBjdXJyZW50IG5vZGU6XG4gICAgICAgICAgICAvLyAgIFNldCB0aGUgY3VycmVudCBub2RlIHRvIHRoZSBjaGlsZCBub2RlLlxuICAgICAgICAgICAgLy8gICBDb21wdXRlIHRoZSB0ZXh0IGFsdGVybmF0aXZlIG9mIHRoZSBjdXJyZW50IG5vZGUgYmVnaW5uaW5nIHdpdGggc3RlcCAyLiBTZXQgdGhlIHJlc3VsdCBcbiAgICAgICAgICAgIC8vICAgICB0byB0aGF0IHRleHQgYWx0ZXJuYXRpdmUuXG4gICAgICAgICAgICAvLyAgIEFwcGVuZCB0aGUgcmVzdWx0IHRvIHRoZSBhY2N1bXVsYXRlZCB0ZXh0LlxuICAgICAgICAgICAgaWYgKGVsZW0ubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJTTE9UXCIpIHtcbiAgICAgICAgICAgICAgICAvL2lmIG5vIGFzc2lnbmVkTm9kZSwgY2hlY2sgaXRzIG93biB0ZXh0IFxuICAgICAgICAgICAgICAgIGlmICghKGVsZW0gYXMgSFRNTFNsb3RFbGVtZW50KS5hc3NpZ25lZE5vZGVzKCkgfHwgKGVsZW0gYXMgSFRNTFNsb3RFbGVtZW50KS5hc3NpZ25lZE5vZGVzKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpbm5lclRleHQgPSBDb21tb25VdGlsLmdldElubmVyVGV4dChlbGVtKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlubmVyVGV4dCAmJiBpbm5lclRleHQgIT09IG51bGwgJiYgaW5uZXJUZXh0LnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgYWNjdW11bGF0ZWQgKz0gIFwiIFwiICsgaW5uZXJUZXh0O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAgIFxuICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayB0ZXh0IGZyb20gYWxsIGFzc2lnbmVkIG5vZGVzXG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc2xvdENoaWxkIG9mIChlbGVtIGFzIEhUTUxTbG90RWxlbWVudCkuYXNzaWduZWROb2RlcygpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmV4dENoaWxkQ29udGVudCA9IEFSSUFNYXBwZXIuY29tcHV0ZU5hbWVIZWxwKHdhbGtJZCwgc2xvdENoaWxkLCBsYWJlbGxlZGJ5VHJhdmVyc2UsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYWNjdW11bGF0ZWQgKz0gXCIgXCIgKyBuZXh0Q2hpbGRDb250ZW50O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgd2Fsa0NoaWxkID0gZWxlbS5maXJzdENoaWxkO1xuICAgICAgICAgICAgICAgIHdoaWxlICh3YWxrQ2hpbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5leHRDaGlsZENvbnRlbnQgPSBBUklBTWFwcGVyLmNvbXB1dGVOYW1lSGVscCh3YWxrSWQsIHdhbGtDaGlsZCwgbGFiZWxsZWRieVRyYXZlcnNlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgYWNjdW11bGF0ZWQgKz0gXCIgXCIgKyBuZXh0Q2hpbGRDb250ZW50O1xuICAgICAgICAgICAgICAgICAgICB3YWxrQ2hpbGQgPSB3YWxrQ2hpbGQubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgYWZ0ZXIgPSBudWxsO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhZnRlciA9IGVsZW0ub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGVsZW0sXCJhZnRlclwiKS5jb250ZW50O1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge31cblxuICAgICAgICAgICAgaWYgKGFmdGVyICYmIGFmdGVyICE9PSBcIm5vbmVcIikge1xuICAgICAgICAgICAgICAgIGFmdGVyID0gYWZ0ZXIucmVwbGFjZSgvXlwiLyxcIlwiKS5yZXBsYWNlKC9cIiQvLFwiXCIpO1xuICAgICAgICAgICAgICAgIGFjY3VtdWxhdGVkICs9IGFmdGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gMmZpdi4gUmV0dXJuIHRoZSBhY2N1bXVsYXRlZCB0ZXh0LlxuICAgICAgICAgICAgYWNjdW11bGF0ZWQgPSBhY2N1bXVsYXRlZC5yZXBsYWNlKC9cXHMrL2csXCIgXCIpLnRyaW0oKTtcbiAgICAgICAgICAgIGlmIChhY2N1bXVsYXRlZC50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhY2N1bXVsYXRlZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDJpLiBPdGhlcndpc2UsIGlmIHRoZSBjdXJyZW50IG5vZGUgaGFzIGEgVG9vbHRpcCBhdHRyaWJ1dGUsIHJldHVybiBpdHMgdmFsdWUuXG4gICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcInRpdGxlXCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoXCJ0aXRsZVwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZWxlbS50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwic3ZnXCIpIHtcbiAgICAgICAgICAgIGxldCB0aXRsZSA9IGVsZW0ucXVlcnlTZWxlY3RvcihcInRpdGxlXCIpO1xuICAgICAgICAgICAgaWYgKHRpdGxlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRpdGxlLnRleHRDb250ZW50IHx8IHRpdGxlLmlubmVyVGV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cbiAgICAqL1xuLyogICAgICAgIGlmIChyb2xlIGluIEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1xuICAgICAgICAgICAgJiYgQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVdLm5hbWVGcm9tIFxuICAgICAgICAgICAgJiYgQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVdLm5hbWVGcm9tLmluY2x1ZGVzKFwiY29udGVudHNcIikpIFxuICAgICAgICB7XG4gICAgICAgICAgICBuYW1lID0gZWxlbS50ZXh0Q29udGVudDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImlucHV0XCIgJiYgZWxlbS5oYXNBdHRyaWJ1dGUoXCJpZFwiKSAmJiBlbGVtLmdldEF0dHJpYnV0ZShcImlkXCIpLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBuYW1lID0gZWxlbS5vd25lckRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJsYWJlbFtmb3I9J1wiK2VsZW0uZ2V0QXR0cmlidXRlKFwiaWRcIikudHJpbSgpK1wiJ11cIikudGV4dENvbnRlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKSkge1xuICAgICAgICAgICAgbmFtZSA9IGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZWxlbS5oYXNBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsbGVkYnlcIikpIHtcbiAgICAgICAgICAgIG5hbWUgPSBcIlwiO1xuICAgICAgICAgICAgY29uc3QgaWRzID0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsbGVkYnlcIikuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBpZCBvZiBpZHMpIHtcbiAgICAgICAgICAgICAgICBuYW1lICs9IEZyYWdtZW50VXRpbC5nZXRCeUlkKGVsZW0sIGlkKS50ZXh0Q29udGVudCArIFwiIFwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbmFtZSA9IG5hbWUudHJpbSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuYW1lO1xuICAgIH0qL1xuXG4gICAgcHVibGljIHN0YXRpYyBub2RlVG9Sb2xlKG5vZGUgOiBOb2RlKSB7XG4gICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSAzIC8qIE5vZGUuVEVYVF9OT0RFICovKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJ0ZXh0XCI7XG4gICAgICAgIH0gZWxzZSBpZiAobm9kZS5ub2RlVHlwZSAhPT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLykge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZWxlbSA9IG5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgaWYgKCFlbGVtIHx8IGVsZW0ubm9kZVR5cGUgIT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8pIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVE8gRE86IHVzZSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUoZWxlbSkgdG8gcmVwbGFjZSB0aGUgY29kZSBmb2xsb3dpbmcsIHdoaWNoIHVzZXMgb25seSB0aGUgdmFsaWQgcm9sZXMgZm9yIHRoZSBlbGVtZW50IGJhc2VkIG9uIHRoZSBhcmlhIGZhbGxiYWNrIHJ1bGVcbiAgICAgICAgLy9jb25zdCByb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKGVsZW0pO1xuICAgICAgICAvL3JldHVybiByb2xlID09PSBcInByZXNlbnRhdGlvblwiIHx8IHJvbGUgPT09IFwibm9uZVwiID8gbnVsbCA6IHJvbGU7XG4gICAgICAgIFxuICAgICAgICBpZiAoZWxlbS5oYXNBdHRyaWJ1dGUoXCJyb2xlXCIpICYmIGVsZW0uZ2V0QXR0cmlidXRlKFwicm9sZVwiKS50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGV0IHJvbGVTdHIgPSBlbGVtLmdldEF0dHJpYnV0ZShcInJvbGVcIikudHJpbSgpO1xuICAgICAgICAgICAgbGV0IHJvbGVzID0gcm9sZVN0ci5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJvbGUgb2Ygcm9sZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAocm9sZSA9PT0gXCJwcmVzZW50YXRpb25cIiB8fCByb2xlID09PSBcIm5vbmVcIikge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiBlbGVtZW50IGlzIGZvY3VzYWJsZSwgdGhlbiBwcmVzZW50YXRpb24gcm9sZXMgYXJlIHRvIGJlIGlnbm9yZWRcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFDb21tb25VdGlsLmlzRm9jdXNhYmxlKGVsZW0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocm9sZSBpbiBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJvbGU7XG4gICAgICAgICAgICAgICAgfSAgICBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvL3JldHVybiB0aGlzLmVsZW1Ub0ltcGxpY2l0Um9sZShlbGVtKTtcbiAgICAgICAgY29uc3Qgcm9sZXMgPSBBcmlhVXRpbC5nZXRJbXBsaWNpdFJvbGUoZWxlbSk7XG4gICAgICAgIC8vY29uc29sZS5sb2coXCJub2RlPVwiICsgbm9kZS5ub2RlTmFtZSArXCIsIHJvbGU9IFwiICsgKHJvbGVzID8gcm9sZXNbMF0gOiBudWxsKSArXCIsIHJlc29sdmVkPVwiICsgQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKGVsZW0pKTtcbiAgICAgICAgY29uc3Qgcm9sZSA9ICFyb2xlcyB8fCByb2xlcy5sZW5ndGggPT09MCA/IG51bGwgOiByb2xlc1swXTtcbiAgICAgICAgcmV0dXJuIHJvbGUgPT09IFwicHJlc2VudGF0aW9uXCIgfHwgcm9sZSA9PT0gXCJub25lXCIgPyBudWxsIDogcm9sZTtcbiAgICAgICAgLy9yZXR1cm4gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKGVsZW0pO1xuICAgICAgICBcbiAgICB9XG59IFxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcbmltcG9ydCB7IEFSSUFNYXBwZXIgfSBmcm9tIFwiLi9BUklBTWFwcGVyXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3Y0L3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4uL2RvbS9ET01XYWxrZXJcIjtcblxuLyoqXG4gKiBXYWxrcyBpbiBhbiBBUklBIG9yZGVyXG4gKiBcbiAqIFNlZSBhbHNvIC4uL2RvbS9ET01XYWxrZXJcbiAqL1xuZXhwb3J0IGNsYXNzIEFSSUFXYWxrZXIge1xuICAgIHJvb3QgOiBOb2RlO1xuICAgIG5vZGUgOiBOb2RlO1xuICAgIGJFbmRUYWc6IGJvb2xlYW47XG5cbiAgICBjb25zdHJ1Y3RvcihlbGVtZW50IDogTm9kZSwgYkVuZD8gOiBib29sZWFuLCByb290PyA6IE5vZGUpIHtcbiAgICAgICAgdGhpcy5yb290ID0gcm9vdCB8fCBlbGVtZW50O1xuICAgICAgICBpZiAodGhpcy5yb290Lm5vZGVUeXBlID09PSA5KSB7XG4gICAgICAgICAgICB0aGlzLnJvb3QgPSAodGhpcy5yb290IGFzIERvY3VtZW50KS5kb2N1bWVudEVsZW1lbnRcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5vZGUgPSBlbGVtZW50O1xuICAgICAgICAvLyBpZiAodGhpcy5ub2RlLm5vZGVUeXBlID09PSA5KSB7XG4gICAgICAgIC8vICAgICB0aGlzLm5vZGUgPSAodGhpcy5ub2RlIGFzIERvY3VtZW50KS5kb2N1bWVudEVsZW1lbnRcbiAgICAgICAgLy8gfVxuICAgICAgICB0aGlzLmJFbmRUYWcgPSAoYkVuZCA9PSB1bmRlZmluZWQgPyBmYWxzZSA6IGJFbmQgPT0gdHJ1ZSk7XG4gICAgfVxuXG4gICAgYXRSb290KCkgOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCh0aGlzIGFzIGFueSkub3duZXJFbGVtZW50KSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLnJvb3QgPT09IHRoaXMubm9kZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5yb290LmlzU2FtZU5vZGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJvb3QuaXNTYW1lTm9kZSh0aGlzLm5vZGUpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucm9vdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucm9vdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbih0aGlzLm5vZGUpID09PSAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gTm90IHN1cHBvcnRlZCBpbiB0aGlzIGVudmlyb25tZW50IC0gdHJ5IG91ciBiZXN0XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5ub2RlLnBhcmVudE5vZGUgPT09IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZXh0Tm9kZSgpIDogYm9vbGVhbiB7XG4gICAgICAgIGxldCBza2lwT3duZWQgPSBmYWxzZTtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgc2tpcE93bmVkID0gZmFsc2U7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyh0aGlzLm5vZGUubm9kZU5hbWUsIHRoaXMuYkVuZFRhZz9cIkVORFwiOlwiU1RBUlRcIiwgdGhpcy5ub2RlLm5vZGVUeXBlID09PSAxICYmICh0aGlzLm5vZGUgYXMgYW55KS5nZXRBdHRyaWJ1dGUoXCJpZFwiKSk7XG4gICAgICAgICAgICBpZiAoIXRoaXMuYkVuZFRhZykge1xuICAgICAgICAgICAgICAgIGxldCBpZnJhbWVOb2RlID0gKHRoaXMubm9kZSBhcyBIVE1MSUZyYW1lRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgbGV0IGVsZW1lbnROb2RlID0gKHRoaXMubm9kZSBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgbGV0IHNsb3RFbGVtZW50ID0gKHRoaXMubm9kZSBhcyBIVE1MU2xvdEVsZW1lbnQpXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLyBcbiAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5ub2RlLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiSUZSQU1FXCJcbiAgICAgICAgICAgICAgICAgICAgJiYgVmlzVXRpbC5pc05vZGVWaXNpYmxlKGlmcmFtZU5vZGUpXG4gICAgICAgICAgICAgICAgICAgICYmIGlmcmFtZU5vZGUuY29udGVudERvY3VtZW50XG4gICAgICAgICAgICAgICAgICAgICYmIGlmcmFtZU5vZGUuY29udGVudERvY3VtZW50LmRvY3VtZW50RWxlbWVudClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBvd25lckVsZW1lbnQgPSB0aGlzLm5vZGU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IGlmcmFtZU5vZGUuY29udGVudERvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMubm9kZSBhcyBhbnkpLm93bmVyRWxlbWVudCA9IG93bmVyRWxlbWVudDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLyBcbiAgICAgICAgICAgICAgICAgICAgJiYgVmlzVXRpbC5pc05vZGVWaXNpYmxlKGVsZW1lbnROb2RlKVxuICAgICAgICAgICAgICAgICAgICAmJiBlbGVtZW50Tm9kZS5zaGFkb3dSb290XG4gICAgICAgICAgICAgICAgICAgICYmIGVsZW1lbnROb2RlLnNoYWRvd1Jvb3QuZmlyc3RDaGlsZClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBvd25lckVsZW1lbnQgPSB0aGlzLm5vZGU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IGVsZW1lbnROb2RlLnNoYWRvd1Jvb3Q7XG4gICAgICAgICAgICAgICAgICAgICh0aGlzLm5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQgPSBvd25lckVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIERPTVdhbGtlci5hc3NpZ25TbG90cyh0aGlzLm5vZGUgYXMgU2hhZG93Um9vdCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgXG4gICAgICAgICAgICAgICAgICAgICYmIGVsZW1lbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwic2xvdFwiXG4gICAgICAgICAgICAgICAgICAgICYmIHNsb3RFbGVtZW50LmFzc2lnbmVkTm9kZXMoKS5sZW5ndGggPiAwKSBcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHNsb3RFbGVtZW50LmFzc2lnbmVkTm9kZXMoKVswXTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8gfHwgdGhpcy5ub2RlLm5vZGVUeXBlID09PSAxMSAvKiBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUgKi8pIFxuICAgICAgICAgICAgICAgICAgICAmJiBET01XYWxrZXIuZmlyc3RDaGlsZE5vdE93bmVkQnlTbG90KHRoaXMubm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gRE9NV2Fsa2VyLmZpcnN0Q2hpbGROb3RPd25lZEJ5U2xvdCh0aGlzLm5vZGUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hdFJvb3QoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgodGhpcy5ub2RlIGFzIGFueSkuc2xvdE93bmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzbG90T3duZXIgPSAodGhpcy5ub2RlIGFzIGFueSkuc2xvdE93bmVyO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbmV4dFNsb3RJbmRleCA9ICh0aGlzLm5vZGUgYXMgYW55KS5zbG90SW5kZXgrMTtcbiAgICAgICAgICAgICAgICAgICAgLy8gZGVsZXRlICh0aGlzLm5vZGUgYXMgYW55KS5zbG90T3duZXI7XG4gICAgICAgICAgICAgICAgICAgIC8vIGRlbGV0ZSAodGhpcy5ub2RlIGFzIGFueSkuc2xvdEluZGV4O1xuICAgICAgICAgICAgICAgICAgICBpZiAobmV4dFNsb3RJbmRleCA8IHNsb3RPd25lci5hc3NpZ25lZE5vZGVzKCkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBzbG90T3duZXIuYXNzaWduZWROb2RlcygpW25leHRTbG90SW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBzbG90T3duZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgodGhpcy5ub2RlIGFzIGFueSkub3duZXJFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9ICh0aGlzLm5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChET01XYWxrZXIubmV4dFNpYmxpbmdOb3RPd25lZEJ5U2xvdCh0aGlzLm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IERPTVdhbGtlci5uZXh0U2libGluZ05vdE93bmVkQnlTbG90KHRoaXMubm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBza2lwT3duZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5ub2RlLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubm9kZS5wYXJlbnROb2RlLm5vZGVUeXBlID09PSAxICYmICh0aGlzLm5vZGUucGFyZW50Tm9kZSBhcyBIVE1MRWxlbWVudCkuaGFzQXR0cmlidXRlKFwiYXJpYS1vd25zXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgb3duSWRzID0gKHRoaXMubm9kZS5wYXJlbnROb2RlIGFzIEhUTUxFbGVtZW50KS5nZXRBdHRyaWJ1dGUoXCJhcmlhLW93bnNcIikuc3BsaXQoLyArL2cpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubm9kZS5ub2RlVHlwZSAhPT0gMSB8fCAhKHRoaXMubm9kZSBhcyBIVE1MRWxlbWVudCkuaGFzQXR0cmlidXRlKFwiaWRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBGcmFnbWVudFV0aWwuZ2V0T3duZXJGcmFnbWVudCh0aGlzLm5vZGUpLmdldEVsZW1lbnRCeUlkKG93bklkc1swXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpZHggPSBvd25JZHMuaW5kZXhPZigodGhpcy5ub2RlIGFzIEhUTUxFbGVtZW50KS5nZXRBdHRyaWJ1dGUoXCJpZFwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlkeCA9PT0gb3duSWRzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGFzdCBvbmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gdGhpcy5ub2RlLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IHRydWU7ICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ3JhYiBuZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IEZyYWdtZW50VXRpbC5nZXRPd25lckZyYWdtZW50KHRoaXMubm9kZSkuZ2V0RWxlbWVudEJ5SWQob3duSWRzW2lkeCsxXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSB0aGlzLm5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IHdoaWxlIChcbiAgICAgICAgICAgICh0aGlzLm5vZGUubm9kZVR5cGUgIT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8gJiYgdGhpcy5ub2RlLm5vZGVUeXBlICE9PSAxMSAmJiB0aGlzLm5vZGUubm9kZVR5cGUgIT09IDMgLyogTm9kZS5URVhUX05PREUgKi8pXG4gICAgICAgICAgICB8fCAodGhpcy5ub2RlLm5vZGVUeXBlID09PSAxICYmICh0aGlzLm5vZGUgYXMgRWxlbWVudCkuZ2V0QXR0cmlidXRlKFwiYUNoZWNrZXJcIikgPT09IFwiQUNFXCIpXG4gICAgICAgICAgICB8fCAoc2tpcE93bmVkICYmIHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSAmJiAhIUFSSUFNYXBwZXIuZ2V0QXJpYU93bmVkQnkodGhpcy5ub2RlIGFzIEhUTUxFbGVtZW50KSlcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHJldk5vZGUoKSA6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgc2tpcE93bmVkID0gZmFsc2U7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIHNraXBPd25lZCA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKHRoaXMuYkVuZFRhZykge1xuICAgICAgICAgICAgICAgIGxldCBpZnJhbWVOb2RlID0gKHRoaXMubm9kZSBhcyBIVE1MSUZyYW1lRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgbGV0IGVsZW1lbnROb2RlID0gKHRoaXMubm9kZSBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLyBcbiAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5ub2RlLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiSUZSQU1FXCJcbiAgICAgICAgICAgICAgICAgICAgJiYgVmlzVXRpbC5pc05vZGVWaXNpYmxlKGlmcmFtZU5vZGUpXG4gICAgICAgICAgICAgICAgICAgICYmIGlmcmFtZU5vZGUuY29udGVudERvY3VtZW50XG4gICAgICAgICAgICAgICAgICAgICYmIGlmcmFtZU5vZGUuY29udGVudERvY3VtZW50LmRvY3VtZW50RWxlbWVudCkgXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb3duZXJFbGVtZW50ID0gdGhpcy5ub2RlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBpZnJhbWVOb2RlLmNvbnRlbnREb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICh0aGlzLm5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQgPSBvd25lckVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8gXG4gICAgICAgICAgICAgICAgICAgICYmIFZpc1V0aWwuaXNOb2RlVmlzaWJsZShlbGVtZW50Tm9kZSlcbiAgICAgICAgICAgICAgICAgICAgJiYgZWxlbWVudE5vZGUuc2hhZG93Um9vdFxuICAgICAgICAgICAgICAgICAgICAmJiBlbGVtZW50Tm9kZS5zaGFkb3dSb290Lmxhc3RDaGlsZCkgXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb3duZXJFbGVtZW50ID0gdGhpcy5ub2RlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBlbGVtZW50Tm9kZS5zaGFkb3dSb290O1xuICAgICAgICAgICAgICAgICAgICAodGhpcy5ub2RlIGFzIGFueSkub3duZXJFbGVtZW50ID0gb3duZXJFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICBET01XYWxrZXIuYXNzaWduU2xvdHModGhpcy5ub2RlIGFzIFNoYWRvd1Jvb3QpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLyB8fCB0aGlzLm5vZGUubm9kZVR5cGUgPT09IDExKSBcbiAgICAgICAgICAgICAgICAgICAgJiYgRE9NV2Fsa2VyLmxhc3RDaGlsZE5vdE93bmVkQnlTbG90KHRoaXMubm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gRE9NV2Fsa2VyLmxhc3RDaGlsZE5vdE93bmVkQnlTbG90KHRoaXMubm9kZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hdFJvb3QoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChET01XYWxrZXIucHJldmlvdXNTaWJsaW5nTm90T3duZWRCeVNsb3QodGhpcy5ub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBET01XYWxrZXIucHJldmlvdXNTaWJsaW5nTm90T3duZWRCeVNsb3QodGhpcy5ub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCh0aGlzLm5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gKHRoaXMubm9kZSBhcyBhbnkpLm93bmVyRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHNraXBPd25lZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm5vZGUucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5ub2RlLnBhcmVudE5vZGUubm9kZVR5cGUgPT09IDEgJiYgKHRoaXMubm9kZS5wYXJlbnROb2RlIGFzIEhUTUxFbGVtZW50KS5oYXNBdHRyaWJ1dGUoXCJhcmlhLW93bnNcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvd25JZHMgPSAodGhpcy5ub2RlLnBhcmVudE5vZGUgYXMgSFRNTEVsZW1lbnQpLmdldEF0dHJpYnV0ZShcImFyaWEtb3duc1wiKS5zcGxpdCgvICsvZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5ub2RlLm5vZGVUeXBlICE9PSAxIHx8ICEodGhpcy5ub2RlIGFzIEhUTUxFbGVtZW50KS5oYXNBdHRyaWJ1dGUoXCJpZFwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IEZyYWdtZW50VXRpbC5nZXRPd25lckZyYWdtZW50KHRoaXMubm9kZSkuZ2V0RWxlbWVudEJ5SWQob3duSWRzWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlkeCA9IG93bklkcy5pbmRleE9mKCh0aGlzLm5vZGUgYXMgSFRNTEVsZW1lbnQpLmdldEF0dHJpYnV0ZShcImlkXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWR4ID09PSBvd25JZHMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsYXN0IG9uZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSB0aGlzLm5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gdHJ1ZTsgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBncmFiIG5leHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gRnJhZ21lbnRVdGlsLmdldE93bmVyRnJhZ21lbnQodGhpcy5ub2RlKS5nZXRFbGVtZW50QnlJZChvd25JZHNbaWR4KzFdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHRoaXMubm9kZS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IHdoaWxlIChcbiAgICAgICAgICAgICh0aGlzLm5vZGUubm9kZVR5cGUgIT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8gJiYgdGhpcy5ub2RlLm5vZGVUeXBlICE9PSAxMSlcbiAgICAgICAgICAgIHx8ICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgJiYgKHRoaXMubm9kZSBhcyBFbGVtZW50KS5nZXRBdHRyaWJ1dGUoXCJhQ2hlY2tlclwiKSA9PT0gXCJBQ0VcIilcbiAgICAgICAgICAgIHx8IChza2lwT3duZWQgJiYgdGhpcy5ub2RlLm5vZGVUeXBlID09PSAxICYmICEhQVJJQU1hcHBlci5nZXRBcmlhT3duZWRCeSh0aGlzLm5vZGUgYXMgSFRNTEVsZW1lbnQpKVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi8uLi8uLi9hcGkvSUVuZ2luZVwiO1xuXG5leHBvcnQgY2xhc3MgQW5jZXN0b3JVdGlsIHtcbiAgICBwdWJsaWMgc3RhdGljIGlzUHJlc2VudGF0aW9uRnJhbWUoY29udGV4dEhpZXJhcmNoeTogUnVsZUNvbnRleHRIaWVyYXJjaHkpIDogYm9vbGVhbiB7XG4gICAgICAgIGlmIChjb250ZXh0SGllcmFyY2h5ICYmIGNvbnRleHRIaWVyYXJjaHkuZG9tKSB7XG4gICAgICAgICAgICAvLyBTa2lwIGN1cnJlbnQgbm9kZSBiZWNhdXNlIHdlIHdhbnQgYW5jZXN0cnlcbiAgICAgICAgICAgIGZvciAobGV0IGlkeD1jb250ZXh0SGllcmFyY2h5LmRvbS5sZW5ndGgtMjsgaWR4ID49IDA7IC0taWR4KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbSA9IChjb250ZXh0SGllcmFyY2h5LmRvbVtpZHhdLm5vZGUgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGlmIChlbGVtLm5vZGVUeXBlID09PSAxIFxuICAgICAgICAgICAgICAgICAgICAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiaWZyYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgJiYgKGVsZW0uZ2V0QXR0cmlidXRlKFwicm9sZVwiKSA9PT0gXCJwcmVzZW50YXRpb25cIiB8fCBlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtaGlkZGVuXCIpID09PSBcInRydWVcIikpIFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGlzRnJhbWUoY29udGV4dEhpZXJhcmNoeTogUnVsZUNvbnRleHRIaWVyYXJjaHkpIDogYm9vbGVhbiB7XG4gICAgICAgIGlmIChjb250ZXh0SGllcmFyY2h5ICYmIGNvbnRleHRIaWVyYXJjaHkuZG9tKSB7XG4gICAgICAgICAgICAvLyBTa2lwIGN1cnJlbnQgbm9kZSBiZWNhdXNlIHdlIHdhbnQgYW5jZXN0cnlcbiAgICAgICAgICAgIGZvciAobGV0IGlkeD1jb250ZXh0SGllcmFyY2h5LmRvbS5sZW5ndGgtMjsgaWR4ID49IDA7IC0taWR4KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbSA9IChjb250ZXh0SGllcmFyY2h5LmRvbVtpZHhdLm5vZGUgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGlmIChlbGVtLm5vZGVUeXBlID09PSAxICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpZnJhbWVcIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgIENvcHlyaWdodDo6IDIwMjAtIElCTSwgSW5jXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uLy4uLy4uL2FwaS9JRW5naW5lXCI7XG5cbmV4cG9ydCBjbGFzcyBGcmFnbWVudFV0aWwge1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0T3duZXJGcmFnbWVudChub2RlOiBOb2RlKSA6IERvY3VtZW50IHwgRG9jdW1lbnRGcmFnbWVudCB7XG4gICAgICAgIGxldCBuIDogTm9kZSA9IG5vZGU7XG4gICAgICAgIHdoaWxlKG4ucGFyZW50Tm9kZSAmJiAobiA9IG4ucGFyZW50Tm9kZSkpe1xuICAgICAgICAgICAgaWYgKG4ubm9kZVR5cGUgPT09IDExKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG4gYXMgRG9jdW1lbnRGcmFnbWVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbm9kZS5vd25lckRvY3VtZW50O1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0QnlJZChub2RlOiBOb2RlLCBpZDogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE93bmVyRnJhZ21lbnQobm9kZSkuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0QW5jZXN0b3IoaGllcmFyY2hpZXM6IFJ1bGVDb250ZXh0SGllcmFyY2h5LCBlbGVtTmFtZTogc3RyaW5nKSB7XG4gICAgICAgIGxldCBtYXRjaGVzID0gaGllcmFyY2hpZXNbXCJkb21cIl0uZmlsdGVyKGluZm8gPT4gaW5mby5yb2xlID09PSBlbGVtTmFtZSk7XG4gICAgICAgIHJldHVybiBtYXRjaGVzLmxlbmd0aCA+IDAgJiYgbWF0Y2hlc1swXS5ub2RlIHx8IG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRBbmNlc3RvcldpdGhSb2xlKGhpZXJhcmNoaWVzOiBSdWxlQ29udGV4dEhpZXJhcmNoeSwgcm9sZTogc3RyaW5nKSB7XG4gICAgICAgIGxldCBtYXRjaGVzID0gaGllcmFyY2hpZXNbXCJhcmlhXCJdLmZpbHRlcihpbmZvID0+IGluZm8ucm9sZSA9PT0gcm9sZSk7XG4gICAgICAgIHJldHVybiBtYXRjaGVzLmxlbmd0aCA+IDAgJiYgbWF0Y2hlc1swXS5ub2RlIHx8IG51bGw7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMS0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuLy8gRnJvbSBodHRwczovL3d3dy5pYW5hLm9yZy9hc3NpZ25tZW50cy9sYW5ndWFnZS1zdWJ0YWctcmVnaXN0cnkvbGFuZ3VhZ2Utc3VidGFnLXJlZ2lzdHJ5XG5jb25zdCB2YWxpZFByaW1hcnlMYW5ncyA9IFsgLy8gXCJxYWEuLnF0elwiLFxuWyBcImFhXCIsXCJhYlwiLFwiYWVcIixcImFmXCIsXCJha1wiLFwiYW1cIixcImFuXCIsXCJhclwiLFwiYXNcIixcImF2XCIsXCJheVwiLFwiYXpcIixcImFhYVwiLFwiYWFiXCIsXCJhYWNcIixcImFhZFwiLFwiYWFlXCIsXCJhYWZcIixcImFhZ1wiLFwiYWFoXCIsXCJhYWlcIixcImFha1wiLFwiYWFsXCIsXCJhYW1cIixcImFhblwiLFwiYWFvXCIsXCJhYXBcIixcImFhcVwiLFwiYWFzXCIsXCJhYXRcIixcImFhdVwiLFwiYWF2XCIsXCJhYXdcIixcImFheFwiLFwiYWF6XCIsXCJhYmFcIixcImFiYlwiLFwiYWJjXCIsXCJhYmRcIixcImFiZVwiLFwiYWJmXCIsXCJhYmdcIixcImFiaFwiLFwiYWJpXCIsXCJhYmpcIixcImFibFwiLFwiYWJtXCIsXCJhYm5cIixcImFib1wiLFwiYWJwXCIsXCJhYnFcIixcImFiclwiLFwiYWJzXCIsXCJhYnRcIixcImFidVwiLFwiYWJ2XCIsXCJhYndcIixcImFieFwiLFwiYWJ5XCIsXCJhYnpcIixcImFjYVwiLFwiYWNiXCIsXCJhY2RcIixcImFjZVwiLFwiYWNmXCIsXCJhY2hcIixcImFjaVwiLFwiYWNrXCIsXCJhY2xcIixcImFjbVwiLFwiYWNuXCIsXCJhY3BcIixcImFjcVwiLFwiYWNyXCIsXCJhY3NcIixcImFjdFwiLFwiYWN1XCIsXCJhY3ZcIixcImFjd1wiLFwiYWN4XCIsXCJhY3lcIixcImFjelwiLFwiYWRhXCIsXCJhZGJcIixcImFkZFwiLFwiYWRlXCIsXCJhZGZcIixcImFkZ1wiLFwiYWRoXCIsXCJhZGlcIixcImFkalwiLFwiYWRsXCIsXCJhZG5cIixcImFkb1wiLFwiYWRwXCIsXCJhZHFcIixcImFkclwiLFwiYWRzXCIsXCJhZHRcIixcImFkdVwiLFwiYWR3XCIsXCJhZHhcIixcImFkeVwiLFwiYWR6XCIsXCJhZWFcIixcImFlYlwiLFwiYWVjXCIsXCJhZWRcIixcImFlZVwiLFwiYWVrXCIsXCJhZWxcIixcImFlbVwiLFwiYWVuXCIsXCJhZXFcIixcImFlclwiLFwiYWVzXCIsXCJhZXVcIixcImFld1wiLFwiYWV5XCIsXCJhZXpcIixcImFmYVwiLFwiYWZiXCIsXCJhZmRcIixcImFmZVwiLFwiYWZnXCIsXCJhZmhcIixcImFmaVwiLFwiYWZrXCIsXCJhZm5cIixcImFmb1wiLFwiYWZwXCIsXCJhZnNcIixcImFmdFwiLFwiYWZ1XCIsXCJhZnpcIixcImFnYVwiLFwiYWdiXCIsXCJhZ2NcIixcImFnZFwiLFwiYWdlXCIsXCJhZ2ZcIixcImFnZ1wiLFwiYWdoXCIsXCJhZ2lcIixcImFnalwiLFwiYWdrXCIsXCJhZ2xcIixcImFnbVwiLFwiYWduXCIsXCJhZ29cIixcImFncFwiLFwiYWdxXCIsXCJhZ3JcIixcImFnc1wiLFwiYWd0XCIsXCJhZ3VcIixcImFndlwiLFwiYWd3XCIsXCJhZ3hcIixcImFneVwiLFwiYWd6XCIsXCJhaGFcIixcImFoYlwiLFwiYWhnXCIsXCJhaGhcIixcImFoaVwiLFwiYWhrXCIsXCJhaGxcIixcImFobVwiLFwiYWhuXCIsXCJhaG9cIixcImFocFwiLFwiYWhyXCIsXCJhaHNcIixcImFodFwiLFwiYWlhXCIsXCJhaWJcIixcImFpY1wiLFwiYWlkXCIsXCJhaWVcIixcImFpZlwiLFwiYWlnXCIsXCJhaWhcIixcImFpaVwiLFwiYWlqXCIsXCJhaWtcIixcImFpbFwiLFwiYWltXCIsXCJhaW5cIixcImFpb1wiLFwiYWlwXCIsXCJhaXFcIixcImFpclwiLFwiYWlzXCIsXCJhaXRcIixcImFpd1wiLFwiYWl4XCIsXCJhaXlcIixcImFqYVwiLFwiYWpnXCIsXCJhamlcIixcImFqblwiLFwiYWpwXCIsXCJhanRcIixcImFqdVwiLFwiYWp3XCIsXCJhanpcIixcImFrYlwiLFwiYWtjXCIsXCJha2RcIixcImFrZVwiLFwiYWtmXCIsXCJha2dcIixcImFraFwiLFwiYWtpXCIsXCJha2pcIixcImFra1wiLFwiYWtsXCIsXCJha21cIixcImFrb1wiLFwiYWtwXCIsXCJha3FcIixcImFrclwiLFwiYWtzXCIsXCJha3RcIixcImFrdVwiLFwiYWt2XCIsXCJha3dcIixcImFreFwiLFwiYWt5XCIsXCJha3pcIixcImFsYVwiLFwiYWxjXCIsXCJhbGRcIixcImFsZVwiLFwiYWxmXCIsXCJhbGdcIixcImFsaFwiLFwiYWxpXCIsXCJhbGpcIixcImFsa1wiLFwiYWxsXCIsXCJhbG1cIixcImFsblwiLFwiYWxvXCIsXCJhbHBcIixcImFscVwiLFwiYWxyXCIsXCJhbHNcIixcImFsdFwiLFwiYWx1XCIsXCJhbHZcIixcImFsd1wiLFwiYWx4XCIsXCJhbHlcIixcImFselwiLFwiYW1hXCIsXCJhbWJcIixcImFtY1wiLFwiYW1lXCIsXCJhbWZcIixcImFtZ1wiLFwiYW1pXCIsXCJhbWpcIixcImFta1wiLFwiYW1sXCIsXCJhbW1cIixcImFtblwiLFwiYW1vXCIsXCJhbXBcIixcImFtcVwiLFwiYW1yXCIsXCJhbXNcIixcImFtdFwiLFwiYW11XCIsXCJhbXZcIixcImFtd1wiLFwiYW14XCIsXCJhbXlcIixcImFtelwiLFwiYW5hXCIsXCJhbmJcIixcImFuY1wiLFwiYW5kXCIsXCJhbmVcIixcImFuZlwiLFwiYW5nXCIsXCJhbmhcIixcImFuaVwiLFwiYW5qXCIsXCJhbmtcIixcImFubFwiLFwiYW5tXCIsXCJhbm5cIixcImFub1wiLFwiYW5wXCIsXCJhbnFcIixcImFuclwiLFwiYW5zXCIsXCJhbnRcIixcImFudVwiLFwiYW52XCIsXCJhbndcIixcImFueFwiLFwiYW55XCIsXCJhbnpcIixcImFvYVwiLFwiYW9iXCIsXCJhb2NcIixcImFvZFwiLFwiYW9lXCIsXCJhb2ZcIixcImFvZ1wiLFwiYW9oXCIsXCJhb2lcIixcImFvalwiLFwiYW9rXCIsXCJhb2xcIixcImFvbVwiLFwiYW9uXCIsXCJhb3JcIixcImFvc1wiLFwiYW90XCIsXCJhb3VcIixcImFveFwiLFwiYW96XCIsXCJhcGFcIixcImFwYlwiLFwiYXBjXCIsXCJhcGRcIixcImFwZVwiLFwiYXBmXCIsXCJhcGdcIixcImFwaFwiLFwiYXBpXCIsXCJhcGpcIixcImFwa1wiLFwiYXBsXCIsXCJhcG1cIixcImFwblwiLFwiYXBvXCIsXCJhcHBcIixcImFwcVwiLFwiYXByXCIsXCJhcHNcIixcImFwdFwiLFwiYXB1XCIsXCJhcHZcIixcImFwd1wiLFwiYXB4XCIsXCJhcHlcIixcImFwelwiLFwiYXFhXCIsXCJhcWNcIixcImFxZFwiLFwiYXFnXCIsXCJhcWtcIixcImFxbFwiLFwiYXFtXCIsXCJhcW5cIixcImFxcFwiLFwiYXFyXCIsXCJhcXRcIixcImFxelwiLFwiYXJiXCIsXCJhcmNcIixcImFyZFwiLFwiYXJlXCIsXCJhcmhcIixcImFyaVwiLFwiYXJqXCIsXCJhcmtcIixcImFybFwiLFwiYXJuXCIsXCJhcm9cIixcImFycFwiLFwiYXJxXCIsXCJhcnJcIixcImFyc1wiLFwiYXJ0XCIsXCJhcnVcIixcImFydlwiLFwiYXJ3XCIsXCJhcnhcIixcImFyeVwiLFwiYXJ6XCIsXCJhc2FcIixcImFzYlwiLFwiYXNjXCIsXCJhc2RcIixcImFzZVwiLFwiYXNmXCIsXCJhc2dcIixcImFzaFwiLFwiYXNpXCIsXCJhc2pcIixcImFza1wiLFwiYXNsXCIsXCJhc25cIixcImFzb1wiLFwiYXNwXCIsXCJhc3FcIixcImFzclwiLFwiYXNzXCIsXCJhc3RcIixcImFzdVwiLFwiYXN2XCIsXCJhc3dcIixcImFzeFwiLFwiYXN5XCIsXCJhc3pcIixcImF0YVwiLFwiYXRiXCIsXCJhdGNcIixcImF0ZFwiLFwiYXRlXCIsXCJhdGdcIixcImF0aFwiLFwiYXRpXCIsXCJhdGpcIixcImF0a1wiLFwiYXRsXCIsXCJhdG1cIixcImF0blwiLFwiYXRvXCIsXCJhdHBcIixcImF0cVwiLFwiYXRyXCIsXCJhdHNcIixcImF0dFwiLFwiYXR1XCIsXCJhdHZcIixcImF0d1wiLFwiYXR4XCIsXCJhdHlcIixcImF0elwiLFwiYXVhXCIsXCJhdWJcIixcImF1Y1wiLFwiYXVkXCIsXCJhdWVcIixcImF1ZlwiLFwiYXVnXCIsXCJhdWhcIixcImF1aVwiLFwiYXVqXCIsXCJhdWtcIixcImF1bFwiLFwiYXVtXCIsXCJhdW5cIixcImF1b1wiLFwiYXVwXCIsXCJhdXFcIixcImF1clwiLFwiYXVzXCIsXCJhdXRcIixcImF1dVwiLFwiYXV3XCIsXCJhdXhcIixcImF1eVwiLFwiYXV6XCIsXCJhdmJcIixcImF2ZFwiLFwiYXZpXCIsXCJhdmtcIixcImF2bFwiLFwiYXZtXCIsXCJhdm5cIixcImF2b1wiLFwiYXZzXCIsXCJhdnRcIixcImF2dVwiLFwiYXZ2XCIsXCJhd2FcIixcImF3YlwiLFwiYXdjXCIsXCJhd2RcIixcImF3ZVwiLFwiYXdnXCIsXCJhd2hcIixcImF3aVwiLFwiYXdrXCIsXCJhd21cIixcImF3blwiLFwiYXdvXCIsXCJhd3JcIixcImF3c1wiLFwiYXd0XCIsXCJhd3VcIixcImF3dlwiLFwiYXd3XCIsXCJhd3hcIixcImF3eVwiLFwiYXhiXCIsXCJheGVcIixcImF4Z1wiLFwiYXhrXCIsXCJheGxcIixcImF4bVwiLFwiYXh4XCIsXCJheWFcIixcImF5YlwiLFwiYXljXCIsXCJheWRcIixcImF5ZVwiLFwiYXlnXCIsXCJheWhcIixcImF5aVwiLFwiYXlrXCIsXCJheWxcIixcImF5blwiLFwiYXlvXCIsXCJheXBcIixcImF5cVwiLFwiYXlyXCIsXCJheXNcIixcImF5dFwiLFwiYXl1XCIsXCJheXhcIixcImF5eVwiLFwiYXl6XCIsXCJhemFcIixcImF6YlwiLFwiYXpjXCIsXCJhemRcIixcImF6Z1wiLFwiYXpqXCIsXCJhem1cIixcImF6blwiLFwiYXpvXCIsXCJhenRcIixcImF6elwiXVxuLFsgXCJiYVwiLFwiYmVcIixcImJnXCIsXCJiaFwiLFwiYmlcIixcImJtXCIsXCJiblwiLFwiYm9cIixcImJyXCIsXCJic1wiLFwiYmFhXCIsXCJiYWJcIixcImJhY1wiLFwiYmFkXCIsXCJiYWVcIixcImJhZlwiLFwiYmFnXCIsXCJiYWhcIixcImJhaVwiLFwiYmFqXCIsXCJiYWxcIixcImJhblwiLFwiYmFvXCIsXCJiYXBcIixcImJhclwiLFwiYmFzXCIsXCJiYXRcIixcImJhdVwiLFwiYmF2XCIsXCJiYXdcIixcImJheFwiLFwiYmF5XCIsXCJiYXpcIixcImJiYVwiLFwiYmJiXCIsXCJiYmNcIixcImJiZFwiLFwiYmJlXCIsXCJiYmZcIixcImJiZ1wiLFwiYmJoXCIsXCJiYmlcIixcImJialwiLFwiYmJrXCIsXCJiYmxcIixcImJibVwiLFwiYmJuXCIsXCJiYm9cIixcImJicFwiLFwiYmJxXCIsXCJiYnJcIixcImJic1wiLFwiYmJ0XCIsXCJiYnVcIixcImJidlwiLFwiYmJ3XCIsXCJiYnhcIixcImJieVwiLFwiYmJ6XCIsXCJiY2FcIixcImJjYlwiLFwiYmNjXCIsXCJiY2RcIixcImJjZVwiLFwiYmNmXCIsXCJiY2dcIixcImJjaFwiLFwiYmNpXCIsXCJiY2pcIixcImJja1wiLFwiYmNsXCIsXCJiY21cIixcImJjblwiLFwiYmNvXCIsXCJiY3BcIixcImJjcVwiLFwiYmNyXCIsXCJiY3NcIixcImJjdFwiLFwiYmN1XCIsXCJiY3ZcIixcImJjd1wiLFwiYmN5XCIsXCJiY3pcIixcImJkYVwiLFwiYmRiXCIsXCJiZGNcIixcImJkZFwiLFwiYmRlXCIsXCJiZGZcIixcImJkZ1wiLFwiYmRoXCIsXCJiZGlcIixcImJkalwiLFwiYmRrXCIsXCJiZGxcIixcImJkbVwiLFwiYmRuXCIsXCJiZG9cIixcImJkcFwiLFwiYmRxXCIsXCJiZHJcIixcImJkc1wiLFwiYmR0XCIsXCJiZHVcIixcImJkdlwiLFwiYmR3XCIsXCJiZHhcIixcImJkeVwiLFwiYmR6XCIsXCJiZWFcIixcImJlYlwiLFwiYmVjXCIsXCJiZWRcIixcImJlZVwiLFwiYmVmXCIsXCJiZWdcIixcImJlaFwiLFwiYmVpXCIsXCJiZWpcIixcImJla1wiLFwiYmVtXCIsXCJiZW9cIixcImJlcFwiLFwiYmVxXCIsXCJiZXJcIixcImJlc1wiLFwiYmV0XCIsXCJiZXVcIixcImJldlwiLFwiYmV3XCIsXCJiZXhcIixcImJleVwiLFwiYmV6XCIsXCJiZmFcIixcImJmYlwiLFwiYmZjXCIsXCJiZmRcIixcImJmZVwiLFwiYmZmXCIsXCJiZmdcIixcImJmaFwiLFwiYmZpXCIsXCJiZmpcIixcImJma1wiLFwiYmZsXCIsXCJiZm1cIixcImJmblwiLFwiYmZvXCIsXCJiZnBcIixcImJmcVwiLFwiYmZyXCIsXCJiZnNcIixcImJmdFwiLFwiYmZ1XCIsXCJiZndcIixcImJmeFwiLFwiYmZ5XCIsXCJiZnpcIixcImJnYVwiLFwiYmdiXCIsXCJiZ2NcIixcImJnZFwiLFwiYmdlXCIsXCJiZ2ZcIixcImJnZ1wiLFwiYmdpXCIsXCJiZ2pcIixcImJna1wiLFwiYmdsXCIsXCJiZ21cIixcImJnblwiLFwiYmdvXCIsXCJiZ3BcIixcImJncVwiLFwiYmdyXCIsXCJiZ3NcIixcImJndFwiLFwiYmd1XCIsXCJiZ3ZcIixcImJnd1wiLFwiYmd4XCIsXCJiZ3lcIixcImJnelwiLFwiYmhhXCIsXCJiaGJcIixcImJoY1wiLFwiYmhkXCIsXCJiaGVcIixcImJoZlwiLFwiYmhnXCIsXCJiaGhcIixcImJoaVwiLFwiYmhqXCIsXCJiaGtcIixcImJobFwiLFwiYmhtXCIsXCJiaG5cIixcImJob1wiLFwiYmhwXCIsXCJiaHFcIixcImJoclwiLFwiYmhzXCIsXCJiaHRcIixcImJodVwiLFwiYmh2XCIsXCJiaHdcIixcImJoeFwiLFwiYmh5XCIsXCJiaHpcIixcImJpYVwiLFwiYmliXCIsXCJiaWNcIixcImJpZFwiLFwiYmllXCIsXCJiaWZcIixcImJpZ1wiLFwiYmlqXCIsXCJiaWtcIixcImJpbFwiLFwiYmltXCIsXCJiaW5cIixcImJpb1wiLFwiYmlwXCIsXCJiaXFcIixcImJpclwiLFwiYml0XCIsXCJiaXVcIixcImJpdlwiLFwiYml3XCIsXCJiaXhcIixcImJpeVwiLFwiYml6XCIsXCJiamFcIixcImJqYlwiLFwiYmpjXCIsXCJiamRcIixcImJqZVwiLFwiYmpmXCIsXCJiamdcIixcImJqaFwiLFwiYmppXCIsXCJiampcIixcImJqa1wiLFwiYmpsXCIsXCJiam1cIixcImJqblwiLFwiYmpvXCIsXCJianBcIixcImJqcVwiLFwiYmpyXCIsXCJianNcIixcImJqdFwiLFwiYmp1XCIsXCJianZcIixcImJqd1wiLFwiYmp4XCIsXCJianlcIixcImJqelwiLFwiYmthXCIsXCJia2JcIixcImJrY1wiLFwiYmtkXCIsXCJia2ZcIixcImJrZ1wiLFwiYmtoXCIsXCJia2lcIixcImJralwiLFwiYmtrXCIsXCJia2xcIixcImJrbVwiLFwiYmtuXCIsXCJia29cIixcImJrcFwiLFwiYmtxXCIsXCJia3JcIixcImJrc1wiLFwiYmt0XCIsXCJia3VcIixcImJrdlwiLFwiYmt3XCIsXCJia3hcIixcImJreVwiLFwiYmt6XCIsXCJibGFcIixcImJsYlwiLFwiYmxjXCIsXCJibGRcIixcImJsZVwiLFwiYmxmXCIsXCJibGdcIixcImJsaFwiLFwiYmxpXCIsXCJibGpcIixcImJsa1wiLFwiYmxsXCIsXCJibG1cIixcImJsblwiLFwiYmxvXCIsXCJibHBcIixcImJscVwiLFwiYmxyXCIsXCJibHNcIixcImJsdFwiLFwiYmx2XCIsXCJibHdcIixcImJseFwiLFwiYmx5XCIsXCJibHpcIixcImJtYVwiLFwiYm1iXCIsXCJibWNcIixcImJtZFwiLFwiYm1lXCIsXCJibWZcIixcImJtZ1wiLFwiYm1oXCIsXCJibWlcIixcImJtalwiLFwiYm1rXCIsXCJibWxcIixcImJtbVwiLFwiYm1uXCIsXCJibW9cIixcImJtcFwiLFwiYm1xXCIsXCJibXJcIixcImJtc1wiLFwiYm10XCIsXCJibXVcIixcImJtdlwiLFwiYm13XCIsXCJibXhcIixcImJteVwiLFwiYm16XCIsXCJibmFcIixcImJuYlwiLFwiYm5jXCIsXCJibmRcIixcImJuZVwiLFwiYm5mXCIsXCJibmdcIixcImJuaVwiLFwiYm5qXCIsXCJibmtcIixcImJubFwiLFwiYm5tXCIsXCJibm5cIixcImJub1wiLFwiYm5wXCIsXCJibnFcIixcImJuclwiLFwiYm5zXCIsXCJibnRcIixcImJudVwiLFwiYm52XCIsXCJibndcIixcImJueFwiLFwiYm55XCIsXCJibnpcIixcImJvYVwiLFwiYm9iXCIsXCJib2VcIixcImJvZlwiLFwiYm9nXCIsXCJib2hcIixcImJvaVwiLFwiYm9qXCIsXCJib2tcIixcImJvbFwiLFwiYm9tXCIsXCJib25cIixcImJvb1wiLFwiYm9wXCIsXCJib3FcIixcImJvclwiLFwiYm90XCIsXCJib3VcIixcImJvdlwiLFwiYm93XCIsXCJib3hcIixcImJveVwiLFwiYm96XCIsXCJicGFcIixcImJwYlwiLFwiYnBkXCIsXCJicGVcIixcImJwZ1wiLFwiYnBoXCIsXCJicGlcIixcImJwalwiLFwiYnBrXCIsXCJicGxcIixcImJwbVwiLFwiYnBuXCIsXCJicG9cIixcImJwcFwiLFwiYnBxXCIsXCJicHJcIixcImJwc1wiLFwiYnB0XCIsXCJicHVcIixcImJwdlwiLFwiYnB3XCIsXCJicHhcIixcImJweVwiLFwiYnB6XCIsXCJicWFcIixcImJxYlwiLFwiYnFjXCIsXCJicWRcIixcImJxZlwiLFwiYnFnXCIsXCJicWhcIixcImJxaVwiLFwiYnFqXCIsXCJicWtcIixcImJxbFwiLFwiYnFtXCIsXCJicW5cIixcImJxb1wiLFwiYnFwXCIsXCJicXFcIixcImJxclwiLFwiYnFzXCIsXCJicXRcIixcImJxdVwiLFwiYnF2XCIsXCJicXdcIixcImJxeFwiLFwiYnF5XCIsXCJicXpcIixcImJyYVwiLFwiYnJiXCIsXCJicmNcIixcImJyZFwiLFwiYnJmXCIsXCJicmdcIixcImJyaFwiLFwiYnJpXCIsXCJicmpcIixcImJya1wiLFwiYnJsXCIsXCJicm1cIixcImJyblwiLFwiYnJvXCIsXCJicnBcIixcImJycVwiLFwiYnJyXCIsXCJicnNcIixcImJydFwiLFwiYnJ1XCIsXCJicnZcIixcImJyd1wiLFwiYnJ4XCIsXCJicnlcIixcImJyelwiLFwiYnNhXCIsXCJic2JcIixcImJzY1wiLFwiYnNlXCIsXCJic2ZcIixcImJzZ1wiLFwiYnNoXCIsXCJic2lcIixcImJzalwiLFwiYnNrXCIsXCJic2xcIixcImJzbVwiLFwiYnNuXCIsXCJic29cIixcImJzcFwiLFwiYnNxXCIsXCJic3JcIixcImJzc1wiLFwiYnN0XCIsXCJic3VcIixcImJzdlwiLFwiYnN3XCIsXCJic3hcIixcImJzeVwiLFwiYnRhXCIsXCJidGJcIixcImJ0Y1wiLFwiYnRkXCIsXCJidGVcIixcImJ0ZlwiLFwiYnRnXCIsXCJidGhcIixcImJ0aVwiLFwiYnRqXCIsXCJidGtcIixcImJ0bFwiLFwiYnRtXCIsXCJidG5cIixcImJ0b1wiLFwiYnRwXCIsXCJidHFcIixcImJ0clwiLFwiYnRzXCIsXCJidHRcIixcImJ0dVwiLFwiYnR2XCIsXCJidHdcIixcImJ0eFwiLFwiYnR5XCIsXCJidHpcIixcImJ1YVwiLFwiYnViXCIsXCJidWNcIixcImJ1ZFwiLFwiYnVlXCIsXCJidWZcIixcImJ1Z1wiLFwiYnVoXCIsXCJidWlcIixcImJ1alwiLFwiYnVrXCIsXCJidW1cIixcImJ1blwiLFwiYnVvXCIsXCJidXBcIixcImJ1cVwiLFwiYnVzXCIsXCJidXRcIixcImJ1dVwiLFwiYnV2XCIsXCJidXdcIixcImJ1eFwiLFwiYnV5XCIsXCJidXpcIixcImJ2YVwiLFwiYnZiXCIsXCJidmNcIixcImJ2ZFwiLFwiYnZlXCIsXCJidmZcIixcImJ2Z1wiLFwiYnZoXCIsXCJidmlcIixcImJ2alwiLFwiYnZrXCIsXCJidmxcIixcImJ2bVwiLFwiYnZuXCIsXCJidm9cIixcImJ2cFwiLFwiYnZxXCIsXCJidnJcIixcImJ2dFwiLFwiYnZ1XCIsXCJidnZcIixcImJ2d1wiLFwiYnZ4XCIsXCJidnlcIixcImJ2elwiLFwiYndhXCIsXCJid2JcIixcImJ3Y1wiLFwiYndkXCIsXCJid2VcIixcImJ3ZlwiLFwiYndnXCIsXCJid2hcIixcImJ3aVwiLFwiYndqXCIsXCJid2tcIixcImJ3bFwiLFwiYndtXCIsXCJid25cIixcImJ3b1wiLFwiYndwXCIsXCJid3FcIixcImJ3clwiLFwiYndzXCIsXCJid3RcIixcImJ3dVwiLFwiYnd3XCIsXCJid3hcIixcImJ3eVwiLFwiYnd6XCIsXCJieGFcIixcImJ4YlwiLFwiYnhjXCIsXCJieGRcIixcImJ4ZVwiLFwiYnhmXCIsXCJieGdcIixcImJ4aFwiLFwiYnhpXCIsXCJieGpcIixcImJ4a1wiLFwiYnhsXCIsXCJieG1cIixcImJ4blwiLFwiYnhvXCIsXCJieHBcIixcImJ4cVwiLFwiYnhyXCIsXCJieHNcIixcImJ4dVwiLFwiYnh2XCIsXCJieHdcIixcImJ4eFwiLFwiYnh6XCIsXCJieWFcIixcImJ5YlwiLFwiYnljXCIsXCJieWRcIixcImJ5ZVwiLFwiYnlmXCIsXCJieWdcIixcImJ5aFwiLFwiYnlpXCIsXCJieWpcIixcImJ5a1wiLFwiYnlsXCIsXCJieW1cIixcImJ5blwiLFwiYnlvXCIsXCJieXBcIixcImJ5cVwiLFwiYnlyXCIsXCJieXNcIixcImJ5dFwiLFwiYnl2XCIsXCJieXdcIixcImJ5eFwiLFwiYnl5XCIsXCJieXpcIixcImJ6YVwiLFwiYnpiXCIsXCJiemNcIixcImJ6ZFwiLFwiYnplXCIsXCJiemZcIixcImJ6Z1wiLFwiYnpoXCIsXCJiemlcIixcImJ6alwiLFwiYnprXCIsXCJiemxcIixcImJ6bVwiLFwiYnpuXCIsXCJiem9cIixcImJ6cFwiLFwiYnpxXCIsXCJienJcIixcImJ6c1wiLFwiYnp0XCIsXCJienVcIixcImJ6dlwiLFwiYnp3XCIsXCJienhcIixcImJ6eVwiLFwiYnp6XCJdXG4sWyBcImNhXCIsXCJjZVwiLFwiY2hcIixcImNvXCIsXCJjclwiLFwiY3NcIixcImN1XCIsXCJjdlwiLFwiY3lcIixcImNhYVwiLFwiY2FiXCIsXCJjYWNcIixcImNhZFwiLFwiY2FlXCIsXCJjYWZcIixcImNhZ1wiLFwiY2FoXCIsXCJjYWlcIixcImNhalwiLFwiY2FrXCIsXCJjYWxcIixcImNhbVwiLFwiY2FuXCIsXCJjYW9cIixcImNhcFwiLFwiY2FxXCIsXCJjYXJcIixcImNhc1wiLFwiY2F1XCIsXCJjYXZcIixcImNhd1wiLFwiY2F4XCIsXCJjYXlcIixcImNhelwiLFwiY2JhXCIsXCJjYmJcIixcImNiY1wiLFwiY2JkXCIsXCJjYmVcIixcImNiZ1wiLFwiY2JoXCIsXCJjYmlcIixcImNialwiLFwiY2JrXCIsXCJjYmxcIixcImNiblwiLFwiY2JvXCIsXCJjYnFcIixcImNiclwiLFwiY2JzXCIsXCJjYnRcIixcImNidVwiLFwiY2J2XCIsXCJjYndcIixcImNieVwiLFwiY2NhXCIsXCJjY2NcIixcImNjZFwiLFwiY2NlXCIsXCJjY2dcIixcImNjaFwiLFwiY2NqXCIsXCJjY2xcIixcImNjbVwiLFwiY2NuXCIsXCJjY29cIixcImNjcFwiLFwiY2NxXCIsXCJjY3JcIixcImNjc1wiLFwiY2RhXCIsXCJjZGNcIixcImNkZFwiLFwiY2RlXCIsXCJjZGZcIixcImNkZ1wiLFwiY2RoXCIsXCJjZGlcIixcImNkalwiLFwiY2RtXCIsXCJjZG5cIixcImNkb1wiLFwiY2RyXCIsXCJjZHNcIixcImNkeVwiLFwiY2R6XCIsXCJjZWFcIixcImNlYlwiLFwiY2VnXCIsXCJjZWtcIixcImNlbFwiLFwiY2VuXCIsXCJjZXRcIixcImNleVwiLFwiY2ZhXCIsXCJjZmRcIixcImNmZ1wiLFwiY2ZtXCIsXCJjZ2FcIixcImNnY1wiLFwiY2dnXCIsXCJjZ2tcIixcImNoYlwiLFwiY2hjXCIsXCJjaGRcIixcImNoZlwiLFwiY2hnXCIsXCJjaGhcIixcImNoalwiLFwiY2hrXCIsXCJjaGxcIixcImNobVwiLFwiY2huXCIsXCJjaG9cIixcImNocFwiLFwiY2hxXCIsXCJjaHJcIixcImNodFwiLFwiY2h3XCIsXCJjaHhcIixcImNoeVwiLFwiY2h6XCIsXCJjaWFcIixcImNpYlwiLFwiY2ljXCIsXCJjaWRcIixcImNpZVwiLFwiY2loXCIsXCJjaWtcIixcImNpbVwiLFwiY2luXCIsXCJjaXBcIixcImNpclwiLFwiY2l3XCIsXCJjaXlcIixcImNqYVwiLFwiY2plXCIsXCJjamhcIixcImNqaVwiLFwiY2prXCIsXCJjam1cIixcImNqblwiLFwiY2pvXCIsXCJjanBcIixcImNqclwiLFwiY2pzXCIsXCJjanZcIixcImNqeVwiLFwiY2thXCIsXCJja2JcIixcImNraFwiLFwiY2tsXCIsXCJja21cIixcImNrblwiLFwiY2tvXCIsXCJja3FcIixcImNrclwiLFwiY2tzXCIsXCJja3RcIixcImNrdVwiLFwiY2t2XCIsXCJja3hcIixcImNreVwiLFwiY2t6XCIsXCJjbGFcIixcImNsY1wiLFwiY2xkXCIsXCJjbGVcIixcImNsaFwiLFwiY2xpXCIsXCJjbGpcIixcImNsa1wiLFwiY2xsXCIsXCJjbG1cIixcImNsb1wiLFwiY2x0XCIsXCJjbHVcIixcImNsd1wiLFwiY2x5XCIsXCJjbWFcIixcImNtY1wiLFwiY21lXCIsXCJjbWdcIixcImNtaVwiLFwiY21rXCIsXCJjbWxcIixcImNtbVwiLFwiY21uXCIsXCJjbW9cIixcImNtclwiLFwiY21zXCIsXCJjbXRcIixcImNuYVwiLFwiY25iXCIsXCJjbmNcIixcImNuZ1wiLFwiY25oXCIsXCJjbmlcIixcImNua1wiLFwiY25sXCIsXCJjbm9cIixcImNucFwiLFwiY25yXCIsXCJjbnNcIixcImNudFwiLFwiY251XCIsXCJjbndcIixcImNueFwiLFwiY29hXCIsXCJjb2JcIixcImNvY1wiLFwiY29kXCIsXCJjb2VcIixcImNvZlwiLFwiY29nXCIsXCJjb2hcIixcImNvalwiLFwiY29rXCIsXCJjb2xcIixcImNvbVwiLFwiY29uXCIsXCJjb29cIixcImNvcFwiLFwiY29xXCIsXCJjb3RcIixcImNvdVwiLFwiY292XCIsXCJjb3dcIixcImNveFwiLFwiY295XCIsXCJjb3pcIixcImNwYVwiLFwiY3BiXCIsXCJjcGNcIixcImNwZVwiLFwiY3BmXCIsXCJjcGdcIixcImNwaVwiLFwiY3BuXCIsXCJjcG9cIixcImNwcFwiLFwiY3BzXCIsXCJjcHVcIixcImNweFwiLFwiY3B5XCIsXCJjcWRcIixcImNxdVwiLFwiY3JhXCIsXCJjcmJcIixcImNyY1wiLFwiY3JkXCIsXCJjcmZcIixcImNyZ1wiLFwiY3JoXCIsXCJjcmlcIixcImNyalwiLFwiY3JrXCIsXCJjcmxcIixcImNybVwiLFwiY3JuXCIsXCJjcm9cIixcImNycFwiLFwiY3JxXCIsXCJjcnJcIixcImNyc1wiLFwiY3J0XCIsXCJjcnZcIixcImNyd1wiLFwiY3J4XCIsXCJjcnlcIixcImNyelwiLFwiY3NhXCIsXCJjc2JcIixcImNzY1wiLFwiY3NkXCIsXCJjc2VcIixcImNzZlwiLFwiY3NnXCIsXCJjc2hcIixcImNzaVwiLFwiY3NqXCIsXCJjc2tcIixcImNzbFwiLFwiY3NtXCIsXCJjc25cIixcImNzb1wiLFwiY3NwXCIsXCJjc3FcIixcImNzclwiLFwiY3NzXCIsXCJjc3RcIixcImNzdVwiLFwiY3N2XCIsXCJjc3dcIixcImNzeFwiLFwiY3N5XCIsXCJjc3pcIixcImN0YVwiLFwiY3RjXCIsXCJjdGRcIixcImN0ZVwiLFwiY3RnXCIsXCJjdGhcIixcImN0bFwiLFwiY3RtXCIsXCJjdG5cIixcImN0b1wiLFwiY3RwXCIsXCJjdHNcIixcImN0dFwiLFwiY3R1XCIsXCJjdHlcIixcImN0elwiLFwiY3VhXCIsXCJjdWJcIixcImN1Y1wiLFwiY3VnXCIsXCJjdWhcIixcImN1aVwiLFwiY3VqXCIsXCJjdWtcIixcImN1bFwiLFwiY3VtXCIsXCJjdW9cIixcImN1cFwiLFwiY3VxXCIsXCJjdXJcIixcImN1c1wiLFwiY3V0XCIsXCJjdXVcIixcImN1dlwiLFwiY3V3XCIsXCJjdXhcIixcImN1eVwiLFwiY3ZnXCIsXCJjdm5cIixcImN3YVwiLFwiY3diXCIsXCJjd2RcIixcImN3ZVwiLFwiY3dnXCIsXCJjd3RcIixcImN5YVwiLFwiY3liXCIsXCJjeW9cIixcImN6aFwiLFwiY3prXCIsXCJjem5cIixcImN6b1wiLFwiY3p0XCJdXG4sWyBcImRhXCIsXCJkZVwiLFwiZHZcIixcImR6XCIsXCJkYWFcIixcImRhY1wiLFwiZGFkXCIsXCJkYWVcIixcImRhZlwiLFwiZGFnXCIsXCJkYWhcIixcImRhaVwiLFwiZGFqXCIsXCJkYWtcIixcImRhbFwiLFwiZGFtXCIsXCJkYW9cIixcImRhcFwiLFwiZGFxXCIsXCJkYXJcIixcImRhc1wiLFwiZGF1XCIsXCJkYXZcIixcImRhd1wiLFwiZGF4XCIsXCJkYXlcIixcImRhelwiLFwiZGJhXCIsXCJkYmJcIixcImRiZFwiLFwiZGJlXCIsXCJkYmZcIixcImRiZ1wiLFwiZGJpXCIsXCJkYmpcIixcImRibFwiLFwiZGJtXCIsXCJkYm5cIixcImRib1wiLFwiZGJwXCIsXCJkYnFcIixcImRiclwiLFwiZGJ0XCIsXCJkYnVcIixcImRidlwiLFwiZGJ3XCIsXCJkYnlcIixcImRjY1wiLFwiZGNyXCIsXCJkZGFcIixcImRkZFwiLFwiZGRlXCIsXCJkZGdcIixcImRkaVwiLFwiZGRqXCIsXCJkZG5cIixcImRkb1wiLFwiZGRyXCIsXCJkZHNcIixcImRkd1wiLFwiZGVjXCIsXCJkZWRcIixcImRlZVwiLFwiZGVmXCIsXCJkZWdcIixcImRlaFwiLFwiZGVpXCIsXCJkZWtcIixcImRlbFwiLFwiZGVtXCIsXCJkZW5cIixcImRlcFwiLFwiZGVxXCIsXCJkZXJcIixcImRlc1wiLFwiZGV2XCIsXCJkZXpcIixcImRnYVwiLFwiZGdiXCIsXCJkZ2NcIixcImRnZFwiLFwiZGdlXCIsXCJkZ2dcIixcImRnaFwiLFwiZGdpXCIsXCJkZ2tcIixcImRnbFwiLFwiZGduXCIsXCJkZ29cIixcImRnclwiLFwiZGdzXCIsXCJkZ3RcIixcImRndVwiLFwiZGd3XCIsXCJkZ3hcIixcImRnelwiLFwiZGhhXCIsXCJkaGRcIixcImRoZ1wiLFwiZGhpXCIsXCJkaGxcIixcImRobVwiLFwiZGhuXCIsXCJkaG9cIixcImRoclwiLFwiZGhzXCIsXCJkaHVcIixcImRodlwiLFwiZGh3XCIsXCJkaHhcIixcImRpYVwiLFwiZGliXCIsXCJkaWNcIixcImRpZFwiLFwiZGlmXCIsXCJkaWdcIixcImRpaFwiLFwiZGlpXCIsXCJkaWpcIixcImRpa1wiLFwiZGlsXCIsXCJkaW1cIixcImRpblwiLFwiZGlvXCIsXCJkaXBcIixcImRpcVwiLFwiZGlyXCIsXCJkaXNcIixcImRpdFwiLFwiZGl1XCIsXCJkaXdcIixcImRpeFwiLFwiZGl5XCIsXCJkaXpcIixcImRqYVwiLFwiZGpiXCIsXCJkamNcIixcImRqZFwiLFwiZGplXCIsXCJkamZcIixcImRqaVwiLFwiZGpqXCIsXCJkamtcIixcImRqbFwiLFwiZGptXCIsXCJkam5cIixcImRqb1wiLFwiZGpyXCIsXCJkanVcIixcImRqd1wiLFwiZGthXCIsXCJka2dcIixcImRra1wiLFwiZGtsXCIsXCJka3JcIixcImRrc1wiLFwiZGt4XCIsXCJkbGdcIixcImRsa1wiLFwiZGxtXCIsXCJkbG5cIixcImRtYVwiLFwiZG1iXCIsXCJkbWNcIixcImRtZFwiLFwiZG1lXCIsXCJkbWZcIixcImRtZ1wiLFwiZG1rXCIsXCJkbWxcIixcImRtbVwiLFwiZG1uXCIsXCJkbW9cIixcImRtclwiLFwiZG1zXCIsXCJkbXVcIixcImRtdlwiLFwiZG13XCIsXCJkbXhcIixcImRteVwiLFwiZG5hXCIsXCJkbmRcIixcImRuZVwiLFwiZG5nXCIsXCJkbmlcIixcImRualwiLFwiZG5rXCIsXCJkbm5cIixcImRub1wiLFwiZG5yXCIsXCJkbnRcIixcImRudVwiLFwiZG52XCIsXCJkbndcIixcImRueVwiLFwiZG9hXCIsXCJkb2JcIixcImRvY1wiLFwiZG9lXCIsXCJkb2ZcIixcImRvaFwiLFwiZG9pXCIsXCJkb2tcIixcImRvbFwiLFwiZG9uXCIsXCJkb29cIixcImRvcFwiLFwiZG9xXCIsXCJkb3JcIixcImRvc1wiLFwiZG90XCIsXCJkb3ZcIixcImRvd1wiLFwiZG94XCIsXCJkb3lcIixcImRvelwiLFwiZHBwXCIsXCJkcmFcIixcImRyYlwiLFwiZHJjXCIsXCJkcmRcIixcImRyZVwiLFwiZHJnXCIsXCJkcmhcIixcImRyaVwiLFwiZHJsXCIsXCJkcm5cIixcImRyb1wiLFwiZHJxXCIsXCJkcnJcIixcImRyc1wiLFwiZHJ0XCIsXCJkcnVcIixcImRyd1wiLFwiZHJ5XCIsXCJkc2JcIixcImRzZVwiLFwiZHNoXCIsXCJkc2lcIixcImRzbFwiLFwiZHNuXCIsXCJkc29cIixcImRzcVwiLFwiZHRhXCIsXCJkdGJcIixcImR0ZFwiLFwiZHRoXCIsXCJkdGlcIixcImR0a1wiLFwiZHRtXCIsXCJkdG5cIixcImR0b1wiLFwiZHRwXCIsXCJkdHJcIixcImR0c1wiLFwiZHR0XCIsXCJkdHVcIixcImR0eVwiLFwiZHVhXCIsXCJkdWJcIixcImR1Y1wiLFwiZHVkXCIsXCJkdWVcIixcImR1ZlwiLFwiZHVnXCIsXCJkdWhcIixcImR1aVwiLFwiZHVqXCIsXCJkdWtcIixcImR1bFwiLFwiZHVtXCIsXCJkdW5cIixcImR1b1wiLFwiZHVwXCIsXCJkdXFcIixcImR1clwiLFwiZHVzXCIsXCJkdXVcIixcImR1dlwiLFwiZHV3XCIsXCJkdXhcIixcImR1eVwiLFwiZHV6XCIsXCJkdmFcIixcImR3YVwiLFwiZHdrXCIsXCJkd2xcIixcImR3clwiLFwiZHdzXCIsXCJkd3VcIixcImR3d1wiLFwiZHd5XCIsXCJkd3pcIixcImR5YVwiLFwiZHliXCIsXCJkeWRcIixcImR5Z1wiLFwiZHlpXCIsXCJkeW1cIixcImR5blwiLFwiZHlvXCIsXCJkeXVcIixcImR5eVwiLFwiZHphXCIsXCJkemRcIixcImR6ZVwiLFwiZHpnXCIsXCJkemxcIixcImR6blwiXVxuLFsgXCJlZVwiLFwiZWxcIixcImVuXCIsXCJlb1wiLFwiZXNcIixcImV0XCIsXCJldVwiLFwiZWFhXCIsXCJlYmNcIixcImViZ1wiLFwiZWJrXCIsXCJlYm9cIixcImViclwiLFwiZWJ1XCIsXCJlY3JcIixcImVjc1wiLFwiZWN5XCIsXCJlZWVcIixcImVmYVwiLFwiZWZlXCIsXCJlZmlcIixcImVnYVwiLFwiZWdsXCIsXCJlZ29cIixcImVneFwiLFwiZWd5XCIsXCJlaHNcIixcImVodVwiLFwiZWlwXCIsXCJlaXRcIixcImVpdlwiLFwiZWphXCIsXCJla2FcIixcImVrY1wiLFwiZWtlXCIsXCJla2dcIixcImVraVwiLFwiZWtrXCIsXCJla2xcIixcImVrbVwiLFwiZWtvXCIsXCJla3BcIixcImVrclwiLFwiZWt5XCIsXCJlbGVcIixcImVsaFwiLFwiZWxpXCIsXCJlbGtcIixcImVsbVwiLFwiZWxvXCIsXCJlbHBcIixcImVsdVwiLFwiZWx4XCIsXCJlbWFcIixcImVtYlwiLFwiZW1lXCIsXCJlbWdcIixcImVtaVwiLFwiZW1rXCIsXCJlbW1cIixcImVtblwiLFwiZW1vXCIsXCJlbXBcIixcImVtcVwiLFwiZW1zXCIsXCJlbXVcIixcImVtd1wiLFwiZW14XCIsXCJlbXlcIixcImVtelwiLFwiZW5hXCIsXCJlbmJcIixcImVuY1wiLFwiZW5kXCIsXCJlbmZcIixcImVuaFwiLFwiZW5sXCIsXCJlbm1cIixcImVublwiLFwiZW5vXCIsXCJlbnFcIixcImVuclwiLFwiZW51XCIsXCJlbnZcIixcImVud1wiLFwiZW54XCIsXCJlb3RcIixcImVwaVwiLFwiZXJhXCIsXCJlcmdcIixcImVyaFwiLFwiZXJpXCIsXCJlcmtcIixcImVyb1wiLFwiZXJyXCIsXCJlcnNcIixcImVydFwiLFwiZXJ3XCIsXCJlc2VcIixcImVzZ1wiLFwiZXNoXCIsXCJlc2lcIixcImVza1wiLFwiZXNsXCIsXCJlc21cIixcImVzblwiLFwiZXNvXCIsXCJlc3FcIixcImVzc1wiLFwiZXN1XCIsXCJlc3hcIixcImVzeVwiLFwiZXRiXCIsXCJldGNcIixcImV0aFwiLFwiZXRuXCIsXCJldG9cIixcImV0clwiLFwiZXRzXCIsXCJldHRcIixcImV0dVwiLFwiZXR4XCIsXCJldHpcIixcImV1cVwiLFwiZXZlXCIsXCJldmhcIixcImV2blwiLFwiZXdvXCIsXCJleHRcIixcImV5YVwiLFwiZXlvXCIsXCJlemFcIixcImV6ZVwiXVxuLFsgXCJmYVwiLFwiZmZcIixcImZpXCIsXCJmalwiLFwiZm9cIixcImZyXCIsXCJmeVwiLFwiZmFhXCIsXCJmYWJcIixcImZhZFwiLFwiZmFmXCIsXCJmYWdcIixcImZhaFwiLFwiZmFpXCIsXCJmYWpcIixcImZha1wiLFwiZmFsXCIsXCJmYW1cIixcImZhblwiLFwiZmFwXCIsXCJmYXJcIixcImZhdFwiLFwiZmF1XCIsXCJmYXhcIixcImZheVwiLFwiZmF6XCIsXCJmYmxcIixcImZjc1wiLFwiZmVyXCIsXCJmZmlcIixcImZmbVwiLFwiZmdyXCIsXCJmaWFcIixcImZpZVwiLFwiZmlmXCIsXCJmaWxcIixcImZpcFwiLFwiZmlyXCIsXCJmaXRcIixcImZpdVwiLFwiZml3XCIsXCJma2tcIixcImZrdlwiLFwiZmxhXCIsXCJmbGhcIixcImZsaVwiLFwiZmxsXCIsXCJmbG5cIixcImZsclwiLFwiZmx5XCIsXCJmbXBcIixcImZtdVwiLFwiZm5iXCIsXCJmbmdcIixcImZuaVwiLFwiZm9kXCIsXCJmb2lcIixcImZvbVwiLFwiZm9uXCIsXCJmb3JcIixcImZvc1wiLFwiZm94XCIsXCJmcGVcIixcImZxc1wiLFwiZnJjXCIsXCJmcmRcIixcImZya1wiLFwiZnJtXCIsXCJmcm9cIixcImZycFwiLFwiZnJxXCIsXCJmcnJcIixcImZyc1wiLFwiZnJ0XCIsXCJmc2VcIixcImZzbFwiLFwiZnNzXCIsXCJmdWJcIixcImZ1Y1wiLFwiZnVkXCIsXCJmdWVcIixcImZ1ZlwiLFwiZnVoXCIsXCJmdWlcIixcImZ1alwiLFwiZnVtXCIsXCJmdW5cIixcImZ1cVwiLFwiZnVyXCIsXCJmdXRcIixcImZ1dVwiLFwiZnV2XCIsXCJmdXlcIixcImZ2clwiLFwiZndhXCIsXCJmd2VcIl1cbixbIFwiZ2FcIixcImdkXCIsXCJnbFwiLFwiZ25cIixcImd1XCIsXCJndlwiLFwiZ2FhXCIsXCJnYWJcIixcImdhY1wiLFwiZ2FkXCIsXCJnYWVcIixcImdhZlwiLFwiZ2FnXCIsXCJnYWhcIixcImdhaVwiLFwiZ2FqXCIsXCJnYWtcIixcImdhbFwiLFwiZ2FtXCIsXCJnYW5cIixcImdhb1wiLFwiZ2FwXCIsXCJnYXFcIixcImdhclwiLFwiZ2FzXCIsXCJnYXRcIixcImdhdVwiLFwiZ2F2XCIsXCJnYXdcIixcImdheFwiLFwiZ2F5XCIsXCJnYXpcIixcImdiYVwiLFwiZ2JiXCIsXCJnYmNcIixcImdiZFwiLFwiZ2JlXCIsXCJnYmZcIixcImdiZ1wiLFwiZ2JoXCIsXCJnYmlcIixcImdialwiLFwiZ2JrXCIsXCJnYmxcIixcImdibVwiLFwiZ2JuXCIsXCJnYm9cIixcImdicFwiLFwiZ2JxXCIsXCJnYnJcIixcImdic1wiLFwiZ2J1XCIsXCJnYnZcIixcImdid1wiLFwiZ2J4XCIsXCJnYnlcIixcImdielwiLFwiZ2NjXCIsXCJnY2RcIixcImdjZVwiLFwiZ2NmXCIsXCJnY2xcIixcImdjblwiLFwiZ2NyXCIsXCJnY3RcIixcImdkYVwiLFwiZ2RiXCIsXCJnZGNcIixcImdkZFwiLFwiZ2RlXCIsXCJnZGZcIixcImdkZ1wiLFwiZ2RoXCIsXCJnZGlcIixcImdkalwiLFwiZ2RrXCIsXCJnZGxcIixcImdkbVwiLFwiZ2RuXCIsXCJnZG9cIixcImdkcVwiLFwiZ2RyXCIsXCJnZHNcIixcImdkdFwiLFwiZ2R1XCIsXCJnZHhcIixcImdlYVwiLFwiZ2ViXCIsXCJnZWNcIixcImdlZFwiLFwiZ2VmXCIsXCJnZWdcIixcImdlaFwiLFwiZ2VpXCIsXCJnZWpcIixcImdla1wiLFwiZ2VsXCIsXCJnZW1cIixcImdlcVwiLFwiZ2VzXCIsXCJnZXZcIixcImdld1wiLFwiZ2V4XCIsXCJnZXlcIixcImdlelwiLFwiZ2ZrXCIsXCJnZnRcIixcImdmeFwiLFwiZ2dhXCIsXCJnZ2JcIixcImdnZFwiLFwiZ2dlXCIsXCJnZ2dcIixcImdna1wiLFwiZ2dsXCIsXCJnZ25cIixcImdnb1wiLFwiZ2dyXCIsXCJnZ3RcIixcImdndVwiLFwiZ2d3XCIsXCJnaGFcIixcImdoY1wiLFwiZ2hlXCIsXCJnaGhcIixcImdoa1wiLFwiZ2hsXCIsXCJnaG5cIixcImdob1wiLFwiZ2hyXCIsXCJnaHNcIixcImdodFwiLFwiZ2lhXCIsXCJnaWJcIixcImdpY1wiLFwiZ2lkXCIsXCJnaWVcIixcImdpZ1wiLFwiZ2loXCIsXCJnaWlcIixcImdpbFwiLFwiZ2ltXCIsXCJnaW5cIixcImdpb1wiLFwiZ2lwXCIsXCJnaXFcIixcImdpclwiLFwiZ2lzXCIsXCJnaXRcIixcImdpdVwiLFwiZ2l3XCIsXCJnaXhcIixcImdpeVwiLFwiZ2l6XCIsXCJnamlcIixcImdqa1wiLFwiZ2ptXCIsXCJnam5cIixcImdqclwiLFwiZ2p1XCIsXCJna2FcIixcImdrZFwiLFwiZ2tlXCIsXCJna25cIixcImdrb1wiLFwiZ2twXCIsXCJna3VcIixcImdsYlwiLFwiZ2xjXCIsXCJnbGRcIixcImdsaFwiLFwiZ2xpXCIsXCJnbGpcIixcImdsa1wiLFwiZ2xsXCIsXCJnbG9cIixcImdsclwiLFwiZ2x1XCIsXCJnbHdcIixcImdseVwiLFwiZ21hXCIsXCJnbWJcIixcImdtZFwiLFwiZ21lXCIsXCJnbWdcIixcImdtaFwiLFwiZ21sXCIsXCJnbW1cIixcImdtblwiLFwiZ21xXCIsXCJnbXJcIixcImdtdVwiLFwiZ212XCIsXCJnbXdcIixcImdteFwiLFwiZ215XCIsXCJnbXpcIixcImduYVwiLFwiZ25iXCIsXCJnbmNcIixcImduZFwiLFwiZ25lXCIsXCJnbmdcIixcImduaFwiLFwiZ25pXCIsXCJnbmpcIixcImdua1wiLFwiZ25sXCIsXCJnbm1cIixcImdublwiLFwiZ25vXCIsXCJnbnFcIixcImduclwiLFwiZ250XCIsXCJnbnVcIixcImdud1wiLFwiZ256XCIsXCJnb2FcIixcImdvYlwiLFwiZ29jXCIsXCJnb2RcIixcImdvZVwiLFwiZ29mXCIsXCJnb2dcIixcImdvaFwiLFwiZ29pXCIsXCJnb2pcIixcImdva1wiLFwiZ29sXCIsXCJnb21cIixcImdvblwiLFwiZ29vXCIsXCJnb3BcIixcImdvcVwiLFwiZ29yXCIsXCJnb3NcIixcImdvdFwiLFwiZ291XCIsXCJnb3dcIixcImdveFwiLFwiZ295XCIsXCJnb3pcIixcImdwYVwiLFwiZ3BlXCIsXCJncG5cIixcImdxYVwiLFwiZ3FpXCIsXCJncW5cIixcImdxclwiLFwiZ3F1XCIsXCJncmFcIixcImdyYlwiLFwiZ3JjXCIsXCJncmRcIixcImdyZ1wiLFwiZ3JoXCIsXCJncmlcIixcImdyalwiLFwiZ3JrXCIsXCJncm1cIixcImdyb1wiLFwiZ3JxXCIsXCJncnJcIixcImdyc1wiLFwiZ3J0XCIsXCJncnVcIixcImdydlwiLFwiZ3J3XCIsXCJncnhcIixcImdyeVwiLFwiZ3J6XCIsXCJnc2VcIixcImdzZ1wiLFwiZ3NsXCIsXCJnc21cIixcImdzblwiLFwiZ3NvXCIsXCJnc3BcIixcImdzc1wiLFwiZ3N3XCIsXCJndGFcIixcImd0aVwiLFwiZ3R1XCIsXCJndWFcIixcImd1YlwiLFwiZ3VjXCIsXCJndWRcIixcImd1ZVwiLFwiZ3VmXCIsXCJndWdcIixcImd1aFwiLFwiZ3VpXCIsXCJndWtcIixcImd1bFwiLFwiZ3VtXCIsXCJndW5cIixcImd1b1wiLFwiZ3VwXCIsXCJndXFcIixcImd1clwiLFwiZ3VzXCIsXCJndXRcIixcImd1dVwiLFwiZ3V2XCIsXCJndXdcIixcImd1eFwiLFwiZ3V6XCIsXCJndmFcIixcImd2Y1wiLFwiZ3ZlXCIsXCJndmZcIixcImd2alwiLFwiZ3ZsXCIsXCJndm1cIixcImd2blwiLFwiZ3ZvXCIsXCJndnBcIixcImd2clwiLFwiZ3ZzXCIsXCJndnlcIixcImd3YVwiLFwiZ3diXCIsXCJnd2NcIixcImd3ZFwiLFwiZ3dlXCIsXCJnd2ZcIixcImd3Z1wiLFwiZ3dpXCIsXCJnd2pcIixcImd3bVwiLFwiZ3duXCIsXCJnd3JcIixcImd3dFwiLFwiZ3d1XCIsXCJnd3dcIixcImd3eFwiLFwiZ3h4XCIsXCJneWFcIixcImd5YlwiLFwiZ3lkXCIsXCJneWVcIixcImd5ZlwiLFwiZ3lnXCIsXCJneWlcIixcImd5bFwiLFwiZ3ltXCIsXCJneW5cIixcImd5b1wiLFwiZ3lyXCIsXCJneXlcIixcImd5elwiLFwiZ3phXCIsXCJnemlcIixcImd6blwiXVxuLFsgXCJoYVwiLFwiaGVcIixcImhpXCIsXCJob1wiLFwiaHJcIixcImh0XCIsXCJodVwiLFwiaHlcIixcImh6XCIsXCJoYWFcIixcImhhYlwiLFwiaGFjXCIsXCJoYWRcIixcImhhZVwiLFwiaGFmXCIsXCJoYWdcIixcImhhaFwiLFwiaGFpXCIsXCJoYWpcIixcImhha1wiLFwiaGFsXCIsXCJoYW1cIixcImhhblwiLFwiaGFvXCIsXCJoYXBcIixcImhhcVwiLFwiaGFyXCIsXCJoYXNcIixcImhhdlwiLFwiaGF3XCIsXCJoYXhcIixcImhheVwiLFwiaGF6XCIsXCJoYmFcIixcImhiYlwiLFwiaGJuXCIsXCJoYm9cIixcImhidVwiLFwiaGNhXCIsXCJoY2hcIixcImhkblwiLFwiaGRzXCIsXCJoZHlcIixcImhlYVwiLFwiaGVkXCIsXCJoZWdcIixcImhlaFwiLFwiaGVpXCIsXCJoZW1cIixcImhnbVwiLFwiaGd3XCIsXCJoaGlcIixcImhoclwiLFwiaGh5XCIsXCJoaWFcIixcImhpYlwiLFwiaGlkXCIsXCJoaWZcIixcImhpZ1wiLFwiaGloXCIsXCJoaWlcIixcImhpalwiLFwiaGlrXCIsXCJoaWxcIixcImhpbVwiLFwiaGlvXCIsXCJoaXJcIixcImhpdFwiLFwiaGl3XCIsXCJoaXhcIixcImhqaVwiLFwiaGthXCIsXCJoa2VcIixcImhraFwiLFwiaGtrXCIsXCJoa25cIixcImhrc1wiLFwiaGxhXCIsXCJobGJcIixcImhsZFwiLFwiaGxlXCIsXCJobHRcIixcImhsdVwiLFwiaG1hXCIsXCJobWJcIixcImhtY1wiLFwiaG1kXCIsXCJobWVcIixcImhtZlwiLFwiaG1nXCIsXCJobWhcIixcImhtaVwiLFwiaG1qXCIsXCJobWtcIixcImhtbFwiLFwiaG1tXCIsXCJobW5cIixcImhtcFwiLFwiaG1xXCIsXCJobXJcIixcImhtc1wiLFwiaG10XCIsXCJobXVcIixcImhtdlwiLFwiaG13XCIsXCJobXhcIixcImhteVwiLFwiaG16XCIsXCJobmFcIixcImhuZFwiLFwiaG5lXCIsXCJobmdcIixcImhuaFwiLFwiaG5pXCIsXCJobmpcIixcImhublwiLFwiaG5vXCIsXCJobnNcIixcImhudVwiLFwiaG9hXCIsXCJob2JcIixcImhvY1wiLFwiaG9kXCIsXCJob2VcIixcImhvaFwiLFwiaG9pXCIsXCJob2pcIixcImhva1wiLFwiaG9sXCIsXCJob21cIixcImhvb1wiLFwiaG9wXCIsXCJob3JcIixcImhvc1wiLFwiaG90XCIsXCJob3ZcIixcImhvd1wiLFwiaG95XCIsXCJob3pcIixcImhwb1wiLFwiaHBzXCIsXCJocmFcIixcImhyY1wiLFwiaHJlXCIsXCJocmtcIixcImhybVwiLFwiaHJvXCIsXCJocnBcIixcImhyclwiLFwiaHJ0XCIsXCJocnVcIixcImhyd1wiLFwiaHJ4XCIsXCJocnpcIixcImhzYlwiLFwiaHNoXCIsXCJoc2xcIixcImhzblwiLFwiaHNzXCIsXCJodGlcIixcImh0b1wiLFwiaHRzXCIsXCJodHVcIixcImh0eFwiLFwiaHViXCIsXCJodWNcIixcImh1ZFwiLFwiaHVlXCIsXCJodWZcIixcImh1Z1wiLFwiaHVoXCIsXCJodWlcIixcImh1alwiLFwiaHVrXCIsXCJodWxcIixcImh1bVwiLFwiaHVvXCIsXCJodXBcIixcImh1cVwiLFwiaHVyXCIsXCJodXNcIixcImh1dFwiLFwiaHV1XCIsXCJodXZcIixcImh1d1wiLFwiaHV4XCIsXCJodXlcIixcImh1elwiLFwiaHZjXCIsXCJodmVcIixcImh2a1wiLFwiaHZuXCIsXCJodnZcIixcImh3YVwiLFwiaHdjXCIsXCJod29cIixcImh5YVwiLFwiaHl3XCIsXCJoeXhcIl1cbixbIFwiaWFcIixcImlkXCIsXCJpZVwiLFwiaWdcIixcImlpXCIsXCJpa1wiLFwiaW5cIixcImlvXCIsXCJpc1wiLFwiaXRcIixcIml1XCIsXCJpd1wiLFwiaWFpXCIsXCJpYW5cIixcImlhcFwiLFwiaWFyXCIsXCJpYmFcIixcImliYlwiLFwiaWJkXCIsXCJpYmVcIixcImliZ1wiLFwiaWJoXCIsXCJpYmlcIixcImlibFwiLFwiaWJtXCIsXCJpYm5cIixcImliclwiLFwiaWJ1XCIsXCJpYnlcIixcImljYVwiLFwiaWNoXCIsXCJpY2xcIixcImljclwiLFwiaWRhXCIsXCJpZGJcIixcImlkY1wiLFwiaWRkXCIsXCJpZGVcIixcImlkaVwiLFwiaWRyXCIsXCJpZHNcIixcImlkdFwiLFwiaWR1XCIsXCJpZmFcIixcImlmYlwiLFwiaWZlXCIsXCJpZmZcIixcImlma1wiLFwiaWZtXCIsXCJpZnVcIixcImlmeVwiLFwiaWdiXCIsXCJpZ2VcIixcImlnZ1wiLFwiaWdsXCIsXCJpZ21cIixcImlnblwiLFwiaWdvXCIsXCJpZ3NcIixcImlnd1wiLFwiaWhiXCIsXCJpaGlcIixcImlocFwiLFwiaWh3XCIsXCJpaW5cIixcImlpclwiLFwiaWpjXCIsXCJpamVcIixcImlqalwiLFwiaWpuXCIsXCJpam9cIixcImlqc1wiLFwiaWtlXCIsXCJpa2lcIixcImlra1wiLFwiaWtsXCIsXCJpa29cIixcImlrcFwiLFwiaWtyXCIsXCJpa3NcIixcImlrdFwiLFwiaWt2XCIsXCJpa3dcIixcImlreFwiLFwiaWt6XCIsXCJpbGFcIixcImlsYlwiLFwiaWxnXCIsXCJpbGlcIixcImlsa1wiLFwiaWxsXCIsXCJpbG1cIixcImlsb1wiLFwiaWxwXCIsXCJpbHNcIixcImlsdVwiLFwiaWx2XCIsXCJpbHdcIixcImltYVwiLFwiaW1lXCIsXCJpbWlcIixcImltbFwiLFwiaW1uXCIsXCJpbW9cIixcImltclwiLFwiaW1zXCIsXCJpbXlcIixcImluYlwiLFwiaW5jXCIsXCJpbmVcIixcImluZ1wiLFwiaW5oXCIsXCJpbmpcIixcImlubFwiLFwiaW5tXCIsXCJpbm5cIixcImlub1wiLFwiaW5wXCIsXCJpbnNcIixcImludFwiLFwiaW56XCIsXCJpb3JcIixcImlvdVwiLFwiaW93XCIsXCJpcGlcIixcImlwb1wiLFwiaXF1XCIsXCJpcXdcIixcImlyYVwiLFwiaXJlXCIsXCJpcmhcIixcImlyaVwiLFwiaXJrXCIsXCJpcm5cIixcImlyb1wiLFwiaXJyXCIsXCJpcnVcIixcImlyeFwiLFwiaXJ5XCIsXCJpc2FcIixcImlzY1wiLFwiaXNkXCIsXCJpc2VcIixcImlzZ1wiLFwiaXNoXCIsXCJpc2lcIixcImlza1wiLFwiaXNtXCIsXCJpc25cIixcImlzb1wiLFwiaXNyXCIsXCJpc3RcIixcImlzdVwiLFwiaXRiXCIsXCJpdGNcIixcIml0ZFwiLFwiaXRlXCIsXCJpdGlcIixcIml0a1wiLFwiaXRsXCIsXCJpdG1cIixcIml0b1wiLFwiaXRyXCIsXCJpdHNcIixcIml0dFwiLFwiaXR2XCIsXCJpdHdcIixcIml0eFwiLFwiaXR5XCIsXCJpdHpcIixcIml1bVwiLFwiaXZiXCIsXCJpdnZcIixcIml3a1wiLFwiaXdtXCIsXCJpd29cIixcIml3c1wiLFwiaXhjXCIsXCJpeGxcIixcIml5YVwiLFwiaXlvXCIsXCJpeXhcIixcIml6aFwiLFwiaXppXCIsXCJpenJcIixcIml6elwiXVxuLFsgXCJqYVwiLFwiamlcIixcImp2XCIsXCJqd1wiLFwiamFhXCIsXCJqYWJcIixcImphY1wiLFwiamFkXCIsXCJqYWVcIixcImphZlwiLFwiamFoXCIsXCJqYWpcIixcImpha1wiLFwiamFsXCIsXCJqYW1cIixcImphblwiLFwiamFvXCIsXCJqYXFcIixcImphclwiLFwiamFzXCIsXCJqYXRcIixcImphdVwiLFwiamF4XCIsXCJqYXlcIixcImphelwiLFwiamJlXCIsXCJqYmlcIixcImpialwiLFwiamJrXCIsXCJqYm1cIixcImpiblwiLFwiamJvXCIsXCJqYnJcIixcImpidFwiLFwiamJ1XCIsXCJqYndcIixcImpjc1wiLFwiamN0XCIsXCJqZGFcIixcImpkZ1wiLFwiamR0XCIsXCJqZWJcIixcImplZVwiLFwiamVnXCIsXCJqZWhcIixcImplaVwiLFwiamVrXCIsXCJqZWxcIixcImplblwiLFwiamVyXCIsXCJqZXRcIixcImpldVwiLFwiamdiXCIsXCJqZ2VcIixcImpna1wiLFwiamdvXCIsXCJqaGlcIixcImpoc1wiLFwiamlhXCIsXCJqaWJcIixcImppY1wiLFwiamlkXCIsXCJqaWVcIixcImppZ1wiLFwiamloXCIsXCJqaWlcIixcImppbFwiLFwiamltXCIsXCJqaW9cIixcImppcVwiLFwiaml0XCIsXCJqaXVcIixcImppdlwiLFwiaml5XCIsXCJqamVcIixcImpqclwiLFwiamthXCIsXCJqa21cIixcImprb1wiLFwiamtwXCIsXCJqa3JcIixcImprc1wiLFwiamt1XCIsXCJqbGVcIixcImpsc1wiLFwiam1hXCIsXCJqbWJcIixcImptY1wiLFwiam1kXCIsXCJqbWlcIixcImptbFwiLFwiam1uXCIsXCJqbXJcIixcImptc1wiLFwiam13XCIsXCJqbXhcIixcImpuYVwiLFwiam5kXCIsXCJqbmdcIixcImpuaVwiLFwiam5qXCIsXCJqbmxcIixcImpuc1wiLFwiam9iXCIsXCJqb2RcIixcImpvZ1wiLFwiam9yXCIsXCJqb3NcIixcImpvd1wiLFwianBhXCIsXCJqcHJcIixcImpweFwiLFwianFyXCIsXCJqcmFcIixcImpyYlwiLFwianJyXCIsXCJqcnRcIixcImpydVwiLFwianNsXCIsXCJqdWFcIixcImp1YlwiLFwianVjXCIsXCJqdWRcIixcImp1aFwiLFwianVpXCIsXCJqdWtcIixcImp1bFwiLFwianVtXCIsXCJqdW5cIixcImp1b1wiLFwianVwXCIsXCJqdXJcIixcImp1c1wiLFwianV0XCIsXCJqdXVcIixcImp1d1wiLFwianV5XCIsXCJqdmRcIixcImp2blwiLFwiandpXCIsXCJqeWFcIixcImp5ZVwiLFwianl5XCJdXG4sWyBcImthXCIsXCJrZ1wiLFwia2lcIixcImtqXCIsXCJra1wiLFwia2xcIixcImttXCIsXCJrblwiLFwia29cIixcImtyXCIsXCJrc1wiLFwia3VcIixcImt2XCIsXCJrd1wiLFwia3lcIixcImthYVwiLFwia2FiXCIsXCJrYWNcIixcImthZFwiLFwia2FlXCIsXCJrYWZcIixcImthZ1wiLFwia2FoXCIsXCJrYWlcIixcImthalwiLFwia2FrXCIsXCJrYW1cIixcImthb1wiLFwia2FwXCIsXCJrYXFcIixcImthclwiLFwia2F2XCIsXCJrYXdcIixcImtheFwiLFwia2F5XCIsXCJrYmFcIixcImtiYlwiLFwia2JjXCIsXCJrYmRcIixcImtiZVwiLFwia2JmXCIsXCJrYmdcIixcImtiaFwiLFwia2JpXCIsXCJrYmpcIixcImtia1wiLFwia2JsXCIsXCJrYm1cIixcImtiblwiLFwia2JvXCIsXCJrYnBcIixcImticVwiLFwia2JyXCIsXCJrYnNcIixcImtidFwiLFwia2J1XCIsXCJrYnZcIixcImtid1wiLFwia2J4XCIsXCJrYnlcIixcImtielwiLFwia2NhXCIsXCJrY2JcIixcImtjY1wiLFwia2NkXCIsXCJrY2VcIixcImtjZlwiLFwia2NnXCIsXCJrY2hcIixcImtjaVwiLFwia2NqXCIsXCJrY2tcIixcImtjbFwiLFwia2NtXCIsXCJrY25cIixcImtjb1wiLFwia2NwXCIsXCJrY3FcIixcImtjclwiLFwia2NzXCIsXCJrY3RcIixcImtjdVwiLFwia2N2XCIsXCJrY3dcIixcImtjeFwiLFwia2N5XCIsXCJrY3pcIixcImtkYVwiLFwia2RjXCIsXCJrZGRcIixcImtkZVwiLFwia2RmXCIsXCJrZGdcIixcImtkaFwiLFwia2RpXCIsXCJrZGpcIixcImtka1wiLFwia2RsXCIsXCJrZG1cIixcImtkblwiLFwia2RvXCIsXCJrZHBcIixcImtkcVwiLFwia2RyXCIsXCJrZHRcIixcImtkdVwiLFwia2R2XCIsXCJrZHdcIixcImtkeFwiLFwia2R5XCIsXCJrZHpcIixcImtlYVwiLFwia2ViXCIsXCJrZWNcIixcImtlZFwiLFwia2VlXCIsXCJrZWZcIixcImtlZ1wiLFwia2VoXCIsXCJrZWlcIixcImtlalwiLFwia2VrXCIsXCJrZWxcIixcImtlbVwiLFwia2VuXCIsXCJrZW9cIixcImtlcFwiLFwia2VxXCIsXCJrZXJcIixcImtlc1wiLFwia2V0XCIsXCJrZXVcIixcImtldlwiLFwia2V3XCIsXCJrZXhcIixcImtleVwiLFwia2V6XCIsXCJrZmFcIixcImtmYlwiLFwia2ZjXCIsXCJrZmRcIixcImtmZVwiLFwia2ZmXCIsXCJrZmdcIixcImtmaFwiLFwia2ZpXCIsXCJrZmpcIixcImtma1wiLFwia2ZsXCIsXCJrZm1cIixcImtmblwiLFwia2ZvXCIsXCJrZnBcIixcImtmcVwiLFwia2ZyXCIsXCJrZnNcIixcImtmdFwiLFwia2Z1XCIsXCJrZnZcIixcImtmd1wiLFwia2Z4XCIsXCJrZnlcIixcImtmelwiLFwia2dhXCIsXCJrZ2JcIixcImtnY1wiLFwia2dkXCIsXCJrZ2VcIixcImtnZlwiLFwia2dnXCIsXCJrZ2hcIixcImtnaVwiLFwia2dqXCIsXCJrZ2tcIixcImtnbFwiLFwia2dtXCIsXCJrZ25cIixcImtnb1wiLFwia2dwXCIsXCJrZ3FcIixcImtnclwiLFwia2dzXCIsXCJrZ3RcIixcImtndVwiLFwia2d2XCIsXCJrZ3dcIixcImtneFwiLFwia2d5XCIsXCJraGFcIixcImx5Z1wiLFwia2hiXCIsXCJraGNcIixcImtoZFwiLFwia2hlXCIsXCJraGZcIixcImtoZ1wiLFwia2hoXCIsXCJraGlcIixcImtoalwiLFwia2hrXCIsXCJraGxcIixcImtoblwiLFwia2hvXCIsXCJraHBcIixcImtocVwiLFwia2hyXCIsXCJraHNcIixcImtodFwiLFwia2h1XCIsXCJraHZcIixcImtod1wiLFwia2h4XCIsXCJraHlcIixcImtoelwiLFwia2lhXCIsXCJraWJcIixcImtpY1wiLFwia2lkXCIsXCJraWVcIixcImtpZlwiLFwia2lnXCIsXCJraWhcIixcImtpaVwiLFwia2lqXCIsXCJraWxcIixcImtpbVwiLFwia2lvXCIsXCJraXBcIixcImtpcVwiLFwia2lzXCIsXCJraXRcIixcImtpdVwiLFwia2l2XCIsXCJraXdcIixcImtpeFwiLFwia2l5XCIsXCJraXpcIixcImtqYVwiLFwia2piXCIsXCJramNcIixcImtqZFwiLFwia2plXCIsXCJramZcIixcImtqZ1wiLFwia2poXCIsXCJramlcIixcImtqalwiLFwia2prXCIsXCJramxcIixcImtqbVwiLFwia2puXCIsXCJram9cIixcImtqcFwiLFwia2pxXCIsXCJranJcIixcImtqc1wiLFwia2p0XCIsXCJranVcIixcImtqdlwiLFwia2p4XCIsXCJranlcIixcImtqelwiLFwia2thXCIsXCJra2JcIixcImtrY1wiLFwia2tkXCIsXCJra2VcIixcImtrZlwiLFwia2tnXCIsXCJra2hcIixcImtraVwiLFwia2tqXCIsXCJra2tcIixcImtrbFwiLFwia2ttXCIsXCJra25cIixcImtrb1wiLFwia2twXCIsXCJra3FcIixcImtrclwiLFwia2tzXCIsXCJra3RcIixcImtrdVwiLFwia2t2XCIsXCJra3dcIixcImtreFwiLFwia2t5XCIsXCJra3pcIixcImtsYVwiLFwia2xiXCIsXCJrbGNcIixcImtsZFwiLFwia2xlXCIsXCJrbGZcIixcImtsZ1wiLFwia2xoXCIsXCJrbGlcIixcImtsalwiLFwia2xrXCIsXCJrbGxcIixcImtsbVwiLFwia2xuXCIsXCJrbG9cIixcImtscFwiLFwia2xxXCIsXCJrbHJcIixcImtsc1wiLFwia2x0XCIsXCJrbHVcIixcImtsdlwiLFwia2x3XCIsXCJrbHhcIixcImtseVwiLFwia2x6XCIsXCJrbWFcIixcImttYlwiLFwia21jXCIsXCJrbWRcIixcImttZVwiLFwia21mXCIsXCJrbWdcIixcImttaFwiLFwia21pXCIsXCJrbWpcIixcImtta1wiLFwia21sXCIsXCJrbW1cIixcImttblwiLFwia21vXCIsXCJrbXBcIixcImttcVwiLFwia21yXCIsXCJrbXNcIixcImttdFwiLFwia211XCIsXCJrbXZcIixcImttd1wiLFwia214XCIsXCJrbXlcIixcImttelwiLFwia25hXCIsXCJrbmJcIixcImtuY1wiLFwia25kXCIsXCJrbmVcIixcImtuZlwiLFwia25nXCIsXCJrbmlcIixcImtualwiLFwia25rXCIsXCJrbmxcIixcImtubVwiLFwia25uXCIsXCJrbm9cIixcImtucFwiLFwia25xXCIsXCJrbnJcIixcImtuc1wiLFwia250XCIsXCJrbnVcIixcImtudlwiLFwia253XCIsXCJrbnhcIixcImtueVwiLFwia256XCIsXCJrb2FcIixcImtvY1wiLFwia29kXCIsXCJrb2VcIixcImtvZlwiLFwia29nXCIsXCJrb2hcIixcImtvaVwiLFwia29qXCIsXCJrb2tcIixcImtvbFwiLFwia29vXCIsXCJrb3BcIixcImtvcVwiLFwia29zXCIsXCJrb3RcIixcImtvdVwiLFwia292XCIsXCJrb3dcIixcImtveFwiLFwia295XCIsXCJrb3pcIixcImtwYVwiLFwia3BiXCIsXCJrcGNcIixcImtwZFwiLFwia3BlXCIsXCJrcGZcIixcImtwZ1wiLFwia3BoXCIsXCJrcGlcIixcImtwalwiLFwia3BrXCIsXCJrcGxcIixcImtwbVwiLFwia3BuXCIsXCJrcG9cIixcImtwcFwiLFwia3BxXCIsXCJrcHJcIixcImtwc1wiLFwia3B0XCIsXCJrcHVcIixcImtwdlwiLFwia3B3XCIsXCJrcHhcIixcImtweVwiLFwia3B6XCIsXCJrcWFcIixcImtxYlwiLFwia3FjXCIsXCJrcWRcIixcImtxZVwiLFwia3FmXCIsXCJrcWdcIixcImtxaFwiLFwia3FpXCIsXCJrcWpcIixcImtxa1wiLFwia3FsXCIsXCJrcW1cIixcImtxblwiLFwia3FvXCIsXCJrcXBcIixcImtxcVwiLFwia3FyXCIsXCJrcXNcIixcImtxdFwiLFwia3F1XCIsXCJrcXZcIixcImtxd1wiLFwia3F4XCIsXCJrcXlcIixcImtxelwiLFwia3JhXCIsXCJrcmJcIixcImtyY1wiLFwia3JkXCIsXCJrcmVcIixcImtyZlwiLFwia3JoXCIsXCJrcmlcIixcImtyalwiLFwia3JrXCIsXCJrcmxcIixcImtybVwiLFwia3JuXCIsXCJrcm9cIixcImtycFwiLFwia3JyXCIsXCJrcnNcIixcImtydFwiLFwia3J1XCIsXCJrcnZcIixcImtyd1wiLFwia3J4XCIsXCJrcnlcIixcImtyelwiLFwia3NhXCIsXCJrc2JcIixcImtzY1wiLFwia3NkXCIsXCJrc2VcIixcImtzZlwiLFwia3NnXCIsXCJrc2hcIixcImtzaVwiLFwia3NqXCIsXCJrc2tcIixcImtzbFwiLFwia3NtXCIsXCJrc25cIixcImtzb1wiLFwia3NwXCIsXCJrc3FcIixcImtzclwiLFwia3NzXCIsXCJrc3RcIixcImtzdVwiLFwia3N2XCIsXCJrc3dcIixcImtzeFwiLFwia3N5XCIsXCJrc3pcIixcImt0YVwiLFwia3RiXCIsXCJrdGNcIixcImt0ZFwiLFwia3RlXCIsXCJrdGZcIixcImt0Z1wiLFwia3RoXCIsXCJrdGlcIixcImt0alwiLFwia3RrXCIsXCJrdGxcIixcImt0bVwiLFwia3RuXCIsXCJrdG9cIixcImt0cFwiLFwia3RxXCIsXCJrdHJcIixcImt0c1wiLFwia3R0XCIsXCJrdHVcIixcImt0dlwiLFwia3R3XCIsXCJrdHhcIixcImt0eVwiLFwia3R6XCIsXCJrdWJcIixcImt1Y1wiLFwia3VkXCIsXCJrdWVcIixcImt1ZlwiLFwia3VnXCIsXCJrdWhcIixcImt1aVwiLFwia3VqXCIsXCJrdWtcIixcImt1bFwiLFwia3VtXCIsXCJrdW5cIixcImt1b1wiLFwia3VwXCIsXCJrdXFcIixcImt1c1wiLFwia3V0XCIsXCJrdXVcIixcImt1dlwiLFwia3V3XCIsXCJrdXhcIixcImt1eVwiLFwia3V6XCIsXCJrdmFcIixcImt2YlwiLFwia3ZjXCIsXCJrdmRcIixcImt2ZVwiLFwia3ZmXCIsXCJrdmdcIixcImt2aFwiLFwia3ZpXCIsXCJrdmpcIixcImt2a1wiLFwia3ZsXCIsXCJrdm1cIixcImt2blwiLFwia3ZvXCIsXCJrdnBcIixcImt2cVwiLFwia3ZyXCIsXCJrdnNcIixcImt2dFwiLFwia3Z1XCIsXCJrdnZcIixcImt2d1wiLFwia3Z4XCIsXCJrdnlcIixcImt2elwiLFwia3dhXCIsXCJrd2JcIixcImt3Y1wiLFwia3dkXCIsXCJrd2VcIixcImt3ZlwiLFwia3dnXCIsXCJrd2hcIixcImt3aVwiLFwia3dqXCIsXCJrd2tcIixcImt3bFwiLFwia3dtXCIsXCJrd25cIixcImt3b1wiLFwia3dwXCIsXCJrd3FcIixcImt3clwiLFwia3dzXCIsXCJrd3RcIixcImt3dVwiLFwia3d2XCIsXCJrd3dcIixcImt3eFwiLFwia3d5XCIsXCJrd3pcIixcImt4YVwiLFwia3hiXCIsXCJreGNcIixcImt4ZFwiLFwia3hlXCIsXCJreGZcIixcImt4aFwiLFwia3hpXCIsXCJreGpcIixcImt4a1wiLFwia3hsXCIsXCJreG1cIixcImt4blwiLFwia3hvXCIsXCJreHBcIixcImt4cVwiLFwia3hyXCIsXCJreHNcIixcImt4dFwiLFwia3h1XCIsXCJreHZcIixcImt4d1wiLFwia3h4XCIsXCJreHlcIixcImt4elwiLFwia3lhXCIsXCJreWJcIixcImt5Y1wiLFwia3lkXCIsXCJreWVcIixcImt5ZlwiLFwia3lnXCIsXCJreWhcIixcImt5aVwiLFwia3lqXCIsXCJreWtcIixcImt5bFwiLFwia3ltXCIsXCJreW5cIixcImt5b1wiLFwia3lwXCIsXCJreXFcIixcImt5clwiLFwia3lzXCIsXCJreXRcIixcImt5dVwiLFwia3l2XCIsXCJreXdcIixcImt5eFwiLFwia3l5XCIsXCJreXpcIixcImt6YVwiLFwia3piXCIsXCJremNcIixcImt6ZFwiLFwia3plXCIsXCJremZcIixcImt6Z1wiLFwia3poXCIsXCJremlcIixcImt6alwiLFwia3prXCIsXCJremxcIixcImt6bVwiLFwia3puXCIsXCJrem9cIixcImt6cFwiLFwia3pxXCIsXCJrenJcIixcImt6c1wiLFwia3p0XCIsXCJrenVcIixcImt6dlwiLFwia3p3XCIsXCJrenhcIixcImt6eVwiLFwia3p6XCJdXG4sWyBcImxhXCIsXCJsYlwiLFwibGdcIixcImxpXCIsXCJsblwiLFwibG9cIixcImx0XCIsXCJsdVwiLFwibHZcIixcImxhYVwiLFwibGFiXCIsXCJsYWNcIixcImxhZFwiLFwibGFlXCIsXCJsYWZcIixcImxhZ1wiLFwibGFoXCIsXCJsYWlcIixcImxhalwiLFwibGFrXCIsXCJsYWxcIixcImxhbVwiLFwibGFuXCIsXCJsYXBcIixcImxhcVwiLFwibGFyXCIsXCJsYXNcIixcImxhdVwiLFwibGF3XCIsXCJsYXhcIixcImxheVwiLFwibGF6XCIsXCJsYmFcIixcImxiYlwiLFwibGJjXCIsXCJsYmVcIixcImxiZlwiLFwibGJnXCIsXCJsYmlcIixcImxialwiLFwibGJrXCIsXCJsYmxcIixcImxibVwiLFwibGJuXCIsXCJsYm9cIixcImxicVwiLFwibGJyXCIsXCJsYnNcIixcImxidFwiLFwibGJ1XCIsXCJsYnZcIixcImxid1wiLFwibGJ4XCIsXCJsYnlcIixcImxielwiLFwibGNjXCIsXCJsY2RcIixcImxjZVwiLFwibGNmXCIsXCJsY2hcIixcImxjbFwiLFwibGNtXCIsXCJsY3BcIixcImxjcVwiLFwibGNzXCIsXCJsZGFcIixcImxkYlwiLFwibGRkXCIsXCJsZGdcIixcImxkaFwiLFwibGRpXCIsXCJsZGpcIixcImxka1wiLFwibGRsXCIsXCJsZG1cIixcImxkblwiLFwibGRvXCIsXCJsZHBcIixcImxkcVwiLFwibGVhXCIsXCJsZWJcIixcImxlY1wiLFwibGVkXCIsXCJsZWVcIixcImxlZlwiLFwibGVnXCIsXCJsZWhcIixcImxlaVwiLFwibGVqXCIsXCJsZWtcIixcImxlbFwiLFwibGVtXCIsXCJsZW5cIixcImxlb1wiLFwibGVwXCIsXCJsZXFcIixcImxlclwiLFwibGVzXCIsXCJsZXRcIixcImxldVwiLFwibGV2XCIsXCJsZXdcIixcImxleFwiLFwibGV5XCIsXCJsZXpcIixcImxmYVwiLFwibGZuXCIsXCJsZ2FcIixcImxnYlwiLFwibGdnXCIsXCJsZ2hcIixcImxnaVwiLFwibGdrXCIsXCJsZ2xcIixcImxnbVwiLFwibGduXCIsXCJsZ3FcIixcImxnclwiLFwibGd0XCIsXCJsZ3VcIixcImxnelwiLFwibGhhXCIsXCJsaGhcIixcImxoaVwiLFwibGhsXCIsXCJsaG1cIixcImxoblwiLFwibGhwXCIsXCJsaHNcIixcImxodFwiLFwibGh1XCIsXCJsaWFcIixcImxpYlwiLFwibGljXCIsXCJsaWRcIixcImxpZVwiLFwibGlmXCIsXCJsaWdcIixcImxpaFwiLFwibGlpXCIsXCJsaWpcIixcImxpa1wiLFwibGlsXCIsXCJsaW9cIixcImxpcFwiLFwibGlxXCIsXCJsaXJcIixcImxpc1wiLFwibGl1XCIsXCJsaXZcIixcImxpd1wiLFwibGl4XCIsXCJsaXlcIixcImxpelwiLFwibGphXCIsXCJsamVcIixcImxqaVwiLFwibGpsXCIsXCJsanBcIixcImxqd1wiLFwibGp4XCIsXCJsa2FcIixcImxrYlwiLFwibGtjXCIsXCJsa2RcIixcImxrZVwiLFwibGtoXCIsXCJsa2lcIixcImxralwiLFwibGtsXCIsXCJsa21cIixcImxrblwiLFwibGtvXCIsXCJsa3JcIixcImxrc1wiLFwibGt0XCIsXCJsa3VcIixcImxreVwiLFwibGxhXCIsXCJsbGJcIixcImxsY1wiLFwibGxkXCIsXCJsbGVcIixcImxsZlwiLFwibGxnXCIsXCJsbGhcIixcImxsaVwiLFwibGxqXCIsXCJsbGtcIixcImxsbFwiLFwibGxtXCIsXCJsbG5cIixcImxsb1wiLFwibGxwXCIsXCJsbHFcIixcImxsc1wiLFwibGx1XCIsXCJsbHhcIixcImxtYVwiLFwibG1iXCIsXCJsbWNcIixcImxtZFwiLFwibG1lXCIsXCJsbWZcIixcImxtZ1wiLFwibG1oXCIsXCJsbWlcIixcImxtalwiLFwibG1rXCIsXCJsbWxcIixcImxtbVwiLFwibG1uXCIsXCJsbW9cIixcImxtcFwiLFwibG1xXCIsXCJsbXJcIixcImxtdVwiLFwibG12XCIsXCJsbXdcIixcImxteFwiLFwibG15XCIsXCJsbXpcIixcImxuYVwiLFwibG5iXCIsXCJsbmRcIixcImxuZ1wiLFwibG5oXCIsXCJsbmlcIixcImxualwiLFwibG5sXCIsXCJsbm1cIixcImxublwiLFwibG5vXCIsXCJsbnNcIixcImxudVwiLFwibG53XCIsXCJsbnpcIixcImxvYVwiLFwibG9iXCIsXCJsb2NcIixcImxvZVwiLFwibG9mXCIsXCJsb2dcIixcImxvaFwiLFwibG9pXCIsXCJsb2pcIixcImxva1wiLFwibG9sXCIsXCJsb21cIixcImxvblwiLFwibG9vXCIsXCJsb3BcIixcImxvcVwiLFwibG9yXCIsXCJsb3NcIixcImxvdFwiLFwibG91XCIsXCJsb3ZcIixcImxvd1wiLFwibG94XCIsXCJsb3lcIixcImxvelwiLFwibHBhXCIsXCJscGVcIixcImxwblwiLFwibHBvXCIsXCJscHhcIixcImxyYVwiLFwibHJjXCIsXCJscmVcIixcImxyZ1wiLFwibHJpXCIsXCJscmtcIixcImxybFwiLFwibHJtXCIsXCJscm5cIixcImxyb1wiLFwibHJyXCIsXCJscnRcIixcImxydlwiLFwibHJ6XCIsXCJsc2FcIixcImxzYlwiLFwibHNkXCIsXCJsc2VcIixcImxzZ1wiLFwibHNoXCIsXCJsc2lcIixcImxzbFwiLFwibHNtXCIsXCJsc25cIixcImxzb1wiLFwibHNwXCIsXCJsc3JcIixcImxzc1wiLFwibHN0XCIsXCJsc3ZcIixcImxzeVwiLFwibHRjXCIsXCJsdGdcIixcImx0aFwiLFwibHRpXCIsXCJsdG5cIixcImx0b1wiLFwibHRzXCIsXCJsdHVcIixcImx1YVwiLFwibHVjXCIsXCJsdWRcIixcImx1ZVwiLFwibHVmXCIsXCJsdWlcIixcImx1alwiLFwibHVrXCIsXCJsdWxcIixcImx1bVwiLFwibHVuXCIsXCJsdW9cIixcImx1cFwiLFwibHVxXCIsXCJsdXJcIixcImx1c1wiLFwibHV0XCIsXCJsdXVcIixcImx1dlwiLFwibHV3XCIsXCJsdXlcIixcImx1elwiLFwibHZhXCIsXCJsdmlcIixcImx2a1wiLFwibHZzXCIsXCJsdnVcIixcImx3YVwiLFwibHdlXCIsXCJsd2dcIixcImx3aFwiLFwibHdsXCIsXCJsd21cIixcImx3b1wiLFwibHdzXCIsXCJsd3RcIixcImx3dVwiLFwibHd3XCIsXCJseG1cIixcImx5YVwiLFwibHlnXCIsXCJseW5cIixcImx6aFwiLFwibHpsXCIsXCJsem5cIixcImx6elwiXVxuLFsgXCJtZ1wiLFwibWhcIixcIm1pXCIsXCJta1wiLFwibWxcIixcIm1uXCIsXCJtb1wiLFwibXJcIixcIm1zXCIsXCJtdFwiLFwibXlcIixcIm1hYVwiLFwibWFiXCIsXCJtYWRcIixcIm1hZVwiLFwibWFmXCIsXCJtYWdcIixcIm1haVwiLFwibWFqXCIsXCJtYWtcIixcIm1hbVwiLFwibWFuXCIsXCJtYXBcIixcIm1hcVwiLFwibWFzXCIsXCJtYXRcIixcIm1hdVwiLFwibWF2XCIsXCJtYXdcIixcIm1heFwiLFwibWF6XCIsXCJtYmFcIixcIm1iYlwiLFwibWJjXCIsXCJtYmRcIixcIm1iZVwiLFwibWJmXCIsXCJtYmhcIixcIm1iaVwiLFwibWJqXCIsXCJtYmtcIixcIm1ibFwiLFwibWJtXCIsXCJtYm5cIixcIm1ib1wiLFwibWJwXCIsXCJtYnFcIixcIm1iclwiLFwibWJzXCIsXCJtYnRcIixcIm1idVwiLFwibWJ2XCIsXCJtYndcIixcIm1ieFwiLFwibWJ5XCIsXCJtYnpcIixcIm1jYVwiLFwibWNiXCIsXCJtY2NcIixcIm1jZFwiLFwibWNlXCIsXCJtY2ZcIixcIm1jZ1wiLFwibWNoXCIsXCJtY2lcIixcIm1jalwiLFwibWNrXCIsXCJtY2xcIixcIm1jbVwiLFwibWNuXCIsXCJtY29cIixcIm1jcFwiLFwibWNxXCIsXCJtY3JcIixcIm1jc1wiLFwibWN0XCIsXCJtY3VcIixcIm1jdlwiLFwibWN3XCIsXCJtY3hcIixcIm1jeVwiLFwibWN6XCIsXCJtZGFcIixcIm1kYlwiLFwibWRjXCIsXCJtZGRcIixcIm1kZVwiLFwibWRmXCIsXCJtZGdcIixcIm1kaFwiLFwibWRpXCIsXCJtZGpcIixcIm1ka1wiLFwibWRsXCIsXCJtZG1cIixcIm1kblwiLFwibWRwXCIsXCJtZHFcIixcIm1kclwiLFwibWRzXCIsXCJtZHRcIixcIm1kdVwiLFwibWR2XCIsXCJtZHdcIixcIm1keFwiLFwibWR5XCIsXCJtZHpcIixcIm1lYVwiLFwibWViXCIsXCJtZWNcIixcIm1lZFwiLFwibWVlXCIsXCJtZWZcIixcIm1lZ1wiLFwibWVoXCIsXCJtZWlcIixcIm1lalwiLFwibWVrXCIsXCJtZWxcIixcIm1lbVwiLFwibWVuXCIsXCJtZW9cIixcIm1lcFwiLFwibWVxXCIsXCJtZXJcIixcIm1lc1wiLFwibWV0XCIsXCJtZXVcIixcIm1ldlwiLFwibWV3XCIsXCJtZXlcIixcIm1lelwiLFwibWZhXCIsXCJtZmJcIixcIm1mY1wiLFwibWZkXCIsXCJtZmVcIixcIm1mZlwiLFwibWZnXCIsXCJtZmhcIixcIm1maVwiLFwibWZqXCIsXCJtZmtcIixcIm1mbFwiLFwibWZtXCIsXCJtZm5cIixcIm1mb1wiLFwibWZwXCIsXCJtZnFcIixcIm1mclwiLFwibWZzXCIsXCJtZnRcIixcIm1mdVwiLFwibWZ2XCIsXCJtZndcIixcIm1meFwiLFwibWZ5XCIsXCJtZnpcIixcIm1nYVwiLFwibWdiXCIsXCJtZ2NcIixcIm1nZFwiLFwibWdlXCIsXCJtZ2ZcIixcIm1nZ1wiLFwibWdoXCIsXCJtZ2lcIixcIm1nalwiLFwibWdrXCIsXCJtZ2xcIixcIm1nbVwiLFwibWduXCIsXCJtZ29cIixcIm1ncFwiLFwibWdxXCIsXCJtZ3JcIixcIm1nc1wiLFwibWd0XCIsXCJtZ3VcIixcIm1ndlwiLFwibWd3XCIsXCJtZ3hcIixcIm1neVwiLFwibWd6XCIsXCJtaGFcIixcIm1oYlwiLFwibWhjXCIsXCJtaGRcIixcIm1oZVwiLFwibWhmXCIsXCJtaGdcIixcIm1oaFwiLFwibWhpXCIsXCJtaGpcIixcIm1oa1wiLFwibWhsXCIsXCJtaG1cIixcIm1oblwiLFwibWhvXCIsXCJtaHBcIixcIm1ocVwiLFwibWhyXCIsXCJtaHNcIixcIm1odFwiLFwibWh1XCIsXCJtaHdcIixcIm1oeFwiLFwibWh5XCIsXCJtaHpcIixcIm1pYVwiLFwibWliXCIsXCJtaWNcIixcIm1pZFwiLFwibWllXCIsXCJtaWZcIixcIm1pZ1wiLFwibWloXCIsXCJtaWlcIixcIm1palwiLFwibWlrXCIsXCJtaWxcIixcIm1pbVwiLFwibWluXCIsXCJtaW9cIixcIm1pcFwiLFwibWlxXCIsXCJtaXJcIixcIm1pc1wiLFwibWl0XCIsXCJtaXVcIixcIm1pd1wiLFwibWl4XCIsXCJtaXlcIixcIm1pelwiLFwibWphXCIsXCJtamJcIixcIm1qY1wiLFwibWpkXCIsXCJtamVcIixcIm1qZ1wiLFwibWpoXCIsXCJtamlcIixcIm1qalwiLFwibWprXCIsXCJtamxcIixcIm1qbVwiLFwibWpuXCIsXCJtam9cIixcIm1qcFwiLFwibWpxXCIsXCJtanJcIixcIm1qc1wiLFwibWp0XCIsXCJtanVcIixcIm1qdlwiLFwibWp3XCIsXCJtanhcIixcIm1qeVwiLFwibWp6XCIsXCJta2FcIixcIm1rYlwiLFwibWtjXCIsXCJta2VcIixcIm1rZlwiLFwibWtnXCIsXCJta2hcIixcIm1raVwiLFwibWtqXCIsXCJta2tcIixcIm1rbFwiLFwibWttXCIsXCJta25cIixcIm1rb1wiLFwibWtwXCIsXCJta3FcIixcIm1rclwiLFwibWtzXCIsXCJta3RcIixcIm1rdVwiLFwibWt2XCIsXCJta3dcIixcIm1reFwiLFwibWt5XCIsXCJta3pcIixcIm1sYVwiLFwibWxiXCIsXCJtbGNcIixcIm1sZFwiLFwibWxlXCIsXCJtbGZcIixcIm1saFwiLFwibWxpXCIsXCJtbGpcIixcIm1sa1wiLFwibWxsXCIsXCJtbG1cIixcIm1sblwiLFwibWxvXCIsXCJtbHBcIixcIm1scVwiLFwibWxyXCIsXCJtbHNcIixcIm1sdVwiLFwibWx2XCIsXCJtbHdcIixcIm1seFwiLFwibWx6XCIsXCJtbWFcIixcIm1tYlwiLFwibW1jXCIsXCJtbWRcIixcIm1tZVwiLFwibW1mXCIsXCJtbWdcIixcIm1taFwiLFwibW1pXCIsXCJtbWpcIixcIm1ta1wiLFwibW1sXCIsXCJtbW1cIixcIm1tblwiLFwibW1vXCIsXCJtbXBcIixcIm1tcVwiLFwibW1yXCIsXCJtbXRcIixcIm1tdVwiLFwibW12XCIsXCJtbXdcIixcIm1teFwiLFwibW15XCIsXCJtbXpcIixcIm1uYVwiLFwibW5iXCIsXCJtbmNcIixcIm1uZFwiLFwibW5lXCIsXCJtbmZcIixcIm1uZ1wiLFwibW5oXCIsXCJtbmlcIixcIm1ualwiLFwibW5rXCIsXCJtbmxcIixcIm1ubVwiLFwibW5uXCIsXCJtbm9cIixcIm1ucFwiLFwibW5xXCIsXCJtbnJcIixcIm1uc1wiLFwibW50XCIsXCJtbnVcIixcIm1udlwiLFwibW53XCIsXCJtbnhcIixcIm1ueVwiLFwibW56XCIsXCJtb2FcIixcIm1vY1wiLFwibW9kXCIsXCJtb2VcIixcIm1vZlwiLFwibW9nXCIsXCJtb2hcIixcIm1vaVwiLFwibW9qXCIsXCJtb2tcIixcIm1vbVwiLFwibW9vXCIsXCJtb3BcIixcIm1vcVwiLFwibW9yXCIsXCJtb3NcIixcIm1vdFwiLFwibW91XCIsXCJtb3ZcIixcIm1vd1wiLFwibW94XCIsXCJtb3lcIixcIm1velwiLFwibXBhXCIsXCJtcGJcIixcIm1wY1wiLFwibXBkXCIsXCJtcGVcIixcIm1wZ1wiLFwibXBoXCIsXCJtcGlcIixcIm1walwiLFwibXBrXCIsXCJtcGxcIixcIm1wbVwiLFwibXBuXCIsXCJtcG9cIixcIm1wcFwiLFwibXBxXCIsXCJtcHJcIixcIm1wc1wiLFwibXB0XCIsXCJtcHVcIixcIm1wdlwiLFwibXB3XCIsXCJtcHhcIixcIm1weVwiLFwibXB6XCIsXCJtcWFcIixcIm1xYlwiLFwibXFjXCIsXCJtcWVcIixcIm1xZlwiLFwibXFnXCIsXCJtcWhcIixcIm1xaVwiLFwibXFqXCIsXCJtcWtcIixcIm1xbFwiLFwibXFtXCIsXCJtcW5cIixcIm1xb1wiLFwibXFwXCIsXCJtcXFcIixcIm1xclwiLFwibXFzXCIsXCJtcXRcIixcIm1xdVwiLFwibXF2XCIsXCJtcXdcIixcIm1xeFwiLFwibXF5XCIsXCJtcXpcIixcIm1yYVwiLFwibXJiXCIsXCJtcmNcIixcIm1yZFwiLFwibXJlXCIsXCJtcmZcIixcIm1yZ1wiLFwibXJoXCIsXCJtcmpcIixcIm1ya1wiLFwibXJsXCIsXCJtcm1cIixcIm1yblwiLFwibXJvXCIsXCJtcnBcIixcIm1ycVwiLFwibXJyXCIsXCJtcnNcIixcIm1ydFwiLFwibXJ1XCIsXCJtcnZcIixcIm1yd1wiLFwibXJ4XCIsXCJtcnlcIixcIm1yelwiLFwibXNiXCIsXCJtc2NcIixcIm1zZFwiLFwibXNlXCIsXCJtc2ZcIixcIm1zZ1wiLFwibXNoXCIsXCJtc2lcIixcIm1zalwiLFwibXNrXCIsXCJtc2xcIixcIm1zbVwiLFwibXNuXCIsXCJtc29cIixcIm1zcFwiLFwibXNxXCIsXCJtc3JcIixcIm1zc1wiLFwibXN0XCIsXCJtc3VcIixcIm1zdlwiLFwibXN3XCIsXCJtc3hcIixcIm1zeVwiLFwibXN6XCIsXCJtdGFcIixcIm10YlwiLFwibXRjXCIsXCJtdGRcIixcIm10ZVwiLFwibXRmXCIsXCJtdGdcIixcIm10aFwiLFwibXRpXCIsXCJtdGpcIixcIm10a1wiLFwibXRsXCIsXCJtdG1cIixcIm10blwiLFwibXRvXCIsXCJtdHBcIixcIm10cVwiLFwibXRyXCIsXCJtdHNcIixcIm10dFwiLFwibXR1XCIsXCJtdHZcIixcIm10d1wiLFwibXR4XCIsXCJtdHlcIixcIm11YVwiLFwibXViXCIsXCJtdWNcIixcIm11ZFwiLFwibXVlXCIsXCJtdWdcIixcIm11aFwiLFwibXVpXCIsXCJtdWpcIixcIm11a1wiLFwibXVsXCIsXCJtdW1cIixcIm11blwiLFwibXVvXCIsXCJtdXBcIixcIm11cVwiLFwibXVyXCIsXCJtdXNcIixcIm11dFwiLFwibXV1XCIsXCJtdXZcIixcIm11eFwiLFwibXV5XCIsXCJtdXpcIixcIm12YVwiLFwibXZiXCIsXCJtdmRcIixcIm12ZVwiLFwibXZmXCIsXCJtdmdcIixcIm12aFwiLFwibXZpXCIsXCJtdmtcIixcIm12bFwiLFwibXZtXCIsXCJtdm5cIixcIm12b1wiLFwibXZwXCIsXCJtdnFcIixcIm12clwiLFwibXZzXCIsXCJtdnRcIixcIm12dVwiLFwibXZ2XCIsXCJtdndcIixcIm12eFwiLFwibXZ5XCIsXCJtdnpcIixcIm13YVwiLFwibXdiXCIsXCJtd2NcIixcIm13ZFwiLFwibXdlXCIsXCJtd2ZcIixcIm13Z1wiLFwibXdoXCIsXCJtd2lcIixcIm13alwiLFwibXdrXCIsXCJtd2xcIixcIm13bVwiLFwibXduXCIsXCJtd29cIixcIm13cFwiLFwibXdxXCIsXCJtd3JcIixcIm13c1wiLFwibXd0XCIsXCJtd3VcIixcIm13dlwiLFwibXd3XCIsXCJtd3hcIixcIm13eVwiLFwibXd6XCIsXCJteGFcIixcIm14YlwiLFwibXhjXCIsXCJteGRcIixcIm14ZVwiLFwibXhmXCIsXCJteGdcIixcIm14aFwiLFwibXhpXCIsXCJteGpcIixcIm14a1wiLFwibXhsXCIsXCJteG1cIixcIm14blwiLFwibXhvXCIsXCJteHBcIixcIm14cVwiLFwibXhyXCIsXCJteHNcIixcIm14dFwiLFwibXh1XCIsXCJteHZcIixcIm14d1wiLFwibXh4XCIsXCJteHlcIixcIm14elwiLFwibXliXCIsXCJteWNcIixcIm15ZFwiLFwibXllXCIsXCJteWZcIixcIm15Z1wiLFwibXloXCIsXCJteWlcIixcIm15alwiLFwibXlrXCIsXCJteWxcIixcIm15bVwiLFwibXluXCIsXCJteW9cIixcIm15cFwiLFwibXlxXCIsXCJteXJcIixcIm15c1wiLFwibXl0XCIsXCJteXVcIixcIm15dlwiLFwibXl3XCIsXCJteXhcIixcIm15eVwiLFwibXl6XCIsXCJtemFcIixcIm16YlwiLFwibXpjXCIsXCJtemRcIixcIm16ZVwiLFwibXpnXCIsXCJtemhcIixcIm16aVwiLFwibXpqXCIsXCJtemtcIixcIm16bFwiLFwibXptXCIsXCJtem5cIixcIm16b1wiLFwibXpwXCIsXCJtenFcIixcIm16clwiLFwibXpzXCIsXCJtenRcIixcIm16dVwiLFwibXp2XCIsXCJtendcIixcIm16eFwiLFwibXp5XCIsXCJtenpcIl1cbixbIFwibmFcIixcIm5iXCIsXCJuZFwiLFwibmVcIixcIm5nXCIsXCJubFwiLFwibm5cIixcIm5vXCIsXCJuclwiLFwibnZcIixcIm55XCIsXCJuYWFcIixcIm5hYlwiLFwibmFjXCIsXCJuYWRcIixcIm5hZVwiLFwibmFmXCIsXCJuYWdcIixcIm5haFwiLFwibmFpXCIsXCJuYWpcIixcIm5ha1wiLFwibmFsXCIsXCJuYW1cIixcIm5hblwiLFwibmFvXCIsXCJuYXBcIixcIm5hcVwiLFwibmFyXCIsXCJuYXNcIixcIm5hdFwiLFwibmF3XCIsXCJuYXhcIixcIm5heVwiLFwibmF6XCIsXCJuYmFcIixcIm5iYlwiLFwibmJjXCIsXCJuYmRcIixcIm5iZVwiLFwibmJmXCIsXCJuYmdcIixcIm5iaFwiLFwibmJpXCIsXCJuYmpcIixcIm5ia1wiLFwibmJtXCIsXCJuYm5cIixcIm5ib1wiLFwibmJwXCIsXCJuYnFcIixcIm5iclwiLFwibmJzXCIsXCJuYnRcIixcIm5idVwiLFwibmJ2XCIsXCJuYndcIixcIm5ieFwiLFwibmJ5XCIsXCJuY2FcIixcIm5jYlwiLFwibmNjXCIsXCJuY2RcIixcIm5jZVwiLFwibmNmXCIsXCJuY2dcIixcIm5jaFwiLFwibmNpXCIsXCJuY2pcIixcIm5ja1wiLFwibmNsXCIsXCJuY21cIixcIm5jblwiLFwibmNvXCIsXCJuY3BcIixcIm5jcVwiLFwibmNyXCIsXCJuY3NcIixcIm5jdFwiLFwibmN1XCIsXCJuY3hcIixcIm5jelwiLFwibmRhXCIsXCJuZGJcIixcIm5kY1wiLFwibmRkXCIsXCJuZGZcIixcIm5kZ1wiLFwibmRoXCIsXCJuZGlcIixcIm5kalwiLFwibmRrXCIsXCJuZGxcIixcIm5kbVwiLFwibmRuXCIsXCJuZHBcIixcIm5kcVwiLFwibmRyXCIsXCJuZHNcIixcIm5kdFwiLFwibmR1XCIsXCJuZHZcIixcIm5kd1wiLFwibmR4XCIsXCJuZHlcIixcIm5kelwiLFwibmVhXCIsXCJuZWJcIixcIm5lY1wiLFwibmVkXCIsXCJuZWVcIixcIm5lZlwiLFwibmVnXCIsXCJuZWhcIixcIm5laVwiLFwibmVqXCIsXCJuZWtcIixcIm5lbVwiLFwibmVuXCIsXCJuZW9cIixcIm5lcVwiLFwibmVyXCIsXCJuZXNcIixcIm5ldFwiLFwibmV1XCIsXCJuZXZcIixcIm5ld1wiLFwibmV4XCIsXCJuZXlcIixcIm5lelwiLFwibmZhXCIsXCJuZmRcIixcIm5mbFwiLFwibmZyXCIsXCJuZnVcIixcIm5nYVwiLFwibmdiXCIsXCJuZ2NcIixcIm5nZFwiLFwibmdlXCIsXCJuZ2ZcIixcIm5nZ1wiLFwibmdoXCIsXCJuZ2lcIixcIm5nalwiLFwibmdrXCIsXCJuZ2xcIixcIm5nbVwiLFwibmduXCIsXCJuZ29cIixcIm5ncFwiLFwibmdxXCIsXCJuZ3JcIixcIm5nc1wiLFwibmd0XCIsXCJuZ3VcIixcIm5ndlwiLFwibmd3XCIsXCJuZ3hcIixcIm5neVwiLFwibmd6XCIsXCJuaGFcIixcIm5oYlwiLFwibmhjXCIsXCJuaGRcIixcIm5oZVwiLFwibmhmXCIsXCJuaGdcIixcIm5oaFwiLFwibmhpXCIsXCJuaGtcIixcIm5obVwiLFwibmhuXCIsXCJuaG9cIixcIm5ocFwiLFwibmhxXCIsXCJuaHJcIixcIm5odFwiLFwibmh1XCIsXCJuaHZcIixcIm5od1wiLFwibmh4XCIsXCJuaHlcIixcIm5oelwiLFwibmlhXCIsXCJuaWJcIixcIm5pY1wiLFwibmlkXCIsXCJuaWVcIixcIm5pZlwiLFwibmlnXCIsXCJuaWhcIixcIm5paVwiLFwibmlqXCIsXCJuaWtcIixcIm5pbFwiLFwibmltXCIsXCJuaW5cIixcIm5pb1wiLFwibmlxXCIsXCJuaXJcIixcIm5pc1wiLFwibml0XCIsXCJuaXVcIixcIm5pdlwiLFwibml3XCIsXCJuaXhcIixcIm5peVwiLFwibml6XCIsXCJuamFcIixcIm5qYlwiLFwibmpkXCIsXCJuamhcIixcIm5qaVwiLFwibmpqXCIsXCJuamxcIixcIm5qbVwiLFwibmpuXCIsXCJuam9cIixcIm5qclwiLFwibmpzXCIsXCJuanRcIixcIm5qdVwiLFwibmp4XCIsXCJuanlcIixcIm5qelwiLFwibmthXCIsXCJua2JcIixcIm5rY1wiLFwibmtkXCIsXCJua2VcIixcIm5rZlwiLFwibmtnXCIsXCJua2hcIixcIm5raVwiLFwibmtqXCIsXCJua2tcIixcIm5rbVwiLFwibmtuXCIsXCJua29cIixcIm5rcFwiLFwibmtxXCIsXCJua3JcIixcIm5rc1wiLFwibmt0XCIsXCJua3VcIixcIm5rdlwiLFwibmt3XCIsXCJua3hcIixcIm5relwiLFwibmxhXCIsXCJubGNcIixcIm5sZVwiLFwibmxnXCIsXCJubGlcIixcIm5salwiLFwibmxrXCIsXCJubGxcIixcIm5sbVwiLFwibmxuXCIsXCJubG9cIixcIm5scVwiLFwibmxyXCIsXCJubHVcIixcIm5sdlwiLFwibmx3XCIsXCJubHhcIixcIm5seVwiLFwibmx6XCIsXCJubWFcIixcIm5tYlwiLFwibm1jXCIsXCJubWRcIixcIm5tZVwiLFwibm1mXCIsXCJubWdcIixcIm5taFwiLFwibm1pXCIsXCJubWpcIixcIm5ta1wiLFwibm1sXCIsXCJubW1cIixcIm5tblwiLFwibm1vXCIsXCJubXBcIixcIm5tcVwiLFwibm1yXCIsXCJubXNcIixcIm5tdFwiLFwibm11XCIsXCJubXZcIixcIm5td1wiLFwibm14XCIsXCJubXlcIixcIm5telwiLFwibm5hXCIsXCJubmJcIixcIm5uY1wiLFwibm5kXCIsXCJubmVcIixcIm5uZlwiLFwibm5nXCIsXCJubmhcIixcIm5uaVwiLFwibm5qXCIsXCJubmtcIixcIm5ubFwiLFwibm5tXCIsXCJubm5cIixcIm5ucFwiLFwibm5xXCIsXCJubnJcIixcIm5uc1wiLFwibm50XCIsXCJubnVcIixcIm5udlwiLFwibm53XCIsXCJubnhcIixcIm5ueVwiLFwibm56XCIsXCJub2FcIixcIm5vY1wiLFwibm9kXCIsXCJub2VcIixcIm5vZlwiLFwibm9nXCIsXCJub2hcIixcIm5vaVwiLFwibm9qXCIsXCJub2tcIixcIm5vbFwiLFwibm9tXCIsXCJub25cIixcIm5vb1wiLFwibm9wXCIsXCJub3FcIixcIm5vc1wiLFwibm90XCIsXCJub3VcIixcIm5vdlwiLFwibm93XCIsXCJub3lcIixcIm5velwiLFwibnBhXCIsXCJucGJcIixcIm5wZ1wiLFwibnBoXCIsXCJucGlcIixcIm5wbFwiLFwibnBuXCIsXCJucG9cIixcIm5wc1wiLFwibnB1XCIsXCJucHhcIixcIm5weVwiLFwibnFnXCIsXCJucWtcIixcIm5xbFwiLFwibnFtXCIsXCJucW5cIixcIm5xb1wiLFwibnFxXCIsXCJucXRcIixcIm5xeVwiLFwibnJhXCIsXCJucmJcIixcIm5yY1wiLFwibnJlXCIsXCJucmZcIixcIm5yZ1wiLFwibnJpXCIsXCJucmtcIixcIm5ybFwiLFwibnJtXCIsXCJucm5cIixcIm5ycFwiLFwibnJyXCIsXCJucnRcIixcIm5ydVwiLFwibnJ4XCIsXCJucnpcIixcIm5zYVwiLFwibnNiXCIsXCJuc2NcIixcIm5zZFwiLFwibnNlXCIsXCJuc2ZcIixcIm5zZ1wiLFwibnNoXCIsXCJuc2lcIixcIm5za1wiLFwibnNsXCIsXCJuc21cIixcIm5zblwiLFwibnNvXCIsXCJuc3BcIixcIm5zcVwiLFwibnNyXCIsXCJuc3NcIixcIm5zdFwiLFwibnN1XCIsXCJuc3ZcIixcIm5zd1wiLFwibnN4XCIsXCJuc3lcIixcIm5zelwiLFwibnRkXCIsXCJudGVcIixcIm50Z1wiLFwibnRpXCIsXCJudGpcIixcIm50a1wiLFwibnRtXCIsXCJudG9cIixcIm50cFwiLFwibnRyXCIsXCJudHNcIixcIm50dVwiLFwibnR3XCIsXCJudHhcIixcIm50eVwiLFwibnR6XCIsXCJudWFcIixcIm51YlwiLFwibnVjXCIsXCJudWRcIixcIm51ZVwiLFwibnVmXCIsXCJudWdcIixcIm51aFwiLFwibnVpXCIsXCJudWpcIixcIm51a1wiLFwibnVsXCIsXCJudW1cIixcIm51blwiLFwibnVvXCIsXCJudXBcIixcIm51cVwiLFwibnVyXCIsXCJudXNcIixcIm51dFwiLFwibnV1XCIsXCJudXZcIixcIm51d1wiLFwibnV4XCIsXCJudXlcIixcIm51elwiLFwibnZoXCIsXCJudm1cIixcIm52b1wiLFwibndhXCIsXCJud2JcIixcIm53Y1wiLFwibndlXCIsXCJud2dcIixcIm53aVwiLFwibndtXCIsXCJud29cIixcIm53clwiLFwibnd4XCIsXCJud3lcIixcIm54YVwiLFwibnhkXCIsXCJueGVcIixcIm54Z1wiLFwibnhpXCIsXCJueGtcIixcIm54bFwiLFwibnhtXCIsXCJueG5cIixcIm54b1wiLFwibnhxXCIsXCJueHJcIixcIm54dVwiLFwibnh4XCIsXCJueWJcIixcIm55Y1wiLFwibnlkXCIsXCJueWVcIixcIm55ZlwiLFwibnlnXCIsXCJueWhcIixcIm55aVwiLFwibnlqXCIsXCJueWtcIixcIm55bFwiLFwibnltXCIsXCJueW5cIixcIm55b1wiLFwibnlwXCIsXCJueXFcIixcIm55clwiLFwibnlzXCIsXCJueXRcIixcIm55dVwiLFwibnl2XCIsXCJueXdcIixcIm55eFwiLFwibnl5XCIsXCJuemFcIixcIm56YlwiLFwibnpkXCIsXCJuemlcIixcIm56a1wiLFwibnptXCIsXCJuenNcIixcIm56dVwiLFwibnp5XCIsXCJuenpcIl1cbixbIFwib2NcIixcIm9qXCIsXCJvbVwiLFwib3JcIixcIm9zXCIsXCJvYWFcIixcIm9hY1wiLFwib2FyXCIsXCJvYXZcIixcIm9iaVwiLFwib2JrXCIsXCJvYmxcIixcIm9ibVwiLFwib2JvXCIsXCJvYnJcIixcIm9idFwiLFwib2J1XCIsXCJvY2FcIixcIm9jaFwiLFwib2NtXCIsXCJvY29cIixcIm9jdVwiLFwib2RhXCIsXCJvZGtcIixcIm9kdFwiLFwib2R1XCIsXCJvZm9cIixcIm9mc1wiLFwib2Z1XCIsXCJvZ2JcIixcIm9nY1wiLFwib2dlXCIsXCJvZ2dcIixcIm9nb1wiLFwib2d1XCIsXCJvaHRcIixcIm9odVwiLFwib2lhXCIsXCJvaW5cIixcIm9qYlwiLFwib2pjXCIsXCJvamdcIixcIm9qcFwiLFwib2pzXCIsXCJvanZcIixcIm9qd1wiLFwib2thXCIsXCJva2JcIixcIm9rY1wiLFwib2tkXCIsXCJva2VcIixcIm9rZ1wiLFwib2toXCIsXCJva2lcIixcIm9ralwiLFwib2trXCIsXCJva2xcIixcIm9rbVwiLFwib2tuXCIsXCJva29cIixcIm9rclwiLFwib2tzXCIsXCJva3VcIixcIm9rdlwiLFwib2t4XCIsXCJva3pcIixcIm9sYVwiLFwib2xkXCIsXCJvbGVcIixcIm9sa1wiLFwib2xtXCIsXCJvbG9cIixcIm9sclwiLFwib2x0XCIsXCJvbHVcIixcIm9tYVwiLFwib21iXCIsXCJvbWNcIixcIm9tZVwiLFwib21nXCIsXCJvbWlcIixcIm9ta1wiLFwib21sXCIsXCJvbW5cIixcIm9tb1wiLFwib21wXCIsXCJvbXFcIixcIm9tclwiLFwib210XCIsXCJvbXVcIixcIm9tdlwiLFwib213XCIsXCJvbXhcIixcIm9teVwiLFwib25hXCIsXCJvbmJcIixcIm9uZVwiLFwib25nXCIsXCJvbmlcIixcIm9ualwiLFwib25rXCIsXCJvbm5cIixcIm9ub1wiLFwib25wXCIsXCJvbnJcIixcIm9uc1wiLFwib250XCIsXCJvbnVcIixcIm9ud1wiLFwib254XCIsXCJvb2RcIixcIm9vZ1wiLFwib29uXCIsXCJvb3JcIixcIm9vc1wiLFwib3BhXCIsXCJvcGtcIixcIm9wbVwiLFwib3BvXCIsXCJvcHRcIixcIm9weVwiLFwib3JhXCIsXCJvcmNcIixcIm9yZVwiLFwib3JnXCIsXCJvcmhcIixcIm9yblwiLFwib3JvXCIsXCJvcnJcIixcIm9yc1wiLFwib3J0XCIsXCJvcnVcIixcIm9ydlwiLFwib3J3XCIsXCJvcnhcIixcIm9yeVwiLFwib3J6XCIsXCJvc2FcIixcIm9zY1wiLFwib3NpXCIsXCJvc25cIixcIm9zb1wiLFwib3NwXCIsXCJvc3RcIixcIm9zdVwiLFwib3N4XCIsXCJvdGFcIixcIm90YlwiLFwib3RkXCIsXCJvdGVcIixcIm90aVwiLFwib3RrXCIsXCJvdGxcIixcIm90bVwiLFwib3RuXCIsXCJvdG9cIixcIm90cVwiLFwib3RyXCIsXCJvdHNcIixcIm90dFwiLFwib3R1XCIsXCJvdHdcIixcIm90eFwiLFwib3R5XCIsXCJvdHpcIixcIm91YVwiLFwib3ViXCIsXCJvdWVcIixcIm91aVwiLFwib3VtXCIsXCJvdW5cIixcIm92ZFwiLFwib3dpXCIsXCJvd2xcIixcIm95YlwiLFwib3lkXCIsXCJveW1cIixcIm95eVwiLFwib3ptXCJdXG4sWyBcInBhXCIsXCJwaVwiLFwicGxcIixcInBzXCIsXCJwdFwiLFwicGFhXCIsXCJwYWJcIixcInBhY1wiLFwicGFkXCIsXCJwYWVcIixcInBhZlwiLFwicGFnXCIsXCJwYWhcIixcInBhaVwiLFwicGFrXCIsXCJwYWxcIixcInBhbVwiLFwicGFvXCIsXCJwYXBcIixcInBhcVwiLFwicGFyXCIsXCJwYXNcIixcInBhdFwiLFwicGF1XCIsXCJwYXZcIixcInBhd1wiLFwicGF4XCIsXCJwYXlcIixcInBhelwiLFwicGJiXCIsXCJwYmNcIixcInBiZVwiLFwicGJmXCIsXCJwYmdcIixcInBiaFwiLFwicGJpXCIsXCJwYmxcIixcInBibVwiLFwicGJuXCIsXCJwYm9cIixcInBicFwiLFwicGJyXCIsXCJwYnNcIixcInBidFwiLFwicGJ1XCIsXCJwYnZcIixcInBieVwiLFwicGJ6XCIsXCJwY2FcIixcInBjYlwiLFwicGNjXCIsXCJwY2RcIixcInBjZVwiLFwicGNmXCIsXCJwY2dcIixcInBjaFwiLFwicGNpXCIsXCJwY2pcIixcInBja1wiLFwicGNsXCIsXCJwY21cIixcInBjblwiLFwicGNwXCIsXCJwY3JcIixcInBjd1wiLFwicGRhXCIsXCJwZGNcIixcInBkaVwiLFwicGRuXCIsXCJwZG9cIixcInBkdFwiLFwicGR1XCIsXCJwZWFcIixcInBlYlwiLFwicGVkXCIsXCJwZWVcIixcInBlZlwiLFwicGVnXCIsXCJwZWhcIixcInBlaVwiLFwicGVqXCIsXCJwZWtcIixcInBlbFwiLFwicGVtXCIsXCJwZW9cIixcInBlcFwiLFwicGVxXCIsXCJwZXNcIixcInBldlwiLFwicGV4XCIsXCJwZXlcIixcInBlelwiLFwicGZhXCIsXCJwZmVcIixcInBmbFwiLFwicGdhXCIsXCJwZ2RcIixcInBnZ1wiLFwicGdpXCIsXCJwZ2tcIixcInBnbFwiLFwicGduXCIsXCJwZ3NcIixcInBndVwiLFwicGd5XCIsXCJwZ3pcIixcInBoYVwiLFwicGhkXCIsXCJwaGdcIixcInBoaFwiLFwicGhpXCIsXCJwaGtcIixcInBobFwiLFwicGhtXCIsXCJwaG5cIixcInBob1wiLFwicGhxXCIsXCJwaHJcIixcInBodFwiLFwicGh1XCIsXCJwaHZcIixcInBod1wiLFwicGlhXCIsXCJwaWJcIixcInBpY1wiLFwicGlkXCIsXCJwaWVcIixcInBpZlwiLFwicGlnXCIsXCJwaWhcIixcInBpaVwiLFwicGlqXCIsXCJwaWxcIixcInBpbVwiLFwicGluXCIsXCJwaW9cIixcInBpcFwiLFwicGlyXCIsXCJwaXNcIixcInBpdFwiLFwicGl1XCIsXCJwaXZcIixcInBpd1wiLFwicGl4XCIsXCJwaXlcIixcInBpelwiLFwicGp0XCIsXCJwa2FcIixcInBrYlwiLFwicGtjXCIsXCJwa2dcIixcInBraFwiLFwicGtuXCIsXCJwa29cIixcInBrcFwiLFwicGtyXCIsXCJwa3NcIixcInBrdFwiLFwicGt1XCIsXCJwbGFcIixcInBsYlwiLFwicGxjXCIsXCJwbGRcIixcInBsZVwiLFwicGxmXCIsXCJwbGdcIixcInBsaFwiLFwicGxqXCIsXCJwbGtcIixcInBsbFwiLFwicGxuXCIsXCJwbG9cIixcInBscFwiLFwicGxxXCIsXCJwbHJcIixcInBsc1wiLFwicGx0XCIsXCJwbHVcIixcInBsdlwiLFwicGx3XCIsXCJwbHlcIixcInBselwiLFwicG1hXCIsXCJwbWJcIixcInBtY1wiLFwicG1kXCIsXCJwbWVcIixcInBtZlwiLFwicG1oXCIsXCJwbWlcIixcInBtalwiLFwicG1rXCIsXCJwbWxcIixcInBtbVwiLFwicG1uXCIsXCJwbW9cIixcInBtcVwiLFwicG1yXCIsXCJwbXNcIixcInBtdFwiLFwicG11XCIsXCJwbXdcIixcInBteFwiLFwicG15XCIsXCJwbXpcIixcInBuYVwiLFwicG5iXCIsXCJwbmNcIixcInBuZFwiLFwicG5lXCIsXCJwbmdcIixcInBuaFwiLFwicG5pXCIsXCJwbmpcIixcInBua1wiLFwicG5sXCIsXCJwbm1cIixcInBublwiLFwicG5vXCIsXCJwbnBcIixcInBucVwiLFwicG5yXCIsXCJwbnNcIixcInBudFwiLFwicG51XCIsXCJwbnZcIixcInBud1wiLFwicG54XCIsXCJwbnlcIixcInBuelwiLFwicG9jXCIsXCJwb2RcIixcInBvZVwiLFwicG9mXCIsXCJwb2dcIixcInBvaFwiLFwicG9pXCIsXCJwb2tcIixcInBvbVwiLFwicG9uXCIsXCJwb29cIixcInBvcFwiLFwicG9xXCIsXCJwb3NcIixcInBvdFwiLFwicG92XCIsXCJwb3dcIixcInBveFwiLFwicG95XCIsXCJwb3pcIixcInBwYVwiLFwicHBlXCIsXCJwcGlcIixcInBwa1wiLFwicHBsXCIsXCJwcG1cIixcInBwblwiLFwicHBvXCIsXCJwcHBcIixcInBwcVwiLFwicHByXCIsXCJwcHNcIixcInBwdFwiLFwicHB1XCIsXCJwcWFcIixcInBxZVwiLFwicHFtXCIsXCJwcXdcIixcInByYVwiLFwicHJiXCIsXCJwcmNcIixcInByZFwiLFwicHJlXCIsXCJwcmZcIixcInByZ1wiLFwicHJoXCIsXCJwcmlcIixcInBya1wiLFwicHJsXCIsXCJwcm1cIixcInByblwiLFwicHJvXCIsXCJwcnBcIixcInBycVwiLFwicHJyXCIsXCJwcnNcIixcInBydFwiLFwicHJ1XCIsXCJwcndcIixcInByeFwiLFwicHJ5XCIsXCJwcnpcIixcInBzYVwiLFwicHNjXCIsXCJwc2RcIixcInBzZVwiLFwicHNnXCIsXCJwc2hcIixcInBzaVwiLFwicHNsXCIsXCJwc21cIixcInBzblwiLFwicHNvXCIsXCJwc3BcIixcInBzcVwiLFwicHNyXCIsXCJwc3NcIixcInBzdFwiLFwicHN1XCIsXCJwc3dcIixcInBzeVwiLFwicHRhXCIsXCJwdGhcIixcInB0aVwiLFwicHRuXCIsXCJwdG9cIixcInB0cFwiLFwicHRxXCIsXCJwdHJcIixcInB0dFwiLFwicHR1XCIsXCJwdHZcIixcInB0d1wiLFwicHR5XCIsXCJwdWFcIixcInB1YlwiLFwicHVjXCIsXCJwdWRcIixcInB1ZVwiLFwicHVmXCIsXCJwdWdcIixcInB1aVwiLFwicHVqXCIsXCJwdWtcIixcInB1bVwiLFwicHVvXCIsXCJwdXBcIixcInB1cVwiLFwicHVyXCIsXCJwdXRcIixcInB1dVwiLFwicHV3XCIsXCJwdXhcIixcInB1eVwiLFwicHV6XCIsXCJwd2FcIixcInB3YlwiLFwicHdnXCIsXCJwd2lcIixcInB3bVwiLFwicHduXCIsXCJwd29cIixcInB3clwiLFwicHd3XCIsXCJweG1cIixcInB5ZVwiLFwicHltXCIsXCJweW5cIixcInB5c1wiLFwicHl1XCIsXCJweXhcIixcInB5eVwiLFwicHpuXCJdXG4sWyBcInF1XCIsXCJxdWFcIixcInF1YlwiLFwicXVjXCIsXCJxdWRcIixcInF1ZlwiLFwicXVnXCIsXCJxdWhcIixcInF1aVwiLFwicXVrXCIsXCJxdWxcIixcInF1bVwiLFwicXVuXCIsXCJxdXBcIixcInF1cVwiLFwicXVyXCIsXCJxdXNcIixcInF1dlwiLFwicXV3XCIsXCJxdXhcIixcInF1eVwiLFwicXV6XCIsXCJxdmFcIixcInF2Y1wiLFwicXZlXCIsXCJxdmhcIixcInF2aVwiLFwicXZqXCIsXCJxdmxcIixcInF2bVwiLFwicXZuXCIsXCJxdm9cIixcInF2cFwiLFwicXZzXCIsXCJxdndcIixcInF2eVwiLFwicXZ6XCIsXCJxd2FcIixcInF3Y1wiLFwicXdlXCIsXCJxd2hcIixcInF3bVwiLFwicXdzXCIsXCJxd3RcIixcInF4YVwiLFwicXhjXCIsXCJxeGhcIixcInF4bFwiLFwicXhuXCIsXCJxeG9cIixcInF4cFwiLFwicXhxXCIsXCJxeHJcIixcInF4c1wiLFwicXh0XCIsXCJxeHVcIixcInF4d1wiLFwicXlhXCIsXCJxeXBcIl1cbixbIFwicm1cIixcInJuXCIsXCJyb1wiLFwicnVcIixcInJ3XCIsXCJyYWFcIixcInJhYlwiLFwicmFjXCIsXCJyYWRcIixcInJhZlwiLFwicmFnXCIsXCJyYWhcIixcInJhaVwiLFwicmFqXCIsXCJyYWtcIixcInJhbFwiLFwicmFtXCIsXCJyYW5cIixcInJhb1wiLFwicmFwXCIsXCJyYXFcIixcInJhclwiLFwicmFzXCIsXCJyYXRcIixcInJhdVwiLFwicmF2XCIsXCJyYXdcIixcInJheFwiLFwicmF5XCIsXCJyYXpcIixcInJiYlwiLFwicmJrXCIsXCJyYmxcIixcInJicFwiLFwicmNmXCIsXCJyZGJcIixcInJlYVwiLFwicmViXCIsXCJyZWVcIixcInJlZ1wiLFwicmVpXCIsXCJyZWpcIixcInJlbFwiLFwicmVtXCIsXCJyZW5cIixcInJlclwiLFwicmVzXCIsXCJyZXRcIixcInJleVwiLFwicmdhXCIsXCJyZ2VcIixcInJna1wiLFwicmduXCIsXCJyZ3JcIixcInJnc1wiLFwicmd1XCIsXCJyaGdcIixcInJocFwiLFwicmlhXCIsXCJyaWVcIixcInJpZlwiLFwicmlsXCIsXCJyaW1cIixcInJpblwiLFwicmlyXCIsXCJyaXRcIixcInJpdVwiLFwicmpnXCIsXCJyamlcIixcInJqc1wiLFwicmthXCIsXCJya2JcIixcInJraFwiLFwicmtpXCIsXCJya21cIixcInJrdFwiLFwicmt3XCIsXCJybWFcIixcInJtYlwiLFwicm1jXCIsXCJybWRcIixcInJtZVwiLFwicm1mXCIsXCJybWdcIixcInJtaFwiLFwicm1pXCIsXCJybWtcIixcInJtbFwiLFwicm1tXCIsXCJybW5cIixcInJtb1wiLFwicm1wXCIsXCJybXFcIixcInJtclwiLFwicm1zXCIsXCJybXRcIixcInJtdVwiLFwicm12XCIsXCJybXdcIixcInJteFwiLFwicm15XCIsXCJybXpcIixcInJuYVwiLFwicm5kXCIsXCJybmdcIixcInJubFwiLFwicm5uXCIsXCJybnBcIixcInJuclwiLFwicm53XCIsXCJyb2FcIixcInJvYlwiLFwicm9jXCIsXCJyb2RcIixcInJvZVwiLFwicm9mXCIsXCJyb2dcIixcInJvbFwiLFwicm9tXCIsXCJyb29cIixcInJvcFwiLFwicm9yXCIsXCJyb3VcIixcInJvd1wiLFwicnBuXCIsXCJycHRcIixcInJyaVwiLFwicnJvXCIsXCJycnRcIixcInJzYlwiLFwicnNpXCIsXCJyc2xcIixcInJzbVwiLFwicnRjXCIsXCJydGhcIixcInJ0bVwiLFwicnRzXCIsXCJydHdcIixcInJ1YlwiLFwicnVjXCIsXCJydWVcIixcInJ1ZlwiLFwicnVnXCIsXCJydWhcIixcInJ1aVwiLFwicnVrXCIsXCJydW9cIixcInJ1cFwiLFwicnVxXCIsXCJydXRcIixcInJ1dVwiLFwicnV5XCIsXCJydXpcIixcInJ3YVwiLFwicndrXCIsXCJyd2xcIixcInJ3bVwiLFwicndvXCIsXCJyd3JcIixcInJ4ZFwiLFwicnh3XCIsXCJyeW5cIixcInJ5c1wiLFwicnl1XCIsXCJyemhcIl1cbixbIFwic2FcIixcInNjXCIsXCJzZFwiLFwic2VcIixcInNnXCIsXCJzaFwiLFwic2lcIixcInNrXCIsXCJzbFwiLFwic21cIixcInNuXCIsXCJzb1wiLFwic3FcIixcInNyXCIsXCJzc1wiLFwic3RcIixcInN1XCIsXCJzdlwiLFwic3dcIixcInNhYVwiLFwic2FiXCIsXCJzYWNcIixcInNhZFwiLFwic2FlXCIsXCJzYWZcIixcInNhaFwiLFwic2FpXCIsXCJzYWpcIixcInNha1wiLFwic2FsXCIsXCJzYW1cIixcInNhb1wiLFwic2FwXCIsXCJzYXFcIixcInNhclwiLFwic2FzXCIsXCJzYXRcIixcInNhdVwiLFwic2F2XCIsXCJzYXdcIixcInNheFwiLFwic2F5XCIsXCJzYXpcIixcInNiYVwiLFwic2JiXCIsXCJzYmNcIixcInNiZFwiLFwic2JlXCIsXCJzYmZcIixcInNiZ1wiLFwic2JoXCIsXCJzYmlcIixcInNialwiLFwic2JrXCIsXCJzYmxcIixcInNibVwiLFwic2JuXCIsXCJzYm9cIixcInNicFwiLFwic2JxXCIsXCJzYnJcIixcInNic1wiLFwic2J0XCIsXCJzYnVcIixcInNidlwiLFwic2J3XCIsXCJzYnhcIixcInNieVwiLFwic2J6XCIsXCJzY2FcIixcInNjYlwiLFwic2NlXCIsXCJzY2ZcIixcInNjZ1wiLFwic2NoXCIsXCJzY2lcIixcInNja1wiLFwic2NsXCIsXCJzY25cIixcInNjb1wiLFwic2NwXCIsXCJzY3FcIixcInNjc1wiLFwic2N0XCIsXCJzY3VcIixcInNjdlwiLFwic2N3XCIsXCJzY3hcIixcInNkYVwiLFwic2RiXCIsXCJzZGNcIixcInNkZVwiLFwic2RmXCIsXCJzZGdcIixcInNkaFwiLFwic2RqXCIsXCJzZGtcIixcInNkbFwiLFwic2RtXCIsXCJzZG5cIixcInNkb1wiLFwic2RwXCIsXCJzZHFcIixcInNkclwiLFwic2RzXCIsXCJzZHRcIixcInNkdVwiLFwic2R2XCIsXCJzZHhcIixcInNkelwiLFwic2VhXCIsXCJzZWJcIixcInNlY1wiLFwic2VkXCIsXCJzZWVcIixcInNlZlwiLFwic2VnXCIsXCJzZWhcIixcInNlaVwiLFwic2VqXCIsXCJzZWtcIixcInNlbFwiLFwic2VtXCIsXCJzZW5cIixcInNlb1wiLFwic2VwXCIsXCJzZXFcIixcInNlclwiLFwic2VzXCIsXCJzZXRcIixcInNldVwiLFwic2V2XCIsXCJzZXdcIixcInNleVwiLFwic2V6XCIsXCJzZmJcIixcInNmZVwiLFwic2ZtXCIsXCJzZnNcIixcInNmd1wiLFwic2dhXCIsXCJzZ2JcIixcInNnY1wiLFwic2dkXCIsXCJzZ2VcIixcInNnZ1wiLFwic2doXCIsXCJzZ2lcIixcInNnalwiLFwic2drXCIsXCJzZ2xcIixcInNnbVwiLFwic2duXCIsXCJzZ29cIixcInNncFwiLFwic2dyXCIsXCJzZ3NcIixcInNndFwiLFwic2d1XCIsXCJzZ3dcIixcInNneFwiLFwic2d5XCIsXCJzZ3pcIixcInNoYVwiLFwic2hiXCIsXCJzaGNcIixcInNoZFwiLFwic2hlXCIsXCJzaGdcIixcInNoaFwiLFwic2hpXCIsXCJzaGpcIixcInNoa1wiLFwic2hsXCIsXCJzaG1cIixcInNoblwiLFwic2hvXCIsXCJzaHBcIixcInNocVwiLFwic2hyXCIsXCJzaHNcIixcInNodFwiLFwic2h1XCIsXCJzaHZcIixcInNod1wiLFwic2h4XCIsXCJzaHlcIixcInNoelwiLFwic2lhXCIsXCJzaWJcIixcInNpZFwiLFwic2llXCIsXCJzaWZcIixcInNpZ1wiLFwic2loXCIsXCJzaWlcIixcInNpalwiLFwic2lrXCIsXCJzaWxcIixcInNpbVwiLFwic2lvXCIsXCJzaXBcIixcInNpcVwiLFwic2lyXCIsXCJzaXNcIixcInNpdFwiLFwic2l1XCIsXCJzaXZcIixcInNpd1wiLFwic2l4XCIsXCJzaXlcIixcInNpelwiLFwic2phXCIsXCJzamJcIixcInNqZFwiLFwic2plXCIsXCJzamdcIixcInNqa1wiLFwic2psXCIsXCJzam1cIixcInNqblwiLFwic2pvXCIsXCJzanBcIixcInNqclwiLFwic2pzXCIsXCJzanRcIixcInNqdVwiLFwic2p3XCIsXCJza2FcIixcInNrYlwiLFwic2tjXCIsXCJza2RcIixcInNrZVwiLFwic2tmXCIsXCJza2dcIixcInNraFwiLFwic2tpXCIsXCJza2pcIixcInNra1wiLFwic2ttXCIsXCJza25cIixcInNrb1wiLFwic2twXCIsXCJza3FcIixcInNrclwiLFwic2tzXCIsXCJza3RcIixcInNrdVwiLFwic2t2XCIsXCJza3dcIixcInNreFwiLFwic2t5XCIsXCJza3pcIixcInNsYVwiLFwic2xjXCIsXCJzbGRcIixcInNsZVwiLFwic2xmXCIsXCJzbGdcIixcInNsaFwiLFwic2xpXCIsXCJzbGpcIixcInNsbFwiLFwic2xtXCIsXCJzbG5cIixcInNscFwiLFwic2xxXCIsXCJzbHJcIixcInNsc1wiLFwic2x0XCIsXCJzbHVcIixcInNsd1wiLFwic2x4XCIsXCJzbHlcIixcInNselwiLFwic21hXCIsXCJzbWJcIixcInNtY1wiLFwic21kXCIsXCJzbWZcIixcInNtZ1wiLFwic21oXCIsXCJzbWlcIixcInNtalwiLFwic21rXCIsXCJzbWxcIixcInNtbVwiLFwic21uXCIsXCJzbXBcIixcInNtcVwiLFwic21yXCIsXCJzbXNcIixcInNtdFwiLFwic211XCIsXCJzbXZcIixcInNtd1wiLFwic214XCIsXCJzbXlcIixcInNtelwiLFwic25iXCIsXCJzbmNcIixcInNuZVwiLFwic25mXCIsXCJzbmdcIixcInNuaFwiLFwic25pXCIsXCJzbmpcIixcInNua1wiLFwic25sXCIsXCJzbm1cIixcInNublwiLFwic25vXCIsXCJzbnBcIixcInNucVwiLFwic25yXCIsXCJzbnNcIixcInNudVwiLFwic252XCIsXCJzbndcIixcInNueFwiLFwic255XCIsXCJzbnpcIixcInNvYVwiLFwic29iXCIsXCJzb2NcIixcInNvZFwiLFwic29lXCIsXCJzb2dcIixcInNvaFwiLFwic29pXCIsXCJzb2pcIixcInNva1wiLFwic29sXCIsXCJzb25cIixcInNvb1wiLFwic29wXCIsXCJzb3FcIixcInNvclwiLFwic29zXCIsXCJzb3VcIixcInNvdlwiLFwic293XCIsXCJzb3hcIixcInNveVwiLFwic296XCIsXCJzcGJcIixcInNwY1wiLFwic3BkXCIsXCJzcGVcIixcInNwZ1wiLFwic3BpXCIsXCJzcGtcIixcInNwbFwiLFwic3BtXCIsXCJzcG5cIixcInNwb1wiLFwic3BwXCIsXCJzcHFcIixcInNwclwiLFwic3BzXCIsXCJzcHRcIixcInNwdVwiLFwic3B2XCIsXCJzcHhcIixcInNweVwiLFwic3FhXCIsXCJzcWhcIixcInNxalwiLFwic3FrXCIsXCJzcW1cIixcInNxblwiLFwic3FvXCIsXCJzcXFcIixcInNxclwiLFwic3FzXCIsXCJzcXRcIixcInNxdVwiLFwic3F4XCIsXCJzcmFcIixcInNyYlwiLFwic3JjXCIsXCJzcmVcIixcInNyZlwiLFwic3JnXCIsXCJzcmhcIixcInNyaVwiLFwic3JrXCIsXCJzcmxcIixcInNybVwiLFwic3JuXCIsXCJzcm9cIixcInNycVwiLFwic3JyXCIsXCJzcnNcIixcInNydFwiLFwic3J1XCIsXCJzcnZcIixcInNyd1wiLFwic3J4XCIsXCJzcnlcIixcInNyelwiLFwic3NhXCIsXCJzc2JcIixcInNzY1wiLFwic3NkXCIsXCJzc2VcIixcInNzZlwiLFwic3NnXCIsXCJzc2hcIixcInNzaVwiLFwic3NqXCIsXCJzc2tcIixcInNzbFwiLFwic3NtXCIsXCJzc25cIixcInNzb1wiLFwic3NwXCIsXCJzc3FcIixcInNzclwiLFwic3NzXCIsXCJzc3RcIixcInNzdVwiLFwic3N2XCIsXCJzc3hcIixcInNzeVwiLFwic3N6XCIsXCJzdGFcIixcInN0YlwiLFwic3RkXCIsXCJzdGVcIixcInN0ZlwiLFwic3RnXCIsXCJzdGhcIixcInN0aVwiLFwic3RqXCIsXCJzdGtcIixcInN0bFwiLFwic3RtXCIsXCJzdG5cIixcInN0b1wiLFwic3RwXCIsXCJzdHFcIixcInN0clwiLFwic3RzXCIsXCJzdHRcIixcInN0dVwiLFwic3R2XCIsXCJzdHdcIixcInN0eVwiLFwic3VhXCIsXCJzdWJcIixcInN1Y1wiLFwic3VlXCIsXCJzdWdcIixcInN1aVwiLFwic3VqXCIsXCJzdWtcIixcInN1bFwiLFwic3VtXCIsXCJzdW9cIixcInN1cVwiLFwic3VyXCIsXCJzdXNcIixcInN1dFwiLFwic3V2XCIsXCJzdXdcIixcInN1eFwiLFwic3V5XCIsXCJzdXpcIixcInN2YVwiLFwic3ZiXCIsXCJzdmNcIixcInN2ZVwiLFwic3ZrXCIsXCJzdm1cIixcInN2clwiLFwic3ZzXCIsXCJzdnhcIixcInN3YlwiLFwic3djXCIsXCJzd2ZcIixcInN3Z1wiLFwic3doXCIsXCJzd2lcIixcInN3alwiLFwic3drXCIsXCJzd2xcIixcInN3bVwiLFwic3duXCIsXCJzd29cIixcInN3cFwiLFwic3dxXCIsXCJzd3JcIixcInN3c1wiLFwic3d0XCIsXCJzd3VcIixcInN3dlwiLFwic3d3XCIsXCJzd3hcIixcInN3eVwiLFwic3hiXCIsXCJzeGNcIixcInN4ZVwiLFwic3hnXCIsXCJzeGtcIixcInN4bFwiLFwic3htXCIsXCJzeG5cIixcInN4b1wiLFwic3hyXCIsXCJzeHNcIixcInN4dVwiLFwic3h3XCIsXCJzeWFcIixcInN5YlwiLFwic3ljXCIsXCJzeWRcIixcInN5aVwiLFwic3lrXCIsXCJzeWxcIixcInN5bVwiLFwic3luXCIsXCJzeW9cIixcInN5clwiLFwic3lzXCIsXCJzeXdcIixcInN5eFwiLFwic3l5XCIsXCJzemFcIixcInN6YlwiLFwic3pjXCIsXCJzemRcIixcInN6ZVwiLFwic3pnXCIsXCJzemxcIixcInN6blwiLFwic3pwXCIsXCJzenNcIixcInN6dlwiLFwic3p3XCIsXCJzenlcIl1cbixbIFwidGFcIixcInRlXCIsXCJ0Z1wiLFwidGhcIixcInRpXCIsXCJ0a1wiLFwidGxcIixcInRuXCIsXCJ0b1wiLFwidHJcIixcInRzXCIsXCJ0dFwiLFwidHdcIixcInR5XCIsXCJ0YWFcIixcInRhYlwiLFwidGFjXCIsXCJ0YWRcIixcInRhZVwiLFwidGFmXCIsXCJ0YWdcIixcInRhaVwiLFwidGFqXCIsXCJ0YWtcIixcInRhbFwiLFwidGFuXCIsXCJ0YW9cIixcInRhcFwiLFwidGFxXCIsXCJ0YXJcIixcInRhc1wiLFwidGF1XCIsXCJ0YXZcIixcInRhd1wiLFwidGF4XCIsXCJ0YXlcIixcInRhelwiLFwidGJhXCIsXCJ0YmJcIixcInRiY1wiLFwidGJkXCIsXCJ0YmVcIixcInRiZlwiLFwidGJnXCIsXCJ0YmhcIixcInRiaVwiLFwidGJqXCIsXCJ0YmtcIixcInRibFwiLFwidGJtXCIsXCJ0Ym5cIixcInRib1wiLFwidGJwXCIsXCJ0YnFcIixcInRiclwiLFwidGJzXCIsXCJ0YnRcIixcInRidVwiLFwidGJ2XCIsXCJ0YndcIixcInRieFwiLFwidGJ5XCIsXCJ0YnpcIixcInRjYVwiLFwidGNiXCIsXCJ0Y2NcIixcInRjZFwiLFwidGNlXCIsXCJ0Y2ZcIixcInRjZ1wiLFwidGNoXCIsXCJ0Y2lcIixcInRja1wiLFwidGNsXCIsXCJ0Y21cIixcInRjblwiLFwidGNvXCIsXCJ0Y3BcIixcInRjcVwiLFwidGNzXCIsXCJ0Y3RcIixcInRjdVwiLFwidGN3XCIsXCJ0Y3hcIixcInRjeVwiLFwidGN6XCIsXCJ0ZGFcIixcInRkYlwiLFwidGRjXCIsXCJ0ZGRcIixcInRkZVwiLFwidGRmXCIsXCJ0ZGdcIixcInRkaFwiLFwidGRpXCIsXCJ0ZGpcIixcInRka1wiLFwidGRsXCIsXCJ0ZG1cIixcInRkblwiLFwidGRvXCIsXCJ0ZHFcIixcInRkclwiLFwidGRzXCIsXCJ0ZHRcIixcInRkdVwiLFwidGR2XCIsXCJ0ZHhcIixcInRkeVwiLFwidGVhXCIsXCJ0ZWJcIixcInRlY1wiLFwidGVkXCIsXCJ0ZWVcIixcInRlZlwiLFwidGVnXCIsXCJ0ZWhcIixcInRlaVwiLFwidGVrXCIsXCJ0ZW1cIixcInRlblwiLFwidGVvXCIsXCJ0ZXBcIixcInRlcVwiLFwidGVyXCIsXCJ0ZXNcIixcInRldFwiLFwidGV1XCIsXCJ0ZXZcIixcInRld1wiLFwidGV4XCIsXCJ0ZXlcIixcInRlelwiLFwidGZpXCIsXCJ0Zm5cIixcInRmb1wiLFwidGZyXCIsXCJ0ZnRcIixcInRnYVwiLFwidGdiXCIsXCJ0Z2NcIixcInRnZFwiLFwidGdlXCIsXCJ0Z2ZcIixcInRnZ1wiLFwidGdoXCIsXCJ0Z2lcIixcInRnalwiLFwidGduXCIsXCJ0Z29cIixcInRncFwiLFwidGdxXCIsXCJ0Z3JcIixcInRnc1wiLFwidGd0XCIsXCJ0Z3VcIixcInRndlwiLFwidGd3XCIsXCJ0Z3hcIixcInRneVwiLFwidGd6XCIsXCJ0aGNcIixcInRoZFwiLFwidGhlXCIsXCJ0aGZcIixcInRoaFwiLFwidGhpXCIsXCJ0aGtcIixcInRobFwiLFwidGhtXCIsXCJ0aG5cIixcInRocFwiLFwidGhxXCIsXCJ0aHJcIixcInRoc1wiLFwidGh0XCIsXCJ0aHVcIixcInRodlwiLFwidGh3XCIsXCJ0aHhcIixcInRoeVwiLFwidGh6XCIsXCJ0aWFcIixcInRpY1wiLFwidGlkXCIsXCJ0aWVcIixcInRpZlwiLFwidGlnXCIsXCJ0aWhcIixcInRpaVwiLFwidGlqXCIsXCJ0aWtcIixcInRpbFwiLFwidGltXCIsXCJ0aW5cIixcInRpb1wiLFwidGlwXCIsXCJ0aXFcIixcInRpc1wiLFwidGl0XCIsXCJ0aXVcIixcInRpdlwiLFwidGl3XCIsXCJ0aXhcIixcInRpeVwiLFwidGl6XCIsXCJ0amFcIixcInRqZ1wiLFwidGppXCIsXCJ0ampcIixcInRqbFwiLFwidGptXCIsXCJ0am5cIixcInRqb1wiLFwidGpwXCIsXCJ0anNcIixcInRqdVwiLFwidGp3XCIsXCJ0a2FcIixcInRrYlwiLFwidGtkXCIsXCJ0a2VcIixcInRrZlwiLFwidGtnXCIsXCJ0a2tcIixcInRrbFwiLFwidGttXCIsXCJ0a25cIixcInRrcFwiLFwidGtxXCIsXCJ0a3JcIixcInRrc1wiLFwidGt0XCIsXCJ0a3VcIixcInRrdlwiLFwidGt3XCIsXCJ0a3hcIixcInRrelwiLFwidGxhXCIsXCJ0bGJcIixcInRsY1wiLFwidGxkXCIsXCJ0bGZcIixcInRsZ1wiLFwidGxoXCIsXCJ0bGlcIixcInRsalwiLFwidGxrXCIsXCJ0bGxcIixcInRsbVwiLFwidGxuXCIsXCJ0bG9cIixcInRscFwiLFwidGxxXCIsXCJ0bHJcIixcInRsc1wiLFwidGx0XCIsXCJ0bHVcIixcInRsdlwiLFwidGx3XCIsXCJ0bHhcIixcInRseVwiLFwidG1hXCIsXCJ0bWJcIixcInRtY1wiLFwidG1kXCIsXCJ0bWVcIixcInRtZlwiLFwidG1nXCIsXCJ0bWhcIixcInRtaVwiLFwidG1qXCIsXCJ0bWtcIixcInRtbFwiLFwidG1tXCIsXCJ0bW5cIixcInRtb1wiLFwidG1wXCIsXCJ0bXFcIixcInRtclwiLFwidG1zXCIsXCJ0bXRcIixcInRtdVwiLFwidG12XCIsXCJ0bXdcIixcInRteVwiLFwidG16XCIsXCJ0bmFcIixcInRuYlwiLFwidG5jXCIsXCJ0bmRcIixcInRuZVwiLFwidG5mXCIsXCJ0bmdcIixcInRuaFwiLFwidG5pXCIsXCJ0bmtcIixcInRubFwiLFwidG5tXCIsXCJ0bm5cIixcInRub1wiLFwidG5wXCIsXCJ0bnFcIixcInRuclwiLFwidG5zXCIsXCJ0bnRcIixcInRudVwiLFwidG52XCIsXCJ0bndcIixcInRueFwiLFwidG55XCIsXCJ0bnpcIixcInRvYlwiLFwidG9jXCIsXCJ0b2RcIixcInRvZVwiLFwidG9mXCIsXCJ0b2dcIixcInRvaFwiLFwidG9pXCIsXCJ0b2pcIixcInRvbFwiLFwidG9tXCIsXCJ0b29cIixcInRvcFwiLFwidG9xXCIsXCJ0b3JcIixcInRvc1wiLFwidG91XCIsXCJ0b3ZcIixcInRvd1wiLFwidG94XCIsXCJ0b3lcIixcInRvelwiLFwidHBhXCIsXCJ0cGNcIixcInRwZVwiLFwidHBmXCIsXCJ0cGdcIixcInRwaVwiLFwidHBqXCIsXCJ0cGtcIixcInRwbFwiLFwidHBtXCIsXCJ0cG5cIixcInRwb1wiLFwidHBwXCIsXCJ0cHFcIixcInRwclwiLFwidHB0XCIsXCJ0cHVcIixcInRwdlwiLFwidHB3XCIsXCJ0cHhcIixcInRweVwiLFwidHB6XCIsXCJ0cWJcIixcInRxbFwiLFwidHFtXCIsXCJ0cW5cIixcInRxb1wiLFwidHFwXCIsXCJ0cXFcIixcInRxclwiLFwidHF0XCIsXCJ0cXVcIixcInRxd1wiLFwidHJhXCIsXCJ0cmJcIixcInRyY1wiLFwidHJkXCIsXCJ0cmVcIixcInRyZlwiLFwidHJnXCIsXCJ0cmhcIixcInRyaVwiLFwidHJqXCIsXCJ0cmtcIixcInRybFwiLFwidHJtXCIsXCJ0cm5cIixcInRyb1wiLFwidHJwXCIsXCJ0cnFcIixcInRyclwiLFwidHJzXCIsXCJ0cnRcIixcInRydVwiLFwidHJ2XCIsXCJ0cndcIixcInRyeFwiLFwidHJ5XCIsXCJ0cnpcIixcInRzYVwiLFwidHNiXCIsXCJ0c2NcIixcInRzZFwiLFwidHNlXCIsXCJ0c2ZcIixcInRzZ1wiLFwidHNoXCIsXCJ0c2lcIixcInRzalwiLFwidHNrXCIsXCJ0c2xcIixcInRzbVwiLFwidHNwXCIsXCJ0c3FcIixcInRzclwiLFwidHNzXCIsXCJ0c3RcIixcInRzdVwiLFwidHN2XCIsXCJ0c3dcIixcInRzeFwiLFwidHN5XCIsXCJ0c3pcIixcInR0YVwiLFwidHRiXCIsXCJ0dGNcIixcInR0ZFwiLFwidHRlXCIsXCJ0dGZcIixcInR0Z1wiLFwidHRoXCIsXCJ0dGlcIixcInR0alwiLFwidHRrXCIsXCJ0dGxcIixcInR0bVwiLFwidHRuXCIsXCJ0dG9cIixcInR0cFwiLFwidHRxXCIsXCJ0dHJcIixcInR0c1wiLFwidHR0XCIsXCJ0dHVcIixcInR0dlwiLFwidHR3XCIsXCJ0dHlcIixcInR0elwiLFwidHVhXCIsXCJ0dWJcIixcInR1Y1wiLFwidHVkXCIsXCJ0dWVcIixcInR1ZlwiLFwidHVnXCIsXCJ0dWhcIixcInR1aVwiLFwidHVqXCIsXCJ0dWxcIixcInR1bVwiLFwidHVuXCIsXCJ0dW9cIixcInR1cFwiLFwidHVxXCIsXCJ0dXNcIixcInR1dFwiLFwidHV1XCIsXCJ0dXZcIixcInR1d1wiLFwidHV4XCIsXCJ0dXlcIixcInR1elwiLFwidHZhXCIsXCJ0dmRcIixcInR2ZVwiLFwidHZrXCIsXCJ0dmxcIixcInR2bVwiLFwidHZuXCIsXCJ0dm9cIixcInR2c1wiLFwidHZ0XCIsXCJ0dnVcIixcInR2d1wiLFwidHZ4XCIsXCJ0dnlcIixcInR3YVwiLFwidHdiXCIsXCJ0d2NcIixcInR3ZFwiLFwidHdlXCIsXCJ0d2ZcIixcInR3Z1wiLFwidHdoXCIsXCJ0d2xcIixcInR3bVwiLFwidHduXCIsXCJ0d29cIixcInR3cFwiLFwidHdxXCIsXCJ0d3JcIixcInR3dFwiLFwidHd1XCIsXCJ0d3dcIixcInR3eFwiLFwidHd5XCIsXCJ0eGFcIixcInR4YlwiLFwidHhjXCIsXCJ0eGVcIixcInR4Z1wiLFwidHhoXCIsXCJ0eGlcIixcInR4alwiLFwidHhtXCIsXCJ0eG5cIixcInR4b1wiLFwidHhxXCIsXCJ0eHJcIixcInR4c1wiLFwidHh0XCIsXCJ0eHVcIixcInR4eFwiLFwidHh5XCIsXCJ0eWFcIixcInR5ZVwiLFwidHloXCIsXCJ0eWlcIixcInR5alwiLFwidHlsXCIsXCJ0eW5cIixcInR5cFwiLFwidHlyXCIsXCJ0eXNcIixcInR5dFwiLFwidHl1XCIsXCJ0eXZcIixcInR5eFwiLFwidHl5XCIsXCJ0eXpcIixcInR6YVwiLFwidHpoXCIsXCJ0empcIixcInR6bFwiLFwidHptXCIsXCJ0em5cIixcInR6b1wiLFwidHp4XCJdXG4sWyBcInVnXCIsXCJ1a1wiLFwidXJcIixcInV6XCIsXCJ1YW1cIixcInVhblwiLFwidWFyXCIsXCJ1YmFcIixcInViaVwiLFwidWJsXCIsXCJ1YnJcIixcInVidVwiLFwidWJ5XCIsXCJ1ZGFcIixcInVkZVwiLFwidWRnXCIsXCJ1ZGlcIixcInVkalwiLFwidWRsXCIsXCJ1ZG1cIixcInVkdVwiLFwidWVzXCIsXCJ1ZmlcIixcInVnYVwiLFwidWdiXCIsXCJ1Z2VcIixcInVnblwiLFwidWdvXCIsXCJ1Z3lcIixcInVoYVwiLFwidWhuXCIsXCJ1aXNcIixcInVpdlwiLFwidWppXCIsXCJ1a2FcIixcInVrZ1wiLFwidWtoXCIsXCJ1a2lcIixcInVra1wiLFwidWtsXCIsXCJ1a3BcIixcInVrcVwiLFwidWtzXCIsXCJ1a3VcIixcInVrdlwiLFwidWt3XCIsXCJ1a3lcIixcInVsYVwiLFwidWxiXCIsXCJ1bGNcIixcInVsZVwiLFwidWxmXCIsXCJ1bGlcIixcInVsa1wiLFwidWxsXCIsXCJ1bG1cIixcInVsblwiLFwidWx1XCIsXCJ1bHdcIixcInVtYVwiLFwidW1iXCIsXCJ1bWNcIixcInVtZFwiLFwidW1nXCIsXCJ1bWlcIixcInVtbVwiLFwidW1uXCIsXCJ1bW9cIixcInVtcFwiLFwidW1yXCIsXCJ1bXNcIixcInVtdVwiLFwidW5hXCIsXCJ1bmRcIixcInVuZVwiLFwidW5nXCIsXCJ1bmlcIixcInVua1wiLFwidW5tXCIsXCJ1bm5cIixcInVucFwiLFwidW5yXCIsXCJ1bnVcIixcInVueFwiLFwidW56XCIsXCJ1b2tcIixcInVwaVwiLFwidXB2XCIsXCJ1cmFcIixcInVyYlwiLFwidXJjXCIsXCJ1cmVcIixcInVyZlwiLFwidXJnXCIsXCJ1cmhcIixcInVyaVwiLFwidXJqXCIsXCJ1cmtcIixcInVybFwiLFwidXJtXCIsXCJ1cm5cIixcInVyb1wiLFwidXJwXCIsXCJ1cnJcIixcInVydFwiLFwidXJ1XCIsXCJ1cnZcIixcInVyd1wiLFwidXJ4XCIsXCJ1cnlcIixcInVyelwiLFwidXNhXCIsXCJ1c2hcIixcInVzaVwiLFwidXNrXCIsXCJ1c3BcIixcInVzc1wiLFwidXN1XCIsXCJ1dGFcIixcInV0ZVwiLFwidXRoXCIsXCJ1dHBcIixcInV0clwiLFwidXR1XCIsXCJ1dW1cIixcInV1blwiLFwidXVyXCIsXCJ1dXVcIixcInV2ZVwiLFwidXZoXCIsXCJ1dmxcIixcInV3YVwiLFwidXlhXCIsXCJ1em5cIixcInV6c1wiXVxuLFsgXCJ2ZVwiLFwidmlcIixcInZvXCIsXCJ2YWFcIixcInZhZVwiLFwidmFmXCIsXCJ2YWdcIixcInZhaFwiLFwidmFpXCIsXCJ2YWpcIixcInZhbFwiLFwidmFtXCIsXCJ2YW5cIixcInZhb1wiLFwidmFwXCIsXCJ2YXJcIixcInZhc1wiLFwidmF1XCIsXCJ2YXZcIixcInZheVwiLFwidmJiXCIsXCJ2YmtcIixcInZlY1wiLFwidmVkXCIsXCJ2ZWxcIixcInZlbVwiLFwidmVvXCIsXCJ2ZXBcIixcInZlclwiLFwidmdyXCIsXCJ2Z3RcIixcInZpY1wiLFwidmlkXCIsXCJ2aWZcIixcInZpZ1wiLFwidmlsXCIsXCJ2aW5cIixcInZpc1wiLFwidml0XCIsXCJ2aXZcIixcInZrYVwiLFwidmtpXCIsXCJ2a2pcIixcInZra1wiLFwidmtsXCIsXCJ2a21cIixcInZrblwiLFwidmtvXCIsXCJ2a3BcIixcInZrdFwiLFwidmt1XCIsXCJ2a3pcIixcInZscFwiLFwidmxzXCIsXCJ2bWFcIixcInZtYlwiLFwidm1jXCIsXCJ2bWRcIixcInZtZVwiLFwidm1mXCIsXCJ2bWdcIixcInZtaFwiLFwidm1pXCIsXCJ2bWpcIixcInZta1wiLFwidm1sXCIsXCJ2bW1cIixcInZtcFwiLFwidm1xXCIsXCJ2bXJcIixcInZtc1wiLFwidm11XCIsXCJ2bXZcIixcInZtd1wiLFwidm14XCIsXCJ2bXlcIixcInZtelwiLFwidm5rXCIsXCJ2bm1cIixcInZucFwiLFwidm9yXCIsXCJ2b3RcIixcInZyYVwiLFwidnJvXCIsXCJ2cnNcIixcInZydFwiLFwidnNpXCIsXCJ2c2xcIixcInZzdlwiLFwidnRvXCIsXCJ2dW1cIixcInZ1blwiLFwidnV0XCIsXCJ2d2FcIl1cbixbIFwid2FcIixcIndvXCIsXCJ3YWFcIixcIndhYlwiLFwid2FjXCIsXCJ3YWRcIixcIndhZVwiLFwid2FmXCIsXCJ3YWdcIixcIndhaFwiLFwid2FpXCIsXCJ3YWpcIixcIndha1wiLFwid2FsXCIsXCJ3YW1cIixcIndhblwiLFwid2FvXCIsXCJ3YXBcIixcIndhcVwiLFwid2FyXCIsXCJ3YXNcIixcIndhdFwiLFwid2F1XCIsXCJ3YXZcIixcIndhd1wiLFwid2F4XCIsXCJ3YXlcIixcIndhelwiLFwid2JhXCIsXCJ3YmJcIixcIndiZVwiLFwid2JmXCIsXCJ3YmhcIixcIndiaVwiLFwid2JqXCIsXCJ3YmtcIixcIndibFwiLFwid2JtXCIsXCJ3YnBcIixcIndicVwiLFwid2JyXCIsXCJ3YnNcIixcIndidFwiLFwid2J2XCIsXCJ3YndcIixcIndjYVwiLFwid2NpXCIsXCJ3ZGRcIixcIndkZ1wiLFwid2RqXCIsXCJ3ZGtcIixcIndkdVwiLFwid2R5XCIsXCJ3ZWFcIixcIndlY1wiLFwid2VkXCIsXCJ3ZWdcIixcIndlaFwiLFwid2VpXCIsXCJ3ZW1cIixcIndlblwiLFwid2VvXCIsXCJ3ZXBcIixcIndlclwiLFwid2VzXCIsXCJ3ZXRcIixcIndldVwiLFwid2V3XCIsXCJ3ZmdcIixcIndnYVwiLFwid2diXCIsXCJ3Z2dcIixcIndnaVwiLFwid2dvXCIsXCJ3Z3VcIixcIndnd1wiLFwid2d5XCIsXCJ3aGFcIixcIndoZ1wiLFwid2hrXCIsXCJ3aHVcIixcIndpYlwiLFwid2ljXCIsXCJ3aWVcIixcIndpZlwiLFwid2lnXCIsXCJ3aWhcIixcIndpaVwiLFwid2lqXCIsXCJ3aWtcIixcIndpbFwiLFwid2ltXCIsXCJ3aW5cIixcIndpclwiLFwid2l0XCIsXCJ3aXVcIixcIndpdlwiLFwid2l3XCIsXCJ3aXlcIixcIndqYVwiLFwid2ppXCIsXCJ3a2FcIixcIndrYlwiLFwid2tkXCIsXCJ3a2xcIixcIndrclwiLFwid2t1XCIsXCJ3a3dcIixcIndreVwiLFwid2xhXCIsXCJ3bGNcIixcIndsZVwiLFwid2xnXCIsXCJ3bGhcIixcIndsaVwiLFwid2xrXCIsXCJ3bGxcIixcIndsbVwiLFwid2xvXCIsXCJ3bHJcIixcIndsc1wiLFwid2x1XCIsXCJ3bHZcIixcIndsd1wiLFwid2x4XCIsXCJ3bHlcIixcIndtYVwiLFwid21iXCIsXCJ3bWNcIixcIndtZFwiLFwid21lXCIsXCJ3bWdcIixcIndtaFwiLFwid21pXCIsXCJ3bW1cIixcIndtblwiLFwid21vXCIsXCJ3bXNcIixcIndtdFwiLFwid213XCIsXCJ3bXhcIixcInduYlwiLFwid25jXCIsXCJ3bmRcIixcInduZVwiLFwid25nXCIsXCJ3bmlcIixcIndua1wiLFwid25tXCIsXCJ3bm5cIixcIndub1wiLFwid25wXCIsXCJ3bnVcIixcIndud1wiLFwid255XCIsXCJ3b2FcIixcIndvYlwiLFwid29jXCIsXCJ3b2RcIixcIndvZVwiLFwid29mXCIsXCJ3b2dcIixcIndvaVwiLFwid29rXCIsXCJ3b21cIixcIndvblwiLFwid29vXCIsXCJ3b3JcIixcIndvc1wiLFwid293XCIsXCJ3b3lcIixcIndwY1wiLFwid3JhXCIsXCJ3cmJcIixcIndyZFwiLFwid3JnXCIsXCJ3cmhcIixcIndyaVwiLFwid3JrXCIsXCJ3cmxcIixcIndybVwiLFwid3JuXCIsXCJ3cm9cIixcIndycFwiLFwid3JyXCIsXCJ3cnNcIixcIndydVwiLFwid3J2XCIsXCJ3cndcIixcIndyeFwiLFwid3J5XCIsXCJ3cnpcIixcIndzYVwiLFwid3NnXCIsXCJ3c2lcIixcIndza1wiLFwid3NyXCIsXCJ3c3NcIixcIndzdVwiLFwid3N2XCIsXCJ3dGZcIixcInd0aFwiLFwid3RpXCIsXCJ3dGtcIixcInd0bVwiLFwid3R3XCIsXCJ3dWFcIixcInd1YlwiLFwid3VkXCIsXCJ3dWhcIixcInd1bFwiLFwid3VtXCIsXCJ3dW5cIixcInd1clwiLFwid3V0XCIsXCJ3dXVcIixcInd1dlwiLFwid3V4XCIsXCJ3dXlcIixcInd3YVwiLFwid3diXCIsXCJ3d29cIixcInd3clwiLFwid3d3XCIsXCJ3eGFcIixcInd4d1wiLFwid3lhXCIsXCJ3eWJcIixcInd5aVwiLFwid3ltXCIsXCJ3eXJcIixcInd5eVwiXVxuLFsgXCJ4aFwiLFwieGFhXCIsXCJ4YWJcIixcInhhY1wiLFwieGFkXCIsXCJ4YWVcIixcInhhZ1wiLFwieGFpXCIsXCJ4YWpcIixcInhha1wiLFwieGFsXCIsXCJ4YW1cIixcInhhblwiLFwieGFvXCIsXCJ4YXBcIixcInhhcVwiLFwieGFyXCIsXCJ4YXNcIixcInhhdFwiLFwieGF1XCIsXCJ4YXZcIixcInhhd1wiLFwieGF5XCIsXCJ4YmFcIixcInhiYlwiLFwieGJjXCIsXCJ4YmRcIixcInhiZVwiLFwieGJnXCIsXCJ4YmlcIixcInhialwiLFwieGJtXCIsXCJ4Ym5cIixcInhib1wiLFwieGJwXCIsXCJ4YnJcIixcInhid1wiLFwieGJ4XCIsXCJ4YnlcIixcInhjYlwiLFwieGNjXCIsXCJ4Y2VcIixcInhjZ1wiLFwieGNoXCIsXCJ4Y2xcIixcInhjbVwiLFwieGNuXCIsXCJ4Y29cIixcInhjclwiLFwieGN0XCIsXCJ4Y3VcIixcInhjdlwiLFwieGN3XCIsXCJ4Y3lcIixcInhkYVwiLFwieGRjXCIsXCJ4ZGtcIixcInhkbVwiLFwieGRvXCIsXCJ4ZHlcIixcInhlYlwiLFwieGVkXCIsXCJ4ZWdcIixcInhlbFwiLFwieGVtXCIsXCJ4ZXBcIixcInhlclwiLFwieGVzXCIsXCJ4ZXRcIixcInhldVwiLFwieGZhXCIsXCJ4Z2FcIixcInhnYlwiLFwieGdkXCIsXCJ4Z2ZcIixcInhnZ1wiLFwieGdpXCIsXCJ4Z2xcIixcInhnbVwiLFwieGduXCIsXCJ4Z3JcIixcInhndVwiLFwieGd3XCIsXCJ4aGFcIixcInhoY1wiLFwieGhkXCIsXCJ4aGVcIixcInhoclwiLFwieGh0XCIsXCJ4aHVcIixcInhodlwiLFwieGlhXCIsXCJ4aWJcIixcInhpaVwiLFwieGlsXCIsXCJ4aW5cIixcInhpcFwiLFwieGlyXCIsXCJ4aXNcIixcInhpdlwiLFwieGl5XCIsXCJ4amJcIixcInhqdFwiLFwieGthXCIsXCJ4a2JcIixcInhrY1wiLFwieGtkXCIsXCJ4a2VcIixcInhrZlwiLFwieGtnXCIsXCJ4a2hcIixcInhraVwiLFwieGtqXCIsXCJ4a2tcIixcInhrbFwiLFwieGtuXCIsXCJ4a29cIixcInhrcFwiLFwieGtxXCIsXCJ4a3JcIixcInhrc1wiLFwieGt0XCIsXCJ4a3VcIixcInhrdlwiLFwieGt3XCIsXCJ4a3hcIixcInhreVwiLFwieGt6XCIsXCJ4bGFcIixcInhsYlwiLFwieGxjXCIsXCJ4bGRcIixcInhsZVwiLFwieGxnXCIsXCJ4bGlcIixcInhsblwiLFwieGxvXCIsXCJ4bHBcIixcInhsc1wiLFwieGx1XCIsXCJ4bHlcIixcInhtYVwiLFwieG1iXCIsXCJ4bWNcIixcInhtZFwiLFwieG1lXCIsXCJ4bWZcIixcInhtZ1wiLFwieG1oXCIsXCJ4bWpcIixcInhta1wiLFwieG1sXCIsXCJ4bW1cIixcInhtblwiLFwieG1vXCIsXCJ4bXBcIixcInhtcVwiLFwieG1yXCIsXCJ4bXNcIixcInhtdFwiLFwieG11XCIsXCJ4bXZcIixcInhtd1wiLFwieG14XCIsXCJ4bXlcIixcInhtelwiLFwieG5hXCIsXCJ4bmJcIixcInhuZFwiLFwieG5nXCIsXCJ4bmhcIixcInhuaVwiLFwieG5qXCIsXCJ4bmtcIixcInhubVwiLFwieG5uXCIsXCJ4bm9cIixcInhucVwiLFwieG5yXCIsXCJ4bnNcIixcInhudFwiLFwieG51XCIsXCJ4bnlcIixcInhuelwiLFwieG9jXCIsXCJ4b2RcIixcInhvZ1wiLFwieG9pXCIsXCJ4b2tcIixcInhvbVwiLFwieG9uXCIsXCJ4b29cIixcInhvcFwiLFwieG9yXCIsXCJ4b3dcIixcInhwYVwiLFwieHBiXCIsXCJ4cGNcIixcInhwZFwiLFwieHBlXCIsXCJ4cGZcIixcInhwZ1wiLFwieHBoXCIsXCJ4cGlcIixcInhwalwiLFwieHBrXCIsXCJ4cGxcIixcInhwbVwiLFwieHBuXCIsXCJ4cG9cIixcInhwcFwiLFwieHBxXCIsXCJ4cHJcIixcInhwc1wiLFwieHB0XCIsXCJ4cHVcIixcInhwdlwiLFwieHB3XCIsXCJ4cHhcIixcInhweVwiLFwieHB6XCIsXCJ4cWFcIixcInhxdFwiLFwieHJhXCIsXCJ4cmJcIixcInhyZFwiLFwieHJlXCIsXCJ4cmdcIixcInhyaVwiLFwieHJtXCIsXCJ4cm5cIixcInhycVwiLFwieHJyXCIsXCJ4cnRcIixcInhydVwiLFwieHJ3XCIsXCJ4c2FcIixcInhzYlwiLFwieHNjXCIsXCJ4c2RcIixcInhzZVwiLFwieHNoXCIsXCJ4c2lcIixcInhzalwiLFwieHNsXCIsXCJ4c21cIixcInhzblwiLFwieHNvXCIsXCJ4c3BcIixcInhzcVwiLFwieHNyXCIsXCJ4c3NcIixcInhzdVwiLFwieHN2XCIsXCJ4c3lcIixcInh0YVwiLFwieHRiXCIsXCJ4dGNcIixcInh0ZFwiLFwieHRlXCIsXCJ4dGdcIixcInh0aFwiLFwieHRpXCIsXCJ4dGpcIixcInh0bFwiLFwieHRtXCIsXCJ4dG5cIixcInh0b1wiLFwieHRwXCIsXCJ4dHFcIixcInh0clwiLFwieHRzXCIsXCJ4dHRcIixcInh0dVwiLFwieHR2XCIsXCJ4dHdcIixcInh0eVwiLFwieHR6XCIsXCJ4dWFcIixcInh1YlwiLFwieHVkXCIsXCJ4dWdcIixcInh1alwiLFwieHVsXCIsXCJ4dW1cIixcInh1blwiLFwieHVvXCIsXCJ4dXBcIixcInh1clwiLFwieHV0XCIsXCJ4dXVcIixcInh2ZVwiLFwieHZpXCIsXCJ4dm5cIixcInh2b1wiLFwieHZzXCIsXCJ4d2FcIixcInh3Y1wiLFwieHdkXCIsXCJ4d2VcIixcInh3Z1wiLFwieHdqXCIsXCJ4d2tcIixcInh3bFwiLFwieHdvXCIsXCJ4d3JcIixcInh3dFwiLFwieHd3XCIsXCJ4eGJcIixcInh4a1wiLFwieHhtXCIsXCJ4eHJcIixcInh4dFwiLFwieHlhXCIsXCJ4eWJcIixcInh5alwiLFwieHlrXCIsXCJ4eWxcIixcInh5dFwiLFwieHl5XCIsXCJ4emhcIixcInh6bVwiLFwieHpwXCJdXG4sWyBcInlpXCIsXCJ5b1wiLFwieWFhXCIsXCJ5YWJcIixcInlhY1wiLFwieWFkXCIsXCJ5YWVcIixcInlhZlwiLFwieWFnXCIsXCJ5YWhcIixcInlhaVwiLFwieWFqXCIsXCJ5YWtcIixcInlhbFwiLFwieWFtXCIsXCJ5YW5cIixcInlhb1wiLFwieWFwXCIsXCJ5YXFcIixcInlhclwiLFwieWFzXCIsXCJ5YXRcIixcInlhdVwiLFwieWF2XCIsXCJ5YXdcIixcInlheFwiLFwieWF5XCIsXCJ5YXpcIixcInliYVwiLFwieWJiXCIsXCJ5YmRcIixcInliZVwiLFwieWJoXCIsXCJ5YmlcIixcInlialwiLFwieWJrXCIsXCJ5YmxcIixcInlibVwiLFwieWJuXCIsXCJ5Ym9cIixcInlieFwiLFwieWJ5XCIsXCJ5Y2hcIixcInljbFwiLFwieWNuXCIsXCJ5Y3BcIixcInlkYVwiLFwieWRkXCIsXCJ5ZGVcIixcInlkZ1wiLFwieWRrXCIsXCJ5ZHNcIixcInllYVwiLFwieWVjXCIsXCJ5ZWVcIixcInllaVwiLFwieWVqXCIsXCJ5ZWxcIixcInllblwiLFwieWVyXCIsXCJ5ZXNcIixcInlldFwiLFwieWV1XCIsXCJ5ZXZcIixcInlleVwiLFwieWdhXCIsXCJ5Z2lcIixcInlnbFwiLFwieWdtXCIsXCJ5Z3BcIixcInlnclwiLFwieWdzXCIsXCJ5Z3VcIixcInlnd1wiLFwieWhhXCIsXCJ5aGRcIixcInlobFwiLFwieWhzXCIsXCJ5aWFcIixcInlpZlwiLFwieWlnXCIsXCJ5aWhcIixcInlpaVwiLFwieWlqXCIsXCJ5aWtcIixcInlpbFwiLFwieWltXCIsXCJ5aW5cIixcInlpcFwiLFwieWlxXCIsXCJ5aXJcIixcInlpc1wiLFwieWl0XCIsXCJ5aXVcIixcInlpdlwiLFwieWl4XCIsXCJ5aXlcIixcInlpelwiLFwieWthXCIsXCJ5a2dcIixcInlraVwiLFwieWtrXCIsXCJ5a2xcIixcInlrbVwiLFwieWtuXCIsXCJ5a29cIixcInlrclwiLFwieWt0XCIsXCJ5a3VcIixcInlreVwiLFwieWxhXCIsXCJ5bGJcIixcInlsZVwiLFwieWxnXCIsXCJ5bGlcIixcInlsbFwiLFwieWxtXCIsXCJ5bG5cIixcInlsb1wiLFwieWxyXCIsXCJ5bHVcIixcInlseVwiLFwieW1hXCIsXCJ5bWJcIixcInltY1wiLFwieW1kXCIsXCJ5bWVcIixcInltZ1wiLFwieW1oXCIsXCJ5bWlcIixcInlta1wiLFwieW1sXCIsXCJ5bW1cIixcInltblwiLFwieW1vXCIsXCJ5bXBcIixcInltcVwiLFwieW1yXCIsXCJ5bXNcIixcInltdFwiLFwieW14XCIsXCJ5bXpcIixcInluYVwiLFwieW5kXCIsXCJ5bmVcIixcInluZ1wiLFwieW5oXCIsXCJ5bmtcIixcInlubFwiLFwieW5uXCIsXCJ5bm9cIixcInlucVwiLFwieW5zXCIsXCJ5bnVcIixcInlvYlwiLFwieW9nXCIsXCJ5b2lcIixcInlva1wiLFwieW9sXCIsXCJ5b21cIixcInlvblwiLFwieW9zXCIsXCJ5b3RcIixcInlveFwiLFwieW95XCIsXCJ5cGFcIixcInlwYlwiLFwieXBnXCIsXCJ5cGhcIixcInlwa1wiLFwieXBtXCIsXCJ5cG5cIixcInlwb1wiLFwieXBwXCIsXCJ5cHpcIixcInlyYVwiLFwieXJiXCIsXCJ5cmVcIixcInlyaVwiLFwieXJrXCIsXCJ5cmxcIixcInlybVwiLFwieXJuXCIsXCJ5cm9cIixcInlyc1wiLFwieXJ3XCIsXCJ5cnlcIixcInlzY1wiLFwieXNkXCIsXCJ5c2dcIixcInlzbFwiLFwieXNtXCIsXCJ5c25cIixcInlzb1wiLFwieXNwXCIsXCJ5c3JcIixcInlzc1wiLFwieXN5XCIsXCJ5dGFcIixcInl0bFwiLFwieXRwXCIsXCJ5dHdcIixcInl0eVwiLFwieXVhXCIsXCJ5dWJcIixcInl1Y1wiLFwieXVkXCIsXCJ5dWVcIixcInl1ZlwiLFwieXVnXCIsXCJ5dWlcIixcInl1alwiLFwieXVrXCIsXCJ5dWxcIixcInl1bVwiLFwieXVuXCIsXCJ5dXBcIixcInl1cVwiLFwieXVyXCIsXCJ5dXRcIixcInl1dVwiLFwieXV3XCIsXCJ5dXhcIixcInl1eVwiLFwieXV6XCIsXCJ5dmFcIixcInl2dFwiLFwieXdhXCIsXCJ5d2dcIixcInl3bFwiLFwieXduXCIsXCJ5d3FcIixcInl3clwiLFwieXd0XCIsXCJ5d3VcIixcInl3d1wiLFwieXhhXCIsXCJ5eGdcIixcInl4bFwiLFwieXhtXCIsXCJ5eHVcIixcInl4eVwiLFwieXlyXCIsXCJ5eXVcIixcInl5elwiLFwieXpnXCIsXCJ5emtcIl1cbixbIFwiemFcIixcInpoXCIsXCJ6dVwiLFwiemFhXCIsXCJ6YWJcIixcInphY1wiLFwiemFkXCIsXCJ6YWVcIixcInphZlwiLFwiemFnXCIsXCJ6YWhcIixcInphaVwiLFwiemFqXCIsXCJ6YWtcIixcInphbFwiLFwiemFtXCIsXCJ6YW9cIixcInphcFwiLFwiemFxXCIsXCJ6YXJcIixcInphc1wiLFwiemF0XCIsXCJ6YXVcIixcInphdlwiLFwiemF3XCIsXCJ6YXhcIixcInpheVwiLFwiemF6XCIsXCJ6YmFcIixcInpiY1wiLFwiemJlXCIsXCJ6YmxcIixcInpidFwiLFwiemJ1XCIsXCJ6YndcIixcInpjYVwiLFwiemNoXCIsXCJ6ZGpcIixcInplYVwiLFwiemVnXCIsXCJ6ZWhcIixcInplblwiLFwiemdhXCIsXCJ6Z2JcIixcInpnaFwiLFwiemdtXCIsXCJ6Z25cIixcInpnclwiLFwiemhiXCIsXCJ6aGRcIixcInpoaVwiLFwiemhuXCIsXCJ6aHdcIixcInpoeFwiLFwiemlhXCIsXCJ6aWJcIixcInppa1wiLFwiemlsXCIsXCJ6aW1cIixcInppblwiLFwiemlyXCIsXCJ6aXdcIixcInppelwiLFwiemthXCIsXCJ6a2JcIixcInprZFwiLFwiemtnXCIsXCJ6a2hcIixcInpra1wiLFwiemtuXCIsXCJ6a29cIixcInprcFwiLFwiemtyXCIsXCJ6a3RcIixcInprdVwiLFwiemt2XCIsXCJ6a3pcIixcInpsYVwiLFwiemxlXCIsXCJ6bGpcIixcInpsbVwiLFwiemxuXCIsXCJ6bHFcIixcInpsc1wiLFwiemx3XCIsXCJ6bWFcIixcInptYlwiLFwiem1jXCIsXCJ6bWRcIixcInptZVwiLFwiem1mXCIsXCJ6bWdcIixcInptaFwiLFwiem1pXCIsXCJ6bWpcIixcInpta1wiLFwiem1sXCIsXCJ6bW1cIixcInptblwiLFwiem1vXCIsXCJ6bXBcIixcInptcVwiLFwiem1yXCIsXCJ6bXNcIixcInptdFwiLFwiem11XCIsXCJ6bXZcIixcInptd1wiLFwiem14XCIsXCJ6bXlcIixcInptelwiLFwiem5hXCIsXCJ6bmRcIixcInpuZVwiLFwiem5nXCIsXCJ6bmtcIixcInpuc1wiLFwiem9jXCIsXCJ6b2hcIixcInpvbVwiLFwiem9vXCIsXCJ6b3FcIixcInpvclwiLFwiem9zXCIsXCJ6cGFcIixcInpwYlwiLFwienBjXCIsXCJ6cGRcIixcInpwZVwiLFwienBmXCIsXCJ6cGdcIixcInpwaFwiLFwienBpXCIsXCJ6cGpcIixcInpwa1wiLFwienBsXCIsXCJ6cG1cIixcInpwblwiLFwienBvXCIsXCJ6cHBcIixcInpwcVwiLFwienByXCIsXCJ6cHNcIixcInpwdFwiLFwienB1XCIsXCJ6cHZcIixcInpwd1wiLFwienB4XCIsXCJ6cHlcIixcInpwelwiLFwienFlXCIsXCJ6cmFcIixcInpyZ1wiLFwienJuXCIsXCJ6cm9cIixcInpycFwiLFwienJzXCIsXCJ6c2FcIixcInpza1wiLFwienNsXCIsXCJ6c21cIixcInpzclwiLFwienN1XCIsXCJ6dGVcIixcInp0Z1wiLFwienRsXCIsXCJ6dG1cIixcInp0blwiLFwienRwXCIsXCJ6dHFcIixcInp0c1wiLFwienR0XCIsXCJ6dHVcIixcInp0eFwiLFwienR5XCIsXCJ6dWFcIixcInp1aFwiLFwienVtXCIsXCJ6dW5cIixcInp1eVwiLFwiendhXCIsXCJ6eHhcIixcInp5YlwiLFwienlnXCIsXCJ6eWpcIixcInp5blwiLFwienlwXCIsXCJ6emFcIixcInp6alwiXVxuXTtcblxuXG5leHBvcnQgY2xhc3MgTGFuZ1V0aWwge1xuXG4gICAgLyogRGV0ZXJtaW5lIGlmIGdpdmVuIHN0cmluZyBpcyBhIHZhbGlkIEJDUCA0NyBzdHJpbmcgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzQmNwNDcobGFuZ1N0cjogc3RyaW5nKSA6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gL14oKFthLXpBLVpdezIsM30oLVthLXpBLVpdKC1bYS16QS1aXXszfSl7MCwyfSk/fFthLXpBLVpdezR9fFthLXpBLVpdezUsOH0pKC1bYS16QS1aXXs0fSk/KC0oW2EtekEtWl17Mn18WzAtOV17M30pKT8oLShbMC05YS16QS1aXXs1LDh9fFswLTldW2EtekEtWl17M30pKSooLVswLTlhLXd5LXpBLVdZLVpdKC1bYS16QS1aMC05XXsyLDh9KSspKigteCgtW2EtekEtWjAtOV17MSw4fSkrKT98eCgtW2EtekEtWjAtOV17MSw4fSkrfChlbi1HQi1vZWR8aS1hbWl8aS1ibm58aS1kZWZhdWx0fGktZW5vY2hpYW58aS1oYWt8aS1rbGluZ29ufGktbHV4fGktbWluZ298aS1uYXZham98aS1wd258aS10YW98aS10YXl8aS10c3V8c2duLUJFLUZSfHNnbi1CRS1OTHxzZ24tQ0gtREV8YXJ0LWxvamJhbnxjZWwtZ2F1bGlzaHxuby1ib2t8bm8tbnlufHpoLWd1b3l1fHpoLWhha2thfHpoLW1pbnx6aC1taW4tbmFufHpoLXhpYW5nKSkkLy50ZXN0KGxhbmdTdHIpXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyB2YWxpZFByaW1hcnlMYW5nKGxhbmdTdHI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgcHJpbWFyeSA9IGxhbmdTdHIudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKHByaW1hcnkuaW5jbHVkZXMoXCItXCIpKSB7XG4gICAgICAgICAgICBwcmltYXJ5ID0gcHJpbWFyeS5zcGxpdChcIi1cIilbMF07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXByaW1hcnkubWF0Y2goL1thLXpdezIsM30vKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIC8vIHFhYS4ucXR6XG4gICAgICAgIGlmIChwcmltYXJ5Lmxlbmd0aCA9PT0gMyBcbiAgICAgICAgICAgICYmIHByaW1hcnkuY2hhckF0KDApID09PSBcInFcIlxuICAgICAgICAgICAgJiYgcHJpbWFyeS5jaGFyQ29kZUF0KDEpID49IDk3ICYmIHByaW1hcnkuY2hhckNvZGVBdCgxKSA8PSAxMTZcbiAgICAgICAgICAgICYmIHByaW1hcnkuY2hhckNvZGVBdCgyKSA+PSA5NyAmJiBwcmltYXJ5LmNoYXJDb2RlQXQoMikgPD0gMTIyKSB7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbGlkUHJpbWFyeUxhbmdzW3ByaW1hcnkuY2hhckNvZGVBdCgwKS05N10uaW5jbHVkZXMocHJpbWFyeSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBtYXRjaFByaW1hcnlMYW5nKGxhbmcxOiBzdHJpbmcsIGxhbmcyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgbGV0IHByaW1hcnkxID0gbGFuZzE7XG4gICAgICAgIGlmIChwcmltYXJ5MS5pbmNsdWRlcyhcIi1cIikpIHtcbiAgICAgICAgICAgIHByaW1hcnkxID0gcHJpbWFyeTEuc3BsaXQoXCItXCIpWzBdO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHByaW1hcnkyID0gbGFuZzI7XG4gICAgICAgIGlmIChwcmltYXJ5Mi5pbmNsdWRlcyhcIi1cIikpIHtcbiAgICAgICAgICAgIHByaW1hcnkyID0gcHJpbWFyeTIuc3BsaXQoXCItXCIpWzBdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHByaW1hcnkxLnRvTG93ZXJDYXNlKCkgPT09IHByaW1hcnkyLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMC0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgSU1hcHBlciwgSU1hcFJlc3VsdCwgQm91bmRzIH0gZnJvbSBcIi4uL2FwaS9JTWFwcGVyXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vZG9tL0RPTVdhbGtlclwiO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ29tbW9uTWFwcGVyIGltcGxlbWVudHMgSU1hcHBlciB7XG4gICAgYWJzdHJhY3QgZ2V0Um9sZShub2RlOiBOb2RlKSA6IHN0cmluZztcbiAgICBhYnN0cmFjdCBnZXROYW1lc3BhY2UoKSA6IHN0cmluZztcbiAgICBhYnN0cmFjdCBnZXRBdHRyaWJ1dGVzKG5vZGU6IE5vZGUpIDogeyBba2V5OnN0cmluZ106IHN0cmluZyB9O1xuXG4gICAgcHJvdGVjdGVkIGhpZXJhcmNoeVJvbGUgOiBzdHJpbmdbXSA9IG51bGw7XG4gICAgcHJvdGVjdGVkIGhpZXJhcmNoeVBhdGg6IEFycmF5PHtcbiAgICAgICAgcm9sZVBhdGg6IHN0cmluZyxcbiAgICAgICAgcm9sZUNvdW50OiB7XG4gICAgICAgICAgICBbcm9sZTogc3RyaW5nXTogbnVtYmVyXG4gICAgICAgIH1cbiAgICB9PiA9IG51bGw7XG4gICAgcHJvdGVjdGVkIGhpZXJhcmNoeVJlc3VsdHM6IElNYXBSZXN1bHRbXSA9IG51bGw7XG5cbiAgICBnZXRCb3VuZHMobm9kZTogTm9kZSkgOiBCb3VuZHMge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXNldChub2RlOiBOb2RlKSB7XG4gICAgICAgIHRoaXMuaGllcmFyY2h5Um9sZSA9IFtdO1xuICAgICAgICB0aGlzLmhpZXJhcmNoeVJlc3VsdHMgPSBbXTtcbiAgICAgICAgdGhpcy5oaWVyYXJjaHlQYXRoID0gW3tcbiAgICAgICAgICAgIHJvbGVQYXRoOiBcIlwiLFxuICAgICAgICAgICAgcm9sZUNvdW50OiB7fVxuICAgICAgICB9XTtcblxuICAgICAgICBsZXQgYW5jZXN0b3JzIDogTm9kZVtdID0gW107XG4gICAgICAgIGxldCBwYXJlbnQgPSBET01XYWxrZXIucGFyZW50Tm9kZShub2RlKTtcbiAgICAgICAgd2hpbGUgKHBhcmVudCAmJiBwYXJlbnQubm9kZVR5cGUgIT0gOSAvKiBOb2RlLkRPQ1VNRU5UX05PREUgKi8pIHtcbiAgICAgICAgICAgIGFuY2VzdG9ycy5wdXNoKHBhcmVudCk7XG4gICAgICAgICAgICBwYXJlbnQgPSBET01XYWxrZXIucGFyZW50Tm9kZShwYXJlbnQpO1xuICAgICAgICB9XG4gICAgICAgIGFuY2VzdG9ycyA9IGFuY2VzdG9ycy5yZXZlcnNlKCk7XG4gICAgICAgIGZvciAoY29uc3QgYW5jZXN0b3Igb2YgYW5jZXN0b3JzKSB7XG4gICAgICAgICAgICBsZXQgc2libGluZ3MgPSBbXTtcbiAgICAgICAgICAgIGxldCBzaWJsaW5nID0gYW5jZXN0b3IucHJldmlvdXNTaWJsaW5nO1xuICAgICAgICAgICAgd2hpbGUgKHNpYmxpbmcpIHtcbiAgICAgICAgICAgICAgICBzaWJsaW5ncy5wdXNoKHNpYmxpbmcpO1xuICAgICAgICAgICAgICAgIHNpYmxpbmcgPSBzaWJsaW5nLnByZXZpb3VzU2libGluZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNpYmxpbmdzID0gc2libGluZ3MucmV2ZXJzZSgpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBzaWJsaW5nIG9mIHNpYmxpbmdzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wdXNoSGllcmFyY2h5KHNpYmxpbmcpO1xuICAgICAgICAgICAgICAgIHRoaXMucG9wSGllcmFyY2h5KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnB1c2hIaWVyYXJjaHkoYW5jZXN0b3IpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHB1c2hIaWVyYXJjaHkobm9kZTogTm9kZSkge1xuICAgICAgICBsZXQgcm9sZSA6IHN0cmluZyA9IHRoaXMuZ2V0Um9sZShub2RlKSB8fCBudWxsO1xuICAgICAgICB0aGlzLmhpZXJhcmNoeVJvbGUucHVzaChyb2xlKTtcbiAgICAgICAgaWYgKHJvbGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGxldCBwYXJlbnRQYXRoSW5mbyA9IHRoaXMuaGllcmFyY2h5UGF0aFt0aGlzLmhpZXJhcmNoeVBhdGgubGVuZ3RoLTFdO1xuICAgICAgICAgICAgcGFyZW50UGF0aEluZm8ucm9sZUNvdW50W3JvbGVdID0gKHBhcmVudFBhdGhJbmZvLnJvbGVDb3VudFtyb2xlXSB8fCAwKSArIDE7IFxuICAgICAgICAgICAgdGhpcy5oaWVyYXJjaHlQYXRoLnB1c2goe1xuICAgICAgICAgICAgICAgIFwicm9sZVBhdGhcIjogcGFyZW50UGF0aEluZm8ucm9sZVBhdGgrXCIvXCIrcm9sZStcIltcIitwYXJlbnRQYXRoSW5mby5yb2xlQ291bnRbcm9sZV0rXCJdXCIsXG4gICAgICAgICAgICAgICAgXCJyb2xlQ291bnRcIjoge31cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGF0dHIgPSB7fVxuICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgYXR0ciA9IHRoaXMuZ2V0QXR0cmlidXRlcyhub2RlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmhpZXJhcmNoeVJlc3VsdHMucHVzaCh7XG4gICAgICAgICAgICBub2RlOiBub2RlLFxuICAgICAgICAgICAgbmFtZXNwYWNlOiB0aGlzLmdldE5hbWVzcGFjZSgpLFxuICAgICAgICAgICAgcm9sZTogcm9sZSxcbiAgICAgICAgICAgIGF0dHJpYnV0ZXM6IGF0dHIsXG4gICAgICAgICAgICByb2xlUGF0aDogdGhpcy5oaWVyYXJjaHlQYXRoW3RoaXMuaGllcmFyY2h5UGF0aC5sZW5ndGgtMV0ucm9sZVBhdGgsXG4gICAgICAgICAgICBib3VuZHM6IHRoaXMuZ2V0Qm91bmRzKG5vZGUpXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHBvcEhpZXJhcmNoeSgpIHtcbiAgICAgICAgbGV0IHJvbGUgPSB0aGlzLmhpZXJhcmNoeVJvbGUucG9wKCk7XG4gICAgICAgIGlmIChyb2xlICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmhpZXJhcmNoeVBhdGgucG9wKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5oaWVyYXJjaHlSZXN1bHRzLnBvcCgpO1xuICAgIH1cblxuICAgIG9wZW5TY29wZShub2RlOiBOb2RlKTogSU1hcFJlc3VsdFtdIHtcbiAgICAgICAgaWYgKHRoaXMuaGllcmFyY2h5Um9sZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5yZXNldChub2RlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnB1c2hIaWVyYXJjaHkobm9kZSlcblxuICAgICAgICByZXR1cm4gdGhpcy5oaWVyYXJjaHlSZXN1bHRzO1xuICAgIH1cblxuICAgIGNsb3NlU2NvcGUobm9kZTogTm9kZSk6IElNYXBSZXN1bHRbXSB7XG4gICAgICAgIGxldCByZXRWYWwgOiBJTWFwUmVzdWx0W10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCByZXMgb2YgdGhpcy5oaWVyYXJjaHlSZXN1bHRzKSB7XG4gICAgICAgICAgICAvLyBjb25zdCB0ZW1wID0gcmVzLm5vZGU7XG4gICAgICAgICAgICAvLyByZXMubm9kZSA9IG51bGw7XG4gICAgICAgICAgICAvLyBsZXQgY2xvbmVkID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShyZXMpKTtcbiAgICAgICAgICAgIC8vIGNsb25lZC5ub2RlID0gcmVzLm5vZGUgPSB0ZW1wOyBcbiAgICAgICAgICAgIC8vIHJldFZhbC5wdXNoKGNsb25lZCk7XG4gICAgICAgICAgICByZXRWYWwucHVzaChyZXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldFZhbFtyZXRWYWwubGVuZ3RoLTFdLnJvbGUgPSBcIi9cIityZXRWYWxbcmV0VmFsLmxlbmd0aC0xXS5yb2xlXG4gICAgICAgIHRoaXMucG9wSGllcmFyY2h5KCk7XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBJTWFwUmVzdWx0IH0gZnJvbSBcIi4uL2FwaS9JTWFwcGVyXCI7XG5pbXBvcnQgeyBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSUVuZ2luZVwiO1xuXG4vLyBDb250ZXh0IHRoYXQgd2lsbCBjYXVzZSB0aGlzIHJ1bGUgdG8gZXhlY3V0ZS4gXG4vLyBDb250ZXh0IHN5bnRheDpcbi8vICAgVHJpZ2dlcnM6XG4vLyAgICAgYXJpYTpyb2xlIC0gVHJpZ2dlcnMgb24gZWxlbWVudCB3aXRoIEFSSUEgcm9sZSByb2xlXG4vLyAgICAgYXJpYTpyb2xlW2F0dHJpYnV0ZV0gLSBUcmlnZ2VycyBvbiBlbGVtZW50cyB3aXRoIHRoZSBlcXVpdmFsZW50IGxvZ2ljYWwgXG4vLyAgICAgICBhcmlhLSBhdHRyaWJ1dGUgKGUuZy4sIGJ1dHRvbltkaXNhYmxlZF0gd2lsbCB0cmlnZ2VyIG9uIFxuLy8gICAgICAgPGJ1dHRvbiBkaXNhYmxlZD4gb3IgPGRpdiByb2xlPVwiYnV0dG9uXCIgYXJpYS1kaXNhYmxlZD1cInRydWVcIj4pXG4vLyAgICAgcm9sZVthdHRyaWJ1dGU9dmFsdWVdIC0gU2ltaWxhciB0byBhYm92ZSwgd2l0aCBjYXNlLXNlbnNpdGl2ZSBtYXRjaFxuLy8gICAgICAgdG8gdmFsdWVcbi8vICAgICByb2xlW2F0dHJpYnV0ZX52YWx1ZV0gLSBTaW1pbGFyIHRvIGFib3ZlLCB3aXRoIGNhc2UtaW5zZW5zaXRpdmUgbWF0Y2hcbi8vICAgICBkb206ZWxlbWVudCAtIFRyaWdnZXJzIG9uIGFuIGVsZW1lbnQgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWVcbi8vICAgICBkb206ZWxlbWVudFthdHRyaWJ1dGVdIC0gVHJpZ2dlcnMgb24gYSBkb20gZWxlbWVudCB3aXRoIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlXG4vLyAgICAgZG9tOipbYXR0cmlidXRlXSAtIFRyaWdnZXJzIG9uIGFsbCBlbGVtZW50cyB3aXRoIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlXG4vLyAgIENvbWJpbmluZyB0cmlnZ2Vyczpcbi8vICAgICB0cmlnZ2VyMSB0cmlnZ2VyMiAtIFRyaWdnZXJzIG9uIGVsZW1lbnRzIHdpdGggdHJpZ2dlcjIgd2l0aGluIGFuIFxuLy8gICAgICAgZWxlbWVudCB3aXRoIHRyaWdnZXIxXG4vLyAgICAgIXRyaWdnZXIxIHRyaWdnZXIyIC0gVHJpZ2dlcnMgb24gZWxlbWVudHMgd2l0aCB0cmlnZ2VyMiBub3Qgd2l0aGluXG4vLyAgICAgICBlbGVtZW50IHdpdGggdHJpZ2dlcjFcbi8vICAgICB0cmlnZ2VyMT50cmlnZ2VyMiAtIFRyaWdnZXJzIG9uIGVsZW1lbnRzIHdpdGggdHJpZ2dlcjIgd2l0aCBhblxuLy8gICAgICAgYW4gaW1tZWRpYXRlIHBhcmVudCB3aXRoIHRyaWdnZXIxXG4vLyAgICAgdHJpZ2dlcjErdHJpZ2dlcjIgLSBUcmlnZ2VycyBvbiBlbGVtZW50cyB3aXRoIHRyaWdnZXIyIHdpdGggYW5cbi8vICAgICAgIGltbWVkaWF0ZSBwcmV2aW91cyBzaWJsaW5nIHdpdGggdHJpZ2dlcjFcbi8vICAgICB0cmlnZ2VyMX50cmlnZ2VyMiAtIFRyaWdnZXJzIG9uIGVsZW1lbnRzIHdpdGggdHJpZ2dlcjIgd2l0aCBhblxuLy8gICAgICAgc29tZSBlYXJsaWVyIHNpYmxpbmcgd2l0aCB0cmlnZ2VyMVxuLy8gICAgIGNvbnRleHQsY29udGV4dCAtIFRyaWdnZXJzIG9uIGVsZW1lbnRzIHdpdGggZWl0aGVyIGNvbnRleHRcbmV4cG9ydCBjbGFzcyBBdHRySW5mbyB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBpbmNsdXNpdmU6IGJvb2xlYW4sXG4gICAgICAgIHB1YmxpYyBhdHRyOiBzdHJpbmcsXG4gICAgICAgIHB1YmxpYyBlcT86IHN0cmluZyxcbiAgICAgICAgcHVibGljIHZhbHVlPzogc3RyaW5nXG4gICAgKSB7XG4gICAgICAgIGlmICghaW5jbHVzaXZlIFxuICAgICAgICAgICAgICAgICYmICgodHlwZW9mIGVxKSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBlcS5sZW5ndGggPiAwKSlcbiAgICAgICAge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGhhdmUgIWF0dHJcIitlcStcIiBjb250ZXh0XCIpOyAgICBcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5jbHVzaXZlICYmICh0eXBlb2YgZXEpICE9PSBcInVuZGVmaW5lZFwiICYmIGVxLmxlbmd0aCA+IDAgJiYgKCh0eXBlb2YgdmFsdWUpID09PSBcInVuZGVmaW5lZFwiIHx8IHZhbHVlLmxlbmd0aCA9PT0gMCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBoYXZlIGVxdWl2YWxlbmNlIGNoZWNrIHdpdGhvdXQgYSB2YWx1ZVwiKTsgICAgXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgbWF0Y2hlcyhjb250ZXh0OiBJTWFwUmVzdWx0KSB7XG4gICAgICAgIGNvbnN0IHJ1bGVBdHRyUGFydCA9IHRoaXM7IFxuICAgICAgICBjb25zdCBlbGVtQXR0cnMgPSBjb250ZXh0LmF0dHJpYnV0ZXM7XG4gICAgICAgIGlmICghKHJ1bGVBdHRyUGFydC5hdHRyIGluIGVsZW1BdHRycykpIHtcbiAgICAgICAgICAgIHJldHVybiAhcnVsZUF0dHJQYXJ0LmluY2x1c2l2ZVxuICAgICAgICB9IGVsc2UgaWYgKCFydWxlQXR0clBhcnQuaW5jbHVzaXZlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0gZWxzZSBpZiAoIXJ1bGVBdHRyUGFydC5lcSkge1xuICAgICAgICAgICAgLy8gaW5jbHVzaXZlIG1hdGNoIGFuZCBJIGhhdmUgdGhhdCBhdHRyaWJ1dGUgYW5kIG5vIGVxdWl2YWxlbmNlIGRlZmluZWRcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gaW5jbHVzaXZlIG1hdGNoIGFuZCBJIGhhdmUgdGhhdCBhdHRyaWJ1dGUgYW5kIGVxdWl2YWxlbmNlIGRlZmluZWRcbiAgICAgICAgICAgIGNvbnN0IGF0dHJWYWx1ZSA9IGVsZW1BdHRyc1tydWxlQXR0clBhcnQuYXR0cl07XG4gICAgICAgICAgICBpZiAocnVsZUF0dHJQYXJ0LmVxID09PSBcIj1cIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBydWxlQXR0clBhcnQudmFsdWUgPT09IGF0dHJWYWx1ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocnVsZUF0dHJQYXJ0LmVxID09PSBcIiE9XCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcnVsZUF0dHJQYXJ0LnZhbHVlICE9PSBhdHRyVmFsdWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJ1bGVBdHRyUGFydC5lcSA9PT0gXCJ+XCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcnVsZUF0dHJQYXJ0LnZhbHVlID09PSBhdHRyVmFsdWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJ1bGVBdHRyUGFydC5lcSA9PT0gXCIhflwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJ1bGVBdHRyUGFydC52YWx1ZSAhPT0gYXR0clZhbHVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb250ZXh0IGVxdWl2YWxlbmNlIG9wZXJhdG9yIG5vdCBzdXBwb3J0ZWRcIilcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFBhcnRJbmZvIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIGluY2x1c2l2ZTogYm9vbGVhbiwgXG4gICAgICAgIHB1YmxpYyBuYW1lc3BhY2U6IHN0cmluZyxcbiAgICAgICAgcHVibGljIHJvbGU6IHN0cmluZywgXG4gICAgICAgIHB1YmxpYyBhdHRyczogQXR0ckluZm9bXSwgXG4gICAgICAgIHB1YmxpYyBjb25uZWN0b3I6IHN0cmluZykge1xuICAgICAgICAgICAgaWYgKHJvbGUgPT09IFwiKlwiICYmICFpbmNsdXNpdmUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCIhKiBjb250ZXh0IG5vdCBzdXBwb3J0ZWRcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgIHB1YmxpYyBtYXRjaGVzKCBcbiAgICAgICAgY29udGV4dEhpZXI6IFJ1bGVDb250ZXh0SGllcmFyY2h5LFxuICAgICAgICBoaWVyTGV2ZWw6IG51bWJlcikgOiBib29sZWFuIFxuICAgIHtcbiAgICAgICAgY29uc3QgcnVsZVBhcnQgPSB0aGlzO1xuICAgICAgICBsZXQgcnVsZVJvbGVNYXRjaCA9IChydWxlUGFydC5uYW1lc3BhY2UgaW4gY29udGV4dEhpZXIpICYmIGNvbnRleHRIaWVyW3J1bGVQYXJ0Lm5hbWVzcGFjZV1baGllckxldmVsXVxuICAgICAgICAgICAgJiYgKGNvbnRleHRIaWVyW3J1bGVQYXJ0Lm5hbWVzcGFjZV1baGllckxldmVsXS5yb2xlID09PSBydWxlUGFydC5yb2xlXG4gICAgICAgICAgICAgICAgfHwgY29udGV4dEhpZXJbcnVsZVBhcnQubmFtZXNwYWNlXVtoaWVyTGV2ZWxdLnJvbGUgIT09IFwibm9uZVwiICYmIHJ1bGVQYXJ0LnJvbGUgPT09IFwiKlwiKTtcbiAgICAgICAgaWYgKHJ1bGVSb2xlTWF0Y2ggXG4gICAgICAgICAgICAmJiBydWxlUGFydC5yb2xlID09PSBcIipcIiBcbiAgICAgICAgICAgICYmIHJ1bGVQYXJ0Lm5hbWVzcGFjZSA9PT0gXCJkb21cIiBcbiAgICAgICAgICAgICYmIChjb250ZXh0SGllcltydWxlUGFydC5uYW1lc3BhY2VdW2hpZXJMZXZlbF0ucm9sZSA9PT0gXCIjdGV4dFwiXG4gICAgICAgICAgICAgICAgfHwgY29udGV4dEhpZXJbcnVsZVBhcnQubmFtZXNwYWNlXVtoaWVyTGV2ZWxdLnJvbGUgPT09IFwiLyN0ZXh0XCIpKSB7XG4gICAgICAgICAgICBydWxlUm9sZU1hdGNoID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJ1bGVQYXJ0LmluY2x1c2l2ZSAmJiAhcnVsZVJvbGVNYXRjaCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoIXJ1bGVQYXJ0LmluY2x1c2l2ZSAmJiAhcnVsZVJvbGVNYXRjaCkgcmV0dXJuIHRydWU7XG5cbiAgICAgICAgLy8gTWF0Y2ggdGhlIGF0dHJpYnV0ZXNcbiAgICAgICAgY29uc3QgcnVsZUF0dHJzID0gcnVsZVBhcnQuYXR0cnM7XG4gICAgICAgIGNvbnN0IGVsZW1Db250ZXh0ID0gY29udGV4dEhpZXJbcnVsZVBhcnQubmFtZXNwYWNlXVtoaWVyTGV2ZWxdO1xuICAgICAgICBsZXQgbWF0Y2ggPSB0cnVlO1xuICAgICAgICBmb3IgKGNvbnN0IHJ1bGVBdHRyUGFydCBvZiBydWxlQXR0cnMpIHtcbiAgICAgICAgICAgIG1hdGNoID0gbWF0Y2ggJiYgcnVsZUF0dHJQYXJ0Lm1hdGNoZXMoZWxlbUNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcnVsZVBhcnQuaW5jbHVzaXZlKSBtYXRjaCA9ICFtYXRjaDtcbiAgICAgICAgcmV0dXJuIG1hdGNoO1xuICAgIH1cblxufVxuXG5leHBvcnQgY2xhc3MgQ29udGV4dCB7XG4gICAgY29udGV4dEluZm8gOiBQYXJ0SW5mb1tdID0gW11cblxuICAgIGNvbnN0cnVjdG9yKGNvbnRleHQ6IHN0cmluZykge1xuICAgICAgICBsZXQgY29udGV4dEhpZXJNYXRjaGVzIDogc3RyaW5nW10gPSBjb250ZXh0Lm1hdGNoKC8hP1svYS16QS1aOjAtOSpcXC1fXSsoXFxbW15cXF1dK1xcXSkqWyA+K35dPy9nKTtcbiAgICAgICAgbGV0IHJlc3VsdHMgOiBQYXJ0SW5mb1tdID0gW11cbiAgICAgICAgZm9yIChjb25zdCBwYXJ0IG9mIGNvbnRleHRIaWVyTWF0Y2hlcykge1xuICAgICAgICAgICAgbGV0IHBhcnRzID0gcGFydC5tYXRjaCgvKCE/KShbL2EtekEtWjowLTkqXFwtX10rKSgoXFxbW15cXF1dK1xcXSkqKShbID4rfl0/KS8pO1xuICAgICAgICAgICAgbGV0IGF0dHJJbmZvIDogQXR0ckluZm9bXSA9IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBhdHRyUGFydCBvZiBwYXJ0c1szXS5tYXRjaCgvXFxbKFteXFxdXSspXFxdL2cpIHx8IFtdKSB7XG4gICAgICAgICAgICAgICAgbGV0IGF0dHJQYXJ0cyA9IGF0dHJQYXJ0Lm1hdGNoKC9cXFsoIT8pKFthLXo6QS1aKlxcLV9dKykoIT9bPX5dKT8oW15cXF1dKyk/XFxdLyk7XG4gICAgICAgICAgICAgICAgYXR0ckluZm8ucHVzaChuZXcgQXR0ckluZm8oXG4gICAgICAgICAgICAgICAgICAgIGF0dHJQYXJ0c1sxXSAhPT0gXCIhXCIsXG4gICAgICAgICAgICAgICAgICAgIGF0dHJQYXJ0c1syXS50b0xvd2VyQ2FzZSgpLFxuICAgICAgICAgICAgICAgICAgICBhdHRyUGFydHNbM10sXG4gICAgICAgICAgICAgICAgICAgIGF0dHJQYXJ0c1s0XVxuICAgICAgICAgICAgICAgICkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGFydHNbMl0gPSBwYXJ0c1syXS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgY29uc3QgbnNQYXJ0cyA9IHBhcnRzWzJdLnNwbGl0KFwiOlwiKTtcbiAgICAgICAgICAgIGxldCBpbmNsID0gcGFydHNbMV0gIT09IFwiIVwiO1xuICAgICAgICAgICAgY29uc3QgbnMgPSBuc1BhcnRzLnNoaWZ0KCk7XG4gICAgICAgICAgICBsZXQgcm9sZSA9IG5zUGFydHMuam9pbihcIjpcIik7XG4gICAgICAgICAgICBsZXQgcGFydEluZm8gPSBuZXcgUGFydEluZm8oaW5jbCwgbnMsIHJvbGUsIGF0dHJJbmZvLCBwYXJ0c1twYXJ0cy5sZW5ndGgtMV0pO1xuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHBhcnRJbmZvKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbnRleHRJbmZvID0gcmVzdWx0cztcbiAgICB9XG5cbiAgICBzdGF0aWMgY2xlYW5Db250ZXh0KGNvbnRleHQ6IHN0cmluZykgOiBzdHJpbmcge1xuICAgICAgICBjb250ZXh0ID0gY29udGV4dC50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcbiAgICAgICAgY29udGV4dCA9IGNvbnRleHQucmVwbGFjZSgvICshL2csIFwiICFcIik7XG4gICAgICAgIGNvbnRleHQgPSBjb250ZXh0LnJlcGxhY2UoLyArKFs+K34sXSkvZywgXCIkMVwiKTtcbiAgICAgICAgY29udGV4dCA9IGNvbnRleHQucmVwbGFjZSgvKFs+K34sXSkgKy9nLCBcIiQxXCIpO1xuICAgICAgICBjb250ZXh0ID0gY29udGV4dC5yZXBsYWNlKC8gKy9nLCBcIiBcIik7XG4gICAgICAgIHJldHVybiBjb250ZXh0LnRyaW0oKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgcGFyc2UoY29udGV4dDogc3RyaW5nKSB7XG4gICAgICAgIGxldCBjb250ZXh0cyA9IENvbnRleHQuc3BsaXRNdWx0aXBsZShDb250ZXh0LmNsZWFuQ29udGV4dChjb250ZXh0KSk7XG5cbiAgICAgICAgbGV0IHJldFZhbCA6IENvbnRleHRbXSA9IFtdO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29udGV4dHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGxldCBjdHggPSBuZXcgQ29udGV4dChjb250ZXh0c1tpXSk7XG4gICAgICAgICAgICByZXRWYWwucHVzaChjdHgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlcyBpbml0aWFsIHByb2Nlc3Npbmcgb2Ygc3BsaXR0aW5nIG9uIGNvbW1hIC0gY29udGV4dCxjb250ZXh0XG4gICAgICogQHBhcmFtIGNvbnRleHQgXG4gICAgICovXG4gICAgc3RhdGljIHNwbGl0TXVsdGlwbGUoY29udGV4dDogc3RyaW5nKSA6IHN0cmluZ1tdIHtcbiAgICAgICAgbGV0IGNvbnRleHRzID0gW107XG4gICAgICAgIGlmIChjb250ZXh0KSB7XG4gICAgICAgICAgICBpZiAoY29udGV4dC5pbmRleE9mKFwiLFwiKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0cy5wdXNoKGNvbnRleHQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGMgb2YgY29udGV4dC5zcGxpdChcIixcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dHMucHVzaChjKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbnRleHRzO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgIENvcHlyaWdodDo6IDIwMjAtIElCTSwgSW5jXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi9kb20vRE9NV2Fsa2VyXCI7XG5pbXBvcnQgeyBDb250ZXh0IH0gZnJvbSBcIi4vQ29udGV4dFwiO1xuaW1wb3J0IHsgQ29uZmlnIH0gZnJvbSBcIi4uL2NvbmZpZy9Db25maWdcIjtcbmltcG9ydCB7IERPTU1hcHBlciB9IGZyb20gXCIuLi9kb20vRE9NTWFwcGVyXCI7XG5pbXBvcnQgeyBET01VdGlsIH0gZnJvbSBcIi4uL2RvbS9ET01VdGlsXCI7XG5pbXBvcnQgeyBDYWNoZVV0aWwgfSBmcm9tIFwiLi4vLi4vdjQvdXRpbC9DYWNoZVV0aWxcIjtcbmltcG9ydCB7IElzc3VlLCBSdWxlLCBSdWxlQ29udGV4dCwgUnVsZUNvbnRleHRIaWVyYXJjaHksIFJ1bGVSZXN1bHQsIGVSdWxlQ29uZmlkZW5jZSB9IGZyb20gXCIuLi8uLi92NC9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEhlbHBNYXAsIElFbmdpbmUsIE5sc01hcCB9IGZyb20gXCIuLi8uLi92NC9hcGkvSUVuZ2luZVwiO1xuaW1wb3J0IHsgSU1hcHBlciB9IGZyb20gXCIuLi8uLi92NC9hcGkvSU1hcHBlclwiO1xuaW1wb3J0IHsgUmVwb3J0IH0gZnJvbSBcIi4uLy4uL3Y0L2FwaS9JUmVwb3J0XCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3Y0L3V0aWwvVmlzVXRpbFwiO1xuXG5jbGFzcyBXcmFwcGVkUnVsZSB7XG4gICAgbnM6IHN0cmluZztcbiAgICBpZHg/OiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3RvciAocHVibGljIHJ1bGU6IFJ1bGUsIHB1YmxpYyBwYXJzZWRJbmZvIDogQ29udGV4dCkge1xuICAgICAgICB0aGlzLm5zID0gdGhpcy5wYXJzZWRJbmZvLmNvbnRleHRJbmZvW3RoaXMucGFyc2VkSW5mby5jb250ZXh0SW5mby5sZW5ndGgtMV0ubmFtZXNwYWNlO1xuICAgICAgICBDb25maWcuREVCVUcgJiYgY29uc29sZS5sb2coXCJBZGRlZCBSdWxlOlwiLCBydWxlLmlkLCBKU09OLnN0cmluZ2lmeSh0aGlzLnBhcnNlZEluZm8pKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGNvbnZlcnRpbmcgdGhlIG5vZGUgaW50byBhIHNuaXBwZXQgd2hpY2ggY2FuIGJlIGFkZGVkIHRvIHJlcG9ydC5cbiAgICAgKlxuICAgICAqIE5vdGU6IFRoaXMgZnVuY3Rpb24gd2lsbCB0YWtlIHRoZSBub2RlIGFuZCBleHRyYWN0IHRoZSBub2RlIG5hbWUgYW5kIHRoZSBhdHRyaWJ1dGVzIGFuZCBidWlsZCB0aGUgc25pcHBldCBiYXNlZCBvbiB0aGlzLlxuICAgICAqXG4gICAgICogVE9ETzogRnV0dXJlLCBtYXliZSB3ZSBjYW4gZXh0cmFjdCBtb3JlIHRoZW4ganVzdCBzaW5nbGUgbGluZSwgYWRkIG1vcmUgaW5mbyBvciBldmVuIGFkZCBjbG9zaW5nIHRhZ3MgZXRjLi4uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBub2RlIC0gVGhlIGh0bWwgZWxlbWVudCB0byBjb252ZXJ0IGludG8gZWxlbWVudCBzbmlwcGV0IHdpdGggbm9kZSBuYW1lIGFuZCBhdHRyaWJ1dGVzIG9ubHkuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IG5vZGVTbmlwcGV0IC0gcmV0dXJuIHRoZSBlbGVtZW50IHNuaXBwZXQgb2YgdGhlIGVsZW1lbnQgdGhhdCB3YXMgcHJvdmlkZWQgd2hpY2ggb25seSBjb250YWlucyxcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZW5hbWUgYW5kIGF0dHJpYnV0ZXMuIGkuZS4gPHRhYmxlIGlkPVxcXCJsYXlvdXRfdGFibGUxXFxcIiByb2xlPVxcXCJwcmVzZW50YXRpb25cXFwiPlxuICAgICAqXG4gICAgICogQG1lbWJlck9mIHRoaXNcbiAgICAgKi9cbiAgICBzdGF0aWMgY29udmVydE5vZGVUb1NuaXBwZXQobm9kZSA6IEVsZW1lbnQpIHtcbiAgICAgICAgLy8gVmFyaWFibGUgRGVjbGVyYXRpb25cbiAgICAgICAgdmFyIG5vZGVTbmlwcGV0ID0gJyc7XG5cbiAgICAgICAgLy8gRXh0cmFjdCB0aGUgbm9kZSBuYW1lIGFuZCBhZGQgaXQgdG8gdGhlIG5vZGUgc25pcHBldFxuICAgICAgICBub2RlU25pcHBldCArPSAnPCcgKyBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgLy8gRXh0cmFjdCBhbGwgdGhlIG5vZGUgYXR0cmlidXRlcyBhcyBhbiBhcnJheVxuICAgICAgICB2YXIgbm9kZUF0dHJpYnV0ZXMgPSBub2RlLmF0dHJpYnV0ZXM7XG5cbiAgICAgICAgLy8gSW4gdGhlIGNhc2UgdGhlcmUgYXJlIGF0dHJpYnV0ZXMgb24gdGhpcyBub2RlXG4gICAgICAgIGlmIChub2RlQXR0cmlidXRlcyAhPT0gbnVsbCAmJiB0eXBlb2Ygbm9kZUF0dHJpYnV0ZXMgIT09ICd1bmRlZmluZWQnKSB7XG5cbiAgICAgICAgICAgIC8vIExvb3Agb3ZlciBhbGwgdGhlc2VzIGF0dHJpYnV0ZXMgYW5kIGFkZCB0aGUgbmFtZSBhbmQgdmFsdWUgdG8gdGhlIG5vZGVTbmlwcGV0IHdoaWNoIHdpbGwgYmUgcmV0dXJuZWRcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSBub2RlQXR0cmlidXRlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgICAgIGlmIChub2RlQXR0cmlidXRlc1tpXS5uYW1lID09PSBcImRhdGEtbmFtZXdhbGtcIikgY29udGludWU7XG4gICAgICAgICAgICAgICAgLy8gQWRkIHRoZSBhdHRyaWJ1dGUgbmFtZSBhbmQgdmFsdWUuXG4gICAgICAgICAgICAgICAgbm9kZVNuaXBwZXQgKz0gJyAnICsgbm9kZUF0dHJpYnV0ZXNbaV0ubmFtZSArICc9XCInICsgbm9kZUF0dHJpYnV0ZXNbaV0udmFsdWUgKyAnXCInO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2xvc2UgdGhlIG5vZGVcbiAgICAgICAgbm9kZVNuaXBwZXQgKz0gJz4nO1xuXG4gICAgICAgIC8vIFJldHVybiB0aGUgbm9kZSBzbmlwcGV0XG4gICAgICAgIHJldHVybiBub2RlU25pcHBldDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBmaW5kaW5nIHRoZSBzb3VyY2UgbG9jYXRpb24gZm9yIGEgbm9kZSwgd2hpY2ggY2FuIGJlIGFkZGVkIHRvIGEgcmVwb3J0LlxuICAgICAqIFN1cHBvcnRzIGRlYnVnIGRpcmVjdGl2ZXMgaW4gdGhlIGZvbGxvd2luZyBmb3JtczpcbiAgICAgKiAgIDEuIEFuIGF0dHJpYnV0ZSBvbiB0aGUgZWxlbWVudCBpdHNlbGY6XG4gICAgICogICAgICAgIGlibS1hMTF5LWRlYnVnPVwiZmlsZS50czoxMDo1XCJcbiAgICAgKiAgIDIuIEEgY29tbWVudCBub2RlIHByZWNlZGluZyB0aGUgZWxlbWVudCAoYXMgYSBzaWJsaW5nIG9yIGFuY2VzdG9yIHNpYmxpbmcpOlxuICAgICAqICAgICAgICA8IS0tIGlibS1hMTF5LWRlYnVnOiBmaWxlLnRzOjEwOjUgLS0+XG4gICAgICogICAzLiBBIHdyYXBwZXIgZWxlbWVudCAoZS5nLiBkaXYpIHdob3NlIGZpcnN0IG5vbi13aGl0ZXNwYWNlIGNoaWxkIGlzIHN1Y2ggYSBjb21tZW50IG5vZGUuXG4gICAgICogICA0LiBBbiBhbmNlc3RvciBlbGVtZW50IHRoYXQgY2FycmllcyB0aGUgaWJtLWExMXktZGVidWcgYXR0cmlidXRlLlxuICAgICAqXG4gICAgICogVHJhdmVyc2FsOiBjaGVja3MgdGhlIG5vZGUgaXRzZWxmIGZvciBhbiBpbmxpbmUgYXR0cmlidXRlLCB0aGVuIHNjYW5zIHByZXZpb3VzIHNpYmxpbmdzIGF0XG4gICAgICogZWFjaCBhbmNlc3RvciBsZXZlbCB1cHdhcmQgKGFsc28gY2hlY2tpbmcgZWFjaCBhbmNlc3RvciBlbGVtZW50J3Mgb3duIGlubGluZSBhdHRyaWJ1dGUpLFxuICAgICAqIHN0b3BwaW5nIGlmIGEgYmxhbmsgb3IgJ2VuZCcgbWFya2VyIGlzIGZvdW5kLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtOb2RlfSBub2RlIC0gVGhlIERPTSBub2RlIHRvIGZpbmQgc291cmNlIGluZm8gZm9yXG4gICAgICogQHJldHVybiB7c3RyaW5nIHwgbnVsbH0gLSBUaGUgc291cmNlIGxvY2F0aW9uIHN0cmluZywgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiB0aGlzXG4gICAgICovXG4gICAgc3RhdGljIGNvbnZlcnROb2RlVG9Tb3VyY2Uobm9kZTogTm9kZSwgZW5hYmxlZDogYm9vbGVhbj1mYWxzZSk6IHN0cmluZyB7XG4gICAgICAgIC8vY29uc29sZS5sb2coXCJTb3VyY2UgTWFwIGVuYWJsZWQ6XCIsIGVuYWJsZWQpO1xuICAgICAgICBpZiAoIWVuYWJsZWQgfHwgIW5vZGUpIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgREVCVUdfRElSRUNUSVZFID0gXCJpYm0tYTExeS1kZWJ1Z1wiO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUeXBlZCByZXN1bHQgZnJvbSBleHRyYWN0RGlyZWN0aXZlIHRvIGF2b2lkIHNlbnRpbmVsIHN0cmluZyBjb2xsaXNpb25zLlxuICAgICAgICAgKiAgIHsgZm91bmQ6IGZhbHNlIH0gICAgICAgICAgICDigJQgbm8gZGlyZWN0aXZlIG9uIHRoaXMgbm9kZVxuICAgICAgICAgKiAgIHsgZm91bmQ6IHRydWUsIHN0b3A6IHRydWUgfSDigJQgZGlyZWN0aXZlIGlzIGEgc2NvcGUtZW5kIG1hcmtlciAoYmxhbmsgb3IgJ2VuZCcpXG4gICAgICAgICAqICAgeyBmb3VuZDogdHJ1ZSwgc3RvcDogZmFsc2UsIHNvdXJjZTogc3RyaW5nIH0g4oCUIHZhbGlkIHNvdXJjZSBsb2NhdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgdHlwZSBEaXJlY3RpdmVSZXN1bHQgPVxuICAgICAgICAgICAgfCB7IGZvdW5kOiBmYWxzZSB9XG4gICAgICAgICAgICB8IHsgZm91bmQ6IHRydWU7IHN0b3A6IHRydWUgfVxuICAgICAgICAgICAgfCB7IGZvdW5kOiB0cnVlOyBzdG9wOiBmYWxzZTsgc291cmNlOiBzdHJpbmcgfTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogUGFyc2VzIGEgc291cmNlIHN0cmluZyBpbnRvIGEgRGlyZWN0aXZlUmVzdWx0LlxuICAgICAgICAgKiBUaGUgc291cmNlIGlzIHRoZSBmaW5hbCByZXNvbHZlZCB2YWx1ZSDigJQgYWZ0ZXIgYW55ICc6JyBzZXBhcmF0b3IgaGFzIGFscmVhZHkgYmVlbiBzdHJpcHBlZC5cbiAgICAgICAgICogQSBibGFuayB2YWx1ZSBvciB0aGUgZXhhY3Qgd29yZCAnZW5kJyAoY2FzZS1pbnNlbnNpdGl2ZSkgaXMgYSBzdG9wIG1hcmtlci5cbiAgICAgICAgICovXG4gICAgICAgIGNvbnN0IHBhcnNlU291cmNlID0gZnVuY3Rpb24gKHNvdXJjZTogc3RyaW5nKTogRGlyZWN0aXZlUmVzdWx0IHtcbiAgICAgICAgICAgIGlmICghc291cmNlIHx8IHNvdXJjZS50b0xvd2VyQ2FzZSgpID09PSAnZW5kJykge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IGZvdW5kOiB0cnVlLCBzdG9wOiB0cnVlIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyBmb3VuZDogdHJ1ZSwgc3RvcDogZmFsc2UsIHNvdXJjZSB9O1xuICAgICAgICB9O1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFeHRyYWN0cyB0aGUgZGVidWctZGlyZWN0aXZlIGNvbW1lbnQgdmFsdWUgZnJvbSBhIG5vZGUuXG4gICAgICAgICAqIEhhbmRsZXM6XG4gICAgICAgICAqICAgLSBBIGNvbW1lbnQgbm9kZSBkaXJlY3RseVxuICAgICAgICAgKiAgIC0gQSB3cmFwcGVyIGVsZW1lbnQgKGUuZy4gPGRpdj4pIHdob3NlIGZpcnN0IG5vbi13aGl0ZXNwYWNlIGNoaWxkIGlzIGEgY29tbWVudCBub2RlXG4gICAgICAgICAqXG4gICAgICAgICAqIFJldHVybnMgeyBmb3VuZDogdHJ1ZSwgc3RvcDogdHJ1ZSB9IGlmIHRoZSBkaXJlY3RpdmUgaXMgYmxhbmsgb3IgZXhhY3RseSAnZW5kJyxcbiAgICAgICAgICogcmV0dXJucyB7IGZvdW5kOiB0cnVlLCBzdG9wOiBmYWxzZSwgc291cmNlIH0gaWYgYSB2YWxpZCBzb3VyY2UgaXMgZm91bmQsXG4gICAgICAgICAqIG9yIHJldHVybnMgeyBmb3VuZDogZmFsc2UgfSBpZiBubyBkaXJlY3RpdmUgaXMgcHJlc2VudCBvbiB0aGlzIG5vZGUuXG4gICAgICAgICAqL1xuICAgICAgICBjb25zdCBleHRyYWN0RGlyZWN0aXZlID0gZnVuY3Rpb24gKGVsZW06IE5vZGUgfCBudWxsKTogRGlyZWN0aXZlUmVzdWx0IHtcbiAgICAgICAgICAgIGlmICghZWxlbSkgcmV0dXJuIHsgZm91bmQ6IGZhbHNlIH07XG5cbiAgICAgICAgICAgIGxldCBjb21tZW50VmFsdWU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gICAgICAgICAgICBpZiAoZWxlbS5ub2RlVHlwZSA9PT0gTm9kZS5DT01NRU5UX05PREUpIHtcbiAgICAgICAgICAgICAgICAvLyBEaXJlY3QgY29tbWVudCBub2RlXG4gICAgICAgICAgICAgICAgY29tbWVudFZhbHVlID0gZWxlbS5ub2RlVmFsdWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW0ubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgLy8gRWxlbWVudCB3cmFwcGVyIChlLmcuIDxkaXY+PCEtLSBpYm0tYTExeS1kZWJ1ZzogLi4uIC0tPjwvZGl2PilcbiAgICAgICAgICAgICAgICAvLyBGaW5kIHRoZSBmaXJzdCBub24td2hpdGVzcGFjZSBjaGlsZCBub2RlXG4gICAgICAgICAgICAgICAgbGV0IGNoaWxkID0gZWxlbS5maXJzdENoaWxkO1xuICAgICAgICAgICAgICAgIHdoaWxlIChjaGlsZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIHB1cmUgd2hpdGVzcGFjZSB0ZXh0IG5vZGVzXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQubm9kZVZhbHVlICYmIGNoaWxkLm5vZGVWYWx1ZS50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vbi13aGl0ZXNwYWNlIHRleHQgYmVmb3JlIGEgY29tbWVudCDigJQgbm90IGEgZGlyZWN0aXZlIHdyYXBwZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGlsZC5ub2RlVHlwZSA9PT0gTm9kZS5DT01NRU5UX05PREUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnRWYWx1ZSA9IGNoaWxkLm5vZGVWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQW55IG90aGVyIG5vZGUgdHlwZSBiZWZvcmUgYSBjb21tZW50IOKAlCBub3QgYSBkaXJlY3RpdmUgd3JhcHBlclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2hpbGQgPSBjaGlsZC5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjb21tZW50VmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0cmltbWVkID0gY29tbWVudFZhbHVlLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAvLyBNYXRjaCBleGFjdGx5IFwiaWJtLWExMXktZGVidWdcIiBmb2xsb3dlZCBieSBlbmQtb2Ytc3RyaW5nLCB3aGl0ZXNwYWNlLCBvciAnOidcbiAgICAgICAgICAgICAgICAvLyBUaGlzIHByZXZlbnRzIFwiaWJtLWExMXktZGVidWctZXh0cmFcIiBmcm9tIGJlaW5nIHRyZWF0ZWQgYXMgYSBkaXJlY3RpdmUuXG4gICAgICAgICAgICAgICAgaWYgKHRyaW1tZWQgPT09IERFQlVHX0RJUkVDVElWRSB8fFxuICAgICAgICAgICAgICAgICAgICB0cmltbWVkLnN0YXJ0c1dpdGgoREVCVUdfRElSRUNUSVZFICsgJzonKSB8fFxuICAgICAgICAgICAgICAgICAgICB0cmltbWVkLnN0YXJ0c1dpdGgoREVCVUdfRElSRUNUSVZFICsgJyAnKSB8fFxuICAgICAgICAgICAgICAgICAgICB0cmltbWVkLnN0YXJ0c1dpdGgoREVCVUdfRElSRUNUSVZFICsgJ1xcdCcpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFN0cmlwIHRoZSBkaXJlY3RpdmUgbmFtZSBhbmQgb3B0aW9uYWwgbGVhZGluZyB3aGl0ZXNwYWNlXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFmdGVyRGlyZWN0aXZlID0gdHJpbW1lZC5zdWJzdHJpbmcoREVCVUdfRElSRUNUSVZFLmxlbmd0aCkudHJpbVN0YXJ0KCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIFN0cmlwIGEgc2luZ2xlIGxlYWRpbmcgJzonIHNlcGFyYXRvciBpZiBwcmVzZW50XG4gICAgICAgICAgICAgICAgICAgIC8vIChlLmcuIFwiaWJtLWExMXktZGVidWc6IGZpbGUudHM6MTA6NVwiIOKGkiBhZnRlckRpcmVjdGl2ZSA9IFwiOiBmaWxlLnRzOjEwOjVcIilcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc291cmNlID0gYWZ0ZXJEaXJlY3RpdmUuc3RhcnRzV2l0aCgnOicpXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGFmdGVyRGlyZWN0aXZlLnN1YnN0cmluZygxKS50cmltKClcbiAgICAgICAgICAgICAgICAgICAgICAgIDogYWZ0ZXJEaXJlY3RpdmUudHJpbSgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VTb3VyY2Uoc291cmNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB7IGZvdW5kOiBmYWxzZSB9O1xuICAgICAgICB9O1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIHRoZSBpYm0tYTExeS1kZWJ1ZyBhdHRyaWJ1dGUgdmFsdWUgZnJvbSBhbiBlbGVtZW50IG5vZGUgYXMgYSBEaXJlY3RpdmVSZXN1bHQsXG4gICAgICAgICAqIG9yIHsgZm91bmQ6IGZhbHNlIH0gaWYgYWJzZW50LiBSZWNvZ25pc2VzIHRoZSAnZW5kJyBzdG9wIG1hcmtlciBqdXN0IGxpa2UgY29tbWVudCBkaXJlY3RpdmVzLlxuICAgICAgICAgKiBUaGUgYXR0cmlidXRlIHZhbHVlIGlzIHRoZSBzb3VyY2UgZGlyZWN0bHkgKG5vICc6JyBwcmVmaXgpLCBlLmcuIGlibS1hMTF5LWRlYnVnPVwiZmlsZS50czoxMDo1XCIuXG4gICAgICAgICAqL1xuICAgICAgICBjb25zdCBnZXRJbmxpbmVBdHRyID0gZnVuY3Rpb24gKG46IE5vZGUpOiBEaXJlY3RpdmVSZXN1bHQge1xuICAgICAgICAgICAgaWYgKG4ubm9kZVR5cGUgIT09IE5vZGUuRUxFTUVOVF9OT0RFKSByZXR1cm4geyBmb3VuZDogZmFsc2UgfTtcbiAgICAgICAgICAgIGNvbnN0IHZhbCA9IChuIGFzIEVsZW1lbnQpLmdldEF0dHJpYnV0ZShERUJVR19ESVJFQ1RJVkUpO1xuICAgICAgICAgICAgaWYgKHZhbCA9PT0gbnVsbCkgcmV0dXJuIHsgZm91bmQ6IGZhbHNlIH07XG4gICAgICAgICAgICAvLyBBdHRyaWJ1dGUgdmFsdWUgaXMgdGhlIHNvdXJjZSBkaXJlY3RseSDigJQgbm8gJzonIHNlcGFyYXRvciB0byBzdHJpcFxuICAgICAgICAgICAgcmV0dXJuIHBhcnNlU291cmNlKHZhbC50cmltKCkpO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUcmF2ZXJzZXMgbGVmdCAocHJldmlvdXMgc2libGluZ3MpIHRoZW4gdXB3YXJkIChwYXJlbnQpIHRvIGZpbmQgc291cmNlIGluZm8uXG4gICAgICAgICAqIERvZXMgTk9UIGNoZWNrIHRoZSBzdGFydGluZyBlbGVtZW50IGl0c2VsZiDigJQgb25seSBpdHMgcHJlY2VkaW5nIHNpYmxpbmdzIGFuZCBhbmNlc3RvcnMuXG4gICAgICAgICAqIFRoaXMgYXZvaWRzIG1pc2lkZW50aWZ5aW5nIGEgY29udGVudCBub2RlIGFzIGl0cyBvd24gc291cmNlIGRpcmVjdGl2ZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQXQgZWFjaCBhbmNlc3RvciBsZXZlbCB0aGUgZnVuY3Rpb24gYWxzbyBjaGVja3MgdGhlIGFuY2VzdG9yIGVsZW1lbnQncyBvd24gaW5saW5lXG4gICAgICAgICAqIGlibS1hMTF5LWRlYnVnIGF0dHJpYnV0ZSwgc28gdGhhdCBhIHBhcmVudCBlbGVtZW50IGNhbiBhbm5vdGF0ZSBhbGwgaXRzIGRlc2NlbmRhbnRzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBTaWJsaW5nIHNjYW5uaW5nIHN0b3BzIGF0IHRoZSBmaXJzdCBub2RlIHRoYXQgaXMgcmVjb2duaXNlZCBhcyBhIGRpcmVjdGl2ZSAoZm91bmQgb3Igc3RvcCkuXG4gICAgICAgICAqIE5vbi1kaXJlY3RpdmUgbm9kZXMgKHJlYWwgY29udGVudCBlbGVtZW50cywgdGV4dCBub2RlcykgYXJlIHNraXBwZWQgc28gdGhhdCBhIGRpcmVjdGl2ZVxuICAgICAgICAgKiBwbGFjZWQgZnVydGhlciBiYWNrIGluIHRoZSBzaWJsaW5nIGxpc3QgaXMgc3RpbGwgZm91bmQgZXZlbiBpZiBjb250ZW50IG5vZGVzIGludGVydmVuZS5cbiAgICAgICAgICogSG93ZXZlciwgdHJhdmVyc2FsIGRvZXMgTk9UIGNyb3NzIGVsZW1lbnQgYm91bmRhcmllcyB3aGVuIHNjYW5uaW5nIHNpYmxpbmdzIOKAlCBvbmx5XG4gICAgICAgICAqIGNvbW1lbnQgbm9kZXMgYW5kIGRlZGljYXRlZCB3cmFwcGVyIGVsZW1lbnRzICh3aG9zZSBzb2xlIGZpcnN0IGNoaWxkIGlzIGEgY29tbWVudCkgYXJlXG4gICAgICAgICAqIHRyZWF0ZWQgYXMgdHJhbnNwYXJlbnQuXG4gICAgICAgICAqXG4gICAgICAgICAqIFNoYWRvdyBET00gdHJhdmVyc2FsOiB1c2VzIERPTVdhbGtlci5wYXJlbnROb2RlKCkgdG8gY3Jvc3Mgc2hhZG93IGJvdW5kYXJpZXMgY29ycmVjdGx5LFxuICAgICAgICAgKiBpbmNsdWRpbmcgc2xvdHRlZCBjb250ZW50IGFuZCBuZXN0ZWQgU2hhZG93IERPTSAoc2hhZG93LWluLXNoYWRvdykuIFdoZW4gdGhlIHBhcmVudFxuICAgICAgICAgKiBjaGFpbiByZWFjaGVzIGEgU2hhZG93Um9vdCwgRE9NV2Fsa2VyLnBhcmVudE5vZGUoKSBhdXRvbWF0aWNhbGx5IHJlc29sdmVzIGl0IHRvIHRoZVxuICAgICAgICAgKiBzaGFkb3cgaG9zdCBlbGVtZW50IGluIHRoZSBvdXRlciBET00uIEEgcGxhaW4gRG9jdW1lbnRGcmFnbWVudCB3aXRoIG5vIGhvc3QgcmV0dXJuc1xuICAgICAgICAgKiBudWxsIGZyb20gRE9NV2Fsa2VyLnBhcmVudE5vZGUoKSwgc3RvcHBpbmcgdHJhdmVyc2FsLlxuICAgICAgICAgKlxuICAgICAgICAgKiBTaWJsaW5nIHRyYXZlcnNhbCB1c2VzIERPTVdhbGtlci5wcmV2aW91c1NpYmxpbmdOb3RPd25lZEJ5U2xvdCgpIHRvIHNraXAgbm9kZXMgdGhhdFxuICAgICAgICAgKiBhcmUgYXNzaWduZWQgdG8gc2xvdHMgKGFuZCB0aGVyZWZvcmUgbG9naWNhbGx5IGJlbG9uZyB0byBhIGRpZmZlcmVudCBwYXJ0IG9mIHRoZSB0cmVlKS5cbiAgICAgICAgICpcbiAgICAgICAgICogVXNlcyBhbiBpdGVyYXRpdmUgYXBwcm9hY2ggKHJhdGhlciB0aGFuIHJlY3Vyc2lvbikgdG8gc2FmZWx5IGhhbmRsZSBkZWVwbHkgbmVzdGVkXG4gICAgICAgICAqIERPTSBzdHJ1Y3R1cmVzIHdpdGhvdXQgcmlzayBvZiBzdGFjayBvdmVyZmxvdy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIGVsZW0gLSBUaGUgbm9kZSB3aG9zZSBjb250ZXh0IHdlIGFyZSBzZWFyY2hpbmdcbiAgICAgICAgICogQHJldHVybnMgVGhlIHNvdXJjZSBsb2NhdGlvbiBzdHJpbmcsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICAgICAqL1xuICAgICAgICBjb25zdCBmaW5kU291cmNlID0gZnVuY3Rpb24gKGVsZW06IE5vZGUgfCBudWxsKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgICAgICBsZXQgY3VycmVudCA9IGVsZW07XG4gICAgICAgICAgICB3aGlsZSAoY3VycmVudCkge1xuICAgICAgICAgICAgICAgIC8vIFNjYW4gcHJldmlvdXMgc2libGluZ3MgZm9yIGEgZGVidWcgZGlyZWN0aXZlIGNvbW1lbnQgb3Igd3JhcHBlciBlbGVtZW50LlxuICAgICAgICAgICAgICAgIC8vIFVzZSBwcmV2aW91c1NpYmxpbmdOb3RPd25lZEJ5U2xvdCB0byBza2lwIG5vZGVzIGFzc2lnbmVkIHRvIHNsb3RzLCB3aGljaFxuICAgICAgICAgICAgICAgIC8vIGxvZ2ljYWxseSBiZWxvbmcgdG8gYSBkaWZmZXJlbnQgcGFydCBvZiB0aGUgY29tcG9zZWQgdHJlZS5cbiAgICAgICAgICAgICAgICAvLyBPbmx5IGNvbW1lbnQgbm9kZXMgYW5kIGRlZGljYXRlZCB3cmFwcGVyIGVsZW1lbnRzIGFyZSBjb25zaWRlcmVkIGRpcmVjdGl2ZXM7XG4gICAgICAgICAgICAgICAgLy8gYWxsIG90aGVyIG5vZGUgdHlwZXMgYXJlIHNraXBwZWQgKHRoZXkgZG8gbm90IGJsb2NrIGZ1cnRoZXIgc2Nhbm5pbmcpLlxuICAgICAgICAgICAgICAgIGxldCBwcmV2ID0gRE9NV2Fsa2VyLnByZXZpb3VzU2libGluZ05vdE93bmVkQnlTbG90KGN1cnJlbnQpO1xuICAgICAgICAgICAgICAgIHdoaWxlIChwcmV2KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGV4dHJhY3REaXJlY3RpdmUocHJldik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuZm91bmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuc3RvcCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHJlc3VsdCBhcyB7IGZvdW5kOiB0cnVlOyBzdG9wOiBmYWxzZTsgc291cmNlOiBzdHJpbmcgfSkuc291cmNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHByZXYgPSBET01XYWxrZXIucHJldmlvdXNTaWJsaW5nTm90T3duZWRCeVNsb3QocHJldik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gTm8gZGlyZWN0aXZlIGZvdW5kIGFtb25nIHNpYmxpbmdzIOKAlCBtb3ZlIHVwIHRvIHBhcmVudC5cbiAgICAgICAgICAgICAgICAvLyBVc2UgRE9NV2Fsa2VyLnBhcmVudE5vZGUoKSBpbnN0ZWFkIG9mIG5vZGUucGFyZW50Tm9kZSBkaXJlY3RseSBzbyB0aGF0OlxuICAgICAgICAgICAgICAgIC8vICAgMS4gU2hhZG93IERPTSBib3VuZGFyaWVzIGFyZSBjcm9zc2VkIGF1dG9tYXRpY2FsbHkgKFNoYWRvd1Jvb3Qg4oaSIGhvc3QgZWxlbWVudCksXG4gICAgICAgICAgICAgICAgLy8gICAgICBzdXBwb3J0aW5nIGJvdGggcmVndWxhciBhbmQgbmVzdGVkIFNoYWRvdyBET00gKHNoYWRvdy1pbi1zaGFkb3cpLlxuICAgICAgICAgICAgICAgIC8vICAgMi4gU2xvdHRlZCBub2RlcyBhcmUgcmUtcGFyZW50ZWQgdG8gdGhlaXIgc2xvdCBvd25lciByYXRoZXIgdGhhbiB0aGVpclxuICAgICAgICAgICAgICAgIC8vICAgICAgbGlnaHQtRE9NIHBhcmVudCwgbWF0Y2hpbmcgdGhlIGNvbXBvc2VkIChyZW5kZXJlZCkgdHJlZSBzdHJ1Y3R1cmUuXG4gICAgICAgICAgICAgICAgLy8gICAzLiBOb2RlcyB3aXRoIGFuIG93bmVyRWxlbWVudCAoZS5nLiBpZnJhbWUgZG9jdW1lbnQgcm9vdHMpIGFyZSByZS1wYXJlbnRlZFxuICAgICAgICAgICAgICAgIC8vICAgICAgdG8gdGhlaXIgb3duZXIgZWxlbWVudC5cbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnQgPSBET01XYWxrZXIucGFyZW50Tm9kZShjdXJyZW50KTtcblxuICAgICAgICAgICAgICAgIGlmICghcGFyZW50IHx8IHBhcmVudC5ub2RlVHlwZSA9PT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFJlYWNoZWQgdGhlIHRvcCBvZiB0aGUgdHJlZSAob3IgYSBwbGFpbiBEb2N1bWVudEZyYWdtZW50IHdpdGggbm8gaG9zdClcbiAgICAgICAgICAgICAgICAgICAgLy8gd2l0aG91dCBmaW5kaW5nIGEgZGlyZWN0aXZlLlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBDaGVjayB0aGUgcGFyZW50IGVsZW1lbnQncyBvd24gaW5saW5lIGF0dHJpYnV0ZSBiZWZvcmUgY29udGludWluZyB1cHdhcmQuXG4gICAgICAgICAgICAgICAgLy8gVGhpcyBhbGxvd3MgYSBjb250YWluaW5nIGVsZW1lbnQgdG8gYW5ub3RhdGUgYWxsIGl0cyBkZXNjZW5kYW50cy5cbiAgICAgICAgICAgICAgICAvLyBBbiAnZW5kJyBpbmxpbmUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgc3RvcHMgdHJhdmVyc2FsIGVudGlyZWx5LlxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudEF0dHJSZXN1bHQgPSBnZXRJbmxpbmVBdHRyKHBhcmVudCk7XG4gICAgICAgICAgICAgICAgaWYgKHBhcmVudEF0dHJSZXN1bHQuZm91bmQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudEF0dHJSZXN1bHQuc3RvcCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAocGFyZW50QXR0clJlc3VsdCBhcyB7IGZvdW5kOiB0cnVlOyBzdG9wOiBmYWxzZTsgc291cmNlOiBzdHJpbmcgfSkuc291cmNlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBwYXJlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBGaXJzdCwgY2hlY2sgZm9yIGFuIGlubGluZSBhdHRyaWJ1dGUgZGlyZWN0aXZlIG9uIHRoZSBlbGVtZW50IGl0c2VsZi5cbiAgICAgICAgLy8gQW4gJ2VuZCcgYXR0cmlidXRlIG9uIHRoZSBlbGVtZW50IGl0c2VsZiBzdG9wcyB0cmF2ZXJzYWwgKHJldHVybnMgbnVsbCkuXG4gICAgICAgIGNvbnN0IHNlbGZBdHRyUmVzdWx0ID0gZ2V0SW5saW5lQXR0cihub2RlKTtcbiAgICAgICAgaWYgKHNlbGZBdHRyUmVzdWx0LmZvdW5kKSB7XG4gICAgICAgICAgICBpZiAoc2VsZkF0dHJSZXN1bHQuc3RvcCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICByZXR1cm4gKHNlbGZBdHRyUmVzdWx0IGFzIHsgZm91bmQ6IHRydWU7IHN0b3A6IGZhbHNlOyBzb3VyY2U6IHN0cmluZyB9KS5zb3VyY2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGVuIHRyYXZlcnNlIHRoZSBET00gdG8gZmluZCBhIHByZWNlZGluZyBjb21tZW50IGRpcmVjdGl2ZSBvciBhbmNlc3RvciBhdHRyaWJ1dGVcbiAgICAgICAgcmV0dXJuIGZpbmRTb3VyY2Uobm9kZSk7XG4gICAgfVxuXG4gICAgcnVuKGVuZ2luZTogRW5naW5lLCBjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSkgOiBJc3N1ZVtdIHtcbiAgICAgICAgY29uc3Qgc3RhcnRUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgICAgIGxldCByZXN1bHRzOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVzdWx0cyA9IHRoaXMucnVsZS5ydW4oY29udGV4dCwgb3B0aW9ucywgY29udGV4dEhpZXJhcmNoaWVzKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc3QgZXJyOiBFcnJvciA9IGU7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiUlVMRSBFWENFUFRJT046XCIsdGhpcy5ydWxlLmlkLCBjb250ZXh0LmRvbS5yb2xlUGF0aCwgZXJyLnN0YWNrKTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZW5kVGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgICBpZiAoIXJlc3VsdHMpIHJlc3VsdHMgPSBbXTtcblxuICAgICAgICBpZiAoIShyZXN1bHRzIGluc3RhbmNlb2YgQXJyYXkpKSB7XG4gICAgICAgICAgICByZXN1bHRzID0gW3Jlc3VsdHNdO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZXRWYWwgOiBJc3N1ZVtdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlbmdpbmUuZ2V0TWVzc2FnZSh0aGlzLnJ1bGUuaWQsIHJlc3VsdC5yZWFzb25JZCwgcmVzdWx0Lm1lc3NhZ2VBcmdzKTtcbiAgICAgICAgICAgIGNvbnN0IHBhdGggPSB7fTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbnMgaW4gY29udGV4dCkge1xuICAgICAgICAgICAgICAgIHBhdGhbbnNdID0gY29udGV4dFtuc10ucm9sZVBhdGhcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJ1bGVJZCA9IHRoaXMucnVsZS5pZC5yZXBsYWNlKC9eKC4qKVxcJFxcJFxcZCskLywgXCIkMVwiKTtcblxuICAgICAgICAgICAgcmV0VmFsLnB1c2goe1xuICAgICAgICAgICAgICAgIHJ1bGVJZDogcnVsZUlkLFxuICAgICAgICAgICAgICAgIHZhbHVlOiByZXN1bHQudmFsdWUsXG4gICAgICAgICAgICAgICAgbm9kZTogY29udGV4dFtcImRvbVwiXS5ub2RlLFxuICAgICAgICAgICAgICAgIHBhdGg6IHBhdGgsXG4gICAgICAgICAgICAgICAgcnVsZVRpbWU6IGVuZFRpbWUtc3RhcnRUaW1lLFxuICAgICAgICAgICAgICAgIHJlYXNvbklkOiByZXN1bHQucmVhc29uSWQsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICAgICAgICAgICAgICBtZXNzYWdlQXJnczogcmVzdWx0Lm1lc3NhZ2VBcmdzLFxuICAgICAgICAgICAgICAgIGFwaUFyZ3M6IHJlc3VsdC5hcGlBcmdzLFxuICAgICAgICAgICAgICAgIGJvdW5kczogY29udGV4dFtcImRvbVwiXS5ib3VuZHMsXG4gICAgICAgICAgICAgICAgc25pcHBldDogV3JhcHBlZFJ1bGUuY29udmVydE5vZGVUb1NuaXBwZXQoY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQpLFxuICAgICAgICAgICAgICAgIHNvdXJjZTogV3JhcHBlZFJ1bGUuY29udmVydE5vZGVUb1NvdXJjZShjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudCwgZW5naW5lLmlzU291cmNlTWFwRW5hYmxlZCgpKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEVuZ2luZSBpbXBsZW1lbnRzIElFbmdpbmUge1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0TGFuZ3VhZ2VzKCkge1xuICAgICAgICBjb25zdCBlbnYgPSB0eXBlb2YgcHJvY2VzcyAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2YgKHByb2Nlc3MgYXMgYW55KS5ub2RlVHlwZSA9PT0gXCJ1bmRlZmluZWRcIiAmJiBwcm9jZXNzLmVudjtcbiAgICAgICAgLy8gSWYgYWxsIGVsc2UgZmFpbHMsIGRlZmF1bHQgdG8gVVMgRW5nbGlzaFxuICAgICAgICBsZXQgbm9kZUxhbmcgPSBcImVuLVVTXCI7XG4gICAgICAgIGlmIChlbnYpIHtcbiAgICAgICAgICAgIG5vZGVMYW5nID0gZW52LkxBTkcgfHwgZW52LkxBTkdVQUdFIHx8IGVudi5MQ19BTEwgfHwgZW52LkxDX01FU1NBR0VTO1xuICAgICAgICAgICAgaWYgKG5vZGVMYW5nICYmIG5vZGVMYW5nLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBub2RlTGFuZyA9IG5vZGVMYW5nLnNwbGl0KFwiLlwiKVswXS5yZXBsYWNlKC9fL2csXCItXCIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBub2RlTGFuZyA9IFwiZW4tVVNcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHlwZW9mIG5hdmlnYXRvciAhPT0gXCJ1bmRlZmluZWRcIiAmJiBuYXZpZ2F0b3IubGFuZ3VhZ2VzIHx8IFtub2RlTGFuZ107XG4gICAgfVxuICAgIG1hcHBlcnMgOiB7IFtuYW1lc3BhY2U6IHN0cmluZ10gOiBJTWFwcGVyIH0gPSB7fTtcbiAgICBydWxlTWFwIDogeyBbaWQ6IHN0cmluZ106IFJ1bGUgfSA9IHt9O1xuICAgIHdyYXBwZWRSdWxlTWFwIDogeyBbaWQ6IHN0cmluZ106IFdyYXBwZWRSdWxlIH0gPSB7fTtcbiAgICBubHNNYXAgOiBObHNNYXAgPSB7fVxuICAgIGhlbHBNYXAgOiBIZWxwTWFwID0ge31cbiAgICBzb3VyY2VNYXBFbmFibGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBwcml2YXRlIGluY2xSdWxlczoge1xuICAgICAgICBbbnNSb2xlOiBzdHJpbmddOiBXcmFwcGVkUnVsZVtdXG4gICAgfSA9IHt9XG5cbiAgICBwcml2YXRlIGV4Y2xSdWxlczoge1xuICAgICAgICBbbnNSb2xlOiBzdHJpbmddOiBXcmFwcGVkUnVsZVtdXG4gICAgfSA9IHt9XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgLy8gTmVlZCBhIERPTSBNYXBwZXIgYXMgYSBtaW5pbXVtXG4gICAgICAgIHRoaXMuYWRkTWFwcGVyKG5ldyBET01NYXBwZXIoKSk7XG4gICAgfVxuXG4gICAgcnVuKHJvb3Q6IERvY3VtZW50IHwgTm9kZSwgb3B0aW9ucz86IHt9KTogUHJvbWlzZTxSZXBvcnQ+IHtcbiAgICAgICAgaWYgKHJvb3QgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcIm51bGwgZG9jdW1lbnRcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJvb3Qubm9kZVR5cGUgPT09IDkgLyogTm9kZS5ET0NVTUVOVF9OT0RFICovKSB7XG4gICAgICAgICAgICByb290ID0gKHJvb3QgYXMgRG9jdW1lbnQpLmRvY3VtZW50RWxlbWVudDtcbiAgICAgICAgfVxuICAgICAgICByb290Lm93bmVyRG9jdW1lbnQgJiYgKChyb290Lm93bmVyRG9jdW1lbnQgYXMgYW55KS5QVF9DSEVDS19ISURERU5fQ09OVEVOVCA9IGZhbHNlKTtcbiAgICAgICAgY29uc3QgbnVtTm9kZXNWaXNpdGVkID0gQ2FjaGVVdGlsLmNsZWFyQ2FjaGVzKHJvb3QpO1xuICAgICAgICBjb25zdCB3YWxrZXIgPSBuZXcgRE9NV2Fsa2VyKHJvb3QsIGZhbHNlLCByb290LCB0cnVlKTtcbiAgICAgICAgY29uc3QgcmV0VmFsIDogUmVwb3J0ID0ge1xuICAgICAgICAgICAgcmVzdWx0czogW10sXG4gICAgICAgICAgICBudW1FeGVjdXRlZDogMCxcbiAgICAgICAgICAgIHJ1bGVUaW1lOiAwLFxuICAgICAgICAgICAgdG90YWxUaW1lOiAwXG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3RhcnQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsgICAgICAgIFxuICAgICAgICAvLyBSZXNldCB0aGUgcm9sZSBtYXBwZXJzXG4gICAgICAgIGZvciAoY29uc3QgbmFtZXNwYWNlIGluIHRoaXMubWFwcGVycykge1xuICAgICAgICAgICAgdGhpcy5tYXBwZXJzW25hbWVzcGFjZV0ucmVzZXQocm9vdCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBjb250ZXh0IGRldGVjdG9yXG4gICAgICAgIGxldCBjdXJyZW50Tm9kZUNvdW50ID0gMDtcbiAgICAgICAgbGV0IGxhc3RSZXBvcnRlZFBlcmNlbnQgPSAtMTtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgY3VycmVudE5vZGVDb3VudCsrO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBSZXBvcnQgcHJvZ3Jlc3MgYXQgZWFjaCBwZXJjZW50YWdlIG1pbGVzdG9uZVxuICAgICAgICAgICAgY29uc3QgY3VycmVudFBlcmNlbnQgPSBNYXRoLmZsb29yKChjdXJyZW50Tm9kZUNvdW50IC8gbnVtTm9kZXNWaXNpdGVkKSAqIDEwMCk7XG4gICAgICAgICAgICBpZiAoY3VycmVudFBlcmNlbnQgPiBsYXN0UmVwb3J0ZWRQZXJjZW50KSB7XG4gICAgICAgICAgICAgICAgaWYgKG51bU5vZGVzVmlzaXRlZCA+IDEwMDAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIChjdXJyZW50UGVyY2VudCA+IDYpIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgUHJvZ3Jlc3M6ICR7Y3VycmVudFBlcmNlbnR9JSAoJHtjdXJyZW50Tm9kZUNvdW50fS8ke251bU5vZGVzVmlzaXRlZH0gbm9kZXMpYCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnN0IHJ1bGVUaW1lcyA9IHJldFZhbC5yZXN1bHRzLnJlZHVjZSgocHJldiwgY3VyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBwcmV2W2N1ci5ydWxlSWRdID0gKHByZXZbY3VyLnJ1bGVJZF0gfHwgMCkrY3VyLnJ1bGVUaW1lO1xuICAgICAgICAgICAgICAgICAgICAvLyAgICAgcmV0dXJuIHByZXY7XG4gICAgICAgICAgICAgICAgICAgIC8vIH0sIHt9KTtcbiAgICAgICAgICAgICAgICAgICAgLy8gZm9yIChjb25zdCBydWxlSWQgaW4gcnVsZVRpbWVzKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBpZiAocnVsZVRpbWVzW3J1bGVJZF0gPiAxMDAwMCkge1xuICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgIGNvbnNvbGUubG9nKGAke3J1bGVJZH06ICR7cnVsZVRpbWVzW3J1bGVJZF19YCk7XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5ncm91cEVuZCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsYXN0UmVwb3J0ZWRQZXJjZW50ID0gY3VycmVudFBlcmNlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBHZXQgdGhlIGNvbnRleHQgaW5mb3JtYXRpb24gZnJvbSB0aGUgcnVsZSBtYXBwZXJzXG4gICAgICAgICAgICBjb25zdCBjb250ZXh0SGllcmFyY2hpZXMgOiBSdWxlQ29udGV4dEhpZXJhcmNoeSA9IHt9O1xuICAgICAgICAgICAgZm9yIChjb25zdCBuYW1lc3BhY2UgaW4gdGhpcy5tYXBwZXJzKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF3YWxrZXIuYkVuZFRhZykge1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0SGllcmFyY2hpZXNbbmFtZXNwYWNlXSA9IHRoaXMubWFwcGVyc1tuYW1lc3BhY2VdLm9wZW5TY29wZSh3YWxrZXIubm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIChuYW1lc3BhY2UgPT09IFwiZG9tXCIgJiYgd2Fsa2VyLm5vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnN0IGVsZW0gPSB3YWxrZXIubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGV0IGlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwiaWRcIikgJiYgKGlkID0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJpZFwiKS50cmltKCkpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiAocm9vdC5vd25lckRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKSA9PT0gZWxlbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb250ZXh0SGllcmFyY2hpZXNbXCJkb21cIl1bY29udGV4dEhpZXJhcmNoaWVzW1wiZG9tXCJdLmxlbmd0aC0xXS5yb2xlUGF0aCA9IFwiLy8qW0BpZD0nXCIraWQrXCInXVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHRIaWVyYXJjaGllc1tuYW1lc3BhY2VdID0gdGhpcy5tYXBwZXJzW25hbWVzcGFjZV0uY2xvc2VTY29wZSh3YWxrZXIubm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAod2Fsa2VyLm5vZGUubm9kZVR5cGUgIT09IDExIFxuICAgICAgICAgICAgICAgICYmIChWaXNVdGlsLmlzTm9kZVZpc2libGUod2Fsa2VyLm5vZGUpXG4gICAgICAgICAgICAgICAgICAgIC8vIHx8IHdhbGtlci5ub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiaGVhZFwiXG4gICAgICAgICAgICAgICAgICAgIHx8IHdhbGtlci5ub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwibWV0YVwiXG4gICAgICAgICAgICAgICAgICAgIHx8IHdhbGtlci5ub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwic3R5bGVcIlxuICAgICAgICAgICAgICAgICAgICB8fCB3YWxrZXIubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImRhdGFsaXN0XCJcbiAgICAgICAgICAgICAgICAgICAgfHwgd2Fsa2VyLm5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJwYXJhbVwiXG4gICAgICAgICAgICAgICAgICAgIHx8ICFET01VdGlsLmdldEFuY2VzdG9yKHdhbGtlci5ub2RlLCBbXCJib2R5XCJdKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGxldCBjb250ZXh0IDogUnVsZUNvbnRleHQgPSB7fTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IG5zIGluIGNvbnRleHRIaWVyYXJjaGllcykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuc0hpZXIgPSBjb250ZXh0SGllcmFyY2hpZXNbbnNdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXN0SGllciA9IG5zSGllcltuc0hpZXIubGVuZ3RoLTFdO1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0W25zXSA9IGxhc3RIaWVyOyBcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgbWF0Y2hpbmdSdWxlcyA9IHRoaXMuZ2V0TWF0Y2hpbmdSdWxlcyhjb250ZXh0SGllcmFyY2hpZXMpO1xuICAgICAgICAgICAgICAgIGxldCBkZXBNYXRjaCA9IHt9XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBtYXRjaGluZ1J1bGUgb2YgbWF0Y2hpbmdSdWxlcykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZnVsZmlsbHNEZXBlbmRlbmNpZXMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGRlcCBvZiBtYXRjaGluZ1J1bGUucnVsZS5kZXBlbmRlbmNpZXMgfHwgW10pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZGVwTWF0Y2hbZGVwXSkgZnVsZmlsbHNEZXBlbmRlbmNpZXMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoZnVsZmlsbHNEZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXN1bHRzIDogSXNzdWVbXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0YXJ0ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBtYXRjaGluZ1J1bGUucnVuKHRoaXMsIGNvbnRleHQsIG9wdGlvbnMsIGNvbnRleHRIaWVyYXJjaGllcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXcmFwcGVyIHNob3dzIGVycm9yIGluIGNvbnNvbGUuIFNraXAgdGhpcyBydWxlIGFzIE4vQVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGRvbid0IHdhbnQgdG8ga2lsbCB0aGUgZW5naW5lXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBvdXQgb2Ygc2NvcGUsIGl0IGZ1bGZpbGxzIHRoZSBkZXBlbmRlbmN5XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBNYXRjaFttYXRjaGluZ1J1bGUucnVsZS5pZF0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5yZXN1bHRzLnB1c2gocmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwucnVsZVRpbWUgKz0gcmVzdWx0LnJ1bGVUaW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5udW1FeGVjdXRlZCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQudmFsdWVbMV0gPT09IGVSdWxlQ29uZmlkZW5jZS5QQVNTKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcE1hdGNoW3Jlc3VsdC5ydWxlSWRdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gd2hpbGUgKHdhbGtlci5uZXh0Tm9kZSgpKTtcbiAgICAgICAgQ2FjaGVVdGlsLmNsZWFyQ2FjaGVzKHJvb3QpO1xuICAgICAgICByZXRWYWwudG90YWxUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCktc3RhcnQ7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmV0VmFsKTtcbiAgICB9XG5cbiAgICBlbmFibGVSdWxlcyhydWxlSWRzOiBzdHJpbmdbXSkge1xuICAgICAgICBmb3IgKGNvbnN0IHJ1bGVJZCBpbiB0aGlzLnJ1bGVNYXApIHtcbiAgICAgICAgICAgIHRoaXMucnVsZU1hcFtydWxlSWRdLmVuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHJ1bGVJZCBvZiBydWxlSWRzIHx8IFtdKSB7XG4gICAgICAgICAgICBpZiAoIShydWxlSWQgaW4gdGhpcy5ydWxlTWFwKSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcIldBUk5JTkc6IFJ1bGUgSWRcIixydWxlSWQsXCJjb3VsZCBub3QgYmUgZW5hYmxlZC5cIik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMucnVsZU1hcFtydWxlSWRdLmVuYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0UnVsZShydWxlSWQ6IHN0cmluZyk6IFJ1bGUge1xuICAgICAgICByZXR1cm4gdGhpcy5ydWxlTWFwW3J1bGVJZF07XG4gICAgfVxuXG4gICAgZ2V0UnVsZXNJZHMoKSA6IHN0cmluZ1tdIHtcbiAgICAgICAgbGV0IHJldFZhbCA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHJ1bGVJZCBpbiB0aGlzLnJ1bGVNYXApIHtcbiAgICAgICAgICAgIHJldFZhbC5wdXNoKHJ1bGVJZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICBhZGRSdWxlcyhydWxlczogUnVsZVtdKSB7XG4gICAgICAgIGZvciAoY29uc3QgcnVsZSBvZiBydWxlcykge1xuICAgICAgICAgICAgdGhpcy5hZGRSdWxlKHJ1bGUsIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3NvcnRSdWxlcygpO1xuICAgIH1cblxuICAgIGFkZFJ1bGUocnVsZTogUnVsZSwgc2tpcFNvcnQ/OiBib29sZWFuKSB7XG4gICAgICAgIGxldCBjdHhzIDpDb250ZXh0W10gPSBDb250ZXh0LnBhcnNlKHJ1bGUuY29udGV4dCk7XG4gICAgICAgIGxldCBpZHggPSAwO1xuICAgICAgICBjb25zdCBydWxlSWQgPSBydWxlLmlkO1xuICAgICAgICBpZiAocnVsZUlkIGluIHRoaXMucnVsZU1hcCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJXQVJOSU5HOiBSdWxlXCIscnVsZUlkLFwiYWxyZWFkeSBhZGRlZCB0byBlbmdpbmUuIElnbm9yaW5nLi4uXCIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucnVsZU1hcFtydWxlSWRdID0gcnVsZTtcbiAgICAgICAgZm9yIChjb25zdCBjdHggb2YgY3R4cykge1xuICAgICAgICAgICAgbGV0IHdyYXBJZCA9IHJ1bGVJZDtcbiAgICAgICAgICAgIGlmIChpZHggPj0gMSkge1xuICAgICAgICAgICAgICAgIHdyYXBJZCA9IHJ1bGVJZCtcIiQkXCIraWR4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgKytpZHg7XG4gICAgICAgICAgICBsZXQgd3JhcHBlZFJ1bGUgPSBuZXcgV3JhcHBlZFJ1bGUocnVsZSxjdHgpO1xuICAgICAgICAgICAgdGhpcy53cmFwcGVkUnVsZU1hcFt3cmFwSWRdID0gd3JhcHBlZFJ1bGU7XG4gICAgICAgICAgICBsZXQgcGFydHMgPSB3cmFwcGVkUnVsZS5wYXJzZWRJbmZvLmNvbnRleHRJbmZvO1xuICAgICAgICAgICAgbGV0IGxhc3RQYXJ0ID0gcGFydHNbcGFydHMubGVuZ3RoLTFdO1xuICAgICAgICAgICAgbGV0IHRyaWdnZXJSb2xlID0gbGFzdFBhcnQubmFtZXNwYWNlK1wiOlwiK2xhc3RQYXJ0LnJvbGU7XG4gICAgICAgICAgICBpZiAobGFzdFBhcnQuaW5jbHVzaXZlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbmNsUnVsZXNbdHJpZ2dlclJvbGVdID0gdGhpcy5pbmNsUnVsZXNbdHJpZ2dlclJvbGVdIHx8IFtdO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5jbFJ1bGVzW3RyaWdnZXJSb2xlXS5wdXNoKHdyYXBwZWRSdWxlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5leGNsUnVsZXNbdHJpZ2dlclJvbGVdID0gdGhpcy5leGNsUnVsZXNbdHJpZ2dlclJvbGVdIHx8IFtdO1xuICAgICAgICAgICAgICAgIHRoaXMuZXhjbFJ1bGVzW3RyaWdnZXJSb2xlXS5wdXNoKHdyYXBwZWRSdWxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIXNraXBTb3J0KSB7XG4gICAgICAgICAgICB0aGlzLl9zb3J0UnVsZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGVuYWJsZVNvdXJjZU1hcChlbmFibGU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5zb3VyY2VNYXBFbmFibGVkID0gZW5hYmxlO1xuICAgIH1cblxuICAgIGlzU291cmNlTWFwRW5hYmxlZCgpIDogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnNvdXJjZU1hcEVuYWJsZWQ7XG4gICAgfVxuICAgIFxuICAgIF9zb3J0UnVsZXMoKSB7XG4gICAgICAgIGZvciAoY29uc3Qgcm9sZSBpbiB0aGlzLmluY2xSdWxlcykge1xuICAgICAgICAgICAgdGhpcy5pbmNsUnVsZXNbcm9sZV0uc29ydCgocnVsZUE6IFdyYXBwZWRSdWxlLCBydWxlQjogV3JhcHBlZFJ1bGUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBoYXNEZXBBID0gcnVsZUEucnVsZS5kZXBlbmRlbmNpZXMgJiYgcnVsZUEucnVsZS5kZXBlbmRlbmNpZXMubGVuZ3RoID4gMDtcbiAgICAgICAgICAgICAgICBjb25zdCBoYXNEZXBCID0gcnVsZUIucnVsZS5kZXBlbmRlbmNpZXMgJiYgcnVsZUIucnVsZS5kZXBlbmRlbmNpZXMubGVuZ3RoID4gMDtcbiAgICAgICAgICAgICAgICAvLyBJZiBCIGRlcGVuZHMgb24gQSwgc29ydCBBIGJlZm9yZSBCXG4gICAgICAgICAgICAgICAgaWYgKGhhc0RlcEIgJiYgcnVsZUIucnVsZS5kZXBlbmRlbmNpZXMuaW5jbHVkZXMocnVsZUEucnVsZS5pZCkpIHJldHVybiAtMTtcbiAgICAgICAgICAgICAgICAvLyBJZiBBIGRlcGVuZHMgb24gQiwgc29ydCBCIGJlZm9yZSBBXG4gICAgICAgICAgICAgICAgaWYgKGhhc0RlcEEgJiYgcnVsZUEucnVsZS5kZXBlbmRlbmNpZXMuaW5jbHVkZXMocnVsZUIucnVsZS5pZCkpIHJldHVybiAxO1xuICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgZG9lc24ndCBtYXR0ZXJcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3Qgcm9sZSBpbiB0aGlzLmV4Y2xSdWxlcykge1xuICAgICAgICAgICAgdGhpcy5leGNsUnVsZXNbcm9sZV0uc29ydCgocnVsZUE6IFdyYXBwZWRSdWxlLCBydWxlQjogV3JhcHBlZFJ1bGUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBoYXNEZXBBID0gcnVsZUEucnVsZS5kZXBlbmRlbmNpZXMgJiYgcnVsZUEucnVsZS5kZXBlbmRlbmNpZXMubGVuZ3RoID4gMDtcbiAgICAgICAgICAgICAgICBjb25zdCBoYXNEZXBCID0gcnVsZUIucnVsZS5kZXBlbmRlbmNpZXMgJiYgcnVsZUIucnVsZS5kZXBlbmRlbmNpZXMubGVuZ3RoID4gMDtcbiAgICAgICAgICAgICAgICAvLyBJZiBCIGRlcGVuZHMgb24gQSwgc29ydCBBIGJlZm9yZSBCXG4gICAgICAgICAgICAgICAgaWYgKGhhc0RlcEIgJiYgcnVsZUIucnVsZS5kZXBlbmRlbmNpZXMuaW5jbHVkZXMocnVsZUEucnVsZS5pZCkpIHJldHVybiAtMTtcbiAgICAgICAgICAgICAgICAvLyBJZiBBIGRlcGVuZHMgb24gQiwgc29ydCBCIGJlZm9yZSBBXG4gICAgICAgICAgICAgICAgaWYgKGhhc0RlcEEgJiYgcnVsZUEucnVsZS5kZXBlbmRlbmNpZXMuaW5jbHVkZXMocnVsZUIucnVsZS5pZCkpIHJldHVybiAxO1xuICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgZG9lc24ndCBtYXR0ZXJcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYWRkTmxzTWFwKG1hcDogTmxzTWFwKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIG1hcCkge1xuICAgICAgICAgICAgdGhpcy5ubHNNYXBba2V5XSA9IG1hcFtrZXldO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYWRkSGVscE1hcChtYXA6IEhlbHBNYXApIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gbWFwKSB7XG4gICAgICAgICAgICB0aGlzLmhlbHBNYXBba2V5XSA9IG1hcFtrZXldO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0TWVzc2FnZShydWxlSWQ6IHN0cmluZywgcnVsZUlkeDogbnVtYmVyIHwgc3RyaW5nLCBtc2dBcmdzPzogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgICAgICBsZXQgc3BsaXR0ZXIgPSBydWxlSWQuaW5kZXhPZihcIiQkXCIpO1xuICAgICAgICBpZiAoc3BsaXR0ZXIgPj0gMCkge1xuICAgICAgICAgICAgcnVsZUlkID0gcnVsZUlkLnN1YnN0cmluZygwLHNwbGl0dGVyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIShydWxlSWQgaW4gdGhpcy5ubHNNYXApKSByZXR1cm4gcnVsZUlkO1xuICAgICAgICBsZXQgbWVzc2FnZVRlbXBsYXRlID0gdGhpcy5ubHNNYXBbcnVsZUlkXVtydWxlSWR4IHx8IDBdO1xuICAgICAgICBpZiAoIW1lc3NhZ2VUZW1wbGF0ZSkgcmV0dXJuIHJ1bGVJZCtcIl9cIitydWxlSWR4O1xuICAgICAgICByZXR1cm4gbWVzc2FnZVRlbXBsYXRlLnJlcGxhY2UoL1xceyhcXGQrKVxcfS9nLFxuICAgICAgICAgICAgKG1hdGNoZWRTdHIsIG1hdGNoZWROdW0sIG1hdGNoZWRJbmRleCkgPT4gbXNnQXJnc1ttYXRjaGVkTnVtXVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGdldEhlbHAocnVsZUlkOiBzdHJpbmcsIHJlYXNvbklkOiBudW1iZXIgfCBzdHJpbmcsIGFyY2hpdmVJZD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGlmICghYXJjaGl2ZUlkKSB7XG4gICAgICAgICAgICAvLyBTZXQgdG8gdGhlIGxhdGVzdFxuICAgICAgICAgICAgYXJjaGl2ZUlkID0gXCJsYXRlc3RcIjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYCR7Q29uZmlnLmhlbHBSb290fS8ke2FyY2hpdmVJZH0vZG9jJHt0aGlzLmdldEhlbHBSZWwocnVsZUlkLCByZWFzb25JZCl9YDtcbiAgICB9XG5cbiAgICBnZXRIZWxwUmVsKHJ1bGVJZDogc3RyaW5nLCBydWxlSWR4OiBudW1iZXIgfCBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBsZXQgc3BsaXR0ZXIgPSBydWxlSWQuaW5kZXhPZihcIiQkXCIpO1xuICAgICAgICBpZiAoc3BsaXR0ZXIgPj0gMCkge1xuICAgICAgICAgICAgcnVsZUlkID0gcnVsZUlkLnN1YnN0cmluZygwLHNwbGl0dGVyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIShydWxlSWQgaW4gdGhpcy5oZWxwTWFwKSkgcmV0dXJuIHJ1bGVJZDtcbiAgICAgICAgcnVsZUlkeCA9IHJ1bGVJZHggfHwgMDtcbiAgICAgICAgbGV0IGhlbHBTdHIgPSBudWxsO1xuICAgICAgICBpZiAocnVsZUlkeCBpbiB0aGlzLmhlbHBNYXBbcnVsZUlkXSkge1xuICAgICAgICAgICAgaGVscFN0ciA9IHRoaXMuaGVscE1hcFtydWxlSWRdW3J1bGVJZHggfHwgMF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBoZWxwU3RyID0gdGhpcy5oZWxwTWFwW3J1bGVJZF1bMF07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWhlbHBTdHIpIHJldHVybiBydWxlSWQrXCJfXCIrcnVsZUlkeDtcbiAgICAgICAgcmV0dXJuIGhlbHBTdHI7XG4gICAgfVxuXG4gICAgYWRkTWFwcGVyKG1hcHBlcjogSU1hcHBlcikge1xuICAgICAgICB0aGlzLm1hcHBlcnNbbWFwcGVyLmdldE5hbWVzcGFjZSgpXSA9IG1hcHBlcjtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBtYXRjaChydWxlOiBXcmFwcGVkUnVsZSxcbiAgICAgICAgY29udGV4dEhpZXI6IFJ1bGVDb250ZXh0SGllcmFyY2h5KSA6IGJvb2xlYW5cbiAgICB7XG4gICAgICAgIGxldCBydWxlUGFydHMgPSBydWxlLnBhcnNlZEluZm8uY29udGV4dEluZm87XG4gICAgICAgIGxldCBwYXJ0SWR4ID0gcnVsZVBhcnRzLmxlbmd0aC0xO1xuICAgICAgICBsZXQgY3VyTlMgPSBydWxlUGFydHNbcGFydElkeF0ubmFtZXNwYWNlO1xuICAgICAgICBsZXQgY3VySGllciA9IGNvbnRleHRIaWVyW2N1ck5TXVtjb250ZXh0SGllcltjdXJOU10ubGVuZ3RoLTFdO1xuICAgICAgICBjb25zdCBjb250ZXh0Tm9kZSA9IGN1ckhpZXIubm9kZTtcblxuICAgICAgICAvLyBJZiB0aGUgZW5kIG9mIHRoZSBydWxlIHBhcnQgZG9lc24ndCBtYXRjaCB0aGUgZW5kIG9mIHRoZSBoaWVyYXJjaHksIHdlIGRvbid0IGhhdmUgYSBtYXRjaFxuICAgICAgICBpZiAoIXJ1bGVQYXJ0c1twYXJ0SWR4XS5tYXRjaGVzKGNvbnRleHRIaWVyLCBjb250ZXh0SGllcltjdXJOU10ubGVuZ3RoLTEpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgdGhlcmUgd2FzIG9ubHkgb25lIHBhcnQsIHdlIGhhdmUgYSBtYXRjaFxuICAgICAgICBpZiAocnVsZVBhcnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTmVlZCB0byBkZWFsIHdpdGggcGFyZW50IHBhcnRzLiBUbyB3YWxrIHRoZSBoaWVyYXJjaHksIHRoZXNlIG5lZWQgdG8gYmVcbiAgICAgICAgLy8gYWxsIGluIHRoZSBzYW1lIG5hbWVzcGFjZS4gQ29uZmlybSB0aGF0IGlzIHRydWUuXG4gICAgICAgIGN1ck5TID0gcnVsZVBhcnRzWzBdLm5hbWVzcGFjZTtcbiAgICAgICAgY3VySGllciA9IGNvbnRleHRIaWVyW2N1ck5TXVtjb250ZXh0SGllcltjdXJOU10ubGVuZ3RoLTFdO1xuICAgICAgICAtLXBhcnRJZHg7XG4gICAgICAgIGlmIChydWxlUGFydHMuc2xpY2UoMCwgcnVsZVBhcnRzLmxlbmd0aC0xKS5zb21lKHBhcnQgPT4gcGFydC5uYW1lc3BhY2UgIT09IGN1ck5TKSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgW0VSUk9SXSBSdWxlICR7cnVsZS5ydWxlLmlkfSBoYXMgaW5jb25zaXRlbnQgcGFyZW50IG5hbWVzcGFjZXNgKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiB0aGUgdGFyZ2V0IG5vZGUgbWF0Y2hlcyB0aGUgZW5kIG9mIHRoZSBoaWVyYXJjaHksIG1vdmUgdXAgcGFzdCBpdCwgb3RoZXJ3aXNlLCBzdGFydCBhdCB0aGUgZW5kXG4gICAgICAgIGxldCBoaWVySWR4ID0gY29udGV4dEhpZXJbY3VyTlNdLmxlbmd0aCAtIChjdXJIaWVyLm5vZGUuaXNTYW1lTm9kZShjb250ZXh0Tm9kZSkgPyAyIDogMSk7XG4gICAgICAgIHdoaWxlIChoaWVySWR4ID49IDAgJiYgcGFydElkeCA+PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJ0ID0gcnVsZVBhcnRzW3BhcnRJZHhdO1xuICAgICAgICAgICAgY29uc3QgbWF0Y2hlc1BhcnQgPSBydWxlUGFydHNbcGFydElkeF0ubWF0Y2hlcyhjb250ZXh0SGllciwgaGllcklkeCk7XG4gICAgICAgICAgICBpZiAocGFydC5jb25uZWN0b3IgPT09IFwiPlwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFtYXRjaGVzUGFydCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBEaXJlY3QgcGFyZW50IGNoZWNrIGFuZCBkb2Vzbid0IG1hdGNoXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBEaXJlY3QgcGFyZW50IGNoZWNrIGFuZCBkb2VzIG1hdGNoXG4gICAgICAgICAgICAgICAgICAgIC0tcGFydElkeDtcbiAgICAgICAgICAgICAgICAgICAgLS1oaWVySWR4O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGFydC5jb25uZWN0b3IgPT09IFwiIFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcnQuaW5jbHVzaXZlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGluY2x1c2l2ZSBhbmNlc3RvciBtYXRjaFxuICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2hlc1BhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC0tcGFydElkeDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBJZiBkb2Vzbid0IG1hdGNoLCBqdXN0IG1vdmUgdXAgdGhlIHJvbGUgaGllcmFyY2h5XG4gICAgICAgICAgICAgICAgICAgIC0taGllcklkeDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFtYXRjaGVzUGFydCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBleGNsdXNpdmUgYW5jZXN0b3IgbWF0Y2ggYW5kIGN1cnJlbnQgbWF0Y2hlc1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXhjbHVzaXZlIGFuY2VzdG9yIG1hdGNoIGFuZCBjdXJyZW50IGRvZXNuJ3QgbWF0Y2ggLSBjaGVjayBmb3Igb3RoZXIgYW5jZXN0b3JzXG4gICAgICAgICAgICAgICAgICAgIGxldCBwYXJlbnRNYXRjaCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBzZWFyY2hJZHggPSBoaWVySWR4LTE7ICFwYXJlbnRNYXRjaCAmJiBzZWFyY2hJZHggPj0gMDsgLS1zZWFyY2hJZHgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudE1hdGNoID0gIXJ1bGVQYXJ0c1twYXJ0SWR4XS5tYXRjaGVzKGNvbnRleHRIaWVyLCBzZWFyY2hJZHgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnRNYXRjaCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBlbHNlIC0tcGFydElkeDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvbnRleHQgY29ubmVjdG9yIFwiK3BhcnQuY29ubmVjdG9yK1wiIGlzIG5vdCBzdXBwb3J0ZWRcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhcnRJZHggPT09IC0xO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0TWF0Y2hpbmdSdWxlcyhjdHhIaWVyIDogUnVsZUNvbnRleHRIaWVyYXJjaHkpIDogV3JhcHBlZFJ1bGVbXSB7XG4gICAgICAgIGxldCBtYXRjaGVzIDogV3JhcHBlZFJ1bGVbXSA9IFtdO1xuICAgICAgICBmdW5jdGlvbiBhZGRNYXRjaGVzKHJ1bGVzOiBXcmFwcGVkUnVsZVtdKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJ1bGUgb2YgcnVsZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAocnVsZS5ydWxlLmVuYWJsZWQgJiYgRW5naW5lLm1hdGNoKHJ1bGUsIGN0eEhpZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIG1hdGNoZXMucHVzaChydWxlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBucyBpbiBjdHhIaWVyKSB7XG4gICAgICAgICAgICBsZXQgcm9sZSA9IG5zK1wiOlwiKyhjdHhIaWVyW25zXS5sZW5ndGggPiAwID8gY3R4SGllcltuc11bY3R4SGllcltuc10ubGVuZ3RoLTFdLnJvbGUgOiBcIm5vbmVcIik7XG4gICAgICAgICAgICBpZiAocm9sZSBpbiB0aGlzLmluY2xSdWxlcykge1xuICAgICAgICAgICAgICAgIGFkZE1hdGNoZXModGhpcy5pbmNsUnVsZXNbcm9sZV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChjb25zdCB4Um9sZSBpbiB0aGlzLmV4Y2xSdWxlcykge1xuICAgICAgICAgICAgICAgIGlmICh4Um9sZSAhPT0gcm9sZSkge1xuICAgICAgICAgICAgICAgICAgICBhZGRNYXRjaGVzKHRoaXMuZXhjbFJ1bGVzW3hSb2xlXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJvbGUgIT09IG5zK1wiOm5vbmVcIikge1xuICAgICAgICAgICAgICAgIGlmIChyb2xlLnN0YXJ0c1dpdGgobnMrXCI6L1wiKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobnMrXCI6LypcIiBpbiB0aGlzLmluY2xSdWxlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkTWF0Y2hlcyh0aGlzLmluY2xSdWxlc1tucytcIjovKlwiXSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChucytcIjoqXCIgaW4gdGhpcy5pbmNsUnVsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZE1hdGNoZXModGhpcy5pbmNsUnVsZXNbbnMrXCI6KlwiXSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5zb3J0RGVwcyhtYXRjaGVzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTb3J0cyB0aGUgcnVsZXMgaW4gb3JkZXIgdG8gZXhlY3V0ZSBkZXBlbmRlbmNpZXMgaW4gdGhlIGNvcnJlY3Qgb3JkZXJcbiAgICAgKiBAcGFyYW0gaW5SdWxlcyBMaXN0IG9mIHdyYXBwZWQgcnVsZXMgdG8gc29ydFxuICAgICAqIEByZXR1cm5zIFNvcnRlZCBsaXN0IG9mIHdyYXBwZWQgcnVsZXNcbiAgICAgKi9cbiAgICBzb3J0RGVwcyhpblJ1bGVzOiBXcmFwcGVkUnVsZVtdKSB7XG4gICAgICAgIGxldCBkZXBSdWxlczogV3JhcHBlZFJ1bGVbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHJ1bGUgb2YgaW5SdWxlcykge1xuICAgICAgICAgICAgZGVwUnVsZXMucHVzaChydWxlKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgbGV0IHJldFZhbCA6IFdyYXBwZWRSdWxlW10gPSBbXTtcbiAgICAgICAgbGV0IGlkVG9SdWxlID0ge307XG4gICAgICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgcnVsZXMuIElmIHRoYXQgcnVsZSdzIGRlcGVuZGVuY2llcyBjYW4gYmUgbWV0IGJ5IHJ1bGVzIGFscmVhZHkgaW4gdGhlIGxpc3QsIGFkZCBpdCB0byB0aGUgbGlzdFxuICAgICAgICAvLyBSZXBlYXQgdW50aWwgbm8gY2hhbmdlcyBhcmUgbWFkZSB0byB0aGUgc2F0aXNmaWVkIGxpc3RcbiAgICAgICAgLy8gSWYgYSBydWxlIGNhbm5vdCBiZSBzYXRpc2ZpZWQsIGl0IHdpbGwgbmV2ZXIgZXhlY3V0ZSwgc28gaXQgY2FuIGJlIGRyb3BwZWQuXG4gICAgICAgIGxldCBjaGFuZ2UgPSBmYWxzZTtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgY2hhbmdlID0gZmFsc2U7XG4gICAgICAgICAgICBmb3IgKGxldCBpZHg9MDsgaWR4PGRlcFJ1bGVzLmxlbmd0aDsgKytpZHgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkZXBSdWxlID0gZGVwUnVsZXNbaWR4XTtcbiAgICAgICAgICAgICAgICBpZiAoZGVwUnVsZS5ydWxlLmlkIGluIGlkVG9SdWxlKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBsZXQgYWxsTWF0Y2ggPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmIChkZXBSdWxlLnJ1bGUuZGVwZW5kZW5jaWVzICYmIGRlcFJ1bGUucnVsZS5kZXBlbmRlbmNpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGRlcElkIG9mIGRlcFJ1bGUucnVsZS5kZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGRlcElkIGluIGlkVG9SdWxlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbE1hdGNoID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gaWYgKGRlcFJ1bGUucnVsZS5wcmVyZXFzICYmIGRlcFJ1bGUucnVsZS5wcmVyZXFzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgZm9yIChjb25zdCBkZXBJZCBvZiBkZXBSdWxlLnJ1bGUucHJlcmVxcykge1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgaWYgKCEoZGVwSWQgaW4gaWRUb1J1bGUpKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgYWxsTWF0Y2ggPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyAgICAgfVxuICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICBpZiAoYWxsTWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsLnB1c2goZGVwUnVsZSk7XG4gICAgICAgICAgICAgICAgICAgIGlkVG9SdWxlW2RlcFJ1bGUucnVsZS5pZF0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBkZXBSdWxlcy5zcGxpY2UoaWR4LS0sIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAoY2hhbmdlKTtcbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5leHBvcnQgY2xhc3MgQ29uZmlnIHtcbiAgICBzdGF0aWMgREVCVUcgPSBmYWxzZTtcbiAgICBzdGF0aWMgaGVscFJvb3QgPSBcImh0dHBzOi8vYWJsZS5pYm0uY29tL3J1bGVzL2FyY2hpdmVzXCI7XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBDb21tb25NYXBwZXIgfSBmcm9tIFwiLi4vY29tbW9uL0NvbW1vbk1hcHBlclwiO1xuaW1wb3J0IHsgQm91bmRzIH0gZnJvbSBcIi4uL2FwaS9JTWFwcGVyXCI7XG5pbXBvcnQgeyBDYWNoZVV0aWwgfSBmcm9tIFwiLi4vLi4vdjQvdXRpbC9DYWNoZVV0aWxcIjtcblxuZXhwb3J0IGNsYXNzIERPTU1hcHBlciBleHRlbmRzIENvbW1vbk1hcHBlciB7XG4gICAgZ2V0Um9sZShub2RlOiBOb2RlKSA6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuICAgIGdldE5hbWVzcGFjZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gXCJkb21cIlxuICAgIH1cbiAgICBnZXRBdHRyaWJ1dGVzKG5vZGU6IE5vZGUpIDogeyBba2V5OnN0cmluZ106IHN0cmluZyB9IHtcbiAgICAgICAgbGV0IHJldFZhbCA9IHt9O1xuICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLykge1xuICAgICAgICAgICAgY29uc3QgZWxlbSA9IG5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgICAgIGZvciAobGV0IGlkeD0wOyBpZHg8ZWxlbS5hdHRyaWJ1dGVzLmxlbmd0aDsgKytpZHgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhdHRySW5mbyA9IGVsZW0uYXR0cmlidXRlc1tpZHhdO1xuICAgICAgICAgICAgICAgIHJldFZhbFthdHRySW5mby5uYW1lLnRvTG93ZXJDYXNlKCldID0gYXR0ckluZm8ubm9kZVZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogZ2V0IHNjYWxlZCBib3VuZHMgZm9yIHNjcmVlbnNob3QgZXRjLiBhZGp1c3RlZCBmb3IgZGV2aWNlUGl4ZWxSYXRpbyBhbmQgc2Nyb2xsXG4gICAgICogQHBhcmFtIG5vZGUgXG4gICAgICogQHJldHVybnMgXG4gICAgICovXG4gICAgZ2V0Qm91bmRzKG5vZGU6IE5vZGUpIDogQm91bmRzIHtcbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgIT09IDEgLypOb2RlLkVMRU1FTlRfTk9ERSovKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBjYWNoZWRCb3VuZHMgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUobm9kZSBhcyBFbGVtZW50LCBcIkRPTU1hcHBlcl9Cb3VuZHNcIiwgdW5kZWZpbmVkKTtcbiAgICAgICAgaWYgKHR5cGVvZiBjYWNoZWRCb3VuZHMgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRCb3VuZHM7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGxldCBhZGp1c3RtZW50ID0gMTtcbiAgICAgICAgaWYgKG5vZGUub3duZXJEb2N1bWVudCAmJiBub2RlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcgJiYgbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LmRldmljZVBpeGVsUmF0aW8pIHtcbiAgICAgICAgICAgIGFkanVzdG1lbnQgPSBub2RlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuZGV2aWNlUGl4ZWxSYXRpbztcbiAgICAgICAgfVxuICAgICAgICBsZXQgYm91bmRzID0gKG5vZGUgYXMgRWxlbWVudCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgICAgLy8gRG8gYSBjaGVjayB3aGV0aGVyIGJvdW5kcyBoYXMgdmFsdWUgYXMgd2UgdXNlIGRpZmZlcmVudCB0b29sIChodG1sVW5pdCwgYnJvd3NlcikgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uXG4gICAgICAgIGlmIChib3VuZHMpIHtcbiAgICAgICAgICAgIGxldCBzY3JvbGxYID0gbm9kZSAmJiBub2RlLm93bmVyRG9jdW1lbnQgJiYgbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3ICYmIG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5zY3JvbGxYIHx8IDA7XG4gICAgICAgICAgICBsZXQgc2Nyb2xsWSA9IG5vZGUgJiYgbm9kZS5vd25lckRvY3VtZW50ICYmIG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyAmJiBub2RlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuc2Nyb2xsWSB8fCAwO1xuICAgICAgICAgICAgY29uc3QgcmV0ID0ge1xuICAgICAgICAgICAgICAgIFwibGVmdFwiOiBNYXRoLmNlaWwoKGJvdW5kcy5sZWZ0ICsgc2Nyb2xsWCkgKiBhZGp1c3RtZW50KSxcbiAgICAgICAgICAgICAgICBcInRvcFwiOiBNYXRoLmNlaWwoKGJvdW5kcy50b3AgKyBzY3JvbGxZKSAqIGFkanVzdG1lbnQpLFxuICAgICAgICAgICAgICAgIFwiaGVpZ2h0XCI6IE1hdGguY2VpbChib3VuZHMuaGVpZ2h0ICogYWRqdXN0bWVudCksXG4gICAgICAgICAgICAgICAgXCJ3aWR0aFwiOiBNYXRoLmNlaWwoYm91bmRzLndpZHRoICogYWRqdXN0bWVudClcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSBhcyBFbGVtZW50LCBcIkRPTU1hcHBlcl9Cb3VuZHNcIiwgcmV0KTtcbiAgICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogZ2V0IHJlYWwgQ1NTIGJvdW5kcyBpbiBjc3MgcGl4ZWxzLCBhZGp1c3RlZCBmb3Igc2Nyb2xsIG9ubHlcbiAgICAgKiBAcGFyYW0gbm9kZSBcbiAgICAgKiBAcmV0dXJucyBcbiAgICAgKi9cbiAgICBnZXRVbmFkanVzdGVkQm91bmRzKG5vZGU6IE5vZGUpIDogQm91bmRzIHtcbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgIT09IDEgLypOb2RlLkVMRU1FTlRfTk9ERSovKSByZXR1cm4gbnVsbDtcblxuXG4gICAgICAgIGNvbnN0IGNhY2hlZEJvdW5kcyA9IENhY2hlVXRpbC5nZXRDYWNoZShub2RlIGFzIEVsZW1lbnQsIFwiRE9NTWFwcGVyX1VuYWRqdXN0ZWRCb3VuZHNcIiwgdW5kZWZpbmVkKTtcbiAgICAgICAgaWYgKHR5cGVvZiBjYWNoZWRCb3VuZHMgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRCb3VuZHM7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBib3VuZHMgPSAobm9kZSBhcyBFbGVtZW50KS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgLy8gYWRqdXN0ZWQgZm9yIHNjcm9sbCBpZiBhbnlcbiAgICAgICAgaWYgKGJvdW5kcykge1xuICAgICAgICAgICAgbGV0IHNjcm9sbFggPSBub2RlICYmIG5vZGUub3duZXJEb2N1bWVudCAmJiBub2RlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcgJiYgbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LnNjcm9sbFggfHwgMDtcbiAgICAgICAgICAgIGxldCBzY3JvbGxZID0gbm9kZSAmJiBub2RlLm93bmVyRG9jdW1lbnQgJiYgbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3ICYmIG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5zY3JvbGxZIHx8IDA7XG4gICAgICAgICAgICBjb25zdCByZXQgPSB7XG4gICAgICAgICAgICAgICAgXCJsZWZ0XCI6IE1hdGguY2VpbChib3VuZHMubGVmdCArIHNjcm9sbFgpLFxuICAgICAgICAgICAgICAgIFwidG9wXCI6IE1hdGguY2VpbChib3VuZHMudG9wICsgc2Nyb2xsWSksXG4gICAgICAgICAgICAgICAgXCJoZWlnaHRcIjogTWF0aC5jZWlsKGJvdW5kcy5oZWlnaHQpLFxuICAgICAgICAgICAgICAgIFwid2lkdGhcIjogTWF0aC5jZWlsKGJvdW5kcy53aWR0aClcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSBhcyBFbGVtZW50LCBcIkRPTU1hcHBlcl9VbmFkanVzdGVkQm91bmRzXCIsIHJldCk7XG4gICAgICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMC0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4vRE9NV2Fsa2VyXCI7XG5cbi8qKlxuICogVXRpbGl0eSBjbGFzcyBwcm92aWRpbmcgaGVscGVyIG1ldGhvZHMgZm9yIERPTSBtYW5pcHVsYXRpb24gYW5kIHRyYXZlcnNhbCBvcGVyYXRpb25zLlxuICogVXNlZCB0aHJvdWdob3V0IHRoZSBhY2Nlc3NpYmlsaXR5IGNoZWNrZXIgZW5naW5lIHRvIG5hdmlnYXRlIGFuZCBhbmFseXplIERPTSBzdHJ1Y3R1cmVzLlxuICovXG5leHBvcnQgY2xhc3MgRE9NVXRpbCB7XG4gICAgXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGEgZ2l2ZW4gbm9kZSBoYXMgYW4gYW5jZXN0b3IgZWxlbWVudCB3aXRoIGEgbm9kZSBuYW1lIG1hdGNoaW5nIGFueSBvZiB0aGUgcHJvdmlkZWQgbmFtZXMuXG4gICAgICogVHJhdmVyc2VzIHVwIHRoZSBET00gdHJlZSBmcm9tIHRoZSBnaXZlbiBub2RlIHVudGlsIGEgbWF0Y2ggaXMgZm91bmQgb3IgdGhlIHJvb3QgaXMgcmVhY2hlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBub2RlIC0gVGhlIHN0YXJ0aW5nIERPTSBub2RlIHRvIGNoZWNrXG4gICAgICogQHBhcmFtIG5hbWVzIC0gQXJyYXkgb2Ygbm9kZSBuYW1lcyAodGFnIG5hbWVzKSB0byBzZWFyY2ggZm9yIGluIHVwcGVyY2FzZSAoZS5nLiwgWydUQUJMRScsICdESVYnXSlcbiAgICAgKiBAcmV0dXJucyB0cnVlIGlmIGFuIGFuY2VzdG9yIHdpdGggYSBtYXRjaGluZyBuYW1lIGlzIGZvdW5kLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgKi9cbiAgICBzdGF0aWMgaGFzUGFyZW50KG5vZGU6IE5vZGUsIG5hbWVzOnN0cmluZ1tdKSB7XG4gICAgICAgIGxldCBwID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQobm9kZSk7XG4gICAgICAgIHdoaWxlIChwICYmICFuYW1lcy5pbmNsdWRlcyhwLm5vZGVOYW1lKSkge1xuICAgICAgICAgICAgcCA9IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KHApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAhIXA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0cmlldmVzIHRoZSBmaXJzdCBhbmNlc3RvciBlbGVtZW50IHRoYXQgbWF0Y2hlcyBhbnkgb2YgdGhlIHByb3ZpZGVkIG5vZGUgbmFtZXMgKGNhc2UtaW5zZW5zaXRpdmUpLlxuICAgICAqIFNpbWlsYXIgdG8gaGFzUGFyZW50IGJ1dCByZXR1cm5zIHRoZSBhY3R1YWwgZWxlbWVudCByZWZlcmVuY2UgYW5kIHBlcmZvcm1zIGNhc2UtaW5zZW5zaXRpdmUgY29tcGFyaXNvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBub2RlIC0gVGhlIHN0YXJ0aW5nIERPTSBub2RlXG4gICAgICogQHBhcmFtIG5hbWVzIC0gQXJyYXkgb2YgbG93ZXJjYXNlIG5vZGUgbmFtZXMgdG8gc2VhcmNoIGZvciAoZS5nLiwgWyd0YWJsZScsICdkaXYnXSlcbiAgICAgKiBAcmV0dXJucyBUaGUgbWF0Y2hpbmcgYW5jZXN0b3IgZWxlbWVudCwgb3IgbnVsbCBpZiBub25lIGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIGdldEFuY2VzdG9yKG5vZGU6IE5vZGUsIG5hbWVzOnN0cmluZ1tdKSB7XG4gICAgICAgIGxldCBwID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQobm9kZSk7XG4gICAgICAgIHdoaWxlIChwICYmICFuYW1lcy5pbmNsdWRlcyhwLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICAgICAgICBwID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQocCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyBpZiB0d28gbm9kZXMgYXJlIHRoZSBzYW1lIG5vZGUsIHdpdGggZmFsbGJhY2sgc3RyYXRlZ2llcyBmb3IgZGlmZmVyZW50IGJyb3dzZXIgZW52aXJvbm1lbnRzLlxuICAgICAqIFVzZXMgbXVsdGlwbGUgY29tcGFyaXNvbiBtZXRob2RzIGZvciBjcm9zcy1icm93c2VyIGNvbXBhdGliaWxpdHk6XG4gICAgICogMS4gU3RyaWN0IGVxdWFsaXR5ICg9PT0pXG4gICAgICogMi4gaXNTYW1lTm9kZSgpIG1ldGhvZCBpZiBhdmFpbGFibGVcbiAgICAgKiAzLiBjb21wYXJlRG9jdW1lbnRQb3NpdGlvbigpIChyZXR1cm5zIDAgaWYgc2FtZSBub2RlKVxuICAgICAqIDQuIFJldHVybnMgdHJ1ZSBhcyBsYXN0IHJlc29ydCBpZiBubyBjb21wYXJpc29uIG1ldGhvZCBpcyBhdmFpbGFibGVcbiAgICAgKlxuICAgICAqIEBwYXJhbSBhIC0gRmlyc3Qgbm9kZSB0byBjb21wYXJlXG4gICAgICogQHBhcmFtIGIgLSBTZWNvbmQgbm9kZSB0byBjb21wYXJlXG4gICAgICogQHJldHVybnMgdHJ1ZSBpZiBub2RlcyBhcmUgdGhlIHNhbWUsIGZhbHNlIG90aGVyd2lzZVxuICAgICAqL1xuICAgIHN0YXRpYyBzYW1lTm9kZShhOiBOb2RlLCBiOiBOb2RlKSA6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoYSA9PT0gYikge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAoYS5pc1NhbWVOb2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gYS5pc1NhbWVOb2RlKGIpO1xuICAgICAgICB9IGVsc2UgaWYgKGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGIpID09PSAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gTm90IHN1cHBvcnRlZCBpbiB0aGlzIGVudmlyb25tZW50IC0gdHJ5IG91ciBiZXN0XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE5vcm1hbGl6ZXMgd2hpdGVzcGFjZSBpbiBhIHN0cmluZyBieSByZXBsYWNpbmcgYWxsIHdoaXRlc3BhY2UgY2hhcmFjdGVyc1xuICAgICAqIChzcGFjZXMsIHRhYnMsIGNhcnJpYWdlIHJldHVybnMsIG5ld2xpbmVzKSB3aXRoIHNpbmdsZSBzcGFjZXMgYW5kIGNvbGxhcHNpbmdcbiAgICAgKiBtdWx0aXBsZSBjb25zZWN1dGl2ZSBzcGFjZXMgaW50byBvbmUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcyAtIFRoZSBpbnB1dCBzdHJpbmcgdG8gY2xlYW5cbiAgICAgKiBAcmV0dXJucyBUaGUgY2xlYW5lZCBzdHJpbmcgd2l0aCBub3JtYWxpemVkIHdoaXRlc3BhY2VcbiAgICAgKiBAZXhhbXBsZSBcIkhlbGxvXFxuXFx0ICBXb3JsZFwiIOKGkiBcIkhlbGxvIFdvcmxkXCJcbiAgICAgKi9cbiAgICBzdGF0aWMgY2xlYW5XaGl0ZXNwYWNlKHM6IHN0cmluZykgOiBzdHJpbmcge1xuICAgICAgICBsZXQgcmV0VmFsID0gcy5yZXBsYWNlKC9bIFxcdFxcclxcbl0vZywgXCIgXCIpLnJlcGxhY2UoLyArL2csXCIgXCIpO1xuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbGxhcHNlcyBtdWx0aXBsZSBjb25zZWN1dGl2ZSBzcGFjZXMgaW50byBhIHNpbmdsZSBzcGFjZS5cbiAgICAgKiBVbmxpa2UgY2xlYW5XaGl0ZXNwYWNlLCBvbmx5IGhhbmRsZXMgc3BhY2VzLCBub3Qgb3RoZXIgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGxpa2UgdGFicyBvciBuZXdsaW5lcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzIC0gVGhlIGlucHV0IHN0cmluZyB0byBjbGVhblxuICAgICAqIEByZXR1cm5zIFRoZSBzdHJpbmcgd2l0aCBjb2xsYXBzZWQgc3BhY2VzXG4gICAgICovXG4gICAgc3RhdGljIGNsZWFuU3BhY2Uoczogc3RyaW5nKSA6IHN0cmluZyB7XG4gICAgICAgIGxldCByZXRWYWwgPSBzLnJlcGxhY2UoLyArL2csXCIgXCIpO1xuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERldGVybWluZXMgaWYgdHdvIGVsZW1lbnRzICh0eXBpY2FsbHkgdGFibGUgY2VsbHMpIGJlbG9uZyB0byB0aGUgc2FtZSB0YWJsZSBlbGVtZW50LlxuICAgICAqIEZpbmRzIHRoZSB0YWJsZSBhbmNlc3RvciBmb3IgZWFjaCBlbGVtZW50IGFuZCBjb21wYXJlcyB0aGVtIHVzaW5nIHNhbWVOb2RlKCkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZWxlbWVudDEgLSBGaXJzdCBlbGVtZW50IHRvIGNoZWNrXG4gICAgICogQHBhcmFtIGVsZW1lbnQyIC0gU2Vjb25kIGVsZW1lbnQgdG8gY2hlY2tcbiAgICAgKiBAcmV0dXJucyB0cnVlIGlmIGJvdGggZWxlbWVudHMgc2hhcmUgdGhlIHNhbWUgdGFibGUgYW5jZXN0b3IsIGZhbHNlIG90aGVyd2lzZVxuICAgICAqL1xuICAgIHN0YXRpYyBpc0luU2FtZVRhYmxlKGVsZW1lbnQxLCBlbGVtZW50Mikge1xuICAgICAgICBpZiAoZWxlbWVudDEgJiYgZWxlbWVudDIpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudE5hbWUgPSBbJ3RhYmxlJ107XG4gICAgICAgICAgICBjb25zdCBwYXJlbnQxPSBET01VdGlsLmdldEFuY2VzdG9yKGVsZW1lbnQxLCBwYXJlbnROYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudDI9IERPTVV0aWwuZ2V0QW5jZXN0b3IoZWxlbWVudDIsIHBhcmVudE5hbWUpO1xuICAgICAgICAgICAgaWYgKHBhcmVudDEgIT09IG51bGwgJiYgcGFyZW50MiAhPSBudWxsICYmIERPTVV0aWwuc2FtZU5vZGUocGFyZW50MSwgcGFyZW50MikpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBcbiAgICAvKipcbiAgICAgKiBUcmF2ZXJzZXMgdXAgdGhlIERPTSB0cmVlIHRvIGZpbmQgdGhlIHNoYWRvdyByb290IChkb2N1bWVudCBmcmFnbWVudCkgdGhhdCBjb250YWlucyB0aGUgZ2l2ZW4gbm9kZS5cbiAgICAgKiBJbXBvcnRhbnQgZm9yIGhhbmRsaW5nIFdlYiBDb21wb25lbnRzIGFuZCBTaGFkb3cgRE9NIHN0cnVjdHVyZXMgaW4gYWNjZXNzaWJpbGl0eSBjaGVja2luZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBub2RlIC0gVGhlIHN0YXJ0aW5nIG5vZGVcbiAgICAgKiBAcmV0dXJucyBUaGUgc2hhZG93IHJvb3Qgbm9kZSAobm9kZVR5cGUgMTEgPSBET0NVTUVOVF9GUkFHTUVOVF9OT0RFKSwgb3IgbnVsbCBpZiBub25lIGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIHNoYWRvd1Jvb3ROb2RlKG5vZGU6IE5vZGUpIDogTm9kZSB8IG51bGwge1xuICAgICAgICBsZXQgbmQgPSBub2RlO1xuICAgICAgICB3aGlsZSAobmQgIT0gbnVsbCAmJiBuZC5ub2RlVHlwZSAhPT0gMTEgLyogTm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFICovKVxuICAgICAgICAgICAgbmQgPSBuZC5wYXJlbnROb2RlO1xuICAgICAgICByZXR1cm4gbmQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGRlZXAgY29weSBvZiBhbiBvYmplY3Qgd2hpbGUgcHJlc2VydmluZyBOb2RlIHJlZmVyZW5jZXMgKGRvZXNuJ3QgY2xvbmUgTm9kZSBvYmplY3RzKS5cbiAgICAgKiBVc2VmdWwgd2hlbiBjb3B5aW5nIGRhdGEgc3RydWN0dXJlcyB0aGF0IGNvbnRhaW4gRE9NIG5vZGUgcmVmZXJlbmNlcywgYXMgeW91IHR5cGljYWxseSB3YW50XG4gICAgICogdG8gcHJlc2VydmUgdGhvc2UgcmVmZXJlbmNlcyByYXRoZXIgdGhhbiBhdHRlbXB0aW5nIHRvIGNsb25lIHRoZSBub2RlcyB0aGVtc2VsdmVzLlxuICAgICAqXG4gICAgICogQmVoYXZpb3I6XG4gICAgICogLSBQcmltaXRpdmUgdmFsdWVzOiBEZWVwIGNvcGllZCB2aWEgSlNPTiBzZXJpYWxpemF0aW9uXG4gICAgICogLSBGdW5jdGlvbnM6IFJldHVybmVkIGFzLWlzIChyZWZlcmVuY2UpXG4gICAgICogLSBOb2RlIG9iamVjdHM6IFJldHVybmVkIGFzLWlzIChyZWZlcmVuY2UsIG5vdCBjbG9uZWQpXG4gICAgICogLSBBcnJheXMvT2JqZWN0czogUmVjdXJzaXZlbHkgY29waWVkIHdpdGggdGhlIHNhbWUgcnVsZXNcbiAgICAgKlxuICAgICAqIEBwYXJhbSByaHMgLSBUaGUgb2JqZWN0IHRvIGNvcHkgKHJpZ2h0LWhhbmQgc2lkZSlcbiAgICAgKiBAcmV0dXJucyBBIGNvcHkgb2YgdGhlIG9iamVjdCB3aXRoIE5vZGUgcmVmZXJlbmNlcyBwcmVzZXJ2ZWRcbiAgICAgKi9cbiAgICBzdGF0aWMgb2JqZWN0Q29weVdpdGhOb2RlUmVmcyhyaHM6IGFueSkge1xuICAgICAgICBpZiAoIXJocykgcmV0dXJuIHJocztcbiAgICAgICAgaWYgKHR5cGVvZiByaHMgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcmhzID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmhzO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShyaHMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChyaHMgaW5zdGFuY2VvZiBOb2RlIHx8ICEhcmhzLm5vZGVUeXBlKSB7XG4gICAgICAgICAgICByZXR1cm4gcmhzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IHJldFZhbDtcbiAgICAgICAgICAgIGlmIChyaHMuY29uc3RydWN0b3IubmFtZSA9PT0gXCJBcnJheVwiKSB7XG4gICAgICAgICAgICAgICAgcmV0VmFsID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHJocykge1xuICAgICAgICAgICAgICAgICAgICByZXRWYWwucHVzaCh0aGlzLm9iamVjdENvcHlXaXRoTm9kZVJlZnMoaXRlbSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0VmFsID0ge307XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gcmhzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbFtrZXldID0gdGhpcy5vYmplY3RDb3B5V2l0aE5vZGVSZWZzKHJoc1trZXldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmluZHMgdGhlIGZpcnN0IGFuY2VzdG9yIGVsZW1lbnQgdGhhdCBoYXMgYSBzcGVjaWZpYyBhdHRyaWJ1dGUgd2l0aCBhIHNwZWNpZmljIHZhbHVlLlxuICAgICAqIFRyYXZlcnNlcyB1cCB0aGUgRE9NIHRyZWUgZnJvbSB0aGUgZ2l2ZW4gZWxlbWVudCB1bnRpbCBhIG1hdGNoaW5nIGFuY2VzdG9yIGlzIGZvdW5kLlxuICAgICAqXG4gICAgICogQHBhcmFtIGVsZW1lbnQgLSBUaGUgc3RhcnRpbmcgZWxlbWVudFxuICAgICAqIEBwYXJhbSBhdHRyTmFtZSAtIFRoZSBhdHRyaWJ1dGUgbmFtZSB0byBzZWFyY2ggZm9yXG4gICAgICogQHBhcmFtIGF0dHJWYWx1ZSAtIFRoZSBleHBlY3RlZCBhdHRyaWJ1dGUgdmFsdWVcbiAgICAgKiBAcmV0dXJucyBUaGUgbWF0Y2hpbmcgYW5jZXN0b3IgZWxlbWVudCwgb3IgbnVsbCBpZiBub25lIGZvdW5kXG4gICAgICogQGV4YW1wbGUgRmluZGluZyBhbiBhbmNlc3RvciB3aXRoIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIG9yIGRhdGEtdGVzdGlkPVwiY29udGFpbmVyXCJcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEFuY2VzdG9yV2l0aEF0dHJpYnV0ZShlbGVtZW50LCBhdHRyTmFtZSwgYXR0clZhbHVlKSB7XG4gICAgICAgIGxldCB3YWxrTm9kZSA9IERPTVdhbGtlci5wYXJlbnROb2RlKGVsZW1lbnQpO1xuICAgICAgICB3aGlsZSAod2Fsa05vZGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmICh3YWxrTm9kZS5ub2RlVHlwZSA9PT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLyAmJiAoPEVsZW1lbnQ+d2Fsa05vZGUpLmdldEF0dHJpYnV0ZShhdHRyTmFtZSkgPT09IGF0dHJWYWx1ZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gd2Fsa05vZGU7XG4gICAgICAgICAgICB3YWxrTm9kZSA9IERPTVdhbGtlci5wYXJlbnROb2RlKHdhbGtOb2RlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3Y0L3V0aWwvVmlzVXRpbFwiO1xuLyoqXG4gKiBXYWxrcyBpbiBhIERPTSBvcmRlclxuICogXG4gKiBBc3N1bXB0aW9uIHRoYXQgbm9kZXMgb2Ygc2hhZG93IERPTXMgY2FsbCBhc3NpZ25TbG90cyBvbiB0aGUgc2hhZG93IHJvb3QgYmVmb3JlIFxuICogZG9pbmcgb3RoZXIgcHJvY2Vzc2luZyBpbiB0aGF0IHRyZWUuIElmIHlvdSB3YWxrIGludG8gYSBzaGFkb3cgcm9vdCwgdGhlIERPTVdhbGtlclxuICogd2lsbCBkbyBpdCBhdXRvbWF0aWNhbGx5LlxuICogXG4gKiBTZWUgYWxzbyAuLi9hcmlhL0FSSUFXYWxrZXJcbiAqL1xuZXhwb3J0IGNsYXNzIERPTVdhbGtlciB7XG4gICAgcm9vdCA6IE5vZGU7XG4gICAgbm9kZSA6IE5vZGU7XG4gICAgYkVuZFRhZzogYm9vbGVhbjtcbiAgICBjb25zaWRlckhpZGRlbjogYm9vbGVhbjtcbiAgICBERUJVRzogYm9vbGVhbjtcblxuICAgIGNvbnN0cnVjdG9yKGVsZW1lbnQgOiBOb2RlLCBiRW5kPyA6IGJvb2xlYW4sIHJvb3Q/IDogTm9kZSwgY29uc2lkZXJIaWRkZW4/IDogYm9vbGVhbiwgREVCVUc/OiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuREVCVUcgPSAhIURFQlVHO1xuICAgICAgICB0aGlzLnJvb3QgPSByb290IHx8ICgoZWxlbWVudCAmJiBlbGVtZW50Lm93bmVyRG9jdW1lbnQpID8gZWxlbWVudC5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudDogZWxlbWVudCk7XG4gICAgICAgIGlmICh0aGlzLnJvb3Qubm9kZVR5cGUgPT09IDkpIHtcbiAgICAgICAgICAgIHRoaXMucm9vdCA9ICh0aGlzLnJvb3QgYXMgRG9jdW1lbnQpLmRvY3VtZW50RWxlbWVudFxuICAgICAgICB9XG4gICAgICAgIHRoaXMubm9kZSA9IGVsZW1lbnQ7XG4gICAgICAgIGlmICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDkpIHtcbiAgICAgICAgICAgIHRoaXMubm9kZSA9ICh0aGlzLm5vZGUgYXMgRG9jdW1lbnQpLmRvY3VtZW50RWxlbWVudFxuICAgICAgICB9XG4gICAgICAgIHRoaXMuYkVuZFRhZyA9IChiRW5kID09IHVuZGVmaW5lZCA/IGZhbHNlIDogYkVuZCA9PSB0cnVlKTtcbiAgICAgICAgdGhpcy5jb25zaWRlckhpZGRlbiA9IGNvbnNpZGVySGlkZGVuIHx8IGZhbHNlO1xuICAgIH1cblxuICAgIGVsZW0oKSA6IEhUTUxFbGVtZW50IHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgJiYgdGhpcy5ub2RlIGFzIEhUTUxFbGVtZW50IHx8IG51bGw7XG4gICAgfVxuICAgIFxuICAgIHN0YXRpYyBwYXJlbnROb2RlKG5vZGU6IE5vZGUpIDogTm9kZSB8IG51bGwge1xuICAgICAgICBpZiAobm9kZSA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBwIDogTm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgaWYgKChub2RlIGFzIGFueSkuc2xvdE93bmVyKSB7XG4gICAgICAgICAgICBwID0gKG5vZGUgYXMgYW55KS5zbG90T3duZXI7XG4gICAgICAgIH0gZWxzZSBpZiAoKG5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQpIHtcbiAgICAgICAgICAgIHAgPSAobm9kZSBhcyBhbnkpLm93bmVyRWxlbWVudDtcbiAgICAgICAgfSBlbHNlIGlmIChwICYmIHAubm9kZVR5cGUgPT09IDExKSB7XG4gICAgICAgICAgICBpZiAoKHAgYXMgU2hhZG93Um9vdCkuaG9zdCkge1xuICAgICAgICAgICAgICAgIHAgPSAocCBhcyBTaGFkb3dSb290KS5ob3N0O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcDtcbiAgICB9XG5cbiAgICBzdGF0aWMgcGFyZW50RWxlbWVudChub2RlOiBOb2RlKSA6IEVsZW1lbnQgfCBudWxsIHtcbiAgICAgICAgbGV0IGVsZW0gOiBFbGVtZW50ID0gbm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBkbyB7IFxuICAgICAgICAgICAgZWxlbSA9IERPTVdhbGtlci5wYXJlbnROb2RlKGVsZW0pIGFzIEVsZW1lbnQ7XG4gICAgICAgIH0gd2hpbGUgKGVsZW0gJiYgZWxlbS5ub2RlVHlwZSAhPT0gMSk7XG4gICAgICAgIHJldHVybiBlbGVtO1xuICAgIH1cblxuICAgIHN0YXRpYyBhc3NpZ25TbG90cyhyb290OiBTaGFkb3dSb290KSB7XG4gICAgICAgIGxldCBzbG90cyA9IHJvb3QucXVlcnlTZWxlY3RvckFsbChcInNsb3RcIik7XG4gICAgICAgIGZvciAobGV0IGlTbG90PTA7IGlTbG90PHNsb3RzLmxlbmd0aDsgKytpU2xvdCkge1xuICAgICAgICAgICAgbGV0IHByb2Nlc3NTbG90ID0gc2xvdHNbaVNsb3RdO1xuICAgICAgICAgICAgbGV0IGFzc2lnbmVkTm9kZXMgPSBwcm9jZXNzU2xvdC5hc3NpZ25lZE5vZGVzKCk7XG4gICAgICAgICAgICBmb3IgKGxldCBpQXNzaWduZWQ9MDsgaUFzc2lnbmVkPGFzc2lnbmVkTm9kZXMubGVuZ3RoOyArK2lBc3NpZ25lZCkge1xuICAgICAgICAgICAgICAgIChhc3NpZ25lZE5vZGVzW2lBc3NpZ25lZF0gYXMgYW55KS5zbG90T3duZXIgPSBwcm9jZXNzU2xvdDtcbiAgICAgICAgICAgICAgICAoYXNzaWduZWROb2Rlc1tpQXNzaWduZWRdIGFzIGFueSkuc2xvdEluZGV4ID0gaUFzc2lnbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGZpcnN0Q2hpbGROb3RPd25lZEJ5U2xvdChub2RlOiBOb2RlKSB7XG4gICAgICAgIGxldCByZXRWYWwgPSBub2RlLmZpcnN0Q2hpbGQ7XG4gICAgICAgIHdoaWxlIChyZXRWYWwgJiYgKHJldFZhbCBhcyBhbnkpLnNsb3RPd25lcikge1xuICAgICAgICAgICAgcmV0VmFsID0gcmV0VmFsLm5leHRTaWJsaW5nO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgc3RhdGljIGxhc3RDaGlsZE5vdE93bmVkQnlTbG90KG5vZGU6IE5vZGUpIHtcbiAgICAgICAgbGV0IHJldFZhbCA9IG5vZGUubGFzdENoaWxkO1xuICAgICAgICB3aGlsZSAocmV0VmFsICYmIChyZXRWYWwgYXMgYW55KS5zbG90T3duZXIpIHtcbiAgICAgICAgICAgIHJldFZhbCA9IHJldFZhbC5wcmV2aW91c1NpYmxpbmc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICBzdGF0aWMgbmV4dFNpYmxpbmdOb3RPd25lZEJ5U2xvdChub2RlOk5vZGUpIHtcbiAgICAgICAgbGV0IHJldFZhbCA9IG5vZGUubmV4dFNpYmxpbmc7XG4gICAgICAgIHdoaWxlIChyZXRWYWwgJiYgKHJldFZhbCBhcyBhbnkpLnNsb3RPd25lcikge1xuICAgICAgICAgICAgcmV0VmFsID0gcmV0VmFsLm5leHRTaWJsaW5nO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgc3RhdGljIHByZXZpb3VzU2libGluZ05vdE93bmVkQnlTbG90KG5vZGU6Tm9kZSkge1xuICAgICAgICBsZXQgcmV0VmFsID0gbm9kZS5wcmV2aW91c1NpYmxpbmc7XG4gICAgICAgIHdoaWxlIChyZXRWYWwgJiYgKHJldFZhbCBhcyBhbnkpLnNsb3RPd25lcikge1xuICAgICAgICAgICAgcmV0VmFsID0gcmV0VmFsLnByZXZpb3VzU2libGluZztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIGF0Um9vdCgpIDogYm9vbGVhbiB7XG4gICAgICAgIGlmICgodGhpcy5ub2RlIGFzIGFueSkub3duZXJFbGVtZW50KSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLnJvb3QgPT09IHRoaXMubm9kZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5yb290LmlzU2FtZU5vZGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJvb3QuaXNTYW1lTm9kZSh0aGlzLm5vZGUpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucm9vdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucm9vdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbih0aGlzLm5vZGUpID09PSAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gTm90IHN1cHBvcnRlZCBpbiB0aGlzIGVudmlyb25tZW50IC0gdHJ5IG91ciBiZXN0XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5ub2RlLnBhcmVudE5vZGUgPT09IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBERUJVR0lEWCA9IDA7XG4gICAgaW5kZW50ID0gMDtcbiAgICBuZXh0Tm9kZSgpIDogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGluZGVudCA9ICgpID0+IHtcbiAgICAgICAgICAgIGxldCBzID0gXCJcIjtcbiAgICAgICAgICAgIGZvciAobGV0IGlkeD0wOyBpZHg8dGhpcy5pbmRlbnQ7ICsraWR4KSB7XG4gICAgICAgICAgICAgICAgcyArPSBcIiBcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzO1xuICAgICAgICB9XG4gICAgICAgIGxldCBEQkcgPSBmYWxzZTsvL3RoaXMuREVCVUdJRFggPj0gNyAmJiB0aGlzLkRFQlVHSURYIDw9IDEwO1xuICAgICAgICBsZXQgc3RhcnROYW1lID0gdGhpcy5ub2RlLm5vZGVOYW1lO1xuICAgICAgICBpZiAoIXRoaXMubm9kZSkge1xuICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyh0aGlzLm5vZGUubm9kZU5hbWUsIHRoaXMuYkVuZFRhZz9cIkVORFwiOlwiU1RBUlRcIiwgdGhpcy5ub2RlLm5vZGVUeXBlID09PSAxICYmICh0aGlzLm5vZGUgYXMgYW55KS5nZXRBdHRyaWJ1dGUoXCJpZFwiKSk7XG4gICAgICAgICAgICBpZiAoIXRoaXMuYkVuZFRhZykge1xuICAgICAgICAgICAgICAgIGxldCBpZnJhbWVOb2RlID0gKHRoaXMubm9kZSBhcyBIVE1MSUZyYW1lRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgbGV0IGVsZW1lbnROb2RlID0gKHRoaXMubm9kZSBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgbGV0IHNsb3RFbGVtZW50ID0gKHRoaXMubm9kZSBhcyBIVE1MU2xvdEVsZW1lbnQpXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLyBcbiAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5ub2RlLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiSUZSQU1FXCJcbiAgICAgICAgICAgICAgICAgICAgJiYgKHRoaXMuY29uc2lkZXJIaWRkZW4gPyBWaXNVdGlsLmlzTm9kZVZpc2libGUoaWZyYW1lTm9kZSkgOiB0cnVlKVxuICAgICAgICAgICAgICAgICAgICAmJiBpZnJhbWVOb2RlLmNvbnRlbnREb2N1bWVudFxuICAgICAgICAgICAgICAgICAgICAmJiBpZnJhbWVOb2RlLmNvbnRlbnREb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBEQkcgJiYgY29uc29sZS5sb2coXCIhISFJbnRvIEZyYW1lXCIpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgb3duZXJFbGVtZW50ID0gdGhpcy5ub2RlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBpZnJhbWVOb2RlLmNvbnRlbnREb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICh0aGlzLm5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQgPSBvd25lckVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8gXG4gICAgICAgICAgICAgICAgICAgICYmICh0aGlzLmNvbnNpZGVySGlkZGVuID8gVmlzVXRpbC5pc05vZGVWaXNpYmxlKGVsZW1lbnROb2RlKSA6IHRydWUpXG4gICAgICAgICAgICAgICAgICAgICYmIGVsZW1lbnROb2RlLnNoYWRvd1Jvb3RcbiAgICAgICAgICAgICAgICAgICAgJiYgZWxlbWVudE5vZGUuc2hhZG93Um9vdC5maXJzdENoaWxkKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgREJHICYmIGNvbnNvbGUubG9nKFwiISEhSW50byBzaGFkb3cgcm9vdFwiKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG93bmVyRWxlbWVudCA9IHRoaXMubm9kZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gZWxlbWVudE5vZGUuc2hhZG93Um9vdDtcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMubm9kZSBhcyBhbnkpLm93bmVyRWxlbWVudCA9IG93bmVyRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgRE9NV2Fsa2VyLmFzc2lnblNsb3RzKHRoaXMubm9kZSBhcyBTaGFkb3dSb290KTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMVxuICAgICAgICAgICAgICAgICAgICAmJiBlbGVtZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInNsb3RcIlxuICAgICAgICAgICAgICAgICAgICAmJiBzbG90RWxlbWVudC5hc3NpZ25lZE5vZGVzKCkubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIERCRyAmJiBjb25zb2xlLmxvZyhcIiEhIUludG8gc2xvdFwiKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gc2xvdEVsZW1lbnQuYXNzaWduZWROb2RlcygpWzBdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLyB8fCB0aGlzLm5vZGUubm9kZVR5cGUgPT09IDExIC8qIE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSAqLylcbiAgICAgICAgICAgICAgICAgICAgJiYgRE9NV2Fsa2VyLmZpcnN0Q2hpbGROb3RPd25lZEJ5U2xvdCh0aGlzLm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIERCRyAmJiBjb25zb2xlLmxvZyhcIiEhIUZpcnN0IGNoaWxkXCIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBET01XYWxrZXIuZmlyc3RDaGlsZE5vdE93bmVkQnlTbG90KHRoaXMubm9kZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgREJHICYmIGNvbnNvbGUubG9nKFwiISEhRmxpcCB0byBlbmQgdGFnXCIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgREJHICYmIGNvbnNvbGUubG9nKFwiISEhMVwiKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hdFJvb3QoKSkge1xuICAgICAgICAgICAgICAgICAgICBEQkcgJiYgY29uc29sZS5sb2coXCIhISFEb25lIGF0IHJvb3RcIik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCh0aGlzLm5vZGUgYXMgYW55KS5zbG90T3duZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNsb3RPd25lciA9ICh0aGlzLm5vZGUgYXMgYW55KS5zbG90T3duZXI7XG4gICAgICAgICAgICAgICAgICAgIGxldCBuZXh0U2xvdEluZGV4ID0gKHRoaXMubm9kZSBhcyBhbnkpLnNsb3RJbmRleCsxO1xuICAgICAgICAgICAgICAgICAgICAvLyBkZWxldGUgKHRoaXMubm9kZSBhcyBhbnkpLnNsb3RPd25lcjtcbiAgICAgICAgICAgICAgICAgICAgLy8gZGVsZXRlICh0aGlzLm5vZGUgYXMgYW55KS5zbG90SW5kZXg7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0U2xvdEluZGV4IDwgc2xvdE93bmVyLmFzc2lnbmVkTm9kZXMoKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIERCRyAmJiBjb25zb2xlLmxvZyhcIiEhIU5leHQgc2xvdCBjaGlsZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHNsb3RPd25lci5hc3NpZ25lZE5vZGVzKClbbmV4dFNsb3RJbmRleF07XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIERCRyAmJiBjb25zb2xlLmxvZyhcIiEhIUJhY2sgdXAgdG8gc2xvdCBvd25lclwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHNsb3RPd25lcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCh0aGlzLm5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgREJHICYmIGNvbnNvbGUubG9nKFwiISEhVXAgdG8gZnJhbWUgb3duZXJcIik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9ICh0aGlzLm5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChET01XYWxrZXIubmV4dFNpYmxpbmdOb3RPd25lZEJ5U2xvdCh0aGlzLm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIERCRyAmJiBjb25zb2xlLmxvZyhcIiEhIU5leHQgc2libGluZ1wiKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gRE9NV2Fsa2VyLm5leHRTaWJsaW5nTm90T3duZWRCeVNsb3QodGhpcy5ub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm5vZGUucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgICAgICAgICBEQkcgJiYgY29uc29sZS5sb2coXCIhISFQYXJlbnRcIik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHRoaXMubm9kZS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIERCRyAmJiBjb25zb2xlLmxvZyhcIiEhIURvbmUgd2l0aCB3YWxrXCIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKERCRyAmJiAoXG4gICAgICAgICAgICAgICAgKHRoaXMubm9kZS5ub2RlVHlwZSAhPT0gMSAmJiB0aGlzLm5vZGUubm9kZVR5cGUgIT09IDExICYmIHRoaXMubm9kZS5ub2RlVHlwZSAhPT0gMyApXG4gICAgICAgICAgICAgICAgfHwgKHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSAmJiAodGhpcy5ub2RlIGFzIEVsZW1lbnQpLmdldEF0dHJpYnV0ZShcImFDaGVja2VyXCIpID09PSBcIkFDRVwiKVxuICAgICAgICAgICAgKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuREVCVUcgJiYgY29uc29sZS5sb2coaW5kZW50KCkrYDwke3RoaXMuYkVuZFRhZz9cIi9cIjpcIlwifSR7dGhpcy5ub2RlLm5vZGVOYW1lfT4gKGZyb20gJHtzdGFydE5hbWV9KSAke3RoaXMuREVCVUdJRFgrK30gU0tJUFBFRGApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IHdoaWxlIChcbiAgICAgICAgICAgICh0aGlzLm5vZGUubm9kZVR5cGUgIT09IDEgJiYgdGhpcy5ub2RlLm5vZGVUeXBlICE9PSAxMSAmJiB0aGlzLm5vZGUubm9kZVR5cGUgIT09IDMgKVxuICAgICAgICAgICAgfHwgKHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSAmJiAodGhpcy5ub2RlIGFzIEVsZW1lbnQpLmdldEF0dHJpYnV0ZShcImFDaGVja2VyXCIpID09PSBcIkFDRVwiKVxuICAgICAgICApO1xuICAgICAgICBpZiAodGhpcy5iRW5kVGFnKSB0aGlzLmluZGVudCAtPSAyO1xuICAgICAgICB0aGlzLkRFQlVHICYmIGNvbnNvbGUubG9nKGluZGVudCgpK2A8JHt0aGlzLmJFbmRUYWc/XCIvXCI6XCJcIn0ke3RoaXMubm9kZS5ub2RlTmFtZX0+IChmcm9tICR7c3RhcnROYW1lfSkgJHt0aGlzLkRFQlVHSURYKyt9YCk7XG4gICAgICAgIHRoaXMuREVCVUcgJiYgKHRoaXMubm9kZSBhcyBhbnkpLnNsb3RPd25lciAmJiBjb25zb2xlLmxvZyhpbmRlbnQoKStgc2xvdE93bmVyOiAkeyh0aGlzLm5vZGUgYXMgYW55KS5zbG90T3duZXIubm9kZU5hbWV9YCk7XG4gICAgICAgIHRoaXMuREVCVUcgJiYgKHRoaXMubm9kZSBhcyBhbnkpLnNsb3RJbmRleCAmJiBjb25zb2xlLmxvZyhpbmRlbnQoKStgc2xvdEluZGV4OiAkeyh0aGlzLm5vZGUgYXMgYW55KS5zbG90SW5kZXh9YCk7XG4gICAgICAgIHRoaXMuREVCVUcgJiYgKHRoaXMubm9kZSBhcyBhbnkpLm93bmVyRWxlbWVudCAmJiBjb25zb2xlLmxvZyhpbmRlbnQoKStgb3duZXJFbGVtZW50OiAkeyh0aGlzLm5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQubm9kZU5hbWV9YCk7XG4gICAgICAgIGlmICghdGhpcy5iRW5kVGFnKSB0aGlzLmluZGVudCArPSAyO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcmV2Tm9kZSgpIDogYm9vbGVhbiB7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmJFbmRUYWcpIHtcbiAgICAgICAgICAgICAgICBsZXQgaWZyYW1lTm9kZSA9ICh0aGlzLm5vZGUgYXMgSFRNTElGcmFtZUVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGxldCBlbGVtZW50Tm9kZSA9ICh0aGlzLm5vZGUgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8gXG4gICAgICAgICAgICAgICAgICAgICYmIHRoaXMubm9kZS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIklGUkFNRVwiXG4gICAgICAgICAgICAgICAgICAgICYmICh0aGlzLmNvbnNpZGVySGlkZGVuID8gVmlzVXRpbC5pc05vZGVWaXNpYmxlKGlmcmFtZU5vZGUpIDogdHJ1ZSlcbiAgICAgICAgICAgICAgICAgICAgJiYgaWZyYW1lTm9kZS5jb250ZW50RG9jdW1lbnRcbiAgICAgICAgICAgICAgICAgICAgJiYgaWZyYW1lTm9kZS5jb250ZW50RG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSBcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBvd25lckVsZW1lbnQgPSB0aGlzLm5vZGU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IGlmcmFtZU5vZGUuY29udGVudERvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMubm9kZSBhcyBhbnkpLm93bmVyRWxlbWVudCA9IG93bmVyRWxlbWVudDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqL1xuICAgICAgICAgICAgICAgICAgICAmJiAodGhpcy5jb25zaWRlckhpZGRlbiA/IFZpc1V0aWwuaXNOb2RlVmlzaWJsZShlbGVtZW50Tm9kZSkgOiB0cnVlKVxuICAgICAgICAgICAgICAgICAgICAmJiBlbGVtZW50Tm9kZS5zaGFkb3dSb290XG4gICAgICAgICAgICAgICAgICAgICYmIGVsZW1lbnROb2RlLnNoYWRvd1Jvb3QubGFzdENoaWxkKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG93bmVyRWxlbWVudCA9IHRoaXMubm9kZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gZWxlbWVudE5vZGUuc2hhZG93Um9vdDtcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMubm9kZSBhcyBhbnkpLm93bmVyRWxlbWVudCA9IG93bmVyRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgRE9NV2Fsa2VyLmFzc2lnblNsb3RzKHRoaXMubm9kZSBhcyBTaGFkb3dSb290KTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMVxuICAgICAgICAgICAgICAgICAgICAmJiBlbGVtZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInNsb3RcIlxuICAgICAgICAgICAgICAgICAgICAmJiAoZWxlbWVudE5vZGUgYXMgSFRNTFNsb3RFbGVtZW50KS5hc3NpZ25lZE5vZGVzKCkubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEVudGVyIHNsb3Qgd2l0aCBhc3NpZ25lZCBub2RlcyAtIGdvIHRvIGxhc3QgYXNzaWduZWQgbm9kZVxuICAgICAgICAgICAgICAgICAgICBsZXQgc2xvdEVsZW1lbnQgPSBlbGVtZW50Tm9kZSBhcyBIVE1MU2xvdEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHNsb3RFbGVtZW50LmFzc2lnbmVkTm9kZXMoKVtzbG90RWxlbWVudC5hc3NpZ25lZE5vZGVzKCkubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgodGhpcy5ub2RlLm5vZGVUeXBlID09PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovIHx8IHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMTEpXG4gICAgICAgICAgICAgICAgICAgICYmIERPTVdhbGtlci5sYXN0Q2hpbGROb3RPd25lZEJ5U2xvdCh0aGlzLm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IERPTVdhbGtlci5sYXN0Q2hpbGROb3RPd25lZEJ5U2xvdCh0aGlzLm5vZGUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYXRSb290KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHRoaXMubm9kZSBhcyBhbnkpLnNsb3RPd25lcikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgc2xvdE93bmVyID0gKHRoaXMubm9kZSBhcyBhbnkpLnNsb3RPd25lcjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHByZXZTbG90SW5kZXggPSAodGhpcy5ub2RlIGFzIGFueSkuc2xvdEluZGV4IC0gMTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZTbG90SW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gc2xvdE93bmVyLmFzc2lnbmVkTm9kZXMoKVtwcmV2U2xvdEluZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBzbG90T3duZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoRE9NV2Fsa2VyLnByZXZpb3VzU2libGluZ05vdE93bmVkQnlTbG90KHRoaXMubm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gRE9NV2Fsa2VyLnByZXZpb3VzU2libGluZ05vdE93bmVkQnlTbG90KHRoaXMubm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgodGhpcy5ub2RlIGFzIGFueSkub3duZXJFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9ICh0aGlzLm5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5ub2RlLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gdGhpcy5ub2RlLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gd2hpbGUgKFxuICAgICAgICAgICAgKHRoaXMubm9kZS5ub2RlVHlwZSAhPT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLyAmJiB0aGlzLm5vZGUubm9kZVR5cGUgIT09IDExICYmIHRoaXMubm9kZS5ub2RlVHlwZSAhPT0gMyApXG4gICAgICAgICAgICB8fCAodGhpcy5ub2RlLm5vZGVUeXBlID09PSAxICYmICh0aGlzLm5vZGUgYXMgRWxlbWVudCkuZ2V0QXR0cmlidXRlKFwiYUNoZWNrZXJcIikgPT09IFwiQUNFXCIpXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgIENvcHlyaWdodDo6IDIwMjAtIElCTSwgSW5jXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IGVSdWxlUG9saWN5IH0gZnJvbSBcIi4vSVJ1bGVcIlxuXG5leHBvcnQgZW51bSBlVG9vbGtpdExldmVsIHtcbiAgICBMRVZFTF9PTkUgPSBcIjFcIixcbiAgICBMRVZFTF9UV08gPSBcIjJcIixcbiAgICBMRVZFTF9USFJFRSA9IFwiM1wiLFxuICAgIExFVkVMX0ZPVVIgPSBcIjRcIlxufVxuXG5leHBvcnQgZW51bSBlR3VpZGVsaW5lQ2F0ZWdvcnkge1xuICAgIEFDQ0VTU0lCSUxJVFkgPSBcIkFjY2Vzc2liaWxpdHlcIixcbiAgICBERVNJR04gPSBcIkRlc2lnblwiLFxuICAgIE9USEVSID0gXCJPdGhlclwiXG59XG5cbmV4cG9ydCBlbnVtIGVHdWlkZWxpbmVUeXBlIHtcbiAgICBERUZBVUxUID0gXCJkZWZhdWx0XCIsXG4gICAgRVhURU5TSU9OID0gXCJleHRlbnNpb25cIlxufVxuXG5leHBvcnQgdHlwZSBDaGVja3BvaW50ID0ge1xuICAgIG51bTogc3RyaW5nLFxuICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vYWN0LXJ1bGVzL2FjdC10b29scy9ibG9iL21haW4vc3JjL2RhdGEvc2MtdXJscy5qc29uXG4gICAgc2NJZD86IHN0cmluZyxcbiAgICAvLyBKQ0g6IGFkZCBuYW1lIG9mIGNoZWNrcG9pbnQgYW5kIHN1bW1hcnkgZGVzY3JpcHRpb25cbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgd2NhZ0xldmVsOiBzdHJpbmcsXG4gICAgc3VtbWFyeTogc3RyaW5nLFxuICAgIHJ1bGVzPzogQXJyYXk8eyBcbiAgICAgICAgaWQ6IHN0cmluZywgXG4gICAgICAgIC8vIChvcHRpb25hbCkgUmVhc29uIGNvZGVzIHRoYXQgdGhpcyBydWxlc2V0IG1hcHBpbmcgYXBwbGllcyB0bywgXG4gICAgICAgIC8vIG9yIGFsbCBpZiBub3Qgc3BlY2lmaWVkXG4gICAgICAgIHJlYXNvbkNvZGVzPzogc3RyaW5nW10sXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeSwgXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbCxcbiAgICAgICAgZW5hYmxlZD86IGJvb2xlYW5cbiAgICB9PlxufVxuXG5leHBvcnQgdHlwZSBHdWlkZWxpbmUgPSB7XG4gICAgaWQ6IHN0cmluZyxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgY2F0ZWdvcnk6IGVHdWlkZWxpbmVDYXRlZ29yeSxcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nLFxuICAgIHR5cGU/OiBlR3VpZGVsaW5lVHlwZSxcbiAgICBjaGVja3BvaW50czogQXJyYXk8Q2hlY2twb2ludD5cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMC0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgZUd1aWRlbGluZUNhdGVnb3J5LCBlR3VpZGVsaW5lVHlwZSB9IGZyb20gXCIuL0lHdWlkZWxpbmVcIjtcbmltcG9ydCB7IElNYXBSZXN1bHQgfSBmcm9tIFwiLi9JTWFwcGVyXCI7XG5pbXBvcnQgeyBObHNNYXAgYXMgTmxzTWFwTmV3LCBIZWxwTWFwIGFzIEhlbHBNYXBOZXcsIElFbmdpbmUgYXMgSUVuZ2luZU5ldyB9IGZyb20gXCIuL0lFbmdpbmVcIjtcbmltcG9ydCB7IFJlcG9ydCBhcyBSZXBvcnROZXcgfSBmcm9tIFwiLi9JUmVwb3J0XCI7XG5pbXBvcnQgeyBlVG9vbGtpdExldmVsIGFzIGVUb29sa2l0TGV2ZWxOZXcgfSBmcm9tIFwiLi9JR3VpZGVsaW5lXCJcbmltcG9ydCB7IEJvdW5kcyB9IGZyb20gXCIuL0lCb3VuZHNcIjtcblxuZXhwb3J0IGVudW0gZVJ1bGVDb25maWRlbmNlIHtcbiAgICBQQVNTID0gXCJQQVNTXCIsXG4gICAgRkFJTCA9IFwiRkFJTFwiLFxuICAgIFBPVEVOVElBTCA9IFwiUE9URU5USUFMXCIsXG4gICAgTUFOVUFMID0gXCJNQU5VQUxcIlxufVxuXG5leHBvcnQgZW51bSBlUnVsZVBvbGljeSB7XG4gICAgVklPTEFUSU9OID0gXCJWSU9MQVRJT05cIixcbiAgICBSRUNPTU1FTkRBVElPTiA9IFwiUkVDT01NRU5EQVRJT05cIixcbiAgICBJTkZPUk1BVElPTiA9IFwiSU5GT1JNQVRJT05cIlxufVxuXG5leHBvcnQgZnVuY3Rpb24gUnVsZVBhc3MocmVhc29uSWQ6IG51bWJlciB8IHN0cmluZywgbWVzc2FnZUFyZ3M/IDogc3RyaW5nW10sIGFwaUFyZ3M/IDogYW55W10pIDogUnVsZVJlc3VsdCB7XG4gICAgaWYgKHR5cGVvZiByZWFzb25JZCA9PT0gXCJ1bmRlZmluZWRcIiB8fCByZWFzb25JZCA9PT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKFwiUmVhc29uIElEIG11c3QgYmUgZGVmaW5lZFwiKTtcbiAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogW2VSdWxlUG9saWN5LklORk9STUFUSU9OLCBlUnVsZUNvbmZpZGVuY2UuUEFTU10sXG4gICAgICAgIHJlYXNvbklkOiByZWFzb25JZCxcbiAgICAgICAgbWVzc2FnZUFyZ3M6IG1lc3NhZ2VBcmdzIHx8IFtdLFxuICAgICAgICBhcGlBcmdzOiBhcGlBcmdzIHx8IFtdXG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gUnVsZVJlbmRlcihyZWFzb25JZDogbnVtYmVyIHwgc3RyaW5nLCBtZXNzYWdlQXJncz8gOiBzdHJpbmdbXSwgYXBpQXJncz8gOiBhbnlbXSkgOiBSdWxlUmVzdWx0IHtcbiAgICBpZiAodHlwZW9mIHJlYXNvbklkID09PSBcInVuZGVmaW5lZFwiIHx8IHJlYXNvbklkID09PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoXCJSZWFzb24gSUQgbXVzdCBiZSBkZWZpbmVkXCIpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiBbZVJ1bGVQb2xpY3kuSU5GT1JNQVRJT04sIGVSdWxlQ29uZmlkZW5jZS5QQVNTXSxcbiAgICAgICAgcmVhc29uSWQ6IDAsXG4gICAgICAgIG1lc3NhZ2VBcmdzOiBtZXNzYWdlQXJncyB8fCBbXSxcbiAgICAgICAgYXBpQXJnczogYXBpQXJncyB8fCBbXVxuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBSdWxlRmFpbChyZWFzb25JZDogbnVtYmVyIHwgc3RyaW5nLCBtZXNzYWdlQXJncz8gOiBzdHJpbmdbXSwgYXBpQXJncz8gOiBhbnlbXSkgOiBSdWxlUmVzdWx0IHtcbiAgICBpZiAodHlwZW9mIHJlYXNvbklkID09PSBcInVuZGVmaW5lZFwiIHx8IHJlYXNvbklkID09PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoXCJSZWFzb24gSUQgbXVzdCBiZSBkZWZpbmVkXCIpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiBbZVJ1bGVQb2xpY3kuSU5GT1JNQVRJT04sIGVSdWxlQ29uZmlkZW5jZS5GQUlMXSxcbiAgICAgICAgcmVhc29uSWQ6IHJlYXNvbklkLFxuICAgICAgICBtZXNzYWdlQXJnczogbWVzc2FnZUFyZ3MgfHwgW10sXG4gICAgICAgIGFwaUFyZ3M6IGFwaUFyZ3MgfHwgW11cbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBSdWxlUG90ZW50aWFsKHJlYXNvbklkOiBudW1iZXIgfCBzdHJpbmcsIG1lc3NhZ2VBcmdzPyA6IHN0cmluZ1tdLCBhcGlBcmdzPyA6IGFueVtdKSA6IFJ1bGVSZXN1bHQge1xuICAgIGlmICh0eXBlb2YgcmVhc29uSWQgPT09IFwidW5kZWZpbmVkXCIgfHwgcmVhc29uSWQgPT09IG51bGwpIHRocm93IG5ldyBFcnJvcihcIlJlYXNvbiBJRCBtdXN0IGJlIGRlZmluZWRcIik7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IFtlUnVsZVBvbGljeS5JTkZPUk1BVElPTiwgZVJ1bGVDb25maWRlbmNlLlBPVEVOVElBTF0sXG4gICAgICAgIHJlYXNvbklkOiByZWFzb25JZCxcbiAgICAgICAgbWVzc2FnZUFyZ3M6IG1lc3NhZ2VBcmdzIHx8IFtdLFxuICAgICAgICBhcGlBcmdzOiBhcGlBcmdzIHx8IFtdXG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gUnVsZU1hbnVhbChyZWFzb25JZDogbnVtYmVyIHwgc3RyaW5nLCBtZXNzYWdlQXJncz8gOiBzdHJpbmdbXSwgYXBpQXJncz8gOiBhbnlbXSkgOiBSdWxlUmVzdWx0IHtcbiAgICBpZiAodHlwZW9mIHJlYXNvbklkID09PSBcInVuZGVmaW5lZFwiIHx8IHJlYXNvbklkID09PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoXCJSZWFzb24gSUQgbXVzdCBiZSBkZWZpbmVkXCIpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiBbZVJ1bGVQb2xpY3kuSU5GT1JNQVRJT04sIGVSdWxlQ29uZmlkZW5jZS5NQU5VQUxdLFxuICAgICAgICByZWFzb25JZDogcmVhc29uSWQsXG4gICAgICAgIG1lc3NhZ2VBcmdzOiBtZXNzYWdlQXJncyB8fCBbXSxcbiAgICAgICAgYXBpQXJnczogYXBpQXJncyB8fCBbXVxuICAgIH1cbn1cblxuZXhwb3J0IHR5cGUgUnVsZVJlc3VsdCA9IHtcbiAgICB2YWx1ZTogW2VSdWxlUG9saWN5LCBlUnVsZUNvbmZpZGVuY2VdLFxuICAgIHJlYXNvbklkPzogbnVtYmVyIHwgc3RyaW5nLFxuICAgIG1lc3NhZ2VBcmdzPzogc3RyaW5nW10sXG4gICAgYXBpQXJncz86IGFueVtdXG59XG5cbmV4cG9ydCB0eXBlIElzc3VlID0gUnVsZVJlc3VsdCAmIHtcbiAgICBydWxlSWQ6IHN0cmluZyxcblxuICAgIG5vZGU6IE5vZGUsXG4gICAgLy8gbmFtZXNwYWNlOiBzdHJpbmcsXG4gICAgY2F0ZWdvcnk/OiBlR3VpZGVsaW5lQ2F0ZWdvcnksXG4gICAgcGF0aDogeyBbbnM6IHN0cmluZ10gOiBzdHJpbmcgfSxcblxuICAgIHJ1bGVUaW1lOiBudW1iZXIsXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIGJvdW5kcz86IEJvdW5kcyxcbiAgICBzbmlwcGV0OiBzdHJpbmcsXG4gICAgc291cmNlPzogc3RyaW5nLFxuICAgIGxldmVsPzogc3RyaW5nXG59XG5cbmV4cG9ydCB0eXBlIFJ1bGVDb250ZXh0SGllcmFyY2h5ID0geyBbbmFtZXNwYWNlOiBzdHJpbmddIDogSU1hcFJlc3VsdFtdIH07XG5cbmV4cG9ydCB0eXBlIFJ1bGVDb250ZXh0ID0ge1xuICAgIFtuYW1lc3BhY2U6IHN0cmluZ10gOiBJTWFwUmVzdWx0XG59XG5cbmV4cG9ydCB0eXBlIFJ1bGUgPSB7XG4gICAgLy8gVW5pcXVlIHN0cmluZyBpZGVudGlmaWVyIGZvciB0aGlzIHJ1bGUgKHNob3VsZCBiZSBodW1hbiB1bmRlcnN0YW5kYWJsZSlcbiAgICAvLyBOTFMgY29kZXMgYW5kIGhlbHAgc291cmNlcyB3aWxsIGJlIGJhc2VkIG9mZiBvZiB0aGlzIGlkXG4gICAgaWQ6IHN0cmluZztcblxuICAgIHJ1bGVzZXRzOiBBcnJheTx7XG4gICAgICAgIGlkOiBzdHJpbmcgfCBzdHJpbmdbXVxuICAgICAgICBudW06IHN0cmluZyB8IHN0cmluZ1tdXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeSxcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsTmV3LFxuICAgICAgICAvLyAob3B0aW9uYWwpIFJlYXNvbiBjb2RlcyB0aGF0IHRoaXMgcnVsZXNldCBtYXBwaW5nIGFwcGxpZXMgdG8sIFxuICAgICAgICAvLyBvciBhbGwgaWYgbm90IHNwZWNpZmllZFxuICAgICAgICByZWFzb25Db2Rlcz86IHN0cmluZ1tdXG4gICAgfT5cblxuICAgIHJlZmFjdG9yPzoge1xuICAgICAgICBbb2xkUnVsZUlkOiBzdHJpbmddOiB7XG4gICAgICAgICAgICBbb2xkUmVhc29uQ29kZTogc3RyaW5nXTogc3RyaW5nXG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgW2xvY2FsZTogc3RyaW5nXToge1xuICAgICAgICAgICAgW3JlYXNvbklkOiBzdHJpbmddOiBzdHJpbmdcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBoZWxwOiB7XG4gICAgICAgIFtsb2NhbGU6IHN0cmluZ106IHtcbiAgICAgICAgICAgIFtyZWFzb25JZDogc3RyaW5nXTogc3RyaW5nXG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqIFxuICAgICAqIEhvdyB0aGlzIHJ1bGUgbWFwcyB0byBBQ1QgcnVsZXMsIGlmIGFueSAoaHR0cHM6Ly9hY3QtcnVsZXMuZ2l0aHViLmlvL3J1bGVzLylcbiAgICAgKiBcbiAgICAgKiBzdHJpbmc6IEZvciBhIHNpbmdsZSBydWxlIG1hcHBpbmcgdGhhdCBtYXRjaGVzIGV4YWN0bHkgdG8gdGhlIHJ1bGUgKFBhc3MgLT4gcGFzcywgUG90ZW50aWFsIC0+IGNhbnRUZWxsLCBGYWlsIC0+IGZhaWwsIHVubGlzdGVkID0+IGluYXBwbGljYWJsZSlcbiAgICAgKiBBcnJheTw+OiBDdXN0b20gbWFwcGluZyBvZiBydWxlIHRvIEFDVCByZXN1bHRzXG4gICAgICovXG4gICAgYWN0Pzogc3RyaW5nIHwgc3RyaW5nW10gfCBBcnJheTxzdHJpbmcgfCB7XG4gICAgICAgIFthY3RSdWxlSWQ6IHN0cmluZ106IHtcbiAgICAgICAgICAgIFtyZWFzb25JZDogc3RyaW5nXTogXCJwYXNzXCIgfCBcImZhaWxcIiB8IFwiY2FudFRlbGxcIiB8IFwiaW5hcHBsaWNhYmxlXCJcbiAgICAgICAgfVxuICAgIH0+XG5cbiAgICAvLyBTZWUgc3JjL3YyL2NvbW1vbi9Db250ZXh0LnRzIGZvciB2YWxpZCBjb250ZXh0c1xuICAgIGNvbnRleHQ6IHN0cmluZztcblxuICAgIC8vIEFycmF5IG9mIHJ1bGVzIHRoYXQgbXVzdCBwYXNzIHRvIGFsbG93IHRoaXMgdmFsaWRhdGUgdG8gcnVuIC0gdGhleSBtdXN0IGhhdmUgdGhlIHNhbWUgY29udGV4dCBwcm9wZXJ0eVxuICAgIGRlcGVuZGVuY2llcz86IHN0cmluZ1tdXG5cbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSkgPT4gUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSB8IG51bGxcblxuICAgIGVuYWJsZWQ/OiBib29sZWFuXG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWRcbiAqL1xuZXhwb3J0IHR5cGUgUnVsZURldGFpbHMgPSBJc3N1ZTtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBTZWUgSUVuZ2luZVxuICovXG5leHBvcnQgdHlwZSBSZXBvcnQgPSBSZXBvcnROZXc7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgU2VlIElFbmdpbmVcbiAqL1xuZXhwb3J0IHR5cGUgTmxzTWFwID0gTmxzTWFwTmV3O1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIFNlZSBJRW5naW5lXG4gKi9cbmV4cG9ydCB0eXBlIEhlbHBNYXAgPSBIZWxwTWFwTmV3O1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIFNlZSAuL0lFbmdpbmVcbiAqL1xuZXhwb3J0IHR5cGUgSUVuZ2luZSA9IElFbmdpbmVOZXc7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgU2VlIC4vSUd1aWRlbGluZVxuICovXG5leHBvcnQgeyBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4vSUd1aWRlbGluZVwiO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIFNlZSAuL0lHdWlkZWxpbmU6ZUd1aWRlbGluZUNhdGVnb3J5XG4gKi9cbmV4cG9ydCB7IGVHdWlkZWxpbmVDYXRlZ29yeSBhcyBlUnVsZUNhdGVnb3J5IH0gZnJvbSBcIi4vSUd1aWRlbGluZVwiO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIFNlZSAuL0lHdWlkZWxpbmU6ZUd1aWRlbGluZVR5cGVcbiAqL1xuZXhwb3J0IHsgZUd1aWRlbGluZVR5cGUgYXMgZVJ1bGVzZXRUeXBlIH0gZnJvbSBcIi4vSUd1aWRlbGluZVwiO1xuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlIGFzIFJ1bGVWNCwgZVJ1bGVQb2xpY3kgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBFbmdpbmUgfSBmcm9tIFwiLi4vLi4vdjIvY29tbW9uL0VuZ2luZVwiO1xuaW1wb3J0IHsgQVJJQU1hcHBlciB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFNYXBwZXJcIjtcbmltcG9ydCB7IGExMXlSdWxlc2V0cyB9IGZyb20gXCIuLi9ydWxlc2V0c1wiO1xuaW1wb3J0ICogYXMgY2hlY2tSdWxlc1Y0IGZyb20gXCIuLi9ydWxlc1wiO1xuaW1wb3J0IHsgR3VpZGVsaW5lLCBlR3VpZGVsaW5lQ2F0ZWdvcnkgfSBmcm9tIFwiLi4vYXBpL0lHdWlkZWxpbmVcIjtcbmltcG9ydCB7IElFbmdpbmUgfSBmcm9tIFwiLi4vYXBpL0lFbmdpbmVcIjtcbmltcG9ydCB7IFJlcG9ydCB9IGZyb20gXCIuLi9hcGkvSVJlcG9ydFwiO1xuaW1wb3J0IHsgSUNoZWNrZXIgfSBmcm9tIFwiLi4vYXBpL0lDaGVja2VyXCI7XG5cbmxldCBjaGVja1J1bGVzID0gW107XG5sZXQgY2hlY2tObHMgPSB7fTtcbmxldCBjaGVja0hlbHAgPSB7fTtcblxuZnVuY3Rpb24gX2luaXRpYWxpemUoKSB7XG4gICAgY29uc3QgbGFuZ3MgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KEVuZ2luZS5nZXRMYW5ndWFnZXMoKSkpO1xuICAgIC8vIERlZmF1bHQgbGFuZyB0byBlbi1VUyBpZiBub3RoaW5nIGVsc2Ugc3BlY2lmaWVkIGlzIGZvdW5kXG4gICAgbGFuZ3MucHVzaChcImVuLVVTXCIpO1xuICAgIC8vIFByb2Nlc3MgVjQgcnVsZXMgaW50byB0aGUgVjIgZm9ybWF0XG4gICAgZm9yIChsZXQgcnVsZW5hbWUgaW4gY2hlY2tSdWxlc1Y0KSB7XG4gICAgICAgIC8vIENvbnZlcnQgcnVsZVxuICAgICAgICBsZXQgdjRSdWxlOiBSdWxlVjQgPSBjaGVja1J1bGVzVjRbcnVsZW5hbWVdO1xuICAgICAgICBjaGVja1J1bGVzLnB1c2godjRSdWxlKTtcbiAgICAgICAgLy8gR28gYmFja3dhcmRzIGJlY2F1c2UgdGhlIGZpcnN0IGxhbmcgaXMgdGhlIHByZWZlcnJlZCwgc29cbiAgICAgICAgLy8gZWFybGllciBsYW5ndWFnZXMgd2lsbCBvdmVycmlkZSBsYXRlciBsYW5ndWFnZXNcbiAgICAgICAgZm9yIChsZXQgaWR4PWxhbmdzLmxlbmd0aC0xOyBpZHggPj0wOyAtLWlkeCkge1xuICAgICAgICAgICAgY29uc3QgbGFuZ0lkID0gbGFuZ3NbaWR4XTtcbiAgICAgICAgICAgIGlmIChsYW5nSWQgaW4gdjRSdWxlLm1lc3NhZ2VzKSB7XG4gICAgICAgICAgICAgICAgY2hlY2tObHNbdjRSdWxlLmlkXSA9IHY0UnVsZS5tZXNzYWdlc1tsYW5nSWRdO1xuICAgICAgICAgICAgICAgIGNoZWNrTmxzW3Y0UnVsZS5pZF1bMF0gPSBjaGVja05sc1t2NFJ1bGUuaWRdLmdyb3VwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGxhbmdJZCBpbiB2NFJ1bGUuaGVscCkge1xuICAgICAgICAgICAgICAgIGNoZWNrSGVscFt2NFJ1bGUuaWRdID0ge307XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCByZWFzb25JZCBpbiB2NFJ1bGUuaGVscFtsYW5nSWRdKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoZWNrSGVscFt2NFJ1bGUuaWRdW3JlYXNvbklkXSA9IGAvJHtsYW5nSWR9LyR7djRSdWxlLmhlbHBbbGFuZ0lkXVtyZWFzb25JZF19YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2hlY2tObHNbdjRSdWxlLmlkXVswXSA9IGNoZWNrTmxzW3Y0UnVsZS5pZF0uZ3JvdXA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ29udmVydCBSU1xuICAgICAgICBmb3IgKGNvbnN0IHJzU2VjdGlvbiBvZiB2NFJ1bGUucnVsZXNldHMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcnMgb2YgYTExeVJ1bGVzZXRzIGFzIEd1aWRlbGluZVtdKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNoZWNrUnNJZHMgOiBzdHJpbmdbXSA9IHR5cGVvZiByc1NlY3Rpb24uaWQgPT09IFwic3RyaW5nXCIgPyBbcnNTZWN0aW9uLmlkXSA6IHJzU2VjdGlvbi5pZDtcbiAgICAgICAgICAgICAgICBpZiAoY2hlY2tSc0lkcy5pbmNsdWRlcyhycy5pZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBjcCBvZiBycy5jaGVja3BvaW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNoZWNrQ1BJZHMgOiBzdHJpbmdbXSA9IHR5cGVvZiByc1NlY3Rpb24ubnVtID09PSBcInN0cmluZ1wiID8gW3JzU2VjdGlvbi5udW1dIDogcnNTZWN0aW9uLm51bTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGVja0NQSWRzLmluY2x1ZGVzKGNwLm51bSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcC5ydWxlcyA9IGNwLnJ1bGVzIHx8IFtdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3AucnVsZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiB2NFJ1bGUuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbkNvZGVzOiByc1NlY3Rpb24ucmVhc29uQ29kZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiByc1NlY3Rpb24ubGV2ZWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2xraXRMZXZlbDogcnNTZWN0aW9uLnRvb2xraXRMZXZlbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5faW5pdGlhbGl6ZSgpO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIFNlZSAuLi9hcGkvSUd1aWRlbGluZVxuICovXG5leHBvcnQgdHlwZSBSdWxlc2V0ID0gR3VpZGVsaW5lO1xuXG5leHBvcnQgY2xhc3MgQ2hlY2tlciBpbXBsZW1lbnRzIElDaGVja2VyIHtcbiAgICBwcml2YXRlIGd1aWRlbGluZXM6IEd1aWRlbGluZVtdID0gW107XG5cbiAgICBlbmdpbmU6IElFbmdpbmU7XG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIGdldEd1aWRlbGluZXMoKS5cbiAgICAgKi9cbiAgICBydWxlc2V0czogR3VpZGVsaW5lW10gPSB0aGlzLmd1aWRlbGluZXM7XG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIGdldEd1aWRlbGluZUlkcygpLlxuICAgICAqL1xuICAgIHJ1bGVzZXRJZHM6IHN0cmluZ1tdID0gW107XG4gICAgcnVsZXNldFJ1bGVzOiB7IFtyc0lkOiBzdHJpbmddOiBzdHJpbmdbXSB9ID0ge307XG4gICAgcnVsZUxldmVscyA6IHsgW3J1bGVJZDogc3RyaW5nXTogeyBbcnNJZDogc3RyaW5nXSA6IGVSdWxlUG9saWN5IH19ID0ge307XG4gICAgcnVsZVJlYXNvbkxldmVscyA6IHsgW3J1bGVJZDogc3RyaW5nXTogeyBbcnNJZDogc3RyaW5nXSA6IHtbcmVhc29uQ29kZXM6IHN0cmluZ10gOiBlUnVsZVBvbGljeSB9fX0gPSB7fTtcbiAgICBydWxlQ2F0ZWdvcnkgOiB7IFtydWxlSWQ6IHN0cmluZ106IHsgW3JzSWQ6IHN0cmluZ10gOiBlR3VpZGVsaW5lQ2F0ZWdvcnkgfX0gPSB7fTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgbGV0IGVuZ2luZSA9IHRoaXMuZW5naW5lID0gbmV3IEVuZ2luZSgpO1xuXG4gICAgICAgIGVuZ2luZS5hZGRNYXBwZXIobmV3IEFSSUFNYXBwZXIoKSk7XG5cbiAgICAgICAgZW5naW5lLmFkZFJ1bGVzKGNoZWNrUnVsZXMpO1xuICAgICAgICBlbmdpbmUuYWRkTmxzTWFwKGNoZWNrTmxzKTtcbiAgICAgICAgZW5naW5lLmFkZEhlbHBNYXAoY2hlY2tIZWxwKTtcblxuICAgICAgICBmb3IgKGNvbnN0IHJzIG9mIGExMXlSdWxlc2V0cykge1xuICAgICAgICAgICAgdGhpcy5hZGRSdWxlc2V0KHJzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBndWlkZWxpbmUgdG8gdGhlIGVuZ2luZS4gSWYgdGhlIGlkIGFscmVhZHkgZXhpc3RzLCB0aGUgcHJldmlvdXMgZ3VpZGVsaW5lIHdpbGwgYmUgcmVwbGFjZWQuXG4gICAgICogQHBhcmFtIGd1aWRlbGluZSBcbiAgICAgKi9cbiAgICBhZGRHdWlkZWxpbmUoZ3VpZGVsaW5lOiBHdWlkZWxpbmUpIHtcbiAgICAgICAgaWYgKGd1aWRlbGluZS5pZCBpbiB0aGlzLnJ1bGVzZXRSdWxlcykge1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVHdWlkZWxpbmUoZ3VpZGVsaW5lLmlkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmd1aWRlbGluZXMucHVzaChndWlkZWxpbmUpO1xuICAgICAgICB0aGlzLnJ1bGVzZXRJZHMucHVzaChndWlkZWxpbmUuaWQpO1xuICAgICAgICBjb25zdCBydWxlSWRzID0gW107XG4gICAgICAgIGZvciAoY29uc3QgY3Agb2YgZ3VpZGVsaW5lLmNoZWNrcG9pbnRzKSB7XG4gICAgICAgICAgICBjcC5ydWxlcyA9IGNwLnJ1bGVzIHx8IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBydWxlIG9mIGNwLnJ1bGVzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJ1bGUuZW5hYmxlZCAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgcnVsZUlkcy5wdXNoKHJ1bGUuaWQpO1xuICAgICAgICAgICAgICAgICAgICAvL3RoaXMucnVsZUxldmVsc1tydWxlLmlkXSA9IHRoaXMucnVsZUxldmVsc1tydWxlLmlkXSB8fCB7fTtcbiAgICAgICAgICAgICAgICAgICAgLy90aGlzLnJ1bGVMZXZlbHNbcnVsZS5pZF1bZ3VpZGVsaW5lLmlkXSA9IHJ1bGUubGV2ZWw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucnVsZVJlYXNvbkxldmVsc1tydWxlLmlkXSA9IHRoaXMucnVsZVJlYXNvbkxldmVsc1tydWxlLmlkXSB8fCB7fTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ydWxlUmVhc29uTGV2ZWxzW3J1bGUuaWRdW2d1aWRlbGluZS5pZF0gPSB0aGlzLnJ1bGVSZWFzb25MZXZlbHNbcnVsZS5pZF1bZ3VpZGVsaW5lLmlkXSB8fCB7fTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29kZSA9IHJ1bGUucmVhc29uQ29kZXMgPyBydWxlLnJlYXNvbkNvZGVzLmpvaW4oJy0tJykgOiBcIk5vbmVcIjtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ydWxlUmVhc29uTGV2ZWxzW3J1bGUuaWRdW2d1aWRlbGluZS5pZF1bY29kZV0gPSBydWxlLmxldmVsO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJ1bGVDYXRlZ29yeVtydWxlLmlkXSA9IHRoaXMucnVsZUNhdGVnb3J5W3J1bGUuaWRdIHx8IHt9O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJ1bGVDYXRlZ29yeVtydWxlLmlkXVtndWlkZWxpbmUuaWRdID0gZ3VpZGVsaW5lLmNhdGVnb3J5O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJ1bGVzZXRSdWxlc1tndWlkZWxpbmUuaWRdID0gcnVsZUlkcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGUgYSBydWxlIGZvciBhbGwgZ3VpZGVsaW5lc1xuICAgICAqIEBwYXJhbSBydWxlSWQgXG4gICAgICovXG4gICAgZW5hYmxlUnVsZShydWxlSWQ6IHN0cmluZykge1xuICAgICAgICBmb3IgKGNvbnN0IGd1aWRlbGluZSBvZiB0aGlzLmdldEd1aWRlbGluZXMoKSkge1xuICAgICAgICAgICAgbGV0IHVwZGF0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY3Agb2YgZ3VpZGVsaW5lLmNoZWNrcG9pbnRzKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBydWxlIG9mIGNwLnJ1bGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChydWxlLmVuYWJsZWQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBydWxlLmVuYWJsZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodXBkYXRlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkR3VpZGVsaW5lKGd1aWRlbGluZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNhYmxlIGEgcnVsZSBmb3IgYWxsIGd1aWRlbGluZXNcbiAgICAgKiBAcGFyYW0gcnVsZUlkIFxuICAgICAqL1xuICAgIGRpc2FibGVSdWxlKHJ1bGVJZDogc3RyaW5nKSB7XG4gICAgICAgIGZvciAoY29uc3QgZ3VpZGVsaW5lIG9mIHRoaXMuZ2V0R3VpZGVsaW5lcygpKSB7XG4gICAgICAgICAgICBsZXQgdXBkYXRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yIChjb25zdCBjcCBvZiBndWlkZWxpbmUuY2hlY2twb2ludHMpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHJ1bGUgb2YgY3AucnVsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGUuZW5hYmxlZCAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcnVsZS5lbmFibGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodXBkYXRlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkR3VpZGVsaW5lKGd1aWRlbGluZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgYSBndWlkZWxpbmUgZnJvbSB0aGUgZW5naW5lXG4gICAgICogXG4gICAgICogR2VuZXJhbGx5LCB0aGVyZSBpc24ndCBhIGdvb2QgcmVhc29uIHRvIGRvIHRoaXMuIFVzZXJzIHNob3VsZCBqdXN0IG5vdCBzZWxlY3QgdGhlIGd1aWRlbGluZSBhcyBhbiBvcHRpb24gaW4gY2hlY2tcbiAgICAgKiBAcGFyYW0gZ3VpZGVsaW5lSWRcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlbW92ZUd1aWRlbGluZShndWlkZWxpbmVJZDogc3RyaW5nKSB7XG4gICAgICAgIGlmIChndWlkZWxpbmVJZCBpbiB0aGlzLnJ1bGVzZXRSdWxlcykge1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMucnVsZXNldFJ1bGVzW2d1aWRlbGluZUlkXTtcbiAgICAgICAgICAgIHRoaXMucnVsZXNldHMgPSB0aGlzLmd1aWRlbGluZXMgPSB0aGlzLmd1aWRlbGluZXMuZmlsdGVyKGd1aWRlbGluZSA9PiBndWlkZWxpbmUuaWQgIT09IGd1aWRlbGluZUlkKTtcbiAgICAgICAgICAgIHRoaXMucnVsZXNldElkcyA9IHRoaXMuZ2V0R3VpZGVsaW5lSWRzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGd1aWRlbGluZXMgYXZhaWxhYmxlIGluIHRoZSBlbmdpbmVcbiAgICAgKiBAcmV0dXJucyBcbiAgICAgKi9cbiAgICBnZXRHdWlkZWxpbmVzKCkgOiBHdWlkZWxpbmVbXSB7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuZ3VpZGVsaW5lcykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgaWRzIG9mIHRoZSBndWlkZWxpbmVzIGF2YWlsYWJsZSBpbiB0aGUgZW5naW5lXG4gICAgICogQHJldHVybnMgXG4gICAgICovXG4gICAgZ2V0R3VpZGVsaW5lSWRzKCkgOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmd1aWRlbGluZXMubWFwKGd1aWRlbGluZSA9PiBndWlkZWxpbmUuaWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEBkZXByZWNhdGVkIFNlZSBhZGRHdWlkZWxpbmVcbiAgICAgKi9cbiAgICBhZGRSdWxlc2V0KHJzOiBSdWxlc2V0KSB7XG4gICAgICAgIHRoaXMuYWRkR3VpZGVsaW5lKHJzKTtcbiAgICB9XG5cbiAgICBlbmFibGVTb3VyY2VNYXAoZW5hYmxlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuZW5naW5lLmVuYWJsZVNvdXJjZU1hcChlbmFibGUpO1xuICAgIH1cblxuICAgIGlzU291cmNlTWFwRW5hYmxlZCgpIDogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVuZ2luZS5pc1NvdXJjZU1hcEVuYWJsZWQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQZXJmb3JtIGEgY2hlY2sgb2YgdGhlIHNwZWNpZmllZCBub2RlL2RvY3VtZW50XG4gICAgICogQHBhcmFtIG5vZGUgRE9NTm9kZSBvciBEb2N1bWVudCBvbiB3aGljaCB0byBydW4gdGhlIGNoZWNrXG4gICAgICogQHBhcmFtIGd1aWRlbGluZUlkcyBHdWlkZWxpbmUgaWRzIHRvIGNoZWNrIHdpdGggdG8gc3BlY2lmeSB3aGljaCBydWxlcyB0byBydW5cbiAgICAgKiBAcmV0dXJucyBcbiAgICAgKi9cbiAgICBjaGVjayhub2RlOiBOb2RlIHwgRG9jdW1lbnQsIGd1aWRlbGluZUlkcz86IHN0cmluZyB8IHN0cmluZ1tdKSA6IFByb21pc2U8UmVwb3J0PiB7XG4gICAgICAgIC8vIERldGVybWluZSB3aGljaCBydWxlcyB0byBydW5cbiAgICAgICAgbGV0IHJ1bGVJZHMgOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICAgIC8vIEZpeCB0aGUgaW5wdXRcbiAgICAgICAgaWYgKCFndWlkZWxpbmVJZHMpIHtcbiAgICAgICAgICAgIHJ1bGVJZHMgPSB0aGlzLmVuZ2luZS5nZXRSdWxlc0lkcygpO1xuICAgICAgICB9IGVsc2V7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGd1aWRlbGluZUlkcyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIGd1aWRlbGluZUlkcyA9IFtndWlkZWxpbmVJZHNdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJzSWQgb2YgZ3VpZGVsaW5lSWRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJzSWQgaW4gdGhpcy5ydWxlc2V0UnVsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgcnVsZUlkcyA9IHJ1bGVJZHMuY29uY2F0KHRoaXMucnVsZXNldFJ1bGVzW3JzSWRdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gICAgXG4gICAgICAgIHRoaXMuZW5naW5lLmVuYWJsZVJ1bGVzKHJ1bGVJZHMpO1xuICAgICAgICAvLyBBZGQgdGhlIHJlcG9ydCBsZXZlbHNcbiAgICAgICAgbGV0IG15VGhpcyA9IHRoaXM7XG4gICAgICAgIHJldHVybiB0aGlzLmVuZ2luZS5ydW4obm9kZSlcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXBvcnQpIHtcbiAgICAgICAgICAgICAgICByZXBvcnQubmxzID0ge31cblxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlcG9ydC5yZXN1bHRzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQucnVsZUlkIGluIGNoZWNrTmxzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXBvcnQubmxzW3Jlc3VsdC5ydWxlSWRdID0gcmVwb3J0Lm5sc1tyZXN1bHQucnVsZUlkXSB8fCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMDogY2hlY2tObHNbcmVzdWx0LnJ1bGVJZF1bMF1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQucmVhc29uSWQgaW4gY2hlY2tObHNbcmVzdWx0LnJ1bGVJZF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnQubmxzW3Jlc3VsdC5ydWxlSWRdW3Jlc3VsdC5yZWFzb25JZF0gPSBjaGVja05sc1tyZXN1bHQucnVsZUlkXVtyZXN1bHQucmVhc29uSWRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vcmVzdWx0LnZhbHVlWzBdID0gbXlUaGlzLmdldExldmVsKGd1aWRlbGluZUlkcyBhcyBzdHJpbmdbXSwgcmVzdWx0LnJ1bGVJZCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjb2RlID0gcmVzdWx0LnJlYXNvbklkPyByZXN1bHQucmVhc29uSWQgYXMgc3RyaW5nIDogXCJOb25lXCI7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC52YWx1ZVswXSA9IG15VGhpcy5nZXRSZWFzb25MZXZlbChndWlkZWxpbmVJZHMgYXMgc3RyaW5nW10sIHJlc3VsdC5ydWxlSWQsIGNvZGUpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQuY2F0ZWdvcnkgPSBteVRoaXMuZ2V0Q2F0ZWdvcnkoZ3VpZGVsaW5lSWRzIGFzIHN0cmluZ1tdLCByZXN1bHQucnVsZUlkKTtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHJlc3VsdC5wYXRoLmNzcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcG9ydDtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgcHJpdmF0ZSBnZXRMZXZlbChyc0lkczogc3RyaW5nW10sIHJ1bGVJZDogc3RyaW5nKSA6IGVSdWxlUG9saWN5IHtcbiAgICAgICAgaWYgKCFyc0lkcykgcmV0dXJuIGVSdWxlUG9saWN5LklORk9STUFUSU9OO1xuICAgICAgICBsZXQgcnNJbmZvID0gdGhpcy5ydWxlTGV2ZWxzW3J1bGVJZF07XG4gICAgICAgIGxldCByZXRWYWwgPSBudWxsO1xuICAgICAgICBpZiAocnNJZHMpIHtcbiAgICAgICAgICAgIGlmICghKHJ1bGVJZCBpbiB0aGlzLnJ1bGVMZXZlbHMpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUnVsZSB0cmlnZ2VyZWQgZm9yIHdoaWNoIHdlIGhhdmUgbm8gcnVsZSBsZXZlbCBpbmZvcm1hdGlvbjogXCIrcnVsZUlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoY29uc3QgcnNJZCBvZiByc0lkcykge1xuICAgICAgICAgICAgICAgIGlmIChyc0lkIGluIHJzSW5mbykge1xuICAgICAgICAgICAgICAgICAgICBpZiAocnNJbmZvW3JzSWRdID09PSBlUnVsZVBvbGljeS5WSU9MQVRJT04pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IGVSdWxlUG9saWN5LlZJT0xBVElPTjtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyc0luZm9bcnNJZF0gPT09IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OICYmIHJldFZhbCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT047XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmV0VmFsID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwgPSBlUnVsZVBvbGljeS5JTkZPUk1BVElPTjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocmV0VmFsID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSdWxlIHRyaWdnZXJlZCBmb3Igd2hpY2ggd2UgaGF2ZSBubyBydWxlIGxldmVsIGluZm9ybWF0aW9uOiBcIitydWxlSWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRSZWFzb25MZXZlbChyc0lkczogc3RyaW5nW10sIHJ1bGVJZDogc3RyaW5nLCByZWFzb25Db2RlPzogc3RyaW5nKSA6IGVSdWxlUG9saWN5IHtcbiAgICAgICAgaWYgKCFyc0lkcykgcmV0dXJuIGVSdWxlUG9saWN5LklORk9STUFUSU9OOyBcbiAgICAgICAgbGV0IHJzSW5mbyA9IHRoaXMucnVsZVJlYXNvbkxldmVsc1tydWxlSWRdO1xuICAgICAgICBsZXQgcmV0VmFsID0gbnVsbDtcbiAgICAgICAgaWYgKHJzSWRzKSB7XG4gICAgICAgICAgICBpZiAoIShydWxlSWQgaW4gdGhpcy5ydWxlUmVhc29uTGV2ZWxzKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlJ1bGUgdHJpZ2dlcmVkIGZvciB3aGljaCB3ZSBoYXZlIG5vIHJ1bGUgbGV2ZWwgaW5mb3JtYXRpb24gXCIrcnVsZUlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoY29uc3QgcnNJZCBvZiByc0lkcykge1xuICAgICAgICAgICAgICAgIGlmIChyc0lkIGluIHJzSW5mbykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZUNvZGUgPSBuZXcgUmVnRXhwKGAoXnwtLSkke3JlYXNvbkNvZGV9KCR8LS0pYCk7XG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHJzSW5mb1tyc0lkXSkuZm9yRWFjaChjb2RlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsZXZlbCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PT0gJ05vbmUnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsID0gcnNJbmZvW3JzSWRdW1wiTm9uZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlQ29kZS50ZXN0KGNvZGUpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsID0gcnNJbmZvW3JzSWRdW2NvZGVdOyBcbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxldmVsICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxldmVsID09PSBlUnVsZVBvbGljeS5WSU9MQVRJT04pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gZVJ1bGVQb2xpY3kuVklPTEFUSU9OO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGV2ZWwgPT09IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OICYmIHJldFZhbCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwgPSBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTjsgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXRWYWwgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gZVJ1bGVQb2xpY3kuSU5GT1JNQVRJT047XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJldFZhbCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gZVJ1bGVQb2xpY3kuSU5GT1JNQVRJT047XG4gICAgICAgICAgICAgICAgICAgIH0gICAgXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IFxuICAgICAgICBpZiAocmV0VmFsID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSdWxlIHRyaWdnZXJlZCBmb3Igd2hpY2ggd2UgaGF2ZSBubyBydWxlIGxldmVsIGluZm9ybWF0aW9uOiBcIitydWxlSWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRDYXRlZ29yeShyc0lkczogc3RyaW5nW10sIHJ1bGVJZD86IHN0cmluZykgOiBlR3VpZGVsaW5lQ2F0ZWdvcnkge1xuICAgICAgICBsZXQgcnNJbmZvID0gdGhpcy5ydWxlQ2F0ZWdvcnlbcnVsZUlkXTtcbiAgICAgICAgbGV0IHJldFZhbCA9IFwiXCI7XG5cbiAgICAgICAgaWYgKCEocnVsZUlkIGluIHRoaXMucnVsZUNhdGVnb3J5KSkge1xuICAgICAgICAgICAgcmV0dXJuIGVHdWlkZWxpbmVDYXRlZ29yeS5PVEhFUjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJzSWRzKSB7XG4gICAgICAgICAgICByc0lkcyA9IHRoaXMuZ2V0R3VpZGVsaW5lSWRzKCk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCByc0lkIG9mIHJzSWRzKSB7XG4gICAgICAgICAgICBpZiAocnNJZCBpbiByc0luZm8pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcnNJbmZvW3JzSWRdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlR3VpZGVsaW5lQ2F0ZWdvcnkuT1RIRVI7XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGNvbnN0IGFfdGFyZ2V0X3dhcm5pbmc6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYV90YXJnZXRfd2FybmluZ1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmFbdGFyZ2V0XSxkb206YXJlYVt0YXJnZXRdLGRvbTpiYXNlW3RhcmdldF1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9BX1RhcmdldEFuZFRleHRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwicG90ZW50aWFsX3dhcm5cIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBgYV90YXJnZXRfd2FybmluZy5odG1sYCxcbiAgICAgICAgICAgIFwicGFzc1wiOiBgYV90YXJnZXRfd2FybmluZy5odG1sYCxcbiAgICAgICAgICAgIFwicG90ZW50aWFsX3dhcm5cIjogYGFfdGFyZ2V0X3dhcm5pbmcuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVXNlcnMgc2hvdWxkIGJlIHdhcm5lZCBpbiBhZHZhbmNlIGlmIHRoZWlyIGlucHV0IGFjdGlvbiB3aWxsIG9wZW4gYSBuZXcgd2luZG93XCIsXG4gICAgICAgICAgICBcInBhc3NcIjogXCJUaGUgdXNlciBpcyB3YXJuZWQgaW4gYWR2YW5jZSB0aGF0IHRoZSBpbnB1dCBhY3Rpb24gb3BlbnMgYSBuZXcgd2luZG93XCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF93YXJuXCI6IFwiSW5mb3JtIHRoZSB1c2VyIHdoZW4gdGhlaXIgaW5wdXQgYWN0aW9uIHdpbGwgb3BlbiBhIG5ldyB3aW5kb3dcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFsgXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIG51bTogXCIzLjIuMlwiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vIHNraXAgdGhlIHJ1bGUgaWYgaXQncyBBVCBoaWRkZW4gYW5kIG5vdCB0YWJiYWJsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpICYmICFDb21tb25VdGlsLmlzVGFiYmFibGUocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgICAgICAgcGFyYW1XaW5UZXh0OiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IFtcIm5ldyB3aW5kb3dcIiwgXCJuZXcgdGFiXCJdLFxuICAgICAgICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIlxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHRTdHIgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0YXJnZXRcIik7XG4gICAgICAgIGxldCBwYXNzZWQgPSB0U3RyID09IFwiX3BhcmVudFwiIHx8IHRTdHIgPT0gXCJfc2VsZlwiIHx8IHRTdHIgPT0gXCJfdG9wXCIgfHwgQ29tbW9uVXRpbC5nZXRGcmFtZUJ5TmFtZShydWxlQ29udGV4dCx0U3RyKSAhPSBudWxsO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgLy8gTmFtZSBpcyBub3QgcGFydCBvZiB0aGlzIGZyYW1lc2V0IOKAkyBtdXN0IGhhdmUgcG90ZW50aWFsIHRvIGNyZWF0ZSBuZXcgd2luZG93P1xuICAgICAgICAgICAgLy8gU2VlIGlmIGEgbmV3IHdpbmRvdyBpcyBtZW50aW9uZWRcbiAgICAgICAgICAgIGxldCB0ZXh0U3RyID0gQ29tbW9uVXRpbC5nZXRJbm5lclRleHQocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInRpdGxlXCIpKVxuICAgICAgICAgICAgICAgIHRleHRTdHIgKz0gXCIgXCIgKyBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0aXRsZVwiKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gQ2hlY2sgYXJpYS1kZXNjcmliZWRieSBmb3Igd2FybmluZyB0ZXh0XG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiYXJpYS1kZXNjcmliZWRieVwiKSkge1xuICAgICAgICAgICAgICAgIGxldCBkZXNjcmliZWRieUlkcyA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtZGVzY3JpYmVkYnlcIikudHJpbSgpLnNwbGl0KC9cXHMrLyk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaWQgb2YgZGVzY3JpYmVkYnlJZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlZmVyZW5jZWRFbGVtID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQocnVsZUNvbnRleHQsIGlkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlZmVyZW5jZWRFbGVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGVzY3JpYmVkVGV4dCA9IENvbW1vblV0aWwuZ2V0SW5uZXJUZXh0KHJlZmVyZW5jZWRFbGVtKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjcmliZWRUZXh0ICYmIGRlc2NyaWJlZFRleHQudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0U3RyICs9IFwiIFwiICsgZGVzY3JpYmVkVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7ICFwYXNzZWQgJiYgaSA8IHBhcmFtcy5wYXJhbVdpblRleHQudmFsdWUubGVuZ3RoOyArK2kpXG4gICAgICAgICAgICAgICAgaWYgKHRleHRTdHIuaW5kZXhPZihwYXJhbXMucGFyYW1XaW5UZXh0LnZhbHVlW2ldKSAhPSAtMSkgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFzc2VkID8gUnVsZVBhc3MoXCJwYXNzXCIpIDogUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF93YXJuXCIpO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFjY05hbWVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQWNjTmFtZVV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFfdGV4dF9wdXJwb3NlOiBSdWxlID0ge1xuICAgIGlkOiBcImFfdGV4dF9wdXJwb3NlXCIsXG4gICAgLy8gZG9jLWJpYmxpb3JlZiBpcyBhIGxpbmtcbiAgICBjb250ZXh0OiBcImFyaWE6bGluayxhcmlhOmRvYy1iaWJsaW9yZWZcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9BX0hhc1RleHRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImZhaWxfYWNjX25hbWVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBgYV90ZXh0X3B1cnBvc2UuaHRtbGAsXG4gICAgICAgICAgICBcInBhc3NcIjogYGFfdGV4dF9wdXJwb3NlLmh0bWxgLFxuICAgICAgICAgICAgXCJmYWlsX2FjY19uYW1lXCI6IGBhX3RleHRfcHVycG9zZS5odG1sYFxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJIeXBlcmxpbmtzIG11c3QgaGF2ZSBhbiBhY2Nlc3NpYmxlIG5hbWUgZm9yIHRoZWlyIHB1cnBvc2VcIixcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIkh5cGVybGluayBoYXMgYSBkZXNjcmlwdGlvbiBvZiBpdHMgcHVycG9zZVwiLFxuICAgICAgICAgICAgXCJmYWlsX2FjY19uYW1lXCI6IFwiSHlwZXJsaW5rIGhhcyBubyBsaW5rIHRleHQsIGxhYmVsIG9yIGltYWdlIHdpdGggYSB0ZXh0IGFsdGVybmF0aXZlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbIFwiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBudW06IFtcIjIuNC40XCIsIFwiNC4xLjJcIl0sIC8vIG51bTogWyBcIjIuNC40XCIsIFwieC55LnpcIiBdIGFsc28gYWxsb3dlZFxuICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBcImM0ODdhZVwiLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30pOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcblxuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IGlzIGhpZGRlbiBvciBkaXNhYmxlZFxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpIHx8IENvbW1vblV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gUnVsZSBvbmx5IHBhc3NlcyBpZiBhbiBlbGVtZW50IGhhcyBpbm5lciBjb250ZW50LFxuICAgICAgICAvLyBpbiB0aGUgY2FzZSB0aGF0IHRoZXJlIGlzIG9ubHkgaGlkZGVuIGNvbnRlbnQgdW5kZXIgdGhlIHRoZSBlbGVtZW50IGl0IGlzIGEgdmlvbGF0aW9uXG4gICAgICAgIGNvbnN0IGFjY05hbWVfcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZShydWxlQ29udGV4dCk7XG4gICAgICAgIGxldCBwYXNzZWQgPVxuICAgICAgICAgICAgKGFjY05hbWVfcGFpciAmJiBhY2NOYW1lX3BhaXIubmFtZSAmJiBhY2NOYW1lX3BhaXIubmFtZS50cmltKCkubGVuZ3RoID4gMCkgXG4gICAgICAgICAgICAvKipBUklBTWFwcGVyLmNvbXB1dGVOYW1lKHJ1bGVDb250ZXh0KS50cmltKCkubGVuZ3RoID4gMCovXG4gICAgICAgICAgICB8fCBDb21tb25VdGlsLm5vblRhYmFibGVDaGlsZENoZWNrKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfYWNjX25hbWVcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGNvbnN0IGFwcGxldF9hbHRfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcImFwcGxldF9hbHRfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJkb206YXBwbGV0XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfQXBwbGV0X0hhc0FsdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiRmFpbF8yXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcIkZhaWxfM1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IGBhcHBsZXRfYWx0X2V4aXN0cy5odG1sYCxcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IGBhcHBsZXRfYWx0X2V4aXN0cy5odG1sYCxcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IGBhcHBsZXRfYWx0X2V4aXN0cy5odG1sYCxcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IGBhcHBsZXRfYWx0X2V4aXN0cy5odG1sYCxcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IGBhcHBsZXRfYWx0X2V4aXN0cy5odG1sYFxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCI8YXBwbGV0PiBlbGVtZW50cyBtdXN0IHByb3ZpZGUgYW4gJ2FsdCcgYXR0cmlidXRlIGFuZCBhbiBhbHRlcm5hdGl2ZSBkZXNjcmlwdGlvblwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJBbiA8YXBwbGV0PiBlbGVtZW50IGRvZXMgbm90IGhhdmUgYW4gJ2FsdCcgYXR0cmlidXRlIHRoYXQgcHJvdmlkZXMgYSBzaG9ydCB0ZXh0IGFsdGVybmF0aXZlXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIlRoZSAnYWx0JyBhdHRyaWJ1dGUgdmFsdWUgZm9yIGFuIDxhcHBsZXQ+IGVsZW1lbnQgZHVwbGljYXRlcyB0aGUgJ2NvZGUnIGF0dHJpYnV0ZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJBbiA8YXBwbGV0PiBlbGVtZW50IHByb3ZpZGVzIGFsdGVybmF0aXZlIHRleHQsIGJ1dCBkb2VzIG5vdCBwcm92aWRlIGlubmVyIGNvbnRlbnRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFsgXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIG51bTogXCIxLjEuMVwiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICAvLyBKQ0ggLSBOTyBPVVQgT0YgU0NPUEUgaGlkZGVuIGluIGNvbnRleHRcbiAgICAgICAgaWYgKCFDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcImFsdFwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IGFsdCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFsdFwiKS50cmltKCk7XG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiY29kZVwiKSAmJiBhbHQgPT0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiY29kZVwiKS50cmltKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzJcIik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFDb21tb25VdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbihydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzNcIik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiAgICAiLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGNvbnN0IGFwcGxpY2F0aW9uX2NvbnRlbnRfYWNjZXNzaWJsZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcHBsaWNhdGlvbl9jb250ZW50X2FjY2Vzc2libGVcIixcbiAgICBjb250ZXh0OiBcImFyaWE6YXBwbGljYXRpb25cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIkhBQUNfQXBwbGljYXRpb25fUm9sZV9UZXh0XCI6IHtcbiAgICAgICAgICAgIDA6IGBIQUFDX0FwcGxpY2F0aW9uX1JvbGVfVGV4dC5odG1sYCxcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgMDogYGFwcGxpY2F0aW9uX2NvbnRlbnRfYWNjZXNzaWJsZS5odG1sYCxcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IGBhcHBsaWNhdGlvbl9jb250ZW50X2FjY2Vzc2libGUuaHRtbGAsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IGBhcHBsaWNhdGlvbl9jb250ZW50X2FjY2Vzc2libGUuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiTm9uLWRlY29yYXRpdmUgc3RhdGljIHRleHQgYW5kIGltYWdlIGNvbnRlbnQgd2l0aGluIGFuIGVsZW1lbnQgd2l0aCBcXFwiYXBwbGljYXRpb25cXFwiIHJvbGUgbXVzdCBiZSBhY2Nlc3NpYmxlXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVmVyaWZ5IHRoYXQgdGhlIG5vbi1kZWNvcmF0aXZlIHN0YXRpYyB0ZXh0IGFuZCBpbWFnZSBjb250ZW50IHdpdGhpbiBhbiBlbGVtZW50IHdpdGggXFxcImFwcGxpY2F0aW9uXFxcIiByb2xlIGFyZSBhY2Nlc3NpYmxlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbIFwiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBudW06IFtcIjEuMS4xXCIsIFwiMi4xLjFcIl0sIC8vbWF0Y2ggbGlzdGluZyBpbiBoZWxwXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuICAgICAgICBsZXQgY2hpbGRyZW4gPSBydWxlQ29udGV4dC5jaGlsZE5vZGVzO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgcGFzc2VkICYmIGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGNoaWxkcmVuW2ldLm5vZGVUeXBlID09PSAxKSB7XG4gICAgICAgICAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlVmlzaWJsZShjaGlsZHJlbltpXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gQXJpYVV0aWwuaGFzUm9sZUluU2VtYW50aWNzKGNoaWxkcmVuW2ldLCBcImRvY3VtZW50XCIpIHx8IEFyaWFVdGlsLmhhc1JvbGVJblNlbWFudGljcyhjaGlsZHJlbltpXSwgXCJhcnRpY2xlXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hpbGRyZW5baV0ubm9kZVR5cGUgPT09IDMpIHtcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSBjaGlsZHJlbltpXS5ub2RlVmFsdWUudHJpbSgpLmxlbmd0aCA9PT0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwYXNzZWQgPyBSdWxlUGFzcyhcIlBhc3NfMFwiKSA6IFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG5leHBvcnQgY29uc3QgYXJlYV9hbHRfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcImFyZWFfYWx0X2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmFyZWFcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9BcmVhX0hhc0FsdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBgYXJlYV9hbHRfZXhpc3RzLmh0bWxgLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogYGFyZWFfYWx0X2V4aXN0cy5odG1sYCxcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IGBhcmVhX2FsdF9leGlzdHMuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiPGFyZWE+IGVsZW1lbnRzIGluIGFuIGltYWdlIG1hcCBtdXN0IGhhdmUgYSB0ZXh0IGFsdGVybmF0aXZlXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIjxhcmVhPiBlbGVtZW50IGluIGFuIGltYWdlIG1hcCBoYXMgbm8gdGV4dCBhbHRlcm5hdGl2ZVwiXG4gICAgICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFsgXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIG51bTogXCIxLjEuMVwiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxufV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIC8vIEpDSCAtIE5PIE9VVCBPRiBTQ09QRSBoaWRkZW4gaW4gY29udGV4dFxuICAgICAgICBpZiAoQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJhbHRcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiAgICAiLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5pbXBvcnQgeyBBY2NOYW1lVXRpbCB9IGZyb20gXCIuLi91dGlsL0FjY05hbWVVdGlsXCI7XG5pbXBvcnQgeyBBUklBRGVmaW5pdGlvbnMgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBRGVmaW5pdGlvbnNcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfYWNjZXNzaWJsZW5hbWVfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfYWNjZXNzaWJsZW5hbWVfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmNvbHVtbmhlYWRlciwgYXJpYTpoZWFkaW5nLCBhcmlhOnJvd2hlYWRlciwgYXJpYTpncmFwaGljcy1kb2N1bWVudCxhcmlhOmdyYXBoaWNzLXN5bWJvbCwgYXJpYTppbWcsYXJpYTppbWFnZSwgZG9jLWJhY2tsaW5rLCBkb2MtYmlibGlvZW50cnksIGRvYy1iaWJsaW9yZWYsIGRvYy1nbG9zc3JlZiwgZG9jLW5vdGVyZWYsIGRvYy1wYWdlYnJlYWssIGRvYy1leGFtcGxlXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImFyaWFfYWNjZXNzaWJsZW5hbWVfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9ub19hY2Nlc3NpYmxlX25hbWVcIjogXCJhcmlhX2FjY2Vzc2libGVuYW1lX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfbm9fYWNjZXNzaWJsZV9uYW1lX2ltYWdlXCI6IFwiYXJpYV9hY2Nlc3NpYmxlbmFtZV9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfYWNjZXNzaWJsZW5hbWVfZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIkFuIGFjY2Vzc2libGUgbmFtZSBpcyBwcm92aWRlZCBmb3IgdGhlIGVsZW1lbnRcIixcbiAgICAgICAgICAgIFwiZmFpbF9ub19hY2Nlc3NpYmxlX25hbWVcIjogXCJFbGVtZW50IDx7MH0+IHdpdGggXFxcInsxfVxcXCIgcm9sZSBoYXMgbm8gYWNjZXNzaWJsZSBuYW1lXCIsXG4gICAgICAgICAgICBcImZhaWxfbm9fYWNjZXNzaWJsZV9uYW1lX2ltYWdlXCI6IFwiRWxlbWVudCA8ezB9PiB3aXRoIFxcXCJ7MX1cXFwiIHJvbGUgaGFzIG5vIGFjY2Vzc2libGUgbmFtZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVsZW1lbnRzIHdpdGggY2VydGFpbiByb2xlcyBzaG91bGQgaGF2ZSBhY2Nlc3NpYmxlIG5hbWVzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkUsXG4gICAgICAgIHJlYXNvbkNvZGVzOiBbXCJmYWlsX25vX2FjY2Vzc2libGVfbmFtZVwiXVxuICAgIH0sXG4gICAge1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiQVJJQVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkUsXG4gICAgICAgIHJlYXNvbkNvZGVzOiBbXCJmYWlsX25vX2FjY2Vzc2libGVfbmFtZV9pbWFnZVwiXVxuICAgIH1dLFxuICAgIGFjdDogW3tcIjIzYTJhOFwiOiB7XCJmYWlsX25vX2FjY2Vzc2libGVfbmFtZV9pbWFnZVwiOiBcImZhaWxcIn19XSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgIC8vIHN2ZyBlbGVtZW50IGlzIGhhbmRsZWQgaW4gc3ZnX2dyYXBoaWNzX2xhYmJlbGxlZCBydWxlIGFuZCBpbWFnZSBydWxlc1xuICAgICAgICBpZiAobm9kZU5hbWUgPT09ICdzdmcnIHx8IG5vZGVOYW1lID09PSAnaW1nJykgcmV0dXJuO1xuICAgICAgICBcbiAgICAgICAgLy8gd2hlbiB0YWJsZSBlbGVtZW50IHdpdGggYSBjYXB0aW9uIGFzIGZpcnN0IGNoaWxkXG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gJ3RhYmxlJyBcbiAgICAgICAgICAgICYmIHJ1bGVDb250ZXh0LmZpcnN0RWxlbWVudENoaWxkICYmIHJ1bGVDb250ZXh0LmZpcnN0RWxlbWVudENoaWxkLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdjYXB0aW9uJ1xuICAgICAgICAgICAgJiYgcnVsZUNvbnRleHQuZmlyc3RFbGVtZW50Q2hpbGQudGV4dENvbnRlbnQgJiYgcnVsZUNvbnRleHQuZmlyc3RFbGVtZW50Q2hpbGQudGV4dENvbnRlbnQudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuXG4gICAgICAgIGNvbnN0IGludmFsaWRSb2xlcyA9IEFyaWFVdGlsLmdldFJvbGVzVW5kZWZpbmVkQnlBcmlhKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKGludmFsaWRSb2xlcyAmJiBpbnZhbGlkUm9sZXMubGVuZ3RoID4gMCkgcmV0dXJuIG51bGw7XG4gICAgICAgIGNvbnN0IGRlcHJlY2F0ZWRSb2xlcyA9IEFyaWFVdGlsLmdldERlcHJlY2F0ZWRBcmlhUm9sZXMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoZGVwcmVjYXRlZFJvbGVzICYmIGRlcHJlY2F0ZWRSb2xlcy5sZW5ndGggPiAwKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgZGVwcmVjYXRlZEF0dHJpYnV0ZXMgPSBBcmlhVXRpbC5nZXREZXByZWNhdGVkQXJpYUF0dHJpYnV0ZXMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoZGVwcmVjYXRlZEF0dHJpYnV0ZXMgJiYgZGVwcmVjYXRlZEF0dHJpYnV0ZXMubGVuZ3RoID4gMCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgbGV0IHJvbGUgPSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoIXJvbGUgfHwgIUFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlXSB8fCAhQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVdLm5hbWVSZXF1aXJlZClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgbmFtZV9wYWlyID0gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKCFuYW1lX3BhaXIgfHwgIW5hbWVfcGFpci5uYW1lIHx8IG5hbWVfcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGlmIChyb2xlID09PSAnaW1nJyB8fCByb2xlID09PSAnaW1hZ2UnKVxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfbm9fYWNjZXNzaWJsZV9uYW1lX2ltYWdlXCIsIFtydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLCByb2xlXSk7IFxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9ub19hY2Nlc3NpYmxlX25hbWVcIiwgW3J1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksIHJvbGVdKTtcbiAgICAgICAgfSAgICBcbiAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdGFiaW5kZXhfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9hY3RpdmVkZXNjZW5kYW50X3RhYmluZGV4X3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJkb206KlthcmlhLWFjdGl2ZWRlc2NlbmRhbnRdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9JbnZhbGlkVGFiaW5kZXhGb3JBY3RpdmVkZXNjZW5kYW50XCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiYXJpYV9hY3RpdmVkZXNjZW5kYW50X3RhYmluZGV4X3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV9hY3RpdmVkZXNjZW5kYW50X3RhYmluZGV4X3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdGFiaW5kZXhfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiVGhlIDx7MH0+IGVsZW1lbnQgdXNpbmcgJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCcgc2V0IHRvIFxcXCJ7MX1cXFwiIGlzIG5vdCB0YWJiYWJsZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVsZW1lbnQgdXNpbmcgJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCcgcHJvcGVydHkgc2hvdWxkIGJlIHRhYmJhYmxlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgLy8gUnVsZSBub3Qgc3VwcG9ydGVkIG9uIG1vYmlsZVxuICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiY2xhc3NcIikgJiYgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiY2xhc3NcIikuc3Vic3RyaW5nKDAsIDMpID09IFwibWJsXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRoZSBlbGVtZW50IGlzIGhpZGRlbiBieSBhIGRpc2FibGVkIEhUTUw1IGF0dHJpYnV0ZSBvciBhcmlhLWRpc2FibGVkOlxuICAgICAgICAvLyAgMS4gSW4gdGhlIGNhc2UgdGhhdCB0aGlzIGVsZW1lbnQgaGFzIGEgZGlzYWJsZWQgYXR0cmlidXRlIGFuZCB0aGUgZWxlbWVudCBzdXBwb3J0cyBpdCwgd2UgbWFyayB0aGlzIHJ1bGUgYXMgcGFzc2VkLlxuICAgICAgICAvLyAgMi4gSW4gdGhlIGNhc2UgdGhhdCB0aGlzIGVsZW1lbnQgaGFzIGFuIGFyaWEtZGlzYWJsZWQgYXR0cmlidXRlIHRoZW4sIHdlIG1hcmsgdGhpcyBydWxlIGFzIHBhc3NlZC5cbiAgICAgICAgLy8gRm9yIGJvdGggb2YgdGhlIGNhc2VzIGFib3ZlIHdlIGRvIG5vdCBuZWVkIHRvIHBlcmZvcm0gYW55IGZ1cnRoZXIgY2hlY2tzLCBhcyB0aGUgZWxlbWVudCBpcyBkaXNhYmxlZCBpbiBzb21lIGZvcm0gb3IgYW5vdGhlci5cbiAgICAgICAgaWYgKENvbW1vblV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vaWdub3JlIGlmIHRoZSBhdHRyaWJ1dGUgJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCcgaXMgYmxhbmtcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiKS50cmltKCkubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIC8vIElmIHRoZSB0YWJpbmRleCBhdHRyaWJ1dGUgaXMgcHJvdmlkZWQgdGhlbiB2ZXJpZnkgdGhhdCBpdCBpcyAwIG9yIC0xXG4gICAgICAgIHBhc3NlZCA9IENvbW1vblV0aWwuaXNUYWJiYWJsZShydWxlQ29udGV4dCk7XG5cbiAgICAgICAgLy8gcGFzcyBpZiBvbmUgb2YgdGhlIGNoaWxkcmVuIGlzIHRhYmJhYmxlLiBpbiB0aGlzIGNhc2UsIHRoZSB0YWIgd2lsbCBzdG9wIG9uIHRoZSBmaXJzdCB0YWJiYWJsZSBlbGVtZW50XG4gICAgICAgIGlmICghcGFzc2VkKSBcbiAgICAgICAgICAgIHBhc3NlZCA9IENvbW1vblV0aWwuZ2V0VGFiYmFibGVDaGlsZHJlbihydWxlQ29udGV4dCkgPiAwO1xuXG4gICAgICAgIC8vIEJ1aWxkIGFycmF5IGZvciBub2RlIHRva2VuXG4gICAgICAgIGxldCByZXRUb2tlbjEgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgcmV0VG9rZW4xLnB1c2gobm9kZU5hbWUpO1xuXG4gICAgICAgIC8vIEJ1aWxkIGFycmF5IGZvciBpZCByZWZlcmVuY2VkIGJ5IGFyaWEtYWN0aXZlZGVzY2VuZGFudFxuICAgICAgICBsZXQgcmV0VG9rZW4yID0gbmV3IEFycmF5KCk7XG4gICAgICAgIHJldFRva2VuMi5wdXNoKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiKS5zcGxpdChcIiBcIikuam9pbihcIiwgXCIpKTtcblxuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIFtydWxlQ29udGV4dF0sICcnLCAnJywgcGFzc2VkID09IHRydWUgPyBbXSA6IFtyZXRUb2tlbjEsIHJldFRva2VuMl0pO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIsIFtyZXRUb2tlbjEudG9TdHJpbmcoKSwgcmV0VG9rZW4yLnRvU3RyaW5nKCldKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgRE9NVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9hY3RpdmVkZXNjZW5kYW50X3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfYWN0aXZlZGVzY2VuZGFudF92YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbYXJpYS1hY3RpdmVkZXNjZW5kYW50XVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiSEFBQ19BY3RpdmVEZXNjZW5kYW50Q2hlY2tcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkZhaWxfMlwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJGYWlsXzNcIlxuICAgICAgICAgICAgLy8gXCJGYWlsXzRcIjogXCJGYWlsXzRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJhcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJhcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgLy8gXCJGYWlsXzRcIjogXCJhcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfYWN0aXZlZGVzY2VuZGFudF92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlRoZSAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JyBwcm9wZXJ0eSBpcyBlbXB0eVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJUaGUgJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCcgcHJvcGVydHkgcmVmZXJlbmNlcyBhIGhpZGRlbiBub2RlXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcIkVsZW1lbnQgaXMgbm90IGEgY29tYm9ib3gsIGFuZCB0aGUgcmVmZXJlbmNlZCBhY3RpdmUtZGVzY2VuZGFudCBlbGVtZW50IGlzIG5vdCBhIHZhbGlkIGRlc2NlbmRhbnRcIixcbiAgICAgICAgICAgIC8vIFwiRmFpbF80XCI6IFwiRWxlbWVudCBpcyBhIGNvbWJvYm94LCBhbmQgdGhlIHJlZmVyZW5jZWQgYWN0aXZlLWRlc2NlbmRhbnQgZWxlbWVudCBpcyBub3QgY29udHJvbGxlZCBieSB0aGlzIGNvbXBvbmVudFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JyBwcm9wZXJ0eSBtdXN0IHJlZmVyZW5jZSB0aGUgJ2lkJyBvZiBhIG5vbi1lbXB0eSwgbm9uLWhpZGRlbiBhY3RpdmUgY2hpbGQgZWxlbWVudFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbeyBcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4yXCJdLCBcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sIFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORSBcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vIGNvbWJvYm94IGFjdGl2ZSBkZXNjZW5kYW50cyBoYW5kbGVkIGJ5ICdjb21ib2JveF9hY3RpdmVfZGVzY2VuZGFudCdcbiAgICAgICAgaWYgKEFyaWFVdGlsLmhhc1JvbGVJblNlbWFudGljcyhydWxlQ29udGV4dCwgXCJjb21ib2JveFwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZGVzY2VuZGFudF9pZCA9IEFyaWFVdGlsLmdldEFyaWFBdHRyaWJ1dGUocnVsZUNvbnRleHQsIFwiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIpO1xuICAgICAgICAvLyBQT0YxOiBUaGUgYXR0cmlidXRlIGlzIGVtcHR5XG4gICAgICAgIGlmICghZGVzY2VuZGFudF9pZCB8fCBkZXNjZW5kYW50X2lkLnRyaW0oKSA9PT0gXCJcIikge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGRlc2NlbmRhbnQgPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChydWxlQ29udGV4dCwgZGVzY2VuZGFudF9pZC50cmltKCkpO1xuICAgICAgICBpZiAoIWRlc2NlbmRhbnQgfHwgRE9NVXRpbC5zYW1lTm9kZShkZXNjZW5kYW50X2lkLCBydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgIC8vIFRoZSByZWZlcmVuY2VkIGVsZW1lbnQgZG9lc24ndCBleGlzdC4gV2UgbGV0IDEwNzcgdG8gdHJpZ2dlciB0aGUgZXJyb3JcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFWaXNVdGlsLmlzTm9kZVZpc2libGUoZGVzY2VuZGFudCkpIHtcbiAgICAgICAgICAgIC8vIFBPRjI6IGFyaWEtYWN0aXZlZGVzY2VuZGFudCByZWZlcmVuY2VzIGEgaGlkZGVuIG5vZGVcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDEuIFRoZSB2YWx1ZSBvZiBhcmlhLWFjdGl2ZWRlc2NlbmRhbnQgcmVmZXJzIHRvIGFuIGVsZW1lbnQgdGhhdCBpcyBlaXRoZXIgYSBkZXNjZW5kYW50IG9mIFxuICAgICAgICAvLyB0aGUgZWxlbWVudCB3aXRoIERPTSBmb2N1c1xuICAgICAgICBpZiAocnVsZUNvbnRleHQuY29udGFpbnMoZGVzY2VuZGFudCkpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwb2ZJZCA9IDI7XG5cbiAgICAgICAgLy8gb3IgaXMgYSBsb2dpY2FsIGRlc2NlbmRhbnQgYXMgaW5kaWNhdGVkIGJ5IHRoZSBhcmlhLW93bnMgYXR0cmlidXRlLlxuICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiYXJpYS1vd25zXCIpKSB7XG4gICAgICAgICAgICBsZXQgb3duZWRfaWRzID0gQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtb3duc1wiKS50cmltKCkpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3duZWRfaWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IG93bmVkX2VsZSA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKHJ1bGVDb250ZXh0LCBvd25lZF9pZHNbaV0pO1xuICAgICAgICAgICAgICAgIGlmIChvd25lZF9lbGUgJiYgIURPTVV0aWwuc2FtZU5vZGUob3duZWRfZWxlLCBydWxlQ29udGV4dCkgJiYgb3duZWRfZWxlLmNvbnRhaW5zKGRlc2NlbmRhbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyAyLiBUaGUgZWxlbWVudCB3aXRoIERPTSBmb2N1cyBpcyBhIHRleHRib3ggd2l0aCBhcmlhLWNvbnRyb2xzIHJlZmVycmluZyB0byBhbiBlbGVtZW50IHRoYXQgXG4gICAgICAgIC8vICBzdXBwb3J0cyBhcmlhLWFjdGl2ZWRlc2NlbmRhbnQsIGFuZCB0aGUgdmFsdWUgb2YgYXJpYS1hY3RpdmVkZXNjZW5kYW50IHNwZWNpZmllZCBmb3IgdGhlIFxuICAgICAgICAvLyAgdGV4dGJveCByZWZlcnMgdG8gZWl0aGVyIGEgZGVzY2VuZGFudCBvZiB0aGUgZWxlbWVudCBjb250cm9sbGVkIGJ5IHRoZSB0ZXh0Ym94IG9yIGlzIGEgbG9naWNhbCBcbiAgICAgICAgLy8gIGRlc2NlbmRhbnQgb2YgdGhhdCBjb250cm9sbGVkIGVsZW1lbnQgYXMgaW5kaWNhdGVkIGJ5IHRoZSBhcmlhLW93bnMgYXR0cmlidXRlLlxuICAgICAgICAvL1xuICAgICAgICBpZiAoQXJpYVV0aWwuaGFzUm9sZUluU2VtYW50aWNzKHJ1bGVDb250ZXh0LCBcInRleHRib3hcIikgJiYgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiYXJpYS1jb250cm9sc1wiKSkge1xuICAgICAgICAgICAgcG9mSWQgPSAzO1xuICAgICAgICAgICAgbGV0IGNvbnRyb2xsZWRfaWRzID0gQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtY29udHJvbHNcIikudHJpbSgpKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbnRyb2xsZWRfaWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNvbnRyb2xsZWRfZWxlID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQocnVsZUNvbnRleHQsIGNvbnRyb2xsZWRfaWRzW2ldKTtcbiAgICAgICAgICAgICAgICBpZiAoY29udHJvbGxlZF9lbGUgJiYgIURPTVV0aWwuc2FtZU5vZGUoY29udHJvbGxlZF9lbGUsIHJ1bGVDb250ZXh0KSAmJiBjb250cm9sbGVkX2VsZS5jb250YWlucyhkZXNjZW5kYW50KSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjb250cm9sbGVkX2VsZS5oYXNBdHRyaWJ1dGUoXCJhcmlhLW93bnNcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG93bnNfaWRzID0gQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKGNvbnRyb2xsZWRfZWxlLmdldEF0dHJpYnV0ZShcImFyaWEtb3duc1wiKS50cmltKCkpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBvd25zX2lkcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG93bmVkX2VsZSA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKHJ1bGVDb250ZXh0LCBvd25zX2lkc1tqXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3duZWRfZWxlICYmICFET01VdGlsLnNhbWVOb2RlKG93bmVkX2VsZSwgcnVsZUNvbnRleHQpICYmIG93bmVkX2VsZS5jb250YWlucyhkZXNjZW5kYW50KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFBPRjM6IEknbSBub3QgYSBjb21ib2JveCwgYW5kIHRoZSByZWZlcmVuY2VkIGFjdGl2ZS1kZXNjZW5kYW50IGlzIG5vdCBhIGRlc2NlbmRhbnQgYW5kIG5vdCBvd25lZCBieSB0aGUgZWxlbWVudCBcbiAgICAgICAgLy8gdGhhdCByZWZlcmVuY2VkIGl0LlxuICAgICAgICBpZiAocG9mSWQgPT0gMykge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8zXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX2FwcGxpY2F0aW9uX2xhYmVsX3VuaXF1ZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2FwcGxpY2F0aW9uX2xhYmVsX3VuaXF1ZVwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTphcHBsaWNhdGlvblwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfTXVsdGlwbGVBcHBsaWNhdGlvbkxhbmRtYXJrc1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiYXJpYV9hcHBsaWNhdGlvbl9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIjogXCJhcmlhX2FwcGxpY2F0aW9uX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9hcHBsaWNhdGlvbl9sYWJlbF91bmlxdWUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiVGhlIGVsZW1lbnQgd2l0aCBcXFwiYXBwbGljYXRpb25cXFwiIHJvbGUgaGFzIGEgdW5pcXVlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCIsXG4gICAgICAgICAgICBcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwiOiBcIk11bHRpcGxlIGVsZW1lbnRzIHdpdGggXFxcImFwcGxpY2F0aW9uXFxcIiByb2xlIGRvIG5vdCBoYXZlIHVuaXF1ZSBsYWJlbHNcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFYWNoIGVsZW1lbnQgd2l0aCBcXFwiYXBwbGljYXRpb25cXFwiIHJvbGUgbXVzdCBoYXZlIGEgdW5pcXVlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjQuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IGR1cHBlZCA9IEFyaWFVdGlsLmlzTGFuZG1hcmtOYW1lVW5pcXVlKHJ1bGVDb250ZXh0LCBcImFwcGxpY2F0aW9uXCIpOyAgICBcbiAgICAgICAgaWYgKGR1cHBlZCA9PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIGlmIChkdXBwZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBY2NOYW1lVXRpbCB9IGZyb20gXCIuLi91dGlsL0FjY05hbWVVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9hcHBsaWNhdGlvbl9sYWJlbGxlZDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2FwcGxpY2F0aW9uX2xhYmVsbGVkXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmFwcGxpY2F0aW9uXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9BcHBsaWNhdGlvbkxhbmRtYXJrTGFiZWxcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImZhaWxfbm9fbGFiZWxcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJhcmlhX2FwcGxpY2F0aW9uX2xhYmVsbGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9ub19sYWJlbFwiOiBcImFyaWFfYXBwbGljYXRpb25fbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfYXBwbGljYXRpb25fbGFiZWxsZWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiVGhlIGVsZW1lbnQgd2l0aCBcXFwiYXBwbGljYXRpb25cXFwiIHJvbGUgaGFzIGEgbGFiZWwgdGhhdCBkZXNjcmliZXMgaXRzIHB1cnBvc2VcIixcbiAgICAgICAgICAgIFwiZmFpbF9ub19sYWJlbFwiOiBcIkVsZW1lbnQgd2l0aCBcXFwiYXBwbGljYXRpb25cXFwiIHJvbGUgZG9lcyBub3QgaGF2ZSBhIGxhYmVsXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWFjaCBlbGVtZW50IHdpdGggXFxcImFwcGxpY2F0aW9uXFxcIiByb2xlIG11c3QgaGF2ZSBhIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjQuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZShydWxlQ29udGV4dCk7XG4gICAgICAgIGlmICghcGFpcikge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9ub19sYWJlbFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9hcnRpY2xlX2xhYmVsX3VuaXF1ZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2FydGljbGVfbGFiZWxfdW5pcXVlXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmFydGljbGVcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX011bHRpcGxlQXJ0aWNsZVJvbGVzX0ltcGxpY2l0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJhcmlhX2FydGljbGVfbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCI6IFwiYXJpYV9hcnRpY2xlX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9hcnRpY2xlX2xhYmVsX3VuaXF1ZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJUaGUgZWxlbWVudCB3aXRoIFxcXCJhcnRpY2xlXFxcIiByb2xlIGhhcyBhIHVuaXF1ZSBsYWJlbCB0aGF0IGRlc2NyaWJlcyBpdHMgcHVycG9zZVwiLFxuICAgICAgICAgICAgXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIjogXCJNdWx0aXBsZSBlbGVtZW50cyB3aXRoIFxcXCJhcnRpY2xlXFxcIiByb2xlIGRvIG5vdCBoYXZlIHVuaXF1ZSBsYWJlbHNcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFYWNoIGVsZW1lbnQgd2l0aCBcXFwiYXJ0aWNsZVxcXCIgcm9sZSBtdXN0IGhhdmUgYSB1bmlxdWUgbGFiZWwgdGhhdCBkZXNjcmliZXMgaXRzIHB1cnBvc2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuNC4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgY29uc3QgZHVwcGVkID0gQXJpYVV0aWwuaXNMYW5kbWFya05hbWVVbmlxdWUocnVsZUNvbnRleHQsIFwiYXJ0aWNsZVwiKTsgICAgXG4gICAgICAgIGlmIChkdXBwZWQgPT0gbnVsbCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgaWYgKGR1cHBlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFSSUFEZWZpbml0aW9ucyB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFEZWZpbml0aW9uc1wiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9hdHRyaWJ1dGVfYWxsb3dlZDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2F0dHJpYnV0ZV9hbGxvd2VkXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfVmFsaWRQcm9wZXJ0eVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBgYXJpYV9hdHRyaWJ1dGVfYWxsb3dlZC5odG1sYCxcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IGBhcmlhX2F0dHJpYnV0ZV9hbGxvd2VkLmh0bWxgLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogYGFyaWFfYXR0cmlidXRlX2FsbG93ZWQuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQVJJQSBhdHRyaWJ1dGVzIG11c3QgYmUgdmFsaWQgZm9yIHRoZSBlbGVtZW50J3Mgcm9sZVwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUaGUgYXR0cmlidXRlKHMpICd7MH0nIHJlZmVyZW5jZWQgYnkgdGhlIGVsZW1lbnQgPHsxfT4gaXMgbm90IGEgdmFsaWQgQVJJQSBzdGF0ZSBvciBwcm9wZXJ0eVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBpZDogWyBcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgbnVtOiBcIjQuMS4yXCIsIC8vIG51bTogWyBcIjIuNC40XCIsIFwieC55LnpcIiBdIGFsc28gYWxsb3dlZFxuICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBcIjVmOTlhN1wiLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBjb250ZXh0QXR0cmlidXRlcyA9IHJ1bGVDb250ZXh0LmF0dHJpYnV0ZXM7XG4gICAgICAgIFxuICAgICAgICAvLyBUaGlzIGdldHMgYWxsIGVsZW1lbnRzIHdpdGggYXR0cmlidXRlcyBzbyB3ZSBzdGlsbCBoYXZlIHNvbWVcbiAgICAgICAgLy8gT3V0IG9mIFNjb3BlIHNpbmNlIG5vdCBhbGwgYXR0cmlidXRlcyBhcmUgYXJpYSBcblxuICAgICAgICBpZiAoY29udGV4dEF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgIGxldCBwcm9wZXJ0eURhdGFUeXBlcyA9IEFSSUFEZWZpbml0aW9ucy5wcm9wZXJ0eURhdGFUeXBlcztcbiAgICAgICAgICAgIGxldCBmYWlsZWRQcm9wZXJ0aWVzID0gXCJcIjtcbiAgICAgICAgICAgIGxldCB0ZXN0ZWRQcm9wZXJ0aWVzID0gMDtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW5ndGggPSBjb250ZXh0QXR0cmlidXRlcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBhdHRyTmFtZSA9IGNvbnRleHRBdHRyaWJ1dGVzW2ldLm5hbWU7XG4gICAgICAgICAgICAgICAgaWYgKEFyaWFVdGlsLmlzRGVmaW5lZEFyaWFBdHRyaWJ1dGUocnVsZUNvbnRleHQsIGF0dHJOYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICB0ZXN0ZWRQcm9wZXJ0aWVzKys7XG4gICAgICAgICAgICAgICAgICAgIC8vIE5vdyB3ZSBqdXN0IGhhdmUgYXJpYSBhdHRyaWJ1dGVzIHdoaWNoIGNhblxuICAgICAgICAgICAgICAgICAgICAvLyBwYXNzIG9yIGZhaWwgYmFzZWQgb24gd2hldGhlciB0aGVyZSBwcm9wZXJ0eSBpcyB2YWxpZFxuICAgICAgICAgICAgICAgICAgICBsZXQgZGF0YVR5cGVzID0gcHJvcGVydHlEYXRhVHlwZXNbYXR0ck5hbWVdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWRhdGFUeXBlcykgeyAvLyBpZiBwcm9wZXJ0eSBpcyBub3QgaW4gdmFsaWQgcHJvcGVydHkgbGlzdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGZhaWxlZFByb3BlcnRpZXMgY29tbWEgc2VwIGxpc3RcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmYWlsZWRQcm9wZXJ0aWVzLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbGVkUHJvcGVydGllcyA9IGF0dHJOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsZWRQcm9wZXJ0aWVzID0gZmFpbGVkUHJvcGVydGllcyArIFwiLCBcIiArIGF0dHJOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRlc3RlZFByb3BlcnRpZXMgPT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChmYWlsZWRQcm9wZXJ0aWVzLmxlbmd0aCAhPSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIsIFtmYWlsZWRQcm9wZXJ0aWVzLCBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vcmV0dXJuIFJ1bGVQYXNzKDEpO1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIC8vIEpDSCAtIHBhc3NpbmcgaXMgYmFzZWQgb24gYWxsIGF0dHJpYnV0ZXMgbm90IGp1c3QgYXJpYSBhdHRyaWJ1dGVzXG4gICAgICAgIC8vICAgICAgIGxlYWRpbmcgdG8gT1ZFUiBDT1VOVElORyBzbyBtb3ZlZCBwYXNzIHVwXG4gICAgICAgIC8vcmV0dXJuIFJ1bGVQYXNzKDEpO1xuICAgIH1cbn1cbiAgICAiLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfYXR0cmlidXRlX2NvbmZsaWN0OiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfYXR0cmlidXRlX2NvbmZsaWN0XCIsXG4gICAgY29udGV4dDogXCJkb206KlthcmlhLXJlcXVpcmVkXSwgZG9tOipbYXJpYS1hdXRvY29tcGxldGVdLCBkb206KlthcmlhLXJlYWRvbmx5XSwgZG9tOipbYXJpYS1kaXNhYmxlZF0sIGRvbToqW2FyaWEtcGxhY2Vob2xkZXJdXCIgXG4gICAgICAgICAgICArIFwiLCBkb206KlthcmlhLWNoZWNrZWRdLCBkb206KlthcmlhLWhpZGRlbl0sIGRvbToqW2FyaWEtdmFsdWVtYXhdLCBkb206KlthcmlhLXZhbHVlbWluXSwgZG9tOipbYXJpYS1jb2xzcGFuXVwiXG4gICAgICAgICAgICArIFwiLCBkb206KlthcmlhLXJvd3NwYW5dXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIC8vIFwicGFzc1wiOiBcImFyaWFfYXR0cmlidXRlX2NvbmZsaWN0Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9jb25mbGljdFwiOiBcImFyaWFfYXR0cmlidXRlX2NvbmZsaWN0Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2F0dHJpYnV0ZV9jb25mbGljdC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICAvLyBcInBhc3NcIjogXCJUaGUgQVJJQSBhdHRyaWJ1dGUgaXMgbm90IGNvbmZsaWN0IHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgSFRNTCBhdHRyaWJ1dGVcIixcbiAgICAgICAgICAgIFwiZmFpbF9jb25mbGljdFwiOiBcIlRoZSBBUklBIGF0dHJpYnV0ZSBcXFwiezB9XFxcIiBpcyBpbiBjb25mbGljdCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIEhUTUwgYXR0cmlidXRlIFxcXCJ7MX1cXFwiXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQW4gQVJJQSBhdHRyaWJ1dGUgbXVzdCBub3QgY29uZmxpY3Qgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBIVE1MIGF0dHJpYnV0ZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAgIC8vIGRlcGVuZGVuY3kgY2hlY2s6IGlmIHRoZSBBUklBIGF0dHJpYnV0ZSBpcyBjb21wbGV0ZWx5IGludmFsaWQsIHNraXAgdGhpcyBjaGVja1xuICAgICAgICBsZXQgaW52YWxpZEF0dHJpYnV0ZXMgPSBBcmlhVXRpbC5nZXRJbnZhbGlkQXJpYUF0dHJpYnV0ZXMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoaW52YWxpZEF0dHJpYnV0ZXMgJiYgaW52YWxpZEF0dHJpYnV0ZXMubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgbGV0IHJldCA9IFtdO1xuICAgICAgICBsZXQgYXJpYUF0dHJpYnV0ZXMgPSBBcmlhVXRpbC5nZXRVc2VyRGVmaW5lZEFyaWFBdHRyaWJ1dGVzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKCFhcmlhQXR0cmlidXRlcyB8fCBhcmlhQXR0cmlidXRlcy5sZW5ndGggPT09MClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCBjb25mbGljdEF0dHJpYnV0ZXMgPSBBcmlhVXRpbC5nZXRDb25mbGljdEFyaWFBbmRIdG1sQXR0cmlidXRlcyhydWxlQ29udGV4dCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29uZmxpY3RBdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICByZXQucHVzaChSdWxlRmFpbChcImZhaWxfY29uZmxpY3RcIiwgW2NvbmZsaWN0QXR0cmlidXRlc1tpXVsnYXJpYUF0dHInXSwgY29uZmxpY3RBdHRyaWJ1dGVzW2ldWydodG1sQXR0ciddXSkpO1xuICAgICAgICAgICAgaWYgKGFyaWFBdHRyaWJ1dGVzLmluY2x1ZGVzKGNvbmZsaWN0QXR0cmlidXRlc1tpXVsnYXJpYUF0dHInXSkpXG4gICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5yZWR1Y2VBcnJheUl0ZW1MaXN0KFtjb25mbGljdEF0dHJpYnV0ZXNbaV1bJ2FyaWFBdHRyJ11dLCBhcmlhQXR0cmlidXRlcyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmV0Lmxlbmd0aCA+IDApIFxuICAgICAgICAgICAgcmV0dXJuIHJldDtcblxuICAgICAgICByZXR1cm4gbnVsbDsgIFxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9hdHRyaWJ1dGVfZGVwcmVjYXRlZDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2F0dHJpYnV0ZV9kZXByZWNhdGVkXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICAvLyBcInBhc3NcIjogXCJhcmlhX2F0dHJpYnV0ZV9kZXByZWNhdGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9hcmlhX3JvbGVcIjogXCJhcmlhX2F0dHJpYnV0ZV9kZXByZWNhdGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9hcmlhX2F0dHJcIjogXCJhcmlhX2F0dHJpYnV0ZV9kZXByZWNhdGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9yb2xlX2F0dHJcIjogXCJhcmlhX2F0dHJpYnV0ZV9kZXByZWNhdGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2F0dHJpYnV0ZV9kZXByZWNhdGVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIC8vIFwicGFzc1wiOiBcIlRoZSBBUklBIHJvbGVzIGFuZCBhdHRyaWJ1dGUgYXJlIHVzZWQgcGVyIHNwZWNpZmljYXRpb25cIixcbiAgICAgICAgICAgIFwiZmFpbF9hcmlhX3JvbGVcIjogXCJUaGUgQVJJQSByb2xlIFxcXCJ7MH1cXFwiIGlzIGRlcHJlY2F0ZWQgaW4gdGhlIEFSSUEgc3BlY2lmaWNhdGlvblwiLFxuICAgICAgICAgICAgXCJmYWlsX2FyaWFfYXR0clwiOiBcIlRoZSBBUklBIGF0dHJpYnV0ZXMgXFxcInswfVxcXCIgYXJlIGRlcHJlY2F0ZWQgaW4gdGhlIEFSSUEgc3BlY2lmaWNhdGlvblwiLFxuICAgICAgICAgICAgXCJmYWlsX3JvbGVfYXR0clwiOiBcIlRoZSBBUklBIGF0dHJpYnV0ZXMgXFxcInswfVxcXCIgYXJlIGRlcHJlY2F0ZWQgZm9yIHRoZSByb2xlIFxcXCJ7MX1cXFwiIGluIHRoZSBBUklBIHNwZWNpZmljYXRpb25cIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJObyBkZXByZWNhdGVkIEFSSUEgcm9sZSBvciBhdHRyaWJ1dGUgc2hvdWxkIGJlIHVzZWRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3sgXG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCJdLCBcbiAgICAgICAgXCJudW1cIjogW1wiQVJJQVwiXSwgXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sIFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFIFxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAgIGxldCByZXQgPSBbXTtcbiAgICAgICAgY29uc3QgZGVwcmVjYXRlZFJvbGVzID0gQXJpYVV0aWwuZ2V0RGVwcmVjYXRlZEFyaWFSb2xlcyhydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChkZXByZWNhdGVkUm9sZXMgJiYgZGVwcmVjYXRlZFJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGVwcmVjYXRlZFJvbGVzLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgICAgIHJldC5wdXNoKFJ1bGVGYWlsKCdmYWlsX2FyaWFfcm9sZScsIFtkZXByZWNhdGVkUm9sZXNbaV1dKSk7ICAgICBcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRlcHJlY2F0ZWRBdHRyaWJ1dGVzID0gQXJpYVV0aWwuZ2V0RGVwcmVjYXRlZEFyaWFBdHRyaWJ1dGVzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKGRlcHJlY2F0ZWRBdHRyaWJ1dGVzICYmIGRlcHJlY2F0ZWRBdHRyaWJ1dGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGVwcmVjYXRlZEF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAvLyBcInJvbGVcIjpcImFueVwiLCBcImF0dHJpYnV0ZVwiOmFyaWFBdHRyc1tpXX1cbiAgICAgICAgICAgICAgICBpZiAoZGVwcmVjYXRlZEF0dHJpYnV0ZXNbaV0ucm9sZSA9PT0gJ2FueScpXG4gICAgICAgICAgICAgICAgICAgIHJldC5wdXNoKFJ1bGVGYWlsKCdmYWlsX2FyaWFfYXR0cicsIFtkZXByZWNhdGVkQXR0cmlidXRlc1tpXS5hdHRyaWJ1dGVdKSk7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICByZXQucHVzaChSdWxlRmFpbCgnZmFpbF9yb2xlX2F0dHInLCBbZGVwcmVjYXRlZEF0dHJpYnV0ZXNbaV0uYXR0cmlidXRlLCBkZXByZWNhdGVkQXR0cmlidXRlc1tpXS5yb2xlXSkpO1xuICAgICAgICAgICAgfSAgICAgICBcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKHJldC5sZW5ndGggPiAwKVxuICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IEFSSUFEZWZpbml0aW9ucyB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFEZWZpbml0aW9uc1wiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfYXR0cmlidXRlX2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2F0dHJpYnV0ZV9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbToqW3JvbGVdXCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJhcmlhX3JvbGVfYWxsb3dlZFwiXSxcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX0VtcHR5UHJvcGVydHlWYWx1ZVwiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcImZhaWxfZW1wdHlfYXR0cmlidXRlXCI6IFwiZmFpbF9lbXB0eV9hdHRyaWJ1dGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiYXJpYV9hdHRyaWJ1dGVfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9lbXB0eV9hdHRyaWJ1dGVcIjogXCJhcmlhX2F0dHJpYnV0ZV9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfYXR0cmlidXRlX2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJmYWlsX2VtcHR5X2F0dHJpYnV0ZVwiOiBcIlRoZSBlbGVtZW50IGF0dHJpYnV0ZShzKTogJ3swfScgdmFsdWUgaXMgZW1wdHlcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJXaGVuIHNwZWNpZnlpbmcgYSByZXF1aXJlZCBBUklBIGF0dHJpYnV0ZSwgdGhlIHZhbHVlIG11c3Qgbm90IGJlIGVtcHR5XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXCI2YTcyODFcIl0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcblxuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IGlzIGhpZGRlblxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGxldCBhdHRyTmFtZUFyciA9IG5ldyBBcnJheSgpO1xuICAgICAgICBsZXQgZGVzaWduUGF0dGVybnMgPSBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnM7XG4gICAgICAgIGxldCBoYXNBdHRyaWJ1dGUgPSBDb21tb25VdGlsLmhhc0F0dHJpYnV0ZTtcbiAgICAgICAgbGV0IHRlc3RlZFByb3BlcnRpZXMgPSAwO1xuXG4gICAgICAgIGxldCByb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKCFyb2xlKSByZXR1cm47XG4gICAgICAgIGlmIChkZXNpZ25QYXR0ZXJuc1tyb2xlXSAmJiBBcmlhVXRpbC5nZXRSb2xlUmVxdWlyZWRQcm9wZXJ0aWVzKHJvbGUsIHJ1bGVDb250ZXh0KSAhPSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgcmVxdWlyZWRSb2xlUHJvcHMgPSBBcmlhVXRpbC5nZXRSb2xlUmVxdWlyZWRQcm9wZXJ0aWVzKHJvbGUsIHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW5ndGggPSByZXF1aXJlZFJvbGVQcm9wcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBhdHRyaWJ1dGUgPSByZXF1aXJlZFJvbGVQcm9wc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoaGFzQXR0cmlidXRlKHJ1bGVDb250ZXh0LCBhdHRyaWJ1dGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRlc3RlZFByb3BlcnRpZXMrKztcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5vZGVWYWx1ZSA9IENvbW1vblV0aWwubm9ybWFsaXplU3BhY2luZyhydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUocmVxdWlyZWRSb2xlUHJvcHNbaV0pKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGVWYWx1ZS5sZW5ndGggPT0gMCkgYXR0ck5hbWVBcnIucHVzaChyZXF1aXJlZFJvbGVQcm9wc1tpXSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXF1aXJlZFJvbGVQcm9wc1tpXSA9PSBcImFyaWEtbGFiZWxsZWRieVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgocm9sZSA9PSBcInJhZGlvZ3JvdXBcIikgJiYgKGhhc0F0dHJpYnV0ZShydWxlQ29udGV4dCwgXCJhcmlhLWxhYmVsXCIpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGVzdGVkUHJvcGVydGllcysrO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5vZGVWYWx1ZSA9IENvbW1vblV0aWwubm9ybWFsaXplU3BhY2luZyhydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlVmFsdWUubGVuZ3RoID09IDApIGF0dHJOYW1lQXJyLnB1c2goXCJhcmlhLWxhYmVsXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXF1aXJlZFJvbGVQcm9wc1tpXSA9PSBcImFyaWEtdmFsdWVub3dcIikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoKHJvbGUgPT0gXCJwcm9ncmVzc2JhclwiKSAmJiAoaGFzQXR0cmlidXRlKHJ1bGVDb250ZXh0LCBcImFyaWEtdmFsdWV0ZXh0XCIpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGVzdGVkUHJvcGVydGllcysrO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5vZGVWYWx1ZSA9IENvbW1vblV0aWwubm9ybWFsaXplU3BhY2luZyhydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhcmlhLXZhbHVldGV4dFwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZVZhbHVlLmxlbmd0aCA9PSAwKSBhdHRyTmFtZUFyci5wdXNoKFwiYXJpYS12YWx1ZXRleHRcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmIChkZXNpZ25QYXR0ZXJuc1tyb2xlXSkge1xuICAgICAgICAgICAgbGV0IHRhZ1Byb3BlcnR5ID0gQXJpYVV0aWwuZ2V0RWxlbWVudEFyaWFQcm9wZXJ0eShydWxlQ29udGV4dCk7XG4gICAgICAgICAgICBsZXQgcGVybWl0dGVkUm9sZXMgPSBbXTtcbiAgICAgICAgICAgIHBlcm1pdHRlZFJvbGVzLnB1c2gocm9sZSk7XG4gICAgICAgICAgICBsZXQgYWxsb3dlZEF0dHJpYnV0ZXMgPSBBcmlhVXRpbC5nZXRBbGxvd2VkQXJpYUF0dHJpYnV0ZXMocnVsZUNvbnRleHQsIHBlcm1pdHRlZFJvbGVzLCB0YWdQcm9wZXJ0eSk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuZ3RoID0gYWxsb3dlZEF0dHJpYnV0ZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgYXR0cmlidXRlID0gYWxsb3dlZEF0dHJpYnV0ZXNbaV07XG4gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZSA9PSBcImFyaWEtY2hlY2tlZFwiIHx8IGF0dHJpYnV0ZSA9PSBcImFyaWEtc2VsZWN0ZWRcIiB8fFxuICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgPT0gXCJhcmlhLWV4cGFuZGVkXCIgfHwgYXR0cmlidXRlID09IFwiYXJpYS1vcmllbnRhdGlvblwiIHx8XG4gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSA9PSBcImFyaWEtbGV2ZWxcIikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaGFzQXR0cmlidXRlKHJ1bGVDb250ZXh0LCBhdHRyaWJ1dGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXN0ZWRQcm9wZXJ0aWVzKys7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbm9kZVZhbHVlID0gQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShhdHRyaWJ1dGUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlVmFsdWUubGVuZ3RoID09IDAgJiYgIWF0dHJOYW1lQXJyLmluY2x1ZGVzKGF0dHJpYnV0ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyTmFtZUFyci5wdXNoKGF0dHJpYnV0ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmV0TXNnID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCBwYXNzZWQgPSBhdHRyTmFtZUFyci5sZW5ndGggPT0gMDtcbiAgICAgICAgcmV0TXNnLnB1c2goYXR0ck5hbWVBcnIuam9pbihcIiwgXCIpKTtcbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBbcnVsZUNvbnRleHRdLCBhdHRyTmFtZUFyciwgJycsIHJldE1zZyk7XG4gICAgICAgIGlmICh0ZXN0ZWRQcm9wZXJ0aWVzID09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9IGVsc2UgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfZW1wdHlfYXR0cmlidXRlXCIsIHJldE1zZyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9hdHRyaWJ1dGVfcmVkdW5kYW50OiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfYXR0cmlidXRlX3JlZHVuZGFudFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbYXJpYS1yZXF1aXJlZF0sIGRvbToqW2FyaWEtYXV0b2NvbXBsZXRlXSwgZG9tOipbYXJpYS1yZWFkb25seV0sIGRvbToqW2FyaWEtZGlzYWJsZWRdLCBkb206KlthcmlhLXBsYWNlaG9sZGVyXVwiIFxuICAgICAgICAgICAgKyBcIiwgZG9tOipbYXJpYS1jaGVja2VkXSwgZG9tOipbYXJpYS1oaWRkZW5dLCBkb206KlthcmlhLXZhbHVlbWF4XSwgZG9tOipbYXJpYS12YWx1ZW1pbl0sIGRvbToqW2FyaWEtY29sc3Bhbl1cIlxuICAgICAgICAgICAgKyBcIiwgZG9tOipbYXJpYS1yb3dzcGFuXVwiLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJhcmlhX2F0dHJpYnV0ZV9yZWR1bmRhbnQuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX3JlZHVuZGFudFwiOiBcImFyaWFfYXR0cmlidXRlX3JlZHVuZGFudC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9hdHRyaWJ1dGVfcmVkdW5kYW50Lmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlRoZSBBUklBIGF0dHJpYnV0ZSBpcyBub3QgcmVkdW5kYW50IHdpdGggYSBjb3JyZXNwb25kaW5nIEhUTUwgYXR0cmlidXRlXCIsXG4gICAgICAgICAgICBcImZhaWxfcmVkdW5kYW50XCI6IFwiVGhlIEFSSUEgYXR0cmlidXRlIFxcXCJ7MH1cXFwiIGlzIHJlZHVuZGFudCB3aXRoIHRoZSBIVE1MIGF0dHJpYnV0ZSBcXFwiezF9XFxcIlwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkFuIEFSSUEgYXR0cmlidXRlIHNob3VsZCBub3QgYmUgcmVkdW5kYW50IHdpdGggYSBjb3JyZXNwb25kaW5nIEhUTUwgYXR0cmlidXRlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIFxuICAgICAgICAvLyBkZXBlbmRlbmN5IGNoZWNrOiBpZiB0aGUgQVJJQSBhdHRyaWJ1dGUgaXMgY29tcGxldGVseSBpbnZhbGlkLCBza2lwIHRoaXMgY2hlY2tcbiAgICAgICAgbGV0IGludmFsaWRBdHRyaWJ1dGVzID0gQXJpYVV0aWwuZ2V0SW52YWxpZEFyaWFBdHRyaWJ1dGVzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKGludmFsaWRBdHRyaWJ1dGVzICYmIGludmFsaWRBdHRyaWJ1dGVzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICAvLyBpZiBjb25mbGljdCBhbHJlYWR5IHJlcG9ydGVkLCBpZ25vcmUgcmVwb3J0aW5nIG92ZXJsYXBcbiAgICAgICAgbGV0IGNvbmZsaWN0QXR0cmlidXRlcyA9IEFyaWFVdGlsLmdldENvbmZsaWN0QXJpYUFuZEh0bWxBdHRyaWJ1dGVzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKGNvbmZsaWN0QXR0cmlidXRlcyAmJiBjb25mbGljdEF0dHJpYnV0ZXMubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCBkb21BdHRyaWJ1dGVzID0gcnVsZUNvbnRleHQuYXR0cmlidXRlcztcbiAgICAgICAgbGV0IGFyaWFBdHRycyA9IFtdO1xuICAgICAgICBsZXQgaHRtbEF0dHJzID0gW107XG4gICAgICAgIGlmIChkb21BdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRvbUF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgYXR0ck5hbWUgPSBkb21BdHRyaWJ1dGVzW2ldLm5hbWUudHJpbSgpLnRvTG93ZXJDYXNlKCk7IFxuICAgICAgICAgICAgICAgIGxldCBhdHRyVmFsdWUgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoYXR0ck5hbWUpO1xuICAgICAgICAgICAgICAgIGlmIChhdHRyVmFsdWUgPT09ICcnKSBhdHRyVmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgICAgIGlmIChhdHRyTmFtZS5zdWJzdHJpbmcoMCwgNSkgPT09ICdhcmlhLScpIFxuICAgICAgICAgICAgICAgICAgICBhcmlhQXR0cnMucHVzaCh7bmFtZTogYXR0ck5hbWUsIHZhbHVlOiBhdHRyVmFsdWV9KTtcbiAgICAgICAgICAgICAgICBlbHNlIFxuICAgICAgICAgICAgICAgICAgICBodG1sQXR0cnMucHVzaCh7bmFtZTogYXR0ck5hbWUsIHZhbHVlOiBhdHRyVmFsdWV9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgcmV0ID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJpYUF0dHJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBleGFtaW5lZEh0bWxBdHJOYW1lcyA9IEFyaWFVdGlsLmdldENvbmZsaWN0T3JPdmVybGFwcGluZ0h0bWxBdHRyaWJ1dGUoYXJpYUF0dHJzW2ldLCBodG1sQXR0cnMsICdvdmVybGFwcGluZycpO1xuICAgICAgICAgICAgaWYgKGV4YW1pbmVkSHRtbEF0ck5hbWVzID09PSBudWxsKSBjb250aW51ZTtcbiAgICAgICAgICAgIGV4YW1pbmVkSHRtbEF0ck5hbWVzLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGl0ZW1bJ3Jlc3VsdCddID09PSAnUGFzcycpIHsgLy9wYXNzXG4gICAgICAgICAgICAgICAgICAgIHJldC5wdXNoKFJ1bGVQYXNzKFwicGFzc1wiKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpdGVtWydyZXN1bHQnXSA9PT0gJ0ZhaWxlZCcpIHsgLy9mYWlsZWRcbiAgICAgICAgICAgICAgICAgICAgcmV0LnB1c2goUnVsZUZhaWwoXCJmYWlsX3JlZHVuZGFudFwiLCBbYXJpYUF0dHJzW2ldWyduYW1lJ10sIGl0ZW1bJ2F0dHInXV0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTsgICAgXG4gICAgICAgIH0gICAgXG4gICAgICAgIGlmIChyZXQubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgQVJJQURlZmluaXRpb25zIH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQURlZmluaXRpb25zXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfYXR0cmlidXRlX3JlcXVpcmVkOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfYXR0cmlidXRlX3JlcXVpcmVkXCIsXG4gICAgY29udGV4dDogXCJkb206Kltyb2xlXVwiLFxuICAgIGRlcGVuZGVuY2llczogW1wiYXJpYV9yb2xlX2FsbG93ZWRcIl0sXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9SZXF1aXJlZFByb3BlcnRpZXNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImZhaWxfbWlzc2luZ1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IGBhcmlhX2F0dHJpYnV0ZV9yZXF1aXJlZC5odG1sYCxcbiAgICAgICAgICAgIFwicGFzc1wiOiBgYXJpYV9hdHRyaWJ1dGVfcmVxdWlyZWQuaHRtbGAsXG4gICAgICAgICAgICBcImZhaWxfbWlzc2luZ1wiOiBgYXJpYV9hdHRyaWJ1dGVfcmVxdWlyZWQuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGhlIHJlcXVpcmVkIGF0dHJpYnV0ZXMgZm9yIHRoZSBlbGVtZW50IHdpdGggYSByb2xlIG11c3QgYmUgZGVmaW5lZFwiLFxuICAgICAgICAgICAgXCJwYXNzXCI6IFwiVGhlIHJlcXVpcmVkIGF0dHJpYnV0ZXMgZm9yIHRoZSBlbGVtZW50IHdpdGggdGhlIHJvbGUgYXJlIGRlZmluZWRcIixcbiAgICAgICAgICAgIFwiZmFpbF9taXNzaW5nXCI6IFwiRWxlbWVudCB3aXRoICd7MH0nIHJvbGUgZG9lcyBub3QgaGF2ZSB0aGUgcmVxdWlyZWQgQVJJQSBhdHRyaWJ1dGUocyk6ICd7MX0nXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbIFwiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBudW06IFwiNC4xLjJcIiwgLy8gbnVtOiBbIFwiMi40LjRcIiwgXCJ4LnkuelwiIF0gYWxzbyBhbGxvd2VkXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFwiNGU4YWI2XCIsXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IGF0dHJOYW1lQXJyID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCByb2xlTmFtZUFyciA9IG5ldyBBcnJheSgpO1xuICAgICAgICBsZXQgZGVzaWduUGF0dGVybnMgPSBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnM7XG4gICAgICAgIC8vbGV0IGltcGxpY2l0Um9sZSA9IEFSSUFNYXBwZXIuZWxlbVRvSW1wbGljaXRSb2xlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgLy9sZXQgaW1wbGljaXRSb2xlID0gQXJpYVV0aWwuZ2V0SW1wbGljaXRSb2xlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgbGV0IGhhc0F0dHJpYnV0ZSA9IENvbW1vblV0aWwuaGFzQXR0cmlidXRlO1xuICAgICAgICBsZXQgdGVzdGVkUm9sZXMgPSAwO1xuXG4gICAgICAgIGxldCB0YWdQcm9wZXJ0eSA9IEFyaWFVdGlsLmdldEVsZW1lbnRBcmlhUHJvcGVydHkocnVsZUNvbnRleHQpO1xuICAgICAgICBsZXQgcm9sZSA9IEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZShydWxlQ29udGV4dCk7XG4gICAgICAgIGlmICghcm9sZSkgcmV0dXJuO1xuICAgICAgICBcbiAgICAgICAgbGV0IHJlcXVpcmVkUm9sZVByb3BzID0gQXJpYVV0aWwuZ2V0Um9sZVJlcXVpcmVkUHJvcGVydGllcyhyb2xlLCBydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChkZXNpZ25QYXR0ZXJuc1tyb2xlXSAmJiByZXF1aXJlZFJvbGVQcm9wcyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IGFsbG93ZWRSb2xlUHJvcHMgPSBBcmlhVXRpbC5nZXRBbGxvd2VkQXJpYUF0dHJpYnV0ZXMocnVsZUNvbnRleHQsIHJvbGUsIHRhZ1Byb3BlcnR5KTtcbiAgICAgICAgICAgIGxldCByb2xlTWlzc2luZ1JlcVByb3AgPSBmYWxzZTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBwcm9wZXJ0aWVzTGVuZ3RoID0gcmVxdWlyZWRSb2xlUHJvcHMubGVuZ3RoOyBpIDwgcHJvcGVydGllc0xlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFhbGxvd2VkUm9sZVByb3BzLmluY2x1ZGVzKHJlcXVpcmVkUm9sZVByb3BzW2ldKSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgaWYgKCFoYXNBdHRyaWJ1dGUocnVsZUNvbnRleHQsIHJlcXVpcmVkUm9sZVByb3BzW2ldKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiBhbiBhcmlhLWxhYmVsbGVkYnkgaXNuJ3QgcHJlc2VudCwgYW4gYXJpYS1sYWJlbCB3aWxsIG1lZXQgdGhlIHJlcXVpcmVtZW50LlxuICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWlyZWRSb2xlUHJvcHNbaV0gPT0gXCJhcmlhLWxhYmVsbGVkYnlcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCghaGFzQXR0cmlidXRlKHJ1bGVDb250ZXh0LCBcImFyaWEtbGFiZWxcIikpIHx8IChyb2xlICE9IFwicmFkaW9ncm91cFwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJOYW1lQXJyLnB1c2gocmVxdWlyZWRSb2xlUHJvcHNbaV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGVNaXNzaW5nUmVxUHJvcCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVxdWlyZWRSb2xlUHJvcHNbaV0gPT0gXCJhcmlhLXZhbHVlbm93XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoIWhhc0F0dHJpYnV0ZShydWxlQ29udGV4dCwgXCJhcmlhLXZhbHVldGV4dFwiKSkgfHwgKHJvbGUgIT0gXCJwcm9ncmVzc2JhclwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJOYW1lQXJyLnB1c2gocmVxdWlyZWRSb2xlUHJvcHNbaV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGVNaXNzaW5nUmVxUHJvcCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVxdWlyZWRSb2xlUHJvcHNbaV0gPT0gXCJhcmlhLWNvbnRyb2xzXCIgJiYgcm9sZSA9PSBcImNvbWJvYm94XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNraXAgdGhpcyBjaGVjayBzaW5jZSBhcmlhLWNvbnRyb2xzIGluIHRoZSB0ZXh0Ym94IG9mIGEgY29tYm9ib3ggaXMgYWxyZWFkeSBoYW5kbGVkIGluIHJ1bGUgSEFBQ19Db21ib2JveF9NdXN0X2hhdmVfVGV4dF9JbnB1dFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXR0ck5hbWVBcnIucHVzaChyZXF1aXJlZFJvbGVQcm9wc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByb2xlTWlzc2luZ1JlcVByb3AgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJvbGVNaXNzaW5nUmVxUHJvcCA9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgcm9sZU5hbWVBcnIucHVzaChyb2xlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgbGV0IHBhc3NlZCA9IHJvbGVOYW1lQXJyLmxlbmd0aCA9PSAwIHx8IGF0dHJOYW1lQXJyLmxlbmd0aCA9PSAwOyAvLyBvbmx5IGFyaWEgYXR0cmlidXRlcyBzbyBOTyBPVVQgT0YgU0NPUEVcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIGxldCByZXRUb2tlbiA9IG5ldyBBcnJheSgpO1xuICAgICAgICAgICAgcmV0VG9rZW4ucHVzaChyb2xlTmFtZUFyci5qb2luKFwiLCBcIikpO1xuICAgICAgICAgICAgcmV0VG9rZW4ucHVzaChhdHRyTmFtZUFyci5qb2luKFwiLCBcIikpO1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9taXNzaW5nXCIsIHJldFRva2VuKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBBUklBRGVmaW5pdGlvbnMgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBRGVmaW5pdGlvbnNcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfYXR0cmlidXRlX3ZhbHVlX3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfYXR0cmlidXRlX3ZhbHVlX3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIGRlcGVuZGVuY2llczogW1wiYXJpYV9hdHRyaWJ1dGVfYWxsb3dlZFwiXSxcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX1ZhbGlkUHJvcGVydHlWYWx1ZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfYXR0cmlidXRlX3ZhbHVlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9hdHRyaWJ1dGVfdmFsdWVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2F0dHJpYnV0ZV92YWx1ZV92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQVJJQSBwcm9wZXJ0eSB2YWx1ZXMgbXVzdCBiZSB2YWxpZFwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUaGUgdmFsdWUgXFxcInswfVxcXCIgc3BlY2lmaWVkIGZvciBhdHRyaWJ1dGUgJ3sxfScgb24gZWxlbWVudCA8ezJ9PiBpcyBub3QgdmFsaWRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFwiNmE3MjgxXCIsXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHZhbHVlQXJyID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCBhdHRyTmFtZUFyciA9IG5ldyBBcnJheSgpO1xuICAgICAgICBsZXQgZGF0YVR5cGVBcnIgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgbGV0IHByb3BlcnR5RGF0YVR5cGVzID0gQVJJQURlZmluaXRpb25zLnByb3BlcnR5RGF0YVR5cGVzO1xuICAgICAgICBsZXQgY29udGV4dEF0dHJpYnV0ZXMgPSBydWxlQ29udGV4dC5hdHRyaWJ1dGVzO1xuICAgICAgICBsZXQgdGVzdGVkUHJvcGVydHlWYWx1ZXMgPSAwO1xuXG4gICAgICAgIGlmIChjb250ZXh0QXR0cmlidXRlcykge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbmd0aCA9IGNvbnRleHRBdHRyaWJ1dGVzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGF0dHJOYW1lID0gY29udGV4dEF0dHJpYnV0ZXNbaV0ubmFtZTtcbiAgICAgICAgICAgICAgICBpZiAoQXJpYVV0aWwuaXNEZWZpbmVkQXJpYUF0dHJpYnV0ZShydWxlQ29udGV4dCwgYXR0ck5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkYXRhVHlwZXMgPSBwcm9wZXJ0eURhdGFUeXBlc1thdHRyTmFtZV07XG4gICAgICAgICAgICAgICAgICAgIGxldCBub2RlVmFsdWUgPSBDb21tb25VdGlsLm5vcm1hbGl6ZVNwYWNpbmcoY29udGV4dEF0dHJpYnV0ZXNbaV0ubm9kZVZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGVzdGVkUHJvcGVydHlWYWx1ZXMrKztcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFUeXBlcyAmJiBkYXRhVHlwZXMudmFsdWVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YVR5cGVzLnZhbHVlcy5pbmRleE9mKG5vZGVWYWx1ZSkgPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YVR5cGVzLnZhbHVlcy5pbmRleE9mKCd1bmRlZmluZWQnKSAhPSAtMSAmJiBub2RlVmFsdWUubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy90cmFuc2xhdGUgJ3VuZGVmaW5lZCcgdG8gbWVhbiAnJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFyaWEtcmVsZXZhbnQgaXMgcmVwcmVzZW50ZWQgYXMgYSBzcGFjZSBkZWxpbWl0ZWQgbGlzdCBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczogXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZGl0aW9ucywgcmVtb3ZhbHMsIHRleHQ7IG9yIGEgc2luZ2xlIGNhdGNoLWFsbCB2YWx1ZSBhbGwuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhVHlwZXMudHlwZSA9PT0gXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNubXRva2Vuc1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYXR0clZhbHVlcyA9IGNvbnRleHRBdHRyaWJ1dGVzW2ldLm5vZGVWYWx1ZS50cmltKCkuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHZhbHVlIGFsbCBpcyBzcGVjaWZpZWQsIGl0IGNhbm5vdCBoYXZlIGFueSBvdGhlciB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF0dHJWYWx1ZXMubGVuZ3RoID4gMSAmJiBhdHRyVmFsdWVzLmluY2x1ZGVzKFwiYWxsXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVBcnIucHVzaChjb250ZXh0QXR0cmlidXRlc1tpXS5ub2RlVmFsdWUuc3BsaXQoXCIgXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyTmFtZUFyci5wdXNoKGF0dHJOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZUFyci5wdXNoKGRhdGFUeXBlcy52YWx1ZXMudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoYXNoID0ge307XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBhdHRyVmFsdWVzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBpbmRpdmlkdWFsIHZhbHVlIGlzIG5vdCBpbiB0aGUgbGlzdCBvZiBhbGxvd2VkIHZhbHVlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXR0clZhbHVlc1tqXSAhPSBcIlwiICYmICFkYXRhVHlwZXMudmFsdWVzLmluY2x1ZGVzKGF0dHJWYWx1ZXNbal0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc2guaGFzT3duUHJvcGVydHkoYXR0ck5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaFthdHRyTmFtZV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJOYW1lQXJyLnB1c2goYXR0ck5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVBcnIucHVzaChhdHRyVmFsdWVzW2pdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlQXJyLnB1c2goZGF0YVR5cGVzLnZhbHVlcy50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlQXJyLnB1c2goY29udGV4dEF0dHJpYnV0ZXNbaV0ubm9kZVZhbHVlLnNwbGl0KFwiIFwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyTmFtZUFyci5wdXNoKGF0dHJOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlQXJyLnB1c2goZGF0YVR5cGVzLnZhbHVlcy50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhVHlwZXMgJiYgZGF0YVR5cGVzLnR5cGUgJiYgZGF0YVR5cGVzLnR5cGUgPT09IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaW50XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpVmFsID0gcGFyc2VJbnQobm9kZVZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc05hTihpVmFsKSB8fCAoXCJcIiArIGlWYWwgIT09IG5vZGVWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUFyci5wdXNoKG5vZGVWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ck5hbWVBcnIucHVzaChhdHRyTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YVR5cGVzICYmIGRhdGFUeXBlcy50eXBlICYmIGRhdGFUeXBlcy50eXBlID09IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjZGVjaW1hbFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZlZhbCA9IHBhcnNlRmxvYXQobm9kZVZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc05hTihmVmFsKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlQXJyLnB1c2gobm9kZVZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyTmFtZUFyci5wdXNoKGF0dHJOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhVHlwZXMgJiYgZGF0YVR5cGVzLnR5cGUgJiYgKGRhdGFUeXBlcy50eXBlID09IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjYm9vbGVhblwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRtcFYgPSBub2RlVmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodG1wViAhPT0gXCJ0cnVlXCIgJiYgdG1wViAhPT0gXCJmYWxzZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVBcnIucHVzaChub2RlVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJOYW1lQXJyLnB1c2goYXR0ck5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGFUeXBlcyAmJiBkYXRhVHlwZXMudHlwZSAmJiAoZGF0YVR5cGVzLnR5cGUgPT0gXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNzdHJpbmdcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RlZFByb3BlcnR5VmFsdWVzLS07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJldE1zZyA9IG5ldyBBcnJheSgpO1xuICAgICAgICBsZXQgcGFzc2VkID0gYXR0ck5hbWVBcnIubGVuZ3RoID09IDA7XG4gICAgICAgIHJldE1zZy5wdXNoKHZhbHVlQXJyLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgIHJldE1zZy5wdXNoKGF0dHJOYW1lQXJyLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgIHJldE1zZy5wdXNoKHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICAvLyByZXRNc2cucHVzaCAoZGF0YVR5cGVBcnIuam9pbihcIiwgXCIpKTtcbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBbcnVsZUNvbnRleHRdLCBhdHRyTmFtZUFyciwgJycsIHJldE1zZyk7XG4gICAgICAgIGlmICh0ZXN0ZWRQcm9wZXJ0eVZhbHVlcyA9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSBlbHNlIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgcmV0TXNnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX2Jhbm5lcl9sYWJlbF91bmlxdWU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9iYW5uZXJfbGFiZWxfdW5pcXVlXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmJhbm5lclwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfTXVsdGlwbGVCYW5uZXJMYW5kbWFya3NfSW1wbGljaXRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImFyaWFfYmFubmVyX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwiOiBcImFyaWFfYmFubmVyX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9iYW5uZXJfbGFiZWxfdW5pcXVlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlRoZSBlbGVtZW50IHdpdGggXFxcImJhbm5lclxcXCIgcm9sZSBoYXMgYSB1bmlxdWUgbGFiZWwgdGhhdCBkZXNjcmliZXMgaXRzIHB1cnBvc2VcIixcbiAgICAgICAgICAgIFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCI6IFwiTXVsdGlwbGUgZWxlbWVudHMgd2l0aCBcXFwiYmFubmVyXFxcIiByb2xlIGRvIG5vdCBoYXZlIHVuaXF1ZSBsYWJlbHNcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFYWNoIGVsZW1lbnQgd2l0aCBcXFwiYmFubmVyXFxcIiByb2xlIG11c3QgaGF2ZSBhIHVuaXF1ZSBsYWJlbCB0aGF0IGRlc2NyaWJlcyBpdHMgcHVycG9zZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBkdXBwZWQgPSBBcmlhVXRpbC5pc0xhbmRtYXJrTmFtZVVuaXF1ZShydWxlQ29udGV4dCwgXCJiYW5uZXJcIiwgdHJ1ZSk7ICAgIFxuICAgICAgICBpZiAoZHVwcGVkID09IG51bGwpIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgaWYgKGR1cHBlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX2Jhbm5lcl9zaW5nbGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9iYW5uZXJfc2luZ2xlXCIsXG4gICAgY29udGV4dDogXCJkb206Kltyb2xlXSwgZG9tOmhlYWRlclwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfT25lQmFubmVySW5TaWJsaW5nU2V0X0ltcGxpY2l0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9iYW5uZXJfc2luZ2xlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV9iYW5uZXJfc2luZ2xlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2Jhbm5lcl9zaW5nbGUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJNdWx0aXBsZSBlbGVtZW50cyB3aXRoIFxcXCJiYW5uZXJcXFwiIHJvbGUgZm91bmQgb24gdGhlIHBhZ2VcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBIHBhZ2UsIGRvY3VtZW50LCBvciBhcHBsaWNhdGlvbiBzaG91bGQgb25seSBoYXZlIG9uZSBlbGVtZW50IHdpdGggXFxcImJhbm5lclxcXCIgcm9sZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBpZiAoIUFyaWFVdGlsLmhhc1JvbGVJblNlbWFudGljcyhydWxlQ29udGV4dCwgXCJiYW5uZXJcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhc3NlZCA9XG4gICAgICAgICAgICBBcmlhVXRpbC5nZXRTaWJsaW5nV2l0aFJvbGVIaWRkZW4oXG4gICAgICAgICAgICAgICAgcnVsZUNvbnRleHQsXG4gICAgICAgICAgICAgICAgXCJiYW5uZXJcIixcbiAgICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgIHRydWVcbiAgICAgICAgICAgICkgPT09IG51bGw7XG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KHBhc3NlZCwgW3J1bGVDb250ZXh0XSwgJ3JvbGUnLCAnJywgW10pO1xuICAgICAgICBpZiAocGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgQVJJQURlZmluaXRpb25zIH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQURlZmluaXRpb25zXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9jaGlsZF90YWJiYWJsZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2NoaWxkX3RhYmJhYmxlXCIsXG4gICAgY29udGV4dDogXCJkb206Kltyb2xlXVwiLFxuICAgIGRlcGVuZGVuY2llczogW1wiYXJpYV9yb2xlX2FsbG93ZWRcIl0sXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9NaXNzaW5nRm9jdXNhYmxlQ2hpbGRcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJmYWlsX21pc3NpbmdfY2hpbGRcIjogXCJmYWlsX21pc3NpbmdfY2hpbGRcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJhcmlhX2NoaWxkX3RhYmJhYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9taXNzaW5nX2NoaWxkXCI6IFwiYXJpYV9jaGlsZF90YWJiYWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9jaGlsZF90YWJiYWJsZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJmYWlsX21pc3NpbmdfY2hpbGRcIjogXCJOb25lIG9mIHRoZSBkZXNjZW5kZW50IGVsZW1lbnRzIHdpdGggXFxcInsxfVxcXCIgcm9sZSBpcyB0YWJiYWJsZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlVJIGNvbXBvbmVudCBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIHRhYmJhYmxlIGRlc2NlbmRhbnQgZm9yIGtleWJvYXJkIGFjY2Vzc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgICAgLy9za2lwIHRoZSBjaGVjayBpZiB0aGUgZWxlbWVudCBpcyBoaWRkZW4gb3IgZGlzYWJsZWRcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSB8fCBDb21tb25VdGlsLmlzTm9kZURpc2FibGVkKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgcmVxdWlyZXMgcHJlc2VudGF0aW9uYWwgY2hpbGRyZW4gb25seVxuICAgICAgICBpZiAoQXJpYVV0aWwuY29udGFpbnNQcmVzZW50YXRpb25hbENoaWxkcmVuT25seShydWxlQ29udGV4dCkgfHwgQXJpYVV0aWwuc2hvdWxkQmVQcmVzZW50YXRpb25hbENoaWxkKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICAvLyBBbiBBUklBIGxpc3QgaXMgbm90IGludGVyYWN0aXZlXG4gICAgICAgIGlmIChBcmlhVXRpbC5oYXNSb2xlKHJ1bGVDb250ZXh0LCB7IFwibGlzdFwiOiB0cnVlLCBcInJvd1wiOiB0cnVlLCBcInJvd2dyb3VwXCI6IHRydWUsIFwidGFibGVcIjogdHJ1ZSwgXCJncmlkXCI6IHRydWUgfSkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTm90IGEgdmFsaWQgbWVzc2FnZSBmb3IgbW9iaWxlIGJlY2F1c2UgYWxsIGVsZW1lbnRzIGFyZSBmb2N1c2FibGUgaW4gaU9TIHdoZW4gVm9pY2VPdmVyIGlzIGVuYWJsZWQuXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJjbGFzc1wiKSAmJiBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJjbGFzc1wiKS5zdWJzdHJpbmcoMCwgMykgPT0gXCJtYmxcIikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvL2lnbm9yZSBkYXRhbGlzdCBlbGVtZW50IGNoZWNrIHNpbmNlIGl0IHdpbGwgYmUgcGFydCBvZiBhIGlucHV0IGVsZW1lbnQgb3IgaGlkZGVuIGJ5IGRlZmF1bHRcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdkYXRhbGlzdCcpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICAvLyBpZ25vcmUgaWYgdGhlIGVsZW1lbnQncyBuYXZpZ2F0aW9uIGlzIGNvbnRyb2xsZWQgYnkgYW5vdGhlciBlbGVtZW50LCBzdWNoIGFzIGNvbWJvYm94XG4gICAgICAgIGlmIChBcmlhVXRpbC5pc05hdmlnYXRpb25Pd25lZE9yQ29udHJvbGxlZChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDsgIFxuXG4gICAgICAgIGxldCByb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGxldCBkb2MgPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50O1xuICAgICAgICBsZXQgaGFzQXR0cmlidXRlID0gQ29tbW9uVXRpbC5oYXNBdHRyaWJ1dGU7XG4gICAgICAgIGxldCByb2xlTmFtZUFyciA9IG5ldyBBcnJheSgpO1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBcIlwiO1xuICAgICAgICBsZXQgaW5TY29wZSA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChBUklBRGVmaW5pdGlvbnMuY29udGFpbmVycy5pbmNsdWRlcyhyb2xlKSkge1xuICAgICAgICAgICAgbGV0IGRpc2FibGVkID0gaGFzQXR0cmlidXRlKHJ1bGVDb250ZXh0LCAnYXJpYS1kaXNhYmxlZCcpID8gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYXJpYS1kaXNhYmxlZFwiKSA6ICcnO1xuICAgICAgICAgICAgaWYgKGRpc2FibGVkICE9ICd0cnVlJyAmJiAhaGFzQXR0cmlidXRlKHJ1bGVDb250ZXh0LCAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JykgJiYgIUNvbW1vblV0aWwuaXNUYWJiYWJsZShydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgICAgICBsZXQgcmVxQ2hpbGRyZW4gPSBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNbcm9sZV0ucmVxQ2hpbGRyZW47XG4gICAgICAgICAgICAgICAgaWYgKHJlcUNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgICAgIGluU2NvcGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHhwID0gXCJkZXNjZW5kYW50OjoqW1wiO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlcUNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB4cCArPSBcIkByb2xlPSdcIiArIHJlcUNoaWxkcmVuW2ldICsgXCInIG9yIFwiO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHhwID0geHAuc3Vic3RyaW5nKDAsIHhwLmxlbmd0aCAtIDQpICsgJ10nO1xuICAgICAgICAgICAgICAgICAgICBsZXQgeHBhdGhSZXN1bHQgPSBkb2MuZXZhbHVhdGUoeHAsIHJ1bGVDb250ZXh0LCBDb21tb25VdGlsLmRlZmF1bHROU1Jlc29sdmVyLCAwIC8qIFhQYXRoUmVzdWx0LkFOWV9UWVBFICovLCBudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHI6IEVsZW1lbnQgPSB4cGF0aFJlc3VsdC5pdGVyYXRlTmV4dCgpIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChyICYmICFwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvbGxvd2luZyBhcmUgdGhlIHN0ZXBzIHRoYXQgYXJlIGV4ZWN1dGVkIGF0IHRoaXMgc3RhZ2UgdG8gZGV0ZXJtaW5lIGlmIHRoZSBub2RlIHNob3VsZCBiZSBjbGFzc2lmaWVkIGFzIGhpZGRlblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3Igbm90LlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gIDEuIE9ubHkgcnVuIGlzTm9kZVZpc2libGUgY2hlY2sgaWYgaGlkZGVuIGNvbnRlbnQgc2hvdWxkIE5PVCBiZSBjaGVja2VkLiBJbiB0aGUgY2FzZSB0aGF0IGhpZGRlbiBjb250ZW50IGlzIHRvLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGJlIHNjYW5uZWQgdGhlbiB3ZSBjYW4ganVzdCBzY2FuIGV2ZXJ5dGhpbmcgYXMgbm9ybWFsLiBJbiB0aGUgY2FzZSB0aGF0IHRoZSBjdXJyZW50IG5vZGUgaXMgaGlkZGVuIHdlIGRvIG5vdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGFkZCBpdCB0byB0aGUgcm9sZVRvRWxlbXMgaGFzaCBhdCBhbGwgb3IgZXZlbiBkbyBhbnkgY2hlY2tpbmcgZm9yIGl0IGF0IGFsbC5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3RlOiBUaGUgaWYgY29uZGl0aW9ucyB1c2VzIHNob3J0LWNpcmN1aXRpbmcgc28gaWYgdGhlIGZpcnN0IGNvbmRpdGlvbiBpcyBub3QgdHJ1ZSBpdCB3aWxsIG5vdCBjaGVjayB0aGUgbmV4dCBvbmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICBzbyBvbiBhbmQgc28gZm9ydGguXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ29tbW9uVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKHIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9IHhwYXRoUmVzdWx0Lml0ZXJhdGVOZXh0KCkgYXMgRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gQ29tbW9uVXRpbC5pc1RhYmJhYmxlKHIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXF1aXJlZCBjaGlsZCBpcyBub3QgZm9jdXNhYmxlIHZpYSB0YWJpbmRleC4gU2VlIGlmIHRoZXJlIGlzIGEgZ3JhbmRjaGlsZCB0aGF0IGlzIGZvY3VzYWJsZSBieSBkZWZhdWx0IG9yIGJ5IHRhYmluZGV4LlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgeHAyID0gXCJkZXNjZW5kYW50OjoqXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHhwYXRoUmVzdWx0MiA9IGRvYy5ldmFsdWF0ZSh4cDIsIHIsIENvbW1vblV0aWwuZGVmYXVsdE5TUmVzb2x2ZXIsIDAgLyogWFBhdGhSZXN1bHQuQU5ZX1RZUEUgKi8sIG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByMiA9IHhwYXRoUmVzdWx0Mi5pdGVyYXRlTmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChyMiAmJiAhcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvbGxvd2luZyBhcmUgdGhlIHN0ZXBzIHRoYXQgYXJlIGV4ZWN1dGVkIGF0IHRoaXMgc3RhZ2UgdG8gZGV0ZXJtaW5lIGlmIHRoZSBub2RlIHNob3VsZCBiZSBjbGFzc2lmaWVkIGFzIGhpZGRlblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvciBub3QuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAxLiBPbmx5IHJ1biBpc05vZGVWaXNpYmxlIGNoZWNrIGlmIGhpZGRlbiBjb250ZW50IHNob3VsZCBOT1QgYmUgY2hlY2tlZC4gSW4gdGhlIGNhc2UgdGhhdCBoaWRkZW4gY29udGVudCBpcyB0byxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGJlIHNjYW5uZWQgdGhlbiB3ZSBjYW4ganVzdCBzY2FuIGV2ZXJ5dGhpbmcgYXMgbm9ybWFsLiBJbiB0aGUgY2FzZSB0aGF0IHRoZSBjdXJyZW50IG5vZGUgaXMgaGlkZGVuIHdlIGRvIG5vdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgYWRkIGl0IHRvIHRoZSByb2xlVG9FbGVtcyBoYXNoIGF0IGFsbCBvciBldmVuIGRvIGFueSBjaGVja2luZyBmb3IgaXQgYXQgYWxsLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3RlOiBUaGUgaWYgY29uZGl0aW9ucyB1c2VzIHNob3J0LWNpcmN1aXRpbmcgc28gaWYgdGhlIGZpcnN0IGNvbmRpdGlvbiBpcyBub3QgdHJ1ZSBpdCB3aWxsIG5vdCBjaGVjayB0aGUgbmV4dCBvbmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgIHNvIG9uIGFuZCBzbyBmb3J0aC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENvbW1vblV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbihyMikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIyID0geHBhdGhSZXN1bHQyLml0ZXJhdGVOZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBDb21tb25VdGlsLmlzVGFiYmFibGUocik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIyID0geHBhdGhSZXN1bHQyLml0ZXJhdGVOZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGVOYW1lQXJyID0gci5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpLnRyaW0oKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZU5hbWUgPSByLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByID0geHBhdGhSZXN1bHQuaXRlcmF0ZU5leHQoKSBhcyBFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVmFyaWFibGUgRGVjbGVyYXRpb25cbiAgICAgICAgbGV0IHJldFRva2VuMSA9IG5ldyBBcnJheSgpO1xuICAgICAgICBsZXQgcmV0VG9rZW4yID0gbmV3IEFycmF5KCk7XG5cbiAgICAgICAgLy8gSW4gdGhlIGNhc2UgdGhlIGFycmF5cy9zdHJpbmdzIGFyZSBlbXB0eSwgdGhhdCBtZWFucyB0aGF0IHRoZXJlIGlzIG5vIHZpb2xhdGlvbiBzbyB3ZSBjYW4gcmVzZXQgaXQgYmFjayB0byBwYXNzZWQsIHRoZSByZWFzb24gZm9yIHRoaXNcbiAgICAgICAgLy8gaXMgdGhhdCB3ZSBhcmUgc2V0dGluZyBwYXNzZWQ9ZmFsc2Ugd2hpbGUgd2UgcGVyZm9ybSBhIGxvb3Agd2hpY2ggY2F1c2VzIHZpb2xhdGlvbiB0byB0cmlnZ2VyIGV2ZW4gaWYgdGhlcmUgaXMgbm8gaXNzdWVzLiBJbnN0ZWFkIG9mXG4gICAgICAgIC8vIHVwZGF0aW5nIHRoZSB3aG9sZSBydWxlIHRvIHN3aXRjaCBmcm9tIHVzaW5nIHBhc3NlZCBpbiB0aGF0IHdheSBzaW1wbHkgZG8gdGhlIGNoZWNrIGF0IHRoaXMgcG9pbnQuXG4gICAgICAgIGlmIChub2RlTmFtZS5sZW5ndGggPiAwICYmIHJvbGVOYW1lQXJyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldFRva2VuMS5wdXNoKG5vZGVOYW1lKTtcbiAgICAgICAgICAgIHJldFRva2VuMi5wdXNoKHJvbGVOYW1lQXJyLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBbcnVsZUNvbnRleHRdLCAncm9sZScsICcnLCBwYXNzZWQgPT0gdHJ1ZSA/IFtdIDogW3JldFRva2VuMSwgcmV0VG9rZW4yXSk7XG4gICAgICAgIGlmICghaW5TY29wZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0gZWxzZSBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9taXNzaW5nX2NoaWxkXCIsIFtyZXRUb2tlbjEudG9TdHJpbmcoKSwgcmV0VG9rZW4yLnRvU3RyaW5nKCldKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfY2hpbGRfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9jaGlsZF92YWxpZFwiLFxuICAgIC8vY29udGV4dDogXCJkb206Kltyb2xlXVwiLFxuICAgIC8vZGVwZW5kZW5jaWVzOiBbXCJScHRfQXJpYV9WYWxpZFJvbGVcIl0sXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIGRlcGVuZGVuY2llczogW1wiYXJpYV9yb2xlX3ZhbGlkXCIsIFwiYXJpYV9kZXNjZW5kYW50X3ZhbGlkXCJdLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9jaGlsZF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NcIjogXCJhcmlhX2NoaWxkX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF9ub19jaGlsZFwiOiBcImFyaWFfY2hpbGRfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX2ludmFsaWRfY2hpbGRcIjogXCJhcmlhX2NoaWxkX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBbiBlbGVtZW50IHdpdGggYW4gQVJJQSByb2xlIG11c3Qgb3duIGEgcmVxdWlyZWQgY2hpbGRcIixcbiAgICAgICAgICAgIFwiUGFzc1wiOiBcIkFuIGVsZW1lbnQgd2l0aCBhbiBBUklBIHJvbGUgb3ducyBhIHJlcXVpcmVkIGNoaWxkXCIsXG4gICAgICAgICAgICBcIkZhaWxfbm9fY2hpbGRcIjogXCJUaGUgZWxlbWVudCB3aXRoIHJvbGUgXFxcInswfVxcXCIgZG9lcyBub3Qgb3duIGFueSBjaGlsZCBlbGVtZW50IHdpdGggYW55IG9mIHRoZSBmb2xsb3dpbmcgcm9sZShzKTogXFxcInsxfVxcXCJcIixcbiAgICAgICAgICAgIFwiRmFpbF9pbnZhbGlkX2NoaWxkXCI6IFwiVGhlIGVsZW1lbnQgd2l0aCByb2xlIFxcXCJ7MH1cXFwiIG93bnMgdGhlIGNoaWxkIGVsZW1lbnQgd2l0aCB0aGUgcm9sZSBcXFwiezF9XFxcIiB0aGF0IGlzIG5vdCBvbmUgb2YgdGhlIGFsbG93ZWQgcm9sZShzKTogXFxcInsyfVxcXCJcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIC8vIFRPRE86IEFDVDogVmVyaWZ5IG1hcHBpbmdcbiAgICBhY3Q6IFtcImJjNGE3NVwiXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIG9yIGRpc2FibGVkXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkgfHwgQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIFxuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IHJlcXVpcmVzIHByZXNlbnRhdGlvbmFsIGNoaWxkcmVuIG9ubHlcbiAgICAgICAgaWYgKEFyaWFVdGlsLmNvbnRhaW5zUHJlc2VudGF0aW9uYWxDaGlsZHJlbk9ubHkocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBcbiAgICAgICAgbGV0IHJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXMocnVsZUNvbnRleHQsIGZhbHNlKTtcbiAgICAgICAgLy8gaWYgZXhwbGljaXQgcm9sZSBkb2Vzbid0IGV4aXN0LCBnZXQgdGhlIGltcGxpY2l0IG9uZVxuICAgICAgICBpZiAoIXJvbGVzIHx8IHJvbGVzLmxlbmd0aCA9PT0gMCkgXG4gICAgICAgICAgICByb2xlcyA9ICBBcmlhVXRpbC5nZXRJbXBsaWNpdFJvbGUocnVsZUNvbnRleHQpO1xuICAgICAgICBcbiAgICAgICAgLy9pZ25vcmUgaWYgdGhlIGVsZW1lbnQgZG9lc24ndCBoYXZlIGFueSBleHBsaWNpdCBvciBpbXBsaWNpdCByb2xlLCBzaG91bGRuJ3QgaGFwcGVuXG4gICAgICAgIGlmICghcm9sZXMgfHwgcm9sZXMubGVuZ3RoID09PSAwKSBcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgLy8gaWdub3JlIGlmIHRoZSBlbGVtZW50IGNvbnRhaW5zIG5vbmUgb3IgcHJlc2VudGF0aW9uIHJvbGVcbiAgICAgICAgbGV0IHByZXNlbnRhdGlvblJvbGVzID0gW1wibm9uZVwiLCBcInByZXNlbnRhdGlvblwiXTtcbiAgICAgICAgY29uc3QgZm91bmQgPSByb2xlcy5zb21lKHI9PiBwcmVzZW50YXRpb25Sb2xlcy5pbmNsdWRlcyhyKSk7XG4gICAgICAgIGlmIChmb3VuZCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gIEZvciBjb21ib2JveCwgd2UgaGF2ZSBnMTE5MyAuLi4gZzExOTkgdG8gY2hlY2sgdGhlIHZhbHVlcyBldGMuXG4gICAgICAgIC8vICBXZSBkb24ndCB3YW50IHRvIHRyaWdnZXIgMTE1MiBhZ2Fpbi4gU28sIHdlIGJ5cGFzcyBpdCBoZXJlLlxuICAgICAgICBpZiAocm9sZXMuaW5jbHVkZXMoXCJjb21ib2JveFwiKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgbGV0IHJlcXVpcmVkQ2hpbGRSb2xlcyA9IEFyaWFVdGlsLmdldFJlcXVpcmVkQ2hpbGRSb2xlcyhydWxlQ29udGV4dCwgdHJ1ZSk7XG4gICAgICAgIC8vIGEgJ2dyb3VwJyByb2xlIGlzIGFsbG93ZWQgYnV0IG5vdCByZXF1aXJlZCBmb3Igc29tZSBlbGVtZW50cyBzbyByZW1vdmUgaXQgaWYgZXhpc3RzXG4gICAgICAgIGlmIChyZXF1aXJlZENoaWxkUm9sZXMuaW5jbHVkZXMoJ2dyb3VwJykpIHtcbiAgICAgICAgICAgIGxldCBpbmRleCA9IHJlcXVpcmVkQ2hpbGRSb2xlcy5pbmRleE9mKCdncm91cCcpO1xuICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpXG4gICAgICAgICAgICAgICAgcmVxdWlyZWRDaGlsZFJvbGVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8qKiAgXG4gICAgICAgICAqIGlnbm9yZSBpZiBhIHJvbGUgZG9lc24ndCByZXF1aXJlIGEgY2hpbGQgd2l0aCBhbnkgc3BlY2lmaWMgcm9sZVxuICAgICAgICAgKiB0aGUgcmV2ZXJzZSBtaWdodCBiZSBub3QgdHJ1ZSAtIHBhcmVudCB3aWxsIGJlIGNoZWNrZWQgaW4gUnB0X0FyaWFfUmVxdWlyZWRQYXJlbnRfTmF0aXZlX0hvc3RfU2VtYXRpY3MgcnVsZVxuICAgICAgICAqL1xuICAgICAgICAgaWYgKHJlcXVpcmVkQ2hpbGRSb2xlcy5sZW5ndGggPT0gMClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIGdldCBhbGwgdGhlIGNoaWxkcmVuIGZyb20gYWNjZXNzaWJpbGl0eSB0cmVlLCBcbiAgICAgICAgLy8gaW5jbHVkaW5nIG9uZXMgd2l0aCBhcmlhLW93bnMgICAgXG4gICAgICAgIGxldCBkaXJlY3RBVENoaWxkcmVuID0gQXJpYVV0aWwuZ2V0RGlyZWN0QVRDaGlsZHJlbihydWxlQ29udGV4dCk7XG4gICAgICAgIFxuICAgICAgICBpZiAoIWRpcmVjdEFUQ2hpbGRyZW4gfHwgZGlyZWN0QVRDaGlsZHJlbi5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgLy8gdGhlIGVsZW1lbnQgd2l0aCBhdCBsZWFzdCBvbmUgcmVxdWlyZWQgcm9sZSBkb3Nlbid0IGNvbnRhaW4gYW55IGFjY2Vzc2libGUgY2hpbGRcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogV2hlbiBhIHdpZGdldCBpcyBtaXNzaW5nIHJlcXVpcmVkIG93bmVkIGVsZW1lbnRzIGR1ZSB0byBzY3JpcHQgZXhlY3V0aW9uIG9yIGxvYWRpbmcsIFxuICAgICAgICAgICAgICogYXV0aG9ycyBNVVNUIG1hcmsgYSBjb250YWluaW5nIGVsZW1lbnQgd2l0aCAnYXJpYS1idXN5JyBlcXVhbCB0byB0cnVlLiBcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgIGxldCBidXN5ID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYXJpYS1idXN5XCIpO1xuICAgICAgICAgICAgIGlmICghYnVzeSB8fCBidXN5ICE9PSAndHJ1ZScpIHtcbiAgICAgICAgICAgICAgICAgbGV0IHJldFRva2VuID0gbmV3IEFycmF5KCk7XG4gICAgICAgICAgICAgICAgIHJldFRva2VuLnB1c2gocm9sZXMuam9pbihcIiwgXCIpKTtcbiAgICAgICAgICAgICAgICAgcmV0VG9rZW4ucHVzaChyZXF1aXJlZENoaWxkUm9sZXMuam9pbihcIiwgXCIpKTtcbiAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF9ub19jaGlsZFwiLCByZXRUb2tlbik7XG4gICAgICAgICAgICAgfSBcbiAgICAgICAgICAgICAvLyBpdCdzICdidXN5JyBsb2FkaW5nLCBpZ25vcmUgaXQgXG4gICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGxldCB2aW9sYXRlRWxlbVJvbGVzID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGZvciAobGV0IGo9MDsgaiA8IGRpcmVjdEFUQ2hpbGRyZW4ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGxldCBjaGlsZFJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXMoZGlyZWN0QVRDaGlsZHJlbltqXSwgZmFsc2UpO1xuICAgICAgICAgICAgLy8gaWYgZXhwbGljaXQgcm9sZSBkb2Vzbid0IGV4aXN0LCBnZXQgdGhlIGltcGxpY2l0IG9uZVxuICAgICAgICAgICAgaWYgKCFjaGlsZFJvbGVzIHx8IGNoaWxkUm9sZXMubGVuZ3RoID09IDApIFxuICAgICAgICAgICAgICAgIGNoaWxkUm9sZXMgPSAgQXJpYVV0aWwuZ2V0SW1wbGljaXRSb2xlKGRpcmVjdEFUQ2hpbGRyZW5bal0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoY2hpbGRSb2xlcyAmJiBjaGlsZFJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgKiB3aGVuIG11bHRpcGxlIHJvbGVzIGFyZSBzcGVjaWZpZWQgYXMgcmVxdWlyZWQgb3duZWQgZWxlbWVudHMgZm9yIGEgcm9sZSwgYXQgbGVhc3Qgb25lIGluc3RhbmNlIG9mIG9uZSByZXF1aXJlZCBvd25lZCBlbGVtZW50IGlzIGV4cGVjdGVkLiBcbiAgICAgICAgICAgICAgICAgKiB0aGUgc3BlY2lmaWNhdGlvbiBkb2VzIG5vdCByZXF1aXJlIGFuIGluc3RhbmNlIG9mIGVhY2ggb2YgdGhlIGxpc3RlZCBvd25lZCByb2xlcy5cbiAgICAgICAgICAgICAgICAgKiB0aGVyZWZvcmUsIHRoZSByZXF1aXJlbWVudCBpcyBtZXQgaWYgaXQgaGFzIGFueSBvbmUgb2YgdGhlIHJlcXVpcmVkIHJvbGVzLlxuICAgICAgICAgICAgICAgICAqLyAgICBcbiAgICAgICAgICAgICAgICBjb25zdCBmb3VuZCA9IGNoaWxkUm9sZXMuc29tZShyPT4gcmVxdWlyZWRDaGlsZFJvbGVzLmluY2x1ZGVzKHIpKTtcbiAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSBcbiAgICAgICAgICAgICAgICAgICAgdmlvbGF0ZUVsZW1Sb2xlcy5wdXNoKGNoaWxkUm9sZXMuam9pbihcIiwgXCIpKTsgXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGlnbm9yZSB0aGUgZWxlbWVudCBzaW5jZSBpdCdzIG5vdCBzZW1hbnRpYywgc2hvdWxkbid0IGhhcHBlbiBcbiAgICAgICAgICAgIH0gICAgIFxuICAgICAgICB9IFxuICAgICAgICBcbiAgICAgICAgaWYgKHZpb2xhdGVFbGVtUm9sZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGV0IHJldFZhbHVlcyA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgdmlvbGF0ZUVsZW1Sb2xlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCByZXRUb2tlbiA9IG5ldyBBcnJheSgpO1xuICAgICAgICAgICAgICAgIHJldFRva2VuLnB1c2gocm9sZXMuam9pbihcIiwgXCIpKTtcbiAgICAgICAgICAgICAgICByZXRUb2tlbi5wdXNoKHZpb2xhdGVFbGVtUm9sZXNbaV0pO1xuICAgICAgICAgICAgICAgIHJldFRva2VuLnB1c2gocmVxdWlyZWRDaGlsZFJvbGVzLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgICAgICAgICAgcmV0VmFsdWVzLnB1c2goUnVsZUZhaWwoXCJGYWlsX2ludmFsaWRfY2hpbGRcIiwgcmV0VG9rZW4pKTtcbiAgICAgICAgICAgIH0gXG4gICAgICAgICAgICByZXR1cm4gcmV0VmFsdWVzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfY29tcGxlbWVudGFyeV9sYWJlbF91bmlxdWU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsX3VuaXF1ZVwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpjb21wbGVtZW50YXJ5XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9NdWx0aXBsZUNvbXBsZW1lbnRhcnlMYW5kbWFya3NfSW1wbGljaXRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImFyaWFfY29tcGxlbWVudGFyeV9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIjogXCJhcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxfdW5pcXVlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlRoZSBlbGVtZW50IHdpdGggXFxcImNvbXBsZW1lbnRhcnlcXFwiIHJvbGUgaGFzIGEgdW5pcXVlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCIsXG4gICAgICAgICAgICBcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwiOiBcIk11bHRpcGxlIGVsZW1lbnRzIHdpdGggXFxcImNvbXBsZW1lbnRhcnlcXFwiIHJvbGUgZG8gbm90IGhhdmUgdW5pcXVlIGxhYmVsc1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVhY2ggZWxlbWVudCB3aXRoIFxcXCJjb21wbGVtZW50YXJ5XFxcIiByb2xlIG11c3QgaGF2ZSBhIHVuaXF1ZSBsYWJlbCB0aGF0IGRlc2NyaWJlcyBpdHMgcHVycG9zZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBkdXBwZWQgPSBBcmlhVXRpbC5pc0xhbmRtYXJrTmFtZVVuaXF1ZShydWxlQ29udGV4dCwgXCJjb21wbGVtZW50YXJ5XCIpOyAgICBcbiAgICAgICAgaWYgKGR1cHBlZCA9PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgaWYgKGR1cHBlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsX3Zpc2libGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsX3Zpc2libGVcIixcbiAgICBjb250ZXh0OiBcImRvbToqW3JvbGVdLCBkb206YXNpZGVcIixcbiAgICBkZXBlbmRlbmNpZXM6IFtcImFyaWFfY29tcGxlbWVudGFyeV9sYWJlbGxlZFwiXSxcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX0NvbXBsZW1lbnRhcnlMYW5kbWFya0xhYmVsX0ltcGxpY2l0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsX3Zpc2libGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxfdmlzaWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsX3Zpc2libGUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJFbGVtZW50IHdpdGggXFxcImNvbXBsZW1lbnRhcnlcXFwiIHJvbGUgZG9lcyBub3QgaGF2ZSBhIHZpc2libGUgbGFiZWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFYWNoIGVsZW1lbnQgd2l0aCBcXFwiY29tcGxlbWVudGFyeVxcXCIgcm9sZSBzaG91bGQgaGF2ZSBhIHZpc2libGUgbGFiZWwgdGhhdCBkZXNjcmliZXMgaXRzIHB1cnBvc2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBpZiAoIUFyaWFVdGlsLmhhc1JvbGVJblNlbWFudGljcyhydWxlQ29udGV4dCwgXCJjb21wbGVtZW50YXJ5XCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwYXNzZWQgPSBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KFxuICAgICAgICAgICAgcnVsZUNvbnRleHQsXG4gICAgICAgICAgICBcImFyaWEtbGFiZWxsZWRieVwiXG4gICAgICAgICk7XG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KHBhc3NlZCwgW3J1bGVDb250ZXh0XSwgJ3JvbGUnLCAnJywgW10pO1xuICAgICAgICBpZiAocGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBBY2NOYW1lVXRpbCB9IGZyb20gXCIuLi91dGlsL0FjY05hbWVVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfY29tcGxlbWVudGFyeV9sYWJlbGxlZDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxsZWRcIixcbiAgICBjb250ZXh0OiBcImFyaWE6Y29tcGxlbWVudGFyeVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfQ29tcGxlbWVudGFyeVJlcXVpcmVkTGFiZWxfSW1wbGljaXRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfY29tcGxlbWVudGFyeV9sYWJlbGxlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkVsZW1lbnQgd2l0aCBcXFwiY29tcGxlbWVudGFyeVxcXCIgcm9sZSBkb2VzIG5vdCBoYXZlIGEgbGFiZWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFYWNoIGVsZW1lbnQgd2l0aCBcXFwiY29tcGxlbWVudGFyeVxcXCIgcm9sZSBtdXN0IGhhdmUgYSBsYWJlbCB0aGF0IGRlc2NyaWJlcyBpdHMgcHVycG9zZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IHBhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWUocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAocGFpcikge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01XYWxrZXJcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5pbXBvcnQgeyBUYWJsZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9UYWJsZVV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfY29udGVudF9pbl9sYW5kbWFyazogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2NvbnRlbnRfaW5fbGFuZG1hcmtcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9PcnBoYW5lZENvbnRlbnRfTmF0aXZlX0hvc3RfU2VtYXRpY3NcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX2NvbnRlbnRfaW5fbGFuZG1hcmsuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2NvbnRlbnRfaW5fbGFuZG1hcmsuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfY29udGVudF9pbl9sYW5kbWFyay5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkNvbnRlbnQgaXMgbm90IHdpdGhpbiBhIGxhbmRtYXJrIGVsZW1lbnRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBbGwgY29udGVudCBtdXN0IHJlc2lkZSB3aXRoaW4gYW4gZWxlbWVudCB3aXRoIGEgbGFuZG1hcmsgcm9sZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaWRcIjogW1wiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgbGV0IHBhcmFtcyA9IENhY2hlVXRpbC5nZXRDYWNoZShjb250ZXh0LmRvbS5ub2RlLm93bmVyRG9jdW1lbnQsIFwiYXJpYV9jb250ZW50X2luX2xhbmRtYXJrXCIsIG51bGwpO1xuICAgICAgICBpZiAoIXBhcmFtcykge1xuICAgICAgICAgICAgcGFyYW1zID0ge1xuICAgICAgICAgICAgICAgIGxhbmRtYXJrczoge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogW1wiYmFubmVyXCIsIFwiY29tcGxlbWVudGFyeVwiLCBcImNvbnRlbnRpbmZvXCIsIFwiZm9ybVwiLCBcIm1haW5cIiwgXCJuYXZpZ2F0aW9uXCIsIFwicmVnaW9uXCIsIFwic2VhcmNoXCJdLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImFycmF5XCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHBvc3NpYmxlT3JwaGFuZWRXaWRnZXRzOiB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBbXCJidXR0b25cIiwgXCJjb21ib2JveFwiLCBcImNoZWNrYm94XCIsIFwiZ3JpZFwiLCBcImhlYWRpbmdcIiwgXCJsaW5rXCIsIFwibGlzdFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJsaXN0Ym94XCIsIFwibWVudVwiLCBcIm1lbnViYXJcIiwgXCJwcm9ncmVzc2JhclwiLCBcInJhZGlvXCIsIFwidGFibGlzdFwiLCBcInRleHRib3hcIiwgXCJ0b29sYmFyXCIsIFwidHJlZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJ0cmVlZ3JpZFwiXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcG9zc2libGVPcnBoYW5lZEVsZW1lbnRzOiB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBbXCJwXCIsIFwidGFibGVcIiwgXCJpbnB1dFwiLCBcInRleHRhcmVhXCIsIFwic2VsZWN0XCIsIFwiYnV0dG9uXCIsIFwiYVwiLCBcIm9sXCIsIFwidWxcIiwgXCJkbFwiLCBcImgxXCIsIFwiaDJcIiwgXCJoM1wiLCBcImg0XCIsIFwiaDVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiaDZcIiwgXCJlbWJlZFwiLCBcIm9iamVjdFwiLCBcImFyZWFcIlxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImFycmF5XCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG5vTGFuZG1hcmtlZFJvbGVzOiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZXNlIHJvbGVzIGRvbid0IHJlcXVpcmUgbGFuZG1hcmtzXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBbXCJhbGVydFwiLCBcImFsZXJ0ZGlhbG9nXCIsIFwiZGlhbG9nXCIsIFwidG9vbHRpcFwiXSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJhcnJheVwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBtYXBMYW5kbWFya3M6IHt9LFxuICAgICAgICAgICAgICAgIG1hcFBvc3NpYmxlT3JwaGFuZWRXaWRnZXRzOiB7fSxcbiAgICAgICAgICAgICAgICBtYXBQb3NzaWJsZU9ycGhhbmVkRWxlbWVudHM6IHt9LFxuICAgICAgICAgICAgICAgIG1hcE5vTGFuZG1hcmtlZFJvbGVzOiB7fVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQ29udmVydCBhcnJheXMgdG8gbWFwc1xuICAgICAgICAgICAgcGFyYW1zLm1hcExhbmRtYXJrcyA9IHt9O1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJhbXMubGFuZG1hcmtzLnZhbHVlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgcGFyYW1zLm1hcExhbmRtYXJrc1twYXJhbXMubGFuZG1hcmtzLnZhbHVlW2ldXSA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHBhcmFtcy5tYXBQb3NzaWJsZU9ycGhhbmVkV2lkZ2V0cyA9IHt9XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcmFtcy5wb3NzaWJsZU9ycGhhbmVkV2lkZ2V0cy52YWx1ZS5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIHBhcmFtcy5tYXBQb3NzaWJsZU9ycGhhbmVkV2lkZ2V0c1twYXJhbXMucG9zc2libGVPcnBoYW5lZFdpZGdldHMudmFsdWVbaV1dID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcGFyYW1zLm1hcFBvc3NpYmxlT3JwaGFuZWRFbGVtZW50cyA9IHt9XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcmFtcy5wb3NzaWJsZU9ycGhhbmVkRWxlbWVudHMudmFsdWUubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBwYXJhbXMubWFwUG9zc2libGVPcnBoYW5lZEVsZW1lbnRzW3BhcmFtcy5wb3NzaWJsZU9ycGhhbmVkRWxlbWVudHMudmFsdWVbaV1dID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcGFyYW1zLm1hcE5vTGFuZG1hcmtlZFJvbGVzID0ge31cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFyYW1zLm5vTGFuZG1hcmtlZFJvbGVzLnZhbHVlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgcGFyYW1zLm1hcE5vTGFuZG1hcmtlZFJvbGVzW3BhcmFtcy5ub0xhbmRtYXJrZWRSb2xlcy52YWx1ZVtpXV0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoY29udGV4dC5kb20ubm9kZS5vd25lckRvY3VtZW50LCBcImFyaWFfY29udGVudF9pbl9sYW5kbWFya1wiLCBwYXJhbXMpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKHJ1bGVDb250ZXh0KSB8fCAgLy8gYXZvaWQgZGlhZ25vc2luZyBnMTE1NyBmb3Igbm9uLXZpc2libGUgbm9kZXNcbiAgICAgICAgICAgIChWaXNVdGlsLmhpZGRlbkJ5RGVmYXVsdEVsZW1lbnRzICE9IG51bGwgJiZcbiAgICAgICAgICAgICAgICBWaXNVdGlsLmhpZGRlbkJ5RGVmYXVsdEVsZW1lbnRzICE9IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgIFZpc1V0aWwuaGlkZGVuQnlEZWZhdWx0RWxlbWVudHMuaW5kZXhPZihub2RlTmFtZSkgPiAtMSkpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBlbGVtc1dpdGhvdXRDb250ZW50ID0gW1wiYXJlYVwiLCBcImlucHV0XCIsIFwiZW1iZWRcIiwgXCJidXR0b25cIiwgXCJ0ZXh0YXJlYVwiLCBcInNlbGVjdFwiXTtcbiAgICAgICAgaWYgKCFDb21tb25VdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbihydWxlQ29udGV4dCkgJiYgLy9vbmx5IHRyaWdnZXIgdGhlIHJ1bGUgb24gZWxlbWVudHMgdGhhdCBoYXZlIGNvbnRlbnRcbiAgICAgICAgICAgIGVsZW1zV2l0aG91dENvbnRlbnQuaW5kZXhPZihub2RlTmFtZSkgPT09IC0xKSB7IC8vIGEgZmV3IGVsZW1zIHdpaG91dCBjb250ZW50IHNob3VsZCBub3QgYmUgc2tpcHBlZFxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2hvcnQgY2lyY3VpdCBmb3IgbGF5b3V0IHRhYmxlc1xuICAgICAgICBpZiAobm9kZU5hbWUgPT0gXCJ0YWJsZVwiICYmIFRhYmxlVXRpbC5pc0xheW91dFRhYmxlKHJ1bGVDb250ZXh0KSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBpZiBpdCBpcyBhIHBvc3NpYmxlIG9ycGhhblxuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgbGV0IGlzUG9zc2libGVPcnBoYW5lZFdpZGdldCA9IEFyaWFVdGlsLmhhc1JvbGUocnVsZUNvbnRleHQsIHBhcmFtcy5tYXBQb3NzaWJsZU9ycGhhbmVkV2lkZ2V0cywgdHJ1ZSk7XG4gICAgICAgIC8vZXhjbHVkZSA8bGluayByZWw9XCJzdHlsZXNoZWV0XCIgaHJlZj1cInh5ei5jc3NcIj4gaW4gdGhlIDxoZWFkPiBhbmQgPGJvZHk+KCM2MDgpXG4gICAgICAgIC8vaGF2aW5nIGxpbmsgaW4gdGhlIGhlYWQgY291bGQgY2F1c2UgbG90IG9mIHZpb2xhaW9ucyAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gJ2xpbmsnKSB7XG4gICAgICAgICAgICBpc1Bvc3NpYmxlT3JwaGFuZWRXaWRnZXQgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBpc1Bvc3NpYmxlT3JwaGFuZWRFbGVtZW50ID0gbm9kZU5hbWUgaW4gcGFyYW1zLm1hcFBvc3NpYmxlT3JwaGFuZWRFbGVtZW50cztcbiAgICAgICAgaWYgKGlzUG9zc2libGVPcnBoYW5lZFdpZGdldCB8fCBpc1Bvc3NpYmxlT3JwaGFuZWRFbGVtZW50KSB7XG4gICAgICAgICAgICAvLyBTZWUgaWYgYW5jZXN0b3IgaGFzIGxhbmRtYXJrIHJvbGVzIG9yIGltcGxpY2l0IGxhbmQgbWFyayByb2xlc1xuICAgICAgICAgICAgbGV0IHBhcmVudFJvbGVzID0gY29udGV4dEhpZXJhcmNoaWVzW1wiYXJpYVwiXS5tYXAoaW5mbyA9PiBpbmZvLnJvbGUpO1xuICAgICAgICAgICAgcGFzc2VkID0gcGFyZW50Um9sZXMuZmlsdGVyKHJvbGUgPT4gcm9sZSBpbiBwYXJhbXMubWFwTGFuZG1hcmtzKS5sZW5ndGggPiAwXG4gICAgICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgIC8vIERvbid0IGZhaWwgZWxlbWVudHMgd2hlbiBhIHBhcmVudCBvciBzaWJsaW5nIGhhcyBmYWlsZWQgLSBjYXVzZXMgdG9vIG1hbnkgbWVzc2FnZXMuXG4gICAgICAgICAgICAgICAgbGV0IHdhbGtFbGVtZW50ID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgICAgIHdoaWxlICghcGFzc2VkICYmIHdhbGtFbGVtZW50ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gQ2FjaGVVdGlsLmdldENhY2hlKHdhbGtFbGVtZW50LCBcIlJwdF9BcmlhX09ycGhhbmVkQ29udGVudFwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHdhbGtFbGVtZW50ID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQod2Fsa0VsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB3YWxrRWxlbWVudCA9IHJ1bGVDb250ZXh0Lm5leHRFbGVtZW50U2libGluZztcbiAgICAgICAgICAgICAgICB3aGlsZSAoIXBhc3NlZCAmJiB3YWxrRWxlbWVudCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IENhY2hlVXRpbC5nZXRDYWNoZSh3YWxrRWxlbWVudCwgXCJScHRfQXJpYV9PcnBoYW5lZENvbnRlbnRcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB3YWxrRWxlbWVudCA9IHdhbGtFbGVtZW50Lm5leHRFbGVtZW50U2libGluZztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgd2Fsa0VsZW1lbnQgPSBydWxlQ29udGV4dC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIHdoaWxlICghcGFzc2VkICYmIHdhbGtFbGVtZW50ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gQ2FjaGVVdGlsLmdldENhY2hlKHdhbGtFbGVtZW50LCBcIlJwdF9BcmlhX09ycGhhbmVkQ29udGVudFwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHdhbGtFbGVtZW50ID0gd2Fsa0VsZW1lbnQucHJldmlvdXNFbGVtZW50U2libGluZztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKHJ1bGVDb250ZXh0LCBcIlJwdF9BcmlhX09ycGhhbmVkQ29udGVudFwiLCB0cnVlKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCB0cmlnZ2VyIHJ1bGUgaWYgZWxlbWVudCBpcyBhIHN0YW5kLWFsb25lIHdpZGdldFxuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUocnVsZUNvbnRleHQsIFwiUnB0X0FyaWFfT3JwaGFuZWRDb250ZW50X05vVHJpZ2dlclwiLCBmYWxzZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIEFyaWFVdGlsLmhhc1JvbGUocnVsZUNvbnRleHQsIHBhcmFtcy5tYXBOb0xhbmRtYXJrZWRSb2xlcywgdHJ1ZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUocnVsZUNvbnRleHQsIHBhcmFtcy5tYXBOb0xhbmRtYXJrZWRSb2xlcywgdHJ1ZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3NlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKHJ1bGVDb250ZXh0LCBcIlJwdF9BcmlhX09ycGhhbmVkQ29udGVudF9Ob1RyaWdnZXJcIiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBbcnVsZUNvbnRleHRdLCAnJywgJycsIFtdKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX2NvbnRlbnRpbmZvX2xhYmVsX3VuaXF1ZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2NvbnRlbnRpbmZvX2xhYmVsX3VuaXF1ZVwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpjb250ZW50aW5mb1wiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfTXVsdGlwbGVDb250ZW50aW5mb0xhbmRtYXJrc19JbXBsaWNpdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiYXJpYV9jb250ZW50aW5mb19sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIjogXCJhcmlhX2NvbnRlbnRpbmZvX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9jb250ZW50aW5mb19sYWJlbF91bmlxdWUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiVGhlIGVsZW1lbnQgd2l0aCBcXFwiY29udGVudGluZm9cXFwiIHJvbGUgaGFzIGEgdW5pcXVlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCIsXG4gICAgICAgICAgICBcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwiOiBcIk11bHRpcGxlIGVsZW1lbnRzIHdpdGggXFxcImNvbnRlbnRpbmZvXFxcIiByb2xlIGRvIG5vdCBoYXZlIHVuaXF1ZSBsYWJlbHNcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFYWNoIGVsZW1lbnQgd2l0aCBcXFwiY29udGVudGluZm9cXFwiIHJvbGUgbXVzdCBoYXZlIGEgdW5pcXVlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IGR1cHBlZCA9IEFyaWFVdGlsLmlzTGFuZG1hcmtOYW1lVW5pcXVlKHJ1bGVDb250ZXh0LCBcImNvbnRlbnRpbmZvXCIsIHRydWUpOyAgICBcbiAgICAgICAgaWYgKGR1cHBlZCA9PSBudWxsKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBpZiAoZHVwcGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX2NvbnRlbnRpbmZvX21pc3VzZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2NvbnRlbnRpbmZvX21pc3VzZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbcm9sZV0sIGRvbTpmb290ZXIsIGRvbTphZGRyZXNzXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9Db250ZW50aW5mb1dpdGhOb01haW5fSW1wbGljaXRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9jb250ZW50aW5mb19taXN1c2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2NvbnRlbnRpbmZvX21pc3VzZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9jb250ZW50aW5mb19taXN1c2UuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJFbGVtZW50IHdpdGggXFxcImNvbnRlbnRpbmZvXFxcIiByb2xlIGlzIHByZXNlbnQgd2l0aG91dCBhbiBlbGVtZW50IHdpdGggXFxcIm1haW5cXFwiIHJvbGVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFYWNoIGVsZW1lbnQgd2l0aCBcXFwiY29udGVudGluZm9cXFwiIHJvbGUgaXMgb25seSBwZXJtaXR0ZWQgd2l0aCBhbiBlbGVtZW50IHdpdGggXFxcIm1haW5cXFwiIHJvbGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcblxuICAgICAgICAvL2NvbnNpZGVyIGltcGxpY2l0IHJvbGVcbiAgICAgICAgaWYgKCFBcmlhVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MocnVsZUNvbnRleHQsIFwiY29udGVudGluZm9cIikpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29uc2lkZXIgdGhlIENoZWNrIEhpZGRlbiBDb250ZW50IHNldHRpbmcgdGhhdCBpcyBzZXQgYnkgdGhlIHJ1bGVzXG4gICAgICAgIGxldCBwYXNzZWQgPVxuICAgICAgICAgICAgQ29tbW9uVXRpbC5nZXRFbGVtZW50c0J5Um9sZUhpZGRlbihcbiAgICAgICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgICAgIFwibWFpblwiLFxuICAgICAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgdHJ1ZVxuICAgICAgICAgICAgKS5sZW5ndGggPiAwO1xuXG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KHBhc3NlZCwgW3J1bGVDb250ZXh0XSwgJ3JvbGUnLCAnJywgW10pO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfY29udGVudGluZm9fc2luZ2xlOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfY29udGVudGluZm9fc2luZ2xlXCIsXG4gICAgY29udGV4dDogXCJkb206Kltyb2xlXSwgZG9tOmZvb3RlciwgZG9tOmFkZHJlc3NcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX011bHRpcGxlQ29udGVudGluZm9JblNpYmxpbmdTZXRfSW1wbGljaXRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX2NvbnRlbnRpbmZvX3NpbmdsZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfY29udGVudGluZm9fc2luZ2xlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2NvbnRlbnRpbmZvX3NpbmdsZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIk11bHRpcGxlIGVsZW1lbnRzIHdpdGggXFxcImNvbnRlbnRpbmZvXFxcIiByb2xlIGZvdW5kIG9uIHRoZSBwYWdlXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQSBwYWdlLCBkb2N1bWVudCwgb3IgYXBwbGljYXRpb24gc2hvdWxkIG9ubHkgaGF2ZSBvbmUgZWxlbWVudCB3aXRoIFxcXCJjb250ZW50aW5mb1xcXCIgcm9sZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcblxuICAgICAgICAvL2ZpbmQgb3V0IGlmIDxmb290ZXI+IGVsZW1lbnQgaGFzIHNpYmxpbmdzIGFzIDxmb290ZXI+IGhhcyBpbXBsaWNpdCBjb250ZW50aW5mbyByb2xlXG4gICAgICAgIGlmICghQXJpYVV0aWwuaGFzUm9sZUluU2VtYW50aWNzKHJ1bGVDb250ZXh0LCBcImNvbnRlbnRpbmZvXCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwYXNzZWQgPSAhQXJpYVV0aWwuZ2V0U2libGluZ1dpdGhSb2xlSGlkZGVuKFxuICAgICAgICAgICAgcnVsZUNvbnRleHQsXG4gICAgICAgICAgICBcImNvbnRlbnRpbmZvXCIsXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgdHJ1ZVxuICAgICAgICApO1xuXG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KHBhc3NlZCwgW3J1bGVDb250ZXh0XSwgJ3JvbGUnLCAnJywgW10pO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX2Rlc2NlbmRhbnRfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9kZXNjZW5kYW50X3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIGRlcGVuZGVuY2llczogW1wiYXJpYV9yb2xlX3ZhbGlkXCJdLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9kZXNjZW5kYW50X3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImFyaWFfZGVzY2VuZGFudF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9jaGlsZF9pbXBsaWNpdF9yb2xlXCI6IFwiYXJpYV9kZXNjZW5kYW50X3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwicmVjb21tZW5kYXRpb25fbm9faW1wYWN0X3JvbGVcIjogXCJhcmlhX2Rlc2NlbmRhbnRfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2NoaWxkX2V4cGxpY2l0X3JvbGVcIjogXCJhcmlhX2Rlc2NlbmRhbnRfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIkJyb3dzZXJzIGlnbm9yZSB0aGUgZXhwbGljaXQgYW5kIGltcGxpY2l0IEFSSUEgcm9sZXMgb2YgdGhlIGRlc2NlbmRhbnRzIG9mIGNlcnRhaW4gZWxlbWVudHNcIixcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlRoZSBlbGVtZW50IGNvbnRhaW5zIHZhbGlkIGRlc2NlbmRhbnRzXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9jaGlsZF9pbXBsaWNpdF9yb2xlXCI6IFwiVGhlIGVsZW1lbnQgd2l0aCByb2xlIFxcXCJ7MH1cXFwiIGNvbnRhaW5zIGRlc2NlbmRhbnRzIHdpdGggaW1wbGljaXQgcm9sZXMgXFxcInsxfVxcXCIgd2hpY2ggYXJlIGlnbm9yZWQgYnkgYnJvd3NlcnNcIixcbiAgICAgICAgICAgIFwicmVjb21tZW5kYXRpb25fbm9faW1wYWN0X3JvbGVcIjogXCJUaGUgZWxlbWVudCB3aXRoIHJvbGUgXFxcInswfVxcXCIgY29udGFpbnMgZGVzY2VuZGFudHMgd2l0aCByb2xlcyBcXFwiezF9XFxcIiB3aGljaCBhcmUgaWdub3JlZCBieSBicm93c2Vyc1wiLFxuICAgICAgICAgICAgXCJmYWlsX2NoaWxkX2V4cGxpY2l0X3JvbGVcIjogXCJUaGUgZWxlbWVudCB3aXRoIHJvbGUgXFxcInswfVxcXCIgY29udGFpbnMgZGVzY2VuZGFudHMgd2l0aCByb2xlcyBcXFwiezF9XFxcIiB3aGljaCBhcmUgaWdub3JlZCBieSBicm93c2Vyc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORSxcbiAgICAgICAgcmVhc29uQ29kZXM6IFtcInBhc3NcIiwgXCJwb3RlbnRpYWxfY2hpbGRfaW1wbGljaXRfcm9sZVwiLCBcImZhaWxfY2hpbGRfZXhwbGljaXRfcm9sZVwiXVxuICAgIH0se1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FLFxuICAgICAgICByZWFzb25Db2RlczogW1wicmVjb21tZW5kYXRpb25fbm9faW1wYWN0X3JvbGVcIl1cbiAgICB9XSxcbiAgICAvLyBUT0RPOiBBQ1Q6IFZlcmlmeSBtYXBwaW5nXG4gICAgYWN0OiBbXCIzMDduNXpcIl0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIFxuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IGlzIGhpZGRlbiBvciBkaXNhYmxlZFxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpIHx8IENvbW1vblV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBcbiAgICAgICAgLy9za2lwIHRoZSBjaGVjayBpZiB0aGUgZWxlbWVudCBkb2Vzbid0IHJlcXVpcmUgcHJlc2VudGF0aW9uYWwgY2hpbGRyZW4gb25seVxuICAgICAgICBpZiAoIUFyaWFVdGlsLmNvbnRhaW5zUHJlc2VudGF0aW9uYWxDaGlsZHJlbk9ubHkocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBcbiAgICAgICAgbGV0IHJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXMocnVsZUNvbnRleHQsIGZhbHNlKTtcbiAgICAgICAgLy8gaWYgZXhwbGljaXQgcm9sZSBkb2Vzbid0IGV4aXN0LCBnZXQgdGhlIGltcGxpY2l0IG9uZVxuICAgICAgICBpZiAoIXJvbGVzIHx8IHJvbGVzLmxlbmd0aCA9PT0gMCkgXG4gICAgICAgICAgICByb2xlcyA9ICBBcmlhVXRpbC5nZXRJbXBsaWNpdFJvbGUocnVsZUNvbnRleHQpO1xuICAgICAgICBcbiAgICAgICAgLy9pZ25vcmUgaWYgdGhlIGVsZW1lbnQgZG9lc24ndCBoYXZlIGFueSBleHBsaWNpdCBvciBpbXBsaWNpdCByb2xlLCBzaG91bGRuJ3QgaGFwcGVuXG4gICAgICAgIGlmICghcm9sZXMgfHwgcm9sZXMubGVuZ3RoID09PSAwKSBcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIGxldCB0YWdOYW1lID0gcnVsZUNvbnRleHQudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAvLyBnZXQgYWxsIHRoZSBjaGlsZHJlbiBmcm9tIGFjY2Vzc2liaWxpdHkgdHJlZSwgXG4gICAgICAgIC8vIGluY2x1ZGluZyBvbmVzIHdpdGggYXJpYS1vd25zICAgIFxuICAgICAgICBsZXQgZGlyZWN0QVRDaGlsZHJlbiA9IEFyaWFVdGlsLmdldERpcmVjdEFUQ2hpbGRyZW4ocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoZGlyZWN0QVRDaGlsZHJlbiAmJiBkaXJlY3RBVENoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vIHRoZSBlbGVtZW50IHdpdGggYXQgbGVhc3Qgb25lIG5vbi1wcmVzZW50YXRpb25hbCBjaGlsZHJlblxuICAgICAgICAgICAgbGV0IGV4cGxpY2l0Um9sZXMgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgICAgIGxldCBpbXBsaWNpdFJvbGVzID0gbmV3IEFycmF5KCk7XG4gICAgICAgICAgICBsZXQgbm9JbXBhY3RSb2xlcyA9IG5ldyBBcnJheSgpO1xuICAgICAgICAgICAgZm9yIChsZXQgaj0wOyBqIDwgZGlyZWN0QVRDaGlsZHJlbi5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIC8vIGlnbm9yZSA8aW1nPiBhbmQgPHN2Zz5cbiAgICAgICAgICAgICAgICBjb25zdCB0YWcgPSBkaXJlY3RBVENoaWxkcmVuW2pdLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgaWYgKHRhZyA9PT0gJ2ltZycgfHwgdGFnID09PSAnc3ZnJykgY29udGludWU7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gZ2V0IGV4cGxpY2l0IHJvbGUgaWYgZXhpc3RzXG4gICAgICAgICAgICAgICAgbGV0IGNoaWxkUm9sZXMgPSBBcmlhVXRpbC5nZXRSb2xlcyhkaXJlY3RBVENoaWxkcmVuW2pdLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkUm9sZXMgJiYgY2hpbGRSb2xlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHNlcGFyYXRlIGNhc2UgZm9yIHJvbGU9XCJjb2RlXCJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkUm9sZXMuaW5jbHVkZXMoXCJjb2RlXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBub0ltcGFjdFJvbGVzLnB1c2goY2hpbGRSb2xlcy5maWx0ZXIocm9sZSA9PiByb2xlID09PSBcImNvZGVcIikuam9pbihcIiwgXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBleHBsaWNpdFJvbGVzLnB1c2goY2hpbGRSb2xlcy5maWx0ZXIocm9sZSA9PiByb2xlICE9PSBcImNvZGVcIikuam9pbihcIiwgXCIpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBnZXQgaW1wbGljaXQgcm9sZSBpZiBleGlzdHNcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRSb2xlcyA9ICBBcmlhVXRpbC5nZXRJbXBsaWNpdFJvbGUoZGlyZWN0QVRDaGlsZHJlbltqXSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIHNlcGFyYXRlIGNhc2UgZm9yIHJvbGU9XCJjb2RlXCJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkUm9sZXMuaW5jbHVkZXMoXCJjb2RlXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBub0ltcGFjdFJvbGVzLnB1c2goY2hpbGRSb2xlcy5maWx0ZXIocm9sZSA9PiByb2xlID09PSBcImNvZGVcIikuam9pbihcIiwgXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGRSb2xlcyAmJiBjaGlsZFJvbGVzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGVzLnB1c2goY2hpbGRSb2xlcy5maWx0ZXIocm9sZSA9PiByb2xlICE9PSBcImNvZGVcIikuam9pbihcIiwgXCIpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChleHBsaWNpdFJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgcmV0VmFsdWVzID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgZXhwbGljaXRSb2xlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmV0VG9rZW4gPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0VG9rZW4ucHVzaChyb2xlcy5qb2luKFwiLCBcIikpO1xuICAgICAgICAgICAgICAgICAgICByZXRUb2tlbi5wdXNoKGV4cGxpY2l0Um9sZXNbaV0pO1xuICAgICAgICAgICAgICAgICAgICByZXRWYWx1ZXMucHVzaChSdWxlRmFpbChcImZhaWxfY2hpbGRfZXhwbGljaXRfcm9sZVwiLCByZXRUb2tlbikpO1xuICAgICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbHVlcztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGltcGxpY2l0Um9sZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCByZXRWYWx1ZXMgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBpbXBsaWNpdFJvbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZXRUb2tlbiA9IG5ldyBBcnJheSgpO1xuICAgICAgICAgICAgICAgICAgICByZXRUb2tlbi5wdXNoKHJvbGVzLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgICAgICAgICAgICAgIHJldFRva2VuLnB1c2goaW1wbGljaXRSb2xlc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbHVlcy5wdXNoKFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfY2hpbGRfaW1wbGljaXRfcm9sZVwiLCByZXRUb2tlbikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmV0VmFsdWVzO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobm9JbXBhY3RSb2xlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJldFZhbHVlcyA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGk9MDsgaSA8IG5vSW1wYWN0Um9sZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJldFRva2VuID0gbmV3IEFycmF5KCk7XG4gICAgICAgICAgICAgICAgICAgIHJldFRva2VuLnB1c2gocm9sZXMuam9pbihcIiwgXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0VG9rZW4ucHVzaChub0ltcGFjdFJvbGVzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsdWVzLnB1c2goUnVsZVBvdGVudGlhbChcInJlY29tbWVuZGF0aW9uX25vX2ltcGFjdF9yb2xlXCIsIHJldFRva2VuKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXRWYWx1ZXM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTsgICAgICAgXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfZG9jdW1lbnRfbGFiZWxfdW5pcXVlOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfZG9jdW1lbnRfbGFiZWxfdW5pcXVlXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmRvY3VtZW50XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9NdWx0aXBsZURvY3VtZW50Um9sZXNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImFyaWFfZG9jdW1lbnRfbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCI6IFwiYXJpYV9kb2N1bWVudF9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfZG9jdW1lbnRfbGFiZWxfdW5pcXVlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlRoZSBlbGVtZW50IHdpdGggXFxcImRvY3VtZW50XFxcIiByb2xlIGhhcyBhIHVuaXF1ZSBsYWJlbCB0aGF0IGRlc2NyaWJlcyBpdHMgcHVycG9zZVwiLFxuICAgICAgICAgICAgXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIjogXCJNdWx0aXBsZSBlbGVtZW50cyB3aXRoIFxcXCJkb2N1bWVudFxcXCIgcm9sZXMgZG8gbm90IGhhdmUgdW5pcXVlIGxhYmVsc1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVhY2ggZWxlbWVudCB3aXRoIFxcXCJkb2N1bWVudFxcXCIgcm9sZSBtdXN0IGhhdmUgYSB1bmlxdWUgbGFiZWwgdGhhdCBkZXNjcmliZXMgaXRzIHB1cnBvc2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuNC4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgY29uc3QgZHVwcGVkID0gQXJpYVV0aWwuaXNMYW5kbWFya05hbWVVbmlxdWUocnVsZUNvbnRleHQsIFwiZG9jdW1lbnRcIiwgdHJ1ZSk7ICAgIFxuICAgICAgICBpZiAoZHVwcGVkID09IG51bGwpIHJldHVybiBudWxsOyBcbiAgICAgICAgaWYgKGR1cHBlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX2V2ZW50aGFuZGxlcl9yb2xlX3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfZXZlbnRoYW5kbGVyX3JvbGVfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqW29uY2xpY2tdLGRvbToqW29uYmx1cl0sIGRvbToqW29uZGJsY2xpY2tdLCBkb206KltvbmZvY3VzXSwgZG9tOipbb25rZXlkb3duXSxkb206KltvbmtleXByZXNzXSwgZG9tOipbb25rZXl1cF0sIGRvbToqW29ubW91c2Vkb3duXSwgZG9tOipbb25tb3VzZXVwXSwgZG9tOipbb25tb3VzZW1vdmVdLCBkb206Kltvbm1vdXNlb3V0XSwgZG9tOipbb25tb3VzZW92ZXJdLCBkb206KltvbnJlc2l6ZV0sIGRvbToqW29uY2hhbmdlXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfRXZlbnRIYW5kbGVyTWlzc2luZ1JvbGVfTmF0aXZlX0hvc3RfU2VtYXRpY3NcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX2V2ZW50aGFuZGxlcl9yb2xlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV9ldmVudGhhbmRsZXJfcm9sZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9ldmVudGhhbmRsZXJfcm9sZV92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlRoZSA8ezB9PiBlbGVtZW50IHdpdGggJ3sxfScgZG9lcyBub3QgaGF2ZSBhIHZhbGlkIEFSSUEgcm9sZSBzcGVjaWZpZWRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFbGVtZW50cyB3aXRoIGV2ZW50IGhhbmRsZXJzIG11c3QgaGF2ZSBhIHZhbGlkIEFSSUEgcm9sZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy8gRG9uJ3QgdHJpZ2dlciB0aGlzIGZvciBTVkcgZWxlbWVudCBmb3Igbm93IHVudGlsIGEgZGV0ZXJtaW5hdGlvbiBpcyBtYWRlIChieSBSaWNoKVxuICAgICAgICAvLyB0byBzdXBwb3J0IFNWRyBhdCBhIHBvaW50IHdoZW4gdGhlIFNWRyBhMTF5IHNwZWMgaXMgcmVhZHkuXG4gICAgICAgIGlmIChDb21tb25VdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBcInN2Z1wiKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvL3RoaXMgcnVsZSBpcyBwYXNzZWQgaWYgYSBlbGVtZW50IGhhcyBhdHRyaWJ1dCByb2xlIFxuICAgICAgICAvL2Fsc28sIHBhc3NlZCBvZiBlbGVtZW50IGhhcyBhbnkgaW1wbGljaXQgcm9sZXMuIFxuICAgICAgICBpZiAoQXJpYVV0aWwuaGFzQW55Um9sZShydWxlQ29udGV4dCwgdHJ1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vcGFzcyBpZiB0aGlzIGVsZW1lbnQgaXMgcmVjZWl2ZWQgZm9jdXMgYnkgZGVmYXVsdFxuICAgICAgICBpZiAoQ29tbW9uVXRpbC5pc2ZvY3VzYWJsZUJ5RGVmYXVsdChydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vdmFsaWRhdGUgaWYgdGhpcyBlbGVtZW50IGhhcyBhbnkgb2YgdGhlIGdpdmVuIGV2ZW50IGhhbmRsZXInc1xuICAgICAgICBsZXQgcmV0VG9rZW4xID0gbmV3IEFycmF5KCk7XG4gICAgICAgIHJldFRva2VuMS5wdXNoKHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICBsZXQgZXZlbnRBcnIgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgLy8gRnJvbSBXQ0FHMjBfU2NyaXB0X1VzZVczQ0RvbUZ1bmN0aW9uc1xuICAgICAgICAvL2xldCBldmVudHMgPSBbXCJvbmJsdXJcIiwgXCJvbmZvY3VzXCIsIFwib25jaGFuZ2VcIiwgXCJvbmNsaWNrXCIsIFwib25jb250ZXh0bWVudVwiLCBcIm9uZGJsY2xpY2tcIiwgXCJvbmtleWRvd25cIixcbiAgICAgICAgLy8gICAgICAgICAgICAgIFwib25rZXlwcmVzc1wiLCBcIm9ua2V5dXBcIiwgXCJvbmxvYWRcIiwgXCJvbm1vdXNlZG93blwiLCBcIm9ubW91c2V1cFwiLCBcIm9ubW91c2Vtb3ZlXCIsIFwib25tb3VzZW91dFwiLFxuICAgICAgICAvLyAgICAgICAgICAgICAgXCJvbm1vdXNlb3ZlclwiLCBcIm9ubW91c2V3aGVlbFwiLCBcIm9ucmVzZXRcIiwgXCJvbnBhc3RlXCIsIFwib25yZXNpemVcIiwgXCJvbnNjcm9sbFwiLFxuICAgICAgICAvLyAgICAgICAgICAgICAgXCJvbnNlbGVjdFwiLCBcIm9uc3VibWl0XCIsIFwib25hY3RpdmF0ZVwiLCBcIm9uZGVhY3RpdmF0ZVwiLCBcIm9ubW91c2VlbnRlclwiLCBcIm9ubW91c2VsZWF2ZVwiXTtcbiAgICAgICAgbGV0IGV2ZW50cyA9IFtcIm9uYmx1clwiLCBcIm9uZm9jdXNcIiwgXCJvbmNoYW5nZVwiLCBcIm9uY2xpY2tcIiwgXCJvbmRibGNsaWNrXCIsIFwib25rZXlkb3duXCIsXG4gICAgICAgICAgICBcIm9ua2V5cHJlc3NcIiwgXCJvbmtleXVwXCIsIFwib25tb3VzZWRvd25cIiwgXCJvbm1vdXNldXBcIiwgXCJvbm1vdXNlbW92ZVwiLCBcIm9ubW91c2VvdXRcIixcbiAgICAgICAgICAgIFwib25tb3VzZW92ZXJcIiwgXCJvbnJlc2l6ZVwiXG4gICAgICAgIF07XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXZlbnRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKGV2ZW50c1tpXSkpXG4gICAgICAgICAgICAgICAgZXZlbnRBcnIucHVzaChldmVudHNbaV0pO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZXRUb2tlbjIgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgcmV0VG9rZW4yLnB1c2goZXZlbnRBcnIuam9pbihcIiwgXCIpKTtcbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQoZmFsc2UsIFtydWxlQ29udGV4dF0sICcnLCAnJywgW3JldFRva2VuMSwgcmV0VG9rZW4yXSk7XG4gICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiLCBbcmV0VG9rZW4xLnRvU3RyaW5nKCksIHJldFRva2VuMi50b1N0cmluZygpXSk7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfZm9ybV9sYWJlbF91bmlxdWU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9mb3JtX2xhYmVsX3VuaXF1ZVwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpmb3JtXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9NdWx0aXBsZUZvcm1MYW5kbWFya3NfSW1wbGljaXRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImFyaWFfZm9ybV9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIjogXCJhcmlhX2Zvcm1fbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2Zvcm1fbGFiZWxfdW5pcXVlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlRoZSBlbGVtZW50IHdpdGggXFxcImZvcm1cXFwiIHJvbGUgaGFzIGEgdW5pcXVlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCIsXG4gICAgICAgICAgICBcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwiOiBcIk11bHRpcGxlIGVsZW1lbnRzIHdpdGggXFxcImZvcm1cXFwiIHJvbGUgZG8gbm90IGhhdmUgdW5pcXVlIGxhYmVsc1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVhY2ggZWxlbWVudCB3aXRoIFxcXCJmb3JtXFxcIiByb2xlIG11c3QgaGF2ZSBhIHVuaXF1ZSBsYWJlbCB0aGF0IGRlc2NyaWJlcyBpdHMgcHVycG9zZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBkdXBwZWQgPSBBcmlhVXRpbC5pc0xhbmRtYXJrTmFtZVVuaXF1ZShydWxlQ29udGV4dCwgXCJmb3JtXCIsIHRydWUpOyAgICBcbiAgICAgICAgaWYgKGR1cHBlZCA9PSBudWxsKSByZXR1cm4gbnVsbDsgXG4gICAgICAgIGlmIChkdXBwZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX2dyYXBoaWNfbGFiZWxsZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9ncmFwaGljX2xhYmVsbGVkXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmdyYXBoaWNzLWRvY3VtZW50LGFyaWE6Z3JhcGhpY3Mtc3ltYm9sXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJIQUFDX0FyaWFfU3ZnQWx0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJGYWlsXzJcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiRmFpbF8zXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2dyYXBoaWNfbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX2dyYXBoaWNfbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2dyYXBoaWNfbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJhcmlhX2dyYXBoaWNfbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJhcmlhX2dyYXBoaWNfbGFiZWxsZWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIkFuIGVsZW1lbnQgd2l0aCBhIGdyYXBoaWNzIHJvbGUgbXVzdCBoYXZlIGEgbm9uLWVtcHR5IGxhYmVsXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkVsZW1lbnQgd2l0aCBcXFwiezB9XFxcIiBncmFwaGljcyByb2xlIGhhcyBubyBsYWJlbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJFbGVtZW50IHdpdGggXFxcInswfVxcXCIgZ3JhcGhpY3Mgcm9sZSBoYXMgbm8gbGFiZWwgb3IgYW4gZW1wdHkgbGFiZWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiRWxlbWVudCB3aXRoIFxcXCJ7MH1cXFwiIGdyYXBoaWNzIHJvbGUgbWlzc2luZyBub24tZW1wdHkgJ2FyaWEtbGFiZWwnIG9yICdhcmlhLWxhYmVsbGVkYnknXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFtdLFxuICAgIGFjdDogW3tcbiAgICAgICAgXCI3ZDY3MzRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImluYXBwbGljYWJsZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJmYWlsXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcImluYXBwbGljYWJsZVwiXG4gICAgICAgIH1cbiAgICB9XSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuXG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBpZiAoIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInJvbGVcIikgfHwgIXJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInJvbGVcIikuaW5jbHVkZXMoXCJncmFwaGljcy1cIikpIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8qIHJlbW92ZWQgdGhlIHJvbGUgY2hlY2sgcm9sZT0gcHJlc2VudGF0aW9uIHNpbmNlIGlmIGFuIGVsZW1lbnQgaGFzIHJvbGU9aW1nLCB0aGVuIHRoZXJlIG5lZWRzIHRvIGJlIGEgY2hlY2sgZm9yIGFsdCBhdHRyaWJ1dGUgcmVnYXJkbGVzcyBvZiB0aGUgcHJlc2VjbmUgb2Ygcm9sZT1wcmVzZW50YXRpb25cbiAgICAgICAgaWYgKFJQVFV0aWwuaGFzUm9sZShydWxlQ29udGV4dCwgXCJwcmVzZW50YXRpb25cIikgfHwgUlBUVXRpbC5oYXNSb2xlKHJ1bGVDb250ZXh0LCBcIm5vbmVcIikpe1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcygxKTtcbiAgICAgICAgfSovXG5cbiAgICAgICAgLy8gSWYgcm9sZSA9PT0gaW1nLCB5b3UgbXVzdCB1c2UgYW4gYXJpYSBsYWJlbFxuICAgICAgICAvL2NoZWNrIGF0dHJpYnV0ZXMgYXJpYS1sYWJlbCBhbmQgYXJpYS1sYWJlbGxlZGJ5IGZvciBvdGhlciB0YWdzIChlLmcuLCA8ZGl2PiwgPHNwYW4+LCBldGMpXG4gICAgICAgIGxldCBwYXNzZWQgPSBBcmlhVXRpbC5nZXRBcmlhTGFiZWwocnVsZUNvbnRleHQpLmxlbmd0aCA+IDA7XG5cbiAgICAgICAgaWYgKCFwYXNzZWQgJiYgcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJzdmdcIikge1xuICAgICAgICAgICAgbGV0IHN2Z1RpdGxlID0gcnVsZUNvbnRleHQucXVlcnlTZWxlY3RvcihcInRpdGxlXCIpO1xuICAgICAgICAgICAgcGFzc2VkID0gc3ZnVGl0bGUgJiYgQ29tbW9uVXRpbC5oYXNJbm5lckNvbnRlbnQoc3ZnVGl0bGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIC8vY2hlY2sgdGl0bGUgYXR0cmlidXRlXG4gICAgICAgICAgICBwYXNzZWQgPSBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInRpdGxlXCIpO1xuICAgICAgICAgICAgLy8gV2Ugc2hvdWxkIGd1aWRlIHBlb3BsZSB0byB1c2UgYWx0IG9yIGxhYmVsIC0gdGhpcyBpcyBqdXN0IGEgc2Vjb25kYXJ5IGFwcHJvYWNoIHRvIHNpbGVuY2UgdGhlIHJ1bGUuXG4gICAgICAgICAgICAvLyBTbywgd2Ugc2hvdWxkIGtlZXAgdGhlIFBPRiBmcm9tIGFib3ZlLlxuICAgICAgICAgICAgLy8gaWYgKCFwYXNzZWQpIFBPRiA9IFwiRmFpbF8zXCI7XG4gICAgICAgIH1cbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBbcnVsZUNvbnRleHRdLCAncm9sZScsICcnLCBbXSk7XG4gICAgICAgIGlmIChwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMlwiLCBbcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwicm9sZVwiKV0pXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX2hpZGRlbl9ub250YWJiYWJsZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2hpZGRlbl9ub250YWJiYWJsZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbYXJpYS1oaWRkZW49dHJ1ZV0sIGRvbToqW2FyaWEtaGlkZGVuPXRydWVdIGRvbToqXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJhcmlhX2hpZGRlbl9mb2N1c19taXN1c2VcIjogeyBcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IGBhcmlhX2hpZGRlbl9ub250YWJiYWJsZS5odG1sYCwgXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBgYXJpYV9oaWRkZW5fbm9udGFiYmFibGUuaHRtbGAsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBgYXJpYV9oaWRkZW5fbm9udGFiYmFibGUuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQSBoaWRkZW4gZWxlbWVudCBzaG91bGQgbm90IGNvbnRhaW4gYW55IHRhYmJhYmxlIGVsZW1lbnRzXCIsIFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJFbGVtZW50IFxcXCJ7MH1cXFwiIHNob3VsZCBub3QgYmUgZm9jdXNhYmxlIHdpdGhpbiB0aGUgc3VidHJlZSBvZiBhbiBlbGVtZW50IHdpdGggYW4gJ2FyaWEtaGlkZGVuJyBhdHRyaWJ1dGUgd2l0aCB2YWx1ZSAndHJ1ZSdcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFsgXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIG51bTogW1wiMS4zLjFcIiwgXCI0LjEuMlwiXSwgLy8gbnVtOiBbIFwiMi40LjRcIiwgXCJ4LnkuelwiIF0gYWxzbyBhbGxvd2VkXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICAvLyBUT0RPOiBBQ1Q6IEhhbmRsZSB0ZXN0Y2FzZSB3aXRoIGZvY3VzIGp1bXBpbmcgYXdheVxuICAgIGFjdDogXCI2Y2ZhODRcIixcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAgICAgXG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChDb21tb25VdGlsLmlzVGFiYmFibGUocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW25vZGVOYW1lXSk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcbmltcG9ydCB7IEFSSUFEZWZpbml0aW9ucyB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFEZWZpbml0aW9uc1wiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfaWRfdW5pcXVlOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfaWRfdW5pcXVlXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfVmFsaWRJZFJlZlwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfaWRfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV9pZF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfaWRfdW5pcXVlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiVGhlICdpZCcgXFxcInswfVxcXCIgc3BlY2lmaWVkIGZvciB0aGUgQVJJQSBwcm9wZXJ0eSAnezF9JyB2YWx1ZSBpcyBub3QgdmFsaWRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgQVJJQSBwcm9wZXJ0eSBtdXN0IHJlZmVyZW5jZSBhIG5vbi1lbXB0eSB1bmlxdWUgaWQgb2YgYW4gZXhpc3RpbmcgZWxlbWVudCB0aGF0IGlzIHZpc2libGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICAvLyBUT0RPOiBBQ1Q6IDZhNzI4MSAtIE5lZWQgYSBzZXBhcmF0ZSByZWFzb24gY29kZSB3aGVuIHRoZSBwcm9wZXJ0eSBpcyBub3QgcmVxdWlyZWQuIEFDVCBzYXlzIGl0J3Mgb2theSB0byBiZVxuICAgIC8vIGludmFsaWQgd2hlbiBub3QgcmVxdWlyZWQuIEkgdGhpbmsgd2Ugc2hvdWxkIHN0aWxsIGZhaWwsIGJ1dCBmbGFnIGl0IGFzIGEgZGlmZmVyZW50IHJlYXNvbiBzbyB0aGF0IHdlIGNhbiBoYXZlIGEgc3Vic2V0XG4gICAgLy8gYWxpZ25zIHdpdGggQUNULlxuICAgIGFjdDogW1wiNTk3OTZmXCIsIFwiNmE3MjgxXCJdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzID0gdHJ1ZTtcbiAgICAgICAgbGV0IGF0dHJOYW1lQXJyID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCBub25FeGlzdGFudElEcyA9IG5ldyBBcnJheSgpO1xuICAgICAgICBsZXQgb3duZXJEb2N1bWVudCA9IEZyYWdtZW50VXRpbC5nZXRPd25lckZyYWdtZW50KHJ1bGVDb250ZXh0KTtcbiAgICAgICAgbGV0IGNvbnRleHRBdHRyaWJ1dGVzID0gcnVsZUNvbnRleHQuYXR0cmlidXRlcztcbiAgICAgICAgbGV0IGlkVG9rZW5zID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCB0ZXN0ZWRSZWZlcmVuY2VzID0gMDtcblxuICAgICAgICBpZiAoY29udGV4dEF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBhdHRyTGVuZ3RoID0gY29udGV4dEF0dHJpYnV0ZXMubGVuZ3RoOyBpIDwgYXR0ckxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgcGFzcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgbGV0IGF0dHJOYW1lID0gY29udGV4dEF0dHJpYnV0ZXNbaV0ubmFtZTtcbiAgICAgICAgICAgICAgICBpZiAoQXJpYVV0aWwuaXNEZWZpbmVkQXJpYUF0dHJpYnV0ZShydWxlQ29udGV4dCwgYXR0ck5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkYXRhVHlwZXMgPSBBUklBRGVmaW5pdGlvbnMucHJvcGVydHlEYXRhVHlwZXNbYXR0ck5hbWVdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YVR5cGVzICYmIGRhdGFUeXBlcy50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3VwcG9ydHNPbmVJRFJlZiA9IChkYXRhVHlwZXMudHlwZSA9PSBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2lkcmVmXCIpID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9JZiB0aGUgZGF0YSB0eXBlIHN1cHBvcnRzIG9uZSBvciBtb3JlIGlkIHJlZnMgZG8gZXJyb3IgY2hlY2tpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdXBwb3J0c09uZUlEUmVmIHx8IChkYXRhVHlwZXMudHlwZSA9PSBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2lkcmVmc1wiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RlZFJlZmVyZW5jZXMrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbm9kZVZhbHVlTGVuZ3RoID0gQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKGNvbnRleHRBdHRyaWJ1dGVzW2ldLm5vZGVWYWx1ZSkubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpZEFycmF5ID0gY29udGV4dEF0dHJpYnV0ZXNbaV0ubm9kZVZhbHVlLnNwbGl0KFwiIFwiKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBhbiBlbXB0eSBJRCBSZWZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZVZhbHVlTGVuZ3RoIDwgMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkVG9rZW5zLnB1c2goXCJcXFwiXCIgKyBjb250ZXh0QXR0cmlidXRlc1tpXS5ub2RlVmFsdWUgKyBcIlxcXCJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIHRvIHNlZSBpZiB0b28gbWFueSBJRFJlZnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzdXBwb3J0c09uZUlEUmVmKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vSWYgaGFzIHRvbyBtYW55IElEUmVmcyBpdCBpcyBhbiBlcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZVZhbHVlTGVuZ3RoID49IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZEFycmF5Lmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmVlZCB0byBjYXB0dXJlIGFsbCB0aGUgSURSZWZzIGZvciBpZFRva2Vuc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHogPSAwLCBsZW5ndGggPSBpZEFycmF5Lmxlbmd0aDsgeiA8IGxlbmd0aDsgKyt6KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZEFycmF5W3pdICE9IFwiXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkVG9rZW5zLnB1c2goaWRBcnJheVt6XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgdG8gc2VlIGlmIGlkIHJlZnMgYXJlIGludmFsaWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFzcyAmJiBub2RlVmFsdWVMZW5ndGggPj0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMCwgbGVuZ3RoID0gaWRBcnJheS5sZW5ndGg7IGogPCBsZW5ndGg7ICsraikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlkQXJyYXlbal0ubGVuZ3RoID4gMCkgeyAvLyBpdCBpcyBhbiBlbXB0eSBzdHJpbmcgaWYgc3BhY2VzIGFyZSBvbmUgYWZ0ZXIgdGhlIG90aGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBlbGVtZW50IGJ5IElkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVsZW1lbnRCeUlkID0gb3duZXJEb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZEFycmF5W2pdKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBhc3MgaWYgdGhlIGVsZW1lbnQgZXhpc3RzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzcyA9IGVsZW1lbnRCeUlkICE9IG51bGw7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgZWxlbWVudCBleGlzdHMgYW5kIHRoaXMgaXMgYW4gYXJpYSBhdHRyaWJ1dGUgdGhhdCBkb2Vzbid0IHN1cHBvcnQgaGlkZGVuIElEIHJlZmVyZW5jZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZW4gcGVyZm9ybSBhIGlzTm9kZVZpc2libGUgY2hlY2ssIGluIHRoZSBjYXNlIHRoZSBub2RlIGlzIG5vdCB2aXNpYmxlIHRoZW4gd2UgcmV0dXJuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFsc2UgYW5kIHRydWUgb3RoZXJ3aXNlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXNzICYmICFkYXRhVHlwZXMuaGlkZGVuSURSZWZTdXBwb3J0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzcyA9IFZpc1V0aWwuaXNOb2RlVmlzaWJsZShlbGVtZW50QnlJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZEFycmF5W2pdICE9IFwiXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkVG9rZW5zLnB1c2goaWRBcnJheVtqXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSBvbmUgb2YgdGhlIGlkIHJlZmVyZW5jZXMgbmVlZCB0byBiZSB2YWxpZCB0byBtYXJrIHRoZSBydWxlIGFzIHBhc3NlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGVyZWZvcmUgaWYgd2UgZmluZCBhIHNpbmdsZSB2aXNpYmxlIGVsZW1lbnQgdGhlbiBzdG9wIGNoZWNraW5nIGFuZCBtYXJrIGFzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFzc2VkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXNzKSBhdHRyTmFtZUFyci5wdXNoKGF0dHJOYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHBhc3NlZCA9IGF0dHJOYW1lQXJyLmxlbmd0aCA9PSAwO1xuICAgICAgICBsZXQgcmV0VG9rZW4xID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCByZXRUb2tlbjIgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgbGV0IHJldFRva2VuMyA9IG5ldyBBcnJheSgpO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuXG4gICAgICAgICAgICByZXRUb2tlbjIucHVzaChhdHRyTmFtZUFyci5qb2luKFwiLCBcIikpO1xuICAgICAgICAgICAgcmV0VG9rZW4zLnB1c2gocnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgICAgICBpZiAoaWRUb2tlbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHJldFRva2VuMS5wdXNoKGlkVG9rZW5zLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIFtydWxlQ29udGV4dF0sIGF0dHJOYW1lQXJyLCAnJywgcGFzc2VkID09IHRydWUgPyBbXSA6IFtyZXRUb2tlbjEsIHJldFRva2VuMiwgcmV0VG9rZW4zXSk7XG4gICAgICAgIGlmICh0ZXN0ZWRSZWZlcmVuY2VzID09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9IGVsc2UgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiLCBbcmV0VG9rZW4xLnRvU3RyaW5nKCksIHJldFRva2VuMi50b1N0cmluZygpLCByZXRUb2tlbjMudG9TdHJpbmcoKV0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9pbWdfbGFiZWxsZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9pbWdfbGFiZWxsZWRcIixcbiAgICBjb250ZXh0OiBcImFyaWE6aW1nLCBhcmlhOmltYWdlXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJIQUFDX0FyaWFfSW1nQWx0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJGYWlsXzJcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiRmFpbF8zXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2ltZ19sYWJlbGxlZC5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfaW1nX2xhYmVsbGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV9pbWdfbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJhcmlhX2ltZ19sYWJlbGxlZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcImFyaWFfaW1nX2xhYmVsbGVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBbiBlbGVtZW50IHdpdGggXFxcImltZ1xcXCIgcm9sZSBtdXN0IGhhdmUgYSBub24tZW1wdHkgbGFiZWxcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRWxlbWVudCB3aXRoIFxcXCJpbWdcXFwiIHJvbGUgaGFzIG5vIGxhYmVsXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkVsZW1lbnQgd2l0aCBcXFwiaW1nXFxcIiByb2xlIGhhcyBubyBsYWJlbCBvciBhbiBlbXB0eSBsYWJlbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJFbGVtZW50IHdpdGggXFxcImltZ1xcXCIgcm9sZSBtaXNzaW5nIG5vbi1lbXB0eSAnYXJpYS1sYWJlbCcgb3IgJ2FyaWEtbGFiZWxsZWRieSdcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW10sXG4gICAgYWN0OiBbXCIyM2EyYThcIiwge1xuICAgICAgICBcIjdkNjczNFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcImZhaWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiaW5hcHBsaWNhYmxlXCJcbiAgICAgICAgfVxuICAgIH1dLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJyb2xlXCIpKSB7XG4gICAgICAgICAgICAvLyBJZiBubyByb2xlLCB0aGlzIGlzIGltcGxpY2l0LCBhbmQgY292ZXJlZCBieSBXQ0FHMjBfSW1nX0hhc0FsdFxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICAvLyBzdmcgYW5kIGltZyBlbGVtZW50cyBhcmUgaGFuZGxlZCBpbiBzdmdfZ3JhcGhpY3NfbGFiYmVsbGVkIGFuZCBpbWdfYWx0X3ZhbGlkIHJ1bGVzXG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gJ3N2ZycgfHwgbm9kZU5hbWUgPT09ICdpbWcnKSByZXR1cm47XG5cbiAgICAgICAgLyogcmVtb3ZlZCB0aGUgcm9sZSBjaGVjayByb2xlPSBwcmVzZW50YXRpb24gc2luY2UgaWYgYW4gZWxlbWVudCBoYXMgcm9sZT1pbWcsIHRoZW4gdGhlcmUgbmVlZHMgdG8gYmUgYSBjaGVjayBmb3IgYWx0IGF0dHJpYnV0ZSByZWdhcmRsZXNzIG9mIHRoZSBwcmVzZWNuZSBvZiByb2xlPXByZXNlbnRhdGlvblxuICAgICAgICBpZiAoUlBUVXRpbC5oYXNSb2xlKHJ1bGVDb250ZXh0LCBcInByZXNlbnRhdGlvblwiKSB8fCBSUFRVdGlsLmhhc1JvbGUocnVsZUNvbnRleHQsIFwibm9uZVwiKSl7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKDEpO1xuICAgICAgICB9Ki9cblxuICAgICAgICAvKiBKQ0ggLSBQb2ludHMgb2YgZmFpbHVyZVxuICAgICAgICAgKiAgICAwLiBNaXNzaW5nIGFsdCBhdHRyIHdpdGggdmFsdWVcbiAgICAgICAgICogICAgMS4gTWlzc2luZyBhcmlhLWxhYmVsIG9yIGFyaWEtbGFiZWxsZWRieVxuICAgICAgICAgKiAgICAyLiBNaXNzaW5nIHRpdGxlIGF0dHIgd2l0aCB2YWx1ZVxuICAgICAgICAgKi9cbiAgICAgICAgXG4gICAgICAgIC8vIElmIHJvbGUgPT09IGltZywgeW91IG11c3QgdXNlIGFuIGFyaWEgbGFiZWxcbiAgICAgICAgLy9jaGVjayBhdHRyaWJ1dGVzIGFyaWEtbGFiZWwgYW5kIGFyaWEtbGFiZWxsZWRieSBmb3Igb3RoZXIgdGFncyAoZS5nLiwgPGRpdj4sIDxzcGFuPiwgZXRjKVxuICAgICAgICBsZXQgcGFzc2VkID0gQXJpYVV0aWwuZ2V0QXJpYUxhYmVsKHJ1bGVDb250ZXh0KS5sZW5ndGggPiAwO1xuXG4gICAgICAgIGlmICghcGFzc2VkICYmIHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwic3ZnXCIpIHtcbiAgICAgICAgICAgIGxldCBzdmdUaXRsZSA9IHJ1bGVDb250ZXh0LnF1ZXJ5U2VsZWN0b3IoXCJ0aXRsZVwiKTtcbiAgICAgICAgICAgIHBhc3NlZCA9IHN2Z1RpdGxlICYmIENvbW1vblV0aWwuaGFzSW5uZXJDb250ZW50KHN2Z1RpdGxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAvL2NoZWNrIHRpdGxlIGF0dHJpYnV0ZVxuICAgICAgICAgICAgcGFzc2VkID0gQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJ0aXRsZVwiKTtcbiAgICAgICAgICAgIC8vIFdlIHNob3VsZCBndWlkZSBwZW9wbGUgdG8gdXNlIGFsdCBvciBsYWJlbCAtIHRoaXMgaXMganVzdCBhIHNlY29uZGFyeSBhcHByb2FjaCB0byBzaWxlbmNlIHRoZSBydWxlLlxuICAgICAgICAgICAgLy8gU28sIHdlIHNob3VsZCBrZWVwIHRoZSBQT0YgZnJvbSBhYm92ZS5cbiAgICAgICAgICAgIC8vIGlmICghcGFzc2VkKSBQT0YgPSBcIkZhaWxfM1wiO1xuICAgICAgICB9XG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KHBhc3NlZCwgW3J1bGVDb250ZXh0XSwgJ3JvbGUnLCAnJywgW10pO1xuICAgICAgICBpZiAocGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzJcIilcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgQVJJQURlZmluaXRpb25zIH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQURlZmluaXRpb25zXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9rZXlib2FyZF9oYW5kbGVyX2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2tleWJvYXJkX2hhbmRsZXJfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJkb206Kltyb2xlXVwiLFxuICAgIGRlcGVuZGVuY2llczogW1wiYXJpYV9yb2xlX2FsbG93ZWRcIl0sXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9NaXNzaW5nS2V5Ym9hcmRIYW5kbGVyXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX25vX2tleWJvYXJkX2FjY2Vzc1wiOiBcInBvdGVudGlhbF9ub19rZXlib2FyZF9hY2Nlc3NcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJhcmlhX2tleWJvYXJkX2hhbmRsZXJfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX25vX2tleWJvYXJkX2FjY2Vzc1wiOiBcImFyaWFfa2V5Ym9hcmRfaGFuZGxlcl9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfa2V5Ym9hcmRfaGFuZGxlcl9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX25vX2tleWJvYXJkX2FjY2Vzc1wiOiBcIlZlcmlmeSB0aGUgPHswfT4gZWxlbWVudCB3aXRoIFxcXCJ7MX1cXFwiIHJvbGUgaGFzIGtleWJvYXJkIGFjY2Vzc1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkludGVyYWN0aXZlIFdBSV9BUklBIFVJIGNvbXBvbmVudHMgbXVzdCBwcm92aWRlIGtleWJvYXJkIGFjY2Vzc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcblxuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IGlzIGhpZGRlbiBvciBkaXNhYmxlZFxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpIHx8IENvbW1vblV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuICAgICAgICBsZXQgc2F2ZWRQYXNzZWQgPSBwYXNzZWQ7XG4gICAgICAgIGxldCBkb2MgPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50O1xuICAgICAgICBsZXQgZGVzaWduUGF0dGVybnMgPSBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnM7XG4gICAgICAgIC8vbGV0IHJvbGVzID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwicm9sZVwiKS50cmltKCkudG9Mb3dlckNhc2UoKS5zcGxpdCgvXFxzKy8pO1xuICAgICAgICAvL29ubHkgY29uc2lkZXIgdXNlciBzcGVjaWZpZWQgcm9sZShzKSwgcmF0aGVyIHRoYW4gbmF0aXZlIGNvbnRhaW5lcnNcbiAgICAgICAgbGV0IHJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXMocnVsZUNvbnRleHQsIGZhbHNlKTtcbiAgICAgICAgXG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIC8vaWYgYW4gZXhwbGljaXQgcm9sZSBpcyBzcGVjaWZpZWQsIHRoZSAnYXJpYV9yb2xlX3JlZHVuZGFudCcgcnVsZSBzaG91bGQgYmUgdHJpZ2dlcmVkIGFuZCBhZGRyZXNzZWQgZmlyc3QsXG4gICAgICAgIC8vIGFuZCB0aGUgY3VycmVudCBydWxlIHNob3VsZCBiZSBpZ25vcmVkXG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gJ2RhdGFsaXN0JyAmJiByb2xlcyAmJiByb2xlcy5pbmNsdWRlcyhcImxpc3Rib3hcIikpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIFxuICAgICAgICAvLyBDb21wb3NpdGUgdXNlciBpbnRlcmZhY2Ugd2lkZ2V0IHJvbGVzLiBUaGV5IGFjdCBhcyBjb250YWluZXJzIHRoYXQgbWFuYWdlIG90aGVyLCBjb250YWluZWQgd2lkZ2V0cy5cbiAgICAgICAgbGV0IHJvbGVDb250YWluZXJzID0gW1wiY29tYm9ib3hcIiwgXCJncmlkXCIsIFwibGlzdGJveFwiLCBcIm1lbnVcIiwgXCJtZW51YmFyXCIsIFwicmFkaW9ncm91cFwiLCBcInRhYmxpc3RcIiwgXCJ0cmVlXCIsIFwidHJlZWdyaWRcIl07XG4gICAgICAgIGZvciAoY29uc3Qgcm9sZSBvZiByb2xlQ29udGFpbmVycykge1xuICAgICAgICAgICAgaWYgKEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUocnVsZUNvbnRleHQsIHJvbGUsIHRydWUpICE9IG51bGwpIFxuICAgICAgICAgICAgICAgIC8vIGl0J3MgYSBkZXNjZW5kYW50IG9mIGEgY29tcG9zaXRlIHdpZGdldCBhbHJlYWR5IGV4YW1pbmVkXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGxldCBoYXNBdHRyaWJ1dGUgPSBDb21tb25VdGlsLmhhc0F0dHJpYnV0ZTtcbiAgICAgICAgXG4gICAgICAgIGxldCByb2xlTmFtZUFyciA9IG5ldyBBcnJheSgpO1xuXG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcm9sZXMubGVuZ3RoOyArK2opIHtcbiAgICAgICAgICAgIGxldCBwYXR0ZXJuID0gZGVzaWduUGF0dGVybnNbcm9sZXNbal1dO1xuICAgICAgICAgICAgaWYgKHJvbGVDb250YWluZXJzLmluZGV4T2Yocm9sZXNbal0pID49IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgZGlzYWJsZWQgPSBoYXNBdHRyaWJ1dGUocnVsZUNvbnRleHQsICdhcmlhLWRpc2FibGVkJykgPyBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWRpc2FibGVkXCIpIDogJyc7XG4gICAgICAgICAgICAgICAgaWYgKCFkaXNhYmxlZCkge1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFNlZSBpZiB0aGVyZSBpcyBhIGtleWJvYXJkIGV2ZW50IGhhbmRsZXIgb24gdGhlIHBhcmVudCBlbGVtZW50LlxuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25rZXlkb3duXCIpIHx8IHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9ua2V5cHJlc3NcIikgfHwgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25rZXl1cFwiKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gTm8ga2V5Ym9hcmQgZXZlbnQgaGFuZGxlciBmb3VuZCBvbiBwYXJlbnQuIFNlZSBpZiBrZXlib2FyZCBldmVudCBoYW5kbGVycyBhcmUgb24gcmVxdWlyZWQgY2hpbGQgZWxlbWVudHMuXG4gICAgICAgICAgICAgICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc0F0dHJpYnV0ZShydWxlQ29udGV4dCwgJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlcUNoaWxkcmVuID0gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVzW2pdXS5yZXFDaGlsZHJlbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVxQ2hpbGRyZW4pIHsgLyogU01GIFRPRE8gbWVudWJhciBkb2VzIG5vdCBoYXZlIGFueSByZXFDaGlsZHJlbiAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgcmVxdWlyZWRDaGlsZHJlbkxlbmd0aCA9IHJlcUNoaWxkcmVuLmxlbmd0aDsgaSA8IHJlcXVpcmVkQ2hpbGRyZW5MZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHhwID0gXCIqW2NvbnRhaW5zKEByb2xlLCdcIiArIHJlcUNoaWxkcmVuW2ldICsgXCInKV1cIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB4cGF0aFJlc3VsdCA9IGRvYy5ldmFsdWF0ZSh4cCwgcnVsZUNvbnRleHQsIENvbW1vblV0aWwuZGVmYXVsdE5TUmVzb2x2ZXIsIDAgLyogWFBhdGhSZXN1bHQuQU5ZX1RZUEUgKi8sIG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHIgPSB4cGF0aFJlc3VsdC5pdGVyYXRlTmV4dCgpIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocikge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gKHIuaGFzQXR0cmlidXRlKFwib25rZXlkb3duXCIpIHx8IHIuaGFzQXR0cmlidXRlKFwib25rZXlwcmVzc1wiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXNzZWQpIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGlsZCBkaWQgbm90IGhhdmUgYSBrZXkgaGFuZGxlci4gU2VlIGlmIGFueSBvZiB0aGUgZ3JhbmRjaGlsZHJlbiBkby5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHhwMiA9IFwiZGVzY2VuZGFudDo6KlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgeHBhdGhSZXN1bHQyID0gZG9jLmV2YWx1YXRlKHhwMiwgciwgQ29tbW9uVXRpbC5kZWZhdWx0TlNSZXNvbHZlciwgMCAvKiBYUGF0aFJlc3VsdC5BTllfVFlQRSAqLywgbnVsbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByMjogRWxlbWVudCA9IHhwYXRoUmVzdWx0Mi5pdGVyYXRlTmV4dCgpIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChyMiAmJiAhcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGb2xsb3dpbmcgYXJlIHRoZSBzdGVwcyB0aGF0IGFyZSBleGVjdXRlZCBhdCB0aGlzIHN0YWdlIHRvIGRldGVybWluZSBpZiB0aGUgbm9kZSBzaG91bGQgYmUgY2xhc3NpZmllZCBhcyBoaWRkZW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yIG5vdC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAxLiBPbmx5IHJ1biBpc05vZGVWaXNpYmxlIGNoZWNrIGlmIGhpZGRlbiBjb250ZW50IHNob3VsZCBOT1QgYmUgY2hlY2tlZC4gSW4gdGhlIGNhc2UgdGhhdCBoaWRkZW4gY29udGVudCBpcyB0byxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBiZSBzY2FubmVkIHRoZW4gd2UgY2FuIGp1c3Qgc2NhbiBldmVyeXRoaW5nIGFzIG5vcm1hbC4gSW4gdGhlIGNhc2UgdGhhdCB0aGUgY3VycmVudCBub2RlIGlzIGhpZGRlbiB3ZSBkbyBub3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBhZGQgaXQgdG8gdGhlIHJvbGVUb0VsZW1zIGhhc2ggYXQgYWxsIG9yIGV2ZW4gZG8gYW55IGNoZWNraW5nIGZvciBpdCBhdCBhbGwuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90ZTogVGhlIGlmIGNvbmRpdGlvbnMgdXNlcyBzaG9ydC1jaXJjdWl0aW5nIHNvIGlmIHRoZSBmaXJzdCBjb25kaXRpb24gaXMgbm90IHRydWUgaXQgd2lsbCBub3QgY2hlY2sgdGhlIG5leHQgb25lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgc28gb24gYW5kIHNvIGZvcnRoLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENvbW1vblV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbihyMikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByMiA9IHhwYXRoUmVzdWx0Mi5pdGVyYXRlTmV4dCgpIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IENvbW1vblV0aWwuaXNUYWJiYWJsZShyMikgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocjIuaGFzQXR0cmlidXRlKFwib25rZXlkb3duXCIpIHx8IHIyLmhhc0F0dHJpYnV0ZShcIm9ua2V5cHJlc3NcIikpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJcyB0aGlzIGFuIGFjdGlvbiBsaW5rP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocjIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSBcImFcIiAmJiByMi5oYXNBdHRyaWJ1dGUoXCJocmVmXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaHJlZiA9IHIyLmdldEF0dHJpYnV0ZShcImhyZWZcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBY3Rpb24gbGluayBtdXN0IHN0YXJ0IHdpdGggXCJqYXZhc2NyaXB0OlwiLCBtdXN0IG5vdCBjb250YWluIGEgXCJ2b2lkXCIgYW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtdXN0IGhhdmUgYSBmdW5jdGlvbiBuYW1lIGZvbGxvd2luZyBcImphdmFzY3JpcHQ6XCIgKGkuZS4sIGhyZWYubGVuZ3RoID4gMTEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSAoaHJlZi5zdGFydHNXaXRoKFwiamF2YXNjcmlwdDpcIikgJiYgaHJlZi5pbmRleE9mKFwidm9pZFwiKSA9PSAtMSAmJiBocmVmLmxlbmd0aCA+IDExKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcjIgPSB4cGF0aFJlc3VsdDIuaXRlcmF0ZU5leHQoKSBhcyBFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFsbCB0aGUgcmVxdWlyZWQgY2hpbGRyZW4gKG9yIGFueSBkZXNjZW5kYW50cyBvZiB0aGUgcmVxdWlyZWQgY2hpbGRyZW4pIG11c3QgaGF2ZSBrZXlwcmVzcy9rZXlkb3duXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIG5vdCwgaXQgaXMgYSBmYWlsdXJlLCBubyBuZWVkIHRvIGtlZXAgY2hlY2tpbmcgYW55IG1vcmUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0geHBhdGhSZXN1bHQuaXRlcmF0ZU5leHQoKSBhcyBFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGN1cnJlbnQgZWxlbWVudCBmYWlsZWQgdGhlIGtleWRvd24va2V5cHJlc3MsIGFuZCBpdCBkb2VzIG5vdCBoYXZlIHJlcXVpcmVkIGNoaWxkcmVuLCBzdWNoIGFzIG1lbnViYXIuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExldCdzIGNoZWNrIGl0cyBkZXNjZW5kYW50cy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHhwMiA9IFwiZGVzY2VuZGFudDo6KlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgeHBhdGhSZXN1bHQyID0gZG9jLmV2YWx1YXRlKHhwMiwgcnVsZUNvbnRleHQsIENvbW1vblV0aWwuZGVmYXVsdE5TUmVzb2x2ZXIsIDAgLyogWFBhdGhSZXN1bHQuQU5ZX1RZUEUgKi8sIG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcjIgPSB4cGF0aFJlc3VsdDIuaXRlcmF0ZU5leHQoKSBhcyBFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocjIgJiYgIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9sbG93aW5nIGFyZSB0aGUgc3RlcHMgdGhhdCBhcmUgZXhlY3V0ZWQgYXQgdGhpcyBzdGFnZSB0byBkZXRlcm1pbmUgaWYgdGhlIG5vZGUgc2hvdWxkIGJlIGNsYXNzaWZpZWQgYXMgaGlkZGVuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvciBub3QuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgMS4gT25seSBydW4gaXNOb2RlVmlzaWJsZSBjaGVjayBpZiBoaWRkZW4gY29udGVudCBzaG91bGQgTk9UIGJlIGNoZWNrZWQuIEluIHRoZSBjYXNlIHRoYXQgaGlkZGVuIGNvbnRlbnQgaXMgdG8sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgYmUgc2Nhbm5lZCB0aGVuIHdlIGNhbiBqdXN0IHNjYW4gZXZlcnl0aGluZyBhcyBub3JtYWwuIEluIHRoZSBjYXNlIHRoYXQgdGhlIGN1cnJlbnQgbm9kZSBpcyBoaWRkZW4gd2UgZG8gbm90XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgYWRkIGl0IHRvIHRoZSByb2xlVG9FbGVtcyBoYXNoIGF0IGFsbCBvciBldmVuIGRvIGFueSBjaGVja2luZyBmb3IgaXQgYXQgYWxsLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGU6IFRoZSBpZiBjb25kaXRpb25zIHVzZXMgc2hvcnQtY2lyY3VpdGluZyBzbyBpZiB0aGUgZmlyc3QgY29uZGl0aW9uIGlzIG5vdCB0cnVlIGl0IHdpbGwgbm90IGNoZWNrIHRoZSBuZXh0IG9uZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgIHNvIG9uIGFuZCBzbyBmb3J0aC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDb21tb25VdGlsLnNob3VsZE5vZGVCZVNraXBwZWRIaWRkZW4ocjIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcjIgPSB4cGF0aFJlc3VsdDIuaXRlcmF0ZU5leHQoKSBhcyBFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBDb21tb25VdGlsLmlzVGFiYmFibGUocjIpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHIyLmhhc0F0dHJpYnV0ZShcIm9ua2V5ZG93blwiKSB8fCByMi5oYXNBdHRyaWJ1dGUoXCJvbmtleXByZXNzXCIpKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJcyB0aGlzIGFuIGFjdGlvbiBsaW5rP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyMi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09IFwiYVwiICYmIHIyLmhhc0F0dHJpYnV0ZShcImhyZWZcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhyZWYgPSByMi5nZXRBdHRyaWJ1dGUoXCJocmVmXCIpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFjdGlvbiBsaW5rIG11c3Qgc3RhcnQgd2l0aCBcImphdmFzY3JpcHQ6XCIsIG11c3Qgbm90IGNvbnRhaW4gYSBcInZvaWRcIiBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbXVzdCBoYXZlIGEgZnVuY3Rpb24gbmFtZSBmb2xsb3dpbmcgXCJqYXZhc2NyaXB0OlwiIChpLmUuLCBocmVmLmxlbmd0aCA+IDExKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSAoaHJlZi5zdGFydHNXaXRoKFwiamF2YXNjcmlwdDpcIikgJiYgaHJlZi5pbmRleE9mKFwidm9pZFwiKSA9PSAtMSAmJiBocmVmLmxlbmd0aCA+IDExKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByMiA9IHhwYXRoUmVzdWx0Mi5pdGVyYXRlTmV4dCgpIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEF0dHJpYnV0ZSAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JyBpcyBzcGVjaWZpZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgcm9sZU5hbWVBcnIucHVzaChyb2xlc1tqXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXBhc3NlZCAmJiBzYXZlZFBhc3NlZCkge1xuICAgICAgICAgICAgICAgIHNhdmVkUGFzc2VkID0gcGFzc2VkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJldFRva2VuMSA9IG5ldyBBcnJheSgpO1xuICAgICAgICByZXRUb2tlbjEucHVzaChydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgbGV0IHJldFRva2VuMiA9IG5ldyBBcnJheSgpO1xuICAgICAgICByZXRUb2tlbjIucHVzaChyb2xlTmFtZUFyci5qb2luKFwiLCBcIikpO1xuXG4gICAgICAgIC8vIERldGVybWluZSBpZiB0aGlzIGlzIHJlZmVyZW5jZWQgYnkgYSBjb21ib2JveC4gSWYgc28sIGxlYXZlIGl0IHRvIHRoZSBjb21ib2JveCBydWxlcyB0byBjaGVja1xuICAgICAgICBsZXQgaWQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJpZFwiKTtcbiAgICAgICAgaWYgKGlkICYmIGlkLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAqW2FyaWEtY29udHJvbHM9JyR7aWR9J11bcm9sZT0nY29tYm9ib3gnXWApKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNhdmVkUGFzc2VkID8gUnVsZVBhc3MoXCJwYXNzXCIpIDogUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF9ub19rZXlib2FyZF9hY2Nlc3NcIiwgW3JldFRva2VuMS50b1N0cmluZygpLCByZXRUb2tlbjIudG9TdHJpbmcoKV0pO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFSSUFNYXBwZXIgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBTWFwcGVyXCI7XG5pbXBvcnQgeyBET01VdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01VdGlsXCI7XG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgQWNjTmFtZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BY2NOYW1lVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX2xhbmRtYXJrX25hbWVfdW5pcXVlOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfbGFuZG1hcmtfbmFtZV91bmlxdWVcIixcbiAgICBjb250ZXh0OiBcImFyaWE6Y29tcGxlbWVudGFyeSwgYXJpYTpiYW5uZXIsIGFyaWE6Y29udGVudGluZm8sIGFyaWE6bWFpbiwgYXJpYTpuYXZpZ2F0aW9uLCBhcmlhOnJlZ2lvbiwgYXJpYTpzZWFyY2gsIGFyaWE6Zm9ybVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwibGFuZG1hcmtfbmFtZV91bmlxdWVcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMFwiOiBcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImFyaWFfbGFuZG1hcmtfbmFtZV91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIjogXCJhcmlhX2xhbmRtYXJrX25hbWVfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2xhbmRtYXJrX25hbWVfdW5pcXVlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIk11bHRpcGxlIGVsZW1lbnRzIHdpdGggXFxcInswfVxcXCIgbGFuZG1hcmtzIHdpdGhpbiB0aGUgc2FtZSBwYXJlbnQgcmVnaW9uIGFyZSBkaXN0aW5ndWlzaGVkIGJ5IHVuaXF1ZSAnYXJpYS1sYWJlbCcgb3IgJ2FyaWEtbGFiZWxsZWRieSdcIixcbiAgICAgICAgICAgIFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCI6IFwiTXVsdGlwbGUgZWxlbWVudHMgd2l0aCBcXFwiezB9XFxcIiBsYW5kbWFya3Mgd2l0aGluIHRoZSBzYW1lIHBhcmVudCByZWdpb24gYXJlIG5vdCBkaXN0aW5ndWlzaGVkIGZyb20gb25lIGFub3RoZXIgYmVjYXVzZSB0aGV5IGhhdmUgdGhlIHNhbWUgXFxcInsxfVxcXCIgbGFiZWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFYWNoIGxhbmRtYXJrIHNob3VsZCBoYXZlIGEgdW5pcXVlICdhcmlhLWxhYmVsbGVkYnknIG9yICdhcmlhLWxhYmVsJyBvciBiZSBuZXN0ZWQgaW4gYSBkaWZmZXJlbnQgcGFyZW50IHJlZ2lvblwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaWRcIjogW1wiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgLy8gVE9ETyBkbyBJIG5lZWQgdG8gZml0ZXIgb3V0IGJhZCBjb250ZW50aW5mbyBub2RlczogVGhlIGZvb3RlciBlbGVtZW50IGlzIG5vdCBhIGNvbnRlbnRpbmZvIGxhbmRtYXJrIHdoZW4gaXQgaXMgYSBkZXNjZW5kYW50IG9mIHRoZSBmb2xsb3dpbmcgSFRNTDUgc2VjdGlvbmluZyBlbGVtZW50czogaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTcvTk9URS13YWktYXJpYS1wcmFjdGljZXMtMS4xLTIwMTcxMjE0L2V4YW1wbGVzL2xhbmRtYXJrcy9IVE1MNS5odG1sXG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgLy8gQ2hlY2tpbmcgaWYgdGhpcyBsYW5kbWFyayBpcyBpbnNpZGUgYSBkaWFsb2cgZWxlbWVudC4gSWYgaXQgaXMgd2UgYXJlIGdvaW5nIHRvIHNraXAgY2hlY2tpbmcgaXQuIFxuICAgICAgICAvKip2YXIgY29weU9mUnVsZUNvbnRleHQgPSBydWxlQ29udGV4dDtcbiAgICAgICAgdmFyIHBhcm5ldE5vZGVzT2ZSdWxlQ29udGV4dCA9IFtdO1xuICAgICAgICB3aGlsZSAoY29weU9mUnVsZUNvbnRleHQpIHtcbiAgICAgICAgICAgIHBhcm5ldE5vZGVzT2ZSdWxlQ29udGV4dC51bnNoaWZ0KGNvcHlPZlJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgIGNvcHlPZlJ1bGVDb250ZXh0ID0gY29weU9mUnVsZUNvbnRleHQucGFyZW50RWxlbWVudDtcbiAgICAgICAgfVxuICAgICAgICBwYXJuZXROb2Rlc09mUnVsZUNvbnRleHQuZm9yRWFjaChlbGVtID0+IHtcbiAgICAgICAgICAgIGlmIChlbGVtICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW0udGFnTmFtZSA9PSBcIkRJQUxPR1wiIHx8IGVsZW0uZ2V0QXR0cmlidXRlKCdyb2xlJykgPT0gXCJkaWFsb2dcIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbCAvLyBTa2lwcGluZyBjaGVja2luZyBsYW5kbWFya3MgdGhhdCBoYXBwZW4gdG8gYmUgaW5zaWRlIGRpYWxvZyBlbGVtZW50c1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgKi9cbiAgICAgICAgaWYgKENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFtcIkRJQUxPR1wiXSkgIT09IG51bGwgfHwgQXJpYVV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShydWxlQ29udGV4dCwgXCJkaWFsb2dcIiwgdHJ1ZSkgIT09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICAvLyBCZWdpbmluZyBmb3JtQ2FjaGUgd29ya1xuICAgICAgICBsZXQgb3duZXJEb2N1bWVudCA9IEZyYWdtZW50VXRpbC5nZXRPd25lckZyYWdtZW50KHJ1bGVDb250ZXh0KTtcbiAgICAgICAgbGV0IGZvcm1DYWNoZSA6IHtcbiAgICAgICAgICAgIG5hdmlnYXRpb25Ob2RlczogYW55W10sXG4gICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNDb21wdXRlZExhYmVsczogc3RyaW5nW10sXG4gICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNQYXJlbnRzOiBhbnlbXSxcbiAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc01hdGNoRm91bmQ6IHN0cmluZ1tdXG4gICAgICAgIH0gPSBDYWNoZVV0aWwuZ2V0Q2FjaGUoXG4gICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgXCJhcmlhX2xhbmRtYXJrX25hbWVfdW5pcXVlXCIsXG4gICAgICAgICAgICBudWxsXG4gICAgICAgICk7XG4gICAgICAgIGlmICghZm9ybUNhY2hlKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIi0tLS0tLS0tLUVOVEVSSU5HIEZPUk0gQ0FDSEVcIilcbiAgICAgICAgICAgIGZvcm1DYWNoZSA9IHtcbiAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXM6IFtdLFxuICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc0NvbXB1dGVkTGFiZWxzOiBbXSxcbiAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNQYXJlbnRzOiBbXSxcbiAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNNYXRjaEZvdW5kOiBbXVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGxldCBuYXZpZ2F0aW9uTm9kZXNUZW1wID0gb3duZXJEb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFxuICAgICAgICAgICAgICAgICdhc2lkZSxbcm9sZT1cImNvbXBsZW1lbnRhcnlcIl0sIGZvb3Rlcixbcm9sZT1cImNvbnRlbnRpbmZvXCJdLCBoZWFkZXIsW3JvbGU9XCJiYW5uZXJcIl0sIG1haW4sW3JvbGU9XCJtYWluXCJdLCBuYXYsW3JvbGU9XCJuYXZpZ2F0aW9uXCJdLCBmb3JtLFtyb2xlPVwiZm9ybVwiXSwgc2VjdGlvbixbcm9sZT1cInJlZ2lvblwiXSxbcm9sZT1cInNlYXJjaFwiXSdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBsZXQgbmF2aWdhdGlvbk5vZGVzID0gQXJyYXkuZnJvbShuYXZpZ2F0aW9uTm9kZXNUZW1wKTtcbiAgICAgICAgICAgIGxldCBuYXZpZ2F0aW9uTm9kZXNQYXJlbnRzID0gW107XG4gICAgICAgICAgICBsZXQgbmF2aWdhdGlvbk5vZGVzTWF0Y2hGb3VuZCA6IHN0cmluZ1tdID0gW107XG5cbiAgICAgICAgICAgIC8vIFRoaXMgYmxvY2sgb2YgY29kZSBmaWx0ZXJzIG91dCBhbnkgbmF2IGVsZW1lbnRzIHRoYXQgYXJlIHVuZGVyIGEgZGlhbG9nLiBBcyB0aG9zZSBhcmUgbm90IG9uZXMgd2Ugd2FudCB0byB0ZXN0IGFnYWluc3QgYXMgd2UgY29uc2lkZXIgZGlhbG9ncyBhcmUgc2VwYXJhdGUgbG9jYXRpb25zIGZyb20gdGhlIHJlc3Qgb2YgdGhlIG1haW4gcGFnZS5cbiAgICAgICAgICAgIGxldCBuYXZpZ2F0aW9uTm9kZXNXaXRob3V0RGlhbG9ncyA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYXZpZ2F0aW9uTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAvKipsZXQgYSA9IG5hdmlnYXRpb25Ob2Rlc1tpXTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBsZXQgZGlhbG9nTm9kZUZvdW5kRmxhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHdoaWxlIChhKSB7XG4gICAgICAgICAgICAgICAgICAgIGEgPSBhLnBhcmVudEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYS50YWdOYW1lID09IFwiRElBTE9HXCIgfHwgYS5nZXRBdHRyaWJ1dGUoJ3JvbGUnKSA9PSBcImRpYWxvZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlhbG9nTm9kZUZvdW5kRmxhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFkaWFsb2dOb2RlRm91bmRGbGFnKSB7XG4gICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc1dpdGhvdXREaWFsb2dzLnB1c2gobmF2aWdhdGlvbk5vZGVzW2ldKVxuICAgICAgICAgICAgICAgIH0qL1xuXG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIG5vZGUgdGhhdCBpcyBBVCBoaWRkZW4gb3IgaW4gYSBkaWFsb2dcbiAgICAgICAgICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQobmF2aWdhdGlvbk5vZGVzW2ldKSB8fCBDb21tb25VdGlsLmdldEFuY2VzdG9yKG5hdmlnYXRpb25Ob2Rlc1tpXSwgW1wiRElBTE9HXCJdKSAhPT0gbnVsbCB8fCBBcmlhVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKG5hdmlnYXRpb25Ob2Rlc1tpXSwgXCJkaWFsb2dcIiwgdHJ1ZSkgIT09IG51bGwpIFxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNXaXRob3V0RGlhbG9ncy5wdXNoKG5hdmlnYXRpb25Ob2Rlc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzID0gbmF2aWdhdGlvbk5vZGVzV2l0aG91dERpYWxvZ3M7XG5cblxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYXZpZ2F0aW9uTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAvLyBMb29wIG92ZXIgYWxsIHRoZSBsYW5kbWFyayBub2Rlc1xuICAgICAgICAgICAgICAgIGxldCBlbHMgPSBbXTtcbiAgICAgICAgICAgICAgICBsZXQgYSA9IG5hdmlnYXRpb25Ob2Rlc1tpXS5wYXJlbnRFbGVtZW50O1xuICAgICAgICAgICAgICAgIHdoaWxlIChhKSB7XG4gICAgICAgICAgICAgICAgICAgIGVscy5wdXNoKGEpO1xuICAgICAgICAgICAgICAgICAgICBhID0gYS5wYXJlbnRFbGVtZW50O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgZWxzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIExvb3Agb3ZlciBhbGwgdGhlIHBhcmVudHMgb2YgdGhlIGxhbmRtYXJrIG5vZGVzXG4gICAgICAgICAgICAgICAgICAgIC8vIEZpbmQgbmVhcmVzdCBsYW5kbWFyayBwYXJlbnQgYmFzZWQgb24gdGhlIHRhZ05hbWUgb3IgdGhlIHJvbGUgYXR0cmlidXRlXG4gICAgICAgICAgICAgICAgICAgIGxldCB0YWdOYW1lVHJpZ2dlciA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiQVNJREVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiRk9PVEVSXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIkZPUk1cIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiSEVBREVSXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIk1BSU5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiTkFWXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlNFQ1RJT05cIixcbiAgICAgICAgICAgICAgICAgICAgXS5pbmNsdWRlcyhlbHNbal0udGFnTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCByb2xlTmFtZVRyaWdnZXIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsc1tqXS5oYXNBdHRyaWJ1dGUoXCJyb2xlXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByb2xlTmFtZVRyaWdnZXIgPSBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJjb21wbGVtZW50YXJ5XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJjb250ZW50aW5mb1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZm9ybVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYmFubmVyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJtYWluXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYXZpZ2F0aW9uXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJyZWdpb25cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInNlYXJjaFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXS5pbmNsdWRlcyhlbHNbal0uZ2V0QXR0cmlidXRlKFwicm9sZVwiKSk7IC8vIFRPRE8gd2UgYXJlIG5vdCBjb3ZlcmluZyB0aGUgY2FzZSB3aGVyZSBhIGVsZW1lbmVudCB3aXRoIG11bHRpcGxlIHJvbGVzLiBlLmcuLCByb2xlID0gXCJmb3JtIGJhbm5lclwiLiBUaGlzIGlzIGEgaW1wcm92bWVudCB3ZSBtaWdodCB3YW50IHRvIGFkZCBpbiB0aGUgZnV0dXJlLlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWdOYW1lVHJpZ2dlciB8fCByb2xlTmFtZVRyaWdnZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5lYXJlc3QgcGFyZW50LWxhbmRtYXJrIGZvdW5kXG4gICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNQYXJlbnRzLnB1c2goZWxzW2pdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChqID09PSBlbHMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBub2RlIGlzIGF0IHRoZSBoZWFkIG9mIHRoZSBmaWxlIHNvIGl0IGRvZXMgbm90IGhhdmUgYSBwYXJlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc1BhcmVudHMucHVzaChudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgbmF2aWdhdGlvbk5vZGVzQ29tcHV0ZWRMYWJlbHMgPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmF2aWdhdGlvbk5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZShuYXZpZ2F0aW9uTm9kZXNbaV0pO1xuICAgICAgICAgICAgICAgIC8vIExvb3Agb3ZlciBhbGwgdGhlIGxhbmRtYXJrIG5vZGVzXG4gICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzQ29tcHV0ZWRMYWJlbHMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgLyoqQVJJQU1hcHBlci5jb21wdXRlTmFtZShuYXZpZ2F0aW9uTm9kZXNbaV0pKi9cbiAgICAgICAgICAgICAgICAgICAgcGFpciAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwID8gcGFpci5uYW1lLnRyaW0oKSA6IFwiXCJcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYXZpZ2F0aW9uTm9kZXNQYXJlbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgLy8gTG9vcCBvdmVyIGFsbCB0aGUgcGFyZW50cyBvZiB0aGUgbGFuZG1hcmsgbm9kZXMgdG8gZmluZCBkdXBsaWNhdGVzXG4gICAgICAgICAgICAgICAgbGV0IG1hdGNoRm91bmQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBsZXQgcGFzc18wX2ZsYWcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG5hdmlnYXRpb25Ob2Rlc1BhcmVudHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGogPT09IGkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGRvIG5vdCB3YW50IHRvIGNvbXBhcmUgYWdhaW5zdCBvdXJzZWxmc1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlmIHN0YXRlbWVudCBmb2N1cyBvbiB0aGUgY2FzZSB3aGVyZSB0aGUgcGFyZW50IGxhbmRtYXJrIGlzIG51bGxcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzUGFyZW50c1tpXSA9PT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzUGFyZW50c1tqXSA9PT0gbnVsbFxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBsb29raW5nIGF0IHR3byByb290IG5vZGVzLCBzbyB3ZSBzaG91bGQgY29tcGFyZSB0aGVtLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSSUFNYXBwZXIubm9kZVRvUm9sZShuYXZpZ2F0aW9uTm9kZXNbaV0pID09PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSSUFNYXBwZXIubm9kZVRvUm9sZShuYXZpZ2F0aW9uTm9kZXNbal0pXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCb3RoIG5vZGVzIGhhdmUgdGhlIHNhbWUgcm9sZSBBTkRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc0NvbXB1dGVkTGFiZWxzW2ldID09PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNDb21wdXRlZExhYmVsc1tqXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBib3RoIGhhdmUgdGhlIHNhbWUgKGNvbXB1dGVkKSBhcmlhLWxhYmVsL2FyaWEtbGFiZWxsZWRieVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiAobmF2aWdhdGlvbk5vZGVzQ29tcHV0ZWRMYWJlbHNbaV0gPT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzTWF0Y2hGb3VuZC5wdXNoKFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCIpOyAvLyBGYWlsIDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hGb3VuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSBwYXJlbnRzICYmIHNhbWUgbm9kZSByb2xlcyBCVVQgZGlmZmVyZW50IGNvbXB1dGVkIGFyaWEtbGFiZWwvYXJpYS1sYWJlbGxlZGJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgYXQgbGVhc3QgYSBQYXNzXzAuIEJ1dCB3ZSBuZWVkIHRvIGNoZWNrIGFsbCBub2RlcyB0byBzZWUgaWYgYW5vdGhlciBvbmUgZmFpbHMuIFNvIHNldCBhIGZsYWcuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NfMF9mbGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhbWUgcGFyZW50cyBidXQgZGlmZmVyZW50IG5vZGUgcm9sZXMgLy8gTm90IGFwcGxpY2FibGVcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc1BhcmVudHNbaV0gPT09IG51bGwgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc1BhcmVudHNbal0gPT09IG51bGxcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBhcmUgbG9va2luZyBhdCBhIHNpbmdsZSByb290IG5vZGVcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpZiBzdGF0ZW1lbnQgZm9jdXMgb24gdGhlIGNhc2Ugd2hlcmUgdGhlIHBhcmVudCBsYW5kbWFyayBpcyBOT1QgbnVsbFxuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBET01VdGlsLnNhbWVOb2RlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc1BhcmVudHNbaV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzUGFyZW50c1tqXVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgdGhlIHNhbWUgcGFyZW50LWxhbmRtYXJrIEFORFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSSUFNYXBwZXIubm9kZVRvUm9sZShuYXZpZ2F0aW9uTm9kZXNbaV0pID09PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSSUFNYXBwZXIubm9kZVRvUm9sZShuYXZpZ2F0aW9uTm9kZXNbal0pXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCb3RoIG5vZGVzIGhhdmUgdGhlIHNhbWUgcm9sZSBBTkRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc0NvbXB1dGVkTGFiZWxzW2ldID09PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNDb21wdXRlZExhYmVsc1tqXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBib3RoIGhhdmUgdGhlIHNhbWUgKGNvbXB1dGVkKSBhcmlhLWxhYmVsL2FyaWEtbGFiZWxsZWRieVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiAobmF2aWdhdGlvbk5vZGVzQ29tcHV0ZWRMYWJlbHNbaV0gPT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzTWF0Y2hGb3VuZC5wdXNoKFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCIpOyAvLyBGYWlsIDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hGb3VuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSBwYXJlbnRzICYmIHNhbWUgbm9kZSByb2xlcyBCVVQgZGlmZmVyZW50IGNvbXB1dGVkIGFyaWEtbGFiZWwvYXJpYS1sYWJlbGxlZGJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgYXQgbGVhc3QgYSBQYXNzXzAuIEJ1dCB3ZSBuZWVkIHRvIGNoZWNrIGFsbCBub2RlcyB0byBzZWUgaWYgYW5vdGhlciBvbmUgZmFpbHMuIFNvIHNldCBhIGZsYWcuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NfMF9mbGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhbWUgcGFyZW50cyBidXQgZGlmZmVyZW50IG5vZGUgcm9sZXMgLy8gTm90IGFwcGxpY2FibGVcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIERpZmZlcmVudCBwYXJlbnRzIC8vIE5vdCBhcHBsaWNhYmxlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFtYXRjaEZvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXNzXzBfZmxhZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzTWF0Y2hGb3VuZC5wdXNoKFwicGFzc1wiKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc01hdGNoRm91bmQucHVzaChcIm51bGxcIik7IC8vIFRoaXMgaXMgbm90IHRoZSBrZXl3b3JkIG51bGwgb24gcHVycG9zZS4gSXQgaXMgYSBzcGFjZWhvbGRlciBpbiB0aGUgYXJyYXkgc28gaW5kZXhlcyBtYXRjaCB1cC5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvcm1DYWNoZS5uYXZpZ2F0aW9uTm9kZXNDb21wdXRlZExhYmVscyA9XG4gICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzQ29tcHV0ZWRMYWJlbHM7XG4gICAgICAgICAgICBmb3JtQ2FjaGUubmF2aWdhdGlvbk5vZGVzID0gbmF2aWdhdGlvbk5vZGVzO1xuICAgICAgICAgICAgZm9ybUNhY2hlLm5hdmlnYXRpb25Ob2Rlc1BhcmVudHMgPSBuYXZpZ2F0aW9uTm9kZXNQYXJlbnRzO1xuICAgICAgICAgICAgZm9ybUNhY2hlLm5hdmlnYXRpb25Ob2Rlc01hdGNoRm91bmQgPSBuYXZpZ2F0aW9uTm9kZXNNYXRjaEZvdW5kO1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKFxuICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICAgICAgXCJhcmlhX2xhbmRtYXJrX25hbWVfdW5pcXVlXCIsXG4gICAgICAgICAgICAgICAgZm9ybUNhY2hlXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyBUT0RPIEFkZCB2YWxpZGF0aW9uIHRoYXQgYWxsIDMgYXJyYXlzIGFyZSB0aGUgc2FtZSBsZW5ndGhcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiLS0tLS0tLS0tLS0tLUVuZCBmb3JtQ2FjaGVcIilcbiAgICAgICAgfSAvLyBFbmQgZm9ybUNhY2hlXG5cbiAgICAgICAgbGV0IGluZGV4VG9DaGVjayA9IC0xO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZvcm1DYWNoZS5uYXZpZ2F0aW9uTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5pc1NhbWVOb2RlKGZvcm1DYWNoZS5uYXZpZ2F0aW9uTm9kZXNbaV0pKSB7XG4gICAgICAgICAgICAgICAgaW5kZXhUb0NoZWNrID0gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5kZXhUb0NoZWNrID09PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZvcm1DYWNoZS5uYXZpZ2F0aW9uTm9kZXNNYXRjaEZvdW5kW2luZGV4VG9DaGVja10gPT09IFwicGFzc1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIsXG4gICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICBBUklBTWFwcGVyLm5vZGVUb1JvbGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ2FjaGUubmF2aWdhdGlvbk5vZGVzW2luZGV4VG9DaGVja11cbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKGZvcm1DYWNoZS5uYXZpZ2F0aW9uTm9kZXNNYXRjaEZvdW5kW2luZGV4VG9DaGVja10gPT09IFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwiLFxuICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgQVJJQU1hcHBlci5ub2RlVG9Sb2xlKFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNhY2hlLm5hdmlnYXRpb25Ob2Rlc1tpbmRleFRvQ2hlY2tdXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIGZvcm1DYWNoZS5uYXZpZ2F0aW9uTm9kZXNDb21wdXRlZExhYmVsc1tpbmRleFRvQ2hlY2tdLFxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9tYWluX2xhYmVsX3VuaXF1ZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX21haW5fbGFiZWxfdW5pcXVlXCIsXG4gICAgY29udGV4dDogXCJhcmlhOm1haW5cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX011bHRpcGxlTWFpbnNSZXF1aXJlTGFiZWxfSW1wbGljaXRfMlwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfbWFpbl9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX21haW5fbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX21haW5fbGFiZWxfdW5pcXVlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiTXVsdGlwbGUgZWxlbWVudHMgd2l0aCBcXFwibWFpblxcXCIgcm9sZSBkbyBub3QgaGF2ZSB1bmlxdWUgbGFiZWxzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWFjaCBlbGVtZW50IHdpdGggXFxcIm1haW5cXFwiIHJvbGUgbXVzdCBoYXZlIHVuaXF1ZSBsYWJlbCB0aGF0IGRlc2NyaWJlcyBpdHMgcHVycG9zZXNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgbGV0IGNvbnRleHRMYWJlbCA9IEFyaWFVdGlsLmdldEFyaWFMYWJlbChydWxlQ29udGV4dCk7XG5cbiAgICAgICAgbGV0IHBhcmVudERvY1JvbGUgPSBBcmlhVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKFxuICAgICAgICAgICAgcnVsZUNvbnRleHQsXG4gICAgICAgICAgICBcImRvY3VtZW50XCIsXG4gICAgICAgICAgICB0cnVlXG4gICAgICAgICk7XG4gICAgICAgIGxldCBtYWlucyA9IENvbW1vblV0aWwuZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW4oXG4gICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgXCJtYWluXCIsXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgdHJ1ZVxuICAgICAgICApO1xuICAgICAgICBsZXQgcmVzdWx0ID0gbnVsbDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYWlucy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgaWYgKG1haW5zW2ldID09PSBydWxlQ29udGV4dCkgY29udGludWU7XG4gICAgICAgICAgICByZXN1bHQgPSBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgICAgIGxldCB0aGlzUGFyZW50RG9jUm9sZSA9IEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUoXG4gICAgICAgICAgICAgICAgbWFpbnNbaV0sXG4gICAgICAgICAgICAgICAgXCJkb2N1bWVudFwiLFxuICAgICAgICAgICAgICAgIHRydWVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAodGhpc1BhcmVudERvY1JvbGUgPT09IHBhcmVudERvY1JvbGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoQXJpYVV0aWwuZ2V0QXJpYUxhYmVsKG1haW5zW2ldKSA9PT0gY29udGV4dExhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfbWFpbl9sYWJlbF92aXNpYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfbWFpbl9sYWJlbF92aXNpYmxlXCIsXG4gICAgY29udGV4dDogXCJkb206Ym9keVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfTXVsdGlwbGVNYWluc1Zpc2libGVMYWJlbF9JbXBsaWNpdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfbWFpbl9sYWJlbF92aXNpYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV9tYWluX2xhYmVsX3Zpc2libGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfbWFpbl9sYWJlbF92aXNpYmxlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiTXVsdGlwbGUgZWxlbWVudHMgd2l0aCBcXFwibWFpblxcXCIgcm9sZSBkbyBub3QgaGF2ZSB1bmlxdWUgdmlzaWJsZSBsYWJlbHNcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFYWNoIGVsZW1lbnQgd2l0aCBcXFwibWFpblxcXCIgcm9sZSBzaG91bGQgaGF2ZSBhIHVuaXF1ZSB2aXNpYmxlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gQ29uc2lkZXIgdGhlIENoZWNrIEhpZGRlbiBDb250ZW50IHNldHRpbmcgdGhhdCBpcyBzZXQgYnkgdGhlIHJ1bGVzXG4gICAgICAgIC8vY2FsbCBnZXRFbGVtZW50c0J5Um9sZUhpZGRlbiB3aXRoIGNvbnNpZGVySW1wbGljaXQgZmxhZyBhcyB0cnVlXG4gICAgICAgIC8vc28gdGhhdCB0aGUgbWV0aG9kIHJldHVycyA8bWFpbj4gZWxlbWVudHNcbiAgICAgICAgbGV0IGxhbmRtYXJrcyA9IENvbW1vblV0aWwuZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW4oXG4gICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgXCJtYWluXCIsXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgdHJ1ZVxuICAgICAgICApO1xuICAgICAgICBpZiAobGFuZG1hcmtzLmxlbmd0aCA9PT0gMCB8fCBsYW5kbWFya3MubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwYXNzZWQgPSBBcmlhVXRpbC5oYXNVbmlxdWVBcmlhTGFiZWxsZWRieShsYW5kbWFya3MpO1xuXG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9uYXZpZ2F0aW9uX2xhYmVsX3VuaXF1ZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX25hdmlnYXRpb25fbGFiZWxfdW5pcXVlXCIsXG4gICAgY29udGV4dDogXCJhcmlhOm5hdmlnYXRpb25cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX011bHRpcGxlTmF2aWdhdGlvbkxhbmRtYXJrc19JbXBsaWNpdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiYXJpYV9uYXZpZ2F0aW9uX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwiOiBcImFyaWFfbmF2aWdhdGlvbl9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfbmF2aWdhdGlvbl9sYWJlbF91bmlxdWUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiVGhlIGVsZW1lbnQgd2l0aCBcXFwibmF2aWdhdGlvblxcXCIgcm9sZSBoYXMgYSB1bmlxdWUgbGFiZWwgdGhhdCBkZXNjcmliZXMgaXRzIHB1cnBvc2VcIixcbiAgICAgICAgICAgIFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCI6IFwiTXVsdGlwbGUgZWxlbWVudHMgd2l0aCBcXFwibmF2aWdhdGlvblxcXCIgcm9sZSBkbyBub3QgaGF2ZSB1bmlxdWUgbGFiZWxzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWFjaCBlbGVtZW50IHdpdGggXFxcIm5hdmlnYXRpb25cXFwiIHJvbGUgbXVzdCBoYXZlIGEgdW5pcXVlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IGR1cHBlZCA9IEFyaWFVdGlsLmlzTGFuZG1hcmtOYW1lVW5pcXVlKHJ1bGVDb250ZXh0LCBcIm5hdmlnYXRpb25cIiwgdHJ1ZSk7ICAgIFxuICAgICAgICBpZiAoZHVwcGVkID09IG51bGwpIHJldHVybiBudWxsOyBcbiAgICAgICAgaWYgKGR1cHBlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgfSAgICBcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBUklBRGVmaW5pdGlvbnMgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBRGVmaW5pdGlvbnNcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9wYXJlbnRfcmVxdWlyZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9wYXJlbnRfcmVxdWlyZWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqW3JvbGVdXCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJhcmlhX3JvbGVfYWxsb3dlZFwiXSxcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX1JlcXVpcmVkUGFyZW50X05hdGl2ZV9Ib3N0X1NlbWF0aWNzXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9wYXJlbnRfcmVxdWlyZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX3BhcmVudF9yZXF1aXJlZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfcGFyZW50X3JlcXVpcmVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFYWNoIGVsZW1lbnQgd2l0aCBhbiBpbXBsaWNpdCBvciBleHBsaWNpdCByb2xlIG11c3QgYmUgY29udGFpbmVkIHdpdGhpbiBhIHZhbGlkIGVsZW1lbnRcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRWxlbWVudCB3aXRoIFxcXCJ7MH1cXFwiIHJvbGUgaXMgbm90IGNvbnRhaW5lZCBpbiBvciBvd25lZCBieSBhbiBlbGVtZW50IHdpdGggb25lIG9mIHRoZSBmb2xsb3dpbmcgcm9sZXM6IFxcXCJ7MX1cXFwiXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgLy8gVE9ETzogQUNUOiBDaGVjayBGYWlsIDNcbiAgICBhY3Q6IFwiZmY4OWM5XCIsXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIFxuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IGlzIGhpZGRlbiBvciBkaXNhYmxlZFxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpIHx8IENvbW1vblV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBcbiAgICAgICAgLy9za2lwIHRoZSBjaGVjayBpZiB0aGUgZWxlbWVudCBzaG91bGQgYmUgYSBwcmVzZW50YXRpb25hbCBjaGlsZCBvZiBhbiBlbGVtZW50XG4gICAgICAgIGlmIChBcmlhVXRpbC5zaG91bGRCZVByZXNlbnRhdGlvbmFsQ2hpbGQocnVsZUNvbnRleHQpIHx8IFZpc1V0aWwuaXNOb2RlUHJlc2VudGF0aW9uYWwocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGxldCBkZXNpZ25QYXR0ZXJucyA9IEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJucztcbiAgICAgICAgbGV0IHJvbGVOYW1lQXJyID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCBjb250YWluZXJSb2xlcyA9IG5ldyBBcnJheSgpO1xuICAgICAgICBsZXQgdGVzdGVkQ29udGFpbmVyID0gMDtcblxuICAgICAgICBsZXQgYW5jZXN0b3JSb2xlcyA9IGNvbnRleHRIaWVyYXJjaGllc1tcImFyaWFcIl0ubWFwKGluZm8gPT4gaW5mby5yb2xlKTtcbiAgICAgICAgbGV0IHBhcmVudFJvbGUgPSBhbmNlc3RvclJvbGVzW2FuY2VzdG9yUm9sZXMubGVuZ3RoIC0gMl07XG4gICAgICAgIGxldCBjb3VudCA9IDI7XG4gICAgICAgIHdoaWxlIChwYXJlbnRSb2xlID09PSAnbm9uZScpIHtcbiAgICAgICAgICAgIGNvdW50Kys7XG4gICAgICAgICAgICBwYXJlbnRSb2xlID0gYW5jZXN0b3JSb2xlc1thbmNlc3RvclJvbGVzLmxlbmd0aCAtIGNvdW50XTtcblxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvKipmb3IgKGxldCBqID0gMCwgbGVuZ3RoID0gcm9sZXMubGVuZ3RoOyBqIDwgbGVuZ3RoOyArK2opIHtcbiAgICAgICAgICAgIGlmIChkZXNpZ25QYXR0ZXJuc1tyb2xlc1tqXV0gJiYgZGVzaWduUGF0dGVybnNbcm9sZXNbal1dLmNvbnRhaW5lciAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGVzdGVkQ29udGFpbmVyKys7XG4gICAgICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgY29udGFpbmVyUm9sZXMgPSBkZXNpZ25QYXR0ZXJuc1tyb2xlc1tqXV0uY29udGFpbmVyO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBjb250YWluZXJzTGVuZ3RoID0gY29udGFpbmVyUm9sZXMubGVuZ3RoOyAhcGFzc2VkICYmIGkgPCBjb250YWluZXJzTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gcGFyZW50Um9sZSA9PT0gY29udGFpbmVyUm9sZXNbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXNzZWQpIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocGFzc2VkID09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJvbGVOYW1lQXJyLnB1c2gocm9sZXNbal0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBcbiAgICAgICAgKi9cbiAgICAgICAgY29uc3Qgcm9sZSA9IEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZShydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChkZXNpZ25QYXR0ZXJuc1tyb2xlXSAmJiBkZXNpZ25QYXR0ZXJuc1tyb2xlXS5jb250YWluZXIgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGVzdGVkQ29udGFpbmVyKys7XG4gICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGNvbnRhaW5lclJvbGVzID0gZGVzaWduUGF0dGVybnNbcm9sZV0uY29udGFpbmVyO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGNvbnRhaW5lcnNMZW5ndGggPSBjb250YWluZXJSb2xlcy5sZW5ndGg7ICFwYXNzZWQgJiYgaSA8IGNvbnRhaW5lcnNMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9IHBhcmVudFJvbGUgPT09IGNvbnRhaW5lclJvbGVzW2ldO1xuICAgICAgICAgICAgICAgIGlmIChwYXNzZWQpIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBhc3NlZCA9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHJvbGVOYW1lQXJyLnB1c2gocm9sZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmV0VG9rZW4xID0gbmV3IEFycmF5KCk7XG4gICAgICAgIHJldFRva2VuMS5wdXNoKHJvbGVOYW1lQXJyLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgIGxldCByZXRUb2tlbjIgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgcmV0VG9rZW4yLnB1c2goY29udGFpbmVyUm9sZXMuam9pbihcIiwgXCIpKTtcbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBbcnVsZUNvbnRleHRdLCAnJywgJycsIHBhc3NlZCA9PSB0cnVlID8gW10gOiBbcmV0VG9rZW4xLCByZXRUb2tlbjJdKTtcbiAgICAgICAgaWYgKHRlc3RlZENvbnRhaW5lciA9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSBlbHNlIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW3JldFRva2VuMS50b1N0cmluZygpLCByZXRUb2tlbjIudG9TdHJpbmcoKV0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfcmVnaW9uX2xhYmVsX3VuaXF1ZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX3JlZ2lvbl9sYWJlbF91bmlxdWVcIixcbiAgICBjb250ZXh0OiBcImFyaWE6cmVnaW9uXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9NdWx0aXBsZVJlZ2lvbnNVbmlxdWVMYWJlbF9JbXBsaWNpdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiYXJpYV9yZWdpb25fbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCI6IFwiYXJpYV9yZWdpb25fbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX3JlZ2lvbl9sYWJlbF91bmlxdWUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiVGhlIGVsZW1lbnQgd2l0aCBcXFwicmVnaW9uXFxcIiByb2xlIGhhcyBhIHVuaXF1ZSBsYWJlbCB0aGF0IGRlc2NyaWJlcyBpdHMgcHVycG9zZVwiLFxuICAgICAgICAgICAgXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIjogXCJNdWx0aXBsZSBlbGVtZW50cyB3aXRoIFxcXCJyZWdpb25cXFwiIHJvbGUgZG8gbm90IGhhdmUgdW5pcXVlIGxhYmVsc1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVhY2ggZWxlbWVudCB3aXRoIFxcXCJyZWdpb25cXFwiIHJvbGUgbXVzdCBoYXZlIGEgdW5pcXVlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgZHVwcGVkID0gQXJpYVV0aWwuaXNMYW5kbWFya05hbWVVbmlxdWUocnVsZUNvbnRleHQsIFwicmVnaW9uXCIpOyAgICBcbiAgICAgICAgaWYgKGR1cHBlZCA9PSBudWxsKSByZXR1cm4gbnVsbDsgXG4gICAgICAgIGlmIChkdXBwZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfcmVnaW9uX2xhYmVsbGVkOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfcmVnaW9uX2xhYmVsbGVkXCIsXG4gICAgY29udGV4dDogXCJhcmlhOnJlZ2lvblwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfUmVnaW9uTGFiZWxfSW1wbGljaXRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJcbiAgICAgICAgICAgIC8vIFwiRmFpbF8yXCI6IFwiRmFpbF8yXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9yZWdpb25fbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX3JlZ2lvbl9sYWJlbGxlZC5odG1sXCIsXG4gICAgICAgICAgICAvLyBcIkZhaWxfMlwiOiBcImFyaWFfcmVnaW9uX2xhYmVsbGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX3JlZ2lvbl9sYWJlbGxlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkVsZW1lbnQgd2l0aCBcXFwicmVnaW9uXFxcIiByb2xlIGRvZXMgbm90IGhhdmUgYSBsYWJlbFwiLFxuICAgICAgICAgICAgLy8gXCJGYWlsXzJcIjogXCJFbGVtZW50IHdpdGggXFxcInJlZ2lvblxcXCIgcm9sZSBpcyBub3QgbGFiZWxlZCB3aXRoICdhcmlhLWxhYmVsJyBvciAnYXJpYS1sYWJlbGxlZGJ5J1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVhY2ggZWxlbWVudCB3aXRoIFxcXCJyZWdpb25cXFwiIHJvbGUgbXVzdCBoYXZlIGEgbGFiZWwgdGhhdCBkZXNjcmliZXMgaXRzIHB1cnBvc2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICBsZXQgcGFzc2VkID0gQXJpYVV0aWwuaGFzQXJpYUxhYmVsKHJ1bGVDb250ZXh0KSB8fCBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInRpdGxlXCIpO1xuICAgICAgICBpZiAocGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX3JvbGVfYWxsb3dlZDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX3JvbGVfYWxsb3dlZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbcm9sZV1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX1ZhbGlkUm9sZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJGYWlsXzJcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IGBhcmlhX3JvbGVfYWxsb3dlZC5odG1sYCxcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IGBhcmlhX3JvbGVfYWxsb3dlZC5odG1sYCxcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IGBhcmlhX3JvbGVfYWxsb3dlZC5odG1sYCxcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogYGFyaWFfcm9sZV9hbGxvd2VkLmh0bWxgXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVsZW1lbnRzIG11c3QgaGF2ZSBhIHZhbGlkICdyb2xlJyBwZXIgQVJJQSBzcGVjaWZpY2F0aW9uXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIlRoZSByb2xlICd7MH0nIGRlZmluZWQgb24gdGhlIGVsZW1lbnQgaXMgbm90IHZhbGlkIHBlciBBUklBIHNwZWNpZmljYXRpb25cIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJTb21lIG9mIHRoZSByb2xlcywgJ3swfScsIGRlZmluZWQgb24gdGhlIGVsZW1lbnQgYXJlIG5vdCB2YWxpZCBwZXIgQVJJQSBzcGVjaWZpY2F0aW9uXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbIFwiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBudW06IFwiNC4xLjJcIiwgLy8gbnVtOiBbIFwiMi40LjRcIiwgXCJ4LnkuelwiIF0gYWxzbyBhbGxvd2VkXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICAvLyBUT0RPOiBBQ1Q6IFJlY2hlY2tcbiAgICBhY3Q6IFwiNjc0YjEwXCIsXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHJvbGVTdHIgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAocm9sZVN0ci5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhcmlhLWhpZGRlblwiKSAmJiBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWhpZGRlblwiKS50b0xvd2VyQ2FzZSgpID09PSBcInRydWVcIikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaW52YWxpZFJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXNVbmRlZmluZWRCeUFyaWEocnVsZUNvbnRleHQpO1xuXG4gICAgICAgIGlmICghaW52YWxpZFJvbGVzIHx8IGludmFsaWRSb2xlcy5sZW5ndGggPT09IDApXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IHJvbGVzID0gcm9sZVN0ci5zcGxpdCgvXFxzKy8pO1xuICAgICAgICAgICAgaWYgKGludmFsaWRSb2xlcy5sZW5ndGggPT09IHJvbGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMlwiLCBbaW52YWxpZFJvbGVzLmpvaW4oXCIsXCIpXSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGludmFsaWRSb2xlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiLCBbaW52YWxpZFJvbGVzLmpvaW4oXCIsXCIpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4gICAgIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBUYWJsZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9UYWJsZVV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfcm9sZV9yZWR1bmRhbnQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9yb2xlX3JlZHVuZGFudFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbcm9sZV1cIixcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiYXJpYV9yb2xlX3JlZHVuZGFudC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfcmVkdW5kYW50XCI6IFwiYXJpYV9yb2xlX3JlZHVuZGFudC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9yb2xlX3JlZHVuZGFudC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJBbiBleHBsaWNpdGx5LWFzc2lnbmVkIEFSSUEgcm9sZSBpcyBub3QgcmVkdW5kYW50IHdpdGggdGhlIGltcGxpY2l0IHJvbGUgb2YgdGhlIGVsZW1lbnRcIixcbiAgICAgICAgICAgIFwiZmFpbF9yZWR1bmRhbnRcIjogXCJUaGUgZXhwbGljaXRseS1hc3NpZ25lZCBBUklBIHJvbGUgXFxcInswfVxcXCIgaXMgcmVkdW5kYW50IHdpdGggdGhlIGltcGxpY2l0IHJvbGUgb2YgdGhlIGVsZW1lbnQgPHsxfT5cIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBbiBleHBsaWNpdGx5LWFzc2lnbmVkIEFSSUEgcm9sZSBzaG91bGQgbm90IGJlIHJlZHVuZGFudCB3aXRoIHRoZSBpbXBsaWNpdCByb2xlIG9mIHRoZSBlbGVtZW50XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCJdLFxuICAgICAgICBcIm51bVwiOiBbXCJBUklBXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgZWxlbU5hbWUgPSBydWxlQ29udGV4dC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIFxuICAgICAgICBsZXQgYXJpYVJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXMocnVsZUNvbnRleHQsIGZhbHNlKTtcbiAgICAgICAgaWYgKCFhcmlhUm9sZXMgfHwgYXJpYVJvbGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICAgIC8vIHRoZSBpbnZhbGlkIHJvbGUgY2FzZTogaGFuZGxlZCBieSBScHRfQXJpYV9WYWxpZFJvbGUuIElnbm9yZSB0byBhdm9pZCBkdXBsaWNhdGVkIHJlcG9ydFxuICAgICAgICBsZXQgcm9sZV9kZWZpbmVkID0gQXJpYVV0aWwuYXJlUm9sZXNEZWZpbmVkKGFyaWFSb2xlcyk7XG4gICAgICAgIGlmICghcm9sZV9kZWZpbmVkKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gZGVwZW5kZW5jeSBjaGVjazogaWYgaXQncyBhbHJlYWR5IGZhaWxlZCBpbiB0aGUgcGFyZW50IHJlbGF0aW9uLCB0aGVuIHNraXAgdGhpcyBjaGVja1xuICAgICAgICAvLyBjb21tZW50IG91dCB0byByZXBvcnQgdGhlIHJlZHVuZGFudCByb2xlIGZvciB0YWJsZSBlbGVtZW50OiB0ciwgdGQgJiB0aFxuICAgICAgICAvKippZiAoW1widGRcIiwgXCJ0aFwiLCBcInRyXCJdLmluY2x1ZGVzKGVsZW1OYW1lKSkge1xuICAgICAgICAgICAgbGV0IHBhcmVudFJvbGUgPSBUYWJsZVV0aWwuaXNUYWJsZURlc2NlbmRhbnQoY29udGV4dEhpZXJhcmNoaWVzKTtcbiAgICAgICAgICAgIGlmIChwYXJlbnRSb2xlICE9PSBudWxsICYmIHBhcmVudFJvbGUubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSovXG5cbiAgICAgICAgbGV0IGltcGxpY2l0Um9sZXMgPSBBcmlhVXRpbC5nZXRJbXBsaWNpdFJvbGUocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoIWltcGxpY2l0Um9sZXMgfHwgaW1wbGljaXRSb2xlcy5sZW5ndGggPT09IDApXG4gICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcblxuICAgICAgICBsZXQgcmV0ID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJpYVJvbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIWltcGxpY2l0Um9sZXMuaW5jbHVkZXMoYXJpYVJvbGVzW2ldKSkgIFxuICAgICAgICAgICAgICAgIHJldC5wdXNoKFJ1bGVQYXNzKFwicGFzc1wiKSk7XG4gICAgICAgICAgICBlbHNlICAgICBcbiAgICAgICAgICAgICAgICByZXQucHVzaChSdWxlRmFpbChcImZhaWxfcmVkdW5kYW50XCIsIFthcmlhUm9sZXNbaV0sIGVsZW1OYW1lXSkpO1xuICAgICAgICB9ICBcbiAgICAgICAgaWYgKHJldC5sZW5ndGggPiAwKSAgXG4gICAgICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgICByZXR1cm4gbnVsbDsgICAgXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfc2VhcmNoX2xhYmVsX3VuaXF1ZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX3NlYXJjaF9sYWJlbF91bmlxdWVcIixcbiAgICBjb250ZXh0OiBcImFyaWE6c2VhcmNoXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9NdWx0aXBsZVNlYXJjaExhbmRtYXJrc1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiYXJpYV9zZWFyY2hfbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCI6IFwiYXJpYV9zZWFyY2hfbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX3NlYXJjaF9sYWJlbF91bmlxdWUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiVGhlIGVsZW1lbnQgd2l0aCBcXFwic2VhcmNoXFxcIiByb2xlIGhhcyBhIHVuaXF1ZSBsYWJlbCB0aGF0IGRlc2NyaWJlcyBpdHMgcHVycG9zZVwiLFxuICAgICAgICAgICAgXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIjogXCJNdWx0aXBsZSBlbGVtZW50cyB3aXRoIFxcXCJzZWFyY2hcXFwiIHJvbGUgZG8gbm90IGhhdmUgdW5pcXVlIGxhYmVsc1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVhY2ggZWxlbWVudCB3aXRoIFxcXCJzZWFyY2hcXFwiIHJvbGUgbXVzdCBoYXZlIGEgdW5pcXVlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogZGVwcmVjYXRlZCB0aGUgcnVsZSBvbiAwMS8yNy8yMDI1XG4gICAgICogcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSwqL1xuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IGR1cHBlZCA9IEFyaWFVdGlsLmlzTGFuZG1hcmtOYW1lVW5pcXVlKHJ1bGVDb250ZXh0LCBcInNlYXJjaFwiLCB0cnVlKTsgICAgXG4gICAgICAgIGlmIChkdXBwZWQgPT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICBpZiAoZHVwcGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfcm9sZV92YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX3JvbGVfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJhcmlhX2F0dHJpYnV0ZV9hbGxvd2VkXCJdLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiYXJpYV9zZW1hbnRpY3Nfcm9sZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiRmFpbF8yXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9yb2xlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV9yb2xlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiYXJpYV9yb2xlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX3JvbGVfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUaGUgQVJJQSByb2xlICd7MH0nIGlzIG5vdCB2YWxpZCBmb3IgdGhlIGVsZW1lbnQgPHsxfT5cIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiVGhlIEFSSUEgcm9sZSAnezB9JyBpcyBub3QgdmFsaWQgZm9yIHRoZSBlbGVtZW50IDx7MX0+IGFuZCBtYXkgYmUgaWdub3JlZCBieSB0aGUgYnJvd3NlciBzaW5jZSB0aGUgZWxlbWVudCBpcyBmb2N1c2FibGVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBUklBIHJvbGVzIG11c3QgYmUgdmFsaWQgZm9yIHRoZSBlbGVtZW50IHRvIHdoaWNoIHRoZXkgYXJlIGFzc2lnbmVkXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgdGFnTmFtZSA9IHJ1bGVDb250ZXh0LnRhZ05hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgLy8gb25seSBjaGVrIGVsZW1lbnQgKDEpIGFuZCBmcmFnbWVudCBub2RlcyAoMTEpXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5ub2RlVHlwZSAhPT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLylcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICAvLyB0aGUgaW52YWxpZCByb2xlIGNhc2U6IGhhbmRsZWQgYnkgYXJpYV9yb2xlX2FsbG93ZWQuIElnbm9yZSB0byBhdm9pZCBkdXBsaWNhdGVkIHJlcG9ydFxuICAgICAgICBjb25zdCB1bmRlZmluZWRSb2xlcyA9IEFyaWFVdGlsLmdldFJvbGVzVW5kZWZpbmVkQnlBcmlhKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKHVuZGVmaW5lZFJvbGVzICYmIHVuZGVmaW5lZFJvbGVzLmxlbmd0aCA+IDApIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCBkZXByZWNhdGVkUm9sZXMgPSBBcmlhVXRpbC5nZXREZXByZWNhdGVkQXJpYVJvbGVzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKGRlcHJlY2F0ZWRSb2xlcyAmJiBkZXByZWNhdGVkUm9sZXMubGVuZ3RoID4gMCkgcmV0dXJuIG51bGw7XG4gICAgICAgIGNvbnN0IGRlcHJlY2F0ZWRBdHRyaWJ1dGVzID0gQXJpYVV0aWwuZ2V0RGVwcmVjYXRlZEFyaWFBdHRyaWJ1dGVzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKGRlcHJlY2F0ZWRBdHRyaWJ1dGVzICYmIGRlcHJlY2F0ZWRBdHRyaWJ1dGVzLmxlbmd0aCA+IDApIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIGRlcGVuZGVuY3kgY2hlY2s6IGlmIGl0J3MgYWxyZWFkeSBmYWlsZWQsIHRoZW4gc2tpcFxuICAgICAgICBpZiAoW1widGRcIiwgXCJ0aFwiLCBcInRyXCJdLmluY2x1ZGVzKHRhZ05hbWUpKSB7XG4gICAgICAgICAgICBsZXQgcGFyZW50Um9sZSA9IENvbW1vblV0aWwuaXNUYWJsZURlc2NlbmRhbnQoY29udGV4dEhpZXJhcmNoaWVzKTtcbiAgICAgICAgICAgIGlmIChwYXJlbnRSb2xlICE9PSBudWxsICYmIHBhcmVudFJvbGUubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBkb21Sb2xlczogc3RyaW5nW10gPSBBcmlhVXRpbC5nZXRVc2VyRGVmaW5lZFJvbGVzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKCFkb21Sb2xlcyB8fCBkb21Sb2xlcy5sZW5ndGggPT09MClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIGNoZWNrIHRoZSAnZ2VuZXJpYycgcm9sZSBmaXJzdFxuICAgICAgICBpZiAoZG9tUm9sZXMuaW5jbHVkZXMoJ2dlbmVyaWMnKSlcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiLCBbXCJnZW5lcmljXCIsIHRhZ05hbWVdKTtcbiAgICAgICAgXG4gICAgICAgIGxldCBpbnZhbGlkUm9sZXMgPSBBcmlhVXRpbC5nZXRJbnZhbGlkUm9sZXMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoaW52YWxpZFJvbGVzID09PSBudWxsIHx8IGludmFsaWRSb2xlcy5sZW5ndGggPT09MClcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiLCBbZG9tUm9sZXMuam9pbihcIiwgXCIpLCB0YWdOYW1lXSk7XG5cbiAgICAgICAgaWYgKGludmFsaWRSb2xlcy5pbmNsdWRlcyhcInByZXNlbnRhdGlvblwiKSB8fCBpbnZhbGlkUm9sZXMuaW5jbHVkZXMoXCJub25lXCIpICYmIENvbW1vblV0aWwuaXNUYWJiYWJsZShydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzJcIiwgW2ludmFsaWRSb2xlcy5qb2luKFwiLCBcIiksIHRhZ05hbWVdKTtcbiAgICAgICAgXG4gICAgICAgIGlmIChpbnZhbGlkUm9sZXMubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiLCBbaW52YWxpZFJvbGVzLmpvaW4oXCIsIFwiKSwgdGFnTmFtZV0pO1xuICAgICAgICBcbiAgICAgICAgaWYgKGRvbVJvbGVzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIiwgW2RvbVJvbGVzLmpvaW4oXCIsIFwiKSwgdGFnTmFtZV0pO1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufVxuXG4vLyBUaGlzIHJ1bGUgaXMgaW4gdGhlIHNhbWUgZmlsZSBiZWNhdXNlIHRoZXJlIGlzIGEgZGVwZW5kZW5jeSB0aGF0IGFyaWFfcm9sZV92YWxpZCBydW5zIGZpcnN0LFxuLy8gYW5kIHRoZSBpbmZvIGlzIHBhc3NlZCBieSBjYWNoZSwgYnV0IHRoZXJlIGlzbid0IGEgZGVwZW5kZW5jeSBpbiB0aGUgRmFpbF8yIHNjZW5hcmlvLCBzbyByZWd1bGFyXG4vLyBkZXBlbmRlbmN5IGNhbm5vdCBiZSB1c2VkXG5leHBvcnQgY29uc3QgYXJpYV9hdHRyaWJ1dGVfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9hdHRyaWJ1dGVfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgLy8gVGhlIHRoZSBBUklBIHJvbGUgaXMgY29tcGxldGVseSBpbnZhbGlkLCBza2lwIHRoaXMgY2hlY2tcbiAgICBkZXBlbmRlbmNpZXM6IFtcImFyaWFfYXR0cmlidXRlX2RlcHJlY2F0ZWRcIiwgXCJhcmlhX3JvbGVfdmFsaWRcIl0sXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJhcmlhX2F0dHJpYnV0ZV9hbGxvd2VkXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc1wiOiBcIlBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF9pbnZhbGlkX3JvbGVfYXR0clwiOiBcIkZhaWxfaW52YWxpZF9yb2xlX2F0dHJcIixcbiAgICAgICAgICAgIFwiRmFpbF9pbnZhbGlkX2ltcGxpY2l0X3JvbGVfYXR0clwiOiBcIkZhaWxfaW52YWxpZF9pbXBsaWNpdF9yb2xlX2F0dHJcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfYXR0cmlidXRlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc1wiOiBcImFyaWFfYXR0cmlidXRlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF9pbnZhbGlkX3JvbGVfYXR0clwiOiBcImFyaWFfYXR0cmlidXRlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF9pbnZhbGlkX2ltcGxpY2l0X3JvbGVfYXR0clwiOiBcImFyaWFfYXR0cmlidXRlX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBUklBIGF0dHJpYnV0ZXMgc2hvdWxkIGJlIHZhbGlkIGZvciB0aGUgZWxlbWVudCBhbmQgQVJJQSByb2xlIHRvIHdoaWNoIHRoZXkgYXJlIGFzc2lnbmVkXCIsXG4gICAgICAgICAgICBcIlBhc3NcIjogXCJBUklBIGF0dHJpYnV0ZXMgYXJlIHZhbGlkIGZvciB0aGUgZWxlbWVudCBhbmQgQVJJQSByb2xlXCIsXG4gICAgICAgICAgICBcIkZhaWxfaW52YWxpZF9yb2xlX2F0dHJcIjogXCJUaGUgQVJJQSBhdHRyaWJ1dGVzIFxcXCJ7MH1cXFwiIGFyZSBub3QgdmFsaWQgZm9yIHRoZSBlbGVtZW50IDx7MX0+IHdpdGggQVJJQSByb2xlIFxcXCJ7Mn1cXFwiXCIsXG4gICAgICAgICAgICBcIkZhaWxfaW52YWxpZF9pbXBsaWNpdF9yb2xlX2F0dHJcIjogXCJUaGUgQVJJQSBhdHRyaWJ1dGVzIFxcXCJ7MH1cXFwiIGFyZSBub3QgdmFsaWQgZm9yIHRoZSBlbGVtZW50IDx7MX0+IHdpdGggaW1wbGljaXQgQVJJQSByb2xlIFxcXCJ7Mn1cXFwiXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCJBUklBXCJdLCAvL3JlbW92ZWQgbWFwcGluZyB0byA0LjEuMiBmcm9tIGhlcmUgYW5kIGhlbHBcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXCI1YzAxZWFcIiwgeyBcIjQ2Y2E3ZlwiOiB7IFwiUGFzc1wiOiBcInBhc3NcIiwgXCJGYWlsX2ludmFsaWRfcm9sZV9hdHRyXCI6IFwiZmFpbFwiLCBcIkZhaWxfaW52YWxpZF9pbXBsaWNpdF9yb2xlX2F0dHJcIjogXCJmYWlsXCJ9fV0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy8gb25seSBjaGVrIGVsZW1lbnQgKDEpXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5ub2RlVHlwZSAhPT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLylcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIGlnbm9yZSBpZiBubyBhcmlhIGF0dHJpYnV0ZVxuICAgICAgICBsZXQgYXJpYUF0dHJpYnV0ZXM6c3RyaW5nW10gPSBBcmlhVXRpbC5nZXRVc2VyRGVmaW5lZEFyaWFBdHRyaWJ1dGVzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKGFyaWFBdHRyaWJ1dGVzID09PSBudWxsIHx8IGFyaWFBdHRyaWJ1dGVzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgIFxuICAgICAgICBsZXQgcm9sZXM6IHN0cmluZ1tdID0gQXJpYVV0aWwuZ2V0VXNlckRlZmluZWRSb2xlcyhydWxlQ29udGV4dCk7XG4gICAgICAgIGxldCBleHBsaWNpdCA9IHRydWU7XG4gICAgICAgIGlmIChyb2xlcyAmJiByb2xlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvLyB0aGUgaW52YWxpZCByb2xlIGNhc2U6IGhhbmRsZWQgYnkgUnB0X0FyaWFfVmFsaWRSb2xlLiBJZ25vcmUgdG8gYXZvaWQgZHVwbGljYXRlZCByZXBvcnRcbiAgICAgICAgICAgIGlmICghQXJpYVV0aWwuYXJlUm9sZXNEZWZpbmVkKHJvbGVzKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vbm8gZXhwbGljaXQgcm9sZSBkZWZpbmVkXG4gICAgICAgICAgICByb2xlcyA9ICBBcmlhVXRpbC5nZXRJbXBsaWNpdFJvbGUocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgZXhwbGljaXQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgbGV0IHRhZ05hbWUgPSBydWxlQ29udGV4dC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGxldCBmYWlsZWRBdHRyaWJ1dGVzID0gQXJpYVV0aWwuZ2V0SW52YWxpZEFyaWFBdHRyaWJ1dGVzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKCFmYWlsZWRBdHRyaWJ1dGVzIHx8IGZhaWxlZEF0dHJpYnV0ZXMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc1wiLCBbYXJpYUF0dHJpYnV0ZXMuam9pbihcIiwgXCIpLCB0YWdOYW1lLCByb2xlcy5qb2luKFwiLCBcIildKTtcblxuICAgICAgICBpZiAocm9sZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgaWYgKGV4cGxpY2l0KVxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfaW52YWxpZF9yb2xlX2F0dHJcIiwgW2ZhaWxlZEF0dHJpYnV0ZXMuam9pbihcIiwgXCIpLCB0YWdOYW1lLCByb2xlcy5qb2luKFwiLCBcIildKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsX2ludmFsaWRfaW1wbGljaXRfcm9sZV9hdHRyXCIsIFtmYWlsZWRBdHRyaWJ1dGVzLmpvaW4oXCIsIFwiKSwgdGFnTmFtZSwgcm9sZXMuam9pbihcIiwgXCIpXSk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfaW52YWxpZF9yb2xlX2F0dHJcIiwgW2ZhaWxlZEF0dHJpYnV0ZXMuam9pbihcIiwgXCIpLCB0YWdOYW1lLCBcIm5vbmVcIl0pO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBDYWNoZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfdG9vbGJhcl9sYWJlbF91bmlxdWU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV90b29sYmFyX2xhYmVsX3VuaXF1ZVwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTp0b29sYmFyXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9NdWx0aXBsZVRvb2xiYXJVbmlxdWVMYWJlbFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfdG9vbGJhcl9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX3Rvb2xiYXJfbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX3Rvb2xiYXJfbGFiZWxfdW5pcXVlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiTXVsdGlwbGUgZWxlbWVudHMgd2l0aCBcXFwidG9vbGJhclxcXCIgcm9sZXMgZG8gbm90IGhhdmUgdW5pcXVlIGxhYmVsc1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVhY2ggZWxlbWVudCB3aXRoIFxcXCJ0b29sYmFyXFxcIiByb2xlIG11c3QgaGF2ZSBhIHVuaXF1ZSBsYWJlbCB0aGF0IGRlc2NyaWJlcyBpdHMgcHVycG9zZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi40LjFcIl0sIC8vdXBkYXRlZCBtYXBwaW5nIHRvIG1hdGNoIG90aGVyIGxhbmRtYXJrIHJlZ2lvbnMgcnVsZXNcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBDb25zaWRlciB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyB0aGF0IGlzIHNldCBieSB0aGUgcnVsZXNcbiAgICAgICAgLy8gQWxzbywgY29uc2lkZXIgSW1wbGljaXQgcm9sZSBjaGVja2luZy5cbiAgICAgICAgbGV0IGxhbmRtYXJrcyA9IENvbW1vblV0aWwuZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW4oXG4gICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgXCJ0b29sYmFyXCIsXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgdHJ1ZVxuICAgICAgICApO1xuICAgICAgICBpZiAobGFuZG1hcmtzLmxlbmd0aCA9PT0gMCB8fCBsYW5kbWFya3MubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBkdXBlcyA9IENhY2hlVXRpbC5nZXRDYWNoZShcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICBcImFyaWFfdG9vbGJhcl9sYWJlbF91bmlxdWVcIixcbiAgICAgICAgICAgIG51bGxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFkdXBlcykge1xuICAgICAgICAgICAgZHVwZXMgPSBBcmlhVXRpbC5maW5kQXJpYUxhYmVsRHVwZXMobGFuZG1hcmtzKTtcbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShcbiAgICAgICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgICAgIFwiYXJpYV90b29sYmFyX2xhYmVsX3VuaXF1ZVwiLFxuICAgICAgICAgICAgICAgIGR1cGVzXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGxldCBteUxhYmVsID0gQXJpYVV0aWwuZ2V0QXJpYUxhYmVsKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgbGV0IHBhc3NlZCA9XG4gICAgICAgICAgICBteUxhYmVsICE9PSBcIlwiICYmICghKG15TGFiZWwgaW4gZHVwZXMpIHx8IGR1cGVzW215TGFiZWxdIDw9IDEpO1xuXG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW215TGFiZWxdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBBUklBTWFwcGVyIH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQU1hcHBlclwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG5pbXBvcnQgeyBBUklBRGVmaW5pdGlvbnMgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBRGVmaW5pdGlvbnNcIjtcbmltcG9ydCB7IERPTVV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfd2lkZ2V0X2xhYmVsbGVkOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfd2lkZ2V0X2xhYmVsbGVkXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfV2lkZ2V0TGFiZWxzX0ltcGxpY2l0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV93aWRnZXRfbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX3dpZGdldF9sYWJlbGxlZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfd2lkZ2V0X2xhYmVsbGVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJJbnRlcmFjdGl2ZSBjb21wb25lbnQgbXVzdCBoYXZlIGEgcHJvZ3JhbW1hdGljYWxseSBhc3NvY2lhdGVkIG5hbWVcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiSW50ZXJhY3RpdmUgY29tcG9uZW50IHdpdGggQVJJQSByb2xlICd7MH0nIGRvZXMgbm90IGhhdmUgYSBwcm9ncmFtbWF0aWNhbGx5IGFzc29jaWF0ZWQgbmFtZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogXCJtNmIxcTNcIixcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvKiByZW1vdmVkIHRoZSByb2xlIGNoZWNrIHJvbGU9IHByZXNlbnRhdGlvbiBhbmQgcm9sZT1ub25lIHNpbmNlIHRoZXNlIDIgcm9sZXMgYXJlIG5vdCBpbiB0aGUgbGlzdCBvZiB3aWRnZXQgdHlwZSByb2xlcyAqL1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidHlwZVwiKSAmJlxuICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInR5cGVcIikgPT09IFwiaGlkZGVuXCIpIHx8XG4gICAgICAgICAgICAoQXJpYVV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShydWxlQ29udGV4dCwgXCJjb21ib2JveFwiKSAmJlxuICAgICAgICAgICAgICAgICEoXG4gICAgICAgICAgICAgICAgICAgIEFyaWFVdGlsLmhhc1JvbGVJblNlbWFudGljcyhydWxlQ29udGV4dCwgXCJ0ZXh0Ym94XCIpIHx8XG4gICAgICAgICAgICAgICAgICAgIEFyaWFVdGlsLmhhc1JvbGVJblNlbWFudGljcyhydWxlQ29udGV4dCwgXCJzZWFyY2hib3hcIilcbiAgICAgICAgICAgICAgICApKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gZGlhZ25vc2UgdGhhdCBhIGNvbWJvYm94IGlucHV0IHRleHRib3ggaGFzIGEgbGFiZWwoZ2l0aHViIGlzc3VlICMxMTA0KVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZWxlbVJvbGUgPSBBUklBTWFwcGVyLm5vZGVUb1JvbGUocnVsZUNvbnRleHQpO1xuICAgICAgICBsZXQgdGFnTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgLy8gSGFuZGxlZCBieSBpbnB1dF9sYWJlbF9leGlzdHNcbiAgICAgICAgbGV0IHNraXBSb2xlcyA9IFtcbiAgICAgICAgICAgIFwiYnV0dG9uXCIsXG4gICAgICAgICAgICBcImNoZWNrYm94XCIsXG4gICAgICAgICAgICBcImNvbWJvYm94XCIsXG4gICAgICAgICAgICBcImxpc3Rib3hcIixcbiAgICAgICAgICAgIFwibWVudWl0ZW1jaGVja2JveFwiLFxuICAgICAgICAgICAgXCJtZW51aXRlbXJhZGlvXCIsXG4gICAgICAgICAgICBcInJhZGlvXCIsXG4gICAgICAgICAgICBcInNlYXJjaGJveFwiLFxuICAgICAgICAgICAgXCJzbGlkZXJcIixcbiAgICAgICAgICAgIFwic3BpbmJ1dHRvblwiLFxuICAgICAgICAgICAgXCJzd2l0Y2hcIixcbiAgICAgICAgICAgIFwidGV4dGJveFwiLFxuICAgICAgICAgICAgXCJwcm9ncmVzc2JhclwiLFxuICAgICAgICAgICAgXCJsaW5rXCIsXG4gICAgICAgIF07XG4gICAgICAgIGlmIChza2lwUm9sZXMuaW5jbHVkZXMoZWxlbVJvbGUpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGFnTmFtZSA9PT0gXCJvdXRwdXRcIiB8fFxuICAgICAgICAgICAgKHRhZ05hbWUgPT09IFwiaW5wdXRcIiAmJlxuICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInR5cGVcIikgPT09IFwiZmlsZVwiKVxuICAgICAgICApIHtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInJvbGVcIikpIHtcbiAgICAgICAgICAgIC8vIEZvcm0vaW5wdXQgZWxlbWVudHMgYXJlIGNoZWNrZWQgYnkgRzQxLCB3ZSBza2lwIHRoZW0gZnJvbSB0aGlzIHJ1bGUuIEdpdGh1YiBpc3N1ZSA0NDlcbiAgICAgICAgICAgIGxldCBza2lwRWxlbWVudHMgPSBbXG4gICAgICAgICAgICAgICAgXCJpbnB1dFwiLFxuICAgICAgICAgICAgICAgIFwidGV4dGFyZWFcIixcbiAgICAgICAgICAgICAgICBcInNlbGVjdFwiLFxuICAgICAgICAgICAgICAgIFwiYnV0dG9uXCIsXG4gICAgICAgICAgICAgICAgXCJkYXRhbGlzdFwiLFxuICAgICAgICAgICAgICAgIFwib3B0Z3JvdXBcIixcbiAgICAgICAgICAgICAgICBcIm9wdGlvblwiLFxuICAgICAgICAgICAgICAgIFwia2V5Z2VuXCIsXG4gICAgICAgICAgICAgICAgXCJvdXRwdXRcIixcbiAgICAgICAgICAgICAgICBcInByb2dyZXNzXCIsXG4gICAgICAgICAgICAgICAgXCJtZXRlclwiLFxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBza2lwRWxlbWVudHMuaW5kZXhPZihydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSAhPVxuICAgICAgICAgICAgICAgIC0xXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGF2b2lkIGRpYWdub3NpbmcgdGhlIHBvcHVwIGxpc3Qgb2YgYSBjb21ib2JveC5cbiAgICAgICAgbGV0IHJvbGVzVG9DaGVjayA9IFtcImxpc3Rib3hcIiwgXCJ0cmVlXCIsIFwiZ3JpZFwiLCBcImRpYWxvZ1wiXTtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByb2xlc1RvQ2hlY2subGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGlmIChBcmlhVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MocnVsZUNvbnRleHQsIHJvbGVzVG9DaGVja1tqXSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgY29tYm9ib3hlcyA9IENvbW1vblV0aWwuZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW4oXG4gICAgICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIFwiY29tYm9ib3hcIixcbiAgICAgICAgICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgdHJ1ZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBjb21ib2JveGVzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjb21ib2JveCA9IGNvbWJvYm94ZXNba107XG4gICAgICAgICAgICAgICAgICAgIGxldCBhcmlhX293bnMgPSBDb21tb25VdGlsLmdldEVsZW1lbnRBdHRyaWJ1dGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21ib2JveCxcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiYXJpYS1vd25zXCJcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFyaWFfb3ducykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG93bnMgPSBDb21tb25VdGlsLm5vcm1hbGl6ZVNwYWNpbmcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYV9vd25zLnRyaW0oKVxuICAgICAgICAgICAgICAgICAgICAgICAgKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG93bnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgb3duZWQgPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZUNvbnRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG93bnNbaV1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvd25lZCA9PT0gcnVsZUNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGxldCBwcm9oaWJpdGVkID0gZmFsc2U7XG4gICAgICAgIGxldCBkZXNpZ25QYXR0ZXJucyA9IEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJucztcbiAgICAgICAgLy9nZXQgYXR0cmlidXRlIHJvbGVzIGFzIHdlbGwgYXMgaW1wbGljaXQgcm9sZXMuXG4gICAgICAgIGxldCByb2xlcyA9IEFyaWFVdGlsLmdldFJvbGVzKHJ1bGVDb250ZXh0LCB0cnVlKTtcbiAgICAgICAgbGV0IG51bVdpZGdldHNUZXN0ZWQgPSAwO1xuICAgICAgICBsZXQgaW50ZXJhY3RpdmVSb2xlVHlwZXMgPSBbXCJ3aWRnZXRcIiwgXCJsaXZlUmVnaW9uXCIsIFwid2luZG93XCJdO1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuZ3RoID0gcm9sZXMubGVuZ3RoOyBwYXNzZWQgJiYgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBsZXQgcGF0dGVybiA9IGRlc2lnblBhdHRlcm5zW3JvbGVzW2ldXTtcblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHBhdHRlcm4gJiZcbiAgICAgICAgICAgICAgICBwYXR0ZXJuLm5hbWVSZXF1aXJlZCAmJlxuICAgICAgICAgICAgICAgIHBhdHRlcm4ucm9sZVR5cGUgJiZcbiAgICAgICAgICAgICAgICBpbnRlcmFjdGl2ZVJvbGVUeXBlcy5pbmNsdWRlcyhwYXR0ZXJuLnJvbGVUeXBlKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgKytudW1XaWRnZXRzVGVzdGVkO1xuXG4gICAgICAgICAgICAgICAgLy8gQWxsIHdpZGdldHMgbWF5IGhhdmUgYW4gYXV0aG9yIHN1cHBsaWVkIGFjY2Vzc2libGUgbmFtZS5cbiAgICAgICAgICAgICAgICAvLyBUaXRsZSBpcyBsZWdhbCwgYnV0IGRvbid0IGFkdmVydGlzZSBpdHMgdXNlIGluIGRvY3VtZW50YXRpb24uXG4gICAgICAgICAgICAgICAgLy8gRW5jb3VyYWdlIHVzZSBvZiBhcmlhLWxhYmVsLCBhcmlhLWxhYmVsbGVkYnkgb3IgaHRtbCBsYWJlbCBlbGVtZW50LlxuICAgICAgICAgICAgICAgIHBhc3NlZCA9XG4gICAgICAgICAgICAgICAgICAgIEFyaWFVdGlsLmhhc0FyaWFMYWJlbChydWxlQ29udGV4dCkgfHxcbiAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJ0aXRsZVwiKSB8fFxuICAgICAgICAgICAgICAgICAgICBDb21tb25VdGlsLmdldExhYmVsRm9yRWxlbWVudEhpZGRlbihydWxlQ29udGV4dCwgdHJ1ZSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICFwYXNzZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgcGF0dGVybi5uYW1lRnJvbSAmJlxuICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuLm5hbWVGcm9tLmluZGV4T2YoXCJjb250ZW50c1wiKSA+PSAwXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNlZSBpZiB3aWRnZXQncyBhY2Nlc3NpYmxlIG5hbWUgaXMgc3VwcGxpZWQgYnkgZWxlbWVudCdzIGlubmVyIHRleHRcbiAgICAgICAgICAgICAgICAgICAgLy8gbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdXG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IENvbW1vblV0aWwuaGFzSW5uZXJDb250ZW50T3JBbHQocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIGl0IGhhcyBpbXBsaWNpdCBsYWJlbCwgbGlrZSA8bGFiZWw+PGlucHV0IC4uLi4+YWJjIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IENvbW1vblV0aWwuaGFzSW1wbGljaXRMYWJlbChydWxlQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAhcGFzc2VkICYmXG4gICAgICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbWdcIiAmJlxuICAgICAgICAgICAgICAgICAgICAhcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwicm9sZVwiKSAmJlxuICAgICAgICAgICAgICAgICAgICBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhbHRcIilcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID1cbiAgICAgICAgICAgICAgICAgICAgICAgIERPTVV0aWwuY2xlYW5XaGl0ZXNwYWNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFsdFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgKS50cmltKCkubGVuZ3RoID4gMDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAocGF0dGVybi5uYW1lRnJvbS5pbmRleE9mKFwicHJvaGliaXRlZFwiKSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb2hpYml0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChudW1XaWRnZXRzVGVzdGVkID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSBlbHNlIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW2VsZW1Sb2xlXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvL1RPRE9cbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIGlmIChwcm9oaWJpdGVkKSB7XG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8yXCIpO1xuICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhc2NpaWFydF9hbHRfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcImFzY2lpYXJ0X2FsdF9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTpwcmUsIGRvbTpsaXN0aW5nLCBkb206eG1wLCBkb206cGxhaW50ZXh0XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfUHJlX0FTQ0lJQXJ0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFzY2lpYXJ0X2FsdF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcImFzY2lpYXJ0X2FsdF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFzY2lpYXJ0X2FsdF9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0aGF0IEFTQ0lJIGFydCBoYXMgYSB0ZXh0IGFsdGVybmF0aXZlXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQVNDSUkgYXJ0IG11c3QgaGF2ZSBhIHRleHQgYWx0ZXJuYXRpdmVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBEZWNpc2lvbiBpbiBwbGFubmluZyA5LzcvMjMgdGhhdCB0aGlzIHJ1bGUgY2F1c2VzIG1vcmUgcmV2aWV3cyB0aGF0IHdlIHNlZSBhY3R1YWwgcHJvYmxlbXMgaW4gY29udGVudCwgc28gdHVybiB0aGVzZSBydWxlcyBvZmZcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICAqL1xuICAgIHJ1bGVzZXRzOiBbXSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG5cbiAgICAgICAgLy8gRml4IGZvciBJRFdCIHdyaXRlcnMuIERvbid0IHRyaWdnZXIgaWYgY29udGVudCBpcyBpbiBhIGNvZGUgZWxlbWVudC4gIFRoZSBjb2RlIGVsZW1lbnQgaXMgc2VhcmNoZWQgZm9yXG4gICAgICAgIC8vIGluIHZhcmlvdXMgcGxhY2VzIGJlY2F1c2Ugb2YgdGhlIHdlaXJkIHdheSB2YXJpb3VzIGJyb3dzZXJzIHJlbmRlciA8Y29kZT48cHJlPjwvcHJlPjwvY29kZS4gIEZpcmVmb3gsXG4gICAgICAgIC8vIEh0bWxVbml0IGFuZCBDaHJvbWUgYWxsIHJlbmRlciBkaWZmZXJlbnRseS4gIEZpcmVmb3g6IDxjb2RlPjwvY29kZT48cHJlPjwvcHJlPiAgSHRtbFVuaXQ6IDwvY29kZT48cHJlPjxjb2RlPjwvY29kZT48L3ByZT5cbiAgICAgICAgLy8gU2VlIHVuaXQgdGVzdCBDb2RlRWxlbWVudEFib3ZlUHJlRWxlbWVudC5odG1sLiAgRG9uJ3Qga25vdyBob3cgUlBUIHJlbmRlcnMsIHNvIGNvdmVyIGFsbCB0aGUgYmFzZXMuXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09IFwicHJlXCIpIHtcbiAgICAgICAgICAgIGlmICgocnVsZUNvbnRleHQucHJldmlvdXNTaWJsaW5nICYmIHJ1bGVDb250ZXh0LnByZXZpb3VzU2libGluZy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09IFwiY29kZVwiKSB8fFxuICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiY29kZVwiKS5sZW5ndGggPiAwIHx8XG4gICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgXCJjb2RlXCIpKSB7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgbGV0IHR4dFZhbHVlID0gQ29tbW9uVXRpbC5nZXRJbm5lclRleHQocnVsZUNvbnRleHQpO1xuICAgICAgICBsZXQgbm9uQWxwaGFOdW1lcmljTm9yU3BhY2VDb3VudCA9IDA7XG4gICAgICAgIGxldCBhbHBoTnVtU2FtZUNoYXJhY3RlckNvdW50ID0gMDtcbiAgICAgICAgbGV0IGxhc3RDaGFyYWN0ZXIgPSBcIlwiO1xuXG4gICAgICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgdGV4dCBjb250ZW50XG4gICAgICAgIGZvciAobGV0IGlkeCA9IDA7IHBhc3NlZCAmJiAoaWR4IDwgdHh0VmFsdWUubGVuZ3RoKTsgKytpZHgpIHtcbiAgICAgICAgICAgIGxldCBjaFN0ciA9IHR4dFZhbHVlLnN1YnN0cihpZHgsIDEpO1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgaXQgaXMgYWxwaGFudW1lcmljIG9yIHB1bmN0dWF0aW9uXG4gICAgICAgICAgICBpZiAoL1tcXHchQCMkJSZcXCooKS4sP1xcW1xcXXt9PD49XCI6XFwvXFxcXC1dLy50ZXN0KGNoU3RyKSkge1xuICAgICAgICAgICAgICAgIC8vIERldGVjdCBzYW1lIGNoYXJhY3RlciBzZXF1ZW5jZVxuICAgICAgICAgICAgICAgIGlmIChsYXN0Q2hhcmFjdGVyID09IGNoU3RyKSB7XG4gICAgICAgICAgICAgICAgICAgIGFscGhOdW1TYW1lQ2hhcmFjdGVyQ291bnQgPSBhbHBoTnVtU2FtZUNoYXJhY3RlckNvdW50ICsgMTs7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYWxwaE51bVNhbWVDaGFyYWN0ZXJDb3VudCA9IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmICgvXFxzLy50ZXN0KGNoU3RyKSkge1xuICAgICAgICAgICAgICAgIGFscGhOdW1TYW1lQ2hhcmFjdGVyQ291bnQgPSAwO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBub25BbHBoYU51bWVyaWNOb3JTcGFjZUNvdW50ID0gbm9uQWxwaGFOdW1lcmljTm9yU3BhY2VDb3VudCArIDE7XG4gICAgICAgICAgICAgICAgYWxwaE51bVNhbWVDaGFyYWN0ZXJDb3VudCA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsYXN0Q2hhcmFjdGVyID0gY2hTdHI7XG5cbiAgICAgICAgICAgIC8vIE1ha2UgdGhlIGRlY2lzaW9uXG4gICAgICAgICAgICBpZiAobm9uQWxwaGFOdW1lcmljTm9yU3BhY2VDb3VudCA+PSA1IHx8IGFscGhOdW1TYW1lQ2hhcmFjdGVyQ291bnQgPj0gNCkge1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYmxpbmtfY3NzX3JldmlldzogUnVsZSA9IHtcbiAgICBpZDogXCJibGlua19jc3NfcmV2aWV3XCIsXG4gICAgY29udGV4dDogXCJkb206c3R5bGUsIGRvbToqW3N0eWxlXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX0JsaW5rX0NTU1RyaWdnZXIxXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBgYmxpbmtfY3NzX3Jldmlldy5odG1sYCxcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IGBibGlua19jc3NfcmV2aWV3Lmh0bWxgLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBgYmxpbmtfY3NzX3Jldmlldy5odG1sYFxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJEbyBub3QgdXNlIHRoZSBcXFwiYmxpbmtcXFwiIHZhbHVlIG9mIHRoZSAndGV4dC1kZWNvcmF0aW9uJyBwcm9wZXJ0eSBmb3IgbG9uZ2VyIHRoYW4gZml2ZSBzZWNvbmRzXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiQ2hlY2sgdGhlIFxcXCJibGlua1xcXCIgdmFsdWUgb2YgdGhlIENTUyAndGV4dC1kZWNvcmF0aW9uJyBwcm9wZXJ0eSBpcyBub3QgdXNlZCBmb3IgbW9yZSB0aGFuIHRoYW4gZml2ZSBzZWNvbmRzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIG51bTogXCIyLjIuMlwiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHRleHRWYWx1ZSA9IENvbW1vblV0aWwuZ2V0SW5uZXJUZXh0KHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZSgnc3R5bGUnKSkge1xuICAgICAgICAgICAgdGV4dFZhbHVlID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKCdzdHlsZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhc3NlZCA9IHRleHRWYWx1ZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoXCJ0ZXh0LWRlY29yYXRpb246YmxpbmtcIikgPT0gLTE7XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGNvbnN0IGJsaW5rX2VsZW1fZGVwcmVjYXRlZDogUnVsZSA9IHtcbiAgICBpZDogXCJibGlua19lbGVtX2RlcHJlY2F0ZWRcIixcbiAgICBjb250ZXh0OiBcImRvbTpibGlua1wiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0JsaW5rX0Fsd2F5c1RyaWdnZXJcIjoge1xuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBgYmxpbmtfZWxlbV9kZXByZWNhdGVkLmh0bWxgLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogYGJsaW5rX2VsZW1fZGVwcmVjYXRlZC5odG1sYFxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJDb250ZW50IHRoYXQgYmxpbmtzIHBlcnNpc3RlbnRseSBtdXN0IG5vdCBiZSB1c2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkNvbnRlbnQgZm91bmQgdGhhdCBibGlua3MgcGVyc2lzdGVudGx5XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbIFwiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBudW06IFwiMi4yLjJcIiwgLy8gbnVtOiBbIFwiMi40LjRcIiwgXCJ4LnkuelwiIF0gYWxzbyBhbGxvd2VkXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIC8vIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICB9XG59XG4gICAgIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBibG9ja3F1b3RlX2NpdGVfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcImJsb2NrcXVvdGVfY2l0ZV9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTpibG9ja3F1b3RlXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfQmxvY2txdW90ZV9IYXNDaXRlXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImJsb2NrcXVvdGVfY2l0ZV9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcImJsb2NrcXVvdGVfY2l0ZV9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImJsb2NrcXVvdGVfY2l0ZV9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0aGF0IDxibG9ja3F1b3RlPiBzaG91bGQgaGF2ZSBhICdjaXRlJyBhdHRyaWJ1dGUgYW5kIG5vdCBiZSB1c2VkIGZvciBpbmRlbnRhdGlvbiBvbmx5XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVXNlIDxibG9ja3F1b3RlPiBvbmx5IGZvciBxdW90YXRpb25zLCBub3QgaW5kZW50YXRpb25cIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwiY2l0ZVwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIGxldCBjaXRlRWxlbXMgPSBDb21tb25VdGlsLmdldERvY0VsZW1lbnRzQnlUYWcocnVsZUNvbnRleHQsIFwiY2l0ZVwiKTtcbiAgICAgICAgICAgIHBhc3NlZCA9IGNpdGVFbGVtcyAhPSBudWxsICYmIGNpdGVFbGVtcy5sZW5ndGggPiAwO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGNhbnZhc19jb250ZW50X2Rlc2NyaWJlZDogUnVsZSA9IHtcbiAgICBpZDogXCJjYW52YXNfY29udGVudF9kZXNjcmliZWRcIixcbiAgICBjb250ZXh0OiBcImRvbTpjYW52YXNcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIkhBQUNfQ2FudmFzXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwiTWFudWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImNhbnZhc19jb250ZW50X2Rlc2NyaWJlZC5odG1sXCIsXG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwiY2FudmFzX2NvbnRlbnRfZGVzY3JpYmVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJjYW52YXNfY29udGVudF9kZXNjcmliZWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIlZlcmlmeSBhY2Nlc3NpYmlsaXR5IG9mIHRoZSA8Y2FudmFzPiBlbGVtZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGhlIDxjYW52YXM+IGVsZW1lbnQgbWF5IG5vdCBiZSBhY2Nlc3NpYmxlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiLCBcIjIuMS4xXCIsIFwiNC4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHJ1bGVDb250ZXh0LmlubmVySFRNTC50cmltKCkubGVuZ3RoID4gMDtcbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVNYW51YWwoXCJNYW51YWxfMVwiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGNvbnN0IGNhcHRpb25fdHJhY2tfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcImNhcHRpb25fdHJhY2tfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJkb206dmlkZW9cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIkhBQUNfVmlkZW9fSGFzTm9UcmFja1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJjYXB0aW9uX3RyYWNrX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiY2FwdGlvbl90cmFja19leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImNhcHRpb25fdHJhY2tfZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgdGhhdCBjYXB0aW9ucyBhcmUgYXZhaWxhYmxlIGZvciBhbnkgbWVhbmluZ2Z1bCBhdWRpbyBvciBwcm92aWRlIGEgY2FwdGlvbiB0cmFjayBmb3IgdGhlIDx2aWRlbz4gZWxlbWVudFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkEgPHZpZGVvPiBlbGVtZW50IG11c3QgaGF2ZSBhIHRleHQgYWx0ZXJuYXRpdmUgZm9yIGFueSBtZWFuaW5nZnVsIGF1ZGlvIGNvbnRlbnRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMi4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEhUTUxWaWRlb0VsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSBmYWxzZTtcblxuICAgICAgICAvLyBpZ25vcmUgZGVjb3JhdGl2ZSB2aWRlbyBpZiB1c2VyIHVzZXMgYXJpYS1oaWRkZW5cbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtaGlkZGVuXCIpID09PSBcInRydWVcIikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdHJhY2tzID0gcnVsZUNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJ0cmFja1wiKTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRyYWNrcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgcGFzc2VkID0gcGFzc2VkIHx8IHRyYWNrc1tpXS5nZXRBdHRyaWJ1dGUoXCJraW5kXCIpID09PSAnY2FwdGlvbnMnO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNoZWNrcyBmb3IgYWRkaXRpb24gb2YgZHluYW1pYyB0cmFja3NcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0LnRleHRUcmFja3MgJiYgcnVsZUNvbnRleHQudGV4dFRyYWNrcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJ1bGVDb250ZXh0LnRleHRUcmFja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSBwYXNzZWQgfHwgcnVsZUNvbnRleHQudGV4dFRyYWNrc1tpXS5raW5kID09PSAnY2FwdGlvbnMnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IEZyYWdtZW50VXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9mcmFnbWVudFwiO1xuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01XYWxrZXJcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGNvbWJvYm94X2FjdGl2ZV9kZXNjZW5kYW50OiBSdWxlID0ge1xuICAgIGlkOiBcImNvbWJvYm94X2FjdGl2ZV9kZXNjZW5kYW50XCIsXG4gICAgY29udGV4dDogXCJhcmlhOmNvbWJvYm94XCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJjb21ib2JveF9wb3B1cF9yZWZlcmVuY2VcIl0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc1wiOiBcImNvbWJvYm94X2FjdGl2ZV9kZXNjZW5kYW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF9taXNzaW5nXCI6IFwiY29tYm9ib3hfYWN0aXZlX2Rlc2NlbmRhbnQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX25vdF9pbl9wb3B1cFwiOiBcImNvbWJvYm94X2FjdGl2ZV9kZXNjZW5kYW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF9hY3RpdmVfcm9sZV9pbnZhbGlkXCI6IFwiY29tYm9ib3hfYWN0aXZlX2Rlc2NlbmRhbnQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX2FjdGl2ZV9ub3Rfc2VsZWN0ZWRcIjogXCJjb21ib2JveF9hY3RpdmVfZGVzY2VuZGFudC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiY29tYm9ib3hfYWN0aXZlX2Rlc2NlbmRhbnQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXCI6IFwiJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCcgaXMgdXNlZCBhcHByb3ByaWF0ZWx5IGZvciB0aGlzIGNvbWJvYm94XCIsXG4gICAgICAgICAgICBcIkZhaWxfbWlzc2luZ1wiOiBcIlRoZSBlbGVtZW50IHJlZmVyZW5jZWQgYnkgJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCcgXFxcInswfVxcXCIgZG9lcyBub3QgZXhpc3RcIixcbiAgICAgICAgICAgIFwiRmFpbF9ub3RfaW5fcG9wdXBcIjogXCJUaGUgZWxlbWVudCByZWZlcmVuY2VkIGJ5ICdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnIFxcXCJ7MH1cXFwiIGRvZXMgbm90IGV4aXN0IHdpdGhpbiB0aGUgcG9wdXAgcmVmZXJlbmNlZCBieSAnaWQnIFxcXCJ7MX1cXFwiXCIsXG4gICAgICAgICAgICBcIkZhaWxfYWN0aXZlX3JvbGVfaW52YWxpZFwiOiBcIlRoZSAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JyBcXFwiezB9XFxcIiByZWZlcmVuY2VzIGFuIGVsZW1lbnQgd2l0aCB0aGUgcm9sZXMgXFxcInsxfVxcXCIsIHdoaWNoIGRvZXMgbm90IGhhdmUgYSB2YWxpZCBBUklBIHJvbGUgb2YgJ29wdGlvbicsICdncmlkY2VsbCcsICdyb3cnLCBvciAndHJlZWl0ZW0nXCIsXG4gICAgICAgICAgICBcIkZhaWxfYWN0aXZlX25vdF9zZWxlY3RlZFwiOiBcIlRoZSAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JyBcXFwiezB9XFxcIiByZWZlcmVuY2VzIGFuIGVsZW1lbnQgdGhhdCBkb2VzIG5vdCBoYXZlICdhcmlhLXNlbGVjdGVkJyBzZXQgdG8gdHJ1ZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIidhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnIG11c3QgYmUgdXNlZCB0byBkZWZpbmUgZm9jdXMgd2l0aGluIHRoZSBjb21ib2JveCBwb3B1cCwgZXhjZXB0IHdoZW4gdXNpbmcgYSBkaWFsb2cgcG9wdXBcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBjYWNoZSA9IENhY2hlVXRpbC5nZXRDYWNoZShydWxlQ29udGV4dC5vd25lckRvY3VtZW50LCBcImNvbWJvYm94XCIsIHt9KTtcbiAgICAgICAgaWYgKCFjYWNoZSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBjYWNoZWRFbGVtID0gY2FjaGVbY29udGV4dFtcImRvbVwiXS5yb2xlUGF0aF07XG4gICAgICAgIGlmICghY2FjaGVkRWxlbSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGNvbnN0IHsgcG9wdXBFbGVtZW50LCBwb3B1cElkIH0gPSBjYWNoZWRFbGVtO1xuICAgICAgICAvLyBJZiB0aGlzIGlzbid0IGRlZmluZWQsIHRoZSBjb21ib2JveCBpcyBwcm9iYWJseSBjb2xsYXBzZWQuIEEgcmVmZXJlbmNlIGVycm9yIGlzXG4gICAgICAgIC8vIGRldGVjdGVkIGluIGNvbWJvYm94X3BvcHVwX3JlZmVyZW5jZVxuICAgICAgICBpZiAoIXBvcHVwRWxlbWVudCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gVGhpcyBydWxlIG9ubHkgYXBwbGllcyBpZiB0aGUgYWN0aXZlZGVzY2VuZGFudCBpcyBzcGVjaWZpZWRcbiAgICAgICAgbGV0IGFjdGl2ZUlkID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIpO1xuICAgICAgICBpZiAoIWFjdGl2ZUlkIHx8IGFjdGl2ZUlkLnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGFjdGl2ZUVsZW0gPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChydWxlQ29udGV4dCwgYWN0aXZlSWQpO1xuICAgICAgICBpZiAoIWFjdGl2ZUVsZW0pIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfbWlzc2luZ1wiLCBbYWN0aXZlSWRdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBmb3VuZCA9IGZhbHNlO1xuXG4gICAgICAgIC8vIGV4YW1pbmUgdGhlIGNoaWxkcmVuXG4gICAgICAgIGlmIChwb3B1cEVsZW1lbnQpIHtcbiAgICAgICAgICAgIGxldCBudyA9IG5ldyBET01XYWxrZXIocG9wdXBFbGVtZW50KTtcbiAgICAgICAgICAgIHdoaWxlICghZm91bmQgJiYgbncubmV4dE5vZGUoKSAmJiBudy5ub2RlICE9IHBvcHVwRWxlbWVudCAmJiBudy5ub2RlICE9IHBvcHVwRWxlbWVudC5uZXh0U2libGluZykge1xuICAgICAgICAgICAgICAgIGlmIChudy5ub2RlLm5vZGVUeXBlID09PSAxICYmIFZpc1V0aWwuaXNOb2RlVmlzaWJsZShudy5ub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG53LmVsZW0oKS5nZXRBdHRyaWJ1dGUoXCJpZFwiKSA9PT0gYWN0aXZlSWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJldFZhbCA9IFtdO1xuXG4gICAgICAgIGlmICghZm91bmQpIHtcbiAgICAgICAgICAgIHJldFZhbC5wdXNoKFJ1bGVQYXNzKFwiRmFpbF9ub3RfaW5fcG9wdXBcIiwgW2FjdGl2ZUlkLCBwb3B1cElkXSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGFjdGl2ZVJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXMoYWN0aXZlRWxlbSwgdHJ1ZSk7XG4gICAgICAgIGxldCB2YWxpZFJvbGVzID0gW1wib3B0aW9uXCIsIFwiZ3JpZGNlbGxcIiwgXCJyb3dcIiwgXCJ0cmVlaXRlbVwiXS5maWx0ZXIoKHZhbGlkUm9sZSkgPT4gYWN0aXZlUm9sZXMuaW5jbHVkZXModmFsaWRSb2xlKSk7XG4gICAgICAgIGlmICh2YWxpZFJvbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0VmFsLnB1c2goUnVsZUZhaWwoXCJGYWlsX2FjdGl2ZV9yb2xlX2ludmFsaWRcIiwgW2FjdGl2ZUlkLCBhY3RpdmVSb2xlcy5qb2luKFwiLFwiKV0pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhY3RpdmVFbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtc2VsZWN0ZWRcIikgIT09IFwidHJ1ZVwiKSB7XG4gICAgICAgICAgICByZXRWYWwucHVzaChSdWxlRmFpbChcIkZhaWxfYWN0aXZlX25vdF9zZWxlY3RlZFwiLCBbYWN0aXZlSWRdKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmV0VmFsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc1wiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgY29tYm9ib3hfYXV0b2NvbXBsZXRlX3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcImNvbWJvYm94X2F1dG9jb21wbGV0ZV92YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpjb21ib2JveFwiLFxuICAgIGRlcGVuZGVuY2llczogW1wiY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlXCJdLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiY29tYm9ib3hfYXV0b2NvbXBsZXRlXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc1wiOiBcIlBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCIsXG4gICAgICAgICAgICBcIkZhaWxfaW5saW5lXCI6IFwiRmFpbF9pbmxpbmVcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NcIjogXCJjb21ib2JveF9hdXRvY29tcGxldGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJjb21ib2JveF9hdXRvY29tcGxldGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX2lubGluZVwiOiBcImNvbWJvYm94X2F1dG9jb21wbGV0ZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiY29tYm9ib3hfYXV0b2NvbXBsZXRlX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc1wiOiBcIlRoZSBjb21ib2JveCBkb2VzIG5vdCB1c2UgJ2FyaWEtYXV0b2NvbXBsZXRlJyB2YWx1ZSAnXFxcImlubGluZVxcXCInIG5vciBkb2VzIGl0IGhhdmUgJ2FyaWEtYXV0b2NvbXBsZXRlJyBkZWZpbmVkIHdpdGhpbiB0aGUgcG9wdXBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiVGhlIGNvbWJvYm94IGhhcyB0aGUgJ2FyaWEtYXV0b2NvbXBsZXRlJyBhdHRyaWJ1dGUgaW5jb3JyZWN0bHkgc2V0IG9uIGFuIGVsZW1lbnQgd2l0aGluIHRoZSBwb3B1cCByZWZlcmVuY2VkIGJ5IFxcXCJ7MH1cXFwiXCIsXG4gICAgICAgICAgICBcIkZhaWxfaW5saW5lXCI6IFwiVGhlIGNvbWJvYm94IGRvZXMgbm90IHN1cHBvcnQgYW4gJ2FyaWEtYXV0b2NvbXBsZXRlJyBhdHRyaWJ1dGUgdmFsdWUgc2V0IHRvICdcXFwiaW5saW5lXFxcIicgXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQSBjb21ib2JveCB0aGF0IHN1cHBvcnRzIGF1dG9jb21wbGV0aW9uIGJlaGF2aW9yIG11c3QgaGF2ZSB0aGUgJ2FyaWEtYXV0b2NvbXBsZXRlJyBhdHRyaWJ1dGUgb25seSBvbiBpdHMgdGV4dCBpbnB1dCBlbGVtZW50IHdpdGggYSB2YWxpZCB2YWx1ZTsgYSB2YWx1ZSBvZiAnXFxcImlubGluZVxcXCInIGlzIG5vdCBzdXBwb3J0ZWRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3sgXG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLCBcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sIFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTiwgXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FIFxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IGNhY2hlID0gQ2FjaGVVdGlsLmdldENhY2hlKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsIFwiY29tYm9ib3hcIiwge30pO1xuICAgICAgICBpZiAoIWNhY2hlKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IGNhY2hlZEVsZW0gPSBjYWNoZVtjb250ZXh0W1wiZG9tXCJdLnJvbGVQYXRoXTtcbiAgICAgICAgaWYgKCFjYWNoZWRFbGVtKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgeyBwb3B1cElkLCBwb3B1cEVsZW1lbnQgfSA9IGNhY2hlZEVsZW07XG4gICAgICAgIGxldCByZXRWYWwgPSBbXTtcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtYXV0b2NvbXBsZXRlXCIpID09PSBcImlubGluZVwiKSB7XG4gICAgICAgICAgICByZXRWYWwucHVzaChSdWxlRmFpbChcIkZhaWxfaW5saW5lXCIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlOyBcbiAgICAgICAgLy8gZXhhbWluZSB0aGUgY2hpbGRyZW5cbiAgICAgICAgaWYgKHBvcHVwRWxlbWVudCAmJiBWaXNVdGlsLmlzTm9kZVZpc2libGUocG9wdXBFbGVtZW50KSkge1xuICAgICAgICAgICAgLy8gaWYgcG9wdXBFbGVtZW50IGl0c2VsZiBoYXMgXCJhcmlhLWF1dG9jb21wbGV0ZVwiXG4gICAgICAgICAgICBwYXNzZWQgPSAhcG9wdXBFbGVtZW50Lmhhc0F0dHJpYnV0ZShcImFyaWEtYXV0b2NvbXBsZXRlXCIpO1xuICAgICAgICAgICAgLy8gaWYgYW55IGNoaWxkIG9mIHBvcHVwRWxlbWVudCBoYXMgXCJhcmlhLWF1dG9jb21wbGV0ZVwiXG4gICAgICAgICAgICBpZiAocGFzc2VkICYmIHBvcHVwRWxlbWVudC5jaGlsZHJlbiAmJiBwb3B1cEVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCBudyA9IG5ldyBET01XYWxrZXIocG9wdXBFbGVtZW50KTtcbiAgICAgICAgICAgICAgICB3aGlsZSAocGFzc2VkICYmIG53Lm5leHROb2RlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG53Lm5vZGUubm9kZVR5cGUgPT09IDEgJiYgVmlzVXRpbC5pc05vZGVWaXNpYmxlKG53Lm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSAhbncuZWxlbSgpLmhhc0F0dHJpYnV0ZShcImFyaWEtYXV0b2NvbXBsZXRlXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG53LmJFbmRUYWcgJiYgbncubm9kZSA9PT0gcG9wdXBFbGVtZW50Lmxhc3RFbGVtZW50Q2hpbGQpIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldFZhbC5wdXNoKFJ1bGVGYWlsKFwiRmFpbF8xXCIsIFtwb3B1cElkXSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJldFZhbC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc1wiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5cbmZ1bmN0aW9uIHBhdHRlcm5EZXRlY3QoZWxlbTogRWxlbWVudCk6IFN0cmluZyB7XG4gICAgLy8gY2hlY2sgJ2V4cGxpY2l0JyByb2xlIGNvbWJvYm94IGFuZCB0aGF0IGl0IGlzIG5vdCA8c2VsZWN0Pi4gXG4gICAgaWYgKGVsZW0udGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInNlbGVjdFwiICYmIGVsZW0uZ2V0QXR0cmlidXRlKFwicm9sZVwiKSAhPT0gXCJjb21ib2JveFwiKSB7XG4gICAgICAgIHJldHVybiBcImltcGxpY2l0XCI7XG4gICAgfSBlbHNlIGlmIChlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiaW5wdXRcIlxuICAgICAgICAmJiAoIWVsZW0uaGFzQXR0cmlidXRlKFwidHlwZVwiKSB8fCBlbGVtLmdldEF0dHJpYnV0ZShcInR5cGVcIikgPT09IFwidGV4dFwiKVxuICAgICAgICAmJiBlbGVtLmhhc0F0dHJpYnV0ZShcImFyaWEtb3duc1wiKSAmJiAhZWxlbS5oYXNBdHRyaWJ1dGUoXCJhcmlhLWNvbnRyb2xzXCIpKSB7XG4gICAgICAgIC8vIExvb2tzIGxpa2UgdGhpcyBpcyBhbiBBUklBIDEuMCBwYXR0ZXJuLCB3aGljaCB0aGUgQVJJQSAxLjIgc3BlYyBzYXlzIHRvIGNvbnRpbnVlIHRvIGFsbG93XG4gICAgICAgIHJldHVybiBcIjEuMFwiO1xuICAgIH0gZWxzZSBpZiAoZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9PSBcImlucHV0XCJcbiAgICAgICAgJiYgZWxlbS5oYXNBdHRyaWJ1dGUoXCJhcmlhLW93bnNcIikgJiYgIWVsZW0uaGFzQXR0cmlidXRlKFwiYXJpYS1jb250cm9sc1wiKSkge1xuICAgICAgICAvLyBMb29rcyBsaWtlIHRoaXMgaXMgYW4gQVJJQSAxLjEgcGF0dGVybiwgd2hpY2ggdGhlIEFSSUEgMS4yIHNwZWMgc2F5cyBpcyBub3cgaW52YWxpZFxuICAgICAgICByZXR1cm4gXCIxLjFcIjtcbiAgICB9XG4gICAgLy8gQXNzdW1lIHRoZXkncmUgdHJ5aW5nIHRvIGRvIHRoZSBsYXRlc3QsIDEuMiBwYXR0ZXJuXG4gICAgcmV0dXJuIFwiMS4yXCI7XG59XG5cbmV4cG9ydCBjb25zdCBjb21ib2JveF9kZXNpZ25fdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiY29tYm9ib3hfZGVzaWduX3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmNvbWJvYm94XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJjb21ib2JveF92ZXJzaW9uXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18xLjBcIjogXCJQYXNzXzEuMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzEuMVwiOiBcIkZhaWxfMS4xXCIsXG4gICAgICAgICAgICBcIlBhc3NfMS4yXCI6IFwiUGFzc18xLjJcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMS4wXCI6IFwiY29tYm9ib3hfZGVzaWduX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xLjFcIjogXCJjb21ib2JveF9kZXNpZ25fdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJQYXNzXzEuMlwiOiBcImNvbWJvYm94X2Rlc2lnbl92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiY29tYm9ib3hfZGVzaWduX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18xLjBcIjogXCJUaGUgY29tYm9ib3ggZGVzaWduIHBhdHRlcm4gaXMgZGV0ZWN0ZWQgYXMgQVJJQSAxLjAsIHdoaWNoIGlzIGFsbG93ZWQgYnkgQVJJQSAxLjJcIixcbiAgICAgICAgICAgIFwiRmFpbF8xLjFcIjogXCJUaGUgY29tYm9ib3ggZGVzaWduIHBhdHRlcm4gaXMgZGV0ZWN0ZWQgYXMgQVJJQSAxLjEsIHdoaWNoIGlzIG5vdCBhbGxvd2VkIGJ5IEFSSUEgMS4yXCIsXG4gICAgICAgICAgICBcIlBhc3NfMS4yXCI6IFwiVGhlIGNvbWJvYm94IGRlc2lnbiBwYXR0ZXJuIGlzIGRldGVjdGVkIGFzIEFSSUEgMS4yXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGhlIGNvbWJvYm94IGRlc2lnbiBwYXR0ZXJuIG11c3QgYmUgdmFsaWQgZm9yIEFSSUEgMS4yXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7IFxuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSwgXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4yXCJdLCBcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sIFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORSBcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKHJ1bGVDb250ZXh0KSB8fCBDb21tb25VdGlsLmlzTm9kZURpc2FibGVkKHJ1bGVDb250ZXh0KSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHBhdHRlcm4gPSBwYXR0ZXJuRGV0ZWN0KHJ1bGVDb250ZXh0KTtcblxuICAgICAgICAvLyBXZSBkb24ndCBhc3Nlc3MgbmF0aXZlIHNlbGVjdCBlbGVtZW50cyBoZXJlXG4gICAgICAgIGlmIChwYXR0ZXJuID09PSBcImltcGxpY2l0XCIpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHRhZ05hbWUgPSBydWxlQ29udGV4dC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGxldCBleHBhbmRlZCA9IChBcmlhVXRpbC5nZXRBcmlhQXR0cmlidXRlKHJ1bGVDb250ZXh0LCBcImFyaWEtZXhwYW5kZWRcIikgfHwgXCJcIikudHJpbSgpLnRvTG93ZXJDYXNlKCkgPT09IFwidHJ1ZVwiO1xuICAgICAgICBsZXQgZWRpdGFibGUgPSB0YWdOYW1lID09PSBcImlucHV0XCIgJiYgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0eXBlXCIpIHx8IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInR5cGVcIikudG9Mb3dlckNhc2UoKSA9PT0gXCJ0ZXh0XCIpO1xuXG4gICAgICAgIGxldCBrZXkgPSBjb250ZXh0W1wiZG9tXCJdLnJvbGVQYXRoO1xuICAgICAgICBpZiAoa2V5KSB7XG4gICAgICAgICAgICBsZXQgY2FjaGUgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUocnVsZUNvbnRleHQub3duZXJEb2N1bWVudCwgXCJjb21ib2JveFwiLCB7fSk7XG4gICAgICAgICAgICBpZiAoIWNhY2hlKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNhY2hlW2tleV0gPSB7XG4gICAgICAgICAgICAgICAgXCJpbnB1dEVsZW1lbnRcIjogZWRpdGFibGUgPyBydWxlQ29udGV4dCA6IG51bGwsXG4gICAgICAgICAgICAgICAgXCJwYXR0ZXJuXCI6IHBhdHRlcm4sXG4gICAgICAgICAgICAgICAgXCJleHBhbmRlZFwiOiBleHBhbmRlZFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShydWxlQ29udGV4dC5vd25lckRvY3VtZW50LCBcImNvbWJvYm94XCIsIGNhY2hlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIE5vIHhwYXRoP1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGF0dGVybiA9PT0gXCIxLjBcIikge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18xLjBcIik7XG4gICAgICAgIH0gZWxzZSBpZiAocGF0dGVybiA9PT0gXCIxLjFcIikge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xLjFcIik7XG4gICAgICAgIH0gZWxzZSBpZiAocGF0dGVybiA9PT0gXCIxLjJcIikge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18xLjJcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGNvbWJvYm94X2ZvY3VzYWJsZV9lbGVtZW50czogUnVsZSA9IHtcbiAgICBpZDogXCJjb21ib2JveF9mb2N1c2FibGVfZWxlbWVudHNcIixcbiAgICBjb250ZXh0OiBcImFyaWE6Y29tYm9ib3hcIixcbiAgICBkZXBlbmRlbmNpZXM6IFtcImNvbWJvYm94X3BvcHVwX3JlZmVyZW5jZVwiXSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXCI6IFwiY29tYm9ib3hfZm9jdXNhYmxlX2VsZW1lbnRzLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF9ub3RfdGFiYmFibGVcIjogXCJjb21ib2JveF9mb2N1c2FibGVfZWxlbWVudHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX3RhYmJhYmxlX2NoaWxkXCI6IFwiY29tYm9ib3hfZm9jdXNhYmxlX2VsZW1lbnRzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJjb21ib2JveF9mb2N1c2FibGVfZWxlbWVudHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXCI6IFwiRE9NIGZvY3VzIGlzIGFsbG93ZWQgb25seSBvbiB0aGUgY29tYm9ib3ggZWxlbWVudCBhcyByZXF1aXJlZFwiLFxuICAgICAgICAgICAgXCJGYWlsX25vdF90YWJiYWJsZVwiOiBcIlRoZSBjb21ib2JveCBlbGVtZW50IGRvZXMgbm90IGFsbG93IERPTSBmb2N1cyBhcyByZXF1aXJlZFwiLFxuICAgICAgICAgICAgXCJGYWlsX3RhYmJhYmxlX2NoaWxkXCI6IFwiVGhlIHBvcHVwIG9mIHRoZSBjb21ib2JveCBoYXMgRE9NIGZvY3VzIG9yIGhhcyAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JyBkZWZpbmVkLCB3aGljaCBpcyBub3QgYWxsb3dlZFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRhYmJhYmxlIGZvY3VzIGZvciB0aGUgY29tYm9ib3ggbXVzdCBiZSBhbGxvd2VkIG9ubHkgb24gdGhlIHRleHQgaW5wdXQsIGV4Y2VwdCB3aGVuIHVzaW5nIGEgZGlhbG9nIHBvcHVwXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7IFxuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sIFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTiwgXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FIFxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IGNhY2hlID0gQ2FjaGVVdGlsLmdldENhY2hlKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsIFwiY29tYm9ib3hcIiwge30pO1xuICAgICAgICBpZiAoIWNhY2hlKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IGNhY2hlZEVsZW0gPSBjYWNoZVtjb250ZXh0W1wiZG9tXCJdLnJvbGVQYXRoXTtcbiAgICAgICAgaWYgKCFjYWNoZWRFbGVtKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgeyBwb3B1cEVsZW1lbnQsIGV4cGFuZGVkIH0gPSBjYWNoZWRFbGVtO1xuICAgICAgICAvLyBJZiB0aGlzIGlzbid0IGRlZmluZWQsIHRoZSBjb21ib2JveCBpcyBwcm9iYWJseSBjb2xsYXBzZWQuIEEgcmVmZXJlbmNlIGVycm9yIGlzXG4gICAgICAgIC8vIGRldGVjdGVkIGluIGNvbWJvYm94X3BvcHVwX3JlZmVyZW5jZVxuICAgICAgICBpZiAoIXBvcHVwRWxlbWVudCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgY29uc3QgcG9wdXBSb2xlID0gQXJpYVV0aWwuZ2V0Um9sZXMocG9wdXBFbGVtZW50LCB0cnVlKVswXTtcblxuICAgICAgICBsZXQgcmV0VmFsID0gW11cbiAgICAgICAgaWYgKCFDb21tb25VdGlsLmlzVGFiYmFibGUocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICByZXRWYWwucHVzaChSdWxlRmFpbChcIkZhaWxfbm90X3RhYmJhYmxlXCIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE9ubHkgbWFrZXMgc2Vuc2UgdG8gY2hlY2sgdGhlIHBvcHVwIHdoZW4gZXhwYW5kZWRcbiAgICAgICAgLy8gdGhpcyBkb2VzIG5vdCBhcHBseSB0byBkaWFsb2dzLCByZXR1cm4gcGFzcyBzaW5jZSB0aGUgbWFpbiBlbGVtZW50IHdhcyBmb2N1c2FibGUgYWJvdmVcbiAgICAgICAgaWYgKGV4cGFuZGVkID09PSBmYWxzZSB8fCBwb3B1cFJvbGUgPT09IFwiZGlhbG9nXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NcIik7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcblxuICAgICAgICAvLyBleGFtaW5lIHRoZSBjaGlsZHJlblxuICAgICAgICBpZiAocG9wdXBFbGVtZW50ICAmJiBWaXNVdGlsLmlzTm9kZVZpc2libGUocG9wdXBFbGVtZW50KSkge1xuICAgICAgICAgICAgLy8gaWYgcG9wdXBFbGVtZW50IGl0c2VsZiBoYXMgXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIlxuICAgICAgICAgICAgcGFzc2VkID0gIUNvbW1vblV0aWwuaXNUYWJiYWJsZShwb3B1cEVsZW1lbnQpICYmICFBcmlhVXRpbC5nZXRBcmlhQXR0cmlidXRlKHBvcHVwRWxlbWVudCwgXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIik7O1xuICAgICAgICAgICAgLy8gaWYgYW55IGNoaWxkIG9mIHBvcHVwRWxlbWVudCBoYXMgXCJhcmlhLWF1dG9jb21wbGV0ZVwiXG4gICAgICAgICAgICBpZiAocGFzc2VkICYmIHBvcHVwRWxlbWVudC5jaGlsZHJlbiAmJiBwb3B1cEVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCBudyA9IG5ldyBET01XYWxrZXIocG9wdXBFbGVtZW50KTtcbiAgICAgICAgICAgICAgICB3aGlsZSAocGFzc2VkICYmIG53Lm5leHROb2RlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG53Lm5vZGUubm9kZVR5cGUgPT09IDEgJiYgVmlzVXRpbC5pc05vZGVWaXNpYmxlKG53Lm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSAhQ29tbW9uVXRpbC5pc1RhYmJhYmxlKG53Lm5vZGUpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIUFyaWFVdGlsLmdldEFyaWFBdHRyaWJ1dGUobncubm9kZSwgXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobncuYkVuZFRhZyAmJiBudy5ub2RlID09PSBwb3B1cEVsZW1lbnQubGFzdEVsZW1lbnRDaGlsZCkgYnJlYWs7ICAgIFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldFZhbC5wdXNoKFJ1bGVGYWlsKFwiRmFpbF90YWJiYWJsZV9jaGlsZFwiKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmV0VmFsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc1wiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDYWNoZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGNvbWJvYm94X2hhc3BvcHVwX3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcImNvbWJvYm94X2hhc3BvcHVwX3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmNvbWJvYm94XCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJjb21ib2JveF9wb3B1cF9yZWZlcmVuY2VcIl0sXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJjb21ib2JveF9oYXNwb3B1cFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NcIjogXCJQYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfcG9wdXBfcm9sZV9pbnZhbGlkXCI6IFwiRmFpbF9wb3B1cF9yb2xlX2ludmFsaWRcIixcbiAgICAgICAgICAgIFwiRmFpbF9jb21ib2JveF9wb3B1cF9yb2xlX21pc21hdGNoXCI6IFwiRmFpbF9jb21ib2JveF9wb3B1cF9yb2xlX21pc21hdGNoXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXCI6IFwiY29tYm9ib3hfaGFzcG9wdXBfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX3BvcHVwX3JvbGVfaW52YWxpZFwiOiBcImNvbWJvYm94X2hhc3BvcHVwX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF9jb21ib2JveF9wb3B1cF9yb2xlX21pc21hdGNoXCI6IFwiY29tYm9ib3hfaGFzcG9wdXBfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImNvbWJvYm94X2hhc3BvcHVwX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc1wiOiBcIlRoZSAnYXJpYS1jb250cm9scycgKEFSSUEgMS4yKSBvciAnYXJpYS1vd25zJyAoQVJJQSAxLjApIGFwcHJvcHJpYXRlbHkgcmVmZXJlbmNlcyBhIHZhbGlkIHBvcHVwICdpZCcgdmFsdWVcIixcbiAgICAgICAgICAgIFwiRmFpbF9wb3B1cF9yb2xlX2ludmFsaWRcIjogXCJUaGUgJ3JvbGUnIHZhbHVlIFxcXCJ7MH1cXFwiIG9mIHRoZSBwb3B1cCBlbGVtZW50IFxcXCJ7MX1cXFwiIHNob3VsZCBiZSBvbmUgb2YgXFxcImxpc3Rib3hcXFwiLCBcXFwiZ3JpZFxcXCIsIFxcXCJ0cmVlXFxcIiBvciBcXFwiZGlhbG9nXFxcIlwiLFxuICAgICAgICAgICAgXCJGYWlsX2NvbWJvYm94X3BvcHVwX3JvbGVfbWlzbWF0Y2hcIjogXCJUaGUgdmFsdWUgb2YgdGhlIGNvbWJvYm94ICdhcmlhLWhhc3BvcHVwJyBhdHRyaWJ1dGUgXFxcInswfVxcXCIgZG9lcyBub3QgbWF0Y2ggdGhlICdyb2xlJyB2YWx1ZSBvZiB0aGUgcG9wdXAgZWxlbWVudCBcXFwiezF9XFxcIlwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSBjb21ib2JveCBhdHRyaWJ1dGUgJ2FyaWEtaGFzcG9wdXAnIHZhbHVlIG11c3QgYmUgYXBwcm9wcmlhdGUgZm9yIHRoZSByb2xlIG9mIHRoZSBlbGVtZW50IHJlZmVyZW5jZWQgYnkgJ2FyaWEtY29udHJvbHMnIChBUklBIDEuMikgb3IgJ2FyaWEtb3ducycgKEFSSUEgMS4wKVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbeyBcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sIFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSwgXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLCBcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkUgXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBjb25zdCBjYWNoZSA9IENhY2hlVXRpbC5nZXRDYWNoZShydWxlQ29udGV4dC5vd25lckRvY3VtZW50LCBcImNvbWJvYm94XCIsIHt9KTtcbiAgICAgICAgaWYgKCFjYWNoZSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGNvbnN0IGNhY2hlS2V5ID0gY29udGV4dFtcImRvbVwiXS5yb2xlUGF0aDtcbiAgICAgICAgY29uc3QgY2FjaGVkRWxlbSA9IGNhY2hlW2NhY2hlS2V5XTtcbiAgICAgICAgaWYgKCFjYWNoZWRFbGVtKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgeyBwb3B1cEVsZW1lbnQsIHBvcHVwSWQgfSA9IGNhY2hlZEVsZW07XG4gICAgICAgIC8vIElmIHRoaXMgaXNuJ3QgZGVmaW5lZCwgdGhlIGNvbWJvYm94IGlzIHByb2JhYmx5IGNvbGxhcHNlZC4gQSByZWZlcmVuY2UgZXJyb3IgaXNcbiAgICAgICAgLy8gZGV0ZWN0ZWQgaW4gY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlXG4gICAgICAgIGlmICghcG9wdXBFbGVtZW50KSByZXR1cm4gbnVsbDtcbiAgICAgICAgLy8gQ2hlY2sgdGhhdCBwb3B1cCByb2xlIGlzIGxpc3Rib3gsIGdyaWQsIHRyZWUsIG9yIGRpYWxvZyBhbmQgdGhhdCBpdCBtYXRjaGVzIHRoZSBjb21ib2JveFxuICAgICAgICBsZXQgcG9wdXBSb2xlcyA9IEFyaWFVdGlsLmdldFJvbGVzKHBvcHVwRWxlbWVudCwgdHJ1ZSk7XG4gICAgICAgIGxldCB2YWxpZFJvbGVzID0gW1wibGlzdGJveFwiLCBcImdyaWRcIiwgXCJ0cmVlXCIsIFwiZGlhbG9nXCJdLmZpbHRlcigodmFsaWRSb2xlKSA9PiBwb3B1cFJvbGVzLmluY2x1ZGVzKHZhbGlkUm9sZSkpO1xuICAgICAgICBpZiAodmFsaWRSb2xlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfcG9wdXBfcm9sZV9pbnZhbGlkXCIsIFtwb3B1cFJvbGVzLmpvaW4oXCIsXCIpLCBwb3B1cElkXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgcG9wdXBSb2xlID0gdmFsaWRSb2xlc1swXTtcbiAgICAgICAgICAgIGxldCBoYXNwb3B1cFZhbCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtaGFzcG9wdXBcIikgfHwgXCJsaXN0Ym94XCI7XG4gICAgICAgICAgICAvLyBQb3B1cCByb2xlIG11c3QgbWF0Y2ggYXJpYS1oYXNwb3B1cCB1bmxlc3MgcG9wdXBSb2xlIGlzIGxpc3Rib3gsIHRoZW4gYXJpYS1oYXNwb3B1cCBzaG91bGQgbm90IGJlIGRlZmluZWQgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoaGFzcG9wdXBWYWwgIT09IHBvcHVwUm9sZSkge1xuICAgICAgICAgICAgICAgIGlmIChwb3B1cFJvbGUgIT09IFwibGlzdGJveFwiIHx8IHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImFyaWEtaGFzcG9wdXBcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF9jb21ib2JveF9wb3B1cF9yb2xlX21pc21hdGNoXCIsIFtoYXNwb3B1cFZhbCwgcG9wdXBSb2xlXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG5pbXBvcnQgeyBDYWNoZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBjb21ib2JveF9wb3B1cF9yZWZlcmVuY2U6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmNvbWJvYm94XCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJjb21ib2JveF9kZXNpZ25fdmFsaWRcIl0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJjb21ib2JveF9wb3B1cF9yZWZlcmVuY2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJQYXNzXzEuMF9leHBhbmRlZFwiOiBcImNvbWJvYm94X3BvcHVwX3JlZmVyZW5jZS5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NfMS4wX2NvbGxhcHNlZFwiOiBcImNvbWJvYm94X3BvcHVwX3JlZmVyZW5jZS5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NfMS4yX2V4cGFuZGVkXCI6IFwiY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc18xLjJfY29sbGFwc2VkXCI6IFwiY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xLjBfbWlzc2luZ19vd25zXCI6IFwiY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xLjJfbWlzc2luZ19jb250cm9sc1wiOiBcImNvbWJvYm94X3BvcHVwX3JlZmVyZW5jZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMS4wX3BvcHVwX3JlZmVyZW5jZV9taXNzaW5nXCI6IFwiY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xLjJfcG9wdXBfcmVmZXJlbmNlX21pc3NpbmdcIjogXCJjb21ib2JveF9wb3B1cF9yZWZlcmVuY2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX2NvbWJvYm94X2V4cGFuZGVkX2hpZGRlblwiOiBcImNvbWJvYm94X3BvcHVwX3JlZmVyZW5jZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfY29tYm9ib3hfY29sbGFwc2VkX3Zpc2libGVcIjogXCJjb21ib2JveF9wb3B1cF9yZWZlcmVuY2UuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSAnYXJpYS1jb250cm9scycgKGZvciBBUklBIDEuMikgb3IgdGhlICdhcmlhLW93bnMnIChmb3IgQVJJQSAxLjApIGF0dHJpYnV0ZSBvZiB0aGUgZXhwYW5kZWQgY29tYm9ib3ggbXVzdCByZWZlcmVuY2UgYSB2YWxpZCBwb3B1cCAnaWQnIHZhbHVlXCIsXG4gICAgICAgICAgICBcIlBhc3NfMS4wX2V4cGFuZGVkXCI6IFwiVGhlIGNvbWJvYm94IHBvcHVwIHJlZmVyZW5jZWQgYnkgJ2FyaWEtb3ducycgKEFSSUEgMS4wKSBleGlzdHMgYW5kIGlzIHZpc2libGVcIixcbiAgICAgICAgICAgIFwiUGFzc18xLjBfY29sbGFwc2VkXCI6IFwiVGhlIGNvbWJvYm94IHBvcHVwIGluIGl0cyBjb2xsYXBzZWQgc3RhdGUgZG9lcyBub3QgcmVmZXJlbmNlIGFueSB2aXNpYmxlIHBvcHVwIGFzIHJlcXVpcmVkXCIsXG4gICAgICAgICAgICBcIlBhc3NfMS4yX2V4cGFuZGVkXCI6IFwiVGhlIGNvbWJvYm94IHBvcHVwIHJlZmVyZW5jZWQgYnkgJ2FyaWEtY29udHJvbHMnIChBUklBIDEuMikgZXhpc3RzIGFuZCBpcyB2aXNpYmxlXCIsXG4gICAgICAgICAgICBcIlBhc3NfMS4yX2NvbGxhcHNlZFwiOiBcIlRoZSBjb21ib2JveCBwb3B1cCBpbiBpdHMgY29sbGFwc2VkIHN0YXRlIGRvZXMgbm90IHJlZmVyZW5jZSBhbnkgdmlzaWJsZSBwb3B1cCBhcyByZXF1aXJlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzEuMF9taXNzaW5nX293bnNcIjogXCJUaGUgJ2FyaWEtb3ducycgYXR0cmlidXRlIG9mIHRoZSBleHBhbmRlZCBjb21ib2JveCBpcyBtaXNzaW5nXCIsXG4gICAgICAgICAgICBcIkZhaWxfMS4yX21pc3NpbmdfY29udHJvbHNcIjogXCJUaGUgJ2FyaWEtY29udHJvbHMnIGF0dHJpYnV0ZSBvZiB0aGUgZXhwYW5kZWQgY29tYm9ib3ggaXMgbWlzc2luZ1wiLFxuICAgICAgICAgICAgXCJGYWlsXzEuMF9wb3B1cF9yZWZlcmVuY2VfbWlzc2luZ1wiOiBcIlRoZSAnYXJpYS1vd25zJyBhdHRyaWJ1dGUgXFxcInswfVxcXCIgb2YgdGhlIGV4cGFuZGVkIGNvbWJvYm94IGRvZXMgbm90IHJlZmVyZW5jZSBhIHZhbGlkIHBvcHVwICdpZCcgdmFsdWVcIixcbiAgICAgICAgICAgIFwiRmFpbF8xLjJfcG9wdXBfcmVmZXJlbmNlX21pc3NpbmdcIjogXCJUaGUgJ2FyaWEtY29udHJvbHMnIGF0dHJpYnV0ZSBcXFwiezB9XFxcIiBvZiB0aGUgZXhwYW5kZWQgY29tYm9ib3ggZG9lcyBub3QgcmVmZXJlbmNlIGEgdmFsaWQgcG9wdXAgJ2lkJyB2YWx1ZVwiLFxuICAgICAgICAgICAgXCJGYWlsX2NvbWJvYm94X2V4cGFuZGVkX2hpZGRlblwiOiBcIlRoZSBjb21ib2JveCAnYXJpYS1leHBhbmRlZCcgYXR0cmlidXRlIGlzIHRydWUsIGJ1dCB0aGUgY29tYm9ib3ggcG9wdXAgaXMgbm90IHZpc2libGVcIixcbiAgICAgICAgICAgIFwiRmFpbF9jb21ib2JveF9jb2xsYXBzZWRfdmlzaWJsZVwiOiBcIlRoZSBjb21ib2JveCAnYXJpYS1leHBhbmRlZCcgYXR0cmlidXRlIGlzIGZhbHNlLCBidXQgdGhlIGNvbWJvYm94IHBvcHVwIGlzIHZpc2libGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFt7XG4gICAgICAgIFwiNGU4YWI2XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18xLjBfZXhwYW5kZWRcIjogXCJmYWlsXCIsXG4gICAgICAgICAgICBcIlBhc3NfMS4wX2NvbGxhcHNlZFwiOiBcImZhaWxcIixcbiAgICAgICAgICAgIFwiUGFzc18xLjJfZXhwYW5kZWRcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIlBhc3NfMS4yX2NvbGxhcHNlZFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xLjBfbWlzc2luZ19vd25zXCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgICAgICBcIkZhaWxfMS4yX21pc3NpbmdfY29udHJvbHNcIjogXCJmYWlsXCIsXG4gICAgICAgICAgICBcIkZhaWxfMS4wX3BvcHVwX3JlZmVyZW5jZV9taXNzaW5nXCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgICAgICBcIkZhaWxfMS4yX3BvcHVwX3JlZmVyZW5jZV9taXNzaW5nXCI6IFwiZmFpbFwiLFxuICAgICAgICAgICAgXCJGYWlsX2NvbWJvYm94X2V4cGFuZGVkX2hpZGRlblwiOiBcImluYXBwbGljYWJsZVwiLFxuICAgICAgICAgICAgXCJGYWlsX2NvbWJvYm94X2NvbGxhcHNlZF92aXNpYmxlXCI6IFwiaW5hcHBsaWNhYmxlXCJcbiAgICAgICAgfVxuICAgIH1dLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGNhY2hlID0gQ2FjaGVVdGlsLmdldENhY2hlKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsIFwiY29tYm9ib3hcIiwge30pO1xuICAgICAgICBpZiAoIWNhY2hlKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgY2FjaGVLZXkgPSBjb250ZXh0W1wiZG9tXCJdLnJvbGVQYXRoO1xuICAgICAgICBjb25zdCBjYWNoZWRFbGVtID0gY2FjaGVbY2FjaGVLZXldO1xuICAgICAgICBpZiAoIWNhY2hlZEVsZW0pIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCB7IHBhdHRlcm4sIGV4cGFuZGVkIH0gPSBjYWNoZWRFbGVtO1xuXG4gICAgICAgIGxldCBwb3B1cElkO1xuICAgICAgICBsZXQgcG9wdXBFbGVtZW50O1xuICAgICAgICBpZiAocGF0dGVybiA9PT0gXCIxLjBcIikge1xuICAgICAgICAgICAgaWYgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhcmlhLW93bnNcIikpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgY29tYm9ib3ggaXNuJ3QgZXhwYW5kZWQsIHRoaXMgYXR0cmlidXRlIGlzbid0IHJlcXVpcmVkXG4gICAgICAgICAgICAgICAgcmV0dXJuICFleHBhbmRlZCA/IG51bGwgOiBSdWxlRmFpbChcIkZhaWxfMS4wX21pc3Npbmdfb3duc1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBvcHVwSWQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhcmlhLW93bnNcIik7XG4gICAgICAgICAgICBwb3B1cEVsZW1lbnQgPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChydWxlQ29udGV4dCwgcG9wdXBJZCk7XG4gICAgICAgICAgICBpZiAoIXBvcHVwRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIC8vIElmIHRoZSBjb21ib2JveCBpc24ndCBleHBhbmRlZCwgdGhpcyBhdHRyaWJ1dGUgaXNuJ3QgcmVxdWlyZWRcbiAgICAgICAgICAgICAgICByZXR1cm4gIWV4cGFuZGVkID8gbnVsbCA6IFJ1bGVGYWlsKFwiRmFpbF8xLjBfcG9wdXBfcmVmZXJlbmNlX21pc3NpbmdcIiwgW3BvcHVwSWRdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChwYXR0ZXJuID09PSBcIjEuMlwiKSB7XG4gICAgICAgICAgICBpZiAoIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImFyaWEtY29udHJvbHNcIikpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgY29tYm9ib3ggaXNuJ3QgZXhwYW5kZWQsIHRoaXMgYXR0cmlidXRlIGlzbid0IHJlcXVpcmVkXG4gICAgICAgICAgICAgICAgcmV0dXJuICFleHBhbmRlZCA/IG51bGwgOiBSdWxlRmFpbChcIkZhaWxfMS4yX21pc3NpbmdfY29udHJvbHNcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwb3B1cElkID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYXJpYS1jb250cm9sc1wiKTtcbiAgICAgICAgICAgIHBvcHVwRWxlbWVudCA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKHJ1bGVDb250ZXh0LCBwb3B1cElkKTtcbiAgICAgICAgICAgIGlmICghcG9wdXBFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIGNvbWJvYm94IGlzbid0IGV4cGFuZGVkLCB0aGlzIGF0dHJpYnV0ZSBpc24ndCByZXF1aXJlZFxuICAgICAgICAgICAgICAgIHJldHVybiAhZXhwYW5kZWQgPyBudWxsIDogUnVsZUZhaWwoXCJGYWlsXzEuMl9wb3B1cF9yZWZlcmVuY2VfbWlzc2luZ1wiLCBbcG9wdXBJZF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBXZSBoYXZlIGFuIGVsZW1lbnQsIHN0aWNrIGl0IGluIHRoZSBjYWNoZSBhbmQgdGhlbiBjaGVjayBpdHMgcm9sZVxuICAgICAgICBjYWNoZWRFbGVtLnBvcHVwSWQgPSBwb3B1cElkO1xuICAgICAgICBjYWNoZWRFbGVtLnBvcHVwRWxlbWVudCA9IHBvcHVwRWxlbWVudDtcblxuXG4gICAgICAgIGlmIChleHBhbmRlZCAmJiAhVmlzVXRpbC5pc05vZGVWaXNpYmxlKHBvcHVwRWxlbWVudCkpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfY29tYm9ib3hfZXhwYW5kZWRfaGlkZGVuXCIpO1xuICAgICAgICB9IGVsc2UgaWYgKCFleHBhbmRlZCAmJiBWaXNVdGlsLmlzTm9kZVZpc2libGUocG9wdXBFbGVtZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF9jb21ib2JveF9jb2xsYXBzZWRfdmlzaWJsZVwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXR0ZXJuID09PSBcIjEuMFwiKSB7XG4gICAgICAgICAgICBpZiAoZXhwYW5kZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzEuMF9leHBhbmRlZFwiKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18xLjBfY29sbGFwc2VkXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGV4cGFuZGVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18xLjJfZXhwYW5kZWRcIik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMS4yX2NvbGxhcHNlZFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5cbmV4cG9ydCBjb25zdCBkZWJ1Z19wYXRoczogUnVsZSA9IHtcbiAgICBpZDogXCJkZWJ1Z19wYXRoc1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipcIixcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBgYCxcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IGBgXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIlwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFtcIkRFQlVHXCJdLFxuICAgICAgICBudW06IFwiMVwiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LklORk9STUFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfRk9VUlxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgcnVsZUNvbnRleHQuc2V0QXR0cmlidXRlKFwiZG9tUGF0aFwiLCBjb250ZXh0W1wiZG9tXCJdLnJvbGVQYXRoKTtcbiAgICAgICAgcnVsZUNvbnRleHQuc2V0QXR0cmlidXRlKFwiYXJpYVBhdGhcIiwgY29udGV4dFtcImFyaWFcIl0ucm9sZVBhdGgpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGNvbnN0IGRldGVjdG9yX3RhYmJhYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcImRldGVjdG9yX3RhYmJhYmxlXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IGBgLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogYGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBpZDogW1wiRVhURU5TSU9OU1wiXSxcbiAgICAgICAgbnVtOiBcIjFcIiwgLy8gbnVtOiBbIFwiMi40LjRcIiwgXCJ4LnkuelwiIF0gYWxzbyBhbGxvd2VkXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5JTkZPUk1BVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX0ZPVVJcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmICghQ29tbW9uVXRpbC5pc1RhYmJhYmxlKHJ1bGVDb250ZXh0KSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGhpZXJDb250ZXh0ID0gY29udGV4dEhpZXJhcmNoaWVzLmFyaWFbY29udGV4dEhpZXJhcmNoaWVzLmFyaWEubGVuZ3RoIC0gMV07XG4gICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiLCBbXSwgW3tcbiAgICAgICAgICAgIG5hbWU6IGhpZXJDb250ZXh0LmF0dHJpYnV0ZXMubmFtZSxcbiAgICAgICAgICAgIHJvbGU6IGhpZXJDb250ZXh0LnJvbGUsXG4gICAgICAgICAgICB0YWJpbmRleDogcGFyc2VJbnQocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidGFiaW5kZXhcIikgfHwgXCIwXCIpXG4gICAgICAgIH1dKTtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGNvbnN0IGRpcl9hdHRyaWJ1dGVfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZGlyX2F0dHJpYnV0ZV92YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbZGlyXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiVmFsZXJpZV9FbGVtX0RpclZhbGlkXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiZGlyX2F0dHJpYnV0ZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImRpcl9hdHRyaWJ1dGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImRpcl9hdHRyaWJ1dGVfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJJbnZhbGlkIHZhbHVlIHVzZWQgZm9yIHRoZSAnZGlyJyBhdHRyaWJ1dGVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCInZGlyJyBhdHRyaWJ1dGUgdmFsdWUgbXVzdCBiZSBcXFwibHRyXFxcIiwgXFxcInJ0bFxcXCIsIG9yIFxcXCJhdXRvXFxcIlwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgZGlyU3RyID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiZGlyXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGxldCBwYXNzZWQgPSBkaXJTdHIgPT0gXCJsdHJcIiB8fCBkaXJTdHIgPT0gXCJydGxcIiB8fCBkaXJTdHIgPT0gXCJhdXRvXCI7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlTWFudWFsLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBkb3dubG9hZF9rZXlib2FyZF9jb250cm9sbGFibGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZG93bmxvYWRfa2V5Ym9hcmRfY29udHJvbGxhYmxlXCIsXG4gICAgY29udGV4dDogXCJkb206YVtocmVmXSxkb206YXJlYVtocmVmXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiSEFBQ19NZWRpYV9Eb2N1bWVudFRyaWdnZXIyXCI6IHtcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJNYW51YWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJkb3dubG9hZF9rZXlib2FyZF9jb250cm9sbGFibGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImRvd25sb2FkX2tleWJvYXJkX2NvbnRyb2xsYWJsZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwiVmVyaWZ5IHRoYXQgdGhlIGZpbGUgZG93bmxvYWQgbWVjaGFuaXNtIGRvZXMgbm90IGNhdXNlIGEga2V5Ym9hcmQgdHJhcFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkZpbGUgZG93bmxvYWQgbWVjaGFuaXNtcyBzaG91bGQgYmUga2V5Ym9hcmQtb3BlcmFibGUgYW5kIHByZXNlcnZlIHBhZ2UgZm9jdXMgbG9jYXRpb25cIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuMS4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgaHJlZiA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImhyZWZcIik7XG4gICAgICAgIGxldCBleHQgPSBDb21tb25VdGlsLmdldEZpbGVFeHQoaHJlZik7XG4gICAgICAgIGxldCBwYXNzZWQgPSAhW1wiLmRvY3hcIiwgXCIuZG9jXCIsIFwiLnBkZlwiLCBcIi5vZHRcIl0uaW5jbHVkZXMoZXh0KTtcbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZU1hbnVhbChcIk1hbnVhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSwgUnVsZVBvdGVudGlhbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGRyYWdnYWJsZV9hbHRlcm5hdGl2ZV9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZHJhZ2dhYmxlX2FsdGVybmF0aXZlX2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbZHJhZ2dhYmxlXVwiLFxuICAgIGRlcGVuZGVuY2llczogW10sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJkcmFnZ2FibGVfYWx0ZXJuYXRpdmVfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIC8vIFwicGFzc19hbHRlcm5hdGl2ZVwiOiBcImRyYWdnYWJsZV9hbHRlcm5hdGl2ZV9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJwYXNzX3VuZHJhZ2dhYmxlXCI6IFwiZHJhZ2dhYmxlX2FsdGVybmF0aXZlX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9hbHRlcm5hdGl2ZVwiOiBcImRyYWdnYWJsZV9hbHRlcm5hdGl2ZV9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIkEgZHJhZ2dhYmxlIGVsZW1lbnQgbXVzdCBoYXZlIGEgXFxcInNpbmdsZSBwb2ludGVyXFxcIiBhbHRlcm5hdGl2ZVwiLFxuICAgICAgICAgICAgLy8gXCJwYXNzX2FsdGVybmF0aXZlXCI6IFwiVGhlIGRyYWdnYWJsZSBlbGVtZW50IFxcXCJ7MH1cXFwiIGhhcyBhIFxcXCJzaW5nbGUgcG9pbnRlclxcXCIgYWx0ZXJuYXRpdmVcIixcbiAgICAgICAgICAgIFwicGFzc191bmRyYWdnYWJsZVwiOiBcIlRoZSBlbGVtZW50IFxcXCJ7MH1cXFwiIGlzIG5vdCBkcmFnZ2FibGVcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX2FsdGVybmF0aXZlXCI6IFwiRW5zdXJlIHRoZSBkcmFnZ2FibGUgZWxlbWVudCBcXFwiezB9XFxcIiBoYXMgYSBcXFwic2luZ2xlIHBvaW50ZXJcXFwiIGFsdGVybmF0aXZlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbIFwiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIG51bTogW1wiMi41LjdcIl0sXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgY29uc3Qgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvY2FsZUxvd2VyQ2FzZSgpOyBcbiAgICAgICAgICBcbiAgICAgICAgLy9pZ25vcmUgY2VydGFpbiBlbGVtZW50c1xuICAgICAgICBpZiAoQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgW1wicHJlXCIsIFwiY29kZVwiLCBcInNjcmlwdFwiLCBcIm1ldGFcIl0pICE9PSBudWxsIFxuICAgICAgICAgICAgfHwgbm9kZU5hbWUgPT09IFwiYm9keVwiIHx8IG5vZGVOYW1lID09PSBcImh0bWxcIiApXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJkcmFnZ2FibGVcIikgPT09ICd0cnVlJykgXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF9hbHRlcm5hdGl2ZVwiLCBbbm9kZU5hbWVdKTtcbiAgICAgICAgZWxzZSBpZiAocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiZHJhZ2dhYmxlXCIpID09PSAnZmFsc2UnKSBcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NfdW5kcmFnZ2FibGVcIiwgW25vZGVOYW1lXSk7XG4gICAgICAgIGVsc2UgXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5pbXBvcnQgeyBBUklBRGVmaW5pdGlvbnMgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBRGVmaW5pdGlvbnNcIjtcbmltcG9ydCB7IEFSSUFNYXBwZXIgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBTWFwcGVyXCI7XG5pbXBvcnQgeyBBY2NOYW1lVXRpbCB9IGZyb20gXCIuLi91dGlsL0FjY05hbWVVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBlbGVtZW50X2FjY2Vzc2tleV9sYWJlbGxlZDogUnVsZSA9IHtcbiAgICBpZDogXCJlbGVtZW50X2FjY2Vzc2tleV9sYWJlbGxlZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbYWNjZXNza2V5XVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiSEFBQ19BY2Nlc3NrZXlfTmVlZExhYmVsXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImVsZW1lbnRfYWNjZXNza2V5X2xhYmVsbGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJlbGVtZW50X2FjY2Vzc2tleV9sYWJlbGxlZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZWxlbWVudF9hY2Nlc3NrZXlfbGFiZWxsZWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlRoZSBlbGVtZW50IHdpdGggYW4gYXNzaWduZWQgJ2FjY2Vzc2tleScgYXR0cmlidXRlIGRvZXMgbm90IGhhdmUgYW4gYXNzb2NpYXRlZCBsYWJlbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkFuIGVsZW1lbnQgd2l0aCBhbiBhc3NpZ25lZCAnYWNjZXNza2V5JyBhdHRyaWJ1dGUgbXVzdCBoYXZlIGFuIGFzc29jaWF0ZWQgbGFiZWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3sgXG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLCBcbiAgICAgICAgXCJudW1cIjogW1wiMy4zLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sIFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORSBcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IGlzIGhpZGRlbiBvciBkaXNhYmxlZFxuICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShydWxlQ29udGV4dCkgfHwgQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgLy9za2lwIGlmIHRoZSBlbGVtZW50IGlzIHRhYmJhYmxlLCBpdCdzIGNvdmVyZWQgYnkgb3RoZXIgcnVsZXNcbiAgICAgICAgaWYgKENvbW1vblV0aWwuaXNUYWJiYWJsZShydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgbGV0IHJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXMocnVsZUNvbnRleHQsIHRydWUpO1xuICAgICAgICAvL3NraXAgdGhlIG5hdGl2ZSBlbGVtZW50LCBtb3N0bHkgdGV4dCBlbGVtZW50c1xuICAgICAgICBpZiAoIXJvbGVzIHx8IHJvbGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICAgIGxldCBwYXR0ZXJucyA9IEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlc1swXV1cbiAgICAgICAgaWYgKCFwYXR0ZXJucyB8fCAhcGF0dGVybnMubmFtZUZyb20pIFxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIC8vIGlnbm9yZSBpZiBhY2Nlc3NibGUgbmFtZSBpcyByZXF1aXJlZCAoY2hlY2tlZCBpbiBvdGhlciBydWxlcykgb3IgcHJvaGliaXRlZCAodGV4dCBlbGVtZW50KSAgICBcbiAgICAgICAgaWYgKHBhdHRlcm5zLm5hbWVSZXF1aXJlZCB8fCAhcGF0dGVybnMubmFtZUZyb20gfHwgcGF0dGVybnMubmFtZUZyb20uaW5jbHVkZXMoXCJwcm9oaWJpdGVkXCIpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBcbiAgICAgICAgLy9zcGVjaWFsIGNhc2U6IGxlZ2VuZCwgYXMgYSBjaGlsZCBvZiBhIGZpZWxkc2V0LCBkZWxlZ2F0ZSB0aGUgYWNjZXNza2V5IGNvbW1hbmQgdG8gdGhlIGZpZWxkIG9mIHRoZSBmaWVsZHNldCB3aGljaCBpcyBjb3ZlcmVkIGJ5IG90aGVyIHJ1bGVzIFxuICAgICAgICBpZiAocnVsZUNvbnRleHQucGFyZW50RWxlbWVudCAmJiBydWxlQ29udGV4dC5wYXJlbnRFbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdmaWVsZHNldCcpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgLy8gY2hlY2sgaWYgYWNjZXNzaWJsZSBuYW1lIGV4aXN0c1xuICAgICAgICBjb25zdCBwYWlyID0gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKHBhaXIgJiYgcGFpci5uYW1lICYmIHBhaXIubmFtZS50cmltKCkubGVuZ3RoID4gMClcbiAgICAgICAgLy9pZiAoQVJJQU1hcHBlci5jb21wdXRlTmFtZShydWxlQ29udGV4dCkudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDYWNoZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGVsZW1lbnRfYWNjZXNza2V5X3VuaXF1ZTogUnVsZSA9IHtcbiAgICBpZDogXCJlbGVtZW50X2FjY2Vzc2tleV91bmlxdWVcIixcbiAgICBjb250ZXh0OiBcImRvbToqW2FjY2Vzc2tleV1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9FbGVtX1VuaXF1ZUFjY2Vzc0tleVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImVsZW1lbnRfYWNjZXNza2V5X3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImVsZW1lbnRfYWNjZXNza2V5X3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZWxlbWVudF9hY2Nlc3NrZXlfdW5pcXVlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiJ2FjY2Vzc2tleScgYXR0cmlidXRlIHZhbHVlIG9uIHRoZSBlbGVtZW50IGlzIG5vdCB1bmlxdWVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCInYWNjZXNza2V5JyBhdHRyaWJ1dGUgdmFsdWVzIG9uIGVhY2ggZWxlbWVudCBtdXN0IGJlIHVuaXF1ZSBmb3IgdGhlIHBhZ2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIkhUTUxcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgbWFwID0gQ2FjaGVVdGlsLmdldENhY2hlKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsIFwiZWxlbWVudF9hY2Nlc3NrZXlfdW5pcXVlXCIsIHt9KTtcbiAgXG4gICAgICAgIGxldCBrZXkgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhY2Nlc3NrZXlcIik7XG5cbiAgICAgICAgbGV0IHBhc3NlZCA9ICEoa2V5IGluIG1hcCk7XG4gICAgICAgIG1hcFtrZXldID0gdHJ1ZTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuY29uc3QgREVQUkVDQVRFRF9FTEVNRU5UUyA9IFtcbiAgICAvKiogb3JpZ2luYWwgKi9cbiAgICBcImFwcGxldFwiLCBcImJhc2Vmb250XCIsIFwiY2VudGVyXCIsIFwiZGlyXCIsIFwiZm9udFwiLCBcImlzaW5kZXhcIiwgXCJsaXN0aW5nXCIsXG4gICAgXCJwbGFpbnRleHRcIiwgXCJzcGFjZXJcIiwgXCJzXCIsIFwic3RyaWtlXCIsIFwidVwiLCBcInhtcFwiLFxuICAgIC8qKiBhZGRlZCBmcm9tIGh0dHBzOi8vZGV2LnczLm9yZy9odG1sNS9wZi1zdW1tYXJ5L29ic29sZXRlLmh0bWwgKi9cbiAgICBcImFjcm9ueW1cIiwgXCJmcmFtZVwiLCBcImZyYW1lc2V0XCIsIFwibm9mcmFtZXNcIiwgXCJub2VtYmVkXCIsIFwiYmlnXCIsIFwiYmxpbmtcIiwgXCJtYXJxdWVlXCIsIFwidHRcIixcblxuXVxuXG5jb25zdCBERVBSRUNBVEVEX0hUTUxfR0xPQkFMX0FUVFJJQlVURVMgPSBbXG4gICAgLyoqIG9yaWdpbmFsICovXG4gICAgXCJhbGlnblwiLCBcImxpbmtcIiwgXCJhcmNoaXZlXCIsIFwiYmFja2dyb3VuZFwiLCBcImJnY29sb3JcIiwgXCJjbGVhclwiLCBcImNvZGVcIiwgXCJjb2xvclwiLFxuICAgIFwiY29tcGFjdFwiLCBcImZhY2VcIiwgXCJoc3BhY2VcIiwgXCJsYW5ndWFnZVwiLCBcImxpbmtcIiwgXCJub3NoYWRlXCIsIFwibm93cmFwXCIsIFwib2JqZWN0XCIsXG4gICAgXCJwcm9tcHRcIiwgXCJzdGFydFwiLCBcInRleHRcIiwgXCJ2ZXJzaW9uXCIsIFwidmxpbmtcIiwgXCJ2c3BhY2VcIlxuXVxuXG5jb25zdCBERVBSRUNBVEVEX0VMRU1FTlRfQVRUUklCVVRFUyA9IHtcbiAgICAvKiogb3JpZ2luYWwgKi9cbiAgICBcInRkXCI6IFtcImhlaWdodFwiLCBcIndpZHRoXCIsIFwiYWJiclwiLCBcImF4aXNcIiwgXCJjaGFyXCIsIFwiY2hhcm9mZlwiLCBcImhlaWdodFwiLCBcIm5vd3JhcFwiLCBcInZhbGlnblwiLCBcIndpZHRoXCIsIFwiYWxpZ25cIiwgXCJiZ2NvbG9yXCJdLFxuICAgIFwidGhcIjogW1wiaGVpZ2h0XCIsIFwid2lkdGhcIiwgXCJhYmJyXCIsIFwiYXhpc1wiLCBcImNoYXJvZmZcIiwgXCJoZWlnaHRcIiwgXCJiZ2NvbG9yXCIsIFwiYWxpZ25cIiwgXCJub3dyYXBcIiwgXCJjaGFyXCIsIFwidmFsaWduXCIsIFwid2lkdGhcIl0sXG4gICAgXCJsaVwiOiBbXCJ0eXBlXCIsIFwidmFsdWVcIiwgXCJ0eXBlXCJdLFxuICAgIFwidWxcIjogW1widHlwZVwiLCBcImNvbXBhY3RcIl0sXG4gICAgXCJwcmVcIjogW1wid2lkdGhcIl0sXG5cbiAgICAvKiogYWRkZWQgZnJvbSBodHRwczovL2Rldi53My5vcmcvaHRtbDUvcGYtc3VtbWFyeS9vYnNvbGV0ZS5odG1sICovXG4gICAgXCJtZXRhXCI6IFtcImh0dHAtZXF1aXZcIl0sXG4gICAgXCJhXCI6IFtcImNoYXJzZXRcIiwgXCJjb29yZHNcIiwgXCJzaGFwZVwiLCBcInJldlwiLCBcInNjaGVtZVwiXSxcbiAgICBcImxpbmtcIjogW1wicmV2XCIsIFwiY2hhcnNldFwiLCBcInRhcmdldFwiXSxcbiAgICBcImltZ1wiOiBbXCJuYW1lXCIsIFwibG9uZ2Rlc2NcIiwgXCJhbGlnblwiLCBcImhzcGFjZVwiLCBcInZzcGFjZVwiLCBcImJvcmRlclwiXSxcbiAgICBcImFyZWFcIjogW1wibm9ocmVmXCJdLFxuICAgIFwiaGVhZFwiOiBbXCJwcm9maWxlXCJdLFxuICAgIFwiaHRtbFwiOiBbXCJ2ZXJzaW9uXCJdLFxuICAgIFwiaWZyYW1lXCI6IFtcImxvbmdkZXNjXCIsIFwiYWxpZ25cIiwgXCJmcmFtZWJvcmRlclwiLCBcIm1hcmdpbmhlaWdodFwiLCBcIm1hcmdpbndpZHRoXCIsIFwic2Nyb2xsaW5nXCJdLFxuICAgIFwib2JqZWN0XCI6IFtcImFyY2hpdmVcIiwgXCJjb2RlXCIsIFwiY29kZWJhc2VcIiwgXCJjb2RldHlwZVwiLCBcImRlY2xhcmVcIiwgXCJzdGFuZGJ5XCIsIFwiYWxpZ25cIiwgXCJoc3BhY2VcIiwgXCJ2c3BhY2VcIiwgXCJib3JkZXJcIl0sXG4gICAgXCJwYXJhbVwiOiBbXCJ0eXBlXCIsIFwidmFsdWV0eXBlXCJdLFxuICAgIFwic2NyaXB0XCI6IFtcImxhbmd1YWdlXCJdLFxuICAgIFwiYm9keVwiOiBbXCJhbGlua1wiLCBcImJhY2tncm91bmRcIiwgXCJiZ2NvbG9yXCIsIFwibGlua1wiLCBcInRleHRcIiwgXCJ2bGlua1wiXSxcbiAgICBcImJyXCI6IFtcImNsZWFyXCJdLFxuICAgIFwiY2FwdGlvblwiOiBbXCJhbGlnblwiXSxcbiAgICBcImNvbFwiOiBbXCJhbGlnblwiLCBcImNoYXJcIiwgXCJjaGFyb2ZmXCIsIFwidmFsaWduXCIsIFwid2lkdGhcIl0sXG4gICAgXCJkaXZcIjogW1wiYWxpZ25cIl0sXG4gICAgXCJkbFwiOiBbXCJjb21wYWN0XCJdLFxuICAgIFwiaHJcIjogW1wiYWxpZ25cIiwgXCJub3NoYWRlXCIsIFwic2l6ZVwiLCBcIndpZHRoXCIsIFwiYWxpZ25cIl0sXG4gICAgXCJoMlwiOiBbXCJhbGlnblwiXSxcbiAgICBcImgzXCI6IFtcImFsaWduXCJdLFxuICAgIFwiaDRcIjogW1wiYWxpZ25cIl0sXG4gICAgXCJoNVwiOiBbXCJhbGlnblwiXSxcbiAgICBcImg2XCI6IFtcImFsaWduXCJdLFxuICAgIFwiaW5wdXRcIjogW1wiYWxpZ25cIiwgXCJ1c2VtYXBcIl0sXG4gICAgXCJsZWdlbmRcIjogW1wiYWxpZ25cIl0sXG4gICAgXCJtZW51XCI6IFtcImNvbXBhY3RcIl0sXG4gICAgXCJvbFwiOiBbXCJjb21wYWN0XCIsIFwidHlwZVwiLCBcInR5cGVcIl0sXG4gICAgXCJwXCI6IFtcImFsaWduXCJdLFxuICAgIFwidGFibGVcIjogW1wiYmdjb2xvclwiLCBcImNlbGxwYWRkaW5nXCIsIFwiY2VsbHNwYWNpbmdcIiwgXCJmcmFtZVwiLCBcInJ1bGVzXCIsIFwid2lkdGhcIiwgXCJhbGlnblwiXSxcbiAgICBcInRib2R5XCI6IFtcImFsaWduXCIsIFwiY2hhclwiLCBcInZhbGlnblwiLCBcImNoYXJvZmZcIl0sXG4gICAgXCJ0Zm9vdFwiOiBbXCJhbGlnblwiLCBcImNoYXJvZmZcIiwgXCJjaGFyXCIsIFwidmFsaWduXCJdLFxuICAgIFwidGhlYWRcIjogW1wiY2hhclwiLCBcImNoYXJvZmZcIiwgXCJ2YWxpZ25cIiwgXCJhbGlnblwiXSxcbiAgICBcInRyXCI6IFtcImFsaWduXCIsIFwiYmdjb2xvclwiLCBcImNoYXJcIiwgXCJjaGFyb2ZmXCIsIFwidmFsaWduXCJdXG59XG5cbmZ1bmN0aW9uIGFycmF5VG9Db250ZXh0U3RyKG9iaiwgdHlwZSkge1xuICAgIGxldCBzdHIgPSBcIlwiO1xuICAgIGZvciAoY29uc3QgcHJvcCBvZiBvYmopIHtcbiAgICAgICAgaWYgKHN0ciAhPT0gJycgJiYgIXN0ci5lbmRzV2l0aCgnLCAnKSkgc3RyICs9IFwiLCBcIjtcbiAgICAgICAgaWYgKHR5cGUgPT09ICdIVE1MX0VMRU1FTlRTJylcbiAgICAgICAgICAgIHN0ciArPSAnZG9tOicgKyBwcm9wO1xuICAgICAgICBlbHNlIGlmICh0eXBlID09PSAnSFRNTF9BVFRSSUJVVEVTJylcbiAgICAgICAgICAgIHN0ciArPSAnZG9tOipbJyArIHByb3AgKyBcIl1cIjtcbiAgICB9XG4gICAgcmV0dXJuIHN0cjtcbn1cblxuZnVuY3Rpb24gb2JqVG9Db250ZXh0U3RyKG9iaiwgdHlwZTogc3RyaW5nKSB7XG4gICAgbGV0IHN0ciA9IFwiXCI7XG4gICAgZm9yIChjb25zdCBwcm9wIGluIG9iaikge1xuICAgICAgICBpZiAoc3RyICE9PSAnJyAmJiAhc3RyLmVuZHNXaXRoKCcsICcpKSBzdHIgKz0gXCIsIFwiO1xuICAgICAgICBpZiAodHlwZSA9PT0gJ0hUTUxfRUxFTUVOVF9BVFRSSUJVVEVTJykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIG9ialtwcm9wXSBhcyBTdHJpbmdbXSkge1xuICAgICAgICAgICAgICAgIGlmIChzdHIgIT09ICcnICYmICFzdHIuZW5kc1dpdGgoXCIsIFwiKSkgc3RyICs9IFwiLCBcIjtcbiAgICAgICAgICAgICAgICBzdHIgKz0gJ2RvbTonICsgcHJvcCArICdbJyArIGl0ZW0gKyAnXSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gXG4gICAgfVxuICAgIHJldHVybiBzdHI7XG59XG5cbmV4cG9ydCBjb25zdCBlbGVtZW50X2F0dHJpYnV0ZV9kZXByZWNhdGVkOiBSdWxlID0ge1xuICAgIGlkOiBcImVsZW1lbnRfYXR0cmlidXRlX2RlcHJlY2F0ZWRcIixcbiAgICBjb250ZXh0OiBcImRvbTphcHBsZXQsIGRvbTpiYXNlZm9udCwgZG9tOmNlbnRlciwgZG9tOmRpciwgZG9tOmZvbnQsIGRvbTppc2luZGV4LCBkb206bGlzdGluZywgZG9tOm1lbnUsIGRvbTpwbGFpbnRleHQsIGRvbTpzcGFjZXIsIGRvbTpzLCBkb206c3RyaWtlLCBkb206dSwgZG9tOnhtcCwgZG9tOmFjcm9ueW0sIGRvbTpmcmFtZSwgZG9tOmZyYW1lc2V0LCBkb206bm9mcmFtZXMsIGRvbTpub2VtYmVkLCBkb206YmlnLCBkb206YmxpbmssIGRvbTptYXJxdWVlLCBkb206dHROYU5kb206KlthbGlnbl0sIGRvbToqW2xpbmtdLCBkb206KlthcmNoaXZlXSwgZG9tOipbYmFja2dyb3VuZF0sIGRvbToqW2JnY29sb3JdLCBkb206KltjbGVhcl0sIGRvbToqW2NvZGVdLCBkb206Kltjb2xvcl0sIGRvbToqW2NvbXBhY3RdLCBkb206KltmYWNlXSwgZG9tOipbaHNwYWNlXSwgZG9tOipbbGFuZ3VhZ2VdLCBkb206KltsaW5rXSwgZG9tOipbbm9zaGFkZV0sIGRvbToqW25vd3JhcF0sIGRvbToqW29iamVjdF0sIGRvbToqW3Byb21wdF0sIGRvbToqW3N0YXJ0XSwgZG9tOipbdGV4dF0sIGRvbToqW3ZlcnNpb25dLCBkb206Klt2bGlua10sIGRvbToqW3ZzcGFjZV1OYU5kb206dGRbaGVpZ2h0XSwgZG9tOnRkW3dpZHRoXSwgZG9tOnRkW2FiYnJdLCBkb206dGRbYXhpc10sIGRvbTp0ZFtjaGFyXSwgZG9tOnRkW2NoYXJvZmZdLCBkb206dGRbaGVpZ2h0XSwgZG9tOnRkW25vd3JhcF0sIGRvbTp0ZFt2YWxpZ25dLCBkb206dGRbd2lkdGhdLCBkb206dGRbYWxpZ25dLCBkb206dGRbYmdjb2xvcl0sIGRvbTp0aFtoZWlnaHRdLCBkb206dGhbd2lkdGhdLCBkb206dGhbYWJicl0sIGRvbTp0aFtheGlzXSwgZG9tOnRoW2NoYXJvZmZdLCBkb206dGhbaGVpZ2h0XSwgZG9tOnRoW2JnY29sb3JdLCBkb206dGhbYWxpZ25dLCBkb206dGhbbm93cmFwXSwgZG9tOnRoW2NoYXJdLCBkb206dGhbdmFsaWduXSwgZG9tOnRoW3dpZHRoXSwgZG9tOmxpW3R5cGVdLCBkb206bGlbdmFsdWVdLCBkb206bGlbdHlwZV0sIGRvbTp1bFt0eXBlXSwgZG9tOnVsW2NvbXBhY3RdLCBkb206cHJlW3dpZHRoXSwgZG9tOm1ldGFbaHR0cC1lcXVpdl0sIGRvbTphW2NoYXJzZXRdLCBkb206YVtjb29yZHNdLCBkb206YVtzaGFwZV0sIGRvbTphW3Jldl0sIGRvbTphW3NjaGVtZV0sIGRvbTpsaW5rW3Jldl0sIGRvbTpsaW5rW2NoYXJzZXRdLCBkb206bGlua1t0YXJnZXRdLCBkb206aW1nW25hbWVdLCBkb206aW1nW2xvbmdkZXNjXSwgZG9tOmltZ1thbGlnbl0sIGRvbTppbWdbaHNwYWNlXSwgZG9tOmltZ1t2c3BhY2VdLCBkb206aW1nW2JvcmRlcl0sIGRvbTphcmVhW25vaHJlZl0sIGRvbTpoZWFkW3Byb2ZpbGVdLCBkb206aHRtbFt2ZXJzaW9uXSwgZG9tOmlmcmFtZVtsb25nZGVzY10sIGRvbTppZnJhbWVbYWxpZ25dLCBkb206aWZyYW1lW2ZyYW1lYm9yZGVyXSwgZG9tOmlmcmFtZVttYXJnaW5oZWlnaHRdLCBkb206aWZyYW1lW21hcmdpbndpZHRoXSwgZG9tOmlmcmFtZVtzY3JvbGxpbmddLCBkb206b2JqZWN0W2FyY2hpdmVdLCBkb206b2JqZWN0W2NvZGVdLCBkb206b2JqZWN0W2NvZGViYXNlXSwgZG9tOm9iamVjdFtjb2RldHlwZV0sIGRvbTpvYmplY3RbZGVjbGFyZV0sIGRvbTpvYmplY3Rbc3RhbmRieV0sIGRvbTpvYmplY3RbYWxpZ25dLCBkb206b2JqZWN0W2hzcGFjZV0sIGRvbTpvYmplY3RbdnNwYWNlXSwgZG9tOm9iamVjdFtib3JkZXJdLCBkb206cGFyYW1bdHlwZV0sIGRvbTpwYXJhbVt2YWx1ZXR5cGVdLCBkb206c2NyaXB0W2xhbmd1YWdlXSwgZG9tOmJvZHlbYWxpbmtdLCBkb206Ym9keVtiYWNrZ3JvdW5kXSwgZG9tOmJvZHlbYmdjb2xvcl0sIGRvbTpib2R5W2xpbmtdLCBkb206Ym9keVt0ZXh0XSwgZG9tOmJvZHlbdmxpbmtdLCBkb206YnJbY2xlYXJdLCBkb206Y2FwdGlvblthbGlnbl0sIGRvbTpjb2xbYWxpZ25dLCBkb206Y29sW2NoYXJdLCBkb206Y29sW2NoYXJvZmZdLCBkb206Y29sW3ZhbGlnbl0sIGRvbTpjb2xbd2lkdGhdLCBkb206ZGl2W2FsaWduXSwgZG9tOmRsW2NvbXBhY3RdLCBkb206aHJbYWxpZ25dLCBkb206aHJbbm9zaGFkZV0sIGRvbTpocltzaXplXSwgZG9tOmhyW3dpZHRoXSwgZG9tOmhyW2FsaWduXSwgZG9tOmgyW2FsaWduXSwgZG9tOmgzW2FsaWduXSwgZG9tOmg0W2FsaWduXSwgZG9tOmg1W2FsaWduXSwgZG9tOmg2W2FsaWduXSwgZG9tOmlucHV0W2FsaWduXSwgZG9tOmlucHV0W3VzZW1hcF0sIGRvbTpsZWdlbmRbYWxpZ25dLCBkb206bWVudVtjb21wYWN0XSwgZG9tOm9sW2NvbXBhY3RdLCBkb206b2xbdHlwZV0sIGRvbTpvbFt0eXBlXSwgZG9tOnBbYWxpZ25dLCBkb206dGFibGVbYmdjb2xvcl0sIGRvbTp0YWJsZVtjZWxscGFkZGluZ10sIGRvbTp0YWJsZVtjZWxsc3BhY2luZ10sIGRvbTp0YWJsZVtmcmFtZV0sIGRvbTp0YWJsZVtydWxlc10sIGRvbTp0YWJsZVt3aWR0aF0sIGRvbTp0YWJsZVthbGlnbl0sIGRvbTp0Ym9keVthbGlnbl0sIGRvbTp0Ym9keVtjaGFyXSwgZG9tOnRib2R5W3ZhbGlnbl0sIGRvbTp0Ym9keVtjaGFyb2ZmXSwgZG9tOnRmb290W2FsaWduXSwgZG9tOnRmb290W2NoYXJvZmZdLCBkb206dGZvb3RbY2hhcl0sIGRvbTp0Zm9vdFt2YWxpZ25dLCBkb206dGhlYWRbY2hhcl0sIGRvbTp0aGVhZFtjaGFyb2ZmXSwgZG9tOnRoZWFkW3ZhbGlnbl0sIGRvbTp0aGVhZFthbGlnbl0sIGRvbTp0clthbGlnbl0sIGRvbTp0cltiZ2NvbG9yXSwgZG9tOnRyW2NoYXJdLCBkb206dHJbY2hhcm9mZl0sIGRvbTp0clt2YWxpZ25dXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImVsZW1lbnRfYXR0cmlidXRlX2RlcHJlY2F0ZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2VsZW1cIjogXCJlbGVtZW50X2F0dHJpYnV0ZV9kZXByZWNhdGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9hdHRyXCI6IFwiZWxlbWVudF9hdHRyaWJ1dGVfZGVwcmVjYXRlZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfZWxlbV9hdHRyXCI6IFwiZWxlbWVudF9hdHRyaWJ1dGVfZGVwcmVjYXRlZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZWxlbWVudF9hdHRyaWJ1dGVfZGVwcmVjYXRlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJmYWlsX2VsZW1cIjogXCJUaGUgPHswfT4gZWxlbWVudCBpcyBkZXByZWNhdGVkIGluIEhUTUwgNVwiLFxuICAgICAgICAgICAgXCJmYWlsX2F0dHJcIjogXCJUaGUgSFRNTCBhdHRyaWJ1dGUocykgXFxcInswfVxcXCIgaXMgZGVwcmVjYXRlZCBpbiBIVE1MIDVcIixcbiAgICAgICAgICAgIFwiZmFpbF9lbGVtX2F0dHJcIjogXCJUaGUgSFRNTCBhdHRyaWJ1dGUocykgXFxcInswfVxcXCIgaXMgZGVwcmVjYXRlZCBmb3IgdGhlIDx7MX0+IGVsZW1lbnQgaW4gSFRNTCA1XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQXZvaWQgdXNlIG9mIG9ic29sZXRlIGZlYXR1cmVzIGlmIHBvc3NpYmxlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7IFxuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiXSwgXG4gICAgICAgIFwibnVtXCI6IFtcIkhUTUxcIl0sIFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLCBcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRSBcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG5cbiAgICAgICAgLy8gSFRNTFVuaXQgYXV0byBhZGRzIGEgdGJvZHlbYWxpZ249bGVmdF0gdG8gdGFibGVzIGlmIHRib2R5IGlzIG1pc3NpbmchXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInRib2R5XCIgJiYgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiYWxpZ25cIikpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lm5vZGVOYW1lLmluY2x1ZGVzKFwiLVwiKSkge1xuICAgICAgICAgICAgLy8gVGhpcyBpcyBhIHdlYmNvbXBvbmVudCBlbGVtZW50LCBIVE1MIGRvZXNuJ3QgZGVmaW5lIHdoYXQncyBkZXByZWNhdGVkXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICBsZXQgcmV0ID0gW107XG4gICAgICAgIC8vIGNoZWNrIGlmIGl0J3MgYSBkZXByZWNhdGVkIGVsZW1lbnRcbiAgICAgICAgaWYgKERFUFJFQ0FURURfRUxFTUVOVFMuaW5jbHVkZXMobm9kZU5hbWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2VsZW1cIiwgW25vZGVOYW1lXSk7XG5cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNoZWNrIGlmIGl0J3MgYSBkZXByZWNhdGVkIEhUTUwgZ2xvYmFsIGF0dHJpYnV0ZVxuICAgICAgICBjb25zdCBhdHRycyA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZU5hbWVzKCk7XG4gICAgICAgIGxldCB2aW9sYXRpb25zID0gJyc7XG4gICAgICAgIGZvciAoY29uc3QgYXR0ciBvZiBhdHRycykge1xuICAgICAgICAgICAgaWYgKERFUFJFQ0FURURfSFRNTF9HTE9CQUxfQVRUUklCVVRFUy5pbmNsdWRlcyhhdHRyKSkge1xuICAgICAgICAgICAgICAgIGlmICh2aW9sYXRpb25zICE9PSAnJykgdmlvbGF0aW9ucyArPSAnLCAnO1xuICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMgKz0gYXR0cjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodmlvbGF0aW9ucyAhPT0gJycpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfYXR0clwiLCBbdmlvbGF0aW9uc10pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2hlY2sgaWYgaXQncyBhIGRlcHJlY2F0ZWQgSFRNTCBlbGVtZW50ICYgYXR0cmlidXRlXG4gICAgICAgIHZpb2xhdGlvbnMgPSAnJztcbiAgICAgICAgaWYgKG5vZGVOYW1lIGluIERFUFJFQ0FURURfRUxFTUVOVF9BVFRSSUJVVEVTKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGF0dHIgb2YgYXR0cnMpIHtcbiAgICAgICAgICAgICAgICBpZiAoREVQUkVDQVRFRF9FTEVNRU5UX0FUVFJJQlVURVNbbm9kZU5hbWVdICYmIERFUFJFQ0FURURfRUxFTUVOVF9BVFRSSUJVVEVTW25vZGVOYW1lXS5pbmNsdWRlcyhhdHRyKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodmlvbGF0aW9ucyAhPT0gJycpIHZpb2xhdGlvbnMgKz0gJywgJztcbiAgICAgICAgICAgICAgICAgICAgdmlvbGF0aW9ucyArPSBhdHRyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh2aW9sYXRpb25zICE9PSAnJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfZWxlbV9hdHRyXCIsIFt2aW9sYXRpb25zLCBub2RlTmFtZV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEZyYWdtZW50VXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9mcmFnbWVudFwiO1xuXG5leHBvcnQgY29uc3QgZWxlbWVudF9pZF91bmlxdWU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZWxlbWVudF9pZF91bmlxdWVcIixcbiAgICBjb250ZXh0OiBcImRvbToqW2lkXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX0VsZW1fVW5pcXVlSWRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcInBvdGVudGlhbF9lbXB0eVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJwb3RlbnRpYWxfaW5fdXNlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJlbGVtZW50X2lkX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcInBhc3NcIjogXCJlbGVtZW50X2lkX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9lbXB0eVwiOiBcImVsZW1lbnRfaWRfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX2luX3VzZVwiOiBcImVsZW1lbnRfaWRfdW5pcXVlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFbGVtZW50ICdpZCcgYXR0cmlidXRlIHZhbHVlcyBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYSBkb2N1bWVudFwiLFxuICAgICAgICAgICAgXCJwYXNzXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX2VtcHR5XCI6IFwiVGhlIDx7MH0+IGVsZW1lbnQgaGFzIHRoZSBpZCBcXFwiezF9XFxcIiB0aGF0IGlzIGVtcHR5XCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9pbl91c2VcIjogXCJUaGUgPHswfT4gZWxlbWVudCBoYXMgdGhlIGlkIFxcXCJ7MX1cXFwiIHRoYXQgaXMgYWxyZWFkeSBpbiB1c2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIkhUTUxcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbe1xuICAgICAgICBcIjNlYTBjOFwiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9lbXB0eVwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX2luX3VzZVwiOiBcImZhaWxcIlxuICAgICAgICB9XG4gICAgfV0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAgIGxldCBpZCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImlkXCIpO1xuXG4gICAgICAgIC8vIEluIHRoZSBjYXNlIHRoYXQgaWQgaXMgZW1wdHkgd2Ugc2hvdWxkIHRyaWdnZXIgYSB2aW9sYXRpb24gcmlnaHQgYXdheSB3aXRoIG91dCBjaGVja2luZyBcbiAgICAgICAgLy8gZm9yIHVuaXF1ZW5lc3MuXG4gICAgICAgIGlmIChpZCA9PT0gXCJcIikge1xuICAgICAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQoZmFsc2UsIFtydWxlQ29udGV4dF0sICcnLCAnJywgW3J1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksIGlkXSk7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF9lbXB0eVwiLCBbcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSwgaWRdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBlbGVtZW50ID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQocnVsZUNvbnRleHQsIGlkKTtcbiAgICAgICAgbGV0IHBhc3NlZCA9IGVsZW1lbnQgPT09IHJ1bGVDb250ZXh0O1xuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIFtydWxlQ29udGV4dF0sICcnLCAnJywgcGFzc2VkID09IHRydWUgPyBbXSA6IFtydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLCBpZF0pO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfaW5fdXNlXCIsIFtydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLCBpZF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHksIGVSdWxlQ29uZmlkZW5jZSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgTGFuZ1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGFuZ1wiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5pbXBvcnQgeyBBUklBTWFwcGVyIH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQU1hcHBlclwiO1xuaW1wb3J0IHsgQWNjTmFtZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BY2NOYW1lVXRpbFwiO1xuXG5jb25zdCB2YWxpZGF0ZUxhbmcgPSAoY29udGV4dDogUnVsZUNvbnRleHQpOiBudW1iZXIgPT4ge1xuICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwibGFuZ1wiKSkge1xuICAgICAgICBpZiAobm9kZU5hbWUgIT09IFwiaHRtbFwiICYmIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImxhbmdcIikgPT09IFwiXCIpIHtcbiAgICAgICAgICAgIC8vIEl0J3Mgb2theSB0byBoYXZlIGEgbGFuZz1cIlwiIGlmIG5vdCBvbiBodG1sXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgbGFuZ1N0ciA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImxhbmdcIik7XG4gICAgICAgICAgICBpZiAoIUxhbmdVdGlsLnZhbGlkUHJpbWFyeUxhbmcobGFuZ1N0cikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghTGFuZ1V0aWwuaXNCY3A0NyhsYW5nU3RyKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ4bWw6bGFuZ1wiKSkge1xuICAgICAgICBpZiAobm9kZU5hbWUgIT09IFwiaHRtbFwiICYmIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInhtbDpsYW5nXCIpID09PSBcIlwiKSB7XG4gICAgICAgICAgICAvLyBJdCdzIG9rYXkgdG8gaGF2ZSBhIGxhbmc9XCJcIiBpZiBub3Qgb24gaHRtbFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IGxhbmdTdHIgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ4bWw6bGFuZ1wiKTtcbiAgICAgICAgICAgIGlmICghTGFuZ1V0aWwudmFsaWRQcmltYXJ5TGFuZyhsYW5nU3RyKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFMYW5nVXRpbC5pc0JjcDQ3KGxhbmdTdHIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIDA7XG59XG5cbmV4cG9ydCBjb25zdCBodG1sX2xhbmdfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaHRtbF9sYW5nX3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJkb206aHRtbFtsYW5nXSwgZG9tOmh0bWxbeG1sOmxhbmddXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiaHRtbF9sYW5nX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiaHRtbF9sYW5nX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiaHRtbF9sYW5nX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiaHRtbF9sYW5nX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF80XCI6IFwiaHRtbF9sYW5nX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJodG1sX2xhbmdfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJMYW5nIGhhcyBhIHZhbGlkIHByaW1hcnkgbGFuZyBhbmQgY29uZm9ybXMgdG8gQkNQIDQ3XCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlNwZWNpZmllZCAnbGFuZycgYXR0cmlidXRlIGRvZXMgbm90IGluY2x1ZGUgYSB2YWxpZCBwcmltYXJ5IGxhbmd1YWdlXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIlNwZWNpZmllZCAnbGFuZycgYXR0cmlidXRlIGRvZXMgbm90IGNvbmZvcm0gdG8gQkNQIDQ3XCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcIlNwZWNpZmllZCAneG1sOmxhbmcnIGF0dHJpYnV0ZSBkb2VzIG5vdCBpbmNsdWRlIGEgdmFsaWQgcHJpbWFyeSBsYW5ndWFnZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzRcIjogXCJTcGVjaWZpZWQgJ3htbDpsYW5nJyBhdHRyaWJ1dGUgZG9lcyBub3QgY29uZm9ybSB0byBCQ1AgNDdcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgZGVmYXVsdCBodW1hbiBsYW5ndWFnZSBvZiB0aGUgcGFnZSBtdXN0IGJlIHZhbGlkIGFuZCBzcGVjaWZpZWQgaW4gYWNjb3JkYW5jZSB3aXRoIEJDUCA0N1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMy4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW3tcbiAgICAgICAgXCJiNWMzZjhcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImZhaWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcImluYXBwbGljYWJsZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzRcIjogXCJpbmFwcGxpY2FibGVcIlxuICAgICAgICB9LFxuICAgICAgICBcImJmMDUxYVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZmFpbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcImZhaWxcIixcbiAgICAgICAgICAgIFwiRmFpbF80XCI6IFwiaW5hcHBsaWNhYmxlXCJcbiAgICAgICAgfSxcbiAgICAgICAgLy8gVE9ETzogQUNUOiBNaXNtYXRjaCBiZWNhdXNlIHRoZXkgZG9uJ3QgY2hlY2sgdGhlIGh0bWwgZWxlbWVudCBpbiB0aGUgc2FtZSBydWxlXG4gICAgICAgIC8vIFwiZGU0NmU0XCI6IHtcbiAgICAgICAgLy8gICAgIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAvLyAgICAgXCJGYWlsXzFcIjogXCJmYWlsXCIsXG4gICAgICAgIC8vICAgICBcIkZhaWxfMlwiOiBcInBhc3NcIixcbiAgICAgICAgLy8gICAgIFwiRmFpbF8zXCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgIC8vICAgICBcIkZhaWxfNFwiOiBcImluYXBwbGljYWJsZVwiXG4gICAgICAgIC8vIH1cbiAgICB9XSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBsZXQgcmVhc29uQ29kZSA9IHZhbGlkYXRlTGFuZyhjb250ZXh0KTtcbiAgICAgICAgLy8gVGhpcyBpcyBkb25lIGhlcmUgaW5zdGVhZCBvZiBpbiB2YWxpZGF0ZUxhbmcgc28gdGhhdCB0aGUgZ2VuSGVscCBjb2RlIHdpbGwgcGljayBpdCB1cFxuICAgICAgICBsZXQgcmV0QXJyID0gW1xuICAgICAgICAgICAgUnVsZVBhc3MoXCJQYXNzXzBcIiksXG4gICAgICAgICAgICBSdWxlRmFpbChcIkZhaWxfMVwiKSxcbiAgICAgICAgICAgIFJ1bGVGYWlsKFwiRmFpbF8yXCIpLFxuICAgICAgICAgICAgUnVsZUZhaWwoXCJGYWlsXzNcIiksXG4gICAgICAgICAgICBSdWxlRmFpbChcIkZhaWxfNFwiKVxuICAgICAgICBdXG4gICAgICAgIHJldHVybiByZXRBcnJbcmVhc29uQ29kZV07XG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgZWxlbWVudF9sYW5nX3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcImVsZW1lbnRfbGFuZ192YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbbGFuZ10sIGRvbToqW3htbDpsYW5nXVwiLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImVsZW1lbnRfbGFuZ192YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImVsZW1lbnRfbGFuZ192YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcImVsZW1lbnRfbGFuZ192YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcImVsZW1lbnRfbGFuZ192YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfNFwiOiBcImVsZW1lbnRfbGFuZ192YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZWxlbWVudF9sYW5nX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiTGFuZyBoYXMgYSB2YWxpZCBwcmltYXJ5IGxhbmcgYW5kIGNvbmZvcm1zIHRvIEJDUCA0N1wiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJTcGVjaWZpZWQgJ2xhbmcnIGF0dHJpYnV0ZSBkb2VzIG5vdCBpbmNsdWRlIGEgdmFsaWQgcHJpbWFyeSBsYW5ndWFnZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJTcGVjaWZpZWQgJ2xhbmcnIGF0dHJpYnV0ZSBkb2VzIG5vdCBjb25mb3JtIHRvIEJDUCA0N1wiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJTcGVjaWZpZWQgJ3htbDpsYW5nJyBhdHRyaWJ1dGUgZG9lcyBub3QgaW5jbHVkZSBhIHZhbGlkIHByaW1hcnkgbGFuZ3VhZ2VcIixcbiAgICAgICAgICAgIFwiRmFpbF80XCI6IFwiU3BlY2lmaWVkICd4bWw6bGFuZycgYXR0cmlidXRlIGRvZXMgbm90IGNvbmZvcm0gdG8gQkNQIDQ3XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGhlIGNoYW5nZSBpbiBsYW5ndWFnZSBvZiBzcGVjaWZpYyBjb250ZW50IG11c3QgYmUgdmFsaWQgYW5kIHNwZWNpZmllZCBpbiBhY2NvcmRhbmNlIHdpdGggQkNQIDQ3XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIzLjEuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFt7XG4gICAgICAgIC8vIFwiYjVjM2Y4XCI6IHtcbiAgICAgICAgLy8gICAgIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAvLyAgICAgXCJGYWlsXzFcIjogXCJmYWlsXCIsXG4gICAgICAgIC8vICAgICBcIkZhaWxfMlwiOiBcImluYXBwbGljYWJsZVwiLFxuICAgICAgICAvLyAgICAgXCJGYWlsXzNcIjogXCJpbmFwcGxpY2FibGVcIixcbiAgICAgICAgLy8gICAgIFwiRmFpbF80XCI6IFwiaW5hcHBsaWNhYmxlXCJcbiAgICAgICAgLy8gfSxcbiAgICAgICAgLy8gXCJiZjA1MWFcIjoge1xuICAgICAgICAvLyAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgIC8vICAgICBcIkZhaWxfMVwiOiBcImZhaWxcIixcbiAgICAgICAgLy8gICAgIFwiRmFpbF8yXCI6IFwicGFzc1wiLFxuICAgICAgICAvLyAgICAgXCJGYWlsXzNcIjogXCJmYWlsXCIsXG4gICAgICAgIC8vICAgICBcIkZhaWxfNFwiOiBcImluYXBwbGljYWJsZVwiXG4gICAgICAgIC8vIH0sXG4gICAgICAgIC8vIFRPRE86IEFDVDogTWlzbWF0Y2ggYmVjYXVzZSB0aGV5IGRvbid0IGNoZWNrIHRoZSBodG1sIGVsZW1lbnQgaW4gdGhlIHNhbWUgcnVsZVxuICAgICAgICBcImRlNDZlNFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZmFpbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcImluYXBwbGljYWJsZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzRcIjogXCJpbmFwcGxpY2FibGVcIlxuICAgICAgICB9XG4gICAgfV0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgLy8gSWYgaXQncyB0aGUgSFRNTCBub2RlLCB0aGF0J3MgaGFuZGxlZCBieSBodG1sX2xhbmdfdmFsaWRcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSBcImh0bWxcIikgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCByZWFzb25Db2RlID0gdmFsaWRhdGVMYW5nKGNvbnRleHQpO1xuICAgICAgICAvLyBUaGlzIGlzIGRvbmUgaGVyZSBpbnN0ZWFkIG9mIGluIHZhbGlkYXRlTGFuZyBzbyB0aGF0IHRoZSBnZW5IZWxwIGNvZGUgd2lsbCBwaWNrIGl0IHVwXG4gICAgICAgIGxldCByZXRBcnIgPSBbXG4gICAgICAgICAgICBSdWxlUGFzcyhcIlBhc3NfMFwiKSxcbiAgICAgICAgICAgIFJ1bGVGYWlsKFwiRmFpbF8xXCIpLFxuICAgICAgICAgICAgUnVsZUZhaWwoXCJGYWlsXzJcIiksXG4gICAgICAgICAgICBSdWxlRmFpbChcIkZhaWxfM1wiKSxcbiAgICAgICAgICAgIFJ1bGVGYWlsKFwiRmFpbF80XCIpXG4gICAgICAgIF1cbiAgICAgICAgbGV0IHJldFZhbCA9IHJldEFycltyZWFzb25Db2RlXTtcbiAgICAgICAgaWYgKHJldFZhbC52YWx1ZVsxXSAhPT0gZVJ1bGVDb25maWRlbmNlLlBBU1MpIHtcbiAgICAgICAgICAgIC8vIEVuc3VyZSB0aGF0IHRoZXJlJ3MgYWN0dWFsbHkgY29udGVudCBvZiB0aGlzIGVsZW1lbnQgLSBza2lwIHN1YnRyZWVzIHRoYXQgaGF2ZSBvdGhlciBsYW5nIGF0dHJpYnV0ZXNcbiAgICAgICAgICAgIGxldCBoYXNDb250ZW50ID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuZmlyc3RDaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGxldCBudyA9IG5ldyBET01XYWxrZXIocnVsZUNvbnRleHQsIGZhbHNlLCBydWxlQ29udGV4dCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgd2hpbGUgKCFoYXNDb250ZW50ICYmIG53Lm5leHROb2RlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2tpcCBoaWRkZW5cbiAgICAgICAgICAgICAgICAgICAgaWYgKG53Lm5vZGUubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlbGVtZW50ID0gbncubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFWaXNVdGlsLmlzTm9kZVZpc2libGUoZWxlbWVudCkgfHwgZWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJsYW5nXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbncuYkVuZFRhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWUoZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzQ29udGVudCA9IGhhc0NvbnRlbnQgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbWdcIiAmJiAocGFpciAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwKS8qKkFSSUFNYXBwZXIuY29tcHV0ZU5hbWUoZWxlbWVudCkudHJpbSgpLmxlbmd0aCA+IDAqLztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhc0NvbnRlbnQgPSBoYXNDb250ZW50IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG53Lm5vZGUubm9kZVR5cGUgPT09IDMgJiYgbncubm9kZS5ub2RlVmFsdWUudHJpbSgpLmxlbmd0aCA+IDA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWhhc0NvbnRlbnQpIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGNvbnN0IGVsZW1lbnRfbW91c2VldmVudF9rZXlib2FyZDogUnVsZSA9IHtcbiAgICBpZDogXCJlbGVtZW50X21vdXNlZXZlbnRfa2V5Ym9hcmRcIixcbiAgICBjb250ZXh0OiBcImRvbToqW29uZGJsY2xpY2tdLCBkb206Kltvbm1vdXNlbW92ZV0sIGRvbToqW29ubW91c2Vkb3duXSwgZG9tOipbb25tb3VzZXVwXSwgZG9tOipbb25tb3VzZW92ZXJdLCBkb206Kltvbm1vdXNlb3V0XSwgZG9tOipbb25jbGlja11cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9FbGVtX0V2ZW50TW91c2VBbmRLZXlcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJNYW51YWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiZWxlbWVudF9tb3VzZWV2ZW50X2tleWJvYXJkLmh0bWxcIixcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJlbGVtZW50X21vdXNlZXZlbnRfa2V5Ym9hcmQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImVsZW1lbnRfbW91c2VldmVudF9rZXlib2FyZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwiQ29uZmlybSB0aGUgPHswfT4gZWxlbWVudCB3aXRoIG1vdXNlIGV2ZW50IGhhbmRsZXIocykgJ3sxfScgaGFzIGEgY29ycmVzcG9uZGluZyBrZXlib2FyZCBoYW5kbGVyKHMpXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQWxsIGludGVyYWN0aXZlIGNvbnRlbnQgd2l0aCBtb3VzZSBldmVudCBoYW5kbGVycyBtdXN0IGhhdmUgZXF1aXZhbGVudCBrZXlib2FyZCBhY2Nlc3NcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImhyZWZcIikgfHxcbiAgICAgICAgICAgICghcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25kYmxjbGlja1wiKSAmJlxuICAgICAgICAgICAgICAgICFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbm1vdXNlbW92ZVwiKSAmJlxuICAgICAgICAgICAgICAgICghcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25tb3VzZWRvd25cIikgfHwgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25rZXlkb3duXCIpKSAmJlxuICAgICAgICAgICAgICAgICghcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25tb3VzZXVwXCIpIHx8IHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9ua2V5dXBcIikpICYmXG4gICAgICAgICAgICAgICAgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbm1vdXNlb3ZlclwiKSB8fCBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmZvY3VzXCIpKSAmJlxuICAgICAgICAgICAgICAgICghcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25tb3VzZW91dFwiKSB8fCBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmJsdXJcIikpICYmXG4gICAgICAgICAgICAgICAgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmNsaWNrXCIpIHx8IHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9ua2V5cHJlc3NcIikgfHxcbiAgICAgICAgICAgICAgICAgICAgbm9kZU5hbWUgPT0gXCJhXCIgfHwgbm9kZU5hbWUgPT0gXCJidXR0b25cIikpO1xuXG4gICAgICAgIGxldCBmYWlsZWRNb3VzZUV2ZW50cyA9IG5ldyBBcnJheSgpO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgLy9zdG9yZSBhbmQgZGlzcGxheSBldmVudCBuYW1lIGFuZCBub2RlIG5hbWUgaW4gdGhlIHRva2Vuc1xuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9uZGJsY2xpY2tcIikpIHtcbiAgICAgICAgICAgICAgICBmYWlsZWRNb3VzZUV2ZW50cy5wdXNoKFwib25kYmxjbGlja1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbm1vdXNlbW92ZVwiKSkge1xuICAgICAgICAgICAgICAgIGZhaWxlZE1vdXNlRXZlbnRzLnB1c2goXCJvbm1vdXNlbW92ZVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbm1vdXNlZG93blwiKSAmJiAhcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25rZXlkb3duXCIpKSB7XG4gICAgICAgICAgICAgICAgZmFpbGVkTW91c2VFdmVudHMucHVzaChcIm9ubW91c2Vkb3duXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9ubW91c2V1cFwiKSAmJiAhcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25rZXl1cFwiKSkge1xuICAgICAgICAgICAgICAgIGZhaWxlZE1vdXNlRXZlbnRzLnB1c2goXCJvbm1vdXNldXBcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25tb3VzZW92ZXJcIikgJiYgIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9uZm9jdXNcIikpIHtcbiAgICAgICAgICAgICAgICBmYWlsZWRNb3VzZUV2ZW50cy5wdXNoKFwib25tb3VzZW92ZXJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25tb3VzZW91dFwiKSAmJiAhcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25ibHVyXCIpKSB7XG4gICAgICAgICAgICAgICAgZmFpbGVkTW91c2VFdmVudHMucHVzaChcIm9ubW91c2VvdXRcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25jbGlja1wiKSAmJiAhcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25rZXlwcmVzc1wiKSkge1xuICAgICAgICAgICAgICAgIGlmICghKG5vZGVOYW1lID09IFwiYVwiIHx8IG5vZGVOYW1lID09IFwiYnV0dG9uXCIpKVxuICAgICAgICAgICAgICAgICAgICBmYWlsZWRNb3VzZUV2ZW50cy5wdXNoKFwib25jbGlja1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFzc2VkID8gUnVsZVBhc3MoXCJQYXNzXzBcIikgOiBSdWxlTWFudWFsKFwiTWFudWFsXzFcIiwgW25vZGVOYW1lLCBmYWlsZWRNb3VzZUV2ZW50cy5qb2luKFwiLCBcIildKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDU1NVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ1NTVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgZWxlbWVudF9vcmllbnRhdGlvbl91bmxvY2tlZDogUnVsZSA9IHtcbiAgICBpZDogXCJlbGVtZW50X29yaWVudGF0aW9uX3VubG9ja2VkXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJlbGVtZW50X29yaWVudGF0aW9uX3VubG9ja2VkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9sb2NrZWRcIjogXCJlbGVtZW50X29yaWVudGF0aW9uX3VubG9ja2VkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJlbGVtZW50X29yaWVudGF0aW9uX3VubG9ja2VkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlRoZSBlbGVtZW50IGlzIG5vdCByZXN0cmljdGVkIHRvIGVpdGhlciBsYW5kc2NhcGUgb3IgcG9ydHJhaXQgb3JpZW50YXRpb24gdXNpbmcgQ1NTIHRyYW5zZm9ybSBwcm9wZXJ0eVwiLFxuICAgICAgICAgICAgXCJmYWlsX2xvY2tlZFwiOiBcIlRoZSBlbGVtZW50IDx7MH0+IGlzIHJlc3RyaWN0ZWQgdG8gZWl0aGVyIGxhbmRzY2FwZSBvciBwb3J0cmFpdCBvcmllbnRhdGlvbiB1c2luZyBDU1MgdHJhbnNmb3JtIHByb3BlcnR5XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWxlbWVudHMgc2hvdWxkIG5vdCBiZSByZXN0cmljdGVkIHRvIGVpdGhlciBsYW5kc2NhcGUgb3IgcG9ydHJhaXQgb3JpZW50YXRpb24gdXNpbmcgQ1NTIHRyYW5zZm9ybSBwcm9wZXJ0eVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjRcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogWydiMzNlZmYnXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgICAvL3NraXAgaW52aXNpYmxlIGVsZW1lbnRcbiAgICAgICAgaWYgKCFWaXNVdGlsLmlzTm9kZVZpc2libGUocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICAvL3NraXAgZWxlbWVudHNcbiAgICAgICAgaWYgKENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFtcInNjcmlwdFwiLCBcIm1ldGFcIiwgXCJ0aXRsZVwiXSkpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIFxuICAgICAgICAvLyBjYWNoZSB0aGUgb3JpZW50YXRpb24gcmVzdWx0IGZvciBhbGwgdGhlIGVsZW1lbnRzIGluIHRoZSBwYWdlXG4gICAgICAgIGxldCBkb2MgPSBGcmFnbWVudFV0aWwuZ2V0T3duZXJGcmFnbWVudChydWxlQ29udGV4dCkgYXMgYW55O1xuICAgICAgICBsZXQgb3JpZW50YXRpb25UcmFuc2Zvcm1zID0gQ2FjaGVVdGlsLmdldENhY2hlKGRvYywgXCJSUFRVdGlsX01FRElBX09SSUVOVEFUSU9OX1RSQU5TRlJPTVwiLCBudWxsKTtcbiAgICAgICAgaWYgKCFvcmllbnRhdGlvblRyYW5zZm9ybXMpIHtcbiAgICAgICAgICAgIG9yaWVudGF0aW9uVHJhbnNmb3JtcyA9IENTU1V0aWwuZ2V0TWVkaWFPcmllbnRhdGlvblRyYW5zZm9ybShkb2MpO1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGRvYywgXCJSUFRVdGlsX01FRElBX09SSUVOVEFUSU9OX1RSQU5TRlJPTVwiLCBvcmllbnRhdGlvblRyYW5zZm9ybXMpO1xuICAgICAgICB9IFxuICAgICAgICBcbiAgICAgICAgLy8gZmluZCBpZiB0aGUgZWxlbWVudCBtYXRjaGVzIG9yaWVudGF0aW9uIHNlbGVjdG9yKHMpXG4gICAgICAgIGxldCBtZWRpYV90cmFuc2Zvcm1zID0gW107XG4gICAgICAgIE9iamVjdC5rZXlzKG9yaWVudGF0aW9uVHJhbnNmb3JtcykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgT2JqZWN0LmtleXMob3JpZW50YXRpb25UcmFuc2Zvcm1zW2tleV0pLmZvckVhY2godGFnID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMob3JpZW50YXRpb25UcmFuc2Zvcm1zW2tleV1bdGFnXSkubGVuZ3RoID4gMCAmJiBDU1NVdGlsLnNlbGVjdG9yTWF0Y2hlc0VsZW0ocnVsZUNvbnRleHQsIHRhZykpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWVudGF0aW9uVHJhbnNmb3Jtc1trZXldW3RhZ10udHJhbnNmb3JtKVxuICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFfdHJhbnNmb3Jtcy5wdXNoKG9yaWVudGF0aW9uVHJhbnNmb3Jtc1trZXldW3RhZ10udHJhbnNmb3JtKTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFfdHJhbnNmb3Jtcy5wdXNoKG9yaWVudGF0aW9uVHJhbnNmb3Jtc1trZXldW3RhZ10pO1xuICAgICAgICAgICAgICAgIH0gICAgXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICAvLyBubyBtYXRjaCwgdGhlIGVsZW1lbnQgaXMgbm90IGluIG1lZGlhIG9yaWVudGF0aW9uIHRyYW5zZm9ybVxuICAgICAgICBpZiAobWVkaWFfdHJhbnNmb3Jtcy5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgbGV0IHJldCA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBtZWRpYV90cmFuc2Zvcm1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgbWVkaWFfdHJhbnNmb3JtID0gbWVkaWFfdHJhbnNmb3Jtc1tpXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbWVkaWFfdHJhbnNmb3JtID09PSAnb2JqZWN0JylcbiAgICAgICAgICAgICAgICBmb3IodmFyIGtleSBpbiBtZWRpYV90cmFuc2Zvcm0pXG4gICAgICAgICAgICAgICAgICAgIG1lZGlhX3RyYW5zZm9ybSA9IGtleSArXCIoXCIgKyBtZWRpYV90cmFuc2Zvcm1ba2V5XSArXCIpXCI7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGxldCBjb250YWluc1JvdGF0aW9uID0gZmFsc2U7XG4gICAgICAgICAgICBbJ3JvdGF0ZScsICdyb3RhdGUzZCcsICdyb3RhdGVaJywgJ21hdHJpeCcsICdtYXRyaXgzZCddLmZvckVhY2gocm90YXRpb24gPT4ge1xuICAgICAgICAgICAgICAgIGlmIChtZWRpYV90cmFuc2Zvcm0uaW5jbHVkZXMocm90YXRpb24pKSBjb250YWluc1JvdGF0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gbm8gcm90YXRpb24gdHJhbnNmb3JtLCBza2lwXG4gICAgICAgICAgICBpZiAoIWNvbnRhaW5zUm90YXRpb24pIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBsZXQgZGVncmVlID0gQ1NTVXRpbC5nZXRSb3RhdGlvbkRlZ3JlZShtZWRpYV90cmFuc2Zvcm0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBubyBvciAzNjBuIGRlZ3JlZSByb3RhdGlvbiBcbiAgICAgICAgICAgIGlmIChkZWdyZWUgPT09IDApIHsgXG4gICAgICAgICAgICAgICAgcmV0LnB1c2goUnVsZVBhc3MoXCJwYXNzXCIpKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogY2FsY3VsYXRlIHRoZSBvcmlnaW5hbCBwYWdlIHJvdGF0aW9uIHRyYW5zZm9ybWF0aW9uLCBleGFtcGxlXG4gICAgICAgICAgICAgKiAgaHRtbCB7IHRyYW5zZm9ybTogcm90YXRlKDIuNWRlZyk7IH1cbiAgICAgICAgICAgICovXG4gICAgICAgICAgICBjb25zdCBkZWZpbmVkU3R5bGUgPSBDU1NVdGlsLmdldERlZmluZWRTdHlsZXMocnVsZUNvbnRleHQsIFtcInRyYW5zZm9ybVwiXSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8qKiBcbiAgICAgICAgICAgICAqIGNvbXBlbnNhdGUgdGhlIG1lZGlhIG9yaWVudGF0aW9uIHdpdGggdGhlIHBhZ2Ugb3JpZW50YXRpb25cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgaWYgKGRlZmluZWRTdHlsZVsndHJhbnNmb3JtJ10pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYWdlX2RlZ3JlZSA9IENTU1V0aWwuZ2V0Um90YXRpb25EZWdyZWUoZGVmaW5lZFN0eWxlWyd0cmFuc2Zvcm0nXSk7XG4gICAgICAgICAgICAgICAgLy8gcm90YXRlIGlzIGFkZGl0aXZlXG4gICAgICAgICAgICAgICAgZGVncmVlICs9IHBhZ2VfZGVncmVlO1xuICAgICAgICAgICAgfSAgICBcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gV2hlbiBkZWdyZWUgaXMgMSB0dXJuICgzNjAgZGVncmVlKSwgaXQgaXMgbm90IGNvbnNpZGVyZWQgYW4gb3JpZW50YXRpb24gbG9ja1xuICAgICAgICAgICAgLy8gYWxsb3cgMSBkZWdyZWUgZmxvYXRpbmcgcmFuZ2UgZm9yIHRoZSByaWdodCBhbmdsZVxuICAgICAgICAgICAgaWYgKE1hdGguYWJzKGRlZ3JlZSAtIDM2MCkgJSAzNjAgPiAxKVxuICAgICAgICAgICAgICAgIHJldC5wdXNoKFJ1bGVGYWlsKFwiZmFpbF9sb2NrZWRcIiwgW25vZGVOYW1lXSkpO1xuICAgICAgICAgICAgZWxzZSByZXQucHVzaChSdWxlUGFzcyhcInBhc3NcIikpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXQubGVuZ3RoID4gMCkgIFxuICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgcmV0dXJuIG51bGw7IFxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgZWxlbWVudF9zY3JvbGxhYmxlX3RhYmJhYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcImVsZW1lbnRfc2Nyb2xsYWJsZV90YWJiYWJsZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipcIixcbiAgICBkZXBlbmRlbmNpZXM6IFtdLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZWxlbWVudF9zY3JvbGxhYmxlX3RhYmJhYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwicGFzc190YWJiYWJsZVwiOiBcImVsZW1lbnRfc2Nyb2xsYWJsZV90YWJiYWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcInBhc3NfaW50ZXJhY3RpdmVcIjogXCJlbGVtZW50X3Njcm9sbGFibGVfdGFiYmFibGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX3Njcm9sbGFibGVcIjogXCJlbGVtZW50X3Njcm9sbGFibGVfdGFiYmFibGUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIlNjcm9sbGFibGUgZWxlbWVudHMgc2hvdWxkIGJlIHRhYmJhYmxlIG9yIGNvbnRhaW4gdGFiYmFibGUgY29udGVudFwiLFxuICAgICAgICAgICAgXCJwYXNzX3RhYmJhYmxlXCI6IFwiVGhlIHNjcm9sbGFibGUgZWxlbWVudCBpcyB0YWJiYWJsZVwiLFxuICAgICAgICAgICAgXCJwYXNzX2ludGVyYWN0aXZlXCI6IFwiVGhlIHNjcm9sbGFibGUgZWxlbWVudCBoYXMgdGFiYmFibGUgY29udGVudFwiLFxuICAgICAgICAgICAgXCJmYWlsX3Njcm9sbGFibGVcIjogXCJUaGUgc2Nyb2xsYWJsZSBlbGVtZW50IDx7MH0+IHdpdGggbm9uLWludGVyYWN0aXZlIGNvbnRlbnQgaXMgbm90IHRhYmJhYmxlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogZGVwcmVjYXRlZCBvbiA2LzEwLzIwMjUgZHVlIHRvIEJyb3dzZXIgc3VwcG9ydCBmb3IgYXV0by1mb2N1cyBvZiBhIHNjcm9sbGFibGUgZWxlbWVudCBcbiAgICAgKiBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgbnVtOiBbXCIyLjEuMVwiXSxcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLCovXG4gICAgcnVsZXNldHM6IFtdLFxuICAgIGFjdDogW1wiMHNzdzlrXCJdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IGlzIGhpZGRlbiBvciBkaXNhYmxlZFxuICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShydWxlQ29udGV4dCkgfHwgQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIFxuICAgICAgICAvL3NraXAgZWxlbWVudHNcbiAgICAgICAgaWYgKENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFtcImlmcmFtZVwiLCBcInN2Z1wiLCBcInNjcmlwdFwiLCBcIm1ldGFcIiwgXCJzdHlsZVwiXSkpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICAvL3NraXAgaWYgbm8gdmlzaWJsZSBjb250ZW50XG4gICAgICAgIGlmICghQ29tbW9uVXRpbC5oYXNJbm5lckNvbnRlbnQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBcbiAgICAgICAgLy8gaWdub3JlIGlmIHRoZSBlbGVtZW50J3MgbmF2aWdhdGlvbiBpcyBjb250cm9sbGVkIG9yIG93bmVkIGJ5IGFub3RoZXIgZWxlbWVudFxuICAgICAgICBpZiAoQXJpYVV0aWwuaXNOYXZpZ2F0aW9uT3duZWRPckNvbnRyb2xsZWQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7ICBcblxuICAgICAgICAvLyBpZ25vcmUgaWYgdGhlIGVsZW1lbnQgaXMgbm90IHNjcm9sbGFibGUgb3IgY29udGVudCB3aXRob3V0aW5nIG5lZWRpbmcgYSBzY3JvbGxcbiAgICAgICAgaWYgKCFWaXNVdGlsLmlzRWxlbWVudFNjcm9sbGFibGUocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gcGFzcyBpZiBlbGVtZW50IGlzIHRhYmJhYmxlXG4gICAgICAgIGlmIChDb21tb25VdGlsLmlzVGFiYmFibGUocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc190YWJiYWJsZVwiKTtcblxuICAgICAgICAvLyBjaGVjayBpZiBlbGVtZW50IGNvbnRlbnQgaXMgdGFiYmFibGVcbiAgICAgICAgY29uc3QgY291bnQgPSBDb21tb25VdGlsLmdldFRhYmJhYmxlQ2hpbGRyZW4ocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoY291bnQgPiAwKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc19pbnRlcmFjdGl2ZVwiKTtcblxuICAgICAgICAvLyBpZ25vcmUgaW4gRmlyZWZveCBpZiBubyB0YWJpbmRleCBhdCBhbGwgKG5vdCB0ZXN0ZWQgaW4gZW1iZWRkZWQgb3IgYW55IHNpbXVsYXRvcilcbiAgICAgICAgaWYgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSAmJiBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoXCJGaXJlZm94XCIpID4gLTEpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX3Njcm9sbGFibGVcIiwgW3J1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldKTsgICAgXG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgQVJJQURlZmluaXRpb25zIH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQURlZmluaXRpb25zXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGVsZW1lbnRfdGFiYmFibGVfcm9sZV92YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJlbGVtZW50X3RhYmJhYmxlX3JvbGVfdmFsaWRcIixcbiAgICBjb250ZXh0OlwiZG9tOipcIixcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiZWxlbWVudF90YWJiYWJsZV9yb2xlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9pbnZhbGlkX3JvbGVcIjogXCJlbGVtZW50X3RhYmJhYmxlX3JvbGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX25vX3ZhbGlkX3JvbGVcIjogXCJlbGVtZW50X3RhYmJhYmxlX3JvbGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImVsZW1lbnRfdGFiYmFibGVfcm9sZV92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJUaGUgdGFiYmFibGUgZWxlbWVudCBoYXMgYSB3aWRnZXQgcm9sZVwiLFxuICAgICAgICAgICAgXCJmYWlsX2ludmFsaWRfcm9sZVwiOiBcIlRoZSB0YWJiYWJsZSBlbGVtZW50J3Mgcm9sZSAnezB9JyBpcyBub3QgYSB3aWRnZXQgcm9sZVwiLFxuICAgICAgICAgICAgXCJmYWlsX25vX3ZhbGlkX3JvbGVcIjogXCJUaGUgdGFiYmFibGUgZWxlbWVudCBkb2VzIG5vdCBoYXZlIGEgdmFsaWQgd2lkZ2V0IHJvbGVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBIHRhYmJhYmxlIGVsZW1lbnQgbXVzdCBoYXZlIGEgdmFsaWQgd2lkZ2V0IHJvbGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCJdLFxuICAgICAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiaWRcIjogW1wiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICAgICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAgIGlmIChDb21tb25VdGlsLmlzTm9kZURpc2FibGVkKHJ1bGVDb250ZXh0KSB8fCBWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgY29uc3Qgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAvLyBpZiB0aGUgZWxlbWVudCBpcyB0YWJiYWJsZSBieSBkZWZhdWx0IHdpdGggb3Igd2l0aG91dCB0YWJpbmRleCwgbGV0IHRoZSBvdGhlciBydWxlcyAoc3VjaCBhcyB3aWRnZXRfdGFiYmFibGVfc2luZ2xlKSB0byBoYW5kbGUgaXRcbiAgICAgICAgaWYgKG5vZGVOYW1lIGluIENvbW1vblV0aWwudGFiVGFnTWFwICkge1xuICAgICAgICAgICAgbGV0IHZhbHVlID0gQ29tbW9uVXRpbC50YWJUYWdNYXBbbm9kZU5hbWVdO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiAodmFsdWUpID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgIH0gXG4gICAgICAgICAgICBpZiAodmFsdWUpIHJldHVybiBudWxsO1xuICAgICAgICB9IFxuICAgICAgICBcbiAgICAgICAgLy8gaGFuZGxlIHRoZSBjYXNlOiBubyB0YWJpbmRleCBvciB0YWJpbmRleCA8IDBcbiAgICAgICAgaWYgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSB8fCBwYXJzZUludChydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSkgPCAwKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gaWdub3JlIGlmIHRoZSBlbGVtZW50J3MgbmF2aWdhdGlvbiBpcyBjb250cm9sbGVkIGJ5IGFub3RoZXIgZWxlbWVudCwgc3VjaCBhcyBjb21ib2JveFxuICAgICAgICBpZiAoQXJpYVV0aWwuaXNOYXZpZ2F0aW9uT3duZWRPckNvbnRyb2xsZWQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7ICBcblxuICAgICAgICAvLyBpZ25vcmUgaWYgdGhlIGVsZW1lbnQgaXMgc2Nyb2xsYWJsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc0VsZW1lbnRTY3JvbGxhYmxlKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybiBudWxsOyAgICBcblxuICAgICAgICAvLyBlbGVtZW50cyB3aG9zZSByb2xlcyBhbGxvdyBubyBkZXNjZW5kYW50cyB0aGF0IGFyZSBpbnRlcmFjdGl2ZSBvciB3aXRoIGEgdGFiaW5kZXggPj0gMCBcbiAgICAgICAgLy8gdGhpcyBjYXNlIHNob3VsZCBiZSBoYW5kbGVkIGluIHdpZGdldF90YWJiYWJsZV9zaW5nbGUgYW5kIGFyaWFfY2hpbGRfdGFiYmFibGVcbiAgICAgICAgY29uc3Qgcm9sZXNfbm9faW50ZXJhY3RpdmVfY2hpbGQgPVtcImJ1dHRvblwiLCBcImNoZWNrYm94XCIsIFwiaW1nXCIsIFwibGlua1wiLCBcIm1lbnVpdGVtXCIsIFwibWVudWl0ZW1jaGVja2JveFwiLCBcIm1lbnVpdGVtcmFkaW9cIiwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25cIiwgXCJyYWRpb1wiLCBcInN3aXRjaFwiLCBcInRhYlwiXTtcblxuICAgICAgICBjb25zdCBwYXJlbnQgPSBET01XYWxrZXIucGFyZW50Tm9kZShydWxlQ29udGV4dCk7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBwYXJlbnRfcm9sZSA9IEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZShwYXJlbnQgYXMgRWxlbWVudCk7XG4gICAgICAgIFxuICAgICAgICAvLyBpZ25vcmUgaWYgdGhlIHBhcmVudCByb2xlIGlzIGluIHJvbGVzX25vX2ludGVyYWN0aXZlX2NoaWxkXG4gICAgICAgIGlmIChyb2xlc19ub19pbnRlcmFjdGl2ZV9jaGlsZC5pbmNsdWRlcyhwYXJlbnRfcm9sZSkpXG4gICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgbGV0IHJvbGUgPSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoIXJvbGUpIFxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9ub192YWxpZF9yb2xlXCIpOyBcbiAgICAgICAgLy8gaWdub3JlICdhcHBsaWNhdGlvbicgcm9sZSB0aGF0IGNvbnRhaW5zIG9uZSBvciBtb3JlIGZvY3VzYWJsZSBlbGVtZW50cyB0aGF0IGRvIG5vdCBmb2xsb3cgYSBzdGFuZGFyZCBpbnRlcmFjdGlvbiBwYXR0ZXJuIHN1cHBvcnRlZCBieSBhIHdpZGdldCByb2xlOmh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDIzL1BSLVdBSS1BUklBLTEuMi0yMDIzMDMyOC8jYXBwbGljYXRpb24gXG4gICAgICAgIGlmIChyb2xlID09PSBcImFwcGxpY2F0aW9uXCIpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICAvLyBoYW5kbGUgdGhlIGNhc2U6IHRhYmluZGV4ID49IDAgdG8gZXhhbWluZSB3aGV0aGVyIGEgd2lkZ2V0IHJvbGUgaXMgc2V0dXAgb3Igbm90IFxuICAgICAgICAvLyBwYXNzIGlmIG9uZSBvZiB0aGUgcm9sZXMgaXMgYSB3aWRnZXQgdHlwZVxuICAgICAgICAvLyBSb3cgaXMgd2VpcmQuIEl0J3Mgc3RydWN0dXJlLCBidXQgY2FuIGFsc28gYmUgd2lkZ2V0XG4gICAgICAgIC8vIEZvY3VzYWJsZSBzZXBhcmF0b3JzIGFyZSB3aWRnZXRzXG4gICAgICAgIGlmIChyb2xlID09PSBcInJvd1wiIHx8IHJvbGUgPT09IFwic2VwYXJhdG9yXCIgfHwgQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVdLnJvbGVUeXBlID09PSAnd2lkZ2V0Jykge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2ludmFsaWRfcm9sZVwiLCBbcm9sZV0pO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHksIFJ1bGVQb3RlbnRpYWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5pbXBvcnQgeyBET01NYXBwZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTU1hcHBlclwiO1xuaW1wb3J0IHsgQ29sb3JVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29sb3JVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBlbGVtZW50X3RhYmJhYmxlX3Vub2JzY3VyZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZWxlbWVudF90YWJiYWJsZV91bm9ic2N1cmVkXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIGRlcGVuZGVuY2llczogW10sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJlbGVtZW50X3RhYmJhYmxlX3Vub2JzY3VyZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJwYXNzXCI6IFwiZWxlbWVudF90YWJiYWJsZV91bm9ic2N1cmVkLmh0bWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX29ic2N1cmVkXCI6IFwiZWxlbWVudF90YWJiYWJsZV91bm9ic2N1cmVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJXaGVuIGFuIGVsZW1lbnQgcmVjZWl2ZXMgZm9jdXMsIGl0IGlzIG5vdCBlbnRpcmVseSBjb3ZlcmVkIGJ5IG90aGVyIGNvbnRlbnRcIixcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlRoZSBlbGVtZW50IGlzIG5vdCBlbnRpcmVseSBjb3ZlcmVkIGJ5IG90aGVyIGNvbnRlbnRcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX29ic2N1cmVkXCI6IFwiQ29uZmlybSB0aGF0IHdoZW4gdGhlIGVsZW1lbnQgcmVjZWl2ZXMgZm9jdXMsIGl0IGlzIG5vdCBjb3ZlcmVkIG9yLCBpZiBjb3ZlcmVkIGJ5IHVzZXIgYWN0aW9uLCBjYW4gYmUgdW5jb3ZlcmVkIHdpdGhvdXQgbW92aW5nIGZvY3VzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbIFwiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIG51bTogW1wiMi40LjExXCJdLFxuICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgIC8vIEVhcmx5IGV4aXQ6IGNoZWNrIHZpc2liaWxpdHkgYW5kIHRhYmJhYmlsaXR5IGZpcnN0XG4gICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKHJ1bGVDb250ZXh0KSB8fCAhQ29tbW9uVXRpbC5pc1RhYmJhYmxlKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgY29uc3Qgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICAgIFxuICAgICAgICAvLyBFYXJseSBleGl0OiBpZ25vcmUgY2VydGFpbiBlbGVtZW50c1xuICAgICAgICBpZiAoQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgW1wicHJlXCIsIFwiY29kZVwiLCBcInNjcmlwdFwiLCBcIm1ldGFcIl0pICE9PSBudWxsXG4gICAgICAgICAgICB8fCBub2RlTmFtZSA9PT0gXCJib2R5XCIgfHwgbm9kZU5hbWUgPT09IFwiaHRtbFwiKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBkb2MgPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50O1xuICAgICAgICBpZiAoIWRvYykgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICBjb25zdCB3aW4gPSBkb2MuZGVmYXVsdFZpZXc7XG4gICAgICAgIGlmICghd2luKSByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIC8vIFJldXNlIHNpbmdsZSBET01NYXBwZXIgaW5zdGFuY2VcbiAgICAgICAgY29uc3QgbWFwcGVyOiBET01NYXBwZXIgPSBuZXcgRE9NTWFwcGVyKCk7XG4gICAgICAgIGNvbnN0IGJvdW5kcyA9IG1hcHBlci5nZXRVbmFkanVzdGVkQm91bmRzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgXG4gICAgICAgIC8vIEVhcmx5IGV4aXQ6IGJvdW5kcyBub3QgYXZhaWxhYmxlIG9yIGVsZW1lbnQgaGFzIG5vIGRpbWVuc2lvbnNcbiAgICAgICAgaWYgKCFib3VuZHMgfHwgYm91bmRzLmhlaWdodCA9PT0gMCB8fCBib3VuZHMud2lkdGggPT09IDApXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IGNTdHlsZSA9IHdpbi5nZXRDb21wdXRlZFN0eWxlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKCFjU3R5bGUpIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgLy8gUGFyc2Ugei1pbmRleCBvbmNlIGFuZCBjYWNoZVxuICAgICAgICBjb25zdCB6aW5kZXggPSBwYXJzZUludChjU3R5bGUuekluZGV4ID09PSAnYXV0bycgfHwgIWNTdHlsZS56SW5kZXggPyAnMCcgOiBjU3R5bGUuekluZGV4KTtcbiAgICAgICAgXG4gICAgICAgIC8vIE1vcmUgc3BlY2lmaWMgc2VsZWN0b3IgdG8gcmVkdWNlIGl0ZXJhdGlvblxuICAgICAgICBjb25zdCBlbGVtcyA9IGRvYy5xdWVyeVNlbGVjdG9yQWxsKCdib2R5ICo6bm90KHNjcmlwdCk6bm90KHN0eWxlKTpub3QobWV0YSk6bm90KGxpbmspJyk7XG4gICAgICAgIGlmICghZWxlbXMgfHwgZWxlbXMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICBcbiAgICAgICAgbGV0IGJlZm9yZSA9IHRydWU7XG4gICAgICAgIGNvbnN0IGJvdW5kc1JpZ2h0ID0gYm91bmRzLmxlZnQgKyBib3VuZHMud2lkdGg7XG4gICAgICAgIGNvbnN0IGJvdW5kc0JvdHRvbSA9IGJvdW5kcy50b3AgKyBib3VuZHMuaGVpZ2h0O1xuICAgICAgICBcbiAgICAgICAgLy8gQ2hlY2sgZm9yIG9ic2N1cmluZyBlbGVtZW50c1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtID0gZWxlbXNbaV07XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogVGhlIG5vZGVzIHJldHVybmVkIGZyb20gcXVlcnlTZWxlY3RvckFsbCBhcmUgaW4gZG9jdW1lbnQgb3JkZXIuXG4gICAgICAgICAgICAgKiBJZiB0d28gZWxlbWVudHMgb3ZlcmxhcCBhbmQgei1pbmRleCBhcmUgbm90IGRlZmluZWQsIHRoZW4gdGhlIG5vZGVcbiAgICAgICAgICAgICAqIHJlbmRlcmVkIGVhcmxpZXIgd2lsbCBiZSBvdmVybGFpZCBieSB0aGUgbm9kZSByZW5kZXJlZCBsYXRlci5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgLy8gVXNlIGNvbXBhcmVEb2N1bWVudFBvc2l0aW9uIHRvIGNoZWNrIGNvbnRhaW5tZW50IHJlbGF0aW9uc2hpcHNcbiAgICAgICAgICAgIC8vIE5vdGU6IGNvbXBhcmVEb2N1bWVudFBvc2l0aW9uIHJldHVybnMgMCB3aGVuIGNvbXBhcmluZyBhIG5vZGUgdG8gaXRzZWxmXG4gICAgICAgICAgICBjb25zdCBwb3NpdGlvbiA9IHJ1bGVDb250ZXh0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGVsZW0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBET0NVTUVOVF9QT1NJVElPTl9DT05UQUlORURfQlkgKDE2KTogZWxlbSBpcyBjb250YWluZWQgYnkgcnVsZUNvbnRleHRcbiAgICAgICAgICAgIC8vIEFsc28gaGFuZGxlIHNlbGYtY29tcGFyaXNvbiAocG9zaXRpb24gPT09IDApXG4gICAgICAgICAgICBpZiAocG9zaXRpb24gPT09IDAgfHwgKHBvc2l0aW9uICYgTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9DT05UQUlORURfQlkpKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhlIG5leHQgbm9kZSBpbiBlbGVtcyB3aWxsIGJlIGFmdGVyIHRoZSB0YXJnZXQgbm9kZSAocnVsZUNvbnRleHQpXG4gICAgICAgICAgICAgICAgYmVmb3JlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIERPQ1VNRU5UX1BPU0lUSU9OX0NPTlRBSU5TICg4KTogZWxlbSBjb250YWlucyBydWxlQ29udGV4dFxuICAgICAgICAgICAgLy8gU2tpcCBpZiBlbGVtZW50IGNvbnRhaW5zIHJ1bGVDb250ZXh0IG9yIGlzIG5vdCB2aXNpYmxlXG4gICAgICAgICAgICBpZiAoKHBvc2l0aW9uICYgTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9DT05UQUlOUykgfHwgIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShlbGVtKSlcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY29uc3QgYm5kcyA9IG1hcHBlci5nZXRVbmFkanVzdGVkQm91bmRzKGVsZW0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBTa2lwIGlmIG5vIGJvdW5kcyBvciB6ZXJvIGRpbWVuc2lvbnNcbiAgICAgICAgICAgIGlmICghYm5kcyB8fCBibmRzLmhlaWdodCA9PT0gMCB8fCBibmRzLndpZHRoID09PSAwKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBRdWljayBib3VuZHMgY2hlY2s6IGRvZXMgZWxlbSBjb21wbGV0ZWx5IGNvdmVyIHJ1bGVDb250ZXh0P1xuICAgICAgICAgICAgaWYgKGJuZHMudG9wID4gYm91bmRzLnRvcCB8fCBibmRzLmxlZnQgPiBib3VuZHMubGVmdClcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY29uc3QgYm5kc1JpZ2h0ID0gYm5kcy5sZWZ0ICsgYm5kcy53aWR0aDtcbiAgICAgICAgICAgIGNvbnN0IGJuZHNCb3R0b20gPSBibmRzLnRvcCArIGJuZHMuaGVpZ2h0O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoYm5kc1JpZ2h0IDwgYm91bmRzUmlnaHQgfHwgYm5kc0JvdHRvbSA8IGJvdW5kc0JvdHRvbSlcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gQ2hlY2sgei1pbmRleCB0byBkZXRlcm1pbmUgaWYgZWxlbSBvYnNjdXJlcyBydWxlQ29udGV4dFxuICAgICAgICAgICAgY29uc3QgelN0eWxlID0gd2luLmdldENvbXB1dGVkU3R5bGUoZWxlbSk7XG4gICAgICAgICAgICBpZiAoIXpTdHlsZSkgY29udGludWU7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNvbnN0IGVsZW1aaW5kZXggPSBwYXJzZUludCh6U3R5bGUuekluZGV4ID09PSAnYXV0bycgfHwgIXpTdHlsZS56SW5kZXggfHwgaXNOYU4oTnVtYmVyKHpTdHlsZS56SW5kZXgpKSA/ICcwJyA6IHpTdHlsZS56SW5kZXgpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBJZiBiZWZvcmUgcnVsZUNvbnRleHQgaW4gRE9NIG9yZGVyLCBlbGVtIG11c3QgaGF2ZSBoaWdoZXIgei1pbmRleCB0byBvYnNjdXJlXG4gICAgICAgICAgICAvLyBJZiBhZnRlciBydWxlQ29udGV4dCBpbiBET00gb3JkZXIsIGVsZW0gY2FuIG9ic2N1cmUgd2l0aCBlcXVhbCBvciBoaWdoZXIgei1pbmRleFxuICAgICAgICAgICAgaWYgKChiZWZvcmUgJiYgZWxlbVppbmRleCA+IHppbmRleCkgfHwgKCFiZWZvcmUgJiYgZWxlbVppbmRleCA+PSB6aW5kZXgpKSB7XG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgZWxlbWVudCBoYXMgb3BhcXVlIGJhY2tncm91bmRcbiAgICAgICAgICAgICAgICBsZXQgaGFzT3BhcXVlQmFja2dyb3VuZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmICh6U3R5bGUuYmFja2dyb3VuZCAmJiB6U3R5bGUuYmFja2dyb3VuZCAhPT0gJ25vbmUnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJnQ29sb3IgPSBDb2xvclV0aWwuQ29sb3IoelN0eWxlLmJhY2tncm91bmQpO1xuICAgICAgICAgICAgICAgICAgICBoYXNPcGFxdWVCYWNrZ3JvdW5kID0gYmdDb2xvciAmJiAoYmdDb2xvci5hbHBoYSA9PT0gdW5kZWZpbmVkIHx8IGJnQ29sb3IuYWxwaGEgPiAwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFoYXNPcGFxdWVCYWNrZ3JvdW5kICYmIHpTdHlsZS5iYWNrZ3JvdW5kQ29sb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYmdDb2xvciA9IENvbG9yVXRpbC5Db2xvcih6U3R5bGUuYmFja2dyb3VuZENvbG9yKTtcbiAgICAgICAgICAgICAgICAgICAgaGFzT3BhcXVlQmFja2dyb3VuZCA9IGJnQ29sb3IgJiYgKGJnQ29sb3IuYWxwaGEgPT09IHVuZGVmaW5lZCB8fCBiZ0NvbG9yLmFscGhhID4gMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIElmIGVsZW1lbnQgaGFzIG5vIGNvbnRlbnQgYW5kIG5vIG9wYXF1ZSBiYWNrZ3JvdW5kLCBza2lwIGl0XG4gICAgICAgICAgICAgICAgaWYgKCFDb21tb25VdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbihlbGVtKSAmJiAhaGFzT3BhcXVlQmFja2dyb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfb2JzY3VyZWRcIiwgW10pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgQ1NTVXRpbCB9IGZyb20gXCIuLi91dGlsL0NTU1V0aWxcIjtcbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHksIFJ1bGVQb3RlbnRpYWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IERPTU1hcHBlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NTWFwcGVyXCI7XG5cbmV4cG9ydCBjb25zdCBlbGVtZW50X3RhYmJhYmxlX3Zpc2libGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZWxlbWVudF90YWJiYWJsZV92aXNpYmxlXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIGRlcGVuZGVuY2llczogW10sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJlbGVtZW50X3RhYmJhYmxlX3Zpc2libGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJwYXNzXCI6IFwiZWxlbWVudF90YWJiYWJsZV92aXNpYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX3Zpc2libGVcIjogXCJlbGVtZW50X3RhYmJhYmxlX3Zpc2libGUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIkEgdGFiYmFibGUgZWxlbWVudCBzaG91bGQgYmUgdmlzaWJsZSBvbiB0aGUgc2NyZWVuIHdoZW4gaXQgaGFzIGtleWJvYXJkIGZvY3VzXCIsXG4gICAgICAgICAgICBcInBhc3NcIjogXCJUaGUgdGFiYmFibGUgZWxlbWVudCBpcyB2aXNpYmxlIG9uIHRoZSBzY3JlZW5cIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX3Zpc2libGVcIjogXCJDb25maXJtIHRoZSBlbGVtZW50IHNob3VsZCBiZSB0YWJiYWJsZSBhbmQgaWYgc28sIGl0IGJlY29tZXMgdmlzaWJsZSB3aGVuIGl0IGhhcyBrZXlib2FyZCBmb2N1c1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBpZDogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBudW06IFtcIjIuNC43XCJdLFxuICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgaWYgKCFDb21tb25VdGlsLmlzVGFiYmFibGUocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgIGNvbnN0IG1hcHBlciA6IERPTU1hcHBlciA9IG5ldyBET01NYXBwZXIoKTtcbiAgICAgICAgY29uc3QgYm91bmRzID0gbWFwcGVyLmdldFVuYWRqdXN0ZWRCb3VuZHMocnVsZUNvbnRleHQpO1xuICAgICAgICBcbiAgICAgICAgLy9pbiBjYXNlIHRoZSBib3VuZHMgbm90IGF2YWlsYWJsZVxuICAgICAgICBpZiAoIWJvdW5kcykgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICAvLyBHZXQgYWxsIG5lZWRlZCBzdHlsZXMgaW4gYSBzaW5nbGUgcGFzcyB0aHJvdWdoIHN0eWxlc2hlZXRzXG4gICAgICAgIGNvbnN0IGFsbFN0eWxlcyA9IENTU1V0aWwuZ2V0RGVmaW5lZFN0eWxlc011bHRpcGxlKHJ1bGVDb250ZXh0LCBbXCJwb3NpdGlvblwiLCBcImNsaXBcIl0sIFtcIlwiLCBcIjpmb2N1c1wiXSk7XG4gICAgICAgIGNvbnN0IGRlZmluZWRfc3R5bGVzID0gYWxsU3R5bGVzW1wiXCJdO1xuICAgICAgICBjb25zdCBvbmZvY3VzX3N0eWxlcyA9IGFsbFN0eWxlc1tcIjpmb2N1c1wiXTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgaWYgKGJvdW5kc1snaGVpZ2h0J10gPT09IDAgfHwgYm91bmRzWyd3aWR0aCddID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfdmlzaWJsZVwiLCBbXSk7XG5cbiAgICAgICAgaWYgKGRlZmluZWRfc3R5bGVzWydwb3NpdGlvbiddPT09J2Fic29sdXRlJyAmJiBkZWZpbmVkX3N0eWxlc1snY2xpcCddICYmIGRlZmluZWRfc3R5bGVzWydjbGlwJ10ucmVwbGFjZUFsbCgnICcsICcnKT09PSdyZWN0KDBweCwwcHgsMHB4LDBweCknXG4gICAgICAgICAgICAmJiAhb25mb2N1c19zdHlsZXNbJ2NsaXAnXSkge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBub3RlIHRoYXQgQSB1c2VyIGNhbiBzZWxlY3QgYSBjaGVja2JveCBhbmQgcmFkaW8gYnV0dG9uIGJ5IHNlbGVjdGluZyB0aGUgYnV0dG9uIG9yIHRoZSBsYWJlbCB0ZXh0LlxuICAgICAgICAgICAgICogV2hlbiBhIGNoZWNrYm94IG9yIHJhZGlvIGJ1dHRvbiBpcyBjbGlwcGVkIHRvIDAgc2l6ZSwgaXQgaXMgc3RpbGwgYXZhaWxhYmxlIHRvIGEga2V5Ym9hcmQgb3IgYSBzY3JlZW4gcmVhZGVyLlxuICAgICAgICAgICAgICogVGhlIHJ1bGUgc2hvdWxkIGJlIHBhc3NlZCBpZiB0aGUgbGFiZWwgdGV4dCBleGlzdHMgYW5kIHRoZSBidXR0b24gb24tZm9jdXMgc3R5bGUgaXMgZGVmaW5lZCBieSB0aGUgdXNlcixcbiAgICAgICAgICAgICAqIHdoaWNoIGxpa2VseSBpbmN1cnMgdGhlIGNoYW5nZXMgb2YgdGhlIGxhYmVsIHN0eWxlLlxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBpZiAobm9kZU5hbWUgPT09ICdpbnB1dCcgJiYgKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZSgndHlwZScpPT09J2NoZWNrYm94JyB8fCBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoJ3R5cGUnKT09PSdyYWRpbycpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGFiZWwgPSBDb21tb25VdGlsLmdldExhYmVsRm9yRWxlbWVudChydWxlQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgaWYgKGxhYmVsICYmICFDb21tb25VdGlsLmlzSW5uZXJUZXh0RW1wdHkobGFiZWwpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEdldCBhZGRpdGlvbmFsIHBzZXVkby1jbGFzcyBzdHlsZXMgKHJldXNlIG9uZm9jdXNfc3R5bGVzIGZyb20gbGluZSA2MClcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHNldWRvU3R5bGVzID0gQ1NTVXRpbC5nZXREZWZpbmVkU3R5bGVzTXVsdGlwbGUocnVsZUNvbnRleHQsIG51bGwsIFtcIjpmb2N1cy12aXNpYmxlXCIsIFwiOmZvY3VzLXdpdGhpblwiLCBcIjpjaGVja2VkXCIsIFwiOmZvY3VzXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9jdXNfdmlzaWJsZV9zdHlsZXMgPSBwc2V1ZG9TdHlsZXNbXCI6Zm9jdXMtdmlzaWJsZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9jdXNfd2l0aGluX3N0eWxlcyA9IHBzZXVkb1N0eWxlc1tcIjpmb2N1cy13aXRoaW5cIl07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoZWNrZWRfc3R5bGVzID0gcHNldWRvU3R5bGVzW1wiOmNoZWNrZWRcIl07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9uZm9jdXNfc3R5bGVzID0gcHNldWRvU3R5bGVzW1wiOmZvY3VzXCJdO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChvbmZvY3VzX3N0eWxlcyB8fCBmb2N1c192aXNpYmxlX3N0eWxlcyB8fCBmb2N1c193aXRoaW5fc3R5bGVzIHx8IGNoZWNrZWRfc3R5bGVzKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF92aXNpYmxlXCIsIFtdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChib3VuZHNbJ3RvcCddID49IDAgJiYgYm91bmRzWydsZWZ0J10gPj0gMClcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBkZWZhdWx0X3N0eWxlcyA9IGdldENvbXB1dGVkU3R5bGUocnVsZUNvbnRleHQpO1xuICAgICAgICBcbiAgICAgICAgbGV0IHRvcCA9IGJvdW5kc1sndG9wJ107XG4gICAgICAgIGxldCBsZWZ0ID0gYm91bmRzWydsZWZ0J107XG4gICAgICAgXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhvbmZvY3VzX3N0eWxlcykubGVuZ3RoID09PSAwICkge1xuICAgICAgICAgICAgLy8gbm8gb25mb2N1cyBwb3NpdGlvbiBjaGFuZ2UsIGJ1dCBjb3VsZCBiZSBjaGFuZ2VkIGZyb20ganNcbiAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX3Zpc2libGVcIiwgW10pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gd2l0aCBvbmZvY3VzIHBvc2l0aW9uIGNoYW5nZVxuICAgICAgICAgICAgdmFyIHBvc2l0aW9ucyA9IFsnYWJzb2x1dGUnLCAnZml4ZWQnXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb25mb2N1c19zdHlsZXNbJ3RvcCddICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbnMuaW5jbHVkZXMob25mb2N1c19zdHlsZXNbJ3Bvc2l0aW9uJ10pIHx8ICh0eXBlb2Ygb25mb2N1c19zdHlsZXNbJ3Bvc2l0aW9uJ10gPT09ICd1bmRlZmluZWQnICYmIHBvc2l0aW9ucy5pbmNsdWRlcyhkZWZhdWx0X3N0eWxlc1sncG9zaXRpb24nXSkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRvcCA9IG9uZm9jdXNfc3R5bGVzWyd0b3AnXS5yZXBsYWNlKC9cXEQvZywnJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHBvc2l0aW9uIGlzIHVuZGVmaW5lZCBhbmQgdGhlIHBhcmVudCdzIHBvc2l0aW9uIGlzICdyZWxhdGl2ZSdcbiAgICAgICAgICAgICAgICAgICAgdG9wID0gTnVtYmVyLk1JTl9WQUxVRTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIG9uZm9jdXNfc3R5bGVzWydsZWZ0J10gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9ucy5pbmNsdWRlcyhvbmZvY3VzX3N0eWxlc1sncG9zaXRpb24nXSkgfHwgKHR5cGVvZiBvbmZvY3VzX3N0eWxlc1sncG9zaXRpb24nXSA9PT0gJ3VuZGVmaW5lZCcgJiYgcG9zaXRpb25zLmluY2x1ZGVzKGRlZmF1bHRfc3R5bGVzWydwb3NpdGlvbiddKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbGVmdCA9IG9uZm9jdXNfc3R5bGVzWydsZWZ0J10ucmVwbGFjZSgvXFxEL2csJycpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBwb3NpdGlvbiBpcyB1bmRlZmluZWQgYW5kIHRoZSBwYXJlbnQncyBwb3NpdGlvbiBpcyAncmVsYXRpdmUnXG4gICAgICAgICAgICAgICAgICAgIGxlZnQgPSBOdW1iZXIuTUlOX1ZBTFVFO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKHRvcCA+PSAwICYmIGxlZnQgPj0gMClcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX3Zpc2libGVcIiwgW10pO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGVtYmVkX2FsdF9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZW1iZWRfYWx0X2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmVtYmVkXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfRW1iZWRfSGFzQWx0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImVtYmVkX2FsdF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcImVtYmVkX2FsdF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImVtYmVkX2FsdF9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0aGF0IHRoZSA8ZW1iZWQ+IGVsZW1lbnQgaGFzIGFsdGVybmF0aXZlIGNvbnRlbnRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJQcm92aWRlIGFsdGVybmF0aXZlIGNvbnRlbnQgZm9yIDxlbWJlZD4gZWxlbWVudHNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX0ZPVVJcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwiYWx0XCIpO1xuICAgICAgICByZXR1cm4gcGFzc2VkID8gUnVsZVBhc3MoXCJQYXNzXzBcIikgOiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGVtb3RpY29uc19hbHRfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcImVtb3RpY29uc19hbHRfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX1RleHRfRW1vdGljb25zXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImVtb3RpY29uc19hbHRfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJlbW90aWNvbnNfYWx0X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZW1vdGljb25zX2FsdF9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0aGF0IGVtb3RpY29ucyBoYXZlIGEgdGV4dCBhbHRlcm5hdGl2ZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVtb3RpY29ucyBtdXN0IGhhdmUgYSBzaG9ydCB0ZXh0IGFsdGVybmF0aXZlIHRoYXQgZGVzY3JpYmVzIHRoZWlyIHB1cnBvc2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBEZWNpc2lvbiBpbiBwbGFubmluZyA5LzcvMjMgdGhhdCB0aGlzIHJ1bGUgY2F1c2VzIG1vcmUgcmV2aWV3cyB0aGF0IHdlIHNlZSBhY3R1YWwgcHJvYmxlbXMgaW4gY29udGVudCwgc28gdHVybiB0aGVzZSBydWxlcyBvZmZcbiAgICBcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICAqL1xuICAgIHJ1bGVzZXRzOiBbXSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRlUGFyYW1zID0ge1xuICAgICAgICAgICAgZW1vdGljb25zOiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IFtcIjotKVwiLCBcIjopXCIsIFwiOm8pXCIsIFwiOl1cIiwgXCI6M1wiLCBcIjpjKVwiLCBcIjo+XCIsIFwiPV1cIiwgXCI4KVwiLCBcIj0pXCIsIFwiOkRcIiwgXCJDOlwiLFxuICAgICAgICAgICAgICAgICAgICBcIjotRFwiLCBcIjpEXCIsIFwiOERcIiwgXCJYRFwiLCBcIj1EXCIsIFwiPTNcIiwgXCI8PTNcIiwgXCI8PThcIiwgXCItLSEtLVwiLCBcIjotKFwiLCBcIjooXCIsIFwiOmNcIiwgXCI6PFwiLCBcIjpbXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiRDpcIiwgXCJEOFwiLCBcIkQ7XCIsIFwiRD1cIiwgXCJEWFwiLCBcInYudlwiLCBcIjotOVwiLCBcIjstKVwiLCBcIjspXCIsIFwiKilcIiwgXCI7XVwiLCBcIjtEXCIsIFwiOi1QXCIsIFwiOlBcIixcbiAgICAgICAgICAgICAgICAgICAgXCI6LXBcIiwgXCI6cFwiLCBcIj1wXCIsIFwiOi3DnlwiLCBcIjrDnlwiLCBcIjotYlwiLCBcIjpiXCIsIFwiOi1PXCIsIFwiOk9cIiwgXCJPX09cIiwgXCJvX29cIiwgXCI4T1wiLCBcIk93T1wiLCBcIk8tT1wiLFxuICAgICAgICAgICAgICAgICAgICBcIjBfb1wiLCBcIk9fb1wiLCBcIk8zT1wiLCBcIm8wb8KgO29fbztcIiwgXCJvLi4ub1wiLCBcIjB3MFwiLCBcIjotL1wiLCBcIjovXCIsIFwiOlxcXFxcIiwgXCI9L1wiLCBcIj1cXFxcXCIsIFwiOlNcIiwgXCI6fFwiLFxuICAgICAgICAgICAgICAgICAgICBcImQ6LSlcIiwgXCJxQi0pXCIsIFwiOil+XCIsIFwiOi0pPi4uLi5cIiwgXCI6LVhcIiwgXCI6WFwiLCBcIjotI1wiLCBcIjojXCIsIFwiTzotKVwiLCBcIjA6M1wiLCBcIk86KVwiLCBcIjonKFwiLCBcIjsqKFwiLFxuICAgICAgICAgICAgICAgICAgICBcIlRfVFwiLCBcIlRUX1RUXCIsIFwiVC5UXCIsIFwiOi0qXCIsIFwiOipcIiwgXCJebylcIiwgXCI+OilcIiwgXCI+OylcIiwgXCI+Oi0pXCIsIFwiQilcIiwgXCJCLSlcIiwgXCI4KVwiLCBcIjgtKVwiLFxuICAgICAgICAgICAgICAgICAgICBcIl4+Lj5eXCIsIFwiXjwuPF5cIiwgXCJePl8+XlwiLCBcIl48XzxeXCIsIFwiRDo8XCIsIFwiPjooXCIsIFwiRC06PFwiLCBcIj46LShcIiwgXCI6LUBbMV1cIiwgXCI7KFwiLCBcImBfwrRcIiwgXCJEPFwiLFxuICAgICAgICAgICAgICAgICAgICBcIjwzXCIsIFwiPDMzM1wiLCBcIj1eX149XCIsIFwiPT4uPj1cIiwgXCI9PF88PVwiLCBcIj0+Ljw9XCIsIFwiXFxcXCwsL1wiLCBcIlxcXFxtL1wiLCBcIlxcXFxtL1xcXFw+LjwvXFxcXG0vXCIsIFwiXFxcXG8vXCIsIFwiXFxcXG8gby9cIixcbiAgICAgICAgICAgICAgICAgICAgXCJvL1xcXFxvXCIsIFwiOiZcIiwgXCI6dVwiXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB0eXBlOiBcIltzdHJpbmddXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgZW1vdGljb25zID0gdmFsaWRhdGVQYXJhbXMuZW1vdGljb25zLnZhbHVlO1xuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgbGV0IHRlc3RUZXh0ID0gXCJcIjtcblxuICAgICAgICBsZXQgd2Fsa05vZGU6IE5vZGUgPSBydWxlQ29udGV4dC5maXJzdENoaWxkO1xuICAgICAgICB3aGlsZSAod2Fsa05vZGUpIHtcbiAgICAgICAgICAgIC8vIENvbXBseSB0byB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyB3aWxsIGJlIGRvbmUgYnkgZGVmYXVsdCBhcyB0aGlzIHJ1bGUgdHJpZ2dlcnMgb24gZWFjaCBlbGVtZW50XG4gICAgICAgICAgICAvLyBhbmQgZm9yIGVhY2ggZWxlbWVudCBpdCBvbmx5IGNoZWNrcyB0aGF0IHNpbmdsZSBlbGVtZW50cyB0ZXh0IG5vZGVzIGFuZCBub3RoaW5nIGVsc2UuIFNvIGFsbCBpbm5lciBlbGVtZW50cyB3aWxsIGJlXG4gICAgICAgICAgICAvLyBjb3ZlcmVkIG9uIHRoZWlyIG93bi4gQ3VycmVudGx5IGZvciB0aGlzIHJ1bGUgYnkgZGVmYXVsdCBDaGVjayBIaWRkZW4gQ29udGVudCB3aWxsIHdvcmssIGFzIHdlIGFyZSBkb2luZ1xuICAgICAgICAgICAgLy8gYSBub2RlIHdhbGsgb25seSBvbiBzaWJsaW5ncyBzbyBpdCB3b3VsZCBub3QgZ2V0IHRleHQgbm9kZXMgZnJvbSBvdGhlciBzaWJsaW5ncyBhdCBhbGwuXG4gICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSBpbiB0aGUgZnV0dXJlIHNvbWV0aGluZyBjaG5nZXMsIGp1c3QgbmVlZCB0byBhZGQgJiYgIVJQVFV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbih3YWxrTm9kZSkgdG8gdGhlIGJlbG93XG4gICAgICAgICAgICAvLyBpZi5cbiAgICAgICAgICAgIGlmICh3YWxrTm9kZS5ub2RlTmFtZSA9PSBcIiN0ZXh0XCIpIHtcbiAgICAgICAgICAgICAgICB0ZXN0VGV4dCArPSBcIiBcIiArIHdhbGtOb2RlLm5vZGVWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdhbGtOb2RlID0gd2Fsa05vZGUubmV4dFNpYmxpbmc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGVzdFRleHQudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBwYXNzZWQgJiYgaiA8IGVtb3RpY29ucy5sZW5ndGg7ICsraikge1xuICAgICAgICAgICAgICAgIGxldCBlbW90SWR4ID0gdGVzdFRleHQuaW5kZXhPZihlbW90aWNvbnNbal0pO1xuICAgICAgICAgICAgICAgIGxldCBlTG5ndGggPSBlbW90aWNvbnNbal0ubGVuZ3RoO1xuICAgICAgICAgICAgICAgIHdoaWxlIChwYXNzZWQgJiYgZW1vdElkeCAhPSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBQYXNzZXMgaWY6IHRoZSBlbW90aWNvbiBpcyBub3QgcHJlY2VkZWQgYnkgd2hpdGVzcGFjZSxcbiAgICAgICAgICAgICAgICAgICAgLy8gb3IgdGhlIGVtb3RpY29uIGlzIG5vdCBmb2xsb3dlZCBieSB3aGl0ZXNwYWNlIHVubGVzcyBpdCdzIHB1bmN0dWF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAvLyBvciBpdCdzIGluIGEgcHJlLCBjb2RlLCBvciBzY3JpcHRcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID1cbiAgICAgICAgICAgICAgICAgICAgICAgIChlbW90SWR4ID4gMCAmJiAhL1xccy8udGVzdCh0ZXN0VGV4dC5zdWJzdHJpbmcoZW1vdElkeCAtIDEsIGVtb3RJZHgpKSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIChlbW90SWR4IDwgdGVzdFRleHQubGVuZ3RoIC0gZUxuZ3RoICYmICEvXFxzLy50ZXN0KHRlc3RUZXh0LnN1YnN0cmluZyhlbW90SWR4ICsgZUxuZ3RoLCBlbW90SWR4ICsgZUxuZ3RoICsgMSkpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIS9bLiwhJ1wiP10vLnRlc3QodGVzdFRleHQuc3Vic3RyaW5nKGVtb3RJZHggKyBlTG5ndGgsIGVtb3RJZHggKyBlTG5ndGggKyAxKSkpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIEFsbG93IHVzYWdlIG9mICg6IHN0dWZmIDopIHNpbmNlIHRoaXMgaXMgYSBjb21tZW50IGluIHNvbWUgbGFuZ3VhZ2VzXG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IHBhc3NlZCB8fCAoKGVtb3RpY29uc1tqXSA9PSBcIjopXCIgfHwgZW1vdGljb25zW2pdID09IFwiKDpcIikgJiYgL1xcKFxcOi4qXFw6XFwpLy50ZXN0KHRlc3RUZXh0KSk7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IHBhc3NlZCB8fCAoKGVtb3RpY29uc1tqXSA9PSBcIjspXCIgfHwgZW1vdGljb25zW2pdID09IFwiKDtcIikgJiYgL1xcKFxcOy4qXFw7XFwpLy50ZXN0KHRlc3RUZXh0KSk7XG4gICAgICAgICAgICAgICAgICAgIGVtb3RJZHggPSB0ZXN0VGV4dC5pbmRleE9mKGVtb3RpY29uc1tqXSwgZW1vdElkeCArIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAvLyBEb24ndCB0cmlnZ2VyIGlmIHdlJ3JlIG5vdCBpbiB0aGUgYm9keSBvciBpZiB3ZSdyZSBpbiBhIHNjcmlwdCwgcHJlLCBjb2RlXG4gICAgICAgICAgICBsZXQgY2hlY2tBbmNlc3RvciA9IENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFtcInByZVwiLCBcImNvZGVcIiwgXCJzY3JpcHRcIiwgXCJib2R5XCJdKTtcbiAgICAgICAgICAgIHBhc3NlZCA9IGNoZWNrQW5jZXN0b3IgPT0gbnVsbCB8fCBjaGVja0FuY2VzdG9yLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgIT0gXCJib2R5XCI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBlcnJvcl9tZXNzYWdlX2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJlcnJvcl9tZXNzYWdlX2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbYXJpYS1pbnZhbGlkPXRydWVdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJIQUFDX0FyaWFfRXJyb3JNZXNzYWdlXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJGYWlsXzJcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImVycm9yX21lc3NhZ2VfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZXJyb3JfbWVzc2FnZV9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJlcnJvcl9tZXNzYWdlX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZXJyb3JfbWVzc2FnZV9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJDdXN0b20gZXJyb3IgbWVzc2FnZSBoYXMgaW52YWxpZCByZWZlcmVuY2UgJ2lkJyB2YWx1ZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJDdXN0b20gZXJyb3IgbWVzc2FnZSBpcyBub3QgdmlzaWJsZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkEgY3VzdG9tIGVycm9yIG1lc3NhZ2UgbXVzdCByZWZlcmVuY2UgYSB2YWxpZCAnaWQnIHZhbHVlIGFuZCB3aGVuIHRyaWdnZXJlZCB0aGUgbWVzc2FnZSBtdXN0IGJlIGFwcHJvcHJpYXRlbHkgZXhwb3NlZFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMy4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IGFyaWFfZXJyTXNnSWQgPSBBcmlhVXRpbC5nZXRBcmlhQXR0cmlidXRlKHJ1bGVDb250ZXh0LCBcImFyaWEtZXJyb3JtZXNzYWdlXCIpO1xuXG4gICAgICAgIC8vIElmIGFyaWEtZXJyb3JtZXNzYWdlIGlzIG5vdCBwcm92aWRlZCwgdGhlbiBPVVRfT0ZfU0NPUEVcbiAgICAgICAgaWYgKCFhcmlhX2Vyck1zZ0lkKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBtc2dfZWxlID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQocnVsZUNvbnRleHQsIGFyaWFfZXJyTXNnSWQpO1xuXG4gICAgICAgIC8vIFBPRjA6IEludmFsaWQgaWQgcmVmZXJlbmNlXG4gICAgICAgIGlmICghbXNnX2VsZSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUE9GMTogUmVmZXJlbmNlZCBlbGVtZW50IGlzIG5vdCB2aXNpYmxlXG4gICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKG1zZ19lbGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzJcIik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG5pbXBvcnQgeyBDYWNoZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgQWNjTmFtZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BY2NOYW1lVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgZmllbGRzZXRfbGFiZWxfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZmllbGRzZXRfbGFiZWxfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImFyaWE6Z3JvdXBcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcImdyb3VwX3dpdGhJbnB1dHNfaGFzTmFtZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMVwiOiBcIlBhc3NfMVwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiRmFpbF8yXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzFcIjogXCJmaWVsZHNldF9sYWJlbF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImZpZWxkc2V0X2xhYmVsX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiZmllbGRzZXRfbGFiZWxfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImZpZWxkc2V0X2xhYmVsX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18xXCI6IFwiR3JvdXAvRmllbGRzZXQgXFxcInswfVxcXCIgd2l0aCBhbiBpbnB1dCBoYXMgYSB1bmlxdWUgbmFtZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJHcm91cC9GaWVsZHNldCBkb2VzIG5vdCBoYXZlIGFuIGFjY2Vzc2libGUgbmFtZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJHcm91cC9GaWVsZHNldCBcXFwiezB9XFxcIiBoYXMgYSBkdXBsaWNhdGUgbmFtZSB0byBhbm90aGVyIGdyb3VwXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiR3JvdXBzIHdpdGggbmVzdGVkIGlucHV0cyBtdXN0IGhhdmUgdW5pcXVlIGFjY2Vzc2libGUgbmFtZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbeyBcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sIFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiLCBcIjMuMy4yXCJdLCBcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sIFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFIFxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcblxuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IGlzIGhpZGRlbiBvciBkaXNhYmxlZFxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpIHx8IENvbW1vblV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGxldCBvd25lckRvY3VtZW50ID0gRnJhZ21lbnRVdGlsLmdldE93bmVyRnJhZ21lbnQocnVsZUNvbnRleHQpO1xuICAgICAgICBsZXQgZm9ybUNhY2hlID0gQ2FjaGVVdGlsLmdldENhY2hlKFxuICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgIFwibGFuZG1hcmtfZ3JvdXBfaW5wdXRcIixcbiAgICAgICAgICAgIG51bGxcbiAgICAgICAgKTtcbiAgICAgICAgXG4gICAgICAgIGlmICghZm9ybUNhY2hlKSB7XG4gICAgICAgICAgICBmb3JtQ2FjaGUgPSB7XG4gICAgICAgICAgICAgICAgZ3JvdXBzV2l0aElucHV0czogW10sXG4gICAgICAgICAgICAgICAgZ3JvdXBzV2l0aElucHV0c0NvbXB1dGVkTGFiZWxzOiBbXSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBsZXQgYWxsR3JvdXBzVGVtcCA9IG93bmVyRG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcbiAgICAgICAgICAgICAgICAnZmllbGRzZXQsW3JvbGU9XCJncm91cFwiXSdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBsZXQgYWxsR3JvdXBzID0gQXJyYXkuZnJvbShhbGxHcm91cHNUZW1wKTtcbiAgICAgICAgICAgIGxldCBncm91cHNXaXRoSW5wdXRzID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFsbEdyb3Vwcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIC8vIExvb3Agb3ZlciBhbGwgdGhlIGdyb3VwIG5vZGVzXG4gICAgICAgICAgICAgICAgaWYgKGFsbEdyb3Vwc1tpXS5xdWVyeVNlbGVjdG9yKFwiaW5wdXRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBzV2l0aElucHV0cy5wdXNoKGFsbEdyb3Vwc1tpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGdyb3Vwc1dpdGhJbnB1dHNDb21wdXRlZExhYmVscyA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBncm91cHNXaXRoSW5wdXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZShncm91cHNXaXRoSW5wdXRzW2ldKTtcbiAgICAgICAgICAgICAgICAvLyBMb29wIG92ZXIgYWxsIHRoZSBsYW5kbWFyayBub2Rlc1xuICAgICAgICAgICAgICAgIGdyb3Vwc1dpdGhJbnB1dHNDb21wdXRlZExhYmVscy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAvKipBUklBTWFwcGVyLmNvbXB1dGVOYW1lKGdyb3Vwc1dpdGhJbnB1dHNbaV0pKi9cbiAgICAgICAgICAgICAgICAgICAgcGFpciAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwID8gcGFpci5uYW1lLnRyaW0oKSA6IFwiXCJcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9ybUNhY2hlLmdyb3Vwc1dpdGhJbnB1dHMgPSBncm91cHNXaXRoSW5wdXRzO1xuICAgICAgICAgICAgZm9ybUNhY2hlLmdyb3Vwc1dpdGhJbnB1dHNDb21wdXRlZExhYmVscyA9XG4gICAgICAgICAgICAgICAgZ3JvdXBzV2l0aElucHV0c0NvbXB1dGVkTGFiZWxzO1xuXG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUocnVsZUNvbnRleHQub3duZXJEb2N1bWVudCwgXCJsYW5kbWFya19ncm91cF9pbnB1dFwiLGZvcm1DYWNoZSk7ICAgIFxuICAgICAgICB9XG4gICAgICAgIC8vIGZvcm1DYWNoZS5ncm91cHNXaXRoSW5wdXRzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgIC8vICAgICBjb25zb2xlLmxvZyhcImZvcm1DYWNoZS5ncm91cHNXaXRoSW5wdXRzOiBcIiArZWxlbWVudC5pZClcbiAgICAgICAgLy8gfSk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiZm9ybUNhY2hlLmdyb3Vwc1dpdGhJbnB1dHNDb21wdXRlZExhYmVsczogXCIgK2Zvcm1DYWNoZS5ncm91cHNXaXRoSW5wdXRzQ29tcHV0ZWRMYWJlbHMpXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiZm9ybUNhY2hlLmdyb3Vwc1dpdGhJbnB1dHNDb21wdXRlZExhYmVsczogXCIgK2Zvcm1DYWNoZS5ncm91cHNXaXRoSW5wdXRzQ29tcHV0ZWRMYWJlbHMubGVuZ3RoKVxuXG4gICAgICAgIGxldCBydWxlQ29udGV4dEZvdW5kSW5ncm91cHNXaXRoSW5wdXRzRmxhZyA9IGZhbHNlO1xuICAgICAgICBsZXQgY29tcHV0ZWROYW1lID0gXCJcIjtcbiAgICAgICAgaWYgKCFmb3JtQ2FjaGUuZ3JvdXBzV2l0aElucHV0cykge1xuICAgICAgICAgICAgLy8gV2UgZG8gbm90IGhhdmUgYW55IGdyb3VwcyB3aXRoIGlucHV0cy4gVGhlcmVmb3JlIHdlIHNob3VsZCBza2lwIHRoaXMgcnVsZSB0cmlnZ2VyLlxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZvcm1DYWNoZS5ncm91cHNXaXRoSW5wdXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuaXNTYW1lTm9kZShmb3JtQ2FjaGUuZ3JvdXBzV2l0aElucHV0c1tpXSkpIHtcbiAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIGZvdW5kIG91ciBydWxlQ29udGV4dCBpbiB0aGUgY2FjaGVcbiAgICAgICAgICAgICAgICBydWxlQ29udGV4dEZvdW5kSW5ncm91cHNXaXRoSW5wdXRzRmxhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBmb3JtQ2FjaGUuZ3JvdXBzV2l0aElucHV0c0NvbXB1dGVkTGFiZWxzW2ldID09PSBcIlwiIHx8XG4gICAgICAgICAgICAgICAgICAgIGZvcm1DYWNoZS5ncm91cHNXaXRoSW5wdXRzQ29tcHV0ZWRMYWJlbHNbaV0gPT09IG51bGxcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJGYWlsXzFcIilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgZm91bmRTYW1lTmFtZUZsYWcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBmb3IgKFxuICAgICAgICAgICAgICAgICAgICBsZXQgaiA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGogPCBmb3JtQ2FjaGUuZ3JvdXBzV2l0aElucHV0c0NvbXB1dGVkTGFiZWxzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgaisrXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpID09IGopIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9IC8vIFdlIGRvIG5vdCB3YW50IHRvIGNvbXBhcmUgYWdhaW5zdCBvdXJzZWxmc1xuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ2FjaGUuZ3JvdXBzV2l0aElucHV0c0NvbXB1dGVkTGFiZWxzW2ldID09PVxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNhY2hlLmdyb3Vwc1dpdGhJbnB1dHNDb21wdXRlZExhYmVsc1tqXVxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kU2FtZU5hbWVGbGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZm91bmRTYW1lTmFtZUZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJGYWlsXzJcIilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8yXCIsIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1DYWNoZS5ncm91cHNXaXRoSW5wdXRzQ29tcHV0ZWRMYWJlbHNbaV0sXG4gICAgICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb21wdXRlZE5hbWUgPSBmb3JtQ2FjaGUuZ3JvdXBzV2l0aElucHV0c0NvbXB1dGVkTGFiZWxzW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghcnVsZUNvbnRleHRGb3VuZEluZ3JvdXBzV2l0aElucHV0c0ZsYWcpIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwibnVsbCByZXR1cm5cIilcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiUGFzc18xXCIpXG4gICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMVwiLCBbY29tcHV0ZWROYW1lXSk7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBmaWVsZHNldF9sZWdlbmRfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZmllbGRzZXRfbGVnZW5kX3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJkb206ZmllbGRzZXRcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9GaWVsZHNldF9IYXNMZWdlbmRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkZhaWxfMlwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJGYWlsXzNcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImZpZWxkc2V0X2xlZ2VuZF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImZpZWxkc2V0X2xlZ2VuZF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcImZpZWxkc2V0X2xlZ2VuZF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcImZpZWxkc2V0X2xlZ2VuZF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZmllbGRzZXRfbGVnZW5kX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiPGZpZWxkc2V0PiBlbGVtZW50IGRvZXMgbm90IGhhdmUgYSA8bGVnZW5kPlwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCI8ZmllbGRzZXQ+IGVsZW1lbnQgaGFzIG1vcmUgdGhhbiBvbmUgPGxlZ2VuZD5cIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiPGZpZWxkc2V0PiBlbGVtZW50IDxsZWdlbmQ+IGlzIGVtcHR5XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiIDxmaWVsZHNldD4gZWxlbWVudHMgc2hvdWxkIGhhdmUgYSBzaW5nbGUsIG5vbi1lbXB0eSA8bGVnZW5kPiBhcyBhIGxhYmVsXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSwgIC8vaHR0cHM6Ly93d3cudzMub3JnL1dBSS9XQ0FHMjIvVGVjaG5pcXVlcy9odG1sL0g3MVxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAvL3NraXAgaWYgdGhlIGZpZWxkc2V0IGlzIGhpZGRlbiBvciBkaXNhYmxlZFxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpIHx8IENvbW1vblV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gSW4gdGhlIGNhc2UgYSBsZWdlbmQgaXMgaGlkZGVuLCB3ZSBzaG91bGQgc3RpbGwgdHJpZ2dlciBhIHZpb2xhdGlvbnMgZm9yIHRoaXNcbiAgICAgICAgbGV0IGxlZ2VuZHMgPSBDb21tb25VdGlsLmdldENoaWxkQnlUYWdIaWRkZW4ocnVsZUNvbnRleHQsIFwibGVnZW5kXCIsIHRydWUsIGZhbHNlKTtcbiAgICAgICAgaWYgKGxlZ2VuZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBGaWVsZHNldCBoYXMgTk8gTGVnZW5kXG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH0gZWxzZSBpZiAobGVnZW5kcy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAvLyBGaWVsZHNldCBoYXMgbW9yZSB0aGFuIG9uZSBsZWdlbmRcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMlwiKTtcbiAgICAgICAgfSBlbHNlIGlmIChDb21tb25VdGlsLmdldElubmVyVGV4dChsZWdlbmRzWzBdKS50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBGaWVsZHNldCBoYXMgbGVnZW5kIGJ1dCBsZWdlbmQgaXMgZW1wdHlcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfM1wiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcbmltcG9ydCB7IEFjY05hbWVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQWNjTmFtZVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBmaWd1cmVfbGFiZWxfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcImZpZ3VyZV9sYWJlbF9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTpmaWd1cmVcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIkhBQUNfRmlndXJlX2xhYmVsXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiZmlndXJlX2xhYmVsX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImZpZ3VyZV9sYWJlbF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImZpZ3VyZV9sYWJlbF9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUaGUgPGZpZ3VyZT4gZWxlbWVudCBkb2VzIG5vdCBoYXZlIGFuIGFzc29jaWF0ZWQgbGFiZWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBIDxmaWd1cmU+IGVsZW1lbnQgbXVzdCBoYXZlIGFuIGFzc29jaWF0ZWQgbGFiZWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICAvLyBpZ25vcmUgaWYgYW4gZXhwbGljaXQgcm9sZSBpcyBzcGVjaWZpZWQuIHRoaXMgY2FzZSB3aWxsIGJlIGNvdmVyZWQgaW4gdGhlIGFyaWFfYWNjZXNzaWJsZW5hbWVfZXhpc3RzIHJ1bGVzXG4gICAgICAgIGxldCByb2xlID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwicm9sZVwiKTtcbiAgICAgICAgaWYgKHJvbGUpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9sZXQgcGFzc2VkID0gQXJpYVV0aWwuaGFzQXJpYUxhYmVsKHJ1bGVDb250ZXh0KSB8fCBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInRpdGxlXCIpO1xuICAgICAgICBjb25zdCBwYWlyID0gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgY29uc3QgcGFzc2VkID0gcGFpciAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwO1xuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIFtydWxlQ29udGV4dF0sICcnLCAnJywgW10pO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIsIFtdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG5leHBvcnQgY29uc3QgZm9ybV9mb250X2NvbG9yOiBSdWxlID0ge1xuICAgIGlkOiBcImZvcm1fZm9udF9jb2xvclwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmZvcm1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9Gb250X0NvbG9ySW5Gb3JtXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImZvcm1fZm9udF9jb2xvci5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiZm9ybV9mb250X2NvbG9yLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJmb3JtX2ZvbnRfY29sb3IuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIkNoZWNrIGNvbG9yIGlzIG5vdCB1c2VkIGFzIHRoZSBvbmx5IHZpc3VhbCBtZWFucyB0byBjb252ZXkgd2hpY2ggZmllbGRzIGFyZSByZXF1aXJlZFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkNvbWJpbmUgY29sb3IgYW5kIGRlc2NyaXB0aXZlIG1hcmt1cCB0byBpbmRpY2F0ZSByZXF1aXJlZCBmb3JtIGZpZWxkc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS40LjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGxldCBmb250cyA9IHJ1bGVDb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiZm9udFwiKTtcbiAgICAgICAgaWYgKGZvbnRzICE9IG51bGwpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZm9udHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSAhZm9udHNbaV0uaGFzQXR0cmlidXRlKFwiY29sb3JcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGZvcm1faW50ZXJhY3Rpb25fcmV2aWV3OiBSdWxlID0ge1xuICAgIGlkOiBcImZvcm1faW50ZXJhY3Rpb25fcmV2aWV3XCIsXG4gICAgY29udGV4dDogXCJkb206Zm9ybVt0YXJnZXRdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfRm9ybV9UYXJnZXRBbmRUZXh0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImZvcm1faW50ZXJhY3Rpb25fcmV2aWV3Lmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJmb3JtX2ludGVyYWN0aW9uX3Jldmlldy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZm9ybV9pbnRlcmFjdGlvbl9yZXZpZXcuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0aGF0IGludGVyYWN0aW5nIHdpdGggY29udGVudCB3aWxsIG5vdCBvcGVuIHBvcC11cCB3aW5kb3dzIG9yIGNoYW5nZSB0aGUgYWN0aXZlIHdpbmRvdyB3aXRob3V0IGluZm9ybWluZyB0aGUgdXNlclwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlVzZXIgc2hvdWxkIGJlIGluZm9ybWVkIGluIGFkdmFuY2Ugd2hlbiBpbnRlcmFjdGluZyB3aXRoIGNvbnRlbnQgY2F1c2VzIGEgY2hhbmdlIG9mIGNvbnRleHRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjMuMi4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgdmFsaWRhdGVQYXJhbXMgPSB7XG4gICAgICAgICAgICBwYXJhbVdpblRleHQ6IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogW1wibmV3IHdpbmRvd1wiXSxcbiAgICAgICAgICAgICAgICB0eXBlOiBcImFycmF5XCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgdFN0ciA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInRhcmdldFwiKTtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRTdHIgPT09IFwiX3BhcmVudFwiIHx8IHRTdHIgPT09IFwiX3NlbGZcIiB8fCB0U3RyID09PSBcIl90b3BcIiB8fCBDb21tb25VdGlsLmdldEZyYW1lQnlOYW1lKHJ1bGVDb250ZXh0LCB0U3RyKSAhPSBudWxsO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgLy8gTmFtZSBpcyBub3QgcGFydCBvZiB0aGlzIGZyYW1lc2V0IOKAkyBtdXN0IGhhdmUgcG90ZW50aWFsIHRvIGNyZWF0ZSBuZXcgd2luZG93P1xuICAgICAgICAgICAgLy8gU2VlIGlmIGEgbmV3IHdpbmRvdyBpcyBtZW50aW9uZWRcbiAgICAgICAgICAgIGxldCB0ZXh0U3RyID0gQ29tbW9uVXRpbC5nZXRJbm5lclRleHQocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInRpdGxlXCIpKVxuICAgICAgICAgICAgICAgIHRleHRTdHIgKz0gXCIgXCIgKyBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0aXRsZVwiKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyAhcGFzc2VkICYmIGkgPCB2YWxpZGF0ZVBhcmFtcy5wYXJhbVdpblRleHQudmFsdWUubGVuZ3RoOyArK2kpXG4gICAgICAgICAgICAgICAgaWYgKHRleHRTdHIuaW5kZXhPZih2YWxpZGF0ZVBhcmFtcy5wYXJhbVdpblRleHQudmFsdWVbaV0pICE9IC0xKSBwYXNzZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgZm9ybV9sYWJlbF91bmlxdWU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZm9ybV9sYWJlbF91bmlxdWVcIixcbiAgICBjb250ZXh0OiBcImRvbTpsYWJlbFtmb3JdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfTGFiZWxfVW5pcXVlRm9yXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiZm9ybV9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJmb3JtX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZm9ybV9sYWJlbF91bmlxdWUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGb3JtIGNvbnRyb2wgaGFzIG1vcmUgdGhhbiBvbmUgbGFiZWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJGb3JtIGNvbnRyb2xzIHNob3VsZCBoYXZlIGV4YWN0bHkgb25lIGxhYmVsXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBKQ0ggLSBOTyBPVVQgT0YgU0NPUEUgaGlkZGVuIGluIGNvbnRleHRcbiAgICAgICAgbGV0IGxhYmVsSWRzID0gQ2FjaGVVdGlsLmdldENhY2hlKEZyYWdtZW50VXRpbC5nZXRPd25lckZyYWdtZW50KHJ1bGVDb250ZXh0KSwgXCJSUFRfTGFiZWxfU2luZ2xlXCIsIHt9KVxuICAgICAgICBsZXQgaWQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJmb3JcIik7XG4gICAgICAgIGxldCBwYXNzZWQgPSAhKGlkIGluIGxhYmVsSWRzKTtcbiAgICAgICAgbGFiZWxJZHNbaWRdID0gdHJ1ZTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01XYWxrZXJcIjtcblxuZXhwb3J0IGNvbnN0IGZvcm1fc3VibWl0X2J1dHRvbl9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZm9ybV9zdWJtaXRfYnV0dG9uX2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmZvcm1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9Gb3JtX0hhc1N1Ym1pdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJmb3JtX3N1Ym1pdF9idXR0b25fZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJmb3JtX3N1Ym1pdF9idXR0b25fZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJmb3JtX3N1Ym1pdF9idXR0b25fZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgdGhlIDxmb3JtPiBlbGVtZW50IGhhcyBhIHN1Ym1pdCBidXR0b24gb3IgYW4gaW1hZ2UgYnV0dG9uXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQSA8Zm9ybT4gZWxlbWVudCBzaG91bGQgaGF2ZSBhIHN1Ym1pdCBidXR0b24gb3IgYW4gaW1hZ2UgYnV0dG9uXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIzLjIuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0LmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICAgIC8vIHN1Ym1pdCBidXR0b25zIGFyZSB1c3VhbGx5IGF0IHRoZSBib3R0b20gLSB3YWxrIGJhY2t3YXJkc1xuICAgICAgICAgICAgbGV0IG53ID0gbmV3IERPTVdhbGtlcihydWxlQ29udGV4dCwgdHJ1ZSk7XG4gICAgICAgICAgICB3aGlsZSAoIXBhc3NlZCAmJiBudy5wcmV2Tm9kZSgpICYmIG53Lm5vZGUgIT0gcnVsZUNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICBpZiAoIW53LmJFbmRUYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5vZGVOYW1lID0gbncubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwiaW5wdXRcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHR5cGUgPSBudy5lbGVtKCkuZ2V0QXR0cmlidXRlKFwidHlwZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IHR5cGUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IHR5cGUgPT09IFwic3VibWl0XCIgfHwgdHlwZSA9PT0gXCJpbWFnZVwiO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5vZGVOYW1lID09PSBcImJ1dHRvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBudy5lbGVtKCkuaGFzQXR0cmlidXRlKFwidHlwZVwiKSAmJiBudy5lbGVtKCkuZ2V0QXR0cmlidXRlKFwidHlwZVwiKS50b0xvd2VyQ2FzZSgpID09PSBcInN1Ym1pdFwiO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG53Lm5vZGUubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IEFyaWFVdGlsLmhhc1JvbGUobncubm9kZSwgXCJidXR0b25cIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5cbmV4cG9ydCBjb25zdCBmb3JtX3N1Ym1pdF9yZXZpZXc6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZm9ybV9zdWJtaXRfcmV2aWV3XCIsXG4gICAgY29udGV4dDogXCJkb206c2VsZWN0W29uY2hhbmdlXSwgZG9tOmlucHV0W29uY2hhbmdlXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX0Zvcm1fQ2hhbmdlRW1wdHlcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiZm9ybV9zdWJtaXRfcmV2aWV3Lmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJmb3JtX3N1Ym1pdF9yZXZpZXcuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImZvcm1fc3VibWl0X3Jldmlldy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiQ29uZmlybSB0aGUgZm9ybSBkb2VzIG5vdCBzdWJtaXQgYXV0b21hdGljYWxseSB3aXRob3V0IHdhcm5pbmdcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBIGZvcm0gc2hvdWxkIG5vdCBiZSBzdWJtaXR0ZWQgYXV0b21hdGljYWxseSB3aXRob3V0IHdhcm5pbmcgdGhlIHVzZXJcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIzLjIuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSwqL1xuICAgIC8vZGVwcmVjYXRlIHRoZSBydWxlIG9uIEp1biAxMCwgMjAyNFxuICAgIHJ1bGVzZXRzOiBbXSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJvbmNoYW5nZVwiKS50cmltKCkubGVuZ3RoID09PSAwO1xuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgZnJhbWVfc3JjX3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcImZyYW1lX3NyY192YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmZyYW1lLCBkb206aWZyYW1lXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJWYWxlcmllX0ZyYW1lX1NyY0h0bWxcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImZyYW1lX3NyY192YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiZnJhbWVfc3JjX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJmcmFtZV9zcmNfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSA8ZnJhbWU+IGNvbnRlbnQgaXMgYWNjZXNzaWJsZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkEgPGZyYW1lPiBjb250YWluaW5nIG5vbi1IVE1MIGNvbnRlbnQgbXVzdCBiZSBtYWRlIGFjY2Vzc2libGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuNC4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwic3JjXCIpICYmXG4gICAgICAgICAgICBDb21tb25VdGlsLmlzSHRtbEV4dChDb21tb25VdGlsLmdldEZpbGVFeHQocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwic3JjXCIpKSk7XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBY2NOYW1lVXRpbCB9IGZyb20gXCIuLi91dGlsL0FjY05hbWVVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGZyYW1lX3RpdGxlX2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJmcmFtZV90aXRsZV9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTpmcmFtZSwgZG9tOmlmcmFtZVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0ZyYW1lX0hhc1RpdGxlXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZnJhbWVfdGl0bGVfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiZnJhbWVfdGl0bGVfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZnJhbWVfdGl0bGVfZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJJbmxpbmUgZnJhbWVzIG11c3QgaGF2ZSBhIHVuaXF1ZSwgbm9uLWVtcHR5ICd0aXRsZScgYXR0cmlidXRlXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIklubGluZSBmcmFtZSBkb2VzIG5vdCBoYXZlIGEgJ3RpdGxlJyBhdHRyaWJ1dGVcIixcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSwgLypDaGFuZ2UgbWFwcGluZyB0byA0LjEuMiBmcm9tIDIuNC4xIHR5cG8/ICovXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBcImNhZTc2MFwiLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIC8vIGlnbm9yZSBpZiBhbiBleHBsaWNpdCByb2xlIGlzIHNwZWNpZmllZC4gdGhpcyBjYXNlIHdpbGwgYmUgY292ZXJlZCBpbiB0aGUgYXJpYV9hY2Nlc3NpYmxlbmFtZV9leGlzdHMgcnVsZXNcbiAgICAgICAgbGV0IHJvbGUgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpO1xuICAgICAgICBpZiAocm9sZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuYW1lX3BhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWUocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAobmFtZV9wYWlyICYmIG5hbWVfcGFpci5uYW1lICYmIG5hbWVfcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vaWYgKENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwidGl0bGVcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGhlYWRpbmdfY29udGVudF9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaGVhZGluZ19jb250ZW50X2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmgxLCBkb206aDIsIGRvbTpoMywgZG9tOmg0LCBkb206aDUsIGRvbTpoNlwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX0hlYWRlcl9IYXNDb250ZW50XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiaGVhZGluZ19jb250ZW50X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImhlYWRpbmdfY29udGVudF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImhlYWRpbmdfY29udGVudF9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJIZWFkaW5nIGVsZW1lbnQgaGFzIGRlc2NyaXB0aXZlIHRleHRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiSGVhZGluZyBlbGVtZW50IGhhcyBubyBkZXNjcmlwdGl2ZSBjb250ZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiSGVhZGluZyBlbGVtZW50cyBtdXN0IHByb3ZpZGUgZGVzY3JpcHRpdmUgdGV4dFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi40LjZcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcGFzc2VkID1Db21tb25VdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbihydWxlQ29udGV4dCk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBoZWFkaW5nX21hcmt1cF9taXN1c2U6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaGVhZGluZ19tYXJrdXBfbWlzdXNlXCIsXG4gICAgY29udGV4dDogXCJkb206aDEsIGRvbTpoMiwgZG9tOmgzLCBkb206aDQsIGRvbTpoNSwgZG9tOmg2XCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJoZWFkaW5nX2NvbnRlbnRfZXhpc3RzXCJdLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX0hlYWRlcnNfRmV3V29yZHNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiaGVhZGluZ19tYXJrdXBfbWlzdXNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJoZWFkaW5nX21hcmt1cF9taXN1c2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImhlYWRpbmdfbWFya3VwX21pc3VzZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVmVyaWZ5IHRoYXQgdGhlIGhlYWRpbmcgZWxlbWVudCBpcyBhIGdlbnVpbmUgaGVhZGluZ1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkhlYWRpbmcgZWxlbWVudHMgbXVzdCBub3QgYmUgdXNlZCBmb3IgcHJlc2VudGF0aW9uXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCB2YWxpZGF0ZVBhcmFtcyA9IHtcbiAgICAgICAgICAgIGhlYWRpbmdMZW5ndGhUaHJlc2g6IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogMjAsXG4gICAgICAgICAgICAgICAgdHlwZTogXCJpbnRlZ2VyXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgaGVhZGluZ0xlbmd0aFRocmVzaCA9IHZhbGlkYXRlUGFyYW1zLmhlYWRpbmdMZW5ndGhUaHJlc2gudmFsdWU7XG4gICAgICAgIGxldCBwYXNzZWQgPSBDb21tb25VdGlsLndvcmRDb3VudChDb21tb25VdGlsLmdldElubmVyVGV4dChydWxlQ29udGV4dCkpIDw9IGhlYWRpbmdMZW5ndGhUaHJlc2g7XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBbmNlc3RvclV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvYW5jZXN0b3JcIjtcbmltcG9ydCB7IExhbmdVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xhbmdcIjtcblxuZXhwb3J0IGNvbnN0IGh0bWxfbGFuZ19leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaHRtbF9sYW5nX2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmh0bWxcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9IdG1sX0hhc0xhbmdcIjogeyBcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJGYWlsXzJcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiRmFpbF8zXCIsXG4gICAgICAgICAgICBcIkZhaWxfNFwiOiBcIkZhaWxfNFwiLFxuICAgICAgICAgICAgXCJGYWlsXzVcIjogXCJGYWlsXzVcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzVcIjogXCJQb3RlbnRpYWxfNVwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfNlwiOiBcIlBvdGVudGlhbF82XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogYGh0bWxfbGFuZ19leGlzdHMuaHRtbGAsIFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogYGh0bWxfbGFuZ19leGlzdHMuaHRtbGAsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBgaHRtbF9sYW5nX2V4aXN0cy5odG1sYCxcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IGBodG1sX2xhbmdfZXhpc3RzLmh0bWxgLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogYGh0bWxfbGFuZ19leGlzdHMuaHRtbGAsXG4gICAgICAgICAgICBcIkZhaWxfNFwiOiBgaHRtbF9sYW5nX2V4aXN0cy5odG1sYCxcbiAgICAgICAgICAgIFwiRmFpbF81XCI6IGBodG1sX2xhbmdfZXhpc3RzLmh0bWxgLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfNVwiOiBgaHRtbF9sYW5nX2V4aXN0cy5odG1sYCxcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzZcIjogYGh0bWxfbGFuZ19leGlzdHMuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiUGFnZSBtdXN0IGlkZW50aWZ5IHRoZSBkZWZhdWx0IGxhbmd1YWdlIG9mIHRoZSBkb2N1bWVudCB3aXRoIGEgJ2xhbmcnIGF0dHJpYnV0ZVwiLCBcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFnZSBsYW5ndWFnZSBkZXRlY3RlZCBhcyBcXFwiezB9XFxcIlwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJQYWdlIGRldGVjdGVkIGFzIFhIVE1MIDEuMCwgYnV0IGhhcyBuZWl0aGVyICdsYW5nJyBub3IgJ3htbDpsYW5nJyBhdHRyaWJ1dGVzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIlBhZ2UgZGV0ZWN0ZWQgYXMgWEhUTUwsIGJ1dCBkb2VzIG5vdCBoYXZlIGFuICd4bWw6bGFuZycgYXR0cmlidXRlXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcIlBhZ2UgZGV0ZWN0ZWQgYXMgSFRNTCwgYnV0IGRvZXMgbm90IGhhdmUgYSAnbGFuZycgYXR0cmlidXRlXCIsXG4gICAgICAgICAgICBcIkZhaWxfNFwiOiBcIlBhZ2UgZGV0ZWN0ZWQgd2l0aCAnbGFuZycgYW5kICd4bWw6bGFuZycgYXR0cmlidXRlcyBhbmQgcHJpbWFyeSBsYW5ndWFnZXMgZG8gbm90IG1hdGNoOiBcXFwiezB9XFxcIiwgXFxcInsxfVxcXCJcIixcbiAgICAgICAgICAgIFwiRmFpbF81XCI6IFwiUGFnZSBkZXRlY3RlZCB3aXRoICdsYW5nJyBhbmQgJ3htbDpsYW5nJyBhdHRyaWJ1dGVzIHRoYXQgZG8gbm90IG1hdGNoOiBcXFwiezB9XFxcIiwgXFxcInsxfVxcXCJcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzVcIjogXCJQYWdlIGRldGVjdGVkIGFzIFhIVE1MIDEuMCB3aXRoIG9ubHkgYSAnbGFuZycgYXR0cmlidXRlLiBDb25maXJtIHRoYXQgcGFnZSBpcyBvbmx5IGRlbGl2ZXJlZCB2aWEgdGV4dC9odG1sIG1pbWUgdHlwZVwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfNlwiOiBcIlBhZ2UgZGV0ZWN0ZWQgYXMgWEhUTUwgMS4wIHdpdGggb25seSBhbiAneG1sOmxhbmcnIGF0dHJpYnV0ZS4gQ29uZmlybSB0aGF0IHBhZ2UgaXMgb25seSBkZWxpdmVyZWQgdmlhIHhtbCBtaW1lIHR5cGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFsgXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIG51bTogXCIzLjEuMVwiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW3tcbiAgICAgICAgXCJiNWMzZjhcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImluYXBwbGljYWJsZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJpbmFwcGxpY2FibGVcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiZmFpbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzRcIjogXCJpbmFwcGxpY2FibGVcIixcbiAgICAgICAgICAgIFwiRmFpbF81XCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF81XCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF82XCI6IFwiaW5hcHBsaWNhYmxlXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCI1YjdhZTBcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImluYXBwbGljYWJsZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJpbmFwcGxpY2FibGVcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgICAgICBcIkZhaWxfNFwiOiBcImZhaWxcIixcbiAgICAgICAgICAgIFwiRmFpbF81XCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfNVwiOiBcImluYXBwbGljYWJsZVwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfNlwiOiBcImluYXBwbGljYWJsZVwiXG4gICAgICAgIH1cbiAgICB9XSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICAvLyBUaGlzIHJ1bGUgZG9lcyBub3QgYXBwbHkgaW5zaWRlIGEgcHJlc2VudGF0aW9uYWwgZnJhbWVcbiAgICAgICAgaWYgKEFuY2VzdG9yVXRpbC5pc1ByZXNlbnRhdGlvbkZyYW1lKGNvbnRleHRIaWVyYXJjaGllcykpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBkb2N0eXBlU3RyaW5nID0gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5kb2N0eXBlID8gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5kb2N0eXBlLnB1YmxpY0lkIDogXCJcIjtcbiAgICAgICAgaWYgKCFkb2N0eXBlU3RyaW5nKSBkb2N0eXBlU3RyaW5nID0gXCJcIjtcbiAgICAgICAgbGV0IGxhbmcgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJsYW5nXCIpO1xuICAgICAgICBsZXQgbGFuZ1hNTCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInhtbDpsYW5nXCIpO1xuXG4gICAgICAgIGlmIChkb2N0eXBlU3RyaW5nLmluY2x1ZGVzKCdYSFRNTCcpICYmICFkb2N0eXBlU3RyaW5nLmluY2x1ZGVzKFwiMS4wXCIpKSB7XG4gICAgICAgICAgICBpZiAoIWxhbmdYTUwpIHtcbiAgICAgICAgICAgICAgICAvLyBYSFRNTCAhPSAxLjAgKG11c3QgaGF2ZSB4bWw6bGFuZ1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMlwiKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIsW2xhbmdYTUxdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChkb2N0eXBlU3RyaW5nLmluY2x1ZGVzKCdYSFRNTCcpICYmIGRvY3R5cGVTdHJpbmcuaW5jbHVkZXMoXCIxLjBcIikpIHtcbiAgICAgICAgICAgIC8vIEhhbmRsZSBYSFRNTCAxLjBcbiAgICAgICAgICAgIC8vIElmIG5laXRoZXIgaXMgcHJvdmlkZWQsIGl0J3MgYSBmYWlsdXJlXG4gICAgICAgICAgICBpZiAoIWxhbmcgJiYgIWxhbmdYTUwpIHtcbiAgICAgICAgICAgICAgICAvLyBYSFRNTCBhbmQgbm8gbGFuZ1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobGFuZyAmJiBsYW5nWE1MKSB7XG4gICAgICAgICAgICAgICAgaWYgKGxhbmcgIT09IGxhbmdYTUwpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFMYW5nVXRpbC52YWxpZFByaW1hcnlMYW5nKGxhbmcpIHx8ICFMYW5nVXRpbC52YWxpZFByaW1hcnlMYW5nKGxhbmdYTUwpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBMZXQgRWxlbV9MYW5nX1ZhbGlkIGhhbmRsZSB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIUxhbmdVdGlsLm1hdGNoUHJpbWFyeUxhbmcobGFuZywgbGFuZ1hNTCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFhIVE1MIGFuZCBsYW5nIGFuZCB4bWw6bGFuZywgYnV0IHRoZXkgZG9uJ3QgbWF0Y2hcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfNFwiLCBbbGFuZywgbGFuZ1hNTF0sIFtdKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfNVwiLCBbbGFuZywgbGFuZ1hNTF0sIFtdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFhIVE1MIGFuZCBsYW5nIGFuZCB4bWw6bGFuZyBtYXRjaFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIixbbGFuZ10pXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChsYW5nKSB7XG4gICAgICAgICAgICAgICAgLy8gWEhUTUwgYW5kIG9ubHkgbGFuZyAob2theSBpZiBvbmx5IGRlbGl2ZXJlZCB2aWEgdGV4dC9odG1sKVxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzVcIik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFhIVE1MIGFuZCBvbmx5IHhtbDpsYW5nIChva2F5IGlmIG9ubHkgZGVsaXZlcmVkIHZpYSB4bWwgbWltZSB0eXBlKVxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzZcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIWxhbmcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzNcIik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxhbmcgJiYgbGFuZ1hNTCkge1xuICAgICAgICAgICAgICAgIC8vIEhUTUw1IHBvbHlnbG90IGRvY3VtZW50c1xuICAgICAgICAgICAgICAgIGlmIChsYW5nICE9PSBsYW5nWE1MKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghTGFuZ1V0aWwudmFsaWRQcmltYXJ5TGFuZyhsYW5nKSB8fCAhTGFuZ1V0aWwudmFsaWRQcmltYXJ5TGFuZyhsYW5nWE1MKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGV0IEVsZW1fTGFuZ19WYWxpZCBoYW5kbGUgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFMYW5nVXRpbC5tYXRjaFByaW1hcnlMYW5nKGxhbmcsIGxhbmdYTUwpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBYSFRNTCBhbmQgbGFuZyBhbmQgeG1sOmxhbmcsIGJ1dCB0aGV5IGRvbid0IG1hdGNoXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzRcIiwgW2xhbmcsIGxhbmdYTUxdLCBbXSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzVcIiwgW2xhbmcsIGxhbmdYTUxdLCBbXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBYSFRNTCBhbmQgbGFuZyBhbmQgeG1sOmxhbmcgbWF0Y2hcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIsW2xhbmddKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIsW2xhbmddKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG4gICAgXG5leHBvcnQgY29uc3QgaHRtbF9za2lwbmF2X2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJodG1sX3NraXBuYXZfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJkb206aHRtbFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX0h0bWxfU2tpcE5hdlwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogYGh0bWxfc2tpcG5hdl9leGlzdHMuaHRtbGAsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBgaHRtbF9za2lwbmF2X2V4aXN0cy5odG1sYCxcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogYGh0bWxfc2tpcG5hdl9leGlzdHMuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiUHJvdmlkZSBhIHdheSB0byBieXBhc3MgYmxvY2tzIG9mIGNvbnRlbnQgdGhhdCBhcmUgcmVwZWF0ZWQgb24gbXVsdGlwbGUgV2ViIHBhZ2VzXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVmVyaWZ5IHRoZXJlIGlzIGEgd2F5IHRvIGJ5cGFzcyBibG9ja3Mgb2YgY29udGVudCB0aGF0IGFyZSByZXBlYXRlZCBvbiBtdWx0aXBsZSBXZWIgcGFnZXNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFsgXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIG51bTogXCIyLjQuMVwiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgIGxldCBmcmFtZXMgPSBDb21tb25VdGlsLmdldERvY0VsZW1lbnRzQnlUYWcocnVsZUNvbnRleHQsIFwiZnJhbWVcIik7XG4gICAgICAgIGxldCBoZWFkZXJzID0gQ29tbW9uVXRpbC5nZXREb2NFbGVtZW50c0J5VGFnKHJ1bGVDb250ZXh0LCBcImgxXCIpO1xuXG4gICAgICAgIGlmICgoZnJhbWVzICE9IG51bGwgJiYgZnJhbWVzLmxlbmd0aCA+IDApIHx8IChoZWFkZXJzICE9IG51bGwgJiYgaGVhZGVycy5sZW5ndGggPiAwKSkge1xuICAgICAgICAgICAgLy8gSWYgZnJhbWVzIG9yIGhlYWRpbmdzIGFyZSB1c2VkLCBwYXNzXG4gICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gTG9vayBmb3Igc2tpcCBhbmNob3JzXG4gICAgICAgICAgICBsZXQgYW5jaG9ycyA9IENvbW1vblV0aWwuZ2V0RG9jRWxlbWVudHNCeVRhZyhydWxlQ29udGV4dCwgXCJhXCIpO1xuICAgICAgICAgICAgbGV0IHRhcmdldHMgPSB7fTtcbiAgICAgICAgICAgIGZvciAobGV0IGlkeCA9IDA7ICFwYXNzZWQgJiYgaWR4IDwgYW5jaG9ycy5sZW5ndGg7ICsraWR4KSB7XG4gICAgICAgICAgICAgICAgaWYgKGFuY2hvcnNbaWR4XS5oYXNBdHRyaWJ1dGUoXCJocmVmXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBocmVmID0gYW5jaG9yc1tpZHhdLmhyZWY7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaHJlZiAhPT0gdHlwZW9mIFwiXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChocmVmLmJhc2VWYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBocmVmID0gaHJlZi5iYXNlVmFsO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBocmVmID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZXQgdG1wTG9jYXRpb247XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgKChydWxlQ29udGV4dC5vd25lckRvY3VtZW50IGFzIGFueSkubG9jYXRpb25Gcm9tREFQKSAhPSBcInVuZGVmaW5lZFwiICYmIChydWxlQ29udGV4dC5vd25lckRvY3VtZW50IGFzIGFueSkubG9jYXRpb25Gcm9tREFQICE9IG51bGwpIHsgLy8gREFQIHNldHMgaXRcbiAgICAgICAgICAgICAgICAgICAgICAgIHRtcExvY2F0aW9uID0gKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQgYXMgYW55KS5sb2NhdGlvbkZyb21EQVA7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIHNlcnZlciBzY2FuIGhhcyB0aGUgbG9jYXRpb24gb2JqZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICB0bXBMb2NhdGlvbiA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQubG9jYXRpb247XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGV0IGRvY0hyZWYgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICBpZiAodG1wTG9jYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY0hyZWYgPSB0bXBMb2NhdGlvbi5ocmVmO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIEZpeCB3ZWlyZCBidWdzIHdpdGggaG93IHZhcmlvdXMgcGFyc2VycyByZXBvcnQgb24gZmlsZTogdXJsJ3M6XG4gICAgICAgICAgICAgICAgICAgIGlmIChocmVmLnN0YXJ0c1dpdGgoXCJmaWxlOi8vL1wiKSkgaHJlZiA9IFwiZmlsZTovXCIgKyBocmVmLnN1YnN0cmluZyhcImZpbGU6Ly8vXCIubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRvY0hyZWYuc3RhcnRzV2l0aChcImZpbGU6Ly8vXCIpKSBkb2NIcmVmID0gXCJmaWxlOi9cIiArIGRvY0hyZWYuc3Vic3RyaW5nKFwiZmlsZTovLy9cIi5sZW5ndGgpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChocmVmLmNoYXJBdCgwKSA9PSBcIiNcIiB8fCBocmVmLnN0YXJ0c1dpdGgoZG9jSHJlZiArIFwiI1wiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRhcmdldCA9IENvbW1vblV0aWwuZ2V0RmlsZUFuY2hvcihocmVmKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChGcmFnbWVudFV0aWwuZ2V0QnlJZChydWxlQ29udGV4dCwgdGFyZ2V0KSAhPSBudWxsKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0c1t0YXJnZXRdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYW5jaG9yc1tpZHhdLmhhc0F0dHJpYnV0ZShcIm5hbWVcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQXNzdW1lIGZvcndhcmQganVtcGluZyB0YXJnZXRzXG4gICAgICAgICAgICAgICAgICAgIGxldCBuYW1lID0gYW5jaG9yc1tpZHhdLmdldEF0dHJpYnV0ZShcIm5hbWVcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lLmluZGV4T2YoXCIjXCIpICE9IC0xKVxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IENvbW1vblV0aWwuZ2V0RmlsZUFuY2hvcihuYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gbmFtZSBpbiB0YXJnZXRzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5pbXBvcnQgeyBET01NYXBwZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTU1hcHBlclwiO1xuXG5leHBvcnQgY29uc3QgaWZyYW1lX2ludGVyYWN0aXZlX3RhYmJhYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcImlmcmFtZV9pbnRlcmFjdGl2ZV90YWJiYWJsZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmlmcmFtZVwiLFxuICAgIGRlcGVuZGVuY2llczogW10sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpZnJhbWVfaW50ZXJhY3RpdmVfdGFiYmFibGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJwYXNzXCI6IFwiaWZyYW1lX2ludGVyYWN0aXZlX3RhYmJhYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9pbnZhbGlkXCI6IFwiaWZyYW1lX2ludGVyYWN0aXZlX3RhYmJhYmxlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJJZnJhbWUgd2l0aCBpbnRlcmFjdGl2ZSBjb250ZW50IHNob3VsZCBub3QgYmUgZXhjbHVkZWQgZnJvbSB0YWIgb3JkZXIgdXNpbmcgdGFiaW5kZXhcIixcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlRoZSBpZnJhbWUgd2l0aCBpbnRlcmFjdGl2ZSBjb250ZW50IGlzIG5vdCBleGNsdWRlZCBmcm9tIHRoZSB0YWIgb3JkZXIgdXNpbmcgdGFiaW5kZXhcIixcbiAgICAgICAgICAgIFwiZmFpbF9pbnZhbGlkXCI6IFwiVGhlIDxpZnJhbWU+IHdpdGggaW50ZXJhY3RpdmUgY29udGVudCBpcyBleGNsdWRlZCBmcm9tIHRhYiBvcmRlciB1c2luZyB0YWJpbmRleFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBpZDogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBudW06IFtcIjIuMS4xXCJdLFxuICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXCJha243Ym5cIl0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIG9yIGRpc2FibGVkXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkgfHwgQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIFxuICAgICAgICBjb25zdCBtYXBwZXIgOiBET01NYXBwZXIgPSBuZXcgRE9NTWFwcGVyKCk7XG4gICAgICAgIGNvbnN0IGJvdW5kcyA9IG1hcHBlci5nZXRVbmFkanVzdGVkQm91bmRzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgLy9pbiBjYXNlIHRoZSBib3VuZHMgbm90IGF2YWlsYWJsZVxuICAgICAgICBpZiAoIWJvdW5kcykgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICAvLyBpZ25vcmUgaWYgaWZyYW1lIGlzIHRvbyBzbWFsbCB0byBiZSB2aXNpYmxlIG9uIHNjcmVlblxuICAgICAgICBpZiAoTWF0aC5tYXgoYm91bmRzWydoZWlnaHQnXSwgYm91bmRzWyd3aWR0aCddKSA8IDMwIHx8IE1hdGgubWluKGJvdW5kc1snaGVpZ2h0J10sIGJvdW5kc1snd2lkdGgnXSkgPCAxNSkgIFxuICAgICAgICAgICByZXR1cm4gbnVsbDsgXG5cbiAgICAgICAgLy8gcGFzcyBpZnJhbWUgZWxlbWVudCBkb2VzIG5vdCBoYXZlIGEgdGFiaW5kZXggYXR0cmlidXRlIHZhbHVlIHRoYXQgaXMgYSBuZWdhdGl2ZSBudW1iZXJcbiAgICAgICAgaWYgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSB8fCBwYXJzZUludChydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSkgPj0gMClcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG5cbiAgICAgICAgLy8gY2hlY2sgaWZyYW1lIGNvbnRlbnRcbiAgICAgICAgY29uc3QgaWZyYW1FbGVtID0gcnVsZUNvbnRleHQgYXMgSFRNTElGcmFtZUVsZW1lbnQ7XG4gICAgICAgIGlmICghaWZyYW1FbGVtIHx8ICFpZnJhbUVsZW0uY29udGVudERvY3VtZW50IHx8ICFpZnJhbUVsZW0uY29udGVudERvY3VtZW50LmRvY3VtZW50RWxlbWVudClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IGNvdW50ID0gQ29tbW9uVXRpbC5nZXRUYWJiYWJsZUNoaWxkcmVuKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKGNvdW50ID4gMClcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfaW52YWxpZFwiKTtcblxuICAgICAgICByZXR1cm4gbnVsbDsgICAgXG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgaW1hZ2VidXR0b25fYWx0X2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJpbWFnZWJ1dHRvbl9hbHRfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJkb206aW5wdXRcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9JbnB1dF9FeHBsaWNpdExhYmVsSW1hZ2VcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUGFzc18xXCI6IFwiUGFzc18xXCIsXG4gICAgICAgICAgICBcIlBhc3NfMlwiOiBcIlBhc3NfMlwiLFxuICAgICAgICAgICAgXCJGYWlsXCI6IFwiRmFpbFwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiaW1hZ2VidXR0b25fYWx0X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NfMVwiOiBcImltYWdlYnV0dG9uX2FsdF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJQYXNzXzJcIjogXCJpbWFnZWJ1dHRvbl9hbHRfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbFwiOiBcImltYWdlYnV0dG9uX2FsdF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImltYWdlYnV0dG9uX2FsdF9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJJbWFnZSBidXR0b24gcHJvdmlkZXMgYWx0ZXJuYXRpdmUgdGV4dCB1c2luZyB0aGUgJ2FsdCcgYXR0cmlidXRlXCIsXG4gICAgICAgICAgICBcIlBhc3NfMVwiOiBcIkltYWdlIGJ1dHRvbiBwcm92aWRlcyBhbHRlcm5hdGl2ZSB0ZXh0IHVzaW5nIGFuIEFSSUEgbGFiZWxcIixcbiAgICAgICAgICAgIFwiUGFzc18yXCI6IFwiSW1hZ2UgYnV0dG9uIHByb3ZpZGVzIGFsdGVybmF0aXZlIHRleHQgdXNpbmcgdGhlICd0aXRsZScgYXR0cmlidXRlXCIsXG4gICAgICAgICAgICBcIkZhaWxcIjogXCJUaGUgPGlucHV0PiBlbGVtZW50IG9mIHR5cGUgXFxcImltYWdlXFxcIiBoYXMgbm8gdGV4dCBhbHRlcm5hdGl2ZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSA8aW5wdXQ+IGVsZW1lbnQgb2YgdHlwZSBcXFwiaW1hZ2VcXFwiIHNob3VsZCBoYXZlIGEgdGV4dCBhbHRlcm5hdGl2ZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogXCI1OTc5NmZcIixcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICAvLyBTZWUgaHR0cHM6Ly93d3cudzMub3JnL1dBSS9XQ0FHMjIvVGVjaG5pcXVlcy9mYWlsdXJlcy9GNjVcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgaWYgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0eXBlXCIpIHx8IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInR5cGVcIikudG9Mb3dlckNhc2UoKSAhPSBcImltYWdlXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcImFsdFwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9IGVsc2UgaWYgKEFyaWFVdGlsLmhhc0FyaWFMYWJlbChydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMVwiKTtcbiAgICAgICAgfSBlbHNlIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0aXRsZVwiKSAmJiBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0aXRsZVwiKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzJcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbFwiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGltYWdlbWFwX2FsdF9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaW1hZ2VtYXBfYWx0X2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmltZ1t1c2VtYXBdLCBkb206aW1nW2lzbWFwXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiSEFBQ19JbWdfVXNlbWFwQWx0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiaW1hZ2VtYXBfYWx0X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImltYWdlbWFwX2FsdF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImltYWdlbWFwX2FsdF9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJJbWFnZSBtYXAgb3IgY2hpbGQgPGFyZWE+IGhhcyBubyB0ZXh0IGFsdGVybmF0aXZlXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQW4gaW1hZ2UgbWFwIGFuZCBlYWNoIDxhcmVhPiBlbGVtZW50IGluIGFuIGltYWdlIG1hcCBtdXN0IGhhdmUgdGV4dCBhbHRlcm5hdGl2ZShzKVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgcGFzc2VkID0gQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJhbHRcIikgfHxcbiAgICAgICAgICAgICghcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiaXNtYXBcIikgJiYgIUNvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwidXNlbWFwXCIpKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgaW1nX2FsdF9iYWNrZ3JvdW5kOiBSdWxlID0ge1xuICAgIGlkOiBcImltZ19hbHRfYmFja2dyb3VuZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIkhBQUNfQmFja2dyb3VuZEltZ19IYXNUZXh0T3JUaXRsZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIk1hbnVhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJpbWdfYWx0X2JhY2tncm91bmQuaHRtbFwiLFxuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcImltZ19hbHRfYmFja2dyb3VuZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiaW1nX2FsdF9iYWNrZ3JvdW5kLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJWZXJpZnkgaW1wb3J0YW50IGJhY2tncm91bmQgaW1hZ2UgaW5mb3JtYXRpb24gaGFzIGEgdGV4dCBhbHRlcm5hdGl2ZSBpbiBzeXN0ZW0gaGlnaCBjb250cmFzdCBtb2RlXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQmFja2dyb3VuZCBpbWFnZXMgdGhhdCBjb252ZXkgaW1wb3J0YW50IGluZm9ybWF0aW9uIG11c3QgaGF2ZSBhIHRleHQgYWx0ZXJuYXRpdmUgdGhhdCBkZXNjcmliZXMgdGhlIGltYWdlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IGRvYyA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQ7XG4gICAgICAgIGxldCBzdHlsZSA9IGRvYy5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKHN0eWxlID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYmFja2dyb3VuZEltZ3MgPSBzdHlsZS5iYWNrZ3JvdW5kSW1hZ2U7XG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuXG4gICAgICAgIGlmIChiYWNrZ3JvdW5kSW1ncyAhPSBudWxsICYmIGJhY2tncm91bmRJbWdzICE9IFwiXCIgJiYgYmFja2dyb3VuZEltZ3MgIT0gJ25vbmUnICYmIGJhY2tncm91bmRJbWdzICE9ICdpbmhlcml0Jykge1xuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0LmlubmVySFRNTCAhPSBudWxsICYmIHJ1bGVDb250ZXh0LmlubmVySFRNTC50cmltKCkubGVuZ3RoICE9IDApIHtcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHRpdGxlID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKCd0aXRsZScpO1xuICAgICAgICAgICAgICAgIGlmICh0aXRsZSAhPSBudWxsICYmIHRpdGxlLmxlbmd0aCAhPSAwKVxuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZU1hbnVhbChcIk1hbnVhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGltZ19hbHRfZGVjb3JhdGl2ZTogUnVsZSA9IHtcbiAgICBpZDogXCJpbWdfYWx0X2RlY29yYXRpdmVcIixcbiAgICBjb250ZXh0OiBcImRvbTppbWdbYWx0XVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0ltZ19QcmVzZW50YXRpb25JbWdIYXNOb25OdWxsQWx0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiaW1nX2FsdF9kZWNvcmF0aXZlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiaW1nX2FsdF9kZWNvcmF0aXZlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpbWdfYWx0X2RlY29yYXRpdmUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJJbWFnZSBkZXNpZ25hdGVkIGFzIGRlY29yYXRpdmUgaGFzIG5vbi1udWxsICdhbHQnIGF0dHJpYnV0ZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkltYWdlIGRlc2lnbmF0ZWQgYXMgZGVjb3JhdGl2ZSBtdXN0IGhhdmUgJ2FsdD1cXFwiXFxcIlwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgaWYgKEFyaWFVdGlsLmhhc1JvbGUocnVsZUNvbnRleHQsIFwicHJlc2VudGF0aW9uXCIpIHx8IEFyaWFVdGlsLmhhc1JvbGUocnVsZUNvbnRleHQsIFwibm9uZVwiKSkge1xuICAgICAgICAgICAgcGFzc2VkID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYWx0XCIpLmxlbmd0aCA9PSAwO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBpbWdfYWx0X21pc3VzZTogUnVsZSA9IHtcbiAgICBpZDogXCJpbWdfYWx0X21pc3VzZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmltZywgZG9tOmFyZWEsIGRvbTppbnB1dFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX0ltZ19BbHRDb21tb25NaXN1c2VcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiaW1nX2FsdF9taXN1c2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcImltZ19hbHRfbWlzdXNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpbWdfYWx0X21pc3VzZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVmVyaWZ5IHRoYXQgdGhlIGZpbGUgbmFtZSBzZXJ2ZXMgYXMgYSBnb29kIGlubGluZSByZXBsYWNlbWVudCBmb3IgdGhlIGltYWdlXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiJ2FsdCcgYXR0cmlidXRlIHZhbHVlIG11c3QgYmUgYSBnb29kIGlubGluZSByZXBsYWNlbWVudCBmb3IgdGhlIGltYWdlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCB2YWxpZGF0ZVBhcmFtcyA9IHtcbiAgICAgICAgICAgIGJhZFRleHQ6IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogW1wic2hvcnQgZGVzY3JpcHRpb25cIl0sXG4gICAgICAgICAgICAgICAgdHlwZTogXCJbc3RyaW5nXVwiXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgLy8gQWx0IHRleHQgY2hlY2sgYXJlIGVsc2V3aGVyZSAoU2VlIDQxLCAyNDAsIDQ1NSlcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImFsdFwiKSkge1xuICAgICAgICAgICAgbGV0IGFsdFRleHQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhbHRcIikudHJpbSgpO1xuICAgICAgICAgICAgaWYgKGFsdFRleHQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCBiYWRUZXh0ID0gdmFsaWRhdGVQYXJhbXMuYmFkVGV4dC52YWx1ZTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgcGFzc2VkICYmIGkgPCBiYWRUZXh0Lmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGFsdFRleHQuaW5kZXhPZihiYWRUZXh0W2ldKSA9PSAtMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHBhc3NlZCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgc3JjID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKChub2RlTmFtZSA9PSBcImFyZWFcIikgPyBcImhyZWZcIiA6IFwic3JjXCIpO1xuICAgICAgICAgICAgICAgICAgICAvLyBBbGxvdyBpdCB0byBwYXNzIGlmIHRoZXJlJ3Mgbm8gc3JjIC0gY2FuJ3QgZGV0ZXJtaW5lIHRoZXNlLlxuICAgICAgICAgICAgICAgICAgICBpZiAoc3JjICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZhaWwgaWYgdGhlIGFsdCBtYXRjaGVzIHRoZSBzcmMgZXhhY3RseVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWxzbyBmYWlsIGlmIHRoZSBhbHQgaGFzIGEgLiBpbiBpdCBhbmQgZWl0aGVyIHRoZSBzcmMgaXMgaW4gdGhlIGFsdCBvciB0aGUgYWx0IGlzIGluIHRoZSBzcmNcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IHNyYy50cmltKCkgIT0gYWx0VGV4dCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbHRUZXh0LmluZGV4T2YoXCIuXCIpID09IC0xIHx8IChhbHRUZXh0LmluZGV4T2Yoc3JjKSA9PSAtMSAmJiBzcmMuaW5kZXhPZihhbHRUZXh0KSA9PSAtMSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlUG90ZW50aWFsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGltZ19hbHRfbnVsbDogUnVsZSA9IHtcbiAgICBpZDogXCJpbWdfYWx0X251bGxcIixcbiAgICBjb250ZXh0OiBcImRvbTppbWdbYWx0XVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0ltZ19UaXRsZUVtcHR5V2hlbkFsdE51bGxcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImZhaWxfZGVjb3JhdGl2ZVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImltZ19hbHRfbnVsbC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfZGVjb3JhdGl2ZVwiOiBcImltZ19hbHRfbnVsbC5odG1sXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9hcmlhX292ZXJyaWRlXCI6IFwiaW1nX2FsdF9udWxsLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpbWdfYWx0X251bGwuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiTmVpdGhlciAnYXJpYScgbm9yICd0aXRsZScgYXR0cmlidXRlcyBhcmUgdXNlZCBmb3IgdGhlIGRlY29yYXRpdmUgaW1hZ2VcIixcbiAgICAgICAgICAgIFwiZmFpbF9kZWNvcmF0aXZlXCI6IFwiVGhlIGltYWdlICdhbHQnIGF0dHJpYnV0ZSBpcyBlbXB0eSwgYnV0IHRoZSAndGl0bGUnIGF0dHJpYnV0ZSBpcyBub3QgZW1wdHlcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX2FyaWFfb3ZlcnJpZGVcIjogXCJUaGUgaW1hZ2UgJ2FsdCcgYXR0cmlidXRlIGlzIGVtcHR5LCBidXQgdGhlICdhcmlhJyBsYWJlbCBpcyBub3QgZW1wdHkgYW5kIG92ZXJyaWRlcyB0aGUgJ2FsdCcgYXR0cmlidXRlXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiV2hlbiB0aGUgaW50ZW50IGlzIHRvIG1hcmsgYW4gaW1hZ2UgYXMgZGVjb3JhdGl2ZSB3aXRoIGFuIGVtcHR5ICdhbHQnIGF0dHJpYnV0ZSwgdGhlICdhcmlhJyBvciAndGl0bGUnIGF0dHJpYnV0ZXMgc2hvdWxkIG5vdCBiZSB1c2VkXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FLFxuICAgICAgICByZWFzb25Db2RlczogW1wiZmFpbF9kZWNvcmF0aXZlXCJdXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCJBUklBXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkUsXG4gICAgICAgIHJlYXNvbkNvZGVzOiBbXCJwb3RlbnRpYWxfYXJpYV9vdmVycmlkZVwiXVxuICAgIH1cbiAgICBdLFxuICAgIGFjdDogW3tcIjQ2Y2E3ZlwiOiB7XCJwb3RlbnRpYWxfYXJpYV9vdmVycmlkZVwiOiBcImZhaWxcIn19XSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmIChydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhbHRcIikudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdlIGhhdmUgYSB0aXRsZSwgYnV0IGFsdCBpcyBlbXB0eVxuICAgICAgICBpZiAoQXJpYVV0aWwuZ2V0QXJpYUxhYmVsKHJ1bGVDb250ZXh0KS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF9hcmlhX292ZXJyaWRlXCIpO1xuICAgICAgICB9IGVsc2UgaWYgKENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwidGl0bGVcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfZGVjb3JhdGl2ZVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGltZ19hbHRfcmVkdW5kYW50OiBSdWxlID0ge1xuICAgIGlkOiBcImltZ19hbHRfcmVkdW5kYW50XCIsXG4gICAgY29udGV4dDogXCJkb206aW1nW2FsdF1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9JbWdfTGlua1RleHROb3RSZWR1bmRhbnRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkZhaWxfMlwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJGYWlsXzNcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImltZ19hbHRfcmVkdW5kYW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiaW1nX2FsdF9yZWR1bmRhbnQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJpbWdfYWx0X3JlZHVuZGFudC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcImltZ19hbHRfcmVkdW5kYW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpbWdfYWx0X3JlZHVuZGFudC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkxpbmsgdGV4dCBpcyByZXBlYXRlZCBpbiBhbiBpbWFnZSAnYWx0JyB2YWx1ZSB3aXRoaW4gdGhlIHNhbWUgbGlua1wiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJMaW5rIHRleHQgb2YgcHJldmlvdXMgbGluayBpcyByZXBlYXRlZCBpbiBpbWFnZSAnYWx0JyB2YWx1ZSBvZiBhIGxpbmtcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiSW1hZ2UgJ2FsdCcgdmFsdWUgd2l0aGluIGEgbGluayBpcyByZXBlYXRlZCBpbiBsaW5rIHRleHQgb2YgdGhlIGxpbmsgYWZ0ZXJcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgdGV4dCBhbHRlcm5hdGl2ZSBmb3IgYW4gaW1hZ2Ugd2l0aGluIGEgbGluayBzaG91bGQgbm90IHJlcGVhdCB0aGUgbGluayB0ZXh0IG9yIGFkamFjZW50IGxpbmsgdGV4dFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4xLjFcIiwgXCIyLjQuNFwiXSwgLy9tYXRjaCBoZWxwIHJlZmVyZW5jZXNcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgYU5vZGUgPSBDb21tb25VdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBcImFcIik7XG4gICAgICAgIC8vSWYgbm90IGluIGFuIGFuY2hvciwgT3V0IG9mIFNjb3BlXG4gICAgICAgIGlmIChhTm9kZSA9PSBudWxsKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgYWx0VGV4dCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFsdFwiKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKGFsdFRleHQubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIC8vIElmIGFsdCB0ZXh0IGlzIGVtcHR5LCB0aGVyZSdzIG5vIHRleHQgdG8gYmUgcmVkdW5kYW50IC0gbGV0IGFfdGV4dF9wdXJwb3NlXG4gICAgICAgICAgICAvLyB0cmlnZ2VyIGluIHRoYXQgY2FzZS5cbiAgICAgICAgICAgIC8vIFNvIE91dCBvZiBTY29wZSBmb3IgdGhpcyBydWxlXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgaW5uZXJUZXh0ID0gYU5vZGUuaW5uZXJUZXh0O1xuICAgICAgICBsZXQgbGlua1RleHQgPSBcIlwiO1xuXG4gICAgICAgIGlmIChpbm5lclRleHQgIT0gbnVsbCkge1xuICAgICAgICAgICAgbGlua1RleHQgPSBpbm5lclRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxpbmtUZXh0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGlmIChhbHRUZXh0ID09IGxpbmtUZXh0KSB7XG4gICAgICAgICAgICAgICAgLy8gVGV4dCBpbiBsaW5rXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgICAgICAvL2FsdCBpcyBub24temVybywgYnV0IG5vIGxpbmsgdGV4dCAtIGVuc3VyZSBhZGphY2VudCBsaW5rIHRleHQgaXNuJ3QgcmVkdW5kYW50XG4gICAgICAgICAgICBsZXQgd2FsayA9IG5ldyBET01XYWxrZXIoYU5vZGUpO1xuICAgICAgICAgICAgd2hpbGUgKHBhc3NlZCAmJiB3YWxrLnByZXZOb2RlKCkpIHtcbiAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIG5vZGUgYW5kIG5vZGVOYW1lXG4gICAgICAgICAgICAgICAgbGV0IG5vZGUgPSB3YWxrLm5vZGU7XG4gICAgICAgICAgICAgICAgbGV0IG5vZGVOYW1lID0gbm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIGlmICgobm9kZU5hbWUgPT0gXCIjdGV4dFwiICYmIG5vZGUubm9kZVZhbHVlLmxlbmd0aCA+IDApIHx8XG4gICAgICAgICAgICAgICAgICAgIChub2RlTmFtZSA9PSBcImltZ1wiICYmIENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkobm9kZSwgXCJhbHRcIikpKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBDb21wbHkgd2l0aCB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgU2V0dGluZyBpZiB0aGUgYSBlbGVtZW50IHNob3VsZCBiZSBjaGVja2VkIG9yIG5vdFxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5vZGVOYW1lID09PSBcImFcIiAmJiAhQ29tbW9uVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRleHQgYmVmb3JlIGltYWdlIGxpbmtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gKChub2RlIGFzIEhUTUxFbGVtZW50KS5pbm5lclRleHQgfHwgbm9kZS50ZXh0Q29udGVudCB8fCBcIlwiKS50cmltKCkudG9Mb3dlckNhc2UoKSAhPSBhbHRUZXh0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8yXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2FsayA9IG5ldyBET01XYWxrZXIoYU5vZGUsIHRydWUpO1xuICAgICAgICAgICAgd2hpbGUgKHBhc3NlZCAmJiB3YWxrLm5leHROb2RlKCkpIHtcbiAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIG5vZGUgYW5kIG5vZGVOYW1lXG4gICAgICAgICAgICAgICAgbGV0IG5vZGUgPSB3YWxrLm5vZGU7XG4gICAgICAgICAgICAgICAgbGV0IG5vZGVOYW1lID0gbm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgICAgICAgICAgaWYgKChub2RlTmFtZSA9PSBcIiN0ZXh0XCIgJiYgbm9kZS5ub2RlVmFsdWUubGVuZ3RoID4gMCkgfHxcbiAgICAgICAgICAgICAgICAgICAgKG5vZGVOYW1lID09IFwiaW1nXCIgJiYgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShub2RlLCBcImFsdFwiKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIENvbXBseSB3aXRoIHRoZSBDaGVjayBIaWRkZW4gQ29udGVudCBTZXR0aW5nIGlmIHRoZSBhIGVsZW1lbnQgc2hvdWxkIGJlIGNoZWNrZWQgb3Igbm90XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAobm9kZU5hbWUgPT0gXCJhXCIgJiYgIUNvbW1vblV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbihub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSAobm9kZSBhcyBIVE1MRWxlbWVudCkuaW5uZXJUZXh0LnRyaW0oKS50b0xvd2VyQ2FzZSgpICE9IGFsdFRleHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBUZXh0IGFmdGVyIGltYWdlIGxpbmtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzNcIik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5pbXBvcnQgeyBBY2NOYW1lVXRpbCB9IGZyb20gXCIuLi91dGlsL0FjY05hbWVVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBpbWdfYWx0X3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcImltZ19hbHRfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbTppbWdcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9JbWdfSGFzQWx0XCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiZmFpbF9ibGFua19hbHRcIjogXCJmYWlsX2JsYW5rX2FsdFwiLFxuICAgICAgICAgICAgXCJmYWlsX25vX2FsdFwiOiBcImZhaWxfbm9fYWx0XCIsXG4gICAgICAgICAgICBcImZhaWxfYmxhbmtfdGl0bGVcIjogXCJmYWlsX2JsYW5rX3RpdGxlXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiaW1nX2FsdF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfYmxhbmtfYWx0XCI6IFwiaW1nX2FsdF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfbm9fYWx0XCI6IFwiaW1nX2FsdF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfYmxhbmtfdGl0bGVcIjogXCJpbWdfYWx0X3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpbWdfYWx0X3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlRoZSBpbWFnZSBoYXMgYW4gYWNjZXNzaWJsZSBuYW1lIG9yIGlzIGNvcnJlY3RseSBtYXJrZWQgYXMgZGVjb3JhdGl2ZSBvciByZWR1bmRhbnRcIixcbiAgICAgICAgICAgIFwiZmFpbF9ibGFua19hbHRcIjogXCJJbWFnZSAnYWx0JyBhdHRyaWJ1dGUgdmFsdWUgY29uc2lzdHMgb25seSBvZiBibGFuayBzcGFjZShzKVwiLFxuICAgICAgICAgICAgXCJmYWlsX25vX2FsdFwiOiBcIlRoZSBpbWFnZSBoYXMgbmVpdGhlciBhbiBhY2Nlc3NpYmxlIG5hbWUgbm9yIGlzIG1hcmtlZCBhcyBkZWNvcmF0aXZlIG9yIHJlZHVuZGFudFwiLFxuICAgICAgICAgICAgXCJmYWlsX2JsYW5rX3RpdGxlXCI6IFwiVGhlIGltYWdlIGRvZXMgbm90IGhhdmUgYW4gJ2FsdCcgYXR0cmlidXRlIG9yIEFSSUEgbGFiZWwsIGFuZCB0aGUgJ3RpdGxlJyBhdHRyaWJ1dGUgdmFsdWUgY29uc2lzdHMgb25seSBvZiBibGFuayBzcGFjZShzKVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkltYWdlcyBtdXN0IGhhdmUgYWNjZXNzaWJsZSBuYW1lcyB1bmxlc3MgdGhleSBhcmUgZGVjb3JhdGl2ZSBvciByZWR1bmRhbnRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFwiMjNhMmE4XCIsXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy8gSWYgbm90IHZpc2libGUgdG8gdGhlIHNjcmVlbiByZWFkZXIsIG9yIGNhbiBiZSBpZ25vcmVkXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkgfHwgQWNjTmFtZVV0aWwuaXNBY2Nlc3NpYmxlTmFtZUlnbm9yYWJsZShydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIGlmIChBcmlhVXRpbC5nZXRBcmlhTGFiZWwocnVsZUNvbnRleHQpLnRyaW0oKS5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIC8vIHRoZSBpbWcgaGFzIG5vbi1lbXB0eSBhcmlhIGxhYmVsXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGFsdCA9IHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImFsdFwiKSA/IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFsdFwiKSA6IG51bGw7XG4gICAgICAgIFxuICAgICAgICAvLyBjaGVjayB0aXRsZSBhdHRyaWJ1dGVcbiAgICAgICAgaWYgKGFsdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gdGhlIGltZyBoYXMgbm8gYWx0IG9yIGF0dHJpYnV0ZSwgZXhhbWluZSB0aGUgdGl0bGUgYXR0cmlidXRlXG4gICAgICAgICAgICBsZXQgdGl0bGUgPSBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0aXRsZVwiKSA/IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInRpdGxlXCIpIDogbnVsbDtcbiAgICAgICAgICAgIGlmICh0aXRsZSA9PT0gbnVsbCB8fCB0aXRsZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAvLyBubyB0aXRsZSBvciB0aXRsZSBpcyBlbXB0eSwgZXhhbWluZSBhbHQgZnVydGhlclxuICAgICAgICAgICAgICAgIGlmIChhbHQgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJvbGUgPSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUocnVsZUNvbnRleHQsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJvbGUgPT09ICdwcmVzZW50YXRpb24nIHx8IHJvbGUgPT09ICdub25lJylcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX25vX2FsdFwiKTtcbiAgICAgICAgICAgICAgICB9ICAgIFxuICAgICAgICAgICAgICAgIGlmIChhbHQubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpOyBcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHRpdGxlLnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdGl0bGUgY29udGFpbnMgYmxhbmsgc3BhY2Ugb25seSAodGl0bGU9XCIgIFwiKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2JsYW5rX3RpdGxlXCIpOyBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gdGl0bGUgY29udGFpbnMgc29tZSB0ZXh0ICh0aXRsZT1cInNvbWUgdGV4dFwiKVxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoYWx0Lmxlbmd0aCA9PT0gMCB8fCBhbHQudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAvLyB0aGUgaW1nIGhhcyBlbXB0eSBhbHQgKGFsdD1cIlwiKSBvciBub24tZW1wdHkgYWx0IChhbHQ9XCJzb21lIHRleHRcIilcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpOyBcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gYWx0IGNvbnRhaW5zIGJsYW5rIHNwYWNlIG9ubHkgKGFsdD1cIiBcIilcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2JsYW5rX2FsdFwiKTsgXG4gICAgICAgICAgICB9ICAgIFxuICAgICAgICB9ICAgICAgICBcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgaW1nX2lzbWFwX21pc3VzZTogUnVsZSA9IHtcbiAgICBpZDogXCJpbWdfaXNtYXBfbWlzdXNlXCIsXG4gICAgY29udGV4dDogXCJkb206aW1nW2lzbWFwXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX0ltZ19Vc2VtYXBWYWxpZFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJpbWdfaXNtYXBfbWlzdXNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJpbWdfaXNtYXBfbWlzdXNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpbWdfaXNtYXBfbWlzdXNlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJTZXJ2ZXItc2lkZSBpbWFnZSBtYXAgaG90LXNwb3RzIGRvIG5vdCBoYXZlIGR1cGxpY2F0ZSB0ZXh0IGxpbmtzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiU2VydmVyLXNpZGUgaW1hZ2UgbWFwIGhvdC1zcG90cyBtdXN0IGhhdmUgZHVwbGljYXRlIHRleHQgbGlua3NcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidXNlbWFwXCIpKSB7XG4gICAgICAgICAgICBsZXQgdXNlbWFwID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidXNlbWFwXCIpO1xuICAgICAgICAgICAgdXNlbWFwID0gdXNlbWFwLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgbGV0IGlkeCA9IHVzZW1hcC5pbmRleE9mKFwiI1wiKTtcbiAgICAgICAgICAgIGlmIChpZHggIT0gLTEpXG4gICAgICAgICAgICAgICAgdXNlbWFwID0gdXNlbWFwLnN1YnN0cihpZHggKyAxKTtcblxuICAgICAgICAgICAgaWYgKHVzZW1hcC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IG1hcHMgPSBDb21tb25VdGlsLmdldERvY0VsZW1lbnRzQnlUYWcocnVsZUNvbnRleHQsIFwibWFwXCIpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyAhcGFzc2VkICYmIGkgPCBtYXBzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IG1hcHNbaV0uaGFzQXR0cmlidXRlKFwibmFtZVwiKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgbWFwc1tpXS5nZXRBdHRyaWJ1dGUoXCJuYW1lXCIpLnRvTG93ZXJDYXNlKCkgPT0gdXNlbWFwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGltZ19sb25nZGVzY19taXN1c2U6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaW1nX2xvbmdkZXNjX21pc3VzZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmltZ1tsb25nZGVzY11cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9JbWdfTG9uZ0Rlc2NyaXB0aW9uMlwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJpbWdfbG9uZ2Rlc2NfbWlzdXNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJpbWdfbG9uZ2Rlc2NfbWlzdXNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpbWdfbG9uZ2Rlc2NfbWlzdXNlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgdGhhdCB0aGUgZmlsZSBkZXNpZ25hdGVkIGJ5IHRoZSAnbG9uZ2Rlc2MnIGF0dHJpYnV0ZSBjb250YWlucyB2YWxpZCBIVE1MIGNvbnRlbnQgKGZpbGUgZXh0ZW5zaW9uIG5vdCByZWNvZ25pemVkKVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIiBUaGUgJ2xvbmdkZXNjJyBhdHRyaWJ1dGUgbXVzdCByZWZlcmVuY2UgSFRNTCBjb250ZW50XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBsb25nZGVzYyA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImxvbmdkZXNjXCIpO1xuICAgICAgICAvLyBpZiAobG9uZ2Rlc2MgaXMgYmFkIFVSTCkgcGFzc2VkID0gZmFsc2U7XG5cbiAgICAgICAgbGV0IGV4dCA9IENvbW1vblV0aWwuZ2V0RmlsZUV4dChsb25nZGVzYyk7XG4gICAgICAgIGxldCBwYXNzZWQgPSBleHQubGVuZ3RoICE9IDAgJiYgQ29tbW9uVXRpbC5pc0h0bWxFeHQoZXh0KVxuICAgICAgICAgICAgfHwgbG9uZ2Rlc2Muc3RhcnRzV2l0aChcIiNcIilcbiAgICAgICAgICAgIHx8IGxvbmdkZXNjLnN0YXJ0c1dpdGgoXCJodHRwOi8vXCIpXG4gICAgICAgICAgICB8fCBsb25nZGVzYy5zdGFydHNXaXRoKFwiaHR0cHM6Ly9cIilcbiAgICAgICAgICAgIHx8IGxvbmdkZXNjLnN0YXJ0c1dpdGgoXCJkYXRhOlwiKTtcblxuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4vLyBUaGlzIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgXCJucG0gcnVuIHByZWJ1aWxkXCIuIERvIG5vdCBlZGl0XG5cbmV4cG9ydCAqIGZyb20gXCIuL2FfdGFyZ2V0X3dhcm5pbmdcIlxuZXhwb3J0ICogZnJvbSBcIi4vYV90ZXh0X3B1cnBvc2VcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXBwbGV0X2FsdF9leGlzdHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXBwbGljYXRpb25fY29udGVudF9hY2Nlc3NpYmxlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyZWFfYWx0X2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2FjY2Vzc2libGVuYW1lX2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdGFiaW5kZXhfdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9hY3RpdmVkZXNjZW5kYW50X3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfYXBwbGljYXRpb25fbGFiZWxfdW5pcXVlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfYXBwbGljYXRpb25fbGFiZWxsZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9hcnRpY2xlX2xhYmVsX3VuaXF1ZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2F0dHJpYnV0ZV9hbGxvd2VkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfYXR0cmlidXRlX2NvbmZsaWN0XCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfYXR0cmlidXRlX2RlcHJlY2F0ZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9hdHRyaWJ1dGVfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfYXR0cmlidXRlX3JlZHVuZGFudFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2F0dHJpYnV0ZV9yZXF1aXJlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2F0dHJpYnV0ZV92YWx1ZV92YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2Jhbm5lcl9sYWJlbF91bmlxdWVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9iYW5uZXJfc2luZ2xlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfY2hpbGRfdGFiYmFibGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9jaGlsZF92YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxfdW5pcXVlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfY29tcGxlbWVudGFyeV9sYWJlbF92aXNpYmxlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfY29tcGxlbWVudGFyeV9sYWJlbGxlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2NvbnRlbnRfaW5fbGFuZG1hcmtcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9jb250ZW50aW5mb19sYWJlbF91bmlxdWVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9jb250ZW50aW5mb19taXN1c2VcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9jb250ZW50aW5mb19zaW5nbGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9kZXNjZW5kYW50X3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfZG9jdW1lbnRfbGFiZWxfdW5pcXVlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfZXZlbnRoYW5kbGVyX3JvbGVfdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9mb3JtX2xhYmVsX3VuaXF1ZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2dyYXBoaWNfbGFiZWxsZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9oaWRkZW5fbm9udGFiYmFibGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9pZF91bmlxdWVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9pbWdfbGFiZWxsZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9rZXlib2FyZF9oYW5kbGVyX2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2xhbmRtYXJrX25hbWVfdW5pcXVlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfbWFpbl9sYWJlbF91bmlxdWVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9tYWluX2xhYmVsX3Zpc2libGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9uYXZpZ2F0aW9uX2xhYmVsX3VuaXF1ZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX3BhcmVudF9yZXF1aXJlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX3JlZ2lvbl9sYWJlbF91bmlxdWVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9yZWdpb25fbGFiZWxsZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9yb2xlX2FsbG93ZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9yb2xlX3JlZHVuZGFudFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX3NlYXJjaF9sYWJlbF91bmlxdWVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9zZW1hbnRpY3NcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV90b29sYmFyX2xhYmVsX3VuaXF1ZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX3dpZGdldF9sYWJlbGxlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hc2NpaWFydF9hbHRfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2JsaW5rX2Nzc19yZXZpZXdcIlxuZXhwb3J0ICogZnJvbSBcIi4vYmxpbmtfZWxlbV9kZXByZWNhdGVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2Jsb2NrcXVvdGVfY2l0ZV9leGlzdHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vY2FudmFzX2NvbnRlbnRfZGVzY3JpYmVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2NhcHRpb25fdHJhY2tfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2NvbWJvYm94X2FjdGl2ZV9kZXNjZW5kYW50XCJcbmV4cG9ydCAqIGZyb20gXCIuL2NvbWJvYm94X2F1dG9jb21wbGV0ZV92YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9jb21ib2JveF9kZXNpZ25fdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vY29tYm9ib3hfZm9jdXNhYmxlX2VsZW1lbnRzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2NvbWJvYm94X2hhc3BvcHVwX3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2NvbWJvYm94X3BvcHVwX3JlZmVyZW5jZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9kZWJ1Z19wYXRoc1wiXG5leHBvcnQgKiBmcm9tIFwiLi9kZXRlY3Rvcl90YWJiYWJsZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9kaXJfYXR0cmlidXRlX3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2Rvd25sb2FkX2tleWJvYXJkX2NvbnRyb2xsYWJsZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9kcmFnZ2FibGVfYWx0ZXJuYXRpdmVfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2VsZW1lbnRfYWNjZXNza2V5X2xhYmVsbGVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2VsZW1lbnRfYWNjZXNza2V5X3VuaXF1ZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9lbGVtZW50X2F0dHJpYnV0ZV9kZXByZWNhdGVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2VsZW1lbnRfaWRfdW5pcXVlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2VsZW1lbnRfbGFuZ192YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9lbGVtZW50X21vdXNlZXZlbnRfa2V5Ym9hcmRcIlxuZXhwb3J0ICogZnJvbSBcIi4vZWxlbWVudF9vcmllbnRhdGlvbl91bmxvY2tlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9lbGVtZW50X3Njcm9sbGFibGVfdGFiYmFibGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vZWxlbWVudF90YWJiYWJsZV9yb2xlX3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2VsZW1lbnRfdGFiYmFibGVfdW5vYnNjdXJlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9lbGVtZW50X3RhYmJhYmxlX3Zpc2libGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vZW1iZWRfYWx0X2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9lbW90aWNvbnNfYWx0X2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9lcnJvcl9tZXNzYWdlX2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9maWVsZHNldF9sYWJlbF92YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9maWVsZHNldF9sZWdlbmRfdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vZmlndXJlX2xhYmVsX2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9mb3JtX2ZvbnRfY29sb3JcIlxuZXhwb3J0ICogZnJvbSBcIi4vZm9ybV9pbnRlcmFjdGlvbl9yZXZpZXdcIlxuZXhwb3J0ICogZnJvbSBcIi4vZm9ybV9sYWJlbF91bmlxdWVcIlxuZXhwb3J0ICogZnJvbSBcIi4vZm9ybV9zdWJtaXRfYnV0dG9uX2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9mb3JtX3N1Ym1pdF9yZXZpZXdcIlxuZXhwb3J0ICogZnJvbSBcIi4vZnJhbWVfc3JjX3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2ZyYW1lX3RpdGxlX2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9oZWFkaW5nX2NvbnRlbnRfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2hlYWRpbmdfbWFya3VwX21pc3VzZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9odG1sX2xhbmdfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2h0bWxfc2tpcG5hdl9leGlzdHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vaWZyYW1lX2ludGVyYWN0aXZlX3RhYmJhYmxlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2ltYWdlYnV0dG9uX2FsdF9leGlzdHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vaW1hZ2VtYXBfYWx0X2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9pbWdfYWx0X2JhY2tncm91bmRcIlxuZXhwb3J0ICogZnJvbSBcIi4vaW1nX2FsdF9kZWNvcmF0aXZlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2ltZ19hbHRfbWlzdXNlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2ltZ19hbHRfbnVsbFwiXG5leHBvcnQgKiBmcm9tIFwiLi9pbWdfYWx0X3JlZHVuZGFudFwiXG5leHBvcnQgKiBmcm9tIFwiLi9pbWdfYWx0X3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2ltZ19pc21hcF9taXN1c2VcIlxuZXhwb3J0ICogZnJvbSBcIi4vaW1nX2xvbmdkZXNjX21pc3VzZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9pbnB1dF9hdXRvY29tcGxldGVfdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vaW5wdXRfY2hlY2tib3hlc19ncm91cGVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2lucHV0X2ZpZWxkc19ncm91cGVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2lucHV0X2hhc3BvcHVwX2NvbmZsaWN0XCJcbmV4cG9ydCAqIGZyb20gXCIuL2lucHV0X2xhYmVsX2FmdGVyXCJcbmV4cG9ydCAqIGZyb20gXCIuL2lucHV0X2xhYmVsX2JlZm9yZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9pbnB1dF9sYWJlbF9leGlzdHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vaW5wdXRfbGFiZWxfdmlzaWJsZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9pbnB1dF9vbmNoYW5nZV9yZXZpZXdcIlxuZXhwb3J0ICogZnJvbSBcIi4vaW5wdXRfcGxhY2Vob2xkZXJfbGFiZWxfdmlzaWJsZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9sYWJlbF9jb250ZW50X2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9sYWJlbF9uYW1lX3Zpc2libGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vbGFiZWxfcmVmX3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2xpc3RfY2hpbGRyZW5fdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vbGlzdF9tYXJrdXBfcmV2aWV3XCJcbmV4cG9ydCAqIGZyb20gXCIuL2xpc3Rfc3RydWN0dXJlX3Byb3BlclwiXG5leHBvcnQgKiBmcm9tIFwiLi9tYXJxdWVlX2VsZW1fYXZvaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vbWVkaWFfYWx0X2JyaWVmXCJcbmV4cG9ydCAqIGZyb20gXCIuL21lZGlhX2FsdF9leGlzdHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vbWVkaWFfYXVkaW9fdHJhbnNjcmliZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vbWVkaWFfYXV0b3N0YXJ0X2NvbnRyb2xsYWJsZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9tZWRpYV9rZXlib2FyZF9jb250cm9sbGFibGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vbWVkaWFfbGl2ZV9jYXB0aW9uZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vbWVkaWFfdHJhY2tfYXZhaWxhYmxlXCJcbmV4cG9ydCAqIGZyb20gXCIuL21ldGFfcmVkaXJlY3Rfb3B0aW9uYWxcIlxuZXhwb3J0ICogZnJvbSBcIi4vbWV0YV9yZWZyZXNoX2RlbGF5XCJcbmV4cG9ydCAqIGZyb20gXCIuL21ldGFfdmlld3BvcnRfem9vbWFibGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vbm9lbWJlZF9jb250ZW50X2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9vYmplY3RfdGV4dF9leGlzdHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vcGFnZV90aXRsZV9leGlzdHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vcGFnZV90aXRsZV92YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9zY3JpcHRfZm9jdXNfYmx1cl9yZXZpZXdcIlxuZXhwb3J0ICogZnJvbSBcIi4vc2NyaXB0X29uY2xpY2tfYXZvaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vc2NyaXB0X29uY2xpY2tfbWlzdXNlXCJcbmV4cG9ydCAqIGZyb20gXCIuL3NjcmlwdF9zZWxlY3RfcmV2aWV3XCJcbmV4cG9ydCAqIGZyb20gXCIuL3NlbGVjdF9vcHRpb25zX2dyb3VwZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vc2tpcF9tYWluX2Rlc2NyaWJlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9za2lwX21haW5fZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL3N0eWxlX2JhY2tncm91bmRfZGVjb3JhdGl2ZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9zdHlsZV9iZWZvcmVfYWZ0ZXJfcmV2aWV3XCJcbmV4cG9ydCAqIGZyb20gXCIuL3N0eWxlX2NvbG9yX21pc3VzZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9zdHlsZV9mb2N1c192aXNpYmxlXCJcbmV4cG9ydCAqIGZyb20gXCIuL3N0eWxlX2hpZ2hjb250cmFzdF92aXNpYmxlXCJcbmV4cG9ydCAqIGZyb20gXCIuL3N0eWxlX2hvdmVyX3BlcnNpc3RlbnRcIlxuZXhwb3J0ICogZnJvbSBcIi4vc3R5bGVfdmlld3BvcnRfcmVzaXphYmxlXCJcbmV4cG9ydCAqIGZyb20gXCIuL3N2Z19ncmFwaGljc19sYWJlbGxlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi90YWJsZV9hcmlhX2Rlc2NlbmRhbnRzXCJcbmV4cG9ydCAqIGZyb20gXCIuL3RhYmxlX2NhcHRpb25fZW1wdHlcIlxuZXhwb3J0ICogZnJvbSBcIi4vdGFibGVfY2FwdGlvbl9uZXN0ZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vdGFibGVfaGVhZGVyc19leGlzdHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vdGFibGVfaGVhZGVyc19yZWZfdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vdGFibGVfaGVhZGVyc19yZWxhdGVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL3RhYmxlX2xheW91dF9saW5lYXJpemVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL3RhYmxlX3Njb3BlX3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL3RhYmxlX3N0cnVjdHVyZV9taXN1c2VcIlxuZXhwb3J0ICogZnJvbSBcIi4vdGFibGVfc3VtbWFyeV9yZWR1bmRhbnRcIlxuZXhwb3J0ICogZnJvbSBcIi4vdGFyZ2V0X3NwYWNpbmdfc3VmZmljaWVudFwiXG5leHBvcnQgKiBmcm9tIFwiLi90ZXh0X2Jsb2NrX2hlYWRpbmdcIlxuZXhwb3J0ICogZnJvbSBcIi4vdGV4dF9jb250cmFzdF9zdWZmaWNpZW50XCJcbmV4cG9ydCAqIGZyb20gXCIuL3RleHRfcXVvdGVkX2NvcnJlY3RseVwiXG5leHBvcnQgKiBmcm9tIFwiLi90ZXh0X3NlbnNvcnlfbWlzdXNlXCJcbmV4cG9ydCAqIGZyb20gXCIuL3RleHRfc3BhY2luZ192YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi90ZXh0X3doaXRlc3BhY2VfdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vd2lkZ2V0X3RhYmJhYmxlX2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi93aWRnZXRfdGFiYmFibGVfc2luZ2xlXCIiLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgaW5wdXRfYXV0b2NvbXBsZXRlX3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcImlucHV0X2F1dG9jb21wbGV0ZV92YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmlucHV0W2F1dG9jb21wbGV0ZV0sIGRvbTp0ZXh0YXJlYVthdXRvY29tcGxldGVdLCBkb206c2VsZWN0W2F1dG9jb21wbGV0ZV1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMV9JbnB1dF9BdXRvY29tcGxldGVcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImZhaWxfaW5hcHByb3ByaWF0ZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJmYWlsX2ludmFsaWRcIixcbiAgICAgICAgICAgIFwiRmFpbF9hdHRyaWJ1dGVfaW5jb3JyZWN0XCI6IFwiZmFpbF9pbmNvcnJlY3RcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcImlucHV0X2F1dG9jb21wbGV0ZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcInBhc3NcIjogXCJpbnB1dF9hdXRvY29tcGxldGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2luYXBwcm9wcmlhdGVcIjogXCJpbnB1dF9hdXRvY29tcGxldGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2ludmFsaWRcIjogXCJpbnB1dF9hdXRvY29tcGxldGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2luY29ycmVjdFwiOiBcImlucHV0X2F1dG9jb21wbGV0ZV92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGhlICdhdXRvY29tcGxldGUnIGF0dHJpYnV0ZSdzIHRva2VuKHMpIG11c3QgYmUgYXBwcm9wcmlhdGUgZm9yIHRoZSBpbnB1dCBmb3JtIGZpZWxkXCIsXG4gICAgICAgICAgICBcInBhc3NcIjogXCJUaGUgJ2F1dG9jb21wbGV0ZScgYXR0cmlidXRlJ3MgdG9rZW4ocykgaXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBpbnB1dCBmb3JtIGZpZWxkXCIsXG4gICAgICAgICAgICBcImZhaWxfaW5hcHByb3ByaWF0ZVwiOiBcIlRoZSAnYXV0b2NvbXBsZXRlJyBhdHRyaWJ1dGUncyB0b2tlbihzKSBhcmUgbm90IGFwcHJvcHJpYXRlIGZvciB0aGUgaW5wdXQgZm9ybSBmaWVsZFwiLFxuICAgICAgICAgICAgXCJmYWlsX2ludmFsaWRcIjogXCJUaGUgJ2F1dG9jb21wbGV0ZScgYXR0cmlidXRlJ3MgdG9rZW4ocykgYXJlIG5vdCBhcHByb3ByaWF0ZSBmb3IgYW4gaW5wdXQgZm9ybSBmaWVsZCBvZiBhbnkgdHlwZVwiLFxuICAgICAgICAgICAgXCJmYWlsX2luY29ycmVjdFwiOiBcIlRoZSAnYXV0b2NvbXBsZXRlJyBhdHRyaWJ1dGUgaGFzIGFuIGluY29ycmVjdCB2YWx1ZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjVcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgXG4gICAgYWN0OiBbe1xuICAgICAgICBcIjczZjJjMlwiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcImZhaWxfaW5hcHByb3ByaWF0ZVwiOiBcImZhaWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9pbnZhbGlkXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJmYWlsX2luY29ycmVjdFwiOiBcImZhaWxcIlxuICAgICAgICB9XG4gICAgfV0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIG9yIGRpc2FibGVkXG4gICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKHJ1bGVDb250ZXh0KSB8fCBDb21tb25VdGlsLmlzTm9kZURpc2FibGVkKHJ1bGVDb250ZXh0KSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGxldCBhdXRvY29tcGxldGVBdHRyID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYXV0b2NvbXBsZXRlXCIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIGxldCB0b2tlbnMgPSBhdXRvY29tcGxldGVBdHRyLnNwbGl0KC9cXHMrLyk7XG4gICAgICAgIGlmICh0b2tlbnMubGVuZ3RoID09PSAwIHx8IGF1dG9jb21wbGV0ZUF0dHIubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNhY2hlID0ge1xuICAgICAgICAgICAgXCJ0b2tlbnNPbk9mZlwiOiBbXCJvblwiLCBcIm9mZlwiXSxcbiAgICAgICAgICAgIFwidG9rZW5PcHRpb25hbFNlY3Rpb25cIjogXCJzZWN0aW9uLVwiLFxuICAgICAgICAgICAgXCJ0b2tlbnNPcHRpb25hbFB1cnBvc2VcIjogW1wic2hpcHBpbmdcIiwgXCJiaWxsaW5nXCJdLFxuICAgICAgICAgICAgXCJ0b2tlbnNNYW5kYXRvcnlHcm91cDFfcGFzc3dvcmRcIjogW1wibmV3LXBhc3N3b3JkXCIsIFwiY3VycmVudC1wYXNzd29yZFwiLCBcIm9uZS10aW1lLWNvZGVcIl0sXG4gICAgICAgICAgICBcInRva2Vuc01hbmRhdG9yeUdyb3VwMV9tdWx0aWxpbmVcIjogW1wic3RyZWV0LWFkZHJlc3NcIl0sXG4gICAgICAgICAgICBcInRva2Vuc01hbmRhdG9yeUdyb3VwMV9tb250aFwiOiBbXCJjYy1leHBcIl0sXG4gICAgICAgICAgICBcInRva2Vuc01hbmRhdG9yeUdyb3VwMV9udW1lcmljXCI6IFtcImNjLWV4cC1tb250aFwiLFxuICAgICAgICAgICAgICAgIFwiY2MtZXhwLXllYXJcIixcbiAgICAgICAgICAgICAgICBcInRyYW5zYWN0aW9uLWFtb3VudFwiLFxuICAgICAgICAgICAgICAgIFwiYmRheS1kYXlcIixcbiAgICAgICAgICAgICAgICBcImJkYXktbW9udGhcIixcbiAgICAgICAgICAgICAgICBcImJkYXkteWVhclwiXSxcbiAgICAgICAgICAgIFwidG9rZW5zTWFuZGF0b3J5R3JvdXAxX2RhdGVcIjogW1wiYmRheVwiXSxcbiAgICAgICAgICAgIFwidG9rZW5zTWFuZGF0b3J5R3JvdXAxX3VybFwiOiBbXCJ1cmxcIiwgXCJwaG90b1wiXSxcbiAgICAgICAgICAgIFwidG9rZW5zTWFuZGF0b3J5R3JvdXAxX3RleHRcIjogW1wibmFtZVwiLFxuICAgICAgICAgICAgICAgIFwiaG9ub3JpZmljLXByZWZpeFwiLFxuICAgICAgICAgICAgICAgIFwiZ2l2ZW4tbmFtZVwiLFxuICAgICAgICAgICAgICAgIFwiYWRkaXRpb25hbC1uYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJmYW1pbHktbmFtZVwiLFxuICAgICAgICAgICAgICAgIFwiaG9ub3JpZmljLXN1ZmZpeFwiLFxuICAgICAgICAgICAgICAgIFwibmlja25hbWVcIixcbiAgICAgICAgICAgICAgICBcInVzZXJuYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJvcmdhbml6YXRpb24tdGl0bGVcIixcbiAgICAgICAgICAgICAgICBcIm9yZ2FuaXphdGlvblwiLFxuICAgICAgICAgICAgICAgIFwiYWRkcmVzcy1saW5lMVwiLFxuICAgICAgICAgICAgICAgIFwiYWRkcmVzcy1saW5lMlwiLFxuICAgICAgICAgICAgICAgIFwiYWRkcmVzcy1saW5lM1wiLFxuICAgICAgICAgICAgICAgIFwiYWRkcmVzcy1sZXZlbDRcIixcbiAgICAgICAgICAgICAgICBcImFkZHJlc3MtbGV2ZWwzXCIsXG4gICAgICAgICAgICAgICAgXCJhZGRyZXNzLWxldmVsMlwiLFxuICAgICAgICAgICAgICAgIFwiYWRkcmVzcy1sZXZlbDFcIixcbiAgICAgICAgICAgICAgICBcImNvdW50cnlcIixcbiAgICAgICAgICAgICAgICBcImNvdW50cnktbmFtZVwiLFxuICAgICAgICAgICAgICAgIFwicG9zdGFsLWNvZGVcIixcbiAgICAgICAgICAgICAgICBcImNjLW5hbWVcIixcbiAgICAgICAgICAgICAgICBcImNjLWdpdmVuLW5hbWVcIixcbiAgICAgICAgICAgICAgICBcImNjLWFkZGl0aW9uYWwtbmFtZVwiLFxuICAgICAgICAgICAgICAgIFwiY2MtZmFtaWx5LW5hbWVcIixcbiAgICAgICAgICAgICAgICBcImNjLW51bWJlclwiLFxuICAgICAgICAgICAgICAgIFwiY2MtY3NjXCIsXG4gICAgICAgICAgICAgICAgXCJjYy10eXBlXCIsXG4gICAgICAgICAgICAgICAgXCJ0cmFuc2FjdGlvbi1jdXJyZW5jeVwiLFxuICAgICAgICAgICAgICAgIFwibGFuZ3VhZ2VcIixcbiAgICAgICAgICAgICAgICBcInNleFwiXSxcbiAgICAgICAgICAgIFwidG9rZW5zTWFuZGF0b3J5R3JvdXAxX2FsbFwiOiBbXCJuYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJob25vcmlmaWMtcHJlZml4XCIsXG4gICAgICAgICAgICAgICAgXCJnaXZlbi1uYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJhZGRpdGlvbmFsLW5hbWVcIixcbiAgICAgICAgICAgICAgICBcImZhbWlseS1uYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJob25vcmlmaWMtc3VmZml4XCIsXG4gICAgICAgICAgICAgICAgXCJuaWNrbmFtZVwiLFxuICAgICAgICAgICAgICAgIFwidXNlcm5hbWVcIixcbiAgICAgICAgICAgICAgICBcIm5ldy1wYXNzd29yZFwiLFxuICAgICAgICAgICAgICAgIFwiY3VycmVudC1wYXNzd29yZFwiLFxuICAgICAgICAgICAgICAgIFwib3JnYW5pemF0aW9uLXRpdGxlXCIsXG4gICAgICAgICAgICAgICAgXCJvcmdhbml6YXRpb25cIixcbiAgICAgICAgICAgICAgICBcInN0cmVldC1hZGRyZXNzXCIsXG4gICAgICAgICAgICAgICAgXCJhZGRyZXNzLWxpbmUxXCIsXG4gICAgICAgICAgICAgICAgXCJhZGRyZXNzLWxpbmUyXCIsXG4gICAgICAgICAgICAgICAgXCJhZGRyZXNzLWxpbmUzXCIsXG4gICAgICAgICAgICAgICAgXCJhZGRyZXNzLWxldmVsNFwiLFxuICAgICAgICAgICAgICAgIFwiYWRkcmVzcy1sZXZlbDNcIixcbiAgICAgICAgICAgICAgICBcImFkZHJlc3MtbGV2ZWwyXCIsXG4gICAgICAgICAgICAgICAgXCJhZGRyZXNzLWxldmVsMVwiLFxuICAgICAgICAgICAgICAgIFwiY291bnRyeVwiLFxuICAgICAgICAgICAgICAgIFwiY291bnRyeS1uYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJwb3N0YWwtY29kZVwiLFxuICAgICAgICAgICAgICAgIFwiY2MtbmFtZVwiLFxuICAgICAgICAgICAgICAgIFwiY2MtZ2l2ZW4tbmFtZVwiLFxuICAgICAgICAgICAgICAgIFwiY2MtYWRkaXRpb25hbC1uYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJjYy1mYW1pbHktbmFtZVwiLFxuICAgICAgICAgICAgICAgIFwiY2MtbnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgXCJjYy1leHBcIixcbiAgICAgICAgICAgICAgICBcImNjLWV4cC1tb250aFwiLFxuICAgICAgICAgICAgICAgIFwiY2MtZXhwLXllYXJcIixcbiAgICAgICAgICAgICAgICBcImNjLWNzY1wiLFxuICAgICAgICAgICAgICAgIFwiY2MtdHlwZVwiLFxuICAgICAgICAgICAgICAgIFwidHJhbnNhY3Rpb24tY3VycmVuY3lcIixcbiAgICAgICAgICAgICAgICBcInRyYW5zYWN0aW9uLWFtb3VudFwiLFxuICAgICAgICAgICAgICAgIFwibGFuZ3VhZ2VcIixcbiAgICAgICAgICAgICAgICBcImJkYXlcIixcbiAgICAgICAgICAgICAgICBcImJkYXktZGF5XCIsXG4gICAgICAgICAgICAgICAgXCJiZGF5LW1vbnRoXCIsXG4gICAgICAgICAgICAgICAgXCJiZGF5LXllYXJcIixcbiAgICAgICAgICAgICAgICBcInNleFwiLFxuICAgICAgICAgICAgICAgIFwidXJsXCIsXG4gICAgICAgICAgICAgICAgXCJwaG90b1wiXSxcbiAgICAgICAgICAgIFwidG9rZW5zT3B0aW9uYWxHcm91cDJcIjogW1wiaG9tZVwiLFxuICAgICAgICAgICAgICAgIFwid29ya1wiLFxuICAgICAgICAgICAgICAgIFwibW9iaWxlXCIsXG4gICAgICAgICAgICAgICAgXCJmYXhcIixcbiAgICAgICAgICAgICAgICBcInBhZ2VyXCJdLFxuXG4gICAgICAgICAgICBcInRva2Vuc01hbmRhdG9yeUdyb3VwMl90ZWxcIjogW1widGVsXCJdLFxuICAgICAgICAgICAgXCJ0b2tlbnNNYW5kYXRvcnlHcm91cDJfZW1haWxcIjogW1wiZW1haWxcIl0sXG4gICAgICAgICAgICBcInRva2Vuc01hbmRhdG9yeUdyb3VwMl91cmxcIjogW1wiaW1wcFwiXSxcbiAgICAgICAgICAgIFwidG9rZW5zTWFuZGF0b3J5R3JvdXAyX3RleHRcIjogW1widGVsLWNvdW50cnktY29kZVwiLFxuICAgICAgICAgICAgICAgIFwidGVsLW5hdGlvbmFsXCIsXG4gICAgICAgICAgICAgICAgXCJ0ZWwtYXJlYS1jb2RlXCIsXG4gICAgICAgICAgICAgICAgXCJ0ZWwtbG9jYWxcIixcbiAgICAgICAgICAgICAgICBcInRlbC1sb2NhbC1wcmVmaXhcIixcbiAgICAgICAgICAgICAgICBcInRlbC1sb2NhbC1zdWZmaXhcIixcbiAgICAgICAgICAgICAgICBcInRlbC1leHRlbnNpb25cIl0sXG4gICAgICAgICAgICBcInRva2Vuc01hbmRhdG9yeUdyb3VwMl9hbGxcIjogW1widGVsXCIsXG4gICAgICAgICAgICAgICAgXCJ0ZWwtY291bnRyeS1jb2RlXCIsXG4gICAgICAgICAgICAgICAgXCJ0ZWwtbmF0aW9uYWxcIixcbiAgICAgICAgICAgICAgICBcInRlbC1hcmVhLWNvZGVcIixcbiAgICAgICAgICAgICAgICBcInRlbC1sb2NhbFwiLFxuICAgICAgICAgICAgICAgIFwidGVsLWxvY2FsLXByZWZpeFwiLFxuICAgICAgICAgICAgICAgIFwidGVsLWxvY2FsLXN1ZmZpeFwiLFxuICAgICAgICAgICAgICAgIFwidGVsLWV4dGVuc2lvblwiLFxuICAgICAgICAgICAgICAgIFwiZW1haWxcIixcbiAgICAgICAgICAgICAgICBcImltcHBcIl0sXG4gICAgICAgICAgICBcInRva2Vuc09wdGlvbkdyb3VwMV93ZWJhdXRoblwiOiBbXCJ3ZWJhdXRoblwiXSAgICBcbiAgICAgICAgfVxuICAgICAgICBsZXQgdmFsaWRfdmFsdWVzID0gW107XG4gICAgICAgIGZvciAodmFyIGtleSBpbiBjYWNoZSlcbiAgICAgICAgICAgIHZhbGlkX3ZhbHVlcz12YWxpZF92YWx1ZXMuY29uY2F0KGNhY2hlW2tleV0pO1xuICAgICAgICBcbiAgICAgICAgbGV0IGZvdW5kTWFuZGF0b3J5VG9rZW4gPSBmYWxzZTtcbiAgICAgICAgbGV0IGZvdW5kUmVjb2duaXplZFRva2VuID0gdHJ1ZTtcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKCF0b2tlbnMuZXZlcnkociA9PiB2YWxpZF92YWx1ZXMuaW5jbHVkZXMocikgfHwgci5zdGFydHNXaXRoKGNhY2hlWyd0b2tlbk9wdGlvbmFsU2VjdGlvbiddKSkpXG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2luY29ycmVjdFwiKTtcbiAgICAgICAgXG4gICAgICAgIGxldCB0eXBlID0gcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidHlwZVwiKSA/IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInR5cGVcIikudHJpbSgpLnRvTG93ZXJDYXNlKCkgOiBcInRleHRcIjtcbiAgICAgICAgXG4gICAgICAgIGxldCB0b2tlbnNNYW5kYXRvcnlHcm91cDEgPSBbXTtcbiAgICAgICAgbGV0IHRva2Vuc01hbmRhdG9yeUdyb3VwMiA9IFtdO1xuICAgICAgICBsZXQgdG9rZW5zT3B0aW9uYWxHcm91cCA9IFtdO1xuXG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJ0ZXh0YXJlYVwiIHx8IG5vZGVOYW1lID09PSBcInNlbGVjdFwiKSB7XG4gICAgICAgICAgICAvLyBhY2NlcHQgYWxsIHRva2Vuc1xuICAgICAgICAgICAgdG9rZW5zTWFuZGF0b3J5R3JvdXAxID0gY2FjaGUudG9rZW5zTWFuZGF0b3J5R3JvdXAxX2FsbDtcbiAgICAgICAgICAgIHRva2Vuc01hbmRhdG9yeUdyb3VwMiA9IGNhY2hlLnRva2Vuc01hbmRhdG9yeUdyb3VwMl9hbGw7XG4gICAgICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwidGV4dGFyZWFcIilcbiAgICAgICAgICAgICAgICB0b2tlbnNPcHRpb25hbEdyb3VwID0gY2FjaGUudG9rZW5zT3B0aW9uR3JvdXAxX3dlYmF1dGhuO1xuXG4gICAgICAgIH0gZWxzZSBpZiAobm9kZU5hbWUgPT09IFwiaW5wdXRcIikge1xuICAgICAgICAgICAgdG9rZW5zT3B0aW9uYWxHcm91cCA9IGNhY2hlLnRva2Vuc09wdGlvbkdyb3VwMV93ZWJhdXRobjtcbiAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgdmFyaW91cyAnaW5wdXQnIHR5cGVzXG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcblxuICAgICAgICAgICAgICAgIC8vIERpc2FibGUgY2hlY2sgZm9yIGlucHV0IHR5cGU9aGlkZGVuIGZvciBub3cgYmFzZWQgb24gc2NydW0gZGlzY3Vzc2lvblxuICAgICAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgICAgY2FzZSBcImhpZGRlblwiOlxuICAgICAgICAgICAgICAgICAgICAvLyBhY2NlcHQgYWxsIHRva2Vuc1xuICAgICAgICAgICAgICAgICAgICB0b2tlbnNNYW5kYXRvcnlHcm91cDEgPSBjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDFfYWxsO1xuICAgICAgICAgICAgICAgICAgICB0b2tlbnNNYW5kYXRvcnlHcm91cDIgPSBjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDJfYWxsO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICAgICAgY2FzZSBcInRleHRcIjpcbiAgICAgICAgICAgICAgICBjYXNlIFwic2VhcmNoXCI6XG4gICAgICAgICAgICAgICAgICAgIHRva2Vuc01hbmRhdG9yeUdyb3VwMSA9IGNhY2hlLnRva2Vuc01hbmRhdG9yeUdyb3VwMV90ZXh0LmNvbmNhdChjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDFfcGFzc3dvcmQsXG4gICAgICAgICAgICAgICAgICAgICAgICBjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDFfdXJsLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGUudG9rZW5zTWFuZGF0b3J5R3JvdXAxX251bWVyaWMsXG4gICAgICAgICAgICAgICAgICAgICAgICBjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDFfbW9udGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDFfZGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRva2Vuc01hbmRhdG9yeUdyb3VwMiA9IGNhY2hlLnRva2Vuc01hbmRhdG9yeUdyb3VwMl9hbGw7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJwYXNzd29yZFwiOlxuICAgICAgICAgICAgICAgICAgICB0b2tlbnNNYW5kYXRvcnlHcm91cDEgPSBjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDFfcGFzc3dvcmQ7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJ1cmxcIjpcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5zTWFuZGF0b3J5R3JvdXAxID0gY2FjaGUudG9rZW5zTWFuZGF0b3J5R3JvdXAxX3VybDtcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5zTWFuZGF0b3J5R3JvdXAyID0gY2FjaGUudG9rZW5zTWFuZGF0b3J5R3JvdXAyX3VybDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcImVtYWlsXCI6XG4gICAgICAgICAgICAgICAgICAgIHRva2Vuc01hbmRhdG9yeUdyb3VwMiA9IGNhY2hlLnRva2Vuc01hbmRhdG9yeUdyb3VwMl9lbWFpbDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcInRlbFwiOlxuICAgICAgICAgICAgICAgICAgICB0b2tlbnNNYW5kYXRvcnlHcm91cDIgPSBjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDJfdGVsO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICAgICAgICAgICAgICAgIHRva2Vuc01hbmRhdG9yeUdyb3VwMSA9IGNhY2hlLnRva2Vuc01hbmRhdG9yeUdyb3VwMV9udW1lcmljO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwibW9udGhcIjpcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5zTWFuZGF0b3J5R3JvdXAxID0gY2FjaGUudG9rZW5zTWFuZGF0b3J5R3JvdXAxX21vbnRoO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiZGF0ZVwiOlxuICAgICAgICAgICAgICAgICAgICB0b2tlbnNNYW5kYXRvcnlHcm91cDEgPSBjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDFfZGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgLy8gdW5zdXBwb3J0ZWQgdHlwZSBmb3IgdGhpcyBydWxlLlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gc2hvdWxkIG5ldmVyIGdldCBoZXJlLlxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEaXNhYmxlIGNoZWNrIGZvciBpbnB1dCB0eXBlPWhpZGRlbiBmb3Igbm93IGJhc2VkIG9uIHNjcnVtIGRpc2N1c3Npb25cbiAgICAgICAgbGV0IGF1dG9maWxsTWFudGxlID0gLyogKG5vZGVOYW1lPT09XCJpbnB1dFwiICYmIHR5cGU9PT1cImhpZGRlblwiKSA/IFwiYW5jaG9yXCIgOiAqLyBcImV4cGVjdGF0aW9uXCI7XG5cbiAgICAgICAgaWYgKGF1dG9maWxsTWFudGxlID09PSBcImV4cGVjdGF0aW9uXCIpIHtcbiAgICAgICAgICAgIC8vIGNoZWNrIG9ufG9mZiBmb3IgZXhwZWN0YXRpb24gbWFudGxlLlxuICAgICAgICAgICAgaWYgKHRva2Vucy5pbmNsdWRlcyhcIm9uXCIpIHx8IHRva2Vucy5pbmNsdWRlcyhcIm9mZlwiKSkge1xuICAgICAgICAgICAgICAgIC8vIG9ufG9mZiBzaG91bGQgYmUgdGhlIG9ubHkgdG9rZW5cbiAgICAgICAgICAgICAgICBpZiAodG9rZW5zLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfaW52YWxpZFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjaGVjayBkZXRhaWwgYXV0b2ZpbGwgdG9rZW5zXG4gICAgICAgIGxldCBjdXJySW5kZXggPSAwO1xuICAgICAgICBsZXQgY3VyclJlY29nbml6ZWRJbmRleCA9IDA7XG5cbiAgICAgICAgLy8gY2hlY2sgb3B0aW9uYWwgJ3NlY3Rpb24tKicgdG9rZW5zXG4gICAgICAgIGlmICh0b2tlbnNbY3VyckluZGV4XS5zdGFydHNXaXRoKGNhY2hlLnRva2VuT3B0aW9uYWxTZWN0aW9uKSAmJlxuICAgICAgICAgICAgdG9rZW5zW2N1cnJJbmRleF0ubGVuZ3RoID4gOCkge1xuICAgICAgICAgICAgY3VyckluZGV4Kys7IC8vIGNvbnN1bWUgdG9rZW5cbiAgICAgICAgICAgIGN1cnJSZWNvZ25pemVkSW5kZXgrKztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNoZWNrIG9wdGlvbmFsICdzaGlwcGluZ3xiaWxsaW5nJyB0b2tlbnNcbiAgICAgICAgaWYgKHRva2Vucy5sZW5ndGggPiBjdXJySW5kZXggJiZcbiAgICAgICAgICAgIGNhY2hlLnRva2Vuc09wdGlvbmFsUHVycG9zZS5pbmNsdWRlcyh0b2tlbnNbY3VyckluZGV4XSkpIHtcbiAgICAgICAgICAgIGN1cnJJbmRleCsrOyAvLyBjb25zdW1lICB0b2tlblxuICAgICAgICAgICAgY3VyclJlY29nbml6ZWRJbmRleCsrO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2hlY2sgZWl0aGVyIG1hbmRhdG9yeSBncm91cCAxIG9yIDIgdG9rZW5zXG4gICAgICAgIGlmICh0b2tlbnMubGVuZ3RoID4gY3VyckluZGV4KSB7XG4gICAgICAgICAgICAvLyBjaGVjayBtYW5kYXRvcnkgZ3JvdXAgMVxuICAgICAgICAgICAgaWYgKHRva2Vuc01hbmRhdG9yeUdyb3VwMS5pbmNsdWRlcyh0b2tlbnNbY3VyckluZGV4XSkpIHtcbiAgICAgICAgICAgICAgICBmb3VuZE1hbmRhdG9yeVRva2VuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjdXJySW5kZXgrKztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gY2hlY2sgb3B0aW9uYWwgdG9rZW5zIGZvciBncm91cCAyXG4gICAgICAgICAgICAgICAgaWYgKGNhY2hlLnRva2Vuc09wdGlvbmFsR3JvdXAyLmluY2x1ZGVzKHRva2Vuc1tjdXJySW5kZXhdKSkge1xuICAgICAgICAgICAgICAgICAgICBjdXJySW5kZXgrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gY2hlY2sgbWFuZGF0b3J5IGdyb3VwIDJcbiAgICAgICAgICAgICAgICBpZiAodG9rZW5zTWFuZGF0b3J5R3JvdXAyLmluY2x1ZGVzKHRva2Vuc1tjdXJySW5kZXhdKSkge1xuICAgICAgICAgICAgICAgICAgICBmb3VuZE1hbmRhdG9yeVRva2VuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgY3VyckluZGV4Kys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2hlY2sgZWl0aGVyIG1hbmRhdG9yeSBncm91cCAxIG9yIDIgdG9rZW5zXG4gICAgICAgIGlmICh0b2tlbnMubGVuZ3RoID4gY3VyclJlY29nbml6ZWRJbmRleCkge1xuICAgICAgICAgICAgLy8gY2hlY2sgbWFuZGF0b3J5IGdyb3VwIDFcbiAgICAgICAgICAgIGlmIChjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDFfYWxsLmluY2x1ZGVzKHRva2Vuc1tjdXJyUmVjb2duaXplZEluZGV4XSkpIHtcbiAgICAgICAgICAgICAgICBmb3VuZFJlY29nbml6ZWRUb2tlbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgY3VyclJlY29nbml6ZWRJbmRleCsrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBjaGVjayBvcHRpb25hbCB0b2tlbnMgZm9yIGdyb3VwIDJcbiAgICAgICAgICAgICAgICBpZiAoY2FjaGUudG9rZW5zT3B0aW9uYWxHcm91cDIuaW5jbHVkZXModG9rZW5zW2N1cnJSZWNvZ25pemVkSW5kZXhdKSkge1xuICAgICAgICAgICAgICAgICAgICBjdXJyUmVjb2duaXplZEluZGV4Kys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGNoZWNrIG1hbmRhdG9yeSBncm91cCAyXG4gICAgICAgICAgICAgICAgaWYgKGNhY2hlLnRva2Vuc01hbmRhdG9yeUdyb3VwMl9hbGwuaW5jbHVkZXModG9rZW5zW2N1cnJSZWNvZ25pemVkSW5kZXhdKSkge1xuICAgICAgICAgICAgICAgICAgICBmb3VuZFJlY29nbml6ZWRUb2tlbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJSZWNvZ25pemVkSW5kZXgrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmICh0b2tlbnMubGVuZ3RoID4gY3VyckluZGV4ICsgY3VyclJlY29nbml6ZWRJbmRleCkge1xuICAgICAgICAgICAgLy8gY2hlY2sgb3B0aW9uYWwgdG9rZW5zIHdlYmF1dGhuXG4gICAgICAgICAgICBpZiAodG9rZW5zT3B0aW9uYWxHcm91cC5pbmNsdWRlcyh0b2tlbnNbY3VyckluZGV4ICsgY3VyclJlY29nbml6ZWRJbmRleF0pKSB7XG4gICAgICAgICAgICAgICAgY3VyckluZGV4Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCh0b2tlbnMubGVuZ3RoID4gY3VyckluZGV4ICYmIHRva2Vuc09wdGlvbmFsR3JvdXAuaW5jbHVkZXModG9rZW5zW2N1cnJJbmRleF0pKVxuICAgICAgICAgICAgfHwgKHRva2Vucy5sZW5ndGggPiBjdXJyUmVjb2duaXplZEluZGV4ICYmIHRva2Vuc09wdGlvbmFsR3JvdXAuaW5jbHVkZXModG9rZW5zW2N1cnJSZWNvZ25pemVkSW5kZXhdKSkpIHtcbiAgICAgICAgICAgIGN1cnJJbmRleCsrO1xuICAgICAgICAgICAgY3VyclJlY29nbml6ZWRJbmRleCsrO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT25seSBwYXNzIGlmIHdlIGhhdmUgc2VlbiBlaXRoZXIgb2YgdGhlIG1hbmRhdG9yeSBncm91cHMgYW5kIGFsbCB0b2tlbnMgaGF2ZSBiZWVuIGNvbnN1bWVkXG4gICAgICAgIGlmIChmb3VuZE1hbmRhdG9yeVRva2VuICYmIHRva2Vucy5sZW5ndGggPT09IGN1cnJJbmRleCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgfSBlbHNlIGlmIChmb3VuZFJlY29nbml6ZWRUb2tlbiAmJiB0b2tlbnMubGVuZ3RoID09PSBjdXJyUmVjb2duaXplZEluZGV4KSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2luY29ycmVjdFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfaW5hcHByb3ByaWF0ZVwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgVGFibGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVGFibGVVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBpbnB1dF9jaGVja2JveGVzX2dyb3VwZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaW5wdXRfY2hlY2tib3hlc19ncm91cGVkXCIsXG4gICAgY29udGV4dDogXCJkb206aW5wdXRbdHlwZT1yYWRpb10sIGRvbTppbnB1dFt0eXBlPWNoZWNrYm94XVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0lucHV0X1JhZGlvQ2hrSW5GaWVsZFNldFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfTG9uZU5vZ3JvdXBcIjogXCJwYXNzX2xvbmVub2dyb3VwXCIsXG4gICAgICAgICAgICBcIlBhc3NfR3JvdXBlZFwiOiBcInBhc3NfZ3JvdXBlZFwiLFxuICAgICAgICAgICAgXCJQYXNzX1JhZGlvTm9OYW1lXCI6IFwicGFzc19yYWRpb05vTmFtZVwiLFxuICAgICAgICAgICAgXCJGYWlsX0NvbnRyb2xOYW1lTWlzbWF0Y2hcIjogXCJmYWlsX2NvbnRyb2xuYW1lbWlzbWF0Y2hcIixcbiAgICAgICAgICAgIFwiRmFpbF9Ob3RHcm91cGVkT3RoZXJHcm91cGVkXCI6IFwiZmFpbF9ub3Rncm91cGVkb3RoZXJncm91cGVkXCIsXG4gICAgICAgICAgICBcIkZhaWxfTm90R3JvdXBlZE90aGVyTm90R3JvdXBlZFwiOiBcImZhaWxfbm90Z3JvdXBlZG90aGVybm90Z3JvdXBlZFwiLFxuICAgICAgICAgICAgXCJGYWlsX05vdFNhbWVHcm91cFwiOiBcImZhaWxfbm90c2FtZWdyb3VwXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF9Mb25lQ2hlY2tib3hcIjogXCJwb3RlbnRpYWxfbG9uZWNoZWNrYm94XCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF9Vbm5hbWVkQ2hlY2tib3hcIjogXCJwb3RlbnRpYWxfdW5uYW1lZGNoZWNrYm94XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpbnB1dF9jaGVja2JveGVzX2dyb3VwZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJwYXNzX2xvbmVub2dyb3VwXCI6IFwiaW5wdXRfY2hlY2tib3hlc19ncm91cGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwicGFzc19ncm91cGVkXCI6IFwiaW5wdXRfY2hlY2tib3hlc19ncm91cGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwicGFzc19yYWRpb25vbmFtZVwiOiBcImlucHV0X2NoZWNrYm94ZXNfZ3JvdXBlZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfY29udHJvbG5hbWVtaXNtYXRjaFwiOiBcImlucHV0X2NoZWNrYm94ZXNfZ3JvdXBlZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfbm90Z3JvdXBlZG90aGVyZ3JvdXBlZFwiOiBcImlucHV0X2NoZWNrYm94ZXNfZ3JvdXBlZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfbm90Z3JvdXBlZG90aGVybm90Z3JvdXBlZFwiOiBcImlucHV0X2NoZWNrYm94ZXNfZ3JvdXBlZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfbm90c2FtZWdyb3VwXCI6IFwiaW5wdXRfY2hlY2tib3hlc19ncm91cGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX2xvbmVjaGVja2JveFwiOiBcImlucHV0X2NoZWNrYm94ZXNfZ3JvdXBlZC5odG1sXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF91bm5hbWVkY2hlY2tib3hcIjogXCJpbnB1dF9jaGVja2JveGVzX2dyb3VwZWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIlJlbGF0ZWQgc2V0cyBvZiByYWRpbyBidXR0b25zIG9yIGNoZWNrYm94ZXMgc2hvdWxkIGJlIHByb2dyYW1tYXRpY2FsbHkgZ3JvdXBlZFwiLFxuICAgICAgICAgICAgXCJwYXNzX2xvbmVub2dyb3VwXCI6IFwiezB9IGdyb3VwaW5nIG5vdCByZXF1aXJlZCBmb3IgYSBjb250cm9sIG9mIHRoaXMgdHlwZVwiLFxuICAgICAgICAgICAgXCJwYXNzX2dyb3VwZWRcIjogXCJ7MH0gaW5wdXQgaXMgZ3JvdXBlZCB3aXRoIG90aGVyIHJlbGF0ZWQgY29udHJvbHMgd2l0aCB0aGUgc2FtZSBuYW1lXCIsXG4gICAgICAgICAgICBcInBhc3NfcmFkaW9ub25hbWVcIjogXCJSYWRpbyBpbnB1dCBpcyBub3QgZ3JvdXBlZCwgYnV0IHBhc3NlcyBiZWNhdXNlIGl0IGhhcyBubyBuYW1lIHRvIGdyb3VwIHdpdGggb3RoZXIgcmFkaW8gaW5wdXRzXCIsXG4gICAgICAgICAgICBcImZhaWxfY29udHJvbG5hbWVtaXNtYXRjaFwiOiBcInswfSBpbnB1dCBmb3VuZCB0aGF0IGhhcyB0aGUgc2FtZSBuYW1lLCBcXFwiezJ9XFxcIiBhcyBhIHsxfSBpbnB1dFwiLFxuICAgICAgICAgICAgXCJmYWlsX25vdGdyb3VwZWRvdGhlcmdyb3VwZWRcIjogXCJ7MH0gaW5wdXQgaXMgbm90IGluIHRoZSBncm91cCB3aXRoIGFub3RoZXIgezB9IHdpdGggdGhlIG5hbWUgXFxcInsxfVxcXCJcIixcbiAgICAgICAgICAgIFwiZmFpbF9ub3Rncm91cGVkb3RoZXJub3Rncm91cGVkXCI6IFwiezB9IGlucHV0IGFuZCBvdGhlcnMgd2l0aCB0aGUgbmFtZSBcXFwiezF9XFxcIiBhcmUgbm90IGdyb3VwZWQgdG9nZXRoZXJcIixcbiAgICAgICAgICAgIFwiZmFpbF9ub3RzYW1lZ3JvdXBcIjogXCJ7MH0gaW5wdXQgaXMgaW4gYSBkaWZmZXJlbnQgZ3JvdXAgdGhhbiBhbm90aGVyIHswfSB3aXRoIHRoZSBuYW1lIFxcXCJ7MX1cXFwiXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9sb25lY2hlY2tib3hcIjogXCJWZXJpZnkgdGhhdCB0aGlzIHVuZ3JvdXBlZCBjaGVja2JveCBpbnB1dCBpcyBub3QgcmVsYXRlZCB0byBvdGhlciBjaGVja2JveGVzXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF91bm5hbWVkY2hlY2tib3hcIjogXCJWZXJpZnkgdGhhdCB0aGlzIHVuLW5hbWVkLCB1bmdyb3VwZWQgY2hlY2tib3ggaW5wdXQgaXMgbm90IHJlbGF0ZWQgdG8gb3RoZXIgY2hlY2tib3hlc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBnZXRHcm91cCA9IChlOiBFbGVtZW50KSA9PiB7XG4gICAgICAgICAgICBsZXQgcmV0VmFsID0gQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihlLCBcImZpZWxkc2V0XCIpXG4gICAgICAgICAgICAgICAgfHwgQXJpYVV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShlLCBcInJhZGlvZ3JvdXBcIilcbiAgICAgICAgICAgICAgICB8fCBBcmlhVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKGUsIFwiZ3JvdXBcIilcbiAgICAgICAgICAgICAgICB8fCBBcmlhVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKGUsIFwiZ3JpZFwiKVxuICAgICAgICAgICAgICAgIHx8IEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUoZSwgXCJ0YWJsZVwiKTtcbiAgICAgICAgICAgIGlmICghcmV0VmFsKSB7XG4gICAgICAgICAgICAgICAgcmV0VmFsID0gQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihlLCBcInRhYmxlXCIpO1xuICAgICAgICAgICAgICAgIGlmIChyZXRWYWwgJiYgIVRhYmxlVXRpbC5pc0RhdGFUYWJsZShyZXRWYWwpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE9ubHkgcmFkaW8gYnV0dG9ucyBhbmQgY2hlY2tib3hlcyBhcmUgaW4gc2NvcGVcbiAgICAgICAgbGV0IGN0eFR5cGUgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIFxuICAgICAgICAvLyBEZXRlcm1pbmUgd2hpY2ggZm9ybSB3ZSdyZSBpbiAoaWYgYW55KSB0byBkZXRlcm1pbmUgb3VyIHNjb3BlXG4gICAgICAgIGxldCBjdHhGb3JtID0gQXJpYVV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShydWxlQ29udGV4dCwgXCJmb3JtXCIpXG4gICAgICAgICAgICB8fCBDb21tb25VdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBcImh0bWxcIilcbiAgICAgICAgICAgIHx8IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuXG4gICAgICAgIC8vIEdldCBkYXRhIGFib3V0IGFsbCBvZiB0aGUgdmlzaWJsZSBjaGVja2JveGVzIGFuZCByYWRpb3MgaW4gdGhlIHNjb3BlIG9mIHRoaXMgZm9ybVxuICAgICAgICAvLyBhbmQgY2FjaGUgaXQgZm9yIGFsbCBvZiB0aGUgb3RoZXIgaW5wdXRzIGluIHRoaXMgc2NvcGVcbiAgICAgICAgbGV0IGZvcm1DYWNoZSA9IENhY2hlVXRpbC5nZXRDYWNoZShjdHhGb3JtLCBcImlucHV0X2NoZWNrYm94ZXNfZ3JvdXBlZFwiLCBudWxsKTtcbiAgICAgICAgaWYgKCFmb3JtQ2FjaGUpIHtcbiAgICAgICAgICAgIGZvcm1DYWNoZSA9IHtcbiAgICAgICAgICAgICAgICBjaGVja2JveEJ5TmFtZToge30sXG4gICAgICAgICAgICAgICAgcmFkaW9zQnlOYW1lOiB7fSxcbiAgICAgICAgICAgICAgICBuYW1lVG9Hcm91cDoge1xuXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBudW1DaGVja2JveGVzOiAwLFxuICAgICAgICAgICAgICAgIG51bVJhZGlvczogMFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gR2V0IGFsbCBvZiB0aGUgY2hlY2tib3hlcyBpbiB0aGUgZm9ybSBvciBib2R5IChidXQgbm90IG5lc3RlZCBpbiBzb21ldGhpbmcgZWxzZSBhbmQgbm90IGhpZGRlbilcbiAgICAgICAgICAgIC8vIEFuZCBnZXQgYSBtYXBwaW5nIG9mIHRoZXNlIGNoZWNrYm94ZXMgdG9cbiAgICAgICAgICAgIGxldCBjV2Fsa2VyID0gbmV3IERPTVdhbGtlcihjdHhGb3JtLCBmYWxzZSwgY3R4Rm9ybSwgdHJ1ZSk7XG4gICAgICAgICAgICBsZXQgY2hlY2tib3hRID0gW107XG4gICAgICAgICAgICBsZXQgcmFkaW9zUSA9IFtdO1xuICAgICAgICAgICAgd2hpbGUgKGNXYWxrZXIubmV4dE5vZGUoKSkge1xuICAgICAgICAgICAgICAgIGlmICghY1dhbGtlci5iRW5kVGFnXG4gICAgICAgICAgICAgICAgICAgICYmIGNXYWxrZXIubm9kZS5ub2RlVHlwZSA9PT0gMVxuICAgICAgICAgICAgICAgICAgICAmJiBjV2Fsa2VyLm5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgICYmIFZpc1V0aWwuaXNOb2RlVmlzaWJsZShjV2Fsa2VyLm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0eXBlID0gKGNXYWxrZXIubm9kZSBhcyBFbGVtZW50KS5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gXCJjaGVja2JveFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGVja2JveFEucHVzaChjV2Fsa2VyLm5vZGUpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFwicmFkaW9cIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmFkaW9zUS5wdXNoKGNXYWxrZXIubm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBsZXQgY2hlY2tib3hRID0gY3R4Rm9ybS5xdWVyeVNlbGVjdG9yQWxsKFwiaW5wdXRbdHlwZT1jaGVja2JveF1cIik7XG4gICAgICAgICAgICBmb3IgKGxldCBpZHggPSAwOyBpZHggPCBjaGVja2JveFEubGVuZ3RoOyArK2lkeCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNiID0gY2hlY2tib3hRW2lkeF07XG4gICAgICAgICAgICAgICAgaWYgKChBcmlhVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKGNiLCBcImZvcm1cIilcbiAgICAgICAgICAgICAgICAgICAgfHwgQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgXCJodG1sXCIpXG4gICAgICAgICAgICAgICAgICAgIHx8IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSA9PT0gY3R4Rm9ybVxuICAgICAgICAgICAgICAgICAgICAmJiAhQ29tbW9uVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKGNiKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gY2IuZ2V0QXR0cmlidXRlKFwibmFtZVwiKSB8fCBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAoZm9ybUNhY2hlLmNoZWNrYm94QnlOYW1lW25hbWVdID0gZm9ybUNhY2hlLmNoZWNrYm94QnlOYW1lW25hbWVdIHx8IFtdKS5wdXNoKGNiKTtcbiAgICAgICAgICAgICAgICAgICAgZm9ybUNhY2hlLm5hbWVUb0dyb3VwW25hbWVdID0gZm9ybUNhY2hlLm5hbWVUb0dyb3VwW25hbWVdIHx8IGdldEdyb3VwKGNiKTtcbiAgICAgICAgICAgICAgICAgICAgKytmb3JtQ2FjaGUubnVtQ2hlY2tib3hlcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBHZXQgYWxsIG9mIHRoZSByYWRpb3MgaW4gdGhlIGZvcm0gb3IgYm9keSAoYnV0IG5vdCBuZXN0ZWQgaW4gc29tZXRoaW5nIGVsc2UgYW5kIG5vdCBoaWRkZW4pXG4gICAgICAgICAgICAvLyBsZXQgcmFkaW9zUSA9IGN0eEZvcm0ucXVlcnlTZWxlY3RvckFsbChcImlucHV0W3R5cGU9cmFkaW9dXCIpO1xuICAgICAgICAgICAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgcmFkaW9zUS5sZW5ndGg7ICsraWR4KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgciA9IHJhZGlvc1FbaWR4XTtcbiAgICAgICAgICAgICAgICBjb25zdCByYWRDdHggPSAoQXJpYVV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShyLCBcImZvcm1cIilcbiAgICAgICAgICAgICAgICAgICAgfHwgQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgXCJodG1sXCIpXG4gICAgICAgICAgICAgICAgICAgIHx8IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KTtcbiAgICAgICAgICAgICAgICBpZiAocmFkQ3R4ID09PSBjdHhGb3JtXG4gICAgICAgICAgICAgICAgICAgICYmICFDb21tb25VdGlsLnNob3VsZE5vZGVCZVNraXBwZWRIaWRkZW4ocikpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IHIuZ2V0QXR0cmlidXRlKFwibmFtZVwiKSB8fCBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAoZm9ybUNhY2hlLnJhZGlvc0J5TmFtZVtuYW1lXSA9IGZvcm1DYWNoZS5yYWRpb3NCeU5hbWVbbmFtZV0gfHwgW10pLnB1c2gocik7XG4gICAgICAgICAgICAgICAgICAgIGZvcm1DYWNoZS5uYW1lVG9Hcm91cFtuYW1lXSA9IGZvcm1DYWNoZS5uYW1lVG9Hcm91cFtuYW1lXSB8fCBnZXRHcm91cChyKTtcbiAgICAgICAgICAgICAgICAgICAgKytmb3JtQ2FjaGUubnVtUmFkaW9zO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShjdHhGb3JtLCBcImlucHV0X2NoZWNrYm94ZXNfZ3JvdXBlZFwiLCBmb3JtQ2FjaGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8vLy8vLy8vLy8vLyBDYWxjdWxhdGVkIGV2ZXJ5dGhpbmcsIG5vdyBjaGVjayB0aGUgdmFyaW91cyBjYXNlc1xuXG4gICAgICAgIGNvbnN0IGN0eE5hbWUgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJuYW1lXCIpO1xuICAgICAgICBjb25zdCBjdHhHcm91cCA9IGdldEdyb3VwKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgY3R4VHlwZSA9IGN0eFR5cGUgPT09IFwicmFkaW9cIiA/IFwiUmFkaW9cIiA6IFwiQ2hlY2tib3hcIjtcblxuICAgICAgICBpZiAoIWN0eE5hbWUgfHwgY3R4TmFtZSA9PT0gXCJcIikge1xuICAgICAgICAgICAgLy8gRmlyc3QgcHJvY2VzcyBjYXNlcyB3aGVyZSB0aGUgY29udHJvbCBpcyBub3QgbmFtZWRcbiAgICAgICAgICAgIGlmIChjdHhUeXBlID09PSBcIlJhZGlvXCIpIHtcbiAgICAgICAgICAgICAgICAvLyBSYWRpb3Mgd2l0aG91dCBuYW1lcyBkb24ndCBhY3QgbGlrZSBncm91cHMsIHNvIGRvbid0IGVuZm9yY2UgZ3JvdXBpbmdcbiAgICAgICAgICAgICAgICBpZiAoY3R4R3JvdXAgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc19yYWRpb25vbmFtZVwiLCBbY3R4VHlwZV0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NfZ3JvdXBlZFwiLCBbY3R4VHlwZV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gTXVzdCBiZSBhbiB1bm5hbWVkIGNoZWNrYm94XG4gICAgICAgICAgICAgICAgaWYgKGN0eEdyb3VwID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgoZm9ybUNhY2hlLmNoZWNrYm94QnlOYW1lW1wiXCJdIHx8IFtdKS5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF91bm5hbWVkY2hlY2tib3hcIiwgW2N0eFR5cGVdKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NfbG9uZW5vZ3JvdXBcIiwgW2N0eFR5cGVdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NfZ3JvdXBlZFwiLCBbY3R4VHlwZV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIENvbnNpZGVyaW5nIGEgbmFtZWQgY2hlY2tib3hcbiAgICAgICAgICAgIGNvbnN0IG51bVJhZGlvc1dpdGhOYW1lID0gKGZvcm1DYWNoZS5yYWRpb3NCeU5hbWVbY3R4TmFtZV0gfHwgW10pLmxlbmd0aDtcbiAgICAgICAgICAgIGNvbnN0IG51bUNoZWNrYm94ZXNXaXRoTmFtZSA9IChmb3JtQ2FjaGUuY2hlY2tib3hCeU5hbWVbY3R4TmFtZV0gfHwgW10pLmxlbmd0aDtcbiAgICAgICAgICAgIC8vIENhcGl0YWxpemUgdGhlIGlucHV0IHR5cGUgZm9yIG1lc3NhZ2VzXG4gICAgICAgICAgICBpZiAobnVtUmFkaW9zV2l0aE5hbWUgPiAwICYmIG51bUNoZWNrYm94ZXNXaXRoTmFtZSA+IDApIHtcbiAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIGEgbmFtaW5nIG1pc21hdGNoIGJldHdlZW4gZGlmZmVyZW50IGNvbnRyb2xzXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9jb250cm9sbmFtZW1pc21hdGNoXCIsIFtjdHhUeXBlLCBjdHhUeXBlID09PSBcImNoZWNrYm94XCIgPyBcInJhZGlvXCIgOiBcImNoZWNrYm94XCIsIGN0eE5hbWVdKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY3R4VHlwZSA9PT0gXCJSYWRpb1wiICYmIChmb3JtQ2FjaGUubnVtUmFkaW9zID09PSAxIHx8IG51bVJhZGlvc1dpdGhOYW1lID09PSAxKVxuICAgICAgICAgICAgICAgIHx8IGN0eFR5cGUgPT09IFwiQ2hlY2tib3hcIiAmJiBmb3JtQ2FjaGUubnVtQ2hlY2tib3hlcyA9PT0gMSkge1xuICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBsb25lIGNvbnRyb2wgKGVpdGhlciBvbmx5IGNvbnRyb2wgb2YgdGhpcyB0eXBlIG9uIHRoZSBwYWdlLCBvciBhIHJhZGlvIGJ1dHRvbiB3aXRob3V0IGFueSBvdGhlcnMgYnkgdGhhdCBuYW1lKVxuICAgICAgICAgICAgICAgIC8vIFdlIHBhc3MgdGhpcyBjb250cm9sIGluIGFsbCBjYXNlc1xuICAgICAgICAgICAgICAgIGlmIChjdHhHcm91cCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzX2xvbmVub2dyb3VwXCIsIFtjdHhUeXBlXSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc19ncm91cGVkXCIsIFtjdHhUeXBlXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChjdHhUeXBlID09PSBcIkNoZWNrYm94XCIgJiYgZm9ybUNhY2hlLm51bUNoZWNrYm94ZXMgPiAxICYmIG51bUNoZWNrYm94ZXNXaXRoTmFtZSA9PT0gMSkge1xuICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgb25seSBvbmUgY2hlY2tib3ggd2l0aCB0aGlzIG5hbWUsIGJ1dCB0aGVyZSBhcmUgb3RoZXIgY2hlY2tib3hlcyBpbiB0aGUgZm9ybS5cbiAgICAgICAgICAgICAgICAvLyBJZiB3ZSdyZSBub3QgZ3JvdXBlZCwgYXNrIHRoZW0gdG8gZXhhbWluZSBpdFxuICAgICAgICAgICAgICAgIGlmIChjdHhHcm91cCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF9sb25lY2hlY2tib3hcIiwgW2N0eFR5cGVdKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzX2dyb3VwZWRcIiwgW2N0eFR5cGVdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFdlIHNoYXJlIGEgbmFtZSB3aXRoIGFub3RoZXIgc2ltaWxhciBjb250cm9sLiBBcmUgd2UgZ3JvdXBlZCB0b2dldGhlcj9cbiAgICAgICAgICAgICAgICBpZiAoY3R4R3JvdXAgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZvcm1DYWNoZS5uYW1lVG9Hcm91cFtjdHhOYW1lXSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UncmUgbm90IGdyb3VwZWQsIGJ1dCBzb21lIGNvbnRyb2wgd2l0aCB0aGUgc2FtZSBuYW1lIGlzIGluIGEgZ3JvdXBcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfbm90Z3JvdXBlZG90aGVyZ3JvdXBlZFwiLCBbY3R4VHlwZSwgY3R4TmFtZV0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm9uZSBvZiB1cyBhcmUgZ3JvdXBlZFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9ub3Rncm91cGVkb3RoZXJub3Rncm91cGVkXCIsIFtjdHhUeXBlLCBjdHhOYW1lXSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZm9ybUNhY2hlLm5hbWVUb0dyb3VwW2N0eE5hbWVdICE9PSBjdHhHcm91cCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBXZSdyZSBub3QgaW4gdGhlIG1haW4gZ3JvdXAgd2l0aCB0aGUgb3RoZXJzXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfbm90c2FtZWdyb3VwXCIsIFtjdHhUeXBlLCBjdHhOYW1lXSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gV2UncmUgYWxsIGdyb3VwZWQgdXAhXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NfZ3JvdXBlZFwiLCBbY3R4VHlwZV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGlucHV0X2ZpZWxkc19ncm91cGVkOiBSdWxlID0ge1xuICAgIGlkOiBcImlucHV0X2ZpZWxkc19ncm91cGVkXCIsXG4gICAgY29udGV4dDogXCJkb206aW5wdXQsIGRvbTp0ZXh0YXJlYSwgZG9tOnNlbGVjdFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0lucHV0X0luRmllbGRTZXRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiaW5wdXRfZmllbGRzX2dyb3VwZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcImlucHV0X2ZpZWxkc19ncm91cGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpbnB1dF9maWVsZHNfZ3JvdXBlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVXNlIHRoZSA8ZmllbGRzZXQ+IGVsZW1lbnQgdG8gZ3JvdXAgbG9naWNhbGx5IHJlbGF0ZWQgaW5wdXQgZWxlbWVudHNcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJHcm91cHMgb2YgbG9naWNhbGx5IHJlbGF0ZWQgaW5wdXQgZWxlbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCB3aXRoaW4gYSA8ZmllbGRzZXQ+IGVsZW1lbnRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy8gRG9uJ3QgdHJpZ2dlciBmb3Igb3RoZXIgaW5wdXQgdHlwZXMgb3IgaWYgd2UncmUgaW4gYSBmaWVsZHNldFxuICAgICAgICBpZiAocnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSBcImlucHV0XCIgJiYgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidHlwZVwiKSkge1xuICAgICAgICAgICAgbGV0IHR5cGUgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBpZiAodHlwZSAhPSBcInRleHRcIiAmJiB0eXBlICE9IFwiZmlsZVwiICYmIHR5cGUgIT0gXCJwYXNzd29yZFwiKVxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgXCJmaWVsZHNldFwiKSAhPSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuXG4gICAgICAgIC8vIE5vIGZpZWxkc2V0IC0gc2VlIGlmIHRoaXMgaW5wdXQgaXMgYWxsIGJ5IGl0c2VsZiAtIG5vIG5lZWQgdG8gZ3JvdXAgc2luZ2xlIGlucHV0c1xuICAgICAgICBsZXQgcGFyZW50ID0gQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgW1wiZm9ybVwiLCBcImJvZHlcIl0pO1xuICAgICAgICBsZXQgY2hlY2tUeXBlcyA9IFtcImlucHV0XCIsIFwidGV4dGFyZWFcIiwgXCJzZWxlY3RcIl07XG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBwYXNzZWQgJiYgaSA8IGNoZWNrVHlwZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGxldCBjb250cm9scyA9IHBhcmVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShjaGVja1R5cGVzW2ldKTtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBwYXNzZWQgJiYgaiA8IGNvbnRyb2xzLmxlbmd0aDsgKytqKSB7XG5cbiAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgbm9kZSBzaG91bGQgYmUgc2tpcHBlZCBvciBub3QgYmFzZWQgb24gdGhlIENoZWNrIEhpZGRlbiBDb250ZW50IHNldHRpbmcgYW5kIGlmIHRoZSBub2RlIGlzVmlzaWJsZSBvclxuICAgICAgICAgICAgICAgIC8vIG5vdC5cbiAgICAgICAgICAgICAgICBpZiAoQ29tbW9uVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKGNvbnRyb2xzW2pdKSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGV4dGFyZWFzIGFuZCBzZWxlY3RzIHdpbGwgYmUgY2FsbGVkIHR5cGU9J3RleHQnXG4gICAgICAgICAgICAgICAgbGV0IHR5cGUgPSBjb250cm9sc1tqXS5oYXNBdHRyaWJ1dGUoXCJ0eXBlXCIpID8gY29udHJvbHNbal0uZ2V0QXR0cmlidXRlKFwidHlwZVwiKS50b0xvd2VyQ2FzZSgpIDogXCJ0ZXh0XCI7XG4gICAgICAgICAgICAgICAgLy8gT25seSBmYWlsIGlmIHRoaXMgaXMgYW5vdGhlciBjb250cm9sIGluIHRoZSBmb3JtIGFuZCBpdHMgdHlwZSBpcyBhbm90aGVyIHRleHQtbGlrZSBpbnB1dFxuICAgICAgICAgICAgICAgIHBhc3NlZCA9IGNvbnRyb2xzW2pdID09IHJ1bGVDb250ZXh0IHx8ICh0eXBlICE9IFwidGV4dFwiICYmIHR5cGUgIT0gXCJwYXNzd29yZFwiICYmIHR5cGUgIT0gXCJmaWxlXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgaW5wdXRfaGFzcG9wdXBfY29uZmxpY3Q6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaW5wdXRfaGFzcG9wdXBfY29uZmxpY3RcIixcbiAgICBjb250ZXh0OiBcImRvbTppbnB1dFtsaXN0XVthcmlhLWhhc3BvcHVwXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiaW5wdXRfaGFzcG9wdXBfaW52YWxpZFwiOiB7XG4gICAgICAgICAgICAvLyBcIlBhc3NcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwicG90ZW50aWFsX3R5cGVfbWlzdXNlXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8yXCI6IFwicG90ZW50aWFsX21pc3VzZVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpbnB1dF9oYXNwb3B1cF9jb25mbGljdC5odG1sXCIsXG4gICAgICAgICAgICAvLyBcInBhc3NcIjogXCJpbnB1dF9oYXNwb3B1cF9jb25mbGljdC5odG1sXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF90eXBlX21pc3VzZVwiOiBcImlucHV0X2hhc3BvcHVwX2NvbmZsaWN0Lmh0bWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX21pc3VzZVwiOiBcImlucHV0X2hhc3BvcHVwX2NvbmZsaWN0Lmh0bWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX2xpc3Rfbm90ZXhpc3RcIjogXCJpbnB1dF9oYXNwb3B1cF9jb25mbGljdC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfaW52YWxpZF9saXN0X3R5cGVcIjogXCJpbnB1dF9oYXNwb3B1cF9jb25mbGljdC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfaW52YWxpZF9saXN0X2VsZW1cIjogXCJpbnB1dF9oYXNwb3B1cF9jb25mbGljdC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiPGlucHV0PiBlbGVtZW50IHdpdGggYSAnbGlzdCcgYXR0cmlidXRlIHNob3VsZCBub3QgdXNlIGFuIGV4cGxpY2l0ICdhcmlhLWhhc3BvcHVwJyBhdHRyaWJ1dGVcIixcbiAgICAgICAgICAgIC8vIFwicGFzc1wiOiBcIlRoZSA8aW5wdXQ+IGVsZW1lbnQgd2l0aCBhICdsaXN0JyBhdHRyaWJ1dGUgZG9lcyBub3QgdXNlIGFuIGV4cGxpY2l0ICdhcmlhLWhhc3BvcHVwJyBhdHRyaWJ1dGVcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX3R5cGVfbWlzdXNlXCI6IFwiVGhlIDxpbnB1dD4gZWxlbWVudCB3aXRoIHR5cGUgXFxcInswfVxcXCIgYW5kICdsaXN0JyBhdHRyaWJ1dGUgdXNlcyBhbiBleHBsaWNpdCAnYXJpYS1oYXNwb3B1cCcgYXR0cmlidXRlXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9taXN1c2VcIjogXCJUaGUgPGlucHV0PiBlbGVtZW50IHdpdGggYSBtaXNzaW5nIG9yIGludmFsaWQgdHlwZSBhbmQgJ2xpc3QnIGF0dHJpYnV0ZSB1c2VzIGFuIGV4cGxpY2l0ICdhcmlhLWhhc3BvcHVwJyBhdHRyaWJ1dGVcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX2xpc3Rfbm90ZXhpc3RcIjogXCJUaGUgbGlzdCBhdHRyaWJ1dGUgZm9yIHRoZSA8aW5wdXQ+IGVsZW1lbnQgaXMgaW52YWxpZFwiLFxuICAgICAgICAgICAgXCJmYWlsX2ludmFsaWRfbGlzdF90eXBlXCI6IFwiVGhlIGxpc3QgYXR0cmlidXRlIGZvciB0aGUgPGlucHV0PiBlbGVtZW50IHdpdGggdGhlIHR5cGUgXFxcInswfVxcXCIgaXMgaW52YWxpZFwiLFxuICAgICAgICAgICAgXCJmYWlsX2ludmFsaWRfbGlzdF9lbGVtXCI6IFwiVGhlIGxpc3QgYXR0cmlidXRlIGZvciB0aGUgPGlucHV0PiBlbGVtZW50IGRvZXMgbm90IHJlZmVyZW5jZSBhIGRhdGFsaXN0IGVsZW1lbnRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG5cbiAgICAgICAgLy9za2lwIGlmIHRoZSBmaWVsZHNldCBpcyBoaWRkZW4gb3IgZGlzYWJsZWRcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSB8fCBDb21tb25VdGlsLmlzTm9kZURpc2FibGVkKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCByb2xlcyA9IEFyaWFVdGlsLmdldFVzZXJEZWZpbmVkUm9sZXMocnVsZUNvbnRleHQpO1xuICAgICAgICAvLyBsZXQgXCJhcmlhX3JvbGVfdmFsaWRcIiB0byBoYW5kbGUgaW52YWxpZCByb2xlLiBPbmx5IGFsbG93ZWQgcm9sZSBpcyBjb21ib2JveCB3aGljaCBpcyBpbXBsaWNpdC4gXG4gICAgICAgIGlmIChyb2xlcyAmJiByb2xlcy5sZW5ndGggPiAwICYmICFyb2xlcy5pbmNsdWRlcygnY29tYm9ib3gnKSkgXG4gICAgICAgICAgICByZXR1cm4gbnVsbDsgICAgICAgICBcblxuICAgICAgICAvL3RyaWdnZXJpbmcgaW5wdXQgdHlwZXM6IHRleHQsIHNlYXJjaCwgdGVsLCB1cmwsIGVtYWlsLCBvciBtaXNzaW5nIG9yIGludmFsaWQgXG4gICAgICAgIGxldCB5ZXNUeXBlcyA9IFtcInRleHRcIiwgXCJzZWFyY2hcIiwgXCJ0ZWxcIiwgXCJ1cmxcIiwgXCJlbWFpbFwiLCBcImRhdGVcIiwgXCJtb250aFwiLCBcIndlZWtcIiwgXCJ0aW1lXCIsIFwiZGF0ZXRpbWUtbG9jYWxcIiwgXCJudW1iZXJcIiwgXCJyYW5nZVwiLCBcImNvbG9yXCJdO1xuICAgICAgICBsZXQgbm9UeXBlcyA9IFtcImZpbGVcIiwgXCJwYXNzd29yZFwiLCBcImNoZWNrYm94XCIsIFwicmFkaW9cIiwgXCJzdWJtaXRcIiwgXCJyZXNldFwiLCBcImltYWdlXCIsIFwiaGlkZGVuXCIsIFwiYnV0dG9uXCJdO1xuXG4gICAgICAgIGxldCBhdHRyVmFsdWUgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpO1xuICAgICAgICAvL21pc3NpbmcgaW5wdXQgdHlwZSBmb3IgbGlzdCBidXQgd2l0aCBhcmlhX2hhc19wb3B1cFxuICAgICAgICBpZiAoIWF0dHJWYWx1ZSB8fCBhdHRyVmFsdWUudHJpbSgpLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX21pc3VzZVwiKTtcblxuICAgICAgICBhdHRyVmFsdWUgPSBhdHRyVmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIC8vaW52YWxpZCBpbnB1dCB0eXBlcyBmb3IgbGlzdCBidXQgd2l0aCBhcmlhX2hhc19wb3B1cFxuICAgICAgICBpZiAoIXllc1R5cGVzLmluY2x1ZGVzKGF0dHJWYWx1ZSkgJiYgIW5vVHlwZXMuaW5jbHVkZXMoYXR0clZhbHVlKSlcbiAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX21pc3VzZVwiKTtcblxuICAgICAgICAvLyB0aGUgbGlzdCBhdHRyaWJ1dGUgaXMgdXNlZCBmb3Igd3JvbmcgaW5wdXQgdHlwZVxuICAgICAgICBpZiAoYXR0clZhbHVlICYmIG5vVHlwZXMuaW5jbHVkZXMoYXR0clZhbHVlKSlcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfaW52YWxpZF9saXN0X3R5cGVcIik7XG5cbiAgICAgICAgbGV0IGxpc3QgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJsaXN0XCIpO1xuICAgICAgICAvLyB0aGUgbGlzdCBhdHRyaWJ1dGUgaXMgYmxhbmtcbiAgICAgICAgaWYgKCFsaXN0IHx8IGxpc3QudHJpbSgpLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX2xpc3Rfbm90ZXhpc3RcIik7XG5cbiAgICAgICAgbGV0IGxpc3RFbGVtID0gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5nZXRFbGVtZW50QnlJZChsaXN0KTtcbiAgICAgICAgLy8gdGhlIGxpc3QgZWxlbWVudCBkb2Vzbid0IGV4aXN0XG4gICAgICAgIGlmICghbGlzdEVsZW0pXG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJwb3RlbnRpYWxfbGlzdF9ub3RleGlzdFwiKTtcblxuICAgICAgICAvLyB0aGUgbGlzdCBlbGVtZW50IGlzIG5vdCBhIGRhdGFsaXN0IGVsZW1lbnRcbiAgICAgICAgaWYgKGxpc3RFbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgIT09ICdkYXRhbGlzdCcpXG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2ludmFsaWRfbGlzdF9lbGVtXCIpO1xuXG4gICAgICAgIC8vIHZhbGlkIGlucHV0IHR5cGVzIGZvciBsaXN0IGJ1dCB3aXRoIGFyaWFfaGFzX3BvcHVwICAgIFxuICAgICAgICBpZiAoeWVzVHlwZXMuaW5jbHVkZXMoYXR0clZhbHVlKSlcbiAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX3R5cGVfbWlzdXNlXCIsIFthdHRyVmFsdWVdKTtcbiAgICAgICAgXG4gICAgICAgIC8vIHNob3VsZG4ndCBnZXQgaGVyZSBcbiAgICAgICAgICAgIHJldHVybjtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGlucHV0X2xhYmVsX2FmdGVyOiBSdWxlID0ge1xuICAgIGlkOiBcImlucHV0X2xhYmVsX2FmdGVyXCIsXG4gICAgY29udGV4dDogXCJkb206aW5wdXRcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9JbnB1dF9MYWJlbEFmdGVyXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJGYWlsXzJcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImlucHV0X2xhYmVsX2FmdGVyLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiaW5wdXRfbGFiZWxfYWZ0ZXIuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJpbnB1dF9sYWJlbF9hZnRlci5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiaW5wdXRfbGFiZWxfYWZ0ZXIuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJDaGVja2JveCBvciByYWRpbyBidXR0b24gaXMgbmVzdGVkIGluIGxhYmVsLCBzbyBsYWJlbCBpcyBub3QgYWZ0ZXIgdGhlIGlucHV0IGNvbnRyb2xcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiTGFiZWwgdGV4dCBpcyBsb2NhdGVkIGJlZm9yZSBpdHMgYXNzb2NpYXRlZCBjaGVja2JveCBvciByYWRpbyBidXR0b24gZWxlbWVudFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkNoZWNrYm94ZXMgYW5kIHJhZGlvIGJ1dHRvbnMgbXVzdCBoYXZlIGEgbGFiZWwgYWZ0ZXIgdGhlIGlucHV0IGNvbnRyb2xcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjMuMy4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCB0eXBlID0gXCJcIjtcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInR5cGVcIikpXG4gICAgICAgICAgICB0eXBlID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidHlwZVwiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAodHlwZSAhPSBcImNoZWNrYm94XCIgJiYgdHlwZSAhPSBcInJhZGlvXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IG9ubHkgdGhlIG5vbi1oaWRkZW4gbGFiZWxzIGZvciBlbGVtZW50XG4gICAgICAgIGxldCBsYWJlbEVsZW0gPSBDb21tb25VdGlsLmdldExhYmVsRm9yRWxlbWVudEhpZGRlbihydWxlQ29udGV4dCwgdHJ1ZSk7XG4gICAgICAgIGlmIChsYWJlbEVsZW0gPT09IG51bGwgfHwgIUNvbW1vblV0aWwuaGFzSW5uZXJDb250ZW50SGlkZGVuKGxhYmVsRWxlbSkpIHtcbiAgICAgICAgICAgIC8vIER1ZSB0byBkZXBlbmRlbmN5LCBsYWJlbCBtdXN0IGJlIGRvbmUgdmlhIHRpdGxlIC0gdGhpcyBydWxlIGRvZXNuJ3QgYXBwbHlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGxldCB2YWx1ZSA9IENvbW1vblV0aWwuY29tcGFyZU5vZGVPcmRlcihsYWJlbEVsZW0sIHJ1bGVDb250ZXh0KTtcbiAgICAgICAgbGV0IHBhc3NlZDtcbiAgICAgICAgaWYgKHZhbHVlID09PSAtMikge1xuICAgICAgICAgICAgLy8gaW5wdXQgbmVzdGVkIGluIGxhYmVsXG4gICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCB3YWxrTm9kZSA9IG5ldyBET01XYWxrZXIobGFiZWxFbGVtKTtcbiAgICAgICAgICAgIHdhbGtOb2RlLm5vZGUgPSBydWxlQ29udGV4dDtcbiAgICAgICAgICAgIHdoaWxlICghcGFzc2VkICYmIHdhbGtOb2RlLm5leHROb2RlKCkpIHtcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSAoKHdhbGtOb2RlLm5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCIjdGV4dFwiICYmIHdhbGtOb2RlLm5vZGUubm9kZVZhbHVlLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICB8fCAod2Fsa05vZGUubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInNwYW5cIiAmJiB3YWxrTm9kZS5ub2RlLnRleHRDb250ZW50LnRyaW0oKS5sZW5ndGggPiAwKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgIC8vIElucHV0IG5lc3RlZCBpbiBsYWJlbCBhbmQgdGV4dCBiZWZvcmUgaW5wdXRcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodmFsdWUgIT0gMSkge1xuICAgICAgICAgICAgICAgIC8vIGxhYmVsIGlzIGJlZm9yZSBpbnB1dFxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGlucHV0X2xhYmVsX2JlZm9yZTogUnVsZSA9IHtcbiAgICBpZDogXCJpbnB1dF9sYWJlbF9iZWZvcmVcIixcbiAgICBjb250ZXh0OiBcImRvbTppbnB1dCwgZG9tOnRleHRhcmVhLCBkb206c2VsZWN0XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfSW5wdXRfTGFiZWxCZWZvcmVcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkZhaWxfMlwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiaW5wdXRfbGFiZWxfYmVmb3JlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiaW5wdXRfbGFiZWxfYmVmb3JlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiaW5wdXRfbGFiZWxfYmVmb3JlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpbnB1dF9sYWJlbF9iZWZvcmUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUZXh0IGlucHV0IGlzIG5lc3RlZCBpbiBsYWJlbCBzdWNoIHRoYXQgaW5wdXQgcHJlY2VkZXMgdGhlIGxhYmVsIHRleHRcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiTGFiZWwgdGV4dCBpcyBsb2NhdGVkIGFmdGVyIGl0cyBhc3NvY2lhdGVkIHRleHQgaW5wdXQgb3IgPHNlbGVjdD4gZWxlbWVudFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRleHQgaW5wdXRzIGFuZCA8c2VsZWN0PiBlbGVtZW50cyBtdXN0IGhhdmUgYSBsYWJlbCBiZWZvcmUgdGhlIGlucHV0IGNvbnRyb2xcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjMuMy4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmIChydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09IFwiaW5wdXRcIiAmJiBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0eXBlXCIpKSB7XG4gICAgICAgICAgICBsZXQgdHlwZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInR5cGVcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIGlmICh0eXBlICE9IFwidGV4dFwiICYmIHR5cGUgIT0gXCJmaWxlXCIgJiYgdHlwZSAhPSBcInBhc3N3b3JkXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdldCBvbmx5IHRoZSBub24taGlkZGVuIGxhYmVscyBmb3IgZWxlbWVudFxuICAgICAgICBsZXQgbGFiZWxFbGVtID0gQ29tbW9uVXRpbC5nZXRMYWJlbEZvckVsZW1lbnRIaWRkZW4ocnVsZUNvbnRleHQsIHRydWUpO1xuICAgICAgICBcbiAgICAgICAgaWYgKGxhYmVsRWxlbSA9PSBudWxsIHx8ICFDb21tb25VdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbihsYWJlbEVsZW0pKSB7XG4gICAgICAgICAgICAvLyBEdWUgdG8gZGVwZW5kZW5jeSwgbGFiZWwgbXVzdCBiZSBkb25lIHZpYSB0aXRsZSAtIHRoaXMgcnVsZSBkb2Vzbid0IGFwcGx5XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB2YWx1ZSA9IENvbW1vblV0aWwuY29tcGFyZU5vZGVPcmRlcihsYWJlbEVsZW0sIHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKHZhbHVlID09PSAtMikge1xuICAgICAgICAgICAgLy8gaWdub3JlIGlmIG5vIGxhYmVsIG9yIHRoZSBjb250ZW50IGZvciB0aGUgbGFiZWwgaXMgb25seSBmcm9tIHRoZSBuZXN0ZWQgaW5wdXQgY29udHJvbCBcbiAgICAgICAgICAgIGxldCB0ZXh0ID0gQ29tbW9uVXRpbC5nZXRJbm5lclRleHQocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgaWYgKHRleHQgJiYgdGV4dC50cmltKCkubGVuZ3RoID4gMCAmJiBDb21tb25VdGlsLmdldElubmVyVGV4dChydWxlQ29udGV4dCkudHJpbSgpID09PSB0ZXh0LnRyaW0oKSkge1xuICAgICAgICAgICAgICAgIC8vIER1ZSB0byBkZXBlbmRlbmN5LCBsYWJlbCBtdXN0IGJlIGRvbmUgdmlhIHRpdGxlIC0gdGhpcyBydWxlIGRvZXNuJ3QgYXBwbHlcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaW5wdXQgbmVzdGVkIGluIGxhYmVsXG4gICAgICAgICAgICBsZXQgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgd2Fsa05vZGUgPSBydWxlQ29udGV4dC5wcmV2aW91c1NpYmxpbmc7XG4gICAgICAgICAgICB3aGlsZSAoIXBhc3NlZCAmJiB3YWxrTm9kZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9ICgod2Fsa05vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSBcIiN0ZXh0XCIgJiYgd2Fsa05vZGUubm9kZVZhbHVlLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICB8fCAod2Fsa05vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSBcInNwYW5cIiAmJiB3YWxrTm9kZS50ZXh0Q29udGVudC50cmltKCkubGVuZ3RoID4gMCkpO1xuICAgICAgICAgICAgICAgIHdhbGtOb2RlID0gd2Fsa05vZGUucHJldmlvdXNTaWJsaW5nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBJbnB1dCBuZXN0ZWQgaW4gbGFiZWwgYW5kIHRleHQgYWZ0ZXIgaW5wdXRcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodmFsdWUgIT0gLTEpIHtcbiAgICAgICAgICAgICAgICAvLyBsYWJlbCBpcyBhZnRlciBpbnB1dFxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBIYXZlbid0IHJldHVybmVkIHlldCwgdGhlbiBJIHBhc3NcbiAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5pbXBvcnQgeyBBY2NOYW1lVXRpbCB9IGZyb20gXCIuLi91dGlsL0FjY05hbWVVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBpbnB1dF9sYWJlbF9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaW5wdXRfbGFiZWxfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmJ1dHRvbixhcmlhOmNoZWNrYm94LGFyaWE6Y29tYm9ib3gsYXJpYTpsaXN0Ym94LGFyaWE6bWVudWl0ZW1jaGVja2JveCxhcmlhOm1lbnVpdGVtcmFkaW8sYXJpYTpyYWRpbyxhcmlhOnNlYXJjaGJveCxhcmlhOnNsaWRlcixhcmlhOnNwaW5idXR0b24sYXJpYTpzd2l0Y2gsYXJpYTp0ZXh0Ym94LGFyaWE6cHJvZ3Jlc3NiYXIsZG9tOmlucHV0W3R5cGU9ZmlsZV0sZG9tOm91dHB1dCxkb206bWV0ZXIsZG9tOmlucHV0W3R5cGU9cGFzc3dvcmRdXCIsXG4gICAgLy9kZXBlbmRlbmNpZXM6IFtcImFyaWFfcm9sZV9yZWR1bmRhbnRcIiwgXCJhcmlhX3JvbGVfdmFsaWRcIl0sXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfSW5wdXRfRXhwbGljaXRMYWJlbFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiRmFpbF8yXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJpbnB1dF9sYWJlbF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJpbnB1dF9sYWJlbF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJpbnB1dF9sYWJlbF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImlucHV0X2xhYmVsX2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZvcm0gY29udHJvbCBlbGVtZW50IDx7MH0+IGhhcyBubyBhc3NvY2lhdGVkIGxhYmVsXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkZvcm0gY29udHJvbCB3aXRoIFxcXCJ7MH1cXFwiIHJvbGUgaGFzIG5vIGFzc29jaWF0ZWQgbGFiZWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFYWNoIGZvcm0gY29udHJvbCBtdXN0IGhhdmUgYW4gYXNzb2NpYXRlZCBsYWJlbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sIC8qIHJlbW92ZSAxLjEuMSBtYXBwaW5nLCBrZWVwIDQuMS4yICovXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIC8vIFRPRE86IEFDVDogaHR0cHM6Ly9naXRodWIuY29tL0lCTWEvZXF1YWwtYWNjZXNzL2lzc3Vlcy83NTZcbiAgICBhY3Q6IFtcIjk3YTRlMVwiLCBcImUwODZlNVwiXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAvL2lnbm9yZSBkYXRhbGlzdCBlbGVtZW50IGNoZWNrIHNpbmNlIGl0IHdpbGwgYmUgcGFydCBvZiBhIGlucHV0IGVsZW1lbnQgb3IgaGlkZGVuIGJ5IGRlZmF1bHRcbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSAnZGF0YWxpc3QnKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICAvLyBEZXRlcm1pbmUgdGhlIGlucHV0IHR5cGVcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGxldCB0eXBlID0gXCJ0ZXh0XCI7XG4gICAgICAgIGlmIChub2RlTmFtZSA9PSBcImlucHV0XCIgJiYgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidHlwZVwiKSkge1xuICAgICAgICAgICAgdHlwZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInR5cGVcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgfSBlbHNlIGlmIChub2RlTmFtZSA9PT0gXCJidXR0b25cIiB8fCBBcmlhVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MocnVsZUNvbnRleHQsIFwiYnV0dG9uXCIpKSB7XG4gICAgICAgICAgICB0eXBlID0gXCJidXR0b25lbGVtXCI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGVOYW1lID09IFwiaW5wdXRcIiAmJiB0eXBlID09IFwiXCIpIHtcbiAgICAgICAgICAgIHR5cGUgPSBcInRleHRcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZSA9PT0gXCJpbWFnZVwiKSB7XG4gICAgICAgICAgICAvLyBIYW5kbGVkIGJ5IGlucHV0X2xhYmVsX2V4aXN0c0ltYWdlXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuLyoqIFxuICAgICAgICBsZXQgUE9GID0gLTE7XG4gICAgICAgIGxldCB0ZXh0VHlwZXMgPSBDb21tb25VdGlsLmlucHV0X3RleHRfdHlwZXM7XG4gICAgICAgIGxldCBidXR0b25UeXBlcyA9IENvbW1vblV0aWwuZm9ybV9idXR0b25fdHlwZXM7ICBcbiAgICAgICBcbiAgICAgICAgbGV0IGJ1dHRvblR5cGVzV2l0aERlZmF1bHRzID0gW1wicmVzZXRcIiwgXCJzdWJtaXRcIl07IC8vICdzdWJtaXQnIGFuZCAncmVzZXQnIGhhdmUgdmlzaWJsZSBkZWZhdWx0cy5cbiAgICAgICAgaWYgKHRleHRUeXBlcy5pbmRleE9mKHR5cGUpICE9PSAtMSkgeyAvLyBJZiB0eXBlIGlzIGluIHRoZSBsaXN0XG4gICAgICAgICAgICAvLyBHZXQgb25seSB0aGUgbm9uLWhpZGRlbiBsYWJlbHMgZm9yIGVsZW1lbnRzLCBpbiB0aGUgY2FzZSB0aGF0IGEgbGFiZWwgaXMgaGlkZGVuIHRoZW4gaXQgaXMgYSB2aW9sYXRpb25cbiAgICAgICAgICAgIC8vIE5vdGU6IGxhYmVsW2Zvcl0gZG9lcyBub3Qgd29yayBmb3IgQVJJQSBkZWZpbmVkIGlucHV0c1xuICAgICAgICAgICAgbGV0IGxhYmVsRWxlbSA9IHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInJvbGVcIikgPyBudWxsIDogQ29tbW9uVXRpbC5nZXRMYWJlbEZvckVsZW1lbnRIaWRkZW4ocnVsZUNvbnRleHQsIHRydWUpO1xuICAgICAgICAgICAgbGV0IGhhc0xhYmVsRWxlbUNvbnRlbnQgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChsYWJlbEVsZW0pIHtcbiAgICAgICAgICAgICAgICBpZiAoQ29tbW9uVXRpbC5oYXNJbm5lckNvbnRlbnRIaWRkZW4obGFiZWxFbGVtKSkge1xuICAgICAgICAgICAgICAgICAgICBoYXNMYWJlbEVsZW1Db250ZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChsYWJlbEVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKSB8fCBcIlwiKS50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBoYXNMYWJlbEVsZW1Db250ZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxhYmVsRWxlbS5oYXNBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsbGVkYnlcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsbGVkQnlFbGVtID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQobGFiZWxFbGVtLCBsYWJlbEVsZW0uZ2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsbGVkYnknKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsYWJlbGxlZEJ5RWxlbSAmJiAhRE9NVXRpbC5zYW1lTm9kZShsYWJlbGxlZEJ5RWxlbSwgbGFiZWxFbGVtKSAmJiBDb21tb25VdGlsLmhhc0lubmVyQ29udGVudChsYWJlbGxlZEJ5RWxlbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhc0xhYmVsRWxlbUNvbnRlbnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGFzc2VkID0gKCEhbGFiZWxFbGVtICYmIGhhc0xhYmVsRWxlbUNvbnRlbnQpIHx8XG4gICAgICAgICAgICAgICAgKCFsYWJlbEVsZW0gJiYgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJ0aXRsZVwiKSB8fCBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInBsYWNlaG9sZGVyXCIpKSB8fFxuICAgICAgICAgICAgICAgIEFyaWFVdGlsLmdldEFyaWFMYWJlbChydWxlQ29udGV4dCkudHJpbSgpLmxlbmd0aCA+IDAgfHwgQ29tbW9uVXRpbC5oYXNJbXBsaWNpdExhYmVsKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgIGlmICghcGFzc2VkKSBQT0YgPSAyICsgdGV4dFR5cGVzLmluZGV4T2YodHlwZSk7XG4gICAgICAgICAgICBcbiAgICAgICAgfSBlbHNlIGlmIChidXR0b25UeXBlcy5pbmRleE9mKHR5cGUpICE9PSAtMSkgeyAvLyBJZiB0eXBlIGlzIGEgYnV0dG9uXG4gICAgICAgICAgICBpZiAoYnV0dG9uVHlwZXNXaXRoRGVmYXVsdHMuaW5kZXhPZih0eXBlKSAhPT0gLTEgJiYgIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInZhbHVlXCIpKSB7XG4gICAgICAgICAgICAgICAgLy8gJ3N1Ym1pdCcgYW5kICdyZXNldCcgaGF2ZSB2aXNpYmxlIGRlZmF1bHRzIHNvIHBhc3MgaWYgdGhlcmUgaXMgbm8gJ3ZhbHVlJyBhdHRyaWJ1dGVcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInZhbHVlXCIpIHx8IEFyaWFVdGlsLmhhc0FyaWFMYWJlbChydWxlQ29udGV4dCkgfHwgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJ0aXRsZVwiKTtcbiAgICAgICAgICAgICAgICBpZiAoIXBhc3NlZCkgUE9GID0gMiArIHRleHRUeXBlcy5sZW5ndGggKyBidXR0b25UeXBlcy5pbmRleE9mKHR5cGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gXCJidXR0b25lbGVtXCIpIHtcbiAgICAgICAgICAgIC8vIElmIEkgYW0gYW4gaW1hZ2UgYW5kIEkgaGF2ZSBhbHQgdGV4dCAtIGFjY2Vzc2liaWxpdHktd2ViLWVuZ2luZSMyNjlcbiAgICAgICAgICAgIGxldCBiQWx0ID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbWdcIiAmJiBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhbHRcIikpIHtcbiAgICAgICAgICAgICAgICBsZXQgYWx0ID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYWx0XCIpO1xuICAgICAgICAgICAgICAgIGlmIChhbHQudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBiQWx0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYkFsdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHBhc3NlZCA9IENvbW1vblV0aWwuaGFzSW5uZXJDb250ZW50SGlkZGVuKHJ1bGVDb250ZXh0KSB8fCBBcmlhVXRpbC5oYXNBcmlhTGFiZWwocnVsZUNvbnRleHQpIHx8IGJBbHQgfHwgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJ0aXRsZVwiKTtcblxuICAgICAgICAgICAgaWYgKCFwYXNzZWQpIFBPRiA9IDIgKyB0ZXh0VHlwZXMubGVuZ3RoICsgYnV0dG9uVHlwZXMubGVuZ3RoICsgMTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vY2hlY2sgaWYgYSBuYXRpdmUgYnV0dG9uIGlzIGxhYmVsbGVkXG4gICAgICAgIGlmICghcGFzc2VkICYmIG5vZGVOYW1lID09IFwiYnV0dG9uXCIpIHtcbiAgICAgICAgICAgICBpZiAoQ29tbW9uVXRpbC5oYXNJbXBsaWNpdExhYmVsKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBsYWJlbCA9IENvbW1vblV0aWwuZ2V0TGFiZWxGb3JFbGVtZW50KHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgICAgICBpZiAobGFiZWwgJiYgQ29tbW9uVXRpbC5oYXNJbm5lckNvbnRlbnRIaWRkZW4obGFiZWwpKVxuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSB0cnVlOyAgICBcbiAgICAgICAgICAgICB9ICAgIFxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUnB0X0FyaWFfVmFsaWRJZFJlZiBkZXRlcm1pbmVzIGlmIHRoZSBhcmlhLWxhYmVsbGVkYnkgaWQgcG9pbnRzIHRvIGEgdmFsaWQgZWxlbWVudFxuICAgICAgICBpZiAoIXBhc3NlZCAmJiAoYnV0dG9uVHlwZXMuaW5kZXhPZih0eXBlKSAhPT0gLTEpKSB7XG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiY2xhc3NcIikgJiYgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiY2xhc3NcIikgPT0gXCJkaWppdE9mZlNjcmVlblwiICYmIERPTVdhbGtlci5wYXJlbnRFbGVtZW50KHJ1bGVDb250ZXh0KS5oYXNBdHRyaWJ1dGUoXCJ3aWRnZXRpZFwiKSkge1xuICAgICAgICAgICAgICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIGRpaml0IGJ1dHRvbnNcbiAgICAgICAgICAgICAgICBsZXQgbGFiZWxJZCA9IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KHJ1bGVDb250ZXh0KS5nZXRBdHRyaWJ1dGUoXCJ3aWRnZXRpZFwiKSArIFwiX2xhYmVsXCI7XG4gICAgICAgICAgICAgICAgbGV0IGxhYmVsID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQocnVsZUNvbnRleHQsIGxhYmVsSWQpO1xuICAgICAgICAgICAgICAgIGlmIChsYWJlbCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IENvbW1vblV0aWwuaGFzSW5uZXJDb250ZW50SGlkZGVuKGxhYmVsKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBtZWFucyBJIGZhaWxlZCBhYm92ZSBhbHNvXG4gICAgICAgICAgICAgICAgICAgIGlmICghcGFzc2VkKSBQT0YgPSAyICsgdGV4dFR5cGVzLmxlbmd0aCArIGJ1dHRvblR5cGVzLmxlbmd0aCArIDQgKyBidXR0b25UeXBlcy5pbmRleE9mKHR5cGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcGFzc2VkICYmIG5vZGVOYW1lID09IFwib3B0Z3JvdXBcIikge1xuICAgICAgICAgICAgcGFzc2VkID0gQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJsYWJlbFwiKTtcbiAgICAgICAgICAgIGlmICghcGFzc2VkKSBQT0YgPSAyICsgdGV4dFR5cGVzLmxlbmd0aCArIGJ1dHRvblR5cGVzLmxlbmd0aCArIDI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFwYXNzZWQgJiYgbm9kZU5hbWUgPT0gXCJvcHRpb25cIikge1xuICAgICAgICAgICAgLy8gSXMgYSBub24tZW1wdHkgdmFsdWUgYXR0cmlidXRlIGFsc28gZW5vdWdoIGZvciBhbiBvcHRpb24gZWxlbWVudD9cbiAgICAgICAgICAgIHBhc3NlZCA9IENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwibGFiZWxcIikgfHwgcnVsZUNvbnRleHQuaW5uZXJIVE1MLnRyaW0oKS5sZW5ndGggPiAwO1xuICAgICAgICAgICAgaWYgKCFwYXNzZWQpIFBPRiA9IDIgKyB0ZXh0VHlwZXMubGVuZ3RoICsgYnV0dG9uVHlwZXMubGVuZ3RoICsgMztcbiAgICAgICAgfSBcbiAgICAgICAgXG4gICAgICAgIGlmICghcGFzc2VkKVxuICAgICAgICAgICAgcGFzc2VkID0gQXJpYVV0aWwuZ2V0QXJpYUxhYmVsKHJ1bGVDb250ZXh0KS50cmltKCkubGVuZ3RoID4gMCB8fCBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInRpdGxlXCIpO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgLy8gY2hlY2sgYXJpYSByb2xlIHRvIGZpZ3VyZSBvdXQgaWYgdGhlIGFjY2Vzc2libGUgbmFtZSBjYW4gYmUgZnJvbSBjb250ZW50IFxuICAgICAgICAgICAgY29uc3Qgcm9sZXMgPSBBcmlhVXRpbC5nZXRSb2xlcyhydWxlQ29udGV4dCwgdHJ1ZSk7XG4gICAgICAgICAgICAvL3doZW4gbXVsdGlwbGUgcm9sZXMgc3BlY2lmaWVkLCBvbmx5IHRoZSBmaXJzdCB2YWxpZCByb2xlIChndWFyYW50ZWVkIGJ5IGRlcGVuZGVuY2llcykgaXMgYXBwbGllZCwgYW5kIHRoZSBvdGhlcnMganVzdCBhcyBmYWxsYmFja3NcbiAgICAgICAgICAgIGlmIChBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNbcm9sZXNbMF1dICYmIEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlc1swXV0ubmFtZUZyb20gJiYgQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVzWzBdXS5uYW1lRnJvbS5pbmNsdWRlcyhcImNvbnRlbnRzXCIpKVxuICAgICAgICAgICAgICAgIHBhc3NlZCA9IENvbW1vblV0aWwuaGFzSW5uZXJDb250ZW50SGlkZGVuKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgfVxuKi9cbiAgICAgICAgY29uc3QgcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZShydWxlQ29udGV4dCk7XG4gICAgICAgIHBhc3NlZCA9IHBhaXIgJiYgcGFpci5uYW1lICYmIHBhaXIubmFtZS50cmltKCkubGVuZ3RoID4gMDtcblxuICAgICAgICBpZiAocGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH0gZWxzZSBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwicm9sZVwiKSAmJiBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzJcIiwgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwicm9sZVwiKS5zcGxpdChcIiBcIikpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIsIFtub2RlTmFtZV0pO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5pbXBvcnQgeyBET01VdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01VdGlsXCI7XG5pbXBvcnQgeyBBY2NOYW1lVXRpbCB9IGZyb20gXCIuLi91dGlsL0FjY05hbWVVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBpbnB1dF9sYWJlbF92aXNpYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcImlucHV0X2xhYmVsX3Zpc2libGVcIixcbiAgICBjb250ZXh0OiBcImFyaWE6YnV0dG9uLGFyaWE6Y2hlY2tib3gsYXJpYTpjb21ib2JveCxhcmlhOmxpc3Rib3gsYXJpYTptZW51aXRlbWNoZWNrYm94LGFyaWE6bWVudWl0ZW1yYWRpbyxhcmlhOnJhZGlvLGFyaWE6c2VhcmNoYm94LGFyaWE6c2xpZGVyLGFyaWE6c3BpbmJ1dHRvbixhcmlhOnN3aXRjaCxhcmlhOnRleHRib3hcIixcbiAgICBkZXBlbmRlbmNpZXM6IFtcImlucHV0X2xhYmVsX2V4aXN0c1wiXSwgXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfSW5wdXRfVmlzaWJsZUxhYmVsXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcInBvdGVudGlhbF9ub19sYWJlbFwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfcGxhY2Vob2xkZXJfb25seVwiOiBcInBvdGVudGlhbF9wbGFjZWhvbGRlcl9vbmx5XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImlucHV0X2xhYmVsX3Zpc2libGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfcGxhY2Vob2xkZXJfb25seVwiOiBcImlucHV0X2xhYmVsX3Zpc2libGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfbm9fbGFiZWxcIjogXCJpbnB1dF9sYWJlbF92aXNpYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpbnB1dF9sYWJlbF92aXNpYmxlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlRoZSBpbnB1dCBlbGVtZW50IGhhcyBhbiBhc3NvY2lhdGVkIHZpc2libGUgbGFiZWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX3BsYWNlaG9sZGVyX29ubHlcIjogXCJUaGUg4oCYcGxhY2Vob2xkZXLigJkgaXMgdGhlIG9ubHkgdmlzaWJsZSBsYWJlbFwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfbm9fbGFiZWxcIjogXCJUaGUgaW5wdXQgZWxlbWVudCBkb2VzIG5vdCBoYXZlIGFuIGFzc29jaWF0ZWQgdmlzaWJsZSBsYWJlbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkFuIGlucHV0IGVsZW1lbnQgbXVzdCBoYXZlIGFuIGFzc29jaWF0ZWQgdmlzaWJsZSBsYWJlbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi41LjNcIiwgXCIzLjMuMlwiXSwgLy9tYXAgdG8gYm90aCByZXF1aXJlbWVudHMgaW4gaGVscFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIFxuICAgICAgICAvL2lnbm9yZSBkYXRhbGlzdCBlbGVtZW50IGNoZWNrIHNpbmNlIGl0IHdpbGwgYmUgcGFydCBvZiBhIGlucHV0IGVsZW1lbnQgb3IgaGlkZGVuIGJ5IGRlZmF1bHRcbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSAnZGF0YWxpc3QnKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgaWYgKCFWaXNVdGlsLmlzTm9kZVZpc2libGUocnVsZUNvbnRleHQpIHx8IENvbW1vblV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICAvLyBpZiBhIGNvbnRyb2wgaXMgaW4gYSB0YWJsZSBjZWxsLCB0aGUgY29sIGhlYWRlcnMgY2FuIGFjdCBhcyB2aXNpYmxlIGxhYmVsLCB3aGljaCBpcyBjaGVja2VkIGluIHRhYmxlIGhlYWRpbmcgcnVsZVxuICAgICAgICBpZiAoQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgXCJ0YWJsZVwiKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIGN1c3RvbSB3aWRnZXQgc3VibWlzc2lvbiBpcyBub3QgaW4gc2NvcGUgZm9yIHRoaXMgc3VjY2VzcyBjcml0ZXJpYSAoSUJNYS9lcXVhbC1hY2Nlc3MjMjA0KSBpZiBpdCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIGRhdGEgZW50cnlcbiAgICAgICAgbGV0IHJvbGUgPSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAocm9sZSAmJiByb2xlID09PSBcImJ1dHRvblwiICYmIG5vZGVOYW1lICE9PSAnaW5wdXQnICYmIG5vZGVOYW1lICE9PSAnYnV0dG9uJykgeyAgICBcbiAgICAgICAgICAgIC8vIGxpa2VseSBhIGN1c3RvbSB3aWRnZXQsIHNraXAgaWYgbm90IGFzc29jaWF0ZWQgd2l0aCBkYXRhIGVudHJ5XG4gICAgICAgICAgICBpZiAoIUNvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFwiZm9ybVwiKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsgICAgXG4gICAgICAgIH1cblxuICAgICAgICAvLyB3aGVuIGluIGEgY29tYm9ib3gsIG9ubHkgbG9vayBhdCB0aGUgaW5wdXQgdGV4dGJveC5cbiAgICAgICAgaWYgKEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUocnVsZUNvbnRleHQsIFwiY29tYm9ib3hcIikgJiZcbiAgICAgICAgICAgICEoQXJpYVV0aWwuaGFzUm9sZUluU2VtYW50aWNzKHJ1bGVDb250ZXh0LCBcInRleHRib3hcIikgfHwgQXJpYVV0aWwuaGFzUm9sZUluU2VtYW50aWNzKHJ1bGVDb250ZXh0LCBcInNlYXJjaGJveFwiKSB8fFxuICAgICAgICAgICAgICAgIG5vZGVOYW1lID09PSBcImlucHV0XCIgfHwgKG5vZGVOYW1lID09PSBcInNlbGVjdFwiICYmIEFyaWFVdGlsLmhhc1JvbGVJblNlbWFudGljcyhydWxlQ29udGV4dCwgXCJjb21ib2JveFwiKSkpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICAvLyBhdm9pZCBkaWFnbm9zaW5nIHRoZSBwb3B1cCBsaXN0IG9mIGEgY29tYm9ib3guXG4gICAgICAgIGxldCByb2xlc1RvQ2hlY2sgPSBbXCJsaXN0Ym94XCIsIFwidHJlZVwiLCBcImdyaWRcIiwgXCJkaWFsb2dcIl07XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcm9sZXNUb0NoZWNrLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBpZiAoQXJpYVV0aWwuaGFzUm9sZUluU2VtYW50aWNzKHJ1bGVDb250ZXh0LCByb2xlc1RvQ2hlY2tbal0pKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNvbWJvYm94ZXMgPSBDb21tb25VdGlsLmdldEVsZW1lbnRzQnlSb2xlSGlkZGVuKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsIFwiY29tYm9ib3hcIiwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBjb21ib2JveGVzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjb21ib2JveCA9IGNvbWJvYm94ZXNba107XG4gICAgICAgICAgICAgICAgICAgIGxldCBhcmlhX293bnMgPSBDb21tb25VdGlsLmdldEVsZW1lbnRBdHRyaWJ1dGUoY29tYm9ib3gsIFwiYXJpYS1vd25zXCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYXJpYV9vd25zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgb3ducyA9IENvbW1vblV0aWwubm9ybWFsaXplU3BhY2luZyhhcmlhX293bnMudHJpbSgpKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG93bnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgb3duZWQgPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChydWxlQ29udGV4dCwgb3duc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG93bmVkID09PSBydWxlQ29udGV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGNvbnN0IHBhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWUocnVsZUNvbnRleHQpO1xuICAgICAgICAvLyBjaGVjayB2aXNpYmxlIGxhYmVsIGZvciBpbnB1dCBvciBidXR0b25cbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSAnaW5wdXQnIHx8IG5vZGVOYW1lID09PSAnYnV0dG9uJykge1xuICAgICAgICAgICAgaWYgKHBhaXIgJiYgcGFpci5uYW1lICYmIHBhaXIubmFtZS50cmltKCkubGVuZ3RoID4gMCAmJiAocGFpci5uYW1lRnJvbSA9PT0gJ2xhYmVsJyB8fCBwYWlyLm5hbWVGcm9tID09PSAnaW50ZXJuYWwnIHx8IHBhaXIubmFtZUZyb20gPT09ICdhbHQnKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2hlY2sgaWYgYW4gYWx0ZXJuYXRpdmUgdG9vbHRpcCBleGlzdHMgdGhhdCBjYW4gYmUgbWFkZSB2aXNpYmxlIHRocm91Z2ggbW91c2VvdmVyXG4gICAgICAgIGlmIChwYWlyICYmIHBhaXIubmFtZSAmJiBwYWlyLm5hbWUudHJpbSgpLmxlbmd0aCA+IDAgJiYgKHBhaXIubmFtZUZyb20gPT09ICd0ZXh0JyB8fCBwYWlyLm5hbWVGcm9tID09PSAndGl0bGUnKSlcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG5cbiAgICAgICAgLy8gY2hlY2sgaWYgYW55IHZpc2libGUgdGV4dCBmcm9tIHRoZSBjb250cm9sLiBcbiAgICAgICAgLy8gbm90ZSB0aGF0ICgxKSB0aGUgdGV4dCBkb2VzbuKAmXQgbmVlZCB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbnRyb2wgdG8gZm9ybSBhIHJlbGF0aW9uc2hpcFxuICAgICAgICAvLyAgKDIpIHRoZSB0ZXh0IGRvZXNuJ3QgbmVlZCB0byBmb2xsb3cgYWNjZXNzaWJsZSBuYW1lIHJlcXVpcmVtZW50IChlLmcuIG5hbWVGcm9tKVxuICAgICAgICBjb25zdCB0ZXh0ID0gQ29tbW9uVXRpbC5nZXRPblNjcmVlbklubmVyVGV4dChydWxlQ29udGV4dCk7XG4gICAgICAgIGlmICh0ZXh0ICYmIHRleHQubGVuZ3RoICE9PSAwKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgXG4gICAgICAgIC8vIGNoZWNrIGlmIGFueSBkZXNjZW5kYW50IHdpdGggYW4gYWx0ZXJuYXRpdmUgdG9vbHRpcCB0aGF0IGNhbiBiZSBtYWRlIHZpc2libGUgdGhyb3VnaCBtb3VzZW92ZXJcbiAgICAgICAgLy8gb25seSBjb25zaWRlciBpbWcgYW5kIHN2ZywgYW5kIG90aGVyIHRleHQgY29udGVudCBvZiB0aGUgZGVzY2VuZGFudCBpcyBjb3ZlcmVkIGluIHRoZSBpc0lubmVyVGV4dCBhYm92ZSAgXG4gICAgICAgIGxldCBkZXNjZW5kYW50cyA9IEFyaWFVdGlsLmdldEFsbERlc2NlbmRhbnRzV2l0aFJvbGVzKHJ1bGVDb250ZXh0LCBbXCJpbWdcIiwgXCJncmFwaGljcy1kb2N1bWVudFwiLCBcImdyYXBoaWNzLW9iamVjdFwiLCBcImdyYXBoaWNzLXN5bWJvbFwiXSwgZmFsc2UsIHRydWUpO1xuICAgICAgICBpZiAoZGVzY2VuZGFudHMgJiYgZGVzY2VuZGFudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yIChsZXQgZD0wOyBkIDwgZGVzY2VuZGFudHMubGVuZ3RoOyBkKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShkZXNjZW5kYW50c1tkXSwgXCJ0aXRsZVwiKSB8fCBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KGRlc2NlbmRhbnRzW2RdLCBcImFsdFwiKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgICAgIH0gXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIGNoZWNrIGlmIHRoZXJlIGlzIGEgdmlzaWJsZSBsYWJlbCBwb2ludGVkIHRvIGJ5IHRoZSBhcmlhLWxhYmVsbGVkYnkgYXR0cmlidXRlLlxuICAgICAgICBpZiAoQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJhcmlhLWxhYmVsbGVkYnlcIikpIHtcbiAgICAgICAgICAgIGxldCB0aGVMYWJlbCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKTtcbiAgICAgICAgICAgIGxldCBsYWJlbFZhbHVlcyA9IHRoZUxhYmVsLnNwbGl0KC9cXHMrLyk7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGxhYmVsVmFsdWVzLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICAgICAgbGV0IGVsZW1lbnRCeUlkID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQocnVsZUNvbnRleHQsIGxhYmVsVmFsdWVzW2pdKTtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudEJ5SWQgJiYgIURPTVV0aWwuc2FtZU5vZGUoZWxlbWVudEJ5SWQsIHJ1bGVDb250ZXh0KSAmJiBWaXNVdGlsLmlzTm9kZVZpc2libGUoZWxlbWVudEJ5SWQpICYmIENvbW1vblV0aWwuaGFzSW5uZXJDb250ZW50SGlkZGVuKGVsZW1lbnRCeUlkKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpOyBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoKG5vZGVOYW1lID09PSBcIm9wdGdyb3VwXCIgfHwgbm9kZU5hbWUgPT0gXCJvcHRpb25cIikgJiYgKHBhaXIgJiYgcGFpci5uYW1lICYmIHBhaXIubmFtZS50cmltKCkubGVuZ3RoID4gMCAmJiAocGFpci5uYW1lRnJvbSA9PT0gJ2xhYmVsJyB8fCBwYWlyLm5hbWVGcm9tID09PSAnY29udGVudCcpKSlcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG5cbiAgICAgICAgLy8gRGV0ZXJtaW5lIGlmIHRoaXMgaXMgcmVmZXJlbmNlZCBieSBhIGNvbWJvYm94LiBJZiBzbywgdGhlIGxhYmVsIGJlbG9uZ3MgdG8gdGhlIGNvbWJvYm94XG4gICAgICAgIGxldCBpZCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImlkXCIpO1xuICAgICAgICBpZiAoaWQgJiYgaWQudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5vd25lckRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCpbYXJpYS1jb250cm9scz0nJHtpZH0nXVtyb2xlPSdjb21ib2JveCddYCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNoZWNrIGlmIGEgcGxhY2Vob2xkZXIgZXhpc3RzIGV2ZW4gdGhvdWdoIGEgcGxhY2Vob2xkZXIgdGV4dCBpcyBub3Qgc3VmZmljaWVudCBhcyBhIHZpc2libGUgdGV4dFxuICAgICAgICBpZiAoQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJwbGFjZWhvbGRlclwiKSlcbiAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX3BsYWNlaG9sZGVyX29ubHlcIik7XG5cbiAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfbm9fbGFiZWxcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGNvbnN0IGlucHV0X29uY2hhbmdlX3JldmlldzogUnVsZSA9IHtcbiAgICBpZDogXCJpbnB1dF9vbmNoYW5nZV9yZXZpZXdcIixcbiAgICBjb250ZXh0OiBcImRvbTppbnB1dFtvbmNoYW5nZV0sIGRvbTp0ZXh0YXJlYVtvbmNoYW5nZV0sIGRvbTpzZWxlY3Rbb25jaGFuZ2VdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfSW5wdXRfSGFzT25jaGFuZ2VcIjoge1xuICAgICAgICAgICAgLy8gXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwicG90ZW50aWFsX3dhcm5pbmdcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICAvLyBcInBhc3NcIjogXCJpbnB1dF9vbmNoYW5nZV9yZXZpZXcuaHRtbFwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfd2FybmluZ1wiOiBcImlucHV0X29uY2hhbmdlX3Jldmlldy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiaW5wdXRfb25jaGFuZ2VfcmV2aWV3Lmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJVc2VycyBtdXN0IGJlIGFkdmlzZWQgaWYsIGR1ZSB0byBhIGNoYW5nZSBvZiBlbGVtZW50IHZhbHVlLCBhIGZvcm0gYXV0b21hdGljYWxseSBzdWJtaXRzLCBhIG5ldyB3aW5kb3cgb3BlbnMsIG9yIGEgY2hhbmdlIGluIGZvY3VzIG9jY3Vyc1wiLFxuICAgICAgICAgICAgLy8gXCJwYXNzXCI6IFwiVGhlIHVzZXIgaXMgYWR2aXNlZCBvZiB0aGUgYXV0b21hdGljIGZvcm0gc3VibWlzc2lvbiwgbmV3IHdpbmRvdyBvcGVuaW5nLCBvciBmb2N1cyBjaGFuZ2VcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX3dhcm5pbmdcIjogXCJDb25maXJtIHRoYXQgdGhlIHVzZXIgaXMgYWR2aXNlZCBpZiwgZHVlIHRvIGEgY2hhbmdlIG9mIGVsZW1lbnQgdmFsdWUsIGEgZm9ybSBhdXRvbWF0aWNhbGx5IHN1Ym1pdHMsIGEgbmV3IHdpbmRvdyBvcGVucywgb3IgYSBjaGFuZ2UgaW4gZm9jdXMgb2NjdXJzXCIgICAgXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMy4yLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAocnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSBcImlucHV0XCIgJiYgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidHlwZVwiKSkge1xuICAgICAgICAgICAgbGV0IHR5cGUgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gXCJoaWRkZW5cIiB8fCB0eXBlID09PSBcInN1Ym1pdFwiIHx8IHR5cGUgPT09IFwiaW1hZ2VcIiB8fCB0eXBlID09PSBcImJ1dHRvblwiIHx8IHR5cGUgPT09IFwicmVzZXRcIilcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX3dhcm5pbmdcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5cbmV4cG9ydCBjb25zdCBpbnB1dF9wbGFjZWhvbGRlcl9sYWJlbF92aXNpYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcImlucHV0X3BsYWNlaG9sZGVyX2xhYmVsX3Zpc2libGVcIixcbiAgICBjb250ZXh0OiBcImRvbTppbnB1dFtwbGFjZWhvbGRlcl0sIGRvbTp0ZXh0YXJlYVtwbGFjZWhvbGRlcl1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIkhBQUNfSW5wdXRfUGxhY2Vob2xkZXJcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMlwiOiBcIlBvdGVudGlhbF8yXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJpbnB1dF9wbGFjZWhvbGRlcl9sYWJlbF92aXNpYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJpbnB1dF9wbGFjZWhvbGRlcl9sYWJlbF92aXNpYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzJcIjogXCJpbnB1dF9wbGFjZWhvbGRlcl9sYWJlbF92aXNpYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpbnB1dF9wbGFjZWhvbGRlcl9sYWJlbF92aXNpYmxlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJIVE1MNSBwbGFjZWhvbGRlciBpcyB0aGUgb25seSB2aXNpYmxlIGxhYmVsXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8yXCI6IFwiQWRkaXRpb25hbCB2aXNpYmxlIGxhYmVsIHJlZmVyZW5jZWQgYnkgJ2FyaWEtbGFiZWxsZWRieScgaXMgbm90IHZhbGlkXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiSFRNTDUgJ3BsYWNlaG9sZGVyJyBhdHRyaWJ1dGUgbXVzdCBub3QgYmUgdXNlZCBhcyBhIHZpc2libGUgbGFiZWwgcmVwbGFjZW1lbnRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBtZXJnZSB0aGUgcnVsZSBpbnRvIGlucHV0X2xhYmVsX3Zpc2libGVcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjMuMy4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICAqL1xuICAgIHJ1bGVzZXRzOiBbXSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0eXBlXCIpKSB7XG4gICAgICAgICAgICBsZXQgdHlwZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInR5cGVcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIGlmICh0eXBlID09IFwiaGlkZGVuXCIgfHwgdHlwZSA9PSBcImJ1dHRvblwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImhpZGRlblwiKSkge1xuICAgICAgICAgICAgbGV0IGhpZGRlbiA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImhpZGRlblwiKTtcbiAgICAgICAgICAgIGlmIChoaWRkZW4gPT0gXCJcIiB8fCBoaWRkZW4udG9Mb3dlckNhc2UoKSA9PSBcImhpZGRlblwiKSB7IC8vIHdoZW4gaGlkZGVuIGlzIGVtcHR5IGluIHRoZSBlbGVtZW50LCBcIlwiIGlzIHJldHVybmVkLCBzYW1lIGFzIGl0IGhhcyBhIHZhbHVlIG9mIFwiXCIuXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImFyaWEtbGFiZWxcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpICYmIHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImlkXCIpKSB7XG4gICAgICAgICAgICBsZXQgaWQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJpZFwiKS50cmltKCk7XG4gICAgICAgICAgICBsZXQgcmVmSWRzID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpLnRyaW0oKS5zcGxpdCgvXFxzKy8pOyAvLyBzZXBhcmF0ZWQgYnkgb25lIG9yIG1vcmUgd2hpdGUgc3BhY2VzXG4gICAgICAgICAgICBpZiAoIXJlZklkcy5pbmNsdWRlcyhpZCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IEZyYWdtZW50VXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9mcmFnbWVudFwiO1xuaW1wb3J0IHsgRE9NVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgbGFiZWxfY29udGVudF9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwibGFiZWxfY29udGVudF9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTpsYWJlbFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiVmFsZXJpZV9MYWJlbF9IYXNDb250ZW50XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc19SZWd1bGFyXCI6IFwiUGFzc19SZWd1bGFyXCIsXG4gICAgICAgICAgICBcIlBhc3NfQXJpYUxhYmVsXCI6IFwiUGFzc19BcmlhTGFiZWxcIixcbiAgICAgICAgICAgIFwiUGFzc19MYWJlbGxlZEJ5XCI6IFwiUGFzc19MYWJlbGxlZEJ5XCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfUmVndWxhclwiOiBcImxhYmVsX2NvbnRlbnRfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc19BcmlhTGFiZWxcIjogXCJsYWJlbF9jb250ZW50X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NfTGFiZWxsZWRCeVwiOiBcImxhYmVsX2NvbnRlbnRfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwibGFiZWxfY29udGVudF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImxhYmVsX2NvbnRlbnRfZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc19SZWd1bGFyXCI6IFwiPGxhYmVsPiBlbGVtZW50IGhhcyBhY2Nlc3NpYmxlIG5hbWUgd2l0aCBpbm5lciBjb250ZW50XCIsXG4gICAgICAgICAgICBcIlBhc3NfQXJpYUxhYmVsXCI6IFwiPGxhYmVsPiBlbGVtZW50IGhhcyBhY2Nlc3NpYmxlIG5hbWUgdmlhICdhcmlhLWxhYmVsJ1wiLFxuICAgICAgICAgICAgXCJQYXNzX0xhYmVsbGVkQnlcIjogXCI8bGFiZWw+IGVsZW1lbnQgaGFzIGFjY2Vzc2libGUgbmFtZSB2aWEgJ2FyaWEtbGFiZWxsZWRieSdcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiVGhlIDxsYWJlbD4gZWxlbWVudCBkb2VzIG5vdCBoYXZlIGRlc2NyaXB0aXZlIHRleHQgdGhhdCBpZGVudGlmaWVzIHRoZSBleHBlY3RlZCBpbnB1dFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkEgPGxhYmVsPiBlbGVtZW50IG11c3QgaGF2ZSBub24tZW1wdHkgZGVzY3JpcHRpdmUgdGV4dCB0aGF0IGlkZW50aWZpZXMgdGhlIHB1cnBvc2Ugb2YgdGhlIGludGVyYWN0aXZlIGNvbXBvbmVudFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgaWYgKENvbW1vblV0aWwuaGFzSW5uZXJDb250ZW50SGlkZGVuKHJ1bGVDb250ZXh0KSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc19SZWd1bGFyXCIpO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIikgfHwgXCJcIikudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfQXJpYUxhYmVsXCIpO1xuICAgICAgICB9IGVsc2UgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKSkge1xuICAgICAgICAgICAgbGV0IGxhYmVsRWxlbSA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKHJ1bGVDb250ZXh0LCBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWxsZWRieScpKTtcbiAgICAgICAgICAgIGlmIChsYWJlbEVsZW0gJiYgIURPTVV0aWwuc2FtZU5vZGUobGFiZWxFbGVtLCBydWxlQ29udGV4dCkgJiYgQ29tbW9uVXRpbC5oYXNJbm5lckNvbnRlbnQobGFiZWxFbGVtKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfTGFiZWxsZWRCeVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IEZyYWdtZW50VXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9mcmFnbWVudFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcbmltcG9ydCB7IENTU1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9DU1NVdGlsXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuXG5leHBvcnQgY29uc3QgbGFiZWxfbmFtZV92aXNpYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcImxhYmVsX25hbWVfdmlzaWJsZVwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpidXR0b24sYXJpYTpjaGVja2JveCxhcmlhOmdyaWRjZWxsLGFyaWE6bGluayxhcmlhOm1lbnVpdGVtLGFyaWE6bWVudWl0ZW1jaGVja2JveCxhcmlhOm1lbnVpdGVtcmFkaW8sYXJpYTpvcHRpb24sYXJpYTpyYWRpbyxhcmlhOnN3aXRjaCxhcmlhOnRhYixhcmlhOnRyZWVpdGVtLGRvbTppbnB1dCxkb206dGV4dGFyZWEsZG9tOnNlbGVjdCxkb206b3V0cHV0LGRvbTptZXRlclwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIxX0xhYmVsX0FjY2Vzc2libGVcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJsYWJlbF9uYW1lX3Zpc2libGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJsYWJlbF9uYW1lX3Zpc2libGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImxhYmVsX25hbWVfdmlzaWJsZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIkFjY2Vzc2libGUgbmFtZSBtYXRjaGVzIG9yIGNvbnRhaW5zIHRoZSB2aXNpYmxlIGxhYmVsIHRleHRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiQWNjZXNzaWJsZSBuYW1lIGRvZXMgbm90IG1hdGNoIG9yIGNvbnRhaW4gdGhlIHZpc2libGUgbGFiZWwgdGV4dFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkFjY2Vzc2libGUgbmFtZSBtdXN0IG1hdGNoIG9yIGNvbnRhaW4gdGhlIHZpc2libGUgbGFiZWwgdGV4dFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuNS4zXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICAvLyBUT0RPOiBBQ1Q6IFJldmlldyBodHRwczovL2dpdGh1Yi5jb20vYWN0LXJ1bGVzL2FjdC1ydWxlcy5naXRodWIuaW8vaXNzdWVzLzE2MThcbiAgICAvLyBodHRwczovL3d3dy53My5vcmcvV0FJL1dDQUcyMS9UZWNobmlxdWVzL2FyaWEvQVJJQTI0XG4gICAgYWN0OiBcIjJlZThiOFwiLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShydWxlQ29udGV4dCkgfHxcbiAgICAgICAgICAgIENvbW1vblV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHBhc3MgaWYgdGhlIHZpc2libGUgdGV4dCB1c2VzIE1hdGVyaWFsIEljb24gZm9udFxuICAgICAgICBpZiAoQ1NTVXRpbC5pc01hdGVyaWFsSWNvbkZvbnQocnVsZUNvbnRleHQpKSBcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcblxuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcblxuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIGxldCBpc0lucHV0QnV0dG9uID0gZmFsc2U7XG4gICAgICAgIC8vbGV0IGJ1dHRvblR5cGVzID0gW1wiYnV0dG9uXCIsIFwicmVzZXRcIiwgXCJzdWJtaXRcIl07IC8vXCJpbWFnZVwiXG4gICAgICAgIGxldCBpbnB1dFR5cGUgPSBudWxsO1xuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwiaW5wdXRcIiAmJiBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0eXBlXCIpKSB7XG4gICAgICAgICAgICBpbnB1dFR5cGUgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBpZiAoQ29tbW9uVXRpbC5mb3JtX2J1dHRvbl90eXBlcy5pbmRleE9mKGlucHV0VHlwZSkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgaXNJbnB1dEJ1dHRvbiA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdGhlTGFiZWxCeSA9IEFyaWFVdGlsLmdldEFyaWFBdHRyaWJ1dGUocnVsZUNvbnRleHQsIFwiYXJpYS1sYWJlbGxlZGJ5XCIpO1xuICAgICAgICBpZiAodGhlTGFiZWxCeSAmJiAhQ29tbW9uVXRpbC5pc0lkUmVmZXJUb1NlbGYocnVsZUNvbnRleHQsIHRoZUxhYmVsQnkpICYmICFpc0lucHV0QnV0dG9uKSB7XG4gICAgICAgICAgICAvLyBza2lwIHRoZSBjaGVja3MgaWYgaXQgaGFzIGFuIGFyaWEtbGFiZWxsZWRieSBzaW5jZSBpdCB0YWtlcyBwcmVjZWRlbmNlLlxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IHRoZUxhYmVsID0gbnVsbDtcbiAgICAgICAgICAgIGlmICh0aGVMYWJlbEJ5ICYmICFDb21tb25VdGlsLmlzSWRSZWZlclRvU2VsZihydWxlQ29udGV4dCwgdGhlTGFiZWxCeSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgbGFiZWxWYWx1ZXMgPSB0aGVMYWJlbEJ5LnNwbGl0KC9cXHMrLyk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBsYWJlbFZhbHVlcy5sZW5ndGg7ICsraikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZWxlbWVudEJ5SWQgPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChydWxlQ29udGV4dCwgbGFiZWxWYWx1ZXNbal0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudEJ5SWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoZUxhYmVsID0gQ29tbW9uVXRpbC5nZXRJbm5lclRleHQoZWxlbWVudEJ5SWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoZUxhYmVsID0gQXJpYVV0aWwuZ2V0QXJpYUF0dHJpYnV0ZShydWxlQ29udGV4dCwgXCJhcmlhLWxhYmVsXCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXRoZUxhYmVsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGxldCB0ZXh0ID0gbnVsbDtcblxuICAgICAgICAgICAgaWYgKGlzSW5wdXRCdXR0b24pIHtcbiAgICAgICAgICAgICAgICAvKiBOb3RlOiBEaXNhYmxlIHRoZSBhbHQgY2hlY2sgaW4gaW1hZ2VzIHVudGlsIHdlIGdldCBjb25maXJtYXRpb25cbiAgICAgICAgICAgICAgICBpZiAoaW5wdXRUeXBlPT09XCJpbWFnZVwiICYmIHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImFsdFwiKSl7XG4gICAgICAgICAgICAgICAgICAgIC8vIHVzZSAnYWx0JyBhdHRyaWJ1dGUgYXMgdmlzaWJsZSB0ZXh0XG4gICAgICAgICAgICAgICAgICAgIHRleHQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhbHRcIik7XG4gICAgICAgICAgICAgICAgfWVsc2UgXG4gICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidmFsdWVcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdXNlICd2YWx1ZScgYXR0cmlidXRlIGFzIHZpc2libGUgdGV4dFxuICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidmFsdWVcIik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdXNlIGRlZmF1bHQgdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0VHlwZSA9PT0gXCJzdWJtaXRcIi8qfHxpbnB1dFR5cGU9PT1cImltYWdlXCIqLykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IFwic3VibWl0XCI7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXRUeXBlID09PSBcInJlc2V0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBcInJlc2V0XCI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgaWYgKCF0ZXh0KSB7XG4gICAgICAgICAgICAgICAgLy8gbG9vayBmb3IgYSA8bGFiZWw+IGVsZW1lbnRcbiAgICAgICAgICAgICAgICBsZXQgbGFiZWxFbGVtID0gQ29tbW9uVXRpbC5nZXRMYWJlbEZvckVsZW1lbnRIaWRkZW4ocnVsZUNvbnRleHQsIHRydWUpO1xuICAgICAgICAgICAgICAgIGlmICghbGFiZWxFbGVtKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwYXJlbnROb2RlID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImxhYmVsXCIgLyomJiBSUFRVdGlsLmlzRmlyc3RGb3JtRWxlbWVudChwYXJlbnROb2RlLCBydWxlQ29udGV4dCkqLykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBhcmVudENsb25lID0gcGFyZW50Tm9kZS5jbG9uZU5vZGUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBleGNsdWRlIGFsbCBmb3JtIGVsZW1lbnRzIGZyb20gdGhlIGxhYmVsIHNpbmNlIHRoZXkgbWlnaHQgYWxzbyBoYXZlIGlubmVyIGNvbnRlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsRWxlbSA9IENvbW1vblV0aWwucmVtb3ZlQWxsRm9ybUVsZW1lbnRzRnJvbUxhYmVsKHBhcmVudENsb25lKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCBlbGVtZW50ID0gbGFiZWxFbGVtID8gbGFiZWxFbGVtIDogcnVsZUNvbnRleHQ7XG5cbiAgICAgICAgICAgICAgICBsZXQgZWxlbWVudHNUb1NraXBDb250ZW50Q2hlY2sgPSBbXCJtZXRlclwiLCBcIm91dHB1dFwiLCBcInByb2dyZXNzXCIsIFwic2VsZWN0XCIsIFwidGV4dGFyZWFcIl07XG4gICAgICAgICAgICAgICAgaWYgKCFsYWJlbEVsZW0gJiYgZWxlbWVudHNUb1NraXBDb250ZW50Q2hlY2suaW5kZXhPZihub2RlTmFtZSkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHRleHQgPSBcIlwiOyAvLyBza2lwIGNvbnRlbnQgY2hlY2sgZm9yIHNvbWUgZWxlbWVudHNcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIHZpc2libGUgdGV4dCBvbmx5XG4gICAgICAgICAgICAgICAgICAgIHRleHQgPSBDb21tb25VdGlsLmdldE9uU2NyZWVuSW5uZXJUZXh0KGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8qIE5vdGU6IERpc2FibGUgdGhpcyBhbHQgY2hlY2sgaW4gaW1hZ2VzIGZvciBub3cgdW50aWwgd2UgZ2V0IGNvbmZpcm1hdGlvblxuICAgICAgICAgICAgICAgIC8vIExvb2sgZm9yIHRoZSBhbHQgYXR0cmlidXRlIG9mIGFuIGltYWdlIHdoaWNoIGlzIGNvbnNpZGVyZWQgdmlzaWJsZSB0ZXh0LlxuICAgICAgICAgICAgICAgIGxldCBoYXNJbWdBbHQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5maXJzdENoaWxkICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG53ID0gUlBUVXRpbC5uZXcgTm9kZVdhbGtlcihlbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCFoYXNJbWdBbHQgJiYgbncubmV4dE5vZGUoKSAmJiBudy5ub2RlICE9IGVsZW1lbnQgJiYgbncubm9kZSAhPSBlbGVtZW50Lm5leHRTaWJsaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBoYXNJbWdBbHQgPSAobncubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09IFwiaW1nXCIgJiYgUlBUVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShudy5ub2RlLCBcImFsdFwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzSW1nQWx0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHRleHQgPyB0ZXh0ICsgbncubm9kZS5nZXRBdHRyaWJ1dGUoXCJhbHRcIikgOiBudy5ub2RlLmdldEF0dHJpYnV0ZShcImFsdFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgbm9uYWxwaGFudW1lcmljID0gL1teYS16QS1aMC05XS9nO1xuXG4gICAgICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKG5vbmFscGhhbnVtZXJpYywgXCIgXCIpOyAvLyBvbmx5IGNvbnNpZGVyIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzXG4gICAgICAgICAgICBsZXQgbm9ybWFsaXplZFRleHQgPSBDb21tb25VdGlsLm5vcm1hbGl6ZVNwYWNpbmcodGV4dCkudG9Mb3dlckNhc2UoKTsgLy8gTGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSBhbmQgZGlmZmVyZW5jZSBpbiBjYXNlIHNlbnNpdGl2aXR5IHNob3VsZCBiZSBpZ25vcmVkLlxuXG4gICAgICAgICAgICB0aGVMYWJlbCA9IHRoZUxhYmVsLnJlcGxhY2Uobm9uYWxwaGFudW1lcmljLCBcIiBcIik7IC8vIG9ubHkgY29uc2lkZXIgYWxwaGFudW1lcmljIGNoYXJhY3RlcnNcbiAgICAgICAgICAgIGxldCBub3JtYWxpemVkTGFiZWwgPSBDb21tb25VdGlsLm5vcm1hbGl6ZVNwYWNpbmcodGhlTGFiZWwpLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgICAgIGlmIChub3JtYWxpemVkVGV4dC5sZW5ndGggPiAxKSB7IC8vIHNraXAgbm9uLXRleHQgY29udGVudC4gZS5nLiwgPGJ1dHRvbiBhcmlhLWxhYmVsPVwiY2xvc2VcIj5YPC9idXR0b24+XG4gICAgICAgICAgICAgICAgbGV0IGxvY2F0aW9uID0gbm9ybWFsaXplZExhYmVsLmluZGV4T2Yobm9ybWFsaXplZFRleHQpO1xuXG4gICAgICAgICAgICAgICAgLy8gQXZvaWQgbWF0Y2hpbmcgcGFydGlhbCB3b3Jkcy5lLmcuLCB0ZXh0IFwibmFtZVwiIHNob3VsZCBub3QgbWF0Y2ggJ3N1cm5hbWUnIG9yICduYW1lcydcbiAgICAgICAgICAgICAgICBpZiAobG9jYXRpb24gPj0gMCAmJiBub3JtYWxpemVkTGFiZWwubGVuZ3RoID4gbm9ybWFsaXplZFRleHQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBsZXR0ZXJzID0gL15bMC05YS16QS1aXSskLztcbiAgICAgICAgICAgICAgICAgICAgaWYgKChsb2NhdGlvbiArIG5vcm1hbGl6ZWRUZXh0Lmxlbmd0aCkgPCBub3JtYWxpemVkTGFiZWwubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBlbmRpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0aGVDaGFyID0gbm9ybWFsaXplZExhYmVsLmNoYXJBdChsb2NhdGlvbiArIG5vcm1hbGl6ZWRUZXh0Lmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhlQ2hhci5tYXRjaChsZXR0ZXJzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXNzZWQgJiYgbG9jYXRpb24gPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBiZWdpbm5pbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0aGVDaGFyID0gbm9ybWFsaXplZExhYmVsLmNoYXJBdChsb2NhdGlvbiAtIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoZUNoYXIubWF0Y2gobGV0dGVycykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobG9jYXRpb24gPT09IC0xKSB7IC8vIGNoZWNrIHRoYXQgdmlzaWJsZSB0ZXh0IGNvbnRlbnQgb2YgdGhlIHRhcmdldCBpcyBjb250YWluZWQgd2l0aGluIGl0cyBhY2Nlc3NpYmxlIG5hbWUuXG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEZyYWdtZW50VXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9mcmFnbWVudFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGxhYmVsX3JlZl92YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJsYWJlbF9yZWZfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbTpsYWJlbFtmb3JdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfTGFiZWxfUmVmVmFsaWRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImZhaWxfaW52YWxpZFwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImxhYmVsX3JlZl92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfaW52YWxpZFwiOiBcImxhYmVsX3JlZl92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwibGFiZWxfcmVmX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlRoZSAnZm9yJyBhdHRyaWJ1dGUgZm9yIGEgbGFiZWwgcmVmZXJlbmNlYSBhIHVuaXF1ZSBub24tZW1wdHkgJ2lkJyBhdHRyaWJ1dGUgb2YgYSB2YWxpZCBlbGVtZW50XCIsXG4gICAgICAgICAgICBcImZhaWxfaW52YWxpZFwiOiBcIlRoZSB2YWx1ZSBcXFwiezB9XFxcIiBvZiB0aGUgJ2ZvcicgYXR0cmlidXRlIGlzIG5vdCB0aGUgJ2lkJyBvZiBhIHZhbGlkIGVsZW1lbnRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgJ2ZvcicgYXR0cmlidXRlIGZvciBhIGxhYmVsIHNob3VsZCByZWZlcmVuY2UgYSBub24tZW1wdHksIHVuaXF1ZSAnaWQnIGF0dHJpYnV0ZSBvZiBhIHZhbGlkIGVsZW1lbnRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBpZCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImZvclwiKTtcbiAgICAgICAgbGV0IHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICBsZXQgdGFyZ2V0ID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQocnVsZUNvbnRleHQsIGlkKTtcbiAgICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICAgICAgLy8gaWdub3JlIGlmIGJvdGggbGFiZWwgYW5kIGNvbnRyb2wgYXJlIGludmlzaWJsZVxuICAgICAgICAgICAgaWYgKCFWaXNVdGlsLmlzTm9kZVZpc2libGUodGFyZ2V0KSAmJiAhVmlzVXRpbC5pc05vZGVWaXNpYmxlKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIC8vIGhhbmRsZXMgbnVsbCBhbmQgdW5kZWZpbmVkXG4gICAgICAgICAgICBpZiAoIXRhcmdldC5oYXNBdHRyaWJ1dGUoXCJyb2xlXCIpKSB7XG4gICAgICAgICAgICAgICAgLy8gRmFpbCBpZiB3ZSdyZSBwb2ludGluZyBhdCBzb21ldGhpbmcgdGhhdCBpcyBsYWJlbGxlZCBieSBhbm90aGVyIG1lY2hhbmlzbVxuICAgICAgICAgICAgICAgIGxldCBub2RlTmFtZSA9IHRhcmdldC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9IG5vZGVOYW1lID09IFwiaW5wdXRcIiB8fCBub2RlTmFtZSA9PSBcInNlbGVjdFwiIHx8IG5vZGVOYW1lID09IFwidGV4dGFyZWFcIlxuICAgICAgICAgICAgICAgICAgICB8fCBub2RlTmFtZSA9PSBcImJ1dHRvblwiIHx8IG5vZGVOYW1lID09IFwiZGF0YWxpc3RcIlxuICAgICAgICAgICAgICAgICAgICB8fCBub2RlTmFtZSA9PSBcIm9wdGdyb3VwXCIgfHwgbm9kZU5hbWUgPT0gXCJvcHRpb25cIlxuICAgICAgICAgICAgICAgICAgICB8fCBub2RlTmFtZSA9PSBcImtleWdlblwiIHx8IG5vZGVOYW1lID09IFwib3V0cHV0XCJcbiAgICAgICAgICAgICAgICAgICAgfHwgbm9kZU5hbWUgPT0gXCJwcm9ncmVzc1wiIHx8IG5vZGVOYW1lID09IFwibWV0ZXJcIlxuICAgICAgICAgICAgICAgICAgICB8fCBub2RlTmFtZSA9PSBcImZpZWxkc2V0XCIgfHwgbm9kZU5hbWUgPT0gXCJsZWdlbmRcIjtcbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT0gXCJpbnB1dFwiICYmIHRhcmdldC5oYXNBdHRyaWJ1dGUoXCJ0eXBlXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0eXBlID0gdGFyZ2V0LmdldEF0dHJpYnV0ZShcInR5cGVcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gdHlwZSA9PSBcInRleHRcIiB8fCB0eXBlID09IFwicGFzc3dvcmRcIiB8fCB0eXBlID09IFwiZmlsZVwiIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlID09IFwiY2hlY2tib3hcIiB8fCB0eXBlID09IFwicmFkaW9cIiB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9PSBcImhpZGRlblwiIHx8IHR5cGUgPT0gXCJzZWFyY2hcIiB8fCB0eXBlID09IFwidGVsXCIgfHwgdHlwZSA9PSBcInVybFwiIHx8IHR5cGUgPT0gXCJlbWFpbFwiIHx8ICAvL0hUTUwgNVxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9PSBcImRhdGVcIiB8fCB0eXBlID09IFwibnVtYmVyXCIgfHwgdHlwZSA9PSBcInJhbmdlXCIgfHwgdHlwZSA9PSBcImltYWdlXCIgfHwgLy9IVE1MIDVcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPT0gXCJ0aW1lXCIgfHwgdHlwZSA9PSBcImNvbG9yXCIgfHwgIC8vIEhUTUwgNVxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9PSBcImRhdGV0aW1lLWxvY2FsXCIgfHwgdHlwZSA9PSBcIm1vbnRoXCIgfHwgdHlwZSA9PSBcIndlZWtcIjsgLy9IVE1MNS4xXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBBZGQgb25lIG1vcmUgY2hlY2sgdG8gbWFrZSBzdXJlIHRoZSB0YXJnZXQgZWxlbWVudCBpcyBOT1QgaGlkZGVuLCBpbiB0aGUgY2FzZSB0aGUgdGFyZ2V0IGlzIGhpZGRlblxuICAgICAgICAgICAgLy8gZmxhZyBhIHZpb2xhdGlvbiByZWdhcmRsZXNzIG9mIHdoYXQgdGhlIENoZWNrIEhpZGRlbiBDb250ZW50IHNldHRpbmcgaXMuXG4gICAgICAgICAgICBpZiAocGFzc2VkICYmICFWaXNVdGlsLmlzTm9kZVZpc2libGUodGFyZ2V0KSkge1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCByZXRUb2tlbjogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldFRva2VuLnB1c2goaWQpO1xuICAgICAgICB9XG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KHBhc3NlZCwgW3J1bGVDb250ZXh0XSwgJycsICcnLCBwYXNzZWQgPT0gdHJ1ZSA/IFtdIDogW3JldFRva2VuXSk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2ludmFsaWRcIiwgcmV0VG9rZW4pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuXG5leHBvcnQgY29uc3QgbGlzdF9jaGlsZHJlbl92YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJsaXN0X2NoaWxkcmVuX3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmdyb3VwXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJIQUFDX0xpc3RfR3JvdXBfTGlzdEl0ZW1cIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJsaXN0X2NoaWxkcmVuX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwibGlzdF9jaGlsZHJlbl92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwibGlzdF9jaGlsZHJlbl92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkxpc3QgY29tcG9uZW50IHdpdGggXFxcImdyb3VwXFxcIiByb2xlIGhhcyBjaGlsZHJlbiB0aGF0IGFyZSBub3QgPGxpc3RpdGVtPiBlbGVtZW50c1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkxpc3QgY29tcG9uZW50IHdpdGggXFxcImdyb3VwXFxcIiByb2xlIG11c3QgbGltaXQgY2hpbGRyZW4gdG8gPGxpc3RpdGVtPiBlbGVtZW50c1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHBhcmVudCA9IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKCFBcmlhVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MocGFyZW50LCBcImxpc3RcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGxldCBjaGlsZHJlbiA9IHJ1bGVDb250ZXh0LmNoaWxkcmVuO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgcGFzc2VkICYmIGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcGFzc2VkID0gQXJpYVV0aWwuaGFzUm9sZUluU2VtYW50aWNzKGNoaWxkcmVuW2ldLCBcImxpc3RpdGVtXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgbGlzdF9tYXJrdXBfcmV2aWV3OiBSdWxlID0ge1xuICAgIGlkOiBcImxpc3RfbWFya3VwX3Jldmlld1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9MaXN0X1VzZU1hcmt1cFwiOiB7XG4gICAgICAgICAgICAvLyBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgLy8gXCJwYXNzXCI6IFwibGlzdF9tYXJrdXBfcmV2aWV3Lmh0bWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX2xpc3RcIjogXCJsaXN0X21hcmt1cF9yZXZpZXcuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImxpc3RfbWFya3VwX3Jldmlldy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICAvLyBcInBhc3NcIjogXCJQcm9wZXIgSFRNTCBlbGVtZW50cyBhcmUgdXNlZCB0byBjcmVhdGUgYSBsaXN0XCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9saXN0XCI6IFwiVmVyaWZ5IHRoaXMgaXMgYSBsaXN0IGFuZCBpZiBzbywgbW9kaWZ5IHRvIHVzZSBwcm9wZXIgSFRNTCBlbGVtZW50cyBmb3IgdGhlIGxpc3RcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJQcm9wZXIgSFRNTCBlbGVtZW50cyBzaG91bGQgYmUgdXNlZCB0byBjcmVhdGUgYSBsaXN0XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG5cbiAgICAgICAgLy8gRXh0cmFjdCB0aGUgbm9kZU5hbWUgb2YgdGhlIGNvbnRleHQgbm9kZVxuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIG9yIGRpc2FibGVkXG4gICAgICAgIGlmIChDb21tb25VdGlsLmlzTm9kZURpc2FibGVkKHJ1bGVDb250ZXh0KSB8fCBWaXNVdGlsLmhpZGRlbkJ5RGVmYXVsdEVsZW1lbnRzLmluY2x1ZGVzKG5vZGVOYW1lKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIERvbid0IHRyaWdnZXIgaWYgd2UncmUgbm90IGluIHRoZSBib2R5IG9yIGlmIHdlJ3JlIGluIGEgc2NyaXB0XG4gICAgICAgIGlmIChDb21tb25VdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBbXCJib2R5XCJdKSA9PT0gbnVsbCkgXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICAvLyBpZ25vcmUgc2NyaXB0LCBsYWJlbCBhbmQgdGhlaXIgY2hpbGQgZWxlbWVudHNcbiAgICAgICAgaWYgKENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFtcInNjcmlwdFwiLCAnbGFiZWwnXSkgIT09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICAvLyBpZ25vcmUgYWxsIHdpZGdldHMgYW5kIHRoZWlyIGNoaWxkcmVuLCBhbmQgY2VydGFpbiBzdHJ1Y3R1cmUgcm9sZXNcbiAgICAgICAgbGV0IHJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXNXaXRoVHlwZXMocnVsZUNvbnRleHQsIFtcIndpZGdldFwiXSk7XG4gICAgICAgIC8vIGFkZCBzb21lIHN0cnVjdHVyZSByb2xlc1xuICAgICAgICBDb21tb25VdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QoW1wiY2FwdGlvblwiLCBcImNvZGVcIiwgXCJjb2x1bW5oZWFkZXJcIiwgIFwiZmlndXJlXCIsIFwibGlzdFwiLCBcImxpc3RpdGVtXCIsIFwibWF0aFwiLCBcIm1ldGVyXCIsIFwiY29sdW1uaGVhZGVyXCIsIFwicm93aGVhZGVyXCJdLCByb2xlcyk7XG4gICAgICAgIGlmIChBcmlhVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlcyhydWxlQ29udGV4dCwgcm9sZXMpICE9PSBudWxsKSBcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuICAgICAgICBsZXQgd2Fsa05vZGUgPSBydWxlQ29udGV4dC5maXJzdENoaWxkIGFzIE5vZGU7XG4gICAgICAgIHdoaWxlIChwYXNzZWQgJiYgd2Fsa05vZGUpIHtcbiAgICAgICAgICAgIC8vIENvbXBseSB0byB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyB3aWxsIGJlIGRvbmUgYnkgZGVmYXVsdCBhcyB0aGlzIHJ1bGUgdHJpZ2dlcnMgb24gZWFjaCBlbGVtZW50XG4gICAgICAgICAgICAvLyBhbmQgZm9yIGVhY2ggZWxlbWVudCBpdCBvbmx5IGNoZWNrcyB0aGF0IHNpbmdsZSBlbGVtZW50cyB0ZXh0IG5vZGVzIGFuZCBub3RoaW5nIGVsc2UuIFNvIGFsbCBpbm5lciBlbGVtZW50cyB3aWxsIGJlXG4gICAgICAgICAgICAvLyBjb3ZlcmVkIG9uIHRoZWlyIG93bi4gQ3VycmVudGx5IGZvciB0aGlzIHJ1bGUgYnkgZGVmYXVsdCBDaGVjayBIaWRkZW4gQ29udGVudCB3aWxsIHdvcmssIGFzIHdlIGFyZSBkb2luZ1xuICAgICAgICAgICAgLy8gYSBub2RlIHdhbGsgb25seSBvbiBzaWJsaW5ncyBzbyBpdCB3b3VsZCBub3QgZ2V0IHRleHQgbm9kZXMgZnJvbSBvdGhlciBzaWJsaW5ncyBhdCBhbGwuXG4gICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSBpbiB0aGUgZnV0dXJlIHNvbWV0aGluZyBjaGFuZ2VzLCBqdXN0IG5lZWQgdG8gYWRkICYmICFSUFRVdGlsLnNob3VsZE5vZGVCZVNraXBwZWRIaWRkZW4od2Fsa05vZGUpIHRvIHRoZSBiZWxvd1xuICAgICAgICAgICAgLy8gaWYuXG4gICAgICAgICAgICBpZiAod2Fsa05vZGUubm9kZU5hbWUgPT0gXCIjdGV4dFwiKSB7XG4gICAgICAgICAgICAgICAgbGV0IHR4dFZhbCA9IHdhbGtOb2RlLm5vZGVWYWx1ZTtcbiAgICAgICAgICAgICAgICBsZXQgZmFpbHVyZSA9IC9eWyBcXHRcXHJcXG5dKlsoIF0qWzEtOV0qW1xcKlxcLSkuXVsgXFx0XVtBLVosYS16XSsvLnRlc3QodHh0VmFsKTtcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSAhZmFpbHVyZTtcbiAgICAgICAgICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGVyZSdzIHNvbWUgc29ydCBvZiBibG9jayBsZXZlbCBlbGVtZW50IGJlZm9yZSB0aGlzXG4gICAgICAgICAgICAgICAgICAgIC8vIEF2b2lkIGZhaWx1cmVzIGR1ZSB0byB0aGluZ3MgbGlrZSA8aT5Tb21lIHNlbnRlbmNlPC9pPi4gTmV3IHNlbnRlbmNlLlxuICAgICAgICAgICAgICAgICAgICBsZXQgbncgPSBuZXcgRE9NV2Fsa2VyKHdhbGtOb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCFwYXNzZWQgJiYgbncucHJldk5vZGUoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5vZGVOYW1lID0gbncubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFtcImJsb2NrcXVvdGVcIiwgXCJjZW50ZXJcIiwgXCJkaXJcIiwgXCJkaXZcIiwgXCJmb3JtXCIsIFwiaDFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImgyXCIsIFwiaDNcIiwgXCJoNFwiLCBcImg1XCIsIFwiaDZcIiwgXCJoclwiLCBcImJyXCIsIFwibWVudVwiLCBcInBcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInByZVwiXS5pbmNsdWRlcyhub2RlTmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlTmFtZSA9PSBcIiN0ZXh0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdHh0ID0gbncubm9kZS5ub2RlVmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gdHh0Lmxlbmd0aCA+IDAgJiYgIVtcIiBcIiwgXCJcXHRcIiwgXCJcXG5cIl0uaW5jbHVkZXModHh0LmNoYXJBdCh0eHQubGVuZ3RoIC0gMSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2Fsa05vZGUgPSB3YWxrTm9kZS5uZXh0U2libGluZztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBudWxsO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfbGlzdFwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGxpc3Rfc3RydWN0dXJlX3Byb3BlcjogUnVsZSA9IHtcbiAgICBpZDogXCJsaXN0X3N0cnVjdHVyZV9wcm9wZXJcIixcbiAgICBjb250ZXh0OiBcImRvbTpkbCwgZG9tOnVsLCBkb206b2wsIGRvbTpkaXIsIGRvbTptZW51LCBkb206bGksIGRvbTpkZCwgZG9tOmR0XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfTGlzdF9NaXN1c2VcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwibGlzdF9zdHJ1Y3R1cmVfcHJvcGVyLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJsaXN0X3N0cnVjdHVyZV9wcm9wZXIuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImxpc3Rfc3RydWN0dXJlX3Byb3Blci5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiTGlzdCBlbGVtZW50IGlzIG1pc3Npbmcgb3IgaW1wcm9wZXJseSBzdHJ1Y3R1cmVkXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiTGlzdCBlbGVtZW50cyBzaG91bGQgb25seSBiZSB1c2VkIGZvciBsaXN0cyBvZiByZWxhdGVkIGl0ZW1zXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHBhc3NlZDtcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAvLyBHZXQgYWxsIHRoZSBjaGlsZHJlbnMgb2YgdGhlIHJ1bGVDb250ZXh0XG4gICAgICAgIGxldCBjaGlsZHJlbiA9IHJ1bGVDb250ZXh0LmNoaWxkcmVuXG5cbiAgICAgICAgaWYgKG5vZGVOYW1lID09IFwiZGxcIikge1xuICAgICAgICAgICAgbGV0IGZpcnN0ID0gXCJcIjtcbiAgICAgICAgICAgIGxldCBsYXN0ID0gXCJcIjtcbiAgICAgICAgICAgIGxldCB3YWxrQ2hpbGRyZW4gPSBydWxlQ29udGV4dC5maXJzdENoaWxkIGFzIE5vZGU7XG4gICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgbGV0IHByZXNlbnRhdGlvbmFsRm91bmQgPSBmYWxzZTtcblxuICAgICAgICAgICAgLy8gSWYgdGhlcmUgYXJlIG5vIGNoaWxkcmVucyBzZXQgYXMgcGFzc2VkLCBzaW5jZSBkbCBlbGVtZW50cyBjYW4gaGF2ZVxuICAgICAgICAgICAgLy8gemVybyBvciBtb3JlIG9mOiBvbmUgb3IgbW9yZSBkdCBlbGVtZW50cywgZm9sbG93ZWQgYnkgb25lIG9yIG1vcmUgZGQgZWxlbWVudHNcbiAgICAgICAgICAgIGlmICghcnVsZUNvbnRleHQuY2hpbGRyZW4gfHwgcnVsZUNvbnRleHQuY2hpbGRyZW4ubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB3aGlsZSAocGFzc2VkICYmIHdhbGtDaGlsZHJlbiAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh3YWxrQ2hpbGRyZW4ubm9kZVR5cGUgPT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5vZGVOYW1lID0gd2Fsa0NoaWxkcmVuLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdoaWxlIHdhbGtpbmcgdGhyb3VnaCB0aGUgZWxlbWVudHMgdW5kZXIgZGwsIGlmIHdlIGZpbmQgYSBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByZXNlbnRhdGlvbmFsIGVsZW1lbnQgd2UgbW92ZSB0byB0aGUgbmV4dCBlbGVtZW50IGFzIHByZXNlbnRhdGlvbmFsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlbGVtZW50cyBhcmUgYWxsb3dlZCB1bmRlciBsaXN0IGVsZW1lbnRzIGFzIHRoZXkgYXJlIG9ubHkgZm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3JtYXR0aW5nIHRleHQgbm9kZXMuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJpYVV0aWwuaXNQcmVzZW50YXRpb25hbEVsZW1lbnQod2Fsa0NoaWxkcmVuKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsRm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbGtDaGlsZHJlbiA9IHdhbGtDaGlsZHJlbi5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSBzZXQgdG8gcGFzcyBpZiB3ZSBmaW5kIGRkIG9yIGR0IGVsZW1lbnQsIGluIHRoZSBjYXNlIG9mXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbiBlbGVtZW50IHRoYXQgaXMgbm90IHN1cHBvcnRlZCB3ZSB3aWxsIGNhdGNoIGl0IGhlcmUuIGkuZS4gaW1nIFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWxlbWVudFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gbm9kZU5hbWUgPT0gXCJkZFwiIHx8IG5vZGVOYW1lID09IFwiZHRcIjtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2V0IHRoZSBmaXJzdCBhbmQgbGFzdCBub2RlIGRlcGVuZGluZyBvbiB3aGljaCBpcyBmb3VuZCBmaXJzdCBhbmQgbGFzdFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0ID09IFwiXCIpIGZpcnN0ID0gbm9kZU5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYXN0ID0gbm9kZU5hbWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgd2Fsa0NoaWxkcmVuID0gd2Fsa0NoaWxkcmVuLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IHdlIGhhdmUgZm91bmQgZHQgYW5kIGRkIGVsZW1lbnRzIHVuZGVyIGRsIHdlIHBhc3MgcmlnaHQgYXdheS5cbiAgICAgICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IHRoZXJlIGlzIG5vIGR0IG9yIGRkIGVsZW1lbnQsIGJ1dCBidW5jaCBvZiBwcmVzZW50YXRpb25hbCBlbGVtZW50cyB3ZSBtYXJrIHRoaXMgYXMgYVxuICAgICAgICAgICAgICAgIC8vIHBhc3MuIEluIHRoZSBjYXNlIHRoYXQgdGhlcmUgYXJlIG90aGVyIGVsZW1lbnRzLCBzdWNoIGFzIGltZyB3ZSB3aWxsIHN0aWxsIHRyaWdnZXIgYSB2aW9sYXRpb24uXG4gICAgICAgICAgICAgICAgcGFzc2VkID0gKHBhc3NlZCAmJiBmaXJzdCA9PSBcImR0XCIgJiYgbGFzdCA9PSBcImRkXCIpIHx8IChwYXNzZWQgJiYgcHJlc2VudGF0aW9uYWxGb3VuZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAobm9kZU5hbWUgPT0gXCJsaVwiKSB7XG4gICAgICAgICAgICBwYXNzZWQgPSBDb21tb25VdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBbXCJ1bFwiLCBcIm9sXCIsIFwiZGlyXCIsIFwibWVudVwiXSkgIT0gbnVsbDtcbiAgICAgICAgfSBlbHNlIGlmIChub2RlTmFtZSA9PSBcImRkXCIgfHwgbm9kZU5hbWUgPT0gXCJkdFwiKSB7XG4gICAgICAgICAgICBwYXNzZWQgPSBDb21tb25VdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBcImRsXCIpICE9IG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgd2Fsa0NoaWxkcmVuID0gcnVsZUNvbnRleHQuZmlyc3RDaGlsZCBhcyBOb2RlO1xuICAgICAgICAgICAgLy8gWmVybyBvciBtb3JlIGxpIGVsZW1lbnRzIGFyZSBwZXJtaXR0ZWQgaW5zaWRlIG9mIDxvbD4sIDx1bD4gb3IgPG1lbnU+IGVsZW1lbnRzIG5vdyBhcyBwZXIgdGhlIGh0bWw1IHNwZWMuIFRoaXMgaGFuZGxlcyB0aGUgY2FzZVxuICAgICAgICAgICAgLy8gd2hlbiB0aGVyZSBhcmUgemVybyBlbGVtZW50cyB1bmRlciB0aGUgPG9sPiwgPHVsPiBvciA8bWVudT4uXG4gICAgICAgICAgICBpZiAoKG5vZGVOYW1lID09IFwidWxcIiB8fCBub2RlTmFtZSA9PSBcIm9sXCIgfHwgbm9kZU5hbWUgPT0gXCJtZW51XCIpICYmICghcnVsZUNvbnRleHQuY2hpbGRyZW4gfHwgcnVsZUNvbnRleHQuY2hpbGRyZW4ubGVuZ3RoID09IDApKSB7XG4gICAgICAgICAgICAgICAgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IGxpRm91bmQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBsZXQgcHJlc2VudGF0aW9uYWxGb3VuZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHBhc3NlZCAmJiB3YWxrQ2hpbGRyZW4gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBXaGlsZSB3YWxraW5nIHRocm91Z2ggdGhlIGxpc3QgZWxlbWVudHMsIGlmIHdlIGZpbmQgYSBcbiAgICAgICAgICAgICAgICAgICAgLy8gcHJlc2VudGF0aW9uYWwgZWxlbWVudCB3ZSBza2lwIGNoZWNraW5nIGFzIHByZXNlbnRhdGlvbmFsXG4gICAgICAgICAgICAgICAgICAgIC8vIGVsZW1lbnRzIGFyZSBhbGxvd2VkIHVuZGVyIGxpc3QgZWxlbWVudHMgYXMgdGhleSBhcmUgb25seSBmb3JcbiAgICAgICAgICAgICAgICAgICAgLy8gZm9ybWF0dGluZyB0ZXh0LlxuICAgICAgICAgICAgICAgICAgICBpZiAoQXJpYVV0aWwuaXNQcmVzZW50YXRpb25hbEVsZW1lbnQod2Fsa0NoaWxkcmVuKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxGb3VuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB3YWxrQ2hpbGRyZW4gPSB3YWxrQ2hpbGRyZW4ubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIFBhc3MgaWYgdGhlIG5vZGUgdHlwZSBpcyBhbnl0aGluZyBidXQgMSwgb3IgaW4gdGhlIGNhc2UgdGhhdCBpdCBpcyBhIGxpIGVsZW1lbnQuIEZvciBhbnkgb3RoZXIgbm9kZSBcbiAgICAgICAgICAgICAgICAgICAgLy8gaXQgd2lsbCBiZSBjYXVnaHQgaGVyZSB0aGF0IGVsZW1lbnQgaXMgbm90IGFsbG93ZWQgdW5kZXIgbGlzdCBub2RlLlxuICAgICAgICAgICAgICAgICAgICAvLyBGdXJ0aGVybW9yZSBpbiB0aGUgY2FzZSB0aGF0IHRoZXJlIGlzIGEgdGVtcGxhdGUgZWxlbWVudCB3aXRoIHRoZSBwYXJlbnQgYmVpbmcgdWwvb2wgZG9uJ3QgZmxhZyBhIHZpb2xhdGlvblxuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSB3YWxrQ2hpbGRyZW4ubm9kZVR5cGUgIT0gMSB8fCB3YWxrQ2hpbGRyZW4ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSBcImxpXCIgfHwgKHdhbGtDaGlsZHJlbi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09IFwidGVtcGxhdGVcIiAmJiAobm9kZU5hbWUgPT0gXCJ1bFwiIHx8IG5vZGVOYW1lID09IFwib2xcIikpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFNldCBsaSBmb3VuZCB0byB0cnVlIGlmIHRoZSBjdXJyZW50IGVsZW1lbnQgKG5vZGVUeXBlPTEpIGlzIGFuIGxpIGVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgbGlGb3VuZCA9IGxpRm91bmQgfHwgKHdhbGtDaGlsZHJlbi5ub2RlVHlwZSA9PSAxICYmIHdhbGtDaGlsZHJlbi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09IFwibGlcIik7XG4gICAgICAgICAgICAgICAgICAgIHdhbGtDaGlsZHJlbiA9IHdhbGtDaGlsZHJlbi5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gSW4gdGhlIGNhc2UgdGhhdCBpdCBoYXMgcGFzc2VkIGFuZCBhbHNvIGxpIGVsZW1lbnQgaXMgZm91bmQgdW5kZXIgbGlzdCBub2RlLCB3ZSBwYXNzIHJpZ2h0IGF3YXkuXG4gICAgICAgICAgICAgICAgLy8gSW4gdGhlIGNhc2UgdGhhdCB0aGVyZSBpcyBubyBsaSBlbGVtZW50LCBidXQgYnVuY2ggb2YgcHJlc2VudGF0aW9uYWwgZWxlbWVudHMgd2UgbWFyayB0aGlzIGFzIGFcbiAgICAgICAgICAgICAgICAvLyBwYXNzLiBJbiB0aGUgY2FzZSB0aGF0IHRoZXJlIGFyZSBvdGhlciBlbGVtZW50cywgc3VjaCBhcyBpbWcgd2Ugd2lsbCBzdGlsbCB0cmlnZ2VyIGEgdmlvbGF0aW9uLlxuICAgICAgICAgICAgICAgIHBhc3NlZCA9IChwYXNzZWQgJiYgbGlGb3VuZCkgfHwgKHBhc3NlZCAmJiBwcmVzZW50YXRpb25hbEZvdW5kKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5cbmV4cG9ydCBjb25zdCBtYXJxdWVlX2VsZW1fYXZvaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwibWFycXVlZV9lbGVtX2F2b2lkXCIsXG4gICAgY29udGV4dDogXCJkb206bWFycXVlZVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX01hcnF1ZWVfVHJpZ2dlclwiOiB7XG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIm1hcnF1ZWVfZWxlbV9hdm9pZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwibWFycXVlZV9lbGVtX2F2b2lkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiU2Nyb2xsaW5nIGNvbnRlbnQgZm91bmQgdGhhdCB1c2VzIHRoZSBvYnNvbGV0ZSA8bWFycXVlZT4gZWxlbWVudFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSA8bWFycXVlZT4gZWxlbWVudCBpcyBvYnNvbGV0ZSBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjIuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vIEpDSCAtIE5PIE9VVCBPRiBTQ09QRSBoaWRkZW4gaW4gY29udGV4dFxuICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgbWVkaWFfYWx0X2JyaWVmOiBSdWxlID0ge1xuICAgIGlkOiBcIm1lZGlhX2FsdF9icmllZlwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmltZ1thbHRdLCBkb206YXBwbGV0W2FsdF0sIGRvbTphcmVhW2FsdF0sIGRvbTplbWJlZFthbHRdLCBkb206aW5wdXRbdHlwZV1bYWx0XVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX01lZGlhX0FsdEJyaWVmXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIm1lZGlhX2FsdF9icmllZi5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwibWVkaWFfYWx0X2JyaWVmLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJtZWRpYV9hbHRfYnJpZWYuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlRleHQgYWx0ZXJuYXRpdmUgaXMgbW9yZSB0aGFuIDE1MCBjaGFyYWN0ZXJzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQWx0ZXJuYXRpdmUgdGV4dCBpbiAnYWx0JyBhdHRyaWJ1dGUgc2hvdWxkIGJlIGJyaWVmICg8MTUwIGNoYXJhY3RlcnMpXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRlUGFyYW1zID0ge1xuICAgICAgICAgICAgbWF4QWx0OiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IDE1MCxcbiAgICAgICAgICAgICAgICB0eXBlOiBcImludGVnZXJcIlxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IGFsdExlbmd0aCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFsdFwiKS50cmltKCkubGVuZ3RoO1xuICAgICAgICBsZXQgcGFzc2VkID0gYWx0TGVuZ3RoIDw9IHZhbGlkYXRlUGFyYW1zLm1heEFsdC52YWx1ZTtcbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBtZWRpYV9hbHRfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcIm1lZGlhX2FsdF9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTphcmVhW2FsdF0sIGRvbTplbWJlZFthbHRdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfTWVkaWFfQXVkaW9WaWRlb0FsdEZpbGVuYW1lXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIm1lZGlhX2FsdF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIm1lZGlhX2FsdF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIm1lZGlhX2FsdF9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIkZpbGVuYW1lIHVzZWQgYXMgbGFiZWwgZm9yIGVtYmVkZGVkIGF1ZGlvIG9yIHZpZGVvXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQXVkaW8gb3IgdmlkZW8gb24gdGhlIHBhZ2UgbXVzdCBoYXZlIGEgc2hvcnQgdGV4dCBhbHRlcm5hdGl2ZSB0aGF0IGRlc2NyaWJlcyB0aGUgbWVkaWEgY29udGVudFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgdXJpID0gXCJcIjtcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT0gXCJhcmVhXCIpIHtcbiAgICAgICAgICAgIHVyaSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImhyZWZcIilcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHVyaSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInNyY1wiKVxuICAgICAgICB9XG4gICAgICAgIGlmICh1cmkgPT0gbnVsbCkgdXJpID0gXCJcIjtcbiAgICAgICAgbGV0IGV4dCA9IENvbW1vblV0aWwuZ2V0RmlsZUV4dCh1cmkpO1xuICAgICAgICBsZXQgaXNBdWRWaWQgPSBleHQubGVuZ3RoICE9IDAgJiYgKENvbW1vblV0aWwuaXNBdWRpb0V4dChleHQpIHx8IENvbW1vblV0aWwuaXNWaWRlb0V4dChleHQpKTtcbiAgICAgICAgbGV0IGFsdFRleHQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhbHRcIik7XG4gICAgICAgIGxldCBwYXNzZWQgPSAhaXNBdWRWaWQgfHwgKGFsdFRleHQubGVuZ3RoID4gMCAmJiBhbHRUZXh0LmluZGV4T2YoZXh0KSA9PSAtMSk7XG5cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVNYW51YWwsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IG1lZGlhX2F1ZGlvX3RyYW5zY3JpYmVkOiBSdWxlID0ge1xuICAgIGlkOiBcIm1lZGlhX2F1ZGlvX3RyYW5zY3JpYmVkXCIsXG4gICAgY29udGV4dDogXCJkb206Ymdzb3VuZCwgZG9tOmFbaHJlZl0sIGRvbTphcmVhW2hyZWZdLCBkb206ZW1iZWQsIGRvbTpvYmplY3RcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9NZWRpYV9BdWRpb1RyaWdnZXJcIjoge1xuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIk1hbnVhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIm1lZGlhX2F1ZGlvX3RyYW5zY3JpYmVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJtZWRpYV9hdWRpb190cmFuc2NyaWJlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwiUHJvdmlkZSB0cmFuc2NyaXB0cyBmb3IgYXVkaW8gZmlsZXNcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBdWRpbyBpbmZvcm1hdGlvbiBzaG91bGQgYWxzbyBiZSBhdmFpbGFibGUgaW4gdGV4dCBmb3JtXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjIuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgcGFzc2VkO1xuICAgICAgICBsZXQgdGhpc05vZGUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAodGhpc05vZGUgPT0gXCJiZ3NvdW5kXCIpIHtcbiAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGFzc2VkID0gIUNvbW1vblV0aWwuaXNBdWRpb09iakVtYmVkTGluayhydWxlQ29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIG51bGw7IC8vIE91dCBvZiBTY29wZVxuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVNYW51YWwoXCJNYW51YWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG5leHBvcnQgY29uc3QgbWVkaWFfYXV0b3N0YXJ0X2NvbnRyb2xsYWJsZTogUnVsZSA9IHtcbiAgICBpZDogXCJtZWRpYV9hdXRvc3RhcnRfY29udHJvbGxhYmxlXCIsXG4gICAgY29udGV4dDogXCJkb206cGFyYW1bbmFtZT1hdXRvcGxheV0sIGRvbTpwYXJhbVtuYW1lPWF1dG9zdGFydF0sIGRvbTplbWJlZFtmbGFzaHZhcnNdLCBkb206ZW1iZWRbc3JjXSwgZG9tOipbYXV0b3N0YXJ0PXRydWVdLCBkb206KlthdXRvc3RhcnQ9MV0sIGRvbTpiZ3NvdW5kXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfRW1iZWRfQXV0b1N0YXJ0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIm1lZGlhX2F1dG9zdGFydF9jb250cm9sbGFibGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIm1lZGlhX2F1dG9zdGFydF9jb250cm9sbGFibGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIm1lZGlhX2F1dG9zdGFydF9jb250cm9sbGFibGUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0aGVyZSBpcyBhIG1lY2hhbmlzbSB0byBwYXVzZSBvciBzdG9wIGFuZCBjb250cm9sIHRoZSB2b2x1bWUgZm9yIHRoZSBhdWRpbyB0aGF0IHBsYXlzIGF1dG9tYXRpY2FsbHlcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJNZWNoYW5pc20gbXVzdCBiZSBhdmFpbGFibGUgdG8gcGF1c2Ugb3Igc3RvcCBhbmQgY29udHJvbCB0aGUgdm9sdW1lIG9mIHRoZSBhdWRpbyB0aGF0IHBsYXlzIGF1dG9tYXRpY2FsbHlcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuNC4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGxldCBwYXNzZWQ7XG4gICAgICAgIGlmIChub2RlTmFtZSA9PSBcImJnc291bmRcIikge1xuICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSBpZiAobm9kZU5hbWUgPT0gXCJwYXJhbVwiKSB7XG4gICAgICAgICAgICBsZXQgY29udGVudCA9IFwiXCI7XG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidmFsdWVcIikpXG4gICAgICAgICAgICAgICAgY29udGVudCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInZhbHVlXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBwYXNzZWQgPSBjb250ZW50LmluZGV4T2YoXCIwO1wiKSA9PSAwIHx8XG4gICAgICAgICAgICAgICAgIShjb250ZW50LmluZGV4T2YoXCJ0cnVlXCIpICE9IC0xIHx8IGNvbnRlbnQuaW5kZXhPZihcIjFcIikgIT0gLTEpO1xuICAgICAgICB9IGVsc2UgaWYgKG5vZGVOYW1lID09IFwiZW1iZWRcIikge1xuICAgICAgICAgICAgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJmbGFzaHZhcnNcIikpIHtcbiAgICAgICAgICAgICAgICBsZXQgc3RyID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiZmxhc2h2YXJzXCIpO1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9IHN0ci5pbmRleE9mKFwiYXV0b3N0YXJ0PXRydWVcIikgPT0gLTEgJiZcbiAgICAgICAgICAgICAgICAgICAgc3RyLmluZGV4T2YoXCJhdXRvc3RhcnQ9MVwiKSA9PSAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwYXNzZWQgJiYgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwic3JjXCIpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHN0ciA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInNyY1wiKTtcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSBzdHIuaW5kZXhPZihcImF1dG9zdGFydD10cnVlXCIpID09IC0xICYmXG4gICAgICAgICAgICAgICAgICAgIHN0ci5pbmRleE9mKFwiYXV0b3N0YXJ0PTFcIikgPT0gLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZCAmJiBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhdXRvc3RhcnRcIikpIHtcbiAgICAgICAgICAgIGxldCB2YWwgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhdXRvc3RhcnRcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIHBhc3NlZCA9IHZhbCAhPSAndHJ1ZScgJiYgdmFsICE9ICcxJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFzc2VkID8gUnVsZVBhc3MoXCJQYXNzXzBcIikgOiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgbWVkaWFfa2V5Ym9hcmRfY29udHJvbGxhYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcIm1lZGlhX2tleWJvYXJkX2NvbnRyb2xsYWJsZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmF1ZGlvLCBkb206dmlkZW9cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIkhBQUNfQXVkaW9fVmlkZW9fVHJpZ2dlclwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIk1hbnVhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJtZWRpYV9rZXlib2FyZF9jb250cm9sbGFibGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIm1lZGlhX2tleWJvYXJkX2NvbnRyb2xsYWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwibWVkaWFfa2V5Ym9hcmRfY29udHJvbGxhYmxlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJWZXJpZnkgbWVkaWEgdXNpbmcgPGF1ZGlvPiBhbmQvb3IgPHZpZGVvPiBlbGVtZW50cyBoYXZlIGtleWJvYXJkIGFjY2Vzc2libGUgY29udHJvbHNcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJNZWRpYSB1c2luZyA8YXVkaW8+IGFuZC9vciA8dmlkZW8+IGVsZW1lbnRzIG11c3QgaGF2ZSBrZXlib2FyZCBhY2Nlc3NpYmxlIGNvbnRyb2xzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAobm9kZU5hbWUgPT0gXCJhdWRpb1wiIHx8IG5vZGVOYW1lID09PSBcInZpZGVvXCIpIHtcbiAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXNzZWQgPyBSdWxlUGFzcyhcIlBhc3NfMFwiKSA6IFJ1bGVNYW51YWwoXCJNYW51YWxfMVwiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlTWFudWFsLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IG1lZGlhX2xpdmVfY2FwdGlvbmVkOiBSdWxlID0ge1xuICAgIGlkOiBcIm1lZGlhX2xpdmVfY2FwdGlvbmVkXCIsXG4gICAgY29udGV4dDogXCJkb206ZW1iZWQsIGRvbTpvYmplY3RcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9NZWRpYV9WaWRlb09iamVjdFRyaWdnZXJcIjoge1xuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIk1hbnVhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIm1lZGlhX2xpdmVfY2FwdGlvbmVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJtZWRpYV9saXZlX2NhcHRpb25lZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwiVmVyaWZ5IGNhcHRpb25zIGFyZSBwcm92aWRlZCBmb3IgbGl2ZSBtZWRpYSAoc3RyZWFtaW5nIHZpZGVvIHdpdGggYXVkaW8pXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiTGl2ZSBtZWRpYSAoc3RyZWFtaW5nIHZpZGVvIHdpdGggYXVkaW8pIHNob3VsZCBoYXZlIGNhcHRpb25zIGZvciBhdWRpbyBjb250ZW50XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjIuNFwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSAhQ29tbW9uVXRpbC5pc1ZpZGVvT2JqRW1iZWRMaW5rKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZU1hbnVhbChcIk1hbnVhbF8xXCIpO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVNYW51YWwsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IG1lZGlhX3RyYWNrX2F2YWlsYWJsZTogUnVsZSA9IHtcbiAgICBpZDogXCJtZWRpYV90cmFja19hdmFpbGFibGVcIixcbiAgICBjb250ZXh0OiBcImRvbTphW2hyZWZdLCBkb206YXJlYVtocmVmXSwgZG9tOmFwcGxldCwgZG9tOmVtYmVkLCBkb206b2JqZWN0XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfTWVkaWFfVmlkZW9SZWZlcmVuY2VUcmlnZ2VyXCI6IHtcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJNYW51YWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJtZWRpYV90cmFja19hdmFpbGFibGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIm1lZGlhX3RyYWNrX2F2YWlsYWJsZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwiVmVyaWZ5IGF2YWlsYWJpbGl0eSBvZiBhIHVzZXItc2VsZWN0YWJsZSBhdWRpbyB0cmFjayB3aXRoIGRlc2NyaXB0aW9uIG9mIHZpc3VhbCBjb250ZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiUHJlLXJlY29yZGVkIG1lZGlhIHNob3VsZCBoYXZlIGFuIGF1ZGlvIHRyYWNrIHRoYXQgZGVzY3JpYmVzIHZpc3VhbCBpbmZvcm1hdGlvblwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4yLjNcIiwgXCIxLjIuNVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcblxuICAgICAgICBpZiAobm9kZU5hbWUgPT0gXCJhcHBsZXRcIikge1xuICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXNzZWQgPSAhQ29tbW9uVXRpbC5pc1ZpZGVvT2JqRW1iZWRMaW5rKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBudWxsO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVNYW51YWwoXCJNYW51YWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgbWV0YV9yZWRpcmVjdF9vcHRpb25hbDogUnVsZSA9IHtcbiAgICBpZDogXCJtZXRhX3JlZGlyZWN0X29wdGlvbmFsXCIsXG4gICAgY29udGV4dDogXCJkb206bWV0YVtodHRwLWVxdWl2XVtjb250ZW50XVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX01ldGFfUmVkaXJlY3RaZXJvXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiZmFpbFwiOiBcImZhaWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9sb25ncmVmcmVzaFwiOiBcImZhaWxfbG9uZ3JlZnJlc2hcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIm1ldGFfcmVkaXJlY3Rfb3B0aW9uYWwuaHRtbFwiLFxuICAgICAgICAgICAgXCJwYXNzXCI6IFwibWV0YV9yZWRpcmVjdF9vcHRpb25hbC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxcIjogXCJtZXRhX3JlZGlyZWN0X29wdGlvbmFsLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9sb25ncmVmcmVzaFwiOiBcIm1ldGFfcmVkaXJlY3Rfb3B0aW9uYWwuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIlBhZ2Ugc2hvdWxkIG5vdCBhdXRvbWF0aWNhbGx5IHJlZnJlc2ggd2l0aG91dCB3YXJuaW5nIG9yIG9wdGlvbiB0byB0dXJuIGl0IG9mZiBvciBhZGp1c3QgdGhlIHRpbWUgbGltaXRcIixcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcImZhaWxcIjogXCJDaGVjayBwYWdlIGRvZXMgbm90IGF1dG9tYXRpY2FsbHkgcmVmcmVzaCB3aXRob3V0IHdhcm5pbmcgb3Igb3B0aW9uc1wiLFxuICAgICAgICAgICAgXCJmYWlsX2xvbmdyZWZyZXNoXCI6IFwiQ2hlY2sgcGFnZSBkb2VzIG5vdCBhdXRvbWF0aWNhbGx5IHJlZnJlc2ggd2l0aG91dCB3YXJuaW5nIG9yIG9wdGlvbnNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBkZXByZWNhdGUgV0NBRyBBQUFcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuMi40XCIsIFwiMy4yLjVcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgKi9cbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi4yLjRcIiwgXCIzLjIuNVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICAvLyBSZW1vdmVkIEFDVCBiaXN6NTggQUFBXG4gICAgLyoqYWN0OiBbeyBcbiAgICAgICAgXCJiYzY1OWFcIiA6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiZmFpbFwiOiBcImZhaWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9sb25ncmVmcmVzaFwiOiBcInBhc3NcIlxuICAgICAgICB9XG4gICAgfV0sKi9cbiAgICBhY3Q6IFsgXCJiaXN6NThcIl0sICAvLyBmYWlsIGV2ZW4gaWYgYSBwYWdlIGlzIHJlZGlyZWN0ZWQgYWZ0ZXIgbW9yZSB0aGFuIDIwIGhvdXJzICg3MjAwKVxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIFxuICAgICAgICBpZiAocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiaHR0cC1lcXVpdlwiKS50b0xvd2VyQ2FzZSgpICE9PSAncmVmcmVzaCcpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGRvYyA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQ7XG4gICAgICAgIGlmICghZG9jKSByZXR1cm47XG5cbiAgICAgICAgLy8gY2hlY2sgaWYgdGhlIHJ1bGUgYWxyZWFkeSBwYXNzZWQgb3IgZmFpbGVkOiBvbmx5IHRoZSBmaXJzdCBvbmUgdHJpZGRlcnMgaWYgbXVsdGlwbGVcbiAgICAgICAgaWYgKENhY2hlVXRpbC5nZXRDYWNoZShkb2MsIFwibWV0YV9yZWRpcmVjdF9vcHRpb25hbF9kb25lXCIsIGZhbHNlKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsOyAgICBcblxuICAgICAgICBsZXQgY29udGVudCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImNvbnRlbnRcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKCFjb250ZW50IHx8IGNvbnRlbnQudHJpbSgpLmxlbmd0aCA9PT0wKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgbGV0IHRpbWU6bnVtYmVyID0gLTE7XG4gICAgICAgIGlmIChjb250ZW50Lm1hdGNoKC9eXFxkKyQvKSkgXG4gICAgICAgICAgICB0aW1lID0gcGFyc2VJbnQoY29udGVudCk7XG4gICAgICAgIGVsc2UgaWYgKGNvbnRlbnQubWF0Y2goL15cXGQrOy8pKSB7XG4gICAgICAgICAgICBsZXQgcG9zID0gY29udGVudC5pbmRleE9mKFwiO1wiKTtcbiAgICAgICAgICAgIHRpbWUgPSBwYXJzZUludChjb250ZW50LnN1YnN0cmluZygwLCBwb3MpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJbnZhbGlkIGNvbnRlbnQgZmllbGRcbiAgICAgICAgaWYgKHRpbWUgPT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShkb2MsIFwibWV0YV9yZWRpcmVjdF9vcHRpb25hbF9kb25lXCIsIHRydWUpO1xuICAgICAgICBpZiAodGltZSA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIGVsc2UgaWYgKHRpbWUgPCA3MjAwMSlcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxcIik7XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2xvbmdyZWZyZXNoXCIpOyAgICBcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBtZXRhX3JlZnJlc2hfZGVsYXk6IFJ1bGUgPSB7XG4gICAgaWQ6IFwibWV0YV9yZWZyZXNoX2RlbGF5XCIsXG4gICAgY29udGV4dDogXCJkb206bWV0YVtodHRwLWVxdWl2XVtjb250ZW50XVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX01ldGFfUmVmcmVzaFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJwb3RlbnRpYWxfcmVmcmVzaFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwibWV0YV9yZWZyZXNoX2RlbGF5Lmh0bWxcIixcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIm1ldGFfcmVmcmVzaF9kZWxheS5odG1sXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9yZWZyZXNoXCI6IFwibWV0YV9yZWZyZXNoX2RlbGF5Lmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJQYWdlcyBzaG91bGQgbm90IHJlZnJlc2ggYXV0b21hdGljYWxseVwiLFxuICAgICAgICAgICAgXCJwYXNzXCI6IFwiUGFnZXMgZG8gbm90IHJlZnJlc2ggYXV0b21hdGljYWxseVwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfcmVmcmVzaFwiOiBcIlZlcmlmeSBwYWdlIGlzIG5vdCBiZWluZyBjYXVzZWQgdG8gcmVmcmVzaCBhdXRvbWF0aWNhbGx5XCIsXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi4yLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgLy9hY3Q6IFsgXCJiaXN6NThcIiwgXCJiYzY1OWFcIiBdLFxuICAgIGFjdDogWyBcImJjNjU5YVwiIF0sICAvLyBwYXNzIGlmIGEgcGFnZSBpcyByZWRpcmVjdGVkIGFmdGVyIG1vcmUgdGhhbiAyMCBob3VycyAoNzIwMClcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiaHR0cC1lcXVpdlwiKS50b0xvd2VyQ2FzZSgpICE9PSAncmVmcmVzaCcpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgZG9jID0gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudDtcbiAgICAgICAgaWYgKCFkb2MpIHJldHVybjtcblxuICAgICAgICAvLyBjaGVjayBpZiB0aGUgcnVsZSBhbHJlYWR5IHBhc3NlZDogdGhlIGZpcnN0IG9uZSB0YWtlcyBwcmlvcml0eVxuICAgICAgICBpZiAoQ2FjaGVVdGlsLmdldENhY2hlKGRvYywgXCJtZXRhX3JlZnJlc2hfZGVsYXlfZG9uZVwiLCBmYWxzZSkpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgY29udGVudCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImNvbnRlbnRcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKCFjb250ZW50IHx8IGNvbnRlbnQudHJpbSgpLmxlbmd0aCA9PT0wKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgbGV0IHRpbWU6bnVtYmVyID0gLTE7XG4gICAgICAgIGlmIChjb250ZW50Lm1hdGNoKC9eXFxkKyQvKSkgXG4gICAgICAgICAgICB0aW1lID0gcGFyc2VJbnQoY29udGVudCk7XG4gICAgICAgIGVsc2UgaWYgKGNvbnRlbnQubWF0Y2goL15cXGQrOy8pKSB7XG4gICAgICAgICAgICBsZXQgcG9zID0gY29udGVudC5pbmRleE9mKFwiO1wiKTtcbiAgICAgICAgICAgIHRpbWUgPSBwYXJzZUludChjb250ZW50LnN1YnN0cmluZygwLCBwb3MpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJbnZhbGlkIGNvbnRlbnQgZmllbGRcbiAgICAgICAgaWYgKHRpbWUgPT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShkb2MsIFwibWV0YV9yZWZyZXNoX2RlbGF5X2RvbmVcIiwgdHJ1ZSk7XG4gICAgICAgIGlmICh0aW1lID09PSAwKSBcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX3JlZnJlc2hcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5cbmV4cG9ydCBjb25zdCBtZXRhX3ZpZXdwb3J0X3pvb21hYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcIm1ldGFfdmlld3BvcnRfem9vbWFibGVcIixcbiAgICBjb250ZXh0OiBcImRvbTptZXRhW25hbWVdW2NvbnRlbnRdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJtZXRhX3ZpZXdwb3J0X3pvb21cIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwicG90ZW50aWFsX3pvb21hYmxlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJtZXRhX3ZpZXdwb3J0X3pvb21hYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIm1ldGFfdmlld3BvcnRfem9vbWFibGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfem9vbWFibGVcIjogXCJtZXRhX3ZpZXdwb3J0X3pvb21hYmxlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgJ21ldGFbbmFtZT12aWV3cG9ydF0nIHNob3VsZCBub3QgcHJldmVudCB0aGUgYnJvd3NlciB6b29taW5nIHRoZSBjb250ZW50XCIsXG4gICAgICAgICAgICBcInBhc3NcIjogXCJUaGUgJ21ldGFbbmFtZT12aWV3cG9ydF0nIGRvZXMgbm90IHByZXZlbnQgdGhlIGJyb3dzZXIgem9vbWluZyB0aGUgY29udGVudFwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfem9vbWFibGVcIjogXCJDb25maXJtIHRoZSAnbWV0YVtuYW1lPXZpZXdwb3J0XScgd2l0aCBcXFwiezB9XFxcIiBjYW4gYmUgem9vbWVkIGJ5IHVzZXJcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuNC40XCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbe1xuICAgICAgICBcImI0ZjBjM1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF96b29tYWJsZVwiOiBcImZhaWxcIlxuICAgICAgICB9XG4gICAgfV0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcblxuICAgICAgICBpZiAocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwibmFtZVwiKS50b0xvd2VyQ2FzZSgpICE9PSAndmlld3BvcnQnKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgbGV0IGNvbnRlbnQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJjb250ZW50XCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIC8vIG5laXRoZXIgbWF4aW11bS1zY2FsZSBub3IgdXNlci1zY2FsYWJsZSAoZGVmYXVsdCB5ZXMpXG4gICAgICAgIGlmICghY29udGVudCB8fCBjb250ZW50LnRyaW0oKSA9PT0gJycgfHwgKCFjb250ZW50LmluY2x1ZGVzKCdtYXhpbXVtLXNjYWxlJykgJiYgIWNvbnRlbnQuaW5jbHVkZXMoJ3VzZXItc2NhbGFibGUnKSkpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgdXNlcl9tc2cgPSBudWxsO1xuICAgICAgICBsZXQgbWF4X21zZyA9IG51bGw7XG4gICAgICAgIGNvbnN0IHByb3BzID0gY29udGVudC5zcGxpdChcIixcIik7XG4gICAgICAgIGxldCB1c2VyX3NjYWxlX3ZhbHVlID0gJ3llcyc7XG4gICAgICAgIGxldCBtYXhpbXVtX3NjYWxlX3ZhbHVlID0gJzIuMCc7XG4gICAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBwcm9wcykge1xuICAgICAgICAgICAgY29uc3QgcGllY2VzID0gcHJvcC50cmltKCkuc3BsaXQoJz0nKTtcbiAgICAgICAgICAgIGlmIChwaWVjZXMubGVuZ3RoIDwgMikgY29udGludWU7XG4gICAgICAgICAgICBpZiAocHJvcC5pbmNsdWRlcygndXNlci1zY2FsYWJsZScpKSB7XG4gICAgICAgICAgICAgICAgdXNlcl9tc2cgPSBwcm9wO1xuICAgICAgICAgICAgICAgIHVzZXJfc2NhbGVfdmFsdWUgPSBwaWVjZXNbMV0udHJpbSgpO1xuICAgICAgICAgICAgICAgIGlmICh1c2VyX3NjYWxlX3ZhbHVlLnN0YXJ0c1dpdGgoXCInXCIpIHx8IHVzZXJfc2NhbGVfdmFsdWUuc3RhcnRzV2l0aCgnXCInKSkge1xuICAgICAgICAgICAgICAgICAgICB1c2VyX3NjYWxlX3ZhbHVlID0gdXNlcl9zY2FsZV92YWx1ZS5zdWJzdHJpbmcoMSwgdXNlcl9zY2FsZV92YWx1ZS5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHByb3AuaW5jbHVkZXMoJ21heGltdW0tc2NhbGUnKSkge1xuICAgICAgICAgICAgICAgIG1heF9tc2cgPSBwcm9wO1xuICAgICAgICAgICAgICAgIG1heGltdW1fc2NhbGVfdmFsdWUgPSBwaWVjZXNbMV0udHJpbSgpO1xuICAgICAgICAgICAgICAgIGlmIChtYXhpbXVtX3NjYWxlX3ZhbHVlLnN0YXJ0c1dpdGgoXCInXCIpIHx8IG1heGltdW1fc2NhbGVfdmFsdWUuc3RhcnRzV2l0aCgnXCInKSkge1xuICAgICAgICAgICAgICAgICAgICBtYXhpbXVtX3NjYWxlX3ZhbHVlID0gbWF4aW11bV9zY2FsZV92YWx1ZS5zdWJzdHJpbmcoMSwgbWF4aW11bV9zY2FsZV92YWx1ZS5sZW5ndGggLSAxKS50cmltKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHZhbHVlID0gTnVtYmVyKHVzZXJfc2NhbGVfdmFsdWUpO1xuICAgICAgICBpZiAoIWlzTmFOKHZhbHVlKSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlID49IDEgfHwgdmFsdWUgPD0gLTEpIHVzZXJfc2NhbGVfdmFsdWUgPSAneWVzJztcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBtYXhpbXVtX3NjYWxlID0gMi4wO1xuICAgICAgICB2YWx1ZSA9IE51bWJlcihtYXhpbXVtX3NjYWxlX3ZhbHVlKTtcbiAgICAgICAgaWYgKCFpc05hTih2YWx1ZSkpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA8IDApIG1heGltdW1fc2NhbGUgPSAyLjA7XG4gICAgICAgICAgICBlbHNlIG1heGltdW1fc2NhbGUgPSB2YWx1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChtYXhpbXVtX3NjYWxlX3ZhbHVlID09PSAneWVzJykgbWF4aW11bV9zY2FsZSA9IDEuMDtcbiAgICAgICAgICAgIGVsc2UgbWF4aW11bV9zY2FsZSA9IDAuMTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHVzZXItc2NhbGFibGUgaXMgbm90IHNldCB0byAneWVzJywgaWdub3JlIG1heGltdW1fc2NhbGVcbiAgICAgICAgaWYgKHVzZXJfc2NhbGVfdmFsdWUgIT09ICd5ZXMnKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF96b29tYWJsZVwiLCBbdXNlcl9tc2ddKTtcbiAgICAgICAgfVxuICAgICAgICAvLyB1c2VyLXNjYWxhYmxlIGlzICd5ZXMnLCBidXQgbWF4aW11bV9zY2FsZSBpcyB0b28gc21hbGxcbiAgICAgICAgaWYgKG1heGltdW1fc2NhbGUgPCAyLjApIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX3pvb21hYmxlXCIsIFttYXhfbXNnXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3Qgbm9lbWJlZF9jb250ZW50X2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJub2VtYmVkX2NvbnRlbnRfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJkb206bm9lbWJlZFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiVmFsZXJpZV9Ob2VtYmVkX0hhc0NvbnRlbnRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIm5vZW1iZWRfY29udGVudF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIm5vZW1iZWRfY29udGVudF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIm5vZW1iZWRfY29udGVudF9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIkFkZCBkZXNjcmlwdGl2ZSB0ZXh0IHRvIHRoZSA8bm9lbWJlZD4gZWxlbWVudFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIjxub2VtYmVkPiBlbGVtZW50cyBzaG91bGQgY29udGFpbiBkZXNjcmlwdGl2ZSB0ZXh0XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9GT1VSXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBwYXNzZWQgPSBDb21tb25VdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbihydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgQWNjTmFtZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BY2NOYW1lVXRpbFwiO1xuXG5leHBvcnQgY29uc3Qgb2JqZWN0X3RleHRfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcIm9iamVjdF90ZXh0X2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOm9iamVjdFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX09iamVjdF9IYXNUZXh0XCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiZmFpbF9ub190ZXh0X2FsdGVybmF0aXZlXCI6IFwiZmFpbF9ub190ZXh0X2FsdGVybmF0aXZlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJvYmplY3RfdGV4dF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJwYXNzXCI6IFwib2JqZWN0X3RleHRfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9ub190ZXh0X2FsdGVybmF0aXZlXCI6IFwib2JqZWN0X3RleHRfZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCI8b2JqZWN0PiBlbGVtZW50IG11c3QgaGF2ZSBhIHRleHQgYWx0ZXJuYXRpdmUgZm9yIHRoZSBjb250ZW50IHJlbmRlcmVkIGJ5IHRoZSBvYmplY3RcIixcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIjxvYmplY3Q+IGVsZW1lbnQgaGFzIGEgdGV4dCBhbHRlcm5hdGl2ZVwiLFxuICAgICAgICAgICAgXCJmYWlsX25vX3RleHRfYWx0ZXJuYXRpdmVcIjogXCJBbiA8b2JqZWN0PiBlbGVtZW50IGRvZXMgbm90IGhhdmUgYSB0ZXh0IGFsdGVybmF0aXZlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBcIjhmYzNiNlwiLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIC8vIERldGVjdCBpZiB0aGlzIG9iamVjdCBpcyBvZiB0eXBlIHRleHQsIGJ5IGNoZWNraW5nIHRoZSBvYmplY3QgdHlwZSBpbiB0aGUgY2FzZSBpdCBpcyB0ZXh0IHRoZW4gZG8gbm90IHRyaWdnZXIgdGhpcyBydWxlXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0eXBlXCIpICYmIChydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpKS5pbmRleE9mKFwidGV4dFwiKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBpZ25vcmUgaWYgYW4gZXhwbGljaXQgcm9sZSBpcyBzcGVjaWZpZWQ6IGluY2x1ZGluZyAncHJlc2VudGF0aW9uJywgJ25vbmUnLCAnYXBwbGljYXRpb24nLCAnZG9jdW1lbnQnIG9yICdpbWcnXG4gICAgICAgIC8vIHRoaXMgY2FzZSB3aWxsIGJlIGNvdmVyZWQgaW4gb3RoZXIgcnVsZXNcbiAgICAgICAgbGV0IHJvbGUgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpO1xuICAgICAgICBpZiAocm9sZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQZXIgQUNULCBpZ25vcmUgZW1iZWRkZWQgSFRNTCBmaWxlc1xuICAgICAgICBsZXQgZGF0YSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImRhdGFcIik7XG4gICAgICAgIGxldCBleHQgPSBkYXRhICYmIHR5cGVvZiBkYXRhID09PSB0eXBlb2YgXCJcIiA/IGRhdGEuc3Vic3RyaW5nKGRhdGEubGFzdEluZGV4T2YoXCIuXCIpKSA6IFwiXCI7XG4gICAgICAgIGlmIChleHQgPT09IFwiLmh0bWxcIiB8fCBleHQgPT09IFwiLmh0bVwiKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgY29uc3QgcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZShydWxlQ29udGV4dCk7XG4gICAgICAgIGNvbnN0IHBhc3NlZCA9IHBhaXIgJiYgcGFpci5uYW1lICYmIHBhaXIubmFtZS50cmltKCkubGVuZ3RoID4gMDtcbiAgICAgICAgLy9sZXQgcGFzc2VkID0gQVJJQU1hcHBlci5jb21wdXRlTmFtZShydWxlQ29udGV4dCkudHJpbSgpLmxlbmd0aCA+IDA7XG4gICAgICAgIGlmIChwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX25vX3RleHRfYWx0ZXJuYXRpdmVcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgQW5jZXN0b3JVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2FuY2VzdG9yXCI7XG5cbmV4cG9ydCBjb25zdCBwYWdlX3RpdGxlX2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJwYWdlX3RpdGxlX2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmh0bWxcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9Eb2NfSGFzVGl0bGVcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkZhaWxfMlwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJGYWlsXzNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcInBhZ2VfdGl0bGVfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwicGFnZV90aXRsZV9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJwYWdlX3RpdGxlX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcInBhZ2VfdGl0bGVfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwicGFnZV90aXRsZV9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSBwYWdlIHNob3VsZCBoYXZlIGEgdGl0bGUgdGhhdCBjb3JyZWN0bHkgaWRlbnRpZmllcyB0aGUgc3ViamVjdCBvZiB0aGUgcGFnZVwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJNaXNzaW5nIDxoZWFkPiBlbGVtZW50IHNvIHRoZXJlIGNhbiBiZSBubyA8dGl0bGU+IGVsZW1lbnQgcHJlc2VudFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJNaXNzaW5nIDx0aXRsZT4gZWxlbWVudCBpbiA8aGVhZD4gZWxlbWVudFwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJUaGUgPHRpdGxlPiBlbGVtZW50IGlzIGVtcHR5IChubyBpbm5lckhUTUwpXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjQuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbe1xuICAgICAgICBcIjI3NzlhNVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJmYWlsXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcImZhaWxcIlxuICAgICAgICB9XG4gICAgfV0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgLy8gVGhpcyBydWxlIGRvZXMgbm90IGFwcGx5IGluc2lkZSBhIHByZXNlbnRhdGlvbmFsIGZyYW1lXG4gICAgICAgIGlmIChBbmNlc3RvclV0aWwuaXNGcmFtZShjb250ZXh0SGllcmFyY2hpZXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBOb2RlO1xuICAgICAgICAvLyBGaXJzdCwgZmluZCB0aGUgaGVhZCBlbGVtZW50XG4gICAgICAgIGxldCBmaW5kSGVhZCA9IHJ1bGVDb250ZXh0LmZpcnN0Q2hpbGQgYXMgTm9kZTtcbiAgICAgICAgbGV0IGZpbmRUaXRsZSA9IG51bGw7XG4gICAgICAgIHdoaWxlIChmaW5kSGVhZCAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoZmluZEhlYWQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSBcImhlYWRcIilcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGZpbmRIZWFkID0gZmluZEhlYWQubmV4dFNpYmxpbmc7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHBvc3NpYmxlVGl0bGVzID0gKHJ1bGVDb250ZXh0IGFzIEVsZW1lbnQpLnF1ZXJ5U2VsZWN0b3JBbGwoXCJ0aXRsZVwiKTtcbiAgICAgICAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgcG9zc2libGVUaXRsZXMubGVuZ3RoOyArK2lkeCkge1xuICAgICAgICAgICAgaWYgKCFDb21tb25VdGlsLmdldEFuY2VzdG9yKHBvc3NpYmxlVGl0bGVzW2lkeF0sIFtcInN2Z1wiXSkpIHtcbiAgICAgICAgICAgICAgICBmaW5kVGl0bGUgPSBwb3NzaWJsZVRpdGxlc1tpZHhdO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChmaW5kSGVhZCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKCFmaW5kVGl0bGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmluZFRpdGxlID09PSBudWxsKSB7IC8vIGRvbid0IGhhdmUgdGl0bGUgc2Vjb25kIFBvRlxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8yXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgd2UgZ2V0IGhlcmUgd2UgaGF2ZSA8aGVhZD4gYW5kIDx0aXRsZT5cblxuICAgICAgICBpZiAoZmluZFRpdGxlICE9IG51bGwgJiYgQ29tbW9uVXRpbC5nZXRJbm5lclRleHQoZmluZFRpdGxlKS50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9IGVsc2UgeyAvLyA8dGl0bGU+IGhhcyBubyBpbm5lckhUTUwgdGhpcmQgUG9GXG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzNcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBwYWdlX3RpdGxlX3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcInBhZ2VfdGl0bGVfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbTpoZWFkIGRvbTp0aXRsZVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX1RpdGxlX1ZhbGlkXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICAvLyBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMlwiOiBcIlBvdGVudGlhbF8yXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYWdlX3RpdGxlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIC8vIFwiRmFpbF8xXCI6IFwicGFnZV90aXRsZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8yXCI6IFwicGFnZV90aXRsZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwicGFnZV90aXRsZV92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICAvLyBcIkZhaWxfMVwiOiBcIlBhZ2UgPHRpdGxlPiBpcyBlbXB0eVwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMlwiOiBcIlZlcmlmeSB0aGF0IHVzaW5nIHRoZSBmaWxlbmFtZSBhcyB0aGUgcGFnZSA8dGl0bGU+IHZhbHVlIGlzIGRlc2NyaXB0aXZlXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiUGFnZSA8dGl0bGU+IHNob3VsZCBiZSBhIGRlc2NyaXB0aXZlIHRpdGxlLCByYXRoZXIgdGhhbiBhIGZpbGVuYW1lXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjQuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuXG4gICAgICAgIGxldCB0aXRsZVN0ciA9IENvbW1vblV0aWwuZ2V0SW5uZXJUZXh0KHJ1bGVDb250ZXh0KS50cmltKCk7XG5cbiAgICAgICAgLy8gYWxsb3cgLmNvbSwgLm5ldCBhbmQgLm9yZ1xuICAgICAgICBsZXQgdGl0bGVTdHJMb3dlcmNhc2UgPSB0aXRsZVN0ci50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAodGl0bGVTdHJMb3dlcmNhc2UuaW5jbHVkZXMoXCIuY29tXCIpIHx8IHRpdGxlU3RyTG93ZXJjYXNlLmluY2x1ZGVzKFwiLm5ldFwiKSB8fCB0aXRsZVN0ckxvd2VyY2FzZS5pbmNsdWRlcyhcIi5vcmdcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiLCBbdGl0bGVTdHJdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aXRsZVN0ci5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIC8vIFRoaXMgaXMgY292ZXJlZCBieSBwYWdlX3RpdGxlX2V4aXN0c1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7Ly9SdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBwYXNzZWQgPSAhL15cXFMqXFwuW2EtekEtWl17MSw0fSg/IS4pfF5odHRwcz86XFwvXFwvXFxTKi9pLnRlc3QodGl0bGVTdHIpO1xuXG4gICAgICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzJcIik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiLCBbdGl0bGVTdHJdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG5leHBvcnQgY29uc3Qgc2NyaXB0X2ZvY3VzX2JsdXJfcmV2aWV3OiBSdWxlID0ge1xuICAgIGlkOiBcInNjcmlwdF9mb2N1c19ibHVyX3Jldmlld1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbb25mb2N1c11cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9TY3JpcHRfRm9jdXNCbHVyc1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJzY3JpcHRfZm9jdXNfYmx1cl9yZXZpZXcuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcInNjcmlwdF9mb2N1c19ibHVyX3Jldmlldy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwic2NyaXB0X2ZvY3VzX2JsdXJfcmV2aWV3Lmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgc2NyaXB0IGRvZXMgbm90IHJlbW92ZSBmb2N1cyBmcm9tIGNvbnRlbnQgdGhhdCBub3JtYWxseSByZWNlaXZlcyBmb2N1c1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlNjcmlwdGluZyBtdXN0IG5vdCByZW1vdmUgZm9jdXMgZnJvbSBjb250ZW50IHRoYXQgbm9ybWFsbHkgcmVjZWl2ZXMgZm9jdXNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuMS4xXCIsIFwiMi40LjdcIiwgXCIzLjIuMVwiXSwgLy9tYXRjaCByZXF1aXJlbWVudHMgbGlzdGVkIGluIGhlbHBcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcGFzc2VkID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwib25mb2N1c1wiKS5pbmRleE9mKFwiLmJsdXIoXCIpID09IC0xO1xuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgY29uc3Qgc2NyaXB0X29uY2xpY2tfYXZvaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwic2NyaXB0X29uY2xpY2tfYXZvaWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqW29uY2xpY2tdXCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJzY3JpcHRfb25jbGlja19taXN1c2VcIl0sXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfU2NyaXB0X09uY2xpY2tIVE1MMlwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJzY3JpcHRfb25jbGlja19hdm9pZC5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwic2NyaXB0X29uY2xpY2tfYXZvaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInNjcmlwdF9vbmNsaWNrX2F2b2lkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgdGhhdCAnb25jbGljaycgZXZlbnRzIGFyZSBub3QgdXNlZCBpbiBzY3JpcHQgdG8gZW11bGF0ZSBhIGxpbmtcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJTY3JpcHRzIHNob3VsZCBub3QgYmUgdXNlZCB0byBlbXVsYXRlIGxpbmtzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjEuMVwiXSwgLy9oZWxwIGFuZCBtYXRjaCBtYXBwaW5nIHRvIDIuMS4xIG9ubHkgXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfRk9VUlxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy8gRG9uJ3QgdHJpZ2dlciB0aGlzIGZvciBTVkcgZWxlbWVudCBmb3Igbm93IHVudGlsIGEgZGV0ZXJtaW5hdGlvbiBpcyBtYWRlIChieSBSaWNoKVxuICAgICAgICAvLyB0byBzdXBwb3J0IFNWRyBhdCBhIHBvaW50IHdoZW4gdGhlIFNWRyBhMTF5IHNwZWMgaXMgcmVhZHkuXG4gICAgICAgIGlmIChDb21tb25VdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBcInN2Z1wiKSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIHRoZXJlJ3MgYW4gYXJpYS1yb2xlIHNwZWNpZmllZCwgZG9uJ3QgdHJpZ2dlciB0aGlzLlxuICAgICAgICBpZiAoQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJyb2xlXCIpKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuXG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGxldCBwYXNzZWQgPSBub2RlTmFtZSA9PSBcImFcIiB8fCBub2RlTmFtZSA9PSBcImFyZWFcIiB8fCBub2RlTmFtZSA9PSBcImlucHV0XCI7XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBzY3JpcHRfb25jbGlja19taXN1c2U6IFJ1bGUgPSB7XG4gICAgaWQ6IFwic2NyaXB0X29uY2xpY2tfbWlzdXNlXCIsXG4gICAgY29udGV4dDogXCJkb206KltvbmNsaWNrXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX1NjcmlwdF9PbmNsaWNrSFRNTDFcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwic2NyaXB0X29uY2xpY2tfbWlzdXNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJzY3JpcHRfb25jbGlja19taXN1c2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInNjcmlwdF9vbmNsaWNrX21pc3VzZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG9zc2libGUgdXNlIG9mIGEgc2NyaXB0IHRvIGVtdWxhdGUgYSBsaW5rXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiU2NyaXB0cyBzaG91bGQgbm90IGJlIHVzZWQgdG8gZW11bGF0ZSBsaW5rc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi4xLjFcIl0sIC8vaGVscCBhbmQgbWF0Y2ggbWFwcGluZyB0byAyLjEuMSBvbmx5IFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRlUGFyYW1zID0ge1xuICAgICAgICAgICAgZmFpbFN1YnN0cmluZzoge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBbXCIuYXNwXCIsIFwiLmFzcHhcIiwgXCIuY2ZtXCIsIFwiLmNmbWxcIiwgXCIuY2dpXCIsIFwiLmh0bVwiLCBcIi5odG1sXCIsIFwiLnNodG1cIixcbiAgICAgICAgICAgICAgICAgICAgXCIuc2h0bWxcIiwgXCIucGhwXCIsIFwiLnBsXCIsIFwiLnB5XCIsIFwiLnNodG1cIiwgXCIuc2h0bWxcIiwgXCIueGh0bWxcIixcbiAgICAgICAgICAgICAgICAgICAgXCJsb2NhdGlvbi5ocmVmXCJdLFxuICAgICAgICAgICAgICAgIHR5cGU6IFwiW3N0cmluZ11cIlxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBJZiB0aGVyZSdzIGFuIGFyaWEtcm9sZSBzcGVjaWZpZWQsIGRvbid0IHRyaWdnZXIgdGhpcy5cbiAgICAgICAgbGV0IHBhc3NlZCA9IENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwicm9sZVwiKTtcbiAgICAgICAgLy8gSWYgdGhpcyBpcyBhbiBhIG9yIGFyZWEsIGRvbid0IHRyaWdnZXIgaWYgdGhlcmUncyBhbiBocmVmLlxuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBwYXNzZWQgPSBwYXNzZWQgfHwgKChub2RlTmFtZSA9PSBcImFcIiB8fCBub2RlTmFtZSA9PSBcImFyZWFcIikgJiYgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJocmVmXCIpKTtcblxuICAgICAgICAvLyBJZiB0aGUgZ3VhcmRzIGZhaWxlZCwgY2hlY2sgdG8gc2VlIGlmIHRoZXkncmUgbG9va2luZyBhdCBsaW5rc1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgbGV0IGZhaWxTdWJzdHJpbmcgPSB2YWxpZGF0ZVBhcmFtcy5mYWlsU3Vic3RyaW5nLnZhbHVlOztcbiAgICAgICAgICAgIGxldCBvbmNsaWNrID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwib25jbGlja1wiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBwYXNzZWQgJiYgaSA8IGZhaWxTdWJzdHJpbmcubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSBvbmNsaWNrLmluZGV4T2YoZmFpbFN1YnN0cmluZ1tpXSkgPT0gLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5cbmV4cG9ydCBjb25zdCBzY3JpcHRfc2VsZWN0X3JldmlldzogUnVsZSA9IHtcbiAgICBpZDogXCJzY3JpcHRfc2VsZWN0X3Jldmlld1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOnNlbGVjdFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX1NlbGVjdF9Ob0NoYW5nZUFjdGlvblwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJzY3JpcHRfc2VsZWN0X3Jldmlldy5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwic2NyaXB0X3NlbGVjdF9yZXZpZXcuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInNjcmlwdF9zZWxlY3RfcmV2aWV3Lmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgdGhhdCBubyBjaGFuZ2Ugb2YgY29udGV4dCBvciBhY3Rpb24gb2NjdXJzIHdoZW4gc2VsZWN0aW9uIG9wdGlvbnMgaW4gdGhpcyBjb21wb25lbnQgcmVjZWl2ZSBmb2N1c1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIk5vIGNoYW5nZXMgb2YgY29udGV4dCBzaG91bGQgb2NjdXIgd2hlbiBhIHNlbGVjdGlvbiB2YWx1ZSByZWNlaXZlcyBmb2N1c1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMy4yLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcGFzc2VkID0gIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9uY2hhbmdlXCIpICYmICFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmZvY3VzXCIpO1xuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgY29uc3Qgc2VsZWN0X29wdGlvbnNfZ3JvdXBlZDogUnVsZSA9IHtcbiAgICBpZDogXCJzZWxlY3Rfb3B0aW9uc19ncm91cGVkXCIsXG4gICAgY29udGV4dDogXCJkb206c2VsZWN0XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfU2VsZWN0X0hhc09wdEdyb3VwXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInNlbGVjdF9vcHRpb25zX2dyb3VwZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcInNlbGVjdF9vcHRpb25zX2dyb3VwZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInNlbGVjdF9vcHRpb25zX2dyb3VwZWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIkdyb3VwIG9mIHJlbGF0ZWQgb3B0aW9ucyBtYXkgbmVlZCA8b3B0Z3JvdXA+XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiR3JvdXBzIG9mIHJlbGF0ZWQgb3B0aW9ucyB3aXRoaW4gYSBzZWxlY3Rpb24gbGlzdCBzaG91bGQgYmUgZ3JvdXBlZCB3aXRoIDxvcHRncm91cD5cIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCB2YWxpZGF0ZVBhcmFtcyA9IHtcbiAgICAgICAgICAgIHBhcmFtTnVtT3B0aW9uczoge1xuICAgICAgICAgICAgICAgIHZhbHVlOiAxMCxcbiAgICAgICAgICAgICAgICB0eXBlOiBcImludGVnZXJcIlxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vIEhhbmRsZSB0aGUgY2FzZXMgd2hlcmUgb3B0Z3JvdXAgaXMgaGlkZGVuLCB3aGljaCBzaG91bGQgdHJpZ2dlciBhIHZpb2xhdGlvbnNcbiAgICAgICAgLy8gYnV0IGluIHRoZSBjYXNlIHRoYXQgQ2hlY2sgaGlkZGVuIG9wdGlvbiBpcyBzZXQgdGhlbiBzaG91bGQgbm90IHRyaWdnZXIgYSB2aW9sYXRpb24uXG4gICAgICAgIGxldCBwYXNzZWQgPSBDb21tb25VdGlsLmdldENoaWxkQnlUYWdIaWRkZW4ocnVsZUNvbnRleHQsIFwib3B0Z3JvdXBcIiwgZmFsc2UsIHRydWUpLmxlbmd0aCA+IDAgfHxcbiAgICAgICAgICAgIENvbW1vblV0aWwuZ2V0Q2hpbGRCeVRhZ0hpZGRlbihydWxlQ29udGV4dCwgXCJvcHRpb25cIiwgZmFsc2UsIHRydWUpLmxlbmd0aCA8PVxuICAgICAgICAgICAgdmFsaWRhdGVQYXJhbXMucGFyYW1OdW1PcHRpb25zLnZhbHVlO1xuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3Qgc2tpcF9tYWluX2Rlc2NyaWJlZDogUnVsZSA9IHtcbiAgICBpZDogXCJza2lwX21haW5fZGVzY3JpYmVkXCIsXG4gICAgY29udGV4dDogXCJkb206Ym9keVwiLFxuICAgIGRlcGVuZGVuY2llczogW1wic2tpcF9tYWluX2V4aXN0c1wiXSxcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9Cb2R5X0ZpcnN0QUNvbnRhaW5zU2tpcFRleHRfTmF0aXZlX0hvc3RfU2VtYXRpY3NcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInNraXBfbWFpbl9kZXNjcmliZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcInNraXBfbWFpbl9kZXNjcmliZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInNraXBfbWFpbl9kZXNjcmliZWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0aGF0IGlmIHRoaXMgaHlwZXJsaW5rIHNraXBzIGNvbnRlbnQsIHRoZSBkZXNjcmlwdGlvbiBjb21tdW5pY2F0ZXMgd2hlcmUgaXQgbGlua3MgdG9cIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgZGVzY3JpcHRpb24gb2YgYSBoeXBlcmxpbmsgdXNlZCB0byBza2lwIGNvbnRlbnQgbXVzdCBjb21tdW5pY2F0ZSB3aGVyZSBpdCBsaW5rcyB0b1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi40LjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCB2YWxpZGF0ZVBhcmFtcyA9IHtcbiAgICAgICAgICAgIHBhcmFtU2tpcFRleHQ6IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogW1wic2tpcFwiLCBcImp1bXBcIl0sXG4gICAgICAgICAgICAgICAgdHlwZTogXCJbc3RyaW5nXVwiXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy8gR2V0IHRoZSBhbmNob3JzIG9uIHRoZSBwYWdlXG4gICAgICAgIGxldCBkb2MgPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50O1xuXG4gICAgICAgIC8vIENoZWNrIGZvciBsYW5kbWFya3MgZmlyc3RcbiAgICAgICAgbGV0IHBhc3NlZDtcbiAgICAgICAgaWYgKENhY2hlVXRpbC5nZXRDYWNoZShydWxlQ29udGV4dCwgXCJJQk1faGFzTGFuZG1hcmtzX0ltcGxpY2l0XCIsIG51bGwpID09PSBudWxsKSB7XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUocnVsZUNvbnRleHQsIFwiSUJNX2hhc0xhbmRtYXJrc19JbXBsaWNpdFwiLCBDb21tb25VdGlsLmdldEVsZW1lbnRzQnlSb2xlSGlkZGVuKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsIFtcImFwcGxpY2F0aW9uXCIsIFwiYmFubmVyXCIsIFwiY29tcGxlbWVudGFyeVwiLCBcImNvbnRlbnRpbmZvXCIsXG4gICAgICAgICAgICAgICAgXCJmb3JtXCIsIFwibWFpblwiLCBcIm5hdmlnYXRpb25cIiwgXCJzZWFyY2hcIlxuICAgICAgICAgICAgXSwgdHJ1ZSwgdHJ1ZSkubGVuZ3RoID4gMCk7XG4gICAgICAgIH1cbiAgICAgICAgcGFzc2VkID0gQ2FjaGVVdGlsLmdldENhY2hlKHJ1bGVDb250ZXh0LCBcIklCTV9oYXNMYW5kbWFya3NfSW1wbGljaXRcIiwgZmFsc2UpO1xuXG4gICAgICAgIGlmICghcGFzc2VkKSB7IC8vIE5vIGxhbmRtYXJrcywgY2hlY2sgZm9yIHNraXAgbGlua3NcbiAgICAgICAgICAgIGxldCBsaW5rcyA9IGRvYy5saW5rcztcbiAgICAgICAgICAgIC8vIFNraXAgbGluayBzaG91bGQgYmUgdGhlIGZpcnN0IG9uZSBvbiB0aGUgcGFnZSB3aXRoIGFuIGhyZWYgYXR0cmlidXRlIChpLmUuLCBsaW5rc1swXSlcbiAgICAgICAgICAgIC8vIGFsc28gaWYgdGhlIGZpcnN0IGxpbmsgaXMgaGlkZGVuIHRoZW4gd2Ugc2hvdWxkIGFsc28gdHJpZ2dlciBhIHZpb2xhdGlvbi5cbiAgICAgICAgICAgIGlmIChsaW5rcyAmJiBsaW5rcy5sZW5ndGggPiAwICYmIFZpc1V0aWwuaXNOb2RlVmlzaWJsZShsaW5rc1swXSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgdGVzdFRleHQgPSBDb21tb25VdGlsLmdldElubmVyVGV4dChkb2MubGlua3NbMF0pLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7ICFwYXNzZWQgJiYgaSA8IHZhbGlkYXRlUGFyYW1zLnBhcmFtU2tpcFRleHQudmFsdWUubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gdGVzdFRleHQuaW5kZXhPZih2YWxpZGF0ZVBhcmFtcy5wYXJhbVNraXBUZXh0LnZhbHVlW2ldKSAhPSAtMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgcGFzc2VkID0gZmFsc2U7XG5cbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IEFuY2VzdG9yVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9hbmNlc3RvclwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3Qgc2tpcF9tYWluX2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJza2lwX21haW5fZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJkb206Ym9keVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0JvZHlfRmlyc3RBU2tpcHNfTmF0aXZlX0hvc3RfU2VtYXRpY3NcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJza2lwX21haW5fZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwic2tpcF9tYWluX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwic2tpcF9tYWluX2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlRoZSBwYWdlIGRvZXMgbm90IHByb3ZpZGUgYSB3YXkgdG8gcXVpY2tseSBuYXZpZ2F0ZSB0byB0aGUgbWFpbiBjb250ZW50IChBUklBIFxcXCJtYWluXFxcIiBsYW5kbWFyayBvciBhIHNraXAgbGluaylcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJQYWdlcyBtdXN0IHByb3ZpZGUgYSB3YXkgdG8gc2tpcCBkaXJlY3RseSB0byB0aGUgbWFpbiBjb250ZW50XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjQuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIC8vIFRoaXMgcnVsZSBkb2VzIG5vdCBhcHBseSBpbnNpZGUgYSBwcmVzZW50YXRpb25hbCBmcmFtZVxuICAgICAgICBpZiAoQW5jZXN0b3JVdGlsLmlzUHJlc2VudGF0aW9uRnJhbWUoY29udGV4dEhpZXJhcmNoaWVzKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy8gR2V0IHRoZSBhbmNob3JzIG9uIHRoZSBwYWdlXG4gICAgICAgIGxldCBkb2MgPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50O1xuXG4gICAgICAgIC8vIENoZWNrIGZvciBsYW5kbWFya3MgZmlyc3RcbiAgICAgICAgbGV0IHBhc3NlZDtcbiAgICAgICAgaWYgKENhY2hlVXRpbC5nZXRDYWNoZShydWxlQ29udGV4dCwgXCJJQk1faGFzTGFuZG1hcmtzX0ltcGxpY2l0XCIsIG51bGwpID09PSBudWxsKSB7XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUocnVsZUNvbnRleHQsIFwiSUJNX2hhc0xhbmRtYXJrc19JbXBsaWNpdFwiLCBDb21tb25VdGlsLmdldEVsZW1lbnRzQnlSb2xlSGlkZGVuKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsIFtcImFwcGxpY2F0aW9uXCIsIFwiYmFubmVyXCIsIFwiY29tcGxlbWVudGFyeVwiLCBcImNvbnRlbnRpbmZvXCIsXG4gICAgICAgICAgICAgICAgXCJmb3JtXCIsIFwibWFpblwiLCBcIm5hdmlnYXRpb25cIiwgXCJzZWFyY2hcIlxuICAgICAgICAgICAgXSwgdHJ1ZSwgdHJ1ZSkubGVuZ3RoID4gMCk7XG4gICAgICAgIH1cbiAgICAgICAgcGFzc2VkID0gQ2FjaGVVdGlsLmdldENhY2hlKHJ1bGVDb250ZXh0LCBcIklCTV9oYXNMYW5kbWFya3NfSW1wbGljaXRcIiwgZmFsc2UpO1xuXG4gICAgICAgIGlmICghcGFzc2VkKSB7IC8vIE5vIGxhbmRtYXJrcywgY2hlY2sgZm9yIHNraXAgbGlua3NcbiAgICAgICAgICAgIGxldCBhbmNob3JzID0gQ29tbW9uVXRpbC5nZXREb2NFbGVtZW50c0J5VGFnKHJ1bGVDb250ZXh0LCBcImFcIik7XG5cbiAgICAgICAgICAgIC8vIFNraXAgYW5jaG9yIHNob3VsZCBiZSB0aGUgZmlyc3Qgb25lIG9uIHRoZSBwYWdlIHdpdGggYW4gaHJlZiBhdHRyaWJ1dGVcbiAgICAgICAgICAgIGxldCB0ZXN0QW5jaG9yID0gbnVsbDtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYW5jaG9ycy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIGlmIChhbmNob3JzW2ldLmhhc0F0dHJpYnV0ZShcImhyZWZcIikgJiYgVmlzVXRpbC5pc05vZGVWaXNpYmxlKGFuY2hvcnNbaV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHRlc3RBbmNob3IgPSBhbmNob3JzW2ldO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFB1bGwgb3V0IHRoZSB0YXJnZXQgaWRcbiAgICAgICAgICAgIGxldCB0YXJnZXRJZCA9IG51bGw7XG4gICAgICAgICAgICBpZiAodGVzdEFuY2hvciAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgbGV0IGhyZWZTdHIgPSB0ZXN0QW5jaG9yLmdldEF0dHJpYnV0ZShcImhyZWZcIik7XG4gICAgICAgICAgICAgICAgbGV0IGlkeCA9IGhyZWZTdHIuaW5kZXhPZihcIiNcIik7XG4gICAgICAgICAgICAgICAgaWYgKGlkeCAhPSAtMSkge1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXRJZCA9IGhyZWZTdHIuc3Vic3RyaW5nKGlkeCArIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIERldGVybWluZSBpZiB0aGVyZSBpcyBhbiBlbGVtZW50IGlkIG9yIG5hbWVkIGFuY2hvciBvbiB0aGUgcGFnZSB3aXRoIHRoaXNcbiAgICAgICAgICAgIC8vIHRhcmdldCBpZC5cblxuICAgICAgICAgICAgaWYgKHRhcmdldElkICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSBkb2MuZ2V0RWxlbWVudEJ5SWQodGFyZ2V0SWQpICE9IG51bGw7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7ICFwYXNzZWQgJiYgaSA8IGFuY2hvcnMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFhbmNob3JzW2ldLmhhc0F0dHJpYnV0ZShcImhyZWZcIikgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGFuY2hvcnNbaV0uaGFzQXR0cmlidXRlKFwibmFtZVwiKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yc1tpXS5nZXRBdHRyaWJ1dGUoXCJuYW1lXCIpID09IHRhcmdldElkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KHBhc3NlZCwgW3J1bGVDb250ZXh0XSwgJycsICcnLCBbXSk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBzdHlsZV9iYWNrZ3JvdW5kX2RlY29yYXRpdmU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwic3R5bGVfYmFja2dyb3VuZF9kZWNvcmF0aXZlXCIsXG4gICAgY29udGV4dDogXCJkb206c3R5bGUsIGRvbToqW3N0eWxlXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX1N0eWxlX0JhY2tncm91bmRJbWFnZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJzdHlsZV9iYWNrZ3JvdW5kX2RlY29yYXRpdmUuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcInN0eWxlX2JhY2tncm91bmRfZGVjb3JhdGl2ZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwic3R5bGVfYmFja2dyb3VuZF9kZWNvcmF0aXZlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgdGhlIENTUyBiYWNrZ3JvdW5kIGltYWdlIGRvZXMgbm90IGNvbnZleSBpbXBvcnRhbnQgaW5mb3JtYXRpb25cIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJJbWFnZXMgaW5jbHVkZWQgYnkgdXNpbmcgQ1NTIGFsb25lIG11c3Qgbm90IGNvbnZleSBpbXBvcnRhbnQgaW5mb3JtYXRpb25cIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwibGlua1wiICYmIHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInJlbFwiKSAmJlxuICAgICAgICAgICAgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwicmVsXCIpLnRvTG93ZXJDYXNlKCkgPT09IFwic3R5bGVzaGVldFwiKSB7XG4gICAgICAgICAgICAvLyBFeHRlcm5hbCBzdHlsZXNoZWV0IC0gdHJpZ2dlclxuICAgICAgICAgICAgcGFzc2VkID0gQ29tbW9uVXRpbC50cmlnZ2VyT25jZShydWxlQ29udGV4dCwgXCJzdHlsZV9iYWNrZ3JvdW5kX2RlY29yYXRpdmVcIiwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWQgJiYgbm9kZU5hbWUgPT09IFwic3R5bGVcIiB8fCBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJzdHlsZVwiKSkge1xuICAgICAgICAgICAgbGV0IHN0eWxlVGV4dDtcbiAgICAgICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJzdHlsZVwiKVxuICAgICAgICAgICAgICAgIHN0eWxlVGV4dCA9IENvbW1vblV0aWwuZ2V0SW5uZXJUZXh0KHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBzdHlsZVRleHQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJzdHlsZVwiKTtcbiAgICAgICAgICAgIGxldCBiZ01hdGNoZXMgPSBzdHlsZVRleHQubWF0Y2goL2JhY2tncm91bmQ6W147XSovZyk7XG4gICAgICAgICAgICBpZiAoYmdNYXRjaGVzICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IHBhc3NlZCAmJiBpIDwgYmdNYXRjaGVzLmxlbmd0aDsgKytpKVxuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBiZ01hdGNoZXNbaV0uaW5kZXhPZihcInVybChcIikgPT09IC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ1NTVXRpbCB9IGZyb20gXCIuLi91dGlsL0NTU1V0aWxcIjtcblxuLyoqXG4gKiBEZXNjcmlwdGlvbjogVHJpZ2dlciBpZiA6YmVmb3JlIGFuZCA6YWZ0ZXIgYXJlIHVzZWQgaW4gQ1NTIChJbnRlcm5hbCBhbmQgRXh0ZXJuYWwpIHdpdGggY29udGVudFxuICogT3JpZ2luOiBXQ0FHIDIuMCBGODdcbiAqL1xuZXhwb3J0IGNvbnN0IHN0eWxlX2JlZm9yZV9hZnRlcl9yZXZpZXc6IFJ1bGUgPSB7XG4gICAgaWQ6IFwic3R5bGVfYmVmb3JlX2FmdGVyX3Jldmlld1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOnN0eWxlLCBkb206bGlua1wiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX1N0eWxlX0JlZm9yZUFmdGVyXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBgc3R5bGVfYmVmb3JlX2FmdGVyX3Jldmlldy5odG1sYCxcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IGBzdHlsZV9iZWZvcmVfYWZ0ZXJfcmV2aWV3Lmh0bWxgLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBgc3R5bGVfYmVmb3JlX2FmdGVyX3Jldmlldy5odG1sYFxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJEbyBub3QgdXNlIENTUyAnOjpiZWZvcmUnIGFuZCAnOjphZnRlcicgcHNldWRvLWVsZW1lbnRzIHRvIGluc2VydCBub24tZGVjb3JhdGl2ZSBjb250ZW50XCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVmVyaWZ5IHRoZSAnOjpiZWZvcmUnIGFuZCAnOjphZnRlcicgcHNldWRvLWVsZW1lbnRzIGRvIG5vdCBpbnNlcnQgbm9uLWRlY29yYXRpdmUgY29udGVudFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICAvLyBUdXJuIG9mZiB0aGUgcnVsZSBkdWUgdG8gdGhlIG9ic29sZXRlIHJlcXVpcmVtZW50XG4gICAgICAgIC8vaWQ6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgaWQ6IFtdLFxuICAgICAgICBudW06IFwiMS4zLjFcIiwgLy8gbnVtOiBbIFwiMi40LjRcIiwgXCJ4LnkuelwiIF0gYWxzbyBhbGxvd2VkXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIC8vY2hlY2sgSW50ZXJuYWwgc3R5bGVzICAgICAgICBcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwic3R5bGVcIikge1xuICAgICAgICAgICAgbGV0IGNzcyA9IENTU1V0aWwuZ2V0Q1NTU3R5bGUocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IHBhc3NlZCAmJiBpIDwgY3NzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgLy8gR3VhcmQgYWdhaW5zdCBiYWQgQ1NTXG4gICAgICAgICAgICAgICAgaWYgKGNzc1tpXS5zZWxlY3Rvcikge1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSAoY3NzW2ldLnNlbGVjdG9yLmluZGV4T2YoXCI6YmVmb3JlXCIpID09PSAtMSAmJiBjc3NbaV0uc2VsZWN0b3IuaW5kZXhPZihcIjphZnRlclwiKSA9PT0gLTEpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAhKFwiY29udGVudFwiIGluIGNzc1tpXS52YWx1ZXMpIHx8IGNzc1tpXS52YWx1ZXNbXCJjb250ZW50XCJdLnRyaW0oKS5sZW5ndGggPT09IDAgfHwgY3NzW2ldLnZhbHVlc1tcImNvbnRlbnRcIl0udHJpbSgpID09PSBcIlxcXCJcXFwiXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8IGNzc1tpXS52YWx1ZXNbXCJjb250ZW50XCJdLnRyaW0oKSA9PT0gXCJcXCdcXCdcIiB8fCBjc3NbaV0udmFsdWVzW1wiY29udGVudFwiXS50cmltKCkgPT09IFwibm9uZVwiIHx8IGNzc1tpXS52YWx1ZXNbXCJjb250ZW50XCJdLnRyaW0oKSA9PT0gXCJhdHRyKHgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8IGNzc1tpXS52YWx1ZXNbXCJjb250ZW50XCJdLnRyaW0oKSA9PT0gXCJhdHRyKHkpXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBjaGVjayBzcGVjaWFsIHJ1bGVzIGluIHRoZSBzdHlsZXNoZWV0c1xuICAgICAgICAgICAgaWYgKHBhc3NlZCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHNJbmRleCA9IDA7IHNJbmRleCA8IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHMubGVuZ3RoOyBzSW5kZXgrKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgc2hlZXQgPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LnN0eWxlU2hlZXRzW3NJbmRleF0gYXMgQ1NTU3R5bGVTaGVldDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNoZWV0Lm93bmVyTm9kZSA9PT0gcnVsZUNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0eWxlUnVsZXMgPSBzaGVldC5jc3NSdWxlcyA/IHNoZWV0LmNzc1J1bGVzIDogc2hlZXQucnVsZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlUnVsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgc3R5bGVSdWxlSW5kZXggPSAwOyBwYXNzZWQgJiYgc3R5bGVSdWxlSW5kZXggPCBzdHlsZVJ1bGVzLmxlbmd0aDsgc3R5bGVSdWxlSW5kZXgrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0eWxlUnVsZSA9IHN0eWxlUnVsZXNbc3R5bGVSdWxlSW5kZXhdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBAbWVkaWEgcnVsZXMgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGNoZWNrICdpZiAoc3R5bGVSdWxlIGluc3RhbmNlb2YgQ1NTTWVkaWFSdWxlKScgZG9lc24ndCB3b3JrIHdoZW4gcnVuIGluIEthcm1hKGJ1dCB3b3JrcyBpbiBEQVApIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc28gbGV0J3MgYWNjZXNzIHRoZSB0eXBlIGRpcmVjdGx5IGFzIGEgd29ya2Fyb3VuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0eWxlSW1wb3J0UnVsZTogQ1NTSW1wb3J0UnVsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZVJ1bGUudHlwZSAmJiBzdHlsZVJ1bGUudHlwZSA9PT0gNCAvKiBDU1NSdWxlLk1FRElBX1JVTEUgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3R5bGVNZWRpYVJ1bGUgPSBzdHlsZVJ1bGUgYXMgQ1NTTWVkaWFSdWxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtZWRpYVJ1bGVzID0gc3R5bGVNZWRpYVJ1bGUuY3NzUnVsZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lZGlhUnVsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgckluZGV4ID0gMDsgcGFzc2VkICYmIHJJbmRleCA8IG1lZGlhUnVsZXMubGVuZ3RoOyBySW5kZXgrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1SdWxlID0gbWVkaWFSdWxlc1tySW5kZXhdIGFzIGFueTsgLy8gc2VsZWN0b3JUZXh0IG5vdCByZWNvZ25pemVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVJ1bGUuc2VsZWN0b3JUZXh0ICE9PSBudWxsICYmIG1SdWxlLnNlbGVjdG9yVGV4dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGUgPSBtUnVsZS5zZWxlY3RvclRleHQudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZS5pbmRleE9mKFwiOmJlZm9yZVwiKSAhPT0gLTEgfHwgcnVsZS5pbmRleE9mKFwiOmFmdGVyXCIpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29udGVudCA9IG1SdWxlLnN0eWxlWydjb250ZW50J107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50ICYmIGNvbnRlbnQudHJpbSgpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQudHJpbSgpICE9PSBcIlxcXCJcXFwiXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LnRyaW0oKSAhPT0gXCJcXCdcXCdcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcIm5vbmVcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcImF0dHIoeClcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcImF0dHIoeSlcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBpbXBvcnQgcnVsZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0eWxlUnVsZS50eXBlICYmIHN0eWxlUnVsZS50eXBlID09PSAzIC8qIENTU1J1bGUuSU1QT1JUX1JVTEUgKi8gJiYgKHN0eWxlSW1wb3J0UnVsZSA9IHN0eWxlUnVsZSBhcyBDU1NJbXBvcnRSdWxlKS5zdHlsZVNoZWV0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGVzID0gc3R5bGVJbXBvcnRSdWxlLnN0eWxlU2hlZXQuY3NzUnVsZXMgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZUltcG9ydFJ1bGUuc3R5bGVTaGVldC5jc3NSdWxlcyA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlSW1wb3J0UnVsZS5zdHlsZVNoZWV0LnJ1bGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBySW5kZXggPSAwOyBwYXNzZWQgJiYgckluZGV4IDwgcnVsZXMubGVuZ3RoOyBySW5kZXgrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGltcG9ydGVkUnVsZSA9IHJ1bGVzW3JJbmRleF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBAbWVkaWEgcnVsZXMgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW1wb3J0ZWRSdWxlLnR5cGUgJiYgaW1wb3J0ZWRSdWxlLnR5cGUgPT09IDQgLyogQ1NTUnVsZS5NRURJQV9SVUxFICovKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1lZGlhUnVsZXMgPSAoaW1wb3J0ZWRSdWxlIGFzIENTU01lZGlhUnVsZSkuY3NzUnVsZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lZGlhUnVsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgbUluZGV4ID0gMDsgbUluZGV4IDwgbWVkaWFSdWxlcy5sZW5ndGg7IG1JbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbVJ1bGUgPSBtZWRpYVJ1bGVzW21JbmRleF0gYXMgYW55OyAvLyBzZWxlY3RvclRleHQgbm90IHJlY29nbml6ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtUnVsZS5zZWxlY3RvclRleHQgIT09IG51bGwgJiYgbVJ1bGUuc2VsZWN0b3JUZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcnVsZSA9IG1SdWxlLnNlbGVjdG9yVGV4dC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlLmluZGV4T2YoXCI6YmVmb3JlXCIpICE9PSAtMSB8fCBydWxlLmluZGV4T2YoXCI6YWZ0ZXJcIikgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb250ZW50ID0gbVJ1bGUuc3R5bGVbJ2NvbnRlbnQnXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQgJiYgY29udGVudC50cmltKCkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC50cmltKCkgIT09IFwiXFxcIlxcXCJcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcIlxcJ1xcJ1wiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC50cmltKCkgIT09IFwibm9uZVwiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC50cmltKCkgIT09IFwiYXR0cih4KVwiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC50cmltKCkgIT09IFwiYXR0cih5KVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgoaW1wb3J0ZWRSdWxlIGFzIGFueSkuc2VsZWN0b3JUZXh0ICE9PSBudWxsICYmIChpbXBvcnRlZFJ1bGUgYXMgYW55KS5zZWxlY3RvclRleHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBydWxlID0gKGltcG9ydGVkUnVsZSBhcyBhbnkpLnNlbGVjdG9yVGV4dC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vc3VwcG9ydCBib3RoIHNpbmdsZSBjb2xvbiAoOikgYW5kIGRvdWJsZSBjb2xvbiAoOjopIHBzZXVkbyAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlLmluZGV4T2YoXCI6YmVmb3JlXCIpICE9PSAtMSB8fCBydWxlLmluZGV4T2YoXCI6YWZ0ZXJcIikgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb250ZW50ID0gKGltcG9ydGVkUnVsZSBhcyBhbnkpLnN0eWxlWydjb250ZW50J107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50ICYmIGNvbnRlbnQudHJpbSgpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQudHJpbSgpICE9PSBcIlxcXCJcXFwiXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LnRyaW0oKSAhPT0gXCJcXCdcXCdcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcIm5vbmVcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcImF0dHIoeClcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcImF0dHIoeSlcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBjc3MgYWNjZXNzIGlzc3Vlc1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy9jaGVjayBleHRlcm5hbCBzdHlsZXMgXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImxpbmtcIiAmJiBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJyZWxcIikgJiZcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInJlbFwiKS50b0xvd2VyQ2FzZSgpID09PSBcInN0eWxlc2hlZXRcIiAmJlxuICAgICAgICAgICAgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiaHJlZlwiKSAmJiBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJocmVmXCIpLnRyaW0oKS5sZW5ndGggIT09IDApIHtcblxuICAgICAgICAgICAgZm9yIChsZXQgc0luZGV4ID0gMDsgc0luZGV4IDwgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5zdHlsZVNoZWV0cy5sZW5ndGg7IHNJbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNoZWV0ID0gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5zdHlsZVNoZWV0c1tzSW5kZXhdIGFzIENTU1N0eWxlU2hlZXQ7XG4gICAgICAgICAgICAgICAgaWYgKHNoZWV0ICYmIHNoZWV0Lm93bmVyTm9kZSA9PT0gcnVsZUNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBydWxlcyA9IHNoZWV0LmNzc1J1bGVzID8gc2hlZXQuY3NzUnVsZXMgOiBzaGVldC5ydWxlcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHJJbmRleCA9IDA7IHBhc3NlZCAmJiBySW5kZXggPCBydWxlcy5sZW5ndGg7IHJJbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBydWxlRnJvbUxpbmsgPSBydWxlc1tySW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBAbWVkaWEgcnVsZXMgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlRnJvbUxpbmsudHlwZSAmJiBydWxlRnJvbUxpbmsudHlwZSA9PT0gNCAvKiBDU1NSdWxlLk1FRElBX1JVTEUgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtZWRpYVJ1bGVzID0gKHJ1bGVGcm9tTGluayBhcyBDU1NNZWRpYVJ1bGUpLmNzc1J1bGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lZGlhUnVsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBtSW5kZXggPSAwOyBwYXNzZWQgJiYgbUluZGV4IDwgbWVkaWFSdWxlcy5sZW5ndGg7IG1JbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtUnVsZSA9IG1lZGlhUnVsZXNbbUluZGV4XSBhcyBhbnk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtUnVsZS5zZWxlY3RvclRleHQgIT09IG51bGwgJiYgbVJ1bGUuc2VsZWN0b3JUZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBydWxlU2VsVHh0ID0gbVJ1bGUuc2VsZWN0b3JUZXh0LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZVNlbFR4dC5pbmRleE9mKFwiOmJlZm9yZVwiKSAhPT0gLTEgfHwgcnVsZVNlbFR4dC5pbmRleE9mKFwiOmFmdGVyXCIpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb250ZW50ID0gbVJ1bGUuc3R5bGVbJ2NvbnRlbnQnXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudCAmJiBjb250ZW50LnRyaW0oKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQudHJpbSgpICE9PSBcIlxcXCJcXFwiXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcIlxcJ1xcJ1wiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LnRyaW0oKSAhPT0gXCJub25lXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcImF0dHIoeClcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC50cmltKCkgIT09IFwiYXR0cih5KVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgocnVsZXNbckluZGV4XSBhcyBhbnkpLnNlbGVjdG9yVGV4dCAhPT0gbnVsbCAmJiAocnVsZXNbckluZGV4XSBhcyBhbnkpLnNlbGVjdG9yVGV4dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcnVsZSA9IChydWxlc1tySW5kZXhdIGFzIGFueSkuc2VsZWN0b3JUZXh0LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3N1cHBvcnQgYm90aCBzaW5nbGUgY29sb24gKDopIGFuZCBkb3VibGUgY29sb24gKDo6KSBwc2V1ZG8gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlLmluZGV4T2YoXCI6YmVmb3JlXCIpICE9PSAtMSB8fCBydWxlLmluZGV4T2YoXCI6YWZ0ZXJcIikgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSAocnVsZXNbckluZGV4XSBhcyBhbnkpLnN0eWxlWydjb250ZW50J107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQgJiYgY29udGVudC50cmltKCkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LnRyaW0oKSAhPT0gXCJcXFwiXFxcIlwiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LnRyaW0oKSAhPT0gXCJcXCdcXCdcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC50cmltKCkgIT09IFwibm9uZVwiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LnRyaW0oKSAhPT0gXCJhdHRyKHgpXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcImF0dHIoeSlcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBjc3MgYWNjZXNzIGlzc3Vlc1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBzdHlsZV9jb2xvcl9taXN1c2U6IFJ1bGUgPSB7XG4gICAgaWQ6IFwic3R5bGVfY29sb3JfbWlzdXNlXCIsXG4gICAgY29udGV4dDogXCJkb206c3R5bGUsIGRvbToqW3N0eWxlXSwgZG9tOmZvbnRbY29sb3JdLCBkb206bGlua1wiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX1N0eWxlX0NvbG9yU2VtYW50aWNzMVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogYHN0eWxlX2NvbG9yX21pc3VzZS5odG1sYCxcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IGBzdHlsZV9jb2xvcl9taXN1c2UuaHRtbGAsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IGBzdHlsZV9jb2xvcl9taXN1c2UuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQ29tYmluZSBjb2xvciBhbmQgZGVzY3JpcHRpdmUgbWFya3VwIHRvIGNvbnZleSBpbmZvcm1hdGlvblwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSBjb2xvciBpcyBub3QgdXNlZCBhcyB0aGUgb25seSB2aXN1YWwgbWVhbnMgb2YgY29udmV5aW5nIGluZm9ybWF0aW9uXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIG51bTogXCIxLjQuMVwiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgbGV0IHN0eWxlVGV4dCA9IFwiXCI7XG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJzdHlsZVwiKSB7XG4gICAgICAgICAgICBzdHlsZVRleHQgPSBDb21tb25VdGlsLmdldElubmVyVGV4dChydWxlQ29udGV4dCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIC8vIGNoZWNrIGltcG9ydFxuICAgICAgICAgICAgZm9yIChsZXQgc0luZGV4ID0gMDsgc0luZGV4IDwgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5zdHlsZVNoZWV0cy5sZW5ndGg7IHNJbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNoZWV0ID0gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5zdHlsZVNoZWV0c1tzSW5kZXhdIGFzIENTU1N0eWxlU2hlZXQ7XG4gICAgICAgICAgICAgICAgaWYgKHNoZWV0ICYmIHNoZWV0Lm93bmVyTm9kZSA9PT0gcnVsZUNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHlsZVJ1bGVzID0gc2hlZXQuY3NzUnVsZXMgPyBzaGVldC5jc3NSdWxlcyA6IHNoZWV0LnJ1bGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgc3R5bGVSdWxlSW5kZXggPSAwOyBzdHlsZVJ1bGVJbmRleCA8IHN0eWxlUnVsZXMubGVuZ3RoOyBzdHlsZVJ1bGVJbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0eWxlUnVsZSA9IHN0eWxlUnVsZXNbc3R5bGVSdWxlSW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHlsZUltcG9ydFJ1bGU6IENTU0ltcG9ydFJ1bGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlUnVsZS50eXBlICYmIHN0eWxlUnVsZS50eXBlID09PSAzIC8qIENTU1J1bGUuSU1QT1JUX1JVTEUgKi8gJiYgKHN0eWxlSW1wb3J0UnVsZSA9IHN0eWxlUnVsZSBhcyBDU1NJbXBvcnRSdWxlKS5zdHlsZVNoZWV0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbXBvcnRSdWxlcyA9IHN0eWxlSW1wb3J0UnVsZS5zdHlsZVNoZWV0LmNzc1J1bGVzID8gc3R5bGVJbXBvcnRSdWxlLnN0eWxlU2hlZXQuY3NzUnVsZXMgOiBzdHlsZUltcG9ydFJ1bGUuc3R5bGVTaGVldC5ydWxlcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgckluZGV4ID0gMDsgckluZGV4IDwgaW1wb3J0UnVsZXMubGVuZ3RoOyBySW5kZXgrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlSdWxlID0gaW1wb3J0UnVsZXNbckluZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlVGV4dCArPSBpUnVsZS5jc3NUZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTaWxlbmNlIGNzcyBhY2Nlc3MgaXNzdWVzXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwic3R5bGVcIikpIHtcbiAgICAgICAgICAgIHN0eWxlVGV4dCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInN0eWxlXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobm9kZU5hbWUgPT09IFwibGlua1wiICYmIC8vY2hlY2sgZXh0ZXJuYWwgc3R5bGVzXG4gICAgICAgICAgICBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJyZWxcIikgJiZcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInJlbFwiKS50b0xvd2VyQ2FzZSgpID09PSBcInN0eWxlc2hlZXRcIiAmJlxuICAgICAgICAgICAgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiaHJlZlwiKSAmJlxuICAgICAgICAgICAgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKS50cmltKCkubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBzSW5kZXggPSAwOyBzSW5kZXggPCBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LnN0eWxlU2hlZXRzLmxlbmd0aDsgc0luZGV4KyspIHtcbiAgICAgICAgICAgICAgICBsZXQgc2hlZXQgPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LnN0eWxlU2hlZXRzW3NJbmRleF0gYXMgQ1NTU3R5bGVTaGVldDtcbiAgICAgICAgICAgICAgICBpZiAoc2hlZXQgJiYgc2hlZXQub3duZXJOb2RlID09PSBydWxlQ29udGV4dCkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGVzID0gc2hlZXQuY3NzUnVsZXMgPyBzaGVldC5jc3NSdWxlcyA6IHNoZWV0LnJ1bGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgckluZGV4ID0gMDsgckluZGV4IDwgcnVsZXMubGVuZ3RoOyBySW5kZXgrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlVGV4dCArPSBydWxlc1tySW5kZXhdLmNzc1RleHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNpbGVuY2UgY3NzIGFjY2VzcyBpc3N1ZXNcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcblxuICAgICAgICAvLyBEZWZlY3QgMTAyMjogRmluZCB1c2VzIG9mICdjb2xvcicgYW5kICcqYmFja2dyb3VuZConIG9ubHlcbiAgICAgICAgbGV0IGlzQmdVc2VkID0gc3R5bGVUZXh0Lm1hdGNoKC9cXGJiYWNrZ3JvdW5kXFxiL2kpO1xuXG4gICAgICAgIGxldCB0aGVDb2xvclN0eWxlVG9DaGVjayA9IHN0eWxlVGV4dC5yZXBsYWNlKC8tY29sb3IvZywgXCJcIik7XG4gICAgICAgIGxldCBpc0NvbG9yVXNlZCA9IHRoZUNvbG9yU3R5bGVUb0NoZWNrLm1hdGNoKC9cXGJjb2xvclxcYi9pKTtcblxuICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiY29sb3JcIikgfHwgaXNDb2xvclVzZWQgfHwgaXNCZ1VzZWQpIHtcbiAgICAgICAgICAgIGxldCBnb29kVGFnTmFtZXMgPSB7XG4gICAgICAgICAgICAgICAgXCJlbVwiOiBcIlwiLCBcInN0cm9uZ1wiOiBcIlwiLCBcImNpdGVcIjogXCJcIiwgXCJkZm5cIjogXCJcIixcbiAgICAgICAgICAgICAgICBcImNvZGVcIjogXCJcIiwgXCJzYW1wXCI6IFwiXCIsIFwia2JkXCI6IFwiXCIsIFwidmFyXCI6IFwiXCIsIFwiYWJiclwiOiBcIlwiLCBcImFjcm9ueW1cIjogXCJcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQ29sb3IgdXNlZCDvv70gYXJlIHRoZXJlIHNlbWFudGljcyBpbnZvbHZlZD9cbiAgICAgICAgICAgIHBhc3NlZCA9IG5vZGVOYW1lIGluIGdvb2RUYWdOYW1lcyB8fFxuICAgICAgICAgICAgICAgIENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIGdvb2RUYWdOYW1lcykgIT09IG51bGw7XG4gICAgICAgICAgICBpZiAoIXBhc3NlZCAmJiBydWxlQ29udGV4dC5oYXNDaGlsZE5vZGVzKCkpIHtcbiAgICAgICAgICAgICAgICBsZXQgbncgPSBuZXcgRE9NV2Fsa2VyKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgICAgICB3aGlsZSAoIXBhc3NlZCAmJiBudy5uZXh0Tm9kZSgpICYmIG53Lm5vZGUgIT09IHJ1bGVDb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IG53Lm5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSBpbiBnb29kVGFnTmFtZXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFRyaWdnZXIgb25seSBvbmNlXG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICBsZXQgdHJpZ2dlcmVkID0gQ2FjaGVVdGlsLmdldENhY2hlKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsIFwic3R5bGVfY29sb3JfbWlzdXNlXCIsIGZhbHNlKTtcbiAgICAgICAgICAgIHBhc3NlZCA9IHRyaWdnZXJlZDtcbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShydWxlQ29udGV4dC5vd25lckRvY3VtZW50LCBcInN0eWxlX2NvbG9yX21pc3VzZVwiLCB0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ1NTVXRpbCB9IGZyb20gXCIuLi91dGlsL0NTU1V0aWxcIjtcbmltcG9ydCB7IENvbG9yVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbG9yVXRpbFwiO1xuXG5leHBvcnQgY29uc3Qgc3R5bGVfZm9jdXNfdmlzaWJsZTogUnVsZSA9IHtcbiAgICBpZDogXCJzdHlsZV9mb2N1c192aXNpYmxlXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX1N0eWxlX0hpbmRlckZvY3VzMVwiOiB7XG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwicG90ZW50aWFsX2ZvY3VzX25vdF92aXNpYmxlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogYHN0eWxlX2ZvY3VzX3Zpc2libGUuaHRtbGAsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9mb2N1c19ub3RfdmlzaWJsZVwiOiBgc3R5bGVfZm9jdXNfdmlzaWJsZS5odG1sYCxcbiAgICAgICAgICAgIFwicGFzc19mb2N1c192aXNpYmxlXCI6IGBzdHlsZV9mb2N1c192aXNpYmxlLmh0bWxgXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSBrZXlib2FyZCBmb2N1cyBpbmRpY2F0b3Igc2hvdWxkIGJlIHZpc2libGUgd2hlbiBkZWZhdWx0IGJvcmRlciBvciBvdXRsaW5lIGlzIG1vZGlmaWVkIGJ5IENTU1wiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfZm9jdXNfbm90X3Zpc2libGVcIjogXCJDaGVjayB0aGUga2V5Ym9hcmQgZm9jdXMgaW5kaWNhdG9yIGlzIHZpc2libGUgd2hlbiB1c2luZyBDU1MgZGVjbGFyYXRpb24gZm9yICdib3JkZXInIG9yICdvdXRsaW5lJ1wiLFxuICAgICAgICAgICAgXCJwYXNzX2ZvY3VzX3Zpc2libGVcIjogXCJUaGUga2V5Ym9hcmQgZm9jdXMgaW5kaWNhdG9yIGlzIHZpc2libGUgb3IgaXMgbm90IGNoYW5nZWQgZnJvbSB0aGUgYnJvd3NlciBkZWZhdWx0XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIG51bTogXCIyLjQuN1wiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgdmFsaWRhdGVQYXJhbXMgPSB7XG4gICAgICAgICAgICBza2lwTm9kZXM6IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogW1widGFibGVcIl0sXG4gICAgICAgICAgICAgICAgdHlwZTogXCJbc3RyaW5nXVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2hlY2tQYXJhbXM6IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogW1wiYm9yZGVyXCIsIFwiYm9yZGVyLXdpZHRoXCIsIFwiYm9yZGVyLXN0eWxlXCIsIFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJib3JkZXItdG9wLXdpZHRoXCIsIFwiYm9yZGVyLXJpZ2h0LXdpZHRoXCIsIFwiYm9yZGVyLWJvdHRvbS13aWR0aFwiLCBcImJvcmRlci1sZWZ0LXdpZHRoXCIsIFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJib3JkZXItdG9wLWNvbG9yXCIsIFwiYm9yZGVyLXJpZ2h0LWNvbG9yXCIsIFwiYm9yZGVyLWJvdHRvbS1jb2xvclwiLCBcImJvcmRlci1sZWZ0LWNvbG9yXCIsIFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJib3JkZXItdG9wLXN0eWxlXCIsIFwiYm9yZGVyLXJpZ2h0LXN0eWxlXCIsIFwiYm9yZGVyLWJvdHRvbS1zdHlsZVwiLCBcImJvcmRlci1sZWZ0LXN0eWxlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIm91dGxpbmVcIiwgXCJvdXRsaW5lLXdpZHRoXCIsIFwib3V0bGluZS1jb2xvclwiLCBcIm91dGxpbmUtc3R5bGVcIl0sXG4gICAgICAgICAgICAgICAgdHlwZTogXCJbc3RyaW5nXVwiXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGlmICghQ29tbW9uVXRpbC5pc1RhYmJhYmxlKHJ1bGVDb250ZXh0KSB8fCB2YWxpZGF0ZVBhcmFtcy5za2lwTm9kZXMudmFsdWUuaW5jbHVkZXMocnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIC8vIEdldCBhbGwgc3R5bGVzIGluIGEgc2luZ2xlIHBhc3MgdGhyb3VnaCBzdHlsZXNoZWV0c1xuICAgICAgICBjb25zdCBhbGxTdHlsZXMgPSBDU1NVdGlsLmdldERlZmluZWRTdHlsZXNNdWx0aXBsZShydWxlQ29udGV4dCwgbnVsbCwgW1wiXCIsIFwiOmZvY3VzXCIsIFwiOmZvY3VzLXZpc2libGVcIiwgXCI6Zm9jdXMtd2l0aGluXCJdKTtcbiAgICAgICAgbGV0IG5vcm1hbFN0eWxlcyA9IGFsbFN0eWxlc1tcIlwiXTsgLy8gY29uc2lkZXIgYm90aCB1c2VyLWRlZmluZWQgYW5kIGJyb3dzZXIgZGVmYXVsdFxuICAgICAgICBsZXQgZm9jdXNTdHlsZXMgPSBbXVxuICAgICAgICBmb2N1c1N0eWxlcy5wdXNoKGFsbFN0eWxlc1tcIjpmb2N1c1wiXSk7XG4gICAgICAgIGZvY3VzU3R5bGVzLnB1c2goYWxsU3R5bGVzW1wiOmZvY3VzLXZpc2libGVcIl0pO1xuICAgICAgICBmb2N1c1N0eWxlcy5wdXNoKGFsbFN0eWxlc1tcIjpmb2N1cy13aXRoaW5cIl0pO1xuICAgICAgICBcbiAgICAgICAgLy8gaWYgZm9jdXMgc3R5bGUgaXMgZGVmaW5lZFxuICAgICAgICBsZXQgc3R5bGVPYmogPSBmb2N1c1N0eWxlc1swXTtcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHN0eWxlT2JqKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvL3Bhc3MgaWYgb3V0bGluZSBpcyBub3QgZGVmaW5lZCBhdCBhbGwsIGJyb3dzZXIgd2lsbCBvdmVycmlkZSBcbiAgICAgICAgICAgIGlmICgoKCFub3JtYWxTdHlsZXNbXCJvdXRsaW5lLXdpZHRoXCJdICYmICFub3JtYWxTdHlsZXNbXCJvdXRsaW5lLXN0eWxlXCJdKVxuICAgICAgICAgICAgICAgIHx8IChub3JtYWxTdHlsZXNbXCJvdXRsaW5lLXdpZHRoXCJdID09PSAnMHB4JyB8fCBub3JtYWxTdHlsZXNbXCJvdXRsaW5lLXN0eWxlXCJdID09PSAnbm9uZScpKVxuICAgICAgICAgICAgICAgICYmICghc3R5bGVPYmpbXCJvdXRsaW5lLXN0eWxlXCJdIHx8IHN0eWxlT2JqW1wib3V0bGluZS1zdHlsZVwiXSAhPT0gJ25vbmUnKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzX2ZvY3VzX3Zpc2libGVcIik7ICAgICAgIFxuXG4gICAgICAgICAgICBsZXQgbm9uZVN0eWxlID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgbnVtT3RoZXJTdHlsZSA9IDA7XG4gICAgICAgICAgICBmb3IgKGxldCBmb2N1c1N0eWxlIGluIHN0eWxlT2JqKSB7XG4gICAgICAgICAgICAgICAgaWYgKHZhbGlkYXRlUGFyYW1zLmNoZWNrUGFyYW1zLnZhbHVlLmluY2x1ZGVzKGZvY3VzU3R5bGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAgICAgKiBmYWlsdXJlIGNhc2U6ICBcbiAgICAgICAgICAgICAgICAgICAgICogIDEuIGZvY3VzIG91dGxpbmUgb3IgYm9yZGVyIHN0eWxlIGlzIG5vbmUgYW5kIG5vIG90aGVyIHN0eWxlIChjb2xvciBvciB3aWR0aCkgZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgKiAgMi4gZm9jdXMgb3V0bGluZSBvciBib3JkZXIgc3R5bGUgaXMgc2FtZSB3aXRoIHRoZSBub3JtYWxcbiAgICAgICAgICAgICAgICAgICAgICogIDMuIHNpemUgaW4gZm9jdXMgaXMgc2FtZSBvciBzbWFsbGVyIHRoYW4gZGVmYXVsdFxuICAgICAgICAgICAgICAgICAgICAgKiAgNC4gY29sb3IgY29udHJhc3QgaW4gZm9jdXMgaXMgYmV0dGVyICBcbiAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICAgIGxldCBmb2N1c1N0eWxlVmFsdWUgPSBzdHlsZU9ialtmb2N1c1N0eWxlXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5vcm1hbFN0eWxlVmFsdWUgPSBub3JtYWxTdHlsZXNbZm9jdXNTdHlsZV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChmb2N1c1N0eWxlLmluY2x1ZGVzKFwic3R5bGVcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb2N1c1N0eWxlVmFsdWUgPT09IFwibm9uZVwiKSBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25lU3R5bGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25lU3R5bGUgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vcm1hbFN0eWxlVmFsdWUgJiYgZm9jdXNTdHlsZVZhbHVlICE9PSBcIm5vbmVcIiAmJiBmb2N1c1N0eWxlVmFsdWUgPT09IG5vcm1hbFN0eWxlVmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfZm9jdXNfbm90X3Zpc2libGVcIik7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZvY3VzU3R5bGUuaW5jbHVkZXMoXCJ3aWR0aFwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbnVtT3RoZXJTdHlsZSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAvL3Byb3hpbWF0aW9uIG9mIHRoZSB3aWR0aCBzdHlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvY3VzU3R5bGVWYWx1ZSA9PT0gJ2luaXRpYWwnKSBmb2N1c1N0eWxlVmFsdWUgPSAnMnB4JztcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZvY3VzU3R5bGVWYWx1ZSA9PT0gJ3RoaW4nKSBmb2N1c1N0eWxlVmFsdWUgPSAnMXB4JztcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZvY3VzU3R5bGVWYWx1ZSA9PT0gJ21lZGl1bScpIGZvY3VzU3R5bGVWYWx1ZSA9ICcycHgnO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZm9jdXNTdHlsZVZhbHVlID09PSAndGhpY2snKSBmb2N1c1N0eWxlVmFsdWUgPSAnM3B4JzsgIFxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9ybWFsU3R5bGVWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub3JtYWxTdHlsZVZhbHVlID09PSAnaW5pdGlhbCcpIG5vcm1hbFN0eWxlVmFsdWUgPSAnMnB4JztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChub3JtYWxTdHlsZVZhbHVlID09PSAndGhpbicpIG5vcm1hbFN0eWxlVmFsdWUgPSAnMXB4JztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChub3JtYWxTdHlsZVZhbHVlID09PSAnbWVkaXVtJykgbm9ybWFsU3R5bGVWYWx1ZSA9ICcycHgnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5vcm1hbFN0eWxlVmFsdWUgPT09ICd0aGljaycpIG5vcm1hbFN0eWxlVmFsdWUgPSAnM3B4JzsgIFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZm9jdXNTdHlsZVZhbHVlID0gQ1NTVXRpbC5nZXRQaXhlbHNGcm9tU3R5bGUoZm9jdXNTdHlsZVZhbHVlLCBydWxlQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxTdHlsZVZhbHVlID0gQ1NTVXRpbC5nZXRQaXhlbHNGcm9tU3R5bGUobm9ybWFsU3R5bGVWYWx1ZSwgcnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvY3VzU3R5bGVWYWx1ZSA9PSAwIHx8IGZvY3VzU3R5bGVWYWx1ZSA8PSBub3JtYWxTdHlsZVZhbHVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX2ZvY3VzX25vdF92aXNpYmxlXCIpO1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmb2N1c1N0eWxlLmluY2x1ZGVzKFwiY29sb3JcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG51bU90aGVyU3R5bGUrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBlbGVtZW50IGJnIGNvbG9yXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29sb3JDb21ibyA9IENvbG9yVXRpbC5Db2xvckNvbWJvKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2xvckNvbWJvID09PSBudWxsKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBiZyA9IGNvbG9yQ29tYm8uYmc7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWJnKSBjb250aW51ZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy9wcm94aW1hdGlvbiBvZiB0aGUgd2lkdGggc3R5bGVcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb2N1c1N0eWxlVmFsdWUgPT09ICdpbml0aWFsJykgZm9jdXNTdHlsZVZhbHVlID0gJ2JsYWNrJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub3JtYWxTdHlsZVZhbHVlICYmIG5vcm1hbFN0eWxlVmFsdWUgPT09ICdpbml0aWFsJykgbm9ybWFsU3R5bGVWYWx1ZSA9ICdibGFjayc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGJvcmRlci9vdXRsaW5lIGNvbG9yIGFzIGZnIGNvbG9yc1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9jdXNTdHlsZVZhbHVlID0gQ29sb3JVdGlsLkNvbG9yKGZvY3VzU3R5bGVWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxTdHlsZVZhbHVlID0gQ29sb3JVdGlsLkNvbG9yKG5vcm1hbFN0eWxlVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvY3VzU3R5bGVWYWx1ZSA9PT0gbnVsbCB8fCBub3JtYWxTdHlsZVZhbHVlID09PSBudWxsKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgLy9nZXQgdGhlIGJvcmRlci9vdXRsaW5lIGNvbG9yIGNvbnRyYXN0IHJhdGlvc1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZvY3VzUmF0aW8gPSBmb2N1c1N0eWxlVmFsdWUuY29udHJhc3RSYXRpbyhiZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbm9ybWFsUmF0aW8gPSBub3JtYWxTdHlsZVZhbHVlLmNvbnRyYXN0UmF0aW8oYmcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvY3VzUmF0aW8gPCAzLjAgfHwgZm9jdXNSYXRpbyA8PSBub3JtYWxSYXRpbylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF9mb2N1c19ub3RfdmlzaWJsZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vb3RoZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIG51bU90aGVyU3R5bGUrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub3JtYWxTdHlsZVZhbHVlICE9IG51bGwgJiYgZm9jdXNTdHlsZVZhbHVlID09PSBub3JtYWxTdHlsZVZhbHVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX2ZvY3VzX25vdF92aXNpYmxlXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gd2FybiBpZiBhIGJvcmRlci9vdXRsaW5lIGZvY3VzIHN0eWxlIGlzICdub25lJyBhbmQgbm9lIG90aGVyIChjb2xvciBhbmQvb3Igd2lkdGgpIGlzIGRlZmluZWQgXG4gICAgICAgICAgICBpZiAobm9uZVN0eWxlICYmIG51bU90aGVyU3R5bGUgPT09IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfZm9jdXNfbm90X3Zpc2libGVcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBubyBmb2N1cyBzdHlsZSBkZWZpbmVkIFxuICAgICAgICAgICAgLy8gd2FybiBpZiBub3JtYWwgc3R5bGUgaXMgZGVmaW5lZCBhbmQgaXMgbm90IFwibm9uZVwiXG4gICAgICAgICAgICBmb3IgKGxldCBub3JtYWxTdHlsZSBpbiBub3JtYWxTdHlsZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAodmFsaWRhdGVQYXJhbXMuY2hlY2tQYXJhbXMudmFsdWUuaW5jbHVkZXMobm9ybWFsU3R5bGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBub3JtYWxTdHlsZVZhbHVlID0gbm9ybWFsU3R5bGVzW25vcm1hbFN0eWxlXTtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGlmIGJvcmRlciBvciBvdXRsaW5lIHN0eWxlIGlzIFwibm9uZVwiIFxuICAgICAgICAgICAgICAgICAgICBpZiAobm9ybWFsU3R5bGVWYWx1ZSAhPT0gJ25vbmUnKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfZm9jdXNfbm90X3Zpc2libGVcIik7XG4gICAgICAgICAgICAgICAgfSAgICAgICAgXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gICBcbiAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc19mb2N1c192aXNpYmxlXCIpO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDYWNoZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IHN0eWxlX2hpZ2hjb250cmFzdF92aXNpYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcInN0eWxlX2hpZ2hjb250cmFzdF92aXNpYmxlXCIsXG4gICAgY29udGV4dDogXCJkb206c3R5bGUsIGRvbTpsaW5rLCBkb206KltzdHlsZV1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9TdHlsZV9UcmlnZ2VyMlwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIk1hbnVhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJzdHlsZV9oaWdoY29udHJhc3RfdmlzaWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwic3R5bGVfaGlnaGNvbnRyYXN0X3Zpc2libGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInN0eWxlX2hpZ2hjb250cmFzdF92aXNpYmxlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJDb25maXJtIFdpbmRvd3MgaGlnaCBjb250cmFzdCBtb2RlIGlzIHN1cHBvcnRlZCB3aGVuIHVzaW5nIENTUyB0byBpbmNsdWRlLCBwb3NpdGlvbiBvciBhbHRlciBub24tZGVjb3JhdGl2ZSBjb250ZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiV2luZG93cyBoaWdoIGNvbnRyYXN0IG1vZGUgbXVzdCBiZSBzdXBwb3J0ZWQgd2hlbiB1c2luZyBDU1MgdG8gaW5jbHVkZSwgcG9zaXRpb24gb3IgYWx0ZXIgbm9uLWRlY29yYXRpdmUgY29udGVudFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4xLjFcIiwgXCIxLjMuMlwiLCBcIjEuNC4xMVwiXSwgIC8vb3RoZXIgXCJzdHlsZVwiIHJ1bGVzIGZvciBmb2N1cywgaG92ZXIsIGFuZCBjb2xvclxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpZFwiOiBbXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCIsIFwiMS4zLjJcIiwgXCIxLjQuMTFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwibGlua1wiICYmXG4gICAgICAgICAgICAoIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInJlbFwiKSB8fCBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJyZWxcIikudG9Mb3dlckNhc2UoKSAhPT0gXCJzdHlsZXNoZWV0XCIpKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAobm9kZU5hbWUgIT09IFwic3R5bGVcIiAmJiBub2RlTmFtZSAhPT0gXCJsaW5rXCIgJiZcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInN0eWxlXCIpICYmIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInN0eWxlXCIpLnRyaW0oKS5sZW5ndGggPT09IDApXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGxldCB0cmlnZ2VyZWQgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUocnVsZUNvbnRleHQub3duZXJEb2N1bWVudCwgXCJzdHlsZV9oaWdoY29udHJhc3RfdmlzaWJsZVwiLCBmYWxzZSk7XG4gICAgICAgIGxldCBwYXNzZWQgPSB0cmlnZ2VyZWQ7XG4gICAgICAgIC8vICAgICAgICBQYWNrYWdlcy5qYXZhLmxhbmcuU3lzdGVtLm91dC5wcmludGxuKHRyaWdnZXJlZCk7XG4gICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShydWxlQ29udGV4dC5vd25lckRvY3VtZW50LCBcInN0eWxlX2hpZ2hjb250cmFzdF92aXNpYmxlXCIsIHRydWUpO1xuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZU1hbnVhbChcIk1hbnVhbF8xXCIpO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IHN0eWxlX2hvdmVyX3BlcnNpc3RlbnQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwic3R5bGVfaG92ZXJfcGVyc2lzdGVudFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOnN0eWxlLCBkb206KltzdHlsZV0sIGRvbToqXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwic3R5bGVfaG92ZXJfcGVyc2lzdGVudC5odG1sXCIsXG4gICAgICAgICAgICAvLyBcIlBhc3NfMVwiOiBcInN0eWxlX2hvdmVyX3BlcnNpc3RlbnQuaHRtbFwiLFxuICAgICAgICAgICAgXCJQYXNzXzJcIjogXCJzdHlsZV9ob3Zlcl9wZXJzaXN0ZW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJzdHlsZV9ob3Zlcl9wZXJzaXN0ZW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzJcIjogXCJzdHlsZV9ob3Zlcl9wZXJzaXN0ZW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzNcIjogXCJzdHlsZV9ob3Zlcl9wZXJzaXN0ZW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJzdHlsZV9ob3Zlcl9wZXJzaXN0ZW50Lmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwidGhlIGhvdmVyOiBwc2V1ZG8tY2xhc3MgaXMgbm90IHVzZWQgdG8gZGlzcGxheSBjb250ZW50XCIsXG4gICAgICAgICAgICAvLyBcIlBhc3NfMVwiOiBcImNvbnRlbnQgZGlzcGxheWVkIHZpYSB0aGUgOmhvdmVyIHBzZXVkby1jbGFzcyBpcyBhIGRpcmVjdCBjaGlsZCBvZiB0aGUgdHJpZ2dlciBlbGVtZW50XCIsXG4gICAgICAgICAgICBcIlBhc3NfMlwiOiBcImNvbnRlbnQgZGlzcGxheWVkIHZpYSB0aGUgOmhvdmVyIHBzZXVkby1jbGFzcyBpcyB0aGUgYWRqYWNlbnQgc2libGluZyBvZiB0aGUgdHJpZ2dlciBlbGVtZW50XCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiQ29uZmlybSB0aGUgcG9pbnRlciBjYW4gYmUgcG9zaXRpb25lZCBvdmVyIHRoZSBkaXNwbGF5ZWQgZWxlbWVudCwgbm90IGp1c3QgdGhlIHRyaWdnZXJcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzJcIjogXCJDb25maXJtIHRoZSBwb2ludGVyIGNhbiBiZSBwb3NpdGlvbmVkIG92ZXIgYWxsIHRoZSBpbmZvcm1hdGlvbiBkaXNwbGF5ZWQgb24gaG92ZXJcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzNcIjogXCJDb25maXJtIHRoZSBtYXJnaW4gc3R5bGUgYXR0cmlidXRlIGhhcyBub3QgcHJldmVudGVkIHRoZSBwb2ludGVyIGZyb20gaG92ZXJpbmcgb3ZlciB0aGUgZGlzcGxheWVkIGVsZW1lbnQsIG5vdCBqdXN0IHRoZSB0cmlnZ2VyXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGhlIHBvaW50ZXIgc2hvdWxkIGJlIGFibGUgdG8gbW92ZSBvdmVyIGNvbnRlbnQgZGlzcGxheWVkIG9uIGhvdmVyXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS40LjEzXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGxldCBwYXNzMCA9IGZhbHNlO1xuICAgICAgICBsZXQgcGFzczEgPSBmYWxzZTtcbiAgICAgICAgbGV0IHBhc3MyID0gZmFsc2U7IC8vIG5ldmVyIGhhcHBlblxuICAgICAgICBsZXQgcG90ZW50aWFsMSA9IGZhbHNlO1xuICAgICAgICBsZXQgcG90ZW50aWFsMiA9IGZhbHNlO1xuICAgICAgICBsZXQgcG90ZW50aWFsMyA9IGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGxldCBzdHlsZVRleHQgPSBcIlwiO1xuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwic3R5bGVcIikge1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJSVUxFIFJVTiAqKioqKioqKioqKioqKioqKipcIik7XG4gICAgICAgICAgICBzdHlsZVRleHQgPSBDb21tb25VdGlsLmdldElubmVyVGV4dChydWxlQ29udGV4dCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIC8vIGNoZWNrIGltcG9ydFxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJydWxlQ29udGV4dC5vd25lckRvY3VtZW50LnN0eWxlU2hlZXRzLmxlbmd0aCA9IFwiK3J1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHMubGVuZ3RoKTtcbiAgICAgICAgICAgIGZvciAobGV0IHNJbmRleCA9IDA7IHNJbmRleCA8IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHMubGVuZ3RoOyArK3NJbmRleCkge1xuICAgICAgICAgICAgICAgIGxldCBzaGVldCA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHNbc0luZGV4XSBhcyBDU1NTdHlsZVNoZWV0O1xuICAgICAgICAgICAgICAgIGlmIChzaGVldCAmJiBzaGVldC5vd25lck5vZGUgPT09IHJ1bGVDb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3R5bGVSdWxlcyA9IHNoZWV0LmNzc1J1bGVzID8gc2hlZXQuY3NzUnVsZXMgOiBzaGVldC5ydWxlcztcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwic3R5bGVSdWxlcy5sZW5ndGggPSBcIitzdHlsZVJ1bGVzLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBzdHlsZVJ1bGVJbmRleCA9IDA7IHN0eWxlUnVsZUluZGV4IDwgc3R5bGVSdWxlcy5sZW5ndGg7IHN0eWxlUnVsZUluZGV4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIioqKioqKioqKipcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIqKioqKioqKioqIEZPUiBMT09QIHN0eWxlUnVsZUluZGV4ID0gXCIrc3R5bGVSdWxlSW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmb3VuZEhvdmVyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhvdmVyRWxlbWVudCA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBsdXNDb21iaW5hdG9yID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRpbGRlQ29tYmluYXRvciA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhZnRlckNvbWJpbmF0b3JFbGVtZW50ID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYWZ0ZXJDb21iaW5hdG9yRWxlbWVudERpc3BsYXkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYWZ0ZXJDb21iaW5hdG9yRWxlbWVudERpc3BsYXlWYWx1ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhZnRlckNvbWJpbmF0b3JFbGVtZW50SG92ZXIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3VwcG9ydGluZ0VsZW1lbnQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3VwcG9ydGluZ0hvdmVyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5UHJvcGVydHkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3VwcG9ydGluZ0hvdmVyRWxlbWVudERpc3BsYXlWYWx1ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhZGphY2VudFBsdXNTaWJsaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFkamFjZW50VGlsZGVNdWx0aXBsZVNpYmxpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3R5bGVSdWxlID0gc3R5bGVSdWxlc1tzdHlsZVJ1bGVJbmRleF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGVUZXh0ID0gc3R5bGVSdWxlc1tzdHlsZVJ1bGVJbmRleF0uY3NzVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInN0eWxlUnVsZXNbXCIrc3R5bGVSdWxlSW5kZXgrXCJdID0gXCIrcnVsZVRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEuIENoZWNrIGZvciA6aG92ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZVRleHQubWF0Y2goLzpob3Zlci9nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEhvdmVyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIxLiBmb3VuZCA6aG92ZXIgPSBcIisgZm91bmRIb3Zlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDIuIEdldCBob3ZlciBlbGVtZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvdmVyRWxlbWVudCA9IHJ1bGVUZXh0LnNwbGl0KFwiOlwiKVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIyLiBmb3VuZCBlbGVtZW50IHRoYXQgZ29lcyB3aXRoIDpob3ZlciA9IFwiK2hvdmVyRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIxLiBObyBob3ZlciBvbiBjc3MgZWxlbWVudCBzbyBza2lwIHRoaXMgcnVsZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8vIGlmIG5vIDpob3ZlciBza2lwIHRoaXMgcnVsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAzYS4gQ2hlY2sgZm9yIGNzcyBjb21iaW5hdG9yICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA0YS4gaWYgc28gZG8gd2UgaGF2ZSBhbiBhZnRlciBjb21iaW5hdG9yIGVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGx1c1RlbXBTdHIgPSBydWxlVGV4dC5zdWJzdHJpbmcocnVsZVRleHQuaW5kZXhPZihcIitcIikgKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVzVGVtcFN0ciA9IHBsdXNUZW1wU3RyLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZVRleHQubWF0Y2goLzpob3ZlciBcXCsvZykgfHwgcnVsZVRleHQubWF0Y2goLzpob3ZlclxcKy9nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVzQ29tYmluYXRvciA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiM2EuIEZvdW5kIHBsdXNDb21iaW5hdG9yID0gXCIrIHBsdXNDb21iaW5hdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJDb21iaW5hdG9yRWxlbWVudCA9IHBsdXNUZW1wU3RyLnNwbGl0KFwiIFwiKVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCI0YS4gRm91bmQgcGx1cyBhZnRlckNvbWJpbmF0b3JFbGVtZW50ID0gXCIrYWZ0ZXJDb21iaW5hdG9yRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gM2IuIENoZWNrIGZvciBjc3MgY29tYmluYXRvciArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNGIuIGlmIHNvIGRvIHdlIGhhdmUgYW4gYWZ0ZXIgY29tYmluYXRvciBlbGVtZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGVUZXh0Lm1hdGNoKC86aG92ZXIgXFx+L2cpIHx8IHJ1bGVUZXh0Lm1hdGNoKC86aG92ZXJcXH4vZykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJtYXRjaCA9IFwiK3J1bGVUZXh0Lm1hdGNoKFwiOmhvdmVyIFxcflwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbGRlQ29tYmluYXRvciA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiM2IuIEZvdW5kIHRpbGRlQ29tYmluYXRvciA9IFwiKyB0aWxkZUNvbWJpbmF0b3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGx1c1RlbXBTdHIgPSBydWxlVGV4dC5zdWJzdHJpbmcocnVsZVRleHQuaW5kZXhPZihcIn5cIikgKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1c1RlbXBTdHIgPSBwbHVzVGVtcFN0ci50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyQ29tYmluYXRvckVsZW1lbnQgPSBwbHVzVGVtcFN0ci5zcGxpdChcIiBcIilbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiNGIuIEZvdW5kIHRpbGRlIGFmdGVyQ29tYmluYXRvckVsZW1lbnQgPSBcIithZnRlckNvbWJpbmF0b3JFbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBsdXNDb21iaW5hdG9yICYmICF0aWxkZUNvbWJpbmF0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTk8gcGx1c0NvbWJpbmF0b3Igb3IgdGlsZGVDb21iaW5hdG9yIHNvIHNraXAgdGhpcyBydWxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiTk8gcGx1c0NvbWJpbmF0b3Igb3IgdGlsZGVDb21iaW5hdG9yIHNvIFBBU1NcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiKioqKiBSRVBPUlQgUEFTUyAwIEhFUkVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTsgLy8gSkNIOiBzaG91bGQgd2UgaGF2ZSBhIE4vQSBwYXNzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU28gbm93IHdlIGhhdmUgYSBjc3MgZWxlbWVudCB3aXRoIGhvdmVyIC0gZWxlbWVudDpob3ZlciBzbyB3ZSBoYXZlIHByb2JsZW1zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gY2hlY2tcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDUuIENoZWNrIGlmIHRoZSBhZnRlciBjb21iaW5hdG9yIGVsZW1lbnQgaGFzIGRpc3BsYXk6IHByb3BlcnR5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNi4gQ2hlY2sgaWYgZGlzcGxheSBwcm9wZXJ0eSBpcyBub3Qgbm9uZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZnRlckNvbWJpbmF0b3JFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCBpbmRleCBvZiBkaXNwbGF5OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInBsdXNUZW1wU3RyID0gXCIrcGx1c1RlbXBTdHIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSBwbHVzVGVtcFN0ci5pbmRleE9mKFwiZGlzcGxheTpcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJDb21iaW5hdG9yRWxlbWVudERpc3BsYXkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCI1LiBGb3VuZCBhZnRlckNvbWJpbmF0b3JFbGVtZW50RGlzcGxheSA9IFwiK2FmdGVyQ29tYmluYXRvckVsZW1lbnREaXNwbGF5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbHVzVGVtcFN0ci5zbGljZShpbmRleCArIDgpLnRyaW0oKS5zcGxpdChcIiBcIilbMF0gIT09IFwibm9uZTtcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyQ29tYmluYXRvckVsZW1lbnREaXNwbGF5VmFsdWUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiNi4gRm91bmQgYWZ0ZXJDb21iaW5hdG9yRWxlbWVudERpc3BsYXlWYWx1ZSBub3Qgbm9uZSA9IFwiK2FmdGVyQ29tYmluYXRvckVsZW1lbnREaXNwbGF5VmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImFmdGVyQ29tYmluYXRvckVsZW1lbnREaXNwbGF5VmFsdWUgPT09IG5vbmVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIqKioqIFBVVCBQT1RFTlRJQUwgMCBIRVJFXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBiYWQgY3NzIHNvIGl0IHdvbid0IGhhcHBlblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJOTyBhZnRlckNvbWJpbmF0b3JFbGVtZW50RGlzcGxheSBzbyBza2lwIHRoaXMgcnVsZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBiYWQgY3NzIHNvIGl0IHdvbid0IGhhcHBlblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIk5PIGFmdGVyQ29tYmluYXRvckVsZW1lbnQgc28gc2tpcCB0aGlzIHJ1bGVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZnRlckNvbWJpbmF0b3JFbGVtZW50RGlzcGxheVZhbHVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hlZXQgJiYgc2hlZXQub3duZXJOb2RlID09PSBydWxlQ29udGV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIqKioqIEF0IHRoaXMgcG9pbnQgd2UgaGF2ZSB2ZXJpZmllZCB0aGF0IHdlIGhhdmUgYSBjc3MgZWxlbWVudCB3aXRoIGEgaG92ZXIgb2YgdGhlIGZvcm1hdCBzcGFuOmhvdmVyICsgZGl2IHsgZGlzcGxheTogYmxvY2s7IH0gd2l0aCBhbGwgdGhlIHByb3BlciBwcm9wZXJ0aWVzIGFuZCB2YWx1ZXNcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiBBdCB0aGlzIHBvaW50IHdlIGhhdmUgdmVyaWZpZWQgdGhhdCB3ZSBoYXZlIGEgY3NzIGVsZW1lbnQgd2l0aCBhIGhvdmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICBvZiB0aGUgZm9ybWF0IHNwYW46aG92ZXIgKyBkaXYgeyBkaXNwbGF5OiBibG9jazsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgd2l0aCBhbGwgdGhlIHByb3BlciBwcm9wZXJ0aWVzIGFuZCB2YWx1ZXNcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3R5bGVSdWxlczIgPSBzaGVldC5jc3NSdWxlcyA/IHNoZWV0LmNzc1J1bGVzIDogc2hlZXQucnVsZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJzdHlsZVJ1bGVzMi5sZW5ndGggPSBcIitzdHlsZVJ1bGVzMi5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHN0eWxlUnVsZUluZGV4MiA9IDA7IHN0eWxlUnVsZUluZGV4MiA8IHN0eWxlUnVsZXMyLmxlbmd0aDsgc3R5bGVSdWxlSW5kZXgyKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgcnVsZSBmb3IgYWZ0ZXJDb21pbmF0b3JFbGVtZW50OmhvdmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGZpbmQgYWZ0ZXJDb21iaW5hdG9yRWxlbWVudDpob3ZlciBzZWUgaWYgcnVsZSBoYXMgcHJvcGVydHkgZGlzcGxheTogdmFsdWUgd2hlcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmFsdWUgIT0gbm9uZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIioqKioqKioqKipcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiKioqKioqKioqKiAybmQgRk9SIHN0eWxlUnVsZUluZGV4MiA9IFwiK3N0eWxlUnVsZUluZGV4Mik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBydWxlVGV4dDIgPSBzdHlsZVJ1bGVzW3N0eWxlUnVsZUluZGV4Ml0uY3NzVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJydWxlVGV4dDIgPSBcIiwgcnVsZVRleHQyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJhZnRlckNvbWJpbmF0b3JFbGVtZW50ID0gXCIrYWZ0ZXJDb21iaW5hdG9yRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGFsbCBzdXBwb3J0aW5nIGVsZW1lbnRzIGZvciBtYXJnaW4gcHJvcGVydHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgZmluZCBtYXJnaW4gU1RPUCBhbmQgUkVQT1JUIEVSUk9SXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZWdFeFN0cmluZyA9IGFmdGVyQ29tYmluYXRvckVsZW1lbnQgKyBcIiB7XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0cmltUnVsZVRleHQyID0gcnVsZVRleHQyLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlZ0luZGV4ID0gdHJpbVJ1bGVUZXh0Mi5pbmRleE9mKHJlZ0V4U3RyaW5nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFmdGVyQ29tYmluYXRvckVsZW1lbnRQcm9wZXJ0aWVzID0gdHJpbVJ1bGVUZXh0Mi5zbGljZShyZWdJbmRleCkudHJpbSgpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgKCFhZnRlckNvbWJpbmF0b3JFbGVtZW50UHJvcGVydGllcy5tYXRjaCgvbWFyZ2luL2cpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdHJpbVJ1bGVUZXh0Mi5tYXRjaCgvbWFyZ2luL2cpKSB7ICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJObyBtYXJnaW4gcHJvYmxlbSBzbyBjb250aW51ZSBvbi4uLlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvIHdlIGhhdmUgYSBzdXBwb3J0aW5nIGVsZW1lbnQgY3NzIGRlZmluaXRpb25zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3VwcG9ydGluZ0hvdmVyRWxlbWVudCA9IHJ1bGVUZXh0Mi5zcGxpdChcIjpcIilbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0aW5nSG92ZXJFbGVtZW50ID0gc3VwcG9ydGluZ0hvdmVyRWxlbWVudC5zcGxpdChcIiBcIilbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInN1cHBvcnRpbmdIb3ZlckVsZW1lbnQgPSBcIitzdXBwb3J0aW5nSG92ZXJFbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiYWZ0ZXJDb21iaW5hdG9yRWxlbWVudCA9IFwiK2FmdGVyQ29tYmluYXRvckVsZW1lbnQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBORUVEIFRPIENIRUNLIEZPUiBhZnRlckNvbWluYXRvckVsZW1lbnQ6aG92ZXIgaW4gT05FIFNURVBcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1cHBvcnRpbmdIb3ZlckVsZW1lbnQgPT09IGFmdGVyQ29tYmluYXRvckVsZW1lbnQgJiYgcnVsZVRleHQyLm1hdGNoKC86aG92ZXIvZykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIjcuIEZvdW5kIHN1cHBvcnRpbmcgaG92ZXIgZWxlbWVudCBzYW1lIGFzIGFmdGVyQ29tYmluYXRvckVsZW1lbnRcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA3LiBGb3VuZCBzdXBwb3J0aW5nIGhvdmVyIGVsZW1lbnQgc2FtZSBhcyBhZnRlckNvbWJpbmF0b3JFbGVtZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGluZ0VsZW1lbnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvZXMgc3VwcG9ydGluZyBlbGVtZW50IGhhdmUgaG92ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIjguIFN1cHBvcnRpbmcgZWxlbWVudCBoYXMgaG92ZXIgYWxzbyA9IFwiKyBmb3VuZEhvdmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA4LiBTdXBwb3J0aW5nIGVsZW1lbnQgaGFzIGhvdmVyIGFsc29cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0aW5nSG92ZXIgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IHJ1bGVUZXh0Mi5pbmRleE9mKFwiZGlzcGxheTpcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJpbmRleCA9IFwiK2luZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gOS4gRm91bmQgc3VwcG9ydGluZ0hvdmVyRWxlbWVudERpc3BsYXlQcm9wZXJ0eVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVByb3BlcnR5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCI5LiBGb3VuZCBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVByb3BlcnR5ID0gXCIrc3VwcG9ydGluZ0hvdmVyRWxlbWVudERpc3BsYXlQcm9wZXJ0eSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbHVzVGVtcFN0ci5zbGljZShpbmRleCArIDgpLnRyaW0oKS5zcGxpdChcIiBcIilbMF0gIT09IFwibm9uZTtcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMTAuIEZvdW5kIHN1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5VmFsdWUgbm90IG5vbmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5VmFsdWUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIxMC4gRm91bmQgc3VwcG9ydGluZ0hvdmVyRWxlbWVudERpc3BsYXlWYWx1ZSBub3Qgbm9uZSA9IFwiK3N1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5VmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IGxpc3Qgb2YgaG92ZXIgZWxlbWVudHMgYW5kIG5leHQgc2libGluZyBmb3IgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9yICsgdGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgQURKQUNFTlQgc2libGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhvdmVyRWxlbWVudCAhPT0gXCJcIiAmJiBwbHVzQ29tYmluYXRvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBob3ZlckVsZW1lbnRMaXN0ID0gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShob3ZlckVsZW1lbnQudG9VcHBlckNhc2UoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJob3ZlckVsZW1lbnRMaXN0Lmxlbmd0aCA9IFwiK2hvdmVyRWxlbWVudExpc3QubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImhvdmVyRWxlbWVudExpc3RbMF0udGFnTmFtZSA9IFwiK2hvdmVyRWxlbWVudExpc3RbMF0udGFnTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IGFkamFjZW50IHNpYmxpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkFkamFjZW50IHNpYmxpbmcgPSBcIitob3ZlckVsZW1lbnRMaXN0WzBdLm5leHRFbGVtZW50U2libGluZy50YWdOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImFmdGVyQ29tYmluYXRvckVsZW1lbnQudG9VcHBlckNhc2UoKSA9IFwiK2FmdGVyQ29tYmluYXRvckVsZW1lbnQudG9VcHBlckNhc2UoKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWZ0ZXJDb21iaW5hdG9yRWxlbWVudC50b1VwcGVyQ2FzZSgpID09PSBob3ZlckVsZW1lbnRMaXN0WzBdLm5leHRFbGVtZW50U2libGluZy50YWdOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiMTFhLiBIb3ZlciB3aXRoIHBsdXMgaGFzIGFkamFjZW50IHNpYmxpbmcuXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDExYS4gSG92ZXIgd2l0aCBwbHVzIGhhcyBhZGphY2VudCBzaWJsaW5nLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGphY2VudFBsdXNTaWJsaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCB3ZSBoYXZlIHZlcmlmaWVkIGEgc3VwcG9ydGluZyBhZnRlckNvbWJpbmF0b3JFbGVtZW50IGNzcyBydWxlIHRoYXQgY29udGFpbnMgaG92ZXIgYW5kIGRpc3BsYXkgcHJvcGVydHkgdGhhdCBpcyBub3QgZXF1YWwgdG8gbm9uZSBhbmQgaGFzIGEgaG92ZXIgZWxlbWVudCBpbiB0aGUgYm9keSB3aXRoIGFuIGFkamFjZW50IHNpYmxpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIqKioqIFJFUE9SVCBQQVNTIDEgSEVSRVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzczAgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBsdXNDb21iaW5hdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIxMWEuIE1haW4gaG92ZXIgd2l0aCArIGNvbWJpbmF0b3IgaGFzIG5vIGFkamFjZW50IHNpYmxpbmdcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwb3RlbnRpYWwxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiKioqKiBQVVQgUE9URU5USUFMIDEgSEVSRVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG90ZW50aWFsMSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdldCBsaXN0IG9mIGhvdmVyIGVsZW1lbnRzIGFuZCBkZXRlcm1pbmUgaWYgdGhlcmUgYXJlIDIgb3IgbW9yZSBhZGphY2VudCBzaWJsaW5ncyBmb3IgflxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9yIH4gdGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgQURKQUNFTlQgc2libGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhvdmVyRWxlbWVudCAhPT0gXCJcIiAmJiB0aWxkZUNvbWJpbmF0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImhvdmVyRWxlbWVudC50b1VwcGVyQ2FzZSgpID0gXCIraG92ZXJFbGVtZW50LnRvVXBwZXJDYXNlKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBob3ZlckVsZW1lbnRMaXN0ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvdmVyRWxlbWVudC50b1VwcGVyQ2FzZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJob3ZlckVsZW1lbnRMaXN0Lmxlbmd0aCA9IFwiK2hvdmVyRWxlbWVudExpc3QubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgdHdvIG9yIG1vcmUgYWRqYWNlbnQgc2libGluZ3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2libGluZ3MgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2libGluZyA9IGhvdmVyRWxlbWVudExpc3RbMF0ubmV4dEVsZW1lbnRTaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJzaWJsaW5nLnRhZ05hbWUgPSBcIitzaWJsaW5nLnRhZ05hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2libGluZy50YWdOYW1lID09PSBhZnRlckNvbWJpbmF0b3JFbGVtZW50LnRvVXBwZXJDYXNlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpYmxpbmdzLnB1c2goc2libGluZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKChzaWJsaW5nID0gc2libGluZy5uZXh0RWxlbWVudFNpYmxpbmcpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2libGluZ0NvdW50ID0gc2libGluZ3MubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwic2libGluZ0NvdW50ID0gXCIrc2libGluZ0NvdW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBKQ0ggVE9ETzogd2hhdCBpZiBzaWJsaW5nIGNvdW50IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2libGluZ0NvdW50ID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiMTFiLiBIb3ZlciB3aXRoIHRpbGRlIGFuZCBvbmUgYWRqYWNlbnQgc2libGluZ1wiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRqYWNlbnRUaWxkZU11bHRpcGxlU2libGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiKioqKiBSRVBPUlQgUEFTUyAyIEhFUkVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNpYmxpbmdDb3VudCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJNYWluIGhvdmVyIHdpdGggfiBjb21iaW5hdG9yIGhhcyB0d28gb3IgbW9yZSBzaWJsaW5nc1wiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwb3RlbnRpYWwyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIioqKiogUFVUIFBPVEVOVElBTCAyIEhFUkVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8yXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBsdXNDb21iaW5hdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSBtYWtlIGl0IHRvIHRoZSBsYXN0IHJ1bGUgYW5kIHN1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5VmFsdWUgaXMgc3RpbGwgZmFsc2UgPT4gcG90ZW50aWFsMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlUnVsZUluZGV4MiA9PT0gc3R5bGVSdWxlczIubGVuZ3RoIC0gMSAmJiBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVZhbHVlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiTk8gcGx1cyBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVByb3BlcnR5XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiKioqKiBQVVQgUE9URU5USUFMIDEgSEVSRVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aWxkZUNvbWJpbmF0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIG1ha2UgaXQgdG8gdGhlIGxhc3QgcnVsZSBhbmQgc3VwcG9ydGluZ0hvdmVyRWxlbWVudERpc3BsYXlWYWx1ZSBpcyBzdGlsbCBmYWxzZSA9PiBwb3RlbnRpYWwyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVSdWxlSW5kZXgyID09PSBzdHlsZVJ1bGVzMi5sZW5ndGggLSAxICYmIHN1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5VmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJOTyBwbHVzIHN1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5UHJvcGVydHlcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIqKioqIFBVVCBQT1RFTlRJQUwgMiBIRVJFXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90ZSBhdCBsZWFzdCBvbmUgb2YgdGhlIHJ1bGVzIG11c3QgaGF2ZSBhIGRpc3BsYXkgcHJvcGVydHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBsdXNDb21iaW5hdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIG1ha2UgaXQgdG8gdGhlIGxhc3QgcnVsZSBhbmQgc3VwcG9ydGluZ0hvdmVyRWxlbWVudERpc3BsYXlQcm9wZXJ0eSBpcyBzdGlsbCBmYWxzZSA9PiBwb3RlbnRpYWwxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZVJ1bGVJbmRleDIgPT09IHN0eWxlUnVsZXMyLmxlbmd0aCAtIDEgJiYgc3VwcG9ydGluZ0hvdmVyRWxlbWVudERpc3BsYXlQcm9wZXJ0eSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiTk8gcGx1cyBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVByb3BlcnR5XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIqKioqIFBVVCBQT1RFTlRJQUwgMSBIRVJFXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aWxkZUNvbWJpbmF0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgbWFrZSBpdCB0byB0aGUgbGFzdCBydWxlIGFuZCBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVByb3BlcnR5IGlzIHN0aWxsIGZhbHNlID0+IHBvdGVudGlhbDJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlUnVsZUluZGV4MiA9PT0gc3R5bGVSdWxlczIubGVuZ3RoIC0gMSAmJiBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVByb3BlcnR5ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJOTyB0aWxkZSBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVByb3BlcnR5XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIqKioqIFBVVCBQT1RFTlRJQUwgMiBIRVJFXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90ZSBhdCBsZWFzdCBvbmUgb2YgdGhlIHJ1bGVzIG11c3QgaGF2ZSBhIHN1cHBvcnRpbmdFbGVtZW50OmhvdmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBsdXNDb21iaW5hdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgbWFrZSBpdCB0byB0aGUgbGFzdCBydWxlIGFuZCBzdXBwb3J0aW5nRWxlbWVudCBpcyBzdGlsbCBmYWxzZSA9PiBwb3RlbnRpYWwxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJzdHlsZVJ1bGVJbmRleDIgPSBcIitzdHlsZVJ1bGVJbmRleDIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwic3R5bGVSdWxlczIubGVuZ3RoID0gXCIrc3R5bGVSdWxlczIubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInN1cHBvcnRpbmdFbGVtZW50ID0gXCIrc3VwcG9ydGluZ0hvdmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVSdWxlSW5kZXgyID09PSBzdHlsZVJ1bGVzMi5sZW5ndGggLSAxICYmIHN1cHBvcnRpbmdIb3ZlciA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJOTyBwbHVzIHN1cHBvcnRpbmdFbGVtZW50OmhvdmVyXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIioqKiogUFVUIFBPVEVOVElBTCAxIEhFUkVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aWxkZUNvbWJpbmF0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSBtYWtlIGl0IHRvIHRoZSBsYXN0IHJ1bGUgYW5kIHN1cHBvcnRpbmdFbGVtZW50IGlzIHN0aWxsIGZhbHNlID0+IHBvdGVudGlhbDJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInN0eWxlUnVsZUluZGV4MiA9IFwiK3N0eWxlUnVsZUluZGV4Mik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJzdHlsZVJ1bGVzMi5sZW5ndGggPSBcIitzdHlsZVJ1bGVzMi5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwic3VwcG9ydGluZ0VsZW1lbnQgPSBcIitzdXBwb3J0aW5nSG92ZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZVJ1bGVJbmRleDIgPT09IHN0eWxlUnVsZXMyLmxlbmd0aCAtIDEgJiYgc3VwcG9ydGluZ0hvdmVyID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIk5PIHRpbGRlIHN1cHBvcnRpbmdFbGVtZW50OmhvdmVyXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIioqKiogUFVUIFBPVEVOVElBTCAyIEhFUkVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJUaGVyZSBpcyBhIG1hcmdpbiBpbiB0aGUgc3VwcG9ydGluZyBlbGVtZW50XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwb3RlbnRpYWwzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIqKioqIFBVVCBQT1RFTlRJQUwgMyBIRVJFXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvdGVudGlhbDMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzNcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2lsZW5jZSBjc3MgYWNjZXNzIGlzc3Vlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNpbGVuY2UgY3NzIGFjY2VzcyBpc3N1ZXNcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cIik7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwicGFzczAgPSBcIitwYXNzMCk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwicGFzczEgPSBcIitwYXNzMSk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwicGFzczIgPSBcIitwYXNzMik7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwicG90ZW50aWFsMSA9IFwiK3BvdGVudGlhbDEpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcInBvdGVudGlhbDIgPSBcIitwb3RlbnRpYWwyKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJwb3RlbnRpYWwzID0gXCIrcG90ZW50aWFsMyk7XG4gICAgICAgIGlmIChwYXNzMCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICAvLyBpZiAocGFzczEpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMlwiKTsgLy8gRG9lc24ndCB0cmlnZ2VyXG4gICAgICAgIC8vIGlmIChwYXNzMikgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18zXCIpOyAvLyBEb2Vzbid0IHRyaWdnZXJcbiAgICAgICAgaWYgKHBvdGVudGlhbDEpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgICAgIGlmIChwb3RlbnRpYWwyKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8yXCIpO1xuICAgICAgICBpZiAocG90ZW50aWFsMykgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfM1wiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuLyoqXG4gKiBEZXNjcmlwdGlvbjogVHJpZ2dlciB3aGVuIHZpZXdwb3J0IHVuaXRzIGFyZSB1c2VkIGZvciBmb250IHNpemUuXG4gKiBPcmlnaW46IFZhcmlvdXNcbiAqL1xuZXhwb3J0IGNvbnN0IHN0eWxlX3ZpZXdwb3J0X3Jlc2l6YWJsZTogUnVsZSA9IHtcbiAgICBpZDogXCJzdHlsZV92aWV3cG9ydF9yZXNpemFibGVcIixcbiAgICBjb250ZXh0OiBcImRvbTpsaW5rLCBkb206c3R5bGUsIGRvbToqW3N0eWxlXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIxX1N0eWxlX1ZpZXdwb3J0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBgc3R5bGVfdmlld3BvcnRfcmVzaXphYmxlLmh0bWxgLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogYHN0eWxlX3ZpZXdwb3J0X3Jlc2l6YWJsZS5odG1sYCxcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogYHN0eWxlX3ZpZXdwb3J0X3Jlc2l6YWJsZS5odG1sYFxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUZXh0IG11c3Qgc2NhbGUgdXAgdG8gMjAwJSB3aXRob3V0IGxvc3Mgb2YgY29udGVudCBvciBmdW5jdGlvbmFsaXR5XCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVmVyaWZ5IHRoYXQgdGV4dCBzaXplZCB1c2luZyB2aWV3cG9ydCB1bml0cyBjYW4gYmUgcmVzaXplZCB1cCB0byAyMDAlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIG51bTogW1wiMS40LjRcIiwgXCIxLjQuMTBcIl0sIC8vIG1hdGNoIGhlbHAgZm9yIGJvdGggXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGxldCB0aGVQYXR0ZXJuID0gL1xcZCsodnd8dmh8dm1pbnx2bWF4KS9naTtcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSBcInN0eWxlXCIpIHtcbiAgICAgICAgICAgIGZvciAobGV0IHNJbmRleCA9IDA7IHNJbmRleCA8IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHMubGVuZ3RoOyBzSW5kZXgrKykge1xuICAgICAgICAgICAgICAgIGxldCBzaGVldCA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHNbc0luZGV4XSBhcyBDU1NTdHlsZVNoZWV0XG4gICAgICAgICAgICAgICAgaWYgKHNoZWV0Lm93bmVyTm9kZSA9PT0gcnVsZUNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHlsZVJ1bGVzID0gc2hlZXQuY3NzUnVsZXMgPyBzaGVldC5jc3NSdWxlcyA6IHNoZWV0LnJ1bGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlUnVsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBzdHlsZVJ1bGVJbmRleCA9IDA7IHBhc3NlZCAmJiBzdHlsZVJ1bGVJbmRleCA8IHN0eWxlUnVsZXMubGVuZ3RoOyBzdHlsZVJ1bGVJbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBydWxlID0gc3R5bGVSdWxlc1tzdHlsZVJ1bGVJbmRleF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlLnR5cGUgJiYgcnVsZS50eXBlID09PSAxIC8qIENTU1J1bGUuU1RZTEVfUlVMRSAqLykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0eWxlUnVsZSA9IHJ1bGUgYXMgQ1NTU3R5bGVSdWxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlUnVsZS5zdHlsZVsnZm9udFNpemUnXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmb250U2l6ZSA9IHN0eWxlUnVsZS5zdHlsZVsnZm9udFNpemUnXS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZvdW5kID0gZm9udFNpemUubWF0Y2godGhlUGF0dGVybik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvbnRTaXplLmxlbmd0aCAmJiBmb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgaW1wb3J0IHJ1bGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJ1bGUudHlwZSAmJiBydWxlLnR5cGUgPT09IDMgLyogQ1NTUnVsZS5JTVBPUlRfUlVMRSAqLyAmJiAocnVsZSBhcyBDU1NJbXBvcnRSdWxlKS5zdHlsZVNoZWV0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW1wb3J0UnVsZSA9IHJ1bGUgYXMgQ1NTSW1wb3J0UnVsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBydWxlcyA9IGltcG9ydFJ1bGUuc3R5bGVTaGVldC5jc3NSdWxlcyA/IGltcG9ydFJ1bGUuc3R5bGVTaGVldC5jc3NSdWxlcyA6IGltcG9ydFJ1bGUuc3R5bGVTaGVldC5ydWxlcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHJJbmRleCA9IDA7IHBhc3NlZCAmJiBySW5kZXggPCBydWxlcy5sZW5ndGg7IHJJbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbXBvcnRlZFJ1bGUgPSBydWxlc1tySW5kZXhdIGFzIGFueVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW1wb3J0ZWRSdWxlLnR5cGUgJiYgaW1wb3J0ZWRSdWxlLnR5cGUgPT09IDEgLyogQ1NTUnVsZS5TVFlMRV9SVUxFICovKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW1wb3J0ZWRSdWxlLnN0eWxlWydmb250U2l6ZSddKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZvbnRTaXplID0gaW1wb3J0ZWRSdWxlLnN0eWxlWydmb250U2l6ZSddLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZm91bmQgPSBmb250U2l6ZS5tYXRjaCh0aGVQYXR0ZXJuKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm9udFNpemUubGVuZ3RoICYmIGZvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlIGNzcyBhY2Nlc3MgaXNzdWVzXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAobm9kZU5hbWUgPT09IFwibGlua1wiKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBzSW5kZXggPSAwOyBzSW5kZXggPCBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LnN0eWxlU2hlZXRzLmxlbmd0aDsgc0luZGV4KyspIHtcbiAgICAgICAgICAgICAgICBsZXQgc2hlZXQgPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LnN0eWxlU2hlZXRzW3NJbmRleF0gYXMgQ1NTU3R5bGVTaGVldDtcbiAgICAgICAgICAgICAgICBpZiAoc2hlZXQgJiYgc2hlZXQub3duZXJOb2RlID09PSBydWxlQ29udGV4dCkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGVzID0gc2hlZXQuY3NzUnVsZXMgPyBzaGVldC5jc3NSdWxlcyA6IHNoZWV0LnJ1bGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgckluZGV4ID0gMDsgcGFzc2VkICYmIHJJbmRleCA8IHJ1bGVzLmxlbmd0aDsgckluZGV4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGVGcm9tTGluayA9IHJ1bGVzW3JJbmRleF0gYXMgYW55O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBydWxlcyBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGVGcm9tTGluay50eXBlICYmIHJ1bGVGcm9tTGluay50eXBlID09PSAxIC8qIENTU1J1bGUuU1RZTEVfUlVMRSAqLykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGVGcm9tTGluay5zdHlsZVsnZm9udFNpemUnXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmb250U2l6ZSA9IHJ1bGVGcm9tTGluay5zdHlsZVsnZm9udFNpemUnXS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZvdW5kID0gZm9udFNpemUubWF0Y2godGhlUGF0dGVybik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvbnRTaXplLmxlbmd0aCAmJiBmb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBjc3MgYWNjZXNzIGlzc3Vlc1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IHN0eWxlVmFsdWUgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoJ3N0eWxlJyk7XG4gICAgICAgICAgICBpZiAoc3R5bGVWYWx1ZSkge1xuICAgICAgICAgICAgICAgIGxldCBzdHlsZVBhdHRlcm4gPSAvZm9udC1zaXplOlxccypcXGQrKHZ3fHZofHZtaW58dm1heCkvZ2k7XG4gICAgICAgICAgICAgICAgbGV0IGZvdW5kID0gc3R5bGVWYWx1ZS5tYXRjaChzdHlsZVBhdHRlcm4pO1xuICAgICAgICAgICAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcGFzc2VkID8gUnVsZVBhc3MoXCJQYXNzXzBcIikgOiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBY2NOYW1lVXRpbCB9IGZyb20gXCIuLi91dGlsL0FjY05hbWVVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3Qgc3ZnX2dyYXBoaWNzX2xhYmVsbGVkOiBSdWxlID0ge1xuICAgIGlkOiBcInN2Z19ncmFwaGljc19sYWJlbGxlZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOnN2Z1wiLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwic3ZnX2dyYXBoaWNzX2xhYmVsbGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwicGFzc1wiOiBcInN2Z19ncmFwaGljc19sYWJlbGxlZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfYWNjX25hbWVcIjogXCJzdmdfZ3JhcGhpY3NfbGFiZWxsZWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIkEgbm9uLWRlY29yYXRpdmUgU1ZHIGVsZW1lbnQgbXVzdCBoYXZlIGFuIGFjY2Vzc2libGUgbmFtZVwiLFxuICAgICAgICAgICAgXCJwYXNzXCI6IFwiVGhlIFNWRyBlbGVtZW50IGhhcyBhbiBhY2Nlc3NpYmxlIG5hbWVcIixcbiAgICAgICAgICAgIFwiZmFpbF9hY2NfbmFtZVwiOiBcIlRoZSBTVkcgZWxlbWVudCBoYXMgbm8gYWNjZXNzaWJsZSBuYW1lXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCJdLCBcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbe1xuICAgICAgICBcIjdkNjczNFwiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcImZhaWxfYWNjX25hbWVcIjogXCJmYWlsXCJcbiAgICAgICAgfVxuICAgIH1dLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG5cbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkgfHwgVmlzVXRpbC5pc05vZGVQcmVzZW50YXRpb25hbChydWxlQ29udGV4dCkgfHwgQWNjTmFtZVV0aWwuaXNBY2Nlc3NpYmxlTmFtZUlnbm9yYWJsZShydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IG5hbWVfcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZShydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChuYW1lX3BhaXIgJiYgbmFtZV9wYWlyLm5hbWUgJiYgbmFtZV9wYWlyLm5hbWUudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2FjY19uYW1lXCIpXG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlQ29udGV4dEhpZXJhcmNoeSwgUnVsZUZhaWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5cbmV4cG9ydCBjb25zdCB0YWJsZV9hcmlhX2Rlc2NlbmRhbnRzOiBSdWxlID0ge1xuICAgIGlkOiBcInRhYmxlX2FyaWFfZGVzY2VuZGFudHNcIixcbiAgICBjb250ZXh0OiBcImFyaWE6dGFibGUgZG9tOnRyW3JvbGVdLCBhcmlhOnRhYmxlIGRvbTp0aFtyb2xlXSwgYXJpYTp0YWJsZSBkb206dGRbcm9sZV0sIGFyaWE6Z3JpZCBkb206dHJbcm9sZV0sIGFyaWE6Z3JpZCBkb206dGhbcm9sZV0sIGFyaWE6Z3JpZCBkb206dGRbcm9sZV0sIGFyaWE6dHJlZWdyaWQgZG9tOnRyW3JvbGVdLCBhcmlhOnRyZWVncmlkIGRvbTp0aFtyb2xlXSwgYXJpYTp0cmVlZ3JpZCBkb206dGRbcm9sZV1cIixcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcInRhYmxlX2FyaWFfZGVzY2VuZGFudHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJleHBsaWNpdF9yb2xlXCI6IFwidGFibGVfYXJpYV9kZXNjZW5kYW50cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGFibGUgc3RydWN0dXJlIGVsZW1lbnRzIGNhbm5vdCBzcGVjaWZ5IGFuIGV4cGxpY2l0ICdyb2xlJyB3aXRoaW4gdGFibGUgY29udGFpbmVyc1wiLFxuICAgICAgICAgICAgXCJleHBsaWNpdF9yb2xlXCI6IFwiQW4gZXhwbGljaXQgQVJJQSAncm9sZScgaXMgbm90IHZhbGlkIGZvciA8ezB9PiBlbGVtZW50IHdpdGhpbiBhbiBBUklBIHJvbGUgJ3sxfScgcGVyIHRoZSBBUklBIGluIEhUTUwgc3BlY2lmaWNhdGlvblwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDsgXG4gICAgICAgIGxldCBwYXJlbnRSb2xlID0gQ29tbW9uVXRpbC5pc1RhYmxlRGVzY2VuZGFudChjb250ZXh0SGllcmFyY2hpZXMpO1xuICAgICAgICAvLyBjYWNoZSB0aGUgcmVzdWx0XG4gICAgICAgIGlmIChwYXJlbnRSb2xlID09PSBudWxsIHx8IHBhcmVudFJvbGUubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIC8vIGlnbm9yZSB0aGUgcmVkdW5kYW5jeSBjYXNlczogcmVwb3J0ZWQgaW4gdGhlIGFyaWFfcm9sZV9yZWR1bmRhbnQgcnVsZVxuICAgICAgICBjb25zdCBpbXBsaWNpdFJvbGVzID0gQXJpYVV0aWwuZ2V0SW1wbGljaXRSb2xlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgY29uc3QgZXhwbGljaXRSb2xlcyA9IEFyaWFVdGlsLmdldFJvbGVzKHJ1bGVDb250ZXh0LCBmYWxzZSk7O1xuICAgICAgICBpZiAoaW1wbGljaXRSb2xlcyAmJiBpbXBsaWNpdFJvbGVzLmxlbmd0aCA+IDAgJiYgZXhwbGljaXRSb2xlcyAmJiBleHBsaWNpdFJvbGVzLmxlbmd0aCA+IDAgXG4gICAgICAgICAgICAmJiBleHBsaWNpdFJvbGVzLnNvbWUoaXRlbSA9PiBpbXBsaWNpdFJvbGVzLmluY2x1ZGVzKGl0ZW0pKSlcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJleHBsaWNpdF9yb2xlXCIsIFtjb250ZXh0W1wiZG9tXCJdLm5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSwgcGFyZW50Um9sZVswXS5yb2xlXSk7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IHRhYmxlX2NhcHRpb25fZW1wdHk6IFJ1bGUgPSB7XG4gICAgaWQ6IFwidGFibGVfY2FwdGlvbl9lbXB0eVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmNhcHRpb25cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlZhbGVyaWVfQ2FwdGlvbl9IYXNDb250ZW50XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwidGFibGVfY2FwdGlvbl9lbXB0eS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcInRhYmxlX2NhcHRpb25fZW1wdHkuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInRhYmxlX2NhcHRpb25fZW1wdHkuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUaGUgPHRhYmxlPiBlbGVtZW50IGhhcyBhbiBlbXB0eSA8Y2FwdGlvbj4gZWxlbWVudFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkEgPGNhcHRpb24+IGVsZW1lbnQgZm9yIGEgPHRhYmxlPiBlbGVtZW50IG11c3QgY29udGFpbiBkZXNjcmlwdGl2ZSB0ZXh0XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcGFzc2VkID0gQ29tbW9uVXRpbC5oYXNJbm5lckNvbnRlbnRIaWRkZW4ocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IHRhYmxlX2NhcHRpb25fbmVzdGVkOiBSdWxlID0ge1xuICAgIGlkOiBcInRhYmxlX2NhcHRpb25fbmVzdGVkXCIsXG4gICAgY29udGV4dDogXCJkb206Y2FwdGlvblwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiVmFsZXJpZV9DYXB0aW9uX0luVGFibGVcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJ0YWJsZV9jYXB0aW9uX25lc3RlZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcInRhYmxlX2NhcHRpb25fbmVzdGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJ0YWJsZV9jYXB0aW9uX25lc3RlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIjxjYXB0aW9uPiBlbGVtZW50IGlzIG5vdCBuZXN0ZWQgaW5zaWRlIGEgPHRhYmxlPiBlbGVtZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGhlIDxjYXB0aW9uPiBlbGVtZW50IG11c3QgYmUgbmVzdGVkIGluc2lkZSB0aGUgYXNzb2NpYXRlZCA8dGFibGU+IGVsZW1lbnRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFwidGFibGVcIikgIT0gbnVsbDtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFRhYmxlVXRpbCB9IGZyb20gXCIuLi91dGlsL1RhYmxlVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgdGFibGVfaGVhZGVyc19leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwidGFibGVfaGVhZGVyc19leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTp0YWJsZVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX1RhYmxlX0RhdGFIZWFkaW5nc0FyaWFcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJ0YWJsZV9oZWFkZXJzX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcInRhYmxlX2hlYWRlcnNfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJ0YWJsZV9oZWFkZXJzX2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlRhYmxlIGhhcyBubyBoZWFkZXJzIGlkZW50aWZpZWRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJEYXRhIHRhYmxlIG11c3QgaWRlbnRpZnkgaGVhZGVyc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgSFRNTFRhYmxlRWxlbWVudDtcbiAgICAgICAgLy8gSWYgdGhpcyBpcyBhIGxheW91dCB0YWJsZSBvciB0aGVyZSBhcmUgbm8gcm93cywgdGhlIHJ1bGUgZG9lcyBub3QgYXBwbHkuXG4gICAgICAgIGxldCByb3dzID0gcnVsZUNvbnRleHQucm93cztcbiAgICAgICAgaWYgKCFUYWJsZVV0aWwuaXNEYXRhVGFibGUocnVsZUNvbnRleHQpIHx8IHJvd3MgPT09IG51bGwgfHwgcm93cy5sZW5ndGggPT09IDApXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgcGFzc2VkID0gVGFibGVVdGlsLnRhYmxlSGVhZGVyRXhpc3RzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKHBhc3NlZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIFxuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IERPTVV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5pbXBvcnQgeyBBUklBTWFwcGVyIH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQU1hcHBlclwiO1xuXG5leHBvcnQgY29uc3QgdGFibGVfaGVhZGVyc19yZWZfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwidGFibGVfaGVhZGVyc19yZWZfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbTp0ZFtoZWFkZXJzXSwgZG9tOnRoW2hlYWRlcnNdXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwidGFibGVfaGVhZGVyc19yZWZfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJ0YWJsZV9oZWFkZXJzX3JlZl92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcInRhYmxlX2hlYWRlcnNfcmVmX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwidGFibGVfaGVhZGVyc19yZWZfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzRcIjogXCJ0YWJsZV9oZWFkZXJzX3JlZl92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwidGFibGVfaGVhZGVyc19yZWZfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUaGUgJ2hlYWRlcnMnIGF0dHJpYnV0ZSB2YWx1ZSBcXFwiezB9XFxcIiBkb2VzIG5vdCByZWZlcmVuY2UgYSB2YWxpZCAnaWQnIGluIHRoaXMgZG9jdW1lbnRcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiVGhlICdoZWFkZXJzJyBhdHRyaWJ1dGUgdmFsdWUgXFxcInswfVxcXCIgcmVmZXJzIHRvIGl0c2VsZlwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJUaGUgJ2hlYWRlcnMnIGF0dHJpYnV0ZSB2YWx1ZSBcXFwiezB9XFxcIiBkb2VzIG5vdCByZWZlciB0byBhIGNlbGwgaW4gdGhlIHNhbWUgdGFibGVcIixcbiAgICAgICAgICAgIFwiRmFpbF80XCI6IFwiVGhlICdoZWFkZXJzJyBhdHRyaWJ1dGUgdmFsdWUgXFxcInswfVxcXCIgZG9lcyBub3QgcmVmZXIgdG8gYSBjZWxsIGluZGljYXRlZCB3aXRoIDx0aD4gb3IgYSByb2xlIG9mIFxcXCJjb2x1bW5oZWFkZXJcXFwiIG9yIFxcXCJyb3doZWFkZXJcXFwiXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGhlICdoZWFkZXJzJyBhdHRyaWJ1dGUgc2hvdWxkIHJlZmVyIHRvIGEgdmFsaWQgY2VsbCBpbiB0aGUgc2FtZSB0YWJsZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogW1wiYTI1ZjQ1XCJdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXJlbnRUYWJsZSA9IENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFwidGFibGVcIik7XG4gICAgICAgIGxldCBwYXJlbnRSb2xlID0gQVJJQU1hcHBlci5ub2RlVG9Sb2xlKHBhcmVudFRhYmxlKTtcbiAgICAgICAgLy8gSWYgdGhpcyBpcyBhIGxheW91dCB0YWJsZSBvciBhIHNpbXBsZSB0YWJsZSB0aGUgcnVsZSBkb2VzIG5vdCBhcHBseS5cbiAgICAgICAgaWYgKHBhcmVudFRhYmxlID09IG51bGwgfHwgIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShwYXJlbnRUYWJsZSkgfHwgIVtcInRhYmxlXCIsIFwiZ3JpZFwiXS5pbmNsdWRlcyhwYXJlbnRSb2xlKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGxldCBkb2MgPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50O1xuICAgICAgICBsZXQgdmFsdWUgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJoZWFkZXJzXCIpO1xuICAgICAgICBpZiAoIXZhbHVlKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IGlkcyA9IHZhbHVlLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgbGV0IGludmFsaWRIZWFkZXJWYWx1ZXMgPSBbXTtcbiAgICAgICAgbGV0IHNhbWVOb2RlSGVhZGVyVmFsdWVzID0gW107XG4gICAgICAgIGxldCBzYW1lVGFibGVIZWFkZXJWYWx1ZXMgPSBbXTtcbiAgICAgICAgbGV0IGludmFsaWRFbGVtSGVhZGVyVmFsdWVzID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgaWQgPSBpZHNbaV07XG4gICAgICAgICAgICBpZiAoaWQudHJpbSgpID09PSAnJykgY29udGludWU7XG4gICAgICAgICAgICBjb25zdCBlbGVtID0gZG9jLmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgICAgICAgICAgIGlmICghZWxlbSlcbiAgICAgICAgICAgICAgICBpbnZhbGlkSGVhZGVyVmFsdWVzLnB1c2goaWQpO1xuICAgICAgICAgICAgZWxzZSBpZiAoRE9NVXRpbC5zYW1lTm9kZShlbGVtLCBydWxlQ29udGV4dCkpXG4gICAgICAgICAgICAgICAgc2FtZU5vZGVIZWFkZXJWYWx1ZXMucHVzaChpZCk7XG4gICAgICAgICAgICBlbHNlIGlmICghRE9NVXRpbC5pc0luU2FtZVRhYmxlKGVsZW0sIHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgICAgICBzYW1lVGFibGVIZWFkZXJWYWx1ZXMucHVzaChpZCk7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgZWxlbU5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW1OYW1lICE9PSAndGgnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXMoZWxlbSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghcm9sZXMuaW5jbHVkZXMoJ2NvbHVtbmhlYWRlcicpICYmICFyb2xlcy5pbmNsdWRlcygncm93aGVhZGVyJykpXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkRWxlbUhlYWRlclZhbHVlcy5wdXNoKGlkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmVzdWx0cyA9IFtdO1xuICAgICAgICBpZiAoaW52YWxpZEhlYWRlclZhbHVlcy5sZW5ndGggIT0gMClcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaChSdWxlRmFpbChcIkZhaWxfMVwiLCBbaW52YWxpZEhlYWRlclZhbHVlcy50b1N0cmluZygpXSkpO1xuICAgICAgICBpZiAoc2FtZU5vZGVIZWFkZXJWYWx1ZXMubGVuZ3RoICE9IDApXG4gICAgICAgICAgICByZXN1bHRzLnB1c2goUnVsZUZhaWwoXCJGYWlsXzJcIiwgW3NhbWVOb2RlSGVhZGVyVmFsdWVzLnRvU3RyaW5nKCldKSk7XG4gICAgICAgIGlmIChzYW1lVGFibGVIZWFkZXJWYWx1ZXMubGVuZ3RoICE9IDApXG4gICAgICAgICAgICByZXN1bHRzLnB1c2goUnVsZUZhaWwoXCJGYWlsXzNcIiwgW3NhbWVUYWJsZUhlYWRlclZhbHVlcy50b1N0cmluZygpXSkpO1xuICAgICAgICBpZiAoaW52YWxpZEVsZW1IZWFkZXJWYWx1ZXMubGVuZ3RoICE9IDApXG4gICAgICAgICAgICByZXN1bHRzLnB1c2goUnVsZUZhaWwoXCJGYWlsXzRcIiwgW2ludmFsaWRFbGVtSGVhZGVyVmFsdWVzLnRvU3RyaW5nKCldKSk7XG5cbiAgICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHRzO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgVGFibGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVGFibGVVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCB0YWJsZV9oZWFkZXJzX3JlbGF0ZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwidGFibGVfaGVhZGVyc19yZWxhdGVkXCIsXG4gICAgY29udGV4dDogXCJkb206dGQsIGRvbTp0aFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiVmFsZXJpZV9UYWJsZV9EYXRhQ2VsbFJlbGF0aW9uc2hpcHNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJ0YWJsZV9oZWFkZXJzX3JlbGF0ZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJ0YWJsZV9oZWFkZXJzX3JlbGF0ZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInRhYmxlX2hlYWRlcnNfcmVsYXRlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkNvbXBsZXggdGFibGUgZG9lcyBub3QgaGF2ZSBoZWFkZXJzIGZvciBlYWNoIGNlbGwgcHJvcGVybHkgZGVmaW5lZCB3aXRoICdoZWFkZXInIG9yICdzY29wZSdcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJGb3IgYSBjb21wbGV4IGRhdGEgdGFibGUsIGFsbCA8dGg+IGFuZCA8dGQ+IGVsZW1lbnRzIG11c3QgYmUgcmVsYXRlZCB2aWEgJ2hlYWRlcicgb3IgJ3Njb3BlJyBhdHRyaWJ1dGVzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcGFyZW50VGFibGUgPSBDb21tb25VdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBcInRhYmxlXCIpO1xuICAgICAgICAvLyBJZiB0aGlzIGlzIGEgbGF5b3V0IHRhYmxlIG9yIGEgc2ltcGxlIHRhYmxlIHRoZSBydWxlIGRvZXMgbm90IGFwcGx5LlxuICAgICAgICBpZiAocGFyZW50VGFibGUgPT0gbnVsbCB8fCAhVGFibGVVdGlsLmlzQ29tcGxleERhdGFUYWJsZShwYXJlbnRUYWJsZSkpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICAvLyBJZiB0aGlzIHRhYmxlIGhhc24ndCBiZWVuIHByZXByb2Nlc3NlZCwgcHJvY2VzcyBpdC5cbiAgICAgICAgaWYgKENhY2hlVXRpbC5nZXRDYWNoZShydWxlQ29udGV4dCwgXCJ0YWJsZV9oZWFkZXJzX3JlbGF0ZWRcIiwgbnVsbCkgPT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIEJ1aWxkIGEgZ3JpZCB0aGF0J3MgYWN0dWFsbHkgdXNhYmxlIChyb3dzcGFuIGFuZCBjb2xzcGFuIGVsZW1lbnRzIGFyZSBkdXBsaWNhdGVkKVxuICAgICAgICAgICAgLy8gVGhpcyBidWlsZHMgYSByZWFsIDJkIHRhYmxlIGFycmF5LlxuICAgICAgICAgICAgbGV0IGdyaWQgPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFyZW50VGFibGUucm93cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIGxldCByb3cgPSBwYXJlbnRUYWJsZS5yb3dzW2ldO1xuICAgICAgICAgICAgICAgIGlmICghZ3JpZFtpXSkgZ3JpZFtpXSA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcm93LmNlbGxzLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjZWxsID0gcm93LmNlbGxzW2pdO1xuICAgICAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoY2VsbCwgXCJ0YWJsZV9oZWFkZXJzX3JlbGF0ZWRcIiwgaSArIFwiOlwiICsgaik7XG4gICAgICAgICAgICAgICAgICAgIGxldCB3aWR0aCA9IHBhcnNlSW50KGNlbGwuZ2V0QXR0cmlidXRlKFwiY29sc3BhblwiKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghd2lkdGgpIHdpZHRoID0gMTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGhlaWdodCA9IHBhcnNlSW50KGNlbGwuZ2V0QXR0cmlidXRlKFwicm93c3BhblwiKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaGVpZ2h0KSBoZWlnaHQgPSAxO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZ1ggPSAwO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoZ3JpZFtpXVtnWF0pIGdYICs9IDE7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgaGVpZ2h0OyArK2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZ3JpZFtpICsga10pIGdyaWRbaSArIGtdID0gW11cbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGwgPSAwOyBsIDwgd2lkdGg7ICsrbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyaWRbaSArIGtdW2dYICsgbF0gPSBjZWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJdGVyYXRlIHRocm91Z2ggdGhlIHRhYmxlIGdyaWQgYW5kIHJlY29yZCBoZWFkZXJzIHRoYXQgcG9pbnQgdG8gY2VsbHMgYW5kXG4gICAgICAgICAgICAvLyBjZWxscyB0aGF0IGFyZSBwb2ludGVkIHRvIGJ5IGhlYWRlcnNcbiAgICAgICAgICAgIGxldCBkb2MgPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50O1xuICAgICAgICAgICAgbGV0IGxvb2t1cCA9IHt9XG4gICAgICAgICAgICBsZXQgc2NvcGVkQ29scyA9IHt9O1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBncmlkLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJvd1Njb3BlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgZ3JpZFtpXS5sZW5ndGg7ICsraikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZ3JpZENlbGwgPSBncmlkW2ldW2pdO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZ3JpZE5vZGVOYW1lID0gZ3JpZENlbGwubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGdyaWROb2RlTmFtZSA9PSBcInRoXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChncmlkQ2VsbC5nZXRBdHRyaWJ1dGUoXCJzY29wZVwiKSA9PSBcInJvd1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93U2NvcGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSdzIGFuIGF4aXMgYXR0cmlidXRlLCBpdCBtdXN0IGJlIHJlZmVycmVkIHRvIGJ5IGhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2NvcGUgaXMgbm90IGVub3VnaC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUNvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkoZ3JpZENlbGwsIFwiYXhpc1wiKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9va3VwW0NhY2hlVXRpbC5nZXRDYWNoZShncmlkQ2VsbCwgXCJ0YWJsZV9oZWFkZXJzX3JlbGF0ZWRcIiwgbnVsbCldID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZ3JpZENlbGwuZ2V0QXR0cmlidXRlKFwic2NvcGVcIikgPT0gXCJjb2xcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlZENvbHNbal0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlJ3MgYW4gYXhpcyBhdHRyaWJ1dGUsIGl0IG11c3QgYmUgcmVmZXJyZWQgdG8gYnkgaGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzY29wZSBpcyBub3QgZW5vdWdoLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShncmlkQ2VsbCwgXCJheGlzXCIpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rdXBbQ2FjaGVVdGlsLmdldENhY2hlKGdyaWRDZWxsLCBcInRhYmxlX2hlYWRlcnNfcmVsYXRlZFwiLCBudWxsKV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSGVhZGVycyBjYW4gcmVmZXIgdG8gb3RoZXIgaGVhZGVyc1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkoZ3JpZENlbGwsIFwiaGVhZGVyc1wiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoZHJzID0gZ3JpZENlbGwuZ2V0QXR0cmlidXRlKFwiaGVhZGVyc1wiKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBoZHJzLmxlbmd0aDsgKytrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoZWFkRWxlbSA9IGRvYy5nZXRFbGVtZW50QnlJZChoZHJzW2tdLnRyaW0oKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoZWFkRWxlbSAmJiBDb21tb25VdGlsLmdldEFuY2VzdG9yKGhlYWRFbGVtLCBcInRhYmxlXCIpID09IHBhcmVudFRhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rdXBbQ2FjaGVVdGlsLmdldENhY2hlKGhlYWRFbGVtLCBcInRhYmxlX2hlYWRlcnNfcmVsYXRlZFwiLCBudWxsKV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGdyaWROb2RlTmFtZSA9PSBcInRkXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3dTY29wZWQgfHwgc2NvcGVkQ29sc1tqXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb2t1cFtDYWNoZVV0aWwuZ2V0Q2FjaGUoZ3JpZENlbGwsIFwidGFibGVfaGVhZGVyc19yZWxhdGVkXCIsIG51bGwpXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkoZ3JpZENlbGwsIFwiaGVhZGVyc1wiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoZHJzID0gZ3JpZENlbGwuZ2V0QXR0cmlidXRlKFwiaGVhZGVyc1wiKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBoZHJzLmxlbmd0aDsgKytrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoZWFkRWxlbSA9IGRvYy5nZXRFbGVtZW50QnlJZChoZHJzW2tdLnRyaW0oKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoZWFkRWxlbSAmJiBDb21tb25VdGlsLmdldEFuY2VzdG9yKGhlYWRFbGVtLCBcInRhYmxlXCIpID09IHBhcmVudFRhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rdXBbQ2FjaGVVdGlsLmdldENhY2hlKGdyaWRDZWxsLCBcInRhYmxlX2hlYWRlcnNfcmVsYXRlZFwiLCBudWxsKV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9va3VwW0NhY2hlVXRpbC5nZXRDYWNoZShoZWFkRWxlbSwgXCJ0YWJsZV9oZWFkZXJzX3JlbGF0ZWRcIiwgbnVsbCldID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShwYXJlbnRUYWJsZSwgXCJ0YWJsZV9oZWFkZXJzX3JlbGF0ZWRcIiwgbG9va3VwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByY0luZm8gPSBDYWNoZVV0aWwuZ2V0Q2FjaGUocnVsZUNvbnRleHQsIFwidGFibGVfaGVhZGVyc19yZWxhdGVkXCIsIG51bGwpO1xuICAgICAgICBsZXQgdEluZm8gPSBDYWNoZVV0aWwuZ2V0Q2FjaGUocGFyZW50VGFibGUsIFwidGFibGVfaGVhZGVyc19yZWxhdGVkXCIsIG51bGwpO1xuICAgICAgICBsZXQgcGFzc2VkID0gcmNJbmZvICYmIHRJbmZvICYmIHJjSW5mbyBpbiB0SW5mbztcblxuICAgICAgICBpZiAoIXBhc3NlZCAmJiByY0luZm8gPT09IFwiMDowXCIgJiZcbiAgICAgICAgICAgIENvbW1vblV0aWwuZ2V0SW5uZXJUZXh0KHJ1bGVDb250ZXh0KS50cmltKCkubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIC8vIFdlIGRvbid0IHRlc3QgaWYgaXQncyB0aGUgdXBwZXItbGVmdCBjZWxsIGFuZCBpdCdzIGVtcHR5XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRoZSB0YWJsZSBoYXMgbm8gdGgncywgaXQgbWF5IGp1c3QgYmUgdGhhdCB0aGlzIHdhcyBzdXBwb3NlZCB0byBiZSBhIGxheW91dFxuICAgICAgICAvLyB0YWJsZSwgd2hpY2ggaW50cm9kdWNlcyBhIGxvdCBvZiBub2lzZS4gIEluIHRoYXQgY2FzZSwgb25seSB0cmlnZ2VyIHRoaXMgZXJyb3JcbiAgICAgICAgLy8gb25jZSBwZXIgdGFibGUuXG4gICAgICAgIGlmICghcGFzc2VkICYmIHBhcmVudFRhYmxlLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwidGhcIikubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIGlmIChDYWNoZVV0aWwuZ2V0Q2FjaGUocGFyZW50VGFibGUsIFwidGFibGVfaGVhZGVyc19yZWxhdGVkX1RyaWdPbmNlXCIsIGZhbHNlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShwYXJlbnRUYWJsZSwgXCJ0YWJsZV9oZWFkZXJzX3JlbGF0ZWRfVHJpZ09uY2VcIiwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgVGFibGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVGFibGVVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCB0YWJsZV9sYXlvdXRfbGluZWFyaXplZDogUnVsZSA9IHtcbiAgICBpZDogXCJ0YWJsZV9sYXlvdXRfbGluZWFyaXplZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOnRhYmxlXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfVGFibGVfTGF5b3V0VHJpZ2dlclwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJ0YWJsZV9sYXlvdXRfbGluZWFyaXplZC5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwidGFibGVfbGF5b3V0X2xpbmVhcml6ZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInRhYmxlX2xheW91dF9saW5lYXJpemVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgdGFibGUgaXMgbm90IGJlaW5nIHVzZWQgdG8gZm9ybWF0IHRleHQgY29udGVudCBpbiBjb2x1bW5zIHVubGVzcyB0aGUgdGFibGUgY2FuIGJlIGxpbmVhcml6ZWRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBdm9pZCB1c2luZyB0YWJsZXMgdG8gZm9ybWF0IHRleHQgZG9jdW1lbnRzIGluIGNvbHVtbnMgdW5sZXNzIHRoZSB0YWJsZSBjYW4gYmUgbGluZWFyaXplZFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfRk9VUlxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgcGFzc2VkID0gIVRhYmxlVXRpbC5pc0xheW91dFRhYmxlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGNvbnN0IHRhYmxlX3Njb3BlX3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcInRhYmxlX3Njb3BlX3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJkb206dGRbc2NvcGVdLCBkb206dGhbc2NvcGVdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfVGFibGVfU2NvcGVfVmFsaWRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkZhaWxfMlwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwidGFibGVfc2NvcGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJ0YWJsZV9zY29wZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcInRhYmxlX3Njb3BlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJ0YWJsZV9zY29wZV92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlZhbHVlIHByb3ZpZGVkIGlzIGludmFsaWQgZm9yIHRoZSAnc2NvcGUnIGF0dHJpYnV0ZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJUaGUgJ3Njb3BlJyBhdHRyaWJ1dGUgc2hvdWxkIG9ubHkgYmUgdXNlZCBvbiBhIDx0aD4gZWxlbWVudFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlZhbHVlIGZvciAnc2NvcGUnIGF0dHJpYnV0ZSBtdXN0IGJlIFxcXCJyb3dcXFwiLCBcXFwiY29sXFxcIiwgXFxcInJvd2dyb3VwXFxcIiwgb3IgXFxcImNvbGdyb3VwXFxcIlwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgY29uc3Qgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAobm9kZU5hbWUgPT09ICd0ZCcpXG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzJcIik7XG5cbiAgICAgICAgLy9vbmx5IGNvbnRpbnVlIGZvciAndGgnXG4gICAgICAgIGxldCBzY29wZVZhbCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInNjb3BlXCIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBsZXQgcGFzc2VkID0gL14ocm93fGNvbHxyb3dncm91cHxjb2xncm91cCkkLy50ZXN0KHNjb3BlVmFsKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgVGFibGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVGFibGVVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCB0YWJsZV9zdHJ1Y3R1cmVfbWlzdXNlOiBSdWxlID0ge1xuICAgIGlkOiBcInRhYmxlX3N0cnVjdHVyZV9taXN1c2VcIixcbiAgICBjb250ZXh0OiBcImRvbTp0YWJsZVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX1RhYmxlX1N0cnVjdHVyZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInRhYmxlX3N0cnVjdHVyZV9taXN1c2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJ0YWJsZV9zdHJ1Y3R1cmVfbWlzdXNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJ0YWJsZV9zdHJ1Y3R1cmVfbWlzdXNlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiVGhlIDx7MH0+IGVsZW1lbnQgd2l0aCBcXFwicHJlc2VudGF0aW9uXFxcIiByb2xlIG9yIFxcXCJub25lXFxcIiByb2xlIGhhcyBzdHJ1Y3R1cmFsIGVsZW1lbnQocykgYW5kL29yIGF0dHJpYnV0ZShzKSAnezF9J1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRhYmxlIGVsZW1lbnRzIHdpdGggJ3JvbGU9XFxcInByZXNlbnRhdGlvblxcXCIgb3IgJ3JvbGU9XFxcIm5vbmVcXFwiIHNob3VsZCBub3QgaGF2ZSBzdHJ1Y3R1cmFsIGVsZW1lbnRzIG9yIGF0dHJpYnV0ZXNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgLy8gSkNIIC0gT1VUIE9GIFNDT1BFIGhpZGRlbiBpbiBjb250ZXh0XG4gICAgICAgIGlmIChUYWJsZVV0aWwuaXNEYXRhVGFibGUocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKEFyaWFVdGlsLmlzTm9kZUluR3JpZChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCBlcnJvck5vZGVzID0gW107XG4gICAgICAgIGlmIChDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInN1bW1hcnlcIikpXG4gICAgICAgICAgICBlcnJvck5vZGVzLnB1c2gocnVsZUNvbnRleHQpO1xuXG4gICAgICAgIGxldCBjYXB0aW9uRWxlbXMgPSBydWxlQ29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZShcImNhcHRpb25cIik7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2FwdGlvbkVsZW1zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBpZiAoQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihjYXB0aW9uRWxlbXNbaV0sIFwidGFibGVcIikgPT0gcnVsZUNvbnRleHQpIHtcblxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBub2RlIHNob3VsZCBiZSBza2lwcGVkIG9yIG5vdCBiYXNlZCBvbiB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyBhbmQgaWYgdGhlIG5vZGUgaXNWaXNpYmxlIG9yXG4gICAgICAgICAgICAgICAgLy8gbm90LlxuICAgICAgICAgICAgICAgIGlmIChDb21tb25VdGlsLnNob3VsZE5vZGVCZVNraXBwZWRIaWRkZW4oY2FwdGlvbkVsZW1zW2ldKSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIG5vZGUgdG8gdGhlIGVycm9yTm9kZXNcbiAgICAgICAgICAgICAgICBlcnJvck5vZGVzLnB1c2goY2FwdGlvbkVsZW1zW2ldKTtcblxuICAgICAgICAgICAgICAgIC8vIFNpbmNlIHdlIGFyZSBub3QgYWN0dWFsbHkgbWFraW5nIHVzZSBvZiB0aGVzZXMgZXJyb3JOb2RlcyBldmVuIHRob3VnaCB0aGV5IGFyZSBwYXNzZWQgYWxvbmcgd2l0aFxuICAgICAgICAgICAgICAgIC8vIFZhbGlkYXRpb25SZXN1bHQsIHdlIGRvIG5vdCBuZWVkIHRvIGtlZXAgbG9vcGluZyBvdmVyIGFuZCBnZXR0aW5nIGV2ZXJ5IHNpbmdsZSB2aW9sYXRpbmcgbm9kZSB1bmRlclxuICAgICAgICAgICAgICAgIC8vIHRoZSBydWxlIGNvbnRleHQuIFRoaXMgY2FuIGJlIGEgZnV0dXJlIGVuaGFuY2VubWVudCB3aGVyZSB3ZSBhY3R1YWxseSBtYWtlIHVzZSBvZiB0aGUgZXJyb3Igbm9kZXMgdGhhdFxuICAgICAgICAgICAgICAgIC8vIGFyZSBwYXNzZWQgYWxvbmcuIEFkZGluZyB0aGlzIGJyZWFrIHRvIHNwZWVkIHVwIHBlcmZvcm1hbmNlIGF0IHRoaXMgcG9pbnQuXG4gICAgICAgICAgICAgICAgYnJlYWs7IC8vIFRoZXJlIGlzIG5vIHBvaW50IHRvIGtlZXAgYWRkaW5nIHRoZSBlcnJvciBub2Rlcywgc3RvcCBhZnRlciBmaW5kaW5nIHRoZSBmaXJzdCBvbmVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB0aE5vZGVzID0gcnVsZUNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJ0aFwiKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aE5vZGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBpZiAoQ29tbW9uVXRpbC5nZXRBbmNlc3Rvcih0aE5vZGVzW2ldLCBcInRhYmxlXCIpID09IHJ1bGVDb250ZXh0KSB7XG5cbiAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgbm9kZSBzaG91bGQgYmUgc2tpcHBlZCBvciBub3QgYmFzZWQgb24gdGhlIENoZWNrIEhpZGRlbiBDb250ZW50IHNldHRpbmcgYW5kIGlmIHRoZSBub2RlIGlzVmlzaWJsZSBvclxuICAgICAgICAgICAgICAgIC8vIG5vdC5cbiAgICAgICAgICAgICAgICBpZiAoQ29tbW9uVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKHRoTm9kZXNbaV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgbm9kZSB0byB0aGUgZXJyb3JOb2Rlc1xuICAgICAgICAgICAgICAgIGVycm9yTm9kZXMucHVzaCh0aE5vZGVzW2ldKTtcblxuICAgICAgICAgICAgICAgIC8vIFNpbmNlIHdlIGFyZSBub3QgYWN0dWFsbHkgbWFraW5nIHVzZSBvZiB0aGVzZXMgZXJyb3JOb2RlcyBldmVuIHRob3VnaCB0aGV5IGFyZSBwYXNzZWQgYWxvbmcgd2l0aFxuICAgICAgICAgICAgICAgIC8vIFZhbGlkYXRpb25SZXN1bHQsIHdlIGRvIG5vdCBuZWVkIHRvIGtlZXAgbG9vcGluZyBvdmVyIGFuZCBnZXR0aW5nIGV2ZXJ5IHNpbmdsZSB2aW9sYXRpbmcgbm9kZSB1bmRlclxuICAgICAgICAgICAgICAgIC8vIHRoZSBydWxlIGNvbnRleHQuIFRoaXMgY2FuIGJlIGEgZnV0dXJlIGVuaGFuY2VubWVudCB3aGVyZSB3ZSBhY3R1YWxseSBtYWtlIHVzZSBvZiB0aGUgZXJyb3Igbm9kZXMgdGhhdFxuICAgICAgICAgICAgICAgIC8vIGFyZSBwYXNzZWQgYWxvbmcuIEFkZGluZyB0aGlzIGJyZWFrIHRvIHNwZWVkIHVwIHBlcmZvcm1hbmNlIGF0IHRoaXMgcG9pbnQuXG4gICAgICAgICAgICAgICAgYnJlYWs7IC8vIFRoZXJlIGlzIG5vIHBvaW50IHRvIGtlZXAgYWRkaW5nIHRoZSBlcnJvciBub2Rlcywgc3RvcCBhZnRlciBmaW5kaW5nIHRoZSBmaXJzdCBvbmVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgdGROb2RlcyA9IHJ1bGVDb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwidGRcIik7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGROb2Rlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgaWYgKCh0ZE5vZGVzW2ldLmhhc0F0dHJpYnV0ZShcInNjb3BlXCIpIHx8IHRkTm9kZXNbaV0uaGFzQXR0cmlidXRlKFwiaGVhZGVyc1wiKSkgJiZcbiAgICAgICAgICAgICAgICBDb21tb25VdGlsLmdldEFuY2VzdG9yKHRkTm9kZXNbaV0sIFwidGFibGVcIikgPT0gcnVsZUNvbnRleHQpIHtcblxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBub2RlIHNob3VsZCBiZSBza2lwcGVkIG9yIG5vdCBiYXNlZCBvbiB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyBhbmQgaWYgdGhlIG5vZGUgaXNWaXNpYmxlIG9yXG4gICAgICAgICAgICAgICAgLy8gbm90LlxuICAgICAgICAgICAgICAgIGlmIChDb21tb25VdGlsLnNob3VsZE5vZGVCZVNraXBwZWRIaWRkZW4odGROb2Rlc1tpXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gQWRkIHRoZSBub2RlIHRvIHRoZSBlcnJvck5vZGVzXG4gICAgICAgICAgICAgICAgZXJyb3JOb2Rlcy5wdXNoKHRkTm9kZXNbaV0pO1xuXG4gICAgICAgICAgICAgICAgLy8gU2luY2Ugd2UgYXJlIG5vdCBhY3R1YWxseSBtYWtpbmcgdXNlIG9mIHRoZXNlcyBlcnJvck5vZGVzIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIHBhc3NlZCBhbG9uZyB3aXRoXG4gICAgICAgICAgICAgICAgLy8gVmFsaWRhdGlvblJlc3VsdCwgd2UgZG8gbm90IG5lZWQgdG8ga2VlcCBsb29waW5nIG92ZXIgYW5kIGdldHRpbmcgZXZlcnkgc2luZ2xlIHZpb2xhdGluZyBub2RlIHVuZGVyXG4gICAgICAgICAgICAgICAgLy8gdGhlIHJ1bGUgY29udGV4dC4gVGhpcyBjYW4gYmUgYSBmdXR1cmUgZW5oYW5jZW5tZW50IHdoZXJlIHdlIGFjdHVhbGx5IG1ha2UgdXNlIG9mIHRoZSBlcnJvciBub2RlcyB0aGF0XG4gICAgICAgICAgICAgICAgLy8gYXJlIHBhc3NlZCBhbG9uZy4gQWRkaW5nIHRoaXMgYnJlYWsgdG8gc3BlZWQgdXAgcGVyZm9ybWFuY2UgYXQgdGhpcyBwb2ludC5cbiAgICAgICAgICAgICAgICBicmVhazsgLy8gVGhlcmUgaXMgbm8gcG9pbnQgdG8ga2VlcCBhZGRpbmcgdGhlIGVycm9yIG5vZGVzLCBzdG9wIGFmdGVyIGZpbmRpbmcgdGhlIGZpcnN0IG9uZVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IHRoZSBub2RlIG5hbWUgZm9yIHRoZSBydWxlIGNvbnRleHQgZWxlbWVudCBpbiB0aGlzIGNhc2UgaXQgd2lsbCBhbHdheXMgYmUgdGFibGVcbiAgICAgICAgbGV0IGN1cnJlbnRFbGVtZW50VG9rZW4gPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIC8vIENvbnN0cnVjdCBhIG5ldyBhcnJheSB3aGljaCB3aWxsIGNvbnRhbiBvbmx5IHRoZSBlbGVtZW50IHRhZyBmb3IgdGhlIHZpb2xhdGlvbiBlbGVtZW50c1xuICAgICAgICBsZXQgc3RydWN0dXJhbEVsZW1lbnRUb2tlbnMgPSBuZXcgQXJyYXkoKTtcblxuICAgICAgICAvLyBDb25zdHJ1Y3QgYSBzZWVuIGhhc2ggdGhhdCB3aWxsIGtlZXAgdHJhc2sgb2YgYWxsIHRoZSBlbGVtZW50cyB0aGF0IHdlcmUgYWxyZWFkeSBhZGRlZCB0byB0aGUgdG9rZW4gYXJyYXksIHRvIG1ha2Ugc3VyZVxuICAgICAgICAvLyB3ZSBkbyBub3QgZHVwbGljYXRlIGFueSBvZiB0aGUgZWxlbWVudHMuIER1cGxpY2F0ZSBlbGVtZW50IHRhZ3MgaW4gdGhlIHRva2VuIG1lc3NhZ2UgbG9va3MgYmFkIGFuZCBjb25mdXNpbmcuXG4gICAgICAgIGxldCBzZWVuID0ge307XG5cbiAgICAgICAgLy8gTG9vcCB0aHJvdWdoIGFsbCB0aGUgdmlvbGF0aW5nIHN0cnVjdHVyYWwgZWxlbWVudHMgYW5kIGV4dHJhY3QgdGhlIGVsZW1lbnQgdGFnIHRvIGJlIHVzZWQgYXMgYSB0b2tlblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVycm9yTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIC8vIEdldCB0aGUgbm9kZSBuYW1lICh0YWcgbmFtZSkgZm9yIHRoZSB2aW9sYXRpbmcgc3RydWN0dXJhbCBlbGVtZW50XG4gICAgICAgICAgICBsZXQgbm9kZU5hbWUgPSBlcnJvck5vZGVzW2ldLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgICAgIC8vIE9ubHkgbmVlZCB0byBhZGQgdGhlIHZpb2xhdGluZyBlbGVtZW50IG9uY2VcbiAgICAgICAgICAgIGlmICghc2Vlbi5oYXNPd25Qcm9wZXJ0eShub2RlTmFtZSkpIHtcbiAgICAgICAgICAgICAgICAvLyBTaW5jZSB3ZSBhcmUgYWRkaW5nIHRoZSB0b2tlbiBhcyBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyB3ZSBuZWVkIHRvIGhhbmRsZVxuICAgICAgICAgICAgICAgIC8vIHRoZSBzdW1tYXJ5IGF0dHJpYnV0ZSBvbiB0aGUgcnVsZUNvbnRleHQgKHRhYmxlKS4gV2Ugb25seSBhZGQgc3VtbWFyeSBvbmNlLCBzYW1lIGFzXG4gICAgICAgICAgICAgICAgLy8gZm9yIGVsZW1lbnRzIHRvIGF2b2lkIGR1cGxpY2F0aW9uIGluIHRoZSBtZXNzYWdlLiAoU3VtbWFyeSBzaG91bGQgbm90IGR1cGxpY2F0ZSwgYnV0IGp1c3QgaW4gY2FzZSlcbiAgICAgICAgICAgICAgICBpZiAobm9kZU5hbWUgPT0gXCJ0YWJsZVwiICYmICFzZWVuLmhhc093blByb3BlcnR5W1wic3VtbWFyeVwiXSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBNYXJrIHRoaXMgYXMgYSBuZXcgYXR0cmlidXRlXG4gICAgICAgICAgICAgICAgICAgIHNlZW5bXCJzdW1tYXJ5XCJdID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBTaW5jZSB0aGlzIGlzIGEgbmV3IHZpb2xhdGluZyBlbGVtZW50IGFkZCBpdCB0byB0aGUgc3RydWN0dXJhbCBlbGVtZW50IHRva2VucyBhcnJheVxuICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmFsRWxlbWVudFRva2Vucy5wdXNoKFwic3VtbWFyeVwiKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBNYXJrIHRoaXMgYXMgYSBuZXcgZWxlbWVudFxuICAgICAgICAgICAgICAgICAgICBzZWVuW25vZGVOYW1lXSA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gU2luY2UgdGhpcyBpcyBhIG5ldyB2aW9sYXRpbmcgZWxlbWVudCBhZGQgaXQgdG8gdGhlIHN0cnVjdHVyYWwgZWxlbWVudCB0b2tlbnMgYXJyYXlcbiAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJhbEVsZW1lbnRUb2tlbnMucHVzaChub2RlTmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2UgbmVlZCB0byB0YWtlIHRoZSBhcnJheSBvZiBzdHJ1Y3R1cmFsIGVsZW1lbnRzIGFuZCBqb2luIHRoZW0gd2l0aCBhIGNvbW1hIGFuZCBhIHNwYWNlIHRvIG1ha2UgZ3JhbW1hdGljYWwgY29ycmVjdCBpblxuICAgICAgICAvLyB0aGUgbWVzc2FnZS5cbiAgICAgICAgbGV0IHN0cnVjdHVyYWxFbGVtZW50VG9rZW5zU3RyID0gc3RydWN0dXJhbEVsZW1lbnRUb2tlbnMuam9pbihcIiwgXCIpO1xuXG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KGVycm9yTm9kZXMubGVuZ3RoID09IDAsIGVycm9yTm9kZXMsICcnLCAnJywgW2N1cnJlbnRFbGVtZW50VG9rZW4sIHN0cnVjdHVyYWxFbGVtZW50VG9rZW5zXSk7XG4gICAgICAgIGlmIChlcnJvck5vZGVzLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW2N1cnJlbnRFbGVtZW50VG9rZW4sIHN0cnVjdHVyYWxFbGVtZW50VG9rZW5zU3RyXSk7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG5pbXBvcnQgeyBET01VdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01VdGlsXCI7XG5cbmV4cG9ydCBjb25zdCB0YWJsZV9zdW1tYXJ5X3JlZHVuZGFudDogUnVsZSA9IHtcbiAgICBpZDogXCJ0YWJsZV9zdW1tYXJ5X3JlZHVuZGFudFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOnRhYmxlXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfVGFibGVfQ2FwU3VtbVJlZHVuZGFudFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInRhYmxlX3N1bW1hcnlfcmVkdW5kYW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwidGFibGVfc3VtbWFyeV9yZWR1bmRhbnQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInRhYmxlX3N1bW1hcnlfcmVkdW5kYW50Lmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiVGhlIHRhYmxlIHN1bW1hcnkgZHVwbGljYXRlcyB0aGUgY2FwdGlvblwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSB0YWJsZSBzdW1tYXJ5IG11c3Qgbm90IGR1cGxpY2F0ZSB0aGUgY2FwdGlvblwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcG9mSWQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuICAgICAgICBsZXQgc3VtU3RyO1xuICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwic3VtbWFyeVwiKSkge1xuICAgICAgICAgICAgcG9mSWQgPSAwO1xuICAgICAgICAgICAgc3VtU3RyID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwic3VtbWFyeVwiKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgfSBlbHNlIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhcmlhLWRlc2NyaWJlZGJ5XCIpKSB7XG4gICAgICAgICAgICBwb2ZJZCA9IDE7XG4gICAgICAgICAgICBsZXQgc3VtbWFyeU5vZGVJZHMgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWRlc2NyaWJlZGJ5XCIpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgIGxldCBzdW1tYXJ5Tm9kZUNvbmNhdCA9IFwiXCI7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN1bW1hcnlOb2RlSWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHN1bW1hcnlOb2RlSWQgPSBzdW1tYXJ5Tm9kZUlkc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoc3VtbWFyeU5vZGVJZCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgc3VtbWFyeU5vZGUgPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChydWxlQ29udGV4dCwgc3VtbWFyeU5vZGVJZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdW1tYXJ5Tm9kZSAmJiAhRE9NVXRpbC5zYW1lTm9kZShzdW1tYXJ5Tm9kZSxydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnlOb2RlQ29uY2F0ICs9IFwiIFwiICsgQ29tbW9uVXRpbC5nZXRJbm5lclRleHQoc3VtbWFyeU5vZGUpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3VtU3RyID0gc3VtbWFyeU5vZGVDb25jYXQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzdW1TdHIpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IGNhcEVsZW1zID0gcnVsZUNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJjYXB0aW9uXCIpO1xuICAgICAgICAgICAgaWYgKGNhcEVsZW1zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChzdW1TdHIubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCBjYXBTdHIgPSBDb21tb25VdGlsLmdldElubmVyVGV4dChjYXBFbGVtc1swXSkudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgaWYgKCFzdW1TdHIuaW5jbHVkZXMoY2FwU3RyKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSwgUnVsZUZhaWwsIFJ1bGVQb3RlbnRpYWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IERPTU1hcHBlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NTWFwcGVyXCI7XG5pbXBvcnQgeyBDU1NVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ1NTVXRpbFwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG4gICAgXG4gICAgZXhwb3J0IGNvbnN0IHRhcmdldF9zcGFjaW5nX3N1ZmZpY2llbnQ6IFJ1bGUgPSB7XG4gICAgICAgIGlkOiBcInRhcmdldF9zcGFjaW5nX3N1ZmZpY2llbnRcIixcbiAgICAgICAgY29udGV4dDogXCJkb206KlwiLFxuICAgICAgICBkZXBlbmRlbmNpZXM6IFtdLFxuICAgICAgICBoZWxwOiB7XG4gICAgICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgICAgICBcImdyb3VwXCI6IFwidGFyZ2V0X3NwYWNpbmdfc3VmZmljaWVudC5odG1sXCIsXG4gICAgICAgICAgICAgICAgXCJwYXNzX3NwYWNpbmdcIjogXCJ0YXJnZXRfc3BhY2luZ19zdWZmaWNpZW50Lmh0bWxcIixcbiAgICAgICAgICAgICAgICBcInBhc3Nfc2l6ZWRcIjogXCJ0YXJnZXRfc3BhY2luZ19zdWZmaWNpZW50Lmh0bWxcIixcbiAgICAgICAgICAgICAgICBcInBhc3NfaW5saW5lXCI6IFwidGFyZ2V0X3NwYWNpbmdfc3VmZmljaWVudC5odG1sXCIsXG4gICAgICAgICAgICAgICAgXCJwYXNzX2RlZmF1bHRcIjogXCJ0YXJnZXRfc3BhY2luZ19zdWZmaWNpZW50Lmh0bWxcIixcbiAgICAgICAgICAgICAgICBcInZpb2xhdGlvbl9zcGFjaW5nXCI6IFwidGFyZ2V0X3NwYWNpbmdfc3VmZmljaWVudC5odG1sXCIsXG4gICAgICAgICAgICAgICAgXCJyZWNvbW1lbmRhdGlvbl9pbmxpbmVcIjogXCJ0YXJnZXRfc3BhY2luZ19zdWZmaWNpZW50Lmh0bWxcIixcbiAgICAgICAgICAgICAgICBcInBvdGVudGlhbF9vdmVybGFwXCI6IFwidGFyZ2V0X3NwYWNpbmdfc3VmZmljaWVudC5odG1sXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbWVzc2FnZXM6IHtcbiAgICAgICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgdGFyZ2V0IG11c3QgYmUgc3VmZmljaWVudGx5IHNpemVkIG9yIHNwYWNlZCBmcm9tIG90aGVyIHRhcmdldHNcIixcbiAgICAgICAgICAgICAgICBcInBhc3Nfc3BhY2luZ1wiOiBcIlRoZSB0YXJnZXQncyBzcGFjaW5nIGZyb20gb3RoZXIgdGFyZ2V0cyBpcyBzdWZmaWNpZW50XCIsXG4gICAgICAgICAgICAgICAgXCJwYXNzX3NpemVkXCI6IFwiVGhlIHRhcmdldOKAmXMgc2l6ZSBpcyBtb3JlIHRoYW4gMjQgQ1NTIHBpeGVsc1wiLFxuICAgICAgICAgICAgICAgIFwicGFzc19pbmxpbmVcIjogXCJUaGUgdGFyZ2V0IGlzIGluIGEgc2VudGVuY2Ugb3IgaXRzIHNpemUgaXMgb3RoZXJ3aXNlIGNvbnN0cmFpbmVkIGJ5IHRoZSBsaW5lLWhlaWdodCBvZiBub24tdGFyZ2V0IHRleHRcIixcbiAgICAgICAgICAgICAgICBcInBhc3NfZGVmYXVsdFwiOiBcIlRoZSB0YXJnZXQncyBzaXplIGlzIGRldGVybWluZWQgYnkgdGhlIHVzZXIgYWdlbnQgYW5kIGlzIG5vdCBtb2RpZmllZCBieSB0aGUgYXV0aG9yXCIsXG4gICAgICAgICAgICAgICAgXCJ2aW9sYXRpb25fc3BhY2luZ1wiOiBcIlVuZGVyc2l6ZWQgdGFyZ2V0IFxcXCJ7MH1cXFwiIGRvZXMgbm90IGhhdmUgc3VmZmljaWVudCBzcGFjaW5nIG9mIDEyIENTUyBwaXhlbHMgZnJvbSBhbm90aGVyIHRhcmdldCBcXFwiezF9XFxcIlwiLFxuICAgICAgICAgICAgICAgIFwicmVjb21tZW5kYXRpb25faW5saW5lXCI6IFwiQ29uZmlybSB0aGUgaW5saW5lIHRhcmdldCBcXFwiezB9XFxcIiBpcyBzdWZmaWNpZW50bHkgc3BhY2VkIGZyb20gYW5vdGhlciBpbmxpbmUgdGFyZ2V0IFxcXCJ7MX1cXFwiXCIsXG4gICAgICAgICAgICAgICAgXCJwb3RlbnRpYWxfb3ZlcmxhcFwiOiBcIkVuc3VyZSB0aGUgb3ZlcmxhcHBlZCB0YXJnZXQgXFxcInswfVxcXCIgbWVldHMgYSBtaW5pbXVtIHRhcmdldCBzaXplIG9yIGhhcyBzdWZmaWNpZW50IHNwYWNpbmcgZnJvbSB0aGUgb3ZlcmxhcHBpbmcgdGFyZ2V0IFxcXCJ7MX1cXFwiXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgcnVsZXNldHM6IFt7XG4gICAgICAgICAgICBpZDogWyBcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICAgICAgbnVtOiBbXCIyLjUuOFwiXSxcbiAgICAgICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUUsXG4gICAgICAgICAgICByZWFzb25Db2RlczogW1wicGFzc19zcGFjaW5nXCIsXCJwYXNzX3NpemVkXCIsIFwicGFzc19pbmxpbmVcIixcInBhc3NfZGVmYXVsdFwiLCBcInZpb2xhdGlvbl9zcGFjaW5nXCIsIFwicG90ZW50aWFsX292ZXJsYXBcIl1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgaWQ6IFsgXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgICAgIG51bTogW1wiMi41LjhcIl0sXG4gICAgICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUUsXG4gICAgICAgICAgICByZWFzb25Db2RlczogW1wicmVjb21tZW5kYXRpb25faW5saW5lXCJdXG4gICAgICAgIH1dLFxuICAgICAgICBhY3Q6IFtdLFxuICAgICAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICBjb25zdCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCk7IFxuICAgICAgICAgICAgXG4gICAgICAgICAgICBjb25zdCBtYXBwZXIgOiBET01NYXBwZXIgPSBuZXcgRE9NTWFwcGVyKCk7XG4gICAgICAgICAgICBjb25zdCBib3VuZHMgPSBtYXBwZXIuZ2V0VW5hZGp1c3RlZEJvdW5kcyhydWxlQ29udGV4dCk7IC8vY29udGV4dFtcImRvbVwiXS5ib3VuZHM7ICAgIFxuICAgICAgICAgICAgaWYgKCFib3VuZHMpIFxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBpZ25vcmUgaGlkZGVuLCBub24tdGFyZ2V0XG4gICAgICAgICAgICBpZiAoIUNvbW1vblV0aWwuaXNUYXJnZXQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgICAgICBpZiAoYm91bmRzLmhlaWdodCA+PSAyNCAmJiBib3VuZHMud2lkdGggPj0gMjQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc19zaXplZFwiKTsgXG5cbiAgICAgICAgICAgIC8vIGNoZWNrIGlubGluZSBlbGVtZW50OiB3aXRob3V0IHRleHQgaW4gdGhlIHNhbWUgbGluZVxuICAgICAgICAgICAgY29uc3Qgc3RhdHVzID0gQ1NTVXRpbC5nZXRJbmxpbmVTdGF0dXMocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgaWYgKHN0YXR1cyA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBpZiAoc3RhdHVzLmlubGluZSkge1xuICAgICAgICAgICAgICAgIGlmIChzdGF0dXMudGV4dCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzLnZpb2xhdGlvbiA9PT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NfaW5saW5lXCIpO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjYXNlIDE6IGlubGluZSBlbGVtZW50IGlzIHRvbyBjbG9zZSBob3Jpem9udGFsbHlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicmVjb21tZW5kYXRpb25faW5saW5lXCIsIFtub2RlTmFtZSwgc3RhdHVzLnZpb2xhdGlvbl0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMudmlvbGF0aW9uID09PSBudWxsKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc19kZWZhdWx0XCIpO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjYXNlIDE6IGlubGluZSBlbGVtZW50IGlzIHRvbyBjbG9zZSBob3Jpem9udGFsbHlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicmVjb21tZW5kYXRpb25faW5saW5lXCIsIFtub2RlTmFtZSwgc3RhdHVzLnZpb2xhdGlvbl0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIGJyb3dzZXIgZGVmYXVsdFxuICAgICAgICAgICAgICAgIGlmIChDU1NVdGlsLmlzVGFyZ2V0QnJvd3NlckRlZmF1bHQocnVsZUNvbnRleHQpKSBcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc19kZWZhdWx0XCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgZG9jID0gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudDtcbiAgICAgICAgICAgIGlmICghZG9jKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGxldCBjU3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgIGlmIChjU3R5bGUgPT09IG51bGwpIFxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBsZXQgemluZGV4ID0gY1N0eWxlLnpJbmRleDsgICBcbiAgICAgICAgICAgIGlmICghemluZGV4IHx8IGlzTmFOKE51bWJlcih6aW5kZXgpKSlcbiAgICAgICAgICAgICAgICB6aW5kZXggPSBcIjBcIjtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gR2V0IHRoZSBsaXN0IG9mIHRhcmdldCBlbGVtZW50c1xuICAgICAgICAgICAgbGV0IHRhcmdldEVsZW1zID0gQ2FjaGVVdGlsLmdldENhY2hlKGRvYy5kb2N1bWVudEVsZW1lbnQsIFwidGFyZ2V0X3NwYWNpbmdfc3VmZmljaWVudDo6dGFyZ2V0c1wiLCB1bmRlZmluZWQpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0YXJnZXRFbGVtcyA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgICAgIHRhcmdldEVsZW1zID0gW107XG4gICAgICAgICAgICAgICAgLy9zZWxlY3QgYWxsIGVsZW1lbnRzIGV4Y2VwdCBpdHNlbGYgYW5kIGRlc2NlbmRhbnRzXG4gICAgICAgICAgICAgICAgbGV0IGVsZW1zID0gZG9jLnF1ZXJ5U2VsZWN0b3JBbGwoJ2JvZHkgKjpub3Qoc2NyaXB0KTpub3Qoc3R5bGUpJyk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgZWxlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZWxlbSA9IGVsZW1zW2ldIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICBpZiAoQ29tbW9uVXRpbC5pc1RhcmdldChlbGVtKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0RWxlbXMucHVzaChlbGVtKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZG9jLmRvY3VtZW50RWxlbWVudCwgXCJ0YXJnZXRfc3BhY2luZ19zdWZmaWNpZW50Ojp0YXJnZXRzXCIsIHRhcmdldEVsZW1zKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCF0YXJnZXRFbGVtcyB8fCB0YXJnZXRFbGVtcy5sZW5ndGggPT09IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgICAgICBsZXQgYmVmb3JlID0gdHJ1ZTtcbiAgICAgICAgICAgIGxldCBtaW5YID0gMjQ7XG4gICAgICAgICAgICBsZXQgbWluWSA9IDI0O1xuICAgICAgICAgICAgbGV0IGFkamFjZW50WCA9IG51bGw7XG4gICAgICAgICAgICBsZXQgYWRqYWNlbnRZID0gbnVsbDtcbiAgICAgICAgICAgIGxldCBjaGVja2VkID0gW107IC8vY29udGFpbnMgYSBsaXN0IG9mIGVsZW1lbnRzIHRoYXQgaGF2ZSBiZWVuIGNoZWNrZWQgc28gdGhlaXIgZGVzY2VuZGFudHMgZG9uJ3QgbmVlZCB0byBiZSBjaGVja2VkIGFnYWluXG4gICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCB0YXJnZXRFbGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW0gPSB0YXJnZXRFbGVtc1tpXSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgKiAgdGhlIG5vZGVzIHJldHVybmVkIGZyb20gcXVlcnlTZWxlY3RvckFsbCBpcyBpbiBkb2N1bWVudCBvcmRlclxuICAgICAgICAgICAgICAgICAqICBpZiB0d28gZWxlbWVudHMgb3ZlcmxhcCBhbmQgei1pbmRleCBhcmUgbm90IGRlZmluZWQsIHRoZW4gdGhlIG5vZGUgcmVuZGVyZWQgZWFybGllciB3aWxsIGJlIG92ZXJsYWlkIGJ5IHRoZSBub2RlIHJlbmRlcmVkIGxhdGVyXG4gICAgICAgICAgICAgICAgICogIGZpbHRlciBvdXQgdGhlIGVsZW1lbnRzIHRoYXTigJlyZSBkZXNjZW5kYW50IG9yIGFuY2VzdG9ycyBvZiB0aGUgdGFyZ2V0IGVsZW1lbnQsIG5vciBkZXNjZW5kYW50IG9mIHRoZSB0YXJnZXQgZWxlbWVudCdzIHNpYmxpbmdzXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgLy8gVXNlIGNvbXBhcmVEb2N1bWVudFBvc2l0aW9uIHRvIGNoZWNrIGNvbnRhaW5tZW50IHJlbGF0aW9uc2hpcHNcbiAgICAgICAgICAgICAgICAvLyBOb3RlOiBjb21wYXJlRG9jdW1lbnRQb3NpdGlvbiByZXR1cm5zIDAgd2hlbiBjb21wYXJpbmcgYSBub2RlIHRvIGl0c2VsZlxuICAgICAgICAgICAgICAgIGNvbnN0IHBvc2l0aW9uID0gcnVsZUNvbnRleHQuY29tcGFyZURvY3VtZW50UG9zaXRpb24oZWxlbSk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gRE9DVU1FTlRfUE9TSVRJT05fQ09OVEFJTkVEX0JZICgxNik6IGVsZW0gaXMgY29udGFpbmVkIGJ5IHJ1bGVDb250ZXh0XG4gICAgICAgICAgICAgICAgLy8gQWxzbyBoYW5kbGUgc2VsZi1jb21wYXJpc29uIChwb3NpdGlvbiA9PT0gMClcbiAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24gPT09IDAgfHwgKHBvc2l0aW9uICYgTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9DT05UQUlORURfQlkpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vdGhlIG5leHQgbm9kZSBpbiBlbGVtcyB3aWxsIGJlIGFmdGVyIHRoZSB0YXJnZXQgbm9kZSAocnVsZUNvbnRleHQpLlxuICAgICAgICAgICAgICAgICAgICBiZWZvcmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIERPQ1VNRU5UX1BPU0lUSU9OX0NPTlRBSU5TICg4KTogZWxlbSBjb250YWlucyBydWxlQ29udGV4dFxuICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBhc2NlbmRhbnRzIG9mIHRoZSBlbGVtZW50LCBvciBpdHNlbGYgb3IgaXRzIGFzY2VuZGFudCBhbHJlYWR5IGNoZWNrZWRcbiAgICAgICAgICAgICAgICBpZiAoKHBvc2l0aW9uICYgTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9DT05UQUlOUykgfHwgY2hlY2tlZC5zb21lKGl0ZW0gPT4gaXRlbS5jb250YWlucyhlbGVtKSkpXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgYm5kcyA9IG1hcHBlci5nZXRVbmFkanVzdGVkQm91bmRzKGVsZW0pO1xuICAgICAgICAgICAgICAgIGlmICghYm5kcykgY29udGludWU7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgbGV0IHpTdHlsZSA9IGdldENvbXB1dGVkU3R5bGUoZWxlbSk7IFxuICAgICAgICAgICAgICAgIGxldCB6X2luZGV4ID0gJzAnO1xuICAgICAgICAgICAgICAgIGlmICh6U3R5bGUpIHtcbiAgICAgICAgICAgICAgICAgICAgel9pbmRleCA9IHpTdHlsZS56SW5kZXg7XG4gICAgICAgICAgICAgICAgICAgIGlmICghel9pbmRleCB8fCBpc05hTihOdW1iZXIoel9pbmRleCkpKVxuICAgICAgICAgICAgICAgICAgICAgICAgel9pbmRleCA9IFwiMFwiO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIGNhc2UgMjogdGhlIGVsZW1lbnQgb3ZlcmxhcHMgdGhlIHRhcmdldCBlbnRpcmVseVxuICAgICAgICAgICAgICAgIC8vIG5vdGUgd2hlbiBhIGxpbmsgaXMgaW5saW5lIHdpdGggb3RoZXIgdGFyZ2V0LCBpZiB0aGUgbGluayB0ZXh0IHdyYXBzIGluIGFub3RoZXIgbGluZSBpbiBhIGdpdmVuIHZpZXdwb3J0LCAgXG4gICAgICAgICAgICAgICAgLy8gdGhlIGJvdW5kcyBvZiB0aGUgbGluayBtYXkgY292ZXIgYW5kIHRoZSBlbnRpcmUgdHdvIGxpbmVzLCBjYXVzaW5nIHRoZSBvdGhlciB0YWdldHMgdG8gYmUgb3ZlcmxhcHBlZCwgc2VlIHR3byBsaW5rcyBpbiB0aGUgdGVzdCBjYXNlOiBlbGVtZW50X2lubGluZS5odG1sIFxuICAgICAgICAgICAgICAgIGlmIChibmRzLnRvcCA8PSBib3VuZHMudG9wICYmIGJuZHMubGVmdCA8PSBib3VuZHMubGVmdCAmJiBibmRzLnRvcCArIGJuZHMuaGVpZ2h0ID49IGJvdW5kcy50b3AgKyBib3VuZHMuaGVpZ2h0IFxuICAgICAgICAgICAgICAgICAgICAmJiBibmRzLmxlZnQgKyBibmRzLndpZHRoID49IGJvdW5kcy5sZWZ0ICsgYm91bmRzLndpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSB0YXJnZXQgb24gdG9wICAgIFxuICAgICAgICAgICAgICAgICAgICBpZiAoYmVmb3JlID8gcGFyc2VJbnQoemluZGV4KSA8IHBhcnNlSW50KHpfaW5kZXgpOiBwYXJzZUludCh6aW5kZXgpIDw9IHBhcnNlSW50KHpfaW5kZXgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdGFyZ2V0IGlzIGVudGlyZWx5IGNvdmVyZWQ6IHRhYmJhYmxlIHRhcmdldCBoYW5kbGVkIGJ5IGVsZW1lbnRfdGFiYmFibGVfdW5vYnNjdXJlZCBhbmQgdGFiaW5kZXg9LTEgaWdub3JlZFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfb3ZlcmxhcFwiLCBbbm9kZU5hbWUsIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pO1xuICAgICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gY2FzZSAzOiBpZiB0aGUgdGFyZ2V0IG92ZXJsYXBzIHRoZSBlbGVtZW50IGVudGlyZWx5XG4gICAgICAgICAgICAgICAgaWYgKGJvdW5kcy50b3AgPD0gYm5kcy50b3AgJiYgYm91bmRzLmxlZnQgPD0gYm5kcy5sZWZ0ICYmIGJvdW5kcy50b3AgKyBib3VuZHMuaGVpZ2h0ID49IGJuZHMudG9wICsgYm5kcy5oZWlnaHQgXG4gICAgICAgICAgICAgICAgICAgICYmIGJvdW5kcy5sZWZ0ICsgYm91bmRzLndpZHRoID49IGJuZHMubGVmdCArIGJuZHMud2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGVsZW1lbnQgb24gdG9wICAgIFxuICAgICAgICAgICAgICAgICAgICBpZiAoYmVmb3JlID8gcGFyc2VJbnQoemluZGV4KSA8IHBhcnNlSW50KHpfaW5kZXgpOiBwYXJzZUludCh6aW5kZXgpIDw9IHBhcnNlSW50KHpfaW5kZXgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF9vdmVybGFwXCIsIFtub2RlTmFtZSwgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSk7IFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgLy8gdGhlIHRhcmdldCBvbiB0b3BcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcInZpb2xhdGlvbl9zcGFjaW5nXCIsIFtub2RlTmFtZSwgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSk7ICAgICBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gY2FzZSA0OiB0aGUgZWxlbWVudCBvdmVybGFwcyBwYXJ0aWFsbHkgd2l0aCB0aGUgdGFyZ2V0XG4gICAgICAgICAgICAgICAgaWYgKCgoKGJvdW5kcy50b3AgPj0gYm5kcy50b3AgJiYgYm91bmRzLnRvcCA8PSBibmRzLnRvcCArIGJuZHMuaGVpZ2h0KSB8fCAoYm91bmRzLnRvcCArIGJvdW5kcy5oZWlnaHQgPD0gYm5kcy50b3AgJiYgYm91bmRzLnRvcCArIGJvdW5kcy5oZWlnaHQgPj0gYm5kcy50b3AgK2JuZHMuaGVpZ2h0KSlcbiAgICAgICAgICAgICAgICAgICAgICYmICgoYm91bmRzLmxlZnQgPiBibmRzLmxlZnQgJiYgYm91bmRzLmxlZnQgPCBibmRzLmxlZnQgKyBibmRzLndpZHRoKSB8fCAoYm5kcy5sZWZ0ID4gYm91bmRzLmxlZnQgJiYgYm5kcy5sZWZ0IDwgYm91bmRzLmxlZnQgKyBib3VuZHMud2lkdGgpKSkgXG4gICAgICAgICAgICAgICAgICAgICB8fCAoKChib3VuZHMudG9wID4gYm5kcy50b3AgJiYgYm91bmRzLnRvcCA8IGJuZHMudG9wICsgYm5kcy5oZWlnaHQpIHx8IChibmRzLnRvcCA+IGJvdW5kcy50b3AgJiYgYm5kcy50b3AgPCBib3VuZHMudG9wICsgYm91bmRzLmhlaWdodCkpXG4gICAgICAgICAgICAgICAgICAgICAmJiAoKGJvdW5kcy5sZWZ0ID49IGJuZHMubGVmdCAmJiBib3VuZHMubGVmdCA8PSBibmRzLmxlZnQgKyBibmRzLndpZHRoKSB8fCAoYm91bmRzLmxlZnQgKyBib3VuZHMud2lkdGggPj0gYm5kcy5sZWZ0ICYmIGJvdW5kcy5sZWZ0ICsgYm91bmRzLndpZHRoIDw9IGJuZHMubGVmdCArIGJuZHMud2lkdGgpKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IG1vcmUgY2hlY2sgdG8gdHVybiB0byB2aW9sYXRpb24gIFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfb3ZlcmxhcFwiLCBbbm9kZU5hbWUsIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pOyBcblxuICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIG5vIG92ZXJsYXAgd2l0aCB0aGUgZWxlbSwgdGhvdWdoIG1heSBvdmVybGFwIHdpdGhlIG90aGVyIGVsZW1lbnRzXG4gICAgICAgICAgICAgICAgICAgIGxldCBkaXNYID0gMjQ7IFxuICAgICAgICAgICAgICAgICAgICBsZXQgZGlzWSA9IDI0OyAgIFxuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZWxlbWVudCBpcyBpbiB0aGUgaG9yaXpvbnRhbGx5IHNhbWUgcm93IHdpdGggdGhlIHRhcmdldFxuICAgICAgICAgICAgICAgICAgICBpZiAoYm91bmRzLndpZHRoIDwgMjQgJiYgKChib3VuZHMudG9wID49IGJuZHMudG9wICYmIGJvdW5kcy50b3AgPD0gYm5kcy50b3AgKyBibmRzLmhlaWdodCkgfHwgKGJvdW5kcy50b3AgPD0gYm5kcy50b3AgJiYgYm91bmRzLnRvcCArIGJvdW5kcy5oZWlnaHQgPiBibmRzLnRvcCkpKVxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzWCA9IE1hdGgubWluKCBNYXRoLmFicyhib3VuZHMubGVmdCAtIGJuZHMubGVmdCksIE1hdGguYWJzKGJvdW5kcy5sZWZ0IC0gKGJuZHMubGVmdCArIGJuZHMud2lkdGgpKSwgIE1hdGguYWJzKGJvdW5kcy5sZWZ0ICsgYm91bmRzLndpZHRoIC0gKGJuZHMubGVmdCArIGJuZHMud2lkdGgpKSwgTWF0aC5hYnMoYm91bmRzLmxlZnQgKyBib3VuZHMud2lkdGggLSBibmRzLmxlZnQpKTtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBlbGVtZW50IGlzIGluIHRoZSB2ZXJ0aWNhbGx5IHNhbWUgY29sdW1uIHdpdGggdGhlIHRhcmdldCAgICBcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJvdW5kcy5oZWlnaHQgPCAyNCAmJiAoKGJvdW5kcy5sZWZ0ID49IGJuZHMubGVmdCAmJiBib3VuZHMubGVmdCA8PSBibmRzLmxlZnQgKyBibmRzLndpZHRoKSB8fCAoYm91bmRzLmxlZnQgPD0gYm5kcy5sZWZ0ICYmIGJvdW5kcy5sZWZ0ICsgYm91bmRzLndpZHRoID4gYm5kcy5sZWZ0KSkpXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNZID0gTWF0aC5taW4oTWF0aC5hYnMoYm91bmRzLnRvcCAtIGJuZHMudG9wKSwgTWF0aC5hYnMoYm91bmRzLnRvcCAtIChibmRzLnRvcCArIGJuZHMuaGVpZ2h0KSksICBNYXRoLmFicyhib3VuZHMudG9wICsgYm91bmRzLmhlaWdodCAtIChibmRzLnRvcCArIGJuZHMuaGVpZ2h0KSksIE1hdGguYWJzKGJvdW5kcy50b3AgKyBib3VuZHMuaGVpZ2h0IC0gYm5kcy50b3ApKTtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIGlmIChkaXNYIDwgbWluWCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWluWCA9IGRpc1g7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGphY2VudFggPSBlbGVtO1xuICAgICAgICAgICAgICAgICAgICB9ICAgIFxuICAgICAgICAgICAgICAgICAgICBpZiAoZGlzWSA8IG1pblkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pblkgPSBkaXNZOyAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgYWRqYWNlbnRZID0gZWxlbTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjaGVja2VkLnB1c2goZWxlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIGNhc2UgNTogbm8gb3ZlcmxhcCArIGluc3VmZmljaWVudCB0YXJnZXQgc2l6ZS4gY2hlY2sgc3BhY2luZyAgICBcbiAgICAgICAgICAgIGlmIChNYXRoLnJvdW5kKGJvdW5kcy53aWR0aC8yKSArIG1pblggPCAxMiB8fCBNYXRoLnJvdW5kKGJvdW5kcy5oZWlnaHQvMikgKyBtaW5ZIDwgMTIpIHtcbiAgICAgICAgICAgICAgICBpZiAoTWF0aC5yb3VuZChib3VuZHMud2lkdGgvMikgKyBtaW5YIDwgTWF0aC5yb3VuZChib3VuZHMuaGVpZ2h0LzIpICsgbWluWSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwidmlvbGF0aW9uX3NwYWNpbmdcIiwgW25vZGVOYW1lLCBhZGphY2VudFgubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pOyBcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJ2aW9sYXRpb25fc3BhY2luZ1wiLCBbbm9kZU5hbWUsIGFkamFjZW50WS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSk7XG4gICAgICAgICAgICB9IGVsc2UgXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc19zcGFjaW5nXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgICIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuaW1wb3J0IHsgQ1NTVXRpbCB9IGZyb20gXCIuLi91dGlsL0NTU1V0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCB0ZXh0X2Jsb2NrX2hlYWRpbmc6IFJ1bGUgPSB7XG4gICAgaWQ6IFwidGV4dF9ibG9ja19oZWFkaW5nXCIsXG4gICAgY29udGV4dDogXCJkb206cCwgZG9tOmRpdiwgZG9tOmJyXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfQmxvY2tfU2hvdWxkQmVIZWFkaW5nXCI6IHtcbiAgICAgICAgICAgIC8vIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcInBvdGVudGlhbF9oZWFkaW5nXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgLy8gXCJwYXNzXCI6IFwidGV4dF9ibG9ja19oZWFkaW5nLmh0bWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX2hlYWRpbmdcIjogXCJ0ZXh0X2Jsb2NrX2hlYWRpbmcuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInRleHRfYmxvY2tfaGVhZGluZy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICAvLyBcInBhc3NcIjogXCJIZWFkaW5nIHRleHQgdXNlcyBhIGhlYWRpbmcgZWxlbWVudCBvciByb2xlXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9oZWFkaW5nXCI6IFwiQ29uZmlybSB0aGlzIHRleHQgJ3swfScgaXMgdXNlZCBhcyBhIGhlYWRpbmcgYW5kIGlmIHNvLCBtb2RpZnkgdG8gdXNlIGEgaGVhZGluZyBlbGVtZW50IG9yIHJvbGVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJIZWFkaW5nIHRleHQgc2hvdWxkIHVzZSBhIGhlYWRpbmcgZWxlbWVudCBvciByb2xlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBjaGVjayBpZiB0aGUgZWxlbWVudCBpcyBoaWRkZW4gb3IgZGlzYWJsZWRcbiAgICAgICAgaWYgKENvbW1vblV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpIHx8ICFWaXNVdGlsLmlzTm9kZVZpc2libGUocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gRG9uJ3QgdHJpZ2dlciBpZiB3ZSdyZSBub3QgaW4gdGhlIGJvZHkgb3IgaWYgd2UncmUgaW4gYSBzY3JpcHRcbiAgICAgICAgaWYgKENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFtcImJvZHlcIl0pID09PSBudWxsIHx8IENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFtcInNjcmlwdFwiXSkgIT09IG51bGwpIFxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgY29uc3QgdmFsaWRhdGVQYXJhbXMgPSB7XG4gICAgICAgICAgICBudW1Xb3Jkczoge1xuICAgICAgICAgICAgICAgIHZhbHVlOiAxMCxcbiAgICAgICAgICAgICAgICB0eXBlOiBcImludGVnZXJcIlxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBsZXQgYm9keUZvbnQgPSAwO1xuICAgICAgICBsZXQgYm9keSA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJib2R5XCIpO1xuICAgICAgICBpZiAoYm9keSAhPSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgYm9keVN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShib2R5WzBdKTtcbiAgICAgICAgICAgIGlmIChib2R5U3R5bGUpIGJvZHlGb250ID0gQ1NTVXRpbC5nZXRQaXhlbHNGcm9tU3R5bGUoYm9keVN0eWxlWydmb250LXNpemUnXSwgYm9keSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG51bVdvcmRzID0gdmFsaWRhdGVQYXJhbXMubnVtV29yZHMudmFsdWU7XG4gICAgICAgIGxldCB3b3Jkc1NlZW4gPSAwO1xuICAgICAgICBsZXQgd29yZFN0cjogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgbGV0IGVtcGhhc2l6ZWRUZXh0ID0gZmFsc2U7XG4gICAgICAgIGxldCBudyA9IG5ldyBET01XYWxrZXIocnVsZUNvbnRleHQpO253Lm5leHROb2RlKCk7XG4gICAgICAgIGxldCBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgd2hpbGUgKCFwYXNzZWQgJiZcbiAgICAgICAgICAgIG53Lm5leHROb2RlKCkgJiYgXG4gICAgICAgICAgICBudy5ub2RlICE9PSBydWxlQ29udGV4dCAmJlxuICAgICAgICAgICAgbncubm9kZSAhPT0gRE9NV2Fsa2VyLnBhcmVudE5vZGUocnVsZUNvbnRleHQpICYmXG4gICAgICAgICAgICAhW1wiYnJcIiwgXCJkaXZcIiwgXCJwXCJdLmluY2x1ZGVzKG53Lm5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkpIC8vIERvbid0IHJlcG9ydCB0d2ljZVxuICAgICAgICB7ICAgXG4gICAgICAgICAgICBpZiAobncubm9kZSA9PT0gcnVsZUNvbnRleHQgfHwgQ29tbW9uVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKG53Lm5vZGUpKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBsZXQgbndOYW1lID0gbncubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgaWYgKG53Lm5vZGUubm9kZVR5cGUgPT09IDMpIHsgXG4gICAgICAgICAgICAgICAgLy8gZm9yIHRleHQgY2hpbGRcbiAgICAgICAgICAgICAgICBpZiAobncubm9kZS5ub2RlVmFsdWUudHJpbSgpLmxlbmd0aCA+IDAgJiYgbncubm9kZS5wYXJlbnRFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGl0J3Mgc3R5bGUgaWYgdGhlIHRhcmdldCBlbGVtZW50IGNvbnRhaW5zIHRleHQsIGUuZy4sIDxwPiBmYWtlIGhlYWRpbmc8L3A+IFxuICAgICAgICAgICAgICAgICAgICBsZXQgc3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKG53Lm5vZGUucGFyZW50RWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZSAmJiAoc3R5bGVbJ2ZvbnQtd2VpZ2h0J10gPT09ICdib2xkJyB8fCBzdHlsZVsnZm9udC13ZWlnaHQnXSA+PSA3MDBcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8ICAoc3R5bGVbJ2ZvbnQtc2l6ZSddICYmIHN0eWxlWydmb250LXNpemUnXS5pbmNsdWRlcyhcImxhcmdlXCIpKSBcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8IChzdHlsZVsnZm9udC1zaXplJ10gJiYgYm9keUZvbnQgIT09IDAgJiYgQ1NTVXRpbC5nZXRQaXhlbHNGcm9tU3R5bGUoc3R5bGVbJ2ZvbnQtc2l6ZSddLG53Lm5vZGUucGFyZW50RWxlbWVudCkgID4gYm9keUZvbnQpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5leHRTdHIgPSBudy5ub2RlLm5vZGVWYWx1ZS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB3YyA9IENvbW1vblV0aWwud29yZENvdW50KG5leHRTdHIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdjID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmRTdHIucHVzaChuZXh0U3RyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXBoYXNpemVkVGV4dCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZHNTZWVuICs9IHdjO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gd29yZHNTZWVuID4gbnVtV29yZHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIHRoaXMgbm9kZSBiZWNhdXNlIGl0J3MgZW1waGFzaXplZFxuICAgICAgICAgICAgICAgICAgICAgICAgbncuYkVuZFRhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbm9kZSBjb250YWluIHJlZ3VsYXIgdGV4dFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSAgIFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAobncubm9kZS5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgICAgIC8vIGZvciBlbGVtZW50IGNoaWxkXG4gICAgICAgICAgICAgICAgaWYgKG53TmFtZSA9PT0gXCJiXCIgfHwgbndOYW1lID09PSBcInN0cm9uZ1wiIHx8IG53TmFtZSA9PT0gXCJ1XCIgfHwgbndOYW1lID09PSBcImZvbnRcIikge1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgdGFyZ2V0IGVsZW1lbnQgY29udGFpbnMgZW1waGFzaXMgY2hpbGQsIGUuZy4sIDxwPjxzdHJvbmc+ZmFrZSBoZWFkaW5nPC9zdHJvbmc+PC9wPiBcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5leHRTdHIgPSBDb21tb25VdGlsLmdldElubmVyVGV4dChudy5ub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIGxldCB3YyA9IENvbW1vblV0aWwud29yZENvdW50KG5leHRTdHIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAod2MgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JkU3RyLnB1c2gobmV4dFN0cik7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbXBoYXNpemVkVGV4dCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3Jkc1NlZW4gKz0gd2M7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gd29yZHNTZWVuID4gbnVtV29yZHM7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNraXAgdGhpcyBub2RlIGJlY2F1c2UgaXQncyBlbXBoYXNpemVkXG4gICAgICAgICAgICAgICAgICAgIG53LmJFbmRUYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSB0aGUgZWxlbWVudCB3aGljaCBoYXMgYSByb2xlIGV4Y2VwdCAnZ2VuZXJpYycsICdwYXJhZ3JhcGgnIG9yICdzdHJvbmcnXG4gICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBhcHBsZXQgZWxlbWVudCB0aGF0IGlzIGRlcHJlY2F0ZWQgYW55d2F5XG4gICAgICAgICAgICAgICAgICAgIGxldCByb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKG53Lm5vZGUgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSAocm9sZSAhPT0gbnVsbCAmJiByb2xlICE9PSAnZ2VuZXJpYycgJiYgcm9sZSAhPT0gJ3BhcmFncmFwaCcgJiYgcm9sZSAhPT0gJ3N0cm9uZycpIHx8IG53TmFtZSA9PT0gXCJhcHBsZXRcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHdvcmRzU2VlbiA9PSAwKSBwYXNzZWQgPSB0cnVlO1xuICAgICAgICAvL2lnbm9yZSBpZiB0aGUgc3RyaW5nIGVuZHMgd2l0aCDigJw64oCdICDigJws4oCdICDigJwt4oCdICDigJw74oCdIG9yIOKAnC7igJ0gXG4gICAgICAgIGlmICghcGFzc2VkKSBwYXNzZWQgPSAvWzosO1xcLVxcLl0kLy50ZXN0KHdvcmRTdHIuam9pbihcIiBcIikudHJpbSgpKTtcbiAgICAgICAgXG4gICAgICAgIGlmIChwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfaGVhZGluZ1wiLCBbd29yZFN0ci5qb2luKFwiIFwiKV0pO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcbmltcG9ydCB7IENvbG9yVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbG9yVXRpbFwiO1xuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5pbXBvcnQgeyBDU1NVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ1NTVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgdGV4dF9jb250cmFzdF9zdWZmaWNpZW50OiBSdWxlID0ge1xuICAgIGlkOiBcInRleHRfY29udHJhc3Rfc3VmZmljaWVudFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIklCTUFfQ29sb3JfQ29udHJhc3RfV0NBRzJBQVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZmFpbF9jb250cmFzdFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcInBvdGVudGlhbF9zYW1lX2NvbG9yXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJJQk1BX0NvbG9yX0NvbnRyYXN0X1dDQUcyQUFfUFZcIjoge1xuICAgICAgICAgICAgXCJwYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF8xXCI6IFwicG90ZW50aWFsX2dyYXBoaWNfYmFja2dyb3VuZFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IGB0ZXh0X2NvbnRyYXN0X3N1ZmZpY2llbnQuaHRtbGAsXG4gICAgICAgICAgICBcInBhc3NcIjogYHRleHRfY29udHJhc3Rfc3VmZmljaWVudC5odG1sYCxcbiAgICAgICAgICAgIFwiZmFpbF9jb250cmFzdFwiOiBgdGV4dF9jb250cmFzdF9zdWZmaWNpZW50Lmh0bWxgLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfc2FtZV9jb2xvclwiOiBgdGV4dF9jb250cmFzdF9zdWZmaWNpZW50Lmh0bWxgLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfZ3JhcGhpY19iYWNrZ3JvdW5kXCI6IGB0ZXh0X2NvbnRyYXN0X3N1ZmZpY2llbnQuaHRtbGAsXG4gICAgICAgICAgICBcInBvdGVudGlhbF90ZXh0X3NoYWRvd1wiOiBgdGV4dF9jb250cmFzdF9zdWZmaWNpZW50Lmh0bWxgXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSBjb250cmFzdCByYXRpbyBvZiB0ZXh0IHdpdGggaXRzIGJhY2tncm91bmQgbXVzdCBtZWV0IFdDQUcgQUEgcmVxdWlyZW1lbnRzXCIsXG4gICAgICAgICAgICBcInBhc3NcIjogXCJUaGUgY29udHJhc3QgcmF0aW8gb2YgdGV4dCB3aXRoIGl0cyBiYWNrZ3JvdW5kIG1lZXRzIFdDQUcgQUEgcmVxdWlyZW1lbnRzXCIsXG4gICAgICAgICAgICBcImZhaWxfY29udHJhc3RcIjogXCJUZXh0IGNvbnRyYXN0IG9mIHswfSB3aXRoIGl0cyBiYWNrZ3JvdW5kIGlzIGxlc3MgdGhhbiB0aGUgV0NBRyBBQSBtaW5pbXVtIHJlcXVpcmVtZW50cyBmb3IgdGV4dCBvZiBzaXplIHsxfXB4IGFuZCB3ZWlnaHQgb2YgezJ9XCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9zYW1lX2NvbG9yXCI6IFwiVGhlIGZvcmVncm91bmQgdGV4dCBhbmQgaXRzIGJhY2tncm91bmQgY29sb3IgYXJlIGJvdGggZGV0ZWN0ZWQgYXMgezN9LiBWZXJpZnkgdGhlIHRleHQgbWVldHMgdGhlIFdDQUcgQUEgcmVxdWlyZW1lbnRzIGZvciBtaW5pbXVtIGNvbnRyYXN0XCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9ncmFwaGljX2JhY2tncm91bmRcIjogXCJWZXJpZnkgdGhlIGNvbnRyYXN0IHJhdGlvIG9mIHRoZSB0ZXh0IGFnYWluc3QgdGhlIGxpZ2h0ZXN0IGFuZCB0aGUgZGFya2VzdCBjb2xvcnMgb2YgdGhlIGJhY2tncm91bmQgbWVldHMgdGhlIFdDQUcgQUEgbWluaW11bSByZXF1aXJlbWVudHMgZm9yIHRleHQgb2Ygc2l6ZSB7MX1weCBhbmQgd2VpZ2h0IG9mIHsyfVwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfdGV4dF9zaGFkb3dcIjogXCJWZXJpZnkgdGhlIGNvbnRyYXN0IHJhdGlvIG9mIHRoZSB0ZXh0IHdpdGggc2hhZG93IG1lZXRzIHRoZSBXQ0FHIEFBIG1pbmltdW0gcmVxdWlyZW1lbnRzIGZvciB0ZXh0IG9mIHNpemUgezF9cHggYW5kIHdlaWdodCBvZiB7Mn1cIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgbnVtOiBcIjEuNC4zXCIsIC8vIG51bTogWyBcIjIuNC40XCIsIFwieC55LnpcIiBdIGFsc28gYWxsb3dlZFxuICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbJ2FmdzRmNyddLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAvLyBhdm9pZCBkaWFnbm9zaW5nIGVsZW1lbnRzIHRoYXQgYXJlIG5vdCB2aXNpYmxlXG4gICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKHJ1bGVDb250ZXh0KSB8fFxuICAgICAgICAgICAgKFZpc1V0aWwuaGlkZGVuQnlEZWZhdWx0RWxlbWVudHMgIT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgIFZpc1V0aWwuaGlkZGVuQnlEZWZhdWx0RWxlbWVudHMgIT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgVmlzVXRpbC5oaWRkZW5CeURlZmF1bHRFbGVtZW50cy5pbmRleE9mKG5vZGVOYW1lKSA+IC0xKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vVE9ETyA/IHNob3VsZCBvbmx5IGNvbnNpZGVyIG5hdGl2ZSBkaXNhYmxlZCwgaWdub3JlIGFyaWEtZGlzYWJsZWRcbiAgICAgICAgLy9za2lwIGRpc2FibGVkIGVsZW1lbnRcbiAgICAgICAgaWYgKENvbW1vblV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy9za2lwIGVsZW1lbnRzXG4gICAgICAgIGlmIChDb21tb25VdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBbXCJzdmdcIiwgXCJzY3JpcHRcIiwgXCJtZXRhXCIsIFwic3R5bGVcIl0pKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgbGV0IGRvYyA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQ7XG4gICAgICAgIGlmICghZG9jKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIFxuICAgICAgICBsZXQgd2luID0gZG9jLmRlZmF1bHRWaWV3O1xuICAgICAgICBpZiAoIXdpbikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGlzIGVsZW1lbnQgaGFzIGNoaWxkcmVuIHdpdGggYWN0dWFsIHRleHQuXG4gICAgICAgIGxldCBjaGlsZFN0ciA9IENvbW1vblV0aWwuZ2V0Tm9kZVRleHQocnVsZUNvbnRleHQpO1xuICAgICAgICBcbiAgICAgICAgaWYgKCFDb21tb25VdGlsLmlzU2hhZG93SG9zdEVsZW1lbnQocnVsZUNvbnRleHQpIHx8IChDb21tb25VdGlsLmlzU2hhZG93SG9zdEVsZW1lbnQocnVsZUNvbnRleHQpICYmIENvbW1vblV0aWwuZ2V0Tm9kZVRleHQocnVsZUNvbnRleHQuc2hhZG93Um9vdCkgPT09ICcnKSkge1xuICAgICAgICAgICAgaWYgKGNoaWxkU3RyLnRyaW0oKS5sZW5ndGggPT0gMCApXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIGlnbm9yZSBpZiB0aGUgdGV4dCBkb2VzIG5vdCBjb252ZXkgYW55dGhpbmcgaW4gaHVtYW4gbGFuZ3VhZ2VcbiAgICAgICAgICAgIC8qKiBcbiAgICAgICAgICAgICAqICgxKSBpZ25vcmUgbm9uLWFscGhhbnVtZXJpYyBvciBzcGVjaWFsIGNoYXJhY3RlcnMgaW4gQVNDSTogXihhLXpBLVpcXGRcXHMpXG4gICAgICAgICAgICAgKiAoMikgaWdub3JlIG5vbi1wcmludGFibGUgdW5pY29kZSBjaGFyYWN0ZXJzOiBcXHUwMDAwLVxcdTAwMDhcXHUwMDBCLVxcdTAwMUZcXHUwMDdGLVxcdTAwOUZcXHUyMDAwLVxcdTIwMEZcXHUyMDI4LVxcdTIwMkZcXHUyMDVGLVxcdTIwNkZcXHUzMDAwXFx1RkVGRlxuICAgICAgICAgICAgICogIHNlZSBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8zNzcwMTE3L3doYXQtaXMtdGhlLXJhbmdlLW9mLXVuaWNvZGUtcHJpbnRhYmxlLWNoYXJhY3RlcnNcbiAgICAgICAgICAgICAqICgzKSBmb3Igbm93IG5vdCBjb25zaWRlciB1bmljb2RlIHNwZWNpYWwgY2hhcmFjdGVycyB0aGF0IGFyZSBkaWZmZXJlbnQgaW4gZGlmZmVyZW50IGxhbmd1YWdlc1xuICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIC8vbGV0IHJlZ2V4ID0gL1teKGEtekEtWlxcZFxccylcXHUwMDAwLVxcdTAwMDhcXHUwMDBCLVxcdTAwMUZcXHUwMDdGLVxcdTAwOUZcXHUyMDAwLVxcdTIwMEZcXHUyMDI4LVxcdTIwMkZcXHUyMDVGLVxcdTIwNkZcXHUzMDAwXFx1RkVGRl0rL2c7XG4gICAgICAgICAgICBsZXQgcmVnZXggPSAvW14oYS16QS1aXFxkXFxzKVxcXihcXHU0ZTAwLVxcdTlmZmZcXHUzNDAwLVxcdTRkYmYpXFx1MDAwMC1cXHUwMDA4XFx1MDAwQi1cXHUwMDFGXFx1MDA3Ri1cXHUwMDlGXFx1MjAwMC1cXHUyMDBGXFx1MjAyOC1cXHUyMDJGXFx1MjA1Ri1cXHUyMDZGXFx1MzAwMFxcdUZFRkZdKy9nO1xuICAgICAgICAgICAgY2hpbGRTdHIgPSBjaGlsZFN0ci50cmltKCkucmVwbGFjZShyZWdleCwgJycpO1xuICAgICAgICAgICAgaWYgKGNoaWxkU3RyLnRyaW0oKS5sZW5ndGggPT09IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZWxlbSA9IHJ1bGVDb250ZXh0O1xuICAgICAgICAvLyB0aGUgY2hpbGQgZWxlbWVudHMgKHJhdGhlciB0aGFuIHNoYWRvdyByb290KSBvZiBhIHNoYWRvdyBob3N0IGlzIGVpdGhlciByZS1hc3NpZ25lZCB0byB0aGUgc2hhZG93IHNsb3QgaWYgdGhlIHNsb3QgZXhpc3RzIFxuICAgICAgICAvLyBvciBub3QgZGlzcGxheWVkLCBzbyBzaG91bGRuJ3QgYmUgY2hlY2tlZCBmcm9tIHRoZSBsaWdodCBET00sIHJhdGhlciBpdCBzaG91bGQgYmUgY2hlY2tlZCBhcyByZWFzc2dpbmdlZCBzbG90IGVsZW1lbnQocykgaW4gdGhlIHNoYWRvdyBET00uXG4gICAgICAgIGlmIChDb21tb25VdGlsLmlzU2hhZG93SG9zdEVsZW1lbnQocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICAvLyBpZiBpdCdzIGRpcmVjdCB0ZXh0IG9mIGEgc2hhZG93IGhvc3RcbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5zaGFkb3dSb290KSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgbm9kZT1ydWxlQ29udGV4dC5maXJzdENoaWxkOyBub2RlOyBub2RlPW5vZGUubmV4dFNpYmxpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGU9PTMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgbXVsdGlwbGUgdGV4dHMgZXhpc3QsIG9ubHkgbmVlZCB0byBjaGVjayBvbmUgXG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtID0gKG5vZGUgYXMgVGV4dCkuYXNzaWduZWRTbG90O1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH0gICBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZWxlbSA9PT0gbnVsbCkgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBsZXQgc3R5bGUgPSB3aW4uZ2V0Q29tcHV0ZWRTdHlsZShlbGVtKTtcbiAgICAgICAgXG4gICAgICAgIC8vIEpDSCBjbGlwIElORk86XG4gICAgICAgIC8vICAgICAgVGhlIGNsaXAgcHJvcGVydHkgbGV0cyB5b3Ugc3BlY2lmeSBhIHJlY3RhbmdsZSB0byBjbGlwIGFuIGFic29sdXRlbHkgcG9zaXRpb25lZCBlbGVtZW50LiBcbiAgICAgICAgLy8gICAgICBUaGUgcmVjdGFuZ2xlIHNwZWNpZmllZCBhcyBmb3VyIGNvb3JkaW5hdGVzLCBhbGwgZnJvbSB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBlbGVtZW50IHRvIGJlIGNsaXBwZWQuXG4gICAgICAgIC8vICAgICAgUHJvcGVydHkgdmFsdWVzOlxuICAgICAgICAvLyAgICAgICAgICBub25lICAgICAgICBUaGlzIGlzIGRlZmF1bHQuIE5vIGNsaXBwaW5nIGlzIGRvbmVcbiAgICAgICAgLy8gICAgICAgICAgYXV0byAgICAgICAgTm8gY2xpcHBpbmcgd2lsbCBiZSBkb25lXG4gICAgICAgIC8vICAgICAgICAgIHNoYXBlICAgICAgIFRoZSBvbmx5IHZhbGlkIHZhbHVlIGlzOiByZWN0ICh0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnQpXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgIGUuZy4sIGNsaXA6IHJlY3QoMTBweCwgMjBweCwgMzBweCwgNDBweCk7XG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IHRoZSBmb3VyIHZhbHVlcyBhcmUgaW4gdGhlIHNhbWUgb3JkZXIgYXMgbWFyZ2luL3BhZGRpbmdcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgVGhlIHJlY3QgdmFsdWVzIGFyZSBwb3NpdGl2ZSBwaXhlbCB2YWx1ZXMsIGUuZy4sIDEwcHgsIGV0Yy5cbiAgICAgICAgLy8gICAgICAgICAgbWFyZ2luLWJveCAgVXNlcyB0aGUgbWFyZ2luIGJveCBhcyB0aGUgcmVmZXJlbmNlIGJveFxuICAgICAgICAvLyAgICAgICAgICBib3JkZXItYm94ICBVc2VzIHRoZSBib3JkZXIgYm94IGFzIHRoZSByZWZlcmVuY2UgYm94XG4gICAgICAgIC8vICAgICAgICAgIHBhZGRpbmctYm94IFVzZXMgdGhlIHBhZGRpbmcgYm94IGFzIHRoZSByZWZlcmVuY2UgYm94XG4gICAgICAgIC8vICAgICAgICAgIGNvbnRlbnQtYm94XG4gICAgICAgIC8vICAgICAgICAgIGZpbGwtYm94XG4gICAgICAgIC8vICAgICAgICAgIHN0cm9rZS1ib3hcbiAgICAgICAgLy8gICAgICBOT1RFOiB0aGUgQ1NTIGNsaXAgcHJvcGVydHkgaXMgZGVwcmVjYXRlZFxuICAgICAgICAvLyAgICAgIEFsc286IGNsaXAgb25seSB3b3JrcyBpZiB0aGUgZWxlbWVudCBpcyBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQgYW5kIGNhbiBvbmx5IGRvIHJlY3RhbmdsZXNcbiAgICAgICAgLy8gY2hlY2sgaWYgZWxlbWVudCB2aXNpYmxlXG4gICAgICAgIGxldCB2aXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgaWYgKHN0eWxlLndpZHRoICE9PSBcIjBcIiAmJlxuICAgICAgICAgICAgc3R5bGUuaGVpZ2h0ICE9PSBcIjBcIiAmJlxuICAgICAgICAgICAgc3R5bGUub3BhY2l0eSAhPT0gXCIwXCIgJiZcbiAgICAgICAgICAgIHN0eWxlLmRpc3BsYXkgIT09ICdub25lJyAmJlxuICAgICAgICAgICAgc3R5bGUudmlzaWJpbGl0eSAhPT0gJ2hpZGRlbicgJiZcbiAgICAgICAgICAgIHN0eWxlLm92ZXJmbG93ICE9PSAnaGlkZGVuJyAmJlxuICAgICAgICAgICAgLy8gbGVmdCBhbmQgcmlnaHQgd29yayB3aXRoIGFsbCBhYnNvbHV0ZSB1bml0c1xuICAgICAgICAgICAgKHN0eWxlLmxlZnQgPT09IFwiYXV0b1wiIHx8IChzdHlsZS5wb3NpdGlvbiA9PT0gJ2Fic29sdXRlJyAmJiBwYXJzZUludChzdHlsZS5sZWZ0LnJlcGxhY2UoL1teMC05ListXS8sICcnKSkgPiAwKSkgJiZcbiAgICAgICAgICAgIChzdHlsZS5sZWZ0ID09PSBcImF1dG9cIiB8fCAoc3R5bGUucG9zaXRpb24gPT09ICdhYnNvbHV0ZScgJiYgcGFyc2VJbnQoc3R5bGUudG9wLnJlcGxhY2UoL1teMC05ListXS8sICcnKSkgPiAwKSkpIHtcbiAgICAgICAgICAgIHZpc2libGUgPSB0cnVlO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJlbGVtZW50IElTIHZpc2libGVcIik7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkNIRUNLIENPTE9SIENPTlRSQVNUIHVubGVzcyB0byBzbWFsbFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZpc2libGUgPSBmYWxzZTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiZWxlbWVudCBOT1QgdmlzaWJsZVwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmlzaWJsZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiRE8gTk9UIENIRUNLIENPTE9SIENPTlRSQVNUXCIpO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuXG4gICAgICAgIGxldCBjbGlwSGVpZ2h0ID0gLTE7XG4gICAgICAgIGlmIChzdHlsZS5jbGlwICE9PSBcImF1dG9cIikge1xuICAgICAgICAgICAgbGV0IGNsaXBTdHJpbmcgPSBzdHlsZS5jbGlwLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBpZiAoY2xpcFN0cmluZy5pbmNsdWRlcyhcInJlY3RcIikpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVCcmFja2V0cyA9IC9cXCgoLiopXFwpL2c7XG4gICAgICAgICAgICAgICAgdmFyIGxpc3RPZlRleHQgPSBbXTtcbiAgICAgICAgICAgICAgICB2YXIgZm91bmQgPSByZUJyYWNrZXRzLmV4ZWMoY2xpcFN0cmluZyk7XG4gICAgICAgICAgICAgICAgdmFyIGZvdW5kQXJyID0gZm91bmRbMV0uc3BsaXQoJywgJyk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmb3VuZEFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImZvdW5kQXJyW1wiLGksXCJdID0gXCIsZm91bmRBcnJbaV0pO1xuICAgICAgICAgICAgICAgICAgICBsaXN0T2ZUZXh0LnB1c2goZm91bmRBcnJbaV0pO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImxpc3RPZlRleHQgPSBcIixsaXN0T2ZUZXh0KTtcbiAgICAgICAgICAgIGNsaXBIZWlnaHQgPSBwYXJzZUludChsaXN0T2ZUZXh0WzBdLnJlcGxhY2UoL3B4L2csICcnKSkgLSBwYXJzZUludChsaXN0T2ZUZXh0WzJdLnJlcGxhY2UoL3B4L2csICcnKSk7XG4gICAgICAgICAgICBjbGlwSGVpZ2h0ID0gTWF0aC5hYnMoY2xpcEhlaWdodCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBKQ0ggY2xpcC1wYXRoIElORk86XG4gICAgICAgIC8vICAgICAgRXhjZWxsZW50IGFydGljbGUgb24gY2xpcC1wYXRoOiBodHRwczovL2lzaGFkZWVkLmNvbS9hcnRpY2xlL2NsaXAtcGF0aC9cbiAgICAgICAgLy8gICAgICBjbGlwLXBhdGggaXMgYSB0b3RhbGx5IGRpZmZlcmVudCBhbmltYWwgd2l0aCBtYW55LCBtYW55IGRpZmZlcmVudCB2YXJpYXRpb25zXG4gICAgICAgIC8vICAgICAgVGhlIGdvYWwgd2FzIGZvciBpdCB0byBub3QgYmUgYXMgbGltaXRlZCBhcyBjbGlwXG4gICAgICAgIC8vICAgICAgVGhlIHN5bnRheCBpcyBtb3JlIGNvbXBsaWNhdGVkIChhcyBpdCBkb2VzIG1vcmUpIGFuZCBpdCBpcyBkaWZmZXJlbnQgZnJvbSBjbGlwLFxuICAgICAgICAvLyAgICAgIGUuZy4sIHRoZSBhYm92ZSBjbGlwIHJlY3RhbmdsZSB3b3VsZCBiZSBjbGlwLXBhdGg6IGluc2V0KDEwcHggMjBweCAzMHB4IDQwcHgpO1xuICAgICAgICAvLyAgICAgIE5vdGU6IHRoZXJlIGFyZSBubyBjb21tYXNcbiAgICAgICAgLy8gICAgICBBbHNvLCBpdCBjYW4gdGFrZSBzaW5nbGUgdmFsdWVzIHRvIG1ha2UgYWxsIHNpZGVzIHRoZSBzYW1lLCBvciAyIHZhbHVlcyAodmVydC9ob3JpKS5cbiAgICAgICAgLy8gICAgICBvciAzIHZhbHVlcyAodG9wL2hvcmkvYm90dG9tKVxuICAgICAgICAvLyAgICAgIEFuZCBwZXJjZW50YWdlcyBjYW4gd29ya3MgYXMgd2VsbCBhcyBweFxuICAgICAgICAvLyAgICAgIFxuICAgICAgICAvLyAgICAgIEFsdGhvdWdoIHRoZXJlIGFyZSBmaXZlIGRpZmZlcmVudCBzaGFwZXM6IGluc2V0ICh0ZXJtIHVzZWQgZm9yIHJlY3RhbmdsZSksIGNpcmNsZSxcbiAgICAgICAgLy8gICAgICAgICAgZWxsaXBzZSwgcG9seWdvbiwgcGF0aCAtIHdlIHdpbGwgb25seSBjb25jZXJuIG91cnNlbHZlcyB3aXRoIGluc2V0XG4gICAgICAgIC8vICAgICAgVGhlcmUgYXJlIDcgYm94IHZhbHVlczogbWFyZ2luLWJveCwgYm9yZGVyLWJveCwgcGFkZGluZy1ib3gsIGNvbnRlbnQtYm94LCBmaWxsLWJveCwgc3Ryb2tlLWJveCwgdmlldy1ib3hcbiAgICAgICAgLy8gICAgICBCb3ggYW5kIHNoYXBlIHZhbHVlcyBtYXkgYmUgY29tYmluZWQ6IGNsaXAtcGF0aDogcGFkZGluZy1ib3ggY2lyY2xlKDUwcHggYXQgMCAxMDBweCk7XG4gICAgICAgIC8vICAgICAgTk9URTogdGhlIGJveCB2YWx1ZXMgYXJlIE5PVCBpbnR1aXRpdmUsIHNlZTogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL0NTU19TaGFwZXMvRnJvbV9ib3hfdmFsdWVzI21hcmdpbi1ib3hcbiAgICAgICAgLy8gICAgICBcbiAgICAgICAgLy8gICAgICBTbyB0aGUga2V5IHF1ZXN0aW9uIGlzIHdoYXQgYW1vdW50IG9mIGVmZm9ydCBkbyB3ZSB3YW50IHRvIGludmVzdCBpbnRvIGNsaXAtcGF0aFxuICAgICAgICAvLyBcblxuICAgICAgICAvLyBKQ0ggZG9uJ3QgZG8gY2xpcC1wYXRoIG5vdyBcbiAgICAgICAgbGV0IGNsaXBQYXRoSGVpZ2h0ID0gLTE7XG4gICAgICAgIC8vIGlmIChzdHlsZS5jbGlwUGF0aCAhPT0gXCJhdXRvXCIpIHtcbiAgICAgICAgLy8gICAgIGNvbnNvbGUubG9nKFwic3R5bGUuY2xpcFBhdGggPSBcIixzdHlsZS5jbGlwUGF0aCk7XG4gICAgICAgIC8vICAgICBjb25zb2xlLmxvZyhcInN0eWxlLmNsaXBQYXRoLnRvU3RyaW5nID0gXCIsc3R5bGUuY2xpcFBhdGgudG9TdHJpbmcoKSk7XG4gICAgICAgIC8vICAgICBsZXQgY2xpcFN0cmluZyA9IHN0eWxlLmNsaXBQYXRoLnRvU3RyaW5nKCk7XG4gICAgICAgIC8vICAgICBpZiAoY2xpcFN0cmluZy5pbmNsdWRlcyhcImluc2V0XCIpKSB7XG4gICAgICAgIC8vICAgICAgICAgdmFyIHJlQnJhY2tldHMgPSAvXFwoKC4qKVxcKS9nO1xuICAgICAgICAvLyAgICAgICB2YXIgbGlzdE9mVGV4dCA9IFtdO1xuICAgICAgICAvLyAgICAgICB2YXIgZm91bmQgPSByZUJyYWNrZXRzLmV4ZWMoY2xpcFN0cmluZyk7XG4gICAgICAgIC8vICAgICAgIHZhciBmb3VuZEFyciA9IGZvdW5kWzFdLnNwbGl0KCcgJyk7XG4gICAgICAgIC8vICAgICAgIGZvciAobGV0IGk9MDsgaTxmb3VuZEFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICAvLyAgICAgICAgIGNvbnNvbGUubG9nKFwiZm91bmRBcnJbXCIsaSxcIl0gPSBcIixmb3VuZEFycltpXSk7XG4gICAgICAgIC8vICAgICAgICAgbGlzdE9mVGV4dC5wdXNoKGZvdW5kQXJyW2ldKTtcbiAgICAgICAgLy8gICAgICAgfTtcbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gICAgIGNvbnNvbGUubG9nKFwibGlzdE9mVGV4dCA9IFwiLGxpc3RPZlRleHQpO1xuICAgICAgICAvLyBjbGlwUGF0aEhlaWdodCA9IHBhcnNlSW50KGxpc3RPZlRleHRbMF0ucmVwbGFjZSgvcHgvZywgJycpKSAtIHBhcnNlSW50KGxpc3RPZlRleHRbMl0ucmVwbGFjZSgvcHgvZywgJycpKTtcbiAgICAgICAgLy8gY2xpcFBhdGhIZWlnaHQgPSBNYXRoLmFicyhjbGlwSGVpZ2h0KTtcbiAgICAgICAgLy8gfVxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcImNsaXBQYXRoSGVpZ2h0ID0gXCIsIGNsaXBQYXRoSGVpZ2h0KTtcblxuICAgICAgICAvLyBpZiAoc3R5bGUucG9zaXRpb24gPT09IFwiYWJzb2x1dGVcIiAmJiBzdHlsZS5jbGlwID09PSBcInJlY3QoMHB4LCAwcHgsIDBweCwgMHB4KVwiICYmIHN0eWxlLm92ZXJmbG93ICE9PSBcInZpc2libGVcIikge1xuICAgICAgICAvLyBKQ0ggYXJiaXRyYXJpbHkgdXNlIGxlc3MgdGhhdCA3cHggZm9yIGNsaXBIZWlnaHRcbiAgICAgICAgaWYgKHN0eWxlLnBvc2l0aW9uID09PSBcImFic29sdXRlXCIgJiYgY2xpcEhlaWdodCA8IDcgJiYgY2xpcEhlaWdodCAhPT0gLTEpIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiRE8gTk9UIENIRUNLIENPTE9SIENPTlRSQVNUIGJlY2F1c2UgdG9vIHNtYWxsXCIpO1xuICAgICAgICAgICAgLy8gQ29ybmVyIGNhc2Ugd2hlcmUgaXRlbSBpcyBoaWRkZW4gKGFjY2Vzc2liaWxpdHkgaGlkaW5nIHRlY2huaXF1ZSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBGaXJzdCBkZXRlcm1pbmUgdGhlIGNvbG9yIGNvbnRyYXN0IHJhdGlvXG4gICAgICAgIGxldCBjb2xvckNvbWJvID0gQ29sb3JVdGlsLkNvbG9yQ29tYm8oZWxlbSk7XG4gICAgICAgIGlmIChjb2xvckNvbWJvID09PSBudWxsKSB7XG4gICAgICAgICAgICAvL3NvbWUgZXhjZXB0aW9uIG9jY3VycmVkLCBvciBub3QgYWJsZSB0byBnZXQgY29sb3IgY29tYm8gZm9yIHNvbWUgcmVhc29uXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcInVuYWJsZSB0byBnZXQgY29sb3IgY29tYm8gZm9yIGVsZW1lbnQ6IFwiICsgZWxlbS5ub2RlTmFtZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGZnID0gY29sb3JDb21iby5mZztcbiAgICAgICAgbGV0IGJnID0gY29sb3JDb21iby5iZztcbiAgICAgICAgbGV0IHJhdGlvID0gZmcuY29udHJhc3RSYXRpbyhiZyk7XG4gICAgICAgIGxldCB3ZWlnaHQgPSBDU1NVdGlsLmdldFdlaWdodE51bWJlcihzdHlsZS5mb250V2VpZ2h0KTtcbiAgICAgICAgbGV0IHNpemUgPSBDU1NVdGlsLmdldEZvbnRJblBpeGVscyhzdHlsZS5mb250U2l6ZSwgZWxlbSk7XG4gICAgICAgIGxldCBpc0xhcmdlU2NhbGUgPSBzaXplID49IDI0IHx8IHNpemUgPj0gMTguNiAmJiB3ZWlnaHQgPj0gNzAwO1xuICAgICAgICBcbiAgICAgICAgaWYgKENTU1V0aWwuY29udGFpbnNDS0ooY2hpbGRTdHIpKSB7XG4gICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYWN0LXJ1bGVzL2FjdC1ydWxlcy5naXRodWIuaW8vcHVsbC8yMTIxL2ZpbGVzXG4gICAgICAgICAgICAvLyBmb3IgQ0pLLCAyMiBwdCBvciAxOCBwdCB3aXRoIGZvbnQtd2VpZ2h0ID49IDcwMCwgMXB0ID0gMS4zMzMgcHhcbiAgICAgICAgICAgIGlzTGFyZ2VTY2FsZSA9IHNpemUgPj0gMjkuMyB8fCBzaXplID49IDI0ICYmIHdlaWdodCA+PSA3MDA7XG4gICAgICAgIH0gICAgXG4gICAgICAgIGxldCBwYXNzZWQgPSByYXRpbyA+PSA0LjUgfHwgKHJhdGlvID49IDMgJiYgaXNMYXJnZVNjYWxlKTtcbiAgICAgICAgbGV0IGhhc0JhY2tncm91bmQgPSBjb2xvckNvbWJvLmhhc0JHSW1hZ2UgfHwgY29sb3JDb21iby5oYXNHcmFkaWVudDtcbiAgICAgICAgbGV0IHRleHRTaGFkb3cgPSBjb2xvckNvbWJvLnRleHRTaGFkb3c7XG4gICAgICAgIGxldCBpc0Rpc2FibGVkID0gQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChlbGVtKTtcbiAgICAgICAgaWYgKCFpc0Rpc2FibGVkKSB7XG4gICAgICAgICAgICBsZXQgY29udHJvbCA9IENvbW1vblV0aWwuZ2V0Q29udHJvbE9mTGFiZWwoZWxlbSk7XG4gICAgICAgICAgICBpZiAoY29udHJvbCkge1xuICAgICAgICAgICAgICAgIGlzRGlzYWJsZWQgPSBDb21tb25VdGlsLmlzTm9kZURpc2FibGVkKGNvbnRyb2wpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZiAoIWlzRGlzYWJsZWQgJiYgbm9kZU5hbWUgPT09ICdsYWJlbCcgJiYgQ29tbW9uVXRpbC5pc0Rpc2FibGVkQnlGaXJzdENoaWxkRm9ybUVsZW1lbnQoZWxlbSkpIHtcbiAgICAgICAgICAgIGlzRGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc0Rpc2FibGVkICYmIHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImlkXCIpICYmIENvbW1vblV0aWwuaXNEaXNhYmxlZEJ5UmVmZXJyaW5nRWxlbWVudChlbGVtKSkge1xuICAgICAgICAgICAgaXNEaXNhYmxlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvKipzZXRDYWNoZShydWxlQ29udGV4dCwgXCJFWFRfQ29sb3JfQ29udHJhc3RfV0NBRzJBQVwiLCB7XG4gICAgICAgICAgICBcInJhdGlvXCI6IHJhdGlvLFxuICAgICAgICAgICAgXCJpc0xhcmdlU2NhbGVcIjogaXNMYXJnZVNjYWxlLFxuICAgICAgICAgICAgXCJ3ZWlnaHRcIjogd2VpZ2h0LFxuICAgICAgICAgICAgXCJzaXplXCI6IHNpemUsXG4gICAgICAgICAgICBcImhhc0JhY2tncm91bmRcIjogaGFzQmFja2dyb3VuZCxcbiAgICAgICAgICAgIFwiaXNEaXNhYmxlZFwiOiBpc0Rpc2FibGVkXG4gICAgICAgIH0pOyovXG4gICAgICAgIFxuICAgICAgICAvLyBJZiBlbGVtZW50IG9yIHBhcmVudCBpcyBkaXNhYmxlZCwgdGhpcyBydWxlIGRvZXMgbm90IGFwcGx5IChidXQgbWF5IGJlIDM6MSBpbiBmdXR1cmUpXG4gICAgICAgIGlmICghcGFzc2VkICYmIGlzRGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIGlmIChoYXNCYWNrZ3JvdW5kKSB7XG4gICAgICAgICAgICAgICAgLy8gZmlyZSBwb3RlbnRpYWwgc2luY2UgYSB0ZXh0IG9uIGFuIGltYWdlIG9yIGdyYWRpZW50IG1heSBiZSBzdGlsbCB2aWV3YWJsZSwgZGVwZW5kaW5nIG9uIHRoZSB0ZXh0IGxvY2F0aW9uIG9uIHRoZSBncmFkaWVudCBvciBpbWFnZVxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX2dyYXBoaWNfYmFja2dyb3VuZFwiLCBbcmF0aW8udG9GaXhlZCgyKSwgc2l6ZSwgd2VpZ2h0XSk7O1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0ZXh0U2hhZG93KSB7XG4gICAgICAgICAgICAgICAgLy8gZmlyZSBwb3RlbnRpYWwgc2luY2UgYSB0ZXh0IHdpdGggc2hhZG93IG1heSBiZSBzdGlsbCB2aWV3YWJsZSwgZGVwZW5kaW5nIG9uIHRoZSBzaGFkb3cgZWZmZmVjdHNcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF90ZXh0X3NoYWRvd1wiLCBbcmF0aW8udG9GaXhlZCgyKSwgc2l6ZSwgd2VpZ2h0XSk7O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoZmcudG9IZXgoKSA9PT0gYmcudG9IZXgoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF9zYW1lX2NvbG9yXCIsIFtyYXRpby50b0ZpeGVkKDIpLCBzaXplLCB3ZWlnaHQsIGZnLnRvSGV4KCksIGJnLnRvSGV4KCksIGNvbG9yQ29tYm8uaGFzQkdJbWFnZSwgY29sb3JDb21iby5oYXNHcmFkaWVudF0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfY29udHJhc3RcIiwgW3JhdGlvLnRvRml4ZWQoMiksIHNpemUsIHdlaWdodCwgZmcudG9IZXgoKSwgYmcudG9IZXgoKSwgY29sb3JDb21iby5oYXNCR0ltYWdlLCBjb2xvckNvbWJvLmhhc0dyYWRpZW50XSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSAgICBcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIiwgW3JhdGlvLnRvRml4ZWQoMiksIHNpemUsIHdlaWdodCwgZmcudG9IZXgoKSwgYmcudG9IZXgoKSwgY29sb3JDb21iby5oYXNCR0ltYWdlLCBjb2xvckNvbWJvLmhhc0dyYWRpZW50XSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCB0ZXh0X3F1b3RlZF9jb3JyZWN0bHk6IFJ1bGUgPSB7XG4gICAgaWQ6IFwidGV4dF9xdW90ZWRfY29ycmVjdGx5XCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInRleHRfcXVvdGVkX2NvcnJlY3RseS5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwidGV4dF9xdW90ZWRfY29ycmVjdGx5Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJ0ZXh0X3F1b3RlZF9jb3JyZWN0bHkuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIklmIHRoZSBmb2xsb3dpbmcgdGV4dCBpcyBhIHF1b3RhdGlvbiwgbWFyayBpdCBhcyBhIDxxPiBvciA8YmxvY2txdW90ZT4gZWxlbWVudDogezB9XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiUXVvdGF0aW9ucyBzaG91bGQgYmUgbWFya2VkIHdpdGggPHE+IG9yIDxibG9ja3F1b3RlPiBlbGVtZW50c1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBpZ25vcmUgdGhlIGNoZWNrIGlmIHRoZSBub2RlIGlzIGhpZGRlblxuICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShydWxlQ29udGV4dCkgKSByZXR1cm4gbnVsbDtcbiAgICAgICAgLy8gRG9uJ3QgdHJpZ2dlciBpZiB0aGUgZWxlbWVudCBpcyBub3QgaW4gdGhlIGJvZHlcbiAgICAgICAgaWYgKENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFtcImJvZHlcIl0pID09PSBudWxsKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCB2YWxpZGF0ZVBhcmFtcyA9IHtcbiAgICAgICAgICAgIG1pbldvcmRzOiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IDMsXG4gICAgICAgICAgICAgICAgdHlwZTogXCJpbnRlZ2VyXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgbWluV29yZHMgPSB2YWxpZGF0ZVBhcmFtcy5taW5Xb3Jkcy52YWx1ZTtcblxuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgbGV0IHdhbGtOb2RlID0gcnVsZUNvbnRleHQuZmlyc3RDaGlsZCBhcyBOb2RlO1xuICAgICAgICBsZXQgdmlvbGF0ZWR0ZXh0ID0gbnVsbDtcbiAgICAgICAgLy8gaWdub3JlIHRoZSBjaGVjayBmb3IgdGhlIHRleHQgb2YgdGhlIGZvbGxvd2luZyBlbGVtZW50c1xuICAgICAgICBjb25zdCBpZ25vcmVkID0gW1wiYmxvY2txdW90ZVwiLCBcInFcIiwgXCJzY3JpcHRcIiwgXCJzdHlsZVwiLCBcInByZVwiLCBcImNvZGVcIiwgXCJydWJ5XCIsIFwic2FtcFwiXTtcbiAgICAgICAgd2hpbGUgKHBhc3NlZCAmJiB3YWxrTm9kZSkge1xuICAgICAgICAgICAgLy8gQ29tcGx5IHRvIHRoZSBDaGVjayBIaWRkZW4gQ29udGVudCBzZXR0aW5nIHdpbGwgYmUgZG9uZSBieSBkZWZhdWx0IGFzIHRoaXMgcnVsZSB0cmlnZ2VycyBvbiBlYWNoIGVsZW1lbnRcbiAgICAgICAgICAgIC8vIGFuZCBmb3IgZWFjaCBlbGVtZW50IGl0IG9ubHkgY2hlY2tzIHRoYXQgc2luZ2xlIGVsZW1lbnRzIHRleHQgbm9kZXMgYW5kIG5vdGhpbmcgZWxzZS4gU28gYWxsIGlubmVyIGVsZW1lbnRzIHdpbGwgYmVcbiAgICAgICAgICAgIC8vIGNvdmVyZWQgb24gdGhlaXIgb3duLiBDdXJyZW50bHkgZm9yIHRoaXMgcnVsZSBieSBkZWZhdWx0IENoZWNrIEhpZGRlbiBDb250ZW50IHdpbGwgd29yaywgYXMgd2UgYXJlIGRvaW5nXG4gICAgICAgICAgICAvLyBhIG5vZGUgd2FsayBvbmx5IG9uIHNpYmxpbmdzIHNvIGl0IHdvdWxkIG5vdCBnZXQgdGV4dCBub2RlcyBmcm9tIG90aGVyIHNpYmxpbmdzIGF0IGFsbC5cbiAgICAgICAgICAgIC8vIEluIHRoZSBjYXNlIGluIHRoZSBmdXR1cmUgc29tZXRoaW5nIGNobmdlcywganVzdCBuZWVkIHRvIGFkZCAmJiAhUlBUVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKHdhbGtOb2RlKSB0byB0aGUgYmVsb3dcbiAgICAgICAgICAgIC8vIGlmLlxuICAgICAgICAgICAgaWYgKHdhbGtOb2RlLm5vZGVOYW1lID09PSBcIiN0ZXh0XCIpIHtcbiAgICAgICAgICAgICAgICBsZXQgdHh0VmFsID0gd2Fsa05vZGUubm9kZVZhbHVlO1xuICAgICAgICAgICAgICAgIC8vIERvIHRoZSByZWdleCB0ZXN0cyBmaXJzdCAtIHNob3VsZCBiZSBmYXN0XG5cbiAgICAgICAgICAgICAgICAvLyBSZW1vdmUgYXBvc3Ryb3BoZSdzXG4gICAgICAgICAgICAgICAgdHh0VmFsID0gdHh0VmFsLnJlcGxhY2UoLyhcXFMpJyhcXFMpL2csIFwiJDEkMlwiKTtcbiAgICAgICAgICAgICAgICBsZXQgZGJsUXVvdGVzID0gdHh0VmFsLm1hdGNoKC8oXCJbXlwiXStcIikvZyk7XG4gICAgICAgICAgICAgICAgbGV0IHNuZ2xRdW90ZXMgPSB0eHRWYWwubWF0Y2goLygnW14nXSsnKS9nKTtcbiAgICAgICAgICAgICAgICAvLyBXYWxrIHRoZSBwYXJlbnRzIC0gb25seSBjb250aW51ZSB0ZXN0aW5nIGlmIHdlIGZvdW5kIGEgcXVvdGUsIGJ1dFxuICAgICAgICAgICAgICAgIC8vIHdlJ3JlIG5vdCBhbHJlYWR5IG1hcmtlZCB1cFxuICAgICAgICAgICAgICAgIC8vIEFsc28gc2tpcCBpZiB3ZSdyZSBpbiBhIHNjcmlwdCAtIHRoZXJlJ3MgbG90cyBvZiBxdW90ZXMgdXNlZCBpbiBzY3JpcHRzXG4gICAgICAgICAgICAgICAgaWYgKChkYmxRdW90ZXMgIT09IG51bGwgfHwgc25nbFF1b3RlcyAhPT0gbnVsbCkgJiZcbiAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5nZXRBbmNlc3Rvcih3YWxrTm9kZSwgaWdub3JlZCkgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRibFF1b3RlcyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgcGFzc2VkICYmIGkgPCBkYmxRdW90ZXMubGVuZ3RoOyArK2kpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gQ29tbW9uVXRpbC53b3JkQ291bnQoZGJsUXVvdGVzW2ldKSA8IG1pbldvcmRzO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChzbmdsUXVvdGVzICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBwYXNzZWQgJiYgaSA8IHNuZ2xRdW90ZXMubGVuZ3RoOyArK2kpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gQ29tbW9uVXRpbC53b3JkQ291bnQoc25nbFF1b3Rlc1tpXSkgPCBtaW5Xb3JkcztcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBhbnkgbGluZWZlZWQgaW5zaWRlIHRoZSBxdW90ZVxuICAgICAgICAgICAgICAgICAgICAvLyB2aW9sYXRlZHRleHQgPSB0eHRWYWwucmVwbGFjZShuZXcgUmVnRXhwKFwiXFxcXHI/XFxcXG58XFxcXHJcIixcImdcIiksXCJcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkYmxRdW90ZXMgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpb2xhdGVkdGV4dCA9IHNuZ2xRdW90ZXMuam9pbihcIiwgXCIpLnJlcGxhY2UobmV3IFJlZ0V4cChcIlxcXFxyP1xcXFxufFxcXFxyXCIsIFwiZ1wiKSwgXCJcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc25nbFF1b3RlcyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmlvbGF0ZWR0ZXh0ID0gZGJsUXVvdGVzLmpvaW4oXCIsIFwiKS5yZXBsYWNlKG5ldyBSZWdFeHAoXCJcXFxccj9cXFxcbnxcXFxcclwiLCBcImdcIiksIFwiXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmlvbGF0ZWR0ZXh0ID0gZGJsUXVvdGVzLmNvbmNhdChzbmdsUXVvdGVzKS5qb2luKFwiLCBcIikucmVwbGFjZShuZXcgUmVnRXhwKFwiXFxcXHI/XFxcXG58XFxcXHJcIiwgXCJnXCIpLCBcIlwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdhbGtOb2RlID0gd2Fsa05vZGUubmV4dFNpYmxpbmc7XG4gICAgICAgIH1cblxuICAgICAgICAvL2lmIHRoZSB2aW9sYXRlZHRleHQgaXMgbG9uZ2VyIHRoYW4gNjkgY2hhcnMsIG9ubHkga2VlcCB0aGUgZmlyc3QgMzIsIHRoZSBcIiAuLi4gXCIsIGFuZCB0aGUgbGFzdCAzMiBjaGFycyBcbiAgICAgICAgaWYgKCFwYXNzZWQgJiYgdmlvbGF0ZWR0ZXh0Lmxlbmd0aCAmJiB2aW9sYXRlZHRleHQubGVuZ3RoID4gNjkpIHtcbiAgICAgICAgICAgIHZpb2xhdGVkdGV4dCA9IHZpb2xhdGVkdGV4dC5zdWJzdHJpbmcoMCwgMzIpICsgXCIgLi4uIFwiICsgdmlvbGF0ZWR0ZXh0LnN1YnN0cmluZyh2aW9sYXRlZHRleHQubGVuZ3RoIC0gMzIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBhc3NlZCA/IFJ1bGVQYXNzKFwiUGFzc18wXCIpIDogUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIsIFt2aW9sYXRlZHRleHRdKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IHRleHRfc2Vuc29yeV9taXN1c2U6IFJ1bGUgPSB7XG4gICAgaWQ6IFwidGV4dF9zZW5zb3J5X21pc3VzZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmJvZHksIGRvbTpib2R5IGRvbToqXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfVGV4dF9TZW5zb3J5UmVmZXJlbmNlXCI6IHtcbiAgICAgICAgICAgIC8vIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcInBvdGVudGlhbF9wb3NpdGlvbiwgcG90ZW50aWFsX290aGVyXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgLy8gXCJwYXNzXCI6IFwidGV4dF9zZW5zb3J5X21pc3VzZS5odG1sXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9wb3NpdGlvblwiOiBcInRleHRfc2Vuc29yeV9taXN1c2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfb3RoZXJcIjogXCJ0ZXh0X3NlbnNvcnlfbWlzdXNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJ0ZXh0X3NlbnNvcnlfbWlzdXNlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIC8vIFwicGFzc1wiOiBcIkluc3RydWN0aW9ucyBhcmUgbWVhbmluZ2Z1bCB3aXRob3V0IHJlbHlpbmcgc29sZWx5IG9uIHNoYXBlLCBzaXplLCBvciBsb2NhdGlvbiB3b3Jkc1wiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfcG9zaXRpb25cIjogXCJDb25maXJtIHRoZSB3b3JkKHMpICd7MH0nIG9mIHRoZSB1c2VyIGluc3RydWN0aW9uIGlzIHVzZWQgdG8gaW5kaWNhdGUgYSBsb2dpY2FsIHJhdGhlciB0aGFuIHZpc3VhbCBwb3NpdGlvblwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfb3RoZXJcIjogXCJDb25maXJtIHRoZSB1c2VyIGluc3RydWN0aW9uIGlzIHN0aWxsIHVuZGVyc3RhbmRhYmxlIHdpdGhvdXQgdGhlIHdvcmQocykgJ3swfSdcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJJbnN0cnVjdGlvbnMgc2hvdWxkIGJlIG1lYW5pbmdmdWwgd2l0aG91dCByZWx5aW5nIHNvbGVseSBvbiBzaGFwZSwgc2l6ZSwgb3IgbG9jYXRpb24gd29yZHNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4zXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vIEV4dHJhY3QgdGhlIG5vZGVOYW1lIG9mIHRoZSBjb250ZXh0IG5vZGVcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIG9yIGRpc2FibGVkXG4gICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKHJ1bGVDb250ZXh0KSB8fCBDb21tb25VdGlsLmlzTm9kZURpc2FibGVkKHJ1bGVDb250ZXh0KSB8fCBWaXNVdGlsLmhpZGRlbkJ5RGVmYXVsdEVsZW1lbnRzLmluY2x1ZGVzKG5vZGVOYW1lKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgLy8gRG9uJ3QgdHJpZ2dlciBpZiB3ZSdyZSBub3QgaW4gdGhlIGJvZHkgb3IgaWYgd2UncmUgaW4gYSBzY3JpcHRcbiAgICAgICAgaWYgKENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFtcImJvZHlcIl0pID09PSBudWxsKSBcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgLy8gaWdub3JlIHNjcmlwdCwgbGluaywgbGFiZWwgYW5kIHRoZWlyIGNoaWxkIGVsZW1lbnRzXG4gICAgICAgIGlmIChDb21tb25VdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBbXCJzY3JpcHRcIiwgXCJhXCIsICdsYWJlbCddKSAhPT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgIFxuICAgICAgICAvLyBpZ25vcmUgdGV4dCBvbiBsYW5kbWFyayByb2xlcywgYnV0IG5vdCBvbiB0aGVpciBjaGlsZHJlbiAoZS5nLiwgc2VjdGlvbiwgbWFpbilcbiAgICAgICAgY29uc3Qgcm9sZSA9IEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZShydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChyb2xlKSB7XG4gICAgICAgICAgICBsZXQgbG1Sb2xlcyA9IEFyaWFVdGlsLmdldFJvbGVzV2l0aFR5cGVzKHJ1bGVDb250ZXh0LCBbXCJsYW5kbWFya1wiXSk7XG4gICAgICAgICAgICBpZiAobG1Sb2xlcyAmJiBsbVJvbGVzLmluY2x1ZGVzKHJvbGUpKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9ICAgIFxuICAgICAgICBcbiAgICAgICAgLy8gaWdub3JlIGFsbCB3aWRnZXRzIGFuZCBoZWFkaW5ncywgYW5kIHRoZWlyIGNoaWxkcmVuLCBhbmQgY2VydGFpbiBzdHJ1Y3R1cmUgcm9sZXNcbiAgICAgICAgbGV0IHJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXNXaXRoVHlwZXMocnVsZUNvbnRleHQsIFtcIndpZGdldFwiLCBcImhlYWRpbmdcIl0pO1xuICAgICAgICAvLyBhZGQgc29tZSBzdHJ1Y3R1cmUgcm9sZXNcbiAgICAgICAgQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KFtcImNhcHRpb25cIiwgXCJjZWxsXCIsIFwiY29kZVwiLCBcImNvbHVtbmhlYWRlclwiLCBcImRlZmluaXRpb25cIiwgXCJmaWd1cmVcIiwgXCJsaXN0XCIsIFwibGlzdGl0ZW1cIiwgXCJtYXRoXCIsIFwibWV0ZXJcIiwgXCJyb3dcIiwgXCJyb3dncm91cFwiLCBcInJvd2hlYWRlclwiLCBcInRlcm1cIl0sIHJvbGVzKTtcbiAgICAgICAgaWYgKEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGVzKHJ1bGVDb250ZXh0LCByb2xlcykgIT09IG51bGwpIFxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgbGV0IHZpb2xhdGVkUG9zaXRpb25UZXh0ID0gXCJcIjtcbiAgICAgICAgbGV0IHZpb2xhdGVkT3RoZXJUZXh0ID0gXCJcIjtcbiAgICAgICAgbGV0IHdhbGtOb2RlID0gcnVsZUNvbnRleHQuZmlyc3RDaGlsZCBhcyBOb2RlO1xuICAgICAgICBsZXQgdHh0VmFsID0gXCJcIjsgXG4gICAgICAgIHdoaWxlICh3YWxrTm9kZSkge1xuICAgICAgICAgICAgLy8gZm9yIGVhY2ggZWxlbWVudCBpdCBvbmx5IGNoZWNrcyB0aGF0IHNpbmdsZSBlbGVtZW50cyB0ZXh0IG5vZGVzIGFuZCBub3RoaW5nIGVsc2UuIFxuICAgICAgICAgICAgLy8gYWxsIGlubmVyIGVsZW1lbnRzIHdpbGwgYmUgY292ZXJlZCBvbiB0aGVpciBvd24uIFxuICAgICAgICAgICAgLy8gd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIChzcGFjZSwgbmV3bGluZSwgdGFiKSBiZXR3ZWVuIGVsZW1lbnRzIGFyZSBjb25zaWRlcmVkIGEgbm9kZSB0b28uXG4gICAgICAgICAgICBpZiAod2Fsa05vZGUubm9kZU5hbWUgPT09IFwiI3RleHRcIikge1xuICAgICAgICAgICAgICAgIGxldCB0eHQgPSB3YWxrTm9kZS5ub2RlVmFsdWUudHJpbSgpO1xuICAgICAgICAgICAgICAgIGlmICh0eHQubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICAgICAgdHh0VmFsICs9ICh0eHRWYWwubGVuZ3RoID4gMCA/IFwiLCBcIiArIHR4dCA6IHR4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3YWxrTm9kZSA9IHdhbGtOb2RlLm5leHRTaWJsaW5nO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZiAodHh0VmFsLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAvLyBmaXJzdCB0byByZW1vdmUgZWFjaCBleGVtcHQgd29yZCB3aXRoIGEgc2luZ2xlIHNwYWNlIGluIHRoZSB0ZXh0XG4gICAgICAgICAgICBsZXQgZXhlbXB0UmVnZXggPSBnZXRSZWdleChydWxlQ29udGV4dC5vd25lckRvY3VtZW50LCBcImV4ZW1wdFRleHRcIik7XG4gICAgICAgICAgICB0eHRWYWwgPSB0eHRWYWwucmVwbGFjZShleGVtcHRSZWdleCwgXCIgXCIpO1xuXG4gICAgICAgICAgICB2aW9sYXRlZFBvc2l0aW9uVGV4dCA9IGdldFZpb2xhdGVkVGV4dChydWxlQ29udGV4dC5vd25lckRvY3VtZW50LCBcInBvc2l0aW9uVGV4dFwiLCB0eHRWYWwpO1xuICAgICAgICAgICAgdmlvbGF0ZWRPdGhlclRleHQgPSBnZXRWaW9sYXRlZFRleHQocnVsZUNvbnRleHQub3duZXJEb2N1bWVudCwgXCJvdGhlclRleHRcIiwgdHh0VmFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXQgPSBbXTsgXG4gICAgICAgIGlmICh2aW9sYXRlZFBvc2l0aW9uVGV4dCkgcmV0LnB1c2goUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF9wb3NpdGlvblwiLCBbdmlvbGF0ZWRQb3NpdGlvblRleHRdKSk7XG4gICAgICAgIGlmICh2aW9sYXRlZE90aGVyVGV4dCkgcmV0LnB1c2goUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF9vdGhlclwiLCBbdmlvbGF0ZWRPdGhlclRleHRdKSk7XG4gICAgICAgIHJldHVybiByZXQubGVuZ3RoID09IDAgPyBudWxsIDogcmV0O1xuICAgIH1cbn1cblxuY29uc3QgdmFsaWRhdGVQYXJhbXMgPSB7XG4gICAgcG9zaXRpb25UZXh0OiB7XG4gICAgICAgIHZhbHVlOiBbXCJ0b3AtbGVmdFwiLCBcInRvcC1yaWdodFwiLCBcImJvdHRvbS1yaWdodFwiLCBcImJvdHRvbS1sZWZ0XCIsXG4gICAgICAgICAgICBcInRvcC10by1ib3R0b21cIiwgXCJsZWZ0LXRvLXJpZ2h0XCIsIFwiYm90dG9tLXRvLXRvcFwiLCBcInJpZ2h0LXRvLWxlZnRcIixcbiAgICAgICAgICAgIFwicmlnaHRcIiwgXCJsZWZ0XCIsIFwiYWJvdmVcIiwgXCJiZWxvd1wiLCBcInRvcFwiLCBcImJvdHRvbVwiLFxuICAgICAgICAgICAgXCJ1cHBlclwiLCBcImxvd2VyXCIsIFwiY29ybmVyXCIsIFwiYmVzaWRlXCJcbiAgICAgICAgXSxcbiAgICAgICAgdHlwZTogXCJbc3RyaW5nXVwiXG4gICAgfSxcbiAgICBvdGhlclRleHQ6IHtcbiAgICAgICAgdmFsdWU6IFtcInJvdW5kXCIsIFwic3F1YXJlXCIsIFwic2hhcGVcIiwgXCJyZWN0YW5nbGVcIiwgXCJ0cmlhbmdsZVwiLFxuICAgICAgICAgICAgXCJzaXplXCIsIFwibGFyZ2VcIiwgXCJzbWFsbFwiLCBcIm1lZGl1bVwiLCBcImJpZ1wiLCBcImh1Z2VcIiwgXCJ0aW55XCIsIFwiZXh0cmFcIixcbiAgICAgICAgICAgIFwibGFyZ2VyXCIsIFwic21hbGxlclwiLCBcImJpZ2dlclwiLCBcImxpdHRsZVwiLCBcImxhcmdlc3RcIiwgXCJzbWFsbGVzdFwiLCBcImJpZ2dlc3RcIlxuICAgICAgICBdLFxuICAgICAgICB0eXBlOiBcIltzdHJpbmddXCJcbiAgICB9LFxuICAgIGV4ZW1wdFRleHQ6IHtcbiAgICAgICAgdmFsdWU6IFtcInJpZ2h0LWNsaWNrXCIsIFwibGVmdC1jbGlja1wiLCBcInJpZ2h0LWNsaWNraW5nXCIsIFwicmlnaHQtY2xpY2tzXCIsIFxuICAgICAgICAgICBcImxlZnQtY2xpY2tpbmdcIiwgXCJsZWZ0LWNsaWNrc1wiLCBcInNxdWFyZSByb290XCIsIFwicmlnaHQgbm93XCIsIFwib2ZmIHRoZSB0b3BcIiAgIC8vYXBwZW5kIGFzIG5lZWRlZFxuICAgICAgICBdLFxuICAgICAgICB0eXBlOiBcIltzdHJpbmddXCJcbiAgICB9ICAgIFxufVxuXG5mdW5jdGlvbiBnZXRSZWdleChkb2MsIHR5cGUpIHtcbiAgICBpZiAoIXZhbGlkYXRlUGFyYW1zW3R5cGVdKSByZXR1cm4gXCJcIjtcbiAgICBsZXQgc2Vuc29yeVJlZ2V4ID0gQ2FjaGVVdGlsLmdldENhY2hlKGRvYywgdHlwZSArIFwiX3NlbnNvcnlfbWlzdXNlXCIsIG51bGwpO1xuICAgIGlmIChzZW5zb3J5UmVnZXggPT0gbnVsbCkge1xuICAgICAgICBsZXQgc2Vuc29yeVRleHQgPSB2YWxpZGF0ZVBhcmFtc1t0eXBlXS52YWx1ZTtcbiAgICAgICAgbGV0IHJlZ2V4U3RyID0gXCIoXFxzXFxzK3xcIiArIHNlbnNvcnlUZXh0WzBdO1xuICAgICAgICBmb3IgKGxldCBqID0gMTsgaiA8IHNlbnNvcnlUZXh0Lmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICBsZXQgd29yZHMgPSBzZW5zb3J5VGV4dFtqXS50cmltKCkuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgcmVnZXhTdHIgKz0gXCJ8XCIgKyB3b3Jkc1swXTtcbiAgICAgICAgICAgIGlmICh3b3Jkcy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgYyA9IDE7IGMgPCB3b3Jkcy5sZW5ndGg7ICsrYylcbiAgICAgICAgICAgICAgICAgICAgcmVnZXhTdHIgKz0gXCIgK1wiICsgd29yZHNbY107XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy9yZWdleFN0ciArPSBcIilcXFxcV1wiO1xuICAgICAgICByZWdleFN0ciArPSBcIilcIjtcbiAgICAgICAgc2Vuc29yeVJlZ2V4ID0gbmV3IFJlZ0V4cChyZWdleFN0ciwgXCJnaVwiKTtcbiAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGRvYywgdHlwZSArXCJfc2Vuc29yeV9taXN1c2VcIiwgc2Vuc29yeVJlZ2V4KTtcbiAgICB9XG4gICAgcmV0dXJuIHNlbnNvcnlSZWdleDtcbn1cblxuZnVuY3Rpb24gZ2V0VmlvbGF0ZWRUZXh0KGRvYywgdHlwZSwgdHh0VmFsKSB7XG4gICAgaWYgKCF0eHRWYWwpIHJldHVybiBcIlwiO1xuICAgIGxldCBzZW5zb3J5VGV4dEFyciA9IHZhbGlkYXRlUGFyYW1zW3R5cGVdLnZhbHVlXG4gICAgbGV0IGhhc2ggPSB7fSwgcmVzdWx0ID0gW107XG4gICAgXG4gICAgLy8gc3BsaXQgdGhlIHN0cmluZyBpbnRvIHdvcmRzXG4gICAgbGV0IGNvdW50cyA9IHR4dFZhbC5zcGxpdCgvXFxzKy8pLnJlZHVjZShmdW5jdGlvbiAobWFwLCB3b3JkKSB7XG4gICAgICAgIGxldCB3b3JkV29UcmFpbGluZ1B1bmMgPSB3b3JkLnJlcGxhY2UoL1suPyE6OygpJ1wiLGBcXF1dKyQvLCBcIlwiKTtcbiAgICAgICAgbGV0IGxjV29yZFdvUHVuYyA9IHdvcmQudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bLj8hOjsoKSdcIixgXFxdXS9nLCBcIlwiKTtcblxuICAgICAgICBmb3IgKGxldCBjb3VudGVyID0gMDsgY291bnRlciA8IHNlbnNvcnlUZXh0QXJyLmxlbmd0aDsgY291bnRlcisrKSB7XG4gICAgICAgICAgICBsZXQgYSA9IGxjV29yZFdvUHVuYy5pbmRleE9mKHNlbnNvcnlUZXh0QXJyW2NvdW50ZXJdKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgbGV0IHNlbnNvcnlXb3JkTGVuID0gc2Vuc29yeVRleHRBcnJbY291bnRlcl0ubGVuZ3RoO1xuICAgICAgICAgICAgbGV0IGNoYXJGb2xsb3dTZW5zb3J5VGV4dCA9IGxjV29yZFdvUHVuYy5jaGFyQXQoc2Vuc29yeVdvcmRMZW4gKyBhKTtcblxuICAgICAgICAgICAgLy8gSWYgdGhlIHdvcmQgZG9lcyBub3QgY29udGFpbnMgc3Vic3RyaW5nIG9mIHNlbnNvcnlUZXh0QXJyW2NvdW50ZXJdXG4gICAgICAgICAgICAvLyBwcm9jZWVkIHRvIHRoZSBuZXh0IGxvb3AgaXRlcmF0aW9uIGZvciBuZXh0IHNlbnNvcnlUZXh0LlxuICAgICAgICAgICAgaWYgKGEgPCAwKSB7IGNvbnRpbnVlOyB9XG5cbiAgICAgICAgICAgIC8vY2hlY2sgdGhlIGZvbGxvd2luZyBhbmQgcHJvY2VlZGluZyBwdW5jdHVhdGlvbnNcbiAgICAgICAgICAgIC8vbGV0IGlzUHVuY2ZvbGxvd2luZyA9ICgoY2hhckZvbGxvd1NlbnNvcnlUZXh0ID09ICdcXC0nKSB8fFxuICAgICAgICAgICAgbGV0IGlzUHVuY2ZvbGxvd2luZyA9IChcbiAgICAgICAgICAgICAgICAoY2hhckZvbGxvd1NlbnNvcnlUZXh0ID09ICdcXC4nKSB8fFxuICAgICAgICAgICAgICAgIChjaGFyRm9sbG93U2Vuc29yeVRleHQgPT0gJ1xcPycpIHx8IChjaGFyRm9sbG93U2Vuc29yeVRleHQgPT0gJ1xcIScpIHx8XG4gICAgICAgICAgICAgICAgKGNoYXJGb2xsb3dTZW5zb3J5VGV4dCA9PSAnXFw6JykgfHwgKGNoYXJGb2xsb3dTZW5zb3J5VGV4dCA9PSAnXFw7JykgfHxcbiAgICAgICAgICAgICAgICAoY2hhckZvbGxvd1NlbnNvcnlUZXh0ID09ICdcXCgnKSB8fCAoY2hhckZvbGxvd1NlbnNvcnlUZXh0ID09ICdcXCknKSB8fFxuICAgICAgICAgICAgICAgIChjaGFyRm9sbG93U2Vuc29yeVRleHQgPT0gJ1xcJycpIHx8IChjaGFyRm9sbG93U2Vuc29yeVRleHQgPT0gJ1xcXCInKSB8fFxuICAgICAgICAgICAgICAgIChjaGFyRm9sbG93U2Vuc29yeVRleHQgPT0gJ1xcLCcpIHx8IChjaGFyRm9sbG93U2Vuc29yeVRleHQgPT0gJy5cXGAnKSB8fFxuICAgICAgICAgICAgICAgIChjaGFyRm9sbG93U2Vuc29yeVRleHQgPT0gJ1xcXFwnKSB8fCAoY2hhckZvbGxvd1NlbnNvcnlUZXh0ID09ICdcXF0nKSk7XG5cbiAgICAgICAgICAgIGxldCBpc1B1bmNQcmVjZWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChhID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCBjaGFyUHJlY2VkZVNlbnNvcnlUZXh0ID0gbGNXb3JkV29QdW5jLmNoYXJBdChhIC0gMSk7XG4gICAgICAgICAgICAgICAgaXNQdW5jUHJlY2VkaW5nID0gKChjaGFyUHJlY2VkZVNlbnNvcnlUZXh0ID09ICdcXC0nKSB8fFxuICAgICAgICAgICAgICAgICAgICAoY2hhclByZWNlZGVTZW5zb3J5VGV4dCA9PSAnXFwuJykgfHxcbiAgICAgICAgICAgICAgICAgICAgKGNoYXJQcmVjZWRlU2Vuc29yeVRleHQgPT0gJ1xcPycpIHx8IChjaGFyUHJlY2VkZVNlbnNvcnlUZXh0ID09ICdcXCEnKSB8fFxuICAgICAgICAgICAgICAgICAgICAoY2hhclByZWNlZGVTZW5zb3J5VGV4dCA9PSAnXFw6JykgfHwgKGNoYXJQcmVjZWRlU2Vuc29yeVRleHQgPT0gJ1xcOycpIHx8XG4gICAgICAgICAgICAgICAgICAgIChjaGFyUHJlY2VkZVNlbnNvcnlUZXh0ID09ICdcXCgnKSB8fCAoY2hhclByZWNlZGVTZW5zb3J5VGV4dCA9PSAnXFwpJykgfHxcbiAgICAgICAgICAgICAgICAgICAgKGNoYXJQcmVjZWRlU2Vuc29yeVRleHQgPT0gJ1xcJycpIHx8IChjaGFyUHJlY2VkZVNlbnNvcnlUZXh0ID09ICdcXFwiJykgfHxcbiAgICAgICAgICAgICAgICAgICAgKGNoYXJQcmVjZWRlU2Vuc29yeVRleHQgPT0gJ1xcLCcpIHx8IChjaGFyUHJlY2VkZVNlbnNvcnlUZXh0ID09ICcuXFxgJykgfHxcbiAgICAgICAgICAgICAgICAgICAgKGNoYXJQcmVjZWRlU2Vuc29yeVRleHQgPT0gJ1xcXFwnKSB8fCAoY2hhclByZWNlZGVTZW5zb3J5VGV4dCA9PSAnXFxdJykpO1xuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICgoKGxjV29yZFdvUHVuYy5sZW5ndGggPT0gc2Vuc29yeVdvcmRMZW4pIHx8IChpc1B1bmNmb2xsb3dpbmcgPT0gdHJ1ZSkgfHwgKGlzUHVuY1ByZWNlZGluZyA9PSB0cnVlKSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWhhc2guaGFzT3duUHJvcGVydHkod29yZFdvVHJhaWxpbmdQdW5jKSkge1xuICAgICAgICAgICAgICAgICAgICBoYXNoW3dvcmRXb1RyYWlsaW5nUHVuY10gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh3b3JkV29UcmFpbGluZ1B1bmMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb3VudGVyID0gc2Vuc29yeVRleHRBcnIubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG1hcFt3b3JkV29UcmFpbGluZ1B1bmNdID0gKG1hcFt3b3JkV29UcmFpbGluZ1B1bmNdIHx8IDApICsgMTtcbiAgICAgICAgcmV0dXJuIG1hcDtcbiAgICB9LCBPYmplY3QuY3JlYXRlKG51bGwpKTtcbiAgICByZXR1cm4gcmVzdWx0LmpvaW4oXCIsIFwiKTtcbn0gIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsLCBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgQ1NTVXRpbCB9IGZyb20gXCIuLi91dGlsL0NTU1V0aWxcIjtcbmltcG9ydCB7IERPTU1hcHBlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NTWFwcGVyXCI7XG5cbi8vIE1vZHVsZS1sZXZlbCBjb25zdGFudHNcbmNvbnN0IFNUWUxFX1ZBTFVFX1JFR0VYID0gLygtP1tcXGQuXSspKFthLXolXSopLztcbmNvbnN0IE1JTl9XT1JEX1NQQUNJTkdfUkFUSU8gPSAwLjE2O1xuY29uc3QgTUlOX0xFVFRFUl9TUEFDSU5HX1JBVElPID0gMC4xMjtcbmNvbnN0IE1JTl9MSU5FX0hFSUdIVF9SQVRJTyA9IDEuNTtcbmNvbnN0IElNUE9SVEFOVF9TVUZGSVggPSBcIiFpbXBvcnRhbnRcIjtcbmNvbnN0IElNUE9SVEFOVF9TVUZGSVhfTEVOR1RIID0gSU1QT1JUQU5UX1NVRkZJWC5sZW5ndGggKyAxOyAvLyArMSBmb3IgdGhlIHNwYWNlIGJlZm9yZSAhaW1wb3J0YW50XG5cbi8qKlxuICogUmVzb2x2ZXMgaW5oZXJpdGVkIG9yIHVuc2V0IHN0eWxlIHZhbHVlcyBieSB0cmF2ZXJzaW5nIHVwIHRoZSBET00gdHJlZVxuICogQHBhcmFtIGVsZW1lbnQgLSBUaGUgZWxlbWVudCB0byByZXNvbHZlIHRoZSBzdHlsZSBmb3JcbiAqIEBwYXJhbSBwcm9wZXJ0eSAtIFRoZSBDU1MgcHJvcGVydHkgbmFtZVxuICogQHBhcmFtIGN1cnJlbnRWYWx1ZSAtIFRoZSBjdXJyZW50IHN0eWxlIHZhbHVlXG4gKiBAcmV0dXJucyBUaGUgcmVzb2x2ZWQgc3R5bGUgdmFsdWVcbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZUluaGVyaXRlZFN0eWxlKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBwcm9wZXJ0eTogc3RyaW5nLCBjdXJyZW50VmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKGN1cnJlbnRWYWx1ZS5zdGFydHNXaXRoKCdpbmhlcml0JykgfHwgY3VycmVudFZhbHVlLnN0YXJ0c1dpdGgoJ3Vuc2V0JykpIHtcbiAgICAgICAgY29uc3QgYW5jZXN0b3IgPSBDU1NVdGlsLmdldEFuY2VzdG9yV2l0aFN0eWxlcyhcbiAgICAgICAgICAgIGVsZW1lbnQucGFyZW50RWxlbWVudCxcbiAgICAgICAgICAgIHtbcHJvcGVydHldOiBbXCIqXCJdfSxcbiAgICAgICAgICAgIFsnaW5oZXJpdCcsICd1bnNldCddXG4gICAgICAgICk7XG4gICAgICAgIGlmIChhbmNlc3RvciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIENTU1V0aWwuZ2V0RGVmaW5lZFN0eWxlcyhhbmNlc3RvciwgW3Byb3BlcnR5XSlbcHJvcGVydHldO1xuICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRWYWx1ZS5zdGFydHNXaXRoKCd1bnNldCcpKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJpbml0aWFsXCI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGN1cnJlbnRWYWx1ZTtcbn1cblxuLyoqXG4gKiBSZW1vdmVzIHRoZSAhaW1wb3J0YW50IHN1ZmZpeCBmcm9tIGEgc3R5bGUgdmFsdWVcbiAqIEBwYXJhbSBzdHlsZVZhbHVlIC0gVGhlIHN0eWxlIHZhbHVlIHBvdGVudGlhbGx5IGNvbnRhaW5pbmcgIWltcG9ydGFudFxuICogQHJldHVybnMgVGhlIHN0eWxlIHZhbHVlIHdpdGhvdXQgIWltcG9ydGFudFxuICovXG5mdW5jdGlvbiByZW1vdmVJbXBvcnRhbnRTdWZmaXgoc3R5bGVWYWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3R5bGVWYWx1ZS5zdWJzdHJpbmcoMCwgc3R5bGVWYWx1ZS5sZW5ndGggLSBJTVBPUlRBTlRfU1VGRklYX0xFTkdUSCk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgc3BhY2luZyBwcm9wZXJ0eSB2aW9sYXRlcyBhY2Nlc3NpYmlsaXR5IHJlcXVpcmVtZW50c1xuICogQHBhcmFtIGVsZW1lbnQgLSBUaGUgSFRNTCBlbGVtZW50IGJlaW5nIGNoZWNrZWRcbiAqIEBwYXJhbSBwcm9wZXJ0eSAtIFRoZSBDU1MgcHJvcGVydHkgbmFtZSAod29yZC1zcGFjaW5nLCBsZXR0ZXItc3BhY2luZywgbGluZS1oZWlnaHQpXG4gKiBAcGFyYW0gc3R5bGVWYWx1ZSAtIFRoZSBjdXJyZW50IHN0eWxlIHZhbHVlXG4gKiBAcGFyYW0gZm9udFNpemUgLSBUaGUgY29tcHV0ZWQgZm9udCBzaXplIGluIHBpeGVsc1xuICogQHBhcmFtIG1pblJhdGlvIC0gVGhlIG1pbmltdW0gcmF0aW8gdGhyZXNob2xkXG4gKiBAcGFyYW0gYWxsb3dVbml0bGVzcyAtIFdoZXRoZXIgdW5pdGxlc3MgdmFsdWVzIGFyZSBhbGxvd2VkIChmb3IgbGluZS1oZWlnaHQpXG4gKiBAcmV0dXJucyBSdWxlUmVzdWx0IGluZGljYXRpbmcgcGFzcyBvciBmYWlsXG4gKi9cbmZ1bmN0aW9uIGNoZWNrU3BhY2luZ1Byb3BlcnR5KFxuICAgIGVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICAgIHByb3BlcnR5OiBzdHJpbmcsXG4gICAgc3R5bGVWYWx1ZTogc3RyaW5nLFxuICAgIGZvbnRTaXplOiBudW1iZXIsXG4gICAgbWluUmF0aW86IG51bWJlcixcbiAgICBhbGxvd1VuaXRsZXNzOiBib29sZWFuID0gZmFsc2Vcbik6IGJvb2xlYW4ge1xuICAgIC8vIENoZWNrIGlmICFpbXBvcnRhbnQgaXMgdXNlZFxuICAgIGlmIChlbGVtZW50LnN0eWxlLmdldFByb3BlcnR5UHJpb3JpdHkocHJvcGVydHkpICE9PSAnaW1wb3J0YW50Jykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgIWltcG9ydGFudCBzdWZmaXhcbiAgICBjb25zdCBjbGVhblZhbHVlID0gcmVtb3ZlSW1wb3J0YW50U3VmZml4KHN0eWxlVmFsdWUpO1xuXG4gICAgLy8gQ2hlY2sgZm9yIGluaXRpYWwgb3Igbm9ybWFsIHZhbHVlcyAoY29tcHV0ZWQgc3BhY2UgaXMgMClcbiAgICBpZiAoY2xlYW5WYWx1ZSA9PT0gJ2luaXRpYWwnIHx8IGNsZWFuVmFsdWUgPT09ICdub3JtYWwnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBQYXJzZSB0aGUgbnVtZXJpYyB2YWx1ZVxuICAgIGNvbnN0IG51bWVyaWNWYWx1ZSA9IHBhcnNlRmxvYXQoY2xlYW5WYWx1ZSk7XG4gICAgaWYgKGlzTmFOKG51bWVyaWNWYWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gTWF0Y2ggdmFsdWUgYW5kIHVuaXRcbiAgICBjb25zdCBwYXJzZWRWYWx1ZSA9IGNsZWFuVmFsdWUudHJpbSgpLm1hdGNoKFNUWUxFX1ZBTFVFX1JFR0VYKTtcbiAgICBpZiAoIXBhcnNlZFZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IFssIHZhbHVlLCB1bml0XSA9IHBhcnNlZFZhbHVlO1xuXG4gICAgLy8gSGFuZGxlIHVuaXRsZXNzIHZhbHVlcyAob25seSBmb3IgbGluZS1oZWlnaHQpXG4gICAgaWYgKHVuaXQgPT09ICcnKSB7XG4gICAgICAgIGlmIChhbGxvd1VuaXRsZXNzKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VGbG9hdCh2YWx1ZSkgPCBtaW5SYXRpbyA/IGZhbHNlIDogdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBGb3Igb3RoZXIgcHJvcGVydGllcywgemVybyB2YWx1ZSB3aXRob3V0IHVuaXQgaXMgaWdub3JlZFxuICAgICAgICBpZiAocGFyc2VGbG9hdCh2YWx1ZSkgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gU2tpcCBpZiBubyB1bml0IGFuZCBub24temVybyAoZXJyb3IgY2FzZSwgaW5hcHBsaWNhYmxlKVxuICAgIGlmICh1bml0ID09PSAnJyAmJiBwYXJzZUZsb2F0KHZhbHVlKSAhPT0gMCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBDb252ZXJ0IHRvIHBpeGVscyBhbmQgY2hlY2sgcmF0aW9cbiAgICBjb25zdCBwaXhlbHMgPSBDU1NVdGlsLmNvbnZlcnRWYWx1ZTJQaXhlbHModW5pdCwgdmFsdWUsIGVsZW1lbnQpO1xuICAgIGlmIChwaXhlbHMgIT09IG51bGwgJiYgcGl4ZWxzIC8gZm9udFNpemUgPCBtaW5SYXRpbykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBjb25zdCB0ZXh0X3NwYWNpbmdfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwidGV4dF9zcGFjaW5nX3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJ0ZXh0X3NwYWNpbmdfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInRleHRfc3BhY2luZ192YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfbGV0dGVyX3NwYWNpbmdfc3R5bGVcIjogXCJ0ZXh0X3NwYWNpbmdfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX3dvcmRfc3BhY2luZ19zdHlsZVwiOiBcInRleHRfc3BhY2luZ192YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfbGluZV9oZWlnaHRfc3R5bGVcIjogXCJ0ZXh0X3NwYWNpbmdfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiQ1NTICFpbXBvcnRhbnQgaXMgbm90IHVzZWQgaW4gaW5saW5lIHN0eWxlIHRvIGNvbnRyb2wgbGV0dGVyIG9yIHdvcmQgc3BhY2luZyBvciBsaW5lIGhlaWdodFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkNTUyAhaW1wb3J0YW50IHNob3VsZCBub3QgYmUgdXNlZCBpbiBpbmxpbmUgc3R5bGUgdG8gY29udHJvbCBsZXR0ZXIgb3Igd29yZCBzcGFjaW5nIG9yIGxpbmUgaGVpZ2h0XCIsXG4gICAgICAgICAgICBcImZhaWxfbGV0dGVyX3NwYWNpbmdfc3R5bGVcIjogXCJDU1MgIWltcG9ydGFudCBzaG91bGQgbm90IGJlIHVzZWQgaW4gaW5saW5lIOKAmGxldHRlci1zcGFjaW5n4oCZIHN0eWxlXCIsXG4gICAgICAgICAgICBcImZhaWxfd29yZF9zcGFjaW5nX3N0eWxlXCI6IFwiQ1NTICFpbXBvcnRhbnQgc2hvdWxkIG5vdCBiZSB1c2VkIGluIGlubGluZSDigJh3b3JkLXNwYWNpbmfigJkgc3R5bGVcIixcbiAgICAgICAgICAgIFwiZmFpbF9saW5lX2hlaWdodF9zdHlsZVwiOiBcIkNTUyAhaW1wb3J0YW50IHNob3VsZCBub3QgYmUgdXNlZCBpbiBpbmxpbmUg4oCYbGluZS1oZWlnaHTigJkgc3R5bGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICAgXCJudW1cIjogW1wiMS40LjEyXCJdLFxuICAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OlsnOWU0NWVjJywgJzI0YWZjMicsICc3OGZkMzInXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGlzIGVsZW1lbnQgaGFzIGNoaWxkcmVuIHdpdGggYWN0dWFsIHRleHRcbiAgICAgICAgbGV0IGNoaWxkU3RyID0gXCJcIjtcbiAgICAgICAgY29uc3QgY2hpbGROb2RlcyA9IHJ1bGVDb250ZXh0LmNoaWxkTm9kZXM7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGROb2Rlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgaWYgKGNoaWxkTm9kZXNbaV0ubm9kZVR5cGUgPT09IDMpIHsgLy8gVGV4dCBub2RlXG4gICAgICAgICAgICAgICAgY2hpbGRTdHIgKz0gY2hpbGROb2Rlc1tpXS5ub2RlVmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoaWxkU3RyLnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIG9yIGRpc2FibGVkXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkgfHwgQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgb2ZmIHNjcmVlblxuICAgICAgICBjb25zdCBtYXBwZXI6IERPTU1hcHBlciA9IG5ldyBET01NYXBwZXIoKTtcbiAgICAgICAgY29uc3QgYm91bmRzID0gbWFwcGVyLmdldFVuYWRqdXN0ZWRCb3VuZHMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoIWJvdW5kcyB8fCBib3VuZHNbJ3RvcCddIDwgMCB8fCBib3VuZHNbJ2xlZnQnXSA8IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2tpcCBub24tSFRNTCBlbGVtZW50cyAoZS5nLiwgU1ZHKVxuICAgICAgICBpZiAoQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgXCJzdmdcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRm9udCBzaXplIGFsd2F5cyByZXNvbHZlZCB0byAncHgnXG4gICAgICAgIGNvbnN0IGNvbXB1dGVkU3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgY29uc3QgZm9udFNpemUgPSBwYXJzZUZsb2F0KGNvbXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnZm9udC1zaXplJykpO1xuXG4gICAgICAgIC8vIEVhcmx5IGV4aXQgb3B0aW1pemF0aW9uOiBDaGVjayBpZiBjb21wdXRlZCBzdHlsZXMgYWxyZWFkeSBwYXNzXG4gICAgICAgIC8vIElmIGFsbCB0aHJlZSBwcm9wZXJ0aWVzIGhhdmUgcGFzc2luZyB2YWx1ZXMsIHdlIGNhbiBza2lwIHRoZSBleHBlbnNpdmUgZ2V0RGVmaW5lZFN0eWxlcyBjYWxsXG4gICAgICAgIGNvbnN0IGNvbXB1dGVkV29yZFNwYWNpbmcgPSBjb21wdXRlZFN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ3dvcmQtc3BhY2luZycpO1xuICAgICAgICBjb25zdCBjb21wdXRlZExldHRlclNwYWNpbmcgPSBjb21wdXRlZFN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ2xldHRlci1zcGFjaW5nJyk7XG4gICAgICAgIGNvbnN0IGNvbXB1dGVkTGluZUhlaWdodCA9IGNvbXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnbGluZS1oZWlnaHQnKTtcblxuICAgICAgICAvLyBDaGVjayBpZiBjb21wdXRlZCB2YWx1ZXMgcGFzcyB0aGUgcmVxdWlyZW1lbnRzXG4gICAgICAgIGxldCB3b3JkU3BhY2luZ1Bhc3NlcyA9IHRydWU7XG4gICAgICAgIGxldCBsZXR0ZXJTcGFjaW5nUGFzc2VzID0gdHJ1ZTtcbiAgICAgICAgbGV0IGxpbmVIZWlnaHRQYXNzZXMgPSB0cnVlO1xuXG4gICAgICAgIC8vIENoZWNrIHdvcmQtc3BhY2luZyAoaWdub3JlIDBweCB3aGljaCByZXByZXNlbnRzIGRlZmF1bHQvbm9ybWFsKVxuICAgICAgICBpZiAoY29tcHV0ZWRXb3JkU3BhY2luZykge1xuICAgICAgICAgICAgY29uc3Qgd29yZFZhbHVlID0gcGFyc2VGbG9hdChjb21wdXRlZFdvcmRTcGFjaW5nKTtcbiAgICAgICAgICAgIGlmICghaXNOYU4od29yZFZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHdvcmRQaXhlbHMgPSBDU1NVdGlsLmNvbnZlcnRWYWx1ZTJQaXhlbHMoJ3B4Jywgd29yZFZhbHVlLnRvU3RyaW5nKCksIHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgICAgICBpZiAod29yZFBpeGVscyAhPT0gbnVsbCAmJiB3b3JkUGl4ZWxzIC8gZm9udFNpemUgPCBNSU5fV09SRF9TUEFDSU5HX1JBVElPKSB7XG4gICAgICAgICAgICAgICAgICAgIHdvcmRTcGFjaW5nUGFzc2VzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgbGV0dGVyLXNwYWNpbmcgKGlnbm9yZSAwcHggd2hpY2ggcmVwcmVzZW50cyBkZWZhdWx0L25vcm1hbClcbiAgICAgICAgaWYgKGNvbXB1dGVkTGV0dGVyU3BhY2luZykge1xuICAgICAgICAgICAgY29uc3QgbGV0dGVyVmFsdWUgPSBwYXJzZUZsb2F0KGNvbXB1dGVkTGV0dGVyU3BhY2luZyk7XG4gICAgICAgICAgICBpZiAoIWlzTmFOKGxldHRlclZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxldHRlclBpeGVscyA9IENTU1V0aWwuY29udmVydFZhbHVlMlBpeGVscygncHgnLCBsZXR0ZXJWYWx1ZS50b1N0cmluZygpLCBydWxlQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgaWYgKGxldHRlclBpeGVscyAhPT0gbnVsbCAmJiBsZXR0ZXJQaXhlbHMgLyBmb250U2l6ZSA8IE1JTl9MRVRURVJfU1BBQ0lOR19SQVRJTykge1xuICAgICAgICAgICAgICAgICAgICBsZXR0ZXJTcGFjaW5nUGFzc2VzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgbGluZS1oZWlnaHRcbiAgICAgICAgaWYgKGNvbXB1dGVkTGluZUhlaWdodCkge1xuICAgICAgICAgICAgY29uc3QgbGluZVZhbHVlID0gcGFyc2VGbG9hdChjb21wdXRlZExpbmVIZWlnaHQpO1xuICAgICAgICAgICAgaWYgKCFpc05hTihsaW5lVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgLy8gTGluZSBoZWlnaHQgY2FuIGJlIHVuaXRsZXNzIG9yIGluIHBpeGVsc1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gY29tcHV0ZWRMaW5lSGVpZ2h0Lm1hdGNoKFNUWUxFX1ZBTFVFX1JFR0VYKTtcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgWywgdmFsdWUsIHVuaXRdID0gbWF0Y2g7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1bml0ID09PSAnJyB8fCB1bml0ID09PSAncHgnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByYXRpbyA9IHVuaXQgPT09ICcnID8gcGFyc2VGbG9hdCh2YWx1ZSkgOiBwYXJzZUZsb2F0KHZhbHVlKSAvIGZvbnRTaXplO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhdGlvIDwgTUlOX0xJTkVfSEVJR0hUX1JBVElPKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZUhlaWdodFBhc3NlcyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgYWxsIGNvbXB1dGVkIHZhbHVlcyBwYXNzLCB3ZSBjYW4gc2tpcCB0aGUgZXhwZW5zaXZlIGdldERlZmluZWRTdHlsZXMgY2hlY2tcbiAgICAgICAgaWYgKHdvcmRTcGFjaW5nUGFzc2VzICYmIGxldHRlclNwYWNpbmdQYXNzZXMgJiYgbGluZUhlaWdodFBhc3Nlcykge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgZGVmaW5lZCBzdHlsZXMgdG8gY2hlY2sgZm9yICFpbXBvcnRhbnQgZGVjbGFyYXRpb25zXG4gICAgICAgIGNvbnN0IHN0eWxlcyA9IENTU1V0aWwuZ2V0RGVmaW5lZFN0eWxlcyhydWxlQ29udGV4dCwgW1wid29yZC1zcGFjaW5nXCIsIFwibGV0dGVyLXNwYWNpbmdcIiwgXCJsaW5lLWhlaWdodFwiXSk7XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhzdHlsZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHRzOiBSdWxlUmVzdWx0W10gPSBbXTtcblxuICAgICAgICAvLyBDaGVjayB3b3JkLXNwYWNpbmdcbiAgICAgICAgbGV0IHdvcmRTdHlsZSA9IHN0eWxlc1snd29yZC1zcGFjaW5nJ107XG4gICAgICAgIGlmICh3b3JkU3R5bGUpIHtcbiAgICAgICAgICAgIHdvcmRTdHlsZSA9IHJlc29sdmVJbmhlcml0ZWRTdHlsZShydWxlQ29udGV4dCwgJ3dvcmQtc3BhY2luZycsIHdvcmRTdHlsZSk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBjaGVja1NwYWNpbmdQcm9wZXJ0eShcbiAgICAgICAgICAgICAgICBydWxlQ29udGV4dCxcbiAgICAgICAgICAgICAgICAnd29yZC1zcGFjaW5nJyxcbiAgICAgICAgICAgICAgICB3b3JkU3R5bGUsXG4gICAgICAgICAgICAgICAgZm9udFNpemUsXG4gICAgICAgICAgICAgICAgTUlOX1dPUkRfU1BBQ0lOR19SQVRJT1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaChyZXN1bHQgPyBSdWxlUGFzcyhcInBhc3NcIikgOiBSdWxlRmFpbCgnZmFpbF93b3JkX3NwYWNpbmdfc3R5bGUnKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBsZXR0ZXItc3BhY2luZ1xuICAgICAgICBsZXQgbGV0dGVyU3R5bGUgPSBzdHlsZXNbJ2xldHRlci1zcGFjaW5nJ107XG4gICAgICAgIGlmIChsZXR0ZXJTdHlsZSkge1xuICAgICAgICAgICAgbGV0dGVyU3R5bGUgPSByZXNvbHZlSW5oZXJpdGVkU3R5bGUocnVsZUNvbnRleHQsICdsZXR0ZXItc3BhY2luZycsIGxldHRlclN0eWxlKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNoZWNrU3BhY2luZ1Byb3BlcnR5KFxuICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0LFxuICAgICAgICAgICAgICAgICdsZXR0ZXItc3BhY2luZycsXG4gICAgICAgICAgICAgICAgbGV0dGVyU3R5bGUsXG4gICAgICAgICAgICAgICAgZm9udFNpemUsXG4gICAgICAgICAgICAgICAgTUlOX0xFVFRFUl9TUEFDSU5HX1JBVElPXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHJlc3VsdCA/IFJ1bGVQYXNzKFwicGFzc1wiKSA6IFJ1bGVGYWlsKCdmYWlsX2xldHRlcl9zcGFjaW5nX3N0eWxlJykpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgbGluZS1oZWlnaHQgKG9ubHkgaWYgbm8gc2Nyb2xsYWJsZSBhbmNlc3RvcilcbiAgICAgICAgbGV0IGxpbmVTdHlsZSA9IHN0eWxlc1snbGluZS1oZWlnaHQnXTtcbiAgICAgICAgY29uc3Qgb3ZlcmZsb3dTdHlsZXMgPSB7XG4gICAgICAgICAgICBcIm92ZXJmbG93XCI6IFsnYXV0bycsICdzY3JvbGwnXSxcbiAgICAgICAgICAgIFwib3ZlcmZsb3cteFwiOiBbJ2F1dG8nLCAnc2Nyb2xsJ10sXG4gICAgICAgICAgICBcIm92ZXJmbG93LXlcIjogWydhdXRvJywgJ3Njcm9sbCddXG4gICAgICAgIH07XG4gICAgICAgIGlmIChsaW5lU3R5bGUgJiYgQ1NTVXRpbC5nZXRBbmNlc3RvcldpdGhTdHlsZXMocnVsZUNvbnRleHQsIG92ZXJmbG93U3R5bGVzKSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgbGluZVN0eWxlID0gcmVzb2x2ZUluaGVyaXRlZFN0eWxlKHJ1bGVDb250ZXh0LCAnbGluZS1oZWlnaHQnLCBsaW5lU3R5bGUpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gY2hlY2tTcGFjaW5nUHJvcGVydHkoXG4gICAgICAgICAgICAgICAgcnVsZUNvbnRleHQsXG4gICAgICAgICAgICAgICAgJ2xpbmUtaGVpZ2h0JyxcbiAgICAgICAgICAgICAgICBsaW5lU3R5bGUsXG4gICAgICAgICAgICAgICAgZm9udFNpemUsXG4gICAgICAgICAgICAgICAgTUlOX0xJTkVfSEVJR0hUX1JBVElPLFxuICAgICAgICAgICAgICAgIHRydWUgLy8gQWxsb3cgdW5pdGxlc3MgdmFsdWVzIGZvciBsaW5lLWhlaWdodFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaChyZXN1bHQgPyBSdWxlUGFzcyhcInBhc3NcIikgOiBSdWxlRmFpbCgnZmFpbF9saW5lX2hlaWdodF9zdHlsZScpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHRzLmxlbmd0aCA+IDAgPyByZXN1bHRzIDogbnVsbDtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IHRleHRfd2hpdGVzcGFjZV92YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJ0ZXh0X3doaXRlc3BhY2VfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcInRleHRfd2hpdGVzcGFjZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF90ZXh0XCI6IFwidGV4dF93aGl0ZXNwYWNlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJ0ZXh0X3doaXRlc3BhY2VfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX3RleHRcIjogXCJTcGFjZSBjaGFyYWN0ZXJzIHNob3VsZCBub3QgYmUgdXNlZCB0byBjcmVhdGUgc3BhY2UgYmV0d2VlbiB0aGUgbGV0dGVycyBvZiBhIHdvcmRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJTcGFjZSBjaGFyYWN0ZXJzIHNob3VsZCBub3QgYmUgdXNlZCB0byBjb250cm9sIHNwYWNpbmcgd2l0aGluIGEgd29yZFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuXG4gICAgICAgIC8vIERvbid0IHRyaWdnZXIgaWYgd2UncmUgbm90IGluIHRoZSBib2R5IG9yIGlmIHdlJ3JlIGluIGEgc2NyaXB0XG4gICAgICAgIGxldCBjaGVja0FuY2VzdG9yID0gQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgW1wiYm9keVwiLCBcInNjcmlwdFwiLCBcImNvZGVcIl0pO1xuICAgICAgICBpZiAoY2hlY2tBbmNlc3RvciA9PSBudWxsIHx8IGNoZWNrQW5jZXN0b3Iubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPSBcImJvZHlcIilcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgXG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuICAgICAgICBsZXQgd2Fsa05vZGUgPSBydWxlQ29udGV4dC5maXJzdENoaWxkIGFzIE5vZGU7XG4gICAgICAgIHdoaWxlIChwYXNzZWQgJiYgd2Fsa05vZGUpIHtcbiAgICAgICAgICAgIC8vIENvbXBseSB0byB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyB3aWxsIGJlIGRvbmUgYnkgZGVmYXVsdCBhcyB0aGlzIHJ1bGUgdHJpZ2dlcnMgb24gZWFjaCBlbGVtZW50XG4gICAgICAgICAgICAvLyBhbmQgZm9yIGVhY2ggZWxlbWVudCBpdCBvbmx5IGNoZWNrcyB0aGF0IHNpbmdsZSBlbGVtZW50cyB0ZXh0IG5vZGVzIGFuZCBub3RoaW5nIGVsc2UuIFNvIGFsbCBpbm5lciBlbGVtZW50cyB3aWxsIGJlXG4gICAgICAgICAgICAvLyBjb3ZlcmVkIG9uIHRoZWlyIG93bi4gQ3VycmVudGx5IGZvciB0aGlzIHJ1bGUgYnkgZGVmYXVsdCBDaGVjayBIaWRkZW4gQ29udGVudCB3aWxsIHdvcmssIGFzIHdlIGFyZSBkb2luZ1xuICAgICAgICAgICAgLy8gYSBub2RlIHdhbGsgb25seSBvbiBzaWJsaW5ncyBzbyBpdCB3b3VsZCBub3QgZ2V0IHRleHQgbm9kZXMgZnJvbSBvdGhlciBzaWJsaW5ncyBhdCBhbGwuXG4gICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSBpbiB0aGUgZnV0dXJlIHNvbWV0aGluZyBjaG5nZXMsIGp1c3QgbmVlZCB0byBhZGQgJiYgIVJQVFV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbih3YWxrTm9kZSkgdG8gdGhlIGJlbG93XG4gICAgICAgICAgICAvLyBpZi5cbiAgICAgICAgICAgIGlmICh3YWxrTm9kZS5ub2RlTmFtZSA9PSBcIiN0ZXh0XCIpIHtcbiAgICAgICAgICAgICAgICBsZXQgdHh0VmFsID0gd2Fsa05vZGUubm9kZVZhbHVlO1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9ICEoLyhefFxccylbYS16QS1aXSBbYS16QS1aXSBbYS16QS1aXSgkfFxccykvLnRlc3QodHh0VmFsKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3YWxrTm9kZSA9IHdhbGtOb2RlLm5leHRTaWJsaW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfdGV4dFwiKTtcblxuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgQVJJQU1hcHBlciB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFNYXBwZXJcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3Qgd2lkZ2V0X3RhYmJhYmxlX2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJ3aWRnZXRfdGFiYmFibGVfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmJ1dHRvbixhcmlhOmxpbmssYXJpYTpzcGluYnV0dG9uLGFyaWE6dGFibGlzdCxhcmlhOmNvbWJvYm94LGFyaWE6bGlzdGJveCxhcmlhOm1lbnUsYXJpYTpyYWRpb2dyb3VwLGFyaWE6dHJlZSxhcmlhOm1lbnViYXIsIGFyaWE6Z3JpZCwgYXJpYTp0cmVlZ3JpZCwgYXJpYTpjaGVja2JveCxhcmlhOnNsaWRlcixhcmlhOnNwaW5idXR0b24sYXJpYTp0ZXh0Ym94LGFyaWE6c2Nyb2xsYmFyLGFyaWE6c2xpZGVyLGFyaWE6c3BpbmJ1dHRvblwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiSUJNQV9Gb2N1c19UYWJiYWJsZVwiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcImZhaWxfbm9fdGFiYmFibGVcIjogXCJmYWlsX25vX3RhYmJhYmxlXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwid2lkZ2V0X3RhYmJhYmxlX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfbm9fdGFiYmFibGVcIjogXCJ3aWRnZXRfdGFiYmFibGVfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJ3aWRnZXRfdGFiYmFibGVfZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcImZhaWxfbm9fdGFiYmFibGVcIjogXCJDb21wb25lbnQgd2l0aCBcXFwiezB9XFxcIiByb2xlIGRvZXMgbm90IGhhdmUgYSB0YWJiYWJsZSBlbGVtZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQ29tcG9uZW50IG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgdGFiYmFibGUgZWxlbWVudFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgICAgLy9za2lwIHRoZSBjaGVjayBpZiB0aGUgZWxlbWVudCBpcyBoaWRkZW4gb3IgZGlzYWJsZWRcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSB8fCBDb21tb25VdGlsLmlzTm9kZURpc2FibGVkKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgc2hvdWxkIGJlIGEgcHJlc2VudGF0aW9uYWwgY2hpbGQgb2YgYW4gZWxlbWVudFxuICAgICAgICBpZiAoQXJpYVV0aWwuc2hvdWxkQmVQcmVzZW50YXRpb25hbENoaWxkKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgXG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIC8vaWdub3JlIGRhdGFsaXN0IGVsZW1lbnQgY2hlY2sgc2luY2UgaXQgd2lsbCBiZSBwYXJ0IG9mIGEgaW5wdXQgZWxlbWVudCBvciBoaWRkZW4gYnkgZGVmYXVsdFxuICAgICAgICBpZiAobm9kZU5hbWUgPT09ICdkYXRhbGlzdCcpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIFxuICAgICAgICAvLyBDb21wb3NpdGUgdXNlciBpbnRlcmZhY2Ugd2lkZ2V0IHJvbGVzLiBUaGV5IGFjdCBhcyBjb250YWluZXJzIHRoYXQgbWFuYWdlIG90aGVyLCBjb250YWluZWQgd2lkZ2V0cy5cbiAgICAgICAgbGV0IHJvbGVDb250YWluZXJzID0gW1wiY29tYm9ib3hcIiwgXCJncmlkXCIsIFwibGlzdGJveFwiLCBcIm1lbnVcIiwgXCJtZW51YmFyXCIsIFwicmFkaW9ncm91cFwiLCBcInRhYmxpc3RcIiwgXCJ0cmVlXCIsIFwidHJlZWdyaWRcIl07XG4gICAgICAgIGZvciAoY29uc3Qgcm9sZSBvZiByb2xlQ29udGFpbmVycykge1xuICAgICAgICAgICAgaWYgKEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUocnVsZUNvbnRleHQsIHJvbGUsIHRydWUpICE9IG51bGwpIFxuICAgICAgICAgICAgICAgIC8vIGl0J3MgYSBkZXNjZW5kYW50IG9mIGEgY29tcG9zaXRlIHdpZGdldCBhbHJlYWR5IGV4YW1pbmVkXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0gICAgXG4gICAgICAgIGxldCByb2xlID0gQVJJQU1hcHBlci5ub2RlVG9Sb2xlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgbGV0IGNvdW50ID0gMDtcbiAgICAgICAgaWYgKENvbW1vblV0aWwuaXNUYWJiYWJsZShydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgICsrY291bnQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgbm9kZSBoYXMgY2hpbGRyZW4sIGxvb2sgZm9yIHRhYiBzdG9wcyBpbiB0aGUgY2hpbGRyZW5cbiAgICAgICAgLy8gc2tpcCB0aGUgY291bnQgaWYgdGhlIGVsZW1lbnQgcmVxdWlyZXMgcHJlc2VudGF0aW9uYWwgY2hpbGRyZW4gb25seVxuICAgICAgICBpZiAoY291bnQgPCAxICYmICFBcmlhVXRpbC5jb250YWluc1ByZXNlbnRhdGlvbmFsQ2hpbGRyZW5Pbmx5KHJ1bGVDb250ZXh0KSAmJiBydWxlQ29udGV4dC5maXJzdENoaWxkKSB7XG4gICAgICAgICAgICBsZXQgbncgPSBuZXcgRE9NV2Fsa2VyKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgIHdoaWxlIChjb3VudCA8IDEgJiYgbncubmV4dE5vZGUoKSAmJiBudy5ub2RlICE9IHJ1bGVDb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgaWYgKG53Lm5vZGUubm9kZVR5cGUgPT0gMSAmJiAhbncuYkVuZFRhZyAmJiBDb21tb25VdGlsLmlzVGFiYmFibGUobncubm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgKytjb3VudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHBhc3NlZCA9IGNvdW50ID49IDE7XG4gICAgICAgIHJldHVybiBwYXNzZWQgPyBSdWxlUGFzcyhcInBhc3NcIikgOiBSdWxlUG90ZW50aWFsKFwiZmFpbF9ub190YWJiYWJsZVwiLCBbcm9sZV0pO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IEFSSUFNYXBwZXIgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBTWFwcGVyXCI7XG5cbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IHdpZGdldF90YWJiYWJsZV9zaW5nbGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwid2lkZ2V0X3RhYmJhYmxlX3NpbmdsZVwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpidXR0b24sYXJpYTpsaW5rLGFyaWE6bWVudWl0ZW0sYXJpYTpzcGluYnV0dG9uLGFyaWE6dGFibGlzdCxhcmlhOmNvbWJvYm94LGFyaWE6bGlzdGJveCxhcmlhOm1lbnUsYXJpYTpyYWRpb2dyb3VwLGFyaWE6dHJlZSxhcmlhOmNoZWNrYm94LGFyaWE6b3B0aW9uLGFyaWE6cmFkaW8sYXJpYTpzbGlkZXIsYXJpYTpzcGluYnV0dG9uLGFyaWE6dGV4dGJveCxhcmlhOmNvbHVtbmhlYWRlcixhcmlhOnJvd2hlYWRlcixhcmlhOnNsaWRlcixhcmlhOnRhYlwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiSUJNQV9Gb2N1c19NdWx0aVRhYlwiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9tdWx0aXBsZV90YWJiYWJsZVwiOiBcInBvdGVudGlhbF9tdWx0aXBsZV90YWJiYWJsZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJ3aWRnZXRfdGFiYmFibGVfc2luZ2xlLmh0bWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX211bHRpcGxlX3RhYmJhYmxlXCI6IFwid2lkZ2V0X3RhYmJhYmxlX3NpbmdsZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwid2lkZ2V0X3RhYmJhYmxlX3NpbmdsZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJDb21wb25lbnRzIHdpdGggYSB3aWRnZXQgcm9sZSBzaG91bGQgaGF2ZSBubyBtb3JlIHRoYW4gb25lIHRhYmJhYmxlIGVsZW1lbnRcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX211bHRpcGxlX3RhYmJhYmxlXCI6IFwiQ29tcG9uZW50IHdpdGggXFxcInswfVxcXCIgcm9sZSBoYXMgbW9yZSB0aGFuIG9uZSB0YWJiYWJsZSBlbGVtZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQ29tcG9uZW50cyB3aXRoIGEgd2lkZ2V0IHJvbGUgbXVzdCBoYXZlIG5vIG1vcmUgdGhhbiBvbmUgdGFiYmFibGUgZWxlbWVudFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi4xLjFcIiwgXCIyLjQuM1wiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIG9yIGRpc2FibGVkXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkgfHwgQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIFxuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IHNob3VsZCBiZSBhIHByZXNlbnRhdGlvbmFsIGNoaWxkIG9mIGFuIGVsZW1lbnRcbiAgICAgICAgaWYgKEFyaWFVdGlsLnNob3VsZEJlUHJlc2VudGF0aW9uYWxDaGlsZChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIFxuICAgICAgICBsZXQgcm9sZSA9IEFSSUFNYXBwZXIubm9kZVRvUm9sZShydWxlQ29udGV4dCk7XG4gICAgICAgIGxldCBjb3VudCA9IDA7XG4gICAgICAgIGlmIChDb21tb25VdGlsLmlzVGFiYmFibGUocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICArK2NvdW50O1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIG5vZGUgaGFzIGNoaWxkcmVuLCBsb29rIGZvciB0YWIgc3RvcHMgaW4gdGhlIGNoaWxkcmVuXG4gICAgICAgIC8vc2tpcCB0aGUgY291bnQgaWYgdGhlIGVsZW1lbnQgcmVxdWlyZXMgcHJlc2VudGF0aW9uYWwgY2hpbGRyZW4gb25seVxuICAgICAgICBsZXQgbmFtZSA9IFtdO1xuICAgICAgICBpZiAoY291bnQgPCAyICYmICFBcmlhVXRpbC5jb250YWluc1ByZXNlbnRhdGlvbmFsQ2hpbGRyZW5Pbmx5KHJ1bGVDb250ZXh0KSAmJiBydWxlQ29udGV4dC5maXJzdENoaWxkKSB7XG4gICAgICAgICAgICBsZXQgbncgPSBuZXcgRE9NV2Fsa2VyKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgIHdoaWxlIChjb3VudCA8IDIgJiYgbncubmV4dE5vZGUoKSAmJiBudy5ub2RlICE9IHJ1bGVDb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgaWYgKG53Lm5vZGUubm9kZVR5cGUgPT0gMSAmJiAhbncuYkVuZFRhZyAmJiBDb21tb25VdGlsLmlzVGFiYmFibGUobncubm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUmFkaW8gaW5wdXRzIHdpdGggdGhlIHNhbWUgbmFtZSBuYXRpdmVseSBhcmUgb25seSBvbmUgdGFiIHN0b3BcbiAgICAgICAgICAgICAgICAgICAgLyoqaWYgKG53Lm5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2lucHV0JyAmJiAobncubm9kZSBhcyBFbGVtZW50KS5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpID09PSAncmFkaW8nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY3VyTmFtZSA9IChudy5ub2RlIGFzIEVsZW1lbnQpLmdldEF0dHJpYnV0ZShcIm5hbWVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZS5pbmNsdWRlcyhjdXJOYW1lKSkgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS5wdXNoKGN1ck5hbWUpO1xuICAgICAgICAgICAgICAgICAgICB9Ki9cbiAgICAgICAgICAgICAgICAgICAgKytjb3VudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHBhc3NlZCA9IGNvdW50IDwgMjtcbiAgICAgICAgaWYgKCFwYXNzZWQpXG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUocnVsZUNvbnRleHQsIFwid2lkZ2V0X3RhYmJhYmxlX3NpbmdsZVwiLCBcInBvdGVudGlhbF9tdWx0aXBsZV90YWJiYWJsZVwiKTtcbiAgICAgICAgcmV0dXJuIHBhc3NlZCA/IFJ1bGVQYXNzKFwicGFzc1wiKSA6IFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfbXVsdGlwbGVfdGFiYmFibGVcIiwgW3JvbGVdKTtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgIENvcHlyaWdodDo6IDIwMjAtIElCTSwgSW5jXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbi8vIFRoaXMgZmlsZSBjb21lcyBmcm9tIGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9hY3QtcnVsZXMvYWN0LXRvb2xzL21haW4vc3JjL2RhdGEvc2MtdXJscy5qc29uXG5pbXBvcnQgKiBhcyBTQ1VSTHMgZnJvbSBcIi4vc2MtdXJscy5qc29uXCJcbmltcG9ydCB7IEd1aWRlbGluZSwgZUd1aWRlbGluZUNhdGVnb3J5LCBlR3VpZGVsaW5lVHlwZSB9IGZyb20gXCIuL2FwaS9JR3VpZGVsaW5lXCI7XG5jb25zdCBTQ3MgPSBbXTtcbmZvciAoY29uc3Qga2V5IGluIFNDVVJMcykge1xuICAgIFNDcy5wdXNoKFNDVVJMc1trZXldKTtcbn1cblxuY29uc3Qgc3VtbWFyaWVzID0ge1xuICAgIFwiMS4xLjFcIjogXCJBbGwgbm9uLXRleHQgY29udGVudCB0aGF0IGlzIHByZXNlbnRlZCB0byB0aGUgdXNlciBoYXMgYSB0ZXh0IGFsdGVybmF0aXZlIHRoYXQgc2VydmVzIHRoZSBlcXVpdmFsZW50IHB1cnBvc2UuXCIsXG4gICAgXCIxLjIuMVwiOiBcIkZvciBwcmVyZWNvcmRlZCBhdWRpby1vbmx5IG9yIHZpZGVvLW9ubHkgbWVkaWEsIGFuIGFsdGVybmF0aXZlIHByb3ZpZGVzIGVxdWl2YWxlbnQgaW5mb3JtYXRpb24uXCIsXG4gICAgXCIxLjIuMlwiOiBcIkNhcHRpb25zIGFyZSBwcm92aWRlZCBmb3IgYWxsIHByZXJlY29yZGVkIGF1ZGlvIGNvbnRlbnQgaW4gc3luY2hyb25pemVkIG1lZGlhLlwiLFxuICAgIFwiMS4yLjNcIjogXCJBbiBhbHRlcm5hdGl2ZSBmb3IgdGltZS1iYXNlZCBtZWRpYSBvciBhdWRpbyBkZXNjcmlwdGlvbiBvZiB0aGUgcHJlcmVjb3JkZWQgdmlkZW8gY29udGVudCBpcyBwcm92aWRlZCBmb3Igc3luY2hyb25pemVkIG1lZGlhLlwiLFxuICAgIFwiMS4yLjRcIjogXCJDYXB0aW9ucyBhcmUgcHJvdmlkZWQgZm9yIGFsbCBsaXZlIGF1ZGlvIGNvbnRlbnQgaW4gc3luY2hyb25pemVkIG1lZGlhLlwiLFxuICAgIFwiMS4yLjVcIjogXCJBdWRpbyBkZXNjcmlwdGlvbiBpcyBwcm92aWRlZCBmb3IgYWxsIHByZXJlY29yZGVkIHZpZGVvIGNvbnRlbnQgaW4gc3luY2hyb25pemVkIG1lZGlhLlwiLFxuICAgIFwiMS4zLjFcIjogXCJJbmZvcm1hdGlvbiwgc3RydWN0dXJlLCBhbmQgcmVsYXRpb25zaGlwcyBjb252ZXllZCB0aHJvdWdoIHByZXNlbnRhdGlvbiBjYW4gYmUgcHJvZ3JhbW1hdGljYWxseSBkZXRlcm1pbmVkIG9yIGFyZSBhdmFpbGFibGUgaW4gdGV4dC5cIixcbiAgICBcIjEuMy4yXCI6IFwiV2hlbiB0aGUgc2VxdWVuY2UgaW4gd2hpY2ggY29udGVudCBpcyBwcmVzZW50ZWQgYWZmZWN0cyBpdHMgbWVhbmluZywgYSBjb3JyZWN0IHJlYWRpbmcgc2VxdWVuY2UgY2FuIGJlIHByb2dyYW1tYXRpY2FsbHkgZGV0ZXJtaW5lZC5cIixcbiAgICBcIjEuMy4zXCI6IFwiSW5zdHJ1Y3Rpb25zIHByb3ZpZGVkIGZvciB1bmRlcnN0YW5kaW5nIGFuZCBvcGVyYXRpbmcgY29udGVudCBkbyBub3QgcmVseSBzb2xlbHkgb24gc2Vuc29yeSBjaGFyYWN0ZXJpc3RpY3Mgb2YgY29tcG9uZW50cyBzdWNoIGFzIHNoYXBlLCBzaXplLCB2aXN1YWwgbG9jYXRpb24sIG9yaWVudGF0aW9uLCBvciBzb3VuZC5cIixcbiAgICBcIjEuMy40XCI6IFwiQ29udGVudCBkb2VzIG5vdCByZXN0cmljdCBpdHMgdmlldyBhbmQgb3BlcmF0aW9uIHRvIGEgc2luZ2xlIGRpc3BsYXkgb3JpZW50YXRpb24sIHN1Y2ggYXMgcG9ydHJhaXQgb3IgbGFuZHNjYXBlLlwiLFxuICAgIFwiMS4zLjVcIjogXCJUaGUgcHVycG9zZSBvZiBlYWNoIGlucHV0IGZpZWxkIHRoYXQgY29sbGVjdHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHVzZXIgY2FuIGJlIHByb2dyYW1tYXRpY2FsbHkgZGV0ZXJtaW5lZCB3aGVuIHRoZSBmaWVsZCBzZXJ2ZXMgYSBjb21tb24gcHVycG9zZS5cIixcbiAgICBcIjEuNC4xXCI6IFwiQ29sb3IgaXMgbm90IHVzZWQgYXMgdGhlIG9ubHkgdmlzdWFsIG1lYW5zIG9mIGNvbnZleWluZyBpbmZvcm1hdGlvbiwgaW5kaWNhdGluZyBhbiBhY3Rpb24sIHByb21wdGluZyBhIHJlc3BvbnNlLCBvciBkaXN0aW5ndWlzaGluZyBhIHZpc3VhbCBlbGVtZW50LlwiLFxuICAgIFwiMS40LjJcIjogXCJJZiBhbnkgYXVkaW8gcGxheXMgYXV0b21hdGljYWxseSBmb3IgbW9yZSB0aGFuIDMgc2Vjb25kcywgZWl0aGVyIGEgbWVjaGFuaXNtIGlzIGF2YWlsYWJsZSB0byBwYXVzZSBvciBzdG9wIHRoZSBhdWRpbywgb3IgYSBtZWNoYW5pc20gaXMgYXZhaWxhYmxlIHRvIGNvbnRyb2wgYXVkaW8gdm9sdW1lIGluZGVwZW5kZW50bHkgZnJvbSB0aGUgb3ZlcmFsbCBzeXN0ZW0gdm9sdW1lIGxldmVsLlwiLFxuICAgIFwiMS40LjNcIjogXCJUaGUgdmlzdWFsIHByZXNlbnRhdGlvbiBvZiB0ZXh0IGFuZCBpbWFnZXMgb2YgdGV4dCBoYXMgYSBjb250cmFzdCByYXRpbyBvZiBhdCBsZWFzdCA0LjU6MSwgd2l0aCBhIDM6MSByYXRpbyBmb3IgbGFyZ2Utc2NhbGUgdGV4dC5cIixcbiAgICBcIjEuNC40XCI6IFwiVGV4dCBjYW4gYmUgcmVzaXplZCB3aXRob3V0IGFzc2lzdGl2ZSB0ZWNobm9sb2d5IHVwIHRvIDIwMCBwZXJjZW50IHdpdGhvdXQgbG9zcyBvZiBjb250ZW50IG9yIGZ1bmN0aW9uYWxpdHkuXCIsXG4gICAgXCIxLjQuNVwiOiBcIklmIHRoZSB0ZWNobm9sb2dpZXMgYmVpbmcgdXNlZCBjYW4gYWNoaWV2ZSB0aGUgdmlzdWFsIHByZXNlbnRhdGlvbiwgdGV4dCBzaG91bGQgbm90IGJlIHVzZWQgdG8gY29udmV5IGluZm9ybWF0aW9uIHJhdGhlciB0aGFuIGltYWdlcyBvZiB0ZXh0LlwiLFxuICAgIFwiMS40LjEwXCI6IFwiQ29udGVudCBjYW4gcmVmbG93IHdpdGhvdXQgbG9zcyBvZiBpbmZvcm1hdGlvbiBvciBmdW5jdGlvbmFsaXR5LCBhbmQgd2l0aG91dCByZXF1aXJpbmcgc2Nyb2xsaW5nIGluIHR3byBkaW1lbnNpb25zLlwiLFxuICAgIFwiMS40LjExXCI6IFwiVGhlIHBhcnRzIG9mIGdyYXBoaWNhbCBvYmplY3RzIHJlcXVpcmVkIHRvIHVuZGVyc3RhbmQgdGhlIGNvbnRlbnQsIGFuZCB0aGUgdmlzdWFsIGluZm9ybWF0aW9uIHJlcXVpcmVkIHRvIGlkZW50aWZ5IFVJIGNvbXBvbmVudHMgYW5kIHN0YXRlcywgaGF2ZSBhIGNvbnRyYXN0IHJhdGlvIG9mIGF0IGxlYXN0IDM6MSBhZ2FpbnN0IGFkamFjZW50IGNvbG9ycy5cIixcbiAgICBcIjEuNC4xMlwiOiBcIk5vIGxvc3Mgb2YgY29udGVudCBvciBmdW5jdGlvbmFsaXR5IG9jY3VycyB3aGVuIHVzZXJzIGNoYW5nZSBsZXR0ZXIsIHdvcmQgYW5kIHBhcmFncmFwaCBzcGFjaW5nLCBhcyB3ZWxsIGFzIGxpbmUgaGVpZ2h0LlwiLFxuICAgIFwiMS40LjEzXCI6IFwiV2hlcmUgaG92ZXIgb3IgZm9jdXMgYWN0aW9ucyBjYXVzZSBhZGRpdGlvbmFsIGNvbnRlbnQgdG8gYmVjb21lIHZpc2libGUgYW5kIGhpZGRlbiwgdGhlIGFkZGl0aW9uYWwgY29udGVudCBpcyBkaXNtaXNzYWJsZSwgaG92ZXJhYmxlIGFuZCBwZXJzaXN0ZW50LlwiLFxuICAgIFwiMi4xLjFcIjogXCJBbGwgZnVuY3Rpb25hbGl0eSBvZiB0aGUgY29udGVudCBpcyBvcGVyYWJsZSB0aHJvdWdoIGEga2V5Ym9hcmQgaW50ZXJmYWNlIHdpdGhvdXQgcmVxdWlyaW5nIHNwZWNpZmljIHRpbWluZ3MgZm9yIGluZGl2aWR1YWwga2V5c3Ryb2tlcy5cIixcbiAgICBcIjIuMS4yXCI6IFwiSWYga2V5Ym9hcmQgZm9jdXMgY2FuIGJlIG1vdmVkIHRvIGEgY29tcG9uZW50IHVzaW5nIGEga2V5Ym9hcmQgaW50ZXJmYWNlLCB0aGVuIGZvY3VzIGNhbiBiZSBtb3ZlZCBhd2F5IGZyb20gdGhhdCBjb21wb25lbnQgdXNpbmcgb25seSBhIGtleWJvYXJkIGludGVyZmFjZSwgYW5kLCBpZiBpdCByZXF1aXJlcyBtb3JlIHRoYW4gdW5tb2RpZmllZCBhcnJvdyBvciB0YWIga2V5cyBvciBvdGhlciBzdGFuZGFyZCBleGl0IG1ldGhvZHMsIHRoZSB1c2VyIGlzIGFkdmlzZWQgb2YgdGhlIG1ldGhvZCBmb3IgbW92aW5nIGZvY3VzIGF3YXkuXCIsXG4gICAgXCIyLjEuNFwiOiBcIklmIGEga2V5Ym9hcmQgc2hvcnRjdXQgaXMgaW1wbGVtZW50ZWQgdXNpbmcgb25seSBsZXR0ZXIsIHB1bmN0dWF0aW9uLCBudW1iZXIgb3Igc3ltYm9sIGNoYXJhY3RlcnMsIHRoZW4gdGhlIHNob3J0Y3V0IGNhbiBiZSB0dXJuZWQgb2ZmLCByZW1hcHBlZCBvciBhY3RpdmF0ZWQgb25seSBvbiBmb2N1cy5cIixcbiAgICBcIjIuMi4xXCI6IFwiRm9yIGVhY2ggdGltZSBsaW1pdCB0aGF0IGlzIHNldCBieSB0aGUgY29udGVudCwgdGhlIHVzZXIgY2FuIHR1cm4gb2ZmLCBhZGp1c3QsIG9yIGV4dGVuZCB0aGUgbGltaXQuXCIsXG4gICAgXCIyLjIuMlwiOiBcIkZvciBtb3ZpbmcsIGJsaW5raW5nLCBzY3JvbGxpbmcsIG9yIGF1dG8tdXBkYXRpbmcgaW5mb3JtYXRpb24sIHRoZSB1c2VyIGNhbiBwYXVzZSwgc3RvcCwgaGlkZSBvciBhZGp1c3QgdGhlIGluZm9ybWF0aW9uLlwiLFxuICAgIFwiMi4zLjFcIjogXCJDb250ZW50IGRvZXMgbm90IGNvbnRhaW4gYW55dGhpbmcgdGhhdCBmbGFzaGVzIG1vcmUgdGhhbiB0aHJlZSB0aW1lcyBpbiBhbnkgb25lIHNlY29uZCBwZXJpb2QsIG9yIHRoZSBmbGFzaCBpcyBiZWxvdyB0aGUgZ2VuZXJhbCBmbGFzaCBhbmQgcmVkIGZsYXNoIHRocmVzaG9sZHMuXCIsXG4gICAgXCIyLjQuMVwiOiBcIkEgbWVjaGFuaXNtIGlzIGF2YWlsYWJsZSB0byBieXBhc3MgYmxvY2tzIG9mIGNvbnRlbnQgdGhhdCBhcmUgcmVwZWF0ZWQgb24gbXVsdGlwbGUgV2ViIHBhZ2VzLlwiLFxuICAgIFwiMi40LjJcIjogXCJXZWIgcGFnZXMsIG5vbi13ZWIgZG9jdW1lbnRzLCBhbmQgc29mdHdhcmUgaGF2ZSB0aXRsZXMgdGhhdCBkZXNjcmliZSB0b3BpYyBvciBwdXJwb3NlLlwiLFxuICAgIFwiMi40LjNcIjogXCJJZiBjb250ZW50IGNhbiBiZSBuYXZpZ2F0ZWQgc2VxdWVudGlhbGx5IGFuZCB0aGUgbmF2aWdhdGlvbiBzZXF1ZW5jZXMgYWZmZWN0IG1lYW5pbmcgb3Igb3BlcmF0aW9uLCBmb2N1c2FibGUgY29tcG9uZW50cyByZWNlaXZlIGZvY3VzIGluIGFuIG9yZGVyIHRoYXQgcHJlc2VydmVzIG1lYW5pbmcgYW5kIG9wZXJhYmlsaXR5LlwiLFxuICAgIFwiMi40LjRcIjogXCJUaGUgcHVycG9zZSBvZiBlYWNoIGxpbmsgY2FuIGJlIGRldGVybWluZWQgZnJvbSB0aGUgbGluayB0ZXh0IGFsb25lIG9yIGZyb20gdGhlIGxpbmsgdGV4dCB0b2dldGhlciB3aXRoIGl0cyBwcm9ncmFtbWF0aWNhbGx5IGRldGVybWluZWQgbGluayBjb250ZW50LlwiLFxuICAgIFwiMi40LjVcIjogXCJNb3JlIHRoYW4gb25lIHdheSBpcyBhdmFpbGFibGUgdG8gbG9jYXRlIGEgV2ViIHBhZ2Ugd2l0aGluIGEgc2V0IG9mIFdlYiBwYWdlcywgZXhjZXB0IHdoZXJlIHRoZSBXZWIgUGFnZSBpcyB0aGUgcmVzdWx0IG9mLCBvciBhIHN0ZXAgaW4sIGEgcHJvY2Vzcy5cIixcbiAgICBcIjIuNC42XCI6IFwiSGVhZGluZ3MgYW5kIGxhYmVscyBkZXNjcmliZSB0b3BpYyBvciBwdXJwb3NlLlwiLFxuICAgIFwiMi40LjdcIjogXCJBbnkga2V5Ym9hcmQgb3BlcmFibGUgdXNlciBpbnRlcmZhY2UgaGFzIGEgbW9kZSBvZiBvcGVyYXRpb24gd2hlcmUgdGhlIGtleWJvYXJkIGZvY3VzIGluZGljYXRvciBpcyB2aXNpYmxlLlwiLFxuICAgIFwiMi40LjExXCI6IFwiV2hlbiBhbiBlbGVtZW50IHJlY2VpdmVzIGZvY3VzLCBpdCBpcyBub3QgZW50aXJlbHkgY292ZXJlZCBieSBvdGhlciBjb250ZW50LlwiLFxuICAgIFwiMi41LjFcIjogXCJBbGwgZnVuY3Rpb25hbGl0eSB0aGF0IHVzZXMgbXVsdGlwb2ludCBvciBwYXRoLWJhc2VkIGdlc3R1cmVzIGZvciBvcGVyYXRpb24gY2FuIGJlIG9wZXJhdGVkIHdpdGggYSBzaW5nbGUgcG9pbnRlciB3aXRob3V0IGEgcGF0aC1iYXNlZCBnZXN0dXJlLlwiLFxuICAgIFwiMi41LjJcIjogXCJGb3IgZnVuY3Rpb25hbGl0eSB0aGF0IGNhbiBiZSBvcGVyYXRlZCB1c2luZyBhIHNpbmdsZSBwb2ludGVyLCBjb21wbGV0aW9uIG9mIHRoZSBmdW5jdGlvbiBpcyBvbiB0aGUgdXAtZXZlbnQgd2l0aCBhbiBhYmlsaXR5IHRvIGFib3J0LCB1bmRvIG9yIHJldmVyc2UgdGhlIG91dGNvbWUuXCIsXG4gICAgXCIyLjUuM1wiOiBcIkZvciB1c2VyIGludGVyZmFjZSBjb21wb25lbnRzIHdpdGggbGFiZWxzIHRoYXQgaW5jbHVkZSB0ZXh0IG9yIGltYWdlcyBvZiB0ZXh0LCB0aGUgYWNjZXNzaWJsZSBuYW1lIGNvbnRhaW5zIHRoZSB0ZXh0IHRoYXQgaXMgcHJlc2VudGVkIHZpc3VhbGx5LlwiLFxuICAgIFwiMi41LjRcIjogXCJGdW5jdGlvbmFsaXR5IHRoYXQgY2FuIGJlIG9wZXJhdGVkIGJ5IG1vdGlvbiBjYW4gYWxzbyBiZSBvcGVyYXRlZCBieSB1c2VyIGludGVyZmFjZSBjb21wb25lbnRzLCBhbmQgdGhlIG1vdGlvbiB0cmlnZ2VyIGNhbiBiZSBkaXNhYmxlZC5cIixcbiAgICBcIjIuNS44XCI6IFwiVGhlIHNpemUgb2YgdGhlIHRhcmdldCBmb3IgcG9pbnRlciBpbnB1dHMgaXMgYXQgbGVhc3QgMjQgYnkgMjQgQ1NTIHBpeGVscy5cIixcbiAgICBcIjIuNS43XCI6IFwiQWxsIGZ1bmN0aW9uYWxpdHkgdGhhdCB1c2VzIGEgZHJhZ2dpbmcgbW92ZW1lbnQgZm9yIG9wZXJhdGlvbiBjYW4gYmUgYWNoaWV2ZWQgYnkgYSBzaW5nbGUgcG9pbnRlciB3aXRob3V0IGRyYWdnaW5nLlwiLFxuICAgIFwiMy4xLjFcIjogXCJUaGUgZGVmYXVsdCBodW1hbiBsYW5ndWFnZSBvZiBXZWIgcGFnZXMsIG5vbi1XZWIgZG9jdW1lbnRzLCBvciBzb2Z0d2FyZSBjYW4gYmUgcHJvZ3JhbW1hdGljYWxseSBkZXRlcm1pbmVkLlwiLFxuICAgIFwiMy4xLjJcIjogXCJUaGUgaHVtYW4gbGFuZ3VhZ2Ugb2YgZWFjaCBwYXNzYWdlIG9yIHBocmFzZSBpbiB0aGUgY29udGVudCBjYW4gYmUgcHJvZ3JhbW1hdGljYWxseSBkZXRlcm1pbmVkLlwiLFxuICAgIFwiMy4yLjFcIjogXCJXaGVuIGFueSBjb21wb25lbnQgcmVjZWl2ZXMgZm9jdXMsIGl0IGRvZXMgbm90IGluaXRpYXRlIGEgY2hhbmdlIG9mIGNvbnRleHQuXCIsXG4gICAgXCIzLjIuMlwiOiBcIkNoYW5naW5nIHRoZSBzZXR0aW5nIG9mIGFueSB1c2VyIGludGVyZmFjZSBjb21wb25lbnQgZG9lcyBub3QgYXV0b21hdGljYWxseSBjYXVzZSBhIGNoYW5nZSBvZiBjb250ZXh0IHVubGVzcyB0aGUgdXNlciBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBiZWhhdmlvciBiZWZvcmUgdXNpbmcgdGhlIGNvbXBvbmVudC5cIixcbiAgICBcIjMuMi4zXCI6IFwiTmF2aWdhdGlvbmFsIG1lY2hhbmlzbXMgdGhhdCBhcmUgcmVwZWF0ZWQgb24gbXVsdGlwbGUgV2ViIHBhZ2VzIHdpdGhpbiBhIHNldCBvZiBXZWIgcGFnZXMgb2NjdXIgaW4gdGhlIHNhbWUgcmVsYXRpdmUgb3JkZXIgZWFjaCB0aW1lIHRoZXkgYXJlIHJlcGVhdGVkLCB1bmxlc3MgYSBjaGFuZ2UgaXMgaW5pdGlhdGVkIGJ5IHRoZSB1c2VyLlwiLFxuICAgIFwiMy4yLjRcIjogXCJDb21wb25lbnRzIHRoYXQgaGF2ZSB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IHdpdGhpbiBhIHNldCBvZiBXZWIgcGFnZXMgYXJlIGlkZW50aWZpZWQgY29uc2lzdGVudGx5LlwiLFxuICAgIFwiMy4yLjZcIjogXCJNYWtlIGl0IGVhc2llciB0byBmaW5kIGhlbHAgYW5kIHN1cHBvcnQuIElmIGEgV2ViIHBhZ2UgY29udGFpbnMgaGVscCBtZWNoYW5pc21zIHRoZXkgb2NjdXIgaW4gdGhlIHNhbWUgb3JkZXIgcmVsYXRpdmUgdG8gb3RoZXIgcGFnZSBjb250ZW50LCB1bmxlc3MgYSBjaGFuZ2UgaXMgaW5pdGlhdGVkIGJ5IHRoZSB1c2VyLlwiLFxuICAgIFwiMy4zLjFcIjogXCJJZiBhbiBpbnB1dCBlcnJvciBpcyBhdXRvbWF0aWNhbGx5IGRldGVjdGVkLCB0aGUgaXRlbSB0aGF0IGlzIGluIGVycm9yIGlzIGlkZW50aWZpZWQgYW5kIHRoZSBlcnJvciBpcyBkZXNjcmliZWQgdG8gdGhlIHVzZXIgaW4gdGV4dC5cIixcbiAgICBcIjMuMy4yXCI6IFwiTGFiZWxzIG9yIGluc3RydWN0aW9ucyBhcmUgcHJvdmlkZWQgd2hlbiBjb250ZW50IHJlcXVpcmVzIHVzZXIgaW5wdXQuXCIsXG4gICAgXCIzLjMuM1wiOiBcIklmIGFuIGlucHV0IGVycm9yIGlzIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgYW5kIHN1Z2dlc3Rpb25zIGZvciBjb3JyZWN0aW9uIGFyZSBrbm93biwgdGhlbiB0aGUgc3VnZ2VzdGlvbnMgYXJlIHByb3ZpZGVkIHRvIHRoZSB1c2VyLCB1bmxlc3MgaXQgd291bGQgamVvcGFyZGl6ZSB0aGUgc2VjdXJpdHkgb3IgcHVycG9zZSBvZiB0aGUgY29udGVudC5cIixcbiAgICBcIjMuMy40XCI6IFwiRm9yIGNvbnRlbnQgdGhhdCBjYXVzZSBsZWdhbCBjb21taXRtZW50cyBvciBmaW5hbmNpYWwgdHJhbnNhY3Rpb25zIGZvciB0aGUgdXNlciB0byBvY2N1ciwgdGhhdCBtb2RpZnkgb3IgZGVsZXRlIHVzZXItY29udHJvbGxhYmxlIGRhdGEgaW4gZGF0YSBzdG9yYWdlIHN5c3RlbXMsIG9yIHRoYXQgc3VibWl0IHVzZXIgdGVzdCByZXNwb25zZXMsIHRoZSB1c2VyIGNhbiByZXZlcnNlLCBjb3JyZWN0LCBvciBjb25maXJtIHRoZSBhY3Rpb24uXCIsXG4gICAgXCIzLjMuN1wiOiBcIk1ha2UgaXQgZWFzaWVyIGZvciB1c2VycyB0byBjb21wbGV0ZSBtdWx0aS1zdGVwIHByb2Nlc3Nlcy4gRG9uJ3QgYXNrIGZvciB0aGUgc2FtZSBpbmZvcm1hdGlvbiB0d2ljZSBpbiB0aGUgc2FtZSBzZXNzaW9uLlwiLFxuICAgIFwiMy4zLjhcIjogXCJNYWtlIGxvZ2lucyBwb3NzaWJsZSB3aXRoIGxlc3MgbWVudGFsIGVmZm9ydC4gRG9uJ3QgbWFrZSBwZW9wbGUgc29sdmUsIHJlY2FsbCwgb3IgdHJhbnNjcmliZSBzb21ldGhpbmcgdG8gbG9nIGluLlwiLFxuICAgIFwiNC4xLjFcIjogXCIoT2Jzb2xldGUgYW5kIHJlbW92ZWQpIFRoaXMgcmVxdWlyZW1lbnQgd2FzIG9yaWdpbmFsbHkgYWRvcHRlZCB0byBhZGRyZXNzIHByb2JsZW1zIHRoYXQgYXNzaXN0aXZlIHRlY2hub2xvZ3kgKEFUKSBoYWQgZGlyZWN0bHkgcGFyc2luZyBIVE1MLiBBVCBubyBsb25nZXIgaGFzIGFueSBuZWVkIHRvIGRpcmVjdGx5IHBhcnNlIEhUTUwuIENvbnNlcXVlbnRseSwgdGhlc2UgcHJvYmxlbXMgZWl0aGVyIG5vIGxvbmdlciBleGlzdCBvciBhcmUgYWRkcmVzc2VkIGJ5IG90aGVyIHJlcXVpcmVtZW50cy5cIiwgXG4gICAgXCI0LjEuMlwiOiBcIkZvciBhbGwgdXNlciBpbnRlcmZhY2UgY29tcG9uZW50cyAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG86IGZvcm0gZWxlbWVudHMsIGxpbmtzIGFuZCBjb21wb25lbnRzIGdlbmVyYXRlZCBieSBzY3JpcHRzKSwgdGhlIG5hbWUgYW5kIHJvbGUgY2FuIGJlIHByb2dyYW1tYXRpY2FsbHkgZGV0ZXJtaW5lZDsgc3RhdGVzLCBwcm9wZXJ0aWVzLCBhbmQgdmFsdWVzIHRoYXQgY2FuIGJlIHNldCBieSB0aGUgdXNlciBjYW4gYmUgcHJvZ3JhbW1hdGljYWxseSBzZXQ7IGFuZCBub3RpZmljYXRpb24gb2YgY2hhbmdlcyB0byB0aGVzZSBpdGVtcyBpcyBhdmFpbGFibGUgdG8gdXNlciBhZ2VudHMsIGluY2x1ZGluZyBhc3Npc3RpdmUgdGVjaG5vbG9naWVzLlwiLFxuICAgIFwiNC4xLjNcIjogXCJJbiBjb250ZW50IGltcGxlbWVudGVkIHVzaW5nIG1hcmt1cCBsYW5ndWFnZXMsIHN0YXR1cyBtZXNzYWdlcyBjYW4gYmUgcHJvZ3JhbW1hdGljYWxseSBkZXRlcm1pbmVkIHRocm91Z2ggcm9sZSBvciBwcm9wZXJ0aWVzIHN1Y2ggdGhhdCB0aGV5IGNhbiBiZSBwcmVzZW50ZWQgdG8gdGhlIHVzZXIgYnkgYXNzaXN0aXZlIHRlY2hub2xvZ2llcyB3aXRob3V0IHJlY2VpdmluZyBmb2N1cy5cIixcbiAgICBcIkhUTUxcIjogXCJUaGUgSFRNTCBzcGVjaWZpY2F0aW9uIGlzc3VlcyB0aGF0IGNhdXNlIGFjY2Vzc2liaWxpdHkgaXNzdWVzIG1heSBiZSBjb3ZlcmVkIGJ5IG90aGVyIHJ1bGVzIGFuZCB3aWxsIGJlIHJlcG9ydGVkIHVuZGVyIHRob3NlIGFjY2Vzc2liaWxpdHkgcmVxdWlyZW1lbnRzLiBIb3dldmVyLCBzb21lIG5vbi1jb25mb3JtaW5nIEhUTUwgc3BlY2lmaWNhdGlvbiBpc3N1ZXMgYXJlIHN0aWxsIHJlcG9ydGVkLlwiLFxuICAgIFwiQVJJQVwiOiBcIlRoZSBBUklBIHNwZWNpZmljYXRpb24gaXNzdWVzIHRoYXQgY2F1c2UgYWNjZXNzaWJpbGl0eSBpc3N1ZXMgbWF5IGJlIGNvdmVyZWQgYnkgb3RoZXIgcnVsZXMgYW5kIHdpbGwgYmUgcmVwb3J0ZWQgdW5kZXIgdGhvc2UgYWNjZXNzaWJpbGl0eSByZXF1aXJlbWVudHMuIEhvd2V2ZXIsIHNvbWUgbm9uLWNvbmZvcm1pbmcgQVJJQSBzcGVjaWZpY2F0aW9uIGlzc3VlcyBhcmUgc3RpbGwgcmVwb3J0ZWQuXCIsXG59ICAgICBcblxuZXhwb3J0IGNvbnN0IGExMXlSdWxlc2V0czogR3VpZGVsaW5lW10gPSBbXG4gICAgLy8ge1xuICAgIC8vICAgICBpZDogXCJERUJVR1wiLFxuICAgIC8vICAgICBuYW1lOiBcIkRFQlVHIFJ1bGVzXCIsXG4gICAgLy8gICAgIGNhdGVnb3J5OiBlUnVsZUNhdGVnb3J5LkFDQ0VTU0lCSUxJVFksXG4gICAgLy8gICAgIGRlc2NyaXB0aW9uOiBcIlJ1bGVzIGZvciBkZWJ1Z2dpbmdcIixcbiAgICAvLyAgICAgY2hlY2twb2ludHM6IFt7XG4gICAgLy8gICAgICAgICBudW06IFwiMVwiLFxuICAgIC8vICAgICAgICAgbmFtZTogXCJEZWJ1ZyBDUCAxXCIsXG4gICAgLy8gICAgICAgICB3Y2FnTGV2ZWw6IFwiQVwiLFxuICAgIC8vICAgICAgICAgc3VtbWFyeTogXCJSdWxlcyBmb3IgRGVidWdcIlxuICAgIC8vICAgICB9XVxuICAgIC8vIH0sXG4gICAge1xuICAgICAgICBpZDogXCJFWFRFTlNJT05TXCIsXG4gICAgICAgIG5hbWU6IFwiRXh0ZW5zaW9uIFJ1bGVzXCIsXG4gICAgICAgIGNhdGVnb3J5OiBlR3VpZGVsaW5lQ2F0ZWdvcnkuQUNDRVNTSUJJTElUWSxcbiAgICAgICAgZGVzY3JpcHRpb246IFwiUnVsZXMgZm9yIGVuYWJsaW5nIHRoZSBicm93c2VyIGV4dGVuc2lvbnNcIixcbiAgICAgICAgdHlwZTogZUd1aWRlbGluZVR5cGUuRVhURU5TSU9OLFxuICAgICAgICBjaGVja3BvaW50czogW3tcbiAgICAgICAgICAgIG51bTogXCIxXCIsXG4gICAgICAgICAgICBuYW1lOiBcIkV4dGVuc2lvbiBDUCAxXCIsXG4gICAgICAgICAgICB3Y2FnTGV2ZWw6IFwiQVwiLFxuICAgICAgICAgICAgc3VtbWFyeTogXCJSdWxlcyBmb3IgRXh0ZW5zaW9uXCJcbiAgICAgICAgfV1cbiAgICB9LFxuICAgIHtcbiAgICAgICAgaWQ6IFwiSUJNX0FjY2Vzc2liaWxpdHlcIixcbiAgICAgICAgbmFtZTogXCJJQk0gQWNjZXNzaWJpbGl0eSA3LjNcIixcbiAgICAgICAgY2F0ZWdvcnk6IGVHdWlkZWxpbmVDYXRlZ29yeS5BQ0NFU1NJQklMSVRZLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJSdWxlcyBmb3IgV0NBRyAyLjAsIDIuMSwgMi4yIEEgYW5kIEFBIHBsdXMgYWRkaXRpb25hbCBJQk0gc3VwcGxlbWVudGFsIHJlcXVpcmVtZW50cy5cIixcbiAgICAgICAgLy8gVGhpcyBydWxlc2V0IGhhcyBhbGwgMi4wIGFuZCAyLjEgY2hlY2twb2ludHMgdGhhdCBhcmUgQSBvciBBQVxuICAgICAgICBjaGVja3BvaW50czogU0NzXG4gICAgICAgICAgICAuZmlsdGVyKHNjID0+IChzYy5sZXZlbCA9PT0gXCJBXCIgfHwgc2MubGV2ZWwgPT09IFwiQUFcIiB8fCBzYy5sZXZlbCA9PT0gXCJOQVwiKSAmJiAoc2Mud2NhZ1R5cGUgPT09IFwiMi4wXCIgfHwgc2Mud2NhZ1R5cGUgPT09IFwiMi4xXCIgfHwgc2Mud2NhZ1R5cGUgPT09IFwiMi4yXCIgfHwgc2Mud2NhZ1R5cGUgPT09IFwiTkFcIikpXG4gICAgICAgICAgICAubWFwKHNjID0+ICh7XG4gICAgICAgICAgICAgICAgbnVtOiBzYy5udW0sXG4gICAgICAgICAgICAgICAgc2NJZDogc2Muc2NJZCxcbiAgICAgICAgICAgICAgICBuYW1lOiBzYy5oYW5kbGUsXG4gICAgICAgICAgICAgICAgd2NhZ0xldmVsOiBzYy5sZXZlbCxcbiAgICAgICAgICAgICAgICBzdW1tYXJ5OiBzdW1tYXJpZXNbc2MubnVtXVxuICAgICAgICAgICAgfSkpXG4gICAgfSxcbiAgICB7XG4gICAgICAgIGlkOiBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIixcbiAgICAgICAgbmFtZTogXCJJQk0gQWNjZXNzaWJpbGl0eSBuZXh0XCIsXG4gICAgICAgIGNhdGVnb3J5OiBlR3VpZGVsaW5lQ2F0ZWdvcnkuQUNDRVNTSUJJTElUWSxcbiAgICAgICAgZGVzY3JpcHRpb246IFwiUnVsZXMgZm9yIFdDQUcgMi4wLCAyLjEsIDIuMiBBIGFuZCBBQSBwbHVzIGFkZGl0aW9uYWwgSUJNIHN1cHBsZW1lbnRhbCByZXF1aXJlbWVudHMuXCIsXG4gICAgICAgIC8vIFRoaXMgcnVsZXNldCBoYXMgYWxsIDIuMCBhbmQgMi4xIGNoZWNrcG9pbnRzIHRoYXQgYXJlIEEgb3IgQUFcbiAgICAgICAgY2hlY2twb2ludHM6IFNDc1xuICAgICAgICAgICAgLmZpbHRlcihzYyA9PiAoc2MubGV2ZWwgPT09IFwiQVwiIHx8IHNjLmxldmVsID09PSBcIkFBXCIgfHwgc2MubGV2ZWwgPT09IFwiTkFcIikgJiYgKHNjLndjYWdUeXBlID09PSBcIjIuMFwiIHx8IHNjLndjYWdUeXBlID09PSBcIjIuMVwiIHx8IHNjLndjYWdUeXBlID09PSBcIjIuMlwiIHx8IHNjLndjYWdUeXBlID09PSBcIk5BXCIpKVxuICAgICAgICAgICAgLm1hcChzYyA9PiAoe1xuICAgICAgICAgICAgICAgIG51bTogc2MubnVtLFxuICAgICAgICAgICAgICAgIHNjSWQ6IHNjLnNjSWQsXG4gICAgICAgICAgICAgICAgbmFtZTogc2MuaGFuZGxlLFxuICAgICAgICAgICAgICAgIHdjYWdMZXZlbDogc2MubGV2ZWwsXG4gICAgICAgICAgICAgICAgc3VtbWFyeTogc3VtbWFyaWVzW3NjLm51bV1cbiAgICAgICAgICAgIH0pKVxuICAgIH0sXG4gICAge1xuICAgICAgICBpZDogXCJXQ0FHXzJfMlwiLFxuICAgICAgICBuYW1lOiBcIldDQUcgMi4yIChBLCBBQSlcIixcbiAgICAgICAgY2F0ZWdvcnk6IGVHdWlkZWxpbmVDYXRlZ29yeS5BQ0NFU1NJQklMSVRZLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJSdWxlcyBmb3IgV0NBRyAyLjIgQSAmIEFBLiBUaGlzIGlzIHRoZSBjdXJyZW50IFczQyByZWNvbW1lbmRhdGlvbiAoc3BlY2lmaWNhdGlvbikuIENvbnRlbnQgdGhhdCBjb25mb3JtcyB0byBXQ0FHIDIuMiBhbHNvIGNvbmZvcm1zIHRvIFdDQUcgMi4xLlwiLFxuICAgICAgICAvLyBUaGlzIHJ1bGVzZXQgaGFzIGFsbCAyLjAgYW5kIDIuMSBjaGVja3BvaW50cyB0aGF0IGFyZSBBIG9yIEFBXG4gICAgICAgIGNoZWNrcG9pbnRzOiBTQ3NcbiAgICAgICAgICAgIC5maWx0ZXIoc2MgPT4gKHNjLmxldmVsID09PSBcIkFcIiB8fCBzYy5sZXZlbCA9PT0gXCJBQVwiKSAmJiAoc2Mud2NhZ1R5cGUgPT09IFwiMi4wXCIgfHwgc2Mud2NhZ1R5cGUgPT09IFwiMi4xXCIgfHwgc2Mud2NhZ1R5cGUgPT09IFwiMi4yXCIpKVxuICAgICAgICAgICAgLm1hcChzYyA9PiAoe1xuICAgICAgICAgICAgICAgIG51bTogc2MubnVtLFxuICAgICAgICAgICAgICAgIHNjSWQ6IHNjLnNjSWQsXG4gICAgICAgICAgICAgICAgbmFtZTogc2MuaGFuZGxlLFxuICAgICAgICAgICAgICAgIHdjYWdMZXZlbDogc2MubGV2ZWwsXG4gICAgICAgICAgICAgICAgc3VtbWFyeTogc3VtbWFyaWVzW3NjLm51bV1cbiAgICAgICAgICAgIH0pKVxuICAgIH0sXG4gICAge1xuICAgICAgICBpZDogXCJXQ0FHXzJfMVwiLFxuICAgICAgICBuYW1lOiBcIldDQUcgMi4xIChBLCBBQSlcIixcbiAgICAgICAgY2F0ZWdvcnk6IGVHdWlkZWxpbmVDYXRlZ29yeS5BQ0NFU1NJQklMSVRZLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJSdWxlcyBmb3IgV0NBRyAyLjEgQSAmIEFBLiBDb250ZW50IHRoYXQgY29uZm9ybXMgdG8gV0NBRyAyLjEgYWxzbyBjb25mb3JtcyB0byBXQ0FHIDIuMC5cIixcbiAgICAgICAgLy8gVGhpcyBydWxlc2V0IGhhcyBhbGwgMi4wIGFuZCAyLjEgY2hlY2twb2ludHMgdGhhdCBhcmUgQSBvciBBQVxuICAgICAgICBjaGVja3BvaW50czogU0NzXG4gICAgICAgICAgICAuZmlsdGVyKHNjID0+IChzYy5sZXZlbCA9PT0gXCJBXCIgfHwgc2MubGV2ZWwgPT09IFwiQUFcIikgJiYgKHNjLndjYWdUeXBlID09PSBcIjIuMFwiIHx8IHNjLndjYWdUeXBlID09PSBcIjIuMVwiKSlcbiAgICAgICAgICAgIC5tYXAoc2MgPT4gKHtcbiAgICAgICAgICAgICAgICBudW06IHNjLm51bSxcbiAgICAgICAgICAgICAgICBzY0lkOiBzYy5zY0lkLFxuICAgICAgICAgICAgICAgIG5hbWU6IHNjLmhhbmRsZSxcbiAgICAgICAgICAgICAgICB3Y2FnTGV2ZWw6IHNjLmxldmVsLFxuICAgICAgICAgICAgICAgIHN1bW1hcnk6IHN1bW1hcmllc1tzYy5udW1dXG4gICAgICAgICAgICB9KSlcbiAgICB9LFxuICAgIHtcbiAgICAgICAgaWQ6IFwiV0NBR18yXzBcIixcbiAgICAgICAgbmFtZTogXCJXQ0FHIDIuMCAoQSwgQUEpXCIsXG4gICAgICAgIGNhdGVnb3J5OiBlR3VpZGVsaW5lQ2F0ZWdvcnkuQUNDRVNTSUJJTElUWSxcbiAgICAgICAgZGVzY3JpcHRpb246IFwiUnVsZXMgZm9yIFdDQUcgMi4wIEEgJiBBQS4gUmVmZXJlbmNlZCBieSBVUyBTZWN0aW9uIDUwOCwgYnV0IG5vdCB0aGUgbGF0ZXN0IFczQyByZWNvbW1lbmRhdGlvbi5cIixcbiAgICAgICAgLy8gVGhpcyBydWxlc2V0IGhhcyBhbGwgMi4wIGNoZWNrcG9pbnRzIHRoYXQgYXJlIEEgb3IgQUFcbiAgICAgICAgY2hlY2twb2ludHM6IFNDc1xuICAgICAgICAgICAgLmZpbHRlcihzYyA9PiAoc2MubGV2ZWwgPT09IFwiQVwiIHx8IHNjLmxldmVsID09PSBcIkFBXCIpICYmIChzYy53Y2FnVHlwZSA9PT0gXCIyLjBcIikpXG4gICAgICAgICAgICAubWFwKHNjID0+ICh7XG4gICAgICAgICAgICAgICAgbnVtOiBzYy5udW0sXG4gICAgICAgICAgICAgICAgc2NJZDogc2Muc2NJZCxcbiAgICAgICAgICAgICAgICBuYW1lOiBzYy5oYW5kbGUsXG4gICAgICAgICAgICAgICAgd2NhZ0xldmVsOiBzYy5sZXZlbCxcbiAgICAgICAgICAgICAgICBzdW1tYXJ5OiBzdW1tYXJpZXNbc2MubnVtXVxuICAgICAgICAgICAgfSkpXG4gICAgfVxuXVxuIiwiXG5pbXBvcnQgeyBTUkN1cnNvciB9IGZyb20gXCIuL1NSQ3Vyc29yXCI7XG5pbXBvcnQgeyBTUlJlbmRlcmVyIH0gZnJvbSBcIi4vU1JSZW5kZXJlclwiO1xuaW1wb3J0IHsgTmF2aWdhdGlvbk1vZGUsIE5hdmlnYXRpb25SZXN1bHQsIFJlbmRlclJlc3VsdCB9IGZyb20gXCIuL1NSVHlwZXNcIjtcbmltcG9ydCB7IFNSTmF2aWdhdG9yIH0gZnJvbSBcIi4vU1JOYXZpZ2F0b3JcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgU1JVdGlsIH0gZnJvbSBcIi4vU1JVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG4vKipcbiAqIFNSQ29udHJvbGxlciBjbGFzcyBmb3IgbWFuYWdpbmcgc2NyZWVuIHJlYWRlciBzaW11bGF0aW9uXG4gKiBNYWludGFpbnMgYSBwb2ludCBvZiByZWdhcmQgYW5kIHByb3ZpZGVzIG5hdmlnYXRpb24gZnVuY3Rpb25zXG4gKi9cbmV4cG9ydCBjbGFzcyBTUkNvbnRyb2xsZXIge1xuICAgIHB1YmxpYyBzdGF0aWMgc2luZ2xldG9uO1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Q29udHJvbGxlcihjdHJsRG9jOiBIVE1MRG9jdW1lbnQgPSBkb2N1bWVudCkge1xuICAgICAgICBpZiAoIXRoaXMuc2luZ2xldG9uKSB7XG4gICAgICAgICAgICB0aGlzLnNpbmdsZXRvbiA9IG5ldyBTUkNvbnRyb2xsZXIoY3RybERvYy5ib2R5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5zaW5nbGV0b24gYXMgU1JDb250cm9sbGVyO1xuICAgIH1cblxuICAgIC8qKiBUaGUgY3VycmVudCBwb2ludCBvZiByZWdhcmQgKi9cbiAgICBwcml2YXRlIHBvaW50T2ZSZWdhcmQ6IFNSQ3Vyc29yO1xuICAgIHByaXZhdGUgbXV0YXRpb25PYnNlcnZlcjogTXV0YXRpb25PYnNlcnZlcjtcbiAgICBwcml2YXRlIGxpdmVMaXN0ZW5lcnM6IEFycmF5PChyZXN1bHQ6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPj4gPSBbXTtcbiAgICBwcml2YXRlIGN0cmxEb2M7XG4gICAgXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBTUkNvbnRyb2xsZXJcbiAgICAgKiBAcGFyYW0gcm9vdEVsZW1lbnQgVGhlIHJvb3QgZWxlbWVudCB0byBzdGFydCBmcm9tIChkZWZhdWx0cyB0byBkb2N1bWVudC5ib2R5KVxuICAgICAqL1xuICAgIHByaXZhdGUgY29uc3RydWN0b3IocHJpdmF0ZSByb290RWxlbWVudDogTm9kZSA9IGRvY3VtZW50LmJvZHkpIHtcbiAgICAgICAgdGhpcy5jdHJsRG9jID0gcm9vdEVsZW1lbnQub3duZXJEb2N1bWVudDtcbiAgICAgICAgdGhpcy5zZXRQb2ludE9mUmVnYXJkKHJvb3RFbGVtZW50KTtcbiAgICAgICAgdGhpcy5zZXR1cE11dGF0aW9uVHJhY2tpbmcoKTtcbiAgICAgICAgY29uc29sZS5pbmZvKGBbV0FSTklOR10gVGhlIFNSQ29udHJvbGxlciBpcyBhIG5ldyBmZWF0dXJlIHRoYXQgaXMgbm90IHlldCBcInN0YWJsZVwiLiBXaGF0IHRoaXMgbWVhbnM6XG4qIEFQSSBzdWJqZWN0IHRvIGNoYW5nZSwgZXZlbiBiZXR3ZWVuIG1pbm9yIHZlcnNpb25zIG9mIHRoZSBjaGVja2VyXG4qIFJlc3VsdHMgc2hvdWxkIGJlIGNvbnNpZGVyZWQgZXhwZXJpbWVudGFsLiBUaGVyZSBhcmUgYSB2YXJpZXR5IG9mIGtub3duIGlzc3VlcywgYnV0IG1ha2luZyB0aGlzIGF2YWlsYWJsZSBmb3IgZWFybHkgZXhwZXJpbWVudGF0aW9uIC8gZmVlZGJhY2suYCk7XG4gICAgfVxuXG4gICAgcHVibGljIGRpc2Nvbm5lY3QoKSB7XG4gICAgICAgIGlmICh0aGlzLm11dGF0aW9uT2JzZXJ2ZXIpIHtcbiAgICAgICAgICAgIHRoaXMubXV0YXRpb25PYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgcHJpdmF0ZSBmaW5kQWxsU2hhZG93Um9vdHMocm9vdDogRG9jdW1lbnQgfCBEb2N1bWVudEZyYWdtZW50IHwgTm9kZSA9IGRvY3VtZW50KTogTm9kZVtdIHtcbiAgICAgICAgY29uc3Qgc2hhZG93Um9vdHM6IE5vZGVbXSA9IFtdO1xuXG4gICAgICAgIC8vIEdldCBhbGwgZWxlbWVudHMgaW4gdGhlIGN1cnJlbnQgcm9vdFxuICAgICAgICBjb25zdCB3YWxrZXIgPSB0aGlzLmN0cmxEb2MuY3JlYXRlVHJlZVdhbGtlcihcbiAgICAgICAgICAgIHJvb3QsXG4gICAgICAgICAgICBOb2RlRmlsdGVyLlNIT1dfRUxFTUVOVCxcbiAgICAgICAgICAgIG51bGxcbiAgICAgICAgKTtcblxuICAgICAgICBsZXQgbm9kZTogTm9kZSB8IG51bGw7XG4gICAgICAgIHdoaWxlIChub2RlID0gd2Fsa2VyLm5leHROb2RlKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBub2RlIGFzIEVsZW1lbnQ7XG5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgZWxlbWVudCBoYXMgYW4gb3BlbiBzaGFkb3cgcm9vdFxuICAgICAgICAgICAgaWYgKGVsZW1lbnQuc2hhZG93Um9vdCkge1xuICAgICAgICAgICAgICAgIHNoYWRvd1Jvb3RzLnB1c2goZWxlbWVudC5zaGFkb3dSb290KTtcblxuICAgICAgICAgICAgICAgIC8vIFJlY3Vyc2l2ZWx5IHNlYXJjaCBpbnNpZGUgdGhpcyBzaGFkb3cgcm9vdFxuICAgICAgICAgICAgICAgIGNvbnN0IG5lc3RlZFNoYWRvd1Jvb3RzID0gdGhpcy5maW5kQWxsU2hhZG93Um9vdHMoZWxlbWVudC5zaGFkb3dSb290KTtcbiAgICAgICAgICAgICAgICBzaGFkb3dSb290cy5wdXNoKC4uLm5lc3RlZFNoYWRvd1Jvb3RzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzaGFkb3dSb290cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdXAgbXV0YXRpb24gdHJhY2tpbmdcbiAgICAgKiBcbiAgICAgKiBJbiB0aGUgZXZlbnQgdGhhdCB0aGUgcG9pbnQgb2YgcmVnYXJkIGlzIHJlbW92ZWQgZnJvbSB0aGUgRE9NLCB3ZSBuZWVkIHRvIGdldCB1cCB0byB0aGUgbmVhcmVzdCBwYXJlbnQgdGhhdCdzIG5vdCBiZWluZyByZW1vdmVkXG4gICAgICovXG4gICAgcHJpdmF0ZSBzZXR1cE11dGF0aW9uVHJhY2tpbmcoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm11dGF0aW9uT2JzZXJ2ZXIpIHtcbiAgICAgICAgICAgIHRoaXMubXV0YXRpb25PYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbXlUaGlzID0gdGhpcztcbiAgICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigobXV0YXRpb25zKSA9PiB7XG4gICAgICAgICAgICBsZXQgcG9yTm9kZSA9IG15VGhpcy5wb2ludE9mUmVnYXJkLmdldE5vZGUoKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcmVtb3ZhbE11dGF0aW9uIG9mIG11dGF0aW9ucy5maWx0ZXIobXV0YXRpb24gPT4gbXV0YXRpb24ucmVtb3ZlZE5vZGVzPy5sZW5ndGggPiAwKSkge1xuICAgICAgICAgICAgICAgIHJlbW92YWxNdXRhdGlvbi5yZW1vdmVkTm9kZXMuZm9yRWFjaCgocmVtb3ZlZE5vZGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlbW92ZWROb2RlLmlzU2FtZU5vZGUocG9yTm9kZSkgfHwgcmVtb3ZlZE5vZGUuY29udGFpbnMocG9yTm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuaW5mbyhcIkFkanVzdGluZyBQb1IgZHVlIHRvIERPTSBtdXRhdGlvbiByZW1vdmluZyBQb1JcIik7Ly8sIHJlbW92YWxNdXRhdGlvbi50YXJnZXQsIHJlbW92ZWROb2RlLCBwb3JOb2RlKVxuICAgICAgICAgICAgICAgICAgICAgICAgcG9yTm9kZSA9IHJlbW92YWxNdXRhdGlvbi50YXJnZXQ7XG4gICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5zZXRQb2ludE9mUmVnYXJkKHBvck5vZGUpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBmb3IgKGNvbnN0IG11dGF0aW9uIG9mIG11dGF0aW9ucykge1xuICAgICAgICAgICAgICAgIGlmIChtdXRhdGlvbi5hZGRlZE5vZGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIG11dGF0aW9uLmFkZGVkTm9kZXMuZm9yRWFjaChhZGRlZE5vZGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWRkIG9ic2VydmF0aW9uIG9mIG5ldyBzaGFkb3cgcm9vdHNcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhbGxSb290cyA9IHRoaXMuZmluZEFsbFNoYWRvd1Jvb3RzKGFkZGVkTm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHJvb3Qgb2YgYWxsUm9vdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5vYnNlcnZlKHJvb3QsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRMaXN0OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJ0cmVlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJEYXRhOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBtdXRhdGlvbi50YXJnZXQ7XG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbSA9IG5vZGUubm9kZVR5cGUgPT09IDEgPyBub2RlIGFzIEhUTUxFbGVtZW50IDogbm9kZS5wYXJlbnRFbGVtZW50O1xuICAgICAgICAgICAgICAgIGlmIChlbGVtIFxuICAgICAgICAgICAgICAgICAgICAmJiAhZWxlbS5jbG9zZXN0KGBbYXJpYS1idXN5PVwidHJ1ZVwiXWApXG4gICAgICAgICAgICAgICAgICAgICYmIGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1idXN5XCIpICE9PSBcInRydWVcIlxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZGVudGlmeSB0aGUgbGl2ZSByZWdpb24gY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpdmVSZWdpb25FbGVtID0gXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZWxlbWVudCBpdHNlbGYgaXMgYSBsaXZlIHJlZ2lvbiBjb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICgoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wicG9saXRlXCIsIFwiYXNzZXJ0aXZlXCJdLmluY2x1ZGVzKGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1saXZlXCIpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBlbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiT1VUUFVUXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgW1wic3RhdHVzXCIsIFwibG9nXCIsIFwicHJvZ3Jlc3NiYXJcIiwgXCJhbGVydFwiLCBcInRpbWVyXCJdLmluY2x1ZGVzKGVsZW0uZ2V0QXR0cmlidXRlKFwicm9sZVwiKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICkgJiYgZWxlbSkgXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBPciBnZXQgdGhlIG5lYXJlc3QgYW5jZXN0b3JcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8IGVsZW0uY2xvc2VzdChgW2FyaWEtbGl2ZT1cInBvbGl0ZVwiXSxbYXJpYS1saXZlPVwiYXNzZXJ0aXZlXCJdLG91dHB1dCxbcm9sZT1cInN0YXR1c1wiXSxbcm9sZT1cImxvZ1wiXSxbcm9sZT1cInByb2dyZXNzYmFyXCJdLFtyb2xlPVwiYWxlcnRcIl0sW3JvbGU9XCJ0aW1lclwiXWApO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBpc011dGF0aW9uUmVsZXZhbnQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlbGV2YW5jZSA9IFtcImFkZGl0aW9uc1wiLCBcInRleHRcIl07XG4gICAgICAgICAgICAgICAgICAgIGlmIChsaXZlUmVnaW9uRWxlbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIHdoYXQga2luZHMgb2YgY2hhbmdlcyBhcmUgJ3JlbGV2YW50J1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVsZXZhbnRFbGVtID0gZWxlbS5jbG9zZXN0KFwiW2FyaWEtcmVsZXZhbnRdXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlbGV2YW50RWxlbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGV2YW5jZSA9IHJlbGV2YW50RWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLXJlbGV2YW50XCIpLnNwbGl0KC8gKy9nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpdmVSZWdpb25FbGVtLmdldEF0dHJpYnV0ZShcInJvbGVcIikgPT09IFwibG9nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxldmFuY2UgPSBbXCJhZGRpdGlvbnNcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGl2ZVJlZ2lvbkVsZW0uaGFzQXR0cmlidXRlKFwiYXJpYS1yZWxldmFudFwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGV2YW5jZSA9IGxpdmVSZWdpb25FbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtcmVsZXZhbnRcIikuc3BsaXQoLyArL2cpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlbGV2YW5jZS5pbmNsdWRlcyhcImFsbFwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGV2YW5jZSA9IFtcImFkZGl0aW9uc1wiLCBcInJlbW92YWxzXCIsIFwidGV4dFwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlzTXV0YXRpb25SZWxldmFudCA9IChtdXRhdGlvbi50YXJnZXQubm9kZVR5cGUgPT09IDMgJiYgcmVsZXZhbmNlLmluY2x1ZGVzKFwidGV4dFwiKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAobXV0YXRpb24uYWRkZWROb2Rlcy5sZW5ndGggPiAwICYmIHJlbGV2YW5jZS5pbmNsdWRlcyhcImFkZGl0aW9uc1wiKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAobXV0YXRpb24ucmVtb3ZlZE5vZGVzLmxlbmd0aCA+IDAgJiYgcmVsZXZhbmNlLmluY2x1ZGVzKFwicmVtb3ZhbHNcIikpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIFxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChsaXZlUmVnaW9uRWxlbSAmJiBpc011dGF0aW9uUmVsZXZhbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzQXRvbWljID0gbGl2ZVJlZ2lvbkVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1hdG9taWNcIikgPT09IFwidHJ1ZVwiIHx8IFtcImFsZXJ0XCIsIFwic3RhdHVzXCIsIFwidGltZXJcIiwgXCJtYXJxdWVlXCJdLmluY2x1ZGVzKGxpdmVSZWdpb25FbGVtLmdldEF0dHJpYnV0ZShcInJvbGVcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVhZCB0aGUgd2hvbGUgcmVnaW9uIGlmIGF0b21pY1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0F0b21pYyAmJiBtdXRhdGlvbi50eXBlID09PSBcImNoYXJhY3RlckRhdGFcIiAmJiBtdXRhdGlvbi50YXJnZXQubm9kZVR5cGUgPT09IDMgJiYgIVZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKG11dGF0aW9uLnRhcmdldC5wYXJlbnRFbGVtZW50KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbGl2ZUxpc3RlbmVyIG9mIHRoaXMubGl2ZUxpc3RlbmVycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXZlTGlzdGVuZXIobXV0YXRpb24udGFyZ2V0Lm5vZGVWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGl2ZVRhcmdldCA9IGlzQXRvbWljID8gbGl2ZVJlZ2lvbkVsZW0gOiBtdXRhdGlvbi50YXJnZXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChsaXZlVGFyZ2V0IGFzIGFueSkubGl2ZUFubm91bmNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCgobGl2ZVRhcmdldCBhcyBhbnkpLmxpdmVBbm5vdW5jZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsaXZlVGFyZ2V0IGFzIGFueSkubGl2ZUFubm91bmNlID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXN1bHRzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpc1JlbW92YWwgPSAocmVsZXZhbmNlLmluY2x1ZGVzKFwicmVtb3ZhbHNcIikgJiYgbXV0YXRpb24ucmVtb3ZlZE5vZGVzLmxlbmd0aCA+IDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNBdG9taWMgfHwgaXNSZW1vdmFsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGl2ZUN1cnNvciA9IG5ldyBTUkN1cnNvcihsaXZlVGFyZ2V0LCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGl2ZUN1cnNvckVuZCA9IG5ldyBTUkN1cnNvcihsaXZlVGFyZ2V0LCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpdmVDdXJzb3JFbmQubmV4dCgoKSA9PiB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaCgoaXNSZW1vdmFsP1wiW3JlbW92ZWRdIFwiOlwiXCIpK1NSUmVuZGVyZXIucmVuZGVyUmFuZ2UoXCJpdGVtXCIsIGxpdmVDdXJzb3IsIGxpdmVDdXJzb3JFbmQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZWxldmFuY2UuaW5jbHVkZXMoXCJhZGRpdGlvbnNcIikgJiYgbXV0YXRpb24uYWRkZWROb2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGlvbi5hZGRlZE5vZGVzLmZvckVhY2goYWRkZWROb2RlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBKdXN0IHJlbmRlciB0aGUgYWRkaXRpb25zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxpdmVDdXJzb3IgPSBuZXcgU1JDdXJzb3IoYWRkZWROb2RlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxpdmVDdXJzb3JFbmQgPSBuZXcgU1JDdXJzb3IoYWRkZWROb2RlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXZlQ3Vyc29yRW5kLm5leHQoKCkgPT4gdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKFNSUmVuZGVyZXIucmVuZGVyUmFuZ2UoXCJpdGVtXCIsIGxpdmVDdXJzb3IsIGxpdmVDdXJzb3JFbmQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbGl2ZUxpc3RlbmVyIG9mIHRoaXMubGl2ZUxpc3RlbmVycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGl2ZUxpc3RlbmVyKHJlc3VsdHMuam9pbihcIlxcblwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAxMDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBOZWVkIHRvIG9ic2VydmUgYWxsIG9mIHRoZSBzaGFkb3cgcm9vdHNcbiAgICAgICAgbGV0IGFsbFJvb3RzID0gdGhpcy5maW5kQWxsU2hhZG93Um9vdHModGhpcy5jdHJsRG9jLmRvY3VtZW50RWxlbWVudCk7XG4gICAgICAgIGFsbFJvb3RzLnB1c2godGhpcy5jdHJsRG9jLmRvY3VtZW50RWxlbWVudCk7XG4gICAgICAgIGZvciAoY29uc3Qgcm9vdCBvZiBhbGxSb290cykge1xuICAgICAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShyb290LCB7XG4gICAgICAgICAgICAgICAgY2hpbGRMaXN0OiB0cnVlLFxuICAgICAgICAgICAgICAgIHN1YnRyZWU6IHRydWUsXG4gICAgICAgICAgICAgICAgY2hhcmFjdGVyRGF0YTogdHJ1ZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkTGl2ZUxpc3RlbmVyKGxpc3RlbmVyOiAocmVzdWx0OiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD4pIHtcbiAgICAgICAgdGhpcy5saXZlTGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZW1vdmVMaXZlTGlzdGVuZXIocmVtb3ZlTGlzdGVuZXI6IChyZXN1bHQ6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPikge1xuICAgICAgICB0aGlzLmxpdmVMaXN0ZW5lcnMgPSB0aGlzLmxpdmVMaXN0ZW5lcnMuZmlsdGVyKGxpc3RlbmVyID0+IGxpc3RlbmVyICE9PSByZW1vdmVMaXN0ZW5lcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBjdXJyZW50IHBvaW50IG9mIHJlZ2FyZFxuICAgICAqIEByZXR1cm5zIFRoZSBjdXJyZW50IFNSQ3Vyc29yIHJlcHJlc2VudGluZyB0aGUgcG9pbnQgb2YgcmVnYXJkXG4gICAgICovXG4gICAgcHVibGljIGdldFBvaW50T2ZSZWdhcmQoKTogU1JDdXJzb3Ige1xuICAgICAgICByZXR1cm4gdGhpcy5wb2ludE9mUmVnYXJkO1xuICAgIH1cbiAgICBcbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIHBvaW50IG9mIHJlZ2FyZCB0byBhIHNwZWNpZmljIERPTSBub2RlXG4gICAgICogQHBhcmFtIG5vZGUgVGhlIG5vZGUgdG8gc2V0IGFzIHRoZSBwb2ludCBvZiByZWdhcmRcbiAgICAgKiBAcmV0dXJucyBOYXZpZ2F0aW9uUmVzdWx0IGluZGljYXRpbmcgc3VjY2VzcyBvciBmYWlsdXJlXG4gICAgICovXG4gICAgcHVibGljIHNldFBvaW50T2ZSZWdhcmQobm9kZTogTm9kZSk6IE5hdmlnYXRpb25SZXN1bHQge1xuICAgICAgICBjb25zdCBERUJVRyA9IGZhbHNlO1xuICAgICAgICBERUJVRyAmJiBjb25zb2xlLmdyb3VwKFwic2V0UG9pbnRPZlJlZ2FyZFwiKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMucG9pbnRPZlJlZ2FyZCA9IG5ldyBTUkN1cnNvcihub2RlKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gVXBkYXRlIGNvbnRhaW5lciBzdGF0ZVxuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyQ2hhbmdlcyA9IFNSQ29udHJvbGxlci5kaWZmQ29udGFpbmVycyhcImZvY3VzXCIsIHRoaXMucG9pbnRPZlJlZ2FyZCk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNvbnN0IHJvbGUgPSB0aGlzLnBvaW50T2ZSZWdhcmQuZ2V0Um9sZSgpO1xuICAgICAgICAgICAgY29uc3QgbmFtZSA9IHRoaXMucG9pbnRPZlJlZ2FyZC5nZXROYW1lSW5mbygpPy5uYW1lO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgICAgICAgcmVuZGVyaW5nUmVzdWx0OiBTUlJlbmRlcmVyLnJlbmRlckN1cnJlbnQoXCJmb2N1c1wiLCB0aGlzLnBvaW50T2ZSZWdhcmQsIGNvbnRhaW5lckNoYW5nZXMpLFxuICAgICAgICAgICAgICAgIHJvbGUsXG4gICAgICAgICAgICAgICAgbmFtZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICAgICAgcmVuZGVyaW5nUmVzdWx0OiB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0OiB0aGlzLnBvaW50T2ZSZWdhcmQuY2xvbmUoKSxcbiAgICAgICAgICAgICAgICAgICAgZW5kOiB0aGlzLnBvaW50T2ZSZWdhcmQuY2xvbmUoKSxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYEZhaWxlZCB0byBzZXQgcG9pbnQgb2YgcmVnYXJkOiAke2Vycm9yLm1lc3NhZ2V9YFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBERUJVRyAmJiBjb25zb2xlLmdyb3VwRW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLyoqXG4gICAgICogSnVtcCB0byB0aGUgbmV4dCBlbGVtZW50IGJ5IHRoZSBzcGVjaWZpZWQgbW9kZVxuICAgICAqIEBwYXJhbSBtb2RlIFRoZSBuYXZpZ2F0aW9uIG1vZGUgdG8gdXNlXG4gICAgICogQHJldHVybnMgTmF2aWdhdGlvblJlc3VsdCBpbmRpY2F0aW5nIHN1Y2Nlc3Mgb3IgZmFpbHVyZVxuICAgICAqL1xuICAgIHB1YmxpYyBqdW1wTmV4dChtb2RlOiBOYXZpZ2F0aW9uTW9kZSk6IE5hdmlnYXRpb25SZXN1bHQge1xuICAgICAgICBDYWNoZVV0aWwuY2xlYXJDYWNoZXModGhpcy5jdHJsRG9jLmRvY3VtZW50RWxlbWVudCk7XG4gICAgICAgIGNvbnN0IG9sZFBvaW50T2ZSZWdhcmQgPSB0aGlzLnBvaW50T2ZSZWdhcmQuY2xvbmUoKTtcbiAgICAgICAgY29uc3QgREVCVUcgPSBmYWxzZTtcbiAgICAgICAgREVCVUcgJiYgY29uc29sZS5ncm91cChcImp1bXBOZXh0XCIpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IGJDb250aW51ZSA9IHRydWU7XG4gICAgICAgICAgICBsZXQgbmV4dEp1bXAgPSB0aGlzLnBvaW50T2ZSZWdhcmQuY2xvbmUoKTtcbiAgICAgICAgICAgIGxldCByZW5kZXJpbmdSZXN1bHQ7XG4gICAgICAgICAgICB3aGlsZSAoYkNvbnRpbnVlICYmIG5leHRKdW1wKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGFzdEp1bXAgPSBuZXh0SnVtcC5jbG9uZSgpO1xuICAgICAgICAgICAgICAgIG5leHRKdW1wID0gU1JOYXZpZ2F0b3IuanVtcE5leHQobW9kZSwgbmV4dEp1bXApO1xuICAgICAgICAgICAgICAgIGlmIChuZXh0SnVtcCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY29udGFpbmVyQ2hhbmdlcyA9IFNSQ29udHJvbGxlci5kaWZmQ29udGFpbmVycyhtb2RlLCBuZXh0SnVtcCwgbGFzdEp1bXApO1xuICAgICAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gXCJpdGVtXCIgJiYgIVNSTmF2aWdhdG9yLmdldFN0YXJ0RnVuYyhtb2RlKShuZXh0SnVtcC5nZXRSb2xlKCksICFuZXh0SnVtcC5pc0VuZFRhZygpLCBuZXh0SnVtcC5nZXROb2RlKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJDaGFuZ2VzID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudGVyaW5nOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWF2aW5nOiBbXVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJlbmRlcmluZ1Jlc3VsdCA9IFNSUmVuZGVyZXIucmVuZGVyQ3VycmVudChtb2RlLCBuZXh0SnVtcCwgY29udGFpbmVyQ2hhbmdlcyk7XG4gICAgICAgICAgICAgICAgICAgIC8vIEtlZXAgZ29pbmcgaWYgdGhlIGxhbmRpbmcgcG9pbnQgaXMgZW1wdHksIHVubGVzcyBpdCdzIGNlcnRhaW4gbmF2IG1vZGVzIChlLmcuLCByZWdpb24pXG4gICAgICAgICAgICAgICAgICAgIGJDb250aW51ZSA9IHJlbmRlcmluZ1Jlc3VsdC5tZXNzYWdlLnRyaW0oKS5sZW5ndGggPT09IDAgJiYgIVtcInJlZ2lvblwiXS5pbmNsdWRlcyhtb2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIW5leHRKdW1wKSB7XG4gICAgICAgICAgICAgICAgLy8gUmVzdG9yZSB0aGUgb3JpZ2luYWwgcG9pbnQgb2YgcmVnYXJkXG4gICAgICAgICAgICAgICAgdGhpcy5wb2ludE9mUmVnYXJkID0gb2xkUG9pbnRPZlJlZ2FyZDtcbiAgICAgICAgICAgICAgICBsZXQgY3VycmVudFJlc3VsdCA9IFNSUmVuZGVyZXIucmVuZGVyQ3VycmVudChtb2RlLCBvbGRQb2ludE9mUmVnYXJkLCB7IGxlYXZpbmc6IFtdLCBlbnRlcmluZzogW119KTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyaW5nUmVzdWx0OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydDogb2xkUG9pbnRPZlJlZ2FyZC5jbG9uZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiBvbGRQb2ludE9mUmVnYXJkLmNsb25lKCksXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgTm8gbmV4dCAke21vZGV9LiAke2N1cnJlbnRSZXN1bHQ/Lm1lc3NhZ2UgfHwgXCJcIn1gXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBvaW50T2ZSZWdhcmQgPSBuZXh0SnVtcDtcbiAgICAgICAgICAgICAgICBjb25zdCByb2xlID0gdGhpcy5wb2ludE9mUmVnYXJkLmdldFJvbGUoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gdGhpcy5wb2ludE9mUmVnYXJkLmdldE5hbWVJbmZvKCk/Lm5hbWU7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGNvbnRhaW5lciBjaGFuZ2VzXG4gICAgICAgICAgICAgICAgREVCVUcgJiYgY29uc29sZS5sb2coXCJOZXcgUE9SOlwiLCB0aGlzLnBvaW50T2ZSZWdhcmQuZ2V0Tm9kZSgpLCByZW5kZXJpbmdSZXN1bHQpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHJlbmRlcmluZ1Jlc3VsdCxcbiAgICAgICAgICAgICAgICAgICAgcm9sZSxcbiAgICAgICAgICAgICAgICAgICAgbmFtZVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIC8vIFJlc3RvcmUgdGhlIG9yaWdpbmFsIHBvaW50IG9mIHJlZ2FyZFxuICAgICAgICAgICAgdGhpcy5wb2ludE9mUmVnYXJkID0gb2xkUG9pbnRPZlJlZ2FyZDtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICAgICAgcmVuZGVyaW5nUmVzdWx0OiB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBvbGRQb2ludE9mUmVnYXJkLmNsb25lKCksXG4gICAgICAgICAgICAgICAgICAgIGVuZDogb2xkUG9pbnRPZlJlZ2FyZC5jbG9uZSgpLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgTmF2aWdhdGlvbiBlcnJvcjogJHtlcnJvci5tZXNzYWdlfWBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgY29uc29sZS5ncm91cEVuZCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8qKlxuICAgICAqIEp1bXAgdG8gdGhlIHByZXZpb3VzIGVsZW1lbnQgYnkgdGhlIHNwZWNpZmllZCBtb2RlXG4gICAgICogQHBhcmFtIG1vZGUgVGhlIG5hdmlnYXRpb24gbW9kZSB0byB1c2VcbiAgICAgKiBAcmV0dXJucyBOYXZpZ2F0aW9uUmVzdWx0IGluZGljYXRpbmcgc3VjY2VzcyBvciBmYWlsdXJlXG4gICAgICovXG4gICAgcHVibGljIGp1bXBQcmV2aW91cyhtb2RlOiBOYXZpZ2F0aW9uTW9kZSk6IE5hdmlnYXRpb25SZXN1bHQge1xuICAgICAgICBDYWNoZVV0aWwuY2xlYXJDYWNoZXModGhpcy5jdHJsRG9jLmRvY3VtZW50RWxlbWVudCk7XG4gICAgICAgIGNvbnN0IG9sZFBvaW50T2ZSZWdhcmQgPSB0aGlzLnBvaW50T2ZSZWdhcmQuY2xvbmUoKTtcbiAgICAgICAgXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgYkNvbnRpbnVlID0gdHJ1ZTtcbiAgICAgICAgICAgIGxldCBwcmV2SnVtcCA9IHRoaXMucG9pbnRPZlJlZ2FyZC5jbG9uZSgpO1xuICAgICAgICAgICAgbGV0IHJlbmRlcmluZ1Jlc3VsdDtcbiAgICAgICAgICAgIHdoaWxlIChiQ29udGludWUgJiYgcHJldkp1bXApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsYXN0SnVtcCA9IHByZXZKdW1wLmNsb25lKCk7XG4gICAgICAgICAgICAgICAgcHJldkp1bXAgPSBTUk5hdmlnYXRvci5qdW1wUHJldmlvdXMobW9kZSwgcHJldkp1bXApO1xuICAgICAgICAgICAgICAgIGlmIChwcmV2SnVtcCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY29udGFpbmVyQ2hhbmdlcyA9IFNSQ29udHJvbGxlci5kaWZmQ29udGFpbmVycyhtb2RlLCBwcmV2SnVtcCwgbGFzdEp1bXApO1xuICAgICAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gXCJpdGVtXCIgJiYgIVNSTmF2aWdhdG9yLmdldFN0YXJ0RnVuYyhtb2RlKShwcmV2SnVtcC5nZXRSb2xlKCksICFwcmV2SnVtcC5pc0VuZFRhZygpLCBwcmV2SnVtcC5nZXROb2RlKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJDaGFuZ2VzID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudGVyaW5nOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWF2aW5nOiBbXVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJlbmRlcmluZ1Jlc3VsdCA9IFNSUmVuZGVyZXIucmVuZGVyQ3VycmVudChtb2RlLCBwcmV2SnVtcCwgY29udGFpbmVyQ2hhbmdlcyk7XG4gICAgICAgICAgICAgICAgICAgIC8vIEtlZXAgZ29pbmcgaWYgdGhlIGxhbmRpbmcgcG9pbnQgaXMgZW1wdHksIHVubGVzcyBpdCdzIGNlcnRhaW4gbmF2IG1vZGVzIChlLmcuLCByZWdpb24pXG4gICAgICAgICAgICAgICAgICAgIGJDb250aW51ZSA9IHJlbmRlcmluZ1Jlc3VsdC5tZXNzYWdlLnRyaW0oKS5sZW5ndGggPT09IDAgJiYgIVtcInJlZ2lvblwiXS5pbmNsdWRlcyhtb2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmICghcHJldkp1bXApIHtcbiAgICAgICAgICAgICAgICAvLyBSZXN0b3JlIHRoZSBvcmlnaW5hbCBwb2ludCBvZiByZWdhcmRcbiAgICAgICAgICAgICAgICB0aGlzLnBvaW50T2ZSZWdhcmQgPSBvbGRQb2ludE9mUmVnYXJkO1xuICAgICAgICAgICAgICAgIGxldCBjdXJyZW50UmVzdWx0ID0gU1JSZW5kZXJlci5yZW5kZXJDdXJyZW50KG1vZGUsIG9sZFBvaW50T2ZSZWdhcmQsIHsgbGVhdmluZzogW10sIGVudGVyaW5nOiBbXX0pO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICByZW5kZXJpbmdSZXN1bHQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBvbGRQb2ludE9mUmVnYXJkLmNsb25lKCksXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmQ6IG9sZFBvaW50T2ZSZWdhcmQuY2xvbmUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBObyBwcmV2aW91cyAke21vZGV9LiAke2N1cnJlbnRSZXN1bHQ/Lm1lc3NhZ2UgfHwgXCJcIn1gXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBvaW50T2ZSZWdhcmQgPSBwcmV2SnVtcDtcbiAgICAgICAgICAgICAgICBjb25zdCByb2xlID0gdGhpcy5wb2ludE9mUmVnYXJkLmdldFJvbGUoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gdGhpcy5wb2ludE9mUmVnYXJkLmdldE5hbWVJbmZvKCk/Lm5hbWU7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gLy8gQ2hlY2sgZm9yIGNvbnRhaW5lciBjaGFuZ2VzXG4gICAgICAgICAgICAgICAgLy8gY29uc3QgY29udGFpbmVyQ2hhbmdlcyA9IFNSQ29udHJvbGxlci5kaWZmQ29udGFpbmVycyhtb2RlLCB0aGlzLnBvaW50T2ZSZWdhcmQsIG9sZFBvaW50T2ZSZWdhcmQpO1xuICAgICAgICAgICAgICAgIC8vIGxldCBzID0gU1JSZW5kZXJlci5yZW5kZXJFbnRlcihtb2RlLCB0aGlzLnBvaW50T2ZSZWdhcmQpO1xuICAgICAgICAgICAgICAgIC8vIGlmIChjb250YWluZXJDaGFuZ2VzLmVudGVyaW5nW2NvbnRhaW5lckNoYW5nZXMuZW50ZXJpbmcubGVuZ3RoLTFdICE9PSBzKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIGNvbnRhaW5lckNoYW5nZXMuZW50ZXJpbmcucHVzaChzKTtcbiAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyaW5nUmVzdWx0LFxuICAgICAgICAgICAgICAgICAgICByb2xlLFxuICAgICAgICAgICAgICAgICAgICBuYW1lXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgLy8gUmVzdG9yZSB0aGUgb3JpZ2luYWwgcG9pbnQgb2YgcmVnYXJkXG4gICAgICAgICAgICB0aGlzLnBvaW50T2ZSZWdhcmQgPSBvbGRQb2ludE9mUmVnYXJkO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICByZW5kZXJpbmdSZXN1bHQ6IHtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IG9sZFBvaW50T2ZSZWdhcmQuY2xvbmUoKSxcbiAgICAgICAgICAgICAgICAgICAgZW5kOiBvbGRQb2ludE9mUmVnYXJkLmNsb25lKCksXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBOYXZpZ2F0aW9uIGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lIHRoZSBkaWZmZXJlbnQgaW4gY29udGFpbmVycyBiZXR3ZWVuIHRoZSB0d28gbm9kZXNcbiAgICAgKiBAcGFyYW0gbmV3V2Fsa2VyIFRoZSBuZXcgbm9kZSB3ZSdyZSBuYXZpZ2F0aW5nIHRvXG4gICAgICogQHBhcmFtIG9sZFdhbGtlciBUaGUgcHJldmlvdXMgbm9kZSB3ZSB3ZXJlIGF0XG4gICAgICogQHJldHVybnMgQXJyYXkgb2YgY29udGFpbmVyIGNoYW5nZSBtZXNzYWdlc1xuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZGlmZkNvbnRhaW5lcnMobW9kZTogTmF2aWdhdGlvbk1vZGUgfCBcImZvY3VzXCIsIG5ld1dhbGtlcjogU1JDdXJzb3IsIG9sZFdhbGtlcj86IFNSQ3Vyc29yKTogeyBsZWF2aW5nOiBzdHJpbmdbXSwgZW50ZXJpbmc6IHN0cmluZ1tdIH0ge1xuICAgICAgICBjb25zdCBERUJVRyA9IGZhbHNlO1xuICAgICAgICBERUJVRyAmJiBjb25zb2xlLmxvZyhcIi09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LVwiKTtcbiAgICAgICAgREVCVUcgJiYgY29uc29sZS5sb2coXCJBKVwiLCBvbGRXYWxrZXIuZ2V0Tm9kZSgpLm5vZGVOYW1lLCBuZXdXYWxrZXIuZ2V0Tm9kZSgpLm5vZGVOYW1lKTtcbiAgICAgICAgbGV0IGxlYXZpbmc6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGxldCBlbnRlcmluZzogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGRvY1Jvb3QgPSBuZXdXYWxrZXIgP1xuICAgICAgICAgICAgICAgIChuZXdXYWxrZXIuZ2V0Tm9kZSgpLm93bmVyRG9jdW1lbnQuYm9keSB8fCBuZXdXYWxrZXIuZ2V0Tm9kZSgpLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSA6XG4gICAgICAgICAgICAgICAgb2xkV2Fsa2VyID9cbiAgICAgICAgICAgICAgICAgICAgKG9sZFdhbGtlci5nZXROb2RlKCkub3duZXJEb2N1bWVudC5ib2R5IHx8IG9sZFdhbGtlci5nZXROb2RlKCkub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIDpcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keSB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG5cbiAgICAgICAgICAgIGxldCB3YWxrTmV3ID0gbmV3V2Fsa2VyID8gbmV3V2Fsa2VyLmNsb25lKCkgOiAobmV3IFNSQ3Vyc29yKGRvY1Jvb3QpKTtcbiAgICAgICAgICAgIGxldCB3YWxrT2xkID0gb2xkV2Fsa2VyID8gb2xkV2Fsa2VyLmNsb25lKCkgOiAobmV3IFNSQ3Vyc29yKGRvY1Jvb3QpKTtcbiAgICAgICAgICAgIGlmICghd2Fsa05ldy5nZXROb2RlKCkuaXNTYW1lTm9kZSh3YWxrT2xkLmdldE5vZGUoKSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgY29tbW9uUGFyZW50ID0gU1JDb250cm9sbGVyLmNvbW1vblBhcmVudCh3YWxrTmV3LCB3YWxrT2xkKTtcbiAgICAgICAgICAgICAgICBpZiAoY29tbW9uUGFyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIERFQlVHICYmIGNvbnNvbGUubG9nKFwiQilcIiwgY29tbW9uUGFyZW50LmdldE5vZGUoKS5ub2RlTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChjb21tb25QYXJlbnQuY29udGFpbnMod2Fsa05ldykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHICYmIGNvbnNvbGUubG9nKFwiRW50ZXJpbmc6XCIsIHdhbGtOZXcuZ2V0Tm9kZSgpLm5vZGVOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudGVyaW5nLnB1c2goU1JSZW5kZXJlci5yZW5kZXJFbnRlcihtb2RlLCB3YWxrTmV3LCB3YWxrT2xkKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB3YWxrTmV3LnBhcmVudCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVudGVyaW5nLnJldmVyc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgZW50ZXJpbmcgPSBlbnRlcmluZy5maWx0ZXIocyA9PiBzICYmIHMudHJpbSgpLmxlbmd0aCA+IDApLm1hcChzID0+IHMudHJpbSgpKTs7XG5cbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNvbW1vblBhcmVudC5jb250YWlucyh3YWxrT2xkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgREVCVUcgJiYgY29uc29sZS5sb2coXCJMZWF2aW5nOlwiLCB3YWxrT2xkLmdldE5vZGUoKS5ub2RlTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZWF2aW5nLnB1c2goU1JSZW5kZXJlci5yZW5kZXJMZWF2ZShtb2RlLCB3YWxrT2xkLCB3YWxrT2xkKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB3YWxrT2xkLnBhcmVudCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxlYXZpbmcgPSBsZWF2aW5nLmZpbHRlcihzID0+IHMgJiYgcy50cmltKCkubGVuZ3RoID4gMCkubWFwKHMgPT4gcy50cmltKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgIH1cbiAgICAgICAgREVCVUcgJiYgY29uc29sZS5sb2cobGVhdmluZywgZW50ZXJpbmcpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsZWF2aW5nLFxuICAgICAgICAgICAgZW50ZXJpbmdcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBjb21tb25QYXJlbnQod2Fsa2VyT25lOiBTUkN1cnNvciwgd2Fsa2VyVHdvOiBTUkN1cnNvcik6IFNSQ3Vyc29yIHtcbiAgICAgICAgaWYgKHdhbGtlck9uZS5jb250YWlucyh3YWxrZXJUd28pKSB7XG4gICAgICAgICAgICByZXR1cm4gd2Fsa2VyT25lLmNsb25lKCk7XG4gICAgICAgIH0gZWxzZSBpZiAod2Fsa2VyVHdvLmNvbnRhaW5zKHdhbGtlck9uZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB3YWxrZXJUd28uY2xvbmUoKTsgXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgY29tbW9uUGFyZW50OiBTUkN1cnNvciA9IHdhbGtlck9uZS5jbG9uZSgpO1xuICAgICAgICAgICAgd2hpbGUgKCFjb21tb25QYXJlbnQuY29udGFpbnMod2Fsa2VyVHdvKSAmJiBjb21tb25QYXJlbnQucGFyZW50KCkpO1xuICAgICAgICAgICAgaWYgKCFjb21tb25QYXJlbnQuY29udGFpbnMod2Fsa2VyT25lKSB8fCAhY29tbW9uUGFyZW50LmNvbnRhaW5zKHdhbGtlclR3bykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH0gXG4gICAgICAgICAgICByZXR1cm4gY29tbW9uUGFyZW50O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyByZW5kZXJBbGwobW9kZTogTmF2aWdhdGlvbk1vZGUpOiBzdHJpbmdbXSB7XG4gICAgICAgIGxldCBjdHJsID0gU1JDb250cm9sbGVyLmdldENvbnRyb2xsZXIoKTtcbiAgICAgICAgbGV0IGRpYWxvZ3MgPSBjdHJsLmN0cmxEb2MuYm9keS5xdWVyeVNlbGVjdG9yQWxsKFwiZGlhbG9nLFtyb2xlPSdkaWFsb2cnXVwiKTtcbiAgICAgICAgZGlhbG9ncy5mb3JFYWNoKGRpYWxvZyA9PiB7XG4gICAgICAgICAgICBpZiAoU1JVdGlsLmlzTW9kYWxEaWFsb2dFbGVtZW50KGRpYWxvZykpIHtcbiAgICAgICAgICAgICAgICBjdHJsLnNldFBvaW50T2ZSZWdhcmQoZGlhbG9nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgbGV0IHJlc3VsdHM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIC8vIEhhbmRsZSB0aGUgaW5pdGlhbCBpdGVtIGZpcnN0IChpZiB0aGVyZSBpcyBvbmUpXG4gICAgICAgIGxldCBzdGFydGVyTXNnID0gU1JSZW5kZXJlci5yZW5kZXJDdXJyZW50KG1vZGUsIGN0cmwuZ2V0UG9pbnRPZlJlZ2FyZCgpLCB7ZW50ZXJpbmc6IFtdLCBsZWF2aW5nOiBbXX0pO1xuICAgICAgICBpZiAoc3RhcnRlck1zZykge1xuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHN0YXJ0ZXJNc2cubWVzc2FnZSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYkNvbnRpbnVlID0gdHJ1ZTtcbiAgICAgICAgd2hpbGUgKGJDb250aW51ZSkge1xuICAgICAgICAgICAgbGV0IG5leHRWYWwgPSBjdHJsLmp1bXBOZXh0KG1vZGUpO1xuICAgICAgICAgICAgaWYgKG5leHRWYWwuc3VjY2Vzcykge1xuICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaChuZXh0VmFsLnJlbmRlcmluZ1Jlc3VsdC5tZXNzYWdlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYkNvbnRpbnVlID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyByZW5kZXJBbGxEZXRhaWwoZG9jOiBIVE1MRG9jdW1lbnQsIG1vZGU6IE5hdmlnYXRpb25Nb2RlKTogUmVuZGVyUmVzdWx0W10ge1xuICAgICAgICBsZXQgY3RybCA9IFNSQ29udHJvbGxlci5nZXRDb250cm9sbGVyKGRvYyk7XG4gICAgICAgIGN0cmwuc2V0UG9pbnRPZlJlZ2FyZChkb2MuYm9keSk7XG4gICAgICAgIGxldCBkaWFsb2dzID0gZG9jLmJvZHkucXVlcnlTZWxlY3RvckFsbChcImRpYWxvZyxbcm9sZT0nZGlhbG9nJ11cIik7XG4gICAgICAgIGRpYWxvZ3MuZm9yRWFjaChkaWFsb2cgPT4ge1xuICAgICAgICAgICAgaWYgKFNSVXRpbC5pc01vZGFsRGlhbG9nRWxlbWVudChkaWFsb2cpKSB7XG4gICAgICAgICAgICAgICAgY3RybC5zZXRQb2ludE9mUmVnYXJkKGRpYWxvZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIGxldCByZXN1bHRzOiBSZW5kZXJSZXN1bHRbXSA9IFtdO1xuICAgICAgICAvLyBIYW5kbGUgdGhlIGluaXRpYWwgaXRlbSBmaXJzdCAoaWYgdGhlcmUgaXMgb25lKVxuICAgICAgICBsZXQgc3RhcnRlck1zZyA9IFNSUmVuZGVyZXIucmVuZGVyQ3VycmVudChtb2RlLCBjdHJsLmdldFBvaW50T2ZSZWdhcmQoKSwge2VudGVyaW5nOiBbXSwgbGVhdmluZzogW119KTtcbiAgICAgICAgaWYgKHN0YXJ0ZXJNc2cpIHtcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaChzdGFydGVyTXNnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBiQ29udGludWUgPSB0cnVlO1xuICAgICAgICB3aGlsZSAoYkNvbnRpbnVlKSB7XG4gICAgICAgICAgICBsZXQgbmV4dFZhbCA9IGN0cmwuanVtcE5leHQobW9kZSk7XG4gICAgICAgICAgICBpZiAobmV4dFZhbC5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgLy8gbW9kZSA9PT0gXCJpdGVtXCIgJiYgY29uc29sZS5sb2cobmV4dFZhbCk7XG4gICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKG5leHRWYWwucmVuZGVyaW5nUmVzdWx0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYkNvbnRpbnVlID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyByZW5kZXJTdHJ1Y3R1cmUoZG9jOiBIVE1MRG9jdW1lbnQpOiBBcnJheTx7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9PiB7XG4gICAgICAgIGNvbnN0IG1vZGVzOiBOYXZpZ2F0aW9uTW9kZVtdID0gWyBcInJlZ2lvblwiLCBcImhlYWRpbmdcIiwgXCJpdGVtXCIsIFwidGFiX2ZvY3VzXCIsIFwiaW1hZ2VcIiBdO1xuICAgICAgICBsZXQgZGV0YWlscyA9IG1vZGVzLm1hcChtb2RlTGFiZWwgPT4gU1JDb250cm9sbGVyLnJlbmRlckFsbERldGFpbChkb2MsIG1vZGVMYWJlbCkpO1xuICAgICAgICBsZXQgcmV0VmFsOiBBcnJheTx7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9PiA9IFtdO1xuICAgICAgICB3aGlsZSAoZGV0YWlscy5zb21lKGRldGFpbCA9PiBkZXRhaWwubGVuZ3RoID4gMCkpIHtcbiAgICAgICAgICAgIGxldCBuZXh0ID0gZGV0YWlsc1swXVswXT8uc3RhcnQ7XG4gICAgICAgICAgICBtb2Rlcy5mb3JFYWNoKChtb2RlLCBpZHgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZGV0YWlsc1tpZHhdLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFuZXh0IHx8IFNSQ3Vyc29yLmNvbXBhcmUoZGV0YWlsc1tpZHhdWzBdLnN0YXJ0LCBuZXh0KSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgPSBkZXRhaWxzW2lkeF1bMF0uc3RhcnQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgbGV0IG5leHRJdGVtOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge307XG4gICAgICAgICAgICBsZXQgaGFzVmFsdWUgPSBmYWxzZTtcbiAgICAgICAgICAgIG1vZGVzLmZvckVhY2goKG1vZGUsIGlkeCkgPT4ge1xuICAgICAgICAgICAgICAgIG5leHRJdGVtW21vZGVdID0gXCJcIjtcbiAgICAgICAgICAgICAgICBpZiAoZGV0YWlsc1tpZHhdLmxlbmd0aCA+IDAgJiYgU1JDdXJzb3IuY29tcGFyZShkZXRhaWxzW2lkeF1bMF0uc3RhcnQsIG5leHQpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIG5leHRJdGVtW21vZGVdID0gZGV0YWlsc1tpZHhdLnNoaWZ0KCkubWVzc2FnZTtcbiAgICAgICAgICAgICAgICAgICAgaGFzVmFsdWUgPSBuZXh0SXRlbVttb2RlXSAhPT0gXCJcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKGhhc1ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbSA9IG5leHQuZ2V0RWxlbWVudCgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdG9yID0gZWxlbSAmJiBTUlV0aWwuZ2V0VW5pcXVlU2VsZWN0b3IoZWxlbSk7XG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdG9yICYmIGRvYy5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKSkge1xuICAgICAgICAgICAgICAgICAgICBuZXh0SXRlbS5zZWxlY3RvciA9IHNlbGVjdG9yO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXRWYWwucHVzaChuZXh0SXRlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG59IiwiaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01XYWxrZXJcIjtcbmltcG9ydCB7IEFjY2Vzc2libGVOYW1lUmVzdWx0LCBBY2NOYW1lVXRpbCB9IGZyb20gXCIuLi91dGlsL0FjY05hbWVVdGlsXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgU1JVdGlsIH0gZnJvbSBcIi4vU1JVdGlsXCI7XG5cbi8qKlxuICogRnVuY3Rpb24gdHlwZSBmb3IgbWF0Y2hpbmcgbm9kZXMgZHVyaW5nIGN1cnNvciBuYXZpZ2F0aW9uXG4gKiBAcGFyYW0gcm9sZSAtIFRoZSBBUklBIHJvbGUgb2YgdGhlIGN1cnJlbnQgbm9kZVxuICogQHBhcmFtIGJTdGFydFRhZyAtIFdoZXRoZXIgdGhpcyBpcyBhIHN0YXJ0IHRhZyAodHJ1ZSkgb3IgZW5kIHRhZyAoZmFsc2UpXG4gKiBAcGFyYW0gbm9kZSAtIFRoZSBET00gbm9kZSBiZWluZyBldmFsdWF0ZWRcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIG5vZGUgbWF0Y2hlcyB0aGUgY3JpdGVyaWEsIGZhbHNlIG90aGVyd2lzZVxuICovXG5leHBvcnQgdHlwZSBTUkN1cnNvck1hdGNoRnVuYyA9IChyb2xlOiBzdHJpbmcsIGJTdGFydFRhZzogYm9vbGVhbiwgbm9kZTogTm9kZSkgPT4gYm9vbGVhbjtcblxuZXhwb3J0IHR5cGUgU1JDdXJzb3JTa2lwRnVuYyA9IChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7IHNraXBDdXJyZW50OiBib29sZWFuLCBza2lwQ2hpbGRyZW46IGJvb2xlYW59IHwgbnVsbDtcblxuLyoqXG4gKiBTUkN1cnNvciAoU2NyZWVuIFJlYWRlciBDdXJzb3IpIGNsYXNzXG4gKlxuICogVGhpcyBjbGFzcyBwcm92aWRlcyBhIGN1cnNvci1saWtlIGludGVyZmFjZSBmb3IgbmF2aWdhdGluZyB0aGUgRE9NIGluIGEgd2F5IHRoYXRcbiAqIHNpbXVsYXRlcyBob3cgc2NyZWVuIHJlYWRlcnMgcHJvY2VzcyBhbmQgbmF2aWdhdGUgY29udGVudC4gSXQgdHJhY2tzOlxuICogLSBUaGUgY3VycmVudCBub2RlIHBvc2l0aW9uXG4gKiAtIFdoZXRoZXIgaXQncyBhdCBhIHN0YXJ0IG9yIGVuZCB0YWdcbiAqIC0gVGhlIEFSSUEgcm9sZSBvZiB0aGUgY3VycmVudCBub2RlXG4gKiAtIFRoZSBhY2Nlc3NpYmxlIG5hbWUgb2YgdGhlIGN1cnJlbnQgbm9kZVxuICovXG5leHBvcnQgY2xhc3MgU1JDdXJzb3Ige1xuICAgIC8qKiBUaGUgQVJJQSByb2xlIG9mIHRoZSBjdXJyZW50IG5vZGUgKi9cbiAgICBwcml2YXRlIHJvbGU6IHN0cmluZztcbiAgICAvKiogVGhlIGNvbXB1dGVkIGFjY2Vzc2libGUgbmFtZSBvZiB0aGUgY3VycmVudCBub2RlICovXG4gICAgcHJpdmF0ZSBuYW1lOiBBY2Nlc3NpYmxlTmFtZVJlc3VsdDtcbiAgICAvKiogVGhlIHVuZGVybHlpbmcgRE9NIHdhbGtlciB0aGF0IGhhbmRsZXMgbm9kZSB0cmF2ZXJzYWwgKi9cbiAgICBwcml2YXRlIHdhbGtlcjogRE9NV2Fsa2VyO1xuICAgIFxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgU1JDdXJzb3IgcG9zaXRpb25lZCBhdCB0aGUgc3BlY2lmaWVkIGVsZW1lbnRcbiAgICAgKiBAcGFyYW0gZWxlbWVudCAtIFRoZSBET00gbm9kZSB0byBwb3NpdGlvbiB0aGUgY3Vyc29yIGF0XG4gICAgICogQHBhcmFtIGJFbmQgLSBXaGV0aGVyIHRvIHBvc2l0aW9uIGF0IHRoZSBlbmQgdGFnICh0cnVlKSBvciBzdGFydCB0YWcgKGZhbHNlKVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGVsZW1lbnQgOiBOb2RlLCBiRW5kPyA6IGJvb2xlYW4pIHtcbiAgICAgICAgLy8gVXNlIERPTVdhbGtlciB3aXRoIGNvbnNpZGVySGlkZGVuPWZhbHNlIHRvIHByb2Nlc3MgYWxsIGNvbnRlbnQgKGluY2x1ZGluZyBoaWRkZW4gZWxlbWVudHMpXG4gICAgICAgIC8vIFRoaXMgaXMgaW1wb3J0YW50IGZvciBzY3JlZW4gcmVhZGVyIHNpbXVsYXRpb24gd2hpY2ggbmVlZHMgdG8gc2VlIGFsbCBjb250ZW50XG4gICAgICAgIHRoaXMud2Fsa2VyID0gbmV3IERPTVdhbGtlcihlbGVtZW50LCBiRW5kLCB1bmRlZmluZWQsIGZhbHNlKTtcbiAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaE5hbWUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjb3B5IG9mIHRoaXMgY3Vyc29yIGF0IHRoZSBzYW1lIHBvc2l0aW9uXG4gICAgICogQHJldHVybnMgQSBuZXcgU1JDdXJzb3IgaW5zdGFuY2Ugd2l0aCB0aGUgc2FtZSBwb3NpdGlvbiBhbmQgcHJvcGVydGllc1xuICAgICAqL1xuICAgIGNsb25lKCkgOiBTUkN1cnNvciB7XG4gICAgICAgIGxldCByZXRWYWwgPSBuZXcgU1JDdXJzb3IodGhpcy53YWxrZXIubm9kZSwgdGhpcy53YWxrZXIuYkVuZFRhZyk7XG4gICAgICAgIHJldFZhbC5yb2xlID0gdGhpcy5yb2xlO1xuICAgICAgICByZXRWYWwubmFtZSA9IHRoaXMubmFtZTtcbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHRoZSByb2xlIGFuZCBhY2Nlc3NpYmxlIG5hbWUgcHJvcGVydGllcyBiYXNlZCBvbiB0aGUgY3VycmVudCBub2RlXG4gICAgICogVGhpcyBpcyBjYWxsZWQgd2hlbmV2ZXIgdGhlIGN1cnNvciBwb3NpdGlvbiBjaGFuZ2VzXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlZnJlc2hOYW1lKCkge1xuICAgICAgICBpZiAodGhpcy53YWxrZXIubm9kZS5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgLy8gRWxlbWVudCBub2RlXG4gICAgICAgICAgICB0aGlzLnJvbGUgPSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUodGhpcy53YWxrZXIubm9kZSBhcyBIVE1MRWxlbWVudCwgdHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLm5hbWUgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWUodGhpcy53YWxrZXIubm9kZSBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy53YWxrZXIubm9kZS5ub2RlVHlwZSA9PT0gMykge1xuICAgICAgICAgICAgLy8gVGV4dCBub2RlXG4gICAgICAgICAgICB0aGlzLnJvbGUgPSBcInRleHRcIjtcbiAgICAgICAgICAgIHRoaXMubmFtZSA9IHsgbmFtZTogdGhpcy53YWxrZXIubm9kZS50ZXh0Q29udGVudCwgbmFtZUZyb206IFwidGV4dFwiIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBPdGhlciBub2RlIHR5cGVzXG4gICAgICAgICAgICB0aGlzLnJvbGUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0aGlzLm5hbWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNb3ZlcyB0aGUgY3Vyc29yIHRvIHRoZSBuZXh0IG5vZGUgdGhhdCBtYXRjaGVzIHRoZSBwcm92aWRlZCBjcml0ZXJpYVxuICAgICAqIEBwYXJhbSBtYXRjaGluZ0Z1bmMgLSBGdW5jdGlvbiB0aGF0IGRldGVybWluZXMgaWYgYSBub2RlIG1hdGNoZXMgdGhlIHNlYXJjaCBjcml0ZXJpYVxuICAgICAqIEByZXR1cm5zIHRydWUgaWYgYSBtYXRjaGluZyBub2RlIHdhcyBmb3VuZCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgICovXG4gICAgcHVibGljIG5leHQobWF0Y2hpbmdGdW5jOiBTUkN1cnNvck1hdGNoRnVuYywgc2tpcEZ1bmM/OiBTUkN1cnNvclNraXBGdW5jKSA6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBERUJVRyA9IGZhbHNlO1xuXG4gICAgICAgIC8vIGNvbnN0IERFQlVHID0gZmFsc2U7XG4gICAgICAgIGxldCBmb3VuZE5leHQgPSBmYWxzZTtcblxuICAgICAgICAvLyBHZXQgdGhlIHNraXAgaW5mbyBmb3IgdGhlIGN1cnJlbnQgc3BvdFxuICAgICAgICB0aGlzLnJlZnJlc2hOYW1lKCk7XG4gICAgICAgIERFQlVHICYmIGNvbnNvbGUuZ3JvdXAoYG5leHQgZnVuY3Rpb25gKTtcbiAgICAgICAgREVCVUcgJiYgY29uc29sZS5sb2codGhpcy5pc0VuZFRhZygpP1wiL1wiOlwiXCIsIHRoaXMuZ2V0Tm9kZSgpKTtcbiAgICAgICAgbGV0IHsgc2tpcEN1cnJlbnQsIHNraXBDaGlsZHJlbiB9ID0gKHNraXBGdW5jICYmIHNraXBGdW5jKHRoaXMpKSB8fCB7IHNraXBDdXJyZW50OiBmYWxzZSwgc2tpcENoaWxkcmVuOiBmYWxzZSB9O1xuICAgICAgICBERUJVRyAmJiBjb25zb2xlLmxvZyhcInNraXBDdXJyZW50OlwiLCBza2lwQ3VycmVudCwgXCJza2lwQ2hpbGRyZW46XCIsIHNraXBDaGlsZHJlbik7XG5cbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgLy8gTW92ZSBhcyBhcHByb3ByaWF0ZSBmcm9tIHRoZSBjdXJyZW50IHNwb3RcbiAgICAgICAgICAgIGlmIChza2lwQ2hpbGRyZW4gJiYgIXRoaXMud2Fsa2VyLmJFbmRUYWcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLndhbGtlci5iRW5kVGFnID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMud2Fsa2VyLm5leHROb2RlKCkpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBza2lwIGluZm8gZm9yIHRoZSBuZXcgc3BvdFxuICAgICAgICAgICAgdGhpcy5yZWZyZXNoTmFtZSgpO1xuICAgICAgICAgICAgREVCVUcgJiYgY29uc29sZS5sb2codGhpcy5pc0VuZFRhZygpP1wiL1wiOlwiXCIsIHRoaXMuZ2V0Tm9kZSgpKTtcbiAgICAgICAgICAgICh7IHNraXBDdXJyZW50LCBza2lwQ2hpbGRyZW4gfSA9IChza2lwRnVuYyAmJiBza2lwRnVuYyh0aGlzKSkgfHwgeyBza2lwQ3VycmVudDogZmFsc2UsIHNraXBDaGlsZHJlbjogZmFsc2UgfSk7XG4gICAgICAgICAgICBERUJVRyAmJiBjb25zb2xlLmxvZyhcInNraXBDdXJyZW50OlwiLCBza2lwQ3VycmVudCwgXCJza2lwQ2hpbGRyZW46XCIsIHNraXBDaGlsZHJlbik7XG5cbiAgICAgICAgICAgIC8vIFVwZGF0ZSByb2xlIGJhc2VkIG9uIG5vZGUgdHlwZVxuICAgICAgICAgICAgaWYgKHRoaXMud2Fsa2VyLm5vZGUubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJvbGUgPSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUodGhpcy53YWxrZXIubm9kZSBhcyBIVE1MRWxlbWVudCwgdHJ1ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMud2Fsa2VyLm5vZGUubm9kZVR5cGUgPT09IDMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJvbGUgPSBcInRleHRcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChTUlV0aWwuaXNNb2RhbERpYWxvZ0VsZW1lbnQodGhpcy5nZXROb2RlKCkpICYmIHRoaXMuaXNFbmRUYWcoKSkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXNraXBDdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBub2RlIG1hdGNoZXMgb3VyIGNyaXRlcmlhXG4gICAgICAgICAgICAgICAgZm91bmROZXh0ID0gbWF0Y2hpbmdGdW5jKHRoaXMucm9sZSwgIXRoaXMud2Fsa2VyLmJFbmRUYWcsIHRoaXMud2Fsa2VyLm5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IHdoaWxlICghZm91bmROZXh0KTtcbiAgICAgICAgREVCVUcgJiYgY29uc29sZS5sb2coXCJmb3VuZE5leHQ6XCIsIGZvdW5kTmV4dCwgdGhpcy5pc0VuZFRhZygpP1wiL1wiOlwiXCIsIHRoaXMuZ2V0Tm9kZSgpKTtcbiAgICAgICAgREVCVUcgJiYgY29uc29sZS5ncm91cEVuZCgpO1xuXG4gICAgICAgIGlmIChmb3VuZE5leHQpIHtcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaE5hbWUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFJlc2V0IHByb3BlcnRpZXMgaWYgbm8gbWF0Y2ggd2FzIGZvdW5kXG4gICAgICAgICAgICB0aGlzLnJvbGUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0aGlzLm5hbWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZvdW5kTmV4dDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNb3ZlcyB0aGUgY3Vyc29yIHRvIHRoZSBwcmV2aW91cyBub2RlIHRoYXQgbWF0Y2hlcyB0aGUgcHJvdmlkZWQgY3JpdGVyaWFcbiAgICAgKiBAcGFyYW0gbWF0Y2hpbmdGdW5jIC0gRnVuY3Rpb24gdGhhdCBkZXRlcm1pbmVzIGlmIGEgbm9kZSBtYXRjaGVzIHRoZSBzZWFyY2ggY3JpdGVyaWFcbiAgICAgKiBAcmV0dXJucyB0cnVlIGlmIGEgbWF0Y2hpbmcgbm9kZSB3YXMgZm91bmQsIGZhbHNlIG90aGVyd2lzZVxuICAgICAqL1xuICAgIHB1YmxpYyBwcmV2aW91cyhtYXRjaGluZ0Z1bmM6IFNSQ3Vyc29yTWF0Y2hGdW5jLCBza2lwRnVuYz86IFNSQ3Vyc29yU2tpcEZ1bmMpIDogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IERFQlVHID0gZmFsc2U7XG4gICAgICAgIGxldCBmb3VuZFByZXZpb3VzID0gZmFsc2U7XG5cbiAgICAgICAgLy8gR2V0IHRoZSBza2lwIGluZm8gZm9yIHRoZSBjdXJyZW50IHNwb3RcbiAgICAgICAgdGhpcy5yZWZyZXNoTmFtZSgpO1xuICAgICAgICBERUJVRyAmJiBjb25zb2xlLmdyb3VwKGBwcmV2aW91cyBmdW5jdGlvbmApO1xuICAgICAgICBERUJVRyAmJiBjb25zb2xlLmxvZyh0aGlzLmlzRW5kVGFnKCksIHRoaXMuZ2V0Tm9kZSgpKTtcbiAgICAgICAgbGV0IHsgc2tpcEN1cnJlbnQsIHNraXBDaGlsZHJlbiB9ID0gKHNraXBGdW5jICYmIHNraXBGdW5jKHRoaXMpKSB8fCB7IHNraXBDdXJyZW50OiBmYWxzZSwgc2tpcENoaWxkcmVuOiBmYWxzZSB9O1xuICAgICAgICBERUJVRyAmJiBjb25zb2xlLmxvZyhza2lwQ3VycmVudCwgc2tpcENoaWxkcmVuKTtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgLy8gTW92ZSBhcyBhcHByb3ByaWF0ZSBmcm9tIHRoZSBjdXJyZW50IHNwb3RcbiAgICAgICAgICAgIGlmIChza2lwQ2hpbGRyZW4gJiYgdGhpcy53YWxrZXIuYkVuZFRhZykge1xuICAgICAgICAgICAgICAgIERFQlVHICYmIGNvbnNvbGUubG9nKFwiU2tpcHBpbmcgbm9kZVwiKVxuICAgICAgICAgICAgICAgIHRoaXMud2Fsa2VyLmJFbmRUYWcgPSBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMud2Fsa2VyLnByZXZOb2RlKCkpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBza2lwIGluZm8gZm9yIHRoZSBuZXcgc3BvdFxuICAgICAgICAgICAgdGhpcy5yZWZyZXNoTmFtZSgpO1xuICAgICAgICAgICAgREVCVUcgJiYgY29uc29sZS5sb2codGhpcy5pc0VuZFRhZygpLCB0aGlzLmdldE5vZGUoKSk7XG4gICAgICAgICAgICAoeyBza2lwQ3VycmVudCwgc2tpcENoaWxkcmVuIH0gPSAoc2tpcEZ1bmMgJiYgc2tpcEZ1bmModGhpcykpIHx8IHsgc2tpcEN1cnJlbnQ6IGZhbHNlLCBza2lwQ2hpbGRyZW46IGZhbHNlIH0pO1xuICAgICAgICAgICAgREVCVUcgJiYgY29uc29sZS5sb2coc2tpcEN1cnJlbnQsIHNraXBDaGlsZHJlbik7XG5cbiAgICAgICAgICAgIC8vIFVwZGF0ZSByb2xlIGJhc2VkIG9uIG5vZGUgdHlwZVxuICAgICAgICAgICAgaWYgKHRoaXMud2Fsa2VyLm5vZGUubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJvbGUgPSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUodGhpcy53YWxrZXIubm9kZSBhcyBIVE1MRWxlbWVudCwgdHJ1ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMud2Fsa2VyLm5vZGUubm9kZVR5cGUgPT09IDMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJvbGUgPSBcInRleHRcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChTUlV0aWwuaXNNb2RhbERpYWxvZ0VsZW1lbnQodGhpcy5nZXROb2RlKCkpICYmICF0aGlzLmlzRW5kVGFnKCkpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghc2tpcEN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGlzIG5vZGUgbWF0Y2hlcyBvdXIgY3JpdGVyaWFcbiAgICAgICAgICAgICAgICBmb3VuZFByZXZpb3VzID0gbWF0Y2hpbmdGdW5jKHRoaXMucm9sZSwgIXRoaXMud2Fsa2VyLmJFbmRUYWcsIHRoaXMud2Fsa2VyLm5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IHdoaWxlICghZm91bmRQcmV2aW91cyk7XG4gICAgICAgIERFQlVHICYmIGNvbnNvbGUubG9nKHRoaXMuaXNFbmRUYWcoKSwgdGhpcy5nZXROb2RlKCkpO1xuICAgICAgICBERUJVRyAmJiBjb25zb2xlLmdyb3VwRW5kKCk7XG4gICAgICAgIGlmIChmb3VuZFByZXZpb3VzKSB7XG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hOYW1lKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBSZXNldCBwcm9wZXJ0aWVzIGlmIG5vIG1hdGNoIHdhcyBmb3VuZFxuICAgICAgICAgICAgdGhpcy5yb2xlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5uYW1lID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmb3VuZFByZXZpb3VzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1vdmVzIHRoZSBjdXJzb3IgdG8gdGhlIHBhcmVudCBub2RlIG9mIHRoZSBjdXJyZW50IG5vZGVcbiAgICAgKiBAcGFyYW0gZW5kVGFnIC0gV2hldGhlciB0byBwb3NpdGlvbiBhdCB0aGUgZW5kIHRhZyAodHJ1ZSkgb3Igc3RhcnQgdGFnIChmYWxzZSlcbiAgICAgKiBAcmV0dXJucyB0cnVlIGlmIHN1Y2Nlc3NmdWxseSBtb3ZlZCB0byBwYXJlbnQsIGZhbHNlIGlmIG5vIHBhcmVudCBleGlzdHNcbiAgICAgKi9cbiAgICBwdWJsaWMgcGFyZW50KGVuZFRhZz86IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKCF0aGlzLndhbGtlci5ub2RlLnBhcmVudE5vZGUpIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpcy53YWxrZXIubm9kZSA9IHRoaXMud2Fsa2VyLm5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgdGhpcy53YWxrZXIuYkVuZFRhZyA9IGVuZFRhZyA9PT0gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMud2Fsa2VyLm5vZGUubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgICAgICAgIHRoaXMucm9sZSA9IEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZSh0aGlzLndhbGtlci5ub2RlIGFzIEhUTUxFbGVtZW50LCB0cnVlKTtcbiAgICAgICAgICAgIHRoaXMubmFtZSA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZSh0aGlzLndhbGtlci5ub2RlIGFzIEhUTUxFbGVtZW50KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLndhbGtlci5ub2RlLm5vZGVUeXBlID09PSAzKSB7XG4gICAgICAgICAgICB0aGlzLnJvbGUgPSBcInRleHRcIjtcbiAgICAgICAgICAgIHRoaXMubmFtZSA9IHsgbmFtZTogdGhpcy53YWxrZXIubm9kZS50ZXh0Q29udGVudCwgbmFtZUZyb206IFwidGV4dFwiIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJvbGUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0aGlzLm5hbWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTW92ZXMgdGhlIGN1cnNvciB1cCB0aGUgRE9NIHRyZWUgdW50aWwgZmluZGluZyBhIG5vZGUgd2l0aCBhIG1hdGNoaW5nIHJvbGUgb3IgZWxlbWVudCBuYW1lXG4gICAgICogQHBhcmFtIHJvbGVzIC0gQXJyYXkgb2YgQVJJQSByb2xlcyB0byBtYXRjaFxuICAgICAqIEBwYXJhbSBlbGVtcyAtIE9wdGlvbmFsIGFycmF5IG9mIGVsZW1lbnQgbmFtZXMgdG8gbWF0Y2hcbiAgICAgKiBAcmV0dXJucyB0cnVlIGlmIGEgbWF0Y2hpbmcgbm9kZSB3YXMgZm91bmQsIGZhbHNlIG90aGVyd2lzZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRDdXJyZW50T3JQYXJlbnRCeVJvbGUocm9sZXM6IHN0cmluZ1tdLCBlbGVtcz86IHN0cmluZ1tdKSB7XG4gICAgICAgIGNvbnN0IHVwcEVsZW1zID0gZWxlbXMgPyBlbGVtcy5tYXAoZWxlbSA9PiBlbGVtLnRvVXBwZXJDYXNlKCkpIDogW107XG4gICAgICAgIGNvbnN0IG1hdGNoZXMgPSAod2Fsa2VyOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgY29uc3QgZWxlbSA9IHdhbGtlci5nZXRFbGVtZW50KCk7XG4gICAgICAgICAgICByZXR1cm4gcm9sZXMuaW5jbHVkZXModGhpcy5nZXRSb2xlKCkpXG4gICAgICAgICAgICB8fCAoZWxlbSAmJiAhZWxlbS5oYXNBdHRyaWJ1dGUoXCJyb2xlXCIpICYmIHVwcEVsZW1zLmluY2x1ZGVzKGVsZW0ubm9kZU5hbWUudG9VcHBlckNhc2UoKSkpO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlICghbWF0Y2hlcyh0aGlzKSAmJiB0aGlzLnBhcmVudCgpKTtcbiAgICAgICAgcmV0dXJuIG1hdGNoZXModGhpcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBjdXJzb3IgYW5kIG1vdmVzIGl0IHVwIHRoZSBET00gdHJlZSB1bnRpbCBmaW5kaW5nIGEgbm9kZSB3aXRoIGEgbWF0Y2hpbmcgcm9sZSBvciBlbGVtZW50IG5hbWVcbiAgICAgKiBAcGFyYW0gcm9sZXMgLSBBcnJheSBvZiBBUklBIHJvbGVzIHRvIG1hdGNoXG4gICAgICogQHBhcmFtIGVsZW1zIC0gT3B0aW9uYWwgYXJyYXkgb2YgZWxlbWVudCBuYW1lcyB0byBtYXRjaFxuICAgICAqIEByZXR1cm5zIEEgbmV3IGN1cnNvciBhdCB0aGUgbWF0Y2hpbmcgbm9kZSwgb3IgbnVsbCBpZiBubyBtYXRjaCBmb3VuZFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRDdXJyZW50T3JQYXJlbnRCeVJvbGVDbG9uZShyb2xlczogc3RyaW5nW10sIGVsZW1zPzogc3RyaW5nW10pIHtcbiAgICAgICAgbGV0IHJldFZhbCA9IHRoaXMuY2xvbmUoKTtcbiAgICAgICAgaWYgKHJldFZhbC5nZXRDdXJyZW50T3JQYXJlbnRCeVJvbGUocm9sZXMsIGVsZW1zKSkge1xuICAgICAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Q3VycmVudE9yUGFyZW50VGFiYmFibGVDbG9uZSgpIHtcbiAgICAgICAgbGV0IHJldFZhbCA9IHRoaXMuY2xvbmUoKTtcbiAgICAgICAgd2hpbGUgKHJldFZhbCkge1xuICAgICAgICAgICAgY29uc3QgZWxlbSA9IHJldFZhbC5nZXRFbGVtZW50KCk7XG4gICAgICAgICAgICBpZiAocmV0VmFsLmlzU3RhcnRUYWcoKSAmJiBlbGVtICYmIENvbW1vblV0aWwuaXNUYWJiYWJsZShlbGVtKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXJldFZhbC5wYXJlbnQoZmFsc2UpKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgQVJJQSByb2xlIG9mIHRoZSBjdXJyZW50IG5vZGVcbiAgICAgKiBAcmV0dXJucyBUaGUgQVJJQSByb2xlIGFzIGEgc3RyaW5nLCBvciB1bmRlZmluZWQgaWYgbm90IGF2YWlsYWJsZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRSb2xlKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvbGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgYWNjZXNzaWJsZSBuYW1lIGluZm8gZm9yIHRoZSBjdXJyZW50IG5vZGVcbiAgICAgKiBAcmV0dXJucyBUaGUgQWNjZXNzaWJsZU5hbWVSZXN1bHQgb2JqZWN0LCBvciB1bmRlZmluZWQgaWYgbm90IGF2YWlsYWJsZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXROYW1lSW5mbygpOiBBY2Nlc3NpYmxlTmFtZVJlc3VsdCB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hbWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBhY2Nlc3NpYmxlIG5hbWUgb2YgdGhlIGN1cnJlbnQgbm9kZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXROYW1lKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgICAgIC8vIEhhbmRsZSBvbmUtb2ZmIHF1aXJrcyBpbiB0aGUgbmFtZSBjYWxjdWxhdGlvblxuICAgICAgICBjb25zdCBuYW1lSW5mbyA9IHRoaXMuZ2V0TmFtZUluZm8oKTtcbiAgICAgICAgaWYgKG5hbWVJbmZvICYmIG5hbWVJbmZvLm5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBuYW1lSW5mby5uYW1lO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVsZW0gPSB0aGlzLmdldEVsZW1lbnQoKTtcbiAgICAgICAgaWYgKGVsZW0pIHtcbiAgICAgICAgICAgIGNvbnN0IGxhYmVsRWxlbSA9IENvbW1vblV0aWwuZ2V0TGFiZWxGb3JFbGVtZW50SGlkZGVuKGVsZW0sIHRydWUpO1xuICAgICAgICAgICAgaWYgKGxhYmVsRWxlbSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBsYWJlbEVsZW0uaW5uZXJUZXh0IHx8IGxhYmVsRWxlbS50ZXh0Q29udGVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgd2hldGhlciB0aGUgY3Vyc29yIGlzIGF0IGFuIGVuZCB0YWcgb3Igc3RhcnQgdGFnXG4gICAgICogQHBhcmFtIHZhbCAtIFRydWUgZm9yIGVuZCB0YWcsIGZhbHNlIGZvciBzdGFydCB0YWdcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0RW5kVGFnKHZhbDogYm9vbGVhbikge1xuICAgICAgICB0aGlzLndhbGtlci5iRW5kVGFnID0gdmFsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIERPTSBub2RlIGF0IHRoZSBjdXJyZW50IGN1cnNvciBwb3NpdGlvblxuICAgICAqIEByZXR1cm5zIFRoZSBjdXJyZW50IERPTSBub2RlXG4gICAgICovXG4gICAgcHVibGljIGdldE5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLndhbGtlci5ub2RlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGN1cnJlbnQgbm9kZSBhcyBhbiBIVE1MRWxlbWVudCBpZiBpdCBpcyBhbiBlbGVtZW50IG5vZGVcbiAgICAgKiBAcmV0dXJucyBUaGUgY3VycmVudCBub2RlIGFzIEhUTUxFbGVtZW50LCBvciB1bmRlZmluZWQgaWYgbm90IGFuIGVsZW1lbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0RWxlbWVudCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLndhbGtlci5ub2RlKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICBpZiAodGhpcy53YWxrZXIubm9kZS5ub2RlVHlwZSAhPT0gMSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHRoaXMud2Fsa2VyLm5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFBhcmVudEVsZW1lbnQoKSB7XG4gICAgICAgIGlmICghdGhpcy53YWxrZXIubm9kZSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCByZXRWYWwgPSB0aGlzLmNsb25lKCk7XG4gICAgICAgIHJldFZhbC53YWxrZXIubm9kZSA9IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KHJldFZhbC53YWxrZXIubm9kZSk7XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSBjdXJzb3IgaXMgcG9zaXRpb25lZCBhdCBhbiBlbmQgdGFnXG4gICAgICogQHJldHVybnMgdHJ1ZSBpZiBhdCBhbiBlbmQgdGFnLCBmYWxzZSBpZiBhdCBhIHN0YXJ0IHRhZ1xuICAgICAqL1xuICAgIHB1YmxpYyBpc0VuZFRhZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud2Fsa2VyLmJFbmRUYWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSBjdXJzb3IgaXMgcG9zaXRpb25lZCBhdCBhbiBlbmQgdGFnXG4gICAgICogQHJldHVybnMgdHJ1ZSBpZiBhdCBhbiBlbmQgdGFnLCBmYWxzZSBpZiBhdCBhIHN0YXJ0IHRhZ1xuICAgICAqL1xuICAgIHB1YmxpYyBpc1N0YXJ0VGFnKCkge1xuICAgICAgICByZXR1cm4gIXRoaXMud2Fsa2VyLmJFbmRUYWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29tcGFyZXMgdGhlIGRvY3VtZW50IHBvc2l0aW9uIG9mIHR3byBjdXJzb3JzXG4gICAgICogQHBhcmFtIG9uZSAtIEZpcnN0IGN1cnNvciB0byBjb21wYXJlXG4gICAgICogQHBhcmFtIHR3byAtIFNlY29uZCBjdXJzb3IgdG8gY29tcGFyZVxuICAgICAqIEByZXR1cm5zIDAgaWYgZXF1YWwsIC0xIGlmIG9uZSBpcyBiZWZvcmUgdHdvLCAxIGlmIG9uZSBpcyBhZnRlciB0d29cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGNvbXBhcmUob25lOiBTUkN1cnNvciB8IG51bGwsIHR3bzogU1JDdXJzb3IgfCBudWxsKSB7XG4gICAgICAgIGNvbnN0IG5vZGVPbmUgPSBvbmU/LndhbGtlcj8ubm9kZTtcbiAgICAgICAgY29uc3Qgbm9kZVR3byA9IHR3bz8ud2Fsa2VyPy5ub2RlO1xuICAgICAgICBpZiAoIW5vZGVPbmUgJiYgIW5vZGVUd28pIHJldHVybiAwO1xuICAgICAgICBpZiAoIW5vZGVPbmUpIHJldHVybiAxO1xuICAgICAgICBpZiAoIW5vZGVUd28pIHJldHVybiAtMTtcbiAgICAgICAgXG4gICAgICAgIGxldCBkb2NQb3NpdGlvbiA9IG5vZGVPbmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24obm9kZVR3byk7XG4gICAgICAgIFxuICAgICAgICAvLyBIYW5kbGUgZGlzY29ubmVjdGVkIG5vZGVzIChkaWZmZXJlbnQgZG9jdW1lbnRzIG9yIHNoYWRvdyBET01zKVxuICAgICAgICBpZiAoZG9jUG9zaXRpb24gJiAweDEpIHtcbiAgICAgICAgICAgIC8vIE5vZGVzIGFyZSBkaXNjb25uZWN0ZWQgLSB0aGV5J3JlIGluIGRpZmZlcmVudCB0cmVlcyAoaWZyYW1lIG9yIHNoYWRvdyBET00pXG4gICAgICAgICAgICAvLyBCdWlsZCBhbmNlc3RvciBjaGFpbnMgdXNpbmcgRE9NV2Fsa2VyLnBhcmVudE5vZGUgKGhhbmRsZXMgc2hhZG93IERPTSAmIGlmcmFtZXMpXG4gICAgICAgICAgICBsZXQgYW5jZXN0b3JzT25lOiBOb2RlW10gPSBbbm9kZU9uZV07XG4gICAgICAgICAgICBsZXQgYW5jZXN0b3JzVHdvOiBOb2RlW10gPSBbbm9kZVR3b107XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGxldCBjdXJyZW50OiBOb2RlIHwgbnVsbCA9IG5vZGVPbmU7XG4gICAgICAgICAgICB3aGlsZSAoY3VycmVudCA9IERPTVdhbGtlci5wYXJlbnROb2RlKGN1cnJlbnQpKSB7XG4gICAgICAgICAgICAgICAgYW5jZXN0b3JzT25lLnB1c2goY3VycmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGN1cnJlbnQgPSBub2RlVHdvO1xuICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnQgPSBET01XYWxrZXIucGFyZW50Tm9kZShjdXJyZW50KSkge1xuICAgICAgICAgICAgICAgIGFuY2VzdG9yc1R3by5wdXNoKGN1cnJlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBSZXZlcnNlIHNvIHJvb3QgaXMgZmlyc3RcbiAgICAgICAgICAgIGFuY2VzdG9yc09uZS5yZXZlcnNlKCk7XG4gICAgICAgICAgICBhbmNlc3RvcnNUd28ucmV2ZXJzZSgpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBGaW5kIHdoZXJlIHRoZSBwYXRocyBkaXZlcmdlXG4gICAgICAgICAgICBsZXQgY29tbW9uRGVwdGggPSAwO1xuICAgICAgICAgICAgd2hpbGUgKGNvbW1vbkRlcHRoIDwgYW5jZXN0b3JzT25lLmxlbmd0aCAmJlxuICAgICAgICAgICAgICAgICAgIGNvbW1vbkRlcHRoIDwgYW5jZXN0b3JzVHdvLmxlbmd0aCAmJlxuICAgICAgICAgICAgICAgICAgIGFuY2VzdG9yc09uZVtjb21tb25EZXB0aF0gPT09IGFuY2VzdG9yc1R3b1tjb21tb25EZXB0aF0pIHtcbiAgICAgICAgICAgICAgICBjb21tb25EZXB0aCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBJZiBvbmUgcGF0aCBpcyBhIHByZWZpeCBvZiB0aGUgb3RoZXIsIGhhbmRsZSBjb250YWlubWVudFxuICAgICAgICAgICAgaWYgKGNvbW1vbkRlcHRoID09PSBhbmNlc3RvcnNPbmUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgLy8gbm9kZU9uZSBpcyBhbiBhbmNlc3RvciBvZiBub2RlVHdvXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9uZS53YWxrZXIuYkVuZFRhZyA/IDEgOiAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjb21tb25EZXB0aCA9PT0gYW5jZXN0b3JzVHdvLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIC8vIG5vZGVUd28gaXMgYW4gYW5jZXN0b3Igb2Ygbm9kZU9uZVxuICAgICAgICAgICAgICAgIHJldHVybiB0d28ud2Fsa2VyLmJFbmRUYWcgPyAtMSA6IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIENvbXBhcmUgdGhlIG5vZGVzIHdoZXJlIHBhdGhzIGRpdmVyZ2VcbiAgICAgICAgICAgIGlmIChjb21tb25EZXB0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgY2hpbGRPbmUgPSBhbmNlc3RvcnNPbmVbY29tbW9uRGVwdGhdO1xuICAgICAgICAgICAgICAgIGxldCBjaGlsZFR3byA9IGFuY2VzdG9yc1R3b1tjb21tb25EZXB0aF07XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgbGV0IGNoaWxkUG9zaXRpb24gPSBjaGlsZE9uZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihjaGlsZFR3byk7XG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkUG9zaXRpb24gJiAweDIpIHJldHVybiAxOyAgLy8gY2hpbGRUd28gcHJlY2VkZXMgY2hpbGRPbmVcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGRQb3NpdGlvbiAmIDB4NCkgcmV0dXJuIC0xOyAvLyBjaGlsZE9uZSBwcmVjZWRlcyBjaGlsZFR3b1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBObyBjb21tb24gYW5jZXN0b3IgZm91bmQgLSBzaG91bGRuJ3QgaGFwcGVuIGluIGEgd2VsbC1mb3JtZWQgZG9jdW1lbnRcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZiAoZG9jUG9zaXRpb24gJiAweDgpIHtcbiAgICAgICAgICAgIC8vIG9uZSBpcyBjb250YWluZWQgd2l0aGluIHR3b1xuICAgICAgICAgICAgLy8gaWYgdHdvIGlzIGFuIGVuZCB0YWcsIG9uZSBpcyBiZWZvcmUsIG90aGVyd2lzZSwgb25lIGlzIGFmdGVyXG4gICAgICAgICAgICByZXR1cm4gdHdvLndhbGtlci5iRW5kVGFnID8gLTEgOiAxO1xuICAgICAgICB9IGVsc2UgaWYgKGRvY1Bvc2l0aW9uICYgMHgxMCkge1xuICAgICAgICAgICAgLy8gdHdvIGlzIGNvbnRhaW5lZCB3aXRoaW4gb25lXG4gICAgICAgICAgICAvLyBpZiBvbmUgaXMgYW4gZW5kIHRhZywgb25lIGlzIGFmdGVyLCBvdGhlcndpc2UsIG9uZSBpcyBiZWZvcmVcbiAgICAgICAgICAgIHJldHVybiBvbmUud2Fsa2VyLmJFbmRUYWcgPyAxIDogLTE7XG4gICAgICAgIH0gZWxzZSBpZiAoZG9jUG9zaXRpb24gJiAweDIpIHtcbiAgICAgICAgICAgIC8vIHR3byBwcmVjZWRlcyBvbmUgaW4gdGhlIGRvY3VtZW50XG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfSBlbHNlIGlmIChkb2NQb3NpdGlvbiAmIDB4NCkge1xuICAgICAgICAgICAgLy8gb25lIHByZWNlZGVzIHR3byBpbiB0aGUgZG9jdW1lbnRcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhpcyBjdXJzb3IncyBub2RlIGNvbnRhaW5zIGFub3RoZXIgY3Vyc29yJ3Mgbm9kZVxuICAgICAqIEBwYXJhbSBvdGhlciAtIFRoZSBvdGhlciBjdXJzb3IgdG8gY2hlY2tcbiAgICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoaXMgY3Vyc29yIGNvbnRhaW5zIChpcyBhIHBhcmVudC9hbmNlc3RvciBvZikgdGhlIG90aGVyIGN1cnNvcidzIG5vZGVcbiAgICAgKi9cbiAgICBwdWJsaWMgY29udGFpbnMob3RoZXI6IFNSQ3Vyc29yKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE5vZGUoKS5jb250YWlucyhvdGhlci5nZXROb2RlKCkpXG4gICAgICAgICAgICAmJiAhdGhpcy5pc1NhbWVOb2RlKG90aGVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhpcyBjdXJzb3IgcG9pbnRzIHRvIHRoZSBzYW1lIG5vZGUgYXMgYW5vdGhlciBjdXJzb3JcbiAgICAgKiBAcGFyYW0gb3RoZXIgLSBUaGUgb3RoZXIgY3Vyc29yIHRvIGNvbXBhcmUgd2l0aFxuICAgICAqIEByZXR1cm5zIHRydWUgaWYgYm90aCBjdXJzb3JzIHBvaW50IHRvIHRoZSBzYW1lIG5vZGVcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNTYW1lTm9kZShvdGhlcjogU1JDdXJzb3IpIHtcbiAgICAgICAgaWYgKCFvdGhlcikgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gdGhpcy5nZXROb2RlKCkuaXNTYW1lTm9kZShvdGhlci5nZXROb2RlKCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGUgY3VycmVudCBub2RlIGhhcyBhIG5vbi1lbXB0eSBhY2Nlc3NpYmxlIG5hbWVcbiAgICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBub2RlIGhhcyBhIG5vbi1lbXB0eSBhY2Nlc3NpYmxlIG5hbWVcbiAgICAgKi9cbiAgICBwdWJsaWMgaGFzTm9uRW1wdHlOYW1lKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuZ2V0TmFtZUluZm8oKT8ubmFtZSB8fCBcIlwiKS50cmltKCkubGVuZ3RoID4gMDtcbiAgICB9XG5cbn0iLCJpbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuaW1wb3J0IHsgQWNjTmFtZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BY2NOYW1lVXRpbFwiO1xuaW1wb3J0IHsgTmF2aWdhdGlvbk1vZGUgfSBmcm9tIFwiLi9TUlR5cGVzXCI7XG5pbXBvcnQgeyBTUkN1cnNvciwgU1JDdXJzb3JNYXRjaEZ1bmMsIFNSQ3Vyc29yU2tpcEZ1bmMgfSBmcm9tIFwiLi9TUkN1cnNvclwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5cbmV4cG9ydCBuYW1lc3BhY2UgU1JOYXZpZ2F0b3Ige1xuICAgIC8qKlxuICAgICAqIERldGVybWluZSBpZiBhIG5vZGUgaXMgYSBibG9jay1sZXZlbCBlbGVtZW50IGJhc2VkIG9uIGl0cyBkaXNwbGF5IHByb3BlcnR5XG4gICAgICogQHBhcmFtIG5vZGUgVGhlIERPTSBub2RlIHRvIGNoZWNrXG4gICAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgbm9kZSBpcyBhIGJsb2NrLWxldmVsIGVsZW1lbnQsIGZhbHNlIG90aGVyd2lzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzQmxvY2tFbGVtZW50KG5vZGU6IE5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgIT09IDEpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJiclwiKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY29uc3QgZWxlbSA9IG5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IG15d2luID0gZWxlbS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3O1xuICAgICAgICBjb25zdCBkaXNwID0gbXl3aW4uZ2V0Q29tcHV0ZWRTdHlsZShlbGVtKT8uZGlzcGxheTtcbiAgICAgICAgaWYgKGRpc3AgJiYgZGlzcC5zdGFydHNXaXRoKFwidGFibGVcIikpIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAoZGlzcCA9PT0gXCJibG9ja1wiICYmIGVsZW0uc3R5bGUuZGlzcGxheSAhPT0gXCJibG9ja1wiKSB7XG4gICAgICAgICAgICAvLyBJcyB0aGlzIGJsb2NrIGJlY2F1c2UgaXQncyBhIGZsZXggZWxlbT9cbiAgICAgICAgICAgIGlmIChlbGVtLnBhcmVudEVsZW1lbnQgJiYgbXl3aW4uZ2V0Q29tcHV0ZWRTdHlsZShlbGVtLnBhcmVudEVsZW1lbnQpLmRpc3BsYXkgPT09IFwiZmxleFwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUoZWxlbSwgdHJ1ZSkgPT09IFwibGlua1wiKSB7XG4gICAgICAgICAgICBsZXQgdGVtcCA9IG5ldyBET01XYWxrZXIobm9kZSwgZmFsc2UsIHVuZGVmaW5lZCwgZmFsc2UpO1xuICAgICAgICAgICAgdGVtcC5wcmV2Tm9kZSgpO1xuICAgICAgICAgICAgaWYgKCFpc0Jsb2NrRWxlbWVudCh0ZW1wLm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtcImJsb2NrXCIsIFwiZmxleFwiLCBcImdyaWRcIiwgXCJsaXN0LWl0ZW1cIl0uaW5jbHVkZXMoZGlzcCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0RXhwbGljaXRUYWJpbmRleChub2RlOiBOb2RlKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgICAgIGlmICghbm9kZSB8fCBub2RlLm5vZGVUeXBlICE9PSAxKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgZWxlbSA9IG5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGlmICghZWxlbS5oYXNBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGNvbnN0IHRhYmluZGV4VmFsdWUgPSBwYXJzZUludChlbGVtLmdldEF0dHJpYnV0ZShcInRhYmluZGV4XCIpLCAxMCk7XG4gICAgICAgIHJldHVybiBOdW1iZXIuaXNOYU4odGFiaW5kZXhWYWx1ZSkgPyBudWxsIDogdGFiaW5kZXhWYWx1ZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1Bvc2l0aXZlVGFiRm9jdXMobm9kZTogTm9kZSk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIW5vZGUgfHwgbm9kZS5ub2RlVHlwZSAhPT0gMSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjb25zdCBlbGVtID0gbm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgY29uc3QgZXhwbGljaXRUYWJpbmRleCA9IGdldEV4cGxpY2l0VGFiaW5kZXgoZWxlbSk7XG4gICAgICAgIHJldHVybiBleHBsaWNpdFRhYmluZGV4ICE9PSBudWxsICYmIGV4cGxpY2l0VGFiaW5kZXggPiAwICYmIENvbW1vblV0aWwuaXNUYWJiYWJsZShlbGVtKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0RlZmF1bHRPclplcm9UYWJGb2N1cyhub2RlOiBOb2RlKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghbm9kZSB8fCBub2RlLm5vZGVUeXBlICE9PSAxKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IGVsZW0gPSBub2RlIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBjb25zdCBleHBsaWNpdFRhYmluZGV4ID0gZ2V0RXhwbGljaXRUYWJpbmRleChlbGVtKTtcbiAgICAgICAgcmV0dXJuIChleHBsaWNpdFRhYmluZGV4ID09PSBudWxsIHx8IGV4cGxpY2l0VGFiaW5kZXggPT09IDApICYmIENvbW1vblV0aWwuaXNUYWJiYWJsZShlbGVtKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRUYWJGb2N1c1N0YXJ0RnVuYyhpbmNsdWRlUG9zaXRpdmVUYWJpbmRleDogYm9vbGVhbiA9IHRydWUpOiBTUkN1cnNvck1hdGNoRnVuYyB7XG4gICAgICAgIHJldHVybiAoX3JvbGU6IHN0cmluZywgYlN0YXJ0VGFnOiBib29sZWFuLCBub2RlOiBOb2RlKSA9PiB7XG4gICAgICAgICAgICBpZiAoIShub2RlICYmIG5vZGUubm9kZVR5cGUgPT09IDEgJiYgYlN0YXJ0VGFnICYmIENvbW1vblV0aWwuaXNUYWJiYWJsZShub2RlKSkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiBpbmNsdWRlUG9zaXRpdmVUYWJpbmRleCB8fCBpc0RlZmF1bHRPclplcm9UYWJGb2N1cyhub2RlKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb2xsZWN0IGFsbCB0YWJiYWJsZSBlbGVtZW50cyBpbiB0YWIgb3JkZXIgKHBvc2l0aXZlIHRhYmluZGV4IGZpcnN0LCB0aGVuIGRvY3VtZW50IG9yZGVyKVxuICAgICAqIEBwYXJhbSBtYXRjaEZ1bmMgRnVuY3Rpb24gdG8gbWF0Y2ggdGFiYmFibGUgZWxlbWVudHNcbiAgICAgKiBAcGFyYW0gcm9vdE5vZGUgT3B0aW9uYWwgcm9vdCBub2RlIHRvIHN0YXJ0IGNvbGxlY3Rpb24gZnJvbSAoZGVmYXVsdHMgdG8gZG9jdW1lbnQgYm9keSlcbiAgICAgKiBAcmV0dXJucyBBcnJheSBvZiBjdXJzb3JzIHBvaW50aW5nIHRvIHRhYmJhYmxlIGVsZW1lbnRzIGluIHRhYiBvcmRlclxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvbGxlY3RUYWJGb2N1c0N1cnNvcnMobWF0Y2hGdW5jOiBTUkN1cnNvck1hdGNoRnVuYywgcm9vdE5vZGU/OiBOb2RlKTogU1JDdXJzb3JbXSB7XG4gICAgICAgIGNvbnN0IHJvb3QgPSAocm9vdE5vZGU/Lm93bmVyRG9jdW1lbnQgfHwgZG9jdW1lbnQpLmJvZHkgfHwgcm9vdE5vZGU7XG4gICAgICAgIGlmICghcm9vdCkgcmV0dXJuIFtdO1xuICAgICAgICBsZXQgd2Fsa2VyID0gbmV3IFNSQ3Vyc29yKHJvb3QsIGZhbHNlKTtcbiAgICAgICAgY29uc3Qgc2tpcEZ1bmMgPSBnZXRTa2lwRnVuYyhcInRhYl9mb2N1c1wiKTtcbiAgICAgICAgbGV0IHBvc2l0aXZlUmVzdWx0czogU1JDdXJzb3JbXSA9IFtdO1xuICAgICAgICBsZXQgbm9ybWFsUmVzdWx0czogU1JDdXJzb3JbXSA9IFtdO1xuXG4gICAgICAgIGNvbnN0IGFkZEN1cnNvciA9IChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICBpZiAoIW1hdGNoRnVuYyhjdXJzb3IuZ2V0Um9sZSgpLCAhY3Vyc29yLmlzRW5kVGFnKCksIGN1cnNvci5nZXROb2RlKCkpKSByZXR1cm47XG4gICAgICAgICAgICBpZiAoaXNQb3NpdGl2ZVRhYkZvY3VzKGN1cnNvci5nZXROb2RlKCkpKSB7XG4gICAgICAgICAgICAgICAgcG9zaXRpdmVSZXN1bHRzLnB1c2goY3Vyc29yLmNsb25lKCkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpc0RlZmF1bHRPclplcm9UYWJGb2N1cyhjdXJzb3IuZ2V0Tm9kZSgpKSkge1xuICAgICAgICAgICAgICAgIG5vcm1hbFJlc3VsdHMucHVzaChjdXJzb3IuY2xvbmUoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgYWRkQ3Vyc29yKHdhbGtlcik7XG4gICAgICAgIHdoaWxlICh3YWxrZXIubmV4dCgoKSA9PiB0cnVlLCBza2lwRnVuYykpIHtcbiAgICAgICAgICAgIGFkZEN1cnNvcih3YWxrZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcG9zaXRpdmVSZXN1bHRzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFFbGVtID0gYS5nZXRFbGVtZW50KCk7XG4gICAgICAgICAgICBjb25zdCBiRWxlbSA9IGIuZ2V0RWxlbWVudCgpO1xuICAgICAgICAgICAgY29uc3QgYVRhYmluZGV4ID0gZ2V0RXhwbGljaXRUYWJpbmRleChhRWxlbSkgfHwgMDtcbiAgICAgICAgICAgIGNvbnN0IGJUYWJpbmRleCA9IGdldEV4cGxpY2l0VGFiaW5kZXgoYkVsZW0pIHx8IDA7XG4gICAgICAgICAgICBpZiAoYVRhYmluZGV4ICE9PSBiVGFiaW5kZXgpIHJldHVybiBiVGFiaW5kZXggLSBhVGFiaW5kZXg7XG4gICAgICAgICAgICByZXR1cm4gU1JDdXJzb3IuY29tcGFyZShhLCBiKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHBvc2l0aXZlUmVzdWx0cy5jb25jYXQobm9ybWFsUmVzdWx0cyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmluZCB0aGUgaW5kZXggb2YgYSBjdXJzb3IgaW4gYW4gYXJyYXkgb2YgdGFiIGZvY3VzIGN1cnNvcnNcbiAgICAgKiBAcGFyYW0gY3Vyc29ycyBBcnJheSBvZiBjdXJzb3JzIHRvIHNlYXJjaFxuICAgICAqIEBwYXJhbSB3YWxrZXIgVGhlIGN1cnNvciB0byBmaW5kXG4gICAgICogQHJldHVybnMgVGhlIGluZGV4IG9mIHRoZSBjdXJzb3IsIG9yIC0xIGlmIG5vdCBmb3VuZFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZpbmRUYWJGb2N1c0luZGV4KGN1cnNvcnM6IFNSQ3Vyc29yW10sIHdhbGtlcjogU1JDdXJzb3IpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gY3Vyc29ycy5maW5kSW5kZXgoY3Vyc29yID0+IFNSQ3Vyc29yLmNvbXBhcmUoY3Vyc29yLCB3YWxrZXIpID09PSAwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIG1hdGNoIGZ1bmN0aW9uIGZvciBpZGVudGlmeWluZyBzdGFydCBwb3NpdGlvbnMgaW4gYSBnaXZlbiBuYXZpZ2F0aW9uIG1vZGVcbiAgICAgKiBAcGFyYW0gbW9kZSBUaGUgbmF2aWdhdGlvbiBtb2RlIChlLmcuLCBcImxpbmtcIiwgXCJoZWFkaW5nXCIsIFwiYnV0dG9uXCIsIGV0Yy4pXG4gICAgICogQHJldHVybnMgQSBmdW5jdGlvbiB0aGF0IG1hdGNoZXMgZWxlbWVudHMgYXBwcm9wcmlhdGUgZm9yIHRoZSBuYXZpZ2F0aW9uIG1vZGVcbiAgICAgKi9cbiAgICBleHBvcnQgZnVuY3Rpb24gZ2V0U3RhcnRGdW5jKG1vZGU6IE5hdmlnYXRpb25Nb2RlKSA6IFNSQ3Vyc29yTWF0Y2hGdW5jIHtcbiAgICAgICAgc3dpdGNoIChtb2RlKSB7XG4gICAgICAgICAgICBjYXNlIFwibGlua1wiOlxuICAgICAgICAgICAgICAgIHJldHVybiAocm9sZTogc3RyaW5nLCBiU3RhcnRUYWc6IGJvb2xlYW4pID0+IChiU3RhcnRUYWcgJiYgcm9sZSA9PT0gXCJsaW5rXCIpO1xuICAgICAgICAgICAgY2FzZSBcInRhYl9mb2N1c1wiOlxuICAgICAgICAgICAgICAgIHJldHVybiBnZXRUYWJGb2N1c1N0YXJ0RnVuYyhmYWxzZSk7XG4gICAgICAgICAgICBjYXNlIFwiaGVhZGluZ1wiOlxuICAgICAgICAgICAgICAgIHJldHVybiAocm9sZTogc3RyaW5nLCBiU3RhcnRUYWc6IGJvb2xlYW4pID0+IChiU3RhcnRUYWcgJiYgcm9sZSA9PT0gXCJoZWFkaW5nXCIpO1xuICAgICAgICAgICAgY2FzZSBcImgxXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIChyb2xlOiBzdHJpbmcsIGJTdGFydFRhZzogYm9vbGVhbiwgbm9kZTogTm9kZSkgPT4gKGJTdGFydFRhZyAmJiByb2xlID09PSBcImhlYWRpbmdcIiAmJiAobm9kZSBhcyBIVE1MRWxlbWVudCkuYXJpYUxldmVsID09PSBcIjFcIik7XG4gICAgICAgICAgICBjYXNlIFwiaDJcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gKHJvbGU6IHN0cmluZywgYlN0YXJ0VGFnOiBib29sZWFuLCBub2RlOiBOb2RlKSA9PiAoYlN0YXJ0VGFnICYmIHJvbGUgPT09IFwiaGVhZGluZ1wiICYmIChub2RlIGFzIEhUTUxFbGVtZW50KS5hcmlhTGV2ZWwgPT09IFwiMlwiKTtcbiAgICAgICAgICAgIGNhc2UgXCJoM1wiOlxuICAgICAgICAgICAgICAgIHJldHVybiAocm9sZTogc3RyaW5nLCBiU3RhcnRUYWc6IGJvb2xlYW4sIG5vZGU6IE5vZGUpID0+IChiU3RhcnRUYWcgJiYgcm9sZSA9PT0gXCJoZWFkaW5nXCIgJiYgKG5vZGUgYXMgSFRNTEVsZW1lbnQpLmFyaWFMZXZlbCA9PT0gXCIzXCIpO1xuICAgICAgICAgICAgY2FzZSBcImg0XCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIChyb2xlOiBzdHJpbmcsIGJTdGFydFRhZzogYm9vbGVhbiwgbm9kZTogTm9kZSkgPT4gKGJTdGFydFRhZyAmJiByb2xlID09PSBcImhlYWRpbmdcIiAmJiAobm9kZSBhcyBIVE1MRWxlbWVudCkuYXJpYUxldmVsID09PSBcIjRcIik7XG4gICAgICAgICAgICBjYXNlIFwiaDVcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gKHJvbGU6IHN0cmluZywgYlN0YXJ0VGFnOiBib29sZWFuLCBub2RlOiBOb2RlKSA9PiAoYlN0YXJ0VGFnICYmIHJvbGUgPT09IFwiaGVhZGluZ1wiICYmIChub2RlIGFzIEhUTUxFbGVtZW50KS5hcmlhTGV2ZWwgPT09IFwiNVwiKTtcbiAgICAgICAgICAgIGNhc2UgXCJoNlwiOlxuICAgICAgICAgICAgICAgIHJldHVybiAocm9sZTogc3RyaW5nLCBiU3RhcnRUYWc6IGJvb2xlYW4sIG5vZGU6IE5vZGUpID0+IChiU3RhcnRUYWcgJiYgcm9sZSA9PT0gXCJoZWFkaW5nXCIgJiYgKG5vZGUgYXMgSFRNTEVsZW1lbnQpLmFyaWFMZXZlbCA9PT0gXCI2XCIpO1xuICAgICAgICAgICAgY2FzZSBcImltYWdlXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIChyb2xlOiBzdHJpbmcsIGJTdGFydFRhZzogYm9vbGVhbikgPT4gKGJTdGFydFRhZyAmJiBbXCJpbWdcIiwgXCJncmFwaGljcy1kb2N1bWVudFwiXS5pbmNsdWRlcyhyb2xlKSk7XG4gICAgICAgICAgICBjYXNlIFwicmFkaW9cIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gKHJvbGU6IHN0cmluZywgYlN0YXJ0VGFnOiBib29sZWFuKSA9PiAoYlN0YXJ0VGFnICYmIHJvbGUgPT09IFwicmFkaW9cIik7XG4gICAgICAgICAgICBjYXNlIFwiYnV0dG9uXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIChyb2xlOiBzdHJpbmcsIGJTdGFydFRhZzogYm9vbGVhbikgPT4gKGJTdGFydFRhZyAmJiByb2xlID09PSBcImJ1dHRvblwiKTtcbiAgICAgICAgICAgIGNhc2UgXCJjaGVja2JveFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiAocm9sZTogc3RyaW5nLCBiU3RhcnRUYWc6IGJvb2xlYW4pID0+IChiU3RhcnRUYWcgJiYgcm9sZSA9PT0gXCJjaGVja2JveFwiKTtcbiAgICAgICAgICAgIGNhc2UgXCJjb21ib1wiOiAgICAgICBcbiAgICAgICAgICAgICAgICByZXR1cm4gKHJvbGU6IHN0cmluZywgYlN0YXJ0VGFnOiBib29sZWFuKSA9PiAoYlN0YXJ0VGFnICYmIHJvbGUgPT09IFwiY29tYm9ib3hcIik7XG4gICAgICAgICAgICBjYXNlIFwibGlzdFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiAocm9sZTogc3RyaW5nLCBiU3RhcnRUYWc6IGJvb2xlYW4pID0+IChiU3RhcnRUYWcgJiYgcm9sZSA9PT0gXCJsaXN0XCIpO1xuICAgICAgICAgICAgY2FzZSBcImxpc3RpdGVtXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIChyb2xlOiBzdHJpbmcsIGJTdGFydFRhZzogYm9vbGVhbikgPT4gKGJTdGFydFRhZyAmJiByb2xlID09PSBcImxpc3RpdGVtXCIpO1xuICAgICAgICAgICAgY2FzZSBcImFydGljbGVcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gKHJvbGU6IHN0cmluZywgYlN0YXJ0VGFnOiBib29sZWFuKSA9PiAoYlN0YXJ0VGFnICYmIHJvbGUgPT09IFwiYXJ0aWNsZVwiKTtcbiAgICAgICAgICAgIGNhc2UgXCJ0YWJsZVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiAocm9sZTogc3RyaW5nLCBiU3RhcnRUYWc6IGJvb2xlYW4pID0+IChiU3RhcnRUYWcgJiYgcm9sZSA9PT0gXCJ0YWJsZVwiKTtcbiAgICAgICAgICAgIGNhc2UgXCJwYXJhZ3JhcGhcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gKF9yb2xlOiBzdHJpbmcsIGJTdGFydFRhZzogYm9vbGVhbiwgbm9kZTogTm9kZSkgPT4gKGJTdGFydFRhZyAmJiAobm9kZSBhcyBIVE1MRWxlbWVudCkubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJQXCIpO1xuICAgICAgICAgICAgY2FzZSBcImRvbVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiAoKSA9PiB0cnVlO1xuICAgICAgICAgICAgY2FzZSBcIml0ZW1cIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gKF9yb2xlOiBzdHJpbmcsIGJTdGFydFRhZzogYm9vbGVhbiwgbm9kZTogTm9kZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWJTdGFydFRhZykgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNCbG9ja0VsZW1lbnQobm9kZSkpIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZW1wID0gbmV3IERPTVdhbGtlcihub2RlLCAhYlN0YXJ0VGFnKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXAucHJldk5vZGUoKSAmJiB0ZW1wLmJFbmRUYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpc0Jsb2NrRWxlbWVudCh0ZW1wLm5vZGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFwicmVnaW9uXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIChyb2xlOiBzdHJpbmcsIGJTdGFydFRhZzogYm9vbGVhbiwgbm9kZTogTm9kZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWJTdGFydFRhZykgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoW1wibWFpblwiLCBcIm5hdmlnYXRpb25cIiwgXCJmb3JtXCIsIFwiYmFubmVyXCIsIFwic2VhcmNoXCIsIFwiY29udGVudGluZm9cIl0uaW5jbHVkZXMocm9sZSkpIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBpZiAocm9sZSAhPT0gXCJyZWdpb25cIiB8fCBub2RlPy5ub2RlVHlwZSAhPT0gMSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gISFBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWUobm9kZSBhcyBIVE1MRWxlbWVudCk/Lm5hbWU/LnRyaW0oKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgY2FzZSBcImZvcm1jb250cm9sXCI6XG4gICAgICAgICAgICBjYXNlIFwiZWRpdGJveFwiOlxuICAgICAgICAgICAgY2FzZSBcImdyYXBoaWNcIjpcbiAgICAgICAgICAgIGNhc2UgXCJmcmFtZVwiOlxuICAgICAgICAgICAgY2FzZSBcImRpdmlzaW9uXCI6XG4gICAgICAgICAgICBjYXNlIFwidGFiY29udHJvbFwiOlxuICAgICAgICAgICAgY2FzZSBcInNlcGFyYXRvclwiOlxuICAgICAgICAgICAgY2FzZSBcImNsaWNrYWJsZVwiOlxuICAgICAgICAgICAgY2FzZSBcIm1vdXNlb3ZlclwiOlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5PVF9JTVBMRU1FTlRFRFwiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiBhbiBlbGVtZW50IGlzIHdpdGhpbiBhIFNoYWRvdyBET01cbiAgICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgZWxlbWVudCB0byBjaGVja1xuICAgICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIGVsZW1lbnQgaXMgaW4gYSBTaGFkb3cgRE9NLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgKi9cbiAgICBjb25zdCBpc0luU2hhZG93RE9NID0gKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IHJvb3QgPSBlbGVtZW50LmdldFJvb3ROb2RlKCk7XG4gICAgICAgIHJldHVybiByb290IGluc3RhbmNlb2YgU2hhZG93Um9vdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmUgc2tpcCBiZWhhdmlvciBmb3IgaXRlbSBuYXZpZ2F0aW9uIG1vZGVcbiAgICAgKiBIYW5kbGVzIGNvbXBsZXggdmlzaWJpbGl0eSBydWxlcyBpbmNsdWRpbmcgaGlkZGVuIGNvbnRlbnQgaW4gaGVhZGluZ3MvbGlua3NcbiAgICAgKiBAcGFyYW0gY3Vyc29yIFRoZSBjdXJzb3IgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb25cbiAgICAgKiBAcmV0dXJucyBPYmplY3QgaW5kaWNhdGluZyB3aGV0aGVyIHRvIHNraXAgY3VycmVudCBub2RlIGFuZC9vciBpdHMgY2hpbGRyZW4sIG9yIG51bGwgZm9yIGRlZmF1bHQgYmVoYXZpb3JcbiAgICAgKi9cbiAgICBjb25zdCBTS0lQX0lURU1fQkVIQVZJT1IgPSAoY3Vyc29yOiBTUkN1cnNvcikgOiB7IHNraXBDdXJyZW50OiBib29sZWFuLCBza2lwQ2hpbGRyZW46IGJvb2xlYW59IHwgbnVsbCA9PiB7XG4gICAgICAgIGNvbnN0IERFQlVHID0gZmFsc2U7XG4gICAgICAgIERFQlVHICYmIGNvbnNvbGUuZ3JvdXAoXCJTS0lQX0lURU1fQkVIQVZJT1JcIik7XG4gICAgICAgIGxldCByZXRWYWw6IHsgc2tpcEN1cnJlbnQ6IGJvb2xlYW4sIHNraXBDaGlsZHJlbjogYm9vbGVhbn0gfCBudWxsID0gbnVsbDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IG5vZGVUeXBlID0gY3Vyc29yLmdldE5vZGUoKS5ub2RlVHlwZTtcbiAgICAgICAgICAgIGxldCBlbGVtID0gY3Vyc29yLmdldEVsZW1lbnQoKTtcbiAgICAgICAgICAgIGNvbnN0IGN1cnNvclN0YXJ0ID0gY3Vyc29yLmNsb25lKCk7XG4gICAgICAgICAgICBjdXJzb3JTdGFydC5zZXRFbmRUYWcoZmFsc2UpO1xuXG4gICAgICAgICAgICBERUJVRyAmJiBjb25zb2xlLmxvZyhub2RlVHlwZSk7XG4gICAgICAgICAgICAvLyBTa2lwIENEQVRBIGFuZCBjb21tZW50cyBjb21wbGV0ZWx5XG4gICAgICAgICAgICBpZiAoWzQsIDhdLmluY2x1ZGVzKG5vZGVUeXBlKSkgcmV0dXJuIHJldFZhbCA9IHsgc2tpcEN1cnJlbnQ6IHRydWUsIHNraXBDaGlsZHJlbjogdHJ1ZSB9O1xuICAgICAgICAgICAgLy8gT25seSBwcm9jZXNzIGVsZW1lbnRzIGFuZCB0ZXh0XG4gICAgICAgICAgICBpZiAoIVsxLDNdLmluY2x1ZGVzKG5vZGVUeXBlKSkgcmV0dXJuIHJldFZhbCA9IHsgc2tpcEN1cnJlbnQ6IHRydWUsIHNraXBDaGlsZHJlbjogZmFsc2UgfTtcblxuICAgICAgICAgICAgLy8gRm9yIHRleHQgZWxlbWVudHMsIENvbnNpZGVyIHdpdGggcmVsYXRpb24gdG8gdGhlaXIgcGFyZW50IGVsZW1lbnRcbiAgICAgICAgICAgIGlmIChub2RlVHlwZSA9PT0gMykge1xuICAgICAgICAgICAgICAgIGVsZW0gPSBjdXJzb3IuZ2V0Tm9kZSgpLnBhcmVudEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgaWYgKCFlbGVtKSByZXR1cm4gcmV0VmFsID0gVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQoZWxlbSkgPyB7IHNraXBDdXJyZW50OiB0cnVlLCBza2lwQ2hpbGRyZW46IGZhbHNlIH0gOiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gaWYgKCFlbGVtKSBjb25zb2xlLmxvZyhjdXJzb3IuZ2V0Tm9kZSgpKTtcblxuICAgICAgICAgICAgLy8gV2UgaGF2ZSBhbiBlbGVtZW50XG5cbiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSdyZSB3aXRoaW4gdGhlIGJvZHkgZWxlbWVudFxuICAgICAgICAgICAgaWYgKCFlbGVtLmNsb3Nlc3QoXCJib2R5XCIpICYmICFpc0luU2hhZG93RE9NKGVsZW0pKSByZXR1cm4gcmV0VmFsID0geyBza2lwQ3VycmVudDogdHJ1ZSwgc2tpcENoaWxkcmVuOiBmYWxzZSB9O1xuXG4gICAgICAgICAgICAvLyBNYWtlIHN1cmUgd2UncmUgbm90IGluIGEgc2NyaXB0IG9yIHN0eWxlXG4gICAgICAgICAgICBpZiAoZWxlbS5jbG9zZXN0KFwic2NyaXB0LHN0eWxlXCIpKSByZXR1cm4gcmV0VmFsID0geyBza2lwQ3VycmVudDogdHJ1ZSwgc2tpcENoaWxkcmVuOiB0cnVlIH07XG5cbiAgICAgICAgICAgIC8vIEZvciB0ZXh0IG5vZGVzLCB3ZSBuZWVkIHRvIGNoZWNrIHZpc2liaWxpdHkgaW4gY29udGV4dCBvZiBwYXJlbnQgaGVhZGluZy9saW5rXG4gICAgICAgICAgICAvLyBTbyB3ZSdsbCBoYW5kbGUgdGV4dCBub2RlIHZpc2liaWxpdHkgY2hlY2tzIGJlbG93IHdpdGggdGhlIGVsZW1lbnQgdmlzaWJpbGl0eSBjaGVja3NcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gU2tpcCB0aGluZ3MgaGlkZGVuIGZyb20gdGhlIEFULCBVTkxFU1Mgd2UncmUgaW5zaWRlIGEgaGVhZGluZyBvciBsaW5rXG4gICAgICAgICAgICAvLyAoaGVhZGluZ3MgYW5kIGxpbmtzIHNob3VsZCBpbmNsdWRlIHRoZWlyIGZ1bGwgYWNjZXNzaWJsZSBuYW1lLCBpbmNsdWRpbmcgaGlkZGVuIHBhcnRzKVxuICAgICAgICAgICAgLy8gQlVUIG9ubHkgaWYgdGhlIGhlYWRpbmcvbGluayB1c2VzIG5hbWVGcm9tPVwiY29udGVudFwiIChub3QgYXJpYS1sYWJlbC9hcmlhLWxhYmVsbGVkYnkpXG4gICAgICAgICAgICBjb25zdCBwYXJlbnRIZWFkaW5nT3JMaW5rID0gY3Vyc29yU3RhcnQuZ2V0Q3VycmVudE9yUGFyZW50QnlSb2xlQ2xvbmUoW1wiaGVhZGluZ1wiLCBcImxpbmtcIl0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBTcGVjaWFsIGNhc2U6IGlmIGN1cnJlbnQgZWxlbWVudCBpdHNlbGYgaXMgYSBoZWFkaW5nIG9yIGxpbmsgQU5EIHdlJ3JlIE5PVCBpbnNpZGUgYW5vdGhlciBoZWFkaW5nL2xpbmssXG4gICAgICAgICAgICAvLyBhcHBseSBub3JtYWwgc2tpcCBydWxlc1xuICAgICAgICAgICAgY29uc3QgY3VycmVudFJvbGUgPSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUoZWxlbSk7XG4gICAgICAgICAgICBjb25zdCBpc0N1cnJlbnRIZWFkaW5nT3JMaW5rID0gY3VycmVudFJvbGUgPT09IFwiaGVhZGluZ1wiIHx8IGN1cnJlbnRSb2xlID09PSBcImxpbmtcIjtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKCFwYXJlbnRIZWFkaW5nT3JMaW5rKSB7XG4gICAgICAgICAgICAgICAgLy8gTm90IGluc2lkZSBhbnkgaGVhZGluZy9saW5rIC0gYXBwbHkgbm9ybWFsIHNraXAgcnVsZXNcbiAgICAgICAgICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQoZWxlbSkpIHJldHVybiByZXRWYWwgPSB7IHNraXBDdXJyZW50OiB0cnVlLCBza2lwQ2hpbGRyZW46IG5vZGVUeXBlID09PSAxIH07XG4gICAgICAgICAgICAgICAgaWYgKCFWaXNVdGlsLmlzTm9kZVZpc2libGUoZWxlbSkpIHJldHVybiByZXRWYWwgPSB7IHNraXBDdXJyZW50OiB0cnVlLCBza2lwQ2hpbGRyZW46IG5vZGVUeXBlID09PSAxIH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBwYXJlbnQgaGVhZGluZy9saW5rIHVzZXMgYXJpYS1sYWJlbCBvciBhcmlhLWxhYmVsbGVkYnlcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRFbGVtID0gcGFyZW50SGVhZGluZ09yTGluay5nZXRFbGVtZW50KCk7XG4gICAgICAgICAgICAgICAgY29uc3QgbmFtZUluZm8gPSBwYXJlbnRIZWFkaW5nT3JMaW5rLmdldE5hbWVJbmZvKCk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gSWYgbmFtZUZyb20gaXMgTk9UIFwiY29udGVudFwiIG9yIFwidGV4dFwiLCBza2lwIGFsbCBjb250ZW50IChpdCdzIHVzaW5nIGFyaWEtbGFiZWwvYXJpYS1sYWJlbGxlZGJ5KVxuICAgICAgICAgICAgICAgIGlmIChuYW1lSW5mbyAmJiAhW1wiY29udGVudFwiLCBcInRleHRcIl0uaW5jbHVkZXMobmFtZUluZm8ubmFtZUZyb20pKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFBhcmVudCB1c2VzIGFyaWEtbGFiZWwvYXJpYS1sYWJlbGxlZGJ5IC0gc2tpcCBhbGwgY29udGVudCBpbmNsdWRpbmcgbmVzdGVkIGhlYWRpbmdzL2xpbmtzXG4gICAgICAgICAgICAgICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChlbGVtKSkgcmV0dXJuIHJldFZhbCA9IHsgc2tpcEN1cnJlbnQ6IHRydWUsIHNraXBDaGlsZHJlbjogdHJ1ZSB9O1xuICAgICAgICAgICAgICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShlbGVtKSkgcmV0dXJuIHJldFZhbCA9IHsgc2tpcEN1cnJlbnQ6IHRydWUsIHNraXBDaGlsZHJlbjogdHJ1ZSB9O1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNDdXJyZW50SGVhZGluZ09yTGluaykge1xuICAgICAgICAgICAgICAgICAgICAvLyBDdXJyZW50IGVsZW1lbnQgaXMgYSBoZWFkaW5nL2xpbmsgaW5zaWRlIGFub3RoZXIgaGVhZGluZy9saW5rIHdpdGggY29udGVudC1iYXNlZCBuYW1lXG4gICAgICAgICAgICAgICAgICAgIC8vIERvbid0IHNraXAgaXQgLSBsZXQgaXQgdGhyb3VnaCBzbyBpdHMgY29udGVudCBjYW4gYmUgcmVhZFxuICAgICAgICAgICAgICAgICAgICAvLyAoVGhlIGxvZ2ljIGF0IGxpbmUgMTgzIHdpbGwgaGFuZGxlIHdoZXRoZXIgdG8gc2tpcCBpdHMgY2hpbGRyZW4pXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbmFtZUZyb20gaXMgXCJjb250ZW50XCIsIHNvIGluY2x1ZGUgaGlkZGVuIGNvbnRlbnQgYnV0IHNraXAgaGlkZGVuIGltYWdlcy9ncmFwaGljc1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKGVsZW0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoKHJvbGUgPT09IFwiaW1nXCIgfHwgcm9sZSA9PT0gXCJncmFwaGljcy1kb2N1bWVudFwiKSAmJiBWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChlbGVtKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbCA9IHsgc2tpcEN1cnJlbnQ6IHRydWUsIHNraXBDaGlsZHJlbjogdHJ1ZSB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIERvbid0IHNraXAgb3RoZXIgaGlkZGVuIGNvbnRlbnQgLSBpdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIGFjY2Vzc2libGUgbmFtZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiQk9EWVwiKSByZXR1cm4gcmV0VmFsID0geyBza2lwQ3VycmVudDogZmFsc2UsIHNraXBDaGlsZHJlbjogZmFsc2UgfTtcblxuICAgICAgICAgICAgLy8gU2tpcCBsYWJlbHMgdGhhdCBhcmUgYXNzb2NpYXRlZCB3aXRoIGNvbnRyb2xzIC0gdGhleSdsbCBiZSByZWFkIHdpdGggdGhlIHJlbGF0ZWQgaW5wdXQuXG4gICAgICAgICAgICAvLyBLZWVwIGNoaWxkcmVuIHNvIGludGVyYWN0aXZlIGNvbnRlbnQgKGUuZy4gbGlua3MpIGluc2lkZSB0aGUgbGFiZWwgc3RpbGwgYXBwZWFycyBpblxuICAgICAgICAgICAgLy8gcmVhZGluZy90YWIgb3JkZXIuXG4gICAgICAgICAgICBpZiAoZWxlbS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIkxBQkVMXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGVsZW0uaGFzQXR0cmlidXRlKFwiZm9yXCIpXG4gICAgICAgICAgICAgICAgICAgICYmIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW0uZ2V0QXR0cmlidXRlKFwiZm9yXCIpKVxuICAgICAgICAgICAgICAgICAgICAmJiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbGVtLmdldEF0dHJpYnV0ZShcImZvclwiKSkuZ2V0QXR0cmlidXRlKFwidHlwZVwiKSAhPT0gXCJoaWRkZW5cIlxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0VmFsID0geyBza2lwQ3VycmVudDogdHJ1ZSwgc2tpcENoaWxkcmVuOiBmYWxzZSB9O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5lc3RlZENvbnRyb2wgPSBlbGVtLnF1ZXJ5U2VsZWN0b3IoXCJpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYSwgYnV0dG9uLCBbcm9sZT0nY2hlY2tib3gnXSwgW3JvbGU9J2NvbWJvYm94J10sIFtyb2xlPSdsaXN0Ym94J10sIFtyb2xlPSdtZW51aXRlbWNoZWNrYm94J10sIFtyb2xlPSdtZW51aXRlbXJhZGlvJ10sIFtyb2xlPSdyYWRpbyddLCBbcm9sZT0nc2VhcmNoYm94J10sIFtyb2xlPSdzbGlkZXInXSwgW3JvbGU9J3NwaW5idXR0b24nXSwgW3JvbGU9J3N3aXRjaCddLCBbcm9sZT0ndGV4dGJveCddXCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobmVzdGVkQ29udHJvbCAmJiAobmVzdGVkQ29udHJvbCBhcyBIVE1MRWxlbWVudCkuZ2V0QXR0cmlidXRlKFwidHlwZVwiKSAhPT0gXCJoaWRkZW5cIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbCA9IHsgc2tpcEN1cnJlbnQ6IHRydWUsIHNraXBDaGlsZHJlbjogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU2tpcCBub24taW50ZXJhY3RpdmUgY29udGVudCB0aGF0IGlzIGEgZGVzY2VuZGFudCBvZiBhIGZvci1saW5rZWQgbGFiZWwuXG4gICAgICAgICAgICAvLyBTdWNoIGNvbnRlbnQgaXMgYWxyZWFkeSBzdXJmYWNlZCBhcyBwYXJ0IG9mIHRoZSBhc3NvY2lhdGVkIGNvbnRyb2wncyBhbm5vdW5jZW1lbnQuXG4gICAgICAgICAgICAvLyBJbnRlcmFjdGl2ZSBkZXNjZW5kYW50cyAobGlua3MsIGJ1dHRvbnMsIGV0Yy4pIGFyZSBhbGxvd2VkIHRocm91Z2guXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGFiZWxGb3IgPSBlbGVtLmNsb3Nlc3QoXCJsYWJlbFtmb3JdXCIpIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICAgICAgICAgICAgICBjb25zdCBsYWJlbEZvclRhcmdldCA9IGxhYmVsRm9yICYmIGxhYmVsRm9yLmdldEF0dHJpYnV0ZShcImZvclwiKTtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsRm9yXG4gICAgICAgICAgICAgICAgICAgICYmIGxhYmVsRm9yVGFyZ2V0XG4gICAgICAgICAgICAgICAgICAgICYmIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGxhYmVsRm9yVGFyZ2V0KVxuICAgICAgICAgICAgICAgICAgICAmJiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChsYWJlbEZvclRhcmdldCkuZ2V0QXR0cmlidXRlKFwidHlwZVwiKSAhPT0gXCJoaWRkZW5cIlxuICAgICAgICAgICAgICAgICAgICAmJiAhZWxlbS5jbG9zZXN0KFwiYVtocmVmXSwgW3JvbGU9J2xpbmsnXSwgYnV0dG9uLCBbcm9sZT0nYnV0dG9uJ11cIilcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbCA9IHsgc2tpcEN1cnJlbnQ6IHRydWUsIHNraXBDaGlsZHJlbjogbm9kZVR5cGUgPT09IDEgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHJvbGUgPSBjdXJzb3JTdGFydC5nZXRSb2xlKCk7XG5cbiAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgcHJlc2VudGF0aW9uYWwgY2hpbGRyZW4sIHJlYWQgdGhlIGVsZW1lbnQsIHNraXAgdGhlIGNoaWxkcmVuXG4gICAgICAgICAgICBpZiAoQXJpYVV0aWwuY29udGFpbnNQcmVzZW50YXRpb25hbENoaWxkcmVuT25seShlbGVtKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXRWYWwgPSB7IHNraXBDdXJyZW50OiBmYWxzZSwgc2tpcENoaWxkcmVuOiB0cnVlIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBTa2lwIGNoaWxkcmVuIG9mIGhlYWRpbmdzL2xpbmtzIHRoYXQgZG9uJ3QgdXNlIGNvbnRlbnQtYmFzZWQgbmFtZXNcbiAgICAgICAgICAgIC8vIFVOTEVTUyB3ZSdyZSBpbnNpZGUgYW5vdGhlciBoZWFkaW5nL2xpbmsgdGhhdCBET0VTIHVzZSBjb250ZW50LWJhc2VkIG5hbWVzXG4gICAgICAgICAgICBpZiAoW1wibGlua1wiLCBcImhlYWRpbmdcIl0uaW5jbHVkZXMocm9sZSkgJiYgKCFjdXJzb3JTdGFydC5nZXROYW1lKCkgfHwgKCFbXCJjb250ZW50XCIsIFwidGV4dFwiXS5pbmNsdWRlcyhjdXJzb3JTdGFydC5nZXROYW1lSW5mbygpLm5hbWVGcm9tKSkpKSB7XG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgd2UncmUgaW5zaWRlIGEgcGFyZW50IGhlYWRpbmcvbGluayB3aXRoIGNvbnRlbnQtYmFzZWQgbmFtZVxuICAgICAgICAgICAgICAgIGlmIChwYXJlbnRIZWFkaW5nT3JMaW5rICYmIHBhcmVudEhlYWRpbmdPckxpbmsuZ2V0TmFtZUluZm8oKSAmJiBbXCJjb250ZW50XCIsIFwidGV4dFwiXS5pbmNsdWRlcyhwYXJlbnRIZWFkaW5nT3JMaW5rLmdldE5hbWVJbmZvKCkubmFtZUZyb20pKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIERvbid0IHNraXAgY2hpbGRyZW4gLSB3ZSdyZSBuZXN0ZWQgaW5zaWRlIGEgY29udGVudC1iYXNlZCBoZWFkaW5nL2xpbmtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0VmFsID0geyBza2lwQ3VycmVudDogZmFsc2UsIHNraXBDaGlsZHJlbjogdHJ1ZSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGVsZW0ubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJMRUdFTkRcIikge1xuICAgICAgICAgICAgICAgIGxldCBwYXJlbnQgPSBET01XYWxrZXIucGFyZW50RWxlbWVudChjdXJzb3IuZ2V0Tm9kZSgpKTtcbiAgICAgICAgICAgICAgICB3aGlsZSAocGFyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnQubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gJ0ZJRUxEU0VUJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGVnZW5kIGlzIHdpdGhpbiBhIGZpZWxkc2V0LCBzdXBwcmVzcyBvdXRwdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXRWYWwgPSB7IHNraXBDdXJyZW50OiBmYWxzZSwgc2tpcENoaWxkcmVuOiB0cnVlIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQocGFyZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZWxlbSAmJiBlbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiTVNVUFwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbCA9IHsgc2tpcEN1cnJlbnQ6IGZhbHNlLCBza2lwQ2hpbGRyZW46IHRydWUgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlbGVtLmNsb3Nlc3QoXCIuaWJtYS1zci1vdmVybGF5XCIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbCA9IHsgc2tpcEN1cnJlbnQ6IHRydWUsIHNraXBDaGlsZHJlbjogdHJ1ZSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJldFZhbCA9IG51bGw7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBERUJVRyAmJiBjb25zb2xlLmxvZyhcIlNLSVBfSVRFTSByZXRWYWw6XCIsIHJldFZhbCk7XG4gICAgICAgICAgICBERUJVRyAmJiBjb25zb2xlLmdyb3VwRW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmUgc2tpcCBiZWhhdmlvciBmb3IgbmVzdGVkIG5hdmlnYXRpb24gbW9kZXMgKGxpbmssIGhlYWRpbmcsIGltYWdlLCBldGMuKVxuICAgICAqIFNpbXBsZXIgdGhhbiBTS0lQX0lURU1fQkVIQVZJT1IgYXMgaXQgZG9lc24ndCBuZWVkIGNvbXBsZXggaGVhZGluZy9saW5rIGNvbnRlbnQgcnVsZXNcbiAgICAgKiBAcGFyYW0gY3Vyc29yIFRoZSBjdXJzb3IgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb25cbiAgICAgKiBAcmV0dXJucyBPYmplY3QgaW5kaWNhdGluZyB3aGV0aGVyIHRvIHNraXAgY3VycmVudCBub2RlIGFuZC9vciBpdHMgY2hpbGRyZW4sIG9yIG51bGwgZm9yIGRlZmF1bHQgYmVoYXZpb3JcbiAgICAgKi9cbiAgICBjb25zdCBTS0lQX05FU1RFRF9CRUhBVklPUiA9IChjdXJzb3I6IFNSQ3Vyc29yKSA6IHsgc2tpcEN1cnJlbnQ6IGJvb2xlYW4sIHNraXBDaGlsZHJlbjogYm9vbGVhbn0gfCBudWxsID0+IHtcbiAgICAgICAgY29uc3Qgbm9kZVR5cGUgPSBjdXJzb3IuZ2V0Tm9kZSgpLm5vZGVUeXBlO1xuICAgICAgICBjb25zdCBlbGVtID0gY3Vyc29yLmdldEVsZW1lbnQoKTtcbiAgICAgICAgLy8gT25seSB2aXNpdCBlbGVtZW50cyBhbmQgdGV4dCBub2Rlc1xuICAgICAgICBpZiAobm9kZVR5cGUgIT09IDEgJiYgbm9kZVR5cGUgIT09IDMpIHJldHVybiB7IHNraXBDdXJyZW50OiB0cnVlLCBza2lwQ2hpbGRyZW46IGZhbHNlIH07XG4gICAgICAgIGlmIChub2RlVHlwZSA9PT0gMykgcmV0dXJuIFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKGVsZW0pID8geyBza2lwQ3VycmVudDogdHJ1ZSwgc2tpcENoaWxkcmVuOiBmYWxzZSB9IDogbnVsbDtcbiAgICAgICAgLy8gV2UgaGF2ZSBhbiBlbGVtZW5ldFxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQoZWxlbSkpIHJldHVybiB7IHNraXBDdXJyZW50OiB0cnVlLCBza2lwQ2hpbGRyZW46IHRydWUgfTtcbiAgICAgICAgLy8gU2tpcCBsYWJlbCBmb3JzIC0gdGhleSdsbCBiZSByZWFkIHdpdGggdGhlIHJlbGF0ZWQgaW5wdXQuXG4gICAgICAgIC8vIEtlZXAgY2hpbGRyZW4gc28gaW50ZXJhY3RpdmUgY29udGVudCAoZS5nLiBsaW5rcykgaW5zaWRlIHRoZSBsYWJlbCBzdGlsbCBhcHBlYXJzIGluXG4gICAgICAgIC8vIHJlYWRpbmcvdGFiIG9yZGVyLlxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBlbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiTEFCRUxcIlxuICAgICAgICAgICAgJiYgZWxlbS5oYXNBdHRyaWJ1dGUoXCJmb3JcIilcbiAgICAgICAgICAgICYmIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW0uZ2V0QXR0cmlidXRlKFwiZm9yXCIpKVxuICAgICAgICAgICAgJiYgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxlbS5nZXRBdHRyaWJ1dGUoXCJmb3JcIikpLmdldEF0dHJpYnV0ZShcInR5cGVcIikgIT09IFwiaGlkZGVuXCJcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4geyBza2lwQ3VycmVudDogdHJ1ZSwgc2tpcENoaWxkcmVuOiBmYWxzZSB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2tpcCBub24taW50ZXJhY3RpdmUgY29udGVudCB0aGF0IGlzIGEgZGVzY2VuZGFudCBvZiBhIGZvci1saW5rZWQgbGFiZWwuXG4gICAgICAgIC8vIFN1Y2ggY29udGVudCBpcyBhbHJlYWR5IHN1cmZhY2VkIGFzIHBhcnQgb2YgdGhlIGFzc29jaWF0ZWQgY29udHJvbCdzIGFubm91bmNlbWVudC5cbiAgICAgICAgLy8gSW50ZXJhY3RpdmUgZGVzY2VuZGFudHMgKGxpbmtzLCBidXR0b25zLCBldGMuKSBhcmUgYWxsb3dlZCB0aHJvdWdoLlxuICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBsYWJlbEZvciA9IGVsZW0uY2xvc2VzdChcImxhYmVsW2Zvcl1cIikgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgICAgICAgICAgY29uc3QgbGFiZWxGb3JUYXJnZXQgPSBsYWJlbEZvciAmJiBsYWJlbEZvci5nZXRBdHRyaWJ1dGUoXCJmb3JcIik7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgbGFiZWxGb3JcbiAgICAgICAgICAgICAgICAmJiBsYWJlbEZvclRhcmdldFxuICAgICAgICAgICAgICAgICYmIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGxhYmVsRm9yVGFyZ2V0KVxuICAgICAgICAgICAgICAgICYmIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGxhYmVsRm9yVGFyZ2V0KS5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpICE9PSBcImhpZGRlblwiXG4gICAgICAgICAgICAgICAgJiYgIWVsZW0uY2xvc2VzdChcImFbaHJlZl0sIFtyb2xlPSdsaW5rJ10sIGJ1dHRvbiwgW3JvbGU9J2J1dHRvbiddXCIpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBza2lwQ3VycmVudDogdHJ1ZSwgc2tpcENoaWxkcmVuOiBub2RlVHlwZSA9PT0gMSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgcm9sZSA9IGN1cnNvci5nZXRSb2xlKCk7XG5cbiAgICAgICAgLy8gSWYgd2UgaGF2ZSBwcmVzZW50YXRpb25hbCBjaGlsZHJlbiwgcmVhZCB0aGUgZWxlbWVudCwgc2tpcCB0aGUgY2hpbGRyZW5cbiAgICAgICAgaWYgKEFyaWFVdGlsLmNvbnRhaW5zUHJlc2VudGF0aW9uYWxDaGlsZHJlbk9ubHkoZWxlbSkpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHNraXBDdXJyZW50OiBmYWxzZSwgc2tpcENoaWxkcmVuOiB0cnVlIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsZW0gJiYgZWxlbS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIk1TVVBcIikge1xuICAgICAgICAgICAgcmV0dXJuIHsgc2tpcEN1cnJlbnQ6IHRydWUsIHNraXBDaGlsZHJlbjogdHJ1ZSB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbGVtLmNsb3Nlc3QoXCIuaWJtYS1zci1vdmVybGF5XCIpKSB7XG4gICAgICAgICAgICByZXR1cm4geyBza2lwQ3VycmVudDogdHJ1ZSwgc2tpcENoaWxkcmVuOiB0cnVlIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBza2lwIGZ1bmN0aW9uIGZvciBhIGdpdmVuIG5hdmlnYXRpb24gbW9kZVxuICAgICAqIEBwYXJhbSBtb2RlIFRoZSBuYXZpZ2F0aW9uIG1vZGVcbiAgICAgKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBub2RlcyB0byBza2lwIGR1cmluZyBuYXZpZ2F0aW9uXG4gICAgICovXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGdldFNraXBGdW5jKG1vZGU6IE5hdmlnYXRpb25Nb2RlKSA6IFNSQ3Vyc29yU2tpcEZ1bmMge1xuICAgICAgICBzd2l0Y2ggKG1vZGUpIHtcbiAgICAgICAgICAgIGNhc2UgXCJyZWdpb25cIjpcbiAgICAgICAgICAgIGNhc2UgXCJpdGVtXCI6IFxuICAgICAgICAgICAgICAgIHJldHVybiBTS0lQX0lURU1fQkVIQVZJT1I7XG4gICAgICAgICAgICBjYXNlIFwibGlua1wiOiBcbiAgICAgICAgICAgIGNhc2UgXCJ0YWJfZm9jdXNcIjogXG4gICAgICAgICAgICBjYXNlIFwiaGVhZGluZ1wiOlxuICAgICAgICAgICAgY2FzZSBcImgxXCI6XG4gICAgICAgICAgICBjYXNlIFwiaDJcIjpcbiAgICAgICAgICAgIGNhc2UgXCJoM1wiOlxuICAgICAgICAgICAgY2FzZSBcImg0XCI6XG4gICAgICAgICAgICBjYXNlIFwiaDVcIjpcbiAgICAgICAgICAgIGNhc2UgXCJoNlwiOlxuICAgICAgICAgICAgY2FzZSBcImltYWdlXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFNLSVBfTkVTVEVEX0JFSEFWSU9SO1xuICAgICAgICAgICAgY2FzZSBcInJhZGlvXCI6XG4gICAgICAgICAgICBjYXNlIFwiYnV0dG9uXCI6XG4gICAgICAgICAgICBjYXNlIFwiY2hlY2tib3hcIjpcbiAgICAgICAgICAgIGNhc2UgXCJjb21ib1wiOiAgICAgICBcbiAgICAgICAgICAgIGNhc2UgXCJsaXN0XCI6XG4gICAgICAgICAgICBjYXNlIFwibGlzdGl0ZW1cIjpcbiAgICAgICAgICAgIGNhc2UgXCJhcnRpY2xlXCI6XG4gICAgICAgICAgICBjYXNlIFwidGFibGVcIjpcbiAgICAgICAgICAgIGNhc2UgXCJwYXJhZ3JhcGhcIjpcbiAgICAgICAgICAgIGNhc2UgXCJkb21cIjpcbiAgICAgICAgICAgIGNhc2UgXCJmb3JtY29udHJvbFwiOlxuICAgICAgICAgICAgY2FzZSBcImVkaXRib3hcIjpcbiAgICAgICAgICAgIGNhc2UgXCJncmFwaGljXCI6XG4gICAgICAgICAgICBjYXNlIFwiZnJhbWVcIjpcbiAgICAgICAgICAgIGNhc2UgXCJkaXZpc2lvblwiOlxuICAgICAgICAgICAgY2FzZSBcInRhYmNvbnRyb2xcIjpcbiAgICAgICAgICAgIGNhc2UgXCJzZXBhcmF0b3JcIjpcbiAgICAgICAgICAgIGNhc2UgXCJjbGlja2FibGVcIjpcbiAgICAgICAgICAgIGNhc2UgXCJtb3VzZW92ZXJcIjpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOT1RfSU1QTEVNRU5URURcIik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBcbiAgICAvKipcbiAgICAgKiBKdW1wIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uIG9yIHRoZSBwcmV2aW91cyBtYXRjaGluZyBlbGVtZW50IGlmIGN1cnJlbnQgZG9lc24ndCBtYXRjaFxuICAgICAqIEBwYXJhbSBtb2RlIFRoZSBuYXZpZ2F0aW9uIG1vZGVcbiAgICAgKiBAcGFyYW0gd2Fsa2VyIFRoZSBjdXJzb3IgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb25cbiAgICAgKiBAcmV0dXJucyBBIGN1cnNvciBhdCB0aGUgY3VycmVudCBvciBwcmV2aW91cyBtYXRjaGluZyBwb3NpdGlvblxuICAgICAqL1xuICAgIGV4cG9ydCBmdW5jdGlvbiBqdW1wQ3VycmVudChtb2RlOiBOYXZpZ2F0aW9uTW9kZSwgd2Fsa2VyOiBTUkN1cnNvcikgOiBTUkN1cnNvciB7XG4gICAgICAgIGNvbnN0IG1hdGNoRnVuYyA9IG1vZGUgPT09IFwidGFiX2ZvY3VzXCIgPyBnZXRUYWJGb2N1c1N0YXJ0RnVuYyh0cnVlKSA6IGdldFN0YXJ0RnVuYyhtb2RlKTtcbiAgICAgICAgaWYgKG1hdGNoRnVuYyh3YWxrZXIuZ2V0Um9sZSgpLCAhd2Fsa2VyLmlzRW5kVGFnKCksIHdhbGtlci5nZXROb2RlKCkpKSB7XG4gICAgICAgICAgICByZXR1cm4gd2Fsa2VyLmNsb25lKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4ganVtcFByZXZpb3VzKG1vZGUsIHdhbGtlcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogSnVtcCB0byB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IGVsZW1lbnQgYW5kIHJldHVybiBhbGwgaW50ZXJtZWRpYXRlIGl0ZW0gcG9zaXRpb25zXG4gICAgICogQHBhcmFtIG1vZGUgVGhlIG5hdmlnYXRpb24gbW9kZVxuICAgICAqIEBwYXJhbSB3YWxrZXIgVGhlIGN1cnNvciBhdCB0aGUgY3VycmVudCBwb3NpdGlvblxuICAgICAqIEByZXR1cm5zIEFycmF5IG9mIGN1cnNvcnMgcmVwcmVzZW50aW5nIHBvc2l0aW9ucyBmcm9tIGN1cnJlbnQgdG8gZW5kXG4gICAgICovXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGp1bXBDdXJyZW50RW5kKG1vZGU6IE5hdmlnYXRpb25Nb2RlLCB3YWxrZXI6IFNSQ3Vyc29yKSA6IFNSQ3Vyc29yW10ge1xuICAgICAgICBpZiAobW9kZSA9PT0gXCJpdGVtXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1FbmQgPSBqdW1wTmV4dChtb2RlLCB3YWxrZXIpO1xuICAgICAgICAgICAgcmV0dXJuIGl0ZW1FbmQgPyBbaXRlbUVuZF0gOiBbXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IG5hbWVJbmZvID0gd2Fsa2VyLmdldE5hbWVJbmZvKCk7XG4gICAgICAgICAgICBsZXQgcmV0VmFsID0gd2Fsa2VyLmNsb25lKCk7XG4gICAgICAgICAgICBpZiAobmFtZUluZm8gJiYgIVtcImNvbnRlbnRcIiwgXCJ0ZXh0XCJdLmluY2x1ZGVzKG5hbWVJbmZvLm5hbWVGcm9tKSkge1xuICAgICAgICAgICAgICAgIC8vIE5hbWUgaXMganVzdCBmcm9tIHRoZSBpdGVtIGl0c2VsZlxuICAgICAgICAgICAgICAgIHJldFZhbC5uZXh0KCgpID0+IHRydWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBOYW1lIGlzIGZyb20gdGhlIGNvbnRlbnRcbiAgICAgICAgICAgICAgICByZXRWYWwuc2V0RW5kVGFnKHRydWUpO1xuICAgICAgICAgICAgICAgIHJldFZhbC5uZXh0KCgpID0+IHRydWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBlbmRDdXJzb3JzOiBTUkN1cnNvcltdID0gW107XG4gICAgICAgICAgICBsZXQgaXRlbUVuZCA9IGp1bXBOZXh0KFwiaXRlbVwiLCB3YWxrZXIpO1xuICAgICAgICAgICAgd2hpbGUgKGl0ZW1FbmQgJiYgU1JDdXJzb3IuY29tcGFyZShpdGVtRW5kLCByZXRWYWwpIDwgMCkge1xuICAgICAgICAgICAgICAgIGVuZEN1cnNvcnMucHVzaChpdGVtRW5kKTtcbiAgICAgICAgICAgICAgICBpdGVtRW5kID0ganVtcE5leHQoXCJpdGVtXCIsIGl0ZW1FbmQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZW5kQ3Vyc29ycy5wdXNoKHJldFZhbCk7XG4gICAgICAgICAgICByZXR1cm4gbW9kZSA9PT0gXCJ0YWJfZm9jdXNcIiAmJiB3YWxrZXIuZ2V0Um9sZSgpID09PSBcImxpbmtcIiA/IFtlbmRDdXJzb3JzW2VuZEN1cnNvcnMubGVuZ3RoIC0gMV1dIDogZW5kQ3Vyc29ycztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEp1bXAgdG8gdGhlIG5leHQgbWF0Y2hpbmcgZWxlbWVudCBpbiB0aGUgZ2l2ZW4gbmF2aWdhdGlvbiBtb2RlXG4gICAgICogQHBhcmFtIG1vZGUgVGhlIG5hdmlnYXRpb24gbW9kZVxuICAgICAqIEBwYXJhbSB3YWxrZXIgVGhlIGN1cnNvciBhdCB0aGUgY3VycmVudCBwb3NpdGlvblxuICAgICAqIEByZXR1cm5zIEEgY3Vyc29yIGF0IHRoZSBuZXh0IG1hdGNoaW5nIHBvc2l0aW9uLCBvciBudWxsIGlmIG5vbmUgZm91bmRcbiAgICAgKi9cbiAgICBleHBvcnQgZnVuY3Rpb24ganVtcE5leHQobW9kZTogTmF2aWdhdGlvbk1vZGUsIHdhbGtlcjogU1JDdXJzb3IpIDogU1JDdXJzb3Ige1xuICAgICAgICBjb25zdCBERUJVRyA9IGZhbHNlO1xuICAgICAgICBERUJVRyAmJiBjb25zb2xlLmdyb3VwKFwiU1JOYXZpZ2F0b3I6Omp1bXBOZXh0XCIsIHdhbGtlci5pc0VuZFRhZygpP1wiL1wiOlwiXCIsIHdhbGtlci5nZXROb2RlKCkpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKG1vZGUgPT09IFwidGFiX2ZvY3VzXCIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0YWJGb2N1c01hdGNoRnVuYyA9IGdldFRhYkZvY3VzU3RhcnRGdW5jKHRydWUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhYkZvY3VzQ3Vyc29ycyA9IGNvbGxlY3RUYWJGb2N1c0N1cnNvcnModGFiRm9jdXNNYXRjaEZ1bmMsIHdhbGtlci5nZXROb2RlKCkpO1xuICAgICAgICAgICAgICAgIGlmICh0YWJGb2N1c0N1cnNvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyh0YWJGb2N1c0N1cnNvcnMubWFwKGMgPT4gYy5nZXROb2RlKCkpKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFRhYkZvY3VzUGFyZW50Q3Vyc29yID0gd2Fsa2VyLmdldEN1cnJlbnRPclBhcmVudFRhYmJhYmxlQ2xvbmUoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFRhYkZvY3VzQ3Vyc29yID0gY3VycmVudFRhYkZvY3VzUGFyZW50Q3Vyc29yICYmIGZpbmRUYWJGb2N1c0luZGV4KHRhYkZvY3VzQ3Vyc29ycywgY3VycmVudFRhYkZvY3VzUGFyZW50Q3Vyc29yKSA+PSAwID8gY3VycmVudFRhYkZvY3VzUGFyZW50Q3Vyc29yIDogd2Fsa2VyLmNsb25lKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IGZpbmRUYWJGb2N1c0luZGV4KHRhYkZvY3VzQ3Vyc29ycywgY3VycmVudFRhYkZvY3VzQ3Vyc29yKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudEluZGV4ICsgMSA8IHRhYkZvY3VzQ3Vyc29ycy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFiRm9jdXNDdXJzb3JzW2N1cnJlbnRJbmRleCArIDFdLmNsb25lKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFiRm9jdXNDdXJzb3JzWzBdLmNsb25lKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgcmV0VmFsID0gd2Fsa2VyLmNsb25lKCk7XG4gICAgICAgICAgICBjb25zdCBtYXRjaEZ1bmMgPSBnZXRTdGFydEZ1bmMobW9kZSk7XG4gICAgICAgICAgICBjb25zdCBza2lwRnVuYyA9IGdldFNraXBGdW5jKG1vZGUpO1xuICAgICAgICAgICAgaWYgKHJldFZhbC5uZXh0KG1hdGNoRnVuYywgc2tpcEZ1bmMpKSB7XG4gICAgICAgICAgICAgICAgREVCVUcgJiYgY29uc29sZS5sb2coXCJTUk5hdmlnYXRvcjo6anVtcE5leHQgcmVzdWx0XCIsIHJldFZhbCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBjb25zb2xlLmdyb3VwRW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBOYXZpZ2F0ZXMgdG8gdGhlIHByZXZpb3VzIGVsZW1lbnQgaW4gc2NyZWVuIHJlYWRlciBuYXZpZ2F0aW9uIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgbW9kZS5cbiAgICAgKlxuICAgICAqIEZvciB0YWJfZm9jdXMgbW9kZSwgdGhpcyBmdW5jdGlvbiBhdHRlbXB0cyB0byBtb3ZlIHRvIHRoZSBwcmV2aW91cyB0YWJiYWJsZSBlbGVtZW50IGJ5OlxuICAgICAqIDEuIEZpcnN0IHRyeWluZyB0byBtb3ZlIGJhY2t3YXJkIHVzaW5nIHRoZSBtb2RlJ3MgbWF0Y2ggYW5kIHNraXAgZnVuY3Rpb25zXG4gICAgICogMi4gSWYgdGhhdCBmYWlscywgY29sbGVjdGluZyBhbGwgdGFiIGZvY3VzIGN1cnNvcnMgYW5kIGZpbmRpbmcgdGhlIHByZXZpb3VzIG9uZSBpbiB0aGUgdGFiIG9yZGVyXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbW9kZSAtIFRoZSBuYXZpZ2F0aW9uIG1vZGUgKGUuZy4sIFwidGFiX2ZvY3VzXCIpIHRoYXQgZGV0ZXJtaW5lcyBob3cgdG8gbmF2aWdhdGVcbiAgICAgKiBAcGFyYW0gd2Fsa2VyIC0gVGhlIGN1cnJlbnQgY3Vyc29yIHBvc2l0aW9uIGluIHRoZSBzY3JlZW4gcmVhZGVyIG5hdmlnYXRpb25cbiAgICAgKiBAcmV0dXJucyBBIG5ldyBjdXJzb3IgcG9zaXRpb25lZCBhdCB0aGUgcHJldmlvdXMgZWxlbWVudCwgb3IgbnVsbCBpZiBubyBwcmV2aW91cyBlbGVtZW50IGV4aXN0c1xuICAgICAqL1xuICAgIGV4cG9ydCBmdW5jdGlvbiBqdW1wUHJldmlvdXMobW9kZTogTmF2aWdhdGlvbk1vZGUsIHdhbGtlcjogU1JDdXJzb3IpIDogU1JDdXJzb3Ige1xuICAgICAgICBpZiAobW9kZSA9PT0gXCJ0YWJfZm9jdXNcIikge1xuICAgICAgICAgICAgbGV0IHJldFZhbCA9IHdhbGtlci5jbG9uZSgpO1xuICAgICAgICAgICAgY29uc3QgbWF0Y2hGdW5jID0gZ2V0U3RhcnRGdW5jKG1vZGUpO1xuICAgICAgICAgICAgY29uc3Qgc2tpcEZ1bmMgPSBnZXRTa2lwRnVuYyhtb2RlKTtcbiAgICAgICAgICAgIGlmIChyZXRWYWwucHJldmlvdXMobWF0Y2hGdW5jLCBza2lwRnVuYykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCB0YWJGb2N1c01hdGNoRnVuYyA9IGdldFRhYkZvY3VzU3RhcnRGdW5jKHRydWUpO1xuICAgICAgICAgICAgY29uc3QgdGFiRm9jdXNDdXJzb3JzID0gY29sbGVjdFRhYkZvY3VzQ3Vyc29ycyh0YWJGb2N1c01hdGNoRnVuYywgd2Fsa2VyLmdldE5vZGUoKSk7XG4gICAgICAgICAgICBpZiAodGFiRm9jdXNDdXJzb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50VGFiRm9jdXNQYXJlbnRDdXJzb3IgPSB3YWxrZXIuZ2V0Q3VycmVudE9yUGFyZW50VGFiYmFibGVDbG9uZSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRUYWJGb2N1c0N1cnNvciA9IGN1cnJlbnRUYWJGb2N1c1BhcmVudEN1cnNvciAmJiBmaW5kVGFiRm9jdXNJbmRleCh0YWJGb2N1c0N1cnNvcnMsIGN1cnJlbnRUYWJGb2N1c1BhcmVudEN1cnNvcikgPj0gMCA/IGN1cnJlbnRUYWJGb2N1c1BhcmVudEN1cnNvciA6IHdhbGtlci5jbG9uZSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IGZpbmRUYWJGb2N1c0luZGV4KHRhYkZvY3VzQ3Vyc29ycywgY3VycmVudFRhYkZvY3VzQ3Vyc29yKTtcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudEluZGV4ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFiRm9jdXNDdXJzb3JzW2N1cnJlbnRJbmRleCAtIDFdLmNsb25lKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmV0VmFsID0gd2Fsa2VyLmNsb25lKCk7XG4gICAgICAgIGNvbnN0IG1hdGNoRnVuYyA9IGdldFN0YXJ0RnVuYyhtb2RlKTtcbiAgICAgICAgY29uc3Qgc2tpcEZ1bmMgPSBnZXRTa2lwRnVuYyhtb2RlKTtcbiAgICAgICAgaWYgKHJldFZhbC5wcmV2aW91cyhtYXRjaEZ1bmMsIHNraXBGdW5jKSkge1xuICAgICAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG59XG4iLCJpbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBTUk5hdmlnYXRvciB9IGZyb20gXCIuL1NSTmF2aWdhdG9yXCI7XG5pbXBvcnQgeyBDb250YWluZXJDaGFuZ2VzLCBOYXZpZ2F0aW9uTW9kZSwgUmVuZGVyUmVzdWx0IH0gZnJvbSBcIi4vU1JUeXBlc1wiO1xuaW1wb3J0IHsgU1JDdXJzb3IgfSBmcm9tIFwiLi9TUkN1cnNvclwiO1xuaW1wb3J0IHsgU1JfUlVMRVMsIENPTlRBSU5FUl9FTlRFUl9SVUxFUywgQ09OVEFJTkVSX0VYSVRfUlVMRVMgfSBmcm9tIFwiLi9yZW5kZXJfcnVsZXNcIjtcbmltcG9ydCB7IGdldExpbmtBbm5vdW5jZW1lbnQgfSBmcm9tIFwiLi9yZW5kZXJfcnVsZXMvY29tbW9uXCI7XG5cbi8qKlxuICogU1JSZW5kZXJlciBuYW1lc3BhY2UgcHJvdmlkZXMgZnVuY3Rpb25hbGl0eSBmb3Igc2ltdWxhdGluZyBob3cgc2NyZWVuIHJlYWRlcnNcbiAqIGFubm91bmNlIGNvbnRlbnQgdG8gdXNlcnMuIEl0IGNvbnRhaW5zIHJ1bGVzIGZvciByZW5kZXJpbmcgZGlmZmVyZW50IHR5cGVzIG9mXG4gKiBlbGVtZW50cyBhbmQgQVJJQSByb2xlcyBpbiB2YXJpb3VzIG5hdmlnYXRpb24gbW9kZXMuXG4gKlxuICogVGhlIHJlbmRlcmVyIHVzZXMgYSBydWxlLWJhc2VkIHN5c3RlbSB0byBkZXRlcm1pbmUgd2hhdCB0ZXh0IHNob3VsZCBiZSBhbm5vdW5jZWRcbiAqIHdoZW4gbmF2aWdhdGluZyB0bywgd2l0aGluLCBvciBhd2F5IGZyb20gZWxlbWVudHMgYmFzZWQgb24gdGhlaXIgcm9sZXMgYW5kIHByb3BlcnRpZXMuXG4gKi9cbmV4cG9ydCBuYW1lc3BhY2UgU1JSZW5kZXJlciB7XG4gICAgLyoqXG4gICAgICogR2VuZXJhdGVzIHRoZSBhbm5vdW5jZW1lbnQgdGV4dCB3aGVuIGVudGVyaW5nIGFuIGVsZW1lbnRcbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gbG9va3MgdXAgdGhlIGFwcHJvcHJpYXRlIHJ1bGUgYmFzZWQgb24gdGhlIGVsZW1lbnQncyByb2xlIG9yIHRhZyBuYW1lXG4gICAgICogYW5kIGFwcGxpZXMgaXQgdG8gZ2VuZXJhdGUgdGhlIGFubm91bmNlbWVudCB0ZXh0LlxuICAgICAqXG4gICAgICogQHBhcmFtIG1vZGUgLSBUaGUgY3VycmVudCBuYXZpZ2F0aW9uIG1vZGVcbiAgICAgKiBAcGFyYW0gd2Fsa2VyIC0gQ3Vyc29yIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uXG4gICAgICogQHBhcmFtIG9sZFdhbGtlciAtIE9wdGlvbmFsIGN1cnNvciBhdCB0aGUgcHJldmlvdXMgcG9zaXRpb25cbiAgICAgKiBAcmV0dXJucyBBbm5vdW5jZW1lbnQgdGV4dCBmb3IgZW50ZXJpbmcgdGhlIGVsZW1lbnQsIG9yIG51bGwgaWYgbm8gcnVsZSBhcHBsaWVzXG4gICAgICovXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHJlbmRlckVudGVyKG1vZGU6IE5hdmlnYXRpb25Nb2RlIHwgXCJmb2N1c1wiLCB3YWxrZXI6IFNSQ3Vyc29yLCBvbGRXYWxrZXI/OiBTUkN1cnNvcik6IHN0cmluZyB8IG51bGwgeyAgICAgICAgXG4gICAgICAgIGNvbnN0IERFQlVHID0gZmFsc2U7XG4gICAgICAgIGZvciAoY29uc3QgcnVsZSBvZiBDT05UQUlORVJfRU5URVJfUlVMRVMpIHtcbiAgICAgICAgICAgIGxldCBzID0gcnVsZS50ZXN0KG1vZGUsIHdhbGtlciwgb2xkV2Fsa2VyKTtcbiAgICAgICAgICAgIERFQlVHICYmIGNvbnNvbGUubG9nKG1vZGUsIHdhbGtlciwgcnVsZSwgcyk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHMgIT09IFwidW5kZWZpbmVkXCIgJiYgcyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlcyB0aGUgYW5ub3VuY2VtZW50IHRleHQgd2hlbiBsZWF2aW5nIGFuIGVsZW1lbnRcbiAgICAgKlxuICAgICAqIFNpbWlsYXIgdG8gcmVuZGVyRW50ZXIsIGJ1dCBhcHBsaWVzIHJ1bGVzIGZvciBsZWF2aW5nIGVsZW1lbnRzIGluc3RlYWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbW9kZSAtIFRoZSBjdXJyZW50IG5hdmlnYXRpb24gbW9kZVxuICAgICAqIEBwYXJhbSB3YWxrZXIgLSBDdXJzb3IgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb25cbiAgICAgKiBAcGFyYW0gb2xkV2Fsa2VyIC0gT3B0aW9uYWwgY3Vyc29yIGF0IHRoZSBwcmV2aW91cyBwb3NpdGlvblxuICAgICAqIEByZXR1cm5zIEFubm91bmNlbWVudCB0ZXh0IGZvciBsZWF2aW5nIHRoZSBlbGVtZW50LCBvciBudWxsIGlmIG5vIHJ1bGUgYXBwbGllc1xuICAgICAqL1xuICAgIGV4cG9ydCBmdW5jdGlvbiByZW5kZXJMZWF2ZShtb2RlOiBOYXZpZ2F0aW9uTW9kZSwgd2Fsa2VyOiBTUkN1cnNvciwgb2xkV2Fsa2VyPzogU1JDdXJzb3IpOiBzdHJpbmcgfCBudWxsICB7XG4gICAgICAgIGZvciAoY29uc3QgcnVsZSBvZiBDT05UQUlORVJfRVhJVF9SVUxFUykge1xuICAgICAgICAgICAgbGV0IHMgPSBydWxlLnRlc3QobW9kZSwgd2Fsa2VyLCBvbGRXYWxrZXIpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBzICE9PSBcInVuZGVmaW5lZFwiICYmIHMgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW5kZXJzIHRoZSBjdXJyZW50IGVsZW1lbnQgYW5kIGFueSBjb250YWluZXIgY2hhbmdlc1xuICAgICAqXG4gICAgICogVGhpcyBmdW5jdGlvbiBjb21iaW5lcyBhbm5vdW5jZW1lbnRzIGZvcjpcbiAgICAgKiAtIENvbnRhaW5lcnMgYmVpbmcgbGVmdFxuICAgICAqIC0gQ29udGFpbmVycyBiZWluZyBlbnRlcmVkXG4gICAgICogLSBUaGUgY3VycmVudCBlbGVtZW50IGl0c2VsZlxuICAgICAqXG4gICAgICogQHBhcmFtIG1vZGUgLSBUaGUgY3VycmVudCBuYXZpZ2F0aW9uIG1vZGVcbiAgICAgKiBAcGFyYW0gd2Fsa2VyIC0gQ3Vyc29yIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uXG4gICAgICogQHBhcmFtIGNvbnRhaW5lckNoYW5nZXMgLSBJbmZvcm1hdGlvbiBhYm91dCBjb250YWluZXJzIGJlaW5nIGVudGVyZWQgb3IgbGVmdFxuICAgICAqIEByZXR1cm5zIENvbWJpbmVkIGFubm91bmNlbWVudCB0ZXh0XG4gICAgICovXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHJlbmRlckN1cnJlbnQobW9kZTogTmF2aWdhdGlvbk1vZGUsIHdhbGtlcjogU1JDdXJzb3IsIGNvbnRhaW5lckNoYW5nZXM6IENvbnRhaW5lckNoYW5nZXMpOiBSZW5kZXJSZXN1bHQgfCBudWxsIHtcbiAgICAgICAgY29uc3QgREVCVUcgPSBmYWxzZTsvL21vZGUgPT09IFwidGFiX2ZvY3VzXCIgJiYgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJmaXh0dXJlXCIpPy5nZXRBdHRyaWJ1dGUoXCJjbGFzc1wiKSA9PT0gXCJ0b210ZXN0XCI7XG4gICAgICAgIGxldCBzdGFydE9mUmVuZGVyID0gU1JOYXZpZ2F0b3IuanVtcEN1cnJlbnQobW9kZSwgd2Fsa2VyKTtcbiAgICAgICAgaWYgKCFzdGFydE9mUmVuZGVyKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgZW5kT2ZSZW5kZXJzID0gU1JOYXZpZ2F0b3IuanVtcEN1cnJlbnRFbmQobW9kZSwgc3RhcnRPZlJlbmRlcik7XG4gICAgICAgIGlmICghZW5kT2ZSZW5kZXJzIHx8IGVuZE9mUmVuZGVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGVuZE9mUmVuZGVycyA9IFtudWxsXTtcbiAgICAgICAgfVxuICAgICAgICBERUJVRyAmJiBjb25zb2xlLmxvZyhcIkFBQUFcIiwgc3RhcnRPZlJlbmRlci5pc1N0YXJ0VGFnKCksIHN0YXJ0T2ZSZW5kZXIuZ2V0Tm9kZSgpKTtcbiAgICAgICAgREVCVUcgJiYgY29uc29sZS5sb2coXCJCQkJCXCIsIGVuZE9mUmVuZGVycy5tYXAodmFsID0+IHZhbCAmJiB2YWwuaXNTdGFydFRhZygpKSwgZW5kT2ZSZW5kZXJzLm1hcCh2YWwgPT4gdmFsICYmIHZhbC5nZXROb2RlKCkpKTtcblxuICAgICAgICBsZXQgZW5kT2ZSZW5kZXIgPSBlbmRPZlJlbmRlcnNbZW5kT2ZSZW5kZXJzLmxlbmd0aCAtIDFdO1xuICAgICAgICBsZXQgcmVuZGVyU3RyID0gXCJcIjtcbiAgICAgICAgZm9yIChsZXQgY2FuZGlkYXRlRW5kIG9mIGVuZE9mUmVuZGVycykge1xuICAgICAgICAgICAgbGV0IGNhbmRpZGF0ZVJlbmRlclN0ciA9IFNSUmVuZGVyZXIucmVuZGVyUmFuZ2UobW9kZSwgc3RhcnRPZlJlbmRlciwgY2FuZGlkYXRlRW5kKTtcbiAgICAgICAgICAgIGlmIChjYW5kaWRhdGVSZW5kZXJTdHIudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBlbmRPZlJlbmRlciA9IGNhbmRpZGF0ZUVuZDtcbiAgICAgICAgICAgICAgICByZW5kZXJTdHIgPSBjYW5kaWRhdGVSZW5kZXJTdHI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlbmRlclN0ciA9PT0gXCJcIikge1xuICAgICAgICAgICAgcmVuZGVyU3RyID0gU1JSZW5kZXJlci5yZW5kZXJSYW5nZShtb2RlLCBzdGFydE9mUmVuZGVyLCBlbmRPZlJlbmRlcik7XG4gICAgICAgIH1cbiAgICAgICAgREVCVUcgJiYgY29uc29sZS5sb2coXCJDQ0NDXCIsIHJlbmRlclN0cik7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdGFydDogc3RhcnRPZlJlbmRlcixcbiAgICAgICAgICAgIGVuZDogZW5kT2ZSZW5kZXIsXG4gICAgICAgICAgICBtZXNzYWdlOiAoY29udGFpbmVyQ2hhbmdlcy5sZWF2aW5nIHx8IFtdKS5jb25jYXQoY29udGFpbmVyQ2hhbmdlcy5lbnRlcmluZyB8fCBbXSkuY29uY2F0KFtyZW5kZXJTdHJdKS5qb2luKFwiIFwiKS5yZXBsYWNlKC9cXHMrL2csIFwiIFwiKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVuZGVycyBhIHJhbmdlIG9mIGVsZW1lbnRzIGJldHdlZW4gdHdvIGN1cnNvcnNcbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gdHJhdmVyc2VzIHRoZSBET00gZnJvbSBzdGFydE9mUmVuZGVyIHRvIGVuZE9mUmVuZGVyLFxuICAgICAqIGFwcGx5aW5nIHJlbmRlcmluZyBydWxlcyB0byBlYWNoIGVsZW1lbnQgYW5kIGNvbWJpbmluZyB0aGUgcmVzdWx0cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBtb2RlIC0gVGhlIGN1cnJlbnQgbmF2aWdhdGlvbiBtb2RlXG4gICAgICogQHBhcmFtIHN0YXJ0T2ZSZW5kZXIgLSBDdXJzb3IgYXQgdGhlIHN0YXJ0IG9mIHRoZSByYW5nZVxuICAgICAqIEBwYXJhbSBlbmRPZlJlbmRlciAtIEN1cnNvciBhdCB0aGUgZW5kIG9mIHRoZSByYW5nZVxuICAgICAqIEByZXR1cm5zIENvbWJpbmVkIGFubm91bmNlbWVudCB0ZXh0IGZvciB0aGUgZW50aXJlIHJhbmdlXG4gICAgICovXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHJlbmRlclJhbmdlKG1vZGU6IE5hdmlnYXRpb25Nb2RlLCBzdGFydE9mUmVuZGVyOiBTUkN1cnNvciwgZW5kT2ZSZW5kZXI6IFNSQ3Vyc29yKSA6IHN0cmluZyB7XG4gICAgICAgIGxldCBpdGVyV2Fsa2VyID0gc3RhcnRPZlJlbmRlci5jbG9uZSgpO1xuICAgICAgICBsZXQgZWxlbVN0cnM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGxldCBiQ29udGludWUgPSB0cnVlO1xuICAgICAgICBsZXQgY3VycmVudExpbms6IE5vZGUgPSBudWxsO1xuICAgICAgICB3aGlsZSAoYkNvbnRpbnVlKSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtID0gaXRlcldhbGtlci5nZXRFbGVtZW50KCk7XG4gICAgICAgICAgICBjb25zdCBub2RlID0gaXRlcldhbGtlci5nZXROb2RlKCk7XG4gICAgICAgICAgICBjb25zdCBub2RlVHlwZSA9IG5vZGUubm9kZVR5cGU7XG4gICAgICAgICAgICBsZXQgcmVuZGVyU3Ryczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICAgIGxldCBsaW5rUGFyZW50ID0gQXJpYVV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShub2RlLCBcImxpbmtcIiwgdHJ1ZSk7XG4gICAgICAgICAgICBpZiAobGlua1BhcmVudCAmJiAhW1wiY29udGVudFwiLCBcInRleHRcIl0uaW5jbHVkZXMobmV3IFNSQ3Vyc29yKGxpbmtQYXJlbnQpLmdldE5hbWVJbmZvKCk/Lm5hbWVGcm9tKSkge1xuICAgICAgICAgICAgICAgIC8vIFdlIGRvbid0IGNvbnNpZGVyIGxpbmtzIHRoYXQgYW5ub3VuY2UgdGhlbXNlbHZlc1xuICAgICAgICAgICAgICAgIGxpbmtQYXJlbnQgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChjb25zdCBydWxlIG9mIFNSX1JVTEVTKSB7XG4gICAgICAgICAgICAgICAgbGV0IHMgPSBydWxlLnRlc3QobW9kZSwgaXRlcldhbGtlcik7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzICE9PSBcInVuZGVmaW5lZFwiICYmIHMgIT09IG51bGwgJiYgcy50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZVR5cGUgPT09IDEgJiYgIWl0ZXJXYWxrZXIuaXNFbmRUYWcoKSAmJiBlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtaGFzcG9wdXBcIikgPT09IFwibWVudVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzID0gXCJbc3ViTWVudV0gXCIrcztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBIYW5kbGUgbGlua3NcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGUgPT09IFwidGFiX2ZvY3VzXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlJ3JlIGluIGxpbmsgbW9kZVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRMaW5rICYmICghbGlua1BhcmVudCB8fCAobGlua1BhcmVudCAmJiBjdXJyZW50TGluayAhPT0gbGlua1BhcmVudCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UndmUgYWRkZWQgYSBzdHJpbmcgd2l0aGluIGEgbGluayAoY3VycmVudExpbmspLCBidXQgbm93IHdlJ3ZlIGxlZnQgdGhlIGxpbmsgb3IgbW92ZWQgdG8gYSBuZXcgbGlua1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBgJHtzfSAke2dldExpbmtBbm5vdW5jZW1lbnQobmV3IFNSQ3Vyc29yKGN1cnJlbnRMaW5rLCBmYWxzZSkpfWA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGlua1BhcmVudCAmJiAoIWN1cnJlbnRMaW5rIHx8IChjdXJyZW50TGluayAhPT0gbGlua1BhcmVudCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UncmUgaW4gYSBsaW5rLCBhbmQgd2UgaGF2ZW4ndCBhbm5vdW5jZWQgdGhpcyBsaW5rLCBvciB3ZSd2ZSBtb3ZlZCB0byBhIG5ldyBsaW5rXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA9IGAke2dldExpbmtBbm5vdW5jZW1lbnQobmV3IFNSQ3Vyc29yKGxpbmtQYXJlbnQsIGZhbHNlKSl9ICR7c31gO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBcblxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChzICE9PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50TGluayA9IGxpbmtQYXJlbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtU3Rycy5wdXNoKHMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsZW1TdHJzLnB1c2gocmVuZGVyU3Rycy5maWx0ZXIocyA9PiBzLnRyaW0oKS5sZW5ndGggPiAwKS5qb2luKFwiIFwiKSlcbiAgICAgICAgICAgIGJDb250aW51ZSA9IGl0ZXJXYWxrZXIubmV4dCgoKSA9PiB0cnVlLCBTUk5hdmlnYXRvci5nZXRTa2lwRnVuYyhtb2RlKSkgJiYgU1JDdXJzb3IuY29tcGFyZShpdGVyV2Fsa2VyLCBlbmRPZlJlbmRlcikgPCAwO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtb2RlID09PSBcInRhYl9mb2N1c1wiICYmIGN1cnJlbnRMaW5rKSB7XG4gICAgICAgICAgICBlbGVtU3Rycy5wdXNoKGAke2dldExpbmtBbm5vdW5jZW1lbnQobmV3IFNSQ3Vyc29yKGN1cnJlbnRMaW5rLCBmYWxzZSkpfWApO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZXRWYWwgPSBlbGVtU3Rycy5maWx0ZXIocyA9PiBzLnRyaW0oKS5sZW5ndGggPiAwKS5qb2luKFwiIFwiKTtcbiAgICAgICAgcmV0VmFsID0gcmV0VmFsLnJlcGxhY2UoLywgXFx1MDAwMShbXlxcdTAwMDJdKylcXHUwMDAyL2csIChtYXRjaCwgZGVzY3JpYmVkQnlUZXh0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBxdW90ZWRUZXh0ID0gYFwiJHtkZXNjcmliZWRCeVRleHR9XCJgO1xuICAgICAgICAgICAgY29uc3QgdW5tYXJrZWRSZXRWYWwgPSByZXRWYWwucmVwbGFjZShtYXRjaCwgXCJcIik7XG4gICAgICAgICAgICByZXR1cm4gdW5tYXJrZWRSZXRWYWwuaW5jbHVkZXMocXVvdGVkVGV4dCkgfHwgdW5tYXJrZWRSZXRWYWwuaW5jbHVkZXMoZGVzY3JpYmVkQnlUZXh0KSA/IFwiXCIgOiBgLCAke3F1b3RlZFRleHR9YDtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldFZhbCA9IHJldFZhbC5yZXBsYWNlKC9bXFx1MDAwMVxcdTAwMDJdL2csIFwiXCIpO1xuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxufVxuXG4iLCJpbXBvcnQgeyBTUkN1cnNvciB9IGZyb20gXCIuL1NSQ3Vyc29yXCI7XG5pbXBvcnQgeyBOYXZpZ2F0aW9uTW9kZSB9IGZyb20gXCIuL1NSVHlwZXNcIjtcblxuZXhwb3J0IGNsYXNzIFNSUmVuZGVyZXJSdWxlIHtcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJ1bGVEZWZpbml0aW9uOiB7XG4gICAgICAgIG1vZGVzOiBOYXZpZ2F0aW9uTW9kZVtdLFxuICAgICAgICByb2xlczogc3RyaW5nW10sXG4gICAgICAgIGVsZW1zOiBzdHJpbmdbXSxcbiAgICAgICAgdGVzdHM6IEFycmF5PChjdXJzb3I6IFNSQ3Vyc29yLCBvbGRDdXJzb3I/OiBTUkN1cnNvciwgbW9kZT86IE5hdmlnYXRpb25Nb2RlKSA9PiBzdHJpbmcgfCBudWxsPlxuICAgIH0pIHtcblxuICAgIH1cblxuICAgIHB1YmxpYyB0ZXN0KG1vZGU6IE5hdmlnYXRpb25Nb2RlLCBjdXJzb3I6IFNSQ3Vyc29yLCBvbGRDdXJzb3I/OiBTUkN1cnNvcik6IHN0cmluZyB8IG51bGwge1xuICAgICAgICBpZiAodGhpcy5ydWxlRGVmaW5pdGlvbi5tb2Rlcy5pbmNsdWRlcyhtb2RlKVxuICAgICAgICAgICAgJiYgKFxuICAgICAgICAgICAgICAgIHRoaXMucnVsZURlZmluaXRpb24ucm9sZXMuaW5jbHVkZXMoY3Vyc29yLmdldFJvbGUoKSlcbiAgICAgICAgICAgICAgICB8fCB0aGlzLnJ1bGVEZWZpbml0aW9uLmVsZW1zLmluY2x1ZGVzKGN1cnNvci5nZXROb2RlKCkubm9kZU5hbWUudG9VcHBlckNhc2UoKSlcbiAgICAgICAgICAgIClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHRlc3Qgb2YgdGhpcy5ydWxlRGVmaW5pdGlvbi50ZXN0cykge1xuICAgICAgICAgICAgICAgIGxldCBzID0gdGVzdChjdXJzb3IsIG9sZEN1cnNvciwgbW9kZSk7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzID09PSBcInN0cmluZ1wiKSByZXR1cm4gcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59IiwiaW1wb3J0IHsgU1JDdXJzb3IgfSBmcm9tIFwiLi9TUkN1cnNvclwiO1xuXG4vKipcbiAqIFRhYmxlVXRpbCBuYW1lc3BhY2UgcHJvdmlkZXMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIGhhbmRsaW5nIEhUTUwgdGFibGVzIGluIHRoZSBhY2Nlc3NpYmlsaXR5IHNpbXVsYXRvci5cbiAqIFRoZXNlIGZ1bmN0aW9ucyBoZWxwIGRldGVybWluZSBjZWxsIHBvc2l0aW9ucywgcmVsYXRpb25zaGlwcywgYW5kIGV4dHJhY3QgaGVhZGVyIGluZm9ybWF0aW9uXG4gKiB0byBzaW11bGF0ZSBob3cgc2NyZWVuIHJlYWRlcnMgd291bGQgYW5ub3VuY2UgdGFibGUgbmF2aWdhdGlvbi5cbiAqL1xuZXhwb3J0IG5hbWVzcGFjZSBTUlRhYmxlVXRpbCB7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIHRhYmxlIGNlbGwgd2l0aCBpdHMgcG9zaXRpb24gYW5kIHNwYW5uaW5nIGluZm9ybWF0aW9uXG4gICAgICogQHByb3BlcnR5IHJvd0luZGV4U3RhcnQgLSBUaGUgc3RhcnRpbmcgcm93IGluZGV4ICgwLWJhc2VkKVxuICAgICAqIEBwcm9wZXJ0eSBjb2xJbmRleFN0YXJ0IC0gVGhlIHN0YXJ0aW5nIGNvbHVtbiBpbmRleCAoMC1iYXNlZClcbiAgICAgKiBAcHJvcGVydHkgcm93c3BhbiAtIE51bWJlciBvZiByb3dzIHRoaXMgY2VsbCBzcGFuc1xuICAgICAqIEBwcm9wZXJ0eSBjb2xzcGFuIC0gTnVtYmVyIG9mIGNvbHVtbnMgdGhpcyBjZWxsIHNwYW5zXG4gICAgICogQHByb3BlcnR5IGNlbGxDdXJzb3IgLSBTUkN1cnNvciBwb2ludGluZyB0byB0aGlzIGNlbGxcbiAgICAgKi9cbiAgICBleHBvcnQgdHlwZSBDZWxsTW9kZWwgPSB7IHJvd0luZGV4U3RhcnQ6IG51bWJlciwgY29sSW5kZXhTdGFydDogbnVtYmVyLCByb3dzcGFuOiBudW1iZXIsIGNvbHNwYW46IG51bWJlciwgY2VsbEN1cnNvcjogU1JDdXJzb3IgfVxuICAgIFxuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSByb3cgaW4gYSB0YWJsZSBhcyBhbiBhcnJheSBvZiBjZWxsIG1vZGVsc1xuICAgICAqL1xuICAgIGV4cG9ydCB0eXBlIFJvd01vZGVsID0gQ2VsbE1vZGVsW107XG4gICAgXG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIGNvbXBsZXRlIHRhYmxlIGFzIGFuIGFycmF5IG9mIHJvd3NcbiAgICAgKi9cbiAgICBleHBvcnQgdHlwZSBUYWJsZU1vZGVsID0gUm93TW9kZWxbXTtcblxuICAgIC8qKlxuICAgICAqIERldGVybWluZXMgaWYgdGhlIGN1cnNvciBpcyBwb2ludGluZyB0byBhIGNlbGwgZWxlbWVudCAoVEQgb3IgVEgpXG4gICAgICogb3IgaGFzIGEgY2VsbC1yZWxhdGVkIEFSSUEgcm9sZVxuICAgICAqIEBwYXJhbSBjdXJzb3IgLSBUaGUgU1JDdXJzb3IgdG8gY2hlY2tcbiAgICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBjdXJzb3IgaXMgb24gYSBjZWxsLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgKi9cbiAgICBleHBvcnQgZnVuY3Rpb24gaXNDdXJzb3JDZWxsUm9sZShjdXJzb3I6IFNSQ3Vyc29yKSB7XG4gICAgICAgIGlmICghY3Vyc29yLmdldEVsZW1lbnQoKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoW1wiY2VsbFwiLCBcInJvd2hlYWRlclwiLCBcImNvbHVtbmhlYWRlclwiXS5pbmNsdWRlcyhjdXJzb3IuZ2V0Um9sZSgpKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICFjdXJzb3IuZ2V0RWxlbWVudCgpLmhhc0F0dHJpYnV0ZShcInJvbGVcIikgJiYgW1wiVEhcIiwgXCJURFwiXS5pbmNsdWRlcyhjdXJzb3IuZ2V0RWxlbWVudCgpLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYSBjdXJzb3IgcG9pbnRpbmcgdG8gdGhlIGN1cnJlbnQgY2VsbCBvciB0aGUgcGFyZW50IGNlbGwgaWYgdGhlIGN1cnNvclxuICAgICAqIGlzIGluc2lkZSBhIGNlbGwncyBjb250ZW50XG4gICAgICogQHBhcmFtIGN1cnNvciAtIFRoZSBTUkN1cnNvciB0byBjaGVja1xuICAgICAqIEByZXR1cm5zIEEgbmV3IFNSQ3Vyc29yIHBvaW50aW5nIHRvIHRoZSBjZWxsIG9yIG51bGwgaWYgbm90IGluIGEgY2VsbFxuICAgICAqL1xuICAgIGV4cG9ydCBmdW5jdGlvbiBnZXRDdXJyZW50T3JQYXJlbnRDZWxsQ3Vyc29yKGN1cnNvcjogU1JDdXJzb3IpIDogU1JDdXJzb3Ige1xuICAgICAgICByZXR1cm4gY3Vyc29yLmdldEN1cnJlbnRPclBhcmVudEJ5Um9sZUNsb25lKFtcImNlbGxcIiwgXCJyb3doZWFkZXJcIiwgXCJjb2x1bW5oZWFkZXJcIl0sIFtcIlREXCIsXCJUSFwiXSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBjb2xzcGFuIG9mIGEgY2VsbCBhdCBhIGdpdmVuIGxvY2F0aW9uXG4gICAgICogQHBhcmFtIGN1cnNvciBUaGUgY3Vyc29yIHRvIGdldCB0aGUgY29sc3BhbiBmcm9tXG4gICAgICogQHJldHVybnMgVGhlIGNvbHNwYW4gb2YgdGhlIGNlbGwgYXQgdGhlIGN1cnNvcidzIGxvY2F0aW9uIG9yIDAgaWYgbm90IGluIGEgY29sdW1uXG4gICAgICovXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGdldENvbFNwYW4oY3Vyc29yOiBTUkN1cnNvcik6IG51bWJlciB7XG4gICAgICAgIGlmICghaXNDdXJzb3JDZWxsUm9sZShjdXJzb3IpKSByZXR1cm4gMDtcbiAgICAgICAgbGV0IGNvbFNwYW4gPSBjdXJzb3IuZ2V0RWxlbWVudCgpLmdldEF0dHJpYnV0ZShcImNvbHNwYW5cIik7XG4gICAgICAgIGlmIChjb2xTcGFuKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQoY29sU3Bhbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSByb3dzcGFuIG9mIGEgY2VsbCBhdCBhIGdpdmVuIGxvY2F0aW9uXG4gICAgICogQHBhcmFtIGN1cnNvciBUaGUgY3Vyc29yIHRvIGdldCB0aGUgcm93c3BhbiBmcm9tXG4gICAgICogQHJldHVybnMgVGhlIHJvd3NwYW4gb2YgdGhlIGNlbGwgYXQgdGhlIGN1cnNvcidzIGxvY2F0aW9uIG9yIDAgaWYgbm90IGluIGEgY29sdW1uXG4gICAgICovXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGdldFJvd1NwYW4oY3Vyc29yOiBTUkN1cnNvcik6IG51bWJlciB7XG4gICAgICAgIGlmICghaXNDdXJzb3JDZWxsUm9sZShjdXJzb3IpKSByZXR1cm4gMDtcbiAgICAgICAgbGV0IHJvd1NwYW4gPSBjdXJzb3IuZ2V0RWxlbWVudCgpLmdldEF0dHJpYnV0ZShcInJvd3NwYW5cIik7XG4gICAgICAgIGlmIChyb3dTcGFuKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQocm93U3Bhbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQnVpbGRzIGEgY29tcGxldGUgbW9kZWwgb2YgYSB0YWJsZSdzIHN0cnVjdHVyZSwgYWNjb3VudGluZyBmb3Igcm93c3BhbiBhbmQgY29sc3BhblxuICAgICAqXG4gICAgICogVGhpcyBmdW5jdGlvbiB0cmF2ZXJzZXMgdGhlIGVudGlyZSB0YWJsZSBhbmQgY3JlYXRlcyBhIGRhdGEgc3RydWN0dXJlIHRoYXQgcmVwcmVzZW50c1xuICAgICAqIHRoZSBsb2dpY2FsIGdyaWQgb2YgY2VsbHMsIHByb3Blcmx5IGhhbmRsaW5nIGNlbGxzIHRoYXQgc3BhbiBtdWx0aXBsZSByb3dzIG9yIGNvbHVtbnMuXG4gICAgICogVGhlIHJlc3VsdGluZyBtb2RlbCBtYWtlcyBpdCBlYXNpZXIgdG8gZGV0ZXJtaW5lIGNlbGwgcmVsYXRpb25zaGlwcyBhbmQgcG9zaXRpb25zLlxuICAgICAqXG4gICAgICogQHBhcmFtIGluVGFibGVDdXJzb3IgLSBBIGN1cnNvciB3aXRoaW4gdGhlIHRhYmxlXG4gICAgICogQHJldHVybnMgQSBUYWJsZU1vZGVsIHJlcHJlc2VudGluZyB0aGUgY29tcGxldGUgdGFibGUgc3RydWN0dXJlLCBvciBudWxsIGlmIG5vdCBpbiBhIHRhYmxlXG4gICAgICovXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGdldFRhYmxlTW9kZWwoaW5UYWJsZUN1cnNvcjogU1JDdXJzb3IpOiBUYWJsZU1vZGVsIHtcbiAgICAgICAgLy8gR2V0IGEgY3Vyc29yIHBvaW50aW5nIHRvIHRoZSB0YWJsZSBlbGVtZW50XG4gICAgICAgIGxldCB0YWJsZUN1cnNvciA9IGluVGFibGVDdXJzb3IuZ2V0Q3VycmVudE9yUGFyZW50QnlSb2xlQ2xvbmUoW1widGFibGVcIl0pO1xuICAgICAgICBpZiAoIXRhYmxlQ3Vyc29yKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IHdhbGtUYWJsZUN1cnNvciA9IHRhYmxlQ3Vyc29yLmNsb25lKCk7XG5cbiAgICAgICAgbGV0IHJldFZhbDogVGFibGVNb2RlbCA9IFtdOyAgLy8gVGhlIGNvbXBsZXRlIHRhYmxlIG1vZGVsIHdlJ3JlIGJ1aWxkaW5nXG4gICAgICAgIGxldCBjdXJSb3c6IFJvd01vZGVsID0gW107ICAgIC8vIFRoZSBjdXJyZW50IHJvdyBiZWluZyBwcm9jZXNzZWRcbiAgICAgICAgbGV0IHByZXZSb3c6IFJvd01vZGVsOyAgICAgICAgLy8gVGhlIHByZXZpb3VzIHJvdyAobmVlZGVkIGZvciByb3dzcGFuIGhhbmRsaW5nKVxuICAgICAgICBcbiAgICAgICAgLy8gV2FsayB0aHJvdWdoIHRoZSB0YWJsZSdzIERPTSBzdHJ1Y3R1cmVcbiAgICAgICAgd2hpbGUgKHdhbGtUYWJsZUN1cnNvci5uZXh0KCgpID0+IHRydWUpICYmICF3YWxrVGFibGVDdXJzb3IuZ2V0Tm9kZSgpLmlzU2FtZU5vZGUodGFibGVDdXJzb3IuZ2V0Tm9kZSgpKSkge1xuICAgICAgICAgICAgaWYgKHdhbGtUYWJsZUN1cnNvci5pc0VuZFRhZygpICYmIHdhbGtUYWJsZUN1cnNvci5nZXRSb2xlKCkgPT09IFwicm93XCIpIHtcbiAgICAgICAgICAgICAgICAvLyBSZWFjaGVkIHRoZSBlbmQgb2YgdGhlIHJvdywgcHVzaCB3aGF0IHdlIGhhdmUgYW5kIHJlc2V0XG4gICAgICAgICAgICAgICAgcmV0VmFsLnB1c2goY3VyUm93KTtcbiAgICAgICAgICAgICAgICBwcmV2Um93ID0gY3VyUm93O1xuICAgICAgICAgICAgICAgIGN1clJvdyA9IFtdO1xuXG4gICAgICAgICAgICAgICAgLy8gSGFuZGxlIGNlbGxzIHdpdGggcm93c3BhbiBmcm9tIHByZXZpb3VzIHJvd3MgdGhhdCBhZmZlY3QgdGhpcyByb3dcbiAgICAgICAgICAgICAgICAvLyBUaGlzIGVuc3VyZXMgY2VsbHMgc3Bhbm5pbmcgbXVsdGlwbGUgcm93cyBhcmUgcHJvcGVybHkgcmVwcmVzZW50ZWQgaW4gdGhlIG1vZGVsXG4gICAgICAgICAgICAgICAgd2hpbGUgKHByZXZSb3cgJiYgY3VyUm93Lmxlbmd0aCA8IHByZXZSb3cubGVuZ3RoICYmXG4gICAgICAgICAgICAgICAgICAgICAgKChwcmV2Um93W2N1clJvdy5sZW5ndGhdLnJvd0luZGV4U3RhcnQgKyBwcmV2Um93W2N1clJvdy5sZW5ndGhdLnJvd3NwYW4gLSAxKSA+PSByZXRWYWwubGVuZ3RoKSkge1xuICAgICAgICAgICAgICAgICAgICBjdXJSb3cucHVzaChwcmV2Um93W2N1clJvdy5sZW5ndGhdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIFByb2Nlc3MgZWFjaCBjZWxsIGluIHRoZSByb3dcbiAgICAgICAgICAgIGlmICghd2Fsa1RhYmxlQ3Vyc29yLmlzRW5kVGFnKCkgJiYgaXNDdXJzb3JDZWxsUm9sZSh3YWxrVGFibGVDdXJzb3IpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29sc3BhbiA9IGdldENvbFNwYW4od2Fsa1RhYmxlQ3Vyc29yKTtcbiAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBjZWxsIG1vZGVsIHdpdGggcG9zaXRpb24gYW5kIHNwYW5uaW5nIGluZm9ybWF0aW9uXG4gICAgICAgICAgICAgICAgY29uc3QgY2VsbEluZm86IENlbGxNb2RlbCA9IHtcbiAgICAgICAgICAgICAgICAgICAgcm93SW5kZXhTdGFydDogcmV0VmFsLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgY29sSW5kZXhTdGFydDogY3VyUm93Lmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgcm93c3BhbjogZ2V0Um93U3Bhbih3YWxrVGFibGVDdXJzb3IpLFxuICAgICAgICAgICAgICAgICAgICBjb2xzcGFuLFxuICAgICAgICAgICAgICAgICAgICBjZWxsQ3Vyc29yOiB3YWxrVGFibGVDdXJzb3IuY2xvbmUoKVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gRm9yIGNlbGxzIHdpdGggY29sc3BhbiwgYWRkIHRoZSBzYW1lIGNlbGwgaW5mbyB0byBtdWx0aXBsZSBjb2x1bW5zXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaWR4PTA7IGlkeDxjb2xzcGFuOyArK2lkeCkge1xuICAgICAgICAgICAgICAgICAgICBjdXJSb3cucHVzaChjZWxsSW5mbyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIENvbnRpbnVlIGhhbmRsaW5nIGNlbGxzIHdpdGggcm93c3BhbiBmcm9tIHByZXZpb3VzIHJvd3NcbiAgICAgICAgICAgICAgICB3aGlsZSAocHJldlJvdyAmJiBjdXJSb3cubGVuZ3RoIDwgcHJldlJvdy5sZW5ndGggJiZcbiAgICAgICAgICAgICAgICAgICAgICAoKHByZXZSb3dbY3VyUm93Lmxlbmd0aF0ucm93SW5kZXhTdGFydCArIHByZXZSb3dbY3VyUm93Lmxlbmd0aF0ucm93c3BhbiAtIDEpID49IHJldFZhbC5sZW5ndGgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1clJvdy5wdXNoKHByZXZSb3dbY3VyUm93Lmxlbmd0aF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGNlbGwgbW9kZWwgZm9yIGEgc3BlY2lmaWMgY2VsbCBpbiB0aGUgdGFibGVcbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gZmluZHMgdGhlIENlbGxNb2RlbCBvYmplY3QgdGhhdCByZXByZXNlbnRzIGEgc3BlY2lmaWMgY2VsbCxcbiAgICAgKiB3aGljaCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBpdHMgcG9zaXRpb24gYW5kIHNwYW5uaW5nLlxuICAgICAqXG4gICAgICogQHBhcmFtIGluQ2VsbEN1cnNvciAtIEEgY3Vyc29yIHBvaW50aW5nIHRvIGEgY2VsbCBvciBpdHMgY29udGVudHNcbiAgICAgKiBAcGFyYW0gdGFibGVNb2RlbCAtIE9wdGlvbmFsIHByZS1idWlsdCB0YWJsZSBtb2RlbCAod2lsbCBiZSBjcmVhdGVkIGlmIG5vdCBwcm92aWRlZClcbiAgICAgKiBAcmV0dXJucyBUaGUgQ2VsbE1vZGVsIGZvciB0aGUgc3BlY2lmaWVkIGNlbGwsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGdldENlbGxNb2RlbChpbkNlbGxDdXJzb3I6IFNSQ3Vyc29yLCB0YWJsZU1vZGVsPzogVGFibGVNb2RlbCkgOiBDZWxsTW9kZWwge1xuICAgICAgICBsZXQgY2VsbEN1cnNvciA9IGdldEN1cnJlbnRPclBhcmVudENlbGxDdXJzb3IoaW5DZWxsQ3Vyc29yKTtcbiAgICAgICAgaWYgKCF0YWJsZU1vZGVsKSB7XG4gICAgICAgICAgICB0YWJsZU1vZGVsID0gZ2V0VGFibGVNb2RlbChpbkNlbGxDdXJzb3IpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNlYXJjaCB0aHJvdWdoIHRoZSB0YWJsZSBtb2RlbCB0byBmaW5kIHRoZSBtYXRjaGluZyBjZWxsXG4gICAgICAgIGZvciAobGV0IHJvd0luZGV4ID0gMDsgcm93SW5kZXggPCB0YWJsZU1vZGVsLmxlbmd0aDsgKytyb3dJbmRleCkge1xuICAgICAgICAgICAgZm9yIChsZXQgY29sSW5kZXggPSAwOyBjb2xJbmRleCA8IHRhYmxlTW9kZWxbcm93SW5kZXhdLmxlbmd0aDsgKytjb2xJbmRleCkge1xuICAgICAgICAgICAgICAgIGlmICh0YWJsZU1vZGVsW3Jvd0luZGV4XVtjb2xJbmRleF0uY2VsbEN1cnNvci5pc1NhbWVOb2RlKGNlbGxDdXJzb3IpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0YWJsZU1vZGVsW3Jvd0luZGV4XVtjb2xJbmRleF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBhIGNlbGwgc3BhbnMgYSBzcGVjaWZpYyBjb2x1bW5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjZWxsTW9kZWwgLSBUaGUgY2VsbCBtb2RlbCB0byBjaGVja1xuICAgICAqIEBwYXJhbSBjb2xJZHggLSBUaGUgY29sdW1uIGluZGV4IHRvIGNoZWNrXG4gICAgICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgY2VsbCBjb250YWlucyB0aGUgc3BlY2lmaWVkIGNvbHVtblxuICAgICAqL1xuICAgIGV4cG9ydCBmdW5jdGlvbiBjZWxsTW9kZWxDb250YWluc0NvbHVtbihjZWxsTW9kZWw6IENlbGxNb2RlbCwgY29sSWR4OiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIGNvbElkeCA+PSBjZWxsTW9kZWwuY29sSW5kZXhTdGFydCAmJiBjb2xJZHggPCBjZWxsTW9kZWwuY29sSW5kZXhTdGFydCtjZWxsTW9kZWwuY29sc3BhbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYSBjZWxsIHNwYW5zIGEgc3BlY2lmaWMgcm93XG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2VsbE1vZGVsIC0gVGhlIGNlbGwgbW9kZWwgdG8gY2hlY2tcbiAgICAgKiBAcGFyYW0gcm93SWR4IC0gVGhlIHJvdyBpbmRleCB0byBjaGVja1xuICAgICAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGNlbGwgY29udGFpbnMgdGhlIHNwZWNpZmllZCByb3dcbiAgICAgKi9cbiAgICBleHBvcnQgZnVuY3Rpb24gY2VsbE1vZGVsQ29udGFpbnNSb3coY2VsbE1vZGVsOiBDZWxsTW9kZWwsIHJvd0lkeDogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiByb3dJZHggPj0gY2VsbE1vZGVsLnJvd0luZGV4U3RhcnQgJiYgcm93SWR4IDwgY2VsbE1vZGVsLnJvd0luZGV4U3RhcnQrY2VsbE1vZGVsLnJvd3NwYW47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgcm93IGhlYWRlcnMgYXNzb2NpYXRlZCB3aXRoIGEgY2VsbFxuICAgICAqIEZpcnN0IGNoZWNrcyBmb3IgZXhwbGljaXQgaGVhZGVycyBhdHRyaWJ1dGUsIHRoZW4gbG9va3MgZm9yIHJvdyBoZWFkZXJzIGluIHRoZSBzYW1lIHJvd1xuICAgICAqIEBwYXJhbSBjdXJzb3IgLSBUaGUgU1JDdXJzb3IgcG9pbnRpbmcgdG8gYSBjZWxsXG4gICAgICogQHJldHVybnMgQSBzdHJpbmcgY29udGFpbmluZyB0aGUgY29uY2F0ZW5hdGVkIGhlYWRlciBuYW1lc1xuICAgICAqL1xuICAgIGV4cG9ydCBmdW5jdGlvbiBnZXRSb3dIZWFkZXJzKGN1cnNvcjogU1JDdXJzb3IpIHtcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgY29sdW1uIGhlYWRlcnMgYXNzb2NpYXRlZCB3aXRoIGEgY2VsbFxuICAgICAqIEZpcnN0IGNoZWNrcyBmb3IgZXhwbGljaXQgaGVhZGVycyBhdHRyaWJ1dGUsIHRoZW4gbG9va3MgZm9yIGNvbHVtbiBoZWFkZXJzIGluIHRoZSBzYW1lIGNvbHVtblxuICAgICAqIEBwYXJhbSBjdXJzb3IgLSBUaGUgU1JDdXJzb3IgcG9pbnRpbmcgdG8gYSBjZWxsXG4gICAgICogQHJldHVybnMgQSBzdHJpbmcgY29udGFpbmluZyB0aGUgY29uY2F0ZW5hdGVkIGhlYWRlciBuYW1lc1xuICAgICAqL1xuICAgIGV4cG9ydCBmdW5jdGlvbiBnZXRDb2x1bW5IZWFkZXJzRm9yQ3Vyc29yKGluQ2VsbEN1cnNvcjogU1JDdXJzb3IsIHRhYmxlTW9kZWw/OiBUYWJsZU1vZGVsKSB7XG4gICAgICAgIGlmICghdGFibGVNb2RlbCkge1xuICAgICAgICAgICAgdGFibGVNb2RlbCA9IGdldFRhYmxlTW9kZWwoaW5DZWxsQ3Vyc29yKTtcbiAgICAgICAgICAgIGlmICghdGFibGVNb2RlbCkgcmV0dXJuIFwiXCI7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2VsbE1vZGVsID0gZ2V0Q2VsbE1vZGVsKGluQ2VsbEN1cnNvciwgdGFibGVNb2RlbCk7XG4gICAgICAgIGlmICghY2VsbE1vZGVsKSByZXR1cm4gXCJcIjtcblxuICAgICAgICBjb25zdCBjZWxsQ3Vyc29yID0gY2VsbE1vZGVsLmNlbGxDdXJzb3I7XG4gICAgICAgIGlmICghY2VsbEN1cnNvcikgcmV0dXJuIFwiXCI7XG5cbiAgICAgICAgY29uc3QgY2VsbEVsZW0gPSBjZWxsQ3Vyc29yLmdldEVsZW1lbnQoKTtcbiAgICAgICAgaWYgKCFjZWxsRWxlbSkgcmV0dXJuIFwiXCI7XG5cbiAgICAgICAgY29uc3QgY29sRGF0YXM6IEFycmF5PHtcbiAgICAgICAgICAgIHBvdGVudGlhbENvbEhlYWRlcnM6IFNSQ3Vyc29yW10sXG4gICAgICAgICAgICBleGlzdHNEYXRhQ2VsbDogYm9vbGVhbixcbiAgICAgICAgICAgIGNvbElkeDogbnVtYmVyXG4gICAgICAgIH0+ID0gW107XG4gICAgICAgIGZvciAobGV0IGNvbElkeCA9IGNlbGxNb2RlbC5jb2xJbmRleFN0YXJ0OyBjb2xJZHggPCBjZWxsTW9kZWwuY29sSW5kZXhTdGFydCtjZWxsTW9kZWwuY29sc3BhbjsgKytjb2xJZHgpIHtcbiAgICAgICAgICAgIGNvbERhdGFzLnB1c2goe1xuICAgICAgICAgICAgICAgIHBvdGVudGlhbENvbEhlYWRlcnM6IFtdLFxuICAgICAgICAgICAgICAgIGV4aXN0c0RhdGFDZWxsOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBjb2xJZHhcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGxldCBwb3RlbnRpYWxIZWFkZXJzOiBTUkN1cnNvcltdID0gW107XG4gICAgICAgIGlmIChjZWxsRWxlbS5oYXNBdHRyaWJ1dGUoXCJoZWFkZXJzXCIpKSB7XG4gICAgICAgICAgICBwb3RlbnRpYWxIZWFkZXJzID0gY2VsbEVsZW0uZ2V0QXR0cmlidXRlKFwiaGVhZGVyc1wiKVxuICAgICAgICAgICAgICAgIC8vIFNwbGl0IHRoZSBoZWFkZXIgYXR0cmlidXRlIGludG8gaWRzXG4gICAgICAgICAgICAgICAgLnNwbGl0KFwiIFwiKVxuICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgbm9kZSBmb3IgZWFjaCBpZFxuICAgICAgICAgICAgICAgIC5tYXAoaWQgPT4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpKVxuICAgICAgICAgICAgICAgIC8vIEdldCByaWQgb2YgYmFkIG1hcHBpbmdzXG4gICAgICAgICAgICAgICAgLmZpbHRlcihub2RlID0+ICEhbm9kZSlcbiAgICAgICAgICAgICAgICAvLyBDb252ZXJ0IHRvIFNSQ3Vyc29ycyB0byB0aGF0IHdlIGNhbiBnZXQgYWNjZXNzaWJsZSBuYW1lc1xuICAgICAgICAgICAgICAgIC5tYXAobm9kZSA9PiBuZXcgU1JDdXJzb3Iobm9kZSkpXG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIGhlYWRlcnMgdGhhdCBhcmVuJ3QgaW4gdGhlIHNhbWUgY29sdW1uIChpZ25vcmUgY29sdW1uIGhlYWRlcnMpXG4gICAgICAgICAgICAgICAgLmZpbHRlcihjdXJzb3IgPT4gY29sRGF0YXMuc29tZShjb2xEYXRhID0+IGNlbGxNb2RlbENvbnRhaW5zQ29sdW1uKFNSVGFibGVVdGlsLmdldENlbGxNb2RlbChjdXJzb3IsIHRhYmxlTW9kZWwpLCBjb2xEYXRhLmNvbElkeCkpKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gR2V0IGFsbCBjZWxscyBpbiB0aGlzIGNvbHVtblxuICAgICAgICAgICAgLy8gTm90ZSAtIGlmIGV2ZXJ5dGhpbmcgaW4gdGhpcyBjb2x1bW4gaXMgZW1wdHkgb3IgYSBoZWFkZXIgY2VsbCwgdGhpcyBpcyBwcm9iYWJseSBub3QgYSBoZWFkaW5nXG4gICAgICAgICAgICBmb3IgKGxldCByb3dJZHg9MDsgcm93SWR4IDwgdGFibGVNb2RlbC5sZW5ndGg7ICsrcm93SWR4KSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBjb2xEYXRhIG9mIGNvbERhdGFzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbElkeCA9IGNvbERhdGEuY29sSWR4O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGVja0luZm8gPSB0YWJsZU1vZGVsW3Jvd0lkeF1bY29sSWR4XTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hlY2tDdXJzb3IgPSBjaGVja0luZm8uY2VsbEN1cnNvcjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hlY2tDdXJzb3JFbGVtID0gY2hlY2tDdXJzb3IuZ2V0RWxlbWVudCgpO1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIHJvdy9jb2wgaXNuJ3QgZm91bmQsIG9yIGlzIHRoZSBzYW1lIGN1cnNvciBhcyBvdXIgb3JpZ2luYWwgY2VsbCBtb2RlbCwgb3IgYWxyZWFkeSBpbiBvdXIgbGlzdCwgc2tpcCwgYnV0IGNoZWNrIGlmIGl0J3MgYSBkYXRhIGNlbGxcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGVja0luZm8gfHwgIWNoZWNrQ3Vyc29yIHx8IGNoZWNrQ3Vyc29yLmlzU2FtZU5vZGUoY2VsbEN1cnNvcikgfHwgcG90ZW50aWFsSGVhZGVycy5zb21lKGMgPT4gY2hlY2tDdXJzb3IuaXNTYW1lTm9kZShjKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbERhdGEuZXhpc3RzRGF0YUNlbGwgPSBjb2xEYXRhLmV4aXN0c0RhdGFDZWxsIHx8IChpc0RhdGFDZWxsKGNoZWNrQ3Vyc29yKSAmJiAoY2hlY2tDdXJzb3IuaGFzTm9uRW1wdHlOYW1lKCkgfHwgY29sRGF0YS5wb3RlbnRpYWxDb2xIZWFkZXJzLmxlbmd0aCA+IDApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYyA9IGNoZWNrQ3Vyc29yLmNsb25lKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGVja0N1cnNvci5nZXRSb2xlKCkgPT09IFwiY29sdW1uaGVhZGVyXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvdGVudGlhbEhlYWRlcnMucHVzaChjKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbERhdGEucG90ZW50aWFsQ29sSGVhZGVycy5wdXNoKGMpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFjaGVja0N1cnNvckVsZW0uaGFzQXR0cmlidXRlKFwicm9sZVwiKSAmJiBjaGVja0N1cnNvckVsZW0ubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJUSFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tDdXJzb3JFbGVtLmdldEF0dHJpYnV0ZShcInNjb3BlXCIpID09PSBcImNvbFwiIHx8IGNoZWNrQ3Vyc29yRWxlbS5nZXRBdHRyaWJ1dGUoXCJzY29wZVwiKSA9PT0gXCJheGlzXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3RlbnRpYWxIZWFkZXJzLnB1c2goYyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sRGF0YS5wb3RlbnRpYWxDb2xIZWFkZXJzLnB1c2goYyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFjaGVja0N1cnNvckVsZW0uaGFzQXR0cmlidXRlKFwic2NvcGVcIikgJiYgY2hlY2tDdXJzb3IuaGFzTm9uRW1wdHlOYW1lKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3RlbnRpYWxIZWFkZXJzLnB1c2goYyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sRGF0YS5wb3RlbnRpYWxDb2xIZWFkZXJzLnB1c2goYyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xEYXRhLmV4aXN0c0RhdGFDZWxsID0gY29sRGF0YS5leGlzdHNEYXRhQ2VsbCB8fCAoaXNEYXRhQ2VsbChjaGVja0N1cnNvcikgJiYgKGNoZWNrQ3Vyc29yLmhhc05vbkVtcHR5TmFtZSgpIHx8IGNvbERhdGEucG90ZW50aWFsQ29sSGVhZGVycy5sZW5ndGggPiAwKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNvbERhdGEgb2YgY29sRGF0YXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWNvbERhdGEuZXhpc3RzRGF0YUNlbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgY29sRGF0YS5wb3RlbnRpYWxDb2xIZWFkZXJzID0gW107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcG90ZW50aWFsSGVhZGVycyA9IHBvdGVudGlhbEhlYWRlcnMuZmlsdGVyKG9uZSA9PiBjb2xEYXRhcy5zb21lKGNvbERhdGEgPT4gY29sRGF0YS5wb3RlbnRpYWxDb2xIZWFkZXJzLnNvbWUodHdvID0+IHR3by5pc1NhbWVOb2RlKG9uZSkpKSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcG90ZW50aWFsSGVhZGVyc1xuICAgICAgICAgICAgLy8gQW5kIHRoZW4gcmV0dXJuIHRoZSBuYW1lcyBvZiB0aGUgaGVhZGVyc1xuICAgICAgICAgICAgLm1hcChjdXJzb3IgPT4gY3Vyc29yLmdldE5hbWVJbmZvKCk/Lm5hbWUgfHwgXCJcIilcbiAgICAgICAgICAgIC5tYXAocyA9PiBzLnRyaW0oKSlcbiAgICAgICAgICAgIC5maWx0ZXIocyA9PiBzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAuam9pbihcIiwgXCIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHJvdyBoZWFkZXJzIGFzc29jaWF0ZWQgd2l0aCBhIGNlbGxcbiAgICAgKiBGaXJzdCBjaGVja3MgZm9yIGV4cGxpY2l0IGhlYWRlcnMgYXR0cmlidXRlLCB0aGVuIGxvb2tzIGZvciByb3cgaGVhZGVycyBpbiB0aGUgc2FtZSByb3dcbiAgICAgKiBAcGFyYW0gY3Vyc29yIC0gVGhlIFNSQ3Vyc29yIHBvaW50aW5nIHRvIGEgY2VsbFxuICAgICAqIEByZXR1cm5zIEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGNvbmNhdGVuYXRlZCBoZWFkZXIgbmFtZXNcbiAgICAgKi9cbiAgICBleHBvcnQgZnVuY3Rpb24gZ2V0Um93SGVhZGVyc0ZvckN1cnNvcihpbkNlbGxDdXJzb3I6IFNSQ3Vyc29yLCB0YWJsZU1vZGVsPzogVGFibGVNb2RlbCkge1xuICAgICAgICBpZiAoIXRhYmxlTW9kZWwpIHtcbiAgICAgICAgICAgIHRhYmxlTW9kZWwgPSBnZXRUYWJsZU1vZGVsKGluQ2VsbEN1cnNvcik7XG4gICAgICAgICAgICBpZiAoIXRhYmxlTW9kZWwpIHJldHVybiBcIlwiO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNlbGxNb2RlbCA9IGdldENlbGxNb2RlbChpbkNlbGxDdXJzb3IsIHRhYmxlTW9kZWwpO1xuICAgICAgICBpZiAoIWNlbGxNb2RlbCkgcmV0dXJuIFwiXCI7XG5cbiAgICAgICAgY29uc3QgY2VsbEN1cnNvciA9IGNlbGxNb2RlbC5jZWxsQ3Vyc29yO1xuICAgICAgICBpZiAoIWNlbGxDdXJzb3IpIHJldHVybiBcIlwiO1xuXG4gICAgICAgIGNvbnN0IGNlbGxFbGVtID0gY2VsbEN1cnNvci5nZXRFbGVtZW50KCk7XG4gICAgICAgIGlmICghY2VsbEVsZW0pIHJldHVybiBcIlwiO1xuXG4gICAgICAgIGNvbnN0IHJvd0RhdGFzOiBBcnJheTx7XG4gICAgICAgICAgICBwb3RlbnRpYWxSb3dIZWFkZXJzOiBTUkN1cnNvcltdLFxuICAgICAgICAgICAgZXhpc3RzRGF0YUNlbGw6IGJvb2xlYW4sXG4gICAgICAgICAgICByb3dJZHg6IG51bWJlclxuICAgICAgICB9PiA9IFtdO1xuICAgICAgICBmb3IgKGxldCByb3dJZHggPSBjZWxsTW9kZWwucm93SW5kZXhTdGFydDsgcm93SWR4IDwgY2VsbE1vZGVsLnJvd0luZGV4U3RhcnQrY2VsbE1vZGVsLnJvd3NwYW47ICsrcm93SWR4KSB7XG4gICAgICAgICAgICByb3dEYXRhcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBwb3RlbnRpYWxSb3dIZWFkZXJzOiBbXSxcbiAgICAgICAgICAgICAgICBleGlzdHNEYXRhQ2VsbDogZmFsc2UsXG4gICAgICAgICAgICAgICAgcm93SWR4XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwb3RlbnRpYWxIZWFkZXJzOiBTUkN1cnNvcltdID0gW107XG4gICAgICAgIGlmIChjZWxsRWxlbS5oYXNBdHRyaWJ1dGUoXCJoZWFkZXJzXCIpKSB7XG4gICAgICAgICAgICBwb3RlbnRpYWxIZWFkZXJzID0gY2VsbEVsZW0uZ2V0QXR0cmlidXRlKFwiaGVhZGVyc1wiKVxuICAgICAgICAgICAgICAgIC8vIFNwbGl0IHRoZSBoZWFkZXIgYXR0cmlidXRlIGludG8gaWRzXG4gICAgICAgICAgICAgICAgLnNwbGl0KFwiIFwiKVxuICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgbm9kZSBmb3IgZWFjaCBpZFxuICAgICAgICAgICAgICAgIC5tYXAoaWQgPT4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpKVxuICAgICAgICAgICAgICAgIC8vIEdldCByaWQgb2YgYmFkIG1hcHBpbmdzXG4gICAgICAgICAgICAgICAgLmZpbHRlcihub2RlID0+ICEhbm9kZSlcbiAgICAgICAgICAgICAgICAvLyBDb252ZXJ0IHRvIFNSQ3Vyc29ycyB0byB0aGF0IHdlIGNhbiBnZXQgYWNjZXNzaWJsZSBuYW1lc1xuICAgICAgICAgICAgICAgIC5tYXAobm9kZSA9PiBuZXcgU1JDdXJzb3Iobm9kZSkpXG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIGhlYWRlcnMgdGhhdCBhcmVuJ3QgaW4gdGhlIHNhbWUgcm93IChpZ25vcmUgY29sdW1uIGhlYWRlcnMpXG4gICAgICAgICAgICAgICAgLmZpbHRlcihjdXJzb3IgPT4gcm93RGF0YXMuc29tZShyb3dEYXRhID0+IGNlbGxNb2RlbENvbnRhaW5zUm93KFNSVGFibGVVdGlsLmdldENlbGxNb2RlbChjdXJzb3IsIHRhYmxlTW9kZWwpLCByb3dEYXRhLnJvd0lkeCkpKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gR2V0IGFsbCBjZWxscyBpbiB0aGUgcm93c1xuICAgICAgICAgICAgLy8gTm90ZSAtIGlmIGV2ZXJ5dGhpbmcgaW4gdGhlIHJvdyBpcyBlbXB0eSBvciBhIGhlYWRlciBjZWxsLCB0aGlzIGlzIHByb2JhYmx5IG5vdCBhIGhlYWRpbmdcbiAgICAgICAgICAgIGxldCBsb25nZXN0Um93ID0gcm93RGF0YXMucmVkdWNlKChwcmV2LCBjdXIpID0+IE1hdGgubWF4KHByZXYsIHRhYmxlTW9kZWxbY3VyLnJvd0lkeF0ubGVuZ3RoKSwgMCk7XG4gICAgICAgICAgICBmb3IgKGxldCBjb2xJZHg9MDsgY29sSWR4IDwgbG9uZ2VzdFJvdzsgKytjb2xJZHgpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHJvd0RhdGEgb2Ygcm93RGF0YXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgcm93SWR4ID0gcm93RGF0YS5yb3dJZHg7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb2xJZHggPj0gdGFibGVNb2RlbFtyb3dJZHhdLmxlbmd0aCkgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoZWNrSW5mbyA9IHRhYmxlTW9kZWxbcm93SWR4XVtjb2xJZHhdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGVja0N1cnNvciA9IGNoZWNrSW5mby5jZWxsQ3Vyc29yO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGVja0N1cnNvckVsZW0gPSBjaGVja0N1cnNvci5nZXRFbGVtZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgcm93L2NvbCBpc24ndCBmb3VuZCwgb3IgaXMgdGhlIHNhbWUgY3Vyc29yIGFzIG91ciBvcmlnaW5hbCBjZWxsIG1vZGVsLCBvciBhbHJlYWR5IGluIG91ciBsaXN0LCBza2lwLCBidXQgY2hlY2sgaWYgaXQncyBhIGRhdGEgY2VsbFxuICAgICAgICAgICAgICAgICAgICBpZiAoIWNoZWNrSW5mbyB8fCAhY2hlY2tDdXJzb3IgfHwgY2hlY2tDdXJzb3IuaXNTYW1lTm9kZShjZWxsQ3Vyc29yKSB8fCBwb3RlbnRpYWxIZWFkZXJzLnNvbWUoYyA9PiBjaGVja0N1cnNvci5pc1NhbWVOb2RlKGMpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcm93RGF0YS5leGlzdHNEYXRhQ2VsbCA9IHJvd0RhdGEuZXhpc3RzRGF0YUNlbGwgfHwgKGlzRGF0YUNlbGwoY2hlY2tDdXJzb3IpICYmIChjaGVja0N1cnNvci5oYXNOb25FbXB0eU5hbWUoKSB8fCByb3dEYXRhLnBvdGVudGlhbFJvd0hlYWRlcnMubGVuZ3RoID4gMCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjID0gY2hlY2tDdXJzb3IuY2xvbmUoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoZWNrQ3Vyc29yLmdldFJvbGUoKSA9PT0gXCJyb3doZWFkZXJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcG90ZW50aWFsSGVhZGVycy5wdXNoKGMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcm93RGF0YS5wb3RlbnRpYWxSb3dIZWFkZXJzLnB1c2goYyk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWNoZWNrQ3Vyc29yRWxlbS5oYXNBdHRyaWJ1dGUoXCJyb2xlXCIpICYmIGNoZWNrQ3Vyc29yRWxlbS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIlRIXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGVja0N1cnNvckVsZW0uZ2V0QXR0cmlidXRlKFwic2NvcGVcIikgPT09IFwicm93XCIgfHwgY2hlY2tDdXJzb3JFbGVtLmdldEF0dHJpYnV0ZShcInNjb3BlXCIpID09PSBcImF4aXNcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvdGVudGlhbEhlYWRlcnMucHVzaChjKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dEYXRhLnBvdGVudGlhbFJvd0hlYWRlcnMucHVzaChjKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWNoZWNrQ3Vyc29yRWxlbS5oYXNBdHRyaWJ1dGUoXCJzY29wZVwiKSAmJiBjaGVja0N1cnNvci5oYXNOb25FbXB0eU5hbWUoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvdGVudGlhbEhlYWRlcnMucHVzaChjKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dEYXRhLnBvdGVudGlhbFJvd0hlYWRlcnMucHVzaChjKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvd0RhdGEuZXhpc3RzRGF0YUNlbGwgPSByb3dEYXRhLmV4aXN0c0RhdGFDZWxsIHx8IChpc0RhdGFDZWxsKGNoZWNrQ3Vyc29yKSAmJiAoY2hlY2tDdXJzb3IuaGFzTm9uRW1wdHlOYW1lKCkgfHwgcm93RGF0YS5wb3RlbnRpYWxSb3dIZWFkZXJzLmxlbmd0aCA+IDApKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoY29uc3Qgcm93RGF0YSBvZiByb3dEYXRhcykge1xuICAgICAgICAgICAgICAgIGlmICghcm93RGF0YS5leGlzdHNEYXRhQ2VsbCkge1xuICAgICAgICAgICAgICAgICAgICByb3dEYXRhLnBvdGVudGlhbFJvd0hlYWRlcnMgPSBbXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwb3RlbnRpYWxIZWFkZXJzID0gcG90ZW50aWFsSGVhZGVycy5maWx0ZXIob25lID0+IHJvd0RhdGFzLnNvbWUocm93RGF0YSA9PiByb3dEYXRhLnBvdGVudGlhbFJvd0hlYWRlcnMuc29tZSh0d28gPT4gdHdvLmlzU2FtZU5vZGUob25lKSkpKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwb3RlbnRpYWxIZWFkZXJzXG4gICAgICAgICAgICAvLyBBbmQgdGhlbiByZXR1cm4gdGhlIG5hbWVzIG9mIHRoZSBoZWFkZXJzXG4gICAgICAgICAgICAubWFwKGN1cnNvciA9PiBjdXJzb3IuZ2V0TmFtZUluZm8oKT8ubmFtZSB8fCBcIlwiKVxuICAgICAgICAgICAgLm1hcChzID0+IHMudHJpbSgpKVxuICAgICAgICAgICAgLmZpbHRlcihzID0+IHMubGVuZ3RoID4gMClcbiAgICAgICAgICAgIC5qb2luKFwiLCBcIik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyBpZiBhIGNlbGwgaXMgYSBkYXRhIGNlbGwgKG5vdCBhIGhlYWRlciBjZWxsKVxuICAgICAqXG4gICAgICogQSBkYXRhIGNlbGwgaXMgb25lIHdpdGggZWl0aGVyOlxuICAgICAqIC0gQW4gZXhwbGljaXQgQVJJQSByb2xlIG9mIFwiY2VsbFwiXG4gICAgICogLSBBIFREIGVsZW1lbnQgd2l0aG91dCBhbiBvdmVycmlkaW5nIHJvbGUgYXR0cmlidXRlXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2hlY2tDdXJzb3IgLSBUaGUgY3Vyc29yIHRvIGNoZWNrXG4gICAgICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgY3Vyc29yIHBvaW50cyB0byBhIGRhdGEgY2VsbFxuICAgICAqL1xuICAgIGV4cG9ydCBmdW5jdGlvbiBpc0RhdGFDZWxsKGNoZWNrQ3Vyc29yOiBTUkN1cnNvcikge1xuICAgICAgICBjb25zdCBjaGVja0N1cnNvckVsZW0gPSBjaGVja0N1cnNvci5nZXRFbGVtZW50KCk7XG4gICAgICAgIGlmICghY2hlY2tDdXJzb3JFbGVtKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiBjaGVja0N1cnNvci5nZXRSb2xlKCkgPT09IFwiY2VsbFwiIHx8ICghY2hlY2tDdXJzb3JFbGVtLmhhc0F0dHJpYnV0ZShcInJvbGVcIikgJiYgY2hlY2tDdXJzb3JFbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiVERcIik7XG4gICAgfVxufSIsImltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBuYW1lc3BhY2UgU1JVdGlsIHtcbiAgICBleHBvcnQgZnVuY3Rpb24gaXNNb2RhbERpYWxvZ0VsZW1lbnQobm9kZTogTm9kZSkge1xuICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSAhPT0gMSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjb25zdCBlbGVtID0gbm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgY29uc3Qgcm9sZSA9IEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZShlbGVtLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIHJvbGUgPT09IFwiZGlhbG9nXCIgJiYgZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLW1vZGFsXCIpID09PSBcInRydWVcIiAmJiBWaXNVdGlsLmlzTm9kZVZpc2libGUobm9kZSlcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZXMgYSB1bmlxdWUgQ1NTIHNlbGVjdG9yIGZvciBhIHNwZWNpZmljIEhUTUwgZWxlbWVudFxuICAgICAqIFRoZSBzZWxlY3RvciBpcyBidWlsdCB1c2luZyBhIGNvbWJpbmF0aW9uIG9mOlxuICAgICAqIDEuIEVsZW1lbnQgdGFnIG5hbWVcbiAgICAgKiAyLiBJRCAoaWYgYXZhaWxhYmxlKVxuICAgICAqIDMuIENsYXNzZXMgKGlmIGF2YWlsYWJsZSlcbiAgICAgKiA0LiBBdHRyaWJ1dGVzIChpZiBuZWVkZWQpXG4gICAgICogNS4gbnRoLWNoaWxkIHNlbGVjdG9ycyBmb3IgcG9zaXRpb24gaW4gcGFyZW50XG4gICAgICogXG4gICAgICogQHBhcmFtIGVsZW1lbnQgVGhlIEhUTUwgZWxlbWVudCB0byBnZW5lcmF0ZSBhIHNlbGVjdG9yIGZvclxuICAgICAqIEBwYXJhbSBvcHRpbWl6ZWQgSWYgdHJ1ZSwgY3JlYXRlcyBhIHNob3J0ZXIgYnV0IHBvc3NpYmx5IGxlc3Mgcm9idXN0IHNlbGVjdG9yXG4gICAgICogQHJldHVybiBBIENTUyBzZWxlY3RvciBzdHJpbmcgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIHRoZSBlbGVtZW50XG4gICAgICovXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGdldFVuaXF1ZVNlbGVjdG9yKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBvcHRpbWl6ZWQ6IGJvb2xlYW4gPSBmYWxzZSk6IHN0cmluZyB7XG4gICAgICAgIC8vIElmIHRoZSBlbGVtZW50IGhhcyBhbiBJRCwgdGhhdCdzIHRoZSBtb3N0IGRpcmVjdCB3YXkgdG8gc2VsZWN0IGl0XG4gICAgICAgIGlmIChlbGVtZW50LmlkKSB7XG4gICAgICAgICAgICByZXR1cm4gYCMke0NTUy5lc2NhcGUoZWxlbWVudC5pZCl9YDtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gSWYgd2UncmUgYXQgdGhlIHJvb3Qgb3IgZG9jdW1lbnQgZWxlbWVudCwgcmV0dXJuIHRoZSB0YWcgbmFtZVxuICAgICAgICBpZiAoZWxlbWVudC5pc1NhbWVOb2RlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkgfHwgZWxlbWVudC5pc1NhbWVOb2RlKGRvY3VtZW50LmJvZHkpKSB7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIFN0YXJ0IGJ1aWxkaW5nIHRoZSBzZWxlY3RvciB3aXRoIHRoZSB0YWcgbmFtZVxuICAgICAgICBsZXQgc2VsZWN0b3IgPSBlbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgXG4gICAgICAgIC8vIEFkZCBjbGFzc2VzIGlmIGF2YWlsYWJsZSBhbmQgd2UncmUgbm90IG9wdGltaXppbmcgZm9yIGJyZXZpdHlcbiAgICAgICAgaWYgKGVsZW1lbnQuY2xhc3NMaXN0Lmxlbmd0aCAmJiAhb3B0aW1pemVkKSB7XG4gICAgICAgICAgICAvLyBUYWtlIHVwIHRvIDMgY2xhc3NlcyB0byBhdm9pZCBvdmVybHkgc3BlY2lmaWMgc2VsZWN0b3JzXG4gICAgICAgICAgICBjb25zdCBjbGFzc2VzID0gQXJyYXkuZnJvbShlbGVtZW50LmNsYXNzTGlzdCkuc2xpY2UoMCwgMyk7XG4gICAgICAgICAgICBzZWxlY3RvciArPSBjbGFzc2VzLm1hcChjbHMgPT4gYC4ke0NTUy5lc2NhcGUoY2xzKX1gKS5qb2luKCcnKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gQWRkIGRpc3Rpbmd1aXNoaW5nIGF0dHJpYnV0ZXMgaWYgbmVlZGVkIGFuZCBub3Qgb3B0aW1pemluZ1xuICAgICAgICBpZiAoIW9wdGltaXplZCkge1xuICAgICAgICAgICAgLy8gQ29uc2lkZXIgYWRkaW5nIHJvbGUsIGFyaWEtbGFiZWwsIG9yIG90aGVyIGRpc3RpbmN0aXZlIGF0dHJpYnV0ZXNcbiAgICAgICAgICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZSgncm9sZScpKSB7XG4gICAgICAgICAgICAgICAgc2VsZWN0b3IgKz0gYFtyb2xlPVwiJHtDU1MuZXNjYXBlKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdyb2xlJykgfHwgJycpfVwiXWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZSgnYXJpYS1sYWJlbCcpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGFiZWwgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcpIHx8ICcnO1xuICAgICAgICAgICAgICAgIGlmIChsYWJlbC5sZW5ndGggPD0gMjApIHsgLy8gQXZvaWQgb3Zlcmx5IGxvbmcgc2VsZWN0b3JzXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yICs9IGBbYXJpYS1sYWJlbD1cIiR7Q1NTLmVzY2FwZShsYWJlbCl9XCJdYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIEZvciBpbnB1dHMsIGFkZCB0eXBlIGF0dHJpYnV0ZVxuICAgICAgICAgICAgaWYgKGVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnaW5wdXQnICYmIGVsZW1lbnQuaGFzQXR0cmlidXRlKCd0eXBlJykpIHtcbiAgICAgICAgICAgICAgICBzZWxlY3RvciArPSBgW3R5cGU9XCIke0NTUy5lc2NhcGUoZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3R5cGUnKSB8fCAnJyl9XCJdYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIHBhcmVudCBub2RlLCBkZXRlcm1pbmUgcG9zaXRpb24gYW1vbmcgc2libGluZ3NcbiAgICAgICAgaWYgKGVsZW1lbnQucGFyZW50RWxlbWVudCkge1xuICAgICAgICAgICAgLy8gRmluZCBhbGwgc2libGluZ3Mgd2l0aCB0aGUgc2FtZSB0YWdcbiAgICAgICAgICAgIGNvbnN0IHNpYmxpbmdzID0gQXJyYXkuZnJvbShlbGVtZW50LnBhcmVudEVsZW1lbnQuY2hpbGRyZW4pXG4gICAgICAgICAgICAgICAgLmZpbHRlcihjaGlsZCA9PiBjaGlsZC50YWdOYW1lID09PSBlbGVtZW50LnRhZ05hbWUpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBJZiB0aGVyZSdzIG1vcmUgdGhhbiBvbmUgc2libGluZyB3aXRoIHRoZSBzYW1lIHRhZywgYWRkIG50aC1jaGlsZFxuICAgICAgICAgICAgaWYgKHNpYmxpbmdzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IHNpYmxpbmdzLmluZGV4T2YoZWxlbWVudCkgKyAxO1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yICs9IGA6bnRoLW9mLXR5cGUoJHtpbmRleH0pYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gSWYgd2UncmUgbm90IGF0IHRoZSByb290LCByZWN1cnNpdmVseSBidWlsZCB0aGUgcGFyZW50IHNlbGVjdG9yXG4gICAgICAgICAgICAvLyBidXQgdXNlIG9wdGltaXplZCBzZWxlY3RvcnMgZm9yIGFuY2VzdG9ycyB0byBrZWVwIHRoZSBvdmVyYWxsIHNlbGVjdG9yIG1hbmFnZWFibGVcbiAgICAgICAgICAgIHJldHVybiBgJHtnZXRVbmlxdWVTZWxlY3RvcihlbGVtZW50LnBhcmVudEVsZW1lbnQsIHRydWUpfSA+ICR7c2VsZWN0b3J9YDtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHNlbGVjdG9yO1xuICAgIH1cbn0iLCJpbXBvcnQgeyBTUkNvbnRyb2xsZXIgfSBmcm9tIFwiLi9TUkNvbnRyb2xsZXJcIjtcbmltcG9ydCB7IE5hdmlnYXRpb25Nb2RlLCBOYXZpZ2F0aW9uUmVzdWx0IH0gZnJvbSBcIi4vU1JUeXBlc1wiO1xuXG4vKipcbiAqIFNST3ZlcmxheSBjbGFzcyBmb3IgY3JlYXRpbmcgYSBVSSB3aWRnZXQgdG8gY29udHJvbCBzY3JlZW4gcmVhZGVyIHNpbXVsYXRpb25cbiAqIFByb3ZpZGVzIGJ1dHRvbnMgZm9yIG5hdmlnYXRpb24gYW5kIGRpc3BsYXlzIHJlc3VsdHNcbiAqL1xuZXhwb3J0IGNsYXNzIFNST3ZlcmxheSB7XG4gICAgLyoqIFRoZSBjb250YWluZXIgZWxlbWVudCBmb3IgdGhlIG92ZXJsYXkgKi9cbiAgICBwcml2YXRlIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XG4gICAgLyoqIFRoZSByZXN1bHRzIGRpc3BsYXkgZWxlbWVudCAqL1xuICAgIHByaXZhdGUgcmVzdWx0c0Rpc3BsYXk6IEhUTUxFbGVtZW50O1xuICAgIC8qKiBOYXZpZ2F0aW9uIG1vZGVzIGF2YWlsYWJsZSBpbiB0aGUgVUkgKi9cbiAgICBwcml2YXRlIG5hdmlnYXRpb25Nb2RlczogeyBtb2RlOiBOYXZpZ2F0aW9uTW9kZSwgbGFiZWw6IHN0cmluZyB9W10gPSBbXG4gICAgICAgIHsgbW9kZTogXCJpdGVtXCIsIGxhYmVsOiBcIkl0ZW1cIiB9LFxuICAgICAgICB7IG1vZGU6IFwidGFiX2ZvY3VzXCIsIGxhYmVsOiBcIlRhYmJhYmxlXCIgfSxcbiAgICAgICAgeyBtb2RlOiBcImhlYWRpbmdcIiwgbGFiZWw6IFwiSGVhZGluZ1wiIH0sXG4gICAgICAgIHsgbW9kZTogXCJyZWdpb25cIiwgbGFiZWw6IFwiUmVnaW9uXCIgfVxuICAgIF07XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IFNST3ZlcmxheVxuICAgICAqIEBwYXJhbSBjb250cm9sbGVyIFRoZSBTUkNvbnRyb2xsZXIgaW5zdGFuY2UgdG8gdXNlIGZvciBuYXZpZ2F0aW9uXG4gICAgICovXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBzclZpZXdlcjogU1JWaWV3ZXIpIHtcbiAgICAgICAgdGhpcy5jcmVhdGVPdmVybGF5KCk7XG4gICAgfVxuXG5cbiAgICBwcml2YXRlIGNyZWF0ZURPTUVsZW1lbnQoZWxlbU5hbWU6IHN0cmluZywgYXR0cnM6IHsgW2F0dHI6IHN0cmluZ106IHN0cmluZ30sIHN0eWxlczogUGFydGlhbDxDU1NTdHlsZURlY2xhcmF0aW9uPikge1xuICAgICAgICBsZXQgcmV0VmFsID0gdGhpcy5zclZpZXdlci52aWV3ZXJEb2MuY3JlYXRlRWxlbWVudChlbGVtTmFtZSk7XG4gICAgICAgIGlmIChhdHRycykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gYXR0cnMpIHtcbiAgICAgICAgICAgICAgICByZXRWYWxba2V5XSA9IGF0dHJzW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0eWxlcykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gc3R5bGVzKSB7XG4gICAgICAgICAgICAgICAgcmV0VmFsLnN0eWxlW2tleV0gPSBzdHlsZXNba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdGhlIG92ZXJsYXkgVUkgZWxlbWVudHMgYW5kIGFkZHMgdGhlbSB0byB0aGUgRE9NXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVPdmVybGF5KCk6IHZvaWQge1xuICAgICAgICAvLyBDcmVhdGUgbWFpbiBjb250YWluZXJcbiAgICAgICAgdGhpcy5jb250YWluZXIgPSB0aGlzLmNyZWF0ZURPTUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICAgICAgY2xhc3NOYW1lOiBcImlibWEtc3Itb3ZlcmxheVwiXG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIHBvc2l0aW9uOiAnZml4ZWQnLFxuICAgICAgICAgICAgYm90dG9tOiAnMCcsXG4gICAgICAgICAgICBsZWZ0OiAnMCcsXG4gICAgICAgICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAncmdiYSgwLCAwLCAwLCAwLjgpJyxcbiAgICAgICAgICAgIGNvbG9yOiAnd2hpdGUnLFxuICAgICAgICAgICAgcGFkZGluZzogJzEwcHgnLFxuICAgICAgICAgICAgekluZGV4OiAnMTAwMDAnLFxuICAgICAgICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgICAgICAgZmxleERpcmVjdGlvbjogJ2NvbHVtbicsXG4gICAgICAgICAgICBnYXA6ICcxMHB4J1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBDcmVhdGUgY29udHJvbHMgY29udGFpbmVyXG4gICAgICAgIGNvbnN0IGNvbnRyb2xzQ29udGFpbmVyID0gdGhpcy5jcmVhdGVET01FbGVtZW50KFwiZGl2XCIsIHt9LCB7IFxuICAgICAgICAgICAgZGlzcGxheTogXCJmbGV4XCIsIGZsZXhXcmFwOiBcIndyYXBcIiwgZ2FwOiBcIjEwcHhcIn0pO1xuXG4gICAgICAgIC8vIENyZWF0ZSBuYXZpZ2F0aW9uIG1vZGUgZ3JvdXBzXG4gICAgICAgIHRoaXMubmF2aWdhdGlvbk1vZGVzLmZvckVhY2gobmF2TW9kZSA9PiB7XG4gICAgICAgICAgICBjb25zdCBtb2RlR3JvdXAgPSB0aGlzLmNyZWF0ZURPTUVsZW1lbnQoJ2RpdicsIHt9LCB7XG4gICAgICAgICAgICAgICAgZGlzcGxheTogXCJmbGV4XCIsXG4gICAgICAgICAgICAgICAgYWxpZ25JdGVtczogJ2NlbnRlcicsXG4gICAgICAgICAgICAgICAgZ2FwOiAnNXB4JyxcbiAgICAgICAgICAgICAgICBtYXJnaW46ICcwIDEwcHgnXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgbW9kZUdyb3VwLmFwcGVuZENoaWxkKHRoaXMuY3JlYXRlRE9NRWxlbWVudCgnc3BhbicsIHtcbiAgICAgICAgICAgICAgICB0ZXh0Q29udGVudDogbmF2TW9kZS5sYWJlbCArIFwiOlwiXG4gICAgICAgICAgICB9LCB7fSkpO1xuXG4gICAgICAgICAgICAvLyBQcmV2aW91cyBidXR0b25cbiAgICAgICAgICAgIGNvbnN0IHByZXZCdXR0b24gPSB0aGlzLmNyZWF0ZURPTUVsZW1lbnQoJ2J1dHRvbicsIHtcbiAgICAgICAgICAgICAgICB0ZXh0Q29udGVudDogJ+KXgCBQcmV2J1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIHBhZGRpbmc6ICc1cHggMTBweCcsXG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAnIzQ0NCcsXG4gICAgICAgICAgICAgICAgY29sb3I6ICd3aGl0ZScsXG4gICAgICAgICAgICAgICAgYm9yZGVyOiAnbm9uZScsXG4gICAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiAnM3B4JyxcbiAgICAgICAgICAgICAgICBjdXJzb3I6ICdwb2ludGVyJ1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBwcmV2QnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5zclZpZXdlci5uYXZpZ2F0ZVByZXZpb3VzKG5hdk1vZGUubW9kZSkpO1xuICAgICAgICAgICAgbW9kZUdyb3VwLmFwcGVuZENoaWxkKHByZXZCdXR0b24pO1xuXG4gICAgICAgICAgICAvLyBOZXh0IGJ1dHRvblxuICAgICAgICAgICAgY29uc3QgbmV4dEJ1dHRvbiA9IHRoaXMuY3JlYXRlRE9NRWxlbWVudCgnYnV0dG9uJywge1xuICAgICAgICAgICAgICAgIHRleHRDb250ZW50OiAnTmV4dCDilrYnXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgcGFkZGluZzogJzVweCAxMHB4JyxcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICcjNDQ0JyxcbiAgICAgICAgICAgICAgICBjb2xvcjogJ3doaXRlJyxcbiAgICAgICAgICAgICAgICBib3JkZXI6ICdub25lJyxcbiAgICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6ICczcHgnLFxuICAgICAgICAgICAgICAgIGN1cnNvcjogJ3BvaW50ZXInXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG5leHRCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB0aGlzLnNyVmlld2VyLm5hdmlnYXRlTmV4dChuYXZNb2RlLm1vZGUpKTtcbiAgICAgICAgICAgIG1vZGVHcm91cC5hcHBlbmRDaGlsZChuZXh0QnV0dG9uKTtcblxuICAgICAgICAgICAgY29udHJvbHNDb250YWluZXIuYXBwZW5kQ2hpbGQobW9kZUdyb3VwKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGxldCBvdGhlckJ1dHRvbkdyb3VwID0gdGhpcy5jcmVhdGVET01FbGVtZW50KCdkaXYnLCB7fSwge1xuICAgICAgICAgICAgZGlzcGxheTogXCJmbGV4XCIsXG4gICAgICAgICAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgICAgICAgICAgIGdhcDogJzVweCcsXG4gICAgICAgICAgICBtYXJnaW46ICcwIDEwcHgnXG4gICAgICAgIH0pXG4gICAgICAgIC8vIFNob3cgYWxsIGJ1dHRvblxuICAgICAgICBjb25zdCBzaG93QWxsQnV0dG9uID0gdGhpcy5jcmVhdGVET01FbGVtZW50KCdidXR0b24nLCB7XG4gICAgICAgICAgICB0ZXh0Q29udGVudDogJ1Nob3cgYWxsJ1xuICAgICAgICB9LCB7XG4gICAgICAgICAgICBwYWRkaW5nOiAnNXB4IDEwcHgnLFxuICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAnIzQ0NCcsXG4gICAgICAgICAgICBjb2xvcjogJ3doaXRlJyxcbiAgICAgICAgICAgIGJvcmRlcjogJ25vbmUnLFxuICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiAnM3B4JyxcbiAgICAgICAgICAgIGN1cnNvcjogJ3BvaW50ZXInXG4gICAgICAgIH0pO1xuICAgICAgICBzaG93QWxsQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5zclZpZXdlci5zaG93QWxsKHRydWUpKTtcbiAgICAgICAgb3RoZXJCdXR0b25Hcm91cC5hcHBlbmRDaGlsZChzaG93QWxsQnV0dG9uKTtcblxuICAgICAgICAvLyBUb2dnbGUgU3BlZWNoIEJ1dHRvblxuICAgICAgICBjb25zdCB0b2dnbGVTcGVlY2ggPSB0aGlzLmNyZWF0ZURPTUVsZW1lbnQoJ2J1dHRvbicsIHtcbiAgICAgICAgICAgIHRleHRDb250ZW50OiAnVG9nZ2xlIHNwZWVjaCdcbiAgICAgICAgfSwge1xuICAgICAgICAgICAgcGFkZGluZzogJzVweCAxMHB4JyxcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJyM0NDQnLFxuICAgICAgICAgICAgY29sb3I6ICd3aGl0ZScsXG4gICAgICAgICAgICBib3JkZXI6ICdub25lJyxcbiAgICAgICAgICAgIGJvcmRlclJhZGl1czogJzNweCcsXG4gICAgICAgICAgICBjdXJzb3I6ICdwb2ludGVyJ1xuICAgICAgICB9KTtcbiAgICAgICAgdG9nZ2xlU3BlZWNoLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5zclZpZXdlci50b2dnbGVTcGVlY2goKSk7XG4gICAgICAgIG90aGVyQnV0dG9uR3JvdXAuYXBwZW5kQ2hpbGQodG9nZ2xlU3BlZWNoKTtcbiAgICAgICAgY29udHJvbHNDb250YWluZXIuYXBwZW5kQ2hpbGQob3RoZXJCdXR0b25Hcm91cCk7XG5cblxuICAgICAgICAvLyBDcmVhdGUgcmVzdWx0cyBkaXNwbGF5XG4gICAgICAgIHRoaXMucmVzdWx0c0Rpc3BsYXkgPSB0aGlzLmNyZWF0ZURPTUVsZW1lbnQoJ2RpdicsIHtcbiAgICAgICAgICAgIHRleHRDb250ZW50OiAnU2NyZWVuIHJlYWRlciBzaW11bGF0aW9uIHJlc3VsdHMgd2lsbCBhcHBlYXIgaGVyZS4nXG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIHBhZGRpbmc6ICcxMHB4JyxcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJ3JnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKScsXG4gICAgICAgICAgICBib3JkZXJSYWRpdXM6ICczcHgnLFxuICAgICAgICAgICAgbWluSGVpZ2h0OiAnMTAwcHgnLFxuICAgICAgICAgICAgbWF4SGVpZ2h0OiAnNTB2aCcsXG4gICAgICAgICAgICBmb250RmFtaWx5OiAnbW9ub3NwYWNlJyxcbiAgICAgICAgICAgIG92ZXJmbG93OiAnYXV0bydcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gQWRkIGVsZW1lbnRzIHRvIGNvbnRhaW5lclxuICAgICAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZChjb250cm9sc0NvbnRhaW5lcik7XG4gICAgICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMucmVzdWx0c0Rpc3BsYXkpO1xuXG4gICAgICAgIC8vIEFkZCB0byBkb2N1bWVudFxuICAgICAgICB0aGlzLnNyVmlld2VyLnZpZXdlckRvYy5ib2R5LmFwcGVuZENoaWxkKHRoaXMuY29udGFpbmVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNwbGF5IHRoZSBuYXZpZ2F0aW9uIHJlc3VsdCBpbiB0aGUgb3ZlcmxheVxuICAgICAqIEBwYXJhbSByZXN1bHQgVGhlIG5hdmlnYXRpb24gcmVzdWx0XG4gICAgICogQHBhcmFtIG1vZGUgVGhlIG5hdmlnYXRpb24gbW9kZSB1c2VkXG4gICAgICogQHBhcmFtIGRpcmVjdGlvbiBUaGUgbmF2aWdhdGlvbiBkaXJlY3Rpb24gKCduZXh0JywgJ3ByZXZpb3VzJywgb3IgJ2ZvY3VzJylcbiAgICAgKi9cbiAgICBwdWJsaWMgZGlzcGxheVJlc3VsdChyZXN1bHQ6IE5hdmlnYXRpb25SZXN1bHQsIG1vZGU6IE5hdmlnYXRpb25Nb2RlLCBkaXJlY3Rpb246ICduZXh0JyB8ICdwcmV2aW91cycgfCAnZm9jdXMnKTogdm9pZCB7XG4gICAgICAgIGxldCBkaXNwbGF5VGV4dCA9ICcnO1xuICAgICAgICBcbiAgICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIj8/P1wiLCByZXN1bHQpO1xuICAgICAgICAgICAgZGlzcGxheVRleHQgPSBgJHtkaXJlY3Rpb24udG9VcHBlckNhc2UoKX0gJHttb2RlfTogJHtyZXN1bHQucmVuZGVyaW5nUmVzdWx0Lm1lc3NhZ2V9YDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRpc3BsYXlUZXh0ID0gYCR7ZGlyZWN0aW9uLnRvVXBwZXJDYXNlKCl9ICR7bW9kZX06ICR7cmVzdWx0LnJlbmRlcmluZ1Jlc3VsdC5tZXNzYWdlfWA7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0LnJlbmRlcmluZ1Jlc3VsdC5lbmQ/LmdldEVsZW1lbnQoKT8uc2Nyb2xsSW50b1ZpZXcoKTtcbiAgICAgICAgcmVzdWx0LnJlbmRlcmluZ1Jlc3VsdC5zdGFydD8uZ2V0RWxlbWVudCgpPy5zY3JvbGxJbnRvVmlldygpO1xuICAgICAgICB3aW5kb3cuc2Nyb2xsQnkoMCwgLTIwMCk7XG4gICAgICAgIFxuICAgICAgICB0aGlzLnJlc3VsdHNEaXNwbGF5LmlubmVySFRNTCA9IFwiXCI7XG4gICAgICAgIHRoaXMucmVzdWx0c0Rpc3BsYXkudGV4dENvbnRlbnQgPSBkaXNwbGF5VGV4dDtcbiAgICAgICAgbGV0IGluc3BlY3RCdXR0b24gPSB0aGlzLmNyZWF0ZURPTUVsZW1lbnQoXCJidXR0b25cIiwge1xuICAgICAgICAgICAgaW5uZXJUZXh0OiBcIkRlYnVnXCJcbiAgICAgICAgfSwge1xuICAgICAgICB9KTtcbiAgICAgICAgaW5zcGVjdEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2cocmVzdWx0LnJlbmRlcmluZ1Jlc3VsdC5zdGFydD8uZ2V0Tm9kZSgpLCByZXN1bHQucmVuZGVyaW5nUmVzdWx0LmVuZD8uZ2V0Tm9kZSgpKTtcbiAgICAgICAgfSlcbiAgICAgICAgdGhpcy5yZXN1bHRzRGlzcGxheS5hcHBlbmRDaGlsZChpbnNwZWN0QnV0dG9uKVxuICAgIH1cblxuICAgIHB1YmxpYyBkaXNwbGF5QWxsKHJlc3VsdDogQXJyYXk8eyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfT4pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdGFibGUgPSB0aGlzLmNyZWF0ZURPTUVsZW1lbnQoXCJ0YWJsZVwiLCB7fSwge30pO1xuICAgICAgICBjb25zdCBoZWFkZXJSb3cgPSB0aGlzLmNyZWF0ZURPTUVsZW1lbnQoXCJ0clwiLCB7fSwge30pO1xuICAgICAgICBjb25zdCBoZWFkaW5nTGFiZWxzID0gW1wiUmVnaW9uXCIsIFwiSGVhZGluZ1wiLCBcIkl0ZW1cIiwgXCJUYWJiYWJsZVwiXTtcbiAgICAgICAgY29uc3QgaGVhZGluZ0ZpZWxkcyA9IFtcInJlZ2lvblwiLCBcImhlYWRpbmdcIiwgXCJpdGVtXCIsIFwidGFiX2ZvY3VzXCJdO1xuICAgICAgICBmb3IgKGNvbnN0IGhlYWRpbmdMYWJlbCBvZiBoZWFkaW5nTGFiZWxzKSB7XG4gICAgICAgICAgICBoZWFkZXJSb3cuYXBwZW5kQ2hpbGQodGhpcy5jcmVhdGVET01FbGVtZW50KFwidGhcIiwge1xuICAgICAgICAgICAgICAgIHNjb3BlOiBcImNvbFwiLFxuICAgICAgICAgICAgICAgIGlubmVyVGV4dDogaGVhZGluZ0xhYmVsXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgdGV4dEFsaWduOiBcImxlZnRcIixcbiAgICAgICAgICAgICAgICBwYWRkaW5nOiBcIi4yNXJlbVwiLFxuICAgICAgICAgICAgICAgIG1hcmdpbjogXCIwcmVtXCIsXG4gICAgICAgICAgICAgICAgY29sb3I6IFwid2hpdGVcIlxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgdGFibGUuYXBwZW5kQ2hpbGQoaGVhZGVyUm93KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgbGluZSBvZiByZXN1bHQpIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGFSb3cgPSB0aGlzLmNyZWF0ZURPTUVsZW1lbnQoXCJ0clwiLCB7fSwge30pO1xuICAgICAgICAgICAgaGVhZGluZ0ZpZWxkcy5mb3JFYWNoKChmaWVsZCkgPT4ge1xuICAgICAgICAgICAgICAgIGRhdGFSb3cuYXBwZW5kQ2hpbGQodGhpcy5jcmVhdGVET01FbGVtZW50KFwidGRcIiwge1xuICAgICAgICAgICAgICAgICAgICBpbm5lclRleHQ6IGxpbmVbZmllbGRdXG4gICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbEFsaWduOiBcInRvcFwiLFxuICAgICAgICAgICAgICAgICAgICBib3JkZXI6IFwic29saWQgd2hpdGUgMXB4XCIsXG4gICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IFwiLjI1cmVtXCIsXG4gICAgICAgICAgICAgICAgICAgIG1hcmdpbjogXCIwcmVtXCIsXG4gICAgICAgICAgICAgICAgICAgIGNvbG9yOiBcIndoaXRlXCJcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgdGFibGUuYXBwZW5kQ2hpbGQoZGF0YVJvdyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZXN1bHRzRGlzcGxheS5pbm5lckhUTUwgPSBcIlwiO1xuICAgICAgICB0aGlzLnJlc3VsdHNEaXNwbGF5LmFwcGVuZENoaWxkKHRhYmxlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgdGhlIG92ZXJsYXkgZnJvbSB0aGUgRE9NXG4gICAgICovXG4gICAgcHVibGljIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmNvbnRhaW5lciAmJiB0aGlzLmNvbnRhaW5lci5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuY29udGFpbmVyKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBTUlZpZXdlciBjbGFzcyBmb3IgbWFuYWdpbmcgc2NyZWVuIHJlYWRlciBzaW11bGF0aW9uIHdpdGggVUkgY29udHJvbHNcbiAqL1xuZXhwb3J0IGNsYXNzIFNSVmlld2VyIHtcbiAgICAvKiogVGhlIGNvbnRyb2xsZXIgaW5zdGFuY2UgKi9cbiAgICBwcml2YXRlIGNvbnRyb2xsZXI6IFNSQ29udHJvbGxlcjtcbiAgICAvKiogVGhlIG92ZXJsYXkgVUkgaW5zdGFuY2UgKi9cbiAgICBwcml2YXRlIG92ZXJsYXk6IFNST3ZlcmxheTtcbiAgICAvKiogRmxhZyB0byB0cmFjayBpZiBzcGVlY2ggaXMgYWN0aXZlICovXG4gICAgcHJpdmF0ZSBpc1N0cmVhbWluZzogYm9vbGVhbiA9IGZhbHNlO1xuICAgIC8qKiBGbGFnIHRvIHNldCBpZiBzaG93aW5nIGFsbCAqL1xuICAgIHByaXZhdGUgaXNTaG93aW5nQWxsOiBib29sZWFuID0gZmFsc2U7XG4gICAgLyoqIEZsYWcgdG8gc2V0IGlmIGl0IHNob3VsZCBiZSBzcGVha2luZyAqL1xuICAgIHByaXZhdGUgc3BlZWNoRW5hYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIC8qKiBLZXlib2FyZCBldmVudCBoYW5kbGVyICovXG4gICAgcHJpdmF0ZSBrZXlib2FyZEhhbmRsZXI6IChlOiBLZXlib2FyZEV2ZW50KSA9PiB2b2lkO1xuICAgIC8qKiBGb2N1cyBldmVudCBoYW5kbGVyICovXG4gICAgcHJpdmF0ZSBmb2N1c0hhbmRsZXI6IChlOiBGb2N1c0V2ZW50KSA9PiB2b2lkO1xuICAgIHZpZXdlckRvYzogSFRNTERvY3VtZW50O1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBTUlZpZXdlclxuICAgICAqIEBwYXJhbSByb290RWxlbWVudCBUaGUgcm9vdCBlbGVtZW50IHRvIHN0YXJ0IGZyb20gKGRlZmF1bHRzIHRvIGRvY3VtZW50LmJvZHkpXG4gICAgICovXG4gICAgY29uc3RydWN0b3Iocm9vdEVsZW1lbnQ6IE5vZGUgPSBkb2N1bWVudC5ib2R5KSB7XG4gICAgICAgIHRoaXMudmlld2VyRG9jID0gcm9vdEVsZW1lbnQub3duZXJEb2N1bWVudDtcbiAgICAgICAgLy8gQ3JlYXRlIGNvbnRyb2xsZXIgZm9yIHRoZSBkb2N1bWVudCBib2R5XG4gICAgICAgIHRoaXMuY29udHJvbGxlciA9IFNSQ29udHJvbGxlci5nZXRDb250cm9sbGVyKHRoaXMudmlld2VyRG9jKTtcbiAgICAgICAgXG4gICAgICAgIC8vIENyZWF0ZSBvdmVybGF5IFVJXG4gICAgICAgIHRoaXMub3ZlcmxheSA9IG5ldyBTUk92ZXJsYXkodGhpcyk7XG4gICAgICAgIFxuICAgICAgICAvLyBTZXQgdXAga2V5Ym9hcmQgaGFuZGxlcnNcbiAgICAgICAgdGhpcy5zZXR1cEtleWJvYXJkSGFuZGxlcnMoKTtcbiAgICAgICAgXG4gICAgICAgIC8vIFNldCB1cCBmb2N1cyB0cmFja2luZ1xuICAgICAgICB0aGlzLnNldHVwRm9jdXNUcmFja2luZygpO1xuXG4gICAgICAgIC8vIFNldCB1cCBtdXRhdGlvbiB0cmFja2luZ1xuICAgICAgICB0aGlzLnNldHVwTXV0YXRpb25UcmFja2luZygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzaG93QWxsKGJFbmFibGVBbGxNb2RlPzogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBpZiAoYkVuYWJsZUFsbE1vZGUpIHtcbiAgICAgICAgICAgIHRoaXMuaXNTaG93aW5nQWxsID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPSBTUkNvbnRyb2xsZXIucmVuZGVyU3RydWN0dXJlKHRoaXMudmlld2VyRG9jKTtcbiAgICAgICAgdGhpcy5vdmVybGF5LmRpc3BsYXlBbGwocmVzdWx0KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9nZ2xlU3BlZWNoKCkge1xuICAgICAgICB0aGlzLnNwZWVjaEVuYWJsZWQgPSAhdGhpcy5zcGVlY2hFbmFibGVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE5hdmlnYXRlIHRvIHRoZSBuZXh0IGVsZW1lbnQgdXNpbmcgdGhlIHNwZWNpZmllZCBtb2RlXG4gICAgICogQHBhcmFtIG1vZGUgVGhlIG5hdmlnYXRpb24gbW9kZSB0byB1c2VcbiAgICAgKi9cbiAgICBwdWJsaWMgbmF2aWdhdGVOZXh0KG1vZGU6IE5hdmlnYXRpb25Nb2RlKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaXNTaG93aW5nQWxsID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuY29udHJvbGxlci5qdW1wTmV4dChtb2RlKTtcbiAgICAgICAgdGhpcy5vdmVybGF5LmRpc3BsYXlSZXN1bHQocmVzdWx0LCBtb2RlLCAnbmV4dCcpO1xuICAgICAgICB0aGlzLnNwZWFrUmVzdWx0KHJlc3VsdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTmF2aWdhdGUgdG8gdGhlIHByZXZpb3VzIGVsZW1lbnQgdXNpbmcgdGhlIHNwZWNpZmllZCBtb2RlXG4gICAgICogQHBhcmFtIG1vZGUgVGhlIG5hdmlnYXRpb24gbW9kZSB0byB1c2VcbiAgICAgKi9cbiAgICBwdWJsaWMgbmF2aWdhdGVQcmV2aW91cyhtb2RlOiBOYXZpZ2F0aW9uTW9kZSk6IHZvaWQge1xuICAgICAgICB0aGlzLmlzU2hvd2luZ0FsbCA9IGZhbHNlO1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmNvbnRyb2xsZXIuanVtcFByZXZpb3VzKG1vZGUpO1xuICAgICAgICB0aGlzLm92ZXJsYXkuZGlzcGxheVJlc3VsdChyZXN1bHQsIG1vZGUsICdwcmV2aW91cycpO1xuICAgICAgICB0aGlzLnNwZWFrUmVzdWx0KHJlc3VsdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHVwIGtleWJvYXJkIGV2ZW50IGhhbmRsZXJzIGZvciBzY3JlZW4gcmVhZGVyIG5hdmlnYXRpb25cbiAgICAgKi9cbiAgICBwcml2YXRlIHNldHVwS2V5Ym9hcmRIYW5kbGVycygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5rZXlib2FyZEhhbmRsZXIgPSAoZTogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgICAgICAgLy8gRG9uJ3QgY2FwdHVyZSBrZXlib2FyZCBldmVudHMgd2hlbiBmb2N1cyBpcyBpbiBmb3JtIGNvbnRyb2xzXG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBlLnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgIGlmICh0YXJnZXQudGFnTmFtZSA9PT0gJ0lOUFVUJyB8fCB0YXJnZXQudGFnTmFtZSA9PT0gJ1RFWFRBUkVBJyB8fCB0YXJnZXQudGFnTmFtZSA9PT0gJ1NFTEVDVCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIEhhbmRsZSBrZXlib2FyZCBzaG9ydGN1dHNcbiAgICAgICAgICAgIGlmIChlLmN0cmxLZXkpIHtcbiAgICAgICAgICAgICAgICAvLyBDdHJsIGtleSBzdG9wcyBzcGVlY2hcbiAgICAgICAgICAgICAgICB0aGlzLnN0b3BTcGVlY2goKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZS5hbHRLZXkgfHwgZS5tZXRhS2V5KSByZXR1cm47XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhlLmtleSk7XG4gICAgICAgICAgICBzd2l0Y2ggKGUua2V5KSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnQXJyb3dVcCc6XG4gICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0ZVByZXZpb3VzKCdpdGVtJyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJyAnOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzU3RyZWFtaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjYXNlICdBcnJvd0Rvd24nOlxuICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGVOZXh0KCdpdGVtJyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ0VudGVyJzpcbiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGl2YXRlQ3VycmVudEVsZW1lbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnNldFBvaW50T2ZSZWdhcmQodGhpcy52aWV3ZXJEb2MuYWN0aXZlRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ0gnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ2gnOlxuICAgICAgICAgICAgICAgICAgICBpZiAoZS5zaGlmdEtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0ZVByZXZpb3VzKCdoZWFkaW5nJyk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRlTmV4dCgnaGVhZGluZycpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ1InOlxuICAgICAgICAgICAgICAgIGNhc2UgJ3InOlxuICAgICAgICAgICAgICAgICAgICBpZiAoZS5zaGlmdEtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0ZVByZXZpb3VzKCdyZWdpb24nKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGVOZXh0KCdyZWdpb24nKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdUYWInOlxuICAgICAgICAgICAgICAgICAgICBpZiAoZS5zaGlmdEtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0ZVByZXZpb3VzKCd0YWJfZm9jdXMnKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGVOZXh0KCd0YWJfZm9jdXMnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgXG4gICAgICAgIC8vIEFkZCB0aGUgZXZlbnQgbGlzdGVuZXJcbiAgICAgICAgdGhpcy52aWV3ZXJEb2MuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMua2V5Ym9hcmRIYW5kbGVyKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNwZWFrUmVzdWx0KHJlc3VsdCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuc3BlZWNoRW5hYmxlZCkgcmV0dXJuO1xuICAgICAgICBjb25zdCB1dHRlcmFuY2UgPSBuZXcgU3BlZWNoU3ludGhlc2lzVXR0ZXJhbmNlKHJlc3VsdC5yZW5kZXJpbmdSZXN1bHQubWVzc2FnZSk7XG4gICAgICAgIHV0dGVyYW5jZS5yYXRlID0gMS41O1xuICAgICAgICBsZXQgbXlUaGlzID0gdGhpcztcbiAgICAgICAgdXR0ZXJhbmNlLmFkZEV2ZW50TGlzdGVuZXIoXCJlbmRcIiwgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAobXlUaGlzLmlzU3RyZWFtaW5nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0ZU5leHQoJ2l0ZW0nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHNwZWVjaFN5bnRoZXNpcy5jYW5jZWwoKTtcbiAgICAgICAgc3BlZWNoU3ludGhlc2lzLnNwZWFrKHV0dGVyYW5jZSk7XG4gICAgfVxuICAgIFxuICAgIC8qKlxuICAgICAqIFN0b3Agc3BlZWNoIG91dHB1dFxuICAgICAqL1xuICAgIHByaXZhdGUgc3RvcFNwZWVjaCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pc1N0cmVhbWluZyA9IGZhbHNlO1xuICAgICAgICAvLyBDYW5jZWwgYW55IGFjdGl2ZSBzcGVlY2ggc3ludGhlc2lzXG4gICAgICAgIHNwZWVjaFN5bnRoZXNpcy5jYW5jZWwoKTtcbiAgICB9XG4gICAgXG4gICAgLyoqXG4gICAgICogU2V0IHVwIG11dGF0aW9uIHRyYWNraW5nXG4gICAgICovXG4gICAgcHJpdmF0ZSBzZXR1cE11dGF0aW9uVHJhY2tpbmcoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKG11dGF0aW9ucykgPT4ge1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2codGhpcy5pc1Nob3dpbmdBbGwsIG11dGF0aW9ucy5sZW5ndGgpO1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNTaG93aW5nQWxsKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3V0c2lkZU92ZXJsYXkgPSBtdXRhdGlvbnMuZmlsdGVyKG11dGF0aW9uID0+IG11dGF0aW9uLnRhcmdldC5ub2RlVHlwZSA9PT0gMSBcbiAgICAgICAgICAgICAgICAgICAgJiYgIShtdXRhdGlvbi50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoXCIuaWJtYS1zci1vdmVybGF5XCIpKVxuICAgICAgICAgICAgICAgIGlmIChvdXRzaWRlT3ZlcmxheS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiTXV0YXRpb25zXCIsb3V0c2lkZU92ZXJsYXkpO1xuICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBteVRoaXMgPSB0aGlzO1xuICAgICAgICAgICAgICAgICAgICBteVRoaXMuc2hvd0FsbCgpO1xuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG15VGhpcy5zaG93QWxsKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5vYnNlcnZlKHRoaXMudmlld2VyRG9jLmRvY3VtZW50RWxlbWVudCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRMaXN0OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnRyZWU6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIH0sIDEwMDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIG9ic2VydmVyLm9ic2VydmUodGhpcy52aWV3ZXJEb2MuZG9jdW1lbnRFbGVtZW50LCB7XG4gICAgICAgICAgICBhdHRyaWJ1dGVzOiB0cnVlLFxuICAgICAgICAgICAgY2hpbGRMaXN0OiB0cnVlLFxuICAgICAgICAgICAgc3VidHJlZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdXAgZm9jdXMgdHJhY2tpbmcgdG8gdXBkYXRlIHRoZSBwb2ludCBvZiByZWdhcmQgd2hlbiBmb2N1cyBjaGFuZ2VzXG4gICAgICovXG4gICAgcHJpdmF0ZSBzZXR1cEZvY3VzVHJhY2tpbmcoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZm9jdXNIYW5kbGVyID0gKGU6IEZvY3VzRXZlbnQpID0+IHtcbiAgICAgICAgICAgIC8vIFNraXAgaWYgdGhlIGZvY3VzIGlzIG9uIHRoZSBvdmVybGF5IGl0c2VsZlxuICAgICAgICAgICAgaWYgKGUudGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBlLnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vdmVybGF5ICYmIHRhcmdldC5jbG9zZXN0KCcuaWJtYS1zci1vdmVybGF5JykpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zb2xlLmdyb3VwKFwiZm9jdXNIYW5kbGVyXCIpO1xuICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgcG9pbnQgb2YgcmVnYXJkIHRvIHRoZSBuZXdseSBmb2N1c2VkIGVsZW1lbnRcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmNvbnRyb2xsZXIuc2V0UG9pbnRPZlJlZ2FyZCh0YXJnZXQpO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIEFubm91bmNlIHRoZSBmb2N1cyBjaGFuZ2VcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vdmVybGF5LmRpc3BsYXlSZXN1bHQocmVzdWx0LCAnZm9jdXMnLCAnZm9jdXMnKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zcGVha1Jlc3VsdChyZXN1bHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zb2xlLmdyb3VwRW5kKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIFxuICAgICAgICAvLyBBZGQgdGhlIGZvY3VzIGV2ZW50IGxpc3RlbmVyIHRvIHRoZSBkb2N1bWVudFxuICAgICAgICB0aGlzLnZpZXdlckRvYy5hZGRFdmVudExpc3RlbmVyKCdmb2N1c2luJywgdGhpcy5mb2N1c0hhbmRsZXIpO1xuICAgIH1cbiAgICBcbiAgICAvKipcbiAgICAgKiBBY3RpdmF0ZSAoY2xpY2spIHRoZSBlbGVtZW50IGF0IHRoZSBjdXJyZW50IHBvaW50IG9mIHJlZ2FyZFxuICAgICAqL1xuICAgIHByaXZhdGUgYWN0aXZhdGVDdXJyZW50RWxlbWVudCgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY3VycmVudEVsZW1lbnQgPSB0aGlzLmNvbnRyb2xsZXIuZ2V0UG9pbnRPZlJlZ2FyZCgpLmdldEVsZW1lbnQoKTtcbiAgICAgICAgXG4gICAgICAgIGlmIChjdXJyZW50RWxlbWVudCkge1xuICAgICAgICAgICAgLy8gQW5ub3VuY2UgdGhhdCB3ZSdyZSBhY3RpdmF0aW5nIHRoZSBlbGVtZW50XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICAgICAgICByZW5kZXJpbmdSZXN1bHQ6IHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYEFjdGl2YXRpbmc6ICR7Y3VycmVudEVsZW1lbnQudGV4dENvbnRlbnQgfHwgY3VycmVudEVsZW1lbnQubm9kZU5hbWV9YCxcbiAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IHRoaXMuY29udHJvbGxlci5nZXRQb2ludE9mUmVnYXJkKCksXG4gICAgICAgICAgICAgICAgICAgIGVuZDogdGhpcy5jb250cm9sbGVyLmdldFBvaW50T2ZSZWdhcmQoKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLm92ZXJsYXkuZGlzcGxheVJlc3VsdChyZXN1bHQsICdmb2N1cycsICdmb2N1cycpO1xuICAgICAgICAgICAgdGhpcy5zcGVha1Jlc3VsdChyZXN1bHQpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBGb2N1cyB0aGUgZWxlbWVudCBmaXJzdFxuICAgICAgICAgICAgaWYgKGN1cnJlbnRFbGVtZW50LmZvY3VzKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudEVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gU2ltdWxhdGUgYSBjbGljayBvbiB0aGUgZWxlbWVudFxuICAgICAgICAgICAgY3VycmVudEVsZW1lbnQuY2xpY2soKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgY29udHJvbGxlciBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIFRoZSBTUkNvbnRyb2xsZXIgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Q29udHJvbGxlcigpOiBTUkNvbnRyb2xsZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250cm9sbGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc3Ryb3kgdGhlIHZpZXdlciBhbmQgY2xlYW4gdXAgcmVzb3VyY2VzXG4gICAgICovXG4gICAgcHVibGljIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIC8vIFJlbW92ZSBldmVudCBsaXN0ZW5lcnNcbiAgICAgICAgdGhpcy52aWV3ZXJEb2MucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMua2V5Ym9hcmRIYW5kbGVyKTtcbiAgICAgICAgdGhpcy52aWV3ZXJEb2MucmVtb3ZlRXZlbnRMaXN0ZW5lcignZm9jdXNpbicsIHRoaXMuZm9jdXNIYW5kbGVyKTtcbiAgICAgICAgXG4gICAgICAgIC8vIFN0b3AgYW55IGFjdGl2ZSBzcGVlY2hcbiAgICAgICAgdGhpcy5zdG9wU3BlZWNoKCk7XG4gICAgICAgIFxuICAgICAgICAvLyBEZXN0cm95IG92ZXJsYXlcbiAgICAgICAgdGhpcy5vdmVybGF5LmRlc3Ryb3koKTtcbiAgICB9XG59IiwiaW1wb3J0IHsgU1JDdXJzb3IgfSBmcm9tIFwiLi4vU1JDdXJzb3JcIjtcbmltcG9ydCB7IFNSUmVuZGVyZXJSdWxlIH0gZnJvbSBcIi4uL1NSUmVuZGVyZXJSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi8uLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBBUklBRGVmaW5pdGlvbnMgfSBmcm9tIFwiLi4vLi4vLi4vdjIvYXJpYS9BUklBRGVmaW5pdGlvbnNcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgTmF2aWdhdGlvbk1vZGUgfSBmcm9tIFwiLi4vU1JUeXBlc1wiO1xuXG4vKipcbiAqIFByb3ZpZGUgdGhlIG5hbWUsIHN1cnJvdW5kZWQgYnkgdGhlIHF1b3RlQ2hhckJlZm9yZSBhbmQgcXVvdGVDaGFyQWZ0ZXIgYW5kIGZvbGxvd2VkIGJ5IHRoZSBwYWRkaW5nIGlmIHRoZSBuYW1lIGV4aXN0c1xuICogQHBhcmFtIGN1cnNvciBUaGUgY3Vyc29yIGZvciB3aGljaCB0byBmZXRjaCB0aGUgbmFtZVxuICogQHBhcmFtIHBhZGRpbmcgU3RyaW5nIHRvIGFkZCBhZnRlciwgaWYgdGhlIG5hbWUgZXhpc3RzXG4gKiBAcGFyYW0gcXVvdGVDaGFyQmVmb3JlIFRoZSBzdHJpbmcgdG8gdXNlIGFzIHRoZSBsZWFkaW5nIHF1b3RlLCBpZiB0aGUgbmFtZSBleGlzdHNcbiAqIEBwYXJhbSBxdW90ZUNoYXJCZWZvcmUgVGhlIHN0cmluZyB0byB1c2UgYXMgdGhlIHRyYWlsaW5nIHF1b3RlLCBpZiB0aGUgbmFtZSBleGlzdHNcbiAqIEByZXR1cm5zIFxuICovXG5leHBvcnQgZnVuY3Rpb24gcXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yOiBTUkN1cnNvciwgcGFkZGluZz86IHN0cmluZywgcXVvdGVDaGFyQmVmb3JlPzogc3RyaW5nLCBxdW90ZUNoYXJBZnRlcj86IHN0cmluZykge1xuICAgIHJldHVybiBjdXJzb3IuZ2V0TmFtZSgpIFxuICAgICAgICA/IGAke3F1b3RlTmFtZShjdXJzb3IpfSR7cGFkZGluZyB8fCBcIiwgXCJ9YFxuICAgICAgICA6IFwiXCI7XG59XG5cbi8qKlxuICogUHJvdmlkZSB0aGUgbmFtZSwgc3Vycm91bmRlZCBieSBxdW90ZXMgYW5kIHByZWNlZGVkIGJ5IHRoZSBwYWRkaW5nIGlmIHRoZSBuYW1lIGV4aXN0c1xuICogQHBhcmFtIGN1cnNvciBUaGUgY3Vyc29yIGZvciB3aGljaCB0byBmZXRjaCB0aGUgbmFtZVxuICogQHBhcmFtIHBhZGRpbmcgU3RyaW5nIHRvIGFkZCBiZWZvcmUsIGlmIHRoZSBuYW1lIGV4aXN0cyAoZGVmYXVsdHMgdG8gXCIsIFwiKVxuICogQHJldHVybnMgVGhlIHF1b3RlZCBuYW1lIHdpdGggbGVhZGluZyBwYWRkaW5nLCBvciBlbXB0eSBzdHJpbmcgaWYgbm8gbmFtZSBleGlzdHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHF1b3RlTmFtZVBhZEJlZm9yZShjdXJzb3I6IFNSQ3Vyc29yLCBwYWRkaW5nPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGN1cnNvci5nZXROYW1lKClcbiAgICAgICAgPyBgJHtwYWRkaW5nIHx8IFwiLCBcIn0ke3F1b3RlTmFtZShjdXJzb3IpfWBcbiAgICAgICAgOiBcIlwiO1xufVxuXG4vKipcbiAqIFByb3ZpZGUgdGhlIG5hbWUgc3Vycm91bmRlZCBieSBxdW90ZSBjaGFyYWN0ZXJzXG4gKiBAcGFyYW0gY3Vyc29yIFRoZSBjdXJzb3IgZm9yIHdoaWNoIHRvIGZldGNoIHRoZSBuYW1lXG4gKiBAcGFyYW0gcXVvdGVDaGFyQmVmb3JlIFRoZSBzdHJpbmcgdG8gdXNlIGFzIHRoZSBsZWFkaW5nIHF1b3RlIChkZWZhdWx0cyB0byBcIilcbiAqIEBwYXJhbSBxdW90ZUNoYXJBZnRlciBUaGUgc3RyaW5nIHRvIHVzZSBhcyB0aGUgdHJhaWxpbmcgcXVvdGUgKGRlZmF1bHRzIHRvIFwiKVxuICogQHJldHVybnMgVGhlIHF1b3RlZCBuYW1lLCBvciBlbXB0eSBzdHJpbmcgaWYgbm8gbmFtZSBleGlzdHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHF1b3RlTmFtZShjdXJzb3I6IFNSQ3Vyc29yLCBxdW90ZUNoYXJCZWZvcmU/OiBzdHJpbmcsIHF1b3RlQ2hhckFmdGVyPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGN1cnNvci5nZXROYW1lKClcbiAgICAgICAgPyBgJHtxdW90ZUNoYXJCZWZvcmUgfHwgJ1wiJ30ke2N1cnNvci5nZXROYW1lKCl9JHtxdW90ZUNoYXJBZnRlciB8fCAnXCInfWBcbiAgICAgICAgOiBcIlwiO1xufVxuXG4vKipcbiAqIEdldCB0aGUgcm9sZSBkZXNjcmlwdGlvbiBmb3IgYW4gZWxlbWVudCwgdXNpbmcgYXJpYS1yb2xlZGVzY3JpcHRpb24gaWYgcHJlc2VudFxuICogRmFsbHMgYmFjayB0byB0aGUgcHJvdmlkZWQgZGVmYXVsdCByb2xlIG5hbWUgaWYgYXJpYS1yb2xlZGVzY3JpcHRpb24gaXMgbm90IHNwZWNpZmllZCBvciBlbXB0eVxuICogQHBhcmFtIGN1cnNvciBUaGUgY3Vyc29yIHBvc2l0aW9uZWQgYXQgdGhlIGVsZW1lbnRcbiAqIEBwYXJhbSBkZWZhdWx0Um9sZSBUaGUgZGVmYXVsdCByb2xlIG5hbWUgdG8gdXNlIGlmIGFyaWEtcm9sZWRlc2NyaXB0aW9uIGlzIG5vdCBwcmVzZW50XG4gKiBAcmV0dXJucyBUaGUgcm9sZSBkZXNjcmlwdGlvbiAoZWl0aGVyIGN1c3RvbSBvciBkZWZhdWx0KVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Um9sZURlc2NyaXB0aW9uKGN1cnNvcjogU1JDdXJzb3IsIGRlZmF1bHRSb2xlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGVsZW0gPSBjdXJzb3IuZ2V0RWxlbWVudCgpO1xuICAgIGlmICghZWxlbSkgcmV0dXJuIGRlZmF1bHRSb2xlO1xuICAgIFxuICAgIGNvbnN0IHJvbGVEZXNjcmlwdGlvbiA9IGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1yb2xlZGVzY3JpcHRpb25cIik7XG4gICAgaWYgKHJvbGVEZXNjcmlwdGlvbiAmJiByb2xlRGVzY3JpcHRpb24udHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIHJvbGVEZXNjcmlwdGlvbi50cmltKCk7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBkZWZhdWx0Um9sZTtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZSB0aGUgc2NyZWVuIHJlYWRlciBhbm5vdW5jZW1lbnQgZm9yIGEgbGluayBlbGVtZW50XG4gKiBEaXN0aW5ndWlzaGVzIGJldHdlZW4gc2FtZS1wYWdlIGxpbmtzIChhbmNob3JzKSBhbmQgcmVndWxhciBsaW5rc1xuICogQHBhcmFtIGN1cnNvciBUaGUgY3Vyc29yIHBvc2l0aW9uZWQgYXQgdGhlIGxpbmsgZWxlbWVudFxuICogQHBhcmFtIG1vZGUgVGhlIG5hdmlnYXRpb24gbW9kZSAoYWZmZWN0cyBhbm5vdW5jZW1lbnQgb3JkZXIpXG4gKiBAcmV0dXJucyBUaGUgZm9ybWF0dGVkIGxpbmsgYW5ub3VuY2VtZW50IHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGlua0Fubm91bmNlbWVudChjdXJzb3I6IFNSQ3Vyc29yLCBtb2RlPzogTmF2aWdhdGlvbk1vZGUpOiBzdHJpbmcge1xuICAgIGxldCBocmVmOiBzdHJpbmcgPSAoKGN1cnNvci5nZXROb2RlKCkgYXMgYW55KS5ocmVmKSB8fCBcIlwiO1xuICAgIGxldCBhbm5vdW5jZVN0ciA9IFwiXCI7XG4gICAgaWYgKGhyZWYuc3RhcnRzV2l0aChkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSAmJiBocmVmLmNoYXJBdChkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmxlbmd0aCkgPT09IFwiI1wiKSB7XG4gICAgICAgIGFubm91bmNlU3RyID0gYHNhbWUgcGFnZSBsaW5rYDtcbiAgICB9IGVsc2Uge1xuICAgICAgICBhbm5vdW5jZVN0ciA9IGBsaW5rYDtcbiAgICB9XG4gICAgbGV0IG5hbWVJbmZvID0gY3Vyc29yLmdldE5hbWVJbmZvKCk7XG4gICAgaWYgKG5hbWVJbmZvICYmICFbXCJjb250ZW50XCIsIFwidGV4dFwiXS5pbmNsdWRlcyhuYW1lSW5mby5uYW1lRnJvbSkpIHtcbiAgICAgICAgaWYgKG1vZGUgPT09IFwidGFiX2ZvY3VzXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX0ke2Fubm91bmNlU3RyfV1gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGBbJHthbm5vdW5jZVN0cn0ke3F1b3RlTmFtZVBhZEJlZm9yZShjdXJzb3IpfV1gO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBgWyR7YW5ub3VuY2VTdHJ9XWA7XG59XG5cbi8qKlxuICogR2V0IHRoZSBkZXNjcmlwdGlvbiB0ZXh0IGZyb20gYXJpYS1kZXNjcmliZWRieSByZWZlcmVuY2VzXG4gKiBSZXNvbHZlcyBhbGwgSURzIGluIGFyaWEtZGVzY3JpYmVkYnkgYW5kIGNvbmNhdGVuYXRlcyB0aGVpciB0ZXh0IGNvbnRlbnRcbiAqIEBwYXJhbSBlbGVtIFRoZSBlbGVtZW50IHdpdGggYXJpYS1kZXNjcmliZWRieSBhdHRyaWJ1dGVcbiAqIEBwYXJhbSBtb2RlIFRoZSBuYXZpZ2F0aW9uIG1vZGUgKHJldHVybnMgZW1wdHkgc3RyaW5nIGluIFwiaXRlbVwiIG1vZGUpXG4gKiBAcmV0dXJucyBUaGUgZm9ybWF0dGVkIGRlc2NyaXB0aW9uIHRleHQgd2l0aCBsZWFkaW5nIGNvbW1hIGFuZCBxdW90ZXMsIG9yIGVtcHR5IHN0cmluZ1xuICovXG5mdW5jdGlvbiBnZXREZXNjcmliZWRCeUFubm91bmNlbWVudHMoZWxlbTogSFRNTEVsZW1lbnQsIG1vZGU/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRlc2NyaWJlZEJ5ID0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWRlc2NyaWJlZGJ5XCIpO1xuICAgIGlmICghZGVzY3JpYmVkQnkpIHJldHVybiBcIlwiO1xuICAgIGNvbnN0IGRlc2NyaXB0aW9uRWxlbXMgPSBkZXNjcmliZWRCeVxuICAgICAgICAuc3BsaXQoL1xccysvKVxuICAgICAgICAubWFwKGlkID0+IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKSlcbiAgICAgICAgLmZpbHRlcihkZXNjRWxlbSA9PiAhIWRlc2NFbGVtKSBhcyBIVE1MRWxlbWVudFtdO1xuXG4gICAgY29uc3QgZGVzY3JpcHRpb25UZXh0ID0gZGVzY3JpcHRpb25FbGVtc1xuICAgICAgICAubWFwKGRlc2NFbGVtID0+IGRlc2NFbGVtLnRleHRDb250ZW50Py50cmltKCkpXG4gICAgICAgIC5maWx0ZXIodGV4dCA9PiAhIXRleHQpXG4gICAgICAgIC5qb2luKFwiIFwiKTtcblxuICAgIGlmICghZGVzY3JpcHRpb25UZXh0IHx8IGRlc2NyaXB0aW9uVGV4dC5sZW5ndGggPT09IDApIHJldHVybiBcIlwiO1xuICAgIGlmIChtb2RlID09PSBcIml0ZW1cIikgcmV0dXJuIGAsIFxcdTAwMDEke2Rlc2NyaXB0aW9uVGV4dH1cXHUwMDAyYDtcbiAgICByZXR1cm4gYCwgXCIke2Rlc2NyaXB0aW9uVGV4dH1cImA7XG59XG5cbi8qKlxuICogR2V0IHN0YXRlIGFubm91bmNlbWVudHMgZm9yIGRpc2FibGVkLCByZWFkb25seSwgcmVxdWlyZWQsIGFuZCBpbnZhbGlkIGF0dHJpYnV0ZXNcbiAqIEBwYXJhbSBlbGVtIFRoZSBlbGVtZW50IHRvIGNoZWNrIGZvciBzdGF0ZSBhdHRyaWJ1dGVzXG4gKiBAcmV0dXJucyBBIHN0cmluZyB3aXRoIHN0YXRlIGFubm91bmNlbWVudHMgKGUuZy4sIFwiLCBkaXNhYmxlZFwiLCBcIiwgcmVhZCBvbmx5XCIsIFwiLCByZXF1aXJlZFwiLCBcIiwgaW52YWxpZFwiKVxuICovXG5mdW5jdGlvbiBnZXRTdGF0ZUFubm91bmNlbWVudHMoZWxlbTogSFRNTEVsZW1lbnQpOiBzdHJpbmcge1xuICAgIGxldCBzdGF0ZXMgPSBcIlwiO1xuICAgIFxuICAgIC8vIENoZWNrIGZvciBkaXNhYmxlZCBzdGF0ZSAoYm90aCBhdHRyaWJ1dGUgYW5kIGFyaWEtZGlzYWJsZWQpXG4gICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwiZGlzYWJsZWRcIikgfHwgZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWRpc2FibGVkXCIpID09PSBcInRydWVcIikge1xuICAgICAgICBzdGF0ZXMgKz0gXCIsIGRpc2FibGVkXCI7XG4gICAgfVxuICAgIFxuICAgIC8vIENoZWNrIGZvciByZWFkb25seSBzdGF0ZSAoYm90aCBhdHRyaWJ1dGUgYW5kIGFyaWEtcmVhZG9ubHkpXG4gICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwicmVhZG9ubHlcIikgfHwgZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLXJlYWRvbmx5XCIpID09PSBcInRydWVcIikge1xuICAgICAgICBzdGF0ZXMgKz0gXCIsIHJlYWQgb25seVwiO1xuICAgIH1cbiAgICBcbiAgICAvLyBDaGVjayBmb3IgcmVxdWlyZWQgc3RhdGUgKGJvdGggYXR0cmlidXRlIGFuZCBhcmlhLXJlcXVpcmVkKVxuICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcInJlcXVpcmVkXCIpIHx8IGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1yZXF1aXJlZFwiKSA9PT0gXCJ0cnVlXCIpIHtcbiAgICAgICAgc3RhdGVzICs9IFwiLCByZXF1aXJlZFwiO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciBpbnZhbGlkIHN0YXRlIChhcmlhLWludmFsaWQpXG4gICAgaWYgKGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1pbnZhbGlkXCIpID09PSBcInRydWVcIikge1xuICAgICAgICBzdGF0ZXMgKz0gXCIsIGludmFsaWRcIjtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHN0YXRlcztcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhIGxpc3RpdGVtIGNvbnRhaW5zIGludGVyYWN0aXZlL3dpZGdldCBlbGVtZW50c1xuICogU2NyZWVuIHJlYWRlcnMgdHlwaWNhbGx5IGRvbid0IHJlYWQgdGhlIGFjY2Vzc2libGUgbmFtZSBvZiBhIGxpc3RpdGVtIHdoZW4gaXQgY29udGFpbnMgaW50ZXJhY3RpdmUgZWxlbWVudHNcbiAqIFVzZXMgRE9NV2Fsa2VyIHRvIHByb3Blcmx5IHRyYXZlcnNlIHNoYWRvdyBET00gYW5kIG90aGVyIGNvbXBsZXggc3RydWN0dXJlc1xuICovXG5mdW5jdGlvbiBsaXN0aXRlbUNvbnRhaW5zSW50ZXJhY3RpdmVFbGVtZW50KGN1cnNvcjogU1JDdXJzb3IpOiBib29sZWFuIHtcbiAgICBjb25zdCBlbGVtID0gY3Vyc29yLmdldEVsZW1lbnQoKTtcbiAgICBpZiAoIWVsZW0pIHJldHVybiBmYWxzZTtcbiAgICBcbiAgICAvLyBVc2UgRE9NV2Fsa2VyIHRvIHRyYXZlcnNlIHRoZSBlbnRpcmUgc3VidHJlZSBpbmNsdWRpbmcgc2hhZG93IERPTVxuICAgIGNvbnN0IHdhbGtlciA9IG5ldyBET01XYWxrZXIoZWxlbSwgZmFsc2UsIGVsZW0sIGZhbHNlKTtcbiAgICBcbiAgICAvLyBXYWxrIHRocm91Z2ggYWxsIGRlc2NlbmRhbnRzXG4gICAgd2hpbGUgKHdhbGtlci5uZXh0Tm9kZSgpKSB7XG4gICAgICAgIC8vIE9ubHkgY2hlY2sgZWxlbWVudCBub2RlcyBhdCBzdGFydCB0YWdzXG4gICAgICAgIGlmICh3YWxrZXIubm9kZS5ub2RlVHlwZSA9PT0gMSAmJiAhd2Fsa2VyLmJFbmRUYWcpIHtcbiAgICAgICAgICAgIGNvbnN0IHJvbGUgPSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUod2Fsa2VyLm5vZGUgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICAgICAgaWYgKHJvbGUgJiYgQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVdICYmIEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlXS5yb2xlVHlwZSA9PT0gJ3dpZGdldCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgYW4gaWZyYW1lJ3MgY29udGVudCBjYW4gYmUgYWNjZXNzZWQgKG5vdCBjcm9zcy1vcmlnaW4pXG4gKiBBdHRlbXB0cyB0byBhY2Nlc3MgdGhlIGlmcmFtZSdzIGRvY3VtZW50IHRvIGRldGVybWluZSBpZiBpdCdzIGFjY2Vzc2libGVcbiAqIEBwYXJhbSBpZnJhbWUgVGhlIGlmcmFtZSBlbGVtZW50IHRvIGNoZWNrXG4gKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBpZnJhbWUgY29udGVudCBpcyBhY2Nlc3NpYmxlLCBmYWxzZSBpZiBjcm9zcy1vcmlnaW4gb3IgYmxvY2tlZFxuICovXG5mdW5jdGlvbiBjYW5BY2Nlc3NGcmFtZShpZnJhbWUpIHtcbiAgICB0cnkge1xuICAgICAgICAvLyBUaGlzIHRocm93cyBhIERPTUV4Y2VwdGlvbiBmb3IgY3Jvc3Mtb3JpZ2luIGZyYW1lc1xuICAgICAgICBjb25zdCBkb2MgPSBpZnJhbWUuY29udGVudERvY3VtZW50IHx8IGlmcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50O1xuICAgICAgICByZXR1cm4gZG9jICE9PSBudWxsO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAvLyBpZiAoZSBpbnN0YW5jZW9mIERPTUV4Y2VwdGlvbiAmJiBlLm5hbWUgPT09ICdTZWN1cml0eUVycm9yJykge1xuICAgICAgICAvLyAgICAgcmV0dXJuIGZhbHNlOyAvLyBDcm9zcy1vcmlnaW4sIGFjY2VzcyBibG9ja2VkXG4gICAgICAgIC8vIH1cbiAgICAgICAgLy8gdGhyb3cgZTsgLy8gUmUtdGhyb3cgdW5leHBlY3RlZCBlcnJvcnNcbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBSVUxFUzogU1JSZW5kZXJlclJ1bGVbXSA9IFtcbiAgICAvLyBTaW5nbGUgcm9sZSBydWxlcyAtIGFscGhhYmV0aWNhbGx5IHNvcnRlZFxuICAgIFxuICAgIC8vIEJ1dHRvbiByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImJ1dHRvblwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcImJ1dHRvblwiLCBcInRhYl9mb2N1c1wiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yLCBfb2xkQ3Vyc29yPzogU1JDdXJzb3IsIG1vZGU/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWN1cnNvci5pc1N0YXJ0VGFnKCkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW0gPSBjdXJzb3IuZ2V0Tm9kZSgpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvbGVEZXNjID0gZ2V0Um9sZURlc2NyaXB0aW9uKGN1cnNvciwgXCJidXR0b25cIik7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1wcmVzc2VkXCIpID09PSBcInRydWVcIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFt0b2dnbGUgJHtyb2xlRGVzY30sIHByZXNzZWQke3F1b3RlTmFtZVBhZEJlZm9yZShjdXJzb3IpfSR7Z2V0RGVzY3JpYmVkQnlBbm5vdW5jZW1lbnRzKGVsZW0sIG1vZGUpfV1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvciwgX29sZEN1cnNvcj86IFNSQ3Vyc29yLCBtb2RlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFjdXJzb3IuaXNTdGFydFRhZygpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtID0gY3Vyc29yLmdldE5vZGUoKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICBjb25zdCByb2xlRGVzYyA9IGdldFJvbGVEZXNjcmlwdGlvbihjdXJzb3IsIFwiYnV0dG9uXCIpO1xuICAgICAgICAgICAgICAgIGlmIChlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtcHJlc3NlZFwiKSA9PT0gXCJmYWxzZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgW3RvZ2dsZSAke3JvbGVEZXNjfSwgbm90IHByZXNzZWQke3F1b3RlTmFtZVBhZEJlZm9yZShjdXJzb3IpfSR7Z2V0RGVzY3JpYmVkQnlBbm5vdW5jZW1lbnRzKGVsZW0sIG1vZGUpfV1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvciwgX29sZEN1cnNvcj86IFNSQ3Vyc29yLCBtb2RlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5pc0VuZFRhZygpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGxldCBleHBhbmRTdHIgPSBcIlwiO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW0gPSBjdXJzb3IuZ2V0RWxlbWVudCgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvbGVEZXNjID0gZ2V0Um9sZURlc2NyaXB0aW9uKGN1cnNvciwgXCJidXR0b25cIik7XG4gICAgICAgICAgICAgICAgaWYgKFtcIm1lbnVcIiwgXCJ0cnVlXCJdLmluY2x1ZGVzKGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1oYXNwb3B1cFwiKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZXhwYW5kU3RyICs9IFwiLCBtZW51XCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcImFyaWEtZXhwYW5kZWRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgZXhwYW5kU3RyICs9IGAsICR7ZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWV4cGFuZGVkXCIpID09PSBcInRydWVcIiA/IFwiZXhwYW5kZWRcIiA6IFwiY29sbGFwc2VkXCJ9YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZXhwYW5kU3RyICs9IGdldFN0YXRlQW5ub3VuY2VtZW50cyhlbGVtKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYFske3F1b3RlTmFtZVBhZEFmdGVyKGN1cnNvcil9JHtyb2xlRGVzY30ke2V4cGFuZFN0cn0ke2dldERlc2NyaWJlZEJ5QW5ub3VuY2VtZW50cyhlbGVtLCBtb2RlKX1dYDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4geyBpZiAoY3Vyc29yLmlzRW5kVGFnKCkpIHJldHVybiBcIlwiOyB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIENoZWNrYm94IHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiY2hlY2tib3hcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJjaGVja2JveFwiLCBcInRhYl9mb2N1c1wiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yLCBfb2xkQ3Vyc29yPzogU1JDdXJzb3IsIG1vZGU/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmlzU3RhcnRUYWcoKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGVtID0gY3Vyc29yLmdldE5vZGUoKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByb2xlRGVzYyA9IGdldFJvbGVEZXNjcmlwdGlvbihjdXJzb3IsIFwiY2hlY2tib3hcIik7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzdGF0ZVN0ciA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtY2hlY2tlZFwiKSA9PT0gXCJtaXhlZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZVN0ciA9IFwiaGFsZiBjaGVja2VkXCI7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgYkNoZWNrZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcImFyaWEtY2hlY2tlZFwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJDaGVja2VkID0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWNoZWNrZWRcIikgPT09IFwidHJ1ZVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQ2hlY2tlZCA9IGVsZW0uY2hlY2tlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlU3RyID0gYkNoZWNrZWQgPyBcImNoZWNrZWRcIiA6IFwibm90IGNoZWNrZWRcIjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBzdGF0ZVN0ciArPSBnZXRTdGF0ZUFubm91bmNlbWVudHMoY3Vyc29yLmdldEVsZW1lbnQoKSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cm9sZURlc2N9LCAke3N0YXRlU3RyfSR7cXVvdGVOYW1lUGFkQmVmb3JlKGN1cnNvcil9JHtnZXREZXNjcmliZWRCeUFubm91bmNlbWVudHMoY3Vyc29yLmdldEVsZW1lbnQoKSwgbW9kZSl9XWBcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIENlbGwsIENvbHVtbmhlYWRlciwgYW5kIFJvd2hlYWRlciByb2xlc1xuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJjZWxsXCIsIFwiY29sdW1uaGVhZGVyXCIsIFwicm93aGVhZGVyXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwidGFibGVcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghY3Vyc29yLmlzU3RhcnRUYWcoKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBjZWxsIGVsZW1lbnRcbiAgICAgICAgICAgICAgICBjb25zdCBjZWxsRWxlbSA9IGN1cnNvci5nZXRFbGVtZW50KCk7XG4gICAgICAgICAgICAgICAgaWYgKCFjZWxsRWxlbSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGNlbGwgaGFzIGFueSB2aXNpYmxlIGNvbnRlbnQgYnkgY2hlY2tpbmc6XG4gICAgICAgICAgICAgICAgLy8gMS4gVGV4dCBjb250ZW50ICh0cmltbWVkKVxuICAgICAgICAgICAgICAgIC8vIDIuIENoaWxkIGVsZW1lbnRzIHdpdGggcm9sZXMgKGJ1dHRvbnMsIGxpbmtzLCBldGMuKVxuICAgICAgICAgICAgICAgIC8vIDMuIEltYWdlcyB3aXRoIGFsdCB0ZXh0XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgY29uc3QgdGV4dENvbnRlbnQgPSBjZWxsRWxlbS50ZXh0Q29udGVudD8udHJpbSgpIHx8IFwiXCI7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGNoaWxkIGVsZW1lbnRzIHdpdGggaW50ZXJhY3RpdmUgcm9sZXMgb3IgY29udGVudFxuICAgICAgICAgICAgICAgIGNvbnN0IHdhbGtlciA9IG5ldyBET01XYWxrZXIoY2VsbEVsZW0sIGZhbHNlLCBjZWxsRWxlbSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIGxldCBoYXNDb250ZW50ID0gdGV4dENvbnRlbnQubGVuZ3RoID4gMDtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBpZiAoIWhhc0NvbnRlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGVsZW1lbnRzIHRoYXQgd291bGQgaGF2ZSBjb250ZW50IChidXR0b25zLCBsaW5rcywgaW1hZ2VzLCBldGMuKVxuICAgICAgICAgICAgICAgICAgICB3aGlsZSAod2Fsa2VyLm5leHROb2RlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3YWxrZXIubm9kZS5ub2RlVHlwZSA9PT0gMSAmJiAhd2Fsa2VyLmJFbmRUYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGVtID0gd2Fsa2VyLm5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgcm9sZSA9IEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZShlbGVtKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgaW50ZXJhY3RpdmUgZWxlbWVudHMgb3IgZWxlbWVudHMgd2l0aCBhY2Nlc3NpYmxlIG5hbWVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvbGUgJiYgQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0NvbnRlbnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGltYWdlcyB3aXRoIGFsdCB0ZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW0ubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJJTUdcIiAmJiBlbGVtLmhhc0F0dHJpYnV0ZShcImFsdFwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNDb250ZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIElmIHRoZSBjZWxsIGlzIGVtcHR5LCByZXR1cm4gXCJbYmxhbmtdXCJcbiAgICAgICAgICAgICAgICBpZiAoIWhhc0NvbnRlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiW2JsYW5rXVwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIHJldHVybiBudWxsIHRvIGxldCBkZWZhdWx0IHJlbmRlcmluZyBjb250aW51ZVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBDb21ib2JveCByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImNvbWJvYm94XCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwiY29tYm9cIiwgXCJ0YWJfZm9jdXNcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuaXNFbmRUYWcoKSkgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm9sZURlc2MgPSBnZXRSb2xlRGVzY3JpcHRpb24oY3Vyc29yLCBcImNvbWJvIGJveFwiKTtcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtID0gY3Vyc29yLmdldEVsZW1lbnQoKTtcbiAgICAgICAgICAgICAgICBsZXQgc3RhdGUgPSBcIlwiO1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuZ2V0Tm9kZSgpLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiU0VMRUNUXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBcIiwgY29sbGFwc2VkXCI7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0RWxlbSA9IGN1cnNvci5nZXRFbGVtZW50KCkgYXMgSFRNTFNlbGVjdEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZUVsZW0gPSBzZWxlY3RFbGVtLnNlbGVjdGVkSW5kZXggPj0gMCA/IHNlbGVjdEVsZW0ub3B0aW9uc1tzZWxlY3RFbGVtLnNlbGVjdGVkSW5kZXhdIDogbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlU3RyID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlRWxlbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRlbXAgPSBuZXcgU1JDdXJzb3IodmFsdWVFbGVtLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVN0ciA9IHF1b3RlTmFtZVBhZEJlZm9yZSh0ZW1wLCBcIiwgXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlICs9IGdldFN0YXRlQW5ub3VuY2VtZW50cyhlbGVtKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBbJHtxdW90ZU5hbWVQYWRBZnRlcihjdXJzb3IpfSR7cm9sZURlc2N9JHtzdGF0ZX0ke3ZhbHVlU3RyfV1gO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3Vyc29yLmdldE5vZGUoKS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIklOUFVUXCIgJiYgIWN1cnNvci5nZXRFbGVtZW50KCkuaGFzQXR0cmlidXRlKFwicm9sZVwiKSkge1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IGdldFN0YXRlQW5ub3VuY2VtZW50cyhlbGVtKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBbJHtxdW90ZU5hbWVQYWRBZnRlcihjdXJzb3IpfSR7cm9sZURlc2N9LCBoYXMgYXV0byBjb21wbGV0ZSwgZWRpdGFibGUsIG9wZW5zIGxpc3Qke3N0YXRlfV1gO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcImFyaWEtZXhwYW5kZWRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gYCwgJHtlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtZXhwYW5kZWRcIikgPT09IFwidHJ1ZVwiID8gXCJleHBhbmRlZFwiIDogXCJjb2xsYXBzZWRcIn1gO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwiYXJpYS1hdXRvY29tcGxldGVcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSArPSBgLCBoYXMgYXV0byBjb21wbGV0ZWA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSArPSBgLCBlZGl0YWJsZSwgb3BlbnMgbGlzdGBcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBzdGF0ZSArPSBnZXRTdGF0ZUFubm91bmNlbWVudHMoZWxlbSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX0ke3JvbGVEZXNjfSR7c3RhdGV9XWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBEZWZhdWx0IHJvbGUgKGZhbGxiYWNrKVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJkZWZhdWx0XCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IGN1cnNvci5pc1N0YXJ0VGFnKCkgP1xuICAgICAgICAgICAgICAgIGAhITwke2N1cnNvci5nZXRSb2xlKCl9PiR7KGN1cnNvci5nZXROYW1lSW5mbygpPy5uYW1lICsgXCJcIil9ISFgIDpcbiAgICAgICAgICAgICAgICBgISE8LyR7Y3Vyc29yLmdldFJvbGUoKX0+ISFgXG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIERlbGV0aW9uIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiZGVsZXRpb25cIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4gKGN1cnNvci5pc1N0YXJ0VGFnKCkgJiYgYFtkZWxldGVkXWAgfHwgXCJcIilcbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gRGlhbG9nIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiZGlhbG9nXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY3Vyc29yLmlzRW5kVGFnKCkgPyBgW0VuZCBvZiBkaWFsb2ddYCA6IGBbU3RhcnQgb2YgZGlhbG9nJHtxdW90ZU5hbWVQYWRCZWZvcmUoY3Vyc29yKX1gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBEb2N1bWVudCByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImRvY3VtZW50XCIsIFwiZ2VuZXJpY1wiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgICgpID0+IFwiXCJcbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gR3JhcGhpY3MgZG9jdW1lbnQgcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJncmFwaGljcy1kb2N1bWVudFwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcImltYWdlXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmlzU3RhcnRUYWcoKSAmJiAhY3Vyc29yLmdldE5hbWVJbmZvKCk/Lm5hbWUgJiYgY3Vyc29yLmdldE5hbWVJbmZvKCk/Lm5hbWUgIT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRG9uJ3QgYW5ub3VuY2UgdW5sYWJlbGVkIGdyYXBoaWNzIHRoYXQgYXJlIGhpZGRlbiBpbnNpZGUgbGlua3Mgb3IgaGVhZGluZ3NcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyZW50SGVhZGluZ09yTGluayA9IGN1cnNvci5nZXRDdXJyZW50T3JQYXJlbnRCeVJvbGVDbG9uZShbXCJoZWFkaW5nXCIsIFwibGlua1wiXSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnRIZWFkaW5nT3JMaW5rICYmIFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKGN1cnNvci5nZXRFbGVtZW50KCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJbVW5sYWJlbGVkIGdyYXBoaWNdXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiAoY3Vyc29yLmlzU3RhcnRUYWcoKSAmJiAoY3Vyc29yLmdldE5hbWVJbmZvKCk/Lm5hbWUgPT09IFwiXCIpKSA/IFwiXCIgOiBudWxsLFxuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IChjdXJzb3IuaXNTdGFydFRhZygpICYmIGN1cnNvci5nZXROYW1lSW5mbygpPy5uYW1lICYmIGBbZ3JhcGhpYyR7cXVvdGVOYW1lUGFkQmVmb3JlKGN1cnNvcil9XWApIHx8IG51bGwsXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4gKGN1cnNvci5pc0VuZFRhZygpKSA/IFwiXCIgOiBudWxsXG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIEhlYWRpbmcgcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJoZWFkaW5nXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwidGFiX2ZvY3VzXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IsIF9vbGRDdXJzb3I6IFNSQ3Vyc29yLCBtb2RlOiBOYXZpZ2F0aW9uTW9kZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChtb2RlID09PSBcInRhYl9mb2N1c1wiICYmIGN1cnNvci5pc1N0YXJ0VGFnKCkpIHJldHVybiBcIlwiO1xuICAgICAgICAgICAgICAgIGlmIChtb2RlID09PSBcIml0ZW1cIiAmJiBjdXJzb3IuaXNFbmRUYWcoKSkgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICAgICAgbGV0IGxldmVsOiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgY29uc3Qgbm9kZSA9IGN1cnNvci5nZXRFbGVtZW50KCk7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUuYXJpYUxldmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEV4cGxpY2l0IGFyaWEtbGV2ZWwgYXR0cmlidXRlXG4gICAgICAgICAgICAgICAgICAgIGxldmVsID0gbm9kZS5hcmlhTGV2ZWw7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChub2RlLmdldEF0dHJpYnV0ZSgncm9sZScpID09PSAnaGVhZGluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gcm9sZT1cImhlYWRpbmdcIiB3aXRob3V0IGFyaWEtbGV2ZWwgZGVmYXVsdHMgdG8gMlxuICAgICAgICAgICAgICAgICAgICBsZXZlbCA9ICcyJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBOYXRpdmUgaGVhZGluZyBlbGVtZW50IChoMS1oNiksIGV4dHJhY3QgbnVtYmVyIGZyb20gdGFnIG5hbWVcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSBub2RlLm5vZGVOYW1lLnN1YnN0cmluZygxKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgbmFtZUluZm8gPSBjdXJzb3IuZ2V0TmFtZUluZm8oKTtcbiAgICAgICAgICAgICAgICBpZiAoKCFuYW1lSW5mbyB8fCBbXCJjb250ZW50XCIsIFwidGV4dFwiXS5pbmNsdWRlcyhuYW1lSW5mby5uYW1lRnJvbSkpICYmICEobm9kZS50ZXh0Q29udGVudCB8fCBcIlwiKS50cmltKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKG5hbWVJbmZvICYmICFbXCJjb250ZW50XCIsIFwidGV4dFwiXS5pbmNsdWRlcyhuYW1lSW5mby5uYW1lRnJvbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBbaGVhZGluZyBsZXZlbCAke2xldmVsfSR7cXVvdGVOYW1lUGFkQmVmb3JlKGN1cnNvcil9XWA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBbaGVhZGluZyBsZXZlbCAke2xldmVsfV1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gLS0gaW4gaGVhZGluZyBtb2RlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImhlYWRpbmdcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcImhlYWRpbmdcIiwgXCJoMVwiLCBcImgyXCIsIFwiaDNcIiwgXCJoNFwiLCBcImg1XCIsIFwiaDZcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuaXNTdGFydFRhZygpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBjdXJzb3IuZ2V0Tm9kZSgpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICBsZXQgbGV2ZWw6IHN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIGlmIChub2RlLmFyaWFMZXZlbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXhwbGljaXQgYXJpYS1sZXZlbCBhdHRyaWJ1dGVcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsID0gbm9kZS5hcmlhTGV2ZWw7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobm9kZS5nZXRBdHRyaWJ1dGUoJ3JvbGUnKSA9PT0gJ2hlYWRpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByb2xlPVwiaGVhZGluZ1wiIHdpdGhvdXQgYXJpYS1sZXZlbCBkZWZhdWx0cyB0byAyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCA9ICcyJztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5hdGl2ZSBoZWFkaW5nIGVsZW1lbnQgKGgxLWg2KSwgZXh0cmFjdCBudW1iZXIgZnJvbSB0YWcgbmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSBub2RlLm5vZGVOYW1lLnN1YnN0cmluZygxKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGxldCBuYW1lSW5mbyA9IGN1cnNvci5nZXROYW1lSW5mbygpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoKCFuYW1lSW5mbyB8fCBbXCJjb250ZW50XCIsIFwidGV4dFwiXS5pbmNsdWRlcyhuYW1lSW5mby5uYW1lRnJvbSkpICYmICEobm9kZS50ZXh0Q29udGVudCB8fCBcIlwiKS50cmltKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFske3F1b3RlTmFtZVBhZEFmdGVyKGN1cnNvcil9aGVhZGluZyBsZXZlbCAke2xldmVsfV1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gSW1hZ2Ugcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJpbWdcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJpbWFnZVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5pc0VuZFRhZygpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY3Vyc29yLmdldE5hbWVJbmZvKCk/Lm5hbWUgJiYgY3Vyc29yLmdldE5hbWVJbmZvKCk/Lm5hbWUgIT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvbid0IGFubm91bmNlIHVubGFiZWxlZCBncmFwaGljcyB0aGF0IGFyZSBoaWRkZW4gaW5zaWRlIGxpbmtzIG9yIGhlYWRpbmdzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAodGhlc2Ugd2VyZSBvbmx5IGluY2x1ZGVkIGJlY2F1c2Ugb2YgdGhlIFNLSVBfSVRFTV9CRUhBVklPUiBjaGFuZ2UpXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRIZWFkaW5nT3JMaW5rID0gY3Vyc29yLmdldEN1cnJlbnRPclBhcmVudEJ5Um9sZUNsb25lKFtcImhlYWRpbmdcIiwgXCJsaW5rXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnRIZWFkaW5nT3JMaW5rICYmIFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKGN1cnNvci5nZXRFbGVtZW50KCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJbVW5sYWJlbGVkIGdyYXBoaWNdXCJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJzb3IuZ2V0TmFtZUluZm8oKT8ubmFtZSA9PT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFtncmFwaGljJHtxdW90ZU5hbWVQYWRCZWZvcmUoY3Vyc29yKX1dYFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBJbnNlcnRpb24gcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJpbnNlcnRpb25cIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4gKGN1cnNvci5pc1N0YXJ0VGFnKCkgJiYgYFtpbnNlcnRlZF1gIHx8IFwiXCIpXG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIExpbmsgcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJsaW5rXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwicmVnaW9uXCIsIFwibGlua1wiLCBcInRhYl9mb2N1c1wiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yLCBfb2xkQ3Vyc29yOiBTUkN1cnNvciwgbW9kZTogTmF2aWdhdGlvbk1vZGUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmlzU3RhcnRUYWcoKSAmJiAhW1wiY29udGVudFwiLCBcInRleHRcIl0uaW5jbHVkZXMoY3Vyc29yLmdldE5hbWVJbmZvKCk/Lm5hbWVGcm9tKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0TGlua0Fubm91bmNlbWVudChjdXJzb3IsIG1vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gTGlzdGl0ZW0gcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJsaXN0aXRlbVwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGlzT3JkZXJlZDogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBsZXQgcGFyZW50TGlzdEVsZW06IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGxldCB3YWxrUGFyZW50cyA9IERPTVdhbGtlci5wYXJlbnROb2RlKGN1cnNvci5nZXROb2RlKCkpO1xuICAgICAgICAgICAgICAgIHdoaWxlICh0eXBlb2YgaXNPcmRlcmVkID09PSBcInVuZGVmaW5lZFwiICYmIHdhbGtQYXJlbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh3YWxrUGFyZW50cy5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWxlbSA9IHdhbGtQYXJlbnRzIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwicm9sZVwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtLmdldEF0dHJpYnV0ZShcInJvbGVcIikgPT09IFwibGlzdFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzT3JkZXJlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRMaXN0RWxlbSA9IGVsZW07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiVUxcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzT3JkZXJlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudExpc3RFbGVtID0gZWxlbTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIk9MXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc09yZGVyZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudExpc3RFbGVtID0gZWxlbTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB3YWxrUGFyZW50cyA9IERPTVdhbGtlci5wYXJlbnROb2RlKHdhbGtQYXJlbnRzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgbGlzdGl0ZW0gY29udGFpbnMgaW50ZXJhY3RpdmUgZWxlbWVudHNcbiAgICAgICAgICAgICAgICAvLyBTY3JlZW4gcmVhZGVycyBkb24ndCByZWFkIHRoZSBhY2Nlc3NpYmxlIG5hbWUgd2hlbiBpbnRlcmFjdGl2ZSBlbGVtZW50cyBhcmUgcHJlc2VudFxuICAgICAgICAgICAgICAgIGNvbnN0IGhhc0ludGVyYWN0aXZlQ29udGVudCA9IGxpc3RpdGVtQ29udGFpbnNJbnRlcmFjdGl2ZUVsZW1lbnQoY3Vyc29yKTtcbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lVG9Vc2UgPSBoYXNJbnRlcmFjdGl2ZUNvbnRlbnQgPyBcIlwiIDogKGN1cnNvci5nZXROYW1lSW5mbygpPy5uYW1lIHx8IFwiXCIpO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGxldCByZXRTdHIgPSBcIlwiO1xuICAgICAgICAgICAgICAgIGlmICghaXNPcmRlcmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsZW0gPSBjdXJzb3IuZ2V0RWxlbWVudCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoKGVsZW0ubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJMSVwiICYmIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW0pLmxpc3RTdHlsZVR5cGUgPT09IFwibm9uZVwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgfHwgZWxlbS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpICE9PSBcIkxJXCIpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldFN0ciA9IGN1cnNvci5pc1N0YXJ0VGFnKCkgPyBgJHtuYW1lVG9Vc2V9YCA6IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXRTdHIgPSBjdXJzb3IuaXNTdGFydFRhZygpID8gYFtidWxsZXRdICR7bmFtZVRvVXNlfWAgOiBcIlwiO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRm9yIG9yZGVyZWQgbGlzdHMsIGNvdW50IHNpYmxpbmcgbGlzdGl0ZW1zIGFuZCBhY2NvdW50IGZvciBzdGFydCBhdHRyaWJ1dGVcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvdW50ID0gMTsgLy8gU3RhcnQgYXQgMSBieSBkZWZhdWx0XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIHN0YXJ0IGF0dHJpYnV0ZSBpZiBpdCBleGlzdHMgb24gdGhlIDxvbD4gZWxlbWVudFxuICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50TGlzdEVsZW0gJiYgcGFyZW50TGlzdEVsZW0ubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gJ09MJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50TGlzdEVsZW0uaGFzQXR0cmlidXRlKCdzdGFydCcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFydFZhbHVlID0gcGFyc2VJbnQocGFyZW50TGlzdEVsZW0uZ2V0QXR0cmlidXRlKCdzdGFydCcpIHx8ICcxJywgMTApO1xuICAgICAgICAgICAgICAgICAgICAgICAgY291bnQgPSBpc05hTihzdGFydFZhbHVlKSA/IDEgOiBzdGFydFZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAvLyBDb3VudCBwcmV2aW91cyBzaWJsaW5nIGxpc3RpdGVtcyBhdCB0aGUgc2FtZSBsZXZlbCB1c2luZyBET01XYWxrZXJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudEVsZW0gPSBjdXJzb3IuZ2V0RWxlbWVudCgpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgc2libGluZyA9IERPTVdhbGtlci5wcmV2aW91c1NpYmxpbmdOb3RPd25lZEJ5U2xvdChjdXJyZW50RWxlbSk7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChzaWJsaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IGNvdW50IGRpcmVjdCBzaWJsaW5ncyB0aGF0IGFyZSBsaXN0aXRlbXMgKGVsZW1lbnQgbm9kZXMgb25seSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaWJsaW5nLm5vZGVUeXBlID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2libGluZ0VsZW0gPSBzaWJsaW5nIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaWJsaW5nRWxlbS5nZXRBdHRyaWJ1dGUoJ3JvbGUnKSA9PT0gJ2xpc3RpdGVtJyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWJsaW5nRWxlbS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSAnTEknKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgc2libGluZyA9IERPTVdhbGtlci5wcmV2aW91c1NpYmxpbmdOb3RPd25lZEJ5U2xvdChzaWJsaW5nKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgcmV0U3RyID0gY3Vyc29yLmlzU3RhcnRUYWcoKSA/IGAke2NvdW50fS4gJHtuYW1lVG9Vc2V9YCA6IFwiXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXRTdHI7XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIE1hdGggcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJtYXRoXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IGN1cnNvci5pc0VuZFRhZygpID8gYFttYXRoIGNvbnRlbnRdYCA6IFwiXCJcbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gTGluayByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcIm1lbnVpdGVtXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwidGFiX2ZvY3VzXCIsIFwicmVnaW9uXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgcmV0VmFsID0gXCJcIjtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmlzU3RhcnRUYWcoKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBsZXQgaXNTdWJNZW51Q29udGFpbmVyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIC8vIGZvciAobGV0IGNoZWNrQ2hpbGRyZW49Y3Vyc29yLmdldE5vZGUoKS5maXJzdENoaWxkOyAhaXNTdWJNZW51Q29udGFpbmVyICYmIGNoZWNrQ2hpbGRyZW4gIT09IG51bGw7IGNoZWNrQ2hpbGRyZW4gPSBjaGVja0NoaWxkcmVuLm5leHRTaWJsaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBpc1N1Yk1lbnVDb250YWluZXIgPSBjaGVja0NoaWxkcmVuLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiVUxcIjtcbiAgICAgICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgICAgICAvLyBpZiAoaXNTdWJNZW51Q29udGFpbmVyKSByZXR1cm4gXCJbPz8/P21lbnVdXCI7XG4gICAgICAgICAgICAgICAgICAgIGxldCBleHBhbmRTdHIgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGVtID0gY3Vyc29yLmdldEVsZW1lbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1oYXNwb3B1cFwiKSA9PT0gXCJ0cnVlXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4cGFuZFN0ciArPSBcIiwgc3ViLW1lbnVcIjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbS5oYXNBdHRyaWJ1dGUoXCJhcmlhLWV4cGFuZGVkXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBleHBhbmRTdHIgKz0gYCwgJHtlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtZXhwYW5kZWRcIikgPT09IFwidHJ1ZVwiID8gXCJleHBhbmRlZFwiIDogXCJjb2xsYXBzZWRcIn1gO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gYFttZW51JHtleHBhbmRTdHJ9YDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5hbWVJbmZvID0gY3Vyc29yLmdldE5hbWVJbmZvKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lSW5mbyAmJiAhW1wiY29udGVudFwiLCBcInRleHRcIl0uaW5jbHVkZXMobmFtZUluZm8ubmFtZUZyb20pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwgKz0gcXVvdGVOYW1lUGFkQmVmb3JlKGN1cnNvcik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsICs9IFwiXVwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBNZXRlciByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcIm1ldGVyXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwidGFiX2ZvY3VzXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IGN1cnNvci5pc1N0YXJ0VGFnKCkgPyBgW3Byb2dyZXNzIGJhciwgJHsoKGN1cnNvci5nZXROb2RlKCkgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWUpfV1gIDogXCJcIlxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBQcm9ncmVzc2JhciByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcInByb2dyZXNzYmFyXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IGN1cnNvci5pc1N0YXJ0VGFnKCkgPyBgW3Byb2dyZXNzIGJhciwgJHsoKGN1cnNvci5nZXROb2RlKCkgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWUpfV1gIDogXCJcIlxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBSYWRpbyByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcInJhZGlvXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwidGFiX2ZvY3VzXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IsIF9vbGRDdXJzb3I/OiBTUkN1cnNvciwgbW9kZT86IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuaXNTdGFydFRhZygpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJvbGVEZXNjID0gZ2V0Um9sZURlc2NyaXB0aW9uKGN1cnNvciwgXCJyYWRpbyBidXR0b25cIik7XG4gICAgICAgICAgICAgICAgICAgIGxldCBiQ2hlY2tlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmdldEVsZW1lbnQoKS5oYXNBdHRyaWJ1dGUoXCJhcmlhLWNoZWNrZWRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJDaGVja2VkID0gY3Vyc29yLmdldEVsZW1lbnQoKS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWNoZWNrZWRcIikgPT09IFwidHJ1ZVwiO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgYkNoZWNrZWQgPSAoY3Vyc29yLmdldE5vZGUoKSBhcyBhbnkpLmNoZWNrZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGV0IHN0YXRlU3RyID0gZ2V0U3RhdGVBbm5vdW5jZW1lbnRzKGN1cnNvci5nZXRFbGVtZW50KCkpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFske3JvbGVEZXNjfSwgJHtiQ2hlY2tlZCA/IFwiY2hlY2tlZFwiIDogXCJub3QgY2hlY2tlZFwifSR7c3RhdGVTdHJ9JHtxdW90ZU5hbWVQYWRCZWZvcmUoY3Vyc29yKX0ke2dldERlc2NyaWJlZEJ5QW5ub3VuY2VtZW50cyhjdXJzb3IuZ2V0RWxlbWVudCgpLCBtb2RlKX1dYFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gU2VhcmNoYm94IHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wic2VhcmNoYm94XCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwidGFiX2ZvY3VzXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IGN1cnNvci5pc1N0YXJ0VGFnKCkgPyBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX1lZGl0XWAgOiBcIlwiXG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIFNlcGFyYXRvciByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcInNlcGFyYXRvclwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiAoY3Vyc29yLmlzU3RhcnRUYWcoKSAmJiBgW3NlcGFyYXRvcl1gIHx8IFwiXCIpXG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIFNsaWRlciByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcInNsaWRlclwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInRhYl9mb2N1c1wiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yLCBfb2xkQ3Vyc29yPzogU1JDdXJzb3IsIG1vZGU/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWN1cnNvci5pc1N0YXJ0VGFnKCkpIHJldHVybiBcIlwiO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvbGVEZXNjID0gZ2V0Um9sZURlc2NyaXB0aW9uKGN1cnNvciwgXCJzbGlkZXJcIik7XG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbSA9IGN1cnNvci5nZXRFbGVtZW50KCk7XG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGFyaWEtdmFsdWVub3cgZmlyc3QsIHRoZW4gZmFsbCBiYWNrIHRvIG5hdGl2ZSB2YWx1ZSBwcm9wZXJ0eVxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZWxlbS5oYXNBdHRyaWJ1dGUoXCJhcmlhLXZhbHVlbm93XCIpXG4gICAgICAgICAgICAgICAgICAgID8gZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLXZhbHVlbm93XCIpXG4gICAgICAgICAgICAgICAgICAgIDogKGN1cnNvci5nZXROb2RlKCkgYXMgYW55KS52YWx1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYFske3F1b3RlTmFtZVBhZEFmdGVyKGN1cnNvcil9JHtyb2xlRGVzY30sICR7dmFsdWV9JHtnZXREZXNjcmliZWRCeUFubm91bmNlbWVudHMoY3Vyc29yLmdldEVsZW1lbnQoKSwgbW9kZSl9XWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIFNwaW5idXR0b24gcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJzcGluYnV0dG9uXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwidGFiX2ZvY3VzXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IsIF9vbGRDdXJzb3I/OiBTUkN1cnNvciwgbW9kZT86IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghY3Vyc29yLmlzU3RhcnRUYWcoKSkgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm9sZURlc2MgPSBnZXRSb2xlRGVzY3JpcHRpb24oY3Vyc29yLCBcInNwaW5idXR0b25cIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBbJHtxdW90ZU5hbWVQYWRBZnRlcihjdXJzb3IpfSR7cm9sZURlc2N9LCBlZGl0YWJsZSR7Z2V0RGVzY3JpYmVkQnlBbm5vdW5jZW1lbnRzKGN1cnNvci5nZXRFbGVtZW50KCksIG1vZGUpfV1gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBUYWIgcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJ0YWJcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJ0YWJfZm9jdXNcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghY3Vyc29yLmlzU3RhcnRUYWcoKSkgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm9sZURlc2MgPSBnZXRSb2xlRGVzY3JpcHRpb24oY3Vyc29yLCBcInRhYlwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYFske3JvbGVEZXNjfSR7KGN1cnNvci5nZXROb2RlKCkgYXMgSFRNTEVsZW1lbnQpLmdldEF0dHJpYnV0ZShcImFyaWEtc2VsZWN0ZWRcIikgPT09IFwidHJ1ZVwiID8gXCIsIHNlbGVjdGVkXCIgOiBcIlwifSR7cXVvdGVOYW1lUGFkQmVmb3JlKGN1cnNvcil9XWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIFRhYmxpc3Qgcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJ0YWJsaXN0XCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmdldE5hbWVJbmZvKCkgPT09IG51bGwpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuaXNTdGFydFRhZygpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgW2dyb3VwIHN0YXJ0JHtxdW90ZU5hbWVQYWRCZWZvcmUoY3Vyc29yKX1dYDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFtncm91cCBlbmQke3F1b3RlTmFtZVBhZEJlZm9yZShjdXJzb3IpfV1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gVGFicGFuZWwgcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJ0YWJwYW5lbFwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5nZXROYW1lSW5mbygpID09PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmlzU3RhcnRUYWcoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFtUYWIgcGFuZWwgc3RhcnQke3F1b3RlTmFtZVBhZEJlZm9yZShjdXJzb3IpfV1gO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgW1RhYiBwYW5lbCBlbmQke3F1b3RlTmFtZVBhZEJlZm9yZShjdXJzb3IpfV1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gVGV4dCByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcInRleHRcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJsaW5rXCIsIFwidGFiX2ZvY3VzXCIsIFwicmVnaW9uXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmlzRW5kVGFnKCkgfHwgIWN1cnNvci5nZXRQYXJlbnRFbGVtZW50KCk/LmdldEVsZW1lbnQoKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbSA9IGN1cnNvci5nZXRQYXJlbnRFbGVtZW50KCk/LmdldEVsZW1lbnQoKTtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoZWxlbSkudGV4dERlY29yYXRpb25MaW5lID09PSBcImxpbmUtdGhyb3VnaFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgW3N0cmlrZXRocm91Z2hdICR7KGN1cnNvci5nZXROYW1lSW5mbygpPy5uYW1lICsgXCJcIil9IFtlbmQgc3RyaWtldGhyb3VnaF1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYCR7KGN1cnNvci5nZXROYW1lSW5mbygpPy5uYW1lICsgXCJcIil9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gLS0gaW4gaGVhZGluZyBtb2RlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcInRleHRcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcImhlYWRpbmdcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4gXCJcIlxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBUZXh0Ym94IHJvbGVcbiAgICAgICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgICAgIHJvbGVzOiBbXCJ0ZXh0Ym94XCJdLFxuICAgICAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJ0YWJfZm9jdXNcIl0sXG4gICAgICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yLCBfb2xkQ3Vyc29yPzogU1JDdXJzb3IsIG1vZGU/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZWxlbSA9IGN1cnNvci5nZXRFbGVtZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuaXNFbmRUYWcoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vZGUgPT09IFwiaXRlbVwiICYmIGVsZW0ubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJURVhUQVJFQVwiID8gXCJbb3V0IG9mIGVkaXRdXCIgOiBcIlwiO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgXG4gICAgICAgICAgICAgICAgICAgIGlmICghY3Vyc29yLmlzU3RhcnRUYWcoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICBcbiAgICAgICAgICAgICAgICAgICAgbGV0IGF0dHJpYnV0ZXMgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbS5oYXNBdHRyaWJ1dGUoXCJwbGFjZWhvbGRlclwiKSAmJiBlbGVtLmdldEF0dHJpYnV0ZShcInBsYWNlaG9sZGVyXCIpLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzICs9IGAsIHBsYWNlaG9sZGVyOiAke2VsZW0uZ2V0QXR0cmlidXRlKFwicGxhY2Vob2xkZXJcIil9YDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzICs9IGdldFN0YXRlQW5ub3VuY2VtZW50cyhlbGVtKTtcbiAgICBcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNNdWx0aWxpbmUgPSBlbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiVEVYVEFSRUFcIiB8fCBlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtbXVsdGlsaW5lXCIpID09PSBcInRydWVcIjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVzY3JpYmVkQnkgPSBnZXREZXNjcmliZWRCeUFubm91bmNlbWVudHMoZWxlbSwgbW9kZSk7XG4gICAgXG4gICAgICAgICAgICAgICAgICAgIGlmIChpc011bHRpbGluZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGV4dENvbnRlbnQgPSBtb2RlID09PSBcInRhYl9mb2N1c1wiID8gZWxlbS50ZXh0Q29udGVudD8udHJpbSgpIDogXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRTdWZmaXggPSB0ZXh0Q29udGVudCA/IGAgJHt0ZXh0Q29udGVudH1gIDogXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX1lZGl0LCBtdWx0aWxpbmUke2F0dHJpYnV0ZXN9JHtkZXNjcmliZWRCeX1dJHtjb250ZW50U3VmZml4fWA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICBcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBbJHtxdW90ZU5hbWVQYWRBZnRlcihjdXJzb3IpfWVkaXQke2F0dHJpYnV0ZXN9JHtkZXNjcmliZWRCeX1dYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdXG4gICAgICAgIH0pLFxuXG4gICAgLy8gVHJlZWl0ZW0gcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJ0cmVlaXRlbVwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInRhYl9mb2N1c1wiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5pc0VuZFRhZygpKSByZXR1cm4gXCJcIjtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtID0gY3Vyc29yLmdldEVsZW1lbnQoKTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBCdWlsZCB0aGUgYW5ub3VuY2VtZW50IHN0cmluZyB3aXRob3V0IHRoZSBuYW1lIChsZXQgY29udGVudCByZW5kZXIgc2VwYXJhdGVseSlcbiAgICAgICAgICAgICAgICBsZXQgYW5ub3VuY2VtZW50ID0gYFt0cmVldmlldyBpdGVtYDtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBBZGQgc2VsZWN0ZWQgc3RhdGUgaWYgcHJlc2VudFxuICAgICAgICAgICAgICAgIGlmIChlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtc2VsZWN0ZWRcIikgPT09IFwidHJ1ZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGFubm91bmNlbWVudCArPSBcIiwgc2VsZWN0ZWRcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gQWRkIGV4cGFuZGVkL2NvbGxhcHNlZCBzdGF0ZSBpZiBwcmVzZW50XG4gICAgICAgICAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwiYXJpYS1leHBhbmRlZFwiKSkge1xuICAgICAgICAgICAgICAgICAgICBhbm5vdW5jZW1lbnQgKz0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWV4cGFuZGVkXCIpID09PSBcInRydWVcIiA/IFwiLCBleHBhbmRlZFwiIDogXCIsIGNvbGxhcHNlZFwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBBZGQgbGV2ZWwgaWYgZXhwbGljaXRseSBzZXQgb3IgY2FsY3VsYXRlIGZyb20gbmVzdGluZ1xuICAgICAgICAgICAgICAgIGxldCBsZXZlbCA9IGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1sZXZlbFwiKTtcbiAgICAgICAgICAgICAgICBpZiAobGV2ZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgYW5ub3VuY2VtZW50ICs9IGAsIGxldmVsICR7bGV2ZWx9YDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBDYWxjdWxhdGUgbGV2ZWwgYnkgY291bnRpbmcgcGFyZW50IHRyZWVpdGVtcyBvciBncm91cHMgdXNpbmcgRE9NV2Fsa2VyIGZvciBzaGFkb3cgRE9NIHN1cHBvcnRcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNhbGN1bGF0ZWRMZXZlbCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwYXJlbnQgPSBET01XYWxrZXIucGFyZW50RWxlbWVudChlbGVtKTtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHBhcmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyZW50Um9sZSA9IEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZShwYXJlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudFJvbGUgPT09IFwiZ3JvdXBcIiB8fCBwYXJlbnRSb2xlID09PSBcInRyZWVcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgZ3JvdXAgaXMgaW5zaWRlIGEgdHJlZWl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZ3JvdXBQYXJlbnQgPSBET01XYWxrZXIucGFyZW50RWxlbWVudChwYXJlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChncm91cFBhcmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBncm91cFBhcmVudFJvbGUgPSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUoZ3JvdXBQYXJlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ3JvdXBQYXJlbnRSb2xlID09PSBcInRyZWVpdGVtXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGN1bGF0ZWRMZXZlbCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZ3JvdXBQYXJlbnRSb2xlID09PSBcInRyZWVcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBQYXJlbnQgPSBET01XYWxrZXIucGFyZW50RWxlbWVudChncm91cFBhcmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQocGFyZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoY2FsY3VsYXRlZExldmVsID4gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3VuY2VtZW50ICs9IGAsIGxldmVsICR7Y2FsY3VsYXRlZExldmVsfWA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gQWRkIHBvc2l0aW9uIGluZm9ybWF0aW9uIChhcmlhLXBvc2luc2V0L2FyaWEtc2V0c2l6ZSBvciBjYWxjdWxhdGUpXG4gICAgICAgICAgICAgICAgbGV0IHBvc2l0aW9uID0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLXBvc2luc2V0XCIpO1xuICAgICAgICAgICAgICAgIGxldCBzZXRTaXplID0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLXNldHNpemVcIik7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgaWYgKCFwb3NpdGlvbiB8fCAhc2V0U2l6ZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBDYWxjdWxhdGUgcG9zaXRpb24gYnkgY291bnRpbmcgc2libGluZ3Mgd2l0aCBzYW1lIHJvbGUgdXNpbmcgRE9NV2Fsa2VyIGZvciBzaGFkb3cgRE9NIHN1cHBvcnRcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBvcyA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0b3RhbCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KGVsZW0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJdGVyYXRlIHRocm91Z2ggY2hpbGRyZW4gdG8gY291bnQgdHJlZWl0ZW1zXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2hpbGQgPSBET01XYWxrZXIuZmlyc3RDaGlsZE5vdE93bmVkQnlTbG90KHBhcmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoY2hpbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQubm9kZVR5cGUgPT09IDEpIHsgLy8gRWxlbWVudCBub2RlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkRWxlbSA9IGNoaWxkIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKGNoaWxkRWxlbSkgPT09IFwidHJlZWl0ZW1cIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWwrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZEVsZW0gPT09IGVsZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3MgPSB0b3RhbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZCA9IGNoaWxkLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIHNldFNpemUgPSB0b3RhbC50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBhbm5vdW5jZW1lbnQgKz0gYCwgJHtwb3NpdGlvbn0gb2YgJHtzZXRTaXplfV0gYDtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICByZXR1cm4gYW5ub3VuY2VtZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBIVE1MIEVsZW1lbnQgcnVsZXNcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW10sXG4gICAgICAgIGVsZW1zOiBbXCJCT0RZXCJdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInRhYl9mb2N1c1wiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGl0bGVTdHIgPSBjdXJzb3IuZ2V0Tm9kZSgpLm93bmVyRG9jdW1lbnQudGl0bGU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnNvci5pc0VuZFRhZygpID8gYFtFbmQgb2YgZG9jdW1lbnQke3RpdGxlU3RyLnRyaW0oKS5sZW5ndGggPiAwID8gXCI6IFwiICsgdGl0bGVTdHIudHJpbSgpIDogXCJcIn1dYCA6IGBbU3RhcnQgb2YgZG9jdW1lbnQke3RpdGxlU3RyLnRyaW0oKS5sZW5ndGggPiAwID8gXCI6IFwiICsgdGl0bGVTdHIudHJpbSgpIDogXCJcIn1dYFxuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW10sXG4gICAgICAgIGVsZW1zOiBbXCJJRlJBTUVcIl0sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwidGFiX2ZvY3VzXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBhY2Nlc3NXYXJuaW5nID0gY2FuQWNjZXNzRnJhbWUoY3Vyc29yLmdldE5vZGUoKSkgPyBcIlwiIDogXCJ7RW11bGF0b3IgdW5hYmxlIHRvIGFjY2VzcyBmcmFtZX1cIlxuICAgICAgICAgICAgICAgIHJldHVybiBjdXJzb3IuaXNFbmRUYWcoKSA/IFwiXCIgOiBhY2Nlc3NXYXJuaW5nO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW10sXG4gICAgICAgIGVsZW1zOiBbXCJCUlwiXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB3YWxrID0gY3Vyc29yLmNsb25lKCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIFdhbGsgdW50aWwgd2UgaGl0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBhZ2UsIGZpbmQgYW5vdGhlciBCUiwgb3IgZmluZCBzb21ldGhpbmcgd2l0aCBhIG5hbWVcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHdhbGsucHJldmlvdXMoKCkgPT4gdHJ1ZSkgJiYgd2Fsay5nZXROb2RlKCkubm9kZU5hbWUudG9VcHBlckNhc2UoKSAhPT0gXCJCUlwiICYmIHdhbGsuZ2V0TmFtZUluZm8oKSAmJiB3YWxrLmdldE5hbWVJbmZvKCkubmFtZS50cmltKCkubGVuZ3RoID09PSAwKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdhbGsuZ2V0Tm9kZSgpLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiQlJcIiA/IFwiW2JsYW5rXVwiIDogbnVsbDtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtdLFxuICAgICAgICBlbGVtczogW1wiRExcIl0sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IFwiXCJcbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtdLFxuICAgICAgICBlbGVtczogW1wiSU5QVVRcIl0sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwidGFiX2ZvY3VzXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IsIF9vbGRDdXJzb3I/OiBTUkN1cnNvciwgbW9kZT86IHN0cmluZykgPT4gKGN1cnNvci5pc1N0YXJ0VGFnKCkgJiYgY3Vyc29yLmdldEVsZW1lbnQoKT8uZ2V0QXR0cmlidXRlKFwidHlwZVwiKSA9PT0gXCJwYXNzd29yZFwiICYmIGBbJHtxdW90ZU5hbWVQYWRBZnRlcihjdXJzb3IpfWVkaXQsIHByb3RlY3RlZCR7Z2V0RGVzY3JpYmVkQnlBbm5vdW5jZW1lbnRzKGN1cnNvci5nZXRFbGVtZW50KCksIG1vZGUpfV1gKSB8fCBudWxsLFxuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IsIF9vbGRDdXJzb3I/OiBTUkN1cnNvciwgbW9kZT86IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuaXNTdGFydFRhZygpICYmIGN1cnNvci5nZXRFbGVtZW50KCk/LmdldEF0dHJpYnV0ZShcInR5cGVcIikgPT09IFwiZmlsZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IChjdXJzb3IuZ2V0RWxlbWVudCgpIGFzIEhUTUxJbnB1dEVsZW1lbnQpPy52YWx1ZSB8fCBcIlwiO1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlID09PSBcIlwiID8gXCJObyBmaWxlIGNob3NlblwiIDogdmFsdWUuc3Vic3RyaW5nKFwiQzpcXFxcZmFrZXBhdGhcXFxcXCIubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBbJHtxdW90ZU5hbWVQYWRBZnRlcihjdXJzb3IpfWJ1dHRvbiR7Z2V0RGVzY3JpYmVkQnlBbm5vdW5jZW1lbnRzKGN1cnNvci5nZXRFbGVtZW50KCksIG1vZGUpfV0gWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX0ke3ZhbHVlfV1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvciwgX29sZEN1cnNvcj86IFNSQ3Vyc29yLCBtb2RlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5pc1N0YXJ0VGFnKCkgJiYgY3Vyc29yLmdldEVsZW1lbnQoKT8uZ2V0QXR0cmlidXRlKFwidHlwZVwiKSA9PT0gXCJjb2xvclwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IChjdXJzb3IuZ2V0RWxlbWVudCgpIGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByID0gKE51bWJlcihgMHgke3ZhbC5zdWJzdHJpbmcoMSwgMyl9YCkgKiAxMDAuMCAvIE51bWJlcihcIjB4ZmZcIikpLnRvRml4ZWQoMCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGcgPSAoTnVtYmVyKGAweCR7dmFsLnN1YnN0cmluZygzLCA1KX1gKSAqIDEwMC4wIC8gTnVtYmVyKFwiMHhmZlwiKSkudG9GaXhlZCgwKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYiA9IChOdW1iZXIoYDB4JHt2YWwuc3Vic3RyaW5nKDUpfWApICogMTAwLjAgLyBOdW1iZXIoXCIweGZmXCIpKS50b0ZpeGVkKDApO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFske3F1b3RlTmFtZVBhZEFmdGVyKGN1cnNvcil9Y2xpY2thYmxlJHtnZXREZXNjcmliZWRCeUFubm91bmNlbWVudHMoY3Vyc29yLmdldEVsZW1lbnQoKSwgbW9kZSl9XSBbJHtyfSUgcmVkICR7Z30lIGdyZWVuICR7Yn0lIGJsdWVdYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IsIF9vbGRDdXJzb3I/OiBTUkN1cnNvciwgbW9kZT86IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuaXNTdGFydFRhZygpICYmIGN1cnNvci5nZXRFbGVtZW50KCk/LmdldEF0dHJpYnV0ZShcInR5cGVcIikgPT09IFwibW9udGhcIikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSAoY3Vyc29yLmdldEVsZW1lbnQoKSBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHkgPSBcIjBcIjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG0gPSBcIjBcIjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbC50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGUgPSBuZXcgRGF0ZSh2YWwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgeSA9IFwiXCIgKyBkYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBtID0gXCJcIiArIChkYXRlLmdldE1vbnRoKCkgKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFske3F1b3RlTmFtZVBhZEFmdGVyKGN1cnNvcil9Y2xpY2thYmxlJHtnZXREZXNjcmliZWRCeUFubm91bmNlbWVudHMoY3Vyc29yLmdldEVsZW1lbnQoKSwgbW9kZSl9XSBbc3BpbiBidXR0b24sICR7bX1dIFtzcGluIGJ1dHRvbiwgJHt5fV0gW21lbnUgYnV0dG9uXSBbc3ViTWVudV0gU2hvdyBtb250aCBwaWNrZXJgO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvciwgX29sZEN1cnNvcj86IFNSQ3Vyc29yLCBtb2RlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5pc1N0YXJ0VGFnKCkgJiYgY3Vyc29yLmdldEVsZW1lbnQoKT8uZ2V0QXR0cmlidXRlKFwidHlwZVwiKSA9PT0gXCJkYXRlXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsID0gKGN1cnNvci5nZXRFbGVtZW50KCkgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGxldCB5ID0gXCIwXCI7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtID0gXCIwXCI7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkYXkgPSBcIjBcIjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbC50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGUgPSBuZXcgRGF0ZSh2YWwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgeSA9IFwiXCIgKyBkYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBtID0gXCJcIiArIChkYXRlLmdldE1vbnRoKCkgKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRheSA9IFwiXCIgKyAoZGF0ZS5nZXREYXRlKCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX1jbGlja2FibGUke2dldERlc2NyaWJlZEJ5QW5ub3VuY2VtZW50cyhjdXJzb3IuZ2V0RWxlbWVudCgpLCBtb2RlKX1dIFtzcGluIGJ1dHRvbiwgJHttfV0gLyBbc3BpbiBidXR0b24sICR7ZGF5fV0gLyBbc3BpbiBidXR0b24sICR7eX1dIFttZW51IGJ1dHRvbl0gW3N1Yk1lbnVdIFNob3cgZGF0ZSBwaWNrZXJgO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvciwgX29sZEN1cnNvcj86IFNSQ3Vyc29yLCBtb2RlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5pc1N0YXJ0VGFnKCkgJiYgY3Vyc29yLmdldEVsZW1lbnQoKT8uZ2V0QXR0cmlidXRlKFwidHlwZVwiKSA9PT0gXCJkYXRldGltZS1sb2NhbFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IChjdXJzb3IuZ2V0RWxlbWVudCgpIGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlOyAvLyAyMDI1LTA5LTEyVDA0OjIwXG4gICAgICAgICAgICAgICAgICAgIGxldCB5ID0gXCIwXCI7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtID0gXCIwXCI7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkYXkgPSBcIjBcIjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGhvdXIgPSBcIjBcIjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1pbiA9IFwiMFwiO1xuICAgICAgICAgICAgICAgICAgICBsZXQgYW1wbSA9IFwiMFwiO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGF0ZSA9IG5ldyBEYXRlKHZhbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB5ID0gXCJcIiArIGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG0gPSBcIlwiICsgKGRhdGUuZ2V0TW9udGgoKSArIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF5ID0gXCJcIiArIChkYXRlLmdldERhdGUoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0ZS5nZXRIb3VycygpID09PSAwIHx8IGRhdGUuZ2V0SG91cnMoKSA9PT0gMTIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3VyID0gXCIxMlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRlLmdldEhvdXJzKCkgPCAxMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvdXIgPSBcIlwiICsgZGF0ZS5nZXRIb3VycygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3VyID0gXCJcIiArIChkYXRlLmdldEhvdXJzKCkgLSAxMik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBtaW4gPSBcIlwiICsgZGF0ZS5nZXRNaW51dGVzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbXBtID0gZGF0ZS5nZXRIb3VycygpID49IDEyID8gXCJwbVwiIDogXCJhbVwiO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX1jbGlja2FibGUke2dldERlc2NyaWJlZEJ5QW5ub3VuY2VtZW50cyhjdXJzb3IuZ2V0RWxlbWVudCgpLCBtb2RlKX1dIFtzcGluIGJ1dHRvbiwgJHttfV0gLyBbc3BpbiBidXR0b24sICR7ZGF5fV0gLyBbc3BpbiBidXR0b24sICR7eX1dIFtzcGluIGJ1dHRvbiwgJHtob3VyfV0gOiBbc3BpbiBidXR0b24sICR7bWlufV0gW3NwaW4gYnV0dG9uLCAke2FtcG19XSAgW21lbnUgYnV0dG9uXSBbc3ViTWVudV0gU2hvdyBsb2NhbCBkYXRlIGFuZCB0aW1lIHBpY2tlcmA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yLCBfb2xkQ3Vyc29yPzogU1JDdXJzb3IsIG1vZGU/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmlzU3RhcnRUYWcoKSAmJiBjdXJzb3IuZ2V0RWxlbWVudCgpPy5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpID09PSBcInRpbWVcIikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSAoY3Vyc29yLmdldEVsZW1lbnQoKSBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZTsgLy8gMjAyNS0wOS0xMlQwNDoyMFxuICAgICAgICAgICAgICAgICAgICBsZXQgaG91ciA9IFwiMFwiO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWluID0gXCIwXCI7XG4gICAgICAgICAgICAgICAgICAgIGxldCBhbXBtID0gXCIwXCI7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWwudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkYXRlID0gdmFsLnNwbGl0KFwiOlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBob3VycyA9IHBhcnNlSW50KGRhdGVbMF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhvdXJzID09PSAwIHx8IGhvdXJzID09PSAxMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvdXIgPSBcIjEyXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXJzIDwgMTIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3VyID0gXCJcIiArIGhvdXJzO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3VyID0gXCJcIiArIChob3VycyAtIDEyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbiA9IGRhdGVbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBhbXBtID0gaG91cnMgPj0gMTIgPyBcInBtXCIgOiBcImFtXCI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBbJHtxdW90ZU5hbWVQYWRBZnRlcihjdXJzb3IpfWdyb3VwaW5nIGNsaWNrYWJsZSR7Z2V0RGVzY3JpYmVkQnlBbm5vdW5jZW1lbnRzKGN1cnNvci5nZXRFbGVtZW50KCksIG1vZGUpfSBbc3BpbiBidXR0b24sICR7aG91cn1dIDogW3NwaW4gYnV0dG9uLCAke21pbn1dIFtzcGluIGJ1dHRvbiwgJHthbXBtfV0gW21lbnUgYnV0dG9uXSBbc3ViTWVudV0gU2hvdyB0aW1lIHBpY2tlciBbb3V0IG9mIGdyb3VwaW5nXWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yLCBfb2xkQ3Vyc29yPzogU1JDdXJzb3IsIG1vZGU/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmlzU3RhcnRUYWcoKSAmJiBjdXJzb3IuZ2V0RWxlbWVudCgpPy5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpID09PSBcIndlZWtcIikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSAoY3Vyc29yLmdldEVsZW1lbnQoKSBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZTsgLy8gMjAyNS1XMzhcbiAgICAgICAgICAgICAgICAgICAgbGV0IHllYXIgPSBcIjBcIjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHdlZWsgPSBcIjBcIjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbC50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGUgPSB2YWwuc3BsaXQoLy1XLyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB5ZWFyID0gZGF0ZVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdlZWsgPSBkYXRlWzFdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX1jbGlja2FibGUke2dldERlc2NyaWJlZEJ5QW5ub3VuY2VtZW50cyhjdXJzb3IuZ2V0RWxlbWVudCgpLCBtb2RlKX1dIFtzcGluIGJ1dHRvbiwgJHt3ZWVrfV0sIFtzcGluIGJ1dHRvbiwgJHt5ZWFyfV0gW21lbnUgYnV0dG9uXSBbc3ViTWVudV0gU2hvdyB3ZWVrIHBpY2tlcmA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiBjdXJzb3IuZ2V0RWxlbWVudCgpPy5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpID09PSBcImhpZGRlblwiID8gXCJcIiA6IG51bGwsXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4gKGN1cnNvci5pc1N0YXJ0VGFnKCkgJiYgYCEhWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX1pbnB1dCEhXSR7Y3Vyc29yLmdldEVsZW1lbnQoKS5vdXRlckhUTUx9YCkgfHwgbnVsbFxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW10sXG4gICAgICAgIGVsZW1zOiBbXCJMSVwiXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIGxpc3RpdGVtIGNvbnRhaW5zIGludGVyYWN0aXZlIGVsZW1lbnRzXG4gICAgICAgICAgICAgICAgLy8gU2NyZWVuIHJlYWRlcnMgZG9uJ3QgcmVhZCB0aGUgYWNjZXNzaWJsZSBuYW1lIHdoZW4gaW50ZXJhY3RpdmUgZWxlbWVudHMgYXJlIHByZXNlbnRcbiAgICAgICAgICAgICAgICBjb25zdCBoYXNJbnRlcmFjdGl2ZUNvbnRlbnQgPSBsaXN0aXRlbUNvbnRhaW5zSW50ZXJhY3RpdmVFbGVtZW50KGN1cnNvcik7XG4gICAgICAgICAgICAgICAgY29uc3QgbmFtZVRvVXNlID0gaGFzSW50ZXJhY3RpdmVDb250ZW50ID8gXCJcIiA6IChjdXJzb3IuZ2V0TmFtZUluZm8oKT8ubmFtZSB8fCBcIlwiKTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtID0gY3Vyc29yLmdldEVsZW1lbnQoKTtcbiAgICAgICAgICAgICAgICBpZiAod2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbSkubGlzdFN0eWxlVHlwZSA9PT0gXCJub25lXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGN1cnNvci5pc1N0YXJ0VGFnKCkgPyBgJHtuYW1lVG9Vc2V9YCA6IFwiXCI7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGN1cnNvci5pc1N0YXJ0VGFnKCkgPyBgW2J1bGxldF0gJHtuYW1lVG9Vc2V9YCA6IFwiXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBNYXRoTUwgZWxlbWVudHNcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW10sXG4gICAgICAgIGVsZW1zOiBbXCJNRlJBQ1wiXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4gY3Vyc29yLmlzU3RhcnRUYWcoKSA/IGBbZnJhY3Rpb25dYCA6IGBbZW5kIGZyYWN0aW9uXWBcbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtdLFxuICAgICAgICBlbGVtczogW1wiTVJPV1wiXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIC8vIE9ubHkgYW5ub3VuY2Ugb3ZlciBvbiB0aGUgZW5kIHRhZ1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuaXNTdGFydFRhZygpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGxldCBmcmFjdGlvbiA9IGN1cnNvci5nZXRDdXJyZW50T3JQYXJlbnRCeVJvbGVDbG9uZShbXSwgW1wibWZyYWNcIl0pO1xuICAgICAgICAgICAgICAgIGlmIChmcmFjdGlvbiAmJiBmcmFjdGlvbi5nZXRFbGVtZW50KCkucXVlcnlTZWxlY3RvckFsbChcIm1yb3dcIilbMF0/LmlzU2FtZU5vZGUoY3Vyc29yLmdldE5vZGUoKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiW292ZXJdXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW10sXG4gICAgICAgIGVsZW1zOiBbXCJNU1FSVFwiXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4gY3Vyc29yLmlzU3RhcnRUYWcoKSA/IGBbc3F1YXJlIHJvb3RdYCA6IGBbZW5kIHJvb3RdYFxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW10sXG4gICAgICAgIGVsZW1zOiBbXCJNU1VQXCJdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5pc0VuZFRhZygpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1pID0gY3Vyc29yLmdldEVsZW1lbnQoKS5xdWVyeVNlbGVjdG9yKFwibWlcIik/LmlubmVySFRNTCB8fCBcIlwiO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1uID0gY3Vyc29yLmdldEVsZW1lbnQoKS5xdWVyeVNlbGVjdG9yKFwibW5cIik/LmlubmVySFRNTCB8fCBcIlwiO1xuICAgICAgICAgICAgICAgIGlmIChtbiA9PT0gXCIyXCIpIHJldHVybiBgJHttaX0gW3NxdWFyZWRdYDtcbiAgICAgICAgICAgICAgICBpZiAobW4gPT09IFwiM1wiKSByZXR1cm4gYCR7bWl9IFtjdWJlZF1gO1xuICAgICAgICAgICAgICAgIHJldHVybiBgJHttaX0gW3RvIHRoZSAke21ufV1gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBNdWx0aXBsZSByb2xlcyBydWxlcyAtIHBsYWNlZCBhdCB0aGUgYm90dG9tXG4gICAgXG4gICAgLy8gRGVmYXVsdCBtb2RlIHJ1bGVzIC0gQ29udGFpbmVyIGVsZW1lbnRzIChtdWx0aXBsZSByb2xlcylcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiYXJ0aWNsZVwiLCBcImJhbm5lclwiLCBcImJsb2NrcXVvdGVcIiwgXCJjYXB0aW9uXCIsIFwiY2VsbFwiLCBcImNvZGVcIiwgXCJjb2x1bW5oZWFkZXJcIixcbiAgICAgICAgICAgIFwiY29tcGxlbWVudGFyeVwiLCBcImNvbnRlbnRpbmZvXCIsIFwiZmlndXJlXCIsIFwiZm9ybVwiLCBcImdyb3VwXCIsIFwibGlzdFwiLCBcIm1haW5cIixcbiAgICAgICAgICAgIFwibWFya1wiLCBcIm5hdmlnYXRpb25cIiwgXCJyZWdpb25cIiwgXCJyb3dcIiwgXCJyb3doZWFkZXJcIiwgXCJzZWFyY2hcIiwgXCJ0YWJsZVwiLCBcInRvb2xiYXJcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4gXCJcIlxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBEZWZhdWx0IG1vZGUgcnVsZXMgLSBFbGVtZW50cyB0aGF0IHNjcmVlbiByZWFkZXJzIHR5cGljYWxseSBpZ25vcmUgKG11bHRpcGxlIHJvbGVzKVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJwYXJhZ3JhcGhcIiwgXCJyb3dncm91cFwiLCBcInN0YXR1c1wiLCBcInN0cm9uZ1wiLCBcInN1YnNjcmlwdFwiLCBcInN1cGVyc2NyaXB0XCIsXG4gICAgICAgICAgICBcInRlcm1cIiwgXCJ0aW1lXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiBcIlwiXG4gICAgICAgIF1cbiAgICB9KSxcbl1cbiIsImltcG9ydCB7IFNSUmVuZGVyZXJSdWxlIH0gZnJvbSBcIi4uL1NSUmVuZGVyZXJSdWxlXCI7XG5pbXBvcnQgeyBTUkN1cnNvciB9IGZyb20gXCIuLi9TUkN1cnNvclwiO1xuaW1wb3J0IHsgU1JUYWJsZVV0aWwgfSBmcm9tIFwiLi4vU1JUYWJsZVV0aWxcIjtcbmltcG9ydCB7IHF1b3RlTmFtZVBhZEFmdGVyLCBxdW90ZU5hbWVQYWRCZWZvcmUsIGdldFJvbGVEZXNjcmlwdGlvbiB9IGZyb20gXCIuL2NvbW1vblwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQVJJQURlZmluaXRpb25zIH0gZnJvbSBcIi4uLy4uLy4uL3YyL2FyaWEvQVJJQURlZmluaXRpb25zXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uLy4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG4vKipcbiAqIEdlbmVyYXRlcyB0aGUgYW5ub3VuY2VtZW50IHRleHQgd2hlbiBlbnRlcmluZyBhIHRhYmxlIGNlbGxcbiAqL1xuZnVuY3Rpb24gcmVuZGVyRW50ZXJUYWJsZUNlbGwobmV3Q3Vyc29yOiBTUkN1cnNvciwgb2xkQ3Vyc29yOiBTUkN1cnNvcikge1xuICAgIC8vIFdlIHNlZW0gdG8gYmUgYXQgdGhlIG5ld2xpbmUgdGV4dCBub2RlIGFmdGVyIHRoZSBjZWxsXG4gICAgaWYgKG9sZEN1cnNvciAmJiBvbGRDdXJzb3IuZ2V0Tm9kZSgpPy5ub2RlTmFtZSA9PT0gXCIjdGV4dFwiKSB7XG4gICAgICAgIG9sZEN1cnNvciA9IG9sZEN1cnNvci5jbG9uZSgpO1xuICAgICAgICBvbGRDdXJzb3IucHJldmlvdXMoKCkgPT4gdHJ1ZSlcbiAgICB9XG4gICAgY29uc3QgbmV3VGFibGVNb2RlbCA9IFNSVGFibGVVdGlsLmdldFRhYmxlTW9kZWwobmV3Q3Vyc29yKTtcbiAgICBjb25zdCBvbGRDZWxsSW5mbyA9IFNSVGFibGVVdGlsLmdldENlbGxNb2RlbChvbGRDdXJzb3IsIG5ld1RhYmxlTW9kZWwpO1xuICAgIGNvbnN0IG5ld0NlbGxJbmZvID0gU1JUYWJsZVV0aWwuZ2V0Q2VsbE1vZGVsKG5ld0N1cnNvciwgbmV3VGFibGVNb2RlbCk7XG4gICAgaWYgKCFuZXdDZWxsSW5mbykgcmV0dXJuIFwiXCI7XG4gICAgbGV0IHJldFZhbDogc3RyaW5nW10gPSBbXTtcblxuICAgIC8vIEFubm91bmNlIHJvdyBpbmZvcm1hdGlvbiBpZiB3ZSd2ZSBtb3ZlZCB0byBhIGRpZmZlcmVudCByb3cgb3IgdGhlIHJvd3NwYW4gaGFzIGNoYW5nZWRcbiAgICBpZiAoIW9sZENlbGxJbmZvIHx8IG9sZENlbGxJbmZvLnJvd0luZGV4U3RhcnQgIT09IG5ld0NlbGxJbmZvLnJvd0luZGV4U3RhcnQgfHwgb2xkQ2VsbEluZm8ucm93c3BhbiAhPT0gbmV3Q2VsbEluZm8ucm93c3Bhbikge1xuICAgICAgICAvLyBJZiBhIGNoYW5nZSBpbiByb3cgb3IgYSBjaGFuZ2UgaW4gcm93U3BhblxuICAgICAgICBsZXQgcm93SGVhZGVycyA9IFNSVGFibGVVdGlsLmdldFJvd0hlYWRlcnNGb3JDdXJzb3IobmV3Q3Vyc29yLCBuZXdUYWJsZU1vZGVsKTtcbiAgICAgICAgbGV0IGhlYWRlckluZm9TdHIgPSByb3dIZWFkZXJzICYmIHJvd0hlYWRlcnMudHJpbSgpLmxlbmd0aCA+IDAgPyBgXCIke3Jvd0hlYWRlcnN9XCIsIGAgOiBcIlwiO1xuICAgICAgICByZXRWYWwucHVzaChgWyR7aGVhZGVySW5mb1N0cn1yb3cgJHsobmV3Q2VsbEluZm8ucm93SW5kZXhTdGFydCsxKX0ke25ld0NlbGxJbmZvLnJvd3NwYW4gPiAxID8gXCIgdGhyb3VnaCBcIiArIChuZXdDZWxsSW5mby5yb3dJbmRleFN0YXJ0K25ld0NlbGxJbmZvLnJvd3NwYW4pIDogXCJcIn1dYCk7XG4gICAgfVxuXG4gICAgLy8gQW5ub3VuY2UgY29sdW1uIGluZm9ybWF0aW9uIGlmIHdlJ3ZlIG1vdmVkIHRvIGEgZGlmZmVyZW50IGNvbHVtbiBvciB0aGUgY29sc3BhbiBoYXMgY2hhbmdlZFxuICAgIGlmICghb2xkQ2VsbEluZm8gfHwgb2xkQ2VsbEluZm8uY29sSW5kZXhTdGFydCAhPT0gbmV3Q2VsbEluZm8uY29sSW5kZXhTdGFydCB8fCBvbGRDZWxsSW5mby5jb2xzcGFuICE9PSBuZXdDZWxsSW5mby5jb2xzcGFuKSB7XG4gICAgICAgIC8vIElmIGEgY2hhbmdlIGluIGNvbHVtbiBvciBhIGNoYW5nZSBpbiBjb2xzcGFuXG4gICAgICAgIGxldCBjb2x1bW5IZWFkZXJzID0gU1JUYWJsZVV0aWwuZ2V0Q29sdW1uSGVhZGVyc0ZvckN1cnNvcihuZXdDdXJzb3IsIG5ld1RhYmxlTW9kZWwpO1xuICAgICAgICBsZXQgaGVhZGVySW5mb1N0ciA9IGNvbHVtbkhlYWRlcnMgJiYgY29sdW1uSGVhZGVycy50cmltKCkubGVuZ3RoID4gMCA/IGBcIiR7Y29sdW1uSGVhZGVyc31cIiwgYCA6IFwiXCI7XG4gICAgICAgIHJldFZhbC5wdXNoKGBbJHtoZWFkZXJJbmZvU3RyfWNvbHVtbiAkeyhuZXdDZWxsSW5mby5jb2xJbmRleFN0YXJ0KzEpfSR7bmV3Q2VsbEluZm8uY29sc3BhbiA+IDEgPyBcIiB0aHJvdWdoIFwiICsgKG5ld0NlbGxJbmZvLmNvbEluZGV4U3RhcnQrbmV3Q2VsbEluZm8uY29sc3BhbikgOiBcIlwifV1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmV0VmFsLmpvaW4oXCIgXCIpO1xufVxuXG5leHBvcnQgbGV0IFJVTEVTOiBTUlJlbmRlcmVyUnVsZVtdID0gW1xuICAgIC8vIFNpbmdsZSByb2xlIHJ1bGVzIC0gYWxwaGFiZXRpY2FsbHkgc29ydGVkXG5cbiAgICAvLyBBcnRpY2xlIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiYXJ0aWNsZVwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcImFydGljbGVcIiwgXCJ0YWJfZm9jdXNcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvciwgX29sZEN1cnNvcj86IFNSQ3Vyc29yLCBtb2RlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG1vZGUgPT09IFwidGFiX2ZvY3VzXCIgJiYgIUNvbW1vblV0aWwuaXNUYWJiYWJsZShjdXJzb3IuZ2V0Tm9kZSgpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm9sZURlc2MgPSBnZXRSb2xlRGVzY3JpcHRpb24oY3Vyc29yLCBcImFydGljbGVcIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBbJHtxdW90ZU5hbWVQYWRBZnRlcihjdXJzb3IpfSR7cm9sZURlc2N9XWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIEJhbm5lciByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImJhbm5lclwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInJlZ2lvblwiLCBcInRhYl9mb2N1c1wiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yLCBfb2xkQ3Vyc29yPzogU1JDdXJzb3IsIG1vZGU/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gXCJ0YWJfZm9jdXNcIiAmJiAhQ29tbW9uVXRpbC5pc1RhYmJhYmxlKGN1cnNvci5nZXROb2RlKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICBjb25zdCByb2xlRGVzYyA9IGdldFJvbGVEZXNjcmlwdGlvbihjdXJzb3IsIFwiYmFubmVyIHJlZ2lvblwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYFske3F1b3RlTmFtZVBhZEFmdGVyKGN1cnNvcil9JHtyb2xlRGVzY31dYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gQmxvY2txdW90ZSByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImJsb2NrcXVvdGVcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJyZWdpb25cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoX2N1cnNvcjogU1JDdXJzb3IpID0+IFwiW2Jsb2NrcXVvdGVdXCJcbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gQ2FwdGlvbiByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImNhcHRpb25cIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJyZWdpb25cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoX2N1cnNvcjogU1JDdXJzb3IpID0+IFwiW2NhcHRpb25dXCJcbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gQ2VsbCByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImNlbGxcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJ0YWJsZVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIHJlbmRlckVudGVyVGFibGVDZWxsXG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIENvbHVtbmhlYWRlciByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImNvbHVtbmhlYWRlclwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInRhYmxlXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgcmVuZGVyRW50ZXJUYWJsZUNlbGxcbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gQ29tcGxlbWVudGFyeSByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImNvbXBsZW1lbnRhcnlcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJyZWdpb25cIiwgXCJ0YWJfZm9jdXNcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvciwgX29sZEN1cnNvcj86IFNSQ3Vyc29yLCBtb2RlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG1vZGUgPT09IFwidGFiX2ZvY3VzXCIgJiYgIUNvbW1vblV0aWwuaXNUYWJiYWJsZShjdXJzb3IuZ2V0Tm9kZSgpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBbJHtxdW90ZU5hbWVQYWRBZnRlcihjdXJzb3IpfWNvbXBsZW1lbnRhcnkgcmVnaW9uXWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIENvbnRlbnRpbmZvIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiY29udGVudGluZm9cIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJyZWdpb25cIiwgXCJ0YWJfZm9jdXNcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvciwgX29sZEN1cnNvcj86IFNSQ3Vyc29yLCBtb2RlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG1vZGUgPT09IFwidGFiX2ZvY3VzXCIgJiYgIUNvbW1vblV0aWwuaXNUYWJiYWJsZShjdXJzb3IuZ2V0Tm9kZSgpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBbJHtxdW90ZU5hbWVQYWRBZnRlcihjdXJzb3IpfWNvbnRlbnQgaW5mbyByZWdpb25dYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gRmlndXJlIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiZmlndXJlXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwicmVnaW9uXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKF9jdXJzb3I6IFNSQ3Vyc29yKSA9PiBcIltmaWd1cmVdXCJcbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gRm9ybSByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImZvcm1cIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJyZWdpb25cIiwgXCJmb3JtY29udHJvbFwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5nZXROYW1lSW5mbygpID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIltzZWN0aW9uXVwiO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX1mb3JtIHJlZ2lvbl1gXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBHcm91cCByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImdyb3VwXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwicmVnaW9uXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmdldE5hbWVJbmZvKCkgPT09IG51bGwpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuZ2V0Q3VycmVudE9yUGFyZW50QnlSb2xlQ2xvbmUoW1wiY29tYm9ib3hcIl0sIFtcInNlbGVjdFwiXSk/LmdldE5vZGUoKS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIlNFTEVDVFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmdldE5vZGUoKS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIkRFVEFJTFNcIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFtidXR0b24sICR7Y3Vyc29yLmdldEVsZW1lbnQoKS5oYXNBdHRyaWJ1dGUoXCJvcGVuXCIpID8gXCJleHBhbmRlZFwiOiBcImNvbGxhcHNlZFwifV1gO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgW2dyb3VwaW5nJHtxdW90ZU5hbWVQYWRCZWZvcmUoY3Vyc29yKX1dYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIC0tIHRhYl9mb2N1c1xuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJncm91cFwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1widGFiX2ZvY3VzXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmdldE5hbWVJbmZvKCkgPT09IG51bGwpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuZ2V0Q3VycmVudE9yUGFyZW50QnlSb2xlQ2xvbmUoW1wiY29tYm9ib3hcIl0sIFtcInNlbGVjdFwiXSk/LmdldE5vZGUoKS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIlNFTEVDVFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmdldE5vZGUoKS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIkRFVEFJTFNcIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFtidXR0b24sICR7Y3Vyc29yLmdldEVsZW1lbnQoKS5oYXNBdHRyaWJ1dGUoXCJvcGVuXCIpID8gXCJleHBhbmRlZFwiOiBcImNvbGxhcHNlZFwifV1gO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIExpc3Qgcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJsaXN0XCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwibGlzdFwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgbm9kZSA9IGN1cnNvci5nZXROb2RlKCkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVzY2VuZGFudExpc3RJdGVtcyA9IGRvY3VtZW50LmV2YWx1YXRlKFwiLi8vbGkgfCAuLy8qW0Byb2xlPSdsaXN0aXRlbSddXCIsIG5vZGUsIG51bGwsIFhQYXRoUmVzdWx0Lk9SREVSRURfTk9ERV9TTkFQU0hPVF9UWVBFLCBudWxsKTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBDb3VudCBpdGVtcywgZXhjbHVkaW5nIHRob3NlIGluIG90aGVyIGxpc3RzIG9yIHdpdGhpbiBwcmVzZW50YXRpb25hbCBjb250YWluZXJzXG4gICAgICAgICAgICAgICAgbGV0IG51bUl0ZW1zID0gMDtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRlc2NlbmRhbnRMaXN0SXRlbXMuc25hcHNob3RMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gZGVzY2VuZGFudExpc3RJdGVtcy5zbmFwc2hvdEl0ZW0oaSkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAvLyBXYWxrIHVwIGFuY2VzdG9ycyB0byBjaGVjayBmb3IgYm90aCBuZXN0ZWQgbGlzdHMgYW5kIHByZXNlbnRhdGlvbmFsIGNvbnRhaW5lcnNcbiAgICAgICAgICAgICAgICAgICAgbGV0IGlzSW5PdGhlckxpc3QgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGhhc1ByZXNlbnRhdGlvbmFsQW5jZXN0b3IgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFuY2VzdG9yID0gaXRlbS5wYXJlbnRFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGFuY2VzdG9yICYmIGFuY2VzdG9yICE9PSBub2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiBhbmNlc3RvciBpcyBhbm90aGVyIGxpc3RcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFuY2VzdG9yUm9sZSA9IEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZShhbmNlc3Rvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYW5jZXN0b3JSb2xlID09PSBcImxpc3RcIiB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2VzdG9yLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiVUxcIiB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2VzdG9yLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiT0xcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzSW5PdGhlckxpc3QgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiBhbmNlc3RvciBoYXMgcHJlc2VudGF0aW9uYWwgY2hpbGRyZW5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbmNlc3RvclJvbGUgJiYgQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW2FuY2VzdG9yUm9sZV0/LnByZXNlbnRhdGlvbmFsQ2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNQcmVzZW50YXRpb25hbEFuY2VzdG9yID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgYW5jZXN0b3IgPSBhbmNlc3Rvci5wYXJlbnRFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBpZiAoIWlzSW5PdGhlckxpc3QgJiYgIWhhc1ByZXNlbnRhdGlvbmFsQW5jZXN0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG51bUl0ZW1zKys7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgaWYgKG51bUl0ZW1zID09PSAwKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICByZXR1cm4gYFske3F1b3RlTmFtZVBhZEFmdGVyKGN1cnNvcil9bGlzdCBvZiAke251bUl0ZW1zfSBpdGVtc11gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBNYWluIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wibWFpblwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInJlZ2lvblwiLCBcInRhYl9mb2N1c1wiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yLCBfb2xkQ3Vyc29yPzogU1JDdXJzb3IsIG1vZGU/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gXCJ0YWJfZm9jdXNcIiAmJiAhQ29tbW9uVXRpbC5pc1RhYmJhYmxlKGN1cnNvci5nZXROb2RlKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICByZXR1cm4gYFske3F1b3RlTmFtZVBhZEFmdGVyKGN1cnNvcil9bWFpbiByZWdpb25dYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gbWVudWJhciByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcIm1lbnViYXJcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJsaXN0XCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBub2RlID0gY3Vyc29yLmdldE5vZGUoKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICBjb25zdCBkZXNjZW5kYW50TGlzdEl0ZW1zID0gZG9jdW1lbnQuZXZhbHVhdGUoXCIuLy8qW0Byb2xlPSdtZW51aXRlbSddXCIsIG5vZGUsIG51bGwsIFhQYXRoUmVzdWx0Lk9SREVSRURfTk9ERV9TTkFQU0hPVF9UWVBFLCBudWxsKTtcbiAgICAgICAgICAgICAgICBjb25zdCBkZXNjZW5kYW50TGlzdEl0ZW1zSW5PdGhlckxpc3RzID0gZG9jdW1lbnQuZXZhbHVhdGUoXG4gICAgICAgICAgICAgICAgICAgIFwiLi8vKltAcm9sZT0nbWVudWJhciddLy8qW0Byb2xlPSdtZW51aXRlbSddfC4vLypbQHJvbGU9J21lbnUnXS8vKltAcm9sZT0nbWVudWl0ZW0nXVwiLFxuICAgICAgICAgICAgICAgICAgICBub2RlLCBudWxsLCBYUGF0aFJlc3VsdC5PUkRFUkVEX05PREVfU05BUFNIT1RfVFlQRSwgbnVsbCk7XG4gICAgICAgICAgICAgICAgLy8gY29uc3QgZGVzY2VuZGFudENvbnRhaW5lcnMgPSBkb2N1bWVudC5ldmFsdWF0ZShcIi4vLypbQHJvbGU9J21lbnVpdGVtJ10vKltAcm9sZT0nbWVudSddXCIsIG5vZGUsIG51bGwsIFhQYXRoUmVzdWx0Lk9SREVSRURfTk9ERV9TTkFQU0hPVF9UWVBFLCBudWxsKTtcbiAgICAgICAgICAgICAgICAvLyBjb25zdCBkZXNjZW5kYW50Q29udGFpbmVyczIgPSBkb2N1bWVudC5ldmFsdWF0ZShcIi4vLypbQHJvbGU9J21lbnViYXInXS8vKltAcm9sZT0nbWVudWl0ZW0nXS8qW0Byb2xlPSdtZW51J118Li8vKltAcm9sZT0nbWVudSddLy8qW0Byb2xlPSdtZW51aXRlbSddLypbQHJvbGU9J21lbnUnXVwiLCBub2RlLCBudWxsLCBYUGF0aFJlc3VsdC5PUkRFUkVEX05PREVfU05BUFNIT1RfVFlQRSwgbnVsbCk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJNRU5VQkFSXCIsIGN1cnNvci5pc0VuZFRhZygpP1wiL1wiOlwiXCIsIGN1cnNvci5nZXROb2RlKCkpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGRlc2NlbmRhbnRMaXN0SXRlbXMsIGRlc2NlbmRhbnRMaXN0SXRlbXNJbk90aGVyTGlzdHMpOy8vLCBkZXNjZW5kYW50Q29udGFpbmVycywgZGVzY2VuZGFudENvbnRhaW5lcnMyKVxuICAgICAgICAgICAgICAgIGxldCBudW1JdGVtcyA9IGRlc2NlbmRhbnRMaXN0SXRlbXMuc25hcHNob3RMZW5ndGgtZGVzY2VuZGFudExpc3RJdGVtc0luT3RoZXJMaXN0cy5zbmFwc2hvdExlbmd0aDsvLy1kZXNjZW5kYW50Q29udGFpbmVycy5zbmFwc2hvdExlbmd0aCtkZXNjZW5kYW50Q29udGFpbmVyczIuc25hcHNob3RMZW5ndGg7XG4gICAgICAgICAgICAgICAgaWYgKG51bUl0ZW1zID09PSAwKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICByZXR1cm4gYFske3F1b3RlTmFtZVBhZEFmdGVyKGN1cnNvcil9bWVudWJhciB3aXRoICR7bnVtSXRlbXN9IGl0ZW1zXWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIE5hdmlnYXRpb24gcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJuYXZpZ2F0aW9uXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwicmVnaW9uXCIsIFwidGFiX2ZvY3VzXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IsIF9vbGRDdXJzb3I/OiBTUkN1cnNvciwgbW9kZT86IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChtb2RlID09PSBcInRhYl9mb2N1c1wiICYmICFDb21tb25VdGlsLmlzVGFiYmFibGUoY3Vyc29yLmdldE5vZGUoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvbGVEZXNjID0gZ2V0Um9sZURlc2NyaXB0aW9uKGN1cnNvciwgXCJuYXZpZ2F0aW9uIHJlZ2lvblwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYFske3F1b3RlTmFtZVBhZEFmdGVyKGN1cnNvcil9JHtyb2xlRGVzY31dYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gUmFkaW8gZ3JvdXAgcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJyYWRpb2dyb3VwXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwicmVnaW9uXCIsIFwidGFiX2ZvY3VzXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmdldE5hbWVJbmZvKCkgPT09IG51bGwpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIHJldHVybiBgW2dyb3VwaW5nJHtxdW90ZU5hbWVQYWRCZWZvcmUoY3Vyc29yKX1dYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gUmVnaW9uIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wicmVnaW9uXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwicmVnaW9uXCIsIFwidGFiX2ZvY3VzXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IsIF9vbGRDdXJzb3I/OiBTUkN1cnNvciwgbW9kZT86IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuZ2V0TmFtZUluZm8oKSA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKG1vZGUgPT09IFwidGFiX2ZvY3VzXCIgJiYgIUNvbW1vblV0aWwuaXNUYWJiYWJsZShjdXJzb3IuZ2V0Tm9kZSgpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm9sZURlc2MgPSBnZXRSb2xlRGVzY3JpcHRpb24oY3Vyc29yLCBcInJlZ2lvblwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYFske3F1b3RlTmFtZVBhZEFmdGVyKGN1cnNvcil9JHtyb2xlRGVzY31dYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gUm93IHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wicm93XCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwidGFibGVcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoKSA9PiBcIlwiXG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIFJvd2hlYWRlciByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcInJvd2hlYWRlclwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInRhYmxlXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgcmVuZGVyRW50ZXJUYWJsZUNlbGxcbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gU2VhcmNoIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wic2VhcmNoXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwicmVnaW9uXCIsIFwidGFiX2ZvY3VzXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IsIF9vbGRDdXJzb3I/OiBTUkN1cnNvciwgbW9kZT86IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChtb2RlID09PSBcInRhYl9mb2N1c1wiICYmICFDb21tb25VdGlsLmlzVGFiYmFibGUoY3Vyc29yLmdldE5vZGUoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvbGVEZXNjID0gZ2V0Um9sZURlc2NyaXB0aW9uKGN1cnNvciwgXCJzZWFyY2ggcmVnaW9uXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX0ke3JvbGVEZXNjfV1gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBUYWJsZSByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcInRhYmxlXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwidGFibGVcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIGxldCB0YWJsZVdhbGtlciA9IGN1cnNvci5jbG9uZSgpO1xuICAgICAgICAgICAgICAgIC8vIEdldCB0byB0aGUgc3RhcnQgb2YgdGhlIHRhYmxlXG4gICAgICAgICAgICAgICAgd2hpbGUgKHRhYmxlV2Fsa2VyLmdldFJvbGUoKSAhPT0gXCJ0YWJsZVwiICYmIHRhYmxlV2Fsa2VyLnByZXZpb3VzKCgpID0+IHRydWUpKTtcbiAgICAgICAgICAgICAgICAvLyBTZXQgYW4gZW5kIHRvIHRoZSB0YWJsZVxuICAgICAgICAgICAgICAgIGxldCB0YWJsZU5vZGUgPSB0YWJsZVdhbGtlci5nZXROb2RlKCk7XG4gICAgICAgICAgICAgICAgbGV0IHJvd3MgPSAwO1xuICAgICAgICAgICAgICAgIGxldCBjb2xzID0gMDtcbiAgICAgICAgICAgICAgICAvLyBTYW5pdHkgY2hlY2sgdGhhdCB0aGUgdGFibGUgaGFzIGNvbnRlbnRcbiAgICAgICAgICAgICAgICBpZiAodGFibGVXYWxrZXIuZ2V0Tm9kZSgpLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZpcnN0Um93Q29tcGxldGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRhYmxlV2Fsa2VyLm5leHQoKCkgPT4gdHJ1ZSkgJiYgIXRhYmxlV2Fsa2VyLmdldE5vZGUoKS5pc1NhbWVOb2RlKHRhYmxlTm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJvbGUgPSB0YWJsZVdhbGtlci5nZXRSb2xlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFibGVXYWxrZXIuaXNTdGFydFRhZygpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvbGUgPT09IFwicm93XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytyb3dzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmlyc3RSb3dDb21wbGV0ZSAmJiBbXCJjZWxsXCIsIFwicm93aGVhZGVyXCIsIFwiY29sdW1uaGVhZGVyXCJdLmluY2x1ZGVzKHJvbGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGVtID0gdGFibGVXYWxrZXIuZ2V0Tm9kZSgpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29scyArPSBwYXJzZUludChlbGVtLmdldEF0dHJpYnV0ZShcImNvbHNwYW5cIikgfHwgXCIxXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyb2xlID09PSBcInJvd1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RSb3dDb21wbGV0ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgcmV0dXJuIGBbdGFibGUgd2l0aCAke3Jvd3N9ICR7cm93cyA9PT0gMSA/IFwicm93XCIgOiBcInJvd3NcIn0gYW5kICR7Y29sc30gJHtjb2xzID09PSAxID8gXCJjb2x1bW5cIiA6IFwiY29sdW1uc1wifSR7cXVvdGVOYW1lUGFkQmVmb3JlKGN1cnNvcil9XWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIFRvb2xiYXIgcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJ0b29sYmFyXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwicmVnaW9uXCIsIFwidGFiX2ZvY3VzXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IsIF9vbGRDdXJzb3I/OiBTUkN1cnNvciwgbW9kZT86IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChtb2RlID09PSBcInRhYl9mb2N1c1wiICYmICFDb21tb25VdGlsLmlzVGFiYmFibGUoY3Vyc29yLmdldE5vZGUoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX10b29sYmFyXWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIEhUTUwgRWxlbWVudCBydWxlc1xuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXSxcbiAgICAgICAgZWxlbXM6IFtcIkRMXCJdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcImxpc3RcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBjdXJzb3IuZ2V0Tm9kZSgpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlc2NlbmRhbnRMaXN0SXRlbXMgPSBkb2N1bWVudC5ldmFsdWF0ZShcIi4vL2R0XCIsIG5vZGUsIG51bGwsIFhQYXRoUmVzdWx0Lk9SREVSRURfTk9ERV9TTkFQU0hPVF9UWVBFLCBudWxsKTtcbiAgICAgICAgICAgICAgICBsZXQgbnVtSXRlbXMgPSBkZXNjZW5kYW50TGlzdEl0ZW1zLnNuYXBzaG90TGVuZ3RoO1xuICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX1kZWZpbml0aW9uIGxpc3Qgb2YgJHtudW1JdGVtc30gdGVybXNdYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtdLFxuICAgICAgICBlbGVtczogW1wiRklHQ0FQVElPTlwiXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoX2N1cnNvcjogU1JDdXJzb3IpID0+IFwiW2NhcHRpb25dXCJcbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtdLFxuICAgICAgICBlbGVtczogW1wiTUFSS1wiXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoX2N1cnNvcjogU1JDdXJzb3IpID0+IFwiW2hpZ2hsaWdodGVkXVwiXG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIE11bHRpcGxlIHJvbGVzIHJ1bGVzIC0gcGxhY2VkIGF0IHRoZSBib3R0b21cblxuICAgIC8vIEhlYWRpbmcgbW9kZSBydWxlcyAtIGlnbm9yZSBjb250YWluZXIgZWxlbWVudHMgaW4gaGVhZGluZyBtb2RlIChtdWx0aXBsZSByb2xlcylcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiYXJ0aWNsZVwiLCBcImJhbm5lclwiLCBcImJsb2NrcXVvdGVcIiwgXCJjYXB0aW9uXCIsIFwiY2VsbFwiLCBcImNvbHVtbmhlYWRlclwiLCBcbiAgICAgICAgICAgICAgICBcImNvbXBsZW1lbnRhcnlcIiwgXCJjb250ZW50aW5mb1wiLCBcImZpZ3VyZVwiLCBcImZvcm1cIiwgXCJncm91cFwiLCBcInJlZ2lvblwiLCBcbiAgICAgICAgICAgICAgICBcInJvd1wiLCBcInJvd2hlYWRlclwiLCBcInNlYXJjaFwiLCBcInRvb2xiYXJcIiwgXCJsaXN0XCIsIFwibWFpblwiLCBcIm5hdmlnYXRpb25cIiwgXCJ0YWJsZVwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaGVhZGluZ1wiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgICgpID0+IFwiXCJcbiAgICAgICAgXVxuICAgIH0pXG5dO1xuIiwiaW1wb3J0IHsgU1JSZW5kZXJlclJ1bGUgfSBmcm9tIFwiLi4vU1JSZW5kZXJlclJ1bGVcIjtcbmltcG9ydCB7IFNSQ3Vyc29yIH0gZnJvbSBcIi4uL1NSQ3Vyc29yXCI7XG5pbXBvcnQgeyBxdW90ZU5hbWVQYWRBZnRlciwgZ2V0Um9sZURlc2NyaXB0aW9uIH0gZnJvbSBcIi4vY29tbW9uXCI7XG5cbmV4cG9ydCBsZXQgUlVMRVM6IFNSUmVuZGVyZXJSdWxlW10gPSBbXG4gICAgLy8gU2luZ2xlIHJvbGUgcnVsZXMgLSBhbHBoYWJldGljYWxseSBzb3J0ZWRcbiAgICBcbiAgICAvLyBBcnRpY2xlIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiYXJ0aWNsZVwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm9sZURlc2MgPSBnZXRSb2xlRGVzY3JpcHRpb24oY3Vyc29yLCBcImFydGljbGVcIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBbb3V0IG9mICR7cm9sZURlc2N9XWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIEJhbm5lciByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImJhbm5lclwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm9sZURlc2MgPSBnZXRSb2xlRGVzY3JpcHRpb24oY3Vyc29yLCBcImJhbm5lciByZWdpb25cIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBbb3V0IG9mICR7cm9sZURlc2N9XWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIEJsb2NrcXVvdGUgcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJibG9ja3F1b3RlXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKF9jdXJzb3I6IFNSQ3Vyc29yKSA9PiBcIltvdXQgb2YgYmxvY2txdW90ZV1cIlxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBDYXB0aW9uIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiY2FwdGlvblwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChfY3Vyc29yOiBTUkN1cnNvcikgPT4gXCJbb3V0IG9mIGNhcHRpb25dXCJcbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gQ29tcGxlbWVudGFyeSByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImNvbXBsZW1lbnRhcnlcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvbGVEZXNjID0gZ2V0Um9sZURlc2NyaXB0aW9uKGN1cnNvciwgXCJjb21wbGVtZW50YXJ5IHJlZ2lvblwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYFtvdXQgb2YgJHtyb2xlRGVzY31dYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gQ29udGVudGluZm8gcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJjb250ZW50aW5mb1wiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm9sZURlc2MgPSBnZXRSb2xlRGVzY3JpcHRpb24oY3Vyc29yLCBcImNvbnRlbnQgaW5mbyByZWdpb25cIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBbb3V0IG9mICR7cm9sZURlc2N9XWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIEZpZ3VyZSByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImZpZ3VyZVwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInJlZ2lvblwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChfY3Vyc29yOiBTUkN1cnNvcikgPT4gXCJbb3V0IG9mIGZpZ3VyZV1cIlxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBGb3JtIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiZm9ybVwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInJlZ2lvblwiLCBcImZvcm1jb250cm9sXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmdldE5hbWVJbmZvKCkgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiW291dCBvZiBzZWN0aW9uXVwiO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgW291dCBvZiBmb3JtXWBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIEdyb3VwIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiZ3JvdXBcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuZ2V0TmFtZUluZm8oKSA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5nZXRDdXJyZW50T3JQYXJlbnRCeVJvbGVDbG9uZShbXCJjb21ib2JveFwiXSwgW1wic2VsZWN0XCJdKT8uZ2V0Tm9kZSgpLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiU0VMRUNUXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgcmV0dXJuIFwiW291dCBvZiBncm91cGluZ11cIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gTGlzdCByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImxpc3RcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBjdXJzb3IuZ2V0Tm9kZSgpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlc2NlbmRhbnRMaXN0SXRlbXMgPSBkb2N1bWVudC5ldmFsdWF0ZShcIi4vL2xpIHwgLi8vKltAcm9sZT0nbGlzdGl0ZW0nXVwiLCBub2RlLCBudWxsLCBYUGF0aFJlc3VsdC5PUkRFUkVEX05PREVfU05BUFNIT1RfVFlQRSwgbnVsbCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVzY2VuZGFudExpc3RJdGVtc0luT3RoZXJMaXN0cyA9IGRvY3VtZW50LmV2YWx1YXRlKFxuICAgICAgICAgICAgICAgICAgICBcIi4vL3VsLy9saXwuLy91bC8vKltAcm9sZT0nbGlzdGl0ZW0nXXwuLy9vbC8vbGl8Li8vb2wvLypbQHJvbGU9J2xpc3RpdGVtJ118Li8vKltAcm9sZT0nbGlzdCddLy9saXwuLy8qW0Byb2xlPSdsaXN0J10vLypbQHJvbGU9J2xpc3RpdGVtJ11cIixcbiAgICAgICAgICAgICAgICAgICAgbm9kZSwgbnVsbCwgWFBhdGhSZXN1bHQuT1JERVJFRF9OT0RFX1NOQVBTSE9UX1RZUEUsIG51bGwpO1xuICAgICAgICAgICAgICAgIGxldCBudW1JdGVtcyA9IGRlc2NlbmRhbnRMaXN0SXRlbXMuc25hcHNob3RMZW5ndGgtZGVzY2VuZGFudExpc3RJdGVtc0luT3RoZXJMaXN0cy5zbmFwc2hvdExlbmd0aDtcbiAgICAgICAgICAgICAgICBpZiAobnVtSXRlbXMgPT09IDApIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX1vdXQgb2YgbGlzdF1gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBNYWluIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wibWFpblwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm9sZURlc2MgPSBnZXRSb2xlRGVzY3JpcHRpb24oY3Vyc29yLCBcIm1haW4gcmVnaW9uXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBgW291dCBvZiAke3JvbGVEZXNjfV1gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBtZW51YmFyIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wibWVudWJhclwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcImxpc3RcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoX2N1cnNvcjogU1JDdXJzb3IpID0+IGBbb3V0IG9mIG1lbnViYXJdYFxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBOYXZpZ2F0aW9uIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wibmF2aWdhdGlvblwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm9sZURlc2MgPSBnZXRSb2xlRGVzY3JpcHRpb24oY3Vyc29yLCBcIm5hdmlnYXRpb24gcmVnaW9uXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBgW291dCBvZiAke3JvbGVEZXNjfV1gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyByYWRpb2dyb3VwIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wicmFkaW9ncm91cFwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInJlZ2lvblwiLCBcInRhYl9mb2N1c1wiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChfY3Vyc29yOiBTUkN1cnNvcikgPT4gXCJbb3V0IG9mIGdyb3VwaW5nXVwiXG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIFJlZ2lvbiByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcInJlZ2lvblwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5nZXROYW1lSW5mbygpID09PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICBjb25zdCByb2xlRGVzYyA9IGdldFJvbGVEZXNjcmlwdGlvbihjdXJzb3IsIFwicmVnaW9uXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBgW291dCBvZiAke3JvbGVEZXNjfV1gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBTZWFyY2ggcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJzZWFyY2hcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvbGVEZXNjID0gZ2V0Um9sZURlc2NyaXB0aW9uKGN1cnNvciwgXCJzZWFyY2ggcmVnaW9uXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBgW291dCBvZiAke3JvbGVEZXNjfV1gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBUYWJsZSByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcInRhYmxlXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKF9jdXJzb3I6IFNSQ3Vyc29yKSA9PiBcIltvdXQgb2YgdGFibGVdXCJcbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gVG9vbGJhciByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcInRvb2xiYXJcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoX2N1cnNvcjogU1JDdXJzb3IpID0+IGBbb3V0IG9mIHRvb2xiYXJdYFxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBIVE1MIEVsZW1lbnQgcnVsZXNcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW10sXG4gICAgICAgIGVsZW1zOiBbXCJBQkJSXCJdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiBjdXJzb3IuZ2V0RWxlbWVudCgpLmhhc0F0dHJpYnV0ZShcInRpdGxlXCIpID8gXG4gICAgICAgICAgICAgICAgYFske2N1cnNvci5nZXRFbGVtZW50KCkuZ2V0QXR0cmlidXRlKFwidGl0bGVcIil9XWAgOiBudWxsXG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXSxcbiAgICAgICAgZWxlbXM6IFtcIkRMXCJdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChfY3Vyc29yOiBTUkN1cnNvcikgPT4gYFtvdXQgb2YgZGVmaW5pdGlvbiBsaXN0XWBcbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtdLFxuICAgICAgICBlbGVtczogW1wiRklHQ0FQVElPTlwiXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoX2N1cnNvcjogU1JDdXJzb3IpID0+IGBbb3V0IG9mIGNhcHRpb25dYFxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW10sXG4gICAgICAgIGVsZW1zOiBbXCJNQVJLXCJdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChfY3Vyc29yOiBTUkN1cnNvcikgPT4gYFtvdXQgb2YgaGlnaGxpZ2h0ZWRdYFxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBNdWx0aXBsZSByb2xlcyBydWxlcyAtIHBsYWNlZCBhdCB0aGUgYm90dG9tXG4gICAgXG4gICAgLy8gUmVnaW9uIG1vZGUgcnVsZXMgLSBpZ25vcmUgY29udGFpbmVyIGVsZW1lbnRzIGluIHJlZ2lvbiBhbmQgaGVhZGluZyBtb2RlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImdyb3VwXCIsIFwiYXJ0aWNsZVwiLCBcImJhbm5lclwiLCBcImJsb2NrcXVvdGVcIiwgXCJjYXB0aW9uXCIsIFwiY29tcGxlbWVudGFyeVwiLCBcbiAgICAgICAgICAgICAgICBcImNvbnRlbnRpbmZvXCIsIFwiZmlndXJlXCIsIFwiZm9ybVwiLCBcImxpc3RcIiwgXCJyZWdpb25cIiwgXCJtYWluXCIsIFwibmF2aWdhdGlvblwiLCBcbiAgICAgICAgICAgICAgICBcInNlYXJjaFwiLCBcInRhYmxlXCIsIFwidG9vbGJhclwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wicmVnaW9uXCIsIFwiaGVhZGluZ1wiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgICgpID0+IFwiXCJcbiAgICAgICAgXVxuICAgIH0pLFxuXTtcbiIsImltcG9ydCB7IFJVTEVTIGFzIFNSUnVsZXMgfSBmcm9tIFwiLi9jb21tb25cIjtcbmltcG9ydCB7IFJVTEVTIGFzIENvbnRhaW5lckVudGVyUnVsZXMgfSBmcm9tIFwiLi9jb250YWluZXJfZW50ZXJcIjtcbmltcG9ydCB7IFJVTEVTIGFzIENvbnRhaW5lckV4aXRSdWxlcyB9IGZyb20gXCIuL2NvbnRhaW50ZXJfZXhpdFwiO1xuZXhwb3J0IGxldCBTUl9SVUxFUyA9IFNSUnVsZXM7XG5leHBvcnQgbGV0IENPTlRBSU5FUl9FTlRFUl9SVUxFUyA9IENvbnRhaW5lckVudGVyUnVsZXM7XG5leHBvcnQgbGV0IENPTlRBSU5FUl9FWElUX1JVTEVTID0gQ29udGFpbmVyRXhpdFJ1bGVzO1xuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBBUklBRGVmaW5pdGlvbnMgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBRGVmaW5pdGlvbnNcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4vVmlzVXRpbFwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4vQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuaW1wb3J0IHsgRE9NVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NVXRpbFwiO1xuXG50eXBlIEVsZW1DYWxjID0gKGVsZW06IEVsZW1lbnQpID0+IHN0cmluZztcbnR5cGUgTm9kZUNhbGMgPSAobm9kZTogTm9kZSkgPT4gc3RyaW5nO1xuXG5leHBvcnQgdHlwZSBBY2Nlc3NpYmxlTmFtZVJlc3VsdCA9IHtcbiAgICBuYW1lOiBzdHJpbmcsIFxuICAgIG5hbWVGcm9tOiBcImFyaWFMYWJlbFwiIHwgXCJ0aXRsZVwiIHwgXCJwbGFjZWhvbGRlclwiIHwgXCJsYWJlbFwiIFxuICAgICAgICB8IFwidmFsdWVcIiB8IFwiaW50ZXJuYWxcIiB8IFwiYWx0XCIgfCBcInRleHRcIiB8IFwibGVnZW5kXCIgXG4gICAgICAgIHwgXCJzdW1tYXJ5XCIgfCBcImZpZ2NhcHRpb25cIiB8IFwiY2FwdGlvblwiXG4gICAgICAgIHwgXCJzaGFkb3dcIiB8IFwic2xvdFwiIHwgXCJzaGFkb3ctaG9zdFwiIHwgXCJjb250ZW50LXNsb3RcIlxuICAgICAgICB8IFwiY29udGVudFwiXG4gICAgICAgIHwgXCJzdmdsaW5rVGl0bGVcIiB8IFwic3ZnVGl0bGVcIiB8IFwic3ZnVGV4dFwiIHwgXCJzdmdEZXNjXCJcbiAgICAgICAgfCBcImFyaWEtZGVzY3JpcHRpb25cIlxuICAgICAgICB8IHN0cmluZyAvLyBjc3MtKlxufVxuZXhwb3J0IGNsYXNzIEFjY05hbWVVdGlsIHtcbiAgICAvKipcbiAgICAgKiBDb21wdXRlcyB0aGUgYWNjZXNzaWJsZSBuYW1lIGZvciBhbiBTVkcgZWxlbWVudCBhY2NvcmRpbmcgdG8gVzNDIHNwZWNpZmljYXRpb25cbiAgICAgKiBGb2xsb3dpbmcgdGhlIEFjY2Vzc2libGUgTmFtZSBhbmQgRGVzY3JpcHRpb24gQ29tcHV0YXRpb24gMS4xIGFsZ29yaXRobVxuICAgICAqIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9hY2NuYW1lLTEuMS9cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gZWxlbSBUaGUgU1ZHIGVsZW1lbnRcbiAgICAgKiBAcmV0dXJucyBUaGUgYWNjZXNzaWJsZSBuYW1lIHJlc3VsdCBvciBudWxsIGlmIG5vIGFjY2Vzc2libGUgbmFtZSBpcyBmb3VuZFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgY29tcHV0ZUFjY2Vzc2libGVOYW1lRm9yU1ZHRWxlbWVudFczQyhlbGVtOiBFbGVtZW50KTogQWNjZXNzaWJsZU5hbWVSZXN1bHQgfCBudWxsIHtcbiAgICAgICAgaWYgKCFlbGVtIHx8IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gJ3N2ZycpIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIFN0ZXAgMTogQ2hlY2sgZm9yIGFyaWEtbGFiZWxsZWRieSAoYWxyZWFkeSBoYW5kbGVkIGJ5IG1haW4gY29tcHV0ZUFjY2Vzc2libGVOYW1lIGZ1bmN0aW9uKVxuICAgICAgICAvLyBTdGVwIDI6IENoZWNrIGZvciBhcmlhLWxhYmVsIChhbHJlYWR5IGhhbmRsZWQgYnkgbWFpbiBjb21wdXRlQWNjZXNzaWJsZU5hbWUgZnVuY3Rpb24pXG5cbiAgICAgICAgLy8gU3RlcCAzOiBDaGVjayBmb3IgdGl0bGUgZWxlbWVudFxuICAgICAgICBjb25zdCBzdmdUaXRsZXMgPSBlbGVtLnF1ZXJ5U2VsZWN0b3JBbGwoXCI6c2NvcGUgPiB0aXRsZVwiKTtcbiAgICAgICAgaWYgKHN2Z1RpdGxlcyAmJiBzdmdUaXRsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGV0IHRleHQgPSBcIlwiO1xuICAgICAgICAgICAgc3ZnVGl0bGVzLmZvckVhY2goc3ZnVGl0bGUgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChzdmdUaXRsZSAmJiAhVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQoc3ZnVGl0bGUpICYmICFWaXNVdGlsLmlzTm9kZVByZXNlbnRhdGlvbmFsKHN2Z1RpdGxlKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0aXRsZSA9IHN2Z1RpdGxlLnRleHRDb250ZW50O1xuICAgICAgICAgICAgICAgICAgICBpZiAodGl0bGUgJiYgdGl0bGUudHJpbSgpICE9PSAnJylcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgKz0gdGl0bGUudHJpbSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHRleHQgJiYgdGV4dC50cmltKCkgIT09ICcnKVxuICAgICAgICAgICAgICAgIHJldHVybiB7IFwibmFtZVwiOiB0ZXh0LnRyaW0oKSwgXCJuYW1lRnJvbVwiOiBcInN2Z1RpdGxlXCIgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0ZXAgNDogQ2hlY2sgZm9yIHRleHQgY29udGVudCBpbiBTVkcgdGV4dCBlbGVtZW50c1xuICAgICAgICBsZXQgdGV4dENvbnRlbnQgPSBcIlwiO1xuICAgICAgICBjb25zdCB0ZXh0RWxlbWVudHMgPSBlbGVtLnF1ZXJ5U2VsZWN0b3JBbGwoXCJ0ZXh0LCB0ZXh0UGF0aCwgdHNwYW5cIik7XG4gICAgICAgIGlmICh0ZXh0RWxlbWVudHMgJiYgdGV4dEVsZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRleHRFbGVtZW50cy5mb3JFYWNoKHRleHRFbGVtZW50ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHRleHRFbGVtZW50KSAmJiAhVmlzVXRpbC5pc05vZGVQcmVzZW50YXRpb25hbCh0ZXh0RWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGVudCA9IHRleHRFbGVtZW50LnRleHRDb250ZW50O1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudCAmJiBjb250ZW50LnRyaW0oKSAhPT0gJycpXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0Q29udGVudCArPSBcIiBcIiArIGNvbnRlbnQudHJpbSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHRleHRDb250ZW50LnRyaW0oKSAhPT0gJycpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgXCJuYW1lXCI6IENvbW1vblV0aWwudHJ1bmNhdGVUZXh0KHRleHRDb250ZW50LnRyaW0oKSksIFwibmFtZUZyb21cIjogXCJzdmdUZXh0XCIgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0ZXAgNTogQ2hlY2sgZm9yIHhsaW5rOnRpdGxlIGF0dHJpYnV0ZSBvbiBsaW5rcyB3aXRoaW4gU1ZHXG4gICAgICAgIGNvbnN0IGxpbmtzID0gZWxlbS5xdWVyeVNlbGVjdG9yQWxsKFwiYVwiKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5rcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgbGluayA9IGxpbmtzW2ldO1xuICAgICAgICAgICAgaWYgKCFWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChsaW5rKSAmJiAhVmlzVXRpbC5pc05vZGVQcmVzZW50YXRpb25hbChsaW5rKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHhsaW5rVGl0bGUgPSBsaW5rLmdldEF0dHJpYnV0ZShcInhsaW5rOnRpdGxlXCIpO1xuICAgICAgICAgICAgICAgIGlmICh4bGlua1RpdGxlICYmIHhsaW5rVGl0bGUudHJpbSgpICE9PSAnJylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgXCJuYW1lXCI6IENvbW1vblV0aWwudHJ1bmNhdGVUZXh0KHhsaW5rVGl0bGUpLCBcIm5hbWVGcm9tXCI6IFwic3ZnbGlua1RpdGxlXCIgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0ZXAgNjogQ2hlY2sgZm9yIGFyaWEtZGVzY3JpYmVkYnkgb3IgYXJpYS1kZXNjcmlwdGlvblxuICAgICAgICBsZXQgZGVzY3JpcHRpb24gPSBBcmlhVXRpbC5nZXRBcmlhRGVzY3JpcHRpb24oZWxlbSk7XG4gICAgICAgIGlmIChkZXNjcmlwdGlvbiAmJiBkZXNjcmlwdGlvbi50cmltKCkgIT09ICcnKVxuICAgICAgICAgICAgcmV0dXJuIHsgXCJuYW1lXCI6IENvbW1vblV0aWwudHJ1bmNhdGVUZXh0KGRlc2NyaXB0aW9uKSwgXCJuYW1lRnJvbVwiOiBcImFyaWEtZGVzY3JpcHRpb25cIiB9O1xuXG4gICAgICAgIC8vIFN0ZXAgNzogQ2hlY2sgZm9yIGRlc2MgZWxlbWVudFxuICAgICAgICBjb25zdCBkZXNjRWxlbWVudHMgPSBlbGVtLnF1ZXJ5U2VsZWN0b3JBbGwoXCI6c2NvcGUgPiBkZXNjXCIpO1xuICAgICAgICBpZiAoZGVzY0VsZW1lbnRzICYmIGRlc2NFbGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsZXQgZGVzY1RleHQgPSBcIlwiO1xuICAgICAgICAgICAgZGVzY0VsZW1lbnRzLmZvckVhY2goZGVzY0VsZW1lbnQgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQoZGVzY0VsZW1lbnQpICYmICFWaXNVdGlsLmlzTm9kZVByZXNlbnRhdGlvbmFsKGRlc2NFbGVtZW50KSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXNjID0gZGVzY0VsZW1lbnQudGV4dENvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkZXNjICYmIGRlc2MudHJpbSgpICE9PSAnJylcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NUZXh0ICs9IFwiIFwiICsgZGVzYy50cmltKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoZGVzY1RleHQudHJpbSgpICE9PSAnJylcbiAgICAgICAgICAgICAgICByZXR1cm4geyBcIm5hbWVcIjogZGVzY1RleHQudHJpbSgpLCBcIm5hbWVGcm9tXCI6IFwic3ZnRGVzY1wiIH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdGVwIDg6IENoZWNrIGZvciB0aXRsZSBhdHRyaWJ1dGVcbiAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwidGl0bGVcIikpIHtcbiAgICAgICAgICAgIGNvbnN0IHRpdGxlID0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJ0aXRsZVwiKTtcbiAgICAgICAgICAgIGlmICh0aXRsZSAmJiB0aXRsZS50cmltKCkgIT09ICcnKVxuICAgICAgICAgICAgICAgIHJldHVybiB7IFwibmFtZVwiOiBDb21tb25VdGlsLnRydW5jYXRlVGV4dCh0aXRsZSksIFwibmFtZUZyb21cIjogXCJ0aXRsZVwiIH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBObyBhY2Nlc3NpYmxlIG5hbWUgZm91bmRcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gY2FsY3VsYXRlIGFjY2Vzc2libGUgbmFtZSBmb3IgYSBnaXZlbiBub2RlXG4gICAgcHVibGljIHN0YXRpYyBjb21wdXRlQWNjZXNzaWJsZU5hbWUoZWxlbTogRWxlbWVudCkgOiBBY2Nlc3NpYmxlTmFtZVJlc3VsdCB8IG51bGwge1xuICAgICAgICBpZiAoIWVsZW0pIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCBub2RlTmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICBsZXQgbmFtZV9wYWlyID0gQ2FjaGVVdGlsLmdldENhY2hlKGVsZW0sIFwiRUxFTUVOVF9BQ0NFU1NCTEVfTkFNRVwiLCB1bmRlZmluZWQpO1xuICAgICAgICBpZiAobmFtZV9wYWlyICE9PSB1bmRlZmluZWQpIHJldHVybiBuYW1lX3BhaXI7XG5cbiAgICAgICAgLy8gMS4gbmFtZSBmcm9tIGF1dGhvciwgb3IgZWxlbWVudHMgd2l0aG91dCBhIHJvbGUgYnV0IHdpdGggYXJpYS1sYWJlbGxlZGJ5IG9yIGFyaWEtbGFiZWwgXG4gICAgICAgIC8vICAgZ2V0IGFyaWEgbGFiZWwgZXZlbiBmb3IgdGhlIHJvbGUgd2hlcmUgdGhlIG5hbWUgaXMgcHJvaGliaXRlZCBvciBpcyAncHJlc2VudGF0aW9uJyBvciAnbm9uZSdcbiAgICAgICAgbGV0IGFjY05hbWUgPSBBcmlhVXRpbC5nZXRBcmlhTGFiZWwoZWxlbSk7XG4gICAgICAgIGlmIChhY2NOYW1lICYmIGFjY05hbWUudHJpbSgpICE9PSBcIlwiKSB7XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJFTEVNRU5UX0FDQ0VTU0JMRV9OQU1FXCIsIHtcIm5hbWVcIjpDb21tb25VdGlsLnRydW5jYXRlVGV4dChhY2NOYW1lKSwgXCJuYW1lRnJvbVwiOiBcImFyaWFMYWJlbFwifSk7XG4gICAgICAgICAgICByZXR1cm4ge1wibmFtZVwiOkNvbW1vblV0aWwudHJ1bmNhdGVUZXh0KGFjY05hbWUpLCBcIm5hbWVGcm9tXCI6IFwiYXJpYUxhYmVsXCJ9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gMi4gYWNjZXNzaWJsZSBuYW1lIG1hcHBpbmcgZm9yIG5hdGl2ZSBodG1sIGVsZW1lbnRzXG4gICAgICAgIG5hbWVfcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZUZvck5hdGl2ZUVsZW1lbnQoZWxlbSk7XG4gICAgICAgIGlmIChuYW1lX3BhaXIpIHtcbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIkVMRU1FTlRfQUNDRVNTQkxFX05BTUVcIiwgbmFtZV9wYWlyKTtcbiAgICAgICAgICAgIHJldHVybiBuYW1lX3BhaXI7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIDMuIG5hbWUgZnJvbSBuYXRpdmUgb3IgYXJpYSBhdHRyaWJ1dGVcbiAgICAgICAgLyoqbmFtZV9wYWlyID0gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lRnJvbUF0dHJpYnV0ZShlbGVtKTtcbiAgICAgICAgaWYgKG5hbWVfcGFpcikge1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiRUxFTUVOVF9BQ0NFU1NCTEVfTkFNRVwiLCBuYW1lX3BhaXIpO1xuICAgICAgICAgICAgcmV0dXJuIG5hbWVfcGFpcjtcbiAgICAgICAgfSovXG5cbiAgICAgICAgLy8gNC4gbmFtZSBmcm9tIGNvbnRlbnQgZm9yIGN1c3RvbSBlbGVtZW50cyB3aXRoIGEgcm9sZVxuICAgICAgICBjb25zdCByb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKGVsZW0pO1xuICAgICAgICBpZiAoQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVdICYmIEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlXS5uYW1lRnJvbS5pbmNsdWRlcyhcImNvbnRlbnRzXCIpKSB7XG4gICAgICAgICAgICBuYW1lX3BhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWVGcm9tQ29udGVudChlbGVtKTtcbiAgICAgICAgICAgIGlmIChuYW1lX3BhaXIpIHtcbiAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJFTEVNRU5UX0FDQ0VTU0JMRV9OQU1FXCIsIG5hbWVfcGFpcik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5hbWVfcGFpcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDUuIG5hbWUgZnJvbSB0aGUgZ2xvYmFsIGF0dHJpYnV0ZSBcInRpdGxlXCJcbiAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwidGl0bGVcIikpIHtcbiAgICAgICAgICAgIGxldCB0aXRsZSA9IGVsZW0uZ2V0QXR0cmlidXRlKFwidGl0bGVcIikudHJpbSgpO1xuICAgICAgICAgICAgaWYgKHRpdGxlICYmIHRpdGxlLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdGl0bGUgPSBDb21tb25VdGlsLnRydW5jYXRlVGV4dCh0aXRsZSk7XG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiRUxFTUVOVF9BQ0NFU1NCTEVfTkFNRVwiLCB7XCJuYW1lXCI6dGl0bGUsIFwibmFtZUZyb21cIjogXCJ0aXRsZVwifSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjp0aXRsZSwgXCJuYW1lRnJvbVwiOiBcInRpdGxlXCJ9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyA2LiBuYW1lIGZyb20gdGhlIGF0dHJpYnV0ZSBcInBsYWNlaG9sZGVyXCJcbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSAndGV4dGFyZWEnIHx8IChub2RlTmFtZSA9PT0gJ2lucHV0JyAmJiAoIWVsZW0uaGFzQXR0cmlidXRlKFwidHlwZVwiKSB8fCBDb21tb25VdGlsLmlucHV0X3R5cGVfd2l0aF9wbGFjZWhvbGRlci5pbmNsdWRlcyhlbGVtLmdldEF0dHJpYnV0ZShcInR5cGVcIikpKSkpIHtcbiAgICAgICAgICAgIGxldCBwbGFjZWhvbGRlciA9IGVsZW0uZ2V0QXR0cmlidXRlKFwicGxhY2Vob2xkZXJcIik7XG4gICAgICAgICAgICBpZiAocGxhY2Vob2xkZXIgJiYgcGxhY2Vob2xkZXIudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlciA9IENvbW1vblV0aWwudHJ1bmNhdGVUZXh0KHBsYWNlaG9sZGVyKTtcbiAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJFTEVNRU5UX0FDQ0VTU0JMRV9OQU1FXCIsIHtcIm5hbWVcIjpwbGFjZWhvbGRlciwgXCJuYW1lRnJvbVwiOiBcInBsYWNlaG9sZGVyXCJ9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1wibmFtZVwiOnBsYWNlaG9sZGVyLCBcIm5hbWVGcm9tXCI6IFwicGxhY2Vob2xkZXJcIn07XG4gICAgICAgICAgICB9ICAgIFxuICAgICAgICB9XG5cbiAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiRUxFTUVOVF9BQ0NFU1NCTEVfTkFNRVwiLCBudWxsKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gY2FsY3VsYXRlIGFjY2Vzc2libGUgbmFtZSBmb3IgbmF0aXZlIGVsZW1lbnRzXG4gICAgcHVibGljIHN0YXRpYyBjb21wdXRlQWNjZXNzaWJsZU5hbWVGb3JOYXRpdmVFbGVtZW50KGVsZW06IEVsZW1lbnQpIDogQWNjZXNzaWJsZU5hbWVSZXN1bHQgfCBudWxsIHtcbiAgICAgICAgY29uc3Qgbm9kZU5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIFxuICAgICAgICAvLyBsYWJlbGxhYmxlIGZpZWxkc1xuICAgICAgICBpZiAoQ29tbW9uVXRpbC5mb3JtX2xhYmVsYWJsZV9lbGVtZW50cy5pbmNsdWRlcyhub2RlTmFtZSkpIHtcbiAgICAgICAgICAgIC8vIEdldCBvbmx5IHRoZSBub24taGlkZGVuIGxhYmVscyBmb3IgZWxlbWVudFxuICAgICAgICAgICAgY29uc3QgbGFiZWwgPSBDb21tb25VdGlsLmdldEZvcm1GaWVsZExhYmVsKGVsZW0pO1xuICAgICAgICAgICAgaWYgKGxhYmVsICYmIGxhYmVsLnRyaW0oKSAhPT0gJycpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjpDb21tb25VdGlsLnRydW5jYXRlVGV4dChsYWJlbCksIFwibmFtZUZyb21cIjogXCJsYWJlbFwifTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlucHV0IHR5cGVzOiBidXR0b24sIHJlc2V0LCBzdWJtaXQsIGltYWdlXG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJpbnB1dFwiICYmIGVsZW0uaGFzQXR0cmlidXRlKFwidHlwZVwiKSkgeyBcbiAgICAgICAgICAgIGlmIChDb21tb25VdGlsLmZvcm1fYnV0dG9uX3R5cGVzLmluY2x1ZGVzKGVsZW0uZ2V0QXR0cmlidXRlKFwidHlwZVwiKSkpIHtcbiAgICAgICAgICAgICAgICAvLyBpbnB1dCB0eXBlczogYnV0dG9uLCByZXNldCwgc3VibWl0XG4gICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBcInZhbHVlXCIgYXR0cmlidXRlIGZvciB0aGUgZWxlbWVudFxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gQ29tbW9uVXRpbC5nZXRFbGVtZW50QXR0cmlidXRlKGVsZW0sIFwidmFsdWVcIik7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlICYmIHZhbHVlLnRyaW0oKSAhPT0gJycpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XCJuYW1lXCI6Q29tbW9uVXRpbC50cnVuY2F0ZVRleHQodmFsdWUpLCBcIm5hbWVGcm9tXCI6IFwidmFsdWVcIn07XG5cbiAgICAgICAgICAgICAgICAvLyBpbnB1dCAnc3VibWl0JyBhbmQgJ3Jlc2V0JyBoYXZlIHZpc2libGUgZGVmYXVsdHMgc28gcGFzcyBpZiB0aGVyZSBpcyBubyBleHBsaWNpdCAndmFsdWUnIGF0dHJpYnV0ZVxuICAgICAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBlbGVtLmdldEF0dHJpYnV0ZShcInR5cGVcIik7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdzdWJtaXQnIHx8IHR5cGUgPT09ICdyZXNldCcpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XCJuYW1lXCI6dHlwZSwgXCJuYW1lRnJvbVwiOiBcImludGVybmFsXCJ9O1xuXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW0uZ2V0QXR0cmlidXRlKFwidHlwZVwiKSA9PT0gJ2ltYWdlJykge1xuICAgICAgICAgICAgICAgIC8vIGlucHV0IHR5cGUgPSAnaW1hZ2UnXG4gICAgICAgICAgICAgICAgLy8gbm90ZSB0aGF0IHRob3VnaCBIVE1MIDUgc3BlYyBpbmRpY2F0ZXMgXCJUaGUgZWxlbWVudCdzIFt2YWx1ZV0gYXR0cmlidXRlIG11c3QgYmUgb21pdHRlZFwiLCBDaHJvbWUgdXNlcyB0aGUgdmFsdWUuXG4gICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBhY2Nlc3NpYmxlIG5hbWUgZm9yIHRoZSBhbHQgYXR0cmlidXRlXG4gICAgICAgICAgICAgICAgY29uc3QgYWx0ID0gQ29tbW9uVXRpbC5nZXRFbGVtZW50QXR0cmlidXRlKGVsZW0sIFwiYWx0XCIpO1xuICAgICAgICAgICAgICAgIGlmIChhbHQgJiYgYWx0LnRyaW0oKSAhPT0gJycpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XCJuYW1lXCI6Q29tbW9uVXRpbC50cnVuY2F0ZVRleHQoYWx0KSwgXCJuYW1lRnJvbVwiOiBcImFsdFwifTs7XG5cbiAgICAgICAgICAgICAgICAvLyB0aGUgdmlzaWJsZSBkZWZhdWx0IHRleHQgZm9yIHR5cGUgXCJpbWFnZVwiIGlzIFwiU3VibWl0XCIgc2FtZSB3aXRoIHRoZSB0eXBlIFwic3VibWl0XCJcbiAgICAgICAgICAgICAgICAvL3JldHVybiB7XCJuYW1lXCI6ZWxlbS5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpLCBcIm5hbWVGcm9tXCI6IFwiaW50ZXJuYWxcIn07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBidXR0b25cbiAgICAgICAgLy8gbm90ZSBidXR0b24gbWF5IGhhdmUgYSB2YWx1ZSBhdHRyaWJ1dGUsIGJ1dCBpdCdzIG5vdCBhIHZpc2libGUgdGV4dFxuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwiYnV0dG9uXCIpIHtcbiAgICAgICAgICAgIC8vIGZpcnN0IHVzZSB0aGUgYnV0dG9uIHRleHRcbiAgICAgICAgICAgIGNvbnN0IHRleHQgPSAoZWxlbSBhcyBIVE1MRWxlbWVudCkuaW5uZXJUZXh0O1xuICAgICAgICAgICAgaWYgKHRleHQgJiYgdGV4dC50cmltKCkgIT09ICcnKVxuICAgICAgICAgICAgICAgIHJldHVybiB7XCJuYW1lXCI6Q29tbW9uVXRpbC50cnVuY2F0ZVRleHQodGV4dCksIFwibmFtZUZyb21cIjogXCJ0ZXh0XCJ9O1xuXG4gICAgICAgICAgICAvLyBmb3IgaW1hZ2UgYnV0dG9uOiBnZXQgdGhlIGZpcnN0IGltYWdlIGlmIGV4aXN0c1xuICAgICAgICAgICAgY29uc3QgaW1hZ2UgPSBlbGVtLnF1ZXJ5U2VsZWN0b3IoJ2ltZycpO1xuICAgICAgICAgICAgaWYgKGltYWdlICYmICFWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChpbWFnZSkgJiYgIVZpc1V0aWwuaXNOb2RlUHJlc2VudGF0aW9uYWwoaW1hZ2UpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHBhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWUoaW1hZ2UpOyBcbiAgICAgICAgICAgICAgICBpZiAocGFpciAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwKSBcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhaXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIGZvciBhIGJ1dHRvbiB3aXRoIGEgc3ZnIGltYWdlXG4gICAgICAgICAgICBjb25zdCBzdmcgPSBlbGVtLnF1ZXJ5U2VsZWN0b3IoJ3N2ZycpO1xuICAgICAgICAgICAgaWYgKHN2ZyAmJiAhVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQoc3ZnKSAmJiAhVmlzVXRpbC5pc05vZGVQcmVzZW50YXRpb25hbChzdmcpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHBhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWUoc3ZnKTtcbiAgICAgICAgICAgICAgICBpZiAocGFpciAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwKSBcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhaXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBmaWVsZHNldFxuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwiZmllbGRzZXRcIikge1xuICAgICAgICAgICAgLy8gaWYgdGhlIGZpZWxkc2V0IGVsZW1lbnQncyBmaXJzdCBjaGlsZCBpcyBhIGxlZ2VuZCBlbGVtZW50LCB0aGVuIHVzZSB0aGUgc3VidHJlZSBvZiB0aGUgbGVnZW5kXG4gICAgICAgICAgICBjb25zdCBmaXJzdCA9IGVsZW0uZmlyc3RFbGVtZW50Q2hpbGQ7XG4gICAgICAgICAgICBpZiAoZmlyc3QgJiYgZmlyc3Qubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2xlZ2VuZCcpIHtcbiAgICAgICAgICAgICAgICAvLyBsZWdlbmQgY2FuIGJlIG1peGVkIHRleHRcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXh0ID0gKGZpcnN0IGFzIEhUTUxFbGVtZW50KS5pbm5lclRleHQ7XG4gICAgICAgICAgICAgICAgaWYgKHRleHQgJiYgdGV4dC50cmltKCkubGVuZ3RoID4gMCkgXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XCJuYW1lXCI6Q29tbW9uVXRpbC50cnVuY2F0ZVRleHQodGV4dCksIFwibmFtZUZyb21cIjogXCJsZWdlbmRcIn07IFxuICAgICAgICAgICAgfSAgICAgICAgXG4gICAgICAgIH1cblxuICAgICAgICAvLyBvdXRwdXRcbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSBcIm91dHB1dFwiKSB7XG4gICAgICAgICAgICAvLyBpZiB0aGUgYXNzb2NpYXRlZCBsYWJlbCBlbGVtZW50IGV4aXN0cywgdXNlIGNvbmNhdGVuYXRlZCBhY2Nlc3NpYmxlIG5hbWUocykgZnJvbSBsYWJlbGxlZCBlbGVtZW50cy5cbiAgICAgICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcImZvclwiKSkge1xuICAgICAgICAgICAgICAgIGxldCBsYWJlbElEcyA9IGVsZW0uZ2V0QXR0cmlidXRlKFwiZm9yXCIpLnRyaW0oKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICAgICAgaWYgKGxhYmVsSURzICYmIGxhYmVsSURzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBsYWJlbElEcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsTm9kZSA9IGVsZW0ub3duZXJEb2N1bWVudC5nZXRFbGVtZW50QnlJZChsYWJlbElEc1tqXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFiZWxOb2RlICYmICFET01VdGlsLnNhbWVOb2RlKGxhYmVsTm9kZSwgZWxlbSkgJiYgIVZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKGxhYmVsTm9kZSkgJiYgIVZpc1V0aWwuaXNOb2RlUHJlc2VudGF0aW9uYWwobGFiZWxOb2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWUobGFiZWxOb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFpciAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwKSBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgKz0gXCIgXCIgKyBDb21tb25VdGlsLm5vcm1hbGl6ZVNwYWNpbmcocGFpci5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAobGFiZWwudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1wibmFtZVwiOkNvbW1vblV0aWwudHJ1bmNhdGVUZXh0KGxhYmVsKSwgXCJuYW1lRnJvbVwiOiBcImxhYmVsXCJ9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gICAgICAgXG4gICAgICAgIH1cblxuICAgICAgICAvLyBzdW1tYXJ5XG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJzdW1tYXJ5XCIpIHtcbiAgICAgICAgICAgIC8vIHVzZSBzdW1tYXJ5IGVsZW1lbnQgc3VidHJlZVxuICAgICAgICAgICAgY29uc3QgdGV4dCA9IChlbGVtIGFzIEhUTUxFbGVtZW50KS5pbm5lclRleHQ7XG4gICAgICAgICAgICBpZiAodGV4dCAmJiB0ZXh0LnRyaW0oKS5sZW5ndGggPiAwKSBcbiAgICAgICAgICAgICAgICByZXR1cm4ge1wibmFtZVwiOkNvbW1vblV0aWwudHJ1bmNhdGVUZXh0KHRleHQpLCBcIm5hbWVGcm9tXCI6IFwibGVnZW5kXCJ9OyAgICAgICAgIFxuICAgICAgICB9XG5cbiAgICAgICAgLy8gZGV0YWlsc1xuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwiZGV0YWlsc1wiKSB7XG4gICAgICAgICAgICBjb25zdCBmaXJzdCA9IGVsZW0uZmlyc3RFbGVtZW50Q2hpbGQ7XG4gICAgICAgICAgICBpZiAoZmlyc3QgJiYgZmlyc3Qubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ3N1bW1hcnknKSB7XG4gICAgICAgICAgICAgICAgLy8gZ2V0IGFjY2Vzc2libGUgbmFtZSBmcm9tIHN1bW1hcnlcbiAgICAgICAgICAgICAgICBjb25zdCBwYWlyID0gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lKGZpcnN0KTtcbiAgICAgICAgICAgICAgICBpZiAocGFpciAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwKSBcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjpDb21tb25VdGlsLnRydW5jYXRlVGV4dChwYWlyLm5hbWUudHJpbSgpKSwgXCJuYW1lRnJvbVwiOiBcInN1bW1hcnlcIn07IFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSWYgbm8gc3VtbWFyeSBlbGVtZW50IGFzIGEgZGlyZWN0IGNoaWxkIG9mIHRoZSBkZXRhaWxzIGVsZW1lbnQsIFxuICAgICAgICAgICAgLy8gdGhlIHVzZXIgYWdlbnQgc2hvdWxkIHByb3ZpZGUgb25lIHdpdGggYSBzdWJ0cmVlIGNvbnRhaW5pbmcgYSBsb2NhbGl6ZWQgc3RyaW5nIG9mIHRoZSB3b3JkIFwiZGV0YWlsc1wiLlxuICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjpcImRldGFpbHNcIiwgXCJuYW1lRnJvbVwiOiBcImludGVybmFsXCJ9OyAgICAgICAgIFxuICAgICAgICB9XG5cbiAgICAgICAgLy8gZmlndXJlXG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJmaWd1cmVcIikge1xuICAgICAgICAgICAgLy8gaWYgdGhlIGZpZ3VyZSBlbGVtZW50IGhhcyBhIGZpZ2NhcHRpb24gYXMgYSBjaGlsZFxuICAgICAgICAgICAgbGV0IGNhcHRpb24gPSBDb21tb25VdGlsLmdldENoaWxkQnlUYWdIaWRkZW4oZWxlbSwgXCJmaWdjYXB0aW9uXCIsIHRydWUsIGZhbHNlKTtcbiAgICAgICAgICAgIGlmIChjYXB0aW9uICYmIGNhcHRpb24ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIC8vIGZpZ2NhcHRpb24gY2FuIGJlIG1peGVkIHRleHRcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXh0ID0gKGNhcHRpb25bMF0gYXMgSFRNTEVsZW1lbnQpLmlubmVyVGV4dDtcbiAgICAgICAgICAgICAgICBpZiAodGV4dCAmJiB0ZXh0LnRyaW0oKS5sZW5ndGggPiAwKSBcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjpDb21tb25VdGlsLnRydW5jYXRlVGV4dCh0ZXh0KSwgXCJuYW1lRnJvbVwiOiBcImZpZ2NhcHRpb25cIn07ICBcbiAgICAgICAgICAgIH0gICAgICAgIFxuICAgICAgICB9XG5cbiAgICAgICAgLy8gaW1nIGVsZW1lbnRzOiB1c2UgYXR0cmlidXRlIFwiYWx0XCJcbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSBcImltZ1wiKSB7XG4gICAgICAgICAgICBpZiAoZWxlbS5oYXNBdHRyaWJ1dGUoXCJhbHRcIikpIHtcbiAgICAgICAgICAgICAgICBsZXQgYWx0ID0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJhbHRcIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjpDb21tb25VdGlsLnRydW5jYXRlVGV4dChhbHQpLCBcIm5hbWVGcm9tXCI6IFwiYWx0XCJ9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gYXJlYSBlbGVtZW50czogdXNlIGF0dHJpYnV0ZSBcImFsdFwiXG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJhcmVhXCIpIHtcbiAgICAgICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcImFsdFwiKSkge1xuICAgICAgICAgICAgICAgIGxldCBhbHQgPSBlbGVtLmdldEF0dHJpYnV0ZShcImFsdFwiKTtcbiAgICAgICAgICAgICAgICBpZiAoYWx0ICYmIGFsdC50cmltKCkubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjpDb21tb25VdGlsLnRydW5jYXRlVGV4dChhbHQpLCBcIm5hbWVGcm9tXCI6IFwiYWx0XCJ9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gdGFibGUgZWxlbWVudFxuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwidGFibGVcIikge1xuICAgICAgICAgICAgLy8gaWYgdGhlIGZpZ3VyZSBlbGVtZW50IGhhcyBhIGNhcHRpb24gYXMgdGhlIGZpcnN0IGNoaWxkXG4gICAgICAgICAgICBsZXQgY2FwdGlvbkVsZW0gPSBlbGVtLmZpcnN0RWxlbWVudENoaWxkO1xuICAgICAgICAgICAgaWYgKGNhcHRpb25FbGVtICYmIGNhcHRpb25FbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdjYXB0aW9uJykge1xuICAgICAgICAgICAgICAgIC8vIGNhcHRpb24gY2FuIGJlIG1peGVkIHRleHRcbiAgICAgICAgICAgICAgICBjb25zdCBjYXB0aW9uID0gKGNhcHRpb25FbGVtIGFzIEhUTUxFbGVtZW50KS5pbm5lclRleHQ7XG4gICAgICAgICAgICAgICAgaWYgKGNhcHRpb24gJiYgY2FwdGlvbi50cmltKCkubGVuZ3RoID4gMCkgXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XCJuYW1lXCI6Q29tbW9uVXRpbC50cnVuY2F0ZVRleHQoY2FwdGlvbiksIFwibmFtZUZyb21cIjogXCJjYXB0aW9uXCJ9OyBcbiAgICAgICAgICAgIH0gICAgICAgICBcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGEgZWxlbWVudFxuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwiYVwiKSB7XG4gICAgICAgICAgICAvLyBmaXJzdCB1c2UgdGhlIGxpbmsgdGV4dFxuICAgICAgICAgICAgY29uc3QgdGV4dCA9IChlbGVtIGFzIEhUTUxFbGVtZW50KS5pbm5lclRleHQ7XG4gICAgICAgICAgICBpZiAodGV4dCAmJiB0ZXh0LnRyaW0oKSAhPT0gJycpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjpDb21tb25VdGlsLnRydW5jYXRlVGV4dCh0ZXh0KSwgXCJuYW1lRnJvbVwiOiBcInRleHRcIn07XG4gICAgICAgICAgICAgXG4gICAgICAgICAgICAvL2ZvciBpbWFnZSBsaW5rOiBnZXQgdGhlIGltYWdlIG9yIHN2ZyBpZiBleGlzdHNcbiAgICAgICAgICAgIGNvbnN0IGltYWdlcyA9IGVsZW0ucXVlcnlTZWxlY3RvckFsbChcIjpzY29wZSA+IGltZywgOnNjb3BlID4gc3ZnXCIpO1xuICAgICAgICAgICAgaWYgKGltYWdlcyAmJiBpbWFnZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCB0ZXh0ID0gXCJcIjtcbiAgICAgICAgICAgICAgICBpbWFnZXMuZm9yRWFjaChpbWFnZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQoaW1hZ2UpICYmICFWaXNVdGlsLmlzTm9kZVByZXNlbnRhdGlvbmFsKGltYWdlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWUoaW1hZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhaXIgJiYgcGFpci5uYW1lICYmIHBhaXIubmFtZS50cmltKCkubGVuZ3RoID4gMCkgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCArPSBcIiBcIiArIHBhaXIubmFtZS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAodGV4dC50cmltKCkgIT09ICcnKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1wibmFtZVwiOnRleHQudHJpbSgpLCBcIm5hbWVGcm9tXCI6IFwiYWx0XCJ9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gb3B0Z3JvdXBcbiAgICAgICAgLy8gbGFiZWwgcGFydGljaXBhdGUgaW4gYWNjZXNzaWJsZSBuYW1lIGNhbGN1bGF0aW9uOiBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbC1hYW0tMS4wLyNhdHQtbGFiZWxcbiAgICAgICAgLy8gVGhlIGxhYmVsIGF0dHJpYnV0ZSBtdXN0IGJlIHNwZWNpZmllZC4gSXRzIHZhbHVlIGdpdmVzIHRoZSBuYW1lIG9mIHRoZSBncm91cFxuICAgICAgICAvLyB0aGUgdmFsdWUgaXMgZGlzYWJsZWQgaW4gdGhlIGludGVyZmFjZVxuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwib3B0Z3JvdXBcIiB8fCBub2RlTmFtZSA9PT0gXCJvcHRpb25cIiB8fCBub2RlTmFtZSA9PT0gXCJ0cmFja1wiKSB7XG4gICAgICAgICAgICBjb25zdCBsYWJlbCA9IGVsZW0uZ2V0QXR0cmlidXRlKFwibGFiZWxcIik7XG4gICAgICAgICAgICBpZiAobGFiZWwgJiYgbGFiZWwudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjpDb21tb25VdGlsLnRydW5jYXRlVGV4dChsYWJlbCksIFwibmFtZUZyb21cIjogXCJsYWJlbFwifTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHN2Z1xuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwic3ZnXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWVGb3JTVkdFbGVtZW50VzNDKGVsZW0pO1xuICAgICAgICAgICAgaWYgKHBhaXIgJiYgcGFpci5uYW1lICYmIHBhaXIubmFtZS50cmltKCkubGVuZ3RoID4gMCkgXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhaXI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gY2FsY3VsYXRlIGFjY2Vzc2libGUgbmFtZSBmb3IgbmF0aXZlIGVsZW1lbnRzXG4gICAgcHVibGljIHN0YXRpYyBjb21wdXRlQWNjZXNzaWJsZU5hbWVGb3JTVkdFbGVtZW50KGVsZW06IEVsZW1lbnQpIDogQWNjZXNzaWJsZU5hbWVSZXN1bHQgfCBudWxsIHtcbiAgICAgICAgLy8gMS4gYSBkaXJlY3QgY2hpbGQgb3IgZGVzY2VuZGFudCB0aXRsZSBlbGVtZW50IFxuICAgICAgICBjb25zdCBzdmdUaXRsZXMgPSBlbGVtLnF1ZXJ5U2VsZWN0b3JBbGwoXCI6c2NvcGUgPiB0aXRsZVwiKTtcbiAgICAgICAgaWYgKHN2Z1RpdGxlcyAmJiBzdmdUaXRsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGV0IHRleHQgPSBcIlwiO1xuICAgICAgICAgICAgc3ZnVGl0bGVzLmZvckVhY2goc3ZnVGl0bGUgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChzdmdUaXRsZSAmJiAhVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQoc3ZnVGl0bGUpICYmICFWaXNVdGlsLmlzTm9kZVByZXNlbnRhdGlvbmFsKHN2Z1RpdGxlKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0aXRsZSA9IHN2Z1RpdGxlLnRleHRDb250ZW50O1xuICAgICAgICAgICAgICAgICAgICBpZiAodGl0bGUgJiYgdGl0bGUudHJpbSgpICE9PSAnJylcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgKz0gdGl0bGUudHJpbSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHRleHQgJiYgdGV4dC50cmltKCkgIT09ICcnKVxuICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjp0ZXh0LnRyaW0oKSwgXCJuYW1lRnJvbVwiOiBcInN2Z1RpdGxlXCJ9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gMi4geGxpbms6dGl0bGUgYXR0cmlidXRlIG9uIGEgbGlua1xuICAgICAgICBsZXQgbGlua1RpdGxlID0gZWxlbS5xdWVyeVNlbGVjdG9yKFwiYVwiKTtcbiAgICAgICAgaWYgKGxpbmtUaXRsZSAmJiAhVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQobGlua1RpdGxlKSAmJiAhVmlzVXRpbC5pc05vZGVQcmVzZW50YXRpb25hbChsaW5rVGl0bGUpKSB7XG4gICAgICAgICAgICBsZXQgbGluayA9IGxpbmtUaXRsZS5nZXRBdHRyaWJ1dGUoXCJ4bGluazp0aXRsZVwiKTtcbiAgICAgICAgICAgIGlmIChsaW5rICYmIGxpbmsudHJpbSgpICE9PSAnJylcbiAgICAgICAgICAgICAgICByZXR1cm4ge1wibmFtZVwiOkNvbW1vblV0aWwudHJ1bmNhdGVUZXh0KGxpbmspLCBcIm5hbWVGcm9tXCI6IFwic3ZnbGlua1RpdGxlXCJ9O1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqIDMuIGZvciB0ZXh0IGNvbnRhaW5lciBlbGVtZW50cywgdGhlIHRleHQgY29udGVudC4gXG4gICAgICAgICAqIG5vdGUgdGhlIFNWRyB0ZXh0IGNvbnRlbnQgZWxlbWVudHMgYXJlOiDigJh0ZXh04oCZLCDigJh0ZXh0UGF0aOKAmSBhbmQg4oCYdHNwYW7igJkuXG4gICAgICAgICAqICBzdmcgZWxlbWVudCBjYW4gYmUgbmVzdGVkLiBPbmUgb2YgdGhlIHB1cnBvc2VzIGlzIHRvIHRvIGdyb3VwIFNWRyBzaGFwZXMgdG9nZXRoZXIgYXMgYSBjb2xsZWN0aW9uIGZvciByZXNwb25zaXZlIGRlc2lnbi5cbiAgICAgICAgICogXG4gICAgICAgICAqIHNlbGVjdCB0ZXh0IGNvbnRlbnQgZXhjbHVkZWQgdGhlIHRleHQgZnJvbSB0aGUgbmVzdGVkIHN2ZyBlbGVtZW50cyBhbmQgdGhlaXIgY2hpbGRyZW4gXG4gICAgICAgICAqLyBcbiAgICAgICAgbGV0IHRleHQgPSBcIlwiO1xuICAgICAgICBlbGVtLnF1ZXJ5U2VsZWN0b3JBbGwoXCI6c2NvcGUgPiAqXCIpLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGlmIChlbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgIT09ICdzdmcnICYmICFWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChlbGVtZW50KSAmJiAhVmlzVXRpbC5pc05vZGVQcmVzZW50YXRpb25hbChlbGVtZW50KSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gQ29tbW9uVXRpbC5nZXRJbm5lclRleHQoZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlICYmIHZhbHVlLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9IHZhbHVlO1xuICAgICAgICAgICAgfSAgICBcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh0ZXh0LnRyaW0oKSAhPT0gJycpXG4gICAgICAgICAgICByZXR1cm4ge1wibmFtZVwiOkNvbW1vblV0aWwudHJ1bmNhdGVUZXh0KHRleHQpLCBcIm5hbWVGcm9tXCI6IFwic3ZnVGV4dFwifTsgXG5cbiAgICAgICAgLy8gNC4gZnJvbSBhcmlhLWRlc2NyaWJlZGJ5IG9yIGFyaWEtZGVzY3JpcHRpb24gXG4gICAgICAgIGxldCBkZXNjYnkgPSBBcmlhVXRpbC5nZXRBcmlhRGVzY3JpcHRpb24oZWxlbSk7XG4gICAgICAgIGlmIChkZXNjYnkgJiYgZGVzY2J5LnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjpDb21tb25VdGlsLnRydW5jYXRlVGV4dChkZXNjYnkpLCBcIm5hbWVGcm9tXCI6IFwiYXJpYS1kZXNjcmlwdGlvblwifTtcblxuICAgICAgICAvLyA1LiBhIGRpcmVjdCBjaGlsZCBvciBkZXNjZW5kYW50IGRlc2MgZWxlbWVudFxuICAgICAgICBsZXQgZGVzY0VsZW1zID0gZWxlbS5xdWVyeVNlbGVjdG9yQWxsKFwiOnNjb3BlID4gZGVzY1wiKTtcbiAgICAgICAgaWYgKGRlc2NFbGVtcyAmJiBkZXNjRWxlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGV0IHRleHQgPSBcIlwiO1xuICAgICAgICAgICAgZGVzY0VsZW1zLmZvckVhY2goZGVzY0VsZW0gPT4ge1xuICAgICAgICAgICAgICAgIGlmIChkZXNjRWxlbSAmJiAhVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQoZGVzY0VsZW0pICYmICFWaXNVdGlsLmlzTm9kZVByZXNlbnRhdGlvbmFsKGRlc2NFbGVtKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXNjID0gZGVzY0VsZW0udGV4dENvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkZXNjICYmIGRlc2MudHJpbSgpICE9PSAnJylcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgKz0gZGVzYy50cmltKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAodGV4dCAmJiB0ZXh0LnRyaW0oKSAhPT0gJycpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjp0ZXh0LnRyaW0oKSwgXCJuYW1lRnJvbVwiOiBcInN2Z0Rlc2NcIn07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBjYWxjdWxhdGUgYWNjZXNzaWJsZSBuYW1lIGZvciBjdXN0b20gZWxlbWVudHMgbWFya2VkIHdpdGggYXJpYVxuICAgIHB1YmxpYyBzdGF0aWMgY29tcHV0ZUFjY2Vzc2libGVOYW1lRnJvbUNvbnRlbnQoZWxlbTogRWxlbWVudCkgOiBBY2Nlc3NpYmxlTmFtZVJlc3VsdCB8IG51bGwge1xuICAgICAgICBjb25zdCBub2RlTmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgY29uc3Qgcm9sZSA9IEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZShlbGVtKTtcbiAgICAgICAgLyoqIGZvciBhY2MgbmFtZSBmcm9tIGNvbnRlbnQsIHRoZSBjb250ZW50IGZyb20gQ1NTIHBzZXVkby1lbGVtZW50cyBcbiAgICAgICAgICogIDpiZWZvcmUgYW5kIDphZnRlciBwc2V1ZG8gZWxlbWVudHMgW0NTUzJdIGNhbiBwcm92aWRlIHRleHR1YWwgY29udGVudCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIGEgY29udGVudCBtb2RlbC5cbiAgICAgICAgICogRm9yIDpiZWZvcmUgb3IgOmFmdGVyIHBzZXVkbyBlbGVtZW50cywgdXNlciBhZ2VudHMgbXVzdCBwcmVwZW5kIENTUyB0ZXh0dWFsIGNvbnRlbnQsIHdpdGhvdXQgYSBzcGFjZSwgXG4gICAgICAgICAqICAgdG8gdGhlIHRleHR1YWwgY29udGVudCBvZiB0aGUgY3VycmVudCBub2RlLlxuICAgICAgICAgKi9cbiAgICAgICAgbGV0IHBhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWVGb3JDU1NQc2V1ZG9FbGVtZW50KGVsZW0sIFwiYmVmb3JlXCIpO1xuICAgICAgICBpZiAocGFpciAhPT0gbnVsbCAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgcmV0dXJuIHBhaXI7XG5cbiAgICAgICAgcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZUZvckNTU1BzZXVkb0VsZW1lbnQoZWxlbSwgXCJhZnRlclwiKTtcbiAgICAgICAgaWYgKHBhaXIgJiYgcGFpci5uYW1lICYmIHBhaXIubmFtZS50cmltKCkubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHJldHVybiBwYWlyO1xuXG4gICAgICAgIC8vICBzaGFkb3cgaG9zdFxuICAgICAgICBpZiAoZWxlbS5zaGFkb3dSb290KSB7XG4gICAgICAgICAgICBwYWlyID0gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lRm9yU2hhZG93SG9zdChlbGVtKTtcbiAgICAgICAgICAgIGlmIChwYWlyICYmIHBhaXIubmFtZSAmJiBwYWlyLm5hbWUudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjogcGFpci5uYW1lLCBcIm5hbWVGcm9tXCI6IFwic2hhZG93XCJ9OztcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gc2xvdCBlbGVtZW50XG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJzbG90XCIpIHtcbiAgICAgICAgICAgIHBhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWVGb3JTbG90RWxlbWVudChlbGVtKTtcbiAgICAgICAgICAgIGlmIChwYWlyICYmIHBhaXIubmFtZSAmJiBwYWlyLm5hbWUudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjogcGFpci5uYW1lLCBcIm5hbWVGcm9tXCI6IFwic2xvdFwifTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG90aGVyd2lzZTogZ2V0IHRoZSB2YWx1ZSBmcm9tIHRoZSBlbGVtZW50XG4gICAgICAgIHBhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWVGcm9tQ2hpbGRyZW4oZWxlbSk7XG4gICAgICAgIGlmIChwYWlyICYmIHBhaXIubmFtZSAmJiBwYWlyLm5hbWUudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICByZXR1cm4ge1wibmFtZVwiOiBwYWlyLm5hbWUsIFwibmFtZUZyb21cIjogXCJjb250ZW50XCJ9O1xuXG4gICAgICAgIC8vIG5vIGFjY2Vzc2libGUgbmFtZSBleGlzdHNcbiAgICAgICAgcmV0dXJuIG51bGw7ICAgIFxuICAgIH1cblxuICAgIC8vIGNhbGN1bGF0ZSBhY2Nlc3NpYmxlIG5hbWUgZnJvbSBDU1MgZ2VuZXJhdGVkIGNvbnRlbnRcbiAgICBwdWJsaWMgc3RhdGljIGNvbXB1dGVBY2Nlc3NpYmxlTmFtZUZvckNTU1BzZXVkb0VsZW1lbnQoZWxlbTogRWxlbWVudCwgdHlwZTpzdHJpbmcpIDogQWNjZXNzaWJsZU5hbWVSZXN1bHQgfCBudWxsIHtcbiAgICAgICAgY29uc3QgY29udGVudEVsZW0gPSBlbGVtLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtLHR5cGUpO1xuICAgICAgICBpZiAoY29udGVudEVsZW0pIHtcbiAgICAgICAgICAgIGxldCBjb250ZW50ID0gY29udGVudEVsZW0uY29udGVudDtcbiAgICAgICAgICAgIGlmIChjb250ZW50ICYmIGNvbnRlbnQgIT09IFwibm9uZVwiICYmIGNvbnRlbnQgIT09IFwibm9cIiAmJiBjb250ZW50ICE9PSBcIm5vcm1hbFwiKSB7XG4gICAgICAgICAgICAgICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZSgvXlwiLyxcIlwiKS5yZXBsYWNlKC9cIiQvLFwiXCIpO1xuICAgICAgICAgICAgICAgIGlmIChjb250ZW50LnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1wibmFtZVwiOiBDb21tb25VdGlsLnRydW5jYXRlVGV4dChjb250ZW50KSwgXCJuYW1lRnJvbVwiOiBcImNzcy1cIit0eXBlfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBjYWxjdWxhdGUgYWNjZXNzaWJsZSBuYW1lIGZvciBTTE9UIGVsZW1lbnRcbiAgICBwdWJsaWMgc3RhdGljIGNvbXB1dGVBY2Nlc3NpYmxlTmFtZUZvclNoYWRvd0hvc3QoZWxlbTogRWxlbWVudCkgOiBBY2Nlc3NpYmxlTmFtZVJlc3VsdCB8IG51bGwge1xuICAgICAgICBsZXQgdGV4dCA9IFwiXCI7XG4gICAgICAgIGNvbnN0IHNoYWRvd1Jvb3QgPSBlbGVtLnNoYWRvd1Jvb3Q7XG4gICAgICAgIGlmIChzaGFkb3dSb290KSB7XG4gICAgICAgICAgICBsZXQgY2hpbGRyZW4gPSBzaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGwoJyonKTsgICBcbiAgICAgICAgICAgIC8vIGNoZWNrIHRleHQgZnJvbSBhbGwgdGhlIGNoaWxkcmVuIGVsZW1lbnRzXG4gICAgICAgICAgICBjaGlsZHJlbi5mb3JFYWNoKGNoaWxkID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYWlyID0gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lKGNoaWxkKTtcbiAgICAgICAgICAgICAgICBpZiAocGFpciAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9IFwiIFwiICsgcGFpci5uYW1lLnRyaW0oKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0ZXh0LnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjogQ29tbW9uVXRpbC50cnVuY2F0ZVRleHQodGV4dCksIFwibmFtZUZyb21cIjogXCJzaGFkb3ctaG9zdFwifTtcblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBjYWxjdWxhdGUgYWNjZXNzaWJsZSBuYW1lIGZvciBTTE9UIGVsZW1lbnRcbiAgICBwdWJsaWMgc3RhdGljIGNvbXB1dGVBY2Nlc3NpYmxlTmFtZUZvclNsb3RFbGVtZW50KGVsZW06IEVsZW1lbnQpIDogQWNjZXNzaWJsZU5hbWVSZXN1bHQgfCBudWxsIHtcbiAgICAgICAgLy9pZiBubyBhc3NpZ25lZE5vZGUsIGNoZWNrIGl0cyBvd24gdGV4dCBcbiAgICAgICAgbGV0IHRleHQgPSBcIlwiO1xuICAgICAgICBpZiAoIShlbGVtIGFzIEhUTUxTbG90RWxlbWVudCkuYXNzaWduZWROb2RlcygpIHx8IChlbGVtIGFzIEhUTUxTbG90RWxlbWVudCkuYXNzaWduZWROb2RlcygpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgY29uc3QgcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZShlbGVtKTtcbiAgICAgICAgICAgIGlmIChwYWlyICYmIHBhaXIubmFtZSAmJiBwYWlyLm5hbWUudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgdGV4dCArPSBcIiBcIiArIHBhaXIubmFtZS50cmltKCk7XG4gICAgICAgIH0gZWxzZSB7ICAgIFxuICAgICAgICAgICAgLy8gY2hlY2sgdGV4dCBmcm9tIGFsbCBhc3NpZ25lZCBub2Rlc1xuICAgICAgICAgICAgZm9yIChjb25zdCBzbG90Q2hpbGQgb2YgKGVsZW0gYXMgSFRNTFNsb3RFbGVtZW50KS5hc3NpZ25lZE5vZGVzKCkpIHtcbiAgICAgICAgICAgICAgICBsZXQgcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZShzbG90Q2hpbGQgYXMgRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgaWYgKHBhaXIgJiYgcGFpci5uYW1lICYmIHBhaXIubmFtZS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9IFwiIFwiICsgcGFpci5uYW1lLnRyaW0oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGV4dC50cmltKCkubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHJldHVybiB7XCJuYW1lXCI6IENvbW1vblV0aWwudHJ1bmNhdGVUZXh0KHRleHQpLCBcIm5hbWVGcm9tXCI6IFwiY29udGVudC1zbG90XCJ9O1xuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIGNhbGN1bGF0ZSBhY2Nlc3NpYmxlIG5hbWUgZnJvbSBjaGlsZHJlbiBjb250ZW50XG4gICAgcHVibGljIHN0YXRpYyBjb21wdXRlQWNjZXNzaWJsZU5hbWVGcm9tQ2hpbGRyZW4oZWxlbTogRWxlbWVudCkgOiBBY2Nlc3NpYmxlTmFtZVJlc3VsdCB8IG51bGwge1xuICAgICAgICBsZXQgdGV4dCA9IFwiXCI7XG5cbiAgICAgICAgLy9sZXQgd2Fsa0NoaWxkID0gZWxlbS5maXJzdENoaWxkO1xuICAgICAgICBsZXQgbncgPSBuZXcgRE9NV2Fsa2VyKGVsZW0pO1xuICAgICAgICAvLyBMb29wIG92ZXIgYWxsIHRoZSBjaGlsZHJlbnMgb2YgdGhlIGVsZW1lbnQgdG8gZ2V0IHRoZSB0ZXh0XG4gICAgICAgIHdoaWxlIChudy5uZXh0Tm9kZSgpICYmIG53Lm5vZGUgIT09IGVsZW0gJiYgbncubm9kZSAhPT0gZWxlbS5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICBpZiAobncuYkVuZFRhZykgY29udGludWU7XG4gICAgICAgIC8vd2hpbGUgKHdhbGtDaGlsZCkgeyBcbiAgICAgICAgICAgIGNvbnN0IHdhbGtDaGlsZCA9IG53Lm5vZGU7IFxuICAgICAgICAgICAgaWYgKHdhbGtDaGlsZC5ub2RlVHlwZSA9PT0gMykge1xuICAgICAgICAgICAgICAgIC8vIGZvciB0aGUgdGV4dCBub2RlLCBnZXQgdGhlIHBhcmVudG5vZGUgdG8gY2hlY2sgdmlzaWJpbGl0eVxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IHdhbGtDaGlsZC5wYXJlbnRFbGVtZW50O1xuICAgICAgICAgICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocGFyZW50KSAmJiAhVmlzVXRpbC5pc05vZGVQcmVzZW50YXRpb25hbChwYXJlbnQpICYmIHdhbGtDaGlsZC5ub2RlVmFsdWUgJiYgd2Fsa0NoaWxkLm5vZGVWYWx1ZS50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9IFwiIFwiICsgd2Fsa0NoaWxkLm5vZGVWYWx1ZS50cmltKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHdhbGtDaGlsZC5ub2RlVHlwZSA9PT0gMSAmJiAhVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQod2Fsa0NoaWxkIGFzIEhUTUxFbGVtZW50KSAmJiAhVmlzVXRpbC5pc05vZGVQcmVzZW50YXRpb25hbCh3YWxrQ2hpbGQgYXMgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZSh3YWxrQ2hpbGQgYXMgRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgaWYgKHBhaXIgJiYgcGFpci5uYW1lICYmIHBhaXIubmFtZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRleHQgKz0gXCIgXCIgKyBwYWlyLm5hbWUudHJpbSgpO1xuICAgICAgICAgICAgICAgICAgICBudy5iRW5kVGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gU2tpcCBjaGlsZHJlbiBpZiB0aGlzIGVsZW1lbnQgb25seSBoYXMgcHJlc2VudGF0aW9uYWwgY2hpbGRyZW5cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChBcmlhVXRpbC5jb250YWluc1ByZXNlbnRhdGlvbmFsQ2hpbGRyZW5Pbmx5KG53Lm5vZGUgYXMgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIG53LmJFbmRUYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGV4dC50cmltKCkubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHJldHVybiB7XCJuYW1lXCI6IENvbW1vblV0aWwudHJ1bmNhdGVUZXh0KHRleHQpLCBcIm5hbWVGcm9tXCI6IFwiY29udGVudFwifTtcblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBpZiBhY2Nlc3NpYmxlIG5hbWUgY2FuIGJlIGlnbm9yZWQgZm9yIGltYWdlIG9yIHN2Z1xuICAgIHB1YmxpYyBzdGF0aWMgaXNBY2Nlc3NpYmxlTmFtZUlnbm9yYWJsZShlbGVtOiBFbGVtZW50KSA6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIWVsZW0pIHJldHVybiBmYWxzZTtcblxuICAgICAgICBjb25zdCBub2RlTmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKG5vZGVOYW1lICE9PSAnaW1nJyAmJiBub2RlTmFtZSAhPT0gJ3N2ZycpIHJldHVybiBmYWxzZTtcbiAgICAgICAgXG4gICAgICAgIGxldCBwYXJlbnQgPSBlbGVtLnBhcmVudEVsZW1lbnQ7XG4gICAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgICAgIC8vIGlmIHRoZSBwYXJlbnQgaXMgYSB3aWRnZXQgYW5kIGhhcyBhbiBhcmlhIGxhYmVsLCB0aGVuIGltYWdlL3N2ZyBsYWJlbCBpcyBub3QgbmVjZXNzYXJ5XG4gICAgICAgICAgICBpZiAoKEFyaWFVdGlsLmlzV2lkZ2V0KHBhcmVudCkgfHwgQXJpYVV0aWwuY29udGFpbnNQcmVzZW50YXRpb25hbENoaWxkcmVuT25seShwYXJlbnQpKSAmJiBBcmlhVXRpbC5oYXNBcmlhTGFiZWwocGFyZW50KSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn0gXG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgIENvcHlyaWdodDo6IDIwMjAtIElCTSwgSW5jXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgQVJJQURlZmluaXRpb25zLCBJRG9jdW1lbnRDb25mb3JtYW5jZVJlcXVpcmVtZW50IH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQURlZmluaXRpb25zXCI7XG5pbXBvcnQgeyBBUklBTWFwcGVyIH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQU1hcHBlclwiO1xuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01XYWxrZXJcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi9WaXNVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4vQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgQWNjTmFtZVV0aWwgfSBmcm9tIFwiLi9BY2NOYW1lVXRpbFwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG5pbXBvcnQgeyBET01VdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01VdGlsXCI7XG5cbmV4cG9ydCBjbGFzcyBBcmlhVXRpbCB7XG5cbiAgICAvLyBUaGlzIGxpc3QgY29udGFpbnMgYSBsaXN0IG9mIGVsZW1lbnRzIHRhZ3Mgd2hpY2ggaGF2ZSBkaXNwbGF5OiBub25lIGJ5IGRlZmF1bHQsIHNpbmNlIHdlIGhhdmUgcnVsZXMgdHJpZ2dlcmluZ1xuICAgIHB1YmxpYyBzdGF0aWMgbmF2TGlua0tleXdvcmRzID0gWydzdGFydCcsICduZXh0JywgJ3ByZXYnLCAncHJldmlvdXMnLCAnY29udGVudHMnLCAnaW5kZXgnXVxuXG4gICAgLy8gVGhpcyBsaXN0IGNvbnRhaW5zIGEgbGlzdCBvZiBydWxlIGlkcyBmb3IgdGhlIHJ1bGVzIHRoYXQgaGF2ZSB0byBjaGVjayBmb3IgaGlkZGVuIGNvbnRlbnQgcmVnYXJkbGVzcyBvZiB0aGUgQ2hlY2sgSGlkZGVuXG4gICAgLy8gQ29udGVudCBTZXR0aW5nLiBUaGlzIG1lYW5zIHRoYXQgd2hlbiB0aGUgZW5naW5lIGlzIGFjdHVhbGx5IGRldGVybWluZSB3aGljaCBlbGVtZW50cyB0byBtYXNzIHRvIHRoZSBydWxlcywgaXQgd2lsbCBhbHdheXNcbiAgICAvLyBwYXNzIHRoZXNlcyBydWxlcyBubyBtYXR0ZXIgd2hhdCB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgU2V0dGluZyBpcy5cbiAgICBwdWJsaWMgc3RhdGljIHJ1bGVzVGhhdEhhdmVUb0NoZWNrSGlkZGVuID0gWydSUFRfRWxlbV9VbmlxdWVJZCddXG5cbiAgICBwdWJsaWMgc3RhdGljIGlzRGVmaW5lZEFyaWFBdHRyaWJ1dGVBdEluZGV4KGVsZSwgaW5kZXgpIHtcbiAgICAgICAgbGV0IGF0dHJOYW1lID0gZWxlLmF0dHJpYnV0ZXNbaW5kZXhdLm5hbWU7XG4gICAgICAgIHJldHVybiBBcmlhVXRpbC5pc0RlZmluZWRBcmlhQXR0cmlidXRlKGVsZSwgYXR0ck5hbWUpO1xuICAgIH1cblxuICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93YWktYXJpYS0xLjEvI2ludHJvc3RhdGVzXG4gICAgcHVibGljIHN0YXRpYyBhcmlhQXR0cmlidXRlUm9sZURlZmF1bHRzID0ge1xuICAgICAgICBcImFsZXJ0XCI6IHtcbiAgICAgICAgICAgIFwiYXJpYS1saXZlXCI6IFwiYXNzZXJ0aXZlXCIsXG4gICAgICAgICAgICBcImFyaWEtYXRvbWljXCI6IFwidHJ1ZVwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiY29tYm9ib3hcIjoge1xuICAgICAgICAgICAgXCJhcmlhLWhhc3BvcHVwXCI6IFwibGlzdGJveFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwibGlzdGJveFwiOiB7XG4gICAgICAgICAgICBcImFyaWEtb3JpZW50YXRpb25cIjogXCJ2ZXJ0aWNhbFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwibG9nXCI6IHtcbiAgICAgICAgICAgIFwiYXJpYS1saXZlXCI6IFwicG9saXRlXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJtZW51XCI6IHtcbiAgICAgICAgICAgIFwiYXJpYS1vcmllbnRhdGlvblwiOiBcInZlcnRpY2FsXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJtZW51YmFyXCI6IHtcbiAgICAgICAgICAgIFwiYXJpYS1vcmllbnRhdGlvblwiOiBcImhvcml6b250YWxcIlxuICAgICAgICB9LFxuICAgICAgICBcIm1ldGVyXCI6IHtcbiAgICAgICAgICAgIFwiYXJpYS12YWx1ZW1pblwiOiBcIjBcIixcbiAgICAgICAgICAgIFwiYXJpYS12YWx1ZW1heFwiOiBcIjEwMFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwib3B0aW9uXCI6IHtcbiAgICAgICAgICAgIFwiYXJpYS1zZWxlY3RlZFwiOiBcImZhbHNlXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJwcm9ncmVzc2JhclwiOiB7XG4gICAgICAgICAgICBcImFyaWEtdmFsdWVtaW5cIjogXCIwXCIsXG4gICAgICAgICAgICBcImFyaWEtdmFsdWVtYXhcIjogXCIxMDBcIlxuICAgICAgICB9LFxuICAgICAgICBcInNjcm9sbGJhclwiOiB7XG4gICAgICAgICAgICBcImFyaWEtb3JpZW50YXRpb25cIjogXCJ2ZXJ0aWNhbFwiLFxuICAgICAgICAgICAgXCJhcmlhLXZhbHVlbWluXCI6IFwiMFwiLFxuICAgICAgICAgICAgXCJhcmlhLXZhbHVlbWF4XCI6IFwiMTAwXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJzZXBhcmF0b3JcIjoge1xuICAgICAgICAgICAgXCJhcmlhLW9yaWVudGF0aW9uXCI6IFwiaG9yaXpvbnRhbFwiLFxuICAgICAgICAgICAgXCJhcmlhLXZhbHVlbWluXCI6IFwiMFwiLFxuICAgICAgICAgICAgXCJhcmlhLXZhbHVlbWF4XCI6IFwiMTAwXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJzbGlkZXJcIjoge1xuICAgICAgICAgICAgXCJhcmlhLW9yaWVudGF0aW9uXCI6IFwiaG9yaXpvbnRhbFwiLFxuICAgICAgICAgICAgXCJhcmlhLXZhbHVlbWluXCI6IFwiMFwiLFxuICAgICAgICAgICAgXCJhcmlhLXZhbHVlbWF4XCI6IFwiMTAwXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJzcGluYnV0dG9uXCI6IHtcbiAgICAgICAgICAgIC8vIE5vdCBzdXJlIGhvdyB0byBlbmNvZGUgbWluL21heCAob3Igbm93IGluIDEuMiAtIFwiaGFzIG5vIHZhbHVlXCIpXG4gICAgICAgICAgICAvL1wiYXJpYS12YWx1ZW5vd1wiOiBcIjBcIiBUT0RPOiBhdCByaXNrOiBtYXliZSBkZWxldGUgYWZ0ZXIgQVJJQSAxLjIgcmVhY2hlcyBwcm9wb3NlZCByZWNcbiAgICAgICAgICAgIC8vIFByb2JhYmx5IGp1c3QgZGVsZXRlIHNwaW5idXR0b24gZnJvbSB0aGlzIGxpc3QgY29tcGxldGVseSBhbmQgbGV0IHVzZXIgYWdlbnRzIGhhbmRsZSBcImRlZmF1bHRzXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJzdGF0dXNcIjoge1xuICAgICAgICAgICAgXCJhcmlhLWxpdmVcIjogXCJwb2xpdGVcIixcbiAgICAgICAgICAgIFwiYXJpYS1hdG9taWNcIjogXCJ0cnVlXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJ0YWJcIjoge1xuICAgICAgICAgICAgXCJhcmlhLXNlbGVjdGVkXCI6IFwiZmFsc2VcIlxuICAgICAgICB9LFxuICAgICAgICBcInRhYmxpc3RcIjoge1xuICAgICAgICAgICAgXCJhcmlhLW9yaWVudGF0aW9uXCI6IFwiaG9yaXpvbnRhbFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwidG9vbGJhclwiOiB7XG4gICAgICAgICAgICBcImFyaWEtb3JpZW50YXRpb25cIjogXCJob3Jpem9udGFsXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJ0cmVlXCI6IHtcbiAgICAgICAgICAgIFwiYXJpYS1vcmllbnRhdGlvblwiOiBcInZlcnRpY2FsXCJcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93YWktYXJpYS0xLjEvI2FyaWEtYXRvbWljXG4gICAgcHVibGljIHN0YXRpYyBhcmlhQXR0cmlidXRlR2xvYmFsRGVmYXVsdHMgPSB7XG4gICAgICAgIFwiYXJpYS1hdG9taWNcIjogXCJmYWxzZVwiLFxuICAgICAgICBcImFyaWEtYXV0b2NvbXBsZXRlXCI6IFwibm9uZVwiLFxuICAgICAgICBcImFyaWEtYnVzeVwiOiBcImZhbHNlXCIsXG4gICAgICAgIFwiYXJpYS1jaGVja2VkXCI6IHVuZGVmaW5lZCxcbiAgICAgICAgXCJhcmlhLWN1cnJlbnRcIjogXCJmYWxzZVwiLFxuICAgICAgICBcImFyaWEtZGlzYWJsZWRcIjogXCJmYWxzZVwiLFxuICAgICAgICBcImFyaWEtZHJvcGVmZmVjdFwiOiBcIm5vbmVcIixcbiAgICAgICAgXCJhcmlhLWV4cGFuZGVkXCI6IHVuZGVmaW5lZCxcbiAgICAgICAgXCJhcmlhLWdyYWJiZWRcIjogdW5kZWZpbmVkLFxuICAgICAgICBcImFyaWEtaGFzcG9wdXBcIjogXCJmYWxzZVwiLFxuICAgICAgICBcImFyaWEtaGlkZGVuXCI6IHVuZGVmaW5lZCxcbiAgICAgICAgXCJhcmlhLWludmFsaWRcIjogXCJmYWxzZVwiLFxuICAgICAgICBcImFyaWEtbGl2ZVwiOiBcIm9mZlwiLFxuICAgICAgICBcImFyaWEtbW9kYWxcIjogXCJmYWxzZVwiLFxuICAgICAgICBcImFyaWEtbXVsdGlsaW5lXCI6IFwiZmFsc2VcIixcbiAgICAgICAgXCJhcmlhLW11bHRpc2VsZWN0YWJsZVwiOiBcImZhbHNlXCIsXG4gICAgICAgIFwiYXJpYS1vcmllbnRhdGlvblwiOiB1bmRlZmluZWQsXG4gICAgICAgIFwiYXJpYS1wcmVzc2VkXCI6IHVuZGVmaW5lZCxcbiAgICAgICAgXCJhcmlhLXJlYWRvbmx5XCI6IFwiZmFsc2VcIixcbiAgICAgICAgLy9cImFyaWEtcmVsZXZhbnRcIjogXCJhZGRpdGlvbnMgdGV4dFwiLCBUT0RPOiBhcmUgbXVsdGlwbGUgdmFsdWVzIHN1cHBvcnRlZD9cbiAgICAgICAgXCJhcmlhLXJlcXVpcmVkXCI6IFwiZmFsc2VcIixcbiAgICAgICAgXCJhcmlhLXNlbGVjdGVkXCI6IHVuZGVmaW5lZCxcbiAgICAgICAgXCJhcmlhLXNvcnRcIjogXCJub25lXCJcbiAgICB9XG5cbiAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbC1hYW0tMS4wLyNodG1sLWF0dHJpYnV0ZS1zdGF0ZS1hbmQtcHJvcGVydHktbWFwcGluZ3NcbiAgICBwdWJsaWMgc3RhdGljIGFyaWFBdHRyaWJ1dGVJbXBsaWNpdE1hcHBpbmdzID0ge1xuICAgICAgICBcImFyaWEtYXV0b2NvbXBsZXRlXCI6IHtcbiAgICAgICAgICAgIFwiZm9ybVwiOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcIm9mZlwiID09PSBlLmdldEF0dHJpYnV0ZShcImF1dG9jb21wbGV0ZVwiKSA/IFwibm9uZVwiIDogXCJib3RoXCI7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJpbnB1dFwiOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcIm9mZlwiID09PSBlLmdldEF0dHJpYnV0ZShcImF1dG9jb21wbGV0ZVwiKSA/IFwibm9uZVwiIDogXCJib3RoXCI7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJzZWxlY3RcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJvZmZcIiA9PT0gZS5nZXRBdHRyaWJ1dGUoXCJhdXRvY29tcGxldGVcIikgPyBcIm5vbmVcIiA6IFwiYm90aFwiO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwidGV4dGFyZWFcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJvZmZcIiA9PT0gZS5nZXRBdHRyaWJ1dGUoXCJhdXRvY29tcGxldGVcIikgPyBcIm5vbmVcIiA6IFwiYm90aFwiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtY2hlY2tlZFwiOiB7XG4gICAgICAgICAgICBcImlucHV0XCI6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGUuaGFzQXR0cmlidXRlKFwiaW5kZXRlcm1pbmF0ZVwiKSkgcmV0dXJuIFwibWl4ZWRcIjtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJcIiArIGUuaGFzQXR0cmlidXRlKFwiY2hlY2tlZFwiKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm1lbnVpdGVtXCI6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGUuaGFzQXR0cmlidXRlKFwiaW5kZXRlcm1pbmF0ZVwiKSkgcmV0dXJuIFwibWl4ZWRcIjtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJcIiArIGUuaGFzQXR0cmlidXRlKFwiY2hlY2tlZFwiKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIipcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoZS5oYXNBdHRyaWJ1dGUoXCJpbmRldGVybWluYXRlXCIpKSByZXR1cm4gXCJtaXhlZFwiO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWRpc2FibGVkXCI6IHtcbiAgICAgICAgICAgIFwiYnV0dG9uXCI6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGUuaGFzQXR0cmlidXRlKFwiZGlzYWJsZWRcIikgPyBcInRydWVcIiA6IFwiZmFsc2VcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZmllbGRzZXRcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5oYXNBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiKSA/IFwidHJ1ZVwiIDogXCJmYWxzZVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJpbnB1dFwiOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlLmhhc0F0dHJpYnV0ZShcImRpc2FibGVkXCIpID8gXCJ0cnVlXCIgOiBcImZhbHNlXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm9wdGdyb3VwXCI6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGUuaGFzQXR0cmlidXRlKFwiZGlzYWJsZWRcIikgPyBcInRydWVcIiA6IFwiZmFsc2VcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwib3B0aW9uXCI6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGUuaGFzQXR0cmlidXRlKFwiZGlzYWJsZWRcIikgPyBcInRydWVcIiA6IFwiZmFsc2VcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwic2VsZWN0XCI6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGUuaGFzQXR0cmlidXRlKFwiZGlzYWJsZWRcIikgPyBcInRydWVcIiA6IFwiZmFsc2VcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwidGV4dGFyZWFcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5oYXNBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiKSA/IFwidHJ1ZVwiIDogXCJmYWxzZVwiXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1leHBhbmRlZFwiOiB7XG4gICAgICAgICAgICBcImRldGFpbHNcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5nZXRBdHRyaWJ1dGUoXCJvcGVuXCIpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJkaWFsb2dcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5nZXRBdHRyaWJ1dGUoXCJvcGVuXCIpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1tdWx0aXNlbGVjdGFibGVcIjoge1xuICAgICAgICAgICAgXCJzZWxlY3RcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoZS5oYXNBdHRyaWJ1dGUoXCJtdWx0aXBsZVwiKSkgcmV0dXJuIFwidHJ1ZVwiO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXBsYWNlaG9sZGVyXCI6IHtcbiAgICAgICAgICAgIFwiaW5wdXRcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5nZXRBdHRyaWJ1dGUoXCJwbGFjZWhvbGRlclwiKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwidGV4dGFyZWFcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5nZXRBdHRyaWJ1dGUoXCJwbGFjZWhvbGRlclwiKVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtcmVxdWlyZWRcIjoge1xuICAgICAgICAgICAgXCJpbnB1dFwiOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlLmdldEF0dHJpYnV0ZShcInJlcXVpcmVkXCIpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJzZWxlY3RcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5nZXRBdHRyaWJ1dGUoXCJyZXF1aXJlZFwiKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwidGV4dGFyZWFcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5nZXRBdHRyaWJ1dGUoXCJyZXF1aXJlZFwiKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogdGhpcyBtZXRob2QgcmV0dXJucyB1c2VyLWRlZmluZWQgYXJpYSBhdHRyaWJ1dGUgbmFtZSBmcm9tIGRvbVxuICAgICAqIEBwYXJhbSBlbGUgIGVsZW1lbnRcbiAgICAgKiBAcmV0dXJucyB1c2VyIGRlZmluZWQgYXJpYSBhdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRVc2VyRGVmaW5lZEFyaWFBdHRyaWJ1dGVzKGVsZW0pIHtcbiAgICAgICAgbGV0IGFyaWFBdHRyaWJ1dGVzID0gW107XG4gICAgICAgIGxldCBkb21BdHRyaWJ1dGVzID0gZWxlbS5hdHRyaWJ1dGVzO1xuICAgICAgICBpZiAoZG9tQXR0cmlidXRlcykge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkb21BdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGF0dHJOYW1lID0gZG9tQXR0cmlidXRlc1tpXS5uYW1lLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIGxldCBpc0FyaWEgPSBhdHRyTmFtZS5zdWJzdHJpbmcoMCwgNSkgPT09ICdhcmlhLSc7XG4gICAgICAgICAgICAgICAgaWYgKGlzQXJpYSlcbiAgICAgICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZXMucHVzaChhdHRyTmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFyaWFBdHRyaWJ1dGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHRoaXMgbWV0aG9kIHJldHVybnMgdXNlci1kZWZpbmVkIGh0bWwgYXR0cmlidXRlIG5hbWUgZnJvbSBkb21cbiAgICAgKiBAcGFyYW0gZWxlICBlbGVtZW50XG4gICAgICogQHJldHVybnMgdXNlciBkZWZpbmVkIGh0bWwgYXR0cmlidXRlc1xuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0VXNlckRlZmluZWRIdG1sQXR0cmlidXRlcyhlbGVtKSB7XG4gICAgICAgIGxldCBodG1sQXR0cmlidXRlcyA9IFtdO1xuICAgICAgICBsZXQgZG9tQXR0cmlidXRlcyA9IGVsZW0uYXR0cmlidXRlcztcbiAgICAgICAgaWYgKGRvbUF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZG9tQXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBhdHRyTmFtZSA9IGRvbUF0dHJpYnV0ZXNbaV0ubmFtZS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBsZXQgaXNBcmlhID0gYXR0ck5hbWUuc3Vic3RyaW5nKDAsIDUpID09PSAnYXJpYS0nO1xuICAgICAgICAgICAgICAgIGlmICghaXNBcmlhKVxuICAgICAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlcy5wdXNoKGF0dHJOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaHRtbEF0dHJpYnV0ZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogdGhpcyBtZXRob2QgcmV0dXJucyB1c2VyLWRlZmluZWQgYXJpYSBhdHRyaWJ1dGUgbmFtZS12YWx1ZSBwYWlyIGZyb20gZG9tXG4gICAgICogQHBhcmFtIGVsZSAgZWxlbWVudFxuICAgICAqIEByZXR1cm5zIHVzZXIgZGVmaW5lZCBhcmlhIGF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldFVzZXJEZWZpbmVkQXJpYUF0dHJpYnV0ZU5hbWVWYWx1ZVBhaXJzKGVsZW0pIHtcbiAgICAgICAgbGV0IGFyaWFBdHRyaWJ1dGVzID0gW107XG4gICAgICAgIGxldCBkb21BdHRyaWJ1dGVzID0gZWxlbS5hdHRyaWJ1dGVzO1xuICAgICAgICBpZiAoZG9tQXR0cmlidXRlcykge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkb21BdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGF0dHJOYW1lID0gZG9tQXR0cmlidXRlc1tpXS5uYW1lLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIGxldCBhdHRyVmFsdWUgPSBlbGVtLmdldEF0dHJpYnV0ZShhdHRyTmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKGF0dHJWYWx1ZSA9PT0gJycpIGF0dHJWYWx1ZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgbGV0IGlzQXJpYSA9IGF0dHJOYW1lLnN1YnN0cmluZygwLCA1KSA9PT0gJ2FyaWEtJztcbiAgICAgICAgICAgICAgICBpZiAoaXNBcmlhKVxuICAgICAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlcy5wdXNoKHsgbmFtZTogYXR0ck5hbWUsIHZhbHVlOiBhdHRyVmFsdWUgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFyaWFBdHRyaWJ1dGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHRoaXMgbWV0aG9kIHJldHVybnMgdXNlci1kZWZpbmVkIGh0bWwgYXR0cmlidXRlIG5hbWUtdmFsdWUgcGFpciBmcm9tIGRvbVxuICAgICAqIEBwYXJhbSBlbGUgIGVsZW1lbnRcbiAgICAgKiBAcmV0dXJucyB1c2VyIGRlZmluZWQgaHRtbCBhdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRVc2VyRGVmaW5lZEh0bWxBdHRyaWJ1dGVOYW1lVmFsdWVQYWlycyhlbGVtKSB7XG4gICAgICAgIGxldCBodG1sQXR0cmlidXRlcyA9IFtdO1xuICAgICAgICBsZXQgZG9tQXR0cmlidXRlcyA9IGVsZW0uYXR0cmlidXRlcztcbiAgICAgICAgaWYgKGRvbUF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZG9tQXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBhdHRyTmFtZSA9IGRvbUF0dHJpYnV0ZXNbaV0ubmFtZS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBsZXQgYXR0clZhbHVlID0gZWxlbS5nZXRBdHRyaWJ1dGUoYXR0ck5hbWUpO1xuICAgICAgICAgICAgICAgIGlmIChhdHRyVmFsdWUgPT09ICcnKSBhdHRyVmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgICAgIGxldCBpc0FyaWEgPSBhdHRyTmFtZS5zdWJzdHJpbmcoMCwgNSkgPT09ICdhcmlhLSc7XG4gICAgICAgICAgICAgICAgaWYgKCFpc0FyaWEpXG4gICAgICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVzLnB1c2goeyBuYW1lOiBhdHRyTmFtZSwgdmFsdWU6IGF0dHJWYWx1ZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaHRtbEF0dHJpYnV0ZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaGFuZGxlcyBpbXBsaWNpdCBhcmlhIGRlZmluaXRpb25zLCBmb3IgZXhhbXBsZSwgYW4gaW5wdXQgd2l0aCBjaGVja2VkIGlzIGVxdWl2YWxlbnQgdG8gYXJpYS1jaGVja2VkPVwidHJ1ZVwiXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRBcmlhQXR0cmlidXRlKGVsZSwgYXR0cmlidXRlTmFtZSkge1xuICAgICAgICAvLyBJZiB0aGUgYXR0cmlidXRlIGlzIGRlZmluZWQsIGl0IHRha2VzIHByZWNlZGVuY2VcbiAgICAgICAgbGV0IHJldFZhbCA9IGVsZS5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7XG5cbiAgICAgICAgaWYgKGVsZS5oYXNBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSkgJiYgcmV0VmFsLnRyaW0oKSA9PT0gXCJcIikgeyAvL1wiXCIgaXMgdHJlYXRlZCBhcyBmYWxzZSwgc28gd2UgbmVlZCByZXR1cm4gaXQgYmVmb3JlIHRoZSBiZWxvdyBjaGVja1xuICAgICAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGVuIGRldGVybWluZSBpbXBsaWNpdCB2YWx1ZXMgZnJvbSBvdGhlciBhdHRyaWJ1dGVzXG4gICAgICAgIGlmICghcmV0VmFsKSB7XG4gICAgICAgICAgICBsZXQgdGFnID0gZWxlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBpZiAoYXR0cmlidXRlTmFtZSBpbiBBcmlhVXRpbC5hcmlhQXR0cmlidXRlSW1wbGljaXRNYXBwaW5ncykge1xuICAgICAgICAgICAgICAgIGlmICh0YWcgaW4gQXJpYVV0aWwuYXJpYUF0dHJpYnV0ZUltcGxpY2l0TWFwcGluZ3NbYXR0cmlidXRlTmFtZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gQXJpYVV0aWwuYXJpYUF0dHJpYnV0ZUltcGxpY2l0TWFwcGluZ3NbYXR0cmlidXRlTmFtZV1bdGFnXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiAocmV0VmFsKSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwgPSByZXRWYWwoZWxlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXCIqXCIgaW4gQXJpYVV0aWwuYXJpYUF0dHJpYnV0ZUltcGxpY2l0TWFwcGluZ3NbYXR0cmlidXRlTmFtZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gQXJpYVV0aWwuYXJpYUF0dHJpYnV0ZUltcGxpY2l0TWFwcGluZ3NbYXR0cmlidXRlTmFtZV1bXCIqXCJdO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIChyZXRWYWwpID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IHJldFZhbChlbGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgcm9sZS1iYXNlZCBkZWZhdWx0c1xuICAgICAgICBpZiAoIXJldFZhbCkge1xuICAgICAgICAgICAgbGV0IHJvbGUgPSBBUklBTWFwcGVyLm5vZGVUb1JvbGUoZWxlKTtcbiAgICAgICAgICAgIGlmIChyb2xlIGluIEFyaWFVdGlsLmFyaWFBdHRyaWJ1dGVSb2xlRGVmYXVsdHMgJiYgYXR0cmlidXRlTmFtZSBpbiBBcmlhVXRpbC5hcmlhQXR0cmlidXRlUm9sZURlZmF1bHRzW3JvbGVdKSB7XG4gICAgICAgICAgICAgICAgcmV0VmFsID0gQXJpYVV0aWwuYXJpYUF0dHJpYnV0ZVJvbGVEZWZhdWx0c1tyb2xlXVthdHRyaWJ1dGVOYW1lXTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIChyZXRWYWwpID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gcmV0VmFsKGVsZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3RpbGwgbm90IGRlZmluZWQ/IENoZWNrIGdsb2JhbCBkZWZhdWx0c1xuICAgICAgICBpZiAoIXJldFZhbCAmJiBhdHRyaWJ1dGVOYW1lIGluIEFyaWFVdGlsLmFyaWFBdHRyaWJ1dGVHbG9iYWxEZWZhdWx0cykge1xuICAgICAgICAgICAgcmV0VmFsID0gQXJpYVV0aWwuYXJpYUF0dHJpYnV0ZUdsb2JhbERlZmF1bHRzW2F0dHJpYnV0ZU5hbWVdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpc0RlZmluZWRBcmlhQXR0cmlidXRlKGVsZSwgYXR0ck5hbWUpIHtcbiAgICAgICAgbGV0IGlzRGVmaW5lZEFyaWFBdHRyaWJ1dGUgPSBmYWxzZTtcbiAgICAgICAgaWYgKGF0dHJOYW1lLnN1YnN0cmluZygwLCA1KSA9PT0gJ2FyaWEtJykge1xuICAgICAgICAgICAgLy8gVXNlciBhZ2VudHMgU0hPVUxEIHRyZWF0IHN0YXRlIGFuZCBwcm9wZXJ0eSBhdHRyaWJ1dGVzIHdpdGggYSB2YWx1ZSBvZiBcIlwiIHRoZSBzYW1lIGFzIHRoZXkgdHJlYXQgYW4gYWJzZW50IGF0dHJpYnV0ZS5cbiAgICAgICAgICAgIGlzRGVmaW5lZEFyaWFBdHRyaWJ1dGUgPSBlbGUuaGFzQXR0cmlidXRlICYmIGVsZS5oYXNBdHRyaWJ1dGUoYXR0ck5hbWUpICYmIGVsZS5nZXRBdHRyaWJ1dGUoYXR0ck5hbWUpLmxlbmd0aCA+IDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzRGVmaW5lZEFyaWFBdHRyaWJ1dGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV0FJLUFSSUHigJlzIHJvbGUgYXR0cmlidXRlIG1heSBoYXZlIGEgbGlzdCBvZiB2YWx1ZXMsIGJ1dCBvbmx5IHRoZSBmaXJzdCB2YWxpZCBhbmQgc3VwcG9ydGVkIFdBSS1BUklBIHJvbGUgaXMgdXNlZFxuICAgICAqIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93YWktYXJpYS1pbXBsZW1lbnRhdGlvbi8jbWFwcGluZ19yb2xlX3RhYmxlXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgcmV0cmlldmluZyB0aGUgcmVzb2xlZCByb2xlIGZvciBhbiBlbGVtZW50LlxuICAgICAqIEBwYXJtIHtIVE1MRWxlbWVudH0gZWxlIC0gZWxlbWVudCBmb3Igd2hpY2ggdG8gZmluZCByb2xlLlxuICAgICAqXG4gICAgICogQHJldHVybiBzdHJpbmcgLSByZXNvbHZlZCByb2xlIGZvciB0aGUgZWxlbWVudDpcbiAgICAgKiAgICAgICBleHBsaWNpdCByb2xlOiByZXNvbGVkIGZyb20gdGhlIGxpc3Qgb2YgdmFsdWVzXG4gICAgICogICAgICAgaW1wbGljaXQgcm9sZTogaWYgbm90IGV4cGxpY2l0ZWx5IHNwZWNpZmllZCwgb3Igbm9uZSBvZiB0aGUgc3BlY2lmaWVkIHJvbGUgdmFsdWVzIGlzIGFsbG93ZWQgZm9yIHRoZSBlbGVtZW50XG4gICAgICogICAgICAgbnVsbDogaWYgbm9uZSBvZiB0aGUgc3BlY2lmaWVkIHJvbGUgdmFsdWVzIGlzIGFsbG93ZWQgZm9yIHRoZSBlbGVtZW50LCBuZWl0aGVyIGltcGxpY2l0IHJvbGUgZXhpc3RzXG4gICAgICogICAgICAgXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRSZXNvbHZlZFJvbGUoZWxlbTogRWxlbWVudCwgY29uc2lkZXJJbXBsaWNpdFJvbGVzOiBib29sZWFuID0gdHJ1ZSk6IHN0cmluZyB7XG4gICAgICAgIGlmICghZWxlbSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCByb2xlID0gQ2FjaGVVdGlsLmdldENhY2hlKGVsZW0sIFwiUlBUVVRJTF9FTEVNRU5UX1JFU09MVkVEX1JPTEVcIiwgbnVsbCk7XG4gICAgICAgIGlmIChyb2xlID09PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCByb2xlcyA9IEFyaWFVdGlsLmdldFVzZXJEZWZpbmVkUm9sZXMoZWxlbSk7IFxuICAgICAgICAgICAgbGV0IHRhZ1Byb3BlcnR5ID0gQXJpYVV0aWwuZ2V0RWxlbWVudEFyaWFQcm9wZXJ0eShlbGVtKTtcbiAgICAgICAgICAgIGxldCBhbGxvd2VkUm9sZXMgPSBBcmlhVXRpbC5nZXRBbGxvd2VkQXJpYVJvbGVzKGVsZW0sIHRhZ1Byb3BlcnR5KTtcbiAgICAgICAgICAgIGxldCBjb250YWluc0dlbmVyaWMgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChyb2xlcyAmJiByb2xlcy5sZW5ndGggPiAwICYmIGFsbG93ZWRSb2xlcyAmJiBhbGxvd2VkUm9sZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm9sZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFsbG93ZWRSb2xlcy5pbmNsdWRlcyhcImFueVwiKSB8fCBhbGxvd2VkUm9sZXMuaW5jbHVkZXMocm9sZXNbaV0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWxsb3dlZFJvbGVzLmluY2x1ZGVzKFwiYW55XCIpICYmIHJvbGVzW2ldID09PSAnZ2VuZXJpYycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluc0dlbmVyaWMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICByb2xlID0gcm9sZXNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocm9sZSA9PT0gXCJwcmVzZW50YXRpb25cIiB8fCByb2xlID09PSBcIm5vbmVcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGVsZW1lbnQgaXMgZm9jdXNhYmxlLCB0aGVuIHByZXNlbnRhdGlvbiByb2xlcyBhcmUgdG8gYmUgaWdub3JlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDb21tb25VdGlsLmlzRm9jdXNhYmxlKGVsZW0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcmVzZXQgcnVsZSB0byBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGUgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY29udGFpbnNHZW5lcmljKSByb2xlID0gJ2dlbmVyaWMnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAocm9sZSA9PT0gbnVsbCAmJiBjb25zaWRlckltcGxpY2l0Um9sZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbXBsaWNpdFJvbGUgPSBBcmlhVXRpbC5nZXRJbXBsaWNpdFJvbGUoZWxlbSk7XG4gICAgICAgICAgICAgICAgcm9sZSA9IGltcGxpY2l0Um9sZSAmJiBpbXBsaWNpdFJvbGUubGVuZ3RoID4gMCA/IGltcGxpY2l0Um9sZVswXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlJQVFVUSUxfRUxFTUVOVF9SRVNPTFZFRF9ST0xFXCIsIHJvbGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByb2xlICE9PSB1bmRlZmluZWQgPyByb2xlIDogbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciByZXRyaWV2aW5nIHVzZXIgZGVmaW5lZCBlbGVtZW50J3Mgcm9sZXMgZnJvbSBkb20uXG4gICAgICogQHBhcm0ge0hUTUxFbGVtZW50fSBlbGUgLSBlbGVtZW50IGZvciB3aGljaCB0byBmaW5kIHJvbGUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtMaXN0fSByb2xlcyAtIGxpc3Qgb2YgdXNlciBkZWZpbmVkIHJvbGVzIGluIHRoZSBlbGVtZW50IHJvbGUgYXR0cmlidXRlLlxuICAgICAqXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRVc2VyRGVmaW5lZFJvbGVzKGVsZTogRWxlbWVudCk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIEFyaWFVdGlsLmdldFJvbGVzKGVsZSwgZmFsc2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIHJldHJpZXZpbmcgZWxlbWVudCdzIHJvbGVzLlxuICAgICAqIFRoaXMgZnVuY3Rpb24gYWxzbyBmaW5kcyBpbXBsaWNpdCByb2xlcy5cbiAgICAgKiBAcGFybSB7SFRNTEVsZW1lbnR9IGVsZSAtIGVsZW1lbnQgZm9yIHdoaWNoIHRvIGZpbmQgcm9sZS5cbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJJbXBsaWNpdFJvbGVzIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBpbXBsaWNpdCByb2xlcyBzZXR0aW5nIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAqXG4gICAgICogQHJldHVybiB7TGlzdH0gcm9sZXMgLSBsaXN0IG9mIGF0dHJpYnV0ZSByb2xlcyBhbmQgaW1wbGljaXQgcm9sZXMuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldFJvbGVzKGVsZTogRWxlbWVudCwgY29uc2lkZXJJbXBsaWNpdFJvbGVzOiBib29sZWFuKTogc3RyaW5nW10ge1xuICAgICAgICBsZXQgcm9sZXM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGlmIChlbGUgJiYgZWxlLmhhc0F0dHJpYnV0ZSAmJiBlbGUuaGFzQXR0cmlidXRlKFwicm9sZVwiKSkge1xuICAgICAgICAgICAgbGV0IGF0dHJSb2xlcyA9IENvbW1vblV0aWwubm9ybWFsaXplU3BhY2luZyhlbGUuZ2V0QXR0cmlidXRlKFwicm9sZVwiKS50cmltKCkpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXR0clJvbGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgcm9sZXMucHVzaChhdHRyUm9sZXNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy9jaGVjayBpZiBpbXBsaWNpdCByb2xlcyBleGlzdC5cbiAgICAgICAgLy9Ob3RlOiBlbGVtZW50IGNhbiBoYXZlIG11bHRpcGxlIGltcGxpY2l0IHJvbGVzXG4gICAgICAgIGlmIChjb25zaWRlckltcGxpY2l0Um9sZXMpIHtcbiAgICAgICAgICAgIGxldCBpbXBsaWNpdFJvbGUgPSBBcmlhVXRpbC5nZXRJbXBsaWNpdFJvbGUoZWxlKTtcbiAgICAgICAgICAgIGlmIChpbXBsaWNpdFJvbGUgIT09IG51bGwgJiYgaW1wbGljaXRSb2xlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAvL2FkZCBpbXBsaWNpdCByb2xlcyB0byB0aGUgYXR0cmlidXRlcyByb2xlcy5cbiAgICAgICAgICAgICAgICBDb21tb25VdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QoaW1wbGljaXRSb2xlLCByb2xlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJvbGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGltcGxpY2l0IHJvbGUgb2YgdGhlIGVsZW1lbWVudFxuICAgICAqIEBwYXJtIHtIVE1MRWxlbWVudH0gZWxlIC0gZWxlbWVudCBmb3Igd2hpY2ggdG8gZmluZCByb2xlLlxuICAgICAqXG4gICAgICogQHJldHVybiB0aGUgaW1wbGljaXQgcm9sZSBvciBbXSBpZiBkb2Vzbid0IGV4aXN0XG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEltcGxpY2l0Um9sZShlbGUpOiBzdHJpbmdbXSB7XG4gICAgICAgIGlmICghZWxlIHx8IGVsZS5ub2RlVHlwZSAhPT0gMSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBpbXBsaWNpdFJvbGVzOiBzdHJpbmdbXSA9IENhY2hlVXRpbC5nZXRDYWNoZShlbGUsIFwiQXJpYVV0aWxfSW1wbGljaXRSb2xlXCIsIG51bGwpO1xuICAgICAgICBpZiAoIWltcGxpY2l0Um9sZXMpIHtcbiAgICAgICAgICAgIGxldCB0YWdQcm9wZXJ0eSA9IEFyaWFVdGlsLmdldEVsZW1lbnRBcmlhUHJvcGVydHkoZWxlKTtcbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZXJlIGFyZSBhbnkgaW1wbGljaXQgcm9sZXMgZm9yIHRoaXMgZWxlbWVudC5cbiAgICAgICAgICAgIGlmICh0YWdQcm9wZXJ0eSAmJiB0YWdQcm9wZXJ0eS5pbXBsaWNpdFJvbGUpIHtcbiAgICAgICAgICAgICAgICBpZiAodGFnUHJvcGVydHkuaW1wbGljaXRSb2xlLmluY2x1ZGVzKFwiZ2VuZXJpY1wiKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgJ2dlbmVyaWMnIHJvbGUgaXMgb25seSBhbGxvd2VkIGlmIGEgdmFsaWQgYXJpYSBhdHRyaWJ1dGUgZXhpc3RzLlxuICAgICAgICAgICAgICAgICAgICBsZXQgZG9tQXJpYUF0dHJpYnV0ZXMgPSBBcmlhVXRpbC5nZXRVc2VyRGVmaW5lZEFyaWFBdHRyaWJ1dGVzKGVsZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkb21BcmlhQXR0cmlidXRlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGUsIFwiQXJpYVV0aWxfSW1wbGljaXRSb2xlXCIsIFtdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZXQgcm9sZUF0dHJpYnV0ZXMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBhdHRlcm4gPSBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNbJ2dlbmVyaWMnXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhdHRlcm4ucmVxUHJvcHMgJiYgcGF0dGVybi5yZXFQcm9wcy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KHBhdHRlcm4ucmVxUHJvcHMsIHJvbGVBdHRyaWJ1dGVzKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnUHJvcGVydHkuZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZClcbiAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdChBUklBRGVmaW5pdGlvbnMuZ2xvYmFsUHJvcGVydGllcywgcm9sZUF0dHJpYnV0ZXMpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXR0ZXJuLmRlcHJlY2F0ZWRQcm9wcyAmJiBwYXR0ZXJuLmRlcHJlY2F0ZWRQcm9wcy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5yZWR1Y2VBcnJheUl0ZW1MaXN0KHBhdHRlcm4uZGVwcmVjYXRlZFByb3BzLCByb2xlQXR0cmlidXRlcyk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlICdnZW5lcmljJyByb2xlIGlmIHJvbGVBdHRyaWJ1dGVzIGRvZXNuJ3QgY29udGFpbiBhbnkgb2YgZG9tQXJpYUF0dHJpYnV0ZXMgXG4gICAgICAgICAgICAgICAgICAgIGlmIChyb2xlQXR0cmlidXRlcy5sZW5ndGggPiAwICYmICFyb2xlQXR0cmlidXRlcy5zb21lKGF0dHIgPT4gZG9tQXJpYUF0dHJpYnV0ZXMuaW5jbHVkZXMoYXR0cikpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW1wbGljaXQgPSBDb21tb25VdGlsLnJlZHVjZUFycmF5SXRlbUxpc3QoWydnZW5lcmljJ10sIHRhZ1Byb3BlcnR5LmltcGxpY2l0Um9sZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlLCBcIkFyaWFVdGlsX0ltcGxpY2l0Um9sZVwiLCBpbXBsaWNpdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW1wbGljaXQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZSwgXCJBcmlhVXRpbF9JbXBsaWNpdFJvbGVcIiwgdGFnUHJvcGVydHkuaW1wbGljaXRSb2xlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGFnUHJvcGVydHkuaW1wbGljaXRSb2xlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZSwgXCJBcmlhVXRpbF9JbXBsaWNpdFJvbGVcIiwgW10pO1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbXBsaWNpdFJvbGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHJlcXVpcmVkIHByb3BlcnRpZXMgb2YgdGhlIHJvbGVcbiAgICAgKiBAcGFybSB7c3RyaW5nfSByb2xlIC0gdGhlIHJvbGVcbiAgICAgKiBAcGFybSB7SFRNTEVsZW1lbnR9IGVsZSAtIGVsZW1lbnQgZm9yIHdoaWNoIHRvIGZpbmQgcm9sZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0xpc3R9IHByb3BlcnRpZXMgLSBsaXN0IG9mIHByb3BlcnRpZXMgdGhhdCBhcmUgcmVxdWlyZWQgYnkgdGhlIHJvbGVcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Um9sZVJlcXVpcmVkUHJvcGVydGllcyhyb2xlLCBlbGUpIHtcbiAgICAgICAgaWYgKHJvbGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlXSkge1xuICAgICAgICAgICAgbGV0IHJlcXVpcmVkQXR0cmlidXRlcyA9IEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlXS5yZXFQcm9wcztcbiAgICAgICAgICAgIC8vIGhhbmRsZSBzcGVjaWFsIGNhc2Ugb2Ygc2VwYXJhdG9yXG4gICAgICAgICAgICBpZiAocm9sZS50b0xvd2VyQ2FzZSgpID09PSBcInNlcGFyYXRvclwiICYmIGVsZSAmJiBDb21tb25VdGlsLmlzRm9jdXNhYmxlKGVsZSkpIHtcbiAgICAgICAgICAgICAgICByZXF1aXJlZEF0dHJpYnV0ZXMgPSBDb21tb25VdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QoW1wiYXJpYS12YWx1ZW5vd1wiXSwgcmVxdWlyZWRBdHRyaWJ1dGVzIHx8IFtdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXF1aXJlZEF0dHJpYnV0ZXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGZpbmRpbmcgaWYgYSBlbGVtZW50IGhhcyBnaXZlbiByb2xlLlxuICAgICAqIFRoaXMgZnVuY3Rpb24gYXNsbyBmaW5kcyBpZiBlbGVtZW50IGhhcyBnaXZlbiByb2xlcyBhcyBpbXBsaWNpdCByb2xlLlxuICAgICAqIEBwYXJtIHtIVE1MRWxlbWVudH0gZWxlIC0gZWxlbWVudCBmb3Igd2hpY2ggdG8gZmluZCByb2xlLlxuICAgICAqIEBwYXJtIHtsaXN0IG9yIHN0cmluZ30gcm9sZXMgLSBMaXN0IG9yIHNpbmdsZSByb2xlIGZvciB3aGljaCB0byBmaW5kIGlmIGVsZW1lbnQgaGFzIHRoZXNlIHJvbGVzLlxuICAgICAqIEBwYXJtIHtib29sfSBjb25zaWRlckltcGxpY2l0Um9sZXMgLSB0cnVlIG9yIGZhbHNlIGJhc2VkIG9uIGlmIGltcGxpY2l0IHJvbGVzIHNldHRpbmcgc2hvdWxkIGJlIGNvbnNpZGVyZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtMaXN0fSByZXRWYWwgLSB0cnVlIG9yIGZhbHNlIGJhc2VkIG9uIGlmIHRoIGVsZW1lbnQgaGFzIHRoZSBzcGVjaWZpZWQgcm9sZS5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqXG4gICAgICogQ29uc2lkZXIgdG8gdXNlIGhhc1JvbGVJblNlbWFudGljcygpIGluc3RlYWQuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBoYXNSb2xlKGVsZSwgcm9sZSwgY29uc2lkZXJJbXBsaWNpdFJvbGVzPykgeyAgLy9Db25zaWRlciB0byB1c2UgaGFzUm9sZUluU2VtYW50aWNzKCkgaW5zdGVhZC5cbiAgICAgICAgbGV0IHJldFZhbCA9IGZhbHNlO1xuICAgICAgICBpZiAoZWxlICYmIGVsZS5oYXNBdHRyaWJ1dGUgJiYgZWxlLmhhc0F0dHJpYnV0ZShcInJvbGVcIikpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgKHJvbGUpICE9IHR5cGVvZiAoXCJcIikpIHtcbiAgICAgICAgICAgICAgICBsZXQgcm9sZXMgPSBlbGUuZ2V0QXR0cmlidXRlKFwicm9sZVwiKS50cmltKCkuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyAhcmV0VmFsICYmIGkgPCByb2xlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICByZXRWYWwgPSByb2xlc1tpXSBpbiByb2xlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHJvbGVzID0gZWxlLmdldEF0dHJpYnV0ZShcInJvbGVcIikudHJpbSgpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgIXJldFZhbCAmJiBpIDwgcm9sZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gcm9sZXNbaV0gPT09IHJvbGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vaWYgbm9uZSBvZiB0aGUgdGhlIGF0dHJpYnV0ZSByb2xlcyBtYXRjaGVkIHdpdGggZ2l2ZW4gcm9sZVxuICAgICAgICAvL2NoZWNrIGlmIGltcGxpY2l0IHJvbGVzIG1hdGNoZXMuXG4gICAgICAgIC8vTm90ZTogZWxlbWVudCBjYW4gaGF2ZSBtdWx0aXBsZSBpbXBsaWNpdCByb2xlc1xuICAgICAgICBpZiAoIXJldFZhbCAmJiBjb25zaWRlckltcGxpY2l0Um9sZXMpIHtcbiAgICAgICAgICAgIGxldCB3Um9sZXMgPSBbXTtcbiAgICAgICAgICAgIC8vY2hlY2sgaWYgdGhlcmUgYXJlIGFueSBpbXBsaWNpdCByb2xlcyBmb3IgdGhpcyBlbGVtZW50LlxuICAgICAgICAgICAgbGV0IGltcGxpY2l0Um9sZSA9IEFyaWFVdGlsLmdldEltcGxpY2l0Um9sZShlbGUpO1xuICAgICAgICAgICAgaWYgKGltcGxpY2l0Um9sZSAhPT0gbnVsbCAmJiBpbXBsaWNpdFJvbGUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIENvbW1vblV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdChpbXBsaWNpdFJvbGUsIHdSb2xlcyk7XG4gICAgICAgICAgICAgICAgLy9pZiByb2xlIGlzIGFycmF5IGxvb3AgdGhydSBhbmQgc2VlIGlmIGFueSAgb2YgdGhlIGltcGxpY2l0IHJvbGUgcHJlc2VudCBpbiB0aGUgYXJyYXlcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIChyb2xlKSAhPSB0eXBlb2YgKFwiXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyAhcmV0VmFsICYmIGkgPCB3Um9sZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IHdSb2xlc1tpXSBpbiByb2xlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7ICFyZXRWYWwgJiYgaSA8IHdSb2xlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gd1JvbGVzW2ldID09PSByb2xlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSBlbGVtZW50IGhhcyB0aGUgcm9sZSwgaW5jbHVkaW5nIHRoZSBpbXBsaWVkIHJvbGUgaWYgcm9sZSBpcyBub3QgZXhwbGljaXRseSBzcGVjaWZpZWQuXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlcGxhY2luZyB0aGUgaGFzUm9sZSBmdW5jdGlvblxuICAgICAqXG4gICAgICogQHBhcm0ge0hUTUxFbGVtZW50fSBlbGUgLSBlbGVtZW50IGZvciB3aGljaCB0byBmaW5kIHJvbGUuXG4gICAgICogQHBhcm0ge2xpc3Qgb3Igc3RyaW5nfSByb2xlcyAtIExpc3Qgb3Igc2luZ2xlIHJvbGUgZm9yIHdoaWNoIHRvIGZpbmQgaWYgZWxlbWVudCBoYXMgdGhlc2Ugcm9sZXMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtMaXN0fSByZXRWYWwgLSB0cnVlIG9yIGZhbHNlIGJhc2VkIG9uIGlmIHRoZSBlbGVtZW50IGhhcyB0aGUgc3BlY2lmaWVkIHJvbGUuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGhhc1JvbGVJblNlbWFudGljcyhlbGUsIHJvbGUpIHtcbiAgICAgICAgbGV0IHJldFZhbCA9IGZhbHNlO1xuICAgICAgICBsZXQgcm9sZVNwZWNpZmllZCA9IGZhbHNlO1xuICAgICAgICBpZiAoZWxlICYmIGVsZS5oYXNBdHRyaWJ1dGUgJiYgZWxlLmhhc0F0dHJpYnV0ZShcInJvbGVcIikpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgKHJvbGUpICE9IHR5cGVvZiAoXCJcIikpIHtcbiAgICAgICAgICAgICAgICBsZXQgcm9sZXMgPSBlbGUuZ2V0QXR0cmlidXRlKFwicm9sZVwiKS50cmltKCkudG9Mb3dlckNhc2UoKS5zcGxpdCgvXFxzKy8pO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyAhcmV0VmFsICYmIGkgPCByb2xlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICByb2xlU3BlY2lmaWVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gcm9sZXNbaV0gaW4gcm9sZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCByb2xlcyA9IGVsZS5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpLnNwbGl0KC9cXHMrLyk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7ICFyZXRWYWwgJiYgaSA8IHJvbGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJvbGVTcGVjaWZpZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZXRWYWwgPSByb2xlc1tpXSA9PT0gcm9sZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocm9sZVNwZWNpZmllZCkge1xuICAgICAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vY2hlY2sgaWYgaW1wbGljaXQgcm9sZXMgbWF0Y2hlcy5cbiAgICAgICAgLy9Ob3RlOiBlbGVtZW50IGNhbiBoYXZlIG11bHRpcGxlIGltcGxpY2l0IHJvbGVzXG4gICAgICAgIC8vY2hlY2sgaWYgdGhlcmUgYXJlIGFueSBpbXBsaWNpdCByb2xlcyBmb3IgdGhpcyBlbGVtZW50LlxuICAgICAgICBsZXQgaW1wUm9sZXMgPSBBcmlhVXRpbC5nZXRJbXBsaWNpdFJvbGUoZWxlKTtcbiAgICAgICAgaWYgKGltcFJvbGVzICE9PSBudWxsICYmIGltcFJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vaWYgcm9sZSBpcyBhcnJheSBsb29wIHRocnUgYW5kIHNlZSBpZiBhbnkgIG9mIHRoZSBpbXBsaWNpdCByb2xlIHByZXNlbnQgaW4gdGhlIGFycmF5XG4gICAgICAgICAgICBpZiAodHlwZW9mIChyb2xlKSAhPSB0eXBlb2YgKFwiXCIpKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7ICFyZXRWYWwgJiYgaSA8IGltcFJvbGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IGltcFJvbGVzW2ldIGluIHJvbGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgIXJldFZhbCAmJiBpIDwgaW1wUm9sZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gaW1wUm9sZXNbaV0gPT09IHJvbGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZmluZGluZyBpZiBhIGVsZW1lbnQgaGFzIGdpdmVuIHJvbGUuXG4gICAgICogVGhpcyBmdW5jdGlvbiBhbHNvIGNoZWNrcyBpZiBlbGVtZW50IGhhcyBnaXZlbiByb2xlcyBhcyBpbXBsaWNpdCByb2xlcy5cbiAgICAgKiBAcGFybSB7SFRNTEVsZW1lbnR9IGVsZSAtIGVsZW1lbnQgZm9yIHdoaWNoIHRvIGZpbmQgcm9sZS5cbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJJbXBsaWNpdFJvbGVzIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBpbXBsaWNpdCByb2xlcyBzZXR0aW5nIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAqXG4gICAgICogQHJldHVybiB7Ym9vbH0gcmV0VmFsIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiB0aGUgZWxlbWVudCBoYXMgdGhlIHNwZWNpZmllZCByb2xlLlxuICAgICAqXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBoYXNBbnlSb2xlKGVsZSwgY29uc2lkZXJJbXBsaWNpdFJvbGVzKSB7XG4gICAgICAgIGxldCByZXRWYWwgPSBmYWxzZTtcbiAgICAgICAgaWYgKGVsZSAmJiBlbGUuaGFzQXR0cmlidXRlICYmIGVsZS5oYXNBdHRyaWJ1dGUoXCJyb2xlXCIpKSB7XG4gICAgICAgICAgICByZXRWYWwgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9jaGVjayBpZiBpbXBsaWNpdCByb2xlcyBleGlzdC5cbiAgICAgICAgLy9Ob3RlOiBlbGVtZW50IGNhbiBoYXZlIG11bHRpcGxlIGltcGxpY2l0IHJvbGVzXG4gICAgICAgIGlmICghcmV0VmFsICYmIGNvbnNpZGVySW1wbGljaXRSb2xlcykge1xuICAgICAgICAgICAgLy9jaGVjayBpZiB0aGVyZSBhcmUgYW55IGltcGxpY2l0IHJvbGVzIGZvciB0aGlzIGVsZW1lbnQuXG4gICAgICAgICAgICBsZXQgaW1wUm9sZXMgPSBBcmlhVXRpbC5nZXRJbXBsaWNpdFJvbGUoZWxlKTtcbiAgICAgICAgICAgIGlmIChpbXBSb2xlcyAhPT0gbnVsbCAmJiBpbXBSb2xlcy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgIHJldFZhbCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGlzUHJlc2VudGF0aW9uYWxFbGVtZW50KG5vZGUpIHtcbiAgICAgICAgLy8gRWxlbWVudHMgZXh0cmFjdGVkIGZyb20gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vZG9jcy9XZWIvSFRNTC9FbGVtZW50I0lubGluZV90ZXh0X3NlbWFudGljcyxcbiAgICAgICAgLy8gaHR0cDovL2Rldi53My5vcmcvaHRtbDUvaHRtbC1hdXRob3IvI3RleHQtbGV2ZWwtc2VtYW50aWNzIGFuZCBodHRwczovL3dpa2kud2hhdHdnLm9yZy93aWtpL1ByZXNlbnRhdGlvbmFsX2VsZW1lbnRzX2FuZF9hdHRyaWJ1dGVzXG4gICAgICAgIGxldCBwcmVzZW50YXRpb25hbEVsZW1lbnRzID0gW1wiYWJiclwiLCBcImJcIiwgXCJiZGlcIiwgXCJiZG9cIiwgXCJiclwiLCBcImNpdGVcIiwgXCJjb2RlXCIsIFwiZGF0YVwiLCBcImRmblwiLFxuICAgICAgICAgICAgXCJlbVwiLCBcImlcIiwgXCJrYmRcIiwgXCJtYXJrXCIsIFwicVwiLCBcInJwXCIsIFwicnRcIiwgXCJydGNcIiwgXCJydWJ5XCIsIFwic1wiLFxuICAgICAgICAgICAgXCJzYW1wXCIsIFwic21hbGxcIiwgXCJzcGFuXCIsIFwic3Ryb25nXCIsIFwic3ViXCIsIFwic3VwXCIsIFwidGltZVwiLCBcInVcIixcbiAgICAgICAgICAgIFwidmFyXCIsIFwid2JyXCIsIFwiYVwiLCBcInByb2dyZXNzXCIsIFwibWV0ZXJcIiwgXCJiYXNlZm9udFwiLCBcImJpZ1wiLCBcImNlbnRlclwiLFxuICAgICAgICAgICAgXCJzdHJpa2VcIiwgXCJ0dFwiLCBcImZvbnRcIiwgXCJibGlua1wiLCBcImgxXCIsIFwiaDJcIiwgXCJoM1wiLCBcImg0XCIsIFwiaDVcIiwgXCJoNlwiLFxuICAgICAgICAgICAgXCJoclwiLCBcImJsb2NrcXVvdGVcIiwgXCJwXCJcbiAgICAgICAgXTtcbiAgICAgICAgcmV0dXJuIENvbW1vblV0aWwudmFsSW5BcnJheShub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksIHByZXNlbnRhdGlvbmFsRWxlbWVudHMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHJldHVybiB0aGUgYW5jZXN0b3Igb2YgdGhlIGdpdmVuIGVsZW1lbnQgYW5kIHJvbGUuXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gZWxlbWVudCAtIFRoZSBlbGVtZW50IHRvIHN0YXJ0IHRoZSBub2RlIHdhbGsgb24gdG8gZmluZCBwYXJlbnQgbm9kZVxuICAgICAqIEBwYXJtIHtzdHJpbmd9IHJvbGUgLSBUaGUgcm9sZSB0byBzZWFyY2ggZm9yIG9uIGFuIGVsZW1lbnQgdW5kZXIgdGhlIHByb3ZpZGVkIGVsZW1lbnRcbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJJbXBsaWNpdFJvbGVzIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBpbXBsaWNpdCByb2xlcyBzZXR0aW5nIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAqXG4gICAgICogQHJldHVybiB7bm9kZX0gd2Fsa05vZGUgLSBBIHBhcmVudCBub2RlIG9mIHRoZSBlbGVtZW50IHBhc3NlZCBpbiwgd2hpY2ggaGFzIHRoZSBwcm92aWRlZCByb2xlXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEFuY2VzdG9yV2l0aFJvbGUoZWxlbWVudCwgcm9sZU5hbWUsIGNvbnNpZGVySW1wbGljaXRSb2xlcz8pIHtcbiAgICAgICAgbGV0IHdhbGtOb2RlID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUoZWxlbWVudCk7XG4gICAgICAgIHdoaWxlICh3YWxrTm9kZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGNvbnNpZGVySW1wbGljaXRSb2xlcykge1xuICAgICAgICAgICAgICAgIGlmIChBcmlhVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3Mod2Fsa05vZGUsIHJvbGVOYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChBcmlhVXRpbC5oYXNSb2xlKHdhbGtOb2RlLCByb2xlTmFtZSwgZmFsc2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdhbGtOb2RlID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUod2Fsa05vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3YWxrTm9kZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiByZXR1cm4gdGhlIGFuY2VzdG9yIG9mIHRoZSBnaXZlbiBlbGVtZW50IGFuZCByb2xlcy5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBlbGVtZW50IC0gVGhlIGVsZW1lbnQgdG8gc3RhcnQgdGhlIG5vZGUgd2FsayBvbiB0byBmaW5kIHBhcmVudCBub2RlXG4gICAgICogQHBhcm0ge2FycmF5fSByb2xlcyAtIHRoZSByb2xlIG5hbWVzIHRvIHNlYXJjaCBmb3JcbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJJbXBsaWNpdFJvbGVzIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBpbXBsaWNpdCByb2xlcyBzZXR0aW5nIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAqXG4gICAgICogQHJldHVybiB7bm9kZX0gd2Fsa05vZGUgLSBBIHBhcmVudCBub2RlIG9mIHRoZSBlbGVtZW50IHBhc3NlZCBpbiwgd2hpY2ggaGFzIHRoZSBwcm92aWRlZCByb2xlXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEFuY2VzdG9yV2l0aFJvbGVzKGVsZW1lbnQsIHJvbGVOYW1lcykge1xuICAgICAgICBpZiAoIWVsZW1lbnQgfHwgIXJvbGVOYW1lcyB8fCAhcm9sZU5hbWVzLmxlbmd0aCB8fCByb2xlTmFtZXMubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IHdhbGtOb2RlID0gZWxlbWVudDtcbiAgICAgICAgd2hpbGUgKHdhbGtOb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgcm9sZSA9IEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZSh3YWxrTm9kZSk7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgcm9sZSAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICAgICAgcm9sZU5hbWVzLmluY2x1ZGVzKHJvbGUpIHx8XG4gICAgICAgICAgICAgICAgICAgIChyb2xlTmFtZXMuaW5jbHVkZXMoXCIqXCIpICYmICFbXCJwcmVzZW50YXRpb25cIiwgXCJub25lXCJdLmluY2x1ZGVzKHJvbGUpKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIHJldHVybiB3YWxrTm9kZTtcbiAgICAgICAgICAgIHdhbGtOb2RlID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUod2Fsa05vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHJldHVybiB0aGUgcm9sZXMgd2l0aCBnaXZlbiByb2xlIHR5cGUuXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gZWxlbWVudCAtIFRoZSBlbGVtZW50IHRvIHN0YXJ0IHRoZSBub2RlIHdhbGsgb24gdG8gZmluZCBwYXJlbnQgbm9kZVxuICAgICAqIEBwYXJtIHthcnJheX0gcm9sZVR5cGxlcyAtIHJvbGUgdHlwZXMsIHN1Y2ggYXMgJ3dpZGdldCcsICdzdHJ1Y3R1cmUnIGV0Yy5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge2FycmF5fSByb2xlcyAtIEEgcGFyZW50IG5vZGUgb2YgdGhlIGVsZW1lbnQgcGFzc2VkIGluLCB3aGljaCBoYXMgdGhlIHByb3ZpZGVkIHJvbGVcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Um9sZXNXaXRoVHlwZXMoZWxlbWVudCwgdHlwZXM6IHN0cmluZ1tdKSB7XG4gICAgICAgIGlmICghZWxlbWVudCB8fCAhdHlwZXMgfHwgIXR5cGVzLmxlbmd0aCB8fCB0eXBlcy5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCByb2xlcyA9IENhY2hlVXRpbC5nZXRDYWNoZShlbGVtZW50Lm93bmVyRG9jdW1lbnQsIFwicm9sZXNfd2l0aF9naXZlbl90eXBlc1wiLCBudWxsKTtcbiAgICAgICAgaWYgKCFyb2xlcyB8fCByb2xlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJvbGVzID0gW107XG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyhBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnMpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlcy5pbmNsdWRlcyh2YWx1ZS5yb2xlVHlwZSkpXG4gICAgICAgICAgICAgICAgICAgIHJvbGVzLnB1c2goa2V5KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW1lbnQub3duZXJEb2N1bWVudCwgXCJyb2xlc193aXRoX2dpdmVuX3R5cGVzXCIsIHJvbGVzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcm9sZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcmV0dXJuIHRoZSByb2xlcyB3aXRoIGdpdmVuIHJvbGUgdHlwZS5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBlbGVtZW50IC0gVGhlIGVsZW1lbnQgdG8gc3RhcnQgdGhlIG5vZGUgd2FsayBvbiB0byBmaW5kIHBhcmVudCBub2RlXG4gICAgICogQHBhcm0ge2FycmF5fSByb2xlVHlwbGVzIC0gcm9sZSB0eXBlcywgc3VjaCBhcyAnd2lkZ2V0JywgJ3N0cnVjdHVyZScgZXRjLlxuICAgICAqXG4gICAgICogQHJldHVybiB7YXJyYXl9IHJvbGVzIC0gQSBwYXJlbnQgbm9kZSBvZiB0aGUgZWxlbWVudCBwYXNzZWQgaW4sIHdoaWNoIGhhcyB0aGUgcHJvdmlkZWQgcm9sZVxuICAgICAqXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpc1dpZGdldChlbGVtZW50KSB7XG4gICAgICAgIGlmICghZWxlbWVudCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IHdpZGdldCA9IENhY2hlVXRpbC5nZXRDYWNoZShlbGVtZW50Lm93bmVyRG9jdW1lbnQsIFwiaXNfZWxlbWVudF93aWRnZXRcIiwgbnVsbCk7XG4gICAgICAgIGlmICh3aWRnZXQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIGxldCByZXQgPSBmYWxzZTtcbiAgICAgICAgICAgIGNvbnN0IHJvbGUgPSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUoZWxlbWVudCk7IFxuICAgICAgICAgICAgaWYgKHJvbGUgJiYgQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVdICYmIEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlXS5yb2xlVHlwZSA9PT0gJ3dpZGdldCcpXG4gICAgICAgICAgICAgICAgcmV0ID0gdHJ1ZTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW1lbnQub3duZXJEb2N1bWVudCwgXCJpc19lbGVtZW50X3dpZGdldFwiLCByZXQpO1xuICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd2lkZ2V0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHJldHVybiBpZiB0aGUgZWxlbWVudCBpcyBvd25lZCBvciBjb250cm9sbGVkIGJ5IGFub3RoZXIgZWxlbWVudC4gXG4gICAgICogSWYgYW4gYW5jZXN0b3Igb2YgYW4gZWxlbWVudCBpcyBvd25lZCBvciBjb250cm9sbGVkIGJ5IGFub3RoZXIgZWxlbWVudCwgdGhlbiB0aGUgZWxlbWVudCBpcyBhbHNvIGNvbnNpZGVyZWQgYXMgb3duZWQgb3IgY29udHJvbGxlZC5cbiAgICAgKiBhbiBlbGVtZW50IGNhbiBiZSBvd25lZCBvciBjb250cm9sbGVkIGJ5IGFub3RoZXIgZWxlbWVudCB0aHJvdWdoIGFyaWEtb3ducyBvciBhcmlhLWNvbnRyb2xzXG4gICAgICogICB3aGVuIHRoZSBET00gaGllcmFyY2h5IGNhbm5vdCBiZSB1c2VkIHRvIHJlcHJlc2VudCB0aGUgcmVsYXRpb25zaGlwLlxuICAgICAqIGFyaWEtb3ducyBhdHRyaWJ1dGUgaXMgdXNlZCB0byBkZWZpbmUgY29udGV4dHVhbCByZWxhdGlvbnNoaXAgd2l0aCBhIG93bmluZyBwYXJlbnQgXG4gICAgICogYXJpYS1jb250cm9scyBhdHRyaWJ1dGUgaXMgdXNlZCB0byBhc3NvY2lhdGUgYW4gZWxlbWVudCB3aXRoIHRoZSBjb250cm9sbGluZyBlbGVtZW50LlxuICAgICAqICBleGFtcGxlIGVsZW1lbnRzIHdpdGggcm9sZXM6IGNvbWJvYm94LCBzY3JvbGxiYXIsIHRhYiwgYnV0dG9uLCBsaXN0Ym94LCBtZW51LCBtZW51YmFyLCByYWRpb2dyb3VwLCB0cmVlLCB0cmVlZ3JpZFxuICAgICAqIFxuICAgICAqIHdoZW4gYW4gZWxlbWVudCBpcyBvd25lZCBvciBjb250cm9sbGVkIGJ5IGFub3RoZXIgZWxlbWVudCwgaXRzIG5hdmlnYXRpb24gbWF5IGJlIGNvbnRyb2xsZWQgYnkgdGhlIHBhcmVudCBcbiAgICAgKiAgdGhyb3VnaCBhcmlhLWFjdGl2ZWRlc2NlbmRhbnRzIGF0dHJpYnV0ZSBvciByb3ZpbmcgdGFiaW5kZXhcbiAgICAgKiBcbiAgICAgKiBOb3RlIG5hdmlnYXRpb24gd2l0aCBuYXRpdmUgY29tYm9ib3ggKGlucHV0IHdpdGggYSBkYXRhbGlzdCkgaXMgaW4gbmF0aXZlIGZvY3VzIG5hdmlnYXRpb24sIG5vdCBjb25zaWRlcmVkIGhlcmUgICBcbiAgICAgKiBcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gZWxlbWVudCAtIFRoZSBlbGVtZW50IHRvIGluc3BlY3RcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgaXNOYXZpZ2F0aW9uT3duZWRPckNvbnRyb2xsZWQoZWxlbWVudCA6IEVsZW1lbnQpIHtcbiAgICAgICAgaWYgKCFlbGVtZW50KSByZXR1cm4gZmFsc2U7XG4gICAgICAgIFxuICAgICAgICBsZXQgb3duZXJFbGVtczogRWxlbWVudFtdID0gQ2FjaGVVdGlsLmdldENhY2hlKGVsZW1lbnQub3duZXJEb2N1bWVudCwgXCJBcmlhVXRpbF9OYXZpZ2F0aW9uT3duZWRPckNvbnRyb2xsZWRcIiwgbnVsbCk7XG4gICAgICAgIGlmIChvd25lckVsZW1zICE9PSBudWxsICYmIG93bmVyRWxlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgaWYgKENvbW1vblV0aWwuZ2V0QW5jZXN0b3IoZWxlbWVudCwgb3duZXJFbGVtcykpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJvbGUgPSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUoZWxlbWVudCk7XG4gICAgICAgIGlmICghcm9sZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBcbiAgICAgICAgbGV0IGlkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJpZFwiKTtcbiAgICAgICAgaWYgKCFpZCB8fCBpZC50cmltKCkubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgY29uc3QgZWxlbSA9IGVsZW1lbnQub3duZXJEb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAqW2FyaWEtY29udHJvbHN+PScke2lkfSddLCAqW2FyaWEtb3duc349JyR7aWR9J11gKTtcbiAgICAgICAgaWYgKCFlbGVtKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgY29uc3QgY29udGFpbmVycyA9IFsnY29tYm9ib3gnLCAnc2Nyb2xsYmFyJywgJ2J1dHRvbicsICd0YWInLCAnbGlzdGJveCcsICdtZW51JywgJ21lbnViYXInLCAncmFkaW9ncm91cCcsICd0cmVlJywgJ3RyZWVncmlkJ107XG4gICAgICAgIGlmIChjb250YWluZXJzLmluY2x1ZGVzKHJvbGUpKSB7XG4gICAgICAgICAgICBpZiAob3duZXJFbGVtcyA9PT0gbnVsbClcbiAgICAgICAgICAgICAgICBvd25lckVsZW1zID0gW107XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIG93bmVyRWxlbXMucHVzaChlbGVtZW50KTtcbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtZW50Lm93bmVyRG9jdW1lbnQsIFwiQXJpYVV0aWxfTmF2aWdhdGlvbk93bmVkT3JDb250cm9sbGVkXCIsIG93bmVyRWxlbXMpOyAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gICAgXG4gICAgICAgIFxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZmluZGluZyBhIG5vZGUgd2hpY2ggbWF0Y2hlcyB0aGUgcm9sZSBhbmQgaXMgYSBzaWJsaW5nIG9mIHRoZVxuICAgICAqIHByb3ZpZGVkIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGJ5IGRlZmF1bHQgd2lsbCBub3QgY29uc2lkZXIgQ2hlY2sgSGlkZGVuIFNldHRpbmcgYXQgYWxsLlxuICAgICAqXG4gICAgICogTm90ZTogVGhpcyBpcyBhIHdyYXBwZXIgZnVuY3Rpb24gdG86IEFyaWFVdGlsLmdldFNpYmxpbmdXaXRoUm9sZUhpZGRlblxuICAgICAqXG4gICAgICogQHBhcm0ge2VsZW1lbnR9IGVsZW1lbnQgLSBUaGUgZWxlbWVudCB0byBzdGFydCB0aGUgbm9kZSB3YWxrIG9uIHRvIGZpbmQgc2libGluZyBub2RlXG4gICAgICogQHBhcm0ge3N0cmluZ30gcm9sZSAtIFRoZSByb2xlIHRvIHNlYXJjaCBmb3Igb24gYW4gZWxlbWVudCB1bmRlciB0aGUgcHJvdmlkZWQgZWxlbWVudFxuICAgICAqXG4gICAgICogQHJldHVybiB7bm9kZX0gd2Fsa05vZGUgLSBBIHNpYmxpbmcgbm9kZSBvZiB0aGUgZWxlbWVudCBwYXNzZWQgaW4sIHdoaWNoIGhhcyB0aGUgcHJvdmlkZWQgcm9sZVxuICAgICAqXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRTaWJsaW5nV2l0aFJvbGUoZWxlbWVudCwgcm9sZSkge1xuICAgICAgICByZXR1cm4gQXJpYVV0aWwuZ2V0U2libGluZ1dpdGhSb2xlSGlkZGVuKGVsZW1lbnQsIHJvbGUsIGZhbHNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBmaW5kaW5nIGEgbm9kZSB3aGljaCBtYXRjaGVzIHRoZSByb2xlIGFuZCBpcyBhIHNpYmxpbmcgb2YgdGhlXG4gICAgICogcHJvdmlkZWQgZWxlbWVudC5cbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gYWxzbyBjb25zaWRlcnMgaW1wbGljaXQgcm9sZXMgZm9yIHRoZSBlbGVtZW50cy5cbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gd2lsbCBhbHNvIGNvbnNpZGVyIGVsZW1lbnRzIHRoYXQgYXJlIGhpZGRlbiBiYXNlZCBvbiB0aGUgaWYgdGhlIENoZWNrXG4gICAgICogSGlkZGVuIENvbnRlbnQgc2V0dGluZ3Mgc2hvdWxkIGJlIGNvbnNpZGVyZWQgb3Igbm90LlxuICAgICAqXG4gICAgICogQHBhcm0ge2VsZW1lbnR9IGVsZW1lbnQgLSBUaGUgZWxlbWVudCB0byBzdGFydCB0aGUgbm9kZSB3YWxrIG9uIHRvIGZpbmQgc2libGluZyBub2RlXG4gICAgICogQHBhcm0ge3N0cmluZ30gcm9sZSAtIFRoZSByb2xlIHRvIHNlYXJjaCBmb3Igb24gYW4gZWxlbWVudCB1bmRlciB0aGUgcHJvdmlkZWQgZWxlbWVudFxuICAgICAqIEBwYXJtIHtib29sfSBjb25zaWRlckhpZGRlblNldHRpbmcgLSB0cnVlIG9yIGZhbHNlIGJhc2VkIG9uIGlmIGhpZGRlbiBzZXR0aW5nIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAqIEBwYXJtIHtib29sfSBjb25zaWRlckltcGxpY2l0IC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBJbXBsaWNpdCByb2xlcyBzaG91bGQgYmUgY29uc2lkZXJlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge25vZGV9IHdhbGtOb2RlIC0gQSBzaWJsaW5nIG5vZGUgb2YgdGhlIGVsZW1lbnQgcGFzc2VkIGluLCB3aGljaCBoYXMgdGhlIHByb3ZpZGVkIHJvbGVcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0U2libGluZ1dpdGhSb2xlSGlkZGVuKGVsZW1lbnQsIHJvbGUsIGNvbnNpZGVySGlkZGVuU2V0dGluZywgY29uc2lkZXJJbXBsaWNpdFJvbGU/KSB7XG5cbiAgICAgICAgLy8gVmFyaWFibGUgRGVjbGFyYXRpb25cbiAgICAgICAgbGV0IHdhbGtOb2RlID0gbnVsbDtcbiAgICAgICAgbGV0IGhhc1JvbGUgPSBmYWxzZTtcblxuICAgICAgICAvLyBPbmx5IHBlcmZvcm0gdGhlIGNoZWNrIGlmIGVsZW1lbnQgYW5kIHJvbGUgYXJlIGJvdGggcHJvdmlkZWRcbiAgICAgICAgaWYgKGVsZW1lbnQgJiYgcm9sZSkge1xuICAgICAgICAgICAgLy8gRmV0Y2ggdGhlIG5leHQgc2libGluZyBlbGVtZW50XG4gICAgICAgICAgICB3YWxrTm9kZSA9IGVsZW1lbnQubmV4dFNpYmxpbmc7XG5cbiAgICAgICAgICAgIC8vIEtlZXAgbG9vcGluZyBvdmVyIHRoZSBuZXh0IHNpYmxpbmdzIHRvIGZpbmQgZWxlbWVudCB3aGljaCBtYXRjaGVzXG4gICAgICAgICAgICAvLyB0aGUgcHJvdmlkZWQgcm9sZS5cbiAgICAgICAgICAgIHdoaWxlICh3YWxrTm9kZSAhPT0gbnVsbCAmJiAhaGFzUm9sZSkge1xuXG4gICAgICAgICAgICAgICAgLy8gRm9sbG93aW5nIGFyZSB0aGUgc3RlcHMgdGhhdCBhcmUgZXhlY3V0ZWQgYXQgdGhpcyBzdGFnZSB0byBkZXRlcm1pbmUgaWYgdGhlIG5vZGUgc2hvdWxkIGJlIGNsYXNzaWZpZWQgYXMgaGlkZGVuXG4gICAgICAgICAgICAgICAgLy8gb3Igbm90LlxuICAgICAgICAgICAgICAgIC8vICAxLiBJZiBjb25zaWRlckhpZGRlblNldHRpbmcgb3B0aW9uIGlzIHNldCB0byB0cnVlIHRoZW4gd2UgcGVyZm9ybSB0aGUgY2hlY2sgdG8gY29uc2lkZXIgdGhlXG4gICAgICAgICAgICAgICAgLy8gICAgIENoZWNrIEhpZGRlbiBDb250ZW50IHRoYXQgaXMgcHJvdmlkZWQuXG4gICAgICAgICAgICAgICAgLy8gIDIuIE9ubHkgcnVuIGlzTm9kZVZpc2libGUgY2hlY2sgaWYgaGlkZGVuIGNvbnRlbnQgc2hvdWxkIE5PVCBiZSBjaGVja2VkLiBJbiB0aGUgY2FzZSB0aGF0IGhpZGRlbiBjb250ZW50IGlzIHRvLFxuICAgICAgICAgICAgICAgIC8vICAgICBiZSBzY2FubmVkIHRoZW4gd2UgY2FuIGp1c3Qgc2NhbiBldmVyeXRoaW5nIGFzIG5vcm1hbC4gSW4gdGhlIGNhc2UgdGhhdCB0aGUgY3VycmVudCBub2RlIGlzIGhpZGRlbiB3ZSBkbyBub3RcbiAgICAgICAgICAgICAgICAvLyAgICAgYWRkIGl0IHRvIHRoZSByb2xlVG9FbGVtcyBoYXNoIGF0IGFsbCBvciBldmVuIGRvIGFueSBjaGVja2luZyBmb3IgaXQgYXQgYWxsLlxuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgLy8gTm90ZTogVGhlIGlmIGNvbmRpdGlvbnMgdXNlcyBzaG9ydC1jaXJjdWl0aW5nIHNvIGlmIHRoZSBmaXJzdCBjb25kaXRpb24gaXMgbm90IHRydWUgaXQgd2lsbCBub3QgY2hlY2sgdGhlIG5leHQgb25lLFxuICAgICAgICAgICAgICAgIC8vICAgICAgIHNvIG9uIGFuZCBzbyBmb3J0aC5cbiAgICAgICAgICAgICAgICBpZiAoY29uc2lkZXJIaWRkZW5TZXR0aW5nICYmIENvbW1vblV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbih3YWxrTm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTW92ZSBvbiB0byB0aGUgbmV4dCBub2RlXG4gICAgICAgICAgICAgICAgICAgIHdhbGtOb2RlID0gd2Fsa05vZGUubmV4dFNpYmxpbmc7XG5cbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBub2RlIGhhcyB0aGUgcm9sZSB0aGF0IHdlIG5lZWQgdG8gY2hlY2sgZXhpc3RzXG4gICAgICAgICAgICAgICAgaWYgKGNvbnNpZGVySW1wbGljaXRSb2xlKSB7XG4gICAgICAgICAgICAgICAgICAgIGhhc1JvbGUgPSBBcmlhVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3Mod2Fsa05vZGUsIHJvbGUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGhhc1JvbGUgPSBBcmlhVXRpbC5oYXNSb2xlKHdhbGtOb2RlLCByb2xlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gTW92ZSBvbiB0byB0aGUgbmV4dCBub2RlXG4gICAgICAgICAgICAgICAgd2Fsa05vZGUgPSB3YWxrTm9kZS5uZXh0U2libGluZztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSWYgd2Ugc3RpbGwgaGF2ZSBub3QgZm91bmQgYSBub2RlIHRoYXQgbWF0Y2hlcyB0aGUgcm9sZSwgc3RhcnQgYSByZXZlcnNlIGxvb2sgdXBcbiAgICAgICAgICAgIGlmICghd2Fsa05vZGUpIHtcbiAgICAgICAgICAgICAgICAvLyBGZXRjaCB0aGUgcHJldmlvdXMgU2libGluZyBvZiB0aGlzIGVsZW1lbnRcbiAgICAgICAgICAgICAgICB3YWxrTm9kZSA9IGVsZW1lbnQucHJldmlvdXNTaWJsaW5nO1xuXG4gICAgICAgICAgICAgICAgLy8gS2VlcCBsb29waW5nIG92ZXIgYWxsIHRoZSBwcmV2aW91cyBzaWJsaW5ncyB0byBzZWFyY2ggZm9yIGFuIGVsZW1lbnQgd2hpY2hcbiAgICAgICAgICAgICAgICAvLyBtYXRjaGVzIHRoZSBwcm92aWRlZCByb2xlLlxuICAgICAgICAgICAgICAgIHdoaWxlICh3YWxrTm9kZSAhPT0gbnVsbCAmJiAhaGFzUm9sZSkge1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIEZvbGxvd2luZyBhcmUgdGhlIHN0ZXBzIHRoYXQgYXJlIGV4ZWN1dGVkIGF0IHRoaXMgc3RhZ2UgdG8gZGV0ZXJtaW5lIGlmIHRoZSBub2RlIHNob3VsZCBiZSBjbGFzc2lmaWVkIGFzIGhpZGRlblxuICAgICAgICAgICAgICAgICAgICAvLyBvciBub3QuXG4gICAgICAgICAgICAgICAgICAgIC8vICAxLiBJZiBjb25zaWRlckhpZGRlblNldHRpbmcgb3B0aW9uIGlzIHNldCB0byB0cnVlIHRoZW4gd2UgcGVyZm9ybSB0aGUgY2hlY2sgdG8gY29uc2lkZXIgdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBDaGVjayBIaWRkZW4gQ29udGVudCB0aGF0IGlzIHByb3ZpZGVkLlxuICAgICAgICAgICAgICAgICAgICAvLyAgMi4gT25seSBydW4gaXNOb2RlVmlzaWJsZSBjaGVjayBpZiBoaWRkZW4gY29udGVudCBzaG91bGQgTk9UIGJlIGNoZWNrZWQuIEluIHRoZSBjYXNlIHRoYXQgaGlkZGVuIGNvbnRlbnQgaXMgdG8sXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBiZSBzY2FubmVkIHRoZW4gd2UgY2FuIGp1c3Qgc2NhbiBldmVyeXRoaW5nIGFzIG5vcm1hbC4gSW4gdGhlIGNhc2UgdGhhdCB0aGUgY3VycmVudCBub2RlIGlzIGhpZGRlbiB3ZSBkbyBub3RcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIGFkZCBpdCB0byB0aGUgcm9sZVRvRWxlbXMgaGFzaCBhdCBhbGwgb3IgZXZlbiBkbyBhbnkgY2hlY2tpbmcgZm9yIGl0IGF0IGFsbC5cbiAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgLy8gTm90ZTogVGhlIGlmIGNvbmRpdGlvbnMgdXNlcyBzaG9ydC1jaXJjdWl0aW5nIHNvIGlmIHRoZSBmaXJzdCBjb25kaXRpb24gaXMgbm90IHRydWUgaXQgd2lsbCBub3QgY2hlY2sgdGhlIG5leHQgb25lLFxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgICBzbyBvbiBhbmQgc28gZm9ydGguXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb25zaWRlckhpZGRlblNldHRpbmcgJiYgQ29tbW9uVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKHdhbGtOb2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTW92ZSBvbiB0byB0aGUgbmV4dCBub2RlXG4gICAgICAgICAgICAgICAgICAgICAgICB3YWxrTm9kZSA9IHdhbGtOb2RlLnByZXZpb3VzU2libGluZztcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGlzIG5vZGUgaGFzIHRoZSByb2xlIHRoYXQgd2UgbmVlZCB0byBjaGVjayBleGlzdHNcbiAgICAgICAgICAgICAgICAgICAgaGFzUm9sZSA9IEFyaWFVdGlsLmhhc1JvbGUod2Fsa05vZGUsIHJvbGUsIGNvbnNpZGVySW1wbGljaXRSb2xlKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBNb3ZlIG9uIHRvIHRoZSBuZXh0IG5vZGVcbiAgICAgICAgICAgICAgICAgICAgd2Fsa05vZGUgPSB3YWxrTm9kZS5wcmV2aW91c1NpYmxpbmc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHdhbGtOb2RlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGdldHRpbmcgYSBkZXNjZW5kYW50IGVsZW1lbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHJvbGUsIHVuZGVyXG4gICAgICogdGhlIGVsZW1lbnQgdGhhdCB3YXMgcHJvdmlkZWQuXG4gICAgICpcbiAgICAgKiBOb3RlIGJ5IGRlZmF1bHQgdGhpcyBmdW5jdGlvbiB3aWxsIG5vdCBjb25zaWRlciB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgU2V0dGluZy5cbiAgICAgKlxuICAgICAqIE5vdGU6IFRoaXMgaXMgYSB3cmFwcGVyIGZ1bmN0aW9uIHRvOiBBcmlhVXRpbC5nZXREZXNjZW5kYW50V2l0aFJvbGVIaWRkZW5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBlbGVtZW50IC0gcGFyZW50IGVsZW1lbnQgZm9yIHdoaWNoIHdlIHdpbGwgYmUgY2hlY2tpbmcgZGVzY2VuZGFudHMgZm9yXG4gICAgICogQHBhcm0ge3N0cmluZ30gcm9sZU5hbWUgLSBUaGUgcm9sZSB0byBsb29rIGZvciBvbiB0aGUgZGVzY2VuZGFudCdzIGVsZW1lbnRzXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtub2RlfSAtIFRoZSBkZXNjZW5kYW50IGVsZW1lbnQgdGhhdCBtYXRjaGVzIHRoZSByb2xlIHNwZWNpZmllZCAob25seSBvbmUpXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldERlc2NlbmRhbnRXaXRoUm9sZShlbGVtZW50LCByb2xlTmFtZSkge1xuICAgICAgICByZXR1cm4gQXJpYVV0aWwuZ2V0RGVzY2VuZGFudFdpdGhSb2xlSGlkZGVuKGVsZW1lbnQsIHJvbGVOYW1lLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZ2V0dGluZyBhIGRlc2NlbmRhbnQgZWxlbWVudCB3aXRoIHRoZSBzcGVjaWZpZWQgcm9sZSwgdW5kZXJcbiAgICAgKiB0aGUgZWxlbWVudCB0aGF0IHdhcyBwcm92aWRlZC4gVGhpcyBmdW5jdGlvbiBhc2xvIGZpbmRzIGVsZW1lbnRzIHdpdGggaW1wbGljaXQgcm9sZXMuXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gZWxlbWVudCAtIHBhcmVudCBlbGVtZW50IGZvciB3aGljaCB3ZSB3aWxsIGJlIGNoZWNraW5nIGRlc2NlbmRhbnRzIGZvclxuICAgICAqIEBwYXJtIHtzdHJpbmd9IHJvbGVOYW1lIC0gVGhlIHJvbGUgdG8gbG9vayBmb3Igb24gdGhlIGRlc2NlbmRhbnQncyBlbGVtZW50c1xuICAgICAqIEBwYXJtIHtib29sfSBjb25zaWRlckhpZGRlblNldHRpbmcgLSB0cnVlIG9yIGZhbHNlIGJhc2VkIG9uIGlmIGhpZGRlbiBzZXR0aW5nIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAqIEBwYXJtIHtib29sfSBjb25zaWRlckltcGxpY2l0Um9sZXMgLSB0cnVlIG9yIGZhbHNlIGJhc2VkIG9uIGlmIGltcGxpY2l0IHJvbGVzIHNldHRpbmcgc2hvdWxkIGJlIGNvbnNpZGVyZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtub2RlfSAtIFRoZSBkZXNjZW5kYW50IGVsZW1lbnQgdGhhdCBtYXRjaGVzIHRoZSByb2xlIHNwZWNpZmllZCAob25seSBvbmUpXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldERlc2NlbmRhbnRXaXRoUm9sZUhpZGRlbihlbGVtZW50LCByb2xlTmFtZSwgY29uc2lkZXJIaWRkZW5TZXR0aW5nLCBjb25zaWRlckltcGxpY2l0Um9sZXM/KSB7XG4gICAgICAgIC8vIFZhcmlhYmxlIERlY2xlcmF0aW9uXG4gICAgICAgIGxldCBkZXNjZW5kYW50ID0gbnVsbDtcbiAgICAgICAgbGV0IG53ID0gbmV3IERPTVdhbGtlcihlbGVtZW50KTtcbiAgICAgICAgLy8gTG9vcCBvdmVyIGFsbCB0aGUgY2hpbGRyZW5zIG9mIHRoZSBlbGVtZW50IHByb3ZpZGVkIGFuZCBjaGVjayBpZiB0aGUgcm9sZW5hbWUgcHJvdmlkZWQgZXhpc3RzXG4gICAgICAgIHdoaWxlIChudy5uZXh0Tm9kZSgpICYmIG53Lm5vZGUgIT0gZWxlbWVudCAmJiBudy5ub2RlICE9IGVsZW1lbnQubmV4dFNpYmxpbmcpIHtcblxuICAgICAgICAgICAgLy8gRm9sbG93aW5nIGFyZSB0aGUgc3RlcHMgdGhhdCBhcmUgZXhlY3V0ZWQgYXQgdGhpcyBzdGFnZSB0byBkZXRlcm1pbmUgaWYgdGhlIG5vZGUgc2hvdWxkIGJlIGNsYXNzaWZpZWQgYXMgaGlkZGVuXG4gICAgICAgICAgICAvLyBvciBub3QuXG4gICAgICAgICAgICAvLyAgMS4gSWYgY29uc2lkZXJIaWRkZW5TZXR0aW5nIG9wdGlvbiBpcyBzZXQgdG8gdHJ1ZSB0aGVuIHdlIHBlcmZvcm0gdGhlIGNoZWNrIHRvIGNvbnNpZGVyIHRoZVxuICAgICAgICAgICAgLy8gICAgIENoZWNrIEhpZGRlbiBDb250ZW50IHRoYXQgaXMgcHJvdmlkZWQuXG4gICAgICAgICAgICAvLyAgMi4gT25seSBydW4gaXNOb2RlVmlzaWJsZSBjaGVjayBpZiBoaWRkZW4gY29udGVudCBzaG91bGQgTk9UIGJlIGNoZWNrZWQuIEluIHRoZSBjYXNlIHRoYXQgaGlkZGVuIGNvbnRlbnQgaXMgdG8sXG4gICAgICAgICAgICAvLyAgICAgYmUgc2Nhbm5lZCB0aGVuIHdlIGNhbiBqdXN0IHNjYW4gZXZlcnl0aGluZyBhcyBub3JtYWwuIEluIHRoZSBjYXNlIHRoYXQgdGhlIGN1cnJlbnQgbm9kZSBpcyBoaWRkZW4gd2UgZG8gbm90XG4gICAgICAgICAgICAvLyAgICAgYWRkIGl0IHRvIHRoZSByb2xlVG9FbGVtcyBoYXNoIGF0IGFsbCBvciBldmVuIGRvIGFueSBjaGVja2luZyBmb3IgaXQgYXQgYWxsLlxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIE5vdGU6IFRoZSBpZiBjb25kaXRpb25zIHVzZXMgc2hvcnQtY2lyY3VpdGluZyBzbyBpZiB0aGUgZmlyc3QgY29uZGl0aW9uIGlzIG5vdCB0cnVlIGl0IHdpbGwgbm90IGNoZWNrIHRoZSBuZXh0IG9uZSxcbiAgICAgICAgICAgIC8vICAgICAgIHNvIG9uIGFuZCBzbyBmb3J0aC5cbiAgICAgICAgICAgIGlmIChjb25zaWRlckhpZGRlblNldHRpbmcgJiYgQ29tbW9uVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKG53Lm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgbm9kZSBoYXMgdGhlIHJvbGUgc3BlY2lmaWVkLCBpZiBpdCBkb2VzIHRoZW4gc2V0IHRoaXMgYXMgdGhlIGRlc2NlbmRhbnQgYW5kIHN0b3AgY2hlY2tpbmcgdGhlIHJlc3Qgb2YgdGhlXG4gICAgICAgICAgICAvLyBub2Rlcy5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgbm9kZSBoYXMgdGhlIGltcGxpY2l0IHJvbGVzLCBpZiBpdCBkb2VzIHRoZW4gc2V0IHRoaXMgYXMgdGhlIGRlc2NlbmRhbnQgYW5kIHN0b3AgY2hlY2tpbmcgdGhlIHJlc3Qgb2YgdGhlXG4gICAgICAgICAgICAvLyBub2Rlcy5cbiAgICAgICAgICAgIGlmIChjb25zaWRlckltcGxpY2l0Um9sZXMgPyBBcmlhVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3Mobncubm9kZSwgcm9sZU5hbWUpIDogQXJpYVV0aWwuaGFzUm9sZShudy5ub2RlLCByb2xlTmFtZSwgZmFsc2UpKSB7XG4gICAgICAgICAgICAgICAgZGVzY2VuZGFudCA9IG53Lm5vZGU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGVzY2VuZGFudDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBnZXR0aW5nIEFsbCBkZXNjZW5kYW50IGVsZW1lbnRzIHdpdGggdGhlIHNwZWNpZmllZCByb2xlcywgdW5kZXJcbiAgICAgKiB0aGUgZWxlbWVudCB0aGF0IHdhcyBwcm92aWRlZC4gVGhpcyBmdW5jdGlvbiBhc2xvIGZpbmRzIGVsZW1lbnRzIHdpdGggaW1wbGljaXQgcm9sZXMuXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gZWxlbWVudCAtIHBhcmVudCBlbGVtZW50IGZvciB3aGljaCB3ZSB3aWxsIGJlIGNoZWNraW5nIGRlc2NlbmRhbnRzIGZvclxuICAgICAqIEBwYXJtIHtzdHJpbmdbXX0gcm9sZU5hbWVzIC0gVGhlIHJvbGVzIHRvIGxvb2sgZm9yIG9uIHRoZSBkZXNjZW5kYW50J3MgZWxlbWVudHNcbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJIaWRkZW5TZXR0aW5nIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBoaWRkZW4gc2V0dGluZyBzaG91bGQgYmUgY29uc2lkZXJlZC5cbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJJbXBsaWNpdFJvbGVzIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBpbXBsaWNpdCByb2xlcyBzZXR0aW5nIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAqXG4gICAgICogQHJldHVybiB7bm9kZVtdfSAtIGFsbCBkZXNjZW5kYW50IGVsZW1lbnRzIHRoYXQgbWF0Y2ggdGhlIHJvbGVzIHNwZWNpZmllZFxuICAgICAqXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRBbGxEZXNjZW5kYW50c1dpdGhSb2xlcyhlbGVtZW50LCByb2xlTmFtZXM6IHN0cmluZ1tdLCBjb25zaWRlckhpZGRlblNldHRpbmcsIGNvbnNpZGVySW1wbGljaXRSb2xlcykge1xuICAgICAgICBpZiAoIXJvbGVOYW1lcyB8fCByb2xlTmFtZXMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgICAgIC8vIFZhcmlhYmxlIERlY2xlcmF0aW9uXG4gICAgICAgIGxldCBkZXNjZW5kYW50cyA9IFtdO1xuXG4gICAgICAgIHJvbGVOYW1lcy5mb3JFYWNoKHJvbGVOYW1lID0+IHtcbiAgICAgICAgICAgIGxldCBraWRzID0gQXJpYVV0aWwuZ2V0QWxsRGVzY2VuZGFudHNXaXRoUm9sZUhpZGRlbihlbGVtZW50LCByb2xlTmFtZSwgY29uc2lkZXJIaWRkZW5TZXR0aW5nLCBjb25zaWRlckltcGxpY2l0Um9sZXMpO1xuICAgICAgICAgICAgaWYgKGtpZHMgJiYga2lkcy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgIGRlc2NlbmRhbnRzID0gZGVzY2VuZGFudHMuY29uY2F0KGtpZHMpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGRlc2NlbmRhbnRzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGdldHRpbmcgQWxsIGRlc2NlbmRhbnQgZWxlbWVudHMgd2l0aCB0aGUgc3BlY2lmaWVkIHJvbGUsIHVuZGVyXG4gICAgICogdGhlIGVsZW1lbnQgdGhhdCB3YXMgcHJvdmlkZWQuIFRoaXMgZnVuY3Rpb24gYXNsbyBmaW5kcyBlbGVtZW50cyB3aXRoIGltcGxpY2l0IHJvbGVzLlxuICAgICAqXG4gICAgICogQHBhcm0ge2VsZW1lbnR9IGVsZW1lbnQgLSBwYXJlbnQgZWxlbWVudCBmb3Igd2hpY2ggd2Ugd2lsbCBiZSBjaGVja2luZyBkZXNjZW5kYW50cyBmb3JcbiAgICAgKiBAcGFybSB7c3RyaW5nfSByb2xlTmFtZSAtIFRoZSByb2xlIHRvIGxvb2sgZm9yIG9uIHRoZSBkZXNjZW5kYW50J3MgZWxlbWVudHNcbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJIaWRkZW5TZXR0aW5nIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBoaWRkZW4gc2V0dGluZyBzaG91bGQgYmUgY29uc2lkZXJlZC5cbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJJbXBsaWNpdFJvbGVzIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBpbXBsaWNpdCByb2xlcyBzZXR0aW5nIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAqXG4gICAgICogQHJldHVybiB7bm9kZVtdfSAtIFRoZSBkZXNjZW5kYW50IGVsZW1lbnRzIHRoYXQgbWF0Y2ggdGhlIHJvbGUgc3BlY2lmaWVkXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEFsbERlc2NlbmRhbnRzV2l0aFJvbGVIaWRkZW4oZWxlbWVudCwgcm9sZU5hbWU6IHN0cmluZywgY29uc2lkZXJIaWRkZW5TZXR0aW5nLCBjb25zaWRlckltcGxpY2l0Um9sZXMpIHtcbiAgICAgICAgLy8gVmFyaWFibGUgRGVjbGVyYXRpb25cbiAgICAgICAgbGV0IGRlc2NlbmRhbnRzID0gW107XG4gICAgICAgIGxldCBudyA9IG5ldyBET01XYWxrZXIoZWxlbWVudCk7XG4gICAgICAgIC8vIExvb3Agb3ZlciBhbGwgdGhlIGNoaWxkcmVucyBvZiB0aGUgZWxlbWVudCBwcm92aWRlZCBhbmQgY2hlY2sgaWYgdGhlIHJvbGVuYW1lIHByb3ZpZGVkIGV4aXN0c1xuICAgICAgICB3aGlsZSAobncubmV4dE5vZGUoKSAmJiBudy5ub2RlICE9IGVsZW1lbnQgJiYgbncubm9kZSAhPSBlbGVtZW50Lm5leHRTaWJsaW5nKSB7XG4gICAgICAgICAgICBpZiAobncuYkVuZFRhZykge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gRm9sbG93aW5nIGFyZSB0aGUgc3RlcHMgdGhhdCBhcmUgZXhlY3V0ZWQgYXQgdGhpcyBzdGFnZSB0byBkZXRlcm1pbmUgaWYgdGhlIG5vZGUgc2hvdWxkIGJlIGNsYXNzaWZpZWQgYXMgaGlkZGVuXG4gICAgICAgICAgICAvLyBvciBub3QuXG4gICAgICAgICAgICAvLyAgMS4gSWYgY29uc2lkZXJIaWRkZW5TZXR0aW5nIG9wdGlvbiBpcyBzZXQgdG8gdHJ1ZSB0aGVuIHdlIHBlcmZvcm0gdGhlIGNoZWNrIHRvIGNvbnNpZGVyIHRoZVxuICAgICAgICAgICAgLy8gICAgIENoZWNrIEhpZGRlbiBDb250ZW50IHRoYXQgaXMgcHJvdmlkZWQuXG4gICAgICAgICAgICAvLyAgMi4gT25seSBydW4gaXNOb2RlVmlzaWJsZSBjaGVjayBpZiBoaWRkZW4gY29udGVudCBzaG91bGQgTk9UIGJlIGNoZWNrZWQuIEluIHRoZSBjYXNlIHRoYXQgaGlkZGVuIGNvbnRlbnQgaXMgdG8sXG4gICAgICAgICAgICAvLyAgICAgYmUgc2Nhbm5lZCB0aGVuIHdlIGNhbiBqdXN0IHNjYW4gZXZlcnl0aGluZyBhcyBub3JtYWwuIEluIHRoZSBjYXNlIHRoYXQgdGhlIGN1cnJlbnQgbm9kZSBpcyBoaWRkZW4gd2UgZG8gbm90XG4gICAgICAgICAgICAvLyAgICAgYWRkIGl0IHRvIHRoZSByb2xlVG9FbGVtcyBoYXNoIGF0IGFsbCBvciBldmVuIGRvIGFueSBjaGVja2luZyBmb3IgaXQgYXQgYWxsLlxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIE5vdGU6IFRoZSBpZiBjb25kaXRpb25zIHVzZXMgc2hvcnQtY2lyY3VpdGluZyBzbyBpZiB0aGUgZmlyc3QgY29uZGl0aW9uIGlzIG5vdCB0cnVlIGl0IHdpbGwgbm90IGNoZWNrIHRoZSBuZXh0IG9uZSxcbiAgICAgICAgICAgIC8vICAgICAgIHNvIG9uIGFuZCBzbyBmb3J0aC5cbiAgICAgICAgICAgIGlmIChjb25zaWRlckhpZGRlblNldHRpbmcgJiYgQ29tbW9uVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKG53Lm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgbm9kZSBoYXMgdGhlIHJvbGUgc3BlY2lmaWVkLCBpZiBpdCBkb2VzIHRoZW4gc2V0IHRoaXMgYXMgdGhlIGRlc2NlbmRhbnQgYW5kIHN0b3AgY2hlY2tpbmcgdGhlIHJlc3Qgb2YgdGhlXG4gICAgICAgICAgICAvLyBub2Rlcy5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgbm9kZSBoYXMgdGhlIGltcGxpY2l0IHJvbGVzLCBpZiBpdCBkb2VzIHRoZW4gc2V0IHRoaXMgYXMgdGhlIGRlc2NlbmRhbnQgYW5kIHN0b3AgY2hlY2tpbmcgdGhlIHJlc3Qgb2YgdGhlXG4gICAgICAgICAgICAvLyBub2Rlcy5cbiAgICAgICAgICAgIGlmIChBcmlhVXRpbC5oYXNSb2xlKG53Lm5vZGUsIHJvbGVOYW1lLCBjb25zaWRlckltcGxpY2l0Um9sZXMpKSB7XG4gICAgICAgICAgICAgICAgZGVzY2VuZGFudHMucHVzaChudy5ub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkZXNjZW5kYW50cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBnZXR0aW5nIEFsbCBkaXJlY3QgY2hpbGRyZW4gaW4gQVQgdHJlZSB3aXRoIGEgcm9sZSAoZXhjbHVkZSBub25lIGFuZCBwcmVzZW50YXRpb24pXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gZWxlbWVudCAtIHBhcmVudCBlbGVtZW50IGZvciB3aGljaCB3ZSB3aWxsIGJlIGNoZWNraW5nIGNoaWxkcmVuIGZvclxuICAgICAqIEByZXR1cm4ge25vZGV9IC0gVGhlIGRpcmVjdCBjaGlsZCBlbGVtZW50cyBpbiBBVCB0cmVlIHRoYXQgaGFzIGEgcm9sZVxuICAgICAqXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXREaXJlY3RBVENoaWxkcmVuKGVsZW1lbnQpIHtcbiAgICAgICAgbGV0IHJlcXVpcmVkQ2hpbGRSb2xlcyA9IEFyaWFVdGlsLmdldFJlcXVpcmVkQ2hpbGRSb2xlcyhlbGVtZW50LCB0cnVlKTtcbiAgICAgICAgbGV0IGRpcmVjdDogQXJyYXk8SFRNTEVsZW1lbnQ+ID0gW107XG4gICAgICAgIEFyaWFVdGlsLnJldHJpZXZlRGlyZWN0QVRDaGlsZHJlbihlbGVtZW50LCByZXF1aXJlZENoaWxkUm9sZXMsIGRpcmVjdCk7XG4gICAgICAgIHJldHVybiBkaXJlY3Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgcmVjdXJzaXZlbHkgYW55IGNoaWxkIHBhdGggdGlsbCBlaXRoZXIgbm8gY2hpbGQgb3IgYSBjaGlsZCB3aXRoIGEgcm9sZSBpcyBmb3VuZCAoZXhjbHVkZSBub25lIGFuZCBwcmVzZW50YXRpb24pXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gZWxlbWVudCAtIHBhcmVudCBlbGVtZW50IGZvciB3aGljaCB3ZSB3aWxsIGJlIGNoZWNraW5nIGNoaWxkcmVuIGZvclxuICAgICAqIEByZXR1cm4ge25vZGV9IC0gVGhlIGRpcmVjdCBjaGlsZCBlbGVtZW50cyBpbiBBVCB0cmVlXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIHJldHJpZXZlRGlyZWN0QVRDaGlsZHJlbihlbGVtZW50LCByZXF1aXJlZENoaWxkUm9sZXMsIGRpcmVjdDogQXJyYXk8SFRNTEVsZW1lbnQ+KSB7XG4gICAgICAgIGxldCBjaGlsZHJlbjogSFRNTEVsZW1lbnRbXSA9IFtdO1xuICAgICAgICBpZiAoZWxlbWVudC5jaGlsZHJlbiAhPT0gbnVsbCAmJiBlbGVtZW50LmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWxlbWVudC5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goZWxlbWVudC5jaGlsZHJlbltpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgdGhlIGVsZW1lbnQgY29udGFpbnMgXCJhcmlhLW93blwiIGF0dHJpYnV0ZSwgdGhlbiB0aGUgYXJpYS1vd25lZCBjaGlsZHJlbiBuZWVkIHRvIGJlIGluY2x1ZGVkIHRvb1xuICAgICAgICBsZXQgb3duZWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcImFyaWEtb3duc1wiKTtcbiAgICAgICAgaWYgKG93bmVkKSB7XG4gICAgICAgICAgICBsZXQgZG9jID0gZWxlbWVudC5vd25lckRvY3VtZW50O1xuICAgICAgICAgICAgaWYgKGRvYykge1xuICAgICAgICAgICAgICAgIGxldCBvd25lZElkcyA9IG93bmVkLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG93bmVkSWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBvd25lZEVsZW0gPSBkb2MuZ2V0RWxlbWVudEJ5SWQob3duZWRJZHNbaV0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAob3duZWRFbGVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbi5wdXNoKG93bmVkRWxlbSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAvL2lnbm9yZSBoaWRkZW4gYW5kIGludmlzaWJsZSBjaGlsZFxuICAgICAgICAgICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChjaGlsZHJlbltpXSkgfHwgIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShjaGlsZHJlbltpXSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGxldCByb2xlcyA9IEFyaWFVdGlsLmdldFJvbGVzKGNoaWxkcmVuW2ldLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgaWYgKHJvbGVzID09PSBudWxsIHx8IHJvbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByb2xlcyA9IEFyaWFVdGlsLmdldEltcGxpY2l0Um9sZShjaGlsZHJlbltpXSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHJvbGVzICYmIHJvbGVzICE9PSBudWxsICYmIHJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgLy9yZW1vdmUgJ25vbmUnIGFuZCAncHJlc2VudGF0aW9uJ1xuICAgICAgICAgICAgICAgICAgICByb2xlcyA9IHJvbGVzLmZpbHRlcihmdW5jdGlvbiAocm9sZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJvbGUgIT09IFwibm9uZVwiICYmIHJvbGUgIT09IFwicHJlc2VudGF0aW9uXCI7XG4gICAgICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICAgICAgLy8gYSAnZ3JvdXAnIHJvbGUgaXMgYWxsb3dlZCBidXQgbm90IHJlcXVpcmVkIGZvciBzb21lIGVsZW1lbnRzIHNvIHJlbW92ZSBpdCBpZiBleGlzdHNcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJvbGVzLmluY2x1ZGVzKFwiZ3JvdXBcIikgJiYgcmVxdWlyZWRDaGlsZFJvbGVzICYmIHJlcXVpcmVkQ2hpbGRSb2xlcy5pbmNsdWRlcygnZ3JvdXAnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcm9sZXMgPSByb2xlcy5maWx0ZXIoZnVuY3Rpb24gKHJvbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcm9sZSAhPT0gJ2dyb3VwJztcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJvbGVzICYmIHJvbGVzICE9PSBudWxsICYmIHJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZGlyZWN0LnB1c2goY2hpbGRyZW5baV0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHJlY3Vyc2l2ZSB1bnRpbCBnZXQgYSByZXR1cm4gdmFsdWUsIFxuICAgICAgICAgICAgICAgICAgICBBcmlhVXRpbC5yZXRyaWV2ZURpcmVjdEFUQ2hpbGRyZW4oY2hpbGRyZW5baV0sIHJlcXVpcmVkQ2hpbGRSb2xlcywgZGlyZWN0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgbnVsbCBvciByZXF1aXJlZCBjaGlsZCByb2xlcyBmb3IgYSBnaXZlbiBlbGVtZW50IHdpdGggb25lIG1vcmUgcm9sZXMsXG4gICAgICogcmV0dXJuIG51bGwgaWYgdGhlIHJvbGUgaXMgJ25vbmUnIG9yICdwcmVzZW50YXRpb24nXG4gICAgICogQHBhcmFtIGVsZW1lbnQgXG4gICAgICogQHBhcmFtIGluY2x1ZGVJbXBsaWNpdCBpbmNsdWRlIGltcGxpY2l0IHJvbGVzIGlmIG5vIHJvbGUgaXMgZXhwbGljaXRseSBwcm92aWRlZFxuICAgICAqIEByZXR1cm5zIFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0UmVxdWlyZWRDaGlsZFJvbGVzKGVsZW1lbnQsIGluY2x1ZGVJbXBsaWNpdDogYm9vbGVhbik6IHN0cmluZ1tdIHtcbiAgICAgICAgbGV0IHJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXMoZWxlbWVudCwgZmFsc2UpO1xuICAgICAgICAvLyBpZiBleHBsaWNpdCByb2xlIGRvZXNuJ3QgZXhpc3QsIGdldCB0aGUgaW1wbGljaXQgb25lXG4gICAgICAgIGlmICgoIXJvbGVzIHx8IHJvbGVzLmxlbmd0aCA9PT0gMCkgJiYgaW5jbHVkZUltcGxpY2l0KSB7XG4gICAgICAgICAgICByb2xlcyA9IEFyaWFVdGlsLmdldEltcGxpY2l0Um9sZShlbGVtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKiAgXG4gICAgICAgICAqIGlnbm9yZSBpZiB0aGUgZWxlbWVudCBkb2Vzbid0IGhhdmUgYW55IGV4cGxpY2l0IG9yIGltcGxpY2l0IHJvbGVcbiAgICAgICAgKi9cbiAgICAgICAgaWYgKCFyb2xlcyB8fCByb2xlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqICBcbiAgICAgICAgICogaWdub3JlIGlmIHRoZSBlbGVtZW50IGNvbnRhaW5zIG5vbmUgb3IgcHJlc2VudGF0aW9uIHJvbGVcbiAgICAgICAgKi9cbiAgICAgICAgbGV0IHByZXNlbnRhdGlvblJvbGVzID0gW1wibm9uZVwiLCBcInByZXNlbnRhdGlvblwiXTtcbiAgICAgICAgY29uc3QgZm91bmQgPSByb2xlcy5zb21lKHIgPT4gcHJlc2VudGF0aW9uUm9sZXMuaW5jbHVkZXMocikpO1xuICAgICAgICBpZiAoZm91bmQpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCBkZXNpZ25QYXR0ZXJucyA9IEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJucztcbiAgICAgICAgbGV0IHJlcXVpcmVkQ2hpbGRSb2xlczogc3RyaW5nW10gPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByb2xlcy5sZW5ndGg7ICsraikge1xuICAgICAgICAgICAgaWYgKGRlc2lnblBhdHRlcm5zW3JvbGVzW2pdXSAmJiBkZXNpZ25QYXR0ZXJuc1tyb2xlc1tqXV0ucmVxQ2hpbGRyZW4gIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXF1aXJlZENoaWxkUm9sZXMgPSBDb21tb25VdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QoZGVzaWduUGF0dGVybnNbcm9sZXNbal1dLnJlcUNoaWxkcmVuLCByZXF1aXJlZENoaWxkUm9sZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXF1aXJlZENoaWxkUm9sZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZ2V0dGluZyBhbiBlbGVtZW50IHJlZmVyZW5jZWQgYnkgYXJpYS1vd25zIGFuZCBoYXMgdGhlXG4gICAgICogcm9sZSB0aGF0IHdhcyBzcGVjaWZpZWQuXG4gICAgICpcbiAgICAgKiBOb3RlIGJ5IGRlZmF1bHQgdGhpcyBmdW5jdGlvbiB3aWxsIG5vdCBjb25zaWRlciB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgU2V0dGluZy5cbiAgICAgKlxuICAgICAqIE5vdGU6IFRoaXMgaXMgYSB3cmFwcGVyIGZ1bmN0aW9uIHRvOiBBcmlhVXRpbC5nZXRBcmlhT3duc1dpdGhSb2xlSGlkZGVuXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gY2hlY2sgZm9yIGFyaWEtb3duc1xuICAgICAqIEBwYXJtIHtzdHJpbmd9IHJvbGVOYW1lIC0gVGhlIHJvbGUgdG8gbG9vayBmb3Igb24gdGhlIGFyaWEtb3ducyBlbGVtZW50XG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtub2RlfSAtIFRoZSBlbGVtZW50IHRoYXQgaXMgcmVmZXJlbmNlZCBieSBhcmlhLW93bnMgYW5kIGhhcyByb2xlIHNwZWNpZmllZC5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0QXJpYU93bnNXaXRoUm9sZShlbGVtZW50LCByb2xlTmFtZSkge1xuICAgICAgICByZXR1cm4gQXJpYVV0aWwuZ2V0QXJpYU93bnNXaXRoUm9sZUhpZGRlbihlbGVtZW50LCByb2xlTmFtZSwgZmFsc2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGdldHRpbmcgYW4gZWxlbWVudCByZWZlcmVuY2VkIGJ5IGFyaWEtb3ducyBhbmQgaGFzIHRoZVxuICAgICAqIHJvbGUgdGhhdCB3YXMgc3BlY2lmaWVkLiBUaGlzIGZ1bmN0aW9uIGFzbG8gZmluZHMgZWxlbWVudHMgd2l0aCBpbXBsaWNpdCByb2xlcy5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBjaGVjayBmb3IgYXJpYS1vd25zXG4gICAgICogQHBhcm0ge3N0cmluZ30gcm9sZU5hbWUgLSBUaGUgcm9sZSB0byBsb29rIGZvciBvbiB0aGUgYXJpYS1vd25zIGVsZW1lbnRcbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJIaWRkZW5TZXR0aW5nIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBoaWRkZW4gc2V0dGluZyBzaG91bGQgYmUgY29uc2lkZXJlZC5cbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJJbXBsaWNpdFJvbGVzIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBpbXBsaWNpdCByb2xlcyBzZXR0aW5nIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAqXG4gICAgICogQHJldHVybiB7bm9kZX0gLSBUaGUgZWxlbWVudCB0aGF0IGlzIHJlZmVyZW5jZWQgYnkgYXJpYS1vd25zIGFuZCBoYXMgcm9sZSBzcGVjaWZpZWQuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEFyaWFPd25zV2l0aFJvbGVIaWRkZW4oZWxlbWVudCwgcm9sZU5hbWUsIGNvbnNpZGVySGlkZGVuU2V0dGluZywgY29uc2lkZXJJbXBsaWNpdFJvbGVzPykge1xuICAgICAgICAvLyBWYXJpYWJsZSBEZWNsZXJhdGlvblxuICAgICAgICBsZXQgcmVmZXJlbmNlZEVsZW1lbnQgPSBudWxsO1xuICAgICAgICBsZXQgcmVmZXJlbmNlZEVsZW1IYXNSb2xlID0gZmFsc2U7XG5cbiAgICAgICAgLy8gSW4gdGhlIGNhc2UgYXJpYS1vd25zIGlzIG5vdCBvbiB0aGUgZWxlbWVudCBqdXN0IGJyZWFrIG91dCBvZiB0aGlzIGZ1bmN0aW9uIHdpdGggbnVsbFxuICAgICAgICBpZiAoQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShlbGVtZW50LCBcImFyaWEtb3duc1wiKSkge1xuXG4gICAgICAgICAgICAvLyBHZXQgdGhlIHJlZmVyZW5jZSBJRFxuICAgICAgICAgICAgbGV0IHJlZmVyZW5jZUlEID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJhcmlhLW93bnNcIik7XG5cbiAgICAgICAgICAgIC8vIEdldCB0aGUgZWxlbWVudCBmb3IgdGhlIHJlZmVyZW5jZSBJRFxuICAgICAgICAgICAgcmVmZXJlbmNlZEVsZW1lbnQgPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChlbGVtZW50LCByZWZlcmVuY2VJRCk7XG4gICAgICAgICAgICAvL2lnbm9yZSBpZiB0aGUgYXJpYS1vd25zIHBvaW50IHRvIHRoZSBlbGVtZW50IGl0c2VsZlxuICAgICAgICAgICAgaWYgKERPTVV0aWwuc2FtZU5vZGUoZWxlbWVudCwgcmVmZXJlbmNlZEVsZW1lbnQpKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgICAgICAvLyBGb2xsb3dpbmcgYXJlIHRoZSBzdGVwcyB0aGF0IGFyZSBleGVjdXRlZCBhdCB0aGlzIHN0YWdlIHRvIGRldGVybWluZSBpZiB0aGUgbm9kZSBzaG91bGQgYmUgY2xhc3NpZmllZCBhcyBoaWRkZW5cbiAgICAgICAgICAgIC8vIG9yIG5vdC5cbiAgICAgICAgICAgIC8vICAxLiBJZiBjb25zaWRlckhpZGRlblNldHRpbmcgb3B0aW9uIGlzIHNldCB0byB0cnVlIHRoZW4gd2UgcGVyZm9ybSB0aGUgY2hlY2sgdG8gY29uc2lkZXIgdGhlXG4gICAgICAgICAgICAvLyAgICAgQ2hlY2sgSGlkZGVuIENvbnRlbnQgdGhhdCBpcyBwcm92aWRlZC5cbiAgICAgICAgICAgIC8vICAyLiBPbmx5IHJ1biBpc05vZGVWaXNpYmxlIGNoZWNrIGlmIGhpZGRlbiBjb250ZW50IHNob3VsZCBOT1QgYmUgY2hlY2tlZC4gSW4gdGhlIGNhc2UgdGhhdCBoaWRkZW4gY29udGVudCBpcyB0byxcbiAgICAgICAgICAgIC8vICAgICBiZSBzY2FubmVkIHRoZW4gd2UgY2FuIGp1c3Qgc2NhbiBldmVyeXRoaW5nIGFzIG5vcm1hbC4gSW4gdGhlIGNhc2UgdGhhdCB0aGUgY3VycmVudCBub2RlIGlzIGhpZGRlbiB3ZSBkbyBub3RcbiAgICAgICAgICAgIC8vICAgICBhZGQgaXQgdG8gdGhlIHJvbGVUb0VsZW1zIGhhc2ggYXQgYWxsIG9yIGV2ZW4gZG8gYW55IGNoZWNraW5nIGZvciBpdCBhdCBhbGwuXG4gICAgICAgICAgICBpZiAoY29uc2lkZXJIaWRkZW5TZXR0aW5nICYmIHJlZmVyZW5jZWRFbGVtZW50ICE9IG51bGwgJiYgQ29tbW9uVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKHJlZmVyZW5jZWRFbGVtZW50KSkge1xuICAgICAgICAgICAgICAgIHJlZmVyZW5jZWRFbGVtSGFzUm9sZSA9IG51bGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlZmVyZW5jZWRFbGVtSGFzUm9sZSA9IEFyaWFVdGlsLmhhc1JvbGUocmVmZXJlbmNlZEVsZW1lbnQsIHJvbGVOYW1lLCBjb25zaWRlckltcGxpY2l0Um9sZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZWZlcmVuY2VkRWxlbUhhc1JvbGUgPyByZWZlcmVuY2VkRWxlbWVudCA6IG51bGw7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHRydWUgaWYgdGhlIGVsZW1lbnQgaGFzIGFuIEFSSUEgbGFiZWxcbiAgICBwdWJsaWMgc3RhdGljIGhhc0FyaWFMYWJlbChlbGVtZW50KSB7XG5cbiAgICAgICAgLy8gUnB0X0FyaWFfVmFsaWRJZFJlZiBkZXRlcm1pbmVzIGlmIHRoZSBhcmlhLWxhYmVsbGVkYnkgaWQgcG9pbnRzIHRvIGEgdmFsaWQgZWxlbWVudFxuICAgICAgICByZXR1cm4gQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShlbGVtZW50LCBcImFyaWEtbGFiZWxcIikgfHwgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShlbGVtZW50LCBcImFyaWEtbGFiZWxsZWRieVwiKTtcbiAgICB9XG5cbiAgICAvLyBHaXZlbiBhbiBhcnJheSBvZiBlbGVtZW50cywgcmV0dXJuIHRydWUgaWYgdGhlIGVsZW1lbnRzIGhhdmUgdW5pcXVlIEFSSUEgbGFiZWxzXG4gICAgcHVibGljIHN0YXRpYyBoYXNVbmlxdWVBcmlhTGFiZWxzTG9jYWxseShlbGVtZW50cywgaXNHbG9iYWwpIHtcbiAgICAgICAgaWYgKGVsZW1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsZXQgZG9jID0gZWxlbWVudHNbMF0ub3duZXJEb2N1bWVudDtcbiAgICAgICAgbGV0IGhhc0R1cGxpY2F0ZUxhYmVscyA9IGZhbHNlO1xuICAgICAgICBsZXQgdW5pcXVlQXJpYUxhYmVscyA9IG51bGw7XG5cbiAgICAgICAgaWYgKGlzR2xvYmFsKSB7XG4gICAgICAgICAgICB1bmlxdWVBcmlhTGFiZWxzID0gQ2FjaGVVdGlsLmdldENhY2hlKGRvYywgXCJBcmlhVXRpbF9IQVNfVU5JUVVFX0FSSUFfTEFCRUxTXCIsIG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1bmlxdWVBcmlhTGFiZWxzID09PSBudWxsKSB7XG4gICAgICAgICAgICB1bmlxdWVBcmlhTGFiZWxzID0ge307XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgIWhhc0R1cGxpY2F0ZUxhYmVscyAmJiBpIDwgZWxlbWVudHMubGVuZ3RoOyArK2kpIHtcblxuICAgICAgICAgICAgaWYgKGVsZW1lbnRzW2ldLmhhc0F0dHJpYnV0ZSkge1xuXG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnRzW2ldLmhhc0F0dHJpYnV0ZShcImFyaWEtbGFiZWxcIikpIHtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgYXJpYUxhYmVsID0gQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKGVsZW1lbnRzW2ldLmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIikpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgIGhhc0R1cGxpY2F0ZUxhYmVscyA9IGFyaWFMYWJlbCBpbiB1bmlxdWVBcmlhTGFiZWxzO1xuICAgICAgICAgICAgICAgICAgICB1bmlxdWVBcmlhTGFiZWxzW2FyaWFMYWJlbF0gPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50c1tpXS5oYXNBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsbGVkYnlcIikpIHtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgbGFiZWxJRCA9IGVsZW1lbnRzW2ldLmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsTm9kZSA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKGVsZW1lbnRzW2ldLCBsYWJlbElEKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhYmVsTm9kZSAmJiAhRE9NVXRpbC5zYW1lTm9kZShsYWJlbE5vZGUsIGVsZW1lbnRzW2ldKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBBcmlhVXRpbC5nZXRUZXh0Q29udGVudEV4Y2x1ZGluZ1NjcmlwdHMobGFiZWxOb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZXQgbm9ybWFsaXplZExhYmVsID0gQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKGxhYmVsKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICBoYXNEdXBsaWNhdGVMYWJlbHMgPSBub3JtYWxpemVkTGFiZWwgaW4gdW5pcXVlQXJpYUxhYmVscztcbiAgICAgICAgICAgICAgICAgICAgdW5pcXVlQXJpYUxhYmVsc1tub3JtYWxpemVkTGFiZWxdID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEhhcyBubyBsYWJlbCBhdCBhbGxcbiAgICAgICAgICAgICAgICAgICAgaGFzRHVwbGljYXRlTGFiZWxzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzR2xvYmFsKSB7XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZG9jLCBcIkFyaWFVdGlsX0hBU19VTklRVUVfQVJJQV9MQUJFTFNcIiwgdW5pcXVlQXJpYUxhYmVscyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICFoYXNEdXBsaWNhdGVMYWJlbHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRleHQgY29udGVudCBmcm9tIGFuIGVsZW1lbnQsIGV4Y2x1ZGluZyBzY3JpcHQgYW5kIHN0eWxlIGVsZW1lbnRzXG4gICAgICogVGhpcyBpcyBhIHNpbXBsaWZpZWQgdmVyc2lvbiB0aGF0IGRvZXNuJ3QgZ28gdGhyb3VnaCBmdWxsIGFjY2Vzc2libGUgbmFtZSBjb21wdXRhdGlvblxuICAgICAqIHRvIGF2b2lkIGNpcmN1bGFyIGRlcGVuZGVuY2llcyB3aGVuIGNhbGxlZCBmcm9tIGdldEFyaWFMYWJlbFxuICAgICAqXG4gICAgICogTm90ZTogV2hlbiBhbiBlbGVtZW50IGlzIHJlZmVyZW5jZWQgYnkgYXJpYS1sYWJlbGxlZGJ5LCBpdHMgY29udGVudCBpcyBpbmNsdWRlZFxuICAgICAqIGV2ZW4gaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIChwZXIgQVJJQSBzcGVjKVxuICAgICAqL1xuICAgIHByaXZhdGUgc3RhdGljIGdldFRleHRDb250ZW50RXhjbHVkaW5nU2NyaXB0cyhlbGVtOiBFbGVtZW50KTogc3RyaW5nIHtcbiAgICAgICAgaWYgKCFlbGVtKSByZXR1cm4gXCJcIjtcbiAgICAgICAgXG4gICAgICAgIGxldCB0ZXh0ID0gXCJcIjtcbiAgICAgICAgbGV0IG53ID0gbmV3IERPTVdhbGtlcihlbGVtKTtcbiAgICAgICAgXG4gICAgICAgIHdoaWxlIChudy5uZXh0Tm9kZSgpICYmIG53Lm5vZGUgIT09IGVsZW0gJiYgbncubm9kZSAhPT0gZWxlbS5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICBpZiAobncuYkVuZFRhZykgY29udGludWU7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBudy5ub2RlO1xuICAgICAgICAgICAgY29uc3Qgbm9kZU5hbWUgPSBub2RlLm5vZGVOYW1lID8gbm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIDogXCJcIjtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gU2tpcCBzY3JpcHQgYW5kIHN0eWxlIGVsZW1lbnRzXG4gICAgICAgICAgICBpZiAobm9kZU5hbWUgPT09ICdzY3JpcHQnIHx8IG5vZGVOYW1lID09PSAnc3R5bGUnKSB7XG4gICAgICAgICAgICAgICAgbncuYkVuZFRhZyA9IHRydWU7IC8vIFNraXAgY2hpbGRyZW5cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDMpIHsgLy8gVGV4dCBub2RlXG4gICAgICAgICAgICAgICAgLy8gSW5jbHVkZSB0ZXh0IGV2ZW4gZnJvbSBoaWRkZW4gZWxlbWVudHMgd2hlbiByZWZlcmVuY2VkIGJ5IGFyaWEtbGFiZWxsZWRieVxuICAgICAgICAgICAgICAgIGlmIChub2RlLm5vZGVWYWx1ZSAmJiBub2RlLm5vZGVWYWx1ZS50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9IFwiIFwiICsgbm9kZS5ub2RlVmFsdWUudHJpbSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMSkgeyAvLyBFbGVtZW50IG5vZGVcbiAgICAgICAgICAgICAgICAvLyBIYW5kbGUgaW1hZ2VzIC0gZ2V0IGFsdCB0ZXh0XG4gICAgICAgICAgICAgICAgaWYgKG5vZGVOYW1lID09PSAnaW1nJyAmJiAobm9kZSBhcyBFbGVtZW50KS5oYXNBdHRyaWJ1dGUoJ2FsdCcpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRleHQgKz0gXCIgXCIgKyAobm9kZSBhcyBFbGVtZW50KS5nZXRBdHRyaWJ1dGUoJ2FsdCcpLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgbncuYkVuZFRhZyA9IHRydWU7IC8vIFNraXAgY2hpbGRyZW4gb2YgaW1nXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIEhhbmRsZSBpbnB1dCB3aXRoIHR5cGU9XCJpbWFnZVwiIC0gZ2V0IGFsdCB0ZXh0XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAobm9kZU5hbWUgPT09ICdpbnB1dCcgJiYgKG5vZGUgYXMgRWxlbWVudCkuZ2V0QXR0cmlidXRlKCd0eXBlJykgPT09ICdpbWFnZScgJiYgKG5vZGUgYXMgRWxlbWVudCkuaGFzQXR0cmlidXRlKCdhbHQnKSkge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9IFwiIFwiICsgKG5vZGUgYXMgRWxlbWVudCkuZ2V0QXR0cmlidXRlKCdhbHQnKS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgIG53LmJFbmRUYWcgPSB0cnVlOyAvLyBTa2lwIGNoaWxkcmVuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gdGV4dC50cmltKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRBcmlhTGFiZWwoZWxlKSB7XG4gICAgICAgIGlmIChlbGUuaGFzQXR0cmlidXRlKSB7XG4gICAgICAgICAgICBpZiAoZWxlLmhhc0F0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKSkge1xuICAgICAgICAgICAgICAgIGxldCBsYWJlbElEcyA9IGVsZS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsbGVkYnlcIikudHJpbSgpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgICAgICBsZXQgbm9ybWFsaXplZExhYmVsID0gXCJcIjtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMCwgbGVuZ3RoID0gbGFiZWxJRHMubGVuZ3RoOyBqIDwgbGVuZ3RoOyArK2opIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsSUQgPSBsYWJlbElEc1tqXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsTm9kZSA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKGVsZSwgbGFiZWxJRCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsYWJlbE5vZGUgJiYgIURPTVV0aWwuc2FtZU5vZGUobGFiZWxOb2RlLCBlbGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2Ugb3VyIGhlbHBlciB0byBnZXQgdGV4dCBjb250ZW50IHdpdGhvdXQgY2lyY3VsYXIgZGVwZW5kZW5jeVxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsID0gQXJpYVV0aWwuZ2V0VGV4dENvbnRlbnRFeGNsdWRpbmdTY3JpcHRzKGxhYmVsTm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkTGFiZWwgKz0gQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKGxhYmVsKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbm9ybWFsaXplZExhYmVsLnRyaW0oKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlLmhhc0F0dHJpYnV0ZShcImFyaWEtbGFiZWxcIikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKGVsZS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIpKS50cmltKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRBcmlhRGVzY3JpcHRpb24oZWxlKSB7XG4gICAgICAgIGlmICghZWxlKSByZXR1cm4gXCJcIjtcbiAgICAgICAgbGV0IG5vcm1hbGl6ZWRMYWJlbCA9IFwiXCI7XG4gICAgICAgIGxldCBkZXNjID0gZWxlLmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKTtcbiAgICAgICAgaWYgKGRlc2MgJiYgZGVzYy50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGV0IGxhYmVsSURzID0gZGVzYy50cmltKCkuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDAsIGxlbmd0aCA9IGxhYmVsSURzLmxlbmd0aDsgaiA8IGxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICAgICAgbGV0IGxhYmVsSUQgPSBsYWJlbElEc1tqXTtcbiAgICAgICAgICAgICAgICBsZXQgbGFiZWxOb2RlID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQoZWxlLCBsYWJlbElEKTtcbiAgICAgICAgICAgICAgICBpZiAobGFiZWxOb2RlICYmICFET01VdGlsLnNhbWVOb2RlKGxhYmVsTm9kZSwgZWxlKSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbGFiZWwgPSBBcmlhVXRpbC5nZXRUZXh0Q29udGVudEV4Y2x1ZGluZ1NjcmlwdHMobGFiZWxOb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhYmVsICYmIGxhYmVsLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZExhYmVsICs9IENvbW1vblV0aWwubm9ybWFsaXplU3BhY2luZyhsYWJlbCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobm9ybWFsaXplZExhYmVsLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgIHJldHVybiBub3JtYWxpemVkTGFiZWwudHJpbSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVzYyA9IGVsZS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWRlc2NyaXB0aW9uXCIpO1xuICAgICAgICBpZiAoZGVzYyAmJiBkZXNjLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgcmV0dXJuIGRlc2MudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZpbmRBcmlhTGFiZWxEdXBlcyhlbGVtZW50cykge1xuICAgICAgICBsZXQgZHVwZU1hcCA9IHt9XG4gICAgICAgIGVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKGVsZSkge1xuICAgICAgICAgICAgZHVwZU1hcFtBcmlhVXRpbC5nZXRBcmlhTGFiZWwoZWxlKV0gPSAoZHVwZU1hcFtBcmlhVXRpbC5nZXRBcmlhTGFiZWwoZWxlKV0gfHwgMCkgKyAxO1xuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gZHVwZU1hcDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiByZXR1cm4gYWNjZXNzaWJsZSBuYW1lcyBmb3IgYWxsIEFUIHZpc2libGUgbGFuZG1hcmsgZWxlbWVudHMgXG4gICAgICogQHBhcmFtIGRvYyBcbiAgICAgKiBAcmV0dXJucyBcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldExhbmRtYXJrQWNjTmFtZXMoZG9jKSB7XG4gICAgICAgIGxldCBuYW1lTWFwID0gQ2FjaGVVdGlsLmdldENhY2hlKGRvYywgXCJBcmlhVXRpbF9MYW5kbWFya19BY2NOYW1lc1wiLCBudWxsKTtcbiAgICAgICAgaWYgKG5hbWVNYXAgJiYgbmFtZU1hcC5sZW5ndGggIT09IDApIFxuICAgICAgICAgICAgcmV0dXJuIG5hbWVNYXA7XG5cbiAgICAgICAgbmFtZU1hcCA9IFtdO1xuICAgICAgICBsZXQgbGFuZG1hcmtFbGVtcyA9IGRvYy5xdWVyeVNlbGVjdG9yQWxsKFxuICAgICAgICAgICAgJ2FzaWRlLFtyb2xlPVwiY29tcGxlbWVudGFyeVwiXSwgZm9vdGVyLFtyb2xlPVwiY29udGVudGluZm9cIl0sIGhlYWRlcixbcm9sZT1cImJhbm5lclwiXSwgbWFpbixbcm9sZT1cIm1haW5cIl0sIG5hdixbcm9sZT1cIm5hdmlnYXRpb25cIl0sIGZvcm0sW3JvbGU9XCJmb3JtXCJdLCBzZWN0aW9uLFtyb2xlPVwicmVnaW9uXCJdLCBhcnRpY2xlLFtyb2xlPVwiYXJ0aWNsZVwiXSwgW3JvbGU9XCJzZWFyY2hcIl0sW3JvbGU9XCJhcHBsaWNhdGlvblwiXSxbcm9sZT1cImRvY3VtZW50XCJdJ1xuICAgICAgICApO1xuXG4gICAgICAgIGlmIChsYW5kbWFya0VsZW1zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGRvYywgXCJBcmlhVXRpbF9MYW5kbWFya19BY2NOYW1lc1wiLCBuYW1lTWFwKTtcbiAgICAgICAgICAgIHJldHVybiBuYW1lTWFwO1xuICAgICAgICB9XG5cbiAgICAgICAgbGFuZG1hcmtFbGVtcy5mb3JFYWNoKGZ1bmN0aW9uIChlbGVtOiBFbGVtZW50KSB7XG4gICAgICAgICAgICAvLyBpZ25vcmUgbm9kZSB0aGF0IGlzIEFUIGhpZGRlbiBvciBpbiBhIGRpYWxvZyB0aGF0IGlzIGNvbnNpZGVyZWQgYXMgYSBzZXBhcmF0ZSBsb2NhdGlvbiBmcm9tIHRoZSByZXN0IG9mIHRoZSBtYWluIHBhZ2VcbiAgICAgICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQoZWxlbSkgJiYgQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihlbGVtLCBbXCJESUFMT0dcIl0pID09PSBudWxsICYmIEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUoZWxlbSwgXCJkaWFsb2dcIiwgdHJ1ZSkgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBsZXQgbmFtZSA9IFwiXCI7XG4gICAgICAgICAgICAgICAgbGV0IHBhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWUoZWxlbSk7XG4gICAgICAgICAgICAgICAgaWYgKHBhaXIgJiYgcGFpci5uYW1lICYmIHBhaXIubmFtZS50cmltKCkubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHBhaXIubmFtZS50cmltKCk7XG5cbiAgICAgICAgICAgICAgICAvLyBjaGVjayBuZWVzdGVkIGxhbmRtYXJrIHRvIGNhbGN1bGF0ZSB0aGUgYWNjZXNzaWJsZSBuYW1lXG4gICAgICAgICAgICAgICAgY29uc3QgYW5jZXN0b3JzID0gWy4uLmxhbmRtYXJrRWxlbXNdLmZpbHRlcigoZSkgPT4gZS5jb250YWlucyhlbGVtKSAmJiBlICE9PSBlbGVtKTtcbiAgICAgICAgICAgICAgICBpZiAoYW5jZXN0b3JzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgYW5jZXN0b3JzLmZvckVhY2goKGFuY2VzdG9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbmNlc3Rvcl9wYWlyID0gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lKGFuY2VzdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbmNlc3Rvcl9wYWlyICYmIGFuY2VzdG9yX3BhaXIubmFtZSAmJiBhbmNlc3Rvcl9wYWlyLm5hbWUudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGFuY2VzdG9yX3BhaXIubmFtZS50cmltKCkgKyBcIiBcIiArIG5hbWU7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBjb25zdCByb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKGVsZW0pO1xuICAgICAgICAgICAgICAgIG5hbWVNYXAucHVzaCh7XCJlbGVtXCIgOiBlbGVtLCBcInJvbGVcIiA6IHJvbGUsIFwibmFtZVwiOiBuYW1lfSk7ICAgIFxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZG9jLCBcIkFyaWFVdGlsX0xhbmRtYXJrX0FjY05hbWVzXCIsIG5hbWVNYXApO1xuICAgICAgICByZXR1cm4gbmFtZU1hcDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBjaGVjayBpZiB0aGUgZ2l2ZW4gZWxlbWVudCB3aXRoIHRoZSBsYW5kbWFyayByb2x3IGlzIHVuaXF1ZVxuICAgICAqIEBwYXJhbSBlbGVtZW50IFxuICAgICAqIEBwYXJhbSByb2xlOiBhIHNwZWNpZmljIGxhbmRtYXJrIHJvbGUsIG9yIFwiYW55XCIgZm9yIGFsbCBsYW5kbWFyayByb2xlICBcbiAgICAgKiBAcGFyYW0gY29uc2lkZXJOb25lTGFiZWw6IGlmIGNvbnNpZGVyIHRoZSBsYW5kbWFya3Mgd2l0aG91dCBhIGxhYmVsXG4gICAgICogQHJldHVybnMgXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpc0xhbmRtYXJrTmFtZVVuaXF1ZShlbGVtZW50LCByb2xlLCBjb25zaWRlck5vbmVMYWJlbDogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgICAgIGNvbnN0IG5hbWVNYXAgPSBBcmlhVXRpbC5nZXRMYW5kbWFya0FjY05hbWVzKGVsZW1lbnQub3duZXJEb2N1bWVudCk7XG4gICAgICAgIGxldCBleGlzdCA9IG51bGw7XG4gICAgICAgIGlmIChyb2xlID09PSAnYW55JylcbiAgICAgICAgICAgIGV4aXN0ID0gbmFtZU1hcC5maW5kKGVudHJ5ID0+IGVudHJ5LmVsZW0gPT09IGVsZW1lbnQpOyAgICAgIFxuICAgICAgICBlbHNlICAgIFxuICAgICAgICAgICAgZXhpc3QgPSBuYW1lTWFwLmZpbmQoZW50cnkgPT4gZW50cnkuZWxlbSA9PT0gZWxlbWVudCAmJiBlbnRyeS5yb2xlID09PSByb2xlKTtcblxuICAgICAgICBpZiAoIWV4aXN0KSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBuYW1lID0gZXhpc3QubmFtZTtcbiAgICAgICAgaWYgKCFjb25zaWRlck5vbmVMYWJlbCAmJiBuYW1lID09PSAnJykgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbmFtZU1hcC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKG5hbWVNYXBbaV0uZWxlbSA9PT0gZWxlbWVudCkgY29udGludWU7ICAgICBcbiAgICAgICAgICAgIGlmIChuYW1lID09PSBuYW1lTWFwW2ldLm5hbWUpIHtcbiAgICAgICAgICAgICAgICBpZiAocm9sZSA9PT0gJ2FueScpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5hbWVNYXBbaV0ucm9sZSA9PT0gcm9sZSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7IFxuICAgICAgICAgICAgfSAgICAgICAgXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIEdpdmVuIGFuIGFycmF5IG9mIGVsZW1lbnRzLCByZXR1cm4gdHJ1ZSBpZiB0aGUgZWxlbWVudHMgaGF2ZSB1bmlxdWUgQVJJQSBsYWJlbHMgZ2xvYmFsbHlcbiAgICBwdWJsaWMgc3RhdGljIGhhc1VuaXF1ZUFyaWFMYWJlbHMoZWxlbWVudHMpIHtcbiAgICAgICAgcmV0dXJuIEFyaWFVdGlsLmhhc1VuaXF1ZUFyaWFMYWJlbHNMb2NhbGx5KGVsZW1lbnRzLCB0cnVlKTtcbiAgICB9XG5cbiAgICAvLyBHaXZlbiBhbiBhcnJheSBvZiBlbGVtZW50cywgcmV0dXJuIHRydWUgaWYgdGhlIGVsZW1lbnRzIGhhdmUgdW5pcXVlIEFSSUEgbGFiZWxzXG4gICAgcHVibGljIHN0YXRpYyBoYXNEdXBsaWNhdGVBcmlhTGFiZWxzTG9jYWxseShlbGVtZW50cywgaXNHbG9iYWwpIHtcbiAgICAgICAgaWYgKGVsZW1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsZXQgZG9jID0gZWxlbWVudHNbMF0ub3duZXJEb2N1bWVudDtcblxuICAgICAgICBsZXQgaGFzRHVwbGljYXRlTGFiZWxzID0gZmFsc2U7XG4gICAgICAgIGxldCB1bmlxdWVBcmlhTGFiZWxzOiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfSA9IG51bGw7XG4gICAgICAgIGxldCBkdXBsaWNhdGVMYWJlbE5hbWVBcnJheSA9IG5ldyBBcnJheSgpO1xuXG4gICAgICAgIGlmIChpc0dsb2JhbCkge1xuICAgICAgICAgICAgdW5pcXVlQXJpYUxhYmVscyA9IENhY2hlVXRpbC5nZXRDYWNoZShkb2MsIFwiQXJpYVV0aWxfSEFTX1VOSVFVRV9BUklBX0xBQkVMU1wiLCBudWxsKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodW5pcXVlQXJpYUxhYmVscyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdW5pcXVlQXJpYUxhYmVscyA9IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7ICsraSkge1xuXG4gICAgICAgICAgICBpZiAoZWxlbWVudHNbaV0uaGFzQXR0cmlidXRlKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudHNbaV0uaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKSkge1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBhcmlhTGFiZWwgPSBDb21tb25VdGlsLm5vcm1hbGl6ZVNwYWNpbmcoZWxlbWVudHNbaV0uZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKSkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgaGFzRHVwbGljYXRlTGFiZWxzID0gYXJpYUxhYmVsIGluIHVuaXF1ZUFyaWFMYWJlbHM7XG4gICAgICAgICAgICAgICAgICAgIHVuaXF1ZUFyaWFMYWJlbHNbYXJpYUxhYmVsXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGlmICghKGFyaWFMYWJlbCBpbiBkdXBsaWNhdGVMYWJlbE5hbWVBcnJheSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGR1cGxpY2F0ZUxhYmVsTmFtZUFycmF5W2FyaWFMYWJlbF0gPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBkdXBsaWNhdGVMYWJlbE5hbWVBcnJheVthcmlhTGFiZWxdLnB1c2goZWxlbWVudHNbaV0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSk7XG5cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnRzW2ldLmhhc0F0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKSkge1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBsYWJlbElEcyA9IGVsZW1lbnRzW2ldLmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKS50cmltKCkuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbm9ybWFsaXplZExhYmVsID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDAsIGxlbmd0aCA9IGxhYmVsSURzLmxlbmd0aDsgaiA8IGxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGFiZWxJRCA9IGxhYmVsSURzW2pdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsTm9kZSA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKGVsZW1lbnRzW2ldLCBsYWJlbElEKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYWJlbE5vZGUgJiYgIURPTVV0aWwuc2FtZU5vZGUobGFiZWxOb2RlLCBlbGVtZW50c1tpXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGFiZWwgPSBBcmlhVXRpbC5nZXRUZXh0Q29udGVudEV4Y2x1ZGluZ1NjcmlwdHMobGFiZWxOb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkTGFiZWwgKz0gQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKGxhYmVsKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGhhc0R1cGxpY2F0ZUxhYmVscyA9IG5vcm1hbGl6ZWRMYWJlbCBpbiB1bmlxdWVBcmlhTGFiZWxzO1xuICAgICAgICAgICAgICAgICAgICB1bmlxdWVBcmlhTGFiZWxzW25vcm1hbGl6ZWRMYWJlbF0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIShub3JtYWxpemVkTGFiZWwgaW4gZHVwbGljYXRlTGFiZWxOYW1lQXJyYXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkdXBsaWNhdGVMYWJlbE5hbWVBcnJheVtub3JtYWxpemVkTGFiZWxdID0gbmV3IEFycmF5KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZHVwbGljYXRlTGFiZWxOYW1lQXJyYXlbbm9ybWFsaXplZExhYmVsXS5wdXNoKGVsZW1lbnRzW2ldLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNHbG9iYWwpIHtcbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShkb2MsIFwiQXJpYVV0aWxfSEFTX1VOSVFVRV9BUklBX0xBQkVMU1wiLCB1bmlxdWVBcmlhTGFiZWxzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZHVwbGljYXRlTGFiZWxOYW1lQXJyYXk7XG4gICAgfVxuXG4gICAgLy8gR2l2ZW4gYW4gYXJyYXkgb2YgZWxlbWVudHMsIHJldHVybiB0cnVlIGlmIHRoZSBlbGVtZW50cyBoYXZlIHVuaXF1ZSBBUklBIGxhYmVscyBnbG9iYWxseVxuICAgIHB1YmxpYyBzdGF0aWMgaGFzRHVwbGljYXRlQXJpYUxhYmVscyhlbGVtZW50cykge1xuICAgICAgICByZXR1cm4gQXJpYVV0aWwuaGFzRHVwbGljYXRlQXJpYUxhYmVsc0xvY2FsbHkoZWxlbWVudHMsIHRydWUpO1xuICAgIH1cblxuICAgIC8vIEdpdmVuIGFuIGFycmF5IG9mIGVsZW1lbnRzLCByZXR1cm4gdHJ1ZSBpZiB0aGUgZWxlbWVudHMgaGF2ZSB1bmlxdWUgYXJpYS1sYWJlbGxlZGJ5IGF0dHJpYnV0ZXNcbiAgICBwdWJsaWMgc3RhdGljIGhhc1VuaXF1ZUFyaWFMYWJlbGxlZGJ5KGVsZW1lbnRzKSB7XG5cbiAgICAgICAgbGV0IGhhc0R1cGxpY2F0ZUxhYmVscyA9IGZhbHNlO1xuICAgICAgICBsZXQgbGFiZWxSZWZzID0ge307XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7ICFoYXNEdXBsaWNhdGVMYWJlbHMgJiYgaSA8IGVsZW1lbnRzLmxlbmd0aDsgKytpKSB7XG5cbiAgICAgICAgICAgIGlmIChlbGVtZW50c1tpXS5oYXNBdHRyaWJ1dGUgJiYgZWxlbWVudHNbaV0uaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpICYmICFDb21tb25VdGlsLmlzSWRSZWZlclRvU2VsZihlbGVtZW50c1tpXSwgZWxlbWVudHNbaV0uZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpKSkge1xuICAgICAgICAgICAgICAgIGxldCBsYWJlbFJlZiA9IENvbW1vblV0aWwubm9ybWFsaXplU3BhY2luZyhlbGVtZW50c1tpXS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsbGVkYnlcIikpO1xuICAgICAgICAgICAgICAgIGhhc0R1cGxpY2F0ZUxhYmVscyA9IGxhYmVsUmVmIGluIGxhYmVsUmVmcztcbiAgICAgICAgICAgICAgICBsYWJlbFJlZnNbbGFiZWxSZWZdID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaGFzRHVwbGljYXRlTGFiZWxzID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gIWhhc0R1cGxpY2F0ZUxhYmVscztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB0aGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciByZXNvbHZpbmcgQVJJQSByZXF1aXJlbWVudHMgZm9yIGFuIEhUTUwgZWxlbWVudCBwZXIgQVJJQSBpbiBIVE1MXG4gICAgICogQHBhcmFtIHJ1bGVDb250ZXh0IHRoZSBIVE1MIGVsZW1lbnQgdG8gYmUgZXhhbWluZWRcbiAgICAgKiBAcmV0dXJucyBcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEVsZW1lbnRBcmlhUHJvcGVydHkocnVsZUNvbnRleHQpIHtcbiAgICAgICAgbGV0IHRhZ1Byb3BlcnR5OiBJRG9jdW1lbnRDb25mb3JtYW5jZVJlcXVpcmVtZW50ID0gQ2FjaGVVdGlsLmdldENhY2hlKHJ1bGVDb250ZXh0LCBcIkFyaWFVdGlsX0VsZW1lbnRBcmlhUHJvcGVydHlcIiwgbnVsbCk7XG4gICAgICAgIGlmICghdGFnUHJvcGVydHkpIHtcbiAgICAgICAgICAgIGxldCB0YWdOYW1lID0gbnVsbDtcbiAgICAgICAgICAgIGxldCBuYW1lID0gbnVsbDtcblxuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0LnRhZ05hbWUpIHtcbiAgICAgICAgICAgICAgICB0YWdOYW1lID0gcnVsZUNvbnRleHQudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChydWxlQ29udGV4dC5ub2RlTmFtZSkge1xuICAgICAgICAgICAgICAgIHRhZ05hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBjaGVjayBpZiB0aGUgdGFnUHJvcGVydHkgZXhpc3RzIGluIHRoZSBkb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnQgaGFzaC5cbiAgICAgICAgICAgIHRhZ1Byb3BlcnR5ID0gQVJJQURlZmluaXRpb25zLmRvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudFt0YWdOYW1lXTtcblxuICAgICAgICAgICAgLy8gVGhlIHRhZyBuZWVkcyB0byBjaGVjayBzb21lIHNwZWNpYWwgYXR0cmlidXRlc1xuICAgICAgICAgICAgaWYgKHRhZ1Byb3BlcnR5ID09PSBudWxsIHx8IHRhZ1Byb3BlcnR5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBsZXQgc3BlY2lhbFRhZ1Byb3BlcnRpZXMgPSBBUklBRGVmaW5pdGlvbnMuZG9jdW1lbnRDb25mb3JtYW5jZVJlcXVpcmVtZW50U3BlY2lhbFRhZ3NbdGFnTmFtZV07XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0YWdOYW1lKSB7IC8vIHNwZWNpYWwgY2FzZXNcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImFcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImhyZWZcIikgPyB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wid2l0aC1ocmVmXCJdIDogdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcIndpdGhvdXQtaHJlZlwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiYXJlYVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiaHJlZlwiKSA/IHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJ3aXRoLWhyZWZcIl0gOiB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wid2l0aG91dC1ocmVmXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJmaWd1cmVcIjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZjcyA9IENvbW1vblV0aWwuZ2V0Q2hpbGRCeVRhZyhydWxlQ29udGV4dCwgXCJmaWdjYXB0aW9uXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZmNzICE9PSBudWxsICYmIGZjcy5sZW5ndGggPiAwID8gdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcImNoaWxkLWZpZ2NhcHRpb25cIl0gOiB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wibm8tY2hpbGQtZmlnY2FwdGlvblwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJmb290ZXJcIjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImhlYWRlclwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUocnVsZUNvbnRleHQsIFwiYXJ0aWNsZVwiLCB0cnVlKSAhPT0gbnVsbCB8fCBBcmlhVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKHJ1bGVDb250ZXh0LCBcImNvbXBsZW1lbnRhcnlcIiwgdHJ1ZSkgIT09IG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBBcmlhVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKHJ1bGVDb250ZXh0LCBcIm5hdmlnYXRpb25cIiwgdHJ1ZSkgIT09IG51bGwgfHwgQXJpYVV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShydWxlQ29udGV4dCwgXCJyZWdpb25cIiwgdHJ1ZSkgIT09IG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBDb21tb25VdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBbXCJhcnRpY2xlXCIsIFwiYXNpZGVcIiwgXCJtYWluXCIsIFwibmF2XCIsIFwic2VjdGlvblwiXSkgIT09IG51bGwpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcImRlcy1zZWN0aW9uLWFydGljbGUtYXNpZGUtbWFpbi1uYXZcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcIm90aGVyXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJpbWdcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhbHQgPSBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhbHRcIikgPyBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhbHRcIikgOiBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRpdGxlID0gcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidGl0bGVcIikgPyBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0aXRsZVwiKSA6IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJpYVV0aWwuZ2V0QXJpYUxhYmVsKHJ1bGVDb250ZXh0KS50cmltKCkubGVuZ3RoICE9PSAwIHx8IChhbHQgIT09IG51bGwgJiYgYWx0Lmxlbmd0aCA+IDApIHx8ICh0aXRsZSAhPT0gbnVsbCAmJiB0aXRsZS5sZW5ndGggPiAwKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBpbWcgaGFzIG5vbi1lbXB0eSBhbHQgKGFsdD1cInNvbWUgdGV4dFwiIG9yIGFsdD1cIiAgXCIpIG9yIGFuIGFjY2Vzc2libGUgbmFtZSBpcyBwcm92aWRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJpbWctd2l0aC1hY2NuYW1lXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWx0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBpbWcgaGFzIGFuIGVtcHR5IGFsdCAoYWx0PVwiXCIpIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiaW1nLXdpdGhvdXQtYWNjbmFtZS1lbXB0eS1hbHRcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGltZyBsYWNrcyBhbiBhbHQgYXR0cmlidXRlIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiaW1nLXdpdGhvdXQtYWNjbmFtZS1uby1hbHRcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJpbnB1dFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwidHlwZVwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0eXBlID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidHlwZVwiKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW3R5cGVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YWdQcm9wZXJ0eSA9PT0gbnVsbCB8fCB0YWdQcm9wZXJ0eSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImNoZWNrYm94XCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJhcmlhLXByZXNzZWRcIikgPyB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiY2hlY2tib3gtd2l0aC1hcmlhLXByZXNzZWRcIl0gOiB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiY2hlY2tib3gtd2l0aG91dC1hcmlhLXByZXNzZWRcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiZW1haWxcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcImxpc3RcIikgPyB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiZW1haWwtd2l0aC1saXN0XCJdIDogdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcImVtYWlsLW5vLWxpc3RcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwic2VhcmNoXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJsaXN0XCIpID8gdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcInNlYXJjaC13aXRoLWxpc3RcIl0gOiB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wic2VhcmNoLW5vLWxpc3RcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwidGVsXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJsaXN0XCIpID8gdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcInRlbC13aXRoLWxpc3RcIl0gOiB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1widGVsLW5vLWxpc3RcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwidGV4dFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwibGlzdFwiKSA/IHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJ0ZXh0LXdpdGgtbGlzdFwiXSA6IHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJ0ZXh0LW5vLWxpc3RcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwidXJsXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJsaXN0XCIpID8gdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcInVybC13aXRoLWxpc3RcIl0gOiB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1widXJsLW5vLWxpc3RcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZmF1bHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcImxpc3RcIikgPyB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiZGVmYXVsdC13aXRoLWxpc3RcIl0gOiB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiZGVmYXVsdC1uby1saXN0XCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IHR5cGUgaXMgdGhlIHNhbWUgYXMgdHlwZT10ZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJsaXN0XCIpID8gdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcInRleHQtd2l0aC1saXN0XCJdIDogdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcInRleHQtbm8tbGlzdFwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwibGlcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpYWxUYWdQcm9wZXJ0aWVzID0gQVJJQURlZmluaXRpb25zLmRvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudFNwZWNpYWxUYWdzW1wibGlcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZUNvbnRleHQucGFyZW50RWxlbWVudCAmJiBBcmlhVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MocnVsZUNvbnRleHQucGFyZW50RWxlbWVudCwgXCJsaXN0XCIpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJjaGlsZC1vZi1saXN0LXJvbGVcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcIm5vLWNoaWxkLW9mLWxpc3Qtcm9sZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwic2VjdGlvblwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9uYW1lID0gQVJJQU1hcHBlci5jb21wdXRlTmFtZShydWxlQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL2lmIChuYW1lICYmIG5hbWUudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhYmVsID0gQXJpYVV0aWwuZ2V0QXJpYUxhYmVsKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobGFiZWwgJiYgbGFiZWwudHJpbSgpLmxlbmd0aCA+IDApIHx8IENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwidGl0bGVcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wid2l0aC1uYW1lXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wid2l0aG91dC1uYW1lXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJzZWxlY3RcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpYWxUYWdQcm9wZXJ0aWVzID0gQVJJQURlZmluaXRpb25zLmRvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudFNwZWNpYWxUYWdzW1wic2VsZWN0XCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm11bHRpcGxlXCIpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJzaXplXCIpICYmIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInNpemVcIikgPiAxKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJtdWx0aXBsZS1hdHRyLXNpemUtZ3QxXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJuby1tdWx0aXBsZS1hdHRyLXNpemUtZ3QxXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJzdW1tYXJ5XCI6XG4gICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWFsVGFnUHJvcGVydGllcyA9IEFSSUFEZWZpbml0aW9ucy5kb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnRTcGVjaWFsVGFnc1tcInN1bW1hcnlcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZUNvbnRleHQucGFyZW50RWxlbWVudCAmJiBydWxlQ29udGV4dC5wYXJlbnRFbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdkZXRhaWxzJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIERPTVV0aWwuc2FtZU5vZGUoWy4uLnJ1bGVDb250ZXh0LnBhcmVudEVsZW1lbnQuY2hpbGRyZW5dLmZpbHRlcihlbGVtID0+IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ3N1bW1hcnknKVswXSwgcnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJmaXJzdC1zdW1tYXJ5LW9mLWRldGFpbFwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wibm8tZmlyc3Qtc3VtbWFyeS1vZi1kZXRhaWxcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcInRib2R5XCI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJ0ZFwiOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwidHJcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcmlhVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKHJ1bGVDb250ZXh0LCBcInRhYmxlXCIsIHRydWUpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcImRlcy10YWJsZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJpYVV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShydWxlQ29udGV4dCwgXCJncmlkXCIsIHRydWUpIHx8IEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUocnVsZUNvbnRleHQsIFwidHJlZWdyaWRcIiwgdHJ1ZSkgPyB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiZGVzLWdyaWRcIl0gOiB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiZGVzLW90aGVyXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJ0aFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2NvcGUgPSBDb21tb25VdGlsLmdldFNjb3BlRm9yVGgocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUocnVsZUNvbnRleHQsIFwidGFibGVcIiwgdHJ1ZSkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2NvcGUgPT09ICdjb2x1bW4nKSB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiZGVzLXRhYmxlLWNvbHVtbi1zY29wZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJkZXMtdGFibGUtcm93LXNjb3BlXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChBcmlhVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKHJ1bGVDb250ZXh0LCBcImdyaWRcIiwgdHJ1ZSkgIT09IG51bGwgfHwgQXJpYVV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShydWxlQ29udGV4dCwgXCJ0cmVlZ3JpZFwiLCB0cnVlKSAhPT0gbnVsbCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjb3BlID09PSAnY29sdW1uJykgdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcImRlcy1ncmlkLXRyZWVncmlkLWNvbHVtbi1zY29wZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJkZXMtZ3JpZC10cmVlZ3JpZC1yb3ctc2NvcGVcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiZGVzLW90aGVyXCJdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImRpdlwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBydCA9IHJ1bGVDb250ZXh0LnBhcmVudEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcnQgIT09IG51bGwgJiYgcHJ0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdkbCcgPyB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiY2hpbGQtZGxcIl0gOiB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wibm8tY2hpbGQtZGxcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1Byb3BlcnR5ID0gQVJJQURlZmluaXRpb25zLmRvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudFNwZWNpYWxUYWdzW1wiZGVmYXVsdFwiXSBhcyBJRG9jdW1lbnRDb25mb3JtYW5jZVJlcXVpcmVtZW50O1xuICAgICAgICAgICAgICAgIH0gLy9zd2l0Y2hcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUocnVsZUNvbnRleHQsIFwiQXJpYVV0aWxfRWxlbWVudEFyaWFQcm9wZXJ0eVwiLCB0YWdQcm9wZXJ0eSk7XG4gICAgICAgIHJldHVybiB0YWdQcm9wZXJ0eSB8fCBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0QWxsb3dlZEFyaWFSb2xlcyhydWxlQ29udGV4dCwgcHJvcGVydGllczogSURvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudCkge1xuICAgICAgICBsZXQgYWxsb3dlZFJvbGVzOiBzdHJpbmdbXSA9IENhY2hlVXRpbC5nZXRDYWNoZShydWxlQ29udGV4dCwgXCJBcmlhVXRpbF9BbGxvd2VkQXJpYVJvbGVzXCIsIG51bGwpO1xuICAgICAgICBpZiAoIWFsbG93ZWRSb2xlcykge1xuICAgICAgICAgICAgYWxsb3dlZFJvbGVzID0gW107XG4gICAgICAgICAgICBsZXQgdGFnUHJvcGVydHk6IElEb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnQgPSBudWxsO1xuICAgICAgICAgICAgaWYgKHByb3BlcnRpZXMgIT09IG51bGwgJiYgcHJvcGVydGllcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGFnUHJvcGVydHkgPSBwcm9wZXJ0aWVzO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IEFyaWFVdGlsLmdldEVsZW1lbnRBcmlhUHJvcGVydHkocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGFnUHJvcGVydHkgIT09IG51bGwgJiYgdGFnUHJvcGVydHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGlmICh0YWdQcm9wZXJ0eS5pbXBsaWNpdFJvbGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KHRhZ1Byb3BlcnR5LmltcGxpY2l0Um9sZSwgYWxsb3dlZFJvbGVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRhZ1Byb3BlcnR5LnZhbGlkUm9sZXMgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KHRhZ1Byb3BlcnR5LnZhbGlkUm9sZXMsIGFsbG93ZWRSb2xlcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBpbXBsaWNpdFJvbGVzID0gQXJpYVV0aWwuZ2V0SW1wbGljaXRSb2xlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgICAgICBpZiAoaW1wbGljaXRSb2xlcyAmJiBpbXBsaWNpdFJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KHRhZ1Byb3BlcnR5LnZhbGlkUm9sZXMsIGFsbG93ZWRSb2xlcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKHJ1bGVDb250ZXh0LCBcIkFyaWFVdGlsX0FsbG93ZWRBcmlhUm9sZXNcIiwgYWxsb3dlZFJvbGVzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWxsb3dlZFJvbGVzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0QWxsb3dlZEFyaWFBdHRyaWJ1dGVzKHJ1bGVDb250ZXh0LCByb2xlcywgcHJvcGVydGllcykge1xuICAgICAgICBsZXQgYWxsb3dlZEF0dHJpYnV0ZXM6IHN0cmluZ1tdID0gQ2FjaGVVdGlsLmdldENhY2hlKHJ1bGVDb250ZXh0LCBcIkFyaWFVdGlsX0FsbG93ZWRBcmlhQXR0cmlidXRlc1wiLCBudWxsKTtcbiAgICAgICAgaWYgKCFhbGxvd2VkQXR0cmlidXRlcykge1xuICAgICAgICAgICAgYWxsb3dlZEF0dHJpYnV0ZXMgPSBbXTtcbiAgICAgICAgICAgIGxldCBwZXJtaXR0ZWRSb2xlcyA9IFsuLi5yb2xlc107XG4gICAgICAgICAgICBsZXQgdGFnTmFtZSA9IHJ1bGVDb250ZXh0LnRhZ05hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAgICAgbGV0IHByb2hpYml0ZWRBdHRyaWJ1dGVzID0gW107XG4gICAgICAgICAgICAvLyBFbGVtZW50IHdpdGggYSBkaXNhYmxlZCBhdHRyaWJ1dGUgIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9kaXNhYmxlZC1lbGVtZW50cy5odG1sXG4gICAgICAgICAgICBpZiAoQVJJQURlZmluaXRpb25zLmVsZW1lbnRzQWxsb3dlZERpc2FibGVkLmluZGV4T2YodGFnTmFtZSkgPiAtMSkge1xuICAgICAgICAgICAgICAgIC8vIFVzZSB0aGUgYXJpYS1kaXNhYmxlZCBhdHRyaWJ1dGUgb24gYW55IGVsZW1lbnQgdGhhdCBpcyBhbGxvd2VkIHRoZSBkaXNhYmxlZCBhdHRyaWJ1dGUgaW4gSFRNTDUuXG4gICAgICAgICAgICAgICAgYWxsb3dlZEF0dHJpYnV0ZXMgPSBDb21tb25VdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbShcImFyaWEtZGlzYWJsZWRcIiwgYWxsb3dlZEF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gRWxlbWVudCB3aXRoIGEgcmVxdWlyZWQgYXR0cmlidXRlIGh0dHA6Ly93d3cudGhlLWFydC1vZi13ZWIuY29tL2h0bWwvaHRtbDUtZm9ybS12YWxpZGF0aW9uL1xuICAgICAgICAgICAgaWYgKEFSSUFEZWZpbml0aW9ucy5lbGVtZW50c0FsbG93ZWRSZXF1aXJlZC5pbmRleE9mKHRhZ05hbWUpID4gLTEpIHtcbiAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIGFyaWEtcmVxdWlyZWQgYXR0cmlidXRlIG9uIGFueSBlbGVtZW50IHRoYXQgaXMgYWxsb3dlZCB0aGUgcmVxdWlyZWQgYXR0cmlidXRlIGluIEhUTUw1LlxuICAgICAgICAgICAgICAgIGFsbG93ZWRBdHRyaWJ1dGVzID0gQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW0oXCJhcmlhLXJlcXVpcmVkXCIsIGFsbG93ZWRBdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKEFSSUFEZWZpbml0aW9ucy5lbGVtZW50c0FsbG93ZWRSZWFkT25seS5pbmRleE9mKHRhZ05hbWUpID4gLTEpIHtcbiAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIGFyaWEtcmVhZG9ubHkgYXR0cmlidXRlIG9uIGFueSBlbGVtZW50IHRoYXQgaXMgYWxsb3dlZCB0aGUgcmVhZG9ubHkgYXR0cmlidXRlIGluIEhUTUw1LlxuICAgICAgICAgICAgICAgIGFsbG93ZWRBdHRyaWJ1dGVzID0gQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW0oXCJhcmlhLXJlYWRvbmx5XCIsIGFsbG93ZWRBdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IHRhZ1Byb3BlcnR5ID0gbnVsbDtcbiAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzICE9IG51bGwgJiYgcHJvcGVydGllcyAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgIHRhZ1Byb3BlcnR5ID0gcHJvcGVydGllcztcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IEFyaWFVdGlsLmdldEVsZW1lbnRBcmlhUHJvcGVydHkocnVsZUNvbnRleHQpO1xuXG4gICAgICAgICAgICBpZiAodGFnUHJvcGVydHkgIT09IG51bGwgJiYgdGFnUHJvcGVydHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUgaW1wbGljaXQgcm9sZSBhbGxvd2VkIGF0dHJpYnV0ZXMgdG8gdGhlIGFsbG93ZWQgcm9sZSBsaXN0IGlmIHRoZXJlIGlzIG5vIHNwZWNpZmllZCByb2xlXG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIGlmIHRoZSBlbGVtZW50IGRvZXNuJ3QgYWxsb3cgdGhlIGF0dHJpYnV0ZXMgZnJvbSB0aGUgaW1wbGljaXQgcm9sZXNcbiAgICAgICAgICAgICAgICBpZiAodGFnUHJvcGVydHkuaW1wbGljaXRSb2xlICE9PSBudWxsICYmXG4gICAgICAgICAgICAgICAgICAgIChwZXJtaXR0ZWRSb2xlcyA9PT0gbnVsbCB8fCBwZXJtaXR0ZWRSb2xlcyA9PT0gdW5kZWZpbmVkIHx8IHBlcm1pdHRlZFJvbGVzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgJiYgdGFnUHJvcGVydHkuYWxsb3dBdHRyaWJ1dGVzRnJvbUltcGxpY2l0Um9sZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFnUHJvcGVydHkuaW1wbGljaXRSb2xlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcm9sZVByb3BlcnR5ID0gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3RhZ1Byb3BlcnR5LmltcGxpY2l0Um9sZVtpXV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocm9sZVByb3BlcnR5ICE9PSBudWxsICYmIHJvbGVQcm9wZXJ0eSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHByb3BlcnRpZXMgPSByb2xlUHJvcGVydHkucHJvcHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KHByb3BlcnRpZXMsIGFsbG93ZWRBdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzID0gQXJpYVV0aWwuZ2V0Um9sZVJlcXVpcmVkUHJvcGVydGllcyh0YWdQcm9wZXJ0eS5pbXBsaWNpdFJvbGVbaV0sIHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tb25VdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QocHJvcGVydGllcywgYWxsb3dlZEF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwcm9oaWJpdGVkUHJvcHMgPSByb2xlUHJvcGVydHkucHJvaGliaXRlZFByb3BzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9oaWJpdGVkUHJvcHMgJiYgcHJvaGliaXRlZFByb3BzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdChwcm9oaWJpdGVkUHJvcHMsIHByb2hpYml0ZWRBdHRyaWJ1dGVzKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpYWwgY2FzZSBvZiBzZXBhcmF0b3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFnUHJvcGVydHkuaW1wbGljaXRSb2xlW2ldID09PSBcInNlcGFyYXRvclwiICYmIENvbW1vblV0aWwuaXNGb2N1c2FibGUocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdChbXCJhcmlhLWRpc2FibGVkXCIsIFwiYXJpYS12YWx1ZW5vd1wiLCBcImFyaWEtdmFsdWVtYXhcIiwgXCJhcmlhLXZhbHVlbWluXCIsIFwiYXJpYS12YWx1ZXRleHRcIl0sIGFsbG93ZWRBdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gQWRkaW5nIHRoZSBnbG9iYWwgcHJvcGVydGllcyB0byB0aGUgdmFsaWQgYXR0cmlidXRlIGxpc3RcbiAgICAgICAgICAgICAgICBpZiAodGFnUHJvcGVydHkuZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcHJvcGVydGllcyA9IEFSSUFEZWZpbml0aW9ucy5nbG9iYWxQcm9wZXJ0aWVzOyAvLyBnbG9iYWwgcHJvcGVydGllc1xuICAgICAgICAgICAgICAgICAgICBDb21tb25VdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QocHJvcGVydGllcywgYWxsb3dlZEF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGFkZGluZyB0aGUgb3RoZXIgcm9sZSB0byB0aGUgYWxsb3dlZCByb2xlcyBmb3IgdGhlIGF0dHJpYnV0ZXNcbiAgICAgICAgICAgIGlmICh0YWdQcm9wZXJ0eSAmJiB0YWdQcm9wZXJ0eS5vdGhlclJvbGVzRm9yQXR0cmlidXRlcyAmJiB0YWdQcm9wZXJ0eS5vdGhlclJvbGVzRm9yQXR0cmlidXRlcy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgIENvbW1vblV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdCh0YWdQcm9wZXJ0eS5vdGhlclJvbGVzRm9yQXR0cmlidXRlcywgcGVybWl0dGVkUm9sZXMpO1xuICAgICAgICAgICAgLy8gYWRkaW5nIHRoZSBzcGVjaWZpZWQgcm9sZSBwcm9wZXJ0aWVzIHRvIHRoZSBhbGxvd2VkIGF0dHJpYnV0ZSBsaXN0XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgcGVybWl0dGVkUm9sZXMgIT09IG51bGwgJiYgaSA8IHBlcm1pdHRlZFJvbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJvbGVQcm9wZXJ0aWVzID0gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3Blcm1pdHRlZFJvbGVzW2ldXTtcbiAgICAgICAgICAgICAgICBpZiAocm9sZVByb3BlcnRpZXMgIT09IG51bGwgJiYgcm9sZVByb3BlcnRpZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgdGhlIHByb3BlcnRpZXMgaWYgdGhlIGVsZW1lbnQgZG9lc24ndCBhbGxvdyBhdHRyaWJ1dGVzIGZyb20gdGhlIGltcGxpY2l0IHJvbGVcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0YWdQcm9wZXJ0eSB8fCB0YWdQcm9wZXJ0eS5pbXBsaWNpdFJvbGUgPT09IG51bGwgfHwgIXRhZ1Byb3BlcnR5LmltcGxpY2l0Um9sZS5pbmNsdWRlcyhwZXJtaXR0ZWRSb2xlc1tpXSkgfHwgKHRhZ1Byb3BlcnR5LmltcGxpY2l0Um9sZS5pbmNsdWRlcyhwZXJtaXR0ZWRSb2xlc1tpXSkgJiYgdGFnUHJvcGVydHkuYWxsb3dBdHRyaWJ1dGVzRnJvbUltcGxpY2l0Um9sZSA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHByb3BlcnRpZXMgPSByb2xlUHJvcGVydGllcy5wcm9wczsgLy8gYWxsb3dlZCBwcm9wZXJ0aWVzXG4gICAgICAgICAgICAgICAgICAgICAgICBDb21tb25VdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QocHJvcGVydGllcywgYWxsb3dlZEF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcyA9IEFyaWFVdGlsLmdldFJvbGVSZXF1aXJlZFByb3BlcnRpZXMocGVybWl0dGVkUm9sZXNbaV0sIHJ1bGVDb250ZXh0KTsgLy8gcmVxdWlyZWQgcHJvcGVydGllc1xuICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KHByb3BlcnRpZXMsIGFsbG93ZWRBdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZXQgcHJvaGliaXRlZFByb3BzID0gcm9sZVByb3BlcnRpZXMucHJvaGliaXRlZFByb3BzO1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJvaGliaXRlZFByb3BzICYmIHByb2hpYml0ZWRQcm9wcy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KHByb2hpYml0ZWRQcm9wcywgcHJvaGliaXRlZEF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIHNlcGFyYXRvclxuICAgICAgICAgICAgICAgICAgICBpZiAocGVybWl0dGVkUm9sZXNbaV0gPT09IFwic2VwYXJhdG9yXCIgJiYgQ29tbW9uVXRpbC5pc0ZvY3VzYWJsZShydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdChbXCJhcmlhLWRpc2FibGVkXCIsIFwiYXJpYS12YWx1ZW1heFwiLCBcImFyaWEtdmFsdWVtaW5cIiwgXCJhcmlhLXZhbHVldGV4dFwiXSwgYWxsb3dlZEF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBpZ25vcmUgYXJpYS1sZXZlbCwgYXJpYS1zZXRzaXplIG9yIGFyaWEtcG9zaW5zZXQgaWYgXCJyb3dcIiBpcyBub3QgaW4gdHJlZWdyaWRcbiAgICAgICAgICAgIGlmIChwZXJtaXR0ZWRSb2xlcy5pbmNsdWRlcyhcInJvd1wiKSAmJiBBcmlhVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKHJ1bGVDb250ZXh0LCBcInRyZWVncmlkXCIsIHRydWUpID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSAtMTtcbiAgICAgICAgICAgICAgICBpZiAoKGluZGV4ID0gYWxsb3dlZEF0dHJpYnV0ZXMuaW5kZXhPZihcImFyaWEtbGV2ZWxcIikpID4gLTEpXG4gICAgICAgICAgICAgICAgICAgIGFsbG93ZWRBdHRyaWJ1dGVzLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoKGluZGV4ID0gYWxsb3dlZEF0dHJpYnV0ZXMuaW5kZXhPZihcImFyaWEtc2V0c2l6ZVwiKSkgPiAtMSlcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dlZEF0dHJpYnV0ZXMuc3BsaWNlKGluZGV4LCAxKTtcblxuICAgICAgICAgICAgICAgIGlmICgoaW5kZXggPSBhbGxvd2VkQXR0cmlidXRlcy5pbmRleE9mKFwiYXJpYS1wb3NpbnNldFwiKSkgPiAtMSlcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dlZEF0dHJpYnV0ZXMuc3BsaWNlKGluZGV4LCAxKTtcblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBhZGQgdGhlIG90aGVyIGFsbG93ZWQgYXR0cmlidXRlcyBmb3IgdGhlIGVsZW1lbnRcbiAgICAgICAgICAgIGlmICh0YWdQcm9wZXJ0eSAmJiB0YWdQcm9wZXJ0eS5vdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlcyAmJiB0YWdQcm9wZXJ0eS5vdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgLy8gY2hlY2sgYXR0cmlidXRlLXZhbHVlIHBhaXIgaWYgZXhpc3RzXG4gICAgICAgICAgICAgICAgbGV0IGFsbG93ZWQgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBwID0gMDsgcCA8IHRhZ1Byb3BlcnR5Lm90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzLmxlbmd0aDsgcCsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGF0dHIgPSB0YWdQcm9wZXJ0eS5vdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlc1twXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGF0dHIuaW5jbHVkZXMoXCI9XCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYWlyID0gYXR0ci5zcGxpdChcIj1cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKHBhaXJbMF0pID09PSBwYWlyWzFdKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWQucHVzaChwYWlyWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkLnB1c2goYXR0cik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChhbGxvd2VkLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdChhbGxvd2VkLCBhbGxvd2VkQXR0cmlidXRlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBhZGQgdGhlIG90aGVyIHByb2hpYml0dGVkIGF0dHJpYnV0ZXMgZm9yIHRoZSBlbGVtZW50XG4gICAgICAgICAgICBpZiAodGFnUHJvcGVydHkgJiYgdGFnUHJvcGVydHkub3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXMgJiYgdGFnUHJvcGVydHkub3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIC8vIGNoZWNrIGF0dHJpYnV0ZS12YWx1ZSBwYWlyIGlmIGV4aXN0c1xuICAgICAgICAgICAgICAgIGxldCBkaXNhbGxvd2VkID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgcCA9IDA7IHAgPCB0YWdQcm9wZXJ0eS5vdGhlckRpc2FsbG93ZWRBcmlhQXR0cmlidXRlcy5sZW5ndGg7IHArKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhdHRyID0gdGFnUHJvcGVydHkub3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXNbcF07XG4gICAgICAgICAgICAgICAgICAgIGlmIChhdHRyLmluY2x1ZGVzKFwiPVwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFpciA9IGF0dHIuc3BsaXQoXCI9XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShwYWlyWzBdKSA9PT0gcGFpclsxXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhbGxvd2VkLnB1c2gocGFpclswXSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWxsb3dlZC5wdXNoKGF0dHIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZGlzYWxsb3dlZC5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICBDb21tb25VdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QoZGlzYWxsb3dlZCwgcHJvaGliaXRlZEF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy9leGNsdWRlIHRoZSBwcm9oaWJpdGVkQXR0cmlidXRlcyBmcm9tIHRoZSBhbGxvd2VkQXR0cmlidXRlc1xuICAgICAgICAgICAgYWxsb3dlZEF0dHJpYnV0ZXMgPSBDb21tb25VdGlsLnJlZHVjZUFycmF5SXRlbUxpc3QocHJvaGliaXRlZEF0dHJpYnV0ZXMsIGFsbG93ZWRBdHRyaWJ1dGVzKTtcblxuICAgICAgICAgICAgLy9leGNsdWRlIGFyaWEgYXR0cmlidXRlIGZvciBlbGVtZW50cyB3aXRob3V0IGltcGxpY2l0IHJvbGUgYW5kIHdpdGggJ05hbWluZyBQcm9oaWJpdGVkJ1xuICAgICAgICAgICAgaWYgKCghcm9sZXMgfHwgcm9sZXMubGVuZ3RoID09PSAwKSAmJiB0YWdQcm9wZXJ0eS5pbXBsaWNpdFJvbGUgPT09IG51bGwgJiYgdGFnUHJvcGVydHkucHJvaGliaXRlZEFyaWFBdHRyaWJ1dGVzV2hlbk5vSW1wbGljaXRSb2xlKVxuICAgICAgICAgICAgICAgIGFsbG93ZWRBdHRyaWJ1dGVzID0gQ29tbW9uVXRpbC5yZWR1Y2VBcnJheUl0ZW1MaXN0KHRhZ1Byb3BlcnR5LnByb2hpYml0ZWRBcmlhQXR0cmlidXRlc1doZW5Ob0ltcGxpY2l0Um9sZSwgYWxsb3dlZEF0dHJpYnV0ZXMpO1xuXG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUocnVsZUNvbnRleHQsIFwiQXJpYVV0aWxfQWxsb3dlZEFyaWFBdHRyaWJ1dGVzXCIsIGFsbG93ZWRBdHRyaWJ1dGVzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWxsb3dlZEF0dHJpYnV0ZXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEBwYXJhbSBhcmlhQXR0ciBcbiAgICAgKiBAcGFyYW0gaHRtbEF0dHJzIFxuICAgICAqIEB0eXBlOiBjb25mbGljdCBvciBvdmVybGFwcGluZ1xuICAgICAqIEByZXR1cm5zIGh0bWxBdHRyTmFtZSwgJ1Bhc3MnIG9yIG51bGxcbiAgICAgKiAgICAgICAgIGh0bWxBdHRyTmFtZSB0aGF0IGNvbmZsaWN0cyB3aXRoIHRoZSBhcmlhQXR0ciwgXG4gICAgICogICAgICAgICAnUGFzcycgd2l0aCBubyBjb25mbGljdCB3aXRoIHRoZSBhcmlhQXR0ciwgXG4gICAgICogICAgICAgICBvciBudWxsIHdoZXJlIGFyaWFBdHRyIHdvbid0IGNhdXNlIGNvbmZsaWN0XG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRDb25mbGljdE9yT3ZlcmxhcHBpbmdIdG1sQXR0cmlidXRlKGFyaWFBdHRyLCBodG1sQXR0cnMsIHR5cGUpOiBhbnlbXSB8IG51bGwge1xuICAgICAgICBsZXQgZXhpc3QgPSBBUklBRGVmaW5pdGlvbnMucmVsYXRlZEFyaWFIdG1sQXR0cmlidXRlc1thcmlhQXR0clsnbmFtZSddXTtcbiAgICAgICAgaWYgKGV4aXN0KSB7XG4gICAgICAgICAgICBpZiAoIWFyaWFBdHRyIHx8IGFyaWFBdHRyLmxlbmd0aCA9PSAwIHx8ICFodG1sQXR0cnMgfHwgaHRtbEF0dHJzLmxlbmd0aCA9PSAwKSByZXR1cm4gW107XG5cbiAgICAgICAgICAgIGxldCBleGFtaW5lZEh0bWxBdHJOYW1lcyA9IFtdO1xuICAgICAgICAgICAgbGV0IGNvbmNlcm5UeXBlcyA9IG51bGw7XG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gJ2NvbmZsaWN0Jykge1xuICAgICAgICAgICAgICAgIGlmICghZXhpc3QuY29uZmxpY3QgfHwgT2JqZWN0LmtleXMoZXhpc3QuY29uZmxpY3QpLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgY29uY2VyblR5cGVzID0gZXhpc3QuY29uZmxpY3Q7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdvdmVybGFwcGluZycpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWV4aXN0Lm92ZXJsYXBwaW5nIHx8IE9iamVjdC5rZXlzKGV4aXN0Lm92ZXJsYXBwaW5nKS5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIGNvbmNlcm5UeXBlcyA9IGV4aXN0Lm92ZXJsYXBwaW5nO1xuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgICAgIGxldCBhcHBsaWNhYmxlID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgZmFpbCA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBjb25jZXJuVHlwZXMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgY29uY2VybkFyaWFWYWx1ZSA9IGNvbmNlcm5UeXBlc1trXS5hcmlhQXR0cmlidXRlVmFsdWU7XG4gICAgICAgICAgICAgICAgbGV0IGNvbmNlcm5IdG1sTmFtZXMgPSBjb25jZXJuVHlwZXNba10uaHRtbEF0dHJpYnV0ZU5hbWVzO1xuICAgICAgICAgICAgICAgIGxldCBjb25jZXJuSHRtbFZhbHVlcyA9IGNvbmNlcm5UeXBlc1trXS5odG1sQXR0cmlidXRlVmFsdWVzO1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBodG1sQXR0cnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gY29uY2Vybkh0bWxOYW1lcy5pbmRleE9mKGh0bWxBdHRyc1tpXVsnbmFtZSddKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYWJsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaHRtbFZhbHVlc0luQ29uY2VybiA9IChjb25jZXJuSHRtbFZhbHVlcyA9PT0gbnVsbCB8fCBjb25jZXJuSHRtbFZhbHVlc1tpbmRleF0gPT09IG51bGwpID8gbnVsbCA6IGNvbmNlcm5IdG1sVmFsdWVzW2luZGV4XS5zcGxpdChcIixcIik7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25jZXJuQXJpYVZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGh0bWxWYWx1ZXNJbkNvbmNlcm4gPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhhbWluZWRIdG1sQXRyTmFtZXMucHVzaCh7IHJlc3VsdDogJ0ZhaWxlZCcsICdhdHRyJzogaHRtbEF0dHJzW2ldWyduYW1lJ10gfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaHRtbFZhbHVlc0luQ29uY2Vybi5pbmNsdWRlcyhodG1sQXR0cnNbaV1bJ3ZhbHVlJ10pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4YW1pbmVkSHRtbEF0ck5hbWVzLnB1c2goeyByZXN1bHQ6ICdGYWlsZWQnLCAnYXR0cic6IGh0bWxBdHRyc1tpXVsnbmFtZSddIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGh0bWxWYWx1ZXNJbkNvbmNlcm4gPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uY2VybkFyaWFWYWx1ZSA9PT0gYXJpYUF0dHJbJ3ZhbHVlJ10pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhhbWluZWRIdG1sQXRyTmFtZXMucHVzaCh7IHJlc3VsdDogJ0ZhaWxlZCcsICdhdHRyJzogaHRtbEF0dHJzW2ldWyduYW1lJ10gfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uY2VybkFyaWFWYWx1ZSA9PT0gJ1ZBTFVFJyAmJiBodG1sVmFsdWVzSW5Db25jZXJuLmluY2x1ZGVzKCdWQUxVRScpICYmIGh0bWxWYWx1ZXNJbkNvbmNlcm5bMF0gIT09IGFyaWFBdHRyWyd2YWx1ZSddKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhhbWluZWRIdG1sQXRyTmFtZXMucHVzaCh7IHJlc3VsdDogJ0ZhaWxlZCcsICdhdHRyJzogaHRtbEF0dHJzW2ldWyduYW1lJ10gfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbmNlcm5BcmlhVmFsdWUgPT09IGFyaWFBdHRyWyd2YWx1ZSddICYmIGh0bWxWYWx1ZXNJbkNvbmNlcm4uaW5jbHVkZXMoaHRtbEF0dHJzW2ldWyd2YWx1ZSddKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4YW1pbmVkSHRtbEF0ck5hbWVzLnB1c2goeyByZXN1bHQ6ICdGYWlsZWQnLCAnYXR0cic6IGh0bWxBdHRyc1tpXVsnbmFtZSddIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoYXBwbGljYWJsZSAmJiAhZmFpbClcbiAgICAgICAgICAgICAgICBleGFtaW5lZEh0bWxBdHJOYW1lcy5wdXNoKHsgcmVzdWx0OiAnUGFzcycsICdhdHRyJzogJycgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiBleGFtaW5lZEh0bWxBdHJOYW1lcztcbiAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNvbnRhaW5zUHJlc2VudGF0aW9uYWxDaGlsZHJlbk9ubHkoZWxlbTogSFRNTEVsZW1lbnQpOiBib29sZWFuIHtcbiAgICAgICAgbGV0IHJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXMoZWxlbSwgZmFsc2UpO1xuICAgICAgICAvLyBpZiBleHBsaWNpdCByb2xlIGRvZXNuJ3QgZXhpc3QsIGdldCB0aGUgaW1wbGljaXQgb25lXG4gICAgICAgIGlmICghcm9sZXMgfHwgcm9sZXMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcm9sZXMgPSBBcmlhVXRpbC5nZXRJbXBsaWNpdFJvbGUoZWxlbSk7XG5cbiAgICAgICAgLy9pZ25vcmUgaWYgdGhlIGVsZW1lbnQgZG9lc24ndCBoYXZlIGFueSBleHBsaWNpdCBvciBpbXBsaWNpdCByb2xlLCBzaG91bGRuJ3QgaGFwcGVuXG4gICAgICAgIGlmICghcm9sZXMgfHwgcm9sZXMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyByb2xlcyAhPT0gbnVsbCAmJiBpIDwgcm9sZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCByb2xlUHJvcGVydGllcyA9IEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlc1tpXV07XG4gICAgICAgICAgICBpZiAocm9sZVByb3BlcnRpZXMgIT09IG51bGwgJiYgcm9sZVByb3BlcnRpZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGxldCBwcmVzZW50aW9uYWwgPSByb2xlUHJvcGVydGllcy5wcmVzZW50YXRpb25hbENoaWxkcmVuO1xuICAgICAgICAgICAgICAgIGlmIChwcmVzZW50aW9uYWwgPT09IHRydWUpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHNob3VsZEJlUHJlc2VudGF0aW9uYWxDaGlsZChlbGVtZW50OiBIVE1MRWxlbWVudCk6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgd2Fsa05vZGU6IEVsZW1lbnQgPSBET01XYWxrZXIucGFyZW50RWxlbWVudChlbGVtZW50KTtcbiAgICAgICAgd2hpbGUgKHdhbGtOb2RlKSB7XG4gICAgICAgICAgICBpZiAoQXJpYVV0aWwuY29udGFpbnNQcmVzZW50YXRpb25hbENoaWxkcmVuT25seSh3YWxrTm9kZSBhcyBIVE1MRWxlbWVudCkpIHJldHVybiB0cnVlO1xuXG4gICAgICAgICAgICAvL2FyaWEtb3duIGNhc2U6IGlmIHRoZSBlbGVtZW50IGlzIHJlZmVycmVkIGJ5IGFuIGFyaWEtd29uXG4gICAgICAgICAgICB3YWxrTm9kZSA9IEFSSUFNYXBwZXIuZ2V0QXJpYU93bmVkQnkod2Fsa05vZGUgYXMgSFRNTEVsZW1lbnQpIHx8IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KHdhbGtOb2RlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyogXG4gKiBjaGVjayBpZiBhbnkgZXhwbGljaXQgcm9sZSBzcGVjaWZpZWQgZm9yIHRoZSBlbGVtZW50IGlzIGEgdmFsaWQgQVJJQSByb2xlXG4gKiByZXR1cm46IG51bGwgaWYgbm8gZXhwbGljaXQgcm9sZSBpcyBkZWZpbmVkLCBcbiAqICAgICAgICAgdHJ1ZSBpZiB0aGUgcm9sZShzKSBhcmUgZGVmaW5lZCBpbiBBUklBXG4gKiAgICAgICAgIGZhbHNlIGlmIGFueSByb2xlIGlzIG5vdCBkZWZpbmVkIGluIEFSSUFcbiovXG4gICAgcHVibGljIHN0YXRpYyBhcmVSb2xlc0RlZmluZWQocm9sZXM6IHN0cmluZ1tdKSB7XG4gICAgICAgIGlmICghcm9sZXMgfHwgcm9sZXMubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgZGVzaWduUGF0dGVybnMgPSBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnM7XG4gICAgICAgIGZvciAoY29uc3Qgcm9sZSBvZiByb2xlcylcbiAgICAgICAgICAgIGlmICghKHJvbGUudG9Mb3dlckNhc2UoKSBpbiBkZXNpZ25QYXR0ZXJucykpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qIFxuICAgICAqIGNoZWNrIGlmIGFueSBleHBsaWNpdCByb2xlIHNwZWNpZmllZCBmb3IgdGhlIGVsZW1lbnQgaXMgYSB2YWxpZCBBUklBIHJvbGVcbiAgICAgKiByZXR1cm46IG51bGwgaWYgbm8gZXhwbGljaXQgcm9sZSBpcyBkZWZpbmVkLCBcbiAgICAgKiAgICAgICAgIHRydWUgaWYgdGhlIHJvbGUocykgYXJlIGRlZmluZWQgaW4gQVJJQVxuICAgICAqICAgICAgICAgZmFsc2UgaWYgYW55IHJvbGUgaXMgbm90IGRlZmluZWQgaW4gQVJJQVxuICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnZhbGlkUm9sZXMocnVsZUNvbnRleHQ6IEVsZW1lbnQpIHtcbiAgICAgICAgbGV0IGRvbVJvbGVzOiBzdHJpbmdbXSA9IEFyaWFVdGlsLmdldFVzZXJEZWZpbmVkUm9sZXMocnVsZUNvbnRleHQpO1xuXG4gICAgICAgIGlmICghZG9tUm9sZXMgfHwgZG9tUm9sZXMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gY2hlY2sgdGhlICdnZW5lcmljJyByb2xlIGZpcnN0XG4gICAgICAgIGlmIChkb21Sb2xlcyAmJiBkb21Sb2xlcy5pbmNsdWRlcygnZ2VuZXJpYycpKVxuICAgICAgICAgICAgcmV0dXJuIFtcImdlbmVyaWNcIl07XG5cbiAgICAgICAgLy8gRmFpbGluZyByb2xlc1xuICAgICAgICBsZXQgZmFpbFJvbGVUb2tlbnMgPSBbXTtcbiAgICAgICAgLy8gUGFzc2luZyByb2xlc1xuICAgICAgICBsZXQgcGFzc1JvbGVUb2tlbnMgPSBbXTtcblxuICAgICAgICBsZXQgdGFnUHJvcGVydHkgPSBBcmlhVXRpbC5nZXRFbGVtZW50QXJpYVByb3BlcnR5KHJ1bGVDb250ZXh0KTtcbiAgICAgICAgbGV0IGFsbG93ZWRSb2xlcyA9IEFyaWFVdGlsLmdldEFsbG93ZWRBcmlhUm9sZXMocnVsZUNvbnRleHQsIHRhZ1Byb3BlcnR5KTtcbiAgICAgICAgaWYgKCFhbGxvd2VkUm9sZXMgfHwgYWxsb3dlZFJvbGVzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiBkb21Sb2xlcztcblxuICAgICAgICBsZXQgaW52YWxpZFJvbGVzID0gW107XG5cbiAgICAgICAgaWYgKGFsbG93ZWRSb2xlcy5pbmNsdWRlcygnYW55JykpXG4gICAgICAgICAgICByZXR1cm4gW107XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkb21Sb2xlcy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGlmICghYWxsb3dlZFJvbGVzLmluY2x1ZGVzKGRvbVJvbGVzW2ldKSAmJiAhaW52YWxpZFJvbGVzLmluY2x1ZGVzKGRvbVJvbGVzW2ldKSlcbiAgICAgICAgICAgICAgICBpbnZhbGlkUm9sZXMucHVzaChkb21Sb2xlc1tpXSk7XG5cbiAgICAgICAgcmV0dXJuIGludmFsaWRSb2xlcztcbiAgICB9XG5cbiAgICAvKiBcbiAgICAgKiBjaGVjayBpZiBhbnkgZXhwbGljaXQgcm9sZSBzcGVjaWZpZWQgZm9yIHRoZSBlbGVtZW50IGlzIG5vdCBkZWZpbmVkIGluIEFSSUFcbiAgICAgKiByZXR1cm46IGxpc3Qgb2Ygc3BlY2lmaWVkIHJvbGVzIG5vdCBkZWZpbmVkIGluIEFSSUFcbiAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Um9sZXNVbmRlZmluZWRCeUFyaWEoZWxlbWVudDogRWxlbWVudCkge1xuICAgICAgICBpZiAoIWVsZW1lbnQpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IHJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXMoZWxlbWVudCwgZmFsc2UpO1xuICAgICAgICBsZXQgdW5kZWZpbmVkUm9sZXMgPSBbXTtcbiAgICAgICAgaWYgKHJvbGVzICYmIHJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxldCBkZXNpZ25QYXR0ZXJucyA9IEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJucztcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm9sZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoIShyb2xlc1tpXSBpbiBkZXNpZ25QYXR0ZXJucykpIHtcbiAgICAgICAgICAgICAgICAgICAgdW5kZWZpbmVkUm9sZXMucHVzaChyb2xlc1tpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWRSb2xlcztcbiAgICB9XG5cbiAgICAvKiBcbiAgICAgKiB0aGlzIG1ldGhvZCBmaXJzdCBjaGVja3MgZXhwbGljaXQgcm9sZXMsIGlmIG5vIGV4cGxpY2l0IHJvbGUsIGl0IHdpbGwgY2hlY2sgdGhlIGltcGxpY2l0IHJvbGVcbiAgICAgKiByZXR1cm46IG51bGwgaWYgYW55IGV4cGxpY2l0IHJvbGUgaXMgaW52YWxpZCwgXG4gICAgICogICAgICAgICBhIGxpc3Qgb2YgaW52YWxpZCBhdHRyaWJ1dGVzXG4gICAgICogICAgICAgICBlbXB0eSBsaXN0IGlmIGFsbCBhdHRyaWJ1dGVzIGFyZSB2YWxpZCwgb3Igbm8gYXJpYSBhdHRyaWJ1dGVzIGFyZSBzcGVjaWZpZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEludmFsaWRBcmlhQXR0cmlidXRlcyhydWxlQ29udGV4dDogRWxlbWVudCk6IHN0cmluZ1tdIHtcbiAgICAgICAgbGV0IHJvbGVzID0gQXJpYVV0aWwuZ2V0VXNlckRlZmluZWRSb2xlcyhydWxlQ29udGV4dCk7XG5cbiAgICAgICAgLy8gdGhlIGludmFsaWQgcm9sZSBjYXNlOiBoYW5kbGVkIGJ5IFJwdF9BcmlhX1ZhbGlkUm9sZS4gSWdub3JlIHRvIGF2b2lkIGR1cGxpY2F0ZWQgcmVwb3J0XG4gICAgICAgIC8vIGZvciBtdXRpcGxlIHJvbGVzLCBza2lwIGlmIGFueSByb2xlIGlzIGludmFsaWRcbiAgICAgICAgbGV0IGRlZmluZWQgPSBBcmlhVXRpbC5hcmVSb2xlc0RlZmluZWQocm9sZXMpO1xuICAgICAgICBpZiAoZGVmaW5lZCAhPT0gbnVsbCAmJiAhZGVmaW5lZClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCBhdHRycyA9IFtdO1xuICAgICAgICBpZiAoIXJvbGVzIHx8IHJvbGVzLmxlbmd0aCA9PSAwKVxuICAgICAgICAgICAgcm9sZXMgPSBBcmlhVXRpbC5nZXRJbXBsaWNpdFJvbGUocnVsZUNvbnRleHQpO1xuXG4gICAgICAgIGxldCBhcmlhX2F0dHJzOiBzdHJpbmdbXSA9IEFyaWFVdGlsLmdldFVzZXJEZWZpbmVkQXJpYUF0dHJpYnV0ZXMocnVsZUNvbnRleHQpO1xuXG4gICAgICAgIGxldCB0YWdQcm9wZXJ0eSA9IEFyaWFVdGlsLmdldEVsZW1lbnRBcmlhUHJvcGVydHkocnVsZUNvbnRleHQpO1xuICAgICAgICAvLyBBdHRyaWJ1dGVzIGFsbG93ZWQgb24gdGhpcyBub2RlXG4gICAgICAgIGxldCBhbGxvd2VkQXR0cmlidXRlcyA9IEFyaWFVdGlsLmdldEFsbG93ZWRBcmlhQXR0cmlidXRlcyhydWxlQ29udGV4dCwgcm9sZXMsIHRhZ1Byb3BlcnR5KTtcblxuICAgICAgICBpZiAoYXJpYV9hdHRycykge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmlhX2F0dHJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGF0dHJOYW1lID0gYXJpYV9hdHRyc1tpXS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWFsbG93ZWRBdHRyaWJ1dGVzLmluY2x1ZGVzKGF0dHJOYW1lKSAmJiAhYXR0cnMuaW5jbHVkZXMoYXR0ck5hbWUpKVxuICAgICAgICAgICAgICAgICAgICBhdHRycy5wdXNoKGF0dHJOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXR0cnM7XG4gICAgfVxuXG4gICAgLyogXG4gICAgICogZ2V0IGNvbmZsaWN0IEFyaWEgYW5kIEh0bWwgYXR0cmlidXRlc1xuICAgICAqIHJldHVybjogYSBsaXN0IG9mIEFyaWEgYW5kIEh0bWwgYXR0cmlidXRlIHBhaXJzIHRoYXQgYXJlIGNvbmZsaWN0XG4gICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldENvbmZsaWN0QXJpYUFuZEh0bWxBdHRyaWJ1dGVzKGVsZW06IEVsZW1lbnQpIHtcblxuICAgICAgICBsZXQgYXJpYUF0dHJzID0gQXJpYVV0aWwuZ2V0VXNlckRlZmluZWRBcmlhQXR0cmlidXRlTmFtZVZhbHVlUGFpcnMoZWxlbSk7XG4gICAgICAgIGxldCBodG1sQXR0cnMgPSBBcmlhVXRpbC5nZXRVc2VyRGVmaW5lZEh0bWxBdHRyaWJ1dGVOYW1lVmFsdWVQYWlycyhlbGVtKTtcblxuICAgICAgICBsZXQgcmV0ID0gW107XG4gICAgICAgIGlmIChhcmlhQXR0cnMgJiYgYXJpYUF0dHJzLmxlbmd0aCA+IDAgJiYgaHRtbEF0dHJzICYmIGh0bWxBdHRycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyaWFBdHRycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4YW1pbmVkSHRtbEF0ck5hbWVzID0gQXJpYVV0aWwuZ2V0Q29uZmxpY3RPck92ZXJsYXBwaW5nSHRtbEF0dHJpYnV0ZShhcmlhQXR0cnNbaV0sIGh0bWxBdHRycywgJ2NvbmZsaWN0Jyk7XG4gICAgICAgICAgICAgICAgaWYgKGV4YW1pbmVkSHRtbEF0ck5hbWVzID09PSBudWxsKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBleGFtaW5lZEh0bWxBdHJOYW1lcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbVsncmVzdWx0J10gPT09ICdGYWlsZWQnKSAvL2ZhaWxlZFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0LnB1c2goeyAnYXJpYUF0dHInOiBhcmlhQXR0cnNbaV1bJ25hbWUnXSwgJ2h0bWxBdHRyJzogaXRlbVsnYXR0ciddIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuXG4gICAgLyogXG4gICAgICogZ2V0IGRlcHJlY2F0ZWQgQXJpYSByb2xlc1xuICAgICAqIHJldHVybjogYSBsaXN0IG9mIGRlcHJlY2F0ZWQgQXJpYSByb2xlc1xuICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXREZXByZWNhdGVkQXJpYVJvbGVzKGVsZW1lbnQ6IEVsZW1lbnQpIHtcbiAgICAgICAgaWYgKCFlbGVtZW50KSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCByb2xlcyA9IEFyaWFVdGlsLmdldFJvbGVzKGVsZW1lbnQsIGZhbHNlKTtcbiAgICAgICAgbGV0IHJldCA9IFtdO1xuICAgICAgICBpZiAocm9sZXMgJiYgcm9sZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgZ2xvYmFsRGVwcmVjYXRlZFJvbGVzID0gQVJJQURlZmluaXRpb25zLmdsb2JhbERlcHJlY2F0ZWRSb2xlcztcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm9sZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoZ2xvYmFsRGVwcmVjYXRlZFJvbGVzLmluY2x1ZGVzKHJvbGVzW2ldKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0LnB1c2gocm9sZXNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuXG4gICAgLyogXG4gICAgICogZ2V0IGRlcHJlY2F0ZWQgQXJpYSByb2xlLWF0dHJpYnV0ZXNcbiAgICAgKiByZXR1cm46IGEgbGlzdCBvZiBkZXByZWNhdGVkIEFyaWEgcm9sZS1hdHRyaWJ1dGVzIHBhcmlzXG4gICAgICogICAgICAgICBmb3IgZ2xvYmFsIHRoZSByb2xlIGlzIG1hcmtlZCBhcyAnYW55J1xuICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXREZXByZWNhdGVkQXJpYUF0dHJpYnV0ZXMoZWxlbWVudDogRWxlbWVudCkge1xuICAgICAgICBpZiAoIWVsZW1lbnQpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCBkb21BdHRyaWJ1dGVzID0gZWxlbWVudC5hdHRyaWJ1dGVzO1xuICAgICAgICBsZXQgYXJpYUF0dHJzID0gW107XG4gICAgICAgIGlmIChkb21BdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRvbUF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgYXR0ck5hbWUgPSBkb21BdHRyaWJ1dGVzW2ldLm5hbWU7XG4gICAgICAgICAgICAgICAgaWYgKGF0dHJOYW1lLnN1YnN0cmluZygwLCA1KSA9PT0gJ2FyaWEtJylcbiAgICAgICAgICAgICAgICAgICAgYXJpYUF0dHJzLnB1c2goYXR0ck5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChhcmlhQXR0cnMubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG5cbiAgICAgICAgbGV0IHJldCA9IFtdO1xuICAgICAgICBjb25zdCBnbG9iYWxEZXByZWNhdGVkQXR0cmlidXRlcyA9IEFSSUFEZWZpbml0aW9ucy5nbG9iYWxEZXByZWNhdGVkUHJvcGVydGllcztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmlhQXR0cnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChnbG9iYWxEZXByZWNhdGVkQXR0cmlidXRlcy5pbmNsdWRlcyhhcmlhQXR0cnNbaV0pKVxuICAgICAgICAgICAgICAgIHJldC5wdXNoKHsgXCJyb2xlXCI6IFwiYW55XCIsIFwiYXR0cmlidXRlXCI6IGFyaWFBdHRyc1tpXSB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByb2xlcyA9IEFyaWFVdGlsLmdldFJvbGVzKGVsZW1lbnQsIGZhbHNlKTtcbiAgICAgICAgaWYgKHJvbGVzICYmIHJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm9sZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCByb2xlV2l0aERlcHJlY2F0ZWRBdHRyaWJ1dGVzID0gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVzW2ldXTtcbiAgICAgICAgICAgICAgICBpZiAocm9sZVdpdGhEZXByZWNhdGVkQXR0cmlidXRlcykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXByZWNhdGVkQXR0cmlOYW1lcyA9IHJvbGVXaXRoRGVwcmVjYXRlZEF0dHJpYnV0ZXNbJ2RlcHJlY2F0ZWRQcm9wcyddO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGVwcmVjYXRlZEF0dHJpTmFtZXMgJiYgZGVwcmVjYXRlZEF0dHJpTmFtZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBhcmlhQXR0cnMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVwcmVjYXRlZEF0dHJpTmFtZXMuaW5jbHVkZXMoYXJpYUF0dHJzW2pdKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LnB1c2goeyBcInJvbGVcIjogcm9sZXNbaV0sIFwiYXR0cmlidXRlXCI6IGFyaWFBdHRyc1tqXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0O1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaXNOb2RlSW5HcmlkKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUobm9kZSwgXCJncmlkXCIpICE9IG51bGw7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4vQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4vQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgRE9NTWFwcGVyIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01NYXBwZXJcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5pbXBvcnQgeyBCb3VuZHMgfSBmcm9tIFwiLi4vYXBpL0lCb3VuZHNcIjtcblxudHlwZSBQc2V1ZG9DbGFzcyA9XG4gICAgfCBcIjpob3ZlclwiXG4gICAgfCBcIjphY3RpdmVcIlxuICAgIHwgXCI6Zm9jdXNcIlxuICAgIHwgXCI6Zm9jdXMtdmlzaWJsZVwiXG4gICAgfCBcIjpmb2N1cy13aXRoaW5cIjtcblxuZXhwb3J0IGNsYXNzIENTU1V0aWwge1xuICAgIHB1YmxpYyBzdGF0aWMgc2VsZWN0b3JNYXRjaGVzRWxlbShlbGVtZW50OiBFbGVtZW50LCBzZWxlY3Rvcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIC8vIEVhcmx5IHJldHVybiBmb3IgZW1wdHkgc2VsZWN0b3IgKGJlZm9yZSB0cnktY2F0Y2ggZm9yIHBlcmZvcm1hbmNlKVxuICAgICAgICBpZiAoIXNlbGVjdG9yIHx8IHNlbGVjdG9yLmxlbmd0aCA9PT0gMCB8fCBzZWxlY3Rvci50cmltKCkgPT09IFwiXCIpIHJldHVybiBmYWxzZTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gTW9kZXJuIHN0YW5kYXJkIG1ldGhvZFxuICAgICAgICAgICAgaWYgKHR5cGVvZiBlbGVtZW50Lm1hdGNoZXMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50Lm1hdGNoZXMoc2VsZWN0b3IpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBWZW5kb3ItcHJlZml4ZWQgZmFsbGJhY2tzIChvbGRlciBicm93c2VycylcbiAgICAgICAgICAgIGlmICh0eXBlb2YgKGVsZW1lbnQgYXMgYW55KS53ZWJraXRNYXRjaGVzU2VsZWN0b3IgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIHJldHVybiAoZWxlbWVudCBhcyBhbnkpLndlYmtpdE1hdGNoZXNTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgKGVsZW1lbnQgYXMgYW55KS5tc01hdGNoZXNTZWxlY3RvciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChlbGVtZW50IGFzIGFueSkubXNNYXRjaGVzU2VsZWN0b3Ioc2VsZWN0b3IpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBMZWdhY3kgbWV0aG9kIChkZXByZWNhdGVkIGJ1dCBrZXB0IGZvciBjb21wYXRpYmlsaXR5KVxuICAgICAgICAgICAgaWYgKHR5cGVvZiAoZWxlbWVudCBhcyBhbnkpLm1hdGNoZXNTZWxlY3RvciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChlbGVtZW50IGFzIGFueSkubWF0Y2hlc1NlbGVjdG9yKHNlbGVjdG9yKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRmFsbGJhY2s6IHVzZSBxdWVyeVNlbGVjdG9yQWxsIGFuZCBjaGVjayBpZiBlbGVtZW50IGlzIGluIHJlc3VsdHNcbiAgICAgICAgICAgIGNvbnN0IGRvYyA9IGVsZW1lbnQub3duZXJEb2N1bWVudCB8fCAoZWxlbWVudCBhcyBhbnkpLmRvY3VtZW50O1xuICAgICAgICAgICAgaWYgKCFkb2MpIHJldHVybiBmYWxzZTtcblxuICAgICAgICAgICAgY29uc3QgbWF0Y2hlcyA9IGRvYy5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTtcbiAgICAgICAgICAgIC8vIFVzZSBBcnJheS5mcm9tIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2Ugd2l0aCBtb2Rlcm4gZW5naW5lc1xuICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20obWF0Y2hlcykuaW5jbHVkZXMoZWxlbWVudCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgLy8gQmFkIHNlbGVjdG9yPyBEb2Vzbid0IG1hdGNoIHRoZW4uLi5cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHN0eWxlIGNvbXB1dGVkIGZvciB0aGlzIGVsZW1lbnRcbiAgICAgKiBAcGFyYW0gZWxlbVxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Q29tcHV0ZWRTdHlsZShlbGVtOiBIVE1MRWxlbWVudCwgcHNldWRvRWx0PzogUHNldWRvQ2xhc3MpIHtcbiAgICAgICAgaWYgKCFlbGVtKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgZG9jID0gZWxlbS5vd25lckRvY3VtZW50O1xuICAgICAgICBjb25zdCB3aW4gPSBkb2MuZGVmYXVsdFZpZXc7XG4gICAgICAgIHJldHVybiB3aW4uZ2V0Q29tcHV0ZWRTdHlsZShlbGVtLCBwc2V1ZG9FbHQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhcnNlIGFuZCBjYWNoZSBhbGwgc3R5bGVzaGVldCBydWxlcyBhdCB0aGUgZG9jdW1lbnQgbGV2ZWxcbiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHBhcnNlZCBydWxlIG9iamVjdHMgd2l0aCBzZWxlY3RvciBhbmQgc3R5bGUgaW5mb3JtYXRpb25cbiAgICAgKi9cbiAgICBwcml2YXRlIHN0YXRpYyBnZXRQYXJzZWRTdHlsZXNoZWV0UnVsZXMob3duZXJEb2M6IERvY3VtZW50KTogQXJyYXk8e1xuICAgICAgICBmdWxsUnVsZVNlbGVjdG9yOiBzdHJpbmc7XG4gICAgICAgIGhhc1BzZXVkb0NsYXNzOiBib29sZWFuO1xuICAgICAgICBzZWxNYWluOiBzdHJpbmc7XG4gICAgICAgIHNlbFBzZXVkbzogc3RyaW5nO1xuICAgICAgICBzdHlsZTogQ1NTU3R5bGVEZWNsYXJhdGlvbjtcbiAgICB9PiB7XG4gICAgICAgIC8vIENoZWNrIGlmIHdlIGFscmVhZHkgaGF2ZSBjYWNoZWQgcGFyc2VkIHJ1bGVzIGZvciB0aGlzIGRvY3VtZW50XG4gICAgICAgIGNvbnN0IGNhY2hlZFJ1bGVzID0gQ2FjaGVVdGlsLmdldENhY2hlKG93bmVyRG9jLCBcIlJQVFV0aWxfUGFyc2VkU3R5bGVzaGVldFJ1bGVzXCIsIG51bGwpO1xuICAgICAgICBpZiAoY2FjaGVkUnVsZXMpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRSdWxlcztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhcnNlZFJ1bGVzID0gW107XG5cbiAgICAgICAgLy8gSXRlcmF0ZSB0aHJvdWdoIGFsbCBvZiB0aGUgc3R5bGVzaGVldHMgYW5kIHJ1bGVzXG4gICAgICAgIGZvciAobGV0IHNzSW5kZXggPSAwOyBzc0luZGV4IDwgb3duZXJEb2Muc3R5bGVTaGVldHMubGVuZ3RoOyArK3NzSW5kZXgpIHtcbiAgICAgICAgICAgIGNvbnN0IHNoZWV0ID0gb3duZXJEb2Muc3R5bGVTaGVldHNbc3NJbmRleF0gYXMgQ1NTU3R5bGVTaGVldDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKHNoZWV0ICYmIHNoZWV0LmNzc1J1bGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHJJbmRleCA9IDA7IHJJbmRleCA8IHNoZWV0LmNzc1J1bGVzLmxlbmd0aDsgKytySW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJ1bGUgPSBzaGVldC5jc3NSdWxlc1tySW5kZXhdIGFzIENTU1N0eWxlUnVsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZ1bGxSdWxlU2VsZWN0b3IgPSBydWxlLnNlbGVjdG9yVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmdWxsUnVsZVNlbGVjdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHNldWRvTWF0Y2ggPSBmdWxsUnVsZVNlbGVjdG9yLm1hdGNoKC9eKC4qKSg6W2EtekEtWi1dKikkLyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFzUHNldWRvQ2xhc3MgPSAhIXBzZXVkb01hdGNoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbE1haW4gPSBoYXNQc2V1ZG9DbGFzcyA/IHBzZXVkb01hdGNoWzFdIDogZnVsbFJ1bGVTZWxlY3RvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxQc2V1ZG8gPSBoYXNQc2V1ZG9DbGFzcyA/IHBzZXVkb01hdGNoWzJdIDogXCJcIjtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlZFJ1bGVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxsUnVsZVNlbGVjdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNQc2V1ZG9DbGFzcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsTWFpbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsUHNldWRvLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZTogcnVsZS5zdHlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAhZXJyLnRvU3RyaW5nKCkuaW5jbHVkZXMoXCJDYW5ub3QgYWNjZXNzIHJ1bGVzXCIpICYmXG4gICAgICAgICAgICAgICAgICAgICFlcnIudG9TdHJpbmcoKS5pbmNsdWRlcyhcIlNlY3VyaXR5RXJyb3I6XCIpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYWNoZSB0aGUgcGFyc2VkIHJ1bGVzIGF0IHRoZSBkb2N1bWVudCBsZXZlbFxuICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUob3duZXJEb2MsIFwiUlBUVXRpbF9QYXJzZWRTdHlsZXNoZWV0UnVsZXNcIiwgcGFyc2VkUnVsZXMpO1xuICAgICAgICByZXR1cm4gcGFyc2VkUnVsZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJpdmF0ZSBoZWxwZXIgbWV0aG9kIHRvIGZpbGwgc3R5bGUgbWFwcyBmcm9tIGEgQ1NTU3R5bGVEZWNsYXJhdGlvblxuICAgICAqIEhhbmRsZXMgQ1NTIHByb3BlcnR5IHByaW9yaXRpZXMgYW5kIHRoZSBcImFsbFwiIHNob3J0aGFuZCBwcm9wZXJ0eVxuICAgICAqL1xuICAgIHByaXZhdGUgc3RhdGljIGZpbGxTdHlsZShtYXBzOiBhbnlbXSwgc3R5bGU6IENTU1N0eWxlRGVjbGFyYXRpb24pOiB2b2lkIHtcbiAgICAgICAgZm9yIChsZXQgc0luZGV4ID0gMDsgc0luZGV4IDwgc3R5bGUubGVuZ3RoOyArK3NJbmRleCkge1xuICAgICAgICAgICAgaWYgKHN0eWxlW3NJbmRleF0gPT09IFwiYWxsXCIgJiYgc3R5bGVbc3R5bGVbc0luZGV4XV0pIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IG1hcCBvZiBtYXBzKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIG1hcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG1hcFtrZXldO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSBzdHlsZVtzSW5kZXhdO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbWFwIG9mIG1hcHMpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHByaW9yaXR5ID0gc3R5bGUuZ2V0UHJvcGVydHlQcmlvcml0eShrZXkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoa2V5IGluIG1hcCAmJiBtYXBba2V5XS5lbmRzV2l0aChcIiFpbXBvcnRhbnRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmlvcml0eSA9PT0gXCJpbXBvcnRhbnRcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICFtYXBba2V5XS5zdGFydHNXaXRoKFwiaW5oZXJpdFwiKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICFtYXBba2V5XS5zdGFydHNXaXRoKFwidW5zZXRcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBba2V5XSA9IHN0eWxlW2tleV0gKyBcIiAhaW1wb3J0YW50XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcFtrZXldID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZVtrZXldICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHJpb3JpdHkgPT09IFwiaW1wb3J0YW50XCIgPyBcIiAhaW1wb3J0YW50XCIgOiBcIlwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcml2YXRlIGhlbHBlciBtZXRob2QgdGhhdCBjb25zb2xpZGF0ZXMgdGhlIGxvZ2ljIGZvciBnZXR0aW5nIGRlZmluZWQgc3R5bGVzXG4gICAgICogVXNlZCBieSBib3RoIGdldERlZmluZWRTdHlsZXMgYW5kIGdldERlZmluZWRTdHlsZXNNdWx0aXBsZVxuICAgICAqL1xuICAgIHByaXZhdGUgc3RhdGljIGdldERlZmluZWRTdHlsZXNJbnRlcm5hbChcbiAgICAgICAgZWxlbTogSFRNTEVsZW1lbnQsXG4gICAgICAgIHByb3BzOiBzdHJpbmdbXSB8IG51bGwsXG4gICAgICAgIHBzZXVkb0NsYXNzZXM6IHN0cmluZ1tdXG4gICAgKTogeyBbcHNldWRvQ2xhc3M6IHN0cmluZ106IGFueSB9IHtcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IHt9O1xuICAgICAgICBjb25zdCBkZWZpbmVkU3R5bGVzTWFwID0ge307XG4gICAgICAgIGNvbnN0IGRlZmluZWRTdHlsZVBzZXVkb01hcCA9IHt9O1xuXG4gICAgICAgIC8vIEluaXRpYWxpemUgcmVzdWx0IG9iamVjdHMgZm9yIGFsbCBwc2V1ZG8tY2xhc3Nlc1xuICAgICAgICBmb3IgKGNvbnN0IHBzZXVkb0NsYXNzIG9mIHBzZXVkb0NsYXNzZXMpIHtcbiAgICAgICAgICAgIGRlZmluZWRTdHlsZXNNYXBbcHNldWRvQ2xhc3NdID0ge307XG4gICAgICAgICAgICBkZWZpbmVkU3R5bGVQc2V1ZG9NYXBbcHNldWRvQ2xhc3NdID0ge307XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgcHJlLXBhcnNlZCBzdHlsZXNoZWV0IHJ1bGVzIGZyb20gY2FjaGVcbiAgICAgICAgY29uc3QgcGFyc2VkUnVsZXMgPSBDU1NVdGlsLmdldFBhcnNlZFN0eWxlc2hlZXRSdWxlcyhlbGVtLm93bmVyRG9jdW1lbnQpO1xuICAgICAgICBcbiAgICAgICAgLy8gQ2hlY2sgb25jZSBpZiB3ZSBuZWVkIHRvIGhhbmRsZSA6Zm9jdXMgcHNldWRvLWNsYXNzXG4gICAgICAgIGNvbnN0IGhhc0ZvY3VzUHNldWRvID0gcHNldWRvQ2xhc3Nlcy5pbmNsdWRlcyhcIjpmb2N1c1wiKTtcblxuICAgICAgICAvLyBQcm9jZXNzIGVhY2ggY2FjaGVkIHJ1bGVcbiAgICAgICAgZm9yIChjb25zdCBwYXJzZWRSdWxlIG9mIHBhcnNlZFJ1bGVzKSB7XG4gICAgICAgICAgICBpZiAocHJvcHMgIT09IG51bGwgJiYgIXByb3BzLnNvbWUocHJvcCA9PiAhIXBhcnNlZFJ1bGUuc3R5bGVbcHJvcF0pKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBzZWxQc2V1ZG8gPSBwYXJzZWRSdWxlLnNlbFBzZXVkbztcbiAgICAgICAgICAgIGNvbnN0IGhhc1BzZXVkb0NsYXNzID0gcGFyc2VkUnVsZS5oYXNQc2V1ZG9DbGFzcztcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gSGFuZGxlIDpmb2N1cy13aXRoaW4gcmVwbGFjZW1lbnQgb25jZSBwZXIgcnVsZSBpZiBuZWVkZWRcbiAgICAgICAgICAgIGxldCBzZWxNYWluID0gcGFyc2VkUnVsZS5zZWxNYWluO1xuICAgICAgICAgICAgaWYgKGhhc0ZvY3VzUHNldWRvICYmIHNlbFBzZXVkbyA9PT0gXCI6Zm9jdXNcIikge1xuICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgZWxlbWVudCBoYXMgZm9jdXMsIHJlbW92ZSBmb2N1cy13aXRoaW4gZnJvbSBwYXJlbnRzXG4gICAgICAgICAgICAgICAgc2VsTWFpbiA9IHNlbE1haW4ucmVwbGFjZShcbiAgICAgICAgICAgICAgICAgICAgLyhbID5dW14rfiA+XSspOmZvY3VzLXdpdGhpbi9nLFxuICAgICAgICAgICAgICAgICAgICBcIiQxXCJcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBDYWNoZSBzZWxlY3RvciBtYXRjaGluZyByZXN1bHQgKG9ubHkgb25jZSBwZXIgcnVsZSwgbm90IHBlciBwc2V1ZG8tY2xhc3MpXG4gICAgICAgICAgICBjb25zdCBzZWxlY3Rvck1hdGNoZXMgPSBDU1NVdGlsLnNlbGVjdG9yTWF0Y2hlc0VsZW0oZWxlbSwgc2VsTWFpbik7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIE9ubHkgcHJvY2VzcyBpZiBzZWxlY3RvciBtYXRjaGVzXG4gICAgICAgICAgICBpZiAoc2VsZWN0b3JNYXRjaGVzKSB7XG4gICAgICAgICAgICAgICAgLy8gUHJvY2VzcyBmb3IgZWFjaCBwc2V1ZG8tY2xhc3NcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHBzZXVkb0NsYXNzIG9mIHBzZXVkb0NsYXNzZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2FjaGUgbWFwIHJlZmVyZW5jZXMgdG8gYXZvaWQgcmVwZWF0ZWQgbG9va3Vwc1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHlsZU1hcCA9IGRlZmluZWRTdHlsZXNNYXBbcHNldWRvQ2xhc3NdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwc2V1ZG9NYXAgPSBkZWZpbmVkU3R5bGVQc2V1ZG9NYXBbcHNldWRvQ2xhc3NdO1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHN0eWxlcyBvZiBub24tcHNldWRvIHNlbGVjdG9yc1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc1BzZXVkb0NsYXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBDU1NVdGlsLmZpbGxTdHlsZShbc3R5bGVNYXAsIHBzZXVkb01hcF0sIHBhcnNlZFJ1bGUuc3R5bGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHN0eWxlcyBmb3IgbWF0Y2hpbmcgcHNldWRvLWNsYXNzXG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWxQc2V1ZG8gPT09IHBzZXVkb0NsYXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBDU1NVdGlsLmZpbGxTdHlsZShbcHNldWRvTWFwXSwgcGFyc2VkUnVsZS5zdHlsZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBIYW5kbGUgZWxlbWVudCBzdHlsZXMgYW5kIGJ1aWxkIHJlc3VsdHMgaW4gb25lIHBhc3NcbiAgICAgICAgZm9yIChjb25zdCBwc2V1ZG9DbGFzcyBvZiBwc2V1ZG9DbGFzc2VzKSB7XG4gICAgICAgICAgICBjb25zdCBzdHlsZU1hcCA9IGRlZmluZWRTdHlsZXNNYXBbcHNldWRvQ2xhc3NdO1xuICAgICAgICAgICAgY29uc3QgcHNldWRvTWFwID0gZGVmaW5lZFN0eWxlUHNldWRvTWFwW3BzZXVkb0NsYXNzXTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gQWRkIGVsZW1lbnQncyBpbmxpbmUgc3R5bGVzXG4gICAgICAgICAgICBDU1NVdGlsLmZpbGxTdHlsZShbc3R5bGVNYXAsIHBzZXVkb01hcF0sIGVsZW0uc3R5bGUpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBCdWlsZCByZXN1bHRzXG4gICAgICAgICAgICBpZiAocHNldWRvQ2xhc3MgPT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICByZXN1bHRzW3BzZXVkb0NsYXNzXSA9IHN0eWxlTWFwO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBGb3IgcHNldWRvLWNsYXNzZXMsIHJldHVybiBvbmx5IHN0eWxlcyB0aGF0IGRpZmZlciBmcm9tIGRlZmF1bHRcbiAgICAgICAgICAgICAgICBjb25zdCBkaWZmU3R5bGVzID0ge307XG4gICAgICAgICAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHBzZXVkb01hcCk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IGtleXNbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChwc2V1ZG9NYXBba2V5XSAhPT0gc3R5bGVNYXBba2V5XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlmZlN0eWxlc1trZXldID0gcHNldWRvTWFwW2tleV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzdWx0c1twc2V1ZG9DbGFzc10gPSBkaWZmU3R5bGVzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBzdHlsZSBkZWZpbmVkIGZvciB0aGlzIGVsZW1lbnQgZm9yIG11bHRpcGxlIHBzZXVkby1jbGFzc2VzIGluIGEgc2luZ2xlIHBhc3NcbiAgICAgKlxuICAgICAqIFRoaXMgaXMgbW9yZSBlZmZpY2llbnQgdGhhbiBjYWxsaW5nIGdldERlZmluZWRTdHlsZXMgbXVsdGlwbGUgdGltZXMgYXMgaXQgb25seVxuICAgICAqIGl0ZXJhdGVzIHRocm91Z2ggc3R5bGVzaGVldHMgb25jZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1cbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBwcm9wcyBQcm9wZXJ0aWVzIGZvciB3aGljaCB3ZSBhcmUgbG9va2luZyBmb3IgKGFsbG93cyB1cyB0byBza2lwIGVsZW0gbWF0Y2hpbmcgdW5uZWNlc3NhcmlseSlcbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBwc2V1ZG9DbGFzc2VzIC0gQXJyYXkgb2YgcHNldWRvLWNsYXNzZXMgdG8gcmV0cmlldmUuIFVzZSBcIlwiIGZvciBkZWZhdWx0IChubyBwc2V1ZG8tY2xhc3MpLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IE9iamVjdCBtYXBwaW5nIGVhY2ggcHNldWRvLWNsYXNzIHRvIGl0cyBkZWZpbmVkIHN0eWxlc1xuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0RGVmaW5lZFN0eWxlc011bHRpcGxlKGVsZW06IEhUTUxFbGVtZW50LCBwcm9wczogc3RyaW5nW10gfCBudWxsLCBwc2V1ZG9DbGFzc2VzOiBzdHJpbmdbXSkge1xuICAgICAgICBpZiAoIWVsZW0pIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCByZXN1bHRzID0ge307XG5cbiAgICAgICAgLy8gQ3JlYXRlIGNhY2hlIGtleSB0aGF0IGluY2x1ZGVzIHByb3BzIGZpbHRlclxuICAgICAgICAvLyBVc2UgXCJhbGxcIiBmb3IgbnVsbCBwcm9wcywgb3Igc29ydGVkIGNvbW1hLXNlcGFyYXRlZCBsaXN0IGZvciBzcGVjaWZpYyBwcm9wc1xuICAgICAgICBjb25zdCBwcm9wc0tleSA9IHByb3BzID09PSBudWxsID8gXCJhbGxcIiA6IHByb3BzLnNsaWNlKCkuc29ydCgpLmpvaW4oXCIsXCIpO1xuICAgICAgICBcbiAgICAgICAgLy8gQ2hlY2sgY2FjaGUgZmlyc3QgLSBzZWUgaWYgd2UgaGF2ZSBhbGwgcmVxdWVzdGVkIHBzZXVkby1jbGFzc2VzIGNhY2hlZFxuICAgICAgICBsZXQgYWxsQ2FjaGVkU3R5bGVzID0gQ2FjaGVVdGlsLmdldENhY2hlKGVsZW0sIFwiUlBUVXRpbF9EZWZpbmVkU3R5bGVzXCIsIG51bGwpO1xuICAgICAgICBpZiAoIWFsbENhY2hlZFN0eWxlcykge1xuICAgICAgICAgICAgYWxsQ2FjaGVkU3R5bGVzID0ge307XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIEdldCBvciBjcmVhdGUgdGhlIGNhY2hlIGJ1Y2tldCBmb3IgdGhpcyBwcm9wcyBmaWx0ZXJcbiAgICAgICAgbGV0IGNhY2hlZFN0eWxlcyA9IGFsbENhY2hlZFN0eWxlc1twcm9wc0tleV07XG4gICAgICAgIGxldCBtaXNzaW5nUHNldWRvQ2xhc3NlcyA9IFtdO1xuICAgICAgICBcbiAgICAgICAgaWYgKGNhY2hlZFN0eWxlcykge1xuICAgICAgICAgICAgLy8gQ2hlY2sgd2hpY2ggcHNldWRvLWNsYXNzZXMgYXJlIGFscmVhZHkgY2FjaGVkXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHBzZXVkb0NsYXNzIG9mIHBzZXVkb0NsYXNzZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoY2FjaGVkU3R5bGVzW3BzZXVkb0NsYXNzXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdHNbcHNldWRvQ2xhc3NdID0gY2FjaGVkU3R5bGVzW3BzZXVkb0NsYXNzXTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBtaXNzaW5nUHNldWRvQ2xhc3Nlcy5wdXNoKHBzZXVkb0NsYXNzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIElmIGFsbCBhcmUgY2FjaGVkLCByZXR1cm4gaW1tZWRpYXRlbHlcbiAgICAgICAgICAgIGlmIChtaXNzaW5nUHNldWRvQ2xhc3Nlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZFN0eWxlcyA9IHt9O1xuICAgICAgICAgICAgbWlzc2luZ1BzZXVkb0NsYXNzZXMgPSBwc2V1ZG9DbGFzc2VzO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT25seSBwcm9jZXNzIG1pc3NpbmcgcHNldWRvLWNsYXNzZXMgdXNpbmcgdGhlIGludGVybmFsIGhlbHBlclxuICAgICAgICBpZiAobWlzc2luZ1BzZXVkb0NsYXNzZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgbmV3UmVzdWx0cyA9IENTU1V0aWwuZ2V0RGVmaW5lZFN0eWxlc0ludGVybmFsKGVsZW0sIHByb3BzLCBtaXNzaW5nUHNldWRvQ2xhc3Nlcyk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIE1lcmdlIG5ldyByZXN1bHRzIHdpdGggY2FjaGVkIHJlc3VsdHNcbiAgICAgICAgICAgIGZvciAoY29uc3QgcHNldWRvQ2xhc3Mgb2YgbWlzc2luZ1BzZXVkb0NsYXNzZXMpIHtcbiAgICAgICAgICAgICAgICByZXN1bHRzW3BzZXVkb0NsYXNzXSA9IG5ld1Jlc3VsdHNbcHNldWRvQ2xhc3NdO1xuICAgICAgICAgICAgICAgIGNhY2hlZFN0eWxlc1twc2V1ZG9DbGFzc10gPSBuZXdSZXN1bHRzW3BzZXVkb0NsYXNzXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gVXBkYXRlIGNhY2hlIHdpdGggYWxsIHN0eWxlcyAoZXhpc3RpbmcgKyBuZXcpXG4gICAgICAgICAgICBhbGxDYWNoZWRTdHlsZXNbcHJvcHNLZXldID0gY2FjaGVkU3R5bGVzO1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUlBUVXRpbF9EZWZpbmVkU3R5bGVzXCIsIGFsbENhY2hlZFN0eWxlcyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBzdHlsZSBkZWZpbmVkIGZvciB0aGlzIGVsZW1lbnRcbiAgICAgKlxuICAgICAqIFRoaXMgZGlmZmVycyBmcm9tIHRoZSBjb21wdXRlZCBzdHlsZSBpbiB0aGF0IHRoZSBjb21wdXRlZCBzdHlsZSB3aWxsIHJldHVyblxuICAgICAqIHN0eWxlcyBkZWZpbmVkIGJ5IHRoZSB1c2VyIGFnZW50LiBUaGlzIHdpbGwgb25seSByZXR1cm4gc3R5bGVzIGRlZmluZWQgYnkgdGhlXG4gICAgICogYXBwbGljYXRpb25cbiAgICAgKiBpZiByb3RhdGlvbiB0cmFuc2Zvcm0gaXMgdXNlZCwgdGhlIGNvbXB1dGVkIHN0eWxlIHJldHVybnMgdGhlIHJlc29sdmVkIG1hdHJpeFxuICAgICAqICB3aGlsZSB0aGUgZGVmaW5lZCBzdHlsZSByZXR1cm4gdGhlIHRyYW5zZm9ybSBmdW5jdGlvbihzKVxuICAgICAqIGZvciBleGFtcGxlLCBmb3IgJ3RyYW5zZm9ybTogcm90YXRlKDIuNWRlZyk7JywgdGhlIGNvbXB1dGVkIHN0eWxlIHJldHVybnMgJ21hdHJpeCgtMC4wNDM2MTk0LCAwLjk5OTA0OCwgLTAuOTk5MDQ4LCAtMC4wNDM2MTk0LCAwLCAwKSdcbiAgICAgKiAgYW5kIHRoZSBkZWZpbmVkIHN0eWxlIHJldHVybnMgJ3JvdGF0ZSgyLjVkZWcpJ1xuICAgICAqXG4gICAgICogY2hhbmdlIHRoZSB0eXBlIG9mIHRoZSBwYXJhbWV0ZXIgcHNldWRvQ2xhc3MgZnJvbSBQc2V1ZG9DbGFzcyB0byBzdHJpbmcgdG8gaW5jbHVkZSBib3RoIHBzZXVkbyBjbGFzc2VzIChlLmcuLCA6Zm9jdXMsIDpjaGVja2VkKVxuICAgICAqIGFuZCBwc2V1ZG8gZWxlbWVudHMgKGUuZy4sIDo6YmVmb3JlLCA6OmFmdGVyKS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1cbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBwcm9wcyBQcm9wZXJ0aWVzIGZvciB3aGljaCB3ZSBhcmUgbG9va2luZyBmb3IgKGFsbG93cyB1cyB0byBza2lwIGVsZW0gbWF0Y2hpbmcgdW5uZWNlc3NhcmlseSlcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3BzZXVkb0NsYXNzXSBJZiBzcGVjaWZpZWQsIHdpbGwgcmV0dXJuIHZhbHVlcyB0aGF0IGFyZSBkaWZmZXJlbnRcbiAgICAgKiB0aGFuIHdoZW4gdGhlIHBzZXVkb0NsYXNzIGRvZXMgbm90IG1hdGNoLlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0RGVmaW5lZFN0eWxlcyhlbGVtOiBIVE1MRWxlbWVudCwgcHJvcHM6IHN0cmluZ1tdLCBwc2V1ZG9DbGFzcz86IHN0cmluZykge1xuICAgICAgICBpZiAoIWVsZW0pIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIENyZWF0ZSBjYWNoZSBrZXkgdGhhdCBpbmNsdWRlcyBwcm9wcyBmaWx0ZXJcbiAgICAgICAgLy8gVXNlIFwiYWxsXCIgZm9yIG51bGwgcHJvcHMsIG9yIHNvcnRlZCBjb21tYS1zZXBhcmF0ZWQgbGlzdCBmb3Igc3BlY2lmaWMgcHJvcHNcbiAgICAgICAgY29uc3QgcHJvcHNLZXkgPSBwcm9wcyA9PT0gbnVsbCA/IFwiYWxsXCIgOiBwcm9wcy5zbGljZSgpLnNvcnQoKS5qb2luKFwiLFwiKTtcbiAgICAgICAgY29uc3QgcHNldWRvS2V5ID0gcHNldWRvQ2xhc3MgfHwgXCJcIjtcbiAgICAgICAgXG4gICAgICAgIC8vIENoZWNrIGNhY2hlIGZpcnN0IC0gdXNlIHNoYXJlZCBjYWNoZSBzdHJ1Y3R1cmUgd2l0aCBnZXREZWZpbmVkU3R5bGVzTXVsdGlwbGVcbiAgICAgICAgbGV0IGFsbENhY2hlZFN0eWxlcyA9IENhY2hlVXRpbC5nZXRDYWNoZShlbGVtLCBcIlJQVFV0aWxfRGVmaW5lZFN0eWxlc1wiLCBudWxsKTtcbiAgICAgICAgaWYgKCFhbGxDYWNoZWRTdHlsZXMpIHtcbiAgICAgICAgICAgIGFsbENhY2hlZFN0eWxlcyA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBHZXQgb3IgY3JlYXRlIHRoZSBjYWNoZSBidWNrZXQgZm9yIHRoaXMgcHJvcHMgZmlsdGVyXG4gICAgICAgIGxldCBjYWNoZWRTdHlsZXMgPSBhbGxDYWNoZWRTdHlsZXNbcHJvcHNLZXldO1xuICAgICAgICBpZiAoIWNhY2hlZFN0eWxlcykge1xuICAgICAgICAgICAgY2FjaGVkU3R5bGVzID0ge307XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmIChjYWNoZWRTdHlsZXNbcHNldWRvS2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU3R5bGVzW3BzZXVkb0tleV07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVc2UgdGhlIGludGVybmFsIGhlbHBlciBtZXRob2Qgd2l0aCBhIHNpbmdsZSBwc2V1ZG8tY2xhc3NcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IENTU1V0aWwuZ2V0RGVmaW5lZFN0eWxlc0ludGVybmFsKGVsZW0sIHByb3BzLCBbcHNldWRvS2V5XSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc3VsdHNbcHNldWRvS2V5XTtcbiAgICAgICAgXG4gICAgICAgIC8vIENhY2hlIHRoZSByZXN1bHRcbiAgICAgICAgY2FjaGVkU3R5bGVzW3BzZXVkb0tleV0gPSByZXN1bHQ7XG4gICAgICAgIGFsbENhY2hlZFN0eWxlc1twcm9wc0tleV0gPSBjYWNoZWRTdHlsZXM7XG4gICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlJQVFV0aWxfRGVmaW5lZFN0eWxlc1wiLCBhbGxDYWNoZWRTdHlsZXMpO1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBtZWRpYSBxdWVyeSBkZWZpbmVkIGZvciB0aGUgZG9jdW1lbnRcbiAgICAgKiBHZXQgbWVkaWEgb3JpZW50YXRpb24gdHJhbnNmb3JtcyBmcm9tIHN0eWxlc2hlZXRzIHdpdGggY2FjaGluZ1xuICAgICAqIFJldHVybnMgdHJhbnNmb3JtL3JvdGF0ZSBwcm9wZXJ0aWVzIGZvciBlbGVtZW50cyB3aXRoaW4gbWVkaWEgcXVlcmllc1xuICAgICAqXG4gICAgICogQHBhcmFtIHtEb2N1bWVudH0gZG9jXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRNZWRpYU9yaWVudGF0aW9uVHJhbnNmb3JtKGRvYzogRG9jdW1lbnQpIHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgd2UgYWxyZWFkeSBoYXZlIGNhY2hlZCBtZWRpYSBvcmllbnRhdGlvbiB0cmFuc2Zvcm1zIGZvciB0aGlzIGRvY3VtZW50XG4gICAgICAgIGNvbnN0IGNhY2hlZFRyYW5zZm9ybXMgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUoZG9jLCBcIlJQVFV0aWxfTWVkaWFPcmllbnRhdGlvblRyYW5zZm9ybXNcIiwgbnVsbCk7XG4gICAgICAgIGlmIChjYWNoZWRUcmFuc2Zvcm1zKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkVHJhbnNmb3JtcztcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBvcmllbnRhdGlvblRyYW5zZm9ybXMgPSB7fVxuXG4gICAgICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCBhbGwgb2YgdGhlIHN0eWxlc2hlZXRzIGFuZCBydWxlc1xuICAgICAgICBmb3IgKGxldCBzc0luZGV4ID0gMDsgc3NJbmRleCA8IGRvYy5zdHlsZVNoZWV0cy5sZW5ndGg7ICsrc3NJbmRleCkge1xuICAgICAgICAgICAgY29uc3Qgc2hlZXQgPSBkb2Muc3R5bGVTaGVldHNbc3NJbmRleF0gYXMgQ1NTU3R5bGVTaGVldDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKHNoZWV0ICYmIHNoZWV0LmNzc1J1bGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHJJbmRleCA9IDA7IHJJbmRleCA8IHNoZWV0LmNzc1J1bGVzLmxlbmd0aDsgKytySW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoZWV0UnVsZSA9IHNoZWV0LmNzc1J1bGVzW3JJbmRleF07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoNCAvKiBDU1NSdWxlLk1FRElBX1JVTEUgKi8gPT09IHNoZWV0UnVsZS5NRURJQV9SVUxFKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcnVsZSA9IHNoZWV0UnVsZSBhcyBDU1NNZWRpYVJ1bGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGUgJiYgcnVsZS5tZWRpYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZWRpYUxpc3QgPSBydWxlLm1lZGlhO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1lZGlhTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtZWRpYUxpc3QuaXRlbShpKSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZWRpYUtleSA9IG1lZGlhTGlzdC5pdGVtKGkpLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZWxlbV90cmFuc2Zvcm1zID0gb3JpZW50YXRpb25UcmFuc2Zvcm1zW21lZGlhS2V5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZWxlbV90cmFuc2Zvcm1zKSBlbGVtX3RyYW5zZm9ybXMgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHlsZVJ1bGVzID0gcnVsZS5jc3NSdWxlcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgc3R5bGVSdWxlcy5sZW5ndGg7ICsraikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgxIC8qIENTU1J1bGUuU1RZTEVfUlVMRSAqLyA9PT0gc3R5bGVSdWxlc1tqXS5TVFlMRV9SVUxFKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0eWxlUnVsZSA9IHN0eWxlUnVsZXNbal0gYXMgQ1NTU3R5bGVSdWxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RvciA9IHN0eWxlUnVsZS5zZWxlY3RvclRleHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRyYW5zZm9ybXMgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0eWxlcyA9IHN0eWxlUnVsZS5zdHlsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHMgPSAwOyBzIDwgc3R5bGVzLmxlbmd0aDsgKytzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gc3R5bGVzW3NdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleUxvd2VyID0ga2V5LnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtleUxvd2VyID09PSBcInRyYW5zZm9ybVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXkgPT09IFwiYWxsXCIgJiYgc3R5bGVzW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybXMgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3Jtc1trZXldID0gc3R5bGVzW2tleV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleUxvd2VyID09PSBcInJvdGF0ZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybXNba2V5XSA9IHN0eWxlc1trZXldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyh0cmFuc2Zvcm1zKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbV90cmFuc2Zvcm1zW3NlbGVjdG9yXSA9IHRyYW5zZm9ybXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoZWxlbV90cmFuc2Zvcm1zKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZW50YXRpb25UcmFuc2Zvcm1zW21lZGlhS2V5XSA9IGVsZW1fdHJhbnNmb3JtcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgIWVyci50b1N0cmluZygpLmluY2x1ZGVzKFwiQ2Fubm90IGFjY2VzcyBydWxlc1wiKSAmJlxuICAgICAgICAgICAgICAgICAgICAhZXJyLnRvU3RyaW5nKCkuaW5jbHVkZXMoXCJTZWN1cml0eUVycm9yOlwiKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBDYWNoZSB0aGUgbWVkaWEgb3JpZW50YXRpb24gdHJhbnNmb3JtcyBhdCB0aGUgZG9jdW1lbnQgbGV2ZWxcbiAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGRvYywgXCJSUFRVdGlsX01lZGlhT3JpZW50YXRpb25UcmFuc2Zvcm1zXCIsIG9yaWVudGF0aW9uVHJhbnNmb3Jtcyk7XG4gICAgICAgIHJldHVybiBvcmllbnRhdGlvblRyYW5zZm9ybXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogY29udmVydCBnaXZlbiByb3RhdGlvbiB0cmFuc2Zvcm0gZnVuY3Rpb25zIHRvIHRoZSBkZWdyZWUgdHJhbnNmb3JtZWQuXG4gICAgICogSWYgbXVsdGlwbGUgZnVuY3Rpb25zIGFyZSBnaXZlbiwgdGhlbiB0aGUgZnVuY3Rpb25zIGFyZSBhcHBsaWVkIGxpbmVhcmx5IGluIHRoZSBvcmRlci5cbiAgICAgKiAgIHJvdGF0aW9uX3RyYW5zZm9ybSBmdW5jdGlvbiBleGFtcGxlOiAgcm90YXRlKDQ1ZGVnKSwgcm90YXRlKDJ0dXJuKSwgcm90YXRlKDJyYWQpLCByb3RhdGUzZCgxLCAxLCAxLCA0NWRlZyksXG4gICAgICogICAgICAgIHJvdGF0ZSgycmFkKSByb3RhdGUzZCgxLCAxLCAxLCA0NWRlZylcbiAgICAgKiBAcGFyYW0gcm90YXRpb25fdHJhbnNmb3JtXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRSb3RhdGlvbkRlZ3JlZShyb3RhdGlvbl90cmFuc2Zvcm0pIHtcbiAgICAgICAgbGV0IGRlZ3JlZSA9IDA7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoIXJvdGF0aW9uX3RyYW5zZm9ybSkgcmV0dXJuIGRlZ3JlZTtcbiAgICAgICAgICAgIC8vIG5vcm1hbGl6ZSB0aGUgcm90YXRpb25fdHJhbnNmb3JtXG4gICAgICAgICAgICByb3RhdGlvbl90cmFuc2Zvcm0gPSByb3RhdGlvbl90cmFuc2Zvcm0ucmVwbGFjZUFsbChcIiwgXCIsIFwiLFwiKTtcbiAgICAgICAgICAgIGNvbnN0IHRyYW5zZm9ybV9mdW5jdGlvbnMgPSByb3RhdGlvbl90cmFuc2Zvcm0uc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0cmFuc2Zvcm1fZnVuY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdHJhbnNmb3JtX2Z1bmN0aW9uID0gdHJhbnNmb3JtX2Z1bmN0aW9uc1tpXS50cmltKCk7XG4gICAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybV9mdW5jdGlvbiA9PT0gXCJcIikgY29udGludWU7XG4gICAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybV9mdW5jdGlvbi5zdGFydHNXaXRoKFwicm90YXRlM2RcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXhhbXBsZTogcm90YXRlM2QoMSwgMSwgMSwgNDVkZWcpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsZWZ0ID0gdHJhbnNmb3JtX2Z1bmN0aW9uLmluZGV4T2YoXCIoXCIpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByaWdodCA9IHRyYW5zZm9ybV9mdW5jdGlvbi5pbmRleE9mKFwiKVwiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxlZnQgIT09IC0xICYmIHJpZ2h0ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1hdHJpeCA9IHRyYW5zZm9ybV9mdW5jdGlvbi5zdWJzdHJpbmcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCArIDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHRcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hdHJpeCkgdmFsdWVzID0gbWF0cml4LnNwbGl0KFwiLFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZXMgJiYgdmFsdWVzLmxlbmd0aCA9PT0gNCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByb3RhdGlvbiA9IHZhbHVlc1szXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJvdGF0aW9uKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3RhdGlvbiA9IHJvdGF0aW9uLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocm90YXRpb24uZW5kc1dpdGgoXCJ0dXJuXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBudW0gPSByb3RhdGlvbi5zdWJzdHJpbmcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRpb24ubGVuZ3RoIC0gNFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW0gPSBwYXJzZUZsb2F0KG51bSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNOYU4obnVtKSkgZGVncmVlID0gbnVtICogMzYwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocm90YXRpb24uZW5kc1dpdGgoXCJyYWRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG51bSA9IHJvdGF0aW9uLnN1YnN0cmluZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3RhdGlvbi5sZW5ndGggLSAzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bSA9IHBhcnNlRmxvYXQobnVtKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc05hTihudW0pKSBkZWdyZWUgPSAobnVtICogMTgwKSAvIE1hdGguUEk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyb3RhdGlvbi5lbmRzV2l0aChcImRlZ1wiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbnVtID0gcm90YXRpb24uc3Vic3RyaW5nKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0aW9uLmxlbmd0aCAtIDNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtID0gcGFyc2VGbG9hdChudW0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTmFOKG51bSkpIGRlZ3JlZSArPSBudW07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtX2Z1bmN0aW9uLnN0YXJ0c1dpdGgoXCJyb3RhdGVcIikgfHxcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtX2Z1bmN0aW9uLnN0YXJ0c1dpdGgoXCJyb3RhdGVaXCIpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGV4YW1wbGU6IHJvdGF0ZSg0NWRlZyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxlZnQgPSB0cmFuc2Zvcm1fZnVuY3Rpb24uaW5kZXhPZihcIihcIik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJpZ2h0ID0gdHJhbnNmb3JtX2Z1bmN0aW9uLmluZGV4T2YoXCIpXCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobGVmdCAhPT0gLTEgJiYgcmlnaHQgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcm90YXRpb24gPSB0cmFuc2Zvcm1fZnVuY3Rpb24uc3Vic3RyaW5nKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgKyAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyb3RhdGlvbikgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByb3RhdGlvbiA9IHJvdGF0aW9uLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3RhdGlvbi5lbmRzV2l0aChcInR1cm5cIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbnVtID0gcm90YXRpb24uc3Vic3RyaW5nKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3RhdGlvbi5sZW5ndGggLSA0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW0gPSBwYXJzZUZsb2F0KG51bSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc05hTihudW0pKSBkZWdyZWUgPSBudW0gKiAzNjA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJvdGF0aW9uLmVuZHNXaXRoKFwicmFkXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG51bSA9IHJvdGF0aW9uLnN1YnN0cmluZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRpb24ubGVuZ3RoIC0gM1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtID0gcGFyc2VGbG9hdChudW0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNOYU4obnVtKSkgZGVncmVlID0gKG51bSAqIDE4MCkgLyBNYXRoLlBJO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyb3RhdGlvbi5lbmRzV2l0aChcImRlZ1wiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBudW0gPSByb3RhdGlvbi5zdWJzdHJpbmcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0aW9uLmxlbmd0aCAtIDNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bSA9IHBhcnNlRmxvYXQobnVtKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTmFOKG51bSkpIGRlZ3JlZSArPSBudW07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRyYW5zZm9ybV9mdW5jdGlvbi5zdGFydHNXaXRoKFwibWF0cml4M2RcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY2FsY3VsYXRlIHRoZSB0aHJlZSBFdWxlciBhbmdsZXNcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGVmdCA9IHRyYW5zZm9ybV9mdW5jdGlvbi5pbmRleE9mKFwiKFwiKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmlnaHQgPSB0cmFuc2Zvcm1fZnVuY3Rpb24uaW5kZXhPZihcIilcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsZWZ0ICE9PSAtMSAmJiByaWdodCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtYXRyaXggPSB0cmFuc2Zvcm1fZnVuY3Rpb24uc3Vic3RyaW5nKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgKyAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlcyA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF0cml4KSB2YWx1ZXMgPSBtYXRyaXguc3BsaXQoXCIsXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlcyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHpfYW5nbGUgPSBNYXRoLmF0YW4yKHZhbHVlc1s0XSwgdmFsdWVzWzVdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWdyZWUgKz0gTWF0aC5yb3VuZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5yb3VuZCgoel9hbmdsZSAqIDE4MCkgLyBNYXRoLlBJKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRyYW5zZm9ybV9mdW5jdGlvbi5zdGFydHNXaXRoKFwibWF0cml4XCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgdGhyZWUgRXVsZXIgYW5nbGVzXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxlZnQgPSB0cmFuc2Zvcm1fZnVuY3Rpb24uaW5kZXhPZihcIihcIik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJpZ2h0ID0gdHJhbnNmb3JtX2Z1bmN0aW9uLmluZGV4T2YoXCIpXCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobGVmdCAhPT0gLTEgJiYgcmlnaHQgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbWF0cml4ID0gdHJhbnNmb3JtX2Z1bmN0aW9uLnN1YnN0cmluZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0ICsgMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZXMgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hdHJpeCkgdmFsdWVzID0gbWF0cml4LnNwbGl0KFwiLFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZXMgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB6X2FuZ2xlID0gTWF0aC5hdGFuMih2YWx1ZXNbMV0sIHZhbHVlc1swXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVncmVlICs9IE1hdGgucm91bmQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGgucm91bmQoKHpfYW5nbGUgKiAxODApIC8gTWF0aC5QSSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB3aGlsZSAoZGVncmVlID49IDM2MCkgZGVncmVlIC09IDM2MDtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkNhbm5vdCByZXRyaWV2ZSByb3RhdGlvbiBkZWdyZWU6IFwiICsgZXJyKTtcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVncmVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnQgQ1NTIHN0eWxlIHN0cmluZyB2YWx1ZXMgdG8gcGl4ZWxzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIHN0eWxlIHZhbHVlIGluIHN0cmluZywgc3VjaCBhcyAzcmVtLCAyMzBweCBldGMuXG4gICAgICogQHBhcmFtIHRhcmdldCBlbGVtZW50LlxuICAgICAqIEByZXR1cm4gdmFsdWUgaW4gcGl4ZWxzXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRQaXhlbHNGcm9tU3R5bGUodmFsdWUsIGVsZW0pIHtcbiAgICAgICAgaWYgKCF2YWx1ZSkgcmV0dXJuIDA7XG4gICAgICAgIGNvbnN0IHJlZ2V4ID0gLygtP1tcXGQuXSspKFthLXolXSopLztcbiAgICAgICAgbGV0IHBhcnNlZCA9IHZhbHVlLnRyaW0oKS5tYXRjaChyZWdleCk7XG4gICAgICAgIGlmIChwYXJzZWQgPT09IG51bGwpIHJldHVybiAwO1xuICAgICAgICBpZiAocGFyc2VkWzJdID09PSBcIlwiIHx8IHBhcnNlZFsxXSA9PT0gMClcbiAgICAgICAgICAgIC8vbm8gemVybyB2YWx1ZSB3aXRob3V0IHVuaXQgd2hpY2ggaXMgY29uc2lkZXJlZCBhcyBlcnJvciwgc28gaW1wbGljYWJsZVxuICAgICAgICAgICAgcmV0dXJuIDA7XG5cbiAgICAgICAgY29uc3QgcGl4ZWxzID0gQ1NTVXRpbC5jb252ZXJ0VmFsdWUyUGl4ZWxzKHBhcnNlZFsyXSwgcGFyc2VkWzFdLCBlbGVtKTtcbiAgICAgICAgcmV0dXJuIHBpeGVscyA9PT0gbnVsbCA/IHBpeGVscyA6IHBhcnNlRmxvYXQocGl4ZWxzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0IGFic29sdXRlIENTUyBudW1lcmljYWwgdmFsdWVzIHRvIHBpeGVscy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB1bml0VmFsdWUgaW4gc3RyaW5nXG4gICAgICogQHBhcmFtIHRhcmdldCBlbGVtZW50LlxuICAgICAqIEByZXR1cm4gdmFsdWUgaW4gcGl4ZWxzXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBjb252ZXJ0VmFsdWUyUGl4ZWxzKHVuaXQsIHVuaXRWYWx1ZSwgZWxlbSkge1xuICAgICAgICBpZiAodW5pdFZhbHVlID09PSAwKSByZXR1cm4gMDtcbiAgICAgICAgaWYgKCF1bml0KSB1bml0ID0gXCJweFwiO1xuICAgICAgICBjb25zdCBzdXBwb3J0ZWRVbml0cyA9IHtcbiAgICAgICAgICAgIC8vIGFic29sdXRlIHVuaXRcbiAgICAgICAgICAgIHB4OiAodmFsdWUpID0+IHZhbHVlLFxuICAgICAgICAgICAgY206ICh2YWx1ZSkgPT4gdmFsdWUgKiAzNy44LFxuICAgICAgICAgICAgbW06ICh2YWx1ZSkgPT4gdmFsdWUgKiAzLjc4LFxuICAgICAgICAgICAgcTogKHZhbHVlKSA9PiB2YWx1ZSAqIDAuOTUsXG4gICAgICAgICAgICBpbjogKHZhbHVlKSA9PiB2YWx1ZSAqIDk2LFxuICAgICAgICAgICAgcGM6ICh2YWx1ZSkgPT4gdmFsdWUgKiAxNixcbiAgICAgICAgICAgIHB0OiAodmFsdWUpID0+IHZhbHVlICogMS4zMyxcblxuICAgICAgICAgICAgLy8gcmVsYXRpdmUgdW5pdFxuICAgICAgICAgICAgcmVtOiAodmFsdWUpID0+XG4gICAgICAgICAgICAgICAgdmFsdWUgKlxuICAgICAgICAgICAgICAgIHBhcnNlRmxvYXQoXG4gICAgICAgICAgICAgICAgICAgIGdldENvbXB1dGVkU3R5bGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XG4gICAgICAgICAgICAgICAgICAgICkuZ2V0UHJvcGVydHlWYWx1ZShcImZvbnQtc2l6ZVwiKVxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICBlbTogKHZhbHVlKSA9PlxuICAgICAgICAgICAgICAgIHZhbHVlICpcbiAgICAgICAgICAgICAgICBwYXJzZUZsb2F0KFxuICAgICAgICAgICAgICAgICAgICBnZXRDb21wdXRlZFN0eWxlKGVsZW0pLmdldFByb3BlcnR5VmFsdWUoXCJmb250LXNpemVcIilcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgdnc6ICh2YWx1ZSkgPT5cbiAgICAgICAgICAgICAgICAodmFsdWUgLyAxMDApICogZWxlbS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LmlubmVyV2lkdGgsXG4gICAgICAgICAgICB2aDogKHZhbHVlKSA9PlxuICAgICAgICAgICAgICAgICh2YWx1ZSAvIDEwMCkgKiBlbGVtLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuaW5uZXJIZWlnaHQsXG4gICAgICAgICAgICBcIiVcIjogKHZhbHVlKSA9PlxuICAgICAgICAgICAgICAgICh2YWx1ZSAvIDEwMCkgKlxuICAgICAgICAgICAgICAgIHBhcnNlRmxvYXQoXG4gICAgICAgICAgICAgICAgICAgIGdldENvbXB1dGVkU3R5bGUoZWxlbSkuZ2V0UHJvcGVydHlWYWx1ZShcImZvbnQtc2l6ZVwiKVxuICAgICAgICAgICAgICAgICksXG4gICAgICAgIH07XG4gICAgICAgIFxuICAgICAgICBpZiAodW5pdCBpbiBzdXBwb3J0ZWRVbml0cykgcmV0dXJuIHN1cHBvcnRlZFVuaXRzW3VuaXRdKHVuaXRWYWx1ZSk7XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8qXG4gICAgICogUmV0dXJucyBpZiB0aGUgZm9udCBmb3IgdmlzaWJsZSB0ZXh0IG9mIHRoZSBlbGVtZW50IGlzIGRlZmluZWQgYnkgbWF0ZXJpYWwgaWNvbnNcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzTWF0ZXJpYWxJY29uRm9udChlbGVtOiBIVE1MRWxlbWVudCkge1xuICAgICAgICAvLyBUT0RPOiBjaGVjayB0aGUgZXhpc3RlbmNlIG1hdGVyaWFsIGljb25zIHVzaW5nIGZldGNoIGluIG5vZGUgMTgrXG4gICAgICAgIC8vIGZvciBub3cgKG5vZGUgMTYpIGp1c3QgZGVydGVybWluZSBpZiB0aGUgc3R5bGVzaGVldCBmb3IgdGhlICdNYXRlcmlhbCBJY29ucycgZXhpc3RzIHN0YXRpY2FsbHkuIG5vdGUgdGhhdCB0aGUgbG9hZGluZyBvZiB0aGUgZm9udCBzdHlsZXNoZWV0IG9jY3VycyBhdCBydW4gdGltZS5cbiAgICAgICAgLy9saXN0IG9mIGtub3duIG1hdGVyaWFsIGljb25zIGFuZCBzdHlsZXNoZWV0IGxpbmtcbiAgICAgICAgY29uc3Qga25vd25faWNvbnMgPSB7XG4gICAgICAgICAgICBcIk1hdGVyaWFsIEljb25zXCI6XG4gICAgICAgICAgICAgICAgXCJodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2ljb24/ZmFtaWx5PU1hdGVyaWFsK0ljb25zXCIsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGtub3duX2Nzc19jbGFzc2VzID0ge1xuICAgICAgICAgICAgXCJtYXRlcmlhbC1pY29uc1wiOlxuICAgICAgICAgICAgICAgIFwiaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9pY29uP2ZhbWlseT1NYXRlcmlhbCtJY29uc1wiLFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIG1hdGVyaWFsIGljb24gZm9udCBjYW4gYmUgZGVmaW5lZCBlaXRoZXIgYnkgZm9udC1mYW1pbHk6ICdNYXRlcmlhbCBJY29ucycgb3IgYnkgY2xhc3M9XCJtYXRlcmlhbC1pY29uc1wiXG4gICAgICAgIGxldCBzdHlsZXMgPSBDU1NVdGlsLmdldERlZmluZWRTdHlsZXMoZWxlbSwgW1wiZm9udC1mYW1pbHlcIl0pO1xuICAgICAgICBsZXQgZm9udEZhbWlseSA9IHN0eWxlc1tcImZvbnQtZmFtaWx5XCJdO1xuXG4gICAgICAgIGxldCBmb3VuZCA9IGZhbHNlO1xuICAgICAgICAvLyBmb250LWZhbWlseSBzcGVjaWZpZXMgYSBwcmlvcml0aXplZCBsaXN0IG9mIG9uZSBvciBtb3JlIGZvbnQgZmFtaWx5IG5hbWVzXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGZvbnRGYW1pbHkgJiZcbiAgICAgICAgICAgIGZvbnRGYW1pbHkuc3BsaXQoXCIsXCIpWzBdLnJlcGxhY2UoL1snXCJdKy9nLCBcIlwiKS50cmltKCkgaW4ga25vd25faWNvbnNcbiAgICAgICAgKVxuICAgICAgICAgICAgZm91bmQgPSB0cnVlO1xuXG4gICAgICAgIGlmICghZm91bmQpIHtcbiAgICAgICAgICAgIGxldCBsaXN0ID0gZWxlbS5jbGFzc0xpc3Q7XG4gICAgICAgICAgICBmb3IgKGxldCBjc3NfY2xhc3MgaW4ga25vd25fY3NzX2NsYXNzZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAobGlzdC5jb250YWlucyhjc3NfY2xhc3MpKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghZm91bmQpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBsZXQgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgIC8vIGNoZWNrIGlmIHRoZSBzdHlsZXNoZWV0IGZvciB0aGUgJ01hdGVyaWFsIEljb25zJyBleGlzdHMgc3RhdGljYWxseVxuICAgICAgICBsZXQgc2hlZXRzID0gZWxlbS5vd25lckRvY3VtZW50LnN0eWxlU2hlZXRzO1xuICAgICAgICBmb3IgKGxldCBzID0gMDsgcyA8IHNoZWV0cy5sZW5ndGg7IHMrKykge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHNoZWV0cyAmJlxuICAgICAgICAgICAgICAgIHNoZWV0cy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICAgICAgT2JqZWN0LnZhbHVlcyhrbm93bl9pY29ucykuaW5kZXhPZihzaGVldHNbc10uaHJlZikgPiAtMVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFzc2VkO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0V2VpZ2h0TnVtYmVyKHN0eWxlVmFsKSB7XG4gICAgICAgIGxldCBtYXAgPSB7XG4gICAgICAgICAgICBsaWdodDogMTAwLFxuICAgICAgICAgICAgYm9sZDogNzAwLFxuICAgICAgICB9O1xuICAgICAgICBsZXQgcmV0VmFsID0gcGFyc2VJbnQoc3R5bGVWYWwpO1xuICAgICAgICBpZiAocmV0VmFsKSByZXR1cm4gcmV0VmFsO1xuICAgICAgICBpZiAoc3R5bGVWYWwgaW4gbWFwKSByZXR1cm4gbWFwW3N0eWxlVmFsXTtcbiAgICAgICAgcmV0dXJuIDQwMDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldEZvbnRJblBpeGVscyhzdHlsZVZhbCwgZWxlbSkge1xuICAgICAgICBsZXQgbWFwID0ge1xuICAgICAgICAgICAgXCJ4eC1zbWFsbFwiOiAxNixcbiAgICAgICAgICAgIFwieC1zbWFsbFwiOiAxMCxcbiAgICAgICAgICAgIHNtYWxsOiAxMyxcbiAgICAgICAgICAgIG1lZGl1bTogMTYsXG4gICAgICAgICAgICBsYXJnZTogMTgsXG4gICAgICAgICAgICBcIngtbGFyZ2VcIjogMjQsXG4gICAgICAgICAgICBcInh4LWxhcmdlXCI6IDMyLFxuICAgICAgICB9O1xuICAgICAgICBsZXQgdmFsdWUgPSBwYXJzZUZsb2F0KHN0eWxlVmFsKTtcbiAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIG1hcFtzdHlsZVZhbF07XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHVuaXRzID0gc3R5bGVWYWwuc3Vic3RyaW5nKChcIlwiICsgdmFsdWUpLmxlbmd0aCk7XG4gICAgICAgIC8qKlxuICAgICAgICBpZiAodW5pdHMgPT09IFwiXCIgfHwgdW5pdHMgPT09IFwicHhcIikgcmV0dXJuIHZhbHVlO1xuICAgICAgICBpZiAodW5pdHMgPT09IFwiZW1cIikgcmV0dXJuIHZhbHVlICogMTY7XG4gICAgICAgIGlmICh1bml0cyA9PT0gXCIlXCIpIHJldHVybiB2YWx1ZSAvIDEwMCAqIDE2O1xuICAgICAgICBpZiAodW5pdHMgPT09IFwicHRcIikgcmV0dXJuIHZhbHVlICogNCAvIDM7XG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKHZhbHVlKTtcbiAgICAqL1xuICAgICAgICByZXR1cm4gQ1NTVXRpbC5jb252ZXJ0VmFsdWUyUGl4ZWxzKHVuaXRzLCB2YWx1ZSwgZWxlbSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRDU1NTdHlsZShlbGVtZW50KSB7XG4gICAgICAgIGxldCBzdHlsZVRleHQgPSBcIlwiO1xuICAgICAgICBpZiAoZWxlbWVudCA9PT0gbnVsbCkgcmV0dXJuIFtdO1xuICAgICAgICBpZiAoZWxlbWVudC5JQk1fQ1NTX1RIQikgcmV0dXJuIGVsZW1lbnQuSUJNX0NTU19USEI7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IGVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSBcInN0eWxlXCIpIHtcbiAgICAgICAgICAgIHN0eWxlVGV4dCA9IGVsZW1lbnQuaW5uZXJUZXh0O1xuICAgICAgICAgICAgaWYgKHN0eWxlVGV4dCA9PT0gdW5kZWZpbmVkIHx8IHN0eWxlVGV4dC50cmltKCkgPT09IFwiXCIpXG4gICAgICAgICAgICAgICAgc3R5bGVUZXh0ID0gZWxlbWVudC50ZXh0Q29udGVudDtcbiAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZShcInN0eWxlXCIpKSB7XG4gICAgICAgICAgICBzdHlsZVRleHQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcInN0eWxlXCIpO1xuICAgICAgICB9IGVsc2UgcmV0dXJuIFtdO1xuICAgICAgICBpZiAoc3R5bGVUZXh0ID09PSBudWxsIHx8IHN0eWxlVGV4dC50cmltKCkubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG4gICAgICAgIC8vcmVtb3ZlIGNvbW1lbnQgYmxvY2tzXG4gICAgICAgIGxldCByZSA9IC8oXFwvXFwqKyg/Oig/Oig/OlteXFwqXSkrKXwoPzpbXFwqXSsoPyFcXC8pKSlbKl0rXFwvKXxcXC9cXC8uKi9nO1xuICAgICAgICBsZXQgc3Vic3QgPSBcIiBcIjtcbiAgICAgICAgc3R5bGVUZXh0ID0gc3R5bGVUZXh0LnJlcGxhY2UocmUsIHN1YnN0KTtcbiAgICAgICAgLy8gRmluZCBhbGwgXCJrZXkgOiB2YWw7XCIgcGFpcnMgd2l0aCB2YXJpb3VzIHdoaXRlc3BhY2UgaW5iZXR3ZWVuXG4gICAgICAgIGxldCByS2V5VmFscyA9IC9cXHMqKFteOlxcc10rKVxccyo6XFxzKihbXjskfV0rKVxccyooO3wkKS9nO1xuICAgICAgICAvLyBGaW5kIGFsbCBcInNlbGVjdG9yIHsgY3Nza2V5dmFscyB9IHdpdGggdmFyaW91cyB3aGl0ZXNwYWNlIGluYmV0d2VlblxuICAgICAgICBsZXQgclNlbGVjdG9ycyA9IC9cXHMqKFtee10qKXsoW159XSopfS9nO1xuICAgICAgICBpZiAoc3R5bGVUZXh0LmluZGV4T2YoXCJ7XCIpID09PSAtMSkge1xuICAgICAgICAgICAgbGV0IGtleVZhbHMgPSB7fTtcbiAgICAgICAgICAgIGxldCBtO1xuICAgICAgICAgICAgd2hpbGUgKChtID0gcktleVZhbHMuZXhlYyhzdHlsZVRleHQpKSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAga2V5VmFsc1ttWzFdXSA9IG1bMl0udHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgcmV0VmFsID0gW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlczoga2V5VmFscyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGVsZW1lbnQuSUJNX0NTU19USEIgPSByZXRWYWw7XG4gICAgICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IHJldFZhbCA9IFtdO1xuICAgICAgICAgICAgbGV0IG07XG4gICAgICAgICAgICBsZXQgbTI7XG4gICAgICAgICAgICB3aGlsZSAoKG0gPSByU2VsZWN0b3JzLmV4ZWMoc3R5bGVUZXh0KSkgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGxldCBrZXlWYWxzID0ge307XG4gICAgICAgICAgICAgICAgbGV0IHNlbEtleSA9IG1bMV07XG4gICAgICAgICAgICAgICAgbGV0IHNlbFZhbCA9IG1bMl07XG5cbiAgICAgICAgICAgICAgICB3aGlsZSAoKG0yID0gcktleVZhbHMuZXhlYyhzZWxWYWwpKSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGtleVZhbHNbbTJbMV1dID0gbTJbMl0udHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldFZhbC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6IHNlbEtleSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiBrZXlWYWxzLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxlbWVudC5JQk1fQ1NTX1RIQiA9IHJldFZhbDtcbiAgICAgICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBhbiBcImlubGluZVwiIENTUyBkaXNwbGF5IHByb3BlcnR5IHRlbGxzIHRoZSBlbGVtZW50IHRvIGZpdCBpdHNlbGYgb24gdGhlIHNhbWUgbGluZS4gQW4gJ2lubGluZScgZWxlbWVudCdzIHdpZHRoIGFuZCBoZWlnaHQgYXJlIGlnbm9yZWQuXG4gICAgICogc29tZSBlbGVtZW50IGhhcyBkZWZhdWx0IGlubGluZSBwcm9wZXJ0eSwgc3VjaCBhcyA8c3Bhbj4sIDxhPlxuICAgICAqIG1vc3QgZm9ybWF0dGluZyBlbGVtZW50cyBpbmhlcmVudCBpbmxpbmUgcHJvcGVydHksIHN1Y2ggYXMgPGVtPiwgPHN0cm9uZz4sIDxpPiwgPHNtYWxsPlxuICAgICAqIG90aGVyIGlubGluZSBlbGVtZW50czogPGFiYnI+IDxhY3JvbnltPiA8Yj4gPGJkbz4gPGJpZz4gPGJyPiA8Y2l0ZT4gPGNvZGU+IDxkZm4+IDxlbT4gPGk+IDxpbnB1dD4gPGtiZD4gPGxhYmVsPlxuICAgICAqIDxtYXA+IDxvYmplY3Q+IDxvdXRwdXQ+IDxxPiA8c2FtcD4gPHNjcmlwdD4gPHNlbGVjdD4gPHNtYWxsPiA8c3Bhbj4gPHN0cm9uZz4gPHN1Yj4gPHN1cD4gPHRleHRhcmVhPiA8dGltZT4gPHR0PiA8dmFyPlxuICAgICAqIGFuIFwiaW5saW5lLWJsb2NrXCIgZWxlbWVudCBzdGlsbCBwbGFjZSBlbGVtZW50IGluIHRoZSBzYW1lIGxpbmUgd2l0aG91dCBicmVha2luZyB0aGUgbGluZSwgYnV0IHRoZSBlbGVtZW50J3Mgd2lkdGggYW5kIGhlaWdodCBhcmUgYXBwbGllZC5cbiAgICAgKiBpbmxpbmUtYmxvY2sgZWxlbWVudHM6IGltZywgYnV0dG9uLCBzZWxlY3QsIG1ldGVyLCBwcm9ncmVzcywgbWFyZ3VlZSwgYWxzbyBpbiBDaHJvbWU6IHRleHRhcmVhLCBpbnB1dFxuICAgICAqIEEgYmxvY2stbGV2ZWwgZWxlbWVudCBhbHdheXMgc3RhcnRzIG9uIGEgbmV3IGxpbmUsIGFuZCB0aGUgYnJvd3NlcnMgYXV0b21hdGljYWxseSBhZGQgc29tZSBzcGFjZSAoYSBtYXJnaW4pIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIGVsZW1lbnQuXG4gICAgICogYmxvY2stbGV2ZWwgZWxlbWVudHM6IDxhZGRyZXNzPiA8YXJ0aWNsZT4gPGFzaWRlPiA8YmxvY2txdW90ZT4gPGNhbnZhcz4gPGRkPiA8ZGl2PiA8ZGw+IDxkdD4gPGZpZWxkc2V0PiA8ZmlnY2FwdGlvbj4gPGZpZ3VyZT4gPGZvb3Rlcj4gPGZvcm0+XG4gICAgICogPGgxPi08aDY+IDxoZWFkZXI+IDxocj4gPGxpPiA8bWFpbj4gPG5hdj4gPG5vc2NyaXB0PiA8b2w+IDxwPiA8cHJlPiA8c2VjdGlvbj4gPHRhYmxlPiA8dGZvb3Q+IDx1bD4gPHZpZGVvPlxuICAgICAqXG4gICAgICogcmV0dXJuOiBpZiBpdCdzIGlubGluZSBlbGVtZW50IGFuZCB7IGlubGluZTogdHJ1ZSB8IGZhbHNlLCB0ZXh0OiB0cnVlIHwgZmFsc2UsIHZpb2xhdGlvbjogbnVsbCB8IHtub2RlfSB9XG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRJbmxpbmVTdGF0dXMoZWxlbWVudCkge1xuICAgICAgICBpZiAoIWVsZW1lbnQpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IGVsZW1fc3R5bCA9IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCk7XG4gICAgICAgIGlmICghZWxlbV9zdHlsKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgc3RhdHVzID0geyBpbmxpbmU6IGZhbHNlLCB0ZXh0OiBmYWxzZSwgdmlvbGF0aW9uOiBudWxsIH07XG4gICAgICAgIGNvbnN0IHVkaXNwbGF5ID0gZWxlbV9zdHlsLmdldFByb3BlcnR5VmFsdWUoXCJkaXNwbGF5XCIpO1xuICAgICAgICAvLyBpbmxpbmUgZWxlbWVudCBvbmx5XG4gICAgICAgIGlmICh1ZGlzcGxheSAhPT0gXCJpbmxpbmVcIikgcmV0dXJuIHN0YXR1cztcblxuICAgICAgICBzdGF0dXMuaW5saW5lID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgcGFyZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICAgICAgICBpZiAoIXBhcmVudCkgcmV0dXJuIHN0YXR1cztcblxuICAgICAgICBjb25zdCBtYXBwZXI6IERPTU1hcHBlciA9IG5ldyBET01NYXBwZXIoKTtcbiAgICAgICAgY29uc3QgYm91bmRzID0gbWFwcGVyLmdldFVuYWRqdXN0ZWRCb3VuZHMoZWxlbWVudCk7XG4gICAgICAgIGNvbnN0IHN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShwYXJlbnQpO1xuICAgICAgICBjb25zdCBkaXNwbGF5ID0gc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShcImRpc3BsYXlcIik7XG4gICAgICAgIC8vIGFuIGlubGluZSBlbGVtZW50IGlzIGluc2lkZSBhIGJsb2NrLiBub3RlIDxib2R5PiBpcyBhIGJsb2NrIGVsZW1lbnQgdG9vXG4gICAgICAgIGlmIChkaXNwbGF5ICE9PSBcImJsb2NrXCIgJiYgZGlzcGxheSAhPT0gXCJpbmxpbmUtYmxvY2tcIikge1xuICAgICAgICAgICAgLy9wYXJlbnQgaXMgaW5saW5lIGVsZW1lbnRcbiAgICAgICAgICAgIGlmICghQ29tbW9uVXRpbC5pc0lubmVyVGV4dE9ubHlFbXB0eShwYXJlbnQpKVxuICAgICAgICAgICAgICAgIHN0YXR1cy50ZXh0ID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiBzdGF0dXM7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogQHJldHVybnMgXCJ5ZXNcIlwiOiBpbmxpbmUgd2l0aCB0ZXh0LCBcIm5vXCI6IGlubGluZSB3aXRob3V0IHRleHQsIFxuICAgICAgICAgKiAgICAgICAgICBcInZpb2xhdGlvblwiOiBub3Qgc3BhY2luZyBlbm91Z2ggdG8gbmVpYm9yaW5nIGlubGluZSB0YXJnZXRcbiAgICAgICAgICogICAgICAgICAgXCJibG9ja1wiOiBibG9jayBlbGVtZW50LCAgXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBpc0lubGluZVdpdGhUZXh0KG5vZGU6IE5vZGUsIGJlZm9yZTogYm9vbGVhbikgOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgICAgIC8vIG5vdGUgYnJvd3NlcnMgaW5zZXJ0IFRleHQgbm9kZXMgdG8gcmVwcmVzZW50IHdoaXRlc3BhY2VzLlxuICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUubm9kZVZhbHVlICYmIG5vZGUubm9kZVZhbHVlLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJ5ZXNcIjtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIm5vXCI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG5vZGUubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlOiA8YnI+IGlzIHN0eWxlZCAnaW5saW5lJyBieSBkZWZhdWx0LCBidXQgY2hhbmdlIHRoZSBsaW5lXG4gICAgICAgICAgICAgICAgaWYgKG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJiclwiKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJibG9ja1wiO1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBjb25zdCBjU3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKG5vZGUgYXMgRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgY29uc3QgY0Rpc3BsYXkgPSBjU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShcImRpc3BsYXlcIik7XG4gICAgICAgICAgICAgICAgaWYgKGNEaXNwbGF5ID09PSBcImlubGluZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChDb21tb25VdGlsLmlzVGFyZ2V0KG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYm91bmRzLndpZHRoIDwgMjQpIHsgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlIGhvcml6b250YWwgc3BhY2luZyBpcyBzdWZmaWNpZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm5kcyA9IG1hcHBlci5nZXRVbmFkanVzdGVkQm91bmRzKG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoYmVmb3JlICYmIChNYXRoLnJvdW5kKGJvdW5kcy53aWR0aCAvIDIpICsgYm91bmRzLmxlZnQgLSBibmRzLmxlZnQgPCAyNCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICghYmVmb3JlICYmIChNYXRoLnJvdW5kKGJvdW5kcy53aWR0aCAvIDIpICsgYm91bmRzLmxlZnQgLSAoYm5kcy5sZWZ0ICsgYm5kcy53aWR0aCkgPCAyNCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cy52aW9sYXRpb24gPSBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcInZpb2xhdGlvblwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJub1wiOyAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgfSBcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFDb21tb25VdGlsLmlzSW5uZXJUZXh0T25seUVtcHR5KG5vZGUpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwieWVzXCI7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIm5vXCI7XG4gICAgICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcImJsb2NrXCI7XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgIHJldHVybiBcImJsb2NrXCI7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhbiBpbmxpbmUgZWxlbWVudCBpcyBpbnNpZGUgYSBibG9jay4gbm90ZSA8Ym9keT4gaXMgYSBibG9jayBlbGVtZW50IHRvb1xuICAgICAgICAvLyBvbmUgb3IgbW9yZSBpbmxpbmUgZWxlbWVudHMgd2l0aCB0ZXh0IGluIHRoZSBzYW1lIGxpbmU6IDx0YXJnZXQ+LCB0ZXh0PHRhcmdldD4sIDx0YXJnZXQ+dGV4dCwgPGlubGluZT4rdGV4dDx0YXJnZXQ+LCA8dGFyZ2V0PjxpbmxpbmU+K3RleHQsIHRleHQ8dGFyZ2V0PjxpbmxpbmU+K1xuICAgICAgICBsZXQgd2Fsa05vZGUgPSBlbGVtZW50Lm5leHRTaWJsaW5nO1xuICAgICAgICB3aGlsZSAod2Fsa05vZGUpIHtcbiAgICAgICAgICAgIGxldCBpbmxpbmVUZXh0ID0gaXNJbmxpbmVXaXRoVGV4dCh3YWxrTm9kZSwgdHJ1ZSk7XG4gICAgICAgICAgICBpZiAoaW5saW5lVGV4dCA9PT0gXCJ5ZXNcIikge1xuICAgICAgICAgICAgICAgIHN0YXR1cy50ZXh0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpbmxpbmVUZXh0ID09PSBcImJsb2NrXCIpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdhbGtOb2RlID0gd2Fsa05vZGUubmV4dFNpYmxpbmc7XG4gICAgICAgIH1cblxuICAgICAgICB3YWxrTm9kZSA9IGVsZW1lbnQucHJldmlvdXNTaWJsaW5nO1xuICAgICAgICB3aGlsZSAod2Fsa05vZGUpIHtcbiAgICAgICAgICAgIGxldCBpbmxpbmVUZXh0ID0gaXNJbmxpbmVXaXRoVGV4dCh3YWxrTm9kZSwgZmFsc2UpO1xuICAgICAgICAgICAgaWYgKGlubGluZVRleHQgPT09IFwieWVzXCIpIHtcbiAgICAgICAgICAgICAgICBzdGF0dXMudGV4dCA9IHRydWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaW5saW5lVGV4dCA9PT0gXCJibG9ja1wiKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3YWxrTm9kZSA9IHdhbGtOb2RlLnByZXZpb3VzU2libGluZztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RhdHVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGEgdGFyZ2V0IGlzIGVuIGVsZW1lbnQgdGhhdCBhY2NlcHQgYSBwb2ludGVyIGFjdGlvbiAoY2xpY2sgb3IgdG91Y2gpXG4gICAgICogYSB0YXJnZXQgaXMgYSBicm93c2VyIGRlZmF1bHQgaWYgaXQncyBhIG5hdGl2ZSB3aWRnZXQgKG5vIHVzZXIgZGVmaW5lZCByb2xlKSB3aXRob3V0IHVzZXIgc3R5bGVcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzVGFyZ2V0QnJvd3NlckRlZmF1bHQoZWxlbWVudCkge1xuICAgICAgICBpZiAoIWVsZW1lbnQpIHJldHVybiBmYWxzZTtcblxuICAgICAgICAvLyB1c2VyIGRlZmluZWQgd2lkZ2V0XG4gICAgICAgIGNvbnN0IHJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXMoZWxlbWVudCwgZmFsc2UpO1xuICAgICAgICBpZiAocm9sZXMgJiYgcm9sZXMubGVuZ3RoID4gMCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIC8vIG5vIHVzZXIgc3R5bGUgdG8gc3BhY2UgY29udHJvbCBzaXplLCBpbmNsdWRpbmcgdXNlIG9mIGZvbnRcbiAgICAgICAgY29uc3Qgc3R5bGVzID0gQ1NTVXRpbC5nZXREZWZpbmVkU3R5bGVzKGVsZW1lbnQsIFtcbiAgICAgICAgICAgIFwibGluZS1oZWlnaHRcIiwgXCJoZWlnaHRcIiwgXCJ3aWR0aFwiLFwibWluLWhlaWdodFwiLCBcIm1pbi13aWR0aFwiLFxuICAgICAgICAgICAgXCJmb250LXNpemVcIixcIm1hcmdpbi10b3BcIixcIm1hcmdpbi1ib3R0b21cIiwgXCJtYXJnaW4tbGVmdFwiLCBcIm1hcmdpbi1yaWdodFwiXG4gICAgICAgIF0pO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICBzdHlsZXNbXCJsaW5lLWhlaWdodFwiXSB8fFxuICAgICAgICAgICAgc3R5bGVzW1wiaGVpZ2h0XCJdIHx8XG4gICAgICAgICAgICBzdHlsZXNbXCJ3aWR0aFwiXSB8fFxuICAgICAgICAgICAgc3R5bGVzW1wibWluLWhlaWdodFwiXSB8fFxuICAgICAgICAgICAgc3R5bGVzW1wibWluLXdpZHRoXCJdIHx8XG4gICAgICAgICAgICBzdHlsZXNbXCJmb250LXNpemVcIl0gfHxcbiAgICAgICAgICAgIHN0eWxlc1tcIm1hcmdpbi10b3BcIl0gfHxcbiAgICAgICAgICAgIHN0eWxlc1tcIm1hcmdpbi1ib3R0b21cIl0gfHxcbiAgICAgICAgICAgIHN0eWxlc1tcIm1hcmdpbi1sZWZ0XCJdIHx8XG4gICAgICAgICAgICBzdHlsZXNbXCJtYXJnaW4tcmlnaHRcIl1cbiAgICAgICAgKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qXG4gICAgICogc3RyaW5nIGNvbnRhaW5zIENKSyAoY2hpbmVzZSwgamFwYW5lc2VzLCBvciBrb3JlYSlcbiAgICAgKiByZXR1cm46IGJvb2xlYW5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGNvbnRhaW5zQ0tKKHRleHQ6IHN0cmluZykge1xuICAgICAgICBpZiAoIXRleHQpIHJldHVybiBmYWxzZTtcblxuICAgICAgICAvLyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9DSktfVW5pZmllZF9JZGVvZ3JhcGhzICBodHRwczovL2F5YWthLnNobi5oay9oYW5yZWdleC9cbiAgICAgICAgbGV0IHJlZ2V4ID0gLyg/OltcXHU0ZTAwLVxcdTlmZmZcXHUzNDAwLVxcdTRkYmZdKSsvZztcblxuICAgICAgICBjb25zdCByZXBsYWNlZCA9IHRleHQudHJpbSgpLnJlcGxhY2UocmVnZXgsIFwiXCIpO1xuICAgICAgICBpZiAocmVwbGFjZWQubGVuZ3RoID09PSB0ZXh0LnRyaW0oKS5sZW5ndGgpIHJldHVybiBmYWxzZTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIGFuY2VzdG9yIHdpdGggdGhlIGdpdmVuIHN0eWxlIHByb3BlcnRpZXMuXG4gICAgICogU2VhcmNoZXMgdXAgdGhlIERPTSB0cmVlIHRvIGZpbmQgYW4gYW5jZXN0b3IgdGhhdCBoYXMgQUxMIHNwZWNpZmllZCBzdHlsZSBwcm9wZXJ0aWVzXG4gICAgICogd2l0aCB2YWx1ZXMgbWF0Y2hpbmcgdGhlIGNyaXRlcmlhLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtlbGVtZW50fSBlbGVtIC0gVGhlIGVsZW1lbnQgdG8gc3RhcnQgdGhlIG5vZGUgd2FsayBvbiB0byBmaW5kIHBhcmVudCBub2RlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHN0eWxlUHJvcHMgLSBUaGUgc3R5bGUgcHJvcGVydGllcyBhbmQgdmFsdWVzIG9mIHRoZSBwYXJlbnQgdG8gc2VhcmNoIGZvci5cbiAgICAgKiAgICAgICAgIHN1Y2ggYXMge1wib3ZlcmZsb3dcIjpbJ2F1dG8nLCAnc2Nyb2xsJ10sIFwib3ZlcmZsb3cteFwiOlsnYXV0bycsICdzY3JvbGwnXX1cbiAgICAgKiAgICAgICAgICBvciB7XCJvdmVyZmxvd1wiOlsnKiddLCBcIm92ZXJmbG93LXhcIjpbJyonXX0sIFRoZSAnKicgZm9yIGFueSB2YWx1ZSB0byBjaGVjayB0aGUgZXhpc3RlbmNlIG9mIHRoZSBzdHlsZSBwcm9wLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGV4Y2x1ZGVkVmFsdWVzIC0gc3R5bGUgdmFsdWVzIHRoYXQgc2hvdWxkIGJlIGlnbm9yZWQuXG4gICAgICogQHJldHVybiB7RWxlbWVudHxudWxsfSAtIEFuIGFuY2VzdG9yIGVsZW1lbnQgdGhhdCBoYXMgYWxsIHRoZSBzcGVjaWZpZWQgc3R5bGUgcHJvcGVydGllcywgb3IgbnVsbCBpZiBub25lIGZvdW5kXG4gICAgICogQG1lbWJlck9mIENTU1V0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEFuY2VzdG9yV2l0aFN0eWxlcyhlbGVtLCBzdHlsZVByb3BzLCBleGNsdWRlZFZhbHVlcyA9IFtdKSB7XG4gICAgICAgIC8vIENyZWF0ZSBhIGNhY2hlIGtleSB0aGF0IGluY2x1ZGVzIHRoZSBzdHlsZSBwcm9wZXJ0aWVzIGJlaW5nIHNlYXJjaGVkIGZvclxuICAgICAgICBjb25zdCBjYWNoZUtleSA9IFwiQXJpYVV0aWxfQW5jZXN0b3JXaXRoU3R5bGVzX1wiICsgSlNPTi5zdHJpbmdpZnkoc3R5bGVQcm9wcykgKyBcIl9cIiArIEpTT04uc3RyaW5naWZ5KGV4Y2x1ZGVkVmFsdWVzKTtcbiAgICAgICAgXG4gICAgICAgIC8vIENoZWNrIGlmIHdlIGFscmVhZHkgaGF2ZSBhIGNhY2hlZCByZXN1bHQgZm9yIHRoaXMgc3BlY2lmaWMgcXVlcnlcbiAgICAgICAgY29uc3QgY2FjaGVkUmVzdWx0ID0gQ2FjaGVVdGlsLmdldENhY2hlKGVsZW0sIGNhY2hlS2V5LCBudWxsKTtcbiAgICAgICAgaWYgKGNhY2hlZFJlc3VsdCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFJlc3VsdCA9PT0gXCJOT1RfRk9VTkRcIiA/IG51bGwgOiBjYWNoZWRSZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdGFydCB3aXRoIHRoZSBlbGVtZW50IGl0c2VsZiAobm90IGp1c3QgcGFyZW50KSB0byBtYWludGFpbiBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gICAgICAgIGxldCB3YWxrTm9kZSA9IGVsZW07XG4gICAgICAgIHdoaWxlICh3YWxrTm9kZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gU2tpcCBpZiBub3QgYW4gSFRNTEVsZW1lbnQgKGUuZy4sIFNWR0VsZW1lbnQpXG4gICAgICAgICAgICAvLyBVc2Ugbm9kZVR5cGUgY2hlY2sgaW5zdGVhZCBvZiBpbnN0YW5jZW9mIHRvIHdvcmsgYWNyb3NzIGRpZmZlcmVudCBkb2N1bWVudCBjb250ZXh0c1xuICAgICAgICAgICAgaWYgKHdhbGtOb2RlLm5vZGVUeXBlICE9PSAxIHx8IHdhbGtOb2RlLm5hbWVzcGFjZVVSSSA9PT0gXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiKSB7XG4gICAgICAgICAgICAgICAgd2Fsa05vZGUgPSBET01XYWxrZXIucGFyZW50RWxlbWVudCh3YWxrTm9kZSk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNvbnN0IHN0eWxlcyA9IENTU1V0aWwuZ2V0RGVmaW5lZFN0eWxlcyh3YWxrTm9kZSwgT2JqZWN0LmtleXMoc3R5bGVQcm9wcykpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBDaGVjayBpZiBBTlkgc3BlY2lmaWVkIHN0eWxlIHByb3BlcnR5IG1hdGNoZXMgdGhlIGNyaXRlcmlhIChPUiBsb2dpYylcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3R5bGVQcm9wIGluIHN0eWxlUHJvcHMpIHtcbiAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSBzdHlsZXNbc3R5bGVQcm9wXTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFByb3BlcnR5IG5vdCBkZWZpbmVkIG9uIHRoaXMgZWxlbWVudCwgdHJ5IG5leHQgcHJvcGVydHlcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIFJlbW92ZSAhaW1wb3J0YW50IHN1ZmZpeCBmb3IgY29tcGFyaXNvblxuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuc3BsaXQoXCIgXCIpWzBdO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHZhbHVlIHNob3VsZCBiZSBleGNsdWRlZFxuICAgICAgICAgICAgICAgIGlmIChleGNsdWRlZFZhbHVlcy5pbmNsdWRlcyh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHZhbHVlIG1hdGNoZXMgdGhlIGNyaXRlcmlhXG4gICAgICAgICAgICAgICAgY29uc3QgYWNjZXB0ZWRWYWx1ZXMgPSBzdHlsZVByb3BzW3N0eWxlUHJvcF07XG4gICAgICAgICAgICAgICAgaWYgKGFjY2VwdGVkVmFsdWVzLmluY2x1ZGVzKCcqJykpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQW55IHZhbHVlIGlzIGFjY2VwdGFibGUgKGp1c3QgY2hlY2tpbmcgZXhpc3RlbmNlKVxuICAgICAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgY2FjaGVLZXksIHdhbGtOb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdhbGtOb2RlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWNjZXB0ZWRWYWx1ZXMuaW5jbHVkZXModmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFZhbHVlIG1hdGNoZXMgb25lIG9mIHRoZSBhY2NlcHRlZCB2YWx1ZXNcbiAgICAgICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIGNhY2hlS2V5LCB3YWxrTm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB3YWxrTm9kZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHdhbGtOb2RlID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQod2Fsa05vZGUpO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBObyBtYXRjaGluZyBlbGVtZW50IG9yIGFuY2VzdG9yIGZvdW5kIC0gY2FjaGUgdGhpcyByZXN1bHQgdG8gYXZvaWQgcmUtc2VhcmNoaW5nXG4gICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBjYWNoZUtleSwgXCJOT1RfRk9VTkRcIik7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHJldHVybiBhbiBhcnJheSBbdmFsdWUsIFVuaXRdIGZyb20gYSB2YWx1ZS11bml0IGNvbWJvIHN0cmluZ1xuICAgICAqIEBwYXJhbSB2YWx1ZVVuaXRDb21ibywgc3VjaCBhcyAyMHB4LCAycmVtIFxuICAgICAqIEByZXR1cm5zIFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0VmFsdWVVbml0UGFpcih2YWx1ZVVuaXRDb21ibykge1xuICAgICAgICBpZiAoIXZhbHVlVW5pdENvbWJvKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcih2YWx1ZVVuaXRDb21ibykpIHJldHVybiBbXCJweFwiLCB2YWx1ZVVuaXRDb21ib107XG5cbiAgICAgICAgY29uc3QgdmFsdWUgPSBwYXJzZUludCh2YWx1ZVVuaXRDb21ibyk7XG4gICAgICAgIGlmIChpc05hTih2YWx1ZSkpIHJldHVybiBudWxsO1xuXG4gICAgICAgIHZhbHVlVW5pdENvbWJvID0gdmFsdWVVbml0Q29tYm8udHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGxldCBtYXRjaCA9IHZhbHVlVW5pdENvbWJvLnRyaW0oKS5tYXRjaCgvKFthLXpdKykkLyk7XG4gICAgICAgIGxldCB1bml0ID0gJ3B4JztcbiAgICAgICAgaWYgKG1hdGNoKSB1bml0ID0gbWF0Y2hbMV07XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gW3VuaXQsIHZhbHVlXTtcbiAgICB9XG5cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIENhY2hlRG9jdW1lbnQgZXh0ZW5kcyBEb2N1bWVudCB7XG4gICAgYWNlQ2FjaGU6IHsgW2tleTogc3RyaW5nXTogYW55IH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgQ2FjaGVFbGVtZW50IGV4dGVuZHMgRWxlbWVudCB7XG4gICAgYWNlQ2FjaGU6IHsgW2tleTogc3RyaW5nXTogYW55IH1cbn1cblxuZXhwb3J0IGNsYXNzIENhY2hlVXRpbCB7XG4gICAgLyogUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgZ2l2ZW4gZ2xvYmFsIHZhcmlhYmxlXG4gICAgICAgICAqIHdpdGggaXRzIGluaXRpYWwgdmFsdWUgYXMgZ2l2ZW4gKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldENhY2hlKGNhY2hlU3BvdDogRWxlbWVudCB8IERvY3VtZW50IHwgRG9jdW1lbnRGcmFnbWVudCwga2V5TmFtZSwgaW5pdFZhbHVlKSB7XG4gICAgICAgIGlmICghY2FjaGVTcG90KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICBsZXQgY2FjaGVPYmogPSAoY2FjaGVTcG90Lm5vZGVUeXBlID09PSA5IC8qIE5vZGUuRE9DVU1FTlRfTk9ERSAqLyB8fCBjYWNoZVNwb3Qubm9kZVR5cGUgPT09IDExIC8qIE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSAqLykgPyBjYWNoZVNwb3QgYXMgQ2FjaGVEb2N1bWVudCA6IGNhY2hlU3BvdCBhcyBDYWNoZUVsZW1lbnQ7XG4gICAgICAgIGlmIChjYWNoZU9iai5hY2VDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjYWNoZU9iai5hY2VDYWNoZSA9IHt9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNhY2hlT2JqLmFjZUNhY2hlW2tleU5hbWVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNhY2hlT2JqLmFjZUNhY2hlW2tleU5hbWVdID0gaW5pdFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYWNoZU9iai5hY2VDYWNoZVtrZXlOYW1lXVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgc2V0Q2FjaGUoY2FjaGVTcG90OiBEb2N1bWVudCB8IEVsZW1lbnQgfCBEb2N1bWVudEZyYWdtZW50IHwgU2hhZG93Um9vdCwgZ2xvYmFsTmFtZSwgdmFsdWUpOiBhbnkge1xuICAgICAgICBpZiAoIWNhY2hlU3BvdCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IGNhY2hlT2JqID0gKGNhY2hlU3BvdC5ub2RlVHlwZSA9PT0gOSAvKiBOb2RlLkRPQ1VNRU5UX05PREUgKi8gfHwgY2FjaGVTcG90Lm5vZGVUeXBlID09PSAxMSAvKiBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUgKi8pID8gY2FjaGVTcG90IGFzIENhY2hlRG9jdW1lbnQgOiBjYWNoZVNwb3QgYXMgQ2FjaGVFbGVtZW50O1xuICAgICAgICBpZiAoY2FjaGVPYmouYWNlQ2FjaGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY2FjaGVPYmouYWNlQ2FjaGUgPSB7fVxuICAgICAgICB9XG4gICAgICAgIGNhY2hlT2JqLmFjZUNhY2hlW2dsb2JhbE5hbWVdID0gdmFsdWU7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldFNldENhY2hlKGNhY2hlU3BvdDogRWxlbWVudCB8IERvY3VtZW50IHwgRG9jdW1lbnRGcmFnbWVudCwga2V5TmFtZSwgaW5pdEZ1bmM6ICgpID0+IGFueSkge1xuICAgICAgICBpZiAoIWNhY2hlU3BvdCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IGNhY2hlT2JqID0gKGNhY2hlU3BvdC5ub2RlVHlwZSA9PT0gOSAvKiBOb2RlLkRPQ1VNRU5UX05PREUgKi8gfHwgY2FjaGVTcG90Lm5vZGVUeXBlID09PSAxMSAvKiBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUgKi8pID8gY2FjaGVTcG90IGFzIENhY2hlRG9jdW1lbnQgOiBjYWNoZVNwb3QgYXMgQ2FjaGVFbGVtZW50O1xuICAgICAgICBpZiAoY2FjaGVPYmouYWNlQ2FjaGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY2FjaGVPYmouYWNlQ2FjaGUgPSB7fVxuICAgICAgICB9XG4gICAgICAgIGlmIChjYWNoZU9iai5hY2VDYWNoZVtrZXlOYW1lXSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBjYWNoZU9iai5hY2VDYWNoZVtrZXlOYW1lXSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgY2FjaGVPYmouYWNlQ2FjaGVba2V5TmFtZV0gPSBpbml0RnVuYygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYWNoZU9iai5hY2VDYWNoZVtrZXlOYW1lXVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY2xlYXJDYWNoZXMoY2FjaGVSb290OiBOb2RlKTogbnVtYmVyIHtcbiAgICAgICAgbGV0IG51bU5vZGVzVmlzaXRlZCA9IDA7XG4gICAgICAgIGRlbGV0ZSAoY2FjaGVSb290Lm93bmVyRG9jdW1lbnQgYXMgQ2FjaGVEb2N1bWVudCkuYWNlQ2FjaGU7XG4gICAgICAgIGxldCBudyA9IG5ldyBET01XYWxrZXIoY2FjaGVSb290LCBmYWxzZSwgY2FjaGVSb290LCB0cnVlKTtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgKytudW1Ob2Rlc1Zpc2l0ZWQ7XG4gICAgICAgICAgICBkZWxldGUgKG53Lm5vZGUgYXMgQ2FjaGVFbGVtZW50KS5hY2VDYWNoZTtcbiAgICAgICAgICAgIG53Lm5vZGUub3duZXJEb2N1bWVudCAmJiBkZWxldGUgKG53Lm5vZGUub3duZXJEb2N1bWVudCBhcyBDYWNoZURvY3VtZW50KS5hY2VDYWNoZTtcbiAgICAgICAgfSB3aGlsZSAobncubmV4dE5vZGUoKSk7XG4gICAgICAgIHJldHVybiBudW1Ob2Rlc1Zpc2l0ZWQ7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBDYWNoZVV0aWwgfSBmcm9tIFwiLi9DYWNoZVV0aWxcIjtcbmltcG9ydCB7IENTU1V0aWwgfSBmcm9tIFwiLi9DU1NVdGlsXCI7XG5cbmV4cG9ydCBjbGFzcyBDbGlwUGF0aFV0aWwge1xuICAgIFxuICAgIHByaXZhdGUgc3RhdGljIFRIUkVTSE9MRCA6IG51bWJlciA9IDU7ICAvLyA1cHhcbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBjaGVja2luZyBpZiB0aGUgbm9kZSB0aGF0IGlzIHZpc3VhbGx5IGhpZGRlbiBieSBjc3MgY2xpcC1wYXRoOlxuICAgICAqXG4gICAgICogTm90ZSAxOiBJZiBlaXRoZXIgY3VycmVudCBub2RlIG9yIGFueSBvZiB0aGUgcGFyZW50IG5vZGVzIGFyZSB2aXN1YWxseSBoaWRkZW4gdGhlbiB0aGlzXG4gICAgICogICAgICAgICAgZnVuY3Rpb24gd2lsbCByZXR1cm4gdHJ1ZSAobm9kZSBpcyBub3QgdmlzdWFsbHkgaGlkZGVuKS5cbiAgICAgKlxuICAgICAqIE5vdGUgMjogbm9kZXMgd2l0aCBDU1MgcHJvcGVydGllcyBjbGlwLXBhdGgsIHRoZSBjb250ZW50IGlzIG5vdCBjb25zaWRlcmVkIGhpZGRlbiB0byBhbiBBVC4gVGV4dCBoaWRkZW4gd2l0aCB0aGVzZSBtZXRob2RzIFxuICAgICAqICAgICAgY2FuIHN0aWxsIGJlIHJlZWRhYmxlIGJ5IHNjcmVlbiByZWFkZXJzLiBcbiAgICAgKiBOb3RlIDM6IGlmIGEgbGluaywgZm9ybSBjb250cm9sLCBvciBvdGhlciBmb2N1c2FibGUgZWxlbWVudCBpcyBnaXZlbiB0aGlzIHN0eWxlLCB0aGUgZWxlbWVudCB3b3VsZCBiZSBmb2N1c2FibGUgYnV0IG5vdCB2aXNpYmxlLCBcbiAgICAgKiAgICAgIGtleWJvYXJkIHVzZXJzIG1pZ2h0IGJlIGNvbmZ1c2VkLiAgICBcbiAgICAgKiBcbiAgICAgKiBAcGFybSB7Tm9kZX0gbm9kZSBUaGUgbm9kZSB3aGljaCBzaG91bGQgYmUgY2hlY2tlZCBpZiBpdCBpcyB2aXN1YWxseSBoaWRkZW4gb3Igbm90LlxuICAgICAqIEByZXR1cm4ge2Jvb2x9IHRydWUgaWYgdGhlIG5vZGUgaXMgdmlzdWFsbHkgaGlkZGVuLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBWaXNVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpc05vZGVWaXN1YWxseUhpZGRlbkJ5Q2xpcFBhdGgobm9kZTogTm9kZSkgOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCFub2RlIHx8IG5vZGUubm9kZVR5cGUgIT09IDEpIHJldHVybiBmYWxzZTtcbiAgICAgICAgXG4gICAgICAgIGxldCBlbGVtID0gbm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IGhpZGRlbiA9IENhY2hlVXRpbC5nZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIHVuZGVmaW5lZCk7XG4gICAgICAgIGlmIChoaWRkZW4gIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJldHVybiBoaWRkZW47XG4gICAgICAgICAgICBcbiAgICAgICAgY29uc3Qgc3R5bGUgPSBDU1NVdGlsLmdldENvbXB1dGVkU3R5bGUoZWxlbSk7XG4gICAgICAgIGNvbnN0IHdpZHRoID0gcGFyc2VJbnQoc3R5bGUud2lkdGgpOyAgLy9hbHdheXMgaW4gcHhcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gcGFyc2VJbnQoc3R5bGUuaGVpZ2h0KTsgLy9hbHdheXMgaW4gcHhcblxuICAgICAgICBsZXQgcGF0aCA9IHN0eWxlWydjbGlwLXBhdGgnXTsgXG4gICAgICAgIGlmICghcGF0aCB8fCBwYXRoLnRyaW0oKSA9PT0gJ25vbmUnIHx8IHBhdGgudHJpbSgpID09PSAnJykgIHtcbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIGZhbHNlKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgcGF0aCA9IHBhdGgudHJpbSgpLnJlcGxhY2UoL1xccysvZywgJyAnKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBcbiAgICAgICAgbGV0IGluZGV4ID0gcGF0aC5pbmRleE9mKFwiaW5zZXQoXCIpO1xuICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7IFxuICAgICAgICAgICAgbGV0IHJvdW5kX2luZGV4ID0gcGF0aC5pbmRleE9mKFwicm91bmRcIik7XG4gICAgICAgICAgICBsZXQgc3RyID0gcGF0aC5zdWJzdHJpbmcocGF0aC5pbmRleE9mKFwiKFwiKSsxLCBwYXRoLmluZGV4T2YoXCIpXCIpKTtcbiAgICAgICAgICAgIGlmIChyb3VuZF9pbmRleCAhPT0gLTEpXG4gICAgICAgICAgICAgICAgc3RyID0gcGF0aC5zdWJzdHJpbmcocGF0aC5pbmRleE9mKFwiKFwiKSsxLCByb3VuZF9pbmRleCk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGxldCBudW1iZXJzID0gc3RyLnRyaW0oKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICAvLyBXaGVuIG9uZSB2YWx1ZSBpcyBzcGVjaWZpZWQsIGl0IGFwcGxpZXMgdGhlIHNhbWUgaW5zZXQgdG8gYWxsIGZvdXIgc2lkZXNcbiAgICAgICAgICAgIGlmIChudW1iZXJzLmxlbmd0aCA9PT0gMSkgIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXQgPSBDbGlwUGF0aFV0aWwuaXNDbGlwcGVkQnlJbnNldChlbGVtLCBudW1iZXJzWzBdLCBudW1iZXJzWzBdLCBudW1iZXJzWzBdLCBudW1iZXJzWzBdKTtcbiAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCByZXQpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFdoZW4gdHdvIHZhbHVlcyBhcmUgc3BlY2lmaWVkLCB0aGUgZmlyc3QgdmFsdWUgYXBwbGllcyB0byB0aGUgdG9wIGFuZCBib3R0b20sIHRoZSBzZWNvbmQgdG8gdGhlIGxlZnQgYW5kIHJpZ2h0LlxuICAgICAgICAgICAgaWYgKG51bWJlcnMubGVuZ3RoID09PSAyKSB7IFxuICAgICAgICAgICAgICAgIGNvbnN0IHJldCA9IENsaXBQYXRoVXRpbC5pc0NsaXBwZWRCeUluc2V0KGVsZW0sIG51bWJlcnNbMF0sIG51bWJlcnNbMV0sIG51bWJlcnNbMF0sIG51bWJlcnNbMV0pO1xuICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIHJldCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldDsgICAgICAgICBcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gV2hlbiB0aHJlZSB2YWx1ZXMgYXJlIHNwZWNpZmllZCwgdGhlIGZpcnN0IGFwcGxpZXMgdG8gdGhlIHRvcCwgdGhlIHNlY29uZCB0byB0aGUgcmlnaHQgYW5kIGxlZnQsIHRoZSB0aGlyZCB0byB0aGUgYm90dG9tLlxuICAgICAgICAgICAgaWYgKG51bWJlcnMubGVuZ3RoID09PSAzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmV0ID0gQ2xpcFBhdGhVdGlsLmlzQ2xpcHBlZEJ5SW5zZXQoZWxlbSwgbnVtYmVyc1swXSwgbnVtYmVyc1sxXSwgbnVtYmVyc1sxXSwgbnVtYmVyc1syXSk7IFxuICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIHJldCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldDsgXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFdoZW4gZm91ciB2YWx1ZXMgYXJlIHNwZWNpZmllZCwgdGhlIHZhbHVlcyBhcHBseSB0byB0aGUgdG9wLCByaWdodCwgYm90dG9tLCBhbmQgbGVmdCBpbiB0aGF0IG9yZGVyIChjbG9ja3dpc2UpLlxuICAgICAgICAgICAgaWYgKG51bWJlcnMubGVuZ3RoID09PSA0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmV0ID0gQ2xpcFBhdGhVdGlsLmlzQ2xpcHBlZEJ5SW5zZXQoZWxlbSwgbnVtYmVyc1swXSwgbnVtYmVyc1sxXSwgbnVtYmVyc1syXSwgbnVtYmVyc1szXSk7IFxuICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIHJldCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgICAgIH0gICAgIFxuXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGluZGV4ID0gcGF0aC5pbmRleE9mKFwicmVjdChcIik7XG4gICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgIGxldCByb3VuZF9pbmRleCA9IHBhdGguaW5kZXhPZihcInJvdW5kXCIpO1xuICAgICAgICAgICAgbGV0IHN0ciA9IHBhdGguc3Vic3RyaW5nKHBhdGguaW5kZXhPZihcIihcIikrMSwgcGF0aC5pbmRleE9mKFwiKVwiKSk7XG4gICAgICAgICAgICBpZiAocm91bmRfaW5kZXggIT09IC0xKVxuICAgICAgICAgICAgICAgIHN0ciA9IHBhdGguc3Vic3RyaW5nKHBhdGguaW5kZXhPZihcIihcIikrMSwgcm91bmRfaW5kZXgpO1xuXG4gICAgICAgICAgICBsZXQgbnVtYmVycyA9IHN0ci50cmltKCkuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFRoZSBmaXJzdCAodG9wKSBhbmQgdGhpcmQgKGJvdHRvbSkgdmFsdWVzIGFyZSBkaXN0YW5jZXMgZnJvbSB0aGUgdG9wIGVkZ2Ugb2YgdGhlIGNvbnRhaW5pbmcgYmxvY2ssIFxuICAgICAgICAgICAgICogYW5kIHRoZSBzZWNvbmQgKHJpZ2h0KSBhbmQgZm91cnRoIChsZWZ0KSB2YWx1ZXMgYXJlIGRpc3RhbmNlcyBmcm9tIHRoZSBsZWZ0IGVkZ2Ugb2YgdGhlIGNvbnRhaW5pbmcgYmxvY2suIFxuICAgICAgICAgICAgICogVGhlIHNlY29uZCAocmlnaHQpIGFuZCB0aGlyZCAoYm90dG9tKSB2YWx1ZXMgYXJlIGNsYW1wZWQgYnkgdGhlIGZvdXJ0aCAobGVmdCkgYW5kIGZpcnN0ICh0b3ApIHZhbHVlcywgcmVzcGVjdGl2ZWx5LCBcbiAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgKiBJZiBhdXRvIGlzIHVzZWQgZm9yIHRoZSBmaXJzdCAodG9wKSBvciBmb3VydGggKGxlZnQpIHZhbHVlLCB0aGUgdmFsdWUgb2YgYXV0byBpcyAwLCBcbiAgICAgICAgICAgICAqIGFuZCBpZiB1c2VkIGZvciB0aGUgc2Vjb25kIChyaWdodCkgb3IgdGhpcmQgKGJvdHRvbSkgdmFsdWUsIHRoZSB2YWx1ZSBvZiBhdXRvIGlzIDEwMCUuXG4gICAgICAgICAgICAqL1xuICAgICAgICAgICAgaWYgKG51bWJlcnNbMF09PT0nYXV0bycpIG51bWJlcnNbMF0gPSAnMHB4JztcbiAgICAgICAgICAgIGlmIChudW1iZXJzWzNdPT09J2F1dG8nKSBudW1iZXJzWzNdID0gJzBweCc7XG4gICAgICAgICAgICBpZiAobnVtYmVyc1sxXT09PSdhdXRvJykgbnVtYmVyc1sxXSA9ICcxMDAlJztcbiAgICAgICAgICAgIGlmIChudW1iZXJzWzJdPT09J2F1dG8nKSBudW1iZXJzWzJdID0gJzEwMCUnO1xuXG4gICAgICAgICAgICAvLyB0byBwcmV2ZW50IHRoZSBib3R0b20gZWRnZSBmcm9tIGNyb3NzaW5nIG92ZXIgdGhlIHRvcCBlZGdlIGFuZCByaWdodCBlZGdlIGZyb20gY3Jvc3Npbmcgb3ZlciB0aGUgbGVmdCBlZGdlLiBcbiAgICAgICAgICAgIC8vIGZvciBleGFtcGxlLCByZWN0KDEwcHggMCAwIDIwcHgpIGlzIGNsYW1wZWQgdG8gcmVjdCgxMHB4IDIwcHggMTBweCAyMHB4KVxuICAgICAgICAgICAgbnVtYmVyc1syXSA9IE1hdGgubWF4KG51bWJlcnNbMF0sIG51bWJlcnNbMl0pO1xuICAgICAgICAgICAgbnVtYmVyc1sxXSA9IE1hdGgubWF4KG51bWJlcnNbMV0sIG51bWJlcnNbM10pXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGxldCB0b3AgPSBwYXJzZUludChudW1iZXJzWzBdKTtcbiAgICAgICAgICAgIGlmIChpc05hTih0b3ApKSB7XG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG51bWJlcnNbMF0uZW5kc1dpdGgoXCIlXCIpKVxuICAgICAgICAgICAgICAgIHRvcCA9IHRvcCAqIGhlaWdodC8xMDA7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgcGFpciA9IENTU1V0aWwuZ2V0VmFsdWVVbml0UGFpcih0b3ApO1xuICAgICAgICAgICAgICAgIGlmICghcGFpcikge1xuICAgICAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdG9wID0gQ1NTVXRpbC5jb252ZXJ0VmFsdWUyUGl4ZWxzKHBhaXJbMF0sIHBhaXJbMV0sIGVsZW0pO1xuICAgICAgICAgICAgfSBcbiAgICAgICAgICAgIGlmICh0b3AgPj0gaGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgbGV0IGxlZnQgPSBwYXJzZUludChudW1iZXJzWzNdKTtcbiAgICAgICAgICAgIGlmIChpc05hTihsZWZ0KSkge1xuICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChudW1iZXJzWzNdLmVuZHNXaXRoKFwiJVwiKSlcbiAgICAgICAgICAgICAgICBsZWZ0ID0gbGVmdCAqIHdpZHRoLzEwMDtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBwYWlyID0gQ1NTVXRpbC5nZXRWYWx1ZVVuaXRQYWlyKGxlZnQpO1xuICAgICAgICAgICAgICAgIGlmICghcGFpcikge1xuICAgICAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGVmdCA9IENTU1V0aWwuY29udmVydFZhbHVlMlBpeGVscyhwYWlyWzBdLCBwYWlyWzFdLCBlbGVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChsZWZ0ID49IHdpZHRoKSB7XG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IHJpZ2h0ID0gcGFyc2VJbnQobnVtYmVyc1sxXSk7XG4gICAgICAgICAgICBpZiAoaXNOYU4ocmlnaHQpKSB7XG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG51bWJlcnNbMV0uZW5kc1dpdGgoXCIlXCIpKVxuICAgICAgICAgICAgICAgIHJpZ2h0ID0gcmlnaHQgKiB3aWR0aC8xMDA7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgcGFpciA9IENTU1V0aWwuZ2V0VmFsdWVVbml0UGFpcihyaWdodCk7XG4gICAgICAgICAgICAgICAgaWYgKCFwYWlyKSB7XG4gICAgICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByaWdodCA9IENTU1V0aWwuY29udmVydFZhbHVlMlBpeGVscyhwYWlyWzBdLCBwYWlyWzFdLCBlbGVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgbGV0IGJvdHRvbSA9IHBhcnNlSW50KG51bWJlcnNbMl0pO1xuICAgICAgICAgICAgaWYgKGlzTmFOKGJvdHRvbSkpIHtcbiAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobnVtYmVyc1syXS5lbmRzV2l0aChcIiVcIikpXG4gICAgICAgICAgICAgICAgYm90dG9tID0gYm90dG9tICogaGVpZ2h0LzEwMDtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBwYWlyID0gQ1NTVXRpbC5nZXRWYWx1ZVVuaXRQYWlyKGJvdHRvbSk7XG4gICAgICAgICAgICAgICAgaWYgKCFwYWlyKSB7XG4gICAgICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBib3R0b20gPSBDU1NVdGlsLmNvbnZlcnRWYWx1ZTJQaXhlbHMocGFpclswXSwgcGFpclsxXSwgZWxlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmICgoYm90dG9tIC0gdG9wKSA8PSBDbGlwUGF0aFV0aWwuVEhSRVNIT0xEICB8fCAocmlnaHQgLSBsZWZ0KSA8PSBDbGlwUGF0aFV0aWwuVEhSRVNIT0xEKSB7XG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIGZhbHNlKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTsgICAgICAgICAgICAgICAgXG4gICAgICAgIH1cblxuICAgICAgICBpbmRleCA9IHBhdGguaW5kZXhPZihcInh5d2goXCIpO1xuICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICBsZXQgcm91bmRfaW5kZXggPSBwYXRoLmluZGV4T2YoXCJyb3VuZFwiKTtcbiAgICAgICAgICAgIGxldCBzdHIgPSBwYXRoLnN1YnN0cmluZyhwYXRoLmluZGV4T2YoXCIoXCIpKzEsIHBhdGguaW5kZXhPZihcIilcIikpO1xuICAgICAgICAgICAgaWYgKHJvdW5kX2luZGV4ICE9PSAtMSlcbiAgICAgICAgICAgICAgICBzdHIgPSBwYXRoLnN1YnN0cmluZyhwYXRoLmluZGV4T2YoXCIoXCIpKzEsIHJvdW5kX2luZGV4KTtcblxuICAgICAgICAgICAgbGV0IG51bWJlcnMgPSBzdHIudHJpbSgpLnNwbGl0KFwiIFwiKTtcblxuICAgICAgICAgICAgbGV0IHggPSBwYXJzZUludChudW1iZXJzWzBdKTtcbiAgICAgICAgICAgIGlmIChpc05hTih4KSkge1xuICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChudW1iZXJzWzBdLmVuZHNXaXRoKFwiJVwiKSlcbiAgICAgICAgICAgICAgICB4ID0geCAqIHdpZHRoLzEwMDtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBwYWlyID0gQ1NTVXRpbC5nZXRWYWx1ZVVuaXRQYWlyKHRvcCk7XG4gICAgICAgICAgICAgICAgaWYgKCFwYWlyKSB7XG4gICAgICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB4ID0gQ1NTVXRpbC5jb252ZXJ0VmFsdWUyUGl4ZWxzKHBhaXJbMF0sIHBhaXJbMV0sIGVsZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHggPj0gd2lkdGgpIHtcbiAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBsZXQgeSA9IHBhcnNlSW50KG51bWJlcnNbMV0pO1xuICAgICAgICAgICAgaWYgKGlzTmFOKHkpKSB7XG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKG51bWJlcnNbMV0uZW5kc1dpdGgoXCIlXCIpKVxuICAgICAgICAgICAgICAgIHkgPSB5ICogaGVpZ2h0LzEwMDtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBwYWlyID0gQ1NTVXRpbC5nZXRWYWx1ZVVuaXRQYWlyKHkpO1xuICAgICAgICAgICAgICAgIGlmICghcGFpcikge1xuICAgICAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2Nyb2xsWSA9IENTU1V0aWwuY29udmVydFZhbHVlMlBpeGVscyhwYWlyWzBdLCBwYWlyWzFdLCBlbGVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh5ID49IGhlaWdodCkge1xuICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCB3ID0gcGFyc2VJbnQobnVtYmVyc1syXSk7XG4gICAgICAgICAgICBpZiAoaXNOYU4odykpIHtcbiAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobnVtYmVyc1syXS5lbmRzV2l0aChcIiVcIikpXG4gICAgICAgICAgICAgICAgdyA9IHcgKiB3aWR0aC8xMDA7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgcGFpciA9IENTU1V0aWwuZ2V0VmFsdWVVbml0UGFpcih3KTtcbiAgICAgICAgICAgICAgICBpZiAoIXBhaXIpIHtcbiAgICAgICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHcgPSBDU1NVdGlsLmNvbnZlcnRWYWx1ZTJQaXhlbHMocGFpclswXSwgcGFpclsxXSwgZWxlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodyA8PSBDbGlwUGF0aFV0aWwuVEhSRVNIT0xEKSB7XG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGxldCBoID0gcGFyc2VJbnQobnVtYmVyc1szXSk7XG4gICAgICAgICAgICBpZiAoaXNOYU4oaCkpIHtcbiAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobnVtYmVyc1szXS5lbmRzV2l0aChcIiVcIikpXG4gICAgICAgICAgICAgICAgaCA9IGggKiBoZWlnaHQvMTAwO1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHBhaXIgPSBDU1NVdGlsLmdldFZhbHVlVW5pdFBhaXIoaCk7XG4gICAgICAgICAgICAgICAgaWYgKCFwYWlyKSB7XG4gICAgICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBoID0gQ1NTVXRpbC5jb252ZXJ0VmFsdWUyUGl4ZWxzKHBhaXJbMF0sIHBhaXJbMV0sIGVsZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoaCA8PSBDbGlwUGF0aFV0aWwuVEhSRVNIT0xEKSB7XG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCBmYWxzZSk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7ICAgICAgICAgICAgICAgIFxuICAgICAgICB9XG5cbiAgICAgICAgaW5kZXggPSBwYXRoLmluZGV4T2YoXCJjaXJjbGUoXCIpO1xuICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICBsZXQgc3RyID0gcGF0aC5zdWJzdHJpbmcocGF0aC5pbmRleE9mKFwiKFwiKSsxLCBwYXRoLmluZGV4T2YoXCIpXCIpKTtcbiAgICAgICAgICAgIGxldCBudW1iZXJzID0gc3RyLnRyaW0oKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGxldCByYWRpdXMgPSBwYXJzZUludChudW1iZXJzWzBdKTtcbiAgICAgICAgICAgIGlmIChpc05hTihyYWRpdXMpKSB7XG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG51bWJlcnNbMF0uZW5kc1dpdGgoXCIlXCIpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNob3J0ID0gd2lkdGggPiBoZWlnaHQgPyBoZWlnaHQgOiB3aWR0aDtcbiAgICAgICAgICAgICAgICByYWRpdXMgPSByYWRpdXMgKiBzaG9ydC8xMDA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhaXIgPSBDU1NVdGlsLmdldFZhbHVlVW5pdFBhaXIocmFkaXVzKTtcbiAgICAgICAgICAgICAgICBpZiAoIXBhaXIpIHtcbiAgICAgICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJhZGl1cyA9IENTU1V0aWwuY29udmVydFZhbHVlMlBpeGVscyhwYWlyWzBdLCBwYWlyWzFdLCBlbGVtKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHJhZGl1cyA8PSBDbGlwUGF0aFV0aWwuVEhSRVNIT0xEKSB7XG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIGZhbHNlKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTsgIFxuICAgICAgICB9ICAgIFxuICAgICAgICBcbiAgICAgICAgaW5kZXggPSBwYXRoLmluZGV4T2YoXCJlbGxpcHNlKFwiKTtcbiAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgbGV0IHN0ciA9IHBhdGguc3Vic3RyaW5nKHBhdGguaW5kZXhPZihcIihcIikrMSwgcGF0aC5pbmRleE9mKFwiKVwiKSk7XG4gICAgICAgICAgICBsZXQgbnVtYmVycyA9IHN0ci50cmltKCkuc3BsaXQoXCIgXCIpO1xuXG4gICAgICAgICAgICAvLyBlbGxpcHNlKGNsb3Nlc3Qtc2lkZSBmYXJ0aGVzdC1zaWRlIGF0IDMwJSA0MCUpO1xuICAgICAgICAgICAgaWYgKG51bWJlcnMubGVuZ3RoID4gMyAmJiBudW1iZXJzWzBdID09PSAnY2xvc2VzdC1zaWRlJyAmJiBudW1iZXJzWzFdID09PSAnZmFydGhlc3Qtc2lkZScgJiYgbnVtYmVyc1syXSA9PT0gJ2F0Jykge1xuICAgICAgICAgICAgICAgIGxldCByYWRpdXMgPSBwYXJzZUludChudW1iZXJzWzNdKTtcbiAgICAgICAgICAgICAgICBpZiAobnVtYmVycy5sZW5ndGggPT09IDQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG51bWJlcnNbM10uZW5kc1dpdGgoXCIlXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSB3aWR0aCA+IGhlaWdodCA/IGhlaWdodCA6IHdpZHRoO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmFkaXVzID0gcmFkaXVzICogdmFsdWUvMTAwO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFpciA9IENTU1V0aWwuZ2V0VmFsdWVVbml0UGFpcihyYWRpdXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYWlyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJhZGl1cyA9IENTU1V0aWwuY29udmVydFZhbHVlMlBpeGVscyhwYWlyWzBdLCBwYWlyWzFdLCBlbGVtKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAocmFkaXVzIDw9IENsaXBQYXRoVXRpbC5USFJFU0hPTEQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtYmVycy5sZW5ndGggPT09IDUpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaT0zOyBpIDwgbnVtYmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJhZGl1cyA9IHBhcnNlSW50KG51bWJlcnNbaV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bWJlcnNbaV0uZW5kc1dpdGgoXCIlXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gKGkgPT09IDMpID8gd2lkdGggOiBoZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFkaXVzID0gcmFkaXVzICogdmFsdWUvMTAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYWlyID0gQ1NTVXRpbC5nZXRWYWx1ZVVuaXRQYWlyKHJhZGl1cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYWlyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWRpdXMgPSBDU1NVdGlsLmNvbnZlcnRWYWx1ZTJQaXhlbHMocGFpclswXSwgcGFpclsxXSwgZWxlbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmFkaXVzIDw9IENsaXBQYXRoVXRpbC5USFJFU0hPTEQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB9ICAgICBcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBlbGxpcHNlKDQwJSA1MCUgYXQgbGVmdCk7XG4gICAgICAgICAgICBsZXQgYXRfaW5kZXggPSBwYXRoLmluZGV4T2YoXCJhdFwiKTtcbiAgICAgICAgICAgIHN0ciA9IHBhdGguc3Vic3RyaW5nKHBhdGguaW5kZXhPZihcIihcIikrMSwgcGF0aC5pbmRleE9mKFwiKVwiKSk7XG4gICAgICAgICAgICBpZiAoYXRfaW5kZXggIT09IC0xKVxuICAgICAgICAgICAgICAgIHN0ciA9IHBhdGguc3Vic3RyaW5nKHBhdGguaW5kZXhPZihcIihcIikrMSwgYXRfaW5kZXgpO1xuXG4gICAgICAgICAgICBudW1iZXJzID0gc3RyLnRyaW0oKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICBpZiAobnVtYmVycy5sZW5ndGggIT09IDIpIHtcbiAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBudW1iZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJhZGl1cyA9IHBhcnNlSW50KG51bWJlcnNbaV0pO1xuICAgICAgICAgICAgICAgIGlmIChudW1iZXJzW2ldLmVuZHNXaXRoKFwiJVwiKSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSAoaSA9PT0gMCkgPyB3aWR0aCA6IGhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgcmFkaXVzID0gcmFkaXVzICogdmFsdWUvMTAwO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhaXIgPSBDU1NVdGlsLmdldFZhbHVlVW5pdFBhaXIocmFkaXVzKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwYWlyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmFkaXVzID0gQ1NTVXRpbC5jb252ZXJ0VmFsdWUyUGl4ZWxzKHBhaXJbMF0sIHBhaXJbMV0sIGVsZW0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocmFkaXVzIDw9IENsaXBQYXRoVXRpbC5USFJFU0hPTEQpIHtcbiAgICAgICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfSAgICAgICAgICAgIFxuICAgICAgICAgICBcbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIGZhbHNlKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGluZGV4ID0gcGF0aC5pbmRleE9mKFwicG9seWdvbihcIik7XG4gICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgIGxldCBzdHIgPSBwYXRoLnN1YnN0cmluZyhwYXRoLmluZGV4T2YoXCIoXCIpKzEsIHBhdGguaW5kZXhPZihcIilcIikpO1xuICAgICAgICAgICAgbGV0IG51bWJlcnMgPSBzdHIudHJpbSgpLnNwbGl0KFwiLFwiKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gcG9seWdvbihub256ZXJvfGV2ZW5vZGQsIDAlIDAlLCA1MCUgNTAlLCAwJSAxMDAlKVxuICAgICAgICAgICAgaWYgKG51bWJlcnNbMF0gPT09ICdub256ZXJvJyB8fCBudW1iZXJzWzBdID09PSAnZXZlbm9kZCcpXG4gICAgICAgICAgICAgICAgbnVtYmVycy5zaGlmdCgpO1xuXG4gICAgICAgICAgICBsZXQgeSA9IDA7XG4gICAgICAgICAgICBsZXQgeCA9IDA7XG4gICAgICAgICAgICBsZXQgY2hhbmdlZF94ID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgY2hhbmdlZF95ID0gZmFsc2U7XG4gICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBudW1iZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNvb3JkaW5hdGVzID0gbnVtYmVyc1tpXS50cmltKCkuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgICAgIGlmIChjb29yZGluYXRlcy5sZW5ndGggIT0gMiApIHtcbiAgICAgICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IGNvb3JkaW5hdGVfeHkgPSBbMCwgMF07XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9MDsgaSA8IDI7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSBwYXJzZUludChjb29yZGluYXRlc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc05hTih2YWx1ZSkpIHJldHVybiBmYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoY29vcmRpbmF0ZXNbaV0uZW5kc1dpdGgoXCIlXCIpKVxuICAgICAgICAgICAgICAgICAgICAgICAgY29vcmRpbmF0ZV94eVtpXSA9IChpID09PSAwKSA/IHZhbHVlICogd2lkdGgvMTAwIDogdmFsdWUgKiBoZWlnaHQvMTAwO1xuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhaXIgPSBDU1NVdGlsLmdldFZhbHVlVW5pdFBhaXIoY29vcmRpbmF0ZXNbaV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYWlyKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb29yZGluYXRlX3h5W2ldID0gQ1NTVXRpbC5jb252ZXJ0VmFsdWUyUGl4ZWxzKHBhaXJbMF0sIHBhaXJbMV0sIGVsZW0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHggPSBjb29yZGluYXRlX3h5WzBdO1xuICAgICAgICAgICAgICAgICAgICB5ID0gY29vcmRpbmF0ZV94eVsxXTtcbiAgICAgICAgICAgICAgICB9IFxuXG4gICAgICAgICAgICAgICAgaWYgKE1hdGguYWJzKGNvb3JkaW5hdGVfeHlbMF0gLSB4KSA+PSBDbGlwUGF0aFV0aWwuVEhSRVNIT0xEKSBcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlZF94ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAoTWF0aC5hYnMoY29vcmRpbmF0ZV94eVsxXSAtIHkpID49IENsaXBQYXRoVXRpbC5USFJFU0hPTEQpIFxuICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkX3kgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNoYW5nZWRfeCAmJiBjaGFuZ2VkX3kpIHtcbiAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfSAgXG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9ICAgICAgXG5cbiAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaXNDbGlwcGVkQnlJbnNldChlbGVtLCB0b3AsIHJpZ2h0ID0gJzBweCcsIGJvdHRvbSA9ICcwcHgnLCBsZWZ0ID0gJzBweCcpIHtcbiAgICAgICAgY29uc3Qgc3R5bGUgPSBDU1NVdGlsLmdldENvbXB1dGVkU3R5bGUoZWxlbSk7XG4gICAgICAgIGNvbnN0IHdpZHRoID0gcGFyc2VJbnQoc3R5bGUud2lkdGgpOyAgLy9hbHdheXMgaW4gcHhcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gcGFyc2VJbnQoc3R5bGUuaGVpZ2h0KTsgLy9hbHdheXMgaW4gcHhcbiAgICAgICAgXG4gICAgICAgIC8vIHRvcFxuICAgICAgICBsZXQgdG9wX3ZhbHVlID0gcGFyc2VJbnQodG9wKTtcbiAgICAgICAgaWYgKGlzTmFOKHRvcF92YWx1ZSkpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBpZiAodG9wLmVuZHNXaXRoKFwiJVwiKSlcbiAgICAgICAgICAgIHRvcF92YWx1ZSA9IHRvcF92YWx1ZSAqIGhlaWdodC8xMDA7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcGFpciA9IENTU1V0aWwuZ2V0VmFsdWVVbml0UGFpcih0b3ApO1xuICAgICAgICAgICAgaWYgKCFwYWlyKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB0b3BfdmFsdWUgPSBDU1NVdGlsLmNvbnZlcnRWYWx1ZTJQaXhlbHMocGFpclswXSwgcGFpclsxXSwgZWxlbSk7XG4gICAgICAgIH1cblxuICAgICAgICAvL2luc2V0IG91dHNpZGUgb2YgdGhlIGNvbnRhaW5lclxuICAgICAgICBpZiAodG9wX3ZhbHVlID4gaGVpZ2h0KSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgLy8gcmlnaHRcbiAgICAgICAgbGV0IHJpZ2h0X3ZhbHVlID0gcGFyc2VJbnQocmlnaHQpO1xuICAgICAgICBpZiAoaXNOYU4ocmlnaHRfdmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgaWYgKHJpZ2h0LmVuZHNXaXRoKFwiJVwiKSlcbiAgICAgICAgICAgIHJpZ2h0X3ZhbHVlID0gcmlnaHRfdmFsdWUgKiB3aWR0aC8xMDA7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcGFpciA9IENTU1V0aWwuZ2V0VmFsdWVVbml0UGFpcihyaWdodCk7XG4gICAgICAgICAgICBpZiAoIXBhaXIpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIHJpZ2h0X3ZhbHVlID0gQ1NTVXRpbC5jb252ZXJ0VmFsdWUyUGl4ZWxzKHBhaXJbMF0sIHBhaXJbMV0sIGVsZW0pO1xuICAgICAgICB9XG4gICAgICAgIC8vaW5zZXQgb3V0c2lkZSBvZiB0aGUgY29udGFpbmVyXG4gICAgICAgIGlmIChyaWdodF92YWx1ZSA+IHdpZHRoKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgLy8gYm90dG9tXG4gICAgICAgIGxldCBib3R0b21fdmFsdWUgPSBwYXJzZUludChib3R0b20pO1xuICAgICAgICBpZiAoaXNOYU4oYm90dG9tX3ZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGlmIChib3R0b20uZW5kc1dpdGgoXCIlXCIpKVxuICAgICAgICAgICAgYm90dG9tX3ZhbHVlID0gYm90dG9tX3ZhbHVlICogaGVpZ2h0LzEwMDtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBwYWlyID0gQ1NTVXRpbC5nZXRWYWx1ZVVuaXRQYWlyKGJvdHRvbSk7XG4gICAgICAgICAgICBpZiAoIXBhaXIpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGJvdHRvbV92YWx1ZSA9IENTU1V0aWwuY29udmVydFZhbHVlMlBpeGVscyhwYWlyWzBdLCBwYWlyWzFdLCBlbGVtKTtcbiAgICAgICAgfVxuICAgICAgICAvL2luc2V0IG91dHNpZGUgb2YgdGhlIGNvbnRhaW5lclxuICAgICAgICBpZiAoYm90dG9tX3ZhbHVlID4gaGVpZ2h0KSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgLy8gbGVmdFxuICAgICAgICBsZXQgbGVmdF92YWx1ZSA9IHBhcnNlSW50KGxlZnQpO1xuICAgICAgICBpZiAoaXNOYU4obGVmdF92YWx1ZSkpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBpZiAobGVmdC5lbmRzV2l0aChcIiVcIikpXG4gICAgICAgICAgICBsZWZ0X3ZhbHVlID0gbGVmdF92YWx1ZSAqIHdpZHRoLzEwMDtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBwYWlyID0gQ1NTVXRpbC5nZXRWYWx1ZVVuaXRQYWlyKGxlZnQpO1xuICAgICAgICAgICAgaWYgKCFwYWlyKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBsZWZ0X3ZhbHVlID0gQ1NTVXRpbC5jb252ZXJ0VmFsdWUyUGl4ZWxzKHBhaXJbMF0sIHBhaXJbMV0sIGVsZW0pO1xuICAgICAgICB9XG4gICAgICAgIC8vaW5zZXQgb3V0c2lkZSBvZiB0aGUgY29udGFpbmVyXG4gICAgICAgIGlmIChsZWZ0X3ZhbHVlID4gd2lkdGgpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBpZiAoaGVpZ2h0IC0gKHRvcF92YWx1ZSArIGJvdHRvbV92YWx1ZSkgPD0gQ2xpcFBhdGhVdGlsLlRIUkVTSE9MRCAgfHwgd2lkdGggLSAocmlnaHRfdmFsdWUgKyBsZWZ0X3ZhbHVlKSA8PSBDbGlwUGF0aFV0aWwuVEhSRVNIT0xEKSBcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgIENvcHlyaWdodDo6IDIwMjAtIElCTSwgSW5jXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5cbmV4cG9ydCBjbGFzcyBDb2xvclV0aWwge1xuXG4gICAgcHVibGljIHN0YXRpYyBDU1NDb2xvckxvb2t1cCA9IHtcbiAgICAgICAgXCJhbGljZWJsdWVcIjogXCIjZjBmOGZmXCIsXG4gICAgICAgIFwiYW50aXF1ZXdoaXRlXCI6IFwiI2ZhZWJkN1wiLFxuICAgICAgICBcImFxdWFcIjogXCIjMDBmZmZmXCIsXG4gICAgICAgIFwiYXF1YW1hcmluZVwiOiBcIiM3ZmZmZDRcIixcbiAgICAgICAgXCJhenVyZVwiOiBcIiNmMGZmZmZcIixcbiAgICAgICAgXCJiZWlnZVwiOiBcIiNmNWY1ZGNcIixcbiAgICAgICAgXCJiaXNxdWVcIjogXCIjZmZlNGM0XCIsXG4gICAgICAgIFwiYmxhY2tcIjogXCIjMDAwMDAwXCIsXG4gICAgICAgIFwiYmxhbmNoZWRhbG1vbmRcIjogXCIjZmZlYmNkXCIsXG4gICAgICAgIFwiYmx1ZVwiOiBcIiMwMDAwZmZcIixcbiAgICAgICAgXCJibHVldmlvbGV0XCI6IFwiIzhhMmJlMlwiLFxuICAgICAgICBcImJyb3duXCI6IFwiI2E1MmEyYVwiLFxuICAgICAgICBcImJ1cmx5d29vZFwiOiBcIiNkZWI4ODdcIixcbiAgICAgICAgXCJjYWRldGJsdWVcIjogXCIjNWY5ZWEwXCIsXG4gICAgICAgIFwiY2hhcnRyZXVzZVwiOiBcIiM3ZmZmMDBcIixcbiAgICAgICAgXCJjaG9jb2xhdGVcIjogXCIjZDI2OTFlXCIsXG4gICAgICAgIFwiY29yYWxcIjogXCIjZmY3ZjUwXCIsXG4gICAgICAgIFwiY29ybmZsb3dlcmJsdWVcIjogXCIjNjQ5NWVkXCIsXG4gICAgICAgIFwiY29ybnNpbGtcIjogXCIjZmZmOGRjXCIsXG4gICAgICAgIFwiY3JpbXNvblwiOiBcIiNkYzE0M2NcIixcbiAgICAgICAgXCJjeWFuXCI6IFwiIzAwZmZmZlwiLFxuICAgICAgICBcImRhcmtibHVlXCI6IFwiIzAwMDA4YlwiLFxuICAgICAgICBcImRhcmtjeWFuXCI6IFwiIzAwOGI4YlwiLFxuICAgICAgICBcImRhcmtnb2xkZW5yb2RcIjogXCIjYjg4NjBiXCIsXG4gICAgICAgIFwiZGFya2dyYXlcIjogXCIjYTlhOWE5XCIsXG4gICAgICAgIFwiZGFya2dyZWVuXCI6IFwiIzAwNjQwMFwiLFxuICAgICAgICBcImRhcmtraGFraVwiOiBcIiNiZGI3NmJcIixcbiAgICAgICAgXCJkYXJrbWFnZW50YVwiOiBcIiM4YjAwOGJcIixcbiAgICAgICAgXCJkYXJrb2xpdmVncmVlblwiOiBcIiM1NTZiMmZcIixcbiAgICAgICAgXCJkYXJrb3JhbmdlXCI6IFwiI2ZmOGMwMFwiLFxuICAgICAgICBcImRhcmtvcmNoaWRcIjogXCIjOTkzMmNjXCIsXG4gICAgICAgIFwiZGFya3JlZFwiOiBcIiM4YjAwMDBcIixcbiAgICAgICAgXCJkYXJrc2FsbW9uXCI6IFwiI2U5OTY3YVwiLFxuICAgICAgICBcImRhcmtzZWFncmVlblwiOiBcIiM4ZmJjOGZcIixcbiAgICAgICAgXCJkYXJrc2xhdGVibHVlXCI6IFwiIzQ4M2Q4YlwiLFxuICAgICAgICBcImRhcmtzbGF0ZWdyYXlcIjogXCIjMmY0ZjRmXCIsXG4gICAgICAgIFwiZGFya3R1cnF1b2lzZVwiOiBcIiMwMGNlZDFcIixcbiAgICAgICAgXCJkYXJrdmlvbGV0XCI6IFwiIzk0MDBkM1wiLFxuICAgICAgICBcImRlZXBwaW5rXCI6IFwiI2ZmMTQ5M1wiLFxuICAgICAgICBcImRlZXBza3libHVlXCI6IFwiIzAwYmZmZlwiLFxuICAgICAgICBcImRpbWdyYXlcIjogXCIjNjk2OTY5XCIsXG4gICAgICAgIFwiZG9kZ2VyYmx1ZVwiOiBcIiMxZTkwZmZcIixcbiAgICAgICAgXCJmaXJlYnJpY2tcIjogXCIjYjIyMjIyXCIsXG4gICAgICAgIFwiZmxvcmFsd2hpdGVcIjogXCIjZmZmYWYwXCIsXG4gICAgICAgIFwiZm9yZXN0Z3JlZW5cIjogXCIjMjI4YjIyXCIsXG4gICAgICAgIFwiZnVjaHNpYVwiOiBcIiNmZjAwZmZcIixcbiAgICAgICAgXCJnYWluc2Jvcm9cIjogXCIjZGNkY2RjXCIsXG4gICAgICAgIFwiZ2hvc3R3aGl0ZVwiOiBcIiNmOGY4ZmZcIixcbiAgICAgICAgXCJnb2xkXCI6IFwiI2ZmZDcwMFwiLFxuICAgICAgICBcImdvbGRlbnJvZFwiOiBcIiNkYWE1MjBcIixcbiAgICAgICAgXCJncmF5XCI6IFwiIzgwODA4MFwiLFxuICAgICAgICBcImdyZWVuXCI6IFwiIzAwODAwMFwiLFxuICAgICAgICBcImdyZWVueWVsbG93XCI6IFwiI2FkZmYyZlwiLFxuICAgICAgICBcImhvbmV5ZGV3XCI6IFwiI2YwZmZmMFwiLFxuICAgICAgICBcImhvdHBpbmtcIjogXCIjZmY2OWI0XCIsXG4gICAgICAgIFwiaW5kaWFucmVkXCI6IFwiI2NkNWM1Y1wiLFxuICAgICAgICBcImluZGlnb1wiOiBcIiM0YjAwODJcIixcbiAgICAgICAgXCJpdm9yeVwiOiBcIiNmZmZmZjBcIixcbiAgICAgICAgXCJraGFraVwiOiBcIiNmMGU2OGNcIixcbiAgICAgICAgXCJsYXZlbmRlclwiOiBcIiNlNmU2ZmFcIixcbiAgICAgICAgXCJsYXZlbmRlcmJsdXNoXCI6IFwiI2ZmZjBmNVwiLFxuICAgICAgICBcImxhd25ncmVlblwiOiBcIiM3Y2ZjMDBcIixcbiAgICAgICAgXCJsZW1vbmNoaWZmb25cIjogXCIjZmZmYWNkXCIsXG4gICAgICAgIFwibGlnaHRibHVlXCI6IFwiI2FkZDhlNlwiLFxuICAgICAgICBcImxpZ2h0Y29yYWxcIjogXCIjZjA4MDgwXCIsXG4gICAgICAgIFwibGlnaHRjeWFuXCI6IFwiI2UwZmZmZlwiLFxuICAgICAgICBcImxpZ2h0Z29sZGVucm9keWVsbG93XCI6IFwiI2ZhZmFkMlwiLFxuICAgICAgICBcImxpZ2h0Z3JleVwiOiBcIiNkM2QzZDNcIixcbiAgICAgICAgXCJsaWdodGdyZWVuXCI6IFwiIzkwZWU5MFwiLFxuICAgICAgICBcImxpZ2h0cGlua1wiOiBcIiNmZmI2YzFcIixcbiAgICAgICAgXCJsaWdodHNhbG1vblwiOiBcIiNmZmEwN2FcIixcbiAgICAgICAgXCJsaWdodHNlYWdyZWVuXCI6IFwiIzIwYjJhYVwiLFxuICAgICAgICBcImxpZ2h0c2t5Ymx1ZVwiOiBcIiM4N2NlZmFcIixcbiAgICAgICAgXCJsaWdodHNsYXRlZ3JheVwiOiBcIiM3Nzg4OTlcIixcbiAgICAgICAgXCJsaWdodHN0ZWVsYmx1ZVwiOiBcIiNiMGM0ZGVcIixcbiAgICAgICAgXCJsaWdodHllbGxvd1wiOiBcIiNmZmZmZTBcIixcbiAgICAgICAgXCJsaW1lXCI6IFwiIzAwZmYwMFwiLFxuICAgICAgICBcImxpbWVncmVlblwiOiBcIiMzMmNkMzJcIixcbiAgICAgICAgXCJsaW5lblwiOiBcIiNmYWYwZTZcIixcbiAgICAgICAgXCJtYWdlbnRhXCI6IFwiI2ZmMDBmZlwiLFxuICAgICAgICBcIm1hcm9vblwiOiBcIiM4MDAwMDBcIixcbiAgICAgICAgXCJtZWRpdW1hcXVhbWFyaW5lXCI6IFwiIzY2Y2RhYVwiLFxuICAgICAgICBcIm1lZGl1bWJsdWVcIjogXCIjMDAwMGNkXCIsXG4gICAgICAgIFwibWVkaXVtb3JjaGlkXCI6IFwiI2JhNTVkM1wiLFxuICAgICAgICBcIm1lZGl1bXB1cnBsZVwiOiBcIiM5MzcwZDhcIixcbiAgICAgICAgXCJtZWRpdW1zZWFncmVlblwiOiBcIiMzY2IzNzFcIixcbiAgICAgICAgXCJtZWRpdW1zbGF0ZWJsdWVcIjogXCIjN2I2OGVlXCIsXG4gICAgICAgIFwibWVkaXVtc3ByaW5nZ3JlZW5cIjogXCIjMDBmYTlhXCIsXG4gICAgICAgIFwibWVkaXVtdHVycXVvaXNlXCI6IFwiIzQ4ZDFjY1wiLFxuICAgICAgICBcIm1lZGl1bXZpb2xldHJlZFwiOiBcIiNjNzE1ODVcIixcbiAgICAgICAgXCJtaWRuaWdodGJsdWVcIjogXCIjMTkxOTcwXCIsXG4gICAgICAgIFwibWludGNyZWFtXCI6IFwiI2Y1ZmZmYVwiLFxuICAgICAgICBcIm1pc3R5cm9zZVwiOiBcIiNmZmU0ZTFcIixcbiAgICAgICAgXCJtb2NjYXNpblwiOiBcIiNmZmU0YjVcIixcbiAgICAgICAgXCJuYXZham93aGl0ZVwiOiBcIiNmZmRlYWRcIixcbiAgICAgICAgXCJuYXZ5XCI6IFwiIzAwMDA4MFwiLFxuICAgICAgICBcIm9sZGxhY2VcIjogXCIjZmRmNWU2XCIsXG4gICAgICAgIFwib2xpdmVcIjogXCIjODA4MDAwXCIsXG4gICAgICAgIFwib2xpdmVkcmFiXCI6IFwiIzZiOGUyM1wiLFxuICAgICAgICBcIm9yYW5nZVwiOiBcIiNmZmE1MDBcIixcbiAgICAgICAgXCJvcmFuZ2VyZWRcIjogXCIjZmY0NTAwXCIsXG4gICAgICAgIFwib3JjaGlkXCI6IFwiI2RhNzBkNlwiLFxuICAgICAgICBcInBhbGVnb2xkZW5yb2RcIjogXCIjZWVlOGFhXCIsXG4gICAgICAgIFwicGFsZWdyZWVuXCI6IFwiIzk4ZmI5OFwiLFxuICAgICAgICBcInBhbGV0dXJxdW9pc2VcIjogXCIjYWZlZWVlXCIsXG4gICAgICAgIFwicGFsZXZpb2xldHJlZFwiOiBcIiNkODcwOTNcIixcbiAgICAgICAgXCJwYXBheWF3aGlwXCI6IFwiI2ZmZWZkNVwiLFxuICAgICAgICBcInBlYWNocHVmZlwiOiBcIiNmZmRhYjlcIixcbiAgICAgICAgXCJwZXJ1XCI6IFwiI2NkODUzZlwiLFxuICAgICAgICBcInBpbmtcIjogXCIjZmZjMGNiXCIsXG4gICAgICAgIFwicGx1bVwiOiBcIiNkZGEwZGRcIixcbiAgICAgICAgXCJwb3dkZXJibHVlXCI6IFwiI2IwZTBlNlwiLFxuICAgICAgICBcInB1cnBsZVwiOiBcIiM4MDAwODBcIixcbiAgICAgICAgXCJyZWRcIjogXCIjZmYwMDAwXCIsXG4gICAgICAgIFwicm9zeWJyb3duXCI6IFwiI2JjOGY4ZlwiLFxuICAgICAgICBcInJveWFsYmx1ZVwiOiBcIiM0MTY5ZTFcIixcbiAgICAgICAgXCJzYWRkbGVicm93blwiOiBcIiM4YjQ1MTNcIixcbiAgICAgICAgXCJzYWxtb25cIjogXCIjZmE4MDcyXCIsXG4gICAgICAgIFwic2FuZHlicm93blwiOiBcIiNmNGE0NjBcIixcbiAgICAgICAgXCJzZWFncmVlblwiOiBcIiMyZThiNTdcIixcbiAgICAgICAgXCJzZWFzaGVsbFwiOiBcIiNmZmY1ZWVcIixcbiAgICAgICAgXCJzaWVubmFcIjogXCIjYTA1MjJkXCIsXG4gICAgICAgIFwic2lsdmVyXCI6IFwiI2MwYzBjMFwiLFxuICAgICAgICBcInNreWJsdWVcIjogXCIjODdjZWViXCIsXG4gICAgICAgIFwic2xhdGVibHVlXCI6IFwiIzZhNWFjZFwiLFxuICAgICAgICBcInNsYXRlZ3JheVwiOiBcIiM3MDgwOTBcIixcbiAgICAgICAgXCJzbm93XCI6IFwiI2ZmZmFmYVwiLFxuICAgICAgICBcInNwcmluZ2dyZWVuXCI6IFwiIzAwZmY3ZlwiLFxuICAgICAgICBcInN0ZWVsYmx1ZVwiOiBcIiM0NjgyYjRcIixcbiAgICAgICAgXCJ0YW5cIjogXCIjZDJiNDhjXCIsXG4gICAgICAgIFwidGVhbFwiOiBcIiMwMDgwODBcIixcbiAgICAgICAgXCJ0aGlzdGxlXCI6IFwiI2Q4YmZkOFwiLFxuICAgICAgICBcInRvbWF0b1wiOiBcIiNmZjYzNDdcIixcbiAgICAgICAgXCJ0dXJxdW9pc2VcIjogXCIjNDBlMGQwXCIsXG4gICAgICAgIFwidmlvbGV0XCI6IFwiI2VlODJlZVwiLFxuICAgICAgICBcIndoZWF0XCI6IFwiI2Y1ZGViM1wiLFxuICAgICAgICBcIndoaXRlXCI6IFwiI2ZmZmZmZlwiLFxuICAgICAgICBcIndoaXRlc21va2VcIjogXCIjZjVmNWY1XCIsXG4gICAgICAgIFwieWVsbG93XCI6IFwiI2ZmZmYwMFwiLFxuICAgICAgICBcInllbGxvd2dyZWVuXCI6IFwiIzlhY2QzMlwiLFxuICAgICAgICBcImJ1dHRvbnRleHRcIjogXCJyZ2JhKDAsIDAsIDAsIDAuODQ3KVwiLFxuICAgICAgICBcImJ1dHRvbmZhY2VcIjogXCIjZmZmZmZmXCIsXG4gICAgICAgIFwiZ3JheXRleHRcIjogXCJyZ2JhKDAsIDAsIDAsIDAuMjQ3KVwiXG4gICAgfVxuXG5cbiAgICAvLyBSZXdyaXRlIHRoZSBjb2xvciBvYmplY3QgdG8gYWNjb3VudCBmb3IgYWxwaGFcbiAgICBwdWJsaWMgc3RhdGljIENvbG9yKGNzc1N0eWxlQ29sb3IpIHtcbiAgICAgICAgaWYgKCFjc3NTdHlsZUNvbG9yKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY3NzU3R5bGVDb2xvciA9IGNzc1N0eWxlQ29sb3IudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKGNzc1N0eWxlQ29sb3IgPT09IFwidHJhbnNwYXJlbnRcIikgcmV0dXJuIG5ldyBDb2xvck9iaigyNTUsIDI1NSwgMjU1LCAwKTtcbiAgICAgICAgaWYgKGNzc1N0eWxlQ29sb3IgaW4gQ29sb3JVdGlsLkNTU0NvbG9yTG9va3VwKVxuICAgICAgICAgICAgY3NzU3R5bGVDb2xvciA9IENvbG9yVXRpbC5DU1NDb2xvckxvb2t1cFtjc3NTdHlsZUNvbG9yXTtcbiAgICAgICAgaWYgKGNzc1N0eWxlQ29sb3Iuc3RhcnRzV2l0aChcInJnYihcIikpIHtcbiAgICAgICAgICAgIGxldCByZ2JSZWdleCA9IC9cXHMqcmdiXFxzKlxcKFxccyooXFxkKylcXHMqLFxccyooXFxkKylcXHMqLFxccyooXFxkKylcXHMqXFwpLztcbiAgICAgICAgICAgIGxldCBtID0gY3NzU3R5bGVDb2xvci5tYXRjaChyZ2JSZWdleCk7XG4gICAgICAgICAgICBpZiAobSA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbG9yT2JqKG1bMV0sIG1bMl0sIG1bM10pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGNzc1N0eWxlQ29sb3Iuc3RhcnRzV2l0aChcInJnYmEoXCIpKSB7XG4gICAgICAgICAgICBsZXQgcmdiUmVnZXggPSAvXFxzKnJnYmFcXHMqXFwoXFxzKihcXGQrKVxccyosXFxzKihcXGQrKVxccyosXFxzKihcXGQrKVxccyosXFxzKiguKylcXHMqXFwpLztcbiAgICAgICAgICAgIGxldCBtID0gY3NzU3R5bGVDb2xvci5tYXRjaChyZ2JSZWdleCk7XG4gICAgICAgICAgICBpZiAobSA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbG9yT2JqKG1bMV0sIG1bMl0sIG1bM10sIG1bNF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGNzc1N0eWxlQ29sb3IuY2hhckF0KDApICE9IFwiI1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChjc3NTdHlsZUNvbG9yLmxlbmd0aCA9PT0gNCkge1xuICAgICAgICAgICAgICAgIC8vIFRoZSB0aHJlZS1kaWdpdCBSR0IgKCNyZ2IpIGlzIGNvbnZlcnRlZCB0byBzaXgtZGlnaXQgZm9ybSAoI3JyZ2diYikgYnkgcmVwbGljYXRpbmcgZGlnaXRzXG4gICAgICAgICAgICAgICAgLy8gKGh0dHBzOi8vd3d3LnczLm9yZy9UUi9jc3MtY29sb3ItMy8jcmdiLWNvbG9yKVxuICAgICAgICAgICAgICAgIGNzc1N0eWxlQ29sb3IgPSBcIiNcIiArIGNzc1N0eWxlQ29sb3IuY2hhckF0KDEpLnJlcGVhdCgyKSArXG4gICAgICAgICAgICAgICAgICAgIGNzc1N0eWxlQ29sb3IuY2hhckF0KDIpLnJlcGVhdCgyKSArXG4gICAgICAgICAgICAgICAgICAgIGNzc1N0eWxlQ29sb3IuY2hhckF0KDMpLnJlcGVhdCgyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCB0aGlzUmVkID0gcGFyc2VJbnQoY3NzU3R5bGVDb2xvci5zdWJzdHJpbmcoMSwgMyksIDE2KTtcbiAgICAgICAgICAgIGxldCB0aGlzR3JlZW4gPSBwYXJzZUludChjc3NTdHlsZUNvbG9yLnN1YnN0cmluZygzLCA1KSwgMTYpO1xuICAgICAgICAgICAgbGV0IHRoaXNCbHVlID0gcGFyc2VJbnQoY3NzU3R5bGVDb2xvci5zdWJzdHJpbmcoNSwgNyksIDE2KTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQ29sb3JPYmoodGhpc1JlZCwgdGhpc0dyZWVuLCB0aGlzQmx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gICAgcmV0dXJuIG51bGw7IC8vIFVucmVhY2hhYmxlXG4gICAgfTtcblxuIHB1YmxpYyBzdGF0aWMgQ29sb3JDb21ibyhydWxlQ29udGV4dCA6IEhUTUxFbGVtZW50KSB7XG4gICAgdHJ5IHsgXG4gICAgICAgIHZhciBkb2MgPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50O1xuICAgICAgICBpZiAoIWRvYykge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHdpbiA9IGRvYy5kZWZhdWx0VmlldztcbiAgICAgICAgaWYgKCF3aW4pIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGFuY2VzdG9ycyA9IFtdO1xuICAgICAgICBsZXQgd2Fsa05vZGUgOiBFbGVtZW50ID0gcnVsZUNvbnRleHQ7XG4gICAgICAgIHdoaWxlICh3YWxrTm9kZSkge1xuICAgICAgICAgICAgaWYgKHdhbGtOb2RlLm5vZGVUeXBlID09PSAxKSBcbiAgICAgICAgICAgICAgICBhbmNlc3RvcnMucHVzaCh3YWxrTm9kZSk7XG4gICAgICAgICAgICB3YWxrTm9kZSA9IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KHdhbGtOb2RlKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgdmFyIHJldFZhbCA9IHtcbiAgICAgICAgICAgIFwiaGFzR3JhZGllbnRcIjogZmFsc2UsXG4gICAgICAgICAgICBcImhhc0JHSW1hZ2VcIjogZmFsc2UsXG4gICAgICAgICAgICBcInRleHRTaGFkb3dcIjogZmFsc2UsXG4gICAgICAgICAgICBcImZnXCI6IG51bGwsXG4gICAgICAgICAgICBcImJnXCI6IG51bGxcbiAgICAgICAgfTtcbiAgICAgICAgXG4gICAgICAgIC8vIHN0YXJ0XG4gICAgICAgIHZhciBjU3R5bGUgPSB3aW4uZ2V0Q29tcHV0ZWRTdHlsZShydWxlQ29udGV4dCk7XG4gICAgICAgIHZhciBjb21wU3R5bGVDb2xvciA9IGNTdHlsZS5jb2xvcjtcbiAgICAgICAgaWYgKCFjb21wU3R5bGVDb2xvcilcbiAgICAgICAgICAgIGNvbXBTdHlsZUNvbG9yID0gXCJibGFja1wiO1xuICAgICAgICB2YXIgZmcgPSBDb2xvclV0aWwuQ29sb3IoY29tcFN0eWxlQ29sb3IpO1xuICAgICAgICB2YXIgcmVDb2xvciA9IC90cmFuc3BhcmVudHxyZ2JhP1xcKFteKV0rXFwpL2dpO1xuICAgICAgICB2YXIgZ3Vlc3NHcmFkQ29sb3IgPSBmdW5jdGlvbiAoZ3JhZExpc3QsIGJnQ29sb3IsIGZnQ29sb3IpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUncyBvbmx5IG9uZSBjb2xvciwgcmV0dXJuIHRoYXRcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGdyYWRMaXN0Lmxlbmd0aCA9PT0gXCJ1bmRlZmluZWRcIilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdyYWRMaXN0O1xuXG4gICAgICAgICAgICAgICAgdmFyIG92ZXJhbGxXb3JzdCA9IG51bGw7XG4gICAgICAgICAgICAgICAgdmFyIG92ZXJhbGxXb3JzdFJhdGlvID0gbnVsbDtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpR3JhZCA9IDE7IGlHcmFkIDwgZ3JhZExpc3QubGVuZ3RoOyArK2lHcmFkKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB3b3JzdENvbG9yID0gZ3JhZExpc3RbaUdyYWQgLSAxXTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHdvcnN0UmF0aW8gPSBmZ0NvbG9yLmNvbnRyYXN0UmF0aW8oZ3JhZExpc3RbaUdyYWQgLSAxXSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzdGVwID0gLjE7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpZHggPSAwO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoc3RlcCA+IC4wMDAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaWR4ICsgc3RlcCA8PSAxICYmIHdvcnN0UmF0aW8gPiBmZ0NvbG9yLmNvbnRyYXN0UmF0aW8oZ3JhZExpc3RbaUdyYWRdLm1peChncmFkTGlzdFtpR3JhZCAtIDFdLCBpZHggKyBzdGVwKS5nZXRPdmVybGF5Q29sb3IoYmdDb2xvcikpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yc3RDb2xvciA9IGdyYWRMaXN0W2lHcmFkXS5taXgoZ3JhZExpc3RbaUdyYWQgLSAxXSwgaWR4ICsgc3RlcCkuZ2V0T3ZlcmxheUNvbG9yKGJnQ29sb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcnN0UmF0aW8gPSBmZ0NvbG9yLmNvbnRyYXN0UmF0aW8od29yc3RDb2xvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWR4ID0gaWR4ICsgc3RlcDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChpZHggLSBzdGVwID49IDAgJiYgd29yc3RSYXRpbyA+IGZnQ29sb3IuY29udHJhc3RSYXRpbyhncmFkTGlzdFtpR3JhZF0ubWl4KGdyYWRMaXN0W2lHcmFkIC0gMV0sIGlkeCAtIHN0ZXApLmdldE92ZXJsYXlDb2xvcihiZ0NvbG9yKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JzdENvbG9yID0gZ3JhZExpc3RbaUdyYWRdLm1peChncmFkTGlzdFtpR3JhZCAtIDFdLCBpZHggLSBzdGVwKS5nZXRPdmVybGF5Q29sb3IoYmdDb2xvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yc3RSYXRpbyA9IGZnQ29sb3IuY29udHJhc3RSYXRpbyh3b3JzdENvbG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZHggPSBpZHggLSBzdGVwO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgc3RlcCA9IHN0ZXAgLyAxMDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAob3ZlcmFsbFdvcnN0UmF0aW8gPT09IG51bGwgfHwgb3ZlcmFsbFdvcnN0UmF0aW8gPiB3b3JzdFJhdGlvKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvdmVyYWxsV29yc3RSYXRpbyA9IHdvcnN0UmF0aW87XG4gICAgICAgICAgICAgICAgICAgICAgICBvdmVyYWxsV29yc3QgPSB3b3JzdENvbG9yO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBvdmVyYWxsV29yc3Q7IC8vIHJldHVybiB0aGUgZGFya2VzdCBjb2xvclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGJnQ29sb3I7XG4gICAgICAgIH07XG5cbiAgICAgICAgdmFyIHByaW9yU3RhY2tCRyA9IENvbG9yVXRpbC5Db2xvcihcIndoaXRlXCIpO1xuICAgICAgICB2YXIgdGhpc1N0YWNrT3BhY2l0eSA9IG51bGw7XG4gICAgICAgIHZhciB0aGlzU3RhY2tBbHBoYSA9IG51bGw7XG4gICAgICAgIHZhciB0aGlzU3RhY2tCRyA9IG51bGw7XG4gICAgICAgIC8vIEFuY2VzdG9ycyBwcm9jZXNzZWQgZnJvbSB0aGUgdG9wbW9zdCBwYXJlbnQgdG93YXJkIHRoZSBjaGlsZFxuICAgICAgICB3aGlsZSAoYW5jZXN0b3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHZhciBwcm9jTmV4dCA9IGFuY2VzdG9ycy5wb3AoKTtcbiAgICAgICAgICAgIC8vdmFyIHByb2NOZXh0ID0gYW5jZXN0b3JzLnNwbGljZSgwLCAxKVswXTtcbiAgICAgICAgICAgIC8vIGNTdHlsZSBpcyB0aGUgY29tcHV0ZWQgc3R5bGUgb2YgdGhpcyBsYXllclxuICAgICAgICAgICAgdmFyIGNTdHlsZSA9IHdpbi5nZXRDb21wdXRlZFN0eWxlKHByb2NOZXh0KTtcbiAgICAgICAgICAgIGlmIChjU3R5bGUgPT09IG51bGwpIGNvbnRpbnVlO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyB0aGlzQmdDb2xvciBpcyB0aGUgY29sb3Igb2YgdGhpcyBsYXllciBvciBudWxsIGlmIHRoZSBsYXllciBpcyB0cmFuc3BhcmVudFxuICAgICAgICAgICAgdmFyIHRoaXNCZ0NvbG9yID0gbnVsbDtcbiAgICAgICAgICAgIGlmIChjU3R5bGUuYmFja2dyb3VuZENvbG9yICYmIGNTdHlsZS5iYWNrZ3JvdW5kQ29sb3IgIT0gXCJ0cmFuc3BhcmVudFwiICYmIGNTdHlsZS5iYWNrZ3JvdW5kQ29sb3IgIT0gXCJyZ2JhKDAsIDAsIDAsIDApXCIpIHtcbiAgICAgICAgICAgICAgICB0aGlzQmdDb2xvciA9IENvbG9yVXRpbC5Db2xvcihjU3R5bGUuYmFja2dyb3VuZENvbG9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIGEgZ3JhZGllbnQgaW52b2x2ZWQsIHNldCB0aGlzQmdDb2xvciB0byB0aGUgd29yc3QgY29sb3IgY29tYmluYXRpb24gYXZhaWxhYmxlIGFnYWluc3QgdGhlIGZvcmVncm91bmRcbiAgICAgICAgICAgIGlmIChjU3R5bGUuYmFja2dyb3VuZEltYWdlICYmIGNTdHlsZS5iYWNrZ3JvdW5kSW1hZ2UuaW5kZXhPZiAmJiBjU3R5bGUuYmFja2dyb3VuZEltYWdlLmluZGV4T2YoXCJncmFkaWVudFwiKSAhPSAtMSkge1xuICAgICAgICAgICAgICAgIHZhciBncmFkQ29sb3JzIDogc3RyaW5nW10gPSBjU3R5bGUuYmFja2dyb3VuZEltYWdlLm1hdGNoKHJlQ29sb3IpO1xuICAgICAgICAgICAgICAgIGlmIChncmFkQ29sb3JzKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBncmFkQ29sb3JDb21wIDogQ29sb3JPYmpbXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdyYWRDb2xvcnMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZ3JhZENvbG9yc1tpXS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFkQ29sb3JzLnNwbGljZShpLS0sIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29sb3JDb21wID0gQ29sb3JVdGlsLkNvbG9yKGdyYWRDb2xvcnNbaV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2xvckNvbXAuYWxwaGEgIT09IHVuZGVmaW5lZCAmJiBjb2xvckNvbXAuYWxwaGEgPCAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1peCB0aGUgZ3JkaWVudCBiZyBjb2xvciB3aXQgcGFyZW50IGJnIGlmIGFscGhhIDwgMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29tcFN0YWNrQmcgPSB0aGlzU3RhY2tCRyB8fCBwcmlvclN0YWNrQkc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yQ29tcCA9IGNvbG9yQ29tcC5nZXRPdmVybGF5Q29sb3IoY29tcFN0YWNrQmcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFkQ29sb3JDb21wLnB1c2goY29sb3JDb21wKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzQmdDb2xvciA9IGd1ZXNzR3JhZENvbG9yKGdyYWRDb2xvckNvbXAsIHRoaXNTdGFja0JHIHx8IHByaW9yU3RhY2tCRywgZmcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gSGFuZGxlIG5vbi1zb2xpZCBvcGFjaXR5XG4gICAgICAgICAgICBpZiAodGhpc1N0YWNrT3BhY2l0eSA9PT0gbnVsbCB8fCAoY1N0eWxlLm9wYWNpdHkgJiYgY1N0eWxlLm9wYWNpdHkubGVuZ3RoID4gMCAmJiBwYXJzZUZsb2F0KGNTdHlsZS5vcGFjaXR5KSA8IDEpKSB7XG4gICAgICAgICAgICAgICAgLy8gTmV3IHN0YWNrLCByZXNldFxuICAgICAgICAgICAgICAgIGlmICh0aGlzU3RhY2tCRyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE92ZXJsYXlcbiAgICAgICAgICAgICAgICAgICAgdGhpc1N0YWNrQkcuYWxwaGEgPSB0aGlzU3RhY2tPcGFjaXR5ICogdGhpc1N0YWNrQWxwaGE7XG4gICAgICAgICAgICAgICAgICAgIHByaW9yU3RhY2tCRyA9IHRoaXNTdGFja0JHLmdldE92ZXJsYXlDb2xvcihwcmlvclN0YWNrQkcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzU3RhY2tPcGFjaXR5ID0gMS4wO1xuICAgICAgICAgICAgICAgIHRoaXNTdGFja0FscGhhID0gbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzU3RhY2tCRyA9IG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKGNTdHlsZS5vcGFjaXR5ICYmIGNTdHlsZS5vcGFjaXR5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpc1N0YWNrT3BhY2l0eSA9IHBhcnNlRmxvYXQoY1N0eWxlLm9wYWNpdHkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGhpc0JnQ29sb3IgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzU3RhY2tCRyA9IHRoaXNCZ0NvbG9yO1xuICAgICAgICAgICAgICAgICAgICB0aGlzU3RhY2tBbHBoYSA9IHRoaXNTdGFja0JHLmFscGhhIHx8IDEuMDtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXNTdGFja0JHLmFscGhhO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpc1N0YWNrT3BhY2l0eSA9PT0gMS4wICYmIHRoaXNTdGFja0FscGhhID09PSAxLjApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5oYXNCR0ltYWdlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuaGFzR3JhZGllbnQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEhhbmRsZSBzb2xpZCBjb2xvciBiYWNrZ3JvdW5kcyBhbmQgZ3JhZGllbnQgY29sb3IgYmFja2dyb3VuZHNcbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXNCZ0NvbG9yICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIHN0YWNrIGFscmVhZHkgaGFzIGEgYmFja2dyb3VuZCBjb2xvciwgYmxlbmQgaXRcbiAgICAgICAgICAgICAgICBpZiAodGhpc1N0YWNrQkcgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpc1N0YWNrQkcgPSB0aGlzQmdDb2xvcjtcbiAgICAgICAgICAgICAgICAgICAgdGhpc1N0YWNrQWxwaGEgPSB0aGlzU3RhY2tCRy5hbHBoYSB8fCAxLjA7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzU3RhY2tCRy5hbHBoYTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzU3RhY2tCRyA9IHRoaXNCZ0NvbG9yLmdldE92ZXJsYXlDb2xvcih0aGlzU3RhY2tCRyk7XG4gICAgICAgICAgICAgICAgICAgIC8vdGhpc1N0YWNrQWxwaGEgPSB0aGlzQmdDb2xvci5hbHBoYSB8fCAxLjA7XG4gICAgICAgICAgICAgICAgICAgIHRoaXNTdGFja0FscGhhID0gdGhpc1N0YWNrQkcuYWxwaGEgfHwgMS4wO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyAjNTI2OiBJZiB0aGlzQmdDb2xvciBoYWQgYW4gYWxwaGEgdmFsdWUsIGl0IG1heSBub3QgZXhwb3NlIHRocm91Z2ggdGhpc1N0YWNrQkcgaW4gdGhlIGFib3ZlIGNvZGVcbiAgICAgICAgICAgICAgICAvLyBXZSBjYW4ndCB3aXBlIG91dCB0aGUgZ3JhZGllbnQgaW5mbyBpZiB0aGlzIGxheWVyIHdhcyB0cmFuc3BhcmVudFxuICAgICAgICAgICAgICAgIGlmICh0aGlzU3RhY2tPcGFjaXR5ID09PSAxLjAgJiYgdGhpc1N0YWNrQWxwaGEgPT09IDEuMCAmJiAodGhpc1N0YWNrQkcuYWxwaGEgfHwgMS4wKSA9PT0gMS4wICYmICh0aGlzQmdDb2xvci5hbHBoYSB8fCAxLjApID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbC5oYXNCR0ltYWdlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbC5oYXNHcmFkaWVudCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjU3R5bGUuYmFja2dyb3VuZEltYWdlICYmIGNTdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgIT0gXCJub25lXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoY1N0eWxlLmJhY2tncm91bmRJbWFnZS5pbmRleE9mICYmIGNTdHlsZS5iYWNrZ3JvdW5kSW1hZ2UuaW5kZXhPZihcImdyYWRpZW50XCIpICE9IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbC5oYXNHcmFkaWVudCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsLmhhc0JHSW1hZ2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpc1N0YWNrQkcgIT0gbnVsbCkge1xuICAgICAgICAgICAgZmcgPSBmZy5nZXRPdmVybGF5Q29sb3IodGhpc1N0YWNrQkcpO1xuICAgICAgICAgICAgZGVsZXRlIGZnLmFscGhhO1xuICAgICAgICB9XG4gICAgICAgIGZnLmFscGhhID0gKGZnLmFscGhhIHx8IDEpICogdGhpc1N0YWNrT3BhY2l0eTtcbiAgICAgICAgZmcgPSBmZy5nZXRPdmVybGF5Q29sb3IocHJpb3JTdGFja0JHKTtcbiAgICAgICAgaWYgKHRoaXNTdGFja0JHICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXNTdGFja0JHLmFscGhhID0gdGhpc1N0YWNrT3BhY2l0eSAqIHRoaXNTdGFja0FscGhhO1xuICAgICAgICAgICAgcHJpb3JTdGFja0JHID0gdGhpc1N0YWNrQkcuZ2V0T3ZlcmxheUNvbG9yKHByaW9yU3RhY2tCRyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0VmFsLmZnID0gZmc7XG4gICAgICAgIHJldFZhbC5iZyA9IHByaW9yU3RhY2tCRztcblxuICAgICAgICBpZiAoY1N0eWxlLnRleHRTaGFkb3cgJiYgY1N0eWxlLnRleHRTaGFkb3cgIT09ICdub25lJylcbiAgICAgICAgICAgIHJldFZhbC50ZXh0U2hhZG93ID0gdHJ1ZTtcblxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAvLyBzb21ldGhpbmcgaGFwcGVuZWQsIHRoZW4uLi5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuIH07XG59XG5cbmV4cG9ydCBjbGFzcyBDb2xvck9iaiB7XG4gICAgcmVkIDogbnVtYmVyO1xuICAgIGdyZWVuIDogbnVtYmVyO1xuICAgIGJsdWUgOiBudW1iZXI7XG4gICAgYWxwaGEgOiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3RvcihyZWQgOiBzdHJpbmcgfCBudW1iZXIsIGdyZWVuIDogc3RyaW5nIHwgbnVtYmVyLCBibHVlIDogc3RyaW5nIHwgbnVtYmVyLCBhbHBoYT8gOiBzdHJpbmcgfCBudW1iZXIpIHtcbiAgICAgICAgZnVuY3Rpb24gZml4Q29tcG9uZW50KGNvbXAgOiBzdHJpbmcgfCBudW1iZXIpIDogbnVtYmVyIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgKGNvbXApICE9IHR5cGVvZiAoXCJcIikpIHJldHVybiBjb21wIGFzIG51bWJlcjtcbiAgICAgICAgICAgIGxldCBjb21wU3RyID0gY29tcCBhcyBzdHJpbmc7XG4gICAgICAgICAgICBjb21wU3RyID0gY29tcFN0ci50cmltKCk7XG4gICAgICAgICAgICBpZiAoY29tcFN0cltjb21wU3RyLmxlbmd0aCAtIDFdICE9IFwiJVwiKSByZXR1cm4gcGFyc2VJbnQoY29tcFN0cik7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChwYXJzZUZsb2F0KGNvbXBTdHIuc3Vic3RyaW5nKDAsIGNvbXBTdHIubGVuZ3RoIC0gMSkpICogMi41NSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZWQgPSBmaXhDb21wb25lbnQocmVkKTtcbiAgICAgICAgdGhpcy5ncmVlbiA9IGZpeENvbXBvbmVudChncmVlbik7XG4gICAgICAgIHRoaXMuYmx1ZSA9IGZpeENvbXBvbmVudChibHVlKTtcbiAgICAgICAgaWYgKHR5cGVvZiAoYWxwaGEpICE9IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHRoaXMuYWxwaGEgPSAodHlwZW9mIChhbHBoYSkgPT09IHR5cGVvZiAoXCJcIikpID8gcGFyc2VGbG9hdChhbHBoYSBhcyBzdHJpbmcpIDogYWxwaGEgYXMgbnVtYmVyO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdG9IZXhIZWxwKHZhbHVlIDogbnVtYmVyKSA6IHN0cmluZyB7XG4gICAgICAgIGxldCByZXRWYWwgPSBNYXRoLnJvdW5kKHZhbHVlKS50b1N0cmluZygxNik7XG4gICAgICAgIGlmIChyZXRWYWwubGVuZ3RoID09PSAxKVxuICAgICAgICAgICAgcmV0dXJuIFwiMFwiICsgcmV0VmFsO1xuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH07XG5cbiAgICB0b0hleCgpIDogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIFwiI1wiICsgdGhpcy50b0hleEhlbHAodGhpcy5yZWQpICsgdGhpcy50b0hleEhlbHAodGhpcy5ncmVlbikgKyB0aGlzLnRvSGV4SGVscCh0aGlzLmJsdWUpO1xuICAgIH07XG5cbiAgICBjb250cmFzdFJhdGlvKGJnQ29sb3IgOiBDb2xvck9iaikgeyBcbiAgICAgICAgbGV0IGZnQ29sb3I6IENvbG9yT2JqID0gdGhpcztcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgKHRoaXMuYWxwaGEpICE9IFwidW5kZWZpbmVkXCIpXG4gICAgICAgICAgICBmZ0NvbG9yID0gdGhpcy5nZXRPdmVybGF5Q29sb3IoYmdDb2xvcik7XG4gICAgICAgICAgICAgXG4gICAgICAgIGxldCBsdW0xID0gZmdDb2xvci5yZWxhdGl2ZUx1bWluYW5jZSgpO1xuICAgICAgICBpZiAoIWJnQ29sb3IucmVsYXRpdmVMdW1pbmFuY2UpIHtcbiAgICAgICAgICAgIGxldCBzID0gXCJcIjtcbiAgICAgICAgICAgIGZvciAobGV0IGtleSBpbiBiZ0NvbG9yKSB7XG4gICAgICAgICAgICAgICAgcyArPSBrZXkgKyBcIlxcblwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYWxlcnQoYmdDb2xvcik7XG4gICAgICAgICAgICBhbGVydChzKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbHVtMiA9IGJnQ29sb3IucmVsYXRpdmVMdW1pbmFuY2UoKTtcbiAgICAgICAgbGV0IHJhdGlvID0gKGx1bTEgPiBsdW0yKSA/IChsdW0xICsgLjA1KSAvIChsdW0yICsgLjA1KSA6IChsdW0yICsgLjA1KSAvIChsdW0xICsgLjA1KTtcbiAgICAgICAgcmV0dXJuIHJhdGlvO1xuICAgIH07XG5cbiAgICByZWxhdGl2ZUx1bWluYW5jZSgpIDogbnVtYmVyIHtcbiAgICAgICAgbGV0IFIgPSB0aGlzLnJlZCAvIDI1NS4wO1xuICAgICAgICBsZXQgRyA9IHRoaXMuZ3JlZW4gLyAyNTUuMDtcbiAgICAgICAgbGV0IEIgPSB0aGlzLmJsdWUgLyAyNTUuMDtcbiAgICAgICAgUiA9IFIgPD0gLjA0MDQ1ID8gUiAvIDEyLjkyIDogTWF0aC5wb3coKFIgKyAuMDU1KSAvIDEuMDU1LCAyLjQpO1xuICAgICAgICBHID0gRyA8PSAuMDQwNDUgPyBHIC8gMTIuOTIgOiBNYXRoLnBvdygoRyArIC4wNTUpIC8gMS4wNTUsIDIuNCk7XG4gICAgICAgIEIgPSBCIDw9IC4wNDA0NSA/IEIgLyAxMi45MiA6IE1hdGgucG93KChCICsgLjA1NSkgLyAxLjA1NSwgMi40KTtcbiAgICAgICAgcmV0dXJuIDAuMjEyNiAqIFIgKyAwLjcxNTIgKiBHICsgMC4wNzIyICogQjtcbiAgICB9O1xuXG4gICAgbWl4KGNvbG9yMiA6IENvbG9yT2JqLCBwZXJjVGhpcyA6IG51bWJlcikge1xuICAgICAgICBpZiAodHlwZW9mICh0aGlzLmFscGhhKSA9PT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2YgKGNvbG9yMi5hbHBoYSkgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQ29sb3JPYmooXG4gICAgICAgICAgICAgICAgcGVyY1RoaXMgKiB0aGlzLnJlZCArICgxIC0gcGVyY1RoaXMpICogY29sb3IyLnJlZCxcbiAgICAgICAgICAgICAgICBwZXJjVGhpcyAqIHRoaXMuZ3JlZW4gKyAoMSAtIHBlcmNUaGlzKSAqIGNvbG9yMi5ncmVlbixcbiAgICAgICAgICAgICAgICBwZXJjVGhpcyAqIHRoaXMuYmx1ZSArICgxIC0gcGVyY1RoaXMpICogY29sb3IyLmJsdWVcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgYWxwaGFUaGlzID0gdGhpcy5hbHBoYSA/IHRoaXMuYWxwaGEgOiAxO1xuICAgICAgICAgICAgbGV0IGFscGhhT3RoZXIgPSBjb2xvcjIuYWxwaGEgPyBjb2xvcjIuYWxwaGEgOiAxO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBDb2xvck9iaihcbiAgICAgICAgICAgICAgICBwZXJjVGhpcyAqIHRoaXMucmVkICsgKDEgLSBwZXJjVGhpcykgKiBjb2xvcjIucmVkLFxuICAgICAgICAgICAgICAgIHBlcmNUaGlzICogdGhpcy5ncmVlbiArICgxIC0gcGVyY1RoaXMpICogY29sb3IyLmdyZWVuLFxuICAgICAgICAgICAgICAgIHBlcmNUaGlzICogdGhpcy5ibHVlICsgKDEgLSBwZXJjVGhpcykgKiBjb2xvcjIuYmx1ZSxcbiAgICAgICAgICAgICAgICBwZXJjVGhpcyAqIGFscGhhVGhpcyArICgxIC0gcGVyY1RoaXMpICogYWxwaGFPdGhlclxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBnZXRPdmVybGF5Q29sb3IoYmdDb2xvciA6IENvbG9yT2JqKSB7XG4gICAgICAgIGlmICh0eXBlb2YgKHRoaXMuYWxwaGEpID09PSBcInVuZGVmaW5lZFwiIHx8IHRoaXMuYWxwaGEgPj0gMSkge1xuICAgICAgICAgICAgLy8gTm8gbWl4aW5nIHJlcXVpcmVkIC0gaXQncyBvcGFxdWVcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmFscGhhIDwgMCkge1xuICAgICAgICAgICAgLy9cdFx0SGFhYy5FcnJvci5sb2dFcnJvcihcIkludmFsaWQgYWxwaGEgdmFsdWVcIik7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIChiZ0NvbG9yLmFscGhhKSAhPSBcInVuZGVmaW5lZFwiICYmIGJnQ29sb3IuYWxwaGEgPCAxKSB7XG4gICAgICAgICAgICAvL1x0XHRIYWFjLkVycm9yLmxvZ0Vycm9yKFwiQ2Fubm90IG1peCB3aXRoIGEgYmFja2dyb3VuZCBhbHBoYVwiKTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZXRWYWwgPSB0aGlzLm1peChiZ0NvbG9yLCB0aGlzLmFscGhhKTtcbiAgICAgICAgZGVsZXRlIHJldFZhbC5hbHBoYTsgXG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmcm9tQ1NTQ29sb3IoY3NzU3R5bGVDb2xvcikge1xuICAgICAgICBsZXQgdGhpc1JlZCA9IC0xO1xuICAgICAgICBsZXQgdGhpc0dyZWVuID0gLTE7XG4gICAgICAgIGxldCB0aGlzQmx1ZSA9IC0xO1xuXG4gICAgICAgIGNzc1N0eWxlQ29sb3IgPSBjc3NTdHlsZUNvbG9yLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChjc3NTdHlsZUNvbG9yLnN0YXJ0c1dpdGgoXCJyZ2IoXCIpKSB7XG4gICAgICAgICAgICBsZXQgcmdiUmVnZXggPSAvXFxzKnJnYlxccypcXChcXHMqKFxcZCspXFxzKixcXHMqKFxcZCspXFxzKixcXHMqKFxcZCspXFxzKlxcKS87XG4gICAgICAgICAgICBsZXQgbSA9IGNzc1N0eWxlQ29sb3IubWF0Y2gocmdiUmVnZXgpO1xuICAgICAgICAgICAgaWYgKG0gPT09IG51bGwpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpc1JlZCA9IG1bMV07XG4gICAgICAgICAgICAgICAgdGhpc0dyZWVuID0gbVsyXTtcbiAgICAgICAgICAgICAgICB0aGlzQmx1ZSA9IG1bM107XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoY3NzU3R5bGVDb2xvci5zdGFydHNXaXRoKFwicmdiYShcIikpIHtcbiAgICAgICAgICAgIGxldCByZ2JSZWdleCA9IC9cXHMqcmdiYVxccypcXChcXHMqKFxcZCspXFxzKixcXHMqKFxcZCspXFxzKixcXHMqKFxcZCspXFxzKixcXHMqKC4rKVxccypcXCkvO1xuICAgICAgICAgICAgbGV0IG0gPSBjc3NTdHlsZUNvbG9yLm1hdGNoKHJnYlJlZ2V4KTtcbiAgICAgICAgICAgIGlmIChtID09PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXNSZWQgPSBtWzFdO1xuICAgICAgICAgICAgICAgIHRoaXNHcmVlbiA9IG1bMl07XG4gICAgICAgICAgICAgICAgdGhpc0JsdWUgPSBtWzNdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGNzc1N0eWxlQ29sb3IuY2hhckF0KDApICE9IFwiI1wiKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNzc1N0eWxlQ29sb3IgaW4gQ29sb3JVdGlsLkNTU0NvbG9yTG9va3VwKVxuICAgICAgICAgICAgICAgICAgICBjc3NTdHlsZUNvbG9yID0gQ29sb3JVdGlsLkNTU0NvbG9yTG9va3VwW2Nzc1N0eWxlQ29sb3JdO1xuICAgICAgICAgICAgICAgIGVsc2UgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgZnJvbUhleCA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgICAgICAgICAgICBsZXQgbG9va3VwID0ge1xuICAgICAgICAgICAgICAgICAgICBcImFcIjogMTAsXG4gICAgICAgICAgICAgICAgICAgIFwiYlwiOiAxMSxcbiAgICAgICAgICAgICAgICAgICAgXCJjXCI6IDEyLFxuICAgICAgICAgICAgICAgICAgICBcImRcIjogMTMsXG4gICAgICAgICAgICAgICAgICAgIFwiZVwiOiAxNCxcbiAgICAgICAgICAgICAgICAgICAgXCJmXCI6IDE1XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBsZXQgcmV0VmFsID0gMDtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbC5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICByZXRWYWwgPSByZXRWYWwgKiAxNiArXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJzZUludCh2YWwuY2hhckF0KGkpIGluIGxvb2t1cCA/IGxvb2t1cFt2YWwuY2hhckF0KGkpXSA6IHZhbC5jaGFyQXQoaSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNzc1N0eWxlQ29sb3IubGVuZ3RoID09PSA0KSB7XG4gICAgICAgICAgICAgICAgLy8gVGhlIHRocmVlLWRpZ2l0IFJHQiAoI3JnYikgaXMgY29udmVydGVkIHRvIHNpeC1kaWdpdCBmb3JtICgjcnJnZ2JiKSBieSByZXBsaWNhdGluZyBkaWdpdHNcbiAgICAgICAgICAgICAgICAvLyAoaHR0cHM6Ly93d3cudzMub3JnL1RSL2Nzcy1jb2xvci0zLyNyZ2ItY29sb3IpXG4gICAgICAgICAgICAgICAgY3NzU3R5bGVDb2xvciA9IFwiI1wiICsgY3NzU3R5bGVDb2xvci5jaGFyQXQoMSkucmVwZWF0KDIpICtcbiAgICAgICAgICAgICAgICAgICAgY3NzU3R5bGVDb2xvci5jaGFyQXQoMikucmVwZWF0KDIpICtcbiAgICAgICAgICAgICAgICAgICAgY3NzU3R5bGVDb2xvci5jaGFyQXQoMykucmVwZWF0KDIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpc1JlZCA9IGZyb21IZXgoY3NzU3R5bGVDb2xvci5zdWJzdHJpbmcoMSwgMykpO1xuICAgICAgICAgICAgdGhpc0dyZWVuID0gZnJvbUhleChjc3NTdHlsZUNvbG9yLnN1YnN0cmluZygzLCA1KSk7XG4gICAgICAgICAgICB0aGlzQmx1ZSA9IGZyb21IZXgoY3NzU3R5bGVDb2xvci5zdWJzdHJpbmcoNSwgNykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgQ29sb3JPYmoodGhpc1JlZCwgdGhpc0dyZWVuLCB0aGlzQmx1ZSk7XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IEFSSUFEZWZpbml0aW9ucyB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFEZWZpbml0aW9uc1wiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4vQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4vQXJpYVV0aWxcIjtcbmltcG9ydCB7IEFjY05hbWVVdGlsIH0gZnJvbSBcIi4vQWNjTmFtZVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi9WaXNVdGlsXCI7XG5pbXBvcnQgeyBET01VdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01VdGlsXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG5cbmV4cG9ydCBjbGFzcyBDb21tb25VdGlsIHtcblxuICAgIHB1YmxpYyBzdGF0aWMgaW5wdXRfdHlwZV93aXRoX3BsYWNlaG9sZGVyID0gW1widGV4dFwiLCBcInNlYXJjaFwiLCBcInRlbFwiLCBcInVybFwiLCBcImVtYWlsXCIsIFwicGFzc3dvcmRcIiwgXCJudW1iZXJcIl07XG4gICAgcHVibGljIHN0YXRpYyBpbnB1dF90ZXh0X3R5cGVzID0gW1xuICAgICAgICBcInRleHRcIiwgXCJmaWxlXCIsIFwicGFzc3dvcmRcIixcbiAgICAgICAgXCJjaGVja2JveFwiLCBcInJhZGlvXCIsXG4gICAgICAgIFwic2VhcmNoXCIsIFwidGVsXCIsIFwidXJsXCIsIFwiZW1haWxcIiwgIC8vSFRNTCA1LiBOb3RlOiB0eXBlID0gXCJoaWRkZW5cIiBkb2Vzbid0IHJlcXVpcmUgdGV4dFxuICAgICAgICBcImRhdGVcIiwgXCJudW1iZXJcIiwgXCJyYW5nZVwiLFxuICAgICAgICBcInRpbWVcIiwgXCJjb2xvclwiXG4gICAgXTtcbiAgICBwdWJsaWMgc3RhdGljIGlucHV0X3RpbWVfdHlwZXMgPSBbXG4gICAgICAgIFwiZGF0ZVwiLCBcIm1vbnRoXCIsIFwid2Vla1wiLCBcInRpbWVcIiwgXCJkYXRldGltZS1sb2NhbFwiXG4gICAgXTtcbiAgICBwdWJsaWMgc3RhdGljIGlucHV0X290aGVyX3R5cGVzID0gW1xuICAgICAgICBcInJhbmdlXCIsIFwiY29sb3JcIiwgXCJjaGVja2JveFwiLCBcInJhZGlvXCIsIFwiZmlsZVwiLCBcImltYWdlXCJcbiAgICBdO1xuICAgIHB1YmxpYyBzdGF0aWMgZm9ybV9idXR0b25fdHlwZXMgPSBbXG4gICAgICAgIFwiYnV0dG9uXCIsIFwicmVzZXRcIiwgXCJzdWJtaXRcIlxuICAgIF07XG5cbiAgICBwdWJsaWMgc3RhdGljIGZvcm1fbGFiZWxhYmxlX2VsZW1lbnRzID0gW1wiaW5wdXRcIiwgIFwidGV4dGFyZWFcIiwgXCJzZWxlY3RcIiwgXCJrZXlnZW5cIiwgXCJwcm9ncmVzc1wiLCBcIm1ldGVyXCIsIFwib3V0cHV0XCIsIFwiYnV0dG9uXCJdO1xuXG4gICAgcHVibGljIHN0YXRpYyB0YWJUYWdNYXAgPSB7XG4gICAgICAgIFwiYnV0dG9uXCI6IGZ1bmN0aW9uIChlbGVtZW50KTogYm9vbGVhbiB7XG4gICAgICAgICAgICByZXR1cm4gIWVsZW1lbnQuaGFzQXR0cmlidXRlKFwiZGlzYWJsZWRcIik7XG4gICAgICAgIH0sXG4gICAgICAgIFwiaWZyYW1lXCI6IHRydWUsXG4gICAgICAgIFwiaW5wdXRcIjogZnVuY3Rpb24gKGVsZW1lbnQpOiBib29sZWFuIHtcbiAgICAgICAgICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZShcImRpc2FibGVkXCIpIHx8IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwidHlwZVwiKSA9PT0gXCJoaWRkZW5cIikgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwidHlwZVwiKSA9PT0gXCJyYWRpb1wiKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwibmFtZVwiKTtcbiAgICAgICAgICAgICAgICBpZiAoIW5hbWUgfHwgbmFtZS50cmltKCkubGVuZ3RoID09PSAwKSByZXR1cm4gdHJ1ZTsgLy9zaW5nbGUgcmFkaW8sIG5vIGdyb3VwXG4gICAgICAgICAgICAgICAgbGV0IGRvYyA9IGVsZW1lbnQub3duZXJEb2N1bWVudDtcbiAgICAgICAgICAgICAgICBjb25zdCBncm91cCA9IGRvYy5xdWVyeVNlbGVjdG9yQWxsKFwiaW5wdXRbdHlwZT0ncmFkaW8nXVtuYW1lPSdcIiArIG5hbWUudHJpbSgpICtcIiddXCIpO1xuICAgICAgICAgICAgICAgIGlmIChncm91cC5sZW5ndGggPT09IDAgfHwgZ3JvdXAubGVuZ3RoID09PSAxKSByZXR1cm4gdHJ1ZTsgIC8vc2luZ2xlIHJhZGlvIHdpdGggdGhlIG5hbWUsIG5vIG90aGVycyBpbiBncm91cFxuXG4gICAgICAgICAgICAgICAgbGV0IGNoZWNrZWQgPSBudWxsO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZ3JvdXAubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKChncm91cFtpXSBhcyBIVE1MSW5wdXRFbGVtZW50KS5jaGVja2VkKVxuICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tlZCA9IGdyb3VwW2ldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvL29ubHkgbGFzdCBvbmUgYXBwbGllcyBpZiBtdWx0aXBsZSByYWRpb3Mgd2l0aCAnY2hlY2tlZCcgYXR0cmlidXRlc1xuICAgICAgICAgICAgICAgIGlmIChjaGVja2VkICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChET01VdGlsLnNhbWVOb2RlKGNoZWNrZWQsIGVsZW1lbnQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiBub3RoaW5nIGNoZWNrZWQgeWV0LCByZXR1cm4gdHJ1ZSBpZiBpdCdzIHRoZSBmaXJzdCBlbGVtZW50XG4gICAgICAgICAgICAgICAgICAgIGlmIChET01VdGlsLnNhbWVOb2RlKGdyb3VwWzBdLCBlbGVtZW50KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlICAgXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0sXG4gICAgICAgIFwic2VsZWN0XCI6IGZ1bmN0aW9uIChlbGVtZW50KTogYm9vbGVhbiB7XG4gICAgICAgICAgICByZXR1cm4gIWVsZW1lbnQuaGFzQXR0cmlidXRlKFwiZGlzYWJsZWRcIik7XG4gICAgICAgIH0sXG4gICAgICAgIFwidGV4dGFyZWFcIjogZnVuY3Rpb24gKGVsZW1lbnQpOiBib29sZWFuIHtcbiAgICAgICAgICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZShcImRpc2FibGVkXCIpIHx8IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwidHlwZVwiKSA9PT0gXCJoaWRkZW5cIikgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlwiZGl2XCI6IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJjb250ZW50ZWRpdGFibGVcIik7XG4gICAgICAgIH0sKi9cbiAgICAgICAgXCJhXCI6IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgICAgICAvLyB4bGluazpocmVmPz8gc2VlIHN2Z1xuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuaGFzQXR0cmlidXRlKFwiaHJlZlwiKTtcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmVhXCI6IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJocmVmXCIpO1xuICAgICAgICB9LFxuICAgICAgICBcImF1ZGlvXCI6IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJjb250cm9sc1wiKTtcbiAgICAgICAgfSxcbiAgICAgICAgXCJ2aWRlb1wiOiBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuaGFzQXR0cmlidXRlKFwiY29udHJvbHNcIik7XG4gICAgICAgIH0sXG4gICAgICAgIFwic3VtbWFyeVwiOiBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgICAgLy8gZmlyc3Qgc3VtbWFyeSBjaGlsZCBvZiBhIGRldGFpbHMgZWxlbWVudCBpcyBhdXRvbWF0aWNhbGx5IGZvY3VzYWJsZSBcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50LnBhcmVudEVsZW1lbnQgJiYgZWxlbWVudC5wYXJlbnRFbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdkZXRhaWxzJ1xuICAgICAgICAgICAgICAgICYmIERPTVV0aWwuc2FtZU5vZGUoWy4uLmVsZW1lbnQucGFyZW50RWxlbWVudC5jaGlsZHJlbl0uZmlsdGVyKGVsZW0gPT4gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnc3VtbWFyeScpWzBdLCBlbGVtZW50KTtcbiAgICAgICAgfSxcbiAgICAgICAgXCJkZXRhaWxzXCI6IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgICAgICAvL2RldGFpbHMgZWxlbWVudCB3aXRob3V0IGEgZGlyZWN0IHN1bW1hcnkgY2hpbGQgaXMgYXV0b21hdGljYWxseSBmb2N1c2FibGVcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50LmNoaWxkcmVuICYmIFsuLi5lbGVtZW50LmNoaWxkcmVuXS5maWx0ZXIoZWxlbSA9PiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdzdW1tYXJ5JykubGVuZ3RoID09PSAwO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyB3b3JkQ291bnQoc3RyKTogbnVtYmVyIHtcbiAgICAgICAgc3RyID0gc3RyLnRyaW0oKTtcbiAgICAgICAgaWYgKHN0ci5sZW5ndGggPT09IDApIHJldHVybiAwO1xuICAgICAgICByZXR1cm4gc3RyLnNwbGl0KC9cXHMrL2cpLmxlbmd0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBOb3RlIHRoYXQgdGhpcyBvbmx5IGRldGVjdHMgaWYgdGhlIGVsZW1lbnQgaXRzZWxmIGlzIGluIHRoZSB0YWIgb3JkZXIuXG4gICAgICogSG93ZXZlciwgdGhpcyBlbGVtZW50IG1heSBkZWxlZ2F0ZSBmb2N1cyB0byBhbm90aGVyIGVsZW1lbnQgdmlhIGFyaWEtYWN0aXZlZGVzY2VuZGFudC5cbiAgICAgKiBBbHNvLCBmb2N1cyB2YXJpZXMgYnkgYnJvd3Nlci4uLiBzdGlja2luZyB0byB0aGluZ3MgdGhhdCBhcmUgZm9jdXNhYmxlIG9uIENocm9tZSBhbmQgRmlyZWZveC5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzVGFiYmFibGUoZWxlbWVudCkge1xuICAgICAgICAvLyBVc2luZyBodHRwczovL2FsbHlqcy5pby9kYXRhLXRhYmxlcy9mb2N1c2FibGUuaHRtbFxuICAgICAgICAvLyBIYW5kbGUgdGhlIGV4cGxpY2l0IGNhc2VzIGZpcnN0XG4gICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKGVsZW1lbnQpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZShcImluZXJ0XCIpIHx8IERPTVV0aWwuZ2V0QW5jZXN0b3JXaXRoQXR0cmlidXRlKGVsZW1lbnQsIFwiaW5lcnRcIiwgXCJcIikpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKFwidGFiaW5kZXhcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZUludChlbGVtZW50LmdldEF0dHJpYnV0ZShcInRhYmluZGV4XCIpKSA+PSAwO1xuICAgICAgICB9XG4gICAgICAgIC8vIEV4cGxpY2l0IGNhc2VzIGhhbmRsZWQgLSBub3cgdGhlIGltcGxpY2l0XG4gICAgICAgIGxldCBub2RlTmFtZSA9IGVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKG5vZGVOYW1lIGluIENvbW1vblV0aWwudGFiVGFnTWFwKSB7XG4gICAgICAgICAgICBsZXQgcmV0VmFsID0gQ29tbW9uVXRpbC50YWJUYWdNYXBbbm9kZU5hbWVdO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiAocmV0VmFsKSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgcmV0VmFsID0gcmV0VmFsKGVsZW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZShcImNvbnRlbnRlZGl0YWJsZVwiKSkgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUZXN0IGlmIHRoZSBlbGUgbm9kZSBpcyBmb2N1c2FibGVcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzRm9jdXNhYmxlKGVsZSkge1xuICAgICAgICBpZiAoZWxlID09PSBcInVuZGVmaW5lZFwiIHx8IGVsZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBDb21tb25VdGlsLmlzVGFiYmFibGUoZWxlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBOb3RlIHRoYXQgdGhpcyBvbmx5IGRldGVjdHMgaWYgdGhlIGVsZW1lbnQgaXRzZWxmIGlzIGludGVyYWN0aXZlLCBidXQgbm90IG9uY2xpY2sgZXZlbnQuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpc0NsaWNrYWJsZShlbGVtZW50KSB7XG4gICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKGVsZW1lbnQpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIFxuICAgICAgICAvLyBuYXRpdmUgZm9jdXNhYmxlIGVsZW1lbnRcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gZWxlbWVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAobm9kZU5hbWUgaW4gQ29tbW9uVXRpbC50YWJUYWdNYXApIHtcbiAgICAgICAgICAgIGxldCByZXRWYWwgPSBDb21tb25VdGlsLnRhYlRhZ01hcFtub2RlTmFtZV07XG4gICAgICAgICAgICBpZiAodHlwZW9mIChyZXRWYWwpID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICByZXRWYWwgPSByZXRWYWwoZWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgICAgICB9IGVsc2UgeyBcbiAgICAgICAgICAgIC8vY3VzdG9tIHdpZGdldFxuICAgICAgICAgICAgaWYgKEFyaWFVdGlsLmlzV2lkZ2V0KGVsZW1lbnQpICYmIGVsZW1lbnQuaGFzQXR0cmlidXRlKFwidGFiaW5kZXhcIikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0gXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlOyAgXG4gICAgfVxuXG4gICAgLyogXG4gICAgICogZ2V0IGNvbmZsaWN0IEFyaWEgYW5kIEh0bWwgYXR0cmlidXRlc1xuICAgICAqIHJldHVybjogYSBsaXN0IG9mIEFyaWEgYW5kIEh0bWwgYXR0cmlidXRlIHBhaXJzIHRoYXQgYXJlIGNvbmZsaWN0XG4gICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzVGFibGVEZXNjZW5kYW50KGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KSB7XG4gICAgICAgIGlmICghY29udGV4dEhpZXJhcmNoaWVzKSByZXR1cm4gbnVsbDtcblxuICAgICAgICByZXR1cm4gY29udGV4dEhpZXJhcmNoaWVzW1wiYXJpYVwiXS5maWx0ZXIoaGllciA9PiBbXCJ0YWJsZVwiLCBcImdyaWRcIiwgXCJ0cmVlZ3JpZFwiXS5pbmNsdWRlcyhoaWVyLnJvbGUpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHRhYkluZGV4TEVaZXJvKGVsZW0pIHtcbiAgICAgICAgaWYgKENvbW1vblV0aWwuaGFzQXR0cmlidXRlKGVsZW0sIFwidGFiaW5kZXhcIikpIHtcbiAgICAgICAgICAgIGlmIChlbGVtLmdldEF0dHJpYnV0ZShcInRhYmluZGV4XCIpLm1hdGNoKC9eLT9cXGQrJC8pKSB7XG4gICAgICAgICAgICAgICAgbGV0IHRhYmluZGV4VmFsdWUgPSBwYXJzZUludChlbGVtLmdldEF0dHJpYnV0ZShcInRhYmluZGV4XCIpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGFiaW5kZXhWYWx1ZSA9PT0gMCB8fCB0YWJpbmRleFZhbHVlID09PSAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogZ2V0IG51bWJlciBvZiB0YWJiYWJsZSBjaGlsZHJlblxuICAgICAqIEBwYXJhbSBlbGVtZW50IFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0VGFiYmFibGVDaGlsZHJlbihlbGVtZW50KSB7XG4gICAgICAgIGxldCBjb3VudCA9IDA7XG4gICAgICAgIC8vIElmIG5vZGUgaGFzIGNoaWxkcmVuLCBsb29rIGZvciB0YWIgc3RvcHMgaW4gdGhlIGNoaWxkcmVuXG4gICAgICAgIGlmIChlbGVtZW50LmZpcnN0Q2hpbGQgfHwgZWxlbWVudC5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIklGUkFNRVwiKSB7XG4gICAgICAgICAgICBsZXQgbncgPSBuZXcgRE9NV2Fsa2VyKGVsZW1lbnQpO1xuICAgICAgICAgICAgd2hpbGUgKG53Lm5leHROb2RlKCkgJiYgbncubm9kZSAhPSBlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgaWYgKG53Lm5vZGUubm9kZVR5cGUgPT0gMSAmJiAhbncuYkVuZFRhZyAmJiBDb21tb25VdGlsLmlzVGFiYmFibGUobncubm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgKytjb3VudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvdW50O1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgbm9ybWFsaXplU3BhY2luZyhzKSB7XG4gICAgICAgIGlmICghcykgcmV0dXJuICcnO1xuICAgICAgICByZXR1cm4gcy50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xuICAgIH07XG5cbiAgICAvL1RPRE86IGZ1bmN0aW9uIGRvZXMgbm90IGhhbmRsZSBlcXVpdmFsZW50cyBmb3Igcm9sZXM6IHJvdywgbGluaywgaGVhZGVyLCBidXR0b25cbiAgICAvLyBCdXQgaXQgbWF5IG5vdCBoYXZlIHRvLiBCdWcgcmVwb3J0cyBoYXZlIGJlZW4gYWJvdXQgcmFkaW8gYnV0dG9ucyBhbmQgY2hlY2tib3hlcy5cbiAgICBwdWJsaWMgc3RhdGljIGlzSHRtbEVxdWl2KG5vZGUsIGh0bWxFcXVpdikge1xuICAgICAgICBsZXQgcmV0VmFsID0gZmFsc2U7XG4gICAgICAgIGlmIChub2RlKSB7XG4gICAgICAgICAgICBsZXQgbm9kZU5hbWUgPSBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwiaW5wdXRcIikge1xuICAgICAgICAgICAgICAgIGxldCB0eXBlID0gbm9kZS5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGh0bWxFcXVpdi5pbmRleE9mKFwiY2hlY2tib3hcIikgIT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IHR5cGUgPT09IFwiY2hlY2tib3hcIjtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChodG1sRXF1aXYuaW5kZXhPZihcInJhZGlvXCIpICE9IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwgPSB0eXBlID09PSBcInJhZGlvXCI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIG5vbkV4aXN0YW50SURzKG5vZGUsIHRhcmdldGlkcykge1xuICAgICAgICBsZXQgcmV0dXJubm90Zm91bmRpZHMgPSAnJztcbiAgICAgICAgaWYgKENvbW1vblV0aWwubm9ybWFsaXplU3BhY2luZyh0YXJnZXRpZHMpLmxlbmd0aCA8IDEpIHJldHVybiByZXR1cm5ub3Rmb3VuZGlkcztcblxuICAgICAgICBsZXQgdGFyZ2V0QXJyYXkgPSB0YXJnZXRpZHMuc3BsaXQoXCIgXCIpO1xuICAgICAgICBsZXQgZG9jID0gbm9kZS5vd25lckRvY3VtZW50O1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhcmdldEFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgeHAgPSBcIi8vKltAaWQ9J1wiICsgdGFyZ2V0QXJyYXlbaV0gKyBcIiddXCI7XG4gICAgICAgICAgICBsZXQgeHBhdGhSZXN1bHQgPSBkb2MuZXZhbHVhdGUoeHAsIG5vZGUsIGRvYy5kZWZhdWx0TlNSZXNvbHZlciwgMCAvKiBYUGF0aFJlc3VsdC5BTllfVFlQRSAqLywgbnVsbCk7XG4gICAgICAgICAgICBsZXQgciA9IHhwYXRoUmVzdWx0Lml0ZXJhdGVOZXh0KCk7XG4gICAgICAgICAgICBpZiAoIXIpIHJldHVybm5vdGZvdW5kaWRzICs9IHRhcmdldEFycmF5W2ldICsgJywgJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKHJldHVybm5vdGZvdW5kaWRzKS5sZW5ndGggPj0gMilcbiAgICAgICAgICAgIHJldHVybm5vdGZvdW5kaWRzID0gcmV0dXJubm90Zm91bmRpZHMuc3Vic3RyaW5nKDAsIHJldHVybm5vdGZvdW5kaWRzLmxlbmd0aCAtIDIpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICByZXR1cm5ub3Rmb3VuZGlkcyA9ICcnO1xuICAgICAgICByZXR1cm4gcmV0dXJubm90Zm91bmRpZHM7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXREb2NFbGVtZW50c0J5VGFnKGVsZW0sIHRhZ05hbWUpIHtcbiAgICAgICAgbGV0IGRvYyA9IEZyYWdtZW50VXRpbC5nZXRPd25lckZyYWdtZW50KGVsZW0pIGFzIGFueTtcbiAgICAgICAgdGFnTmFtZSA9IHRhZ05hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgbGV0IGNhY2hlID0gQ2FjaGVVdGlsLmdldENhY2hlKGRvYywgXCJSUFRfRE9DRUxFTVNCWVRBR1wiLCB7fSk7XG4gICAgICAgIGlmICghKHRhZ05hbWUgaW4gY2FjaGUpKSB7XG4gICAgICAgICAgICBjYWNoZVt0YWdOYW1lXSA9IGRvYy5xdWVyeVNlbGVjdG9yQWxsKHRhZ05hbWUpO1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGRvYywgXCJSUFRfRE9DRUxFTVNCWVRBR1wiLCBjYWNoZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNhY2hlW3RhZ05hbWVdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGdldCBhIGxpc3Qgb2YgYWxsIHRoZSBjaGlsZCBlbGVtbnRzIHdoaWNoIG1hdGNoIHRoZSB0YWdcbiAgICAgKiBuYW1lIHByb3ZpZGVkLlxuICAgICAqXG4gICAgICogTm90ZTogVGhpcyBpcyBhIHdyYXBwZXIgZnVuY3Rpb24gdG86IEFyaWFVdGlsLmdldENoaWxkQnlUYWdIaWRkZW5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBwYXJlbnRFbGVtIC0gVGhlIHBhcmVudCBlbGVtZW50XG4gICAgICogQHBhcm0ge3N0cmluZ30gdGFnTmFtZSAtIFRoZSB0YWcgdG8gc2VhcmNoIGZvciB1bmRlciB0aGUgcGFyZW50IGVsZW1lbnRcbiAgICAgKiBAcGFybSB7Ym9vbGVhbn0gaWdub3JlSGlkZGVuIC0gdHJ1ZSBpZiBoaWRkZW4gZWxlbWVudHMgd2l0aCB0aGUgdGFnIHNob3VsZCBpZ25vcmVkIGZyb20gdGhlIGxpc3RcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgaWYgdGhlIGhpZGRlbiBlbGVtZW50cyBzaG91bGQgYmUgYWRkZWRcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0xpc3R9IHJldFZhbCAtIGxpc3Qgb2YgYWxsIHRoZSBlbGVtZW50cyB3aGljaCBtYXRjaGVkIHRoZSB0YWcgdW5kZXIgdGhlIHBhcmVudCB0aGF0IHdlcmUgcHJvdmlkZWQuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldENoaWxkQnlUYWcocGFyZW50RWxlbSwgdGFnTmFtZSkge1xuICAgICAgICByZXR1cm4gQ29tbW9uVXRpbC5nZXRDaGlsZEJ5VGFnSGlkZGVuKHBhcmVudEVsZW0sIHRhZ05hbWUsIGZhbHNlLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZ2V0IGEgbGlzdCBvZiBhbGwgdGhlIGNoaWxkIGVsZW1udHMgd2hpY2ggbWF0Y2ggdGhlIHRhZ1xuICAgICAqIG5hbWUgcHJvdmlkZWQuXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gcGFyZW50RWxlbSAtIFRoZSBwYXJlbnQgZWxlbWVudFxuICAgICAqIEBwYXJtIHtzdHJpbmd9IHRhZ05hbWUgLSBUaGUgdGFnIHRvIHNlYXJjaCBmb3IgdW5kZXIgdGhlIHBhcmVudCBlbGVtZW50XG4gICAgICogQHBhcm0ge2Jvb2xlYW59IGlnbm9yZUhpZGRlbiAtIHRydWUgaWYgaGlkZGVuIGVsZW1lbnRzIHdpdGggdGhlIHRhZyBzaG91bGQgaWdub3JlZCBmcm9tIHRoZSBsaXN0XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIGlmIHRoZSBoaWRkZW4gZWxlbWVudHMgc2hvdWxkIGJlIGFkZGVkXG4gICAgICogQHBhcm0ge2Jvb2x9IGNvbnNpZGVySGlkZGVuU2V0dGluZyAtIHRydWUgb3IgZmFsc2UgYmFzZWQgb24gaWYgaGlkZGVuIHNldHRpbmcgc2hvdWxkIGJlIGNvbnNpZGVyZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtMaXN0fSByZXRWYWwgLSBsaXN0IG9mIGFsbCB0aGUgZWxlbWVudHMgd2hpY2ggbWF0Y2hlZCB0aGUgdGFnIHVuZGVyIHRoZSBwYXJlbnQgdGhhdCB3ZXJlIHByb3ZpZGVkLlxuICAgICAqXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRDaGlsZEJ5VGFnSGlkZGVuKHBhcmVudEVsZW0sIHRhZ05hbWUsIGlnbm9yZUhpZGRlbiwgY29uc2lkZXJIaWRkZW5TZXR0aW5nKSB7XG4gICAgICAgIC8vIFZhcmlhYmxlIERlY2xlcmF0aW9uXG4gICAgICAgIGxldCByZXRWYWwgPSBbXTtcbiAgICAgICAgbGV0IGNoaWxkID0gcGFyZW50RWxlbS5maXJzdENoaWxkO1xuXG4gICAgICAgIC8vIExvb3Agb3ZlciBhbGwgdGhlIGNoaWxkIGVsZW1lbnRzIG9mIHRoZSBwYXJlbnQgdG8gYnVpbGQgYSBsaXN0IG9mIGFsbCB0aGUgZWxlbWVudHMgdGhhdFxuICAgICAgICAvLyBtYXRjaCB0aGUgdGFnTmFtZSBwcm92aWRlZFxuICAgICAgICB3aGlsZSAoY2hpbGQgIT0gbnVsbCkge1xuXG4gICAgICAgICAgICAvLyBPbmx5IGluY2x1ZGUgdGhlIGNoaWxkcmVuIGludG8gdGhlIHJldHVybiBhcnJheSBpZiB0aGV5IG1hdGNoIHdpdGggdGFnbmFtZS5cbiAgICAgICAgICAgIGlmIChjaGlsZC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSB0YWdOYW1lKSB7XG5cbiAgICAgICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IGlnbm9yZWhpZGRlbiB3YXMgc2V0IHRvIHRydWUsIHRoZW4gcGVyZm9ybSBhIGlzTm9kZVZpc2libGUgY2hlY2tcbiAgICAgICAgICAgICAgICAvLyBhbmQgaW4gdGhlIGNhc2UgdGhlIG5vZGUgaXMgbm90IHZpc2lsYmxlIHdlIG1vcmUgdG8gdGhlc2VzIHRoZW4gbW92ZSB0byB0aGUgbmV4dCBub2RlLlxuICAgICAgICAgICAgICAgIC8vIFBlcmZvcm0gYSBjb3VwbGUgb2YgY2hlY2tzIHRvIGRldGVybWluZSBpZiBoaWRkZW4gZWxlbWVudHMgc2hvdWxkIGJlIGlnbm9yZWQgb3Igbm90LlxuICAgICAgICAgICAgICAgIC8vICAxLiBXaGVuIGlnbm9yZUhpZGRlbiBpcyBzZXQgdG8gdHJ1ZSB1cGZyb250LCB0aGVuIHBlcmZvcm0gYSBpc05vZGVWaXNpYmxlXG4gICAgICAgICAgICAgICAgLy8gIDIuIElmIGNvbnNpZGVySGlkZGVuU2V0dGluZyBvcHRpb24gaXMgc2V0IHRvIHRydWUgdGhlbiB3ZSBwZXJmb3JtIHRoZSBjaGVjayB0byBjb25zaWRlciB0aGVcbiAgICAgICAgICAgICAgICAvLyAgICAgQ2hlY2sgSGlkZGVuIENvbnRlbnQgdGhhdCBpcyBwcm92aWRlZC5cbiAgICAgICAgICAgICAgICAvLyAgMi4xLiBPbmx5IHJ1biBpc05vZGVWaXNpYmxlIGNoZWNrIGlmIGhpZGRlbiBjb250ZW50IHNob3VsZCBOT1QgYmUgY2hlY2tlZC4gSW4gdGhlIGNhc2UgdGhhdCBoaWRkZW4gY29udGVudCBpcyB0byxcbiAgICAgICAgICAgICAgICAvLyAgICAgICBiZSBzY2FubmVkIHRoZW4gd2UgY2FuIGp1c3Qgc2NhbiBldmVyeXRoaW5nIGFzIG5vcm1hbC4gSW4gdGhlIGNhc2UgdGhhdCB0aGUgY3VycmVudCBub2RlIGlzIGhpZGRlbiB3ZSBkbyBub3RcbiAgICAgICAgICAgICAgICAvLyAgICAgICBhZGQgaXQgdG8gdGhlIHJvbGVUb0VsZW1zIGhhc2ggYXQgYWxsIG9yIGV2ZW4gZG8gYW55IGNoZWNraW5nIGZvciBpdCBhdCBhbGwuXG4gICAgICAgICAgICAgICAgaWYgKChpZ25vcmVIaWRkZW4gfHwgKGNvbnNpZGVySGlkZGVuU2V0dGluZyAmJiAhQ29tbW9uVXRpbC5zaG91bGRDaGVja0hpZGRlbkNvbnRlbnQoY2hpbGQpKSkgJiYgIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShjaGlsZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTW92ZSBvbiB0byB0aGUgbmV4dCBlbGVtZW50XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkID0gY2hpbGQubmV4dFNpYmxpbmc7XG5cbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gUHVzaCB0aGUgZWxlbWVudFxuICAgICAgICAgICAgICAgIHJldFZhbC5wdXNoKGNoaWxkKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gTW92ZSB0byB0aGUgbmV4dCBzaWJsaW5nIGVsZW1lbnRcbiAgICAgICAgICAgIGNoaWxkID0gY2hpbGQubmV4dFNpYmxpbmc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZmluZGluZyBhIGxpc3Qgb2YgZWxlbWVudHMgdGhhdCBtYXRjaCBnaXZlbiByb2xlcyhzKS5cbiAgICAgICAgICogVGhpcyBmdW5jdGlvbiBieSBkZWZhdWx5IHdpbGwgbm90IGNvbnNpZGVyIENoZWNrIEhpZGRlbiBTZXR0aW5nIGF0IGFsbC5cbiAgICAgICAgICogVGhpcyBmdW5jdGlvbiBieSBkZWZhdWx5IHdpbGwgbm90IGNvbnNpZGVyIGltcGxpY2l0IHJvbGVzLlxuICAgICAgICAgKiBOb3RlOiBUaGlzIGlzIGEgd3JhcHBlciBmdW5jdGlvbiB0bzogQXJpYVV0aWwuZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcm0ge2RvY3VtZW50fSBkb2MgLSBUaGUgZG9jdW1lbnQgbm9kZVxuICAgICAgICAgKiBAcGFybSB7bGlzdCBvciBzdHJpbmd9IHJvbGVzIC0gTGlzdCBvciBzaW5nbGUgcm9sZSBmb3Igd2hpY2ggdG8gcmV0dXJuIGVsZW1lbnRzIGJhc2VkIG9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtMaXN0fSByZXRWYWwgLSBsaXN0IG9mIGFsbCB0aGUgZWxlbWVudHMgd2hpY2ggbWF0Y2hlZCB0aGUgcm9sZShzKSB0aGF0IHdlcmUgcHJvdmlkZWQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEVsZW1lbnRzQnlSb2xlKGRvYywgcm9sZXMpIHtcbiAgICAgICAgcmV0dXJuIENvbW1vblV0aWwuZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW4oZG9jLCByb2xlcywgZmFsc2UsIGZhbHNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBmaW5kaW5nIGEgbGlzdCBvZiBlbGVtZW50cyB0aGF0IG1hdGNoIGdpdmVuIHJvbGVzKHMpLlxuICAgICAqIFRoaXMgZnVuY3Rpb24gYXNsbyBmaW5kcyBlbGVtZW50cyB3aXRoIGltcGxpY2l0IHJvbGVzLlxuICAgICAqIFRoaXMgZnVuY3Rpb24gd2lsbCBhbHNvIGNvbnNpZGVyIGVsZW1lbnRzIHRoYXQgYXJlIGhpZGRlbiBiYXNlZCBvbiB0aGUgaWYgdGhlIENoZWNrXG4gICAgICogSGlkZGVuIENvbnRlbnQgc2V0dGluZ3Mgc2hvdWxkIGJlIGNvbnNpZGVyZWQgb3Igbm90LlxuICAgICAqXG4gICAgICogQHBhcm0ge2RvY3VtZW50fSBkb2MgLSBUaGUgZG9jdW1lbnQgbm9kZVxuICAgICAqIEBwYXJtIHtsaXN0IG9yIHN0cmluZ30gcm9sZXMgLSBMaXN0IG9yIHNpbmdsZSByb2xlIGZvciB3aGljaCB0byByZXR1cm4gZWxlbWVudHMgYmFzZWQgb24uXG4gICAgICogQHBhcm0ge2Jvb2x9IGNvbnNpZGVySGlkZGVuU2V0dGluZyAtIHRydWUgb3IgZmFsc2UgYmFzZWQgb24gaWYgaGlkZGVuIHNldHRpbmcgc2hvdWxkIGJlIGNvbnNpZGVyZWQuXG4gICAgICogQHBhcm0ge2Jvb2x9IGNvbnNpZGVySW1wbGljaXRSb2xlcyAtIHRydWUgb3IgZmFsc2UgYmFzZWQgb24gaWYgaW1wbGljaXQgcm9sZXMgc2V0dGluZyBzaG91bGQgYmUgY29uc2lkZXJlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0xpc3R9IHJldFZhbCAtIGxpc3Qgb2YgYWxsIHRoZSBlbGVtZW50cyB3aGljaCBtYXRjaGVkIHRoZSByb2xlKHMpIHRoYXQgd2VyZSBwcm92aWRlZC5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW4oZG9jLCByb2xlcywgY29uc2lkZXJIaWRkZW5TZXR0aW5nLCBjb25zaWRlckltcGxpY2l0Um9sZXM/KSB7XG4gICAgICAgIFxuICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IHRoZSByb2xlIHRvIGVsZW1lbnQgYXNzb2ljYXRpb24gaXMgYWxyZWFkeSBtYWRlLCBhbmQgYXZhaWxhYmxlIGluIHRoZSBnbG9iYWwgaGFzQXR0cmlidXRlXG4gICAgICAgIC8vIHdlIGNhbiBqdXN0IHVzZSB0aGF0IG9uZSBpbnN0ZWFkIG9mIGJ1aWxkaW5nIGEgbmV3IG9uZS5cbiAgICAgICAgbGV0IHJvbGVUb0VsZW1zID0gbnVsbDtcbiAgICAgICAgaWYgKGNvbnNpZGVySW1wbGljaXRSb2xlcykge1xuICAgICAgICAgICAgcm9sZVRvRWxlbXMgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUoZG9jLCBcIkFyaWFVdGlsX0dFVEVMRU1FTlRTQllfUk9MRV9JTVBMSUNJVFwiLCBudWxsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJvbGVUb0VsZW1zID0gQ2FjaGVVdGlsLmdldENhY2hlKGRvYywgXCJBcmlhVXRpbF9HRVRFTEVNRU5UU0JZX1JPTEVcIiwgbnVsbCk7XG4gICAgICAgIH1cblxuXG4gICAgICAgIC8vIEJ1aWxkIHRoZSBuZXcgcm9sZSB0byBlbGVtZW50LCB0aGlzIGlzIHdoZXJlIHdlIGxvb3AgdGhyb3VnaCBhbGwgdGhlIGVsZW1lbnRzIGFuZCBleHRyYWN0IGFsbCB0aGVcbiAgICAgICAgLy8gZWxlbWVudHMgYnNhZWQgb24gcm9sZXMuXG4gICAgICAgIGlmIChyb2xlVG9FbGVtcyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gUmUtaW5pdGlhbGl6ZSB0aGUgcm9sZVRvRWxlbXMgaGFzaFxuICAgICAgICAgICAgcm9sZVRvRWxlbXMgPSB7fTtcblxuICAgICAgICAgICAgLy8gR2V0IHRoZSBib2R5IG9mIHRoZSBkb2NcbiAgICAgICAgICAgIGxldCByb290ID0gZG9jLmJvZHk7XG5cbiAgICAgICAgICAgIC8vIEtlZXAgbG9vcGluZyB1bnRpbCB3ZSBhcmUgYXQgdGhlIHZlcnkgcGFyZW50IG5vZGUgb2YgdGhlIGVudGlyZSBwYWdlLCBzbyB0aGF0IHdlIGNhbiBsb29wIHRocm91Z2hcbiAgICAgICAgICAgIC8vIGFsbCB0aGUgbm9kZXMuXG4gICAgICAgICAgICB3aGlsZSAoRE9NV2Fsa2VyLnBhcmVudE5vZGUocm9vdCkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIHBhcmVudE5vZGVcbiAgICAgICAgICAgICAgICByb290ID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUocm9vdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBCdWlsZCBhIG5vZGV3YWx0ZXIgYmFzZWQgb2YgdGhlIHJvb3Qgbm9kZSwgdGhpcyBub2RlIHdhbHRlciB3aWxsIGJlIHVzZSBsb29wIG92ZXIgYWxsIHRoZSBub2Rlc1xuICAgICAgICAgICAgLy8gYW5kIGJ1aWxkIHRoZSByb2xlcyB0byBFbGVtZW50IGNvcmFsYXRpb25cbiAgICAgICAgICAgIGxldCBudyA9IG5ldyBET01XYWxrZXIocm9vdCk7XG4gICAgICAgICAgICAvLyBMb29wIG92ZXIgdGhlIGVudGlyZSBkb2MvbGlzdCBvZiBub2RlcyB0byBidWlsZCB0aGUgcm9sZSB0byBlbGVtZW50IG1hcFxuICAgICAgICAgICAgLy8gTm90ZTogVGhpcyB3aWxsIGJ1aWxkIGFuIHJvbGVUb0VsZW1zIGhhc2ggd2hpY2ggaXMgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQuXG4gICAgICAgICAgICAvLyByb2xlVG9FbGVtcyA9IHtcbiAgICAgICAgICAgIC8vICAgIGRvY3VtZW50OiBbe2Rpdn0se2FiYnJ9LHt2YXJ9XSxcbiAgICAgICAgICAgIC8vICAgIG1haW46IFt7ZGl2fV0sXG4gICAgICAgICAgICAvLyAgICBuYXZpZ2F0aW9uOiBbe2Rpdn1dXG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICB3aGlsZSAobncubmV4dE5vZGUoKSkge1xuICAgICAgICAgICAgICAgIGlmICghbncuZWxlbSgpKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAvLyBPbmx5IGNoZWNrIHRoZSBlbGVtZW50cyB3aGljaCBoYXZlIHRoZSByb2xlIGF0dHJpYnV0ZSBhc3NpY2lhdGVkIHRvIHRoZW1cbiAgICAgICAgICAgICAgICBpZiAoIW53LmJFbmRUYWcpIHtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgd1JvbGVzID0gW107XG4gICAgICAgICAgICAgICAgICAgIC8vY2hlY2sgaWYgdGhlIG5vZGUgaGFzIHJvbGUgYXR0cmlidXRlc1xuICAgICAgICAgICAgICAgICAgICBpZiAobncuZWxlbSgpICYmIG53LmVsZW0oKS5oYXNBdHRyaWJ1dGUoXCJyb2xlXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBFeHRyYWN0IGFsbCB0aGUgcm9sZXMgdGhhdCBhcmUgYXNzaWduZWQgdG8gdGhpcyBlbGVtZW50LCBjYW4gaGF2ZSBtdWx0aXBsZSByb2xlcyBvbiBvbmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVsZW1lbnQgc3BsaXQgYnkgc3BhY2UsIHNvIHdlIG5lZWQgdG8gZXh0cmFjdCBhbGwgb2YgdGhlbSBpbnRvIGFuIGFycmF5LlxuICAgICAgICAgICAgICAgICAgICAgICAgd1JvbGVzID0gbncuZWxlbSgpLmdldEF0dHJpYnV0ZShcInJvbGVcIikuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKG53LmVsZW0oKSAmJiB3Um9sZXMubGVuZ3RoID09PSAwICYmIGNvbnNpZGVySW1wbGljaXRSb2xlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9jaGVjayBpZiB0aGVyZSBhcmUgYW55IGltcGxpY2l0IHJvbGVzIGZvciB0aGlzIGVsZW1lbnQuXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW1wbGljaXRSb2xlID0gQXJpYVV0aWwuZ2V0SW1wbGljaXRSb2xlKG53Lm5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGltcGxpY2l0Um9sZSAhPT0gbnVsbCAmJiBpbXBsaWNpdFJvbGUubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3Um9sZXMgPSBpbXBsaWNpdFJvbGU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAod1JvbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBGb2xsb3dpbmcgYXJlIHRoZSBzdGVwcyB0aGF0IGFyZSBleGVjdXRlZCBhdCB0aGlzIHN0YWdlIHRvIGRldGVybWluZSBpZiB0aGUgbm9kZSBzaG91bGQgYmUgY2xhc3NpZmllZCBhcyBoaWRkZW5cbiAgICAgICAgICAgICAgICAgICAgLy8gb3Igbm90LlxuICAgICAgICAgICAgICAgICAgICAvLyAgMS4gSWYgY29uc2lkZXJIaWRkZW5TZXR0aW5nIG9wdGlvbiBpcyBzZXQgdG8gdHJ1ZSB0aGVuIHdlIHBlcmZvcm0gdGhlIGNoZWNrIHRvIGNvbnNpZGVyIHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgQ2hlY2sgSGlkZGVuIENvbnRlbnQgdGhhdCBpcyBwcm92aWRlZC5cbiAgICAgICAgICAgICAgICAgICAgLy8gIDIuIE9ubHkgcnVuIGlzTm9kZVZpc2libGUgY2hlY2sgaWYgaGlkZGVuIGNvbnRlbnQgc2hvdWxkIE5PVCBiZSBjaGVja2VkLiBJbiB0aGUgY2FzZSB0aGF0IGhpZGRlbiBjb250ZW50IGlzIHRvLFxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgYmUgc2Nhbm5lZCB0aGVuIHdlIGNhbiBqdXN0IHNjYW4gZXZlcnl0aGluZyBhcyBub3JtYWwuIEluIHRoZSBjYXNlIHRoYXQgdGhlIGN1cnJlbnQgbm9kZSBpcyBoaWRkZW4gd2UgZG8gbm90XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBhZGQgaXQgdG8gdGhlIHJvbGVUb0VsZW1zIGhhc2ggYXQgYWxsIG9yIGV2ZW4gZG8gYW55IGNoZWNraW5nIGZvciBpdCBhdCBhbGwuXG4gICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgIC8vIE5vdGU6IFRoZSBpZiBjb25kaXRpb25zIHVzZXMgc2hvcnQtY2lyY3VpdGluZyBzbyBpZiB0aGUgZmlyc3QgY29uZGl0aW9uIGlzIG5vdCB0cnVlIGl0IHdpbGwgbm90IGNoZWNrIHRoZSBuZXh0IG9uZSxcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgc28gb24gYW5kIHNvIGZvcnRoLlxuICAgICAgICAgICAgICAgICAgICBpZiAoY29uc2lkZXJIaWRkZW5TZXR0aW5nICYmIENvbW1vblV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbihudy5ub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBMb29wIHRocm91Z2ggYWxsIHRoZSByb2xlcyBhbmQgYXNzaWduZWQgdGhpcyBub2RlIHRvIGFsbCB0aGVzIHJvbGVzXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgd1JvbGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IHRoZSByb2xlIGtleSBpcyBub3QgYWxyZWFkeSBpbiB0aGUgcm9sZVRvRWxlbXMgaGFzaCwgY29uc3RydWN0IHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkIHRoZSBrZXkgYW5kIGFzc2lnbiBlbXB0eSBhcnJheS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHdSb2xlc1tpXSBpbiByb2xlVG9FbGVtcykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlVG9FbGVtc1t3Um9sZXNbaV1dID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgbm9kZSB0byB0aGUgYXJyYXkgZm9yIHRoZSByb2xlXG4gICAgICAgICAgICAgICAgICAgICAgICByb2xlVG9FbGVtc1t3Um9sZXNbaV1dLnB1c2gobncubm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFNldCB0aGUgcm9sZVRvRWxlbXMgaGFzaCBtYXAgYXMgYSBnbG9iYWwgdmFyaWFibGVcbiAgICAgICAgICAgIGlmIChjb25zaWRlckltcGxpY2l0Um9sZXMpIHtcbiAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZG9jLCBcIkFyaWFVdGlsX0dFVEVMRU1FTlRTQllfUk9MRV9JTVBMSUNJVFwiLCByb2xlVG9FbGVtcyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShkb2MsIFwiQXJpYVV0aWxfR0VURUxFTUVOVFNCWV9ST0xFXCIsIHJvbGVUb0VsZW1zKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW5pdGlsaXplIHRoZSByZXR1cm4gdmFsdWVcbiAgICAgICAgbGV0IHJldFZhbCA9IFtdO1xuXG4gICAgICAgIC8vIEhhbmRsZSB0aGUgY2FzZXMgd2hlcmUgdGhlIHByb3ZpZGVkIHJvbGUgaXMgYSBzdHJpbmcgYW5kIG5vdCBhbiBhcnJheSxcbiAgICAgICAgLy8gZm9yIHRoaXMgY2FzZSB3ZSB0YWtlIHRoZSBzdHJpbmcgYW5kIHB1dCBpdCBpbnRvIGFuIGFycmF5XG4gICAgICAgIGlmICh0eXBlb2YgKHJvbGVzKSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgbGV0IHJvbGUgPSByb2xlcztcbiAgICAgICAgICAgIHJvbGVzID0gW107XG4gICAgICAgICAgICByb2xlcy5wdXNoKHJvbGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTG9vcCB0aHJvdWdoIHRoZSByb2xlcyB0aGF0IHdlcmUgcHJvdmlkZWQgYW5kIGZpbmQgdGhlIGxpc3Qgb2YgZWxlbWVudHMgZm9yIHRoaXMgcm9sZXNcbiAgICAgICAgLy8gYW5kIGFkZCB0aGVtIHRvIHRoZSByZXR1cm4gdmFsdWUuXG4gICAgICAgIGlmIChyb2xlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIC8vIGxvb3Agb3ZlciBhbGwgdGhlIHJvbGVzXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJvbGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgLy8gRXh0cmFjdCB0aGUgcm9sZSBmcm9tIHRoZSBhcnJheVxuICAgICAgICAgICAgICAgIGxldCBuZXh0Um9sZSA9IHJvbGVzW2ldO1xuICAgICAgICAgICAgICAgIC8vIEZldGNoIHRoZSBsaXN0IG9mIGFsbCB0aGUgZWxlbWVudHMgZm9yIHRoaXMgcm9sZVxuICAgICAgICAgICAgICAgIGxldCBjb3B5Um9sZXMgPSByb2xlVG9FbGVtc1tuZXh0Um9sZV07XG5cbiAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSBhcmUgZWxlbWVudHMgdG8gY29weSB0byBhbm90aGVyIGFycmF5LCB0aGVuIHBlcmZvcm0gdGhlIGNvcHlcbiAgICAgICAgICAgICAgICBpZiAoY29weVJvbGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIExvb3Agb3ZlciBhbGwgdGhlIGVsZW1lbnRzIHdoaWNoIGFyZSB0byBiZSBjb3BpZWRcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjb3B5Um9sZXMubGVuZ3RoOyArK2opIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFkZCB0aGlzIGVsZW1lbnQgdG8gdGhlIHJldHVybiB2YWxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5wdXNoKGNvcHlSb2xlc1tqXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAgICAgKiBhIHRhcmdldCBpcyBlbiBlbGVtZW50IHRoYXQgYWNjZXB0IGEgcG9pbnRlciBhY3Rpb24gKGNsaWNrIG9yIHRvdWNoKVxuICAgICAgICAgKiBcbiAgICAgICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpc1RhcmdldChlbGVtZW50KSB7IFxuICAgICAgICBpZiAoIWVsZW1lbnQgfHwgZWxlbWVudC5ub2RlVHlwZSAhPT0gMSBcbiAgICAgICAgICAgIHx8IFtcImh0bWxcIiwgXCJib2R5XCJdLmluY2x1ZGVzKGVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSlcbiAgICAgICAgICAgIHx8IENvbW1vblV0aWwuZ2V0QW5jZXN0b3IoZWxlbWVudCwgW1wic3ZnXCIsIFwicHJlXCIsIFwiY29kZVwiLCBcInNjcmlwdFwiLCBcIm1ldGFcIiwgJ2hlYWQnXSkgIT09IG51bGwgXG4gICAgICAgICAgICB8fCAhVmlzVXRpbC5pc05vZGVWaXNpYmxlKGVsZW1lbnQpIHx8IFZpc1V0aWwuaXNOb2RlVmlzdWFsbHlIaWRkZW4oZWxlbWVudCkgXG4gICAgICAgICAgICB8fCBDb21tb25VdGlsLmlzTm9kZURpc2FibGVkKGVsZW1lbnQpIHx8IFZpc1V0aWwuaXNFbGVtZW50T2Zmc2NyZWVuKGVsZW1lbnQpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBcbiAgICAgICAgaWYgKENvbW1vblV0aWwuaXNDbGlja2FibGUoZWxlbWVudCkpIFxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAgICAgY29uc3Qgcm9sZSA9IEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZShlbGVtZW50KTtcbiAgICAgICAgaWYgKCFyb2xlKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgY29uc3QgdGFyZ2V0X3JvbGVzID0gW1wibGlzdGl0ZW1cIiwgXCJtZW51aXRlbVwiLCBcIm1lbnVpdGVtY2hlY2tib3hcIiwgXCJtZW51aXRlbXJhZGlvXCIsIFwib3B0aW9uXCIsIFwicmFkaW9cIiwgXCJzd2l0Y2hcIiwgXCJ0cmVlaXRlbVwiXTtcbiAgICAgICAgaWYgKHRhcmdldF9yb2xlcy5pbmNsdWRlcyhyb2xlKSkge1xuICAgICAgICAgICAgLy8gZmluZCB0aGUgcHJvcGVyIHBhcmVudCBlbGVtZW50c1xuICAgICAgICAgICAgbGV0IHBhcmVudCA9IGVsZW1lbnQucGFyZW50RWxlbWVudDtcbiAgICAgICAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRfcm9sZSA9IEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZShwYXJlbnQpO1xuICAgICAgICAgICAgICAgIC8vIGRhdGFsaXN0LCBmaWVsZHNldCwgb3B0Z3JvdXAsIGV0Yy4gbWF5IGJlIGp1c3QgdXNlZCBmb3IgZ3JvdXBpbmcgcHVycG9zZSwgc28gZ28gdXAgdG8gdGhlIHBhcmVudFxuICAgICAgICAgICAgICAgIGlmIChwYXJlbnRfcm9sZSA9PT0gJ2dyb3VwJylcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudEVsZW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChwYXJlbnQgJiYgQ29tbW9uVXRpbC5pc1RhcmdldChwYXJlbnQpKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9ICAgIFxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRGaWxlRXh0KHVybCkge1xuICAgICAgICBsZXQgbSA9IHVybC5tYXRjaCgvXFwuKChbXjs/I1xcLl18XiQpKykoWzs/I118JCkvKTtcbiAgICAgICAgaWYgKG0gIT0gbnVsbCAmJiBtLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgICAgICByZXR1cm4gXCIuXCIgKyBtWzFdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGdldEZpbGVBbmNob3IodXJsKSB7XG4gICAgICAgIGxldCBtID0gdXJsLm1hdGNoKC8jKChbXjs/XFwuXXxeJCkrKShbOz9dfCQpLyk7XG4gICAgICAgIGlmIChtICE9IG51bGwgJiYgbS5sZW5ndGggPj0gMikge1xuICAgICAgICAgICAgcmV0dXJuIG1bMV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgY2hlY2tPYmpFbWJlZChub2RlLCBleHRUZXN0LCBtaW1lVGVzdCkge1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgaWYgKG5vZGVOYW1lICE9IFwib2JqZWN0XCIgJiYgbm9kZU5hbWUgIT0gXCJlbWJlZFwiICYmXG4gICAgICAgICAgICBub2RlTmFtZSAhPSBcImFcIiAmJiBub2RlTmFtZSAhPSBcImFyZWFcIikgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsZXQgcmV0VmFsID0gZmFsc2U7XG4gICAgICAgIC8vIENoZWNrIG1pbWUgdHlwZVxuICAgICAgICBpZiAoIXJldFZhbCAmJiBub2RlLmhhc0F0dHJpYnV0ZShcInR5cGVcIikpIHtcbiAgICAgICAgICAgIGxldCBtaW1lID0gbm9kZS5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICByZXRWYWwgPSBtaW1lVGVzdChtaW1lKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJldFZhbCAmJiBub2RlLmhhc0F0dHJpYnV0ZShcImNvZGV0eXBlXCIpKSB7XG4gICAgICAgICAgICBsZXQgbWltZSA9IG5vZGUuZ2V0QXR0cmlidXRlKFwiY29kZXR5cGVcIik7XG4gICAgICAgICAgICByZXRWYWwgPSBtaW1lVGVzdChtaW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIHRoZSBmaWxlbmFtZVxuICAgICAgICBpZiAoIXJldFZhbCkge1xuICAgICAgICAgICAgbGV0IGZpbGVuYW1lID0gXCJcIjtcbiAgICAgICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJlbWJlZFwiKSB7XG4gICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBub2RlLmdldEF0dHJpYnV0ZShcInNyY1wiKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobm9kZU5hbWUgPT09IFwiYVwiIHx8IG5vZGVOYW1lID09PSBcImFyZWFcIikge1xuICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gbm9kZS5nZXRBdHRyaWJ1dGUoXCJocmVmXCIpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChub2RlLmhhc0F0dHJpYnV0ZShcImRhdGFcIikpIHtcbiAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IG5vZGUuZ2V0QXR0cmlidXRlKFwiZGF0YVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmaWxlbmFtZSA9PT0gbnVsbCkgZmlsZW5hbWUgPSBcIlwiO1xuICAgICAgICAgICAgbGV0IGV4dCA9IENvbW1vblV0aWwuZ2V0RmlsZUV4dChmaWxlbmFtZSk7XG4gICAgICAgICAgICByZXRWYWwgPSBleHRUZXN0KGV4dCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBmb3IgZmlsZW5hbWVzIGluIHRoZSBwYXJhbXNcbiAgICAgICAgaWYgKCFyZXRWYWwgJiYgbm9kZU5hbWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIC8vIEluIHRoZSBjYXNlIHRoYXQgQ2hlY2sgSGlkZGVuIE9wdGlvbiBpcyBzZXQgdGhlbiBjb21wbHkgd2l0aCB0aGF0IHNldHRpbmdcbiAgICAgICAgICAgIGxldCBwYXJhbXMgPSBDb21tb25VdGlsLmdldENoaWxkQnlUYWdIaWRkZW4obm9kZSwgXCJwYXJhbVwiLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgIXJldFZhbCAmJiBwYXJhbXMgIT0gbnVsbCAmJiBpIDwgcGFyYW1zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgcmV0VmFsID0gcGFyYW1zW2ldLmhhc0F0dHJpYnV0ZShcInZhbHVlXCIpICYmXG4gICAgICAgICAgICAgICAgICAgIGV4dFRlc3QoQ29tbW9uVXRpbC5nZXRGaWxlRXh0KHBhcmFtc1tpXS5nZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgaXNBdWRpb09iakVtYmVkTGluayhub2RlKSB7XG4gICAgICAgIHJldHVybiBDb21tb25VdGlsLmNoZWNrT2JqRW1iZWQobm9kZSwgQ29tbW9uVXRpbC5pc0F1ZGlvRXh0LCBmdW5jdGlvbiAobWltZSkge1xuICAgICAgICAgICAgcmV0dXJuIG1pbWUuc3RhcnRzV2l0aChcImF1ZGlvXCIpXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGlzQXVkaW9FeHQoZXh0KSB7XG4gICAgICAgIGxldCBhdWRpb19leHRlbnNpb25zID0gW1wiLmFpZlwiLCBcIi5haWZjXCIsIFwiLmFpZmZcIiwgXCIuYWlyXCIsIFwiLmFzZlwiLCBcIi5hdVwiLCBcIi5jZGFcIixcbiAgICAgICAgICAgIFwiLmRzbVwiLCBcIi5kc3NcIiwgXCIuZHdkXCIsIFwiLmlmZlwiLCBcIi5rYXJcIiwgXCIubTFhXCIsIFwiLm1lZFwiLFxuICAgICAgICAgICAgXCIubXAyXCIsIFwiLm1wM1wiLCBcIi5tcGFcIiwgXCIucGNtXCIsIFwiLnJhXCIsIFwiLnJhbVwiLCBcIi5ybVwiLFxuICAgICAgICAgICAgXCIuc2FtXCIsIFwiLnNmXCIsIFwiLnNmMlwiLCBcIi5zbXBcIiwgXCIuc25kXCIsIFwiLnN2eFwiLCBcIi51bFwiLFxuICAgICAgICAgICAgXCIudm9jXCIsIFwiLndhdlwiLCBcIi53bWFcIiwgXCIud3ZlXCJcbiAgICAgICAgXTtcbiAgICAgICAgcmV0dXJuIENvbW1vblV0aWwudmFsSW5BcnJheShleHQudG9Mb3dlckNhc2UoKSwgYXVkaW9fZXh0ZW5zaW9ucyk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgaXNWaWRlb09iakVtYmVkTGluayhub2RlKSB7XG4gICAgICAgIHJldHVybiBDb21tb25VdGlsLmNoZWNrT2JqRW1iZWQobm9kZSwgQ29tbW9uVXRpbC5pc1ZpZGVvRXh0LCBmdW5jdGlvbiAobWltZSkge1xuICAgICAgICAgICAgcmV0dXJuIG1pbWUuc3RhcnRzV2l0aChcInZpZGVvXCIpIHx8XG4gICAgICAgICAgICAgICAgbWltZS5zdGFydHNXaXRoKFwiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2hcIik7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGlzVmlkZW9FeHQoZXh0KSB7XG4gICAgICAgIGxldCB2aWRlb19leHRlbnNpb25zID0gW1wiLmFzZlwiLCBcIi5hdmlcIiwgXCIuZGl2eFwiLCBcIi5kdlwiLCBcIi5tMXZcIiwgXCIubTJwXCIsIFwiLm0ydlwiLCBcIi5tb292XCIsXG4gICAgICAgICAgICBcIi5tb3ZcIiwgXCIubXA0XCIsIFwiLm1wZWdcIiwgXCIubXBnXCIsIFwiLm1wdlwiLCBcIi5vZ21cIiwgXCIub21mXCIsIFwiLnF0XCIsXG4gICAgICAgICAgICBcIi5ybVwiLCBcIi5ydlwiLCBcIi5zbWlcIiwgXCIuc21pbFwiLCBcIi5zd2ZcIiwgXCIudm9iXCIsIFwiLndtdlwiLCBcIi5ybXZiXCIsXG4gICAgICAgICAgICBcIi5tdmJcIlxuICAgICAgICBdO1xuICAgICAgICByZXR1cm4gQ29tbW9uVXRpbC52YWxJbkFycmF5KGV4dC50b0xvd2VyQ2FzZSgpLCB2aWRlb19leHRlbnNpb25zKTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBpc0ltYWdlT2JqRW1iZWRMaW5rKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIENvbW1vblV0aWwuY2hlY2tPYmpFbWJlZChub2RlLCBDb21tb25VdGlsLmlzSW1nRXh0LCBmdW5jdGlvbiAobWltZSkge1xuICAgICAgICAgICAgcmV0dXJuIG1pbWUuc3RhcnRzV2l0aChcImltYWdlXCIpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGltYWdlX2V4dGVuc2lvbnMgPSBbXCIuYm1wXCIsIFwiLmdpZlwiLCBcIi5qcGdcIiwgXCIuanBlZ1wiLCBcIi5wY3hcIiwgXCIucG5nXCJdO1xuICAgICAgICBcbiAgICBwdWJsaWMgc3RhdGljIGlzSW1nRXh0KGV4dCkge1xuICAgICAgICByZXR1cm4gQ29tbW9uVXRpbC52YWxJbkFycmF5KGV4dC50b0xvd2VyQ2FzZSgpLCBDb21tb25VdGlsLmltYWdlX2V4dGVuc2lvbnMpO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGlzSHRtbEV4dChleHQpIHtcbiAgICAgICAgbGV0IGh0bWxfZXh0ZW5zaW9ucyA9IFtcIi5hc3BcIiwgXCIuYXNweFwiLCBcIi5jZm1cIiwgXCIuY2ZtbFwiLCBcIi5jZ2lcIiwgXCIuaHRtXCIsIFwiLmh0bWxcIiwgXCIuc2h0bVwiLFxuICAgICAgICAgICAgXCIuc2h0bWxcIiwgXCIucGhwXCIsIFwiLnBsXCIsIFwiLnB5XCIsIFwiLnNodG1cIiwgXCIuc2h0bWxcIiwgXCIueGh0bWxcIlxuICAgICAgICBdO1xuICAgICAgICByZXR1cm4gQ29tbW9uVXRpbC52YWxJbkFycmF5KGV4dC50b0xvd2VyQ2FzZSgpLCBodG1sX2V4dGVuc2lvbnMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaGFzVHJpZ2dlcmVkKGRvYywgaWQpIHtcbiAgICAgICAgcmV0dXJuIENhY2hlVXRpbC5nZXRDYWNoZShkb2MsIGlkLCBmYWxzZSk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgdHJpZ2dlck9uY2UoZG9jLCBpZCwgcGFzc2VkKSB7XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiB0cnVlO1xuICAgICAgICBsZXQgdHJpZ2dlcmVkID0gQ2FjaGVVdGlsLmdldENhY2hlKGRvYywgaWQsIGZhbHNlKTtcbiAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGRvYywgaWQsIHRydWUpO1xuICAgICAgICByZXR1cm4gdHJpZ2dlcmVkO1xuICAgIH1cblxuICAgIC8qIGRldGVybWluZSBpZiB0aGUgZ2l2ZW4gdmFsdWUgZXhpc3RzIGluIHRoZSBnaXZlbiBhcnJheSAqL1xuICAgIHB1YmxpYyBzdGF0aWMgdmFsSW5BcnJheSh2YWx1ZSwgYXJyKSB7XG4gICAgICAgIGZvciAobGV0IGlkeCBpbiBhcnIpIHtcbiAgICAgICAgICAgIGlmIChhcnJbaWR4XSA9PT0gdmFsdWUpIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiByZXR1cm4gdGhlIGFuY2VzdG9yIG9mIHRoZSBnaXZlbiBlbGVtZW50XG4gICAgICogQHBhcmFtIHRhZ05hbWVzIHN0cmluZywgYXJyYXksIG9yIGRpY3Rpb25hcnkgY29udGFpbmluZyB0aGUgdGFncyB0byBzZWFyY2ggZm9yXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRBbmNlc3RvcihlbGVtZW50LCB0YWdOYW1lcykge1xuICAgICAgICBsZXQgd2Fsa05vZGUgPSBlbGVtZW50O1xuICAgICAgICB3aGlsZSAod2Fsa05vZGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGxldCB0aGlzVGFnID0gd2Fsa05vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgKHRhZ05hbWVzKSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzVGFnID09PSB0YWdOYW1lcy50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGFnTmFtZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaWR4IGluIHRhZ05hbWVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWdOYW1lc1tpZHhdID09PSB0aGlzVGFnKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdhbGtOb2RlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpc1RhZyBpbiB0YWdOYW1lcykge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2Fsa05vZGUgPSBET01XYWxrZXIucGFyZW50Tm9kZSh3YWxrTm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdhbGtOb2RlO1xuICAgIH1cblxuICAgIC8vIHJldHVybiB0cnVlIGlmIGVsZW1lbnQxIGFuZCBlbGVtZW50MiBhcmUgc2libGluZ3NcbiAgICBwdWJsaWMgc3RhdGljIGlzU2libGluZyhlbGVtZW50MSwgZWxlbWVudDIpIHtcbiAgICAgICAgaWYgKGVsZW1lbnQxICYmIGVsZW1lbnQyKSB7XG4gICAgICAgICAgICBsZXQgbm9kZSA9IG51bGw7XG4gICAgICAgICAgICBpZiAoRE9NV2Fsa2VyLnBhcmVudE5vZGUoZWxlbWVudDEpICYmIERPTVdhbGtlci5wYXJlbnROb2RlKGVsZW1lbnQxKS5maXJzdENoaWxkKSB7XG4gICAgICAgICAgICAgICAgbm9kZSA9IERPTVdhbGtlci5wYXJlbnROb2RlKGVsZW1lbnQxKS5maXJzdENoaWxkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB3aGlsZSAobm9kZSkge1xuICAgICAgICAgICAgICAgIGlmIChub2RlID09PSBlbGVtZW50MikgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaXNEZXNjZW5kYW50KHBhcmVudCwgY2hpbGQpIHtcbiAgICAgICAgbGV0IG5vZGUgPSBET01XYWxrZXIucGFyZW50Tm9kZShjaGlsZCk7XG4gICAgICAgIHdoaWxlIChub2RlICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChub2RlID09PSBwYXJlbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5vZGUgPSBET01XYWxrZXIucGFyZW50Tm9kZShub2RlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy9jaGVjayBpZiB0aGUgZmlyc3QgZm9ybSBjb250cm9sIGNoaWxkIGlzIGRpc2FibGVkXG4gICAgcHVibGljIHN0YXRpYyBpc0Rpc2FibGVkQnlGaXJzdENoaWxkRm9ybUVsZW1lbnQoZWxlbWVudCkge1xuICAgICAgICBsZXQgZm9ybUVsZW1lbnRzID0gW1wiaW5wdXRcIiwgXCJ0ZXh0YXJlYVwiLCBcInNlbGVjdFwiLCBcImtleWdlblwiLCBcInByb2dyZXNzXCIsIFwibWV0ZXJcIiwgXCJvdXRwdXRcIl07XG4gICAgICAgIGlmIChlbGVtZW50LmZpcnN0Q2hpbGQgIT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IG53ID0gbmV3IERPTVdhbGtlcihlbGVtZW50KTtcbiAgICAgICAgICAgIHdoaWxlIChudy5uZXh0Tm9kZSgpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGZvcm1FbGVtZW50cy5pbmNsdWRlcyhudy5ub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChDb21tb25VdGlsLmlzTm9kZURpc2FibGVkKG53Lm5vZGUpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaXNEaXNhYmxlZEJ5UmVmZXJyaW5nRWxlbWVudChlbGVtZW50KSB7XG4gICAgICAgIGxldCBpZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiaWRcIik7XG4gICAgICAgIGxldCBkb2MgPSBlbGVtZW50Lm93bmVyRG9jdW1lbnQ7XG4gICAgICAgIGxldCByb290ID0gZG9jLmJvZHk7XG4gICAgICAgIHdoaWxlIChET01XYWxrZXIucGFyZW50Tm9kZShyb290KSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gR2V0IHRoZSBwYXJlbnROb2RlXG4gICAgICAgICAgICByb290ID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUocm9vdCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG53ID0gbmV3IERPTVdhbGtlcihyb290KTtcbiAgICAgICAgd2hpbGUgKG53Lm5leHROb2RlKCkpIHtcbiAgICAgICAgICAgIC8vIGNoZWNrIHRoZSBlbGVtZW50IHdob3NlICdhcmlhLWRlc2NyaWJlZGJ5JyBlcXVhbHMgdG8gdGhlIGlkXG4gICAgICAgICAgICBpZiAobncubm9kZSAmJiBudy5ub2RlLm5vZGVUeXBlID09PSAxICYmIG53LmVsZW0oKSkge1xuICAgICAgICAgICAgICAgIGxldCBBcmlhRGVzY3JpYmVkYnlJREFycmF5ID0gKG53LmVsZW0oKS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWRlc2NyaWJlZGJ5XCIpIHx8IFwiXCIpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgICAgICBpZiAoQXJpYURlc2NyaWJlZGJ5SURBcnJheS5pbmNsdWRlcyhpZCkgJiYgQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChudy5ub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBnZXQgZWxlbWVudCBjb250YWluaW5nIGxhYmVsIGZvciB0aGUgZ2l2ZW4gZWxlbWVudFxuICAgICAgICAgKiBAZGVwcmVjYXRlZCBEZXByZWNhdGVkIGJlY2F1c2UgdGhlIGZ1bmN0aW9uIG5hbWUgaXMgbWlzbGVhZGluZy4gVXNlIGdldExhYmVsRm9yRWxlbWVudChlbGVtZW50KSBpbnN0ZWFkXG4gICAgICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SW5wdXRMYWJlbChlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBDb21tb25VdGlsLmdldExhYmVsRm9yRWxlbWVudChlbGVtZW50KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBnZXR0aW5nIHRoZSBlbGVtZW50IGNvbnRhaW5pbmcgdGhlIGxhYmVsIGZvciB0aGUgZ2l2ZW4gZWxlbWVudC5cbiAgICAgKlxuICAgICAqIE5vdGU6IFRoaXMgaXMgYSB3cmFwcGVyIGZ1bmN0aW9uIHRvOiBBcmlhVXRpbC5nZXRMYWJlbEZvckVsZW1lbnRIaWRkZW5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBlbGVtZW50IC0gVGhlIGVsZW1lbnQgZm9yIHdoaWNoIHRvIGdldCB0aGUgbGFiZWwgZWxlbWVudCBmb3IuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtlbGVtZW50fSBlbGVtZW50IC0gcmV0dXJuIHRoZSBlbGVtZW50IGZvciB0aGUgbGFiZWwsIG90aGVyd2lzZSBudWxsXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldExhYmVsRm9yRWxlbWVudChlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBDb21tb25VdGlsLmdldExhYmVsRm9yRWxlbWVudEhpZGRlbihlbGVtZW50LCBmYWxzZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZ2V0dGluZyB0aGUgZWxlbWVudCBjb250YWluaW5nIHRoZSBsYWJlbCBmb3IgdGhlIGdpdmVuIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIG51bGwgaWYgdGhlIGNvbnRhaW5pbmcgbGFibGUgZWxlbWVudCBpcyBoaWRkZW4sIHdoZW4gdGhlIGlnbm9yZUhpZGRlbiBvcHRpb25cbiAgICAgKiBpcyBzZXQgdG8gdHJ1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBlbGVtZW50IC0gVGhlIGVsZW1lbnQgZm9yIHdoaWNoIHRvIGdldCB0aGUgbGFiZWwgZWxlbWVudCBmb3IuXG4gICAgICogQHBhcm0ge2Jvb2xlYW59IGlnbm9yZUhpZGRlbiAtIHRydWUgaWYgaGlkZGVuIGVsZW1lbnRzIHdpdGggbGFiZWwgc2hvdWxkIGJlIGlnbm9yZWQgZnJvbSB0aGUgbGlzdFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSBpZiB0aGUgaGlkZGVuIGVsZW1lbnRzIHNob3VsZCBiZSBhZGRlZFxuICAgICAqXG4gICAgICogQHJldHVybiB7ZWxlbWVudH0gZWxlbWVudCAtIHJldHVybiB0aGUgZWxlbWVudCBmb3IgdGhlIGxhYmVsLCBvdGhlcndpc2UgbnVsbFxuICAgICAqXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRMYWJlbEZvckVsZW1lbnRIaWRkZW4oZWxlbWVudDogRWxlbWVudCwgaWdub3JlSGlkZGVuKSB7XG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBnbG9iYWwgQXJpYVV0aWxfTEFCRUxTIGhhc2ggaXMgYXZhaWxhYmxlLCBhcyB0aGlzIHdpbGwgY29udGFpbiB0aGUgbGFiZWwgbm9kZXMgYmFzZWQgb25cbiAgICAgICAgLy8gZm9yIGF0dHJpYnV0ZS5cbiAgICAgICAgLy9pZiAoIWdldENhY2hlKGVsZW1lbnQub3duZXJEb2N1bWVudCxcIkFyaWFVdGlsX0xBQkVMU1wiLCBudWxsKSkge1xuICAgICAgICBsZXQgcm9vdCA9IGVsZW1lbnQuZ2V0Um9vdE5vZGUoKTtcbiAgICAgICAgaWYgKCFDYWNoZVV0aWwuZ2V0Q2FjaGUoKHJvb3Qubm9kZVR5cGUgPT09IDExKSA/IDxTaGFkb3dSb290PnJvb3QgOiA8RG9jdW1lbnQ+cm9vdCwgXCJBcmlhVXRpbF9MQUJFTFNcIiwgbnVsbCkpIHtcbiAgICAgICAgICAgIC8vIFZhcmlhYmxlIERlY2xlcmF0aW9uXG4gICAgICAgICAgICBsZXQgaWRUb0xhYmVsID0ge31cblxuICAgICAgICAgICAgLy8gR2V0IGFsbCB0aGUgbGFiZWwgZWxlbWVudHMgaW4gdGhlIGVudGlyZSBkb2NcbiAgICAgICAgICAgIGxldCBsYWJlbE5vZGVzID0gQ29tbW9uVXRpbC5nZXREb2NFbGVtZW50c0J5VGFnKGVsZW1lbnQsIFwibGFiZWxcIik7XG4gICAgICAgICAgICAvLyBMb29wIG92ZXIgYWxsIHRoZSBsYWJlbCBub2RlcywgaW4gdGhlIGNhc2UgdGhlIGxhYmVsIG5vZGUgaGFzIGEgZm9yIGF0dHJpYnV0ZSxcbiAgICAgICAgICAgIC8vIGV4dHJhY3QgdGhhdCBhdHRyaWJ1dGUgYW5kIGFkZCB0aGlzIG5vZGUgdG8gdGhlIGhhc2ggaWYgaXQgaXMgdmlzaWJsZS5cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGFiZWxOb2Rlcy5sZW5ndGg7ICsraSkge1xuXG4gICAgICAgICAgICAgICAgaWYgKGxhYmVsTm9kZXNbaV0uaGFzQXR0cmlidXRlKFwiZm9yXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIGlnbm9yZSBoaWRkZW4gaXMgc3BlY2lmaWVkIGFuZCB0aGUgbm9kZSBpcyBub3QgdmlzaWJsZSB3ZSBkbyBub3QgYWRkIGl0IHRvIHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyBsYWJlbE5vZGVzIGhhc2guXG4gICAgICAgICAgICAgICAgICAgIGlmIChpZ25vcmVIaWRkZW4gJiYgIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShsYWJlbE5vZGVzW2ldKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZFRvTGFiZWxbbGFiZWxOb2Rlc1tpXS5nZXRBdHRyaWJ1dGUoXCJmb3JcIildID0gbGFiZWxOb2Rlc1tpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEFkZCB0aGUgYnVpbHQgaGFzaCB0byB0aGUgb3duZXJEb2N1bWVudCAoZG9jdW1lbnQpLCB0byBiZSB1c2VkIGxhdGVyIHRvIGZhc3QgcmV0cml2YWxcbiAgICAgICAgICAgIC8vc2V0Q2FjaGUoZWxlbWVudC5vd25lckRvY3VtZW50LCBcIkFyaWFVdGlsX0xBQkVMU1wiLCBpZFRvTGFiZWwpO1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKChyb290Lm5vZGVUeXBlID09PSAxMSkgPyA8U2hhZG93Um9vdD5yb290IDogPERvY3VtZW50PnJvb3QsIFwiQXJpYVV0aWxfTEFCRUxTXCIsIGlkVG9MYWJlbCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiB0aGlzIGVsZW1lbnQgaGFzIGFuIGlkIGF0dHJpYnV0ZSwgZ2V0IHRoZSBjb3Jvc3BvbmRpbmcgbGFiZWwgZWxlbWVudFxuICAgICAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJpZFwiKSkge1xuICAgICAgICAgICAgLy8gRmV0Y2ggdGhlIGlkIGF0dHJpYnV0ZVxuICAgICAgICAgICAgbGV0IGN0cmxJZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiaWRcIik7XG4gICAgICAgICAgICAvLyBSZXR1cm4gdGhlIGNvcm9zcG9uZGluZyBsYWJlbCBlbGVtZW50LlxuICAgICAgICAgICAgLy8gTm90ZTogaW4gdGhlIGNhc2UgdGhhdCB0aGUgdGhlIGlkIGlzIG5vdCBmb3VuZCBpbiB0aGUgaGFzaCB0aGF0IG1lYW5zLCBpdCBkb2VzIG5vdCBleGlzdHMgb3IgaXMgaGlkZGVuXG4gICAgICAgICAgICBpZiAoY3RybElkLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgLy9yZXR1cm4gZ2V0Q2FjaGUoZWxlbWVudC5nZXRSb290Tm9kZSgpLm93bmVyRG9jdW1lbnQsXCJBcmlhVXRpbF9MQUJFTFNcIix7fSlbY3RybElkXTtcbiAgICAgICAgICAgICAgICByZXR1cm4gQ2FjaGVVdGlsLmdldENhY2hlKChyb290Lm5vZGVUeXBlID09PSAxMSkgPyA8U2hhZG93Um9vdD5yb290IDogPERvY3VtZW50PnJvb3QsIFwiQXJpYVV0aWxfTEFCRUxTXCIsIHt9KVtjdHJsSWRdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qIFJldHVybiBzcGVjaWZpZWQgZWxlbWVudCBhdHRyaWJ1dGUgaWYgcHJlc2VudCBlbHNlIHJldHVybiBudWxsICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRFbGVtZW50QXR0cmlidXRlKGVsZW1lbnQsIGF0dHIpIHtcbiAgICAgICAgLy9yZXR1cm4gKGVsZW1lbnQgJiYgZWxlbWVudC5oYXNBdHRyaWJ1dGUgJiYgZWxlbWVudC5oYXNBdHRyaWJ1dGUoYXR0cikpID8gZWxlbWVudC5nZXRBdHRyaWJ1dGUoYXR0cikgOiBudWxsO1xuICAgICAgICBpZiAoIWF0dHIgfHwgIWVsZW1lbnQgfHwgIWVsZW1lbnQuaGFzQXR0cmlidXRlIHx8ICFlbGVtZW50Lmhhc0F0dHJpYnV0ZShhdHRyKSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGNvbnN0IGF0clZhbHVlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoYXR0cilcbiAgICAgICAgaWYgKCFBUklBRGVmaW5pdGlvbnMucmVmZXJlbmNlUHJvcGVydGllcy5pbmNsdWRlcyhhdHRyKSlcbiAgICAgICAgICAgIHJldHVybiBhdHJWYWx1ZTtcblxuICAgICAgICAvL2F0dHIgaXMgYSByZWZlcmVuY2UgdG8gb3RoZXIgZWxlbWVudHMocylcbiAgICAgICAgY29uc3QgdmFsdWVzID0gYXRyVmFsdWUuc3BsaXQoLyArL2cpO1xuICAgICAgICAvL2lnbm9yZSBpZiBub25lIG9mIHRoZSByZWZlcnJlZCBlbGVtZW50KHMpIGV4aXN0IG9yIGFsbCBwb2ludCB0byB0aGUgZWxlbWVudCBpdHNlbGZcbiAgICAgICAgbGV0IGV4aXN0ID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGlkID0gMDsgdmFsdWVzIDwgdmFsdWVzLmxlbmd0aDsgKytpZCkge1xuICAgICAgICAgICAgY29uc3QgcmVmZXJyZWQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh2YWx1ZXNbaWRdKTtcbiAgICAgICAgICAgIGlmIChyZWZlcnJlZCAmJiAhRE9NVXRpbC5zYW1lTm9kZShyZWZlcnJlZCwgZWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICBleGlzdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGV4aXN0ID8gYXRyVmFsdWUgOiBudWxsO1xuICAgIH1cblxuICAgIC8vIFJldHVybiB0cnVlIGlmIGVsZW1lbnQgaGFzIHZhbGlkIGltcGxpY2l0IGxhYmVsXG4gICAgcHVibGljIHN0YXRpYyBoYXNJbXBsaWNpdExhYmVsKGVsZW1lbnQpIHtcbiAgICAgICAgbGV0IHBhcmVudE5vZGUgPSBDb21tb25VdGlsLmdldEFuY2VzdG9yKGVsZW1lbnQsIFwibGFiZWxcIik7XG4gICAgICAgIC8vIFRlc3QgIGEpIGlmIHRoZSBwYXJlbnQgaXMgYSBsYWJlbCB3aGljaCBpcyB0aGUgaW1wbGljaXQgbGFiZWxcbiAgICAgICAgLy8gICAgICAgYikgaWYgdGhlIGZvcm0gZWxlbWVudCBpcyB0aGUgZmlyc3QgY2hpbGQgb2YgdGhlIGxhYmVsXG4gICAgICAgIC8vICAgICAgIGMpIGlmIHRoZSBmb3JtIGVsZW1lbnQgcmVxdWlyZXMgYW4gaW1wbGljaXQgb3IgZXhwbGljaXQgbGFiZWwgOiBcImlucHV0XCIsICBcInRleHRhcmVhXCIsIFwic2VsZWN0XCIsIFwia2V5Z2VuXCIsIFwicHJvZ3Jlc3NcIiwgXCJtZXRlclwiLCBcIm91dHB1dFwiXG4gICAgICAgIC8vICAgICAgIGQpIGZvcm0gZWxlbWVudHMgd2hpY2ggbWF5IGhhdmUgYSBsYWJlbDogYnV0dG9uXG4gICAgICAgIC8vIGZvcm0gZWxlbWVudHMgdGhhdCBkbyBub3QgcmVxdWlyZSBpbXBsaWNpdCBvciBleHBsaWNpdCBsYWJlbCBlbGVtZW50IGFyZTpcbiAgICAgICAgLy8gXCJvcHRncm91cFwiLCBcIm9wdGlvblwiLCBcImRhdGFsaXN0XCIoYWRkZWQgbGF0ZXIpLiBUaGVzZSB3ZXJlIGhhbmRsZWQgZGlmZmVyZW50bHkgaW4gdGhlIG1haW4gcnVsZSwgbWlnaHQgbmVlZCB0byByZWZhY3RvciB0aGUgY29kZSBsYXRlclxuXG4gICAgICAgIGlmIChwYXJlbnROb2RlICYmIHBhcmVudE5vZGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImxhYmVsXCIgJiYgQ29tbW9uVXRpbC5pc0ZpcnN0Rm9ybUVsZW1lbnQocGFyZW50Tm9kZSwgZWxlbWVudCkpIHtcbiAgICAgICAgICAgIGxldCBwYXJlbnRDbG9uZSA9IHBhcmVudE5vZGUuY2xvbmVOb2RlKHRydWUpO1xuICAgICAgICAgICAgLy8gZXhjbHVkZSBhbGwgZm9ybSBlbGVtZW50cyBmcm9tIHRoZSBsYWJlbCBzaW5jZSB0aGV5IG1pZ2h0IGFsc28gaGF2ZSBpbm5lciBjb250ZW50XG4gICAgICAgICAgICBwYXJlbnRDbG9uZSA9IENvbW1vblV0aWwucmVtb3ZlQWxsRm9ybUVsZW1lbnRzRnJvbUxhYmVsKHBhcmVudENsb25lKTtcbiAgICAgICAgICAgIHJldHVybiBDb21tb25VdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbihwYXJlbnRDbG9uZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gdGhlIGltcGxpY2l0IGxhYmVsIG9mIHRoZSBnaXZlbiBmb3JtIGZpZWxkXG4gICAgcHVibGljIHN0YXRpYyBnZXRJbXBsaWNpdExhYmVsKGVsZW1lbnQpIHtcbiAgICAgICAgbGV0IHBhcmVudE5vZGUgPSBDb21tb25VdGlsLmdldEFuY2VzdG9yKGVsZW1lbnQsIFwibGFiZWxcIik7XG4gICAgICAgIC8vIFRlc3QgIGEpIGlmIHRoZSBwYXJlbnQgaXMgYSBsYWJlbCB3aGljaCBpcyB0aGUgaW1wbGljaXQgbGFiZWxcbiAgICAgICAgLy8gICAgICAgYikgaWYgdGhlIGZvcm0gZWxlbWVudCBpcyB0aGUgZmlyc3QgY2hpbGQgb2YgdGhlIGxhYmVsXG4gICAgICAgIC8vICAgICAgIGMpIGlmIHRoZSBmb3JtIGVsZW1lbnQgcmVxdWlyZXMgYW4gaW1wbGljaXQgb3IgZXhwbGljaXQgbGFiZWwgOiBcImlucHV0XCIsICBcInRleHRhcmVhXCIsIFwic2VsZWN0XCIsIFwia2V5Z2VuXCIsIFwicHJvZ3Jlc3NcIiwgXCJtZXRlclwiLCBcIm91dHB1dFwiXG4gICAgICAgIC8vICAgICAgIGQpIGZvcm0gZWxlbWVudHMgd2hpY2ggbWF5IGhhdmUgYSBsYWJlbDogYnV0dG9uXG4gICAgICAgIC8vIGZvcm0gZWxlbWVudHMgdGhhdCBkbyBub3QgcmVxdWlyZSBpbXBsaWNpdCBvciBleHBsaWNpdCBsYWJlbCBlbGVtZW50IGFyZTpcbiAgICAgICAgLy8gXCJvcHRncm91cFwiLCBcIm9wdGlvblwiLCBcImRhdGFsaXN0XCIoYWRkZWQgbGF0ZXIpLiBUaGVzZSB3ZXJlIGhhbmRsZWQgZGlmZmVyZW50bHkgaW4gdGhlIG1haW4gcnVsZSwgbWlnaHQgbmVlZCB0byByZWZhY3RvciB0aGUgY29kZSBsYXRlclxuXG4gICAgICAgIGlmIChwYXJlbnROb2RlICYmIHBhcmVudE5vZGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImxhYmVsXCIgJiYgQ29tbW9uVXRpbC5pc0ZpcnN0Rm9ybUVsZW1lbnQocGFyZW50Tm9kZSwgZWxlbWVudCkpIHtcbiAgICAgICAgICAgIGxldCBwYXJlbnRDbG9uZSA9IHBhcmVudE5vZGUuY2xvbmVOb2RlKHRydWUpO1xuICAgICAgICAgICAgLy8gZXhjbHVkZSBhbGwgZm9ybSBlbGVtZW50cyBmcm9tIHRoZSBsYWJlbCBzaW5jZSB0aGV5IG1pZ2h0IGFsc28gaGF2ZSBpbm5lciBjb250ZW50XG4gICAgICAgICAgICBwYXJlbnRDbG9uZSA9IENvbW1vblV0aWwucmVtb3ZlQWxsRm9ybUVsZW1lbnRzRnJvbUxhYmVsKHBhcmVudENsb25lKTtcbiAgICAgICAgICAgIGNvbnN0IGxhYmVsID0gQ29tbW9uVXRpbC5nZXRJbm5lclRleHQocGFyZW50Q2xvbmUpO1xuICAgICAgICAgICAgcmV0dXJuIGxhYmVsICYmIGxhYmVsLnRyaW0oKSAhPT0gJycgPyBsYWJlbC50cmltKCkgOiBudWxsO1xuICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGdldHRpbmcgdGhlIGxhYmVsIGZvciBhIGZvcm0gZmllbGQgZWxlbWVudC5cbiAgICAgKlxuICAgICAqXG4gICAgICogQHBhcm0ge2VsZW1lbnR9IGVsZW1lbnQgLSBUaGUgZWxlbWVudCBmcm9tIHdoaWNoIHRvIGdldCB0aGUgbGFiZWwuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IHRleHQgLSByZXR1cm4gdGhlIGxhYmVsIHRleHQgb3IgbnVsbFxuICAgICAqXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRGb3JtRmllbGRMYWJlbChlbGVtKSA6IHN0cmluZyB8IG51bGwge1xuICAgICAgICAvLyBnZXQgdGhlIGxhYmVsIGZyb20gdGhlIGF0dHJpYnV0ZSBcImZvclwiIG9mIHRoZSBsYWJlbCBlbGVtZW50XG4gICAgICAgIC8vIEdldCBvbmx5IHRoZSBub24taGlkZGVuIGxhYmVscyBmb3IgZWxlbWVudFxuICAgICAgICBsZXQgdmFsdWUgPSBcIlwiO1xuICAgICAgICBsZXQgbGFiZWwgPSBudWxsO1xuICAgICAgICBsZXQgbGFiZWxFbGVtID0gQ29tbW9uVXRpbC5nZXRMYWJlbEZvckVsZW1lbnRIaWRkZW4oZWxlbSwgdHJ1ZSk7XG4gICAgICAgIGlmIChsYWJlbEVsZW0pIHtcbiAgICAgICAgICAgIC8vIHZhbHVlIGRpcmVjdGx5IGZyb20gZWxlbWVudCB0ZXh0XG4gICAgICAgICAgICBsYWJlbCA9IGxhYmVsRWxlbS5pbm5lclRleHQ7IC8vIGlnbm9yZSBoaWRkZW4gdGV4dFxuICAgICAgICB9IGVsc2UgeyAgICBcbiAgICAgICAgICAgIC8qKiBpZiBpdCdzIG5vdCBsYWJlbCB3aXRoIGZvciBhdHRyaWJ1dGUsIHRoZW4gZmluZCBpbXBsaWNpdCBsYWJlbFxuICAgICAgICAgICAgICogY2FzZXMgZm9yIGV4cGxpY3QgbGFiZWw6IFxuICAgICAgICAgICAgICogICA8bGFiZWwgZm9yPSdteSc+PC9sYWJlbD48aW5wdXQgaWQ9J215Jy8+XG4gICAgICAgICAgICAgKiAgIDxsYWJlbCBmb3I9J215Jz48aW5wdXQgaWQ9J215Jy8+PC9sYWJlbD4gICBcbiAgICAgICAgICAgICAqIGNhc2VzIGZvciBpbXBsaWNpdCBsYWJlbDogXG4gICAgICAgICAgICAgKiAgICA8bGFiZWw+PGlucHV0IC8+PC9sYWJlbD5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgbGFiZWxFbGVtID0gQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihlbGVtLCBcImxhYmVsXCIpO1xuICAgICAgICAgICAgaWYgKGxhYmVsRWxlbSAmJiBsYWJlbEVsZW0udGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImxhYmVsXCIgJiYgQ29tbW9uVXRpbC5pc0ZpcnN0Rm9ybUVsZW1lbnQobGFiZWxFbGVtLCBlbGVtKSkge1xuICAgICAgICAgICAgICAgIGxldCBwYXJlbnRDbG9uZSA9IGxhYmVsRWxlbS5jbG9uZU5vZGUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgLy8gZXhjbHVkZSBhbGwgdGhlIHRleHQgZnJvbSB0aGUgZmlyc3QgZm9ybSBlbGVtZW50IHNpbmNlIHRoZXkgbWlnaHQgYWxzbyBcbiAgICAgICAgICAgICAgICAvLyBoYXZlIGlubmVyIGNvbnRlbnQgdGhhdCBpcyBwYXJ0IG9mIGlubmVyVGV4dFxuICAgICAgICAgICAgICAgIHBhcmVudENsb25lID0gQ29tbW9uVXRpbC5yZW1vdmVBbGxGb3JtRWxlbWVudHNGcm9tTGFiZWwocGFyZW50Q2xvbmUpO1xuICAgICAgICAgICAgICAgIGxhYmVsID0gQ29tbW9uVXRpbC5nZXRJbm5lclRleHQocGFyZW50Q2xvbmUpO1xuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7ICAgXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmIChsYWJlbCAmJiBsYWJlbC50cmltKCkgIT09IFwiXCIpXG4gICAgICAgICAgICB2YWx1ZSArPSBsYWJlbC50cmltKCk7XG4gICAgICAgIFxuICAgICAgICAvLyB2YWx1ZSBmcm9tIGNoaWxkIGVsZW1lbnQgYXR0cmlidXRlXG4gICAgICAgIGxhYmVsID0gQ29tbW9uVXRpbC5nZXRMYWJlbFRleHRGcm9tQXR0cmlidXRlKGxhYmVsRWxlbSwgdHJ1ZSk7XG4gICAgICAgIGlmIChsYWJlbCAmJiBsYWJlbC50cmltKCkgIT09IFwiXCIpXG4gICAgICAgICAgICB2YWx1ZSArPSBsYWJlbC50cmltKCk7XG5cbiAgICAgICAgLy8gd2lyZWQgY2FzZTogZ2V0IGFyaWEgbGFiZWwgZnJvbSBsYWJlbCBlbGVtZW50IGl0c2VsZiBqdXN0IGluIGNhc2UgKHRob3VnaCBuYW1lIHByb2hpYml0ZWQgZnJvbSBhcmlhIGluIGh0bWwpXG4gICAgICAgIGxhYmVsID0gQXJpYVV0aWwuZ2V0QXJpYUxhYmVsKGxhYmVsRWxlbSk7XG4gICAgICAgIGlmIChsYWJlbCAmJiBsYWJlbC50cmltKCkgIT09IFwiXCIpXG4gICAgICAgICAgICB2YWx1ZSArPSBsYWJlbC50cmltKCk7XG5cbiAgICAgICAgcmV0dXJuIHZhbHVlLnRyaW0oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBjYWxjdWxhdGUgbGFiZWwgZnJvbSBlbWJlZGRlZCBjb250cm9sOiBodHRwczovL3czYy5naXRodWIuaW8vYWNjbmFtZS9cbiAgICAgKiBAcGFyYW0ge2VsZW1lbnR9IGxhYmVsRWxlbSBsYWJlbCBlbGVtZW50XG4gICAgICogQHBhcmFtIHtib29sZWFufSBpZ25vcmVIaWRkZW4gLSB0cnVlIGlmIGhpZGRlbiBlbGVtZW50cyB3aXRoIGxhYmVsIHNob3VsZCBiZSBpZ25vcmVkIGZyb20gdGhlIGxpc3RcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgaWYgdGhlIGhpZGRlbiBlbGVtZW50cyBzaG91bGQgYmUgYWRkZWQgIFxuICAgICAqIEByZXR1cm5zIGxhYmVsIHRleHQgb3IgJydcbiAgICAgKiBcbiAgICAgKiBub3RlIHRoZSBhc3N1bXB0aW9uIGlzIHRoZSBsYWJlbEVsZW0gcmVmZXJzIGVpdGhlciB0byBhIGxhYmVsbGVkIGVsZW1lbnQgYnkgJ2ZvcicgYXR0cmlidXRlIFxuICAgICAqICBvciBpdHMgZmlyc3QgZm9ybSBmaWVsZCBpcyBsYWJiZWxsZWQgZWxlbWVudFxuICAgICAqLyBcbiAgICBwdWJsaWMgc3RhdGljIGdldExhYmVsVGV4dEZyb21BdHRyaWJ1dGUobGFiZWxFbGVtOiBFbGVtZW50LCBpZ25vcmVIaWRkZW46IGJvb2xlYW4pIDogc3RyaW5nIHtcbiAgICAgICAgLy8gbGFiZWwgZWl0aGVyIHBvaW50cyB0byBhIGxhYmVsYWJsZSBlbGVtZW50IGJ5IGl0cyBmb3IgYXR0cmlidXRlIG9yIHRoZSBmaXJzdCBlbGVtZW50IGNoaWxkXG4gICAgICAgIC8vIGdldCB0aGUgbGFiZWxsZWQgZWxtZW50IGlmIGl0J3MgYW4gaW1wbGljaXQgbGFiZWxcbiAgICAgICAgbGV0IGxhYmVsZWRFbGVtID0gbnVsbDtcbiAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbGFiZWxFbGVtLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBjaGlsZDogRWxlbWVudCA9IGxhYmVsRWxlbS5jaGlsZHJlbi5pdGVtKGkpO1xuICAgICAgICAgICAgaWYgKENvbW1vblV0aWwuZm9ybV9sYWJlbGFibGVfZWxlbWVudHMuaW5jbHVkZXMoY2hpbGQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgICAgICAgICAgICBsYWJlbGVkRWxlbSA9IGNoaWxkO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBsZXQgbncgPSBuZXcgRE9NV2Fsa2VyKGxhYmVsRWxlbSk7XG4gICAgICAgIGxldCB0ZXh0ID0gJyc7XG4gICAgICAgIHdoaWxlIChudy5uZXh0Tm9kZSgpICYmIG53Lm5vZGUgIT09IGxhYmVsRWxlbSkge1xuICAgICAgICAgICAgLy8gb25seSBjaGVjayBlbGVtZW50IGNoaWxkcmVuXG4gICAgICAgICAgICBpZiAobncubm9kZSAmJiBudy5ub2RlLm5vZGVUeXBlID09PSAxICYmIG53LmVsZW0oKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW0gPSBudy5lbGVtKCk7XG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIGlmIGl0J3MgaGlkZGVuLCBvciBsYWJlbGxlZCBlbGVtZW50LCBvciBmaXJzdCBmb3JtIGVsZW1lbnQgaWYgbm90IGxhYmVsZWQgYnkgZm9yIGF0dHJpYnV0ZVxuICAgICAgICAgICAgICAgIGlmICgoaWdub3JlSGlkZGVuICYmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChlbGVtKSB8fCBWaXNVdGlsLmlzTm9kZVByZXNlbnRhdGlvbmFsKGVsZW0pKSlcbiAgICAgICAgICAgICAgICAgICAgfHwgKGxhYmVsZWRFbGVtICYmIGxhYmVsZWRFbGVtLmNvbnRhaW5zKGVsZW0pKSlcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICBjb25zdCByb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKGVsZW0pO1xuICAgICAgICAgICAgICAgIC8vIHRleHRib3ggZXRjLiByZXR1cm4gaXRzIHRleHQgdmFsdWVcbiAgICAgICAgICAgICAgICBpZiAocm9sZSA9PT0gXCJ0ZXh0Ym94XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IGVsZW0uZ2V0QXR0cmlidXRlKFwidmFsdWVcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICYmIG5hbWUudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9ICcgJyArIG5hbWUudHJpbSgpO1xuXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyb2xlID09PSBcImNvbWJvYm94XCIgfHwgcm9sZSA9PT0gXCJsaXN0Ym94XCIpIHsgXG4gICAgICAgICAgICAgICAgICAgIC8vIGZvciBjb21ib2JveCBvciBsaXN0Ym94IHJvbGVzLCByZXR1cm4gdGhlIHRleHQgYWx0ZXJuYXRpdmUgb2YgdGhlIGNob3NlbiBvcHRpb24uXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkSWQgPSBlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiKSB8fCBlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtc2VsZWN0ZWRcIikgfHwgZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWNoZWNrZWRcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZElkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2VsZWN0ZWRPcHRpb24gPSBlbGVtLm93bmVyRG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoc2VsZWN0ZWRJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRPcHRpb24gJiYgIURPTVV0aWwuc2FtZU5vZGUoZWxlbSwgc2VsZWN0ZWRPcHRpb24pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZShzZWxlY3RlZE9wdGlvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhaXIgJiYgcGFpci5uYW1lKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9ICcgJyArIHBhaXIubmFtZS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFtcInByb2dyZXNzYmFyXCIsIFwic2Nyb2xsYmFyXCIsIFwic2xpZGVyXCIsIFwic3BpbmJ1dHRvblwiLCBcIm1ldGVyXCJdLmluY2x1ZGVzKHJvbGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGZvciByYW5nZSByb2xlIHR5cGUsIGluY2x1ZGluZyBcInByb2dyZXNzYmFyXCIsIFwic2Nyb2xsYmFyXCIsIFwic2xpZGVyXCIsIFwic3BpbmJ1dHRvblwiIHJvbGVzXG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBhcmlhLXZhbHVldGV4dCBwcm9wZXJ0eSBpcyBwcmVzZW50LCByZXR1cm4gaXRzIHZhbHVlXG4gICAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS12YWx1ZXRleHRcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZS50cmltKCkubGVuZ3RoID4gMCkgXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9ICcgJyArIHZhbHVlLnRyaW0oKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIGlmIHRoZSBhcmlhLXZhbHVlbm93IHByb3BlcnR5IGlzIHByZXNlbnQsIHJldHVybiBpdHMgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLXZhbHVlbm93XCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgJiYgdmFsdWUudHJpbSgpLmxlbmd0aCA+IDApIFxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCArPSAnICcgKyB2YWx1ZS50cmltKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gZmluYWxseSB1c2UgbmF0aXZlIHZhbHVlIGF0dHJpYnV0ZVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGVsZW0uZ2V0QXR0cmlidXRlKFwidmFsdWVcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZS50cmltKCkubGVuZ3RoID4gMCkgXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9ICcgJyArIHZhbHVlLnRyaW0oKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBnZXQgYXJpYSBsYWJlbCBmcm9tIHRoZSBlbGVtZW50XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBBcmlhVXRpbC5nZXRBcmlhTGFiZWwoZWxlbSk7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlICYmIHZhbHVlLnRyaW0oKSAhPT0gXCJcIilcbiAgICAgICAgICAgICAgICAgICAgdGV4dCArPSAnICcgKyB2YWx1ZS50cmltKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGV4dC50cmltKCk7ICAgIFxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaXNGaXJzdEZvcm1FbGVtZW50KHBhcmVudE5vZGUsIGVsZW1lbnQpIHtcbiAgICAgICAgLy9sZXQgZm9ybUVsZW1lbnRzUmVxdWlyaW5nTGFiZWwgPSBbXCJpbnB1dFwiLCBcInRleHRhcmVhXCIsIFwic2VsZWN0XCIsIFwia2V5Z2VuXCIsIFwicHJvZ3Jlc3NcIiwgXCJtZXRlclwiLCBcIm91dHB1dFwiXTtcbiAgICAgICAgaWYgKHBhcmVudE5vZGUuZmlyc3RDaGlsZCAhPSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgbncgPSBuZXcgRE9NV2Fsa2VyKHBhcmVudE5vZGUpO1xuICAgICAgICAgICAgd2hpbGUgKG53Lm5leHROb2RlKCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoQ29tbW9uVXRpbC5mb3JtX2xhYmVsYWJsZV9lbGVtZW50cy5pbmRleE9mKG53Lm5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudy5ub2RlID09PSBlbGVtZW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgYSBzaGFkb3cgaG9zdCBvciBkZXNjZW5kYW50IG9mIGEgc2hhZG93IGhvc3QsIGJ1dCBub3QgYSBkZXNjZWRhbnQgb2YgdGhlIHNoYWRvdyByb290IG9mIHRoZSBob3N0ICh0byBiZSBhc3NpZ25lZCB0byBzaGFkb3cgc2xvdCBvciBpZ25vcmVkKSAgXG4gICAgcHVibGljIHN0YXRpYyBpc1NoYWRvd0hvc3RFbGVtZW50KGVsZW1lbnQ6IEVsZW1lbnQpIHtcbiAgICAgICAgaWYgKENvbW1vblV0aWwuaXNTaGFkb3dFbGVtZW50KGVsZW1lbnQpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsZXQgd2Fsa05vZGU6IEVsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgICB3aGlsZSAod2Fsa05vZGUpIHtcbiAgICAgICAgICAgIGlmICh3YWxrTm9kZS5zaGFkb3dSb290KSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIHdhbGtOb2RlID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQod2Fsa05vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvL2NoZWNrIGlmIGFuIGVsZW1lbnQgaXMgaW4gYSBzaGFkb3cgdHJlZVxuICAgIHB1YmxpYyBzdGF0aWMgaXNTaGFkb3dFbGVtZW50KGVsZW1lbnQ6IEVsZW1lbnQpIHtcbiAgICAgICAgbGV0IHJvb3QgPSBlbGVtZW50LmdldFJvb3ROb2RlKCk7XG4gICAgICAgIGlmIChyb290LnRvU3RyaW5nKCkgPT09IFwiW29iamVjdCBTaGFkb3dSb290XVwiKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHJlbW92ZUFsbEZvcm1FbGVtZW50c0Zyb21MYWJlbChlbGVtZW50KSB7XG4gICAgICAgIGxldCBmb3JtRWxlbWVudHMgPSBbXCJpbnB1dFwiLCBcInRleHRhcmVhXCIsIFwic2VsZWN0XCIsIFwiYnV0dG9uXCIsIFwiZGF0YWxpc3RcIiwgXCJvcHRncm91cFwiLCBcIm9wdGlvblwiLCBcImtleWdlblwiLCBcIm91dHB1dFwiLCBcInByb2dyZXNzXCIsIFwibWV0ZXJcIl07XG4gICAgICAgIGxldCBjaGlsZE5vZGVzID0gZWxlbWVudC5jaGlsZE5vZGVzO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChmb3JtRWxlbWVudHMuaW5kZXhPZihjaGlsZE5vZGVzW2ldLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpID4gLTEpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZUNoaWxkKGNoaWxkTm9kZXNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gZWxlbWVudCBcbiAgICAgICAgICogQHBhcmFtIGlkU3RyIFxuICAgICAgICAgKiBAcmV0dXJucyB0cnVlIGlmIGFueSBvbmUgKGlmIG11bHRpcGxlIElkcykgaWQgcG9pbnRzIHRvIGl0c2VsZlxuICAgICAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzSWRSZWZlclRvU2VsZihlbGVtZW50LCBpZFN0cjogU3RyaW5nKSB7XG4gICAgICAgIGlmICghaWRTdHIgfHwgaWRTdHIudHJpbSgpID09PSAnJykgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsZXQgaWRzID0gaWRTdHIudHJpbSgpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgZm9yIChsZXQgaiA9IDAsIGxlbmd0aCA9IGlkcy5sZW5ndGg7IGogPCBsZW5ndGg7ICsraikge1xuICAgICAgICAgICAgbGV0IHJlZmVycmVkTm9kZSA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKGVsZW1lbnQsIGlkc1tqXSk7XG4gICAgICAgICAgICBpZiAocmVmZXJyZWROb2RlICYmIERPTVV0aWwuc2FtZU5vZGUocmVmZXJyZWROb2RlLCBlbGVtZW50KSkgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qIERldGVybWluZSB0aGUgbm9kZSBkZXB0aCBvZiB0aGUgZ2l2ZW4gZWxlbWVudCAqL1xuICAgIHB1YmxpYyBzdGF0aWMgbm9kZURlcHRoKGVsZW1lbnQpIHtcbiAgICAgICAgbGV0IGRlcHRoID0gMDtcbiAgICAgICAgbGV0IHdhbGtOb2RlID0gZWxlbWVudDtcbiAgICAgICAgd2hpbGUgKHdhbGtOb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgICB3YWxrTm9kZSA9IERPTVdhbGtlci5wYXJlbnROb2RlKHdhbGtOb2RlKTtcbiAgICAgICAgICAgIGRlcHRoID0gZGVwdGggKyAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZXB0aDtcbiAgICB9XG5cbiAgICAvKiBjb21wYXJlIG5vZGUgb3JkZXIgb2YgdGhlIDIgZ2l2ZW4gbm9kZXMgKi9cbiAgICAvKiByZXR1cm5zXG4gICAgICogICAwIGlmIHRoZSBub2RlcyBhcmUgZXF1YWxcbiAgICAgKiAgIDEgaWYgbm9kZSBiIGlzIGJlZm9yZSBub2RlIGFcbiAgICAgKiAgLTEgaWYgbm9kZSBhIGlzIGJlZm9yZSBub2RlIGJcbiAgICAgKiAgIDIgaWYgbm9kZSBhIGlzIG5lc3RlZCBpbiBub2RlIGJcbiAgICAgKiAgLTIgaWYgbm9kZSBiIGlzIG5lc3RlZCBpbiBub2RlIGFcbiAgICAgKiAgIG51bGwgaWYgZWl0aGVyIG5vZGUgaXMgbnVsbCBvciB0aGVpciBwYXJlbnQgbm9kZXMgYXJlIG5vdCBlcXVhbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgY29tcGFyZU5vZGVPcmRlcihub2RlQSwgbm9kZUIpIHtcbiAgICAgICAgaWYgKG5vZGVBID09PSBub2RlQikgcmV0dXJuIDA7XG5cbiAgICAgICAgbGV0IGFEZXB0aCA9IENvbW1vblV0aWwubm9kZURlcHRoKG5vZGVBKTtcbiAgICAgICAgbGV0IGJEZXB0aCA9IENvbW1vblV0aWwubm9kZURlcHRoKG5vZGVCKTtcbiAgICAgICAgaWYgKGJEZXB0aCA+IGFEZXB0aCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBiRGVwdGggLSBhRGVwdGg7ICsraSlcbiAgICAgICAgICAgICAgICBub2RlQiA9IERPTVdhbGtlci5wYXJlbnROb2RlKG5vZGVCKTtcbiAgICAgICAgICAgIGlmIChub2RlQSA9PT0gbm9kZUIpIC8vIE5vZGUgQiBuZXN0ZWQgaW4gTm9kZSBBXG4gICAgICAgICAgICAgICAgcmV0dXJuIC0yO1xuICAgICAgICB9IGVsc2UgaWYgKGFEZXB0aCA+IGJEZXB0aCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhRGVwdGggLSBiRGVwdGg7ICsraSlcbiAgICAgICAgICAgICAgICBub2RlQSA9IERPTVdhbGtlci5wYXJlbnROb2RlKG5vZGVBKTtcbiAgICAgICAgICAgIGlmIChub2RlQSA9PT0gbm9kZUIpIC8vIE5vZGUgQSBuZXN0ZWQgaW4gTm9kZSBCXG4gICAgICAgICAgICAgICAgcmV0dXJuIDI7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKG5vZGVBICE9IG51bGwgJiYgbm9kZUIgIT0gbnVsbCAmJiBET01XYWxrZXIucGFyZW50Tm9kZShub2RlQSkgIT0gRE9NV2Fsa2VyLnBhcmVudE5vZGUobm9kZUIpKSB7XG4gICAgICAgICAgICBub2RlQSA9IERPTVdhbGtlci5wYXJlbnROb2RlKG5vZGVBKTtcbiAgICAgICAgICAgIG5vZGVCID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUobm9kZUIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlQSA9PT0gbnVsbCB8fCBub2RlQiA9PT0gbnVsbCB8fCBET01XYWxrZXIucGFyZW50Tm9kZShub2RlQSkgIT0gRE9NV2Fsa2VyLnBhcmVudE5vZGUobm9kZUIpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgd2hpbGUgKG5vZGVCICE9IG51bGwgJiYgbm9kZUIgIT0gbm9kZUEpXG4gICAgICAgICAgICBub2RlQiA9IG5vZGVCLnByZXZpb3VzU2libGluZztcbiAgICAgICAgaWYgKG5vZGVCID09PSBudWxsKSAvLyBub2RlQiBiZWZvcmUgbm9kZUFcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICBlbHNlIHJldHVybiAtMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAgRGV0ZXJtaW5lIGlmIHRoZSBnaXZlbiBhdHRyaWJ1dGUgb2YgdGhlIGdpdmVuIGVsZW1lbnQgaXMgbm90IGVtcHR5XG4gICAgICogIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgYXR0cmlidXRlTm9uRW1wdHkoZWxlbWVudCwgYXR0clN0cikge1xuICAgICAgICByZXR1cm4gZWxlbWVudC5oYXNBdHRyaWJ1dGUoYXR0clN0cikgJiYgZWxlbWVudC5nZXRBdHRyaWJ1dGUoYXR0clN0cikudHJpbSgpLmxlbmd0aCA+IDA7XG4gICAgfVxuXG4gICAgLyogUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgZ2l2ZW4gZnJhbWUsIG51bGwgaWYgbm90IGZvdW5kICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRGcmFtZUJ5TmFtZShydWxlQ29udGV4dCwgZnJhbWVOYW1lKSB7XG4gICAgICAgIGxldCB3aW5kb3cgPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3O1xuICAgICAgICBsZXQgZnJhbWVMaXN0ID0gW3dpbmRvd107XG4gICAgICAgIGxldCBpZHggPSAwO1xuICAgICAgICB3aGlsZSAoaWR4IDwgZnJhbWVMaXN0Lmxlbmd0aCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoZnJhbWVMaXN0W2lkeF0ubmFtZSA9PT0gZnJhbWVOYW1lKSByZXR1cm4gZnJhbWVMaXN0W2lkeF07XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmcmFtZUxpc3RbaWR4XS5mcmFtZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVuc3VyZSBpdCdzIGEgcmVhbCBmcmFtZSBhbmQgYXZvaWQgcmVjdXJzaW9uXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnJhbWVMaXN0W2lkeF0uZnJhbWVzW2ldICYmICFmcmFtZUxpc3QuaW5jbHVkZXMoZnJhbWVMaXN0W2lkeF0uZnJhbWVzW2ldKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lTGlzdC5wdXNoKGZyYW1lTGlzdFtpZHhdLmZyYW1lc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsgfVxuICAgICAgICAgICAgKytpZHg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZWZhdWx0TlNSZXNvbHZlcihwcmVmaXgpIHtcbiAgICAgICAgbGV0IHVyaTtcbiAgICAgICAgc3dpdGNoIChwcmVmaXgpIHtcbiAgICAgICAgICAgIGNhc2UgJ2h0bWwnOlxuICAgICAgICAgICAgICAgIHVyaSA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJztcbiAgICAgICAgICAgIGNhc2UgJ3gyJzpcbiAgICAgICAgICAgICAgICB1cmkgPSAnaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwyJztcbiAgICAgICAgICAgIGNhc2UgJ3gnOlxuICAgICAgICAgICAgICAgIHVyaSA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJztcbiAgICAgICAgICAgIGNhc2UgJ3hodG1sJzpcbiAgICAgICAgICAgICAgICB1cmkgPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCc7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHVyaSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVyaTtcbiAgICB9XG5cbiAgICAvL2NoZWNraW5nIGlmIG9ubHkgdGhlIGlubmVyIHRleHQgaXMgZW1wdHkgb3Igbm90XG4gICAgcHVibGljIHN0YXRpYyBpc0lubmVyVGV4dE9ubHlFbXB0eShlbGVtZW50KSB7XG4gICAgICAgIC8vIEdldCB0aGUgaW5uZXJUZXh0IG9mIHRoZSBlbGVtZW50XG4gICAgICAgIGxldCB0ZXh0ID0gZWxlbWVudC5pbm5lclRleHQ7XG5cbiAgICAgICAgaWYgKCh0ZXh0ID09PSB1bmRlZmluZWQgfHwgdGV4dCA9PT0gbnVsbCB8fCB0ZXh0LnRyaW0oKS5sZW5ndGggPT09IDApICYmIGVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gJ3Nsb3QnICYmIGVsZW1lbnQudGV4dENvbnRlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy9pZ25vcmUgc2xvdCBiZWNhdXNlIGl0cyB0ZXh0IHdpbGwgYmUgZmlsbGVkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIGNvbnRlbnQgaW4gdGhlIGxpZ2h0IERPTSBcbiAgICAgICAgICAgIC8vIGlubmVyVGV4dCBpcyBzb21ldGltZXMgJ3VuZGVmaW5lZCcgaW4gaGVhZGxlc3MgbW9kZSwgb3IgbnVsbCBpZiB0aGUgZWxlbWVudCBpcyBpbnZpc2libGUgb3Igbm90IGVyeHBhbmRlZCBcbiAgICAgICAgICAgIC8vIHNvIHdlIHRyeSB0ZXh0Q29udGVudCBhcyBhIHdvcmthcm91bmRcbiAgICAgICAgICAgIHRleHQgPSBlbGVtZW50LnRleHRDb250ZW50XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmV0VmFsID0gISh0ZXh0ICE9PSBudWxsICYmIHRleHQudHJpbSgpLmxlbmd0aCA+IDApO1xuICAgICAgICBpZiAoZWxlbWVudC5ub2RlVHlwZSA9PT0gMSAmJiBlbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwic2xvdFwiKSB7XG4gICAgICAgICAgICAvL1RPRE86IG5lZWQgdG8gY29uc2lkZSBpdHMgb3duIGNvbnRlbnQsIGEgc2xvdCBtYXkgaGF2ZSBpdHMgb3duIGNvbnRlbnQgb3IgYXNzaWduZWQgY29udGVudFxuICAgICAgICAgICAgZm9yIChjb25zdCBzbG90RWxlbSBvZiBlbGVtZW50LmFzc2lnbmVkTm9kZXMoKSkge1xuICAgICAgICAgICAgICAgIHJldFZhbCA9IHJldFZhbCAmJiBDb21tb25VdGlsLmlzSW5uZXJUZXh0RW1wdHkoc2xvdEVsZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVHJpbSB0aGUgaW5uZXIgdGV4dCBhbmQgdmVyaWZ5IHRoYXQgaXQgaXMgbm90IGVtcHR5LlxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIC8qIFJldHVybiB0aGUgaW5uZXIgdGV4dCBvZiB0aGUgZ2l2ZW4gZWxlbWVudCAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SW5uZXJUZXh0KGVsZW1lbnQpIHtcbiAgICAgICAgbGV0IHJldFZhbCA9IGVsZW1lbnQuaW5uZXJUZXh0O1xuICAgICAgICBpZiAocmV0VmFsID09PSB1bmRlZmluZWQgfHwgcmV0VmFsID09PSBudWxsIHx8IHJldFZhbC50cmltKCkgPT09IFwiXCIpXG4gICAgICAgICAgICByZXRWYWwgPSBlbGVtZW50LnRleHRDb250ZW50O1xuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHJldHVybiBvbnNjcmVlbiBpbm5lclRleHQgb25seS5cbiAgICAgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gdGhlIHNhbWUgcmVzdWx0IGFzIGlubmVyVGV4dCBpZiBubyBvZmZzY3JlZW4gY29udGVudCBleGlzdHNcbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBub2RlIFRoZSBub2RlIHdoaWNoIHNob3VsZCBiZSBjaGVja2VkIGl0IGhhcyBpbm5lciB0ZXh0IG9yIG5vdC5cbiAgICAgKiBAcmV0dXJuIHtudWxsIHwgc3RyaW5nfSBudWxsIGlmIGVsZW1lbnQgaGFzIGVtcHR5IGlubmVyIHRleHQsIHRleHQgb3RoZXJ3aXNlXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldE9uU2NyZWVuSW5uZXJUZXh0KGVsZW1lbnQpIHtcbiAgICAgICAgaWYgKCFlbGVtZW50KSByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKGVsZW1lbnQubm9kZVR5cGUgPT09IDMpIHJldHVybiBlbGVtZW50Lm5vZGVWYWx1ZSgpO1xuXG4gICAgICAgIGxldCB0ZXh0ID0gXCJcIjtcbiAgICAgICAgbGV0IG53ID0gbmV3IERPTVdhbGtlcihlbGVtZW50KTtcbiAgICAgICAgLy8gTG9vcCBvdmVyIGFsbCB0aGUgY2hpbGRyZW5zIG9mIHRoZSBlbGVtZW50IHRvIGdldCB0aGUgdGV4dFxuICAgICAgICB3aGlsZSAobncubmV4dE5vZGUoKSAmJiBudy5ub2RlICE9PSBlbGVtZW50ICYmIG53Lm5vZGUgIT09IGVsZW1lbnQucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgaWYgKG53LmJFbmRUYWcpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKG53Lm5vZGUubm9kZVR5cGUgPT09IDEgJiYgKFZpc1V0aWwuaGlkZGVuQnlEZWZhdWx0RWxlbWVudHMuaW5jbHVkZXMobncubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSB8fCAhVmlzVXRpbC5pc05vZGVWaXNpYmxlKG53Lm5vZGUpIHx8IFZpc1V0aWwuaXNFbGVtZW50T2Zmc2NyZWVuKG53Lm5vZGUgYXMgSFRNTEVsZW1lbnQpKSkgeyBcbiAgICAgICAgICAgICAgICAvKiogc3BlY2lhbCBjYXNlIGZvciBzdmcgPHRpdGxlPiBlbGVtZW50OiBcbiAgICAgICAgICAgICAgICAgKiAgICAgdGV4dCBpbiBhIDx0aXRsZT4gZWxlbWVudCBpcyBub3QgcmVuZGVyZWQgYXMgcGFydCBvZiB0aGUgZ3JhcGhpYywgYnV0IGJyb3dzZXJzIHVzdWFsbHkgZGlzcGxheSBpdCBhcyBhIHRvb2x0aXBcbiAgICAgICAgICAgICAgICAgKiAgICAgbm90ZSBzb21lIHN2ZyBlbGVtZW50cywgc3VjaCBhcyB0aXRsZSwgZGVzYywgaGF2ZSBhIGJvdW5kcyB7XCJsZWZ0XCI6MCxcInRvcFwiOjAsXCJoZWlnaHRcIjowLFwid2lkdGhcIjowfVxuICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgaWYgKG53Lm5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ3RpdGxlJyAmJiBDb21tb25VdGlsLmdldEFuY2VzdG9yKG53Lm5vZGUsIFwic3ZnXCIpKSBcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBpZiAobncubm9kZS5uZXh0U2libGluZykge1xuICAgICAgICAgICAgICAgICAgICBpZiAobncubm9kZS5uZXh0U2libGluZy5ub2RlVHlwZSA9PT0gMyAmJiBudy5ub2RlLm5leHRTaWJsaW5nLm5vZGVWYWx1ZSAmJiBudy5ub2RlLm5leHRTaWJsaW5nLm5vZGVWYWx1ZS50cmltKCkgIT09ICcnKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCArPSAnICcgKyBudy5ub2RlLm5leHRTaWJsaW5nLm5vZGVWYWx1ZS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgIG53Lm5vZGUgPSBudy5ub2RlLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobncubm9kZS5ub2RlVHlwZSA9PT0gMyAmJiBudy5ub2RlLm5vZGVWYWx1ZSAmJiBudy5ub2RlLm5vZGVWYWx1ZS50cmltKCkgIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgdGV4dCArPSAnICcgKyBudy5ub2RlLm5vZGVWYWx1ZS50cmltKCk7IFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0ZXh0LnRyaW0oKTtcbiAgICB9XG5cbiAgICAvKiogUmV0dXJuIHRoZSB0ZXh0IGNvbnRlbnQgb2YgdGhlIGdpdmVuIG5vZGUgXG4gICAgICogIHRoaXMgaXMgZGlmZmVyZW50IHRoYW4gaW5uZXJUZXh0IG9yIHRleHRDb250ZW50IHRoYXQgcmV0dXJuIHRleHQgY29udGVudCBvZiBhIG5vZGUgYW5kIGl0cyBkZXNjZW5kYW50c1xuICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXROb2RlVGV4dChlbGVtZW50KSB7XG4gICAgICAgIGlmICghZWxlbWVudCkgcmV0dXJuIFwiXCI7XG4gICAgICAgIGxldCB0ZXh0ID0gXCJcIjtcbiAgICAgICAgbGV0IGNoaWxkTm9kZXMgPSBlbGVtZW50LmNoaWxkTm9kZXM7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGROb2Rlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgaWYgKGNoaWxkTm9kZXNbaV0ubm9kZVR5cGUgPT0gMykge1xuICAgICAgICAgICAgICAgIHRleHQgKz0gY2hpbGROb2Rlc1tpXS5ub2RlVmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgY2hlY2tpbmcgaWYgZWxlbWVudHMgaW5uZXIgdGV4dCBpcyBlbXB0eSBvciBub3QuXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gbm9kZSBUaGUgbm9kZSB3aGljaCBzaG91bGQgYmUgY2hlY2tlZCBpdCBoYXMgaW5uZXIgdGV4dCBvciBub3QuXG4gICAgICogQHJldHVybiB7Ym9vbH0gdHJ1ZSBpZiBlbGVtZW50IGhhcyBlbXB0eSBpbm5lciB0ZXh0LCBmYWxzZSBvdGhlcndpc2VcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgaXNJbm5lclRleHRFbXB0eShlbGVtZW50KSB7XG4gICAgICAgIC8vIEdldCB0aGUgaW5uZXJUZXh0IG9mIHRoZSBlbGVtZW50XG4gICAgICAgIGxldCB0ZXh0ID0gQ29tbW9uVXRpbC5nZXRJbm5lclRleHQoZWxlbWVudCk7XG5cbiAgICAgICAgLy8gVHJpbSB0aGUgaW5uZXIgdGV4dCBhbmQgdmVyaWZ5IHRoYXQgaXQgaXMgbm90IGVtcHR5LlxuICAgICAgICByZXR1cm4gISh0ZXh0ICE9IG51bGwgJiYgdGV4dC50cmltKCkubGVuZ3RoID4gMCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBoYXNJbm5lckNvbnRlbnQoZWxlbWVudCkge1xuICAgICAgICBsZXQgdGV4dCA9IENvbW1vblV0aWwuZ2V0SW5uZXJUZXh0KGVsZW1lbnQpO1xuICAgICAgICBsZXQgaGFzQ29udGVudCA9ICh0ZXh0ICE9PSBudWxsICYmIHRleHQudHJpbSgpLmxlbmd0aCA+IDApO1xuXG4gICAgICAgIGlmIChlbGVtZW50LmZpcnN0Q2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGxldCBudyA9IG5ldyBET01XYWxrZXIoZWxlbWVudCk7XG4gICAgICAgICAgICB3aGlsZSAoIWhhc0NvbnRlbnQgJiYgbncubmV4dE5vZGUoKSkge1xuICAgICAgICAgICAgICAgIGhhc0NvbnRlbnQgPSAobncubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImltZ1wiICYmXG4gICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkobncubm9kZSwgXCJhbHRcIikpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoYXNDb250ZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGRldGVybWluZSBpZiBhbiBlbGVtZW50IGhhcyBpbm5lciBjb250ZW50LlxuICAgICAqIFRoaXMgZnVuY3Rpb24gYWxzbyBjb25zaWRlcnMgY2FzZXMgd2hlcmUgaW5uZXIgdGV4dCBpcyBoaWRkZW4sIHdoaWNoIG5vdyB3aWxsXG4gICAgICogYmUgY2xhc3NpZmllZCBhcyBkb2VzIG5vdCBoYXZlIGhpZGRlbiBjb250ZW50LlxuICAgICAqXG4gICAgICogQHBhcm0ge2VsZW1lbnR9IG5vZGUgVGhlIG5vZGUgd2hpY2ggc2hvdWxkIGJlIGNoZWNrZWQgaXQgaGFzIGlubmVyIHRleHQgb3Igbm90LlxuICAgICAqIEByZXR1cm4ge2Jvb2x9IHRydWUgaWYgZWxlbWVudCBoYXMgZW1wdHkgaW5uZXIgdGV4dCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGhhc0lubmVyQ29udGVudEhpZGRlbihlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBDb21tb25VdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbkh5cGVyTGluayhlbGVtZW50LCBmYWxzZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBzdmdIYXNOYW1lKGVsZW1lbnQ6IFNWR0VsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkoZWxlbWVudCwgXCJhcmlhLWxhYmVsXCIpXG4gICAgICAgICAgICB8fCBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KGVsZW1lbnQsIFwiYXJpYS1sYWJlbGxlZGJ5XCIpXG4gICAgICAgICAgICB8fCAhIWVsZW1lbnQucXVlcnlTZWxlY3RvcihcIjpzY29wZSA+IHRpdGxlXCIpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaGFzSW5uZXJDb250ZW50SGlkZGVuSHlwZXJMaW5rKGVsZW1lbnQsIGh5cGVybGlua19mbGFnKSB7XG4gICAgICAgIGlmICghZWxlbWVudCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAvLyBWYXJpYWJsZSBEZWNsZXJhdGlvblxuICAgICAgICBsZXQgY2hpbGRFbGVtZW50ID0gZWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZDtcbiAgICAgICAgbGV0IGhhc0NvbnRlbnQgPSBmYWxzZTtcblxuICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IHRoZSBjaGlsZEVsZW1lbnQgaXMgbm90IG51bGwgdGhlbiB3ZSBuZWVkIHRvIGNoZWNrIGVhY2ggb2YgdGhlIGVsZW1lbnRzXG4gICAgICAgIC8vIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBlbGVtZW50cyBhcmUgbm90IGFsbCBoaWRkZW4uXG4gICAgICAgIGlmIChjaGlsZEVsZW1lbnQgIT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gR2V0IHRoZSBub2Rld2FsdGVyIG9mIHRoZSBlbGVtZW50IG5vZGUsIHNvIHRoYXQgd2UgY2FuIGxvb3Agb3ZlciBpdCBhbmQgdmVyaWZ5XG4gICAgICAgICAgICAvLyB0aGF0IHRoZSBlbGVtZW50cyB1bmRlciB0aGUgZWxlbWVudCBhcmUgbm90IGNvbXBsZXRseSBoaWRkZW4uXG4gICAgICAgICAgICBsZXQgbncgPSBuZXcgRE9NV2Fsa2VyKGVsZW1lbnQpO1xuICAgICAgICAgICAgLy8gTG9vcCBvdmVyIGFsbCB0aGUgbm9kZXMgdW50aWwgdGhlcmUgYXJlIG5vIG1vcmUgbm9kZXMgb3Igd2UgaGF2ZSBkZXRlcm1pbmUgdGhhdCB0aGVyZSBpcyBjb250ZW50IHVuZGVyXG4gICAgICAgICAgICAvLyB0aGlzIHBhcmVudCBlbGVtZW50LlxuICAgICAgICAgICAgd2hpbGUgKCFoYXNDb250ZW50ICYmIG53Lm5leHROb2RlKCkgJiYgbncubm9kZSAhPSBlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBuZXh0IG5vZGVcbiAgICAgICAgICAgICAgICBsZXQgbm9kZSA9IG53Lm5vZGU7XG5cbiAgICAgICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSBhbiBpbWcgZWxlbWVudCBpcyBwcmVzZW50IHdpdGggYWx0IHRoZW4gd2UgY2FuIG1hcmsgdGhpcyBhcyBwYXNzXG4gICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIGtlZXAgY2hlY2tpbmcgYWxsIHRoZSBvdGhlciBlbGVtZW50cy4gTWFrZSBzdXJlIHRoYXQgdGhpcyBpbWFnZSBlbGVtZW50IGlzIG5vdCBoaWRkZW4uXG4gICAgICAgICAgICAgICAgaGFzQ29udGVudCA9IChcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImltZ1wiXG4gICAgICAgICAgICAgICAgICAgICYmIChDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KG5vZGUsIFwiYWx0XCIpIHx8IENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkobm9kZSwgXCJ0aXRsZVwiKSlcbiAgICAgICAgICAgICAgICAgICAgJiYgIVZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKG5vZGUgYXMgSFRNTEVsZW1lbnQpICYmICFWaXNVdGlsLmlzTm9kZVByZXNlbnRhdGlvbmFsKG5vZGUgYXMgSFRNTEVsZW1lbnQpXG4gICAgICAgICAgICAgICAgKSB8fCAoXG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwic3ZnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICYmIENvbW1vblV0aWwuc3ZnSGFzTmFtZShub2RlIGFzIGFueSlcbiAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIC8vIE5vdyB3ZSBjaGVjayBpZiB0aGlzIG5vZGUgaXMgb2YgdHlwZSBlbGVtZW50LCB2aXNpYmxlXG4gICAgICAgICAgICAgICAgaWYgKCFoYXNDb250ZW50ICYmIG5vZGUubm9kZVR5cGUgPT09IDEgJiYgIVZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKG5vZGUgYXMgSFRNTEVsZW1lbnQpICYmICFWaXNVdGlsLmlzTm9kZVByZXNlbnRhdGlvbmFsKG5vZGUgYXMgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBpbm5lclRleHQgb2YgdGhlIGVsZW1lbnQgaXMgZW1wdHkgb3Igbm90XG4gICAgICAgICAgICAgICAgICAgIGhhc0NvbnRlbnQgPSAhQ29tbW9uVXRpbC5pc0lubmVyVGV4dE9ubHlFbXB0eShub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNDb250ZW50ICYmIGh5cGVybGlua19mbGFnID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBoYXNDb250ZW50ID0gQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShub2RlLCBcImFyaWEtbGFiZWxcIikgfHwgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShub2RlLCBcImFyaWEtbGFiZWxsZWRieVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkb2MgPSBub2RlLm93bmVyRG9jdW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG9jKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHdpbiA9IGRvYy5kZWZhdWx0VmlldztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod2luKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjU3R5bGUgPSB3aW4uZ2V0Q29tcHV0ZWRTdHlsZShub2RlIGFzIGFueSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaGFzQ29udGVudCAmJiBjU3R5bGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhjU3R5bGUuYmFja2dyb3VuZEltYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coY1N0eWxlLmNvbnRlbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNDb250ZW50ID0gKChjU3R5bGUuYmFja2dyb3VuZEltYWdlICYmIGNTdHlsZS5iYWNrZ3JvdW5kSW1hZ2UuaW5kZXhPZikgfHwgY1N0eWxlLmNvbnRlbnQpICYmIENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkobm9kZSwgXCJhbHRcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBjYXNlcyB3aGVyZSB0aGVyZSBpcyB0ZXh0IG5vZGUgYWZ0ZXIgYW4gZWxlbWVudCB1bmRlciB0aGUgcGFyZW50XG4gICAgICAgICAgICAgICAgLy8gSW4gdGhlIGNhc2Ugd2UgZGV0ZWN0IG5vZGV0eXBlIGFzIHRleHQgbm9kZSBhbmQgdGhlIHBhdGVudCBvZiB0aGUgdGV4dCBub2RlIGlzXG4gICAgICAgICAgICAgICAgLy8gdGhlIHNhbWUgZWxlbWVudCB3ZSBhcmUgY2hlY2tpbmcgaGFzIElubmVyIGNvbnRlbnQgZm9yIHRoZW4gZ2V0IHRoZSBpbm5lciBjb250ZW50IG9mIHRoaXNcbiAgICAgICAgICAgICAgICAvLyB0ZXh0IG5vZGUuXG4gICAgICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDMgJiYgRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQobm9kZSkgPT09IGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGlubmVyVGV4dCBvZiB0aGUgZWxlbWVudCBpcyBlbXB0eSBvciBub3RcbiAgICAgICAgICAgICAgICAgICAgaGFzQ29udGVudCA9ICFDb21tb25VdGlsLmlzSW5uZXJUZXh0RW1wdHkobm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEluIHRoZSBjYXNlIHRoZXJlIGFyZSBubyBjaGlsZCBlbGVtZW50cyB0aGVuIHdlIGNhbiBzaW1wbHkgcGVyZm9ybSB0aGUgY2hlY2sgZm9yIG9ubHkgaW5uZXJ0ZXh0XG4gICAgICAgIC8vIHRoZSBpbWcgd2l0aCBhbHQgY2FzZSB3aWxsIGJlIGNvdmVyZWQgaW4gdGhlIGFib3ZlIGlmLCBhcyBpbWcgaXMgY29uc2lkZXJzIGFzIGFuIGVsZW1lbnQuXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGlubmVyVGV4dCBvZiB0aGUgZWxlbWVudCBpcyBlbXB0eSBvciBub3RcbiAgICAgICAgICAgIGhhc0NvbnRlbnQgPSAhQ29tbW9uVXRpbC5pc0lubmVyVGV4dEVtcHR5KGVsZW1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGhhc0NvbnRlbnQ7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBoYXNJbm5lckNvbnRlbnRPckFsdChlbGVtZW50KSB7XG4gICAgICAgIGxldCB0ZXh0ID0gQ29tbW9uVXRpbC5nZXRJbm5lclRleHQoZWxlbWVudCk7XG4gICAgICAgIGxldCBoYXNDb250ZW50ID0gKHRleHQgIT0gbnVsbCAmJiB0ZXh0LnRyaW0oKS5sZW5ndGggPiAwKSB8fCBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KGVsZW1lbnQsIFwiYWx0XCIpO1xuXG4gICAgICAgIGlmIChlbGVtZW50LmZpcnN0Q2hpbGQgIT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IG53ID0gbmV3IERPTVdhbGtlcihlbGVtZW50KTtcbiAgICAgICAgICAgIHdoaWxlICghaGFzQ29udGVudCAmJiBudy5uZXh0Tm9kZSgpICYmIG53Lm5vZGUgIT0gZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGhhc0NvbnRlbnQgPSAobncubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImltZ1wiICYmXG4gICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkobncubm9kZSwgXCJhbHRcIikpO1xuICAgICAgICAgICAgICAgIGlmICghaGFzQ29udGVudFxuICAgICAgICAgICAgICAgICAgICAmJiAoQXJpYVV0aWwuaGFzUm9sZShudy5ub2RlLCBcImJ1dHRvblwiLCB0cnVlKSB8fCBBcmlhVXRpbC5oYXNSb2xlKG53Lm5vZGUsIFwidGV4dGJveFwiKSlcbiAgICAgICAgICAgICAgICAgICAgJiYgKEFyaWFVdGlsLmhhc0FyaWFMYWJlbChudy5ub2RlKSB8fCBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KG53Lm5vZGUsIFwidGl0bGVcIikgfHwgQ29tbW9uVXRpbC5nZXRMYWJlbEZvckVsZW1lbnRIaWRkZW4obncuZWxlbSgpLCB0cnVlKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaGFzQ29udGVudCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhhc0NvbnRlbnQ7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjb25jYXRVbmlxdWVBcnJheUl0ZW0oaXRlbTogc3RyaW5nLCBhcnI6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICAgICAgICBhcnIuaW5kZXhPZihpdGVtKSA9PT0gLTEgJiYgaXRlbSAhPT0gbnVsbCA/IGFyci5wdXNoKGl0ZW0pIDogZmFsc2U7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KGl0ZW1MaXN0OiBzdHJpbmdbXSwgYXJyOiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGl0ZW1MaXN0ICE9PSBudWxsICYmIGkgPCBpdGVtTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJyID0gQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW0oaXRlbUxpc3RbaV0sIGFycik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiByZW1vdmUgYXJyYXkgaXRlbXMgZnJvbSBhIGdpdmVuIGFycmF5XG4gICAgICogQHBhcmFtIGl0ZW1MaXN0IGl0ZW1zIHRvIGJlIHJlbW92ZWQgZnJvbSBhcnJcbiAgICAgKiBAcGFyYW0gYXJyIHRoZSBhcnJheVxuICAgICAqIEByZXR1cm5zIFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgcmVkdWNlQXJyYXlJdGVtTGlzdChpdGVtTGlzdDogc3RyaW5nW10sIGFycjogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gICAgICAgIGlmIChhcnIgJiYgYXJyLmxlbmd0aCA+IDAgJiYgaXRlbUxpc3QgJiYgaXRlbUxpc3QubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGFyci5maWx0ZXIoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICFpdGVtTGlzdC5pbmNsdWRlcyh2YWx1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldFNjb3BlRm9yVGgoZWxlbWVudCkge1xuICAgICAgICAvKiogaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L3RhYnVsYXItZGF0YS5odG1sI2hlYWRlci1hbmQtZGF0YS1jZWxsLXNlbWFudGljc1xuICAgICAgICAgKiBBIGhlYWRlciBjZWxsIGFuY2hvcmVkIGF0IHRoZSBzbG90IHdpdGggY29vcmRpbmF0ZSAoeCwgeSkgd2l0aCB3aWR0aCB3aWR0aCBhbmQgaGVpZ2h0IGhlaWdodCBpcyBcbiAgICAgICAgICogc2FpZCB0byBiZSBhIGNvbHVtbiBoZWFkZXIgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgdHJ1ZTpcbiAgICAgICAgICogKiBUaGUgY2VsbCdzIHNjb3BlIGF0dHJpYnV0ZSBpcyBpbiB0aGUgY29sdW1uIHN0YXRlLCBvclxuICAgICAgICAgKiAqIFRoZSBjZWxsJ3Mgc2NvcGUgYXR0cmlidXRlIGlzIGluIHRoZSBhdXRvIHN0YXRlLCBhbmQgdGhlcmUgYXJlIG5vIGRhdGEgY2VsbHMgaW4gYW55IG9mIFxuICAgICAgICAgKiAgIHRoZSBjZWxscyBjb3ZlcmluZyBzbG90cyB3aXRoIHktY29vcmRpbmF0ZXMgeSAuLiB5K2hlaWdodC0xLlxuICAgICAgICAgKiBBIGhlYWRlciBjZWxsIGFuY2hvcmVkIGF0IHRoZSBzbG90IHdpdGggY29vcmRpbmF0ZSAoeCwgeSkgd2l0aCB3aWR0aCB3aWR0aCBhbmQgaGVpZ2h0IGhlaWdodCBpc1xuICAgICAgICAgKiBzYWlkIHRvIGJlIGEgcm93IGhlYWRlciBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSB0cnVlOlxuICAgICAgICAgKiAqIFRoZSBjZWxsJ3Mgc2NvcGUgYXR0cmlidXRlIGlzIGluIHRoZSByb3cgc3RhdGUsIG9yXG4gICAgICAgICAqICogVGhlIGNlbGwncyBzY29wZSBhdHRyaWJ1dGUgaXMgaW4gdGhlIGF1dG8gc3RhdGUsIHRoZSBjZWxsIGlzIG5vdCBhIGNvbHVtbiBoZWFkZXIsIGFuZCB0aGVyZSBhcmVcbiAgICAgICAgICogICBubyBkYXRhIGNlbGxzIGluIGFueSBvZiB0aGUgY2VsbHMgY292ZXJpbmcgc2xvdHMgd2l0aCB4LWNvb3JkaW5hdGVzIHggLi4geCt3aWR0aC0xLlxuICAgICAgICAgKi9cbiAgICAgICAgLy8gTm90ZTogYXV0byBpcyBkZWZhdWx0IHNjb3BlXG5cbiAgICAgICAgLy8gRWFzaWVzdCBhbnN3ZXIgaXMgaWYgc2NvcGUgaXMgc3BlY2lmaWVkXG4gICAgICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZShcInNjb3BlXCIpKSB7XG4gICAgICAgICAgICBsZXQgc2NvcGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcInNjb3BlXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBpZiAoc2NvcGUgPT09IFwicm93XCIgfHwgc2NvcGUgPT09ICdyb3dncm91cCcpIHJldHVybiBcInJvd1wiO1xuICAgICAgICAgICAgaWYgKHNjb3BlID09PSBcImNvbFwiIHx8IHNjb3BlID09PSAnY29sZ3JvdXAnKSByZXR1cm4gXCJjb2x1bW5cIjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNjb3BlIGlzIGF1dG8sIGRlZmF1bHQgKHdpdGhvdXQgYSBzY29wZSkgb3IgaW52YWxpZCB2YWx1ZS5cbiAgICAgICAgLy8gaWYgYWxsIHRoZSBzaWJsaW5nIGVsZW1lbnRzIGFyZSB0aCwgdGhlbiByZXR1cm4gXCJjb2x1bW5oZWFkZXJcIiBcbiAgICAgICAgdmFyIHNpYmxpbmdzID0gWy4uLmVsZW1lbnQucGFyZW50RWxlbWVudC5jaGlsZHJlbl0uZmlsdGVyKG5vZGUgPT4gbm9kZS5ub2RlVHlwZSA9PT0gMSAmJiBub2RlLnRhZ05hbWUudG9Mb3dlckNhc2UoKSAhPSBcInRoXCIpO1xuICAgICAgICBpZiAoc2libGluZ3MgPT09IG51bGwgfHwgc2libGluZ3MubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIFwiY29sdW1uXCI7XG4gICAgICAgIGVsc2UgcmV0dXJuIFwicm93XCI7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRDb250cm9sT2ZMYWJlbChub2RlOiBOb2RlKSB7XG4gICAgICAgIC8vIEhhbmRsZSB0aGUgZWFzeSBjYXNlIG9mIGxhYmVsIC0+IGZvclxuICAgICAgICBjb25zdCBsYWJlbEFuY2VzdG9yID0gQ29tbW9uVXRpbC5nZXRBbmNlc3Rvcihub2RlLCBcImxhYmVsXCIpO1xuICAgICAgICBpZiAobGFiZWxBbmNlc3RvciAmJiBsYWJlbEFuY2VzdG9yLmhhc0F0dHJpYnV0ZShcImZvclwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIEZyYWdtZW50VXRpbC5nZXRCeUlkKG5vZGUsIGxhYmVsQW5jZXN0b3IuZ2V0QXR0cmlidXRlKFwiZm9yXCIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENyZWF0ZSBhIGRpY3Rpb25hcnkgY29udGFpbmluZyBpZHMgb2YgcGFyZW50IG5vZGVzXG4gICAgICAgIGNvbnN0IGlkRGljdCA9IHt9O1xuICAgICAgICBsZXQgcGFyZW50V2FsayA9IG5vZGU7XG4gICAgICAgIHdoaWxlIChwYXJlbnRXYWxrKSB7XG4gICAgICAgICAgICBpZiAocGFyZW50V2Fsay5ub2RlVHlwZSA9PT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFuY2VzdG9yID0gcGFyZW50V2FsayBhcyBFbGVtZW50O1xuICAgICAgICAgICAgICAgIGlmIChhbmNlc3Rvci5oYXNBdHRyaWJ1dGUoXCJpZFwiKSkge1xuICAgICAgICAgICAgICAgICAgICBpZERpY3RbYW5jZXN0b3IuZ2V0QXR0cmlidXRlKFwiaWRcIildID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYXJlbnRXYWxrID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUocGFyZW50V2Fsayk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFYXJseSByZXR1cm4gaWYgbm8gYW5jZXN0b3IgSURzIGZvdW5kXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhpZERpY3QpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYWNoZSBhcmlhLWxhYmVsbGVkYnkgYXR0cmlidXRlIGlmIG5vZGUgaXMgYW4gZWxlbWVudFxuICAgICAgICBjb25zdCBub2RlQXJpYUxhYmVsbGVkQnkgPSBub2RlLm5vZGVUeXBlID09PSAxID8gKG5vZGUgYXMgRWxlbWVudCkuZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpIDogbnVsbDtcblxuICAgICAgICAvLyBJdGVyYXRlIHRocm91Z2ggY29udHJvbHMgdGhhdCB1c2UgYXJpYS1sYWJlbGxlZGJ5IGFuZCBzZWUgaWYgYW55IG9mIHRoZW0gcmVmZXJlbmNlIG9uZSBvZiBteSBhbmNlc3RvciBpZHNcbiAgICAgICAgY29uc3QgaW5wdXRzVXNpbmdMYWJlbGxlZEJ5ID0gQ2FjaGVVdGlsLmdldFNldENhY2hlKFxuICAgICAgICAgICAgbm9kZS5vd25lckRvY3VtZW50LCBcbiAgICAgICAgICAgIFwiQ29tbW9uVXRpbDo6Z2V0Q29udHJvbE9mTGFiZWxcIiwgXG4gICAgICAgICAgICAoKSA9PiAgbm9kZS5vd25lckRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCIqW2FyaWEtbGFiZWxsZWRieV1cIilcbiAgICAgICAgKTtcblxuICAgICAgICBmb3IgKGxldCBpZHggPSAwOyBpZHggPCBpbnB1dHNVc2luZ0xhYmVsbGVkQnkubGVuZ3RoOyArK2lkeCkge1xuICAgICAgICAgICAgY29uc3QgaW5wdXRVc2luZ0xhYmVsbGVkQnkgPSBpbnB1dHNVc2luZ0xhYmVsbGVkQnlbaWR4XTtcbiAgICAgICAgICAgIGNvbnN0IGFyaWFMYWJlbGxlZEJ5ID0gaW5wdXRVc2luZ0xhYmVsbGVkQnkuZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpO1xuICAgICAgICAgICAgY29uc3Qgc3AgPSBhcmlhTGFiZWxsZWRCeS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIHNwKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlkIGluIGlkRGljdCAmJiAhQ29tbW9uVXRpbC5pc0lkUmVmZXJUb1NlbGYobm9kZSwgbm9kZUFyaWFMYWJlbGxlZEJ5KSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5wdXRVc2luZ0xhYmVsbGVkQnk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRmluZCB0aGUgY2FzZXMgd2hlcmUgd2UncmUgd2l0aGluIGFuIGFyaWEgbGFiZWxsZWRieVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBjaGVja2luZyBpZiB0aGUgbm9kZSB0aGF0IGlzIHByb3ZpZWQgaXNcbiAgICAgKiBkaXNhYmxlZCBvciBub3QuIEZvbGxvd2luZyBpcyBob3cgdGhlIGNoZWNrIGlzIHBlcmZvcm1lZDpcbiAgICAgKiAgICAxLiBDaGVjayBpZiB0aGUgY3VycmVudCBub2RlIGlzIGRpc2FibGVkIHdpdGggdGhlIGZvbGxvd2luZyBvcHRpb25zOlxuICAgICAqICAgICAgIGF0dHJpYnV0ZSAtLT4gZGlzYWJsZWRcbiAgICAgKiAgICAgICAgIEFsc28gbmVlZHMgdG8gYmUgXCJidXR0b25cIiwgXCJpbnB1dFwiLCBcInNlbGVjdFwiLCBcInRleHRhcmVhXCIsIFwib3B0Z3JvdXBcIiwgXCJvcHRpb25cIixcbiAgICAgKiAgICAgICAgIFwibWVudWl0ZW1cIiwgXCJmaWVsZHNldFwiIG5vZGVzIChpbiBhcnJheSBlbGVtZW50c0FsbG93ZWREaXNhYmxlZClcbiAgICAgKiAgICAgICBhdHRyaWJ1dGUgLS0+IGFyaWEtZGlzYWJsZWQ9XCJ0cnVlXCJcbiAgICAgKiAgICAyLiBDaGVjayBpZiBhbnkgb2YgdGhlIGN1cnJlbnQgbm9kZXMgcGFyZW50cyBhcmUgZGlzYWJsZWQgd2l0aCB0aGUgc2FtZVxuICAgICAqICAgICAgIG9wdGlvbnMgbGlzdGVkIGluIDEuXG4gICAgICpcbiAgICAgKiAgICBOb3RlOiBJZiBlaXRoZXIgY3VycmVudCBub2RlIG9yIGFueSBvZiB0aGUgcGFyZW50IG5vZGVzIGFyZSBkaXNhYmxlZCB0aGVuIHRoaXNcbiAgICAgKiAgICAgICAgICBmdW5jdGlvbiB3aWxsIHJldHVybiB0cnVlIChub2RlIGlzIGRpc2FibGVkKS5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtIVE1MRWxlbWVudH0gbm9kZSAtIFRoZSBub2RlIHdoaWNoIHNob3VsZCBiZSBjaGVja2VkIGlmIGl0IGlzIGRpc2FibGVkIG9yIG5vdC5cbiAgICAgKiBAcmV0dXJuIHtib29sfSB0cnVlIGlmIHRoZSBub2RlIGlzIGRpc2FibGVkLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgaXNOb2RlRGlzYWJsZWQobm9kZSkge1xuXG4gICAgICAgIC8vIFNldCBQVF9OT0RFX0RJU0FCTEVEIHRvIGZhbHNlIGZvciBhbGwgdGhlIG5vZGVzLCBiZWZvcmUgdGhlIGNoZWNrIGFuZCB0aGlzIHdpbGwgYmUgY2hhbmdlZCB0b1xuICAgICAgICAvLyB0cnVlIHdoZW4gd2UgZGV0ZWN0IHRoYXQgdGhlIG5vZGUgaXMgZGlzYWJsZWQuIFdlIGhhdmUgdG8gc2V0IGl0IHRvIGZhbHNlIHNvIHRoYXQgd2Uga25vd1xuICAgICAgICAvLyB0aGUgbm9kZSBoYXMgYWxyZWFkeSBiZWVuIGNoZWNrZWQuIE9ubHkgc2V0IGl0IHRvIGZhbHNlIGlmIHRoZSBzZXR0aW5nIGlzIHVuZGVmaW5lZCBvciBudWxsXG4gICAgICAgIC8vIGFzIGlmIGl0IGlzIGRlZmluZWQgd2UgZG8gbm90IHduYXQgdG8gcmVzZXQgaXQuIEFzIGlmIGl0IGlzIHRydWUgdGhlbiB3ZSBzaG91bGQgbWFrZSB1c2Ugb2YgaXRcbiAgICAgICAgLy8gdG8gc3BlZWQgdXAgdGhlIGNoZWNrLlxuICAgICAgICBsZXQgUFRfTk9ERV9ESVNBQkxFRCA9IENhY2hlVXRpbC5nZXRDYWNoZShub2RlLCBcIlBUX05PREVfRElTQUJMRURcIiwgdW5kZWZpbmVkKTtcbiAgICAgICAgaWYgKHR5cGVvZiBQVF9OT0RFX0RJU0FCTEVEICE9PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gUFRfTk9ERV9ESVNBQkxFRDtcbiAgICAgICAgUFRfTk9ERV9ESVNBQkxFRCA9IGZhbHNlO1xuXG4gICAgICAgIC8vIENoZWNrIHRoZSBub2RlVHlwZSBvZiB0aGlzIG5vZGUsIGlmIHRoaXMgbm9kZSBpcyBhIHRleHQgbm9kZSB0aGVuXG4gICAgICAgIC8vIHdlIGdldCB0aGUgcGFyZW50bm9kZSBhbmQgc2V0IHRoYXQgYXMgdGhlIG5vZGUgYXMgYSB0ZXh0IG5vZGVzLFxuICAgICAgICAvLyBkaXNhYmxlZCBpcyBkaXJlY3RseSByZWxhdGVkIHRvIHRoZSBwYXJlbnQgbm9kZS5cbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDMpIHtcbiAgICAgICAgICAgIG5vZGUgPSBET01XYWxrZXIucGFyZW50Tm9kZShub2RlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFZhcmlhYmxlIERlY2xhcmF0aW9uXG4gICAgICAgIGxldCBub2RlTmFtZSA9IG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAvLyBHZXQgdGhlIGRpc2FibGVkIGVsZW1lbnQgcHJvcGVydHksIGRpc2FibGVkIGFuZCBhcmlhLWRpc2FibGVkIGF0dHJpYnV0ZSBhbmQgY2hlY2sgdGhhdCBpdCBpcyB0cnVlXG4gICAgICAgIGxldCBkaXNhYmxlZEF0dHJpYnV0ZSA9IG5vZGUuaGFzQXR0cmlidXRlKFwiZGlzYWJsZWRcIik7XG4gICAgICAgIGxldCBkaXNhYmxlZFByb3BlcnR5Q3VzdG9tID0gUFRfTk9ERV9ESVNBQkxFRDtcbiAgICAgICAgbGV0IGFyaWFEaXNhYmxlZEF0dHJpYnV0ZSA9IG5vZGUuaGFzQXR0cmlidXRlKCdhcmlhLWRpc2FibGVkJykgJiYgbm9kZS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWRpc2FibGVkXCIpID09PSAndHJ1ZSc7XG5cbiAgICAgICAgLy8gSWYgdGhpcyBub2RlIGhhcyBkaXNhYmxlZCBhdHRyaWJ1dGUgYW5kIHRoZSBub2RlIGFsbG93cyBkaXNhYmxlZCBhdHRyaWJ1dGUsIHRoZW4gcmV0dXJuIHRydWUuXG4gICAgICAgIC8vIERpc2FibGVkIGF0dHJpYnV0ZSBpcyBvbmx5IGFsbG93ZWQgb24gXCJidXR0b25cIiwgXCJpbnB1dFwiLCBcInNlbGVjdFwiLCBcInRleHRhcmVhXCIsIFwib3B0Z3JvdXBcIiwgXCJvcHRpb25cIiwgXCJtZW51aXRlbVwiLCBcImZpZWxkc2V0XCJcbiAgICAgICAgLy8gSW4gdGhlIGNhc2UgYXJpYS1kaXNhYmxlZCBpcyBzZXQgdG8gdHJ1ZSwgdGhlbiBhbHNvIHJldHVybiB0cnVlXG4gICAgICAgIGlmIChkaXNhYmxlZFByb3BlcnR5Q3VzdG9tIHx8IChkaXNhYmxlZEF0dHJpYnV0ZSAmJiBBUklBRGVmaW5pdGlvbnMuZWxlbWVudHNBbGxvd2VkRGlzYWJsZWQuaW5kZXhPZihub2RlTmFtZSkgPiAtMSkgfHwgYXJpYURpc2FibGVkQXR0cmlidXRlKSB7XG4gICAgICAgICAgICBQVF9OT0RFX0RJU0FCTEVEID0gdHJ1ZTtcbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShub2RlLCBcIlBUX05PREVfRElTQUJMRURcIiwgUFRfTk9ERV9ESVNBQkxFRCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdldCB0aGUgcGFyZW50Tm9kZSBmb3IgdGhpcyBub2RlLCBiZWN1YXNlIHdlIGhhdmUgdG8gY2hlY2sgYWxsIHBhcmVudHMgdG8gbWFrZSBzdXJlIHRoZXkgZG8gbm90IGhhdmVcbiAgICAgICAgLy8gZGlzYWJsZWQgYXR0cmlidXRlLiBPbmx5IGtlZXAgY2hlY2tpbmcgdW50aWwgd2UgYXJlIGFsbCB0aGUgd2F5IGJhY2sgdG8gdGhlIHBhcmVudE5vZGVcbiAgICAgICAgLy8gZWxlbWVudC5cbiAgICAgICAgbGV0IHBhcmVudEVsZW1lbnQgPSBET01XYWxrZXIucGFyZW50Tm9kZShub2RlKTtcblxuICAgICAgICAvLyBJZiB0aGUgcGFyZW50IG5vZGUgZXhpc3RzIGFuZCB0aGUgbm9kZXR5cGUgaXMgZWxlbWVudCAoMSksIHRoZW4gcnVuIHJlY3Vyc2l2ZSBjYWxsIHRvIHBlcmZvcm0gdGhlIGNoZWNrXG4gICAgICAgIC8vIGFsbCB0aGUgd2F5IHVwIHRvIHRoZSB2ZXJ5IHBhcmVudCBub2RlLiBVc2UgcmVjdXJzaXZlIGNhbGwgaGVyZSBpbnN0ZWFkIG9mIGEgd2hpbGUgbG9vcCBzbyB0aGF0IHdlIGRvIG5vdFxuICAgICAgICAvLyBoYXZlIHRvIGR1cGxpY2F0ZSB0aGUgbG9naWMgZm9yIGNoZWNraW5nIGlmIHRoZSBub2RlIGlzIGRpc2FibGVkIG9yIG5vdCBmb3IgYWxsIHRoZSBwYXJlbnRzIHN0YXJ0aW5nIHdpdGhcbiAgICAgICAgLy8gY2hpbGQgbm9kZS5cbiAgICAgICAgaWYgKHBhcmVudEVsZW1lbnQgIT0gbnVsbCAmJiBwYXJlbnRFbGVtZW50Lm5vZGVUeXBlID09PSAxKSB7XG4gICAgICAgICAgICAvLyBDaGVjayB1cHdhcmRzIHJlY3Vyc2l2ZWx5LCBhbmQgc2F2ZSB0aGUgcmVzdWx0cyBpbiBhbiB2YXJpYWJsZVxuICAgICAgICAgICAgbGV0IG5vZGVEaXNhYmxlZCA9IENvbW1vblV0aWwuaXNOb2RlRGlzYWJsZWQocGFyZW50RWxlbWVudCk7XG5cbiAgICAgICAgICAgIC8vIElmIHRoZSBub2RlIGlzIGZvdW5kIHRvIGJlIGRpc2FibGVkIHRoZW4gYWRkIHRoZSBjdXN0b20gUFRfTk9ERV9ESVNBQkxFRCB0byB0cnVlLlxuICAgICAgICAgICAgLy8gc28gdGhhdCB3ZSBjYW4gdXNlIHRoaXMgbmV4dCB0aW1lLCB0byBxdWlja2x5IGRldGVybWluZSBpZiBub2RlIGlzIGRpc2FibGVkIG9yIG5vdC5cbiAgICAgICAgICAgIC8vIFRoaXMgaXMgZXh0cmEgcGVyY2F1dGlvbiwgdGhlIGlzTm9kZURpc2FibGVkIGZ1bmN0aW9uIGFscmVhZHkgc2V0cyB0aGlzLlxuICAgICAgICAgICAgaWYgKG5vZGVEaXNhYmxlZCkge1xuICAgICAgICAgICAgICAgIFBUX05PREVfRElTQUJMRUQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBDaGVjayB1cHdhcmRzIHJlY3Vyc2l2ZWx5XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0RJU0FCTEVEXCIsIFBUX05PREVfRElTQUJMRUQpO1xuICAgICAgICAgICAgcmV0dXJuIG5vZGVEaXNhYmxlZDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJldHVybiBmYWxzZSAobm9kZSBpcyBub3QgZGlzYWJsZWQpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmUgaWYgaGlkZGVuIGNvbnRlbnQgc2hvdWxkIGJlIGNoZWNrZWRcbiAgICAgKiBpbiBydWxlcy5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBub2RlIC0gQSBub2RlIHNvIHRoYXQgdGhlIGRvY3VtZW50IGNhbiBiZSBhY2Nlc3NlZCB0byBjaGVjayBmb3IgdGhlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb24uIENhbiBiZSBkb2N1bWVudCBlbGVtZW50IG9yIGEgc2ltcGxlIG5vZGUgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJuIHtib29sfSB0cnVlIGlmIGhpZGRlbiBjb250ZW50IHNob3VsZCBiZSBjaGVja2VkLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgc2hvdWxkQ2hlY2tIaWRkZW5Db250ZW50KG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIGlmIG5vZGUgc2hvdWxkIGJlIHNraXBwZWQgZnJvbSBjaGVja2luZyBvciBub3QsIGJhc2VkXG4gICAgICogb24gdGhlIENoZWNrIEhpZGRlbiBDb250ZW50IHNldHRpbmdzIGFuZCBpZiB0aGUgbm9kZSBpcyB2aXNpYmxlIG9yIG5vdC5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBub2RlIC0gTm9kZSB0byBjaGVjayBpZiBpdCBpcyB2aXNpYmxlIG9yIG5vdCBiYXNlZCBvbiB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnRcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmcuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtib29sfSB0cnVlIGlmIG5vZGUgc2hvdWxkIGJlIHNraXBwZWQsIGZhbHNlIG90aGVyd2lzZVxuICAgICAqXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBzaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKG5vZGUpIHtcbiAgICAgICAgLy8gRm9sbG93aW5nIGFyZSB0aGUgc3RlcHMgdGhhdCBhcmUgZXhlY3V0ZWQgYXQgdGhpcyBzdGFnZSB0byBkZXRlcm1pbmUgaWYgdGhlIG5vZGUgc2hvdWxkIGJlIGNsYXNzaWZpZWQgYXMgaGlkZGVuXG4gICAgICAgIC8vIG9yIG5vdC5cbiAgICAgICAgLy8gIDEuIE9ubHkgcnVuIGlzTm9kZVZpc2libGUgY2hlY2sgaWYgaGlkZGVuIGNvbnRlbnQgc2hvdWxkIE5PVCBiZSBjaGVja2VkLiBJbiB0aGUgY2FzZSB0aGF0IGhpZGRlbiBjb250ZW50IGlzIHRvLFxuICAgICAgICAvLyAgICAgYmUgc2Nhbm5lZCB0aGVuIHdlIGNhbiBqdXN0IHNjYW4gZXZlcnl0aGluZyBhcyBub3JtYWwuIEluIHRoZSBjYXNlIHRoYXQgdGhlIGN1cnJlbnQgbm9kZSBpcyBoaWRkZW4gd2VcbiAgICAgICAgLy8gICAgIHJldHVybiB0cnVlIHRvIGlkZW50aWZ5IHRoYXQgdGhlIG5vZGUgc2hvdWxkIG5vdCBiZSBzY2FubmVkL2FkZGVkIHRvIGFueSBoYXNoL2FycmF5LlxuICAgICAgICAvL1xuICAgICAgICAvLyBOb3RlOiBUaGUgaWYgY29uZGl0aW9ucyB1c2VzIHNob3J0LWNpcmN1aXRpbmcgc28gaWYgdGhlIGZpcnN0IGNvbmRpdGlvbiBpcyBub3QgdHJ1ZSBpdCB3aWxsIG5vdCBjaGVjayB0aGUgbmV4dCBvbmUsXG4gICAgICAgIC8vICAgICAgIHNvIG9uIGFuZCBzbyBmb3J0aC5cbiAgICAgICAgaWYgKCFDb21tb25VdGlsLnNob3VsZENoZWNrSGlkZGVuQ29udGVudChub2RlKSAmJiAhVmlzVXRpbC5pc05vZGVWaXNpYmxlKG5vZGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGlzZm9jdXNhYmxlQnlEZWZhdWx0KG5vZGUpIHtcbiAgICAgICAgdmFyIGZvY3VzYWJsZUVsZW1lbnRzID0gWydpbnB1dCcsICdzZWxlY3QnLCAnYnV0dG9uJywgJ3RleHRhcmVhJywgJ29wdGlvbicsICdhcmVhJ107XG4gICAgICAgIGlmIChub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiYVwiICYmIENvbW1vblV0aWwuaGFzQXR0cmlidXRlKG5vZGUsICdocmVmJykpIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAobm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImFyZWFcIiAmJiBDb21tb25VdGlsLmhhc0F0dHJpYnV0ZShub2RlLCAnaHJlZicpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKGZvY3VzYWJsZUVsZW1lbnRzLmluZGV4T2Yobm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSAhPT0gLTEpIHJldHVybiB0cnVlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBjaGVjayBpZiBhIG5vbi10YWJhYmxlIG5vZGUgaGFzIHZhbGlkIHRhYmFibGUgY29udGVudC5cbiAgICAgKiBJZiBpdCBpcyB0YWJhYmxlICh0aGUgdGFiaW5kZXggaXMgbm90IHNwZWljaWZpZWQgb3IgaXMgbm90IC0xKSwgcmV0dXJucyBmYWxzZTtcbiAgICAgKiBJZiBpdCBpcyBub24tdGFiYWJsZSwgYnV0IGEgY2hpbGQgaXMgdGFiYWJsZSBhbmQgZG9lcyBub3QgaGF2ZSBlbGVtZW50IGNvbnRlbnQsIHJldHVybnMgZmFsc2U7XG4gICAgICogT3RoZXJ3aXNlLCByZXR1cm5zIHRydWUuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBub25UYWJhYmxlQ2hpbGRDaGVjayhlbGVtZW50OiBFbGVtZW50KTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghZWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSB8fFxuICAgICAgICAgICAgKHBhcnNlSW50KGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwidGFiaW5kZXhcIikpICE9IC0xKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGxldCBudyA9IG5ldyBET01XYWxrZXIoZWxlbWVudCk7XG4gICAgICAgIHdoaWxlIChudy5uZXh0Tm9kZSgpKSB7XG4gICAgICAgICAgICBsZXQgY2hpbGQgPSBudy5lbGVtKCk7XG4gICAgICAgICAgICBpZiAoY2hpbGQgPT09IG51bGwpIHsgLy8gVGV4dCBub2RlLiB1c3VhbGx5IGlzIGEgY2FydHJpZGdlIHJldHVybi5cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjaGlsZC5oYXNBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSAmJlxuICAgICAgICAgICAgICAgIChwYXJzZUludChjaGlsZC5nZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSkgIT0gLTEpICYmXG4gICAgICAgICAgICAgICAgIUNvbW1vblV0aWwuaGFzSW5uZXJDb250ZW50KGNoaWxkKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGhhc0F0dHJpYnV0ZShlbGVtZW50LCBhdHRyaWJ1dGVOYW1lKSB7XG4gICAgICAgIHZhciBoYXNBdHRyaWJ1dGUgPSBmYWxzZTtcbiAgICAgICAgaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKSB7XG4gICAgICAgICAgICBoYXNBdHRyaWJ1dGUgPSBlbGVtZW50Lmhhc0F0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTtcbiAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50LmF0dHJpYnV0ZXMgJiYgZWxlbWVudC5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSkge1xuICAgICAgICAgICAgdmFyIGF0dHIgPSBlbGVtZW50LmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKGF0dHJpYnV0ZU5hbWUpO1xuICAgICAgICAgICAgaGFzQXR0cmlidXRlID0gYXR0ciAmJiBhdHRyLnNwZWNpZmllZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGFzQXR0cmlidXRlO1xuICAgIH1cblxuICAgIC8vIHRydW5jYXRlIHRoZSBnaXZlbiB0ZXh0IHRvIGEgZ2l2ZW4gbnVtYmVyIG9mIGNoYXJhY3RlcnNcbiAgICAvLyByZXR1cm4gdHJ1bmNhdGVkIHRleHQgdG8gMTUwIGNoYXJzLCBzYW1lIHdpdGggdGhlIG1lZGlhX2FsdF9icmllZiBydWxlXG4gICAgcHVibGljIHN0YXRpYyB0cnVuY2F0ZVRleHQodGV4dDogc3RyaW5nLCBsZW4gPSAxNTApIHtcbiAgICAgICAgaWYgKCF0ZXh0KSByZXR1cm4gdGV4dDtcbiAgICAgICAgdGV4dCA9IHRleHQudHJpbSgpO1xuICAgICAgICBpZiAodGV4dC5sZW5ndGggPiBsZW4pXG4gICAgICAgICAgICByZXR1cm4gdGV4dC5zdWJzdHJpbmcoMCwgbGVuLTEpICtcIi4uLlwiO1xuICAgICAgICByZXR1cm4gdGV4dDtcblxuICAgIH1cblxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMC0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuL1Zpc1V0aWxcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4vQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi9Db21tb25VdGlsXCI7XG5pbXBvcnQge1J1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG5leHBvcnQgY2xhc3MgVGFibGVVdGlsIHtcblxuICAgIHB1YmxpYyBzdGF0aWMgaXNEYXRhVGFibGUodGFibGVOb2RlKSB7XG4gICAgICAgIHJldHVybiAhKEFyaWFVdGlsLmhhc1JvbGUodGFibGVOb2RlLCBcIm5vbmVcIikgfHwgQXJpYVV0aWwuaGFzUm9sZSh0YWJsZU5vZGUsIFwicHJlc2VudGF0aW9uXCIpKTtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIEEgY29tcGxleCBkYXRhIHRhYmxlIGlzIGEgZGF0YSB0YWJsZSB3aXRoIGFueSBvZiB0aGUgZm9sbG93aW5nIGNoYXJhY3RlcmlzdGljczpcbiAgICAgKlxuICAgICAqIGEgdGhlYWQgZWxlbWVudCB0aGF0IGNvbnRhaW5zIHR3byBvciBtb3JlIHRyIGVsZW1lbnRzXG4gICAgICogYSB0YWJsZSB3aXRoIG1vcmUgdGhhbiBvbmUgdGhlYWQgZWxlbWVudFxuICAgICAqIGEgdGFibGUgd2l0aCB0d28gb3IgbW9yZSB0ciBlbGVtZW50cyB0aGF0IGNvbnRhaW4gb25seSB0aCBlbGVtZW50c1xuICAgICAqIGEgdGggb3IgdGQgZWxlbWVudCB3aXRoIGEgcm93c3BhbiBvciBjb2xzcGFuIGF0dHJpYnV0ZVxuICAgICAqIGEgdHIgZWxlbWVudCB0aGF0IGNvbnRhaW5zIGF0IGxlYXN0IG9uZSB0ZCBlbGVtZW50IGFuZCB0d28gb3IgbW9yZSB0aCBlbGVtZW50c1xuICAgICAqIGEgdGFibGUgd2l0aCBoZWFkZXJzIG5vdCBsb2NhdGVkIGluIHRoZSBmaXJzdCByb3cgb3IgZmlyc3QgY29sdW1uXG4gICAgICogYSB0ZCBlbGVtZW50IHdpdGggYSBoZWFkZXJzIGF0dHJpYnV0ZSB2YWx1ZSB0aGF0IGNvbnRhaW5zIG1vcmUgdGhhbiB0d28gSURSRUZzXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpc0NvbXBsZXhEYXRhVGFibGUodGFibGUpIHtcblxuICAgICAgICBpZiAoXCJBcmlhVXRpbF9pc0NvbXBsZXhEYXRhVGFibGVcIiBpbiB0YWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuICEhdGFibGUuQXJpYVV0aWxfaXNDb21wbGV4RGF0YVRhYmxlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGlzQ29tcGxleFRhYmxlID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKHRhYmxlICYmIFRhYmxlVXRpbC5pc0RhdGFUYWJsZSh0YWJsZSkpIHtcblxuICAgICAgICAgICAgbGV0IHRoTm9kZXMgPSBudWxsLFxuICAgICAgICAgICAgICAgIHRkTm9kZXMgPSBudWxsO1xuICAgICAgICAgICAgbGV0IHRyTm9kZXMgPSB0YWJsZS5nZXRFbGVtZW50c0J5VGFnTmFtZShcInRyXCIpO1xuICAgICAgICAgICAgbGV0IHRyTm9kZUNvdW50ID0gdHJOb2Rlcy5sZW5ndGg7XG4gICAgICAgICAgICBsZXQgdGROb2RlQ291bnQgPSAwLFxuICAgICAgICAgICAgICAgIHRoTm9kZUNvdW50ID0gMCxcbiAgICAgICAgICAgICAgICB0ck5vZGVzSGF2aW5nT25seVRoTm9kZXMgPSAwO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgIWlzQ29tcGxleFRhYmxlICYmIGkgPCB0ck5vZGVDb3VudDsgKytpKSB7XG5cbiAgICAgICAgICAgICAgICB0aE5vZGVzID0gdHJOb2Rlc1tpXS5nZXRFbGVtZW50c0J5VGFnTmFtZShcInRoXCIpO1xuICAgICAgICAgICAgICAgIHRkTm9kZXMgPSB0ck5vZGVzW2ldLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwidGRcIik7XG4gICAgICAgICAgICAgICAgdGhOb2RlQ291bnQgPSB0aE5vZGVzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICB0ZE5vZGVDb3VudCA9IHRkTm9kZXMubGVuZ3RoO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRkTm9kZUNvdW50ICE9PSAwKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gYSB0ciBlbGVtZW50IHRoYXQgY29udGFpbnMgYXQgbGVhc3Qgb25lIHRkIGVsZW1lbnQgYW5kIHR3byBvciBtb3JlIHRoIGVsZW1lbnRzO1xuICAgICAgICAgICAgICAgICAgICBpc0NvbXBsZXhUYWJsZSA9IHRoTm9kZUNvdW50ID4gMTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBhIHRoIGVsZW1lbnQgd2l0aCBhIHJvd3NwYW4gb3IgY29sc3BhbiBhdHRyaWJ1dGVcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7ICFpc0NvbXBsZXhUYWJsZSAmJiBqIDwgdGhOb2RlQ291bnQ7ICsraikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNDb21wbGV4VGFibGUgPSAoKHRoTm9kZXNbal0uaGFzQXR0cmlidXRlKFwicm93c3BhblwiKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoTm9kZXNbal0uaGFzQXR0cmlidXRlKFwiY29sc3BhblwiKSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tb25VdGlsLmdldEFuY2VzdG9yKHRoTm9kZXNbal0sIFwidGFibGVcIikgPT09IHRhYmxlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIGEgdGQgZWxlbWVudCB3aXRoIGEgcm93c3BhbiBvciBjb2xzcGFuIGF0dHJpYnV0ZVxuICAgICAgICAgICAgICAgICAgICAvLyBhIHRkIGVsZW1lbnQgd2l0aCBhIGhlYWRlcnMgYXR0cmlidXRlIHZhbHVlIHRoYXQgY29udGFpbnMgbW9yZSB0aGFuIHR3byBJRFJFRnNcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7ICFpc0NvbXBsZXhUYWJsZSAmJiBrIDwgdGROb2RlQ291bnQ7ICsraykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNDb21wbGV4VGFibGUgPSAoKHRkTm9kZXNba10uaGFzQXR0cmlidXRlKFwicm93c3BhblwiKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRkTm9kZXNba10uaGFzQXR0cmlidXRlKFwiY29sc3BhblwiKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0ZE5vZGVzW2tdLmhhc0F0dHJpYnV0ZShcImhlYWRlcnNcIikgJiYgQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKHRkTm9kZXNba10uZ2V0QXR0cmlidXRlKFwiaGVhZGVyc1wiKSkuc3BsaXQoXCIgXCIpLmxlbmd0aCA+IDIpKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwuZ2V0QW5jZXN0b3IodGROb2Rlc1trXSwgXCJ0YWJsZVwiKSA9PT0gdGFibGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIHR3byBvciBtb3JlIHRyIGVsZW1lbnRzIHRoYXQgY29udGFpbiBvbmx5IHRoIGVsZW1lbnRzXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aE5vZGVDb3VudCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICsrdHJOb2Rlc0hhdmluZ09ubHlUaE5vZGVzO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlzQ29tcGxleFRhYmxlID0gdHJOb2Rlc0hhdmluZ09ubHlUaE5vZGVzID09PSAyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFpc0NvbXBsZXhUYWJsZSkge1xuXG4gICAgICAgICAgICAgICAgbGV0IHRoZWFkTm9kZXMgPSB0YWJsZS5nZXRFbGVtZW50c0J5VGFnTmFtZShcInRoZWFkXCIpO1xuICAgICAgICAgICAgICAgIGxldCB0aGVhZE5vZGVzTGVuZ3RoID0gdGhlYWROb2Rlcy5sZW5ndGg7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhlYWROb2Rlc0xlbmd0aCA+IDApIHtcblxuICAgICAgICAgICAgICAgICAgICAvLyB0YWJsZSBoYXMgbW9yZSB0aGFuIG9uZSB0aGVhZCBlbGVtZW50XG4gICAgICAgICAgICAgICAgICAgIGlzQ29tcGxleFRhYmxlID0gdGhlYWROb2Rlc0xlbmd0aCA+IDE7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gYSB0aGVhZCBlbGVtZW50IHRoYXQgY29udGFpbnMgdHdvIG9yIG1vcmUgdHIgZWxlbWVudHNcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0NvbXBsZXhUYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNDb21wbGV4VGFibGUgPSB0aGVhZE5vZGVzWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwidHJcIikubGVuZ3RoID4gMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaXNDb21wbGV4VGFibGUgJiYgdHJOb2RlQ291bnQgIT09IDApIHtcbiAgICAgICAgICAgICAgICAvLyBhIHRhYmxlIHdpdGggaGVhZGVycyBub3QgbG9jYXRlZCBpbiB0aGUgZmlyc3Qgcm93IG9yIGZpcnN0IGNvbHVtblxuICAgICAgICAgICAgICAgIGlzQ29tcGxleFRhYmxlID0gdGhOb2RlQ291bnQgPiAwICYmICFUYWJsZVV0aWwudGFibGVIZWFkZXJFeGlzdHModGFibGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRhYmxlLkFyaWFVdGlsX2lzQ29tcGxleERhdGFUYWJsZSA9IGlzQ29tcGxleFRhYmxlO1xuXG4gICAgICAgIHJldHVybiBpc0NvbXBsZXhUYWJsZTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gdHJ1ZSBpZiBhIHRhYmxlIGNlbGwgaXMgaGlkZGVuIG9yIGNvbnRhaW4gbm8gZGF0YTogPHRkPjwvdGQ+XG4gICAgcHVibGljIHN0YXRpYyBpc1RhYmxlQ2VsbEVtcHR5KGNlbGwpIHtcbiAgICAgICAgaWYgKCFjZWxsIHx8ICFWaXNVdGlsLmlzTm9kZVZpc2libGUoY2VsbCkgfHwgY2VsbC5pbm5lckhUTUwucmVwbGFjZSgvJm5ic3A7L2csJyAnKS50cmltKCkubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgIFxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHRydWUgaWYgYSB0YWJsZSByb3cgaXMgaGlkZGVuIG9yIGNvbnRhaW4gbm8gZGF0YTogPHRyIC8+IG9yIDx0cj48dGQ+PC90ZD48dGQ+PC90ZD48L3RyPiBcbiAgICBwdWJsaWMgc3RhdGljIGlzVGFibGVSb3dFbXB0eShyb3cpIHtcbiAgICAgICAgaWYgKCFyb3cgfHwgIXJvdy5jZWxscyB8fCByb3cuY2VsbHMubGVuZ3RoID09PSAwIHx8ICFWaXNVdGlsLmlzTm9kZVZpc2libGUocm93KSlcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICBcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7IC8vZW1wdHlcbiAgICAgICAgZm9yIChsZXQgYz0wOyBwYXNzZWQgJiYgYyA8IHJvdy5jZWxscy5sZW5ndGg7IGMrKykge1xuICAgICAgICAgICAgbGV0IGNlbGwgPSByb3cuY2VsbHNbY107XG4gICAgICAgICAgICBwYXNzZWQgPSBUYWJsZVV0aWwuaXNUYWJsZUNlbGxFbXB0eShjZWxsKTsgICAgICAgICAgXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiBwYXNzZWQ7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHRydWUgaWYgYSB0YWJsZSdzIGhlYWRlciBpcyBpbiB0aGUgZmlyc3Qgcm93IG9yIGNvbHVtblxuICAgIHB1YmxpYyBzdGF0aWMgdGFibGVIZWFkZXJFeGlzdHMocnVsZUNvbnRleHQpIHtcblxuICAgICAgICBsZXQgcm93cyA9IHJ1bGVDb250ZXh0LnJvd3M7XG4gICAgICAgIGlmICghcm93cyB8fCByb3dzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIG5vdGUgdGhhdCB0YWJsZS5yb3dzIHJldHVybiBhbGwgYWxsIHRoZSByb3dzIGluIHRoZSB0YWJsZSwgXG4gICAgICAgIC8vIGluY2x1ZGluZyB0aGUgcm93cyBjb250YWluZWQgd2l0aGluIDx0aGVhZD4sIDx0Zm9vdD4sIGFuZCA8dGJvZHk+IGVsZW1lbnRzLiBcbiAgICAgICAgXG4gICAgICAgIC8vY2FzZSAxOiBoZWFkZXJzIGFyZSBpbiB0aGUgdmVyeSBmaXJzdCByb3cgd2l0aCBkYXRhIGluIHRib2R5IG9yIHRoZWFkLCBidXQgbm90IGluIHRmb290ICAgXG4gICAgICAgIC8vZ2V0IHRoZSBmaXJzdCByb3cgd2l0aCBkYXRhLCBpZ25vcmluZyB0aGUgcm93cyB3aXRoIG5vIGRhdGFcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGxldCBmaXJzdFJvdyA9IHJvd3NbMF07XG4gICAgICAgIGZvciAobGV0IHI9MDsgcGFzc2VkICYmIHIgPCByb3dzLmxlbmd0aDsgcisrKSB7XG4gICAgICAgICAgICBmaXJzdFJvdyA9IHJvd3Nbcl07XG4gICAgICAgICAgICAvLyBpZ25vcmUgdGhlIHJvd3MgZnJvbSB0Zm9vdFxuICAgICAgICAgICAgaWYgKGZpcnN0Um93LnBhcmVudE5vZGUgJiYgZmlyc3RSb3cucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAndGZvb3QnKSBjb250aW51ZTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcGFzc2VkID0gVGFibGVVdGlsLmlzVGFibGVSb3dFbXB0eShmaXJzdFJvdyk7ICAgICAgICAgIFxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvL3RhYmxlIGNvbnRhaW4gbm8gZGF0YTogIDx0YWJsZT48dHI+PHRkPjwvdGQ+PHRkPjwvdGQ+PC90cj48L3RhYmxlPiBcbiAgICAgICAgaWYgKHBhc3NlZClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGNlbGxzIHdpdGggZGF0YSBpbiB0aGUgZmlyc3QgZGF0YSByb3cgYXJlIGFsbCBUSCdzXG4gICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGZvciAobGV0IHI9MDsgcGFzc2VkICYmIHIgPCBmaXJzdFJvdy5jZWxscy5sZW5ndGg7IHIrKykge1xuICAgICAgICAgICAgbGV0IGNlbGwgPSBmaXJzdFJvdy5jZWxsc1tyXTtcbiAgICAgICAgICAgIHBhc3NlZCA9IFRhYmxlVXRpbC5pc1RhYmxlQ2VsbEVtcHR5KGNlbGwpIHx8IGNlbGwubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ3RoJzsgICAgICAgICAgXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmIChwYXNzZWQpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcblxuICAgICAgICAvLyBDYXNlIDI6IGhlYWRlcnMgYXJlIGluIHRoZSBmaXJzdCBjb2x1bW4gd2l0aCBkYXRhXG4gICAgICAgIC8vIEFzc3VtZSB0aGF0IHRoZSBmaXJzdCBjb2x1bW4gaGFzIGFsbCBUSCdzIG9yIGEgVEQgd2l0aG91dCBkYXRhIGluIHRoZSBmaXJzdCBjb2x1bW4uXG4gICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBwYXNzZWQgJiYgaSA8IHJvd3MubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIC8vIGlnbm9yZSB0aGUgcm93cyBmcm9tIHRmb290XG4gICAgICAgICAgICBpZiAocm93c1tpXS5wYXJlbnROb2RlICYmIHJvd3NbaV0ucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAndGZvb3QnKSBjb250aW51ZTtcblxuICAgICAgICAgICAgLy8gSWYgbm8gY2VsbHMgaW4gdGhpcyByb3csIG9yIG5vIGRhdGEgYXQgYWxsLCB0aGF0J3Mgb2theSB0b28uXG4gICAgICAgICAgICBwYXNzZWQgPSAhcm93c1tpXS5jZWxscyB8fFxuICAgICAgICAgICAgICAgIHJvd3NbaV0uY2VsbHMubGVuZ3RoID09PSAwIHx8XG4gICAgICAgICAgICAgICAgcm93c1tpXS5jZWxsc1swXS5pbm5lckhUTUwudHJpbSgpLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgICAgICAgICAgIHJvd3NbaV0uY2VsbHNbMF0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPSBcInRkXCI7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmIChwYXNzZWQpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIFxuICAgICAgICAvL2Nhc2UgMzogYWxsIHRkIGRhdGEgY2VsbHMgaGF2ZSBoZWFkZXJzIGF0dHJpYnV0ZXMgdGhhdCBwb2ludCB0byB0aGUgaWQgb2YgYSB0aCBlbGVtZW50IGluIHRoZSBzYW1lIHRhYmxlLiBcbiAgICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvdGFibGVzLmh0bWwjYXR0cmlidXRlcy1jb21tb24tdG8tdGQtYW5kLXRoLWVsZW1lbnRzXG4gICAgICAgIHBhc3NlZCA9IHRydWU7IFxuICAgICAgICBsZXQgdGhJZHMgPSBbXTtcbiAgICAgICAgbGV0IHRkSGVhZGVycyA9IFtdO1xuICAgICAgICBmb3IgKGxldCByPTA7IHBhc3NlZCAmJiByIDwgcm93cy5sZW5ndGg7IHIrKykge1xuICAgICAgICAgICAgbGV0IHJvdyA9IHJvd3Nbcl07IFxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGNlbGxzIHdpdGggZGF0YSBpbiB0aGUgbGFzdCBkYXRhIHJvdyBhcmUgYWxsIFRIJ3NcbiAgICAgICAgICAgIGZvciAobGV0IGM9MDsgYyA8IHJvdy5jZWxscy5sZW5ndGg7IGMrKykge1xuICAgICAgICAgICAgICAgIGxldCBjZWxsID0gcm93LmNlbGxzW2NdO1xuICAgICAgICAgICAgICAgIGlmIChUYWJsZVV0aWwuaXNUYWJsZUNlbGxFbXB0eShjZWxsKSkgY29udGludWU7IFxuICAgICAgICAgICAgICAgIGlmIChjZWxsLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICd0ZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjZWxsLmdldEF0dHJpYnV0ZSgnaGVhZGVycycpIHx8IGNlbGwuZ2V0QXR0cmlidXRlKCdoZWFkZXJzJykudHJpbSgpLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBDb21tb25VdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QoY2VsbC5nZXRBdHRyaWJ1dGUoJ2hlYWRlcnMnKS50cmltKCkuc3BsaXQoXCIgXCIpLCB0ZEhlYWRlcnMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2VsbC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAndGgnICYmIGNlbGwuZ2V0QXR0cmlidXRlKCdpZCcpICYmIGNlbGwuZ2V0QXR0cmlidXRlKCdpZCcpLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW0oY2VsbC5nZXRBdHRyaWJ1dGUoJ2lkJykudHJpbSgpLCB0aElkcyk7ICAgIFxuICAgICAgICAgICAgfSAgICAgIFxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZiAocGFzc2VkKSB7IC8vIGFsbCB0ZCBlbGVtZW50cyBoYXZlIGhlYWRlcnMsIHRvIGV4YW0gaWYgdGhlIGhlYWRlcnMgcG9pbnQgdG8gYSB0aCBpZFxuICAgICAgICAgICAgaWYgKHRoSWRzLmxlbmd0aCA+IDAgJiYgdGRIZWFkZXJzLmV2ZXJ5KGhlYWRlciA9PiB0aElkcy5pbmNsdWRlcyhoZWFkZXIpKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGlzTGF5b3V0VGFibGUodGFibGVOb2RlKSB7XG4gICAgICAgIHJldHVybiBBcmlhVXRpbC5oYXNSb2xlKHRhYmxlTm9kZSwgXCJwcmVzZW50YXRpb25cIikgfHwgQXJpYVV0aWwuaGFzUm9sZSh0YWJsZU5vZGUsIFwibm9uZVwiKTtcbiAgICB9XG5cbi8qIFxuICogZ2V0IGNvbmZsaWN0IEFyaWEgYW5kIEh0bWwgYXR0cmlidXRlc1xuICogcmV0dXJuOiBhIGxpc3Qgb2YgQXJpYSBhbmQgSHRtbCBhdHRyaWJ1dGUgcGFpcnMgdGhhdCBhcmUgY29uZmxpY3RcbiovXG5wdWJsaWMgc3RhdGljIGlzVGFibGVEZXNjZW5kYW50KGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KSB7XG4gICAgaWYgKCFjb250ZXh0SGllcmFyY2hpZXMpIHJldHVybiBudWxsO1xuICAgIFxuICAgIHJldHVybiBjb250ZXh0SGllcmFyY2hpZXNbXCJhcmlhXCJdLmZpbHRlcihoaWVyID0+IFtcInRhYmxlXCIsIFwiZ3JpZFwiLCBcInRyZWVncmlkXCJdLmluY2x1ZGVzKGhpZXIucm9sZSkpO1xufVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgRE9NVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NVXRpbFwiO1xuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01XYWxrZXJcIjtcbmltcG9ydCB7IERPTU1hcHBlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NTWFwcGVyXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDU1NVdGlsIH0gZnJvbSBcIi4vQ1NTVXRpbFwiO1xuaW1wb3J0IHsgQ2xpcFBhdGhVdGlsIH0gZnJvbSBcIi4vQ2xpcFBhdGhVdGlsXCI7XG5cbmV4cG9ydCBjbGFzcyBWaXNVdGlsIHtcbiAgICAvLyBUaGlzIGxpc3QgY29udGFpbnMgYSBsaXN0IG9mIGVsZW1lbnQgdGFncyB3aGljaCBjYW4gbm90IGJlIGhpZGRlbiwgd2hlbiBoaWRkZW4gaXNcbiAgICAvLyBhZGRlZCB0byB0aGVzZXMgZWxlbWVudHMgaXQgZG9lcyBub3QgZG8gYW55dGhpbmcgYXQgYWxsLlxuICAgIC8vICBhcmVhIC0tPiBhcmVhIGVsZW1lbnQgaXMgcGFydCBvZiBhIG1hcCBlbGVtZW50IGFuZCBpdCBjYW4gbm90IGJlIGhpZGRlbiBiZWNhdXNlIGl0IGlzIHVzZWQgdG9cbiAgICAvLyAgICAgICAgICAgbWFrZSBhbiBjZXJ0aWFuIHBhcnRzIG9mIGFuIG1hcCBpbnRlcmFjdGl2ZS5cbiAgICAvLyAgcGFyYW0gLS0+IGVsZW1lbnQgY2FuIG9ubHkgYmUgcGFydCBvZiBvYmplY3QgZWxtZW50IGFuZCBpdCBjYW5ub3QgYmUgaGlkZGVuIGRpcmVjdGx5LCBpdFxuICAgIC8vICAgICAgICAgICAgY2FuIG9ubHkgYmUgaGlkZGVuIGlmIHRoZSBwYXJlbnQgaXMgaGlkZGVuLlxuICAgIC8vICBhdWRpbyAtLT4gSWYgdGhpcyBlbGVtZW50IGlzIGhpZGRlbiBpdCB3aWxsIHN0aWxsIHBsYXkgdGhlIG11c2ljLCBzbyB3ZSBzaG91bGQgc3RpbGwgdHJpZ2dlclxuICAgIC8vICAgICAgICAgICAgdmlvbGF0aW9ucyBmb3IgdGhpcyBlbGVtZW50LlxuICAgIC8vIE5vdGU6IEFsbCBlbGVtZW50IHRhZ3MgdGhhdCBhcmUgYWRkZWQgaGVyZSBzaG91bGQgYmUgYWRkZWQgYXMgbG93ZXJjYXNlLCBhcyB3ZSBhcmUgdXNpbmcgaW5kZXhPZiB0byBkbyB0aGUgY2hlY2suXG4gICAgcHVibGljIHN0YXRpYyB1bmhpZGVhYmxlRWxlbWVudHMgPSBbJ2FyZWEnLCAncGFyYW0nLCAnYXVkaW8nXTtcblxuICAgIC8vIFRoaXMgbGlzdCBjb250YWlucyBhIGxpc3Qgb2YgZWxlbWVudHMgdGFncyB3aGljaCBoYXZlIGRpc3BsYXk6IG5vbmUgYnkgZGVmYXVsdCwgc2luY2Ugd2UgaGF2ZSBydWxlcyB0cmlnZ2VyaW5nXG4gICAgLy8gb24gdGhlc2VzIGVsZW1lbnRzIHdlIG5lZWQgdG8gbWFrZSB0aGVuIHZpc2libGUgYnkgZGVmYXVsdCBzbyB0aGF0IHRoZSBydWxlcyBjYW4gdHJpZ2dlciByZWdhcmRsZXNzIG9mIHRoZVxuICAgIC8vIENoZWNrIEhpZGRlbiBDb250ZW50IG9wdGlvbiBpbiB0aGUgdG9vbHMuXG4gICAgLy8gIHNjcmlwdCAtLT4gc2NyaXB0IGVsZW1lbnRzIGhhdmUgZGlzcGxheTogbm9uZSBieSBkZWZhdWx0XG4gICAgLy8gIGxpbmsgLS0+IGxpbmsgZWxlbWVudHMgaGF2ZSBkaXNwbGF5OiBub25lIGJ5IGRlZmF1bHQsIGJ1dCB0aGUgYWN0dWFsbHkgQ1NTIHNjcmlwdCBpcyBzdGlsbCBleGVjdXRlZCBzbyB3ZSBoYXZlIHRvXG4gICAgLy8gICAgICAgICAgICBtYXJrIHRoaXMgZWxlbWVudCBhcyB2aXNpYmxlIGF0IGFsbCB0aW1lcy5cbiAgICAvLyAgc3R5bGUgLS0+IHN0eWxlIGVsZW1lbnRzIGhhdmUgZGlzcGxheTogbm9uZSBieSBkZWZhdWx0LCBidXQgdGhlIGFjdHVhbGx5IENTUyBzY3JpcHQgaXMgc3RpbGwgZXhlY3V0ZWQgc28gd2UgaGF2ZSB0b1xuICAgIC8vICAgICAgICAgICAgbWFyayB0aGlzIGVsZW1lbnQgYXMgdmlzaWJsZSBhdCBhbGwgdGltZXMuXG4gICAgLy8gIGhlYWQgLS0+IGhlYWQgZWxlbWVudHMgaGF2ZSBkaXNwbGF5OiBub25lIGJ5IGRlZmF1bHQsIGJ1dCBpdCB3aWxsIHN0aWxsIGJlaGF2ZSBjb3JyZWN0XG4gICAgLy8gIHRpdGxlIC0tPiB0aXRsZSBlbGVtZW50cyBoYXZlIGRpc3BsYXk6IG5vbmUgYnkgZGVmYXVsdCwgYnV0IGl0IHdpbGwgc3RpbGwgZGlzcGxheSB0aGUgdGl0bGUuIHJlbW92ZSB0aXRsZSBmcm9tIHRoZSBsaXN0IGJlY2F1c2UgYSB0aXRsZSBjYW4gYmUgYSBjaGlsZCBvZiBhIHN2ZyBlbGVtZW50IHRvb1xuICAgIC8vICBtZXRhIC0tPiBtZXRhIGVsZW1lbnRzIGhhdmUgZGlzcGxheTogbm9uZSBieSBkZWZhdWx0LCBidXQgaXQgd2lsbCBzdGlsbCBwZXJmb3JtIHRoZSBhY3Rpb24gdGhhdCBtZXRhIGlzIHN1cHBvc2UgdG9cbiAgICAvLyAgYmFzZSAtLT4gYmFzZSBlbGVtZW50cyBoYXZlIGRpc3BsYXk6IG5vbmUgYnkgZGVmYXVsdCwgYnV0IGl0IHdpbGwgc3RpbGwgcGVyZm9ybSB0aGUgYWN0aW9uIHRoYXQgbWV0YSBpcyBzdXBwb3NlIHRvXG4gICAgLy8gIG5vc2NyaXB0IC0tPiBub3NjcmlwdCBlbGVtZW50cyBoYXZlIGRpc3BsYXk6IG5vbmUgYnkgZGVmYXVsdCwgYnV0IGl0IHdpbGwgc3RpbGwgcGVyZm9ybSB0aGUgYWN0aW9uIHRoYXQgbWV0YSBpcyBzdXBwb3NlIHRvXG4gICAgLy8gIHRlbXBsYXRlIC0tPiB0ZW1wbGF0ZSBlbGVtZW50cyBoYXZlIGRpc3BsYXk6IG5vbmUgYnkgZGVmYXVsdCwgYmVjYXVzZSB0aGV5IGFyZSBqdXN0IGEgbWVjaGFuaXNtIGZvciBob2xkaW5nIGNsaWVudC1zaWRlIGNvbnRlbnRcbiAgICAvLyAgICAgICAgICAgICAgIHRoYXQgaXMgbm90IHRvIGJlIHJlbmRlcmVkIHdoZW4gYSBwYWdlIGlzIGxvYWRlZC4gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vZG9jcy9XZWIvSFRNTC9FbGVtZW50L3RlbXBsYXRlXG4gICAgLy8gIGRhdGFsaXN0IC0tPiBkYXRhbGlzdCBlbGVtZW50cyBoYXZlIGRpc3BsYXk6IG5vbmUgYnkgZGVmYXVsdCxcbiAgICBwdWJsaWMgc3RhdGljIGhpZGRlbkJ5RGVmYXVsdEVsZW1lbnRzID0gWydzY3JpcHQnLCAnbGluaycsICdzdHlsZScsICdoZWFkJywgJ21ldGEnLCAnYmFzZScsICdub3NjcmlwdCcsICd0ZW1wbGF0ZScsICdkYXRhbGlzdCddXG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBjaGVja2luZyBpZiB0aGUgbm9kZSB0aGF0IGlzIHByb3ZpZWQgaXNcbiAgICAgKiB2aXNpYmxlIG9yIG5vdC4gRm9sbG93aW5nIGlzIGhvdyB0aGUgY2hlY2sgaXMgcGVyZm9ybWVkOlxuICAgICAqICAgIDEuIENoZWNrIGlmIHRoZSBjdXJyZW50IG5vZGUgaXMgaGlkZGVuIHdpdGggdGhlIGZvbGxvd2luZyBvcHRpb25zOlxuICAgICAqICAgICAgIENTUyAtLT4gZGlzbGF5OiBub25lXG4gICAgICogICAgICAgQ1NTIC0tPiB2aXNpYmlsaXR5OiBoaWRkZW5cbiAgICAgKiAgICAgICBhdHRyaWJ1dGUgLS0+IGhpZGRlblxuICAgICAqICAgIDIuIENoZWNrIGlmIHRoZSBhbnkgb2YgdGhlIGN1cnJlbnQgbm9kZXMgcGFyZW50cyBhcmUgaGlkZGVuIHdpdGggdGhlIHNhbWVcbiAgICAgKiAgICAgICBvcHRpb25zIGxpc3RlZCBpbiAxLlxuICAgICAqXG4gICAgICogICAgTm90ZTogSWYgZWl0aGVyIGN1cnJlbnQgbm9kZSBvciBhbnkgb2YgdGhlIHBhcmVudCBub2RlcyBhcmUgaGlkZGVuIHRoZW4gdGhpc1xuICAgICAqICAgICAgICAgIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGZhbHNlIChub2RlIGlzIG5vdCB2aXNpYmxlKS5cbiAgICAgKlxuICAgICAqICAgIE5vdGU6IG5vZGVzIHdpdGggQ1NTIHByb3BlcnRpZXMgb3BhY2l0eTowIG9yIGZpbHRlcjpvcGFjaXR5KDAlKSwgb3Igc2ltaWxhciBTVkcgbWVjaGFuaXNtczogXG4gICAgICogICAgICBUaGV5IGFyZSBub3QgY29uc2lkZXJlZCBoaWRkZW4uIFRleHQgaGlkZGVuIHdpdGggdGhlc2UgbWV0aG9kcyBjYW4gc3RpbGwgYmUgc2VsZWN0ZWQgb3IgY29waWVkLCBcbiAgICAgKiAgICAgIGFuZCB1c2VyIGFnZW50cyBzdGlsbCBleHBvc2UgaXQgaW4gdGhlaXIgYWNjZXNzaWJpbGl0eSB0cmVlcy4gIFxuICAgICAqIFxuICAgICAqICAgIE5vdGU6IG5vZGVzIGhpZGRlbiBvZmYgc2NyZWVuIG9yIGJlaGluZCBhbm90aGVyIG9iamVjdDogdGhleSBhcmUgbm90IGNvbnNpZGVyZWQgaGlkZGVuLiBcbiAgICAgKiAgICAgIFRoZXkgYXJlIGV4cG9zZWQgaW4gdGhlIGFjY2Vzc2liaWxpdHkgdHJlZSBhbmQgdGhleSBjYW4gZXZlbiBuYW1lIG9uLXNjcmVlbiBvYmplY3RzLlxuICAgICAqIFxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBub2RlIFRoZSBub2RlIHdoaWNoIHNob3VsZCBiZSBjaGVja2VkIGlmIGl0IGlzIHZpc2libGUgb3Igbm90LlxuICAgICAqIEByZXR1cm4ge2Jvb2x9IGZhbHNlIGlmIHRoZSBub2RlIGlzIE5PVCB2aXNpYmxlLCB0cnVlIG90aGVyd2lzZVxuICAgICAqXG4gICAgICogQG1lbWJlck9mIFZpc1V0aWxcbiAgICAgKi9cbiAgICAgcHVibGljIHN0YXRpYyBpc05vZGVWaXNpYmxlKG5vZGVJbjogTm9kZSkgOiBib29sZWFuIHtcblxuICAgICAgICAvLyBDaGVjayB0aGUgbm9kZVR5cGUgaWYgdGhpcyBub2RlLCBpZiB0aGlzIG5vZGUgaXMgYSB0ZXh0IG5vZGUgdGhlblxuICAgICAgICAvLyB3ZSBnZXQgdGhlIHBhcmVudG5vZGUgYW5kIHNldCB0aGF0IGFzIHRoZSBub2RlIGFzIGEgdGV4dCBub2RlcyxcbiAgICAgICAgLy8gdmlzaWJpbGl0eSBpcyBkaXJlY3RseSByZWxhdGVkIHRvIHRoZSBwYXJlbnQgbm9kZS5cbiAgICAgICAgaWYgKG5vZGVJbi5ub2RlVHlwZSA9PT0gMykge1xuICAgICAgICAgICAgbm9kZUluID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUobm9kZUluKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbm9kZSA9IG5vZGVJbiBhcyBFbGVtZW50O1xuXG4gICAgICAgIC8vIFdlIHNob3VsZCBvbmx5IGFsbG93IG5vZGVUeXBlIGVsZW1lbnQsIGFuZCBUZXh0Tm9kZSBhbGwgb3RoZXIgbm9kZXNUeXBlc1xuICAgICAgICAvLyB3ZSBjYW4gcmV0dXJuIHRoZSB2aXNpYmlsaXR5IGFzIHZpc2libGUuXG4gICAgICAgIC8vIEZvbGxvd2luZyBub2RlcyB3aWxsIGJlIHJldHVybmVkIGFzIHZpc2FibGUgYnkgZGVmYXVsdCwgc2luY2Ugd2UgY2FuIG5vdFxuICAgICAgICAvLyBhY3R1YWxseSBjaGFuZ2UgdGhlaXIgdmlzaWJpbGl0eS5cbiAgICAgICAgLy8gIE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFIC0tPiA3XG4gICAgICAgIC8vICBOb2RlLkNPTU1FTlRfTk9ERSAgICAgICAgICAgICAgICAtLT4gOFxuICAgICAgICAvLyAgOSAvKiBOb2RlLkRPQ1VNRU5UX05PREUgKi8gICAgICAgICAgICAgICAtLT4gOVxuICAgICAgICAvLyAgTm9kZS5ET0NVTUVOVF9UWVBFX05PREUgICAgICAgICAgLS0+IDEwXG4gICAgICAgIC8vICBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUgICAgICAtLT4gMTFcbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgIT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIG93bmVyRG9jdW1lbnQgaXMgcHJlc2VudCBiZWZvcmUgbW92aW5nIGZvcndhcmRcbiAgICAgICAgLy8gaW4gZGV0ZWN0aW5nIGlmIHRoZSBub2RlIGlzIHZpc2libGUgb3Igbm90LiBJbiB0aGUgY2FzZSB0aGF0IG93bmVyRG9jdW1lbnRcbiAgICAgICAgLy8gZG9lcyBub3QgZXhpc3QgdGhlbiB3ZSBzaW1wbHkgcmV0dXJuIG5vZGUgaXMgdmlzaWJsZSBieSBkZWZhdWx0LlxuICAgICAgICBpZiAoIW5vZGUub3duZXJEb2N1bWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBWYXJpYWJsZSBEZWNsYXJhdGlvblxuICAgICAgICBsZXQgY29tcFN0eWxlO1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgLy8gSW4gdGhlIGNhc2UgdGhpcyBub2RlIGlzIGEgc2NyaXB0LCBsaW5rIG9yIHN0eWxlIG5vZGUsIHJpZ2h0IGF3YXkgcmV0dXJuIG5vZGUgaXMgdmlzaWJsZVxuICAgICAgICAvLyBiZWNhdXNlIHNjcmlwdHMsIGxpbmtzIGFuZCBzdHlsZSBub2RlcyBjYW4gbm90IGJlIGhpZGRlbiBieSBIVE1MIGF0dHJpYnV0ZSBvciBDU1Mgb3IgYXJlIGhpZGRlbiBieSBkZWZhdWx0LiBCdXQgd2Ugd2FudCB0byBzY2FuXG4gICAgICAgIC8vIHRoZSBlbGVtZW50cyBldmVyeXRpbWUgYXMgdGhleSByZW5kZXIgY29udGVudCBzdGlsbCB3aGljaCBpcyBzdGlsbCB2aXNpYmxlIHRvIHVzZXJzLlxuICAgICAgICAvLyAgc2NyaXB0IC0tPiBzY3JpcHQgZWxlbWVudHMgaGF2ZSBkaXNwbGF5OiBub25lIGJ5IGRlZmF1bHRcbiAgICAgICAgLy8gIGxpbmsgLS0+IGxpbmsgZWxlbWVudHMgaGF2ZSBkaXNwbGF5OiBub25lIGJ5IGRlZmF1bHQsIGJ1dCB0aGUgYWN0dWFsbHkgQ1NTIHNjcmlwdCBpcyBzdGlsbCBleGVjdXRlZCBzbyB3ZSBoYXZlIHRvXG4gICAgICAgIC8vICAgICAgICAgICAgbWFyayB0aGlzIGVsZW1lbnQgYXMgdmlzaWJsZSBhdCBhbGwgdGltZXMuXG4gICAgICAgIC8vICBzdHlsZSAtLT4gc3R5bGUgZWxlbWVudHMgaGF2ZSBkaXNwbGF5OiBub25lIGJ5IGRlZmF1bHQsIGJ1dCB0aGUgYWN0dWFsbHkgQ1NTIHNjcmlwdCBpcyBzdGlsbCBleGVjdXRlZCBzbyB3ZSBoYXZlIHRvXG4gICAgICAgIC8vICAgICAgICAgICAgbWFyayB0aGlzIGVsZW1lbnQgYXMgdmlzaWJsZSBhdCBhbGwgdGltZXMuXG4gICAgICAgIC8vIGRhdGFsaXN0IC0tPiBJbiB0aGUgcmVuZGVyaW5nLCB0aGUgZGF0YWxpc3QgZWxlbWVudCByZXByZXNlbnRzIG5vdGhpbmcgYW5kIGl0LCBhbG9uZyB3aXRoIGl0cyBjaGlsZHJlbiwgc2hvdWxkIGJlIGhpZGRlbi5cbiAgICAgICAgaWYgKFZpc1V0aWwuaGlkZGVuQnlEZWZhdWx0RWxlbWVudHMgIT0gbnVsbCAmJiBWaXNVdGlsLmhpZGRlbkJ5RGVmYXVsdEVsZW1lbnRzICE9IHVuZGVmaW5lZCAmJiBWaXNVdGlsLmhpZGRlbkJ5RGVmYXVsdEVsZW1lbnRzLmluZGV4T2Yobm9kZU5hbWUpID4gLTEpIHtcbiAgICAgICAgICAgIC8vcmV0dXJuIHRydWU7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgY2FjaGVWYWwgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0hJRERFTlwiLCB1bmRlZmluZWQpO1xuICAgICAgICBpZiAoY2FjaGVWYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGNhY2hlVmFsO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNldCBQVF9OT0RFX0hJRERFTiB0byBmYWxzZSBmb3IgYWxsIHRoZSBub2RlcywgYmVmb3JlIHRoZSBjaGVjayBhbmQgdGhpcyB3aWxsIGJlIGNoYW5nZWQgdG9cbiAgICAgICAgLy8gdHJ1ZSB3aGVuIHdlIGRldGVjdCB0aGF0IHRoZSBub2RlIGlzIGhpZGRlbi4gV2UgaGF2ZSB0byBzZXQgaXQgdG8gZmFsc2Ugc28gdGhhdCB3ZSBrbm93XG4gICAgICAgIC8vIHRoZSBydWxlcyBoYXMgYWxyZWFkeSBiZWVuIGNoZWNrZWQuXG4gICAgICAgIGNhY2hlVmFsID0gQ2FjaGVVdGlsLnNldENhY2hlKG5vZGUsIFwiUFRfTk9ERV9ISURERU5cIiwgZmFsc2UpO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoaXMgbm9kZSBpcyB2aXNpYmxlLCB3ZSBjaGVjayBjb3VwbGUgb2YgQ1NTIHByb3BlcnRpZXMgYW5kIGhpZGRlbiBhdHRyaWJ1dGUuXG4gICAgICAgIC8vIGFyZWEsIHBhcmFtIGFuZCBhdWRpbyBlbGVtZW50cyB3ZSBkbyBub3QgY2hlY2sgaWYgdGhleSBhcmUgaGlkZGVuIGFzIGl0IGRvZXMgbm90IGFwcGx5IHRvIHRoZW0uXG4gICAgICAgIC8vIENoZWNrIHRoZSB1bmhpZGVhYmxlRWxlbWVudHMgYXJyYXkgd2hpY2ggaXMgcGFydCBvZiB0aGUgcnVsZXMsIHRvIGNoZWNrIGlmIHRoaXMgZWxlbWVudCBpcyBhbGxvd2VkIHRvIGJlIGhpZGRlbiBvciBub3RcbiAgICAgICAgLy8gaW4gdGhlIGNhc2UgdGhhdCB0aGUgZWxlbWVudCBpcyBwYXJ0IG9mIHRoZSB1bmhpZGVhYmxlRWxlbWVudHMgYXJyYXkgdGhlbiB3ZSBkbyBub3QgcnVuIHRoZSBoaWRkZW4gY2hlY2sgb24gdGhpcyBlbGVtZW50LFxuICAgICAgICAvLyBhbmQgZ28gc3RyaWdodCB0byB0aGUgcGFyZW50IG5vZGUuXG4gICAgICAgIC8vIEFycmF5IGNoZWNrIGVsZW1lbnRzIGxpa2U6XG4gICAgICAgIC8vICBhcmVhIC0tPiBhcmVhIGVsZW1lbnQgaXMgcGFydCBvZiBhIG1hcCBlbGVtZW50IGFuZCBpdCBjYW4gbm90IGJlIGhpZGRlbiBiZWNhdXNlIGl0IGlzIHVzZWQgdG9cbiAgICAgICAgLy8gICAgICAgICAgIG1ha2UgYW4gY2VydGlhbiBwYXJ0cyBvZiBhbiBtYXAgaW50ZXJhY3RpdmUuXG4gICAgICAgIC8vICBwYXJhbSAtLT4gZWxlbWVudCBjYW4gb25seSBiZSBwYXJ0IG9mIG9iamVjdCBlbG1lbnQgYW5kIGl0IGNhbm5vdCBiZSBoaWRkZW4gZGlyZWN0bHksIGl0XG4gICAgICAgIC8vICAgICAgICAgICAgY2FuIG9ubHkgYmUgaGlkZGVuIGlmIHRoZSBwYXJlbnQgaXMgaGlkZGVuLlxuICAgICAgICAvLyAgYXVkaW8gLS0+IElmIHRoaXMgZWxlbWVudCBpcyBoaWRkZW4gaXQgd2lsbCBzdGlsbCBwbGF5IHRoZSBtdXNpYywgc28gd2Ugc2hvdWxkIHN0aWxsIHRyaWdnZXJcbiAgICAgICAgLy8gICAgICAgICAgICB2aW9sYXRpb25zIGZvciB0aGlzIGVsZW1lbnQuXG4gICAgICAgIC8vIEluIHRoZSBjYXNlIHRoYXQgdW5oaWRlYWJsZUVsZW1lbnRzIGFycmF5IGlzIG5vdCBkZWZpbmVkIHRoZW4gd2UganVzdCBzY2FuIGFsbCBlbGVtZW50cyBhbmQgZG8gbm8gZmlsdGVyaW5nIGF0IGFsbC5cbiAgICAgICAgaWYgKFZpc1V0aWwudW5oaWRlYWJsZUVsZW1lbnRzID09PSBudWxsIHx8IFZpc1V0aWwudW5oaWRlYWJsZUVsZW1lbnRzID09PSB1bmRlZmluZWQgfHwgVmlzVXRpbC51bmhpZGVhYmxlRWxlbWVudHMuaW5kZXhPZihub2RlTmFtZSkgPT09IC0xKSB7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiBkZWZhdWx0VmlldyBleGlzdHMgZm9yIHRoaXMgbm9kZSwgaWYgaXQgZG9lcyB0aGVuIHVzZSB0aGlzIHRvIHJ1biB0aGUgZ2V0Q29tcHV0ZWRTdHlsZVxuICAgICAgICAgICAgLy8gZnVuY3Rpb24gdG8gZ2V0IHRoZSBDU1Mgc3R5bGUgZm9yIHRoZSBub2RlLlxuICAgICAgICAgICAgaWYgKG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldykge1xuICAgICAgICAgICAgICAgIC8vIFJ1biB0aGUgZ2V0Q29tcHV0ZWRTdHlsZSBvbiB0aGlzIG5vZGUgdG8gZmV0Y2ggdGhlIENTUyBjb21wdWF0aW9uIG9mIHRoZSBub2RlXG4gICAgICAgICAgICAgICAgY29tcFN0eWxlID0gbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUobm9kZSwgbnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IGRlZmF1bHRWaWV3IGRvZXMgbm90IGV4aXN0cyByZXR1cm4gdHJ1ZSB0byBpZGVudGlmeSB0aGF0IHRoaXNcbiAgICAgICAgICAgIC8vIG5vZGUgaXMgdmlzaWJsZSwgYmVjYXVzZSB3ZXJlIG5vdCBhYmxlIHRvIGRldGVjdCBpZiBpdCB3YXMgbm90LlxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIENhY2hlVXRpbC5zZXRDYWNoZShub2RlLCBcIlBUX05PREVfSElEREVOXCIsIHRydWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBHZXQgdGhlIGhpZGRlbiBlbGVtZW50IHByb3BlcnR5IGFuZCBoaWRkZW4gYXR0cmlidXRlXG4gICAgICAgICAgICBsZXQgaGlkZGVuQXR0cmlidXRlID0gbm9kZS5nZXRBdHRyaWJ1dGUoXCJoaWRkZW5cIik7XG4gICAgICAgICAgICBsZXQgaGlkZGVuUHJvcGVydHlDdXN0b20gPSBjYWNoZVZhbDtcbiAgICAgICAgICAgIC8vIFRvIGdldCB0aGUgaGlkZGVuIHByb3BlcnR5IHdlIG5lZWQgdG8gcGVyZm9ybSBhIHNwZWNpYWwgY2hlY2sgYXMgaW4gc29tZSBjYXNlcyB0aGUgaGlkZGVuIHByb3BlcnR5IHdpbGwgbm90IGJlXG4gICAgICAgICAgICAvLyBhIGJvb2xlYW4sIGZvciB0aGVzZXMgY2FzZXMgd2Ugc2V0IGl0IHRvIGZhbHNlIGFzIHdlIGFyZSBub3QgYWJsZSB0byBkZXRlcm1pbmUgdGhlIHRydWUgaGlkZGVuIGNvbmRpdGlvbi5cbiAgICAgICAgICAgIC8vIFRoZSByZWFzb24gZm9yIHRoaXMgaXMgYmVjYXVzZSBmb3JtIGVsZW1lbnRzIGFyZSBhYmxlIHRvIHBlcmZvcm0gYW4gb3ZlcnJpZGUsIHNvIHdoZW4gd2UgaGF2ZSBpZD1cImhpZGRlblwiIGZvciBhbiBlbGVtZW50XG4gICAgICAgICAgICAvLyB3aGljaCBpcyB1bmRlciB0aGUgZm9ybSBlbGVtZW50IHRoZW4sIG5vZGUuaGlkZGVuIGdpdmVzIHRoZSBlbGVtZW50L2xpc3Qgb2YgZWxlbWVudHMgd2hpY2ggaGF2ZSBpZD1cImhpZGRlblwiLiBSZWZlciB0b1xuICAgICAgICAgICAgLy8gbW96aWxsYSBidWc6IGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTEyNjczNTZcbiAgICAgICAgICAgIGxldCBoaWRkZW5Qcm9wZXJ0eSA9IHR5cGVvZiAobm9kZSBhcyBhbnkpLmhpZGRlbiA9PT0gXCJib29sZWFuXCIgPyAobm9kZSBhcyBhbnkpLmhpZGRlbiA6IGZhbHNlO1xuICAgICAgICAgICAgLy8gSWYgY29tcFN0eWxlIG9iamVjdCBpcyBlbXB0eSwgbm9kZSBkb2VzJ3QgaGF2ZSBoaWRkZW4gcHJvcGVydHksIG5vZGUgZG9lcyd0IGhhdmUgaGlkZGVuIGF0dHJpYnV0ZSBhbmQgZG9lcyd0IGhhdmUgY3VzdG9tIFBUXG4gICAgICAgICAgICAvLyBoaWRkZW4gcHJvcGVydHkgdGhlbiB3ZSBjYW4ganVzdCByZXR1cm4gdHJ1ZSAobm9kZSB2aXNpYmxlKSBhdCB0aGlzIHBvaW50LlxuICAgICAgICAgICAgaWYgKCFjb21wU3R5bGUgJiZcbiAgICAgICAgICAgICAgICAhaGlkZGVuUHJvcGVydHkgJiYgLy8gdGhpcyBjb3ZlcnMgZmFsc2UsIG51bGwsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIChoaWRkZW5BdHRyaWJ1dGUgPT09IG51bGwgfHwgaGlkZGVuQXR0cmlidXRlID09PSB1bmRlZmluZWQpICYmXG4gICAgICAgICAgICAgICAgIWhpZGRlblByb3BlcnR5Q3VzdG9tIC8vIFRoaXMgY292ZXJzIGZhbHNlLCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIENhY2hlVXRpbC5zZXRDYWNoZShub2RlLCBcIlBUX05PREVfSElEREVOXCIsIHRydWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IHRoZSBjb21wU3R5bGUgaXMgZGVmaW5lZCB3ZSBjaGVjayB0aGUgZm9sbG93aW5nOlxuICAgICAgICAgICAgLy8gIENTUyBzdHlsZSBkaXNwbGF5IHNldCB0byBub25lXG4gICAgICAgICAgICAvLyAgQ1NTIHN0eWxlIHZpc2liaWxpdHkgc2V0IHRvIGhpZGRlblxuICAgICAgICAgICAgLy8gICAgTm90ZTogRm9yIHRoaXMgcHJvcGVydHkgc2luY2UgaXQgaXMgaW5oZXJpdGVkLCBuZWVkIHRvIHNraXAgdGhlIGNoZWNrIG9uIHBhcmVudHMgYXNcbiAgICAgICAgICAgIC8vICAgICAgICAgIHRoZSBwYXJlbnQgY2FuIGhhdmUgaGlkZGVuIGJ1dCB0aGUgY2hpbGQgY2FuIGJlIHZpc2libGUuIFNvIHdlIG9ubHkgY2hlY2sgdGhpcyBwcm9wZXJ0eVxuICAgICAgICAgICAgLy8gICAgICAgICAgb24gY2hpbGQgZWxlbWVudHMvZWxlbWVudHMgdGhhdCBhcmUgcGFzc2VkIHRvIHRoaXMgZnVuY3Rpb24gdGhlIGZpcnN0IHRpbWUuXG4gICAgICAgICAgICAvLyAgbm9kZSBoaWRkZW4gcHJvcGVydHkgc2V0IChub2RlLmhpZGRlbilcbiAgICAgICAgICAgIC8vICBub2RlIGF0dHJpYnV0ZSBoaWRkZW4gc2V0ICh0byBhbnkgdmFsdWUpXG4gICAgICAgICAgICAvLyAgbm9kZSBjdXN0b20gaGlkZGVuIHByb3BlcnR5IHNlciAobm9kZS5QVF9OT0RFX0hJRERFTilcbiAgICAgICAgICAgIC8vIElmIGFueSBvZiB0aGUgYWJvdmUgY29uZGl0aW9ucyBhcmUgdHJ1ZSB0aGVuIHdlIHJldHVybiBmYWxzZSBhcyB0aGlzIGVsZW1lbnQgaXMgbm90IHZpc2libGVcbiAgICAgICAgICAgIGlmICgoY29tcFN0eWxlICE9PSBudWxsICYmICgoY29tcFN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ2Rpc3BsYXknKSA9PT0gJ25vbmUnIHx8XG4gICAgICAgICAgICAgICAgKCFDYWNoZVV0aWwuZ2V0Q2FjaGUobm9kZSwgXCJWaXNpYmlsaXR5X0NoZWNrX1BhcmVudFwiLCBudWxsKSAmJiBjb21wU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgndmlzaWJpbGl0eScpID09PSAnaGlkZGVuJykpKSB8fFxuICAgICAgICAgICAgICAgIChjb21wU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnZGlzcGxheScpICE9PSAnYmxvY2snICAmJiAoaGlkZGVuUHJvcGVydHkgfHwgaGlkZGVuQXR0cmlidXRlICE9IG51bGwgfHwgaGlkZGVuUHJvcGVydHlDdXN0b20pKSkpIHtcbiAgICAgICAgICAgICAgICAvLyBTZXQgYSBjdXN0b20gZXhwYW5kb3MgcHJvcGVydHkgb24gdGhlIHRoZSBub2RlIHRvIGlkZW50aWZ5IHRoYXQgaXQgaXMgaGlkZGVuLCBzbyB0aGF0IHdlIGNhbiB1c2VzXG4gICAgICAgICAgICAgICAgLy8gdXNlIHRoaXMgaW4gdGhlIHJ1bGVzIHRvIGRldGVybWluZSBpZiB0aGUgbm9kZSBpcyBoaWRkZW4gb3Igbm90LCBpZiB3ZSBuZWVkIHRvLlxuICAgICAgICAgICAgICAgIC8vIFVzZSBleHBhbmRvcyBwcm9wZXJ0eSBpbnN0ZWFkIG9mIGEgaGFzaCBtYXAgd2hpY2ggc3RvcmVzIHRoZSBlbGVtZW50cywgYWRkaW5nL2NoZWNraW5nIGV4cGFuZG9zXG4gICAgICAgICAgICAgICAgLy8gcHJvcGVydGllcyBpcyBhIGxvdCBmYXN0ZXIgcGVyZm9ybWFuY2Ugd2hpc2UuIEZvciBIYXNoIG1hcCB3ZSBuZWVkIHRvIHN0b3JlIGJhc2VkIG9uIHhwYXRoLCBhbmQgdG8gY2FsY3VsYXRlXG4gICAgICAgICAgICAgICAgLy8geHBhdGggaXQgaXMgbW9yZSBwZXJmb3JtYW5jZSBpbXBhY3QuXG4gICAgICAgICAgICAgICAgcmV0dXJuIENhY2hlVXRpbC5zZXRDYWNoZShub2RlLCBcIlBUX05PREVfSElEREVOXCIsIGZhbHNlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gY2hlY2sgY29udGVudC12aXNpYmlsaXR5OiBpZiB0aGUgY29udGVudC12aXNpYmlsaXR5IGlzIGhpZGRlbiwgdGhlbiwgcmV0dXJuIGZhbHNlIGFzIHRoZSBlbGVtZW50IGlzIG5vdCB2aXNpYmxlXG4gICAgICAgICAgICBpZiAoVmlzVXRpbC5pc0NvbnRlbnRIaWRkZW4obm9kZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQ2FjaGVVdGlsLnNldENhY2hlKG5vZGUsIFwiUFRfTk9ERV9ISURERU5cIiwgZmFsc2UpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBjaGVjayBoaWRkZW4gYnkgY2xpcC1wYXRoXG4gICAgICAgICAgICAvLyBUT0RPOiBuZWVkIHRvIGNoZWNrIGlmIGhpZGRlbiBjb250ZW50IGNvbnRhaW5zIGZvY3VzYWJsZSBlbGVtZW50cywgc2ltaWxhcmx5IHRvIG9mZnNjcmVlbiBjb250ZW50XG4gICAgICAgICAgICBpZiAoQ2xpcFBhdGhVdGlsLmlzTm9kZVZpc3VhbGx5SGlkZGVuQnlDbGlwUGF0aChub2RlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0hJRERFTlwiLCBmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgdGhlIHBhcmVudE5vZGUgZm9yIHRoaXMgbm9kZSwgYmVjdWFzZSB3ZSBoYXZlIHRvIGNoZWNrIGFsbCBwYXJlbnRzIHRvIG1ha2Ugc3VyZSB0aGV5IGRvIG5vdCBoYXZlXG4gICAgICAgIC8vIHRoZSBoaWRkZW4gQ1NTLCBwcm9wZXJ0eSBvciBhdHRyaWJ1dGUuIE9ubHkga2VlcCBjaGVja2luZyB1bnRpbCB3ZSBhcmUgYWxsIHRoZSB3YXkgYmFjayB0byB0aGUgcGFyZW50Tm9kZVxuICAgICAgICAvLyBlbGVtZW50LlxuICAgICAgICBsZXQgcGFyZW50RWxlbWVudCA9IERPTVdhbGtlci5wYXJlbnROb2RlKG5vZGUpO1xuXG4gICAgICAgIC8vIElmIHRoZSBwYXJlbnQgbm9kZSBleGlzdHMgYW5kIHRoZSBub2RldHlwZSBpcyBlbGVtZW50ICgxKSwgdGhlbiBydW4gcmVjdXJzaXZlIGNhbGwgdG8gcGVyZm9ybSB0aGUgY2hlY2tcbiAgICAgICAgLy8gYWxsIHRoZSB3YXkgdXAgdG8gdGhlIHZlcnkgcGFyZW50IG5vZGUuIFVzZSByZWN1cnNpdmUgY2FsbCBoZXJlIGluc3RlYWQgb2YgYSB3aGlsZSBsb29wIHNvIHRoYXQgd2UgZG8gbm90XG4gICAgICAgIC8vIGhhdmUgdG8gZHVwbGljYXRlIHRoZSBsb2dpYyBmb3IgY2hlY2tpbmcgaWYgdGhlIG5vZGUgaXMgdmlzaWJsZSBvciBub3QgZm9yIGFsbCB0aGUgcGFyZW50cyBzdGFydGluZyB3aXRoXG4gICAgICAgIC8vIGNoaWxkIG5vZGUuXG4gICAgICAgIGlmIChwYXJlbnRFbGVtZW50ICE9IG51bGwgJiYgcGFyZW50RWxlbWVudC5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBoYXZlIGEgcGFyZW50IGVsZW1lbnQgZ29pbmcgdGhyb3VnaCB0aGUgaXNOb2RlVmlzaWJsZSBmdW5jdGlvbiB3ZSBoYXZlIHRvIG1hcmsgaXQgYXMgc3VjaFxuICAgICAgICAgICAgLy8gc28gdGhhdCBpbiB0aGUgZnVuY3Rpb24gd2UgY2FuIHNraXAgY2hlY2tpbmcgdmlzaWJpbGl0eTogaGlkZGVuIGZvciBwYXJlbnQgZWxlbWVudHMgc2luY2UgdmlzaWJpbGl0eTogaGlkZGVuXG4gICAgICAgICAgICAvLyBpcyBpbmhlcml0ZWQsIHdoaWNoIGFsbG93cyBhIGNoaWxkIHRvIGhhdmUgYSBkaWZmZXJlbnQgc2V0dGluZyB0aGVuIHRoZSBjaGlsZC4gVGhpcyBwcm9wZXJ0eSBvbmx5IG5lZWRzIHRvIGJlIGNoZWNrZWRcbiAgICAgICAgICAgIC8vIG9uY2UgZm9yIHRoZSBmaXJzdCBlbGVtZW50IHRoYXQgaXMgcGFzc2VkIGRvd24gYW5kIHRoYXQgaXMgYWxsLiBJZ25vcmUgaXQgZm9yIGFsbCB0aGUgcGFyZW50cyB0aGF0IHdlIGl0ZXJhdGUgb3Zlci5cbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShwYXJlbnRFbGVtZW50IGFzIEVsZW1lbnQsIFwiVmlzaWJpbGl0eV9DaGVja19QYXJlbnRcIiwgdHJ1ZSk7XG5cbiAgICAgICAgICAgIC8vIENoZWNrIHVwd2FyZHMgcmVjdXJzaXZlbHksIGFuZCBzYXZlIHRoZSByZXN1bHRzIGluIGFuIHZhcmlhYmxlXG4gICAgICAgICAgICBsZXQgbm9kZVZpc2libGUgPSBWaXNVdGlsLmlzTm9kZVZpc2libGUocGFyZW50RWxlbWVudCk7XG5cbiAgICAgICAgICAgIC8vIElmIHRoZSBub2RlIGlzIGZvdW5kIHRvIG5vdCBiZSB2aXNpYmxlIHRoZW4gYWRkIHRoZSBjdXN0b20gUFRfTk9ERV9ISURERU4gdG8gdHJ1ZS5cbiAgICAgICAgICAgIC8vIHNvIHRoYXQgd2UgY2FuIHVzZSB0aGlzIGluIHRoZSBydWxlcy5cbiAgICAgICAgICAgIC8vIGlmICghbm9kZVZpc2libGUpIHtcbiAgICAgICAgICAgIC8vICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0hJRERFTlwiLCB0cnVlKTtcbiAgICAgICAgICAgIC8vIH1cblxuICAgICAgICAgICAgLy8gQ2hlY2sgdXB3YXJkcyByZWN1cnNpdmVseVxuICAgICAgICAgICAgcmV0dXJuIENhY2hlVXRpbC5zZXRDYWNoZShub2RlLCBcIlBUX05PREVfSElEREVOXCIsIG5vZGVWaXNpYmxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJldHVybiB0cnVlIChub2RlIGlzIHZpc2libGUpXG4gICAgICAgIHJldHVybiBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0hJRERFTlwiLCB0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBjaGVja2luZyBpZiB0aGUgbm9kZSB0aGF0IGlzIHZpc3VhbGx5IGhpZGRlbiBieSBjbGlwcGluZyBvciBvcGFxOlxuICAgICAqICAgIDEuIENoZWNrIGlmIHRoZSBjdXJyZW50IG5vZGUgaXMgdmlzdWFsbHkgaGlkZGVuOlxuICAgICAqICAgICAgIENTUyAtLT4gY2xpcDogcmVjdCgwcHgsIDBweCwgMHB4LCAwcHgpXG4gICAgICogICAgICAgQ1NTIC0tPiBvcGFjaXR5OiAwXG4gICAgICpcbiAgICAgKiAgICBOb3RlOiBJZiBlaXRoZXIgY3VycmVudCBub2RlIG9yIGFueSBvZiB0aGUgcGFyZW50IG5vZGVzIGFyZSB2aXN1YWxseSBoaWRkZW4gdGhlbiB0aGlzXG4gICAgICogICAgICAgICAgZnVuY3Rpb24gd2lsbCByZXR1cm4gdHJ1ZSAobm9kZSBpcyBub3QgdmlzdWFsbHkgaGlkZGVuKS5cbiAgICAgKlxuICAgICAqICAgIE5vdGU6IG5vZGVzIHdpdGggQ1NTIHByb3BlcnRpZXMgY2xpcDogcmVjdCgwcHgsIDBweCwgMHB4LCAwcHgpIG9yIG9wYWNpdHk6MCBvciBmaWx0ZXI6b3BhY2l0eSgwJSksIG9yIHNpbWlsYXIgU1ZHIG1lY2hhbmlzbXM6IFxuICAgICAqICAgICAgVGhleSBhcmUgbm90IGNvbnNpZGVyZWQgaGlkZGVuIHRvIGFuIEFULiBUZXh0IGhpZGRlbiB3aXRoIHRoZXNlIG1ldGhvZHMgY2FuIHN0aWxsIGJlIHNlbGVjdGVkIG9yIGNvcGllZCwgXG4gICAgICogICAgICBhbmQgdXNlciBhZ2VudHMgc3RpbGwgZXhwb3NlIGl0IGluIHRoZWlyIGFjY2Vzc2liaWxpdHkgdHJlZXMuICBcbiAgICAgKiBcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gbm9kZSBUaGUgbm9kZSB3aGljaCBzaG91bGQgYmUgY2hlY2tlZCBpZiBpdCBpcyB2aXN1YWxseSBoaWRkZW4gb3Igbm90LlxuICAgICAqIEByZXR1cm4ge2Jvb2x9IHRydWUgaWYgdGhlIG5vZGUgaXMgdmlzdWFsbHkgaGlkZGVuLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBWaXNVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpc05vZGVWaXN1YWxseUhpZGRlbihub2RlOiBOb2RlKSA6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIW5vZGUgfHwgbm9kZS5ub2RlVHlwZSAhPT0gMSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBcbiAgICAgICAgbGV0IGVsZW0gPSBub2RlIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAvLyBTZXQgUFRfTk9ERV9ISURERU4gdG8gZmFsc2UgZm9yIGFsbCB0aGUgbm9kZXMsIGJlZm9yZSB0aGUgY2hlY2sgYW5kIHRoaXMgd2lsbCBiZSBjaGFuZ2VkIHRvXG4gICAgICAgIC8vIHRydWUgd2hlbiB3ZSBkZXRlY3QgdGhhdCB0aGUgbm9kZSBpcyBoaWRkZW4uIFdlIGhhdmUgdG8gc2V0IGl0IHRvIGZhbHNlIHNvIHRoYXQgd2Uga25vd1xuICAgICAgICAvLyB0aGUgcnVsZXMgaGFzIGFscmVhZHkgYmVlbiBjaGVja2VkLlxuICAgICAgICBjb25zdCBoaWRkZW4gPSBDYWNoZVV0aWwuZ2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTlwiLCB1bmRlZmluZWQpO1xuICAgICAgICBpZiAoaGlkZGVuID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIGRlZmluZWQgc3R5bGVzIG9ubHkgZ2l2ZSB0aGUgc3R5bGVzIHRoYXQgY2hhbmdlZFxuICAgICAgICAgICAgY29uc3QgY29tcF9zdHlsZXMgPSBDU1NVdGlsLmdldENvbXB1dGVkU3R5bGUoZWxlbSk7XG4gICAgICAgICAgICBpZiAoKGNvbXBfc3R5bGVzWydwb3NpdGlvbiddPT09J2Fic29sdXRlJyAmJiBjb21wX3N0eWxlc1snY2xpcCddICYmIChjb21wX3N0eWxlc1snY2xpcCddIGFzIGFueSkucmVwbGFjZUFsbCgnICcsICcnKT09PSdyZWN0KDBweCwwcHgsMHB4LDBweCknKVxuICAgICAgICAgICAgICAgIHx8IChjb21wX3N0eWxlc1snb3BhY2l0eSddICYmIHBhcnNlRmxvYXQoY29tcF9zdHlsZXNbJ29wYWNpdHknXSkgPCAwLjEpKSAge1xuICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOXCIsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBHZXQgdGhlIHBhcmVudE5vZGUgZm9yIHRoaXMgbm9kZSwgYmVjdWFzZSB3ZSBoYXZlIHRvIGNoZWNrIGFsbCBwYXJlbnRzIHRvIG1ha2Ugc3VyZSB0aGV5IGRvIG5vdCBoYXZlXG4gICAgICAgICAgICAvLyB0aGUgaGlkZGVuIENTUywgcHJvcGVydHkgb3IgYXR0cmlidXRlLiBPbmx5IGtlZXAgY2hlY2tpbmcgdW50aWwgd2UgYXJlIGFsbCB0aGUgd2F5IGJhY2sgdG8gdGhlIHBhcmVudE5vZGVcbiAgICAgICAgICAgIC8vIGVsZW1lbnQuXG4gICAgICAgICAgICBsZXQgcGFyZW50RWxlbWVudCA9IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KGVsZW0pO1xuICAgICAgICAgICAgaWYgKCFwYXJlbnRFbGVtZW50KVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgICAgICAgLy8gQ2hlY2sgdXB3YXJkcyByZWN1cnNpdmVseVxuICAgICAgICAgICAgY29uc3QgaGlkID0gVmlzVXRpbC5pc05vZGVWaXN1YWxseUhpZGRlbihwYXJlbnRFbGVtZW50KTtcbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOXCIsIGhpZCk7XG4gICAgICAgICAgICByZXR1cm4gaGlkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoaWRkZW47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcmV0dXJuIHRydWUgaWYgdGhlIG5vZGUgb3IgaXRzIGFuY2VzdG9yIGlzIGhpZGRlbiBieSBDU1MgY29udGVudC12aXNpYmlsaXR5OmhpZGRlblxuICAgICAqIEF0IHRoaXMgdGltZSwgQ1NTIGNvbnRlbnQtdmlzaWJpbGl0eSBpcyBwYXJ0aWFsbHkgc3VwcG9ydGVkIGJ5IENocm9tZSAmIEVkZ2UsIGJ1dCBub3Qgc3VwcG9ydGVkIGJ5IEZpcmVmb3hcbiAgICAgKiBUaGUgaW1wbGVtZW50YXRpb24gVEVNUE9SQVJJTFkgZm9sbG93cyB0aGUgQ2hyb21lIHRlc3QgcmVzdWx0czpcbiAgICAgKiAgIGlmIGNvbnRlbnQtdmlzaWJpbGl0eTpoaWRkZW5cbiAgICAgKiAgICAgIGlmIHRoZSBlbGVtZW50IGlzIGJsb2NrLWxldmVsIChkZWZhdWx0IG9yIHNwZWNpZmllZCBieSB0aGUgdXNlciksIHRoZW4gdGhlIGVsZW1lbnQgYW5kIGl0cyBjaGlsZHJlbiBhcmUgbm9ybWFsbHkgaGlkZGVuO1xuICAgICAqICAgICAgaWYgdGhlIGVsZW1lbnQgaXMgaW5saW5lIChkZWZhdWx0IG9yIHNwZWNpZmllZCBieSB0aGUgdXNlciksIHRoZW4gdGhlIGVsZW1lbnQgYW5kIGl0cyBjaGlsZHJlbiBhcmUgbm9ybWFsbHkgTk9UIGhpZGRlbjsgXG4gICAgICogXG4gICAgICogQHBhcmFtIG5vZGVcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzQ29udGVudEhpZGRlbihub2RlOiBFbGVtZW50KSA6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBjb25zdCB2aXMgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0NvbnRlbnRIaWRkZW5cIiwgdW5kZWZpbmVkKTtcbiAgICAgICAgaWYgKHZpcyAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdmlzOyAgICBcblxuICAgICAgICBjb25zdCBzdHlsZSA9ICBnZXRDb21wdXRlZFN0eWxlKG5vZGUpO1xuICAgICAgICBpZiAoIXN0eWxlKSB7XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0NvbnRlbnRIaWRkZW5cIiwgZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbnRlbnRfdmlzaWJpbGl0eSA9IHN0eWxlLmdldFByb3BlcnR5VmFsdWUoXCJjb250ZW50LXZpc2liaWxpdHlcIik7XG4gICAgICAgIGlmIChjb250ZW50X3Zpc2liaWxpdHkgIT09ICdoaWRkZW4nKSB7XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0NvbnRlbnRIaWRkZW5cIiwgZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgXG4gICAgICAgIH0gXG4gICAgICAgIGNvbnN0IGRpc3BsYXkgPSBzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKFwiZGlzcGxheVwiKTsgXG4gICAgICAgIC8vIGlubGluZSBlbGVtZW50IG9ubHlcbiAgICAgICAgaWYgKGRpc3BsYXkgPT09ICdpbmxpbmUnKSB7XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0NvbnRlbnRIaWRkZW5cIiwgZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9ICBcbiAgICAgICAgXG4gICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShub2RlLCBcIlBUX05PREVfQ29udGVudEhpZGRlblwiLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcmV0dXJuIHRydWUgaWYgdGhlIG5vZGUgaXMgb2Zmc2NyZWVuIGJ5IENTUyBwb3NpdGlvblxuICAgICAqIEBwYXJhbSBub2RlXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpc0VsZW1lbnRPZmZzY3JlZW4obm9kZTogSFRNTEVsZW1lbnQpIDogYm9vbGVhbiB7XG4gICAgICAgIGlmICghbm9kZSkgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmIChub2RlLm5vZGVUeXBlICE9PSAxKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIFxuICAgICAgICBjb25zdCB2aXMgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUobm9kZSAsIFwiUFRfTk9ERV9PZmZzY3JlZW5cIiwgdW5kZWZpbmVkKTtcbiAgICAgICAgaWYgKHZpcyAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdmlzOyAgXG5cbiAgICAgICAgY29uc3QgbWFwcGVyIDogRE9NTWFwcGVyID0gbmV3IERPTU1hcHBlcigpO1xuICAgICAgICBjb25zdCBib3VuZHMgPSBtYXBwZXIuZ2V0VW5hZGp1c3RlZEJvdW5kcyhub2RlKTsgXG4gICAgICAgIGlmICghYm91bmRzKSB7XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX09mZnNjcmVlblwiLCB0cnVlKTsgXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKGJvdW5kc1snaGVpZ2h0J10gPT09IDAgfHwgYm91bmRzWyd3aWR0aCddID09PSAwIHx8IChib3VuZHNbJ3RvcCddK2JvdW5kc1snaGVpZ2h0J10pIDw9IDAgfHwgKGJvdW5kc1snbGVmdCddK2JvdW5kc1snd2lkdGgnXSkgPD0gMCkge1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKG5vZGUsIFwiUFRfTk9ERV9PZmZzY3JlZW5cIiwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBcblxuICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX09mZnNjcmVlblwiLCBmYWxzZSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiByZXR1cm4gdHJ1ZSBpZiB0aGUgbm9kZSBvciBpdHMgYW5jZXN0b3IgaXMgbmF0aXZlbHkgaGlkZGVuIG9yIGFyaWEtaGlkZGVuID0gJ3RydWUnXG4gICAgICogQHBhcmFtIG5vZGVcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzTm9kZUhpZGRlbkZyb21BVChub2RlOiBFbGVtZW50KSA6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgdmlzID0gQ2FjaGVVdGlsLmdldENhY2hlKG5vZGUsIFwiUFRfTk9ERV9IaWRkZW5Gcm9tQVRcIiwgdW5kZWZpbmVkKTtcbiAgICAgICAgaWYgKHZpcyAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdmlzOyAgIFxuXG4gICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKG5vZGUpIHx8IG5vZGUuZ2V0QXR0cmlidXRlKFwiYXJpYS1oaWRkZW5cIikgPT09ICd0cnVlJykge1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKG5vZGUsIFwiUFRfTk9ERV9IaWRkZW5Gcm9tQVRcIiwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSAgICBcbiAgICAgICAgbGV0IGFuY2VzdG9yID0gRE9NVXRpbC5nZXRBbmNlc3RvcldpdGhBdHRyaWJ1dGUobm9kZSwgXCJhcmlhLWhpZGRlblwiLCBcInRydWVcIik7XG4gICAgICAgIGlmIChhbmNlc3Rvcikge1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKG5vZGUsIFwiUFRfTk9ERV9IaWRkZW5Gcm9tQVRcIiwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0hpZGRlbkZyb21BVFwiLCBmYWxzZSk7ICAgIFxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcmV0dXJuIHRydWUgaWYgdGhlIG5vZGUgb3IgaXRzIGFuY2VzdG9yIGlzIG5hdGl2ZWx5IGhpZGRlbiBvciBhcmlhLWhpZGRlbiA9ICd0cnVlJ1xuICAgICAqIEBwYXJhbSBub2RlXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpc05vZGVQcmVzZW50YXRpb25hbChub2RlOiBFbGVtZW50KSA6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCByb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKG5vZGUpO1xuICAgICAgICBpZiAocm9sZSAmJiAocm9sZSA9PT0gJ25vbmUnIHx8IHJvbGUgPT09ICdwcmVzZW50YXRpb24nKSkgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiByZXR1cm4gdHJ1ZSBpZiB0aGUgZWxlbWVudCBpcyBzY3JvbGxhYmxlXG4gICAgICogQHBhcmFtIG5vZGVcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzRWxlbWVudFNjcm9sbGFibGUoZWxlbTogSFRNTEVsZW1lbnQpIDogYm9vbGVhbiB7XG4gICAgICAgIGlmICghZWxlbSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IHN0eWxlcyA9IENTU1V0aWwuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtKTtcbiAgICAgICAgaWYgKCFzdHlsZXMpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBsZXQgeF9zY3JvbGwgPSBzdHlsZXMuZ2V0UHJvcGVydHlWYWx1ZSgnb3ZlcmZsb3cteCcpO1xuICAgICAgICBsZXQgeV9zY3JvbGwgPSBzdHlsZXMuZ2V0UHJvcGVydHlWYWx1ZSgnb3ZlcmZsb3cteScpO1xuICAgICAgICAvL2NvbnNvbGUubG9nKFwiYmVmb3JlIG5vZGU9XCIrIGVsZW0ubm9kZU5hbWUgK1wiLCBpZD1cIitlbGVtLmdldEF0dHJpYnV0ZShcImlkXCIpICtcIiwgeF9zY3JvbGw9XCIreF9zY3JvbGwgKyBcIiwgeV9zY3JvbGw9XCIreV9zY3JvbGwpO1xuIFxuICAgICAgICAvLyBJZiBvdmVyZmxvdy15IGlzIGhpZGRlbiwgc2Nyb2xsLCBvciBhdXRvLCBhbmQgdGhlIG92ZXJmbG93LXggcHJvcGVydHkgaXMgdmlzaWJsZSAoZGVmYXVsdCksIHRoZSB2YWx1ZSB3aWxsIGJlIGltcGxpY2l0bHkgY29tcHV0ZWQgYXMgYXV0by5cbiAgICAgICAgaWYgKHhfc2Nyb2xsID09PSAndmlzaWJsZScgJiYgKHlfc2Nyb2xsID09PSAnaGlkZGVuJyB8fCB5X3Njcm9sbCA9PT0gJ3Njcm9sbCcgfHwgeV9zY3JvbGwgPT09ICdhdXRvJykpXG4gICAgICAgICAgICB4X3Njcm9sbCA9ICdhdXRvJztcblxuICAgICAgICAvLyBJZiBvdmVyZmxvdy14IGlzIGhpZGRlbiwgc2Nyb2xsLCBvciBhdXRvIGFuZCB0aGUgb3ZlcmZsb3cteSBwcm9wZXJ0eSBpcyB2aXNpYmxlIChkZWZhdWx0KSwgdGhlIHZhbHVlIHdpbGwgYmUgaW1wbGljaXRseSBjb21wdXRlZCBhcyBhdXRvLlxuICAgICAgICBpZiAoeV9zY3JvbGwgPT09ICd2aXNpYmxlJyAmJiAoeF9zY3JvbGwgPT09ICdoaWRkZW4nIHx8IHhfc2Nyb2xsID09PSAnc2Nyb2xsJyB8fCB4X3Njcm9sbCA9PT0gJ2F1dG8nKSlcbiAgICAgICAgICAgIHlfc2Nyb2xsID0gJ2F1dG8nO1xuXG4gICAgICAgIC8vIHNldHRpbmcgb3ZlcmZsb3cgdG8gY2xpcCBpbiBvbmUgZGlyZWN0aW9uIHdoZW4gaXQgaXNuJ3Qgc2V0IHRvIHZpc2libGUgb3IgY2xpcCBpbiB0aGUgb3RoZXIgZGlyZWN0aW9uIHJlc3VsdHMgaW4gdGhlIGNsaXAgdmFsdWUgYmVoYXZpbmcgYXMgaGlkZGVuLiBcbiAgICAgICAgaWYgKHhfc2Nyb2xsID09PSAnY2xpcCcgJiYgeV9zY3JvbGwgIT09ICd2aXNpYmxlJyAmJiB5X3Njcm9sbCAhPT0gJ2NsaXAnKVxuICAgICAgICAgICAgeF9zY3JvbGwgPSAnaGlkZGVuJztcbiAgICAgICAgaWYgKHlfc2Nyb2xsID09PSAnY2xpcCcgJiYgeF9zY3JvbGwgIT09ICd2aXNpYmxlJyAmJiB4X3Njcm9sbCAhPT0gJ2NsaXAnKVxuICAgICAgICAgICAgeV9zY3JvbGwgPSAnaGlkZGVuJztcblxuICAgICAgICAvLyBub3Qgc2Nyb2xsYWJsZTogbm8gc2Nyb2xsIGJhcnNcbiAgICAgICAgaWYgKCh4X3Njcm9sbCA9PT0gJ3Zpc2libGUnIHx8IHhfc2Nyb2xsID09PSAnaGlkZGVuJyB8fCB4X3Njcm9sbCA9PT0gJ2NsaXAnKVxuICAgICAgICAgICAgJiYgKHlfc2Nyb2xsID09PSAndmlzaWJsZScgfHwgeV9zY3JvbGwgPT09ICdoaWRkZW4nIHx8IHlfc2Nyb2xsID09PSAnY2xpcCcpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIC8vIGZhbHNlIGlmIHRoZSBvdmVyYWxsIHNjcm9sbGFibGUgZWxlbWVudCAoY2xpZW50V2lkdGggKyBzY3JvbGxiYXJXaWR0aCBhbmQgY2xpZW50SGVpZ2h0ICsgc2Nyb2xsYmFySGVpZ2h0KSBpcyB0b28gc21hbGwgdG8gYmUgdmlzaWJsZSBvbiBzY3JlZW5cbiAgICAgICAgaWYgKE1hdGgubWF4KGVsZW0ub2Zmc2V0V2lkdGgsIGVsZW0ub2Zmc2V0SGVpZ2h0KSA8IDMwIHx8IE1hdGgubWluKGVsZW0ub2Zmc2V0V2lkdGgsIGVsZW0ub2Zmc2V0SGVpZ2h0KSA8IDE1KSAgXG4gICAgICAgICAgIHJldHVybiBmYWxzZTsgXG5cbiAgICAgICAgLy8gZmFsc2UgaWYgY29udGVudCBpcyBzbWFsbGVyIHRoYW4gdGhlIHNjcm9sbGFibGUgY29udGFpbmVyOiBib3RoIHggYW5kIHkgc2Nyb2xsIGRpc3RhbmNlcyA8IGVsZW1lbnQncyBob3Jpem9udGFsL3ZlcnRpY2FsIHBhZGRpbmdcbiAgICAgICAgY29uc3QgcGFkZGluZ194ID0gQ1NTVXRpbC5nZXRQaXhlbHNGcm9tU3R5bGUoc3R5bGVzLnBhZGRpbmdMZWZ0LCBlbGVtKSArIENTU1V0aWwuZ2V0UGl4ZWxzRnJvbVN0eWxlKHN0eWxlcy5wYWRkaW5nUmlnaHQsIGVsZW0pO1xuICAgICAgICBjb25zdCBwYWRkaW5nX3kgPSBDU1NVdGlsLmdldFBpeGVsc0Zyb21TdHlsZShzdHlsZXMucGFkZGluZ1RvcCwgZWxlbSkgKyBDU1NVdGlsLmdldFBpeGVsc0Zyb21TdHlsZShzdHlsZXMucGFkZGluZ0JvdHRvbSwgZWxlbSk7XG4gICAgICAgIGlmIChlbGVtLnNjcm9sbFdpZHRoIC0gIGVsZW0uY2xpZW50V2lkdGggPCAxICsgcGFkZGluZ194IFxuICAgICAgICAgICAgJiYgZWxlbS5zY3JvbGxIZWlnaHQgLSAgZWxlbS5jbGllbnRIZWlnaHQgPCAxKyBwYWRkaW5nX3kpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxufSIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbmNvbnN0IF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0Y29uc3QgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdGNvbnN0IG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0aWYgKCEobW9kdWxlSWQgaW4gX193ZWJwYWNrX21vZHVsZXNfXykpIHtcblx0XHRkZWxldGUgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0XHRjb25zdCBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIiArIG1vZHVsZUlkICsgXCInXCIpO1xuXHRcdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0XHR0aHJvdyBlO1xuXHR9XG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5leHBvcnQgeyBDb250ZXh0IH0gZnJvbSBcIi4vdjIvY29tbW9uL0NvbnRleHRcIlxuLy8gaW1wb3J0IHsgU2ltdWxhdG9yIH0gZnJvbSBcIi4vdjIvc2ltdWxhdG9yXCJcbmltcG9ydCB7IENoZWNrZXIgfSBmcm9tIFwiLi92NC9jaGVja2VyL0NoZWNrZXJcIlxuZXhwb3J0IHsgQ2hlY2tlciB9XG5leHBvcnQgeyBBUklBTWFwcGVyIH0gZnJvbSBcIi4vdjIvYXJpYS9BUklBTWFwcGVyXCI7XG5leHBvcnQgeyBDb25maWcgfSBmcm9tIFwiLi92Mi9jb25maWcvQ29uZmlnXCI7XG5leHBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5leHBvcnQgeyBTUkNvbnRyb2xsZXIgfSBmcm9tIFwiLi92NC9zaW11bGF0b3IvU1JDb250cm9sbGVyXCI7XG5leHBvcnQgeyBTUkN1cnNvciB9IGZyb20gXCIuL3Y0L3NpbXVsYXRvci9TUkN1cnNvclwiO1xuZXhwb3J0IHsgU1JWaWV3ZXIgfSBmcm9tIFwiLi92NC9zaW11bGF0b3IvU1JWaWV3ZXJcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrRGVtbyh0aW1lb3V0PzogbnVtYmVyKSB7XG4gICAgaWYgKCF0aW1lb3V0KSB0aW1lb3V0ID0gMDtcbiAgICBsZXQgY2hlY2tlciA9IG5ldyBDaGVja2VyKCk7XG4gICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgY2hlY2tlci5jaGVjayhkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0Rlc2lnblwiXSlcbiAgICAgICAgLnRoZW4oZnVuY3Rpb24ocmVwb3J0KSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhyZXBvcnQpO1xuICAgICAgICAgICAgY29uc3QgdmFscyA9IHtcbiAgICAgICAgICAgICAgICBcIkZBSUxcIjogMCxcbiAgICAgICAgICAgICAgICBcIlBPVEVOVElBTFwiOiAxLFxuICAgICAgICAgICAgICAgIFwiTUFOVUFMXCI6IDIsXG4gICAgICAgICAgICAgICAgXCJQQVNTXCI6IDNcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IGlkeD0wOyBpZHg8cmVwb3J0LnJlc3VsdHMubGVuZ3RoOyArK2lkeCkge1xuICAgICAgICAgICAgICAgIGlmIChyZXBvcnQucmVzdWx0c1tpZHhdLnZhbHVlWzFdID09PSBcIlBBU1NcIikge1xuICAgICAgICAgICAgICAgICAgICByZXBvcnQucmVzdWx0cy5zcGxpY2UoaWR4LS0sMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVwb3J0LnJlc3VsdHMuc29ydCgoYSxiKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGEuY2F0ZWdvcnkgIT0gYi5jYXRlZ29yeSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5jYXRlZ29yeS5sb2NhbGVDb21wYXJlKGIuY2F0ZWdvcnkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoYS5wYXRoW1wiYXJpYVwiXSA9PT0gYi5wYXRoW1wiYXJpYVwiXSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsc1thLnZhbHVlWzFdXS12YWxzW2IudmFsdWVbMV1dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYS5wYXRoW1wiYXJpYVwiXS5sb2NhbGVDb21wYXJlKGIucGF0aFtcImFyaWFcIl0pO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGxldCBsYXN0UGF0aCA9IG51bGw7XG4gICAgICAgICAgICBsZXQgY2F0ZWdvcnkgPSBudWxsO1xuICAgICAgICAgICAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVwb3J0LnJlc3VsdHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoY2F0ZWdvcnkgIT09IHJlc3VsdC5jYXRlZ29yeSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2F0ZWdvcnkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RQYXRoID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeSA9IHJlc3VsdC5jYXRlZ29yeTtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5ncm91cChyZXN1bHQuY2F0ZWdvcnkpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQucGF0aFtcImFyaWFcIl0gIT0gbGFzdFBhdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RQYXRoICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmdyb3VwRW5kKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGFzdFBhdGggPSByZXN1bHQucGF0aFtcImFyaWFcIl07XG4gICAgICAgICAgICAgICAgICAgIGlmIChsYXN0UGF0aCA9PT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5ncm91cChcInBhZ2VcIik7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmdyb3VwKGxhc3RQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhyZXN1bHQudmFsdWUsIHJlc3VsdC5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgICAgICAgfSk7XG4gICAgfSwgdGltZW91dCk7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0= +new ace.SRViewer(); \ No newline at end of file diff --git a/rule-server/src/static/archives/2026.07.13/js/ace-sr.js b/rule-server/src/static/archives/2026.07.13/js/ace-sr.js new file mode 100644 index 000000000..b7396ce43 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/js/ace-sr.js @@ -0,0 +1,3 @@ +/*! For license information please see ace.js.LICENSE.txt */ +var ace;(()=>{"use strict";var e={9910(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.ARIADefinitions=void 0;var i=function(){function e(){}return e.nameFromContent=function(t){return t in e.designPatterns&&e.designPatterns[t].nameFrom&&e.designPatterns[t].nameFrom.includes("contents")},e.globalProperties=["aria-atomic","aria-busy","aria-controls","aria-current","aria-describedby","aria-details","aria-flowto","aria-hidden","aria-keyshortcuts","aria-label","aria-labelledby","aria-live","aria-owns","aria-relevant","aria-roledescription","aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"],e.referenceProperties=["aria-owns","aria-controls","aria-describedby","aria-labelledby","aria-flowto","aria-activedescendant"],e.globalDeprecatedRoles=["directory","doc-biblioentry","doc-endnote"],e.globalDeprecatedProperties=["aria-grabbed","aria-dropeffect"],e.propertyDataTypes={"aria-activedescendant":{type:"http://www.w3.org/2001/XMLSchema#idref",hiddenIDRefSupported:!0},"aria-atomic":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-autocomplete":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["inline","list","both","none","undefined"]},"aria-busy":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-checked":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","mixed","undefined"]},"aria-colcount":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-colindex":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-colspan":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-controls":{type:"http://www.w3.org/2001/XMLSchema#idrefs",hiddenIDRefSupported:!0},"aria-current":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["page","step","location","date","time","true","false","undefined"]},"aria-describedby":{type:"http://www.w3.org/2001/XMLSchema#idrefs",hiddenIDRefSupported:!0},"aria-details":{type:"http://www.w3.org/2001/XMLSchema#idrefs"},"aria-disabled":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-dropeffect":{type:"http://www.w3.org/2001/XMLSchema#nmtokens",values:["copy","move","link","execute","popup","none"]},"aria-errormessage":{type:"http://www.w3.org/2001/XMLSchema#idref",hiddenIDRefSupported:!0},"aria-expanded":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","undefined"]},"aria-flowto":{type:"http://www.w3.org/2001/XMLSchema#idrefs",hiddenIDRefSupported:!1},"aria-grabbed":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","undefined"]},"aria-haspopup":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","menu","listbox","tree","grid","dialog"]},"aria-hidden":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","undefined"]},"aria-invalid":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","spelling","grammar","undefined"]},"aria-keyshortcuts":{type:"http://www.w3.org/2001/XMLSchema#string"},"aria-label":{type:"http://www.w3.org/2001/XMLSchema#string"},"aria-labelledby":{type:"http://www.w3.org/2001/XMLSchema#idrefs",hiddenIDRefSupported:!0},"aria-level":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-live":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["off","polite","assertive"]},"aria-modal":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-multiline":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-multiselectable":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-orientation":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["horizontal","vertical","undefined"]},"aria-owns":{type:"http://www.w3.org/2001/XMLSchema#idrefs",hiddenIDRefSupported:!0},"aria-placeholder":{type:"http://www.w3.org/2001/XMLSchema#string"},"aria-posinset":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-pressed":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","mixed","undefined"]},"aria-readonly":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-relevant":{type:"http://www.w3.org/2001/XMLSchema#nmtokens",values:["additions","removals","text","all"]},"aria-required":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-roledescription":{type:"http://www.w3.org/2001/XMLSchema#string"},"aria-rowcount":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-rowindex":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-rowspan":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-selected":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","undefined"]},"aria-setsize":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-sort":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["ascending","descending","other","none"]},"aria-valuemax":{type:"http://www.w3.org/2001/XMLSchema#decimal"},"aria-valuemin":{type:"http://www.w3.org/2001/XMLSchema#decimal"},"aria-valuenow":{type:"http://www.w3.org/2001/XMLSchema#decimal"},"aria-valuetext":{type:"http://www.w3.org/2001/XMLSchema#string"}},e.designPatterns={alert:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"liveRegion",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},alertdialog:{container:null,props:["aria-modal"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"window",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},application:{container:null,props:["aria-activedescendant","aria-expanded"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!0,nameFrom:["author"]},article:{container:null,props:["aria-posinset","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},banner:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},blockquote:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},button:{container:null,props:["aria-expanded","aria-pressed"],reqProps:null,reqChildren:null,htmlEquiv:"button | input[@type='button']",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-invalid"]},caption:{container:["figure","grid","table","treegrid"],props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},cell:{container:["row"],props:["aria-colindex","aria-colspan","aria-rowindex","aria-rowspan"],reqProps:null,reqChildren:null,htmlEquiv:"td",roleType:"structure",nameFrom:["author","contents"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},checkbox:{container:null,props:["aria-expanded","aria-readonly","aria-required"],reqProps:["aria-checked"],reqChildren:null,htmlEquiv:"input[@type='checkbox']",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-haspopup"]},code:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},columnheader:{container:["row"],props:["aria-colindex","aria-colspan","aria-expanded","aria-readonly","aria-required","aria-rowindex","aria-rowspan","aria-selected","aria-sort"],reqProps:null,reqChildren:null,htmlEquiv:"th[@scope='col']",roleType:"structure",nameRequired:!0,nameFrom:["author","contents"]},combobox:{container:null,props:["aria-controls","aria-activedescendant","aria-autocomplete","aria-readonly","aria-required"],reqProps:["aria-expanded"],reqChildren:[],htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"]},complementary:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},comment:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author","contents"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},contentinfo:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},definition:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},deletion:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},dialog:{container:null,props:["aria-modal"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"window",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},directory:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecated:!0,deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},"doc-abstract":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-acknowledgments":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-afterword":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-appendix":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-backlink":{container:null,props:["aria-disabled","aria-expanded","aria-haspopup"],reqProps:null,reqChildren:null,htmlEquiv:"a | link",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"]},"doc-biblioentry":{container:["list"],props:["aria-level","aria-posinset","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:"li",roleType:"structure",nameRequired:!0,nameFrom:["author"]},"doc-bibliography":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-biblioref":{container:null,props:["aria-disabled","aria-expanded","aria-haspopup"],reqProps:null,reqChildren:null,htmlEquiv:"a | link",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"]},"doc-chapter":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-colophon":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!0,nameFrom:["author"]},"doc-conclusion":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-cover":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"img",roleType:"structure",nameRequired:!1,nameFrom:["author"],presentationalChildren:!0},"doc-credit":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-credits":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-dedication":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-endnote":{container:["list"],props:["aria-level","aria-posinset","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:"li",roleType:"structure",nameRequired:!1,nameFrom:["author"]},"doc-endnotes":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!0,nameFrom:["author"]},"doc-epigraph":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-epilogue":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-errata":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-example":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-footnote":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-foreword":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-glossary":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-glossref":{container:null,props:["aria-disabled","aria-expanded","aria-haspopup"],reqProps:null,reqChildren:null,htmlEquiv:"a | link",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"]},"doc-index":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-introduction":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-noteref":{container:null,props:["aria-disabled","aria-expanded","aria-haspopup"],reqProps:null,reqChildren:null,htmlEquiv:"a | link",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"]},"doc-notice":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author"]},"doc-pagebreak":{container:null,props:["aria-orientation"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0},"doc-pagelist":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-pagefooter":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"]},"doc-pageheader":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"]},"doc-part":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-preface":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-prologue":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-pullquote":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author"]},"doc-qna":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-subtitle":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author","contents"]},"doc-tip":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author"]},"doc-toc":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},document:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},emphasis:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},feed:{container:null,props:null,reqProps:null,reqChildren:["article"],htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},figure:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},form:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"form",roleType:"landmark",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},generic:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"div | span",roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby","aria-roledescription"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},"graphics-document":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,nameRequired:!0,nameFrom:["author"]},"graphics-object":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,nameRequired:!1,nameFrom:["author"]},"graphics-symbol":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,nameRequired:!0,nameFrom:["author"],presentationalChildren:!0},grid:{container:null,props:["aria-activedescendant","aria-colcount","aria-multiselectable","aria-readonly","aria-rowcount"],reqProps:null,reqChildren:["row","rowgroup"],htmlEquiv:"table",roleType:"widget",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},gridcell:{container:["row"],props:["aria-colindex","aria-colspan","aria-disabled","aria-errormessage","aria-expanded","aria-haspopup","aria-invalid","aria-readonly","aria-required","aria-rowindex","aria-rowspan","aria-selected"],reqProps:null,reqChildren:null,htmlEquiv:"td",roleType:"widget",nameFrom:["author","contents"]},group:{container:null,props:["aria-activedescendant"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},heading:{container:null,props:null,reqProps:["aria-level"],reqChildren:null,htmlEquiv:"h1 | h2 | h3 | h4 | h5 | h6",roleType:"structure",nameRequired:!0,nameFrom:["author","contents"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},img:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"img",roleType:"structure",nameRequired:!0,nameFrom:["author"],presentationalChildren:!0,deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},image:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"img",roleType:"structure",nameRequired:!0,nameFrom:["author"],presentationalChildren:!0,deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},insertion:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},link:{container:null,props:["aria-expanded"],reqProps:null,reqChildren:null,htmlEquiv:"a | link",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],deprecatedProps:["aria-errormessage","aria-invalid"]},list:{container:null,props:null,reqProps:null,reqChildren:["listitem"],htmlEquiv:"ol | ul",roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},listbox:{container:null,props:["aria-activedescendant","aria-expanded","aria-multiselectable","aria-orientation","aria-readonly","aria-required"],reqProps:null,reqChildren:["group","option"],htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-haspopup"]},listitem:{container:["list"],props:["aria-level","aria-posinset","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:"li",roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},log:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"liveRegion",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},main:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},mark:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"mark",roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},marquee:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"liveRegion",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},math:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],presentationalChildren:!1,deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},menu:{container:null,props:["aria-activedescendant","aria-orientation"],reqProps:null,reqChildren:["group","menuitem","menuitemcheckbox","menuitemradio"],htmlEquiv:null,roleType:"widget",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},menubar:{container:null,props:["aria-activedescendant","aria-orientation"],reqProps:null,reqChildren:["group","menuitem","menuitemcheckbox","menuitemradio"],htmlEquiv:null,roleType:"widget",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},menuitem:{container:["group","menu","menubar"],props:["aria-expanded","aria-posinset","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],deprecatedProps:["aria-errormessage","aria-invalid"]},menuitemcheckbox:{container:["group","menu","menubar"],props:["aria-expanded","aria-posinset","aria-setsize"],reqProps:["aria-checked"],reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-invalid"]},menuitemradio:{container:["group","menu","menubar"],props:["aria-expanded","aria-posinset","aria-setsize"],reqProps:["aria-checked"],reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-invalid"]},meter:{container:null,props:["aria-valuemax","aria-valuemin","aria-valuetext"],reqProps:["aria-valuenow"],reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!0,nameFrom:["author"],presentationalChildren:!0,deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},navigation:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},none:{container:null,props:[],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},note:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},option:{container:["group","listbox"],props:["aria-selected","aria-checked","aria-posinset","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:"option",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},paragraph:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},presentation:{container:null,props:[],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},progressbar:{container:null,props:["aria-valuemax","aria-valuemin","aria-valuenow","aria-valuetext"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],presentationalChildren:!0,deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},radio:{container:null,props:["aria-posinset","aria-setsize"],reqProps:["aria-checked"],reqChildren:null,htmlEquiv:"input[@type='radio']",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},radiogroup:{container:null,props:["aria-activedescendant","aria-orientation","aria-readonly","aria-required"],reqProps:null,reqChildren:["radio"],htmlEquiv:null,roleType:"widget",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-haspopup"]},region:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},row:{container:["grid","rowgroup","table","treegrid"],props:["aria-activedescendant","aria-colindex","aria-expanded","aria-level","aria-posinset","aria-rowindex","aria-selected","aria-setsize"],reqProps:null,reqChildren:["cell","columnheader","gridcell","rowheader"],htmlEquiv:"tr",roleType:"structure",nameFrom:["author","contents"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},rowgroup:{container:["grid","table","treegrid"],props:[],reqProps:null,reqChildren:["row"],htmlEquiv:"tbody | tfoot | thead",roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},rowheader:{container:["row"],props:["aria-colindex","aria-colspan","aria-expanded","aria-readonly","aria-required","aria-rowindex","aria-rowspan","aria-selected","aria-sort"],reqProps:null,reqChildren:null,htmlEquiv:"th[@scope='row']",roleType:"structure",nameRequired:!0,nameFrom:["author","contents"]},scrollbar:{container:null,props:["aria-orientation","aria-valuemax","aria-valuemin","aria-valuetext"],reqProps:["aria-controls","aria-valuenow"],reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!1,nameFrom:["author"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},search:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},searchbox:{container:null,props:["aria-activedescendant","aria-autocomplete","aria-multiline","aria-placeholder","aria-readonly","aria-required"],reqProps:null,reqChildren:null,htmlEquiv:"input[@type='search']",roleType:"widget",nameRequired:!0,nameFrom:["author"]},separator:{container:null,props:["aria-orientation"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},slider:{container:null,props:["aria-orientation","aria-readonly","aria-valuemax","aria-valuemin","aria-valuetext"],reqProps:["aria-valuenow"],reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],presentationalChildren:!0},spinbutton:{container:null,props:["aria-activedescendant","aria-readonly","aria-required","aria-valuemax","aria-valuemin","aria-valuenow","aria-valuetext"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-haspopup"]},status:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"liveRegion",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},strong:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},subscript:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},suggestion:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},superscript:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},switch:{container:null,props:["aria-expanded","aria-readonly","aria-required"],reqProps:["aria-checked"],reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-haspopup"]},tab:{container:["tablist"],props:["aria-expanded","aria-posinset","aria-selected","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-invalid"]},table:{container:null,props:["aria-colcount","aria-rowcount"],reqProps:null,reqChildren:["row","rowgroup","caption"],htmlEquiv:"table",roleType:"structure",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},tablist:{container:null,props:["aria-activedescendant","aria-multiselectable","aria-orientation"],reqProps:null,reqChildren:["tab"],htmlEquiv:null,roleType:"widget",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},tabpanel:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},term:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"dfn",roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},textbox:{container:null,props:["aria-activedescendant","aria-autocomplete","aria-multiline","aria-placeholder","aria-readonly","aria-required"],reqProps:null,reqChildren:null,htmlEquiv:"input[@type='text']",roleType:"widget",nameRequired:!0,nameFrom:["author"]},time:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},timer:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"liveRegion",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},toolbar:{container:null,props:["aria-activedescendant","aria-orientation"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},tooltip:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author","contents"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},tree:{container:null,props:["aria-activedescendant","aria-multiselectable","aria-orientation","aria-required"],reqProps:null,reqChildren:["group","treeitem"],htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-haspopup"]},treegrid:{container:null,props:["aria-activedescendant","aria-colcount","aria-multiselectable","aria-orientation","aria-readonly","aria-required","aria-rowcount"],reqProps:null,reqChildren:["row","rowgroup"],htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-haspopup"]},treeitem:{container:["group","tree"],props:["aria-checked","aria-expanded","aria-level","aria-posinset","aria-selected","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],deprecatedProps:["aria-errormessage","aria-invalid"]}},e.elementsAllowedDisabled=["button","input","select","textarea","optgroup","option","fieldset"],e.elementsAllowedRequired=["select","textarea"],e.elementsAllowedReadOnly=["textarea"],e.documentConformanceRequirement={abbr:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},address:{implicitRole:["group"],validRoles:["any"],globalAriaAttributesValid:!0},article:{implicitRole:["article"],validRoles:["application","document","feed","main","none","presentation","region"],globalAriaAttributesValid:!0},aside:{implicitRole:["complementary"],validRoles:["doc-dedication","doc-example","doc-footnote","doc-glossary","doc-pullquote","doc-tip","feed","none","note","presentation","region","search"],globalAriaAttributesValid:!0},audio:{implicitRole:null,validRoles:["application"],globalAriaAttributesValid:!0},b:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},base:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},bdi:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},bdo:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},blockquote:{implicitRole:["blockquote"],validRoles:["any"],globalAriaAttributesValid:!0},body:{implicitRole:["generic"],validRoles:null,otherDisallowedAriaAttributes:["aria-hidden"],globalAriaAttributesValid:!0},br:{implicitRole:null,validRoles:["none","presentation"],globalAriaAttributesValid:!1,otherAllowedAriaAttributes:["aria-hidden"]},button:{implicitRole:["button"],validRoles:["checkbox","combobox","gridcell","link","menuitem","menuitemcheckbox","menuitemradio","option","radio","separator","slider","switch","tab","treeitem"],globalAriaAttributesValid:!0},canvas:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0},caption:{implicitRole:["caption"],validRoles:null,globalAriaAttributesValid:!0,allowAttributesFromImplicitRole:!1},cite:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},code:{implicitRole:["code"],validRoles:["any"],globalAriaAttributesValid:!0},col:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},colgroup:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},data:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},datalist:{implicitRole:["listbox"],validRoles:null,globalAriaAttributesValid:!1,allowAttributesFromImplicitRole:!1},dd:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0},del:{implicitRole:["deletion"],validRoles:["any"],globalAriaAttributesValid:!0},details:{implicitRole:["group"],validRoles:null,globalAriaAttributesValid:!0},dfn:{implicitRole:["term"],validRoles:["any"],globalAriaAttributesValid:!0},dialog:{implicitRole:["dialog"],validRoles:["alertdialog"],globalAriaAttributesValid:!0},dl:{implicitRole:null,validRoles:["group","list","none","presentation"],globalAriaAttributesValid:!0},dt:{implicitRole:["term"],validRoles:["listitem"],globalAriaAttributesValid:!0},em:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0},embed:{implicitRole:null,validRoles:["application","document","img","none","presentation"],globalAriaAttributesValid:!0},fieldset:{implicitRole:["group"],validRoles:["none","presentation","radiogroup"],globalAriaAttributesValid:!0},figcaption:{implicitRole:null,validRoles:["group","none","presentation"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},form:{implicitRole:["form"],validRoles:["none","presentation","search"],globalAriaAttributesValid:!0},head:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},hgroup:{implicitRole:["group"],validRoles:["any"],globalAriaAttributesValid:!0},h1:{implicitRole:["heading"],validRoles:["doc-subtitle","none","presentation","tab"],globalAriaAttributesValid:!0},h2:{implicitRole:["heading"],validRoles:["doc-subtitle","none","presentation","tab"],globalAriaAttributesValid:!0},h3:{implicitRole:["heading"],validRoles:["doc-subtitle","none","presentation","tab"],globalAriaAttributesValid:!0},h4:{implicitRole:["heading"],validRoles:["doc-subtitle","none","presentation","tab"],globalAriaAttributesValid:!0},h5:{implicitRole:["heading"],validRoles:["doc-subtitle","none","presentation","tab"],globalAriaAttributesValid:!0},h6:{implicitRole:["heading"],validRoles:["doc-subtitle","none","presentation","tab"],globalAriaAttributesValid:!0},hr:{implicitRole:["separator"],validRoles:["doc-pagebreak","none","presentation"],globalAriaAttributesValid:!0},html:{implicitRole:["document"],validRoles:null,globalAriaAttributesValid:!1,allowAttributesFromImplicitRole:!1},i:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},iframe:{implicitRole:null,validRoles:["application","document","img","none","presentation"],globalAriaAttributesValid:!0},ins:{implicitRole:["insertion"],validRoles:["any"],globalAriaAttributesValid:!0},kbd:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},label:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},legend:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},link:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},main:{implicitRole:["main"],validRoles:null,globalAriaAttributesValid:!0},map:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},mark:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},math:{implicitRole:["math"],validRoles:null,globalAriaAttributesValid:!0},menu:{implicitRole:["list"],validRoles:["group","listbox","menu","menubar","none","presentation","radiogroup","tablist","toolbar","tree"],globalAriaAttributesValid:!0},meta:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},meter:{implicitRole:["meter"],validRoles:null,globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-valuemax","aria-valuemin"],allowAttributesFromImplicitRole:!1},nav:{implicitRole:["navigation"],validRoles:["doc-index","doc-pagelist","doc-toc","menu","menubar","tablist","none","presentation"],globalAriaAttributesValid:!0},noscript:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},object:{implicitRole:null,validRoles:["application","document","img"],globalAriaAttributesValid:!0},ol:{implicitRole:["list"],validRoles:["group","listbox","menu","menubar","none","presentation","radiogroup","tablist","toolbar","tree"],globalAriaAttributesValid:!0},optgroup:{implicitRole:["group"],validRoles:null,globalAriaAttributesValid:!0},option:{implicitRole:["option"],validRoles:null,globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-selected"]},output:{implicitRole:["status"],validRoles:["any"],globalAriaAttributesValid:!0},p:{implicitRole:["paragraph"],validRoles:["any"],globalAriaAttributesValid:!0},param:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},picture:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1,otherAllowedAriaAttributes:["aria-hidden"]},pre:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},progress:{implicitRole:["progressbar"],validRoles:null,globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-valuemax"]},q:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},rp:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0},rt:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},ruby:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0},s:{implicitRole:["deletion"],validRoles:["any"],globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-label","aria-labelledby"]},samp:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},script:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},search:{implicitRole:["search"],validRoles:["search","form","group","none","presentation","region"],globalAriaAttributesValid:!0},slot:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},small:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},source:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},span:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},strong:{implicitRole:["strong"],validRoles:["any"],globalAriaAttributesValid:!0},style:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},sub:{implicitRole:["subscript"],validRoles:["any"],globalAriaAttributesValid:!0},sup:{implicitRole:["superscript"],validRoles:["any"],globalAriaAttributesValid:!0},svg:{implicitRole:["graphics-document"],validRoles:["any"],globalAriaAttributesValid:!0},table:{implicitRole:["table"],validRoles:["any"],globalAriaAttributesValid:!0},template:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},textarea:{implicitRole:["textbox"],validRoles:null,globalAriaAttributesValid:!0},tfoot:{implicitRole:["rowgroup"],validRoles:["any"],globalAriaAttributesValid:!0},thead:{implicitRole:["rowgroup"],validRoles:["any"],globalAriaAttributesValid:!0},time:{implicitRole:["time"],validRoles:["any"],globalAriaAttributesValid:!0},title:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},track:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},u:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},ul:{implicitRole:["list"],validRoles:["group","listbox","menu","menubar","none","presentation","radiogroup","tablist","toolbar","tree"],globalAriaAttributesValid:!0},var:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},video:{implicitRole:null,validRoles:["application"],globalAriaAttributesValid:!0},wbr:{implicitRole:null,validRoles:["none","presentation"],globalAriaAttributesValid:!1,otherAllowedAriaAttributes:["aria-hidden"]}},e.documentConformanceRequirementSpecialTags={a:{"with-href":{implicitRole:["link"],validRoles:["button","checkbox","doc-backlink","doc-biblioref","doc-glossref","doc-noteref","menuitem","menuitemcheckbox","menuitemradio","option","radio","switch","tab","treeitem"],globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-disabled=true"]},"without-href":{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0}},area:{"with-href":{implicitRole:["link"],validRoles:null,globalAriaAttributesValid:!0},"without-href":{implicitRole:["generic"],validRoles:["button","link"],globalAriaAttributesValid:!0}},div:{"child-dl":{implicitRole:["generic"],validRoles:["presentation","none"],globalAriaAttributesValid:!0},"no-child-dl":{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0}},figure:{"child-figcaption":{implicitRole:["figure"],validRoles:["doc-example"],globalAriaAttributesValid:!0},"no-child-figcaption":{implicitRole:["figure"],validRoles:["any"],globalAriaAttributesValid:!0}},footer:{"des-section-article-aside-main-nav":{implicitRole:["generic"],validRoles:["doc-footnote","group","none","presentation"],globalAriaAttributesValid:!0},other:{implicitRole:["contentinfo"],validRoles:["doc-footnote","group","none","presentation"],globalAriaAttributesValid:!0}},header:{"des-section-article-aside-main-nav":{implicitRole:["generic"],validRoles:["group","none","presentation"],globalAriaAttributesValid:!0},other:{implicitRole:["banner"],validRoles:["group","none","presentation"],globalAriaAttributesValid:!0}},img:{"img-with-accname":{implicitRole:["img"],validRoles:["button","checkbox","doc-cover","link","menuitem","menuitemcheckbox","menuitemradio","meter","option","progressbar","radio","scrollbar","separator","slider","switch","tab","treeitem"],globalAriaAttributesValid:!0},"img-without-accname-empty-alt":{implicitRole:["presentation","none"],validRoles:null,globalAriaAttributesValid:!1,otherAllowedAriaAttributes:["aria-hidden=true"]},"img-without-accname-no-alt":{implicitRole:["img"],validRoles:["presentation","none"],globalAriaAttributesValid:!1,otherAllowedAriaAttributes:["aria-hidden=true"]}},input:{button:{implicitRole:["button"],validRoles:["checkbox","combobox","gridcell","link","menuitem","menuitemcheckbox","menuitemradio","option","radio","slider","switch","tab","treeitem"],globalAriaAttributesValid:!0},"checkbox-with-aria-pressed":{implicitRole:["checkbox"],validRoles:["menuitemcheckbox","option","switch","button"],globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-required"],otherDisallowedAriaAttributes:["aria-checked"]},"checkbox-without-aria-pressed":{implicitRole:["checkbox"],validRoles:["menuitemcheckbox","option","switch"],globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-required"],otherDisallowedAriaAttributes:["aria-checked"]},color:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0},date:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-required","aria-readonly"],otherRolesForAttributes:["textbox"]},"datetime-local":{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-required","aria-readonly"],otherRolesForAttributes:["textbox"]},"email-no-list":{implicitRole:["textbox"],validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"],otherRolesForAttributes:["textbox"]},"email-with-list":{implicitRole:["combobox"],validRoles:null,globalAriaAttributesValid:!0},file:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-required"]},hidden:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},image:{implicitRole:["button"],validRoles:["checkbox","gridcell","link","menuitem","menuitemcheckbox","menuitemradio","option","radio","slider","switch","tab","treeitem"],globalAriaAttributesValid:!0},month:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-readonly"],otherRolesForAttributes:["textbox"]},number:{implicitRole:["spinbutton"],validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"]},password:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"],otherRolesForAttributes:["textbox"]},radio:{implicitRole:["radio"],validRoles:["menuitemradio"],globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-required"],otherDisallowedAriaAttributes:["aria-checked"]},range:{implicitRole:["slider"],validRoles:null,globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-valuemax","aria-valuemin"]},reset:{implicitRole:["button"],validRoles:["checkbox","combobox","gridcell","link","menuitem","menuitemcheckbox","menuitemradio","option","radio","slider","switch","tab","treeitem"],globalAriaAttributesValid:!0},"search-no-list":{implicitRole:["searchbox"],validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"]},"search-with-list":{implicitRole:["combobox"],validRoles:null,globalAriaAttributesValid:!0},submit:{implicitRole:["button"],validRoles:["checkbox","combobox","gridcell","link","menuitem","menuitemcheckbox","menuitemradio","option","radio","slider","switch","tab","treeitem"],globalAriaAttributesValid:!0},"tel-no-list":{implicitRole:["textbox"],validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"]},"tel-with-list":{implicitRole:["combobox"],validRoles:null,globalAriaAttributesValid:!0},"text-no-list":{implicitRole:["textbox"],validRoles:["combobox","searchbox","spinbutton"],globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"]},"text-with-list":{implicitRole:["combobox"],validRoles:null,globalAriaAttributesValid:!0},time:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-readonly"],otherRolesForAttributes:["textbox"]},"url-no-list":{implicitRole:["textbox"],validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"]},"url-with-list":{implicitRole:["combobox"],validRoles:null,globalAriaAttributesValid:!0},week:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-readonly"],otherRolesForAttributes:["textbox"]},"default-with-list":{implicitRole:["combobox"],validRoles:null,globalAriaAttributesValid:!0},"default-no-list":{implicitRole:["textbox"],validRoles:null,globalAriaAttributesValid:!0}},li:{"child-of-list-role":{implicitRole:["listitem"],validRoles:null,globalAriaAttributesValid:!0},"no-child-of-list-role":{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0}},section:{"with-name":{implicitRole:["region"],validRoles:["alert","alertdialog","application","banner","complementary","contentinfo","dialog","doc-abstract","doc-acknowledgments","doc-afterword","doc-appendix","doc-bibliography","doc-chapter","doc-colophon","doc-conclusion","doc-credit","doc-credits","doc-dedication","doc-endnotes","doc-epigraph","doc-epilogue","doc-errata","doc-example","doc-foreword","doc-glossary","doc-index","doc-introduction","doc-notice","doc-pagelist","doc-part","doc-preface","doc-prologue","doc-pullquote","doc-qna","doc-toc","document","feed","group","log","main","marquee","navigation","none","note","presentation","search","status","tabpanel"],globalAriaAttributesValid:!0},"without-name":{implicitRole:null,validRoles:["alert","alertdialog","application","banner","complementary","contentinfo","dialog","doc-abstract","doc-acknowledgments","doc-afterword","doc-appendix","doc-bibliography","doc-chapter","doc-colophon","doc-conclusion","doc-credit","doc-credits","doc-dedication","doc-endnotes","doc-epigraph","doc-epilogue","doc-errata","doc-example","doc-foreword","doc-glossary","doc-index","doc-introduction","doc-notice","doc-pagelist","doc-part","doc-preface","doc-prologue","doc-pullquote","doc-qna","doc-toc","document","feed","group","log","main","marquee","navigation","none","note","presentation","search","status","tabpanel"],globalAriaAttributesValid:!0}},select:{"no-multiple-attr-size-gt1":{implicitRole:["combobox"],validRoles:["menu"],globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-multiselectable"]},"multiple-attr-size-gt1":{implicitRole:["listbox"],validRoles:null,globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-multiselectable"]}},summary:{"first-summary-of-detail":{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-disabled","aria-haspopup"]},"no-first-summary-of-detail":{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0}},tbody:{"des-table":{implicitRole:["rowgroup"],validRoles:["any"],globalAriaAttributesValid:!0},"des-grid":{implicitRole:["rowgroup"],validRoles:["any"],globalAriaAttributesValid:!0},"des-treegrid":{implicitRole:["rowgroup"],validRoles:["any"],globalAriaAttributesValid:!0},"des-other":{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0}},td:{"des-table":{implicitRole:["cell"],validRoles:null,globalAriaAttributesValid:!0},"des-grid":{implicitRole:["gridcell"],validRoles:null,globalAriaAttributesValid:!0},"des-treegrid":{implicitRole:["gridcell"],validRoles:null,globalAriaAttributesValid:!0},"des-other":{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0}},th:{"des-table-row-scope":{implicitRole:["rowheader","cell"],validRoles:null,globalAriaAttributesValid:!0},"des-table-column-scope":{implicitRole:["columnheader","cell"],validRoles:null,globalAriaAttributesValid:!0},"des-grid-treegrid-row-scope":{implicitRole:["rowheader","gridcell"],validRoles:null,globalAriaAttributesValid:!0},"des-grid-treegrid-column-scope":{implicitRole:["columnheader","gridcell"],validRoles:null,globalAriaAttributesValid:!0},"des-other":{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0}},tr:{"des-table":{implicitRole:["row"],validRoles:null,globalAriaAttributesValid:!0},"des-grid":{implicitRole:["row"],validRoles:null,globalAriaAttributesValid:!0},"des-treegrid":{implicitRole:["row"],validRoles:null,globalAriaAttributesValid:!0},"des-other":{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0}},default:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0}},e.relatedAriaHtmlAttributes={"aria-checked":{conflict:[{ariaAttributeValue:"false",htmlAttributeNames:["checked"],htmlAttributeValues:null}],overlapping:[{ariaAttributeValue:"true",htmlAttributeNames:["checked"],htmlAttributeValues:null}]},"aria-disabled":{conflict:[{ariaAttributeValue:"false",htmlAttributeNames:["disabled"],htmlAttributeValues:null}],overlapping:[{ariaAttributeValue:"true",htmlAttributeNames:["disabled"],htmlAttributeValues:null}]},"aria-hidden":{conflict:[{ariaAttributeValue:"false",htmlAttributeNames:["hidden"],htmlAttributeValues:["hidden,null"]},{ariaAttributeValue:"true",htmlAttributeNames:["hidden"],htmlAttributeValues:["until-found"]}],overlapping:[{ariaAttributeValue:"true",htmlAttributeNames:["hidden"],htmlAttributeValues:["hidden,null"]}]},"aria-placeholder":{conflict:[{ariaAttributeValue:null,htmlAttributeNames:["placeholder"],htmlAttributeValues:null}]},"aria-valuemax":{conflict:[{ariaAttributeValue:null,htmlAttributeNames:["max"],htmlAttributeValues:null}]},"aria-valuemin":{conflict:[{ariaAttributeValue:null,htmlAttributeNames:["min"],htmlAttributeValues:null}]},"aria-readonly":{conflict:[{ariaAttributeValue:"false",htmlAttributeNames:["readonly","contenteditable","iscontenteditable"],htmlAttributeValues:[null,"false","false"]}],overlapping:[{ariaAttributeValue:"true",htmlAttributeNames:["readonly","contenteditable","iscontenteditable"],htmlAttributeValues:[null,"true","true"]}]},"aria-required":{conflict:[{ariaAttributeValue:"false",htmlAttributeNames:["required"],htmlAttributeValues:null}],overlapping:[{ariaAttributeValue:"true",htmlAttributeNames:["required"],htmlAttributeValues:null}]},"aria-colspan":{conflict:[{ariaAttributeValue:"VALUE",htmlAttributeNames:["colspan"],htmlAttributeValues:["VALUE"]}],overlapping:[{ariaAttributeValue:null,htmlAttributeNames:["colspan"],htmlAttributeValues:null}]},"aria-rowspan":{conflict:[{ariaAttributeValue:"VALUE",htmlAttributeNames:["rowspan"],htmlAttributeValues:["VALUE"]}],overlapping:[{ariaAttributeValue:null,htmlAttributeNames:["rowspan"],htmlAttributeValues:null}]}},e.containers=[],e}();t.ARIADefinitions=i;var a=[];for(var n in i.designPatterns){var l=i.designPatterns[n].container;if(null!==l)for(var r=0,o=l;r<o.length;r++){var s=o[r];-1==a.indexOf(s)&&a.push(s)}}i.containers=a},9955(e,t,i){var a,n=this&&this.__extends||(a=function(e,t){return a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i])},a(e,t)},function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function i(){this.constructor=e}a(e,t),e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)});Object.defineProperty(t,"__esModule",{value:!0}),t.ARIAMapper=void 0;var l=i(9910),r=i(3103),o=i(1686),s=i(7139),u=i(7011),d=i(5279),c=i(1560),m=i(4566),p=i(3864),h=i(1950),g=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.childrenCanHaveRole=function(e,t){return!(t in l.ARIADefinitions.designPatterns&&l.ARIADefinitions.designPatterns[t].presentationalChildren)},t.prototype.getRole=function(e){return t.nodeToRole(e)},t.prototype.getNamespace=function(){return"aria"},t.prototype.getAttributes=function(e){var i={};if(1===e.nodeType){var a=m.CacheUtil.getCache(e,"ARIAMapper::getAttributes",void 0);if(void 0!==a)return a;for(var n=e,l=0;l<n.attributes.length;++l){var r=n.attributes[l],o=r.name.toLowerCase();o.startsWith("aria-")&&(i[o.substring(5)]=r.nodeValue)}var s=e.nodeName.toLowerCase();t.applyAttrRole(n,"global",i),t.applyAttrRole(n,s,i),m.CacheUtil.setCache(e,"ARIAMapper::getAttributes",i)}else if(3===e.nodeType){var u=t.textAttrValueCalculators;for(var d in u){var c=u[d](e);null!=c&&(i[d]=c)}}return i},t.applyAttrRole=function(e,i,a){var n=t.elemAttrValueCalculators;if(i in n)for(var l in n[i])if(!(l in a)){var r=n[i][l];null!=r&&("string"!=typeof r&&(r=r(e)),a[l]=r)}},t.getAriaOwnedBy=function(e){var t=d.FragmentUtil.getOwnerFragment(e);if(!m.CacheUtil.getCache(t,"ARIAMapper::precalcOwned",!1)){for(var i=t.querySelectorAll("[aria-owns]"),a=0;a<i.length;++a)for(var n=i[a],l=n.getAttribute("aria-owns").split(/ +/g),r=function(e){var i=t.getElementById(l[e]);if(i&&!o.DOMUtil.sameNode(n,i)){for(var a=[],r=i.querySelectorAll("[aria-owns]"),s=0;s<r.length;++s)for(var u=r[s].getAttribute("aria-owns").split(/ +/g),d=0;d<u.length;++d){var c=t.getElementById(u[d]);c&&a.push(c)}if(0===a.length)return m.CacheUtil.setCache(i,"aria-owned",n),"continue";for(var h=n,g=!1;null!==h;){if(a.some(function(e){return o.DOMUtil.sameNode(h,e)})){g=!0;break}h=p.DOMWalker.parentElement(h)}g||m.CacheUtil.setCache(i,"aria-owned",n)}},s=0;s<l.length;++s)r(s);m.CacheUtil.setCache(t,"ARIAMapper::precalcOwned",!0)}return m.CacheUtil.getCache(e,"aria-owned",null)},t.prototype.getNodeHierarchy=function(e){if(!e)return[];if(1!==e.nodeType){for(var i=(s=this.getNodeHierarchy(p.DOMWalker.parentElement(e))).length>0?s[s.length-1]:{role:"",rolePath:"",roleCount:{},childrenCanHaveRole:!0},a=[],n=0,l=s;n<l.length;n++){var r=l[n];a.push(r)}return a.push({attributes:{},bounds:this.getBounds(e),namespace:this.getNamespace(),node:e,role:this.getRole(e)||null,rolePath:i.rolePath+"/"+(this.getRole(e)||null),roleCount:{},childrenCanHaveRole:i.childrenCanHaveRole}),a}var o=e;if(!(a=m.CacheUtil.getCache(o,"ARIAMapper::getNodeHierarchy",null))){var s,u=t.getAriaOwnedBy(o);for(u||(u=p.DOMWalker.parentElement(o));u&&1!==u.nodeType;)u=p.DOMWalker.parentElement(o);for(i=(s=u?this.getNodeHierarchy(u):[]).length>0?s[s.length-1]:{role:"",rolePath:"",roleCount:{},childrenCanHaveRole:!0};null===i.role;)i=(s=(u=t.getAriaOwnedBy(u)||p.DOMWalker.parentElement(u))?this.getNodeHierarchy(u):[])[s.length-1];var d={attributes:1===o.nodeType?this.getAttributes(o):{},bounds:this.getBounds(o),namespace:this.getNamespace(),node:o,role:this.getRole(o)||null,rolePath:"",roleCount:{},childrenCanHaveRole:!0};i.childrenCanHaveRole?d.childrenCanHaveRole=i.childrenCanHaveRole&&this.childrenCanHaveRole(o,d.role):d.role=null,null!==d.role?(i.roleCount[d.role]=(i.roleCount[d.role]||0)+1,d.rolePath=i.rolePath+"/"+d.role+"["+i.roleCount[d.role]+"]"):d.rolePath=i.rolePath,a=[];for(var c=0,h=s;c<h.length;c++)r=h[c],a.push(r);a.push(d),m.CacheUtil.setCache(o,"ARIAMapper::getNodeHierarchy",a)}return a},t.prototype.reset=function(e){t.nameComputationId=0,this.hierarchyRole=[],this.hierarchyResults=[],this.hierarchyPath=[{rolePath:"",roleCount:{}}];for(var i,a=e;i=p.DOMWalker.parentNode(a);)a=i;var n=new c.ARIAWalker(a,!1,a);do{1===n.node.nodeType&&this.getNodeHierarchy(n.node)}while(n.nextNode())},t.prototype.openScope=function(e){null===this.hierarchyRole&&this.reset(e),this.pushHierarchy(e);for(var t=0;t<this.hierarchyResults.length;++t)this.hierarchyResults[t].role&&"/"===this.hierarchyResults[t].role[0]&&(this.hierarchyResults[t].role=this.hierarchyResults[t].role?this.hierarchyResults[t].role.substring(1):null);return this.hierarchyResults},t.prototype.pushHierarchy=function(e){var t,i=(t=this.getNodeHierarchy(e))[t.length-1];this.hierarchyRole.push(i.role),null!==i.role&&this.hierarchyPath.push(i),this.hierarchyResults=t},t.prototype.closeScope=function(e){for(var t=[],i=0,a=this.hierarchyResults;i<a.length;i++){var n=a[i];t.push(n)}if(t.length>0){t[t.length-1].role="/"+t[t.length-1].role;var l=p.DOMWalker.parentElement(e);this.hierarchyResults=l?m.CacheUtil.getCache(l,"ARIAMapper::getNodeInfo",[]):[]}return t},t.nodeToRole=function(e){if(3===e.nodeType)return"text";if(1!==e.nodeType)return null;var t=e;if(!t||1!==t.nodeType)return null;if(t.hasAttribute("role")&&t.getAttribute("role").trim().length>0)for(var i=0,a=t.getAttribute("role").trim().split(" ");i<a.length;i++){var n=a[i];if("presentation"===n||"none"===n){if(!s.CommonUtil.isFocusable(t))return null}else if(n in l.ARIADefinitions.designPatterns)return n}var r=u.AriaUtil.getImplicitRole(t),o=r&&0!==r.length?r[0]:null;return"presentation"===o||"none"===o?null:o},t.elemAttrValueCalculators={global:{name:function(e){var t;return null===(t=h.AccNameUtil.computeAccessibleName(e))||void 0===t?void 0:t.name}},datalist:{multiselectable:function(e){var t=e.getAttribute("id");return t&&t.length>0?(e.ownerDocument.querySelector("input[list='"+t+"']"),""+(e.getAttribute("multiple")&&("true"==e.getAttribute("multiple")||""==e.getAttribute("multiple")))):null}},h1:{level:"1"},h2:{level:"2"},h3:{level:"3"},h4:{level:"4"},h5:{level:"5"},h6:{level:"6"},input:{checked:function(e){var t=e.getAttribute("type");return"checkbox"===t||"radio"===t?""+e.checked:null},setsize:function(e){return null},posinset:function(e){return null},owns:function(e){return null}},keygen:{multiselectable:"false"},li:{setsize:function(e){var t=o.DOMUtil.getAncestor(e,["ol","ul","menu"]);if(!t)return null;var i=m.CacheUtil.getSetCache(t,"elemAttrValueCalculators::lis",function(){return t.querySelectorAll("li")}),a=m.CacheUtil.getSetCache(t,"elemAttrValueCalculators::otherlis",function(){return t.querySelectorAll("ol li, ul li, menu li")});return""+(i.length-a.length)},posinset:function(e){var t=o.DOMUtil.getAncestor(e,["ol","ul","menu"]);if(!t)return null;for(var i=m.CacheUtil.getSetCache(t,"elemAttrValueCalculators::lis",function(){return t.querySelectorAll("li")}),a=0,n=0;n<i.length;++n){var l=i[n];if(o.DOMUtil.sameNode(t,o.DOMUtil.getAncestor(l,["ol","ul","menu"])))return""+a;++a}return null}},menuitem:{checked:function(e){return""+!(!e.getAttribute("checked")||"true"!=e.getAttribute("checked")&&""!=e.getAttribute("checked"))}},option:{selected:function(e){return""+!(!e.getAttribute("selected")||"true"!=e.getAttribute("selected")&&""!=e.getAttribute("selected"))}},progress:{valuemax:function(e){return e.getAttribute("max")||"1"},valuemin:function(e){return"0"},valuenow:function(e){return e.getAttribute("value")}}},t.textAttrValueCalculators={name:function(e){return e.nodeValue}},t.nameComputationId=0,t}(r.CommonMapper);t.ARIAMapper=g},1560(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.ARIAWalker=void 0;var a=i(5279),n=i(9955),l=i(3946),r=i(3864),o=function(){function e(e,t,i){this.root=i||e,9===this.root.nodeType&&(this.root=this.root.documentElement),this.node=e,this.bEndTag=null!=t&&1==t}return e.prototype.atRoot=function(){return!this.ownerElement&&(this.root===this.node||(this.root.isSameNode?this.root.isSameNode(this.node):this.root.compareDocumentPosition?0===this.root.compareDocumentPosition(this.node):null===this.node.parentNode))},e.prototype.nextNode=function(){var e=!1;do{if(e=!1,this.bEndTag){if(this.atRoot())return!1;if(this.node.slotOwner){var t=this.node.slotOwner,i=this.node.slotIndex+1;i<t.assignedNodes().length?(this.node=t.assignedNodes()[i],this.bEndTag=!1):(this.node=t,this.bEndTag=!0)}else if(this.node.ownerElement)this.node=this.node.ownerElement,this.bEndTag=!0;else if(r.DOMWalker.nextSiblingNotOwnedBySlot(this.node))this.node=r.DOMWalker.nextSiblingNotOwnedBySlot(this.node),this.bEndTag=!1,e=!0;else{if(!this.node.parentNode)return!1;if(1===this.node.parentNode.nodeType&&this.node.parentNode.hasAttribute("aria-owns")){var o=this.node.parentNode.getAttribute("aria-owns").split(/ +/g);if(1===this.node.nodeType&&this.node.hasAttribute("id")){var s=o.indexOf(this.node.getAttribute("id"));s===o.length-1?(this.node=this.node.parentNode,this.bEndTag=!0):(this.node=a.FragmentUtil.getOwnerFragment(this.node).getElementById(o[s+1]),this.bEndTag=!1)}else this.node=a.FragmentUtil.getOwnerFragment(this.node).getElementById(o[0]),this.bEndTag=!1}this.node=this.node.parentNode,this.bEndTag=!0}}else{var u=this.node,d=this.node,c=this.node;if(1===this.node.nodeType&&"IFRAME"===this.node.nodeName.toUpperCase()&&l.VisUtil.isNodeVisible(u)&&u.contentDocument&&u.contentDocument.documentElement){var m=this.node;this.node=u.contentDocument.documentElement,this.node.ownerElement=m}else 1===this.node.nodeType&&l.VisUtil.isNodeVisible(d)&&d.shadowRoot&&d.shadowRoot.firstChild?(m=this.node,this.node=d.shadowRoot,this.node.ownerElement=m,r.DOMWalker.assignSlots(this.node)):1===this.node.nodeType&&"slot"===d.nodeName.toLowerCase()&&c.assignedNodes().length>0?this.node=c.assignedNodes()[0]:1!==this.node.nodeType&&11!==this.node.nodeType||!r.DOMWalker.firstChildNotOwnedBySlot(this.node)?this.bEndTag=!0:this.node=r.DOMWalker.firstChildNotOwnedBySlot(this.node)}}while(1!==this.node.nodeType&&11!==this.node.nodeType&&3!==this.node.nodeType||1===this.node.nodeType&&"ACE"===this.node.getAttribute("aChecker")||e&&1===this.node.nodeType&&n.ARIAMapper.getAriaOwnedBy(this.node));return!0},e.prototype.prevNode=function(){var e=!1;do{if(e=!1,this.bEndTag){var t=this.node,i=this.node;if(1===this.node.nodeType&&"IFRAME"===this.node.nodeName.toUpperCase()&&l.VisUtil.isNodeVisible(t)&&t.contentDocument&&t.contentDocument.documentElement){var o=this.node;this.node=t.contentDocument.documentElement,this.node.ownerElement=o}else 1===this.node.nodeType&&l.VisUtil.isNodeVisible(i)&&i.shadowRoot&&i.shadowRoot.lastChild?(o=this.node,this.node=i.shadowRoot,this.node.ownerElement=o,r.DOMWalker.assignSlots(this.node)):1!==this.node.nodeType&&11!==this.node.nodeType||!r.DOMWalker.lastChildNotOwnedBySlot(this.node)?this.bEndTag=!1:this.node=r.DOMWalker.lastChildNotOwnedBySlot(this.node)}else{if(this.atRoot())return!1;if(r.DOMWalker.previousSiblingNotOwnedBySlot(this.node))this.node=r.DOMWalker.previousSiblingNotOwnedBySlot(this.node),this.bEndTag=!0;else if(this.node.ownerElement)this.node=this.node.ownerElement,this.bEndTag=!1,e=!0;else{if(!this.node.parentNode)return!1;if(1===this.node.parentNode.nodeType&&this.node.parentNode.hasAttribute("aria-owns")){var s=this.node.parentNode.getAttribute("aria-owns").split(/ +/g);if(1===this.node.nodeType&&this.node.hasAttribute("id")){var u=s.indexOf(this.node.getAttribute("id"));u===s.length-1?(this.node=this.node.parentNode,this.bEndTag=!0):(this.node=a.FragmentUtil.getOwnerFragment(this.node).getElementById(s[u+1]),this.bEndTag=!1)}else this.node=a.FragmentUtil.getOwnerFragment(this.node).getElementById(s[0]),this.bEndTag=!1}this.node=this.node.parentNode,this.bEndTag=!1}}}while(1!==this.node.nodeType&&11!==this.node.nodeType||1===this.node.nodeType&&"ACE"===this.node.getAttribute("aChecker")||e&&1===this.node.nodeType&&n.ARIAMapper.getAriaOwnedBy(this.node));return!0},e}();t.ARIAWalker=o},6858(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.AncestorUtil=void 0;var i=function(){function e(){}return e.isPresentationFrame=function(e){if(e&&e.dom)for(var t=e.dom.length-2;t>=0;--t){var i=e.dom[t].node;if(1===i.nodeType&&"iframe"===i.nodeName.toLowerCase()&&("presentation"===i.getAttribute("role")||"true"===i.getAttribute("aria-hidden")))return!0}return!1},e.isFrame=function(e){if(e&&e.dom)for(var t=e.dom.length-2;t>=0;--t){var i=e.dom[t].node;if(1===i.nodeType&&"iframe"===i.nodeName.toLowerCase())return!0}return!1},e}();t.AncestorUtil=i},5279(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.FragmentUtil=void 0;var i=function(){function e(){}return e.getOwnerFragment=function(e){for(var t=e;t.parentNode&&(t=t.parentNode);)if(11===t.nodeType)return t;return e.ownerDocument},e.getById=function(e,t){return this.getOwnerFragment(e).getElementById(t)},e.getAncestor=function(e,t){var i=e.dom.filter(function(e){return e.role===t});return i.length>0&&i[0].node||null},e.getAncestorWithRole=function(e,t){var i=e.aria.filter(function(e){return e.role===t});return i.length>0&&i[0].node||null},e}();t.FragmentUtil=i},1043(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.LangUtil=void 0;var i=[["aa","ab","ae","af","ak","am","an","ar","as","av","ay","az","aaa","aab","aac","aad","aae","aaf","aag","aah","aai","aak","aal","aam","aan","aao","aap","aaq","aas","aat","aau","aav","aaw","aax","aaz","aba","abb","abc","abd","abe","abf","abg","abh","abi","abj","abl","abm","abn","abo","abp","abq","abr","abs","abt","abu","abv","abw","abx","aby","abz","aca","acb","acd","ace","acf","ach","aci","ack","acl","acm","acn","acp","acq","acr","acs","act","acu","acv","acw","acx","acy","acz","ada","adb","add","ade","adf","adg","adh","adi","adj","adl","adn","ado","adp","adq","adr","ads","adt","adu","adw","adx","ady","adz","aea","aeb","aec","aed","aee","aek","ael","aem","aen","aeq","aer","aes","aeu","aew","aey","aez","afa","afb","afd","afe","afg","afh","afi","afk","afn","afo","afp","afs","aft","afu","afz","aga","agb","agc","agd","age","agf","agg","agh","agi","agj","agk","agl","agm","agn","ago","agp","agq","agr","ags","agt","agu","agv","agw","agx","agy","agz","aha","ahb","ahg","ahh","ahi","ahk","ahl","ahm","ahn","aho","ahp","ahr","ahs","aht","aia","aib","aic","aid","aie","aif","aig","aih","aii","aij","aik","ail","aim","ain","aio","aip","aiq","air","ais","ait","aiw","aix","aiy","aja","ajg","aji","ajn","ajp","ajt","aju","ajw","ajz","akb","akc","akd","ake","akf","akg","akh","aki","akj","akk","akl","akm","ako","akp","akq","akr","aks","akt","aku","akv","akw","akx","aky","akz","ala","alc","ald","ale","alf","alg","alh","ali","alj","alk","all","alm","aln","alo","alp","alq","alr","als","alt","alu","alv","alw","alx","aly","alz","ama","amb","amc","ame","amf","amg","ami","amj","amk","aml","amm","amn","amo","amp","amq","amr","ams","amt","amu","amv","amw","amx","amy","amz","ana","anb","anc","and","ane","anf","ang","anh","ani","anj","ank","anl","anm","ann","ano","anp","anq","anr","ans","ant","anu","anv","anw","anx","any","anz","aoa","aob","aoc","aod","aoe","aof","aog","aoh","aoi","aoj","aok","aol","aom","aon","aor","aos","aot","aou","aox","aoz","apa","apb","apc","apd","ape","apf","apg","aph","api","apj","apk","apl","apm","apn","apo","app","apq","apr","aps","apt","apu","apv","apw","apx","apy","apz","aqa","aqc","aqd","aqg","aqk","aql","aqm","aqn","aqp","aqr","aqt","aqz","arb","arc","ard","are","arh","ari","arj","ark","arl","arn","aro","arp","arq","arr","ars","art","aru","arv","arw","arx","ary","arz","asa","asb","asc","asd","ase","asf","asg","ash","asi","asj","ask","asl","asn","aso","asp","asq","asr","ass","ast","asu","asv","asw","asx","asy","asz","ata","atb","atc","atd","ate","atg","ath","ati","atj","atk","atl","atm","atn","ato","atp","atq","atr","ats","att","atu","atv","atw","atx","aty","atz","aua","aub","auc","aud","aue","auf","aug","auh","aui","auj","auk","aul","aum","aun","auo","aup","auq","aur","aus","aut","auu","auw","aux","auy","auz","avb","avd","avi","avk","avl","avm","avn","avo","avs","avt","avu","avv","awa","awb","awc","awd","awe","awg","awh","awi","awk","awm","awn","awo","awr","aws","awt","awu","awv","aww","awx","awy","axb","axe","axg","axk","axl","axm","axx","aya","ayb","ayc","ayd","aye","ayg","ayh","ayi","ayk","ayl","ayn","ayo","ayp","ayq","ayr","ays","ayt","ayu","ayx","ayy","ayz","aza","azb","azc","azd","azg","azj","azm","azn","azo","azt","azz"],["ba","be","bg","bh","bi","bm","bn","bo","br","bs","baa","bab","bac","bad","bae","baf","bag","bah","bai","baj","bal","ban","bao","bap","bar","bas","bat","bau","bav","baw","bax","bay","baz","bba","bbb","bbc","bbd","bbe","bbf","bbg","bbh","bbi","bbj","bbk","bbl","bbm","bbn","bbo","bbp","bbq","bbr","bbs","bbt","bbu","bbv","bbw","bbx","bby","bbz","bca","bcb","bcc","bcd","bce","bcf","bcg","bch","bci","bcj","bck","bcl","bcm","bcn","bco","bcp","bcq","bcr","bcs","bct","bcu","bcv","bcw","bcy","bcz","bda","bdb","bdc","bdd","bde","bdf","bdg","bdh","bdi","bdj","bdk","bdl","bdm","bdn","bdo","bdp","bdq","bdr","bds","bdt","bdu","bdv","bdw","bdx","bdy","bdz","bea","beb","bec","bed","bee","bef","beg","beh","bei","bej","bek","bem","beo","bep","beq","ber","bes","bet","beu","bev","bew","bex","bey","bez","bfa","bfb","bfc","bfd","bfe","bff","bfg","bfh","bfi","bfj","bfk","bfl","bfm","bfn","bfo","bfp","bfq","bfr","bfs","bft","bfu","bfw","bfx","bfy","bfz","bga","bgb","bgc","bgd","bge","bgf","bgg","bgi","bgj","bgk","bgl","bgm","bgn","bgo","bgp","bgq","bgr","bgs","bgt","bgu","bgv","bgw","bgx","bgy","bgz","bha","bhb","bhc","bhd","bhe","bhf","bhg","bhh","bhi","bhj","bhk","bhl","bhm","bhn","bho","bhp","bhq","bhr","bhs","bht","bhu","bhv","bhw","bhx","bhy","bhz","bia","bib","bic","bid","bie","bif","big","bij","bik","bil","bim","bin","bio","bip","biq","bir","bit","biu","biv","biw","bix","biy","biz","bja","bjb","bjc","bjd","bje","bjf","bjg","bjh","bji","bjj","bjk","bjl","bjm","bjn","bjo","bjp","bjq","bjr","bjs","bjt","bju","bjv","bjw","bjx","bjy","bjz","bka","bkb","bkc","bkd","bkf","bkg","bkh","bki","bkj","bkk","bkl","bkm","bkn","bko","bkp","bkq","bkr","bks","bkt","bku","bkv","bkw","bkx","bky","bkz","bla","blb","blc","bld","ble","blf","blg","blh","bli","blj","blk","bll","blm","bln","blo","blp","blq","blr","bls","blt","blv","blw","blx","bly","blz","bma","bmb","bmc","bmd","bme","bmf","bmg","bmh","bmi","bmj","bmk","bml","bmm","bmn","bmo","bmp","bmq","bmr","bms","bmt","bmu","bmv","bmw","bmx","bmy","bmz","bna","bnb","bnc","bnd","bne","bnf","bng","bni","bnj","bnk","bnl","bnm","bnn","bno","bnp","bnq","bnr","bns","bnt","bnu","bnv","bnw","bnx","bny","bnz","boa","bob","boe","bof","bog","boh","boi","boj","bok","bol","bom","bon","boo","bop","boq","bor","bot","bou","bov","bow","box","boy","boz","bpa","bpb","bpd","bpe","bpg","bph","bpi","bpj","bpk","bpl","bpm","bpn","bpo","bpp","bpq","bpr","bps","bpt","bpu","bpv","bpw","bpx","bpy","bpz","bqa","bqb","bqc","bqd","bqf","bqg","bqh","bqi","bqj","bqk","bql","bqm","bqn","bqo","bqp","bqq","bqr","bqs","bqt","bqu","bqv","bqw","bqx","bqy","bqz","bra","brb","brc","brd","brf","brg","brh","bri","brj","brk","brl","brm","brn","bro","brp","brq","brr","brs","brt","bru","brv","brw","brx","bry","brz","bsa","bsb","bsc","bse","bsf","bsg","bsh","bsi","bsj","bsk","bsl","bsm","bsn","bso","bsp","bsq","bsr","bss","bst","bsu","bsv","bsw","bsx","bsy","bta","btb","btc","btd","bte","btf","btg","bth","bti","btj","btk","btl","btm","btn","bto","btp","btq","btr","bts","btt","btu","btv","btw","btx","bty","btz","bua","bub","buc","bud","bue","buf","bug","buh","bui","buj","buk","bum","bun","buo","bup","buq","bus","but","buu","buv","buw","bux","buy","buz","bva","bvb","bvc","bvd","bve","bvf","bvg","bvh","bvi","bvj","bvk","bvl","bvm","bvn","bvo","bvp","bvq","bvr","bvt","bvu","bvv","bvw","bvx","bvy","bvz","bwa","bwb","bwc","bwd","bwe","bwf","bwg","bwh","bwi","bwj","bwk","bwl","bwm","bwn","bwo","bwp","bwq","bwr","bws","bwt","bwu","bww","bwx","bwy","bwz","bxa","bxb","bxc","bxd","bxe","bxf","bxg","bxh","bxi","bxj","bxk","bxl","bxm","bxn","bxo","bxp","bxq","bxr","bxs","bxu","bxv","bxw","bxx","bxz","bya","byb","byc","byd","bye","byf","byg","byh","byi","byj","byk","byl","bym","byn","byo","byp","byq","byr","bys","byt","byv","byw","byx","byy","byz","bza","bzb","bzc","bzd","bze","bzf","bzg","bzh","bzi","bzj","bzk","bzl","bzm","bzn","bzo","bzp","bzq","bzr","bzs","bzt","bzu","bzv","bzw","bzx","bzy","bzz"],["ca","ce","ch","co","cr","cs","cu","cv","cy","caa","cab","cac","cad","cae","caf","cag","cah","cai","caj","cak","cal","cam","can","cao","cap","caq","car","cas","cau","cav","caw","cax","cay","caz","cba","cbb","cbc","cbd","cbe","cbg","cbh","cbi","cbj","cbk","cbl","cbn","cbo","cbq","cbr","cbs","cbt","cbu","cbv","cbw","cby","cca","ccc","ccd","cce","ccg","cch","ccj","ccl","ccm","ccn","cco","ccp","ccq","ccr","ccs","cda","cdc","cdd","cde","cdf","cdg","cdh","cdi","cdj","cdm","cdn","cdo","cdr","cds","cdy","cdz","cea","ceb","ceg","cek","cel","cen","cet","cey","cfa","cfd","cfg","cfm","cga","cgc","cgg","cgk","chb","chc","chd","chf","chg","chh","chj","chk","chl","chm","chn","cho","chp","chq","chr","cht","chw","chx","chy","chz","cia","cib","cic","cid","cie","cih","cik","cim","cin","cip","cir","ciw","ciy","cja","cje","cjh","cji","cjk","cjm","cjn","cjo","cjp","cjr","cjs","cjv","cjy","cka","ckb","ckh","ckl","ckm","ckn","cko","ckq","ckr","cks","ckt","cku","ckv","ckx","cky","ckz","cla","clc","cld","cle","clh","cli","clj","clk","cll","clm","clo","clt","clu","clw","cly","cma","cmc","cme","cmg","cmi","cmk","cml","cmm","cmn","cmo","cmr","cms","cmt","cna","cnb","cnc","cng","cnh","cni","cnk","cnl","cno","cnp","cnr","cns","cnt","cnu","cnw","cnx","coa","cob","coc","cod","coe","cof","cog","coh","coj","cok","col","com","con","coo","cop","coq","cot","cou","cov","cow","cox","coy","coz","cpa","cpb","cpc","cpe","cpf","cpg","cpi","cpn","cpo","cpp","cps","cpu","cpx","cpy","cqd","cqu","cra","crb","crc","crd","crf","crg","crh","cri","crj","crk","crl","crm","crn","cro","crp","crq","crr","crs","crt","crv","crw","crx","cry","crz","csa","csb","csc","csd","cse","csf","csg","csh","csi","csj","csk","csl","csm","csn","cso","csp","csq","csr","css","cst","csu","csv","csw","csx","csy","csz","cta","ctc","ctd","cte","ctg","cth","ctl","ctm","ctn","cto","ctp","cts","ctt","ctu","cty","ctz","cua","cub","cuc","cug","cuh","cui","cuj","cuk","cul","cum","cuo","cup","cuq","cur","cus","cut","cuu","cuv","cuw","cux","cuy","cvg","cvn","cwa","cwb","cwd","cwe","cwg","cwt","cya","cyb","cyo","czh","czk","czn","czo","czt"],["da","de","dv","dz","daa","dac","dad","dae","daf","dag","dah","dai","daj","dak","dal","dam","dao","dap","daq","dar","das","dau","dav","daw","dax","day","daz","dba","dbb","dbd","dbe","dbf","dbg","dbi","dbj","dbl","dbm","dbn","dbo","dbp","dbq","dbr","dbt","dbu","dbv","dbw","dby","dcc","dcr","dda","ddd","dde","ddg","ddi","ddj","ddn","ddo","ddr","dds","ddw","dec","ded","dee","def","deg","deh","dei","dek","del","dem","den","dep","deq","der","des","dev","dez","dga","dgb","dgc","dgd","dge","dgg","dgh","dgi","dgk","dgl","dgn","dgo","dgr","dgs","dgt","dgu","dgw","dgx","dgz","dha","dhd","dhg","dhi","dhl","dhm","dhn","dho","dhr","dhs","dhu","dhv","dhw","dhx","dia","dib","dic","did","dif","dig","dih","dii","dij","dik","dil","dim","din","dio","dip","diq","dir","dis","dit","diu","diw","dix","diy","diz","dja","djb","djc","djd","dje","djf","dji","djj","djk","djl","djm","djn","djo","djr","dju","djw","dka","dkg","dkk","dkl","dkr","dks","dkx","dlg","dlk","dlm","dln","dma","dmb","dmc","dmd","dme","dmf","dmg","dmk","dml","dmm","dmn","dmo","dmr","dms","dmu","dmv","dmw","dmx","dmy","dna","dnd","dne","dng","dni","dnj","dnk","dnn","dno","dnr","dnt","dnu","dnv","dnw","dny","doa","dob","doc","doe","dof","doh","doi","dok","dol","don","doo","dop","doq","dor","dos","dot","dov","dow","dox","doy","doz","dpp","dra","drb","drc","drd","dre","drg","drh","dri","drl","drn","dro","drq","drr","drs","drt","dru","drw","dry","dsb","dse","dsh","dsi","dsl","dsn","dso","dsq","dta","dtb","dtd","dth","dti","dtk","dtm","dtn","dto","dtp","dtr","dts","dtt","dtu","dty","dua","dub","duc","dud","due","duf","dug","duh","dui","duj","duk","dul","dum","dun","duo","dup","duq","dur","dus","duu","duv","duw","dux","duy","duz","dva","dwa","dwk","dwl","dwr","dws","dwu","dww","dwy","dwz","dya","dyb","dyd","dyg","dyi","dym","dyn","dyo","dyu","dyy","dza","dzd","dze","dzg","dzl","dzn"],["ee","el","en","eo","es","et","eu","eaa","ebc","ebg","ebk","ebo","ebr","ebu","ecr","ecs","ecy","eee","efa","efe","efi","ega","egl","ego","egx","egy","ehs","ehu","eip","eit","eiv","eja","eka","ekc","eke","ekg","eki","ekk","ekl","ekm","eko","ekp","ekr","eky","ele","elh","eli","elk","elm","elo","elp","elu","elx","ema","emb","eme","emg","emi","emk","emm","emn","emo","emp","emq","ems","emu","emw","emx","emy","emz","ena","enb","enc","end","enf","enh","enl","enm","enn","eno","enq","enr","enu","env","enw","enx","eot","epi","era","erg","erh","eri","erk","ero","err","ers","ert","erw","ese","esg","esh","esi","esk","esl","esm","esn","eso","esq","ess","esu","esx","esy","etb","etc","eth","etn","eto","etr","ets","ett","etu","etx","etz","euq","eve","evh","evn","ewo","ext","eya","eyo","eza","eze"],["fa","ff","fi","fj","fo","fr","fy","faa","fab","fad","faf","fag","fah","fai","faj","fak","fal","fam","fan","fap","far","fat","fau","fax","fay","faz","fbl","fcs","fer","ffi","ffm","fgr","fia","fie","fif","fil","fip","fir","fit","fiu","fiw","fkk","fkv","fla","flh","fli","fll","fln","flr","fly","fmp","fmu","fnb","fng","fni","fod","foi","fom","fon","for","fos","fox","fpe","fqs","frc","frd","frk","frm","fro","frp","frq","frr","frs","frt","fse","fsl","fss","fub","fuc","fud","fue","fuf","fuh","fui","fuj","fum","fun","fuq","fur","fut","fuu","fuv","fuy","fvr","fwa","fwe"],["ga","gd","gl","gn","gu","gv","gaa","gab","gac","gad","gae","gaf","gag","gah","gai","gaj","gak","gal","gam","gan","gao","gap","gaq","gar","gas","gat","gau","gav","gaw","gax","gay","gaz","gba","gbb","gbc","gbd","gbe","gbf","gbg","gbh","gbi","gbj","gbk","gbl","gbm","gbn","gbo","gbp","gbq","gbr","gbs","gbu","gbv","gbw","gbx","gby","gbz","gcc","gcd","gce","gcf","gcl","gcn","gcr","gct","gda","gdb","gdc","gdd","gde","gdf","gdg","gdh","gdi","gdj","gdk","gdl","gdm","gdn","gdo","gdq","gdr","gds","gdt","gdu","gdx","gea","geb","gec","ged","gef","geg","geh","gei","gej","gek","gel","gem","geq","ges","gev","gew","gex","gey","gez","gfk","gft","gfx","gga","ggb","ggd","gge","ggg","ggk","ggl","ggn","ggo","ggr","ggt","ggu","ggw","gha","ghc","ghe","ghh","ghk","ghl","ghn","gho","ghr","ghs","ght","gia","gib","gic","gid","gie","gig","gih","gii","gil","gim","gin","gio","gip","giq","gir","gis","git","giu","giw","gix","giy","giz","gji","gjk","gjm","gjn","gjr","gju","gka","gkd","gke","gkn","gko","gkp","gku","glb","glc","gld","glh","gli","glj","glk","gll","glo","glr","glu","glw","gly","gma","gmb","gmd","gme","gmg","gmh","gml","gmm","gmn","gmq","gmr","gmu","gmv","gmw","gmx","gmy","gmz","gna","gnb","gnc","gnd","gne","gng","gnh","gni","gnj","gnk","gnl","gnm","gnn","gno","gnq","gnr","gnt","gnu","gnw","gnz","goa","gob","goc","god","goe","gof","gog","goh","goi","goj","gok","gol","gom","gon","goo","gop","goq","gor","gos","got","gou","gow","gox","goy","goz","gpa","gpe","gpn","gqa","gqi","gqn","gqr","gqu","gra","grb","grc","grd","grg","grh","gri","grj","grk","grm","gro","grq","grr","grs","grt","gru","grv","grw","grx","gry","grz","gse","gsg","gsl","gsm","gsn","gso","gsp","gss","gsw","gta","gti","gtu","gua","gub","guc","gud","gue","guf","gug","guh","gui","guk","gul","gum","gun","guo","gup","guq","gur","gus","gut","guu","guv","guw","gux","guz","gva","gvc","gve","gvf","gvj","gvl","gvm","gvn","gvo","gvp","gvr","gvs","gvy","gwa","gwb","gwc","gwd","gwe","gwf","gwg","gwi","gwj","gwm","gwn","gwr","gwt","gwu","gww","gwx","gxx","gya","gyb","gyd","gye","gyf","gyg","gyi","gyl","gym","gyn","gyo","gyr","gyy","gyz","gza","gzi","gzn"],["ha","he","hi","ho","hr","ht","hu","hy","hz","haa","hab","hac","had","hae","haf","hag","hah","hai","haj","hak","hal","ham","han","hao","hap","haq","har","has","hav","haw","hax","hay","haz","hba","hbb","hbn","hbo","hbu","hca","hch","hdn","hds","hdy","hea","hed","heg","heh","hei","hem","hgm","hgw","hhi","hhr","hhy","hia","hib","hid","hif","hig","hih","hii","hij","hik","hil","him","hio","hir","hit","hiw","hix","hji","hka","hke","hkh","hkk","hkn","hks","hla","hlb","hld","hle","hlt","hlu","hma","hmb","hmc","hmd","hme","hmf","hmg","hmh","hmi","hmj","hmk","hml","hmm","hmn","hmp","hmq","hmr","hms","hmt","hmu","hmv","hmw","hmx","hmy","hmz","hna","hnd","hne","hng","hnh","hni","hnj","hnn","hno","hns","hnu","hoa","hob","hoc","hod","hoe","hoh","hoi","hoj","hok","hol","hom","hoo","hop","hor","hos","hot","hov","how","hoy","hoz","hpo","hps","hra","hrc","hre","hrk","hrm","hro","hrp","hrr","hrt","hru","hrw","hrx","hrz","hsb","hsh","hsl","hsn","hss","hti","hto","hts","htu","htx","hub","huc","hud","hue","huf","hug","huh","hui","huj","huk","hul","hum","huo","hup","huq","hur","hus","hut","huu","huv","huw","hux","huy","huz","hvc","hve","hvk","hvn","hvv","hwa","hwc","hwo","hya","hyw","hyx"],["ia","id","ie","ig","ii","ik","in","io","is","it","iu","iw","iai","ian","iap","iar","iba","ibb","ibd","ibe","ibg","ibh","ibi","ibl","ibm","ibn","ibr","ibu","iby","ica","ich","icl","icr","ida","idb","idc","idd","ide","idi","idr","ids","idt","idu","ifa","ifb","ife","iff","ifk","ifm","ifu","ify","igb","ige","igg","igl","igm","ign","igo","igs","igw","ihb","ihi","ihp","ihw","iin","iir","ijc","ije","ijj","ijn","ijo","ijs","ike","iki","ikk","ikl","iko","ikp","ikr","iks","ikt","ikv","ikw","ikx","ikz","ila","ilb","ilg","ili","ilk","ill","ilm","ilo","ilp","ils","ilu","ilv","ilw","ima","ime","imi","iml","imn","imo","imr","ims","imy","inb","inc","ine","ing","inh","inj","inl","inm","inn","ino","inp","ins","int","inz","ior","iou","iow","ipi","ipo","iqu","iqw","ira","ire","irh","iri","irk","irn","iro","irr","iru","irx","iry","isa","isc","isd","ise","isg","ish","isi","isk","ism","isn","iso","isr","ist","isu","itb","itc","itd","ite","iti","itk","itl","itm","ito","itr","its","itt","itv","itw","itx","ity","itz","ium","ivb","ivv","iwk","iwm","iwo","iws","ixc","ixl","iya","iyo","iyx","izh","izi","izr","izz"],["ja","ji","jv","jw","jaa","jab","jac","jad","jae","jaf","jah","jaj","jak","jal","jam","jan","jao","jaq","jar","jas","jat","jau","jax","jay","jaz","jbe","jbi","jbj","jbk","jbm","jbn","jbo","jbr","jbt","jbu","jbw","jcs","jct","jda","jdg","jdt","jeb","jee","jeg","jeh","jei","jek","jel","jen","jer","jet","jeu","jgb","jge","jgk","jgo","jhi","jhs","jia","jib","jic","jid","jie","jig","jih","jii","jil","jim","jio","jiq","jit","jiu","jiv","jiy","jje","jjr","jka","jkm","jko","jkp","jkr","jks","jku","jle","jls","jma","jmb","jmc","jmd","jmi","jml","jmn","jmr","jms","jmw","jmx","jna","jnd","jng","jni","jnj","jnl","jns","job","jod","jog","jor","jos","jow","jpa","jpr","jpx","jqr","jra","jrb","jrr","jrt","jru","jsl","jua","jub","juc","jud","juh","jui","juk","jul","jum","jun","juo","jup","jur","jus","jut","juu","juw","juy","jvd","jvn","jwi","jya","jye","jyy"],["ka","kg","ki","kj","kk","kl","km","kn","ko","kr","ks","ku","kv","kw","ky","kaa","kab","kac","kad","kae","kaf","kag","kah","kai","kaj","kak","kam","kao","kap","kaq","kar","kav","kaw","kax","kay","kba","kbb","kbc","kbd","kbe","kbf","kbg","kbh","kbi","kbj","kbk","kbl","kbm","kbn","kbo","kbp","kbq","kbr","kbs","kbt","kbu","kbv","kbw","kbx","kby","kbz","kca","kcb","kcc","kcd","kce","kcf","kcg","kch","kci","kcj","kck","kcl","kcm","kcn","kco","kcp","kcq","kcr","kcs","kct","kcu","kcv","kcw","kcx","kcy","kcz","kda","kdc","kdd","kde","kdf","kdg","kdh","kdi","kdj","kdk","kdl","kdm","kdn","kdo","kdp","kdq","kdr","kdt","kdu","kdv","kdw","kdx","kdy","kdz","kea","keb","kec","ked","kee","kef","keg","keh","kei","kej","kek","kel","kem","ken","keo","kep","keq","ker","kes","ket","keu","kev","kew","kex","key","kez","kfa","kfb","kfc","kfd","kfe","kff","kfg","kfh","kfi","kfj","kfk","kfl","kfm","kfn","kfo","kfp","kfq","kfr","kfs","kft","kfu","kfv","kfw","kfx","kfy","kfz","kga","kgb","kgc","kgd","kge","kgf","kgg","kgh","kgi","kgj","kgk","kgl","kgm","kgn","kgo","kgp","kgq","kgr","kgs","kgt","kgu","kgv","kgw","kgx","kgy","kha","lyg","khb","khc","khd","khe","khf","khg","khh","khi","khj","khk","khl","khn","kho","khp","khq","khr","khs","kht","khu","khv","khw","khx","khy","khz","kia","kib","kic","kid","kie","kif","kig","kih","kii","kij","kil","kim","kio","kip","kiq","kis","kit","kiu","kiv","kiw","kix","kiy","kiz","kja","kjb","kjc","kjd","kje","kjf","kjg","kjh","kji","kjj","kjk","kjl","kjm","kjn","kjo","kjp","kjq","kjr","kjs","kjt","kju","kjv","kjx","kjy","kjz","kka","kkb","kkc","kkd","kke","kkf","kkg","kkh","kki","kkj","kkk","kkl","kkm","kkn","kko","kkp","kkq","kkr","kks","kkt","kku","kkv","kkw","kkx","kky","kkz","kla","klb","klc","kld","kle","klf","klg","klh","kli","klj","klk","kll","klm","kln","klo","klp","klq","klr","kls","klt","klu","klv","klw","klx","kly","klz","kma","kmb","kmc","kmd","kme","kmf","kmg","kmh","kmi","kmj","kmk","kml","kmm","kmn","kmo","kmp","kmq","kmr","kms","kmt","kmu","kmv","kmw","kmx","kmy","kmz","kna","knb","knc","knd","kne","knf","kng","kni","knj","knk","knl","knm","knn","kno","knp","knq","knr","kns","knt","knu","knv","knw","knx","kny","knz","koa","koc","kod","koe","kof","kog","koh","koi","koj","kok","kol","koo","kop","koq","kos","kot","kou","kov","kow","kox","koy","koz","kpa","kpb","kpc","kpd","kpe","kpf","kpg","kph","kpi","kpj","kpk","kpl","kpm","kpn","kpo","kpp","kpq","kpr","kps","kpt","kpu","kpv","kpw","kpx","kpy","kpz","kqa","kqb","kqc","kqd","kqe","kqf","kqg","kqh","kqi","kqj","kqk","kql","kqm","kqn","kqo","kqp","kqq","kqr","kqs","kqt","kqu","kqv","kqw","kqx","kqy","kqz","kra","krb","krc","krd","kre","krf","krh","kri","krj","krk","krl","krm","krn","kro","krp","krr","krs","krt","kru","krv","krw","krx","kry","krz","ksa","ksb","ksc","ksd","kse","ksf","ksg","ksh","ksi","ksj","ksk","ksl","ksm","ksn","kso","ksp","ksq","ksr","kss","kst","ksu","ksv","ksw","ksx","ksy","ksz","kta","ktb","ktc","ktd","kte","ktf","ktg","kth","kti","ktj","ktk","ktl","ktm","ktn","kto","ktp","ktq","ktr","kts","ktt","ktu","ktv","ktw","ktx","kty","ktz","kub","kuc","kud","kue","kuf","kug","kuh","kui","kuj","kuk","kul","kum","kun","kuo","kup","kuq","kus","kut","kuu","kuv","kuw","kux","kuy","kuz","kva","kvb","kvc","kvd","kve","kvf","kvg","kvh","kvi","kvj","kvk","kvl","kvm","kvn","kvo","kvp","kvq","kvr","kvs","kvt","kvu","kvv","kvw","kvx","kvy","kvz","kwa","kwb","kwc","kwd","kwe","kwf","kwg","kwh","kwi","kwj","kwk","kwl","kwm","kwn","kwo","kwp","kwq","kwr","kws","kwt","kwu","kwv","kww","kwx","kwy","kwz","kxa","kxb","kxc","kxd","kxe","kxf","kxh","kxi","kxj","kxk","kxl","kxm","kxn","kxo","kxp","kxq","kxr","kxs","kxt","kxu","kxv","kxw","kxx","kxy","kxz","kya","kyb","kyc","kyd","kye","kyf","kyg","kyh","kyi","kyj","kyk","kyl","kym","kyn","kyo","kyp","kyq","kyr","kys","kyt","kyu","kyv","kyw","kyx","kyy","kyz","kza","kzb","kzc","kzd","kze","kzf","kzg","kzh","kzi","kzj","kzk","kzl","kzm","kzn","kzo","kzp","kzq","kzr","kzs","kzt","kzu","kzv","kzw","kzx","kzy","kzz"],["la","lb","lg","li","ln","lo","lt","lu","lv","laa","lab","lac","lad","lae","laf","lag","lah","lai","laj","lak","lal","lam","lan","lap","laq","lar","las","lau","law","lax","lay","laz","lba","lbb","lbc","lbe","lbf","lbg","lbi","lbj","lbk","lbl","lbm","lbn","lbo","lbq","lbr","lbs","lbt","lbu","lbv","lbw","lbx","lby","lbz","lcc","lcd","lce","lcf","lch","lcl","lcm","lcp","lcq","lcs","lda","ldb","ldd","ldg","ldh","ldi","ldj","ldk","ldl","ldm","ldn","ldo","ldp","ldq","lea","leb","lec","led","lee","lef","leg","leh","lei","lej","lek","lel","lem","len","leo","lep","leq","ler","les","let","leu","lev","lew","lex","ley","lez","lfa","lfn","lga","lgb","lgg","lgh","lgi","lgk","lgl","lgm","lgn","lgq","lgr","lgt","lgu","lgz","lha","lhh","lhi","lhl","lhm","lhn","lhp","lhs","lht","lhu","lia","lib","lic","lid","lie","lif","lig","lih","lii","lij","lik","lil","lio","lip","liq","lir","lis","liu","liv","liw","lix","liy","liz","lja","lje","lji","ljl","ljp","ljw","ljx","lka","lkb","lkc","lkd","lke","lkh","lki","lkj","lkl","lkm","lkn","lko","lkr","lks","lkt","lku","lky","lla","llb","llc","lld","lle","llf","llg","llh","lli","llj","llk","lll","llm","lln","llo","llp","llq","lls","llu","llx","lma","lmb","lmc","lmd","lme","lmf","lmg","lmh","lmi","lmj","lmk","lml","lmm","lmn","lmo","lmp","lmq","lmr","lmu","lmv","lmw","lmx","lmy","lmz","lna","lnb","lnd","lng","lnh","lni","lnj","lnl","lnm","lnn","lno","lns","lnu","lnw","lnz","loa","lob","loc","loe","lof","log","loh","loi","loj","lok","lol","lom","lon","loo","lop","loq","lor","los","lot","lou","lov","low","lox","loy","loz","lpa","lpe","lpn","lpo","lpx","lra","lrc","lre","lrg","lri","lrk","lrl","lrm","lrn","lro","lrr","lrt","lrv","lrz","lsa","lsb","lsd","lse","lsg","lsh","lsi","lsl","lsm","lsn","lso","lsp","lsr","lss","lst","lsv","lsy","ltc","ltg","lth","lti","ltn","lto","lts","ltu","lua","luc","lud","lue","luf","lui","luj","luk","lul","lum","lun","luo","lup","luq","lur","lus","lut","luu","luv","luw","luy","luz","lva","lvi","lvk","lvs","lvu","lwa","lwe","lwg","lwh","lwl","lwm","lwo","lws","lwt","lwu","lww","lxm","lya","lyg","lyn","lzh","lzl","lzn","lzz"],["mg","mh","mi","mk","ml","mn","mo","mr","ms","mt","my","maa","mab","mad","mae","maf","mag","mai","maj","mak","mam","man","map","maq","mas","mat","mau","mav","maw","max","maz","mba","mbb","mbc","mbd","mbe","mbf","mbh","mbi","mbj","mbk","mbl","mbm","mbn","mbo","mbp","mbq","mbr","mbs","mbt","mbu","mbv","mbw","mbx","mby","mbz","mca","mcb","mcc","mcd","mce","mcf","mcg","mch","mci","mcj","mck","mcl","mcm","mcn","mco","mcp","mcq","mcr","mcs","mct","mcu","mcv","mcw","mcx","mcy","mcz","mda","mdb","mdc","mdd","mde","mdf","mdg","mdh","mdi","mdj","mdk","mdl","mdm","mdn","mdp","mdq","mdr","mds","mdt","mdu","mdv","mdw","mdx","mdy","mdz","mea","meb","mec","med","mee","mef","meg","meh","mei","mej","mek","mel","mem","men","meo","mep","meq","mer","mes","met","meu","mev","mew","mey","mez","mfa","mfb","mfc","mfd","mfe","mff","mfg","mfh","mfi","mfj","mfk","mfl","mfm","mfn","mfo","mfp","mfq","mfr","mfs","mft","mfu","mfv","mfw","mfx","mfy","mfz","mga","mgb","mgc","mgd","mge","mgf","mgg","mgh","mgi","mgj","mgk","mgl","mgm","mgn","mgo","mgp","mgq","mgr","mgs","mgt","mgu","mgv","mgw","mgx","mgy","mgz","mha","mhb","mhc","mhd","mhe","mhf","mhg","mhh","mhi","mhj","mhk","mhl","mhm","mhn","mho","mhp","mhq","mhr","mhs","mht","mhu","mhw","mhx","mhy","mhz","mia","mib","mic","mid","mie","mif","mig","mih","mii","mij","mik","mil","mim","min","mio","mip","miq","mir","mis","mit","miu","miw","mix","miy","miz","mja","mjb","mjc","mjd","mje","mjg","mjh","mji","mjj","mjk","mjl","mjm","mjn","mjo","mjp","mjq","mjr","mjs","mjt","mju","mjv","mjw","mjx","mjy","mjz","mka","mkb","mkc","mke","mkf","mkg","mkh","mki","mkj","mkk","mkl","mkm","mkn","mko","mkp","mkq","mkr","mks","mkt","mku","mkv","mkw","mkx","mky","mkz","mla","mlb","mlc","mld","mle","mlf","mlh","mli","mlj","mlk","mll","mlm","mln","mlo","mlp","mlq","mlr","mls","mlu","mlv","mlw","mlx","mlz","mma","mmb","mmc","mmd","mme","mmf","mmg","mmh","mmi","mmj","mmk","mml","mmm","mmn","mmo","mmp","mmq","mmr","mmt","mmu","mmv","mmw","mmx","mmy","mmz","mna","mnb","mnc","mnd","mne","mnf","mng","mnh","mni","mnj","mnk","mnl","mnm","mnn","mno","mnp","mnq","mnr","mns","mnt","mnu","mnv","mnw","mnx","mny","mnz","moa","moc","mod","moe","mof","mog","moh","moi","moj","mok","mom","moo","mop","moq","mor","mos","mot","mou","mov","mow","mox","moy","moz","mpa","mpb","mpc","mpd","mpe","mpg","mph","mpi","mpj","mpk","mpl","mpm","mpn","mpo","mpp","mpq","mpr","mps","mpt","mpu","mpv","mpw","mpx","mpy","mpz","mqa","mqb","mqc","mqe","mqf","mqg","mqh","mqi","mqj","mqk","mql","mqm","mqn","mqo","mqp","mqq","mqr","mqs","mqt","mqu","mqv","mqw","mqx","mqy","mqz","mra","mrb","mrc","mrd","mre","mrf","mrg","mrh","mrj","mrk","mrl","mrm","mrn","mro","mrp","mrq","mrr","mrs","mrt","mru","mrv","mrw","mrx","mry","mrz","msb","msc","msd","mse","msf","msg","msh","msi","msj","msk","msl","msm","msn","mso","msp","msq","msr","mss","mst","msu","msv","msw","msx","msy","msz","mta","mtb","mtc","mtd","mte","mtf","mtg","mth","mti","mtj","mtk","mtl","mtm","mtn","mto","mtp","mtq","mtr","mts","mtt","mtu","mtv","mtw","mtx","mty","mua","mub","muc","mud","mue","mug","muh","mui","muj","muk","mul","mum","mun","muo","mup","muq","mur","mus","mut","muu","muv","mux","muy","muz","mva","mvb","mvd","mve","mvf","mvg","mvh","mvi","mvk","mvl","mvm","mvn","mvo","mvp","mvq","mvr","mvs","mvt","mvu","mvv","mvw","mvx","mvy","mvz","mwa","mwb","mwc","mwd","mwe","mwf","mwg","mwh","mwi","mwj","mwk","mwl","mwm","mwn","mwo","mwp","mwq","mwr","mws","mwt","mwu","mwv","mww","mwx","mwy","mwz","mxa","mxb","mxc","mxd","mxe","mxf","mxg","mxh","mxi","mxj","mxk","mxl","mxm","mxn","mxo","mxp","mxq","mxr","mxs","mxt","mxu","mxv","mxw","mxx","mxy","mxz","myb","myc","myd","mye","myf","myg","myh","myi","myj","myk","myl","mym","myn","myo","myp","myq","myr","mys","myt","myu","myv","myw","myx","myy","myz","mza","mzb","mzc","mzd","mze","mzg","mzh","mzi","mzj","mzk","mzl","mzm","mzn","mzo","mzp","mzq","mzr","mzs","mzt","mzu","mzv","mzw","mzx","mzy","mzz"],["na","nb","nd","ne","ng","nl","nn","no","nr","nv","ny","naa","nab","nac","nad","nae","naf","nag","nah","nai","naj","nak","nal","nam","nan","nao","nap","naq","nar","nas","nat","naw","nax","nay","naz","nba","nbb","nbc","nbd","nbe","nbf","nbg","nbh","nbi","nbj","nbk","nbm","nbn","nbo","nbp","nbq","nbr","nbs","nbt","nbu","nbv","nbw","nbx","nby","nca","ncb","ncc","ncd","nce","ncf","ncg","nch","nci","ncj","nck","ncl","ncm","ncn","nco","ncp","ncq","ncr","ncs","nct","ncu","ncx","ncz","nda","ndb","ndc","ndd","ndf","ndg","ndh","ndi","ndj","ndk","ndl","ndm","ndn","ndp","ndq","ndr","nds","ndt","ndu","ndv","ndw","ndx","ndy","ndz","nea","neb","nec","ned","nee","nef","neg","neh","nei","nej","nek","nem","nen","neo","neq","ner","nes","net","neu","nev","new","nex","ney","nez","nfa","nfd","nfl","nfr","nfu","nga","ngb","ngc","ngd","nge","ngf","ngg","ngh","ngi","ngj","ngk","ngl","ngm","ngn","ngo","ngp","ngq","ngr","ngs","ngt","ngu","ngv","ngw","ngx","ngy","ngz","nha","nhb","nhc","nhd","nhe","nhf","nhg","nhh","nhi","nhk","nhm","nhn","nho","nhp","nhq","nhr","nht","nhu","nhv","nhw","nhx","nhy","nhz","nia","nib","nic","nid","nie","nif","nig","nih","nii","nij","nik","nil","nim","nin","nio","niq","nir","nis","nit","niu","niv","niw","nix","niy","niz","nja","njb","njd","njh","nji","njj","njl","njm","njn","njo","njr","njs","njt","nju","njx","njy","njz","nka","nkb","nkc","nkd","nke","nkf","nkg","nkh","nki","nkj","nkk","nkm","nkn","nko","nkp","nkq","nkr","nks","nkt","nku","nkv","nkw","nkx","nkz","nla","nlc","nle","nlg","nli","nlj","nlk","nll","nlm","nln","nlo","nlq","nlr","nlu","nlv","nlw","nlx","nly","nlz","nma","nmb","nmc","nmd","nme","nmf","nmg","nmh","nmi","nmj","nmk","nml","nmm","nmn","nmo","nmp","nmq","nmr","nms","nmt","nmu","nmv","nmw","nmx","nmy","nmz","nna","nnb","nnc","nnd","nne","nnf","nng","nnh","nni","nnj","nnk","nnl","nnm","nnn","nnp","nnq","nnr","nns","nnt","nnu","nnv","nnw","nnx","nny","nnz","noa","noc","nod","noe","nof","nog","noh","noi","noj","nok","nol","nom","non","noo","nop","noq","nos","not","nou","nov","now","noy","noz","npa","npb","npg","nph","npi","npl","npn","npo","nps","npu","npx","npy","nqg","nqk","nql","nqm","nqn","nqo","nqq","nqt","nqy","nra","nrb","nrc","nre","nrf","nrg","nri","nrk","nrl","nrm","nrn","nrp","nrr","nrt","nru","nrx","nrz","nsa","nsb","nsc","nsd","nse","nsf","nsg","nsh","nsi","nsk","nsl","nsm","nsn","nso","nsp","nsq","nsr","nss","nst","nsu","nsv","nsw","nsx","nsy","nsz","ntd","nte","ntg","nti","ntj","ntk","ntm","nto","ntp","ntr","nts","ntu","ntw","ntx","nty","ntz","nua","nub","nuc","nud","nue","nuf","nug","nuh","nui","nuj","nuk","nul","num","nun","nuo","nup","nuq","nur","nus","nut","nuu","nuv","nuw","nux","nuy","nuz","nvh","nvm","nvo","nwa","nwb","nwc","nwe","nwg","nwi","nwm","nwo","nwr","nwx","nwy","nxa","nxd","nxe","nxg","nxi","nxk","nxl","nxm","nxn","nxo","nxq","nxr","nxu","nxx","nyb","nyc","nyd","nye","nyf","nyg","nyh","nyi","nyj","nyk","nyl","nym","nyn","nyo","nyp","nyq","nyr","nys","nyt","nyu","nyv","nyw","nyx","nyy","nza","nzb","nzd","nzi","nzk","nzm","nzs","nzu","nzy","nzz"],["oc","oj","om","or","os","oaa","oac","oar","oav","obi","obk","obl","obm","obo","obr","obt","obu","oca","och","ocm","oco","ocu","oda","odk","odt","odu","ofo","ofs","ofu","ogb","ogc","oge","ogg","ogo","ogu","oht","ohu","oia","oin","ojb","ojc","ojg","ojp","ojs","ojv","ojw","oka","okb","okc","okd","oke","okg","okh","oki","okj","okk","okl","okm","okn","oko","okr","oks","oku","okv","okx","okz","ola","old","ole","olk","olm","olo","olr","olt","olu","oma","omb","omc","ome","omg","omi","omk","oml","omn","omo","omp","omq","omr","omt","omu","omv","omw","omx","omy","ona","onb","one","ong","oni","onj","onk","onn","ono","onp","onr","ons","ont","onu","onw","onx","ood","oog","oon","oor","oos","opa","opk","opm","opo","opt","opy","ora","orc","ore","org","orh","orn","oro","orr","ors","ort","oru","orv","orw","orx","ory","orz","osa","osc","osi","osn","oso","osp","ost","osu","osx","ota","otb","otd","ote","oti","otk","otl","otm","otn","oto","otq","otr","ots","ott","otu","otw","otx","oty","otz","oua","oub","oue","oui","oum","oun","ovd","owi","owl","oyb","oyd","oym","oyy","ozm"],["pa","pi","pl","ps","pt","paa","pab","pac","pad","pae","paf","pag","pah","pai","pak","pal","pam","pao","pap","paq","par","pas","pat","pau","pav","paw","pax","pay","paz","pbb","pbc","pbe","pbf","pbg","pbh","pbi","pbl","pbm","pbn","pbo","pbp","pbr","pbs","pbt","pbu","pbv","pby","pbz","pca","pcb","pcc","pcd","pce","pcf","pcg","pch","pci","pcj","pck","pcl","pcm","pcn","pcp","pcr","pcw","pda","pdc","pdi","pdn","pdo","pdt","pdu","pea","peb","ped","pee","pef","peg","peh","pei","pej","pek","pel","pem","peo","pep","peq","pes","pev","pex","pey","pez","pfa","pfe","pfl","pga","pgd","pgg","pgi","pgk","pgl","pgn","pgs","pgu","pgy","pgz","pha","phd","phg","phh","phi","phk","phl","phm","phn","pho","phq","phr","pht","phu","phv","phw","pia","pib","pic","pid","pie","pif","pig","pih","pii","pij","pil","pim","pin","pio","pip","pir","pis","pit","piu","piv","piw","pix","piy","piz","pjt","pka","pkb","pkc","pkg","pkh","pkn","pko","pkp","pkr","pks","pkt","pku","pla","plb","plc","pld","ple","plf","plg","plh","plj","plk","pll","pln","plo","plp","plq","plr","pls","plt","plu","plv","plw","ply","plz","pma","pmb","pmc","pmd","pme","pmf","pmh","pmi","pmj","pmk","pml","pmm","pmn","pmo","pmq","pmr","pms","pmt","pmu","pmw","pmx","pmy","pmz","pna","pnb","pnc","pnd","pne","png","pnh","pni","pnj","pnk","pnl","pnm","pnn","pno","pnp","pnq","pnr","pns","pnt","pnu","pnv","pnw","pnx","pny","pnz","poc","pod","poe","pof","pog","poh","poi","pok","pom","pon","poo","pop","poq","pos","pot","pov","pow","pox","poy","poz","ppa","ppe","ppi","ppk","ppl","ppm","ppn","ppo","ppp","ppq","ppr","pps","ppt","ppu","pqa","pqe","pqm","pqw","pra","prb","prc","prd","pre","prf","prg","prh","pri","prk","prl","prm","prn","pro","prp","prq","prr","prs","prt","pru","prw","prx","pry","prz","psa","psc","psd","pse","psg","psh","psi","psl","psm","psn","pso","psp","psq","psr","pss","pst","psu","psw","psy","pta","pth","pti","ptn","pto","ptp","ptq","ptr","ptt","ptu","ptv","ptw","pty","pua","pub","puc","pud","pue","puf","pug","pui","puj","puk","pum","puo","pup","puq","pur","put","puu","puw","pux","puy","puz","pwa","pwb","pwg","pwi","pwm","pwn","pwo","pwr","pww","pxm","pye","pym","pyn","pys","pyu","pyx","pyy","pzn"],["qu","qua","qub","quc","qud","quf","qug","quh","qui","quk","qul","qum","qun","qup","quq","qur","qus","quv","quw","qux","quy","quz","qva","qvc","qve","qvh","qvi","qvj","qvl","qvm","qvn","qvo","qvp","qvs","qvw","qvy","qvz","qwa","qwc","qwe","qwh","qwm","qws","qwt","qxa","qxc","qxh","qxl","qxn","qxo","qxp","qxq","qxr","qxs","qxt","qxu","qxw","qya","qyp"],["rm","rn","ro","ru","rw","raa","rab","rac","rad","raf","rag","rah","rai","raj","rak","ral","ram","ran","rao","rap","raq","rar","ras","rat","rau","rav","raw","rax","ray","raz","rbb","rbk","rbl","rbp","rcf","rdb","rea","reb","ree","reg","rei","rej","rel","rem","ren","rer","res","ret","rey","rga","rge","rgk","rgn","rgr","rgs","rgu","rhg","rhp","ria","rie","rif","ril","rim","rin","rir","rit","riu","rjg","rji","rjs","rka","rkb","rkh","rki","rkm","rkt","rkw","rma","rmb","rmc","rmd","rme","rmf","rmg","rmh","rmi","rmk","rml","rmm","rmn","rmo","rmp","rmq","rmr","rms","rmt","rmu","rmv","rmw","rmx","rmy","rmz","rna","rnd","rng","rnl","rnn","rnp","rnr","rnw","roa","rob","roc","rod","roe","rof","rog","rol","rom","roo","rop","ror","rou","row","rpn","rpt","rri","rro","rrt","rsb","rsi","rsl","rsm","rtc","rth","rtm","rts","rtw","rub","ruc","rue","ruf","rug","ruh","rui","ruk","ruo","rup","ruq","rut","ruu","ruy","ruz","rwa","rwk","rwl","rwm","rwo","rwr","rxd","rxw","ryn","rys","ryu","rzh"],["sa","sc","sd","se","sg","sh","si","sk","sl","sm","sn","so","sq","sr","ss","st","su","sv","sw","saa","sab","sac","sad","sae","saf","sah","sai","saj","sak","sal","sam","sao","sap","saq","sar","sas","sat","sau","sav","saw","sax","say","saz","sba","sbb","sbc","sbd","sbe","sbf","sbg","sbh","sbi","sbj","sbk","sbl","sbm","sbn","sbo","sbp","sbq","sbr","sbs","sbt","sbu","sbv","sbw","sbx","sby","sbz","sca","scb","sce","scf","scg","sch","sci","sck","scl","scn","sco","scp","scq","scs","sct","scu","scv","scw","scx","sda","sdb","sdc","sde","sdf","sdg","sdh","sdj","sdk","sdl","sdm","sdn","sdo","sdp","sdq","sdr","sds","sdt","sdu","sdv","sdx","sdz","sea","seb","sec","sed","see","sef","seg","seh","sei","sej","sek","sel","sem","sen","seo","sep","seq","ser","ses","set","seu","sev","sew","sey","sez","sfb","sfe","sfm","sfs","sfw","sga","sgb","sgc","sgd","sge","sgg","sgh","sgi","sgj","sgk","sgl","sgm","sgn","sgo","sgp","sgr","sgs","sgt","sgu","sgw","sgx","sgy","sgz","sha","shb","shc","shd","she","shg","shh","shi","shj","shk","shl","shm","shn","sho","shp","shq","shr","shs","sht","shu","shv","shw","shx","shy","shz","sia","sib","sid","sie","sif","sig","sih","sii","sij","sik","sil","sim","sio","sip","siq","sir","sis","sit","siu","siv","siw","six","siy","siz","sja","sjb","sjd","sje","sjg","sjk","sjl","sjm","sjn","sjo","sjp","sjr","sjs","sjt","sju","sjw","ska","skb","skc","skd","ske","skf","skg","skh","ski","skj","skk","skm","skn","sko","skp","skq","skr","sks","skt","sku","skv","skw","skx","sky","skz","sla","slc","sld","sle","slf","slg","slh","sli","slj","sll","slm","sln","slp","slq","slr","sls","slt","slu","slw","slx","sly","slz","sma","smb","smc","smd","smf","smg","smh","smi","smj","smk","sml","smm","smn","smp","smq","smr","sms","smt","smu","smv","smw","smx","smy","smz","snb","snc","sne","snf","sng","snh","sni","snj","snk","snl","snm","snn","sno","snp","snq","snr","sns","snu","snv","snw","snx","sny","snz","soa","sob","soc","sod","soe","sog","soh","soi","soj","sok","sol","son","soo","sop","soq","sor","sos","sou","sov","sow","sox","soy","soz","spb","spc","spd","spe","spg","spi","spk","spl","spm","spn","spo","spp","spq","spr","sps","spt","spu","spv","spx","spy","sqa","sqh","sqj","sqk","sqm","sqn","sqo","sqq","sqr","sqs","sqt","squ","sqx","sra","srb","src","sre","srf","srg","srh","sri","srk","srl","srm","srn","sro","srq","srr","srs","srt","sru","srv","srw","srx","sry","srz","ssa","ssb","ssc","ssd","sse","ssf","ssg","ssh","ssi","ssj","ssk","ssl","ssm","ssn","sso","ssp","ssq","ssr","sss","sst","ssu","ssv","ssx","ssy","ssz","sta","stb","std","ste","stf","stg","sth","sti","stj","stk","stl","stm","stn","sto","stp","stq","str","sts","stt","stu","stv","stw","sty","sua","sub","suc","sue","sug","sui","suj","suk","sul","sum","suo","suq","sur","sus","sut","suv","suw","sux","suy","suz","sva","svb","svc","sve","svk","svm","svr","svs","svx","swb","swc","swf","swg","swh","swi","swj","swk","swl","swm","swn","swo","swp","swq","swr","sws","swt","swu","swv","sww","swx","swy","sxb","sxc","sxe","sxg","sxk","sxl","sxm","sxn","sxo","sxr","sxs","sxu","sxw","sya","syb","syc","syd","syi","syk","syl","sym","syn","syo","syr","sys","syw","syx","syy","sza","szb","szc","szd","sze","szg","szl","szn","szp","szs","szv","szw","szy"],["ta","te","tg","th","ti","tk","tl","tn","to","tr","ts","tt","tw","ty","taa","tab","tac","tad","tae","taf","tag","tai","taj","tak","tal","tan","tao","tap","taq","tar","tas","tau","tav","taw","tax","tay","taz","tba","tbb","tbc","tbd","tbe","tbf","tbg","tbh","tbi","tbj","tbk","tbl","tbm","tbn","tbo","tbp","tbq","tbr","tbs","tbt","tbu","tbv","tbw","tbx","tby","tbz","tca","tcb","tcc","tcd","tce","tcf","tcg","tch","tci","tck","tcl","tcm","tcn","tco","tcp","tcq","tcs","tct","tcu","tcw","tcx","tcy","tcz","tda","tdb","tdc","tdd","tde","tdf","tdg","tdh","tdi","tdj","tdk","tdl","tdm","tdn","tdo","tdq","tdr","tds","tdt","tdu","tdv","tdx","tdy","tea","teb","tec","ted","tee","tef","teg","teh","tei","tek","tem","ten","teo","tep","teq","ter","tes","tet","teu","tev","tew","tex","tey","tez","tfi","tfn","tfo","tfr","tft","tga","tgb","tgc","tgd","tge","tgf","tgg","tgh","tgi","tgj","tgn","tgo","tgp","tgq","tgr","tgs","tgt","tgu","tgv","tgw","tgx","tgy","tgz","thc","thd","the","thf","thh","thi","thk","thl","thm","thn","thp","thq","thr","ths","tht","thu","thv","thw","thx","thy","thz","tia","tic","tid","tie","tif","tig","tih","tii","tij","tik","til","tim","tin","tio","tip","tiq","tis","tit","tiu","tiv","tiw","tix","tiy","tiz","tja","tjg","tji","tjj","tjl","tjm","tjn","tjo","tjp","tjs","tju","tjw","tka","tkb","tkd","tke","tkf","tkg","tkk","tkl","tkm","tkn","tkp","tkq","tkr","tks","tkt","tku","tkv","tkw","tkx","tkz","tla","tlb","tlc","tld","tlf","tlg","tlh","tli","tlj","tlk","tll","tlm","tln","tlo","tlp","tlq","tlr","tls","tlt","tlu","tlv","tlw","tlx","tly","tma","tmb","tmc","tmd","tme","tmf","tmg","tmh","tmi","tmj","tmk","tml","tmm","tmn","tmo","tmp","tmq","tmr","tms","tmt","tmu","tmv","tmw","tmy","tmz","tna","tnb","tnc","tnd","tne","tnf","tng","tnh","tni","tnk","tnl","tnm","tnn","tno","tnp","tnq","tnr","tns","tnt","tnu","tnv","tnw","tnx","tny","tnz","tob","toc","tod","toe","tof","tog","toh","toi","toj","tol","tom","too","top","toq","tor","tos","tou","tov","tow","tox","toy","toz","tpa","tpc","tpe","tpf","tpg","tpi","tpj","tpk","tpl","tpm","tpn","tpo","tpp","tpq","tpr","tpt","tpu","tpv","tpw","tpx","tpy","tpz","tqb","tql","tqm","tqn","tqo","tqp","tqq","tqr","tqt","tqu","tqw","tra","trb","trc","trd","tre","trf","trg","trh","tri","trj","trk","trl","trm","trn","tro","trp","trq","trr","trs","trt","tru","trv","trw","trx","try","trz","tsa","tsb","tsc","tsd","tse","tsf","tsg","tsh","tsi","tsj","tsk","tsl","tsm","tsp","tsq","tsr","tss","tst","tsu","tsv","tsw","tsx","tsy","tsz","tta","ttb","ttc","ttd","tte","ttf","ttg","tth","tti","ttj","ttk","ttl","ttm","ttn","tto","ttp","ttq","ttr","tts","ttt","ttu","ttv","ttw","tty","ttz","tua","tub","tuc","tud","tue","tuf","tug","tuh","tui","tuj","tul","tum","tun","tuo","tup","tuq","tus","tut","tuu","tuv","tuw","tux","tuy","tuz","tva","tvd","tve","tvk","tvl","tvm","tvn","tvo","tvs","tvt","tvu","tvw","tvx","tvy","twa","twb","twc","twd","twe","twf","twg","twh","twl","twm","twn","two","twp","twq","twr","twt","twu","tww","twx","twy","txa","txb","txc","txe","txg","txh","txi","txj","txm","txn","txo","txq","txr","txs","txt","txu","txx","txy","tya","tye","tyh","tyi","tyj","tyl","tyn","typ","tyr","tys","tyt","tyu","tyv","tyx","tyy","tyz","tza","tzh","tzj","tzl","tzm","tzn","tzo","tzx"],["ug","uk","ur","uz","uam","uan","uar","uba","ubi","ubl","ubr","ubu","uby","uda","ude","udg","udi","udj","udl","udm","udu","ues","ufi","uga","ugb","uge","ugn","ugo","ugy","uha","uhn","uis","uiv","uji","uka","ukg","ukh","uki","ukk","ukl","ukp","ukq","uks","uku","ukv","ukw","uky","ula","ulb","ulc","ule","ulf","uli","ulk","ull","ulm","uln","ulu","ulw","uma","umb","umc","umd","umg","umi","umm","umn","umo","ump","umr","ums","umu","una","und","une","ung","uni","unk","unm","unn","unp","unr","unu","unx","unz","uok","upi","upv","ura","urb","urc","ure","urf","urg","urh","uri","urj","urk","url","urm","urn","uro","urp","urr","urt","uru","urv","urw","urx","ury","urz","usa","ush","usi","usk","usp","uss","usu","uta","ute","uth","utp","utr","utu","uum","uun","uur","uuu","uve","uvh","uvl","uwa","uya","uzn","uzs"],["ve","vi","vo","vaa","vae","vaf","vag","vah","vai","vaj","val","vam","van","vao","vap","var","vas","vau","vav","vay","vbb","vbk","vec","ved","vel","vem","veo","vep","ver","vgr","vgt","vic","vid","vif","vig","vil","vin","vis","vit","viv","vka","vki","vkj","vkk","vkl","vkm","vkn","vko","vkp","vkt","vku","vkz","vlp","vls","vma","vmb","vmc","vmd","vme","vmf","vmg","vmh","vmi","vmj","vmk","vml","vmm","vmp","vmq","vmr","vms","vmu","vmv","vmw","vmx","vmy","vmz","vnk","vnm","vnp","vor","vot","vra","vro","vrs","vrt","vsi","vsl","vsv","vto","vum","vun","vut","vwa"],["wa","wo","waa","wab","wac","wad","wae","waf","wag","wah","wai","waj","wak","wal","wam","wan","wao","wap","waq","war","was","wat","wau","wav","waw","wax","way","waz","wba","wbb","wbe","wbf","wbh","wbi","wbj","wbk","wbl","wbm","wbp","wbq","wbr","wbs","wbt","wbv","wbw","wca","wci","wdd","wdg","wdj","wdk","wdu","wdy","wea","wec","wed","weg","weh","wei","wem","wen","weo","wep","wer","wes","wet","weu","wew","wfg","wga","wgb","wgg","wgi","wgo","wgu","wgw","wgy","wha","whg","whk","whu","wib","wic","wie","wif","wig","wih","wii","wij","wik","wil","wim","win","wir","wit","wiu","wiv","wiw","wiy","wja","wji","wka","wkb","wkd","wkl","wkr","wku","wkw","wky","wla","wlc","wle","wlg","wlh","wli","wlk","wll","wlm","wlo","wlr","wls","wlu","wlv","wlw","wlx","wly","wma","wmb","wmc","wmd","wme","wmg","wmh","wmi","wmm","wmn","wmo","wms","wmt","wmw","wmx","wnb","wnc","wnd","wne","wng","wni","wnk","wnm","wnn","wno","wnp","wnu","wnw","wny","woa","wob","woc","wod","woe","wof","wog","woi","wok","wom","won","woo","wor","wos","wow","woy","wpc","wra","wrb","wrd","wrg","wrh","wri","wrk","wrl","wrm","wrn","wro","wrp","wrr","wrs","wru","wrv","wrw","wrx","wry","wrz","wsa","wsg","wsi","wsk","wsr","wss","wsu","wsv","wtf","wth","wti","wtk","wtm","wtw","wua","wub","wud","wuh","wul","wum","wun","wur","wut","wuu","wuv","wux","wuy","wwa","wwb","wwo","wwr","www","wxa","wxw","wya","wyb","wyi","wym","wyr","wyy"],["xh","xaa","xab","xac","xad","xae","xag","xai","xaj","xak","xal","xam","xan","xao","xap","xaq","xar","xas","xat","xau","xav","xaw","xay","xba","xbb","xbc","xbd","xbe","xbg","xbi","xbj","xbm","xbn","xbo","xbp","xbr","xbw","xbx","xby","xcb","xcc","xce","xcg","xch","xcl","xcm","xcn","xco","xcr","xct","xcu","xcv","xcw","xcy","xda","xdc","xdk","xdm","xdo","xdy","xeb","xed","xeg","xel","xem","xep","xer","xes","xet","xeu","xfa","xga","xgb","xgd","xgf","xgg","xgi","xgl","xgm","xgn","xgr","xgu","xgw","xha","xhc","xhd","xhe","xhr","xht","xhu","xhv","xia","xib","xii","xil","xin","xip","xir","xis","xiv","xiy","xjb","xjt","xka","xkb","xkc","xkd","xke","xkf","xkg","xkh","xki","xkj","xkk","xkl","xkn","xko","xkp","xkq","xkr","xks","xkt","xku","xkv","xkw","xkx","xky","xkz","xla","xlb","xlc","xld","xle","xlg","xli","xln","xlo","xlp","xls","xlu","xly","xma","xmb","xmc","xmd","xme","xmf","xmg","xmh","xmj","xmk","xml","xmm","xmn","xmo","xmp","xmq","xmr","xms","xmt","xmu","xmv","xmw","xmx","xmy","xmz","xna","xnb","xnd","xng","xnh","xni","xnj","xnk","xnm","xnn","xno","xnq","xnr","xns","xnt","xnu","xny","xnz","xoc","xod","xog","xoi","xok","xom","xon","xoo","xop","xor","xow","xpa","xpb","xpc","xpd","xpe","xpf","xpg","xph","xpi","xpj","xpk","xpl","xpm","xpn","xpo","xpp","xpq","xpr","xps","xpt","xpu","xpv","xpw","xpx","xpy","xpz","xqa","xqt","xra","xrb","xrd","xre","xrg","xri","xrm","xrn","xrq","xrr","xrt","xru","xrw","xsa","xsb","xsc","xsd","xse","xsh","xsi","xsj","xsl","xsm","xsn","xso","xsp","xsq","xsr","xss","xsu","xsv","xsy","xta","xtb","xtc","xtd","xte","xtg","xth","xti","xtj","xtl","xtm","xtn","xto","xtp","xtq","xtr","xts","xtt","xtu","xtv","xtw","xty","xtz","xua","xub","xud","xug","xuj","xul","xum","xun","xuo","xup","xur","xut","xuu","xve","xvi","xvn","xvo","xvs","xwa","xwc","xwd","xwe","xwg","xwj","xwk","xwl","xwo","xwr","xwt","xww","xxb","xxk","xxm","xxr","xxt","xya","xyb","xyj","xyk","xyl","xyt","xyy","xzh","xzm","xzp"],["yi","yo","yaa","yab","yac","yad","yae","yaf","yag","yah","yai","yaj","yak","yal","yam","yan","yao","yap","yaq","yar","yas","yat","yau","yav","yaw","yax","yay","yaz","yba","ybb","ybd","ybe","ybh","ybi","ybj","ybk","ybl","ybm","ybn","ybo","ybx","yby","ych","ycl","ycn","ycp","yda","ydd","yde","ydg","ydk","yds","yea","yec","yee","yei","yej","yel","yen","yer","yes","yet","yeu","yev","yey","yga","ygi","ygl","ygm","ygp","ygr","ygs","ygu","ygw","yha","yhd","yhl","yhs","yia","yif","yig","yih","yii","yij","yik","yil","yim","yin","yip","yiq","yir","yis","yit","yiu","yiv","yix","yiy","yiz","yka","ykg","yki","ykk","ykl","ykm","ykn","yko","ykr","ykt","yku","yky","yla","ylb","yle","ylg","yli","yll","ylm","yln","ylo","ylr","ylu","yly","yma","ymb","ymc","ymd","yme","ymg","ymh","ymi","ymk","yml","ymm","ymn","ymo","ymp","ymq","ymr","yms","ymt","ymx","ymz","yna","ynd","yne","yng","ynh","ynk","ynl","ynn","yno","ynq","yns","ynu","yob","yog","yoi","yok","yol","yom","yon","yos","yot","yox","yoy","ypa","ypb","ypg","yph","ypk","ypm","ypn","ypo","ypp","ypz","yra","yrb","yre","yri","yrk","yrl","yrm","yrn","yro","yrs","yrw","yry","ysc","ysd","ysg","ysl","ysm","ysn","yso","ysp","ysr","yss","ysy","yta","ytl","ytp","ytw","yty","yua","yub","yuc","yud","yue","yuf","yug","yui","yuj","yuk","yul","yum","yun","yup","yuq","yur","yut","yuu","yuw","yux","yuy","yuz","yva","yvt","ywa","ywg","ywl","ywn","ywq","ywr","ywt","ywu","yww","yxa","yxg","yxl","yxm","yxu","yxy","yyr","yyu","yyz","yzg","yzk"],["za","zh","zu","zaa","zab","zac","zad","zae","zaf","zag","zah","zai","zaj","zak","zal","zam","zao","zap","zaq","zar","zas","zat","zau","zav","zaw","zax","zay","zaz","zba","zbc","zbe","zbl","zbt","zbu","zbw","zca","zch","zdj","zea","zeg","zeh","zen","zga","zgb","zgh","zgm","zgn","zgr","zhb","zhd","zhi","zhn","zhw","zhx","zia","zib","zik","zil","zim","zin","zir","ziw","ziz","zka","zkb","zkd","zkg","zkh","zkk","zkn","zko","zkp","zkr","zkt","zku","zkv","zkz","zla","zle","zlj","zlm","zln","zlq","zls","zlw","zma","zmb","zmc","zmd","zme","zmf","zmg","zmh","zmi","zmj","zmk","zml","zmm","zmn","zmo","zmp","zmq","zmr","zms","zmt","zmu","zmv","zmw","zmx","zmy","zmz","zna","znd","zne","zng","znk","zns","zoc","zoh","zom","zoo","zoq","zor","zos","zpa","zpb","zpc","zpd","zpe","zpf","zpg","zph","zpi","zpj","zpk","zpl","zpm","zpn","zpo","zpp","zpq","zpr","zps","zpt","zpu","zpv","zpw","zpx","zpy","zpz","zqe","zra","zrg","zrn","zro","zrp","zrs","zsa","zsk","zsl","zsm","zsr","zsu","zte","ztg","ztl","ztm","ztn","ztp","ztq","zts","ztt","ztu","ztx","zty","zua","zuh","zum","zun","zuy","zwa","zxx","zyb","zyg","zyj","zyn","zyp","zza","zzj"]],a=function(){function e(){}return e.isBcp47=function(e){return/^(([a-zA-Z]{2,3}(-[a-zA-Z](-[a-zA-Z]{3}){0,2})?|[a-zA-Z]{4}|[a-zA-Z]{5,8})(-[a-zA-Z]{4})?(-([a-zA-Z]{2}|[0-9]{3}))?(-([0-9a-zA-Z]{5,8}|[0-9][a-zA-Z]{3}))*(-[0-9a-wy-zA-WY-Z](-[a-zA-Z0-9]{2,8})+)*(-x(-[a-zA-Z0-9]{1,8})+)?|x(-[a-zA-Z0-9]{1,8})+|(en-GB-oed|i-ami|i-bnn|i-default|i-enochian|i-hak|i-klingon|i-lux|i-mingo|i-navajo|i-pwn|i-tao|i-tay|i-tsu|sgn-BE-FR|sgn-BE-NL|sgn-CH-DE|art-lojban|cel-gaulish|no-bok|no-nyn|zh-guoyu|zh-hakka|zh-min|zh-min-nan|zh-xiang))$/.test(e)},e.validPrimaryLang=function(e){var t=e.toLowerCase();return t.includes("-")&&(t=t.split("-")[0]),!!t.match(/[a-z]{2,3}/)&&(3===t.length&&"q"===t.charAt(0)&&t.charCodeAt(1)>=97&&t.charCodeAt(1)<=116&&t.charCodeAt(2)>=97&&t.charCodeAt(2),i[t.charCodeAt(0)-97].includes(t))},e.matchPrimaryLang=function(e,t){var i=e;i.includes("-")&&(i=i.split("-")[0]);var a=t;return a.includes("-")&&(a=a.split("-")[0]),i.toLowerCase()===a.toLowerCase()},e}();t.LangUtil=a},3103(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.CommonMapper=void 0;var a=i(3864),n=function(){function e(){this.hierarchyRole=null,this.hierarchyPath=null,this.hierarchyResults=null}return e.prototype.getBounds=function(e){return null},e.prototype.reset=function(e){this.hierarchyRole=[],this.hierarchyResults=[],this.hierarchyPath=[{rolePath:"",roleCount:{}}];for(var t=[],i=a.DOMWalker.parentNode(e);i&&9!=i.nodeType;)t.push(i),i=a.DOMWalker.parentNode(i);for(var n=0,l=t=t.reverse();n<l.length;n++){for(var r=l[n],o=[],s=r.previousSibling;s;)o.push(s),s=s.previousSibling;for(var u=0,d=o=o.reverse();u<d.length;u++){var c=d[u];this.pushHierarchy(c),this.popHierarchy()}this.pushHierarchy(r)}},e.prototype.pushHierarchy=function(e){var t=this.getRole(e)||null;if(this.hierarchyRole.push(t),null!==t){var i=this.hierarchyPath[this.hierarchyPath.length-1];i.roleCount[t]=(i.roleCount[t]||0)+1,this.hierarchyPath.push({rolePath:i.rolePath+"/"+t+"["+i.roleCount[t]+"]",roleCount:{}})}var a={};1===e.nodeType&&(a=this.getAttributes(e)),this.hierarchyResults.push({node:e,namespace:this.getNamespace(),role:t,attributes:a,rolePath:this.hierarchyPath[this.hierarchyPath.length-1].rolePath,bounds:this.getBounds(e)})},e.prototype.popHierarchy=function(){null!==this.hierarchyRole.pop()&&this.hierarchyPath.pop(),this.hierarchyResults.pop()},e.prototype.openScope=function(e){return null===this.hierarchyRole&&this.reset(e),this.pushHierarchy(e),this.hierarchyResults},e.prototype.closeScope=function(e){for(var t=[],i=0,a=this.hierarchyResults;i<a.length;i++){var n=a[i];t.push(n)}return t[t.length-1].role="/"+t[t.length-1].role,this.popHierarchy(),t},e}();t.CommonMapper=n},920(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.Context=t.PartInfo=t.AttrInfo=void 0;var i=function(){function e(e,t,i,a){if(this.inclusive=e,this.attr=t,this.eq=i,this.value=a,!e&&void 0!==i&&i.length>0)throw new Error("Cannot have !attr"+i+" context");if(e&&void 0!==i&&i.length>0&&(void 0===a||0===a.length))throw new Error("Cannot have equivalence check without a value")}return e.prototype.matches=function(e){var t=this,i=e.attributes;if(t.attr in i){if(t.inclusive){if(t.eq){var a=i[t.attr];if("="===t.eq)return t.value===a;if("!="===t.eq)return t.value!==a;if("~"===t.eq)return t.value===a;if("!~"===t.eq)return t.value!==a;throw new Error("Context equivalence operator not supported")}return!0}return!1}return!t.inclusive},e}();t.AttrInfo=i;var a=function(){function e(e,t,i,a,n){if(this.inclusive=e,this.namespace=t,this.role=i,this.attrs=a,this.connector=n,"*"===i&&!e)throw new Error("!* context not supported")}return e.prototype.matches=function(e,t){var i=this,a=i.namespace in e&&e[i.namespace][t]&&(e[i.namespace][t].role===i.role||"none"!==e[i.namespace][t].role&&"*"===i.role);if(!a||"*"!==i.role||"dom"!==i.namespace||"#text"!==e[i.namespace][t].role&&"/#text"!==e[i.namespace][t].role||(a=!1),i.inclusive&&!a)return!1;if(!i.inclusive&&!a)return!0;for(var n=i.attrs,l=e[i.namespace][t],r=!0,o=0,s=n;o<s.length;o++){var u=s[o];r=r&&u.matches(l)}return i.inclusive||(r=!r),r},e}();t.PartInfo=a;var n=function(){function e(e){this.contextInfo=[];for(var t=[],n=0,l=e.match(/!?[/a-zA-Z:0-9*\-_]+(\[[^\]]+\])*[ >+~]?/g);n<l.length;n++){for(var r=l[n].match(/(!?)([/a-zA-Z:0-9*\-_]+)((\[[^\]]+\])*)([ >+~]?)/),o=[],s=0,u=r[3].match(/\[([^\]]+)\]/g)||[];s<u.length;s++){var d=u[s].match(/\[(!?)([a-z:A-Z*\-_]+)(!?[=~])?([^\]]+)?\]/);o.push(new i("!"!==d[1],d[2].toLowerCase(),d[3],d[4]))}r[2]=r[2].toLowerCase();var c=r[2].split(":"),m="!"!==r[1],p=c.shift(),h=c.join(":"),g=new a(m,p,h,o,r[r.length-1]);t.push(g)}this.contextInfo=t}return e.cleanContext=function(e){return(e=(e=(e=(e=(e=e.toLowerCase().trim()).replace(/ +!/g," !")).replace(/ +([>+~,])/g,"$1")).replace(/([>+~,]) +/g,"$1")).replace(/ +/g," ")).trim()},e.parse=function(t){for(var i=e.splitMultiple(e.cleanContext(t)),a=[],n=0;n<i.length;++n){var l=new e(i[n]);a.push(l)}return a},e.splitMultiple=function(e){var t=[];if(e)if(-1===e.indexOf(","))t.push(e);else for(var i=0,a=e.split(",");i<a.length;i++){var n=a[i];t.push(n)}return t},e}();t.Context=n},7301(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.Engine=void 0;var a=i(3864),n=i(920),l=i(4516),r=i(7507),o=i(1686),s=i(4566),u=i(461),d=i(3946),c=function(){function e(e,t){this.rule=e,this.parsedInfo=t,this.ns=this.parsedInfo.contextInfo[this.parsedInfo.contextInfo.length-1].namespace,l.Config.DEBUG&&console.log("Added Rule:",e.id,JSON.stringify(this.parsedInfo))}return e.convertNodeToSnippet=function(e){var t="";t+="<"+e.nodeName.toLowerCase();var i=e.attributes;if(null!=i)for(var a=i.length-1;a>=0;a--)"data-namewalk"!==i[a].name&&(t+=" "+i[a].name+'="'+i[a].value+'"');return t+">"},e.convertNodeToSource=function(e,t){if(void 0===t&&(t=!1),!t||!e)return null;var i="ibm-a11y-debug",n=function(e){return e&&"end"!==e.toLowerCase()?{found:!0,stop:!1,source:e}:{found:!0,stop:!0}},l=function(e){if(!e)return{found:!1};var t=null;if(e.nodeType===Node.COMMENT_NODE)t=e.nodeValue;else if(e.nodeType===Node.ELEMENT_NODE)for(var a=e.firstChild;a;){if(a.nodeType!==Node.TEXT_NODE){if(a.nodeType===Node.COMMENT_NODE){t=a.nodeValue;break}break}if(a.nodeValue&&a.nodeValue.trim().length>0)break;a=a.nextSibling}if(null!==t){var l=t.trim();if(l===i||l.startsWith(i+":")||l.startsWith(i+" ")||l.startsWith(i+"\t")){var r=l.substring(14).trimStart(),o=r.startsWith(":")?r.substring(1).trim():r.trim();return n(o)}}return{found:!1}},r=function(e){if(e.nodeType!==Node.ELEMENT_NODE)return{found:!1};var t=e.getAttribute(i);return null===t?{found:!1}:n(t.trim())},o=r(e);return o.found?o.stop?null:o.source:function(e){for(var t=e;t;){for(var i=a.DOMWalker.previousSiblingNotOwnedBySlot(t);i;){var n=l(i);if(n.found)return n.stop?null:n.source;i=a.DOMWalker.previousSiblingNotOwnedBySlot(i)}var o=a.DOMWalker.parentNode(t);if(!o||o.nodeType===Node.DOCUMENT_NODE)return null;var s=r(o);if(s.found)return s.stop?null:s.source;t=o}return null}(e)},e.prototype.run=function(t,i,a,n){var l,r=(new Date).getTime();try{l=this.rule.run(i,a,n)}catch(e){var o=e;throw console.error("RULE EXCEPTION:",this.rule.id,i.dom.rolePath,o.stack),e}var s=(new Date).getTime();l||(l=[]),l instanceof Array||(l=[l]);for(var u=[],d=0,c=l;d<c.length;d++){var m=c[d],p=t.getMessage(this.rule.id,m.reasonId,m.messageArgs),h={};for(var g in i)h[g]=i[g].rolePath;var b=this.rule.id.replace(/^(.*)\$\$\d+$/,"$1");u.push({ruleId:b,value:m.value,node:i.dom.node,path:h,ruleTime:s-r,reasonId:m.reasonId,message:p,messageArgs:m.messageArgs,apiArgs:m.apiArgs,bounds:i.dom.bounds,snippet:e.convertNodeToSnippet(i.dom.node),source:e.convertNodeToSource(i.dom.node,t.isSourceMapEnabled())})}return u},e}(),m=function(){function e(){this.mappers={},this.ruleMap={},this.wrappedRuleMap={},this.nlsMap={},this.helpMap={},this.sourceMapEnabled=!1,this.inclRules={},this.exclRules={},this.addMapper(new r.DOMMapper)}return e.getLanguages=function(){var e="undefined"!=typeof process&&void 0===process.nodeType&&process.env,t="en-US";return e&&(t=(t=e.LANG||e.LANGUAGE||e.LC_ALL||e.LC_MESSAGES)&&t.length>0?t.split(".")[0].replace(/_/g,"-"):"en-US"),"undefined"!=typeof navigator&&navigator.languages||[t]},e.prototype.run=function(e,t){if(null===e)return Promise.reject("null document");9===e.nodeType&&(e=e.documentElement),e.ownerDocument&&(e.ownerDocument.PT_CHECK_HIDDEN_CONTENT=!1);var i=s.CacheUtil.clearCaches(e),n=new a.DOMWalker(e,!1,e,!0),l={results:[],numExecuted:0,ruleTime:0,totalTime:0},r=(new Date).getTime();for(var c in this.mappers)this.mappers[c].reset(e);var m=0,p=-1;do{m++;var h=Math.floor(m/i*100);h>p&&(i>1e4&&console.log("Progress: ".concat(h,"% (").concat(m,"/").concat(i," nodes)")),p=h);var g={};for(var c in this.mappers)n.bEndTag?g[c]=this.mappers[c].closeScope(n.node):g[c]=this.mappers[c].openScope(n.node);if(11!==n.node.nodeType&&(d.VisUtil.isNodeVisible(n.node)||"meta"===n.node.nodeName.toLowerCase()||"style"===n.node.nodeName.toLowerCase()||"datalist"===n.node.nodeName.toLowerCase()||"param"===n.node.nodeName.toLowerCase()||!o.DOMUtil.getAncestor(n.node,["body"]))){var b={};for(var _ in g){var f=g[_],v=f[f.length-1];b[_]=v}for(var A={},w=0,y=this.getMatchingRules(g);w<y.length;w++){for(var C=y[w],k=!0,R=0,x=C.rule.dependencies||[];R<x.length;R++)A[x[R]]||(k=!1);if(k){var P=[];(new Date).getTime();try{P=C.run(this,b,t,g)}catch(e){}0===P.length&&(A[C.rule.id]=!0);for(var T=0,U=P;T<U.length;T++){var I=U[T];l.results.push(I),l.ruleTime+=I.ruleTime,l.numExecuted++,I.value[1]===u.eRuleConfidence.PASS&&(A[I.ruleId]=!0)}}}}}while(n.nextNode());return s.CacheUtil.clearCaches(e),l.totalTime=(new Date).getTime()-r,Promise.resolve(l)},e.prototype.enableRules=function(e){for(var t in this.ruleMap)this.ruleMap[t].enabled=!1;for(var i=0,a=e||[];i<a.length;i++)(t=a[i])in this.ruleMap?this.ruleMap[t].enabled=!0:console.warn("WARNING: Rule Id",t,"could not be enabled.")},e.prototype.getRule=function(e){return this.ruleMap[e]},e.prototype.getRulesIds=function(){var e=[];for(var t in this.ruleMap)e.push(t);return e},e.prototype.addRules=function(e){for(var t=0,i=e;t<i.length;t++){var a=i[t];this.addRule(a,!0)}this._sortRules()},e.prototype.addRule=function(e,t){var i=n.Context.parse(e.context),a=0,l=e.id;if(l in this.ruleMap)console.log("WARNING: Rule",l,"already added to engine. Ignoring...");else{this.ruleMap[l]=e;for(var r=0,o=i;r<o.length;r++){var s=o[r],u=l;a>=1&&(u=l+"$$"+a),++a;var d=new c(e,s);this.wrappedRuleMap[u]=d;var m=d.parsedInfo.contextInfo,p=m[m.length-1],h=p.namespace+":"+p.role;p.inclusive?(this.inclRules[h]=this.inclRules[h]||[],this.inclRules[h].push(d)):(this.exclRules[h]=this.exclRules[h]||[],this.exclRules[h].push(d))}t||this._sortRules()}},e.prototype.enableSourceMap=function(e){this.sourceMapEnabled=e},e.prototype.isSourceMapEnabled=function(){return this.sourceMapEnabled},e.prototype._sortRules=function(){for(var e in this.inclRules)this.inclRules[e].sort(function(e,t){var i=e.rule.dependencies&&e.rule.dependencies.length>0;return t.rule.dependencies&&t.rule.dependencies.length>0&&t.rule.dependencies.includes(e.rule.id)?-1:i&&e.rule.dependencies.includes(t.rule.id)?1:0});for(var e in this.exclRules)this.exclRules[e].sort(function(e,t){var i=e.rule.dependencies&&e.rule.dependencies.length>0;return t.rule.dependencies&&t.rule.dependencies.length>0&&t.rule.dependencies.includes(e.rule.id)?-1:i&&e.rule.dependencies.includes(t.rule.id)?1:0})},e.prototype.addNlsMap=function(e){for(var t in e)this.nlsMap[t]=e[t]},e.prototype.addHelpMap=function(e){for(var t in e)this.helpMap[t]=e[t]},e.prototype.getMessage=function(e,t,i){var a=e.indexOf("$$");if(a>=0&&(e=e.substring(0,a)),!(e in this.nlsMap))return e;var n=this.nlsMap[e][t||0];return n?n.replace(/\{(\d+)\}/g,function(e,t,a){return i[t]}):e+"_"+t},e.prototype.getHelp=function(e,t,i){return i||(i="latest"),"".concat(l.Config.helpRoot,"/").concat(i,"/doc").concat(this.getHelpRel(e,t))},e.prototype.getHelpRel=function(e,t){var i=e.indexOf("$$");return i>=0&&(e=e.substring(0,i)),e in this.helpMap?((t=t||0)in this.helpMap[e]?this.helpMap[e][t||0]:this.helpMap[e][0])||e+"_"+t:e},e.prototype.addMapper=function(e){this.mappers[e.getNamespace()]=e},e.match=function(e,t){var i=e.parsedInfo.contextInfo,a=i.length-1,n=i[a].namespace,l=t[n][t[n].length-1],r=l.node;if(!i[a].matches(t,t[n].length-1))return!1;if(1===i.length)return!0;if(l=t[n=i[0].namespace][t[n].length-1],--a,i.slice(0,i.length-1).some(function(e){return e.namespace!==n}))return console.error("[ERROR] Rule ".concat(e.rule.id," has inconsitent parent namespaces")),!1;for(var o=t[n].length-(l.node.isSameNode(r)?2:1);o>=0&&a>=0;){var s=i[a],u=i[a].matches(t,o);if(">"===s.connector){if(!u)return!1;--a,--o}else{if(" "!==s.connector)throw new Error("Context connector "+s.connector+" is not supported");if(s.inclusive)u&&--a,--o;else{if(!u)return!1;for(var d=!1,c=o-1;!d&&c>=0;--c)d=!i[a].matches(t,c);if(d)return!1;--a}}}return-1===a},e.prototype.getMatchingRules=function(t){var i=[];function a(a){for(var n=0,l=a;n<l.length;n++){var r=l[n];r.rule.enabled&&e.match(r,t)&&i.push(r)}}for(var n in t){var l=n+":"+(t[n].length>0?t[n][t[n].length-1].role:"none");for(var r in l in this.inclRules&&a(this.inclRules[l]),this.exclRules)r!==l&&a(this.exclRules[r]);l!==n+":none"&&(l.startsWith(n+":/")?n+":/*"in this.inclRules&&a(this.inclRules[n+":/*"]):n+":*"in this.inclRules&&a(this.inclRules[n+":*"]))}return this.sortDeps(i)},e.prototype.sortDeps=function(e){for(var t=[],i=0,a=e;i<a.length;i++){var n=a[i];t.push(n)}var l=[],r={},o=!1;do{o=!1;for(var s=0;s<t.length;++s){var u=t[s];if(!(u.rule.id in r)){var d=!0;if(u.rule.dependencies&&u.rule.dependencies.length>0)for(var c=0,m=u.rule.dependencies;c<m.length;c++)m[c]in r||(d=!1);d&&(o=!0,l.push(u),r[u.rule.id]=!0,t.splice(s--,1))}}}while(o);return l},e}();t.Engine=m},4516(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.Config=void 0;var i=function(){function e(){}return e.DEBUG=!1,e.helpRoot="https://able.ibm.com/rules/archives",e}();t.Config=i},7507(e,t,i){var a,n=this&&this.__extends||(a=function(e,t){return a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i])},a(e,t)},function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function i(){this.constructor=e}a(e,t),e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)});Object.defineProperty(t,"__esModule",{value:!0}),t.DOMMapper=void 0;var l=i(3103),r=i(4566),o=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.getRole=function(e){return e.nodeName.toLowerCase()},t.prototype.getNamespace=function(){return"dom"},t.prototype.getAttributes=function(e){var t={};if(1===e.nodeType)for(var i=e,a=0;a<i.attributes.length;++a){var n=i.attributes[a];t[n.name.toLowerCase()]=n.nodeValue}return t},t.prototype.getBounds=function(e){if(1!==e.nodeType)return null;var t=r.CacheUtil.getCache(e,"DOMMapper_Bounds",void 0);if(void 0!==t)return t;var i=1;e.ownerDocument&&e.ownerDocument.defaultView&&e.ownerDocument.defaultView.devicePixelRatio&&(i=e.ownerDocument.defaultView.devicePixelRatio);var a=e.getBoundingClientRect();if(a){var n=e&&e.ownerDocument&&e.ownerDocument.defaultView&&e.ownerDocument.defaultView.scrollX||0,l=e&&e.ownerDocument&&e.ownerDocument.defaultView&&e.ownerDocument.defaultView.scrollY||0,o={left:Math.ceil((a.left+n)*i),top:Math.ceil((a.top+l)*i),height:Math.ceil(a.height*i),width:Math.ceil(a.width*i)};return r.CacheUtil.setCache(e,"DOMMapper_Bounds",o),o}return null},t.prototype.getUnadjustedBounds=function(e){if(1!==e.nodeType)return null;var t=r.CacheUtil.getCache(e,"DOMMapper_UnadjustedBounds",void 0);if(void 0!==t)return t;var i=e.getBoundingClientRect();if(i){var a=e&&e.ownerDocument&&e.ownerDocument.defaultView&&e.ownerDocument.defaultView.scrollX||0,n=e&&e.ownerDocument&&e.ownerDocument.defaultView&&e.ownerDocument.defaultView.scrollY||0,l={left:Math.ceil(i.left+a),top:Math.ceil(i.top+n),height:Math.ceil(i.height),width:Math.ceil(i.width)};return r.CacheUtil.setCache(e,"DOMMapper_UnadjustedBounds",l),l}return null},t}(l.CommonMapper);t.DOMMapper=o},1686(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.DOMUtil=void 0;var a=i(3864),n=function(){function e(){}return e.hasParent=function(e,t){for(var i=a.DOMWalker.parentElement(e);i&&!t.includes(i.nodeName);)i=a.DOMWalker.parentElement(i);return!!i},e.getAncestor=function(e,t){for(var i=a.DOMWalker.parentElement(e);i&&!t.includes(i.nodeName.toLowerCase());)i=a.DOMWalker.parentElement(i);return i},e.sameNode=function(e,t){return e===t||(e.isSameNode?e.isSameNode(t):!e.compareDocumentPosition||0===e.compareDocumentPosition(t))},e.cleanWhitespace=function(e){return e.replace(/[ \t\r\n]/g," ").replace(/ +/g," ")},e.cleanSpace=function(e){return e.replace(/ +/g," ")},e.isInSameTable=function(t,i){if(t&&i){var a=["table"],n=e.getAncestor(t,a),l=e.getAncestor(i,a);if(null!==n&&null!=l&&e.sameNode(n,l))return!0}return!1},e.shadowRootNode=function(e){for(var t=e;null!=t&&11!==t.nodeType;)t=t.parentNode;return t},e.objectCopyWithNodeRefs=function(e){if(!e)return e;if("object"!=typeof e)return"function"==typeof e?e:JSON.parse(JSON.stringify(e));if(e instanceof Node||e.nodeType)return e;var t=void 0;if("Array"===e.constructor.name){t=[];for(var i=0,a=e;i<a.length;i++){var n=a[i];t.push(this.objectCopyWithNodeRefs(n))}}else for(var l in t={},e)t[l]=this.objectCopyWithNodeRefs(e[l]);return t},e.getAncestorWithAttribute=function(e,t,i){for(var n=a.DOMWalker.parentNode(e);null!==n;){if(1===n.nodeType&&n.getAttribute(t)===i)return n;n=a.DOMWalker.parentNode(n)}return null},e}();t.DOMUtil=n},3864(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.DOMWalker=void 0;var a=i(3946),n=function(){function e(e,t,i,a,n){this.DEBUGIDX=0,this.indent=0,this.DEBUG=!!n,this.root=i||(e&&e.ownerDocument?e.ownerDocument.documentElement:e),9===this.root.nodeType&&(this.root=this.root.documentElement),this.node=e,9===this.node.nodeType&&(this.node=this.node.documentElement),this.bEndTag=null!=t&&1==t,this.considerHidden=a||!1}return e.prototype.elem=function(){return 1===this.node.nodeType&&this.node||null},e.parentNode=function(e){if(null===e)return null;var t=e.parentNode;return e.slotOwner?t=e.slotOwner:e.ownerElement?t=e.ownerElement:t&&11===t.nodeType&&(t=t.host?t.host:null),t},e.parentElement=function(t){var i=t;do{i=e.parentNode(i)}while(i&&1!==i.nodeType);return i},e.assignSlots=function(e){for(var t=e.querySelectorAll("slot"),i=0;i<t.length;++i)for(var a=t[i],n=a.assignedNodes(),l=0;l<n.length;++l)n[l].slotOwner=a,n[l].slotIndex=l},e.firstChildNotOwnedBySlot=function(e){for(var t=e.firstChild;t&&t.slotOwner;)t=t.nextSibling;return t},e.lastChildNotOwnedBySlot=function(e){for(var t=e.lastChild;t&&t.slotOwner;)t=t.previousSibling;return t},e.nextSiblingNotOwnedBySlot=function(e){for(var t=e.nextSibling;t&&t.slotOwner;)t=t.nextSibling;return t},e.previousSiblingNotOwnedBySlot=function(e){for(var t=e.previousSibling;t&&t.slotOwner;)t=t.previousSibling;return t},e.prototype.atRoot=function(){return!this.node.ownerElement&&(this.root===this.node||(this.root.isSameNode?this.root.isSameNode(this.node):this.root.compareDocumentPosition?0===this.root.compareDocumentPosition(this.node):null===this.node.parentNode))},e.prototype.nextNode=function(){var t=this,i=function(){for(var e="",i=0;i<t.indent;++i)e+=" ";return e},n=this.node.nodeName;if(!this.node)return this.bEndTag=!1,!1;do{if(this.bEndTag){if(this.atRoot())return!1;if(this.node.slotOwner){var l=this.node.slotOwner,r=this.node.slotIndex+1;r<l.assignedNodes().length?(this.node=l.assignedNodes()[r],this.bEndTag=!1):(this.node=l,this.bEndTag=!0)}else if(this.node.ownerElement)this.node=this.node.ownerElement,this.bEndTag=!0;else if(e.nextSiblingNotOwnedBySlot(this.node))this.node=e.nextSiblingNotOwnedBySlot(this.node),this.bEndTag=!1;else{if(!this.node.parentNode)return!1;this.node=this.node.parentNode,this.bEndTag=!0}}else{var o=this.node,s=this.node,u=this.node;if(1===this.node.nodeType&&"IFRAME"===this.node.nodeName.toUpperCase()&&(!this.considerHidden||a.VisUtil.isNodeVisible(o))&&o.contentDocument&&o.contentDocument.documentElement){var d=this.node;this.node=o.contentDocument.documentElement,this.node.ownerElement=d}else 1===this.node.nodeType&&(!this.considerHidden||a.VisUtil.isNodeVisible(s))&&s.shadowRoot&&s.shadowRoot.firstChild?(d=this.node,this.node=s.shadowRoot,this.node.ownerElement=d,e.assignSlots(this.node)):1===this.node.nodeType&&"slot"===s.nodeName.toLowerCase()&&u.assignedNodes().length>0?this.node=u.assignedNodes()[0]:1!==this.node.nodeType&&11!==this.node.nodeType||!e.firstChildNotOwnedBySlot(this.node)?this.bEndTag=!0:this.node=e.firstChildNotOwnedBySlot(this.node)}}while(1!==this.node.nodeType&&11!==this.node.nodeType&&3!==this.node.nodeType||1===this.node.nodeType&&"ACE"===this.node.getAttribute("aChecker"));return this.bEndTag&&(this.indent-=2),this.DEBUG&&console.log(i()+"<".concat(this.bEndTag?"/":"").concat(this.node.nodeName,"> (from ").concat(n,") ").concat(this.DEBUGIDX++)),this.DEBUG&&this.node.slotOwner&&console.log(i()+"slotOwner: ".concat(this.node.slotOwner.nodeName)),this.DEBUG&&this.node.slotIndex&&console.log(i()+"slotIndex: ".concat(this.node.slotIndex)),this.DEBUG&&this.node.ownerElement&&console.log(i()+"ownerElement: ".concat(this.node.ownerElement.nodeName)),this.bEndTag||(this.indent+=2),!0},e.prototype.prevNode=function(){do{if(this.bEndTag){var t=this.node,i=this.node;if(1===this.node.nodeType&&"IFRAME"===this.node.nodeName.toUpperCase()&&(!this.considerHidden||a.VisUtil.isNodeVisible(t))&&t.contentDocument&&t.contentDocument.documentElement){var n=this.node;this.node=t.contentDocument.documentElement,this.node.ownerElement=n}else if(1===this.node.nodeType&&(!this.considerHidden||a.VisUtil.isNodeVisible(i))&&i.shadowRoot&&i.shadowRoot.lastChild)n=this.node,this.node=i.shadowRoot,this.node.ownerElement=n,e.assignSlots(this.node);else if(1===this.node.nodeType&&"slot"===i.nodeName.toLowerCase()&&i.assignedNodes().length>0){var l=i;this.node=l.assignedNodes()[l.assignedNodes().length-1]}else 1!==this.node.nodeType&&11!==this.node.nodeType||!e.lastChildNotOwnedBySlot(this.node)?this.bEndTag=!1:this.node=e.lastChildNotOwnedBySlot(this.node)}else{if(this.atRoot())return!1;if(this.node.slotOwner){var r=this.node.slotOwner,o=this.node.slotIndex-1;o>=0?(this.node=r.assignedNodes()[o],this.bEndTag=!0):(this.node=r,this.bEndTag=!1)}else if(e.previousSiblingNotOwnedBySlot(this.node))this.node=e.previousSiblingNotOwnedBySlot(this.node),this.bEndTag=!0;else if(this.node.ownerElement)this.node=this.node.ownerElement,this.bEndTag=!1;else{if(!this.node.parentNode)return!1;this.node=this.node.parentNode,this.bEndTag=!1}}}while(1!==this.node.nodeType&&11!==this.node.nodeType&&3!==this.node.nodeType||1===this.node.nodeType&&"ACE"===this.node.getAttribute("aChecker"));return!0},e}();t.DOMWalker=n},8601(e,t){var i,a,n;Object.defineProperty(t,"__esModule",{value:!0}),t.eGuidelineType=t.eGuidelineCategory=t.eToolkitLevel=void 0,(n=t.eToolkitLevel||(t.eToolkitLevel={})).LEVEL_ONE="1",n.LEVEL_TWO="2",n.LEVEL_THREE="3",n.LEVEL_FOUR="4",(a=t.eGuidelineCategory||(t.eGuidelineCategory={})).ACCESSIBILITY="Accessibility",a.DESIGN="Design",a.OTHER="Other",(i=t.eGuidelineType||(t.eGuidelineType={})).DEFAULT="default",i.EXTENSION="extension"},461(e,t,i){var a,n;Object.defineProperty(t,"__esModule",{value:!0}),t.eRulesetType=t.eRuleCategory=t.eToolkitLevel=t.RuleManual=t.RulePotential=t.RuleFail=t.RuleRender=t.RulePass=t.eRulePolicy=t.eRuleConfidence=void 0,function(e){e.PASS="PASS",e.FAIL="FAIL",e.POTENTIAL="POTENTIAL",e.MANUAL="MANUAL"}(a=t.eRuleConfidence||(t.eRuleConfidence={})),function(e){e.VIOLATION="VIOLATION",e.RECOMMENDATION="RECOMMENDATION",e.INFORMATION="INFORMATION"}(n=t.eRulePolicy||(t.eRulePolicy={})),t.RulePass=function(e,t,i){if(null==e)throw new Error("Reason ID must be defined");return{value:[n.INFORMATION,a.PASS],reasonId:e,messageArgs:t||[],apiArgs:i||[]}},t.RuleRender=function(e,t,i){if(null==e)throw new Error("Reason ID must be defined");return{value:[n.INFORMATION,a.PASS],reasonId:0,messageArgs:t||[],apiArgs:i||[]}},t.RuleFail=function(e,t,i){if(null==e)throw new Error("Reason ID must be defined");return{value:[n.INFORMATION,a.FAIL],reasonId:e,messageArgs:t||[],apiArgs:i||[]}},t.RulePotential=function(e,t,i){if(null==e)throw new Error("Reason ID must be defined");return{value:[n.INFORMATION,a.POTENTIAL],reasonId:e,messageArgs:t||[],apiArgs:i||[]}},t.RuleManual=function(e,t,i){if(null==e)throw new Error("Reason ID must be defined");return{value:[n.INFORMATION,a.MANUAL],reasonId:e,messageArgs:t||[],apiArgs:i||[]}};var l=i(8601);Object.defineProperty(t,"eToolkitLevel",{enumerable:!0,get:function(){return l.eToolkitLevel}});var r=i(8601);Object.defineProperty(t,"eRuleCategory",{enumerable:!0,get:function(){return r.eGuidelineCategory}});var o=i(8601);Object.defineProperty(t,"eRulesetType",{enumerable:!0,get:function(){return o.eGuidelineType}})},7412(e,t,i){var a=this&&this.__createBinding||(Object.create?function(e,t,i,a){void 0===a&&(a=i);var n=Object.getOwnPropertyDescriptor(t,i);n&&!("get"in n?!t.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,a,n)}:function(e,t,i,a){void 0===a&&(a=i),e[a]=t[i]}),n=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),l=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&a(t,e,i);return n(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.Checker=void 0;var r=i(461),o=i(7301),s=i(9955),u=i(6160),d=l(i(591)),c=i(8601),m=[],p={},h={};!function(){var e=JSON.parse(JSON.stringify(o.Engine.getLanguages()));for(var t in e.push("en-US"),d){var i=d[t];m.push(i);for(var a=e.length-1;a>=0;--a){var n=e[a];if(n in i.messages&&(p[i.id]=i.messages[n],p[i.id][0]=p[i.id].group),n in i.help){for(var l in h[i.id]={},i.help[n])h[i.id][l]="/".concat(n,"/").concat(i.help[n][l]);p[i.id][0]=p[i.id].group}}for(var r=0,s=i.rulesets;r<s.length;r++)for(var c=s[r],g=0,b=u.a11yRulesets;g<b.length;g++){var _=b[g];if(("string"==typeof c.id?[c.id]:c.id).includes(_.id))for(var f=0,v=_.checkpoints;f<v.length;f++){var A=v[f];("string"==typeof c.num?[c.num]:c.num).includes(A.num)&&(A.rules=A.rules||[],A.rules.push({id:i.id,reasonCodes:c.reasonCodes,level:c.level,toolkitLevel:c.toolkitLevel}))}}}}();var g=function(){function e(){this.guidelines=[],this.rulesets=this.guidelines,this.rulesetIds=[],this.rulesetRules={},this.ruleLevels={},this.ruleReasonLevels={},this.ruleCategory={};var e=this.engine=new o.Engine;e.addMapper(new s.ARIAMapper),e.addRules(m),e.addNlsMap(p),e.addHelpMap(h);for(var t=0,i=u.a11yRulesets;t<i.length;t++){var a=i[t];this.addRuleset(a)}}return e.prototype.addGuideline=function(e){e.id in this.rulesetRules&&this.removeGuideline(e.id),this.guidelines.push(e),this.rulesetIds.push(e.id);for(var t=[],i=0,a=e.checkpoints;i<a.length;i++){var n=a[i];n.rules=n.rules||[];for(var l=0,r=n.rules;l<r.length;l++){var o=r[l];if(!1!==o.enabled){t.push(o.id),this.ruleReasonLevels[o.id]=this.ruleReasonLevels[o.id]||{},this.ruleReasonLevels[o.id][e.id]=this.ruleReasonLevels[o.id][e.id]||{};var s=o.reasonCodes?o.reasonCodes.join("--"):"None";this.ruleReasonLevels[o.id][e.id][s]=o.level,this.ruleCategory[o.id]=this.ruleCategory[o.id]||{},this.ruleCategory[o.id][e.id]=e.category}}}this.rulesetRules[e.id]=t},e.prototype.enableRule=function(e){for(var t=0,i=this.getGuidelines();t<i.length;t++){for(var a=i[t],n=!1,l=0,r=a.checkpoints;l<r.length;l++)for(var o=0,s=r[l].rules;o<s.length;o++){var u=s[o];!1===u.enabled&&(n=!0,delete u.enabled)}n&&this.addGuideline(a)}},e.prototype.disableRule=function(e){for(var t=0,i=this.getGuidelines();t<i.length;t++){for(var a=i[t],n=!1,l=0,r=a.checkpoints;l<r.length;l++)for(var o=0,s=r[l].rules;o<s.length;o++){var u=s[o];!1!==u.enabled&&(n=!0,u.enabled=!1)}n&&this.addGuideline(a)}},e.prototype.removeGuideline=function(e){e in this.rulesetRules&&(delete this.rulesetRules[e],this.rulesets=this.guidelines=this.guidelines.filter(function(t){return t.id!==e}),this.rulesetIds=this.getGuidelineIds())},e.prototype.getGuidelines=function(){return JSON.parse(JSON.stringify(this.guidelines))},e.prototype.getGuidelineIds=function(){return this.guidelines.map(function(e){return e.id})},e.prototype.addRuleset=function(e){this.addGuideline(e)},e.prototype.enableSourceMap=function(e){this.engine.enableSourceMap(e)},e.prototype.isSourceMapEnabled=function(){return this.engine.isSourceMapEnabled()},e.prototype.check=function(e,t){var i=[];if(t){"string"==typeof t&&(t=[t]);for(var a=0,n=t;a<n.length;a++){var l=n[a];l in this.rulesetRules&&(i=i.concat(this.rulesetRules[l]))}}else i=this.engine.getRulesIds();this.engine.enableRules(i);var r=this;return this.engine.run(e).then(function(e){e.nls={};for(var i=0,a=e.results;i<a.length;i++){var n=a[i];n.ruleId in p&&(e.nls[n.ruleId]=e.nls[n.ruleId]||{0:p[n.ruleId][0]},n.reasonId in p[n.ruleId]&&(e.nls[n.ruleId][n.reasonId]=p[n.ruleId][n.reasonId]));var l=n.reasonId?n.reasonId:"None";n.value[0]=r.getReasonLevel(t,n.ruleId,l),n.category=r.getCategory(t,n.ruleId),delete n.path.css}return e})},e.prototype.getLevel=function(e,t){if(!e)return r.eRulePolicy.INFORMATION;var i=this.ruleLevels[t],a=null;if(e){if(!(t in this.ruleLevels))throw new Error("Rule triggered for which we have no rule level information: "+t);for(var n=0,l=e;n<l.length;n++){var o=l[n];o in i&&(i[o]===r.eRulePolicy.VIOLATION?a=r.eRulePolicy.VIOLATION:i[o]===r.eRulePolicy.RECOMMENDATION&&null===a?a=r.eRulePolicy.RECOMMENDATION:null===a&&(a=r.eRulePolicy.INFORMATION))}}if(null===a)throw new Error("Rule triggered for which we have no rule level information: "+t);return a},e.prototype.getReasonLevel=function(e,t,i){if(!e)return r.eRulePolicy.INFORMATION;var a=this.ruleReasonLevels[t],n=null;if(e){if(!(t in this.ruleReasonLevels))throw new Error("Rule triggered for which we have no rule level information "+t);for(var l=function(e){if(e in a){var t=new RegExp("(^|--)".concat(i,"($|--)"));Object.keys(a[e]).forEach(function(i){var l=null;"None"===i?l=a[e].None:t.test(i)&&(l=a[e][i]),null!==l&&(l===r.eRulePolicy.VIOLATION?n=r.eRulePolicy.VIOLATION:l===r.eRulePolicy.RECOMMENDATION&&null===n?n=r.eRulePolicy.RECOMMENDATION:null===n&&(n=r.eRulePolicy.INFORMATION))}),null===n&&(n=r.eRulePolicy.INFORMATION)}},o=0,s=e;o<s.length;o++)l(s[o])}if(null===n)throw new Error("Rule triggered for which we have no rule level information: "+t);return n},e.prototype.getCategory=function(e,t){var i=this.ruleCategory[t];if(!(t in this.ruleCategory))return c.eGuidelineCategory.OTHER;e||(e=this.getGuidelineIds());for(var a=0,n=e;a<n.length;a++){var l=n[a];if(l in i)return i[l]}return c.eGuidelineCategory.OTHER},e}();t.Checker=g},2297(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.a_target_warning=void 0;var a=i(7139),n=i(3946),l=i(5279),r=i(461),o=i(461);t.a_target_warning={id:"a_target_warning",context:"dom:a[target],dom:area[target],dom:base[target]",refactor:{WCAG20_A_TargetAndText:{Pass_0:"pass",Potential_1:"potential_warn"}},help:{"en-US":{group:"a_target_warning.html",pass:"a_target_warning.html",potential_warn:"a_target_warning.html"}},messages:{"en-US":{group:"Users should be warned in advance if their input action will open a new window",pass:"The user is warned in advance that the input action opens a new window",potential_warn:"Inform the user when their input action will open a new window"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"3.2.2",level:o.eRulePolicy.RECOMMENDATION,toolkitLevel:o.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var o=e.dom.node;if(n.VisUtil.isNodeHiddenFromAT(o)&&!a.CommonUtil.isTabbable(o))return null;var s={paramWinText:{value:["new window","new tab"],type:"array"}},u=o.getAttribute("target"),d="_parent"==u||"_self"==u||"_top"==u||null!=a.CommonUtil.getFrameByName(o,u);if(!d){var c=a.CommonUtil.getInnerText(o);if(o.hasAttribute("title")&&(c+=" "+o.getAttribute("title")),o.hasAttribute("aria-describedby"))for(var m=0,p=o.getAttribute("aria-describedby").trim().split(/\s+/);m<p.length;m++){var h=p[m],g=l.FragmentUtil.getById(o,h);if(g){var b=a.CommonUtil.getInnerText(g);b&&b.trim().length>0&&(c+=" "+b)}}for(var _=0;!d&&_<s.paramWinText.value.length;++_)-1!=c.indexOf(s.paramWinText.value[_])&&(d=!0)}return d?(0,r.RulePass)("pass"):(0,r.RulePotential)("potential_warn")}}},4401(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.a_text_purpose=void 0;var a=i(461),n=i(7139),l=i(3946),r=i(461),o=i(1950);t.a_text_purpose={id:"a_text_purpose",context:"aria:link,aria:doc-biblioref",refactor:{WCAG20_A_HasText:{Pass_0:"pass",Fail_1:"fail_acc_name"}},help:{"en-US":{group:"a_text_purpose.html",pass:"a_text_purpose.html",fail_acc_name:"a_text_purpose.html"}},messages:{"en-US":{group:"Hyperlinks must have an accessible name for their purpose",pass:"Hyperlink has a description of its purpose",fail_acc_name:"Hyperlink has no link text, label or image with a text alternative"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:["2.4.4","4.1.2"],level:r.eRulePolicy.VIOLATION,toolkitLevel:r.eToolkitLevel.LEVEL_TWO}],act:"c487ae",run:function(e,t){var i=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(i)||n.CommonUtil.isNodeDisabled(i))return null;var r=o.AccNameUtil.computeAccessibleName(i);return r&&r.name&&r.name.trim().length>0||n.CommonUtil.nonTabableChildCheck(i)?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_acc_name")}}},4546(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.applet_alt_exists=void 0;var a=i(7139),n=i(3946),l=i(461),r=i(461);t.applet_alt_exists={id:"applet_alt_exists",context:"dom:applet",refactor:{WCAG20_Applet_HasAlt:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{group:"applet_alt_exists.html",Pass_0:"applet_alt_exists.html",Fail_1:"applet_alt_exists.html",Fail_2:"applet_alt_exists.html",Fail_3:"applet_alt_exists.html"}},messages:{"en-US":{group:"<applet> elements must provide an 'alt' attribute and an alternative description",Pass_0:"Rule Passed",Fail_1:"An <applet> element does not have an 'alt' attribute that provides a short text alternative",Fail_2:"The 'alt' attribute value for an <applet> element duplicates the 'code' attribute",Fail_3:"An <applet> element provides alternative text, but does not provide inner content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"1.1.1",level:r.eRulePolicy.VIOLATION,toolkitLevel:r.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var r=e.dom.node;if(n.VisUtil.isNodeHiddenFromAT(r))return null;if(a.CommonUtil.attributeNonEmpty(r,"alt")){var o=r.getAttribute("alt").trim();return r.hasAttribute("code")&&o==r.getAttribute("code").trim()?(0,l.RuleFail)("Fail_2"):a.CommonUtil.hasInnerContentHidden(r)?(0,l.RulePass)("Pass_0"):(0,l.RuleFail)("Fail_3")}return(0,l.RuleFail)("Fail_1")}}},9292(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.application_content_accessible=void 0;var a=i(7011),n=i(3946),l=i(461),r=i(461);t.application_content_accessible={id:"application_content_accessible",context:"aria:application",refactor:{HAAC_Application_Role_Text:{0:"HAAC_Application_Role_Text.html",Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{0:"application_content_accessible.html",Pass_0:"application_content_accessible.html",Potential_1:"application_content_accessible.html"}},messages:{"en-US":{group:'Non-decorative static text and image content within an element with "application" role must be accessible',Pass_0:"Rule Passed",Potential_1:'Verify that the non-decorative static text and image content within an element with "application" role are accessible'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:["1.1.1","2.1.1"],level:r.eRulePolicy.VIOLATION,toolkitLevel:r.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){for(var r=!0,o=e.dom.node.childNodes,s=0;r&&s<o.length;s++)1===o[s].nodeType?n.VisUtil.isNodeVisible(o[s])&&(r=a.AriaUtil.hasRoleInSemantics(o[s],"document")||a.AriaUtil.hasRoleInSemantics(o[s],"article")):3===o[s].nodeType&&(r=0===o[s].nodeValue.trim().length);return r?(0,l.RulePass)("Pass_0"):(0,l.RulePotential)("Potential_1")}}},9605(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.area_alt_exists=void 0;var a=i(7139),n=i(3946),l=i(461),r=i(461);t.area_alt_exists={id:"area_alt_exists",context:"dom:area",refactor:{WCAG20_Area_HasAlt:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"area_alt_exists.html",Pass_0:"area_alt_exists.html",Fail_1:"area_alt_exists.html"}},messages:{"en-US":{group:"<area> elements in an image map must have a text alternative",Pass_0:"Rule Passed",Fail_1:"<area> element in an image map has no text alternative"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"1.1.1",level:r.eRulePolicy.VIOLATION,toolkitLevel:r.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var r=e.dom.node;return n.VisUtil.isNodeHiddenFromAT(r)?null:a.CommonUtil.attributeNonEmpty(r,"alt")?(0,l.RulePass)("Pass_0"):(0,l.RuleFail)("Fail_1")}}},3987(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_accessiblename_exists=void 0;var a=i(461),n=i(461),l=i(7011),r=i(3946),o=i(1950),s=i(9910);t.aria_accessiblename_exists={id:"aria_accessiblename_exists",context:"aria:columnheader, aria:heading, aria:rowheader, aria:graphics-document,aria:graphics-symbol, aria:img,aria:image, doc-backlink, doc-biblioentry, doc-biblioref, doc-glossref, doc-noteref, doc-pagebreak, doc-example",help:{"en-US":{pass:"aria_accessiblename_exists.html",fail_no_accessible_name:"aria_accessiblename_exists.html",fail_no_accessible_name_image:"aria_accessiblename_exists.html",group:"aria_accessiblename_exists.html"}},messages:{"en-US":{pass:"An accessible name is provided for the element",fail_no_accessible_name:'Element <{0}> with "{1}" role has no accessible name',fail_no_accessible_name_image:'Element <{0}> with "{1}" role has no accessible name',group:"Elements with certain roles should have accessible names"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE,reasonCodes:["fail_no_accessible_name"]},{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["ARIA"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE,reasonCodes:["fail_no_accessible_name_image"]}],act:[{"23a2a8":{fail_no_accessible_name_image:"fail"}}],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var u=n.nodeName.toLocaleLowerCase();if("svg"!==u&&"img"!==u){if("table"===u&&n.firstElementChild&&"caption"===n.firstElementChild.nodeName.toLowerCase()&&n.firstElementChild.textContent&&n.firstElementChild.textContent.trim().length>0)return(0,a.RulePass)("pass");var d=l.AriaUtil.getRolesUndefinedByAria(n);if(d&&d.length>0)return null;var c=l.AriaUtil.getDeprecatedAriaRoles(n);if(c&&c.length>0)return null;var m=l.AriaUtil.getDeprecatedAriaAttributes(n);if(m&&m.length>0)return null;var p=l.AriaUtil.getResolvedRole(n);if(!p||!s.ARIADefinitions.designPatterns[p]||!s.ARIADefinitions.designPatterns[p].nameRequired)return null;var h=o.AccNameUtil.computeAccessibleName(n);return h&&h.name&&0!==h.name.trim().length?(0,a.RulePass)("pass"):"img"===p||"image"===p?(0,a.RuleFail)("fail_no_accessible_name_image",[n.nodeName.toLowerCase(),p]):(0,a.RuleFail)("fail_no_accessible_name",[n.nodeName.toLowerCase(),p])}}}},8631(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_activedescendant_tabindex_valid=void 0;var a=i(461),n=i(461),l=i(7139);t.aria_activedescendant_tabindex_valid={id:"aria_activedescendant_tabindex_valid",context:"dom:*[aria-activedescendant]",refactor:{Rpt_Aria_InvalidTabindexForActivedescendant:{pass:"pass",Fail_1:"Fail_1"}},help:{"en-US":{pass:"aria_activedescendant_tabindex_valid.html",Fail_1:"aria_activedescendant_tabindex_valid.html",group:"aria_activedescendant_tabindex_valid.html"}},messages:{"en-US":{pass:"Rule Passed",Fail_1:"The <{0}> element using 'aria-activedescendant' set to \"{1}\" is not tabbable",group:"Element using 'aria-activedescendant' property should be tabbable"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,r=!1,o=n.nodeName.toLowerCase();if(n.hasAttribute("class")&&"mbl"==n.getAttribute("class").substring(0,3))return null;if(l.CommonUtil.isNodeDisabled(n))return null;if(0!==n.getAttribute("aria-activedescendant").trim().length){(r=l.CommonUtil.isTabbable(n))||(r=l.CommonUtil.getTabbableChildren(n)>0);var s=new Array;s.push(o);var u=new Array;return u.push(n.getAttribute("aria-activedescendant").split(" ").join(", ")),r?(0,a.RulePass)("pass"):(0,a.RuleFail)("Fail_1",[s.toString(),u.toString()])}}}},8025(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_activedescendant_valid=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(5279),s=i(3946),u=i(1686);t.aria_activedescendant_valid={id:"aria_activedescendant_valid",context:"dom:*[aria-activedescendant]",refactor:{HAAC_ActiveDescendantCheck:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{Pass_0:"aria_activedescendant_valid.html",Fail_1:"aria_activedescendant_valid.html",Fail_2:"aria_activedescendant_valid.html",Fail_3:"aria_activedescendant_valid.html",group:"aria_activedescendant_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The 'aria-activedescendant' property is empty",Fail_2:"The 'aria-activedescendant' property references a hidden node",Fail_3:"Element is not a combobox, and the referenced active-descendant element is not a valid descendant",group:"The 'aria-activedescendant' property must reference the 'id' of a non-empty, non-hidden active child element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.AriaUtil.hasRoleInSemantics(n,"combobox"))return null;var d=l.AriaUtil.getAriaAttribute(n,"aria-activedescendant");if(!d||""===d.trim())return(0,a.RuleFail)("Fail_1");var c=o.FragmentUtil.getById(n,d.trim());if(!c||u.DOMUtil.sameNode(d,n))return null;if(!s.VisUtil.isNodeVisible(c))return(0,a.RuleFail)("Fail_2");if(n.contains(c))return(0,a.RulePass)("Pass_0");var m=2;if(n.hasAttribute("aria-owns"))for(var p=r.CommonUtil.normalizeSpacing(n.getAttribute("aria-owns").trim()).split(" "),h=0;h<p.length;h++)if((v=o.FragmentUtil.getById(n,p[h]))&&!u.DOMUtil.sameNode(v,n)&&v.contains(c))return(0,a.RulePass)("Pass_0");if(l.AriaUtil.hasRoleInSemantics(n,"textbox")&&n.hasAttribute("aria-controls")){m=3;var g=r.CommonUtil.normalizeSpacing(n.getAttribute("aria-controls").trim()).split(" ");for(h=0;h<g.length;h++){var b=o.FragmentUtil.getById(n,g[h]);if(b&&!u.DOMUtil.sameNode(b,n)&&b.contains(c))return(0,a.RulePass)("Pass_0");if(b.hasAttribute("aria-owns"))for(var _=r.CommonUtil.normalizeSpacing(b.getAttribute("aria-owns").trim()).split(" "),f=0;f<_.length;f++){var v;if((v=o.FragmentUtil.getById(n,_[f]))&&!u.DOMUtil.sameNode(v,n)&&v.contains(c))return(0,a.RulePass)("Pass_0")}}}return 3==m?(0,a.RuleFail)("Fail_3"):null}}},1198(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_application_label_unique=void 0;var a=i(461),n=i(461),l=i(7011),r=i(3946);t.aria_application_label_unique={id:"aria_application_label_unique",context:"aria:application",refactor:{Rpt_Aria_MultipleApplicationLandmarks:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_application_label_unique.html",fail_label_not_unique:"aria_application_label_unique.html",group:"aria_application_label_unique.html"}},messages:{"en-US":{pass:'The element with "application" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "application" role do not have unique labels',group:'Each element with "application" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var o=l.AriaUtil.isLandmarkNameUnique(n,"application");return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},8001(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_application_labelled=void 0;var a=i(461),n=i(461),l=i(1950),r=i(3946);t.aria_application_labelled={id:"aria_application_labelled",context:"aria:application",refactor:{Rpt_Aria_ApplicationLandmarkLabel:{Pass_0:"pass",Fail_1:"fail_no_label"}},help:{"en-US":{pass:"aria_application_labelled.html",fail_no_label:"aria_application_labelled.html",group:"aria_application_labelled.html"}},messages:{"en-US":{pass:'The element with "application" role has a label that describes its purpose',fail_no_label:'Element with "application" role does not have a label',group:'Each element with "application" role must have a label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;return r.VisUtil.isNodeHiddenFromAT(n)?null:l.AccNameUtil.computeAccessibleName(n)?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_no_label")}}},5778(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_article_label_unique=void 0;var a=i(461),n=i(461),l=i(3946),r=i(7011);t.aria_article_label_unique={id:"aria_article_label_unique",context:"aria:article",refactor:{Rpt_Aria_MultipleArticleRoles_Implicit:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_article_label_unique.html",fail_label_not_unique:"aria_article_label_unique.html",group:"aria_article_label_unique.html"}},messages:{"en-US":{pass:'The element with "article" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "article" role do not have unique labels',group:'Each element with "article" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var o=r.AriaUtil.isLandmarkNameUnique(n,"article");return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},8118(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_allowed=void 0;var a=i(461),n=i(461),l=i(9910),r=i(7011);t.aria_attribute_allowed={id:"aria_attribute_allowed",context:"dom:*",refactor:{Rpt_Aria_ValidProperty:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"aria_attribute_allowed.html",Pass_0:"aria_attribute_allowed.html",Fail_1:"aria_attribute_allowed.html"}},messages:{"en-US":{group:"ARIA attributes must be valid for the element's role",Pass_0:"Rule Passed",Fail_1:"The attribute(s) '{0}' referenced by the element <{1}> is not a valid ARIA state or property"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"4.1.2",level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:"5f99a7",run:function(e,t,i){var n=e.dom.node,o=n.attributes;if(o){for(var s=l.ARIADefinitions.propertyDataTypes,u="",d=0,c=0,m=o.length;c<m;c++){var p=o[c].name;r.AriaUtil.isDefinedAriaAttribute(n,p)&&(d++,s[p]||(u=0==u.length?p:u+", "+p))}return 0==d?null:0!=u.length?(0,a.RuleFail)("Fail_1",[u,n.nodeName.toLowerCase()]):(0,a.RulePass)("Pass_0")}return null}}},2242(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_conflict=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139);t.aria_attribute_conflict={id:"aria_attribute_conflict",context:"dom:*[aria-required], dom:*[aria-autocomplete], dom:*[aria-readonly], dom:*[aria-disabled], dom:*[aria-placeholder], dom:*[aria-checked], dom:*[aria-hidden], dom:*[aria-valuemax], dom:*[aria-valuemin], dom:*[aria-colspan], dom:*[aria-rowspan]",help:{"en-US":{fail_conflict:"aria_attribute_conflict.html",group:"aria_attribute_conflict.html"}},messages:{"en-US":{fail_conflict:'The ARIA attribute "{0}" is in conflict with the corresponding HTML attribute "{1}"',group:"An ARIA attribute must not conflict with the corresponding HTML attribute"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,o=l.AriaUtil.getInvalidAriaAttributes(n);if(o&&o.length>0)return null;var s=[],u=l.AriaUtil.getUserDefinedAriaAttributes(n);if(!u||0===u.length)return null;for(var d=l.AriaUtil.getConflictAriaAndHtmlAttributes(n),c=0;c<d.length;c++)s.push((0,a.RuleFail)("fail_conflict",[d[c].ariaAttr,d[c].htmlAttr])),u.includes(d[c].ariaAttr)&&r.CommonUtil.reduceArrayItemList([d[c].ariaAttr],u);return s.length>0?s:null}}},3673(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_deprecated=void 0;var a=i(461),n=i(461),l=i(7011);t.aria_attribute_deprecated={id:"aria_attribute_deprecated",context:"dom:*",help:{"en-US":{fail_aria_role:"aria_attribute_deprecated.html",fail_aria_attr:"aria_attribute_deprecated.html",fail_role_attr:"aria_attribute_deprecated.html",group:"aria_attribute_deprecated.html"}},messages:{"en-US":{fail_aria_role:'The ARIA role "{0}" is deprecated in the ARIA specification',fail_aria_attr:'The ARIA attributes "{0}" are deprecated in the ARIA specification',fail_role_attr:'The ARIA attributes "{0}" are deprecated for the role "{1}" in the ARIA specification',group:"No deprecated ARIA role or attribute should be used"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["ARIA"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,r=[],o=l.AriaUtil.getDeprecatedAriaRoles(n);if(o&&o.length>0)for(var s=0;s<o.length;s++)r.push((0,a.RuleFail)("fail_aria_role",[o[s]]));var u=l.AriaUtil.getDeprecatedAriaAttributes(n);if(u&&u.length>0)for(s=0;s<u.length;s++)"any"===u[s].role?r.push((0,a.RuleFail)("fail_aria_attr",[u[s].attribute])):r.push((0,a.RuleFail)("fail_role_attr",[u[s].attribute,u[s].role]));return r.length>0?r:null}}},5080(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_exists=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(9910),s=i(3946);t.aria_attribute_exists={id:"aria_attribute_exists",context:"dom:*[role]",dependencies:["aria_role_allowed"],refactor:{Rpt_Aria_EmptyPropertyValue:{pass:"pass",fail_empty_attribute:"fail_empty_attribute"}},help:{"en-US":{pass:"aria_attribute_exists.html",fail_empty_attribute:"aria_attribute_exists.html",group:"aria_attribute_exists.html"}},messages:{"en-US":{pass:"Rule Passed",fail_empty_attribute:"The element attribute(s): '{0}' value is empty",group:"When specifying a required ARIA attribute, the value must not be empty"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:["6a7281"],run:function(e,t,i){var n=e.dom.node;if(!s.VisUtil.isNodeHiddenFromAT(n)){var u=new Array,d=o.ARIADefinitions.designPatterns,c=r.CommonUtil.hasAttribute,m=0,p=l.AriaUtil.getResolvedRole(n);if(p){if(d[p]&&null!=l.AriaUtil.getRoleRequiredProperties(p,n))for(var h=l.AriaUtil.getRoleRequiredProperties(p,n),g=0,b=h.length;g<b;g++)c(n,w=h[g])?(m++,0==r.CommonUtil.normalizeSpacing(n.getAttribute(h[g])).length&&u.push(h[g])):"aria-labelledby"==h[g]?"radiogroup"==p&&c(n,"aria-label")&&(m++,0==r.CommonUtil.normalizeSpacing(n.getAttribute("aria-label")).length&&u.push("aria-label")):"aria-valuenow"==h[g]&&"progressbar"==p&&c(n,"aria-valuetext")&&(m++,0==r.CommonUtil.normalizeSpacing(n.getAttribute("aria-valuetext")).length&&u.push("aria-valuetext"));if(d[p]){var _=l.AriaUtil.getElementAriaProperty(n),f=[];f.push(p);for(var v=l.AriaUtil.getAllowedAriaAttributes(n,f,_),A=(g=0,v.length);g<A;g++){var w;"aria-checked"!=(w=v[g])&&"aria-selected"!=w&&"aria-expanded"!=w&&"aria-orientation"!=w&&"aria-level"!=w||c(n,w)&&(m++,0!=r.CommonUtil.normalizeSpacing(n.getAttribute(w)).length||u.includes(w)||u.push(w))}}var y=new Array,C=0==u.length;return y.push(u.join(", ")),0==m?null:C?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_empty_attribute",y)}}}}},183(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_redundant=void 0;var a=i(461),n=i(461),l=i(7011);t.aria_attribute_redundant={id:"aria_attribute_redundant",context:"dom:*[aria-required], dom:*[aria-autocomplete], dom:*[aria-readonly], dom:*[aria-disabled], dom:*[aria-placeholder], dom:*[aria-checked], dom:*[aria-hidden], dom:*[aria-valuemax], dom:*[aria-valuemin], dom:*[aria-colspan], dom:*[aria-rowspan]",help:{"en-US":{pass:"aria_attribute_redundant.html",fail_redundant:"aria_attribute_redundant.html",group:"aria_attribute_redundant.html"}},messages:{"en-US":{pass:"The ARIA attribute is not redundant with a corresponding HTML attribute",fail_redundant:'The ARIA attribute "{0}" is redundant with the HTML attribute "{1}"',group:"An ARIA attribute should not be redundant with a corresponding HTML attribute"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,r=l.AriaUtil.getInvalidAriaAttributes(n);if(r&&r.length>0)return null;var o=l.AriaUtil.getConflictAriaAndHtmlAttributes(n);if(o&&o.length>0)return null;var s=n.attributes,u=[],d=[];if(s)for(var c=0;c<s.length;c++){var m=s[c].name.trim().toLowerCase(),p=n.getAttribute(m);""===p&&(p=null),"aria-"===m.substring(0,5)?u.push({name:m,value:p}):d.push({name:m,value:p})}var h=[],g=function(e){var t=l.AriaUtil.getConflictOrOverlappingHtmlAttribute(u[e],d,"overlapping");if(null===t)return"continue";t.forEach(function(t){"Pass"===t.result?h.push((0,a.RulePass)("pass")):"Failed"===t.result&&h.push((0,a.RuleFail)("fail_redundant",[u[e].name,t.attr]))})};for(c=0;c<u.length;c++)g(c);return h.length>0?h:null}}},6805(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_required=void 0;var a=i(9910),n=i(7011),l=i(7139),r=i(461),o=i(461);t.aria_attribute_required={id:"aria_attribute_required",context:"dom:*[role]",dependencies:["aria_role_allowed"],refactor:{Rpt_Aria_RequiredProperties:{Pass_0:"pass",Fail_1:"fail_missing"}},help:{"en-US":{group:"aria_attribute_required.html",pass:"aria_attribute_required.html",fail_missing:"aria_attribute_required.html"}},messages:{"en-US":{group:"The required attributes for the element with a role must be defined",pass:"The required attributes for the element with the role are defined",fail_missing:"Element with '{0}' role does not have the required ARIA attribute(s): '{1}'"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"4.1.2",level:o.eRulePolicy.VIOLATION,toolkitLevel:o.eToolkitLevel.LEVEL_ONE}],act:"4e8ab6",run:function(e,t,i){var o=e.dom.node,s=new Array,u=new Array,d=a.ARIADefinitions.designPatterns,c=l.CommonUtil.hasAttribute,m=n.AriaUtil.getElementAriaProperty(o),p=n.AriaUtil.getResolvedRole(o);if(p){var h=n.AriaUtil.getRoleRequiredProperties(p,o);if(d[p]&&null!==h){for(var g=n.AriaUtil.getAllowedAriaAttributes(o,p,m),b=!1,_=0,f=h.length;_<f;_++)g.includes(h[_])&&(c(o,h[_])||("aria-labelledby"==h[_]?c(o,"aria-label")&&"radiogroup"==p||(s.push(h[_]),b=!0):"aria-valuenow"==h[_]?c(o,"aria-valuetext")&&"progressbar"==p||(s.push(h[_]),b=!0):"aria-controls"==h[_]&&"combobox"==p||(s.push(h[_]),b=!0)));1==b&&u.push(p)}if(0==u.length||0==s.length)return(0,r.RulePass)("pass");var v=new Array;return v.push(u.join(", ")),v.push(s.join(", ")),(0,r.RuleFail)("fail_missing",v)}}}},1886(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_value_valid=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(9910);t.aria_attribute_value_valid={id:"aria_attribute_value_valid",context:"dom:*",dependencies:["aria_attribute_allowed"],refactor:{Rpt_Aria_ValidPropertyValue:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"aria_attribute_value_valid.html",Pass_0:"aria_attribute_value_valid.html",Fail_1:"aria_attribute_value_valid.html"}},messages:{"en-US":{group:"ARIA property values must be valid",Pass_0:"Rule Passed",Fail_1:"The value \"{0}\" specified for attribute '{1}' on element <{2}> is not valid"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:"6a7281",run:function(e,t,i){var n=e.dom.node,s=new Array,u=new Array,d=new Array,c=o.ARIADefinitions.propertyDataTypes,m=n.attributes,p=0;if(m)for(var h=0,g=m.length;h<g;h++){var b=m[h].name;if(l.AriaUtil.isDefinedAriaAttribute(n,b)){var _=c[b],f=r.CommonUtil.normalizeSpacing(m[h].nodeValue);if(p++,_&&_.values){if(-1==_.values.indexOf(f))if(-1!=_.values.indexOf("undefined")&&0==f.length);else if("http://www.w3.org/2001/XMLSchema#nmtokens"===_.type){var v=m[h].nodeValue.trim().split(" ");if(v.length>1&&v.includes("all"))s.push(m[h].nodeValue.split(" ")),u.push(b),d.push(_.values.toString());else for(var A={},w=0;w<v.length;w++)""==v[w]||_.values.includes(v[w])||(A.hasOwnProperty(b)||(A[b]=!0,u.push(b)),s.push(v[w]),d.push(_.values.toString()))}else s.push(m[h].nodeValue.split(" ")),u.push(b),d.push(_.values.toString())}else if(_&&_.type&&"http://www.w3.org/2001/XMLSchema#int"===_.type){var y=parseInt(f);(isNaN(y)||""+y!==f)&&(s.push(f),u.push(b))}else if(_&&_.type&&"http://www.w3.org/2001/XMLSchema#decimal"==_.type){var C=parseFloat(f);isNaN(C)&&(s.push(f),u.push(b))}else if(_&&_.type&&"http://www.w3.org/2001/XMLSchema#boolean"==_.type){var k=f.trim().toLowerCase();"true"!==k&&"false"!==k&&(s.push(f),u.push(b))}else _&&_.type&&"http://www.w3.org/2001/XMLSchema#string"==_.type||p--}}var R=new Array,x=0==u.length;return R.push(s.join(", ")),R.push(u.join(", ")),R.push(n.nodeName.toLowerCase()),0==p?null:x?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",R)}}},4078(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_banner_label_unique=void 0;var a=i(461),n=i(461),l=i(7011),r=i(3946);t.aria_banner_label_unique={id:"aria_banner_label_unique",context:"aria:banner",refactor:{Rpt_Aria_MultipleBannerLandmarks_Implicit:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_banner_label_unique.html",fail_label_not_unique:"aria_banner_label_unique.html",group:"aria_banner_label_unique.html"}},messages:{"en-US":{pass:'The element with "banner" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "banner" role do not have unique labels',group:'Each element with "banner" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var o=l.AriaUtil.isLandmarkNameUnique(n,"banner",!0);return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},5750(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_banner_single=void 0;var a=i(461),n=i(461),l=i(7011),r=i(3946);t.aria_banner_single={id:"aria_banner_single",context:"dom:*[role], dom:header",refactor:{Rpt_Aria_OneBannerInSiblingSet_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_banner_single.html",Fail_1:"aria_banner_single.html",group:"aria_banner_single.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "banner" role found on the page',group:'A page, document, or application should only have one element with "banner" role'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;return r.VisUtil.isNodeHiddenFromAT(n)?null:l.AriaUtil.hasRoleInSemantics(n,"banner")?null===l.AriaUtil.getSiblingWithRoleHidden(n,"banner",!0,!0)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1"):null}}},85(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_child_tabbable=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(9910),s=i(3946);t.aria_child_tabbable={id:"aria_child_tabbable",context:"dom:*[role]",dependencies:["aria_role_allowed"],refactor:{Rpt_Aria_MissingFocusableChild:{pass:"pass",fail_missing_child:"fail_missing_child"}},help:{"en-US":{pass:"aria_child_tabbable.html",fail_missing_child:"aria_child_tabbable.html",group:"aria_child_tabbable.html"}},messages:{"en-US":{pass:"Rule Passed",fail_missing_child:'None of the descendent elements with "{1}" role is tabbable',group:"UI component must have at least one tabbable descendant for keyboard access"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(!(s.VisUtil.isNodeHiddenFromAT(n)||r.CommonUtil.isNodeDisabled(n)||l.AriaUtil.containsPresentationalChildrenOnly(n)||l.AriaUtil.shouldBePresentationalChild(n))){if(l.AriaUtil.hasRole(n,{list:!0,row:!0,rowgroup:!0,table:!0,grid:!0}))return null;if(n.hasAttribute("class")&&"mbl"==n.getAttribute("class").substring(0,3))return null;if("datalist"===n.nodeName.toLowerCase())return null;if(l.AriaUtil.isNavigationOwnedOrControlled(n))return null;var u=l.AriaUtil.getResolvedRole(n),d=!0,c=n.ownerDocument,m=r.CommonUtil.hasAttribute,p=new Array,h="",g=!1;if(o.ARIADefinitions.containers.includes(u)&&"true"!=(m(n,"aria-disabled")?n.getAttribute("aria-disabled"):"")&&!m(n,"aria-activedescendant")&&!r.CommonUtil.isTabbable(n)){var b=o.ARIADefinitions.designPatterns[u].reqChildren;if(b){g=!0,d=!1;for(var _="descendant::*[",f=0;f<b.length;f++)_+="@role='"+b[f]+"' or ";_=_.substring(0,_.length-4)+"]";for(var v=c.evaluate(_,n,r.CommonUtil.defaultNSResolver,0,null),A=v.iterateNext();A&&!d;)if(r.CommonUtil.shouldNodeBeSkippedHidden(A))A=v.iterateNext();else{if(!(d=r.CommonUtil.isTabbable(A)))for(var w=c.evaluate("descendant::*",A,r.CommonUtil.defaultNSResolver,0,null),y=w.iterateNext();y&&!d;)r.CommonUtil.shouldNodeBeSkippedHidden(y)||(d=r.CommonUtil.isTabbable(A)),y=w.iterateNext();d||(p=A.getAttribute("role").trim().split(" "),h=A.nodeName.toLowerCase()),A=v.iterateNext()}}}var C=new Array,k=new Array;return h.length>0&&p.length>0?(C.push(h),k.push(p.join(", "))):d=!0,g?d?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_missing_child",[C.toString(),k.toString()]):null}}}},514(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_child_valid=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(3946);t.aria_child_valid={id:"aria_child_valid",context:"dom:*",dependencies:["aria_role_valid","aria_descendant_valid"],help:{"en-US":{group:"aria_child_valid.html",Pass:"aria_child_valid.html",Fail_no_child:"aria_child_valid.html",Fail_invalid_child:"aria_child_valid.html"}},messages:{"en-US":{group:"An element with an ARIA role must own a required child",Pass:"An element with an ARIA role owns a required child",Fail_no_child:'The element with role "{0}" does not own any child element with any of the following role(s): "{1}"',Fail_invalid_child:'The element with role "{0}" owns the child element with the role "{1}" that is not one of the allowed role(s): "{2}"'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:["bc4a75"],run:function(e,t,i){var n=e.dom.node;if(!o.VisUtil.isNodeHiddenFromAT(n)&&!r.CommonUtil.isNodeDisabled(n)&&!l.AriaUtil.containsPresentationalChildrenOnly(n)){var s=l.AriaUtil.getRoles(n,!1);if(s&&0!==s.length||(s=l.AriaUtil.getImplicitRole(n)),!s||0===s.length)return null;var u=["none","presentation"];if(s.some(function(e){return u.includes(e)}))return null;if(s.includes("combobox"))return null;var d=l.AriaUtil.getRequiredChildRoles(n,!0);if(d.includes("group")){var c=d.indexOf("group");c>-1&&d.splice(c,1)}if(0==d.length)return null;var m=l.AriaUtil.getDirectATChildren(n);if(!m||0==m.length){var p=n.getAttribute("aria-busy");return p&&"true"===p?null:((v=new Array).push(s.join(", ")),v.push(d.join(", ")),(0,a.RuleFail)("Fail_no_child",v))}for(var h=new Array,g=0;g<m.length;g++){var b=l.AriaUtil.getRoles(m[g],!1);b&&0!=b.length||(b=l.AriaUtil.getImplicitRole(m[g])),b&&b.length>0&&(b.some(function(e){return d.includes(e)})||h.push(b.join(", ")))}if(h.length>0){for(var _=[],f=0;f<h.length;f++){var v;(v=new Array).push(s.join(", ")),v.push(h[f]),v.push(d.join(", ")),_.push((0,a.RuleFail)("Fail_invalid_child",v))}return _}return(0,a.RulePass)("Pass")}}}},5310(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_complementary_label_unique=void 0;var a=i(461),n=i(461),l=i(7011),r=i(3946);t.aria_complementary_label_unique={id:"aria_complementary_label_unique",context:"aria:complementary",refactor:{Rpt_Aria_MultipleComplementaryLandmarks_Implicit:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_complementary_label_unique.html",fail_label_not_unique:"aria_complementary_label_unique.html",group:"aria_complementary_label_unique.html"}},messages:{"en-US":{pass:'The element with "complementary" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "complementary" role do not have unique labels',group:'Each element with "complementary" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var o=l.AriaUtil.isLandmarkNameUnique(n,"complementary");return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},9083(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_complementary_label_visible=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(3946);t.aria_complementary_label_visible={id:"aria_complementary_label_visible",context:"dom:*[role], dom:aside",dependencies:["aria_complementary_labelled"],refactor:{Rpt_Aria_ComplementaryLandmarkLabel_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_complementary_label_visible.html",Fail_1:"aria_complementary_label_visible.html",group:"aria_complementary_label_visible.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Element with "complementary" role does not have a visible label',group:'Each element with "complementary" role should have a visible label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;return o.VisUtil.isNodeHiddenFromAT(n)?null:l.AriaUtil.hasRoleInSemantics(n,"complementary")?r.CommonUtil.attributeNonEmpty(n,"aria-labelledby")?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1"):null}}},6049(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_complementary_labelled=void 0;var a=i(461),n=i(461),l=i(1950),r=i(3946);t.aria_complementary_labelled={id:"aria_complementary_labelled",context:"aria:complementary",refactor:{Rpt_Aria_ComplementaryRequiredLabel_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_complementary_labelled.html",Fail_1:"aria_complementary_labelled.html",group:"aria_complementary_labelled.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Element with "complementary" role does not have a label',group:'Each element with "complementary" role must have a label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;return r.VisUtil.isNodeHiddenFromAT(n)?null:l.AccNameUtil.computeAccessibleName(n)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},5099(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_content_in_landmark=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(4566),s=i(3864),u=i(3946),d=i(9196);t.aria_content_in_landmark={id:"aria_content_in_landmark",context:"dom:*",refactor:{Rpt_Aria_OrphanedContent_Native_Host_Sematics:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_content_in_landmark.html",Fail_1:"aria_content_in_landmark.html",group:"aria_content_in_landmark.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Content is not within a landmark element",group:"All content must reside within an element with a landmark role"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE},{id:["WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=o.CacheUtil.getCache(e.dom.node.ownerDocument,"aria_content_in_landmark",null);if(!n){(n={landmarks:{value:["banner","complementary","contentinfo","form","main","navigation","region","search"],type:"array"},possibleOrphanedWidgets:{value:["button","combobox","checkbox","grid","heading","link","list","listbox","menu","menubar","progressbar","radio","tablist","textbox","toolbar","tree","treegrid"],type:"array"},possibleOrphanedElements:{value:["p","table","input","textarea","select","button","a","ol","ul","dl","h1","h2","h3","h4","h5","h6","embed","object","area"],type:"array"},noLandmarkedRoles:{value:["alert","alertdialog","dialog","tooltip"],type:"array"},mapLandmarks:{},mapPossibleOrphanedWidgets:{},mapPossibleOrphanedElements:{},mapNoLandmarkedRoles:{}}).mapLandmarks={};for(var c=0;c<n.landmarks.value.length;++c)n.mapLandmarks[n.landmarks.value[c]]=!0;for(n.mapPossibleOrphanedWidgets={},c=0;c<n.possibleOrphanedWidgets.value.length;++c)n.mapPossibleOrphanedWidgets[n.possibleOrphanedWidgets.value[c]]=!0;for(n.mapPossibleOrphanedElements={},c=0;c<n.possibleOrphanedElements.value.length;++c)n.mapPossibleOrphanedElements[n.possibleOrphanedElements.value[c]]=!0;for(n.mapNoLandmarkedRoles={},c=0;c<n.noLandmarkedRoles.value.length;++c)n.mapNoLandmarkedRoles[n.noLandmarkedRoles.value[c]]=!0;o.CacheUtil.setCache(e.dom.node.ownerDocument,"aria_content_in_landmark",n)}var m=e.dom.node,p=m.nodeName.toLowerCase();if(!u.VisUtil.isNodeVisible(m)||null!=u.VisUtil.hiddenByDefaultElements&&null!=u.VisUtil.hiddenByDefaultElements&&u.VisUtil.hiddenByDefaultElements.indexOf(p)>-1)return(0,a.RulePass)("Pass_0");if(!r.CommonUtil.hasInnerContentHidden(m)&&-1===["area","input","embed","button","textarea","select"].indexOf(p))return(0,a.RulePass)("Pass_0");if("table"==p&&d.TableUtil.isLayoutTable(m))return null;var h=!0,g=l.AriaUtil.hasRole(m,n.mapPossibleOrphanedWidgets,!0);"link"===p&&(g=!1);var b=p in n.mapPossibleOrphanedElements;if(!g&&!b)return null;if(!(h=i.aria.map(function(e){return e.role}).filter(function(e){return e in n.mapLandmarks}).length>0)){for(var _=s.DOMWalker.parentElement(m);!h&&null!=_;)h=o.CacheUtil.getCache(_,"Rpt_Aria_OrphanedContent",!1),_=s.DOMWalker.parentElement(_);for(_=m.nextElementSibling;!h&&null!=_;)h=o.CacheUtil.getCache(_,"Rpt_Aria_OrphanedContent",!1),_=_.nextElementSibling;for(_=m.previousElementSibling;!h&&null!=_;)h=o.CacheUtil.getCache(_,"Rpt_Aria_OrphanedContent",!1),_=_.previousElementSibling;if(h)return null;if(o.CacheUtil.setCache(m,"Rpt_Aria_OrphanedContent",!0),h=o.CacheUtil.getCache(m,"Rpt_Aria_OrphanedContent_NoTrigger",!1)||l.AriaUtil.hasRole(m,n.mapNoLandmarkedRoles,!0)||l.AriaUtil.getAncestorWithRole(m,n.mapNoLandmarkedRoles,!0))return o.CacheUtil.setCache(m,"Rpt_Aria_OrphanedContent_NoTrigger",!0),null}return h?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},2759(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_contentinfo_label_unique=void 0;var a=i(461),n=i(461),l=i(7011),r=i(3946);t.aria_contentinfo_label_unique={id:"aria_contentinfo_label_unique",context:"aria:contentinfo",refactor:{Rpt_Aria_MultipleContentinfoLandmarks_Implicit:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_contentinfo_label_unique.html",fail_label_not_unique:"aria_contentinfo_label_unique.html",group:"aria_contentinfo_label_unique.html"}},messages:{"en-US":{pass:'The element with "contentinfo" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "contentinfo" role do not have unique labels',group:'Each element with "contentinfo" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var o=l.AriaUtil.isLandmarkNameUnique(n,"contentinfo",!0);return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},3141(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_contentinfo_misuse=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(3946);t.aria_contentinfo_misuse={id:"aria_contentinfo_misuse",context:"dom:*[role], dom:footer, dom:address",refactor:{Rpt_Aria_ContentinfoWithNoMain_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_contentinfo_misuse.html",Fail_1:"aria_contentinfo_misuse.html",group:"aria_contentinfo_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Element with "contentinfo" role is present without an element with "main" role',group:'Each element with "contentinfo" role is only permitted with an element with "main" role'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;return o.VisUtil.isNodeHiddenFromAT(n)?null:l.AriaUtil.hasRoleInSemantics(n,"contentinfo")?r.CommonUtil.getElementsByRoleHidden(n.ownerDocument,"main",!0,!0).length>0?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1"):null}}},5131(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_contentinfo_single=void 0;var a=i(461),n=i(461),l=i(7011),r=i(3946);t.aria_contentinfo_single={id:"aria_contentinfo_single",context:"dom:*[role], dom:footer, dom:address",refactor:{Rpt_Aria_MultipleContentinfoInSiblingSet_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_contentinfo_single.html",Fail_1:"aria_contentinfo_single.html",group:"aria_contentinfo_single.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "contentinfo" role found on the page',group:'A page, document, or application should only have one element with "contentinfo" role'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;return r.VisUtil.isNodeHiddenFromAT(n)?null:l.AriaUtil.hasRoleInSemantics(n,"contentinfo")?l.AriaUtil.getSiblingWithRoleHidden(n,"contentinfo",!0,!0)?(0,a.RuleFail)("Fail_1"):(0,a.RulePass)("Pass_0"):null}}},5167(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_descendant_valid=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(3946);t.aria_descendant_valid={id:"aria_descendant_valid",context:"dom:*",dependencies:["aria_role_valid"],help:{"en-US":{group:"aria_descendant_valid.html",pass:"aria_descendant_valid.html",potential_child_implicit_role:"aria_descendant_valid.html",recommendation_no_impact_role:"aria_descendant_valid.html",fail_child_explicit_role:"aria_descendant_valid.html"}},messages:{"en-US":{group:"Browsers ignore the explicit and implicit ARIA roles of the descendants of certain elements",pass:"The element contains valid descendants",potential_child_implicit_role:'The element with role "{0}" contains descendants with implicit roles "{1}" which are ignored by browsers',recommendation_no_impact_role:'The element with role "{0}" contains descendants with roles "{1}" which are ignored by browsers',fail_child_explicit_role:'The element with role "{0}" contains descendants with roles "{1}" which are ignored by browsers'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE,reasonCodes:["pass","potential_child_implicit_role","fail_child_explicit_role"]},{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE,reasonCodes:["recommendation_no_impact_role"]}],act:["307n5z"],run:function(e,t,i){var n=e.dom.node;if(!o.VisUtil.isNodeHiddenFromAT(n)&&!r.CommonUtil.isNodeDisabled(n)&&l.AriaUtil.containsPresentationalChildrenOnly(n)){var s=l.AriaUtil.getRoles(n,!1);if(s&&0!==s.length||(s=l.AriaUtil.getImplicitRole(n)),!s||0===s.length)return null;var u=l.AriaUtil.getDirectATChildren(n);if(!(u&&u.length>0))return(0,a.RulePass)("pass");for(var d=new Array,c=new Array,m=new Array,p=0;p<u.length;p++){var h=u[p].nodeName.toLowerCase();if("img"!==h&&"svg"!==h){var g=l.AriaUtil.getRoles(u[p],!1);g&&g.length>0?(g.includes("code")&&m.push(g.filter(function(e){return"code"===e}).join(", ")),d.push(g.filter(function(e){return"code"!==e}).join(", "))):((g=l.AriaUtil.getImplicitRole(u[p])).includes("code")&&m.push(g.filter(function(e){return"code"===e}).join(", ")),g&&g.length>0&&c.push(g.filter(function(e){return"code"!==e}).join(", ")))}}if(d.length>0){for(var b=[],_=0;_<d.length;_++)(f=new Array).push(s.join(", ")),f.push(d[_]),b.push((0,a.RuleFail)("fail_child_explicit_role",f));return b}if(c.length>0){for(b=[],_=0;_<c.length;_++)(f=new Array).push(s.join(", ")),f.push(c[_]),b.push((0,a.RulePotential)("potential_child_implicit_role",f));return b}if(m.length>0){for(b=[],_=0;_<m.length;_++){var f;(f=new Array).push(s.join(", ")),f.push(m[_]),b.push((0,a.RulePotential)("recommendation_no_impact_role",f))}return b}}}}},8115(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_document_label_unique=void 0;var a=i(461),n=i(461),l=i(7011),r=i(3946);t.aria_document_label_unique={id:"aria_document_label_unique",context:"aria:document",refactor:{Rpt_Aria_MultipleDocumentRoles:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_document_label_unique.html",fail_label_not_unique:"aria_document_label_unique.html",group:"aria_document_label_unique.html"}},messages:{"en-US":{pass:'The element with "document" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "document" roles do not have unique labels',group:'Each element with "document" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var o=l.AriaUtil.isLandmarkNameUnique(n,"document",!0);return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},5733(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_eventhandler_role_valid=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139);t.aria_eventhandler_role_valid={id:"aria_eventhandler_role_valid",context:"dom:*[onclick],dom:*[onblur], dom:*[ondblclick], dom:*[onfocus], dom:*[onkeydown],dom:*[onkeypress], dom:*[onkeyup], dom:*[onmousedown], dom:*[onmouseup], dom:*[onmousemove], dom:*[onmouseout], dom:*[onmouseover], dom:*[onresize], dom:*[onchange]",refactor:{Rpt_Aria_EventHandlerMissingRole_Native_Host_Sematics:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_eventhandler_role_valid.html",Fail_1:"aria_eventhandler_role_valid.html",group:"aria_eventhandler_role_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The <{0}> element with '{1}' does not have a valid ARIA role specified",group:"Elements with event handlers must have a valid ARIA role"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.CommonUtil.getAncestor(n,"svg"))return null;if(l.AriaUtil.hasAnyRole(n,!0))return(0,a.RulePass)("Pass_0");if(r.CommonUtil.isfocusableByDefault(n))return(0,a.RulePass)("Pass_0");var o=new Array;o.push(n.nodeName.toLowerCase());for(var s=new Array,u=["onblur","onfocus","onchange","onclick","ondblclick","onkeydown","onkeypress","onkeyup","onmousedown","onmouseup","onmousemove","onmouseout","onmouseover","onresize"],d=0;d<u.length;++d)n.hasAttribute(u[d])&&s.push(u[d]);var c=new Array;return c.push(s.join(", ")),(0,a.RuleFail)("Fail_1",[o.toString(),c.toString()])}}},5782(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_form_label_unique=void 0;var a=i(461),n=i(461),l=i(7011),r=i(3946);t.aria_form_label_unique={id:"aria_form_label_unique",context:"aria:form",refactor:{Rpt_Aria_MultipleFormLandmarks_Implicit:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_form_label_unique.html",fail_label_not_unique:"aria_form_label_unique.html",group:"aria_form_label_unique.html"}},messages:{"en-US":{pass:'The element with "form" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "form" role do not have unique labels',group:'Each element with "form" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var o=l.AriaUtil.isLandmarkNameUnique(n,"form",!0);return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},6731(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_graphic_labelled=void 0;var a=i(461),n=i(7011),l=i(7139),r=i(3946);t.aria_graphic_labelled={id:"aria_graphic_labelled",context:"aria:graphics-document,aria:graphics-symbol",refactor:{HAAC_Aria_SvgAlt:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{group:"aria_graphic_labelled.html",Pass_0:"aria_graphic_labelled.html",Fail_1:"aria_graphic_labelled.html",Fail_2:"aria_graphic_labelled.html",Fail_3:"aria_graphic_labelled.html"}},messages:{"en-US":{group:"An element with a graphics role must have a non-empty label",Pass_0:"Rule Passed",Fail_1:'Element with "{0}" graphics role has no label',Fail_2:'Element with "{0}" graphics role has no label or an empty label',Fail_3:"Element with \"{0}\" graphics role missing non-empty 'aria-label' or 'aria-labelledby'"}},rulesets:[],act:[{"7d6734":{Pass_0:"pass",Fail_1:"inapplicable",Fail_2:"fail",Fail_3:"inapplicable"}}],run:function(e,t,i){var o=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(o))return null;if(!o.hasAttribute("role")||!o.getAttribute("role").includes("graphics-"))return null;var s=n.AriaUtil.getAriaLabel(o).length>0;if(!s&&"svg"===o.nodeName.toLowerCase()){var u=o.querySelector("title");s=u&&l.CommonUtil.hasInnerContent(u)}return s||(s=l.CommonUtil.attributeNonEmpty(o,"title")),s?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_2",[o.getAttribute("role")])}}},390(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_hidden_nontabbable=void 0;var a=i(7139),n=i(461),l=i(461);t.aria_hidden_nontabbable={id:"aria_hidden_nontabbable",context:"dom:*[aria-hidden=true], dom:*[aria-hidden=true] dom:*",refactor:{aria_hidden_focus_misuse:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"aria_hidden_nontabbable.html",Pass_0:"aria_hidden_nontabbable.html",Fail_1:"aria_hidden_nontabbable.html"}},messages:{"en-US":{group:"A hidden element should not contain any tabbable elements",Pass_0:"Rule Passed",Fail_1:"Element \"{0}\" should not be focusable within the subtree of an element with an 'aria-hidden' attribute with value 'true'"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:["1.3.1","4.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_TWO}],act:"6cfa84",run:function(e,t,i){var l=e.dom.node,r=l.nodeName.toLowerCase();return a.CommonUtil.isTabbable(l)?(0,n.RuleFail)("Fail_1",[r]):(0,n.RulePass)("Pass_0")}}},3900(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_id_unique=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(5279),s=i(9910),u=i(3946);t.aria_id_unique={id:"aria_id_unique",context:"dom:*",refactor:{Rpt_Aria_ValidIdRef:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_id_unique.html",Fail_1:"aria_id_unique.html",group:"aria_id_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The 'id' \"{0}\" specified for the ARIA property '{1}' value is not valid",group:"The ARIA property must reference a non-empty unique id of an existing element that is visible"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:["59796f","6a7281"],run:function(e,t,i){var n=e.dom.node,d=!0,c=new Array,m=(new Array,o.FragmentUtil.getOwnerFragment(n)),p=n.attributes,h=new Array,g=0;if(p)for(var b=0,_=p.length;b<_;b++){d=!0;var f=p[b].name;if(l.AriaUtil.isDefinedAriaAttribute(n,f)){var v=s.ARIADefinitions.propertyDataTypes[f];if(v&&v.type){var A="http://www.w3.org/2001/XMLSchema#idref"==v.type;if(A||"http://www.w3.org/2001/XMLSchema#idrefs"==v.type){g++;var w=r.CommonUtil.normalizeSpacing(p[b].nodeValue).length,y=p[b].nodeValue.split(" ");if(w<1)d=!1,h.push('"'+p[b].nodeValue+'"');else if(A&&w>=1&&y.length>1){d=!1;for(var C=0,k=y.length;C<k;++C)""!=y[C]&&h.push(y[C])}if(d&&w>=1)for(var R=0,x=y.length;R<x;++R)if(y[R].length>0){var P=m.getElementById(y[R]);if((d=null!=P)&&!v.hiddenIDRefSupported&&(d=u.VisUtil.isNodeVisible(P)),d)break;""!=y[R]&&h.push(y[R])}}}d||c.push(f)}}var T=0==c.length,U=new Array,I=new Array,E=new Array;return T||(I.push(c.join(", ")),E.push(n.nodeName.toLowerCase()),h.length>0&&U.push(h.join(", "))),0==g?null:T?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[U.toString(),I.toString(),E.toString()])}}},1218(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_img_labelled=void 0;var a=i(461),n=i(7011),l=i(7139),r=i(3946);t.aria_img_labelled={id:"aria_img_labelled",context:"aria:img, aria:image",refactor:{HAAC_Aria_ImgAlt:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{group:"aria_img_labelled.html",Pass_0:"aria_img_labelled.html",Fail_1:"aria_img_labelled.html",Fail_2:"aria_img_labelled.html",Fail_3:"aria_img_labelled.html"}},messages:{"en-US":{group:'An element with "img" role must have a non-empty label',Pass_0:"Rule Passed",Fail_1:'Element with "img" role has no label',Fail_2:'Element with "img" role has no label or an empty label',Fail_3:"Element with \"img\" role missing non-empty 'aria-label' or 'aria-labelledby'"}},rulesets:[],act:["23a2a8",{"7d6734":{Pass_0:"pass",Fail_1:"inapplicable",Fail_2:"fail",Fail_3:"inapplicable"}}],run:function(e,t,i){var o=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(o))return null;if(!o.hasAttribute("role"))return null;var s=o.nodeName.toLocaleLowerCase();if("svg"!==s&&"img"!==s){var u=n.AriaUtil.getAriaLabel(o).length>0;if(!u&&"svg"===o.nodeName.toLowerCase()){var d=o.querySelector("title");u=d&&l.CommonUtil.hasInnerContent(d)}return u||(u=l.CommonUtil.attributeNonEmpty(o,"title")),u?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_2")}}}},6734(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_keyboard_handler_exists=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(9910),s=i(3946);t.aria_keyboard_handler_exists={id:"aria_keyboard_handler_exists",context:"dom:*[role]",dependencies:["aria_role_allowed"],refactor:{Rpt_Aria_MissingKeyboardHandler:{pass:"pass",potential_no_keyboard_access:"potential_no_keyboard_access"}},help:{"en-US":{pass:"aria_keyboard_handler_exists.html",potential_no_keyboard_access:"aria_keyboard_handler_exists.html",group:"aria_keyboard_handler_exists.html"}},messages:{"en-US":{pass:"Rule Passed",potential_no_keyboard_access:'Verify the <{0}> element with "{1}" role has keyboard access',group:"Interactive WAI_ARIA UI components must provide keyboard access"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(!s.VisUtil.isNodeHiddenFromAT(n)&&!r.CommonUtil.isNodeDisabled(n)){var u=!0,d=u,c=n.ownerDocument,m=o.ARIADefinitions.designPatterns,p=l.AriaUtil.getRoles(n,!1);if("datalist"===n.nodeName.toLowerCase()&&p&&p.includes("listbox"))return null;for(var h=["combobox","grid","listbox","menu","menubar","radiogroup","tablist","tree","treegrid"],g=0,b=h;g<b.length;g++){var _=b[g];if(null!=l.AriaUtil.getAncestorWithRole(n,_,!0))return null}for(var f=r.CommonUtil.hasAttribute,v=new Array,A=0;A<p.length;++A){if(m[p[A]],h.indexOf(p[A])>=0&&!(f(n,"aria-disabled")&&n.getAttribute("aria-disabled")||(u=n.hasAttribute("onkeydown")||n.hasAttribute("onkeypress")||n.hasAttribute("onkeyup"))))if(f(n,"aria-activedescendant"))u=!0;else{var w,y=o.ARIADefinitions.designPatterns[p[A]].reqChildren;if(y)for(var C=0,k=y.length;C<k;C++)for(var R="*[contains(@role,'"+y[C]+"')]",x=c.evaluate(R,n,r.CommonUtil.defaultNSResolver,0,null),P=x.iterateNext();P;){if(!(u=P.hasAttribute("onkeydown")||P.hasAttribute("onkeypress")))for(var T="descendant::*",U=(w=c.evaluate(T,P,r.CommonUtil.defaultNSResolver,0,null)).iterateNext();U&&!u;)r.CommonUtil.shouldNodeBeSkippedHidden(U)||(u=r.CommonUtil.isTabbable(U)&&(U.hasAttribute("onkeydown")||U.hasAttribute("onkeypress")))||"a"==U.nodeName.toLowerCase()&&U.hasAttribute("href")&&(u=(I=U.getAttribute("href")).startsWith("javascript:")&&-1==I.indexOf("void")&&I.length>11),U=w.iterateNext();if(!u)break;P=x.iterateNext()}else for(T="descendant::*",U=(w=c.evaluate(T,n,r.CommonUtil.defaultNSResolver,0,null)).iterateNext();U&&!u;)if(r.CommonUtil.shouldNodeBeSkippedHidden(U))U=w.iterateNext();else{var I;(u=r.CommonUtil.isTabbable(U)&&(U.hasAttribute("onkeydown")||U.hasAttribute("onkeypress")))||"a"==U.nodeName.toLowerCase()&&U.hasAttribute("href")&&(u=(I=U.getAttribute("href")).startsWith("javascript:")&&-1==I.indexOf("void")&&I.length>11),U=w.iterateNext()}}u||v.push(p[A]),!u&&d&&(d=u)}var E=new Array;E.push(n.nodeName.toLowerCase());var N=new Array;N.push(v.join(", "));var L=n.getAttribute("id");return L&&L.trim().length>0&&n.ownerDocument.querySelector("*[aria-controls='".concat(L,"'][role='combobox']"))?null:d?(0,a.RulePass)("pass"):(0,a.RulePotential)("potential_no_keyboard_access",[E.toString(),N.toString()])}}}},9973(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_landmark_name_unique=void 0;var a=i(461),n=i(461),l=i(9955),r=i(1686),o=i(5279),s=i(4566),u=i(1950),d=i(3946),c=i(7139),m=i(7011);t.aria_landmark_name_unique={id:"aria_landmark_name_unique",context:"aria:complementary, aria:banner, aria:contentinfo, aria:main, aria:navigation, aria:region, aria:search, aria:form",refactor:{landmark_name_unique:{Pass_0:"pass",Fail_0:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_landmark_name_unique.html",fail_label_not_unique:"aria_landmark_name_unique.html",group:"aria_landmark_name_unique.html"}},messages:{"en-US":{pass:"Multiple elements with \"{0}\" landmarks within the same parent region are distinguished by unique 'aria-label' or 'aria-labelledby'",fail_label_not_unique:'Multiple elements with "{0}" landmarks within the same parent region are not distinguished from one another because they have the same "{1}" label',group:"Each landmark should have a unique 'aria-labelledby' or 'aria-label' or be nested in a different parent region"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE},{id:["WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(d.VisUtil.isNodeHiddenFromAT(n))return null;if(null!==c.CommonUtil.getAncestor(n,["DIALOG"])||null!==m.AriaUtil.getAncestorWithRole(n,"dialog",!0))return null;var p=o.FragmentUtil.getOwnerFragment(n),h=s.CacheUtil.getCache(n.ownerDocument,"aria_landmark_name_unique",null);if(!h){h={navigationNodes:[],navigationNodesComputedLabels:[],navigationNodesParents:[],navigationNodesMatchFound:[]};for(var g=p.querySelectorAll('aside,[role="complementary"], footer,[role="contentinfo"], header,[role="banner"], main,[role="main"], nav,[role="navigation"], form,[role="form"], section,[role="region"],[role="search"]'),b=Array.from(g),_=[],f=[],v=[],A=0;A<b.length;A++)d.VisUtil.isNodeHiddenFromAT(b[A])||null!==c.CommonUtil.getAncestor(b[A],["DIALOG"])||null!==m.AriaUtil.getAncestorWithRole(b[A],"dialog",!0)||v.push(b[A]);for(b=v,A=0;A<b.length;A++){for(var w=[],y=b[A].parentElement;y;)w.push(y),y=y.parentElement;for(var C=0;C<w.length;C++){var k=["ASIDE","FOOTER","FORM","HEADER","MAIN","NAV","SECTION"].includes(w[C].tagName),R=!1;if(w[C].hasAttribute("role")&&(R=["complementary","contentinfo","form","banner","main","navigation","region","search"].includes(w[C].getAttribute("role"))),k||R){_.push(w[C]);break}if(C===w.length-1){_.push(null);break}}}var x=[];for(A=0;A<b.length;A++){var P=u.AccNameUtil.computeAccessibleName(b[A]);x.push(P&&P.name&&P.name.trim().length>0?P.name.trim():"")}for(A=0;A<_.length;A++){var T=!1,U=!1;for(C=0;C<_.length;C++)if(C!==A){if(null===_[A]&&null===_[C]){if(l.ARIAMapper.nodeToRole(b[A])===l.ARIAMapper.nodeToRole(b[C])){if(x[A]===x[C]){f.push("fail_label_not_unique"),T=!0;break}U=!0}}else if(null===_[A]||null===_[C])continue;if(r.DOMUtil.sameNode(_[A],_[C])&&l.ARIAMapper.nodeToRole(b[A])===l.ARIAMapper.nodeToRole(b[C])){if(x[A]===x[C]){f.push("fail_label_not_unique"),T=!0;break}U=!0}}T||(U?f.push("pass"):f.push("null"))}h.navigationNodesComputedLabels=x,h.navigationNodes=b,h.navigationNodesParents=_,h.navigationNodesMatchFound=f,s.CacheUtil.setCache(n.ownerDocument,"aria_landmark_name_unique",h)}var I=-1;for(A=0;A<h.navigationNodes.length;A++)n.isSameNode(h.navigationNodes[A])&&(I=A);return-1===I?null:"pass"===h.navigationNodesMatchFound[I]?(0,a.RulePass)("pass",[l.ARIAMapper.nodeToRole(h.navigationNodes[I])]):"fail_label_not_unique"===h.navigationNodesMatchFound[I]?(0,a.RuleFail)("fail_label_not_unique",[l.ARIAMapper.nodeToRole(h.navigationNodes[I]),h.navigationNodesComputedLabels[I]]):null}}},5711(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_main_label_unique=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(3946);t.aria_main_label_unique={id:"aria_main_label_unique",context:"aria:main",refactor:{Rpt_Aria_MultipleMainsRequireLabel_Implicit_2:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_main_label_unique.html",Fail_1:"aria_main_label_unique.html",group:"aria_main_label_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "main" role do not have unique labels',group:'Each element with "main" role must have unique label that describes its purposes'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(o.VisUtil.isNodeHiddenFromAT(n))return null;for(var s=l.AriaUtil.getAriaLabel(n),u=l.AriaUtil.getAncestorWithRole(n,"document",!0),d=r.CommonUtil.getElementsByRoleHidden(n.ownerDocument,"main",!0,!0),c=null,m=0;m<d.length;++m)if(d[m]!==n&&(c=(0,a.RulePass)("Pass_0"),l.AriaUtil.getAncestorWithRole(d[m],"document",!0)===u&&l.AriaUtil.getAriaLabel(d[m])===s)){c=(0,a.RuleFail)("Fail_1");break}return c}}},3384(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_main_label_visible=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(3946);t.aria_main_label_visible={id:"aria_main_label_visible",context:"dom:body",refactor:{Rpt_Aria_MultipleMainsVisibleLabel_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_main_label_visible.html",Fail_1:"aria_main_label_visible.html",group:"aria_main_label_visible.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "main" role do not have unique visible labels',group:'Each element with "main" role should have a unique visible label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(o.VisUtil.isNodeHiddenFromAT(n))return null;var s=r.CommonUtil.getElementsByRoleHidden(n.ownerDocument,"main",!0,!0);return 0===s.length||1===s.length?null:l.AriaUtil.hasUniqueAriaLabelledby(s)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},2762(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_navigation_label_unique=void 0;var a=i(461),n=i(461),l=i(7011),r=i(3946);t.aria_navigation_label_unique={id:"aria_navigation_label_unique",context:"aria:navigation",refactor:{Rpt_Aria_MultipleNavigationLandmarks_Implicit:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_navigation_label_unique.html",fail_label_not_unique:"aria_navigation_label_unique.html",group:"aria_navigation_label_unique.html"}},messages:{"en-US":{pass:'The element with "navigation" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "navigation" role do not have unique labels',group:'Each element with "navigation" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var o=l.AriaUtil.isLandmarkNameUnique(n,"navigation",!0);return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},5757(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_parent_required=void 0;var a=i(461),n=i(461),l=i(9910),r=i(7011),o=i(7139),s=i(3946);t.aria_parent_required={id:"aria_parent_required",context:"dom:*[role]",dependencies:["aria_role_allowed"],refactor:{Rpt_Aria_RequiredParent_Native_Host_Sematics:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"aria_parent_required.html",Pass_0:"aria_parent_required.html",Fail_1:"aria_parent_required.html"}},messages:{"en-US":{group:"Each element with an implicit or explicit role must be contained within a valid element",Pass_0:"Rule Passed",Fail_1:'Element with "{0}" role is not contained in or owned by an element with one of the following roles: "{1}"'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:"ff89c9",run:function(e,t,i){var n=e.dom.node;if(!(s.VisUtil.isNodeHiddenFromAT(n)||o.CommonUtil.isNodeDisabled(n)||r.AriaUtil.shouldBePresentationalChild(n)||s.VisUtil.isNodePresentational(n))){for(var u=!0,d=l.ARIADefinitions.designPatterns,c=new Array,m=new Array,p=0,h=i.aria.map(function(e){return e.role}),g=h[h.length-2],b=2;"none"===g;)b++,g=h[h.length-b];var _=r.AriaUtil.getResolvedRole(n);if(d[_]&&null!=d[_].container){p++,u=!1;for(var f=0,v=(m=d[_].container).length;!u&&f<v&&!(u=g===m[f]);f++);0==u&&c.push(_)}var A=new Array;A.push(c.join(", "));var w=new Array;return w.push(m.join(", ")),0==p?null:u?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[A.toString(),w.toString()])}}}},5232(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_region_label_unique=void 0;var a=i(461),n=i(461),l=i(7011),r=i(3946);t.aria_region_label_unique={id:"aria_region_label_unique",context:"aria:region",refactor:{Rpt_Aria_MultipleRegionsUniqueLabel_Implicit:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_region_label_unique.html",fail_label_not_unique:"aria_region_label_unique.html",group:"aria_region_label_unique.html"}},messages:{"en-US":{pass:'The element with "region" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "region" role do not have unique labels',group:'Each element with "region" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var o=l.AriaUtil.isLandmarkNameUnique(n,"region");return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},1891(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_region_labelled=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(3946);t.aria_region_labelled={id:"aria_region_labelled",context:"aria:region",refactor:{Rpt_Aria_RegionLabel_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_region_labelled.html",Fail_1:"aria_region_labelled.html",group:"aria_region_labelled.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Element with "region" role does not have a label',group:'Each element with "region" role must have a label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;return o.VisUtil.isNodeHiddenFromAT(n)?null:l.AriaUtil.hasAriaLabel(n)||r.CommonUtil.attributeNonEmpty(n,"title")?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},6142(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_role_allowed=void 0;var a=i(461),n=i(461),l=i(7011);t.aria_role_allowed={id:"aria_role_allowed",context:"dom:*[role]",refactor:{Rpt_Aria_ValidRole:{Pass_0:"Pass_0",Fail_2:"Fail_2",Potential_1:"Potential_1"}},help:{"en-US":{group:"aria_role_allowed.html",Pass_0:"aria_role_allowed.html",Fail_2:"aria_role_allowed.html",Potential_1:"aria_role_allowed.html"}},messages:{"en-US":{group:"Elements must have a valid 'role' per ARIA specification",Pass_0:"Rule Passed",Fail_2:"The role '{0}' defined on the element is not valid per ARIA specification",Potential_1:"Some of the roles, '{0}', defined on the element are not valid per ARIA specification"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"4.1.2",level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:"674b10",run:function(e,t,i){var n=e.dom.node,r=n.getAttribute("role").trim().toLowerCase();if(0===r.length)return null;if(n.hasAttribute("aria-hidden")&&"true"===n.getAttribute("aria-hidden").toLowerCase())return null;var o=l.AriaUtil.getRolesUndefinedByAria(n);if(!o||0===o.length)return(0,a.RulePass)("Pass_0");var s=r.split(/\s+/);return o.length===s.length?(0,a.RuleFail)("Fail_2",[o.join(",")]):o.length>0?(0,a.RulePotential)("Potential_1",[o.join(",")]):void 0}}},4863(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_role_redundant=void 0;var a=i(461),n=i(461),l=i(7011);t.aria_role_redundant={id:"aria_role_redundant",context:"dom:*[role]",help:{"en-US":{pass:"aria_role_redundant.html",fail_redundant:"aria_role_redundant.html",group:"aria_role_redundant.html"}},messages:{"en-US":{pass:"An explicitly-assigned ARIA role is not redundant with the implicit role of the element",fail_redundant:'The explicitly-assigned ARIA role "{0}" is redundant with the implicit role of the element <{1}>',group:"An explicitly-assigned ARIA role should not be redundant with the implicit role of the element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["ARIA"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,r=n.tagName.toLowerCase(),o=l.AriaUtil.getRoles(n,!1);if(o&&0!==o.length){if(!l.AriaUtil.areRolesDefined(o))return null;var s=l.AriaUtil.getImplicitRole(n);if(!s||0===s.length)return(0,a.RulePass)("pass");for(var u=[],d=0;d<o.length;d++)s.includes(o[d])?u.push((0,a.RuleFail)("fail_redundant",[o[d],r])):u.push((0,a.RulePass)("pass"));return u.length>0?u:null}}}},1440(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_search_label_unique=void 0;var a=i(461),n=i(461),l=i(7011),r=i(3946);t.aria_search_label_unique={id:"aria_search_label_unique",context:"aria:search",refactor:{Rpt_Aria_MultipleSearchLandmarks:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_search_label_unique.html",fail_label_not_unique:"aria_search_label_unique.html",group:"aria_search_label_unique.html"}},messages:{"en-US":{pass:'The element with "search" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "search" role do not have unique labels',group:'Each element with "search" role must have a unique label that describes its purpose'}},rulesets:[{id:[],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var o=l.AriaUtil.isLandmarkNameUnique(n,"search",!0);return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},1968(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_valid=t.aria_role_valid=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139);t.aria_role_valid={id:"aria_role_valid",context:"dom:*",dependencies:["aria_attribute_allowed"],refactor:{aria_semantics_role:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_0:"aria_role_valid.html",Fail_1:"aria_role_valid.html",Fail_2:"aria_role_valid.html",group:"aria_role_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The ARIA role '{0}' is not valid for the element <{1}>",Fail_2:"The ARIA role '{0}' is not valid for the element <{1}> and may be ignored by the browser since the element is focusable",group:"ARIA roles must be valid for the element to which they are assigned"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,o=n.tagName.toLowerCase();if(1!==n.nodeType)return null;var s=l.AriaUtil.getRolesUndefinedByAria(n);if(s&&s.length>0)return null;var u=l.AriaUtil.getDeprecatedAriaRoles(n);if(u&&u.length>0)return null;var d=l.AriaUtil.getDeprecatedAriaAttributes(n);if(d&&d.length>0)return null;if(["td","th","tr"].includes(o)){var c=r.CommonUtil.isTableDescendant(i);if(null!==c&&c.length>0)return null}var m=l.AriaUtil.getUserDefinedRoles(n);if(!m||0===m.length)return null;if(m.includes("generic"))return(0,a.RuleFail)("Fail_1",["generic",o]);var p=l.AriaUtil.getInvalidRoles(n);return null===p||0===p.length?(0,a.RulePass)("Pass_0",[m.join(", "),o]):p.includes("presentation")||p.includes("none")&&r.CommonUtil.isTabbable(n)?(0,a.RuleFail)("Fail_2",[p.join(", "),o]):p.length>0?(0,a.RuleFail)("Fail_1",[p.join(", "),o]):m.length>0?(0,a.RulePass)("Pass_0",[m.join(", "),o]):null}},t.aria_attribute_valid={id:"aria_attribute_valid",context:"dom:*",dependencies:["aria_attribute_deprecated","aria_role_valid"],refactor:{aria_attribute_allowed:{Pass:"Pass",Fail_invalid_role_attr:"Fail_invalid_role_attr",Fail_invalid_implicit_role_attr:"Fail_invalid_implicit_role_attr"}},help:{"en-US":{group:"aria_attribute_valid.html",Pass:"aria_attribute_valid.html",Fail_invalid_role_attr:"aria_attribute_valid.html",Fail_invalid_implicit_role_attr:"aria_attribute_valid.html"}},messages:{"en-US":{group:"ARIA attributes should be valid for the element and ARIA role to which they are assigned",Pass:"ARIA attributes are valid for the element and ARIA role",Fail_invalid_role_attr:'The ARIA attributes "{0}" are not valid for the element <{1}> with ARIA role "{2}"',Fail_invalid_implicit_role_attr:'The ARIA attributes "{0}" are not valid for the element <{1}> with implicit ARIA role "{2}"'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["ARIA"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:["5c01ea",{"46ca7f":{Pass:"pass",Fail_invalid_role_attr:"fail",Fail_invalid_implicit_role_attr:"fail"}}],run:function(e,t,i){var n=e.dom.node;if(1!==n.nodeType)return null;var r=l.AriaUtil.getUserDefinedAriaAttributes(n);if(null===r||0===r.length)return null;var o=l.AriaUtil.getUserDefinedRoles(n),s=!0;if(o&&o.length>0){if(!l.AriaUtil.areRolesDefined(o))return null}else o=l.AriaUtil.getImplicitRole(n),s=!1;var u=n.tagName.toLowerCase(),d=l.AriaUtil.getInvalidAriaAttributes(n);return d&&0!==d.length?o.length>0?s?(0,a.RuleFail)("Fail_invalid_role_attr",[d.join(", "),u,o.join(", ")]):(0,a.RuleFail)("Fail_invalid_implicit_role_attr",[d.join(", "),u,o.join(", ")]):(0,a.RuleFail)("Fail_invalid_role_attr",[d.join(", "),u,"none"]):(0,a.RulePass)("Pass",[r.join(", "),u,o.join(", ")])}}},1617(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_toolbar_label_unique=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(4566);t.aria_toolbar_label_unique={id:"aria_toolbar_label_unique",context:"aria:toolbar",refactor:{Rpt_Aria_MultipleToolbarUniqueLabel:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_toolbar_label_unique.html",Fail_1:"aria_toolbar_label_unique.html",group:"aria_toolbar_label_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "toolbar" roles do not have unique labels',group:'Each element with "toolbar" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,s=r.CommonUtil.getElementsByRoleHidden(n.ownerDocument,"toolbar",!0,!0);if(0===s.length||1===s.length)return null;var u=o.CacheUtil.getCache(n.ownerDocument,"aria_toolbar_label_unique",null);u||(u=l.AriaUtil.findAriaLabelDupes(s),o.CacheUtil.setCache(n.ownerDocument,"aria_toolbar_label_unique",u));var d=l.AriaUtil.getAriaLabel(n);return""!==d&&(!(d in u)||u[d]<=1)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[d])}}},3475(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_widget_labelled=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(9955),s=i(5279),u=i(9910),d=i(1686);t.aria_widget_labelled={id:"aria_widget_labelled",context:"dom:*",refactor:{Rpt_Aria_WidgetLabels_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"aria_widget_labelled.html",Pass_0:"aria_widget_labelled.html",Fail_1:"aria_widget_labelled.html"}},messages:{"en-US":{group:"Interactive component must have a programmatically associated name",Pass_0:"Rule Passed",Fail_1:"Interactive component with ARIA role '{0}' does not have a programmatically associated name"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:"m6b1q3",run:function(e,t,i){var n=e.dom.node;if(n.hasAttribute("type")&&"hidden"===n.getAttribute("type")||l.AriaUtil.getAncestorWithRole(n,"combobox")&&!l.AriaUtil.hasRoleInSemantics(n,"textbox")&&!l.AriaUtil.hasRoleInSemantics(n,"searchbox"))return null;var c=o.ARIAMapper.nodeToRole(n),m=n.nodeName.toLowerCase();if(["button","checkbox","combobox","listbox","menuitemcheckbox","menuitemradio","radio","searchbox","slider","spinbutton","switch","textbox","progressbar","link"].includes(c))return null;if("output"===m||"input"===m&&n.getAttribute("type"),!n.hasAttribute("role")&&-1!=["input","textarea","select","button","datalist","optgroup","option","keygen","output","progress","meter"].indexOf(n.nodeName.toLowerCase()))return null;for(var p=["listbox","tree","grid","dialog"],h=0;h<p.length;h++)if(l.AriaUtil.hasRoleInSemantics(n,p[h]))for(var g=r.CommonUtil.getElementsByRoleHidden(n.ownerDocument,"combobox",!0,!0),b=0;b<g.length;b++){var _=g[b],f=r.CommonUtil.getElementAttribute(_,"aria-owns");if(f)for(var v=r.CommonUtil.normalizeSpacing(f.trim()).split(" "),A=0;A<v.length;A++)if(s.FragmentUtil.getById(n,v[A])===n)return null}for(var w=!0,y=u.ARIADefinitions.designPatterns,C=l.AriaUtil.getRoles(n,!0),k=0,R=["widget","liveRegion","window"],x=(A=0,C.length);w&&A<x;++A){var P=y[C[A]];P&&P.nameRequired&&P.roleType&&R.includes(P.roleType)&&(++k,!(w=l.AriaUtil.hasAriaLabel(n)||r.CommonUtil.attributeNonEmpty(n,"title")||r.CommonUtil.getLabelForElementHidden(n,!0))&&P.nameFrom&&P.nameFrom.indexOf("contents")>=0&&(w=r.CommonUtil.hasInnerContentOrAlt(n)),w||(w=r.CommonUtil.hasImplicitLabel(n)),w||"img"!==n.tagName.toLowerCase()||n.hasAttribute("role")||!n.hasAttribute("alt")||(w=d.DOMUtil.cleanWhitespace(n.getAttribute("alt")).trim().length>0),P.nameFrom.indexOf("prohibited"))}return 0===k?null:w?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[c])}}},3370(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.asciiart_alt_exists=void 0;var a=i(461),n=i(7139);t.asciiart_alt_exists={id:"asciiart_alt_exists",context:"dom:pre, dom:listing, dom:xmp, dom:plaintext",refactor:{RPT_Pre_ASCIIArt:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"asciiart_alt_exists.html",Potential_1:"asciiart_alt_exists.html",group:"asciiart_alt_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that ASCII art has a text alternative",group:"ASCII art must have a text alternative"}},rulesets:[],act:[],run:function(e,t,i){var l=e.dom.node;if("pre"==l.nodeName.toLowerCase()&&(l.previousSibling&&"code"==l.previousSibling.nodeName.toLowerCase()||l.getElementsByTagName("code").length>0||n.CommonUtil.getAncestor(l,"code")))return(0,a.RulePass)("Pass_0");for(var r=!0,o=n.CommonUtil.getInnerText(l),s=0,u=0,d="",c=0;r&&c<o.length;++c){var m=o.substr(c,1);/[\w!@#$%&\*().,?\[\]{}<>=":\/\\-]/.test(m)?d==m?u+=1:u=0:(/\s/.test(m)||(s+=1),u=0),d=m,(s>=5||u>=4)&&(r=!1)}return r?(0,a.RulePass)("Pass_0"):r?void 0:(0,a.RulePotential)("Potential_1")}}},9272(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.blink_css_review=void 0;var a=i(461),n=i(461),l=i(7139);t.blink_css_review={id:"blink_css_review",context:"dom:style, dom:*[style]",refactor:{RPT_Blink_CSSTrigger1:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{group:"blink_css_review.html",Pass_0:"blink_css_review.html",Potential_1:"blink_css_review.html"}},messages:{"en-US":{group:"Do not use the \"blink\" value of the 'text-decoration' property for longer than five seconds",Pass_0:"Rule Passed",Potential_1:"Check the \"blink\" value of the CSS 'text-decoration' property is not used for more than than five seconds"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"2.2.2",level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node,r=l.CommonUtil.getInnerText(n);n.hasAttribute("style")&&(r=n.getAttribute("style"));var o=-1==r.toLowerCase().indexOf("text-decoration:blink");return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},7735(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.blink_elem_deprecated=void 0;var a=i(461),n=i(461);t.blink_elem_deprecated={id:"blink_elem_deprecated",context:"dom:blink",refactor:{WCAG20_Blink_AlwaysTrigger:{Fail_1:"Fail_1"}},help:{"en-US":{group:"blink_elem_deprecated.html",Fail_1:"blink_elem_deprecated.html"}},messages:{"en-US":{group:"Content that blinks persistently must not be used",Fail_1:"Content found that blinks persistently"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"2.2.2",level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){return(0,a.RuleFail)("Fail_1")}}},3923(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.blockquote_cite_exists=void 0;var a=i(461),n=i(461),l=i(7139);t.blockquote_cite_exists={id:"blockquote_cite_exists",context:"dom:blockquote",refactor:{RPT_Blockquote_HasCite:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"blockquote_cite_exists.html",Potential_1:"blockquote_cite_exists.html",group:"blockquote_cite_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that <blockquote> should have a 'cite' attribute and not be used for indentation only",group:"Use <blockquote> only for quotations, not indentation"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,r=l.CommonUtil.attributeNonEmpty(n,"cite");if(!r){var o=l.CommonUtil.getDocElementsByTag(n,"cite");r=null!=o&&o.length>0}return r?(0,a.RulePass)("Pass_0"):r?void 0:(0,a.RulePotential)("Potential_1")}}},7521(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.canvas_content_described=void 0;var a=i(461),n=i(461),l=i(3946);t.canvas_content_described={id:"canvas_content_described",context:"dom:canvas",refactor:{HAAC_Canvas:{Pass_0:"Pass_0",Manual_1:"Manual_1"}},help:{"en-US":{Pass_0:"canvas_content_described.html",Manual_1:"canvas_content_described.html",group:"canvas_content_described.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Manual_1:"Verify accessibility of the <canvas> element",group:"The <canvas> element may not be accessible"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1","2.1.1","4.1.2"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var r=n.innerHTML.trim().length>0;return r?(0,a.RulePass)("Pass_0"):r?void 0:(0,a.RuleManual)("Manual_1")}}},1852(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.caption_track_exists=void 0;var a=i(461),n=i(461);t.caption_track_exists={id:"caption_track_exists",context:"dom:video",refactor:{HAAC_Video_HasNoTrack:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"caption_track_exists.html",Potential_1:"caption_track_exists.html",group:"caption_track_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that captions are available for any meaningful audio or provide a caption track for the <video> element",group:"A <video> element must have a text alternative for any meaningful audio content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.2.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,l=!1;if("true"===n.getAttribute("aria-hidden"))return null;for(var r=n.getElementsByTagName("track"),o=0;o<r.length;++o)l=l||"captions"===r[o].getAttribute("kind");if(n.textTracks&&n.textTracks.length>0)for(o=0;o<n.textTracks.length;o++)l=l||"captions"===n.textTracks[o].kind;return l?(0,a.RulePass)("Pass_0"):(0,a.RulePotential)("Potential_1")}}},799(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.combobox_active_descendant=void 0;var a=i(461),n=i(461),l=i(7011),r=i(5279),o=i(3864),s=i(4566),u=i(3946);t.combobox_active_descendant={id:"combobox_active_descendant",context:"aria:combobox",dependencies:["combobox_popup_reference"],help:{"en-US":{Pass:"combobox_active_descendant.html",Fail_missing:"combobox_active_descendant.html",Fail_not_in_popup:"combobox_active_descendant.html",Fail_active_role_invalid:"combobox_active_descendant.html",Fail_active_not_selected:"combobox_active_descendant.html",group:"combobox_active_descendant.html"}},messages:{"en-US":{Pass:"'aria-activedescendant' is used appropriately for this combobox",Fail_missing:"The element referenced by 'aria-activedescendant' \"{0}\" does not exist",Fail_not_in_popup:"The element referenced by 'aria-activedescendant' \"{0}\" does not exist within the popup referenced by 'id' \"{1}\"",Fail_active_role_invalid:"The 'aria-activedescendant' \"{0}\" references an element with the roles \"{1}\", which does not have a valid ARIA role of 'option', 'gridcell', 'row', or 'treeitem'",Fail_active_not_selected:"The 'aria-activedescendant' \"{0}\" references an element that does not have 'aria-selected' set to true",group:"'aria-activedescendant' must be used to define focus within the combobox popup, except when using a dialog popup"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,d=s.CacheUtil.getCache(n.ownerDocument,"combobox",{});if(!d)return null;var c=d[e.dom.rolePath];if(!c)return null;var m=c.popupElement,p=c.popupId;if(!m)return null;var h=n.getAttribute("aria-activedescendant");if(!h||0===h.trim().length)return null;var g=r.FragmentUtil.getById(n,h);if(!g)return(0,a.RuleFail)("Fail_missing",[h]);var b=!1;if(m)for(var _=new o.DOMWalker(m);!b&&_.nextNode()&&_.node!=m&&_.node!=m.nextSibling;)1===_.node.nodeType&&u.VisUtil.isNodeVisible(_.node)&&(b=_.elem().getAttribute("id")===h);var f=[];b||f.push((0,a.RulePass)("Fail_not_in_popup",[h,p]));var v=l.AriaUtil.getRoles(g,!0);return 0===["option","gridcell","row","treeitem"].filter(function(e){return v.includes(e)}).length&&f.push((0,a.RuleFail)("Fail_active_role_invalid",[h,v.join(",")])),"true"!==g.getAttribute("aria-selected")&&f.push((0,a.RuleFail)("Fail_active_not_selected",[h])),0===f.length?(0,a.RulePass)("Pass"):f}}},4614(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.combobox_autocomplete_valid=void 0;var a=i(461),n=i(461),l=i(3864),r=i(4566),o=i(3946);t.combobox_autocomplete_valid={id:"combobox_autocomplete_valid",context:"aria:combobox",dependencies:["combobox_popup_reference"],refactor:{combobox_autocomplete:{Pass:"Pass",Fail_1:"Fail_1",Fail_inline:"Fail_inline"}},help:{"en-US":{Pass:"combobox_autocomplete_valid.html",Fail_1:"combobox_autocomplete_valid.html",Fail_inline:"combobox_autocomplete_valid.html",group:"combobox_autocomplete_valid.html"}},messages:{"en-US":{Pass:"The combobox does not use 'aria-autocomplete' value '\"inline\"' nor does it have 'aria-autocomplete' defined within the popup",Fail_1:"The combobox has the 'aria-autocomplete' attribute incorrectly set on an element within the popup referenced by \"{0}\"",Fail_inline:"The combobox does not support an 'aria-autocomplete' attribute value set to '\"inline\"' ",group:"A combobox that supports autocompletion behavior must have the 'aria-autocomplete' attribute only on its text input element with a valid value; a value of '\"inline\"' is not supported"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,s=r.CacheUtil.getCache(n.ownerDocument,"combobox",{});if(!s)return null;var u=s[e.dom.rolePath];if(!u)return null;var d=u.popupId,c=u.popupElement,m=[];"inline"===n.getAttribute("aria-autocomplete")&&m.push((0,a.RuleFail)("Fail_inline"));var p=!0;if(c&&o.VisUtil.isNodeVisible(c)&&(p=!c.hasAttribute("aria-autocomplete"))&&c.children&&c.children.length>0)for(var h=new l.DOMWalker(c);p&&h.nextNode()&&(1!==h.node.nodeType||!o.VisUtil.isNodeVisible(h.node)||(p=!h.elem().hasAttribute("aria-autocomplete"),!h.bEndTag||h.node!==c.lastElementChild)););return p||m.push((0,a.RuleFail)("Fail_1",[d])),m.length>0?m:(0,a.RulePass)("Pass")}}},5952(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.combobox_design_valid=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(3946),s=i(4566);t.combobox_design_valid={id:"combobox_design_valid",context:"aria:combobox",refactor:{combobox_version:{"Pass_1.0":"Pass_1.0","Fail_1.1":"Fail_1.1","Pass_1.2":"Pass_1.2"}},help:{"en-US":{"Pass_1.0":"combobox_design_valid.html","Fail_1.1":"combobox_design_valid.html","Pass_1.2":"combobox_design_valid.html",group:"combobox_design_valid.html"}},messages:{"en-US":{"Pass_1.0":"The combobox design pattern is detected as ARIA 1.0, which is allowed by ARIA 1.2","Fail_1.1":"The combobox design pattern is detected as ARIA 1.1, which is not allowed by ARIA 1.2","Pass_1.2":"The combobox design pattern is detected as ARIA 1.2",group:"The combobox design pattern must be valid for ARIA 1.2"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(!o.VisUtil.isNodeVisible(n)||r.CommonUtil.isNodeDisabled(n))return null;var u,d="select"===(u=n).tagName.toLowerCase()&&"combobox"!==u.getAttribute("role")?"implicit":"input"!==u.nodeName.toLowerCase()||u.hasAttribute("type")&&"text"!==u.getAttribute("type")||!u.hasAttribute("aria-owns")||u.hasAttribute("aria-controls")?"input"!==u.nodeName.toLowerCase()&&u.hasAttribute("aria-owns")&&!u.hasAttribute("aria-controls")?"1.1":"1.2":"1.0";if("implicit"===d)return null;var c=n.tagName.toLowerCase(),m="true"===(l.AriaUtil.getAriaAttribute(n,"aria-expanded")||"").trim().toLowerCase(),p="input"===c&&(!n.hasAttribute("type")||"text"===n.getAttribute("type").toLowerCase()),h=e.dom.rolePath;if(!h)return null;var g=s.CacheUtil.getCache(n.ownerDocument,"combobox",{});return g?(g[h]={inputElement:p?n:null,pattern:d,expanded:m},s.CacheUtil.setCache(n.ownerDocument,"combobox",g),"1.0"===d?(0,a.RulePass)("Pass_1.0"):"1.1"===d?(0,a.RuleFail)("Fail_1.1"):"1.2"===d?(0,a.RulePass)("Pass_1.2"):void 0):null}}},5395(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.combobox_focusable_elements=void 0;var a=i(461),n=i(461),l=i(3864),r=i(7011),o=i(7139),s=i(4566),u=i(3946);t.combobox_focusable_elements={id:"combobox_focusable_elements",context:"aria:combobox",dependencies:["combobox_popup_reference"],help:{"en-US":{Pass:"combobox_focusable_elements.html",Fail_not_tabbable:"combobox_focusable_elements.html",Fail_tabbable_child:"combobox_focusable_elements.html",group:"combobox_focusable_elements.html"}},messages:{"en-US":{Pass:"DOM focus is allowed only on the combobox element as required",Fail_not_tabbable:"The combobox element does not allow DOM focus as required",Fail_tabbable_child:"The popup of the combobox has DOM focus or has 'aria-activedescendant' defined, which is not allowed",group:"Tabbable focus for the combobox must be allowed only on the text input, except when using a dialog popup"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,d=s.CacheUtil.getCache(n.ownerDocument,"combobox",{});if(!d)return null;var c=d[e.dom.rolePath];if(!c)return null;var m=c.popupElement,p=c.expanded;if(!m)return null;var h=r.AriaUtil.getRoles(m,!0)[0],g=[];if(o.CommonUtil.isTabbable(n)||g.push((0,a.RuleFail)("Fail_not_tabbable")),!1===p||"dialog"===h)return(0,a.RulePass)("Pass");var b=!0;if(m&&u.VisUtil.isNodeVisible(m)&&(b=!o.CommonUtil.isTabbable(m)&&!r.AriaUtil.getAriaAttribute(m,"aria-activedescendant"))&&m.children&&m.children.length>0)for(var _=new l.DOMWalker(m);b&&_.nextNode()&&(1!==_.node.nodeType||!u.VisUtil.isNodeVisible(_.node)||(b=!o.CommonUtil.isTabbable(_.node)&&!r.AriaUtil.getAriaAttribute(_.node,"aria-activedescendant"),!_.bEndTag||_.node!==m.lastElementChild)););return b||g.push((0,a.RuleFail)("Fail_tabbable_child")),0===g.length?(0,a.RulePass)("Pass"):g}}},1992(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.combobox_haspopup_valid=void 0;var a=i(461),n=i(461),l=i(7011),r=i(4566);t.combobox_haspopup_valid={id:"combobox_haspopup_valid",context:"aria:combobox",dependencies:["combobox_popup_reference"],refactor:{combobox_haspopup:{Pass:"Pass",Fail_popup_role_invalid:"Fail_popup_role_invalid",Fail_combobox_popup_role_mismatch:"Fail_combobox_popup_role_mismatch"}},help:{"en-US":{Pass:"combobox_haspopup_valid.html",Fail_popup_role_invalid:"combobox_haspopup_valid.html",Fail_combobox_popup_role_mismatch:"combobox_haspopup_valid.html",group:"combobox_haspopup_valid.html"}},messages:{"en-US":{Pass:"The 'aria-controls' (ARIA 1.2) or 'aria-owns' (ARIA 1.0) appropriately references a valid popup 'id' value",Fail_popup_role_invalid:'The \'role\' value "{0}" of the popup element "{1}" should be one of "listbox", "grid", "tree" or "dialog"',Fail_combobox_popup_role_mismatch:"The value of the combobox 'aria-haspopup' attribute \"{0}\" does not match the 'role' value of the popup element \"{1}\"",group:"The combobox attribute 'aria-haspopup' value must be appropriate for the role of the element referenced by 'aria-controls' (ARIA 1.2) or 'aria-owns' (ARIA 1.0)"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,o=r.CacheUtil.getCache(n.ownerDocument,"combobox",{});if(!o)return null;var s=o[e.dom.rolePath];if(!s)return null;var u=s.popupElement,d=s.popupId;if(!u)return null;var c=l.AriaUtil.getRoles(u,!0),m=["listbox","grid","tree","dialog"].filter(function(e){return c.includes(e)});if(0===m.length)return(0,a.RuleFail)("Fail_popup_role_invalid",[c.join(","),d]);var p=m[0],h=n.getAttribute("aria-haspopup")||"listbox";return h===p||"listbox"===p&&!n.hasAttribute("aria-haspopup")?(0,a.RulePass)("Pass"):(0,a.RuleFail)("Fail_combobox_popup_role_mismatch",[h,p])}}},7955(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.combobox_popup_reference=void 0;var a=i(461),n=i(461),l=i(5279),r=i(4566),o=i(3946);t.combobox_popup_reference={id:"combobox_popup_reference",context:"aria:combobox",dependencies:["combobox_design_valid"],help:{"en-US":{group:"combobox_popup_reference.html","Pass_1.0_expanded":"combobox_popup_reference.html","Pass_1.0_collapsed":"combobox_popup_reference.html","Pass_1.2_expanded":"combobox_popup_reference.html","Pass_1.2_collapsed":"combobox_popup_reference.html","Fail_1.0_missing_owns":"combobox_popup_reference.html","Fail_1.2_missing_controls":"combobox_popup_reference.html","Fail_1.0_popup_reference_missing":"combobox_popup_reference.html","Fail_1.2_popup_reference_missing":"combobox_popup_reference.html",Fail_combobox_expanded_hidden:"combobox_popup_reference.html",Fail_combobox_collapsed_visible:"combobox_popup_reference.html"}},messages:{"en-US":{group:"The 'aria-controls' (for ARIA 1.2) or the 'aria-owns' (for ARIA 1.0) attribute of the expanded combobox must reference a valid popup 'id' value","Pass_1.0_expanded":"The combobox popup referenced by 'aria-owns' (ARIA 1.0) exists and is visible","Pass_1.0_collapsed":"The combobox popup in its collapsed state does not reference any visible popup as required","Pass_1.2_expanded":"The combobox popup referenced by 'aria-controls' (ARIA 1.2) exists and is visible","Pass_1.2_collapsed":"The combobox popup in its collapsed state does not reference any visible popup as required","Fail_1.0_missing_owns":"The 'aria-owns' attribute of the expanded combobox is missing","Fail_1.2_missing_controls":"The 'aria-controls' attribute of the expanded combobox is missing","Fail_1.0_popup_reference_missing":"The 'aria-owns' attribute \"{0}\" of the expanded combobox does not reference a valid popup 'id' value","Fail_1.2_popup_reference_missing":"The 'aria-controls' attribute \"{0}\" of the expanded combobox does not reference a valid popup 'id' value",Fail_combobox_expanded_hidden:"The combobox 'aria-expanded' attribute is true, but the combobox popup is not visible",Fail_combobox_collapsed_visible:"The combobox 'aria-expanded' attribute is false, but the combobox popup is visible"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[{"4e8ab6":{"Pass_1.0_expanded":"fail","Pass_1.0_collapsed":"fail","Pass_1.2_expanded":"pass","Pass_1.2_collapsed":"pass","Fail_1.0_missing_owns":"inapplicable","Fail_1.2_missing_controls":"fail","Fail_1.0_popup_reference_missing":"inapplicable","Fail_1.2_popup_reference_missing":"fail",Fail_combobox_expanded_hidden:"inapplicable",Fail_combobox_collapsed_visible:"inapplicable"}}],run:function(e,t,i){var n=e.dom.node,s=r.CacheUtil.getCache(n.ownerDocument,"combobox",{});if(!s)return null;var u=s[e.dom.rolePath];if(!u)return null;var d,c,m=u.pattern,p=u.expanded;if("1.0"===m){if(!n.hasAttribute("aria-owns"))return p?(0,a.RuleFail)("Fail_1.0_missing_owns"):null;if(d=n.getAttribute("aria-owns"),!(c=l.FragmentUtil.getById(n,d)))return p?(0,a.RuleFail)("Fail_1.0_popup_reference_missing",[d]):null}else{if("1.2"!==m)return null;if(!n.hasAttribute("aria-controls"))return p?(0,a.RuleFail)("Fail_1.2_missing_controls"):null;if(d=n.getAttribute("aria-controls"),!(c=l.FragmentUtil.getById(n,d)))return p?(0,a.RuleFail)("Fail_1.2_popup_reference_missing",[d]):null}return u.popupId=d,u.popupElement=c,p&&!o.VisUtil.isNodeVisible(c)?(0,a.RuleFail)("Fail_combobox_expanded_hidden"):!p&&o.VisUtil.isNodeVisible(c)?(0,a.RuleFail)("Fail_combobox_collapsed_visible"):"1.0"===m?p?(0,a.RulePass)("Pass_1.0_expanded"):(0,a.RulePass)("Pass_1.0_collapsed"):p?(0,a.RulePass)("Pass_1.2_expanded"):(0,a.RulePass)("Pass_1.2_collapsed")}}},9531(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.debug_paths=void 0;var a=i(461);t.debug_paths={id:"debug_paths",context:"dom:*",help:{"en-US":{group:"",Pass_0:""}},messages:{"en-US":{group:"",Pass_0:""}},rulesets:[{id:["DEBUG"],num:"1",level:a.eRulePolicy.INFORMATION,toolkitLevel:a.eToolkitLevel.LEVEL_FOUR}],act:[],run:function(e,t,i){var a=e.dom.node;return a.setAttribute("domPath",e.dom.rolePath),a.setAttribute("ariaPath",e.aria.rolePath),null}}},891(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.detector_tabbable=void 0;var a=i(7139),n=i(461),l=i(461);t.detector_tabbable={id:"detector_tabbable",context:"dom:*",help:{"en-US":{group:"",Pass_0:""}},messages:{"en-US":{group:"",Pass_0:""}},rulesets:[{id:["EXTENSIONS"],num:"1",level:l.eRulePolicy.INFORMATION,toolkitLevel:l.eToolkitLevel.LEVEL_FOUR}],act:[],run:function(e,t,i){var l=e.dom.node;if(!a.CommonUtil.isTabbable(l))return null;var r=i.aria[i.aria.length-1];return(0,n.RulePass)("Pass_0",[],[{name:r.attributes.name,role:r.role,tabindex:parseInt(l.getAttribute("tabindex")||"0")}])}}},7446(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.dir_attribute_valid=void 0;var a=i(461),n=i(461);t.dir_attribute_valid={id:"dir_attribute_valid",context:"dom:*[dir]",refactor:{Valerie_Elem_DirValid:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"dir_attribute_valid.html",Fail_1:"dir_attribute_valid.html",group:"dir_attribute_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Invalid value used for the 'dir' attribute",group:'\'dir\' attribute value must be "ltr", "rtl", or "auto"'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node.getAttribute("dir").toLowerCase();return"ltr"==n||"rtl"==n||"auto"==n?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},6137(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.download_keyboard_controllable=void 0;var a=i(461),n=i(461),l=i(7139),r=i(3946);t.download_keyboard_controllable={id:"download_keyboard_controllable",context:"dom:a[href],dom:area[href]",refactor:{HAAC_Media_DocumentTrigger2:{Manual_1:"Manual_1"}},help:{"en-US":{Manual_1:"download_keyboard_controllable.html",group:"download_keyboard_controllable.html"}},messages:{"en-US":{Manual_1:"Verify that the file download mechanism does not cause a keyboard trap",group:"File download mechanisms should be keyboard-operable and preserve page focus location"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.2"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var o=n.getAttribute("href"),s=l.CommonUtil.getFileExt(o),u=![".docx",".doc",".pdf",".odt"].includes(s);return u?null:u?void 0:(0,a.RuleManual)("Manual_1")}}},6839(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.draggable_alternative_exists=void 0;var a=i(7139),n=i(461),l=i(461),r=i(3946);t.draggable_alternative_exists={id:"draggable_alternative_exists",context:"dom:*[draggable]",dependencies:[],help:{"en-US":{group:"draggable_alternative_exists.html",pass_undraggable:"draggable_alternative_exists.html",potential_alternative:"draggable_alternative_exists.html"}},messages:{"en-US":{group:'A draggable element must have a "single pointer" alternative',pass_undraggable:'The element "{0}" is not draggable',potential_alternative:'Ensure the draggable element "{0}" has a "single pointer" alternative'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_2"],num:["2.5.7"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node;if(!r.VisUtil.isNodeVisible(l))return null;var o=l.nodeName.toLocaleLowerCase();return null!==a.CommonUtil.getAncestor(l,["pre","code","script","meta"])||"body"===o||"html"===o?null:"true"===l.getAttribute("draggable")?(0,n.RulePotential)("potential_alternative",[o]):"false"===l.getAttribute("draggable")?(0,n.RulePass)("pass_undraggable",[o]):null}}},8135(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_accesskey_labelled=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(3946),s=i(9910),u=i(1950);t.element_accesskey_labelled={id:"element_accesskey_labelled",context:"dom:*[accesskey]",refactor:{HAAC_Accesskey_NeedLabel:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"element_accesskey_labelled.html",Potential_1:"element_accesskey_labelled.html",group:"element_accesskey_labelled.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"The element with an assigned 'accesskey' attribute does not have an associated label",group:"An element with an assigned 'accesskey' attribute must have an associated label"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.3.2"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(o.VisUtil.isNodeVisible(n)&&!r.CommonUtil.isNodeDisabled(n)&&!r.CommonUtil.isTabbable(n)){var d=l.AriaUtil.getRoles(n,!0);if(d&&0!==d.length){var c=s.ARIADefinitions.designPatterns[d[0]];if(c&&c.nameFrom&&!c.nameRequired&&c.nameFrom&&!c.nameFrom.includes("prohibited")&&(!n.parentElement||"fieldset"!==n.parentElement.nodeName.toLowerCase())){var m=u.AccNameUtil.computeAccessibleName(n);return m&&m.name&&m.name.trim().length>0?(0,a.RulePass)("Pass_0"):(0,a.RulePotential)("Potential_1")}}}}}},507(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_accesskey_unique=void 0;var a=i(461),n=i(461),l=i(4566);t.element_accesskey_unique={id:"element_accesskey_unique",context:"dom:*[accesskey]",refactor:{WCAG20_Elem_UniqueAccessKey:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"element_accesskey_unique.html",Fail_1:"element_accesskey_unique.html",group:"element_accesskey_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"'accesskey' attribute value on the element is not unique",group:"'accesskey' attribute values on each element must be unique for the page"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["HTML"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,r=l.CacheUtil.getCache(n.ownerDocument,"element_accesskey_unique",{}),o=n.getAttribute("accesskey"),s=!(o in r);return r[o]=!0,s?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},3566(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_attribute_deprecated=void 0;var a=i(461),n=i(461),l=["applet","basefont","center","dir","font","isindex","listing","plaintext","spacer","s","strike","u","xmp","acronym","frame","frameset","noframes","noembed","big","blink","marquee","tt"],r=["align","link","archive","background","bgcolor","clear","code","color","compact","face","hspace","language","link","noshade","nowrap","object","prompt","start","text","version","vlink","vspace"],o={td:["height","width","abbr","axis","char","charoff","height","nowrap","valign","width","align","bgcolor"],th:["height","width","abbr","axis","charoff","height","bgcolor","align","nowrap","char","valign","width"],li:["type","value","type"],ul:["type","compact"],pre:["width"],meta:["http-equiv"],a:["charset","coords","shape","rev","scheme"],link:["rev","charset","target"],img:["name","longdesc","align","hspace","vspace","border"],area:["nohref"],head:["profile"],html:["version"],iframe:["longdesc","align","frameborder","marginheight","marginwidth","scrolling"],object:["archive","code","codebase","codetype","declare","standby","align","hspace","vspace","border"],param:["type","valuetype"],script:["language"],body:["alink","background","bgcolor","link","text","vlink"],br:["clear"],caption:["align"],col:["align","char","charoff","valign","width"],div:["align"],dl:["compact"],hr:["align","noshade","size","width","align"],h2:["align"],h3:["align"],h4:["align"],h5:["align"],h6:["align"],input:["align","usemap"],legend:["align"],menu:["compact"],ol:["compact","type","type"],p:["align"],table:["bgcolor","cellpadding","cellspacing","frame","rules","width","align"],tbody:["align","char","valign","charoff"],tfoot:["align","charoff","char","valign"],thead:["char","charoff","valign","align"],tr:["align","bgcolor","char","charoff","valign"]};t.element_attribute_deprecated={id:"element_attribute_deprecated",context:"dom:applet, dom:basefont, dom:center, dom:dir, dom:font, dom:isindex, dom:listing, dom:menu, dom:plaintext, dom:spacer, dom:s, dom:strike, dom:u, dom:xmp, dom:acronym, dom:frame, dom:frameset, dom:noframes, dom:noembed, dom:big, dom:blink, dom:marquee, dom:ttNaNdom:*[align], dom:*[link], dom:*[archive], dom:*[background], dom:*[bgcolor], dom:*[clear], dom:*[code], dom:*[color], dom:*[compact], dom:*[face], dom:*[hspace], dom:*[language], dom:*[link], dom:*[noshade], dom:*[nowrap], dom:*[object], dom:*[prompt], dom:*[start], dom:*[text], dom:*[version], dom:*[vlink], dom:*[vspace]NaNdom:td[height], dom:td[width], dom:td[abbr], dom:td[axis], dom:td[char], dom:td[charoff], dom:td[height], dom:td[nowrap], dom:td[valign], dom:td[width], dom:td[align], dom:td[bgcolor], dom:th[height], dom:th[width], dom:th[abbr], dom:th[axis], dom:th[charoff], dom:th[height], dom:th[bgcolor], dom:th[align], dom:th[nowrap], dom:th[char], dom:th[valign], dom:th[width], dom:li[type], dom:li[value], dom:li[type], dom:ul[type], dom:ul[compact], dom:pre[width], dom:meta[http-equiv], dom:a[charset], dom:a[coords], dom:a[shape], dom:a[rev], dom:a[scheme], dom:link[rev], dom:link[charset], dom:link[target], dom:img[name], dom:img[longdesc], dom:img[align], dom:img[hspace], dom:img[vspace], dom:img[border], dom:area[nohref], dom:head[profile], dom:html[version], dom:iframe[longdesc], dom:iframe[align], dom:iframe[frameborder], dom:iframe[marginheight], dom:iframe[marginwidth], dom:iframe[scrolling], dom:object[archive], dom:object[code], dom:object[codebase], dom:object[codetype], dom:object[declare], dom:object[standby], dom:object[align], dom:object[hspace], dom:object[vspace], dom:object[border], dom:param[type], dom:param[valuetype], dom:script[language], dom:body[alink], dom:body[background], dom:body[bgcolor], dom:body[link], dom:body[text], dom:body[vlink], dom:br[clear], dom:caption[align], dom:col[align], dom:col[char], dom:col[charoff], dom:col[valign], dom:col[width], dom:div[align], dom:dl[compact], dom:hr[align], dom:hr[noshade], dom:hr[size], dom:hr[width], dom:hr[align], dom:h2[align], dom:h3[align], dom:h4[align], dom:h5[align], dom:h6[align], dom:input[align], dom:input[usemap], dom:legend[align], dom:menu[compact], dom:ol[compact], dom:ol[type], dom:ol[type], dom:p[align], dom:table[bgcolor], dom:table[cellpadding], dom:table[cellspacing], dom:table[frame], dom:table[rules], dom:table[width], dom:table[align], dom:tbody[align], dom:tbody[char], dom:tbody[valign], dom:tbody[charoff], dom:tfoot[align], dom:tfoot[charoff], dom:tfoot[char], dom:tfoot[valign], dom:thead[char], dom:thead[charoff], dom:thead[valign], dom:thead[align], dom:tr[align], dom:tr[bgcolor], dom:tr[char], dom:tr[charoff], dom:tr[valign]",help:{"en-US":{pass:"element_attribute_deprecated.html",fail_elem:"element_attribute_deprecated.html",fail_attr:"element_attribute_deprecated.html",fail_elem_attr:"element_attribute_deprecated.html",group:"element_attribute_deprecated.html"}},messages:{"en-US":{pass:"Rule Passed",fail_elem:"The <{0}> element is deprecated in HTML 5",fail_attr:'The HTML attribute(s) "{0}" is deprecated in HTML 5',fail_elem_attr:'The HTML attribute(s) "{0}" is deprecated for the <{1}> element in HTML 5',group:"Avoid use of obsolete features if possible"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["HTML"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if("tbody"===n.nodeName.toLowerCase()&&n.hasAttribute("align"))return(0,a.RulePass)("pass");if(n.nodeName.includes("-"))return null;var s=n.nodeName.toLowerCase();if(l.includes(s))return(0,a.RuleFail)("fail_elem",[s]);for(var u=n.getAttributeNames(),d="",c=0,m=u;c<m.length;c++){var p=m[c];r.includes(p)&&(""!==d&&(d+=", "),d+=p)}if(""!==d)return(0,a.RuleFail)("fail_attr",[d]);if(d="",s in o){for(var h=0,g=u;h<g.length;h++)p=g[h],o[s]&&o[s].includes(p)&&(""!==d&&(d+=", "),d+=p);if(""!==d)return(0,a.RuleFail)("fail_elem_attr",[d,s])}return(0,a.RulePass)("pass")}}},5173(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_id_unique=void 0;var a=i(461),n=i(461),l=i(5279);t.element_id_unique={id:"element_id_unique",context:"dom:*[id]",refactor:{RPT_Elem_UniqueId:{Pass_0:"pass",Fail_1:"potential_empty",Fail_2:"potential_in_use"}},help:{"en-US":{group:"element_id_unique.html",pass:"element_id_unique.html",potential_empty:"element_id_unique.html",potential_in_use:"element_id_unique.html"}},messages:{"en-US":{group:"Element 'id' attribute values must be unique within a document",pass:"Rule Passed",potential_empty:'The <{0}> element has the id "{1}" that is empty',potential_in_use:'The <{0}> element has the id "{1}" that is already in use'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["HTML"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[{"3ea0c8":{pass:"pass",potential_empty:"pass",potential_in_use:"fail"}}],run:function(e,t,i){var n=e.dom.node,r=n.getAttribute("id");return""===r?(0,a.RulePotential)("potential_empty",[n.nodeName.toLowerCase(),r]):l.FragmentUtil.getById(n,r)===n?(0,a.RulePass)("pass"):(0,a.RulePotential)("potential_in_use",[n.nodeName.toLowerCase(),r])}}},6027(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_lang_valid=t.html_lang_valid=void 0;var a=i(461),n=i(461),l=i(1043),r=i(3946),o=i(3864),s=i(1950),u=function(e){var t=e.dom.node,i=t.nodeName.toLowerCase();if(t.hasAttribute("lang"))if("html"!==i&&""===t.getAttribute("lang"));else{var a=t.getAttribute("lang");if(!l.LangUtil.validPrimaryLang(a))return 1;if(!l.LangUtil.isBcp47(a))return 2}if(t.hasAttribute("xml:lang"))if("html"!==i&&""===t.getAttribute("xml:lang"));else{if(a=t.getAttribute("xml:lang"),!l.LangUtil.validPrimaryLang(a))return 3;if(!l.LangUtil.isBcp47(a))return 4}return 0};t.html_lang_valid={id:"html_lang_valid",context:"dom:html[lang], dom:html[xml:lang]",help:{"en-US":{Pass_0:"html_lang_valid.html",Fail_1:"html_lang_valid.html",Fail_2:"html_lang_valid.html",Fail_3:"html_lang_valid.html",Fail_4:"html_lang_valid.html",group:"html_lang_valid.html"}},messages:{"en-US":{Pass_0:"Lang has a valid primary lang and conforms to BCP 47",Fail_1:"Specified 'lang' attribute does not include a valid primary language",Fail_2:"Specified 'lang' attribute does not conform to BCP 47",Fail_3:"Specified 'xml:lang' attribute does not include a valid primary language",Fail_4:"Specified 'xml:lang' attribute does not conform to BCP 47",group:"The default human language of the page must be valid and specified in accordance with BCP 47"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[{b5c3f8:{Pass_0:"pass",Fail_1:"fail",Fail_2:"inapplicable",Fail_3:"inapplicable",Fail_4:"inapplicable"},bf051a:{Pass_0:"pass",Fail_1:"fail",Fail_2:"pass",Fail_3:"fail",Fail_4:"inapplicable"}}],run:function(e,t,i){var n=u(e);return[(0,a.RulePass)("Pass_0"),(0,a.RuleFail)("Fail_1"),(0,a.RuleFail)("Fail_2"),(0,a.RuleFail)("Fail_3"),(0,a.RuleFail)("Fail_4")][n]}},t.element_lang_valid={id:"element_lang_valid",context:"dom:*[lang], dom:*[xml:lang]",help:{"en-US":{Pass_0:"element_lang_valid.html",Fail_1:"element_lang_valid.html",Fail_2:"element_lang_valid.html",Fail_3:"element_lang_valid.html",Fail_4:"element_lang_valid.html",group:"element_lang_valid.html"}},messages:{"en-US":{Pass_0:"Lang has a valid primary lang and conforms to BCP 47",Fail_1:"Specified 'lang' attribute does not include a valid primary language",Fail_2:"Specified 'lang' attribute does not conform to BCP 47",Fail_3:"Specified 'xml:lang' attribute does not include a valid primary language",Fail_4:"Specified 'xml:lang' attribute does not conform to BCP 47",group:"The change in language of specific content must be valid and specified in accordance with BCP 47"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[{de46e4:{Pass_0:"pass",Fail_1:"fail",Fail_2:"pass",Fail_3:"inapplicable",Fail_4:"inapplicable"}}],run:function(e,t,i){var n=e.dom.node;if("html"===n.nodeName.toLowerCase())return null;var l=u(e),d=[(0,a.RulePass)("Pass_0"),(0,a.RuleFail)("Fail_1"),(0,a.RuleFail)("Fail_2"),(0,a.RuleFail)("Fail_3"),(0,a.RuleFail)("Fail_4")][l];if(d.value[1]!==a.eRuleConfidence.PASS){var c=!1;if(null!==n.firstChild)for(var m=new o.DOMWalker(n,!1,n,!0);!c&&m.nextNode();)if(1===m.node.nodeType){var p=m.node;if(!r.VisUtil.isNodeVisible(p)||p.hasAttribute("lang"))m.bEndTag=!0;else{var h=s.AccNameUtil.computeAccessibleName(p);c=c||"img"===p.nodeName.toLowerCase()&&h&&h.name&&h.name.trim().length>0}}else c=c||3===m.node.nodeType&&m.node.nodeValue.trim().length>0;if(!c)return null}return d}}},7515(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_mouseevent_keyboard=void 0;var a=i(461),n=i(461);t.element_mouseevent_keyboard={id:"element_mouseevent_keyboard",context:"dom:*[ondblclick], dom:*[onmousemove], dom:*[onmousedown], dom:*[onmouseup], dom:*[onmouseover], dom:*[onmouseout], dom:*[onclick]",refactor:{RPT_Elem_EventMouseAndKey:{Pass_0:"Pass_0",Manual_1:"Manual_1"}},help:{"en-US":{Pass_0:"element_mouseevent_keyboard.html",Manual_1:"element_mouseevent_keyboard.html",group:"element_mouseevent_keyboard.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Manual_1:"Confirm the <{0}> element with mouse event handler(s) '{1}' has a corresponding keyboard handler(s)",group:"All interactive content with mouse event handlers must have equivalent keyboard access"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,l=n.nodeName.toLowerCase(),r=n.hasAttribute("href")||!n.hasAttribute("ondblclick")&&!n.hasAttribute("onmousemove")&&(!n.hasAttribute("onmousedown")||n.hasAttribute("onkeydown"))&&(!n.hasAttribute("onmouseup")||n.hasAttribute("onkeyup"))&&(!n.hasAttribute("onmouseover")||n.hasAttribute("onfocus"))&&(!n.hasAttribute("onmouseout")||n.hasAttribute("onblur"))&&(!n.hasAttribute("onclick")||n.hasAttribute("onkeypress")||"a"==l||"button"==l),o=new Array;return r||(n.hasAttribute("ondblclick")&&o.push("ondblclick"),n.hasAttribute("onmousemove")&&o.push("onmousemove"),n.hasAttribute("onmousedown")&&!n.hasAttribute("onkeydown")&&o.push("onmousedown"),n.hasAttribute("onmouseup")&&!n.hasAttribute("onkeyup")&&o.push("onmouseup"),n.hasAttribute("onmouseover")&&!n.hasAttribute("onfocus")&&o.push("onmouseover"),n.hasAttribute("onmouseout")&&!n.hasAttribute("onblur")&&o.push("onmouseout"),n.hasAttribute("onclick")&&!n.hasAttribute("onkeypress")&&"a"!=l&&"button"!=l&&o.push("onclick")),r?(0,a.RulePass)("Pass_0"):(0,a.RuleManual)("Manual_1",[l,o.join(", ")])}}},1704(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_orientation_unlocked=void 0;var a=i(461),n=i(461),l=i(4919),r=i(3946),o=i(4566),s=i(5279),u=i(7139);t.element_orientation_unlocked={id:"element_orientation_unlocked",context:"dom:*",help:{"en-US":{pass:"element_orientation_unlocked.html",fail_locked:"element_orientation_unlocked.html",group:"element_orientation_unlocked.html"}},messages:{"en-US":{pass:"The element is not restricted to either landscape or portrait orientation using CSS transform property",fail_locked:"The element <{0}> is restricted to either landscape or portrait orientation using CSS transform property",group:"Elements should not be restricted to either landscape or portrait orientation using CSS transform property"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.4"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:["b33eff"],run:function(e,t,i){var n=e.dom.node;if(!r.VisUtil.isNodeVisible(n))return null;if(u.CommonUtil.getAncestor(n,["script","meta","title"]))return null;var d=n.nodeName.toLowerCase(),c=s.FragmentUtil.getOwnerFragment(n),m=o.CacheUtil.getCache(c,"RPTUtil_MEDIA_ORIENTATION_TRANSFROM",null);m||(m=l.CSSUtil.getMediaOrientationTransform(c),o.CacheUtil.setCache(c,"RPTUtil_MEDIA_ORIENTATION_TRANSFROM",m));var p=[];if(Object.keys(m).forEach(function(e){Object.keys(m[e]).forEach(function(t){Object.keys(m[e][t]).length>0&&l.CSSUtil.selectorMatchesElem(n,t)&&(m[e][t].transform?p.push(m[e][t].transform):p.push(m[e][t]))})}),0===p.length)return null;for(var h=[],g=function(e){var t=p[e];if("object"==typeof t)for(var i in t)t=i+"("+t[i]+")";var r=!1;if(["rotate","rotate3d","rotateZ","matrix","matrix3d"].forEach(function(e){t.includes(e)&&(r=!0)}),!r)return"continue";var o=l.CSSUtil.getRotationDegree(t);if(0===o)return h.push((0,a.RulePass)("pass")),"continue";var s=l.CSSUtil.getDefinedStyles(n,["transform"]);s.transform&&(o+=l.CSSUtil.getRotationDegree(s.transform)),Math.abs(o-360)%360>1?h.push((0,a.RuleFail)("fail_locked",[d])):h.push((0,a.RulePass)("pass"))},b=0;b<p.length;b++)g(b);return h.length>0?h:null}}},5053(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_scrollable_tabbable=void 0;var a=i(7139),n=i(461),l=i(3946),r=i(7011);t.element_scrollable_tabbable={id:"element_scrollable_tabbable",context:"dom:*",dependencies:[],help:{"en-US":{group:"element_scrollable_tabbable.html",pass_tabbable:"element_scrollable_tabbable.html",pass_interactive:"element_scrollable_tabbable.html",fail_scrollable:"element_scrollable_tabbable.html"}},messages:{"en-US":{group:"Scrollable elements should be tabbable or contain tabbable content",pass_tabbable:"The scrollable element is tabbable",pass_interactive:"The scrollable element has tabbable content",fail_scrollable:"The scrollable element <{0}> with non-interactive content is not tabbable"}},rulesets:[],act:["0ssw9k"],run:function(e,t,i){var o=e.dom.node;if(l.VisUtil.isNodeVisible(o)&&!a.CommonUtil.isNodeDisabled(o))return a.CommonUtil.getAncestor(o,["iframe","svg","script","meta","style"])?null:a.CommonUtil.hasInnerContent(o)?r.AriaUtil.isNavigationOwnedOrControlled(o)?null:l.VisUtil.isElementScrollable(o)?a.CommonUtil.isTabbable(o)?(0,n.RulePass)("pass_tabbable"):a.CommonUtil.getTabbableChildren(o)>0?(0,n.RulePass)("pass_interactive"):!o.hasAttribute("tabindex")&&navigator.userAgent.indexOf("Firefox")>-1?null:(0,n.RuleFail)("fail_scrollable",[o.nodeName.toLowerCase()]):null:null}}},4681(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_tabbable_role_valid=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(9910),s=i(3864),u=i(3946);t.element_tabbable_role_valid={id:"element_tabbable_role_valid",context:"dom:*",help:{"en-US":{pass:"element_tabbable_role_valid.html",fail_invalid_role:"element_tabbable_role_valid.html",fail_no_valid_role:"element_tabbable_role_valid.html",group:"element_tabbable_role_valid.html"}},messages:{"en-US":{pass:"The tabbable element has a widget role",fail_invalid_role:"The tabbable element's role '{0}' is not a widget role",fail_no_valid_role:"The tabbable element does not have a valid widget role",group:"A tabbable element must have a valid widget role"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE},{id:["WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.CommonUtil.isNodeDisabled(n)||u.VisUtil.isNodeHiddenFromAT(n))return null;var d=n.nodeName.toLowerCase();if(d in r.CommonUtil.tabTagMap){var c=r.CommonUtil.tabTagMap[d];if("function"==typeof c&&(c=c(n)),c)return null}if(!n.hasAttribute("tabindex")||parseInt(n.getAttribute("tabindex"))<0)return null;if(l.AriaUtil.isNavigationOwnedOrControlled(n))return null;if(u.VisUtil.isElementScrollable(n))return null;var m=s.DOMWalker.parentNode(n),p=l.AriaUtil.getResolvedRole(m);if(["button","checkbox","img","link","menuitem","menuitemcheckbox","menuitemradio","option","radio","switch","tab"].includes(p))return null;var h=l.AriaUtil.getResolvedRole(n);return h?"application"===h?null:"row"===h||"separator"===h||"widget"===o.ARIADefinitions.designPatterns[h].roleType?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_invalid_role",[h]):(0,a.RuleFail)("fail_no_valid_role")}}},8050(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_tabbable_unobscured=void 0;var a=i(7139),n=i(461),l=i(461),r=i(3946),o=i(7507),s=i(3883);t.element_tabbable_unobscured={id:"element_tabbable_unobscured",context:"dom:*",dependencies:[],help:{"en-US":{group:"element_tabbable_unobscured.html",pass:"element_tabbable_unobscured.html",potential_obscured:"element_tabbable_unobscured.html"}},messages:{"en-US":{group:"When an element receives focus, it is not entirely covered by other content",pass:"The element is not entirely covered by other content",potential_obscured:"Confirm that when the element receives focus, it is not covered or, if covered by user action, can be uncovered without moving focus"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_2"],num:["2.4.11"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node;if(!r.VisUtil.isNodeVisible(l)||!a.CommonUtil.isTabbable(l))return null;var u=l.nodeName.toLocaleLowerCase();if(null!==a.CommonUtil.getAncestor(l,["pre","code","script","meta"])||"body"===u||"html"===u)return null;var d=l.ownerDocument;if(!d)return null;var c=d.defaultView;if(!c)return null;var m=new o.DOMMapper,p=m.getUnadjustedBounds(l);if(!p||0===p.height||0===p.width)return null;var h=c.getComputedStyle(l);if(!h)return null;var g=parseInt("auto"!==h.zIndex&&h.zIndex?h.zIndex:"0"),b=d.querySelectorAll("body *:not(script):not(style):not(meta):not(link)");if(!b||0===b.length)return null;for(var _=!0,f=p.left+p.width,v=p.top+p.height,A=0;A<b.length;A++){var w=b[A],y=l.compareDocumentPosition(w);if(0===y||y&Node.DOCUMENT_POSITION_CONTAINED_BY)_=!1;else if(!(y&Node.DOCUMENT_POSITION_CONTAINS)&&r.VisUtil.isNodeVisible(w)){var C=m.getUnadjustedBounds(w);if(C&&0!==C.height&&0!==C.width&&!(C.top>p.top||C.left>p.left)){var k=C.left+C.width,R=C.top+C.height;if(!(k<f||R<v)){var x=c.getComputedStyle(w);if(x){var P=parseInt("auto"===x.zIndex||!x.zIndex||isNaN(Number(x.zIndex))?"0":x.zIndex);if(_&&P>g||!_&&P>=g){var T,U=!1;if(x.background&&"none"!==x.background&&(U=(T=s.ColorUtil.Color(x.background))&&(void 0===T.alpha||T.alpha>0)),!U&&x.backgroundColor&&(U=(T=s.ColorUtil.Color(x.backgroundColor))&&(void 0===T.alpha||T.alpha>0)),!a.CommonUtil.hasInnerContentHidden(w)&&!U)continue;return(0,n.RulePotential)("potential_obscured",[])}}}}}}return(0,n.RulePass)("pass")}}},2644(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_tabbable_visible=void 0;var a=i(7139),n=i(4919),l=i(461),r=i(461),o=i(7507);t.element_tabbable_visible={id:"element_tabbable_visible",context:"dom:*",dependencies:[],help:{"en-US":{group:"element_tabbable_visible.html",pass:"element_tabbable_visible.html",potential_visible:"element_tabbable_visible.html"}},messages:{"en-US":{group:"A tabbable element should be visible on the screen when it has keyboard focus",pass:"The tabbable element is visible on the screen",potential_visible:"Confirm the element should be tabbable and if so, it becomes visible when it has keyboard focus"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.7"],level:r.eRulePolicy.VIOLATION,toolkitLevel:r.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var r=e.dom.node;if(!a.CommonUtil.isTabbable(r))return null;var s=r.nodeName.toLocaleLowerCase(),u=(new o.DOMMapper).getUnadjustedBounds(r);if(!u)return null;var d=n.CSSUtil.getDefinedStylesMultiple(r,["position","clip"],["",":focus"]),c=d[""],m=d[":focus"];if(0===u.height||0===u.width)return(0,l.RulePotential)("potential_visible",[]);if("absolute"===c.position&&c.clip&&"rect(0px,0px,0px,0px)"===c.clip.replaceAll(" ","")&&!m.clip){if("input"===s&&("checkbox"===r.getAttribute("type")||"radio"===r.getAttribute("type"))){var p=a.CommonUtil.getLabelForElement(r);if(p&&!a.CommonUtil.isInnerTextEmpty(p)){var h=n.CSSUtil.getDefinedStylesMultiple(r,null,[":focus-visible",":focus-within",":checked",":focus"]),g=h[":focus-visible"],b=h[":focus-within"],_=h[":checked"];if(h[":focus"]||g||b||_)return(0,l.RulePass)("pass")}}return(0,l.RulePotential)("potential_visible",[])}if(u.top>=0&&u.left>=0)return(0,l.RulePass)("pass");var f=getComputedStyle(r),v=u.top,A=u.left;if(0===Object.keys(m).length)return(0,l.RulePotential)("potential_visible",[]);var w=["absolute","fixed"];return void 0!==m.top&&(v=w.includes(m.position)||void 0===m.position&&w.includes(f.position)?m.top.replace(/\D/g,""):Number.MIN_VALUE),void 0!==m.left&&(A=w.includes(m.position)||void 0===m.position&&w.includes(f.position)?m.left.replace(/\D/g,""):Number.MIN_VALUE),v>=0&&A>=0?(0,l.RulePass)("pass"):(0,l.RulePotential)("potential_visible",[])}}},429(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.embed_alt_exists=void 0;var a=i(461),n=i(461),l=i(7139),r=i(3946);t.embed_alt_exists={id:"embed_alt_exists",context:"dom:embed",refactor:{RPT_Embed_HasAlt:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"embed_alt_exists.html",Potential_1:"embed_alt_exists.html",group:"embed_alt_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that the <embed> element has alternative content",group:"Provide alternative content for <embed> elements"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_FOUR}],act:[],run:function(e,t,i){var n=e.dom.node;return r.VisUtil.isNodeHiddenFromAT(n)?null:l.CommonUtil.attributeNonEmpty(n,"alt")?(0,a.RulePass)("Pass_0"):(0,a.RulePotential)("Potential_1")}}},4617(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.emoticons_alt_exists=void 0;var a=i(461),n=i(7139);t.emoticons_alt_exists={id:"emoticons_alt_exists",context:"dom:*",refactor:{WCAG20_Text_Emoticons:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"emoticons_alt_exists.html",Potential_1:"emoticons_alt_exists.html",group:"emoticons_alt_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that emoticons have a text alternative",group:"Emoticons must have a short text alternative that describes their purpose"}},rulesets:[],act:[],run:function(e,t,i){for(var l=e.dom.node,r=[":-)",":)",":o)",":]",":3",":c)",":>","=]","8)","=)",":D","C:",":-D",":D","8D","XD","=D","=3","<=3","<=8","--!--",":-(",":(",":c",":<",":[","D:","D8","D;","D=","DX","v.v",":-9",";-)",";)","*)",";]",";D",":-P",":P",":-p",":p","=p",":-Þ",":Þ",":-b",":b",":-O",":O","O_O","o_o","8O","OwO","O-O","0_o","O_o","O3O","o0o ;o_o;","o...o","0w0",":-/",":/",":\\","=/","=\\",":S",":|","d:-)","qB-)",":)~",":-)>....",":-X",":X",":-#",":#","O:-)","0:3","O:)",":'(",";*(","T_T","TT_TT","T.T",":-*",":*","^o)",">:)",">;)",">:-)","B)","B-)","8)","8-)","^>.>^","^<.<^","^>_>^","^<_<^","D:<",">:(","D-:<",">:-(",":-@[1]",";(","`_´","D<","<3","<333","=^_^=","=>.>=","=<_<=","=>.<=","\\,,/","\\m/","\\m/\\>.</\\m/","\\o/","\\o o/","o/\\o",":&",":u"],o=!0,s="",u=l.firstChild;u;)"#text"==u.nodeName&&(s+=" "+u.nodeValue),u=u.nextSibling;if(s.trim().length>0)for(var d=0;o&&d<r.length;++d)for(var c=s.indexOf(r[d]),m=r[d].length;o&&-1!=c;)o=(o=(o=c>0&&!/\s/.test(s.substring(c-1,c))||c<s.length-m&&!/\s/.test(s.substring(c+m,c+m+1))&&!/[.,!'"?]/.test(s.substring(c+m,c+m+1)))||(":)"==r[d]||"(:"==r[d])&&/\(\:.*\:\)/.test(s))||(";)"==r[d]||"(;"==r[d])&&/\(\;.*\;\)/.test(s),c=s.indexOf(r[d],c+1);if(!o){var p=n.CommonUtil.getAncestor(l,["pre","code","script","body"]);o=null==p||"body"!=p.nodeName.toLowerCase()}return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},5460(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.error_message_exists=void 0;var a=i(461),n=i(461),l=i(7011),r=i(5279),o=i(3946);t.error_message_exists={id:"error_message_exists",context:"dom:*[aria-invalid=true]",refactor:{HAAC_Aria_ErrorMessage:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_0:"error_message_exists.html",Fail_1:"error_message_exists.html",Fail_2:"error_message_exists.html",group:"error_message_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Custom error message has invalid reference 'id' value",Fail_2:"Custom error message is not visible",group:"A custom error message must reference a valid 'id' value and when triggered the message must be appropriately exposed"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,s=l.AriaUtil.getAriaAttribute(n,"aria-errormessage");if(!s)return null;var u=r.FragmentUtil.getById(n,s);return u?o.VisUtil.isNodeVisible(u)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_2"):(0,a.RuleFail)("Fail_1")}}},3399(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.fieldset_label_valid=void 0;var a=i(461),n=i(461),l=i(5279),r=i(4566),o=i(7139),s=i(3946),u=i(1950);t.fieldset_label_valid={id:"fieldset_label_valid",context:"aria:group",refactor:{group_withInputs_hasName:{Pass_1:"Pass_1",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_1:"fieldset_label_valid.html",Fail_1:"fieldset_label_valid.html",Fail_2:"fieldset_label_valid.html",group:"fieldset_label_valid.html"}},messages:{"en-US":{Pass_1:'Group/Fieldset "{0}" with an input has a unique name',Fail_1:"Group/Fieldset does not have an accessible name",Fail_2:'Group/Fieldset "{0}" has a duplicate name to another group',group:"Groups with nested inputs must have unique accessible name"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1","3.3.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(!s.VisUtil.isNodeHiddenFromAT(n)&&!o.CommonUtil.isNodeDisabled(n)){var d=l.FragmentUtil.getOwnerFragment(n),c=r.CacheUtil.getCache(n.ownerDocument,"landmark_group_input",null);if(!c){c={groupsWithInputs:[],groupsWithInputsComputedLabels:[]};for(var m=d.querySelectorAll('fieldset,[role="group"]'),p=Array.from(m),h=[],g=0;g<p.length;g++)p[g].querySelector("input")&&h.push(p[g]);var b=[];for(g=0;g<h.length;g++){var _=u.AccNameUtil.computeAccessibleName(h[g]);b.push(_&&_.name&&_.name.trim().length>0?_.name.trim():"")}c.groupsWithInputs=h,c.groupsWithInputsComputedLabels=b,r.CacheUtil.setCache(n.ownerDocument,"landmark_group_input",c)}var f=!1,v="";if(!c.groupsWithInputs)return null;for(g=0;g<c.groupsWithInputs.length;g++)if(n.isSameNode(c.groupsWithInputs[g])){if(f=!0,""===c.groupsWithInputsComputedLabels[g]||null===c.groupsWithInputsComputedLabels[g])return(0,a.RuleFail)("Fail_1");for(var A=!1,w=0;w<c.groupsWithInputsComputedLabels.length;w++)g!=w&&c.groupsWithInputsComputedLabels[g]===c.groupsWithInputsComputedLabels[w]&&(A=!0);if(A)return(0,a.RuleFail)("Fail_2",[c.groupsWithInputsComputedLabels[g]]);v=c.groupsWithInputsComputedLabels[g]}return f?(0,a.RulePass)("Pass_1",[v]):null}}}},3498(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.fieldset_legend_valid=void 0;var a=i(461),n=i(461),l=i(7139),r=i(3946);t.fieldset_legend_valid={id:"fieldset_legend_valid",context:"dom:fieldset",refactor:{WCAG20_Fieldset_HasLegend:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{Pass_0:"fieldset_legend_valid.html",Fail_1:"fieldset_legend_valid.html",Fail_2:"fieldset_legend_valid.html",Fail_3:"fieldset_legend_valid.html",group:"fieldset_legend_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"<fieldset> element does not have a <legend>",Fail_2:"<fieldset> element has more than one <legend>",Fail_3:"<fieldset> element <legend> is empty",group:" <fieldset> elements should have a single, non-empty <legend> as a label"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n)||l.CommonUtil.isNodeDisabled(n))return null;var o=l.CommonUtil.getChildByTagHidden(n,"legend",!0,!1);return 0===o.length?(0,a.RuleFail)("Fail_1"):o.length>1?(0,a.RuleFail)("Fail_2"):0===l.CommonUtil.getInnerText(o[0]).trim().length?(0,a.RuleFail)("Fail_3"):(0,a.RulePass)("Pass_0")}}},9629(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.figure_label_exists=void 0;var a=i(461),n=i(461),l=i(3946),r=i(1950);t.figure_label_exists={id:"figure_label_exists",context:"dom:figure",refactor:{HAAC_Figure_label:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"figure_label_exists.html",Fail_1:"figure_label_exists.html",group:"figure_label_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The <figure> element does not have an associated label",group:"A <figure> element must have an associated label"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;if(n.getAttribute("role"))return null;var o=r.AccNameUtil.computeAccessibleName(n);return o&&o.name&&o.name.trim().length>0?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[])}}},733(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.form_font_color=void 0;var a=i(461),n=i(461);t.form_font_color={id:"form_font_color",context:"dom:form",refactor:{RPT_Font_ColorInForm:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"form_font_color.html",Potential_1:"form_font_color.html",group:"form_font_color.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Check color is not used as the only visual means to convey which fields are required",group:"Combine color and descriptive markup to indicate required form fields"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.4.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=!0,l=e.dom.node.getElementsByTagName("font");if(null!=l)for(var r=0;r<l.length;++r)n=!l[r].hasAttribute("color");return n?(0,a.RulePass)("Pass_0"):n?void 0:(0,a.RulePotential)("Potential_1")}}},9797(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.form_interaction_review=void 0;var a=i(461),n=i(461),l=i(7139);t.form_interaction_review={id:"form_interaction_review",context:"dom:form[target]",refactor:{WCAG20_Form_TargetAndText:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"form_interaction_review.html",Potential_1:"form_interaction_review.html",group:"form_interaction_review.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that interacting with content will not open pop-up windows or change the active window without informing the user",group:"User should be informed in advance when interacting with content causes a change of context"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.2.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n={paramWinText:{value:["new window"],type:"array"}},r=e.dom.node,o=r.getAttribute("target"),s="_parent"===o||"_self"===o||"_top"===o||null!=l.CommonUtil.getFrameByName(r,o);if(!s){var u=l.CommonUtil.getInnerText(r);r.hasAttribute("title")&&(u+=" "+r.getAttribute("title"));for(var d=0;!s&&d<n.paramWinText.value.length;++d)-1!=u.indexOf(n.paramWinText.value[d])&&(s=!0)}return s?(0,a.RulePass)("Pass_0"):s?void 0:(0,a.RulePotential)("Potential_1")}}},7156(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.form_label_unique=void 0;var a=i(461),n=i(461),l=i(5279),r=i(4566);t.form_label_unique={id:"form_label_unique",context:"dom:label[for]",refactor:{RPT_Label_UniqueFor:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"form_label_unique.html",Fail_1:"form_label_unique.html",group:"form_label_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Form control has more than one label",group:"Form controls should have exactly one label"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,o=r.CacheUtil.getCache(l.FragmentUtil.getOwnerFragment(n),"RPT_Label_Single",{}),s=n.getAttribute("for"),u=!(s in o);return o[s]=!0,u?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},3062(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.form_submit_button_exists=void 0;var a=i(461),n=i(461),l=i(7011),r=i(3864);t.form_submit_button_exists={id:"form_submit_button_exists",context:"dom:form",refactor:{WCAG20_Form_HasSubmit:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"form_submit_button_exists.html",Potential_1:"form_submit_button_exists.html",group:"form_submit_button_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify the <form> element has a submit button or an image button",group:"A <form> element should have a submit button or an image button"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.2.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,o=!1;if(n.firstChild)for(var s=new r.DOMWalker(n,!0);!o&&s.prevNode()&&s.node!=n;)if(!s.bEndTag){var u=s.node.nodeName.toLowerCase();if("input"===u){var d=s.elem().getAttribute("type");d&&(d=d.toLowerCase()),o="submit"===d||"image"===d}else"button"===u?o=s.elem().hasAttribute("type")&&"submit"===s.elem().getAttribute("type").toLowerCase():1===s.node.nodeType&&(o=l.AriaUtil.hasRole(s.node,"button"))}return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},3827(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.form_submit_review=void 0;var a=i(461);t.form_submit_review={id:"form_submit_review",context:"dom:select[onchange], dom:input[onchange]",refactor:{RPT_Form_ChangeEmpty:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"form_submit_review.html",Potential_1:"form_submit_review.html",group:"form_submit_review.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Confirm the form does not submit automatically without warning",group:"A form should not be submitted automatically without warning the user"}},rulesets:[],act:[],run:function(e,t,i){var n=0===e.dom.node.getAttribute("onchange").trim().length;return n?null:n?void 0:(0,a.RulePotential)("Potential_1")}}},5498(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.frame_src_valid=void 0;var a=i(461),n=i(461),l=i(7139);t.frame_src_valid={id:"frame_src_valid",context:"dom:frame, dom:iframe",refactor:{Valerie_Frame_SrcHtml:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"frame_src_valid.html",Potential_1:"frame_src_valid.html",group:"frame_src_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify <frame> content is accessible",group:"A <frame> containing non-HTML content must be made accessible"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,r=l.CommonUtil.attributeNonEmpty(n,"src")&&l.CommonUtil.isHtmlExt(l.CommonUtil.getFileExt(n.getAttribute("src")));return r?(0,a.RulePass)("Pass_0"):r?void 0:(0,a.RulePotential)("Potential_1")}}},510(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.frame_title_exists=void 0;var a=i(461),n=i(461),l=i(1950),r=i(3946);t.frame_title_exists={id:"frame_title_exists",context:"dom:frame, dom:iframe",refactor:{WCAG20_Frame_HasTitle:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"frame_title_exists.html",Pass_0:"frame_title_exists.html",Fail_1:"frame_title_exists.html"}},messages:{"en-US":{group:"Inline frames must have a unique, non-empty 'title' attribute",Pass_0:"Rule Passed",Fail_1:"Inline frame does not have a 'title' attribute"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:"cae760",run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;if(n.getAttribute("role"))return null;var o=l.AccNameUtil.computeAccessibleName(n);return o&&o.name&&o.name.trim().length>0?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},7722(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.heading_content_exists=void 0;var a=i(461),n=i(461),l=i(7139);t.heading_content_exists={id:"heading_content_exists",context:"dom:h1, dom:h2, dom:h3, dom:h4, dom:h5, dom:h6",refactor:{RPT_Header_HasContent:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"heading_content_exists.html",Fail_1:"heading_content_exists.html",group:"heading_content_exists.html"}},messages:{"en-US":{Pass_0:"Heading element has descriptive text",Fail_1:"Heading element has no descriptive content",group:"Heading elements must provide descriptive text"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.6"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;return l.CommonUtil.hasInnerContentHidden(n)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},4597(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.heading_markup_misuse=void 0;var a=i(461),n=i(461),l=i(7139);t.heading_markup_misuse={id:"heading_markup_misuse",context:"dom:h1, dom:h2, dom:h3, dom:h4, dom:h5, dom:h6",dependencies:["heading_content_exists"],refactor:{RPT_Headers_FewWords:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"heading_markup_misuse.html",Potential_1:"heading_markup_misuse.html",group:"heading_markup_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that the heading element is a genuine heading",group:"Heading elements must not be used for presentation"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node,r=l.CommonUtil.wordCount(l.CommonUtil.getInnerText(n))<=20;return r?(0,a.RulePass)("Pass_0"):r?void 0:(0,a.RulePotential)("Potential_1")}}},2104(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.html_lang_exists=void 0;var a=i(461),n=i(461),l=i(6858),r=i(1043);t.html_lang_exists={id:"html_lang_exists",context:"dom:html",refactor:{WCAG20_Html_HasLang:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3",Fail_4:"Fail_4",Fail_5:"Fail_5",Potential_5:"Potential_5",Potential_6:"Potential_6"}},help:{"en-US":{group:"html_lang_exists.html",Pass_0:"html_lang_exists.html",Fail_1:"html_lang_exists.html",Fail_2:"html_lang_exists.html",Fail_3:"html_lang_exists.html",Fail_4:"html_lang_exists.html",Fail_5:"html_lang_exists.html",Potential_5:"html_lang_exists.html",Potential_6:"html_lang_exists.html"}},messages:{"en-US":{group:"Page must identify the default language of the document with a 'lang' attribute",Pass_0:'Page language detected as "{0}"',Fail_1:"Page detected as XHTML 1.0, but has neither 'lang' nor 'xml:lang' attributes",Fail_2:"Page detected as XHTML, but does not have an 'xml:lang' attribute",Fail_3:"Page detected as HTML, but does not have a 'lang' attribute",Fail_4:"Page detected with 'lang' and 'xml:lang' attributes and primary languages do not match: \"{0}\", \"{1}\"",Fail_5:"Page detected with 'lang' and 'xml:lang' attributes that do not match: \"{0}\", \"{1}\"",Potential_5:"Page detected as XHTML 1.0 with only a 'lang' attribute. Confirm that page is only delivered via text/html mime type",Potential_6:"Page detected as XHTML 1.0 with only an 'xml:lang' attribute. Confirm that page is only delivered via xml mime type"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"3.1.1",level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[{b5c3f8:{Pass_0:"pass",Fail_1:"inapplicable",Fail_2:"inapplicable",Fail_3:"fail",Fail_4:"inapplicable",Fail_5:"inapplicable",Potential_5:"inapplicable",Potential_6:"inapplicable"},"5b7ae0":{Pass_0:"pass",Fail_1:"inapplicable",Fail_2:"inapplicable",Fail_3:"inapplicable",Fail_4:"fail",Fail_5:"pass",Potential_5:"inapplicable",Potential_6:"inapplicable"}}],run:function(e,t,i){if(l.AncestorUtil.isPresentationFrame(i))return null;var n=e.dom.node,o=n.ownerDocument.doctype?n.ownerDocument.doctype.publicId:"";o||(o="");var s=n.getAttribute("lang"),u=n.getAttribute("xml:lang");return o.includes("XHTML")&&!o.includes("1.0")?u?(0,a.RulePass)("Pass_0",[u]):(0,a.RuleFail)("Fail_2"):o.includes("XHTML")&&o.includes("1.0")?s||u?s&&u?s!==u?r.LangUtil.validPrimaryLang(s)&&r.LangUtil.validPrimaryLang(u)?r.LangUtil.matchPrimaryLang(s,u)?(0,a.RuleFail)("Fail_5",[s,u],[]):(0,a.RuleFail)("Fail_4",[s,u],[]):null:(0,a.RulePass)("Pass_0",[s]):s?(0,a.RulePotential)("Potential_5"):(0,a.RulePotential)("Potential_6"):(0,a.RuleFail)("Fail_1"):s?s&&u&&s!==u?r.LangUtil.validPrimaryLang(s)&&r.LangUtil.validPrimaryLang(u)?r.LangUtil.matchPrimaryLang(s,u)?(0,a.RuleFail)("Fail_5",[s,u],[]):(0,a.RuleFail)("Fail_4",[s,u],[]):null:(0,a.RulePass)("Pass_0",[s]):(0,a.RuleFail)("Fail_3")}}},8260(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.html_skipnav_exists=void 0;var a=i(461),n=i(461),l=i(7139),r=i(5279);t.html_skipnav_exists={id:"html_skipnav_exists",context:"dom:html",refactor:{RPT_Html_SkipNav:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{group:"html_skipnav_exists.html",Pass_0:"html_skipnav_exists.html",Potential_1:"html_skipnav_exists.html"}},messages:{"en-US":{group:"Provide a way to bypass blocks of content that are repeated on multiple Web pages",Pass_0:"Rule Passed",Potential_1:"Verify there is a way to bypass blocks of content that are repeated on multiple Web pages"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"2.4.1",level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,o=!1,s=l.CommonUtil.getDocElementsByTag(n,"frame"),u=l.CommonUtil.getDocElementsByTag(n,"h1");if(null!=s&&s.length>0||null!=u&&u.length>0)o=!0;else for(var d=l.CommonUtil.getDocElementsByTag(n,"a"),c={},m=0;!o&&m<d.length;++m)if(d[m].hasAttribute("href")){var p=d[m].href;"string"!=typeof p&&(p=p.baseVal?p.baseVal:"");var h,g="";if((h=void 0!==n.ownerDocument.locationFromDAP&&null!=n.ownerDocument.locationFromDAP?n.ownerDocument.locationFromDAP:n.ownerDocument.location)&&(g=h.href),p.startsWith("file:///")&&(p="file:/"+p.substring(8)),g.startsWith("file:///")&&(g="file:/"+g.substring(8)),"#"==p.charAt(0)||p.startsWith(g+"#")){var b=l.CommonUtil.getFileAnchor(p);null!=r.FragmentUtil.getById(n,b)?o=!0:c[b]=!0}}else if(d[m].hasAttribute("name")){var _=d[m].getAttribute("name");-1!=_.indexOf("#")&&(_=l.CommonUtil.getFileAnchor(_)),o=_ in c}return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},8920(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.iframe_interactive_tabbable=void 0;var a=i(7139),n=i(461),l=i(461),r=i(3946),o=i(7507);t.iframe_interactive_tabbable={id:"iframe_interactive_tabbable",context:"dom:iframe",dependencies:[],help:{"en-US":{group:"iframe_interactive_tabbable.html",pass:"iframe_interactive_tabbable.html",fail_invalid:"iframe_interactive_tabbable.html"}},messages:{"en-US":{group:"Iframe with interactive content should not be excluded from tab order using tabindex",pass:"The iframe with interactive content is not excluded from the tab order using tabindex",fail_invalid:"The <iframe> with interactive content is excluded from tab order using tabindex"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:["akn7bn"],run:function(e,t,i){var l=e.dom.node;if(!r.VisUtil.isNodeHiddenFromAT(l)&&!a.CommonUtil.isNodeDisabled(l)){var s=(new o.DOMMapper).getUnadjustedBounds(l);if(!s)return null;if(Math.max(s.height,s.width)<30||Math.min(s.height,s.width)<15)return null;if(!l.hasAttribute("tabindex")||parseInt(l.getAttribute("tabindex"))>=0)return(0,n.RulePass)("pass");var u=l;return u&&u.contentDocument&&u.contentDocument.documentElement&&a.CommonUtil.getTabbableChildren(l)>0?(0,n.RuleFail)("fail_invalid"):null}}}},1237(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.imagebutton_alt_exists=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139);t.imagebutton_alt_exists={id:"imagebutton_alt_exists",context:"dom:input",refactor:{WCAG20_Input_ExplicitLabelImage:{Pass_0:"Pass_0",Pass_1:"Pass_1",Pass_2:"Pass_2",Fail:"Fail"}},help:{"en-US":{Pass_0:"imagebutton_alt_exists.html",Pass_1:"imagebutton_alt_exists.html",Pass_2:"imagebutton_alt_exists.html",Fail:"imagebutton_alt_exists.html",group:"imagebutton_alt_exists.html"}},messages:{"en-US":{Pass_0:"Image button provides alternative text using the 'alt' attribute",Pass_1:"Image button provides alternative text using an ARIA label",Pass_2:"Image button provides alternative text using the 'title' attribute",Fail:'The <input> element of type "image" has no text alternative',group:'The <input> element of type "image" should have a text alternative'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:"59796f",run:function(e,t,i){var n=e.dom.node;return n.hasAttribute("type")&&"image"==n.getAttribute("type").toLowerCase()?r.CommonUtil.attributeNonEmpty(n,"alt")?(0,a.RulePass)("Pass_0"):l.AriaUtil.hasAriaLabel(n)?(0,a.RulePass)("Pass_1"):n.hasAttribute("title")&&n.getAttribute("title").length>0?(0,a.RulePass)("Pass_2"):(0,a.RuleFail)("Fail"):null}}},4101(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.imagemap_alt_exists=void 0;var a=i(461),n=i(461),l=i(7139),r=i(3946);t.imagemap_alt_exists={id:"imagemap_alt_exists",context:"dom:img[usemap], dom:img[ismap]",refactor:{HAAC_Img_UsemapAlt:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"imagemap_alt_exists.html",Fail_1:"imagemap_alt_exists.html",group:"imagemap_alt_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Image map or child <area> has no text alternative",group:"An image map and each <area> element in an image map must have text alternative(s)"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;return r.VisUtil.isNodeHiddenFromAT(n)?null:l.CommonUtil.attributeNonEmpty(n,"alt")||!n.hasAttribute("ismap")&&!l.CommonUtil.attributeNonEmpty(n,"usemap")?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},275(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.img_alt_background=void 0;var a=i(461),n=i(461),l=i(3946);t.img_alt_background={id:"img_alt_background",context:"dom:*",refactor:{HAAC_BackgroundImg_HasTextOrTitle:{Pass_0:"Pass_0",Manual_1:"Manual_1"}},help:{"en-US":{Pass_0:"img_alt_background.html",Manual_1:"img_alt_background.html",group:"img_alt_background.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Manual_1:"Verify important background image information has a text alternative in system high contrast mode",group:"Background images that convey important information must have a text alternative that describes the image"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var r=n.ownerDocument.defaultView.getComputedStyle(n);if(null==r)return(0,a.RulePass)("Pass_0");var o=r.backgroundImage,s=!0;if(null!=o&&""!=o&&"none"!=o&&"inherit"!=o)if(null!=n.innerHTML&&0!=n.innerHTML.trim().length)s=!1;else{var u=n.getAttribute("title");null!=u&&0!=u.length&&(s=!1)}return s?(0,a.RulePass)("Pass_0"):s?void 0:(0,a.RuleManual)("Manual_1")}}},7601(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.img_alt_decorative=void 0;var a=i(461),n=i(461),l=i(7011),r=i(3946);t.img_alt_decorative={id:"img_alt_decorative",context:"dom:img[alt]",refactor:{WCAG20_Img_PresentationImgHasNonNullAlt:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"img_alt_decorative.html",Fail_1:"img_alt_decorative.html",group:"img_alt_decorative.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Image designated as decorative has non-null 'alt' attribute",group:'Image designated as decorative must have \'alt=""'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var o=!0;return(l.AriaUtil.hasRole(n,"presentation")||l.AriaUtil.hasRole(n,"none"))&&(o=0==n.getAttribute("alt").length),o?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},7541(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.img_alt_misuse=void 0;var a=i(461),n=i(461),l=i(3946);t.img_alt_misuse={id:"img_alt_misuse",context:"dom:img, dom:area, dom:input",refactor:{RPT_Img_AltCommonMisuse:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"img_alt_misuse.html",Potential_1:"img_alt_misuse.html",group:"img_alt_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that the file name serves as a good inline replacement for the image",group:"'alt' attribute value must be a good inline replacement for the image"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var r=n.nodeName.toLowerCase(),o=!0;if(n.hasAttribute("alt")){var s=n.getAttribute("alt").trim();if(s.length>0){for(var u=["short description"],d=0;o&&d<u.length;++d)o=-1==s.indexOf(u[d]);if(o){var c=n.getAttribute("area"==r?"href":"src");null!=c&&(o=c.trim()!=s&&(-1==s.indexOf(".")||-1==s.indexOf(c)&&-1==c.indexOf(s)))}}}return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},8274(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.img_alt_null=void 0;var a=i(461),n=i(461),l=i(3946),r=i(7011),o=i(7139);t.img_alt_null={id:"img_alt_null",context:"dom:img[alt]",refactor:{WCAG20_Img_TitleEmptyWhenAltNull:{Pass_0:"pass",Fail_1:"fail_decorative"}},help:{"en-US":{pass:"img_alt_null.html",fail_decorative:"img_alt_null.html",potential_aria_override:"img_alt_null.html",group:"img_alt_null.html"}},messages:{"en-US":{pass:"Neither 'aria' nor 'title' attributes are used for the decorative image",fail_decorative:"The image 'alt' attribute is empty, but the 'title' attribute is not empty",potential_aria_override:"The image 'alt' attribute is empty, but the 'aria' label is not empty and overrides the 'alt' attribute",group:"When the intent is to mark an image as decorative with an empty 'alt' attribute, the 'aria' or 'title' attributes should not be used"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE,reasonCodes:["fail_decorative"]},{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["ARIA"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE,reasonCodes:["potential_aria_override"]}],act:[{"46ca7f":{potential_aria_override:"fail"}}],run:function(e,t,i){var n=e.dom.node;return l.VisUtil.isNodeHiddenFromAT(n)||n.getAttribute("alt").trim().length>0?null:r.AriaUtil.getAriaLabel(n).length>0?(0,a.RulePotential)("potential_aria_override"):o.CommonUtil.attributeNonEmpty(n,"title")?(0,a.RuleFail)("fail_decorative"):(0,a.RulePass)("pass")}}},590(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.img_alt_redundant=void 0;var a=i(461),n=i(461),l=i(3864),r=i(7139);t.img_alt_redundant={id:"img_alt_redundant",context:"dom:img[alt]",refactor:{WCAG20_Img_LinkTextNotRedundant:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{Pass_0:"img_alt_redundant.html",Fail_1:"img_alt_redundant.html",Fail_2:"img_alt_redundant.html",Fail_3:"img_alt_redundant.html",group:"img_alt_redundant.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Link text is repeated in an image 'alt' value within the same link",Fail_2:"Link text of previous link is repeated in image 'alt' value of a link",Fail_3:"Image 'alt' value within a link is repeated in link text of the link after",group:"The text alternative for an image within a link should not repeat the link text or adjacent link text"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1","2.4.4"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node,o=r.CommonUtil.getAncestor(n,"a");if(null==o)return null;var s=n.getAttribute("alt").trim().toLowerCase();if(0==s.length)return null;var u=o.innerText,d="";if(null!=u&&(d=u.trim().toLowerCase()),!(d.length>0)){for(var c=!0,m=new l.DOMWalker(o);c&&m.prevNode()&&!("#text"==(h=(p=m.node).nodeName.toLowerCase())&&p.nodeValue.length>0||"img"==h&&r.CommonUtil.attributeNonEmpty(p,"alt"));)"a"!==h||r.CommonUtil.shouldNodeBeSkippedHidden(p)||(c=(p.innerText||p.textContent||"").trim().toLowerCase()!=s);if(!c)return(0,a.RuleFail)("Fail_2");for(m=new l.DOMWalker(o,!0);c&&m.nextNode();){var p,h;if("#text"==(h=(p=m.node).nodeName.toLowerCase())&&p.nodeValue.length>0||"img"==h&&r.CommonUtil.attributeNonEmpty(p,"alt"))break;"a"!=h||r.CommonUtil.shouldNodeBeSkippedHidden(p)||(c=p.innerText.trim().toLowerCase()!=s)}return c?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_3")}return s==d?(0,a.RuleFail)("Fail_1"):void 0}}},8925(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.img_alt_valid=void 0;var a=i(461),n=i(461),l=i(7011),r=i(3946),o=i(1950);t.img_alt_valid={id:"img_alt_valid",context:"dom:img",refactor:{WCAG20_Img_HasAlt:{pass:"pass",fail_blank_alt:"fail_blank_alt",fail_no_alt:"fail_no_alt",fail_blank_title:"fail_blank_title"}},help:{"en-US":{pass:"img_alt_valid.html",fail_blank_alt:"img_alt_valid.html",fail_no_alt:"img_alt_valid.html",fail_blank_title:"img_alt_valid.html",group:"img_alt_valid.html"}},messages:{"en-US":{pass:"The image has an accessible name or is correctly marked as decorative or redundant",fail_blank_alt:"Image 'alt' attribute value consists only of blank space(s)",fail_no_alt:"The image has neither an accessible name nor is marked as decorative or redundant",fail_blank_title:"The image does not have an 'alt' attribute or ARIA label, and the 'title' attribute value consists only of blank space(s)",group:"Images must have accessible names unless they are decorative or redundant"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:"23a2a8",run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n)||o.AccNameUtil.isAccessibleNameIgnorable(n))return null;if(0!==l.AriaUtil.getAriaLabel(n).trim().length)return(0,a.RulePass)("pass");var s=n.hasAttribute("alt")?n.getAttribute("alt"):null;if(null!==s)return 0===s.length||s.trim().length>0?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_blank_alt");var u=n.hasAttribute("title")?n.getAttribute("title"):null;if(null!==u&&0!==u.length)return 0===u.trim().length?(0,a.RuleFail)("fail_blank_title"):(0,a.RulePass)("pass");if(null===s){var d=l.AriaUtil.getResolvedRole(n,!1);return"presentation"===d||"none"===d?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_no_alt")}return 0===s.length?(0,a.RulePass)("pass"):void 0}}},9234(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.img_ismap_misuse=void 0;var a=i(461),n=i(461),l=i(7139),r=i(3946);t.img_ismap_misuse={id:"img_ismap_misuse",context:"dom:img[ismap]",refactor:{RPT_Img_UsemapValid:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"img_ismap_misuse.html",Potential_1:"img_ismap_misuse.html",group:"img_ismap_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Server-side image map hot-spots do not have duplicate text links",group:"Server-side image map hot-spots must have duplicate text links"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var o=!1;if(n.hasAttribute("usemap")){var s=n.getAttribute("usemap"),u=(s=s.trim().toLowerCase()).indexOf("#");if(-1!=u&&(s=s.substr(u+1)),s.length>0)for(var d=l.CommonUtil.getDocElementsByTag(n,"map"),c=0;!o&&c<d.length;++c)o=d[c].hasAttribute("name")&&d[c].getAttribute("name").toLowerCase()==s}return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},8617(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.img_longdesc_misuse=void 0;var a=i(461),n=i(461),l=i(7139),r=i(3946);t.img_longdesc_misuse={id:"img_longdesc_misuse",context:"dom:img[longdesc]",refactor:{RPT_Img_LongDescription2:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"img_longdesc_misuse.html",Potential_1:"img_longdesc_misuse.html",group:"img_longdesc_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that the file designated by the 'longdesc' attribute contains valid HTML content (file extension not recognized)",group:" The 'longdesc' attribute must reference HTML content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var o=n.getAttribute("longdesc"),s=l.CommonUtil.getFileExt(o),u=0!=s.length&&l.CommonUtil.isHtmlExt(s)||o.startsWith("#")||o.startsWith("http://")||o.startsWith("https://")||o.startsWith("data:");return u?(0,a.RulePass)("Pass_0"):u?void 0:(0,a.RulePotential)("Potential_1")}}},591(e,t,i){var a=this&&this.__createBinding||(Object.create?function(e,t,i,a){void 0===a&&(a=i);var n=Object.getOwnPropertyDescriptor(t,i);n&&!("get"in n?!t.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,a,n)}:function(e,t,i,a){void 0===a&&(a=i),e[a]=t[i]}),n=this&&this.__exportStar||function(e,t){for(var i in e)"default"===i||Object.prototype.hasOwnProperty.call(t,i)||a(t,e,i)};Object.defineProperty(t,"__esModule",{value:!0}),n(i(2297),t),n(i(4401),t),n(i(4546),t),n(i(9292),t),n(i(9605),t),n(i(3987),t),n(i(8631),t),n(i(8025),t),n(i(1198),t),n(i(8001),t),n(i(5778),t),n(i(8118),t),n(i(2242),t),n(i(3673),t),n(i(5080),t),n(i(183),t),n(i(6805),t),n(i(1886),t),n(i(4078),t),n(i(5750),t),n(i(85),t),n(i(514),t),n(i(5310),t),n(i(9083),t),n(i(6049),t),n(i(5099),t),n(i(2759),t),n(i(3141),t),n(i(5131),t),n(i(5167),t),n(i(8115),t),n(i(5733),t),n(i(5782),t),n(i(6731),t),n(i(390),t),n(i(3900),t),n(i(1218),t),n(i(6734),t),n(i(9973),t),n(i(5711),t),n(i(3384),t),n(i(2762),t),n(i(5757),t),n(i(5232),t),n(i(1891),t),n(i(6142),t),n(i(4863),t),n(i(1440),t),n(i(1968),t),n(i(1617),t),n(i(3475),t),n(i(3370),t),n(i(9272),t),n(i(7735),t),n(i(3923),t),n(i(7521),t),n(i(1852),t),n(i(799),t),n(i(4614),t),n(i(5952),t),n(i(5395),t),n(i(1992),t),n(i(7955),t),n(i(9531),t),n(i(891),t),n(i(7446),t),n(i(6137),t),n(i(6839),t),n(i(8135),t),n(i(507),t),n(i(3566),t),n(i(5173),t),n(i(6027),t),n(i(7515),t),n(i(1704),t),n(i(5053),t),n(i(4681),t),n(i(8050),t),n(i(2644),t),n(i(429),t),n(i(4617),t),n(i(5460),t),n(i(3399),t),n(i(3498),t),n(i(9629),t),n(i(733),t),n(i(9797),t),n(i(7156),t),n(i(3062),t),n(i(3827),t),n(i(5498),t),n(i(510),t),n(i(7722),t),n(i(4597),t),n(i(2104),t),n(i(8260),t),n(i(8920),t),n(i(1237),t),n(i(4101),t),n(i(275),t),n(i(7601),t),n(i(7541),t),n(i(8274),t),n(i(590),t),n(i(8925),t),n(i(9234),t),n(i(8617),t),n(i(1939),t),n(i(7726),t),n(i(3142),t),n(i(1353),t),n(i(2631),t),n(i(8550),t),n(i(8853),t),n(i(3180),t),n(i(1382),t),n(i(953),t),n(i(2222),t),n(i(4678),t),n(i(7578),t),n(i(9964),t),n(i(6401),t),n(i(1174),t),n(i(9907),t),n(i(6032),t),n(i(5622),t),n(i(2240),t),n(i(4019),t),n(i(361),t),n(i(5960),t),n(i(5515),t),n(i(8752),t),n(i(8834),t),n(i(1025),t),n(i(9116),t),n(i(435),t),n(i(6640),t),n(i(2068),t),n(i(7322),t),n(i(5702),t),n(i(1961),t),n(i(3022),t),n(i(375),t),n(i(4658),t),n(i(4605),t),n(i(5294),t),n(i(3506),t),n(i(7475),t),n(i(8064),t),n(i(7942),t),n(i(2219),t),n(i(1473),t),n(i(1912),t),n(i(6539),t),n(i(4),t),n(i(5334),t),n(i(2173),t),n(i(8349),t),n(i(8142),t),n(i(3980),t),n(i(4701),t),n(i(18),t),n(i(9314),t),n(i(1667),t),n(i(9599),t),n(i(4672),t),n(i(4353),t),n(i(7147),t),n(i(1419),t),n(i(855),t),n(i(3420),t),n(i(408),t)},1939(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_autocomplete_valid=void 0;var a=i(461),n=i(461),l=i(7139),r=i(3946);t.input_autocomplete_valid={id:"input_autocomplete_valid",context:"dom:input[autocomplete], dom:textarea[autocomplete], dom:select[autocomplete]",refactor:{WCAG21_Input_Autocomplete:{Pass_0:"pass",Fail_1:"fail_inappropriate",Fail_2:"fail_invalid",Fail_attribute_incorrect:"fail_incorrect"}},help:{"en-US":{group:"input_autocomplete_valid.html",pass:"input_autocomplete_valid.html",fail_inappropriate:"input_autocomplete_valid.html",fail_invalid:"input_autocomplete_valid.html",fail_incorrect:"input_autocomplete_valid.html"}},messages:{"en-US":{group:"The 'autocomplete' attribute's token(s) must be appropriate for the input form field",pass:"The 'autocomplete' attribute's token(s) is appropriate for the input form field",fail_inappropriate:"The 'autocomplete' attribute's token(s) are not appropriate for the input form field",fail_invalid:"The 'autocomplete' attribute's token(s) are not appropriate for an input form field of any type",fail_incorrect:"The 'autocomplete' attribute has an incorrect value"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.5"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[{"73f2c2":{pass:"pass",fail_inappropriate:"fail",fail_invalid:"pass",fail_incorrect:"fail"}}],run:function(e,t,i){var n=e.dom.node;if(!r.VisUtil.isNodeVisible(n)||l.CommonUtil.isNodeDisabled(n))return null;var o=n.getAttribute("autocomplete").trim().toLowerCase(),s=o.split(/\s+/);if(0===s.length||0===o.length)return null;var u={tokensOnOff:["on","off"],tokenOptionalSection:"section-",tokensOptionalPurpose:["shipping","billing"],tokensMandatoryGroup1_password:["new-password","current-password","one-time-code"],tokensMandatoryGroup1_multiline:["street-address"],tokensMandatoryGroup1_month:["cc-exp"],tokensMandatoryGroup1_numeric:["cc-exp-month","cc-exp-year","transaction-amount","bday-day","bday-month","bday-year"],tokensMandatoryGroup1_date:["bday"],tokensMandatoryGroup1_url:["url","photo"],tokensMandatoryGroup1_text:["name","honorific-prefix","given-name","additional-name","family-name","honorific-suffix","nickname","username","organization-title","organization","address-line1","address-line2","address-line3","address-level4","address-level3","address-level2","address-level1","country","country-name","postal-code","cc-name","cc-given-name","cc-additional-name","cc-family-name","cc-number","cc-csc","cc-type","transaction-currency","language","sex"],tokensMandatoryGroup1_all:["name","honorific-prefix","given-name","additional-name","family-name","honorific-suffix","nickname","username","new-password","current-password","organization-title","organization","street-address","address-line1","address-line2","address-line3","address-level4","address-level3","address-level2","address-level1","country","country-name","postal-code","cc-name","cc-given-name","cc-additional-name","cc-family-name","cc-number","cc-exp","cc-exp-month","cc-exp-year","cc-csc","cc-type","transaction-currency","transaction-amount","language","bday","bday-day","bday-month","bday-year","sex","url","photo"],tokensOptionalGroup2:["home","work","mobile","fax","pager"],tokensMandatoryGroup2_tel:["tel"],tokensMandatoryGroup2_email:["email"],tokensMandatoryGroup2_url:["impp"],tokensMandatoryGroup2_text:["tel-country-code","tel-national","tel-area-code","tel-local","tel-local-prefix","tel-local-suffix","tel-extension"],tokensMandatoryGroup2_all:["tel","tel-country-code","tel-national","tel-area-code","tel-local","tel-local-prefix","tel-local-suffix","tel-extension","email","impp"],tokensOptionGroup1_webauthn:["webauthn"]},d=[];for(var c in u)d=d.concat(u[c]);var m=!1,p=!0,h=n.nodeName.toLowerCase();if(!s.every(function(e){return d.includes(e)||e.startsWith(u.tokenOptionalSection)}))return(0,a.RuleFail)("fail_incorrect");var g=n.hasAttribute("type")?n.getAttribute("type").trim().toLowerCase():"text",b=[],_=[],f=[];if("textarea"===h||"select"===h)b=u.tokensMandatoryGroup1_all,_=u.tokensMandatoryGroup2_all,"textarea"===h&&(f=u.tokensOptionGroup1_webauthn);else{if("input"!==h)return null;switch(f=u.tokensOptionGroup1_webauthn,g){case"text":case"search":b=u.tokensMandatoryGroup1_text.concat(u.tokensMandatoryGroup1_password,u.tokensMandatoryGroup1_url,u.tokensMandatoryGroup1_numeric,u.tokensMandatoryGroup1_month,u.tokensMandatoryGroup1_date),_=u.tokensMandatoryGroup2_all;break;case"password":b=u.tokensMandatoryGroup1_password;break;case"url":b=u.tokensMandatoryGroup1_url,_=u.tokensMandatoryGroup2_url;break;case"email":_=u.tokensMandatoryGroup2_email;break;case"tel":_=u.tokensMandatoryGroup2_tel;break;case"number":b=u.tokensMandatoryGroup1_numeric;break;case"month":b=u.tokensMandatoryGroup1_month;break;case"date":b=u.tokensMandatoryGroup1_date;break;default:return null}}if(s.includes("on")||s.includes("off"))return 1===s.length?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_invalid");var v=0,A=0;return s[v].startsWith(u.tokenOptionalSection)&&s[v].length>8&&(v++,A++),s.length>v&&u.tokensOptionalPurpose.includes(s[v])&&(v++,A++),s.length>v&&(b.includes(s[v])?(m=!0,v++):(u.tokensOptionalGroup2.includes(s[v])&&v++,_.includes(s[v])&&(m=!0,v++))),s.length>A&&(u.tokensMandatoryGroup1_all.includes(s[A])?(p=!0,A++):(u.tokensOptionalGroup2.includes(s[A])&&A++,u.tokensMandatoryGroup2_all.includes(s[A])&&(p=!0,A++))),s.length>v+A&&f.includes(s[v+A])&&v++,(s.length>v&&f.includes(s[v])||s.length>A&&f.includes(s[A]))&&(v++,A++),m&&s.length===v?(0,a.RulePass)("pass"):p&&s.length===A?(0,a.RuleFail)("fail_incorrect"):(0,a.RuleFail)("fail_inappropriate")}}},7726(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_checkboxes_grouped=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(3864),s=i(4566),u=i(3946),d=i(9196);t.input_checkboxes_grouped={id:"input_checkboxes_grouped",context:"dom:input[type=radio], dom:input[type=checkbox]",refactor:{WCAG20_Input_RadioChkInFieldSet:{Pass_LoneNogroup:"pass_lonenogroup",Pass_Grouped:"pass_grouped",Pass_RadioNoName:"pass_radioNoName",Fail_ControlNameMismatch:"fail_controlnamemismatch",Fail_NotGroupedOtherGrouped:"fail_notgroupedothergrouped",Fail_NotGroupedOtherNotGrouped:"fail_notgroupedothernotgrouped",Fail_NotSameGroup:"fail_notsamegroup",Potential_LoneCheckbox:"potential_lonecheckbox",Potential_UnnamedCheckbox:"potential_unnamedcheckbox"}},help:{"en-US":{group:"input_checkboxes_grouped.html",pass_lonenogroup:"input_checkboxes_grouped.html",pass_grouped:"input_checkboxes_grouped.html",pass_radiononame:"input_checkboxes_grouped.html",fail_controlnamemismatch:"input_checkboxes_grouped.html",fail_notgroupedothergrouped:"input_checkboxes_grouped.html",fail_notgroupedothernotgrouped:"input_checkboxes_grouped.html",fail_notsamegroup:"input_checkboxes_grouped.html",potential_lonecheckbox:"input_checkboxes_grouped.html",potential_unnamedcheckbox:"input_checkboxes_grouped.html"}},messages:{"en-US":{group:"Related sets of radio buttons or checkboxes should be programmatically grouped",pass_lonenogroup:"{0} grouping not required for a control of this type",pass_grouped:"{0} input is grouped with other related controls with the same name",pass_radiononame:"Radio input is not grouped, but passes because it has no name to group with other radio inputs",fail_controlnamemismatch:'{0} input found that has the same name, "{2}" as a {1} input',fail_notgroupedothergrouped:'{0} input is not in the group with another {0} with the name "{1}"',fail_notgroupedothernotgrouped:'{0} input and others with the name "{1}" are not grouped together',fail_notsamegroup:'{0} input is in a different group than another {0} with the name "{1}"',potential_lonecheckbox:"Verify that this ungrouped checkbox input is not related to other checkboxes",potential_unnamedcheckbox:"Verify that this un-named, ungrouped checkbox input is not related to other checkboxes"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node;if(u.VisUtil.isNodeHiddenFromAT(n))return null;var c=function(e){var t=r.CommonUtil.getAncestor(e,"fieldset")||l.AriaUtil.getAncestorWithRole(e,"radiogroup")||l.AriaUtil.getAncestorWithRole(e,"group")||l.AriaUtil.getAncestorWithRole(e,"grid")||l.AriaUtil.getAncestorWithRole(e,"table");return t||(t=r.CommonUtil.getAncestor(e,"table"))&&!d.TableUtil.isDataTable(t)&&(t=null),t},m=n.getAttribute("type").toLowerCase(),p=l.AriaUtil.getAncestorWithRole(n,"form")||r.CommonUtil.getAncestor(n,"html")||n.ownerDocument.documentElement,h=s.CacheUtil.getCache(p,"input_checkboxes_grouped",null);if(!h){h={checkboxByName:{},radiosByName:{},nameToGroup:{},numCheckboxes:0,numRadios:0};for(var g=new o.DOMWalker(p,!1,p,!0),b=[],_=[];g.nextNode();)if(!g.bEndTag&&1===g.node.nodeType&&"input"===g.node.nodeName.toLowerCase()&&u.VisUtil.isNodeVisible(g.node)){var f=g.node.getAttribute("type");"checkbox"===f?b.push(g.node):"radio"===f&&_.push(g.node)}for(var v=0;v<b.length;++v){var A=b[v];if((l.AriaUtil.getAncestorWithRole(A,"form")||r.CommonUtil.getAncestor(n,"html")||n.ownerDocument.documentElement)===p&&!r.CommonUtil.shouldNodeBeSkippedHidden(A)){var w=A.getAttribute("name")||"";(h.checkboxByName[w]=h.checkboxByName[w]||[]).push(A),h.nameToGroup[w]=h.nameToGroup[w]||c(A),++h.numCheckboxes}}for(v=0;v<_.length;++v){var y=_[v];if((l.AriaUtil.getAncestorWithRole(y,"form")||r.CommonUtil.getAncestor(n,"html")||n.ownerDocument.documentElement)===p&&!r.CommonUtil.shouldNodeBeSkippedHidden(y)){var C=y.getAttribute("name")||"";(h.radiosByName[C]=h.radiosByName[C]||[]).push(y),h.nameToGroup[C]=h.nameToGroup[C]||c(y),++h.numRadios}}s.CacheUtil.setCache(p,"input_checkboxes_grouped",h)}var k=n.getAttribute("name"),R=c(n);if(m="radio"===m?"Radio":"Checkbox",k&&""!==k){var x=(h.radiosByName[k]||[]).length,P=(h.checkboxByName[k]||[]).length;return x>0&&P>0?(0,a.RuleFail)("fail_controlnamemismatch",[m,"checkbox"===m?"radio":"checkbox",k]):"Radio"===m&&(1===h.numRadios||1===x)||"Checkbox"===m&&1===h.numCheckboxes?null===R?(0,a.RulePass)("pass_lonenogroup",[m]):(0,a.RulePass)("pass_grouped",[m]):"Checkbox"===m&&h.numCheckboxes>1&&1===P?null===R?(0,a.RulePotential)("potential_lonecheckbox",[m]):(0,a.RulePass)("pass_grouped",[m]):null===R?null!==h.nameToGroup[k]?(0,a.RuleFail)("fail_notgroupedothergrouped",[m,k]):(0,a.RuleFail)("fail_notgroupedothernotgrouped",[m,k]):h.nameToGroup[k]!==R?(0,a.RuleFail)("fail_notsamegroup",[m,k]):(0,a.RulePass)("pass_grouped",[m])}return"Radio"===m?null===R?(0,a.RulePass)("pass_radiononame",[m]):(0,a.RulePass)("pass_grouped",[m]):null===R?(h.checkboxByName[""]||[]).length>1?(0,a.RulePotential)("potential_unnamedcheckbox",[m]):(0,a.RulePass)("pass_lonenogroup",[m]):(0,a.RulePass)("pass_grouped",[m])}}},3142(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_fields_grouped=void 0;var a=i(461),n=i(461),l=i(7139);t.input_fields_grouped={id:"input_fields_grouped",context:"dom:input, dom:textarea, dom:select",refactor:{WCAG20_Input_InFieldSet:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"input_fields_grouped.html",Potential_1:"input_fields_grouped.html",group:"input_fields_grouped.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Use the <fieldset> element to group logically related input elements",group:"Groups of logically related input elements should be contained within a <fieldset> element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node;if("input"==n.nodeName.toLowerCase()&&n.hasAttribute("type")&&"text"!=(m=n.getAttribute("type").toLowerCase())&&"file"!=m&&"password"!=m)return(0,a.RulePass)("Pass_0");if(null!=l.CommonUtil.getAncestor(n,"fieldset"))return(0,a.RulePass)("Pass_0");for(var r=l.CommonUtil.getAncestor(n,["form","body"]),o=["input","textarea","select"],s=!0,u=0;s&&u<o.length;++u)for(var d=r.getElementsByTagName(o[u]),c=0;s&&c<d.length;++c)if(!l.CommonUtil.shouldNodeBeSkippedHidden(d[c])){var m=d[c].hasAttribute("type")?d[c].getAttribute("type").toLowerCase():"text";s=d[c]==n||"text"!=m&&"password"!=m&&"file"!=m}return s?(0,a.RulePass)("Pass_0"):s?void 0:(0,a.RulePotential)("Potential_1")}}},1353(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_haspopup_conflict=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(3946);t.input_haspopup_conflict={id:"input_haspopup_conflict",context:"dom:input[list][aria-haspopup]",refactor:{input_haspopup_invalid:{Potential_1:"potential_type_misuse",Potential_2:"potential_misuse"}},help:{"en-US":{group:"input_haspopup_conflict.html",potential_type_misuse:"input_haspopup_conflict.html",potential_misuse:"input_haspopup_conflict.html",potential_list_notexist:"input_haspopup_conflict.html",fail_invalid_list_type:"input_haspopup_conflict.html",fail_invalid_list_elem:"input_haspopup_conflict.html"}},messages:{"en-US":{group:"<input> element with a 'list' attribute should not use an explicit 'aria-haspopup' attribute",potential_type_misuse:"The <input> element with type \"{0}\" and 'list' attribute uses an explicit 'aria-haspopup' attribute",potential_misuse:"The <input> element with a missing or invalid type and 'list' attribute uses an explicit 'aria-haspopup' attribute",potential_list_notexist:"The list attribute for the <input> element is invalid",fail_invalid_list_type:'The list attribute for the <input> element with the type "{0}" is invalid',fail_invalid_list_elem:"The list attribute for the <input> element does not reference a datalist element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(o.VisUtil.isNodeHiddenFromAT(n)||r.CommonUtil.isNodeDisabled(n))return null;var s=l.AriaUtil.getUserDefinedRoles(n);if(s&&s.length>0&&!s.includes("combobox"))return null;var u=["text","search","tel","url","email","date","month","week","time","datetime-local","number","range","color"],d=["file","password","checkbox","radio","submit","reset","image","hidden","button"],c=n.getAttribute("type");if(!c||0===c.trim().length)return(0,a.RulePotential)("potential_misuse");if(c=c.trim().toLowerCase(),!u.includes(c)&&!d.includes(c))return(0,a.RulePotential)("potential_misuse");if(c&&d.includes(c))return(0,a.RuleFail)("fail_invalid_list_type");var m=n.getAttribute("list");if(!m||0===m.trim().length)return(0,a.RulePotential)("potential_list_notexist");var p=n.ownerDocument.getElementById(m);return p?"datalist"!==p.nodeName.toLowerCase()?(0,a.RuleFail)("fail_invalid_list_elem"):u.includes(c)?(0,a.RulePotential)("potential_type_misuse",[c]):void 0:(0,a.RuleFail)("potential_list_notexist")}}},2631(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_label_after=void 0;var a=i(461),n=i(461),l=i(3864),r=i(7139);t.input_label_after={id:"input_label_after",context:"dom:input",refactor:{WCAG20_Input_LabelAfter:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_0:"input_label_after.html",Fail_1:"input_label_after.html",Fail_2:"input_label_after.html",group:"input_label_after.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Checkbox or radio button is nested in label, so label is not after the input control",Fail_2:"Label text is located before its associated checkbox or radio button element",group:"Checkboxes and radio buttons must have a label after the input control"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.3.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,o="";if(n.hasAttribute("type")&&(o=n.getAttribute("type").toLowerCase()),"checkbox"!=o&&"radio"!=o)return null;var s=r.CommonUtil.getLabelForElementHidden(n,!0);if(null===s||!r.CommonUtil.hasInnerContentHidden(s))return null;var u,d=r.CommonUtil.compareNodeOrder(s,n);if(-2===d){u=!1;var c=new l.DOMWalker(s);for(c.node=n;!u&&c.nextNode();)u="#text"===c.node.nodeName.toLowerCase()&&c.node.nodeValue.trim().length>0||"span"===c.node.nodeName.toLowerCase()&&c.node.textContent.trim().length>0;if(!u)return(0,a.RuleFail)("Fail_1")}else if(1!=d)return(0,a.RuleFail)("Fail_2");return(0,a.RulePass)("Pass_0")}}},8550(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_label_before=void 0;var a=i(461),n=i(461),l=i(7139);t.input_label_before={id:"input_label_before",context:"dom:input, dom:textarea, dom:select",refactor:{WCAG20_Input_LabelBefore:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_0:"input_label_before.html",Fail_1:"input_label_before.html",Fail_2:"input_label_before.html",group:"input_label_before.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Text input is nested in label such that input precedes the label text",Fail_2:"Label text is located after its associated text input or <select> element",group:"Text inputs and <select> elements must have a label before the input control"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.3.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if("input"==n.nodeName.toLowerCase()&&n.hasAttribute("type")){var r=n.getAttribute("type").toLowerCase();if("text"!=r&&"file"!=r&&"password"!=r)return null}var o=l.CommonUtil.getLabelForElementHidden(n,!0);if(null==o||!l.CommonUtil.hasInnerContentHidden(o))return null;var s=l.CommonUtil.compareNodeOrder(o,n);if(-2===s){var u=l.CommonUtil.getInnerText(n);if(u&&u.trim().length>0&&l.CommonUtil.getInnerText(n).trim()===u.trim())return null;for(var d=!1,c=n.previousSibling;!d&&null!==c;)d="#text"==c.nodeName.toLowerCase()&&c.nodeValue.trim().length>0||"span"==c.nodeName.toLowerCase()&&c.textContent.trim().length>0,c=c.previousSibling;if(!d)return(0,a.RuleFail)("Fail_1")}else if(-1!=s)return(0,a.RuleFail)("Fail_2");return(0,a.RulePass)("Pass_0")}}},8853(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_label_exists=void 0;var a=i(461),n=i(461),l=i(7011),r=i(3946),o=i(1950);t.input_label_exists={id:"input_label_exists",context:"aria:button,aria:checkbox,aria:combobox,aria:listbox,aria:menuitemcheckbox,aria:menuitemradio,aria:radio,aria:searchbox,aria:slider,aria:spinbutton,aria:switch,aria:textbox,aria:progressbar,dom:input[type=file],dom:output,dom:meter,dom:input[type=password]",refactor:{WCAG20_Input_ExplicitLabel:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_0:"input_label_exists.html",Fail_1:"input_label_exists.html",Fail_2:"input_label_exists.html",group:"input_label_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Form control element <{0}> has no associated label",Fail_2:'Form control with "{0}" role has no associated label',group:"Each form control must have an associated label"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:["97a4e1","e086e5"],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var s=n.nodeName.toLowerCase();if("datalist"===s)return null;var u="text";if("input"==s&&n.hasAttribute("type")?u=n.getAttribute("type").toLowerCase():("button"===s||l.AriaUtil.hasRoleInSemantics(n,"button"))&&(u="buttonelem"),"input"==s&&""==u&&(u="text"),"image"===u)return null;var d=o.AccNameUtil.computeAccessibleName(n);return d&&d.name&&d.name.trim().length>0?(0,a.RulePass)("Pass_0"):n.hasAttribute("role")&&n.getAttribute("role").trim().length>0?(0,a.RuleFail)("Fail_2",n.getAttribute("role").split(" ")):(0,a.RuleFail)("Fail_1",[s])}}},3180(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_label_visible=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(5279),s=i(3946),u=i(1686),d=i(1950);t.input_label_visible={id:"input_label_visible",context:"aria:button,aria:checkbox,aria:combobox,aria:listbox,aria:menuitemcheckbox,aria:menuitemradio,aria:radio,aria:searchbox,aria:slider,aria:spinbutton,aria:switch,aria:textbox",dependencies:["input_label_exists"],refactor:{WCAG20_Input_VisibleLabel:{Pass_0:"pass",Potential_1:"potential_no_label",potential_placeholder_only:"potential_placeholder_only"}},help:{"en-US":{pass:"input_label_visible.html",potential_placeholder_only:"input_label_visible.html",potential_no_label:"input_label_visible.html",group:"input_label_visible.html"}},messages:{"en-US":{pass:"The input element has an associated visible label",potential_placeholder_only:"The ‘placeholder’ is the only visible label",potential_no_label:"The input element does not have an associated visible label",group:"An input element must have an associated visible label"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.5.3","3.3.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,c=n.nodeName.toLowerCase();if("datalist"===c)return null;if(!s.VisUtil.isNodeVisible(n)||r.CommonUtil.isNodeDisabled(n))return null;if(r.CommonUtil.getAncestor(n,"table"))return null;var m=l.AriaUtil.getResolvedRole(n);if(m&&"button"===m&&"input"!==c&&"button"!==c&&!r.CommonUtil.getAncestor(n,"form"))return null;if(l.AriaUtil.getAncestorWithRole(n,"combobox")&&!(l.AriaUtil.hasRoleInSemantics(n,"textbox")||l.AriaUtil.hasRoleInSemantics(n,"searchbox")||"input"===c||"select"===c&&l.AriaUtil.hasRoleInSemantics(n,"combobox")))return null;for(var p=["listbox","tree","grid","dialog"],h=0;h<p.length;h++)if(l.AriaUtil.hasRoleInSemantics(n,p[h]))for(var g=r.CommonUtil.getElementsByRoleHidden(n.ownerDocument,"combobox",!0,!0),b=0;b<g.length;b++){var _=g[b],f=r.CommonUtil.getElementAttribute(_,"aria-owns");if(f)for(var v=r.CommonUtil.normalizeSpacing(f.trim()).split(" "),A=0;A<v.length;A++)if(o.FragmentUtil.getById(n,v[A])===n)return null}var w=d.AccNameUtil.computeAccessibleName(n);if(("input"===c||"button"===c)&&w&&w.name&&w.name.trim().length>0&&("label"===w.nameFrom||"internal"===w.nameFrom||"alt"===w.nameFrom))return(0,a.RulePass)("pass");if(w&&w.name&&w.name.trim().length>0&&("text"===w.nameFrom||"title"===w.nameFrom))return(0,a.RulePass)("pass");var y=r.CommonUtil.getOnScreenInnerText(n);if(y&&0!==y.length)return(0,a.RulePass)("pass");var C=l.AriaUtil.getAllDescendantsWithRoles(n,["img","graphics-document","graphics-object","graphics-symbol"],!1,!0);if(C&&C.length>0)for(var k=0;k<C.length;k++)if(r.CommonUtil.attributeNonEmpty(C[k],"title")||r.CommonUtil.attributeNonEmpty(C[k],"alt"))return(0,a.RulePass)("pass");if(r.CommonUtil.attributeNonEmpty(n,"aria-labelledby")){var R=n.getAttribute("aria-labelledby").split(/\s+/);for(h=0;h<R.length;++h){var x=o.FragmentUtil.getById(n,R[h]);if(x&&!u.DOMUtil.sameNode(x,n)&&s.VisUtil.isNodeVisible(x)&&r.CommonUtil.hasInnerContentHidden(x))return(0,a.RulePass)("pass")}}if(("optgroup"===c||"option"==c)&&w&&w.name&&w.name.trim().length>0&&("label"===w.nameFrom||"content"===w.nameFrom))return(0,a.RulePass)("pass");var P=n.getAttribute("id");return P&&P.trim().length>0&&n.ownerDocument.querySelector("*[aria-controls='".concat(P,"'][role='combobox']"))?null:r.CommonUtil.attributeNonEmpty(n,"placeholder")?(0,a.RulePotential)("potential_placeholder_only"):(0,a.RulePotential)("potential_no_label")}}},1382(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_onchange_review=void 0;var a=i(461),n=i(461);t.input_onchange_review={id:"input_onchange_review",context:"dom:input[onchange], dom:textarea[onchange], dom:select[onchange]",refactor:{WCAG20_Input_HasOnchange:{Potential_1:"potential_warning"}},help:{"en-US":{potential_warning:"input_onchange_review.html",group:"input_onchange_review.html"}},messages:{"en-US":{group:"Users must be advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs",potential_warning:"Confirm that the user is advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.2.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if("input"==n.nodeName.toLowerCase()&&n.hasAttribute("type")){var l=n.getAttribute("type").toLowerCase();if("hidden"===l||"submit"===l||"image"===l||"button"===l||"reset"===l)return null}return(0,a.RulePotential)("potential_warning")}}},953(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_placeholder_label_visible=void 0;var a=i(461);t.input_placeholder_label_visible={id:"input_placeholder_label_visible",context:"dom:input[placeholder], dom:textarea[placeholder]",refactor:{HAAC_Input_Placeholder:{Pass_0:"Pass_0",Potential_1:"Potential_1",Potential_2:"Potential_2"}},help:{"en-US":{Pass_0:"input_placeholder_label_visible.html",Potential_1:"input_placeholder_label_visible.html",Potential_2:"input_placeholder_label_visible.html",group:"input_placeholder_label_visible.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"HTML5 placeholder is the only visible label",Potential_2:"Additional visible label referenced by 'aria-labelledby' is not valid",group:"HTML5 'placeholder' attribute must not be used as a visible label replacement"}},rulesets:[],act:[],run:function(e,t,i){var n=e.dom.node;if(n.hasAttribute("type")){var l=n.getAttribute("type").toLowerCase();if("hidden"==l||"button"==l)return(0,a.RulePass)("Pass_0")}if(n.hasAttribute("hidden")){var r=n.getAttribute("hidden");if(""==r||"hidden"==r.toLowerCase())return(0,a.RulePass)("Pass_0")}if(n.hasAttribute("aria-label"))return(0,a.RulePotential)("Potential_1");if(n.hasAttribute("aria-labelledby")&&n.hasAttribute("id")){var o=n.getAttribute("id").trim();return n.getAttribute("aria-labelledby").trim().split(/\s+/).includes(o)?(0,a.RulePotential)("Potential_2"):(0,a.RulePass)("Pass_0")}return(0,a.RulePass)("Pass_0")}}},2222(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.label_content_exists=void 0;var a=i(461),n=i(461),l=i(7139),r=i(5279),o=i(1686);t.label_content_exists={id:"label_content_exists",context:"dom:label",refactor:{Valerie_Label_HasContent:{Pass_Regular:"Pass_Regular",Pass_AriaLabel:"Pass_AriaLabel",Pass_LabelledBy:"Pass_LabelledBy",Fail_1:"Fail_1"}},help:{"en-US":{Pass_Regular:"label_content_exists.html",Pass_AriaLabel:"label_content_exists.html",Pass_LabelledBy:"label_content_exists.html",Fail_1:"label_content_exists.html",group:"label_content_exists.html"}},messages:{"en-US":{Pass_Regular:"<label> element has accessible name with inner content",Pass_AriaLabel:"<label> element has accessible name via 'aria-label'",Pass_LabelledBy:"<label> element has accessible name via 'aria-labelledby'",Fail_1:"The <label> element does not have descriptive text that identifies the expected input",group:"A <label> element must have non-empty descriptive text that identifies the purpose of the interactive component"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.CommonUtil.hasInnerContentHidden(n))return(0,a.RulePass)("Pass_Regular");if((n.getAttribute("aria-label")||"").trim().length>0)return(0,a.RulePass)("Pass_AriaLabel");if(n.hasAttribute("aria-labelledby")){var s=r.FragmentUtil.getById(n,n.getAttribute("aria-labelledby"));if(s&&!o.DOMUtil.sameNode(s,n)&&l.CommonUtil.hasInnerContent(s))return(0,a.RulePass)("Pass_LabelledBy")}return(0,a.RuleFail)("Fail_1")}}},4678(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.label_name_visible=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(5279),s=i(3946),u=i(4919),d=i(3864);t.label_name_visible={id:"label_name_visible",context:"aria:button,aria:checkbox,aria:gridcell,aria:link,aria:menuitem,aria:menuitemcheckbox,aria:menuitemradio,aria:option,aria:radio,aria:switch,aria:tab,aria:treeitem,dom:input,dom:textarea,dom:select,dom:output,dom:meter",refactor:{WCAG21_Label_Accessible:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"label_name_visible.html",Fail_1:"label_name_visible.html",group:"label_name_visible.html"}},messages:{"en-US":{Pass_0:"Accessible name matches or contains the visible label text",Fail_1:"Accessible name does not match or contain the visible label text",group:"Accessible name must match or contain the visible label text"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_2"],num:["2.5.3"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:"2ee8b8",run:function(e,t,i){var n=e.dom.node;if(!s.VisUtil.isNodeVisible(n)||r.CommonUtil.isNodeDisabled(n))return null;if(u.CSSUtil.isMaterialIconFont(n))return(0,a.RulePass)("Pass_0");var c=!0,m=n.nodeName.toLowerCase(),p=!1,h=null;"input"===m&&n.hasAttribute("type")&&(h=n.getAttribute("type").toLowerCase(),-1!==r.CommonUtil.form_button_types.indexOf(h)&&(p=!0));var g=l.AriaUtil.getAriaAttribute(n,"aria-labelledby");if(!g||r.CommonUtil.isIdReferToSelf(n,g)||p){var b=null;if(g&&!r.CommonUtil.isIdReferToSelf(n,g))for(var _=g.split(/\s+/),f=0;f<_.length;++f){var v=o.FragmentUtil.getById(n,_[f]);if(v){b=r.CommonUtil.getInnerText(v);break}}else b=l.AriaUtil.getAriaAttribute(n,"aria-label");if(!b)return null;var A=null;if(p&&(n.hasAttribute("value")?A=n.getAttribute("value"):"submit"===h?A="submit":"reset"===h&&(A="reset")),!A){var w=r.CommonUtil.getLabelForElementHidden(n,!0);if(!w){var y=d.DOMWalker.parentNode(n);if("label"===y.nodeName.toLowerCase()){var C=y.cloneNode(!0);w=r.CommonUtil.removeAllFormElementsFromLabel(C)}}var k=w||n;A=w||-1===["meter","output","progress","select","textarea"].indexOf(m)?r.CommonUtil.getOnScreenInnerText(k):""}var R=/[^a-zA-Z0-9]/g;A=A.replace(R," ");var x=r.CommonUtil.normalizeSpacing(A).toLowerCase();b=b.replace(R," ");var P=r.CommonUtil.normalizeSpacing(b).toLowerCase();if(x.length>1){var T=P.indexOf(x);if(T>=0&&P.length>x.length){var U=/^[0-9a-zA-Z]+$/;T+x.length<P.length&&P.charAt(T+x.length).match(U)&&(c=!1),c&&T>0&&P.charAt(T-1).match(U)&&(c=!1)}-1===T&&(c=!1)}}return c?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},7578(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.label_ref_valid=void 0;var a=i(461),n=i(461),l=i(5279),r=i(3946);t.label_ref_valid={id:"label_ref_valid",context:"dom:label[for]",refactor:{WCAG20_Label_RefValid:{Pass_0:"pass",Fail_1:"fail_invalid"}},help:{"en-US":{pass:"label_ref_valid.html",fail_invalid:"label_ref_valid.html",group:"label_ref_valid.html"}},messages:{"en-US":{pass:"The 'for' attribute for a label referencea a unique non-empty 'id' attribute of a valid element",fail_invalid:"The value \"{0}\" of the 'for' attribute is not the 'id' of a valid element",group:"The 'for' attribute for a label should reference a non-empty, unique 'id' attribute of a valid element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,o=n.getAttribute("for"),s=!1,u=l.FragmentUtil.getById(n,o);if(u){if(!r.VisUtil.isNodeVisible(u)&&!r.VisUtil.isNodeVisible(n))return null;if(s=!0,!u.hasAttribute("role")){var d=u.nodeName.toLowerCase();if(s="input"==d||"select"==d||"textarea"==d||"button"==d||"datalist"==d||"optgroup"==d||"option"==d||"keygen"==d||"output"==d||"progress"==d||"meter"==d||"fieldset"==d||"legend"==d,"input"==u.nodeName.toLowerCase()&&u.hasAttribute("type")){var c=u.getAttribute("type").toLowerCase();s="text"==c||"password"==c||"file"==c||"checkbox"==c||"radio"==c||"hidden"==c||"search"==c||"tel"==c||"url"==c||"email"==c||"date"==c||"number"==c||"range"==c||"image"==c||"time"==c||"color"==c||"datetime-local"==c||"month"==c||"week"==c}}s&&!r.VisUtil.isNodeVisible(u)&&(s=!1)}var m=[];return s||m.push(o),s?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_invalid",m)}}},9964(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.list_children_valid=void 0;var a=i(461),n=i(461),l=i(7011),r=i(3864);t.list_children_valid={id:"list_children_valid",context:"aria:group",refactor:{HAAC_List_Group_ListItem:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"list_children_valid.html",Fail_1:"list_children_valid.html",group:"list_children_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'List component with "group" role has children that are not <listitem> elements',group:'List component with "group" role must limit children to <listitem> elements'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,o=r.DOMWalker.parentElement(n);if(!l.AriaUtil.hasRoleInSemantics(o,"list"))return null;for(var s=!0,u=n.children,d=0;s&&d<u.length;d++)s=l.AriaUtil.hasRoleInSemantics(u[d],"listitem");return s?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},6401(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.list_markup_review=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(3864),s=i(3946);t.list_markup_review={id:"list_markup_review",context:"dom:*",refactor:{RPT_List_UseMarkup:{Potential_1:"Potential_1"}},help:{"en-US":{potential_list:"list_markup_review.html",group:"list_markup_review.html"}},messages:{"en-US":{potential_list:"Verify this is a list and if so, modify to use proper HTML elements for the list",group:"Proper HTML elements should be used to create a list"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,u=n.nodeName.toLowerCase();if(r.CommonUtil.isNodeDisabled(n)||s.VisUtil.hiddenByDefaultElements.includes(u))return null;if(null===r.CommonUtil.getAncestor(n,["body"]))return null;if(null!==r.CommonUtil.getAncestor(n,["script","label"]))return null;var d=l.AriaUtil.getRolesWithTypes(n,["widget"]);if(r.CommonUtil.concatUniqueArrayItemList(["caption","code","columnheader","figure","list","listitem","math","meter","columnheader","rowheader"],d),null!==l.AriaUtil.getAncestorWithRoles(n,d))return null;for(var c=!0,m=n.firstChild;c&&m;){if("#text"==m.nodeName){var p=m.nodeValue;if(!(c=!/^[ \t\r\n]*[( ]*[1-9]*[\*\-).][ \t][A-Z,a-z]+/.test(p)))for(var h=new o.DOMWalker(m);!c&&h.prevNode();){var g=h.node.nodeName.toLowerCase();if(["blockquote","center","dir","div","form","h1","h2","h3","h4","h5","h6","hr","br","menu","p","pre"].includes(g))break;if("#text"==g){var b=h.node.nodeValue;c=b.length>0&&![" ","\t","\n"].includes(b.charAt(b.length-1))}}}m=m.nextSibling}return c?null:c?void 0:(0,a.RulePotential)("potential_list")}}},1174(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.list_structure_proper=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139);t.list_structure_proper={id:"list_structure_proper",context:"dom:dl, dom:ul, dom:ol, dom:dir, dom:menu, dom:li, dom:dd, dom:dt",refactor:{RPT_List_Misuse:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"list_structure_proper.html",Potential_1:"list_structure_proper.html",group:"list_structure_proper.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"List element is missing or improperly structured",group:"List elements should only be used for lists of related items"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n,o=e.dom.node,s=o.nodeName.toLowerCase();if(o.children,"dl"==s){var u="",d="",c=o.firstChild;n=!0;var m=!1;if(o.children&&0!=o.children.length){for(;n&&null!=c;){if(1==c.nodeType){var p=c.nodeName.toLowerCase();if(l.AriaUtil.isPresentationalElement(c)){m=!0,c=c.nextSibling;continue}n="dd"==p||"dt"==p,""==u&&(u=p),d=p}c=c.nextSibling}n=n&&"dt"==u&&"dd"==d||n&&m}else n=!0}else if("li"==s)n=null!=r.CommonUtil.getAncestor(o,["ul","ol","dir","menu"]);else if("dd"==s||"dt"==s)n=null!=r.CommonUtil.getAncestor(o,"dl");else if(c=o.firstChild,"ul"!=s&&"ol"!=s&&"menu"!=s||o.children&&0!=o.children.length){var h=!1;for(m=!1,n=!0;n&&null!=c;)l.AriaUtil.isPresentationalElement(c)?(m=!0,c=c.nextSibling):(n=1!=c.nodeType||"li"==c.nodeName.toLowerCase()||"template"==c.nodeName.toLowerCase()&&("ul"==s||"ol"==s),h=h||1==c.nodeType&&"li"==c.nodeName.toLowerCase(),c=c.nextSibling);n=n&&h||n&&m}else n=!0;return n?(0,a.RulePass)("Pass_0"):n?void 0:(0,a.RulePotential)("Potential_1")}}},9907(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.marquee_elem_avoid=void 0;var a=i(461),n=i(461);t.marquee_elem_avoid={id:"marquee_elem_avoid",context:"dom:marquee",refactor:{RPT_Marquee_Trigger:{Fail_1:"Fail_1"}},help:{"en-US":{Fail_1:"marquee_elem_avoid.html",group:"marquee_elem_avoid.html"}},messages:{"en-US":{Fail_1:"Scrolling content found that uses the obsolete <marquee> element",group:"The <marquee> element is obsolete and should not be used"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.2.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){return e.dom.node,(0,a.RuleFail)("Fail_1")}}},6032(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.media_alt_brief=void 0;var a=i(461),n=i(461),l=i(3946);t.media_alt_brief={id:"media_alt_brief",context:"dom:img[alt], dom:applet[alt], dom:area[alt], dom:embed[alt], dom:input[type][alt]",refactor:{RPT_Media_AltBrief:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"media_alt_brief.html",Potential_1:"media_alt_brief.html",group:"media_alt_brief.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Text alternative is more than 150 characters",group:"Alternative text in 'alt' attribute should be brief (<150 characters)"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var r=n.getAttribute("alt").trim().length<=150;return r?(0,a.RulePass)("Pass_0"):r?void 0:(0,a.RulePotential)("Potential_1")}}},5622(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.media_alt_exists=void 0;var a=i(461),n=i(461),l=i(7139),r=i(3946);t.media_alt_exists={id:"media_alt_exists",context:"dom:area[alt], dom:embed[alt]",refactor:{RPT_Media_AudioVideoAltFilename:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"media_alt_exists.html",Potential_1:"media_alt_exists.html",group:"media_alt_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Filename used as label for embedded audio or video",group:"Audio or video on the page must have a short text alternative that describes the media content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var o="";null==(o="area"==n.nodeName.toLowerCase()?n.getAttribute("href"):n.getAttribute("src"))&&(o="");var s=l.CommonUtil.getFileExt(o),u=0!=s.length&&(l.CommonUtil.isAudioExt(s)||l.CommonUtil.isVideoExt(s)),d=n.getAttribute("alt"),c=!u||d.length>0&&-1==d.indexOf(s);return c?(0,a.RulePass)("Pass_0"):c?void 0:(0,a.RulePotential)("Potential_1")}}},2240(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.media_audio_transcribed=void 0;var a=i(461),n=i(461),l=i(7139),r=i(3946);t.media_audio_transcribed={id:"media_audio_transcribed",context:"dom:bgsound, dom:a[href], dom:area[href], dom:embed, dom:object",refactor:{RPT_Media_AudioTrigger:{Manual_1:"Manual_1"}},help:{"en-US":{Manual_1:"media_audio_transcribed.html",group:"media_audio_transcribed.html"}},messages:{"en-US":{Manual_1:"Provide transcripts for audio files",group:"Audio information should also be available in text form"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.2.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n,o=e.dom.node;return r.VisUtil.isNodeHiddenFromAT(o)||(n="bgsound"!=o.nodeName.toLowerCase()&&!l.CommonUtil.isAudioObjEmbedLink(o))?null:n?void 0:(0,a.RuleManual)("Manual_1")}}},4019(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.media_autostart_controllable=void 0;var a=i(461),n=i(461);t.media_autostart_controllable={id:"media_autostart_controllable",context:"dom:param[name=autoplay], dom:param[name=autostart], dom:embed[flashvars], dom:embed[src], dom:*[autostart=true], dom:*[autostart=1], dom:bgsound",refactor:{RPT_Embed_AutoStart:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"media_autostart_controllable.html",Potential_1:"media_autostart_controllable.html",group:"media_autostart_controllable.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify there is a mechanism to pause or stop and control the volume for the audio that plays automatically",group:"Mechanism must be available to pause or stop and control the volume of the audio that plays automatically"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.4.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n,l=e.dom.node,r=l.nodeName.toLowerCase();if("bgsound"==r)n=!1;else if("param"==r){var o="";l.hasAttribute("value")&&(o=l.getAttribute("value").toLowerCase()),n=0==o.indexOf("0;")||!(-1!=o.indexOf("true")||-1!=o.indexOf("1"))}else if("embed"==r){var s;n=!0,l.hasAttribute("flashvars")&&(n=-1==(s=l.getAttribute("flashvars")).indexOf("autostart=true")&&-1==s.indexOf("autostart=1")),n&&l.hasAttribute("src")&&(n=-1==(s=l.getAttribute("src")).indexOf("autostart=true")&&-1==s.indexOf("autostart=1"))}if(n&&l.hasAttribute("autostart")){var u=l.getAttribute("autostart").toLowerCase();n="true"!=u&&"1"!=u}return n?(0,a.RulePass)("Pass_0"):(0,a.RulePotential)("Potential_1")}}},361(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.media_keyboard_controllable=void 0;var a=i(461),n=i(461),l=i(3946);t.media_keyboard_controllable={id:"media_keyboard_controllable",context:"dom:audio, dom:video",refactor:{HAAC_Audio_Video_Trigger:{Pass_0:"Pass_0",Manual_1:"Manual_1"}},help:{"en-US":{Pass_0:"media_keyboard_controllable.html",Manual_1:"media_keyboard_controllable.html",group:"media_keyboard_controllable.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Manual_1:"Verify media using <audio> and/or <video> elements have keyboard accessible controls",group:"Media using <audio> and/or <video> elements must have keyboard accessible controls"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var r=!0,o=n.nodeName.toLowerCase();return"audio"!=o&&"video"!==o||(r=!1),r?(0,a.RulePass)("Pass_0"):(0,a.RuleManual)("Manual_1")}}},5960(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.media_live_captioned=void 0;var a=i(461),n=i(461),l=i(7139);t.media_live_captioned={id:"media_live_captioned",context:"dom:embed, dom:object",refactor:{RPT_Media_VideoObjectTrigger:{Manual_1:"Manual_1"}},help:{"en-US":{Manual_1:"media_live_captioned.html",group:"media_live_captioned.html"}},messages:{"en-US":{Manual_1:"Verify captions are provided for live media (streaming video with audio)",group:"Live media (streaming video with audio) should have captions for audio content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.2.4"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,r=!l.CommonUtil.isVideoObjEmbedLink(n);return r?null:r?void 0:(0,a.RuleManual)("Manual_1")}}},5515(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.media_track_available=void 0;var a=i(461),n=i(461),l=i(7139),r=i(3946);t.media_track_available={id:"media_track_available",context:"dom:a[href], dom:area[href], dom:applet, dom:embed, dom:object",refactor:{RPT_Media_VideoReferenceTrigger:{Manual_1:"Manual_1"}},help:{"en-US":{Manual_1:"media_track_available.html",group:"media_track_available.html"}},messages:{"en-US":{Manual_1:"Verify availability of a user-selectable audio track with description of visual content",group:"Pre-recorded media should have an audio track that describes visual information"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.2.3","1.2.5"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var o;return(o="applet"!=n.nodeName.toLowerCase()&&!l.CommonUtil.isVideoObjEmbedLink(n))?null:o?void 0:(0,a.RuleManual)("Manual_1")}}},8752(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.meta_redirect_optional=void 0;var a=i(461),n=i(461),l=i(4566);t.meta_redirect_optional={id:"meta_redirect_optional",context:"dom:meta[http-equiv][content]",refactor:{WCAG20_Meta_RedirectZero:{pass:"pass",fail:"fail",fail_longrefresh:"fail_longrefresh"}},help:{"en-US":{group:"meta_redirect_optional.html",pass:"meta_redirect_optional.html",fail:"meta_redirect_optional.html",fail_longrefresh:"meta_redirect_optional.html"}},messages:{"en-US":{group:"Page should not automatically refresh without warning or option to turn it off or adjust the time limit",pass:"Rule Passed",fail:"Check page does not automatically refresh without warning or options",fail_longrefresh:"Check page does not automatically refresh without warning or options"}},rulesets:[{id:[],num:["2.2.4","3.2.5"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:["bisz58"],run:function(e,t,i){var n=e.dom.node;if("refresh"!==n.getAttribute("http-equiv").toLowerCase())return null;var r=n.ownerDocument;if(r){if(l.CacheUtil.getCache(r,"meta_redirect_optional_done",!1))return null;var o=n.getAttribute("content").toLowerCase();if(!o||0===o.trim().length)return null;var s=-1;if(o.match(/^\d+$/))s=parseInt(o);else if(o.match(/^\d+;/)){var u=o.indexOf(";");s=parseInt(o.substring(0,u))}return-1===s?null:(l.CacheUtil.setCache(r,"meta_redirect_optional_done",!0),0===s?(0,a.RulePass)("pass"):s<72001?(0,a.RuleFail)("fail"):(0,a.RuleFail)("fail_longrefresh"))}}}},8834(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.meta_refresh_delay=void 0;var a=i(461),n=i(461),l=i(4566);t.meta_refresh_delay={id:"meta_refresh_delay",context:"dom:meta[http-equiv][content]",refactor:{RPT_Meta_Refresh:{Pass_0:"pass",Potential_1:"potential_refresh"}},help:{"en-US":{group:"meta_refresh_delay.html",pass:"meta_refresh_delay.html",potential_refresh:"meta_refresh_delay.html"}},messages:{"en-US":{group:"Pages should not refresh automatically",pass:"Pages do not refresh automatically",potential_refresh:"Verify page is not being caused to refresh automatically"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.2.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:["bc659a"],run:function(e,t,i){var n=e.dom.node;if("refresh"!==n.getAttribute("http-equiv").toLowerCase())return null;var r=n.ownerDocument;if(r){if(l.CacheUtil.getCache(r,"meta_refresh_delay_done",!1))return null;var o=n.getAttribute("content").toLowerCase();if(!o||0===o.trim().length)return null;var s=-1;if(o.match(/^\d+$/))s=parseInt(o);else if(o.match(/^\d+;/)){var u=o.indexOf(";");s=parseInt(o.substring(0,u))}return-1===s?null:(l.CacheUtil.setCache(r,"meta_refresh_delay_done",!0),0===s?(0,a.RulePass)("pass"):(0,a.RulePotential)("potential_refresh"))}}}},1025(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.meta_viewport_zoomable=void 0;var a=i(461),n=i(461);t.meta_viewport_zoomable={id:"meta_viewport_zoomable",context:"dom:meta[name][content]",refactor:{meta_viewport_zoom:{Pass_0:"pass",Potential_1:"potential_zoomable"}},help:{"en-US":{group:"meta_viewport_zoomable.html",pass:"meta_viewport_zoomable.html",potential_zoomable:"meta_viewport_zoomable.html"}},messages:{"en-US":{group:"The 'meta[name=viewport]' should not prevent the browser zooming the content",pass:"The 'meta[name=viewport]' does not prevent the browser zooming the content",potential_zoomable:"Confirm the 'meta[name=viewport]' with \"{0}\" can be zoomed by user"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.4.4"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[{b4f0c3:{pass:"pass",potential_zoomable:"fail"}}],run:function(e,t,i){var n=e.dom.node;if("viewport"!==n.getAttribute("name").toLowerCase())return null;var l=n.getAttribute("content").toLowerCase();if(!l||""===l.trim()||!l.includes("maximum-scale")&&!l.includes("user-scalable"))return null;for(var r=null,o=null,s="yes",u="2.0",d=0,c=l.split(",");d<c.length;d++){var m=c[d],p=m.trim().split("=");p.length<2||(m.includes("user-scalable")?(r=m,((s=p[1].trim()).startsWith("'")||s.startsWith('"'))&&(s=s.substring(1,s.length-1))):m.includes("maximum-scale")&&(o=m,((u=p[1].trim()).startsWith("'")||u.startsWith('"'))&&(u=u.substring(1,u.length-1).trim())))}var h=Number(s);isNaN(h)||(h>=1||h<=-1)&&(s="yes");var g;return h=Number(u),g=isNaN(h)?"yes"===u?1:.1:h<0?2:h,"yes"!==s?(0,a.RulePotential)("potential_zoomable",[r]):g<2?(0,a.RulePotential)("potential_zoomable",[o]):(0,a.RulePass)("pass")}}},9116(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.noembed_content_exists=void 0;var a=i(461),n=i(461),l=i(7139),r=i(3946);t.noembed_content_exists={id:"noembed_content_exists",context:"dom:noembed",refactor:{Valerie_Noembed_HasContent:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"noembed_content_exists.html",Potential_1:"noembed_content_exists.html",group:"noembed_content_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Add descriptive text to the <noembed> element",group:"<noembed> elements should contain descriptive text"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_FOUR}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var o=l.CommonUtil.hasInnerContentHidden(n);return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},435(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.object_text_exists=void 0;var a=i(461),n=i(461),l=i(3946),r=i(1950);t.object_text_exists={id:"object_text_exists",context:"dom:object",refactor:{WCAG20_Object_HasText:{pass:"pass",fail_no_text_alternative:"fail_no_text_alternative"}},help:{"en-US":{group:"object_text_exists.html",pass:"object_text_exists.html",fail_no_text_alternative:"object_text_exists.html"}},messages:{"en-US":{group:"<object> element must have a text alternative for the content rendered by the object",pass:"<object> element has a text alternative",fail_no_text_alternative:"An <object> element does not have a text alternative"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:"8fc3b6",run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;if(n.hasAttribute("type")&&-1!==n.getAttribute("type").indexOf("text"))return null;if(n.getAttribute("role"))return null;var o=n.getAttribute("data"),s=o&&"string"==typeof o?o.substring(o.lastIndexOf(".")):"";if(".html"===s||".htm"===s)return null;var u=r.AccNameUtil.computeAccessibleName(n);return u&&u.name&&u.name.trim().length>0?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_no_text_alternative")}}},6640(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.page_title_exists=void 0;var a=i(461),n=i(461),l=i(7139),r=i(6858);t.page_title_exists={id:"page_title_exists",context:"dom:html",refactor:{WCAG20_Doc_HasTitle:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{group:"page_title_exists.html",Pass_0:"page_title_exists.html",Fail_1:"page_title_exists.html",Fail_2:"page_title_exists.html",Fail_3:"page_title_exists.html"}},messages:{"en-US":{group:"The page should have a title that correctly identifies the subject of the page",Pass_0:"Rule Passed",Fail_1:"Missing <head> element so there can be no <title> element present",Fail_2:"Missing <title> element in <head> element",Fail_3:"The <title> element is empty (no innerHTML)"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[{"2779a5":{Pass_0:"pass",Fail_1:"pass",Fail_2:"fail",Fail_3:"fail"}}],run:function(e,t,i){if(r.AncestorUtil.isFrame(i))return null;for(var n=e.dom.node,o=n.firstChild,s=null;null!=o&&"head"!=o.nodeName.toLowerCase();)o=o.nextSibling;for(var u=n.querySelectorAll("title"),d=0;d<u.length;++d)if(!l.CommonUtil.getAncestor(u[d],["svg"])){s=u[d];break}return null!==o||s?null===s?(0,a.RuleFail)("Fail_2"):null!=s&&l.CommonUtil.getInnerText(s).trim().length>0?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_3"):(0,a.RuleFail)("Fail_1")}}},2068(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.page_title_valid=void 0;var a=i(461),n=i(461),l=i(7139);t.page_title_valid={id:"page_title_valid",context:"dom:head dom:title",refactor:{RPT_Title_Valid:{Pass_0:"Pass_0",Potential_2:"Potential_2"}},help:{"en-US":{Pass_0:"page_title_valid.html",Potential_2:"page_title_valid.html",group:"page_title_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_2:"Verify that using the filename as the page <title> value is descriptive",group:"Page <title> should be a descriptive title, rather than a filename"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,r=l.CommonUtil.getInnerText(n).trim(),o=r.toLowerCase();return o.includes(".com")||o.includes(".net")||o.includes(".org")?(0,a.RulePass)("Pass_0",[r]):0===r.length?null:/^\S*\.[a-zA-Z]{1,4}(?!.)|^https?:\/\/\S*/i.test(r)?(0,a.RulePotential)("Potential_2"):(0,a.RulePass)("Pass_0",[r])}}},7322(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.script_focus_blur_review=void 0;var a=i(461),n=i(461);t.script_focus_blur_review={id:"script_focus_blur_review",context:"dom:*[onfocus]",refactor:{WCAG20_Script_FocusBlurs:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"script_focus_blur_review.html",Potential_1:"script_focus_blur_review.html",group:"script_focus_blur_review.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify script does not remove focus from content that normally receives focus",group:"Scripting must not remove focus from content that normally receives focus"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1","2.4.7","3.2.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=-1==e.dom.node.getAttribute("onfocus").indexOf(".blur(");return n?(0,a.RulePass)("Pass_0"):n?void 0:(0,a.RulePotential)("Potential_1")}}},5702(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.script_onclick_avoid=void 0;var a=i(461),n=i(461),l=i(7139);t.script_onclick_avoid={id:"script_onclick_avoid",context:"dom:*[onclick]",dependencies:["script_onclick_misuse"],refactor:{RPT_Script_OnclickHTML2:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"script_onclick_avoid.html",Potential_1:"script_onclick_avoid.html",group:"script_onclick_avoid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that 'onclick' events are not used in script to emulate a link",group:"Scripts should not be used to emulate links"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_FOUR}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.CommonUtil.getAncestor(n,"svg"))return(0,a.RulePass)("Pass_0");if(l.CommonUtil.attributeNonEmpty(n,"role"))return(0,a.RulePass)("Pass_0");var r=n.nodeName.toLowerCase(),o="a"==r||"area"==r||"input"==r;return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},1961(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.script_onclick_misuse=void 0;var a=i(461),n=i(461),l=i(7139);t.script_onclick_misuse={id:"script_onclick_misuse",context:"dom:*[onclick]",refactor:{RPT_Script_OnclickHTML1:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"script_onclick_misuse.html",Potential_1:"script_onclick_misuse.html",group:"script_onclick_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Possible use of a script to emulate a link",group:"Scripts should not be used to emulate links"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,r=l.CommonUtil.attributeNonEmpty(n,"role"),o=n.nodeName.toLowerCase();if(!(r=r||("a"==o||"area"==o)&&l.CommonUtil.attributeNonEmpty(n,"href"))){var s=[".asp",".aspx",".cfm",".cfml",".cgi",".htm",".html",".shtm",".shtml",".php",".pl",".py",".shtm",".shtml",".xhtml","location.href"],u=n.getAttribute("onclick").toLowerCase();r=!0;for(var d=0;r&&d<s.length;++d)r=-1==u.indexOf(s[d])}return r?(0,a.RulePass)("Pass_0"):r?void 0:(0,a.RulePotential)("Potential_1")}}},3022(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.script_select_review=void 0;var a=i(461),n=i(461);t.script_select_review={id:"script_select_review",context:"dom:select",refactor:{WCAG20_Select_NoChangeAction:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"script_select_review.html",Potential_1:"script_select_review.html",group:"script_select_review.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that no change of context or action occurs when selection options in this component receive focus",group:"No changes of context should occur when a selection value receives focus"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.2.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,l=!n.hasAttribute("onchange")&&!n.hasAttribute("onfocus");return l?(0,a.RulePass)("Pass_0"):l?void 0:(0,a.RulePotential)("Potential_1")}}},375(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.select_options_grouped=void 0;var a=i(461),n=i(461),l=i(7139);t.select_options_grouped={id:"select_options_grouped",context:"dom:select",refactor:{WCAG20_Select_HasOptGroup:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"select_options_grouped.html",Potential_1:"select_options_grouped.html",group:"select_options_grouped.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Group of related options may need <optgroup>",group:"Groups of related options within a selection list should be grouped with <optgroup>"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,r=l.CommonUtil.getChildByTagHidden(n,"optgroup",!1,!0).length>0||l.CommonUtil.getChildByTagHidden(n,"option",!1,!0).length<=10;return r?(0,a.RulePass)("Pass_0"):r?void 0:(0,a.RulePotential)("Potential_1")}}},4658(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.skip_main_described=void 0;var a=i(461),n=i(461),l=i(7139),r=i(4566),o=i(3946);t.skip_main_described={id:"skip_main_described",context:"dom:body",dependencies:["skip_main_exists"],refactor:{WCAG20_Body_FirstAContainsSkipText_Native_Host_Sematics:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"skip_main_described.html",Potential_1:"skip_main_described.html",group:"skip_main_described.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that if this hyperlink skips content, the description communicates where it links to",group:"The description of a hyperlink used to skip content must communicate where it links to"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n,s={paramSkipText:{value:["skip","jump"],type:"[string]"}},u=e.dom.node,d=u.ownerDocument;if(null===r.CacheUtil.getCache(u,"IBM_hasLandmarks_Implicit",null)&&r.CacheUtil.setCache(u,"IBM_hasLandmarks_Implicit",l.CommonUtil.getElementsByRoleHidden(u.ownerDocument,["application","banner","complementary","contentinfo","form","main","navigation","search"],!0,!0).length>0),!(n=r.CacheUtil.getCache(u,"IBM_hasLandmarks_Implicit",!1))){var c=d.links;if(c&&c.length>0&&o.VisUtil.isNodeVisible(c[0]))for(var m=l.CommonUtil.getInnerText(d.links[0]).toLowerCase(),p=0;!n&&p<s.paramSkipText.value.length;++p)n=-1!=m.indexOf(s.paramSkipText.value[p]);else n=!1}return n?(0,a.RulePass)("Pass_0"):n?void 0:(0,a.RulePotential)("Potential_1")}}},4605(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.skip_main_exists=void 0;var a=i(461),n=i(461),l=i(7139),r=i(6858),o=i(4566),s=i(3946);t.skip_main_exists={id:"skip_main_exists",context:"dom:body",refactor:{WCAG20_Body_FirstASkips_Native_Host_Sematics:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"skip_main_exists.html",Fail_1:"skip_main_exists.html",group:"skip_main_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'The page does not provide a way to quickly navigate to the main content (ARIA "main" landmark or a skip link)',group:"Pages must provide a way to skip directly to the main content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){if(r.AncestorUtil.isPresentationFrame(i))return null;var n,u=e.dom.node,d=u.ownerDocument;if(null===o.CacheUtil.getCache(u,"IBM_hasLandmarks_Implicit",null)&&o.CacheUtil.setCache(u,"IBM_hasLandmarks_Implicit",l.CommonUtil.getElementsByRoleHidden(u.ownerDocument,["application","banner","complementary","contentinfo","form","main","navigation","search"],!0,!0).length>0),!(n=o.CacheUtil.getCache(u,"IBM_hasLandmarks_Implicit",!1))){for(var c=l.CommonUtil.getDocElementsByTag(u,"a"),m=null,p=0;p<c.length;++p)if(c[p].hasAttribute("href")&&s.VisUtil.isNodeVisible(c[p])){m=c[p];break}var h=null;if(null!=m){var g=m.getAttribute("href"),b=g.indexOf("#");-1!=b&&(h=g.substring(b+1))}if(null!=h)for(n=null!=d.getElementById(h),p=0;!n&&p<c.length;++p)!c[p].hasAttribute("href")&&c[p].hasAttribute("name")&&c[p].getAttribute("name")==h&&(n=!0)}return n?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},5294(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.style_background_decorative=void 0;var a=i(461),n=i(461),l=i(7139);t.style_background_decorative={id:"style_background_decorative",context:"dom:style, dom:*[style]",refactor:{RPT_Style_BackgroundImage:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"style_background_decorative.html",Potential_1:"style_background_decorative.html",group:"style_background_decorative.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify the CSS background image does not convey important information",group:"Images included by using CSS alone must not convey important information"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,r=n.nodeName.toLowerCase(),o=!0;if("link"===r&&n.hasAttribute("rel")&&"stylesheet"===n.getAttribute("rel").toLowerCase()&&(o=l.CommonUtil.triggerOnce(n,"style_background_decorative",!1)),o&&"style"===r||n.hasAttribute("style")){var s=("style"===r?l.CommonUtil.getInnerText(n):n.getAttribute("style")).match(/background:[^;]*/g);if(null!==s)for(var u=0;o&&u<s.length;++u)o=-1===s[u].indexOf("url(")}return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},3506(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.style_before_after_review=void 0;var a=i(461),n=i(461),l=i(4919);t.style_before_after_review={id:"style_before_after_review",context:"dom:style, dom:link",refactor:{WCAG20_Style_BeforeAfter:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{group:"style_before_after_review.html",Pass_0:"style_before_after_review.html",Potential_1:"style_before_after_review.html"}},messages:{"en-US":{group:"Do not use CSS '::before' and '::after' pseudo-elements to insert non-decorative content",Pass_0:"Rule Passed",Potential_1:"Verify the '::before' and '::after' pseudo-elements do not insert non-decorative content"}},rulesets:[{id:[],num:"1.3.1",level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,r=!0;if("style"===n.nodeName.toLowerCase()){for(var o=l.CSSUtil.getCSSStyle(n),s=0;r&&s<o.length;++s)o[s].selector&&(r=-1===o[s].selector.indexOf(":before")&&-1===o[s].selector.indexOf(":after")||!("content"in o[s].values)||0===o[s].values.content.trim().length||'""'===o[s].values.content.trim()||"''"===o[s].values.content.trim()||"none"===o[s].values.content.trim()||"attr(x)"===o[s].values.content.trim()||"attr(y)"===o[s].values.content.trim());if(r)for(var u=0;u<n.ownerDocument.styleSheets.length;u++)if((_=n.ownerDocument.styleSheets[u]).ownerNode===n)try{var d=_.cssRules?_.cssRules:_.rules;if(d)for(var c=0;r&&c<d.length;c++){var m=d[c],p=void 0;if(m.type&&4===m.type){if(v=m.cssRules)for(var h=0;r&&h<v.length;h++)null!==(w=v[h]).selectorText&&void 0!==w.selectorText&&(-1===(C=w.selectorText.toLowerCase()).indexOf(":before")&&-1===C.indexOf(":after")||(k=w.style.content)&&k.trim().length&&'""'!==k.trim()&&"''"!==k.trim()&&"none"!==k.trim()&&"attr(x)"!==k.trim()&&"attr(y)"!==k.trim()&&(r=!1))}else if(m.type&&3===m.type&&(p=m).styleSheet&&(f=p.styleSheet.cssRules?p.styleSheet.cssRules:p.styleSheet.rules))for(h=0;r&&h<f.length;h++){var g=f[h];if(g.type&&4===g.type){if(v=g.cssRules)for(var b=0;b<v.length;b++)null!==(w=v[b]).selectorText&&void 0!==w.selectorText&&(-1===(C=w.selectorText.toLowerCase()).indexOf(":before")&&-1===C.indexOf(":after")||(k=w.style.content)&&k.trim().length&&'""'!==k.trim()&&"''"!==k.trim()&&"none"!==k.trim()&&"attr(x)"!==k.trim()&&"attr(y)"!==k.trim()&&(r=!1))}else null!==g.selectorText&&void 0!==g.selectorText&&(-1===(C=g.selectorText.toLowerCase()).indexOf(":before")&&-1===C.indexOf(":after")||(k=g.style.content)&&k.trim().length&&'""'!==k.trim()&&"''"!==k.trim()&&"none"!==k.trim()&&"attr(x)"!==k.trim()&&"attr(y)"!==k.trim()&&(r=!1))}}}catch(e){}}if("link"===n.nodeName.toLowerCase()&&n.hasAttribute("rel")&&"stylesheet"===n.getAttribute("rel").toLowerCase()&&n.hasAttribute("href")&&0!==n.getAttribute("href").trim().length)for(u=0;u<n.ownerDocument.styleSheets.length;u++){var _;if((_=n.ownerDocument.styleSheets[u])&&_.ownerNode===n)try{var f;if(f=_.cssRules?_.cssRules:_.rules)for(h=0;r&&h<f.length;h++){var v,A=f[h];if(A.type&&4===A.type){if(v=A.cssRules)for(b=0;r&&b<v.length;b++){var w;if(null!==(w=v[b]).selectorText&&void 0!==w.selectorText){var y=w.selectorText.toLowerCase();-1===y.indexOf(":before")&&-1===y.indexOf(":after")||(k=w.style.content)&&k.trim().length&&'""'!==k.trim()&&"''"!==k.trim()&&"none"!==k.trim()&&"attr(x)"!==k.trim()&&"attr(y)"!==k.trim()&&(r=!1)}}}else if(null!==f[h].selectorText&&void 0!==f[h].selectorText){var C,k;-1===(C=f[h].selectorText.toLowerCase()).indexOf(":before")&&-1===C.indexOf(":after")||(k=f[h].style.content)&&k.trim().length&&'""'!==k.trim()&&"''"!==k.trim()&&"none"!==k.trim()&&"attr(x)"!==k.trim()&&"attr(y)"!==k.trim()&&(r=!1)}}}catch(e){}}return r?(0,a.RulePass)("Pass_0"):r?void 0:(0,a.RulePotential)("Potential_1")}}},7475(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.style_color_misuse=void 0;var a=i(7139),n=i(461),l=i(461),r=i(3864),o=i(4566);t.style_color_misuse={id:"style_color_misuse",context:"dom:style, dom:*[style], dom:font[color], dom:link",refactor:{RPT_Style_ColorSemantics1:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{group:"style_color_misuse.html",Pass_0:"style_color_misuse.html",Potential_1:"style_color_misuse.html"}},messages:{"en-US":{group:"Combine color and descriptive markup to convey information",Pass_0:"Rule Passed",Potential_1:"Verify color is not used as the only visual means of conveying information"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"1.4.1",level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var l=e.dom.node,s=l.nodeName.toLowerCase(),u="";if("style"===s){u=a.CommonUtil.getInnerText(l).toLowerCase();for(var d=0;d<l.ownerDocument.styleSheets.length;d++)if((_=l.ownerDocument.styleSheets[d])&&_.ownerNode===l)try{for(var c=_.cssRules?_.cssRules:_.rules,m=0;m<c.length;m++){var p=c[m],h=void 0;if(p.type&&3===p.type&&(h=p).styleSheet)for(var g=h.styleSheet.cssRules?h.styleSheet.cssRules:h.styleSheet.rules,b=0;b<g.length;b++)u+=g[b].cssText}}catch(e){}}else if(l.hasAttribute("style"))u=l.getAttribute("style").toLowerCase();else if("link"===s&&l.hasAttribute("rel")&&"stylesheet"===l.getAttribute("rel").toLowerCase()&&l.hasAttribute("href")&&0!==l.getAttribute("href").trim().length)for(d=0;d<l.ownerDocument.styleSheets.length;d++){var _;if((_=l.ownerDocument.styleSheets[d])&&_.ownerNode===l)try{var f=_.cssRules?_.cssRules:_.rules;for(b=0;b<f.length;b++)u+=f[b].cssText}catch(e){}}var v=!0,A=u.match(/\bbackground\b/i),w=u.replace(/-color/g,"").match(/\bcolor\b/i);if(l.hasAttribute("color")||w||A){var y={em:"",strong:"",cite:"",dfn:"",code:"",samp:"",kbd:"",var:"",abbr:"",acronym:""};if(!(v=s in y||null!==a.CommonUtil.getAncestor(l,y))&&l.hasChildNodes())for(var C=new r.DOMWalker(l);!v&&C.nextNode()&&C.node!==l;)v=C.node.nodeName.toLowerCase()in y}return v||(v=o.CacheUtil.getCache(l.ownerDocument,"style_color_misuse",!1),o.CacheUtil.setCache(l.ownerDocument,"style_color_misuse",!0)),v?(0,n.RulePass)("Pass_0"):v?void 0:(0,n.RulePotential)("Potential_1")}}},8064(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.style_focus_visible=void 0;var a=i(7139),n=i(461),l=i(461),r=i(4919),o=i(3883);t.style_focus_visible={id:"style_focus_visible",context:"dom:*",refactor:{RPT_Style_HinderFocus1:{Potential_1:"potential_focus_not_visible"}},help:{"en-US":{group:"style_focus_visible.html",potential_focus_not_visible:"style_focus_visible.html",pass_focus_visible:"style_focus_visible.html"}},messages:{"en-US":{group:"The keyboard focus indicator should be visible when default border or outline is modified by CSS",potential_focus_not_visible:"Check the keyboard focus indicator is visible when using CSS declaration for 'border' or 'outline'",pass_focus_visible:"The keyboard focus indicator is visible or is not changed from the browser default"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"2.4.7",level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l={skipNodes:{value:["table"],type:"[string]"},checkParams:{value:["border","border-width","border-style","border-top-width","border-right-width","border-bottom-width","border-left-width","border-top-color","border-right-color","border-bottom-color","border-left-color","border-top-style","border-right-style","border-bottom-style","border-left-style","outline","outline-width","outline-color","outline-style"],type:"[string]"}},s=e.dom.node;if(!a.CommonUtil.isTabbable(s)||l.skipNodes.value.includes(s.nodeName.toLowerCase()))return null;var u=r.CSSUtil.getDefinedStylesMultiple(s,null,["",":focus",":focus-visible",":focus-within"]),d=u[""],c=[];c.push(u[":focus"]),c.push(u[":focus-visible"]),c.push(u[":focus-within"]);var m=c[0];if(Object.keys(m).length>0){if(!((d["outline-width"]||d["outline-style"])&&"0px"!==d["outline-width"]&&"none"!==d["outline-style"]||m["outline-style"]&&"none"===m["outline-style"]))return(0,n.RulePass)("pass_focus_visible");var p=!1,h=0;for(var g in m)if(l.checkParams.value.includes(g)){var b=m[g],_=d[g];if(g.includes("style")){if(p="none"===b,_&&"none"!==b&&b===_)return(0,n.RulePotential)("potential_focus_not_visible")}else if(g.includes("width")){if(h++,"initial"===b?b="2px":"thin"===b?b="1px":"medium"===b?b="2px":"thick"===b&&(b="3px"),_&&("initial"===_?_="2px":"thin"===_?_="1px":"medium"===_?_="2px":"thick"===_&&(_="3px")),b=r.CSSUtil.getPixelsFromStyle(b,s),_=r.CSSUtil.getPixelsFromStyle(_,s),0==b||b<=_)return(0,n.RulePotential)("potential_focus_not_visible")}else if(g.includes("color")){h++;var f=o.ColorUtil.ColorCombo(s);if(null===f)continue;var v=f.bg;if(!v)continue;if("initial"===b&&(b="black"),_&&"initial"===_&&(_="black"),b=o.ColorUtil.Color(b),_=o.ColorUtil.Color(_),null===b||null===_)continue;var A=b.contrastRatio(v),w=_.contrastRatio(v);if(A<3||A<=w)return(0,n.RulePotential)("potential_focus_not_visible")}else if(h++,null!=_&&b===_)return(0,n.RulePotential)("potential_focus_not_visible")}if(p&&0===h)return(0,n.RulePotential)("potential_focus_not_visible")}else for(var y in d)if(l.checkParams.value.includes(y)&&"none"!==(_=d[y]))return(0,n.RulePotential)("potential_focus_not_visible");return(0,n.RulePass)("pass_focus_visible")}}},7942(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.style_highcontrast_visible=void 0;var a=i(461),n=i(461),l=i(4566);t.style_highcontrast_visible={id:"style_highcontrast_visible",context:"dom:style, dom:link, dom:*[style]",refactor:{RPT_Style_Trigger2:{Pass_0:"Pass_0",Manual_1:"Manual_1"}},help:{"en-US":{Pass_0:"style_highcontrast_visible.html",Manual_1:"style_highcontrast_visible.html",group:"style_highcontrast_visible.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Manual_1:"Confirm Windows high contrast mode is supported when using CSS to include, position or alter non-decorative content",group:"Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["1.1.1","1.3.2","1.4.11"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE},{id:["WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1","1.3.2","1.4.11"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,r=n.nodeName.toLowerCase();if("link"===r&&(!n.hasAttribute("rel")||"stylesheet"!==n.getAttribute("rel").toLowerCase()))return(0,a.RulePass)("Pass_0");if("style"!==r&&"link"!==r&&n.hasAttribute("style")&&0===n.getAttribute("style").trim().length)return(0,a.RulePass)("Pass_0");var o=l.CacheUtil.getCache(n.ownerDocument,"style_highcontrast_visible",!1);return l.CacheUtil.setCache(n.ownerDocument,"style_highcontrast_visible",!0),o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RuleManual)("Manual_1")}}},2219(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.style_hover_persistent=void 0;var a=i(461),n=i(461),l=i(7139);t.style_hover_persistent={id:"style_hover_persistent",context:"dom:style, dom:*[style], dom:*",help:{"en-US":{Pass_0:"style_hover_persistent.html",Pass_2:"style_hover_persistent.html",Potential_1:"style_hover_persistent.html",Potential_2:"style_hover_persistent.html",Potential_3:"style_hover_persistent.html",group:"style_hover_persistent.html"}},messages:{"en-US":{Pass_0:"the hover: pseudo-class is not used to display content",Pass_2:"content displayed via the :hover pseudo-class is the adjacent sibling of the trigger element",Potential_1:"Confirm the pointer can be positioned over the displayed element, not just the trigger",Potential_2:"Confirm the pointer can be positioned over all the information displayed on hover",Potential_3:"Confirm the margin style attribute has not prevented the pointer from hovering over the displayed element, not just the trigger",group:"The pointer should be able to move over content displayed on hover"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_2"],num:["1.4.13"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=!1,r=!1,o=!1,s=e.dom.node;if("style"===s.nodeName.toLowerCase()){l.CommonUtil.getInnerText(s).toLowerCase();for(var u=0;u<s.ownerDocument.styleSheets.length;++u){var d=s.ownerDocument.styleSheets[u];if(d&&d.ownerNode===s)try{for(var c=d.cssRules?d.cssRules:d.rules,m=0;m<c.length;m++){var p="",h=!1,g=!1,b="",_=!1,f=!1,v=!1,A=(c[m],c[m].cssText);if(A.match(/:hover/g)){p=A.split(":")[0];var w=A.substring(A.indexOf("+")+1);if(w=w.trim(),(A.match(/:hover \+/g)||A.match(/:hover\+/g))&&(h=!0,b=w.split(" ")[0]),A.match(/:hover \~/g)||A.match(/:hover\~/g)){g=!0;var y=A.substring(A.indexOf("~")+1);b=(y=y.trim()).split(" ")[0]}if(!h&&!g)return(0,a.RulePass)("Pass_0");if(b&&(I=w.indexOf("display:"))&&"none;"!==w.slice(I+8).trim().split(" ")[0]&&d&&d.ownerNode===s)try{for(var C=d.cssRules?d.cssRules:d.rules,k=0;k<C.length;k++){var R=c[k].cssText,x=b+" {",P=R.trim(),T=P.indexOf(x);if(P.slice(T).trim(),P.match(/margin/g)){if(!o)return o=!0,(0,a.RulePotential)("Potential_3")}else{var U=R.split(":")[0];if((U=U.split(" ")[0])===b&&R.match(/:hover/g)){var I;if(_=!0,I=R.indexOf("display:"))if(f=!0,"none;"!==w.slice(I+8).trim().split(" ")[0]){if(v=!0,""!==p&&h){var E=s.ownerDocument.getElementsByTagName(p.toUpperCase());if(b.toUpperCase()===E[0].nextElementSibling.tagName){n=!0;continue}}else if(h){if(!r){r=!0;break}continue}if(""!==p&&g){E=s.ownerDocument.getElementsByTagName(p.toUpperCase());var N=[],L=E[0].nextElementSibling;do{if(L.tagName!==b.toUpperCase())break;N.push(L)}while(L=L.nextElementSibling);var S=N.length;if(1===S)return(0,a.RulePass)("Pass_2");if(S>1)return(0,a.RulePotential)("Potential_2")}}else{if(h){if(k===C.length-1&&!1===v)return(0,a.RulePotential)("Potential_1");continue}if(g){if(k===C.length-1&&!1===v)return(0,a.RulePotential)("Potential_1");continue}}else{if(h){if(k===C.length-1&&!1===f)return(0,a.RulePotential)("Potential_1");continue}if(g){if(k===C.length-1&&!1===f)return(0,a.RulePotential)("Potential_1");continue}}}else{if(h){if(k===C.length-1&&!1===_)return(0,a.RulePotential)("Potential_1");continue}if(g){if(k===C.length-1&&!1===_)return(0,a.RulePotential)("Potential_2");continue}}}}}catch(e){}}}}catch(e){}}}return n?(0,a.RulePass)("Pass_0"):r?(0,a.RulePotential)("Potential_1"):o?(0,a.RulePotential)("Potential_3"):void 0}}},1473(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.style_viewport_resizable=void 0;var a=i(461),n=i(461);t.style_viewport_resizable={id:"style_viewport_resizable",context:"dom:link, dom:style, dom:*[style]",refactor:{WCAG21_Style_Viewport:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{group:"style_viewport_resizable.html",Pass_0:"style_viewport_resizable.html",Potential_1:"style_viewport_resizable.html"}},messages:{"en-US":{group:"Text must scale up to 200% without loss of content or functionality",Pass_0:"Rule Passed",Potential_1:"Verify that text sized using viewport units can be resized up to 200%"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:["1.4.4","1.4.10"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,l=!0,r=/\d+(vw|vh|vmin|vmax)/gi,o=n.nodeName.toLowerCase();if("style"===o){for(var s=0;s<n.ownerDocument.styleSheets.length;s++)if((_=n.ownerDocument.styleSheets[s]).ownerNode===n)try{var u=_.cssRules?_.cssRules:_.rules;if(u)for(var d=0;l&&d<u.length;d++){var c=u[d];if(c.type&&1===c.type){var m=c;if(m.style.fontSize){var p=(v=m.style.fontSize.trim()).match(r);v.length&&p&&(l=!1)}}else if(c.type&&3===c.type&&c.styleSheet){var h=c;if(f=h.styleSheet.cssRules?h.styleSheet.cssRules:h.styleSheet.rules)for(var g=0;l&&g<f.length;g++){var b=f[g];b.type&&1===b.type&&b.style.fontSize&&(p=(v=b.style.fontSize.trim()).match(r),v.length&&p&&(l=!1))}}}}catch(e){}}else if("link"===o)for(s=0;s<n.ownerDocument.styleSheets.length;s++){var _;if((_=n.ownerDocument.styleSheets[s])&&_.ownerNode===n)try{var f;if(f=_.cssRules?_.cssRules:_.rules)for(g=0;l&&g<f.length;g++){var v,A=f[g];if(A.type&&1===A.type&&A.style.fontSize)p=(v=A.style.fontSize.trim()).match(r),v.length&&p&&(l=!1)}}catch(e){}}else{var w=n.getAttribute("style");w&&(p=w.match(/font-size:\s*\d+(vw|vh|vmin|vmax)/gi))&&(l=!1)}return l?(0,a.RulePass)("Pass_0"):(0,a.RulePotential)("Potential_1")}}},1912(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.svg_graphics_labelled=void 0;var a=i(461),n=i(461),l=i(1950),r=i(3946);t.svg_graphics_labelled={id:"svg_graphics_labelled",context:"dom:svg",help:{"en-US":{group:"svg_graphics_labelled.html",pass:"svg_graphics_labelled.html",fail_acc_name:"svg_graphics_labelled.html"}},messages:{"en-US":{group:"A non-decorative SVG element must have an accessible name",pass:"The SVG element has an accessible name",fail_acc_name:"The SVG element has no accessible name"}},rulesets:[{id:["IBM_Accessibility","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[{"7d6734":{pass:"pass",fail_acc_name:"fail"}}],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n)||r.VisUtil.isNodePresentational(n)||l.AccNameUtil.isAccessibleNameIgnorable(n))return null;var o=l.AccNameUtil.computeAccessibleName(n);return o&&o.name&&o.name.trim().length>0?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_acc_name")}}},6539(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_aria_descendants=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139);t.table_aria_descendants={id:"table_aria_descendants",context:"aria:table dom:tr[role], aria:table dom:th[role], aria:table dom:td[role], aria:grid dom:tr[role], aria:grid dom:th[role], aria:grid dom:td[role], aria:treegrid dom:tr[role], aria:treegrid dom:th[role], aria:treegrid dom:td[role]",help:{"en-US":{group:"table_aria_descendants.html",explicit_role:"table_aria_descendants.html"}},messages:{"en-US":{group:"Table structure elements cannot specify an explicit 'role' within table containers",explicit_role:"An explicit ARIA 'role' is not valid for <{0}> element within an ARIA role '{1}' per the ARIA in HTML specification"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,o=r.CommonUtil.isTableDescendant(i);if(null!==o&&0!==o.length){var s=l.AriaUtil.getImplicitRole(n),u=l.AriaUtil.getRoles(n,!1);if(!(s&&s.length>0&&u&&u.length>0&&u.some(function(e){return s.includes(e)})))return(0,a.RuleFail)("explicit_role",[e.dom.node.nodeName.toLowerCase(),o[0].role])}}}},4(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_caption_empty=void 0;var a=i(461),n=i(461),l=i(7139);t.table_caption_empty={id:"table_caption_empty",context:"dom:caption",refactor:{Valerie_Caption_HasContent:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"table_caption_empty.html",Fail_1:"table_caption_empty.html",group:"table_caption_empty.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The <table> element has an empty <caption> element",group:"A <caption> element for a <table> element must contain descriptive text"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;return l.CommonUtil.hasInnerContentHidden(n)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},5334(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_caption_nested=void 0;var a=i(461),n=i(461),l=i(7139);t.table_caption_nested={id:"table_caption_nested",context:"dom:caption",refactor:{Valerie_Caption_InTable:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"table_caption_nested.html",Fail_1:"table_caption_nested.html",group:"table_caption_nested.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"<caption> element is not nested inside a <table> element",group:"The <caption> element must be nested inside the associated <table> element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;return null!=l.CommonUtil.getAncestor(n,"table")?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},2173(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_headers_exists=void 0;var a=i(461),n=i(461),l=i(9196);t.table_headers_exists={id:"table_headers_exists",context:"dom:table",refactor:{RPT_Table_DataHeadingsAria:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"table_headers_exists.html",Fail_1:"table_headers_exists.html",group:"table_headers_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Table has no headers identified",group:"Data table must identify headers"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,r=n.rows;if(!l.TableUtil.isDataTable(n)||null===r||0===r.length)return null;var o=l.TableUtil.tableHeaderExists(n);return null!==o?o?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1"):void 0}}},8349(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_headers_ref_valid=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(1686),s=i(3946),u=i(9955);t.table_headers_ref_valid={id:"table_headers_ref_valid",context:"dom:td[headers], dom:th[headers]",help:{"en-US":{Pass_0:"table_headers_ref_valid.html",Fail_1:"table_headers_ref_valid.html",Fail_2:"table_headers_ref_valid.html",Fail_3:"table_headers_ref_valid.html",Fail_4:"table_headers_ref_valid.html",group:"table_headers_ref_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The 'headers' attribute value \"{0}\" does not reference a valid 'id' in this document",Fail_2:"The 'headers' attribute value \"{0}\" refers to itself",Fail_3:"The 'headers' attribute value \"{0}\" does not refer to a cell in the same table",Fail_4:'The \'headers\' attribute value "{0}" does not refer to a cell indicated with <th> or a role of "columnheader" or "rowheader"',group:"The 'headers' attribute should refer to a valid cell in the same table"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:["a25f45"],run:function(e,t,i){var n=e.dom.node,d=r.CommonUtil.getAncestor(n,"table"),c=u.ARIAMapper.nodeToRole(d);if(null==d||!s.VisUtil.isNodeVisible(d)||!["table","grid"].includes(c))return null;n.nodeName.toLowerCase();var m=n.ownerDocument,p=n.getAttribute("headers");if(!p)return null;for(var h=p.split(" "),g=[],b=[],_=[],f=[],v=0;v<h.length;v++){var A=h[v];if(""!==A.trim()){var w=m.getElementById(A);if(w)if(o.DOMUtil.sameNode(w,n))b.push(A);else if(o.DOMUtil.isInSameTable(w,n)){if("th"!==w.nodeName.toLowerCase()){var y=l.AriaUtil.getRoles(w,!0);y.includes("columnheader")||y.includes("rowheader")||f.push(A)}}else _.push(A);else g.push(A)}}var C=[];return 0!=g.length&&C.push((0,a.RuleFail)("Fail_1",[g.toString()])),0!=b.length&&C.push((0,a.RuleFail)("Fail_2",[b.toString()])),0!=_.length&&C.push((0,a.RuleFail)("Fail_3",[_.toString()])),0!=f.length&&C.push((0,a.RuleFail)("Fail_4",[f.toString()])),0==C.length?(0,a.RulePass)("Pass_0"):C}}},8142(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_headers_related=void 0;var a=i(461),n=i(461),l=i(7139),r=i(4566),o=i(9196);t.table_headers_related={id:"table_headers_related",context:"dom:td, dom:th",refactor:{Valerie_Table_DataCellRelationships:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"table_headers_related.html",Fail_1:"table_headers_related.html",group:"table_headers_related.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Complex table does not have headers for each cell properly defined with 'header' or 'scope'",group:"For a complex data table, all <th> and <td> elements must be related via 'header' or 'scope' attributes"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node,s=l.CommonUtil.getAncestor(n,"table");if(null==s||!o.TableUtil.isComplexDataTable(s))return null;if(null===r.CacheUtil.getCache(n,"table_headers_related",null)){for(var u=[],d=0;d<s.rows.length;++d){var c=s.rows[d];u[d]||(u[d]=[]);for(var m=0;m<c.cells.length;++m){var p=c.cells[m];r.CacheUtil.setCache(p,"table_headers_related",d+":"+m);var h=parseInt(p.getAttribute("colspan"));h||(h=1);var g=parseInt(p.getAttribute("rowspan"));g||(g=1);for(var b=0;u[d][b];)b+=1;for(var _=0;_<g;++_){u[d+_]||(u[d+_]=[]);for(var f=0;f<h;++f)u[d+_][b+f]=p}}}var v=n.ownerDocument,A={},w={};for(d=0;d<u.length;++d){var y=!1;for(m=0;m<u[d].length;++m){var C=u[d][m],k=C.nodeName.toLowerCase();if("th"==k){if("row"==C.getAttribute("scope")?(y=!0,l.CommonUtil.attributeNonEmpty(C,"axis")||(A[r.CacheUtil.getCache(C,"table_headers_related",null)]=!0)):"col"==C.getAttribute("scope")&&(w[m]=!0,l.CommonUtil.attributeNonEmpty(C,"axis")||(A[r.CacheUtil.getCache(C,"table_headers_related",null)]=!0)),l.CommonUtil.attributeNonEmpty(C,"headers")){var R=C.getAttribute("headers").split(" ");for(_=0;_<R.length;++_)(x=v.getElementById(R[_].trim()))&&l.CommonUtil.getAncestor(x,"table")==s&&(A[r.CacheUtil.getCache(x,"table_headers_related",null)]=!0)}}else if("td"==k)if(y||w[m])A[r.CacheUtil.getCache(C,"table_headers_related",null)]=!0;else if(l.CommonUtil.attributeNonEmpty(C,"headers"))for(R=C.getAttribute("headers").split(" "),_=0;_<R.length;++_){var x;(x=v.getElementById(R[_].trim()))&&l.CommonUtil.getAncestor(x,"table")==s&&(A[r.CacheUtil.getCache(C,"table_headers_related",null)]=!0,A[r.CacheUtil.getCache(x,"table_headers_related",null)]=!0)}}}r.CacheUtil.setCache(s,"table_headers_related",A)}var P=r.CacheUtil.getCache(n,"table_headers_related",null),T=r.CacheUtil.getCache(s,"table_headers_related",null),U=P&&T&&P in T;return U||"0:0"!==P||0!=l.CommonUtil.getInnerText(n).trim().length?(U||0!=s.getElementsByTagName("th").length||(!0===r.CacheUtil.getCache(s,"table_headers_related_TrigOnce",!1)?U=!0:r.CacheUtil.setCache(s,"table_headers_related_TrigOnce",!0)),U?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")):null}}},3980(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_layout_linearized=void 0;var a=i(461),n=i(461),l=i(3946),r=i(9196);t.table_layout_linearized={id:"table_layout_linearized",context:"dom:table",refactor:{RPT_Table_LayoutTrigger:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"table_layout_linearized.html",Potential_1:"table_layout_linearized.html",group:"table_layout_linearized.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify table is not being used to format text content in columns unless the table can be linearized",group:"Avoid using tables to format text documents in columns unless the table can be linearized"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_FOUR}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var o=!r.TableUtil.isLayoutTable(n);return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},4701(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_scope_valid=void 0;var a=i(461),n=i(461);t.table_scope_valid={id:"table_scope_valid",context:"dom:td[scope], dom:th[scope]",refactor:{WCAG20_Table_Scope_Valid:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_0:"table_scope_valid.html",Fail_1:"table_scope_valid.html",Fail_2:"table_scope_valid.html",group:"table_scope_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Value provided is invalid for the 'scope' attribute",Fail_2:"The 'scope' attribute should only be used on a <th> element",group:'Value for \'scope\' attribute must be "row", "col", "rowgroup", or "colgroup"'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node;if("td"===n.nodeName.toLowerCase())return(0,a.RuleFail)("Fail_2");var l=n.getAttribute("scope").trim().toLowerCase();return/^(row|col|rowgroup|colgroup)$/.test(l)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},18(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_structure_misuse=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(3946),s=i(9196);t.table_structure_misuse={id:"table_structure_misuse",context:"dom:table",refactor:{WCAG20_Table_Structure:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"table_structure_misuse.html",Fail_1:"table_structure_misuse.html",group:"table_structure_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'The <{0}> element with "presentation" role or "none" role has structural element(s) and/or attribute(s) \'{1}\'',group:'Table elements with \'role="presentation" or \'role="none" should not have structural elements or attributes'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node;if(o.VisUtil.isNodeHiddenFromAT(n))return null;if(s.TableUtil.isDataTable(n))return null;if(l.AriaUtil.isNodeInGrid(n))return null;var u=[];r.CommonUtil.attributeNonEmpty(n,"summary")&&u.push(n);for(var d=n.getElementsByTagName("caption"),c=0;c<d.length;++c)if(r.CommonUtil.getAncestor(d[c],"table")==n){if(r.CommonUtil.shouldNodeBeSkippedHidden(d[c]))continue;u.push(d[c]);break}var m=n.getElementsByTagName("th");for(c=0;c<m.length;++c)if(r.CommonUtil.getAncestor(m[c],"table")==n){if(r.CommonUtil.shouldNodeBeSkippedHidden(m[c]))continue;u.push(m[c]);break}var p=n.getElementsByTagName("td");for(c=0;c<p.length;++c)if((p[c].hasAttribute("scope")||p[c].hasAttribute("headers"))&&r.CommonUtil.getAncestor(p[c],"table")==n){if(r.CommonUtil.shouldNodeBeSkippedHidden(p[c]))continue;u.push(p[c]);break}var h=n.nodeName.toLowerCase(),g=new Array,b={};for(c=0;c<u.length;c++){var _=u[c].nodeName.toLowerCase();b.hasOwnProperty(_)||("table"!=_||b.hasOwnProperty.summary?(b[_]=!0,g.push(_)):(b.summary=!0,g.push("summary")))}var f=g.join(", ");return 0==u.length?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[h,f])}}},9314(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_summary_redundant=void 0;var a=i(461),n=i(461),l=i(7139),r=i(5279),o=i(1686);t.table_summary_redundant={id:"table_summary_redundant",context:"dom:table",refactor:{WCAG20_Table_CapSummRedundant:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"table_summary_redundant.html",Fail_1:"table_summary_redundant.html",group:"table_summary_redundant.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The table summary duplicates the caption",group:"The table summary must not duplicate the caption"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n,s=e.dom.node;if(s.hasAttribute("summary"))n=s.getAttribute("summary").trim().toLowerCase();else if(s.hasAttribute("aria-describedby")){for(var u=s.getAttribute("aria-describedby").split(" "),d="",c=0;c<u.length;c++){var m=u[c];if(m){var p=r.FragmentUtil.getById(s,m);p&&!o.DOMUtil.sameNode(p,s)&&(d+=" "+l.CommonUtil.getInnerText(p).trim().toLowerCase())}}n=d}if(!n)return null;var h=s.getElementsByTagName("caption");if(0===h.length)return null;if(n.length>0){var g=l.CommonUtil.getInnerText(h[0]).trim().toLowerCase();return n.includes(g)?(0,a.RuleFail)("Fail_1"):(0,a.RulePass)("Pass_0")}}}},1667(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.target_spacing_sufficient=void 0;var a=i(7139),n=i(461),l=i(461),r=i(7507),o=i(4919),s=i(4566);t.target_spacing_sufficient={id:"target_spacing_sufficient",context:"dom:*",dependencies:[],help:{"en-US":{group:"target_spacing_sufficient.html",pass_spacing:"target_spacing_sufficient.html",pass_sized:"target_spacing_sufficient.html",pass_inline:"target_spacing_sufficient.html",pass_default:"target_spacing_sufficient.html",violation_spacing:"target_spacing_sufficient.html",recommendation_inline:"target_spacing_sufficient.html",potential_overlap:"target_spacing_sufficient.html"}},messages:{"en-US":{group:"The target must be sufficiently sized or spaced from other targets",pass_spacing:"The target's spacing from other targets is sufficient",pass_sized:"The target’s size is more than 24 CSS pixels",pass_inline:"The target is in a sentence or its size is otherwise constrained by the line-height of non-target text",pass_default:"The target's size is determined by the user agent and is not modified by the author",violation_spacing:'Undersized target "{0}" does not have sufficient spacing of 12 CSS pixels from another target "{1}"',recommendation_inline:'Confirm the inline target "{0}" is sufficiently spaced from another inline target "{1}"',potential_overlap:'Ensure the overlapped target "{0}" meets a minimum target size or has sufficient spacing from the overlapping target "{1}"'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_2"],num:["2.5.8"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE,reasonCodes:["pass_spacing","pass_sized","pass_inline","pass_default","violation_spacing","potential_overlap"]},{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_2"],num:["2.5.8"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE,reasonCodes:["recommendation_inline"]}],act:[],run:function(e,t,i){var l=e.dom.node,u=l.nodeName.toLocaleLowerCase(),d=new r.DOMMapper,c=d.getUnadjustedBounds(l);if(!c)return null;if(!a.CommonUtil.isTarget(l))return null;if(c.height>=24&&c.width>=24)return(0,n.RulePass)("pass_sized");var m=o.CSSUtil.getInlineStatus(l);if(null===m)return null;if(m.inline)return m.text?null===m.violation?(0,n.RulePass)("pass_inline"):(0,n.RulePotential)("recommendation_inline",[u,m.violation]):null===m.violation?(0,n.RulePass)("pass_default"):(0,n.RulePotential)("recommendation_inline",[u,m.violation]);if(o.CSSUtil.isTargetBrowserDefault(l))return(0,n.RulePass)("pass_default");var p=l.ownerDocument;if(!p)return null;var h=getComputedStyle(l);if(null===h)return null;var g=h.zIndex;g&&!isNaN(Number(g))||(g="0");var b=s.CacheUtil.getCache(p.documentElement,"target_spacing_sufficient::targets",void 0);if(void 0===b){b=[];for(var _=p.querySelectorAll("body *:not(script):not(style)"),f=0;f<_.length;f++){var v=_[f];a.CommonUtil.isTarget(v)&&b.push(v)}s.CacheUtil.setCache(p.documentElement,"target_spacing_sufficient::targets",b)}if(b&&0!==b.length){var A=!0,w=24,y=24,C=null,k=null,R=[],x=function(e){var t=b[e],i=l.compareDocumentPosition(t);if(0===i||i&Node.DOCUMENT_POSITION_CONTAINED_BY)return A=!1,"continue";if(i&Node.DOCUMENT_POSITION_CONTAINS||R.some(function(e){return e.contains(t)}))return"continue";var a=d.getUnadjustedBounds(t);if(!a)return"continue";var r=getComputedStyle(t),o="0";if(r&&((o=r.zIndex)&&!isNaN(Number(o))||(o="0")),a.top<=c.top&&a.left<=c.left&&a.top+a.height>=c.top+c.height&&a.left+a.width>=c.left+c.width)return(A?parseInt(g)<parseInt(o):parseInt(g)<=parseInt(o))?{value:null}:{value:(0,n.RulePotential)("potential_overlap",[u,t.nodeName.toLowerCase()])};if(c.top<=a.top&&c.left<=a.left&&c.top+c.height>=a.top+a.height&&c.left+c.width>=a.left+a.width)return(A?parseInt(g)<parseInt(o):parseInt(g)<=parseInt(o))?{value:(0,n.RulePotential)("potential_overlap",[u,t.nodeName.toLowerCase()])}:{value:(0,n.RuleFail)("violation_spacing",[u,t.nodeName.toLowerCase()])};if((c.top>=a.top&&c.top<=a.top+a.height||c.top+c.height<=a.top&&c.top+c.height>=a.top+a.height)&&(c.left>a.left&&c.left<a.left+a.width||a.left>c.left&&a.left<c.left+c.width)||(c.top>a.top&&c.top<a.top+a.height||a.top>c.top&&a.top<c.top+c.height)&&(c.left>=a.left&&c.left<=a.left+a.width||c.left+c.width>=a.left&&c.left+c.width<=a.left+a.width))return{value:(0,n.RulePotential)("potential_overlap",[u,t.nodeName.toLowerCase()])};var s=24,m=24;c.width<24&&(c.top>=a.top&&c.top<=a.top+a.height||c.top<=a.top&&c.top+c.height>a.top)&&(s=Math.min(Math.abs(c.left-a.left),Math.abs(c.left-(a.left+a.width)),Math.abs(c.left+c.width-(a.left+a.width)),Math.abs(c.left+c.width-a.left))),c.height<24&&(c.left>=a.left&&c.left<=a.left+a.width||c.left<=a.left&&c.left+c.width>a.left)&&(m=Math.min(Math.abs(c.top-a.top),Math.abs(c.top-(a.top+a.height)),Math.abs(c.top+c.height-(a.top+a.height)),Math.abs(c.top+c.height-a.top))),s<w&&(w=s,C=t),m<y&&(y=m,k=t),R.push(t)};for(f=0;f<b.length;f++){var P=x(f);if("object"==typeof P)return P.value}return Math.round(c.width/2)+w<12||Math.round(c.height/2)+y<12?Math.round(c.width/2)+w<Math.round(c.height/2)+y?(0,n.RuleFail)("violation_spacing",[u,C.nodeName.toLowerCase()]):(0,n.RuleFail)("violation_spacing",[u,k.nodeName.toLowerCase()]):(0,n.RulePass)("pass_spacing")}}}},9599(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.text_block_heading=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(3864),s=i(4919),u=i(3946);t.text_block_heading={id:"text_block_heading",context:"dom:p, dom:div, dom:br",refactor:{RPT_Block_ShouldBeHeading:{Potential_1:"potential_heading"}},help:{"en-US":{potential_heading:"text_block_heading.html",group:"text_block_heading.html"}},messages:{"en-US":{potential_heading:"Confirm this text '{0}' is used as a heading and if so, modify to use a heading element or role",group:"Heading text should use a heading element or role"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.CommonUtil.isNodeDisabled(n)||!u.VisUtil.isNodeVisible(n))return null;if(null===r.CommonUtil.getAncestor(n,["body"])||null!==r.CommonUtil.getAncestor(n,["script"]))return null;var d=0,c=n.ownerDocument.getElementsByTagName("body");if(null!=c){var m=getComputedStyle(c[0]);m&&(d=s.CSSUtil.getPixelsFromStyle(m["font-size"],c))}var p=0,h=[],g=new o.DOMWalker(n);g.nextNode();for(var b=!1;!b&&g.nextNode()&&g.node!==n&&g.node!==o.DOMWalker.parentNode(n)&&!["br","div","p"].includes(g.node.nodeName.toLowerCase());)if(g.node!==n&&!r.CommonUtil.shouldNodeBeSkippedHidden(g.node)){var _=g.node.nodeName.toLowerCase();if(3===g.node.nodeType){if(g.node.nodeValue.trim().length>0&&g.node.parentElement){var f=getComputedStyle(g.node.parentElement);if(f&&("bold"===f["font-weight"]||f["font-weight"]>=700||f["font-size"]&&f["font-size"].includes("large")||f["font-size"]&&0!==d&&s.CSSUtil.getPixelsFromStyle(f["font-size"],g.node.parentElement)>d)){var v=g.node.nodeValue.trim();(A=r.CommonUtil.wordCount(v))>0&&(h.push(v),p+=A),b=p>10,g.bEndTag=!0}else b=!0}}else if(1===g.node.nodeType)if("b"===_||"strong"===_||"u"===_||"font"===_){var A;v=r.CommonUtil.getInnerText(g.node),(A=r.CommonUtil.wordCount(v))>0&&(h.push(v),p+=A),b=p>10,g.bEndTag=!0}else{var w=l.AriaUtil.getResolvedRole(g.node);b=null!==w&&"generic"!==w&&"paragraph"!==w&&"strong"!==w||"applet"===_}}return 0==p&&(b=!0),b||(b=/[:,;\-\.]$/.test(h.join(" ").trim())),b?null:(0,a.RulePotential)("potential_heading",[h.join(" ")])}}},4672(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.text_contrast_sufficient=void 0;var a=i(7139),n=i(3946),l=i(3883),r=i(461),o=i(461),s=i(4919);t.text_contrast_sufficient={id:"text_contrast_sufficient",context:"dom:*",refactor:{IBMA_Color_Contrast_WCAG2AA:{Pass_0:"pass",Fail_1:"fail_contrast",Potential_1:"potential_same_color"},IBMA_Color_Contrast_WCAG2AA_PV:{pass_0:"pass",potential_1:"potential_graphic_background"}},help:{"en-US":{group:"text_contrast_sufficient.html",pass:"text_contrast_sufficient.html",fail_contrast:"text_contrast_sufficient.html",potential_same_color:"text_contrast_sufficient.html",potential_graphic_background:"text_contrast_sufficient.html",potential_text_shadow:"text_contrast_sufficient.html"}},messages:{"en-US":{group:"The contrast ratio of text with its background must meet WCAG AA requirements",pass:"The contrast ratio of text with its background meets WCAG AA requirements",fail_contrast:"Text contrast of {0} with its background is less than the WCAG AA minimum requirements for text of size {1}px and weight of {2}",potential_same_color:"The foreground text and its background color are both detected as {3}. Verify the text meets the WCAG AA requirements for minimum contrast",potential_graphic_background:"Verify the contrast ratio of the text against the lightest and the darkest colors of the background meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}",potential_text_shadow:"Verify the contrast ratio of the text with shadow meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"1.4.3",level:o.eRulePolicy.VIOLATION,toolkitLevel:o.eToolkitLevel.LEVEL_ONE}],act:["afw4f7"],run:function(e,t,i){var o=e.dom.node,u=o.nodeName.toLowerCase();if(!n.VisUtil.isNodeVisible(o)||null!=n.VisUtil.hiddenByDefaultElements&&null!=n.VisUtil.hiddenByDefaultElements&&n.VisUtil.hiddenByDefaultElements.indexOf(u)>-1)return null;if(a.CommonUtil.isNodeDisabled(o))return null;if(a.CommonUtil.getAncestor(o,["svg","script","meta","style"]))return null;var d=o.ownerDocument;if(!d)return null;var c=d.defaultView;if(!c)return null;var m=a.CommonUtil.getNodeText(o);if(!a.CommonUtil.isShadowHostElement(o)||a.CommonUtil.isShadowHostElement(o)&&""===a.CommonUtil.getNodeText(o.shadowRoot)){if(0==m.trim().length)return null;if(0===(m=m.trim().replace(/[^(a-zA-Z\d\s)\^(\u4e00-\u9fff\u3400-\u4dbf)\u0000-\u0008\u000B-\u001F\u007F-\u009F\u2000-\u200F\u2028-\u202F\u205F-\u206F\u3000\uFEFF]+/g,"")).trim().length)return null}var p=o;if(a.CommonUtil.isShadowHostElement(o)){if(o.shadowRoot)for(var h=o.firstChild;h;h=h.nextSibling)if(3==h.nodeType){p=h.assignedSlot;break}if(null===p)return}var g=c.getComputedStyle(p);if(!1==("0"!==g.width&&"0"!==g.height&&"0"!==g.opacity&&"none"!==g.display&&"hidden"!==g.visibility&&"hidden"!==g.overflow&&("auto"===g.left||"absolute"===g.position&&parseInt(g.left.replace(/[^0-9.+-]/,""))>0)&&("auto"===g.left||"absolute"===g.position&&parseInt(g.top.replace(/[^0-9.+-]/,""))>0)))return null;var b=-1;if("auto"!==g.clip){var _=g.clip.toString();if(_.includes("rect"))for(var f=[],v=/\((.*)\)/g.exec(_)[1].split(", "),A=0;A<v.length;A++)f.push(v[A]);b=parseInt(f[0].replace(/px/g,""))-parseInt(f[2].replace(/px/g,"")),b=Math.abs(b)}if("absolute"===g.position&&b<7&&-1!==b)return null;var w=l.ColorUtil.ColorCombo(p);if(null!==w){var y=w.fg,C=w.bg,k=y.contrastRatio(C),R=s.CSSUtil.getWeightNumber(g.fontWeight),x=s.CSSUtil.getFontInPixels(g.fontSize,p),P=x>=24||x>=18.6&&R>=700;s.CSSUtil.containsCKJ(m)&&(P=x>=29.3||x>=24&&R>=700);var T=k>=4.5||k>=3&&P,U=w.hasBGImage||w.hasGradient,I=w.textShadow,E=a.CommonUtil.isNodeDisabled(p);if(!E){var N=a.CommonUtil.getControlOfLabel(p);N&&(E=a.CommonUtil.isNodeDisabled(N))}return!E&&"label"===u&&a.CommonUtil.isDisabledByFirstChildFormElement(p)&&(E=!0),!E&&o.hasAttribute("id")&&a.CommonUtil.isDisabledByReferringElement(p)&&(E=!0),!T&&E&&(T=!0),T?(0,r.RulePass)("pass",[k.toFixed(2),x,R,y.toHex(),C.toHex(),w.hasBGImage,w.hasGradient]):U?(0,r.RulePotential)("potential_graphic_background",[k.toFixed(2),x,R]):I?(0,r.RulePotential)("potential_text_shadow",[k.toFixed(2),x,R]):y.toHex()===C.toHex()?(0,r.RulePotential)("potential_same_color",[k.toFixed(2),x,R,y.toHex(),C.toHex(),w.hasBGImage,w.hasGradient]):(0,r.RuleFail)("fail_contrast",[k.toFixed(2),x,R,y.toHex(),C.toHex(),w.hasBGImage,w.hasGradient])}console.log("unable to get color combo for element: "+p.nodeName)}}},4353(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.text_quoted_correctly=void 0;var a=i(461),n=i(461),l=i(7139),r=i(3946);t.text_quoted_correctly={id:"text_quoted_correctly",context:"dom:*",help:{"en-US":{Pass_0:"text_quoted_correctly.html",Potential_1:"text_quoted_correctly.html",group:"text_quoted_correctly.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"If the following text is a quotation, mark it as a <q> or <blockquote> element: {0}",group:"Quotations should be marked with <q> or <blockquote> elements"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(!r.VisUtil.isNodeVisible(n))return null;if(null===l.CommonUtil.getAncestor(n,["body"]))return null;for(var o=!0,s=n.firstChild,u=null,d=["blockquote","q","script","style","pre","code","ruby","samp"];o&&s;){if("#text"===s.nodeName){var c=s.nodeValue,m=(c=c.replace(/(\S)'(\S)/g,"$1$2")).match(/("[^"]+")/g),p=c.match(/('[^']+')/g);if((null!==m||null!==p)&&null===l.CommonUtil.getAncestor(s,d)){if(null!=m)for(var h=0;o&&h<m.length;++h)o=l.CommonUtil.wordCount(m[h])<3;if(null!=p)for(h=0;o&&h<p.length;++h)o=l.CommonUtil.wordCount(p[h])<3;u=null===m?p.join(", ").replace(new RegExp("\\r?\\n|\\r","g"),""):null===p?m.join(", ").replace(new RegExp("\\r?\\n|\\r","g"),""):m.concat(p).join(", ").replace(new RegExp("\\r?\\n|\\r","g"),"")}}s=s.nextSibling}return!o&&u.length&&u.length>69&&(u=u.substring(0,32)+" ... "+u.substring(u.length-32)),o?(0,a.RulePass)("Pass_0"):(0,a.RulePotential)("Potential_1",[u])}}},7147(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.text_sensory_misuse=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(4566),s=i(3946);t.text_sensory_misuse={id:"text_sensory_misuse",context:"dom:body, dom:body dom:*",refactor:{RPT_Text_SensoryReference:{Potential_1:"potential_position, potential_other"}},help:{"en-US":{potential_position:"text_sensory_misuse.html",potential_other:"text_sensory_misuse.html",group:"text_sensory_misuse.html"}},messages:{"en-US":{potential_position:"Confirm the word(s) '{0}' of the user instruction is used to indicate a logical rather than visual position",potential_other:"Confirm the user instruction is still understandable without the word(s) '{0}'",group:"Instructions should be meaningful without relying solely on shape, size, or location words"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.3"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node,c=n.nodeName.toLowerCase();if(!s.VisUtil.isNodeVisible(n)||r.CommonUtil.isNodeDisabled(n)||s.VisUtil.hiddenByDefaultElements.includes(c))return null;if(null===r.CommonUtil.getAncestor(n,["body"]))return null;if(null!==r.CommonUtil.getAncestor(n,["script","a","label"]))return null;var m=l.AriaUtil.getResolvedRole(n);if(m){var p=l.AriaUtil.getRolesWithTypes(n,["landmark"]);if(p&&p.includes(m))return null}var h=l.AriaUtil.getRolesWithTypes(n,["widget","heading"]);if(r.CommonUtil.concatUniqueArrayItemList(["caption","cell","code","columnheader","definition","figure","list","listitem","math","meter","row","rowgroup","rowheader","term"],h),null!==l.AriaUtil.getAncestorWithRoles(n,h))return null;for(var g="",b="",_=n.firstChild,f="";_;){if("#text"===_.nodeName){var v=_.nodeValue.trim();v.length>0&&(f+=f.length>0?", "+v:v)}_=_.nextSibling}if(f.length>0){var A=function(e,t){if(!u[t])return"";var i=o.CacheUtil.getCache(e,t+"_sensory_misuse",null);if(null==i){for(var a=u[t].value,n="(ss+|"+a[0],l=1;l<a.length;++l){var r=a[l].trim().split(" ");if(n+="|"+r[0],r.length>1)for(var s=1;s<r.length;++s)n+=" +"+r[s]}n+=")",i=new RegExp(n,"gi"),o.CacheUtil.setCache(e,t+"_sensory_misuse",i)}return i}(n.ownerDocument,"exemptText");f=f.replace(A," "),g=d(n.ownerDocument,"positionText",f),b=d(n.ownerDocument,"otherText",f)}var w=[];return g&&w.push((0,a.RulePotential)("potential_position",[g])),b&&w.push((0,a.RulePotential)("potential_other",[b])),0==w.length?null:w}};var u={positionText:{value:["top-left","top-right","bottom-right","bottom-left","top-to-bottom","left-to-right","bottom-to-top","right-to-left","right","left","above","below","top","bottom","upper","lower","corner","beside"],type:"[string]"},otherText:{value:["round","square","shape","rectangle","triangle","size","large","small","medium","big","huge","tiny","extra","larger","smaller","bigger","little","largest","smallest","biggest"],type:"[string]"},exemptText:{value:["right-click","left-click","right-clicking","right-clicks","left-clicking","left-clicks","square root","right now","off the top"],type:"[string]"}};function d(e,t,i){if(!i)return"";var a=u[t].value,n={},l=[];return i.split(/\s+/).reduce(function(e,t){for(var i=t.replace(/[.?!:;()'",`\]]+$/,""),r=t.toLowerCase().replace(/[.?!:;()'",`\]]/g,""),o=0;o<a.length;o++){var s=r.indexOf(a[o]),u=a[o].length,d=r.charAt(u+s);if(!(s<0)){var c="."==d||"?"==d||"!"==d||":"==d||";"==d||"("==d||")"==d||"'"==d||'"'==d||","==d||".`"==d||"\\"==d||"]"==d,m=!1;if(s>0){var p=r.charAt(s-1);m="-"==p||"."==p||"?"==p||"!"==p||":"==p||";"==p||"("==p||")"==p||"'"==p||'"'==p||","==p||".`"==p||"\\"==p||"]"==p}r.length!=u&&1!=c&&1!=m||(n.hasOwnProperty(i)||(n[i]=!0,l.push(i)),o=a.length)}}return e[i]=(e[i]||0)+1,e},Object.create(null)),l.join(", ")}},1419(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.text_spacing_valid=void 0;var a=i(461),n=i(7139),l=i(3946),r=i(4919),o=i(7507),s=/(-?[\d.]+)([a-z%]*)/;function u(e,t,i){var a;if(i.startsWith("inherit")||i.startsWith("unset")){var n=r.CSSUtil.getAncestorWithStyles(e.parentElement,((a={})[t]=["*"],a),["inherit","unset"]);if(null!==n)return r.CSSUtil.getDefinedStyles(n,[t])[t];if(i.startsWith("unset"))return"initial"}return i}function d(e,t,i,a,n,l){if(void 0===l&&(l=!1),"important"!==e.style.getPropertyPriority(t))return!0;var o=function(e){return e.substring(0,e.length-11)}(i);if("initial"===o||"normal"===o)return!1;var u=parseFloat(o);if(isNaN(u))return!0;var d=o.trim().match(s);if(!d)return!0;var c=d[1],m=d[2];if(""===m){if(l)return!(parseFloat(c)<n);if(0===parseFloat(c))return null}if(""===m&&0!==parseFloat(c))return null;var p=r.CSSUtil.convertValue2Pixels(m,c,e);return!(null!==p&&p/a<n)}t.text_spacing_valid={id:"text_spacing_valid",context:"dom:*",help:{"en-US":{pass:"text_spacing_valid.html",group:"text_spacing_valid.html",fail_letter_spacing_style:"text_spacing_valid.html",fail_word_spacing_style:"text_spacing_valid.html",fail_line_height_style:"text_spacing_valid.html"}},messages:{"en-US":{pass:"CSS !important is not used in inline style to control letter or word spacing or line height",group:"CSS !important should not be used in inline style to control letter or word spacing or line height",fail_letter_spacing_style:"CSS !important should not be used in inline ‘letter-spacing’ style",fail_word_spacing_style:"CSS !important should not be used in inline ‘word-spacing’ style",fail_line_height_style:"CSS !important should not be used in inline ‘line-height’ style"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.4.12"],level:a.eRulePolicy.VIOLATION,toolkitLevel:a.eToolkitLevel.LEVEL_THREE}],act:["9e45ec","24afc2","78fd32"],run:function(e,t,i){for(var c=e.dom.node,m="",p=c.childNodes,h=0;h<p.length;++h)3===p[h].nodeType&&(m+=p[h].nodeValue);if(0===m.trim().length)return null;if(l.VisUtil.isNodeHiddenFromAT(c)||n.CommonUtil.isNodeDisabled(c))return null;var g=(new o.DOMMapper).getUnadjustedBounds(c);if(!g||g.top<0||g.left<0)return null;if(n.CommonUtil.getAncestor(c,"svg"))return null;var b=getComputedStyle(c),_=parseFloat(b.getPropertyValue("font-size")),f=b.getPropertyValue("word-spacing"),v=b.getPropertyValue("letter-spacing"),A=b.getPropertyValue("line-height"),w=!0,y=!0,C=!0;if(f){var k=parseFloat(f);if(!isNaN(k)){var R=r.CSSUtil.convertValue2Pixels("px",k.toString(),c);null!==R&&R/_<.16&&(w=!1)}}if(v){var x=parseFloat(v);if(!isNaN(x)){var P=r.CSSUtil.convertValue2Pixels("px",x.toString(),c);null!==P&&P/_<.12&&(y=!1)}}if(A){var T=parseFloat(A);if(!isNaN(T)){var U=A.match(s);if(U){var I=U[1],E=U[2];""!==E&&"px"!==E||(""===E?parseFloat(I):parseFloat(I)/_)<1.5&&(C=!1)}}}if(w&&y&&C)return null;var N=r.CSSUtil.getDefinedStyles(c,["word-spacing","letter-spacing","line-height"]);if(0===Object.keys(N).length)return null;var L=[],S=N["word-spacing"];if(S){var O=d(c,"word-spacing",S=u(c,"word-spacing",S),_,.16);L.push(O?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_word_spacing_style"))}var q=N["letter-spacing"];q&&(O=d(c,"letter-spacing",q=u(c,"letter-spacing",q),_,.12),L.push(O?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_letter_spacing_style")));var W=N["line-height"];return W&&null===r.CSSUtil.getAncestorWithStyles(c,{overflow:["auto","scroll"],"overflow-x":["auto","scroll"],"overflow-y":["auto","scroll"]})&&(O=d(c,"line-height",W=u(c,"line-height",W),_,1.5,!0),L.push(O?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_line_height_style"))),L.length>0?L:null}}},855(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.text_whitespace_valid=void 0;var a=i(461),n=i(461),l=i(7139);t.text_whitespace_valid={id:"text_whitespace_valid",context:"dom:*",help:{"en-US":{pass:"text_whitespace_valid.html",potential_text:"text_whitespace_valid.html",group:"text_whitespace_valid.html"}},messages:{"en-US":{pass:"Rule Passed",potential_text:"Space characters should not be used to create space between the letters of a word",group:"Space characters should not be used to control spacing within a word"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,r=l.CommonUtil.getAncestor(n,["body","script","code"]);if(null==r||"body"!=r.nodeName.toLowerCase())return null;for(var o=!0,s=n.firstChild;o&&s;){if("#text"==s.nodeName){var u=s.nodeValue;o=!/(^|\s)[a-zA-Z] [a-zA-Z] [a-zA-Z]($|\s)/.test(u)}s=s.nextSibling}return o?(0,a.RulePass)("pass"):(0,a.RulePotential)("potential_text")}}},3420(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.widget_tabbable_exists=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(9955),s=i(3864),u=i(3946);t.widget_tabbable_exists={id:"widget_tabbable_exists",context:"aria:button,aria:link,aria:spinbutton,aria:tablist,aria:combobox,aria:listbox,aria:menu,aria:radiogroup,aria:tree,aria:menubar, aria:grid, aria:treegrid, aria:checkbox,aria:slider,aria:spinbutton,aria:textbox,aria:scrollbar,aria:slider,aria:spinbutton",refactor:{IBMA_Focus_Tabbable:{pass:"pass",fail_no_tabbable:"fail_no_tabbable"}},help:{"en-US":{pass:"widget_tabbable_exists.html",fail_no_tabbable:"widget_tabbable_exists.html",group:"widget_tabbable_exists.html"}},messages:{"en-US":{pass:"Rule Passed",fail_no_tabbable:'Component with "{0}" role does not have a tabbable element',group:"Component must have at least one tabbable element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(!u.VisUtil.isNodeHiddenFromAT(n)&&!r.CommonUtil.isNodeDisabled(n)&&!l.AriaUtil.shouldBePresentationalChild(n)){if("datalist"===n.nodeName.toLowerCase())return null;for(var d=0,c=["combobox","grid","listbox","menu","menubar","radiogroup","tablist","tree","treegrid"];d<c.length;d++){var m=c[d];if(null!=l.AriaUtil.getAncestorWithRole(n,m,!0))return null}var p=o.ARIAMapper.nodeToRole(n),h=0;if(r.CommonUtil.isTabbable(n)&&++h,h<1&&!l.AriaUtil.containsPresentationalChildrenOnly(n)&&n.firstChild)for(var g=new s.DOMWalker(n);h<1&&g.nextNode()&&g.node!=n;)1==g.node.nodeType&&!g.bEndTag&&r.CommonUtil.isTabbable(g.node)&&++h;return h>=1?(0,a.RulePass)("pass"):(0,a.RulePotential)("fail_no_tabbable",[p])}}}},408(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.widget_tabbable_single=void 0;var a=i(461),n=i(461),l=i(3864),r=i(7011),o=i(7139),s=i(9955),u=i(4566),d=i(3946);t.widget_tabbable_single={id:"widget_tabbable_single",context:"aria:button,aria:link,aria:menuitem,aria:spinbutton,aria:tablist,aria:combobox,aria:listbox,aria:menu,aria:radiogroup,aria:tree,aria:checkbox,aria:option,aria:radio,aria:slider,aria:spinbutton,aria:textbox,aria:columnheader,aria:rowheader,aria:slider,aria:tab",refactor:{IBMA_Focus_MultiTab:{pass:"pass",potential_multiple_tabbable:"potential_multiple_tabbable"}},help:{"en-US":{pass:"widget_tabbable_single.html",potential_multiple_tabbable:"widget_tabbable_single.html",group:"widget_tabbable_single.html"}},messages:{"en-US":{pass:"Components with a widget role should have no more than one tabbable element",potential_multiple_tabbable:'Component with "{0}" role has more than one tabbable element',group:"Components with a widget role must have no more than one tabbable element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1","2.4.3"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(!d.VisUtil.isNodeHiddenFromAT(n)&&!o.CommonUtil.isNodeDisabled(n)&&!r.AriaUtil.shouldBePresentationalChild(n)){var c=s.ARIAMapper.nodeToRole(n),m=0;if(o.CommonUtil.isTabbable(n)&&++m,m<2&&!r.AriaUtil.containsPresentationalChildrenOnly(n)&&n.firstChild)for(var p=new l.DOMWalker(n);m<2&&p.nextNode()&&p.node!=n;)1==p.node.nodeType&&!p.bEndTag&&o.CommonUtil.isTabbable(p.node)&&++m;var h=m<2;return h||u.CacheUtil.setCache(n,"widget_tabbable_single","potential_multiple_tabbable"),h?(0,a.RulePass)("pass"):(0,a.RulePotential)("potential_multiple_tabbable",[c])}}}},6160(e,t,i){var a=this&&this.__createBinding||(Object.create?function(e,t,i,a){void 0===a&&(a=i);var n=Object.getOwnPropertyDescriptor(t,i);n&&!("get"in n?!t.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,a,n)}:function(e,t,i,a){void 0===a&&(a=i),e[a]=t[i]}),n=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),l=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&a(t,e,i);return n(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.a11yRulesets=void 0;var r=l(i(8855)),o=i(8601),s=[];for(var u in r)s.push(r[u]);var d={"1.1.1":"All non-text content that is presented to the user has a text alternative that serves the equivalent purpose.","1.2.1":"For prerecorded audio-only or video-only media, an alternative provides equivalent information.","1.2.2":"Captions are provided for all prerecorded audio content in synchronized media.","1.2.3":"An alternative for time-based media or audio description of the prerecorded video content is provided for synchronized media.","1.2.4":"Captions are provided for all live audio content in synchronized media.","1.2.5":"Audio description is provided for all prerecorded video content in synchronized media.","1.3.1":"Information, structure, and relationships conveyed through presentation can be programmatically determined or are available in text.","1.3.2":"When the sequence in which content is presented affects its meaning, a correct reading sequence can be programmatically determined.","1.3.3":"Instructions provided for understanding and operating content do not rely solely on sensory characteristics of components such as shape, size, visual location, orientation, or sound.","1.3.4":"Content does not restrict its view and operation to a single display orientation, such as portrait or landscape.","1.3.5":"The purpose of each input field that collects information about the user can be programmatically determined when the field serves a common purpose.","1.4.1":"Color is not used as the only visual means of conveying information, indicating an action, prompting a response, or distinguishing a visual element.","1.4.2":"If any audio plays automatically for more than 3 seconds, either a mechanism is available to pause or stop the audio, or a mechanism is available to control audio volume independently from the overall system volume level.","1.4.3":"The visual presentation of text and images of text has a contrast ratio of at least 4.5:1, with a 3:1 ratio for large-scale text.","1.4.4":"Text can be resized without assistive technology up to 200 percent without loss of content or functionality.","1.4.5":"If the technologies being used can achieve the visual presentation, text should not be used to convey information rather than images of text.","1.4.10":"Content can reflow without loss of information or functionality, and without requiring scrolling in two dimensions.","1.4.11":"The parts of graphical objects required to understand the content, and the visual information required to identify UI components and states, have a contrast ratio of at least 3:1 against adjacent colors.","1.4.12":"No loss of content or functionality occurs when users change letter, word and paragraph spacing, as well as line height.","1.4.13":"Where hover or focus actions cause additional content to become visible and hidden, the additional content is dismissable, hoverable and persistent.","2.1.1":"All functionality of the content is operable through a keyboard interface without requiring specific timings for individual keystrokes.","2.1.2":"If keyboard focus can be moved to a component using a keyboard interface, then focus can be moved away from that component using only a keyboard interface, and, if it requires more than unmodified arrow or tab keys or other standard exit methods, the user is advised of the method for moving focus away.","2.1.4":"If a keyboard shortcut is implemented using only letter, punctuation, number or symbol characters, then the shortcut can be turned off, remapped or activated only on focus.","2.2.1":"For each time limit that is set by the content, the user can turn off, adjust, or extend the limit.","2.2.2":"For moving, blinking, scrolling, or auto-updating information, the user can pause, stop, hide or adjust the information.","2.3.1":"Content does not contain anything that flashes more than three times in any one second period, or the flash is below the general flash and red flash thresholds.","2.4.1":"A mechanism is available to bypass blocks of content that are repeated on multiple Web pages.","2.4.2":"Web pages, non-web documents, and software have titles that describe topic or purpose.","2.4.3":"If content can be navigated sequentially and the navigation sequences affect meaning or operation, focusable components receive focus in an order that preserves meaning and operability.","2.4.4":"The purpose of each link can be determined from the link text alone or from the link text together with its programmatically determined link content.","2.4.5":"More than one way is available to locate a Web page within a set of Web pages, except where the Web Page is the result of, or a step in, a process.","2.4.6":"Headings and labels describe topic or purpose.","2.4.7":"Any keyboard operable user interface has a mode of operation where the keyboard focus indicator is visible.","2.4.11":"When an element receives focus, it is not entirely covered by other content.","2.5.1":"All functionality that uses multipoint or path-based gestures for operation can be operated with a single pointer without a path-based gesture.","2.5.2":"For functionality that can be operated using a single pointer, completion of the function is on the up-event with an ability to abort, undo or reverse the outcome.","2.5.3":"For user interface components with labels that include text or images of text, the accessible name contains the text that is presented visually.","2.5.4":"Functionality that can be operated by motion can also be operated by user interface components, and the motion trigger can be disabled.","2.5.8":"The size of the target for pointer inputs is at least 24 by 24 CSS pixels.","2.5.7":"All functionality that uses a dragging movement for operation can be achieved by a single pointer without dragging.","3.1.1":"The default human language of Web pages, non-Web documents, or software can be programmatically determined.","3.1.2":"The human language of each passage or phrase in the content can be programmatically determined.","3.2.1":"When any component receives focus, it does not initiate a change of context.","3.2.2":"Changing the setting of any user interface component does not automatically cause a change of context unless the user has been advised of the behavior before using the component.","3.2.3":"Navigational mechanisms that are repeated on multiple Web pages within a set of Web pages occur in the same relative order each time they are repeated, unless a change is initiated by the user.","3.2.4":"Components that have the same functionality within a set of Web pages are identified consistently.","3.2.6":"Make it easier to find help and support. If a Web page contains help mechanisms they occur in the same order relative to other page content, unless a change is initiated by the user.","3.3.1":"If an input error is automatically detected, the item that is in error is identified and the error is described to the user in text.","3.3.2":"Labels or instructions are provided when content requires user input.","3.3.3":"If an input error is automatically detected and suggestions for correction are known, then the suggestions are provided to the user, unless it would jeopardize the security or purpose of the content.","3.3.4":"For content that cause legal commitments or financial transactions for the user to occur, that modify or delete user-controllable data in data storage systems, or that submit user test responses, the user can reverse, correct, or confirm the action.","3.3.7":"Make it easier for users to complete multi-step processes. Don't ask for the same information twice in the same session.","3.3.8":"Make logins possible with less mental effort. Don't make people solve, recall, or transcribe something to log in.","4.1.1":"(Obsolete and removed) This requirement was originally adopted to address problems that assistive technology (AT) had directly parsing HTML. AT no longer has any need to directly parse HTML. Consequently, these problems either no longer exist or are addressed by other requirements.","4.1.2":"For all user interface components (including, but not limited to: form elements, links and components generated by scripts), the name and role can be programmatically determined; states, properties, and values that can be set by the user can be programmatically set; and notification of changes to these items is available to user agents, including assistive technologies.","4.1.3":"In content implemented using markup languages, status messages can be programmatically determined through role or properties such that they can be presented to the user by assistive technologies without receiving focus.",HTML:"The HTML specification issues that cause accessibility issues may be covered by other rules and will be reported under those accessibility requirements. However, some non-conforming HTML specification issues are still reported.",ARIA:"The ARIA specification issues that cause accessibility issues may be covered by other rules and will be reported under those accessibility requirements. However, some non-conforming ARIA specification issues are still reported."};t.a11yRulesets=[{id:"EXTENSIONS",name:"Extension Rules",category:o.eGuidelineCategory.ACCESSIBILITY,description:"Rules for enabling the browser extensions",type:o.eGuidelineType.EXTENSION,checkpoints:[{num:"1",name:"Extension CP 1",wcagLevel:"A",summary:"Rules for Extension"}]},{id:"IBM_Accessibility",name:"IBM Accessibility 7.3",category:o.eGuidelineCategory.ACCESSIBILITY,description:"Rules for WCAG 2.0, 2.1, 2.2 A and AA plus additional IBM supplemental requirements.",checkpoints:s.filter(function(e){return!("A"!==e.level&&"AA"!==e.level&&"NA"!==e.level||"2.0"!==e.wcagType&&"2.1"!==e.wcagType&&"2.2"!==e.wcagType&&"NA"!==e.wcagType)}).map(function(e){return{num:e.num,scId:e.scId,name:e.handle,wcagLevel:e.level,summary:d[e.num]}})},{id:"IBM_Accessibility_next",name:"IBM Accessibility next",category:o.eGuidelineCategory.ACCESSIBILITY,description:"Rules for WCAG 2.0, 2.1, 2.2 A and AA plus additional IBM supplemental requirements.",checkpoints:s.filter(function(e){return!("A"!==e.level&&"AA"!==e.level&&"NA"!==e.level||"2.0"!==e.wcagType&&"2.1"!==e.wcagType&&"2.2"!==e.wcagType&&"NA"!==e.wcagType)}).map(function(e){return{num:e.num,scId:e.scId,name:e.handle,wcagLevel:e.level,summary:d[e.num]}})},{id:"WCAG_2_2",name:"WCAG 2.2 (A, AA)",category:o.eGuidelineCategory.ACCESSIBILITY,description:"Rules for WCAG 2.2 A & AA. This is the current W3C recommendation (specification). Content that conforms to WCAG 2.2 also conforms to WCAG 2.1.",checkpoints:s.filter(function(e){return!("A"!==e.level&&"AA"!==e.level||"2.0"!==e.wcagType&&"2.1"!==e.wcagType&&"2.2"!==e.wcagType)}).map(function(e){return{num:e.num,scId:e.scId,name:e.handle,wcagLevel:e.level,summary:d[e.num]}})},{id:"WCAG_2_1",name:"WCAG 2.1 (A, AA)",category:o.eGuidelineCategory.ACCESSIBILITY,description:"Rules for WCAG 2.1 A & AA. Content that conforms to WCAG 2.1 also conforms to WCAG 2.0.",checkpoints:s.filter(function(e){return!("A"!==e.level&&"AA"!==e.level||"2.0"!==e.wcagType&&"2.1"!==e.wcagType)}).map(function(e){return{num:e.num,scId:e.scId,name:e.handle,wcagLevel:e.level,summary:d[e.num]}})},{id:"WCAG_2_0",name:"WCAG 2.0 (A, AA)",category:o.eGuidelineCategory.ACCESSIBILITY,description:"Rules for WCAG 2.0 A & AA. Referenced by US Section 508, but not the latest W3C recommendation.",checkpoints:s.filter(function(e){return("A"===e.level||"AA"===e.level)&&"2.0"===e.wcagType}).map(function(e){return{num:e.num,scId:e.scId,name:e.handle,wcagLevel:e.level,summary:d[e.num]}})}]},5233(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.SRController=void 0;var a=i(8195),n=i(7014),l=i(248),r=i(4566),o=i(2165),s=i(3946),u=function(){function e(e){void 0===e&&(e=document.body),this.rootElement=e,this.liveListeners=[],this.ctrlDoc=e.ownerDocument,this.setPointOfRegard(e),this.setupMutationTracking(),console.info('[WARNING] The SRController is a new feature that is not yet "stable". What this means:\n* API subject to change, even between minor versions of the checker\n* Results should be considered experimental. There are a variety of known issues, but making this available for early experimentation / feedback.')}return e.getController=function(t){return void 0===t&&(t=document),this.singleton||(this.singleton=new e(t.body)),this.singleton},e.prototype.disconnect=function(){this.mutationObserver&&this.mutationObserver.disconnect()},e.prototype.findAllShadowRoots=function(e){void 0===e&&(e=document);for(var t,i=[],a=this.ctrlDoc.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,null);t=a.nextNode();){var n=t;if(n.shadowRoot){i.push(n.shadowRoot);var l=this.findAllShadowRoots(n.shadowRoot);i.push.apply(i,l)}}return i},e.prototype.setupMutationTracking=function(){var e=this;this.mutationObserver&&this.mutationObserver.disconnect();var t=this,i=new MutationObserver(function(l){for(var r=t.pointOfRegard.getNode(),o=function(e){e.removedNodes.forEach(function(t){(t.isSameNode(r)||t.contains(r))&&(console.info("Adjusting PoR due to DOM mutation removing PoR"),r=e.target)})},u=0,d=l.filter(function(e){var t;return(null===(t=e.removedNodes)||void 0===t?void 0:t.length)>0});u<d.length;u++)o(d[u]);e.setPointOfRegard(r);for(var c=function(t){t.addedNodes&&t.addedNodes.forEach(function(t){for(var a=0,n=e.findAllShadowRoots(t);a<n.length;a++){var l=n[a];i.observe(l,{childList:!0,subtree:!0,characterData:!0})}});var l=t.target,r=1===l.nodeType?l:l.parentElement;if(r&&!r.closest('[aria-busy="true"]')&&"true"!==r.getAttribute("aria-busy")){var o=(["polite","assertive"].includes(r.getAttribute("aria-live"))||"OUTPUT"===r.nodeName.toUpperCase()||["status","log","progressbar","alert","timer"].includes(r.getAttribute("role")))&&r||r.closest('[aria-live="polite"],[aria-live="assertive"],output,[role="status"],[role="log"],[role="progressbar"],[role="alert"],[role="timer"]'),u=!1,d=["additions","text"];if(o){var c=r.closest("[aria-relevant]");c&&(d=c.getAttribute("aria-relevant").split(/ +/g)),"log"===o.getAttribute("role")&&(d=["additions"]),o.hasAttribute("aria-relevant")&&(d=o.getAttribute("aria-relevant").split(/ +/g)),d.includes("all")&&(d=["additions","removals","text"]),u=3===t.target.nodeType&&d.includes("text")||t.addedNodes.length>0&&d.includes("additions")||t.removedNodes.length>0&&d.includes("removals")}if(o&&u){var m="true"===o.getAttribute("aria-atomic")||["alert","status","timer","marquee"].includes(o.getAttribute("role"));if(m||"characterData"!==t.type||3!==t.target.nodeType||s.VisUtil.isNodeHiddenFromAT(t.target.parentElement)){var p=m?o:t.target;p.liveAnnounce&&clearTimeout(p.liveAnnounce),p.liveAnnounce=setTimeout(function(){var i=[],l=d.includes("removals")&&t.removedNodes.length>0;if(m||l){var r=new a.SRCursor(p,!1),o=new a.SRCursor(p,!0);o.next(function(){return!0}),i.push((l?"[removed] ":"")+n.SRRenderer.renderRange("item",r,o))}else d.includes("additions")&&t.addedNodes.length>0&&t.addedNodes.forEach(function(e){var t=new a.SRCursor(e,!1),l=new a.SRCursor(e,!0);l.next(function(){return!0}),i.push(n.SRRenderer.renderRange("item",t,l))});for(var s=0,u=e.liveListeners;s<u.length;s++)(0,u[s])(i.join("\n"))},100)}else for(var h=0,g=e.liveListeners;h<g.length;h++)(0,g[h])(t.target.nodeValue)}}},m=0,p=l;m<p.length;m++)c(p[m])}),l=this.findAllShadowRoots(this.ctrlDoc.documentElement);l.push(this.ctrlDoc.documentElement);for(var r=0,o=l;r<o.length;r++){var u=o[r];i.observe(u,{childList:!0,subtree:!0,characterData:!0})}},e.prototype.addLiveListener=function(e){this.liveListeners.push(e)},e.prototype.removeLiveListener=function(e){this.liveListeners=this.liveListeners.filter(function(t){return t!==e})},e.prototype.getPointOfRegard=function(){return this.pointOfRegard},e.prototype.setPointOfRegard=function(t){var i;try{this.pointOfRegard=new a.SRCursor(t);var l=e.diffContainers("focus",this.pointOfRegard),r=this.pointOfRegard.getRole(),o=null===(i=this.pointOfRegard.getNameInfo())||void 0===i?void 0:i.name;return{success:!0,renderingResult:n.SRRenderer.renderCurrent("focus",this.pointOfRegard,l),role:r,name:o}}catch(e){return{success:!1,renderingResult:{start:this.pointOfRegard.clone(),end:this.pointOfRegard.clone(),message:"Failed to set point of regard: ".concat(e.message)}}}},e.prototype.jumpNext=function(t){var i;r.CacheUtil.clearCaches(this.ctrlDoc.documentElement);var a=this.pointOfRegard.clone();try{for(var o=!0,s=this.pointOfRegard.clone(),u=void 0;o&&s;){var d=s.clone();if(s=l.SRNavigator.jumpNext(t,s)){var c=e.diffContainers(t,s,d);"item"!==t||l.SRNavigator.getStartFunc(t)(s.getRole(),!s.isEndTag(),s.getNode())||(c={entering:[],leaving:[]}),o=0===(u=n.SRRenderer.renderCurrent(t,s,c)).message.trim().length&&!["region"].includes(t)}}if(s)return this.pointOfRegard=s,{success:!0,renderingResult:u,role:this.pointOfRegard.getRole(),name:null===(i=this.pointOfRegard.getNameInfo())||void 0===i?void 0:i.name};this.pointOfRegard=a;var m=n.SRRenderer.renderCurrent(t,a,{leaving:[],entering:[]});return{success:!1,renderingResult:{start:a.clone(),end:a.clone(),message:"No next ".concat(t,". ").concat((null==m?void 0:m.message)||"")}}}catch(e){return console.error(e),this.pointOfRegard=a,{success:!1,renderingResult:{start:a.clone(),end:a.clone(),message:"Navigation error: ".concat(e.message)}}}finally{console.groupEnd()}},e.prototype.jumpPrevious=function(t){var i;r.CacheUtil.clearCaches(this.ctrlDoc.documentElement);var a=this.pointOfRegard.clone();try{for(var o=!0,s=this.pointOfRegard.clone(),u=void 0;o&&s;){var d=s.clone();if(s=l.SRNavigator.jumpPrevious(t,s)){var c=e.diffContainers(t,s,d);"item"!==t||l.SRNavigator.getStartFunc(t)(s.getRole(),!s.isEndTag(),s.getNode())||(c={entering:[],leaving:[]}),o=0===(u=n.SRRenderer.renderCurrent(t,s,c)).message.trim().length&&!["region"].includes(t)}}if(s)return this.pointOfRegard=s,{success:!0,renderingResult:u,role:this.pointOfRegard.getRole(),name:null===(i=this.pointOfRegard.getNameInfo())||void 0===i?void 0:i.name};this.pointOfRegard=a;var m=n.SRRenderer.renderCurrent(t,a,{leaving:[],entering:[]});return{success:!1,renderingResult:{start:a.clone(),end:a.clone(),message:"No previous ".concat(t,". ").concat((null==m?void 0:m.message)||"")}}}catch(e){return console.error(e),this.pointOfRegard=a,{success:!1,renderingResult:{start:a.clone(),end:a.clone(),message:"Navigation error: ".concat(e.message)}}}},e.diffContainers=function(t,i,l){var r=[],o=[];try{var s=i?i.getNode().ownerDocument.body||i.getNode().ownerDocument.documentElement:l?l.getNode().ownerDocument.body||l.getNode().ownerDocument.documentElement:document.body||document.documentElement,u=i?i.clone():new a.SRCursor(s),d=l?l.clone():new a.SRCursor(s);if(!u.getNode().isSameNode(d.getNode())){var c=e.commonParent(u,d);if(c){for(;c.contains(u);)o.push(n.SRRenderer.renderEnter(t,u,d)),u.parent();for(o.reverse(),o=o.filter(function(e){return e&&e.trim().length>0}).map(function(e){return e.trim()});c.contains(d);)r.push(n.SRRenderer.renderLeave(t,d,d)),d.parent();r=r.filter(function(e){return e&&e.trim().length>0}).map(function(e){return e.trim()})}}}catch(e){console.error(e)}return{leaving:r,entering:o}},e.commonParent=function(e,t){if(e.contains(t))return e.clone();if(t.contains(e))return t.clone();for(var i=e.clone();!i.contains(t)&&i.parent(););return i.contains(e)&&i.contains(t)?i:null},e.renderAll=function(t){var i=e.getController();i.ctrlDoc.body.querySelectorAll("dialog,[role='dialog']").forEach(function(e){o.SRUtil.isModalDialogElement(e)&&i.setPointOfRegard(e)});var a=[],l=n.SRRenderer.renderCurrent(t,i.getPointOfRegard(),{entering:[],leaving:[]});l&&a.push(l.message);for(var r=!0;r;){var s=i.jumpNext(t);s.success?a.push(s.renderingResult.message):r=!1}return a},e.renderAllDetail=function(t,i){var a=e.getController(t);a.setPointOfRegard(t.body),t.body.querySelectorAll("dialog,[role='dialog']").forEach(function(e){o.SRUtil.isModalDialogElement(e)&&a.setPointOfRegard(e)});var l=[],r=n.SRRenderer.renderCurrent(i,a.getPointOfRegard(),{entering:[],leaving:[]});r&&l.push(r);for(var s=!0;s;){var u=a.jumpNext(i);u.success?l.push(u.renderingResult):s=!1}return l},e.renderStructure=function(t){for(var i,n=["region","heading","item","tab_focus","image"],l=n.map(function(i){return e.renderAllDetail(t,i)}),r=[],s=function(){var e=null===(i=l[0][0])||void 0===i?void 0:i.start;n.forEach(function(t,i){l[i].length>0&&(!e||a.SRCursor.compare(l[i][0].start,e)<0)&&(e=l[i][0].start)});var s={},u=!1;if(n.forEach(function(t,i){s[t]="",l[i].length>0&&0===a.SRCursor.compare(l[i][0].start,e)&&(s[t]=l[i].shift().message,u=""!==s[t])}),u){var d=e.getElement(),c=d&&o.SRUtil.getUniqueSelector(d);c&&t.querySelector(c)&&(s.selector=c),r.push(s)}};l.some(function(e){return e.length>0});)s();return r},e}();t.SRController=u},8195(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.SRCursor=void 0;var a=i(3864),n=i(1950),l=i(7011),r=i(7139),o=i(2165),s=function(){function e(e,t){this.walker=new a.DOMWalker(e,t,void 0,!1),e&&this.refreshName()}return e.prototype.clone=function(){var t=new e(this.walker.node,this.walker.bEndTag);return t.role=this.role,t.name=this.name,t},e.prototype.refreshName=function(){1===this.walker.node.nodeType?(this.role=l.AriaUtil.getResolvedRole(this.walker.node,!0),this.name=n.AccNameUtil.computeAccessibleName(this.walker.node)):3===this.walker.node.nodeType?(this.role="text",this.name={name:this.walker.node.textContent,nameFrom:"text"}):(this.role=void 0,this.name=void 0)},e.prototype.next=function(e,t){var i,a=!1;this.refreshName();var n=t&&t(this)||{skipCurrent:!1,skipChildren:!1},r=n.skipCurrent,s=n.skipChildren;do{if(s&&!this.walker.bEndTag)this.walker.bEndTag=!0;else if(!this.walker.nextNode())break;if(this.refreshName(),r=(i=t&&t(this)||{skipCurrent:!1,skipChildren:!1}).skipCurrent,s=i.skipChildren,1===this.walker.node.nodeType?this.role=l.AriaUtil.getResolvedRole(this.walker.node,!0):3===this.walker.node.nodeType&&(this.role="text"),o.SRUtil.isModalDialogElement(this.getNode())&&this.isEndTag())break;r||(a=e(this.role,!this.walker.bEndTag,this.walker.node))}while(!a);return a?this.refreshName():(this.role=void 0,this.name=void 0),a},e.prototype.previous=function(e,t){var i,a=!1;this.refreshName();var n=t&&t(this)||{skipCurrent:!1,skipChildren:!1},r=n.skipCurrent,s=n.skipChildren;do{if(s&&this.walker.bEndTag)this.walker.bEndTag=!1;else if(!this.walker.prevNode())break;if(this.refreshName(),r=(i=t&&t(this)||{skipCurrent:!1,skipChildren:!1}).skipCurrent,s=i.skipChildren,1===this.walker.node.nodeType?this.role=l.AriaUtil.getResolvedRole(this.walker.node,!0):3===this.walker.node.nodeType&&(this.role="text"),o.SRUtil.isModalDialogElement(this.getNode())&&!this.isEndTag())break;r||(a=e(this.role,!this.walker.bEndTag,this.walker.node))}while(!a);return a?this.refreshName():(this.role=void 0,this.name=void 0),a},e.prototype.parent=function(e){return!!this.walker.node.parentNode&&(this.walker.node=this.walker.node.parentNode,this.walker.bEndTag=!0===e,1===this.walker.node.nodeType?(this.role=l.AriaUtil.getResolvedRole(this.walker.node,!0),this.name=n.AccNameUtil.computeAccessibleName(this.walker.node)):3===this.walker.node.nodeType?(this.role="text",this.name={name:this.walker.node.textContent,nameFrom:"text"}):(this.role=void 0,this.name=void 0),!0)},e.prototype.getCurrentOrParentByRole=function(e,t){for(var i=this,a=t?t.map(function(e){return e.toUpperCase()}):[],n=function(t){var n=t.getElement();return e.includes(i.getRole())||n&&!n.hasAttribute("role")&&a.includes(n.nodeName.toUpperCase())};!n(this)&&this.parent(););return n(this)},e.prototype.getCurrentOrParentByRoleClone=function(e,t){var i=this.clone();return i.getCurrentOrParentByRole(e,t)?i:null},e.prototype.getCurrentOrParentTabbableClone=function(){for(var e=this.clone();e;){var t=e.getElement();if(e.isStartTag()&&t&&r.CommonUtil.isTabbable(t))return e;if(!e.parent(!1))break}return null},e.prototype.getRole=function(){return this.role},e.prototype.getNameInfo=function(){return this.name},e.prototype.getName=function(){var e=this.getNameInfo();if(e&&e.name)return e.name;var t=this.getElement();if(t){var i=r.CommonUtil.getLabelForElementHidden(t,!0);if(i)return i.innerText||i.textContent}},e.prototype.setEndTag=function(e){this.walker.bEndTag=e},e.prototype.getNode=function(){return this.walker.node},e.prototype.getElement=function(){if(this.walker.node&&1===this.walker.node.nodeType)return this.walker.node},e.prototype.getParentElement=function(){if(!this.walker.node)return null;var e=this.clone();return e.walker.node=a.DOMWalker.parentElement(e.walker.node),e},e.prototype.isEndTag=function(){return this.walker.bEndTag},e.prototype.isStartTag=function(){return!this.walker.bEndTag},e.compare=function(e,t){var i,n,l=null===(i=null==e?void 0:e.walker)||void 0===i?void 0:i.node,r=null===(n=null==t?void 0:t.walker)||void 0===n?void 0:n.node;if(!l&&!r)return 0;if(!l)return 1;if(!r)return-1;var o=l.compareDocumentPosition(r);if(1&o){for(var s=[l],u=[r],d=l;d=a.DOMWalker.parentNode(d);)s.push(d);for(d=r;d=a.DOMWalker.parentNode(d);)u.push(d);s.reverse(),u.reverse();for(var c=0;c<s.length&&c<u.length&&s[c]===u[c];)c++;if(c===s.length)return e.walker.bEndTag?1:-1;if(c===u.length)return t.walker.bEndTag?-1:1;if(c>0){var m=s[c],p=u[c],h=m.compareDocumentPosition(p);if(2&h)return 1;if(4&h)return-1}return 0}return 8&o?t.walker.bEndTag?-1:1:16&o?e.walker.bEndTag?1:-1:2&o?1:4&o?-1:0},e.prototype.contains=function(e){return this.getNode().contains(e.getNode())&&!this.isSameNode(e)},e.prototype.isSameNode=function(e){return!!e&&this.getNode().isSameNode(e.getNode())},e.prototype.hasNonEmptyName=function(){var e;return((null===(e=this.getNameInfo())||void 0===e?void 0:e.name)||"").trim().length>0},e}();t.SRCursor=s},248(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.SRNavigator=void 0;var a=i(3864),n=i(1950),l=i(8195),r=i(7139),o=i(3946),s=i(7011);!function(e){function t(e){var i;if(1!==e.nodeType)return!1;if("br"===e.nodeName.toLowerCase())return!0;var n=e,l=n.ownerDocument.defaultView,r=null===(i=l.getComputedStyle(n))||void 0===i?void 0:i.display;if(r&&r.startsWith("table"))return!0;if("block"===r&&"block"!==n.style.display&&n.parentElement&&"flex"===l.getComputedStyle(n.parentElement).display)return!1;if("link"===s.AriaUtil.getResolvedRole(n,!0)){var o=new a.DOMWalker(e,!1,void 0,!1);if(o.prevNode(),!t(o.node))return!0}return["block","flex","grid","list-item"].includes(r)}function i(e){if(!e||1!==e.nodeType)return null;var t=e;if(!t.hasAttribute("tabindex"))return null;var i=parseInt(t.getAttribute("tabindex"),10);return Number.isNaN(i)?null:i}function u(e){if(!e||1!==e.nodeType)return!1;var t=e,a=i(t);return(null===a||0===a)&&r.CommonUtil.isTabbable(t)}function d(e){return void 0===e&&(e=!0),function(t,i,a){return!!(a&&1===a.nodeType&&i&&r.CommonUtil.isTabbable(a))&&(e||u(a))}}function c(e,t){var a=((null==t?void 0:t.ownerDocument)||document).body||t;if(!a)return[];var n=new l.SRCursor(a,!1),o=b("tab_focus"),s=[],d=[],c=function(t){e(t.getRole(),!t.isEndTag(),t.getNode())&&(function(e){if(!e||1!==e.nodeType)return!1;var t=e,a=i(t);return null!==a&&a>0&&r.CommonUtil.isTabbable(t)}(t.getNode())?s.push(t.clone()):u(t.getNode())&&d.push(t.clone()))};for(c(n);n.next(function(){return!0},o);)c(n);return s.sort(function(e,t){var a=e.getElement(),n=t.getElement(),r=i(a)||0,o=i(n)||0;return r!==o?o-r:l.SRCursor.compare(e,t)}),s.concat(d)}function m(e,t){return e.findIndex(function(e){return 0===l.SRCursor.compare(e,t)})}function p(e){switch(e){case"link":return function(e,t){return t&&"link"===e};case"tab_focus":return d(!1);case"heading":return function(e,t){return t&&"heading"===e};case"h1":return function(e,t,i){return t&&"heading"===e&&"1"===i.ariaLevel};case"h2":return function(e,t,i){return t&&"heading"===e&&"2"===i.ariaLevel};case"h3":return function(e,t,i){return t&&"heading"===e&&"3"===i.ariaLevel};case"h4":return function(e,t,i){return t&&"heading"===e&&"4"===i.ariaLevel};case"h5":return function(e,t,i){return t&&"heading"===e&&"5"===i.ariaLevel};case"h6":return function(e,t,i){return t&&"heading"===e&&"6"===i.ariaLevel};case"image":return function(e,t){return t&&["img","graphics-document"].includes(e)};case"radio":return function(e,t){return t&&"radio"===e};case"button":return function(e,t){return t&&"button"===e};case"checkbox":return function(e,t){return t&&"checkbox"===e};case"combo":return function(e,t){return t&&"combobox"===e};case"list":return function(e,t){return t&&"list"===e};case"listitem":return function(e,t){return t&&"listitem"===e};case"article":return function(e,t){return t&&"article"===e};case"table":return function(e,t){return t&&"table"===e};case"paragraph":return function(e,t,i){return t&&"P"===i.nodeName.toUpperCase()};case"dom":return function(){return!0};case"item":return function(e,i,n){if(!i)return!1;if(t(n))return!0;var l=new a.DOMWalker(n,!i);return!(!l.prevNode()||!l.bEndTag)&&t(l.node)};case"region":return function(e,t,i){var a,l;return!!t&&(!!["main","navigation","form","banner","search","contentinfo"].includes(e)||"region"===e&&1===(null==i?void 0:i.nodeType)&&!!(null===(l=null===(a=n.AccNameUtil.computeAccessibleName(i))||void 0===a?void 0:a.name)||void 0===l?void 0:l.trim()))};case"formcontrol":case"editbox":case"graphic":case"frame":case"division":case"tabcontrol":case"separator":case"clickable":case"mouseover":throw new Error("NOT_IMPLEMENTED")}}e.getStartFunc=p;var h=function(e){var t;try{var i=e.getNode().nodeType,n=e.getElement(),l=e.clone();if(l.setEndTag(!1),[4,8].includes(i))return{skipCurrent:!0,skipChildren:!0};if(![1,3].includes(i))return{skipCurrent:!0,skipChildren:!1};if(3===i&&!(n=e.getNode().parentElement))return o.VisUtil.isNodeHiddenFromAT(n)?{skipCurrent:!0,skipChildren:!1}:null;if(!(n.closest("body")||(t=n,t.getRootNode()instanceof ShadowRoot)))return{skipCurrent:!0,skipChildren:!1};if(n.closest("script,style"))return{skipCurrent:!0,skipChildren:!0};var r=l.getCurrentOrParentByRoleClone(["heading","link"]),u=s.AriaUtil.getResolvedRole(n),d="heading"===u||"link"===u;if(r){r.getElement();var c=r.getNameInfo();if(c&&!["content","text"].includes(c.nameFrom)){if(o.VisUtil.isNodeHiddenFromAT(n))return{skipCurrent:!0,skipChildren:!0};if(!o.VisUtil.isNodeVisible(n))return{skipCurrent:!0,skipChildren:!0}}else if(d);else{var m=s.AriaUtil.getResolvedRole(n);if(("img"===m||"graphics-document"===m)&&o.VisUtil.isNodeHiddenFromAT(n))return{skipCurrent:!0,skipChildren:!0}}}else{if(o.VisUtil.isNodeHiddenFromAT(n))return{skipCurrent:!0,skipChildren:1===i};if(!o.VisUtil.isNodeVisible(n))return{skipCurrent:!0,skipChildren:1===i}}if("BODY"===n.nodeName.toUpperCase())return{skipCurrent:!1,skipChildren:!1};if("LABEL"===n.nodeName.toUpperCase()){if(n.hasAttribute("for")&&document.getElementById(n.getAttribute("for"))&&"hidden"!==document.getElementById(n.getAttribute("for")).getAttribute("type"))return{skipCurrent:!0,skipChildren:!1};var p=n.querySelector("input, select, textarea, button, [role='checkbox'], [role='combobox'], [role='listbox'], [role='menuitemcheckbox'], [role='menuitemradio'], [role='radio'], [role='searchbox'], [role='slider'], [role='spinbutton'], [role='switch'], [role='textbox']");if(p&&"hidden"!==p.getAttribute("type"))return{skipCurrent:!0,skipChildren:!1}}var h=n.closest("label[for]"),g=h&&h.getAttribute("for");if(h&&g&&document.getElementById(g)&&"hidden"!==document.getElementById(g).getAttribute("type")&&!n.closest("a[href], [role='link'], button, [role='button']"))return{skipCurrent:!0,skipChildren:1===i};var b=l.getRole();if(s.AriaUtil.containsPresentationalChildrenOnly(n))return{skipCurrent:!1,skipChildren:!0};if(["link","heading"].includes(b)&&(!l.getName()||!["content","text"].includes(l.getNameInfo().nameFrom))&&!(r&&r.getNameInfo()&&["content","text"].includes(r.getNameInfo().nameFrom)))return{skipCurrent:!1,skipChildren:!0};if("LEGEND"===n.nodeName.toUpperCase())for(var _=a.DOMWalker.parentElement(e.getNode());_;){if("FIELDSET"===_.nodeName.toUpperCase())return{skipCurrent:!1,skipChildren:!0};_=a.DOMWalker.parentElement(_)}return n&&"MSUP"===n.nodeName.toUpperCase()?{skipCurrent:!1,skipChildren:!0}:n.closest(".ibma-sr-overlay")?{skipCurrent:!0,skipChildren:!0}:null}finally{}},g=function(e){var t=e.getNode().nodeType,i=e.getElement();if(1!==t&&3!==t)return{skipCurrent:!0,skipChildren:!1};if(3===t)return o.VisUtil.isNodeHiddenFromAT(i)?{skipCurrent:!0,skipChildren:!1}:null;if(o.VisUtil.isNodeHiddenFromAT(i))return{skipCurrent:!0,skipChildren:!0};if("LABEL"===i.nodeName.toUpperCase()&&i.hasAttribute("for")&&document.getElementById(i.getAttribute("for"))&&"hidden"!==document.getElementById(i.getAttribute("for")).getAttribute("type"))return{skipCurrent:!0,skipChildren:!1};var a=i.closest("label[for]"),n=a&&a.getAttribute("for");return a&&n&&document.getElementById(n)&&"hidden"!==document.getElementById(n).getAttribute("type")&&!i.closest("a[href], [role='link'], button, [role='button']")?{skipCurrent:!0,skipChildren:1===t}:(e.getRole(),s.AriaUtil.containsPresentationalChildrenOnly(i)?{skipCurrent:!1,skipChildren:!0}:i&&"MSUP"===i.nodeName.toUpperCase()||i.closest(".ibma-sr-overlay")?{skipCurrent:!0,skipChildren:!0}:null)};function b(e){switch(e){case"region":case"item":return h;case"link":case"tab_focus":case"heading":case"h1":case"h2":case"h3":case"h4":case"h5":case"h6":case"image":return g;case"radio":case"button":case"checkbox":case"combo":case"list":case"listitem":case"article":case"table":case"paragraph":case"dom":case"formcontrol":case"editbox":case"graphic":case"frame":case"division":case"tabcontrol":case"separator":case"clickable":case"mouseover":throw new Error("NOT_IMPLEMENTED")}}function _(e,t){try{if("tab_focus"===e){var i=c(d(!0),t.getNode());if(i.length>0){var a=t.getCurrentOrParentTabbableClone(),n=a&&m(i,a)>=0?a:t.clone(),l=m(i,n);return l>=0?l+1<i.length?i[l+1].clone():null:i[0].clone()}}var r=t.clone(),o=p(e),s=b(e);return r.next(o,s)?r:null}finally{console.groupEnd()}}function f(e,t){if("tab_focus"===e){var i=t.clone(),a=p(e),n=b(e);if(i.previous(a,n))return i;var l=c(d(!0),t.getNode());if(l.length>0){var r=t.getCurrentOrParentTabbableClone(),o=r&&m(l,r)>=0?r:t.clone(),s=m(l,o);if(s>0)return l[s-1].clone()}return null}var u=t.clone(),h=p(e),g=b(e);return u.previous(h,g)?u:null}e.getSkipFunc=b,e.jumpCurrent=function(e,t){return("tab_focus"===e?d(!0):p(e))(t.getRole(),!t.isEndTag(),t.getNode())?t.clone():f(e,t)},e.jumpCurrentEnd=function(e,t){if("item"===e)return(r=_(e,t))?[r]:[];var i=t.getNameInfo(),a=t.clone();i&&!["content","text"].includes(i.nameFrom)||a.setEndTag(!0),a.next(function(){return!0});for(var n=[],r=_("item",t);r&&l.SRCursor.compare(r,a)<0;)n.push(r),r=_("item",r);return n.push(a),"tab_focus"===e&&"link"===t.getRole()?[n[n.length-1]]:n},e.jumpNext=_,e.jumpPrevious=f}(t.SRNavigator||(t.SRNavigator={}))},7014(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.SRRenderer=void 0;var a,n=i(7011),l=i(248),r=i(8195),o=i(2151),s=i(7242);(a=t.SRRenderer||(t.SRRenderer={})).renderEnter=function(e,t,i){for(var a=0,n=o.CONTAINER_ENTER_RULES;a<n.length;a++){var l=n[a].test(e,t,i);if(null!=l)return l}return null},a.renderLeave=function(e,t,i){for(var a=0,n=o.CONTAINER_EXIT_RULES;a<n.length;a++){var l=n[a].test(e,t,i);if(null!=l)return l}return null},a.renderCurrent=function(e,t,i){var n=l.SRNavigator.jumpCurrent(e,t);if(!n)return null;var r=l.SRNavigator.jumpCurrentEnd(e,n);r&&0!==r.length||(r=[null]);for(var o=r[r.length-1],s="",u=0,d=r;u<d.length;u++){var c=d[u],m=a.renderRange(e,n,c);if(m.trim().length>0){o=c,s=m;break}}return""===s&&(s=a.renderRange(e,n,o)),{start:n,end:o,message:(i.leaving||[]).concat(i.entering||[]).concat([s]).join(" ").replace(/\s+/g," ")}},a.renderRange=function(e,t,i){for(var a,u=t.clone(),d=[],c=!0,m=null;c;){var p=u.getElement(),h=u.getNode(),g=h.nodeType,b=n.AriaUtil.getAncestorWithRole(h,"link",!0);b&&!["content","text"].includes(null===(a=new r.SRCursor(b).getNameInfo())||void 0===a?void 0:a.nameFrom)&&(b=null);for(var _=0,f=o.SR_RULES;_<f.length;_++){var v=f[_].test(e,u);if(null!=v&&v.trim().length>0){1!==g||u.isEndTag()||"menu"!==p.getAttribute("aria-haspopup")||(v="[subMenu] "+v),"tab_focus"===e?m&&(!b||b&&m!==b)&&(v="".concat(v," ").concat((0,s.getLinkAnnouncement)(new r.SRCursor(m,!1)))):!b||m&&m===b||(v="".concat((0,s.getLinkAnnouncement)(new r.SRCursor(b,!1))," ").concat(v)),""!==v&&(m=b,d.push(v));break}}d.push([].filter(function(e){return e.trim().length>0}).join(" ")),c=u.next(function(){return!0},l.SRNavigator.getSkipFunc(e))&&r.SRCursor.compare(u,i)<0}"tab_focus"===e&&m&&d.push("".concat((0,s.getLinkAnnouncement)(new r.SRCursor(m,!1))));var A=d.filter(function(e){return e.trim().length>0}).join(" ");return A=(A=A.replace(/, \u0001([^\u0002]+)\u0002/g,function(e,t){var i='"'.concat(t,'"'),a=A.replace(e,"");return a.includes(i)||a.includes(t)?"":", ".concat(i)})).replace(/[\u0001\u0002]/g,"")}},328(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.SRRendererRule=void 0;var i=function(){function e(e){this.ruleDefinition=e}return e.prototype.test=function(e,t,i){if(this.ruleDefinition.modes.includes(e)&&(this.ruleDefinition.roles.includes(t.getRole())||this.ruleDefinition.elems.includes(t.getNode().nodeName.toUpperCase())))for(var a=0,n=this.ruleDefinition.tests;a<n.length;a++){var l=(0,n[a])(t,i,e);if("string"==typeof l)return l}return null},e}();t.SRRendererRule=i},369(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.SRTableUtil=void 0;var a=i(8195);!function(e){function t(e){return!!e.getElement()&&(!!["cell","rowheader","columnheader"].includes(e.getRole())||!e.getElement().hasAttribute("role")&&["TH","TD"].includes(e.getElement().nodeName.toUpperCase()))}function i(e){return e.getCurrentOrParentByRoleClone(["cell","rowheader","columnheader"],["TD","TH"])}function n(e){if(!t(e))return 0;var i=e.getElement().getAttribute("colspan");return i?parseInt(i):1}function l(e){if(!t(e))return 0;var i=e.getElement().getAttribute("rowspan");return i?parseInt(i):1}function r(e){var i=e.getCurrentOrParentByRoleClone(["table"]);if(!i)return null;for(var a,r=i.clone(),o=[],s=[];r.next(function(){return!0})&&!r.getNode().isSameNode(i.getNode());){if(r.isEndTag()&&"row"===r.getRole())for(o.push(s),a=s,s=[];a&&s.length<a.length&&a[s.length].rowIndexStart+a[s.length].rowspan-1>=o.length;)s.push(a[s.length]);if(!r.isEndTag()&&t(r)){for(var u=n(r),d={rowIndexStart:o.length,colIndexStart:s.length,rowspan:l(r),colspan:u,cellCursor:r.clone()},c=0;c<u;++c)s.push(d);for(;a&&s.length<a.length&&a[s.length].rowIndexStart+a[s.length].rowspan-1>=o.length;)s.push(a[s.length])}}return o}function o(e,t){var a=i(e);t||(t=r(e));for(var n=0;n<t.length;++n)for(var l=0;l<t[n].length;++l)if(t[n][l].cellCursor.isSameNode(a))return t[n][l];return null}function s(e,t){return t>=e.colIndexStart&&t<e.colIndexStart+e.colspan}function u(e,t){return t>=e.rowIndexStart&&t<e.rowIndexStart+e.rowspan}function d(e){var t=e.getElement();return!!t&&("cell"===e.getRole()||!t.hasAttribute("role")&&"TD"===t.nodeName.toUpperCase())}e.isCursorCellRole=t,e.getCurrentOrParentCellCursor=i,e.getColSpan=n,e.getRowSpan=l,e.getTableModel=r,e.getCellModel=o,e.cellModelContainsColumn=s,e.cellModelContainsRow=u,e.getRowHeaders=function(e){return""},e.getColumnHeadersForCursor=function(t,i){if(!i&&!(i=r(t)))return"";var n=o(t,i);if(!n)return"";var l=n.cellCursor;if(!l)return"";var u=l.getElement();if(!u)return"";for(var c=[],m=n.colIndexStart;m<n.colIndexStart+n.colspan;++m)c.push({potentialColHeaders:[],existsDataCell:!1,colIdx:m});var p=[];if(u.hasAttribute("headers"))p=u.getAttribute("headers").split(" ").map(function(e){return document.getElementById(e)}).filter(function(e){return!!e}).map(function(e){return new a.SRCursor(e)}).filter(function(t){return c.some(function(a){return s(e.getCellModel(t,i),a.colIdx)})});else{for(var h=0;h<i.length;++h)for(var g=function(e){var t=e.colIdx,a=i[h][t],n=a.cellCursor,r=n.getElement();if(!a||!n||n.isSameNode(l)||p.some(function(e){return n.isSameNode(e)}))return e.existsDataCell=e.existsDataCell||d(n)&&(n.hasNonEmptyName()||e.potentialColHeaders.length>0),"continue";var o=n.clone();"columnheader"===n.getRole()?(p.push(o),e.potentialColHeaders.push(o)):r.hasAttribute("role")||"TH"!==r.nodeName.toUpperCase()?e.existsDataCell=e.existsDataCell||d(n)&&(n.hasNonEmptyName()||e.potentialColHeaders.length>0):("col"===r.getAttribute("scope")||"axis"===r.getAttribute("scope")||!r.hasAttribute("scope")&&n.hasNonEmptyName())&&(p.push(o),e.potentialColHeaders.push(o))},b=0,_=c;b<_.length;b++)g(A=_[b]);for(var f=0,v=c;f<v.length;f++){var A;(A=v[f]).existsDataCell||(A.potentialColHeaders=[])}p=p.filter(function(e){return c.some(function(t){return t.potentialColHeaders.some(function(t){return t.isSameNode(e)})})})}return p.map(function(e){var t;return(null===(t=e.getNameInfo())||void 0===t?void 0:t.name)||""}).map(function(e){return e.trim()}).filter(function(e){return e.length>0}).join(", ")},e.getRowHeadersForCursor=function(t,i){if(!i&&!(i=r(t)))return"";var n=o(t,i);if(!n)return"";var l=n.cellCursor;if(!l)return"";var s=l.getElement();if(!s)return"";for(var c=[],m=n.rowIndexStart;m<n.rowIndexStart+n.rowspan;++m)c.push({potentialRowHeaders:[],existsDataCell:!1,rowIdx:m});var p=[];if(s.hasAttribute("headers"))p=s.getAttribute("headers").split(" ").map(function(e){return document.getElementById(e)}).filter(function(e){return!!e}).map(function(e){return new a.SRCursor(e)}).filter(function(t){return c.some(function(a){return u(e.getCellModel(t,i),a.rowIdx)})});else{for(var h=c.reduce(function(e,t){return Math.max(e,i[t.rowIdx].length)},0),g=0;g<h;++g)for(var b=function(e){var t=e.rowIdx;if(g>=i[t].length)return"continue";var a=i[t][g],n=a.cellCursor,r=n.getElement();if(!a||!n||n.isSameNode(l)||p.some(function(e){return n.isSameNode(e)}))return e.existsDataCell=e.existsDataCell||d(n)&&(n.hasNonEmptyName()||e.potentialRowHeaders.length>0),"continue";var o=n.clone();"rowheader"===n.getRole()?(p.push(o),e.potentialRowHeaders.push(o)):r.hasAttribute("role")||"TH"!==r.nodeName.toUpperCase()?e.existsDataCell=e.existsDataCell||d(n)&&(n.hasNonEmptyName()||e.potentialRowHeaders.length>0):("row"===r.getAttribute("scope")||"axis"===r.getAttribute("scope")||!r.hasAttribute("scope")&&n.hasNonEmptyName())&&(p.push(o),e.potentialRowHeaders.push(o))},_=0,f=c;_<f.length;_++)b(w=f[_]);for(var v=0,A=c;v<A.length;v++){var w;(w=A[v]).existsDataCell||(w.potentialRowHeaders=[])}p=p.filter(function(e){return c.some(function(t){return t.potentialRowHeaders.some(function(t){return t.isSameNode(e)})})})}return p.map(function(e){var t;return(null===(t=e.getNameInfo())||void 0===t?void 0:t.name)||""}).map(function(e){return e.trim()}).filter(function(e){return e.length>0}).join(", ")},e.isDataCell=d}(t.SRTableUtil||(t.SRTableUtil={}))},2165(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.SRUtil=void 0;var a,n=i(7011),l=i(3946);(a=t.SRUtil||(t.SRUtil={})).isModalDialogElement=function(e){if(1!==e.nodeType)return!1;var t=e;return"dialog"===n.AriaUtil.getResolvedRole(t,!0)&&"true"===t.getAttribute("aria-modal")&&l.VisUtil.isNodeVisible(e)},a.getUniqueSelector=function e(t,i){if(void 0===i&&(i=!1),t.id)return"#".concat(CSS.escape(t.id));if(t.isSameNode(document.documentElement)||t.isSameNode(document.body))return t.tagName.toLowerCase();var a=t.tagName.toLowerCase();if(t.classList.length&&!i&&(a+=Array.from(t.classList).slice(0,3).map(function(e){return".".concat(CSS.escape(e))}).join("")),!i){if(t.hasAttribute("role")&&(a+='[role="'.concat(CSS.escape(t.getAttribute("role")||""),'"]')),t.hasAttribute("aria-label")){var n=t.getAttribute("aria-label")||"";n.length<=20&&(a+='[aria-label="'.concat(CSS.escape(n),'"]'))}"input"===t.tagName.toLowerCase()&&t.hasAttribute("type")&&(a+='[type="'.concat(CSS.escape(t.getAttribute("type")||""),'"]'))}if(t.parentElement){var l=Array.from(t.parentElement.children).filter(function(e){return e.tagName===t.tagName});if(l.length>1){var r=l.indexOf(t)+1;a+=":nth-of-type(".concat(r,")")}return"".concat(e(t.parentElement,!0)," > ").concat(a)}return a}},8107(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.SRViewer=t.SROverlay=void 0;var a=i(5233),n=function(){function e(e){this.srViewer=e,this.navigationModes=[{mode:"item",label:"Item"},{mode:"tab_focus",label:"Tabbable"},{mode:"heading",label:"Heading"},{mode:"region",label:"Region"}],this.createOverlay()}return e.prototype.createDOMElement=function(e,t,i){var a=this.srViewer.viewerDoc.createElement(e);if(t)for(var n in t)a[n]=t[n];if(i)for(var n in i)a.style[n]=i[n];return a},e.prototype.createOverlay=function(){var e=this;this.container=this.createDOMElement("div",{className:"ibma-sr-overlay"},{position:"fixed",bottom:"0",left:"0",width:"100%",backgroundColor:"rgba(0, 0, 0, 0.8)",color:"white",padding:"10px",zIndex:"10000",display:"flex",flexDirection:"column",gap:"10px"});var t=this.createDOMElement("div",{},{display:"flex",flexWrap:"wrap",gap:"10px"});this.navigationModes.forEach(function(i){var a=e.createDOMElement("div",{},{display:"flex",alignItems:"center",gap:"5px",margin:"0 10px"});a.appendChild(e.createDOMElement("span",{textContent:i.label+":"},{}));var n=e.createDOMElement("button",{textContent:"◀ Prev"},{padding:"5px 10px",backgroundColor:"#444",color:"white",border:"none",borderRadius:"3px",cursor:"pointer"});n.addEventListener("click",function(){return e.srViewer.navigatePrevious(i.mode)}),a.appendChild(n);var l=e.createDOMElement("button",{textContent:"Next ▶"},{padding:"5px 10px",backgroundColor:"#444",color:"white",border:"none",borderRadius:"3px",cursor:"pointer"});l.addEventListener("click",function(){return e.srViewer.navigateNext(i.mode)}),a.appendChild(l),t.appendChild(a)});var i=this.createDOMElement("div",{},{display:"flex",alignItems:"center",gap:"5px",margin:"0 10px"}),a=this.createDOMElement("button",{textContent:"Show all"},{padding:"5px 10px",backgroundColor:"#444",color:"white",border:"none",borderRadius:"3px",cursor:"pointer"});a.addEventListener("click",function(){return e.srViewer.showAll(!0)}),i.appendChild(a);var n=this.createDOMElement("button",{textContent:"Toggle speech"},{padding:"5px 10px",backgroundColor:"#444",color:"white",border:"none",borderRadius:"3px",cursor:"pointer"});n.addEventListener("click",function(){return e.srViewer.toggleSpeech()}),i.appendChild(n),t.appendChild(i),this.resultsDisplay=this.createDOMElement("div",{textContent:"Screen reader simulation results will appear here."},{padding:"10px",backgroundColor:"rgba(255, 255, 255, 0.1)",borderRadius:"3px",minHeight:"100px",maxHeight:"50vh",fontFamily:"monospace",overflow:"auto"}),this.container.appendChild(t),this.container.appendChild(this.resultsDisplay),this.srViewer.viewerDoc.body.appendChild(this.container)},e.prototype.displayResult=function(e,t,i){var a,n,l,r,o="";e.success,o="".concat(i.toUpperCase()," ").concat(t,": ").concat(e.renderingResult.message),null===(n=null===(a=e.renderingResult.end)||void 0===a?void 0:a.getElement())||void 0===n||n.scrollIntoView(),null===(r=null===(l=e.renderingResult.start)||void 0===l?void 0:l.getElement())||void 0===r||r.scrollIntoView(),window.scrollBy(0,-200),this.resultsDisplay.innerHTML="",this.resultsDisplay.textContent=o;var s=this.createDOMElement("button",{innerText:"Debug"},{});s.addEventListener("click",function(){var t,i;console.log(null===(t=e.renderingResult.start)||void 0===t?void 0:t.getNode(),null===(i=e.renderingResult.end)||void 0===i?void 0:i.getNode())}),this.resultsDisplay.appendChild(s)},e.prototype.displayAll=function(e){for(var t=this,i=this.createDOMElement("table",{},{}),a=this.createDOMElement("tr",{},{}),n=["region","heading","item","tab_focus"],l=0,r=["Region","Heading","Item","Tabbable"];l<r.length;l++){var o=r[l];a.appendChild(this.createDOMElement("th",{scope:"col",innerText:o},{textAlign:"left",padding:".25rem",margin:"0rem",color:"white"})),i.appendChild(a)}for(var s=function(e){var a=u.createDOMElement("tr",{},{});n.forEach(function(i){a.appendChild(t.createDOMElement("td",{innerText:e[i]},{verticalAlign:"top",border:"solid white 1px",padding:".25rem",margin:"0rem",color:"white"}))}),i.appendChild(a)},u=this,d=0,c=e;d<c.length;d++)s(c[d]);this.resultsDisplay.innerHTML="",this.resultsDisplay.appendChild(i)},e.prototype.destroy=function(){this.container&&this.container.parentNode&&this.container.parentNode.removeChild(this.container)},e}();t.SROverlay=n;var l=function(){function e(e){void 0===e&&(e=document.body),this.isStreaming=!1,this.isShowingAll=!1,this.speechEnabled=!1,this.viewerDoc=e.ownerDocument,this.controller=a.SRController.getController(this.viewerDoc),this.overlay=new n(this),this.setupKeyboardHandlers(),this.setupFocusTracking(),this.setupMutationTracking()}return e.prototype.showAll=function(e){e&&(this.isShowingAll=!0);var t=a.SRController.renderStructure(this.viewerDoc);this.overlay.displayAll(t)},e.prototype.toggleSpeech=function(){this.speechEnabled=!this.speechEnabled},e.prototype.navigateNext=function(e){this.isShowingAll=!1;var t=this.controller.jumpNext(e);this.overlay.displayResult(t,e,"next"),this.speakResult(t)},e.prototype.navigatePrevious=function(e){this.isShowingAll=!1;var t=this.controller.jumpPrevious(e);this.overlay.displayResult(t,e,"previous"),this.speakResult(t)},e.prototype.setupKeyboardHandlers=function(){var e=this;this.keyboardHandler=function(t){var i=t.target;if("INPUT"!==i.tagName&&"TEXTAREA"!==i.tagName&&"SELECT"!==i.tagName)if(t.ctrlKey)e.stopSpeech();else if(!t.altKey&&!t.metaKey)switch(t.key){case"ArrowUp":t.preventDefault(),e.navigatePrevious("item");break;case" ":e.isStreaming=!0;case"ArrowDown":t.preventDefault(),e.navigateNext("item");break;case"Enter":t.preventDefault(),e.activateCurrentElement(),e.controller.setPointOfRegard(e.viewerDoc.activeElement);break;case"H":case"h":t.shiftKey?(t.preventDefault(),e.navigatePrevious("heading")):(t.preventDefault(),e.navigateNext("heading"));break;case"R":case"r":t.shiftKey?(t.preventDefault(),e.navigatePrevious("region")):(t.preventDefault(),e.navigateNext("region"));break;case"Tab":t.shiftKey?(t.preventDefault(),e.navigatePrevious("tab_focus")):(t.preventDefault(),e.navigateNext("tab_focus"))}},this.viewerDoc.addEventListener("keydown",this.keyboardHandler)},e.prototype.speakResult=function(e){var t=this;if(this.speechEnabled){var i=new SpeechSynthesisUtterance(e.renderingResult.message);i.rate=1.5;var a=this;i.addEventListener("end",function(e){a.isStreaming&&t.navigateNext("item")}),speechSynthesis.cancel(),speechSynthesis.speak(i)}},e.prototype.stopSpeech=function(){this.isStreaming=!1,speechSynthesis.cancel()},e.prototype.setupMutationTracking=function(){var e=this,t=new MutationObserver(function(i){if(e.isShowingAll&&i.filter(function(e){return 1===e.target.nodeType&&!e.target.closest(".ibma-sr-overlay")}).length>0){t.disconnect();var a=e;a.showAll(),setTimeout(function(){a.showAll(),t.observe(e.viewerDoc.documentElement,{attributes:!0,childList:!0,subtree:!0})},1e3)}});t.observe(this.viewerDoc.documentElement,{attributes:!0,childList:!0,subtree:!0})},e.prototype.setupFocusTracking=function(){var e=this;this.focusHandler=function(t){if(t.target instanceof HTMLElement){var i=t.target;if(e.overlay&&i.closest(".ibma-sr-overlay"))return;console.group("focusHandler");var a=e.controller.setPointOfRegard(i);a.success&&(e.overlay.displayResult(a,"focus","focus"),e.speakResult(a)),console.groupEnd()}},this.viewerDoc.addEventListener("focusin",this.focusHandler)},e.prototype.activateCurrentElement=function(){var e=this.controller.getPointOfRegard().getElement();if(e){var t={success:!0,renderingResult:{message:"Activating: ".concat(e.textContent||e.nodeName),start:this.controller.getPointOfRegard(),end:this.controller.getPointOfRegard()}};this.overlay.displayResult(t,"focus","focus"),this.speakResult(t),e.focus&&e.focus(),e.click()}},e.prototype.getController=function(){return this.controller},e.prototype.destroy=function(){this.viewerDoc.removeEventListener("keydown",this.keyboardHandler),this.viewerDoc.removeEventListener("focusin",this.focusHandler),this.stopSpeech(),this.overlay.destroy()},e}();t.SRViewer=l},7242(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.RULES=t.getLinkAnnouncement=t.getRoleDescription=t.quoteName=t.quoteNamePadBefore=t.quoteNamePadAfter=void 0;var a=i(8195),n=i(328),l=i(7011),r=i(9910),o=i(3864),s=i(3946);function u(e,t,i,a){return e.getName()?"".concat(c(e)).concat(t||", "):""}function d(e,t){return e.getName()?"".concat(t||", ").concat(c(e)):""}function c(e,t,i){return e.getName()?"".concat(t||'"').concat(e.getName()).concat(i||'"'):""}function m(e,t){var i=e.getElement();if(!i)return t;var a=i.getAttribute("aria-roledescription");return a&&a.trim().length>0?a.trim():t}function p(e,t){var i,a=e.getNode().href||"";i=a.startsWith(document.location.href)&&"#"===a.charAt(document.location.href.length)?"same page link":"link";var n=e.getNameInfo();return n&&!["content","text"].includes(n.nameFrom)?"tab_focus"===t?"[".concat(u(e)).concat(i,"]"):"[".concat(i).concat(d(e),"]"):"[".concat(i,"]")}function h(e,t){var i=e.getAttribute("aria-describedby");if(!i)return"";var a=i.split(/\s+/).map(function(e){return document.getElementById(e)}).filter(function(e){return!!e}).map(function(e){var t;return null===(t=e.textContent)||void 0===t?void 0:t.trim()}).filter(function(e){return!!e}).join(" ");return a&&0!==a.length?"item"===t?", ".concat(a,""):', "'.concat(a,'"'):""}function g(e){var t="";return(e.hasAttribute("disabled")||"true"===e.getAttribute("aria-disabled"))&&(t+=", disabled"),(e.hasAttribute("readonly")||"true"===e.getAttribute("aria-readonly"))&&(t+=", read only"),(e.hasAttribute("required")||"true"===e.getAttribute("aria-required"))&&(t+=", required"),"true"===e.getAttribute("aria-invalid")&&(t+=", invalid"),t}function b(e){var t=e.getElement();if(!t)return!1;for(var i=new o.DOMWalker(t,!1,t,!1);i.nextNode();)if(1===i.node.nodeType&&!i.bEndTag){var a=l.AriaUtil.getResolvedRole(i.node);if(a&&r.ARIADefinitions.designPatterns[a]&&"widget"===r.ARIADefinitions.designPatterns[a].roleType)return!0}return!1}t.quoteNamePadAfter=u,t.quoteNamePadBefore=d,t.quoteName=c,t.getRoleDescription=m,t.getLinkAnnouncement=p,t.RULES=[new n.SRRendererRule({roles:["button"],elems:[],modes:["item","button","tab_focus"],tests:[function(e,t,i){if(!e.isStartTag())return null;var a=e.getNode(),n=m(e,"button");return"true"===a.getAttribute("aria-pressed")?"[toggle ".concat(n,", pressed").concat(d(e)).concat(h(a,i),"]"):null},function(e,t,i){if(!e.isStartTag())return null;var a=e.getNode(),n=m(e,"button");return"false"===a.getAttribute("aria-pressed")?"[toggle ".concat(n,", not pressed").concat(d(e)).concat(h(a,i),"]"):null},function(e,t,i){if(!e.isEndTag()){var a="",n=e.getElement(),l=m(e,"button");return["menu","true"].includes(n.getAttribute("aria-haspopup"))&&(a+=", menu"),n.hasAttribute("aria-expanded")&&(a+=", ".concat("true"===n.getAttribute("aria-expanded")?"expanded":"collapsed")),a+=g(n),"[".concat(u(e)).concat(l).concat(a).concat(h(n,i),"]")}},function(e){if(e.isEndTag())return""}]}),new n.SRRendererRule({roles:["checkbox"],elems:[],modes:["item","checkbox","tab_focus"],tests:[function(e,t,i){if(e.isStartTag()){var a=e.getNode(),n=m(e,"checkbox"),l="";return l="mixed"===a.getAttribute("aria-checked")?"half checked":(a.hasAttribute("aria-checked")?"true"===a.getAttribute("aria-checked"):a.checked)?"checked":"not checked",l+=g(e.getElement()),"[".concat(n,", ").concat(l).concat(d(e)).concat(h(e.getElement(),i),"]")}return""}]}),new n.SRRendererRule({roles:["cell","columnheader","rowheader"],elems:[],modes:["item","table"],tests:[function(e){var t;if(!e.isStartTag())return null;var i=e.getElement();if(!i)return null;var a=(null===(t=i.textContent)||void 0===t?void 0:t.trim())||"",n=new o.DOMWalker(i,!1,i,!1),s=a.length>0;if(!s)for(;n.nextNode();)if(1===n.node.nodeType&&!n.bEndTag){var u=n.node,d=l.AriaUtil.getResolvedRole(u);if(d&&r.ARIADefinitions.designPatterns[d]){s=!0;break}if("IMG"===u.nodeName.toUpperCase()&&u.hasAttribute("alt")){s=!0;break}}return s?null:"[blank]"}]}),new n.SRRendererRule({roles:["combobox"],elems:[],modes:["item","combo","tab_focus"],tests:[function(e){if(e.isEndTag())return"";var t=m(e,"combo box"),i=e.getElement(),n="";if("SELECT"===e.getNode().nodeName.toUpperCase()){n=", collapsed";var l=e.getElement(),r=l.selectedIndex>=0?l.options[l.selectedIndex]:null,o="";return r&&(o=d(new a.SRCursor(r,!1),", ")),n+=g(i),"[".concat(u(e)).concat(t).concat(n).concat(o,"]")}return"INPUT"!==e.getNode().nodeName.toUpperCase()||e.getElement().hasAttribute("role")?(i.hasAttribute("aria-expanded")&&(n=", ".concat("true"===i.getAttribute("aria-expanded")?"expanded":"collapsed"),i.hasAttribute("aria-autocomplete")&&(n+=", has auto complete"),n+=", editable, opens list"),n+=g(i),"[".concat(u(e)).concat(t).concat(n,"]")):(n=g(i),"[".concat(u(e)).concat(t,", has auto complete, editable, opens list").concat(n,"]"))}]}),new n.SRRendererRule({roles:["default"],elems:[],modes:["item"],tests:[function(e){var t;return e.isStartTag()?"!!<".concat(e.getRole(),">").concat((null===(t=e.getNameInfo())||void 0===t?void 0:t.name)+"","!!"):"!!</".concat(e.getRole(),">!!")}]}),new n.SRRendererRule({roles:["deletion"],elems:[],modes:["item"],tests:[function(e){return e.isStartTag()?"[deleted]":""}]}),new n.SRRendererRule({roles:["dialog"],elems:[],modes:["item"],tests:[function(e){return e.isEndTag()?"[End of dialog]":"[Start of dialog".concat(d(e))}]}),new n.SRRendererRule({roles:["document","generic"],elems:[],modes:["item"],tests:[function(){return""}]}),new n.SRRendererRule({roles:["graphics-document"],elems:[],modes:["item","image"],tests:[function(e){var t,i;return e.isStartTag()&&!(null===(t=e.getNameInfo())||void 0===t?void 0:t.name)&&""!==(null===(i=e.getNameInfo())||void 0===i?void 0:i.name)?e.getCurrentOrParentByRoleClone(["heading","link"])&&s.VisUtil.isNodeHiddenFromAT(e.getElement())?"":"[Unlabeled graphic]":null},function(e){var t;return e.isStartTag()&&""===(null===(t=e.getNameInfo())||void 0===t?void 0:t.name)?"":null},function(e){var t;return e.isStartTag()&&(null===(t=e.getNameInfo())||void 0===t?void 0:t.name)&&"[graphic".concat(d(e),"]")||null},function(e){return e.isEndTag()?"":null}]}),new n.SRRendererRule({roles:["heading"],elems:[],modes:["item","tab_focus"],tests:[function(e,t,i){if("tab_focus"===i&&e.isStartTag())return"";if("item"===i&&e.isEndTag())return"";var a,n=e.getElement();a=n.ariaLevel?n.ariaLevel:"heading"===n.getAttribute("role")?"2":n.nodeName.substring(1);var l=e.getNameInfo();return l&&!["content","text"].includes(l.nameFrom)||(n.textContent||"").trim()?l&&!["content","text"].includes(l.nameFrom)?"[heading level ".concat(a).concat(d(e),"]"):"[heading level ".concat(a,"]"):""}]}),new n.SRRendererRule({roles:["heading"],elems:[],modes:["heading","h1","h2","h3","h4","h5","h6"],tests:[function(e){if(e.isStartTag()){var t,i=e.getNode();t=i.ariaLevel?i.ariaLevel:"heading"===i.getAttribute("role")?"2":i.nodeName.substring(1);var a=e.getNameInfo();return a&&!["content","text"].includes(a.nameFrom)||(i.textContent||"").trim()?"[".concat(u(e),"heading level ").concat(t,"]"):""}return""}]}),new n.SRRendererRule({roles:["img"],elems:[],modes:["item","image"],tests:[function(e){var t,i,a;return e.isEndTag()?"":(null===(t=e.getNameInfo())||void 0===t?void 0:t.name)||""===(null===(i=e.getNameInfo())||void 0===i?void 0:i.name)?""===(null===(a=e.getNameInfo())||void 0===a?void 0:a.name)?"":"[graphic".concat(d(e),"]"):e.getCurrentOrParentByRoleClone(["heading","link"])&&s.VisUtil.isNodeHiddenFromAT(e.getElement())?"":"[Unlabeled graphic]"}]}),new n.SRRendererRule({roles:["insertion"],elems:[],modes:["item"],tests:[function(e){return e.isStartTag()?"[inserted]":""}]}),new n.SRRendererRule({roles:["link"],elems:[],modes:["item","region","link","tab_focus"],tests:[function(e,t,i){var a;return e.isStartTag()&&!["content","text"].includes(null===(a=e.getNameInfo())||void 0===a?void 0:a.nameFrom)?p(e,i):null}]}),new n.SRRendererRule({roles:["listitem"],elems:[],modes:["item"],tests:[function(e){for(var t,i,a,n=o.DOMWalker.parentNode(e.getNode());void 0===i&&n;)1===n.nodeType&&((p=n).hasAttribute("role")?"list"===p.getAttribute("role")&&(i=!1,a=p):"UL"===p.nodeName.toUpperCase()?(i=!1,a=p):"OL"===p.nodeName.toUpperCase()&&(i=!0,a=p)),n=o.DOMWalker.parentNode(n);var l=b(e)?"":(null===(t=e.getNameInfo())||void 0===t?void 0:t.name)||"",r="";if(i){var s=1;if(a&&"OL"===a.nodeName.toUpperCase()&&a.hasAttribute("start")){var u=parseInt(a.getAttribute("start")||"1",10);s=isNaN(u)?1:u}for(var d=e.getElement(),c=o.DOMWalker.previousSiblingNotOwnedBySlot(d);c;){if(1===c.nodeType){var m=c;"listitem"!==m.getAttribute("role")&&"LI"!==m.nodeName.toUpperCase()||s++}c=o.DOMWalker.previousSiblingNotOwnedBySlot(c)}r=e.isStartTag()?"".concat(s,". ").concat(l):""}else{var p;r="LI"===(p=e.getElement()).nodeName.toUpperCase()&&"none"===window.getComputedStyle(p).listStyleType||"LI"!==p.nodeName.toUpperCase()?e.isStartTag()?"".concat(l):"":e.isStartTag()?"[bullet] ".concat(l):""}return r}]}),new n.SRRendererRule({roles:["math"],elems:[],modes:["item"],tests:[function(e){return e.isEndTag()?"[math content]":""}]}),new n.SRRendererRule({roles:["menuitem"],elems:[],modes:["item","tab_focus","region"],tests:[function(e){var t="";if(e.isStartTag()){var i="",a=e.getElement();"true"===a.getAttribute("aria-haspopup")&&(i+=", sub-menu"),a.hasAttribute("aria-expanded")&&(i+=", ".concat("true"===a.getAttribute("aria-expanded")?"expanded":"collapsed")),t="[menu".concat(i);var n=e.getNameInfo();n&&!["content","text"].includes(n.nameFrom)&&(t+=d(e)),t+="]"}return t}]}),new n.SRRendererRule({roles:["meter"],elems:[],modes:["item","tab_focus"],tests:[function(e){return e.isStartTag()?"[progress bar, ".concat(e.getNode().value,"]"):""}]}),new n.SRRendererRule({roles:["progressbar"],elems:[],modes:["item"],tests:[function(e){return e.isStartTag()?"[progress bar, ".concat(e.getNode().value,"]"):""}]}),new n.SRRendererRule({roles:["radio"],elems:[],modes:["item","tab_focus"],tests:[function(e,t,i){if(e.isStartTag()){var a,n=m(e,"radio button");a=e.getElement().hasAttribute("aria-checked")?"true"===e.getElement().getAttribute("aria-checked"):e.getNode().checked;var l=g(e.getElement());return"[".concat(n,", ").concat(a?"checked":"not checked").concat(l).concat(d(e)).concat(h(e.getElement(),i),"]")}return""}]}),new n.SRRendererRule({roles:["searchbox"],elems:[],modes:["item","tab_focus"],tests:[function(e){return e.isStartTag()?"[".concat(u(e),"edit]"):""}]}),new n.SRRendererRule({roles:["separator"],elems:[],modes:["item"],tests:[function(e){return e.isStartTag()?"[separator]":""}]}),new n.SRRendererRule({roles:["slider"],elems:[],modes:["item","tab_focus"],tests:[function(e,t,i){if(!e.isStartTag())return"";var a=m(e,"slider"),n=e.getElement(),l=n.hasAttribute("aria-valuenow")?n.getAttribute("aria-valuenow"):e.getNode().value;return"[".concat(u(e)).concat(a,", ").concat(l).concat(h(e.getElement(),i),"]")}]}),new n.SRRendererRule({roles:["spinbutton"],elems:[],modes:["item","tab_focus"],tests:[function(e,t,i){if(!e.isStartTag())return"";var a=m(e,"spinbutton");return"[".concat(u(e)).concat(a,", editable").concat(h(e.getElement(),i),"]")}]}),new n.SRRendererRule({roles:["tab"],elems:[],modes:["item","tab_focus"],tests:[function(e){if(!e.isStartTag())return"";var t=m(e,"tab");return"[".concat(t).concat("true"===e.getNode().getAttribute("aria-selected")?", selected":"").concat(d(e),"]")}]}),new n.SRRendererRule({roles:["tablist"],elems:[],modes:["item"],tests:[function(e){return null===e.getNameInfo()?null:e.isStartTag()?"[group start".concat(d(e),"]"):"[group end".concat(d(e),"]")}]}),new n.SRRendererRule({roles:["tabpanel"],elems:[],modes:["item"],tests:[function(e){return null===e.getNameInfo()?null:e.isStartTag()?"[Tab panel start".concat(d(e),"]"):"[Tab panel end".concat(d(e),"]")}]}),new n.SRRendererRule({roles:["text"],elems:[],modes:["item","link","tab_focus","region"],tests:[function(e){var t,i,a,n;if(e.isEndTag()||!(null===(t=e.getParentElement())||void 0===t?void 0:t.getElement()))return null;var l=null===(i=e.getParentElement())||void 0===i?void 0:i.getElement();return"line-through"===l.ownerDocument.defaultView.getComputedStyle(l).textDecorationLine?"[strikethrough] ".concat((null===(a=e.getNameInfo())||void 0===a?void 0:a.name)+""," [end strikethrough]"):"".concat((null===(n=e.getNameInfo())||void 0===n?void 0:n.name)+"")}]}),new n.SRRendererRule({roles:["text"],elems:[],modes:["heading"],tests:[function(e){return""}]}),new n.SRRendererRule({roles:["textbox"],elems:[],modes:["item","tab_focus"],tests:[function(e,t,i){var a,n=e.getElement();if(e.isEndTag())return"item"===i&&"TEXTAREA"===n.nodeName.toUpperCase()?"[out of edit]":"";if(!e.isStartTag())return"";var l="";n.hasAttribute("placeholder")&&n.getAttribute("placeholder").trim().length>0&&(l+=", placeholder: ".concat(n.getAttribute("placeholder"))),l+=g(n);var r="TEXTAREA"===n.nodeName.toUpperCase()||"true"===n.getAttribute("aria-multiline"),o=h(n,i);if(r){var s="tab_focus"===i?null===(a=n.textContent)||void 0===a?void 0:a.trim():"",d=s?" ".concat(s):"";return"[".concat(u(e),"edit, multiline").concat(l).concat(o,"]").concat(d)}return"[".concat(u(e),"edit").concat(l).concat(o,"]")}]}),new n.SRRendererRule({roles:["treeitem"],elems:[],modes:["item","tab_focus"],tests:[function(e){if(e.isEndTag())return"";var t=e.getElement(),i="[treeview item";"true"===t.getAttribute("aria-selected")&&(i+=", selected"),t.hasAttribute("aria-expanded")&&(i+="true"===t.getAttribute("aria-expanded")?", expanded":", collapsed");var a=t.getAttribute("aria-level");if(a)i+=", level ".concat(a);else{for(var n=1,r=o.DOMWalker.parentElement(t);r;){var s=l.AriaUtil.getResolvedRole(r);if("group"===s||"tree"===s)for(var u=o.DOMWalker.parentElement(r);u;){var d=l.AriaUtil.getResolvedRole(u);if("treeitem"===d){n++;break}if("tree"===d)break;u=o.DOMWalker.parentElement(u)}r=o.DOMWalker.parentElement(r)}n>1&&(i+=", level ".concat(n))}var c=t.getAttribute("aria-posinset"),m=t.getAttribute("aria-setsize");if(!c||!m){var p=0,h=0,g=o.DOMWalker.parentElement(t);if(g)for(var b=o.DOMWalker.firstChildNotOwnedBySlot(g);b;){if(1===b.nodeType){var _=b;"treeitem"===l.AriaUtil.getResolvedRole(_)&&(h++,_===t&&(p=h))}b=b.nextSibling}c=p.toString(),m=h.toString()}return i+", ".concat(c," of ").concat(m,"] ")}]}),new n.SRRendererRule({roles:[],elems:["BODY"],modes:["item","tab_focus"],tests:[function(e){var t=e.getNode().ownerDocument.title;return e.isEndTag()?"[End of document".concat(t.trim().length>0?": "+t.trim():"","]"):"[Start of document".concat(t.trim().length>0?": "+t.trim():"","]")}]}),new n.SRRendererRule({roles:[],elems:["IFRAME"],modes:["item","tab_focus"],tests:[function(e){var t=function(e){try{return null!==(e.contentDocument||e.contentWindow.document)}catch(e){return!1}}(e.getNode())?"":"{Emulator unable to access frame}";return e.isEndTag()?"":t}]}),new n.SRRendererRule({roles:[],elems:["BR"],modes:["item"],tests:[function(e){try{for(var t=e.clone();t.previous(function(){return!0})&&"BR"!==t.getNode().nodeName.toUpperCase()&&t.getNameInfo()&&0===t.getNameInfo().name.trim().length;);return"BR"===t.getNode().nodeName.toUpperCase()?"[blank]":null}catch(e){console.error(e)}}]}),new n.SRRendererRule({roles:[],elems:["DL"],modes:["item"],tests:[function(e){return""}]}),new n.SRRendererRule({roles:[],elems:["INPUT"],modes:["item","tab_focus"],tests:[function(e,t,i){var a;return e.isStartTag()&&"password"===(null===(a=e.getElement())||void 0===a?void 0:a.getAttribute("type"))&&"[".concat(u(e),"edit, protected").concat(h(e.getElement(),i),"]")||null},function(e,t,i){var a,n;if(e.isStartTag()&&"file"===(null===(a=e.getElement())||void 0===a?void 0:a.getAttribute("type"))){var l=(null===(n=e.getElement())||void 0===n?void 0:n.value)||"";return l=""===l?"No file chosen":l.substring(12),"[".concat(u(e),"button").concat(h(e.getElement(),i),"] [").concat(u(e)).concat(l,"]")}return null},function(e,t,i){var a;if(e.isStartTag()&&"color"===(null===(a=e.getElement())||void 0===a?void 0:a.getAttribute("type"))){var n=e.getElement().value,l=(100*Number("0x".concat(n.substring(1,3)))/Number("0xff")).toFixed(0),r=(100*Number("0x".concat(n.substring(3,5)))/Number("0xff")).toFixed(0),o=(100*Number("0x".concat(n.substring(5)))/Number("0xff")).toFixed(0);return"[".concat(u(e),"clickable").concat(h(e.getElement(),i),"] [").concat(l,"% red ").concat(r,"% green ").concat(o,"% blue]")}return null},function(e,t,i){var a;if(e.isStartTag()&&"month"===(null===(a=e.getElement())||void 0===a?void 0:a.getAttribute("type"))){var n=e.getElement().value,l="0",r="0";if(n.trim().length>0){var o=new Date(n);l=""+o.getFullYear(),r=""+(o.getMonth()+1)}return"[".concat(u(e),"clickable").concat(h(e.getElement(),i),"] [spin button, ").concat(r,"] [spin button, ").concat(l,"] [menu button] [subMenu] Show month picker")}return null},function(e,t,i){var a;if(e.isStartTag()&&"date"===(null===(a=e.getElement())||void 0===a?void 0:a.getAttribute("type"))){var n=e.getElement().value,l="0",r="0",o="0";if(n.trim().length>0){var s=new Date(n);l=""+s.getFullYear(),r=""+(s.getMonth()+1),o=""+s.getDate()}return"[".concat(u(e),"clickable").concat(h(e.getElement(),i),"] [spin button, ").concat(r,"] / [spin button, ").concat(o,"] / [spin button, ").concat(l,"] [menu button] [subMenu] Show date picker")}return null},function(e,t,i){var a;if(e.isStartTag()&&"datetime-local"===(null===(a=e.getElement())||void 0===a?void 0:a.getAttribute("type"))){var n=e.getElement().value,l="0",r="0",o="0",s="0",d="0",c="0";if(n.trim().length>0){var m=new Date(n);l=""+m.getFullYear(),r=""+(m.getMonth()+1),o=""+m.getDate(),s=0===m.getHours()||12===m.getHours()?"12":m.getHours()<12?""+m.getHours():""+(m.getHours()-12),d=""+m.getMinutes(),c=m.getHours()>=12?"pm":"am"}return"[".concat(u(e),"clickable").concat(h(e.getElement(),i),"] [spin button, ").concat(r,"] / [spin button, ").concat(o,"] / [spin button, ").concat(l,"] [spin button, ").concat(s,"] : [spin button, ").concat(d,"] [spin button, ").concat(c,"] [menu button] [subMenu] Show local date and time picker")}return null},function(e,t,i){var a;if(e.isStartTag()&&"time"===(null===(a=e.getElement())||void 0===a?void 0:a.getAttribute("type"))){var n=e.getElement().value,l="0",r="0",o="0";if(n.trim().length>0){var s=n.split(":"),d=parseInt(s[0]);l=0===d||12===d?"12":d<12?""+d:""+(d-12),r=s[1],o=d>=12?"pm":"am"}return"[".concat(u(e),"grouping clickable").concat(h(e.getElement(),i)," [spin button, ").concat(l,"] : [spin button, ").concat(r,"] [spin button, ").concat(o,"] [menu button] [subMenu] Show time picker [out of grouping]")}return null},function(e,t,i){var a;if(e.isStartTag()&&"week"===(null===(a=e.getElement())||void 0===a?void 0:a.getAttribute("type"))){var n=e.getElement().value,l="0",r="0";if(n.trim().length>0){var o=n.split(/-W/);l=o[0],r=o[1]}return"[".concat(u(e),"clickable").concat(h(e.getElement(),i),"] [spin button, ").concat(r,"], [spin button, ").concat(l,"] [menu button] [subMenu] Show week picker")}return null},function(e){var t;return"hidden"===(null===(t=e.getElement())||void 0===t?void 0:t.getAttribute("type"))?"":null},function(e){return e.isStartTag()&&"!![".concat(u(e),"input!!]").concat(e.getElement().outerHTML)||null}]}),new n.SRRendererRule({roles:[],elems:["LI"],modes:["item"],tests:[function(e){var t,i=b(e)?"":(null===(t=e.getNameInfo())||void 0===t?void 0:t.name)||"",a=e.getElement();return"none"===window.getComputedStyle(a).listStyleType?e.isStartTag()?"".concat(i):"":e.isStartTag()?"[bullet] ".concat(i):""}]}),new n.SRRendererRule({roles:[],elems:["MFRAC"],modes:["item"],tests:[function(e){return e.isStartTag()?"[fraction]":"[end fraction]"}]}),new n.SRRendererRule({roles:[],elems:["MROW"],modes:["item"],tests:[function(e){var t;if(!e.isStartTag()){var i=e.getCurrentOrParentByRoleClone([],["mfrac"]);return i&&(null===(t=i.getElement().querySelectorAll("mrow")[0])||void 0===t?void 0:t.isSameNode(e.getNode()))?"[over]":void 0}}]}),new n.SRRendererRule({roles:[],elems:["MSQRT"],modes:["item"],tests:[function(e){return e.isStartTag()?"[square root]":"[end root]"}]}),new n.SRRendererRule({roles:[],elems:["MSUP"],modes:["item"],tests:[function(e){var t,i;if(!e.isEndTag()){var a=(null===(t=e.getElement().querySelector("mi"))||void 0===t?void 0:t.innerHTML)||"",n=(null===(i=e.getElement().querySelector("mn"))||void 0===i?void 0:i.innerHTML)||"";return"2"===n?"".concat(a," [squared]"):"3"===n?"".concat(a," [cubed]"):"".concat(a," [to the ").concat(n,"]")}}]}),new n.SRRendererRule({roles:["article","banner","blockquote","caption","cell","code","columnheader","complementary","contentinfo","figure","form","group","list","main","mark","navigation","region","row","rowheader","search","table","toolbar"],elems:[],modes:["item"],tests:[function(e){return""}]}),new n.SRRendererRule({roles:["paragraph","rowgroup","status","strong","subscript","superscript","term","time","none","presentation"],elems:[],modes:["item"],tests:[function(e){return""}]})]},8485(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.RULES=void 0;var a=i(328),n=i(369),l=i(7242),r=i(7011),o=i(9910),s=i(7139);function u(e,t){var i;t&&"#text"===(null===(i=t.getNode())||void 0===i?void 0:i.nodeName)&&(t=t.clone()).previous(function(){return!0});var a=n.SRTableUtil.getTableModel(e),l=n.SRTableUtil.getCellModel(t,a),r=n.SRTableUtil.getCellModel(e,a);if(!r)return"";var o=[];if(!l||l.rowIndexStart!==r.rowIndexStart||l.rowspan!==r.rowspan){var s=n.SRTableUtil.getRowHeadersForCursor(e,a),u=s&&s.trim().length>0?'"'.concat(s,'", '):"";o.push("[".concat(u,"row ").concat(r.rowIndexStart+1).concat(r.rowspan>1?" through "+(r.rowIndexStart+r.rowspan):"","]"))}if(!l||l.colIndexStart!==r.colIndexStart||l.colspan!==r.colspan){var d=n.SRTableUtil.getColumnHeadersForCursor(e,a);u=d&&d.trim().length>0?'"'.concat(d,'", '):"",o.push("[".concat(u,"column ").concat(r.colIndexStart+1).concat(r.colspan>1?" through "+(r.colIndexStart+r.colspan):"","]"))}return o.join(" ")}t.RULES=[new a.SRRendererRule({roles:["article"],elems:[],modes:["item","article","tab_focus"],tests:[function(e,t,i){if("tab_focus"===i&&!s.CommonUtil.isTabbable(e.getNode()))return null;var a=(0,l.getRoleDescription)(e,"article");return"[".concat((0,l.quoteNamePadAfter)(e)).concat(a,"]")}]}),new a.SRRendererRule({roles:["banner"],elems:[],modes:["item","region","tab_focus"],tests:[function(e,t,i){if("tab_focus"===i&&!s.CommonUtil.isTabbable(e.getNode()))return null;var a=(0,l.getRoleDescription)(e,"banner region");return"[".concat((0,l.quoteNamePadAfter)(e)).concat(a,"]")}]}),new a.SRRendererRule({roles:["blockquote"],elems:[],modes:["item","region"],tests:[function(e){return"[blockquote]"}]}),new a.SRRendererRule({roles:["caption"],elems:[],modes:["item","region"],tests:[function(e){return"[caption]"}]}),new a.SRRendererRule({roles:["cell"],elems:[],modes:["item","table"],tests:[u]}),new a.SRRendererRule({roles:["columnheader"],elems:[],modes:["item","table"],tests:[u]}),new a.SRRendererRule({roles:["complementary"],elems:[],modes:["item","region","tab_focus"],tests:[function(e,t,i){return"tab_focus"!==i||s.CommonUtil.isTabbable(e.getNode())?"[".concat((0,l.quoteNamePadAfter)(e),"complementary region]"):null}]}),new a.SRRendererRule({roles:["contentinfo"],elems:[],modes:["item","region","tab_focus"],tests:[function(e,t,i){return"tab_focus"!==i||s.CommonUtil.isTabbable(e.getNode())?"[".concat((0,l.quoteNamePadAfter)(e),"content info region]"):null}]}),new a.SRRendererRule({roles:["figure"],elems:[],modes:["item","region"],tests:[function(e){return"[figure]"}]}),new a.SRRendererRule({roles:["form"],elems:[],modes:["item","region","formcontrol"],tests:[function(e){return null===e.getNameInfo()?"[section]":"[".concat((0,l.quoteNamePadAfter)(e),"form region]")}]}),new a.SRRendererRule({roles:["group"],elems:[],modes:["item","region"],tests:[function(e){var t;return null===e.getNameInfo()?null:"SELECT"===(null===(t=e.getCurrentOrParentByRoleClone(["combobox"],["select"]))||void 0===t?void 0:t.getNode().nodeName.toUpperCase())?"":"DETAILS"===e.getNode().nodeName.toUpperCase()?"[button, ".concat(e.getElement().hasAttribute("open")?"expanded":"collapsed","]"):"[grouping".concat((0,l.quoteNamePadBefore)(e),"]")}]}),new a.SRRendererRule({roles:["group"],elems:[],modes:["tab_focus"],tests:[function(e){var t;return null===e.getNameInfo()?null:"SELECT"===(null===(t=e.getCurrentOrParentByRoleClone(["combobox"],["select"]))||void 0===t?void 0:t.getNode().nodeName.toUpperCase())?"":"DETAILS"===e.getNode().nodeName.toUpperCase()?"[button, ".concat(e.getElement().hasAttribute("open")?"expanded":"collapsed","]"):""}]}),new a.SRRendererRule({roles:["list"],elems:[],modes:["item","list"],tests:[function(e){for(var t,i=e.getNode(),a=document.evaluate(".//li | .//*[@role='listitem']",i,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null),n=0,s=0;s<a.snapshotLength;s++){for(var u=!1,d=!1,c=a.snapshotItem(s).parentElement;c&&c!==i;){var m=r.AriaUtil.getResolvedRole(c);if("list"===m||"UL"===c.nodeName.toUpperCase()||"OL"===c.nodeName.toUpperCase()){u=!0;break}if(m&&(null===(t=o.ARIADefinitions.designPatterns[m])||void 0===t?void 0:t.presentationalChildren)){d=!0;break}c=c.parentElement}u||d||n++}return 0===n?null:"[".concat((0,l.quoteNamePadAfter)(e),"list of ").concat(n," items]")}]}),new a.SRRendererRule({roles:["main"],elems:[],modes:["item","region","tab_focus"],tests:[function(e,t,i){return"tab_focus"!==i||s.CommonUtil.isTabbable(e.getNode())?"[".concat((0,l.quoteNamePadAfter)(e),"main region]"):null}]}),new a.SRRendererRule({roles:["menubar"],elems:[],modes:["item","list"],tests:[function(e){var t=e.getNode(),i=document.evaluate(".//*[@role='menuitem']",t,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null),a=document.evaluate(".//*[@role='menubar']//*[@role='menuitem']|.//*[@role='menu']//*[@role='menuitem']",t,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null);console.log("MENUBAR",e.isEndTag()?"/":"",e.getNode()),console.log(i,a);var n=i.snapshotLength-a.snapshotLength;return 0===n?null:"[".concat((0,l.quoteNamePadAfter)(e),"menubar with ").concat(n," items]")}]}),new a.SRRendererRule({roles:["navigation"],elems:[],modes:["item","region","tab_focus"],tests:[function(e,t,i){if("tab_focus"===i&&!s.CommonUtil.isTabbable(e.getNode()))return null;var a=(0,l.getRoleDescription)(e,"navigation region");return"[".concat((0,l.quoteNamePadAfter)(e)).concat(a,"]")}]}),new a.SRRendererRule({roles:["radiogroup"],elems:[],modes:["item","region","tab_focus"],tests:[function(e){return null===e.getNameInfo()?null:"[grouping".concat((0,l.quoteNamePadBefore)(e),"]")}]}),new a.SRRendererRule({roles:["region"],elems:[],modes:["item","region","tab_focus"],tests:[function(e,t,i){if(null===e.getNameInfo())return null;if("tab_focus"===i&&!s.CommonUtil.isTabbable(e.getNode()))return null;var a=(0,l.getRoleDescription)(e,"region");return"[".concat((0,l.quoteNamePadAfter)(e)).concat(a,"]")}]}),new a.SRRendererRule({roles:["row"],elems:[],modes:["item","table"],tests:[function(){return""}]}),new a.SRRendererRule({roles:["rowheader"],elems:[],modes:["item","table"],tests:[u]}),new a.SRRendererRule({roles:["search"],elems:[],modes:["item","region","tab_focus"],tests:[function(e,t,i){if("tab_focus"===i&&!s.CommonUtil.isTabbable(e.getNode()))return null;var a=(0,l.getRoleDescription)(e,"search region");return"[".concat((0,l.quoteNamePadAfter)(e)).concat(a,"]")}]}),new a.SRRendererRule({roles:["table"],elems:[],modes:["item","table"],tests:[function(e){for(var t=e.clone();"table"!==t.getRole()&&t.previous(function(){return!0}););var i=t.getNode(),a=0,n=0;if(t.getNode().firstChild)for(var r=!1;t.next(function(){return!0})&&!t.getNode().isSameNode(i);){var o=t.getRole();if(t.isStartTag()){if("row"===o)++a;else if(!r&&["cell","rowheader","columnheader"].includes(o)){var s=t.getNode();n+=parseInt(s.getAttribute("colspan")||"1")}}else"row"===o&&(r=!0)}return"[table with ".concat(a," ").concat(1===a?"row":"rows"," and ").concat(n," ").concat(1===n?"column":"columns").concat((0,l.quoteNamePadBefore)(e),"]")}]}),new a.SRRendererRule({roles:["toolbar"],elems:[],modes:["item","region","tab_focus"],tests:[function(e,t,i){return"tab_focus"!==i||s.CommonUtil.isTabbable(e.getNode())?"[".concat((0,l.quoteNamePadAfter)(e),"toolbar]"):null}]}),new a.SRRendererRule({roles:[],elems:["DL"],modes:["item","list"],tests:[function(e){var t=e.getNode(),i=document.evaluate(".//dt",t,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null).snapshotLength;return"[".concat((0,l.quoteNamePadAfter)(e),"definition list of ").concat(i," terms]")}]}),new a.SRRendererRule({roles:[],elems:["FIGCAPTION"],modes:["item"],tests:[function(e){return"[caption]"}]}),new a.SRRendererRule({roles:[],elems:["MARK"],modes:["item"],tests:[function(e){return"[highlighted]"}]}),new a.SRRendererRule({roles:["article","banner","blockquote","caption","cell","columnheader","complementary","contentinfo","figure","form","group","region","row","rowheader","search","toolbar","list","main","navigation","table"],elems:[],modes:["heading"],tests:[function(){return""}]})]},2099(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.RULES=void 0;var a=i(328),n=i(7242);t.RULES=[new a.SRRendererRule({roles:["article"],elems:[],modes:["item"],tests:[function(e){var t=(0,n.getRoleDescription)(e,"article");return"[out of ".concat(t,"]")}]}),new a.SRRendererRule({roles:["banner"],elems:[],modes:["item"],tests:[function(e){var t=(0,n.getRoleDescription)(e,"banner region");return"[out of ".concat(t,"]")}]}),new a.SRRendererRule({roles:["blockquote"],elems:[],modes:["item"],tests:[function(e){return"[out of blockquote]"}]}),new a.SRRendererRule({roles:["caption"],elems:[],modes:["item"],tests:[function(e){return"[out of caption]"}]}),new a.SRRendererRule({roles:["complementary"],elems:[],modes:["item"],tests:[function(e){var t=(0,n.getRoleDescription)(e,"complementary region");return"[out of ".concat(t,"]")}]}),new a.SRRendererRule({roles:["contentinfo"],elems:[],modes:["item"],tests:[function(e){var t=(0,n.getRoleDescription)(e,"content info region");return"[out of ".concat(t,"]")}]}),new a.SRRendererRule({roles:["figure"],elems:[],modes:["item","region"],tests:[function(e){return"[out of figure]"}]}),new a.SRRendererRule({roles:["form"],elems:[],modes:["item","region","formcontrol"],tests:[function(e){return null===e.getNameInfo()?"[out of section]":"[out of form]"}]}),new a.SRRendererRule({roles:["group"],elems:[],modes:["item"],tests:[function(e){var t;return null===e.getNameInfo()?null:"SELECT"===(null===(t=e.getCurrentOrParentByRoleClone(["combobox"],["select"]))||void 0===t?void 0:t.getNode().nodeName.toUpperCase())?"":"[out of grouping]"}]}),new a.SRRendererRule({roles:["list"],elems:[],modes:["item"],tests:[function(e){var t=e.getNode(),i=document.evaluate(".//li | .//*[@role='listitem']",t,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null),a=document.evaluate(".//ul//li|.//ul//*[@role='listitem']|.//ol//li|.//ol//*[@role='listitem']|.//*[@role='list']//li|.//*[@role='list']//*[@role='listitem']",t,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null);return 0===i.snapshotLength-a.snapshotLength?null:"[".concat((0,n.quoteNamePadAfter)(e),"out of list]")}]}),new a.SRRendererRule({roles:["main"],elems:[],modes:["item"],tests:[function(e){var t=(0,n.getRoleDescription)(e,"main region");return"[out of ".concat(t,"]")}]}),new a.SRRendererRule({roles:["menubar"],elems:[],modes:["item","list"],tests:[function(e){return"[out of menubar]"}]}),new a.SRRendererRule({roles:["navigation"],elems:[],modes:["item"],tests:[function(e){var t=(0,n.getRoleDescription)(e,"navigation region");return"[out of ".concat(t,"]")}]}),new a.SRRendererRule({roles:["radiogroup"],elems:[],modes:["item","region","tab_focus"],tests:[function(e){return"[out of grouping]"}]}),new a.SRRendererRule({roles:["region"],elems:[],modes:["item"],tests:[function(e){if(null===e.getNameInfo())return null;var t=(0,n.getRoleDescription)(e,"region");return"[out of ".concat(t,"]")}]}),new a.SRRendererRule({roles:["search"],elems:[],modes:["item"],tests:[function(e){var t=(0,n.getRoleDescription)(e,"search region");return"[out of ".concat(t,"]")}]}),new a.SRRendererRule({roles:["table"],elems:[],modes:["item"],tests:[function(e){return"[out of table]"}]}),new a.SRRendererRule({roles:["toolbar"],elems:[],modes:["item"],tests:[function(e){return"[out of toolbar]"}]}),new a.SRRendererRule({roles:[],elems:["ABBR"],modes:["item"],tests:[function(e){return e.getElement().hasAttribute("title")?"[".concat(e.getElement().getAttribute("title"),"]"):null}]}),new a.SRRendererRule({roles:[],elems:["DL"],modes:["item"],tests:[function(e){return"[out of definition list]"}]}),new a.SRRendererRule({roles:[],elems:["FIGCAPTION"],modes:["item"],tests:[function(e){return"[out of caption]"}]}),new a.SRRendererRule({roles:[],elems:["MARK"],modes:["item"],tests:[function(e){return"[out of highlighted]"}]}),new a.SRRendererRule({roles:["group","article","banner","blockquote","caption","complementary","contentinfo","figure","form","list","region","main","navigation","search","table","toolbar"],elems:[],modes:["region","heading"],tests:[function(){return""}]})]},2151(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.CONTAINER_EXIT_RULES=t.CONTAINER_ENTER_RULES=t.SR_RULES=void 0;var a=i(7242),n=i(8485),l=i(2099);t.SR_RULES=a.RULES,t.CONTAINER_ENTER_RULES=n.RULES,t.CONTAINER_EXIT_RULES=l.RULES},1950(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.AccNameUtil=void 0;var a=i(9910),n=i(7139),l=i(7011),r=i(3946),o=i(4566),s=i(3864),u=i(1686),d=function(){function e(){}return e.computeAccessibleNameForSVGElementW3C=function(e){if(!e||"svg"!==e.nodeName.toLowerCase())return null;var t=e.querySelectorAll(":scope > title");if(t&&t.length>0){var i="";if(t.forEach(function(e){if(e&&!r.VisUtil.isNodeHiddenFromAT(e)&&!r.VisUtil.isNodePresentational(e)){var t=e.textContent;t&&""!==t.trim()&&(i+=t.trim())}}),i&&""!==i.trim())return{name:i.trim(),nameFrom:"svgTitle"}}var a="",o=e.querySelectorAll("text, textPath, tspan");if(o&&o.length>0&&(o.forEach(function(e){if(!r.VisUtil.isNodeHiddenFromAT(e)&&!r.VisUtil.isNodePresentational(e)){var t=e.textContent;t&&""!==t.trim()&&(a+=" "+t.trim())}}),""!==a.trim()))return{name:n.CommonUtil.truncateText(a.trim()),nameFrom:"svgText"};for(var s=e.querySelectorAll("a"),u=0;u<s.length;u++){var d=s[u];if(!r.VisUtil.isNodeHiddenFromAT(d)&&!r.VisUtil.isNodePresentational(d)){var c=d.getAttribute("xlink:title");if(c&&""!==c.trim())return{name:n.CommonUtil.truncateText(c),nameFrom:"svglinkTitle"}}}var m=l.AriaUtil.getAriaDescription(e);if(m&&""!==m.trim())return{name:n.CommonUtil.truncateText(m),nameFrom:"aria-description"};var p=e.querySelectorAll(":scope > desc");if(p&&p.length>0){var h="";if(p.forEach(function(e){if(!r.VisUtil.isNodeHiddenFromAT(e)&&!r.VisUtil.isNodePresentational(e)){var t=e.textContent;t&&""!==t.trim()&&(h+=" "+t.trim())}}),""!==h.trim())return{name:h.trim(),nameFrom:"svgDesc"}}if(e.hasAttribute("title")){var g=e.getAttribute("title");if(g&&""!==g.trim())return{name:n.CommonUtil.truncateText(g),nameFrom:"title"}}return null},e.computeAccessibleName=function(t){if(!t)return null;var i=t.nodeName.toLowerCase(),r=o.CacheUtil.getCache(t,"ELEMENT_ACCESSBLE_NAME",void 0);if(void 0!==r)return r;var s=l.AriaUtil.getAriaLabel(t);if(s&&""!==s.trim())return o.CacheUtil.setCache(t,"ELEMENT_ACCESSBLE_NAME",{name:n.CommonUtil.truncateText(s),nameFrom:"ariaLabel"}),{name:n.CommonUtil.truncateText(s),nameFrom:"ariaLabel"};if(r=e.computeAccessibleNameForNativeElement(t))return o.CacheUtil.setCache(t,"ELEMENT_ACCESSBLE_NAME",r),r;var u=l.AriaUtil.getResolvedRole(t);if(a.ARIADefinitions.designPatterns[u]&&a.ARIADefinitions.designPatterns[u].nameFrom.includes("contents")&&(r=e.computeAccessibleNameFromContent(t)))return o.CacheUtil.setCache(t,"ELEMENT_ACCESSBLE_NAME",r),r;if(t.hasAttribute("title")){var d=t.getAttribute("title").trim();if(d&&d.trim().length>0)return d=n.CommonUtil.truncateText(d),o.CacheUtil.setCache(t,"ELEMENT_ACCESSBLE_NAME",{name:d,nameFrom:"title"}),{name:d,nameFrom:"title"}}if("textarea"===i||"input"===i&&(!t.hasAttribute("type")||n.CommonUtil.input_type_with_placeholder.includes(t.getAttribute("type")))){var c=t.getAttribute("placeholder");if(c&&c.trim().length>0)return c=n.CommonUtil.truncateText(c),o.CacheUtil.setCache(t,"ELEMENT_ACCESSBLE_NAME",{name:c,nameFrom:"placeholder"}),{name:c,nameFrom:"placeholder"}}return o.CacheUtil.setCache(t,"ELEMENT_ACCESSBLE_NAME",null),null},e.computeAccessibleNameForNativeElement=function(t){var i,a,l=t.nodeName.toLowerCase();if(n.CommonUtil.form_labelable_elements.includes(l)&&(p=n.CommonUtil.getFormFieldLabel(t))&&""!==p.trim())return{name:n.CommonUtil.truncateText(p),nameFrom:"label"};if("input"===l&&t.hasAttribute("type"))if(n.CommonUtil.form_button_types.includes(t.getAttribute("type"))){var o=n.CommonUtil.getElementAttribute(t,"value");if(o&&""!==o.trim())return{name:n.CommonUtil.truncateText(o),nameFrom:"value"};var s=t.getAttribute("type");if("submit"===s||"reset"===s)return{name:s,nameFrom:"internal"}}else if("image"===t.getAttribute("type")&&(b=n.CommonUtil.getElementAttribute(t,"alt"))&&""!==b.trim())return{name:n.CommonUtil.truncateText(b),nameFrom:"alt"};if("button"===l){if((v=t.innerText)&&""!==v.trim())return{name:n.CommonUtil.truncateText(v),nameFrom:"text"};var d=t.querySelector("img");if(d&&!r.VisUtil.isNodeHiddenFromAT(d)&&!r.VisUtil.isNodePresentational(d)&&(a=e.computeAccessibleName(d))&&a.name&&a.name.trim().length>0)return a;var c=t.querySelector("svg");if(c&&!r.VisUtil.isNodeHiddenFromAT(c)&&!r.VisUtil.isNodePresentational(c)&&(a=e.computeAccessibleName(c))&&a.name&&a.name.trim().length>0)return a}if("fieldset"===l&&(i=t.firstElementChild)&&"legend"===i.nodeName.toLowerCase()&&(v=i.innerText)&&v.trim().length>0)return{name:n.CommonUtil.truncateText(v),nameFrom:"legend"};if("output"===l&&t.hasAttribute("for")){var m=t.getAttribute("for").trim().split(" ");if(m&&m.length>0){for(var p="",h=0;h<m.length;h++){var g=t.ownerDocument.getElementById(m[h]);!g||u.DOMUtil.sameNode(g,t)||r.VisUtil.isNodeHiddenFromAT(g)||r.VisUtil.isNodePresentational(g)||(a=e.computeAccessibleName(g))&&a.name&&a.name.trim().length>0&&(p+=" "+n.CommonUtil.normalizeSpacing(a.name))}if(p.trim().length>0)return{name:n.CommonUtil.truncateText(p),nameFrom:"label"}}}if("summary"===l&&(v=t.innerText)&&v.trim().length>0)return{name:n.CommonUtil.truncateText(v),nameFrom:"legend"};if("details"===l)return(i=t.firstElementChild)&&"summary"===i.nodeName.toLowerCase()&&(a=e.computeAccessibleName(i))&&a.name&&a.name.trim().length>0?{name:n.CommonUtil.truncateText(a.name.trim()),nameFrom:"summary"}:{name:"details",nameFrom:"internal"};if("figure"===l&&(_=n.CommonUtil.getChildByTagHidden(t,"figcaption",!0,!1))&&_.length>0&&(v=_[0].innerText)&&v.trim().length>0)return{name:n.CommonUtil.truncateText(v),nameFrom:"figcaption"};if("img"===l&&t.hasAttribute("alt")){var b=t.getAttribute("alt");return{name:n.CommonUtil.truncateText(b),nameFrom:"alt"}}if("area"===l&&t.hasAttribute("alt")&&(b=t.getAttribute("alt"))&&b.trim().length>0)return{name:n.CommonUtil.truncateText(b),nameFrom:"alt"};if("table"===l){var _,f=t.firstElementChild;if(f&&"caption"===f.nodeName.toLowerCase()&&(_=f.innerText)&&_.trim().length>0)return{name:n.CommonUtil.truncateText(_),nameFrom:"caption"}}if("a"===l){var v;if((v=t.innerText)&&""!==v.trim())return{name:n.CommonUtil.truncateText(v),nameFrom:"text"};var A=t.querySelectorAll(":scope > img, :scope > svg");if(A&&A.length>0){var w="";if(A.forEach(function(t){if(!r.VisUtil.isNodeHiddenFromAT(t)&&!r.VisUtil.isNodePresentational(t)){var i=e.computeAccessibleName(t);i&&i.name&&i.name.trim().length>0&&(w+=" "+i.name.trim())}}),""!==w.trim())return{name:w.trim(),nameFrom:"alt"}}}return("optgroup"===l||"option"===l||"track"===l)&&(p=t.getAttribute("label"))&&p.trim().length>0?{name:n.CommonUtil.truncateText(p),nameFrom:"label"}:"svg"===l&&(a=e.computeAccessibleNameForSVGElementW3C(t))&&a.name&&a.name.trim().length>0?a:null},e.computeAccessibleNameForSVGElement=function(e){var t=e.querySelectorAll(":scope > title");if(t&&t.length>0){var i="";if(t.forEach(function(e){if(e&&!r.VisUtil.isNodeHiddenFromAT(e)&&!r.VisUtil.isNodePresentational(e)){var t=e.textContent;t&&""!==t.trim()&&(i+=t.trim())}}),i&&""!==i.trim())return{name:i.trim(),nameFrom:"svgTitle"}}var a=e.querySelector("a");if(a&&!r.VisUtil.isNodeHiddenFromAT(a)&&!r.VisUtil.isNodePresentational(a)){var o=a.getAttribute("xlink:title");if(o&&""!==o.trim())return{name:n.CommonUtil.truncateText(o),nameFrom:"svglinkTitle"}}var s="";if(e.querySelectorAll(":scope > *").forEach(function(e){if("svg"!==e.nodeName.toLowerCase()&&!r.VisUtil.isNodeHiddenFromAT(e)&&!r.VisUtil.isNodePresentational(e)){var t=n.CommonUtil.getInnerText(e);t&&t.trim().length>0&&(s+=t)}}),""!==s.trim())return{name:n.CommonUtil.truncateText(s),nameFrom:"svgText"};var u=l.AriaUtil.getAriaDescription(e);if(u&&u.trim().length>0)return{name:n.CommonUtil.truncateText(u),nameFrom:"aria-description"};var d=e.querySelectorAll(":scope > desc");if(d&&d.length>0){var c="";if(d.forEach(function(e){if(e&&!r.VisUtil.isNodeHiddenFromAT(e)&&!r.VisUtil.isNodePresentational(e)){var t=e.textContent;t&&""!==t.trim()&&(c+=t.trim())}}),c&&""!==c.trim())return{name:c.trim(),nameFrom:"svgDesc"}}},e.computeAccessibleNameFromContent=function(t){var i=t.nodeName.toLowerCase(),a=(l.AriaUtil.getResolvedRole(t),e.computeAccessibleNameForCSSPseudoElement(t,"before"));return null!==a&&a.name&&a.name.trim().length>0||(a=e.computeAccessibleNameForCSSPseudoElement(t,"after"))&&a.name&&a.name.trim().length>0?a:t.shadowRoot&&(a=e.computeAccessibleNameForShadowHost(t))&&a.name&&a.name.trim().length>0?{name:a.name,nameFrom:"shadow"}:"slot"===i&&(a=e.computeAccessibleNameForSlotElement(t))&&a.name&&a.name.trim().length>0?{name:a.name,nameFrom:"slot"}:(a=e.computeAccessibleNameFromChildren(t))&&a.name&&a.name.trim().length>0?{name:a.name,nameFrom:"content"}:null},e.computeAccessibleNameForCSSPseudoElement=function(e,t){var i=e.ownerDocument.defaultView.getComputedStyle(e,t);if(i){var a=i.content;if(a&&"none"!==a&&"no"!==a&&"normal"!==a&&(a=a.replace(/^"/,"").replace(/"$/,"")).trim().length>0)return{name:n.CommonUtil.truncateText(a),nameFrom:"css-"+t}}return null},e.computeAccessibleNameForShadowHost=function(t){var i="",a=t.shadowRoot;return a&&a.querySelectorAll("*").forEach(function(t){var a=e.computeAccessibleName(t);a&&a.name&&a.name.trim().length>0&&(i+=" "+a.name.trim())}),i.trim().length>0?{name:n.CommonUtil.truncateText(i),nameFrom:"shadow-host"}:null},e.computeAccessibleNameForSlotElement=function(t){var i="";if(t.assignedNodes()&&0!==t.assignedNodes().length)for(var a=0,l=t.assignedNodes();a<l.length;a++){var r,o=l[a];(r=e.computeAccessibleName(o))&&r.name&&r.name.length>0&&(i+=" "+r.name.trim())}else(r=e.computeAccessibleName(t))&&r.name&&r.name.trim().length>0&&(i+=" "+r.name.trim());return i.trim().length>0?{name:n.CommonUtil.truncateText(i),nameFrom:"content-slot"}:null},e.computeAccessibleNameFromChildren=function(t){for(var i="",a=new s.DOMWalker(t);a.nextNode()&&a.node!==t&&a.node!==t.parentNode;)if(!a.bEndTag){var o=a.node;if(3===o.nodeType){var u=o.parentElement;!r.VisUtil.isNodeHiddenFromAT(u)&&!r.VisUtil.isNodePresentational(u)&&o.nodeValue&&o.nodeValue.trim().length>0&&(i+=" "+o.nodeValue.trim())}else if(1===o.nodeType&&!r.VisUtil.isNodeHiddenFromAT(o)&&!r.VisUtil.isNodePresentational(o)){var d=e.computeAccessibleName(o);d&&d.name&&d.name.length>0?(i+=" "+d.name.trim(),a.bEndTag=!0):l.AriaUtil.containsPresentationalChildrenOnly(a.node)&&(a.bEndTag=!0)}}return i.trim().length>0?{name:n.CommonUtil.truncateText(i),nameFrom:"content"}:null},e.isAccessibleNameIgnorable=function(e){if(!e)return!1;var t=e.nodeName.toLowerCase();if("img"!==t&&"svg"!==t)return!1;var i=e.parentElement;return!(!i||!l.AriaUtil.isWidget(i)&&!l.AriaUtil.containsPresentationalChildrenOnly(i)||!l.AriaUtil.hasAriaLabel(i))},e}();t.AccNameUtil=d},7011(e,t,i){var a=this&&this.__spreadArray||function(e,t,i){if(i||2===arguments.length)for(var a,n=0,l=t.length;n<l;n++)!a&&n in t||(a||(a=Array.prototype.slice.call(t,0,n)),a[n]=t[n]);return e.concat(a||Array.prototype.slice.call(t))};Object.defineProperty(t,"__esModule",{value:!0}),t.AriaUtil=void 0;var n=i(4566),l=i(9910),r=i(9955),o=i(3864),s=i(3946),u=i(7139),d=i(1950),c=i(5279),m=i(1686),p=function(){function e(){}return e.isDefinedAriaAttributeAtIndex=function(t,i){var a=t.attributes[i].name;return e.isDefinedAriaAttribute(t,a)},e.getUserDefinedAriaAttributes=function(e){var t=[],i=e.attributes;if(i)for(var a=0;a<i.length;a++){var n=i[a].name.trim().toLowerCase();"aria-"===n.substring(0,5)&&t.push(n)}return t},e.getUserDefinedHtmlAttributes=function(e){var t=[],i=e.attributes;if(i)for(var a=0;a<i.length;a++){var n=i[a].name.trim().toLowerCase();"aria-"===n.substring(0,5)||t.push(n)}return t},e.getUserDefinedAriaAttributeNameValuePairs=function(e){var t=[],i=e.attributes;if(i)for(var a=0;a<i.length;a++){var n=i[a].name.trim().toLowerCase(),l=e.getAttribute(n);""===l&&(l=null),"aria-"===n.substring(0,5)&&t.push({name:n,value:l})}return t},e.getUserDefinedHtmlAttributeNameValuePairs=function(e){var t=[],i=e.attributes;if(i)for(var a=0;a<i.length;a++){var n=i[a].name.trim().toLowerCase(),l=e.getAttribute(n);""===l&&(l=null),"aria-"===n.substring(0,5)||t.push({name:n,value:l})}return t},e.getAriaAttribute=function(t,i){var a=t.getAttribute(i);if(t.hasAttribute(i)&&""===a.trim())return a;if(!a){var n=t.nodeName.toLowerCase();i in e.ariaAttributeImplicitMappings&&(n in e.ariaAttributeImplicitMappings[i]?"function"==typeof(a=e.ariaAttributeImplicitMappings[i][n])&&(a=a(t)):"*"in e.ariaAttributeImplicitMappings[i]&&"function"==typeof(a=e.ariaAttributeImplicitMappings[i]["*"])&&(a=a(t)))}if(!a){var l=r.ARIAMapper.nodeToRole(t);l in e.ariaAttributeRoleDefaults&&i in e.ariaAttributeRoleDefaults[l]&&"function"==typeof(a=e.ariaAttributeRoleDefaults[l][i])&&(a=a(t))}return!a&&i in e.ariaAttributeGlobalDefaults&&(a=e.ariaAttributeGlobalDefaults[i]),a},e.isDefinedAriaAttribute=function(e,t){var i=!1;return"aria-"===t.substring(0,5)&&(i=e.hasAttribute&&e.hasAttribute(t)&&e.getAttribute(t).length>0),i},e.getResolvedRole=function(t,i){if(void 0===i&&(i=!0),!t)return null;var a=n.CacheUtil.getCache(t,"RPTUTIL_ELEMENT_RESOLVED_ROLE",null);if(null===a){var l=e.getUserDefinedRoles(t),r=e.getElementAriaProperty(t),o=e.getAllowedAriaRoles(t,r),s=!1;if(l&&l.length>0&&o&&o.length>0){for(var d=0;d<l.length;d++)if(o.includes("any")||o.includes(l[d])){if(o.includes("any")&&"generic"===l[d]){s=!0;continue}if(("presentation"===(a=l[d])||"none"===a)&&u.CommonUtil.isFocusable(t)){a=null;continue}break}s&&(a="generic")}if(null===a&&i){var c=e.getImplicitRole(t);a=c&&c.length>0?c[0]:void 0}n.CacheUtil.setCache(t,"RPTUTIL_ELEMENT_RESOLVED_ROLE",a)}return void 0!==a?a:null},e.getUserDefinedRoles=function(t){return e.getRoles(t,!1)},e.getRoles=function(t,i){var a=[];if(t&&t.hasAttribute&&t.hasAttribute("role"))for(var n=u.CommonUtil.normalizeSpacing(t.getAttribute("role").trim()).split(" "),l=0;l<n.length;++l)a.push(n[l]);if(i){var r=e.getImplicitRole(t);null!==r&&r.length>0&&u.CommonUtil.concatUniqueArrayItemList(r,a)}return a},e.getImplicitRole=function(t){if(!t||1!==t.nodeType)return null;var i=n.CacheUtil.getCache(t,"AriaUtil_ImplicitRole",null);if(!i){var a=e.getElementAriaProperty(t);if(a&&a.implicitRole){if(a.implicitRole.includes("generic")){var r=e.getUserDefinedAriaAttributes(t);if(0===r.length)return n.CacheUtil.setCache(t,"AriaUtil_ImplicitRole",[]),[];var o=[],s=l.ARIADefinitions.designPatterns.generic;if(s.reqProps&&s.reqProps.length>0&&u.CommonUtil.concatUniqueArrayItemList(s.reqProps,o),a.globalAriaAttributesValid&&u.CommonUtil.concatUniqueArrayItemList(l.ARIADefinitions.globalProperties,o),s.deprecatedProps&&s.deprecatedProps.length>0&&u.CommonUtil.reduceArrayItemList(s.deprecatedProps,o),o.length>0&&!o.some(function(e){return r.includes(e)})){var d=u.CommonUtil.reduceArrayItemList(["generic"],a.implicitRole);return n.CacheUtil.setCache(t,"AriaUtil_ImplicitRole",d),d}}return n.CacheUtil.setCache(t,"AriaUtil_ImplicitRole",a.implicitRole),a.implicitRole}return n.CacheUtil.setCache(t,"AriaUtil_ImplicitRole",[]),[]}return i},e.getRoleRequiredProperties=function(e,t){if(null===e)return null;if(l.ARIADefinitions.designPatterns[e]){var i=l.ARIADefinitions.designPatterns[e].reqProps;return"separator"===e.toLowerCase()&&t&&u.CommonUtil.isFocusable(t)&&(i=u.CommonUtil.concatUniqueArrayItemList(["aria-valuenow"],i||[])),i}return null},e.hasRole=function(t,i,a){var n=!1;if(t&&t.hasAttribute&&t.hasAttribute("role"))if("string"!=typeof i)for(var l=t.getAttribute("role").trim().split(" "),r=0;!n&&r<l.length;++r)n=l[r]in i;else for(l=t.getAttribute("role").trim().split(" "),r=0;!n&&r<l.length;++r)n=l[r]===i;if(!n&&a){var o=[],s=e.getImplicitRole(t);if(null!==s&&s.length>0)if(u.CommonUtil.concatUniqueArrayItemList(s,o),"string"!=typeof i)for(r=0;!n&&r<o.length;++r)n=o[r]in i;else for(r=0;!n&&r<o.length;++r)n=o[r]===i}return n},e.hasRoleInSemantics=function(t,i){var a=!1,n=!1;if(t&&t.hasAttribute&&t.hasAttribute("role"))if("string"!=typeof i)for(var l=t.getAttribute("role").trim().toLowerCase().split(/\s+/),r=0;!a&&r<l.length;++r)n=!0,a=l[r]in i;else for(l=t.getAttribute("role").trim().toLowerCase().split(/\s+/),r=0;!a&&r<l.length;++r)n=!0,a=l[r]===i;if(n)return a;var o=e.getImplicitRole(t);if(null!==o&&o.length>0)if("string"!=typeof i)for(r=0;!a&&r<o.length;++r)a=o[r]in i;else for(r=0;!a&&r<o.length;++r)a=o[r]===i;return a},e.hasAnyRole=function(t,i){var a=!1;if(t&&t.hasAttribute&&t.hasAttribute("role")&&(a=!0),!a&&i){var n=e.getImplicitRole(t);null!==n&&n.length>0&&(a=!0)}return a},e.isPresentationalElement=function(e){return u.CommonUtil.valInArray(e.nodeName.toLowerCase(),["abbr","b","bdi","bdo","br","cite","code","data","dfn","em","i","kbd","mark","q","rp","rt","rtc","ruby","s","samp","small","span","strong","sub","sup","time","u","var","wbr","a","progress","meter","basefont","big","center","strike","tt","font","blink","h1","h2","h3","h4","h5","h6","hr","blockquote","p"])},e.getAncestorWithRole=function(t,i,a){for(var n=o.DOMWalker.parentNode(t);null!==n;){if(a){if(e.hasRoleInSemantics(n,i))break}else if(e.hasRole(n,i,!1))break;n=o.DOMWalker.parentNode(n)}return n},e.getAncestorWithRoles=function(t,i){if(!t||!i||!i.length||0===i.length)return null;for(var a=t;null!==a;){var n=e.getResolvedRole(a);if(null!==n&&(i.includes(n)||i.includes("*")&&!["presentation","none"].includes(n)))return a;a=o.DOMWalker.parentNode(a)}return null},e.getRolesWithTypes=function(e,t){if(!e||!t||!t.length||0===t.length)return null;var i=n.CacheUtil.getCache(e.ownerDocument,"roles_with_given_types",null);return i&&0!==i.length||(i=[],Object.entries(l.ARIADefinitions.designPatterns).forEach(function(e){var a=e[0],n=e[1];t.includes(n.roleType)&&i.push(a)}),n.CacheUtil.setCache(e.ownerDocument,"roles_with_given_types",i)),i},e.isWidget=function(t){if(!t)return!1;var i=n.CacheUtil.getCache(t.ownerDocument,"is_element_widget",null);if(null===i){var a=!1,r=e.getResolvedRole(t);return r&&l.ARIADefinitions.designPatterns[r]&&"widget"===l.ARIADefinitions.designPatterns[r].roleType&&(a=!0),n.CacheUtil.setCache(t.ownerDocument,"is_element_widget",a),a}return i},e.isNavigationOwnedOrControlled=function(t){if(!t)return!1;var i=n.CacheUtil.getCache(t.ownerDocument,"AriaUtil_NavigationOwnedOrControlled",null);if(null!==i&&i.length>0&&u.CommonUtil.getAncestor(t,i))return!0;var a=e.getResolvedRole(t);if(!a)return!1;var l=t.getAttribute("id");return!(!l||0===l.trim().length)&&(!!t.ownerDocument.querySelector("*[aria-controls~='".concat(l,"'], *[aria-owns~='").concat(l,"']"))&&(!!["combobox","scrollbar","button","tab","listbox","menu","menubar","radiogroup","tree","treegrid"].includes(a)&&(null===i&&(i=[]),i.push(t),n.CacheUtil.setCache(t.ownerDocument,"AriaUtil_NavigationOwnedOrControlled",i),!0)))},e.getSiblingWithRole=function(t,i){return e.getSiblingWithRoleHidden(t,i,!1)},e.getSiblingWithRoleHidden=function(t,i,a,n){var l=null,r=!1;if(t&&i){for(l=t.nextSibling;null!==l&&!r;)a&&u.CommonUtil.shouldNodeBeSkippedHidden(l)||(r=n?e.hasRoleInSemantics(l,i):e.hasRole(l,i,!1)),l=l.nextSibling;if(!l)for(l=t.previousSibling;null!==l&&!r;)a&&u.CommonUtil.shouldNodeBeSkippedHidden(l)||(r=e.hasRole(l,i,n)),l=l.previousSibling}return l},e.getDescendantWithRole=function(t,i){return e.getDescendantWithRoleHidden(t,i,!1)},e.getDescendantWithRoleHidden=function(t,i,a,n){for(var l=null,r=new o.DOMWalker(t);r.nextNode()&&r.node!=t&&r.node!=t.nextSibling;)if((!a||!u.CommonUtil.shouldNodeBeSkippedHidden(r.node))&&(n?e.hasRoleInSemantics(r.node,i):e.hasRole(r.node,i,!1))){l=r.node;break}return l},e.getAllDescendantsWithRoles=function(t,i,a,n){if(i&&0!==i.length){var l=[];return i.forEach(function(i){var r=e.getAllDescendantsWithRoleHidden(t,i,a,n);r&&r.length>0&&(l=l.concat(r))}),l}},e.getAllDescendantsWithRoleHidden=function(t,i,a,n){for(var l=[],r=new o.DOMWalker(t);r.nextNode()&&r.node!=t&&r.node!=t.nextSibling;)r.bEndTag||a&&u.CommonUtil.shouldNodeBeSkippedHidden(r.node)||e.hasRole(r.node,i,n)&&l.push(r.node);return l},e.getDirectATChildren=function(t){var i=e.getRequiredChildRoles(t,!0),a=[];return e.retrieveDirectATChildren(t,i,a),a},e.retrieveDirectATChildren=function(t,i,a){var n=[];if(null!==t.children&&t.children.length>0)for(var l=0;l<t.children.length;l++)n.push(t.children[l]);var r=t.getAttribute("aria-owns");if(r){var o=t.ownerDocument;if(o){var u=r.split(" ");for(l=0;l<u.length;l++){var d=o.getElementById(u[l]);d&&n.push(d)}}}if(n.length>0){for(l=0;l<n.length;l++)if(!s.VisUtil.isNodeHiddenFromAT(n[l])&&s.VisUtil.isNodeVisible(n[l])){var c=e.getRoles(n[l],!1);null!==c&&0!==c.length||(c=e.getImplicitRole(n[l])),c&&null!==c&&c.length>0&&(c=c.filter(function(e){return"none"!==e&&"presentation"!==e})).includes("group")&&i&&i.includes("group")&&(c=c.filter(function(e){return"group"!==e})),c&&null!==c&&c.length>0?a.push(n[l]):e.retrieveDirectATChildren(n[l],i,a)}return null}return null},e.getRequiredChildRoles=function(t,i){var a=e.getRoles(t,!1);if(a&&0!==a.length||!i||(a=e.getImplicitRole(t)),!a||0===a.length)return null;var n=["none","presentation"];if(a.some(function(e){return n.includes(e)}))return null;for(var r=l.ARIADefinitions.designPatterns,o=new Array,s=0;s<a.length;++s)r[a[s]]&&null!==r[a[s]].reqChildren&&(o=u.CommonUtil.concatUniqueArrayItemList(r[a[s]].reqChildren,o));return o},e.getAriaOwnsWithRole=function(t,i){return e.getAriaOwnsWithRoleHidden(t,i,!1)},e.getAriaOwnsWithRoleHidden=function(t,i,a,n){var l=null,r=!1;if(u.CommonUtil.attributeNonEmpty(t,"aria-owns")){var o=t.getAttribute("aria-owns");if(l=c.FragmentUtil.getById(t,o),m.DOMUtil.sameNode(t,l))return null;r=a&&null!=l&&u.CommonUtil.shouldNodeBeSkippedHidden(l)?null:e.hasRole(l,i,n)}return r?l:null},e.hasAriaLabel=function(e){return u.CommonUtil.attributeNonEmpty(e,"aria-label")||u.CommonUtil.attributeNonEmpty(e,"aria-labelledby")},e.hasUniqueAriaLabelsLocally=function(t,i){if(0===t.length)return!1;var a=t[0].ownerDocument,l=!1,r=null;i&&(r=n.CacheUtil.getCache(a,"AriaUtil_HAS_UNIQUE_ARIA_LABELS",null)),null===r&&(r={});for(var o=0;!l&&o<t.length;++o)if(t[o].hasAttribute)if(t[o].hasAttribute("aria-label")){var s=u.CommonUtil.normalizeSpacing(t[o].getAttribute("aria-label")).toLowerCase();l=s in r,r[s]=!0}else if(t[o].hasAttribute("aria-labelledby")){var d=t[o].getAttribute("aria-labelledby"),p=c.FragmentUtil.getById(t[o],d),h="";p&&!m.DOMUtil.sameNode(p,t[o])&&(h=e.getTextContentExcludingScripts(p));var g=u.CommonUtil.normalizeSpacing(h).toLowerCase();l=g in r,r[g]=!0}else l=!0;return i&&n.CacheUtil.setCache(a,"AriaUtil_HAS_UNIQUE_ARIA_LABELS",r),!l},e.getTextContentExcludingScripts=function(e){if(!e)return"";for(var t="",i=new o.DOMWalker(e);i.nextNode()&&i.node!==e&&i.node!==e.parentNode;)if(!i.bEndTag){var a=i.node,n=a.nodeName?a.nodeName.toLowerCase():"";"script"!==n&&"style"!==n?3===a.nodeType?a.nodeValue&&a.nodeValue.trim().length>0&&(t+=" "+a.nodeValue.trim()):1===a.nodeType&&("img"===n&&a.hasAttribute("alt")||"input"===n&&"image"===a.getAttribute("type")&&a.hasAttribute("alt"))&&(t+=" "+a.getAttribute("alt").trim(),i.bEndTag=!0):i.bEndTag=!0}return t.trim()},e.getAriaLabel=function(t){if(t.hasAttribute){if(t.hasAttribute("aria-labelledby")){for(var i=t.getAttribute("aria-labelledby").trim().split(" "),a="",n=0,l=i.length;n<l;++n){var r=i[n],o=c.FragmentUtil.getById(t,r);if(o&&!m.DOMUtil.sameNode(o,t)){var s=e.getTextContentExcludingScripts(o);a+=u.CommonUtil.normalizeSpacing(s)}}return a.trim()}if(t.hasAttribute("aria-label"))return u.CommonUtil.normalizeSpacing(t.getAttribute("aria-label")).trim()}return""},e.getAriaDescription=function(t){if(!t)return"";var i="",a=t.getAttribute("aria-labelledby");if(a&&a.trim().length>0){for(var n=a.trim().split(" "),l=0,r=n.length;l<r;++l){var o=n[l],s=c.FragmentUtil.getById(t,o);if(s&&!m.DOMUtil.sameNode(s,t)){var d=e.getTextContentExcludingScripts(s);d&&d.trim().length>0&&(i+=u.CommonUtil.normalizeSpacing(d).toLowerCase())}}if(i.trim().length>0)return i.trim()}return(a=t.getAttribute("aria-description"))&&a.trim().length>0?a.trim().toLowerCase():""},e.findAriaLabelDupes=function(t){var i={};return t.forEach(function(t){i[e.getAriaLabel(t)]=(i[e.getAriaLabel(t)]||0)+1}),i},e.getLandmarkAccNames=function(t){var i=n.CacheUtil.getCache(t,"AriaUtil_Landmark_AccNames",null);if(i&&0!==i.length)return i;i=[];var l=t.querySelectorAll('aside,[role="complementary"], footer,[role="contentinfo"], header,[role="banner"], main,[role="main"], nav,[role="navigation"], form,[role="form"], section,[role="region"], article,[role="article"], [role="search"],[role="application"],[role="document"]');return 0===l.length?(n.CacheUtil.setCache(t,"AriaUtil_Landmark_AccNames",i),i):(l.forEach(function(t){if(!s.VisUtil.isNodeHiddenFromAT(t)&&null===u.CommonUtil.getAncestor(t,["DIALOG"])&&null===e.getAncestorWithRole(t,"dialog",!0)){var n="",r=d.AccNameUtil.computeAccessibleName(t);r&&r.name&&r.name.trim().length>0&&(n=r.name.trim());var o=a([],l,!0).filter(function(e){return e.contains(t)&&e!==t});o.length>1&&o.forEach(function(e){var t=d.AccNameUtil.computeAccessibleName(e);t&&t.name&&t.name.trim().length>0&&(n=t.name.trim()+" "+n)});var c=e.getResolvedRole(t);i.push({elem:t,role:c,name:n})}}),n.CacheUtil.setCache(t,"AriaUtil_Landmark_AccNames",i),i)},e.isLandmarkNameUnique=function(t,i,a){void 0===a&&(a=!1);var n,l=e.getLandmarkAccNames(t.ownerDocument);if(!(n="any"===i?l.find(function(e){return e.elem===t}):l.find(function(e){return e.elem===t&&e.role===i})))return null;var r=n.name;if(!a&&""===r)return null;for(var o=0;o<l.length;o++)if(l[o].elem!==t&&r===l[o].name){if("any"===i)return!0;if(l[o].role===i)return!0}return!1},e.hasUniqueAriaLabels=function(t){return e.hasUniqueAriaLabelsLocally(t,!0)},e.hasDuplicateAriaLabelsLocally=function(t,i){if(0===t.length)return!1;var a=t[0].ownerDocument,l=null,r=new Array;i&&(l=n.CacheUtil.getCache(a,"AriaUtil_HAS_UNIQUE_ARIA_LABELS",null)),null===l&&(l={});for(var o=0;o<t.length;++o)if(t[o].hasAttribute)if(t[o].hasAttribute("aria-label")){var s=u.CommonUtil.normalizeSpacing(t[o].getAttribute("aria-label")).toLowerCase();l[s]=!0,s in r||(r[s]=new Array),r[s].push(t[o].nodeName.toLowerCase())}else if(t[o].hasAttribute("aria-labelledby")){for(var d=t[o].getAttribute("aria-labelledby").trim().split(" "),p="",h=0,g=d.length;h<g;++h){var b=d[h],_=c.FragmentUtil.getById(t[o],b);if(_&&!m.DOMUtil.sameNode(_,t[o])){var f=e.getTextContentExcludingScripts(_);p+=u.CommonUtil.normalizeSpacing(f).toLowerCase()}}l[p]=!0,p in r||(r[p]=new Array),r[p].push(t[o].nodeName.toLowerCase())}return i&&n.CacheUtil.setCache(a,"AriaUtil_HAS_UNIQUE_ARIA_LABELS",l),r},e.hasDuplicateAriaLabels=function(t){return e.hasDuplicateAriaLabelsLocally(t,!0)},e.hasUniqueAriaLabelledby=function(e){for(var t=!1,i={},a=0;!t&&a<e.length;++a)if(e[a].hasAttribute&&e[a].hasAttribute("aria-labelledby")&&!u.CommonUtil.isIdReferToSelf(e[a],e[a].getAttribute("aria-labelledby"))){var n=u.CommonUtil.normalizeSpacing(e[a].getAttribute("aria-labelledby"));t=n in i,i[n]=!0}else t=!0;return!t},e.getElementAriaProperty=function(t){var i=n.CacheUtil.getCache(t,"AriaUtil_ElementAriaProperty",null);if(!i){var r=null;if(t.tagName?r=t.tagName.toLowerCase():t.nodeName&&(r=t.nodeName.toLowerCase()),null==(i=l.ARIADefinitions.documentConformanceRequirement[r])){var o=l.ARIADefinitions.documentConformanceRequirementSpecialTags[r];switch(r){case"a":case"area":i=t.hasAttribute("href")?o["with-href"]:o["without-href"];break;case"figure":var s=u.CommonUtil.getChildByTag(t,"figcaption");i=null!==s&&s.length>0?o["child-figcaption"]:o["no-child-figcaption"];break;case"footer":case"header":i=null!==e.getAncestorWithRole(t,"article",!0)||null!==e.getAncestorWithRole(t,"complementary",!0)||null!==e.getAncestorWithRole(t,"navigation",!0)||null!==e.getAncestorWithRole(t,"region",!0)||null!==u.CommonUtil.getAncestor(t,["article","aside","main","nav","section"])?o["des-section-article-aside-main-nav"]:o.other;break;case"img":var d=t.hasAttribute("alt")?t.getAttribute("alt"):null,c=t.hasAttribute("title")?t.getAttribute("title"):null;i=0!==e.getAriaLabel(t).trim().length||null!==d&&d.length>0||null!==c&&c.length>0?o["img-with-accname"]:null!==d?o["img-without-accname-empty-alt"]:o["img-without-accname-no-alt"];break;case"input":if(u.CommonUtil.attributeNonEmpty(t,"type")){var p=t.getAttribute("type").trim().toLowerCase();if(null==(i=o[p]))switch(p){case"checkbox":i=u.CommonUtil.attributeNonEmpty(t,"aria-pressed")?o["checkbox-with-aria-pressed"]:o["checkbox-without-aria-pressed"];break;case"email":i=u.CommonUtil.attributeNonEmpty(t,"list")?o["email-with-list"]:o["email-no-list"];break;case"search":i=u.CommonUtil.attributeNonEmpty(t,"list")?o["search-with-list"]:o["search-no-list"];break;case"tel":i=u.CommonUtil.attributeNonEmpty(t,"list")?o["tel-with-list"]:o["tel-no-list"];break;case"text":i=u.CommonUtil.attributeNonEmpty(t,"list")?o["text-with-list"]:o["text-no-list"];break;case"url":i=u.CommonUtil.attributeNonEmpty(t,"list")?o["url-with-list"]:o["url-no-list"];break;default:i=u.CommonUtil.attributeNonEmpty(t,"list")?o["default-with-list"]:o["default-no-list"]}}else i=u.CommonUtil.attributeNonEmpty(t,"list")?o["text-with-list"]:o["text-no-list"];break;case"li":o=l.ARIADefinitions.documentConformanceRequirementSpecialTags.li,i=t.parentElement&&e.hasRoleInSemantics(t.parentElement,"list")?o["child-of-list-role"]:o["no-child-of-list-role"];break;case"section":var h=e.getAriaLabel(t);i=h&&h.trim().length>0||u.CommonUtil.attributeNonEmpty(t,"title")?o["with-name"]:o["without-name"];break;case"select":o=l.ARIADefinitions.documentConformanceRequirementSpecialTags.select,i=t.hasAttribute("multiple")||u.CommonUtil.attributeNonEmpty(t,"size")&&t.getAttribute("size")>1?o["multiple-attr-size-gt1"]:o["no-multiple-attr-size-gt1"];break;case"summary":o=l.ARIADefinitions.documentConformanceRequirementSpecialTags.summary,i=t.parentElement&&"details"===t.parentElement.nodeName.toLowerCase()&&m.DOMUtil.sameNode(a([],t.parentElement.children,!0).filter(function(e){return"summary"===e.nodeName.toLowerCase()})[0],t)?o["first-summary-of-detail"]:o["no-first-summary-of-detail"];break;case"tbody":case"td":case"tr":i=null!==e.getAncestorWithRole(t,"table",!0)?o["des-table"]:e.getAncestorWithRole(t,"grid",!0)||e.getAncestorWithRole(t,"treegrid",!0)?o["des-grid"]:o["des-other"];break;case"th":var g=u.CommonUtil.getScopeForTh(t);i=null!==e.getAncestorWithRole(t,"table",!0)?"column"===g?o["des-table-column-scope"]:o["des-table-row-scope"]:null!==e.getAncestorWithRole(t,"grid",!0)||null!==e.getAncestorWithRole(t,"treegrid",!0)?"column"===g?o["des-grid-treegrid-column-scope"]:o["des-grid-treegrid-row-scope"]:o["des-other"];break;case"div":var b=t.parentElement;i=null!==b&&"dl"===b.nodeName.toLowerCase()?o["child-dl"]:o["no-child-dl"];break;default:i=l.ARIADefinitions.documentConformanceRequirementSpecialTags.default}}}return n.CacheUtil.setCache(t,"AriaUtil_ElementAriaProperty",i),i||null},e.getAllowedAriaRoles=function(t,i){var a=n.CacheUtil.getCache(t,"AriaUtil_AllowedAriaRoles",null);if(!a){a=[];var l;if(null!=(l=null!=i?i:e.getElementAriaProperty(t))){null!==l.implicitRole&&u.CommonUtil.concatUniqueArrayItemList(l.implicitRole,a),null!==l.validRoles&&u.CommonUtil.concatUniqueArrayItemList(l.validRoles,a);var r=e.getImplicitRole(t);r&&r.length>0&&u.CommonUtil.concatUniqueArrayItemList(l.validRoles,a)}n.CacheUtil.setCache(t,"AriaUtil_AllowedAriaRoles",a)}return a},e.getAllowedAriaAttributes=function(t,i,r){var o=n.CacheUtil.getCache(t,"AriaUtil_AllowedAriaAttributes",null);if(!o){o=[];var s=a([],i,!0),d=t.tagName.toLowerCase(),c=[];l.ARIADefinitions.elementsAllowedDisabled.indexOf(d)>-1&&(o=u.CommonUtil.concatUniqueArrayItem("aria-disabled",o)),l.ARIADefinitions.elementsAllowedRequired.indexOf(d)>-1&&(o=u.CommonUtil.concatUniqueArrayItem("aria-required",o)),l.ARIADefinitions.elementsAllowedReadOnly.indexOf(d)>-1&&(o=u.CommonUtil.concatUniqueArrayItem("aria-readonly",o));var m=null;if(null!=(m=null!=r&&void 0!==r?r:e.getElementAriaProperty(t))){if(null!==m.implicitRole&&(null==s||0===s.length)&&void 0===m.allowAttributesFromImplicitRole)for(var p=0;p<m.implicitRole.length;p++){var h=l.ARIADefinitions.designPatterns[m.implicitRole[p]];if(null!=h){var g=h.props;u.CommonUtil.concatUniqueArrayItemList(g,o),g=e.getRoleRequiredProperties(m.implicitRole[p],t),u.CommonUtil.concatUniqueArrayItemList(g,o),(v=h.prohibitedProps)&&v.length>0&&u.CommonUtil.concatUniqueArrayItemList(v,c),"separator"===m.implicitRole[p]&&u.CommonUtil.isFocusable(t)&&u.CommonUtil.concatUniqueArrayItemList(["aria-disabled","aria-valuenow","aria-valuemax","aria-valuemin","aria-valuetext"],o)}}if(m.globalAriaAttributesValid){var b=l.ARIADefinitions.globalProperties;u.CommonUtil.concatUniqueArrayItemList(b,o)}}for(m&&m.otherRolesForAttributes&&m.otherRolesForAttributes.length>0&&u.CommonUtil.concatUniqueArrayItemList(m.otherRolesForAttributes,s),p=0;null!==s&&p<s.length;p++){var _=l.ARIADefinitions.designPatterns[s[p]];if(null!=_){if(!m||null===m.implicitRole||!m.implicitRole.includes(s[p])||m.implicitRole.includes(s[p])&&void 0===m.allowAttributesFromImplicitRole){var f=_.props;u.CommonUtil.concatUniqueArrayItemList(f,o),f=e.getRoleRequiredProperties(s[p],t),u.CommonUtil.concatUniqueArrayItemList(f,o)}var v;(v=_.prohibitedProps)&&v.length>0&&u.CommonUtil.concatUniqueArrayItemList(v,c),"separator"===s[p]&&u.CommonUtil.isFocusable(t)&&u.CommonUtil.concatUniqueArrayItemList(["aria-disabled","aria-valuemax","aria-valuemin","aria-valuetext"],o)}}if(s.includes("row")&&null==e.getAncestorWithRole(t,"treegrid",!0)){var A=-1;(A=o.indexOf("aria-level"))>-1&&o.splice(A,1),(A=o.indexOf("aria-setsize"))>-1&&o.splice(A,1),(A=o.indexOf("aria-posinset"))>-1&&o.splice(A,1)}if(m&&m.otherAllowedAriaAttributes&&m.otherAllowedAriaAttributes.length>0){for(var w=[],y=0;y<m.otherAllowedAriaAttributes.length;y++)if((R=m.otherAllowedAriaAttributes[y]).includes("=")){var C=R.split("=");t.getAttribute(C[0])===C[1]&&w.push(C[0])}else w.push(R);w.length>0&&u.CommonUtil.concatUniqueArrayItemList(w,o)}if(m&&m.otherDisallowedAriaAttributes&&m.otherDisallowedAriaAttributes.length>0){var k=[];for(y=0;y<m.otherDisallowedAriaAttributes.length;y++){var R;(R=m.otherDisallowedAriaAttributes[y]).includes("=")?(C=R.split("="),t.getAttribute(C[0])===C[1]&&k.push(C[0])):k.push(R)}k.length>0&&u.CommonUtil.concatUniqueArrayItemList(k,c)}o=u.CommonUtil.reduceArrayItemList(c,o),i&&0!==i.length||null!==m.implicitRole||!m.prohibitedAriaAttributesWhenNoImplicitRole||(o=u.CommonUtil.reduceArrayItemList(m.prohibitedAriaAttributesWhenNoImplicitRole,o)),n.CacheUtil.setCache(t,"AriaUtil_AllowedAriaAttributes",o)}return o},e.getConflictOrOverlappingHtmlAttribute=function(e,t,i){var a=l.ARIADefinitions.relatedAriaHtmlAttributes[e.name];if(a){if(!e||0==e.length||!t||0==t.length)return[];var n=[],r=null;if("conflict"===i){if(!a.conflict||0===Object.keys(a.conflict).length)return null;r=a.conflict}else{if("overlapping"!==i)return null;if(!a.overlapping||0===Object.keys(a.overlapping).length)return null;r=a.overlapping}for(var o=!1,s=!1,u=0;u<r.length;u++)for(var d=r[u].ariaAttributeValue,c=r[u].htmlAttributeNames,m=r[u].htmlAttributeValues,p=0;p<t.length;p++){var h=c.indexOf(t[p].name);if(-1!==h){o=!0;var g=null===m||null===m[h]?null:m[h].split(",");null===d?(null===g||g.includes(t[p].value))&&(n.push({result:"Failed",attr:t[p].name}),s=!0):null===g?d===e.value&&(n.push({result:"Failed",attr:t[p].name}),s=!0):("VALUE"===d&&g.includes("VALUE")&&g[0]!==e.value||d===e.value&&g.includes(t[p].value))&&(n.push({result:"Failed",attr:t[p].name}),s=!0)}}return o&&!s&&n.push({result:"Pass",attr:""}),n}return null},e.containsPresentationalChildrenOnly=function(t){var i=e.getRoles(t,!1);if(i&&0!==i.length||(i=e.getImplicitRole(t)),!i||0===i.length)return!1;for(var a=0;null!==i&&a<i.length;a++){var n=l.ARIADefinitions.designPatterns[i[a]];if(null!=n&&!0===n.presentationalChildren)return!0}return!1},e.shouldBePresentationalChild=function(t){for(var i=o.DOMWalker.parentElement(t);i;){if(e.containsPresentationalChildrenOnly(i))return!0;i=r.ARIAMapper.getAriaOwnedBy(i)||o.DOMWalker.parentElement(i)}return!1},e.areRolesDefined=function(e){if(!e||0===e.length)return null;for(var t=l.ARIADefinitions.designPatterns,i=0,a=e;i<a.length;i++)if(!(a[i].toLowerCase()in t))return!1;return!0},e.getInvalidRoles=function(t){var i=e.getUserDefinedRoles(t);if(!i||0===i.length)return null;if(i&&i.includes("generic"))return["generic"];var a=e.getElementAriaProperty(t),n=e.getAllowedAriaRoles(t,a);if(!n||0===n.length)return i;var l=[];if(n.includes("any"))return[];for(var r=0;r<i.length;r++)n.includes(i[r])||l.includes(i[r])||l.push(i[r]);return l},e.getRolesUndefinedByAria=function(t){if(!t)return null;var i=e.getRoles(t,!1),a=[];if(i&&i.length>0)for(var n=l.ARIADefinitions.designPatterns,r=0;r<i.length;r++)i[r]in n||a.push(i[r]);return a},e.getInvalidAriaAttributes=function(t){var i=e.getUserDefinedRoles(t),a=e.areRolesDefined(i);if(null!==a&&!a)return null;var n=[];i&&0!=i.length||(i=e.getImplicitRole(t));var l=e.getUserDefinedAriaAttributes(t),r=e.getElementAriaProperty(t),o=e.getAllowedAriaAttributes(t,i,r);if(l)for(var s=0;s<l.length;s++){var u=l[s].trim().toLowerCase();o.includes(u)||n.includes(u)||n.push(u)}return n},e.getConflictAriaAndHtmlAttributes=function(t){var i=e.getUserDefinedAriaAttributeNameValuePairs(t),a=e.getUserDefinedHtmlAttributeNameValuePairs(t),n=[];if(i&&i.length>0&&a&&a.length>0)for(var l=function(t){var l=e.getConflictOrOverlappingHtmlAttribute(i[t],a,"conflict");if(null===l)return"continue";l.forEach(function(e){"Failed"===e.result&&n.push({ariaAttr:i[t].name,htmlAttr:e.attr})})},r=0;r<i.length;r++)l(r);return n},e.getDeprecatedAriaRoles=function(t){if(!t)return null;var i=e.getRoles(t,!1),a=[];if(i&&i.length>0)for(var n=l.ARIADefinitions.globalDeprecatedRoles,r=0;r<i.length;r++)n.includes(i[r])&&a.push(i[r]);return a},e.getDeprecatedAriaAttributes=function(t){if(!t)return null;var i=t.attributes,a=[];if(i)for(var n=0;n<i.length;n++){var r=i[n].name;"aria-"===r.substring(0,5)&&a.push(r)}if(0===a.length)return[];var o=[],s=l.ARIADefinitions.globalDeprecatedProperties;for(n=0;n<a.length;n++)s.includes(a[n])&&o.push({role:"any",attribute:a[n]});var u=e.getRoles(t,!1);if(u&&u.length>0)for(n=0;n<u.length;n++){var d=l.ARIADefinitions.designPatterns[u[n]];if(d){var c=d.deprecatedProps;if(c&&c.length>0)for(var m=0;m<a.length;m++)c.includes(a[m])&&o.push({role:u[n],attribute:a[m]})}}return o},e.isNodeInGrid=function(t){return null!=e.getAncestorWithRole(t,"grid")},e.navLinkKeywords=["start","next","prev","previous","contents","index"],e.rulesThatHaveToCheckHidden=["RPT_Elem_UniqueId"],e.ariaAttributeRoleDefaults={alert:{"aria-live":"assertive","aria-atomic":"true"},combobox:{"aria-haspopup":"listbox"},listbox:{"aria-orientation":"vertical"},log:{"aria-live":"polite"},menu:{"aria-orientation":"vertical"},menubar:{"aria-orientation":"horizontal"},meter:{"aria-valuemin":"0","aria-valuemax":"100"},option:{"aria-selected":"false"},progressbar:{"aria-valuemin":"0","aria-valuemax":"100"},scrollbar:{"aria-orientation":"vertical","aria-valuemin":"0","aria-valuemax":"100"},separator:{"aria-orientation":"horizontal","aria-valuemin":"0","aria-valuemax":"100"},slider:{"aria-orientation":"horizontal","aria-valuemin":"0","aria-valuemax":"100"},spinbutton:{},status:{"aria-live":"polite","aria-atomic":"true"},tab:{"aria-selected":"false"},tablist:{"aria-orientation":"horizontal"},toolbar:{"aria-orientation":"horizontal"},tree:{"aria-orientation":"vertical"}},e.ariaAttributeGlobalDefaults={"aria-atomic":"false","aria-autocomplete":"none","aria-busy":"false","aria-checked":void 0,"aria-current":"false","aria-disabled":"false","aria-dropeffect":"none","aria-expanded":void 0,"aria-grabbed":void 0,"aria-haspopup":"false","aria-hidden":void 0,"aria-invalid":"false","aria-live":"off","aria-modal":"false","aria-multiline":"false","aria-multiselectable":"false","aria-orientation":void 0,"aria-pressed":void 0,"aria-readonly":"false","aria-required":"false","aria-selected":void 0,"aria-sort":"none"},e.ariaAttributeImplicitMappings={"aria-autocomplete":{form:function(e){return"off"===e.getAttribute("autocomplete")?"none":"both"},input:function(e){return"off"===e.getAttribute("autocomplete")?"none":"both"},select:function(e){return"off"===e.getAttribute("autocomplete")?"none":"both"},textarea:function(e){return"off"===e.getAttribute("autocomplete")?"none":"both"}},"aria-checked":{input:function(e){return e.hasAttribute("indeterminate")?"mixed":""+e.hasAttribute("checked")},menuitem:function(e){return e.hasAttribute("indeterminate")?"mixed":""+e.hasAttribute("checked")},"*":function(e){if(e.hasAttribute("indeterminate"))return"mixed"}},"aria-disabled":{button:function(e){return e.hasAttribute("disabled")?"true":"false"},fieldset:function(e){return e.hasAttribute("disabled")?"true":"false"},input:function(e){return e.hasAttribute("disabled")?"true":"false"},optgroup:function(e){return e.hasAttribute("disabled")?"true":"false"},option:function(e){return e.hasAttribute("disabled")?"true":"false"},select:function(e){return e.hasAttribute("disabled")?"true":"false"},textarea:function(e){return e.hasAttribute("disabled")?"true":"false"}},"aria-expanded":{details:function(e){return e.getAttribute("open")},dialog:function(e){return e.getAttribute("open")}},"aria-multiselectable":{select:function(e){if(e.hasAttribute("multiple"))return"true"}},"aria-placeholder":{input:function(e){return e.getAttribute("placeholder")},textarea:function(e){return e.getAttribute("placeholder")}},"aria-required":{input:function(e){return e.getAttribute("required")},select:function(e){return e.getAttribute("required")},textarea:function(e){return e.getAttribute("required")}}},e}();t.AriaUtil=p},4919(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.CSSUtil=void 0;var a=i(4566),n=i(7139),l=i(7011),r=i(7507),o=i(3864),s=function(){function e(){}return e.selectorMatchesElem=function(e,t){if(!t||0===t.length||""===t.trim())return!1;try{if("function"==typeof e.matches)return e.matches(t);if("function"==typeof e.webkitMatchesSelector)return e.webkitMatchesSelector(t);if("function"==typeof e.msMatchesSelector)return e.msMatchesSelector(t);if("function"==typeof e.matchesSelector)return e.matchesSelector(t);var i=e.ownerDocument||e.document;if(!i)return!1;var a=i.querySelectorAll(t);return Array.from(a).includes(e)}catch(e){return!1}},e.getComputedStyle=function(e,t){return e?e.ownerDocument.defaultView.getComputedStyle(e,t):null},e.getParsedStylesheetRules=function(e){var t=a.CacheUtil.getCache(e,"RPTUtil_ParsedStylesheetRules",null);if(t)return t;for(var i=[],n=0;n<e.styleSheets.length;++n){var l=e.styleSheets[n];try{if(l&&l.cssRules)for(var r=0;r<l.cssRules.length;++r){var o=l.cssRules[r],s=o.selectorText;if(s){var u=s.match(/^(.*)(:[a-zA-Z-]*)$/),d=!!u,c=d?u[1]:s,m=d?u[2]:"";i.push({fullRuleSelector:s,hasPseudoClass:d,selMain:c,selPseudo:m,style:o.style})}}}catch(e){if(!e.toString().includes("Cannot access rules")&&!e.toString().includes("SecurityError:"))throw e}}return a.CacheUtil.setCache(e,"RPTUtil_ParsedStylesheetRules",i),i},e.fillStyle=function(e,t){for(var i=0;i<t.length;++i){if("all"===t[i]&&t[t[i]]){for(var a=0,n=e;a<n.length;a++){var l=n[a];for(var r in l)delete l[r]}break}r=t[i];for(var o=0,s=e;o<s.length;o++){l=s[o];var u=t.getPropertyPriority(r);if(r in l&&l[r].endsWith("!important")){if("important"!==u||l[r].startsWith("inherit")||l[r].startsWith("unset"))continue;l[r]=t[r]+" !important"}else l[r]=t[r]+("important"===u?" !important":"")}}},e.getDefinedStylesInternal=function(t,i,a){for(var n={},l={},r={},o=0,s=a;o<s.length;o++){var u=s[o];l[u]={},r[u]={}}for(var d=e.getParsedStylesheetRules(t.ownerDocument),c=a.includes(":focus"),m=function(n){if(null!==i&&!i.some(function(e){return!!n.style[e]}))return"continue";var o=n.selPseudo,s=n.hasPseudoClass,u=n.selMain;if(c&&":focus"===o&&(u=u.replace(/([ >][^+~ >]+):focus-within/g,"$1")),e.selectorMatchesElem(t,u))for(var d=0,m=a;d<m.length;d++){var p=m[d],h=l[p],g=r[p];s||e.fillStyle([h,g],n.style),o===p&&e.fillStyle([g],n.style)}},p=0,h=d;p<h.length;p++)m(h[p]);for(var g=0,b=a;g<b.length;g++){u=b[g];var _=l[u],f=r[u];if(e.fillStyle([_,f],t.style),""===u)n[u]=_;else{for(var v={},A=Object.keys(f),w=0;w<A.length;w++){var y=A[w];f[y]!==_[y]&&(v[y]=f[y])}n[u]=v}}return n},e.getDefinedStylesMultiple=function(t,i,n){if(!t)return null;var l={},r=null===i?"all":i.slice().sort().join(","),o=a.CacheUtil.getCache(t,"RPTUtil_DefinedStyles",null);o||(o={});var s=o[r],u=[];if(s){for(var d=0,c=n;d<c.length;d++)void 0!==s[g=c[d]]?l[g]=s[g]:u.push(g);if(0===u.length)return l}else s={},u=n;if(u.length>0){for(var m=e.getDefinedStylesInternal(t,i,u),p=0,h=u;p<h.length;p++){var g;l[g=h[p]]=m[g],s[g]=m[g]}o[r]=s,a.CacheUtil.setCache(t,"RPTUtil_DefinedStyles",o)}return l},e.getDefinedStyles=function(t,i,n){if(!t)return null;var l=null===i?"all":i.slice().sort().join(","),r=n||"",o=a.CacheUtil.getCache(t,"RPTUtil_DefinedStyles",null);o||(o={});var s=o[l];if(s||(s={}),void 0!==s[r])return s[r];var u=e.getDefinedStylesInternal(t,i,[r])[r];return s[r]=u,o[l]=s,a.CacheUtil.setCache(t,"RPTUtil_DefinedStyles",o),u},e.getMediaOrientationTransform=function(e){var t=a.CacheUtil.getCache(e,"RPTUtil_MediaOrientationTransforms",null);if(t)return t;for(var i={},n=0;n<e.styleSheets.length;++n){var l=e.styleSheets[n];try{if(l&&l.cssRules)for(var r=0;r<l.cssRules.length;++r){var o=l.cssRules[r];if(4===o.MEDIA_RULE){var s=o;if(s&&s.media)for(var u=s.media,d=0;d<u.length;d++)if(u.item(d)){var c=u.item(d).toLocaleLowerCase(),m=i[c];m||(m={});for(var p=s.cssRules,h=0;h<p.length;++h)if(1===p[h].STYLE_RULE){var g=p[h],b=g.selectorText;if(b){for(var _={},f=g.style,v=0;v<f.length;++v){var A=f[v],w=A.toLocaleLowerCase();if("transform"===w){if("all"===A&&f[A]){_={};break}_[A]=f[A]}else"rotate"===w&&(_[A]=f[A])}Object.keys(_).length>0&&(m[b]=_)}}Object.keys(m).length>0&&(i[c]=m)}}}}catch(e){if(!e.toString().includes("Cannot access rules")&&!e.toString().includes("SecurityError:"))throw e}}return a.CacheUtil.setCache(e,"RPTUtil_MediaOrientationTransforms",i),i},e.getRotationDegree=function(e){var t=0;try{if(!e)return t;for(var i=(e=e.replaceAll(", ",",")).split(" "),a=0;a<i.length;a++){var n=i[a].trim();if(""!==n)if(n.startsWith("rotate3d")){var l=n.indexOf("("),r=n.indexOf(")");if(-1!==l&&-1!==r){var o=n.substring(l+1,r),s=void 0;if(o&&(s=o.split(",")),s&&4===s.length){if(!(d=s[3]))continue;if((d=d.trim()).endsWith("turn")){var u=d.substring(0,d.length-4);u=parseFloat(u),isNaN(u)||(t=360*u)}else d.endsWith("rad")?(u=d.substring(0,d.length-3),u=parseFloat(u),isNaN(u)||(t=180*u/Math.PI)):d.endsWith("deg")&&(u=d.substring(0,d.length-3),u=parseFloat(u),isNaN(u)||(t+=u))}}}else if(n.startsWith("rotate")||n.startsWith("rotateZ")){if(l=n.indexOf("("),r=n.indexOf(")"),-1!==l&&-1!==r){var d;if(!(d=n.substring(l+1,r)))continue;(d=d.trim()).endsWith("turn")?(u=d.substring(0,d.length-4),u=parseFloat(u),isNaN(u)||(t=360*u)):d.endsWith("rad")?(u=d.substring(0,d.length-3),u=parseFloat(u),isNaN(u)||(t=180*u/Math.PI)):d.endsWith("deg")&&(u=d.substring(0,d.length-3),u=parseFloat(u),isNaN(u)||(t+=u))}}else if(n.startsWith("matrix3d")){if(l=n.indexOf("("),r=n.indexOf(")"),-1!==l&&-1!==r&&(o=n.substring(l+1,r),s=null,o&&(s=o.split(",")),null!==s)){var c=Math.atan2(s[4],s[5]);t+=Math.round(Math.round(180*c/Math.PI))}}else n.startsWith("matrix")&&(l=n.indexOf("("),r=n.indexOf(")"),-1!==l&&-1!==r&&(o=n.substring(l+1,r),s=null,o&&(s=o.split(",")),null!==s&&(c=Math.atan2(s[1],s[0]),t+=Math.round(Math.round(180*c/Math.PI)))))}for(;t>=360;)t-=360}catch(e){throw console.log("Cannot retrieve rotation degree: "+e),e}return t},e.getPixelsFromStyle=function(t,i){if(!t)return 0;var a=t.trim().match(/(-?[\d.]+)([a-z%]*)/);if(null===a)return 0;if(""===a[2]||0===a[1])return 0;var n=e.convertValue2Pixels(a[2],a[1],i);return null===n?n:parseFloat(n)},e.convertValue2Pixels=function(e,t,i){if(0===t)return 0;e||(e="px");var a={px:function(e){return e},cm:function(e){return 37.8*e},mm:function(e){return 3.78*e},q:function(e){return.95*e},in:function(e){return 96*e},pc:function(e){return 16*e},pt:function(e){return 1.33*e},rem:function(e){return e*parseFloat(getComputedStyle(i.ownerDocument.documentElement).getPropertyValue("font-size"))},em:function(e){return e*parseFloat(getComputedStyle(i).getPropertyValue("font-size"))},vw:function(e){return e/100*i.ownerDocument.defaultView.innerWidth},vh:function(e){return e/100*i.ownerDocument.defaultView.innerHeight},"%":function(e){return e/100*parseFloat(getComputedStyle(i).getPropertyValue("font-size"))}};return e in a?a[e](t):null},e.isMaterialIconFont=function(t){var i={"Material Icons":"https://fonts.googleapis.com/icon?family=Material+Icons"},a=e.getDefinedStyles(t,["font-family"])["font-family"],n=!1;if(a&&a.split(",")[0].replace(/['"]+/g,"").trim()in i&&(n=!0),!n){var l=t.classList;for(var r in{"material-icons":"https://fonts.googleapis.com/icon?family=Material+Icons"})if(l.contains(r)){n=!0;break}}if(!n)return!1;for(var o=!1,s=t.ownerDocument.styleSheets,u=0;u<s.length;u++)if(s&&s.length>0&&Object.values(i).indexOf(s[u].href)>-1){o=!0;break}return o},e.getWeightNumber=function(e){var t={light:100,bold:700};return parseInt(e)||(e in t?t[e]:400)},e.getFontInPixels=function(t,i){var a=parseFloat(t);if(!a)return{"xx-small":16,"x-small":10,small:13,medium:16,large:18,"x-large":24,"xx-large":32}[t];var n=t.substring((""+a).length);return e.convertValue2Pixels(n,a,i)},e.getCSSStyle=function(e){var t="";if(null===e)return[];if(e.IBM_CSS_THB)return e.IBM_CSS_THB;if("style"===e.nodeName.toLowerCase())void 0!==(t=e.innerText)&&""!==t.trim()||(t=e.textContent);else{if(!e.hasAttribute("style"))return[];t=e.getAttribute("style")}if(null===t||0===t.trim().length)return[];var i=/\s*([^:\s]+)\s*:\s*([^;$}]+)\s*(;|$)/g,a=/\s*([^{]*){([^}]*)}/g;if(-1===(t=t.replace(/(\/\*+(?:(?:(?:[^\*])+)|(?:[\*]+(?!\/)))[*]+\/)|\/\/.*/g," ")).indexOf("{")){for(var n={},l=void 0;null!=(l=i.exec(t));)n[l[1]]=l[2].trim().toLowerCase();var r=[{selector:null,values:n}];return e.IBM_CSS_THB=r,r}r=[],l=void 0;for(var o=void 0;null!=(l=a.exec(t));){n={};for(var s=l[1],u=l[2];null!=(o=i.exec(u));)n[o[1]]=o[2].trim().toLowerCase();r.push({selector:s,values:n})}return e.IBM_CSS_THB=r,r},e.getInlineStatus=function(e){if(!e)return null;var t=getComputedStyle(e);if(!t)return null;var i={inline:!1,text:!1,violation:null};if("inline"!==t.getPropertyValue("display"))return i;i.inline=!0;var a=e.parentElement;if(!a)return i;var l=new r.DOMMapper,o=l.getUnadjustedBounds(e),s=getComputedStyle(a).getPropertyValue("display");if("block"!==s&&"inline-block"!==s)return n.CommonUtil.isInnerTextOnlyEmpty(a)||(i.text=!0),i;function u(e,t){if(e.nodeType===Node.TEXT_NODE)return e.nodeValue&&e.nodeValue.trim().length>0?"yes":"no";if(e.nodeType===Node.ELEMENT_NODE){if("br"===e.nodeName.toLowerCase())return"block";if("inline"===getComputedStyle(e).getPropertyValue("display")){if(n.CommonUtil.isTarget(e)&&o.width<24){var a=l.getUnadjustedBounds(e);return t&&Math.round(o.width/2)+o.left-a.left<24||!t&&Math.round(o.width/2)+o.left-(a.left+a.width)<24?(i.violation=e.nodeName.toLowerCase(),"violation"):"no"}return n.CommonUtil.isInnerTextOnlyEmpty(e)?"no":"yes"}return"block"}return"block"}for(var d=e.nextSibling;d;){if("yes"===(c=u(d,!0))){i.text=!0;break}if("block"===c)break;d=d.nextSibling}for(d=e.previousSibling;d;){var c;if("yes"===(c=u(d,!1))){i.text=!0;break}if("block"===c)break;d=d.previousSibling}return i},e.isTargetBrowserDefault=function(t){if(!t)return!1;var i=l.AriaUtil.getRoles(t,!1);if(i&&i.length>0)return!1;var a=e.getDefinedStyles(t,["line-height","height","width","min-height","min-width","font-size","margin-top","margin-bottom","margin-left","margin-right"]);return!(a["line-height"]||a.height||a.width||a["min-height"]||a["min-width"]||a["font-size"]||a["margin-top"]||a["margin-bottom"]||a["margin-left"]||a["margin-right"])},e.containsCKJ=function(e){return!!e&&e.trim().replace(/(?:[\u4e00-\u9fff\u3400-\u4dbf])+/g,"").length!==e.trim().length},e.getAncestorWithStyles=function(t,i,n){void 0===n&&(n=[]);var l="AriaUtil_AncestorWithStyles_"+JSON.stringify(i)+"_"+JSON.stringify(n),r=a.CacheUtil.getCache(t,l,null);if(null!==r)return"NOT_FOUND"===r?null:r;for(var s=t;null!==s;)if(1===s.nodeType&&"http://www.w3.org/2000/svg"!==s.namespaceURI){var u=e.getDefinedStyles(s,Object.keys(i));for(var d in i){var c=u[d];if(c&&(c=c.split(" ")[0],!n.includes(c))){var m=i[d];if(m.includes("*"))return a.CacheUtil.setCache(t,l,s),s;if(m.includes(c))return a.CacheUtil.setCache(t,l,s),s}}s=o.DOMWalker.parentElement(s)}else s=o.DOMWalker.parentElement(s);return a.CacheUtil.setCache(t,l,"NOT_FOUND"),null},e.getValueUnitPair=function(e){if(!e)return null;if(Number.isInteger(e))return["px",e];var t=parseInt(e);if(isNaN(t))return null;var i=(e=e.trim().toLowerCase()).trim().match(/([a-z]+)$/),a="px";return i&&(a=i[1]),[a,t]},e}();t.CSSUtil=s},4566(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.CacheUtil=void 0;var a=i(3864),n=function(){function e(){}return e.getCache=function(e,t,i){if(e){var a=(9===e.nodeType||e.nodeType,e);return void 0===a.aceCache&&(a.aceCache={}),void 0===a.aceCache[t]&&(a.aceCache[t]=i),a.aceCache[t]}},e.setCache=function(e,t,i){if(e){var a=(9===e.nodeType||e.nodeType,e);return void 0===a.aceCache&&(a.aceCache={}),a.aceCache[t]=i,i}},e.getSetCache=function(e,t,i){if(e){var a=(9===e.nodeType||e.nodeType,e);return void 0===a.aceCache&&(a.aceCache={}),void 0!==a.aceCache[t]&&void 0!==a.aceCache[t]||(a.aceCache[t]=i()),a.aceCache[t]}},e.clearCaches=function(e){var t=0;delete e.ownerDocument.aceCache;var i=new a.DOMWalker(e,!1,e,!0);do{++t,delete i.node.aceCache,i.node.ownerDocument&&delete i.node.ownerDocument.aceCache}while(i.nextNode());return t},e}();t.CacheUtil=n},167(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.ClipPathUtil=void 0;var a=i(4566),n=i(4919),l=function(){function e(){}return e.isNodeVisuallyHiddenByClipPath=function(t){if(!t||1!==t.nodeType)return!1;var i=t,l=a.CacheUtil.getCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",void 0);if(void 0!==l)return l;var r=n.CSSUtil.getComputedStyle(i),o=parseInt(r.width),s=parseInt(r.height),u=r["clip-path"];if(!u||"none"===u.trim()||""===u.trim())return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;var d=(u=u.trim().replace(/\s+/g," ").toLowerCase()).indexOf("inset(");if(-1!==d){var c=u.indexOf("round"),m=u.substring(u.indexOf("(")+1,u.indexOf(")"));if(-1!==c&&(m=u.substring(u.indexOf("(")+1,c)),1===(f=m.trim().split(" ")).length){var p=e.isClippedByInset(i,f[0],f[0],f[0],f[0]);return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",p),p}if(2===f.length)return p=e.isClippedByInset(i,f[0],f[1],f[0],f[1]),a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",p),p;if(3===f.length)return p=e.isClippedByInset(i,f[0],f[1],f[1],f[2]),a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",p),p;if(4===f.length)return p=e.isClippedByInset(i,f[0],f[1],f[2],f[3]),a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",p),p}if(-1!==(d=u.indexOf("rect("))){c=u.indexOf("round"),m=u.substring(u.indexOf("(")+1,u.indexOf(")")),-1!==c&&(m=u.substring(u.indexOf("(")+1,c)),"auto"===(f=m.trim().split(" "))[0]&&(f[0]="0px"),"auto"===f[3]&&(f[3]="0px"),"auto"===f[1]&&(f[1]="100%"),"auto"===f[2]&&(f[2]="100%"),f[2]=Math.max(f[0],f[2]),f[1]=Math.max(f[1],f[3]);var h=parseInt(f[0]);if(isNaN(h))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;if(f[0].endsWith("%"))h=h*s/100;else{if(!(L=n.CSSUtil.getValueUnitPair(h)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;h=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}if(h>=s)return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;var g=parseInt(f[3]);if(isNaN(g))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;if(f[3].endsWith("%"))g=g*o/100;else{if(!(L=n.CSSUtil.getValueUnitPair(g)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;g=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}if(g>=o)return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;var b=parseInt(f[1]);if(isNaN(b))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;if(f[1].endsWith("%"))b=b*o/100;else{if(!(L=n.CSSUtil.getValueUnitPair(b)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;b=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}var _=parseInt(f[2]);if(isNaN(_))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;if(f[2].endsWith("%"))_=_*s/100;else{if(!(L=n.CSSUtil.getValueUnitPair(_)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;_=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}return _-h<=e.THRESHOLD||b-g<=e.THRESHOLD?(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!0),!0):(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1)}if(-1!==(d=u.indexOf("xywh("))){c=u.indexOf("round"),m=u.substring(u.indexOf("(")+1,u.indexOf(")")),-1!==c&&(m=u.substring(u.indexOf("(")+1,c));var f=m.trim().split(" "),v=parseInt(f[0]);if(isNaN(v))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;if(f[0].endsWith("%"))v=v*o/100;else{if(!(L=n.CSSUtil.getValueUnitPair(top)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;v=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}if(v>=o)return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;var A=parseInt(f[1]);if(isNaN(A))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;if(f[1].endsWith("%"))A=A*s/100;else{if(!(L=n.CSSUtil.getValueUnitPair(A)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;scrollY=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}if(A>=s)return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;var w=parseInt(f[2]);if(isNaN(w))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;if(f[2].endsWith("%"))w=w*o/100;else{if(!(L=n.CSSUtil.getValueUnitPair(w)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;w=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}if(w<=e.THRESHOLD)return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!0),!0;var y=parseInt(f[3]);if(isNaN(y))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;if(f[3].endsWith("%"))y=y*s/100;else{if(!(L=n.CSSUtil.getValueUnitPair(y)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;y=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}return y<=e.THRESHOLD?(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!0),!0):(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1)}if(-1!==(d=u.indexOf("circle("))){f=(m=u.substring(u.indexOf("(")+1,u.indexOf(")"))).trim().split(" ");var C=parseInt(f[0]);if(isNaN(C))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;if(f[0].endsWith("%"))C=C*(o>s?s:o)/100;else{if(!(L=n.CSSUtil.getValueUnitPair(C)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;C=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}return C<=e.THRESHOLD?(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!0),!0):(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1)}if(-1!==(d=u.indexOf("ellipse("))){if((f=(m=u.substring(u.indexOf("(")+1,u.indexOf(")"))).trim().split(" ")).length>3&&"closest-side"===f[0]&&"farthest-side"===f[1]&&"at"===f[2]){if(C=parseInt(f[3]),4===f.length){if(f[3].endsWith("%"))C=C*(N=o>s?s:o)/100;else{if(!(L=n.CSSUtil.getValueUnitPair(C)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;C=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}return C<=e.THRESHOLD?(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!0),!0):(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1)}if(5===f.length)for(var k=3;k<f.length;k++){var R=parseInt(f[k]);if(f[k].endsWith("%"))R=R*(N=3===k?o:s)/100;else{if(!(L=n.CSSUtil.getValueUnitPair(R)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;R=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}return R<=e.THRESHOLD?(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!0),!0):(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1)}return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1}var x=u.indexOf("at");if(m=u.substring(u.indexOf("(")+1,u.indexOf(")")),-1!==x&&(m=u.substring(u.indexOf("(")+1,x)),2!==(f=m.trim().split(" ")).length)return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;for(k=0;k<f.length;k++){if(C=parseInt(f[k]),f[k].endsWith("%"))C=C*(N=0===k?o:s)/100;else{if(!(L=n.CSSUtil.getValueUnitPair(C)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;C=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}return C<=e.THRESHOLD?(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!0),!0):(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1)}return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1}if(-1!==(d=u.indexOf("polygon("))){"nonzero"!==(f=(m=u.substring(u.indexOf("(")+1,u.indexOf(")"))).trim().split(","))[0]&&"evenodd"!==f[0]||f.shift(),A=0,v=0;var P=!1,T=!1;for(k=0;k<f.length;k++){var U=f[k].trim().split(" ");if(2!=U.length)return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;for(var I=[0,0],E=0;E<2;E++){var N=parseInt(U[E]);if(isNaN(N))return!1;if(U[E].endsWith("%"))I[E]=0===E?N*o/100:N*s/100;else{var L;if(!(L=n.CSSUtil.getValueUnitPair(U[E])))return!1;I[E]=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}}0===k&&(v=I[0],A=I[1]),Math.abs(I[0]-v)>=e.THRESHOLD&&(P=!0),Math.abs(I[1]-A)>=e.THRESHOLD&&(T=!0)}return P&&T?(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1):(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!0),!0)}return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1},e.isClippedByInset=function(t,i,a,l,r){void 0===a&&(a="0px"),void 0===l&&(l="0px"),void 0===r&&(r="0px");var o=n.CSSUtil.getComputedStyle(t),s=parseInt(o.width),u=parseInt(o.height),d=parseInt(i);if(isNaN(d))return!1;if(i.endsWith("%"))d=d*u/100;else{if(!(h=n.CSSUtil.getValueUnitPair(i)))return!1;d=n.CSSUtil.convertValue2Pixels(h[0],h[1],t)}if(d>u)return!1;var c=parseInt(a);if(isNaN(c))return!1;if(a.endsWith("%"))c=c*s/100;else{if(!(h=n.CSSUtil.getValueUnitPair(a)))return!1;c=n.CSSUtil.convertValue2Pixels(h[0],h[1],t)}if(c>s)return!1;var m=parseInt(l);if(isNaN(m))return!1;if(l.endsWith("%"))m=m*u/100;else{if(!(h=n.CSSUtil.getValueUnitPair(l)))return!1;m=n.CSSUtil.convertValue2Pixels(h[0],h[1],t)}if(m>u)return!1;var p=parseInt(r);if(isNaN(p))return!1;if(r.endsWith("%"))p=p*s/100;else{var h;if(!(h=n.CSSUtil.getValueUnitPair(r)))return!1;p=n.CSSUtil.convertValue2Pixels(h[0],h[1],t)}return!(p>s)&&(u-(d+m)<=e.THRESHOLD||s-(c+p)<=e.THRESHOLD)},e.THRESHOLD=5,e}();t.ClipPathUtil=l},3883(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.ColorObj=t.ColorUtil=void 0;var a=i(3864),n=function(){function e(){}return e.Color=function(t){if(!t)return null;if("transparent"===(t=t.toLowerCase()))return new l(255,255,255,0);if(t in e.CSSColorLookup&&(t=e.CSSColorLookup[t]),t.startsWith("rgb(")){var i=/\s*rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/;return null===(a=t.match(i))?null:new l(a[1],a[2],a[3])}var a;if(t.startsWith("rgba("))return i=/\s*rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(.+)\s*\)/,null===(a=t.match(i))?null:new l(a[1],a[2],a[3],a[4]);if("#"!=t.charAt(0))return null;4===t.length&&(t="#"+t.charAt(1).repeat(2)+t.charAt(2).repeat(2)+t.charAt(3).repeat(2));var n=parseInt(t.substring(1,3),16),r=parseInt(t.substring(3,5),16),o=parseInt(t.substring(5,7),16);return new l(n,r,o)},e.ColorCombo=function(t){try{var i=t.ownerDocument;if(!i)return null;var n=i.defaultView;if(!n)return null;for(var l=[],r=t;r;)1===r.nodeType&&l.push(r),r=a.DOMWalker.parentElement(r);var o={hasGradient:!1,hasBGImage:!1,textShadow:!1,fg:null,bg:null},s=(b=n.getComputedStyle(t)).color;s||(s="black");for(var u=e.Color(s),d=/transparent|rgba?\([^)]+\)/gi,c=function(e,t,i){try{if(void 0===e.length)return e;for(var a=null,n=null,l=1;l<e.length;++l){for(var r=e[l-1],o=i.contrastRatio(e[l-1]),s=.1,u=0;s>1e-4;){for(;u+s<=1&&o>i.contrastRatio(e[l].mix(e[l-1],u+s).getOverlayColor(t));)r=e[l].mix(e[l-1],u+s).getOverlayColor(t),o=i.contrastRatio(r),u+=s;for(;u-s>=0&&o>i.contrastRatio(e[l].mix(e[l-1],u-s).getOverlayColor(t));)r=e[l].mix(e[l-1],u-s).getOverlayColor(t),o=i.contrastRatio(r),u-=s;s/=10}(null===n||n>o)&&(n=o,a=r)}return a}catch(e){console.log(e)}return t},m=e.Color("white"),p=null,h=null,g=null;l.length>0;){var b,_=l.pop();if(null!==(b=n.getComputedStyle(_))){var f=null;if(b.backgroundColor&&"transparent"!=b.backgroundColor&&"rgba(0, 0, 0, 0)"!=b.backgroundColor&&(f=e.Color(b.backgroundColor)),b.backgroundImage&&b.backgroundImage.indexOf&&-1!=b.backgroundImage.indexOf("gradient")){var v=b.backgroundImage.match(d);if(v){for(var A=[],w=0;w<v.length;++w)if(v[w].length){var y=e.Color(v[w]);if(void 0!==y.alpha&&y.alpha<1){var C=g||m;y=y.getOverlayColor(C)}A.push(y)}else v.splice(w--,1);f=c(A,g||m,u)}}null===p||b.opacity&&b.opacity.length>0&&parseFloat(b.opacity)<1?(null!=g&&(g.alpha=p*h,m=g.getOverlayColor(m)),p=1,h=null,g=null,b.opacity&&b.opacity.length>0&&(p=parseFloat(b.opacity)),null!=f&&(h=(g=f).alpha||1,delete g.alpha,1===p&&1===h&&(o.hasBGImage=!1,o.hasGradient=!1))):null!=f&&(null===g?(h=(g=f).alpha||1,delete g.alpha):h=(g=f.getOverlayColor(g)).alpha||1,1===p&&1===h&&1===(g.alpha||1)&&f.alpha),b.backgroundImage&&"none"!=b.backgroundImage&&(b.backgroundImage.indexOf&&-1!=b.backgroundImage.indexOf("gradient")?o.hasGradient=!0:o.hasBGImage=!0)}}return null!=g&&delete(u=u.getOverlayColor(g)).alpha,u.alpha=(u.alpha||1)*p,u=u.getOverlayColor(m),null!=g&&(g.alpha=p*h,m=g.getOverlayColor(m)),o.fg=u,o.bg=m,b.textShadow&&"none"!==b.textShadow&&(o.textShadow=!0),o}catch(e){return null}},e.CSSColorLookup={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",green:"#008000",greenyellow:"#adff2f",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgrey:"#d3d3d3",lightgreen:"#90ee90",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370d8",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#d87093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32",buttontext:"rgba(0, 0, 0, 0.847)",buttonface:"#ffffff",graytext:"rgba(0, 0, 0, 0.247)"},e}();t.ColorUtil=n;var l=function(){function e(e,t,i,a){function n(e){if("string"!=typeof e)return e;var t=e;return"%"!=(t=t.trim())[t.length-1]?parseInt(t):Math.round(2.55*parseFloat(t.substring(0,t.length-1)))}this.red=n(e),this.green=n(t),this.blue=n(i),void 0!==a&&(this.alpha="string"==typeof a?parseFloat(a):a)}return e.prototype.toHexHelp=function(e){var t=Math.round(e).toString(16);return 1===t.length?"0"+t:t},e.prototype.toHex=function(){return"#"+this.toHexHelp(this.red)+this.toHexHelp(this.green)+this.toHexHelp(this.blue)},e.prototype.contrastRatio=function(e){var t=this;void 0!==this.alpha&&(t=this.getOverlayColor(e));var i=t.relativeLuminance();if(!e.relativeLuminance){var a="";for(var n in e)a+=n+"\n";alert(e),alert(a)}var l=e.relativeLuminance();return i>l?(i+.05)/(l+.05):(l+.05)/(i+.05)},e.prototype.relativeLuminance=function(){var e=this.red/255,t=this.green/255,i=this.blue/255;return.2126*(e=e<=.04045?e/12.92:Math.pow((e+.055)/1.055,2.4))+.7152*(t=t<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4))+.0722*(i<=.04045?i/12.92:Math.pow((i+.055)/1.055,2.4))},e.prototype.mix=function(t,i){if(void 0===this.alpha&&void 0===t.alpha)return new e(i*this.red+(1-i)*t.red,i*this.green+(1-i)*t.green,i*this.blue+(1-i)*t.blue);var a=this.alpha?this.alpha:1,n=t.alpha?t.alpha:1;return new e(i*this.red+(1-i)*t.red,i*this.green+(1-i)*t.green,i*this.blue+(1-i)*t.blue,i*a+(1-i)*n)},e.prototype.getOverlayColor=function(e){if(void 0===this.alpha||this.alpha>=1)return this;if(this.alpha<0)return null;if(void 0!==e.alpha&&e.alpha<1)return null;var t=this.mix(e,this.alpha);return delete t.alpha,t},e.fromCSSColor=function(t){var i=-1,a=-1,l=-1;if((t=t.toLowerCase()).startsWith("rgb(")){var r=/\s*rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/;if(null===(o=t.match(r)))return null;i=o[1],a=o[2],l=o[3]}else if(t.startsWith("rgba(")){var o;if(r=/\s*rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(.+)\s*\)/,null===(o=t.match(r)))return null;i=o[1],a=o[2],l=o[3]}else{if("#"!=t.charAt(0)){if(!(t in n.CSSColorLookup))return null;t=n.CSSColorLookup[t]}var s=function(e){for(var t={a:10,b:11,c:12,d:13,e:14,f:15},i=0,a=0;a<e.length;++a)i=16*i+parseInt(e.charAt(a)in t?t[e.charAt(a)]:e.charAt(a));return i};4===t.length&&(t="#"+t.charAt(1).repeat(2)+t.charAt(2).repeat(2)+t.charAt(3).repeat(2)),i=s(t.substring(1,3)),a=s(t.substring(3,5)),l=s(t.substring(5,7))}return new e(i,a,l)},e}();t.ColorObj=l},7139(e,t,i){var a=this&&this.__spreadArray||function(e,t,i){if(i||2===arguments.length)for(var a,n=0,l=t.length;n<l;n++)!a&&n in t||(a||(a=Array.prototype.slice.call(t,0,n)),a[n]=t[n]);return e.concat(a||Array.prototype.slice.call(t))};Object.defineProperty(t,"__esModule",{value:!0}),t.CommonUtil=void 0;var n=i(9910),l=i(4566),r=i(7011),o=i(1950),s=i(3946),u=i(1686),d=i(3864),c=i(5279),m=function(){function e(){}return e.wordCount=function(e){return 0===(e=e.trim()).length?0:e.split(/\s+/g).length},e.isTabbable=function(t){if(!s.VisUtil.isNodeVisible(t))return!1;if(t.hasAttribute("inert")||u.DOMUtil.getAncestorWithAttribute(t,"inert",""))return!1;if(t.hasAttribute("tabindex"))return parseInt(t.getAttribute("tabindex"))>=0;var i=t.nodeName.toLowerCase();if(i in e.tabTagMap){var a=e.tabTagMap[i];return"function"==typeof a&&(a=a(t)),a}return!!t.hasAttribute("contenteditable")},e.isFocusable=function(t){return"undefined"!==t&&null!==t&&e.isTabbable(t)},e.isClickable=function(t){if(!s.VisUtil.isNodeVisible(t))return!1;var i=t.nodeName.toLowerCase();if(i in e.tabTagMap){var a=e.tabTagMap[i];return"function"==typeof a&&(a=a(t)),a}return!(!r.AriaUtil.isWidget(t)||!t.hasAttribute("tabindex"))},e.isTableDescendant=function(e){return e?e.aria.filter(function(e){return["table","grid","treegrid"].includes(e.role)}):null},e.tabIndexLEZero=function(t){if(e.hasAttribute(t,"tabindex")&&t.getAttribute("tabindex").match(/^-?\d+$/)){var i=parseInt(t.getAttribute("tabindex"));return 0===i||-1===i}return!1},e.getTabbableChildren=function(t){var i=0;if(t.firstChild||"IFRAME"===t.nodeName.toUpperCase())for(var a=new d.DOMWalker(t);a.nextNode()&&a.node!=t;)1==a.node.nodeType&&!a.bEndTag&&e.isTabbable(a.node)&&++i;return i},e.normalizeSpacing=function(e){return e?e.trim().replace(/\s+/g," "):""},e.isHtmlEquiv=function(e,t){var i=!1;if(e&&"input"===e.nodeName.toLowerCase()){var a=e.getAttribute("type").toLowerCase();a&&(-1!=t.indexOf("checkbox")?i="checkbox"===a:-1!=t.indexOf("radio")&&(i="radio"===a))}return i},e.nonExistantIDs=function(t,i){var a="";if(e.normalizeSpacing(i).length<1)return a;for(var n=i.split(" "),l=t.ownerDocument,r=0;r<n.length;r++){var o="//*[@id='"+n[r]+"']";l.evaluate(o,t,l.defaultNSResolver,0,null).iterateNext()||(a+=n[r]+", ")}return e.normalizeSpacing(a).length>=2?a.substring(0,a.length-2):""},e.getDocElementsByTag=function(e,t){var i=c.FragmentUtil.getOwnerFragment(e);t=t.toLowerCase();var a=l.CacheUtil.getCache(i,"RPT_DOCELEMSBYTAG",{});return t in a||(a[t]=i.querySelectorAll(t),l.CacheUtil.setCache(i,"RPT_DOCELEMSBYTAG",a)),a[t]},e.getChildByTag=function(t,i){return e.getChildByTagHidden(t,i,!1,!1)},e.getChildByTagHidden=function(t,i,a,n){for(var l=[],r=t.firstChild;null!=r;){if(r.nodeName.toLowerCase()===i){if((a||n&&!e.shouldCheckHiddenContent(r))&&!s.VisUtil.isNodeVisible(r)){r=r.nextSibling;continue}l.push(r)}r=r.nextSibling}return l},e.getElementsByRole=function(t,i){return e.getElementsByRoleHidden(t,i,!1,!1)},e.getElementsByRoleHidden=function(t,i,a,n){var o=null;if(null===(o=n?l.CacheUtil.getCache(t,"AriaUtil_GETELEMENTSBY_ROLE_IMPLICIT",null):l.CacheUtil.getCache(t,"AriaUtil_GETELEMENTSBY_ROLE",null))){o={};for(var s=t.body;null!==d.DOMWalker.parentNode(s);)s=d.DOMWalker.parentNode(s);for(var u=new d.DOMWalker(s);u.nextNode();)if(u.elem()&&!u.bEndTag){var c=[];if(u.elem()&&u.elem().hasAttribute("role")&&(c=u.elem().getAttribute("role").split(" ")),u.elem()&&0===c.length&&n){var m=r.AriaUtil.getImplicitRole(u.node);null!==m&&m.length>0&&(c=m)}if(0===c.length)continue;if(a&&e.shouldNodeBeSkippedHidden(u.node))continue;for(var p=0;p<c.length;++p)c[p]in o||(o[c[p]]=[]),o[c[p]].push(u.node)}n?l.CacheUtil.setCache(t,"AriaUtil_GETELEMENTSBY_ROLE_IMPLICIT",o):l.CacheUtil.setCache(t,"AriaUtil_GETELEMENTSBY_ROLE",o)}var h=[];if("string"==typeof i){var g=i;(i=[]).push(g)}if(i.length)for(p=0;p<i.length;++p){var b=o[i[p]];if(b)for(var _=0;_<b.length;++_)h.push(b[_])}return h},e.isTarget=function(t){if(!t||1!==t.nodeType||["html","body"].includes(t.nodeName.toLowerCase())||null!==e.getAncestor(t,["svg","pre","code","script","meta","head"])||!s.VisUtil.isNodeVisible(t)||s.VisUtil.isNodeVisuallyHidden(t)||e.isNodeDisabled(t)||s.VisUtil.isElementOffscreen(t))return!1;if(e.isClickable(t))return!0;var i=r.AriaUtil.getResolvedRole(t);if(!i)return!1;if(["listitem","menuitem","menuitemcheckbox","menuitemradio","option","radio","switch","treeitem"].includes(i)){var a=t.parentElement;if(a&&"group"===r.AriaUtil.getResolvedRole(a)&&(a=a.parentElement),a&&e.isTarget(a))return!0}return!1},e.getFileExt=function(e){var t=e.match(/\.(([^;?#\.]|^$)+)([;?#]|$)/);return null!=t&&t.length>=2?"."+t[1]:""},e.getFileAnchor=function(e){var t=e.match(/#(([^;?\.]|^$)+)([;?]|$)/);return null!=t&&t.length>=2?t[1]:""},e.checkObjEmbed=function(t,i,a){var n=t.nodeName.toLowerCase();if("object"!=n&&"embed"!=n&&"a"!=n&&"area"!=n)return!1;var l=!1;if(!l&&t.hasAttribute("type")&&(l=a(t.getAttribute("type").toLowerCase())),!l&&t.hasAttribute("codetype")&&(l=a(t.getAttribute("codetype"))),!l){var r="";"embed"===n?r=t.getAttribute("src"):"a"===n||"area"===n?r=t.getAttribute("href"):t.hasAttribute("data")&&(r=t.getAttribute("data")),null===r&&(r=""),l=i(e.getFileExt(r))}if(!l&&"object"===n)for(var o=e.getChildByTagHidden(t,"param",!1,!0),s=0;!l&&null!=o&&s<o.length;++s)l=o[s].hasAttribute("value")&&i(e.getFileExt(o[s].getAttribute("value")));return l},e.isAudioObjEmbedLink=function(t){return e.checkObjEmbed(t,e.isAudioExt,function(e){return e.startsWith("audio")})},e.isAudioExt=function(t){return e.valInArray(t.toLowerCase(),[".aif",".aifc",".aiff",".air",".asf",".au",".cda",".dsm",".dss",".dwd",".iff",".kar",".m1a",".med",".mp2",".mp3",".mpa",".pcm",".ra",".ram",".rm",".sam",".sf",".sf2",".smp",".snd",".svx",".ul",".voc",".wav",".wma",".wve"])},e.isVideoObjEmbedLink=function(t){return e.checkObjEmbed(t,e.isVideoExt,function(e){return e.startsWith("video")||e.startsWith("application/x-shockwave-flash")})},e.isVideoExt=function(t){return e.valInArray(t.toLowerCase(),[".asf",".avi",".divx",".dv",".m1v",".m2p",".m2v",".moov",".mov",".mp4",".mpeg",".mpg",".mpv",".ogm",".omf",".qt",".rm",".rv",".smi",".smil",".swf",".vob",".wmv",".rmvb",".mvb"])},e.isImageObjEmbedLink=function(t){return e.checkObjEmbed(t,e.isImgExt,function(e){return e.startsWith("image")})},e.isImgExt=function(t){return e.valInArray(t.toLowerCase(),e.image_extensions)},e.isHtmlExt=function(t){return e.valInArray(t.toLowerCase(),[".asp",".aspx",".cfm",".cfml",".cgi",".htm",".html",".shtm",".shtml",".php",".pl",".py",".shtm",".shtml",".xhtml"])},e.hasTriggered=function(e,t){return l.CacheUtil.getCache(e,t,!1)},e.triggerOnce=function(e,t,i){if(i)return!0;var a=l.CacheUtil.getCache(e,t,!1);return l.CacheUtil.setCache(e,t,!0),a},e.valInArray=function(e,t){for(var i in t)if(t[i]===e)return!0;return!1},e.getAncestor=function(e,t){for(var i=e;null!==i;){var a=i.nodeName.toLowerCase();if("string"==typeof t){if(a===t.toLowerCase())break}else if(t.length){for(var n in t)if(t[n]===a)return i}else if(a in t)break;i=d.DOMWalker.parentNode(i)}return i},e.isSibling=function(e,t){if(e&&t){var i=null;for(d.DOMWalker.parentNode(e)&&d.DOMWalker.parentNode(e).firstChild&&(i=d.DOMWalker.parentNode(e).firstChild);i;){if(i===t)return!0;i=i.nextSibling}}return!1},e.isDescendant=function(e,t){for(var i=d.DOMWalker.parentNode(t);null!=i;){if(i===e)return!0;i=d.DOMWalker.parentNode(i)}return!1},e.isDisabledByFirstChildFormElement=function(t){var i=["input","textarea","select","keygen","progress","meter","output"];if(null!=t.firstChild)for(var a=new d.DOMWalker(t);a.nextNode();)if(i.includes(a.node.nodeName.toLowerCase()))return!!e.isNodeDisabled(a.node);return!1},e.isDisabledByReferringElement=function(t){for(var i=t.getAttribute("id"),a=t.ownerDocument.body;null!==d.DOMWalker.parentNode(a);)a=d.DOMWalker.parentNode(a);for(var n=new d.DOMWalker(a);n.nextNode();)if(n.node&&1===n.node.nodeType&&n.elem()&&(n.elem().getAttribute("aria-describedby")||"").split(" ").includes(i)&&e.isNodeDisabled(n.node))return!0},e.getInputLabel=function(t){return e.getLabelForElement(t)},e.getLabelForElement=function(t){return e.getLabelForElementHidden(t,!1)},e.getLabelForElementHidden=function(t,i){var a=t.getRootNode();if(!l.CacheUtil.getCache((a.nodeType,a),"AriaUtil_LABELS",null)){for(var n={},r=e.getDocElementsByTag(t,"label"),o=0;o<r.length;++o)if(r[o].hasAttribute("for")){if(i&&!s.VisUtil.isNodeVisible(r[o]))continue;n[r[o].getAttribute("for")]=r[o]}l.CacheUtil.setCache((a.nodeType,a),"AriaUtil_LABELS",n)}if(t.hasAttribute("id")){var u=t.getAttribute("id");if(u.trim().length>0)return l.CacheUtil.getCache((a.nodeType,a),"AriaUtil_LABELS",{})[u]}return null},e.getElementAttribute=function(e,t){if(!(t&&e&&e.hasAttribute&&e.hasAttribute(t)))return null;var i=e.getAttribute(t);if(!n.ARIADefinitions.referenceProperties.includes(t))return i;for(var a=i.split(/ +/g),l=!1,r=0;a<a.length;++r){var o=document.getElementById(a[r]);if(o&&!u.DOMUtil.sameNode(o,e)){l=!0;break}}return l?i:null},e.hasImplicitLabel=function(t){var i=e.getAncestor(t,"label");if(i&&"label"===i.tagName.toLowerCase()&&e.isFirstFormElement(i,t)){var a=i.cloneNode(!0);return a=e.removeAllFormElementsFromLabel(a),e.hasInnerContentHidden(a)}return!1},e.getImplicitLabel=function(t){var i=e.getAncestor(t,"label");if(i&&"label"===i.tagName.toLowerCase()&&e.isFirstFormElement(i,t)){var a=i.cloneNode(!0);a=e.removeAllFormElementsFromLabel(a);var n=e.getInnerText(a);return n&&""!==n.trim()?n.trim():null}return null},e.getFormFieldLabel=function(t){var i="",a=null,n=e.getLabelForElementHidden(t,!0);if(n)a=n.innerText;else{if(!(n=e.getAncestor(t,"label"))||"label"!==n.tagName.toLowerCase()||!e.isFirstFormElement(n,t))return null;var l=n.cloneNode(!0);l=e.removeAllFormElementsFromLabel(l),a=e.getInnerText(l)}return a&&""!==a.trim()&&(i+=a.trim()),(a=e.getLabelTextFromAttribute(n,!0))&&""!==a.trim()&&(i+=a.trim()),(a=r.AriaUtil.getAriaLabel(n))&&""!==a.trim()&&(i+=a.trim()),i.trim()},e.getLabelTextFromAttribute=function(t,i){for(var a=null,n=0;n<t.children.length;n++){var l=t.children.item(n);if(e.form_labelable_elements.includes(l.nodeName.toLowerCase())){a=l;break}}for(var c=new d.DOMWalker(t),m="";c.nextNode()&&c.node!==t;)if(c.node&&1===c.node.nodeType&&c.elem()){var p=c.elem();if(i&&(s.VisUtil.isNodeHiddenFromAT(p)||s.VisUtil.isNodePresentational(p))||a&&a.contains(p))continue;var h=r.AriaUtil.getResolvedRole(p);if("textbox"===h){var g=p.getAttribute("value");g&&g.trim().length>0&&(m+=" "+g.trim())}else if("combobox"===h||"listbox"===h){var b=p.getAttribute("aria-activedescendant")||p.getAttribute("aria-selected")||p.getAttribute("aria-checked");if(b){var _=p.ownerDocument.getElementById(b);if(_&&!u.DOMUtil.sameNode(p,_)){var f=o.AccNameUtil.computeAccessibleName(_);f&&f.name&&(m+=" "+f.name.trim())}}}else if(["progressbar","scrollbar","slider","spinbutton","meter"].includes(h)){var v=p.getAttribute("aria-valuetext");v&&v.trim().length>0&&(m+=" "+v.trim()),(v=p.getAttribute("aria-valuenow"))&&v.trim().length>0&&(m+=" "+v.trim()),(v=p.getAttribute("value"))&&v.trim().length>0&&(m+=" "+v.trim())}var A=r.AriaUtil.getAriaLabel(p);A&&""!==A.trim()&&(m+=" "+A.trim())}return m.trim()},e.isFirstFormElement=function(t,i){if(null!=t.firstChild)for(var a=new d.DOMWalker(t);a.nextNode();)if(-1!==e.form_labelable_elements.indexOf(a.node.nodeName.toLowerCase()))return a.node===i;return!1},e.isShadowHostElement=function(t){if(e.isShadowElement(t))return!1;for(var i=t;i;){if(i.shadowRoot)return!0;i=d.DOMWalker.parentElement(i)}return!1},e.isShadowElement=function(e){return"[object ShadowRoot]"===e.getRootNode().toString()},e.removeAllFormElementsFromLabel=function(e){for(var t=["input","textarea","select","button","datalist","optgroup","option","keygen","output","progress","meter"],i=e.childNodes,a=0;a<i.length;a++)t.indexOf(i[a].nodeName.toLowerCase())>-1&&e.removeChild(i[a]);return e},e.isIdReferToSelf=function(e,t){if(!t||""===t.trim())return!1;for(var i=t.trim().split(" "),a=0,n=i.length;a<n;++a){var l=c.FragmentUtil.getById(e,i[a]);if(l&&u.DOMUtil.sameNode(l,e))return!0}return!1},e.nodeDepth=function(e){for(var t=0,i=e;null!==i;)i=d.DOMWalker.parentNode(i),t+=1;return t},e.compareNodeOrder=function(t,i){if(t===i)return 0;var a=e.nodeDepth(t),n=e.nodeDepth(i);if(n>a){for(var l=0;l<n-a;++l)i=d.DOMWalker.parentNode(i);if(t===i)return-2}else if(a>n){for(l=0;l<a-n;++l)t=d.DOMWalker.parentNode(t);if(t===i)return 2}for(;null!=t&&null!=i&&d.DOMWalker.parentNode(t)!=d.DOMWalker.parentNode(i);)t=d.DOMWalker.parentNode(t),i=d.DOMWalker.parentNode(i);if(null===t||null===i||d.DOMWalker.parentNode(t)!=d.DOMWalker.parentNode(i))return null;for(;null!=i&&i!=t;)i=i.previousSibling;return null===i?1:-1},e.attributeNonEmpty=function(e,t){return e.hasAttribute(t)&&e.getAttribute(t).trim().length>0},e.getFrameByName=function(e,t){for(var i=[e.ownerDocument.defaultView],a=0;a<i.length;){try{if(i[a].name===t)return i[a];for(var n=0;n<i[a].frames.length;++n)try{i[a].frames[n]&&!i.includes(i[a].frames[n])&&i.push(i[a].frames[n])}catch(e){}}catch(e){}++a}return null},e.defaultNSResolver=function(e){var t;switch(e){case"html":t="http://www.w3.org/1999/xhtml";case"x2":t="http://www.w3.org/TR/xhtml2";case"x":t="http://www.w3.org/1999/xhtml";case"xhtml":t="http://www.w3.org/1999/xhtml";default:t=null}return t},e.isInnerTextOnlyEmpty=function(t){var i=t.innerText;null!=i&&0!==i.trim().length||"slot"===t.nodeName.toLowerCase()||void 0===t.textContent||(i=t.textContent);var a=!(null!==i&&i.trim().length>0);if(1===t.nodeType&&"slot"===t.nodeName.toLowerCase())for(var n=0,l=t.assignedNodes();n<l.length;n++){var r=l[n];a=a&&e.isInnerTextEmpty(r)}return a},e.getInnerText=function(e){var t=e.innerText;return null!=t&&""!==t.trim()||(t=e.textContent),t},e.getOnScreenInnerText=function(t){if(!t)return null;if(3===t.nodeType)return t.nodeValue();for(var i="",a=new d.DOMWalker(t);a.nextNode()&&a.node!==t&&a.node!==t.parentNode;)if(!a.bEndTag){if(1===a.node.nodeType&&(s.VisUtil.hiddenByDefaultElements.includes(a.node.nodeName.toLowerCase())||!s.VisUtil.isNodeVisible(a.node)||s.VisUtil.isElementOffscreen(a.node))){if("title"===a.node.nodeName.toLowerCase()&&e.getAncestor(a.node,"svg"))continue;if(a.node.nextSibling){3===a.node.nextSibling.nodeType&&a.node.nextSibling.nodeValue&&""!==a.node.nextSibling.nodeValue.trim()&&(i+=" "+a.node.nextSibling.nodeValue.trim()),a.node=a.node.nextSibling;continue}break}3===a.node.nodeType&&a.node.nodeValue&&""!==a.node.nodeValue.trim()&&(i+=" "+a.node.nodeValue.trim())}return i.trim()},e.getNodeText=function(e){if(!e)return"";for(var t="",i=e.childNodes,a=0;a<i.length;++a)3==i[a].nodeType&&(t+=i[a].nodeValue);return t},e.isInnerTextEmpty=function(t){var i=e.getInnerText(t);return!(null!=i&&i.trim().length>0)},e.hasInnerContent=function(t){var i=e.getInnerText(t),a=null!==i&&i.trim().length>0;if(null!==t.firstChild)for(var n=new d.DOMWalker(t);!a&&n.nextNode();)a="img"===n.node.nodeName.toLowerCase()&&e.attributeNonEmpty(n.node,"alt");return a},e.hasInnerContentHidden=function(t){return e.hasInnerContentHiddenHyperLink(t,!1)},e.svgHasName=function(t){return e.attributeNonEmpty(t,"aria-label")||e.attributeNonEmpty(t,"aria-labelledby")||!!t.querySelector(":scope > title")},e.hasInnerContentHiddenHyperLink=function(t,i){if(!t)return!1;var a=!1;if(null!=t.firstElementChild)for(var n=new d.DOMWalker(t);!a&&n.nextNode()&&n.node!=t;){var l=n.node;if(!((a="img"===l.nodeName.toLowerCase()&&(e.attributeNonEmpty(l,"alt")||e.attributeNonEmpty(l,"title"))&&!s.VisUtil.isNodeHiddenFromAT(l)&&!s.VisUtil.isNodePresentational(l)||"svg"===l.nodeName.toLowerCase()&&e.svgHasName(l))||1!==l.nodeType||s.VisUtil.isNodeHiddenFromAT(l)||s.VisUtil.isNodePresentational(l)||(a=!e.isInnerTextOnlyEmpty(l))||!0!==i)){a=e.attributeNonEmpty(l,"aria-label")||e.attributeNonEmpty(l,"aria-labelledby");var r=l.ownerDocument;if(r){var o=r.defaultView;if(o){var u=o.getComputedStyle(l);a||null==u||(a=(u.backgroundImage&&u.backgroundImage.indexOf||u.content)&&e.attributeNonEmpty(l,"alt"))}}}3===l.nodeType&&d.DOMWalker.parentElement(l)===t&&(a=!e.isInnerTextEmpty(l))}else a=!e.isInnerTextEmpty(t);return a},e.hasInnerContentOrAlt=function(t){var i=e.getInnerText(t),a=null!=i&&i.trim().length>0||e.attributeNonEmpty(t,"alt");if(null!=t.firstChild)for(var n=new d.DOMWalker(t);!a&&n.nextNode()&&n.node!=t;)!(a="img"===n.node.nodeName.toLowerCase()&&e.attributeNonEmpty(n.node,"alt"))&&(r.AriaUtil.hasRole(n.node,"button",!0)||r.AriaUtil.hasRole(n.node,"textbox"))&&(r.AriaUtil.hasAriaLabel(n.node)||e.attributeNonEmpty(n.node,"title")||e.getLabelForElementHidden(n.elem(),!0))&&(a=!0);return a},e.concatUniqueArrayItem=function(e,t){return-1===t.indexOf(e)&&null!==e&&t.push(e),t},e.concatUniqueArrayItemList=function(t,i){for(var a=0;null!==t&&a<t.length;a++)i=e.concatUniqueArrayItem(t[a],i);return i},e.reduceArrayItemList=function(e,t){return t&&t.length>0&&e&&e.length>0?t.filter(function(t){return!e.includes(t)}):t},e.getScopeForTh=function(e){if(e.hasAttribute("scope")){var t=e.getAttribute("scope").toLowerCase();if("row"===t||"rowgroup"===t)return"row";if("col"===t||"colgroup"===t)return"column"}var i=a([],e.parentElement.children,!0).filter(function(e){return 1===e.nodeType&&"th"!=e.tagName.toLowerCase()});return null===i||0===i.length?"column":"row"},e.getControlOfLabel=function(t){var i=e.getAncestor(t,"label");if(i&&i.hasAttribute("for"))return c.FragmentUtil.getById(t,i.getAttribute("for"));for(var a={},n=t;n;){if(1===n.nodeType){var r=n;r.hasAttribute("id")&&(a[r.getAttribute("id")]=!0)}n=d.DOMWalker.parentNode(n)}if(0===Object.keys(a).length)return null;for(var o=1===t.nodeType?t.getAttribute("aria-labelledby"):null,s=l.CacheUtil.getSetCache(t.ownerDocument,"CommonUtil::getControlOfLabel",function(){return t.ownerDocument.querySelectorAll("*[aria-labelledby]")}),u=0;u<s.length;++u)for(var m=s[u],p=0,h=m.getAttribute("aria-labelledby").split(" ");p<h.length;p++)if(h[p]in a&&!e.isIdReferToSelf(t,o))return m;return null},e.isNodeDisabled=function(t){var i=l.CacheUtil.getCache(t,"PT_NODE_DISABLED",void 0);if(void 0!==i)return i;i=!1,3===t.nodeType&&(t=d.DOMWalker.parentNode(t));var a=t.nodeName.toLowerCase(),r=t.hasAttribute("disabled"),o=i,s=t.hasAttribute("aria-disabled")&&"true"===t.getAttribute("aria-disabled");if(o||r&&n.ARIADefinitions.elementsAllowedDisabled.indexOf(a)>-1||s)return i=!0,l.CacheUtil.setCache(t,"PT_NODE_DISABLED",i),!0;var u=d.DOMWalker.parentNode(t);if(null!=u&&1===u.nodeType){var c=e.isNodeDisabled(u);return c&&(i=!0),l.CacheUtil.setCache(t,"PT_NODE_DISABLED",i),c}return!1},e.shouldCheckHiddenContent=function(e){return!1},e.shouldNodeBeSkippedHidden=function(t){return!e.shouldCheckHiddenContent(t)&&!s.VisUtil.isNodeVisible(t)},e.isfocusableByDefault=function(t){return!("a"!==t.nodeName.toLowerCase()||!e.hasAttribute(t,"href"))||!("area"!==t.nodeName.toLowerCase()||!e.hasAttribute(t,"href"))||-1!==["input","select","button","textarea","option","area"].indexOf(t.nodeName.toLowerCase())},e.nonTabableChildCheck=function(t){if(!t.hasAttribute("tabindex")||-1!=parseInt(t.getAttribute("tabindex")))return!1;for(var i=new d.DOMWalker(t);i.nextNode();){var a=i.elem();if(null!==a&&a.hasAttribute("tabindex")&&-1!=parseInt(a.getAttribute("tabindex"))&&!e.hasInnerContent(a))return!1}return!0},e.hasAttribute=function(e,t){var i=!1;if(e.hasAttribute)i=e.hasAttribute(t);else if(e.attributes&&e.attributes.getNamedItem){var a=e.attributes.getNamedItem(t);i=a&&a.specified}return i},e.truncateText=function(e,t){return void 0===t&&(t=150),e&&(e=e.trim()).length>t?e.substring(0,t-1)+"...":e},e.input_type_with_placeholder=["text","search","tel","url","email","password","number"],e.input_text_types=["text","file","password","checkbox","radio","search","tel","url","email","date","number","range","time","color"],e.input_time_types=["date","month","week","time","datetime-local"],e.input_other_types=["range","color","checkbox","radio","file","image"],e.form_button_types=["button","reset","submit"],e.form_labelable_elements=["input","textarea","select","keygen","progress","meter","output","button"],e.tabTagMap={button:function(e){return!e.hasAttribute("disabled")},iframe:!0,input:function(e){if(e.hasAttribute("disabled")||"hidden"===e.getAttribute("type"))return!1;if("radio"===e.getAttribute("type")){var t=e.getAttribute("name");if(!t||0===t.trim().length)return!0;var i=e.ownerDocument.querySelectorAll("input[type='radio'][name='"+t.trim()+"']");if(0===i.length||1===i.length)return!0;for(var a=null,n=0;n<i.length;n++)i[n].checked&&(a=i[n]);return null!==a?!!u.DOMUtil.sameNode(a,e):!!u.DOMUtil.sameNode(i[0],e)}return!0},select:function(e){return!e.hasAttribute("disabled")},textarea:function(e){return!e.hasAttribute("disabled")&&"hidden"!==e.getAttribute("type")},a:function(e){return e.hasAttribute("href")},area:function(e){return e.hasAttribute("href")},audio:function(e){return e.hasAttribute("controls")},video:function(e){return e.hasAttribute("controls")},summary:function(e){return e.parentElement&&"details"===e.parentElement.nodeName.toLowerCase()&&u.DOMUtil.sameNode(a([],e.parentElement.children,!0).filter(function(e){return"summary"===e.nodeName.toLowerCase()})[0],e)},details:function(e){return e.children&&0===a([],e.children,!0).filter(function(e){return"summary"===e.nodeName.toLowerCase()}).length}},e.image_extensions=[".bmp",".gif",".jpg",".jpeg",".pcx",".png"],e}();t.CommonUtil=m},9196(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.TableUtil=void 0;var a=i(3946),n=i(7011),l=i(7139),r=function(){function e(){}return e.isDataTable=function(e){return!(n.AriaUtil.hasRole(e,"none")||n.AriaUtil.hasRole(e,"presentation"))},e.isComplexDataTable=function(t){if("AriaUtil_isComplexDataTable"in t)return!!t.AriaUtil_isComplexDataTable;var i=!1;if(t&&e.isDataTable(t)){for(var a=null,n=null,r=t.getElementsByTagName("tr"),o=r.length,s=0,u=0,d=0,c=0;!i&&c<o;++c)if(a=r[c].getElementsByTagName("th"),n=r[c].getElementsByTagName("td"),u=a.length,0!==(s=n.length)){i=u>1;for(var m=0;!i&&m<u;++m)i=(a[m].hasAttribute("rowspan")||a[m].hasAttribute("colspan"))&&l.CommonUtil.getAncestor(a[m],"table")===t;for(var p=0;!i&&p<s;++p)i=(n[p].hasAttribute("rowspan")||n[p].hasAttribute("colspan")||n[p].hasAttribute("headers")&&l.CommonUtil.normalizeSpacing(n[p].getAttribute("headers")).split(" ").length>2)&&l.CommonUtil.getAncestor(n[p],"table")===t}else u>0&&++d,i=2===d;if(!i){var h=t.getElementsByTagName("thead"),g=h.length;g>0&&((i=g>1)||(i=h[0].getElementsByTagName("tr").length>1))}i||0===o||(i=u>0&&!e.tableHeaderExists(t))}return t.AriaUtil_isComplexDataTable=i,i},e.isTableCellEmpty=function(e){return!e||!a.VisUtil.isNodeVisible(e)||0===e.innerHTML.replace(/&nbsp;/g," ").trim().length},e.isTableRowEmpty=function(t){if(!t||!t.cells||0===t.cells.length||!a.VisUtil.isNodeVisible(t))return!0;for(var i=!0,n=0;i&&n<t.cells.length;n++){var l=t.cells[n];i=e.isTableCellEmpty(l)}return i},e.tableHeaderExists=function(t){var i=t.rows;if(!i||0===i.length)return null;for(var a=!0,n=i[0],r=0;a&&r<i.length;r++)(n=i[r]).parentNode&&"tfoot"===n.parentNode.nodeName.toLowerCase()||(a=e.isTableRowEmpty(n));if(a)return null;for(a=!0,r=0;a&&r<n.cells.length;r++){var o=n.cells[r];a=e.isTableCellEmpty(o)||"th"===o.nodeName.toLowerCase()}if(a)return!0;a=!0;for(var s=0;a&&s<i.length;++s)i[s].parentNode&&"tfoot"===i[s].parentNode.nodeName.toLowerCase()||(a=!i[s].cells||0===i[s].cells.length||0===i[s].cells[0].innerHTML.trim().length||"td"!=i[s].cells[0].nodeName.toLowerCase());if(a)return!0;a=!0;var u=[],d=[];for(r=0;a&&r<i.length;r++)for(var c=i[r],m=0;m<c.cells.length;m++)o=c.cells[m],e.isTableCellEmpty(o)||("td"===o.nodeName.toLowerCase()?o.getAttribute("headers")&&0!==o.getAttribute("headers").trim().length?l.CommonUtil.concatUniqueArrayItemList(o.getAttribute("headers").trim().split(" "),d):a=!1:"th"===o.nodeName.toLowerCase()&&o.getAttribute("id")&&o.getAttribute("id").trim().length>0&&l.CommonUtil.concatUniqueArrayItem(o.getAttribute("id").trim(),u));return!!(a&&u.length>0&&d.every(function(e){return u.includes(e)}))},e.isLayoutTable=function(e){return n.AriaUtil.hasRole(e,"presentation")||n.AriaUtil.hasRole(e,"none")},e.isTableDescendant=function(e){return e?e.aria.filter(function(e){return["table","grid","treegrid"].includes(e.role)}):null},e}();t.TableUtil=r},3946(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.VisUtil=void 0;var a=i(4566),n=i(1686),l=i(3864),r=i(7507),o=i(7011),s=i(4919),u=i(167),d=function(){function e(){}return e.isNodeVisible=function(t){3===t.nodeType&&(t=l.DOMWalker.parentNode(t));var i,n=t;if(1!==n.nodeType)return!0;if(!n.ownerDocument)return!0;var r=n.nodeName.toLowerCase();if(null!=e.hiddenByDefaultElements&&null!=e.hiddenByDefaultElements&&e.hiddenByDefaultElements.indexOf(r)>-1)return!1;var o=a.CacheUtil.getCache(n,"PT_NODE_HIDDEN",void 0);if(void 0!==o)return o;if(o=a.CacheUtil.setCache(n,"PT_NODE_HIDDEN",!1),null===e.unhideableElements||void 0===e.unhideableElements||-1===e.unhideableElements.indexOf(r)){if(!n.ownerDocument.defaultView)return a.CacheUtil.setCache(n,"PT_NODE_HIDDEN",!0);i=n.ownerDocument.defaultView.getComputedStyle(n,null);var s=n.getAttribute("hidden"),d=o,c="boolean"==typeof n.hidden&&n.hidden;if(!i&&!c&&null==s&&!d)return a.CacheUtil.setCache(n,"PT_NODE_HIDDEN",!0);if(null!==i&&("none"===i.getPropertyValue("display")||!a.CacheUtil.getCache(n,"Visibility_Check_Parent",null)&&"hidden"===i.getPropertyValue("visibility"))||"block"!==i.getPropertyValue("display")&&(c||null!=s||d))return a.CacheUtil.setCache(n,"PT_NODE_HIDDEN",!1);if(e.isContentHidden(n))return a.CacheUtil.setCache(n,"PT_NODE_HIDDEN",!1);if(u.ClipPathUtil.isNodeVisuallyHiddenByClipPath(n))return a.CacheUtil.setCache(n,"PT_NODE_HIDDEN",!1)}var m=l.DOMWalker.parentNode(n);if(null!=m&&1===m.nodeType){a.CacheUtil.setCache(m,"Visibility_Check_Parent",!0);var p=e.isNodeVisible(m);return a.CacheUtil.setCache(n,"PT_NODE_HIDDEN",p)}return a.CacheUtil.setCache(n,"PT_NODE_HIDDEN",!0)},e.isNodeVisuallyHidden=function(t){if(!t||1!==t.nodeType)return!1;var i=t,n=a.CacheUtil.getCache(i,"PT_NODE_VISUALLY_HIDDEN",void 0);if(void 0===n){var r=s.CSSUtil.getComputedStyle(i);if("absolute"===r.position&&r.clip&&"rect(0px,0px,0px,0px)"===r.clip.replaceAll(" ","")||r.opacity&&parseFloat(r.opacity)<.1)return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN",!0),!0;var o=l.DOMWalker.parentElement(i);if(!o)return!1;var u=e.isNodeVisuallyHidden(o);return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN",u),u}return n},e.isContentHidden=function(e){if(!e)return!1;var t=a.CacheUtil.getCache(e,"PT_NODE_ContentHidden",void 0);if(void 0!==t)return t;var i=getComputedStyle(e);return i?"hidden"!==i.getPropertyValue("content-visibility")||"inline"===i.getPropertyValue("display")?(a.CacheUtil.setCache(e,"PT_NODE_ContentHidden",!1),!1):(a.CacheUtil.setCache(e,"PT_NODE_ContentHidden",!0),!0):(a.CacheUtil.setCache(e,"PT_NODE_ContentHidden",!1),!1)},e.isElementOffscreen=function(e){if(!e)return!0;if(1!==e.nodeType)return!1;var t=a.CacheUtil.getCache(e,"PT_NODE_Offscreen",void 0);if(void 0!==t)return t;var i=(new r.DOMMapper).getUnadjustedBounds(e);return i?0===i.height||0===i.width||i.top+i.height<=0||i.left+i.width<=0?(a.CacheUtil.setCache(e,"PT_NODE_Offscreen",!0),!0):(a.CacheUtil.setCache(e,"PT_NODE_Offscreen",!1),!1):(a.CacheUtil.setCache(e,"PT_NODE_Offscreen",!0),!0)},e.isNodeHiddenFromAT=function(t){if(!t)return!1;var i=a.CacheUtil.getCache(t,"PT_NODE_HiddenFromAT",void 0);return void 0!==i?i:e.isNodeVisible(t)&&"true"!==t.getAttribute("aria-hidden")?n.DOMUtil.getAncestorWithAttribute(t,"aria-hidden","true")?(a.CacheUtil.setCache(t,"PT_NODE_HiddenFromAT",!0),!0):(a.CacheUtil.setCache(t,"PT_NODE_HiddenFromAT",!1),!1):(a.CacheUtil.setCache(t,"PT_NODE_HiddenFromAT",!0),!0)},e.isNodePresentational=function(e){var t=o.AriaUtil.getResolvedRole(e);return!(!t||"none"!==t&&"presentation"!==t)},e.isElementScrollable=function(e){if(!e)return!1;var t=s.CSSUtil.getComputedStyle(e);if(!t)return!1;var i=t.getPropertyValue("overflow-x"),a=t.getPropertyValue("overflow-y");if("visible"!==i||"hidden"!==a&&"scroll"!==a&&"auto"!==a||(i="auto"),"visible"!==a||"hidden"!==i&&"scroll"!==i&&"auto"!==i||(a="auto"),"clip"===i&&"visible"!==a&&"clip"!==a&&(i="hidden"),"clip"===a&&"visible"!==i&&"clip"!==i&&(a="hidden"),!("visible"!==i&&"hidden"!==i&&"clip"!==i||"visible"!==a&&"hidden"!==a&&"clip"!==a))return!1;if(Math.max(e.offsetWidth,e.offsetHeight)<30||Math.min(e.offsetWidth,e.offsetHeight)<15)return!1;var n=s.CSSUtil.getPixelsFromStyle(t.paddingLeft,e)+s.CSSUtil.getPixelsFromStyle(t.paddingRight,e),l=s.CSSUtil.getPixelsFromStyle(t.paddingTop,e)+s.CSSUtil.getPixelsFromStyle(t.paddingBottom,e);return!(e.scrollWidth-e.clientWidth<1+n&&e.scrollHeight-e.clientHeight<1+l)},e.unhideableElements=["area","param","audio"],e.hiddenByDefaultElements=["script","link","style","head","meta","base","noscript","template","datalist"],e}();t.VisUtil=d},8855(e){e.exports=JSON.parse('{"1.1.1":{"num":"1.1.1","url":"https://www.w3.org/TR/WCAG22/#non-text-content","scId":"WCAG2:non-text-content","scAltId":["text-equiv-all"],"test":"WCAG2:text-equiv-all","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#non-text-content","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/non-text-content.html","handle":"Non-text Content","level":"A","wcagType":"2.0"},"1.2.1":{"num":"1.2.1","url":"https://www.w3.org/TR/WCAG22/#audio-only-and-video-only-prerecorded","scId":"WCAG2:audio-only-and-video-only-prerecorded","scAltId":["media-equiv-av-only-alt"],"test":"WCAG2:media-equiv-av-only-alt","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-only-and-video-only-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-only-and-video-only-prerecorded.html","handle":"Audio-only and Video-only (Prerecorded)","level":"A","wcagType":"2.0"},"1.2.2":{"num":"1.2.2","url":"https://www.w3.org/TR/WCAG22/#captions-prerecorded","scId":"WCAG2:captions-prerecorded","scAltId":["media-equiv-captions"],"test":"WCAG2:media-equiv-captions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#captions-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/captions-prerecorded.html","handle":"Captions (Prerecorded)","level":"A","wcagType":"2.0"},"1.2.3":{"num":"1.2.3","url":"https://www.w3.org/TR/WCAG22/#audio-description-or-media-alternative-prerecorded","scId":"WCAG2:audio-description-or-media-alternative-prerecorded","scAltId":["media-equiv-audio-desc"],"test":"WCAG2:media-equiv-audio-desc","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-description-or-media-alternative-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-description-or-media-alternative-prerecorded.html","handle":"Audio Description or Media Alternative (Prerecorded)","level":"A","wcagType":"2.0"},"1.2.4":{"num":"1.2.4","url":"https://www.w3.org/TR/WCAG22/#captions-live","scId":"WCAG2:captions-live","scAltId":["media-equiv-real-time-captions"],"test":"WCAG2:media-equiv-real-time-captions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#captions-live","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/captions-live.html","handle":"Captions (Live)","level":"AA","wcagType":"2.0"},"1.2.5":{"num":"1.2.5","url":"https://www.w3.org/TR/WCAG22/#audio-description-prerecorded","scId":"WCAG2:audio-description-prerecorded","scAltId":["media-equiv-audio-desc-only"],"test":"WCAG2:media-equiv-audio-desc-only","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-description-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-description-prerecorded.html","handle":"Audio Description (Prerecorded)","level":"AA","wcagType":"2.0"},"1.2.6":{"num":"1.2.6","url":"https://www.w3.org/TR/WCAG22/#sign-language-prerecorded","scId":"WCAG2:sign-language-prerecorded","scAltId":["media-equiv-sign"],"test":"WCAG2:media-equiv-sign","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#sign-language-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/sign-language-prerecorded.html","handle":"Sign Language (Prerecorded)","level":"AAA","wcagType":"2.0"},"1.2.7":{"num":"1.2.7","url":"https://www.w3.org/TR/WCAG22/#extended-audio-description-prerecorded","scId":"WCAG2:extended-audio-description-prerecorded","scAltId":["media-equiv-extended-ad"],"test":"WCAG2:media-equiv-extended-ad","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#extended-audio-description-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/extended-audio-description-prerecorded.html","handle":"Extended Audio Description (Prerecorded)","level":"AAA","wcagType":"2.0"},"1.2.8":{"num":"1.2.8","url":"https://www.w3.org/TR/WCAG22/#media-alternative-prerecorded","scId":"WCAG2:media-alternative-prerecorded","scAltId":["media-equiv-text-doc"],"test":"WCAG2:media-equiv-text-doc","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#media-alternative-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/media-alternative-prerecorded.html","handle":"Media Alternative (Prerecorded)","level":"AAA","wcagType":"2.0"},"1.2.9":{"num":"1.2.9","url":"https://www.w3.org/TR/WCAG22/#audio-only-live","scId":"WCAG2:audio-only-live","scAltId":["media-equiv-live-audio-only"],"test":"WCAG2:media-equiv-live-audio-only","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-only-live","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-only-live.html","handle":"Audio-only (Live)","level":"AAA","wcagType":"2.0"},"1.3.1":{"num":"1.3.1","url":"https://www.w3.org/TR/WCAG22/#info-and-relationships","scId":"WCAG2:info-and-relationships","scAltId":["content-structure-separation-programmatic"],"test":"WCAG2:content-structure-separation-programmatic","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#info-and-relationships","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/info-and-relationships.html","handle":"Info and Relationships","level":"A","wcagType":"2.0"},"1.3.2":{"num":"1.3.2","url":"https://www.w3.org/TR/WCAG22/#meaningful-sequence","scId":"WCAG2:meaningful-sequence","scAltId":["content-structure-separation-sequence"],"test":"WCAG2:content-structure-separation-sequence","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#meaningful-sequence","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/meaningful-sequence.html","handle":"Meaningful Sequence","level":"A","wcagType":"2.0"},"1.3.3":{"num":"1.3.3","url":"https://www.w3.org/TR/WCAG22/#sensory-characteristics","scId":"WCAG2:sensory-characteristics","scAltId":["content-structure-separation-understanding"],"test":"WCAG2:content-structure-separation-understanding","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#sensory-characteristics","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/sensory-characteristics.html","handle":"Sensory Characteristics","level":"A","wcagType":"2.0"},"1.3.4":{"num":"1.3.4","url":"https://www.w3.org/TR/WCAG22/#orientation","scId":"WCAG2:orientation","scAltId":[],"test":"WCAG2:orientation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#orientation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/orientation.html","handle":"Orientation","level":"AA","wcagType":"2.1"},"1.3.5":{"num":"1.3.5","url":"https://www.w3.org/TR/WCAG22/#identify-input-purpose","scId":"WCAG2:identify-input-purpose","scAltId":[],"test":"WCAG2:identify-input-purpose","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#identify-input-purpose","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/identify-input-purpose.html","handle":"Identify Input Purpose","level":"AA","wcagType":"2.1"},"1.3.6":{"num":"1.3.6","url":"https://www.w3.org/TR/WCAG22/#identify-purpose","scId":"WCAG2:identify-purpose","scAltId":[],"test":"WCAG2:identify-purpose","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#identify-purpose","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/identify-purpose.html","handle":"Identify Purpose","level":"AAA","wcagType":"2.1"},"1.4.1":{"num":"1.4.1","url":"https://www.w3.org/TR/WCAG22/#use-of-color","scId":"WCAG2:use-of-color","scAltId":["visual-audio-contrast-without-color"],"test":"WCAG2:visual-audio-contrast-without-color","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#use-of-color","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/use-of-color.html","handle":"Use of Color","level":"A","wcagType":"2.0"},"1.4.2":{"num":"1.4.2","url":"https://www.w3.org/TR/WCAG22/#audio-control","scId":"WCAG2:audio-control","scAltId":["visual-audio-contrast-dis-audio"],"test":"WCAG2:visual-audio-contrast-dis-audio","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-control","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-control.html","handle":"Audio Control","level":"A","wcagType":"2.0"},"1.4.3":{"num":"1.4.3","url":"https://www.w3.org/TR/WCAG22/#contrast-minimum","scId":"WCAG2:contrast-minimum","scAltId":["visual-audio-contrast-contrast"],"test":"WCAG2:visual-audio-contrast-contrast","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#contrast-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/contrast-minimum.html","handle":"Contrast (Minimum)","level":"AA","wcagType":"2.0"},"1.4.4":{"num":"1.4.4","url":"https://www.w3.org/TR/WCAG22/#resize-text","scId":"WCAG2:resize-text","scAltId":["visual-audio-contrast-scale"],"test":"WCAG2:visual-audio-contrast-scale","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#resize-text","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/resize-text.html","handle":"Resize text","level":"AA","wcagType":"2.0"},"1.4.5":{"num":"1.4.5","url":"https://www.w3.org/TR/WCAG22/#images-of-text","scId":"WCAG2:images-of-text","scAltId":["visual-audio-contrast-text-presentation"],"test":"WCAG2:visual-audio-contrast-text-presentation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#images-of-text","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/images-of-text.html","handle":"Images of Text","level":"AA","wcagType":"2.0"},"1.4.6":{"num":"1.4.6","url":"https://www.w3.org/TR/WCAG22/#contrast-enhanced","scId":"WCAG2:contrast-enhanced","scAltId":["visual-audio-contrast7"],"test":"WCAG2:visual-audio-contrast7","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#contrast-enhanced","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/contrast-enhanced.html","handle":"Contrast (Enhanced)","level":"AAA","wcagType":"2.0"},"1.4.7":{"num":"1.4.7","url":"https://www.w3.org/TR/WCAG22/#low-or-no-background-audio","scId":"WCAG2:low-or-no-background-audio","scAltId":["visual-audio-contrast-noaudio"],"test":"WCAG2:visual-audio-contrast-noaudio","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#low-or-no-background-audio","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/low-or-no-background-audio.html","handle":"Low or No Background Audio","level":"AAA","wcagType":"2.0"},"1.4.8":{"num":"1.4.8","url":"https://www.w3.org/TR/WCAG22/#visual-presentation","scId":"WCAG2:visual-presentation","scAltId":["visual-audio-contrast-visual-presentation"],"test":"WCAG2:visual-audio-contrast-visual-presentation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#visual-presentation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/visual-presentation.html","handle":"Visual Presentation","level":"AAA","wcagType":"2.0"},"1.4.9":{"num":"1.4.9","url":"https://www.w3.org/TR/WCAG22/#images-of-text-no-exception","scId":"WCAG2:images-of-text-no-exception","scAltId":["visual-audio-contrast-text-images"],"test":"WCAG2:visual-audio-contrast-text-images","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#images-of-text-no-exception","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/images-of-text-no-exception.html","handle":"Images of Text (No Exception)","level":"AAA","wcagType":"2.0"},"1.4.10":{"num":"1.4.10","url":"https://www.w3.org/TR/WCAG22/#reflow","scId":"WCAG2:reflow","scAltId":[],"test":"WCAG2:reflow","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#reflow","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/reflow.html","handle":"Reflow","level":"AA","wcagType":"2.1"},"1.4.11":{"num":"1.4.11","url":"https://www.w3.org/TR/WCAG22/#non-text-contrast","scId":"WCAG2:non-text-contrast","scAltId":[],"test":"WCAG2:non-text-contrast","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#non-text-contrast","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/non-text-contrast.html","handle":"Non-text Contrast","level":"AA","wcagType":"2.1"},"1.4.12":{"num":"1.4.12","url":"https://www.w3.org/TR/WCAG22/#text-spacing","scId":"WCAG2:text-spacing","scAltId":[],"test":"WCAG2:text-spacing","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#text-spacing","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/text-spacing.html","handle":"Text Spacing","level":"AA","wcagType":"2.1"},"1.4.13":{"num":"1.4.13","url":"https://www.w3.org/TR/WCAG22/#content-on-hover-or-focus","scId":"WCAG2:content-on-hover-or-focus","scAltId":[],"test":"WCAG2:content-on-hover-or-focus","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#content-on-hover-or-focus","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/content-on-hover-or-focus.html","handle":"Content on Hover or Focus","level":"AA","wcagType":"2.1"},"2.1.1":{"num":"2.1.1","url":"https://www.w3.org/TR/WCAG22/#keyboard","scId":"WCAG2:keyboard","scAltId":["keyboard-operation-keyboard-operable"],"test":"WCAG2:keyboard-operation-keyboard-operable","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#keyboard","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/keyboard.html","handle":"Keyboard","level":"A","wcagType":"2.0"},"2.1.2":{"num":"2.1.2","url":"https://www.w3.org/TR/WCAG22/#no-keyboard-trap","scId":"WCAG2:no-keyboard-trap","scAltId":["keyboard-operation-trapping"],"test":"WCAG2:keyboard-operation-trapping","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#no-keyboard-trap","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/no-keyboard-trap.html","handle":"No Keyboard Trap","level":"A","wcagType":"2.0"},"2.1.3":{"num":"2.1.3","url":"https://www.w3.org/TR/WCAG22/#keyboard-no-exception","scId":"WCAG2:keyboard-no-exception","scAltId":["keyboard-operation-all-funcs"],"test":"WCAG2:keyboard-operation-all-funcs","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#keyboard-no-exception","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/keyboard-no-exception.html","handle":"Keyboard (No Exception)","level":"AAA","wcagType":"2.0"},"2.1.4":{"num":"2.1.4","url":"https://www.w3.org/TR/WCAG22/#character-key-shortcuts","scId":"WCAG2:character-key-shortcuts","scAltId":[],"test":"WCAG2:WCAG2:character-key-shortcuts","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#character-key-shortcuts","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/character-key-shortcuts.html","handle":"Character Key Shortcuts","level":"A","wcagType":"2.1"},"2.2.1":{"num":"2.2.1","url":"https://www.w3.org/TR/WCAG22/#timing-adjustable","scId":"WCAG2:timing-adjustable","scAltId":["time-limits-required-behaviors"],"test":"WCAG2:time-limits-required-behaviors","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#timing-adjustable","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/timing-adjustable.html","handle":"Timing Adjustable","level":"A","wcagType":"2.0"},"2.2.2":{"num":"2.2.2","url":"https://www.w3.org/TR/WCAG22/#pause-stop-hide","scId":"WCAG2:pause-stop-hide","scAltId":["time-limits-pause"],"test":"WCAG2:time-limits-pause","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pause-stop-hide","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pause-stop-hide.html","handle":"Pause, Stop, Hide","level":"A","wcagType":"2.0"},"2.2.3":{"num":"2.2.3","url":"https://www.w3.org/TR/WCAG22/#no-timing","scId":"WCAG2:no-timing","scAltId":["time-limits-no-exceptions"],"test":"WCAG2:time-limits-no-exceptions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#no-timing","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/no-timing.html","handle":"No Timing","level":"AAA","wcagType":"2.0"},"2.2.4":{"num":"2.2.4","url":"https://www.w3.org/TR/WCAG22/#interruptions","scId":"WCAG2:interruptions","scAltId":["time-limits-postponed"],"test":"WCAG2:time-limits-postponed","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#interruptions","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/interruptions.html","handle":"Interruptions","level":"AAA","wcagType":"2.0"},"2.2.5":{"num":"2.2.5","url":"https://www.w3.org/TR/WCAG22/#re-authenticating","scId":"WCAG2:re-authenticating","scAltId":["time-limits-server-timeout"],"test":"WCAG2:time-limits-server-timeout","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#re-authenticating","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/re-authenticating.html","handle":"Re-authenticating","level":"AAA","wcagType":"2.0"},"2.2.6":{"num":"2.2.6","url":"https://www.w3.org/TR/WCAG22/#timeouts","scId":"WCAG2:timeouts","scAltId":[],"test":"WCAG2:WCAG2:timeouts","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#timeouts","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/timeouts.html","handle":"Timeouts","level":"AAA","wcagType":"2.1"},"2.3.1":{"num":"2.3.1","url":"https://www.w3.org/TR/WCAG22/#three-flashes-or-below-threshold","scId":"WCAG2:three-flashes-or-below-threshold","scAltId":["seizure-does-not-violate"],"test":"WCAG2:seizure-does-not-violate","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#three-flashes-or-below-threshold","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/three-flashes-or-below-threshold.html","handle":"Three Flashes or Below Threshold","level":"A","wcagType":"2.0"},"2.3.2":{"num":"2.3.2","url":"https://www.w3.org/TR/WCAG22/#three-flashes","scId":"WCAG2:three-flashes","scAltId":["seizure-three-times"],"test":"WCAG2:seizure-three-times","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#three-flashes","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/three-flashes.html","handle":"Three Flashes","level":"AAA","wcagType":"2.0"},"2.3.3":{"num":"2.3.3","url":"https://www.w3.org/TR/WCAG22/#animation-from-interactions","scId":"WCAG2:animation-from-interactions","scAltId":[],"test":"WCAG2:WCAG2:animation-from-interactions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#animation-from-interactions","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/animation-from-interactions.html","handle":"Animation from Interactions","level":"AAA","wcagType":"2.1"},"2.4.1":{"num":"2.4.1","url":"https://www.w3.org/TR/WCAG22/#bypass-blocks","scId":"WCAG2:bypass-blocks","scAltId":["navigation-mechanisms-skip"],"test":"WCAG2:navigation-mechanisms-skip","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#bypass-blocks","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/bypass-blocks.html","handle":"Bypass Blocks","level":"A","wcagType":"2.0"},"2.4.2":{"num":"2.4.2","url":"https://www.w3.org/TR/WCAG22/#page-titled","scId":"WCAG2:page-titled","scAltId":["navigation-mechanisms-title"],"test":"WCAG2:navigation-mechanisms-title","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#page-titled","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/page-titled.html","handle":"Page Titled","level":"A","wcagType":"2.0"},"2.4.3":{"num":"2.4.3","url":"https://www.w3.org/TR/WCAG22/#focus-order","scId":"WCAG2:focus-order","scAltId":["navigation-mechanisms-focus-order"],"test":"WCAG2:navigation-mechanisms-focus-order","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-order","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-order.html","handle":"Focus Order","level":"A","wcagType":"2.0"},"2.4.4":{"num":"2.4.4","url":"https://www.w3.org/TR/WCAG22/#link-purpose-in-context","scId":"WCAG2:link-purpose-in-context","scAltId":["navigation-mechanisms-refs"],"test":"WCAG2:navigation-mechanisms-refs","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#link-purpose-in-context","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/link-purpose-in-context.html","handle":"Link Purpose (In Context)","level":"A","wcagType":"2.0"},"2.4.5":{"num":"2.4.5","url":"https://www.w3.org/TR/WCAG22/#multiple-ways","scId":"WCAG2:multiple-ways","scAltId":["navigation-mechanisms-mult-loc"],"test":"WCAG2:navigation-mechanisms-mult-loc","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#multiple-ways","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/multiple-ways.html","handle":"Multiple Ways","level":"AA","wcagType":"2.0"},"2.4.6":{"num":"2.4.6","url":"https://www.w3.org/TR/WCAG22/#headings-and-labels","scId":"WCAG2:headings-and-labels","scAltId":["navigation-mechanisms-descriptive"],"test":"WCAG2:navigation-mechanisms-descriptive","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#headings-and-labels","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/headings-and-labels.html","handle":"Headings and Labels","level":"AA","wcagType":"2.0"},"2.4.7":{"num":"2.4.7","url":"https://www.w3.org/TR/WCAG22/#focus-visible","scId":"WCAG2:focus-visible","scAltId":["navigation-mechanisms-focus-visible"],"test":"WCAG2:navigation-mechanisms-focus-visible","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-visible","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-visible.html","handle":"Focus Visible","level":"AA","wcagType":"2.0"},"2.4.8":{"num":"2.4.8","url":"https://www.w3.org/TR/WCAG22/#location","scId":"WCAG2:location","scAltId":["navigation-mechanisms-location"],"test":"WCAG2:navigation-mechanisms-location","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#location","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/location.html","handle":"Location","level":"AAA","wcagType":"2.0"},"2.4.9":{"num":"2.4.9","url":"https://www.w3.org/TR/WCAG22/#link-purpose-link-only","scId":"WCAG2:link-purpose-link-only","scAltId":["navigation-mechanisms-link"],"test":"WCAG2:navigation-mechanisms-link","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#link-purpose-link-only","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/link-purpose-link-only.html","handle":"Link Purpose (Link Only)","level":"AAA","wcagType":"2.0"},"2.4.10":{"num":"2.4.10","url":"https://www.w3.org/TR/WCAG22/#section-headings","scId":"WCAG2:section-headings","scAltId":["navigation-mechanisms-headings"],"test":"WCAG2:navigation-mechanisms-headings","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#section-headings","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/section-headings.html","handle":"Section Headings","level":"AAA","wcagType":"2.0"},"2.4.11":{"num":"2.4.11","url":"https://www.w3.org/TR/WCAG22/#focus-not-obscured-minimum","scId":"WCAG2:focus-not-obscured-minimum","scAltId":["focus-not-obscured-minimum-alt"],"test":"WCAG2:focus-not-obscured-minimum-test","howToMeetUrl":"https://www.w3.org/TR/WCAG22/#focus-not-obscured-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-not-obscured-minimum.html","handle":"Focus Not Obscured (Minimum)","level":"AA","wcagType":"2.2"},"2.4.12":{"num":"2.4.12","url":"https://www.w3.org/TR/WCAG22/#focus-not-obscured-enhanced","scId":"WCAG2:focus-not-obscured-enhanced","scAltId":[],"test":"WCAG2:focus-not-obscured-enhanced-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-not-obscured-enhanced","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-not-obscured-enhanced.html","handle":"Focus Not Obscured (Enhanced)","level":"AAA","wcagType":"2.2"},"2.4.13":{"num":"2.4.13","url":"https://www.w3.org/TR/WCAG22/#focus-appearance","scId":"WCAG2:focus-appearance","scAltId":[],"test":"WCAG2:focus-appearance","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-appearance","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-appearance.html","handle":"Focus Appearance","level":"AAA","wcagType":"2.2"},"2.5.1":{"num":"2.5.1","url":"https://www.w3.org/TR/WCAG22/#pointer-gestures","scId":"WCAG2:pointer-gestures","scAltId":[],"test":"WCAG2:pointer-gestures-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pointer-gestures","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pointer-gestures.html","handle":"Pointer Gestures","level":"A","wcagType":"2.1"},"2.5.2":{"num":"2.5.2","url":"https://www.w3.org/TR/WCAG22/#pointer-cancellation","scId":"WCAG2:pointer-cancellation","scAltId":[],"test":"WCAG2:WCAG2:pointer-cancellation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pointer-cancellation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pointer-cancellation.html","handle":"Pointer Cancellation","level":"A","wcagType":"2.1"},"2.5.3":{"num":"2.5.3","url":"https://www.w3.org/TR/WCAG22/#label-in-name","scId":"WCAG2:label-in-name","scAltId":[],"test":"WCAG2:WCAG2:label-in-name","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#label-in-name","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/label-in-name.html","handle":"Label in Name","level":"A","wcagType":"2.1"},"2.5.4":{"num":"2.5.4","url":"https://www.w3.org/TR/WCAG22/#motion-actuation","scId":"WCAG2:motion-actuation","scAltId":[],"test":"WCAG2:WCAG2:motion-actuation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#motion-actuation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/motion-actuation.html","handle":"Motion Actuation","level":"A","wcagType":"2.1"},"2.5.5":{"num":"2.5.5","url":"https://www.w3.org/TR/WCAG22/#target-size","scId":"WCAG2:target-size","scAltId":[],"test":"WCAG2:WCAG2:target-size","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#target-size","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/target-size.html","handle":"Target Size","level":"AAA","wcagType":"2.1"},"2.5.6":{"num":"2.5.6","url":"https://www.w3.org/TR/WCAG22/#concurrent-input-mechanisms","scId":"WCAG2:concurrent-input-mechanisms","scAltId":[],"test":"WCAG2:WCAG2:concurrent-input-mechanisms","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#concurrent-input-mechanisms","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/concurrent-input-mechanisms.html","handle":"Concurrent Input Mechanisms","level":"AAA","wcagType":"2.1"},"2.5.7":{"num":"2.5.7","url":"https://www.w3.org/TR/WCAG22/#dragging-movements","scId":"WCAG2:dragging-movement","scAltId":["dragging-movement-alt"],"test":"WCAG2:dragging-movement-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/Understanding/dragging-movements.html","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/dragging-movements.html","handle":"Dragging Movement","level":"AA","wcagType":"2.2"},"2.5.8":{"num":"2.5.8","url":"https://www.w3.org/TR/WCAG22/#target-size-minimum","scId":"WCAG2:minimum-target-size","scAltId":["minimum-target-size-alt"],"test":"WCAG2:minimum-target-size-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#target-size-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/target-size-minimum.html","handle":"Minimum Target Size","level":"AA","wcagType":"2.2"},"3.1.1":{"num":"3.1.1","url":"https://www.w3.org/TR/WCAG22/#language-of-page","scId":"WCAG2:language-of-page","scAltId":["meaning-doc-lang-id"],"test":"WCAG2:meaning-doc-lang-id","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#language-of-page","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/language-of-page.html","handle":"Language of Page","level":"A","wcagType":"2.0"},"3.1.2":{"num":"3.1.2","url":"https://www.w3.org/TR/WCAG22/#language-of-parts","scId":"WCAG2:language-of-parts","scAltId":["meaning-other-lang-id"],"test":"WCAG2:meaning-other-lang-id","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#language-of-parts","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/language-of-parts.html","handle":"Language of Parts","level":"AA","wcagType":"2.0"},"3.1.3":{"num":"3.1.3","url":"https://www.w3.org/TR/WCAG22/#unusual-words","scId":"WCAG2:unusual-words","scAltId":["meaning-idioms"],"test":"WCAG2:meaning-idioms","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#unusual-words","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/unusual-words.html","handle":"Unusual Words","level":"AAA","wcagType":"2.0"},"3.1.4":{"num":"3.1.4","url":"https://www.w3.org/TR/WCAG22/#abbreviations","scId":"WCAG2:abbreviations","scAltId":["meaning-located"],"test":"WCAG2:meaning-located","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#abbreviations","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/abbreviations.html","handle":"Abbreviations","level":"AAA","wcagType":"2.0"},"3.1.5":{"num":"3.1.5","url":"https://www.w3.org/TR/WCAG22/#reading-level","scId":"WCAG2:reading-level","scAltId":["meaning-supplements"],"test":"WCAG2:meaning-supplements","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#reading-level","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/reading-level.html","handle":"Reading Level","level":"AAA","wcagType":"2.0"},"3.1.6":{"num":"3.1.6","url":"https://www.w3.org/TR/WCAG22/#pronunciation","scId":"WCAG2:pronunciation","scAltId":["meaning-pronunciation"],"test":"WCAG2:meaning-pronunciation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pronunciation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pronunciation.html","handle":"Pronunciation","level":"AAA","wcagType":"2.0"},"3.2.1":{"num":"3.2.1","url":"https://www.w3.org/TR/WCAG22/#on-focus","scId":"WCAG2:on-focus","scAltId":["consistent-behavior-receive-focus"],"test":"WCAG2:consistent-behavior-receive-focus","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#on-focus","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/on-focus.html","handle":"On Focus","level":"A","wcagType":"2.0"},"3.2.2":{"num":"3.2.2","url":"https://www.w3.org/TR/WCAG22/#on-input","scId":"WCAG2:on-input","scAltId":["consistent-behavior-unpredictable-change"],"test":"WCAG2:consistent-behavior-unpredictable-change","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#on-input","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/on-input.html","handle":"On Input","level":"A","wcagType":"2.0"},"3.2.3":{"num":"3.2.3","url":"https://www.w3.org/TR/WCAG22/#consistent-navigation","scId":"WCAG2:consistent-navigation","scAltId":["consistent-behavior-consistent-locations"],"test":"WCAG2:consistent-behavior-consistent-locations","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#consistent-navigation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/consistent-navigation.html","handle":"Consistent Navigation","level":"AA","wcagType":"2.0"},"3.2.4":{"num":"3.2.4","url":"https://www.w3.org/TR/WCAG22/#consistent-identification","scId":"WCAG2:consistent-identification","scAltId":["consistent-behavior-consistent-functionality"],"test":"WCAG2:consistent-behavior-consistent-functionality","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#consistent-identification","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/consistent-identification.html","handle":"Consistent Identification","level":"AA","wcagType":"2.0"},"3.2.5":{"num":"3.2.5","url":"https://www.w3.org/TR/WCAG22/#change-on-request","scId":"WCAG2:change-on-request","scAltId":["consistent-behavior-no-extreme-changes-context"],"test":"WCAG2:consistent-behavior-no-extreme-changes-context","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#change-on-request","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/change-on-request.html","handle":"Change on Request","level":"AAA","wcagType":"2.0"},"3.2.6":{"num":"3.2.6","url":"https://www.w3.org/TR/WCAG22/#consistent-help","scId":"WCAG2:consistent-help","scAltId":["consistent-help-alt"],"test":"WCAG2:consistent-help-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#consistent-help","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/consistent-help.html","handle":"Consistent Help","level":"AA","wcagType":"2.2"},"3.3.1":{"num":"3.3.1","url":"https://www.w3.org/TR/WCAG22/#error-identification","scId":"WCAG2:error-identification","scAltId":["minimize-error-identified"],"test":"WCAG2:minimize-error-identified","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-identification","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-identification.html","handle":"Error Identification","level":"A","wcagType":"2.0"},"3.3.2":{"num":"3.3.2","url":"https://www.w3.org/TR/WCAG22/#labels-or-instructions","scId":"WCAG2:labels-or-instructions","scAltId":["minimize-error-cues"],"test":"WCAG2:minimize-error-cues","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#labels-or-instructions","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/labels-or-instructions.html","handle":"Labels or Instructions","level":"A","wcagType":"2.0"},"3.3.3":{"num":"3.3.3","url":"https://www.w3.org/TR/WCAG22/#error-suggestion","scId":"WCAG2:error-suggestion","scAltId":["minimize-error-suggestions"],"test":"WCAG2:minimize-error-suggestions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-suggestion","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-suggestion.html","handle":"Error Suggestion","level":"AA","wcagType":"2.0"},"3.3.4":{"num":"3.3.4","url":"https://www.w3.org/TR/WCAG22/#error-prevention-legal-financial-data","scId":"WCAG2:error-prevention-legal-financial-data","scAltId":["minimize-error-reversible"],"test":"WCAG2:minimize-error-reversible","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-prevention-legal-financial-data","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-prevention-legal-financial-data.html","handle":"Error Prevention (Legal, Financial, Data)","level":"AA","wcagType":"2.0"},"3.3.5":{"num":"3.3.5","url":"https://www.w3.org/TR/WCAG22/#help","scId":"WCAG2:help","scAltId":["minimize-error-context-help"],"test":"WCAG2:minimize-error-context-help","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#help","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/help.html","handle":"Help","level":"AAA","wcagType":"2.0"},"3.3.6":{"num":"3.3.6","url":"https://www.w3.org/TR/WCAG22/#error-prevention-all","scId":"WCAG2:error-prevention-all","scAltId":["minimize-error-reversible-all"],"test":"WCAG2:minimize-error-reversible-all","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-prevention-all","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-prevention-all.html","handle":"Error Prevention (All)","level":"AAA","wcagType":"2.0"},"3.3.7":{"num":"3.3.7","url":"https://www.w3.org/TR/WCAG22/#redundant-entry","scId":"WCAG2:redundant-entry","scAltId":["redundant-entry-alt"],"test":"WCAG2:redundant-entry-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#redundant-entry","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/redundant-entry.html","handle":"Redundant Entry","level":"AA","wcagType":"2.2"},"3.3.8":{"num":"3.3.8","url":"https://www.w3.org/TR/WCAG22/#accessible-authentication-minimum","scId":"WCAG2:accessible-authentication-minimum","scAltId":["accessible-authentication-minimum-alt"],"test":"WCAG2:accessible-authentication-minimum-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#accessible-authentication-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/accessible-authentication-minimum.html","handle":"Accessible Authentication (Minimum)","level":"AA","wcagType":"2.2"},"3.3.9":{"num":"3.3.9","url":"https://www.w3.org/TR/WCAG22/#accessible-authentication-enhanced","scId":"WCAG2:accessible-authentication-enhanced","scAltId":[],"test":"WCAG2:accessible-authentication-enhanced","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#accessible-authentication-enhanced","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/accessible-authentication-enhanced.html","handle":"Accessible Authentication (Enhanced)","level":"AAA","wcagType":"2.2"},"4.1.1":{"num":"4.1.1","url":"https://www.w3.org/TR/WCAG22/#parsing","scId":"WCAG2:parsing","scAltId":["ensure-compat-parses"],"test":"WCAG2:ensure-compat-parses","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/?versions=2.1#parsing","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/parsing.html","handle":"Parsing","level":"A","wcagType":"2.0"},"4.1.2":{"num":"4.1.2","url":"https://www.w3.org/TR/WCAG22/#name-role-value","scId":"WCAG2:name-role-value","scAltId":["ensure-compat-rsv"],"test":"WCAG2:ensure-compat-rsv","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#name-role-value","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/name-role-value.html","handle":"Name, Role, Value","level":"A","wcagType":"2.0"},"4.1.3":{"num":"4.1.3","url":"https://www.w3.org/TR/WCAG22/#status-messages","scId":"WCAG2:status-messages","scAltId":[],"test":"WCAG2:status-messages","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#status-messages","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/status-messages.html","handle":"Status Messages","level":"AA","wcagType":"2.1"},"HTML":{"num":"HTML","url":"https://html.spec.whatwg.org/multipage/","scId":"","scAltId":[],"test":"","howToMeetUrl":"https://html.spec.whatwg.org/multipage/","understandingUrl":"https://html.spec.whatwg.org/multipage/","handle":"specification","level":"NA","wcagType":"NA"},"ARIA":{"num":"ARIA","url":"https://www.w3.org/TR/wai-aria-1.2/","scId":"","scAltId":[],"test":"","howToMeetUrl":"https://www.w3.org/TR/wai-aria-1.2/","understandingUrl":"https://www.w3.org/TR/wai-aria-1.2/","handle":"specification","level":"NA","wcagType":"NA"}}')}};const t={};function i(a){const n=t[a];if(void 0!==n)return n.exports;const l=t[a]={exports:{}};return e[a].call(l.exports,l,l.exports,i),l.exports}let a={};(()=>{let e=a;Object.defineProperty(e,"__esModule",{value:!0}),e.checkDemo=e.SRViewer=e.SRCursor=e.SRController=e.DOMWalker=e.Config=e.ARIAMapper=e.Checker=e.Context=void 0;var t=i(920);Object.defineProperty(e,"Context",{enumerable:!0,get:function(){return t.Context}});var n=i(7412);Object.defineProperty(e,"Checker",{enumerable:!0,get:function(){return n.Checker}});var l=i(9955);Object.defineProperty(e,"ARIAMapper",{enumerable:!0,get:function(){return l.ARIAMapper}});var r=i(4516);Object.defineProperty(e,"Config",{enumerable:!0,get:function(){return r.Config}});var o=i(3864);Object.defineProperty(e,"DOMWalker",{enumerable:!0,get:function(){return o.DOMWalker}});var s=i(5233);Object.defineProperty(e,"SRController",{enumerable:!0,get:function(){return s.SRController}});var u=i(8195);Object.defineProperty(e,"SRCursor",{enumerable:!0,get:function(){return u.SRCursor}});var d=i(8107);Object.defineProperty(e,"SRViewer",{enumerable:!0,get:function(){return d.SRViewer}}),e.checkDemo=function(e){e||(e=0);var t=new n.Checker;setTimeout(function(){t.check(document.documentElement,["IBM_Accessibility","IBM_Design"]).then(function(e){console.log(e);for(var t={FAIL:0,POTENTIAL:1,MANUAL:2,PASS:3},i=0;i<e.results.length;++i)"PASS"===e.results[i].value[1]&&e.results.splice(i--,1);e.results.sort(function(e,i){return e.category!=i.category?e.category.localeCompare(i.category):e.path.aria===i.path.aria?t[e.value[1]]-t[i.value[1]]:e.path.aria.localeCompare(i.path.aria)});for(var a=null,n=null,l=0,r=e.results;l<r.length;l++){var o=r[l];n!==o.category&&(null!==n&&(console.groupEnd(),console.groupEnd(),a=null),n=o.category,console.group(o.category)),o.path.aria!=a&&(null!==a&&console.groupEnd(),""===(a=o.path.aria)?console.group("page"):console.group(a)),console.log(o.value,o.message)}console.groupEnd(),console.groupEnd()})},e)}})(),ace=a})(); +new ace.SRViewer(); \ No newline at end of file diff --git a/rule-server/src/static/archives/2026.07.13/js/ace-window-debug.js b/rule-server/src/static/archives/2026.07.13/js/ace-window-debug.js new file mode 100644 index 000000000..fe8eb5f99 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/js/ace-window-debug.js @@ -0,0 +1,37898 @@ +/*! + * Copyright:: 2016,2017,2019,2020- IBM, Inc + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var ace; +/******/ (() => { // webpackBootstrap +/******/ "use strict"; +/******/ var __webpack_modules__ = ({ + +/***/ "./src/v2/aria/ARIADefinitions.ts" +/*!****************************************!*\ + !*** ./src/v2/aria/ARIADefinitions.ts ***! + \****************************************/ +(__unused_webpack_module, exports) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ARIADefinitions = void 0; +var ARIADefinitions = /** @class */ (function () { + function ARIADefinitions() { + } + ARIADefinitions.nameFromContent = function (role) { + return (role in ARIADefinitions.designPatterns) + && ARIADefinitions.designPatterns[role].nameFrom + && ARIADefinitions.designPatterns[role].nameFrom.includes("contents"); + }; + /* + * array of WAI-ARIA global states and properties + * @see https://www.w3.org/TR/wai-aria-1.2/#global_states + */ + ARIADefinitions.globalProperties = ["aria-atomic", "aria-busy", "aria-controls", "aria-current", "aria-describedby", + "aria-details", "aria-flowto", "aria-hidden", "aria-keyshortcuts", + "aria-label", "aria-labelledby", "aria-live", "aria-owns", "aria-relevant", "aria-roledescription" + // the following are deprecated in ARIA 1.2, will indicate deprecation in individual role + , + 'aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid' + ]; + //properties contains id(s) that refer to other element(s) + ARIADefinitions.referenceProperties = ["aria-owns", "aria-controls", "aria-describedby", "aria-labelledby", "aria-flowto", "aria-activedescendant"]; + // deprecated roles + ARIADefinitions.globalDeprecatedRoles = [ + 'directory', 'doc-biblioentry', 'doc-endnote' + ]; + // the following are deprecated in ARIA 1.1 for all the roles + ARIADefinitions.globalDeprecatedProperties = [ + 'aria-grabbed', 'aria-dropeffect' + ]; + /* + * XSD data types for all WAI-ARIA properties + * along with valid values when the data type is NMTOKEN + * WAI-ARIA properties data types explaned: + * type: Used to identify the type of values allowed for the WAI-ARIA property + * values: Used to identify specific values of an WAI-ARIA property when type is nmtoken + * hiddenIDRefSupported: Used to identify if the WAI-ARIA property supports referencing hidden ID + * true: refers to WAI-ARIA property supports hidden ID references + * false: refers to WAI-ARIA property does not support hidden ID references + * Default value will be set to false, if not specified. + */ + ARIADefinitions.propertyDataTypes = { + "aria-activedescendant": { + type: "http://www.w3.org/2001/XMLSchema#idref", + hiddenIDRefSupported: true + }, + "aria-atomic": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-autocomplete": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["inline", "list", "both", "none", "undefined"] //add undefined to handle value empty + }, + "aria-busy": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-checked": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "mixed", "undefined"] + }, + "aria-colcount": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-colindex": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-colspan": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-controls": { + type: "http://www.w3.org/2001/XMLSchema#idrefs", + hiddenIDRefSupported: true + }, + "aria-current": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["page", "step", "location", "date", "time", "true", "false", "undefined"] //add undefined for empty value + }, + "aria-describedby": { + type: "http://www.w3.org/2001/XMLSchema#idrefs", + hiddenIDRefSupported: true + }, + "aria-details": { + type: "http://www.w3.org/2001/XMLSchema#idrefs" + }, + "aria-disabled": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-dropeffect": { + type: "http://www.w3.org/2001/XMLSchema#nmtokens", + values: ["copy", "move", "link", "execute", "popup", "none"] + }, + "aria-errormessage": { + type: "http://www.w3.org/2001/XMLSchema#idref", + hiddenIDRefSupported: true + }, + "aria-expanded": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "undefined"] + }, + "aria-flowto": { + type: "http://www.w3.org/2001/XMLSchema#idrefs", + hiddenIDRefSupported: false + }, + "aria-grabbed": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "undefined"] + }, + "aria-haspopup": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "menu", "listbox", "tree", "grid", "dialog"] + }, + "aria-hidden": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "undefined"] + }, + "aria-invalid": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "spelling", "grammar", "undefined"] //add undefined for empty value + }, + "aria-keyshortcuts": { + type: "http://www.w3.org/2001/XMLSchema#string" + }, + "aria-label": { + type: "http://www.w3.org/2001/XMLSchema#string" + }, + "aria-labelledby": { + type: "http://www.w3.org/2001/XMLSchema#idrefs", + hiddenIDRefSupported: true + }, + "aria-level": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-live": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["off", "polite", "assertive"] + }, + "aria-modal": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-multiline": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-multiselectable": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-orientation": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["horizontal", "vertical", "undefined"] + }, + "aria-owns": { + type: "http://www.w3.org/2001/XMLSchema#idrefs", + hiddenIDRefSupported: true + }, + "aria-placeholder": { + type: "http://www.w3.org/2001/XMLSchema#string" + }, + "aria-posinset": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-pressed": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "mixed", "undefined"] + }, + "aria-readonly": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-relevant": { + type: "http://www.w3.org/2001/XMLSchema#nmtokens", + values: ["additions", "removals", "text", "all"] + }, + "aria-required": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-roledescription": { + type: "http://www.w3.org/2001/XMLSchema#string" + }, + "aria-rowcount": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-rowindex": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-rowspan": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-selected": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "undefined"] + }, + "aria-setsize": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-sort": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["ascending", "descending", "other", "none"] + }, + "aria-valuemax": { + type: "http://www.w3.org/2001/XMLSchema#decimal" + }, + "aria-valuemin": { + type: "http://www.w3.org/2001/XMLSchema#decimal" + }, + "aria-valuenow": { + type: "http://www.w3.org/2001/XMLSchema#decimal" + }, + "aria-valuetext": { + type: "http://www.w3.org/2001/XMLSchema#string" + } + }; + /* + * design patterns for concrete WAI-ARIA roles + * legitimate keys for each role include: + * + * - container: appropriate container(s) for that role + * - props: states and properties that may be associated with this role (in addition to the global states and properties listed above) + * - reqProps: required states or properties for this role + * - reqChildren: required children for this role + * - htmlEquiv: HTML equivalent for this role + * - roleType: one of widget, structure, landmark, liveRegion, window (as seen in https://www.w3.org/TR/wai-aria-1.2/#roles_categorization) + * - nameRequired: determines whether an accessible name is required for a widget (see ARIA spec.) + * - nameFrom: determines how an accessible name is supplied (author or content - see ARIA spec.) + * - deprecated: if present, indicates that the role is deprecated, and provides a list of alternative role(s) + */ + ARIADefinitions.designPatterns = { + "alert": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "liveRegion", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "alertdialog": { + container: null, + props: ["aria-modal"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "window", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "application": { + container: null, + props: ["aria-activedescendant", "aria-expanded"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: true, + nameFrom: ["author"] + }, + "article": { + container: null, + props: ["aria-posinset", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "banner": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "blockquote": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "button": { + container: null, + props: ["aria-expanded", "aria-pressed"], + reqProps: null, + reqChildren: null, + htmlEquiv: "button | input[@type='button']", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + "caption": { + container: ["figure", "grid", "table", "treegrid"], + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "cell": { + container: ["row"], + props: ["aria-colindex", "aria-colspan", "aria-rowindex", "aria-rowspan"], + reqProps: null, + reqChildren: null, + htmlEquiv: "td", + roleType: "structure", + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "checkbox": { + container: null, + props: ["aria-expanded", "aria-readonly", "aria-required"], + reqProps: ["aria-checked"], + reqChildren: null, + htmlEquiv: "input[@type='checkbox']", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-haspopup'] + }, + "code": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "columnheader": { + container: ["row"], + props: ["aria-colindex", "aria-colspan", "aria-expanded", "aria-readonly", "aria-required", "aria-rowindex", "aria-rowspan", "aria-selected", "aria-sort"], + reqProps: null, + reqChildren: null, + htmlEquiv: "th[@scope='col']", + roleType: "structure", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + "combobox": { + container: null, + props: ["aria-controls", "aria-activedescendant", "aria-autocomplete", "aria-readonly", "aria-required"], + reqProps: ["aria-expanded"], + reqChildren: [], + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"] + }, + "complementary": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "comment": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "contentinfo": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "definition": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "deletion": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "dialog": { + container: null, + props: ["aria-modal"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "window", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "directory": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecated: true, + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "doc-abstract": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-acknowledgments": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-afterword": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-appendix": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-backlink": { + container: null, + props: ["aria-disabled", "aria-expanded", "aria-haspopup"], + reqProps: null, + reqChildren: null, + htmlEquiv: "a | link", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + "doc-biblioentry": { + container: ["list"], + props: ["aria-level", "aria-posinset", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: "li", + roleType: "structure", + nameRequired: true, + nameFrom: ["author"] + }, + "doc-bibliography": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-biblioref": { + container: null, + props: ["aria-disabled", "aria-expanded", "aria-haspopup"], + reqProps: null, + reqChildren: null, + htmlEquiv: "a | link", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + "doc-chapter": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-colophon": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: true, + nameFrom: ["author"] + }, + "doc-conclusion": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-cover": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "img", + roleType: "structure", + nameRequired: false, + nameFrom: ["author"], + presentationalChildren: true + }, + "doc-credit": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-credits": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-dedication": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-endnote": { + container: ["list"], + props: ["aria-level", "aria-posinset", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: "li", + roleType: "structure", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-endnotes": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: true, + nameFrom: ["author"] + }, + "doc-epigraph": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-epilogue": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-errata": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-example": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-footnote": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-foreword": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-glossary": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-glossref": { + container: null, + props: ["aria-disabled", "aria-expanded", "aria-haspopup"], + reqProps: null, + reqChildren: null, + htmlEquiv: "a | link", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + "doc-index": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-introduction": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-noteref": { + container: null, + props: ["aria-disabled", "aria-expanded", "aria-haspopup"], + reqProps: null, + reqChildren: null, + htmlEquiv: "a | link", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + "doc-notice": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-pagebreak": { + container: null, + props: ["aria-orientation"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true + }, + "doc-pagelist": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-pagefooter": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + }, + "doc-pageheader": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + }, + "doc-part": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-preface": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-prologue": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-pullquote": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-qna": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-subtitle": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author", "contents"] + }, + "doc-tip": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-toc": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "document": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "emphasis": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "feed": { + container: null, + props: null, + reqProps: null, + reqChildren: ["article"], + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "figure": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "form": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "form", + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "generic": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "div | span", + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby", "aria-roledescription"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "graphics-document": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + nameRequired: true, + nameFrom: ["author"] + }, + "graphics-object": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + nameRequired: false, + nameFrom: ["author"] + }, + "graphics-symbol": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + nameRequired: true, + nameFrom: ["author"], + presentationalChildren: true + }, + "grid": { + container: null, + props: ["aria-activedescendant", "aria-colcount", "aria-multiselectable", "aria-readonly", "aria-rowcount"], + reqProps: null, + reqChildren: ["row", "rowgroup"], + htmlEquiv: "table", + roleType: "widget", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "gridcell": { + container: ["row"], + props: ["aria-colindex", "aria-colspan", "aria-disabled", "aria-errormessage", "aria-expanded", "aria-haspopup", "aria-invalid", "aria-readonly", "aria-required", "aria-rowindex", "aria-rowspan", "aria-selected"], + reqProps: null, + reqChildren: null, + htmlEquiv: "td", + roleType: "widget", + nameFrom: ["author", "contents"] + }, + "group": { + container: null, + props: ["aria-activedescendant"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "heading": { + container: null, + props: null, + reqProps: ["aria-level"], + reqChildren: null, + htmlEquiv: "h1 | h2 | h3 | h4 | h5 | h6", + roleType: "structure", + nameRequired: true, + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "img": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "img", + roleType: "structure", + nameRequired: true, + nameFrom: ["author"], + presentationalChildren: true, + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "image": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "img", + roleType: "structure", + nameRequired: true, + nameFrom: ["author"], + presentationalChildren: true, + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "insertion": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "link": { + container: null, + props: ["aria-expanded"], + reqProps: null, + reqChildren: null, + htmlEquiv: "a | link", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + "list": { + container: null, + props: null, + reqProps: null, + reqChildren: ["listitem"], + htmlEquiv: "ol | ul", + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "listbox": { + container: null, + props: ["aria-activedescendant", "aria-expanded", "aria-multiselectable", "aria-orientation", "aria-readonly", "aria-required"], + reqProps: null, + reqChildren: ["group", "option"], + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-haspopup'] + }, + "listitem": { + container: ["list"], + props: ["aria-level", "aria-posinset", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: "li", + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "log": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "liveRegion", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "main": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "mark": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "mark", + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "marquee": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "liveRegion", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "math": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + presentationalChildren: false, + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "menu": { + container: null, + props: ["aria-activedescendant", "aria-orientation"], + reqProps: null, + reqChildren: ["group", "menuitem", "menuitemcheckbox", "menuitemradio"], + htmlEquiv: null, + roleType: "widget", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "menubar": { + container: null, + props: ["aria-activedescendant", "aria-orientation"], + reqProps: null, + reqChildren: ["group", "menuitem", "menuitemcheckbox", "menuitemradio"], + htmlEquiv: null, + roleType: "widget", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "menuitem": { + container: ["group", "menu", "menubar"], + props: ["aria-expanded", "aria-posinset", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + "menuitemcheckbox": { + container: ["group", "menu", "menubar"], + props: ["aria-expanded", "aria-posinset", "aria-setsize"], + reqProps: ["aria-checked"], + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + "menuitemradio": { + container: ["group", "menu", "menubar"], + props: ["aria-expanded", "aria-posinset", "aria-setsize"], + reqProps: ["aria-checked"], + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + "meter": { + container: null, + props: ["aria-valuemax", "aria-valuemin", "aria-valuetext"], + reqProps: ["aria-valuenow"], + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: true, + nameFrom: ["author"], + presentationalChildren: true, + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "navigation": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "none": { + container: null, + props: [], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "note": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "option": { + container: ["group", "listbox"], + props: ["aria-selected", "aria-checked", "aria-posinset", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: "option", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "paragraph": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "presentation": { + container: null, + props: [], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "progressbar": { + container: null, + props: ["aria-valuemax", "aria-valuemin", "aria-valuenow", "aria-valuetext"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + presentationalChildren: true, + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "radio": { + container: null, + props: ["aria-posinset", "aria-setsize"], + reqProps: ["aria-checked"], + reqChildren: null, + htmlEquiv: "input[@type='radio']", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "radiogroup": { + container: null, + props: ["aria-activedescendant", "aria-orientation", "aria-readonly", "aria-required"], + reqProps: null, + reqChildren: ["radio"], + htmlEquiv: null, + roleType: "widget", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-haspopup'] + }, + "region": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "row": { + container: ["grid", "rowgroup", "table", "treegrid"], + props: ["aria-activedescendant", "aria-colindex", "aria-expanded", "aria-level", "aria-posinset", "aria-rowindex", "aria-selected", "aria-setsize"], + reqProps: null, + reqChildren: ["cell", "columnheader", "gridcell", "rowheader"], + htmlEquiv: "tr", + roleType: "structure", + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "rowgroup": { + container: ["grid", "table", "treegrid"], + props: [], + reqProps: null, + reqChildren: ["row"], + htmlEquiv: "tbody | tfoot | thead", + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "rowheader": { + container: ["row"], + props: ["aria-colindex", "aria-colspan", "aria-expanded", "aria-readonly", "aria-required", "aria-rowindex", "aria-rowspan", "aria-selected", "aria-sort"], + reqProps: null, + reqChildren: null, + htmlEquiv: "th[@scope='row']", + roleType: "structure", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + "scrollbar": { + container: null, + props: ["aria-orientation", "aria-valuemax", "aria-valuemin", "aria-valuetext"], + reqProps: ["aria-controls", "aria-valuenow"], + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: false, + nameFrom: ["author"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "search": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "searchbox": { + container: null, + props: ["aria-activedescendant", "aria-autocomplete", "aria-multiline", "aria-placeholder", "aria-readonly", "aria-required"], + reqProps: null, + reqChildren: null, + htmlEquiv: "input[@type='search']", + roleType: "widget", + nameRequired: true, + nameFrom: ["author"] + }, + "separator": { + container: null, + props: ["aria-orientation"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "slider": { + container: null, + props: ["aria-orientation", "aria-readonly", "aria-valuemax", "aria-valuemin", "aria-valuetext"], + reqProps: ["aria-valuenow"], + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + presentationalChildren: true + }, + "spinbutton": { + container: null, + props: ["aria-activedescendant", "aria-readonly", "aria-required", "aria-valuemax", "aria-valuemin", "aria-valuenow", "aria-valuetext"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-haspopup'] + }, + "status": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "liveRegion", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "strong": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "subscript": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "suggestion": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "superscript": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "switch": { + container: null, + props: ["aria-expanded", "aria-readonly", "aria-required"], + reqProps: ["aria-checked"], + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-haspopup'] + }, + "tab": { + container: ["tablist"], + props: ["aria-expanded", "aria-posinset", "aria-selected", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + "table": { + container: null, + props: ["aria-colcount", "aria-rowcount"], + reqProps: null, + reqChildren: ["row", "rowgroup", "caption"], + htmlEquiv: "table", + roleType: "structure", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "tablist": { + container: null, + props: ["aria-activedescendant", "aria-multiselectable", "aria-orientation"], + reqProps: null, + reqChildren: ["tab"], + htmlEquiv: null, + roleType: "widget", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "tabpanel": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "term": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "dfn", + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "textbox": { + container: null, + props: ["aria-activedescendant", "aria-autocomplete", "aria-multiline", "aria-placeholder", "aria-readonly", "aria-required"], + reqProps: null, + reqChildren: null, + htmlEquiv: "input[@type='text']", + roleType: "widget", + nameRequired: true, + nameFrom: ["author"] + }, + "time": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "timer": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "liveRegion", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "toolbar": { + container: null, + props: ["aria-activedescendant", "aria-orientation"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "tooltip": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "tree": { + container: null, + props: ["aria-activedescendant", "aria-multiselectable", "aria-orientation", "aria-required"], + reqProps: null, + reqChildren: ["group", "treeitem"], + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-haspopup'] + }, + "treegrid": { + container: null, + props: ["aria-activedescendant", "aria-colcount", "aria-multiselectable", "aria-orientation", "aria-readonly", "aria-required", "aria-rowcount"], + reqProps: null, + reqChildren: ["row", "rowgroup"], + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-haspopup'] + }, + "treeitem": { + container: ["group", "tree"], + props: ["aria-checked", "aria-expanded", "aria-level", "aria-posinset", "aria-selected", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + }; // end designPatterns + // copied from https://html.spec.whatwg.org/multipage/semantics-other.html#disabled-elements + // https://html.spec.whatwg.org/multipage/input.html#input-type-attr-summary + // https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/disabled + /** note: + * if a <fieldset> is disabled, the descendant form controls are all disabled except <legend> + * If an <optgroup> is disabled, the select is still interactive (unless otherwise disabled), but none of the items in the option group are selectable. + * When an element has the disabled attribute applied, the :disabled pseudo-class also applies to it. + */ + ARIADefinitions.elementsAllowedDisabled = ["button", "input", "select", "textarea", "optgroup", "option", "fieldset"]; // also form-associated custom element + ARIADefinitions.elementsAllowedRequired = ["select", "textarea"]; // remove 'input' and add to the individual element, becuase required is not supported on input@type="range", "color", "hidden" or any button types + ARIADefinitions.elementsAllowedReadOnly = ["textarea"]; // remove 'input' and add to the individual element, because readonly is not supported on input@type="checkbox", "radio", "range", "color", "file", hidden" or any button types + /* https://www.w3.org/TR/html-aria/#docconformance + * documentConformanceRequirement contains properties of the tags related to role without any additional attribute value + * documentConformanceRequirementSpecialTags contains those tags that require special considerations + */ + ARIADefinitions.documentConformanceRequirement = { + "abbr": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "address": { + implicitRole: ["group"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "article": { + implicitRole: ["article"], + validRoles: ["application", "document", "feed", "main", "none", "presentation", "region"], + globalAriaAttributesValid: true + }, + "aside": { + implicitRole: ["complementary"], + validRoles: ["doc-dedication", "doc-example", "doc-footnote", "doc-glossary", "doc-pullquote", "doc-tip", "feed", "none", "note", "presentation", "region", "search"], + globalAriaAttributesValid: true + }, + "audio": { + implicitRole: null, + validRoles: ["application"], + globalAriaAttributesValid: true + }, + "b": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "base": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "bdi": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "bdo": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "blockquote": { + implicitRole: ["blockquote"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "body": { + implicitRole: ["generic"], + validRoles: null, + otherDisallowedAriaAttributes: ['aria-hidden'], + globalAriaAttributesValid: true + }, + "br": { + implicitRole: null, + validRoles: ["none", "presentation"], + globalAriaAttributesValid: false, + otherAllowedAriaAttributes: ["aria-hidden"] + }, + "button": { + implicitRole: ["button"], + validRoles: ["checkbox", "combobox", "gridcell", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "separator", "slider", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true + }, + "canvas": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "caption": { + implicitRole: ['caption'], + validRoles: null, + globalAriaAttributesValid: true, + allowAttributesFromImplicitRole: false + }, + "cite": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "code": { + implicitRole: ["code"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "col": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "colgroup": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "data": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "datalist": { + implicitRole: ["listbox"], + validRoles: null, + globalAriaAttributesValid: false, + allowAttributesFromImplicitRole: false + }, + "dd": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true + }, + "del": { + implicitRole: ["deletion"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "details": { + implicitRole: ["group"], + validRoles: null, + globalAriaAttributesValid: true + }, + "dfn": { + implicitRole: ["term"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "dialog": { + implicitRole: ["dialog"], + validRoles: ["alertdialog"], + globalAriaAttributesValid: true + }, + "dl": { + implicitRole: null, + validRoles: ["group", "list", "none", "presentation"], + globalAriaAttributesValid: true + }, + "dt": { + implicitRole: ["term"], + validRoles: ["listitem"], + globalAriaAttributesValid: true + }, + "em": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "embed": { + implicitRole: null, + validRoles: ["application", "document", "img", "none", "presentation"], + globalAriaAttributesValid: true + }, + "fieldset": { + implicitRole: ["group"], + validRoles: ["none", "presentation", "radiogroup"], + globalAriaAttributesValid: true + }, + "figcaption": { + implicitRole: null, + validRoles: ["group", "none", "presentation"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "form": { + implicitRole: ["form"], + validRoles: ["none", "presentation", "search"], + globalAriaAttributesValid: true + }, + "head": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "hgroup": { + implicitRole: ["group"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "h1": { + implicitRole: ["heading"], + validRoles: ["doc-subtitle", "none", "presentation", "tab"], + globalAriaAttributesValid: true + }, + "h2": { + implicitRole: ["heading"], + validRoles: ["doc-subtitle", "none", "presentation", "tab"], + globalAriaAttributesValid: true + }, + "h3": { + implicitRole: ["heading"], + validRoles: ["doc-subtitle", "none", "presentation", "tab"], + globalAriaAttributesValid: true + }, + "h4": { + implicitRole: ["heading"], + validRoles: ["doc-subtitle", "none", "presentation", "tab"], + globalAriaAttributesValid: true + }, + "h5": { + implicitRole: ["heading"], + validRoles: ["doc-subtitle", "none", "presentation", "tab"], + globalAriaAttributesValid: true + }, + "h6": { + implicitRole: ["heading"], + validRoles: ["doc-subtitle", "none", "presentation", "tab"], + globalAriaAttributesValid: true + }, + "hr": { + implicitRole: ["separator"], + validRoles: ["doc-pagebreak", "none", "presentation"], + globalAriaAttributesValid: true + }, + "html": { + implicitRole: ["document"], + validRoles: null, + globalAriaAttributesValid: false, + allowAttributesFromImplicitRole: false + }, + "i": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "iframe": { + implicitRole: null, + validRoles: ["application", "document", "img", "none", "presentation"], + globalAriaAttributesValid: true + }, + "ins": { + implicitRole: ["insertion"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "kbd": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "label": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "legend": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "link": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "main": { + implicitRole: ["main"], + validRoles: null, + globalAriaAttributesValid: true + }, + "map": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "mark": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "math": { + implicitRole: ["math"], + validRoles: null, + globalAriaAttributesValid: true + }, + "menu": { + implicitRole: ["list"], + validRoles: ["group", "listbox", "menu", "menubar", "none", "presentation", "radiogroup", "tablist", "toolbar", "tree"], + globalAriaAttributesValid: true + }, + "meta": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "meter": { + implicitRole: ["meter"], + validRoles: null, + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ['aria-valuemax', 'aria-valuemin'], + allowAttributesFromImplicitRole: false + }, + "nav": { + implicitRole: ["navigation"], + validRoles: ["doc-index", "doc-pagelist", "doc-toc", "menu", "menubar", "tablist", "none", "presentation"], + globalAriaAttributesValid: true + }, + "noscript": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "object": { + implicitRole: null, + validRoles: ["application", "document", "img"], + globalAriaAttributesValid: true + }, + "ol": { + implicitRole: ["list"], + validRoles: ["group", "listbox", "menu", "menubar", "none", "presentation", "radiogroup", "tablist", "toolbar", "tree"], + globalAriaAttributesValid: true + }, + "optgroup": { + implicitRole: ["group"], + validRoles: null, + globalAriaAttributesValid: true + }, + "option": { + implicitRole: ["option"], + validRoles: null, + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-selected"] + }, + "output": { + implicitRole: ["status"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "p": { + implicitRole: ["paragraph"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "param": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "picture": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false, + otherAllowedAriaAttributes: ["aria-hidden"] + }, + "pre": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "progress": { + implicitRole: ["progressbar"], + validRoles: null, + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-valuemax"] + }, + "q": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "rp": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "rt": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "ruby": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "s": { + implicitRole: ["deletion"], + validRoles: ["any"], + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-label", "aria-labelledby"] + }, + "samp": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "script": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "search": { + implicitRole: ['search'], + validRoles: ['search', 'form', 'group', 'none', 'presentation', 'region'], + globalAriaAttributesValid: true + }, + "slot": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "small": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "source": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "span": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "strong": { + implicitRole: ["strong"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "style": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "sub": { + implicitRole: ["subscript"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "sup": { + implicitRole: ["superscript"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "svg": { + implicitRole: ["graphics-document"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "table": { + implicitRole: ["table"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "template": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "textarea": { + implicitRole: ["textbox"], + validRoles: null, + globalAriaAttributesValid: true + }, + "tfoot": { + implicitRole: ["rowgroup"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "thead": { + implicitRole: ["rowgroup"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "time": { + implicitRole: ["time"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "title": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "track": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "u": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "ul": { + implicitRole: ["list"], + validRoles: ["group", "listbox", "menu", "menubar", "none", "presentation", "radiogroup", "tablist", "toolbar", "tree"], + globalAriaAttributesValid: true + }, + "var": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "video": { + implicitRole: null, + validRoles: ["application"], + globalAriaAttributesValid: true + }, + "wbr": { + implicitRole: null, + validRoles: ["none", "presentation"], + globalAriaAttributesValid: false, + otherAllowedAriaAttributes: ["aria-hidden"] + } + }; // end documentConformanceRequirement + ARIADefinitions.documentConformanceRequirementSpecialTags = { + "a": { + "with-href": { + implicitRole: ["link"], + //roleCondition: " when non-empty href attribute is present", + validRoles: ["button", "checkbox", "doc-backlink", "doc-biblioref", "doc-glossref", "doc-noteref", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-disabled=true"] + }, + "without-href": { + implicitRole: ["generic"], + //roleCondition: " when href attribute is not present", + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "area": { + "with-href": { + implicitRole: ["link"], + //roleCondition: " when non-empty href attribute is present", + validRoles: null, + globalAriaAttributesValid: true + }, + "without-href": { + implicitRole: ["generic"], + //roleCondition: " when href attribute is not present", + validRoles: ["button", "link"], + globalAriaAttributesValid: true + } + }, + // TODO + // "autonomous custom element": { + // implicitRole: ["Role exposed from author defined ElementInternals. Otherwise no corresponding role."], + // validRoles: ["If role defined by ElementInternals", "any role", "no role Otherwise"], + // globalAriaAttributesValid: true + // }, + "div": { + "child-dl": { + implicitRole: ["generic"], + validRoles: ["presentation", "none"], + globalAriaAttributesValid: true + }, + "no-child-dl": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "figure": { + "child-figcaption": { + implicitRole: ["figure"], + validRoles: ['doc-example'], + globalAriaAttributesValid: true + }, + "no-child-figcaption": { + implicitRole: ["figure"], + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "footer": { + "des-section-article-aside-main-nav": { + implicitRole: ["generic"], + //roleCondition: " when descendant of an article, aside, main, nav or section element", + validRoles: ["doc-footnote", "group", "none", "presentation"], + globalAriaAttributesValid: true + }, + "other": { + implicitRole: ["contentinfo"], + //roleCondition: " when not a descendant of an article, aside, main, nav or section element", + validRoles: ["doc-footnote", "group", "none", "presentation"], + globalAriaAttributesValid: true + } + }, + // TODO + // "form-associated custom element": { + // implicitRole: ["Role exposed from author defined ElementInternals. Otherwise 'generic'."], + // validRoles: ["If role defined by ElementInternals", "form-related roles: button", "checkbox", "combobox", "group", "listbox", "progressbar", "radio", "radiogroup", "searchbox", "slider", "spinbutton", "switch", "textbox", "no role Otherwise"], + // globalAriaAttributesValid: true + // }, + "header": { + "des-section-article-aside-main-nav": { + implicitRole: ["generic"], + //roleCondition: " when descendant of an article, aside, main, nav or section element", + validRoles: ["group", "none", "presentation"], + globalAriaAttributesValid: true + }, + "other": { + implicitRole: ["banner"], + //roleCondition: " when not a descendant of an article, aside, main, nav or section element", + validRoles: ["group", "none", "presentation"], + globalAriaAttributesValid: true + } + }, + "img": { + "img-with-accname": { + implicitRole: ["img"], + //roleCondition: "when accessible name presents", + validRoles: ["button", "checkbox", "doc-cover", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "meter", "option", "progressbar", "radio", "scrollbar", "separator", "slider", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true + }, + "img-without-accname-empty-alt": { + implicitRole: ["presentation", "none"], + //roleCondition: "when no accessible name presents and alt=''", + validRoles: null, + globalAriaAttributesValid: false, + otherAllowedAriaAttributes: ["aria-hidden=true"] + }, + "img-without-accname-no-alt": { + implicitRole: ["img"], + //roleCondition: "when neither accessible name no alt presents", + validRoles: ["presentation", "none"], + globalAriaAttributesValid: false, + otherAllowedAriaAttributes: ["aria-hidden=true"] + } + }, + "input": { + "button": { + implicitRole: ["button"], + validRoles: ["checkbox", "combobox", "gridcell", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "slider", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true + }, + "checkbox-with-aria-pressed": { + implicitRole: ["checkbox"], + //roleCondition: " with type=checkbox and aria-pressed attribute is present", + validRoles: ["menuitemcheckbox", "option", "switch", "button"], + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-required"], + otherDisallowedAriaAttributes: ["aria-checked"] + }, + "checkbox-without-aria-pressed": { + implicitRole: ["checkbox"], + //roleCondition: " with type=checkbox and aria-pressed attribute is not present", + validRoles: ["menuitemcheckbox", "option", "switch"], + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-required"], + otherDisallowedAriaAttributes: ["aria-checked"] + }, + "color": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true + }, + "date": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-required", "aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "datetime-local": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-required", "aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "email-no-list": { + implicitRole: ["textbox"], + //roleCondition: " with type=email and no list attribute is present", + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "email-with-list": { + implicitRole: ["combobox"], + validRoles: null, + globalAriaAttributesValid: true + }, + "file": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-required"], + }, + "hidden": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "image": { + implicitRole: ["button"], + validRoles: ["checkbox", "gridcell", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "slider", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true + }, + "month": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "number": { + implicitRole: ["spinbutton"], + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"], + }, + "password": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "radio": { + implicitRole: ["radio"], + validRoles: ["menuitemradio"], + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-required"], + otherDisallowedAriaAttributes: ["aria-checked"] + }, + "range": { + implicitRole: ["slider"], + validRoles: null, + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-valuemax", "aria-valuemin"] + }, + "reset": { + implicitRole: ["button"], + validRoles: ["checkbox", "combobox", "gridcell", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "slider", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true + }, + "search-no-list": { + implicitRole: ["searchbox"], + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"] + }, + "search-with-list": { + implicitRole: ["combobox"], + validRoles: null, + globalAriaAttributesValid: true + }, + "submit": { + implicitRole: ["button"], + validRoles: ["checkbox", "combobox", "gridcell", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "slider", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true + }, + "tel-no-list": { + implicitRole: ["textbox"], + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"] + }, + "tel-with-list": { + implicitRole: ["combobox"], + validRoles: null, + globalAriaAttributesValid: true + }, + "text-no-list": { + implicitRole: ["textbox"], + validRoles: ["combobox", "searchbox", "spinbutton"], + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"] + }, + "text-with-list": { + implicitRole: ["combobox"], + validRoles: null, + globalAriaAttributesValid: true + // otherDisallowedAriaAttributes: ["aria-haspopup"] // covered in a different rule + }, + "time": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "url-no-list": { + implicitRole: ["textbox"], + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"] + }, + "url-with-list": { + implicitRole: ["combobox"], + validRoles: null, + globalAriaAttributesValid: true + }, + "week": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "default-with-list": { + // input with a missing or invalid type, with a list attribute + implicitRole: ["combobox"], + validRoles: null, + globalAriaAttributesValid: true + }, + "default-no-list": { + // input with a missing or invalid type, with a list attribute + implicitRole: ["textbox"], + validRoles: null, + globalAriaAttributesValid: true + } + }, + "li": { + "child-of-list-role": { + implicitRole: ['listitem'], + validRoles: null, + globalAriaAttributesValid: true + }, + "no-child-of-list-role": { + implicitRole: ['generic'], + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "section": { + "with-name": { + implicitRole: ["region"], + validRoles: ["alert", "alertdialog", "application", "banner", "complementary", "contentinfo", "dialog", "doc-abstract", "doc-acknowledgments", "doc-afterword", "doc-appendix", "doc-bibliography", "doc-chapter", "doc-colophon", "doc-conclusion", "doc-credit", "doc-credits", "doc-dedication", "doc-endnotes", "doc-epigraph", "doc-epilogue", "doc-errata", "doc-example", "doc-foreword", "doc-glossary", "doc-index", "doc-introduction", "doc-notice", "doc-pagelist", "doc-part", "doc-preface", "doc-prologue", "doc-pullquote", "doc-qna", "doc-toc", "document", "feed", "group", "log", "main", "marquee", "navigation", "none", "note", "presentation", "search", "status", "tabpanel"], + globalAriaAttributesValid: true + }, + "without-name": { + implicitRole: null, + validRoles: ["alert", "alertdialog", "application", "banner", "complementary", "contentinfo", "dialog", "doc-abstract", "doc-acknowledgments", "doc-afterword", "doc-appendix", "doc-bibliography", "doc-chapter", "doc-colophon", "doc-conclusion", "doc-credit", "doc-credits", "doc-dedication", "doc-endnotes", "doc-epigraph", "doc-epilogue", "doc-errata", "doc-example", "doc-foreword", "doc-glossary", "doc-index", "doc-introduction", "doc-notice", "doc-pagelist", "doc-part", "doc-preface", "doc-prologue", "doc-pullquote", "doc-qna", "doc-toc", "document", "feed", "group", "log", "main", "marquee", "navigation", "none", "note", "presentation", "search", "status", "tabpanel"], + globalAriaAttributesValid: true + } + }, + "select": { + "no-multiple-attr-size-gt1": { + //roleCondition: " with a multiple attribute or a size attribute having value greater than 1" + implicitRole: ["combobox"], + validRoles: ["menu"], + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-multiselectable"] + }, + "multiple-attr-size-gt1": { + //roleCondition: " with no multiple attribute and no size attribute having value greater than 1" + implicitRole: ["listbox"], + validRoles: null, + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-multiselectable"] + } + }, + "summary": { + "first-summary-of-detail": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-disabled", "aria-haspopup"] + }, + "no-first-summary-of-detail": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "tbody": { + "des-table": { + implicitRole: ["rowgroup"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "des-grid": { + implicitRole: ["rowgroup"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "des-treegrid": { + implicitRole: ["rowgroup"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "des-other": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "td": { + "des-table": { + implicitRole: ["cell"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-grid": { + implicitRole: ["gridcell"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-treegrid": { + implicitRole: ["gridcell"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-other": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "th": { + "des-table-row-scope": { + implicitRole: ["rowheader", "cell"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-table-column-scope": { + implicitRole: ["columnheader", "cell"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-grid-treegrid-row-scope": { + implicitRole: ["rowheader", "gridcell"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-grid-treegrid-column-scope": { + implicitRole: ["columnheader", "gridcell"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-other": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "tr": { + "des-table": { + implicitRole: ["row"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-grid": { + implicitRole: ["row"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-treegrid": { + implicitRole: ["row"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-other": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "default": { + implicitRole: null, + //roleCondition: "", + validRoles: ["any"], + globalAriaAttributesValid: true + } + }; // end of documentConformanceRequirementSpecialTags + // map aria attribute to the corresponding native attribute, apply to any element applicable + // note this mapping is for the related attributes in the same element without checking the parent tree. + // refer to https://w3c.github.io/html-aria/ + ARIADefinitions.relatedAriaHtmlAttributes = { + "aria-checked": { + conflict: [{ + ariaAttributeValue: "false", + htmlAttributeNames: ["checked"], + htmlAttributeValues: null + }], + overlapping: [{ + ariaAttributeValue: "true", + htmlAttributeNames: ["checked"], + htmlAttributeValues: null + }] + }, + "aria-disabled": { + conflict: [{ + ariaAttributeValue: "false", + htmlAttributeNames: ["disabled"], + htmlAttributeValues: null + }], + overlapping: [{ + ariaAttributeValue: "true", + htmlAttributeNames: ["disabled"], + htmlAttributeValues: null + }] + }, + "aria-hidden": { + conflict: [{ + ariaAttributeValue: "false", + htmlAttributeNames: ["hidden"], + htmlAttributeValues: ["hidden,null"] + }, + { + ariaAttributeValue: "true", + htmlAttributeNames: ["hidden"], + htmlAttributeValues: ["until-found"] + }], + overlapping: [{ + ariaAttributeValue: "true", + htmlAttributeNames: ["hidden"], + htmlAttributeValues: ["hidden,null"] + }] + }, + "aria-placeholder": { + conflict: [{ + ariaAttributeValue: null, + htmlAttributeNames: ["placeholder"], + htmlAttributeValues: null + }] + }, + "aria-valuemax": { + conflict: [{ + ariaAttributeValue: null, + htmlAttributeNames: ["max"], + htmlAttributeValues: null + }] + //overlap case covered in the role definition: Authors SHOULD NOT use aria-valuemax on any element which allows the max attribute. Use the max attribute instead. + }, + "aria-valuemin": { + conflict: [{ + ariaAttributeValue: null, + htmlAttributeNames: ["min"], + htmlAttributeValues: null + }] + ////overlap case covered in the role definition:Authors SHOULD NOT use aria-valuemin on any element which allows the min attribute. Use the min attribute instead. + }, + "aria-readonly": { + conflict: [{ + ariaAttributeValue: "false", + htmlAttributeNames: ["readonly", "contenteditable", "iscontenteditable"], + htmlAttributeValues: [null, "false", "false"] + }], + overlapping: [{ + ariaAttributeValue: "true", + htmlAttributeNames: ["readonly", "contenteditable", "iscontenteditable"], + htmlAttributeValues: [null, "true", "true"] + }] + }, + "aria-required": { + conflict: [{ + ariaAttributeValue: "false", + htmlAttributeNames: ["required"], + htmlAttributeValues: null + }], + overlapping: [{ + ariaAttributeValue: "true", + htmlAttributeNames: ["required"], + htmlAttributeValues: null + }] + }, + "aria-colspan": { + conflict: [{ + // conflict occurs if both values are different + ariaAttributeValue: "VALUE", + htmlAttributeNames: ["colspan"], + htmlAttributeValues: ["VALUE"] + }], + overlapping: [{ + // overlap occurs if both exists + ariaAttributeValue: null, + htmlAttributeNames: ["colspan"], + htmlAttributeValues: null + }] + }, + "aria-rowspan": { + conflict: [{ + // conflict occurs if both values are different + ariaAttributeValue: "VALUE", + htmlAttributeNames: ["rowspan"], + htmlAttributeValues: ["VALUE"] + }], + overlapping: [{ + // overlap occurs if both exists + ariaAttributeValue: null, + htmlAttributeNames: ["rowspan"], + htmlAttributeValues: null + }] + }, + /** "aria-autocomplete": { + conflict: [{ + // conflict occurs if both exists, aria value is only for custom widget, rather than native + ariaAttributeValue: null, + htmlAttributeNames: ["autocomplete"], + htmlAttributeValues: null + }] + } */ + }; + ARIADefinitions.containers = []; + return ARIADefinitions; +}()); +exports.ARIADefinitions = ARIADefinitions; +; +var containerArray = []; +for (var roleDesign in ARIADefinitions.designPatterns) { + var containers = ARIADefinitions.designPatterns[roleDesign].container; + if (containers !== null) { + for (var _i = 0, containers_1 = containers; _i < containers_1.length; _i++) { + var container = containers_1[_i]; + if (containerArray.indexOf(container) == -1) { + containerArray.push(container); + } + } + } +} +ARIADefinitions.containers = containerArray; + + +/***/ }, + +/***/ "./src/v2/aria/ARIAMapper.ts" +/*!***********************************!*\ + !*** ./src/v2/aria/ARIAMapper.ts ***! + \***********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ARIAMapper = void 0; +var ARIADefinitions_1 = __webpack_require__(/*! ./ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var CommonMapper_1 = __webpack_require__(/*! ../common/CommonMapper */ "./src/v2/common/CommonMapper.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../../v4/util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../../v4/util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var ARIAWalker_1 = __webpack_require__(/*! ./ARIAWalker */ "./src/v2/aria/ARIAWalker.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../../v4/util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../../v4/util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var ARIAMapper = /** @class */ (function (_super) { + __extends(ARIAMapper, _super); + function ARIAMapper() { + return _super !== null && _super.apply(this, arguments) || this; + } + ARIAMapper.prototype.childrenCanHaveRole = function (node, role) { + // if (node.nodeType === 1 /* Node.ELEMENT_NODE */) { + // const elem = node as Element; + // if (elem.getAttribute("aria-hidden") === "true") { + // return false; + // } + // } + return !(role in ARIADefinitions_1.ARIADefinitions.designPatterns && ARIADefinitions_1.ARIADefinitions.designPatterns[role].presentationalChildren); + }; + ARIAMapper.prototype.getRole = function (node) { + var role = ARIAMapper.nodeToRole(node); + return role; + }; + ARIAMapper.prototype.getNamespace = function () { + return "aria"; + }; + ARIAMapper.prototype.getAttributes = function (node) { + var retVal = {}; + if (node.nodeType === 1 /* Node.ELEMENT_NODE */) { + var cacheVal = CacheUtil_1.CacheUtil.getCache(node, "ARIAMapper::getAttributes", undefined); + if (typeof cacheVal !== "undefined") + return cacheVal; + var elem = node; + for (var idx = 0; idx < elem.attributes.length; ++idx) { + var attrInfo = elem.attributes[idx]; + var name_1 = attrInfo.name.toLowerCase(); + if (name_1.startsWith("aria-")) { + retVal[name_1.substring(5)] = attrInfo.nodeValue; + } + } + // Optimize: Cache nodeName.toLowerCase() to avoid repeated calls + var nodeName = node.nodeName.toLowerCase(); + // Apply global attributes first + ARIAMapper.applyAttrRole(elem, "global", retVal); + // Apply element-specific attributes + ARIAMapper.applyAttrRole(elem, nodeName, retVal); + CacheUtil_1.CacheUtil.setCache(node, "ARIAMapper::getAttributes", retVal); + } + else if (node.nodeType === 3 /* Node.TEXT_NODE */) { + var calculators = ARIAMapper.textAttrValueCalculators; + for (var attr in calculators) { + var val = calculators[attr](node); + if (typeof val !== "undefined" && val !== null) { + retVal[attr] = val; + } + } + } + return retVal; + }; + // Optimize: Move applyAttrRole outside getAttributes to avoid function recreation + ARIAMapper.applyAttrRole = function (elem, nodeName, retVal) { + var calculators = ARIAMapper.elemAttrValueCalculators; + if (!(nodeName in calculators)) + return; + for (var attr in calculators[nodeName]) { + if (!(attr in retVal)) { + var value = calculators[nodeName][attr]; + if (typeof value !== "undefined" && value !== null) { + if (typeof value !== "string") { + value = value(elem); + } + retVal[attr] = value; + } + } + } + }; + ARIAMapper.getAriaOwnedBy = function (elem) { + var doc = fragment_1.FragmentUtil.getOwnerFragment(elem); + if (!CacheUtil_1.CacheUtil.getCache(doc, "ARIAMapper::precalcOwned", false)) { + var owners = doc.querySelectorAll("[aria-owns]"); + for (var iOwner = 0; iOwner < owners.length; ++iOwner) { + var owner = owners[iOwner]; + var ownIds = owner.getAttribute("aria-owns").split(/ +/g); + var _loop_1 = function (iId) { + var owned = doc.getElementById(ownIds[iId]); + //ignore if the aria-owns point to the element itself + //if (owned && !DOMUtil.sameNode(owner, owned)) { + // CacheUtil.setCache(owned, "aria-owned", owner); + //} + /** + * circular hierarchy check: + * (1) the owned element is neither the same element with the owner nor any ascendant of the owner + * (2) any child with aria-owns cannot point to the owner or any ascendant of the owner + */ + if (owned && !DOMUtil_1.DOMUtil.sameNode(owner, owned)) { + // check if the owned with aria-owns that points to another element + var ownedNodes = []; + var sub_owners = owned.querySelectorAll("[aria-owns]"); + for (var i = 0; i < sub_owners.length; ++i) { + var sub_owner = sub_owners[i]; + var sub_ownIds = sub_owner.getAttribute("aria-owns").split(/ +/g); + for (var j = 0; j < sub_ownIds.length; ++j) { + var ownedNode = doc.getElementById(sub_ownIds[j]); + if (ownedNode) + ownedNodes.push(ownedNode); + } + } + if (ownedNodes.length === 0) { + CacheUtil_1.CacheUtil.setCache(owned, "aria-owned", owner); + return "continue"; + } + // check if any aria-owns points to the element itself or any of it's parent + var parent_1 = owner; + var circular = false; + while (parent_1 !== null) { + var found = ownedNodes.some(function (item) { return DOMUtil_1.DOMUtil.sameNode(parent_1, item); }); + if (!found) + parent_1 = DOMWalker_1.DOMWalker.parentElement(parent_1); + else { + circular = true; + break; + } + } + if (!circular) + CacheUtil_1.CacheUtil.setCache(owned, "aria-owned", owner); + } + }; + for (var iId = 0; iId < ownIds.length; ++iId) { + _loop_1(iId); + } + } + CacheUtil_1.CacheUtil.setCache(doc, "ARIAMapper::precalcOwned", true); + } + return CacheUtil_1.CacheUtil.getCache(elem, "aria-owned", null); + }; + ARIAMapper.prototype.getNodeHierarchy = function (node) { + if (!node) + return []; + if (node.nodeType !== 1) { + var parentHierarchy = this.getNodeHierarchy(DOMWalker_1.DOMWalker.parentElement(node)); + var parentInfo = parentHierarchy.length > 0 ? parentHierarchy[parentHierarchy.length - 1] : { + role: "", + rolePath: "", + roleCount: {}, + childrenCanHaveRole: true + }; + var nodeHierarchy = []; + // Set hierarchy + for (var _i = 0, parentHierarchy_1 = parentHierarchy; _i < parentHierarchy_1.length; _i++) { + var item = parentHierarchy_1[_i]; + nodeHierarchy.push(item); + } + nodeHierarchy.push({ + attributes: {}, + bounds: this.getBounds(node), + namespace: this.getNamespace(), + node: node, + role: this.getRole(node) || null, + rolePath: parentInfo.rolePath + "/" + (this.getRole(node) || null), + roleCount: {}, + childrenCanHaveRole: parentInfo.childrenCanHaveRole + }); + return nodeHierarchy; + } + else { + var elem = node; + var nodeHierarchy = CacheUtil_1.CacheUtil.getCache(elem, "ARIAMapper::getNodeHierarchy", null); + if (!nodeHierarchy) { + // This element hasn't been processed yet - but ::reset processes them all in the right order + // Get details about the correct parent first + var parent_2 = ARIAMapper.getAriaOwnedBy(elem); + if (!parent_2) { + parent_2 = DOMWalker_1.DOMWalker.parentElement(elem); + } + while (parent_2 && parent_2.nodeType !== 1) { + parent_2 = DOMWalker_1.DOMWalker.parentElement(elem); + } + var parentHierarchy = parent_2 ? this.getNodeHierarchy(parent_2) : []; + var parentInfo = parentHierarchy.length > 0 ? parentHierarchy[parentHierarchy.length - 1] : { + role: "", + rolePath: "", + roleCount: {}, + childrenCanHaveRole: true + }; + while (parentInfo.role === null) { + parent_2 = ARIAMapper.getAriaOwnedBy(parent_2) || DOMWalker_1.DOMWalker.parentElement(parent_2); + parentHierarchy = parent_2 ? this.getNodeHierarchy(parent_2) : []; + parentInfo = parentHierarchy[parentHierarchy.length - 1]; + } + // Set initial node info + var nodeInfo = { + attributes: elem.nodeType === 1 ? this.getAttributes(elem) : {}, + bounds: this.getBounds(elem), + namespace: this.getNamespace(), + node: elem, + role: this.getRole(elem) || null, + rolePath: "", + roleCount: {}, + childrenCanHaveRole: true + }; + // Adjust role if we're within a presentational container + var presentationalContainer = !parentInfo.childrenCanHaveRole; + if (presentationalContainer) { + nodeInfo.role = null; + } + else { + nodeInfo.childrenCanHaveRole = parentInfo.childrenCanHaveRole + && this.childrenCanHaveRole(elem, nodeInfo.role); + } + // Set the paths + if (nodeInfo.role !== null) { + parentInfo.roleCount[nodeInfo.role] = (parentInfo.roleCount[nodeInfo.role] || 0) + 1; + nodeInfo.rolePath = parentInfo.rolePath + "/" + nodeInfo.role + "[" + parentInfo.roleCount[nodeInfo.role] + "]"; + } + else { + nodeInfo.rolePath = parentInfo.rolePath; + } + // Set hierarchy + nodeHierarchy = []; + for (var _a = 0, parentHierarchy_2 = parentHierarchy; _a < parentHierarchy_2.length; _a++) { + var item = parentHierarchy_2[_a]; + nodeHierarchy.push(item); + } + nodeHierarchy.push(nodeInfo); + CacheUtil_1.CacheUtil.setCache(elem, "ARIAMapper::getNodeHierarchy", nodeHierarchy); + } + return nodeHierarchy; + } + }; + ARIAMapper.prototype.reset = function (node) { + ARIAMapper.nameComputationId = 0; + this.hierarchyRole = []; + this.hierarchyResults = []; + this.hierarchyPath = [{ + rolePath: "", + roleCount: {} + }]; + // Get to the topmost node + var goodNode = node; + var next; + while (next = DOMWalker_1.DOMWalker.parentNode(goodNode)) { + goodNode = next; + } + ; + // Walk the tree and set the hierarchies in the right order + var ariaWalker = new ARIAWalker_1.ARIAWalker(goodNode, false, goodNode); + do { + if (ariaWalker.node.nodeType === 1) { + this.getNodeHierarchy(ariaWalker.node); + } + } while (ariaWalker.nextNode()); + }; + ARIAMapper.prototype.openScope = function (node) { + if (this.hierarchyRole === null) { + this.reset(node); + } + this.pushHierarchy(node); + for (var idx = 0; idx < this.hierarchyResults.length; ++idx) { + if (this.hierarchyResults[idx].role && this.hierarchyResults[idx].role[0] === "/") { + this.hierarchyResults[idx].role = (this.hierarchyResults[idx].role ? this.hierarchyResults[idx].role.substring(1) : null); + } + } + return this.hierarchyResults; + }; + ARIAMapper.prototype.pushHierarchy = function (node) { + // If we're not an element, no special handling + var nodeHierarchy = []; + // Determine our node info + nodeHierarchy = this.getNodeHierarchy(node); + var nodeInfo = nodeHierarchy[nodeHierarchy.length - 1]; + this.hierarchyRole.push(nodeInfo.role); + if (nodeInfo.role !== null) { + this.hierarchyPath.push(nodeInfo); + } + this.hierarchyResults = nodeHierarchy; + }; + ARIAMapper.prototype.closeScope = function (node) { + var retVal = []; + for (var _i = 0, _a = this.hierarchyResults; _i < _a.length; _i++) { + var res = _a[_i]; + // const temp = res.node; + // res.node = null; + // let cloned = JSON.parse(JSON.stringify(res)); + // cloned.node = res.node = temp; + // retVal.push(cloned); + retVal.push(res); + } + if (retVal.length > 0) { + retVal[retVal.length - 1].role = "/" + retVal[retVal.length - 1].role; + var parent_3 = DOMWalker_1.DOMWalker.parentElement(node); + this.hierarchyResults = parent_3 ? CacheUtil_1.CacheUtil.getCache(parent_3, "ARIAMapper::getNodeInfo", []) : []; + } + return retVal; + }; + /**public static computeName(cur: Node) : string { + ++ARIAMapper.nameComputationId; + return ARIAMapper.computeNameHelp(ARIAMapper.nameComputationId, cur, false, false); + } + + public static computeNameHelp(walkId: number, cur: Node, labelledbyTraverse: boolean, walkTraverse: boolean) : string { + // 2g. None of the other content applies to text nodes, so just do this first + if (cur.nodeType === 3 ) return cur.nodeValue; + if (cur.nodeType === 11) return ""; + if (cur.nodeType !== 1 ) { + if (walkTraverse || labelledbyTraverse) return ""; + throw new Error ("Can only compute name on Element and Text " + cur.nodeType); + } + + const elem = cur as Element; + // We've been here before - prevent recursion + if (CacheUtil.getCache(elem, "data-namewalk", null) === ""+walkId) return ""; + CacheUtil.setCache(elem, "data-namewalk", ""+walkId); + // See https://www.w3.org/TR/html-aam-1.0/#input-type-text-input-type-password-input-type-search-input-type-tel-input-type-url-and-textarea-element + + // 2a. Only show hidden content if it's referenced by a labelledby + if (!labelledbyTraverse && !VisUtil.isNodeVisible(cur)) { + return ""; + } + + // 2b. collect valid id references + if (!labelledbyTraverse && elem.hasAttribute("aria-labelledby")) { + let labelledby = elem.getAttribute("aria-labelledby").split(" "); + let validElems = []; + for (const ref of labelledby) { + const refElem = FragmentUtil.getById(cur, ref); + if (refElem && !DOMUtil.sameNode(elem, refElem)) { + validElems.push(refElem); + } + } + if (validElems.length > 0) { + let accumulated = ""; + for (const elem of validElems) { + accumulated += " " + this.computeNameHelp(walkId, elem, true, false); + } + return accumulated.trim(); + } + } + + // Since nodeToRole calls back here for form and section, we need special casing here to handle those two cases + if (["section", "form"].includes(cur.nodeName.toLowerCase())) { + if (elem.hasAttribute("aria-label") && elem.getAttribute("aria-label").trim().length > 0) { + // If I'm not an embedded control or I'm not recursing, return the aria-label + if (!labelledbyTraverse && !walkTraverse) { + return elem.getAttribute("aria-label").trim(); + } + } + if (elem.hasAttribute("title")) { + return elem.getAttribute("title"); + } + return ""; + } + + // 2c. If label or walk, and this is a control, skip to the value, otherwise provide the label + const role = ARIAMapper.nodeToRole(cur); + let isEmbeddedControl = [ + "textbox", "button", "combobox", "listbox", + "progressbar", "scrollbar", "slider", "spinbutton" + ].includes(role); + if (elem.hasAttribute("aria-label") && elem.getAttribute("aria-label").trim().length > 0) { + // If I'm not an embedded control or I'm not recursing, return the aria-label + if (!labelledbyTraverse && !walkTraverse || !isEmbeddedControl) { + return elem.getAttribute("aria-label").trim(); + } + } + + // 2d. + if (role !== "presentation" && role !== "none") { + if ((cur.nodeName.toLowerCase() === "img" || cur.nodeName.toLowerCase() === "area") && elem.hasAttribute("alt")) { + return DOMUtil.cleanWhitespace(elem.getAttribute("alt")).trim(); + } + + if (cur.nodeName.toLowerCase() === "input" && elem.hasAttribute("id") && elem.getAttribute("id").length > 0) { + let label = elem.ownerDocument.querySelector("label[for='"+elem.getAttribute("id")+"']"); + if (label) { + if (label.hasAttribute("aria-label") || (label.hasAttribute("aria-labelledby") && !CommonUtil.isIdReferToSelf(cur, label.getAttribute("aria-labelledby")))) { + return this.computeNameHelp(walkId, label, false, false); + } else { + return label.textContent; + } + } + } + if (cur.nodeName.toLowerCase() === "fieldset") { + if( (<Element>cur).querySelector("legend")){ + let legend = (<Element>cur).querySelector("legend"); + return legend.innerText; + }else{ + return this.computeNameHelp(walkId, cur, false, false); + } + + } + + } + + // 2e. + if ((walkTraverse || labelledbyTraverse) && isEmbeddedControl) { + // If the embedded control has role textbox, return its value. + if (role === "textbox") { + if (elem.nodeName.toLowerCase() === "input") { + if (elem.hasAttribute("value")) return elem.getAttribute("value"); + } else { + walkTraverse = false; + } + } + + // If the embedded control has role button, return the text alternative of the button. + if (role === "button") { + if (elem.nodeName.toLowerCase() === "input") { + let type = elem.getAttribute("type").toLowerCase(); + if (["button", "submit", "reset"].includes(type)) { + if (elem.hasAttribute("value")) return elem.getAttribute("value"); + if (type === "submit") return "Submit"; + if (type === "reset") return "Reset"; + } + } else { + walkTraverse = false; + } + } + + // TODO: If the embedded control has role combobox or listbox, return the text alternative of the chosen option. + if (role === "combobox") { + if (elem.hasAttribute("aria-activedescendant")) { + let selected = FragmentUtil.getById(elem, "aria-activedescendant"); + if (selected && !DOMUtil.sameNode(elem, selected)) { + return ARIAMapper.computeNameHelp(walkId, selected, false, false); + } + } + } + + // If the embedded control has role range (e.g., a spinbutton or slider): + if (["progressbar", "scrollbar", "slider", "spinbutton"].includes(role)) { + // If the aria-valuetext property is present, return its value, + if (elem.hasAttribute("aria-valuetext")) return elem.getAttribute("aria-valuetext"); + // Otherwise, if the aria-valuenow property is present, return its value, + if (elem.hasAttribute("aria-valuenow")) return elem.getAttribute("aria-valuenow"); + // TODO: Otherwise, use the value as specified by a host language attribute. + } + } + + // 2f. 2h. + if (walkTraverse || ARIADefinitions.nameFromContent(role) || labelledbyTraverse) { + // 2fi. Set the accumulated text to the empty string. + let accumulated = ""; + // 2fii. Check for CSS generated textual content associated with the current node and + // include it in the accumulated text. The CSS :before and :after pseudo elements [CSS2] + // can provide textual content for elements that have a content model. + // For :before pseudo elements, User agents MUST prepend CSS textual content, without + // a space, to the textual content of the current node. + // For :after pseudo elements, User agents MUST append CSS textual content, without a + // space, to the textual content of the current node. + let before = null; + before = elem.ownerDocument.defaultView.getComputedStyle(elem,"before").content; + + if (before && before !== "none") { + before = before.replace(/^"/,"").replace(/"$/,""); + accumulated += before; + } + // 2fiii. For each child node of the current node: + // Set the current node to the child node. + // Compute the text alternative of the current node beginning with step 2. Set the result + // to that text alternative. + // Append the result to the accumulated text. + if (elem.nodeName.toUpperCase() === "SLOT") { + //if no assignedNode, check its own text + if (!(elem as HTMLSlotElement).assignedNodes() || (elem as HTMLSlotElement).assignedNodes().length === 0) { + let innerText = CommonUtil.getInnerText(elem); + if (innerText && innerText !== null && innerText.trim().length > 0) + accumulated += " " + innerText; + } else { + // check text from all assigned nodes + for (const slotChild of (elem as HTMLSlotElement).assignedNodes()) { + let nextChildContent = ARIAMapper.computeNameHelp(walkId, slotChild, labelledbyTraverse, true); + accumulated += " " + nextChildContent; + } + } + } else { + let walkChild = elem.firstChild; + while (walkChild) { + let nextChildContent = ARIAMapper.computeNameHelp(walkId, walkChild, labelledbyTraverse, true); + accumulated += " " + nextChildContent; + walkChild = walkChild.nextSibling; + } + } + + let after = null; + try { + after = elem.ownerDocument.defaultView.getComputedStyle(elem,"after").content; + } catch (e) {} + + if (after && after !== "none") { + after = after.replace(/^"/,"").replace(/"$/,""); + accumulated += after; + } + // 2fiv. Return the accumulated text. + accumulated = accumulated.replace(/\s+/g," ").trim(); + if (accumulated.trim().length > 0) { + return accumulated; + } + } + + // 2i. Otherwise, if the current node has a Tooltip attribute, return its value. + if (elem.hasAttribute("title")) { + return elem.getAttribute("title"); + } + if (elem.tagName.toLowerCase() === "svg") { + let title = elem.querySelector("title"); + if (title) { + return title.textContent || title.innerText; + } + } + + return ""; + } + */ + /* if (role in ARIADefinitions.designPatterns + && ARIADefinitions.designPatterns[role].nameFrom + && ARIADefinitions.designPatterns[role].nameFrom.includes("contents")) + { + name = elem.textContent; + } + if (elem.nodeName.toLowerCase() === "input" && elem.hasAttribute("id") && elem.getAttribute("id").trim().length > 0) { + name = elem.ownerDocument.querySelector("label[for='"+elem.getAttribute("id").trim()+"']").textContent; + } + if (elem.hasAttribute("aria-label")) { + name = elem.getAttribute("aria-label"); + } + if (elem.hasAttribute("aria-labelledby")) { + name = ""; + const ids = elem.getAttribute("aria-labelledby").split(" "); + for (const id of ids) { + name += FragmentUtil.getById(elem, id).textContent + " "; + } + name = name.trim(); + } + return name; + }*/ + ARIAMapper.nodeToRole = function (node) { + if (node.nodeType === 3 /* Node.TEXT_NODE */) { + return "text"; + } + else if (node.nodeType !== 1 /* Node.ELEMENT_NODE */) { + return null; + } + var elem = node; + if (!elem || elem.nodeType !== 1 /* Node.ELEMENT_NODE */) { + return null; + } + // TO DO: use AriaUtil.getResolvedRole(elem) to replace the code following, which uses only the valid roles for the element based on the aria fallback rule + //const role = AriaUtil.getResolvedRole(elem); + //return role === "presentation" || role === "none" ? null : role; + if (elem.hasAttribute("role") && elem.getAttribute("role").trim().length > 0) { + var roleStr = elem.getAttribute("role").trim(); + var roles_2 = roleStr.split(" "); + for (var _i = 0, roles_1 = roles_2; _i < roles_1.length; _i++) { + var role_1 = roles_1[_i]; + if (role_1 === "presentation" || role_1 === "none") { + // If element is focusable, then presentation roles are to be ignored + if (!CommonUtil_1.CommonUtil.isFocusable(elem)) { + return null; + } + } + else if (role_1 in ARIADefinitions_1.ARIADefinitions.designPatterns) { + return role_1; + } + } + } + //return this.elemToImplicitRole(elem); + var roles = AriaUtil_1.AriaUtil.getImplicitRole(elem); + //console.log("node=" + node.nodeName +", role= " + (roles ? roles[0] : null) +", resolved=" + AriaUtil.getResolvedRole(elem)); + var role = !roles || roles.length === 0 ? null : roles[0]; + return role === "presentation" || role === "none" ? null : role; + //return AriaUtil.getResolvedRole(elem); + }; + //////////////////////////////////////////////////////////////////////////// + // Helper functions + //// + // https://www.w3.org/TR/html-aam-1.0/#mapping-html-to-accessibility-apis + ARIAMapper.elemAttrValueCalculators = { + "global": { + "name": function (elem) { var _a; return (_a = AccNameUtil_1.AccNameUtil.computeAccessibleName(elem)) === null || _a === void 0 ? void 0 : _a.name; } //ARIAMapper.computeName + }, + "datalist": { + // set to "true" if the datalist's selection model allows multiple option elements to be + // selected at a time, and "false" otherwise + "multiselectable": function (elem) { + var id = elem.getAttribute("id"); + if (id && id.length > 0) { + var input = elem.ownerDocument.querySelector("input[list='" + id + "']"); + return "" + (elem.getAttribute("multiple") + && (elem.getAttribute("multiple") == "true" || elem.getAttribute("multiple") == "")); + } + return null; + } + }, + "h1": { + "level": "1" + }, + "h2": { + "level": "2" + }, + "h3": { + "level": "3" + }, + "h4": { + "level": "4" + }, + "h5": { + "level": "5" + }, + "h6": { + "level": "6" + }, + "input": { + // - type="checkbox" state set to "mixed" if the element's indeterminate IDL attribute + // is true, or "true" if the element's checkedness is true, or "false" otherwise + // - type="radio" state set to "true" if the element's checkedness is true, or "false" + // otherwise. + "checked": function (elem) { + var type = elem.getAttribute("type"); + if (type === "checkbox" || type === "radio") { + return "" + elem.checked; + } + return null; + } + // - type="radio" and not in menu reflecting number of type=radio input elements + // within the radio button group + , + "setsize": function (elem) { return null; // removed by dead control flow + } + // - type="radio" and not in menu value reflecting the elements position + // within the radio button group." + , + "posinset": function (elem) { return null; // removed by dead control flow + } + // input (type attribute in the Text, Search, Telephone, URL, or E-mail states with a + // suggestions source element) combobox role, with the aria-owns property set to the same + // value as the list attribute + , + "owns": function (elem) { return null; // removed by dead control flow + } + }, + "keygen": { + "multiselectable": "false" + }, + "li": { + // Number of li elements within the ol, ul, menu + "setsize": function (elem) { + var parent = DOMUtil_1.DOMUtil.getAncestor(elem, ["ol", "ul", "menu"]); + if (!parent) + return null; + var lis = CacheUtil_1.CacheUtil.getSetCache(parent, "elemAttrValueCalculators::lis", function () { return parent.querySelectorAll("li"); }); + var otherlis = CacheUtil_1.CacheUtil.getSetCache(parent, "elemAttrValueCalculators::otherlis", function () { return parent.querySelectorAll("ol li, ul li, menu li"); }); + return "" + (lis.length - otherlis.length); + } + // Position of li element within the ol, ul, menu + , + "posinset": function (elem) { + var parent = DOMUtil_1.DOMUtil.getAncestor(elem, ["ol", "ul", "menu"]); + if (!parent) + return null; + var lis = CacheUtil_1.CacheUtil.getSetCache(parent, "elemAttrValueCalculators::lis", function () { return parent.querySelectorAll("li"); }); + var num = 0; + for (var idx = 0; idx < lis.length; ++idx) { + var li = lis[idx]; + if (DOMUtil_1.DOMUtil.sameNode(parent, DOMUtil_1.DOMUtil.getAncestor(li, ["ol", "ul", "menu"]))) { + return "" + num; + } + ++num; + } + return null; + } + }, + "menuitem": { + // type = checkbox or radio, set to "true" if the checked attribute + // is present, and "false" otherwise + "checked": function (elem) { return "" + !!(elem.getAttribute("checked") + && (elem.getAttribute("checked") == "true" || elem.getAttribute("checked") == "")); } + }, + "option": { + // set to "true" if the element's selectedness is true, or "false" otherwise. + "selected": function (elem) { return "" + !!(elem.getAttribute("selected") + && (elem.getAttribute("selected") == "true" || elem.getAttribute("selected") == "")); } + }, + "progress": { + "valuemax": function (elem) { return elem.getAttribute("max") || "1"; }, + "valuemin": function (elem) { return "0"; }, + "valuenow": function (elem) { return elem.getAttribute("value"); } + } + }; + ARIAMapper.textAttrValueCalculators = { + "name": function (node) { return node.nodeValue; } + }; + ARIAMapper.nameComputationId = 0; + return ARIAMapper; +}(CommonMapper_1.CommonMapper)); +exports.ARIAMapper = ARIAMapper; + + +/***/ }, + +/***/ "./src/v2/aria/ARIAWalker.ts" +/*!***********************************!*\ + !*** ./src/v2/aria/ARIAWalker.ts ***! + \***********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ARIAWalker = void 0; +var fragment_1 = __webpack_require__(/*! ../checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var ARIAMapper_1 = __webpack_require__(/*! ./ARIAMapper */ "./src/v2/aria/ARIAMapper.ts"); +var VisUtil_1 = __webpack_require__(/*! ../../v4/util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +/** + * Walks in an ARIA order + * + * See also ../dom/DOMWalker + */ +var ARIAWalker = /** @class */ (function () { + function ARIAWalker(element, bEnd, root) { + this.root = root || element; + if (this.root.nodeType === 9) { + this.root = this.root.documentElement; + } + this.node = element; + // if (this.node.nodeType === 9) { + // this.node = (this.node as Document).documentElement + // } + this.bEndTag = (bEnd == undefined ? false : bEnd == true); + } + ARIAWalker.prototype.atRoot = function () { + if (this.ownerElement) + return false; + if (this.root === this.node) { + return true; + } + else if (this.root.isSameNode) { + return this.root.isSameNode(this.node); + } + else if (this.root.compareDocumentPosition) { + return this.root.compareDocumentPosition(this.node) === 0; + } + else { + // Not supported in this environment - try our best + return this.node.parentNode === null; + } + }; + ARIAWalker.prototype.nextNode = function () { + var skipOwned = false; + do { + skipOwned = false; + // console.log(this.node.nodeName, this.bEndTag?"END":"START", this.node.nodeType === 1 && (this.node as any).getAttribute("id")); + if (!this.bEndTag) { + var iframeNode = this.node; + var elementNode = this.node; + var slotElement = this.node; + if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && this.node.nodeName.toUpperCase() === "IFRAME" + && VisUtil_1.VisUtil.isNodeVisible(iframeNode) + && iframeNode.contentDocument + && iframeNode.contentDocument.documentElement) { + var ownerElement = this.node; + this.node = iframeNode.contentDocument.documentElement; + this.node.ownerElement = ownerElement; + } + else if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && VisUtil_1.VisUtil.isNodeVisible(elementNode) + && elementNode.shadowRoot + && elementNode.shadowRoot.firstChild) { + var ownerElement = this.node; + this.node = elementNode.shadowRoot; + this.node.ownerElement = ownerElement; + DOMWalker_1.DOMWalker.assignSlots(this.node); + } + else if (this.node.nodeType === 1 + && elementNode.nodeName.toLowerCase() === "slot" + && slotElement.assignedNodes().length > 0) { + this.node = slotElement.assignedNodes()[0]; + } + else if ((this.node.nodeType === 1 /* Node.ELEMENT_NODE */ || this.node.nodeType === 11 /* Node.DOCUMENT_FRAGMENT_NODE */) + && DOMWalker_1.DOMWalker.firstChildNotOwnedBySlot(this.node)) { + this.node = DOMWalker_1.DOMWalker.firstChildNotOwnedBySlot(this.node); + } + else { + this.bEndTag = true; + } + } + else { + if (this.atRoot()) { + return false; + } + else if (this.node.slotOwner) { + var slotOwner = this.node.slotOwner; + var nextSlotIndex = this.node.slotIndex + 1; + // delete (this.node as any).slotOwner; + // delete (this.node as any).slotIndex; + if (nextSlotIndex < slotOwner.assignedNodes().length) { + this.node = slotOwner.assignedNodes()[nextSlotIndex]; + this.bEndTag = false; + } + else { + this.node = slotOwner; + this.bEndTag = true; + } + } + else if (this.node.ownerElement) { + this.node = this.node.ownerElement; + this.bEndTag = true; + } + else if (DOMWalker_1.DOMWalker.nextSiblingNotOwnedBySlot(this.node)) { + this.node = DOMWalker_1.DOMWalker.nextSiblingNotOwnedBySlot(this.node); + this.bEndTag = false; + skipOwned = true; + } + else if (this.node.parentNode) { + if (this.node.parentNode.nodeType === 1 && this.node.parentNode.hasAttribute("aria-owns")) { + var ownIds = this.node.parentNode.getAttribute("aria-owns").split(/ +/g); + if (this.node.nodeType !== 1 || !this.node.hasAttribute("id")) { + this.node = fragment_1.FragmentUtil.getOwnerFragment(this.node).getElementById(ownIds[0]); + this.bEndTag = false; + } + else { + var idx = ownIds.indexOf(this.node.getAttribute("id")); + if (idx === ownIds.length - 1) { + // last one + this.node = this.node.parentNode; + this.bEndTag = true; + } + else { + // grab next + this.node = fragment_1.FragmentUtil.getOwnerFragment(this.node).getElementById(ownIds[idx + 1]); + this.bEndTag = false; + } + } + } + this.node = this.node.parentNode; + this.bEndTag = true; + } + else { + return false; + } + } + } while ((this.node.nodeType !== 1 /* Node.ELEMENT_NODE */ && this.node.nodeType !== 11 && this.node.nodeType !== 3 /* Node.TEXT_NODE */) + || (this.node.nodeType === 1 && this.node.getAttribute("aChecker") === "ACE") + || (skipOwned && this.node.nodeType === 1 && !!ARIAMapper_1.ARIAMapper.getAriaOwnedBy(this.node))); + return true; + }; + ARIAWalker.prototype.prevNode = function () { + var skipOwned = false; + do { + skipOwned = false; + if (this.bEndTag) { + var iframeNode = this.node; + var elementNode = this.node; + if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && this.node.nodeName.toUpperCase() === "IFRAME" + && VisUtil_1.VisUtil.isNodeVisible(iframeNode) + && iframeNode.contentDocument + && iframeNode.contentDocument.documentElement) { + var ownerElement = this.node; + this.node = iframeNode.contentDocument.documentElement; + this.node.ownerElement = ownerElement; + } + else if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && VisUtil_1.VisUtil.isNodeVisible(elementNode) + && elementNode.shadowRoot + && elementNode.shadowRoot.lastChild) { + var ownerElement = this.node; + this.node = elementNode.shadowRoot; + this.node.ownerElement = ownerElement; + DOMWalker_1.DOMWalker.assignSlots(this.node); + } + else if ((this.node.nodeType === 1 /* Node.ELEMENT_NODE */ || this.node.nodeType === 11) + && DOMWalker_1.DOMWalker.lastChildNotOwnedBySlot(this.node)) { + this.node = DOMWalker_1.DOMWalker.lastChildNotOwnedBySlot(this.node); + } + else { + this.bEndTag = false; + } + } + else { + if (this.atRoot()) { + return false; + } + else if (DOMWalker_1.DOMWalker.previousSiblingNotOwnedBySlot(this.node)) { + this.node = DOMWalker_1.DOMWalker.previousSiblingNotOwnedBySlot(this.node); + this.bEndTag = true; + } + else if (this.node.ownerElement) { + this.node = this.node.ownerElement; + this.bEndTag = false; + skipOwned = true; + } + else if (this.node.parentNode) { + if (this.node.parentNode.nodeType === 1 && this.node.parentNode.hasAttribute("aria-owns")) { + var ownIds = this.node.parentNode.getAttribute("aria-owns").split(/ +/g); + if (this.node.nodeType !== 1 || !this.node.hasAttribute("id")) { + this.node = fragment_1.FragmentUtil.getOwnerFragment(this.node).getElementById(ownIds[0]); + this.bEndTag = false; + } + else { + var idx = ownIds.indexOf(this.node.getAttribute("id")); + if (idx === ownIds.length - 1) { + // last one + this.node = this.node.parentNode; + this.bEndTag = true; + } + else { + // grab next + this.node = fragment_1.FragmentUtil.getOwnerFragment(this.node).getElementById(ownIds[idx + 1]); + this.bEndTag = false; + } + } + } + this.node = this.node.parentNode; + this.bEndTag = false; + } + else { + return false; + } + } + } while ((this.node.nodeType !== 1 /* Node.ELEMENT_NODE */ && this.node.nodeType !== 11) + || (this.node.nodeType === 1 && this.node.getAttribute("aChecker") === "ACE") + || (skipOwned && this.node.nodeType === 1 && !!ARIAMapper_1.ARIAMapper.getAriaOwnedBy(this.node))); + return true; + }; + return ARIAWalker; +}()); +exports.ARIAWalker = ARIAWalker; + + +/***/ }, + +/***/ "./src/v2/checker/accessibility/util/ancestor.ts" +/*!*******************************************************!*\ + !*** ./src/v2/checker/accessibility/util/ancestor.ts ***! + \*******************************************************/ +(__unused_webpack_module, exports) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.AncestorUtil = void 0; +var AncestorUtil = /** @class */ (function () { + function AncestorUtil() { + } + AncestorUtil.isPresentationFrame = function (contextHierarchy) { + if (contextHierarchy && contextHierarchy.dom) { + // Skip current node because we want ancestry + for (var idx = contextHierarchy.dom.length - 2; idx >= 0; --idx) { + var elem = contextHierarchy.dom[idx].node; + if (elem.nodeType === 1 + && elem.nodeName.toLowerCase() === "iframe" + && (elem.getAttribute("role") === "presentation" || elem.getAttribute("aria-hidden") === "true")) { + return true; + } + } + } + return false; + }; + AncestorUtil.isFrame = function (contextHierarchy) { + if (contextHierarchy && contextHierarchy.dom) { + // Skip current node because we want ancestry + for (var idx = contextHierarchy.dom.length - 2; idx >= 0; --idx) { + var elem = contextHierarchy.dom[idx].node; + if (elem.nodeType === 1 && elem.nodeName.toLowerCase() === "iframe") { + return true; + } + } + } + return false; + }; + return AncestorUtil; +}()); +exports.AncestorUtil = AncestorUtil; + + +/***/ }, + +/***/ "./src/v2/checker/accessibility/util/fragment.ts" +/*!*******************************************************!*\ + !*** ./src/v2/checker/accessibility/util/fragment.ts ***! + \*******************************************************/ +(__unused_webpack_module, exports) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.FragmentUtil = void 0; +var FragmentUtil = /** @class */ (function () { + function FragmentUtil() { + } + FragmentUtil.getOwnerFragment = function (node) { + var n = node; + while (n.parentNode && (n = n.parentNode)) { + if (n.nodeType === 11) { + return n; + } + } + return node.ownerDocument; + }; + FragmentUtil.getById = function (node, id) { + return this.getOwnerFragment(node).getElementById(id); + }; + FragmentUtil.getAncestor = function (hierarchies, elemName) { + var matches = hierarchies["dom"].filter(function (info) { return info.role === elemName; }); + return matches.length > 0 && matches[0].node || null; + }; + FragmentUtil.getAncestorWithRole = function (hierarchies, role) { + var matches = hierarchies["aria"].filter(function (info) { return info.role === role; }); + return matches.length > 0 && matches[0].node || null; + }; + return FragmentUtil; +}()); +exports.FragmentUtil = FragmentUtil; + + +/***/ }, + +/***/ "./src/v2/checker/accessibility/util/lang.ts" +/*!***************************************************!*\ + !*** ./src/v2/checker/accessibility/util/lang.ts ***! + \***************************************************/ +(__unused_webpack_module, exports) { + + +/****************************************************************************** + Copyright:: 2021- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.LangUtil = void 0; +// From https://www.iana.org/assignments/language-subtag-registry/language-subtag-registry +var validPrimaryLangs = [ + ["aa", "ab", "ae", "af", "ak", "am", "an", "ar", "as", "av", "ay", "az", "aaa", "aab", "aac", "aad", "aae", "aaf", "aag", "aah", "aai", "aak", "aal", "aam", "aan", "aao", "aap", "aaq", "aas", "aat", "aau", "aav", "aaw", "aax", "aaz", "aba", "abb", "abc", "abd", "abe", "abf", "abg", "abh", "abi", "abj", "abl", "abm", "abn", "abo", "abp", "abq", "abr", "abs", "abt", "abu", "abv", "abw", "abx", "aby", "abz", "aca", "acb", "acd", "ace", "acf", "ach", "aci", "ack", "acl", "acm", "acn", "acp", "acq", "acr", "acs", "act", "acu", "acv", "acw", "acx", "acy", "acz", "ada", "adb", "add", "ade", "adf", "adg", "adh", "adi", "adj", "adl", "adn", "ado", "adp", "adq", "adr", "ads", "adt", "adu", "adw", "adx", "ady", "adz", "aea", "aeb", "aec", "aed", "aee", "aek", "ael", "aem", "aen", "aeq", "aer", "aes", "aeu", "aew", "aey", "aez", "afa", "afb", "afd", "afe", "afg", "afh", "afi", "afk", "afn", "afo", "afp", "afs", "aft", "afu", "afz", "aga", "agb", "agc", "agd", "age", "agf", "agg", "agh", "agi", "agj", "agk", "agl", "agm", "agn", "ago", "agp", "agq", "agr", "ags", "agt", "agu", "agv", "agw", "agx", "agy", "agz", "aha", "ahb", "ahg", "ahh", "ahi", "ahk", "ahl", "ahm", "ahn", "aho", "ahp", "ahr", "ahs", "aht", "aia", "aib", "aic", "aid", "aie", "aif", "aig", "aih", "aii", "aij", "aik", "ail", "aim", "ain", "aio", "aip", "aiq", "air", "ais", "ait", "aiw", "aix", "aiy", "aja", "ajg", "aji", "ajn", "ajp", "ajt", "aju", "ajw", "ajz", "akb", "akc", "akd", "ake", "akf", "akg", "akh", "aki", "akj", "akk", "akl", "akm", "ako", "akp", "akq", "akr", "aks", "akt", "aku", "akv", "akw", "akx", "aky", "akz", "ala", "alc", "ald", "ale", "alf", "alg", "alh", "ali", "alj", "alk", "all", "alm", "aln", "alo", "alp", "alq", "alr", "als", "alt", "alu", "alv", "alw", "alx", "aly", "alz", "ama", "amb", "amc", "ame", "amf", "amg", "ami", "amj", "amk", "aml", "amm", "amn", "amo", "amp", "amq", "amr", "ams", "amt", "amu", "amv", "amw", "amx", "amy", "amz", "ana", "anb", "anc", "and", "ane", "anf", "ang", "anh", "ani", "anj", "ank", "anl", "anm", "ann", "ano", "anp", "anq", "anr", "ans", "ant", "anu", "anv", "anw", "anx", "any", "anz", "aoa", "aob", "aoc", "aod", "aoe", "aof", "aog", "aoh", "aoi", "aoj", "aok", "aol", "aom", "aon", "aor", "aos", "aot", "aou", "aox", "aoz", "apa", "apb", "apc", "apd", "ape", "apf", "apg", "aph", "api", "apj", "apk", "apl", "apm", "apn", "apo", "app", "apq", "apr", "aps", "apt", "apu", "apv", "apw", "apx", "apy", "apz", "aqa", "aqc", "aqd", "aqg", "aqk", "aql", "aqm", "aqn", "aqp", "aqr", "aqt", "aqz", "arb", "arc", "ard", "are", "arh", "ari", "arj", "ark", "arl", "arn", "aro", "arp", "arq", "arr", "ars", "art", "aru", "arv", "arw", "arx", "ary", "arz", "asa", "asb", "asc", "asd", "ase", "asf", "asg", "ash", "asi", "asj", "ask", "asl", "asn", "aso", "asp", "asq", "asr", "ass", "ast", "asu", "asv", "asw", "asx", "asy", "asz", "ata", "atb", "atc", "atd", "ate", "atg", "ath", "ati", "atj", "atk", "atl", "atm", "atn", "ato", "atp", "atq", "atr", "ats", "att", "atu", "atv", "atw", "atx", "aty", "atz", "aua", "aub", "auc", "aud", "aue", "auf", "aug", "auh", "aui", "auj", "auk", "aul", "aum", "aun", "auo", "aup", "auq", "aur", "aus", "aut", "auu", "auw", "aux", "auy", "auz", "avb", "avd", "avi", "avk", "avl", "avm", "avn", "avo", "avs", "avt", "avu", "avv", "awa", "awb", "awc", "awd", "awe", "awg", "awh", "awi", "awk", "awm", "awn", "awo", "awr", "aws", "awt", "awu", "awv", "aww", "awx", "awy", "axb", "axe", "axg", "axk", "axl", "axm", "axx", "aya", "ayb", "ayc", "ayd", "aye", "ayg", "ayh", "ayi", "ayk", "ayl", "ayn", "ayo", "ayp", "ayq", "ayr", "ays", "ayt", "ayu", "ayx", "ayy", "ayz", "aza", "azb", "azc", "azd", "azg", "azj", "azm", "azn", "azo", "azt", "azz"], + ["ba", "be", "bg", "bh", "bi", "bm", "bn", "bo", "br", "bs", "baa", "bab", "bac", "bad", "bae", "baf", "bag", "bah", "bai", "baj", "bal", "ban", "bao", "bap", "bar", "bas", "bat", "bau", "bav", "baw", "bax", "bay", "baz", "bba", "bbb", "bbc", "bbd", "bbe", "bbf", "bbg", "bbh", "bbi", "bbj", "bbk", "bbl", "bbm", "bbn", "bbo", "bbp", "bbq", "bbr", "bbs", "bbt", "bbu", "bbv", "bbw", "bbx", "bby", "bbz", "bca", "bcb", "bcc", "bcd", "bce", "bcf", "bcg", "bch", "bci", "bcj", "bck", "bcl", "bcm", "bcn", "bco", "bcp", "bcq", "bcr", "bcs", "bct", "bcu", "bcv", "bcw", "bcy", "bcz", "bda", "bdb", "bdc", "bdd", "bde", "bdf", "bdg", "bdh", "bdi", "bdj", "bdk", "bdl", "bdm", "bdn", "bdo", "bdp", "bdq", "bdr", "bds", "bdt", "bdu", "bdv", "bdw", "bdx", "bdy", "bdz", "bea", "beb", "bec", "bed", "bee", "bef", "beg", "beh", "bei", "bej", "bek", "bem", "beo", "bep", "beq", "ber", "bes", "bet", "beu", "bev", "bew", "bex", "bey", "bez", "bfa", "bfb", "bfc", "bfd", "bfe", "bff", "bfg", "bfh", "bfi", "bfj", "bfk", "bfl", "bfm", "bfn", "bfo", "bfp", "bfq", "bfr", "bfs", "bft", "bfu", "bfw", "bfx", "bfy", "bfz", "bga", "bgb", "bgc", "bgd", "bge", "bgf", "bgg", "bgi", "bgj", "bgk", "bgl", "bgm", "bgn", "bgo", "bgp", "bgq", "bgr", "bgs", "bgt", "bgu", "bgv", "bgw", "bgx", "bgy", "bgz", "bha", "bhb", "bhc", "bhd", "bhe", "bhf", "bhg", "bhh", "bhi", "bhj", "bhk", "bhl", "bhm", "bhn", "bho", "bhp", "bhq", "bhr", "bhs", "bht", "bhu", "bhv", "bhw", "bhx", "bhy", "bhz", "bia", "bib", "bic", "bid", "bie", "bif", "big", "bij", "bik", "bil", "bim", "bin", "bio", "bip", "biq", "bir", "bit", "biu", "biv", "biw", "bix", "biy", "biz", "bja", "bjb", "bjc", "bjd", "bje", "bjf", "bjg", "bjh", "bji", "bjj", "bjk", "bjl", "bjm", "bjn", "bjo", "bjp", "bjq", "bjr", "bjs", "bjt", "bju", "bjv", "bjw", "bjx", "bjy", "bjz", "bka", "bkb", "bkc", "bkd", "bkf", "bkg", "bkh", "bki", "bkj", "bkk", "bkl", "bkm", "bkn", "bko", "bkp", "bkq", "bkr", "bks", "bkt", "bku", "bkv", "bkw", "bkx", "bky", "bkz", "bla", "blb", "blc", "bld", "ble", "blf", "blg", "blh", "bli", "blj", "blk", "bll", "blm", "bln", "blo", "blp", "blq", "blr", "bls", "blt", "blv", "blw", "blx", "bly", "blz", "bma", "bmb", "bmc", "bmd", "bme", "bmf", "bmg", "bmh", "bmi", "bmj", "bmk", "bml", "bmm", "bmn", "bmo", "bmp", "bmq", "bmr", "bms", "bmt", "bmu", "bmv", "bmw", "bmx", "bmy", "bmz", "bna", "bnb", "bnc", "bnd", "bne", "bnf", "bng", "bni", "bnj", "bnk", "bnl", "bnm", "bnn", "bno", "bnp", "bnq", "bnr", "bns", "bnt", "bnu", "bnv", "bnw", "bnx", "bny", "bnz", "boa", "bob", "boe", "bof", "bog", "boh", "boi", "boj", "bok", "bol", "bom", "bon", "boo", "bop", "boq", "bor", "bot", "bou", "bov", "bow", "box", "boy", "boz", "bpa", "bpb", "bpd", "bpe", "bpg", "bph", "bpi", "bpj", "bpk", "bpl", "bpm", "bpn", "bpo", "bpp", "bpq", "bpr", "bps", "bpt", "bpu", "bpv", "bpw", "bpx", "bpy", "bpz", "bqa", "bqb", "bqc", "bqd", "bqf", "bqg", "bqh", "bqi", "bqj", "bqk", "bql", "bqm", "bqn", "bqo", "bqp", "bqq", "bqr", "bqs", "bqt", "bqu", "bqv", "bqw", "bqx", "bqy", "bqz", "bra", "brb", "brc", "brd", "brf", "brg", "brh", "bri", "brj", "brk", "brl", "brm", "brn", "bro", "brp", "brq", "brr", "brs", "brt", "bru", "brv", "brw", "brx", "bry", "brz", "bsa", "bsb", "bsc", "bse", "bsf", "bsg", "bsh", "bsi", "bsj", "bsk", "bsl", "bsm", "bsn", "bso", "bsp", "bsq", "bsr", "bss", "bst", "bsu", "bsv", "bsw", "bsx", "bsy", "bta", "btb", "btc", "btd", "bte", "btf", "btg", "bth", "bti", "btj", "btk", "btl", "btm", "btn", "bto", "btp", "btq", "btr", "bts", "btt", "btu", "btv", "btw", "btx", "bty", "btz", "bua", "bub", "buc", "bud", "bue", "buf", "bug", "buh", "bui", "buj", "buk", "bum", "bun", "buo", "bup", "buq", "bus", "but", "buu", "buv", "buw", "bux", "buy", "buz", "bva", "bvb", "bvc", "bvd", "bve", "bvf", "bvg", "bvh", "bvi", "bvj", "bvk", "bvl", "bvm", "bvn", "bvo", "bvp", "bvq", "bvr", "bvt", "bvu", "bvv", "bvw", "bvx", "bvy", "bvz", "bwa", "bwb", "bwc", "bwd", "bwe", "bwf", "bwg", "bwh", "bwi", "bwj", "bwk", "bwl", "bwm", "bwn", "bwo", "bwp", "bwq", "bwr", "bws", "bwt", "bwu", "bww", "bwx", "bwy", "bwz", "bxa", "bxb", "bxc", "bxd", "bxe", "bxf", "bxg", "bxh", "bxi", "bxj", "bxk", "bxl", "bxm", "bxn", "bxo", "bxp", "bxq", "bxr", "bxs", "bxu", "bxv", "bxw", "bxx", "bxz", "bya", "byb", "byc", "byd", "bye", "byf", "byg", "byh", "byi", "byj", "byk", "byl", "bym", "byn", "byo", "byp", "byq", "byr", "bys", "byt", "byv", "byw", "byx", "byy", "byz", "bza", "bzb", "bzc", "bzd", "bze", "bzf", "bzg", "bzh", "bzi", "bzj", "bzk", "bzl", "bzm", "bzn", "bzo", "bzp", "bzq", "bzr", "bzs", "bzt", "bzu", "bzv", "bzw", "bzx", "bzy", "bzz"], + ["ca", "ce", "ch", "co", "cr", "cs", "cu", "cv", "cy", "caa", "cab", "cac", "cad", "cae", "caf", "cag", "cah", "cai", "caj", "cak", "cal", "cam", "can", "cao", "cap", "caq", "car", "cas", "cau", "cav", "caw", "cax", "cay", "caz", "cba", "cbb", "cbc", "cbd", "cbe", "cbg", "cbh", "cbi", "cbj", "cbk", "cbl", "cbn", "cbo", "cbq", "cbr", "cbs", "cbt", "cbu", "cbv", "cbw", "cby", "cca", "ccc", "ccd", "cce", "ccg", "cch", "ccj", "ccl", "ccm", "ccn", "cco", "ccp", "ccq", "ccr", "ccs", "cda", "cdc", "cdd", "cde", "cdf", "cdg", "cdh", "cdi", "cdj", "cdm", "cdn", "cdo", "cdr", "cds", "cdy", "cdz", "cea", "ceb", "ceg", "cek", "cel", "cen", "cet", "cey", "cfa", "cfd", "cfg", "cfm", "cga", "cgc", "cgg", "cgk", "chb", "chc", "chd", "chf", "chg", "chh", "chj", "chk", "chl", "chm", "chn", "cho", "chp", "chq", "chr", "cht", "chw", "chx", "chy", "chz", "cia", "cib", "cic", "cid", "cie", "cih", "cik", "cim", "cin", "cip", "cir", "ciw", "ciy", "cja", "cje", "cjh", "cji", "cjk", "cjm", "cjn", "cjo", "cjp", "cjr", "cjs", "cjv", "cjy", "cka", "ckb", "ckh", "ckl", "ckm", "ckn", "cko", "ckq", "ckr", "cks", "ckt", "cku", "ckv", "ckx", "cky", "ckz", "cla", "clc", "cld", "cle", "clh", "cli", "clj", "clk", "cll", "clm", "clo", "clt", "clu", "clw", "cly", "cma", "cmc", "cme", "cmg", "cmi", "cmk", "cml", "cmm", "cmn", "cmo", "cmr", "cms", "cmt", "cna", "cnb", "cnc", "cng", "cnh", "cni", "cnk", "cnl", "cno", "cnp", "cnr", "cns", "cnt", "cnu", "cnw", "cnx", "coa", "cob", "coc", "cod", "coe", "cof", "cog", "coh", "coj", "cok", "col", "com", "con", "coo", "cop", "coq", "cot", "cou", "cov", "cow", "cox", "coy", "coz", "cpa", "cpb", "cpc", "cpe", "cpf", "cpg", "cpi", "cpn", "cpo", "cpp", "cps", "cpu", "cpx", "cpy", "cqd", "cqu", "cra", "crb", "crc", "crd", "crf", "crg", "crh", "cri", "crj", "crk", "crl", "crm", "crn", "cro", "crp", "crq", "crr", "crs", "crt", "crv", "crw", "crx", "cry", "crz", "csa", "csb", "csc", "csd", "cse", "csf", "csg", "csh", "csi", "csj", "csk", "csl", "csm", "csn", "cso", "csp", "csq", "csr", "css", "cst", "csu", "csv", "csw", "csx", "csy", "csz", "cta", "ctc", "ctd", "cte", "ctg", "cth", "ctl", "ctm", "ctn", "cto", "ctp", "cts", "ctt", "ctu", "cty", "ctz", "cua", "cub", "cuc", "cug", "cuh", "cui", "cuj", "cuk", "cul", "cum", "cuo", "cup", "cuq", "cur", "cus", "cut", "cuu", "cuv", "cuw", "cux", "cuy", "cvg", "cvn", "cwa", "cwb", "cwd", "cwe", "cwg", "cwt", "cya", "cyb", "cyo", "czh", "czk", "czn", "czo", "czt"], + ["da", "de", "dv", "dz", "daa", "dac", "dad", "dae", "daf", "dag", "dah", "dai", "daj", "dak", "dal", "dam", "dao", "dap", "daq", "dar", "das", "dau", "dav", "daw", "dax", "day", "daz", "dba", "dbb", "dbd", "dbe", "dbf", "dbg", "dbi", "dbj", "dbl", "dbm", "dbn", "dbo", "dbp", "dbq", "dbr", "dbt", "dbu", "dbv", "dbw", "dby", "dcc", "dcr", "dda", "ddd", "dde", "ddg", "ddi", "ddj", "ddn", "ddo", "ddr", "dds", "ddw", "dec", "ded", "dee", "def", "deg", "deh", "dei", "dek", "del", "dem", "den", "dep", "deq", "der", "des", "dev", "dez", "dga", "dgb", "dgc", "dgd", "dge", "dgg", "dgh", "dgi", "dgk", "dgl", "dgn", "dgo", "dgr", "dgs", "dgt", "dgu", "dgw", "dgx", "dgz", "dha", "dhd", "dhg", "dhi", "dhl", "dhm", "dhn", "dho", "dhr", "dhs", "dhu", "dhv", "dhw", "dhx", "dia", "dib", "dic", "did", "dif", "dig", "dih", "dii", "dij", "dik", "dil", "dim", "din", "dio", "dip", "diq", "dir", "dis", "dit", "diu", "diw", "dix", "diy", "diz", "dja", "djb", "djc", "djd", "dje", "djf", "dji", "djj", "djk", "djl", "djm", "djn", "djo", "djr", "dju", "djw", "dka", "dkg", "dkk", "dkl", "dkr", "dks", "dkx", "dlg", "dlk", "dlm", "dln", "dma", "dmb", "dmc", "dmd", "dme", "dmf", "dmg", "dmk", "dml", "dmm", "dmn", "dmo", "dmr", "dms", "dmu", "dmv", "dmw", "dmx", "dmy", "dna", "dnd", "dne", "dng", "dni", "dnj", "dnk", "dnn", "dno", "dnr", "dnt", "dnu", "dnv", "dnw", "dny", "doa", "dob", "doc", "doe", "dof", "doh", "doi", "dok", "dol", "don", "doo", "dop", "doq", "dor", "dos", "dot", "dov", "dow", "dox", "doy", "doz", "dpp", "dra", "drb", "drc", "drd", "dre", "drg", "drh", "dri", "drl", "drn", "dro", "drq", "drr", "drs", "drt", "dru", "drw", "dry", "dsb", "dse", "dsh", "dsi", "dsl", "dsn", "dso", "dsq", "dta", "dtb", "dtd", "dth", "dti", "dtk", "dtm", "dtn", "dto", "dtp", "dtr", "dts", "dtt", "dtu", "dty", "dua", "dub", "duc", "dud", "due", "duf", "dug", "duh", "dui", "duj", "duk", "dul", "dum", "dun", "duo", "dup", "duq", "dur", "dus", "duu", "duv", "duw", "dux", "duy", "duz", "dva", "dwa", "dwk", "dwl", "dwr", "dws", "dwu", "dww", "dwy", "dwz", "dya", "dyb", "dyd", "dyg", "dyi", "dym", "dyn", "dyo", "dyu", "dyy", "dza", "dzd", "dze", "dzg", "dzl", "dzn"], + ["ee", "el", "en", "eo", "es", "et", "eu", "eaa", "ebc", "ebg", "ebk", "ebo", "ebr", "ebu", "ecr", "ecs", "ecy", "eee", "efa", "efe", "efi", "ega", "egl", "ego", "egx", "egy", "ehs", "ehu", "eip", "eit", "eiv", "eja", "eka", "ekc", "eke", "ekg", "eki", "ekk", "ekl", "ekm", "eko", "ekp", "ekr", "eky", "ele", "elh", "eli", "elk", "elm", "elo", "elp", "elu", "elx", "ema", "emb", "eme", "emg", "emi", "emk", "emm", "emn", "emo", "emp", "emq", "ems", "emu", "emw", "emx", "emy", "emz", "ena", "enb", "enc", "end", "enf", "enh", "enl", "enm", "enn", "eno", "enq", "enr", "enu", "env", "enw", "enx", "eot", "epi", "era", "erg", "erh", "eri", "erk", "ero", "err", "ers", "ert", "erw", "ese", "esg", "esh", "esi", "esk", "esl", "esm", "esn", "eso", "esq", "ess", "esu", "esx", "esy", "etb", "etc", "eth", "etn", "eto", "etr", "ets", "ett", "etu", "etx", "etz", "euq", "eve", "evh", "evn", "ewo", "ext", "eya", "eyo", "eza", "eze"], + ["fa", "ff", "fi", "fj", "fo", "fr", "fy", "faa", "fab", "fad", "faf", "fag", "fah", "fai", "faj", "fak", "fal", "fam", "fan", "fap", "far", "fat", "fau", "fax", "fay", "faz", "fbl", "fcs", "fer", "ffi", "ffm", "fgr", "fia", "fie", "fif", "fil", "fip", "fir", "fit", "fiu", "fiw", "fkk", "fkv", "fla", "flh", "fli", "fll", "fln", "flr", "fly", "fmp", "fmu", "fnb", "fng", "fni", "fod", "foi", "fom", "fon", "for", "fos", "fox", "fpe", "fqs", "frc", "frd", "frk", "frm", "fro", "frp", "frq", "frr", "frs", "frt", "fse", "fsl", "fss", "fub", "fuc", "fud", "fue", "fuf", "fuh", "fui", "fuj", "fum", "fun", "fuq", "fur", "fut", "fuu", "fuv", "fuy", "fvr", "fwa", "fwe"], + ["ga", "gd", "gl", "gn", "gu", "gv", "gaa", "gab", "gac", "gad", "gae", "gaf", "gag", "gah", "gai", "gaj", "gak", "gal", "gam", "gan", "gao", "gap", "gaq", "gar", "gas", "gat", "gau", "gav", "gaw", "gax", "gay", "gaz", "gba", "gbb", "gbc", "gbd", "gbe", "gbf", "gbg", "gbh", "gbi", "gbj", "gbk", "gbl", "gbm", "gbn", "gbo", "gbp", "gbq", "gbr", "gbs", "gbu", "gbv", "gbw", "gbx", "gby", "gbz", "gcc", "gcd", "gce", "gcf", "gcl", "gcn", "gcr", "gct", "gda", "gdb", "gdc", "gdd", "gde", "gdf", "gdg", "gdh", "gdi", "gdj", "gdk", "gdl", "gdm", "gdn", "gdo", "gdq", "gdr", "gds", "gdt", "gdu", "gdx", "gea", "geb", "gec", "ged", "gef", "geg", "geh", "gei", "gej", "gek", "gel", "gem", "geq", "ges", "gev", "gew", "gex", "gey", "gez", "gfk", "gft", "gfx", "gga", "ggb", "ggd", "gge", "ggg", "ggk", "ggl", "ggn", "ggo", "ggr", "ggt", "ggu", "ggw", "gha", "ghc", "ghe", "ghh", "ghk", "ghl", "ghn", "gho", "ghr", "ghs", "ght", "gia", "gib", "gic", "gid", "gie", "gig", "gih", "gii", "gil", "gim", "gin", "gio", "gip", "giq", "gir", "gis", "git", "giu", "giw", "gix", "giy", "giz", "gji", "gjk", "gjm", "gjn", "gjr", "gju", "gka", "gkd", "gke", "gkn", "gko", "gkp", "gku", "glb", "glc", "gld", "glh", "gli", "glj", "glk", "gll", "glo", "glr", "glu", "glw", "gly", "gma", "gmb", "gmd", "gme", "gmg", "gmh", "gml", "gmm", "gmn", "gmq", "gmr", "gmu", "gmv", "gmw", "gmx", "gmy", "gmz", "gna", "gnb", "gnc", "gnd", "gne", "gng", "gnh", "gni", "gnj", "gnk", "gnl", "gnm", "gnn", "gno", "gnq", "gnr", "gnt", "gnu", "gnw", "gnz", "goa", "gob", "goc", "god", "goe", "gof", "gog", "goh", "goi", "goj", "gok", "gol", "gom", "gon", "goo", "gop", "goq", "gor", "gos", "got", "gou", "gow", "gox", "goy", "goz", "gpa", "gpe", "gpn", "gqa", "gqi", "gqn", "gqr", "gqu", "gra", "grb", "grc", "grd", "grg", "grh", "gri", "grj", "grk", "grm", "gro", "grq", "grr", "grs", "grt", "gru", "grv", "grw", "grx", "gry", "grz", "gse", "gsg", "gsl", "gsm", "gsn", "gso", "gsp", "gss", "gsw", "gta", "gti", "gtu", "gua", "gub", "guc", "gud", "gue", "guf", "gug", "guh", "gui", "guk", "gul", "gum", "gun", "guo", "gup", "guq", "gur", "gus", "gut", "guu", "guv", "guw", "gux", "guz", "gva", "gvc", "gve", "gvf", "gvj", "gvl", "gvm", "gvn", "gvo", "gvp", "gvr", "gvs", "gvy", "gwa", "gwb", "gwc", "gwd", "gwe", "gwf", "gwg", "gwi", "gwj", "gwm", "gwn", "gwr", "gwt", "gwu", "gww", "gwx", "gxx", "gya", "gyb", "gyd", "gye", "gyf", "gyg", "gyi", "gyl", "gym", "gyn", "gyo", "gyr", "gyy", "gyz", "gza", "gzi", "gzn"], + ["ha", "he", "hi", "ho", "hr", "ht", "hu", "hy", "hz", "haa", "hab", "hac", "had", "hae", "haf", "hag", "hah", "hai", "haj", "hak", "hal", "ham", "han", "hao", "hap", "haq", "har", "has", "hav", "haw", "hax", "hay", "haz", "hba", "hbb", "hbn", "hbo", "hbu", "hca", "hch", "hdn", "hds", "hdy", "hea", "hed", "heg", "heh", "hei", "hem", "hgm", "hgw", "hhi", "hhr", "hhy", "hia", "hib", "hid", "hif", "hig", "hih", "hii", "hij", "hik", "hil", "him", "hio", "hir", "hit", "hiw", "hix", "hji", "hka", "hke", "hkh", "hkk", "hkn", "hks", "hla", "hlb", "hld", "hle", "hlt", "hlu", "hma", "hmb", "hmc", "hmd", "hme", "hmf", "hmg", "hmh", "hmi", "hmj", "hmk", "hml", "hmm", "hmn", "hmp", "hmq", "hmr", "hms", "hmt", "hmu", "hmv", "hmw", "hmx", "hmy", "hmz", "hna", "hnd", "hne", "hng", "hnh", "hni", "hnj", "hnn", "hno", "hns", "hnu", "hoa", "hob", "hoc", "hod", "hoe", "hoh", "hoi", "hoj", "hok", "hol", "hom", "hoo", "hop", "hor", "hos", "hot", "hov", "how", "hoy", "hoz", "hpo", "hps", "hra", "hrc", "hre", "hrk", "hrm", "hro", "hrp", "hrr", "hrt", "hru", "hrw", "hrx", "hrz", "hsb", "hsh", "hsl", "hsn", "hss", "hti", "hto", "hts", "htu", "htx", "hub", "huc", "hud", "hue", "huf", "hug", "huh", "hui", "huj", "huk", "hul", "hum", "huo", "hup", "huq", "hur", "hus", "hut", "huu", "huv", "huw", "hux", "huy", "huz", "hvc", "hve", "hvk", "hvn", "hvv", "hwa", "hwc", "hwo", "hya", "hyw", "hyx"], + ["ia", "id", "ie", "ig", "ii", "ik", "in", "io", "is", "it", "iu", "iw", "iai", "ian", "iap", "iar", "iba", "ibb", "ibd", "ibe", "ibg", "ibh", "ibi", "ibl", "ibm", "ibn", "ibr", "ibu", "iby", "ica", "ich", "icl", "icr", "ida", "idb", "idc", "idd", "ide", "idi", "idr", "ids", "idt", "idu", "ifa", "ifb", "ife", "iff", "ifk", "ifm", "ifu", "ify", "igb", "ige", "igg", "igl", "igm", "ign", "igo", "igs", "igw", "ihb", "ihi", "ihp", "ihw", "iin", "iir", "ijc", "ije", "ijj", "ijn", "ijo", "ijs", "ike", "iki", "ikk", "ikl", "iko", "ikp", "ikr", "iks", "ikt", "ikv", "ikw", "ikx", "ikz", "ila", "ilb", "ilg", "ili", "ilk", "ill", "ilm", "ilo", "ilp", "ils", "ilu", "ilv", "ilw", "ima", "ime", "imi", "iml", "imn", "imo", "imr", "ims", "imy", "inb", "inc", "ine", "ing", "inh", "inj", "inl", "inm", "inn", "ino", "inp", "ins", "int", "inz", "ior", "iou", "iow", "ipi", "ipo", "iqu", "iqw", "ira", "ire", "irh", "iri", "irk", "irn", "iro", "irr", "iru", "irx", "iry", "isa", "isc", "isd", "ise", "isg", "ish", "isi", "isk", "ism", "isn", "iso", "isr", "ist", "isu", "itb", "itc", "itd", "ite", "iti", "itk", "itl", "itm", "ito", "itr", "its", "itt", "itv", "itw", "itx", "ity", "itz", "ium", "ivb", "ivv", "iwk", "iwm", "iwo", "iws", "ixc", "ixl", "iya", "iyo", "iyx", "izh", "izi", "izr", "izz"], + ["ja", "ji", "jv", "jw", "jaa", "jab", "jac", "jad", "jae", "jaf", "jah", "jaj", "jak", "jal", "jam", "jan", "jao", "jaq", "jar", "jas", "jat", "jau", "jax", "jay", "jaz", "jbe", "jbi", "jbj", "jbk", "jbm", "jbn", "jbo", "jbr", "jbt", "jbu", "jbw", "jcs", "jct", "jda", "jdg", "jdt", "jeb", "jee", "jeg", "jeh", "jei", "jek", "jel", "jen", "jer", "jet", "jeu", "jgb", "jge", "jgk", "jgo", "jhi", "jhs", "jia", "jib", "jic", "jid", "jie", "jig", "jih", "jii", "jil", "jim", "jio", "jiq", "jit", "jiu", "jiv", "jiy", "jje", "jjr", "jka", "jkm", "jko", "jkp", "jkr", "jks", "jku", "jle", "jls", "jma", "jmb", "jmc", "jmd", "jmi", "jml", "jmn", "jmr", "jms", "jmw", "jmx", "jna", "jnd", "jng", "jni", "jnj", "jnl", "jns", "job", "jod", "jog", "jor", "jos", "jow", "jpa", "jpr", "jpx", "jqr", "jra", "jrb", "jrr", "jrt", "jru", "jsl", "jua", "jub", "juc", "jud", "juh", "jui", "juk", "jul", "jum", "jun", "juo", "jup", "jur", "jus", "jut", "juu", "juw", "juy", "jvd", "jvn", "jwi", "jya", "jye", "jyy"], + ["ka", "kg", "ki", "kj", "kk", "kl", "km", "kn", "ko", "kr", "ks", "ku", "kv", "kw", "ky", "kaa", "kab", "kac", "kad", "kae", "kaf", "kag", "kah", "kai", "kaj", "kak", "kam", "kao", "kap", "kaq", "kar", "kav", "kaw", "kax", "kay", "kba", "kbb", "kbc", "kbd", "kbe", "kbf", "kbg", "kbh", "kbi", "kbj", "kbk", "kbl", "kbm", "kbn", "kbo", "kbp", "kbq", "kbr", "kbs", "kbt", "kbu", "kbv", "kbw", "kbx", "kby", "kbz", "kca", "kcb", "kcc", "kcd", "kce", "kcf", "kcg", "kch", "kci", "kcj", "kck", "kcl", "kcm", "kcn", "kco", "kcp", "kcq", "kcr", "kcs", "kct", "kcu", "kcv", "kcw", "kcx", "kcy", "kcz", "kda", "kdc", "kdd", "kde", "kdf", "kdg", "kdh", "kdi", "kdj", "kdk", "kdl", "kdm", "kdn", "kdo", "kdp", "kdq", "kdr", "kdt", "kdu", "kdv", "kdw", "kdx", "kdy", "kdz", "kea", "keb", "kec", "ked", "kee", "kef", "keg", "keh", "kei", "kej", "kek", "kel", "kem", "ken", "keo", "kep", "keq", "ker", "kes", "ket", "keu", "kev", "kew", "kex", "key", "kez", "kfa", "kfb", "kfc", "kfd", "kfe", "kff", "kfg", "kfh", "kfi", "kfj", "kfk", "kfl", "kfm", "kfn", "kfo", "kfp", "kfq", "kfr", "kfs", "kft", "kfu", "kfv", "kfw", "kfx", "kfy", "kfz", "kga", "kgb", "kgc", "kgd", "kge", "kgf", "kgg", "kgh", "kgi", "kgj", "kgk", "kgl", "kgm", "kgn", "kgo", "kgp", "kgq", "kgr", "kgs", "kgt", "kgu", "kgv", "kgw", "kgx", "kgy", "kha", "lyg", "khb", "khc", "khd", "khe", "khf", "khg", "khh", "khi", "khj", "khk", "khl", "khn", "kho", "khp", "khq", "khr", "khs", "kht", "khu", "khv", "khw", "khx", "khy", "khz", "kia", "kib", "kic", "kid", "kie", "kif", "kig", "kih", "kii", "kij", "kil", "kim", "kio", "kip", "kiq", "kis", "kit", "kiu", "kiv", "kiw", "kix", "kiy", "kiz", "kja", "kjb", "kjc", "kjd", "kje", "kjf", "kjg", "kjh", "kji", "kjj", "kjk", "kjl", "kjm", "kjn", "kjo", "kjp", "kjq", "kjr", "kjs", "kjt", "kju", "kjv", "kjx", "kjy", "kjz", "kka", "kkb", "kkc", "kkd", "kke", "kkf", "kkg", "kkh", "kki", "kkj", "kkk", "kkl", "kkm", "kkn", "kko", "kkp", "kkq", "kkr", "kks", "kkt", "kku", "kkv", "kkw", "kkx", "kky", "kkz", "kla", "klb", "klc", "kld", "kle", "klf", "klg", "klh", "kli", "klj", "klk", "kll", "klm", "kln", "klo", "klp", "klq", "klr", "kls", "klt", "klu", "klv", "klw", "klx", "kly", "klz", "kma", "kmb", "kmc", "kmd", "kme", "kmf", "kmg", "kmh", "kmi", "kmj", "kmk", "kml", "kmm", "kmn", "kmo", "kmp", "kmq", "kmr", "kms", "kmt", "kmu", "kmv", "kmw", "kmx", "kmy", "kmz", "kna", "knb", "knc", "knd", "kne", "knf", "kng", "kni", "knj", "knk", "knl", "knm", "knn", "kno", "knp", "knq", "knr", "kns", "knt", "knu", "knv", "knw", "knx", "kny", "knz", "koa", "koc", "kod", "koe", "kof", "kog", "koh", "koi", "koj", "kok", "kol", "koo", "kop", "koq", "kos", "kot", "kou", "kov", "kow", "kox", "koy", "koz", "kpa", "kpb", "kpc", "kpd", "kpe", "kpf", "kpg", "kph", "kpi", "kpj", "kpk", "kpl", "kpm", "kpn", "kpo", "kpp", "kpq", "kpr", "kps", "kpt", "kpu", "kpv", "kpw", "kpx", "kpy", "kpz", "kqa", "kqb", "kqc", "kqd", "kqe", "kqf", "kqg", "kqh", "kqi", "kqj", "kqk", "kql", "kqm", "kqn", "kqo", "kqp", "kqq", "kqr", "kqs", "kqt", "kqu", "kqv", "kqw", "kqx", "kqy", "kqz", "kra", "krb", "krc", "krd", "kre", "krf", "krh", "kri", "krj", "krk", "krl", "krm", "krn", "kro", "krp", "krr", "krs", "krt", "kru", "krv", "krw", "krx", "kry", "krz", "ksa", "ksb", "ksc", "ksd", "kse", "ksf", "ksg", "ksh", "ksi", "ksj", "ksk", "ksl", "ksm", "ksn", "kso", "ksp", "ksq", "ksr", "kss", "kst", "ksu", "ksv", "ksw", "ksx", "ksy", "ksz", "kta", "ktb", "ktc", "ktd", "kte", "ktf", "ktg", "kth", "kti", "ktj", "ktk", "ktl", "ktm", "ktn", "kto", "ktp", "ktq", "ktr", "kts", "ktt", "ktu", "ktv", "ktw", "ktx", "kty", "ktz", "kub", "kuc", "kud", "kue", "kuf", "kug", "kuh", "kui", "kuj", "kuk", "kul", "kum", "kun", "kuo", "kup", "kuq", "kus", "kut", "kuu", "kuv", "kuw", "kux", "kuy", "kuz", "kva", "kvb", "kvc", "kvd", "kve", "kvf", "kvg", "kvh", "kvi", "kvj", "kvk", "kvl", "kvm", "kvn", "kvo", "kvp", "kvq", "kvr", "kvs", "kvt", "kvu", "kvv", "kvw", "kvx", "kvy", "kvz", "kwa", "kwb", "kwc", "kwd", "kwe", "kwf", "kwg", "kwh", "kwi", "kwj", "kwk", "kwl", "kwm", "kwn", "kwo", "kwp", "kwq", "kwr", "kws", "kwt", "kwu", "kwv", "kww", "kwx", "kwy", "kwz", "kxa", "kxb", "kxc", "kxd", "kxe", "kxf", "kxh", "kxi", "kxj", "kxk", "kxl", "kxm", "kxn", "kxo", "kxp", "kxq", "kxr", "kxs", "kxt", "kxu", "kxv", "kxw", "kxx", "kxy", "kxz", "kya", "kyb", "kyc", "kyd", "kye", "kyf", "kyg", "kyh", "kyi", "kyj", "kyk", "kyl", "kym", "kyn", "kyo", "kyp", "kyq", "kyr", "kys", "kyt", "kyu", "kyv", "kyw", "kyx", "kyy", "kyz", "kza", "kzb", "kzc", "kzd", "kze", "kzf", "kzg", "kzh", "kzi", "kzj", "kzk", "kzl", "kzm", "kzn", "kzo", "kzp", "kzq", "kzr", "kzs", "kzt", "kzu", "kzv", "kzw", "kzx", "kzy", "kzz"], + ["la", "lb", "lg", "li", "ln", "lo", "lt", "lu", "lv", "laa", "lab", "lac", "lad", "lae", "laf", "lag", "lah", "lai", "laj", "lak", "lal", "lam", "lan", "lap", "laq", "lar", "las", "lau", "law", "lax", "lay", "laz", "lba", "lbb", "lbc", "lbe", "lbf", "lbg", "lbi", "lbj", "lbk", "lbl", "lbm", "lbn", "lbo", "lbq", "lbr", "lbs", "lbt", "lbu", "lbv", "lbw", "lbx", "lby", "lbz", "lcc", "lcd", "lce", "lcf", "lch", "lcl", "lcm", "lcp", "lcq", "lcs", "lda", "ldb", "ldd", "ldg", "ldh", "ldi", "ldj", "ldk", "ldl", "ldm", "ldn", "ldo", "ldp", "ldq", "lea", "leb", "lec", "led", "lee", "lef", "leg", "leh", "lei", "lej", "lek", "lel", "lem", "len", "leo", "lep", "leq", "ler", "les", "let", "leu", "lev", "lew", "lex", "ley", "lez", "lfa", "lfn", "lga", "lgb", "lgg", "lgh", "lgi", "lgk", "lgl", "lgm", "lgn", "lgq", "lgr", "lgt", "lgu", "lgz", "lha", "lhh", "lhi", "lhl", "lhm", "lhn", "lhp", "lhs", "lht", "lhu", "lia", "lib", "lic", "lid", "lie", "lif", "lig", "lih", "lii", "lij", "lik", "lil", "lio", "lip", "liq", "lir", "lis", "liu", "liv", "liw", "lix", "liy", "liz", "lja", "lje", "lji", "ljl", "ljp", "ljw", "ljx", "lka", "lkb", "lkc", "lkd", "lke", "lkh", "lki", "lkj", "lkl", "lkm", "lkn", "lko", "lkr", "lks", "lkt", "lku", "lky", "lla", "llb", "llc", "lld", "lle", "llf", "llg", "llh", "lli", "llj", "llk", "lll", "llm", "lln", "llo", "llp", "llq", "lls", "llu", "llx", "lma", "lmb", "lmc", "lmd", "lme", "lmf", "lmg", "lmh", "lmi", "lmj", "lmk", "lml", "lmm", "lmn", "lmo", "lmp", "lmq", "lmr", "lmu", "lmv", "lmw", "lmx", "lmy", "lmz", "lna", "lnb", "lnd", "lng", "lnh", "lni", "lnj", "lnl", "lnm", "lnn", "lno", "lns", "lnu", "lnw", "lnz", "loa", "lob", "loc", "loe", "lof", "log", "loh", "loi", "loj", "lok", "lol", "lom", "lon", "loo", "lop", "loq", "lor", "los", "lot", "lou", "lov", "low", "lox", "loy", "loz", "lpa", "lpe", "lpn", "lpo", "lpx", "lra", "lrc", "lre", "lrg", "lri", "lrk", "lrl", "lrm", "lrn", "lro", "lrr", "lrt", "lrv", "lrz", "lsa", "lsb", "lsd", "lse", "lsg", "lsh", "lsi", "lsl", "lsm", "lsn", "lso", "lsp", "lsr", "lss", "lst", "lsv", "lsy", "ltc", "ltg", "lth", "lti", "ltn", "lto", "lts", "ltu", "lua", "luc", "lud", "lue", "luf", "lui", "luj", "luk", "lul", "lum", "lun", "luo", "lup", "luq", "lur", "lus", "lut", "luu", "luv", "luw", "luy", "luz", "lva", "lvi", "lvk", "lvs", "lvu", "lwa", "lwe", "lwg", "lwh", "lwl", "lwm", "lwo", "lws", "lwt", "lwu", "lww", "lxm", "lya", "lyg", "lyn", "lzh", "lzl", "lzn", "lzz"], + ["mg", "mh", "mi", "mk", "ml", "mn", "mo", "mr", "ms", "mt", "my", "maa", "mab", "mad", "mae", "maf", "mag", "mai", "maj", "mak", "mam", "man", "map", "maq", "mas", "mat", "mau", "mav", "maw", "max", "maz", "mba", "mbb", "mbc", "mbd", "mbe", "mbf", "mbh", "mbi", "mbj", "mbk", "mbl", "mbm", "mbn", "mbo", "mbp", "mbq", "mbr", "mbs", "mbt", "mbu", "mbv", "mbw", "mbx", "mby", "mbz", "mca", "mcb", "mcc", "mcd", "mce", "mcf", "mcg", "mch", "mci", "mcj", "mck", "mcl", "mcm", "mcn", "mco", "mcp", "mcq", "mcr", "mcs", "mct", "mcu", "mcv", "mcw", "mcx", "mcy", "mcz", "mda", "mdb", "mdc", "mdd", "mde", "mdf", "mdg", "mdh", "mdi", "mdj", "mdk", "mdl", "mdm", "mdn", "mdp", "mdq", "mdr", "mds", "mdt", "mdu", "mdv", "mdw", "mdx", "mdy", "mdz", "mea", "meb", "mec", "med", "mee", "mef", "meg", "meh", "mei", "mej", "mek", "mel", "mem", "men", "meo", "mep", "meq", "mer", "mes", "met", "meu", "mev", "mew", "mey", "mez", "mfa", "mfb", "mfc", "mfd", "mfe", "mff", "mfg", "mfh", "mfi", "mfj", "mfk", "mfl", "mfm", "mfn", "mfo", "mfp", "mfq", "mfr", "mfs", "mft", "mfu", "mfv", "mfw", "mfx", "mfy", "mfz", "mga", "mgb", "mgc", "mgd", "mge", "mgf", "mgg", "mgh", "mgi", "mgj", "mgk", "mgl", "mgm", "mgn", "mgo", "mgp", "mgq", "mgr", "mgs", "mgt", "mgu", "mgv", "mgw", "mgx", "mgy", "mgz", "mha", "mhb", "mhc", "mhd", "mhe", "mhf", "mhg", "mhh", "mhi", "mhj", "mhk", "mhl", "mhm", "mhn", "mho", "mhp", "mhq", "mhr", "mhs", "mht", "mhu", "mhw", "mhx", "mhy", "mhz", "mia", "mib", "mic", "mid", "mie", "mif", "mig", "mih", "mii", "mij", "mik", "mil", "mim", "min", "mio", "mip", "miq", "mir", "mis", "mit", "miu", "miw", "mix", "miy", "miz", "mja", "mjb", "mjc", "mjd", "mje", "mjg", "mjh", "mji", "mjj", "mjk", "mjl", "mjm", "mjn", "mjo", "mjp", "mjq", "mjr", "mjs", "mjt", "mju", "mjv", "mjw", "mjx", "mjy", "mjz", "mka", "mkb", "mkc", "mke", "mkf", "mkg", "mkh", "mki", "mkj", "mkk", "mkl", "mkm", "mkn", "mko", "mkp", "mkq", "mkr", "mks", "mkt", "mku", "mkv", "mkw", "mkx", "mky", "mkz", "mla", "mlb", "mlc", "mld", "mle", "mlf", "mlh", "mli", "mlj", "mlk", "mll", "mlm", "mln", "mlo", "mlp", "mlq", "mlr", "mls", "mlu", "mlv", "mlw", "mlx", "mlz", "mma", "mmb", "mmc", "mmd", "mme", "mmf", "mmg", "mmh", "mmi", "mmj", "mmk", "mml", "mmm", "mmn", "mmo", "mmp", "mmq", "mmr", "mmt", "mmu", "mmv", "mmw", "mmx", "mmy", "mmz", "mna", "mnb", "mnc", "mnd", "mne", "mnf", "mng", "mnh", "mni", "mnj", "mnk", "mnl", "mnm", "mnn", "mno", "mnp", "mnq", "mnr", "mns", "mnt", "mnu", "mnv", "mnw", "mnx", "mny", "mnz", "moa", "moc", "mod", "moe", "mof", "mog", "moh", "moi", "moj", "mok", "mom", "moo", "mop", "moq", "mor", "mos", "mot", "mou", "mov", "mow", "mox", "moy", "moz", "mpa", "mpb", "mpc", "mpd", "mpe", "mpg", "mph", "mpi", "mpj", "mpk", "mpl", "mpm", "mpn", "mpo", "mpp", "mpq", "mpr", "mps", "mpt", "mpu", "mpv", "mpw", "mpx", "mpy", "mpz", "mqa", "mqb", "mqc", "mqe", "mqf", "mqg", "mqh", "mqi", "mqj", "mqk", "mql", "mqm", "mqn", "mqo", "mqp", "mqq", "mqr", "mqs", "mqt", "mqu", "mqv", "mqw", "mqx", "mqy", "mqz", "mra", "mrb", "mrc", "mrd", "mre", "mrf", "mrg", "mrh", "mrj", "mrk", "mrl", "mrm", "mrn", "mro", "mrp", "mrq", "mrr", "mrs", "mrt", "mru", "mrv", "mrw", "mrx", "mry", "mrz", "msb", "msc", "msd", "mse", "msf", "msg", "msh", "msi", "msj", "msk", "msl", "msm", "msn", "mso", "msp", "msq", "msr", "mss", "mst", "msu", "msv", "msw", "msx", "msy", "msz", "mta", "mtb", "mtc", "mtd", "mte", "mtf", "mtg", "mth", "mti", "mtj", "mtk", "mtl", "mtm", "mtn", "mto", "mtp", "mtq", "mtr", "mts", "mtt", "mtu", "mtv", "mtw", "mtx", "mty", "mua", "mub", "muc", "mud", "mue", "mug", "muh", "mui", "muj", "muk", "mul", "mum", "mun", "muo", "mup", "muq", "mur", "mus", "mut", "muu", "muv", "mux", "muy", "muz", "mva", "mvb", "mvd", "mve", "mvf", "mvg", "mvh", "mvi", "mvk", "mvl", "mvm", "mvn", "mvo", "mvp", "mvq", "mvr", "mvs", "mvt", "mvu", "mvv", "mvw", "mvx", "mvy", "mvz", "mwa", "mwb", "mwc", "mwd", "mwe", "mwf", "mwg", "mwh", "mwi", "mwj", "mwk", "mwl", "mwm", "mwn", "mwo", "mwp", "mwq", "mwr", "mws", "mwt", "mwu", "mwv", "mww", "mwx", "mwy", "mwz", "mxa", "mxb", "mxc", "mxd", "mxe", "mxf", "mxg", "mxh", "mxi", "mxj", "mxk", "mxl", "mxm", "mxn", "mxo", "mxp", "mxq", "mxr", "mxs", "mxt", "mxu", "mxv", "mxw", "mxx", "mxy", "mxz", "myb", "myc", "myd", "mye", "myf", "myg", "myh", "myi", "myj", "myk", "myl", "mym", "myn", "myo", "myp", "myq", "myr", "mys", "myt", "myu", "myv", "myw", "myx", "myy", "myz", "mza", "mzb", "mzc", "mzd", "mze", "mzg", "mzh", "mzi", "mzj", "mzk", "mzl", "mzm", "mzn", "mzo", "mzp", "mzq", "mzr", "mzs", "mzt", "mzu", "mzv", "mzw", "mzx", "mzy", "mzz"], + ["na", "nb", "nd", "ne", "ng", "nl", "nn", "no", "nr", "nv", "ny", "naa", "nab", "nac", "nad", "nae", "naf", "nag", "nah", "nai", "naj", "nak", "nal", "nam", "nan", "nao", "nap", "naq", "nar", "nas", "nat", "naw", "nax", "nay", "naz", "nba", "nbb", "nbc", "nbd", "nbe", "nbf", "nbg", "nbh", "nbi", "nbj", "nbk", "nbm", "nbn", "nbo", "nbp", "nbq", "nbr", "nbs", "nbt", "nbu", "nbv", "nbw", "nbx", "nby", "nca", "ncb", "ncc", "ncd", "nce", "ncf", "ncg", "nch", "nci", "ncj", "nck", "ncl", "ncm", "ncn", "nco", "ncp", "ncq", "ncr", "ncs", "nct", "ncu", "ncx", "ncz", "nda", "ndb", "ndc", "ndd", "ndf", "ndg", "ndh", "ndi", "ndj", "ndk", "ndl", "ndm", "ndn", "ndp", "ndq", "ndr", "nds", "ndt", "ndu", "ndv", "ndw", "ndx", "ndy", "ndz", "nea", "neb", "nec", "ned", "nee", "nef", "neg", "neh", "nei", "nej", "nek", "nem", "nen", "neo", "neq", "ner", "nes", "net", "neu", "nev", "new", "nex", "ney", "nez", "nfa", "nfd", "nfl", "nfr", "nfu", "nga", "ngb", "ngc", "ngd", "nge", "ngf", "ngg", "ngh", "ngi", "ngj", "ngk", "ngl", "ngm", "ngn", "ngo", "ngp", "ngq", "ngr", "ngs", "ngt", "ngu", "ngv", "ngw", "ngx", "ngy", "ngz", "nha", "nhb", "nhc", "nhd", "nhe", "nhf", "nhg", "nhh", "nhi", "nhk", "nhm", "nhn", "nho", "nhp", "nhq", "nhr", "nht", "nhu", "nhv", "nhw", "nhx", "nhy", "nhz", "nia", "nib", "nic", "nid", "nie", "nif", "nig", "nih", "nii", "nij", "nik", "nil", "nim", "nin", "nio", "niq", "nir", "nis", "nit", "niu", "niv", "niw", "nix", "niy", "niz", "nja", "njb", "njd", "njh", "nji", "njj", "njl", "njm", "njn", "njo", "njr", "njs", "njt", "nju", "njx", "njy", "njz", "nka", "nkb", "nkc", "nkd", "nke", "nkf", "nkg", "nkh", "nki", "nkj", "nkk", "nkm", "nkn", "nko", "nkp", "nkq", "nkr", "nks", "nkt", "nku", "nkv", "nkw", "nkx", "nkz", "nla", "nlc", "nle", "nlg", "nli", "nlj", "nlk", "nll", "nlm", "nln", "nlo", "nlq", "nlr", "nlu", "nlv", "nlw", "nlx", "nly", "nlz", "nma", "nmb", "nmc", "nmd", "nme", "nmf", "nmg", "nmh", "nmi", "nmj", "nmk", "nml", "nmm", "nmn", "nmo", "nmp", "nmq", "nmr", "nms", "nmt", "nmu", "nmv", "nmw", "nmx", "nmy", "nmz", "nna", "nnb", "nnc", "nnd", "nne", "nnf", "nng", "nnh", "nni", "nnj", "nnk", "nnl", "nnm", "nnn", "nnp", "nnq", "nnr", "nns", "nnt", "nnu", "nnv", "nnw", "nnx", "nny", "nnz", "noa", "noc", "nod", "noe", "nof", "nog", "noh", "noi", "noj", "nok", "nol", "nom", "non", "noo", "nop", "noq", "nos", "not", "nou", "nov", "now", "noy", "noz", "npa", "npb", "npg", "nph", "npi", "npl", "npn", "npo", "nps", "npu", "npx", "npy", "nqg", "nqk", "nql", "nqm", "nqn", "nqo", "nqq", "nqt", "nqy", "nra", "nrb", "nrc", "nre", "nrf", "nrg", "nri", "nrk", "nrl", "nrm", "nrn", "nrp", "nrr", "nrt", "nru", "nrx", "nrz", "nsa", "nsb", "nsc", "nsd", "nse", "nsf", "nsg", "nsh", "nsi", "nsk", "nsl", "nsm", "nsn", "nso", "nsp", "nsq", "nsr", "nss", "nst", "nsu", "nsv", "nsw", "nsx", "nsy", "nsz", "ntd", "nte", "ntg", "nti", "ntj", "ntk", "ntm", "nto", "ntp", "ntr", "nts", "ntu", "ntw", "ntx", "nty", "ntz", "nua", "nub", "nuc", "nud", "nue", "nuf", "nug", "nuh", "nui", "nuj", "nuk", "nul", "num", "nun", "nuo", "nup", "nuq", "nur", "nus", "nut", "nuu", "nuv", "nuw", "nux", "nuy", "nuz", "nvh", "nvm", "nvo", "nwa", "nwb", "nwc", "nwe", "nwg", "nwi", "nwm", "nwo", "nwr", "nwx", "nwy", "nxa", "nxd", "nxe", "nxg", "nxi", "nxk", "nxl", "nxm", "nxn", "nxo", "nxq", "nxr", "nxu", "nxx", "nyb", "nyc", "nyd", "nye", "nyf", "nyg", "nyh", "nyi", "nyj", "nyk", "nyl", "nym", "nyn", "nyo", "nyp", "nyq", "nyr", "nys", "nyt", "nyu", "nyv", "nyw", "nyx", "nyy", "nza", "nzb", "nzd", "nzi", "nzk", "nzm", "nzs", "nzu", "nzy", "nzz"], + ["oc", "oj", "om", "or", "os", "oaa", "oac", "oar", "oav", "obi", "obk", "obl", "obm", "obo", "obr", "obt", "obu", "oca", "och", "ocm", "oco", "ocu", "oda", "odk", "odt", "odu", "ofo", "ofs", "ofu", "ogb", "ogc", "oge", "ogg", "ogo", "ogu", "oht", "ohu", "oia", "oin", "ojb", "ojc", "ojg", "ojp", "ojs", "ojv", "ojw", "oka", "okb", "okc", "okd", "oke", "okg", "okh", "oki", "okj", "okk", "okl", "okm", "okn", "oko", "okr", "oks", "oku", "okv", "okx", "okz", "ola", "old", "ole", "olk", "olm", "olo", "olr", "olt", "olu", "oma", "omb", "omc", "ome", "omg", "omi", "omk", "oml", "omn", "omo", "omp", "omq", "omr", "omt", "omu", "omv", "omw", "omx", "omy", "ona", "onb", "one", "ong", "oni", "onj", "onk", "onn", "ono", "onp", "onr", "ons", "ont", "onu", "onw", "onx", "ood", "oog", "oon", "oor", "oos", "opa", "opk", "opm", "opo", "opt", "opy", "ora", "orc", "ore", "org", "orh", "orn", "oro", "orr", "ors", "ort", "oru", "orv", "orw", "orx", "ory", "orz", "osa", "osc", "osi", "osn", "oso", "osp", "ost", "osu", "osx", "ota", "otb", "otd", "ote", "oti", "otk", "otl", "otm", "otn", "oto", "otq", "otr", "ots", "ott", "otu", "otw", "otx", "oty", "otz", "oua", "oub", "oue", "oui", "oum", "oun", "ovd", "owi", "owl", "oyb", "oyd", "oym", "oyy", "ozm"], + ["pa", "pi", "pl", "ps", "pt", "paa", "pab", "pac", "pad", "pae", "paf", "pag", "pah", "pai", "pak", "pal", "pam", "pao", "pap", "paq", "par", "pas", "pat", "pau", "pav", "paw", "pax", "pay", "paz", "pbb", "pbc", "pbe", "pbf", "pbg", "pbh", "pbi", "pbl", "pbm", "pbn", "pbo", "pbp", "pbr", "pbs", "pbt", "pbu", "pbv", "pby", "pbz", "pca", "pcb", "pcc", "pcd", "pce", "pcf", "pcg", "pch", "pci", "pcj", "pck", "pcl", "pcm", "pcn", "pcp", "pcr", "pcw", "pda", "pdc", "pdi", "pdn", "pdo", "pdt", "pdu", "pea", "peb", "ped", "pee", "pef", "peg", "peh", "pei", "pej", "pek", "pel", "pem", "peo", "pep", "peq", "pes", "pev", "pex", "pey", "pez", "pfa", "pfe", "pfl", "pga", "pgd", "pgg", "pgi", "pgk", "pgl", "pgn", "pgs", "pgu", "pgy", "pgz", "pha", "phd", "phg", "phh", "phi", "phk", "phl", "phm", "phn", "pho", "phq", "phr", "pht", "phu", "phv", "phw", "pia", "pib", "pic", "pid", "pie", "pif", "pig", "pih", "pii", "pij", "pil", "pim", "pin", "pio", "pip", "pir", "pis", "pit", "piu", "piv", "piw", "pix", "piy", "piz", "pjt", "pka", "pkb", "pkc", "pkg", "pkh", "pkn", "pko", "pkp", "pkr", "pks", "pkt", "pku", "pla", "plb", "plc", "pld", "ple", "plf", "plg", "plh", "plj", "plk", "pll", "pln", "plo", "plp", "plq", "plr", "pls", "plt", "plu", "plv", "plw", "ply", "plz", "pma", "pmb", "pmc", "pmd", "pme", "pmf", "pmh", "pmi", "pmj", "pmk", "pml", "pmm", "pmn", "pmo", "pmq", "pmr", "pms", "pmt", "pmu", "pmw", "pmx", "pmy", "pmz", "pna", "pnb", "pnc", "pnd", "pne", "png", "pnh", "pni", "pnj", "pnk", "pnl", "pnm", "pnn", "pno", "pnp", "pnq", "pnr", "pns", "pnt", "pnu", "pnv", "pnw", "pnx", "pny", "pnz", "poc", "pod", "poe", "pof", "pog", "poh", "poi", "pok", "pom", "pon", "poo", "pop", "poq", "pos", "pot", "pov", "pow", "pox", "poy", "poz", "ppa", "ppe", "ppi", "ppk", "ppl", "ppm", "ppn", "ppo", "ppp", "ppq", "ppr", "pps", "ppt", "ppu", "pqa", "pqe", "pqm", "pqw", "pra", "prb", "prc", "prd", "pre", "prf", "prg", "prh", "pri", "prk", "prl", "prm", "prn", "pro", "prp", "prq", "prr", "prs", "prt", "pru", "prw", "prx", "pry", "prz", "psa", "psc", "psd", "pse", "psg", "psh", "psi", "psl", "psm", "psn", "pso", "psp", "psq", "psr", "pss", "pst", "psu", "psw", "psy", "pta", "pth", "pti", "ptn", "pto", "ptp", "ptq", "ptr", "ptt", "ptu", "ptv", "ptw", "pty", "pua", "pub", "puc", "pud", "pue", "puf", "pug", "pui", "puj", "puk", "pum", "puo", "pup", "puq", "pur", "put", "puu", "puw", "pux", "puy", "puz", "pwa", "pwb", "pwg", "pwi", "pwm", "pwn", "pwo", "pwr", "pww", "pxm", "pye", "pym", "pyn", "pys", "pyu", "pyx", "pyy", "pzn"], + ["qu", "qua", "qub", "quc", "qud", "quf", "qug", "quh", "qui", "quk", "qul", "qum", "qun", "qup", "quq", "qur", "qus", "quv", "quw", "qux", "quy", "quz", "qva", "qvc", "qve", "qvh", "qvi", "qvj", "qvl", "qvm", "qvn", "qvo", "qvp", "qvs", "qvw", "qvy", "qvz", "qwa", "qwc", "qwe", "qwh", "qwm", "qws", "qwt", "qxa", "qxc", "qxh", "qxl", "qxn", "qxo", "qxp", "qxq", "qxr", "qxs", "qxt", "qxu", "qxw", "qya", "qyp"], + ["rm", "rn", "ro", "ru", "rw", "raa", "rab", "rac", "rad", "raf", "rag", "rah", "rai", "raj", "rak", "ral", "ram", "ran", "rao", "rap", "raq", "rar", "ras", "rat", "rau", "rav", "raw", "rax", "ray", "raz", "rbb", "rbk", "rbl", "rbp", "rcf", "rdb", "rea", "reb", "ree", "reg", "rei", "rej", "rel", "rem", "ren", "rer", "res", "ret", "rey", "rga", "rge", "rgk", "rgn", "rgr", "rgs", "rgu", "rhg", "rhp", "ria", "rie", "rif", "ril", "rim", "rin", "rir", "rit", "riu", "rjg", "rji", "rjs", "rka", "rkb", "rkh", "rki", "rkm", "rkt", "rkw", "rma", "rmb", "rmc", "rmd", "rme", "rmf", "rmg", "rmh", "rmi", "rmk", "rml", "rmm", "rmn", "rmo", "rmp", "rmq", "rmr", "rms", "rmt", "rmu", "rmv", "rmw", "rmx", "rmy", "rmz", "rna", "rnd", "rng", "rnl", "rnn", "rnp", "rnr", "rnw", "roa", "rob", "roc", "rod", "roe", "rof", "rog", "rol", "rom", "roo", "rop", "ror", "rou", "row", "rpn", "rpt", "rri", "rro", "rrt", "rsb", "rsi", "rsl", "rsm", "rtc", "rth", "rtm", "rts", "rtw", "rub", "ruc", "rue", "ruf", "rug", "ruh", "rui", "ruk", "ruo", "rup", "ruq", "rut", "ruu", "ruy", "ruz", "rwa", "rwk", "rwl", "rwm", "rwo", "rwr", "rxd", "rxw", "ryn", "rys", "ryu", "rzh"], + ["sa", "sc", "sd", "se", "sg", "sh", "si", "sk", "sl", "sm", "sn", "so", "sq", "sr", "ss", "st", "su", "sv", "sw", "saa", "sab", "sac", "sad", "sae", "saf", "sah", "sai", "saj", "sak", "sal", "sam", "sao", "sap", "saq", "sar", "sas", "sat", "sau", "sav", "saw", "sax", "say", "saz", "sba", "sbb", "sbc", "sbd", "sbe", "sbf", "sbg", "sbh", "sbi", "sbj", "sbk", "sbl", "sbm", "sbn", "sbo", "sbp", "sbq", "sbr", "sbs", "sbt", "sbu", "sbv", "sbw", "sbx", "sby", "sbz", "sca", "scb", "sce", "scf", "scg", "sch", "sci", "sck", "scl", "scn", "sco", "scp", "scq", "scs", "sct", "scu", "scv", "scw", "scx", "sda", "sdb", "sdc", "sde", "sdf", "sdg", "sdh", "sdj", "sdk", "sdl", "sdm", "sdn", "sdo", "sdp", "sdq", "sdr", "sds", "sdt", "sdu", "sdv", "sdx", "sdz", "sea", "seb", "sec", "sed", "see", "sef", "seg", "seh", "sei", "sej", "sek", "sel", "sem", "sen", "seo", "sep", "seq", "ser", "ses", "set", "seu", "sev", "sew", "sey", "sez", "sfb", "sfe", "sfm", "sfs", "sfw", "sga", "sgb", "sgc", "sgd", "sge", "sgg", "sgh", "sgi", "sgj", "sgk", "sgl", "sgm", "sgn", "sgo", "sgp", "sgr", "sgs", "sgt", "sgu", "sgw", "sgx", "sgy", "sgz", "sha", "shb", "shc", "shd", "she", "shg", "shh", "shi", "shj", "shk", "shl", "shm", "shn", "sho", "shp", "shq", "shr", "shs", "sht", "shu", "shv", "shw", "shx", "shy", "shz", "sia", "sib", "sid", "sie", "sif", "sig", "sih", "sii", "sij", "sik", "sil", "sim", "sio", "sip", "siq", "sir", "sis", "sit", "siu", "siv", "siw", "six", "siy", "siz", "sja", "sjb", "sjd", "sje", "sjg", "sjk", "sjl", "sjm", "sjn", "sjo", "sjp", "sjr", "sjs", "sjt", "sju", "sjw", "ska", "skb", "skc", "skd", "ske", "skf", "skg", "skh", "ski", "skj", "skk", "skm", "skn", "sko", "skp", "skq", "skr", "sks", "skt", "sku", "skv", "skw", "skx", "sky", "skz", "sla", "slc", "sld", "sle", "slf", "slg", "slh", "sli", "slj", "sll", "slm", "sln", "slp", "slq", "slr", "sls", "slt", "slu", "slw", "slx", "sly", "slz", "sma", "smb", "smc", "smd", "smf", "smg", "smh", "smi", "smj", "smk", "sml", "smm", "smn", "smp", "smq", "smr", "sms", "smt", "smu", "smv", "smw", "smx", "smy", "smz", "snb", "snc", "sne", "snf", "sng", "snh", "sni", "snj", "snk", "snl", "snm", "snn", "sno", "snp", "snq", "snr", "sns", "snu", "snv", "snw", "snx", "sny", "snz", "soa", "sob", "soc", "sod", "soe", "sog", "soh", "soi", "soj", "sok", "sol", "son", "soo", "sop", "soq", "sor", "sos", "sou", "sov", "sow", "sox", "soy", "soz", "spb", "spc", "spd", "spe", "spg", "spi", "spk", "spl", "spm", "spn", "spo", "spp", "spq", "spr", "sps", "spt", "spu", "spv", "spx", "spy", "sqa", "sqh", "sqj", "sqk", "sqm", "sqn", "sqo", "sqq", "sqr", "sqs", "sqt", "squ", "sqx", "sra", "srb", "src", "sre", "srf", "srg", "srh", "sri", "srk", "srl", "srm", "srn", "sro", "srq", "srr", "srs", "srt", "sru", "srv", "srw", "srx", "sry", "srz", "ssa", "ssb", "ssc", "ssd", "sse", "ssf", "ssg", "ssh", "ssi", "ssj", "ssk", "ssl", "ssm", "ssn", "sso", "ssp", "ssq", "ssr", "sss", "sst", "ssu", "ssv", "ssx", "ssy", "ssz", "sta", "stb", "std", "ste", "stf", "stg", "sth", "sti", "stj", "stk", "stl", "stm", "stn", "sto", "stp", "stq", "str", "sts", "stt", "stu", "stv", "stw", "sty", "sua", "sub", "suc", "sue", "sug", "sui", "suj", "suk", "sul", "sum", "suo", "suq", "sur", "sus", "sut", "suv", "suw", "sux", "suy", "suz", "sva", "svb", "svc", "sve", "svk", "svm", "svr", "svs", "svx", "swb", "swc", "swf", "swg", "swh", "swi", "swj", "swk", "swl", "swm", "swn", "swo", "swp", "swq", "swr", "sws", "swt", "swu", "swv", "sww", "swx", "swy", "sxb", "sxc", "sxe", "sxg", "sxk", "sxl", "sxm", "sxn", "sxo", "sxr", "sxs", "sxu", "sxw", "sya", "syb", "syc", "syd", "syi", "syk", "syl", "sym", "syn", "syo", "syr", "sys", "syw", "syx", "syy", "sza", "szb", "szc", "szd", "sze", "szg", "szl", "szn", "szp", "szs", "szv", "szw", "szy"], + ["ta", "te", "tg", "th", "ti", "tk", "tl", "tn", "to", "tr", "ts", "tt", "tw", "ty", "taa", "tab", "tac", "tad", "tae", "taf", "tag", "tai", "taj", "tak", "tal", "tan", "tao", "tap", "taq", "tar", "tas", "tau", "tav", "taw", "tax", "tay", "taz", "tba", "tbb", "tbc", "tbd", "tbe", "tbf", "tbg", "tbh", "tbi", "tbj", "tbk", "tbl", "tbm", "tbn", "tbo", "tbp", "tbq", "tbr", "tbs", "tbt", "tbu", "tbv", "tbw", "tbx", "tby", "tbz", "tca", "tcb", "tcc", "tcd", "tce", "tcf", "tcg", "tch", "tci", "tck", "tcl", "tcm", "tcn", "tco", "tcp", "tcq", "tcs", "tct", "tcu", "tcw", "tcx", "tcy", "tcz", "tda", "tdb", "tdc", "tdd", "tde", "tdf", "tdg", "tdh", "tdi", "tdj", "tdk", "tdl", "tdm", "tdn", "tdo", "tdq", "tdr", "tds", "tdt", "tdu", "tdv", "tdx", "tdy", "tea", "teb", "tec", "ted", "tee", "tef", "teg", "teh", "tei", "tek", "tem", "ten", "teo", "tep", "teq", "ter", "tes", "tet", "teu", "tev", "tew", "tex", "tey", "tez", "tfi", "tfn", "tfo", "tfr", "tft", "tga", "tgb", "tgc", "tgd", "tge", "tgf", "tgg", "tgh", "tgi", "tgj", "tgn", "tgo", "tgp", "tgq", "tgr", "tgs", "tgt", "tgu", "tgv", "tgw", "tgx", "tgy", "tgz", "thc", "thd", "the", "thf", "thh", "thi", "thk", "thl", "thm", "thn", "thp", "thq", "thr", "ths", "tht", "thu", "thv", "thw", "thx", "thy", "thz", "tia", "tic", "tid", "tie", "tif", "tig", "tih", "tii", "tij", "tik", "til", "tim", "tin", "tio", "tip", "tiq", "tis", "tit", "tiu", "tiv", "tiw", "tix", "tiy", "tiz", "tja", "tjg", "tji", "tjj", "tjl", "tjm", "tjn", "tjo", "tjp", "tjs", "tju", "tjw", "tka", "tkb", "tkd", "tke", "tkf", "tkg", "tkk", "tkl", "tkm", "tkn", "tkp", "tkq", "tkr", "tks", "tkt", "tku", "tkv", "tkw", "tkx", "tkz", "tla", "tlb", "tlc", "tld", "tlf", "tlg", "tlh", "tli", "tlj", "tlk", "tll", "tlm", "tln", "tlo", "tlp", "tlq", "tlr", "tls", "tlt", "tlu", "tlv", "tlw", "tlx", "tly", "tma", "tmb", "tmc", "tmd", "tme", "tmf", "tmg", "tmh", "tmi", "tmj", "tmk", "tml", "tmm", "tmn", "tmo", "tmp", "tmq", "tmr", "tms", "tmt", "tmu", "tmv", "tmw", "tmy", "tmz", "tna", "tnb", "tnc", "tnd", "tne", "tnf", "tng", "tnh", "tni", "tnk", "tnl", "tnm", "tnn", "tno", "tnp", "tnq", "tnr", "tns", "tnt", "tnu", "tnv", "tnw", "tnx", "tny", "tnz", "tob", "toc", "tod", "toe", "tof", "tog", "toh", "toi", "toj", "tol", "tom", "too", "top", "toq", "tor", "tos", "tou", "tov", "tow", "tox", "toy", "toz", "tpa", "tpc", "tpe", "tpf", "tpg", "tpi", "tpj", "tpk", "tpl", "tpm", "tpn", "tpo", "tpp", "tpq", "tpr", "tpt", "tpu", "tpv", "tpw", "tpx", "tpy", "tpz", "tqb", "tql", "tqm", "tqn", "tqo", "tqp", "tqq", "tqr", "tqt", "tqu", "tqw", "tra", "trb", "trc", "trd", "tre", "trf", "trg", "trh", "tri", "trj", "trk", "trl", "trm", "trn", "tro", "trp", "trq", "trr", "trs", "trt", "tru", "trv", "trw", "trx", "try", "trz", "tsa", "tsb", "tsc", "tsd", "tse", "tsf", "tsg", "tsh", "tsi", "tsj", "tsk", "tsl", "tsm", "tsp", "tsq", "tsr", "tss", "tst", "tsu", "tsv", "tsw", "tsx", "tsy", "tsz", "tta", "ttb", "ttc", "ttd", "tte", "ttf", "ttg", "tth", "tti", "ttj", "ttk", "ttl", "ttm", "ttn", "tto", "ttp", "ttq", "ttr", "tts", "ttt", "ttu", "ttv", "ttw", "tty", "ttz", "tua", "tub", "tuc", "tud", "tue", "tuf", "tug", "tuh", "tui", "tuj", "tul", "tum", "tun", "tuo", "tup", "tuq", "tus", "tut", "tuu", "tuv", "tuw", "tux", "tuy", "tuz", "tva", "tvd", "tve", "tvk", "tvl", "tvm", "tvn", "tvo", "tvs", "tvt", "tvu", "tvw", "tvx", "tvy", "twa", "twb", "twc", "twd", "twe", "twf", "twg", "twh", "twl", "twm", "twn", "two", "twp", "twq", "twr", "twt", "twu", "tww", "twx", "twy", "txa", "txb", "txc", "txe", "txg", "txh", "txi", "txj", "txm", "txn", "txo", "txq", "txr", "txs", "txt", "txu", "txx", "txy", "tya", "tye", "tyh", "tyi", "tyj", "tyl", "tyn", "typ", "tyr", "tys", "tyt", "tyu", "tyv", "tyx", "tyy", "tyz", "tza", "tzh", "tzj", "tzl", "tzm", "tzn", "tzo", "tzx"], + ["ug", "uk", "ur", "uz", "uam", "uan", "uar", "uba", "ubi", "ubl", "ubr", "ubu", "uby", "uda", "ude", "udg", "udi", "udj", "udl", "udm", "udu", "ues", "ufi", "uga", "ugb", "uge", "ugn", "ugo", "ugy", "uha", "uhn", "uis", "uiv", "uji", "uka", "ukg", "ukh", "uki", "ukk", "ukl", "ukp", "ukq", "uks", "uku", "ukv", "ukw", "uky", "ula", "ulb", "ulc", "ule", "ulf", "uli", "ulk", "ull", "ulm", "uln", "ulu", "ulw", "uma", "umb", "umc", "umd", "umg", "umi", "umm", "umn", "umo", "ump", "umr", "ums", "umu", "una", "und", "une", "ung", "uni", "unk", "unm", "unn", "unp", "unr", "unu", "unx", "unz", "uok", "upi", "upv", "ura", "urb", "urc", "ure", "urf", "urg", "urh", "uri", "urj", "urk", "url", "urm", "urn", "uro", "urp", "urr", "urt", "uru", "urv", "urw", "urx", "ury", "urz", "usa", "ush", "usi", "usk", "usp", "uss", "usu", "uta", "ute", "uth", "utp", "utr", "utu", "uum", "uun", "uur", "uuu", "uve", "uvh", "uvl", "uwa", "uya", "uzn", "uzs"], + ["ve", "vi", "vo", "vaa", "vae", "vaf", "vag", "vah", "vai", "vaj", "val", "vam", "van", "vao", "vap", "var", "vas", "vau", "vav", "vay", "vbb", "vbk", "vec", "ved", "vel", "vem", "veo", "vep", "ver", "vgr", "vgt", "vic", "vid", "vif", "vig", "vil", "vin", "vis", "vit", "viv", "vka", "vki", "vkj", "vkk", "vkl", "vkm", "vkn", "vko", "vkp", "vkt", "vku", "vkz", "vlp", "vls", "vma", "vmb", "vmc", "vmd", "vme", "vmf", "vmg", "vmh", "vmi", "vmj", "vmk", "vml", "vmm", "vmp", "vmq", "vmr", "vms", "vmu", "vmv", "vmw", "vmx", "vmy", "vmz", "vnk", "vnm", "vnp", "vor", "vot", "vra", "vro", "vrs", "vrt", "vsi", "vsl", "vsv", "vto", "vum", "vun", "vut", "vwa"], + ["wa", "wo", "waa", "wab", "wac", "wad", "wae", "waf", "wag", "wah", "wai", "waj", "wak", "wal", "wam", "wan", "wao", "wap", "waq", "war", "was", "wat", "wau", "wav", "waw", "wax", "way", "waz", "wba", "wbb", "wbe", "wbf", "wbh", "wbi", "wbj", "wbk", "wbl", "wbm", "wbp", "wbq", "wbr", "wbs", "wbt", "wbv", "wbw", "wca", "wci", "wdd", "wdg", "wdj", "wdk", "wdu", "wdy", "wea", "wec", "wed", "weg", "weh", "wei", "wem", "wen", "weo", "wep", "wer", "wes", "wet", "weu", "wew", "wfg", "wga", "wgb", "wgg", "wgi", "wgo", "wgu", "wgw", "wgy", "wha", "whg", "whk", "whu", "wib", "wic", "wie", "wif", "wig", "wih", "wii", "wij", "wik", "wil", "wim", "win", "wir", "wit", "wiu", "wiv", "wiw", "wiy", "wja", "wji", "wka", "wkb", "wkd", "wkl", "wkr", "wku", "wkw", "wky", "wla", "wlc", "wle", "wlg", "wlh", "wli", "wlk", "wll", "wlm", "wlo", "wlr", "wls", "wlu", "wlv", "wlw", "wlx", "wly", "wma", "wmb", "wmc", "wmd", "wme", "wmg", "wmh", "wmi", "wmm", "wmn", "wmo", "wms", "wmt", "wmw", "wmx", "wnb", "wnc", "wnd", "wne", "wng", "wni", "wnk", "wnm", "wnn", "wno", "wnp", "wnu", "wnw", "wny", "woa", "wob", "woc", "wod", "woe", "wof", "wog", "woi", "wok", "wom", "won", "woo", "wor", "wos", "wow", "woy", "wpc", "wra", "wrb", "wrd", "wrg", "wrh", "wri", "wrk", "wrl", "wrm", "wrn", "wro", "wrp", "wrr", "wrs", "wru", "wrv", "wrw", "wrx", "wry", "wrz", "wsa", "wsg", "wsi", "wsk", "wsr", "wss", "wsu", "wsv", "wtf", "wth", "wti", "wtk", "wtm", "wtw", "wua", "wub", "wud", "wuh", "wul", "wum", "wun", "wur", "wut", "wuu", "wuv", "wux", "wuy", "wwa", "wwb", "wwo", "wwr", "www", "wxa", "wxw", "wya", "wyb", "wyi", "wym", "wyr", "wyy"], + ["xh", "xaa", "xab", "xac", "xad", "xae", "xag", "xai", "xaj", "xak", "xal", "xam", "xan", "xao", "xap", "xaq", "xar", "xas", "xat", "xau", "xav", "xaw", "xay", "xba", "xbb", "xbc", "xbd", "xbe", "xbg", "xbi", "xbj", "xbm", "xbn", "xbo", "xbp", "xbr", "xbw", "xbx", "xby", "xcb", "xcc", "xce", "xcg", "xch", "xcl", "xcm", "xcn", "xco", "xcr", "xct", "xcu", "xcv", "xcw", "xcy", "xda", "xdc", "xdk", "xdm", "xdo", "xdy", "xeb", "xed", "xeg", "xel", "xem", "xep", "xer", "xes", "xet", "xeu", "xfa", "xga", "xgb", "xgd", "xgf", "xgg", "xgi", "xgl", "xgm", "xgn", "xgr", "xgu", "xgw", "xha", "xhc", "xhd", "xhe", "xhr", "xht", "xhu", "xhv", "xia", "xib", "xii", "xil", "xin", "xip", "xir", "xis", "xiv", "xiy", "xjb", "xjt", "xka", "xkb", "xkc", "xkd", "xke", "xkf", "xkg", "xkh", "xki", "xkj", "xkk", "xkl", "xkn", "xko", "xkp", "xkq", "xkr", "xks", "xkt", "xku", "xkv", "xkw", "xkx", "xky", "xkz", "xla", "xlb", "xlc", "xld", "xle", "xlg", "xli", "xln", "xlo", "xlp", "xls", "xlu", "xly", "xma", "xmb", "xmc", "xmd", "xme", "xmf", "xmg", "xmh", "xmj", "xmk", "xml", "xmm", "xmn", "xmo", "xmp", "xmq", "xmr", "xms", "xmt", "xmu", "xmv", "xmw", "xmx", "xmy", "xmz", "xna", "xnb", "xnd", "xng", "xnh", "xni", "xnj", "xnk", "xnm", "xnn", "xno", "xnq", "xnr", "xns", "xnt", "xnu", "xny", "xnz", "xoc", "xod", "xog", "xoi", "xok", "xom", "xon", "xoo", "xop", "xor", "xow", "xpa", "xpb", "xpc", "xpd", "xpe", "xpf", "xpg", "xph", "xpi", "xpj", "xpk", "xpl", "xpm", "xpn", "xpo", "xpp", "xpq", "xpr", "xps", "xpt", "xpu", "xpv", "xpw", "xpx", "xpy", "xpz", "xqa", "xqt", "xra", "xrb", "xrd", "xre", "xrg", "xri", "xrm", "xrn", "xrq", "xrr", "xrt", "xru", "xrw", "xsa", "xsb", "xsc", "xsd", "xse", "xsh", "xsi", "xsj", "xsl", "xsm", "xsn", "xso", "xsp", "xsq", "xsr", "xss", "xsu", "xsv", "xsy", "xta", "xtb", "xtc", "xtd", "xte", "xtg", "xth", "xti", "xtj", "xtl", "xtm", "xtn", "xto", "xtp", "xtq", "xtr", "xts", "xtt", "xtu", "xtv", "xtw", "xty", "xtz", "xua", "xub", "xud", "xug", "xuj", "xul", "xum", "xun", "xuo", "xup", "xur", "xut", "xuu", "xve", "xvi", "xvn", "xvo", "xvs", "xwa", "xwc", "xwd", "xwe", "xwg", "xwj", "xwk", "xwl", "xwo", "xwr", "xwt", "xww", "xxb", "xxk", "xxm", "xxr", "xxt", "xya", "xyb", "xyj", "xyk", "xyl", "xyt", "xyy", "xzh", "xzm", "xzp"], + ["yi", "yo", "yaa", "yab", "yac", "yad", "yae", "yaf", "yag", "yah", "yai", "yaj", "yak", "yal", "yam", "yan", "yao", "yap", "yaq", "yar", "yas", "yat", "yau", "yav", "yaw", "yax", "yay", "yaz", "yba", "ybb", "ybd", "ybe", "ybh", "ybi", "ybj", "ybk", "ybl", "ybm", "ybn", "ybo", "ybx", "yby", "ych", "ycl", "ycn", "ycp", "yda", "ydd", "yde", "ydg", "ydk", "yds", "yea", "yec", "yee", "yei", "yej", "yel", "yen", "yer", "yes", "yet", "yeu", "yev", "yey", "yga", "ygi", "ygl", "ygm", "ygp", "ygr", "ygs", "ygu", "ygw", "yha", "yhd", "yhl", "yhs", "yia", "yif", "yig", "yih", "yii", "yij", "yik", "yil", "yim", "yin", "yip", "yiq", "yir", "yis", "yit", "yiu", "yiv", "yix", "yiy", "yiz", "yka", "ykg", "yki", "ykk", "ykl", "ykm", "ykn", "yko", "ykr", "ykt", "yku", "yky", "yla", "ylb", "yle", "ylg", "yli", "yll", "ylm", "yln", "ylo", "ylr", "ylu", "yly", "yma", "ymb", "ymc", "ymd", "yme", "ymg", "ymh", "ymi", "ymk", "yml", "ymm", "ymn", "ymo", "ymp", "ymq", "ymr", "yms", "ymt", "ymx", "ymz", "yna", "ynd", "yne", "yng", "ynh", "ynk", "ynl", "ynn", "yno", "ynq", "yns", "ynu", "yob", "yog", "yoi", "yok", "yol", "yom", "yon", "yos", "yot", "yox", "yoy", "ypa", "ypb", "ypg", "yph", "ypk", "ypm", "ypn", "ypo", "ypp", "ypz", "yra", "yrb", "yre", "yri", "yrk", "yrl", "yrm", "yrn", "yro", "yrs", "yrw", "yry", "ysc", "ysd", "ysg", "ysl", "ysm", "ysn", "yso", "ysp", "ysr", "yss", "ysy", "yta", "ytl", "ytp", "ytw", "yty", "yua", "yub", "yuc", "yud", "yue", "yuf", "yug", "yui", "yuj", "yuk", "yul", "yum", "yun", "yup", "yuq", "yur", "yut", "yuu", "yuw", "yux", "yuy", "yuz", "yva", "yvt", "ywa", "ywg", "ywl", "ywn", "ywq", "ywr", "ywt", "ywu", "yww", "yxa", "yxg", "yxl", "yxm", "yxu", "yxy", "yyr", "yyu", "yyz", "yzg", "yzk"], + ["za", "zh", "zu", "zaa", "zab", "zac", "zad", "zae", "zaf", "zag", "zah", "zai", "zaj", "zak", "zal", "zam", "zao", "zap", "zaq", "zar", "zas", "zat", "zau", "zav", "zaw", "zax", "zay", "zaz", "zba", "zbc", "zbe", "zbl", "zbt", "zbu", "zbw", "zca", "zch", "zdj", "zea", "zeg", "zeh", "zen", "zga", "zgb", "zgh", "zgm", "zgn", "zgr", "zhb", "zhd", "zhi", "zhn", "zhw", "zhx", "zia", "zib", "zik", "zil", "zim", "zin", "zir", "ziw", "ziz", "zka", "zkb", "zkd", "zkg", "zkh", "zkk", "zkn", "zko", "zkp", "zkr", "zkt", "zku", "zkv", "zkz", "zla", "zle", "zlj", "zlm", "zln", "zlq", "zls", "zlw", "zma", "zmb", "zmc", "zmd", "zme", "zmf", "zmg", "zmh", "zmi", "zmj", "zmk", "zml", "zmm", "zmn", "zmo", "zmp", "zmq", "zmr", "zms", "zmt", "zmu", "zmv", "zmw", "zmx", "zmy", "zmz", "zna", "znd", "zne", "zng", "znk", "zns", "zoc", "zoh", "zom", "zoo", "zoq", "zor", "zos", "zpa", "zpb", "zpc", "zpd", "zpe", "zpf", "zpg", "zph", "zpi", "zpj", "zpk", "zpl", "zpm", "zpn", "zpo", "zpp", "zpq", "zpr", "zps", "zpt", "zpu", "zpv", "zpw", "zpx", "zpy", "zpz", "zqe", "zra", "zrg", "zrn", "zro", "zrp", "zrs", "zsa", "zsk", "zsl", "zsm", "zsr", "zsu", "zte", "ztg", "ztl", "ztm", "ztn", "ztp", "ztq", "zts", "ztt", "ztu", "ztx", "zty", "zua", "zuh", "zum", "zun", "zuy", "zwa", "zxx", "zyb", "zyg", "zyj", "zyn", "zyp", "zza", "zzj"] +]; +var LangUtil = /** @class */ (function () { + function LangUtil() { + } + /* Determine if given string is a valid BCP 47 string */ + LangUtil.isBcp47 = function (langStr) { + return /^(([a-zA-Z]{2,3}(-[a-zA-Z](-[a-zA-Z]{3}){0,2})?|[a-zA-Z]{4}|[a-zA-Z]{5,8})(-[a-zA-Z]{4})?(-([a-zA-Z]{2}|[0-9]{3}))?(-([0-9a-zA-Z]{5,8}|[0-9][a-zA-Z]{3}))*(-[0-9a-wy-zA-WY-Z](-[a-zA-Z0-9]{2,8})+)*(-x(-[a-zA-Z0-9]{1,8})+)?|x(-[a-zA-Z0-9]{1,8})+|(en-GB-oed|i-ami|i-bnn|i-default|i-enochian|i-hak|i-klingon|i-lux|i-mingo|i-navajo|i-pwn|i-tao|i-tay|i-tsu|sgn-BE-FR|sgn-BE-NL|sgn-CH-DE|art-lojban|cel-gaulish|no-bok|no-nyn|zh-guoyu|zh-hakka|zh-min|zh-min-nan|zh-xiang))$/.test(langStr); + }; + LangUtil.validPrimaryLang = function (langStr) { + var primary = langStr.toLowerCase(); + if (primary.includes("-")) { + primary = primary.split("-")[0]; + } + if (!primary.match(/[a-z]{2,3}/)) + return false; + // qaa..qtz + if (primary.length === 3 + && primary.charAt(0) === "q" + && primary.charCodeAt(1) >= 97 && primary.charCodeAt(1) <= 116 + && primary.charCodeAt(2) >= 97 && primary.charCodeAt(2) <= 122) { + } + return validPrimaryLangs[primary.charCodeAt(0) - 97].includes(primary); + }; + LangUtil.matchPrimaryLang = function (lang1, lang2) { + var primary1 = lang1; + if (primary1.includes("-")) { + primary1 = primary1.split("-")[0]; + } + var primary2 = lang2; + if (primary2.includes("-")) { + primary2 = primary2.split("-")[0]; + } + return primary1.toLowerCase() === primary2.toLowerCase(); + }; + return LangUtil; +}()); +exports.LangUtil = LangUtil; + + +/***/ }, + +/***/ "./src/v2/common/CommonMapper.ts" +/*!***************************************!*\ + !*** ./src/v2/common/CommonMapper.ts ***! + \***************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.CommonMapper = void 0; +var DOMWalker_1 = __webpack_require__(/*! ../dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var CommonMapper = /** @class */ (function () { + function CommonMapper() { + this.hierarchyRole = null; + this.hierarchyPath = null; + this.hierarchyResults = null; + } + CommonMapper.prototype.getBounds = function (node) { + return null; + }; + CommonMapper.prototype.reset = function (node) { + this.hierarchyRole = []; + this.hierarchyResults = []; + this.hierarchyPath = [{ + rolePath: "", + roleCount: {} + }]; + var ancestors = []; + var parent = DOMWalker_1.DOMWalker.parentNode(node); + while (parent && parent.nodeType != 9 /* Node.DOCUMENT_NODE */) { + ancestors.push(parent); + parent = DOMWalker_1.DOMWalker.parentNode(parent); + } + ancestors = ancestors.reverse(); + for (var _i = 0, ancestors_1 = ancestors; _i < ancestors_1.length; _i++) { + var ancestor = ancestors_1[_i]; + var siblings = []; + var sibling = ancestor.previousSibling; + while (sibling) { + siblings.push(sibling); + sibling = sibling.previousSibling; + } + siblings = siblings.reverse(); + for (var _a = 0, siblings_1 = siblings; _a < siblings_1.length; _a++) { + var sibling_1 = siblings_1[_a]; + this.pushHierarchy(sibling_1); + this.popHierarchy(); + } + this.pushHierarchy(ancestor); + } + }; + CommonMapper.prototype.pushHierarchy = function (node) { + var role = this.getRole(node) || null; + this.hierarchyRole.push(role); + if (role !== null) { + var parentPathInfo = this.hierarchyPath[this.hierarchyPath.length - 1]; + parentPathInfo.roleCount[role] = (parentPathInfo.roleCount[role] || 0) + 1; + this.hierarchyPath.push({ + "rolePath": parentPathInfo.rolePath + "/" + role + "[" + parentPathInfo.roleCount[role] + "]", + "roleCount": {} + }); + } + var attr = {}; + if (node.nodeType === 1) { + attr = this.getAttributes(node); + } + this.hierarchyResults.push({ + node: node, + namespace: this.getNamespace(), + role: role, + attributes: attr, + rolePath: this.hierarchyPath[this.hierarchyPath.length - 1].rolePath, + bounds: this.getBounds(node) + }); + }; + CommonMapper.prototype.popHierarchy = function () { + var role = this.hierarchyRole.pop(); + if (role !== null) { + this.hierarchyPath.pop(); + } + this.hierarchyResults.pop(); + }; + CommonMapper.prototype.openScope = function (node) { + if (this.hierarchyRole === null) { + this.reset(node); + } + this.pushHierarchy(node); + return this.hierarchyResults; + }; + CommonMapper.prototype.closeScope = function (node) { + var retVal = []; + for (var _i = 0, _a = this.hierarchyResults; _i < _a.length; _i++) { + var res = _a[_i]; + // const temp = res.node; + // res.node = null; + // let cloned = JSON.parse(JSON.stringify(res)); + // cloned.node = res.node = temp; + // retVal.push(cloned); + retVal.push(res); + } + retVal[retVal.length - 1].role = "/" + retVal[retVal.length - 1].role; + this.popHierarchy(); + return retVal; + }; + return CommonMapper; +}()); +exports.CommonMapper = CommonMapper; + + +/***/ }, + +/***/ "./src/v2/common/Context.ts" +/*!**********************************!*\ + !*** ./src/v2/common/Context.ts ***! + \**********************************/ +(__unused_webpack_module, exports) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Context = exports.PartInfo = exports.AttrInfo = void 0; +// Context that will cause this rule to execute. +// Context syntax: +// Triggers: +// aria:role - Triggers on element with ARIA role role +// aria:role[attribute] - Triggers on elements with the equivalent logical +// aria- attribute (e.g., button[disabled] will trigger on +// <button disabled> or <div role="button" aria-disabled="true">) +// role[attribute=value] - Similar to above, with case-sensitive match +// to value +// role[attribute~value] - Similar to above, with case-insensitive match +// dom:element - Triggers on an element with the specified name +// dom:element[attribute] - Triggers on a dom element with the specified attribute +// dom:*[attribute] - Triggers on all elements with the specified attribute +// Combining triggers: +// trigger1 trigger2 - Triggers on elements with trigger2 within an +// element with trigger1 +// !trigger1 trigger2 - Triggers on elements with trigger2 not within +// element with trigger1 +// trigger1>trigger2 - Triggers on elements with trigger2 with an +// an immediate parent with trigger1 +// trigger1+trigger2 - Triggers on elements with trigger2 with an +// immediate previous sibling with trigger1 +// trigger1~trigger2 - Triggers on elements with trigger2 with an +// some earlier sibling with trigger1 +// context,context - Triggers on elements with either context +var AttrInfo = /** @class */ (function () { + function AttrInfo(inclusive, attr, eq, value) { + this.inclusive = inclusive; + this.attr = attr; + this.eq = eq; + this.value = value; + if (!inclusive + && ((typeof eq) !== "undefined" && eq.length > 0)) { + throw new Error("Cannot have !attr" + eq + " context"); + } + if (inclusive && (typeof eq) !== "undefined" && eq.length > 0 && ((typeof value) === "undefined" || value.length === 0)) { + throw new Error("Cannot have equivalence check without a value"); + } + } + AttrInfo.prototype.matches = function (context) { + var ruleAttrPart = this; + var elemAttrs = context.attributes; + if (!(ruleAttrPart.attr in elemAttrs)) { + return !ruleAttrPart.inclusive; + } + else if (!ruleAttrPart.inclusive) { + return false; + } + else if (!ruleAttrPart.eq) { + // inclusive match and I have that attribute and no equivalence defined + return true; + } + else { + // inclusive match and I have that attribute and equivalence defined + var attrValue = elemAttrs[ruleAttrPart.attr]; + if (ruleAttrPart.eq === "=") { + return ruleAttrPart.value === attrValue; + } + else if (ruleAttrPart.eq === "!=") { + return ruleAttrPart.value !== attrValue; + } + else if (ruleAttrPart.eq === "~") { + return ruleAttrPart.value === attrValue; + } + else if (ruleAttrPart.eq === "!~") { + return ruleAttrPart.value !== attrValue; + } + else { + throw new Error("Context equivalence operator not supported"); + } + } + }; + return AttrInfo; +}()); +exports.AttrInfo = AttrInfo; +var PartInfo = /** @class */ (function () { + function PartInfo(inclusive, namespace, role, attrs, connector) { + this.inclusive = inclusive; + this.namespace = namespace; + this.role = role; + this.attrs = attrs; + this.connector = connector; + if (role === "*" && !inclusive) { + throw new Error("!* context not supported"); + } + } + PartInfo.prototype.matches = function (contextHier, hierLevel) { + var rulePart = this; + var ruleRoleMatch = (rulePart.namespace in contextHier) && contextHier[rulePart.namespace][hierLevel] + && (contextHier[rulePart.namespace][hierLevel].role === rulePart.role + || contextHier[rulePart.namespace][hierLevel].role !== "none" && rulePart.role === "*"); + if (ruleRoleMatch + && rulePart.role === "*" + && rulePart.namespace === "dom" + && (contextHier[rulePart.namespace][hierLevel].role === "#text" + || contextHier[rulePart.namespace][hierLevel].role === "/#text")) { + ruleRoleMatch = false; + } + if (rulePart.inclusive && !ruleRoleMatch) + return false; + if (!rulePart.inclusive && !ruleRoleMatch) + return true; + // Match the attributes + var ruleAttrs = rulePart.attrs; + var elemContext = contextHier[rulePart.namespace][hierLevel]; + var match = true; + for (var _i = 0, ruleAttrs_1 = ruleAttrs; _i < ruleAttrs_1.length; _i++) { + var ruleAttrPart = ruleAttrs_1[_i]; + match = match && ruleAttrPart.matches(elemContext); + } + if (!rulePart.inclusive) + match = !match; + return match; + }; + return PartInfo; +}()); +exports.PartInfo = PartInfo; +var Context = /** @class */ (function () { + function Context(context) { + this.contextInfo = []; + var contextHierMatches = context.match(/!?[/a-zA-Z:0-9*\-_]+(\[[^\]]+\])*[ >+~]?/g); + var results = []; + for (var _i = 0, contextHierMatches_1 = contextHierMatches; _i < contextHierMatches_1.length; _i++) { + var part = contextHierMatches_1[_i]; + var parts = part.match(/(!?)([/a-zA-Z:0-9*\-_]+)((\[[^\]]+\])*)([ >+~]?)/); + var attrInfo = []; + for (var _a = 0, _b = parts[3].match(/\[([^\]]+)\]/g) || []; _a < _b.length; _a++) { + var attrPart = _b[_a]; + var attrParts = attrPart.match(/\[(!?)([a-z:A-Z*\-_]+)(!?[=~])?([^\]]+)?\]/); + attrInfo.push(new AttrInfo(attrParts[1] !== "!", attrParts[2].toLowerCase(), attrParts[3], attrParts[4])); + } + parts[2] = parts[2].toLowerCase(); + var nsParts = parts[2].split(":"); + var incl = parts[1] !== "!"; + var ns = nsParts.shift(); + var role = nsParts.join(":"); + var partInfo = new PartInfo(incl, ns, role, attrInfo, parts[parts.length - 1]); + results.push(partInfo); + } + this.contextInfo = results; + } + Context.cleanContext = function (context) { + context = context.toLowerCase().trim(); + context = context.replace(/ +!/g, " !"); + context = context.replace(/ +([>+~,])/g, "$1"); + context = context.replace(/([>+~,]) +/g, "$1"); + context = context.replace(/ +/g, " "); + return context.trim(); + }; + Context.parse = function (context) { + var contexts = Context.splitMultiple(Context.cleanContext(context)); + var retVal = []; + for (var i = 0; i < contexts.length; ++i) { + var ctx = new Context(contexts[i]); + retVal.push(ctx); + } + return retVal; + }; + /** + * Handles initial processing of splitting on comma - context,context + * @param context + */ + Context.splitMultiple = function (context) { + var contexts = []; + if (context) { + if (context.indexOf(",") === -1) { + contexts.push(context); + } + else { + for (var _i = 0, _a = context.split(","); _i < _a.length; _i++) { + var c = _a[_i]; + contexts.push(c); + } + } + } + return contexts; + }; + return Context; +}()); +exports.Context = Context; + + +/***/ }, + +/***/ "./src/v2/common/Engine.ts" +/*!*********************************!*\ + !*** ./src/v2/common/Engine.ts ***! + \*********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Engine = void 0; +var DOMWalker_1 = __webpack_require__(/*! ../dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var Context_1 = __webpack_require__(/*! ./Context */ "./src/v2/common/Context.ts"); +var Config_1 = __webpack_require__(/*! ../config/Config */ "./src/v2/config/Config.ts"); +var DOMMapper_1 = __webpack_require__(/*! ../dom/DOMMapper */ "./src/v2/dom/DOMMapper.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../../v4/util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../../v4/api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../../v4/util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var WrappedRule = /** @class */ (function () { + function WrappedRule(rule, parsedInfo) { + this.rule = rule; + this.parsedInfo = parsedInfo; + this.ns = this.parsedInfo.contextInfo[this.parsedInfo.contextInfo.length - 1].namespace; + Config_1.Config.DEBUG && console.log("Added Rule:", rule.id, JSON.stringify(this.parsedInfo)); + } + /** + * This function is responsible converting the node into a snippet which can be added to report. + * + * Note: This function will take the node and extract the node name and the attributes and build the snippet based on this. + * + * TODO: Future, maybe we can extract more then just single line, add more info or even add closing tags etc... + * + * @param {HTMLElement} node - The html element to convert into element snippet with node name and attributes only. + * + * @return {String} nodeSnippet - return the element snippet of the element that was provided which only contains, + * nodename and attributes. i.e. <table id=\"layout_table1\" role=\"presentation\"> + * + * @memberOf this + */ + WrappedRule.convertNodeToSnippet = function (node) { + // Variable Decleration + var nodeSnippet = ''; + // Extract the node name and add it to the node snippet + nodeSnippet += '<' + node.nodeName.toLowerCase(); + // Extract all the node attributes as an array + var nodeAttributes = node.attributes; + // In the case there are attributes on this node + if (nodeAttributes !== null && typeof nodeAttributes !== 'undefined') { + // Loop over all theses attributes and add the name and value to the nodeSnippet which will be returned + for (var i = nodeAttributes.length - 1; i >= 0; i--) { + if (nodeAttributes[i].name === "data-namewalk") + continue; + // Add the attribute name and value. + nodeSnippet += ' ' + nodeAttributes[i].name + '="' + nodeAttributes[i].value + '"'; + } + } + // Close the node + nodeSnippet += '>'; + // Return the node snippet + return nodeSnippet; + }; + /** + * This function is responsible for finding the source location for a node, which can be added to a report. + * Supports debug directives in the following forms: + * 1. An attribute on the element itself: + * ibm-a11y-debug="file.ts:10:5" + * 2. A comment node preceding the element (as a sibling or ancestor sibling): + * <!-- ibm-a11y-debug: file.ts:10:5 --> + * 3. A wrapper element (e.g. div) whose first non-whitespace child is such a comment node. + * 4. An ancestor element that carries the ibm-a11y-debug attribute. + * + * Traversal: checks the node itself for an inline attribute, then scans previous siblings at + * each ancestor level upward (also checking each ancestor element's own inline attribute), + * stopping if a blank or 'end' marker is found. + * + * @param {Node} node - The DOM node to find source info for + * @return {string | null} - The source location string, or null if not found + * + * @memberOf this + */ + WrappedRule.convertNodeToSource = function (node, enabled) { + if (enabled === void 0) { enabled = false; } + //console.log("Source Map enabled:", enabled); + if (!enabled || !node) + return null; + var DEBUG_DIRECTIVE = "ibm-a11y-debug"; + /** + * Parses a source string into a DirectiveResult. + * The source is the final resolved value — after any ':' separator has already been stripped. + * A blank value or the exact word 'end' (case-insensitive) is a stop marker. + */ + var parseSource = function (source) { + if (!source || source.toLowerCase() === 'end') { + return { found: true, stop: true }; + } + return { found: true, stop: false, source: source }; + }; + /** + * Extracts the debug-directive comment value from a node. + * Handles: + * - A comment node directly + * - A wrapper element (e.g. <div>) whose first non-whitespace child is a comment node + * + * Returns { found: true, stop: true } if the directive is blank or exactly 'end', + * returns { found: true, stop: false, source } if a valid source is found, + * or returns { found: false } if no directive is present on this node. + */ + var extractDirective = function (elem) { + if (!elem) + return { found: false }; + var commentValue = null; + if (elem.nodeType === Node.COMMENT_NODE) { + // Direct comment node + commentValue = elem.nodeValue; + } + else if (elem.nodeType === Node.ELEMENT_NODE) { + // Element wrapper (e.g. <div><!-- ibm-a11y-debug: ... --></div>) + // Find the first non-whitespace child node + var child = elem.firstChild; + while (child) { + if (child.nodeType === Node.TEXT_NODE) { + // Skip pure whitespace text nodes + if (child.nodeValue && child.nodeValue.trim().length > 0) { + // Non-whitespace text before a comment — not a directive wrapper + break; + } + } + else if (child.nodeType === Node.COMMENT_NODE) { + commentValue = child.nodeValue; + break; + } + else { + // Any other node type before a comment — not a directive wrapper + break; + } + child = child.nextSibling; + } + } + if (commentValue !== null) { + var trimmed = commentValue.trim(); + // Match exactly "ibm-a11y-debug" followed by end-of-string, whitespace, or ':' + // This prevents "ibm-a11y-debug-extra" from being treated as a directive. + if (trimmed === DEBUG_DIRECTIVE || + trimmed.startsWith(DEBUG_DIRECTIVE + ':') || + trimmed.startsWith(DEBUG_DIRECTIVE + ' ') || + trimmed.startsWith(DEBUG_DIRECTIVE + '\t')) { + // Strip the directive name and optional leading whitespace + var afterDirective = trimmed.substring(DEBUG_DIRECTIVE.length).trimStart(); + // Strip a single leading ':' separator if present + // (e.g. "ibm-a11y-debug: file.ts:10:5" → afterDirective = ": file.ts:10:5") + var source = afterDirective.startsWith(':') + ? afterDirective.substring(1).trim() + : afterDirective.trim(); + return parseSource(source); + } + } + return { found: false }; + }; + /** + * Returns the ibm-a11y-debug attribute value from an element node as a DirectiveResult, + * or { found: false } if absent. Recognises the 'end' stop marker just like comment directives. + * The attribute value is the source directly (no ':' prefix), e.g. ibm-a11y-debug="file.ts:10:5". + */ + var getInlineAttr = function (n) { + if (n.nodeType !== Node.ELEMENT_NODE) + return { found: false }; + var val = n.getAttribute(DEBUG_DIRECTIVE); + if (val === null) + return { found: false }; + // Attribute value is the source directly — no ':' separator to strip + return parseSource(val.trim()); + }; + /** + * Traverses left (previous siblings) then upward (parent) to find source info. + * Does NOT check the starting element itself — only its preceding siblings and ancestors. + * This avoids misidentifying a content node as its own source directive. + * + * At each ancestor level the function also checks the ancestor element's own inline + * ibm-a11y-debug attribute, so that a parent element can annotate all its descendants. + * + * Sibling scanning stops at the first node that is recognised as a directive (found or stop). + * Non-directive nodes (real content elements, text nodes) are skipped so that a directive + * placed further back in the sibling list is still found even if content nodes intervene. + * However, traversal does NOT cross element boundaries when scanning siblings — only + * comment nodes and dedicated wrapper elements (whose sole first child is a comment) are + * treated as transparent. + * + * Shadow DOM traversal: uses DOMWalker.parentNode() to cross shadow boundaries correctly, + * including slotted content and nested Shadow DOM (shadow-in-shadow). When the parent + * chain reaches a ShadowRoot, DOMWalker.parentNode() automatically resolves it to the + * shadow host element in the outer DOM. A plain DocumentFragment with no host returns + * null from DOMWalker.parentNode(), stopping traversal. + * + * Sibling traversal uses DOMWalker.previousSiblingNotOwnedBySlot() to skip nodes that + * are assigned to slots (and therefore logically belong to a different part of the tree). + * + * Uses an iterative approach (rather than recursion) to safely handle deeply nested + * DOM structures without risk of stack overflow. + * + * @param elem - The node whose context we are searching + * @returns The source location string, or null if not found + */ + var findSource = function (elem) { + var current = elem; + while (current) { + // Scan previous siblings for a debug directive comment or wrapper element. + // Use previousSiblingNotOwnedBySlot to skip nodes assigned to slots, which + // logically belong to a different part of the composed tree. + // Only comment nodes and dedicated wrapper elements are considered directives; + // all other node types are skipped (they do not block further scanning). + var prev = DOMWalker_1.DOMWalker.previousSiblingNotOwnedBySlot(current); + while (prev) { + var result = extractDirective(prev); + if (result.found) { + if (result.stop) + return null; + return result.source; + } + prev = DOMWalker_1.DOMWalker.previousSiblingNotOwnedBySlot(prev); + } + // No directive found among siblings — move up to parent. + // Use DOMWalker.parentNode() instead of node.parentNode directly so that: + // 1. Shadow DOM boundaries are crossed automatically (ShadowRoot → host element), + // supporting both regular and nested Shadow DOM (shadow-in-shadow). + // 2. Slotted nodes are re-parented to their slot owner rather than their + // light-DOM parent, matching the composed (rendered) tree structure. + // 3. Nodes with an ownerElement (e.g. iframe document roots) are re-parented + // to their owner element. + var parent_1 = DOMWalker_1.DOMWalker.parentNode(current); + if (!parent_1 || parent_1.nodeType === Node.DOCUMENT_NODE) { + // Reached the top of the tree (or a plain DocumentFragment with no host) + // without finding a directive. + return null; + } + // Check the parent element's own inline attribute before continuing upward. + // This allows a containing element to annotate all its descendants. + // An 'end' inline attribute on the parent stops traversal entirely. + var parentAttrResult = getInlineAttr(parent_1); + if (parentAttrResult.found) { + if (parentAttrResult.stop) + return null; + return parentAttrResult.source; + } + current = parent_1; + } + return null; + }; + // First, check for an inline attribute directive on the element itself. + // An 'end' attribute on the element itself stops traversal (returns null). + var selfAttrResult = getInlineAttr(node); + if (selfAttrResult.found) { + if (selfAttrResult.stop) + return null; + return selfAttrResult.source; + } + // Then traverse the DOM to find a preceding comment directive or ancestor attribute + return findSource(node); + }; + WrappedRule.prototype.run = function (engine, context, options, contextHierarchies) { + var startTime = new Date().getTime(); + var results; + try { + results = this.rule.run(context, options, contextHierarchies); + } + catch (e) { + var err = e; + console.error("RULE EXCEPTION:", this.rule.id, context.dom.rolePath, err.stack); + throw e; + } + var endTime = new Date().getTime(); + if (!results) + results = []; + if (!(results instanceof Array)) { + results = [results]; + } + var retVal = []; + for (var _i = 0, results_1 = results; _i < results_1.length; _i++) { + var result = results_1[_i]; + var message = engine.getMessage(this.rule.id, result.reasonId, result.messageArgs); + var path = {}; + for (var ns in context) { + path[ns] = context[ns].rolePath; + } + var ruleId = this.rule.id.replace(/^(.*)\$\$\d+$/, "$1"); + retVal.push({ + ruleId: ruleId, + value: result.value, + node: context["dom"].node, + path: path, + ruleTime: endTime - startTime, + reasonId: result.reasonId, + message: message, + messageArgs: result.messageArgs, + apiArgs: result.apiArgs, + bounds: context["dom"].bounds, + snippet: WrappedRule.convertNodeToSnippet(context["dom"].node), + source: WrappedRule.convertNodeToSource(context["dom"].node, engine.isSourceMapEnabled()) + }); + } + return retVal; + }; + return WrappedRule; +}()); +var Engine = /** @class */ (function () { + function Engine() { + this.mappers = {}; + this.ruleMap = {}; + this.wrappedRuleMap = {}; + this.nlsMap = {}; + this.helpMap = {}; + this.sourceMapEnabled = false; + this.inclRules = {}; + this.exclRules = {}; + // Need a DOM Mapper as a minimum + this.addMapper(new DOMMapper_1.DOMMapper()); + } + Engine.getLanguages = function () { + var env = typeof process !== "undefined" && typeof process.nodeType === "undefined" && process.env; + // If all else fails, default to US English + var nodeLang = "en-US"; + if (env) { + nodeLang = env.LANG || env.LANGUAGE || env.LC_ALL || env.LC_MESSAGES; + if (nodeLang && nodeLang.length > 0) { + nodeLang = nodeLang.split(".")[0].replace(/_/g, "-"); + } + else { + nodeLang = "en-US"; + } + } + return typeof navigator !== "undefined" && navigator.languages || [nodeLang]; + }; + Engine.prototype.run = function (root, options) { + if (root === null) { + return Promise.reject("null document"); + } + if (root.nodeType === 9 /* Node.DOCUMENT_NODE */) { + root = root.documentElement; + } + root.ownerDocument && (root.ownerDocument.PT_CHECK_HIDDEN_CONTENT = false); + var numNodesVisited = CacheUtil_1.CacheUtil.clearCaches(root); + var walker = new DOMWalker_1.DOMWalker(root, false, root, true); + var retVal = { + results: [], + numExecuted: 0, + ruleTime: 0, + totalTime: 0 + }; + var start = new Date().getTime(); + // Reset the role mappers + for (var namespace in this.mappers) { + this.mappers[namespace].reset(root); + } + // Initialize the context detector + var currentNodeCount = 0; + var lastReportedPercent = -1; + do { + currentNodeCount++; + // Report progress at each percentage milestone + var currentPercent = Math.floor((currentNodeCount / numNodesVisited) * 100); + if (currentPercent > lastReportedPercent) { + if (numNodesVisited > 10000) { + // if (currentPercent > 6) break; + console.log("Progress: ".concat(currentPercent, "% (").concat(currentNodeCount, "/").concat(numNodesVisited, " nodes)")); + // const ruleTimes = retVal.results.reduce((prev, cur) => { + // prev[cur.ruleId] = (prev[cur.ruleId] || 0)+cur.ruleTime; + // return prev; + // }, {}); + // for (const ruleId in ruleTimes) { + // if (ruleTimes[ruleId] > 10000) { + // console.log(`${ruleId}: ${ruleTimes[ruleId]}`); + // } + // } + // console.groupEnd(); + } + lastReportedPercent = currentPercent; + } + // Get the context information from the rule mappers + var contextHierarchies = {}; + for (var namespace in this.mappers) { + if (!walker.bEndTag) { + contextHierarchies[namespace] = this.mappers[namespace].openScope(walker.node); + // if (namespace === "dom" && walker.node.nodeType === 1 /* Node.ELEMENT_NODE */) { + // const elem = walker.node as Element; + // let id; + // if (elem.hasAttribute("id") && (id = elem.getAttribute("id").trim()).length > 0) { + // if (root.ownerDocument.getElementById(id) === elem) { + // contextHierarchies["dom"][contextHierarchies["dom"].length-1].rolePath = "//*[@id='"+id+"']"; + // } + // } + // } + } + else { + contextHierarchies[namespace] = this.mappers[namespace].closeScope(walker.node); + } + } + if (walker.node.nodeType !== 11 + && (VisUtil_1.VisUtil.isNodeVisible(walker.node) + // || walker.node.nodeName.toLowerCase() === "head" + || walker.node.nodeName.toLowerCase() === "meta" + || walker.node.nodeName.toLowerCase() === "style" + || walker.node.nodeName.toLowerCase() === "datalist" + || walker.node.nodeName.toLowerCase() === "param" + || !DOMUtil_1.DOMUtil.getAncestor(walker.node, ["body"]))) { + var context = {}; + for (var ns in contextHierarchies) { + var nsHier = contextHierarchies[ns]; + var lastHier = nsHier[nsHier.length - 1]; + context[ns] = lastHier; + } + var matchingRules = this.getMatchingRules(contextHierarchies); + var depMatch = {}; + for (var _i = 0, matchingRules_1 = matchingRules; _i < matchingRules_1.length; _i++) { + var matchingRule = matchingRules_1[_i]; + var fulfillsDependencies = true; + for (var _a = 0, _b = matchingRule.rule.dependencies || []; _a < _b.length; _a++) { + var dep = _b[_a]; + if (!depMatch[dep]) + fulfillsDependencies = false; + } + if (fulfillsDependencies) { + var results = []; + var start_1 = new Date().getTime(); + try { + results = matchingRule.run(this, context, options, contextHierarchies); + } + catch (err) { + // Wrapper shows error in console. Skip this rule as N/A + // We don't want to kill the engine + } + // If out of scope, it fulfills the dependency + if (results.length === 0) { + depMatch[matchingRule.rule.id] = true; + } + for (var _c = 0, results_2 = results; _c < results_2.length; _c++) { + var result = results_2[_c]; + retVal.results.push(result); + retVal.ruleTime += result.ruleTime; + retVal.numExecuted++; + if (result.value[1] === IRule_1.eRuleConfidence.PASS) { + depMatch[result.ruleId] = true; + } + } + } + } + } + } while (walker.nextNode()); + CacheUtil_1.CacheUtil.clearCaches(root); + retVal.totalTime = new Date().getTime() - start; + return Promise.resolve(retVal); + }; + Engine.prototype.enableRules = function (ruleIds) { + for (var ruleId in this.ruleMap) { + this.ruleMap[ruleId].enabled = false; + } + for (var _i = 0, _a = ruleIds || []; _i < _a.length; _i++) { + var ruleId = _a[_i]; + if (!(ruleId in this.ruleMap)) { + console.warn("WARNING: Rule Id", ruleId, "could not be enabled."); + } + else { + this.ruleMap[ruleId].enabled = true; + } + } + }; + Engine.prototype.getRule = function (ruleId) { + return this.ruleMap[ruleId]; + }; + Engine.prototype.getRulesIds = function () { + var retVal = []; + for (var ruleId in this.ruleMap) { + retVal.push(ruleId); + } + return retVal; + }; + Engine.prototype.addRules = function (rules) { + for (var _i = 0, rules_1 = rules; _i < rules_1.length; _i++) { + var rule = rules_1[_i]; + this.addRule(rule, true); + } + this._sortRules(); + }; + Engine.prototype.addRule = function (rule, skipSort) { + var ctxs = Context_1.Context.parse(rule.context); + var idx = 0; + var ruleId = rule.id; + if (ruleId in this.ruleMap) { + console.log("WARNING: Rule", ruleId, "already added to engine. Ignoring..."); + return; + } + this.ruleMap[ruleId] = rule; + for (var _i = 0, ctxs_1 = ctxs; _i < ctxs_1.length; _i++) { + var ctx = ctxs_1[_i]; + var wrapId = ruleId; + if (idx >= 1) { + wrapId = ruleId + "$$" + idx; + } + ++idx; + var wrappedRule = new WrappedRule(rule, ctx); + this.wrappedRuleMap[wrapId] = wrappedRule; + var parts = wrappedRule.parsedInfo.contextInfo; + var lastPart = parts[parts.length - 1]; + var triggerRole = lastPart.namespace + ":" + lastPart.role; + if (lastPart.inclusive) { + this.inclRules[triggerRole] = this.inclRules[triggerRole] || []; + this.inclRules[triggerRole].push(wrappedRule); + } + else { + this.exclRules[triggerRole] = this.exclRules[triggerRole] || []; + this.exclRules[triggerRole].push(wrappedRule); + } + } + if (!skipSort) { + this._sortRules(); + } + }; + Engine.prototype.enableSourceMap = function (enable) { + this.sourceMapEnabled = enable; + }; + Engine.prototype.isSourceMapEnabled = function () { + return this.sourceMapEnabled; + }; + Engine.prototype._sortRules = function () { + for (var role in this.inclRules) { + this.inclRules[role].sort(function (ruleA, ruleB) { + var hasDepA = ruleA.rule.dependencies && ruleA.rule.dependencies.length > 0; + var hasDepB = ruleB.rule.dependencies && ruleB.rule.dependencies.length > 0; + // If B depends on A, sort A before B + if (hasDepB && ruleB.rule.dependencies.includes(ruleA.rule.id)) + return -1; + // If A depends on B, sort B before A + if (hasDepA && ruleA.rule.dependencies.includes(ruleB.rule.id)) + return 1; + // Otherwise, doesn't matter + return 0; + }); + } + for (var role in this.exclRules) { + this.exclRules[role].sort(function (ruleA, ruleB) { + var hasDepA = ruleA.rule.dependencies && ruleA.rule.dependencies.length > 0; + var hasDepB = ruleB.rule.dependencies && ruleB.rule.dependencies.length > 0; + // If B depends on A, sort A before B + if (hasDepB && ruleB.rule.dependencies.includes(ruleA.rule.id)) + return -1; + // If A depends on B, sort B before A + if (hasDepA && ruleA.rule.dependencies.includes(ruleB.rule.id)) + return 1; + // Otherwise, doesn't matter + return 0; + }); + } + }; + Engine.prototype.addNlsMap = function (map) { + for (var key in map) { + this.nlsMap[key] = map[key]; + } + }; + Engine.prototype.addHelpMap = function (map) { + for (var key in map) { + this.helpMap[key] = map[key]; + } + }; + Engine.prototype.getMessage = function (ruleId, ruleIdx, msgArgs) { + var splitter = ruleId.indexOf("$$"); + if (splitter >= 0) { + ruleId = ruleId.substring(0, splitter); + } + if (!(ruleId in this.nlsMap)) + return ruleId; + var messageTemplate = this.nlsMap[ruleId][ruleIdx || 0]; + if (!messageTemplate) + return ruleId + "_" + ruleIdx; + return messageTemplate.replace(/\{(\d+)\}/g, function (matchedStr, matchedNum, matchedIndex) { return msgArgs[matchedNum]; }); + }; + Engine.prototype.getHelp = function (ruleId, reasonId, archiveId) { + if (!archiveId) { + // Set to the latest + archiveId = "latest"; + } + return "".concat(Config_1.Config.helpRoot, "/").concat(archiveId, "/doc").concat(this.getHelpRel(ruleId, reasonId)); + }; + Engine.prototype.getHelpRel = function (ruleId, ruleIdx) { + var splitter = ruleId.indexOf("$$"); + if (splitter >= 0) { + ruleId = ruleId.substring(0, splitter); + } + if (!(ruleId in this.helpMap)) + return ruleId; + ruleIdx = ruleIdx || 0; + var helpStr = null; + if (ruleIdx in this.helpMap[ruleId]) { + helpStr = this.helpMap[ruleId][ruleIdx || 0]; + } + else { + helpStr = this.helpMap[ruleId][0]; + } + if (!helpStr) + return ruleId + "_" + ruleIdx; + return helpStr; + }; + Engine.prototype.addMapper = function (mapper) { + this.mappers[mapper.getNamespace()] = mapper; + }; + Engine.match = function (rule, contextHier) { + var ruleParts = rule.parsedInfo.contextInfo; + var partIdx = ruleParts.length - 1; + var curNS = ruleParts[partIdx].namespace; + var curHier = contextHier[curNS][contextHier[curNS].length - 1]; + var contextNode = curHier.node; + // If the end of the rule part doesn't match the end of the hierarchy, we don't have a match + if (!ruleParts[partIdx].matches(contextHier, contextHier[curNS].length - 1)) { + return false; + } + // If there was only one part, we have a match + if (ruleParts.length === 1) { + return true; + } + // Need to deal with parent parts. To walk the hierarchy, these need to be + // all in the same namespace. Confirm that is true. + curNS = ruleParts[0].namespace; + curHier = contextHier[curNS][contextHier[curNS].length - 1]; + --partIdx; + if (ruleParts.slice(0, ruleParts.length - 1).some(function (part) { return part.namespace !== curNS; })) { + console.error("[ERROR] Rule ".concat(rule.rule.id, " has inconsitent parent namespaces")); + return false; + } + // If the target node matches the end of the hierarchy, move up past it, otherwise, start at the end + var hierIdx = contextHier[curNS].length - (curHier.node.isSameNode(contextNode) ? 2 : 1); + while (hierIdx >= 0 && partIdx >= 0) { + var part = ruleParts[partIdx]; + var matchesPart = ruleParts[partIdx].matches(contextHier, hierIdx); + if (part.connector === ">") { + if (!matchesPart) { + // Direct parent check and doesn't match + return false; + } + else { + // Direct parent check and does match + --partIdx; + --hierIdx; + } + } + else if (part.connector === " ") { + if (part.inclusive) { + // inclusive ancestor match + if (matchesPart) { + --partIdx; + } + // If doesn't match, just move up the role hierarchy + --hierIdx; + } + else if (!matchesPart) { + // exclusive ancestor match and current matches + return false; + } + else { + // exclusive ancestor match and current doesn't match - check for other ancestors + var parentMatch = false; + for (var searchIdx = hierIdx - 1; !parentMatch && searchIdx >= 0; --searchIdx) { + parentMatch = !ruleParts[partIdx].matches(contextHier, searchIdx); + } + if (parentMatch) + return false; + else + --partIdx; + } + } + else { + throw new Error("Context connector " + part.connector + " is not supported"); + } + } + return partIdx === -1; + }; + Engine.prototype.getMatchingRules = function (ctxHier) { + var matches = []; + function addMatches(rules) { + for (var _i = 0, rules_2 = rules; _i < rules_2.length; _i++) { + var rule = rules_2[_i]; + if (rule.rule.enabled && Engine.match(rule, ctxHier)) { + matches.push(rule); + } + } + } + for (var ns in ctxHier) { + var role = ns + ":" + (ctxHier[ns].length > 0 ? ctxHier[ns][ctxHier[ns].length - 1].role : "none"); + if (role in this.inclRules) { + addMatches(this.inclRules[role]); + } + for (var xRole in this.exclRules) { + if (xRole !== role) { + addMatches(this.exclRules[xRole]); + } + } + if (role !== ns + ":none") { + if (role.startsWith(ns + ":/")) { + if (ns + ":/*" in this.inclRules) { + addMatches(this.inclRules[ns + ":/*"]); + } + } + else { + if (ns + ":*" in this.inclRules) { + addMatches(this.inclRules[ns + ":*"]); + } + } + } + } + return this.sortDeps(matches); + }; + /** + * Sorts the rules in order to execute dependencies in the correct order + * @param inRules List of wrapped rules to sort + * @returns Sorted list of wrapped rules + */ + Engine.prototype.sortDeps = function (inRules) { + var depRules = []; + for (var _i = 0, inRules_1 = inRules; _i < inRules_1.length; _i++) { + var rule = inRules_1[_i]; + depRules.push(rule); + } + var retVal = []; + var idToRule = {}; + // Iterate through the rules. If that rule's dependencies can be met by rules already in the list, add it to the list + // Repeat until no changes are made to the satisfied list + // If a rule cannot be satisfied, it will never execute, so it can be dropped. + var change = false; + do { + change = false; + for (var idx = 0; idx < depRules.length; ++idx) { + var depRule = depRules[idx]; + if (depRule.rule.id in idToRule) + continue; + var allMatch = true; + if (depRule.rule.dependencies && depRule.rule.dependencies.length > 0) { + for (var _a = 0, _b = depRule.rule.dependencies; _a < _b.length; _a++) { + var depId = _b[_a]; + if (!(depId in idToRule)) { + allMatch = false; + } + } + } + // if (depRule.rule.prereqs && depRule.rule.prereqs.length > 0) { + // for (const depId of depRule.rule.prereqs) { + // if (!(depId in idToRule)) { + // allMatch = false; + // } + // } + // } + if (allMatch) { + change = true; + retVal.push(depRule); + idToRule[depRule.rule.id] = true; + depRules.splice(idx--, 1); + } + } + } while (change); + return retVal; + }; + return Engine; +}()); +exports.Engine = Engine; + + +/***/ }, + +/***/ "./src/v2/config/Config.ts" +/*!*********************************!*\ + !*** ./src/v2/config/Config.ts ***! + \*********************************/ +(__unused_webpack_module, exports) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Config = void 0; +var Config = /** @class */ (function () { + function Config() { + } + Config.DEBUG = false; + Config.helpRoot = "https://able.ibm.com/rules/archives"; + return Config; +}()); +exports.Config = Config; + + +/***/ }, + +/***/ "./src/v2/dom/DOMMapper.ts" +/*!*********************************!*\ + !*** ./src/v2/dom/DOMMapper.ts ***! + \*********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.DOMMapper = void 0; +var CommonMapper_1 = __webpack_require__(/*! ../common/CommonMapper */ "./src/v2/common/CommonMapper.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../../v4/util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var DOMMapper = /** @class */ (function (_super) { + __extends(DOMMapper, _super); + function DOMMapper() { + return _super !== null && _super.apply(this, arguments) || this; + } + DOMMapper.prototype.getRole = function (node) { + return node.nodeName.toLowerCase(); + }; + DOMMapper.prototype.getNamespace = function () { + return "dom"; + }; + DOMMapper.prototype.getAttributes = function (node) { + var retVal = {}; + if (node.nodeType === 1 /* Node.ELEMENT_NODE */) { + var elem = node; + for (var idx = 0; idx < elem.attributes.length; ++idx) { + var attrInfo = elem.attributes[idx]; + retVal[attrInfo.name.toLowerCase()] = attrInfo.nodeValue; + } + } + return retVal; + }; + /** + * get scaled bounds for screenshot etc. adjusted for devicePixelRatio and scroll + * @param node + * @returns + */ + DOMMapper.prototype.getBounds = function (node) { + if (node.nodeType !== 1 /*Node.ELEMENT_NODE*/) + return null; + var cachedBounds = CacheUtil_1.CacheUtil.getCache(node, "DOMMapper_Bounds", undefined); + if (typeof cachedBounds !== "undefined") { + return cachedBounds; + } + var adjustment = 1; + if (node.ownerDocument && node.ownerDocument.defaultView && node.ownerDocument.defaultView.devicePixelRatio) { + adjustment = node.ownerDocument.defaultView.devicePixelRatio; + } + var bounds = node.getBoundingClientRect(); + // Do a check whether bounds has value as we use different tool (htmlUnit, browser) to call this function + if (bounds) { + var scrollX_1 = node && node.ownerDocument && node.ownerDocument.defaultView && node.ownerDocument.defaultView.scrollX || 0; + var scrollY_1 = node && node.ownerDocument && node.ownerDocument.defaultView && node.ownerDocument.defaultView.scrollY || 0; + var ret = { + "left": Math.ceil((bounds.left + scrollX_1) * adjustment), + "top": Math.ceil((bounds.top + scrollY_1) * adjustment), + "height": Math.ceil(bounds.height * adjustment), + "width": Math.ceil(bounds.width * adjustment) + }; + CacheUtil_1.CacheUtil.setCache(node, "DOMMapper_Bounds", ret); + return ret; + } + return null; + }; + /** + * get real CSS bounds in css pixels, adjusted for scroll only + * @param node + * @returns + */ + DOMMapper.prototype.getUnadjustedBounds = function (node) { + if (node.nodeType !== 1 /*Node.ELEMENT_NODE*/) + return null; + var cachedBounds = CacheUtil_1.CacheUtil.getCache(node, "DOMMapper_UnadjustedBounds", undefined); + if (typeof cachedBounds !== "undefined") { + return cachedBounds; + } + var bounds = node.getBoundingClientRect(); + // adjusted for scroll if any + if (bounds) { + var scrollX_2 = node && node.ownerDocument && node.ownerDocument.defaultView && node.ownerDocument.defaultView.scrollX || 0; + var scrollY_2 = node && node.ownerDocument && node.ownerDocument.defaultView && node.ownerDocument.defaultView.scrollY || 0; + var ret = { + "left": Math.ceil(bounds.left + scrollX_2), + "top": Math.ceil(bounds.top + scrollY_2), + "height": Math.ceil(bounds.height), + "width": Math.ceil(bounds.width) + }; + CacheUtil_1.CacheUtil.setCache(node, "DOMMapper_UnadjustedBounds", ret); + return ret; + } + return null; + }; + return DOMMapper; +}(CommonMapper_1.CommonMapper)); +exports.DOMMapper = DOMMapper; + + +/***/ }, + +/***/ "./src/v2/dom/DOMUtil.ts" +/*!*******************************!*\ + !*** ./src/v2/dom/DOMUtil.ts ***! + \*******************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.DOMUtil = void 0; +var DOMWalker_1 = __webpack_require__(/*! ./DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +/** + * Utility class providing helper methods for DOM manipulation and traversal operations. + * Used throughout the accessibility checker engine to navigate and analyze DOM structures. + */ +var DOMUtil = /** @class */ (function () { + function DOMUtil() { + } + /** + * Checks if a given node has an ancestor element with a node name matching any of the provided names. + * Traverses up the DOM tree from the given node until a match is found or the root is reached. + * + * @param node - The starting DOM node to check + * @param names - Array of node names (tag names) to search for in uppercase (e.g., ['TABLE', 'DIV']) + * @returns true if an ancestor with a matching name is found, false otherwise + */ + DOMUtil.hasParent = function (node, names) { + var p = DOMWalker_1.DOMWalker.parentElement(node); + while (p && !names.includes(p.nodeName)) { + p = DOMWalker_1.DOMWalker.parentElement(p); + } + return !!p; + }; + /** + * Retrieves the first ancestor element that matches any of the provided node names (case-insensitive). + * Similar to hasParent but returns the actual element reference and performs case-insensitive comparison. + * + * @param node - The starting DOM node + * @param names - Array of lowercase node names to search for (e.g., ['table', 'div']) + * @returns The matching ancestor element, or null if none found + */ + DOMUtil.getAncestor = function (node, names) { + var p = DOMWalker_1.DOMWalker.parentElement(node); + while (p && !names.includes(p.nodeName.toLowerCase())) { + p = DOMWalker_1.DOMWalker.parentElement(p); + } + return p; + }; + /** + * Determines if two nodes are the same node, with fallback strategies for different browser environments. + * Uses multiple comparison methods for cross-browser compatibility: + * 1. Strict equality (===) + * 2. isSameNode() method if available + * 3. compareDocumentPosition() (returns 0 if same node) + * 4. Returns true as last resort if no comparison method is available + * + * @param a - First node to compare + * @param b - Second node to compare + * @returns true if nodes are the same, false otherwise + */ + DOMUtil.sameNode = function (a, b) { + if (a === b) { + return true; + } + else if (a.isSameNode) { + return a.isSameNode(b); + } + else if (a.compareDocumentPosition) { + return a.compareDocumentPosition(b) === 0; + } + else { + // Not supported in this environment - try our best + return true; + } + }; + /** + * Normalizes whitespace in a string by replacing all whitespace characters + * (spaces, tabs, carriage returns, newlines) with single spaces and collapsing + * multiple consecutive spaces into one. + * + * @param s - The input string to clean + * @returns The cleaned string with normalized whitespace + * @example "Hello\n\t World" → "Hello World" + */ + DOMUtil.cleanWhitespace = function (s) { + var retVal = s.replace(/[ \t\r\n]/g, " ").replace(/ +/g, " "); + return retVal; + }; + /** + * Collapses multiple consecutive spaces into a single space. + * Unlike cleanWhitespace, only handles spaces, not other whitespace characters like tabs or newlines. + * + * @param s - The input string to clean + * @returns The string with collapsed spaces + */ + DOMUtil.cleanSpace = function (s) { + var retVal = s.replace(/ +/g, " "); + return retVal; + }; + /** + * Determines if two elements (typically table cells) belong to the same table element. + * Finds the table ancestor for each element and compares them using sameNode(). + * + * @param element1 - First element to check + * @param element2 - Second element to check + * @returns true if both elements share the same table ancestor, false otherwise + */ + DOMUtil.isInSameTable = function (element1, element2) { + if (element1 && element2) { + var parentName = ['table']; + var parent1 = DOMUtil.getAncestor(element1, parentName); + var parent2 = DOMUtil.getAncestor(element2, parentName); + if (parent1 !== null && parent2 != null && DOMUtil.sameNode(parent1, parent2)) + return true; + } + return false; + }; + /** + * Traverses up the DOM tree to find the shadow root (document fragment) that contains the given node. + * Important for handling Web Components and Shadow DOM structures in accessibility checking. + * + * @param node - The starting node + * @returns The shadow root node (nodeType 11 = DOCUMENT_FRAGMENT_NODE), or null if none found + */ + DOMUtil.shadowRootNode = function (node) { + var nd = node; + while (nd != null && nd.nodeType !== 11 /* Node.DOCUMENT_FRAGMENT_NODE */) + nd = nd.parentNode; + return nd; + }; + /** + * Creates a deep copy of an object while preserving Node references (doesn't clone Node objects). + * Useful when copying data structures that contain DOM node references, as you typically want + * to preserve those references rather than attempting to clone the nodes themselves. + * + * Behavior: + * - Primitive values: Deep copied via JSON serialization + * - Functions: Returned as-is (reference) + * - Node objects: Returned as-is (reference, not cloned) + * - Arrays/Objects: Recursively copied with the same rules + * + * @param rhs - The object to copy (right-hand side) + * @returns A copy of the object with Node references preserved + */ + DOMUtil.objectCopyWithNodeRefs = function (rhs) { + if (!rhs) + return rhs; + if (typeof rhs !== "object") { + if (typeof rhs === "function") { + return rhs; + } + else { + return JSON.parse(JSON.stringify(rhs)); + } + } + else if (rhs instanceof Node || !!rhs.nodeType) { + return rhs; + } + else { + var retVal = void 0; + if (rhs.constructor.name === "Array") { + retVal = []; + for (var _i = 0, rhs_1 = rhs; _i < rhs_1.length; _i++) { + var item = rhs_1[_i]; + retVal.push(this.objectCopyWithNodeRefs(item)); + } + } + else { + retVal = {}; + for (var key in rhs) { + retVal[key] = this.objectCopyWithNodeRefs(rhs[key]); + } + } + return retVal; + } + }; + /** + * Finds the first ancestor element that has a specific attribute with a specific value. + * Traverses up the DOM tree from the given element until a matching ancestor is found. + * + * @param element - The starting element + * @param attrName - The attribute name to search for + * @param attrValue - The expected attribute value + * @returns The matching ancestor element, or null if none found + * @example Finding an ancestor with aria-hidden="true" or data-testid="container" + */ + DOMUtil.getAncestorWithAttribute = function (element, attrName, attrValue) { + var walkNode = DOMWalker_1.DOMWalker.parentNode(element); + while (walkNode !== null) { + if (walkNode.nodeType === 1 /* Node.ELEMENT_NODE */ && walkNode.getAttribute(attrName) === attrValue) + return walkNode; + walkNode = DOMWalker_1.DOMWalker.parentNode(walkNode); + } + return null; + }; + return DOMUtil; +}()); +exports.DOMUtil = DOMUtil; + + +/***/ }, + +/***/ "./src/v2/dom/DOMWalker.ts" +/*!*********************************!*\ + !*** ./src/v2/dom/DOMWalker.ts ***! + \*********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.DOMWalker = void 0; +var VisUtil_1 = __webpack_require__(/*! ../../v4/util/VisUtil */ "./src/v4/util/VisUtil.ts"); +/** + * Walks in a DOM order + * + * Assumption that nodes of shadow DOMs call assignSlots on the shadow root before + * doing other processing in that tree. If you walk into a shadow root, the DOMWalker + * will do it automatically. + * + * See also ../aria/ARIAWalker + */ +var DOMWalker = /** @class */ (function () { + function DOMWalker(element, bEnd, root, considerHidden, DEBUG) { + this.DEBUGIDX = 0; + this.indent = 0; + this.DEBUG = !!DEBUG; + this.root = root || ((element && element.ownerDocument) ? element.ownerDocument.documentElement : element); + if (this.root.nodeType === 9) { + this.root = this.root.documentElement; + } + this.node = element; + if (this.node.nodeType === 9) { + this.node = this.node.documentElement; + } + this.bEndTag = (bEnd == undefined ? false : bEnd == true); + this.considerHidden = considerHidden || false; + } + DOMWalker.prototype.elem = function () { + return this.node.nodeType === 1 && this.node || null; + }; + DOMWalker.parentNode = function (node) { + if (node === null) + return null; + var p = node.parentNode; + if (node.slotOwner) { + p = node.slotOwner; + } + else if (node.ownerElement) { + p = node.ownerElement; + } + else if (p && p.nodeType === 11) { + if (p.host) { + p = p.host; + } + else { + p = null; + } + } + return p; + }; + DOMWalker.parentElement = function (node) { + var elem = node; + do { + elem = DOMWalker.parentNode(elem); + } while (elem && elem.nodeType !== 1); + return elem; + }; + DOMWalker.assignSlots = function (root) { + var slots = root.querySelectorAll("slot"); + for (var iSlot = 0; iSlot < slots.length; ++iSlot) { + var processSlot = slots[iSlot]; + var assignedNodes = processSlot.assignedNodes(); + for (var iAssigned = 0; iAssigned < assignedNodes.length; ++iAssigned) { + assignedNodes[iAssigned].slotOwner = processSlot; + assignedNodes[iAssigned].slotIndex = iAssigned; + } + } + }; + DOMWalker.firstChildNotOwnedBySlot = function (node) { + var retVal = node.firstChild; + while (retVal && retVal.slotOwner) { + retVal = retVal.nextSibling; + } + return retVal; + }; + DOMWalker.lastChildNotOwnedBySlot = function (node) { + var retVal = node.lastChild; + while (retVal && retVal.slotOwner) { + retVal = retVal.previousSibling; + } + return retVal; + }; + DOMWalker.nextSiblingNotOwnedBySlot = function (node) { + var retVal = node.nextSibling; + while (retVal && retVal.slotOwner) { + retVal = retVal.nextSibling; + } + return retVal; + }; + DOMWalker.previousSiblingNotOwnedBySlot = function (node) { + var retVal = node.previousSibling; + while (retVal && retVal.slotOwner) { + retVal = retVal.previousSibling; + } + return retVal; + }; + DOMWalker.prototype.atRoot = function () { + if (this.node.ownerElement) + return false; + if (this.root === this.node) { + return true; + } + else if (this.root.isSameNode) { + return this.root.isSameNode(this.node); + } + else if (this.root.compareDocumentPosition) { + return this.root.compareDocumentPosition(this.node) === 0; + } + else { + // Not supported in this environment - try our best + return this.node.parentNode === null; + } + }; + DOMWalker.prototype.nextNode = function () { + var _this = this; + var indent = function () { + var s = ""; + for (var idx = 0; idx < _this.indent; ++idx) { + s += " "; + } + return s; + }; + var DBG = false; //this.DEBUGIDX >= 7 && this.DEBUGIDX <= 10; + var startName = this.node.nodeName; + if (!this.node) { + this.bEndTag = false; + return false; + } + do { + //console.log(this.node.nodeName, this.bEndTag?"END":"START", this.node.nodeType === 1 && (this.node as any).getAttribute("id")); + if (!this.bEndTag) { + var iframeNode = this.node; + var elementNode = this.node; + var slotElement = this.node; + if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && this.node.nodeName.toUpperCase() === "IFRAME" + && (this.considerHidden ? VisUtil_1.VisUtil.isNodeVisible(iframeNode) : true) + && iframeNode.contentDocument + && iframeNode.contentDocument.documentElement) { + DBG && console.log("!!!Into Frame"); + var ownerElement = this.node; + this.node = iframeNode.contentDocument.documentElement; + this.node.ownerElement = ownerElement; + } + else if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && (this.considerHidden ? VisUtil_1.VisUtil.isNodeVisible(elementNode) : true) + && elementNode.shadowRoot + && elementNode.shadowRoot.firstChild) { + DBG && console.log("!!!Into shadow root"); + var ownerElement = this.node; + this.node = elementNode.shadowRoot; + this.node.ownerElement = ownerElement; + DOMWalker.assignSlots(this.node); + } + else if (this.node.nodeType === 1 + && elementNode.nodeName.toLowerCase() === "slot" + && slotElement.assignedNodes().length > 0) { + DBG && console.log("!!!Into slot"); + this.node = slotElement.assignedNodes()[0]; + } + else if ((this.node.nodeType === 1 /* Node.ELEMENT_NODE */ || this.node.nodeType === 11 /* Node.DOCUMENT_FRAGMENT_NODE */) + && DOMWalker.firstChildNotOwnedBySlot(this.node)) { + DBG && console.log("!!!First child"); + this.node = DOMWalker.firstChildNotOwnedBySlot(this.node); + } + else { + DBG && console.log("!!!Flip to end tag"); + this.bEndTag = true; + } + } + else { + DBG && console.log("!!!1"); + if (this.atRoot()) { + DBG && console.log("!!!Done at root"); + return false; + } + else if (this.node.slotOwner) { + var slotOwner = this.node.slotOwner; + var nextSlotIndex = this.node.slotIndex + 1; + // delete (this.node as any).slotOwner; + // delete (this.node as any).slotIndex; + if (nextSlotIndex < slotOwner.assignedNodes().length) { + DBG && console.log("!!!Next slot child"); + this.node = slotOwner.assignedNodes()[nextSlotIndex]; + this.bEndTag = false; + } + else { + DBG && console.log("!!!Back up to slot owner"); + this.node = slotOwner; + this.bEndTag = true; + } + } + else if (this.node.ownerElement) { + DBG && console.log("!!!Up to frame owner"); + this.node = this.node.ownerElement; + this.bEndTag = true; + } + else if (DOMWalker.nextSiblingNotOwnedBySlot(this.node)) { + DBG && console.log("!!!Next sibling"); + this.node = DOMWalker.nextSiblingNotOwnedBySlot(this.node); + this.bEndTag = false; + } + else if (this.node.parentNode) { + DBG && console.log("!!!Parent"); + this.node = this.node.parentNode; + this.bEndTag = true; + } + else { + DBG && console.log("!!!Done with walk"); + return false; + } + } + if (DBG && ((this.node.nodeType !== 1 && this.node.nodeType !== 11 && this.node.nodeType !== 3) + || (this.node.nodeType === 1 && this.node.getAttribute("aChecker") === "ACE"))) { + this.DEBUG && console.log(indent() + "<".concat(this.bEndTag ? "/" : "").concat(this.node.nodeName, "> (from ").concat(startName, ") ").concat(this.DEBUGIDX++, " SKIPPED")); + } + } while ((this.node.nodeType !== 1 && this.node.nodeType !== 11 && this.node.nodeType !== 3) + || (this.node.nodeType === 1 && this.node.getAttribute("aChecker") === "ACE")); + if (this.bEndTag) + this.indent -= 2; + this.DEBUG && console.log(indent() + "<".concat(this.bEndTag ? "/" : "").concat(this.node.nodeName, "> (from ").concat(startName, ") ").concat(this.DEBUGIDX++)); + this.DEBUG && this.node.slotOwner && console.log(indent() + "slotOwner: ".concat(this.node.slotOwner.nodeName)); + this.DEBUG && this.node.slotIndex && console.log(indent() + "slotIndex: ".concat(this.node.slotIndex)); + this.DEBUG && this.node.ownerElement && console.log(indent() + "ownerElement: ".concat(this.node.ownerElement.nodeName)); + if (!this.bEndTag) + this.indent += 2; + return true; + }; + DOMWalker.prototype.prevNode = function () { + do { + if (this.bEndTag) { + var iframeNode = this.node; + var elementNode = this.node; + if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && this.node.nodeName.toUpperCase() === "IFRAME" + && (this.considerHidden ? VisUtil_1.VisUtil.isNodeVisible(iframeNode) : true) + && iframeNode.contentDocument + && iframeNode.contentDocument.documentElement) { + var ownerElement = this.node; + this.node = iframeNode.contentDocument.documentElement; + this.node.ownerElement = ownerElement; + } + else if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && (this.considerHidden ? VisUtil_1.VisUtil.isNodeVisible(elementNode) : true) + && elementNode.shadowRoot + && elementNode.shadowRoot.lastChild) { + var ownerElement = this.node; + this.node = elementNode.shadowRoot; + this.node.ownerElement = ownerElement; + DOMWalker.assignSlots(this.node); + } + else if (this.node.nodeType === 1 + && elementNode.nodeName.toLowerCase() === "slot" + && elementNode.assignedNodes().length > 0) { + // Enter slot with assigned nodes - go to last assigned node + var slotElement = elementNode; + this.node = slotElement.assignedNodes()[slotElement.assignedNodes().length - 1]; + } + else if ((this.node.nodeType === 1 /* Node.ELEMENT_NODE */ || this.node.nodeType === 11) + && DOMWalker.lastChildNotOwnedBySlot(this.node)) { + this.node = DOMWalker.lastChildNotOwnedBySlot(this.node); + } + else { + this.bEndTag = false; + } + } + else { + if (this.atRoot()) { + return false; + } + else if (this.node.slotOwner) { + var slotOwner = this.node.slotOwner; + var prevSlotIndex = this.node.slotIndex - 1; + if (prevSlotIndex >= 0) { + this.node = slotOwner.assignedNodes()[prevSlotIndex]; + this.bEndTag = true; + } + else { + this.node = slotOwner; + this.bEndTag = false; + } + } + else if (DOMWalker.previousSiblingNotOwnedBySlot(this.node)) { + this.node = DOMWalker.previousSiblingNotOwnedBySlot(this.node); + this.bEndTag = true; + } + else if (this.node.ownerElement) { + this.node = this.node.ownerElement; + this.bEndTag = false; + } + else if (this.node.parentNode) { + this.node = this.node.parentNode; + this.bEndTag = false; + } + else { + return false; + } + } + } while ((this.node.nodeType !== 1 /* Node.ELEMENT_NODE */ && this.node.nodeType !== 11 && this.node.nodeType !== 3) + || (this.node.nodeType === 1 && this.node.getAttribute("aChecker") === "ACE")); + return true; + }; + return DOMWalker; +}()); +exports.DOMWalker = DOMWalker; + + +/***/ }, + +/***/ "./src/v4/api/IGuideline.ts" +/*!**********************************!*\ + !*** ./src/v4/api/IGuideline.ts ***! + \**********************************/ +(__unused_webpack_module, exports) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.eGuidelineType = exports.eGuidelineCategory = exports.eToolkitLevel = void 0; +var eToolkitLevel; +(function (eToolkitLevel) { + eToolkitLevel["LEVEL_ONE"] = "1"; + eToolkitLevel["LEVEL_TWO"] = "2"; + eToolkitLevel["LEVEL_THREE"] = "3"; + eToolkitLevel["LEVEL_FOUR"] = "4"; +})(eToolkitLevel = exports.eToolkitLevel || (exports.eToolkitLevel = {})); +var eGuidelineCategory; +(function (eGuidelineCategory) { + eGuidelineCategory["ACCESSIBILITY"] = "Accessibility"; + eGuidelineCategory["DESIGN"] = "Design"; + eGuidelineCategory["OTHER"] = "Other"; +})(eGuidelineCategory = exports.eGuidelineCategory || (exports.eGuidelineCategory = {})); +var eGuidelineType; +(function (eGuidelineType) { + eGuidelineType["DEFAULT"] = "default"; + eGuidelineType["EXTENSION"] = "extension"; +})(eGuidelineType = exports.eGuidelineType || (exports.eGuidelineType = {})); + + +/***/ }, + +/***/ "./src/v4/api/IRule.ts" +/*!*****************************!*\ + !*** ./src/v4/api/IRule.ts ***! + \*****************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.eRulesetType = exports.eRuleCategory = exports.eToolkitLevel = exports.RuleManual = exports.RulePotential = exports.RuleFail = exports.RuleRender = exports.RulePass = exports.eRulePolicy = exports.eRuleConfidence = void 0; +var eRuleConfidence; +(function (eRuleConfidence) { + eRuleConfidence["PASS"] = "PASS"; + eRuleConfidence["FAIL"] = "FAIL"; + eRuleConfidence["POTENTIAL"] = "POTENTIAL"; + eRuleConfidence["MANUAL"] = "MANUAL"; +})(eRuleConfidence = exports.eRuleConfidence || (exports.eRuleConfidence = {})); +var eRulePolicy; +(function (eRulePolicy) { + eRulePolicy["VIOLATION"] = "VIOLATION"; + eRulePolicy["RECOMMENDATION"] = "RECOMMENDATION"; + eRulePolicy["INFORMATION"] = "INFORMATION"; +})(eRulePolicy = exports.eRulePolicy || (exports.eRulePolicy = {})); +function RulePass(reasonId, messageArgs, apiArgs) { + if (typeof reasonId === "undefined" || reasonId === null) + throw new Error("Reason ID must be defined"); + return { + value: [eRulePolicy.INFORMATION, eRuleConfidence.PASS], + reasonId: reasonId, + messageArgs: messageArgs || [], + apiArgs: apiArgs || [] + }; +} +exports.RulePass = RulePass; +function RuleRender(reasonId, messageArgs, apiArgs) { + if (typeof reasonId === "undefined" || reasonId === null) + throw new Error("Reason ID must be defined"); + return { + value: [eRulePolicy.INFORMATION, eRuleConfidence.PASS], + reasonId: 0, + messageArgs: messageArgs || [], + apiArgs: apiArgs || [] + }; +} +exports.RuleRender = RuleRender; +function RuleFail(reasonId, messageArgs, apiArgs) { + if (typeof reasonId === "undefined" || reasonId === null) + throw new Error("Reason ID must be defined"); + return { + value: [eRulePolicy.INFORMATION, eRuleConfidence.FAIL], + reasonId: reasonId, + messageArgs: messageArgs || [], + apiArgs: apiArgs || [] + }; +} +exports.RuleFail = RuleFail; +function RulePotential(reasonId, messageArgs, apiArgs) { + if (typeof reasonId === "undefined" || reasonId === null) + throw new Error("Reason ID must be defined"); + return { + value: [eRulePolicy.INFORMATION, eRuleConfidence.POTENTIAL], + reasonId: reasonId, + messageArgs: messageArgs || [], + apiArgs: apiArgs || [] + }; +} +exports.RulePotential = RulePotential; +function RuleManual(reasonId, messageArgs, apiArgs) { + if (typeof reasonId === "undefined" || reasonId === null) + throw new Error("Reason ID must be defined"); + return { + value: [eRulePolicy.INFORMATION, eRuleConfidence.MANUAL], + reasonId: reasonId, + messageArgs: messageArgs || [], + apiArgs: apiArgs || [] + }; +} +exports.RuleManual = RuleManual; +/** + * @deprecated See ./IGuideline + */ +var IGuideline_1 = __webpack_require__(/*! ./IGuideline */ "./src/v4/api/IGuideline.ts"); +Object.defineProperty(exports, "eToolkitLevel", ({ enumerable: true, get: function () { return IGuideline_1.eToolkitLevel; } })); +/** + * @deprecated See ./IGuideline:eGuidelineCategory + */ +var IGuideline_2 = __webpack_require__(/*! ./IGuideline */ "./src/v4/api/IGuideline.ts"); +Object.defineProperty(exports, "eRuleCategory", ({ enumerable: true, get: function () { return IGuideline_2.eGuidelineCategory; } })); +/** + * @deprecated See ./IGuideline:eGuidelineType + */ +var IGuideline_3 = __webpack_require__(/*! ./IGuideline */ "./src/v4/api/IGuideline.ts"); +Object.defineProperty(exports, "eRulesetType", ({ enumerable: true, get: function () { return IGuideline_3.eGuidelineType; } })); + + +/***/ }, + +/***/ "./src/v4/checker/Checker.ts" +/*!***********************************!*\ + !*** ./src/v4/checker/Checker.ts ***! + \***********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Checker = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var Engine_1 = __webpack_require__(/*! ../../v2/common/Engine */ "./src/v2/common/Engine.ts"); +var ARIAMapper_1 = __webpack_require__(/*! ../../v2/aria/ARIAMapper */ "./src/v2/aria/ARIAMapper.ts"); +var rulesets_1 = __webpack_require__(/*! ../rulesets */ "./src/v4/rulesets.ts"); +var checkRulesV4 = __importStar(__webpack_require__(/*! ../rules */ "./src/v4/rules/index.ts")); +var IGuideline_1 = __webpack_require__(/*! ../api/IGuideline */ "./src/v4/api/IGuideline.ts"); +var checkRules = []; +var checkNls = {}; +var checkHelp = {}; +function _initialize() { + var langs = JSON.parse(JSON.stringify(Engine_1.Engine.getLanguages())); + // Default lang to en-US if nothing else specified is found + langs.push("en-US"); + // Process V4 rules into the V2 format + for (var rulename in checkRulesV4) { + // Convert rule + var v4Rule = checkRulesV4[rulename]; + checkRules.push(v4Rule); + // Go backwards because the first lang is the preferred, so + // earlier languages will override later languages + for (var idx = langs.length - 1; idx >= 0; --idx) { + var langId = langs[idx]; + if (langId in v4Rule.messages) { + checkNls[v4Rule.id] = v4Rule.messages[langId]; + checkNls[v4Rule.id][0] = checkNls[v4Rule.id].group; + } + if (langId in v4Rule.help) { + checkHelp[v4Rule.id] = {}; + for (var reasonId in v4Rule.help[langId]) { + checkHelp[v4Rule.id][reasonId] = "/".concat(langId, "/").concat(v4Rule.help[langId][reasonId]); + } + checkNls[v4Rule.id][0] = checkNls[v4Rule.id].group; + } + } + // Convert RS + for (var _i = 0, _a = v4Rule.rulesets; _i < _a.length; _i++) { + var rsSection = _a[_i]; + for (var _b = 0, _c = rulesets_1.a11yRulesets; _b < _c.length; _b++) { + var rs = _c[_b]; + var checkRsIds = typeof rsSection.id === "string" ? [rsSection.id] : rsSection.id; + if (checkRsIds.includes(rs.id)) { + for (var _d = 0, _e = rs.checkpoints; _d < _e.length; _d++) { + var cp = _e[_d]; + var checkCPIds = typeof rsSection.num === "string" ? [rsSection.num] : rsSection.num; + if (checkCPIds.includes(cp.num)) { + cp.rules = cp.rules || []; + cp.rules.push({ + id: v4Rule.id, + reasonCodes: rsSection.reasonCodes, + level: rsSection.level, + toolkitLevel: rsSection.toolkitLevel + }); + } + } + } + } + } + } +} +_initialize(); +var Checker = /** @class */ (function () { + function Checker() { + this.guidelines = []; + /** + * @deprecated Use getGuidelines(). + */ + this.rulesets = this.guidelines; + /** + * @deprecated Use getGuidelineIds(). + */ + this.rulesetIds = []; + this.rulesetRules = {}; + this.ruleLevels = {}; + this.ruleReasonLevels = {}; + this.ruleCategory = {}; + var engine = this.engine = new Engine_1.Engine(); + engine.addMapper(new ARIAMapper_1.ARIAMapper()); + engine.addRules(checkRules); + engine.addNlsMap(checkNls); + engine.addHelpMap(checkHelp); + for (var _i = 0, a11yRulesets_1 = rulesets_1.a11yRulesets; _i < a11yRulesets_1.length; _i++) { + var rs = a11yRulesets_1[_i]; + this.addRuleset(rs); + } + } + /** + * Adds a guideline to the engine. If the id already exists, the previous guideline will be replaced. + * @param guideline + */ + Checker.prototype.addGuideline = function (guideline) { + if (guideline.id in this.rulesetRules) { + this.removeGuideline(guideline.id); + } + this.guidelines.push(guideline); + this.rulesetIds.push(guideline.id); + var ruleIds = []; + for (var _i = 0, _a = guideline.checkpoints; _i < _a.length; _i++) { + var cp = _a[_i]; + cp.rules = cp.rules || []; + for (var _b = 0, _c = cp.rules; _b < _c.length; _b++) { + var rule = _c[_b]; + if (rule.enabled !== false) { + ruleIds.push(rule.id); + //this.ruleLevels[rule.id] = this.ruleLevels[rule.id] || {}; + //this.ruleLevels[rule.id][guideline.id] = rule.level; + this.ruleReasonLevels[rule.id] = this.ruleReasonLevels[rule.id] || {}; + this.ruleReasonLevels[rule.id][guideline.id] = this.ruleReasonLevels[rule.id][guideline.id] || {}; + var code = rule.reasonCodes ? rule.reasonCodes.join('--') : "None"; + this.ruleReasonLevels[rule.id][guideline.id][code] = rule.level; + this.ruleCategory[rule.id] = this.ruleCategory[rule.id] || {}; + this.ruleCategory[rule.id][guideline.id] = guideline.category; + } + } + } + this.rulesetRules[guideline.id] = ruleIds; + }; + /** + * Enable a rule for all guidelines + * @param ruleId + */ + Checker.prototype.enableRule = function (ruleId) { + for (var _i = 0, _a = this.getGuidelines(); _i < _a.length; _i++) { + var guideline = _a[_i]; + var updated = false; + for (var _b = 0, _c = guideline.checkpoints; _b < _c.length; _b++) { + var cp = _c[_b]; + for (var _d = 0, _e = cp.rules; _d < _e.length; _d++) { + var rule = _e[_d]; + if (rule.enabled === false) { + updated = true; + delete rule.enabled; + } + } + } + if (updated) { + this.addGuideline(guideline); + } + } + }; + /** + * Disable a rule for all guidelines + * @param ruleId + */ + Checker.prototype.disableRule = function (ruleId) { + for (var _i = 0, _a = this.getGuidelines(); _i < _a.length; _i++) { + var guideline = _a[_i]; + var updated = false; + for (var _b = 0, _c = guideline.checkpoints; _b < _c.length; _b++) { + var cp = _c[_b]; + for (var _d = 0, _e = cp.rules; _d < _e.length; _d++) { + var rule = _e[_d]; + if (rule.enabled !== false) { + updated = true; + rule.enabled = false; + } + } + } + if (updated) { + this.addGuideline(guideline); + } + } + }; + /** + * Remove a guideline from the engine + * + * Generally, there isn't a good reason to do this. Users should just not select the guideline as an option in check + * @param guidelineId + */ + Checker.prototype.removeGuideline = function (guidelineId) { + if (guidelineId in this.rulesetRules) { + delete this.rulesetRules[guidelineId]; + this.rulesets = this.guidelines = this.guidelines.filter(function (guideline) { return guideline.id !== guidelineId; }); + this.rulesetIds = this.getGuidelineIds(); + } + }; + /** + * Get the guidelines available in the engine + * @returns + */ + Checker.prototype.getGuidelines = function () { + return JSON.parse(JSON.stringify(this.guidelines)); + }; + /** + * Get the ids of the guidelines available in the engine + * @returns + */ + Checker.prototype.getGuidelineIds = function () { + return this.guidelines.map(function (guideline) { return guideline.id; }); + }; + /** + * + * @deprecated See addGuideline + */ + Checker.prototype.addRuleset = function (rs) { + this.addGuideline(rs); + }; + Checker.prototype.enableSourceMap = function (enable) { + this.engine.enableSourceMap(enable); + }; + Checker.prototype.isSourceMapEnabled = function () { + return this.engine.isSourceMapEnabled(); + }; + /** + * Perform a check of the specified node/document + * @param node DOMNode or Document on which to run the check + * @param guidelineIds Guideline ids to check with to specify which rules to run + * @returns + */ + Checker.prototype.check = function (node, guidelineIds) { + // Determine which rules to run + var ruleIds = []; + // Fix the input + if (!guidelineIds) { + ruleIds = this.engine.getRulesIds(); + } + else { + if (typeof guidelineIds === "string") { + guidelineIds = [guidelineIds]; + } + for (var _i = 0, guidelineIds_1 = guidelineIds; _i < guidelineIds_1.length; _i++) { + var rsId = guidelineIds_1[_i]; + if (rsId in this.rulesetRules) { + ruleIds = ruleIds.concat(this.rulesetRules[rsId]); + } + } + } + this.engine.enableRules(ruleIds); + // Add the report levels + var myThis = this; + return this.engine.run(node) + .then(function (report) { + report.nls = {}; + for (var _i = 0, _a = report.results; _i < _a.length; _i++) { + var result = _a[_i]; + if (result.ruleId in checkNls) { + report.nls[result.ruleId] = report.nls[result.ruleId] || { + 0: checkNls[result.ruleId][0] + }; + if (result.reasonId in checkNls[result.ruleId]) { + report.nls[result.ruleId][result.reasonId] = checkNls[result.ruleId][result.reasonId]; + } + } + //result.value[0] = myThis.getLevel(guidelineIds as string[], result.ruleId); + var code = result.reasonId ? result.reasonId : "None"; + result.value[0] = myThis.getReasonLevel(guidelineIds, result.ruleId, code); + result.category = myThis.getCategory(guidelineIds, result.ruleId); + delete result.path.css; + } + return report; + }); + }; + Checker.prototype.getLevel = function (rsIds, ruleId) { + if (!rsIds) + return IRule_1.eRulePolicy.INFORMATION; + var rsInfo = this.ruleLevels[ruleId]; + var retVal = null; + if (rsIds) { + if (!(ruleId in this.ruleLevels)) { + throw new Error("Rule triggered for which we have no rule level information: " + ruleId); + } + for (var _i = 0, rsIds_1 = rsIds; _i < rsIds_1.length; _i++) { + var rsId = rsIds_1[_i]; + if (rsId in rsInfo) { + if (rsInfo[rsId] === IRule_1.eRulePolicy.VIOLATION) { + retVal = IRule_1.eRulePolicy.VIOLATION; + } + else if (rsInfo[rsId] === IRule_1.eRulePolicy.RECOMMENDATION && retVal === null) { + retVal = IRule_1.eRulePolicy.RECOMMENDATION; + } + else if (retVal === null) { + retVal = IRule_1.eRulePolicy.INFORMATION; + } + } + } + } + if (retVal === null) { + throw new Error("Rule triggered for which we have no rule level information: " + ruleId); + } + return retVal; + }; + Checker.prototype.getReasonLevel = function (rsIds, ruleId, reasonCode) { + if (!rsIds) + return IRule_1.eRulePolicy.INFORMATION; + var rsInfo = this.ruleReasonLevels[ruleId]; + var retVal = null; + if (rsIds) { + if (!(ruleId in this.ruleReasonLevels)) { + throw new Error("Rule triggered for which we have no rule level information " + ruleId); + } + var _loop_1 = function (rsId) { + if (rsId in rsInfo) { + var reCode_1 = new RegExp("(^|--)".concat(reasonCode, "($|--)")); + Object.keys(rsInfo[rsId]).forEach(function (code) { + var level = null; + if (code === 'None') + level = rsInfo[rsId]["None"]; + else if (reCode_1.test(code)) + level = rsInfo[rsId][code]; + if (level !== null) { + if (level === IRule_1.eRulePolicy.VIOLATION) { + retVal = IRule_1.eRulePolicy.VIOLATION; + } + else if (level === IRule_1.eRulePolicy.RECOMMENDATION && retVal === null) { + retVal = IRule_1.eRulePolicy.RECOMMENDATION; + } + else if (retVal === null) { + retVal = IRule_1.eRulePolicy.INFORMATION; + } + } + }); + if (retVal === null) { + retVal = IRule_1.eRulePolicy.INFORMATION; + } + } + }; + for (var _i = 0, rsIds_2 = rsIds; _i < rsIds_2.length; _i++) { + var rsId = rsIds_2[_i]; + _loop_1(rsId); + } + } + if (retVal === null) { + throw new Error("Rule triggered for which we have no rule level information: " + ruleId); + } + return retVal; + }; + Checker.prototype.getCategory = function (rsIds, ruleId) { + var rsInfo = this.ruleCategory[ruleId]; + var retVal = ""; + if (!(ruleId in this.ruleCategory)) { + return IGuideline_1.eGuidelineCategory.OTHER; + } + if (!rsIds) { + rsIds = this.getGuidelineIds(); + } + for (var _i = 0, rsIds_3 = rsIds; _i < rsIds_3.length; _i++) { + var rsId = rsIds_3[_i]; + if (rsId in rsInfo) { + return rsInfo[rsId]; + } + } + return IGuideline_1.eGuidelineCategory.OTHER; + }; + return Checker; +}()); +exports.Checker = Checker; + + +/***/ }, + +/***/ "./src/v4/rules/a_target_warning.ts" +/*!******************************************!*\ + !*** ./src/v4/rules/a_target_warning.ts ***! + \******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.a_target_warning = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.a_target_warning = { + id: "a_target_warning", + context: "dom:a[target],dom:area[target],dom:base[target]", + refactor: { + "WCAG20_A_TargetAndText": { + "Pass_0": "pass", + "Potential_1": "potential_warn" + } + }, + help: { + "en-US": { + "group": "a_target_warning.html", + "pass": "a_target_warning.html", + "potential_warn": "a_target_warning.html" + } + }, + messages: { + "en-US": { + "group": "Users should be warned in advance if their input action will open a new window", + "pass": "The user is warned in advance that the input action opens a new window", + "potential_warn": "Inform the user when their input action will open a new window" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "3.2.2", + level: IRule_2.eRulePolicy.RECOMMENDATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // skip the rule if it's AT hidden and not tabbable + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) && !CommonUtil_1.CommonUtil.isTabbable(ruleContext)) + return null; + var params = { + paramWinText: { + value: ["new window", "new tab"], + type: "array" + } + }; + var tStr = ruleContext.getAttribute("target"); + var passed = tStr == "_parent" || tStr == "_self" || tStr == "_top" || CommonUtil_1.CommonUtil.getFrameByName(ruleContext, tStr) != null; + if (!passed) { + // Name is not part of this frameset – must have potential to create new window? + // See if a new window is mentioned + var textStr = CommonUtil_1.CommonUtil.getInnerText(ruleContext); + if (ruleContext.hasAttribute("title")) + textStr += " " + ruleContext.getAttribute("title"); + // Check aria-describedby for warning text + if (ruleContext.hasAttribute("aria-describedby")) { + var describedbyIds = ruleContext.getAttribute("aria-describedby").trim().split(/\s+/); + for (var _i = 0, describedbyIds_1 = describedbyIds; _i < describedbyIds_1.length; _i++) { + var id = describedbyIds_1[_i]; + var referencedElem = fragment_1.FragmentUtil.getById(ruleContext, id); + if (referencedElem) { + var describedText = CommonUtil_1.CommonUtil.getInnerText(referencedElem); + if (describedText && describedText.trim().length > 0) { + textStr += " " + describedText; + } + } + } + } + for (var i = 0; !passed && i < params.paramWinText.value.length; ++i) + if (textStr.indexOf(params.paramWinText.value[i]) != -1) + passed = true; + } + return passed ? (0, IRule_1.RulePass)("pass") : (0, IRule_1.RulePotential)("potential_warn"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/a_text_purpose.ts" +/*!****************************************!*\ + !*** ./src/v4/rules/a_text_purpose.ts ***! + \****************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.a_text_purpose = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +exports.a_text_purpose = { + id: "a_text_purpose", + // doc-biblioref is a link + context: "aria:link,aria:doc-biblioref", + refactor: { + "WCAG20_A_HasText": { + "Pass_0": "pass", + "Fail_1": "fail_acc_name" + } + }, + help: { + "en-US": { + "group": "a_text_purpose.html", + "pass": "a_text_purpose.html", + "fail_acc_name": "a_text_purpose.html" + } + }, + messages: { + "en-US": { + "group": "Hyperlinks must have an accessible name for their purpose", + "pass": "Hyperlink has a description of its purpose", + "fail_acc_name": "Hyperlink has no link text, label or image with a text alternative" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: ["2.4.4", "4.1.2"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: "c487ae", + run: function (context, options) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) { + return null; + } + // Rule only passes if an element has inner content, + // in the case that there is only hidden content under the the element it is a violation + var accName_pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + var passed = (accName_pair && accName_pair.name && accName_pair.name.trim().length > 0) + /**ARIAMapper.computeName(ruleContext).trim().length > 0*/ + || CommonUtil_1.CommonUtil.nonTabableChildCheck(ruleContext); + if (!passed) { + return (0, IRule_1.RuleFail)("fail_acc_name"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/applet_alt_exists.ts" +/*!*******************************************!*\ + !*** ./src/v4/rules/applet_alt_exists.ts ***! + \*******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.applet_alt_exists = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.applet_alt_exists = { + id: "applet_alt_exists", + context: "dom:applet", + refactor: { + "WCAG20_Applet_HasAlt": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3" + } + }, + help: { + "en-US": { + "group": "applet_alt_exists.html", + "Pass_0": "applet_alt_exists.html", + "Fail_1": "applet_alt_exists.html", + "Fail_2": "applet_alt_exists.html", + "Fail_3": "applet_alt_exists.html" + } + }, + messages: { + "en-US": { + "group": "<applet> elements must provide an 'alt' attribute and an alternative description", + "Pass_0": "Rule Passed", + "Fail_1": "An <applet> element does not have an 'alt' attribute that provides a short text alternative", + "Fail_2": "The 'alt' attribute value for an <applet> element duplicates the 'code' attribute", + "Fail_3": "An <applet> element provides alternative text, but does not provide inner content" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "1.1.1", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // JCH - NO OUT OF SCOPE hidden in context + if (!CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "alt")) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + var alt = ruleContext.getAttribute("alt").trim(); + if (ruleContext.hasAttribute("code") && alt == ruleContext.getAttribute("code").trim()) { + return (0, IRule_1.RuleFail)("Fail_2"); + } + else if (!CommonUtil_1.CommonUtil.hasInnerContentHidden(ruleContext)) { + return (0, IRule_1.RuleFail)("Fail_3"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/application_content_accessible.ts" +/*!********************************************************!*\ + !*** ./src/v4/rules/application_content_accessible.ts ***! + \********************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.application_content_accessible = void 0; +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.application_content_accessible = { + id: "application_content_accessible", + context: "aria:application", + refactor: { + "HAAC_Application_Role_Text": { + 0: "HAAC_Application_Role_Text.html", + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + 0: "application_content_accessible.html", + "Pass_0": "application_content_accessible.html", + "Potential_1": "application_content_accessible.html" + } + }, + messages: { + "en-US": { + "group": "Non-decorative static text and image content within an element with \"application\" role must be accessible", + "Pass_0": "Rule Passed", + "Potential_1": "Verify that the non-decorative static text and image content within an element with \"application\" role are accessible" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: ["1.1.1", "2.1.1"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = true; + var children = ruleContext.childNodes; + for (var i = 0; passed && i < children.length; i++) { + if (children[i].nodeType === 1) { + if (VisUtil_1.VisUtil.isNodeVisible(children[i])) { + passed = AriaUtil_1.AriaUtil.hasRoleInSemantics(children[i], "document") || AriaUtil_1.AriaUtil.hasRoleInSemantics(children[i], "article"); + } + } + else if (children[i].nodeType === 3) { + passed = children[i].nodeValue.trim().length === 0; + } + } + return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/area_alt_exists.ts" +/*!*****************************************!*\ + !*** ./src/v4/rules/area_alt_exists.ts ***! + \*****************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.area_alt_exists = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.area_alt_exists = { + id: "area_alt_exists", + context: "dom:area", + refactor: { + "WCAG20_Area_HasAlt": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "area_alt_exists.html", + "Pass_0": "area_alt_exists.html", + "Fail_1": "area_alt_exists.html" + } + }, + messages: { + "en-US": { + "group": "<area> elements in an image map must have a text alternative", + "Pass_0": "Rule Passed", + "Fail_1": "<area> element in an image map has no text alternative" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "1.1.1", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // JCH - NO OUT OF SCOPE hidden in context + if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "alt")) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_accessiblename_exists.ts" +/*!****************************************************!*\ + !*** ./src/v4/rules/aria_accessiblename_exists.ts ***! + \****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_accessiblename_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +exports.aria_accessiblename_exists = { + id: "aria_accessiblename_exists", + context: "aria:columnheader, aria:heading, aria:rowheader, aria:graphics-document,aria:graphics-symbol, aria:img,aria:image, doc-backlink, doc-biblioentry, doc-biblioref, doc-glossref, doc-noteref, doc-pagebreak, doc-example", + help: { + "en-US": { + "pass": "aria_accessiblename_exists.html", + "fail_no_accessible_name": "aria_accessiblename_exists.html", + "fail_no_accessible_name_image": "aria_accessiblename_exists.html", + "group": "aria_accessiblename_exists.html" + } + }, + messages: { + "en-US": { + "pass": "An accessible name is provided for the element", + "fail_no_accessible_name": "Element <{0}> with \"{1}\" role has no accessible name", + "fail_no_accessible_name_image": "Element <{0}> with \"{1}\" role has no accessible name", + "group": "Elements with certain roles should have accessible names" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE, + reasonCodes: ["fail_no_accessible_name"] + }, + { + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["ARIA"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE, + reasonCodes: ["fail_no_accessible_name_image"] + }], + act: [{ "23a2a8": { "fail_no_accessible_name_image": "fail" } }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLocaleLowerCase(); + // svg element is handled in svg_graphics_labbelled rule and image rules + if (nodeName === 'svg' || nodeName === 'img') + return; + // when table element with a caption as first child + if (nodeName === 'table' + && ruleContext.firstElementChild && ruleContext.firstElementChild.nodeName.toLowerCase() === 'caption' + && ruleContext.firstElementChild.textContent && ruleContext.firstElementChild.textContent.trim().length > 0) + return (0, IRule_1.RulePass)("pass"); + var invalidRoles = AriaUtil_1.AriaUtil.getRolesUndefinedByAria(ruleContext); + if (invalidRoles && invalidRoles.length > 0) + return null; + var deprecatedRoles = AriaUtil_1.AriaUtil.getDeprecatedAriaRoles(ruleContext); + if (deprecatedRoles && deprecatedRoles.length > 0) + return null; + var deprecatedAttributes = AriaUtil_1.AriaUtil.getDeprecatedAriaAttributes(ruleContext); + if (deprecatedAttributes && deprecatedAttributes.length > 0) + return null; + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + if (!role || !ARIADefinitions_1.ARIADefinitions.designPatterns[role] || !ARIADefinitions_1.ARIADefinitions.designPatterns[role].nameRequired) + return null; + var name_pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + if (!name_pair || !name_pair.name || name_pair.name.trim().length === 0) { + if (role === 'img' || role === 'image') + return (0, IRule_1.RuleFail)("fail_no_accessible_name_image", [ruleContext.nodeName.toLowerCase(), role]); + return (0, IRule_1.RuleFail)("fail_no_accessible_name", [ruleContext.nodeName.toLowerCase(), role]); + } + return (0, IRule_1.RulePass)("pass"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_activedescendant_tabindex_valid.ts" +/*!**************************************************************!*\ + !*** ./src/v4/rules/aria_activedescendant_tabindex_valid.ts ***! + \**************************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_activedescendant_tabindex_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.aria_activedescendant_tabindex_valid = { + id: "aria_activedescendant_tabindex_valid", + context: "dom:*[aria-activedescendant]", + refactor: { + "Rpt_Aria_InvalidTabindexForActivedescendant": { + "pass": "pass", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "pass": "aria_activedescendant_tabindex_valid.html", + "Fail_1": "aria_activedescendant_tabindex_valid.html", + "group": "aria_activedescendant_tabindex_valid.html" + } + }, + messages: { + "en-US": { + "pass": "Rule Passed", + "Fail_1": "The <{0}> element using 'aria-activedescendant' set to \"{1}\" is not tabbable", + "group": "Element using 'aria-activedescendant' property should be tabbable" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = false; + var nodeName = ruleContext.nodeName.toLowerCase(); + // Rule not supported on mobile + if (ruleContext.hasAttribute("class") && ruleContext.getAttribute("class").substring(0, 3) == "mbl") { + return null; + } + // Handle the case where the element is hidden by a disabled HTML5 attribute or aria-disabled: + // 1. In the case that this element has a disabled attribute and the element supports it, we mark this rule as passed. + // 2. In the case that this element has an aria-disabled attribute then, we mark this rule as passed. + // For both of the cases above we do not need to perform any further checks, as the element is disabled in some form or another. + if (CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) { + return null; + } + //ignore if the attribute 'aria-activedescendant' is blank + if (ruleContext.getAttribute("aria-activedescendant").trim().length === 0) + return; + // If the tabindex attribute is provided then verify that it is 0 or -1 + passed = CommonUtil_1.CommonUtil.isTabbable(ruleContext); + // pass if one of the children is tabbable. in this case, the tab will stop on the first tabbable element + if (!passed) + passed = CommonUtil_1.CommonUtil.getTabbableChildren(ruleContext) > 0; + // Build array for node token + var retToken1 = new Array(); + retToken1.push(nodeName); + // Build array for id referenced by aria-activedescendant + var retToken2 = new Array(); + retToken2.push(ruleContext.getAttribute("aria-activedescendant").split(" ").join(", ")); + //return new ValidationResult(passed, [ruleContext], '', '', passed == true ? [] : [retToken1, retToken2]); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", [retToken1.toString(), retToken2.toString()]); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_activedescendant_valid.ts" +/*!*****************************************************!*\ + !*** ./src/v4/rules/aria_activedescendant_valid.ts ***! + \*****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_activedescendant_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +exports.aria_activedescendant_valid = { + id: "aria_activedescendant_valid", + context: "dom:*[aria-activedescendant]", + refactor: { + "HAAC_ActiveDescendantCheck": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3" + // "Fail_4": "Fail_4" + } + }, + help: { + "en-US": { + "Pass_0": "aria_activedescendant_valid.html", + "Fail_1": "aria_activedescendant_valid.html", + "Fail_2": "aria_activedescendant_valid.html", + "Fail_3": "aria_activedescendant_valid.html", + // "Fail_4": "aria_activedescendant_valid.html", + "group": "aria_activedescendant_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The 'aria-activedescendant' property is empty", + "Fail_2": "The 'aria-activedescendant' property references a hidden node", + "Fail_3": "Element is not a combobox, and the referenced active-descendant element is not a valid descendant", + // "Fail_4": "Element is a combobox, and the referenced active-descendant element is not controlled by this component", + "group": "The 'aria-activedescendant' property must reference the 'id' of a non-empty, non-hidden active child element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // combobox active descendants handled by 'combobox_active_descendant' + if (AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "combobox")) { + return null; + } + var descendant_id = AriaUtil_1.AriaUtil.getAriaAttribute(ruleContext, "aria-activedescendant"); + // POF1: The attribute is empty + if (!descendant_id || descendant_id.trim() === "") { + return (0, IRule_1.RuleFail)("Fail_1"); + } + var descendant = fragment_1.FragmentUtil.getById(ruleContext, descendant_id.trim()); + if (!descendant || DOMUtil_1.DOMUtil.sameNode(descendant_id, ruleContext)) { + // The referenced element doesn't exist. We let 1077 to trigger the error + return null; + } + if (!VisUtil_1.VisUtil.isNodeVisible(descendant)) { + // POF2: aria-activedescendant references a hidden node + return (0, IRule_1.RuleFail)("Fail_2"); + } + // 1. The value of aria-activedescendant refers to an element that is either a descendant of + // the element with DOM focus + if (ruleContext.contains(descendant)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + var pofId = 2; + // or is a logical descendant as indicated by the aria-owns attribute. + if (ruleContext.hasAttribute("aria-owns")) { + var owned_ids = CommonUtil_1.CommonUtil.normalizeSpacing(ruleContext.getAttribute("aria-owns").trim()).split(" "); + for (var i = 0; i < owned_ids.length; i++) { + var owned_ele = fragment_1.FragmentUtil.getById(ruleContext, owned_ids[i]); + if (owned_ele && !DOMUtil_1.DOMUtil.sameNode(owned_ele, ruleContext) && owned_ele.contains(descendant)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + } + } + // 2. The element with DOM focus is a textbox with aria-controls referring to an element that + // supports aria-activedescendant, and the value of aria-activedescendant specified for the + // textbox refers to either a descendant of the element controlled by the textbox or is a logical + // descendant of that controlled element as indicated by the aria-owns attribute. + // + if (AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "textbox") && ruleContext.hasAttribute("aria-controls")) { + pofId = 3; + var controlled_ids = CommonUtil_1.CommonUtil.normalizeSpacing(ruleContext.getAttribute("aria-controls").trim()).split(" "); + for (var i = 0; i < controlled_ids.length; i++) { + var controlled_ele = fragment_1.FragmentUtil.getById(ruleContext, controlled_ids[i]); + if (controlled_ele && !DOMUtil_1.DOMUtil.sameNode(controlled_ele, ruleContext) && controlled_ele.contains(descendant)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + if (controlled_ele.hasAttribute("aria-owns")) { + var owns_ids = CommonUtil_1.CommonUtil.normalizeSpacing(controlled_ele.getAttribute("aria-owns").trim()).split(" "); + for (var j = 0; j < owns_ids.length; j++) { + var owned_ele = fragment_1.FragmentUtil.getById(ruleContext, owns_ids[j]); + if (owned_ele && !DOMUtil_1.DOMUtil.sameNode(owned_ele, ruleContext) && owned_ele.contains(descendant)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + } + } + } + } + // POF3: I'm not a combobox, and the referenced active-descendant is not a descendant and not owned by the element + // that referenced it. + if (pofId == 3) { + return (0, IRule_1.RuleFail)("Fail_3"); + } + return null; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_application_label_unique.ts" +/*!*******************************************************!*\ + !*** ./src/v4/rules/aria_application_label_unique.ts ***! + \*******************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_application_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_application_label_unique = { + id: "aria_application_label_unique", + context: "aria:application", + refactor: { + "Rpt_Aria_MultipleApplicationLandmarks": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_application_label_unique.html", + "fail_label_not_unique": "aria_application_label_unique.html", + "group": "aria_application_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"application\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"application\" role do not have unique labels", + "group": "Each element with \"application\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "application"); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_application_labelled.ts" +/*!***************************************************!*\ + !*** ./src/v4/rules/aria_application_labelled.ts ***! + \***************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_application_labelled = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_application_labelled = { + id: "aria_application_labelled", + context: "aria:application", + refactor: { + "Rpt_Aria_ApplicationLandmarkLabel": { + "Pass_0": "pass", + "Fail_1": "fail_no_label" + } + }, + help: { + "en-US": { + "pass": "aria_application_labelled.html", + "fail_no_label": "aria_application_labelled.html", + "group": "aria_application_labelled.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"application\" role has a label that describes its purpose", + "fail_no_label": "Element with \"application\" role does not have a label", + "group": "Each element with \"application\" role must have a label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + if (!pair) { + return (0, IRule_1.RuleFail)("fail_no_label"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_article_label_unique.ts" +/*!***************************************************!*\ + !*** ./src/v4/rules/aria_article_label_unique.ts ***! + \***************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_article_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +exports.aria_article_label_unique = { + id: "aria_article_label_unique", + context: "aria:article", + refactor: { + "Rpt_Aria_MultipleArticleRoles_Implicit": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_article_label_unique.html", + "fail_label_not_unique": "aria_article_label_unique.html", + "group": "aria_article_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"article\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"article\" role do not have unique labels", + "group": "Each element with \"article\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "article"); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_attribute_allowed.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/aria_attribute_allowed.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_allowed = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +exports.aria_attribute_allowed = { + id: "aria_attribute_allowed", + context: "dom:*", + refactor: { + "Rpt_Aria_ValidProperty": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "aria_attribute_allowed.html", + "Pass_0": "aria_attribute_allowed.html", + "Fail_1": "aria_attribute_allowed.html" + } + }, + messages: { + "en-US": { + "group": "ARIA attributes must be valid for the element's role", + "Pass_0": "Rule Passed", + "Fail_1": "The attribute(s) '{0}' referenced by the element <{1}> is not a valid ARIA state or property" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "4.1.2", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: "5f99a7", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var contextAttributes = ruleContext.attributes; + // This gets all elements with attributes so we still have some + // Out of Scope since not all attributes are aria + if (contextAttributes) { + var propertyDataTypes = ARIADefinitions_1.ARIADefinitions.propertyDataTypes; + var failedProperties = ""; + var testedProperties = 0; + for (var i = 0, length_1 = contextAttributes.length; i < length_1; i++) { + var attrName = contextAttributes[i].name; + if (AriaUtil_1.AriaUtil.isDefinedAriaAttribute(ruleContext, attrName)) { + testedProperties++; + // Now we just have aria attributes which can + // pass or fail based on whether there property is valid + var dataTypes = propertyDataTypes[attrName]; + if (!dataTypes) { // if property is not in valid property list + // create failedProperties comma sep list + if (failedProperties.length == 0) { + failedProperties = attrName; + } + else { + failedProperties = failedProperties + ", " + attrName; + } + } + } + } + if (testedProperties == 0) { + return null; + } + else if (failedProperties.length != 0) { + return (0, IRule_1.RuleFail)("Fail_1", [failedProperties, ruleContext.nodeName.toLowerCase()]); + } + else { + //return RulePass(1); + return (0, IRule_1.RulePass)("Pass_0"); + } + } + else { + return null; + } + // JCH - passing is based on all attributes not just aria attributes + // leading to OVER COUNTING so moved pass up + //return RulePass(1); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_attribute_conflict.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/aria_attribute_conflict.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_conflict = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.aria_attribute_conflict = { + id: "aria_attribute_conflict", + context: "dom:*[aria-required], dom:*[aria-autocomplete], dom:*[aria-readonly], dom:*[aria-disabled], dom:*[aria-placeholder]" + + ", dom:*[aria-checked], dom:*[aria-hidden], dom:*[aria-valuemax], dom:*[aria-valuemin], dom:*[aria-colspan]" + + ", dom:*[aria-rowspan]", + help: { + "en-US": { + // "pass": "aria_attribute_conflict.html", + "fail_conflict": "aria_attribute_conflict.html", + "group": "aria_attribute_conflict.html" + } + }, + messages: { + "en-US": { + // "pass": "The ARIA attribute is not conflict with the corresponding HTML attribute", + "fail_conflict": "The ARIA attribute \"{0}\" is in conflict with the corresponding HTML attribute \"{1}\"", + "group": "An ARIA attribute must not conflict with the corresponding HTML attribute" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // dependency check: if the ARIA attribute is completely invalid, skip this check + var invalidAttributes = AriaUtil_1.AriaUtil.getInvalidAriaAttributes(ruleContext); + if (invalidAttributes && invalidAttributes.length > 0) + return null; + var ret = []; + var ariaAttributes = AriaUtil_1.AriaUtil.getUserDefinedAriaAttributes(ruleContext); + if (!ariaAttributes || ariaAttributes.length === 0) + return null; + var conflictAttributes = AriaUtil_1.AriaUtil.getConflictAriaAndHtmlAttributes(ruleContext); + for (var i = 0; i < conflictAttributes.length; i++) { + ret.push((0, IRule_1.RuleFail)("fail_conflict", [conflictAttributes[i]['ariaAttr'], conflictAttributes[i]['htmlAttr']])); + if (ariaAttributes.includes(conflictAttributes[i]['ariaAttr'])) + CommonUtil_1.CommonUtil.reduceArrayItemList([conflictAttributes[i]['ariaAttr']], ariaAttributes); + } + if (ret.length > 0) + return ret; + return null; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_attribute_deprecated.ts" +/*!***************************************************!*\ + !*** ./src/v4/rules/aria_attribute_deprecated.ts ***! + \***************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_deprecated = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +exports.aria_attribute_deprecated = { + id: "aria_attribute_deprecated", + context: "dom:*", + help: { + "en-US": { + // "pass": "aria_attribute_deprecated.html", + "fail_aria_role": "aria_attribute_deprecated.html", + "fail_aria_attr": "aria_attribute_deprecated.html", + "fail_role_attr": "aria_attribute_deprecated.html", + "group": "aria_attribute_deprecated.html" + } + }, + messages: { + "en-US": { + // "pass": "The ARIA roles and attribute are used per specification", + "fail_aria_role": "The ARIA role \"{0}\" is deprecated in the ARIA specification", + "fail_aria_attr": "The ARIA attributes \"{0}\" are deprecated in the ARIA specification", + "fail_role_attr": "The ARIA attributes \"{0}\" are deprecated for the role \"{1}\" in the ARIA specification", + "group": "No deprecated ARIA role or attribute should be used" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["ARIA"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var ret = []; + var deprecatedRoles = AriaUtil_1.AriaUtil.getDeprecatedAriaRoles(ruleContext); + if (deprecatedRoles && deprecatedRoles.length > 0) { + for (var i = 0; i < deprecatedRoles.length; i++) + ret.push((0, IRule_1.RuleFail)('fail_aria_role', [deprecatedRoles[i]])); + } + var deprecatedAttributes = AriaUtil_1.AriaUtil.getDeprecatedAriaAttributes(ruleContext); + if (deprecatedAttributes && deprecatedAttributes.length > 0) { + for (var i = 0; i < deprecatedAttributes.length; i++) { + // "role":"any", "attribute":ariaAttrs[i]} + if (deprecatedAttributes[i].role === 'any') + ret.push((0, IRule_1.RuleFail)('fail_aria_attr', [deprecatedAttributes[i].attribute])); + else + ret.push((0, IRule_1.RuleFail)('fail_role_attr', [deprecatedAttributes[i].attribute, deprecatedAttributes[i].role])); + } + } + if (ret.length > 0) + return ret; + return null; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_attribute_exists.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/aria_attribute_exists.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_attribute_exists = { + id: "aria_attribute_exists", + context: "dom:*[role]", + dependencies: ["aria_role_allowed"], + refactor: { + "Rpt_Aria_EmptyPropertyValue": { + "pass": "pass", + "fail_empty_attribute": "fail_empty_attribute" + } + }, + help: { + "en-US": { + "pass": "aria_attribute_exists.html", + "fail_empty_attribute": "aria_attribute_exists.html", + "group": "aria_attribute_exists.html" + } + }, + messages: { + "en-US": { + "pass": "Rule Passed", + "fail_empty_attribute": "The element attribute(s): '{0}' value is empty", + "group": "When specifying a required ARIA attribute, the value must not be empty" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: ["6a7281"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return; + var attrNameArr = new Array(); + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + var hasAttribute = CommonUtil_1.CommonUtil.hasAttribute; + var testedProperties = 0; + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + if (!role) + return; + if (designPatterns[role] && AriaUtil_1.AriaUtil.getRoleRequiredProperties(role, ruleContext) != null) { + var requiredRoleProps = AriaUtil_1.AriaUtil.getRoleRequiredProperties(role, ruleContext); + for (var i = 0, length_1 = requiredRoleProps.length; i < length_1; i++) { + var attribute = requiredRoleProps[i]; + if (hasAttribute(ruleContext, attribute)) { + testedProperties++; + var nodeValue = CommonUtil_1.CommonUtil.normalizeSpacing(ruleContext.getAttribute(requiredRoleProps[i])); + if (nodeValue.length == 0) + attrNameArr.push(requiredRoleProps[i]); + } + else if (requiredRoleProps[i] == "aria-labelledby") { + if ((role == "radiogroup") && (hasAttribute(ruleContext, "aria-label"))) { + testedProperties++; + var nodeValue = CommonUtil_1.CommonUtil.normalizeSpacing(ruleContext.getAttribute("aria-label")); + if (nodeValue.length == 0) + attrNameArr.push("aria-label"); + } + } + else if (requiredRoleProps[i] == "aria-valuenow") { + if ((role == "progressbar") && (hasAttribute(ruleContext, "aria-valuetext"))) { + testedProperties++; + var nodeValue = CommonUtil_1.CommonUtil.normalizeSpacing(ruleContext.getAttribute("aria-valuetext")); + if (nodeValue.length == 0) + attrNameArr.push("aria-valuetext"); + } + } + } + } + if (designPatterns[role]) { + var tagProperty = AriaUtil_1.AriaUtil.getElementAriaProperty(ruleContext); + var permittedRoles = []; + permittedRoles.push(role); + var allowedAttributes = AriaUtil_1.AriaUtil.getAllowedAriaAttributes(ruleContext, permittedRoles, tagProperty); + for (var i = 0, length_2 = allowedAttributes.length; i < length_2; i++) { + var attribute = allowedAttributes[i]; + if (attribute == "aria-checked" || attribute == "aria-selected" || + attribute == "aria-expanded" || attribute == "aria-orientation" || + attribute == "aria-level") { + if (hasAttribute(ruleContext, attribute)) { + testedProperties++; + var nodeValue = CommonUtil_1.CommonUtil.normalizeSpacing(ruleContext.getAttribute(attribute)); + if (nodeValue.length == 0 && !attrNameArr.includes(attribute)) { + attrNameArr.push(attribute); + } + } + } + } + } + var retMsg = new Array(); + var passed = attrNameArr.length == 0; + retMsg.push(attrNameArr.join(", ")); + //return new ValidationResult(passed, [ruleContext], attrNameArr, '', retMsg); + if (testedProperties == 0) { + return null; + } + else if (!passed) { + return (0, IRule_1.RuleFail)("fail_empty_attribute", retMsg); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_attribute_redundant.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/aria_attribute_redundant.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_redundant = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +exports.aria_attribute_redundant = { + id: "aria_attribute_redundant", + context: "dom:*[aria-required], dom:*[aria-autocomplete], dom:*[aria-readonly], dom:*[aria-disabled], dom:*[aria-placeholder]" + + ", dom:*[aria-checked], dom:*[aria-hidden], dom:*[aria-valuemax], dom:*[aria-valuemin], dom:*[aria-colspan]" + + ", dom:*[aria-rowspan]", + help: { + "en-US": { + "pass": "aria_attribute_redundant.html", + "fail_redundant": "aria_attribute_redundant.html", + "group": "aria_attribute_redundant.html" + } + }, + messages: { + "en-US": { + "pass": "The ARIA attribute is not redundant with a corresponding HTML attribute", + "fail_redundant": "The ARIA attribute \"{0}\" is redundant with the HTML attribute \"{1}\"", + "group": "An ARIA attribute should not be redundant with a corresponding HTML attribute" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // dependency check: if the ARIA attribute is completely invalid, skip this check + var invalidAttributes = AriaUtil_1.AriaUtil.getInvalidAriaAttributes(ruleContext); + if (invalidAttributes && invalidAttributes.length > 0) + return null; + // if conflict already reported, ignore reporting overlap + var conflictAttributes = AriaUtil_1.AriaUtil.getConflictAriaAndHtmlAttributes(ruleContext); + if (conflictAttributes && conflictAttributes.length > 0) + return null; + var domAttributes = ruleContext.attributes; + var ariaAttrs = []; + var htmlAttrs = []; + if (domAttributes) { + for (var i = 0; i < domAttributes.length; i++) { + var attrName = domAttributes[i].name.trim().toLowerCase(); + var attrValue = ruleContext.getAttribute(attrName); + if (attrValue === '') + attrValue = null; + if (attrName.substring(0, 5) === 'aria-') + ariaAttrs.push({ name: attrName, value: attrValue }); + else + htmlAttrs.push({ name: attrName, value: attrValue }); + } + } + var ret = []; + var _loop_1 = function (i) { + var examinedHtmlAtrNames = AriaUtil_1.AriaUtil.getConflictOrOverlappingHtmlAttribute(ariaAttrs[i], htmlAttrs, 'overlapping'); + if (examinedHtmlAtrNames === null) + return "continue"; + examinedHtmlAtrNames.forEach(function (item) { + if (item['result'] === 'Pass') { //pass + ret.push((0, IRule_1.RulePass)("pass")); + } + else if (item['result'] === 'Failed') { //failed + ret.push((0, IRule_1.RuleFail)("fail_redundant", [ariaAttrs[i]['name'], item['attr']])); + } + }); + }; + for (var i = 0; i < ariaAttrs.length; i++) { + _loop_1(i); + } + if (ret.length > 0) + return ret; + return null; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_attribute_required.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/aria_attribute_required.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_required = void 0; +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.aria_attribute_required = { + id: "aria_attribute_required", + context: "dom:*[role]", + dependencies: ["aria_role_allowed"], + refactor: { + "Rpt_Aria_RequiredProperties": { + "Pass_0": "pass", + "Fail_1": "fail_missing" + } + }, + help: { + "en-US": { + "group": "aria_attribute_required.html", + "pass": "aria_attribute_required.html", + "fail_missing": "aria_attribute_required.html" + } + }, + messages: { + "en-US": { + "group": "The required attributes for the element with a role must be defined", + "pass": "The required attributes for the element with the role are defined", + "fail_missing": "Element with '{0}' role does not have the required ARIA attribute(s): '{1}'" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "4.1.2", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: "4e8ab6", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var attrNameArr = new Array(); + var roleNameArr = new Array(); + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + //let implicitRole = ARIAMapper.elemToImplicitRole(ruleContext); + //let implicitRole = AriaUtil.getImplicitRole(ruleContext); + var hasAttribute = CommonUtil_1.CommonUtil.hasAttribute; + var testedRoles = 0; + var tagProperty = AriaUtil_1.AriaUtil.getElementAriaProperty(ruleContext); + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + if (!role) + return; + var requiredRoleProps = AriaUtil_1.AriaUtil.getRoleRequiredProperties(role, ruleContext); + if (designPatterns[role] && requiredRoleProps !== null) { + var allowedRoleProps = AriaUtil_1.AriaUtil.getAllowedAriaAttributes(ruleContext, role, tagProperty); + var roleMissingReqProp = false; + for (var i = 0, propertiesLength = requiredRoleProps.length; i < propertiesLength; i++) { + if (!allowedRoleProps.includes(requiredRoleProps[i])) + continue; + if (!hasAttribute(ruleContext, requiredRoleProps[i])) { + // If an aria-labelledby isn't present, an aria-label will meet the requirement. + if (requiredRoleProps[i] == "aria-labelledby") { + if ((!hasAttribute(ruleContext, "aria-label")) || (role != "radiogroup")) { + attrNameArr.push(requiredRoleProps[i]); + roleMissingReqProp = true; + } + } + else if (requiredRoleProps[i] == "aria-valuenow") { + if ((!hasAttribute(ruleContext, "aria-valuetext")) || (role != "progressbar")) { + attrNameArr.push(requiredRoleProps[i]); + roleMissingReqProp = true; + } + } + else if (requiredRoleProps[i] == "aria-controls" && role == "combobox") { + // Skip this check since aria-controls in the textbox of a combobox is already handled in rule HAAC_Combobox_Must_have_Text_Input + } + else { + attrNameArr.push(requiredRoleProps[i]); + roleMissingReqProp = true; + } + } + } + if (roleMissingReqProp == true) { + roleNameArr.push(role); + } + } + var passed = roleNameArr.length == 0 || attrNameArr.length == 0; // only aria attributes so NO OUT OF SCOPE + if (!passed) { + var retToken = new Array(); + retToken.push(roleNameArr.join(", ")); + retToken.push(attrNameArr.join(", ")); + return (0, IRule_1.RuleFail)("fail_missing", retToken); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_attribute_value_valid.ts" +/*!****************************************************!*\ + !*** ./src/v4/rules/aria_attribute_value_valid.ts ***! + \****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_value_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +exports.aria_attribute_value_valid = { + id: "aria_attribute_value_valid", + context: "dom:*", + dependencies: ["aria_attribute_allowed"], + refactor: { + "Rpt_Aria_ValidPropertyValue": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "aria_attribute_value_valid.html", + "Pass_0": "aria_attribute_value_valid.html", + "Fail_1": "aria_attribute_value_valid.html" + } + }, + messages: { + "en-US": { + "group": "ARIA property values must be valid", + "Pass_0": "Rule Passed", + "Fail_1": "The value \"{0}\" specified for attribute '{1}' on element <{2}> is not valid" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: "6a7281", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var valueArr = new Array(); + var attrNameArr = new Array(); + var dataTypeArr = new Array(); + var propertyDataTypes = ARIADefinitions_1.ARIADefinitions.propertyDataTypes; + var contextAttributes = ruleContext.attributes; + var testedPropertyValues = 0; + if (contextAttributes) { + for (var i = 0, length_1 = contextAttributes.length; i < length_1; i++) { + var attrName = contextAttributes[i].name; + if (AriaUtil_1.AriaUtil.isDefinedAriaAttribute(ruleContext, attrName)) { + var dataTypes = propertyDataTypes[attrName]; + var nodeValue = CommonUtil_1.CommonUtil.normalizeSpacing(contextAttributes[i].nodeValue); + testedPropertyValues++; + if (dataTypes && dataTypes.values) { + if (dataTypes.values.indexOf(nodeValue) == -1) { + if (dataTypes.values.indexOf('undefined') != -1 && nodeValue.length == 0) { + //translate 'undefined' to mean '' + } + else { + // aria-relevant is represented as a space delimited list of the following values: + // additions, removals, text; or a single catch-all value all. + if (dataTypes.type === "http://www.w3.org/2001/XMLSchema#nmtokens") { + var attrValues = contextAttributes[i].nodeValue.trim().split(" "); + // if the value all is specified, it cannot have any other value + if (attrValues.length > 1 && attrValues.includes("all")) { + valueArr.push(contextAttributes[i].nodeValue.split(" ")); + attrNameArr.push(attrName); + dataTypeArr.push(dataTypes.values.toString()); + } + else { + var hash = {}; + for (var j = 0; j < attrValues.length; j++) { + // if the individual value is not in the list of allowed values + if (attrValues[j] != "" && !dataTypes.values.includes(attrValues[j])) { + if (!hash.hasOwnProperty(attrName)) { + hash[attrName] = true; + attrNameArr.push(attrName); + } + valueArr.push(attrValues[j]); + dataTypeArr.push(dataTypes.values.toString()); + } + } + } + } + else { + valueArr.push(contextAttributes[i].nodeValue.split(" ")); + attrNameArr.push(attrName); + dataTypeArr.push(dataTypes.values.toString()); + } + } + } + } + else if (dataTypes && dataTypes.type && dataTypes.type === "http://www.w3.org/2001/XMLSchema#int") { + var iVal = parseInt(nodeValue); + if (isNaN(iVal) || ("" + iVal !== nodeValue)) { + valueArr.push(nodeValue); + attrNameArr.push(attrName); + } + } + else if (dataTypes && dataTypes.type && dataTypes.type == "http://www.w3.org/2001/XMLSchema#decimal") { + var fVal = parseFloat(nodeValue); + if (isNaN(fVal)) { + valueArr.push(nodeValue); + attrNameArr.push(attrName); + } + } + else if (dataTypes && dataTypes.type && (dataTypes.type == "http://www.w3.org/2001/XMLSchema#boolean")) { + var tmpV = nodeValue.trim().toLowerCase(); + if (tmpV !== "true" && tmpV !== "false") { + valueArr.push(nodeValue); + attrNameArr.push(attrName); + } + } + else if (dataTypes && dataTypes.type && (dataTypes.type == "http://www.w3.org/2001/XMLSchema#string")) { + } + else { + testedPropertyValues--; + } + } + } + } + var retMsg = new Array(); + var passed = attrNameArr.length == 0; + retMsg.push(valueArr.join(", ")); + retMsg.push(attrNameArr.join(", ")); + retMsg.push(ruleContext.nodeName.toLowerCase()); + // retMsg.push (dataTypeArr.join(", ")); + //return new ValidationResult(passed, [ruleContext], attrNameArr, '', retMsg); + if (testedPropertyValues == 0) { + return null; + } + else if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", retMsg); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_banner_label_unique.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/aria_banner_label_unique.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_banner_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_banner_label_unique = { + id: "aria_banner_label_unique", + context: "aria:banner", + refactor: { + "Rpt_Aria_MultipleBannerLandmarks_Implicit": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_banner_label_unique.html", + "fail_label_not_unique": "aria_banner_label_unique.html", + "group": "aria_banner_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"banner\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"banner\" role do not have unique labels", + "group": "Each element with \"banner\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "banner", true); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_banner_single.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/aria_banner_single.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_banner_single = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_banner_single = { + id: "aria_banner_single", + context: "dom:*[role], dom:header", + refactor: { + "Rpt_Aria_OneBannerInSiblingSet_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_banner_single.html", + "Fail_1": "aria_banner_single.html", + "group": "aria_banner_single.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Multiple elements with \"banner\" role found on the page", + "group": "A page, document, or application should only have one element with \"banner\" role" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + if (!AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "banner")) { + return null; + } + var passed = AriaUtil_1.AriaUtil.getSiblingWithRoleHidden(ruleContext, "banner", true, true) === null; + //return new ValidationResult(passed, [ruleContext], 'role', '', []); + if (passed) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_child_tabbable.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/aria_child_tabbable.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_child_tabbable = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_child_tabbable = { + id: "aria_child_tabbable", + context: "dom:*[role]", + dependencies: ["aria_role_allowed"], + refactor: { + "Rpt_Aria_MissingFocusableChild": { + "pass": "pass", + "fail_missing_child": "fail_missing_child" + } + }, + help: { + "en-US": { + "pass": "aria_child_tabbable.html", + "fail_missing_child": "aria_child_tabbable.html", + "group": "aria_child_tabbable.html" + } + }, + messages: { + "en-US": { + "pass": "Rule Passed", + "fail_missing_child": "None of the descendent elements with \"{1}\" role is tabbable", + "group": "UI component must have at least one tabbable descendant for keyboard access" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip the check if the element requires presentational children only + if (AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(ruleContext) || AriaUtil_1.AriaUtil.shouldBePresentationalChild(ruleContext)) + return; + // An ARIA list is not interactive + if (AriaUtil_1.AriaUtil.hasRole(ruleContext, { "list": true, "row": true, "rowgroup": true, "table": true, "grid": true })) { + return null; + } + // Not a valid message for mobile because all elements are focusable in iOS when VoiceOver is enabled. + if (ruleContext.hasAttribute("class") && ruleContext.getAttribute("class").substring(0, 3) == "mbl") { + return null; + } + //ignore datalist element check since it will be part of a input element or hidden by default + if (ruleContext.nodeName.toLowerCase() === 'datalist') + return null; + // ignore if the element's navigation is controlled by another element, such as combobox + if (AriaUtil_1.AriaUtil.isNavigationOwnedOrControlled(ruleContext)) + return null; + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + var passed = true; + var doc = ruleContext.ownerDocument; + var hasAttribute = CommonUtil_1.CommonUtil.hasAttribute; + var roleNameArr = new Array(); + var nodeName = ""; + var inScope = false; + if (ARIADefinitions_1.ARIADefinitions.containers.includes(role)) { + var disabled = hasAttribute(ruleContext, 'aria-disabled') ? ruleContext.getAttribute("aria-disabled") : ''; + if (disabled != 'true' && !hasAttribute(ruleContext, 'aria-activedescendant') && !CommonUtil_1.CommonUtil.isTabbable(ruleContext)) { + var reqChildren = ARIADefinitions_1.ARIADefinitions.designPatterns[role].reqChildren; + if (reqChildren) { + inScope = true; + passed = false; + var xp = "descendant::*["; + for (var i = 0; i < reqChildren.length; i++) { + xp += "@role='" + reqChildren[i] + "' or "; + } + xp = xp.substring(0, xp.length - 4) + ']'; + var xpathResult = doc.evaluate(xp, ruleContext, CommonUtil_1.CommonUtil.defaultNSResolver, 0 /* XPathResult.ANY_TYPE */, null); + var r = xpathResult.iterateNext(); + while (r && !passed) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(r)) { + r = xpathResult.iterateNext(); + continue; + } + passed = CommonUtil_1.CommonUtil.isTabbable(r); + // Required child is not focusable via tabindex. See if there is a grandchild that is focusable by default or by tabindex. + if (!passed) { + var xp2 = "descendant::*"; + var xpathResult2 = doc.evaluate(xp2, r, CommonUtil_1.CommonUtil.defaultNSResolver, 0 /* XPathResult.ANY_TYPE */, null); + var r2 = xpathResult2.iterateNext(); + while (r2 && !passed) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(r2)) { + r2 = xpathResult2.iterateNext(); + continue; + } + passed = CommonUtil_1.CommonUtil.isTabbable(r); + r2 = xpathResult2.iterateNext(); + } + } + if (!passed) { + roleNameArr = r.getAttribute("role").trim().split(" "); + nodeName = r.nodeName.toLowerCase(); + } + r = xpathResult.iterateNext(); + } + } + } + } + // Variable Decleration + var retToken1 = new Array(); + var retToken2 = new Array(); + // In the case the arrays/strings are empty, that means that there is no violation so we can reset it back to passed, the reason for this + // is that we are setting passed=false while we perform a loop which causes violation to trigger even if there is no issues. Instead of + // updating the whole rule to switch from using passed in that way simply do the check at this point. + if (nodeName.length > 0 && roleNameArr.length > 0) { + retToken1.push(nodeName); + retToken2.push(roleNameArr.join(", ")); + } + else { + passed = true; + } + //return new ValidationResult(passed, [ruleContext], 'role', '', passed == true ? [] : [retToken1, retToken2]); + if (!inScope) { + return null; + } + else if (!passed) { + return (0, IRule_1.RuleFail)("fail_missing_child", [retToken1.toString(), retToken2.toString()]); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_child_valid.ts" +/*!******************************************!*\ + !*** ./src/v4/rules/aria_child_valid.ts ***! + \******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_child_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_child_valid = { + id: "aria_child_valid", + //context: "dom:*[role]", + //dependencies: ["Rpt_Aria_ValidRole"], + context: "dom:*", + dependencies: ["aria_role_valid", "aria_descendant_valid"], + help: { + "en-US": { + "group": "aria_child_valid.html", + "Pass": "aria_child_valid.html", + "Fail_no_child": "aria_child_valid.html", + "Fail_invalid_child": "aria_child_valid.html" + } + }, + messages: { + "en-US": { + "group": "An element with an ARIA role must own a required child", + "Pass": "An element with an ARIA role owns a required child", + "Fail_no_child": "The element with role \"{0}\" does not own any child element with any of the following role(s): \"{1}\"", + "Fail_invalid_child": "The element with role \"{0}\" owns the child element with the role \"{1}\" that is not one of the allowed role(s): \"{2}\"" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + // TODO: ACT: Verify mapping + act: ["bc4a75"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip the check if the element requires presentational children only + if (AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(ruleContext)) + return; + var roles = AriaUtil_1.AriaUtil.getRoles(ruleContext, false); + // if explicit role doesn't exist, get the implicit one + if (!roles || roles.length === 0) + roles = AriaUtil_1.AriaUtil.getImplicitRole(ruleContext); + //ignore if the element doesn't have any explicit or implicit role, shouldn't happen + if (!roles || roles.length === 0) + return null; + // ignore if the element contains none or presentation role + var presentationRoles = ["none", "presentation"]; + var found = roles.some(function (r) { return presentationRoles.includes(r); }); + if (found) + return null; + // For combobox, we have g1193 ... g1199 to check the values etc. + // We don't want to trigger 1152 again. So, we bypass it here. + if (roles.includes("combobox")) + return null; + var requiredChildRoles = AriaUtil_1.AriaUtil.getRequiredChildRoles(ruleContext, true); + // a 'group' role is allowed but not required for some elements so remove it if exists + if (requiredChildRoles.includes('group')) { + var index = requiredChildRoles.indexOf('group'); + if (index > -1) + requiredChildRoles.splice(index, 1); + } + /** + * ignore if a role doesn't require a child with any specific role + * the reverse might be not true - parent will be checked in Rpt_Aria_RequiredParent_Native_Host_Sematics rule + */ + if (requiredChildRoles.length == 0) + return null; + // get all the children from accessibility tree, + // including ones with aria-owns + var directATChildren = AriaUtil_1.AriaUtil.getDirectATChildren(ruleContext); + if (!directATChildren || directATChildren.length == 0) { + // the element with at least one required role dosen't contain any accessible child + /** + * When a widget is missing required owned elements due to script execution or loading, + * authors MUST mark a containing element with 'aria-busy' equal to true. + */ + var busy = ruleContext.getAttribute("aria-busy"); + if (!busy || busy !== 'true') { + var retToken = new Array(); + retToken.push(roles.join(", ")); + retToken.push(requiredChildRoles.join(", ")); + return (0, IRule_1.RuleFail)("Fail_no_child", retToken); + } + // it's 'busy' loading, ignore it + return null; + } + var violateElemRoles = new Array(); + for (var j = 0; j < directATChildren.length; j++) { + var childRoles = AriaUtil_1.AriaUtil.getRoles(directATChildren[j], false); + // if explicit role doesn't exist, get the implicit one + if (!childRoles || childRoles.length == 0) + childRoles = AriaUtil_1.AriaUtil.getImplicitRole(directATChildren[j]); + if (childRoles && childRoles.length > 0) { + /** + * when multiple roles are specified as required owned elements for a role, at least one instance of one required owned element is expected. + * the specification does not require an instance of each of the listed owned roles. + * therefore, the requirement is met if it has any one of the required roles. + */ + var found_1 = childRoles.some(function (r) { return requiredChildRoles.includes(r); }); + if (!found_1) + violateElemRoles.push(childRoles.join(", ")); + } + else { + // ignore the element since it's not semantic, shouldn't happen + } + } + if (violateElemRoles.length > 0) { + var retValues = []; + for (var i = 0; i < violateElemRoles.length; i++) { + var retToken = new Array(); + retToken.push(roles.join(", ")); + retToken.push(violateElemRoles[i]); + retToken.push(requiredChildRoles.join(", ")); + retValues.push((0, IRule_1.RuleFail)("Fail_invalid_child", retToken)); + } + return retValues; + } + return (0, IRule_1.RulePass)("Pass"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_complementary_label_unique.ts" +/*!*********************************************************!*\ + !*** ./src/v4/rules/aria_complementary_label_unique.ts ***! + \*********************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_complementary_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_complementary_label_unique = { + id: "aria_complementary_label_unique", + context: "aria:complementary", + refactor: { + "Rpt_Aria_MultipleComplementaryLandmarks_Implicit": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_complementary_label_unique.html", + "fail_label_not_unique": "aria_complementary_label_unique.html", + "group": "aria_complementary_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"complementary\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"complementary\" role do not have unique labels", + "group": "Each element with \"complementary\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "complementary"); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_complementary_label_visible.ts" +/*!**********************************************************!*\ + !*** ./src/v4/rules/aria_complementary_label_visible.ts ***! + \**********************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_complementary_label_visible = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_complementary_label_visible = { + id: "aria_complementary_label_visible", + context: "dom:*[role], dom:aside", + dependencies: ["aria_complementary_labelled"], + refactor: { + "Rpt_Aria_ComplementaryLandmarkLabel_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_complementary_label_visible.html", + "Fail_1": "aria_complementary_label_visible.html", + "group": "aria_complementary_label_visible.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Element with \"complementary\" role does not have a visible label", + "group": "Each element with \"complementary\" role should have a visible label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + if (!AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "complementary")) { + return null; + } + var passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "aria-labelledby"); + //return new ValidationResult(passed, [ruleContext], 'role', '', []); + if (passed) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_complementary_labelled.ts" +/*!*****************************************************!*\ + !*** ./src/v4/rules/aria_complementary_labelled.ts ***! + \*****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_complementary_labelled = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_complementary_labelled = { + id: "aria_complementary_labelled", + context: "aria:complementary", + refactor: { + "Rpt_Aria_ComplementaryRequiredLabel_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_complementary_labelled.html", + "Fail_1": "aria_complementary_labelled.html", + "group": "aria_complementary_labelled.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Element with \"complementary\" role does not have a label", + "group": "Each element with \"complementary\" role must have a label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + if (pair) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_content_in_landmark.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/aria_content_in_landmark.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_content_in_landmark = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var TableUtil_1 = __webpack_require__(/*! ../util/TableUtil */ "./src/v4/util/TableUtil.ts"); +exports.aria_content_in_landmark = { + id: "aria_content_in_landmark", + context: "dom:*", + refactor: { + "Rpt_Aria_OrphanedContent_Native_Host_Sematics": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_content_in_landmark.html", + "Fail_1": "aria_content_in_landmark.html", + "group": "aria_content_in_landmark.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Content is not within a landmark element", + "group": "All content must reside within an element with a landmark role" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }, + { + "id": ["WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var params = CacheUtil_1.CacheUtil.getCache(context.dom.node.ownerDocument, "aria_content_in_landmark", null); + if (!params) { + params = { + landmarks: { + value: ["banner", "complementary", "contentinfo", "form", "main", "navigation", "region", "search"], + type: "array" + }, + possibleOrphanedWidgets: { + value: ["button", "combobox", "checkbox", "grid", "heading", "link", "list", + "listbox", "menu", "menubar", "progressbar", "radio", "tablist", "textbox", "toolbar", "tree", + "treegrid" + ], + type: "array" + }, + possibleOrphanedElements: { + value: ["p", "table", "input", "textarea", "select", "button", "a", "ol", "ul", "dl", "h1", "h2", "h3", "h4", "h5", + "h6", "embed", "object", "area" + ], + type: "array" + }, + noLandmarkedRoles: { + // These roles don't require landmarks + value: ["alert", "alertdialog", "dialog", "tooltip"], + type: "array" + }, + mapLandmarks: {}, + mapPossibleOrphanedWidgets: {}, + mapPossibleOrphanedElements: {}, + mapNoLandmarkedRoles: {} + }; + // Convert arrays to maps + params.mapLandmarks = {}; + for (var i = 0; i < params.landmarks.value.length; ++i) { + params.mapLandmarks[params.landmarks.value[i]] = true; + } + params.mapPossibleOrphanedWidgets = {}; + for (var i = 0; i < params.possibleOrphanedWidgets.value.length; ++i) { + params.mapPossibleOrphanedWidgets[params.possibleOrphanedWidgets.value[i]] = true; + } + params.mapPossibleOrphanedElements = {}; + for (var i = 0; i < params.possibleOrphanedElements.value.length; ++i) { + params.mapPossibleOrphanedElements[params.possibleOrphanedElements.value[i]] = true; + } + params.mapNoLandmarkedRoles = {}; + for (var i = 0; i < params.noLandmarkedRoles.value.length; ++i) { + params.mapNoLandmarkedRoles[params.noLandmarkedRoles.value[i]] = true; + } + CacheUtil_1.CacheUtil.setCache(context.dom.node.ownerDocument, "aria_content_in_landmark", params); + } + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || // avoid diagnosing g1157 for non-visible nodes + (VisUtil_1.VisUtil.hiddenByDefaultElements != null && + VisUtil_1.VisUtil.hiddenByDefaultElements != undefined && + VisUtil_1.VisUtil.hiddenByDefaultElements.indexOf(nodeName) > -1)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + var elemsWithoutContent = ["area", "input", "embed", "button", "textarea", "select"]; + if (!CommonUtil_1.CommonUtil.hasInnerContentHidden(ruleContext) && //only trigger the rule on elements that have content + elemsWithoutContent.indexOf(nodeName) === -1) { // a few elems wihout content should not be skipped + return (0, IRule_1.RulePass)("Pass_0"); + } + // Short circuit for layout tables + if (nodeName == "table" && TableUtil_1.TableUtil.isLayoutTable(ruleContext)) { + return null; + } + // Check if it is a possible orphan + var passed = true; + var isPossibleOrphanedWidget = AriaUtil_1.AriaUtil.hasRole(ruleContext, params.mapPossibleOrphanedWidgets, true); + //exclude <link rel="stylesheet" href="xyz.css"> in the <head> and <body>(#608) + //having link in the head could cause lot of violaions + if (nodeName === 'link') { + isPossibleOrphanedWidget = false; + } + var isPossibleOrphanedElement = nodeName in params.mapPossibleOrphanedElements; + if (isPossibleOrphanedWidget || isPossibleOrphanedElement) { + // See if ancestor has landmark roles or implicit land mark roles + var parentRoles = contextHierarchies["aria"].map(function (info) { return info.role; }); + passed = parentRoles.filter(function (role) { return role in params.mapLandmarks; }).length > 0; + if (!passed) { + // Don't fail elements when a parent or sibling has failed - causes too many messages. + var walkElement = DOMWalker_1.DOMWalker.parentElement(ruleContext); + while (!passed && walkElement != null) { + passed = CacheUtil_1.CacheUtil.getCache(walkElement, "Rpt_Aria_OrphanedContent", false); + walkElement = DOMWalker_1.DOMWalker.parentElement(walkElement); + } + walkElement = ruleContext.nextElementSibling; + while (!passed && walkElement != null) { + passed = CacheUtil_1.CacheUtil.getCache(walkElement, "Rpt_Aria_OrphanedContent", false); + walkElement = walkElement.nextElementSibling; + } + walkElement = ruleContext.previousElementSibling; + while (!passed && walkElement != null) { + passed = CacheUtil_1.CacheUtil.getCache(walkElement, "Rpt_Aria_OrphanedContent", false); + walkElement = walkElement.previousElementSibling; + } + if (!passed) { + CacheUtil_1.CacheUtil.setCache(ruleContext, "Rpt_Aria_OrphanedContent", true); + // Don't trigger rule if element is a stand-alone widget + passed = CacheUtil_1.CacheUtil.getCache(ruleContext, "Rpt_Aria_OrphanedContent_NoTrigger", false) || + AriaUtil_1.AriaUtil.hasRole(ruleContext, params.mapNoLandmarkedRoles, true) || + AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, params.mapNoLandmarkedRoles, true); + if (passed) { + CacheUtil_1.CacheUtil.setCache(ruleContext, "Rpt_Aria_OrphanedContent_NoTrigger", true); + return null; + } + } + else { + return null; + } + } + } + else { + return null; + } + //return new ValidationResult(passed, [ruleContext], '', '', []); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_contentinfo_label_unique.ts" +/*!*******************************************************!*\ + !*** ./src/v4/rules/aria_contentinfo_label_unique.ts ***! + \*******************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_contentinfo_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_contentinfo_label_unique = { + id: "aria_contentinfo_label_unique", + context: "aria:contentinfo", + refactor: { + "Rpt_Aria_MultipleContentinfoLandmarks_Implicit": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_contentinfo_label_unique.html", + "fail_label_not_unique": "aria_contentinfo_label_unique.html", + "group": "aria_contentinfo_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"contentinfo\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"contentinfo\" role do not have unique labels", + "group": "Each element with \"contentinfo\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "contentinfo", true); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_contentinfo_misuse.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/aria_contentinfo_misuse.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_contentinfo_misuse = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_contentinfo_misuse = { + id: "aria_contentinfo_misuse", + context: "dom:*[role], dom:footer, dom:address", + refactor: { + "Rpt_Aria_ContentinfoWithNoMain_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_contentinfo_misuse.html", + "Fail_1": "aria_contentinfo_misuse.html", + "group": "aria_contentinfo_misuse.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Element with \"contentinfo\" role is present without an element with \"main\" role", + "group": "Each element with \"contentinfo\" role is only permitted with an element with \"main\" role" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + //consider implicit role + if (!AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "contentinfo")) { + return null; + } + // Consider the Check Hidden Content setting that is set by the rules + var passed = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "main", true, true).length > 0; + //return new ValidationResult(passed, [ruleContext], 'role', '', []); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_contentinfo_single.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/aria_contentinfo_single.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_contentinfo_single = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_contentinfo_single = { + id: "aria_contentinfo_single", + context: "dom:*[role], dom:footer, dom:address", + refactor: { + "Rpt_Aria_MultipleContentinfoInSiblingSet_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_contentinfo_single.html", + "Fail_1": "aria_contentinfo_single.html", + "group": "aria_contentinfo_single.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Multiple elements with \"contentinfo\" role found on the page", + "group": "A page, document, or application should only have one element with \"contentinfo\" role" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + //find out if <footer> element has siblings as <footer> has implicit contentinfo role + if (!AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "contentinfo")) { + return null; + } + var passed = !AriaUtil_1.AriaUtil.getSiblingWithRoleHidden(ruleContext, "contentinfo", true, true); + //return new ValidationResult(passed, [ruleContext], 'role', '', []); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_descendant_valid.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/aria_descendant_valid.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_descendant_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_descendant_valid = { + id: "aria_descendant_valid", + context: "dom:*", + dependencies: ["aria_role_valid"], + help: { + "en-US": { + "group": "aria_descendant_valid.html", + "pass": "aria_descendant_valid.html", + "potential_child_implicit_role": "aria_descendant_valid.html", + "recommendation_no_impact_role": "aria_descendant_valid.html", + "fail_child_explicit_role": "aria_descendant_valid.html" + } + }, + messages: { + "en-US": { + "group": "Browsers ignore the explicit and implicit ARIA roles of the descendants of certain elements", + "pass": "The element contains valid descendants", + "potential_child_implicit_role": "The element with role \"{0}\" contains descendants with implicit roles \"{1}\" which are ignored by browsers", + "recommendation_no_impact_role": "The element with role \"{0}\" contains descendants with roles \"{1}\" which are ignored by browsers", + "fail_child_explicit_role": "The element with role \"{0}\" contains descendants with roles \"{1}\" which are ignored by browsers" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE, + reasonCodes: ["pass", "potential_child_implicit_role", "fail_child_explicit_role"] + }, { + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE, + reasonCodes: ["recommendation_no_impact_role"] + }], + // TODO: ACT: Verify mapping + act: ["307n5z"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip the check if the element doesn't require presentational children only + if (!AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(ruleContext)) + return; + var roles = AriaUtil_1.AriaUtil.getRoles(ruleContext, false); + // if explicit role doesn't exist, get the implicit one + if (!roles || roles.length === 0) + roles = AriaUtil_1.AriaUtil.getImplicitRole(ruleContext); + //ignore if the element doesn't have any explicit or implicit role, shouldn't happen + if (!roles || roles.length === 0) + return null; + // let tagName = ruleContext.tagName.toLowerCase(); + // get all the children from accessibility tree, + // including ones with aria-owns + var directATChildren = AriaUtil_1.AriaUtil.getDirectATChildren(ruleContext); + if (directATChildren && directATChildren.length > 0) { + // the element with at least one non-presentational children + var explicitRoles = new Array(); + var implicitRoles = new Array(); + var noImpactRoles = new Array(); + for (var j = 0; j < directATChildren.length; j++) { + // ignore <img> and <svg> + var tag = directATChildren[j].nodeName.toLowerCase(); + if (tag === 'img' || tag === 'svg') + continue; + // get explicit role if exists + var childRoles = AriaUtil_1.AriaUtil.getRoles(directATChildren[j], false); + if (childRoles && childRoles.length > 0) { + // separate case for role="code" + if (childRoles.includes("code")) { + noImpactRoles.push(childRoles.filter(function (role) { return role === "code"; }).join(", ")); + } + explicitRoles.push(childRoles.filter(function (role) { return role !== "code"; }).join(", ")); + } + else { + // get implicit role if exists + childRoles = AriaUtil_1.AriaUtil.getImplicitRole(directATChildren[j]); + // separate case for role="code" + if (childRoles.includes("code")) { + noImpactRoles.push(childRoles.filter(function (role) { return role === "code"; }).join(", ")); + } + if (childRoles && childRoles.length > 0) + implicitRoles.push(childRoles.filter(function (role) { return role !== "code"; }).join(", ")); + } + } + if (explicitRoles.length > 0) { + var retValues = []; + for (var i = 0; i < explicitRoles.length; i++) { + var retToken = new Array(); + retToken.push(roles.join(", ")); + retToken.push(explicitRoles[i]); + retValues.push((0, IRule_1.RuleFail)("fail_child_explicit_role", retToken)); + } + return retValues; + } + if (implicitRoles.length > 0) { + var retValues = []; + for (var i = 0; i < implicitRoles.length; i++) { + var retToken = new Array(); + retToken.push(roles.join(", ")); + retToken.push(implicitRoles[i]); + retValues.push((0, IRule_1.RulePotential)("potential_child_implicit_role", retToken)); + } + return retValues; + } + if (noImpactRoles.length > 0) { + var retValues = []; + for (var i = 0; i < noImpactRoles.length; i++) { + var retToken = new Array(); + retToken.push(roles.join(", ")); + retToken.push(noImpactRoles[i]); + retValues.push((0, IRule_1.RulePotential)("recommendation_no_impact_role", retToken)); + } + return retValues; + } + } + else + return (0, IRule_1.RulePass)("pass"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_document_label_unique.ts" +/*!****************************************************!*\ + !*** ./src/v4/rules/aria_document_label_unique.ts ***! + \****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_document_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_document_label_unique = { + id: "aria_document_label_unique", + context: "aria:document", + refactor: { + "Rpt_Aria_MultipleDocumentRoles": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_document_label_unique.html", + "fail_label_not_unique": "aria_document_label_unique.html", + "group": "aria_document_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"document\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"document\" roles do not have unique labels", + "group": "Each element with \"document\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "document", true); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_eventhandler_role_valid.ts" +/*!******************************************************!*\ + !*** ./src/v4/rules/aria_eventhandler_role_valid.ts ***! + \******************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_eventhandler_role_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.aria_eventhandler_role_valid = { + id: "aria_eventhandler_role_valid", + context: "dom:*[onclick],dom:*[onblur], dom:*[ondblclick], dom:*[onfocus], dom:*[onkeydown],dom:*[onkeypress], dom:*[onkeyup], dom:*[onmousedown], dom:*[onmouseup], dom:*[onmousemove], dom:*[onmouseout], dom:*[onmouseover], dom:*[onresize], dom:*[onchange]", + refactor: { + "Rpt_Aria_EventHandlerMissingRole_Native_Host_Sematics": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_eventhandler_role_valid.html", + "Fail_1": "aria_eventhandler_role_valid.html", + "group": "aria_eventhandler_role_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The <{0}> element with '{1}' does not have a valid ARIA role specified", + "group": "Elements with event handlers must have a valid ARIA role" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Don't trigger this for SVG element for now until a determination is made (by Rich) + // to support SVG at a point when the SVG a11y spec is ready. + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, "svg")) { + return null; + } + //this rule is passed if a element has attribut role + //also, passed of element has any implicit roles. + if (AriaUtil_1.AriaUtil.hasAnyRole(ruleContext, true)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + //pass if this element is received focus by default + if (CommonUtil_1.CommonUtil.isfocusableByDefault(ruleContext)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + //validate if this element has any of the given event handler's + var retToken1 = new Array(); + retToken1.push(ruleContext.nodeName.toLowerCase()); + var eventArr = new Array(); + // From WCAG20_Script_UseW3CDomFunctions + //let events = ["onblur", "onfocus", "onchange", "onclick", "oncontextmenu", "ondblclick", "onkeydown", + // "onkeypress", "onkeyup", "onload", "onmousedown", "onmouseup", "onmousemove", "onmouseout", + // "onmouseover", "onmousewheel", "onreset", "onpaste", "onresize", "onscroll", + // "onselect", "onsubmit", "onactivate", "ondeactivate", "onmouseenter", "onmouseleave"]; + var events = ["onblur", "onfocus", "onchange", "onclick", "ondblclick", "onkeydown", + "onkeypress", "onkeyup", "onmousedown", "onmouseup", "onmousemove", "onmouseout", + "onmouseover", "onresize" + ]; + for (var i = 0; i < events.length; ++i) { + if (ruleContext.hasAttribute(events[i])) + eventArr.push(events[i]); + } + var retToken2 = new Array(); + retToken2.push(eventArr.join(", ")); + //return new ValidationResult(false, [ruleContext], '', '', [retToken1, retToken2]); + return (0, IRule_1.RuleFail)("Fail_1", [retToken1.toString(), retToken2.toString()]); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_form_label_unique.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/aria_form_label_unique.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_form_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_form_label_unique = { + id: "aria_form_label_unique", + context: "aria:form", + refactor: { + "Rpt_Aria_MultipleFormLandmarks_Implicit": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_form_label_unique.html", + "fail_label_not_unique": "aria_form_label_unique.html", + "group": "aria_form_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"form\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"form\" role do not have unique labels", + "group": "Each element with \"form\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "form", true); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_graphic_labelled.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/aria_graphic_labelled.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_graphic_labelled = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_graphic_labelled = { + id: "aria_graphic_labelled", + context: "aria:graphics-document,aria:graphics-symbol", + refactor: { + "HAAC_Aria_SvgAlt": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3" + } + }, + help: { + "en-US": { + "group": "aria_graphic_labelled.html", + "Pass_0": "aria_graphic_labelled.html", + "Fail_1": "aria_graphic_labelled.html", + "Fail_2": "aria_graphic_labelled.html", + "Fail_3": "aria_graphic_labelled.html" + } + }, + messages: { + "en-US": { + "group": "An element with a graphics role must have a non-empty label", + "Pass_0": "Rule Passed", + "Fail_1": "Element with \"{0}\" graphics role has no label", + "Fail_2": "Element with \"{0}\" graphics role has no label or an empty label", + "Fail_3": "Element with \"{0}\" graphics role missing non-empty 'aria-label' or 'aria-labelledby'" + } + }, + rulesets: [], + act: [{ + "7d6734": { + "Pass_0": "pass", + "Fail_1": "inapplicable", + "Fail_2": "fail", + "Fail_3": "inapplicable" + } + }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + if (!ruleContext.hasAttribute("role") || !ruleContext.getAttribute("role").includes("graphics-")) + return null; + /* removed the role check role= presentation since if an element has role=img, then there needs to be a check for alt attribute regardless of the presecne of role=presentation + if (RPTUtil.hasRole(ruleContext, "presentation") || RPTUtil.hasRole(ruleContext, "none")){ + return RulePass(1); + }*/ + // If role === img, you must use an aria label + //check attributes aria-label and aria-labelledby for other tags (e.g., <div>, <span>, etc) + var passed = AriaUtil_1.AriaUtil.getAriaLabel(ruleContext).length > 0; + if (!passed && ruleContext.nodeName.toLowerCase() === "svg") { + var svgTitle = ruleContext.querySelector("title"); + passed = svgTitle && CommonUtil_1.CommonUtil.hasInnerContent(svgTitle); + } + if (!passed) { + //check title attribute + passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "title"); + // We should guide people to use alt or label - this is just a secondary approach to silence the rule. + // So, we should keep the POF from above. + // if (!passed) POF = "Fail_3"; + } + //return new ValidationResult(passed, [ruleContext], 'role', '', []); + if (passed) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_2", [ruleContext.getAttribute("role")]); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_hidden_nontabbable.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/aria_hidden_nontabbable.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_hidden_nontabbable = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.aria_hidden_nontabbable = { + id: "aria_hidden_nontabbable", + context: "dom:*[aria-hidden=true], dom:*[aria-hidden=true] dom:*", + refactor: { + "aria_hidden_focus_misuse": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "aria_hidden_nontabbable.html", + "Pass_0": "aria_hidden_nontabbable.html", + "Fail_1": "aria_hidden_nontabbable.html" + } + }, + messages: { + "en-US": { + "group": "A hidden element should not contain any tabbable elements", + "Pass_0": "Rule Passed", + "Fail_1": "Element \"{0}\" should not be focusable within the subtree of an element with an 'aria-hidden' attribute with value 'true'" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: ["1.3.1", "4.1.2"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_TWO + }], + // TODO: ACT: Handle testcase with focus jumping away + act: "6cfa84", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (CommonUtil_1.CommonUtil.isTabbable(ruleContext)) { + return (0, IRule_1.RuleFail)("Fail_1", [nodeName]); + } + return (0, IRule_1.RulePass)("Pass_0"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_id_unique.ts" +/*!****************************************!*\ + !*** ./src/v4/rules/aria_id_unique.ts ***! + \****************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_id_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_id_unique = { + id: "aria_id_unique", + context: "dom:*", + refactor: { + "Rpt_Aria_ValidIdRef": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_id_unique.html", + "Fail_1": "aria_id_unique.html", + "group": "aria_id_unique.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The 'id' \"{0}\" specified for the ARIA property '{1}' value is not valid", + "group": "The ARIA property must reference a non-empty unique id of an existing element that is visible" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + // TODO: ACT: 6a7281 - Need a separate reason code when the property is not required. ACT says it's okay to be + // invalid when not required. I think we should still fail, but flag it as a different reason so that we can have a subset + // aligns with ACT. + act: ["59796f", "6a7281"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var pass = true; + var attrNameArr = new Array(); + var nonExistantIDs = new Array(); + var ownerDocument = fragment_1.FragmentUtil.getOwnerFragment(ruleContext); + var contextAttributes = ruleContext.attributes; + var idTokens = new Array(); + var testedReferences = 0; + if (contextAttributes) { + for (var i = 0, attrLength = contextAttributes.length; i < attrLength; i++) { + pass = true; + var attrName = contextAttributes[i].name; + if (AriaUtil_1.AriaUtil.isDefinedAriaAttribute(ruleContext, attrName)) { + var dataTypes = ARIADefinitions_1.ARIADefinitions.propertyDataTypes[attrName]; + if (dataTypes && dataTypes.type) { + var supportsOneIDRef = (dataTypes.type == "http://www.w3.org/2001/XMLSchema#idref") ? true : false; + //If the data type supports one or more id refs do error checking + if (supportsOneIDRef || (dataTypes.type == "http://www.w3.org/2001/XMLSchema#idrefs")) { + testedReferences++; + var nodeValueLength = CommonUtil_1.CommonUtil.normalizeSpacing(contextAttributes[i].nodeValue).length; + var idArray = contextAttributes[i].nodeValue.split(" "); + // Check for an empty ID Ref + if (nodeValueLength < 1) { + pass = false; + idTokens.push("\"" + contextAttributes[i].nodeValue + "\""); + } + // check to see if too many IDRefs + else if (supportsOneIDRef) { + //If has too many IDRefs it is an error + if (nodeValueLength >= 1) { + if (idArray.length > 1) { + pass = false; + // Need to capture all the IDRefs for idTokens + for (var z = 0, length_1 = idArray.length; z < length_1; ++z) { + if (idArray[z] != "") { + idTokens.push(idArray[z]); + } + } + } + } + } + // check to see if id refs are invalid + if (pass && nodeValueLength >= 1) { + for (var j = 0, length_2 = idArray.length; j < length_2; ++j) { + if (idArray[j].length > 0) { // it is an empty string if spaces are one after the other + // Get the element by Id + var elementById = ownerDocument.getElementById(idArray[j]); + // Pass if the element exists + pass = elementById != null; + // If the element exists and this is an aria attribute that doesn't support hidden ID reference + // then perform a isNodeVisible check, in the case the node is not visible then we return + // false and true otherwise. + if (pass && !dataTypes.hiddenIDRefSupported) { + pass = VisUtil_1.VisUtil.isNodeVisible(elementById); + } + if (!pass) { + if (idArray[j] != "") { + idTokens.push(idArray[j]); + } + } + // Only one of the id references need to be valid to mark the rule as passed. + // Therefore if we find a single visible element then stop checking and mark as + // passed. + else { + break; + } + } + } + } + } + } + if (!pass) + attrNameArr.push(attrName); + } + } + } + var passed = attrNameArr.length == 0; + var retToken1 = new Array(); + var retToken2 = new Array(); + var retToken3 = new Array(); + if (!passed) { + retToken2.push(attrNameArr.join(", ")); + retToken3.push(ruleContext.nodeName.toLowerCase()); + if (idTokens.length > 0) { + retToken1.push(idTokens.join(", ")); + } + } + //return new ValidationResult(passed, [ruleContext], attrNameArr, '', passed == true ? [] : [retToken1, retToken2, retToken3]); + if (testedReferences == 0) { + return null; + } + else if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", [retToken1.toString(), retToken2.toString(), retToken3.toString()]); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_img_labelled.ts" +/*!*******************************************!*\ + !*** ./src/v4/rules/aria_img_labelled.ts ***! + \*******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_img_labelled = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_img_labelled = { + id: "aria_img_labelled", + context: "aria:img, aria:image", + refactor: { + "HAAC_Aria_ImgAlt": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3" + } + }, + help: { + "en-US": { + "group": "aria_img_labelled.html", + "Pass_0": "aria_img_labelled.html", + "Fail_1": "aria_img_labelled.html", + "Fail_2": "aria_img_labelled.html", + "Fail_3": "aria_img_labelled.html" + } + }, + messages: { + "en-US": { + "group": "An element with \"img\" role must have a non-empty label", + "Pass_0": "Rule Passed", + "Fail_1": "Element with \"img\" role has no label", + "Fail_2": "Element with \"img\" role has no label or an empty label", + "Fail_3": "Element with \"img\" role missing non-empty 'aria-label' or 'aria-labelledby'" + } + }, + rulesets: [], + act: ["23a2a8", { + "7d6734": { + "Pass_0": "pass", + "Fail_1": "inapplicable", + "Fail_2": "fail", + "Fail_3": "inapplicable" + } + }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + if (!ruleContext.hasAttribute("role")) { + // If no role, this is implicit, and covered by WCAG20_Img_HasAlt + return null; + } + var nodeName = ruleContext.nodeName.toLocaleLowerCase(); + // svg and img elements are handled in svg_graphics_labbelled and img_alt_valid rules + if (nodeName === 'svg' || nodeName === 'img') + return; + /* removed the role check role= presentation since if an element has role=img, then there needs to be a check for alt attribute regardless of the presecne of role=presentation + if (RPTUtil.hasRole(ruleContext, "presentation") || RPTUtil.hasRole(ruleContext, "none")){ + return RulePass(1); + }*/ + /* JCH - Points of failure + * 0. Missing alt attr with value + * 1. Missing aria-label or aria-labelledby + * 2. Missing title attr with value + */ + // If role === img, you must use an aria label + //check attributes aria-label and aria-labelledby for other tags (e.g., <div>, <span>, etc) + var passed = AriaUtil_1.AriaUtil.getAriaLabel(ruleContext).length > 0; + if (!passed && ruleContext.nodeName.toLowerCase() === "svg") { + var svgTitle = ruleContext.querySelector("title"); + passed = svgTitle && CommonUtil_1.CommonUtil.hasInnerContent(svgTitle); + } + if (!passed) { + //check title attribute + passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "title"); + // We should guide people to use alt or label - this is just a secondary approach to silence the rule. + // So, we should keep the POF from above. + // if (!passed) POF = "Fail_3"; + } + //return new ValidationResult(passed, [ruleContext], 'role', '', []); + if (passed) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_2"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_keyboard_handler_exists.ts" +/*!******************************************************!*\ + !*** ./src/v4/rules/aria_keyboard_handler_exists.ts ***! + \******************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_keyboard_handler_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_keyboard_handler_exists = { + id: "aria_keyboard_handler_exists", + context: "dom:*[role]", + dependencies: ["aria_role_allowed"], + refactor: { + "Rpt_Aria_MissingKeyboardHandler": { + "pass": "pass", + "potential_no_keyboard_access": "potential_no_keyboard_access" + } + }, + help: { + "en-US": { + "pass": "aria_keyboard_handler_exists.html", + "potential_no_keyboard_access": "aria_keyboard_handler_exists.html", + "group": "aria_keyboard_handler_exists.html" + } + }, + messages: { + "en-US": { + "pass": "Rule Passed", + "potential_no_keyboard_access": "Verify the <{0}> element with \"{1}\" role has keyboard access", + "group": "Interactive WAI_ARIA UI components must provide keyboard access" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + var passed = true; + var savedPassed = passed; + var doc = ruleContext.ownerDocument; + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + //let roles = ruleContext.getAttribute("role").trim().toLowerCase().split(/\s+/); + //only consider user specified role(s), rather than native containers + var roles = AriaUtil_1.AriaUtil.getRoles(ruleContext, false); + var nodeName = ruleContext.nodeName.toLowerCase(); + //if an explicit role is specified, the 'aria_role_redundant' rule should be triggered and addressed first, + // and the current rule should be ignored + if (nodeName === 'datalist' && roles && roles.includes("listbox")) + return null; + // Composite user interface widget roles. They act as containers that manage other, contained widgets. + var roleContainers = ["combobox", "grid", "listbox", "menu", "menubar", "radiogroup", "tablist", "tree", "treegrid"]; + for (var _i = 0, roleContainers_1 = roleContainers; _i < roleContainers_1.length; _i++) { + var role = roleContainers_1[_i]; + if (AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, role, true) != null) + // it's a descendant of a composite widget already examined + return null; + } + var hasAttribute = CommonUtil_1.CommonUtil.hasAttribute; + var roleNameArr = new Array(); + for (var j = 0; j < roles.length; ++j) { + var pattern = designPatterns[roles[j]]; + if (roleContainers.indexOf(roles[j]) >= 0) { + var disabled = hasAttribute(ruleContext, 'aria-disabled') ? ruleContext.getAttribute("aria-disabled") : ''; + if (!disabled) { + // See if there is a keyboard event handler on the parent element. + passed = (ruleContext.hasAttribute("onkeydown") || ruleContext.hasAttribute("onkeypress") || ruleContext.hasAttribute("onkeyup")); + // No keyboard event handler found on parent. See if keyboard event handlers are on required child elements. + if (!passed) { + if (!hasAttribute(ruleContext, 'aria-activedescendant')) { + var reqChildren = ARIADefinitions_1.ARIADefinitions.designPatterns[roles[j]].reqChildren; + if (reqChildren) { /* SMF TODO menubar does not have any reqChildren */ + for (var i = 0, requiredChildrenLength = reqChildren.length; i < requiredChildrenLength; i++) { + var xp = "*[contains(@role,'" + reqChildren[i] + "')]"; + var xpathResult = doc.evaluate(xp, ruleContext, CommonUtil_1.CommonUtil.defaultNSResolver, 0 /* XPathResult.ANY_TYPE */, null); + var r = xpathResult.iterateNext(); + while (r) { + passed = (r.hasAttribute("onkeydown") || r.hasAttribute("onkeypress")); + if (!passed) { + // Child did not have a key handler. See if any of the grandchildren do. + var xp2 = "descendant::*"; + var xpathResult2 = doc.evaluate(xp2, r, CommonUtil_1.CommonUtil.defaultNSResolver, 0 /* XPathResult.ANY_TYPE */, null); + var r2 = xpathResult2.iterateNext(); + while (r2 && !passed) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(r2)) { + r2 = xpathResult2.iterateNext(); + continue; + } + passed = CommonUtil_1.CommonUtil.isTabbable(r2) && + (r2.hasAttribute("onkeydown") || r2.hasAttribute("onkeypress")); + if (!passed) { + // Is this an action link? + if (r2.nodeName.toLowerCase() == "a" && r2.hasAttribute("href")) { + var href = r2.getAttribute("href"); + // Action link must start with "javascript:", must not contain a "void" and + // must have a function name following "javascript:" (i.e., href.length > 11) + passed = (href.startsWith("javascript:") && href.indexOf("void") == -1 && href.length > 11); + } + } + r2 = xpathResult2.iterateNext(); + } + } + if (!passed) { + // All the required children (or any descendants of the required children) must have keypress/keydown + // If not, it is a failure, no need to keep checking any more. + break; + } + r = xpathResult.iterateNext(); + } + } + } + else { + // The current element failed the keydown/keypress, and it does not have required children, such as menubar. + // Let's check its descendants. + var xp2 = "descendant::*"; + var xpathResult2 = doc.evaluate(xp2, ruleContext, CommonUtil_1.CommonUtil.defaultNSResolver, 0 /* XPathResult.ANY_TYPE */, null); + var r2 = xpathResult2.iterateNext(); + while (r2 && !passed) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(r2)) { + r2 = xpathResult2.iterateNext(); + continue; + } + passed = CommonUtil_1.CommonUtil.isTabbable(r2) && + (r2.hasAttribute("onkeydown") || r2.hasAttribute("onkeypress")); + if (!passed) { + // Is this an action link? + if (r2.nodeName.toLowerCase() == "a" && r2.hasAttribute("href")) { + var href = r2.getAttribute("href"); + // Action link must start with "javascript:", must not contain a "void" and + // must have a function name following "javascript:" (i.e., href.length > 11) + passed = (href.startsWith("javascript:") && href.indexOf("void") == -1 && href.length > 11); + } + } + r2 = xpathResult2.iterateNext(); + } + } + } + else { + // Attribute 'aria-activedescendant' is specified. + passed = true; + } + } + } + } + if (!passed) { + roleNameArr.push(roles[j]); + } + if (!passed && savedPassed) { + savedPassed = passed; + } + } + var retToken1 = new Array(); + retToken1.push(ruleContext.nodeName.toLowerCase()); + var retToken2 = new Array(); + retToken2.push(roleNameArr.join(", ")); + // Determine if this is referenced by a combobox. If so, leave it to the combobox rules to check + var id = ruleContext.getAttribute("id"); + if (id && id.trim().length > 0) { + if (ruleContext.ownerDocument.querySelector("*[aria-controls='".concat(id, "'][role='combobox']"))) { + return null; + } + } + return savedPassed ? (0, IRule_1.RulePass)("pass") : (0, IRule_1.RulePotential)("potential_no_keyboard_access", [retToken1.toString(), retToken2.toString()]); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_landmark_name_unique.ts" +/*!***************************************************!*\ + !*** ./src/v4/rules/aria_landmark_name_unique.ts ***! + \***************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_landmark_name_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var ARIAMapper_1 = __webpack_require__(/*! ../../v2/aria/ARIAMapper */ "./src/v2/aria/ARIAMapper.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +exports.aria_landmark_name_unique = { + id: "aria_landmark_name_unique", + context: "aria:complementary, aria:banner, aria:contentinfo, aria:main, aria:navigation, aria:region, aria:search, aria:form", + refactor: { + "landmark_name_unique": { + "Pass_0": "pass", + "Fail_0": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_landmark_name_unique.html", + "fail_label_not_unique": "aria_landmark_name_unique.html", + "group": "aria_landmark_name_unique.html" + } + }, + messages: { + "en-US": { + "pass": "Multiple elements with \"{0}\" landmarks within the same parent region are distinguished by unique 'aria-label' or 'aria-labelledby'", + "fail_label_not_unique": "Multiple elements with \"{0}\" landmarks within the same parent region are not distinguished from one another because they have the same \"{1}\" label", + "group": "Each landmark should have a unique 'aria-labelledby' or 'aria-label' or be nested in a different parent region" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }, + { + "id": ["WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + // TODO do I need to fiter out bad contentinfo nodes: The footer element is not a contentinfo landmark when it is a descendant of the following HTML5 sectioning elements: https://www.w3.org/TR/2017/NOTE-wai-aria-practices-1.1-20171214/examples/landmarks/HTML5.html + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // Checking if this landmark is inside a dialog element. If it is we are going to skip checking it. + /**var copyOfRuleContext = ruleContext; + var parnetNodesOfRuleContext = []; + while (copyOfRuleContext) { + parnetNodesOfRuleContext.unshift(copyOfRuleContext); + copyOfRuleContext = copyOfRuleContext.parentElement; + } + parnetNodesOfRuleContext.forEach(elem => { + if (elem !== null) { + if (elem.tagName == "DIALOG" || elem.getAttribute('role') == "dialog") { + return null // Skipping checking landmarks that happen to be inside dialog elements + } + } + }) + */ + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["DIALOG"]) !== null || AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, "dialog", true) !== null) + return null; + // Begining formCache work + var ownerDocument = fragment_1.FragmentUtil.getOwnerFragment(ruleContext); + var formCache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "aria_landmark_name_unique", null); + if (!formCache) { + // console.log("---------ENTERING FORM CACHE") + formCache = { + navigationNodes: [], + navigationNodesComputedLabels: [], + navigationNodesParents: [], + navigationNodesMatchFound: [] + }; + var navigationNodesTemp = ownerDocument.querySelectorAll('aside,[role="complementary"], footer,[role="contentinfo"], header,[role="banner"], main,[role="main"], nav,[role="navigation"], form,[role="form"], section,[role="region"],[role="search"]'); + var navigationNodes = Array.from(navigationNodesTemp); + var navigationNodesParents = []; + var navigationNodesMatchFound = []; + // This block of code filters out any nav elements that are under a dialog. As those are not ones we want to test against as we consider dialogs are separate locations from the rest of the main page. + var navigationNodesWithoutDialogs = []; + for (var i = 0; i < navigationNodes.length; i++) { + /**let a = navigationNodes[i]; + + let dialogNodeFoundFlag = false; + while (a) { + a = a.parentElement; + if (a !== null) { + if (a.tagName == "DIALOG" || a.getAttribute('role') == "dialog") { + dialogNodeFoundFlag = true; + } + } + } + if (!dialogNodeFoundFlag) { + navigationNodesWithoutDialogs.push(navigationNodes[i]) + }*/ + // ignore node that is AT hidden or in a dialog + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(navigationNodes[i]) || CommonUtil_1.CommonUtil.getAncestor(navigationNodes[i], ["DIALOG"]) !== null || AriaUtil_1.AriaUtil.getAncestorWithRole(navigationNodes[i], "dialog", true) !== null) + continue; + navigationNodesWithoutDialogs.push(navigationNodes[i]); + } + navigationNodes = navigationNodesWithoutDialogs; + for (var i = 0; i < navigationNodes.length; i++) { + // Loop over all the landmark nodes + var els = []; + var a = navigationNodes[i].parentElement; + while (a) { + els.push(a); + a = a.parentElement; + } + for (var j = 0; j < els.length; j++) { + // Loop over all the parents of the landmark nodes + // Find nearest landmark parent based on the tagName or the role attribute + var tagNameTrigger = [ + "ASIDE", + "FOOTER", + "FORM", + "HEADER", + "MAIN", + "NAV", + "SECTION", + ].includes(els[j].tagName); + var roleNameTrigger = false; + if (els[j].hasAttribute("role")) { + roleNameTrigger = [ + "complementary", + "contentinfo", + "form", + "banner", + "main", + "navigation", + "region", + "search", + ].includes(els[j].getAttribute("role")); // TODO we are not covering the case where a elemenent with multiple roles. e.g., role = "form banner". This is a improvment we might want to add in the future. + } + if (tagNameTrigger || roleNameTrigger) { + // Nearest parent-landmark found + navigationNodesParents.push(els[j]); + break; + } + if (j === els.length - 1) { + // This node is at the head of the file so it does not have a parent + navigationNodesParents.push(null); + break; + } + } + } + var navigationNodesComputedLabels = []; + for (var i = 0; i < navigationNodes.length; i++) { + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(navigationNodes[i]); + // Loop over all the landmark nodes + navigationNodesComputedLabels.push( + /**ARIAMapper.computeName(navigationNodes[i])*/ + pair && pair.name && pair.name.trim().length > 0 ? pair.name.trim() : ""); + } + for (var i = 0; i < navigationNodesParents.length; i++) { + // Loop over all the parents of the landmark nodes to find duplicates + var matchFound = false; + var pass_0_flag = false; + for (var j = 0; j < navigationNodesParents.length; j++) { + if (j === i) { + // We do not want to compare against ourselfs + continue; + } + // This if statement focus on the case where the parent landmark is null + if (navigationNodesParents[i] === null && + navigationNodesParents[j] === null) { + // We are looking at two root nodes, so we should compare them. + if (ARIAMapper_1.ARIAMapper.nodeToRole(navigationNodes[i]) === + ARIAMapper_1.ARIAMapper.nodeToRole(navigationNodes[j])) { + // Both nodes have the same role AND + if (navigationNodesComputedLabels[i] === + navigationNodesComputedLabels[j]) { + // both have the same (computed) aria-label/aria-labelledby + // if (navigationNodesComputedLabels[i] === "") { + navigationNodesMatchFound.push("fail_label_not_unique"); // Fail 0 + matchFound = true; + break; + // } + } + else { + // Same parents && same node roles BUT different computed aria-label/aria-labelledby + // We have at least a Pass_0. But we need to check all nodes to see if another one fails. So set a flag. + pass_0_flag = true; + } + } + else { + // Same parents but different node roles // Not applicable + } + } + else if (navigationNodesParents[i] === null || + navigationNodesParents[j] === null) { + // We are looking at a single root node + continue; + } + // This if statement focus on the case where the parent landmark is NOT null + if (DOMUtil_1.DOMUtil.sameNode(navigationNodesParents[i], navigationNodesParents[j])) { + // We have the same parent-landmark AND + if (ARIAMapper_1.ARIAMapper.nodeToRole(navigationNodes[i]) === + ARIAMapper_1.ARIAMapper.nodeToRole(navigationNodes[j])) { + // Both nodes have the same role AND + if (navigationNodesComputedLabels[i] === + navigationNodesComputedLabels[j]) { + // both have the same (computed) aria-label/aria-labelledby + // if (navigationNodesComputedLabels[i] === "") { + navigationNodesMatchFound.push("fail_label_not_unique"); // Fail 0 + matchFound = true; + break; + // } + } + else { + // Same parents && same node roles BUT different computed aria-label/aria-labelledby + // We have at least a Pass_0. But we need to check all nodes to see if another one fails. So set a flag. + pass_0_flag = true; + } + } + else { + // Same parents but different node roles // Not applicable + } + } + else { + // Different parents // Not applicable + } + } + if (!matchFound) { + if (pass_0_flag) { + navigationNodesMatchFound.push("pass"); + } + else { + navigationNodesMatchFound.push("null"); // This is not the keyword null on purpose. It is a spaceholder in the array so indexes match up. + } + } + } + formCache.navigationNodesComputedLabels = + navigationNodesComputedLabels; + formCache.navigationNodes = navigationNodes; + formCache.navigationNodesParents = navigationNodesParents; + formCache.navigationNodesMatchFound = navigationNodesMatchFound; + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "aria_landmark_name_unique", formCache); + // TODO Add validation that all 3 arrays are the same length + // console.log("-------------End formCache") + } // End formCache + var indexToCheck = -1; + for (var i = 0; i < formCache.navigationNodes.length; i++) { + if (ruleContext.isSameNode(formCache.navigationNodes[i])) { + indexToCheck = i; + } + } + if (indexToCheck === -1) { + return null; + } + if (formCache.navigationNodesMatchFound[indexToCheck] === "pass") { + return (0, IRule_1.RulePass)("pass", [ + ARIAMapper_1.ARIAMapper.nodeToRole(formCache.navigationNodes[indexToCheck]), + ]); + } + else if (formCache.navigationNodesMatchFound[indexToCheck] === "fail_label_not_unique") { + return (0, IRule_1.RuleFail)("fail_label_not_unique", [ + ARIAMapper_1.ARIAMapper.nodeToRole(formCache.navigationNodes[indexToCheck]), + formCache.navigationNodesComputedLabels[indexToCheck], + ]); + } + else { + return null; + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_main_label_unique.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/aria_main_label_unique.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_main_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_main_label_unique = { + id: "aria_main_label_unique", + context: "aria:main", + refactor: { + "Rpt_Aria_MultipleMainsRequireLabel_Implicit_2": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_main_label_unique.html", + "Fail_1": "aria_main_label_unique.html", + "group": "aria_main_label_unique.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Multiple elements with \"main\" role do not have unique labels", + "group": "Each element with \"main\" role must have unique label that describes its purposes" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var contextLabel = AriaUtil_1.AriaUtil.getAriaLabel(ruleContext); + var parentDocRole = AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, "document", true); + var mains = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "main", true, true); + var result = null; + for (var i = 0; i < mains.length; ++i) { + if (mains[i] === ruleContext) + continue; + result = (0, IRule_1.RulePass)("Pass_0"); + var thisParentDocRole = AriaUtil_1.AriaUtil.getAncestorWithRole(mains[i], "document", true); + if (thisParentDocRole === parentDocRole) { + if (AriaUtil_1.AriaUtil.getAriaLabel(mains[i]) === contextLabel) { + result = (0, IRule_1.RuleFail)("Fail_1"); + break; + } + } + } + return result; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_main_label_visible.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/aria_main_label_visible.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_main_label_visible = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_main_label_visible = { + id: "aria_main_label_visible", + context: "dom:body", + refactor: { + "Rpt_Aria_MultipleMainsVisibleLabel_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_main_label_visible.html", + "Fail_1": "aria_main_label_visible.html", + "group": "aria_main_label_visible.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Multiple elements with \"main\" role do not have unique visible labels", + "group": "Each element with \"main\" role should have a unique visible label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // Consider the Check Hidden Content setting that is set by the rules + //call getElementsByRoleHidden with considerImplicit flag as true + //so that the method returs <main> elements + var landmarks = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "main", true, true); + if (landmarks.length === 0 || landmarks.length === 1) { + return null; + } + var passed = AriaUtil_1.AriaUtil.hasUniqueAriaLabelledby(landmarks); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_navigation_label_unique.ts" +/*!******************************************************!*\ + !*** ./src/v4/rules/aria_navigation_label_unique.ts ***! + \******************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_navigation_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_navigation_label_unique = { + id: "aria_navigation_label_unique", + context: "aria:navigation", + refactor: { + "Rpt_Aria_MultipleNavigationLandmarks_Implicit": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_navigation_label_unique.html", + "fail_label_not_unique": "aria_navigation_label_unique.html", + "group": "aria_navigation_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"navigation\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"navigation\" role do not have unique labels", + "group": "Each element with \"navigation\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "navigation", true); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_parent_required.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/aria_parent_required.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_parent_required = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_parent_required = { + id: "aria_parent_required", + context: "dom:*[role]", + dependencies: ["aria_role_allowed"], + refactor: { + "Rpt_Aria_RequiredParent_Native_Host_Sematics": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "aria_parent_required.html", + "Pass_0": "aria_parent_required.html", + "Fail_1": "aria_parent_required.html" + } + }, + messages: { + "en-US": { + "group": "Each element with an implicit or explicit role must be contained within a valid element", + "Pass_0": "Rule Passed", + "Fail_1": "Element with \"{0}\" role is not contained in or owned by an element with one of the following roles: \"{1}\"" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + // TODO: ACT: Check Fail 3 + act: "ff89c9", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip the check if the element should be a presentational child of an element + if (AriaUtil_1.AriaUtil.shouldBePresentationalChild(ruleContext) || VisUtil_1.VisUtil.isNodePresentational(ruleContext)) + return; + var passed = true; + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + var roleNameArr = new Array(); + var containerRoles = new Array(); + var testedContainer = 0; + var ancestorRoles = contextHierarchies["aria"].map(function (info) { return info.role; }); + var parentRole = ancestorRoles[ancestorRoles.length - 2]; + var count = 2; + while (parentRole === 'none') { + count++; + parentRole = ancestorRoles[ancestorRoles.length - count]; + } + /**for (let j = 0, length = roles.length; j < length; ++j) { + if (designPatterns[roles[j]] && designPatterns[roles[j]].container != null) { + testedContainer++; + passed = false; + containerRoles = designPatterns[roles[j]].container; + for (let i = 0, containersLength = containerRoles.length; !passed && i < containersLength; i++) { + passed = parentRole === containerRoles[i]; + if (passed) break; + } + if (passed == false) { + roleNameArr.push(roles[j]); + } + } + } + */ + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + if (designPatterns[role] && designPatterns[role].container != null) { + testedContainer++; + passed = false; + containerRoles = designPatterns[role].container; + for (var i = 0, containersLength = containerRoles.length; !passed && i < containersLength; i++) { + passed = parentRole === containerRoles[i]; + if (passed) + break; + } + if (passed == false) { + roleNameArr.push(role); + } + } + var retToken1 = new Array(); + retToken1.push(roleNameArr.join(", ")); + var retToken2 = new Array(); + retToken2.push(containerRoles.join(", ")); + //return new ValidationResult(passed, [ruleContext], '', '', passed == true ? [] : [retToken1, retToken2]); + if (testedContainer == 0) { + return null; + } + else if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", [retToken1.toString(), retToken2.toString()]); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_region_label_unique.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/aria_region_label_unique.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_region_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_region_label_unique = { + id: "aria_region_label_unique", + context: "aria:region", + refactor: { + "Rpt_Aria_MultipleRegionsUniqueLabel_Implicit": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_region_label_unique.html", + "fail_label_not_unique": "aria_region_label_unique.html", + "group": "aria_region_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"region\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"region\" role do not have unique labels", + "group": "Each element with \"region\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "region"); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_region_labelled.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/aria_region_labelled.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_region_labelled = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_region_labelled = { + id: "aria_region_labelled", + context: "aria:region", + refactor: { + "Rpt_Aria_RegionLabel_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + // "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_0": "aria_region_labelled.html", + "Fail_1": "aria_region_labelled.html", + // "Fail_2": "aria_region_labelled.html", + "group": "aria_region_labelled.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Element with \"region\" role does not have a label", + // "Fail_2": "Element with \"region\" role is not labeled with 'aria-label' or 'aria-labelledby'", + "group": "Each element with \"region\" role must have a label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = AriaUtil_1.AriaUtil.hasAriaLabel(ruleContext) || CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "title"); + if (passed) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_role_allowed.ts" +/*!*******************************************!*\ + !*** ./src/v4/rules/aria_role_allowed.ts ***! + \*******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_role_allowed = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +exports.aria_role_allowed = { + id: "aria_role_allowed", + context: "dom:*[role]", + refactor: { + "Rpt_Aria_ValidRole": { + "Pass_0": "Pass_0", + "Fail_2": "Fail_2", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "group": "aria_role_allowed.html", + "Pass_0": "aria_role_allowed.html", + "Fail_2": "aria_role_allowed.html", + "Potential_1": "aria_role_allowed.html" + } + }, + messages: { + "en-US": { + "group": "Elements must have a valid 'role' per ARIA specification", + "Pass_0": "Rule Passed", + "Fail_2": "The role '{0}' defined on the element is not valid per ARIA specification", + "Potential_1": "Some of the roles, '{0}', defined on the element are not valid per ARIA specification" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "4.1.2", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + // TODO: ACT: Recheck + act: "674b10", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var roleStr = ruleContext.getAttribute("role").trim().toLowerCase(); + if (roleStr.length === 0) { + return null; + } + if (ruleContext.hasAttribute("aria-hidden") && ruleContext.getAttribute("aria-hidden").toLowerCase() === "true") { + return null; + } + var invalidRoles = AriaUtil_1.AriaUtil.getRolesUndefinedByAria(ruleContext); + if (!invalidRoles || invalidRoles.length === 0) + return (0, IRule_1.RulePass)("Pass_0"); + else { + var roles = roleStr.split(/\s+/); + if (invalidRoles.length === roles.length) { + return (0, IRule_1.RuleFail)("Fail_2", [invalidRoles.join(",")]); + } + else if (invalidRoles.length > 0) { + return (0, IRule_1.RulePotential)("Potential_1", [invalidRoles.join(",")]); + } + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_role_redundant.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/aria_role_redundant.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_role_redundant = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +exports.aria_role_redundant = { + id: "aria_role_redundant", + context: "dom:*[role]", + help: { + "en-US": { + "pass": "aria_role_redundant.html", + "fail_redundant": "aria_role_redundant.html", + "group": "aria_role_redundant.html" + } + }, + messages: { + "en-US": { + "pass": "An explicitly-assigned ARIA role is not redundant with the implicit role of the element", + "fail_redundant": "The explicitly-assigned ARIA role \"{0}\" is redundant with the implicit role of the element <{1}>", + "group": "An explicitly-assigned ARIA role should not be redundant with the implicit role of the element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["ARIA"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var elemName = ruleContext.tagName.toLowerCase(); + var ariaRoles = AriaUtil_1.AriaUtil.getRoles(ruleContext, false); + if (!ariaRoles || ariaRoles.length === 0) + return; + // the invalid role case: handled by Rpt_Aria_ValidRole. Ignore to avoid duplicated report + var role_defined = AriaUtil_1.AriaUtil.areRolesDefined(ariaRoles); + if (!role_defined) + return null; + // dependency check: if it's already failed in the parent relation, then skip this check + // comment out to report the redundant role for table element: tr, td & th + /**if (["td", "th", "tr"].includes(elemName)) { + let parentRole = TableUtil.isTableDescendant(contextHierarchies); + if (parentRole !== null && parentRole.length > 0) + return null; + }*/ + var implicitRoles = AriaUtil_1.AriaUtil.getImplicitRole(ruleContext); + if (!implicitRoles || implicitRoles.length === 0) + return (0, IRule_1.RulePass)("pass"); + var ret = []; + for (var i = 0; i < ariaRoles.length; i++) { + if (!implicitRoles.includes(ariaRoles[i])) + ret.push((0, IRule_1.RulePass)("pass")); + else + ret.push((0, IRule_1.RuleFail)("fail_redundant", [ariaRoles[i], elemName])); + } + if (ret.length > 0) + return ret; + return null; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_search_label_unique.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/aria_search_label_unique.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_search_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.aria_search_label_unique = { + id: "aria_search_label_unique", + context: "aria:search", + refactor: { + "Rpt_Aria_MultipleSearchLandmarks": { + "Pass_0": "pass", + "Fail_1": "fail_label_not_unique" + } + }, + help: { + "en-US": { + "pass": "aria_search_label_unique.html", + "fail_label_not_unique": "aria_search_label_unique.html", + "group": "aria_search_label_unique.html" + } + }, + messages: { + "en-US": { + "pass": "The element with \"search\" role has a unique label that describes its purpose", + "fail_label_not_unique": "Multiple elements with \"search\" role do not have unique labels", + "group": "Each element with \"search\" role must have a unique label that describes its purpose" + } + }, + /** + * deprecated the rule on 01/27/2025 + * rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": eRulePolicy.VIOLATION, + "toolkitLevel": eToolkitLevel.LEVEL_THREE + }],*/ + rulesets: [{ + "id": [], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var dupped = AriaUtil_1.AriaUtil.isLandmarkNameUnique(ruleContext, "search", true); + if (dupped == null) + return null; + if (dupped) { + return (0, IRule_1.RuleFail)("fail_label_not_unique"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_semantics.ts" +/*!****************************************!*\ + !*** ./src/v4/rules/aria_semantics.ts ***! + \****************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_attribute_valid = exports.aria_role_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.aria_role_valid = { + id: "aria_role_valid", + context: "dom:*", + dependencies: ["aria_attribute_allowed"], + refactor: { + "aria_semantics_role": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_0": "aria_role_valid.html", + "Fail_1": "aria_role_valid.html", + "Fail_2": "aria_role_valid.html", + "group": "aria_role_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The ARIA role '{0}' is not valid for the element <{1}>", + "Fail_2": "The ARIA role '{0}' is not valid for the element <{1}> and may be ignored by the browser since the element is focusable", + "group": "ARIA roles must be valid for the element to which they are assigned" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var tagName = ruleContext.tagName.toLowerCase(); + // only chek element (1) and fragment nodes (11) + if (ruleContext.nodeType !== 1 /* Node.ELEMENT_NODE */) + return null; + //skip the rule + // the invalid role case: handled by aria_role_allowed. Ignore to avoid duplicated report + var undefinedRoles = AriaUtil_1.AriaUtil.getRolesUndefinedByAria(ruleContext); + if (undefinedRoles && undefinedRoles.length > 0) + return null; + var deprecatedRoles = AriaUtil_1.AriaUtil.getDeprecatedAriaRoles(ruleContext); + if (deprecatedRoles && deprecatedRoles.length > 0) + return null; + var deprecatedAttributes = AriaUtil_1.AriaUtil.getDeprecatedAriaAttributes(ruleContext); + if (deprecatedAttributes && deprecatedAttributes.length > 0) + return null; + // dependency check: if it's already failed, then skip + if (["td", "th", "tr"].includes(tagName)) { + var parentRole = CommonUtil_1.CommonUtil.isTableDescendant(contextHierarchies); + if (parentRole !== null && parentRole.length > 0) + return null; + } + var domRoles = AriaUtil_1.AriaUtil.getUserDefinedRoles(ruleContext); + if (!domRoles || domRoles.length === 0) + return null; + // check the 'generic' role first + if (domRoles.includes('generic')) + return (0, IRule_1.RuleFail)("Fail_1", ["generic", tagName]); + var invalidRoles = AriaUtil_1.AriaUtil.getInvalidRoles(ruleContext); + if (invalidRoles === null || invalidRoles.length === 0) + return (0, IRule_1.RulePass)("Pass_0", [domRoles.join(", "), tagName]); + if (invalidRoles.includes("presentation") || invalidRoles.includes("none") && CommonUtil_1.CommonUtil.isTabbable(ruleContext)) + return (0, IRule_1.RuleFail)("Fail_2", [invalidRoles.join(", "), tagName]); + if (invalidRoles.length > 0) + return (0, IRule_1.RuleFail)("Fail_1", [invalidRoles.join(", "), tagName]); + if (domRoles.length > 0) + return (0, IRule_1.RulePass)("Pass_0", [domRoles.join(", "), tagName]); + return null; + } +}; +// This rule is in the same file because there is a dependency that aria_role_valid runs first, +// and the info is passed by cache, but there isn't a dependency in the Fail_2 scenario, so regular +// dependency cannot be used +exports.aria_attribute_valid = { + id: "aria_attribute_valid", + context: "dom:*", + // The the ARIA role is completely invalid, skip this check + dependencies: ["aria_attribute_deprecated", "aria_role_valid"], + refactor: { + "aria_attribute_allowed": { + "Pass": "Pass", + "Fail_invalid_role_attr": "Fail_invalid_role_attr", + "Fail_invalid_implicit_role_attr": "Fail_invalid_implicit_role_attr" + } + }, + help: { + "en-US": { + "group": "aria_attribute_valid.html", + "Pass": "aria_attribute_valid.html", + "Fail_invalid_role_attr": "aria_attribute_valid.html", + "Fail_invalid_implicit_role_attr": "aria_attribute_valid.html" + } + }, + messages: { + "en-US": { + "group": "ARIA attributes should be valid for the element and ARIA role to which they are assigned", + "Pass": "ARIA attributes are valid for the element and ARIA role", + "Fail_invalid_role_attr": "The ARIA attributes \"{0}\" are not valid for the element <{1}> with ARIA role \"{2}\"", + "Fail_invalid_implicit_role_attr": "The ARIA attributes \"{0}\" are not valid for the element <{1}> with implicit ARIA role \"{2}\"" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["ARIA"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: ["5c01ea", { "46ca7f": { "Pass": "pass", "Fail_invalid_role_attr": "fail", "Fail_invalid_implicit_role_attr": "fail" } }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // only chek element (1) + if (ruleContext.nodeType !== 1 /* Node.ELEMENT_NODE */) + return null; + // ignore if no aria attribute + var ariaAttributes = AriaUtil_1.AriaUtil.getUserDefinedAriaAttributes(ruleContext); + if (ariaAttributes === null || ariaAttributes.length === 0) + return null; + var roles = AriaUtil_1.AriaUtil.getUserDefinedRoles(ruleContext); + var explicit = true; + if (roles && roles.length > 0) { + // the invalid role case: handled by Rpt_Aria_ValidRole. Ignore to avoid duplicated report + if (!AriaUtil_1.AriaUtil.areRolesDefined(roles)) + return null; + } + else { + //no explicit role defined + roles = AriaUtil_1.AriaUtil.getImplicitRole(ruleContext); + explicit = false; + } + var tagName = ruleContext.tagName.toLowerCase(); + var failedAttributes = AriaUtil_1.AriaUtil.getInvalidAriaAttributes(ruleContext); + if (!failedAttributes || failedAttributes.length === 0) + return (0, IRule_1.RulePass)("Pass", [ariaAttributes.join(", "), tagName, roles.join(", ")]); + if (roles.length > 0) { + if (explicit) + return (0, IRule_1.RuleFail)("Fail_invalid_role_attr", [failedAttributes.join(", "), tagName, roles.join(", ")]); + else + return (0, IRule_1.RuleFail)("Fail_invalid_implicit_role_attr", [failedAttributes.join(", "), tagName, roles.join(", ")]); + } + return (0, IRule_1.RuleFail)("Fail_invalid_role_attr", [failedAttributes.join(", "), tagName, "none"]); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_toolbar_label_unique.ts" +/*!***************************************************!*\ + !*** ./src/v4/rules/aria_toolbar_label_unique.ts ***! + \***************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_toolbar_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +exports.aria_toolbar_label_unique = { + id: "aria_toolbar_label_unique", + context: "aria:toolbar", + refactor: { + "Rpt_Aria_MultipleToolbarUniqueLabel": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "aria_toolbar_label_unique.html", + "Fail_1": "aria_toolbar_label_unique.html", + "group": "aria_toolbar_label_unique.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Multiple elements with \"toolbar\" roles do not have unique labels", + "group": "Each element with \"toolbar\" role must have a unique label that describes its purpose" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Consider the Check Hidden Content setting that is set by the rules + // Also, consider Implicit role checking. + var landmarks = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "toolbar", true, true); + if (landmarks.length === 0 || landmarks.length === 1) { + return null; + } + var dupes = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "aria_toolbar_label_unique", null); + if (!dupes) { + dupes = AriaUtil_1.AriaUtil.findAriaLabelDupes(landmarks); + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "aria_toolbar_label_unique", dupes); + } + var myLabel = AriaUtil_1.AriaUtil.getAriaLabel(ruleContext); + var passed = myLabel !== "" && (!(myLabel in dupes) || dupes[myLabel] <= 1); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", [myLabel]); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/aria_widget_labelled.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/aria_widget_labelled.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.aria_widget_labelled = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var ARIAMapper_1 = __webpack_require__(/*! ../../v2/aria/ARIAMapper */ "./src/v2/aria/ARIAMapper.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +exports.aria_widget_labelled = { + id: "aria_widget_labelled", + context: "dom:*", + refactor: { + "Rpt_Aria_WidgetLabels_Implicit": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "aria_widget_labelled.html", + "Pass_0": "aria_widget_labelled.html", + "Fail_1": "aria_widget_labelled.html" + } + }, + messages: { + "en-US": { + "group": "Interactive component must have a programmatically associated name", + "Pass_0": "Rule Passed", + "Fail_1": "Interactive component with ARIA role '{0}' does not have a programmatically associated name" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: "m6b1q3", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + /* removed the role check role= presentation and role=none since these 2 roles are not in the list of widget type roles */ + if ((ruleContext.hasAttribute("type") && + ruleContext.getAttribute("type") === "hidden") || + (AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, "combobox") && + !(AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "textbox") || + AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "searchbox")))) { + // we need to diagnose that a combobox input textbox has a label(github issue #1104) + return null; + } + var elemRole = ARIAMapper_1.ARIAMapper.nodeToRole(ruleContext); + var tagName = ruleContext.nodeName.toLowerCase(); + // Handled by input_label_exists + var skipRoles = [ + "button", + "checkbox", + "combobox", + "listbox", + "menuitemcheckbox", + "menuitemradio", + "radio", + "searchbox", + "slider", + "spinbutton", + "switch", + "textbox", + "progressbar", + "link", + ]; + if (skipRoles.includes(elemRole)) + return null; + if (tagName === "output" || + (tagName === "input" && + ruleContext.getAttribute("type") === "file")) { + } + if (!ruleContext.hasAttribute("role")) { + // Form/input elements are checked by G41, we skip them from this rule. Github issue 449 + var skipElements = [ + "input", + "textarea", + "select", + "button", + "datalist", + "optgroup", + "option", + "keygen", + "output", + "progress", + "meter", + ]; + if (skipElements.indexOf(ruleContext.nodeName.toLowerCase()) != + -1) { + return null; + } + } + // avoid diagnosing the popup list of a combobox. + var rolesToCheck = ["listbox", "tree", "grid", "dialog"]; + for (var j = 0; j < rolesToCheck.length; j++) { + if (AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, rolesToCheck[j])) { + var comboboxes = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "combobox", true, true); + for (var k = 0; k < comboboxes.length; k++) { + var combobox = comboboxes[k]; + var aria_owns = CommonUtil_1.CommonUtil.getElementAttribute(combobox, "aria-owns"); + if (aria_owns) { + var owns = CommonUtil_1.CommonUtil.normalizeSpacing(aria_owns.trim()).split(" "); + for (var i = 0; i < owns.length; i++) { + var owned = fragment_1.FragmentUtil.getById(ruleContext, owns[i]); + if (owned === ruleContext) { + return null; + } + } + } + } + } + } + var passed = true; + var prohibited = false; + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + //get attribute roles as well as implicit roles. + var roles = AriaUtil_1.AriaUtil.getRoles(ruleContext, true); + var numWidgetsTested = 0; + var interactiveRoleTypes = ["widget", "liveRegion", "window"]; + for (var i = 0, length_1 = roles.length; passed && i < length_1; ++i) { + var pattern = designPatterns[roles[i]]; + if (pattern && + pattern.nameRequired && + pattern.roleType && + interactiveRoleTypes.includes(pattern.roleType)) { + ++numWidgetsTested; + // All widgets may have an author supplied accessible name. + // Title is legal, but don't advertise its use in documentation. + // Encourage use of aria-label, aria-labelledby or html label element. + passed = + AriaUtil_1.AriaUtil.hasAriaLabel(ruleContext) || + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "title") || + CommonUtil_1.CommonUtil.getLabelForElementHidden(ruleContext, true); + if (!passed && + pattern.nameFrom && + pattern.nameFrom.indexOf("contents") >= 0) { + // See if widget's accessible name is supplied by element's inner text + // nameFrom: ["author", "contents"] + passed = CommonUtil_1.CommonUtil.hasInnerContentOrAlt(ruleContext); + } + if (!passed) { + // check if it has implicit label, like <label><input ....>abc </label> + passed = CommonUtil_1.CommonUtil.hasImplicitLabel(ruleContext); + } + if (!passed && + ruleContext.tagName.toLowerCase() === "img" && + !ruleContext.hasAttribute("role") && + ruleContext.hasAttribute("alt")) { + passed = + DOMUtil_1.DOMUtil.cleanWhitespace(ruleContext.getAttribute("alt")).trim().length > 0; + } + if (pattern.nameFrom.indexOf("prohibited") >= 0) { + prohibited = true; + } + } + } + if (numWidgetsTested === 0) { + return null; + } + else if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", [elemRole]); + } + else { + //TODO + // if (prohibited) { + // return RuleFail("Fail_2"); + // } else { + return (0, IRule_1.RulePass)("Pass_0"); + // } + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/asciiart_alt_exists.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/asciiart_alt_exists.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.asciiart_alt_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.asciiart_alt_exists = { + id: "asciiart_alt_exists", + context: "dom:pre, dom:listing, dom:xmp, dom:plaintext", + refactor: { + "RPT_Pre_ASCIIArt": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "asciiart_alt_exists.html", + "Potential_1": "asciiart_alt_exists.html", + "group": "asciiart_alt_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that ASCII art has a text alternative", + "group": "ASCII art must have a text alternative" + } + }, + /** + * Decision in planning 9/7/23 that this rule causes more reviews that we see actual problems in content, so turn these rules off + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": eRulePolicy.VIOLATION, + "toolkitLevel": eToolkitLevel.LEVEL_ONE + }], + */ + rulesets: [], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Fix for IDWB writers. Don't trigger if content is in a code element. The code element is searched for + // in various places because of the weird way various browsers render <code><pre></pre></code. Firefox, + // HtmlUnit and Chrome all render differently. Firefox: <code></code><pre></pre> HtmlUnit: </code><pre><code></code></pre> + // See unit test CodeElementAbovePreElement.html. Don't know how RPT renders, so cover all the bases. + if (ruleContext.nodeName.toLowerCase() == "pre") { + if ((ruleContext.previousSibling && ruleContext.previousSibling.nodeName.toLowerCase() == "code") || + ruleContext.getElementsByTagName("code").length > 0 || + CommonUtil_1.CommonUtil.getAncestor(ruleContext, "code")) { + return (0, IRule_1.RulePass)("Pass_0"); + } + } + var passed = true; + var txtValue = CommonUtil_1.CommonUtil.getInnerText(ruleContext); + var nonAlphaNumericNorSpaceCount = 0; + var alphNumSameCharacterCount = 0; + var lastCharacter = ""; + // Iterate through the text content + for (var idx = 0; passed && (idx < txtValue.length); ++idx) { + var chStr = txtValue.substr(idx, 1); + // Check if it is alphanumeric or punctuation + if (/[\w!@#$%&\*().,?\[\]{}<>=":\/\\-]/.test(chStr)) { + // Detect same character sequence + if (lastCharacter == chStr) { + alphNumSameCharacterCount = alphNumSameCharacterCount + 1; + ; + } + else { + alphNumSameCharacterCount = 0; + } + } + else if (/\s/.test(chStr)) { + alphNumSameCharacterCount = 0; + } + else { + nonAlphaNumericNorSpaceCount = nonAlphaNumericNorSpaceCount + 1; + alphNumSameCharacterCount = 0; + } + lastCharacter = chStr; + // Make the decision + if (nonAlphaNumericNorSpaceCount >= 5 || alphNumSameCharacterCount >= 4) { + passed = false; + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/blink_css_review.ts" +/*!******************************************!*\ + !*** ./src/v4/rules/blink_css_review.ts ***! + \******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.blink_css_review = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.blink_css_review = { + id: "blink_css_review", + context: "dom:style, dom:*[style]", + refactor: { + "RPT_Blink_CSSTrigger1": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "group": "blink_css_review.html", + "Pass_0": "blink_css_review.html", + "Potential_1": "blink_css_review.html" + } + }, + messages: { + "en-US": { + "group": "Do not use the \"blink\" value of the 'text-decoration' property for longer than five seconds", + "Pass_0": "Rule Passed", + "Potential_1": "Check the \"blink\" value of the CSS 'text-decoration' property is not used for more than than five seconds" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "2.2.2", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var textValue = CommonUtil_1.CommonUtil.getInnerText(ruleContext); + if (ruleContext.hasAttribute('style')) { + textValue = ruleContext.getAttribute('style'); + } + var passed = textValue.toLowerCase().indexOf("text-decoration:blink") == -1; + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/blink_elem_deprecated.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/blink_elem_deprecated.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.blink_elem_deprecated = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.blink_elem_deprecated = { + id: "blink_elem_deprecated", + context: "dom:blink", + refactor: { + "WCAG20_Blink_AlwaysTrigger": { + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "blink_elem_deprecated.html", + "Fail_1": "blink_elem_deprecated.html" + } + }, + messages: { + "en-US": { + "group": "Content that blinks persistently must not be used", + "Fail_1": "Content found that blinks persistently" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "2.2.2", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + // const ruleContext = context["dom"].node as Element; + return (0, IRule_1.RuleFail)("Fail_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/blockquote_cite_exists.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/blockquote_cite_exists.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.blockquote_cite_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.blockquote_cite_exists = { + id: "blockquote_cite_exists", + context: "dom:blockquote", + refactor: { + "RPT_Blockquote_HasCite": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "blockquote_cite_exists.html", + "Potential_1": "blockquote_cite_exists.html", + "group": "blockquote_cite_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that <blockquote> should have a 'cite' attribute and not be used for indentation only", + "group": "Use <blockquote> only for quotations, not indentation" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "cite"); + if (!passed) { + var citeElems = CommonUtil_1.CommonUtil.getDocElementsByTag(ruleContext, "cite"); + passed = citeElems != null && citeElems.length > 0; + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/canvas_content_described.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/canvas_content_described.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.canvas_content_described = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.canvas_content_described = { + id: "canvas_content_described", + context: "dom:canvas", + refactor: { + "HAAC_Canvas": { + "Pass_0": "Pass_0", + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Pass_0": "canvas_content_described.html", + "Manual_1": "canvas_content_described.html", + "group": "canvas_content_described.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Manual_1": "Verify accessibility of the <canvas> element", + "group": "The <canvas> element may not be accessible" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1", "2.1.1", "4.1.2"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = ruleContext.innerHTML.trim().length > 0; + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/caption_track_exists.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/caption_track_exists.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.caption_track_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.caption_track_exists = { + id: "caption_track_exists", + context: "dom:video", + refactor: { + "HAAC_Video_HasNoTrack": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "caption_track_exists.html", + "Potential_1": "caption_track_exists.html", + "group": "caption_track_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that captions are available for any meaningful audio or provide a caption track for the <video> element", + "group": "A <video> element must have a text alternative for any meaningful audio content" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.2.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = false; + // ignore decorative video if user uses aria-hidden + if (ruleContext.getAttribute("aria-hidden") === "true") { + return null; + } + var tracks = ruleContext.getElementsByTagName("track"); + for (var i = 0; i < tracks.length; ++i) { + passed = passed || tracks[i].getAttribute("kind") === 'captions'; + } + // checks for addition of dynamic tracks + if (ruleContext.textTracks && ruleContext.textTracks.length > 0) { + for (var i = 0; i < ruleContext.textTracks.length; i++) { + passed = passed || ruleContext.textTracks[i].kind === 'captions'; + } + } + if (passed) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RulePotential)("Potential_1"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/combobox_active_descendant.ts" +/*!****************************************************!*\ + !*** ./src/v4/rules/combobox_active_descendant.ts ***! + \****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.combobox_active_descendant = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.combobox_active_descendant = { + id: "combobox_active_descendant", + context: "aria:combobox", + dependencies: ["combobox_popup_reference"], + help: { + "en-US": { + "Pass": "combobox_active_descendant.html", + "Fail_missing": "combobox_active_descendant.html", + "Fail_not_in_popup": "combobox_active_descendant.html", + "Fail_active_role_invalid": "combobox_active_descendant.html", + "Fail_active_not_selected": "combobox_active_descendant.html", + "group": "combobox_active_descendant.html" + } + }, + messages: { + "en-US": { + "Pass": "'aria-activedescendant' is used appropriately for this combobox", + "Fail_missing": "The element referenced by 'aria-activedescendant' \"{0}\" does not exist", + "Fail_not_in_popup": "The element referenced by 'aria-activedescendant' \"{0}\" does not exist within the popup referenced by 'id' \"{1}\"", + "Fail_active_role_invalid": "The 'aria-activedescendant' \"{0}\" references an element with the roles \"{1}\", which does not have a valid ARIA role of 'option', 'gridcell', 'row', or 'treeitem'", + "Fail_active_not_selected": "The 'aria-activedescendant' \"{0}\" references an element that does not have 'aria-selected' set to true", + "group": "'aria-activedescendant' must be used to define focus within the combobox popup, except when using a dialog popup" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var cache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "combobox", {}); + if (!cache) + return null; + var cachedElem = cache[context["dom"].rolePath]; + if (!cachedElem) + return null; + var popupElement = cachedElem.popupElement, popupId = cachedElem.popupId; + // If this isn't defined, the combobox is probably collapsed. A reference error is + // detected in combobox_popup_reference + if (!popupElement) + return null; + // This rule only applies if the activedescendant is specified + var activeId = ruleContext.getAttribute("aria-activedescendant"); + if (!activeId || activeId.trim().length === 0) { + return null; + } + var activeElem = fragment_1.FragmentUtil.getById(ruleContext, activeId); + if (!activeElem) { + return (0, IRule_1.RuleFail)("Fail_missing", [activeId]); + } + var found = false; + // examine the children + if (popupElement) { + var nw = new DOMWalker_1.DOMWalker(popupElement); + while (!found && nw.nextNode() && nw.node != popupElement && nw.node != popupElement.nextSibling) { + if (nw.node.nodeType === 1 && VisUtil_1.VisUtil.isNodeVisible(nw.node)) { + found = nw.elem().getAttribute("id") === activeId; + } + } + } + var retVal = []; + if (!found) { + retVal.push((0, IRule_1.RulePass)("Fail_not_in_popup", [activeId, popupId])); + } + var activeRoles = AriaUtil_1.AriaUtil.getRoles(activeElem, true); + var validRoles = ["option", "gridcell", "row", "treeitem"].filter(function (validRole) { return activeRoles.includes(validRole); }); + if (validRoles.length === 0) { + retVal.push((0, IRule_1.RuleFail)("Fail_active_role_invalid", [activeId, activeRoles.join(",")])); + } + if (activeElem.getAttribute("aria-selected") !== "true") { + retVal.push((0, IRule_1.RuleFail)("Fail_active_not_selected", [activeId])); + } + if (retVal.length === 0) { + return (0, IRule_1.RulePass)("Pass"); + } + else { + return retVal; + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/combobox_autocomplete_valid.ts" +/*!*****************************************************!*\ + !*** ./src/v4/rules/combobox_autocomplete_valid.ts ***! + \*****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.combobox_autocomplete_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.combobox_autocomplete_valid = { + id: "combobox_autocomplete_valid", + context: "aria:combobox", + dependencies: ["combobox_popup_reference"], + refactor: { + "combobox_autocomplete": { + "Pass": "Pass", + "Fail_1": "Fail_1", + "Fail_inline": "Fail_inline" + } + }, + help: { + "en-US": { + "Pass": "combobox_autocomplete_valid.html", + "Fail_1": "combobox_autocomplete_valid.html", + "Fail_inline": "combobox_autocomplete_valid.html", + "group": "combobox_autocomplete_valid.html" + } + }, + messages: { + "en-US": { + "Pass": "The combobox does not use 'aria-autocomplete' value '\"inline\"' nor does it have 'aria-autocomplete' defined within the popup", + "Fail_1": "The combobox has the 'aria-autocomplete' attribute incorrectly set on an element within the popup referenced by \"{0}\"", + "Fail_inline": "The combobox does not support an 'aria-autocomplete' attribute value set to '\"inline\"' ", + "group": "A combobox that supports autocompletion behavior must have the 'aria-autocomplete' attribute only on its text input element with a valid value; a value of '\"inline\"' is not supported" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var cache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "combobox", {}); + if (!cache) + return null; + var cachedElem = cache[context["dom"].rolePath]; + if (!cachedElem) + return null; + var popupId = cachedElem.popupId, popupElement = cachedElem.popupElement; + var retVal = []; + if (ruleContext.getAttribute("aria-autocomplete") === "inline") { + retVal.push((0, IRule_1.RuleFail)("Fail_inline")); + } + var passed = true; + // examine the children + if (popupElement && VisUtil_1.VisUtil.isNodeVisible(popupElement)) { + // if popupElement itself has "aria-autocomplete" + passed = !popupElement.hasAttribute("aria-autocomplete"); + // if any child of popupElement has "aria-autocomplete" + if (passed && popupElement.children && popupElement.children.length > 0) { + var nw = new DOMWalker_1.DOMWalker(popupElement); + while (passed && nw.nextNode()) { + if (nw.node.nodeType === 1 && VisUtil_1.VisUtil.isNodeVisible(nw.node)) { + passed = !nw.elem().hasAttribute("aria-autocomplete"); + if (nw.bEndTag && nw.node === popupElement.lastElementChild) + break; + } + } + } + } + if (!passed) { + retVal.push((0, IRule_1.RuleFail)("Fail_1", [popupId])); + } + if (retVal.length > 0) { + return retVal; + } + else { + return (0, IRule_1.RulePass)("Pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/combobox_design_valid.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/combobox_design_valid.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.combobox_design_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +function patternDetect(elem) { + // check 'explicit' role combobox and that it is not <select>. + if (elem.tagName.toLowerCase() === "select" && elem.getAttribute("role") !== "combobox") { + return "implicit"; + } + else if (elem.nodeName.toLowerCase() === "input" + && (!elem.hasAttribute("type") || elem.getAttribute("type") === "text") + && elem.hasAttribute("aria-owns") && !elem.hasAttribute("aria-controls")) { + // Looks like this is an ARIA 1.0 pattern, which the ARIA 1.2 spec says to continue to allow + return "1.0"; + } + else if (elem.nodeName.toLowerCase() !== "input" + && elem.hasAttribute("aria-owns") && !elem.hasAttribute("aria-controls")) { + // Looks like this is an ARIA 1.1 pattern, which the ARIA 1.2 spec says is now invalid + return "1.1"; + } + // Assume they're trying to do the latest, 1.2 pattern + return "1.2"; +} +exports.combobox_design_valid = { + id: "combobox_design_valid", + context: "aria:combobox", + refactor: { + "combobox_version": { + "Pass_1.0": "Pass_1.0", + "Fail_1.1": "Fail_1.1", + "Pass_1.2": "Pass_1.2" + } + }, + help: { + "en-US": { + "Pass_1.0": "combobox_design_valid.html", + "Fail_1.1": "combobox_design_valid.html", + "Pass_1.2": "combobox_design_valid.html", + "group": "combobox_design_valid.html" + } + }, + messages: { + "en-US": { + "Pass_1.0": "The combobox design pattern is detected as ARIA 1.0, which is allowed by ARIA 1.2", + "Fail_1.1": "The combobox design pattern is detected as ARIA 1.1, which is not allowed by ARIA 1.2", + "Pass_1.2": "The combobox design pattern is detected as ARIA 1.2", + "group": "The combobox design pattern must be valid for ARIA 1.2" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) { + return null; + } + var pattern = patternDetect(ruleContext); + // We don't assess native select elements here + if (pattern === "implicit") { + return null; + } + var tagName = ruleContext.tagName.toLowerCase(); + var expanded = (AriaUtil_1.AriaUtil.getAriaAttribute(ruleContext, "aria-expanded") || "").trim().toLowerCase() === "true"; + var editable = tagName === "input" && (!ruleContext.hasAttribute("type") || ruleContext.getAttribute("type").toLowerCase() === "text"); + var key = context["dom"].rolePath; + if (key) { + var cache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "combobox", {}); + if (!cache) + return null; + cache[key] = { + "inputElement": editable ? ruleContext : null, + "pattern": pattern, + "expanded": expanded + }; + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "combobox", cache); + } + else { + // No xpath? + return null; + } + if (pattern === "1.0") { + return (0, IRule_1.RulePass)("Pass_1.0"); + } + else if (pattern === "1.1") { + return (0, IRule_1.RuleFail)("Fail_1.1"); + } + else if (pattern === "1.2") { + return (0, IRule_1.RulePass)("Pass_1.2"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/combobox_focusable_elements.ts" +/*!*****************************************************!*\ + !*** ./src/v4/rules/combobox_focusable_elements.ts ***! + \*****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.combobox_focusable_elements = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.combobox_focusable_elements = { + id: "combobox_focusable_elements", + context: "aria:combobox", + dependencies: ["combobox_popup_reference"], + help: { + "en-US": { + "Pass": "combobox_focusable_elements.html", + "Fail_not_tabbable": "combobox_focusable_elements.html", + "Fail_tabbable_child": "combobox_focusable_elements.html", + "group": "combobox_focusable_elements.html" + } + }, + messages: { + "en-US": { + "Pass": "DOM focus is allowed only on the combobox element as required", + "Fail_not_tabbable": "The combobox element does not allow DOM focus as required", + "Fail_tabbable_child": "The popup of the combobox has DOM focus or has 'aria-activedescendant' defined, which is not allowed", + "group": "Tabbable focus for the combobox must be allowed only on the text input, except when using a dialog popup" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var cache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "combobox", {}); + if (!cache) + return null; + var cachedElem = cache[context["dom"].rolePath]; + if (!cachedElem) + return null; + var popupElement = cachedElem.popupElement, expanded = cachedElem.expanded; + // If this isn't defined, the combobox is probably collapsed. A reference error is + // detected in combobox_popup_reference + if (!popupElement) + return null; + var popupRole = AriaUtil_1.AriaUtil.getRoles(popupElement, true)[0]; + var retVal = []; + if (!CommonUtil_1.CommonUtil.isTabbable(ruleContext)) { + retVal.push((0, IRule_1.RuleFail)("Fail_not_tabbable")); + } + // Only makes sense to check the popup when expanded + // this does not apply to dialogs, return pass since the main element was focusable above + if (expanded === false || popupRole === "dialog") { + return (0, IRule_1.RulePass)("Pass"); + } + var passed = true; + // examine the children + if (popupElement && VisUtil_1.VisUtil.isNodeVisible(popupElement)) { + // if popupElement itself has "aria-activedescendant" + passed = !CommonUtil_1.CommonUtil.isTabbable(popupElement) && !AriaUtil_1.AriaUtil.getAriaAttribute(popupElement, "aria-activedescendant"); + ; + // if any child of popupElement has "aria-autocomplete" + if (passed && popupElement.children && popupElement.children.length > 0) { + var nw = new DOMWalker_1.DOMWalker(popupElement); + while (passed && nw.nextNode()) { + if (nw.node.nodeType === 1 && VisUtil_1.VisUtil.isNodeVisible(nw.node)) { + passed = !CommonUtil_1.CommonUtil.isTabbable(nw.node) && + !AriaUtil_1.AriaUtil.getAriaAttribute(nw.node, "aria-activedescendant"); + if (nw.bEndTag && nw.node === popupElement.lastElementChild) + break; + } + } + } + } + if (!passed) { + retVal.push((0, IRule_1.RuleFail)("Fail_tabbable_child")); + } + if (retVal.length === 0) { + return (0, IRule_1.RulePass)("Pass"); + } + else { + return retVal; + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/combobox_haspopup_valid.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/combobox_haspopup_valid.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.combobox_haspopup_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +exports.combobox_haspopup_valid = { + id: "combobox_haspopup_valid", + context: "aria:combobox", + dependencies: ["combobox_popup_reference"], + refactor: { + "combobox_haspopup": { + "Pass": "Pass", + "Fail_popup_role_invalid": "Fail_popup_role_invalid", + "Fail_combobox_popup_role_mismatch": "Fail_combobox_popup_role_mismatch" + } + }, + help: { + "en-US": { + "Pass": "combobox_haspopup_valid.html", + "Fail_popup_role_invalid": "combobox_haspopup_valid.html", + "Fail_combobox_popup_role_mismatch": "combobox_haspopup_valid.html", + "group": "combobox_haspopup_valid.html" + } + }, + messages: { + "en-US": { + "Pass": "The 'aria-controls' (ARIA 1.2) or 'aria-owns' (ARIA 1.0) appropriately references a valid popup 'id' value", + "Fail_popup_role_invalid": "The 'role' value \"{0}\" of the popup element \"{1}\" should be one of \"listbox\", \"grid\", \"tree\" or \"dialog\"", + "Fail_combobox_popup_role_mismatch": "The value of the combobox 'aria-haspopup' attribute \"{0}\" does not match the 'role' value of the popup element \"{1}\"", + "group": "The combobox attribute 'aria-haspopup' value must be appropriate for the role of the element referenced by 'aria-controls' (ARIA 1.2) or 'aria-owns' (ARIA 1.0)" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var cache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "combobox", {}); + if (!cache) + return null; + var cacheKey = context["dom"].rolePath; + var cachedElem = cache[cacheKey]; + if (!cachedElem) + return null; + var popupElement = cachedElem.popupElement, popupId = cachedElem.popupId; + // If this isn't defined, the combobox is probably collapsed. A reference error is + // detected in combobox_popup_reference + if (!popupElement) + return null; + // Check that popup role is listbox, grid, tree, or dialog and that it matches the combobox + var popupRoles = AriaUtil_1.AriaUtil.getRoles(popupElement, true); + var validRoles = ["listbox", "grid", "tree", "dialog"].filter(function (validRole) { return popupRoles.includes(validRole); }); + if (validRoles.length === 0) { + return (0, IRule_1.RuleFail)("Fail_popup_role_invalid", [popupRoles.join(","), popupId]); + } + else { + var popupRole = validRoles[0]; + var haspopupVal = ruleContext.getAttribute("aria-haspopup") || "listbox"; + // Popup role must match aria-haspopup unless popupRole is listbox, then aria-haspopup should not be defined + if (haspopupVal !== popupRole) { + if (popupRole !== "listbox" || ruleContext.hasAttribute("aria-haspopup")) { + return (0, IRule_1.RuleFail)("Fail_combobox_popup_role_mismatch", [haspopupVal, popupRole]); + } + } + } + return (0, IRule_1.RulePass)("Pass"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/combobox_popup_reference.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/combobox_popup_reference.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.combobox_popup_reference = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.combobox_popup_reference = { + id: "combobox_popup_reference", + context: "aria:combobox", + dependencies: ["combobox_design_valid"], + help: { + "en-US": { + "group": "combobox_popup_reference.html", + "Pass_1.0_expanded": "combobox_popup_reference.html", + "Pass_1.0_collapsed": "combobox_popup_reference.html", + "Pass_1.2_expanded": "combobox_popup_reference.html", + "Pass_1.2_collapsed": "combobox_popup_reference.html", + "Fail_1.0_missing_owns": "combobox_popup_reference.html", + "Fail_1.2_missing_controls": "combobox_popup_reference.html", + "Fail_1.0_popup_reference_missing": "combobox_popup_reference.html", + "Fail_1.2_popup_reference_missing": "combobox_popup_reference.html", + "Fail_combobox_expanded_hidden": "combobox_popup_reference.html", + "Fail_combobox_collapsed_visible": "combobox_popup_reference.html" + } + }, + messages: { + "en-US": { + "group": "The 'aria-controls' (for ARIA 1.2) or the 'aria-owns' (for ARIA 1.0) attribute of the expanded combobox must reference a valid popup 'id' value", + "Pass_1.0_expanded": "The combobox popup referenced by 'aria-owns' (ARIA 1.0) exists and is visible", + "Pass_1.0_collapsed": "The combobox popup in its collapsed state does not reference any visible popup as required", + "Pass_1.2_expanded": "The combobox popup referenced by 'aria-controls' (ARIA 1.2) exists and is visible", + "Pass_1.2_collapsed": "The combobox popup in its collapsed state does not reference any visible popup as required", + "Fail_1.0_missing_owns": "The 'aria-owns' attribute of the expanded combobox is missing", + "Fail_1.2_missing_controls": "The 'aria-controls' attribute of the expanded combobox is missing", + "Fail_1.0_popup_reference_missing": "The 'aria-owns' attribute \"{0}\" of the expanded combobox does not reference a valid popup 'id' value", + "Fail_1.2_popup_reference_missing": "The 'aria-controls' attribute \"{0}\" of the expanded combobox does not reference a valid popup 'id' value", + "Fail_combobox_expanded_hidden": "The combobox 'aria-expanded' attribute is true, but the combobox popup is not visible", + "Fail_combobox_collapsed_visible": "The combobox 'aria-expanded' attribute is false, but the combobox popup is visible" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [{ + "4e8ab6": { + "Pass_1.0_expanded": "fail", + "Pass_1.0_collapsed": "fail", + "Pass_1.2_expanded": "pass", + "Pass_1.2_collapsed": "pass", + "Fail_1.0_missing_owns": "inapplicable", + "Fail_1.2_missing_controls": "fail", + "Fail_1.0_popup_reference_missing": "inapplicable", + "Fail_1.2_popup_reference_missing": "fail", + "Fail_combobox_expanded_hidden": "inapplicable", + "Fail_combobox_collapsed_visible": "inapplicable" + } + }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var cache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "combobox", {}); + if (!cache) + return null; + var cacheKey = context["dom"].rolePath; + var cachedElem = cache[cacheKey]; + if (!cachedElem) + return null; + var pattern = cachedElem.pattern, expanded = cachedElem.expanded; + var popupId; + var popupElement; + if (pattern === "1.0") { + if (!ruleContext.hasAttribute("aria-owns")) { + // If the combobox isn't expanded, this attribute isn't required + return !expanded ? null : (0, IRule_1.RuleFail)("Fail_1.0_missing_owns"); + } + popupId = ruleContext.getAttribute("aria-owns"); + popupElement = fragment_1.FragmentUtil.getById(ruleContext, popupId); + if (!popupElement) { + // If the combobox isn't expanded, this attribute isn't required + return !expanded ? null : (0, IRule_1.RuleFail)("Fail_1.0_popup_reference_missing", [popupId]); + } + } + else if (pattern === "1.2") { + if (!ruleContext.hasAttribute("aria-controls")) { + // If the combobox isn't expanded, this attribute isn't required + return !expanded ? null : (0, IRule_1.RuleFail)("Fail_1.2_missing_controls"); + } + popupId = ruleContext.getAttribute("aria-controls"); + popupElement = fragment_1.FragmentUtil.getById(ruleContext, popupId); + if (!popupElement) { + // If the combobox isn't expanded, this attribute isn't required + return !expanded ? null : (0, IRule_1.RuleFail)("Fail_1.2_popup_reference_missing", [popupId]); + } + } + else { + return null; + } + // We have an element, stick it in the cache and then check its role + cachedElem.popupId = popupId; + cachedElem.popupElement = popupElement; + if (expanded && !VisUtil_1.VisUtil.isNodeVisible(popupElement)) { + return (0, IRule_1.RuleFail)("Fail_combobox_expanded_hidden"); + } + else if (!expanded && VisUtil_1.VisUtil.isNodeVisible(popupElement)) { + return (0, IRule_1.RuleFail)("Fail_combobox_collapsed_visible"); + } + if (pattern === "1.0") { + if (expanded) { + return (0, IRule_1.RulePass)("Pass_1.0_expanded"); + } + else { + return (0, IRule_1.RulePass)("Pass_1.0_collapsed"); + } + } + else { + if (expanded) { + return (0, IRule_1.RulePass)("Pass_1.2_expanded"); + } + else { + return (0, IRule_1.RulePass)("Pass_1.2_collapsed"); + } + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/debug_paths.ts" +/*!*************************************!*\ + !*** ./src/v4/rules/debug_paths.ts ***! + \*************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.debug_paths = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.debug_paths = { + id: "debug_paths", + context: "dom:*", + help: { + "en-US": { + "group": "", + "Pass_0": "" + } + }, + messages: { + "en-US": { + "group": "", + "Pass_0": "" + } + }, + rulesets: [{ + id: ["DEBUG"], + num: "1", + level: IRule_1.eRulePolicy.INFORMATION, + toolkitLevel: IRule_1.eToolkitLevel.LEVEL_FOUR + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + ruleContext.setAttribute("domPath", context["dom"].rolePath); + ruleContext.setAttribute("ariaPath", context["aria"].rolePath); + return null; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/detector_tabbable.ts" +/*!*******************************************!*\ + !*** ./src/v4/rules/detector_tabbable.ts ***! + \*******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.detector_tabbable = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.detector_tabbable = { + id: "detector_tabbable", + context: "dom:*", + help: { + "en-US": { + "group": "", + "Pass_0": "" + } + }, + messages: { + "en-US": { + "group": "", + "Pass_0": "" + } + }, + rulesets: [{ + id: ["EXTENSIONS"], + num: "1", + level: IRule_2.eRulePolicy.INFORMATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_FOUR + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (!CommonUtil_1.CommonUtil.isTabbable(ruleContext)) { + return null; + } + var hierContext = contextHierarchies.aria[contextHierarchies.aria.length - 1]; + return (0, IRule_1.RulePass)("Pass_0", [], [{ + name: hierContext.attributes.name, + role: hierContext.role, + tabindex: parseInt(ruleContext.getAttribute("tabindex") || "0") + }]); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/dir_attribute_valid.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/dir_attribute_valid.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.dir_attribute_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.dir_attribute_valid = { + id: "dir_attribute_valid", + context: "dom:*[dir]", + refactor: { + "Valerie_Elem_DirValid": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "dir_attribute_valid.html", + "Fail_1": "dir_attribute_valid.html", + "group": "dir_attribute_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Invalid value used for the 'dir' attribute", + "group": "'dir' attribute value must be \"ltr\", \"rtl\", or \"auto\"" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var dirStr = ruleContext.getAttribute("dir").toLowerCase(); + var passed = dirStr == "ltr" || dirStr == "rtl" || dirStr == "auto"; + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/download_keyboard_controllable.ts" +/*!********************************************************!*\ + !*** ./src/v4/rules/download_keyboard_controllable.ts ***! + \********************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.download_keyboard_controllable = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.download_keyboard_controllable = { + id: "download_keyboard_controllable", + context: "dom:a[href],dom:area[href]", + refactor: { + "HAAC_Media_DocumentTrigger2": { + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Manual_1": "download_keyboard_controllable.html", + "group": "download_keyboard_controllable.html" + } + }, + messages: { + "en-US": { + "Manual_1": "Verify that the file download mechanism does not cause a keyboard trap", + "group": "File download mechanisms should be keyboard-operable and preserve page focus location" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.2"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var href = ruleContext.getAttribute("href"); + var ext = CommonUtil_1.CommonUtil.getFileExt(href); + var passed = ![".docx", ".doc", ".pdf", ".odt"].includes(ext); + if (passed) + return null; + if (!passed) + return (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/draggable_alternative_exists.ts" +/*!******************************************************!*\ + !*** ./src/v4/rules/draggable_alternative_exists.ts ***! + \******************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.draggable_alternative_exists = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.draggable_alternative_exists = { + id: "draggable_alternative_exists", + context: "dom:*[draggable]", + dependencies: [], + help: { + "en-US": { + "group": "draggable_alternative_exists.html", + // "pass_alternative": "draggable_alternative_exists.html", + "pass_undraggable": "draggable_alternative_exists.html", + "potential_alternative": "draggable_alternative_exists.html" + } + }, + messages: { + "en-US": { + "group": "A draggable element must have a \"single pointer\" alternative", + // "pass_alternative": "The draggable element \"{0}\" has a \"single pointer\" alternative", + "pass_undraggable": "The element \"{0}\" is not draggable", + "potential_alternative": "Ensure the draggable element \"{0}\" has a \"single pointer\" alternative" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_2"], + num: ["2.5.7"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLocaleLowerCase(); + //ignore certain elements + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["pre", "code", "script", "meta"]) !== null + || nodeName === "body" || nodeName === "html") + return null; + if (ruleContext.getAttribute("draggable") === 'true') + return (0, IRule_1.RulePotential)("potential_alternative", [nodeName]); + else if (ruleContext.getAttribute("draggable") === 'false') + return (0, IRule_1.RulePass)("pass_undraggable", [nodeName]); + else + return null; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/element_accesskey_labelled.ts" +/*!****************************************************!*\ + !*** ./src/v4/rules/element_accesskey_labelled.ts ***! + \****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_accesskey_labelled = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +exports.element_accesskey_labelled = { + id: "element_accesskey_labelled", + context: "dom:*[accesskey]", + refactor: { + "HAAC_Accesskey_NeedLabel": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "element_accesskey_labelled.html", + "Potential_1": "element_accesskey_labelled.html", + "group": "element_accesskey_labelled.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "The element with an assigned 'accesskey' attribute does not have an associated label", + "group": "An element with an assigned 'accesskey' attribute must have an associated label" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.3.2"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip if the element is tabbable, it's covered by other rules + if (CommonUtil_1.CommonUtil.isTabbable(ruleContext)) + return; + var roles = AriaUtil_1.AriaUtil.getRoles(ruleContext, true); + //skip the native element, mostly text elements + if (!roles || roles.length === 0) + return; + var patterns = ARIADefinitions_1.ARIADefinitions.designPatterns[roles[0]]; + if (!patterns || !patterns.nameFrom) + return; + // ignore if accessble name is required (checked in other rules) or prohibited (text element) + if (patterns.nameRequired || !patterns.nameFrom || patterns.nameFrom.includes("prohibited")) + return; + //special case: legend, as a child of a fieldset, delegate the accesskey command to the field of the fieldset which is covered by other rules + if (ruleContext.parentElement && ruleContext.parentElement.nodeName.toLowerCase() === 'fieldset') + return; + // check if accessible name exists + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + if (pair && pair.name && pair.name.trim().length > 0) + //if (ARIAMapper.computeName(ruleContext).trim().length > 0) + return (0, IRule_1.RulePass)("Pass_0"); + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/element_accesskey_unique.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/element_accesskey_unique.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_accesskey_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +exports.element_accesskey_unique = { + id: "element_accesskey_unique", + context: "dom:*[accesskey]", + refactor: { + "WCAG20_Elem_UniqueAccessKey": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "element_accesskey_unique.html", + "Fail_1": "element_accesskey_unique.html", + "group": "element_accesskey_unique.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "'accesskey' attribute value on the element is not unique", + "group": "'accesskey' attribute values on each element must be unique for the page" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["HTML"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var map = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "element_accesskey_unique", {}); + var key = ruleContext.getAttribute("accesskey"); + var passed = !(key in map); + map[key] = true; + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/element_attribute_deprecated.ts" +/*!******************************************************!*\ + !*** ./src/v4/rules/element_attribute_deprecated.ts ***! + \******************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_attribute_deprecated = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var DEPRECATED_ELEMENTS = [ + /** original */ + "applet", "basefont", "center", "dir", "font", "isindex", "listing", + "plaintext", "spacer", "s", "strike", "u", "xmp", + /** added from https://dev.w3.org/html5/pf-summary/obsolete.html */ + "acronym", "frame", "frameset", "noframes", "noembed", "big", "blink", "marquee", "tt", +]; +var DEPRECATED_HTML_GLOBAL_ATTRIBUTES = [ + /** original */ + "align", "link", "archive", "background", "bgcolor", "clear", "code", "color", + "compact", "face", "hspace", "language", "link", "noshade", "nowrap", "object", + "prompt", "start", "text", "version", "vlink", "vspace" +]; +var DEPRECATED_ELEMENT_ATTRIBUTES = { + /** original */ + "td": ["height", "width", "abbr", "axis", "char", "charoff", "height", "nowrap", "valign", "width", "align", "bgcolor"], + "th": ["height", "width", "abbr", "axis", "charoff", "height", "bgcolor", "align", "nowrap", "char", "valign", "width"], + "li": ["type", "value", "type"], + "ul": ["type", "compact"], + "pre": ["width"], + /** added from https://dev.w3.org/html5/pf-summary/obsolete.html */ + "meta": ["http-equiv"], + "a": ["charset", "coords", "shape", "rev", "scheme"], + "link": ["rev", "charset", "target"], + "img": ["name", "longdesc", "align", "hspace", "vspace", "border"], + "area": ["nohref"], + "head": ["profile"], + "html": ["version"], + "iframe": ["longdesc", "align", "frameborder", "marginheight", "marginwidth", "scrolling"], + "object": ["archive", "code", "codebase", "codetype", "declare", "standby", "align", "hspace", "vspace", "border"], + "param": ["type", "valuetype"], + "script": ["language"], + "body": ["alink", "background", "bgcolor", "link", "text", "vlink"], + "br": ["clear"], + "caption": ["align"], + "col": ["align", "char", "charoff", "valign", "width"], + "div": ["align"], + "dl": ["compact"], + "hr": ["align", "noshade", "size", "width", "align"], + "h2": ["align"], + "h3": ["align"], + "h4": ["align"], + "h5": ["align"], + "h6": ["align"], + "input": ["align", "usemap"], + "legend": ["align"], + "menu": ["compact"], + "ol": ["compact", "type", "type"], + "p": ["align"], + "table": ["bgcolor", "cellpadding", "cellspacing", "frame", "rules", "width", "align"], + "tbody": ["align", "char", "valign", "charoff"], + "tfoot": ["align", "charoff", "char", "valign"], + "thead": ["char", "charoff", "valign", "align"], + "tr": ["align", "bgcolor", "char", "charoff", "valign"] +}; +function arrayToContextStr(obj, type) { + var str = ""; + for (var _i = 0, obj_1 = obj; _i < obj_1.length; _i++) { + var prop = obj_1[_i]; + if (str !== '' && !str.endsWith(', ')) + str += ", "; + if (type === 'HTML_ELEMENTS') + str += 'dom:' + prop; + else if (type === 'HTML_ATTRIBUTES') + str += 'dom:*[' + prop + "]"; + } + return str; +} +function objToContextStr(obj, type) { + var str = ""; + for (var prop in obj) { + if (str !== '' && !str.endsWith(', ')) + str += ", "; + if (type === 'HTML_ELEMENT_ATTRIBUTES') { + for (var _i = 0, _a = obj[prop]; _i < _a.length; _i++) { + var item = _a[_i]; + if (str !== '' && !str.endsWith(", ")) + str += ", "; + str += 'dom:' + prop + '[' + item + ']'; + } + } + } + return str; +} +exports.element_attribute_deprecated = { + id: "element_attribute_deprecated", + context: "dom:applet, dom:basefont, dom:center, dom:dir, dom:font, dom:isindex, dom:listing, dom:menu, dom:plaintext, dom:spacer, dom:s, dom:strike, dom:u, dom:xmp, dom:acronym, dom:frame, dom:frameset, dom:noframes, dom:noembed, dom:big, dom:blink, dom:marquee, dom:ttNaNdom:*[align], dom:*[link], dom:*[archive], dom:*[background], dom:*[bgcolor], dom:*[clear], dom:*[code], dom:*[color], dom:*[compact], dom:*[face], dom:*[hspace], dom:*[language], dom:*[link], dom:*[noshade], dom:*[nowrap], dom:*[object], dom:*[prompt], dom:*[start], dom:*[text], dom:*[version], dom:*[vlink], dom:*[vspace]NaNdom:td[height], dom:td[width], dom:td[abbr], dom:td[axis], dom:td[char], dom:td[charoff], dom:td[height], dom:td[nowrap], dom:td[valign], dom:td[width], dom:td[align], dom:td[bgcolor], dom:th[height], dom:th[width], dom:th[abbr], dom:th[axis], dom:th[charoff], dom:th[height], dom:th[bgcolor], dom:th[align], dom:th[nowrap], dom:th[char], dom:th[valign], dom:th[width], dom:li[type], dom:li[value], dom:li[type], dom:ul[type], dom:ul[compact], dom:pre[width], dom:meta[http-equiv], dom:a[charset], dom:a[coords], dom:a[shape], dom:a[rev], dom:a[scheme], dom:link[rev], dom:link[charset], dom:link[target], dom:img[name], dom:img[longdesc], dom:img[align], dom:img[hspace], dom:img[vspace], dom:img[border], dom:area[nohref], dom:head[profile], dom:html[version], dom:iframe[longdesc], dom:iframe[align], dom:iframe[frameborder], dom:iframe[marginheight], dom:iframe[marginwidth], dom:iframe[scrolling], dom:object[archive], dom:object[code], dom:object[codebase], dom:object[codetype], dom:object[declare], dom:object[standby], dom:object[align], dom:object[hspace], dom:object[vspace], dom:object[border], dom:param[type], dom:param[valuetype], dom:script[language], dom:body[alink], dom:body[background], dom:body[bgcolor], dom:body[link], dom:body[text], dom:body[vlink], dom:br[clear], dom:caption[align], dom:col[align], dom:col[char], dom:col[charoff], dom:col[valign], dom:col[width], dom:div[align], dom:dl[compact], dom:hr[align], dom:hr[noshade], dom:hr[size], dom:hr[width], dom:hr[align], dom:h2[align], dom:h3[align], dom:h4[align], dom:h5[align], dom:h6[align], dom:input[align], dom:input[usemap], dom:legend[align], dom:menu[compact], dom:ol[compact], dom:ol[type], dom:ol[type], dom:p[align], dom:table[bgcolor], dom:table[cellpadding], dom:table[cellspacing], dom:table[frame], dom:table[rules], dom:table[width], dom:table[align], dom:tbody[align], dom:tbody[char], dom:tbody[valign], dom:tbody[charoff], dom:tfoot[align], dom:tfoot[charoff], dom:tfoot[char], dom:tfoot[valign], dom:thead[char], dom:thead[charoff], dom:thead[valign], dom:thead[align], dom:tr[align], dom:tr[bgcolor], dom:tr[char], dom:tr[charoff], dom:tr[valign]", + help: { + "en-US": { + "pass": "element_attribute_deprecated.html", + "fail_elem": "element_attribute_deprecated.html", + "fail_attr": "element_attribute_deprecated.html", + "fail_elem_attr": "element_attribute_deprecated.html", + "group": "element_attribute_deprecated.html" + } + }, + messages: { + "en-US": { + "pass": "Rule Passed", + "fail_elem": "The <{0}> element is deprecated in HTML 5", + "fail_attr": "The HTML attribute(s) \"{0}\" is deprecated in HTML 5", + "fail_elem_attr": "The HTML attribute(s) \"{0}\" is deprecated for the <{1}> element in HTML 5", + "group": "Avoid use of obsolete features if possible" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["HTML"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // HTMLUnit auto adds a tbody[align=left] to tables if tbody is missing! + if (ruleContext.nodeName.toLowerCase() === "tbody" && ruleContext.hasAttribute("align")) { + return (0, IRule_1.RulePass)("pass"); + } + if (ruleContext.nodeName.includes("-")) { + // This is a webcomponent element, HTML doesn't define what's deprecated + return null; + } + var nodeName = ruleContext.nodeName.toLowerCase(); + var ret = []; + // check if it's a deprecated element + if (DEPRECATED_ELEMENTS.includes(nodeName)) { + return (0, IRule_1.RuleFail)("fail_elem", [nodeName]); + } + // check if it's a deprecated HTML global attribute + var attrs = ruleContext.getAttributeNames(); + var violations = ''; + for (var _i = 0, attrs_1 = attrs; _i < attrs_1.length; _i++) { + var attr = attrs_1[_i]; + if (DEPRECATED_HTML_GLOBAL_ATTRIBUTES.includes(attr)) { + if (violations !== '') + violations += ', '; + violations += attr; + } + } + if (violations !== '') { + return (0, IRule_1.RuleFail)("fail_attr", [violations]); + } + // check if it's a deprecated HTML element & attribute + violations = ''; + if (nodeName in DEPRECATED_ELEMENT_ATTRIBUTES) { + for (var _a = 0, attrs_2 = attrs; _a < attrs_2.length; _a++) { + var attr = attrs_2[_a]; + if (DEPRECATED_ELEMENT_ATTRIBUTES[nodeName] && DEPRECATED_ELEMENT_ATTRIBUTES[nodeName].includes(attr)) { + if (violations !== '') + violations += ', '; + violations += attr; + } + } + if (violations !== '') { + return (0, IRule_1.RuleFail)("fail_elem_attr", [violations, nodeName]); + } + } + return (0, IRule_1.RulePass)("pass"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/element_id_unique.ts" +/*!*******************************************!*\ + !*** ./src/v4/rules/element_id_unique.ts ***! + \*******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_id_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +exports.element_id_unique = { + id: "element_id_unique", + context: "dom:*[id]", + refactor: { + "RPT_Elem_UniqueId": { + "Pass_0": "pass", + "Fail_1": "potential_empty", + "Fail_2": "potential_in_use" + } + }, + help: { + "en-US": { + "group": "element_id_unique.html", + "pass": "element_id_unique.html", + "potential_empty": "element_id_unique.html", + "potential_in_use": "element_id_unique.html" + } + }, + messages: { + "en-US": { + "group": "Element 'id' attribute values must be unique within a document", + "pass": "Rule Passed", + "potential_empty": "The <{0}> element has the id \"{1}\" that is empty", + "potential_in_use": "The <{0}> element has the id \"{1}\" that is already in use" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["HTML"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [{ + "3ea0c8": { + "pass": "pass", + "potential_empty": "pass", + "potential_in_use": "fail" + } + }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var id = ruleContext.getAttribute("id"); + // In the case that id is empty we should trigger a violation right away with out checking + // for uniqueness. + if (id === "") { + //return new ValidationResult(false, [ruleContext], '', '', [ruleContext.nodeName.toLowerCase(), id]); + return (0, IRule_1.RulePotential)("potential_empty", [ruleContext.nodeName.toLowerCase(), id]); + } + var element = fragment_1.FragmentUtil.getById(ruleContext, id); + var passed = element === ruleContext; + //return new ValidationResult(passed, [ruleContext], '', '', passed == true ? [] : [ruleContext.nodeName.toLowerCase(), id]); + if (!passed) { + return (0, IRule_1.RulePotential)("potential_in_use", [ruleContext.nodeName.toLowerCase(), id]); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/element_lang_valid.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/element_lang_valid.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_lang_valid = exports.html_lang_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var lang_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/lang */ "./src/v2/checker/accessibility/util/lang.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var validateLang = function (context) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (ruleContext.hasAttribute("lang")) { + if (nodeName !== "html" && ruleContext.getAttribute("lang") === "") { + // It's okay to have a lang="" if not on html + } + else { + var langStr = ruleContext.getAttribute("lang"); + if (!lang_1.LangUtil.validPrimaryLang(langStr)) { + return 1; + } + if (!lang_1.LangUtil.isBcp47(langStr)) { + return 2; + } + } + } + if (ruleContext.hasAttribute("xml:lang")) { + if (nodeName !== "html" && ruleContext.getAttribute("xml:lang") === "") { + // It's okay to have a lang="" if not on html + } + else { + var langStr = ruleContext.getAttribute("xml:lang"); + if (!lang_1.LangUtil.validPrimaryLang(langStr)) { + return 3; + } + if (!lang_1.LangUtil.isBcp47(langStr)) { + return 4; + } + } + } + return 0; +}; +exports.html_lang_valid = { + id: "html_lang_valid", + context: "dom:html[lang], dom:html[xml:lang]", + help: { + "en-US": { + "Pass_0": "html_lang_valid.html", + "Fail_1": "html_lang_valid.html", + "Fail_2": "html_lang_valid.html", + "Fail_3": "html_lang_valid.html", + "Fail_4": "html_lang_valid.html", + "group": "html_lang_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Lang has a valid primary lang and conforms to BCP 47", + "Fail_1": "Specified 'lang' attribute does not include a valid primary language", + "Fail_2": "Specified 'lang' attribute does not conform to BCP 47", + "Fail_3": "Specified 'xml:lang' attribute does not include a valid primary language", + "Fail_4": "Specified 'xml:lang' attribute does not conform to BCP 47", + "group": "The default human language of the page must be valid and specified in accordance with BCP 47" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [{ + "b5c3f8": { + "Pass_0": "pass", + "Fail_1": "fail", + "Fail_2": "inapplicable", + "Fail_3": "inapplicable", + "Fail_4": "inapplicable" + }, + "bf051a": { + "Pass_0": "pass", + "Fail_1": "fail", + "Fail_2": "pass", + "Fail_3": "fail", + "Fail_4": "inapplicable" + }, + // TODO: ACT: Mismatch because they don't check the html element in the same rule + // "de46e4": { + // "Pass_0": "pass", + // "Fail_1": "fail", + // "Fail_2": "pass", + // "Fail_3": "inapplicable", + // "Fail_4": "inapplicable" + // } + }], + run: function (context, options, contextHierarchies) { + var reasonCode = validateLang(context); + // This is done here instead of in validateLang so that the genHelp code will pick it up + var retArr = [ + (0, IRule_1.RulePass)("Pass_0"), + (0, IRule_1.RuleFail)("Fail_1"), + (0, IRule_1.RuleFail)("Fail_2"), + (0, IRule_1.RuleFail)("Fail_3"), + (0, IRule_1.RuleFail)("Fail_4") + ]; + return retArr[reasonCode]; + } +}; +exports.element_lang_valid = { + id: "element_lang_valid", + context: "dom:*[lang], dom:*[xml:lang]", + help: { + "en-US": { + "Pass_0": "element_lang_valid.html", + "Fail_1": "element_lang_valid.html", + "Fail_2": "element_lang_valid.html", + "Fail_3": "element_lang_valid.html", + "Fail_4": "element_lang_valid.html", + "group": "element_lang_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Lang has a valid primary lang and conforms to BCP 47", + "Fail_1": "Specified 'lang' attribute does not include a valid primary language", + "Fail_2": "Specified 'lang' attribute does not conform to BCP 47", + "Fail_3": "Specified 'xml:lang' attribute does not include a valid primary language", + "Fail_4": "Specified 'xml:lang' attribute does not conform to BCP 47", + "group": "The change in language of specific content must be valid and specified in accordance with BCP 47" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [{ + // "b5c3f8": { + // "Pass_0": "pass", + // "Fail_1": "fail", + // "Fail_2": "inapplicable", + // "Fail_3": "inapplicable", + // "Fail_4": "inapplicable" + // }, + // "bf051a": { + // "Pass_0": "pass", + // "Fail_1": "fail", + // "Fail_2": "pass", + // "Fail_3": "fail", + // "Fail_4": "inapplicable" + // }, + // TODO: ACT: Mismatch because they don't check the html element in the same rule + "de46e4": { + "Pass_0": "pass", + "Fail_1": "fail", + "Fail_2": "pass", + "Fail_3": "inapplicable", + "Fail_4": "inapplicable" + } + }], + run: function (context, options, contextHierarchies) { + // If it's the HTML node, that's handled by html_lang_valid + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (nodeName === "html") + return null; + var reasonCode = validateLang(context); + // This is done here instead of in validateLang so that the genHelp code will pick it up + var retArr = [ + (0, IRule_1.RulePass)("Pass_0"), + (0, IRule_1.RuleFail)("Fail_1"), + (0, IRule_1.RuleFail)("Fail_2"), + (0, IRule_1.RuleFail)("Fail_3"), + (0, IRule_1.RuleFail)("Fail_4") + ]; + var retVal = retArr[reasonCode]; + if (retVal.value[1] !== IRule_1.eRuleConfidence.PASS) { + // Ensure that there's actually content of this element - skip subtrees that have other lang attributes + var hasContent = false; + if (ruleContext.firstChild !== null) { + var nw = new DOMWalker_1.DOMWalker(ruleContext, false, ruleContext, true); + while (!hasContent && nw.nextNode()) { + // Skip hidden + if (nw.node.nodeType === 1) { + var element = nw.node; + if (!VisUtil_1.VisUtil.isNodeVisible(element) || element.hasAttribute("lang")) { + nw.bEndTag = true; + } + else { + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(element); + hasContent = hasContent + || element.nodeName.toLowerCase() === "img" && (pair && pair.name && pair.name.trim().length > 0) /**ARIAMapper.computeName(element).trim().length > 0*/; + } + } + else { + hasContent = hasContent + || nw.node.nodeType === 3 && nw.node.nodeValue.trim().length > 0; + } + } + } + if (!hasContent) + return null; + } + return retVal; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/element_mouseevent_keyboard.ts" +/*!*****************************************************!*\ + !*** ./src/v4/rules/element_mouseevent_keyboard.ts ***! + \*****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_mouseevent_keyboard = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.element_mouseevent_keyboard = { + id: "element_mouseevent_keyboard", + context: "dom:*[ondblclick], dom:*[onmousemove], dom:*[onmousedown], dom:*[onmouseup], dom:*[onmouseover], dom:*[onmouseout], dom:*[onclick]", + refactor: { + "RPT_Elem_EventMouseAndKey": { + "Pass_0": "Pass_0", + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Pass_0": "element_mouseevent_keyboard.html", + "Manual_1": "element_mouseevent_keyboard.html", + "group": "element_mouseevent_keyboard.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Manual_1": "Confirm the <{0}> element with mouse event handler(s) '{1}' has a corresponding keyboard handler(s)", + "group": "All interactive content with mouse event handlers must have equivalent keyboard access" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + var passed = ruleContext.hasAttribute("href") || + (!ruleContext.hasAttribute("ondblclick") && + !ruleContext.hasAttribute("onmousemove") && + (!ruleContext.hasAttribute("onmousedown") || ruleContext.hasAttribute("onkeydown")) && + (!ruleContext.hasAttribute("onmouseup") || ruleContext.hasAttribute("onkeyup")) && + (!ruleContext.hasAttribute("onmouseover") || ruleContext.hasAttribute("onfocus")) && + (!ruleContext.hasAttribute("onmouseout") || ruleContext.hasAttribute("onblur")) && + (!ruleContext.hasAttribute("onclick") || ruleContext.hasAttribute("onkeypress") || + nodeName == "a" || nodeName == "button")); + var failedMouseEvents = new Array(); + if (!passed) { + //store and display event name and node name in the tokens + if (ruleContext.hasAttribute("ondblclick")) { + failedMouseEvents.push("ondblclick"); + } + if (ruleContext.hasAttribute("onmousemove")) { + failedMouseEvents.push("onmousemove"); + } + if (ruleContext.hasAttribute("onmousedown") && !ruleContext.hasAttribute("onkeydown")) { + failedMouseEvents.push("onmousedown"); + } + if (ruleContext.hasAttribute("onmouseup") && !ruleContext.hasAttribute("onkeyup")) { + failedMouseEvents.push("onmouseup"); + } + if (ruleContext.hasAttribute("onmouseover") && !ruleContext.hasAttribute("onfocus")) { + failedMouseEvents.push("onmouseover"); + } + if (ruleContext.hasAttribute("onmouseout") && !ruleContext.hasAttribute("onblur")) { + failedMouseEvents.push("onmouseout"); + } + if (ruleContext.hasAttribute("onclick") && !ruleContext.hasAttribute("onkeypress")) { + if (!(nodeName == "a" || nodeName == "button")) + failedMouseEvents.push("onclick"); + } + } + return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RuleManual)("Manual_1", [nodeName, failedMouseEvents.join(", ")]); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/element_orientation_unlocked.ts" +/*!******************************************************!*\ + !*** ./src/v4/rules/element_orientation_unlocked.ts ***! + \******************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_orientation_unlocked = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CSSUtil_1 = __webpack_require__(/*! ../util/CSSUtil */ "./src/v4/util/CSSUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.element_orientation_unlocked = { + id: "element_orientation_unlocked", + context: "dom:*", + help: { + "en-US": { + "pass": "element_orientation_unlocked.html", + "fail_locked": "element_orientation_unlocked.html", + "group": "element_orientation_unlocked.html" + } + }, + messages: { + "en-US": { + "pass": "The element is not restricted to either landscape or portrait orientation using CSS transform property", + "fail_locked": "The element <{0}> is restricted to either landscape or portrait orientation using CSS transform property", + "group": "Elements should not be restricted to either landscape or portrait orientation using CSS transform property" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.4"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: ['b33eff'], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip invisible element + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext)) + return null; + //skip elements + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["script", "meta", "title"])) + return null; + var nodeName = ruleContext.nodeName.toLowerCase(); + // cache the orientation result for all the elements in the page + var doc = fragment_1.FragmentUtil.getOwnerFragment(ruleContext); + var orientationTransforms = CacheUtil_1.CacheUtil.getCache(doc, "RPTUtil_MEDIA_ORIENTATION_TRANSFROM", null); + if (!orientationTransforms) { + orientationTransforms = CSSUtil_1.CSSUtil.getMediaOrientationTransform(doc); + CacheUtil_1.CacheUtil.setCache(doc, "RPTUtil_MEDIA_ORIENTATION_TRANSFROM", orientationTransforms); + } + // find if the element matches orientation selector(s) + var media_transforms = []; + Object.keys(orientationTransforms).forEach(function (key) { + Object.keys(orientationTransforms[key]).forEach(function (tag) { + if (Object.keys(orientationTransforms[key][tag]).length > 0 && CSSUtil_1.CSSUtil.selectorMatchesElem(ruleContext, tag)) { + if (orientationTransforms[key][tag].transform) + media_transforms.push(orientationTransforms[key][tag].transform); + else + media_transforms.push(orientationTransforms[key][tag]); + } + }); + }); + // no match, the element is not in media orientation transform + if (media_transforms.length === 0) + return null; + var ret = []; + var _loop_1 = function (i) { + var media_transform = media_transforms[i]; + if (typeof media_transform === 'object') + for (var key in media_transform) + media_transform = key + "(" + media_transform[key] + ")"; + var containsRotation = false; + ['rotate', 'rotate3d', 'rotateZ', 'matrix', 'matrix3d'].forEach(function (rotation) { + if (media_transform.includes(rotation)) + containsRotation = true; + }); + // no rotation transform, skip + if (!containsRotation) + return "continue"; + var degree = CSSUtil_1.CSSUtil.getRotationDegree(media_transform); + // no or 360n degree rotation + if (degree === 0) { + ret.push((0, IRule_1.RulePass)("pass")); + return "continue"; + } + /** + * calculate the original page rotation transformation, example + * html { transform: rotate(2.5deg); } + */ + var definedStyle = CSSUtil_1.CSSUtil.getDefinedStyles(ruleContext, ["transform"]); + /** + * compensate the media orientation with the page orientation + */ + if (definedStyle['transform']) { + var page_degree = CSSUtil_1.CSSUtil.getRotationDegree(definedStyle['transform']); + // rotate is additive + degree += page_degree; + } + // When degree is 1 turn (360 degree), it is not considered an orientation lock + // allow 1 degree floating range for the right angle + if (Math.abs(degree - 360) % 360 > 1) + ret.push((0, IRule_1.RuleFail)("fail_locked", [nodeName])); + else + ret.push((0, IRule_1.RulePass)("pass")); + }; + for (var i = 0; i < media_transforms.length; i++) { + _loop_1(i); + } + if (ret.length > 0) + return ret; + return null; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/element_scrollable_tabbable.ts" +/*!*****************************************************!*\ + !*** ./src/v4/rules/element_scrollable_tabbable.ts ***! + \*****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_scrollable_tabbable = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +exports.element_scrollable_tabbable = { + id: "element_scrollable_tabbable", + context: "dom:*", + dependencies: [], + help: { + "en-US": { + "group": "element_scrollable_tabbable.html", + "pass_tabbable": "element_scrollable_tabbable.html", + "pass_interactive": "element_scrollable_tabbable.html", + "fail_scrollable": "element_scrollable_tabbable.html" + } + }, + messages: { + "en-US": { + "group": "Scrollable elements should be tabbable or contain tabbable content", + "pass_tabbable": "The scrollable element is tabbable", + "pass_interactive": "The scrollable element has tabbable content", + "fail_scrollable": "The scrollable element <{0}> with non-interactive content is not tabbable" + } + }, + /** + * deprecated on 6/10/2025 due to Browser support for auto-focus of a scrollable element + * rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + num: ["2.1.1"], + level: eRulePolicy.VIOLATION, + toolkitLevel: eToolkitLevel.LEVEL_ONE + }],*/ + rulesets: [], + act: ["0ssw9k"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip elements + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["iframe", "svg", "script", "meta", "style"])) + return null; + //skip if no visible content + if (!CommonUtil_1.CommonUtil.hasInnerContent(ruleContext)) + return null; + // ignore if the element's navigation is controlled or owned by another element + if (AriaUtil_1.AriaUtil.isNavigationOwnedOrControlled(ruleContext)) + return null; + // ignore if the element is not scrollable or content withouting needing a scroll + if (!VisUtil_1.VisUtil.isElementScrollable(ruleContext)) + return null; + // pass if element is tabbable + if (CommonUtil_1.CommonUtil.isTabbable(ruleContext)) + return (0, IRule_1.RulePass)("pass_tabbable"); + // check if element content is tabbable + var count = CommonUtil_1.CommonUtil.getTabbableChildren(ruleContext); + if (count > 0) + return (0, IRule_1.RulePass)("pass_interactive"); + // ignore in Firefox if no tabindex at all (not tested in embedded or any simulator) + if (!ruleContext.hasAttribute("tabindex") && navigator.userAgent.indexOf("Firefox") > -1) + return null; + return (0, IRule_1.RuleFail)("fail_scrollable", [ruleContext.nodeName.toLowerCase()]); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/element_tabbable_role_valid.ts" +/*!*****************************************************!*\ + !*** ./src/v4/rules/element_tabbable_role_valid.ts ***! + \*****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_tabbable_role_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.element_tabbable_role_valid = { + id: "element_tabbable_role_valid", + context: "dom:*", + help: { + "en-US": { + "pass": "element_tabbable_role_valid.html", + "fail_invalid_role": "element_tabbable_role_valid.html", + "fail_no_valid_role": "element_tabbable_role_valid.html", + "group": "element_tabbable_role_valid.html" + } + }, + messages: { + "en-US": { + "pass": "The tabbable element has a widget role", + "fail_invalid_role": "The tabbable element's role '{0}' is not a widget role", + "fail_no_valid_role": "The tabbable element does not have a valid widget role", + "group": "A tabbable element must have a valid widget role" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }, + { + "id": ["WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext) || VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLowerCase(); + // if the element is tabbable by default with or without tabindex, let the other rules (such as widget_tabbable_single) to handle it + if (nodeName in CommonUtil_1.CommonUtil.tabTagMap) { + var value = CommonUtil_1.CommonUtil.tabTagMap[nodeName]; + if (typeof (value) === "function") { + value = value(ruleContext); + } + if (value) + return null; + } + // handle the case: no tabindex or tabindex < 0 + if (!ruleContext.hasAttribute("tabindex") || parseInt(ruleContext.getAttribute("tabindex")) < 0) + return null; + // ignore if the element's navigation is controlled by another element, such as combobox + if (AriaUtil_1.AriaUtil.isNavigationOwnedOrControlled(ruleContext)) + return null; + // ignore if the element is scrollable + if (VisUtil_1.VisUtil.isElementScrollable(ruleContext)) + return null; + // elements whose roles allow no descendants that are interactive or with a tabindex >= 0 + // this case should be handled in widget_tabbable_single and aria_child_tabbable + var roles_no_interactive_child = ["button", "checkbox", "img", "link", "menuitem", "menuitemcheckbox", "menuitemradio", + "option", "radio", "switch", "tab"]; + var parent = DOMWalker_1.DOMWalker.parentNode(ruleContext); + var parent_role = AriaUtil_1.AriaUtil.getResolvedRole(parent); + // ignore if the parent role is in roles_no_interactive_child + if (roles_no_interactive_child.includes(parent_role)) + return null; + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + if (!role) + return (0, IRule_1.RuleFail)("fail_no_valid_role"); + // ignore 'application' role that contains one or more focusable elements that do not follow a standard interaction pattern supported by a widget role:https://www.w3.org/TR/2023/PR-WAI-ARIA-1.2-20230328/#application + if (role === "application") + return null; + // handle the case: tabindex >= 0 to examine whether a widget role is setup or not + // pass if one of the roles is a widget type + // Row is weird. It's structure, but can also be widget + // Focusable separators are widgets + if (role === "row" || role === "separator" || ARIADefinitions_1.ARIADefinitions.designPatterns[role].roleType === 'widget') { + return (0, IRule_1.RulePass)("pass"); + } + return (0, IRule_1.RuleFail)("fail_invalid_role", [role]); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/element_tabbable_unobscured.ts" +/*!*****************************************************!*\ + !*** ./src/v4/rules/element_tabbable_unobscured.ts ***! + \*****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_tabbable_unobscured = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var DOMMapper_1 = __webpack_require__(/*! ../../v2/dom/DOMMapper */ "./src/v2/dom/DOMMapper.ts"); +var ColorUtil_1 = __webpack_require__(/*! ../util/ColorUtil */ "./src/v4/util/ColorUtil.ts"); +exports.element_tabbable_unobscured = { + id: "element_tabbable_unobscured", + context: "dom:*", + dependencies: [], + help: { + "en-US": { + "group": "element_tabbable_unobscured.html", + "pass": "element_tabbable_unobscured.html", + "potential_obscured": "element_tabbable_unobscured.html" + } + }, + messages: { + "en-US": { + "group": "When an element receives focus, it is not entirely covered by other content", + "pass": "The element is not entirely covered by other content", + "potential_obscured": "Confirm that when the element receives focus, it is not covered or, if covered by user action, can be uncovered without moving focus" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_2"], + num: ["2.4.11"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Early exit: check visibility and tabbability first + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || !CommonUtil_1.CommonUtil.isTabbable(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLocaleLowerCase(); + // Early exit: ignore certain elements + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["pre", "code", "script", "meta"]) !== null + || nodeName === "body" || nodeName === "html") + return null; + var doc = ruleContext.ownerDocument; + if (!doc) + return null; + var win = doc.defaultView; + if (!win) + return null; + // Reuse single DOMMapper instance + var mapper = new DOMMapper_1.DOMMapper(); + var bounds = mapper.getUnadjustedBounds(ruleContext); + // Early exit: bounds not available or element has no dimensions + if (!bounds || bounds.height === 0 || bounds.width === 0) + return null; + var cStyle = win.getComputedStyle(ruleContext); + if (!cStyle) + return null; + // Parse z-index once and cache + var zindex = parseInt(cStyle.zIndex === 'auto' || !cStyle.zIndex ? '0' : cStyle.zIndex); + // More specific selector to reduce iteration + var elems = doc.querySelectorAll('body *:not(script):not(style):not(meta):not(link)'); + if (!elems || elems.length === 0) + return null; + var before = true; + var boundsRight = bounds.left + bounds.width; + var boundsBottom = bounds.top + bounds.height; + // Check for obscuring elements + for (var i = 0; i < elems.length; i++) { + var elem = elems[i]; + /** + * The nodes returned from querySelectorAll are in document order. + * If two elements overlap and z-index are not defined, then the node + * rendered earlier will be overlaid by the node rendered later. + */ + // Use compareDocumentPosition to check containment relationships + // Note: compareDocumentPosition returns 0 when comparing a node to itself + var position = ruleContext.compareDocumentPosition(elem); + // DOCUMENT_POSITION_CONTAINED_BY (16): elem is contained by ruleContext + // Also handle self-comparison (position === 0) + if (position === 0 || (position & Node.DOCUMENT_POSITION_CONTAINED_BY)) { + // The next node in elems will be after the target node (ruleContext) + before = false; + continue; + } + // DOCUMENT_POSITION_CONTAINS (8): elem contains ruleContext + // Skip if element contains ruleContext or is not visible + if ((position & Node.DOCUMENT_POSITION_CONTAINS) || !VisUtil_1.VisUtil.isNodeVisible(elem)) + continue; + var bnds = mapper.getUnadjustedBounds(elem); + // Skip if no bounds or zero dimensions + if (!bnds || bnds.height === 0 || bnds.width === 0) + continue; + // Quick bounds check: does elem completely cover ruleContext? + if (bnds.top > bounds.top || bnds.left > bounds.left) + continue; + var bndsRight = bnds.left + bnds.width; + var bndsBottom = bnds.top + bnds.height; + if (bndsRight < boundsRight || bndsBottom < boundsBottom) + continue; + // Check z-index to determine if elem obscures ruleContext + var zStyle = win.getComputedStyle(elem); + if (!zStyle) + continue; + var elemZindex = parseInt(zStyle.zIndex === 'auto' || !zStyle.zIndex || isNaN(Number(zStyle.zIndex)) ? '0' : zStyle.zIndex); + // If before ruleContext in DOM order, elem must have higher z-index to obscure + // If after ruleContext in DOM order, elem can obscure with equal or higher z-index + if ((before && elemZindex > zindex) || (!before && elemZindex >= zindex)) { + // Check if element has opaque background + var hasOpaqueBackground = false; + if (zStyle.background && zStyle.background !== 'none') { + var bgColor = ColorUtil_1.ColorUtil.Color(zStyle.background); + hasOpaqueBackground = bgColor && (bgColor.alpha === undefined || bgColor.alpha > 0); + } + if (!hasOpaqueBackground && zStyle.backgroundColor) { + var bgColor = ColorUtil_1.ColorUtil.Color(zStyle.backgroundColor); + hasOpaqueBackground = bgColor && (bgColor.alpha === undefined || bgColor.alpha > 0); + } + // If element has no content and no opaque background, skip it + if (!CommonUtil_1.CommonUtil.hasInnerContentHidden(elem) && !hasOpaqueBackground) { + continue; + } + return (0, IRule_1.RulePotential)("potential_obscured", []); + } + } + return (0, IRule_1.RulePass)("pass"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/element_tabbable_visible.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/element_tabbable_visible.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.element_tabbable_visible = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var CSSUtil_1 = __webpack_require__(/*! ../util/CSSUtil */ "./src/v4/util/CSSUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var DOMMapper_1 = __webpack_require__(/*! ../../v2/dom/DOMMapper */ "./src/v2/dom/DOMMapper.ts"); +exports.element_tabbable_visible = { + id: "element_tabbable_visible", + context: "dom:*", + dependencies: [], + help: { + "en-US": { + "group": "element_tabbable_visible.html", + "pass": "element_tabbable_visible.html", + "potential_visible": "element_tabbable_visible.html" + } + }, + messages: { + "en-US": { + "group": "A tabbable element should be visible on the screen when it has keyboard focus", + "pass": "The tabbable element is visible on the screen", + "potential_visible": "Confirm the element should be tabbable and if so, it becomes visible when it has keyboard focus" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + num: ["2.4.7"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (!CommonUtil_1.CommonUtil.isTabbable(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLocaleLowerCase(); + var mapper = new DOMMapper_1.DOMMapper(); + var bounds = mapper.getUnadjustedBounds(ruleContext); + //in case the bounds not available + if (!bounds) + return null; + // Get all needed styles in a single pass through stylesheets + var allStyles = CSSUtil_1.CSSUtil.getDefinedStylesMultiple(ruleContext, ["position", "clip"], ["", ":focus"]); + var defined_styles = allStyles[""]; + var onfocus_styles = allStyles[":focus"]; + if (bounds['height'] === 0 || bounds['width'] === 0) + return (0, IRule_1.RulePotential)("potential_visible", []); + if (defined_styles['position'] === 'absolute' && defined_styles['clip'] && defined_styles['clip'].replaceAll(' ', '') === 'rect(0px,0px,0px,0px)' + && !onfocus_styles['clip']) { + /** + * note that A user can select a checkbox and radio button by selecting the button or the label text. + * When a checkbox or radio button is clipped to 0 size, it is still available to a keyboard or a screen reader. + * The rule should be passed if the label text exists and the button on-focus style is defined by the user, + * which likely incurs the changes of the label style. + */ + if (nodeName === 'input' && (ruleContext.getAttribute('type') === 'checkbox' || ruleContext.getAttribute('type') === 'radio')) { + var label = CommonUtil_1.CommonUtil.getLabelForElement(ruleContext); + if (label && !CommonUtil_1.CommonUtil.isInnerTextEmpty(label)) { + // Get additional pseudo-class styles (reuse onfocus_styles from line 60) + var pseudoStyles = CSSUtil_1.CSSUtil.getDefinedStylesMultiple(ruleContext, null, [":focus-visible", ":focus-within", ":checked", ":focus"]); + var focus_visible_styles = pseudoStyles[":focus-visible"]; + var focus_within_styles = pseudoStyles[":focus-within"]; + var checked_styles = pseudoStyles[":checked"]; + var onfocus_styles_1 = pseudoStyles[":focus"]; + if (onfocus_styles_1 || focus_visible_styles || focus_within_styles || checked_styles) + return (0, IRule_1.RulePass)("pass"); + } + } + return (0, IRule_1.RulePotential)("potential_visible", []); + } + if (bounds['top'] >= 0 && bounds['left'] >= 0) + return (0, IRule_1.RulePass)("pass"); + var default_styles = getComputedStyle(ruleContext); + var top = bounds['top']; + var left = bounds['left']; + if (Object.keys(onfocus_styles).length === 0) { + // no onfocus position change, but could be changed from js + return (0, IRule_1.RulePotential)("potential_visible", []); + } + else { + // with onfocus position change + var positions = ['absolute', 'fixed']; + if (typeof onfocus_styles['top'] !== 'undefined') { + if (positions.includes(onfocus_styles['position']) || (typeof onfocus_styles['position'] === 'undefined' && positions.includes(default_styles['position']))) { + top = onfocus_styles['top'].replace(/\D/g, ''); + } + else { + // the position is undefined and the parent's position is 'relative' + top = Number.MIN_VALUE; + } + } + if (typeof onfocus_styles['left'] !== 'undefined') { + if (positions.includes(onfocus_styles['position']) || (typeof onfocus_styles['position'] === 'undefined' && positions.includes(default_styles['position']))) { + left = onfocus_styles['left'].replace(/\D/g, ''); + } + else { + // the position is undefined and the parent's position is 'relative' + left = Number.MIN_VALUE; + } + } + } + if (top >= 0 && left >= 0) + return (0, IRule_1.RulePass)("pass"); + else + return (0, IRule_1.RulePotential)("potential_visible", []); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/embed_alt_exists.ts" +/*!******************************************!*\ + !*** ./src/v4/rules/embed_alt_exists.ts ***! + \******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.embed_alt_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.embed_alt_exists = { + id: "embed_alt_exists", + context: "dom:embed", + refactor: { + "RPT_Embed_HasAlt": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "embed_alt_exists.html", + "Potential_1": "embed_alt_exists.html", + "group": "embed_alt_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that the <embed> element has alternative content", + "group": "Provide alternative content for <embed> elements" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_FOUR + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "alt"); + return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/emoticons_alt_exists.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/emoticons_alt_exists.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.emoticons_alt_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.emoticons_alt_exists = { + id: "emoticons_alt_exists", + context: "dom:*", + refactor: { + "WCAG20_Text_Emoticons": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "emoticons_alt_exists.html", + "Potential_1": "emoticons_alt_exists.html", + "group": "emoticons_alt_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that emoticons have a text alternative", + "group": "Emoticons must have a short text alternative that describes their purpose" + } + }, + /** + * Decision in planning 9/7/23 that this rule causes more reviews that we see actual problems in content, so turn these rules off + + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": eRulePolicy.VIOLATION, + "toolkitLevel": eToolkitLevel.LEVEL_TWO + }], + */ + rulesets: [], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + emoticons: { + value: [":-)", ":)", ":o)", ":]", ":3", ":c)", ":>", "=]", "8)", "=)", ":D", "C:", + ":-D", ":D", "8D", "XD", "=D", "=3", "<=3", "<=8", "--!--", ":-(", ":(", ":c", ":<", ":[", + "D:", "D8", "D;", "D=", "DX", "v.v", ":-9", ";-)", ";)", "*)", ";]", ";D", ":-P", ":P", + ":-p", ":p", "=p", ":-Þ", ":Þ", ":-b", ":b", ":-O", ":O", "O_O", "o_o", "8O", "OwO", "O-O", + "0_o", "O_o", "O3O", "o0o ;o_o;", "o...o", "0w0", ":-/", ":/", ":\\", "=/", "=\\", ":S", ":|", + "d:-)", "qB-)", ":)~", ":-)>....", ":-X", ":X", ":-#", ":#", "O:-)", "0:3", "O:)", ":'(", ";*(", + "T_T", "TT_TT", "T.T", ":-*", ":*", "^o)", ">:)", ">;)", ">:-)", "B)", "B-)", "8)", "8-)", + "^>.>^", "^<.<^", "^>_>^", "^<_<^", "D:<", ">:(", "D-:<", ">:-(", ":-@[1]", ";(", "`_´", "D<", + "<3", "<333", "=^_^=", "=>.>=", "=<_<=", "=>.<=", "\\,,/", "\\m/", "\\m/\\>.</\\m/", "\\o/", "\\o o/", + "o/\\o", ":&", ":u" + ], + type: "[string]" + } + }; + var ruleContext = context["dom"].node; + var emoticons = validateParams.emoticons.value; + var passed = true; + var testText = ""; + var walkNode = ruleContext.firstChild; + while (walkNode) { + // Comply to the Check Hidden Content setting will be done by default as this rule triggers on each element + // and for each element it only checks that single elements text nodes and nothing else. So all inner elements will be + // covered on their own. Currently for this rule by default Check Hidden Content will work, as we are doing + // a node walk only on siblings so it would not get text nodes from other siblings at all. + // In the case in the future something chnges, just need to add && !RPTUtil.shouldNodeBeSkippedHidden(walkNode) to the below + // if. + if (walkNode.nodeName == "#text") { + testText += " " + walkNode.nodeValue; + } + walkNode = walkNode.nextSibling; + } + if (testText.trim().length > 0) { + for (var j = 0; passed && j < emoticons.length; ++j) { + var emotIdx = testText.indexOf(emoticons[j]); + var eLngth = emoticons[j].length; + while (passed && emotIdx != -1) { + // Passes if: the emoticon is not preceded by whitespace, + // or the emoticon is not followed by whitespace unless it's punctuation, + // or it's in a pre, code, or script + passed = + (emotIdx > 0 && !/\s/.test(testText.substring(emotIdx - 1, emotIdx))) || + (emotIdx < testText.length - eLngth && !/\s/.test(testText.substring(emotIdx + eLngth, emotIdx + eLngth + 1)) && + !/[.,!'"?]/.test(testText.substring(emotIdx + eLngth, emotIdx + eLngth + 1))); + // Allow usage of (: stuff :) since this is a comment in some languages + passed = passed || ((emoticons[j] == ":)" || emoticons[j] == "(:") && /\(\:.*\:\)/.test(testText)); + passed = passed || ((emoticons[j] == ";)" || emoticons[j] == "(;") && /\(\;.*\;\)/.test(testText)); + emotIdx = testText.indexOf(emoticons[j], emotIdx + 1); + } + } + } + if (!passed) { + // Don't trigger if we're not in the body or if we're in a script, pre, code + var checkAncestor = CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["pre", "code", "script", "body"]); + passed = checkAncestor == null || checkAncestor.nodeName.toLowerCase() != "body"; + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/error_message_exists.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/error_message_exists.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.error_message_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.error_message_exists = { + id: "error_message_exists", + context: "dom:*[aria-invalid=true]", + refactor: { + "HAAC_Aria_ErrorMessage": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_0": "error_message_exists.html", + "Fail_1": "error_message_exists.html", + "Fail_2": "error_message_exists.html", + "group": "error_message_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Custom error message has invalid reference 'id' value", + "Fail_2": "Custom error message is not visible", + "group": "A custom error message must reference a valid 'id' value and when triggered the message must be appropriately exposed" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var aria_errMsgId = AriaUtil_1.AriaUtil.getAriaAttribute(ruleContext, "aria-errormessage"); + // If aria-errormessage is not provided, then OUT_OF_SCOPE + if (!aria_errMsgId) { + return null; + } + var msg_ele = fragment_1.FragmentUtil.getById(ruleContext, aria_errMsgId); + // POF0: Invalid id reference + if (!msg_ele) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + // POF1: Referenced element is not visible + if (!VisUtil_1.VisUtil.isNodeVisible(msg_ele)) { + return (0, IRule_1.RuleFail)("Fail_2"); + } + return (0, IRule_1.RulePass)("Pass_0"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/fieldset_label_valid.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/fieldset_label_valid.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.fieldset_label_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +exports.fieldset_label_valid = { + id: "fieldset_label_valid", + context: "aria:group", + refactor: { + "group_withInputs_hasName": { + "Pass_1": "Pass_1", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_1": "fieldset_label_valid.html", + "Fail_1": "fieldset_label_valid.html", + "Fail_2": "fieldset_label_valid.html", + "group": "fieldset_label_valid.html" + } + }, + messages: { + "en-US": { + "Pass_1": "Group/Fieldset \"{0}\" with an input has a unique name", + "Fail_1": "Group/Fieldset does not have an accessible name", + "Fail_2": "Group/Fieldset \"{0}\" has a duplicate name to another group", + "group": "Groups with nested inputs must have unique accessible name" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1", "3.3.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + var ownerDocument = fragment_1.FragmentUtil.getOwnerFragment(ruleContext); + var formCache = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "landmark_group_input", null); + if (!formCache) { + formCache = { + groupsWithInputs: [], + groupsWithInputsComputedLabels: [], + }; + var allGroupsTemp = ownerDocument.querySelectorAll('fieldset,[role="group"]'); + var allGroups = Array.from(allGroupsTemp); + var groupsWithInputs = []; + for (var i = 0; i < allGroups.length; i++) { + // Loop over all the group nodes + if (allGroups[i].querySelector("input")) { + groupsWithInputs.push(allGroups[i]); + } + } + var groupsWithInputsComputedLabels = []; + for (var i = 0; i < groupsWithInputs.length; i++) { + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(groupsWithInputs[i]); + // Loop over all the landmark nodes + groupsWithInputsComputedLabels.push( + /**ARIAMapper.computeName(groupsWithInputs[i])*/ + pair && pair.name && pair.name.trim().length > 0 ? pair.name.trim() : ""); + } + formCache.groupsWithInputs = groupsWithInputs; + formCache.groupsWithInputsComputedLabels = + groupsWithInputsComputedLabels; + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "landmark_group_input", formCache); + } + // formCache.groupsWithInputs.forEach(element => { + // console.log("formCache.groupsWithInputs: " +element.id) + // }); + // console.log("formCache.groupsWithInputsComputedLabels: " +formCache.groupsWithInputsComputedLabels) + // console.log("formCache.groupsWithInputsComputedLabels: " +formCache.groupsWithInputsComputedLabels.length) + var ruleContextFoundIngroupsWithInputsFlag = false; + var computedName = ""; + if (!formCache.groupsWithInputs) { + // We do not have any groups with inputs. Therefore we should skip this rule trigger. + return null; + } + for (var i = 0; i < formCache.groupsWithInputs.length; i++) { + if (ruleContext.isSameNode(formCache.groupsWithInputs[i])) { + // We have found our ruleContext in the cache + ruleContextFoundIngroupsWithInputsFlag = true; + if (formCache.groupsWithInputsComputedLabels[i] === "" || + formCache.groupsWithInputsComputedLabels[i] === null) { + // console.log("Fail_1") + return (0, IRule_1.RuleFail)("Fail_1"); + } + var foundSameNameFlag = false; + for (var j = 0; j < formCache.groupsWithInputsComputedLabels.length; j++) { + if (i == j) { + continue; + } // We do not want to compare against ourselfs + if (formCache.groupsWithInputsComputedLabels[i] === + formCache.groupsWithInputsComputedLabels[j]) { + foundSameNameFlag = true; + } + } + if (foundSameNameFlag) { + // console.log("Fail_2") + return (0, IRule_1.RuleFail)("Fail_2", [ + formCache.groupsWithInputsComputedLabels[i], + ]); + } + computedName = formCache.groupsWithInputsComputedLabels[i]; + } + } + if (!ruleContextFoundIngroupsWithInputsFlag) { + // console.log("null return") + return null; + } + // console.log("Pass_1") + return (0, IRule_1.RulePass)("Pass_1", [computedName]); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/fieldset_legend_valid.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/fieldset_legend_valid.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.fieldset_legend_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.fieldset_legend_valid = { + id: "fieldset_legend_valid", + context: "dom:fieldset", + refactor: { + "WCAG20_Fieldset_HasLegend": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3" + } + }, + help: { + "en-US": { + "Pass_0": "fieldset_legend_valid.html", + "Fail_1": "fieldset_legend_valid.html", + "Fail_2": "fieldset_legend_valid.html", + "Fail_3": "fieldset_legend_valid.html", + "group": "fieldset_legend_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "<fieldset> element does not have a <legend>", + "Fail_2": "<fieldset> element has more than one <legend>", + "Fail_3": "<fieldset> element <legend> is empty", + "group": " <fieldset> elements should have a single, non-empty <legend> as a label" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip if the fieldset is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return null; + // In the case a legend is hidden, we should still trigger a violations for this + var legends = CommonUtil_1.CommonUtil.getChildByTagHidden(ruleContext, "legend", true, false); + if (legends.length === 0) { + // Fieldset has NO Legend + return (0, IRule_1.RuleFail)("Fail_1"); + } + else if (legends.length > 1) { + // Fieldset has more than one legend + return (0, IRule_1.RuleFail)("Fail_2"); + } + else if (CommonUtil_1.CommonUtil.getInnerText(legends[0]).trim().length === 0) { + // Fieldset has legend but legend is empty + return (0, IRule_1.RuleFail)("Fail_3"); + } + return (0, IRule_1.RulePass)("Pass_0"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/figure_label_exists.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/figure_label_exists.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.figure_label_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +exports.figure_label_exists = { + id: "figure_label_exists", + context: "dom:figure", + refactor: { + "HAAC_Figure_label": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "figure_label_exists.html", + "Fail_1": "figure_label_exists.html", + "group": "figure_label_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The <figure> element does not have an associated label", + "group": "A <figure> element must have an associated label" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // ignore if an explicit role is specified. this case will be covered in the aria_accessiblename_exists rules + var role = ruleContext.getAttribute("role"); + if (role) { + return null; + } + //let passed = AriaUtil.hasAriaLabel(ruleContext) || CommonUtil.attributeNonEmpty(ruleContext, "title"); + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + var passed = pair && pair.name && pair.name.trim().length > 0; + //return new ValidationResult(passed, [ruleContext], '', '', []); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1", []); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/form_font_color.ts" +/*!*****************************************!*\ + !*** ./src/v4/rules/form_font_color.ts ***! + \*****************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.form_font_color = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.form_font_color = { + id: "form_font_color", + context: "dom:form", + refactor: { + "RPT_Font_ColorInForm": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "form_font_color.html", + "Potential_1": "form_font_color.html", + "group": "form_font_color.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Check color is not used as the only visual means to convey which fields are required", + "group": "Combine color and descriptive markup to indicate required form fields" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = true; + var fonts = ruleContext.getElementsByTagName("font"); + if (fonts != null) { + for (var i = 0; i < fonts.length; ++i) { + passed = !fonts[i].hasAttribute("color"); + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/form_interaction_review.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/form_interaction_review.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.form_interaction_review = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.form_interaction_review = { + id: "form_interaction_review", + context: "dom:form[target]", + refactor: { + "WCAG20_Form_TargetAndText": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "form_interaction_review.html", + "Potential_1": "form_interaction_review.html", + "group": "form_interaction_review.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that interacting with content will not open pop-up windows or change the active window without informing the user", + "group": "User should be informed in advance when interacting with content causes a change of context" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.2.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + paramWinText: { + value: ["new window"], + type: "array" + } + }; + var ruleContext = context["dom"].node; + var tStr = ruleContext.getAttribute("target"); + var passed = tStr === "_parent" || tStr === "_self" || tStr === "_top" || CommonUtil_1.CommonUtil.getFrameByName(ruleContext, tStr) != null; + if (!passed) { + // Name is not part of this frameset – must have potential to create new window? + // See if a new window is mentioned + var textStr = CommonUtil_1.CommonUtil.getInnerText(ruleContext); + if (ruleContext.hasAttribute("title")) + textStr += " " + ruleContext.getAttribute("title"); + for (var i = 0; !passed && i < validateParams.paramWinText.value.length; ++i) + if (textStr.indexOf(validateParams.paramWinText.value[i]) != -1) + passed = true; + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/form_label_unique.ts" +/*!*******************************************!*\ + !*** ./src/v4/rules/form_label_unique.ts ***! + \*******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.form_label_unique = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +exports.form_label_unique = { + id: "form_label_unique", + context: "dom:label[for]", + refactor: { + "RPT_Label_UniqueFor": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "form_label_unique.html", + "Fail_1": "form_label_unique.html", + "group": "form_label_unique.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Form control has more than one label", + "group": "Form controls should have exactly one label" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // JCH - NO OUT OF SCOPE hidden in context + var labelIds = CacheUtil_1.CacheUtil.getCache(fragment_1.FragmentUtil.getOwnerFragment(ruleContext), "RPT_Label_Single", {}); + var id = ruleContext.getAttribute("for"); + var passed = !(id in labelIds); + labelIds[id] = true; + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/form_submit_button_exists.ts" +/*!***************************************************!*\ + !*** ./src/v4/rules/form_submit_button_exists.ts ***! + \***************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.form_submit_button_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +exports.form_submit_button_exists = { + id: "form_submit_button_exists", + context: "dom:form", + refactor: { + "WCAG20_Form_HasSubmit": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "form_submit_button_exists.html", + "Potential_1": "form_submit_button_exists.html", + "group": "form_submit_button_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify the <form> element has a submit button or an image button", + "group": "A <form> element should have a submit button or an image button" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.2.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = false; + if (ruleContext.firstChild) { + // submit buttons are usually at the bottom - walk backwards + var nw = new DOMWalker_1.DOMWalker(ruleContext, true); + while (!passed && nw.prevNode() && nw.node != ruleContext) { + if (!nw.bEndTag) { + var nodeName = nw.node.nodeName.toLowerCase(); + if (nodeName === "input") { + var type = nw.elem().getAttribute("type"); + if (type) { + type = type.toLowerCase(); + } + passed = type === "submit" || type === "image"; + } + else if (nodeName === "button") { + passed = nw.elem().hasAttribute("type") && nw.elem().getAttribute("type").toLowerCase() === "submit"; + } + else if (nw.node.nodeType === 1) { + passed = AriaUtil_1.AriaUtil.hasRole(nw.node, "button"); + } + } + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/form_submit_review.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/form_submit_review.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.form_submit_review = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.form_submit_review = { + id: "form_submit_review", + context: "dom:select[onchange], dom:input[onchange]", + refactor: { + "RPT_Form_ChangeEmpty": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "form_submit_review.html", + "Potential_1": "form_submit_review.html", + "group": "form_submit_review.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Confirm the form does not submit automatically without warning", + "group": "A form should not be submitted automatically without warning the user" + } + }, + /** + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.2.2"], + "level": eRulePolicy.VIOLATION, + "toolkitLevel": eToolkitLevel.LEVEL_THREE + }],*/ + //deprecate the rule on Jun 10, 2024 + rulesets: [], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = ruleContext.getAttribute("onchange").trim().length === 0; + if (passed) + return null; + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/frame_src_valid.ts" +/*!*****************************************!*\ + !*** ./src/v4/rules/frame_src_valid.ts ***! + \*****************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.frame_src_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.frame_src_valid = { + id: "frame_src_valid", + context: "dom:frame, dom:iframe", + refactor: { + "Valerie_Frame_SrcHtml": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "frame_src_valid.html", + "Potential_1": "frame_src_valid.html", + "group": "frame_src_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify <frame> content is accessible", + "group": "A <frame> containing non-HTML content must be made accessible" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "src") && + CommonUtil_1.CommonUtil.isHtmlExt(CommonUtil_1.CommonUtil.getFileExt(ruleContext.getAttribute("src"))); + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/frame_title_exists.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/frame_title_exists.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.frame_title_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.frame_title_exists = { + id: "frame_title_exists", + context: "dom:frame, dom:iframe", + refactor: { + "WCAG20_Frame_HasTitle": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "group": "frame_title_exists.html", + "Pass_0": "frame_title_exists.html", + "Fail_1": "frame_title_exists.html" + } + }, + messages: { + "en-US": { + "group": "Inline frames must have a unique, non-empty 'title' attribute", + "Pass_0": "Rule Passed", + "Fail_1": "Inline frame does not have a 'title' attribute", + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: "cae760", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // ignore if an explicit role is specified. this case will be covered in the aria_accessiblename_exists rules + var role = ruleContext.getAttribute("role"); + if (role) { + return null; + } + var name_pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + if (name_pair && name_pair.name && name_pair.name.trim().length > 0) { + //if (CommonUtil.attributeNonEmpty(ruleContext, "title")) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/heading_content_exists.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/heading_content_exists.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.heading_content_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.heading_content_exists = { + id: "heading_content_exists", + context: "dom:h1, dom:h2, dom:h3, dom:h4, dom:h5, dom:h6", + refactor: { + "RPT_Header_HasContent": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "heading_content_exists.html", + "Fail_1": "heading_content_exists.html", + "group": "heading_content_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Heading element has descriptive text", + "Fail_1": "Heading element has no descriptive content", + "group": "Heading elements must provide descriptive text" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.6"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = CommonUtil_1.CommonUtil.hasInnerContentHidden(ruleContext); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/heading_markup_misuse.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/heading_markup_misuse.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.heading_markup_misuse = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.heading_markup_misuse = { + id: "heading_markup_misuse", + context: "dom:h1, dom:h2, dom:h3, dom:h4, dom:h5, dom:h6", + dependencies: ["heading_content_exists"], + refactor: { + "RPT_Headers_FewWords": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "heading_markup_misuse.html", + "Potential_1": "heading_markup_misuse.html", + "group": "heading_markup_misuse.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that the heading element is a genuine heading", + "group": "Heading elements must not be used for presentation" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + headingLengthThresh: { + value: 20, + type: "integer" + } + }; + var ruleContext = context["dom"].node; + var headingLengthThresh = validateParams.headingLengthThresh.value; + var passed = CommonUtil_1.CommonUtil.wordCount(CommonUtil_1.CommonUtil.getInnerText(ruleContext)) <= headingLengthThresh; + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/html_lang_exists.ts" +/*!******************************************!*\ + !*** ./src/v4/rules/html_lang_exists.ts ***! + \******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.html_lang_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var ancestor_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/ancestor */ "./src/v2/checker/accessibility/util/ancestor.ts"); +var lang_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/lang */ "./src/v2/checker/accessibility/util/lang.ts"); +exports.html_lang_exists = { + id: "html_lang_exists", + context: "dom:html", + refactor: { + "WCAG20_Html_HasLang": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3", + "Fail_4": "Fail_4", + "Fail_5": "Fail_5", + "Potential_5": "Potential_5", + "Potential_6": "Potential_6" + } + }, + help: { + "en-US": { + "group": "html_lang_exists.html", + "Pass_0": "html_lang_exists.html", + "Fail_1": "html_lang_exists.html", + "Fail_2": "html_lang_exists.html", + "Fail_3": "html_lang_exists.html", + "Fail_4": "html_lang_exists.html", + "Fail_5": "html_lang_exists.html", + "Potential_5": "html_lang_exists.html", + "Potential_6": "html_lang_exists.html" + } + }, + messages: { + "en-US": { + "group": "Page must identify the default language of the document with a 'lang' attribute", + "Pass_0": "Page language detected as \"{0}\"", + "Fail_1": "Page detected as XHTML 1.0, but has neither 'lang' nor 'xml:lang' attributes", + "Fail_2": "Page detected as XHTML, but does not have an 'xml:lang' attribute", + "Fail_3": "Page detected as HTML, but does not have a 'lang' attribute", + "Fail_4": "Page detected with 'lang' and 'xml:lang' attributes and primary languages do not match: \"{0}\", \"{1}\"", + "Fail_5": "Page detected with 'lang' and 'xml:lang' attributes that do not match: \"{0}\", \"{1}\"", + "Potential_5": "Page detected as XHTML 1.0 with only a 'lang' attribute. Confirm that page is only delivered via text/html mime type", + "Potential_6": "Page detected as XHTML 1.0 with only an 'xml:lang' attribute. Confirm that page is only delivered via xml mime type" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "3.1.1", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [{ + "b5c3f8": { + "Pass_0": "pass", + "Fail_1": "inapplicable", + "Fail_2": "inapplicable", + "Fail_3": "fail", + "Fail_4": "inapplicable", + "Fail_5": "inapplicable", + "Potential_5": "inapplicable", + "Potential_6": "inapplicable" + }, + "5b7ae0": { + "Pass_0": "pass", + "Fail_1": "inapplicable", + "Fail_2": "inapplicable", + "Fail_3": "inapplicable", + "Fail_4": "fail", + "Fail_5": "pass", + "Potential_5": "inapplicable", + "Potential_6": "inapplicable" + } + }], + run: function (context, options, contextHierarchies) { + // This rule does not apply inside a presentational frame + if (ancestor_1.AncestorUtil.isPresentationFrame(contextHierarchies)) { + return null; + } + var ruleContext = context["dom"].node; + var doctypeString = ruleContext.ownerDocument.doctype ? ruleContext.ownerDocument.doctype.publicId : ""; + if (!doctypeString) + doctypeString = ""; + var lang = ruleContext.getAttribute("lang"); + var langXML = ruleContext.getAttribute("xml:lang"); + if (doctypeString.includes('XHTML') && !doctypeString.includes("1.0")) { + if (!langXML) { + // XHTML != 1.0 (must have xml:lang + return (0, IRule_1.RuleFail)("Fail_2"); + } + else { + return (0, IRule_1.RulePass)("Pass_0", [langXML]); + } + } + else if (doctypeString.includes('XHTML') && doctypeString.includes("1.0")) { + // Handle XHTML 1.0 + // If neither is provided, it's a failure + if (!lang && !langXML) { + // XHTML and no lang + return (0, IRule_1.RuleFail)("Fail_1"); + } + else if (lang && langXML) { + if (lang !== langXML) { + if (!lang_1.LangUtil.validPrimaryLang(lang) || !lang_1.LangUtil.validPrimaryLang(langXML)) { + // Let Elem_Lang_Valid handle this + return null; + } + if (!lang_1.LangUtil.matchPrimaryLang(lang, langXML)) { + // XHTML and lang and xml:lang, but they don't match + return (0, IRule_1.RuleFail)("Fail_4", [lang, langXML], []); + } + else { + return (0, IRule_1.RuleFail)("Fail_5", [lang, langXML], []); + } + } + else { + // XHTML and lang and xml:lang match + return (0, IRule_1.RulePass)("Pass_0", [lang]); + } + } + else if (lang) { + // XHTML and only lang (okay if only delivered via text/html) + return (0, IRule_1.RulePotential)("Potential_5"); + } + else { + // XHTML and only xml:lang (okay if only delivered via xml mime type) + return (0, IRule_1.RulePotential)("Potential_6"); + } + } + else { + if (!lang) { + return (0, IRule_1.RuleFail)("Fail_3"); + } + else if (lang && langXML) { + // HTML5 polyglot documents + if (lang !== langXML) { + if (!lang_1.LangUtil.validPrimaryLang(lang) || !lang_1.LangUtil.validPrimaryLang(langXML)) { + // Let Elem_Lang_Valid handle this + return null; + } + if (!lang_1.LangUtil.matchPrimaryLang(lang, langXML)) { + // XHTML and lang and xml:lang, but they don't match + return (0, IRule_1.RuleFail)("Fail_4", [lang, langXML], []); + } + else { + return (0, IRule_1.RuleFail)("Fail_5", [lang, langXML], []); + } + } + else { + // XHTML and lang and xml:lang match + return (0, IRule_1.RulePass)("Pass_0", [lang]); + } + } + else { + return (0, IRule_1.RulePass)("Pass_0", [lang]); + } + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/html_skipnav_exists.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/html_skipnav_exists.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.html_skipnav_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +exports.html_skipnav_exists = { + id: "html_skipnav_exists", + context: "dom:html", + refactor: { + "RPT_Html_SkipNav": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "group": "html_skipnav_exists.html", + "Pass_0": "html_skipnav_exists.html", + "Potential_1": "html_skipnav_exists.html" + } + }, + messages: { + "en-US": { + "group": "Provide a way to bypass blocks of content that are repeated on multiple Web pages", + "Pass_0": "Rule Passed", + "Potential_1": "Verify there is a way to bypass blocks of content that are repeated on multiple Web pages" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "2.4.1", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = false; + var frames = CommonUtil_1.CommonUtil.getDocElementsByTag(ruleContext, "frame"); + var headers = CommonUtil_1.CommonUtil.getDocElementsByTag(ruleContext, "h1"); + if ((frames != null && frames.length > 0) || (headers != null && headers.length > 0)) { + // If frames or headings are used, pass + passed = true; + } + else { + // Look for skip anchors + var anchors = CommonUtil_1.CommonUtil.getDocElementsByTag(ruleContext, "a"); + var targets = {}; + for (var idx = 0; !passed && idx < anchors.length; ++idx) { + if (anchors[idx].hasAttribute("href")) { + var href = anchors[idx].href; + if (typeof href !== typeof "") { + if (href.baseVal) { + href = href.baseVal; + } + else { + href = ""; + } + } + var tmpLocation = void 0; + if (typeof (ruleContext.ownerDocument.locationFromDAP) != "undefined" && ruleContext.ownerDocument.locationFromDAP != null) { // DAP sets it + tmpLocation = ruleContext.ownerDocument.locationFromDAP; + } + else { // server scan has the location object + tmpLocation = ruleContext.ownerDocument.location; + } + var docHref = ""; + if (tmpLocation) { + docHref = tmpLocation.href; + } + // Fix weird bugs with how various parsers report on file: url's: + if (href.startsWith("file:///")) + href = "file:/" + href.substring("file:///".length); + if (docHref.startsWith("file:///")) + docHref = "file:/" + docHref.substring("file:///".length); + if (href.charAt(0) == "#" || href.startsWith(docHref + "#")) { + var target = CommonUtil_1.CommonUtil.getFileAnchor(href); + if (fragment_1.FragmentUtil.getById(ruleContext, target) != null) + passed = true; + else + targets[target] = true; + } + } + else if (anchors[idx].hasAttribute("name")) { + // Assume forward jumping targets + var name_1 = anchors[idx].getAttribute("name"); + if (name_1.indexOf("#") != -1) + name_1 = CommonUtil_1.CommonUtil.getFileAnchor(name_1); + passed = name_1 in targets; + } + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/iframe_interactive_tabbable.ts" +/*!*****************************************************!*\ + !*** ./src/v4/rules/iframe_interactive_tabbable.ts ***! + \*****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.iframe_interactive_tabbable = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var DOMMapper_1 = __webpack_require__(/*! ../../v2/dom/DOMMapper */ "./src/v2/dom/DOMMapper.ts"); +exports.iframe_interactive_tabbable = { + id: "iframe_interactive_tabbable", + context: "dom:iframe", + dependencies: [], + help: { + "en-US": { + "group": "iframe_interactive_tabbable.html", + "pass": "iframe_interactive_tabbable.html", + "fail_invalid": "iframe_interactive_tabbable.html" + } + }, + messages: { + "en-US": { + "group": "Iframe with interactive content should not be excluded from tab order using tabindex", + "pass": "The iframe with interactive content is not excluded from the tab order using tabindex", + "fail_invalid": "The <iframe> with interactive content is excluded from tab order using tabindex" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + num: ["2.1.1"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: ["akn7bn"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + var mapper = new DOMMapper_1.DOMMapper(); + var bounds = mapper.getUnadjustedBounds(ruleContext); + //in case the bounds not available + if (!bounds) + return null; + // ignore if iframe is too small to be visible on screen + if (Math.max(bounds['height'], bounds['width']) < 30 || Math.min(bounds['height'], bounds['width']) < 15) + return null; + // pass iframe element does not have a tabindex attribute value that is a negative number + if (!ruleContext.hasAttribute("tabindex") || parseInt(ruleContext.getAttribute("tabindex")) >= 0) + return (0, IRule_1.RulePass)("pass"); + // check iframe content + var iframElem = ruleContext; + if (!iframElem || !iframElem.contentDocument || !iframElem.contentDocument.documentElement) + return null; + var count = CommonUtil_1.CommonUtil.getTabbableChildren(ruleContext); + if (count > 0) + return (0, IRule_1.RuleFail)("fail_invalid"); + return null; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/imagebutton_alt_exists.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/imagebutton_alt_exists.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.imagebutton_alt_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.imagebutton_alt_exists = { + id: "imagebutton_alt_exists", + context: "dom:input", + refactor: { + "WCAG20_Input_ExplicitLabelImage": { + "Pass_0": "Pass_0", + "Pass_1": "Pass_1", + "Pass_2": "Pass_2", + "Fail": "Fail" + } + }, + help: { + "en-US": { + "Pass_0": "imagebutton_alt_exists.html", + "Pass_1": "imagebutton_alt_exists.html", + "Pass_2": "imagebutton_alt_exists.html", + "Fail": "imagebutton_alt_exists.html", + "group": "imagebutton_alt_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Image button provides alternative text using the 'alt' attribute", + "Pass_1": "Image button provides alternative text using an ARIA label", + "Pass_2": "Image button provides alternative text using the 'title' attribute", + "Fail": "The <input> element of type \"image\" has no text alternative", + "group": "The <input> element of type \"image\" should have a text alternative" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: "59796f", + run: function (context, options, contextHierarchies) { + // See https://www.w3.org/WAI/WCAG22/Techniques/failures/F65 + var ruleContext = context["dom"].node; + if (!ruleContext.hasAttribute("type") || ruleContext.getAttribute("type").toLowerCase() != "image") { + return null; + } + if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "alt")) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else if (AriaUtil_1.AriaUtil.hasAriaLabel(ruleContext)) { + return (0, IRule_1.RulePass)("Pass_1"); + } + else if (ruleContext.hasAttribute("title") && ruleContext.getAttribute("title").length > 0) { + return (0, IRule_1.RulePass)("Pass_2"); + } + return (0, IRule_1.RuleFail)("Fail"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/imagemap_alt_exists.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/imagemap_alt_exists.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.imagemap_alt_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.imagemap_alt_exists = { + id: "imagemap_alt_exists", + context: "dom:img[usemap], dom:img[ismap]", + refactor: { + "HAAC_Img_UsemapAlt": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "imagemap_alt_exists.html", + "Fail_1": "imagemap_alt_exists.html", + "group": "imagemap_alt_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Image map or child <area> has no text alternative", + "group": "An image map and each <area> element in an image map must have text alternative(s)" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "alt") || + (!ruleContext.hasAttribute("ismap") && !CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "usemap")); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/img_alt_background.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/img_alt_background.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_alt_background = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.img_alt_background = { + id: "img_alt_background", + context: "dom:*", + refactor: { + "HAAC_BackgroundImg_HasTextOrTitle": { + "Pass_0": "Pass_0", + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Pass_0": "img_alt_background.html", + "Manual_1": "img_alt_background.html", + "group": "img_alt_background.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Manual_1": "Verify important background image information has a text alternative in system high contrast mode", + "group": "Background images that convey important information must have a text alternative that describes the image" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var doc = ruleContext.ownerDocument; + var style = doc.defaultView.getComputedStyle(ruleContext); + if (style == null) { + return (0, IRule_1.RulePass)("Pass_0"); + } + var backgroundImgs = style.backgroundImage; + var passed = true; + if (backgroundImgs != null && backgroundImgs != "" && backgroundImgs != 'none' && backgroundImgs != 'inherit') { + if (ruleContext.innerHTML != null && ruleContext.innerHTML.trim().length != 0) { + passed = false; + } + else { + var title = ruleContext.getAttribute('title'); + if (title != null && title.length != 0) + passed = false; + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/img_alt_decorative.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/img_alt_decorative.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_alt_decorative = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.img_alt_decorative = { + id: "img_alt_decorative", + context: "dom:img[alt]", + refactor: { + "WCAG20_Img_PresentationImgHasNonNullAlt": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "img_alt_decorative.html", + "Fail_1": "img_alt_decorative.html", + "group": "img_alt_decorative.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Image designated as decorative has non-null 'alt' attribute", + "group": "Image designated as decorative must have 'alt=\"\"" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = true; + if (AriaUtil_1.AriaUtil.hasRole(ruleContext, "presentation") || AriaUtil_1.AriaUtil.hasRole(ruleContext, "none")) { + passed = ruleContext.getAttribute("alt").length == 0; + } + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/img_alt_misuse.ts" +/*!****************************************!*\ + !*** ./src/v4/rules/img_alt_misuse.ts ***! + \****************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_alt_misuse = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.img_alt_misuse = { + id: "img_alt_misuse", + context: "dom:img, dom:area, dom:input", + refactor: { + "RPT_Img_AltCommonMisuse": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "img_alt_misuse.html", + "Potential_1": "img_alt_misuse.html", + "group": "img_alt_misuse.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that the file name serves as a good inline replacement for the image", + "group": "'alt' attribute value must be a good inline replacement for the image" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + badText: { + value: ["short description"], + type: "[string]" + } + }; + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLowerCase(); + var passed = true; + // Alt text check are elsewhere (See 41, 240, 455) + if (ruleContext.hasAttribute("alt")) { + var altText = ruleContext.getAttribute("alt").trim(); + if (altText.length > 0) { + var badText = validateParams.badText.value; + for (var i = 0; passed && i < badText.length; ++i) { + passed = altText.indexOf(badText[i]) == -1; + } + if (passed) { + var src = ruleContext.getAttribute((nodeName == "area") ? "href" : "src"); + // Allow it to pass if there's no src - can't determine these. + if (src != null) { + // Fail if the alt matches the src exactly + // Also fail if the alt has a . in it and either the src is in the alt or the alt is in the src + passed = src.trim() != altText && + (altText.indexOf(".") == -1 || (altText.indexOf(src) == -1 && src.indexOf(altText) == -1)); + } + } + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/img_alt_null.ts" +/*!**************************************!*\ + !*** ./src/v4/rules/img_alt_null.ts ***! + \**************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_alt_null = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.img_alt_null = { + id: "img_alt_null", + context: "dom:img[alt]", + refactor: { + "WCAG20_Img_TitleEmptyWhenAltNull": { + "Pass_0": "pass", + "Fail_1": "fail_decorative" + } + }, + help: { + "en-US": { + "pass": "img_alt_null.html", + "fail_decorative": "img_alt_null.html", + "potential_aria_override": "img_alt_null.html", + "group": "img_alt_null.html" + } + }, + messages: { + "en-US": { + "pass": "Neither 'aria' nor 'title' attributes are used for the decorative image", + "fail_decorative": "The image 'alt' attribute is empty, but the 'title' attribute is not empty", + "potential_aria_override": "The image 'alt' attribute is empty, but the 'aria' label is not empty and overrides the 'alt' attribute", + "group": "When the intent is to mark an image as decorative with an empty 'alt' attribute, the 'aria' or 'title' attributes should not be used" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE, + reasonCodes: ["fail_decorative"] + }, + { + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["ARIA"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE, + reasonCodes: ["potential_aria_override"] + } + ], + act: [{ "46ca7f": { "potential_aria_override": "fail" } }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + if (ruleContext.getAttribute("alt").trim().length > 0) { + return null; + } + // We have a title, but alt is empty + if (AriaUtil_1.AriaUtil.getAriaLabel(ruleContext).length > 0) { + return (0, IRule_1.RulePotential)("potential_aria_override"); + } + else if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "title")) { + return (0, IRule_1.RuleFail)("fail_decorative"); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/img_alt_redundant.ts" +/*!*******************************************!*\ + !*** ./src/v4/rules/img_alt_redundant.ts ***! + \*******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_alt_redundant = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.img_alt_redundant = { + id: "img_alt_redundant", + context: "dom:img[alt]", + refactor: { + "WCAG20_Img_LinkTextNotRedundant": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3" + } + }, + help: { + "en-US": { + "Pass_0": "img_alt_redundant.html", + "Fail_1": "img_alt_redundant.html", + "Fail_2": "img_alt_redundant.html", + "Fail_3": "img_alt_redundant.html", + "group": "img_alt_redundant.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Link text is repeated in an image 'alt' value within the same link", + "Fail_2": "Link text of previous link is repeated in image 'alt' value of a link", + "Fail_3": "Image 'alt' value within a link is repeated in link text of the link after", + "group": "The text alternative for an image within a link should not repeat the link text or adjacent link text" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1", "2.4.4"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var aNode = CommonUtil_1.CommonUtil.getAncestor(ruleContext, "a"); + //If not in an anchor, Out of Scope + if (aNode == null) + return null; + var altText = ruleContext.getAttribute("alt").trim().toLowerCase(); + if (altText.length == 0) { + // If alt text is empty, there's no text to be redundant - let a_text_purpose + // trigger in that case. + // So Out of Scope for this rule + return null; + } + var innerText = aNode.innerText; + var linkText = ""; + if (innerText != null) { + linkText = innerText.trim().toLowerCase(); + } + if (linkText.length > 0) { + if (altText == linkText) { + // Text in link + return (0, IRule_1.RuleFail)("Fail_1"); + } + } + else { + var passed = true; + //alt is non-zero, but no link text - ensure adjacent link text isn't redundant + var walk = new DOMWalker_1.DOMWalker(aNode); + while (passed && walk.prevNode()) { + // Get the node and nodeName + var node = walk.node; + var nodeName = node.nodeName.toLowerCase(); + if ((nodeName == "#text" && node.nodeValue.length > 0) || + (nodeName == "img" && CommonUtil_1.CommonUtil.attributeNonEmpty(node, "alt"))) { + break; + } + // Comply with the Check Hidden Content Setting if the a element should be checked or not + else if (nodeName === "a" && !CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(node)) { + // Text before image link + passed = (node.innerText || node.textContent || "").trim().toLowerCase() != altText; + } + } + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_2"); + } + walk = new DOMWalker_1.DOMWalker(aNode, true); + while (passed && walk.nextNode()) { + // Get the node and nodeName + var node = walk.node; + var nodeName = node.nodeName.toLowerCase(); + if ((nodeName == "#text" && node.nodeValue.length > 0) || + (nodeName == "img" && CommonUtil_1.CommonUtil.attributeNonEmpty(node, "alt"))) { + break; + } + // Comply with the Check Hidden Content Setting if the a element should be checked or not + else if (nodeName == "a" && !CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(node)) { + passed = node.innerText.trim().toLowerCase() != altText; + } + } + if (!passed) { + // Text after image link + return (0, IRule_1.RuleFail)("Fail_3"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/img_alt_valid.ts" +/*!***************************************!*\ + !*** ./src/v4/rules/img_alt_valid.ts ***! + \***************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_alt_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +exports.img_alt_valid = { + id: "img_alt_valid", + context: "dom:img", + refactor: { + "WCAG20_Img_HasAlt": { + "pass": "pass", + "fail_blank_alt": "fail_blank_alt", + "fail_no_alt": "fail_no_alt", + "fail_blank_title": "fail_blank_title" + } + }, + help: { + "en-US": { + "pass": "img_alt_valid.html", + "fail_blank_alt": "img_alt_valid.html", + "fail_no_alt": "img_alt_valid.html", + "fail_blank_title": "img_alt_valid.html", + "group": "img_alt_valid.html" + } + }, + messages: { + "en-US": { + "pass": "The image has an accessible name or is correctly marked as decorative or redundant", + "fail_blank_alt": "Image 'alt' attribute value consists only of blank space(s)", + "fail_no_alt": "The image has neither an accessible name nor is marked as decorative or redundant", + "fail_blank_title": "The image does not have an 'alt' attribute or ARIA label, and the 'title' attribute value consists only of blank space(s)", + "group": "Images must have accessible names unless they are decorative or redundant" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: "23a2a8", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // If not visible to the screen reader, or can be ignored + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || AccNameUtil_1.AccNameUtil.isAccessibleNameIgnorable(ruleContext)) + return null; + if (AriaUtil_1.AriaUtil.getAriaLabel(ruleContext).trim().length !== 0) { + // the img has non-empty aria label + return (0, IRule_1.RulePass)("pass"); + } + var alt = ruleContext.hasAttribute("alt") ? ruleContext.getAttribute("alt") : null; + // check title attribute + if (alt === null) { + // the img has no alt or attribute, examine the title attribute + var title = ruleContext.hasAttribute("title") ? ruleContext.getAttribute("title") : null; + if (title === null || title.length === 0) { + // no title or title is empty, examine alt further + if (alt === null) { + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext, false); + if (role === 'presentation' || role === 'none') + return (0, IRule_1.RulePass)("pass"); + return (0, IRule_1.RuleFail)("fail_no_alt"); + } + if (alt.length === 0) + return (0, IRule_1.RulePass)("pass"); + } + else { + if (title.trim().length === 0) { + // title contains blank space only (title=" ") + return (0, IRule_1.RuleFail)("fail_blank_title"); + } + // title contains some text (title="some text") + return (0, IRule_1.RulePass)("pass"); + } + } + else { + if (alt.length === 0 || alt.trim().length > 0) { + // the img has empty alt (alt="") or non-empty alt (alt="some text") + return (0, IRule_1.RulePass)("pass"); + } + else { + // alt contains blank space only (alt=" ") + return (0, IRule_1.RuleFail)("fail_blank_alt"); + } + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/img_ismap_misuse.ts" +/*!******************************************!*\ + !*** ./src/v4/rules/img_ismap_misuse.ts ***! + \******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_ismap_misuse = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.img_ismap_misuse = { + id: "img_ismap_misuse", + context: "dom:img[ismap]", + refactor: { + "RPT_Img_UsemapValid": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "img_ismap_misuse.html", + "Potential_1": "img_ismap_misuse.html", + "group": "img_ismap_misuse.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Server-side image map hot-spots do not have duplicate text links", + "group": "Server-side image map hot-spots must have duplicate text links" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = false; + if (ruleContext.hasAttribute("usemap")) { + var usemap = ruleContext.getAttribute("usemap"); + usemap = usemap.trim().toLowerCase(); + var idx = usemap.indexOf("#"); + if (idx != -1) + usemap = usemap.substr(idx + 1); + if (usemap.length > 0) { + var maps = CommonUtil_1.CommonUtil.getDocElementsByTag(ruleContext, "map"); + for (var i = 0; !passed && i < maps.length; ++i) { + passed = maps[i].hasAttribute("name") && + maps[i].getAttribute("name").toLowerCase() == usemap; + } + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/img_longdesc_misuse.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/img_longdesc_misuse.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.img_longdesc_misuse = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.img_longdesc_misuse = { + id: "img_longdesc_misuse", + context: "dom:img[longdesc]", + refactor: { + "RPT_Img_LongDescription2": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "img_longdesc_misuse.html", + "Potential_1": "img_longdesc_misuse.html", + "group": "img_longdesc_misuse.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that the file designated by the 'longdesc' attribute contains valid HTML content (file extension not recognized)", + "group": " The 'longdesc' attribute must reference HTML content" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var longdesc = ruleContext.getAttribute("longdesc"); + // if (longdesc is bad URL) passed = false; + var ext = CommonUtil_1.CommonUtil.getFileExt(longdesc); + var passed = ext.length != 0 && CommonUtil_1.CommonUtil.isHtmlExt(ext) + || longdesc.startsWith("#") + || longdesc.startsWith("http://") + || longdesc.startsWith("https://") + || longdesc.startsWith("data:"); + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/index.ts" +/*!*******************************!*\ + !*** ./src/v4/rules/index.ts ***! + \*******************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +// This file is automatically generated by "npm run prebuild". Do not edit +__exportStar(__webpack_require__(/*! ./a_target_warning */ "./src/v4/rules/a_target_warning.ts"), exports); +__exportStar(__webpack_require__(/*! ./a_text_purpose */ "./src/v4/rules/a_text_purpose.ts"), exports); +__exportStar(__webpack_require__(/*! ./applet_alt_exists */ "./src/v4/rules/applet_alt_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./application_content_accessible */ "./src/v4/rules/application_content_accessible.ts"), exports); +__exportStar(__webpack_require__(/*! ./area_alt_exists */ "./src/v4/rules/area_alt_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_accessiblename_exists */ "./src/v4/rules/aria_accessiblename_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_activedescendant_tabindex_valid */ "./src/v4/rules/aria_activedescendant_tabindex_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_activedescendant_valid */ "./src/v4/rules/aria_activedescendant_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_application_label_unique */ "./src/v4/rules/aria_application_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_application_labelled */ "./src/v4/rules/aria_application_labelled.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_article_label_unique */ "./src/v4/rules/aria_article_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_attribute_allowed */ "./src/v4/rules/aria_attribute_allowed.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_attribute_conflict */ "./src/v4/rules/aria_attribute_conflict.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_attribute_deprecated */ "./src/v4/rules/aria_attribute_deprecated.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_attribute_exists */ "./src/v4/rules/aria_attribute_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_attribute_redundant */ "./src/v4/rules/aria_attribute_redundant.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_attribute_required */ "./src/v4/rules/aria_attribute_required.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_attribute_value_valid */ "./src/v4/rules/aria_attribute_value_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_banner_label_unique */ "./src/v4/rules/aria_banner_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_banner_single */ "./src/v4/rules/aria_banner_single.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_child_tabbable */ "./src/v4/rules/aria_child_tabbable.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_child_valid */ "./src/v4/rules/aria_child_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_complementary_label_unique */ "./src/v4/rules/aria_complementary_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_complementary_label_visible */ "./src/v4/rules/aria_complementary_label_visible.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_complementary_labelled */ "./src/v4/rules/aria_complementary_labelled.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_content_in_landmark */ "./src/v4/rules/aria_content_in_landmark.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_contentinfo_label_unique */ "./src/v4/rules/aria_contentinfo_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_contentinfo_misuse */ "./src/v4/rules/aria_contentinfo_misuse.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_contentinfo_single */ "./src/v4/rules/aria_contentinfo_single.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_descendant_valid */ "./src/v4/rules/aria_descendant_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_document_label_unique */ "./src/v4/rules/aria_document_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_eventhandler_role_valid */ "./src/v4/rules/aria_eventhandler_role_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_form_label_unique */ "./src/v4/rules/aria_form_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_graphic_labelled */ "./src/v4/rules/aria_graphic_labelled.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_hidden_nontabbable */ "./src/v4/rules/aria_hidden_nontabbable.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_id_unique */ "./src/v4/rules/aria_id_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_img_labelled */ "./src/v4/rules/aria_img_labelled.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_keyboard_handler_exists */ "./src/v4/rules/aria_keyboard_handler_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_landmark_name_unique */ "./src/v4/rules/aria_landmark_name_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_main_label_unique */ "./src/v4/rules/aria_main_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_main_label_visible */ "./src/v4/rules/aria_main_label_visible.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_navigation_label_unique */ "./src/v4/rules/aria_navigation_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_parent_required */ "./src/v4/rules/aria_parent_required.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_region_label_unique */ "./src/v4/rules/aria_region_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_region_labelled */ "./src/v4/rules/aria_region_labelled.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_role_allowed */ "./src/v4/rules/aria_role_allowed.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_role_redundant */ "./src/v4/rules/aria_role_redundant.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_search_label_unique */ "./src/v4/rules/aria_search_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_semantics */ "./src/v4/rules/aria_semantics.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_toolbar_label_unique */ "./src/v4/rules/aria_toolbar_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./aria_widget_labelled */ "./src/v4/rules/aria_widget_labelled.ts"), exports); +__exportStar(__webpack_require__(/*! ./asciiart_alt_exists */ "./src/v4/rules/asciiart_alt_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./blink_css_review */ "./src/v4/rules/blink_css_review.ts"), exports); +__exportStar(__webpack_require__(/*! ./blink_elem_deprecated */ "./src/v4/rules/blink_elem_deprecated.ts"), exports); +__exportStar(__webpack_require__(/*! ./blockquote_cite_exists */ "./src/v4/rules/blockquote_cite_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./canvas_content_described */ "./src/v4/rules/canvas_content_described.ts"), exports); +__exportStar(__webpack_require__(/*! ./caption_track_exists */ "./src/v4/rules/caption_track_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./combobox_active_descendant */ "./src/v4/rules/combobox_active_descendant.ts"), exports); +__exportStar(__webpack_require__(/*! ./combobox_autocomplete_valid */ "./src/v4/rules/combobox_autocomplete_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./combobox_design_valid */ "./src/v4/rules/combobox_design_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./combobox_focusable_elements */ "./src/v4/rules/combobox_focusable_elements.ts"), exports); +__exportStar(__webpack_require__(/*! ./combobox_haspopup_valid */ "./src/v4/rules/combobox_haspopup_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./combobox_popup_reference */ "./src/v4/rules/combobox_popup_reference.ts"), exports); +__exportStar(__webpack_require__(/*! ./debug_paths */ "./src/v4/rules/debug_paths.ts"), exports); +__exportStar(__webpack_require__(/*! ./detector_tabbable */ "./src/v4/rules/detector_tabbable.ts"), exports); +__exportStar(__webpack_require__(/*! ./dir_attribute_valid */ "./src/v4/rules/dir_attribute_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./download_keyboard_controllable */ "./src/v4/rules/download_keyboard_controllable.ts"), exports); +__exportStar(__webpack_require__(/*! ./draggable_alternative_exists */ "./src/v4/rules/draggable_alternative_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_accesskey_labelled */ "./src/v4/rules/element_accesskey_labelled.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_accesskey_unique */ "./src/v4/rules/element_accesskey_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_attribute_deprecated */ "./src/v4/rules/element_attribute_deprecated.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_id_unique */ "./src/v4/rules/element_id_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_lang_valid */ "./src/v4/rules/element_lang_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_mouseevent_keyboard */ "./src/v4/rules/element_mouseevent_keyboard.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_orientation_unlocked */ "./src/v4/rules/element_orientation_unlocked.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_scrollable_tabbable */ "./src/v4/rules/element_scrollable_tabbable.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_tabbable_role_valid */ "./src/v4/rules/element_tabbable_role_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_tabbable_unobscured */ "./src/v4/rules/element_tabbable_unobscured.ts"), exports); +__exportStar(__webpack_require__(/*! ./element_tabbable_visible */ "./src/v4/rules/element_tabbable_visible.ts"), exports); +__exportStar(__webpack_require__(/*! ./embed_alt_exists */ "./src/v4/rules/embed_alt_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./emoticons_alt_exists */ "./src/v4/rules/emoticons_alt_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./error_message_exists */ "./src/v4/rules/error_message_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./fieldset_label_valid */ "./src/v4/rules/fieldset_label_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./fieldset_legend_valid */ "./src/v4/rules/fieldset_legend_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./figure_label_exists */ "./src/v4/rules/figure_label_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./form_font_color */ "./src/v4/rules/form_font_color.ts"), exports); +__exportStar(__webpack_require__(/*! ./form_interaction_review */ "./src/v4/rules/form_interaction_review.ts"), exports); +__exportStar(__webpack_require__(/*! ./form_label_unique */ "./src/v4/rules/form_label_unique.ts"), exports); +__exportStar(__webpack_require__(/*! ./form_submit_button_exists */ "./src/v4/rules/form_submit_button_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./form_submit_review */ "./src/v4/rules/form_submit_review.ts"), exports); +__exportStar(__webpack_require__(/*! ./frame_src_valid */ "./src/v4/rules/frame_src_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./frame_title_exists */ "./src/v4/rules/frame_title_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./heading_content_exists */ "./src/v4/rules/heading_content_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./heading_markup_misuse */ "./src/v4/rules/heading_markup_misuse.ts"), exports); +__exportStar(__webpack_require__(/*! ./html_lang_exists */ "./src/v4/rules/html_lang_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./html_skipnav_exists */ "./src/v4/rules/html_skipnav_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./iframe_interactive_tabbable */ "./src/v4/rules/iframe_interactive_tabbable.ts"), exports); +__exportStar(__webpack_require__(/*! ./imagebutton_alt_exists */ "./src/v4/rules/imagebutton_alt_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./imagemap_alt_exists */ "./src/v4/rules/imagemap_alt_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./img_alt_background */ "./src/v4/rules/img_alt_background.ts"), exports); +__exportStar(__webpack_require__(/*! ./img_alt_decorative */ "./src/v4/rules/img_alt_decorative.ts"), exports); +__exportStar(__webpack_require__(/*! ./img_alt_misuse */ "./src/v4/rules/img_alt_misuse.ts"), exports); +__exportStar(__webpack_require__(/*! ./img_alt_null */ "./src/v4/rules/img_alt_null.ts"), exports); +__exportStar(__webpack_require__(/*! ./img_alt_redundant */ "./src/v4/rules/img_alt_redundant.ts"), exports); +__exportStar(__webpack_require__(/*! ./img_alt_valid */ "./src/v4/rules/img_alt_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./img_ismap_misuse */ "./src/v4/rules/img_ismap_misuse.ts"), exports); +__exportStar(__webpack_require__(/*! ./img_longdesc_misuse */ "./src/v4/rules/img_longdesc_misuse.ts"), exports); +__exportStar(__webpack_require__(/*! ./input_autocomplete_valid */ "./src/v4/rules/input_autocomplete_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./input_checkboxes_grouped */ "./src/v4/rules/input_checkboxes_grouped.ts"), exports); +__exportStar(__webpack_require__(/*! ./input_fields_grouped */ "./src/v4/rules/input_fields_grouped.ts"), exports); +__exportStar(__webpack_require__(/*! ./input_haspopup_conflict */ "./src/v4/rules/input_haspopup_conflict.ts"), exports); +__exportStar(__webpack_require__(/*! ./input_label_after */ "./src/v4/rules/input_label_after.ts"), exports); +__exportStar(__webpack_require__(/*! ./input_label_before */ "./src/v4/rules/input_label_before.ts"), exports); +__exportStar(__webpack_require__(/*! ./input_label_exists */ "./src/v4/rules/input_label_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./input_label_visible */ "./src/v4/rules/input_label_visible.ts"), exports); +__exportStar(__webpack_require__(/*! ./input_onchange_review */ "./src/v4/rules/input_onchange_review.ts"), exports); +__exportStar(__webpack_require__(/*! ./input_placeholder_label_visible */ "./src/v4/rules/input_placeholder_label_visible.ts"), exports); +__exportStar(__webpack_require__(/*! ./label_content_exists */ "./src/v4/rules/label_content_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./label_name_visible */ "./src/v4/rules/label_name_visible.ts"), exports); +__exportStar(__webpack_require__(/*! ./label_ref_valid */ "./src/v4/rules/label_ref_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./list_children_valid */ "./src/v4/rules/list_children_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./list_markup_review */ "./src/v4/rules/list_markup_review.ts"), exports); +__exportStar(__webpack_require__(/*! ./list_structure_proper */ "./src/v4/rules/list_structure_proper.ts"), exports); +__exportStar(__webpack_require__(/*! ./marquee_elem_avoid */ "./src/v4/rules/marquee_elem_avoid.ts"), exports); +__exportStar(__webpack_require__(/*! ./media_alt_brief */ "./src/v4/rules/media_alt_brief.ts"), exports); +__exportStar(__webpack_require__(/*! ./media_alt_exists */ "./src/v4/rules/media_alt_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./media_audio_transcribed */ "./src/v4/rules/media_audio_transcribed.ts"), exports); +__exportStar(__webpack_require__(/*! ./media_autostart_controllable */ "./src/v4/rules/media_autostart_controllable.ts"), exports); +__exportStar(__webpack_require__(/*! ./media_keyboard_controllable */ "./src/v4/rules/media_keyboard_controllable.ts"), exports); +__exportStar(__webpack_require__(/*! ./media_live_captioned */ "./src/v4/rules/media_live_captioned.ts"), exports); +__exportStar(__webpack_require__(/*! ./media_track_available */ "./src/v4/rules/media_track_available.ts"), exports); +__exportStar(__webpack_require__(/*! ./meta_redirect_optional */ "./src/v4/rules/meta_redirect_optional.ts"), exports); +__exportStar(__webpack_require__(/*! ./meta_refresh_delay */ "./src/v4/rules/meta_refresh_delay.ts"), exports); +__exportStar(__webpack_require__(/*! ./meta_viewport_zoomable */ "./src/v4/rules/meta_viewport_zoomable.ts"), exports); +__exportStar(__webpack_require__(/*! ./noembed_content_exists */ "./src/v4/rules/noembed_content_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./object_text_exists */ "./src/v4/rules/object_text_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./page_title_exists */ "./src/v4/rules/page_title_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./page_title_valid */ "./src/v4/rules/page_title_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./script_focus_blur_review */ "./src/v4/rules/script_focus_blur_review.ts"), exports); +__exportStar(__webpack_require__(/*! ./script_onclick_avoid */ "./src/v4/rules/script_onclick_avoid.ts"), exports); +__exportStar(__webpack_require__(/*! ./script_onclick_misuse */ "./src/v4/rules/script_onclick_misuse.ts"), exports); +__exportStar(__webpack_require__(/*! ./script_select_review */ "./src/v4/rules/script_select_review.ts"), exports); +__exportStar(__webpack_require__(/*! ./select_options_grouped */ "./src/v4/rules/select_options_grouped.ts"), exports); +__exportStar(__webpack_require__(/*! ./skip_main_described */ "./src/v4/rules/skip_main_described.ts"), exports); +__exportStar(__webpack_require__(/*! ./skip_main_exists */ "./src/v4/rules/skip_main_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./style_background_decorative */ "./src/v4/rules/style_background_decorative.ts"), exports); +__exportStar(__webpack_require__(/*! ./style_before_after_review */ "./src/v4/rules/style_before_after_review.ts"), exports); +__exportStar(__webpack_require__(/*! ./style_color_misuse */ "./src/v4/rules/style_color_misuse.ts"), exports); +__exportStar(__webpack_require__(/*! ./style_focus_visible */ "./src/v4/rules/style_focus_visible.ts"), exports); +__exportStar(__webpack_require__(/*! ./style_highcontrast_visible */ "./src/v4/rules/style_highcontrast_visible.ts"), exports); +__exportStar(__webpack_require__(/*! ./style_hover_persistent */ "./src/v4/rules/style_hover_persistent.ts"), exports); +__exportStar(__webpack_require__(/*! ./style_viewport_resizable */ "./src/v4/rules/style_viewport_resizable.ts"), exports); +__exportStar(__webpack_require__(/*! ./svg_graphics_labelled */ "./src/v4/rules/svg_graphics_labelled.ts"), exports); +__exportStar(__webpack_require__(/*! ./table_aria_descendants */ "./src/v4/rules/table_aria_descendants.ts"), exports); +__exportStar(__webpack_require__(/*! ./table_caption_empty */ "./src/v4/rules/table_caption_empty.ts"), exports); +__exportStar(__webpack_require__(/*! ./table_caption_nested */ "./src/v4/rules/table_caption_nested.ts"), exports); +__exportStar(__webpack_require__(/*! ./table_headers_exists */ "./src/v4/rules/table_headers_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./table_headers_ref_valid */ "./src/v4/rules/table_headers_ref_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./table_headers_related */ "./src/v4/rules/table_headers_related.ts"), exports); +__exportStar(__webpack_require__(/*! ./table_layout_linearized */ "./src/v4/rules/table_layout_linearized.ts"), exports); +__exportStar(__webpack_require__(/*! ./table_scope_valid */ "./src/v4/rules/table_scope_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./table_structure_misuse */ "./src/v4/rules/table_structure_misuse.ts"), exports); +__exportStar(__webpack_require__(/*! ./table_summary_redundant */ "./src/v4/rules/table_summary_redundant.ts"), exports); +__exportStar(__webpack_require__(/*! ./target_spacing_sufficient */ "./src/v4/rules/target_spacing_sufficient.ts"), exports); +__exportStar(__webpack_require__(/*! ./text_block_heading */ "./src/v4/rules/text_block_heading.ts"), exports); +__exportStar(__webpack_require__(/*! ./text_contrast_sufficient */ "./src/v4/rules/text_contrast_sufficient.ts"), exports); +__exportStar(__webpack_require__(/*! ./text_quoted_correctly */ "./src/v4/rules/text_quoted_correctly.ts"), exports); +__exportStar(__webpack_require__(/*! ./text_sensory_misuse */ "./src/v4/rules/text_sensory_misuse.ts"), exports); +__exportStar(__webpack_require__(/*! ./text_spacing_valid */ "./src/v4/rules/text_spacing_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./text_whitespace_valid */ "./src/v4/rules/text_whitespace_valid.ts"), exports); +__exportStar(__webpack_require__(/*! ./widget_tabbable_exists */ "./src/v4/rules/widget_tabbable_exists.ts"), exports); +__exportStar(__webpack_require__(/*! ./widget_tabbable_single */ "./src/v4/rules/widget_tabbable_single.ts"), exports); + + +/***/ }, + +/***/ "./src/v4/rules/input_autocomplete_valid.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/input_autocomplete_valid.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_autocomplete_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.input_autocomplete_valid = { + id: "input_autocomplete_valid", + context: "dom:input[autocomplete], dom:textarea[autocomplete], dom:select[autocomplete]", + refactor: { + "WCAG21_Input_Autocomplete": { + "Pass_0": "pass", + "Fail_1": "fail_inappropriate", + "Fail_2": "fail_invalid", + "Fail_attribute_incorrect": "fail_incorrect" + } + }, + help: { + "en-US": { + "group": "input_autocomplete_valid.html", + "pass": "input_autocomplete_valid.html", + "fail_inappropriate": "input_autocomplete_valid.html", + "fail_invalid": "input_autocomplete_valid.html", + "fail_incorrect": "input_autocomplete_valid.html" + } + }, + messages: { + "en-US": { + "group": "The 'autocomplete' attribute's token(s) must be appropriate for the input form field", + "pass": "The 'autocomplete' attribute's token(s) is appropriate for the input form field", + "fail_inappropriate": "The 'autocomplete' attribute's token(s) are not appropriate for the input form field", + "fail_invalid": "The 'autocomplete' attribute's token(s) are not appropriate for an input form field of any type", + "fail_incorrect": "The 'autocomplete' attribute has an incorrect value" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.5"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [{ + "73f2c2": { + "pass": "pass", + "fail_inappropriate": "fail", + "fail_invalid": "pass", + "fail_incorrect": "fail" + } + }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) { + return null; + } + var autocompleteAttr = ruleContext.getAttribute("autocomplete").trim().toLowerCase(); + var tokens = autocompleteAttr.split(/\s+/); + if (tokens.length === 0 || autocompleteAttr.length === 0) { + return null; + } + var cache = { + "tokensOnOff": ["on", "off"], + "tokenOptionalSection": "section-", + "tokensOptionalPurpose": ["shipping", "billing"], + "tokensMandatoryGroup1_password": ["new-password", "current-password", "one-time-code"], + "tokensMandatoryGroup1_multiline": ["street-address"], + "tokensMandatoryGroup1_month": ["cc-exp"], + "tokensMandatoryGroup1_numeric": ["cc-exp-month", + "cc-exp-year", + "transaction-amount", + "bday-day", + "bday-month", + "bday-year"], + "tokensMandatoryGroup1_date": ["bday"], + "tokensMandatoryGroup1_url": ["url", "photo"], + "tokensMandatoryGroup1_text": ["name", + "honorific-prefix", + "given-name", + "additional-name", + "family-name", + "honorific-suffix", + "nickname", + "username", + "organization-title", + "organization", + "address-line1", + "address-line2", + "address-line3", + "address-level4", + "address-level3", + "address-level2", + "address-level1", + "country", + "country-name", + "postal-code", + "cc-name", + "cc-given-name", + "cc-additional-name", + "cc-family-name", + "cc-number", + "cc-csc", + "cc-type", + "transaction-currency", + "language", + "sex"], + "tokensMandatoryGroup1_all": ["name", + "honorific-prefix", + "given-name", + "additional-name", + "family-name", + "honorific-suffix", + "nickname", + "username", + "new-password", + "current-password", + "organization-title", + "organization", + "street-address", + "address-line1", + "address-line2", + "address-line3", + "address-level4", + "address-level3", + "address-level2", + "address-level1", + "country", + "country-name", + "postal-code", + "cc-name", + "cc-given-name", + "cc-additional-name", + "cc-family-name", + "cc-number", + "cc-exp", + "cc-exp-month", + "cc-exp-year", + "cc-csc", + "cc-type", + "transaction-currency", + "transaction-amount", + "language", + "bday", + "bday-day", + "bday-month", + "bday-year", + "sex", + "url", + "photo"], + "tokensOptionalGroup2": ["home", + "work", + "mobile", + "fax", + "pager"], + "tokensMandatoryGroup2_tel": ["tel"], + "tokensMandatoryGroup2_email": ["email"], + "tokensMandatoryGroup2_url": ["impp"], + "tokensMandatoryGroup2_text": ["tel-country-code", + "tel-national", + "tel-area-code", + "tel-local", + "tel-local-prefix", + "tel-local-suffix", + "tel-extension"], + "tokensMandatoryGroup2_all": ["tel", + "tel-country-code", + "tel-national", + "tel-area-code", + "tel-local", + "tel-local-prefix", + "tel-local-suffix", + "tel-extension", + "email", + "impp"], + "tokensOptionGroup1_webauthn": ["webauthn"] + }; + var valid_values = []; + for (var key in cache) + valid_values = valid_values.concat(cache[key]); + var foundMandatoryToken = false; + var foundRecognizedToken = true; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (!tokens.every(function (r) { return valid_values.includes(r) || r.startsWith(cache['tokenOptionalSection']); })) + return (0, IRule_1.RuleFail)("fail_incorrect"); + var type = ruleContext.hasAttribute("type") ? ruleContext.getAttribute("type").trim().toLowerCase() : "text"; + var tokensMandatoryGroup1 = []; + var tokensMandatoryGroup2 = []; + var tokensOptionalGroup = []; + if (nodeName === "textarea" || nodeName === "select") { + // accept all tokens + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_all; + tokensMandatoryGroup2 = cache.tokensMandatoryGroup2_all; + if (nodeName === "textarea") + tokensOptionalGroup = cache.tokensOptionGroup1_webauthn; + } + else if (nodeName === "input") { + tokensOptionalGroup = cache.tokensOptionGroup1_webauthn; + // handle the various 'input' types + switch (type) { + // Disable check for input type=hidden for now based on scrum discussion + /* + case "hidden": + // accept all tokens + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_all; + tokensMandatoryGroup2 = cache.tokensMandatoryGroup2_all; + break; + */ + case "text": + case "search": + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_text.concat(cache.tokensMandatoryGroup1_password, cache.tokensMandatoryGroup1_url, cache.tokensMandatoryGroup1_numeric, cache.tokensMandatoryGroup1_month, cache.tokensMandatoryGroup1_date); + tokensMandatoryGroup2 = cache.tokensMandatoryGroup2_all; + break; + case "password": + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_password; + break; + case "url": + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_url; + tokensMandatoryGroup2 = cache.tokensMandatoryGroup2_url; + break; + case "email": + tokensMandatoryGroup2 = cache.tokensMandatoryGroup2_email; + break; + case "tel": + tokensMandatoryGroup2 = cache.tokensMandatoryGroup2_tel; + break; + case "number": + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_numeric; + break; + case "month": + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_month; + break; + case "date": + tokensMandatoryGroup1 = cache.tokensMandatoryGroup1_date; + break; + default: + // unsupported type for this rule. + return null; + } + } + else { + // should never get here. + return null; + } + // Disable check for input type=hidden for now based on scrum discussion + var autofillMantle = /* (nodeName==="input" && type==="hidden") ? "anchor" : */ "expectation"; + if (autofillMantle === "expectation") { + // check on|off for expectation mantle. + if (tokens.includes("on") || tokens.includes("off")) { + // on|off should be the only token + if (tokens.length === 1) { + return (0, IRule_1.RulePass)("pass"); + } + else { + return (0, IRule_1.RuleFail)("fail_invalid"); + } + } + } + // check detail autofill tokens + var currIndex = 0; + var currRecognizedIndex = 0; + // check optional 'section-*' tokens + if (tokens[currIndex].startsWith(cache.tokenOptionalSection) && + tokens[currIndex].length > 8) { + currIndex++; // consume token + currRecognizedIndex++; + } + // check optional 'shipping|billing' tokens + if (tokens.length > currIndex && + cache.tokensOptionalPurpose.includes(tokens[currIndex])) { + currIndex++; // consume token + currRecognizedIndex++; + } + // check either mandatory group 1 or 2 tokens + if (tokens.length > currIndex) { + // check mandatory group 1 + if (tokensMandatoryGroup1.includes(tokens[currIndex])) { + foundMandatoryToken = true; + currIndex++; + } + else { + // check optional tokens for group 2 + if (cache.tokensOptionalGroup2.includes(tokens[currIndex])) { + currIndex++; + } + // check mandatory group 2 + if (tokensMandatoryGroup2.includes(tokens[currIndex])) { + foundMandatoryToken = true; + currIndex++; + } + } + } + // check either mandatory group 1 or 2 tokens + if (tokens.length > currRecognizedIndex) { + // check mandatory group 1 + if (cache.tokensMandatoryGroup1_all.includes(tokens[currRecognizedIndex])) { + foundRecognizedToken = true; + currRecognizedIndex++; + } + else { + // check optional tokens for group 2 + if (cache.tokensOptionalGroup2.includes(tokens[currRecognizedIndex])) { + currRecognizedIndex++; + } + // check mandatory group 2 + if (cache.tokensMandatoryGroup2_all.includes(tokens[currRecognizedIndex])) { + foundRecognizedToken = true; + currRecognizedIndex++; + } + } + } + if (tokens.length > currIndex + currRecognizedIndex) { + // check optional tokens webauthn + if (tokensOptionalGroup.includes(tokens[currIndex + currRecognizedIndex])) { + currIndex++; + } + } + if ((tokens.length > currIndex && tokensOptionalGroup.includes(tokens[currIndex])) + || (tokens.length > currRecognizedIndex && tokensOptionalGroup.includes(tokens[currRecognizedIndex]))) { + currIndex++; + currRecognizedIndex++; + } + // Only pass if we have seen either of the mandatory groups and all tokens have been consumed + if (foundMandatoryToken && tokens.length === currIndex) { + return (0, IRule_1.RulePass)("pass"); + } + else if (foundRecognizedToken && tokens.length === currRecognizedIndex) { + return (0, IRule_1.RuleFail)("fail_incorrect"); + } + else { + return (0, IRule_1.RuleFail)("fail_inappropriate"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/input_checkboxes_grouped.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/input_checkboxes_grouped.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_checkboxes_grouped = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var TableUtil_1 = __webpack_require__(/*! ../util/TableUtil */ "./src/v4/util/TableUtil.ts"); +exports.input_checkboxes_grouped = { + id: "input_checkboxes_grouped", + context: "dom:input[type=radio], dom:input[type=checkbox]", + refactor: { + "WCAG20_Input_RadioChkInFieldSet": { + "Pass_LoneNogroup": "pass_lonenogroup", + "Pass_Grouped": "pass_grouped", + "Pass_RadioNoName": "pass_radioNoName", + "Fail_ControlNameMismatch": "fail_controlnamemismatch", + "Fail_NotGroupedOtherGrouped": "fail_notgroupedothergrouped", + "Fail_NotGroupedOtherNotGrouped": "fail_notgroupedothernotgrouped", + "Fail_NotSameGroup": "fail_notsamegroup", + "Potential_LoneCheckbox": "potential_lonecheckbox", + "Potential_UnnamedCheckbox": "potential_unnamedcheckbox" + } + }, + help: { + "en-US": { + "group": "input_checkboxes_grouped.html", + "pass_lonenogroup": "input_checkboxes_grouped.html", + "pass_grouped": "input_checkboxes_grouped.html", + "pass_radiononame": "input_checkboxes_grouped.html", + "fail_controlnamemismatch": "input_checkboxes_grouped.html", + "fail_notgroupedothergrouped": "input_checkboxes_grouped.html", + "fail_notgroupedothernotgrouped": "input_checkboxes_grouped.html", + "fail_notsamegroup": "input_checkboxes_grouped.html", + "potential_lonecheckbox": "input_checkboxes_grouped.html", + "potential_unnamedcheckbox": "input_checkboxes_grouped.html" + } + }, + messages: { + "en-US": { + "group": "Related sets of radio buttons or checkboxes should be programmatically grouped", + "pass_lonenogroup": "{0} grouping not required for a control of this type", + "pass_grouped": "{0} input is grouped with other related controls with the same name", + "pass_radiononame": "Radio input is not grouped, but passes because it has no name to group with other radio inputs", + "fail_controlnamemismatch": "{0} input found that has the same name, \"{2}\" as a {1} input", + "fail_notgroupedothergrouped": "{0} input is not in the group with another {0} with the name \"{1}\"", + "fail_notgroupedothernotgrouped": "{0} input and others with the name \"{1}\" are not grouped together", + "fail_notsamegroup": "{0} input is in a different group than another {0} with the name \"{1}\"", + "potential_lonecheckbox": "Verify that this ungrouped checkbox input is not related to other checkboxes", + "potential_unnamedcheckbox": "Verify that this un-named, ungrouped checkbox input is not related to other checkboxes" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var getGroup = function (e) { + var retVal = CommonUtil_1.CommonUtil.getAncestor(e, "fieldset") + || AriaUtil_1.AriaUtil.getAncestorWithRole(e, "radiogroup") + || AriaUtil_1.AriaUtil.getAncestorWithRole(e, "group") + || AriaUtil_1.AriaUtil.getAncestorWithRole(e, "grid") + || AriaUtil_1.AriaUtil.getAncestorWithRole(e, "table"); + if (!retVal) { + retVal = CommonUtil_1.CommonUtil.getAncestor(e, "table"); + if (retVal && !TableUtil_1.TableUtil.isDataTable(retVal)) { + retVal = null; + } + } + return retVal; + }; + // Only radio buttons and checkboxes are in scope + var ctxType = ruleContext.getAttribute("type").toLowerCase(); + // Determine which form we're in (if any) to determine our scope + var ctxForm = AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, "form") + || CommonUtil_1.CommonUtil.getAncestor(ruleContext, "html") + || ruleContext.ownerDocument.documentElement; + // Get data about all of the visible checkboxes and radios in the scope of this form + // and cache it for all of the other inputs in this scope + var formCache = CacheUtil_1.CacheUtil.getCache(ctxForm, "input_checkboxes_grouped", null); + if (!formCache) { + formCache = { + checkboxByName: {}, + radiosByName: {}, + nameToGroup: {}, + numCheckboxes: 0, + numRadios: 0 + }; + // Get all of the checkboxes in the form or body (but not nested in something else and not hidden) + // And get a mapping of these checkboxes to + var cWalker = new DOMWalker_1.DOMWalker(ctxForm, false, ctxForm, true); + var checkboxQ = []; + var radiosQ = []; + while (cWalker.nextNode()) { + if (!cWalker.bEndTag + && cWalker.node.nodeType === 1 + && cWalker.node.nodeName.toLowerCase() === "input" + && VisUtil_1.VisUtil.isNodeVisible(cWalker.node)) { + var type = cWalker.node.getAttribute("type"); + if (type === "checkbox") { + checkboxQ.push(cWalker.node); + } + else if (type === "radio") { + radiosQ.push(cWalker.node); + } + } + } + // let checkboxQ = ctxForm.querySelectorAll("input[type=checkbox]"); + for (var idx = 0; idx < checkboxQ.length; ++idx) { + var cb = checkboxQ[idx]; + if ((AriaUtil_1.AriaUtil.getAncestorWithRole(cb, "form") + || CommonUtil_1.CommonUtil.getAncestor(ruleContext, "html") + || ruleContext.ownerDocument.documentElement) === ctxForm + && !CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(cb)) { + var name_1 = cb.getAttribute("name") || ""; + (formCache.checkboxByName[name_1] = formCache.checkboxByName[name_1] || []).push(cb); + formCache.nameToGroup[name_1] = formCache.nameToGroup[name_1] || getGroup(cb); + ++formCache.numCheckboxes; + } + } + // Get all of the radios in the form or body (but not nested in something else and not hidden) + // let radiosQ = ctxForm.querySelectorAll("input[type=radio]"); + for (var idx = 0; idx < radiosQ.length; ++idx) { + var r = radiosQ[idx]; + var radCtx = (AriaUtil_1.AriaUtil.getAncestorWithRole(r, "form") + || CommonUtil_1.CommonUtil.getAncestor(ruleContext, "html") + || ruleContext.ownerDocument.documentElement); + if (radCtx === ctxForm + && !CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(r)) { + var name_2 = r.getAttribute("name") || ""; + (formCache.radiosByName[name_2] = formCache.radiosByName[name_2] || []).push(r); + formCache.nameToGroup[name_2] = formCache.nameToGroup[name_2] || getGroup(r); + ++formCache.numRadios; + } + } + CacheUtil_1.CacheUtil.setCache(ctxForm, "input_checkboxes_grouped", formCache); + } + ///////////// Calculated everything, now check the various cases + var ctxName = ruleContext.getAttribute("name"); + var ctxGroup = getGroup(ruleContext); + ctxType = ctxType === "radio" ? "Radio" : "Checkbox"; + if (!ctxName || ctxName === "") { + // First process cases where the control is not named + if (ctxType === "Radio") { + // Radios without names don't act like groups, so don't enforce grouping + if (ctxGroup === null) { + return (0, IRule_1.RulePass)("pass_radiononame", [ctxType]); + } + else { + return (0, IRule_1.RulePass)("pass_grouped", [ctxType]); + } + } + else { + // Must be an unnamed checkbox + if (ctxGroup === null) { + if ((formCache.checkboxByName[""] || []).length > 1) { + return (0, IRule_1.RulePotential)("potential_unnamedcheckbox", [ctxType]); + } + else { + return (0, IRule_1.RulePass)("pass_lonenogroup", [ctxType]); + } + } + else { + return (0, IRule_1.RulePass)("pass_grouped", [ctxType]); + } + } + } + else { + // Considering a named checkbox + var numRadiosWithName = (formCache.radiosByName[ctxName] || []).length; + var numCheckboxesWithName = (formCache.checkboxByName[ctxName] || []).length; + // Capitalize the input type for messages + if (numRadiosWithName > 0 && numCheckboxesWithName > 0) { + // We have a naming mismatch between different controls + return (0, IRule_1.RuleFail)("fail_controlnamemismatch", [ctxType, ctxType === "checkbox" ? "radio" : "checkbox", ctxName]); + } + else if (ctxType === "Radio" && (formCache.numRadios === 1 || numRadiosWithName === 1) + || ctxType === "Checkbox" && formCache.numCheckboxes === 1) { + // This is a lone control (either only control of this type on the page, or a radio button without any others by that name) + // We pass this control in all cases + if (ctxGroup === null) { + return (0, IRule_1.RulePass)("pass_lonenogroup", [ctxType]); + } + else { + return (0, IRule_1.RulePass)("pass_grouped", [ctxType]); + } + } + else if (ctxType === "Checkbox" && formCache.numCheckboxes > 1 && numCheckboxesWithName === 1) { + // We have only one checkbox with this name, but there are other checkboxes in the form. + // If we're not grouped, ask them to examine it + if (ctxGroup === null) { + return (0, IRule_1.RulePotential)("potential_lonecheckbox", [ctxType]); + } + else { + return (0, IRule_1.RulePass)("pass_grouped", [ctxType]); + } + } + else { + // We share a name with another similar control. Are we grouped together? + if (ctxGroup === null) { + if (formCache.nameToGroup[ctxName] !== null) { + // We're not grouped, but some control with the same name is in a group + return (0, IRule_1.RuleFail)("fail_notgroupedothergrouped", [ctxType, ctxName]); + } + else { + // None of us are grouped + return (0, IRule_1.RuleFail)("fail_notgroupedothernotgrouped", [ctxType, ctxName]); + } + } + else if (formCache.nameToGroup[ctxName] !== ctxGroup) { + // We're not in the main group with the others + return (0, IRule_1.RuleFail)("fail_notsamegroup", [ctxType, ctxName]); + } + else { + // We're all grouped up! + return (0, IRule_1.RulePass)("pass_grouped", [ctxType]); + } + } + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/input_fields_grouped.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/input_fields_grouped.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_fields_grouped = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.input_fields_grouped = { + id: "input_fields_grouped", + context: "dom:input, dom:textarea, dom:select", + refactor: { + "WCAG20_Input_InFieldSet": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "input_fields_grouped.html", + "Potential_1": "input_fields_grouped.html", + "group": "input_fields_grouped.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Use the <fieldset> element to group logically related input elements", + "group": "Groups of logically related input elements should be contained within a <fieldset> element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Don't trigger for other input types or if we're in a fieldset + if (ruleContext.nodeName.toLowerCase() == "input" && ruleContext.hasAttribute("type")) { + var type = ruleContext.getAttribute("type").toLowerCase(); + if (type != "text" && type != "file" && type != "password") + return (0, IRule_1.RulePass)("Pass_0"); + } + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, "fieldset") != null) + return (0, IRule_1.RulePass)("Pass_0"); + // No fieldset - see if this input is all by itself - no need to group single inputs + var parent = CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["form", "body"]); + var checkTypes = ["input", "textarea", "select"]; + var passed = true; + for (var i = 0; passed && i < checkTypes.length; ++i) { + var controls = parent.getElementsByTagName(checkTypes[i]); + for (var j = 0; passed && j < controls.length; ++j) { + // Check if the node should be skipped or not based on the Check Hidden Content setting and if the node isVisible or + // not. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(controls[j])) { + continue; + } + // Note that textareas and selects will be called type='text' + var type = controls[j].hasAttribute("type") ? controls[j].getAttribute("type").toLowerCase() : "text"; + // Only fail if this is another control in the form and its type is another text-like input + passed = controls[j] == ruleContext || (type != "text" && type != "password" && type != "file"); + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/input_haspopup_conflict.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/input_haspopup_conflict.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_haspopup_conflict = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.input_haspopup_conflict = { + id: "input_haspopup_conflict", + context: "dom:input[list][aria-haspopup]", + refactor: { + "input_haspopup_invalid": { + // "Pass": "pass", + "Potential_1": "potential_type_misuse", + "Potential_2": "potential_misuse" + } + }, + help: { + "en-US": { + "group": "input_haspopup_conflict.html", + // "pass": "input_haspopup_conflict.html", + "potential_type_misuse": "input_haspopup_conflict.html", + "potential_misuse": "input_haspopup_conflict.html", + "potential_list_notexist": "input_haspopup_conflict.html", + "fail_invalid_list_type": "input_haspopup_conflict.html", + "fail_invalid_list_elem": "input_haspopup_conflict.html" + } + }, + messages: { + "en-US": { + "group": "<input> element with a 'list' attribute should not use an explicit 'aria-haspopup' attribute", + // "pass": "The <input> element with a 'list' attribute does not use an explicit 'aria-haspopup' attribute", + "potential_type_misuse": "The <input> element with type \"{0}\" and 'list' attribute uses an explicit 'aria-haspopup' attribute", + "potential_misuse": "The <input> element with a missing or invalid type and 'list' attribute uses an explicit 'aria-haspopup' attribute", + "potential_list_notexist": "The list attribute for the <input> element is invalid", + "fail_invalid_list_type": "The list attribute for the <input> element with the type \"{0}\" is invalid", + "fail_invalid_list_elem": "The list attribute for the <input> element does not reference a datalist element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip if the fieldset is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return null; + var roles = AriaUtil_1.AriaUtil.getUserDefinedRoles(ruleContext); + // let "aria_role_valid" to handle invalid role. Only allowed role is combobox which is implicit. + if (roles && roles.length > 0 && !roles.includes('combobox')) + return null; + //triggering input types: text, search, tel, url, email, or missing or invalid + var yesTypes = ["text", "search", "tel", "url", "email", "date", "month", "week", "time", "datetime-local", "number", "range", "color"]; + var noTypes = ["file", "password", "checkbox", "radio", "submit", "reset", "image", "hidden", "button"]; + var attrValue = ruleContext.getAttribute("type"); + //missing input type for list but with aria_has_popup + if (!attrValue || attrValue.trim().length === 0) + return (0, IRule_1.RulePotential)("potential_misuse"); + attrValue = attrValue.trim().toLowerCase(); + //invalid input types for list but with aria_has_popup + if (!yesTypes.includes(attrValue) && !noTypes.includes(attrValue)) + return (0, IRule_1.RulePotential)("potential_misuse"); + // the list attribute is used for wrong input type + if (attrValue && noTypes.includes(attrValue)) + return (0, IRule_1.RuleFail)("fail_invalid_list_type"); + var list = ruleContext.getAttribute("list"); + // the list attribute is blank + if (!list || list.trim().length === 0) + return (0, IRule_1.RulePotential)("potential_list_notexist"); + var listElem = ruleContext.ownerDocument.getElementById(list); + // the list element doesn't exist + if (!listElem) + return (0, IRule_1.RuleFail)("potential_list_notexist"); + // the list element is not a datalist element + if (listElem.nodeName.toLowerCase() !== 'datalist') + return (0, IRule_1.RuleFail)("fail_invalid_list_elem"); + // valid input types for list but with aria_has_popup + if (yesTypes.includes(attrValue)) + return (0, IRule_1.RulePotential)("potential_type_misuse", [attrValue]); + // shouldn't get here + return; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/input_label_after.ts" +/*!*******************************************!*\ + !*** ./src/v4/rules/input_label_after.ts ***! + \*******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_label_after = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.input_label_after = { + id: "input_label_after", + context: "dom:input", + refactor: { + "WCAG20_Input_LabelAfter": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_0": "input_label_after.html", + "Fail_1": "input_label_after.html", + "Fail_2": "input_label_after.html", + "group": "input_label_after.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Checkbox or radio button is nested in label, so label is not after the input control", + "Fail_2": "Label text is located before its associated checkbox or radio button element", + "group": "Checkboxes and radio buttons must have a label after the input control" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.3.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var type = ""; + if (ruleContext.hasAttribute("type")) + type = ruleContext.getAttribute("type").toLowerCase(); + if (type != "checkbox" && type != "radio") { + return null; + } + // Get only the non-hidden labels for element + var labelElem = CommonUtil_1.CommonUtil.getLabelForElementHidden(ruleContext, true); + if (labelElem === null || !CommonUtil_1.CommonUtil.hasInnerContentHidden(labelElem)) { + // Due to dependency, label must be done via title - this rule doesn't apply + return null; + } + var value = CommonUtil_1.CommonUtil.compareNodeOrder(labelElem, ruleContext); + var passed; + if (value === -2) { + // input nested in label + passed = false; + var walkNode = new DOMWalker_1.DOMWalker(labelElem); + walkNode.node = ruleContext; + while (!passed && walkNode.nextNode()) { + passed = ((walkNode.node.nodeName.toLowerCase() === "#text" && walkNode.node.nodeValue.trim().length > 0) + || (walkNode.node.nodeName.toLowerCase() === "span" && walkNode.node.textContent.trim().length > 0)); + } + if (!passed) { + // Input nested in label and text before input + return (0, IRule_1.RuleFail)("Fail_1"); + } + } + else { + if (value != 1) { + // label is before input + return (0, IRule_1.RuleFail)("Fail_2"); + } + } + return (0, IRule_1.RulePass)("Pass_0"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/input_label_before.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/input_label_before.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_label_before = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.input_label_before = { + id: "input_label_before", + context: "dom:input, dom:textarea, dom:select", + refactor: { + "WCAG20_Input_LabelBefore": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_0": "input_label_before.html", + "Fail_1": "input_label_before.html", + "Fail_2": "input_label_before.html", + "group": "input_label_before.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Text input is nested in label such that input precedes the label text", + "Fail_2": "Label text is located after its associated text input or <select> element", + "group": "Text inputs and <select> elements must have a label before the input control" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.3.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (ruleContext.nodeName.toLowerCase() == "input" && ruleContext.hasAttribute("type")) { + var type = ruleContext.getAttribute("type").toLowerCase(); + if (type != "text" && type != "file" && type != "password") { + return null; + } + } + // Get only the non-hidden labels for element + var labelElem = CommonUtil_1.CommonUtil.getLabelForElementHidden(ruleContext, true); + if (labelElem == null || !CommonUtil_1.CommonUtil.hasInnerContentHidden(labelElem)) { + // Due to dependency, label must be done via title - this rule doesn't apply + return null; + } + var value = CommonUtil_1.CommonUtil.compareNodeOrder(labelElem, ruleContext); + if (value === -2) { + // ignore if no label or the content for the label is only from the nested input control + var text = CommonUtil_1.CommonUtil.getInnerText(ruleContext); + if (text && text.trim().length > 0 && CommonUtil_1.CommonUtil.getInnerText(ruleContext).trim() === text.trim()) { + // Due to dependency, label must be done via title - this rule doesn't apply + return null; + } + // input nested in label + var passed = false; + var walkNode = ruleContext.previousSibling; + while (!passed && walkNode !== null) { + passed = ((walkNode.nodeName.toLowerCase() == "#text" && walkNode.nodeValue.trim().length > 0) + || (walkNode.nodeName.toLowerCase() == "span" && walkNode.textContent.trim().length > 0)); + walkNode = walkNode.previousSibling; + } + if (!passed) { + // Input nested in label and text after input + return (0, IRule_1.RuleFail)("Fail_1"); + } + } + else { + if (value != -1) { + // label is after input + return (0, IRule_1.RuleFail)("Fail_2"); + } + } + // Haven't returned yet, then I pass + return (0, IRule_1.RulePass)("Pass_0"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/input_label_exists.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/input_label_exists.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_label_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +exports.input_label_exists = { + id: "input_label_exists", + context: "aria:button,aria:checkbox,aria:combobox,aria:listbox,aria:menuitemcheckbox,aria:menuitemradio,aria:radio,aria:searchbox,aria:slider,aria:spinbutton,aria:switch,aria:textbox,aria:progressbar,dom:input[type=file],dom:output,dom:meter,dom:input[type=password]", + //dependencies: ["aria_role_redundant", "aria_role_valid"], + refactor: { + "WCAG20_Input_ExplicitLabel": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_0": "input_label_exists.html", + "Fail_1": "input_label_exists.html", + "Fail_2": "input_label_exists.html", + "group": "input_label_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Form control element <{0}> has no associated label", + "Fail_2": "Form control with \"{0}\" role has no associated label", + "group": "Each form control must have an associated label" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + // TODO: ACT: https://github.com/IBMa/equal-access/issues/756 + act: ["97a4e1", "e086e5"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) { + return null; + } + var nodeName = ruleContext.nodeName.toLowerCase(); + //ignore datalist element check since it will be part of a input element or hidden by default + if (nodeName === 'datalist') + return null; + // Determine the input type + var passed = true; + var type = "text"; + if (nodeName == "input" && ruleContext.hasAttribute("type")) { + type = ruleContext.getAttribute("type").toLowerCase(); + } + else if (nodeName === "button" || AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "button")) { + type = "buttonelem"; + } + if (nodeName == "input" && type == "") { + type = "text"; + } + if (type === "image") { + // Handled by input_label_existsImage + return null; + } + /** + let POF = -1; + let textTypes = CommonUtil.input_text_types; + let buttonTypes = CommonUtil.form_button_types; + + let buttonTypesWithDefaults = ["reset", "submit"]; // 'submit' and 'reset' have visible defaults. + if (textTypes.indexOf(type) !== -1) { // If type is in the list + // Get only the non-hidden labels for elements, in the case that a label is hidden then it is a violation + // Note: label[for] does not work for ARIA defined inputs + let labelElem = ruleContext.hasAttribute("role") ? null : CommonUtil.getLabelForElementHidden(ruleContext, true); + let hasLabelElemContent = false; + if (labelElem) { + if (CommonUtil.hasInnerContentHidden(labelElem)) { + hasLabelElemContent = true; + } else if ((labelElem.getAttribute("aria-label") || "").trim().length > 0) { + hasLabelElemContent = true; + } else if (labelElem.hasAttribute("aria-labelledby")) { + let labelledByElem = FragmentUtil.getById(labelElem, labelElem.getAttribute('aria-labelledby')); + if (labelledByElem && !DOMUtil.sameNode(labelledByElem, labelElem) && CommonUtil.hasInnerContent(labelledByElem)) { + hasLabelElemContent = true; + } + } + } + passed = (!!labelElem && hasLabelElemContent) || + (!labelElem && CommonUtil.attributeNonEmpty(ruleContext, "title") || CommonUtil.attributeNonEmpty(ruleContext, "placeholder")) || + AriaUtil.getAriaLabel(ruleContext).trim().length > 0 || CommonUtil.hasImplicitLabel(ruleContext); + if (!passed) POF = 2 + textTypes.indexOf(type); + + } else if (buttonTypes.indexOf(type) !== -1) { // If type is a button + if (buttonTypesWithDefaults.indexOf(type) !== -1 && !ruleContext.hasAttribute("value")) { + // 'submit' and 'reset' have visible defaults so pass if there is no 'value' attribute + passed = true; + } else { + passed = CommonUtil.attributeNonEmpty(ruleContext, "value") || AriaUtil.hasAriaLabel(ruleContext) || CommonUtil.attributeNonEmpty(ruleContext, "title"); + if (!passed) POF = 2 + textTypes.length + buttonTypes.indexOf(type); + } + } else if (type == "buttonelem") { + // If I am an image and I have alt text - accessibility-web-engine#269 + let bAlt = false; + if (ruleContext.nodeName.toLowerCase() === "img" && ruleContext.hasAttribute("alt")) { + let alt = ruleContext.getAttribute("alt"); + if (alt.trim().length === 0) { + bAlt = false; + } else { + bAlt = true; + } + }; + passed = CommonUtil.hasInnerContentHidden(ruleContext) || AriaUtil.hasAriaLabel(ruleContext) || bAlt || CommonUtil.attributeNonEmpty(ruleContext, "title"); + + if (!passed) POF = 2 + textTypes.length + buttonTypes.length + 1; + } + + //check if a native button is labelled + if (!passed && nodeName == "button") { + if (CommonUtil.hasImplicitLabel(ruleContext)) + passed = true; + else { + let label = CommonUtil.getLabelForElement(ruleContext); + if (label && CommonUtil.hasInnerContentHidden(label)) + passed = true; + } + } + + // Rpt_Aria_ValidIdRef determines if the aria-labelledby id points to a valid element + if (!passed && (buttonTypes.indexOf(type) !== -1)) { + if (ruleContext.hasAttribute("class") && ruleContext.getAttribute("class") == "dijitOffScreen" && DOMWalker.parentElement(ruleContext).hasAttribute("widgetid")) { + // Special handling for dijit buttons + let labelId = DOMWalker.parentElement(ruleContext).getAttribute("widgetid") + "_label"; + let label = FragmentUtil.getById(ruleContext, labelId); + if (label != null) { + passed = CommonUtil.hasInnerContentHidden(label); + // This means I failed above also + if (!passed) POF = 2 + textTypes.length + buttonTypes.length + 4 + buttonTypes.indexOf(type); + } + } + } + + if (!passed && nodeName == "optgroup") { + passed = CommonUtil.attributeNonEmpty(ruleContext, "label"); + if (!passed) POF = 2 + textTypes.length + buttonTypes.length + 2; + } + if (!passed && nodeName == "option") { + // Is a non-empty value attribute also enough for an option element? + passed = CommonUtil.attributeNonEmpty(ruleContext, "label") || ruleContext.innerHTML.trim().length > 0; + if (!passed) POF = 2 + textTypes.length + buttonTypes.length + 3; + } + + if (!passed) + passed = AriaUtil.getAriaLabel(ruleContext).trim().length > 0 || CommonUtil.attributeNonEmpty(ruleContext, "title"); + + if (!passed) { + // check aria role to figure out if the accessible name can be from content + const roles = AriaUtil.getRoles(ruleContext, true); + //when multiple roles specified, only the first valid role (guaranteed by dependencies) is applied, and the others just as fallbacks + if (ARIADefinitions.designPatterns[roles[0]] && ARIADefinitions.designPatterns[roles[0]].nameFrom && ARIADefinitions.designPatterns[roles[0]].nameFrom.includes("contents")) + passed = CommonUtil.hasInnerContentHidden(ruleContext); + } + */ + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + passed = pair && pair.name && pair.name.trim().length > 0; + if (passed) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else if (ruleContext.hasAttribute("role") && ruleContext.getAttribute("role").trim().length > 0) { + return (0, IRule_1.RuleFail)("Fail_2", ruleContext.getAttribute("role").split(" ")); + } + else { + return (0, IRule_1.RuleFail)("Fail_1", [nodeName]); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/input_label_visible.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/input_label_visible.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_label_visible = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +exports.input_label_visible = { + id: "input_label_visible", + context: "aria:button,aria:checkbox,aria:combobox,aria:listbox,aria:menuitemcheckbox,aria:menuitemradio,aria:radio,aria:searchbox,aria:slider,aria:spinbutton,aria:switch,aria:textbox", + dependencies: ["input_label_exists"], + refactor: { + "WCAG20_Input_VisibleLabel": { + "Pass_0": "pass", + "Potential_1": "potential_no_label", + "potential_placeholder_only": "potential_placeholder_only" + } + }, + help: { + "en-US": { + "pass": "input_label_visible.html", + "potential_placeholder_only": "input_label_visible.html", + "potential_no_label": "input_label_visible.html", + "group": "input_label_visible.html" + } + }, + messages: { + "en-US": { + "pass": "The input element has an associated visible label", + "potential_placeholder_only": "The ‘placeholder’ is the only visible label", + "potential_no_label": "The input element does not have an associated visible label", + "group": "An input element must have an associated visible label" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.5.3", "3.3.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + //ignore datalist element check since it will be part of a input element or hidden by default + if (nodeName === 'datalist') + return null; + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return null; + // if a control is in a table cell, the col headers can act as visible label, which is checked in table heading rule + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, "table")) + return null; + // custom widget submission is not in scope for this success criteria (IBMa/equal-access#204) if it is not associated with data entry + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + if (role && role === "button" && nodeName !== 'input' && nodeName !== 'button') { + // likely a custom widget, skip if not associated with data entry + if (!CommonUtil_1.CommonUtil.getAncestor(ruleContext, "form")) + return null; + } + // when in a combobox, only look at the input textbox. + if (AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, "combobox") && + !(AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "textbox") || AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "searchbox") || + nodeName === "input" || (nodeName === "select" && AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, "combobox")))) { + return null; + } + // avoid diagnosing the popup list of a combobox. + var rolesToCheck = ["listbox", "tree", "grid", "dialog"]; + for (var j = 0; j < rolesToCheck.length; j++) { + if (AriaUtil_1.AriaUtil.hasRoleInSemantics(ruleContext, rolesToCheck[j])) { + var comboboxes = CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, "combobox", true, true); + for (var k = 0; k < comboboxes.length; k++) { + var combobox = comboboxes[k]; + var aria_owns = CommonUtil_1.CommonUtil.getElementAttribute(combobox, "aria-owns"); + if (aria_owns) { + var owns = CommonUtil_1.CommonUtil.normalizeSpacing(aria_owns.trim()).split(" "); + for (var i = 0; i < owns.length; i++) { + var owned = fragment_1.FragmentUtil.getById(ruleContext, owns[i]); + if (owned === ruleContext) { + return null; + } + } + } + } + } + } + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + // check visible label for input or button + if (nodeName === 'input' || nodeName === 'button') { + if (pair && pair.name && pair.name.trim().length > 0 && (pair.nameFrom === 'label' || pair.nameFrom === 'internal' || pair.nameFrom === 'alt')) + return (0, IRule_1.RulePass)("pass"); + } + // check if an alternative tooltip exists that can be made visible through mouseover + if (pair && pair.name && pair.name.trim().length > 0 && (pair.nameFrom === 'text' || pair.nameFrom === 'title')) + return (0, IRule_1.RulePass)("pass"); + // check if any visible text from the control. + // note that (1) the text doesn’t need to be associated with the control to form a relationship + // (2) the text doesn't need to follow accessible name requirement (e.g. nameFrom) + var text = CommonUtil_1.CommonUtil.getOnScreenInnerText(ruleContext); + if (text && text.length !== 0) + return (0, IRule_1.RulePass)("pass"); + // check if any descendant with an alternative tooltip that can be made visible through mouseover + // only consider img and svg, and other text content of the descendant is covered in the isInnerText above + var descendants = AriaUtil_1.AriaUtil.getAllDescendantsWithRoles(ruleContext, ["img", "graphics-document", "graphics-object", "graphics-symbol"], false, true); + if (descendants && descendants.length > 0) { + for (var d = 0; d < descendants.length; d++) { + if (CommonUtil_1.CommonUtil.attributeNonEmpty(descendants[d], "title") || CommonUtil_1.CommonUtil.attributeNonEmpty(descendants[d], "alt")) + return (0, IRule_1.RulePass)("pass"); + } + } + // check if there is a visible label pointed to by the aria-labelledby attribute. + if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "aria-labelledby")) { + var theLabel = ruleContext.getAttribute("aria-labelledby"); + var labelValues = theLabel.split(/\s+/); + for (var j = 0; j < labelValues.length; ++j) { + var elementById = fragment_1.FragmentUtil.getById(ruleContext, labelValues[j]); + if (elementById && !DOMUtil_1.DOMUtil.sameNode(elementById, ruleContext) && VisUtil_1.VisUtil.isNodeVisible(elementById) && CommonUtil_1.CommonUtil.hasInnerContentHidden(elementById)) { + return (0, IRule_1.RulePass)("pass"); + } + } + } + if ((nodeName === "optgroup" || nodeName == "option") && (pair && pair.name && pair.name.trim().length > 0 && (pair.nameFrom === 'label' || pair.nameFrom === 'content'))) + return (0, IRule_1.RulePass)("pass"); + // Determine if this is referenced by a combobox. If so, the label belongs to the combobox + var id = ruleContext.getAttribute("id"); + if (id && id.trim().length > 0) { + if (ruleContext.ownerDocument.querySelector("*[aria-controls='".concat(id, "'][role='combobox']"))) { + return null; + } + } + // check if a placeholder exists even though a placeholder text is not sufficient as a visible text + if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "placeholder")) + return (0, IRule_1.RulePotential)("potential_placeholder_only"); + return (0, IRule_1.RulePotential)("potential_no_label"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/input_onchange_review.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/input_onchange_review.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_onchange_review = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.input_onchange_review = { + id: "input_onchange_review", + context: "dom:input[onchange], dom:textarea[onchange], dom:select[onchange]", + refactor: { + "WCAG20_Input_HasOnchange": { + // "Pass_0": "pass", + "Potential_1": "potential_warning" + } + }, + help: { + "en-US": { + // "pass": "input_onchange_review.html", + "potential_warning": "input_onchange_review.html", + "group": "input_onchange_review.html" + } + }, + messages: { + "en-US": { + "group": "Users must be advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs", + // "pass": "The user is advised of the automatic form submission, new window opening, or focus change", + "potential_warning": "Confirm that the user is advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.2.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (ruleContext.nodeName.toLowerCase() == "input" && ruleContext.hasAttribute("type")) { + var type = ruleContext.getAttribute("type").toLowerCase(); + if (type === "hidden" || type === "submit" || type === "image" || type === "button" || type === "reset") + return null; + } + return (0, IRule_1.RulePotential)("potential_warning"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/input_placeholder_label_visible.ts" +/*!*********************************************************!*\ + !*** ./src/v4/rules/input_placeholder_label_visible.ts ***! + \*********************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.input_placeholder_label_visible = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.input_placeholder_label_visible = { + id: "input_placeholder_label_visible", + context: "dom:input[placeholder], dom:textarea[placeholder]", + refactor: { + "HAAC_Input_Placeholder": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1", + "Potential_2": "Potential_2" + } + }, + help: { + "en-US": { + "Pass_0": "input_placeholder_label_visible.html", + "Potential_1": "input_placeholder_label_visible.html", + "Potential_2": "input_placeholder_label_visible.html", + "group": "input_placeholder_label_visible.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "HTML5 placeholder is the only visible label", + "Potential_2": "Additional visible label referenced by 'aria-labelledby' is not valid", + "group": "HTML5 'placeholder' attribute must not be used as a visible label replacement" + } + }, + /** + * merge the rule into input_label_visible + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.3.2"], + "level": eRulePolicy.VIOLATION, + "toolkitLevel": eToolkitLevel.LEVEL_ONE + }], + */ + rulesets: [], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (ruleContext.hasAttribute("type")) { + var type = ruleContext.getAttribute("type").toLowerCase(); + if (type == "hidden" || type == "button") { + return (0, IRule_1.RulePass)("Pass_0"); + } + } + if (ruleContext.hasAttribute("hidden")) { + var hidden = ruleContext.getAttribute("hidden"); + if (hidden == "" || hidden.toLowerCase() == "hidden") { // when hidden is empty in the element, "" is returned, same as it has a value of "". + return (0, IRule_1.RulePass)("Pass_0"); + } + } + if (ruleContext.hasAttribute("aria-label")) { + return (0, IRule_1.RulePotential)("Potential_1"); + } + if (ruleContext.hasAttribute("aria-labelledby") && ruleContext.hasAttribute("id")) { + var id = ruleContext.getAttribute("id").trim(); + var refIds = ruleContext.getAttribute("aria-labelledby").trim().split(/\s+/); // separated by one or more white spaces + if (!refIds.includes(id)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RulePotential)("Potential_2"); + } + } + return (0, IRule_1.RulePass)("Pass_0"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/label_content_exists.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/label_content_exists.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.label_content_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +exports.label_content_exists = { + id: "label_content_exists", + context: "dom:label", + refactor: { + "Valerie_Label_HasContent": { + "Pass_Regular": "Pass_Regular", + "Pass_AriaLabel": "Pass_AriaLabel", + "Pass_LabelledBy": "Pass_LabelledBy", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_Regular": "label_content_exists.html", + "Pass_AriaLabel": "label_content_exists.html", + "Pass_LabelledBy": "label_content_exists.html", + "Fail_1": "label_content_exists.html", + "group": "label_content_exists.html" + } + }, + messages: { + "en-US": { + "Pass_Regular": "<label> element has accessible name with inner content", + "Pass_AriaLabel": "<label> element has accessible name via 'aria-label'", + "Pass_LabelledBy": "<label> element has accessible name via 'aria-labelledby'", + "Fail_1": "The <label> element does not have descriptive text that identifies the expected input", + "group": "A <label> element must have non-empty descriptive text that identifies the purpose of the interactive component" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (CommonUtil_1.CommonUtil.hasInnerContentHidden(ruleContext)) { + return (0, IRule_1.RulePass)("Pass_Regular"); + } + else if ((ruleContext.getAttribute("aria-label") || "").trim().length > 0) { + return (0, IRule_1.RulePass)("Pass_AriaLabel"); + } + else if (ruleContext.hasAttribute("aria-labelledby")) { + var labelElem = fragment_1.FragmentUtil.getById(ruleContext, ruleContext.getAttribute('aria-labelledby')); + if (labelElem && !DOMUtil_1.DOMUtil.sameNode(labelElem, ruleContext) && CommonUtil_1.CommonUtil.hasInnerContent(labelElem)) { + return (0, IRule_1.RulePass)("Pass_LabelledBy"); + } + } + return (0, IRule_1.RuleFail)("Fail_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/label_name_visible.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/label_name_visible.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.label_name_visible = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var CSSUtil_1 = __webpack_require__(/*! ../util/CSSUtil */ "./src/v4/util/CSSUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +exports.label_name_visible = { + id: "label_name_visible", + context: "aria:button,aria:checkbox,aria:gridcell,aria:link,aria:menuitem,aria:menuitemcheckbox,aria:menuitemradio,aria:option,aria:radio,aria:switch,aria:tab,aria:treeitem,dom:input,dom:textarea,dom:select,dom:output,dom:meter", + refactor: { + "WCAG21_Label_Accessible": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "label_name_visible.html", + "Fail_1": "label_name_visible.html", + "group": "label_name_visible.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Accessible name matches or contains the visible label text", + "Fail_1": "Accessible name does not match or contain the visible label text", + "group": "Accessible name must match or contain the visible label text" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_2"], + "num": ["2.5.3"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + // TODO: ACT: Review https://github.com/act-rules/act-rules.github.io/issues/1618 + // https://www.w3.org/WAI/WCAG21/Techniques/aria/ARIA24 + act: "2ee8b8", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || + CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) { + return null; + } + // pass if the visible text uses Material Icon font + if (CSSUtil_1.CSSUtil.isMaterialIconFont(ruleContext)) + return (0, IRule_1.RulePass)("Pass_0"); + var passed = true; + var nodeName = ruleContext.nodeName.toLowerCase(); + var isInputButton = false; + //let buttonTypes = ["button", "reset", "submit"]; //"image" + var inputType = null; + if (nodeName === "input" && ruleContext.hasAttribute("type")) { + inputType = ruleContext.getAttribute("type").toLowerCase(); + if (CommonUtil_1.CommonUtil.form_button_types.indexOf(inputType) !== -1) { + isInputButton = true; + } + } + var theLabelBy = AriaUtil_1.AriaUtil.getAriaAttribute(ruleContext, "aria-labelledby"); + if (theLabelBy && !CommonUtil_1.CommonUtil.isIdReferToSelf(ruleContext, theLabelBy) && !isInputButton) { + // skip the checks if it has an aria-labelledby since it takes precedence. + } + else { + var theLabel = null; + if (theLabelBy && !CommonUtil_1.CommonUtil.isIdReferToSelf(ruleContext, theLabelBy)) { + var labelValues = theLabelBy.split(/\s+/); + for (var j = 0; j < labelValues.length; ++j) { + var elementById = fragment_1.FragmentUtil.getById(ruleContext, labelValues[j]); + if (elementById) { + theLabel = CommonUtil_1.CommonUtil.getInnerText(elementById); + break; + } + } + } + else { + theLabel = AriaUtil_1.AriaUtil.getAriaAttribute(ruleContext, "aria-label"); + } + if (!theLabel) { + return null; + } + var text = null; + if (isInputButton) { + /* Note: Disable the alt check in images until we get confirmation + if (inputType==="image" && ruleContext.hasAttribute("alt")){ + // use 'alt' attribute as visible text + text = ruleContext.getAttribute("alt"); + }else + */ + if (ruleContext.hasAttribute("value")) { + // use 'value' attribute as visible text + text = ruleContext.getAttribute("value"); + } + else { + // use default value + if (inputType === "submit" /*||inputType==="image"*/) { + text = "submit"; + } + else if (inputType === "reset") { + text = "reset"; + } + } + } + if (!text) { + // look for a <label> element + var labelElem = CommonUtil_1.CommonUtil.getLabelForElementHidden(ruleContext, true); + if (!labelElem) { + var parentNode = DOMWalker_1.DOMWalker.parentNode(ruleContext); + if (parentNode.nodeName.toLowerCase() === "label" /*&& RPTUtil.isFirstFormElement(parentNode, ruleContext)*/) { + var parentClone = parentNode.cloneNode(true); + // exclude all form elements from the label since they might also have inner content + labelElem = CommonUtil_1.CommonUtil.removeAllFormElementsFromLabel(parentClone); + } + } + var element = labelElem ? labelElem : ruleContext; + var elementsToSkipContentCheck = ["meter", "output", "progress", "select", "textarea"]; + if (!labelElem && elementsToSkipContentCheck.indexOf(nodeName) !== -1) { + text = ""; // skip content check for some elements + } + else { + // get the visible text only + text = CommonUtil_1.CommonUtil.getOnScreenInnerText(element); + } + /* Note: Disable this alt check in images for now until we get confirmation + // Look for the alt attribute of an image which is considered visible text. + let hasImgAlt = false; + if (element.firstChild != null) { + let nw = RPTUtil.new NodeWalker(element); + while (!hasImgAlt && nw.nextNode() && nw.node != element && nw.node != element.nextSibling) { + hasImgAlt = (nw.node.nodeName.toLowerCase() == "img" && RPTUtil.attributeNonEmpty(nw.node, "alt")); + if (hasImgAlt) { + text = text ? text + nw.node.getAttribute("alt") : nw.node.getAttribute("alt"); + } + } + } + */ + } + var nonalphanumeric = /[^a-zA-Z0-9]/g; + text = text.replace(nonalphanumeric, " "); // only consider alphanumeric characters + var normalizedText = CommonUtil_1.CommonUtil.normalizeSpacing(text).toLowerCase(); // Leading and trailing whitespace and difference in case sensitivity should be ignored. + theLabel = theLabel.replace(nonalphanumeric, " "); // only consider alphanumeric characters + var normalizedLabel = CommonUtil_1.CommonUtil.normalizeSpacing(theLabel).toLowerCase(); + if (normalizedText.length > 1) { // skip non-text content. e.g., <button aria-label="close">X</button> + var location_1 = normalizedLabel.indexOf(normalizedText); + // Avoid matching partial words.e.g., text "name" should not match 'surname' or 'names' + if (location_1 >= 0 && normalizedLabel.length > normalizedText.length) { + var letters = /^[0-9a-zA-Z]+$/; + if ((location_1 + normalizedText.length) < normalizedLabel.length) { + // check ending + var theChar = normalizedLabel.charAt(location_1 + normalizedText.length); + if (theChar.match(letters)) { + passed = false; + } + } + if (passed && location_1 > 0) { + // check beginning + var theChar = normalizedLabel.charAt(location_1 - 1); + if (theChar.match(letters)) { + passed = false; + } + } + } + if (location_1 === -1) { // check that visible text content of the target is contained within its accessible name. + passed = false; + } + } + } + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/label_ref_valid.ts" +/*!*****************************************!*\ + !*** ./src/v4/rules/label_ref_valid.ts ***! + \*****************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.label_ref_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.label_ref_valid = { + id: "label_ref_valid", + context: "dom:label[for]", + refactor: { + "WCAG20_Label_RefValid": { + "Pass_0": "pass", + "Fail_1": "fail_invalid" + } + }, + help: { + "en-US": { + "pass": "label_ref_valid.html", + "fail_invalid": "label_ref_valid.html", + "group": "label_ref_valid.html" + } + }, + messages: { + "en-US": { + "pass": "The 'for' attribute for a label referencea a unique non-empty 'id' attribute of a valid element", + "fail_invalid": "The value \"{0}\" of the 'for' attribute is not the 'id' of a valid element", + "group": "The 'for' attribute for a label should reference a non-empty, unique 'id' attribute of a valid element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var id = ruleContext.getAttribute("for"); + var passed = false; + var target = fragment_1.FragmentUtil.getById(ruleContext, id); + if (target) { + // ignore if both label and control are invisible + if (!VisUtil_1.VisUtil.isNodeVisible(target) && !VisUtil_1.VisUtil.isNodeVisible(ruleContext)) + return null; + passed = true; + // handles null and undefined + if (!target.hasAttribute("role")) { + // Fail if we're pointing at something that is labelled by another mechanism + var nodeName = target.nodeName.toLowerCase(); + passed = nodeName == "input" || nodeName == "select" || nodeName == "textarea" + || nodeName == "button" || nodeName == "datalist" + || nodeName == "optgroup" || nodeName == "option" + || nodeName == "keygen" || nodeName == "output" + || nodeName == "progress" || nodeName == "meter" + || nodeName == "fieldset" || nodeName == "legend"; + if (target.nodeName.toLowerCase() == "input" && target.hasAttribute("type")) { + var type = target.getAttribute("type").toLowerCase(); + passed = type == "text" || type == "password" || type == "file" || + type == "checkbox" || type == "radio" || + type == "hidden" || type == "search" || type == "tel" || type == "url" || type == "email" || //HTML 5 + type == "date" || type == "number" || type == "range" || type == "image" || //HTML 5 + type == "time" || type == "color" || // HTML 5 + type == "datetime-local" || type == "month" || type == "week"; //HTML5.1 + } + } + // Add one more check to make sure the target element is NOT hidden, in the case the target is hidden + // flag a violation regardless of what the Check Hidden Content setting is. + if (passed && !VisUtil_1.VisUtil.isNodeVisible(target)) { + passed = false; + } + } + var retToken = []; + if (!passed) { + retToken.push(id); + } + //return new ValidationResult(passed, [ruleContext], '', '', passed == true ? [] : [retToken]); + if (!passed) { + return (0, IRule_1.RuleFail)("fail_invalid", retToken); + } + else { + return (0, IRule_1.RulePass)("pass"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/list_children_valid.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/list_children_valid.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.list_children_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +exports.list_children_valid = { + id: "list_children_valid", + context: "aria:group", + refactor: { + "HAAC_List_Group_ListItem": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "list_children_valid.html", + "Fail_1": "list_children_valid.html", + "group": "list_children_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "List component with \"group\" role has children that are not <listitem> elements", + "group": "List component with \"group\" role must limit children to <listitem> elements" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var parent = DOMWalker_1.DOMWalker.parentElement(ruleContext); + if (!AriaUtil_1.AriaUtil.hasRoleInSemantics(parent, "list")) { + return null; + } + var passed = true; + var children = ruleContext.children; + for (var i = 0; passed && i < children.length; i++) { + passed = AriaUtil_1.AriaUtil.hasRoleInSemantics(children[i], "listitem"); + } + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/list_markup_review.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/list_markup_review.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.list_markup_review = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.list_markup_review = { + id: "list_markup_review", + context: "dom:*", + refactor: { + "RPT_List_UseMarkup": { + // "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + // "pass": "list_markup_review.html", + "potential_list": "list_markup_review.html", + "group": "list_markup_review.html" + } + }, + messages: { + "en-US": { + // "pass": "Proper HTML elements are used to create a list", + "potential_list": "Verify this is a list and if so, modify to use proper HTML elements for the list", + "group": "Proper HTML elements should be used to create a list" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Extract the nodeName of the context node + var nodeName = ruleContext.nodeName.toLowerCase(); + //skip the check if the element is hidden or disabled + if (CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext) || VisUtil_1.VisUtil.hiddenByDefaultElements.includes(nodeName)) + return null; + // Don't trigger if we're not in the body or if we're in a script + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["body"]) === null) + return null; + // ignore script, label and their child elements + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["script", 'label']) !== null) + return null; + // ignore all widgets and their children, and certain structure roles + var roles = AriaUtil_1.AriaUtil.getRolesWithTypes(ruleContext, ["widget"]); + // add some structure roles + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(["caption", "code", "columnheader", "figure", "list", "listitem", "math", "meter", "columnheader", "rowheader"], roles); + if (AriaUtil_1.AriaUtil.getAncestorWithRoles(ruleContext, roles) !== null) + return null; + var passed = true; + var walkNode = ruleContext.firstChild; + while (passed && walkNode) { + // Comply to the Check Hidden Content setting will be done by default as this rule triggers on each element + // and for each element it only checks that single elements text nodes and nothing else. So all inner elements will be + // covered on their own. Currently for this rule by default Check Hidden Content will work, as we are doing + // a node walk only on siblings so it would not get text nodes from other siblings at all. + // In the case in the future something changes, just need to add && !RPTUtil.shouldNodeBeSkippedHidden(walkNode) to the below + // if. + if (walkNode.nodeName == "#text") { + var txtVal = walkNode.nodeValue; + var failure = /^[ \t\r\n]*[( ]*[1-9]*[\*\-).][ \t][A-Z,a-z]+/.test(txtVal); + passed = !failure; + if (!passed) { + // Ensure that there's some sort of block level element before this + // Avoid failures due to things like <i>Some sentence</i>. New sentence. + var nw = new DOMWalker_1.DOMWalker(walkNode); + while (!passed && nw.prevNode()) { + var nodeName_1 = nw.node.nodeName.toLowerCase(); + if (["blockquote", "center", "dir", "div", "form", "h1", + "h2", "h3", "h4", "h5", "h6", "hr", "br", "menu", "p", + "pre"].includes(nodeName_1)) { + break; + } + if (nodeName_1 == "#text") { + var txt = nw.node.nodeValue; + passed = txt.length > 0 && ![" ", "\t", "\n"].includes(txt.charAt(txt.length - 1)); + } + } + } + } + walkNode = walkNode.nextSibling; + } + if (passed) + return null; + if (!passed) + return (0, IRule_1.RulePotential)("potential_list"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/list_structure_proper.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/list_structure_proper.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.list_structure_proper = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.list_structure_proper = { + id: "list_structure_proper", + context: "dom:dl, dom:ul, dom:ol, dom:dir, dom:menu, dom:li, dom:dd, dom:dt", + refactor: { + "RPT_List_Misuse": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "list_structure_proper.html", + "Potential_1": "list_structure_proper.html", + "group": "list_structure_proper.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "List element is missing or improperly structured", + "group": "List elements should only be used for lists of related items" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed; + var nodeName = ruleContext.nodeName.toLowerCase(); + // Get all the childrens of the ruleContext + var children = ruleContext.children; + if (nodeName == "dl") { + var first = ""; + var last = ""; + var walkChildren = ruleContext.firstChild; + passed = true; + var presentationalFound = false; + // If there are no childrens set as passed, since dl elements can have + // zero or more of: one or more dt elements, followed by one or more dd elements + if (!ruleContext.children || ruleContext.children.length == 0) { + passed = true; + } + else { + while (passed && walkChildren != null) { + if (walkChildren.nodeType == 1) { + var nodeName_1 = walkChildren.nodeName.toLowerCase(); + // While walking through the elements under dl, if we find a + // presentational element we move to the next element as presentational + // elements are allowed under list elements as they are only for + // formatting text nodes. + if (AriaUtil_1.AriaUtil.isPresentationalElement(walkChildren)) { + presentationalFound = true; + walkChildren = walkChildren.nextSibling; + continue; + } + // Only set to pass if we find dd or dt element, in the case of + // an element that is not supported we will catch it here. i.e. img + // element + passed = nodeName_1 == "dd" || nodeName_1 == "dt"; + // Set the first and last node depending on which is found first and last + if (first == "") + first = nodeName_1; + last = nodeName_1; + } + walkChildren = walkChildren.nextSibling; + } + // In the case that we have found dt and dd elements under dl we pass right away. + // In the case that there is no dt or dd element, but bunch of presentational elements we mark this as a + // pass. In the case that there are other elements, such as img we will still trigger a violation. + passed = (passed && first == "dt" && last == "dd") || (passed && presentationalFound); + } + } + else if (nodeName == "li") { + passed = CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["ul", "ol", "dir", "menu"]) != null; + } + else if (nodeName == "dd" || nodeName == "dt") { + passed = CommonUtil_1.CommonUtil.getAncestor(ruleContext, "dl") != null; + } + else { + var walkChildren = ruleContext.firstChild; + // Zero or more li elements are permitted inside of <ol>, <ul> or <menu> elements now as per the html5 spec. This handles the case + // when there are zero elements under the <ol>, <ul> or <menu>. + if ((nodeName == "ul" || nodeName == "ol" || nodeName == "menu") && (!ruleContext.children || ruleContext.children.length == 0)) { + passed = true; + } + else { + var liFound = false; + var presentationalFound = false; + passed = true; + while (passed && walkChildren != null) { + // While walking through the list elements, if we find a + // presentational element we skip checking as presentational + // elements are allowed under list elements as they are only for + // formatting text. + if (AriaUtil_1.AriaUtil.isPresentationalElement(walkChildren)) { + presentationalFound = true; + walkChildren = walkChildren.nextSibling; + continue; + } + // Pass if the node type is anything but 1, or in the case that it is a li element. For any other node + // it will be caught here that element is not allowed under list node. + // Furthermore in the case that there is a template element with the parent being ul/ol don't flag a violation + passed = walkChildren.nodeType != 1 || walkChildren.nodeName.toLowerCase() == "li" || (walkChildren.nodeName.toLowerCase() == "template" && (nodeName == "ul" || nodeName == "ol")); + // Set li found to true if the current element (nodeType=1) is an li element + liFound = liFound || (walkChildren.nodeType == 1 && walkChildren.nodeName.toLowerCase() == "li"); + walkChildren = walkChildren.nextSibling; + } + // In the case that it has passed and also li element is found under list node, we pass right away. + // In the case that there is no li element, but bunch of presentational elements we mark this as a + // pass. In the case that there are other elements, such as img we will still trigger a violation. + passed = (passed && liFound) || (passed && presentationalFound); + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/marquee_elem_avoid.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/marquee_elem_avoid.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.marquee_elem_avoid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.marquee_elem_avoid = { + id: "marquee_elem_avoid", + context: "dom:marquee", + refactor: { + "RPT_Marquee_Trigger": { + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Fail_1": "marquee_elem_avoid.html", + "group": "marquee_elem_avoid.html" + } + }, + messages: { + "en-US": { + "Fail_1": "Scrolling content found that uses the obsolete <marquee> element", + "group": "The <marquee> element is obsolete and should not be used" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.2.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // JCH - NO OUT OF SCOPE hidden in context + return (0, IRule_1.RuleFail)("Fail_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/media_alt_brief.ts" +/*!*****************************************!*\ + !*** ./src/v4/rules/media_alt_brief.ts ***! + \*****************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.media_alt_brief = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.media_alt_brief = { + id: "media_alt_brief", + context: "dom:img[alt], dom:applet[alt], dom:area[alt], dom:embed[alt], dom:input[type][alt]", + refactor: { + "RPT_Media_AltBrief": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "media_alt_brief.html", + "Potential_1": "media_alt_brief.html", + "group": "media_alt_brief.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Text alternative is more than 150 characters", + "group": "Alternative text in 'alt' attribute should be brief (<150 characters)" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + maxAlt: { + value: 150, + type: "integer" + } + }; + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var altLength = ruleContext.getAttribute("alt").trim().length; + var passed = altLength <= validateParams.maxAlt.value; + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/media_alt_exists.ts" +/*!******************************************!*\ + !*** ./src/v4/rules/media_alt_exists.ts ***! + \******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.media_alt_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.media_alt_exists = { + id: "media_alt_exists", + context: "dom:area[alt], dom:embed[alt]", + refactor: { + "RPT_Media_AudioVideoAltFilename": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "media_alt_exists.html", + "Potential_1": "media_alt_exists.html", + "group": "media_alt_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Filename used as label for embedded audio or video", + "group": "Audio or video on the page must have a short text alternative that describes the media content" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var uri = ""; + if (ruleContext.nodeName.toLowerCase() == "area") { + uri = ruleContext.getAttribute("href"); + } + else { + uri = ruleContext.getAttribute("src"); + } + if (uri == null) + uri = ""; + var ext = CommonUtil_1.CommonUtil.getFileExt(uri); + var isAudVid = ext.length != 0 && (CommonUtil_1.CommonUtil.isAudioExt(ext) || CommonUtil_1.CommonUtil.isVideoExt(ext)); + var altText = ruleContext.getAttribute("alt"); + var passed = !isAudVid || (altText.length > 0 && altText.indexOf(ext) == -1); + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/media_audio_transcribed.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/media_audio_transcribed.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.media_audio_transcribed = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.media_audio_transcribed = { + id: "media_audio_transcribed", + context: "dom:bgsound, dom:a[href], dom:area[href], dom:embed, dom:object", + refactor: { + "RPT_Media_AudioTrigger": { + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Manual_1": "media_audio_transcribed.html", + "group": "media_audio_transcribed.html" + } + }, + messages: { + "en-US": { + "Manual_1": "Provide transcripts for audio files", + "group": "Audio information should also be available in text form" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.2.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed; + var thisNode = ruleContext.nodeName.toLowerCase(); + if (thisNode == "bgsound") { + passed = false; + } + else { + passed = !CommonUtil_1.CommonUtil.isAudioObjEmbedLink(ruleContext); + } + if (passed) + return null; // Out of Scope + if (!passed) + return (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/media_autostart_controllable.ts" +/*!******************************************************!*\ + !*** ./src/v4/rules/media_autostart_controllable.ts ***! + \******************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.media_autostart_controllable = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.media_autostart_controllable = { + id: "media_autostart_controllable", + context: "dom:param[name=autoplay], dom:param[name=autostart], dom:embed[flashvars], dom:embed[src], dom:*[autostart=true], dom:*[autostart=1], dom:bgsound", + refactor: { + "RPT_Embed_AutoStart": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "media_autostart_controllable.html", + "Potential_1": "media_autostart_controllable.html", + "group": "media_autostart_controllable.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify there is a mechanism to pause or stop and control the volume for the audio that plays automatically", + "group": "Mechanism must be available to pause or stop and control the volume of the audio that plays automatically" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.4.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + var passed; + if (nodeName == "bgsound") { + passed = false; + } + else if (nodeName == "param") { + var content = ""; + if (ruleContext.hasAttribute("value")) + content = ruleContext.getAttribute("value").toLowerCase(); + passed = content.indexOf("0;") == 0 || + !(content.indexOf("true") != -1 || content.indexOf("1") != -1); + } + else if (nodeName == "embed") { + passed = true; + if (ruleContext.hasAttribute("flashvars")) { + var str = ruleContext.getAttribute("flashvars"); + passed = str.indexOf("autostart=true") == -1 && + str.indexOf("autostart=1") == -1; + } + if (passed && ruleContext.hasAttribute("src")) { + var str = ruleContext.getAttribute("src"); + passed = str.indexOf("autostart=true") == -1 && + str.indexOf("autostart=1") == -1; + } + } + if (passed && ruleContext.hasAttribute("autostart")) { + var val = ruleContext.getAttribute("autostart").toLowerCase(); + passed = val != 'true' && val != '1'; + } + return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/media_keyboard_controllable.ts" +/*!*****************************************************!*\ + !*** ./src/v4/rules/media_keyboard_controllable.ts ***! + \*****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.media_keyboard_controllable = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.media_keyboard_controllable = { + id: "media_keyboard_controllable", + context: "dom:audio, dom:video", + refactor: { + "HAAC_Audio_Video_Trigger": { + "Pass_0": "Pass_0", + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Pass_0": "media_keyboard_controllable.html", + "Manual_1": "media_keyboard_controllable.html", + "group": "media_keyboard_controllable.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Manual_1": "Verify media using <audio> and/or <video> elements have keyboard accessible controls", + "group": "Media using <audio> and/or <video> elements must have keyboard accessible controls" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = true; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (nodeName == "audio" || nodeName === "video") { + passed = false; + } + return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/media_live_captioned.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/media_live_captioned.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.media_live_captioned = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.media_live_captioned = { + id: "media_live_captioned", + context: "dom:embed, dom:object", + refactor: { + "RPT_Media_VideoObjectTrigger": { + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Manual_1": "media_live_captioned.html", + "group": "media_live_captioned.html" + } + }, + messages: { + "en-US": { + "Manual_1": "Verify captions are provided for live media (streaming video with audio)", + "group": "Live media (streaming video with audio) should have captions for audio content" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.2.4"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = !CommonUtil_1.CommonUtil.isVideoObjEmbedLink(ruleContext); + if (passed) + return null; + if (!passed) + return (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/media_track_available.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/media_track_available.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.media_track_available = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.media_track_available = { + id: "media_track_available", + context: "dom:a[href], dom:area[href], dom:applet, dom:embed, dom:object", + refactor: { + "RPT_Media_VideoReferenceTrigger": { + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Manual_1": "media_track_available.html", + "group": "media_track_available.html" + } + }, + messages: { + "en-US": { + "Manual_1": "Verify availability of a user-selectable audio track with description of visual content", + "group": "Pre-recorded media should have an audio track that describes visual information" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.2.3", "1.2.5"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var nodeName = ruleContext.nodeName.toLowerCase(); + var passed = true; + if (nodeName == "applet") { + passed = false; + } + else { + passed = !CommonUtil_1.CommonUtil.isVideoObjEmbedLink(ruleContext); + } + if (passed) + return null; + if (!passed) + return (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/meta_redirect_optional.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/meta_redirect_optional.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.meta_redirect_optional = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +exports.meta_redirect_optional = { + id: "meta_redirect_optional", + context: "dom:meta[http-equiv][content]", + refactor: { + "WCAG20_Meta_RedirectZero": { + "pass": "pass", + "fail": "fail", + "fail_longrefresh": "fail_longrefresh" + } + }, + help: { + "en-US": { + "group": "meta_redirect_optional.html", + "pass": "meta_redirect_optional.html", + "fail": "meta_redirect_optional.html", + "fail_longrefresh": "meta_redirect_optional.html" + } + }, + messages: { + "en-US": { + "group": "Page should not automatically refresh without warning or option to turn it off or adjust the time limit", + "pass": "Rule Passed", + "fail": "Check page does not automatically refresh without warning or options", + "fail_longrefresh": "Check page does not automatically refresh without warning or options" + } + }, + /** + * deprecate WCAG AAA + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.2.4", "3.2.5"], + "level": eRulePolicy.VIOLATION, + "toolkitLevel": eToolkitLevel.LEVEL_THREE + }], + */ + rulesets: [{ + "id": [], + "num": ["2.2.4", "3.2.5"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + // Removed ACT bisz58 AAA + /**act: [{ + "bc659a" : { + "pass": "pass", + "fail": "fail", + "fail_longrefresh": "pass" + } + }],*/ + act: ["bisz58"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (ruleContext.getAttribute("http-equiv").toLowerCase() !== 'refresh') { + return null; + } + var doc = ruleContext.ownerDocument; + if (!doc) + return; + // check if the rule already passed or failed: only the first one tridders if multiple + if (CacheUtil_1.CacheUtil.getCache(doc, "meta_redirect_optional_done", false)) + return null; + var content = ruleContext.getAttribute("content").toLowerCase(); + if (!content || content.trim().length === 0) + return null; + var time = -1; + if (content.match(/^\d+$/)) + time = parseInt(content); + else if (content.match(/^\d+;/)) { + var pos = content.indexOf(";"); + time = parseInt(content.substring(0, pos)); + } + // Invalid content field + if (time === -1) { + return null; + } + CacheUtil_1.CacheUtil.setCache(doc, "meta_redirect_optional_done", true); + if (time === 0) + return (0, IRule_1.RulePass)("pass"); + else if (time < 72001) + return (0, IRule_1.RuleFail)("fail"); + return (0, IRule_1.RuleFail)("fail_longrefresh"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/meta_refresh_delay.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/meta_refresh_delay.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.meta_refresh_delay = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +exports.meta_refresh_delay = { + id: "meta_refresh_delay", + context: "dom:meta[http-equiv][content]", + refactor: { + "RPT_Meta_Refresh": { + "Pass_0": "pass", + "Potential_1": "potential_refresh" + } + }, + help: { + "en-US": { + "group": "meta_refresh_delay.html", + "pass": "meta_refresh_delay.html", + "potential_refresh": "meta_refresh_delay.html" + } + }, + messages: { + "en-US": { + "group": "Pages should not refresh automatically", + "pass": "Pages do not refresh automatically", + "potential_refresh": "Verify page is not being caused to refresh automatically", + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.2.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + //act: [ "bisz58", "bc659a" ], + act: ["bc659a"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (ruleContext.getAttribute("http-equiv").toLowerCase() !== 'refresh') + return null; + var doc = ruleContext.ownerDocument; + if (!doc) + return; + // check if the rule already passed: the first one takes priority + if (CacheUtil_1.CacheUtil.getCache(doc, "meta_refresh_delay_done", false)) + return null; + var content = ruleContext.getAttribute("content").toLowerCase(); + if (!content || content.trim().length === 0) + return null; + var time = -1; + if (content.match(/^\d+$/)) + time = parseInt(content); + else if (content.match(/^\d+;/)) { + var pos = content.indexOf(";"); + time = parseInt(content.substring(0, pos)); + } + // Invalid content field + if (time === -1) { + return null; + } + CacheUtil_1.CacheUtil.setCache(doc, "meta_refresh_delay_done", true); + if (time === 0) + return (0, IRule_1.RulePass)("pass"); + return (0, IRule_1.RulePotential)("potential_refresh"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/meta_viewport_zoomable.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/meta_viewport_zoomable.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.meta_viewport_zoomable = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.meta_viewport_zoomable = { + id: "meta_viewport_zoomable", + context: "dom:meta[name][content]", + refactor: { + "meta_viewport_zoom": { + "Pass_0": "pass", + "Potential_1": "potential_zoomable" + } + }, + help: { + "en-US": { + "group": "meta_viewport_zoomable.html", + "pass": "meta_viewport_zoomable.html", + "potential_zoomable": "meta_viewport_zoomable.html" + } + }, + messages: { + "en-US": { + "group": "The 'meta[name=viewport]' should not prevent the browser zooming the content", + "pass": "The 'meta[name=viewport]' does not prevent the browser zooming the content", + "potential_zoomable": "Confirm the 'meta[name=viewport]' with \"{0}\" can be zoomed by user" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.4.4"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [{ + "b4f0c3": { + "pass": "pass", + "potential_zoomable": "fail" + } + }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + if (ruleContext.getAttribute("name").toLowerCase() !== 'viewport') + return null; + var content = ruleContext.getAttribute("content").toLowerCase(); + // neither maximum-scale nor user-scalable (default yes) + if (!content || content.trim() === '' || (!content.includes('maximum-scale') && !content.includes('user-scalable'))) + return null; + var user_msg = null; + var max_msg = null; + var props = content.split(","); + var user_scale_value = 'yes'; + var maximum_scale_value = '2.0'; + for (var _i = 0, props_1 = props; _i < props_1.length; _i++) { + var prop = props_1[_i]; + var pieces = prop.trim().split('='); + if (pieces.length < 2) + continue; + if (prop.includes('user-scalable')) { + user_msg = prop; + user_scale_value = pieces[1].trim(); + if (user_scale_value.startsWith("'") || user_scale_value.startsWith('"')) { + user_scale_value = user_scale_value.substring(1, user_scale_value.length - 1); + } + } + else if (prop.includes('maximum-scale')) { + max_msg = prop; + maximum_scale_value = pieces[1].trim(); + if (maximum_scale_value.startsWith("'") || maximum_scale_value.startsWith('"')) { + maximum_scale_value = maximum_scale_value.substring(1, maximum_scale_value.length - 1).trim(); + } + } + } + var value = Number(user_scale_value); + if (!isNaN(value)) { + if (value >= 1 || value <= -1) + user_scale_value = 'yes'; + } + var maximum_scale = 2.0; + value = Number(maximum_scale_value); + if (!isNaN(value)) { + if (value < 0) + maximum_scale = 2.0; + else + maximum_scale = value; + } + else { + if (maximum_scale_value === 'yes') + maximum_scale = 1.0; + else + maximum_scale = 0.1; + } + // user-scalable is not set to 'yes', ignore maximum_scale + if (user_scale_value !== 'yes') { + return (0, IRule_1.RulePotential)("potential_zoomable", [user_msg]); + } + // user-scalable is 'yes', but maximum_scale is too small + if (maximum_scale < 2.0) { + return (0, IRule_1.RulePotential)("potential_zoomable", [max_msg]); + } + return (0, IRule_1.RulePass)("pass"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/noembed_content_exists.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/noembed_content_exists.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.noembed_content_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.noembed_content_exists = { + id: "noembed_content_exists", + context: "dom:noembed", + refactor: { + "Valerie_Noembed_HasContent": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "noembed_content_exists.html", + "Potential_1": "noembed_content_exists.html", + "group": "noembed_content_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Add descriptive text to the <noembed> element", + "group": "<noembed> elements should contain descriptive text" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_FOUR + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = CommonUtil_1.CommonUtil.hasInnerContentHidden(ruleContext); + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/object_text_exists.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/object_text_exists.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.object_text_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +exports.object_text_exists = { + id: "object_text_exists", + context: "dom:object", + refactor: { + "WCAG20_Object_HasText": { + "pass": "pass", + "fail_no_text_alternative": "fail_no_text_alternative" + } + }, + help: { + "en-US": { + "group": "object_text_exists.html", + "pass": "object_text_exists.html", + "fail_no_text_alternative": "object_text_exists.html" + } + }, + messages: { + "en-US": { + "group": "<object> element must have a text alternative for the content rendered by the object", + "pass": "<object> element has a text alternative", + "fail_no_text_alternative": "An <object> element does not have a text alternative" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: "8fc3b6", + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // Detect if this object is of type text, by checking the object type in the case it is text then do not trigger this rule + if (ruleContext.hasAttribute("type") && (ruleContext.getAttribute("type")).indexOf("text") !== -1) { + return null; + } + // ignore if an explicit role is specified: including 'presentation', 'none', 'application', 'document' or 'img' + // this case will be covered in other rules + var role = ruleContext.getAttribute("role"); + if (role) { + return null; + } + // Per ACT, ignore embedded HTML files + var data = ruleContext.getAttribute("data"); + var ext = data && typeof data === typeof "" ? data.substring(data.lastIndexOf(".")) : ""; + if (ext === ".html" || ext === ".htm") { + return null; + } + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + var passed = pair && pair.name && pair.name.trim().length > 0; + //let passed = ARIAMapper.computeName(ruleContext).trim().length > 0; + if (passed) { + return (0, IRule_1.RulePass)("pass"); + } + else { + return (0, IRule_1.RuleFail)("fail_no_text_alternative"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/page_title_exists.ts" +/*!*******************************************!*\ + !*** ./src/v4/rules/page_title_exists.ts ***! + \*******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.page_title_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var ancestor_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/ancestor */ "./src/v2/checker/accessibility/util/ancestor.ts"); +exports.page_title_exists = { + id: "page_title_exists", + context: "dom:html", + refactor: { + "WCAG20_Doc_HasTitle": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2", + "Fail_3": "Fail_3" + } + }, + help: { + "en-US": { + "group": "page_title_exists.html", + "Pass_0": "page_title_exists.html", + "Fail_1": "page_title_exists.html", + "Fail_2": "page_title_exists.html", + "Fail_3": "page_title_exists.html" + } + }, + messages: { + "en-US": { + "group": "The page should have a title that correctly identifies the subject of the page", + "Pass_0": "Rule Passed", + "Fail_1": "Missing <head> element so there can be no <title> element present", + "Fail_2": "Missing <title> element in <head> element", + "Fail_3": "The <title> element is empty (no innerHTML)" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [{ + "2779a5": { + "Pass_0": "pass", + "Fail_1": "pass", + "Fail_2": "fail", + "Fail_3": "fail" + } + }], + run: function (context, options, contextHierarchies) { + // This rule does not apply inside a presentational frame + if (ancestor_1.AncestorUtil.isFrame(contextHierarchies)) { + return null; + } + var ruleContext = context["dom"].node; + // First, find the head element + var findHead = ruleContext.firstChild; + var findTitle = null; + while (findHead != null) { + if (findHead.nodeName.toLowerCase() == "head") + break; + findHead = findHead.nextSibling; + } + var possibleTitles = ruleContext.querySelectorAll("title"); + for (var idx = 0; idx < possibleTitles.length; ++idx) { + if (!CommonUtil_1.CommonUtil.getAncestor(possibleTitles[idx], ["svg"])) { + findTitle = possibleTitles[idx]; + break; + } + } + if (findHead === null) { + if (!findTitle) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } + if (findTitle === null) { // don't have title second PoF + return (0, IRule_1.RuleFail)("Fail_2"); + } + // if we get here we have <head> and <title> + if (findTitle != null && CommonUtil_1.CommonUtil.getInnerText(findTitle).trim().length > 0) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { // <title> has no innerHTML third PoF + return (0, IRule_1.RuleFail)("Fail_3"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/page_title_valid.ts" +/*!******************************************!*\ + !*** ./src/v4/rules/page_title_valid.ts ***! + \******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.page_title_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.page_title_valid = { + id: "page_title_valid", + context: "dom:head dom:title", + refactor: { + "RPT_Title_Valid": { + "Pass_0": "Pass_0", + // "Fail_1": "Fail_1", + "Potential_2": "Potential_2" + } + }, + help: { + "en-US": { + "Pass_0": "page_title_valid.html", + // "Fail_1": "page_title_valid.html", + "Potential_2": "page_title_valid.html", + "group": "page_title_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + // "Fail_1": "Page <title> is empty", + "Potential_2": "Verify that using the filename as the page <title> value is descriptive", + "group": "Page <title> should be a descriptive title, rather than a filename" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var titleStr = CommonUtil_1.CommonUtil.getInnerText(ruleContext).trim(); + // allow .com, .net and .org + var titleStrLowercase = titleStr.toLowerCase(); + if (titleStrLowercase.includes(".com") || titleStrLowercase.includes(".net") || titleStrLowercase.includes(".org")) { + return (0, IRule_1.RulePass)("Pass_0", [titleStr]); + } + if (titleStr.length === 0) { + // This is covered by page_title_exists + return null; //RuleFail("Fail_1"); + } + else { + var passed = !/^\S*\.[a-zA-Z]{1,4}(?!.)|^https?:\/\/\S*/i.test(titleStr); + if (!passed) { + return (0, IRule_1.RulePotential)("Potential_2"); + } + else { + return (0, IRule_1.RulePass)("Pass_0", [titleStr]); + } + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/script_focus_blur_review.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/script_focus_blur_review.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.script_focus_blur_review = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.script_focus_blur_review = { + id: "script_focus_blur_review", + context: "dom:*[onfocus]", + refactor: { + "WCAG20_Script_FocusBlurs": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "script_focus_blur_review.html", + "Potential_1": "script_focus_blur_review.html", + "group": "script_focus_blur_review.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify script does not remove focus from content that normally receives focus", + "group": "Scripting must not remove focus from content that normally receives focus" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1", "2.4.7", "3.2.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = ruleContext.getAttribute("onfocus").indexOf(".blur(") == -1; + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/script_onclick_avoid.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/script_onclick_avoid.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.script_onclick_avoid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.script_onclick_avoid = { + id: "script_onclick_avoid", + context: "dom:*[onclick]", + dependencies: ["script_onclick_misuse"], + refactor: { + "RPT_Script_OnclickHTML2": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "script_onclick_avoid.html", + "Potential_1": "script_onclick_avoid.html", + "group": "script_onclick_avoid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that 'onclick' events are not used in script to emulate a link", + "group": "Scripts should not be used to emulate links" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_FOUR + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Don't trigger this for SVG element for now until a determination is made (by Rich) + // to support SVG at a point when the SVG a11y spec is ready. + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, "svg")) { + return (0, IRule_1.RulePass)("Pass_0"); + } + // If there's an aria-role specified, don't trigger this. + if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "role")) + return (0, IRule_1.RulePass)("Pass_0"); + var nodeName = ruleContext.nodeName.toLowerCase(); + var passed = nodeName == "a" || nodeName == "area" || nodeName == "input"; + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/script_onclick_misuse.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/script_onclick_misuse.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.script_onclick_misuse = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.script_onclick_misuse = { + id: "script_onclick_misuse", + context: "dom:*[onclick]", + refactor: { + "RPT_Script_OnclickHTML1": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "script_onclick_misuse.html", + "Potential_1": "script_onclick_misuse.html", + "group": "script_onclick_misuse.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Possible use of a script to emulate a link", + "group": "Scripts should not be used to emulate links" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + failSubstring: { + value: [".asp", ".aspx", ".cfm", ".cfml", ".cgi", ".htm", ".html", ".shtm", + ".shtml", ".php", ".pl", ".py", ".shtm", ".shtml", ".xhtml", + "location.href"], + type: "[string]" + } + }; + var ruleContext = context["dom"].node; + // If there's an aria-role specified, don't trigger this. + var passed = CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "role"); + // If this is an a or area, don't trigger if there's an href. + var nodeName = ruleContext.nodeName.toLowerCase(); + passed = passed || ((nodeName == "a" || nodeName == "area") && CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "href")); + // If the guards failed, check to see if they're looking at links + if (!passed) { + var failSubstring = validateParams.failSubstring.value; + ; + var onclick_1 = ruleContext.getAttribute("onclick").toLowerCase(); + passed = true; + for (var i = 0; passed && i < failSubstring.length; ++i) { + passed = onclick_1.indexOf(failSubstring[i]) == -1; + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/script_select_review.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/script_select_review.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.script_select_review = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.script_select_review = { + id: "script_select_review", + context: "dom:select", + refactor: { + "WCAG20_Select_NoChangeAction": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "script_select_review.html", + "Potential_1": "script_select_review.html", + "group": "script_select_review.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that no change of context or action occurs when selection options in this component receive focus", + "group": "No changes of context should occur when a selection value receives focus" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["3.2.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = !ruleContext.hasAttribute("onchange") && !ruleContext.hasAttribute("onfocus"); + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/select_options_grouped.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/select_options_grouped.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.select_options_grouped = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.select_options_grouped = { + id: "select_options_grouped", + context: "dom:select", + refactor: { + "WCAG20_Select_HasOptGroup": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "select_options_grouped.html", + "Potential_1": "select_options_grouped.html", + "group": "select_options_grouped.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Group of related options may need <optgroup>", + "group": "Groups of related options within a selection list should be grouped with <optgroup>" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + paramNumOptions: { + value: 10, + type: "integer" + } + }; + var ruleContext = context["dom"].node; + // Handle the cases where optgroup is hidden, which should trigger a violations + // but in the case that Check hidden option is set then should not trigger a violation. + var passed = CommonUtil_1.CommonUtil.getChildByTagHidden(ruleContext, "optgroup", false, true).length > 0 || + CommonUtil_1.CommonUtil.getChildByTagHidden(ruleContext, "option", false, true).length <= + validateParams.paramNumOptions.value; + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/skip_main_described.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/skip_main_described.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.skip_main_described = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.skip_main_described = { + id: "skip_main_described", + context: "dom:body", + dependencies: ["skip_main_exists"], + refactor: { + "WCAG20_Body_FirstAContainsSkipText_Native_Host_Sematics": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "skip_main_described.html", + "Potential_1": "skip_main_described.html", + "group": "skip_main_described.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify that if this hyperlink skips content, the description communicates where it links to", + "group": "The description of a hyperlink used to skip content must communicate where it links to" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + paramSkipText: { + value: ["skip", "jump"], + type: "[string]" + } + }; + var ruleContext = context["dom"].node; + // Get the anchors on the page + var doc = ruleContext.ownerDocument; + // Check for landmarks first + var passed; + if (CacheUtil_1.CacheUtil.getCache(ruleContext, "IBM_hasLandmarks_Implicit", null) === null) { + CacheUtil_1.CacheUtil.setCache(ruleContext, "IBM_hasLandmarks_Implicit", CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, ["application", "banner", "complementary", "contentinfo", + "form", "main", "navigation", "search" + ], true, true).length > 0); + } + passed = CacheUtil_1.CacheUtil.getCache(ruleContext, "IBM_hasLandmarks_Implicit", false); + if (!passed) { // No landmarks, check for skip links + var links = doc.links; + // Skip link should be the first one on the page with an href attribute (i.e., links[0]) + // also if the first link is hidden then we should also trigger a violation. + if (links && links.length > 0 && VisUtil_1.VisUtil.isNodeVisible(links[0])) { + var testText = CommonUtil_1.CommonUtil.getInnerText(doc.links[0]).toLowerCase(); + for (var i = 0; !passed && i < validateParams.paramSkipText.value.length; ++i) { + passed = testText.indexOf(validateParams.paramSkipText.value[i]) != -1; + } + } + else + passed = false; + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/skip_main_exists.ts" +/*!******************************************!*\ + !*** ./src/v4/rules/skip_main_exists.ts ***! + \******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.skip_main_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var ancestor_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/ancestor */ "./src/v2/checker/accessibility/util/ancestor.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.skip_main_exists = { + id: "skip_main_exists", + context: "dom:body", + refactor: { + "WCAG20_Body_FirstASkips_Native_Host_Sematics": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "skip_main_exists.html", + "Fail_1": "skip_main_exists.html", + "group": "skip_main_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The page does not provide a way to quickly navigate to the main content (ARIA \"main\" landmark or a skip link)", + "group": "Pages must provide a way to skip directly to the main content" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.4.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + // This rule does not apply inside a presentational frame + if (ancestor_1.AncestorUtil.isPresentationFrame(contextHierarchies)) { + return null; + } + var ruleContext = context["dom"].node; + // Get the anchors on the page + var doc = ruleContext.ownerDocument; + // Check for landmarks first + var passed; + if (CacheUtil_1.CacheUtil.getCache(ruleContext, "IBM_hasLandmarks_Implicit", null) === null) { + CacheUtil_1.CacheUtil.setCache(ruleContext, "IBM_hasLandmarks_Implicit", CommonUtil_1.CommonUtil.getElementsByRoleHidden(ruleContext.ownerDocument, ["application", "banner", "complementary", "contentinfo", + "form", "main", "navigation", "search" + ], true, true).length > 0); + } + passed = CacheUtil_1.CacheUtil.getCache(ruleContext, "IBM_hasLandmarks_Implicit", false); + if (!passed) { // No landmarks, check for skip links + var anchors = CommonUtil_1.CommonUtil.getDocElementsByTag(ruleContext, "a"); + // Skip anchor should be the first one on the page with an href attribute + var testAnchor = null; + for (var i = 0; i < anchors.length; ++i) { + if (anchors[i].hasAttribute("href") && VisUtil_1.VisUtil.isNodeVisible(anchors[i])) { + testAnchor = anchors[i]; + break; + } + } + // Pull out the target id + var targetId = null; + if (testAnchor != null) { + var hrefStr = testAnchor.getAttribute("href"); + var idx = hrefStr.indexOf("#"); + if (idx != -1) { + targetId = hrefStr.substring(idx + 1); + } + } + // Determine if there is an element id or named anchor on the page with this + // target id. + if (targetId != null) { + passed = doc.getElementById(targetId) != null; + for (var i = 0; !passed && i < anchors.length; ++i) { + if (!anchors[i].hasAttribute("href") && + anchors[i].hasAttribute("name") && + anchors[i].getAttribute("name") == targetId) { + passed = true; + } + } + } + } + //return new ValidationResult(passed, [ruleContext], '', '', []); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/style_background_decorative.ts" +/*!*****************************************************!*\ + !*** ./src/v4/rules/style_background_decorative.ts ***! + \*****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.style_background_decorative = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.style_background_decorative = { + id: "style_background_decorative", + context: "dom:style, dom:*[style]", + refactor: { + "RPT_Style_BackgroundImage": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "style_background_decorative.html", + "Potential_1": "style_background_decorative.html", + "group": "style_background_decorative.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify the CSS background image does not convey important information", + "group": "Images included by using CSS alone must not convey important information" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + var passed = true; + if (nodeName === "link" && ruleContext.hasAttribute("rel") && + ruleContext.getAttribute("rel").toLowerCase() === "stylesheet") { + // External stylesheet - trigger + passed = CommonUtil_1.CommonUtil.triggerOnce(ruleContext, "style_background_decorative", false); + } + if (passed && nodeName === "style" || ruleContext.hasAttribute("style")) { + var styleText = void 0; + if (nodeName === "style") + styleText = CommonUtil_1.CommonUtil.getInnerText(ruleContext); + else + styleText = ruleContext.getAttribute("style"); + var bgMatches = styleText.match(/background:[^;]*/g); + if (bgMatches !== null) { + for (var i = 0; passed && i < bgMatches.length; ++i) + passed = bgMatches[i].indexOf("url(") === -1; + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/style_before_after_review.ts" +/*!***************************************************!*\ + !*** ./src/v4/rules/style_before_after_review.ts ***! + \***************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.style_before_after_review = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CSSUtil_1 = __webpack_require__(/*! ../util/CSSUtil */ "./src/v4/util/CSSUtil.ts"); +/** + * Description: Trigger if :before and :after are used in CSS (Internal and External) with content + * Origin: WCAG 2.0 F87 + */ +exports.style_before_after_review = { + id: "style_before_after_review", + context: "dom:style, dom:link", + refactor: { + "WCAG20_Style_BeforeAfter": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "group": "style_before_after_review.html", + "Pass_0": "style_before_after_review.html", + "Potential_1": "style_before_after_review.html" + } + }, + messages: { + "en-US": { + "group": "Do not use CSS '::before' and '::after' pseudo-elements to insert non-decorative content", + "Pass_0": "Rule Passed", + "Potential_1": "Verify the '::before' and '::after' pseudo-elements do not insert non-decorative content" + } + }, + rulesets: [{ + // Turn off the rule due to the obsolete requirement + //id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + id: [], + num: "1.3.1", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = true; + //check Internal styles + if (ruleContext.nodeName.toLowerCase() === "style") { + var css = CSSUtil_1.CSSUtil.getCSSStyle(ruleContext); + for (var i = 0; passed && i < css.length; ++i) { + // Guard against bad CSS + if (css[i].selector) { + passed = (css[i].selector.indexOf(":before") === -1 && css[i].selector.indexOf(":after") === -1) || + !("content" in css[i].values) || css[i].values["content"].trim().length === 0 || css[i].values["content"].trim() === "\"\"" + || css[i].values["content"].trim() === "\'\'" || css[i].values["content"].trim() === "none" || css[i].values["content"].trim() === "attr(x)" + || css[i].values["content"].trim() === "attr(y)"; + } + } + // check special rules in the stylesheets + if (passed) { + for (var sIndex = 0; sIndex < ruleContext.ownerDocument.styleSheets.length; sIndex++) { + var sheet = ruleContext.ownerDocument.styleSheets[sIndex]; + if (sheet.ownerNode === ruleContext) { + try { + var styleRules = sheet.cssRules ? sheet.cssRules : sheet.rules; + if (styleRules) { + for (var styleRuleIndex = 0; passed && styleRuleIndex < styleRules.length; styleRuleIndex++) { + var styleRule = styleRules[styleRuleIndex]; + // check @media rules + // + // The check 'if (styleRule instanceof CSSMediaRule)' doesn't work when run in Karma(but works in DAP) + // so let's access the type directly as a workaround + var styleImportRule = void 0; + if (styleRule.type && styleRule.type === 4 /* CSSRule.MEDIA_RULE */) { + var styleMediaRule = styleRule; + var mediaRules = styleMediaRule.cssRules; + if (mediaRules) { + for (var rIndex = 0; passed && rIndex < mediaRules.length; rIndex++) { + var mRule = mediaRules[rIndex]; // selectorText not recognized + if (mRule.selectorText !== null && mRule.selectorText !== undefined) { + var rule = mRule.selectorText.toLowerCase(); + if (rule.indexOf(":before") !== -1 || rule.indexOf(":after") !== -1) { + var content = mRule.style['content']; + if (content && content.trim().length) { + if (content.trim() !== "\"\"" && + content.trim() !== "\'\'" && + content.trim() !== "none" && + content.trim() !== "attr(x)" && + content.trim() !== "attr(y)") { + passed = false; + } + } + } + } + } + } + } + // check import rules + else if (styleRule.type && styleRule.type === 3 /* CSSRule.IMPORT_RULE */ && (styleImportRule = styleRule).styleSheet) { + var rules = styleImportRule.styleSheet.cssRules ? + styleImportRule.styleSheet.cssRules : + styleImportRule.styleSheet.rules; + if (rules) { + for (var rIndex = 0; passed && rIndex < rules.length; rIndex++) { + var importedRule = rules[rIndex]; + // check @media rules + if (importedRule.type && importedRule.type === 4 /* CSSRule.MEDIA_RULE */) { + var mediaRules = importedRule.cssRules; + if (mediaRules) { + for (var mIndex = 0; mIndex < mediaRules.length; mIndex++) { + var mRule = mediaRules[mIndex]; // selectorText not recognized + if (mRule.selectorText !== null && mRule.selectorText !== undefined) { + var rule = mRule.selectorText.toLowerCase(); + if (rule.indexOf(":before") !== -1 || rule.indexOf(":after") !== -1) { + var content = mRule.style['content']; + if (content && content.trim().length) { + if (content.trim() !== "\"\"" && + content.trim() !== "\'\'" && + content.trim() !== "none" && + content.trim() !== "attr(x)" && + content.trim() !== "attr(y)") { + passed = false; + } + } + } + } + } + } + } + else if (importedRule.selectorText !== null && importedRule.selectorText !== undefined) { + var rule = importedRule.selectorText.toLowerCase(); + //support both single colon (:) and double colon (::) pseudo + if (rule.indexOf(":before") !== -1 || rule.indexOf(":after") !== -1) { + var content = importedRule.style['content']; + if (content && content.trim().length) { + if (content.trim() !== "\"\"" && + content.trim() !== "\'\'" && + content.trim() !== "none" && + content.trim() !== "attr(x)" && + content.trim() !== "attr(y)") { + passed = false; + } + } + } + } + } + } + } + } + } + } + catch (e) { + // Ignore css access issues + } + } + } + } + } + //check external styles + if (ruleContext.nodeName.toLowerCase() === "link" && ruleContext.hasAttribute("rel") && + ruleContext.getAttribute("rel").toLowerCase() === "stylesheet" && + ruleContext.hasAttribute("href") && ruleContext.getAttribute("href").trim().length !== 0) { + for (var sIndex = 0; sIndex < ruleContext.ownerDocument.styleSheets.length; sIndex++) { + var sheet = ruleContext.ownerDocument.styleSheets[sIndex]; + if (sheet && sheet.ownerNode === ruleContext) { + try { + var rules = sheet.cssRules ? sheet.cssRules : sheet.rules; + if (rules) { + for (var rIndex = 0; passed && rIndex < rules.length; rIndex++) { + var ruleFromLink = rules[rIndex]; + // check @media rules + if (ruleFromLink.type && ruleFromLink.type === 4 /* CSSRule.MEDIA_RULE */) { + var mediaRules = ruleFromLink.cssRules; + if (mediaRules) { + for (var mIndex = 0; passed && mIndex < mediaRules.length; mIndex++) { + var mRule = mediaRules[mIndex]; + if (mRule.selectorText !== null && mRule.selectorText !== undefined) { + var ruleSelTxt = mRule.selectorText.toLowerCase(); + if (ruleSelTxt.indexOf(":before") !== -1 || ruleSelTxt.indexOf(":after") !== -1) { + var content = mRule.style['content']; + if (content && content.trim().length) { + if (content.trim() !== "\"\"" && + content.trim() !== "\'\'" && + content.trim() !== "none" && + content.trim() !== "attr(x)" && + content.trim() !== "attr(y)") { + passed = false; + } + } + } + } + } + } + } + else if (rules[rIndex].selectorText !== null && rules[rIndex].selectorText !== undefined) { + var rule = rules[rIndex].selectorText.toLowerCase(); + //support both single colon (:) and double colon (::) pseudo + if (rule.indexOf(":before") !== -1 || rule.indexOf(":after") !== -1) { + var content = rules[rIndex].style['content']; + if (content && content.trim().length) { + if (content.trim() !== "\"\"" && + content.trim() !== "\'\'" && + content.trim() !== "none" && + content.trim() !== "attr(x)" && + content.trim() !== "attr(y)") { + passed = false; + } + } + } + } + } + } + } + catch (e) { + // Ignore css access issues + } + } + } + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/style_color_misuse.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/style_color_misuse.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.style_color_misuse = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +exports.style_color_misuse = { + id: "style_color_misuse", + context: "dom:style, dom:*[style], dom:font[color], dom:link", + refactor: { + "RPT_Style_ColorSemantics1": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "group": "style_color_misuse.html", + "Pass_0": "style_color_misuse.html", + "Potential_1": "style_color_misuse.html" + } + }, + messages: { + "en-US": { + "group": "Combine color and descriptive markup to convey information", + "Pass_0": "Rule Passed", + "Potential_1": "Verify color is not used as the only visual means of conveying information" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "1.4.1", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + var styleText = ""; + if (nodeName === "style") { + styleText = CommonUtil_1.CommonUtil.getInnerText(ruleContext).toLowerCase(); + // check import + for (var sIndex = 0; sIndex < ruleContext.ownerDocument.styleSheets.length; sIndex++) { + var sheet = ruleContext.ownerDocument.styleSheets[sIndex]; + if (sheet && sheet.ownerNode === ruleContext) { + try { + var styleRules = sheet.cssRules ? sheet.cssRules : sheet.rules; + for (var styleRuleIndex = 0; styleRuleIndex < styleRules.length; styleRuleIndex++) { + var styleRule = styleRules[styleRuleIndex]; + var styleImportRule = void 0; + if (styleRule.type && styleRule.type === 3 /* CSSRule.IMPORT_RULE */ && (styleImportRule = styleRule).styleSheet) { + var importRules = styleImportRule.styleSheet.cssRules ? styleImportRule.styleSheet.cssRules : styleImportRule.styleSheet.rules; + for (var rIndex = 0; rIndex < importRules.length; rIndex++) { + var iRule = importRules[rIndex]; + styleText += iRule.cssText; + } + } + } + } + catch (e) { + // Silence css access issues + } + } + } + } + else if (ruleContext.hasAttribute("style")) { + styleText = ruleContext.getAttribute("style").toLowerCase(); + } + else if (nodeName === "link" && //check external styles + ruleContext.hasAttribute("rel") && + ruleContext.getAttribute("rel").toLowerCase() === "stylesheet" && + ruleContext.hasAttribute("href") && + ruleContext.getAttribute("href").trim().length !== 0) { + for (var sIndex = 0; sIndex < ruleContext.ownerDocument.styleSheets.length; sIndex++) { + var sheet = ruleContext.ownerDocument.styleSheets[sIndex]; + if (sheet && sheet.ownerNode === ruleContext) { + try { + var rules = sheet.cssRules ? sheet.cssRules : sheet.rules; + for (var rIndex = 0; rIndex < rules.length; rIndex++) { + styleText += rules[rIndex].cssText; + } + } + catch (e) { + // Silence css access issues + } + } + } + } + var passed = true; + // Defect 1022: Find uses of 'color' and '*background*' only + var isBgUsed = styleText.match(/\bbackground\b/i); + var theColorStyleToCheck = styleText.replace(/-color/g, ""); + var isColorUsed = theColorStyleToCheck.match(/\bcolor\b/i); + if (ruleContext.hasAttribute("color") || isColorUsed || isBgUsed) { + var goodTagNames = { + "em": "", "strong": "", "cite": "", "dfn": "", + "code": "", "samp": "", "kbd": "", "var": "", "abbr": "", "acronym": "" + }; + // Color used � are there semantics involved? + passed = nodeName in goodTagNames || + CommonUtil_1.CommonUtil.getAncestor(ruleContext, goodTagNames) !== null; + if (!passed && ruleContext.hasChildNodes()) { + var nw = new DOMWalker_1.DOMWalker(ruleContext); + while (!passed && nw.nextNode() && nw.node !== ruleContext) { + passed = nw.node.nodeName.toLowerCase() in goodTagNames; + } + } + } + // Trigger only once + if (!passed) { + var triggered = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "style_color_misuse", false); + passed = triggered; + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "style_color_misuse", true); + } + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/style_focus_visible.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/style_focus_visible.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.style_focus_visible = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CSSUtil_1 = __webpack_require__(/*! ../util/CSSUtil */ "./src/v4/util/CSSUtil.ts"); +var ColorUtil_1 = __webpack_require__(/*! ../util/ColorUtil */ "./src/v4/util/ColorUtil.ts"); +exports.style_focus_visible = { + id: "style_focus_visible", + context: "dom:*", + refactor: { + "RPT_Style_HinderFocus1": { + "Potential_1": "potential_focus_not_visible" + } + }, + help: { + "en-US": { + "group": "style_focus_visible.html", + "potential_focus_not_visible": "style_focus_visible.html", + "pass_focus_visible": "style_focus_visible.html" + } + }, + messages: { + "en-US": { + "group": "The keyboard focus indicator should be visible when default border or outline is modified by CSS", + "potential_focus_not_visible": "Check the keyboard focus indicator is visible when using CSS declaration for 'border' or 'outline'", + "pass_focus_visible": "The keyboard focus indicator is visible or is not changed from the browser default" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "2.4.7", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var validateParams = { + skipNodes: { + value: ["table"], + type: "[string]" + }, + checkParams: { + value: ["border", "border-width", "border-style", + "border-top-width", "border-right-width", "border-bottom-width", "border-left-width", + "border-top-color", "border-right-color", "border-bottom-color", "border-left-color", + "border-top-style", "border-right-style", "border-bottom-style", "border-left-style", + "outline", "outline-width", "outline-color", "outline-style"], + type: "[string]" + } + }; + var ruleContext = context["dom"].node; + if (!CommonUtil_1.CommonUtil.isTabbable(ruleContext) || validateParams.skipNodes.value.includes(ruleContext.nodeName.toLowerCase())) { + return null; + } + // Get all styles in a single pass through stylesheets + var allStyles = CSSUtil_1.CSSUtil.getDefinedStylesMultiple(ruleContext, null, ["", ":focus", ":focus-visible", ":focus-within"]); + var normalStyles = allStyles[""]; // consider both user-defined and browser default + var focusStyles = []; + focusStyles.push(allStyles[":focus"]); + focusStyles.push(allStyles[":focus-visible"]); + focusStyles.push(allStyles[":focus-within"]); + // if focus style is defined + var styleObj = focusStyles[0]; + if (Object.keys(styleObj).length > 0) { + //pass if outline is not defined at all, browser will override + if (((!normalStyles["outline-width"] && !normalStyles["outline-style"]) + || (normalStyles["outline-width"] === '0px' || normalStyles["outline-style"] === 'none')) + && (!styleObj["outline-style"] || styleObj["outline-style"] !== 'none')) + return (0, IRule_1.RulePass)("pass_focus_visible"); + var noneStyle = false; + var numOtherStyle = 0; + for (var focusStyle in styleObj) { + if (validateParams.checkParams.value.includes(focusStyle)) { + /** + * failure case: + * 1. focus outline or border style is none and no other style (color or width) defined + * 2. focus outline or border style is same with the normal + * 3. size in focus is same or smaller than default + * 4. color contrast in focus is better + */ + var focusStyleValue = styleObj[focusStyle]; + var normalStyleValue = normalStyles[focusStyle]; + if (focusStyle.includes("style")) { + if (focusStyleValue === "none") + noneStyle = true; + else + noneStyle = false; + if (normalStyleValue && focusStyleValue !== "none" && focusStyleValue === normalStyleValue) + return (0, IRule_1.RulePotential)("potential_focus_not_visible"); + } + else if (focusStyle.includes("width")) { + numOtherStyle++; + //proximation of the width style + if (focusStyleValue === 'initial') + focusStyleValue = '2px'; + else if (focusStyleValue === 'thin') + focusStyleValue = '1px'; + else if (focusStyleValue === 'medium') + focusStyleValue = '2px'; + else if (focusStyleValue === 'thick') + focusStyleValue = '3px'; + if (normalStyleValue) { + if (normalStyleValue === 'initial') + normalStyleValue = '2px'; + else if (normalStyleValue === 'thin') + normalStyleValue = '1px'; + else if (normalStyleValue === 'medium') + normalStyleValue = '2px'; + else if (normalStyleValue === 'thick') + normalStyleValue = '3px'; + } + focusStyleValue = CSSUtil_1.CSSUtil.getPixelsFromStyle(focusStyleValue, ruleContext); + normalStyleValue = CSSUtil_1.CSSUtil.getPixelsFromStyle(normalStyleValue, ruleContext); + if (focusStyleValue == 0 || focusStyleValue <= normalStyleValue) + return (0, IRule_1.RulePotential)("potential_focus_not_visible"); + } + else if (focusStyle.includes("color")) { + numOtherStyle++; + // get the element bg color + var colorCombo = ColorUtil_1.ColorUtil.ColorCombo(ruleContext); + if (colorCombo === null) + continue; + var bg = colorCombo.bg; + if (!bg) + continue; + //proximation of the width style + if (focusStyleValue === 'initial') + focusStyleValue = 'black'; + if (normalStyleValue && normalStyleValue === 'initial') + normalStyleValue = 'black'; + // get the border/outline color as fg colors + focusStyleValue = ColorUtil_1.ColorUtil.Color(focusStyleValue); + normalStyleValue = ColorUtil_1.ColorUtil.Color(normalStyleValue); + if (focusStyleValue === null || normalStyleValue === null) + continue; + //get the border/outline color contrast ratios + var focusRatio = focusStyleValue.contrastRatio(bg); + var normalRatio = normalStyleValue.contrastRatio(bg); + if (focusRatio < 3.0 || focusRatio <= normalRatio) + return (0, IRule_1.RulePotential)("potential_focus_not_visible"); + } + else { + //other + numOtherStyle++; + if (normalStyleValue != null && focusStyleValue === normalStyleValue) + return (0, IRule_1.RulePotential)("potential_focus_not_visible"); + } + } + } + // warn if a border/outline focus style is 'none' and noe other (color and/or width) is defined + if (noneStyle && numOtherStyle === 0) + return (0, IRule_1.RulePotential)("potential_focus_not_visible"); + } + else { + // no focus style defined + // warn if normal style is defined and is not "none" + for (var normalStyle in normalStyles) { + if (validateParams.checkParams.value.includes(normalStyle)) { + var normalStyleValue = normalStyles[normalStyle]; + // ignore if border or outline style is "none" + if (normalStyleValue !== 'none') + return (0, IRule_1.RulePotential)("potential_focus_not_visible"); + } + } + } + return (0, IRule_1.RulePass)("pass_focus_visible"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/style_highcontrast_visible.ts" +/*!****************************************************!*\ + !*** ./src/v4/rules/style_highcontrast_visible.ts ***! + \****************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.style_highcontrast_visible = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +exports.style_highcontrast_visible = { + id: "style_highcontrast_visible", + context: "dom:style, dom:link, dom:*[style]", + refactor: { + "RPT_Style_Trigger2": { + "Pass_0": "Pass_0", + "Manual_1": "Manual_1" + } + }, + help: { + "en-US": { + "Pass_0": "style_highcontrast_visible.html", + "Manual_1": "style_highcontrast_visible.html", + "group": "style_highcontrast_visible.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Manual_1": "Confirm Windows high contrast mode is supported when using CSS to include, position or alter non-decorative content", + "group": "Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next"], + "num": ["1.1.1", "1.3.2", "1.4.11"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }, + { + "id": ["WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1", "1.3.2", "1.4.11"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (nodeName === "link" && + (!ruleContext.hasAttribute("rel") || ruleContext.getAttribute("rel").toLowerCase() !== "stylesheet")) + return (0, IRule_1.RulePass)("Pass_0"); + if (nodeName !== "style" && nodeName !== "link" && + ruleContext.hasAttribute("style") && ruleContext.getAttribute("style").trim().length === 0) + return (0, IRule_1.RulePass)("Pass_0"); + var triggered = CacheUtil_1.CacheUtil.getCache(ruleContext.ownerDocument, "style_highcontrast_visible", false); + var passed = triggered; + // Packages.java.lang.System.out.println(triggered); + CacheUtil_1.CacheUtil.setCache(ruleContext.ownerDocument, "style_highcontrast_visible", true); + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RuleManual)("Manual_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/style_hover_persistent.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/style_hover_persistent.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.style_hover_persistent = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.style_hover_persistent = { + id: "style_hover_persistent", + context: "dom:style, dom:*[style], dom:*", + help: { + "en-US": { + "Pass_0": "style_hover_persistent.html", + // "Pass_1": "style_hover_persistent.html", + "Pass_2": "style_hover_persistent.html", + "Potential_1": "style_hover_persistent.html", + "Potential_2": "style_hover_persistent.html", + "Potential_3": "style_hover_persistent.html", + "group": "style_hover_persistent.html" + } + }, + messages: { + "en-US": { + "Pass_0": "the hover: pseudo-class is not used to display content", + // "Pass_1": "content displayed via the :hover pseudo-class is a direct child of the trigger element", + "Pass_2": "content displayed via the :hover pseudo-class is the adjacent sibling of the trigger element", + "Potential_1": "Confirm the pointer can be positioned over the displayed element, not just the trigger", + "Potential_2": "Confirm the pointer can be positioned over all the information displayed on hover", + "Potential_3": "Confirm the margin style attribute has not prevented the pointer from hovering over the displayed element, not just the trigger", + "group": "The pointer should be able to move over content displayed on hover" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_2"], + "num": ["1.4.13"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var pass0 = false; + var pass1 = false; + var pass2 = false; // never happen + var potential1 = false; + var potential2 = false; + var potential3 = false; + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + var styleText = ""; + if (nodeName === "style") { + // console.log("RULE RUN ******************"); + styleText = CommonUtil_1.CommonUtil.getInnerText(ruleContext).toLowerCase(); + // check import + // console.log("ruleContext.ownerDocument.styleSheets.length = "+ruleContext.ownerDocument.styleSheets.length); + for (var sIndex = 0; sIndex < ruleContext.ownerDocument.styleSheets.length; ++sIndex) { + var sheet = ruleContext.ownerDocument.styleSheets[sIndex]; + if (sheet && sheet.ownerNode === ruleContext) { + try { + var styleRules = sheet.cssRules ? sheet.cssRules : sheet.rules; + // console.log("styleRules.length = "+styleRules.length); + for (var styleRuleIndex = 0; styleRuleIndex < styleRules.length; styleRuleIndex++) { + // console.log("**********"); + // console.log("********** FOR LOOP styleRuleIndex = "+styleRuleIndex); + var foundHover = false; + var hoverElement = ""; + var plusCombinator = false; + var tildeCombinator = false; + var afterCombinatorElement = ""; + var afterCombinatorElementDisplay = false; + var afterCombinatorElementDisplayValue = false; + var afterCombinatorElementHover = false; + var supportingElement = false; + var supportingHover = false; + var supportingHoverElementDisplayProperty = false; + var supportingHoverElementDisplayValue = false; + var adjacentPlusSibling = false; + var adjacentTildeMultipleSibling = false; + var styleRule = styleRules[styleRuleIndex]; + var ruleText = styleRules[styleRuleIndex].cssText; + // console.log("styleRules["+styleRuleIndex+"] = "+ruleText); + // 1. Check for :hover + if (ruleText.match(/:hover/g)) { + foundHover = true; + // console.log("1. found :hover = "+ foundHover); + // 2. Get hover element + hoverElement = ruleText.split(":")[0]; + // console.log("2. found element that goes with :hover = "+hoverElement); + } + else { + // console.log("1. No hover on css element so skip this rule"); + continue; // if no :hover skip this rule + } + // 3a. Check for css combinator + + // 4a. if so do we have an after combinator element + var plusTempStr = ruleText.substring(ruleText.indexOf("+") + 1); + plusTempStr = plusTempStr.trim(); + if (ruleText.match(/:hover \+/g) || ruleText.match(/:hover\+/g)) { + plusCombinator = true; + // console.log("3a. Found plusCombinator = "+ plusCombinator); + afterCombinatorElement = plusTempStr.split(" ")[0]; + // console.log("4a. Found plus afterCombinatorElement = "+afterCombinatorElement); + } + // 3b. Check for css combinator + + // 4b. if so do we have an after combinator element + if (ruleText.match(/:hover \~/g) || ruleText.match(/:hover\~/g)) { + // console.log("match = "+ruleText.match(":hover \~")); + tildeCombinator = true; + // console.log("3b. Found tildeCombinator = "+ tildeCombinator); + var plusTempStr_1 = ruleText.substring(ruleText.indexOf("~") + 1); + plusTempStr_1 = plusTempStr_1.trim(); + afterCombinatorElement = plusTempStr_1.split(" ")[0]; + // console.log("4b. Found tilde afterCombinatorElement = "+afterCombinatorElement); + } + if (!plusCombinator && !tildeCombinator) { + // NO plusCombinator or tildeCombinator so skip this rule + // console.log("NO plusCombinator or tildeCombinator so PASS"); + // console.log("**** REPORT PASS 0 HERE"); + return (0, IRule_1.RulePass)("Pass_0"); // JCH: should we have a N/A pass + } + // So now we have a css element with hover - element:hover so we have problems + // to check + // 5. Check if the after combinator element has display: property + // 6. Check if display property is not none + if (afterCombinatorElement) { + // get index of display: + // console.log("plusTempStr = "+plusTempStr); + var index = plusTempStr.indexOf("display:"); + if (index) { + afterCombinatorElementDisplay = true; + // console.log("5. Found afterCombinatorElementDisplay = "+afterCombinatorElementDisplay); + if (plusTempStr.slice(index + 8).trim().split(" ")[0] !== "none;") { + afterCombinatorElementDisplayValue = true; + // console.log("6. Found afterCombinatorElementDisplayValue not none = "+afterCombinatorElementDisplayValue); + } + else { + // console.log("afterCombinatorElementDisplayValue === none"); + // console.log("**** PUT POTENTIAL 0 HERE"); + continue; + } + } + else { + // this is bad css so it won't happen + // console.log("NO afterCombinatorElementDisplay so skip this rule"); + continue; + } + } + else { + // this is bad css so it won't happen + // console.log("NO afterCombinatorElement so skip this rule"); + continue; + } + if (afterCombinatorElementDisplayValue) + if (sheet && sheet.ownerNode === ruleContext) { + // console.log("**** At this point we have verified that we have a css element with a hover of the format span:hover + div { display: block; } with all the proper properties and values"); + // NOTE: At this point we have verified that we have a css element with a hover + // of the format span:hover + div { display: block; } + // with all the proper properties and values + try { + var styleRules2 = sheet.cssRules ? sheet.cssRules : sheet.rules; + // console.log("styleRules2.length = "+styleRules2.length); + for (var styleRuleIndex2 = 0; styleRuleIndex2 < styleRules2.length; styleRuleIndex2++) { + // Check rule for afterCominatorElement:hover + // If find afterCombinatorElement:hover see if rule has property display: value where + // value != none + // console.log("**********"); + // console.log("********** 2nd FOR styleRuleIndex2 = "+styleRuleIndex2); + var ruleText2 = styleRules[styleRuleIndex2].cssText; + // console.log("ruleText2 = ", ruleText2); + // console.log("afterCombinatorElement = "+afterCombinatorElement); + // Check all supporting elements for margin property + // If find margin STOP and REPORT ERROR + var regExString = afterCombinatorElement + " {"; + var trimRuleText2 = ruleText2.trim(); + var regIndex = trimRuleText2.indexOf(regExString); + var afterCombinatorElementProperties = trimRuleText2.slice(regIndex).trim(); + //if (!afterCombinatorElementProperties.match(/margin/g)) { + if (!trimRuleText2.match(/margin/g)) { + // console.log("No margin problem so continue on..."); + // do we have a supporting element css definitions + var supportingHoverElement = ruleText2.split(":")[0]; + supportingHoverElement = supportingHoverElement.split(" ")[0]; + // console.log("supportingHoverElement = "+supportingHoverElement); + // console.log("afterCombinatorElement = "+afterCombinatorElement); + // NEED TO CHECK FOR afterCominatorElement:hover in ONE STEP + if (supportingHoverElement === afterCombinatorElement && ruleText2.match(/:hover/g)) { + // console.log("7. Found supporting hover element same as afterCombinatorElement") + // 7. Found supporting hover element same as afterCombinatorElement + supportingElement = true; + // does supporting element have hover + // console.log("8. Supporting element has hover also = "+ foundHover); + // 8. Supporting element has hover also + supportingHover = true; + var index = ruleText2.indexOf("display:"); + // console.log("index = "+index); + if (index) { + // 9. Found supportingHoverElementDisplayProperty + supportingHoverElementDisplayProperty = true; + // console.log("9. Found supportingHoverElementDisplayProperty = "+supportingHoverElementDisplayProperty); + if (plusTempStr.slice(index + 8).trim().split(" ")[0] !== "none;") { + // 10. Found supportingHoverElementDisplayValue not none + supportingHoverElementDisplayValue = true; + // console.log("10. Found supportingHoverElementDisplayValue not none = "+supportingHoverElementDisplayValue); + // Get list of hover elements and next sibling for + + // For + there must be at least one ADJACENT sibling + if (hoverElement !== "" && plusCombinator) { + var hoverElementList = ruleContext.ownerDocument.getElementsByTagName(hoverElement.toUpperCase()); + // console.log("hoverElementList.length = "+hoverElementList.length); + // console.log("hoverElementList[0].tagName = "+hoverElementList[0].tagName); + // Get adjacent sibling + // console.log("Adjacent sibling = "+hoverElementList[0].nextElementSibling.tagName); + // console.log("afterCombinatorElement.toUpperCase() = "+afterCombinatorElement.toUpperCase()); + if (afterCombinatorElement.toUpperCase() === hoverElementList[0].nextElementSibling.tagName) { + // console.log("11a. Hover with plus has adjacent sibling.") + // 11a. Hover with plus has adjacent sibling. + adjacentPlusSibling = true; + // At this point we have verified a supporting afterCombinatorElement css rule that contains hover and display property that is not equal to none and has a hover element in the body with an adjacent sibling + // console.log("**** REPORT PASS 1 HERE"); + pass0 = true; + continue; + } + } + else if (plusCombinator) { + // console.log("11a. Main hover with + combinator has no adjacent sibling"); + if (!potential1) { + // console.log("**** PUT POTENTIAL 1 HERE"); + potential1 = true; + break; + } + continue; + } + // Get list of hover elements and determine if there are 2 or more adjacent siblings for ~ + // For ~ there must be at least one ADJACENT sibling + if (hoverElement !== "" && tildeCombinator) { + // console.log("hoverElement.toUpperCase() = "+hoverElement.toUpperCase()); + var hoverElementList = ruleContext.ownerDocument.getElementsByTagName(hoverElement.toUpperCase()); + // console.log("hoverElementList.length = "+hoverElementList.length); + // Check for two or more adjacent siblings + var siblings = []; + var sibling = hoverElementList[0].nextElementSibling; + do { + // console.log("sibling.tagName = "+sibling.tagName); + if (sibling.tagName === afterCombinatorElement.toUpperCase()) { + siblings.push(sibling); + } + else { + break; + } + } while ((sibling = sibling.nextElementSibling)); + var siblingCount = siblings.length; + // console.log("siblingCount = "+siblingCount); + // JCH TODO: what if sibling count 0 + if (siblingCount === 1) { + // console.log("11b. Hover with tilde and one adjacent sibling"); + adjacentTildeMultipleSibling = true; + // console.log("**** REPORT PASS 2 HERE"); + return (0, IRule_1.RulePass)("Pass_2"); + } + else if (siblingCount > 1) { + // console.log("Main hover with ~ combinator has two or more siblings"); + if (!potential2) { + // console.log("**** PUT POTENTIAL 2 HERE"); + return (0, IRule_1.RulePotential)("Potential_2"); + } + } + } + } + else if (plusCombinator) { + // supportingHoverElementDisplayValue + // if we make it to the last rule and supportingHoverElementDisplayValue is still false => potential1 + if (styleRuleIndex2 === styleRules2.length - 1 && supportingHoverElementDisplayValue === false) { + // console.log("NO plus supportingHoverElementDisplayProperty"); + // console.log("**** PUT POTENTIAL 1 HERE"); + return (0, IRule_1.RulePotential)("Potential_1"); + } + else { + continue; + } + } + else if (tildeCombinator) { + // if we make it to the last rule and supportingHoverElementDisplayValue is still false => potential2 + if (styleRuleIndex2 === styleRules2.length - 1 && supportingHoverElementDisplayValue === false) { + // console.log("NO plus supportingHoverElementDisplayProperty"); + // console.log("**** PUT POTENTIAL 2 HERE"); + return (0, IRule_1.RulePotential)("Potential_1"); + } + else { + continue; + } + } + // note at least one of the rules must have a display property + } + else if (plusCombinator) { + // if we make it to the last rule and supportingHoverElementDisplayProperty is still false => potential1 + if (styleRuleIndex2 === styleRules2.length - 1 && supportingHoverElementDisplayProperty === false) { + // console.log("NO plus supportingHoverElementDisplayProperty"); + // console.log("**** PUT POTENTIAL 1 HERE"); + return (0, IRule_1.RulePotential)("Potential_1"); + } + else { + continue; + } + } + else if (tildeCombinator) { + // if we make it to the last rule and supportingHoverElementDisplayProperty is still false => potential2 + if (styleRuleIndex2 === styleRules2.length - 1 && supportingHoverElementDisplayProperty === false) { + // console.log("NO tilde supportingHoverElementDisplayProperty"); + // console.log("**** PUT POTENTIAL 2 HERE"); + return (0, IRule_1.RulePotential)("Potential_1"); + } + else { + continue; + } + } + // note at least one of the rules must have a supportingElement:hover + } + else if (plusCombinator) { + // if we make it to the last rule and supportingElement is still false => potential1 + // console.log("styleRuleIndex2 = "+styleRuleIndex2); + // console.log("styleRules2.length = "+styleRules2.length); + // console.log("supportingElement = "+supportingHover); + if (styleRuleIndex2 === styleRules2.length - 1 && supportingHover === false) { + // console.log("NO plus supportingElement:hover"); + // console.log("**** PUT POTENTIAL 1 HERE"); + return (0, IRule_1.RulePotential)("Potential_1"); + } + else { + continue; + } + } + else if (tildeCombinator) { + // if we make it to the last rule and supportingElement is still false => potential2 + // console.log("styleRuleIndex2 = "+styleRuleIndex2); + // console.log("styleRules2.length = "+styleRules2.length); + // console.log("supportingElement = "+supportingHover); + if (styleRuleIndex2 === styleRules2.length - 1 && supportingHover === false) { + // console.log("NO tilde supportingElement:hover"); + // console.log("**** PUT POTENTIAL 2 HERE"); + return (0, IRule_1.RulePotential)("Potential_2"); + } + else { + continue; + } + } + } + else { + // console.log("There is a margin in the supporting element"); + if (!potential3) { + // console.log("**** PUT POTENTIAL 3 HERE"); + potential3 = true; + return (0, IRule_1.RulePotential)("Potential_3"); + } + } + } + } + catch (e) { + // Silence css access issues + } + } + } + } + catch (e) { + // Silence css access issues + } + } + } + } + // console.log("----------------------"); + // console.log("pass0 = "+pass0); + // console.log("pass1 = "+pass1); + // console.log("pass2 = "+pass2); + // console.log("potential1 = "+potential1); + // console.log("potential2 = "+potential2); + // console.log("potential3 = "+potential3); + if (pass0) + return (0, IRule_1.RulePass)("Pass_0"); + // if (pass1) return RulePass("Pass_2"); // Doesn't trigger + // if (pass2) return RulePass("Pass_3"); // Doesn't trigger + if (potential1) + return (0, IRule_1.RulePotential)("Potential_1"); + if (potential2) + return (0, IRule_1.RulePotential)("Potential_2"); + if (potential3) + return (0, IRule_1.RulePotential)("Potential_3"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/style_viewport_resizable.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/style_viewport_resizable.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.style_viewport_resizable = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +/** + * Description: Trigger when viewport units are used for font size. + * Origin: Various + */ +exports.style_viewport_resizable = { + id: "style_viewport_resizable", + context: "dom:link, dom:style, dom:*[style]", + refactor: { + "WCAG21_Style_Viewport": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "group": "style_viewport_resizable.html", + "Pass_0": "style_viewport_resizable.html", + "Potential_1": "style_viewport_resizable.html" + } + }, + messages: { + "en-US": { + "group": "Text must scale up to 200% without loss of content or functionality", + "Pass_0": "Rule Passed", + "Potential_1": "Verify that text sized using viewport units can be resized up to 200%" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: ["1.4.4", "1.4.10"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = true; + var thePattern = /\d+(vw|vh|vmin|vmax)/gi; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (nodeName === "style") { + for (var sIndex = 0; sIndex < ruleContext.ownerDocument.styleSheets.length; sIndex++) { + var sheet = ruleContext.ownerDocument.styleSheets[sIndex]; + if (sheet.ownerNode === ruleContext) { + try { + var styleRules = sheet.cssRules ? sheet.cssRules : sheet.rules; + if (styleRules) { + for (var styleRuleIndex = 0; passed && styleRuleIndex < styleRules.length; styleRuleIndex++) { + var rule = styleRules[styleRuleIndex]; + if (rule.type && rule.type === 1 /* CSSRule.STYLE_RULE */) { + var styleRule = rule; + if (styleRule.style['fontSize']) { + var fontSize = styleRule.style['fontSize'].trim(); + var found = fontSize.match(thePattern); + if (fontSize.length && found) { + passed = false; + } + } + } + // check import rules + else if (rule.type && rule.type === 3 /* CSSRule.IMPORT_RULE */ && rule.styleSheet) { + var importRule = rule; + var rules = importRule.styleSheet.cssRules ? importRule.styleSheet.cssRules : importRule.styleSheet.rules; + if (rules) { + for (var rIndex = 0; passed && rIndex < rules.length; rIndex++) { + var importedRule = rules[rIndex]; + if (importedRule.type && importedRule.type === 1 /* CSSRule.STYLE_RULE */) { + if (importedRule.style['fontSize']) { + var fontSize = importedRule.style['fontSize'].trim(); + var found = fontSize.match(thePattern); + if (fontSize.length && found) { + passed = false; + } + } + } + } + } + } + } + } + } + catch (e) { + // Ignore css access issues + } + } + } + } + else if (nodeName === "link") { + for (var sIndex = 0; sIndex < ruleContext.ownerDocument.styleSheets.length; sIndex++) { + var sheet = ruleContext.ownerDocument.styleSheets[sIndex]; + if (sheet && sheet.ownerNode === ruleContext) { + try { + var rules = sheet.cssRules ? sheet.cssRules : sheet.rules; + if (rules) { + for (var rIndex = 0; passed && rIndex < rules.length; rIndex++) { + var ruleFromLink = rules[rIndex]; + // check rules + if (ruleFromLink.type && ruleFromLink.type === 1 /* CSSRule.STYLE_RULE */) { + if (ruleFromLink.style['fontSize']) { + var fontSize = ruleFromLink.style['fontSize'].trim(); + var found = fontSize.match(thePattern); + if (fontSize.length && found) { + passed = false; + } + } + } + } + } + } + catch (e) { + // Ignore css access issues + } + } + } + } + else { + var styleValue = ruleContext.getAttribute('style'); + if (styleValue) { + var stylePattern = /font-size:\s*\d+(vw|vh|vmin|vmax)/gi; + var found = styleValue.match(stylePattern); + if (found) { + passed = false; + } + } + } + return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/svg_graphics_labelled.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/svg_graphics_labelled.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.svg_graphics_labelled = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.svg_graphics_labelled = { + id: "svg_graphics_labelled", + context: "dom:svg", + help: { + "en-US": { + "group": "svg_graphics_labelled.html", + "pass": "svg_graphics_labelled.html", + "fail_acc_name": "svg_graphics_labelled.html" + } + }, + messages: { + "en-US": { + "group": "A non-decorative SVG element must have an accessible name", + "pass": "The SVG element has an accessible name", + "fail_acc_name": "The SVG element has no accessible name" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [{ + "7d6734": { + "pass": "pass", + "fail_acc_name": "fail" + } + }], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || VisUtil_1.VisUtil.isNodePresentational(ruleContext) || AccNameUtil_1.AccNameUtil.isAccessibleNameIgnorable(ruleContext)) + return null; + var name_pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ruleContext); + if (name_pair && name_pair.name && name_pair.name.trim().length > 0) + return (0, IRule_1.RulePass)("pass"); + return (0, IRule_1.RuleFail)("fail_acc_name"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/table_aria_descendants.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/table_aria_descendants.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_aria_descendants = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.table_aria_descendants = { + id: "table_aria_descendants", + context: "aria:table dom:tr[role], aria:table dom:th[role], aria:table dom:td[role], aria:grid dom:tr[role], aria:grid dom:th[role], aria:grid dom:td[role], aria:treegrid dom:tr[role], aria:treegrid dom:th[role], aria:treegrid dom:td[role]", + help: { + "en-US": { + "group": "table_aria_descendants.html", + "explicit_role": "table_aria_descendants.html" + } + }, + messages: { + "en-US": { + "group": "Table structure elements cannot specify an explicit 'role' within table containers", + "explicit_role": "An explicit ARIA 'role' is not valid for <{0}> element within an ARIA role '{1}' per the ARIA in HTML specification" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["4.1.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var parentRole = CommonUtil_1.CommonUtil.isTableDescendant(contextHierarchies); + // cache the result + if (parentRole === null || parentRole.length === 0) + return; + // ignore the redundancy cases: reported in the aria_role_redundant rule + var implicitRoles = AriaUtil_1.AriaUtil.getImplicitRole(ruleContext); + var explicitRoles = AriaUtil_1.AriaUtil.getRoles(ruleContext, false); + ; + if (implicitRoles && implicitRoles.length > 0 && explicitRoles && explicitRoles.length > 0 + && explicitRoles.some(function (item) { return implicitRoles.includes(item); })) + return; + return (0, IRule_1.RuleFail)("explicit_role", [context["dom"].node.nodeName.toLowerCase(), parentRole[0].role]); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/table_caption_empty.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/table_caption_empty.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_caption_empty = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.table_caption_empty = { + id: "table_caption_empty", + context: "dom:caption", + refactor: { + "Valerie_Caption_HasContent": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "table_caption_empty.html", + "Fail_1": "table_caption_empty.html", + "group": "table_caption_empty.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The <table> element has an empty <caption> element", + "group": "A <caption> element for a <table> element must contain descriptive text" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = CommonUtil_1.CommonUtil.hasInnerContentHidden(ruleContext); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/table_caption_nested.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/table_caption_nested.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_caption_nested = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.table_caption_nested = { + id: "table_caption_nested", + context: "dom:caption", + refactor: { + "Valerie_Caption_InTable": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "table_caption_nested.html", + "Fail_1": "table_caption_nested.html", + "group": "table_caption_nested.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "<caption> element is not nested inside a <table> element", + "group": "The <caption> element must be nested inside the associated <table> element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var passed = CommonUtil_1.CommonUtil.getAncestor(ruleContext, "table") != null; + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/table_headers_exists.ts" +/*!**********************************************!*\ + !*** ./src/v4/rules/table_headers_exists.ts ***! + \**********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_headers_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var TableUtil_1 = __webpack_require__(/*! ../util/TableUtil */ "./src/v4/util/TableUtil.ts"); +exports.table_headers_exists = { + id: "table_headers_exists", + context: "dom:table", + refactor: { + "RPT_Table_DataHeadingsAria": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "table_headers_exists.html", + "Fail_1": "table_headers_exists.html", + "group": "table_headers_exists.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Table has no headers identified", + "group": "Data table must identify headers" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // If this is a layout table or there are no rows, the rule does not apply. + var rows = ruleContext.rows; + if (!TableUtil_1.TableUtil.isDataTable(ruleContext) || rows === null || rows.length === 0) + return null; + var passed = TableUtil_1.TableUtil.tableHeaderExists(ruleContext); + if (passed === null) + return; + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/table_headers_ref_valid.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/table_headers_ref_valid.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_headers_ref_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var ARIAMapper_1 = __webpack_require__(/*! ../../v2/aria/ARIAMapper */ "./src/v2/aria/ARIAMapper.ts"); +exports.table_headers_ref_valid = { + id: "table_headers_ref_valid", + context: "dom:td[headers], dom:th[headers]", + help: { + "en-US": { + "Pass_0": "table_headers_ref_valid.html", + "Fail_1": "table_headers_ref_valid.html", + "Fail_2": "table_headers_ref_valid.html", + "Fail_3": "table_headers_ref_valid.html", + "Fail_4": "table_headers_ref_valid.html", + "group": "table_headers_ref_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The 'headers' attribute value \"{0}\" does not reference a valid 'id' in this document", + "Fail_2": "The 'headers' attribute value \"{0}\" refers to itself", + "Fail_3": "The 'headers' attribute value \"{0}\" does not refer to a cell in the same table", + "Fail_4": "The 'headers' attribute value \"{0}\" does not refer to a cell indicated with <th> or a role of \"columnheader\" or \"rowheader\"", + "group": "The 'headers' attribute should refer to a valid cell in the same table" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: ["a25f45"], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var parentTable = CommonUtil_1.CommonUtil.getAncestor(ruleContext, "table"); + var parentRole = ARIAMapper_1.ARIAMapper.nodeToRole(parentTable); + // If this is a layout table or a simple table the rule does not apply. + if (parentTable == null || !VisUtil_1.VisUtil.isNodeVisible(parentTable) || !["table", "grid"].includes(parentRole)) + return null; + var nodeName = ruleContext.nodeName.toLowerCase(); + var doc = ruleContext.ownerDocument; + var value = ruleContext.getAttribute("headers"); + if (!value) + return null; + var ids = value.split(" "); + var invalidHeaderValues = []; + var sameNodeHeaderValues = []; + var sameTableHeaderValues = []; + var invalidElemHeaderValues = []; + for (var i = 0; i < ids.length; i++) { + var id = ids[i]; + if (id.trim() === '') + continue; + var elem = doc.getElementById(id); + if (!elem) + invalidHeaderValues.push(id); + else if (DOMUtil_1.DOMUtil.sameNode(elem, ruleContext)) + sameNodeHeaderValues.push(id); + else if (!DOMUtil_1.DOMUtil.isInSameTable(elem, ruleContext)) + sameTableHeaderValues.push(id); + else { + var elemName = elem.nodeName.toLowerCase(); + if (elemName !== 'th') { + var roles = AriaUtil_1.AriaUtil.getRoles(elem, true); + if (!roles.includes('columnheader') && !roles.includes('rowheader')) + invalidElemHeaderValues.push(id); + } + } + } + var results = []; + if (invalidHeaderValues.length != 0) + results.push((0, IRule_1.RuleFail)("Fail_1", [invalidHeaderValues.toString()])); + if (sameNodeHeaderValues.length != 0) + results.push((0, IRule_1.RuleFail)("Fail_2", [sameNodeHeaderValues.toString()])); + if (sameTableHeaderValues.length != 0) + results.push((0, IRule_1.RuleFail)("Fail_3", [sameTableHeaderValues.toString()])); + if (invalidElemHeaderValues.length != 0) + results.push((0, IRule_1.RuleFail)("Fail_4", [invalidElemHeaderValues.toString()])); + if (results.length == 0) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return results; + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/table_headers_related.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/table_headers_related.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_headers_related = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var TableUtil_1 = __webpack_require__(/*! ../util/TableUtil */ "./src/v4/util/TableUtil.ts"); +exports.table_headers_related = { + id: "table_headers_related", + context: "dom:td, dom:th", + refactor: { + "Valerie_Table_DataCellRelationships": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "table_headers_related.html", + "Fail_1": "table_headers_related.html", + "group": "table_headers_related.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Complex table does not have headers for each cell properly defined with 'header' or 'scope'", + "group": "For a complex data table, all <th> and <td> elements must be related via 'header' or 'scope' attributes" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var parentTable = CommonUtil_1.CommonUtil.getAncestor(ruleContext, "table"); + // If this is a layout table or a simple table the rule does not apply. + if (parentTable == null || !TableUtil_1.TableUtil.isComplexDataTable(parentTable)) + return null; + // If this table hasn't been preprocessed, process it. + if (CacheUtil_1.CacheUtil.getCache(ruleContext, "table_headers_related", null) === null) { + // Build a grid that's actually usable (rowspan and colspan elements are duplicated) + // This builds a real 2d table array. + var grid = []; + for (var i = 0; i < parentTable.rows.length; ++i) { + var row = parentTable.rows[i]; + if (!grid[i]) + grid[i] = []; + for (var j = 0; j < row.cells.length; ++j) { + var cell = row.cells[j]; + CacheUtil_1.CacheUtil.setCache(cell, "table_headers_related", i + ":" + j); + var width = parseInt(cell.getAttribute("colspan")); + if (!width) + width = 1; + var height = parseInt(cell.getAttribute("rowspan")); + if (!height) + height = 1; + var gX = 0; + while (grid[i][gX]) + gX += 1; + for (var k = 0; k < height; ++k) { + if (!grid[i + k]) + grid[i + k] = []; + for (var l = 0; l < width; ++l) { + grid[i + k][gX + l] = cell; + } + } + } + } + // Iterate through the table grid and record headers that point to cells and + // cells that are pointed to by headers + var doc = ruleContext.ownerDocument; + var lookup = {}; + var scopedCols = {}; + for (var i = 0; i < grid.length; ++i) { + var rowScoped = false; + for (var j = 0; j < grid[i].length; ++j) { + var gridCell = grid[i][j]; + var gridNodeName = gridCell.nodeName.toLowerCase(); + if (gridNodeName == "th") { + if (gridCell.getAttribute("scope") == "row") { + rowScoped = true; + // If there's an axis attribute, it must be referred to by headers, + // scope is not enough. + if (!CommonUtil_1.CommonUtil.attributeNonEmpty(gridCell, "axis")) + lookup[CacheUtil_1.CacheUtil.getCache(gridCell, "table_headers_related", null)] = true; + } + else if (gridCell.getAttribute("scope") == "col") { + scopedCols[j] = true; + // If there's an axis attribute, it must be referred to by headers, + // scope is not enough. + if (!CommonUtil_1.CommonUtil.attributeNonEmpty(gridCell, "axis")) + lookup[CacheUtil_1.CacheUtil.getCache(gridCell, "table_headers_related", null)] = true; + } + // Headers can refer to other headers + if (CommonUtil_1.CommonUtil.attributeNonEmpty(gridCell, "headers")) { + var hdrs = gridCell.getAttribute("headers").split(" "); + for (var k = 0; k < hdrs.length; ++k) { + var headElem = doc.getElementById(hdrs[k].trim()); + if (headElem && CommonUtil_1.CommonUtil.getAncestor(headElem, "table") == parentTable) { + lookup[CacheUtil_1.CacheUtil.getCache(headElem, "table_headers_related", null)] = true; + } + } + } + } + else if (gridNodeName == "td") { + if (rowScoped || scopedCols[j]) { + lookup[CacheUtil_1.CacheUtil.getCache(gridCell, "table_headers_related", null)] = true; + } + else if (CommonUtil_1.CommonUtil.attributeNonEmpty(gridCell, "headers")) { + var hdrs = gridCell.getAttribute("headers").split(" "); + for (var k = 0; k < hdrs.length; ++k) { + var headElem = doc.getElementById(hdrs[k].trim()); + if (headElem && CommonUtil_1.CommonUtil.getAncestor(headElem, "table") == parentTable) { + lookup[CacheUtil_1.CacheUtil.getCache(gridCell, "table_headers_related", null)] = true; + lookup[CacheUtil_1.CacheUtil.getCache(headElem, "table_headers_related", null)] = true; + } + } + } + } + } + } + CacheUtil_1.CacheUtil.setCache(parentTable, "table_headers_related", lookup); + } + var rcInfo = CacheUtil_1.CacheUtil.getCache(ruleContext, "table_headers_related", null); + var tInfo = CacheUtil_1.CacheUtil.getCache(parentTable, "table_headers_related", null); + var passed = rcInfo && tInfo && rcInfo in tInfo; + if (!passed && rcInfo === "0:0" && + CommonUtil_1.CommonUtil.getInnerText(ruleContext).trim().length == 0) { + // We don't test if it's the upper-left cell and it's empty + return null; + } + // If the table has no th's, it may just be that this was supposed to be a layout + // table, which introduces a lot of noise. In that case, only trigger this error + // once per table. + if (!passed && parentTable.getElementsByTagName("th").length == 0) { + if (CacheUtil_1.CacheUtil.getCache(parentTable, "table_headers_related_TrigOnce", false) === true) { + passed = true; + } + else { + CacheUtil_1.CacheUtil.setCache(parentTable, "table_headers_related_TrigOnce", true); + } + } + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/table_layout_linearized.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/table_layout_linearized.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_layout_linearized = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var TableUtil_1 = __webpack_require__(/*! ../util/TableUtil */ "./src/v4/util/TableUtil.ts"); +exports.table_layout_linearized = { + id: "table_layout_linearized", + context: "dom:table", + refactor: { + "RPT_Table_LayoutTrigger": { + "Pass_0": "Pass_0", + "Potential_1": "Potential_1" + } + }, + help: { + "en-US": { + "Pass_0": "table_layout_linearized.html", + "Potential_1": "table_layout_linearized.html", + "group": "table_layout_linearized.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "Verify table is not being used to format text content in columns unless the table can be linearized", + "group": "Avoid using tables to format text documents in columns unless the table can be linearized" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.RECOMMENDATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_FOUR + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + var passed = !TableUtil_1.TableUtil.isLayoutTable(ruleContext); + if (passed) + return (0, IRule_1.RulePass)("Pass_0"); + if (!passed) + return (0, IRule_1.RulePotential)("Potential_1"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/table_scope_valid.ts" +/*!*******************************************!*\ + !*** ./src/v4/rules/table_scope_valid.ts ***! + \*******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_scope_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +exports.table_scope_valid = { + id: "table_scope_valid", + context: "dom:td[scope], dom:th[scope]", + refactor: { + "WCAG20_Table_Scope_Valid": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1", + "Fail_2": "Fail_2" + } + }, + help: { + "en-US": { + "Pass_0": "table_scope_valid.html", + "Fail_1": "table_scope_valid.html", + "Fail_2": "table_scope_valid.html", + "group": "table_scope_valid.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "Value provided is invalid for the 'scope' attribute", + "Fail_2": "The 'scope' attribute should only be used on a <th> element", + "group": "Value for 'scope' attribute must be \"row\", \"col\", \"rowgroup\", or \"colgroup\"" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + if (nodeName === 'td') + return (0, IRule_1.RuleFail)("Fail_2"); + //only continue for 'th' + var scopeVal = ruleContext.getAttribute("scope").trim().toLowerCase(); + var passed = /^(row|col|rowgroup|colgroup)$/.test(scopeVal); + if (!passed) { + return (0, IRule_1.RuleFail)("Fail_1"); + } + else { + return (0, IRule_1.RulePass)("Pass_0"); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/table_structure_misuse.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/table_structure_misuse.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_structure_misuse = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var TableUtil_1 = __webpack_require__(/*! ../util/TableUtil */ "./src/v4/util/TableUtil.ts"); +exports.table_structure_misuse = { + id: "table_structure_misuse", + context: "dom:table", + refactor: { + "WCAG20_Table_Structure": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "table_structure_misuse.html", + "Fail_1": "table_structure_misuse.html", + "group": "table_structure_misuse.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The <{0}> element with \"presentation\" role or \"none\" role has structural element(s) and/or attribute(s) '{1}'", + "group": "Table elements with 'role=\"presentation\" or 'role=\"none\" should not have structural elements or attributes" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the rule + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext)) + return null; + // JCH - OUT OF SCOPE hidden in context + if (TableUtil_1.TableUtil.isDataTable(ruleContext)) + return null; + if (AriaUtil_1.AriaUtil.isNodeInGrid(ruleContext)) + return null; + var errorNodes = []; + if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "summary")) + errorNodes.push(ruleContext); + var captionElems = ruleContext.getElementsByTagName("caption"); + for (var i = 0; i < captionElems.length; ++i) { + if (CommonUtil_1.CommonUtil.getAncestor(captionElems[i], "table") == ruleContext) { + // Check if the node should be skipped or not based on the Check Hidden Content setting and if the node isVisible or + // not. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(captionElems[i])) { + continue; + } + // Add the node to the errorNodes + errorNodes.push(captionElems[i]); + // Since we are not actually making use of theses errorNodes even though they are passed along with + // ValidationResult, we do not need to keep looping over and getting every single violating node under + // the rule context. This can be a future enhancenment where we actually make use of the error nodes that + // are passed along. Adding this break to speed up performance at this point. + break; // There is no point to keep adding the error nodes, stop after finding the first one + } + } + var thNodes = ruleContext.getElementsByTagName("th"); + for (var i = 0; i < thNodes.length; ++i) { + if (CommonUtil_1.CommonUtil.getAncestor(thNodes[i], "table") == ruleContext) { + // Check if the node should be skipped or not based on the Check Hidden Content setting and if the node isVisible or + // not. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(thNodes[i])) { + continue; + } + // Add the node to the errorNodes + errorNodes.push(thNodes[i]); + // Since we are not actually making use of theses errorNodes even though they are passed along with + // ValidationResult, we do not need to keep looping over and getting every single violating node under + // the rule context. This can be a future enhancenment where we actually make use of the error nodes that + // are passed along. Adding this break to speed up performance at this point. + break; // There is no point to keep adding the error nodes, stop after finding the first one + } + } + var tdNodes = ruleContext.getElementsByTagName("td"); + for (var i = 0; i < tdNodes.length; ++i) { + if ((tdNodes[i].hasAttribute("scope") || tdNodes[i].hasAttribute("headers")) && + CommonUtil_1.CommonUtil.getAncestor(tdNodes[i], "table") == ruleContext) { + // Check if the node should be skipped or not based on the Check Hidden Content setting and if the node isVisible or + // not. + if (CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(tdNodes[i])) { + continue; + } + // Add the node to the errorNodes + errorNodes.push(tdNodes[i]); + // Since we are not actually making use of theses errorNodes even though they are passed along with + // ValidationResult, we do not need to keep looping over and getting every single violating node under + // the rule context. This can be a future enhancenment where we actually make use of the error nodes that + // are passed along. Adding this break to speed up performance at this point. + break; // There is no point to keep adding the error nodes, stop after finding the first one + } + } + // Get the node name for the rule context element in this case it will always be table + var currentElementToken = ruleContext.nodeName.toLowerCase(); + // Construct a new array which will contan only the element tag for the violation elements + var structuralElementTokens = new Array(); + // Construct a seen hash that will keep trask of all the elements that were already added to the token array, to make sure + // we do not duplicate any of the elements. Duplicate element tags in the token message looks bad and confusing. + var seen = {}; + // Loop through all the violating structural elements and extract the element tag to be used as a token + for (var i = 0; i < errorNodes.length; i++) { + // Get the node name (tag name) for the violating structural element + var nodeName = errorNodes[i].nodeName.toLowerCase(); + // Only need to add the violating element once + if (!seen.hasOwnProperty(nodeName)) { + // Since we are adding the token as elements and attributes we need to handle + // the summary attribute on the ruleContext (table). We only add summary once, same as + // for elements to avoid duplication in the message. (Summary should not duplicate, but just in case) + if (nodeName == "table" && !seen.hasOwnProperty["summary"]) { + // Mark this as a new attribute + seen["summary"] = true; + // Since this is a new violating element add it to the structural element tokens array + structuralElementTokens.push("summary"); + } + else { + // Mark this as a new element + seen[nodeName] = true; + // Since this is a new violating element add it to the structural element tokens array + structuralElementTokens.push(nodeName); + } + } + } + // We need to take the array of structural elements and join them with a comma and a space to make grammatical correct in + // the message. + var structuralElementTokensStr = structuralElementTokens.join(", "); + //return new ValidationResult(errorNodes.length == 0, errorNodes, '', '', [currentElementToken, structuralElementTokens]); + if (errorNodes.length == 0) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1", [currentElementToken, structuralElementTokensStr]); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/table_summary_redundant.ts" +/*!*************************************************!*\ + !*** ./src/v4/rules/table_summary_redundant.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.table_summary_redundant = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +exports.table_summary_redundant = { + id: "table_summary_redundant", + context: "dom:table", + refactor: { + "WCAG20_Table_CapSummRedundant": { + "Pass_0": "Pass_0", + "Fail_1": "Fail_1" + } + }, + help: { + "en-US": { + "Pass_0": "table_summary_redundant.html", + "Fail_1": "table_summary_redundant.html", + "group": "table_summary_redundant.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Fail_1": "The table summary duplicates the caption", + "group": "The table summary must not duplicate the caption" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var pofId; + var passed = true; + var sumStr; + if (ruleContext.hasAttribute("summary")) { + pofId = 0; + sumStr = ruleContext.getAttribute("summary").trim().toLowerCase(); + } + else if (ruleContext.hasAttribute("aria-describedby")) { + pofId = 1; + var summaryNodeIds = ruleContext.getAttribute("aria-describedby").split(" "); + var summaryNodeConcat = ""; + for (var i = 0; i < summaryNodeIds.length; i++) { + var summaryNodeId = summaryNodeIds[i]; + if (summaryNodeId) { + var summaryNode = fragment_1.FragmentUtil.getById(ruleContext, summaryNodeId); + if (summaryNode && !DOMUtil_1.DOMUtil.sameNode(summaryNode, ruleContext)) { + summaryNodeConcat += " " + CommonUtil_1.CommonUtil.getInnerText(summaryNode).trim().toLowerCase(); + } + } + } + sumStr = summaryNodeConcat; + } + if (!sumStr) { + return null; + } + else { + var capElems = ruleContext.getElementsByTagName("caption"); + if (capElems.length === 0) { + return null; + } + else if (sumStr.length > 0) { + var capStr = CommonUtil_1.CommonUtil.getInnerText(capElems[0]).trim().toLowerCase(); + if (!sumStr.includes(capStr)) { + return (0, IRule_1.RulePass)("Pass_0"); + } + else { + return (0, IRule_1.RuleFail)("Fail_1"); + } + } + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/target_spacing_sufficient.ts" +/*!***************************************************!*\ + !*** ./src/v4/rules/target_spacing_sufficient.ts ***! + \***************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.target_spacing_sufficient = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var DOMMapper_1 = __webpack_require__(/*! ../../v2/dom/DOMMapper */ "./src/v2/dom/DOMMapper.ts"); +var CSSUtil_1 = __webpack_require__(/*! ../util/CSSUtil */ "./src/v4/util/CSSUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +exports.target_spacing_sufficient = { + id: "target_spacing_sufficient", + context: "dom:*", + dependencies: [], + help: { + "en-US": { + "group": "target_spacing_sufficient.html", + "pass_spacing": "target_spacing_sufficient.html", + "pass_sized": "target_spacing_sufficient.html", + "pass_inline": "target_spacing_sufficient.html", + "pass_default": "target_spacing_sufficient.html", + "violation_spacing": "target_spacing_sufficient.html", + "recommendation_inline": "target_spacing_sufficient.html", + "potential_overlap": "target_spacing_sufficient.html" + } + }, + messages: { + "en-US": { + "group": "The target must be sufficiently sized or spaced from other targets", + "pass_spacing": "The target's spacing from other targets is sufficient", + "pass_sized": "The target’s size is more than 24 CSS pixels", + "pass_inline": "The target is in a sentence or its size is otherwise constrained by the line-height of non-target text", + "pass_default": "The target's size is determined by the user agent and is not modified by the author", + "violation_spacing": "Undersized target \"{0}\" does not have sufficient spacing of 12 CSS pixels from another target \"{1}\"", + "recommendation_inline": "Confirm the inline target \"{0}\" is sufficiently spaced from another inline target \"{1}\"", + "potential_overlap": "Ensure the overlapped target \"{0}\" meets a minimum target size or has sufficient spacing from the overlapping target \"{1}\"" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_2"], + num: ["2.5.8"], + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE, + reasonCodes: ["pass_spacing", "pass_sized", "pass_inline", "pass_default", "violation_spacing", "potential_overlap"] + }, + { + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_2"], + num: ["2.5.8"], + level: IRule_2.eRulePolicy.RECOMMENDATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_THREE, + reasonCodes: ["recommendation_inline"] + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLocaleLowerCase(); + var mapper = new DOMMapper_1.DOMMapper(); + var bounds = mapper.getUnadjustedBounds(ruleContext); //context["dom"].bounds; + if (!bounds) + return null; + // ignore hidden, non-target + if (!CommonUtil_1.CommonUtil.isTarget(ruleContext)) + return null; + if (bounds.height >= 24 && bounds.width >= 24) + return (0, IRule_1.RulePass)("pass_sized"); + // check inline element: without text in the same line + var status = CSSUtil_1.CSSUtil.getInlineStatus(ruleContext); + if (status === null) + return null; + if (status.inline) { + if (status.text) { + if (status.violation === null) + return (0, IRule_1.RulePass)("pass_inline"); + else + // case 1: inline element is too close horizontally + return (0, IRule_1.RulePotential)("recommendation_inline", [nodeName, status.violation]); + } + else { + if (status.violation === null) + return (0, IRule_1.RulePass)("pass_default"); + else + // case 1: inline element is too close horizontally + return (0, IRule_1.RulePotential)("recommendation_inline", [nodeName, status.violation]); + } + } + else { + // ignore browser default + if (CSSUtil_1.CSSUtil.isTargetBrowserDefault(ruleContext)) + return (0, IRule_1.RulePass)("pass_default"); + } + var doc = ruleContext.ownerDocument; + if (!doc) { + return null; + } + var cStyle = getComputedStyle(ruleContext); + if (cStyle === null) + return null; + var zindex = cStyle.zIndex; + if (!zindex || isNaN(Number(zindex))) + zindex = "0"; + // Get the list of target elements + var targetElems = CacheUtil_1.CacheUtil.getCache(doc.documentElement, "target_spacing_sufficient::targets", undefined); + if (typeof targetElems === "undefined") { + targetElems = []; + //select all elements except itself and descendants + var elems = doc.querySelectorAll('body *:not(script):not(style)'); + for (var i = 0; i < elems.length; i++) { + var elem = elems[i]; + if (CommonUtil_1.CommonUtil.isTarget(elem)) { + targetElems.push(elem); + } + } + CacheUtil_1.CacheUtil.setCache(doc.documentElement, "target_spacing_sufficient::targets", targetElems); + } + if (!targetElems || targetElems.length === 0) + return; + var before = true; + var minX = 24; + var minY = 24; + var adjacentX = null; + var adjacentY = null; + var checked = []; //contains a list of elements that have been checked so their descendants don't need to be checked again + var _loop_1 = function (i) { + var elem = targetElems[i]; + /** + * the nodes returned from querySelectorAll is in document order + * if two elements overlap and z-index are not defined, then the node rendered earlier will be overlaid by the node rendered later + * filter out the elements that’re descendant or ancestors of the target element, nor descendant of the target element's siblings + */ + // Use compareDocumentPosition to check containment relationships + // Note: compareDocumentPosition returns 0 when comparing a node to itself + var position = ruleContext.compareDocumentPosition(elem); + // DOCUMENT_POSITION_CONTAINED_BY (16): elem is contained by ruleContext + // Also handle self-comparison (position === 0) + if (position === 0 || (position & Node.DOCUMENT_POSITION_CONTAINED_BY)) { + //the next node in elems will be after the target node (ruleContext). + before = false; + return "continue"; + } + // DOCUMENT_POSITION_CONTAINS (8): elem contains ruleContext + // ignore ascendants of the element, or itself or its ascendant already checked + if ((position & Node.DOCUMENT_POSITION_CONTAINS) || checked.some(function (item) { return item.contains(elem); })) + return "continue"; + var bnds = mapper.getUnadjustedBounds(elem); + if (!bnds) + return "continue"; + var zStyle = getComputedStyle(elem); + var z_index = '0'; + if (zStyle) { + z_index = zStyle.zIndex; + if (!z_index || isNaN(Number(z_index))) + z_index = "0"; + } + // case 2: the element overlaps the target entirely + // note when a link is inline with other target, if the link text wraps in another line in a given viewport, + // the bounds of the link may cover and the entire two lines, causing the other tagets to be overlapped, see two links in the test case: element_inline.html + if (bnds.top <= bounds.top && bnds.left <= bounds.left && bnds.top + bnds.height >= bounds.top + bounds.height + && bnds.left + bnds.width >= bounds.left + bounds.width) { + // if the target on top + if (before ? parseInt(zindex) < parseInt(z_index) : parseInt(zindex) <= parseInt(z_index)) { + return { value: null }; + } + else + return { value: (0, IRule_1.RulePotential)("potential_overlap", [nodeName, elem.nodeName.toLowerCase()]) }; + } + // case 3: if the target overlaps the element entirely + if (bounds.top <= bnds.top && bounds.left <= bnds.left && bounds.top + bounds.height >= bnds.top + bnds.height + && bounds.left + bounds.width >= bnds.left + bnds.width) { + // if the element on top + if (before ? parseInt(zindex) < parseInt(z_index) : parseInt(zindex) <= parseInt(z_index)) { + return { value: (0, IRule_1.RulePotential)("potential_overlap", [nodeName, elem.nodeName.toLowerCase()]) }; + } + else // the target on top + return { value: (0, IRule_1.RuleFail)("violation_spacing", [nodeName, elem.nodeName.toLowerCase()]) }; + } + // case 4: the element overlaps partially with the target + if ((((bounds.top >= bnds.top && bounds.top <= bnds.top + bnds.height) || (bounds.top + bounds.height <= bnds.top && bounds.top + bounds.height >= bnds.top + bnds.height)) + && ((bounds.left > bnds.left && bounds.left < bnds.left + bnds.width) || (bnds.left > bounds.left && bnds.left < bounds.left + bounds.width))) + || (((bounds.top > bnds.top && bounds.top < bnds.top + bnds.height) || (bnds.top > bounds.top && bnds.top < bounds.top + bounds.height)) + && ((bounds.left >= bnds.left && bounds.left <= bnds.left + bnds.width) || (bounds.left + bounds.width >= bnds.left && bounds.left + bounds.width <= bnds.left + bnds.width)))) { + return { value: (0, IRule_1.RulePotential)("potential_overlap", [nodeName, elem.nodeName.toLowerCase()]) }; + } + else { // no overlap with the elem, though may overlap withe other elements + var disX = 24; + var disY = 24; + // the element is in the horizontally same row with the target + if (bounds.width < 24 && ((bounds.top >= bnds.top && bounds.top <= bnds.top + bnds.height) || (bounds.top <= bnds.top && bounds.top + bounds.height > bnds.top))) + disX = Math.min(Math.abs(bounds.left - bnds.left), Math.abs(bounds.left - (bnds.left + bnds.width)), Math.abs(bounds.left + bounds.width - (bnds.left + bnds.width)), Math.abs(bounds.left + bounds.width - bnds.left)); + // the element is in the vertically same column with the target + if (bounds.height < 24 && ((bounds.left >= bnds.left && bounds.left <= bnds.left + bnds.width) || (bounds.left <= bnds.left && bounds.left + bounds.width > bnds.left))) + disY = Math.min(Math.abs(bounds.top - bnds.top), Math.abs(bounds.top - (bnds.top + bnds.height)), Math.abs(bounds.top + bounds.height - (bnds.top + bnds.height)), Math.abs(bounds.top + bounds.height - bnds.top)); + if (disX < minX) { + minX = disX; + adjacentX = elem; + } + if (disY < minY) { + minY = disY; + adjacentY = elem; + } + } + checked.push(elem); + }; + for (var i = 0; i < targetElems.length; i++) { + var state_1 = _loop_1(i); + if (typeof state_1 === "object") + return state_1.value; + } + // case 5: no overlap + insufficient target size. check spacing + if (Math.round(bounds.width / 2) + minX < 12 || Math.round(bounds.height / 2) + minY < 12) { + if (Math.round(bounds.width / 2) + minX < Math.round(bounds.height / 2) + minY) + return (0, IRule_1.RuleFail)("violation_spacing", [nodeName, adjacentX.nodeName.toLowerCase()]); + return (0, IRule_1.RuleFail)("violation_spacing", [nodeName, adjacentY.nodeName.toLowerCase()]); + } + else + return (0, IRule_1.RulePass)("pass_spacing"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/text_block_heading.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/text_block_heading.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.text_block_heading = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var CSSUtil_1 = __webpack_require__(/*! ../util/CSSUtil */ "./src/v4/util/CSSUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.text_block_heading = { + id: "text_block_heading", + context: "dom:p, dom:div, dom:br", + refactor: { + "RPT_Block_ShouldBeHeading": { + // "Pass_0": "pass", + "Potential_1": "potential_heading" + } + }, + help: { + "en-US": { + // "pass": "text_block_heading.html", + "potential_heading": "text_block_heading.html", + "group": "text_block_heading.html" + } + }, + messages: { + "en-US": { + // "pass": "Heading text uses a heading element or role", + "potential_heading": "Confirm this text '{0}' is used as a heading and if so, modify to use a heading element or role", + "group": "Heading text should use a heading element or role" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext) || !VisUtil_1.VisUtil.isNodeVisible(ruleContext)) + return null; + // Don't trigger if we're not in the body or if we're in a script + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["body"]) === null || CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["script"]) !== null) + return null; + var validateParams = { + numWords: { + value: 10, + type: "integer" + } + }; + var bodyFont = 0; + var body = ruleContext.ownerDocument.getElementsByTagName("body"); + if (body != null) { + var bodyStyle = getComputedStyle(body[0]); + if (bodyStyle) + bodyFont = CSSUtil_1.CSSUtil.getPixelsFromStyle(bodyStyle['font-size'], body); + } + var numWords = validateParams.numWords.value; + var wordsSeen = 0; + var wordStr = []; + var emphasizedText = false; + var nw = new DOMWalker_1.DOMWalker(ruleContext); + nw.nextNode(); + var passed = false; + while (!passed && + nw.nextNode() && + nw.node !== ruleContext && + nw.node !== DOMWalker_1.DOMWalker.parentNode(ruleContext) && + !["br", "div", "p"].includes(nw.node.nodeName.toLowerCase())) // Don't report twice + { + if (nw.node === ruleContext || CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(nw.node)) + continue; + var nwName = nw.node.nodeName.toLowerCase(); + if (nw.node.nodeType === 3) { + // for text child + if (nw.node.nodeValue.trim().length > 0 && nw.node.parentElement) { + // check it's style if the target element contains text, e.g., <p> fake heading</p> + var style = getComputedStyle(nw.node.parentElement); + if (style && (style['font-weight'] === 'bold' || style['font-weight'] >= 700 + || (style['font-size'] && style['font-size'].includes("large")) + || (style['font-size'] && bodyFont !== 0 && CSSUtil_1.CSSUtil.getPixelsFromStyle(style['font-size'], nw.node.parentElement) > bodyFont))) { + var nextStr = nw.node.nodeValue.trim(); + var wc = CommonUtil_1.CommonUtil.wordCount(nextStr); + if (wc > 0) { + wordStr.push(nextStr); + emphasizedText = true; + wordsSeen += wc; + } + passed = wordsSeen > numWords; + // Skip this node because it's emphasized + nw.bEndTag = true; + } + else { + // the node contain regular text + passed = true; + } + } + } + else if (nw.node.nodeType === 1) { + // for element child + if (nwName === "b" || nwName === "strong" || nwName === "u" || nwName === "font") { + // if the target element contains emphasis child, e.g., <p><strong>fake heading</strong></p> + var nextStr = CommonUtil_1.CommonUtil.getInnerText(nw.node); + var wc = CommonUtil_1.CommonUtil.wordCount(nextStr); + if (wc > 0) { + wordStr.push(nextStr); + emphasizedText = true; + wordsSeen += wc; + } + passed = wordsSeen > numWords; + // Skip this node because it's emphasized + nw.bEndTag = true; + } + else { + // ignore the element which has a role except 'generic', 'paragraph' or 'strong' + // ignore applet element that is deprecated anyway + var role = AriaUtil_1.AriaUtil.getResolvedRole(nw.node); + passed = (role !== null && role !== 'generic' && role !== 'paragraph' && role !== 'strong') || nwName === "applet"; + } + } + } + if (wordsSeen == 0) + passed = true; + //ignore if the string ends with “:” “,” “-” “;” or “.” + if (!passed) + passed = /[:,;\-\.]$/.test(wordStr.join(" ").trim()); + if (passed) { + return null; + } + else { + return (0, IRule_1.RulePotential)("potential_heading", [wordStr.join(" ")]); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/text_contrast_sufficient.ts" +/*!**************************************************!*\ + !*** ./src/v4/rules/text_contrast_sufficient.ts ***! + \**************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.text_contrast_sufficient = void 0; +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var ColorUtil_1 = __webpack_require__(/*! ../util/ColorUtil */ "./src/v4/util/ColorUtil.ts"); +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CSSUtil_1 = __webpack_require__(/*! ../util/CSSUtil */ "./src/v4/util/CSSUtil.ts"); +exports.text_contrast_sufficient = { + id: "text_contrast_sufficient", + context: "dom:*", + refactor: { + "IBMA_Color_Contrast_WCAG2AA": { + "Pass_0": "pass", + "Fail_1": "fail_contrast", + "Potential_1": "potential_same_color" + }, + "IBMA_Color_Contrast_WCAG2AA_PV": { + "pass_0": "pass", + "potential_1": "potential_graphic_background" + } + }, + help: { + "en-US": { + "group": "text_contrast_sufficient.html", + "pass": "text_contrast_sufficient.html", + "fail_contrast": "text_contrast_sufficient.html", + "potential_same_color": "text_contrast_sufficient.html", + "potential_graphic_background": "text_contrast_sufficient.html", + "potential_text_shadow": "text_contrast_sufficient.html" + } + }, + messages: { + "en-US": { + "group": "The contrast ratio of text with its background must meet WCAG AA requirements", + "pass": "The contrast ratio of text with its background meets WCAG AA requirements", + "fail_contrast": "Text contrast of {0} with its background is less than the WCAG AA minimum requirements for text of size {1}px and weight of {2}", + "potential_same_color": "The foreground text and its background color are both detected as {3}. Verify the text meets the WCAG AA requirements for minimum contrast", + "potential_graphic_background": "Verify the contrast ratio of the text against the lightest and the darkest colors of the background meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}", + "potential_text_shadow": "Verify the contrast ratio of the text with shadow meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}" + } + }, + rulesets: [{ + id: ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_0", "WCAG_2_1", "WCAG_2_2"], + num: "1.4.3", + level: IRule_2.eRulePolicy.VIOLATION, + toolkitLevel: IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: ['afw4f7'], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + var nodeName = ruleContext.nodeName.toLowerCase(); + // avoid diagnosing elements that are not visible + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || + (VisUtil_1.VisUtil.hiddenByDefaultElements != null && + VisUtil_1.VisUtil.hiddenByDefaultElements != undefined && + VisUtil_1.VisUtil.hiddenByDefaultElements.indexOf(nodeName) > -1)) { + return null; + } + //TODO ? should only consider native disabled, ignore aria-disabled + //skip disabled element + if (CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return null; + //skip elements + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["svg", "script", "meta", "style"])) + return null; + var doc = ruleContext.ownerDocument; + if (!doc) { + return null; + } + var win = doc.defaultView; + if (!win) { + return null; + } + // Ensure that this element has children with actual text. + var childStr = CommonUtil_1.CommonUtil.getNodeText(ruleContext); + if (!CommonUtil_1.CommonUtil.isShadowHostElement(ruleContext) || (CommonUtil_1.CommonUtil.isShadowHostElement(ruleContext) && CommonUtil_1.CommonUtil.getNodeText(ruleContext.shadowRoot) === '')) { + if (childStr.trim().length == 0) + return null; + // ignore if the text does not convey anything in human language + /** + * (1) ignore non-alphanumeric or special characters in ASCI: ^(a-zA-Z\d\s) + * (2) ignore non-printable unicode characters: \u0000-\u0008\u000B-\u001F\u007F-\u009F\u2000-\u200F\u2028-\u202F\u205F-\u206F\u3000\uFEFF + * see https://stackoverflow.com/questions/3770117/what-is-the-range-of-unicode-printable-characters + * (3) for now not consider unicode special characters that are different in different languages + */ + //let regex = /[^(a-zA-Z\d\s)\u0000-\u0008\u000B-\u001F\u007F-\u009F\u2000-\u200F\u2028-\u202F\u205F-\u206F\u3000\uFEFF]+/g; + var regex = /[^(a-zA-Z\d\s)\^(\u4e00-\u9fff\u3400-\u4dbf)\u0000-\u0008\u000B-\u001F\u007F-\u009F\u2000-\u200F\u2028-\u202F\u205F-\u206F\u3000\uFEFF]+/g; + childStr = childStr.trim().replace(regex, ''); + if (childStr.trim().length === 0) + return null; + } + var elem = ruleContext; + // the child elements (rather than shadow root) of a shadow host is either re-assigned to the shadow slot if the slot exists + // or not displayed, so shouldn't be checked from the light DOM, rather it should be checked as reassginged slot element(s) in the shadow DOM. + if (CommonUtil_1.CommonUtil.isShadowHostElement(ruleContext)) { + // if it's direct text of a shadow host + if (ruleContext.shadowRoot) { + for (var node = ruleContext.firstChild; node; node = node.nextSibling) { + if (node.nodeType == 3) { + //if multiple texts exist, only need to check one + elem = node.assignedSlot; + break; + } + } + } + if (elem === null) + return; + } + var style = win.getComputedStyle(elem); + // JCH clip INFO: + // The clip property lets you specify a rectangle to clip an absolutely positioned element. + // The rectangle specified as four coordinates, all from the top-left corner of the element to be clipped. + // Property values: + // none This is default. No clipping is done + // auto No clipping will be done + // shape The only valid value is: rect (top, right, bottom, left) + // e.g., clip: rect(10px, 20px, 30px, 40px); + // Note: the four values are in the same order as margin/padding + // The rect values are positive pixel values, e.g., 10px, etc. + // margin-box Uses the margin box as the reference box + // border-box Uses the border box as the reference box + // padding-box Uses the padding box as the reference box + // content-box + // fill-box + // stroke-box + // NOTE: the CSS clip property is deprecated + // Also: clip only works if the element is absolutely positioned and can only do rectangles + // check if element visible + var visible = true; + if (style.width !== "0" && + style.height !== "0" && + style.opacity !== "0" && + style.display !== 'none' && + style.visibility !== 'hidden' && + style.overflow !== 'hidden' && + // left and right work with all absolute units + (style.left === "auto" || (style.position === 'absolute' && parseInt(style.left.replace(/[^0-9.+-]/, '')) > 0)) && + (style.left === "auto" || (style.position === 'absolute' && parseInt(style.top.replace(/[^0-9.+-]/, '')) > 0))) { + visible = true; + // console.log("element IS visible"); + // console.log("CHECK COLOR CONTRAST unless to small"); + } + else { + visible = false; + // console.log("element NOT visible"); + } + if (visible === false) { + // console.log("DO NOT CHECK COLOR CONTRAST"); + return null; + } + var clipHeight = -1; + if (style.clip !== "auto") { + var clipString = style.clip.toString(); + if (clipString.includes("rect")) { + var reBrackets = /\((.*)\)/g; + var listOfText = []; + var found = reBrackets.exec(clipString); + var foundArr = found[1].split(', '); + for (var i = 0; i < foundArr.length; i++) { + // console.log("foundArr[",i,"] = ",foundArr[i]); + listOfText.push(foundArr[i]); + } + ; + } + // console.log("listOfText = ",listOfText); + clipHeight = parseInt(listOfText[0].replace(/px/g, '')) - parseInt(listOfText[2].replace(/px/g, '')); + clipHeight = Math.abs(clipHeight); + } + // JCH clip-path INFO: + // Excellent article on clip-path: https://ishadeed.com/article/clip-path/ + // clip-path is a totally different animal with many, many different variations + // The goal was for it to not be as limited as clip + // The syntax is more complicated (as it does more) and it is different from clip, + // e.g., the above clip rectangle would be clip-path: inset(10px 20px 30px 40px); + // Note: there are no commas + // Also, it can take single values to make all sides the same, or 2 values (vert/hori). + // or 3 values (top/hori/bottom) + // And percentages can works as well as px + // + // Although there are five different shapes: inset (term used for rectangle), circle, + // ellipse, polygon, path - we will only concern ourselves with inset + // There are 7 box values: margin-box, border-box, padding-box, content-box, fill-box, stroke-box, view-box + // Box and shape values may be combined: clip-path: padding-box circle(50px at 0 100px); + // NOTE: the box values are NOT intuitive, see: https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Shapes/From_box_values#margin-box + // + // So the key question is what amount of effort do we want to invest into clip-path + // + // JCH don't do clip-path now + var clipPathHeight = -1; + // if (style.clipPath !== "auto") { + // console.log("style.clipPath = ",style.clipPath); + // console.log("style.clipPath.toString = ",style.clipPath.toString()); + // let clipString = style.clipPath.toString(); + // if (clipString.includes("inset")) { + // var reBrackets = /\((.*)\)/g; + // var listOfText = []; + // var found = reBrackets.exec(clipString); + // var foundArr = found[1].split(' '); + // for (let i=0; i<foundArr.length; i++) { + // console.log("foundArr[",i,"] = ",foundArr[i]); + // listOfText.push(foundArr[i]); + // }; + // } + // console.log("listOfText = ",listOfText); + // clipPathHeight = parseInt(listOfText[0].replace(/px/g, '')) - parseInt(listOfText[2].replace(/px/g, '')); + // clipPathHeight = Math.abs(clipHeight); + // } + // console.log("clipPathHeight = ", clipPathHeight); + // if (style.position === "absolute" && style.clip === "rect(0px, 0px, 0px, 0px)" && style.overflow !== "visible") { + // JCH arbitrarily use less that 7px for clipHeight + if (style.position === "absolute" && clipHeight < 7 && clipHeight !== -1) { + // console.log("DO NOT CHECK COLOR CONTRAST because too small"); + // Corner case where item is hidden (accessibility hiding technique) + return null; + } + // First determine the color contrast ratio + var colorCombo = ColorUtil_1.ColorUtil.ColorCombo(elem); + if (colorCombo === null) { + //some exception occurred, or not able to get color combo for some reason + console.log("unable to get color combo for element: " + elem.nodeName); + return; + } + var fg = colorCombo.fg; + var bg = colorCombo.bg; + var ratio = fg.contrastRatio(bg); + var weight = CSSUtil_1.CSSUtil.getWeightNumber(style.fontWeight); + var size = CSSUtil_1.CSSUtil.getFontInPixels(style.fontSize, elem); + var isLargeScale = size >= 24 || size >= 18.6 && weight >= 700; + if (CSSUtil_1.CSSUtil.containsCKJ(childStr)) { + // https://github.com/act-rules/act-rules.github.io/pull/2121/files + // for CJK, 22 pt or 18 pt with font-weight >= 700, 1pt = 1.333 px + isLargeScale = size >= 29.3 || size >= 24 && weight >= 700; + } + var passed = ratio >= 4.5 || (ratio >= 3 && isLargeScale); + var hasBackground = colorCombo.hasBGImage || colorCombo.hasGradient; + var textShadow = colorCombo.textShadow; + var isDisabled = CommonUtil_1.CommonUtil.isNodeDisabled(elem); + if (!isDisabled) { + var control = CommonUtil_1.CommonUtil.getControlOfLabel(elem); + if (control) { + isDisabled = CommonUtil_1.CommonUtil.isNodeDisabled(control); + } + } + if (!isDisabled && nodeName === 'label' && CommonUtil_1.CommonUtil.isDisabledByFirstChildFormElement(elem)) { + isDisabled = true; + } + if (!isDisabled && ruleContext.hasAttribute("id") && CommonUtil_1.CommonUtil.isDisabledByReferringElement(elem)) { + isDisabled = true; + } + /**setCache(ruleContext, "EXT_Color_Contrast_WCAG2AA", { + "ratio": ratio, + "isLargeScale": isLargeScale, + "weight": weight, + "size": size, + "hasBackground": hasBackground, + "isDisabled": isDisabled + });*/ + // If element or parent is disabled, this rule does not apply (but may be 3:1 in future) + if (!passed && isDisabled) { + passed = true; + } + if (!passed) { + if (hasBackground) { + // fire potential since a text on an image or gradient may be still viewable, depending on the text location on the gradient or image + return (0, IRule_1.RulePotential)("potential_graphic_background", [ratio.toFixed(2), size, weight]); + // removed by dead control flow + + } + else if (textShadow) { + // fire potential since a text with shadow may be still viewable, depending on the shadow efffects + return (0, IRule_1.RulePotential)("potential_text_shadow", [ratio.toFixed(2), size, weight]); + // removed by dead control flow + + } + else { + if (fg.toHex() === bg.toHex()) { + return (0, IRule_1.RulePotential)("potential_same_color", [ratio.toFixed(2), size, weight, fg.toHex(), bg.toHex(), colorCombo.hasBGImage, colorCombo.hasGradient]); + } + else { + return (0, IRule_1.RuleFail)("fail_contrast", [ratio.toFixed(2), size, weight, fg.toHex(), bg.toHex(), colorCombo.hasBGImage, colorCombo.hasGradient]); + } + } + } + else { + return (0, IRule_1.RulePass)("pass", [ratio.toFixed(2), size, weight, fg.toHex(), bg.toHex(), colorCombo.hasBGImage, colorCombo.hasGradient]); + } + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/text_quoted_correctly.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/text_quoted_correctly.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.text_quoted_correctly = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.text_quoted_correctly = { + id: "text_quoted_correctly", + context: "dom:*", + help: { + "en-US": { + "Pass_0": "text_quoted_correctly.html", + "Potential_1": "text_quoted_correctly.html", + "group": "text_quoted_correctly.html" + } + }, + messages: { + "en-US": { + "Pass_0": "Rule Passed", + "Potential_1": "If the following text is a quotation, mark it as a <q> or <blockquote> element: {0}", + "group": "Quotations should be marked with <q> or <blockquote> elements" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // ignore the check if the node is hidden + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext)) + return null; + // Don't trigger if the element is not in the body + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["body"]) === null) + return null; + var validateParams = { + minWords: { + value: 3, + type: "integer" + } + }; + var minWords = validateParams.minWords.value; + var passed = true; + var walkNode = ruleContext.firstChild; + var violatedtext = null; + // ignore the check for the text of the following elements + var ignored = ["blockquote", "q", "script", "style", "pre", "code", "ruby", "samp"]; + while (passed && walkNode) { + // Comply to the Check Hidden Content setting will be done by default as this rule triggers on each element + // and for each element it only checks that single elements text nodes and nothing else. So all inner elements will be + // covered on their own. Currently for this rule by default Check Hidden Content will work, as we are doing + // a node walk only on siblings so it would not get text nodes from other siblings at all. + // In the case in the future something chnges, just need to add && !RPTUtil.shouldNodeBeSkippedHidden(walkNode) to the below + // if. + if (walkNode.nodeName === "#text") { + var txtVal = walkNode.nodeValue; + // Do the regex tests first - should be fast + // Remove apostrophe's + txtVal = txtVal.replace(/(\S)'(\S)/g, "$1$2"); + var dblQuotes = txtVal.match(/("[^"]+")/g); + var snglQuotes = txtVal.match(/('[^']+')/g); + // Walk the parents - only continue testing if we found a quote, but + // we're not already marked up + // Also skip if we're in a script - there's lots of quotes used in scripts + if ((dblQuotes !== null || snglQuotes !== null) && + CommonUtil_1.CommonUtil.getAncestor(walkNode, ignored) === null) { + if (dblQuotes != null) { + for (var i = 0; passed && i < dblQuotes.length; ++i) + passed = CommonUtil_1.CommonUtil.wordCount(dblQuotes[i]) < minWords; + } + if (snglQuotes != null) { + for (var i = 0; passed && i < snglQuotes.length; ++i) + passed = CommonUtil_1.CommonUtil.wordCount(snglQuotes[i]) < minWords; + } + // Remove any linefeed inside the quote + // violatedtext = txtVal.replace(new RegExp("\\r?\\n|\\r","g"),""); + if (dblQuotes === null) { + violatedtext = snglQuotes.join(", ").replace(new RegExp("\\r?\\n|\\r", "g"), ""); + } + else if (snglQuotes === null) { + violatedtext = dblQuotes.join(", ").replace(new RegExp("\\r?\\n|\\r", "g"), ""); + } + else { + violatedtext = dblQuotes.concat(snglQuotes).join(", ").replace(new RegExp("\\r?\\n|\\r", "g"), ""); + } + } + } + walkNode = walkNode.nextSibling; + } + //if the violatedtext is longer than 69 chars, only keep the first 32, the " ... ", and the last 32 chars + if (!passed && violatedtext.length && violatedtext.length > 69) { + violatedtext = violatedtext.substring(0, 32) + " ... " + violatedtext.substring(violatedtext.length - 32); + } + return passed ? (0, IRule_1.RulePass)("Pass_0") : (0, IRule_1.RulePotential)("Potential_1", [violatedtext]); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/text_sensory_misuse.ts" +/*!*********************************************!*\ + !*** ./src/v4/rules/text_sensory_misuse.ts ***! + \*********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.text_sensory_misuse = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.text_sensory_misuse = { + id: "text_sensory_misuse", + context: "dom:body, dom:body dom:*", + refactor: { + "RPT_Text_SensoryReference": { + // "Pass_0": "pass", + "Potential_1": "potential_position, potential_other" + } + }, + help: { + "en-US": { + // "pass": "text_sensory_misuse.html", + "potential_position": "text_sensory_misuse.html", + "potential_other": "text_sensory_misuse.html", + "group": "text_sensory_misuse.html" + } + }, + messages: { + "en-US": { + // "pass": "Instructions are meaningful without relying solely on shape, size, or location words", + "potential_position": "Confirm the word(s) '{0}' of the user instruction is used to indicate a logical rather than visual position", + "potential_other": "Confirm the user instruction is still understandable without the word(s) '{0}'", + "group": "Instructions should be meaningful without relying solely on shape, size, or location words" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.3"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_TWO + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Extract the nodeName of the context node + var nodeName = ruleContext.nodeName.toLowerCase(); + //skip the check if the element is hidden or disabled + if (!VisUtil_1.VisUtil.isNodeVisible(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext) || VisUtil_1.VisUtil.hiddenByDefaultElements.includes(nodeName)) + return null; + // Don't trigger if we're not in the body or if we're in a script + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["body"]) === null) + return null; + // ignore script, link, label and their child elements + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["script", "a", 'label']) !== null) + return null; + // ignore text on landmark roles, but not on their children (e.g., section, main) + var role = AriaUtil_1.AriaUtil.getResolvedRole(ruleContext); + if (role) { + var lmRoles = AriaUtil_1.AriaUtil.getRolesWithTypes(ruleContext, ["landmark"]); + if (lmRoles && lmRoles.includes(role)) + return null; + } + // ignore all widgets and headings, and their children, and certain structure roles + var roles = AriaUtil_1.AriaUtil.getRolesWithTypes(ruleContext, ["widget", "heading"]); + // add some structure roles + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(["caption", "cell", "code", "columnheader", "definition", "figure", "list", "listitem", "math", "meter", "row", "rowgroup", "rowheader", "term"], roles); + if (AriaUtil_1.AriaUtil.getAncestorWithRoles(ruleContext, roles) !== null) + return null; + var violatedPositionText = ""; + var violatedOtherText = ""; + var walkNode = ruleContext.firstChild; + var txtVal = ""; + while (walkNode) { + // for each element it only checks that single elements text nodes and nothing else. + // all inner elements will be covered on their own. + // whitespace characters (space, newline, tab) between elements are considered a node too. + if (walkNode.nodeName === "#text") { + var txt = walkNode.nodeValue.trim(); + if (txt.length > 0) + txtVal += (txtVal.length > 0 ? ", " + txt : txt); + } + walkNode = walkNode.nextSibling; + } + if (txtVal.length > 0) { + // first to remove each exempt word with a single space in the text + var exemptRegex = getRegex(ruleContext.ownerDocument, "exemptText"); + txtVal = txtVal.replace(exemptRegex, " "); + violatedPositionText = getViolatedText(ruleContext.ownerDocument, "positionText", txtVal); + violatedOtherText = getViolatedText(ruleContext.ownerDocument, "otherText", txtVal); + } + var ret = []; + if (violatedPositionText) + ret.push((0, IRule_1.RulePotential)("potential_position", [violatedPositionText])); + if (violatedOtherText) + ret.push((0, IRule_1.RulePotential)("potential_other", [violatedOtherText])); + return ret.length == 0 ? null : ret; + } +}; +var validateParams = { + positionText: { + value: ["top-left", "top-right", "bottom-right", "bottom-left", + "top-to-bottom", "left-to-right", "bottom-to-top", "right-to-left", + "right", "left", "above", "below", "top", "bottom", + "upper", "lower", "corner", "beside" + ], + type: "[string]" + }, + otherText: { + value: ["round", "square", "shape", "rectangle", "triangle", + "size", "large", "small", "medium", "big", "huge", "tiny", "extra", + "larger", "smaller", "bigger", "little", "largest", "smallest", "biggest" + ], + type: "[string]" + }, + exemptText: { + value: ["right-click", "left-click", "right-clicking", "right-clicks", + "left-clicking", "left-clicks", "square root", "right now", "off the top" //append as needed + ], + type: "[string]" + } +}; +function getRegex(doc, type) { + if (!validateParams[type]) + return ""; + var sensoryRegex = CacheUtil_1.CacheUtil.getCache(doc, type + "_sensory_misuse", null); + if (sensoryRegex == null) { + var sensoryText = validateParams[type].value; + var regexStr = "(\s\s+|" + sensoryText[0]; + for (var j = 1; j < sensoryText.length; ++j) { + var words = sensoryText[j].trim().split(" "); + regexStr += "|" + words[0]; + if (words.length > 1) { + for (var c = 1; c < words.length; ++c) + regexStr += " +" + words[c]; + } + } + //regexStr += ")\\W"; + regexStr += ")"; + sensoryRegex = new RegExp(regexStr, "gi"); + CacheUtil_1.CacheUtil.setCache(doc, type + "_sensory_misuse", sensoryRegex); + } + return sensoryRegex; +} +function getViolatedText(doc, type, txtVal) { + if (!txtVal) + return ""; + var sensoryTextArr = validateParams[type].value; + var hash = {}, result = []; + // split the string into words + var counts = txtVal.split(/\s+/).reduce(function (map, word) { + var wordWoTrailingPunc = word.replace(/[.?!:;()'",`\]]+$/, ""); + var lcWordWoPunc = word.toLowerCase().replace(/[.?!:;()'",`\]]/g, ""); + for (var counter = 0; counter < sensoryTextArr.length; counter++) { + var a = lcWordWoPunc.indexOf(sensoryTextArr[counter]); + var sensoryWordLen = sensoryTextArr[counter].length; + var charFollowSensoryText = lcWordWoPunc.charAt(sensoryWordLen + a); + // If the word does not contains substring of sensoryTextArr[counter] + // proceed to the next loop iteration for next sensoryText. + if (a < 0) { + continue; + } + //check the following and proceeding punctuations + //let isPuncfollowing = ((charFollowSensoryText == '\-') || + var isPuncfollowing = ((charFollowSensoryText == '\.') || + (charFollowSensoryText == '\?') || (charFollowSensoryText == '\!') || + (charFollowSensoryText == '\:') || (charFollowSensoryText == '\;') || + (charFollowSensoryText == '\(') || (charFollowSensoryText == '\)') || + (charFollowSensoryText == '\'') || (charFollowSensoryText == '\"') || + (charFollowSensoryText == '\,') || (charFollowSensoryText == '.\`') || + (charFollowSensoryText == '\\') || (charFollowSensoryText == '\]')); + var isPuncPreceding = false; + if (a > 0) { + var charPrecedeSensoryText = lcWordWoPunc.charAt(a - 1); + isPuncPreceding = ((charPrecedeSensoryText == '\-') || + (charPrecedeSensoryText == '\.') || + (charPrecedeSensoryText == '\?') || (charPrecedeSensoryText == '\!') || + (charPrecedeSensoryText == '\:') || (charPrecedeSensoryText == '\;') || + (charPrecedeSensoryText == '\(') || (charPrecedeSensoryText == '\)') || + (charPrecedeSensoryText == '\'') || (charPrecedeSensoryText == '\"') || + (charPrecedeSensoryText == '\,') || (charPrecedeSensoryText == '.\`') || + (charPrecedeSensoryText == '\\') || (charPrecedeSensoryText == '\]')); + } + if (((lcWordWoPunc.length == sensoryWordLen) || (isPuncfollowing == true) || (isPuncPreceding == true))) { + if (!hash.hasOwnProperty(wordWoTrailingPunc)) { + hash[wordWoTrailingPunc] = true; + result.push(wordWoTrailingPunc); + } + counter = sensoryTextArr.length; + } + } + map[wordWoTrailingPunc] = (map[wordWoTrailingPunc] || 0) + 1; + return map; + }, Object.create(null)); + return result.join(", "); +} + + +/***/ }, + +/***/ "./src/v4/rules/text_spacing_valid.ts" +/*!********************************************!*\ + !*** ./src/v4/rules/text_spacing_valid.ts ***! + \********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.text_spacing_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var CSSUtil_1 = __webpack_require__(/*! ../util/CSSUtil */ "./src/v4/util/CSSUtil.ts"); +var DOMMapper_1 = __webpack_require__(/*! ../../v2/dom/DOMMapper */ "./src/v2/dom/DOMMapper.ts"); +// Module-level constants +var STYLE_VALUE_REGEX = /(-?[\d.]+)([a-z%]*)/; +var MIN_WORD_SPACING_RATIO = 0.16; +var MIN_LETTER_SPACING_RATIO = 0.12; +var MIN_LINE_HEIGHT_RATIO = 1.5; +var IMPORTANT_SUFFIX = "!important"; +var IMPORTANT_SUFFIX_LENGTH = IMPORTANT_SUFFIX.length + 1; // +1 for the space before !important +/** + * Resolves inherited or unset style values by traversing up the DOM tree + * @param element - The element to resolve the style for + * @param property - The CSS property name + * @param currentValue - The current style value + * @returns The resolved style value + */ +function resolveInheritedStyle(element, property, currentValue) { + var _a; + if (currentValue.startsWith('inherit') || currentValue.startsWith('unset')) { + var ancestor = CSSUtil_1.CSSUtil.getAncestorWithStyles(element.parentElement, (_a = {}, _a[property] = ["*"], _a), ['inherit', 'unset']); + if (ancestor !== null) { + return CSSUtil_1.CSSUtil.getDefinedStyles(ancestor, [property])[property]; + } + else if (currentValue.startsWith('unset')) { + return "initial"; + } + } + return currentValue; +} +/** + * Removes the !important suffix from a style value + * @param styleValue - The style value potentially containing !important + * @returns The style value without !important + */ +function removeImportantSuffix(styleValue) { + return styleValue.substring(0, styleValue.length - IMPORTANT_SUFFIX_LENGTH); +} +/** + * Checks if a spacing property violates accessibility requirements + * @param element - The HTML element being checked + * @param property - The CSS property name (word-spacing, letter-spacing, line-height) + * @param styleValue - The current style value + * @param fontSize - The computed font size in pixels + * @param minRatio - The minimum ratio threshold + * @param allowUnitless - Whether unitless values are allowed (for line-height) + * @returns RuleResult indicating pass or fail + */ +function checkSpacingProperty(element, property, styleValue, fontSize, minRatio, allowUnitless) { + if (allowUnitless === void 0) { allowUnitless = false; } + // Check if !important is used + if (element.style.getPropertyPriority(property) !== 'important') { + return true; + } + // Remove !important suffix + var cleanValue = removeImportantSuffix(styleValue); + // Check for initial or normal values (computed space is 0) + if (cleanValue === 'initial' || cleanValue === 'normal') { + return false; + } + // Parse the numeric value + var numericValue = parseFloat(cleanValue); + if (isNaN(numericValue)) { + return true; + } + // Match value and unit + var parsedValue = cleanValue.trim().match(STYLE_VALUE_REGEX); + if (!parsedValue) { + return true; + } + var value = parsedValue[1], unit = parsedValue[2]; + // Handle unitless values (only for line-height) + if (unit === '') { + if (allowUnitless) { + return parseFloat(value) < minRatio ? false : true; + } + // For other properties, zero value without unit is ignored + if (parseFloat(value) === 0) { + return null; + } + } + // Skip if no unit and non-zero (error case, inapplicable) + if (unit === '' && parseFloat(value) !== 0) { + return null; + } + // Convert to pixels and check ratio + var pixels = CSSUtil_1.CSSUtil.convertValue2Pixels(unit, value, element); + if (pixels !== null && pixels / fontSize < minRatio) { + return false; + } + return true; +} +exports.text_spacing_valid = { + id: "text_spacing_valid", + context: "dom:*", + help: { + "en-US": { + "pass": "text_spacing_valid.html", + "group": "text_spacing_valid.html", + "fail_letter_spacing_style": "text_spacing_valid.html", + "fail_word_spacing_style": "text_spacing_valid.html", + "fail_line_height_style": "text_spacing_valid.html" + } + }, + messages: { + "en-US": { + "pass": "CSS !important is not used in inline style to control letter or word spacing or line height", + "group": "CSS !important should not be used in inline style to control letter or word spacing or line height", + "fail_letter_spacing_style": "CSS !important should not be used in inline ‘letter-spacing’ style", + "fail_word_spacing_style": "CSS !important should not be used in inline ‘word-spacing’ style", + "fail_line_height_style": "CSS !important should not be used in inline ‘line-height’ style" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.4.12"], + "level": IRule_1.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_1.eToolkitLevel.LEVEL_THREE + }], + act: ['9e45ec', '24afc2', '78fd32'], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Ensure that this element has children with actual text + var childStr = ""; + var childNodes = ruleContext.childNodes; + for (var i = 0; i < childNodes.length; ++i) { + if (childNodes[i].nodeType === 3) { // Text node + childStr += childNodes[i].nodeValue; + } + } + if (childStr.trim().length === 0) { + return null; + } + // Skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) { + return null; + } + // Skip the check if the element is off screen + var mapper = new DOMMapper_1.DOMMapper(); + var bounds = mapper.getUnadjustedBounds(ruleContext); + if (!bounds || bounds['top'] < 0 || bounds['left'] < 0) { + return null; + } + // Skip non-HTML elements (e.g., SVG) + if (CommonUtil_1.CommonUtil.getAncestor(ruleContext, "svg")) { + return null; + } + // Font size always resolved to 'px' + var computedStyle = getComputedStyle(ruleContext); + var fontSize = parseFloat(computedStyle.getPropertyValue('font-size')); + // Early exit optimization: Check if computed styles already pass + // If all three properties have passing values, we can skip the expensive getDefinedStyles call + var computedWordSpacing = computedStyle.getPropertyValue('word-spacing'); + var computedLetterSpacing = computedStyle.getPropertyValue('letter-spacing'); + var computedLineHeight = computedStyle.getPropertyValue('line-height'); + // Check if computed values pass the requirements + var wordSpacingPasses = true; + var letterSpacingPasses = true; + var lineHeightPasses = true; + // Check word-spacing (ignore 0px which represents default/normal) + if (computedWordSpacing) { + var wordValue = parseFloat(computedWordSpacing); + if (!isNaN(wordValue)) { + var wordPixels = CSSUtil_1.CSSUtil.convertValue2Pixels('px', wordValue.toString(), ruleContext); + if (wordPixels !== null && wordPixels / fontSize < MIN_WORD_SPACING_RATIO) { + wordSpacingPasses = false; + } + } + } + // Check letter-spacing (ignore 0px which represents default/normal) + if (computedLetterSpacing) { + var letterValue = parseFloat(computedLetterSpacing); + if (!isNaN(letterValue)) { + var letterPixels = CSSUtil_1.CSSUtil.convertValue2Pixels('px', letterValue.toString(), ruleContext); + if (letterPixels !== null && letterPixels / fontSize < MIN_LETTER_SPACING_RATIO) { + letterSpacingPasses = false; + } + } + } + // Check line-height + if (computedLineHeight) { + var lineValue = parseFloat(computedLineHeight); + if (!isNaN(lineValue)) { + // Line height can be unitless or in pixels + var match = computedLineHeight.match(STYLE_VALUE_REGEX); + if (match) { + var value = match[1], unit = match[2]; + if (unit === '' || unit === 'px') { + var ratio = unit === '' ? parseFloat(value) : parseFloat(value) / fontSize; + if (ratio < MIN_LINE_HEIGHT_RATIO) { + lineHeightPasses = false; + } + } + } + } + } + // If all computed values pass, we can skip the expensive getDefinedStyles check + if (wordSpacingPasses && letterSpacingPasses && lineHeightPasses) { + return null; + } + // Get defined styles to check for !important declarations + var styles = CSSUtil_1.CSSUtil.getDefinedStyles(ruleContext, ["word-spacing", "letter-spacing", "line-height"]); + if (Object.keys(styles).length === 0) { + return null; + } + var results = []; + // Check word-spacing + var wordStyle = styles['word-spacing']; + if (wordStyle) { + wordStyle = resolveInheritedStyle(ruleContext, 'word-spacing', wordStyle); + var result = checkSpacingProperty(ruleContext, 'word-spacing', wordStyle, fontSize, MIN_WORD_SPACING_RATIO); + results.push(result ? (0, IRule_1.RulePass)("pass") : (0, IRule_1.RuleFail)('fail_word_spacing_style')); + } + // Check letter-spacing + var letterStyle = styles['letter-spacing']; + if (letterStyle) { + letterStyle = resolveInheritedStyle(ruleContext, 'letter-spacing', letterStyle); + var result = checkSpacingProperty(ruleContext, 'letter-spacing', letterStyle, fontSize, MIN_LETTER_SPACING_RATIO); + results.push(result ? (0, IRule_1.RulePass)("pass") : (0, IRule_1.RuleFail)('fail_letter_spacing_style')); + } + // Check line-height (only if no scrollable ancestor) + var lineStyle = styles['line-height']; + var overflowStyles = { + "overflow": ['auto', 'scroll'], + "overflow-x": ['auto', 'scroll'], + "overflow-y": ['auto', 'scroll'] + }; + if (lineStyle && CSSUtil_1.CSSUtil.getAncestorWithStyles(ruleContext, overflowStyles) === null) { + lineStyle = resolveInheritedStyle(ruleContext, 'line-height', lineStyle); + var result = checkSpacingProperty(ruleContext, 'line-height', lineStyle, fontSize, MIN_LINE_HEIGHT_RATIO, true // Allow unitless values for line-height + ); + results.push(result ? (0, IRule_1.RulePass)("pass") : (0, IRule_1.RuleFail)('fail_line_height_style')); + } + return results.length > 0 ? results : null; + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/text_whitespace_valid.ts" +/*!***********************************************!*\ + !*** ./src/v4/rules/text_whitespace_valid.ts ***! + \***********************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.text_whitespace_valid = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +exports.text_whitespace_valid = { + id: "text_whitespace_valid", + context: "dom:*", + help: { + "en-US": { + "pass": "text_whitespace_valid.html", + "potential_text": "text_whitespace_valid.html", + "group": "text_whitespace_valid.html" + } + }, + messages: { + "en-US": { + "pass": "Rule Passed", + "potential_text": "Space characters should not be used to create space between the letters of a word", + "group": "Space characters should not be used to control spacing within a word" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["1.3.2"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_THREE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + // Don't trigger if we're not in the body or if we're in a script + var checkAncestor = CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["body", "script", "code"]); + if (checkAncestor == null || checkAncestor.nodeName.toLowerCase() != "body") + return null; + var passed = true; + var walkNode = ruleContext.firstChild; + while (passed && walkNode) { + // Comply to the Check Hidden Content setting will be done by default as this rule triggers on each element + // and for each element it only checks that single elements text nodes and nothing else. So all inner elements will be + // covered on their own. Currently for this rule by default Check Hidden Content will work, as we are doing + // a node walk only on siblings so it would not get text nodes from other siblings at all. + // In the case in the future something chnges, just need to add && !RPTUtil.shouldNodeBeSkippedHidden(walkNode) to the below + // if. + if (walkNode.nodeName == "#text") { + var txtVal = walkNode.nodeValue; + passed = !(/(^|\s)[a-zA-Z] [a-zA-Z] [a-zA-Z]($|\s)/.test(txtVal)); + } + walkNode = walkNode.nextSibling; + } + if (passed) + return (0, IRule_1.RulePass)("pass"); + return (0, IRule_1.RulePotential)("potential_text"); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/widget_tabbable_exists.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/widget_tabbable_exists.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.widget_tabbable_exists = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var ARIAMapper_1 = __webpack_require__(/*! ../../v2/aria/ARIAMapper */ "./src/v2/aria/ARIAMapper.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.widget_tabbable_exists = { + id: "widget_tabbable_exists", + context: "aria:button,aria:link,aria:spinbutton,aria:tablist,aria:combobox,aria:listbox,aria:menu,aria:radiogroup,aria:tree,aria:menubar, aria:grid, aria:treegrid, aria:checkbox,aria:slider,aria:spinbutton,aria:textbox,aria:scrollbar,aria:slider,aria:spinbutton", + refactor: { + "IBMA_Focus_Tabbable": { + "pass": "pass", + "fail_no_tabbable": "fail_no_tabbable" + } + }, + help: { + "en-US": { + "pass": "widget_tabbable_exists.html", + "fail_no_tabbable": "widget_tabbable_exists.html", + "group": "widget_tabbable_exists.html" + } + }, + messages: { + "en-US": { + "pass": "Rule Passed", + "fail_no_tabbable": "Component with \"{0}\" role does not have a tabbable element", + "group": "Component must have at least one tabbable element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip the check if the element should be a presentational child of an element + if (AriaUtil_1.AriaUtil.shouldBePresentationalChild(ruleContext)) + return; + var nodeName = ruleContext.nodeName.toLowerCase(); + //ignore datalist element check since it will be part of a input element or hidden by default + if (nodeName === 'datalist') + return null; + // Composite user interface widget roles. They act as containers that manage other, contained widgets. + var roleContainers = ["combobox", "grid", "listbox", "menu", "menubar", "radiogroup", "tablist", "tree", "treegrid"]; + for (var _i = 0, roleContainers_1 = roleContainers; _i < roleContainers_1.length; _i++) { + var role_1 = roleContainers_1[_i]; + if (AriaUtil_1.AriaUtil.getAncestorWithRole(ruleContext, role_1, true) != null) + // it's a descendant of a composite widget already examined + return null; + } + var role = ARIAMapper_1.ARIAMapper.nodeToRole(ruleContext); + var count = 0; + if (CommonUtil_1.CommonUtil.isTabbable(ruleContext)) { + ++count; + } + // If node has children, look for tab stops in the children + // skip the count if the element requires presentational children only + if (count < 1 && !AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(ruleContext) && ruleContext.firstChild) { + var nw = new DOMWalker_1.DOMWalker(ruleContext); + while (count < 1 && nw.nextNode() && nw.node != ruleContext) { + if (nw.node.nodeType == 1 && !nw.bEndTag && CommonUtil_1.CommonUtil.isTabbable(nw.node)) { + ++count; + } + } + } + var passed = count >= 1; + return passed ? (0, IRule_1.RulePass)("pass") : (0, IRule_1.RulePotential)("fail_no_tabbable", [role]); + } +}; + + +/***/ }, + +/***/ "./src/v4/rules/widget_tabbable_single.ts" +/*!************************************************!*\ + !*** ./src/v4/rules/widget_tabbable_single.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.widget_tabbable_single = void 0; +var IRule_1 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var IRule_2 = __webpack_require__(/*! ../api/IRule */ "./src/v4/api/IRule.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var ARIAMapper_1 = __webpack_require__(/*! ../../v2/aria/ARIAMapper */ "./src/v2/aria/ARIAMapper.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +exports.widget_tabbable_single = { + id: "widget_tabbable_single", + context: "aria:button,aria:link,aria:menuitem,aria:spinbutton,aria:tablist,aria:combobox,aria:listbox,aria:menu,aria:radiogroup,aria:tree,aria:checkbox,aria:option,aria:radio,aria:slider,aria:spinbutton,aria:textbox,aria:columnheader,aria:rowheader,aria:slider,aria:tab", + refactor: { + "IBMA_Focus_MultiTab": { + "pass": "pass", + "potential_multiple_tabbable": "potential_multiple_tabbable" + } + }, + help: { + "en-US": { + "pass": "widget_tabbable_single.html", + "potential_multiple_tabbable": "widget_tabbable_single.html", + "group": "widget_tabbable_single.html" + } + }, + messages: { + "en-US": { + "pass": "Components with a widget role should have no more than one tabbable element", + "potential_multiple_tabbable": "Component with \"{0}\" role has more than one tabbable element", + "group": "Components with a widget role must have no more than one tabbable element" + } + }, + rulesets: [{ + "id": ["IBM_Accessibility", "IBM_Accessibility_next", "WCAG_2_1", "WCAG_2_0", "WCAG_2_2"], + "num": ["2.1.1", "2.4.3"], + "level": IRule_2.eRulePolicy.VIOLATION, + "toolkitLevel": IRule_2.eToolkitLevel.LEVEL_ONE + }], + act: [], + run: function (context, options, contextHierarchies) { + var ruleContext = context["dom"].node; + //skip the check if the element is hidden or disabled + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(ruleContext) || CommonUtil_1.CommonUtil.isNodeDisabled(ruleContext)) + return; + //skip the check if the element should be a presentational child of an element + if (AriaUtil_1.AriaUtil.shouldBePresentationalChild(ruleContext)) + return; + var role = ARIAMapper_1.ARIAMapper.nodeToRole(ruleContext); + var count = 0; + if (CommonUtil_1.CommonUtil.isTabbable(ruleContext)) { + ++count; + } + // If node has children, look for tab stops in the children + //skip the count if the element requires presentational children only + var name = []; + if (count < 2 && !AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(ruleContext) && ruleContext.firstChild) { + var nw = new DOMWalker_1.DOMWalker(ruleContext); + while (count < 2 && nw.nextNode() && nw.node != ruleContext) { + if (nw.node.nodeType == 1 && !nw.bEndTag && CommonUtil_1.CommonUtil.isTabbable(nw.node)) { + // Radio inputs with the same name natively are only one tab stop + /**if (nw.node.nodeName.toLowerCase() === 'input' && (nw.node as Element).getAttribute("type") === 'radio') { + let curName = (nw.node as Element).getAttribute("name"); + if (name.includes(curName)) + continue; + else + name.push(curName); + }*/ + ++count; + } + } + } + var passed = count < 2; + if (!passed) + CacheUtil_1.CacheUtil.setCache(ruleContext, "widget_tabbable_single", "potential_multiple_tabbable"); + return passed ? (0, IRule_1.RulePass)("pass") : (0, IRule_1.RulePotential)("potential_multiple_tabbable", [role]); + } +}; + + +/***/ }, + +/***/ "./src/v4/rulesets.ts" +/*!****************************!*\ + !*** ./src/v4/rulesets.ts ***! + \****************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.a11yRulesets = void 0; +// This file comes from https://raw.githubusercontent.com/act-rules/act-tools/main/src/data/sc-urls.json +var SCURLs = __importStar(__webpack_require__(/*! ./sc-urls.json */ "./src/v4/sc-urls.json")); +var IGuideline_1 = __webpack_require__(/*! ./api/IGuideline */ "./src/v4/api/IGuideline.ts"); +var SCs = []; +for (var key in SCURLs) { + SCs.push(SCURLs[key]); +} +var summaries = { + "1.1.1": "All non-text content that is presented to the user has a text alternative that serves the equivalent purpose.", + "1.2.1": "For prerecorded audio-only or video-only media, an alternative provides equivalent information.", + "1.2.2": "Captions are provided for all prerecorded audio content in synchronized media.", + "1.2.3": "An alternative for time-based media or audio description of the prerecorded video content is provided for synchronized media.", + "1.2.4": "Captions are provided for all live audio content in synchronized media.", + "1.2.5": "Audio description is provided for all prerecorded video content in synchronized media.", + "1.3.1": "Information, structure, and relationships conveyed through presentation can be programmatically determined or are available in text.", + "1.3.2": "When the sequence in which content is presented affects its meaning, a correct reading sequence can be programmatically determined.", + "1.3.3": "Instructions provided for understanding and operating content do not rely solely on sensory characteristics of components such as shape, size, visual location, orientation, or sound.", + "1.3.4": "Content does not restrict its view and operation to a single display orientation, such as portrait or landscape.", + "1.3.5": "The purpose of each input field that collects information about the user can be programmatically determined when the field serves a common purpose.", + "1.4.1": "Color is not used as the only visual means of conveying information, indicating an action, prompting a response, or distinguishing a visual element.", + "1.4.2": "If any audio plays automatically for more than 3 seconds, either a mechanism is available to pause or stop the audio, or a mechanism is available to control audio volume independently from the overall system volume level.", + "1.4.3": "The visual presentation of text and images of text has a contrast ratio of at least 4.5:1, with a 3:1 ratio for large-scale text.", + "1.4.4": "Text can be resized without assistive technology up to 200 percent without loss of content or functionality.", + "1.4.5": "If the technologies being used can achieve the visual presentation, text should not be used to convey information rather than images of text.", + "1.4.10": "Content can reflow without loss of information or functionality, and without requiring scrolling in two dimensions.", + "1.4.11": "The parts of graphical objects required to understand the content, and the visual information required to identify UI components and states, have a contrast ratio of at least 3:1 against adjacent colors.", + "1.4.12": "No loss of content or functionality occurs when users change letter, word and paragraph spacing, as well as line height.", + "1.4.13": "Where hover or focus actions cause additional content to become visible and hidden, the additional content is dismissable, hoverable and persistent.", + "2.1.1": "All functionality of the content is operable through a keyboard interface without requiring specific timings for individual keystrokes.", + "2.1.2": "If keyboard focus can be moved to a component using a keyboard interface, then focus can be moved away from that component using only a keyboard interface, and, if it requires more than unmodified arrow or tab keys or other standard exit methods, the user is advised of the method for moving focus away.", + "2.1.4": "If a keyboard shortcut is implemented using only letter, punctuation, number or symbol characters, then the shortcut can be turned off, remapped or activated only on focus.", + "2.2.1": "For each time limit that is set by the content, the user can turn off, adjust, or extend the limit.", + "2.2.2": "For moving, blinking, scrolling, or auto-updating information, the user can pause, stop, hide or adjust the information.", + "2.3.1": "Content does not contain anything that flashes more than three times in any one second period, or the flash is below the general flash and red flash thresholds.", + "2.4.1": "A mechanism is available to bypass blocks of content that are repeated on multiple Web pages.", + "2.4.2": "Web pages, non-web documents, and software have titles that describe topic or purpose.", + "2.4.3": "If content can be navigated sequentially and the navigation sequences affect meaning or operation, focusable components receive focus in an order that preserves meaning and operability.", + "2.4.4": "The purpose of each link can be determined from the link text alone or from the link text together with its programmatically determined link content.", + "2.4.5": "More than one way is available to locate a Web page within a set of Web pages, except where the Web Page is the result of, or a step in, a process.", + "2.4.6": "Headings and labels describe topic or purpose.", + "2.4.7": "Any keyboard operable user interface has a mode of operation where the keyboard focus indicator is visible.", + "2.4.11": "When an element receives focus, it is not entirely covered by other content.", + "2.5.1": "All functionality that uses multipoint or path-based gestures for operation can be operated with a single pointer without a path-based gesture.", + "2.5.2": "For functionality that can be operated using a single pointer, completion of the function is on the up-event with an ability to abort, undo or reverse the outcome.", + "2.5.3": "For user interface components with labels that include text or images of text, the accessible name contains the text that is presented visually.", + "2.5.4": "Functionality that can be operated by motion can also be operated by user interface components, and the motion trigger can be disabled.", + "2.5.8": "The size of the target for pointer inputs is at least 24 by 24 CSS pixels.", + "2.5.7": "All functionality that uses a dragging movement for operation can be achieved by a single pointer without dragging.", + "3.1.1": "The default human language of Web pages, non-Web documents, or software can be programmatically determined.", + "3.1.2": "The human language of each passage or phrase in the content can be programmatically determined.", + "3.2.1": "When any component receives focus, it does not initiate a change of context.", + "3.2.2": "Changing the setting of any user interface component does not automatically cause a change of context unless the user has been advised of the behavior before using the component.", + "3.2.3": "Navigational mechanisms that are repeated on multiple Web pages within a set of Web pages occur in the same relative order each time they are repeated, unless a change is initiated by the user.", + "3.2.4": "Components that have the same functionality within a set of Web pages are identified consistently.", + "3.2.6": "Make it easier to find help and support. If a Web page contains help mechanisms they occur in the same order relative to other page content, unless a change is initiated by the user.", + "3.3.1": "If an input error is automatically detected, the item that is in error is identified and the error is described to the user in text.", + "3.3.2": "Labels or instructions are provided when content requires user input.", + "3.3.3": "If an input error is automatically detected and suggestions for correction are known, then the suggestions are provided to the user, unless it would jeopardize the security or purpose of the content.", + "3.3.4": "For content that cause legal commitments or financial transactions for the user to occur, that modify or delete user-controllable data in data storage systems, or that submit user test responses, the user can reverse, correct, or confirm the action.", + "3.3.7": "Make it easier for users to complete multi-step processes. Don't ask for the same information twice in the same session.", + "3.3.8": "Make logins possible with less mental effort. Don't make people solve, recall, or transcribe something to log in.", + "4.1.1": "(Obsolete and removed) This requirement was originally adopted to address problems that assistive technology (AT) had directly parsing HTML. AT no longer has any need to directly parse HTML. Consequently, these problems either no longer exist or are addressed by other requirements.", + "4.1.2": "For all user interface components (including, but not limited to: form elements, links and components generated by scripts), the name and role can be programmatically determined; states, properties, and values that can be set by the user can be programmatically set; and notification of changes to these items is available to user agents, including assistive technologies.", + "4.1.3": "In content implemented using markup languages, status messages can be programmatically determined through role or properties such that they can be presented to the user by assistive technologies without receiving focus.", + "HTML": "The HTML specification issues that cause accessibility issues may be covered by other rules and will be reported under those accessibility requirements. However, some non-conforming HTML specification issues are still reported.", + "ARIA": "The ARIA specification issues that cause accessibility issues may be covered by other rules and will be reported under those accessibility requirements. However, some non-conforming ARIA specification issues are still reported.", +}; +exports.a11yRulesets = [ + // { + // id: "DEBUG", + // name: "DEBUG Rules", + // category: eRuleCategory.ACCESSIBILITY, + // description: "Rules for debugging", + // checkpoints: [{ + // num: "1", + // name: "Debug CP 1", + // wcagLevel: "A", + // summary: "Rules for Debug" + // }] + // }, + { + id: "EXTENSIONS", + name: "Extension Rules", + category: IGuideline_1.eGuidelineCategory.ACCESSIBILITY, + description: "Rules for enabling the browser extensions", + type: IGuideline_1.eGuidelineType.EXTENSION, + checkpoints: [{ + num: "1", + name: "Extension CP 1", + wcagLevel: "A", + summary: "Rules for Extension" + }] + }, + { + id: "IBM_Accessibility", + name: "IBM Accessibility 7.3", + category: IGuideline_1.eGuidelineCategory.ACCESSIBILITY, + description: "Rules for WCAG 2.0, 2.1, 2.2 A and AA plus additional IBM supplemental requirements.", + // This ruleset has all 2.0 and 2.1 checkpoints that are A or AA + checkpoints: SCs + .filter(function (sc) { return (sc.level === "A" || sc.level === "AA" || sc.level === "NA") && (sc.wcagType === "2.0" || sc.wcagType === "2.1" || sc.wcagType === "2.2" || sc.wcagType === "NA"); }) + .map(function (sc) { return ({ + num: sc.num, + scId: sc.scId, + name: sc.handle, + wcagLevel: sc.level, + summary: summaries[sc.num] + }); }) + }, + { + id: "IBM_Accessibility_next", + name: "IBM Accessibility next", + category: IGuideline_1.eGuidelineCategory.ACCESSIBILITY, + description: "Rules for WCAG 2.0, 2.1, 2.2 A and AA plus additional IBM supplemental requirements.", + // This ruleset has all 2.0 and 2.1 checkpoints that are A or AA + checkpoints: SCs + .filter(function (sc) { return (sc.level === "A" || sc.level === "AA" || sc.level === "NA") && (sc.wcagType === "2.0" || sc.wcagType === "2.1" || sc.wcagType === "2.2" || sc.wcagType === "NA"); }) + .map(function (sc) { return ({ + num: sc.num, + scId: sc.scId, + name: sc.handle, + wcagLevel: sc.level, + summary: summaries[sc.num] + }); }) + }, + { + id: "WCAG_2_2", + name: "WCAG 2.2 (A, AA)", + category: IGuideline_1.eGuidelineCategory.ACCESSIBILITY, + description: "Rules for WCAG 2.2 A & AA. This is the current W3C recommendation (specification). Content that conforms to WCAG 2.2 also conforms to WCAG 2.1.", + // This ruleset has all 2.0 and 2.1 checkpoints that are A or AA + checkpoints: SCs + .filter(function (sc) { return (sc.level === "A" || sc.level === "AA") && (sc.wcagType === "2.0" || sc.wcagType === "2.1" || sc.wcagType === "2.2"); }) + .map(function (sc) { return ({ + num: sc.num, + scId: sc.scId, + name: sc.handle, + wcagLevel: sc.level, + summary: summaries[sc.num] + }); }) + }, + { + id: "WCAG_2_1", + name: "WCAG 2.1 (A, AA)", + category: IGuideline_1.eGuidelineCategory.ACCESSIBILITY, + description: "Rules for WCAG 2.1 A & AA. Content that conforms to WCAG 2.1 also conforms to WCAG 2.0.", + // This ruleset has all 2.0 and 2.1 checkpoints that are A or AA + checkpoints: SCs + .filter(function (sc) { return (sc.level === "A" || sc.level === "AA") && (sc.wcagType === "2.0" || sc.wcagType === "2.1"); }) + .map(function (sc) { return ({ + num: sc.num, + scId: sc.scId, + name: sc.handle, + wcagLevel: sc.level, + summary: summaries[sc.num] + }); }) + }, + { + id: "WCAG_2_0", + name: "WCAG 2.0 (A, AA)", + category: IGuideline_1.eGuidelineCategory.ACCESSIBILITY, + description: "Rules for WCAG 2.0 A & AA. Referenced by US Section 508, but not the latest W3C recommendation.", + // This ruleset has all 2.0 checkpoints that are A or AA + checkpoints: SCs + .filter(function (sc) { return (sc.level === "A" || sc.level === "AA") && (sc.wcagType === "2.0"); }) + .map(function (sc) { return ({ + num: sc.num, + scId: sc.scId, + name: sc.handle, + wcagLevel: sc.level, + summary: summaries[sc.num] + }); }) + } +]; + + +/***/ }, + +/***/ "./src/v4/simulator/SRController.ts" +/*!******************************************!*\ + !*** ./src/v4/simulator/SRController.ts ***! + \******************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SRController = void 0; +var SRCursor_1 = __webpack_require__(/*! ./SRCursor */ "./src/v4/simulator/SRCursor.ts"); +var SRRenderer_1 = __webpack_require__(/*! ./SRRenderer */ "./src/v4/simulator/SRRenderer.ts"); +var SRNavigator_1 = __webpack_require__(/*! ./SRNavigator */ "./src/v4/simulator/SRNavigator.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var SRUtil_1 = __webpack_require__(/*! ./SRUtil */ "./src/v4/simulator/SRUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +/** + * SRController class for managing screen reader simulation + * Maintains a point of regard and provides navigation functions + */ +var SRController = /** @class */ (function () { + /** + * Creates a new SRController + * @param rootElement The root element to start from (defaults to document.body) + */ + function SRController(rootElement) { + if (rootElement === void 0) { rootElement = document.body; } + this.rootElement = rootElement; + this.liveListeners = []; + this.ctrlDoc = rootElement.ownerDocument; + this.setPointOfRegard(rootElement); + this.setupMutationTracking(); + console.info("[WARNING] The SRController is a new feature that is not yet \"stable\". What this means:\n* API subject to change, even between minor versions of the checker\n* Results should be considered experimental. There are a variety of known issues, but making this available for early experimentation / feedback."); + } + SRController.getController = function (ctrlDoc) { + if (ctrlDoc === void 0) { ctrlDoc = document; } + if (!this.singleton) { + this.singleton = new SRController(ctrlDoc.body); + } + return this.singleton; + }; + SRController.prototype.disconnect = function () { + if (this.mutationObserver) { + this.mutationObserver.disconnect(); + } + }; + SRController.prototype.findAllShadowRoots = function (root) { + if (root === void 0) { root = document; } + var shadowRoots = []; + // Get all elements in the current root + var walker = this.ctrlDoc.createTreeWalker(root, NodeFilter.SHOW_ELEMENT, null); + var node; + while (node = walker.nextNode()) { + var element = node; + // Check if this element has an open shadow root + if (element.shadowRoot) { + shadowRoots.push(element.shadowRoot); + // Recursively search inside this shadow root + var nestedShadowRoots = this.findAllShadowRoots(element.shadowRoot); + shadowRoots.push.apply(shadowRoots, nestedShadowRoots); + } + } + return shadowRoots; + }; + /** + * Set up mutation tracking + * + * In the event that the point of regard is removed from the DOM, we need to get up to the nearest parent that's not being removed + */ + SRController.prototype.setupMutationTracking = function () { + var _this = this; + if (this.mutationObserver) { + this.mutationObserver.disconnect(); + } + var myThis = this; + var observer = new MutationObserver(function (mutations) { + var porNode = myThis.pointOfRegard.getNode(); + var _loop_1 = function (removalMutation) { + removalMutation.removedNodes.forEach(function (removedNode) { + if (removedNode.isSameNode(porNode) || removedNode.contains(porNode)) { + console.info("Adjusting PoR due to DOM mutation removing PoR"); //, removalMutation.target, removedNode, porNode) + porNode = removalMutation.target; + } + }); + }; + for (var _i = 0, _a = mutations.filter(function (mutation) { var _a; return ((_a = mutation.removedNodes) === null || _a === void 0 ? void 0 : _a.length) > 0; }); _i < _a.length; _i++) { + var removalMutation = _a[_i]; + _loop_1(removalMutation); + } + ; + _this.setPointOfRegard(porNode); + var _loop_2 = function (mutation) { + if (mutation.addedNodes) { + mutation.addedNodes.forEach(function (addedNode) { + // Add observation of new shadow roots + var allRoots = _this.findAllShadowRoots(addedNode); + for (var _i = 0, allRoots_2 = allRoots; _i < allRoots_2.length; _i++) { + var root = allRoots_2[_i]; + observer.observe(root, { + childList: true, + subtree: true, + characterData: true + }); + } + }); + } + var node = mutation.target; + var elem = node.nodeType === 1 ? node : node.parentElement; + if (elem + && !elem.closest("[aria-busy=\"true\"]") + && elem.getAttribute("aria-busy") !== "true") { + // Identify the live region container + var liveRegionElem = + // The element itself is a live region container + ((["polite", "assertive"].includes(elem.getAttribute("aria-live")) + || elem.nodeName.toUpperCase() === "OUTPUT" + || ["status", "log", "progressbar", "alert", "timer"].includes(elem.getAttribute("role"))) && elem) + // Or get the nearest ancestor + || elem.closest("[aria-live=\"polite\"],[aria-live=\"assertive\"],output,[role=\"status\"],[role=\"log\"],[role=\"progressbar\"],[role=\"alert\"],[role=\"timer\"]"); + var isMutationRelevant = false; + var relevance_1 = ["additions", "text"]; + if (liveRegionElem) { + // Determine what kinds of changes are 'relevant' + var relevantElem = elem.closest("[aria-relevant]"); + if (relevantElem) { + relevance_1 = relevantElem.getAttribute("aria-relevant").split(/ +/g); + } + if (liveRegionElem.getAttribute("role") === "log") { + relevance_1 = ["additions"]; + } + if (liveRegionElem.hasAttribute("aria-relevant")) { + relevance_1 = liveRegionElem.getAttribute("aria-relevant").split(/ +/g); + } + if (relevance_1.includes("all")) { + relevance_1 = ["additions", "removals", "text"]; + } + isMutationRelevant = (mutation.target.nodeType === 3 && relevance_1.includes("text")) + || (mutation.addedNodes.length > 0 && relevance_1.includes("additions")) + || (mutation.removedNodes.length > 0 && relevance_1.includes("removals")); + } + if (liveRegionElem && isMutationRelevant) { + var isAtomic_1 = liveRegionElem.getAttribute("aria-atomic") === "true" || ["alert", "status", "timer", "marquee"].includes(liveRegionElem.getAttribute("role")); + // Read the whole region if atomic + if (!isAtomic_1 && mutation.type === "characterData" && mutation.target.nodeType === 3 && !VisUtil_1.VisUtil.isNodeHiddenFromAT(mutation.target.parentElement)) { + for (var _c = 0, _d = _this.liveListeners; _c < _d.length; _c++) { + var liveListener = _d[_c]; + liveListener(mutation.target.nodeValue); + } + } + else { + var liveTarget_1 = isAtomic_1 ? liveRegionElem : mutation.target; + if (liveTarget_1.liveAnnounce) { + clearTimeout(liveTarget_1.liveAnnounce); + } + liveTarget_1.liveAnnounce = setTimeout(function () { + var results = []; + var isRemoval = (relevance_1.includes("removals") && mutation.removedNodes.length > 0); + if (isAtomic_1 || isRemoval) { + var liveCursor = new SRCursor_1.SRCursor(liveTarget_1, false); + var liveCursorEnd = new SRCursor_1.SRCursor(liveTarget_1, true); + liveCursorEnd.next(function () { return true; }); + results.push((isRemoval ? "[removed] " : "") + SRRenderer_1.SRRenderer.renderRange("item", liveCursor, liveCursorEnd)); + } + else if (relevance_1.includes("additions") && mutation.addedNodes.length > 0) { + mutation.addedNodes.forEach(function (addedNode) { + // Just render the additions + var liveCursor = new SRCursor_1.SRCursor(addedNode, false); + var liveCursorEnd = new SRCursor_1.SRCursor(addedNode, true); + liveCursorEnd.next(function () { return true; }); + results.push(SRRenderer_1.SRRenderer.renderRange("item", liveCursor, liveCursorEnd)); + }); + } + for (var _i = 0, _a = _this.liveListeners; _i < _a.length; _i++) { + var liveListener = _a[_i]; + liveListener(results.join("\n")); + } + }, 100); + } + } + } + }; + for (var _b = 0, mutations_1 = mutations; _b < mutations_1.length; _b++) { + var mutation = mutations_1[_b]; + _loop_2(mutation); + } + }); + // Need to observe all of the shadow roots + var allRoots = this.findAllShadowRoots(this.ctrlDoc.documentElement); + allRoots.push(this.ctrlDoc.documentElement); + for (var _i = 0, allRoots_1 = allRoots; _i < allRoots_1.length; _i++) { + var root = allRoots_1[_i]; + observer.observe(root, { + childList: true, + subtree: true, + characterData: true + }); + } + }; + SRController.prototype.addLiveListener = function (listener) { + this.liveListeners.push(listener); + }; + SRController.prototype.removeLiveListener = function (removeListener) { + this.liveListeners = this.liveListeners.filter(function (listener) { return listener !== removeListener; }); + }; + /** + * Get the current point of regard + * @returns The current SRCursor representing the point of regard + */ + SRController.prototype.getPointOfRegard = function () { + return this.pointOfRegard; + }; + /** + * Set the point of regard to a specific DOM node + * @param node The node to set as the point of regard + * @returns NavigationResult indicating success or failure + */ + SRController.prototype.setPointOfRegard = function (node) { + var _a; + var DEBUG = false; + DEBUG && console.group("setPointOfRegard"); + try { + this.pointOfRegard = new SRCursor_1.SRCursor(node); + // Update container state + var containerChanges = SRController.diffContainers("focus", this.pointOfRegard); + var role = this.pointOfRegard.getRole(); + var name_1 = (_a = this.pointOfRegard.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name; + return { + success: true, + renderingResult: SRRenderer_1.SRRenderer.renderCurrent("focus", this.pointOfRegard, containerChanges), + role: role, + name: name_1 + }; + } + catch (error) { + return { + success: false, + renderingResult: { + start: this.pointOfRegard.clone(), + end: this.pointOfRegard.clone(), + message: "Failed to set point of regard: ".concat(error.message) + } + }; + } + finally { + DEBUG && console.groupEnd(); + } + }; + /** + * Jump to the next element by the specified mode + * @param mode The navigation mode to use + * @returns NavigationResult indicating success or failure + */ + SRController.prototype.jumpNext = function (mode) { + var _a; + CacheUtil_1.CacheUtil.clearCaches(this.ctrlDoc.documentElement); + var oldPointOfRegard = this.pointOfRegard.clone(); + var DEBUG = false; + DEBUG && console.group("jumpNext"); + try { + var bContinue = true; + var nextJump = this.pointOfRegard.clone(); + var renderingResult = void 0; + while (bContinue && nextJump) { + var lastJump = nextJump.clone(); + nextJump = SRNavigator_1.SRNavigator.jumpNext(mode, nextJump); + if (nextJump) { + var containerChanges = SRController.diffContainers(mode, nextJump, lastJump); + if (mode === "item" && !SRNavigator_1.SRNavigator.getStartFunc(mode)(nextJump.getRole(), !nextJump.isEndTag(), nextJump.getNode())) { + containerChanges = { + entering: [], + leaving: [] + }; + } + renderingResult = SRRenderer_1.SRRenderer.renderCurrent(mode, nextJump, containerChanges); + // Keep going if the landing point is empty, unless it's certain nav modes (e.g., region) + bContinue = renderingResult.message.trim().length === 0 && !["region"].includes(mode); + } + } + if (!nextJump) { + // Restore the original point of regard + this.pointOfRegard = oldPointOfRegard; + var currentResult = SRRenderer_1.SRRenderer.renderCurrent(mode, oldPointOfRegard, { leaving: [], entering: [] }); + return { + success: false, + renderingResult: { + start: oldPointOfRegard.clone(), + end: oldPointOfRegard.clone(), + message: "No next ".concat(mode, ". ").concat((currentResult === null || currentResult === void 0 ? void 0 : currentResult.message) || "") + } + }; + } + else { + this.pointOfRegard = nextJump; + var role = this.pointOfRegard.getRole(); + var name_2 = (_a = this.pointOfRegard.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name; + // Check for container changes + DEBUG && console.log("New POR:", this.pointOfRegard.getNode(), renderingResult); + return { + success: true, + renderingResult: renderingResult, + role: role, + name: name_2 + }; + } + } + catch (error) { + console.error(error); + // Restore the original point of regard + this.pointOfRegard = oldPointOfRegard; + return { + success: false, + renderingResult: { + start: oldPointOfRegard.clone(), + end: oldPointOfRegard.clone(), + message: "Navigation error: ".concat(error.message) + } + }; + } + finally { + console.groupEnd(); + } + }; + /** + * Jump to the previous element by the specified mode + * @param mode The navigation mode to use + * @returns NavigationResult indicating success or failure + */ + SRController.prototype.jumpPrevious = function (mode) { + var _a; + CacheUtil_1.CacheUtil.clearCaches(this.ctrlDoc.documentElement); + var oldPointOfRegard = this.pointOfRegard.clone(); + try { + var bContinue = true; + var prevJump = this.pointOfRegard.clone(); + var renderingResult = void 0; + while (bContinue && prevJump) { + var lastJump = prevJump.clone(); + prevJump = SRNavigator_1.SRNavigator.jumpPrevious(mode, prevJump); + if (prevJump) { + var containerChanges = SRController.diffContainers(mode, prevJump, lastJump); + if (mode === "item" && !SRNavigator_1.SRNavigator.getStartFunc(mode)(prevJump.getRole(), !prevJump.isEndTag(), prevJump.getNode())) { + containerChanges = { + entering: [], + leaving: [] + }; + } + renderingResult = SRRenderer_1.SRRenderer.renderCurrent(mode, prevJump, containerChanges); + // Keep going if the landing point is empty, unless it's certain nav modes (e.g., region) + bContinue = renderingResult.message.trim().length === 0 && !["region"].includes(mode); + } + } + if (!prevJump) { + // Restore the original point of regard + this.pointOfRegard = oldPointOfRegard; + var currentResult = SRRenderer_1.SRRenderer.renderCurrent(mode, oldPointOfRegard, { leaving: [], entering: [] }); + return { + success: false, + renderingResult: { + start: oldPointOfRegard.clone(), + end: oldPointOfRegard.clone(), + message: "No previous ".concat(mode, ". ").concat((currentResult === null || currentResult === void 0 ? void 0 : currentResult.message) || "") + } + }; + } + else { + this.pointOfRegard = prevJump; + var role = this.pointOfRegard.getRole(); + var name_3 = (_a = this.pointOfRegard.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name; + // // Check for container changes + // const containerChanges = SRController.diffContainers(mode, this.pointOfRegard, oldPointOfRegard); + // let s = SRRenderer.renderEnter(mode, this.pointOfRegard); + // if (containerChanges.entering[containerChanges.entering.length-1] !== s) { + // containerChanges.entering.push(s); + // } + return { + success: true, + renderingResult: renderingResult, + role: role, + name: name_3 + }; + } + } + catch (error) { + console.error(error); + // Restore the original point of regard + this.pointOfRegard = oldPointOfRegard; + return { + success: false, + renderingResult: { + start: oldPointOfRegard.clone(), + end: oldPointOfRegard.clone(), + message: "Navigation error: ".concat(error.message) + } + }; + } + }; + /** + * Determine the different in containers between the two nodes + * @param newWalker The new node we're navigating to + * @param oldWalker The previous node we were at + * @returns Array of container change messages + */ + SRController.diffContainers = function (mode, newWalker, oldWalker) { + var DEBUG = false; + DEBUG && console.log("-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-"); + DEBUG && console.log("A)", oldWalker.getNode().nodeName, newWalker.getNode().nodeName); + var leaving = []; + var entering = []; + try { + var docRoot = newWalker ? + (newWalker.getNode().ownerDocument.body || newWalker.getNode().ownerDocument.documentElement) : + oldWalker ? + (oldWalker.getNode().ownerDocument.body || oldWalker.getNode().ownerDocument.documentElement) : + document.body || document.documentElement; + var walkNew = newWalker ? newWalker.clone() : (new SRCursor_1.SRCursor(docRoot)); + var walkOld = oldWalker ? oldWalker.clone() : (new SRCursor_1.SRCursor(docRoot)); + if (!walkNew.getNode().isSameNode(walkOld.getNode())) { + var commonParent = SRController.commonParent(walkNew, walkOld); + if (commonParent) { + DEBUG && console.log("B)", commonParent.getNode().nodeName); + while (commonParent.contains(walkNew)) { + DEBUG && console.log("Entering:", walkNew.getNode().nodeName); + entering.push(SRRenderer_1.SRRenderer.renderEnter(mode, walkNew, walkOld)); + walkNew.parent(); + } + entering.reverse(); + entering = entering.filter(function (s) { return s && s.trim().length > 0; }).map(function (s) { return s.trim(); }); + ; + while (commonParent.contains(walkOld)) { + DEBUG && console.log("Leaving:", walkOld.getNode().nodeName); + leaving.push(SRRenderer_1.SRRenderer.renderLeave(mode, walkOld, walkOld)); + walkOld.parent(); + } + leaving = leaving.filter(function (s) { return s && s.trim().length > 0; }).map(function (s) { return s.trim(); }); + } + } + } + catch (err) { + console.error(err); + } + DEBUG && console.log(leaving, entering); + return { + leaving: leaving, + entering: entering + }; + }; + SRController.commonParent = function (walkerOne, walkerTwo) { + if (walkerOne.contains(walkerTwo)) { + return walkerOne.clone(); + } + else if (walkerTwo.contains(walkerOne)) { + return walkerTwo.clone(); + } + else { + var commonParent = walkerOne.clone(); + while (!commonParent.contains(walkerTwo) && commonParent.parent()) + ; + if (!commonParent.contains(walkerOne) || !commonParent.contains(walkerTwo)) { + return null; + } + return commonParent; + } + }; + SRController.renderAll = function (mode) { + var ctrl = SRController.getController(); + var dialogs = ctrl.ctrlDoc.body.querySelectorAll("dialog,[role='dialog']"); + dialogs.forEach(function (dialog) { + if (SRUtil_1.SRUtil.isModalDialogElement(dialog)) { + ctrl.setPointOfRegard(dialog); + } + }); + var results = []; + // Handle the initial item first (if there is one) + var starterMsg = SRRenderer_1.SRRenderer.renderCurrent(mode, ctrl.getPointOfRegard(), { entering: [], leaving: [] }); + if (starterMsg) { + results.push(starterMsg.message); + } + var bContinue = true; + while (bContinue) { + var nextVal = ctrl.jumpNext(mode); + if (nextVal.success) { + results.push(nextVal.renderingResult.message); + } + else { + bContinue = false; + } + } + return results; + }; + SRController.renderAllDetail = function (doc, mode) { + var ctrl = SRController.getController(doc); + ctrl.setPointOfRegard(doc.body); + var dialogs = doc.body.querySelectorAll("dialog,[role='dialog']"); + dialogs.forEach(function (dialog) { + if (SRUtil_1.SRUtil.isModalDialogElement(dialog)) { + ctrl.setPointOfRegard(dialog); + } + }); + var results = []; + // Handle the initial item first (if there is one) + var starterMsg = SRRenderer_1.SRRenderer.renderCurrent(mode, ctrl.getPointOfRegard(), { entering: [], leaving: [] }); + if (starterMsg) { + results.push(starterMsg); + } + var bContinue = true; + while (bContinue) { + var nextVal = ctrl.jumpNext(mode); + if (nextVal.success) { + // mode === "item" && console.log(nextVal); + results.push(nextVal.renderingResult); + } + else { + bContinue = false; + } + } + return results; + }; + SRController.renderStructure = function (doc) { + var _a; + var modes = ["region", "heading", "item", "tab_focus", "image"]; + var details = modes.map(function (modeLabel) { return SRController.renderAllDetail(doc, modeLabel); }); + var retVal = []; + var _loop_3 = function () { + var next = (_a = details[0][0]) === null || _a === void 0 ? void 0 : _a.start; + modes.forEach(function (mode, idx) { + if (details[idx].length > 0) { + if (!next || SRCursor_1.SRCursor.compare(details[idx][0].start, next) < 0) { + next = details[idx][0].start; + } + } + }); + var nextItem = {}; + var hasValue = false; + modes.forEach(function (mode, idx) { + nextItem[mode] = ""; + if (details[idx].length > 0 && SRCursor_1.SRCursor.compare(details[idx][0].start, next) === 0) { + nextItem[mode] = details[idx].shift().message; + hasValue = nextItem[mode] !== ""; + } + }); + if (hasValue) { + var elem = next.getElement(); + var selector = elem && SRUtil_1.SRUtil.getUniqueSelector(elem); + if (selector && doc.querySelector(selector)) { + nextItem.selector = selector; + } + retVal.push(nextItem); + } + }; + while (details.some(function (detail) { return detail.length > 0; })) { + _loop_3(); + } + return retVal; + }; + return SRController; +}()); +exports.SRController = SRController; + + +/***/ }, + +/***/ "./src/v4/simulator/SRCursor.ts" +/*!**************************************!*\ + !*** ./src/v4/simulator/SRCursor.ts ***! + \**************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SRCursor = void 0; +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var SRUtil_1 = __webpack_require__(/*! ./SRUtil */ "./src/v4/simulator/SRUtil.ts"); +/** + * SRCursor (Screen Reader Cursor) class + * + * This class provides a cursor-like interface for navigating the DOM in a way that + * simulates how screen readers process and navigate content. It tracks: + * - The current node position + * - Whether it's at a start or end tag + * - The ARIA role of the current node + * - The accessible name of the current node + */ +var SRCursor = /** @class */ (function () { + /** + * Creates a new SRCursor positioned at the specified element + * @param element - The DOM node to position the cursor at + * @param bEnd - Whether to position at the end tag (true) or start tag (false) + */ + function SRCursor(element, bEnd) { + // Use DOMWalker with considerHidden=false to process all content (including hidden elements) + // This is important for screen reader simulation which needs to see all content + this.walker = new DOMWalker_1.DOMWalker(element, bEnd, undefined, false); + if (element) { + this.refreshName(); + } + } + /** + * Creates a copy of this cursor at the same position + * @returns A new SRCursor instance with the same position and properties + */ + SRCursor.prototype.clone = function () { + var retVal = new SRCursor(this.walker.node, this.walker.bEndTag); + retVal.role = this.role; + retVal.name = this.name; + return retVal; + }; + /** + * Updates the role and accessible name properties based on the current node + * This is called whenever the cursor position changes + * @private + */ + SRCursor.prototype.refreshName = function () { + if (this.walker.node.nodeType === 1) { + // Element node + this.role = AriaUtil_1.AriaUtil.getResolvedRole(this.walker.node, true); + this.name = AccNameUtil_1.AccNameUtil.computeAccessibleName(this.walker.node); + } + else if (this.walker.node.nodeType === 3) { + // Text node + this.role = "text"; + this.name = { name: this.walker.node.textContent, nameFrom: "text" }; + } + else { + // Other node types + this.role = undefined; + this.name = undefined; + } + }; + /** + * Moves the cursor to the next node that matches the provided criteria + * @param matchingFunc - Function that determines if a node matches the search criteria + * @returns true if a matching node was found, false otherwise + */ + SRCursor.prototype.next = function (matchingFunc, skipFunc) { + var _a; + var DEBUG = false; + // const DEBUG = false; + var foundNext = false; + // Get the skip info for the current spot + this.refreshName(); + DEBUG && console.group("next function"); + DEBUG && console.log(this.isEndTag() ? "/" : "", this.getNode()); + var _b = (skipFunc && skipFunc(this)) || { skipCurrent: false, skipChildren: false }, skipCurrent = _b.skipCurrent, skipChildren = _b.skipChildren; + DEBUG && console.log("skipCurrent:", skipCurrent, "skipChildren:", skipChildren); + do { + // Move as appropriate from the current spot + if (skipChildren && !this.walker.bEndTag) { + this.walker.bEndTag = true; + } + else if (!this.walker.nextNode()) { + break; + } + // Update the skip info for the new spot + this.refreshName(); + DEBUG && console.log(this.isEndTag() ? "/" : "", this.getNode()); + (_a = (skipFunc && skipFunc(this)) || { skipCurrent: false, skipChildren: false }, skipCurrent = _a.skipCurrent, skipChildren = _a.skipChildren); + DEBUG && console.log("skipCurrent:", skipCurrent, "skipChildren:", skipChildren); + // Update role based on node type + if (this.walker.node.nodeType === 1) { + this.role = AriaUtil_1.AriaUtil.getResolvedRole(this.walker.node, true); + } + else if (this.walker.node.nodeType === 3) { + this.role = "text"; + } + if (SRUtil_1.SRUtil.isModalDialogElement(this.getNode()) && this.isEndTag()) { + break; + } + if (!skipCurrent) { + // Check if this node matches our criteria + foundNext = matchingFunc(this.role, !this.walker.bEndTag, this.walker.node); + } + } while (!foundNext); + DEBUG && console.log("foundNext:", foundNext, this.isEndTag() ? "/" : "", this.getNode()); + DEBUG && console.groupEnd(); + if (foundNext) { + this.refreshName(); + } + else { + // Reset properties if no match was found + this.role = undefined; + this.name = undefined; + } + return foundNext; + }; + /** + * Moves the cursor to the previous node that matches the provided criteria + * @param matchingFunc - Function that determines if a node matches the search criteria + * @returns true if a matching node was found, false otherwise + */ + SRCursor.prototype.previous = function (matchingFunc, skipFunc) { + var _a; + var DEBUG = false; + var foundPrevious = false; + // Get the skip info for the current spot + this.refreshName(); + DEBUG && console.group("previous function"); + DEBUG && console.log(this.isEndTag(), this.getNode()); + var _b = (skipFunc && skipFunc(this)) || { skipCurrent: false, skipChildren: false }, skipCurrent = _b.skipCurrent, skipChildren = _b.skipChildren; + DEBUG && console.log(skipCurrent, skipChildren); + do { + // Move as appropriate from the current spot + if (skipChildren && this.walker.bEndTag) { + DEBUG && console.log("Skipping node"); + this.walker.bEndTag = false; + } + else if (!this.walker.prevNode()) { + break; + } + // Update the skip info for the new spot + this.refreshName(); + DEBUG && console.log(this.isEndTag(), this.getNode()); + (_a = (skipFunc && skipFunc(this)) || { skipCurrent: false, skipChildren: false }, skipCurrent = _a.skipCurrent, skipChildren = _a.skipChildren); + DEBUG && console.log(skipCurrent, skipChildren); + // Update role based on node type + if (this.walker.node.nodeType === 1) { + this.role = AriaUtil_1.AriaUtil.getResolvedRole(this.walker.node, true); + } + else if (this.walker.node.nodeType === 3) { + this.role = "text"; + } + if (SRUtil_1.SRUtil.isModalDialogElement(this.getNode()) && !this.isEndTag()) { + break; + } + if (!skipCurrent) { + // Check if this node matches our criteria + foundPrevious = matchingFunc(this.role, !this.walker.bEndTag, this.walker.node); + } + } while (!foundPrevious); + DEBUG && console.log(this.isEndTag(), this.getNode()); + DEBUG && console.groupEnd(); + if (foundPrevious) { + this.refreshName(); + } + else { + // Reset properties if no match was found + this.role = undefined; + this.name = undefined; + } + return foundPrevious; + }; + /** + * Moves the cursor to the parent node of the current node + * @param endTag - Whether to position at the end tag (true) or start tag (false) + * @returns true if successfully moved to parent, false if no parent exists + */ + SRCursor.prototype.parent = function (endTag) { + if (!this.walker.node.parentNode) + return false; + this.walker.node = this.walker.node.parentNode; + this.walker.bEndTag = endTag === true; + if (this.walker.node.nodeType === 1) { + this.role = AriaUtil_1.AriaUtil.getResolvedRole(this.walker.node, true); + this.name = AccNameUtil_1.AccNameUtil.computeAccessibleName(this.walker.node); + } + else if (this.walker.node.nodeType === 3) { + this.role = "text"; + this.name = { name: this.walker.node.textContent, nameFrom: "text" }; + } + else { + this.role = undefined; + this.name = undefined; + } + return true; + }; + /** + * Moves the cursor up the DOM tree until finding a node with a matching role or element name + * @param roles - Array of ARIA roles to match + * @param elems - Optional array of element names to match + * @returns true if a matching node was found, false otherwise + */ + SRCursor.prototype.getCurrentOrParentByRole = function (roles, elems) { + var _this = this; + var uppElems = elems ? elems.map(function (elem) { return elem.toUpperCase(); }) : []; + var matches = function (walker) { + var elem = walker.getElement(); + return roles.includes(_this.getRole()) + || (elem && !elem.hasAttribute("role") && uppElems.includes(elem.nodeName.toUpperCase())); + }; + while (!matches(this) && this.parent()) + ; + return matches(this); + }; + /** + * Creates a new cursor and moves it up the DOM tree until finding a node with a matching role or element name + * @param roles - Array of ARIA roles to match + * @param elems - Optional array of element names to match + * @returns A new cursor at the matching node, or null if no match found + */ + SRCursor.prototype.getCurrentOrParentByRoleClone = function (roles, elems) { + var retVal = this.clone(); + if (retVal.getCurrentOrParentByRole(roles, elems)) { + return retVal; + } + return null; + }; + SRCursor.prototype.getCurrentOrParentTabbableClone = function () { + var retVal = this.clone(); + while (retVal) { + var elem = retVal.getElement(); + if (retVal.isStartTag() && elem && CommonUtil_1.CommonUtil.isTabbable(elem)) { + return retVal; + } + if (!retVal.parent(false)) { + break; + } + } + return null; + }; + /** + * Gets the ARIA role of the current node + * @returns The ARIA role as a string, or undefined if not available + */ + SRCursor.prototype.getRole = function () { + return this.role; + }; + /** + * Gets the accessible name info for the current node + * @returns The AccessibleNameResult object, or undefined if not available + */ + SRCursor.prototype.getNameInfo = function () { + return this.name; + }; + /** + * Get the accessible name of the current node + */ + SRCursor.prototype.getName = function () { + // Handle one-off quirks in the name calculation + var nameInfo = this.getNameInfo(); + if (nameInfo && nameInfo.name) { + return nameInfo.name; + } + var elem = this.getElement(); + if (elem) { + var labelElem = CommonUtil_1.CommonUtil.getLabelForElementHidden(elem, true); + if (labelElem) { + return labelElem.innerText || labelElem.textContent; + } + } + }; + /** + * Sets whether the cursor is at an end tag or start tag + * @param val - True for end tag, false for start tag + */ + SRCursor.prototype.setEndTag = function (val) { + this.walker.bEndTag = val; + }; + /** + * Gets the DOM node at the current cursor position + * @returns The current DOM node + */ + SRCursor.prototype.getNode = function () { + return this.walker.node; + }; + /** + * Gets the current node as an HTMLElement if it is an element node + * @returns The current node as HTMLElement, or undefined if not an element + */ + SRCursor.prototype.getElement = function () { + if (!this.walker.node) + return undefined; + if (this.walker.node.nodeType !== 1) + return undefined; + return this.walker.node; + }; + SRCursor.prototype.getParentElement = function () { + if (!this.walker.node) + return null; + var retVal = this.clone(); + retVal.walker.node = DOMWalker_1.DOMWalker.parentElement(retVal.walker.node); + return retVal; + }; + /** + * Checks if the cursor is positioned at an end tag + * @returns true if at an end tag, false if at a start tag + */ + SRCursor.prototype.isEndTag = function () { + return this.walker.bEndTag; + }; + /** + * Checks if the cursor is positioned at an end tag + * @returns true if at an end tag, false if at a start tag + */ + SRCursor.prototype.isStartTag = function () { + return !this.walker.bEndTag; + }; + /** + * Compares the document position of two cursors + * @param one - First cursor to compare + * @param two - Second cursor to compare + * @returns 0 if equal, -1 if one is before two, 1 if one is after two + */ + SRCursor.compare = function (one, two) { + var _a, _b; + var nodeOne = (_a = one === null || one === void 0 ? void 0 : one.walker) === null || _a === void 0 ? void 0 : _a.node; + var nodeTwo = (_b = two === null || two === void 0 ? void 0 : two.walker) === null || _b === void 0 ? void 0 : _b.node; + if (!nodeOne && !nodeTwo) + return 0; + if (!nodeOne) + return 1; + if (!nodeTwo) + return -1; + var docPosition = nodeOne.compareDocumentPosition(nodeTwo); + // Handle disconnected nodes (different documents or shadow DOMs) + if (docPosition & 0x1) { + // Nodes are disconnected - they're in different trees (iframe or shadow DOM) + // Build ancestor chains using DOMWalker.parentNode (handles shadow DOM & iframes) + var ancestorsOne = [nodeOne]; + var ancestorsTwo = [nodeTwo]; + var current = nodeOne; + while (current = DOMWalker_1.DOMWalker.parentNode(current)) { + ancestorsOne.push(current); + } + current = nodeTwo; + while (current = DOMWalker_1.DOMWalker.parentNode(current)) { + ancestorsTwo.push(current); + } + // Reverse so root is first + ancestorsOne.reverse(); + ancestorsTwo.reverse(); + // Find where the paths diverge + var commonDepth = 0; + while (commonDepth < ancestorsOne.length && + commonDepth < ancestorsTwo.length && + ancestorsOne[commonDepth] === ancestorsTwo[commonDepth]) { + commonDepth++; + } + // If one path is a prefix of the other, handle containment + if (commonDepth === ancestorsOne.length) { + // nodeOne is an ancestor of nodeTwo + return one.walker.bEndTag ? 1 : -1; + } + if (commonDepth === ancestorsTwo.length) { + // nodeTwo is an ancestor of nodeOne + return two.walker.bEndTag ? -1 : 1; + } + // Compare the nodes where paths diverge + if (commonDepth > 0) { + var childOne = ancestorsOne[commonDepth]; + var childTwo = ancestorsTwo[commonDepth]; + var childPosition = childOne.compareDocumentPosition(childTwo); + if (childPosition & 0x2) + return 1; // childTwo precedes childOne + if (childPosition & 0x4) + return -1; // childOne precedes childTwo + } + // No common ancestor found - shouldn't happen in a well-formed document + return 0; + } + if (docPosition & 0x8) { + // one is contained within two + // if two is an end tag, one is before, otherwise, one is after + return two.walker.bEndTag ? -1 : 1; + } + else if (docPosition & 0x10) { + // two is contained within one + // if one is an end tag, one is after, otherwise, one is before + return one.walker.bEndTag ? 1 : -1; + } + else if (docPosition & 0x2) { + // two precedes one in the document + return 1; + } + else if (docPosition & 0x4) { + // one precedes two in the document + return -1; + } + return 0; + }; + /** + * Checks if this cursor's node contains another cursor's node + * @param other - The other cursor to check + * @returns true if this cursor contains (is a parent/ancestor of) the other cursor's node + */ + SRCursor.prototype.contains = function (other) { + return this.getNode().contains(other.getNode()) + && !this.isSameNode(other); + }; + /** + * Checks if this cursor points to the same node as another cursor + * @param other - The other cursor to compare with + * @returns true if both cursors point to the same node + */ + SRCursor.prototype.isSameNode = function (other) { + if (!other) + return false; + return this.getNode().isSameNode(other.getNode()); + }; + /** + * Checks if the current node has a non-empty accessible name + * @returns true if the node has a non-empty accessible name + */ + SRCursor.prototype.hasNonEmptyName = function () { + var _a; + return (((_a = this.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) || "").trim().length > 0; + }; + return SRCursor; +}()); +exports.SRCursor = SRCursor; + + +/***/ }, + +/***/ "./src/v4/simulator/SRNavigator.ts" +/*!*****************************************!*\ + !*** ./src/v4/simulator/SRNavigator.ts ***! + \*****************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SRNavigator = void 0; +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ../util/AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var SRCursor_1 = __webpack_require__(/*! ./SRCursor */ "./src/v4/simulator/SRCursor.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var SRNavigator; +(function (SRNavigator) { + /** + * Determine if a node is a block-level element based on its display property + * @param node The DOM node to check + * @returns true if the node is a block-level element, false otherwise + */ + function isBlockElement(node) { + var _a; + if (node.nodeType !== 1) + return false; + if (node.nodeName.toLowerCase() === "br") + return true; + var elem = node; + var mywin = elem.ownerDocument.defaultView; + var disp = (_a = mywin.getComputedStyle(elem)) === null || _a === void 0 ? void 0 : _a.display; + if (disp && disp.startsWith("table")) + return true; + if (disp === "block" && elem.style.display !== "block") { + // Is this block because it's a flex elem? + if (elem.parentElement && mywin.getComputedStyle(elem.parentElement).display === "flex") { + return false; + } + } + if (AriaUtil_1.AriaUtil.getResolvedRole(elem, true) === "link") { + var temp = new DOMWalker_1.DOMWalker(node, false, undefined, false); + temp.prevNode(); + if (!isBlockElement(temp.node)) { + return true; + } + } + return ["block", "flex", "grid", "list-item"].includes(disp); + } + function getExplicitTabindex(node) { + if (!node || node.nodeType !== 1) + return null; + var elem = node; + if (!elem.hasAttribute("tabindex")) + return null; + var tabindexValue = parseInt(elem.getAttribute("tabindex"), 10); + return Number.isNaN(tabindexValue) ? null : tabindexValue; + } + function isPositiveTabFocus(node) { + if (!node || node.nodeType !== 1) + return false; + var elem = node; + var explicitTabindex = getExplicitTabindex(elem); + return explicitTabindex !== null && explicitTabindex > 0 && CommonUtil_1.CommonUtil.isTabbable(elem); + } + function isDefaultOrZeroTabFocus(node) { + if (!node || node.nodeType !== 1) + return false; + var elem = node; + var explicitTabindex = getExplicitTabindex(elem); + return (explicitTabindex === null || explicitTabindex === 0) && CommonUtil_1.CommonUtil.isTabbable(elem); + } + function getTabFocusStartFunc(includePositiveTabindex) { + if (includePositiveTabindex === void 0) { includePositiveTabindex = true; } + return function (_role, bStartTag, node) { + if (!(node && node.nodeType === 1 && bStartTag && CommonUtil_1.CommonUtil.isTabbable(node))) + return false; + return includePositiveTabindex || isDefaultOrZeroTabFocus(node); + }; + } + /** + * Collect all tabbable elements in tab order (positive tabindex first, then document order) + * @param matchFunc Function to match tabbable elements + * @param rootNode Optional root node to start collection from (defaults to document body) + * @returns Array of cursors pointing to tabbable elements in tab order + */ + function collectTabFocusCursors(matchFunc, rootNode) { + var root = ((rootNode === null || rootNode === void 0 ? void 0 : rootNode.ownerDocument) || document).body || rootNode; + if (!root) + return []; + var walker = new SRCursor_1.SRCursor(root, false); + var skipFunc = getSkipFunc("tab_focus"); + var positiveResults = []; + var normalResults = []; + var addCursor = function (cursor) { + if (!matchFunc(cursor.getRole(), !cursor.isEndTag(), cursor.getNode())) + return; + if (isPositiveTabFocus(cursor.getNode())) { + positiveResults.push(cursor.clone()); + } + else if (isDefaultOrZeroTabFocus(cursor.getNode())) { + normalResults.push(cursor.clone()); + } + }; + addCursor(walker); + while (walker.next(function () { return true; }, skipFunc)) { + addCursor(walker); + } + positiveResults.sort(function (a, b) { + var aElem = a.getElement(); + var bElem = b.getElement(); + var aTabindex = getExplicitTabindex(aElem) || 0; + var bTabindex = getExplicitTabindex(bElem) || 0; + if (aTabindex !== bTabindex) + return bTabindex - aTabindex; + return SRCursor_1.SRCursor.compare(a, b); + }); + return positiveResults.concat(normalResults); + } + /** + * Find the index of a cursor in an array of tab focus cursors + * @param cursors Array of cursors to search + * @param walker The cursor to find + * @returns The index of the cursor, or -1 if not found + */ + function findTabFocusIndex(cursors, walker) { + return cursors.findIndex(function (cursor) { return SRCursor_1.SRCursor.compare(cursor, walker) === 0; }); + } + /** + * Get the match function for identifying start positions in a given navigation mode + * @param mode The navigation mode (e.g., "link", "heading", "button", etc.) + * @returns A function that matches elements appropriate for the navigation mode + */ + function getStartFunc(mode) { + switch (mode) { + case "link": + return function (role, bStartTag) { return (bStartTag && role === "link"); }; + case "tab_focus": + return getTabFocusStartFunc(false); + case "heading": + return function (role, bStartTag) { return (bStartTag && role === "heading"); }; + case "h1": + return function (role, bStartTag, node) { return (bStartTag && role === "heading" && node.ariaLevel === "1"); }; + case "h2": + return function (role, bStartTag, node) { return (bStartTag && role === "heading" && node.ariaLevel === "2"); }; + case "h3": + return function (role, bStartTag, node) { return (bStartTag && role === "heading" && node.ariaLevel === "3"); }; + case "h4": + return function (role, bStartTag, node) { return (bStartTag && role === "heading" && node.ariaLevel === "4"); }; + case "h5": + return function (role, bStartTag, node) { return (bStartTag && role === "heading" && node.ariaLevel === "5"); }; + case "h6": + return function (role, bStartTag, node) { return (bStartTag && role === "heading" && node.ariaLevel === "6"); }; + case "image": + return function (role, bStartTag) { return (bStartTag && ["img", "graphics-document"].includes(role)); }; + case "radio": + return function (role, bStartTag) { return (bStartTag && role === "radio"); }; + case "button": + return function (role, bStartTag) { return (bStartTag && role === "button"); }; + case "checkbox": + return function (role, bStartTag) { return (bStartTag && role === "checkbox"); }; + case "combo": + return function (role, bStartTag) { return (bStartTag && role === "combobox"); }; + case "list": + return function (role, bStartTag) { return (bStartTag && role === "list"); }; + case "listitem": + return function (role, bStartTag) { return (bStartTag && role === "listitem"); }; + case "article": + return function (role, bStartTag) { return (bStartTag && role === "article"); }; + case "table": + return function (role, bStartTag) { return (bStartTag && role === "table"); }; + case "paragraph": + return function (_role, bStartTag, node) { return (bStartTag && node.nodeName.toUpperCase() === "P"); }; + case "dom": + return function () { return true; }; + case "item": + return function (_role, bStartTag, node) { + if (!bStartTag) + return false; + if (isBlockElement(node)) + return true; + var temp = new DOMWalker_1.DOMWalker(node, !bStartTag); + if (temp.prevNode() && temp.bEndTag) { + return isBlockElement(temp.node); + } + return false; + }; + case "region": + return function (role, bStartTag, node) { + var _a, _b; + if (!bStartTag) + return false; + if (["main", "navigation", "form", "banner", "search", "contentinfo"].includes(role)) + return true; + if (role !== "region" || (node === null || node === void 0 ? void 0 : node.nodeType) !== 1) + return false; + return !!((_b = (_a = AccNameUtil_1.AccNameUtil.computeAccessibleName(node)) === null || _a === void 0 ? void 0 : _a.name) === null || _b === void 0 ? void 0 : _b.trim()); + }; + case "formcontrol": + case "editbox": + case "graphic": + case "frame": + case "division": + case "tabcontrol": + case "separator": + case "clickable": + case "mouseover": + throw new Error("NOT_IMPLEMENTED"); + } + } + SRNavigator.getStartFunc = getStartFunc; + /** + * Check if an element is within a Shadow DOM + * @param element The element to check + * @returns true if the element is in a Shadow DOM, false otherwise + */ + var isInShadowDOM = function (element) { + var root = element.getRootNode(); + return root instanceof ShadowRoot; + }; + /** + * Determine skip behavior for item navigation mode + * Handles complex visibility rules including hidden content in headings/links + * @param cursor The cursor at the current position + * @returns Object indicating whether to skip current node and/or its children, or null for default behavior + */ + var SKIP_ITEM_BEHAVIOR = function (cursor) { + var DEBUG = false; + DEBUG && console.group("SKIP_ITEM_BEHAVIOR"); + var retVal = null; + try { + var nodeType = cursor.getNode().nodeType; + var elem = cursor.getElement(); + var cursorStart = cursor.clone(); + cursorStart.setEndTag(false); + DEBUG && console.log(nodeType); + // Skip CDATA and comments completely + if ([4, 8].includes(nodeType)) + return retVal = { skipCurrent: true, skipChildren: true }; + // Only process elements and text + if (![1, 3].includes(nodeType)) + return retVal = { skipCurrent: true, skipChildren: false }; + // For text elements, Consider with relation to their parent element + if (nodeType === 3) { + elem = cursor.getNode().parentElement; + if (!elem) + return retVal = VisUtil_1.VisUtil.isNodeHiddenFromAT(elem) ? { skipCurrent: true, skipChildren: false } : null; + } + // if (!elem) console.log(cursor.getNode()); + // We have an element + // Make sure we're within the body element + if (!elem.closest("body") && !isInShadowDOM(elem)) + return retVal = { skipCurrent: true, skipChildren: false }; + // Make sure we're not in a script or style + if (elem.closest("script,style")) + return retVal = { skipCurrent: true, skipChildren: true }; + // For text nodes, we need to check visibility in context of parent heading/link + // So we'll handle text node visibility checks below with the element visibility checks + // Skip things hidden from the AT, UNLESS we're inside a heading or link + // (headings and links should include their full accessible name, including hidden parts) + // BUT only if the heading/link uses nameFrom="content" (not aria-label/aria-labelledby) + var parentHeadingOrLink = cursorStart.getCurrentOrParentByRoleClone(["heading", "link"]); + // Special case: if current element itself is a heading or link AND we're NOT inside another heading/link, + // apply normal skip rules + var currentRole = AriaUtil_1.AriaUtil.getResolvedRole(elem); + var isCurrentHeadingOrLink = currentRole === "heading" || currentRole === "link"; + if (!parentHeadingOrLink) { + // Not inside any heading/link - apply normal skip rules + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(elem)) + return retVal = { skipCurrent: true, skipChildren: nodeType === 1 }; + if (!VisUtil_1.VisUtil.isNodeVisible(elem)) + return retVal = { skipCurrent: true, skipChildren: nodeType === 1 }; + } + else { + // Check if the parent heading/link uses aria-label or aria-labelledby + var parentElem = parentHeadingOrLink.getElement(); + var nameInfo = parentHeadingOrLink.getNameInfo(); + // If nameFrom is NOT "content" or "text", skip all content (it's using aria-label/aria-labelledby) + if (nameInfo && !["content", "text"].includes(nameInfo.nameFrom)) { + // Parent uses aria-label/aria-labelledby - skip all content including nested headings/links + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(elem)) + return retVal = { skipCurrent: true, skipChildren: true }; + if (!VisUtil_1.VisUtil.isNodeVisible(elem)) + return retVal = { skipCurrent: true, skipChildren: true }; + } + else if (isCurrentHeadingOrLink) { + // Current element is a heading/link inside another heading/link with content-based name + // Don't skip it - let it through so its content can be read + // (The logic at line 183 will handle whether to skip its children) + } + else { + // nameFrom is "content", so include hidden content but skip hidden images/graphics + var role_1 = AriaUtil_1.AriaUtil.getResolvedRole(elem); + if ((role_1 === "img" || role_1 === "graphics-document") && VisUtil_1.VisUtil.isNodeHiddenFromAT(elem)) { + return retVal = { skipCurrent: true, skipChildren: true }; + } + // Don't skip other hidden content - it should be included in the accessible name + } + } + if (elem.nodeName.toUpperCase() === "BODY") + return retVal = { skipCurrent: false, skipChildren: false }; + // Skip labels that are associated with controls - they'll be read with the related input. + // Keep children so interactive content (e.g. links) inside the label still appears in + // reading/tab order. + if (elem.nodeName.toUpperCase() === "LABEL") { + if (elem.hasAttribute("for") + && document.getElementById(elem.getAttribute("for")) + && document.getElementById(elem.getAttribute("for")).getAttribute("type") !== "hidden") { + return retVal = { skipCurrent: true, skipChildren: false }; + } + else { + var nestedControl = elem.querySelector("input, select, textarea, button, [role='checkbox'], [role='combobox'], [role='listbox'], [role='menuitemcheckbox'], [role='menuitemradio'], [role='radio'], [role='searchbox'], [role='slider'], [role='spinbutton'], [role='switch'], [role='textbox']"); + if (nestedControl && nestedControl.getAttribute("type") !== "hidden") { + return retVal = { skipCurrent: true, skipChildren: false }; + } + } + } + // Skip non-interactive content that is a descendant of a for-linked label. + // Such content is already surfaced as part of the associated control's announcement. + // Interactive descendants (links, buttons, etc.) are allowed through. + { + var labelFor = elem.closest("label[for]"); + var labelForTarget = labelFor && labelFor.getAttribute("for"); + if (labelFor + && labelForTarget + && document.getElementById(labelForTarget) + && document.getElementById(labelForTarget).getAttribute("type") !== "hidden" + && !elem.closest("a[href], [role='link'], button, [role='button']")) { + return retVal = { skipCurrent: true, skipChildren: nodeType === 1 }; + } + } + var role = cursorStart.getRole(); + // If we have presentational children, read the element, skip the children + if (AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(elem)) { + return retVal = { skipCurrent: false, skipChildren: true }; + } + // Skip children of headings/links that don't use content-based names + // UNLESS we're inside another heading/link that DOES use content-based names + if (["link", "heading"].includes(role) && (!cursorStart.getName() || (!["content", "text"].includes(cursorStart.getNameInfo().nameFrom)))) { + // Check if we're inside a parent heading/link with content-based name + if (parentHeadingOrLink && parentHeadingOrLink.getNameInfo() && ["content", "text"].includes(parentHeadingOrLink.getNameInfo().nameFrom)) { + // Don't skip children - we're nested inside a content-based heading/link + } + else { + return retVal = { skipCurrent: false, skipChildren: true }; + } + } + if (elem.nodeName.toUpperCase() === "LEGEND") { + var parent_1 = DOMWalker_1.DOMWalker.parentElement(cursor.getNode()); + while (parent_1) { + if (parent_1.nodeName.toUpperCase() === 'FIELDSET') { + // Legend is within a fieldset, suppress output + return retVal = { skipCurrent: false, skipChildren: true }; + } + parent_1 = DOMWalker_1.DOMWalker.parentElement(parent_1); + } + } + if (elem && elem.nodeName.toUpperCase() === "MSUP") { + return retVal = { skipCurrent: false, skipChildren: true }; + } + if (elem.closest(".ibma-sr-overlay")) { + return retVal = { skipCurrent: true, skipChildren: true }; + } + return retVal = null; + } + finally { + DEBUG && console.log("SKIP_ITEM retVal:", retVal); + DEBUG && console.groupEnd(); + } + }; + /** + * Determine skip behavior for nested navigation modes (link, heading, image, etc.) + * Simpler than SKIP_ITEM_BEHAVIOR as it doesn't need complex heading/link content rules + * @param cursor The cursor at the current position + * @returns Object indicating whether to skip current node and/or its children, or null for default behavior + */ + var SKIP_NESTED_BEHAVIOR = function (cursor) { + var nodeType = cursor.getNode().nodeType; + var elem = cursor.getElement(); + // Only visit elements and text nodes + if (nodeType !== 1 && nodeType !== 3) + return { skipCurrent: true, skipChildren: false }; + if (nodeType === 3) + return VisUtil_1.VisUtil.isNodeHiddenFromAT(elem) ? { skipCurrent: true, skipChildren: false } : null; + // We have an elemenet + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(elem)) + return { skipCurrent: true, skipChildren: true }; + // Skip label fors - they'll be read with the related input. + // Keep children so interactive content (e.g. links) inside the label still appears in + // reading/tab order. + if (elem.nodeName.toUpperCase() === "LABEL" + && elem.hasAttribute("for") + && document.getElementById(elem.getAttribute("for")) + && document.getElementById(elem.getAttribute("for")).getAttribute("type") !== "hidden") { + return { skipCurrent: true, skipChildren: false }; + } + // Skip non-interactive content that is a descendant of a for-linked label. + // Such content is already surfaced as part of the associated control's announcement. + // Interactive descendants (links, buttons, etc.) are allowed through. + { + var labelFor = elem.closest("label[for]"); + var labelForTarget = labelFor && labelFor.getAttribute("for"); + if (labelFor + && labelForTarget + && document.getElementById(labelForTarget) + && document.getElementById(labelForTarget).getAttribute("type") !== "hidden" + && !elem.closest("a[href], [role='link'], button, [role='button']")) { + return { skipCurrent: true, skipChildren: nodeType === 1 }; + } + } + var role = cursor.getRole(); + // If we have presentational children, read the element, skip the children + if (AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(elem)) { + return { skipCurrent: false, skipChildren: true }; + } + if (elem && elem.nodeName.toUpperCase() === "MSUP") { + return { skipCurrent: true, skipChildren: true }; + } + if (elem.closest(".ibma-sr-overlay")) { + return { skipCurrent: true, skipChildren: true }; + } + return null; + }; + /** + * Get the skip function for a given navigation mode + * @param mode The navigation mode + * @returns A function that determines which nodes to skip during navigation + */ + function getSkipFunc(mode) { + switch (mode) { + case "region": + case "item": + return SKIP_ITEM_BEHAVIOR; + case "link": + case "tab_focus": + case "heading": + case "h1": + case "h2": + case "h3": + case "h4": + case "h5": + case "h6": + case "image": + return SKIP_NESTED_BEHAVIOR; + case "radio": + case "button": + case "checkbox": + case "combo": + case "list": + case "listitem": + case "article": + case "table": + case "paragraph": + case "dom": + case "formcontrol": + case "editbox": + case "graphic": + case "frame": + case "division": + case "tabcontrol": + case "separator": + case "clickable": + case "mouseover": + throw new Error("NOT_IMPLEMENTED"); + } + } + SRNavigator.getSkipFunc = getSkipFunc; + /** + * Jump to the current position or the previous matching element if current doesn't match + * @param mode The navigation mode + * @param walker The cursor at the current position + * @returns A cursor at the current or previous matching position + */ + function jumpCurrent(mode, walker) { + var matchFunc = mode === "tab_focus" ? getTabFocusStartFunc(true) : getStartFunc(mode); + if (matchFunc(walker.getRole(), !walker.isEndTag(), walker.getNode())) { + return walker.clone(); + } + else { + return jumpPrevious(mode, walker); + } + } + SRNavigator.jumpCurrent = jumpCurrent; + /** + * Jump to the end of the current element and return all intermediate item positions + * @param mode The navigation mode + * @param walker The cursor at the current position + * @returns Array of cursors representing positions from current to end + */ + function jumpCurrentEnd(mode, walker) { + if (mode === "item") { + var itemEnd = jumpNext(mode, walker); + return itemEnd ? [itemEnd] : []; + } + else { + var nameInfo = walker.getNameInfo(); + var retVal = walker.clone(); + if (nameInfo && !["content", "text"].includes(nameInfo.nameFrom)) { + // Name is just from the item itself + retVal.next(function () { return true; }); + } + else { + // Name is from the content + retVal.setEndTag(true); + retVal.next(function () { return true; }); + } + var endCursors = []; + var itemEnd = jumpNext("item", walker); + while (itemEnd && SRCursor_1.SRCursor.compare(itemEnd, retVal) < 0) { + endCursors.push(itemEnd); + itemEnd = jumpNext("item", itemEnd); + } + endCursors.push(retVal); + return mode === "tab_focus" && walker.getRole() === "link" ? [endCursors[endCursors.length - 1]] : endCursors; + } + } + SRNavigator.jumpCurrentEnd = jumpCurrentEnd; + /** + * Jump to the next matching element in the given navigation mode + * @param mode The navigation mode + * @param walker The cursor at the current position + * @returns A cursor at the next matching position, or null if none found + */ + function jumpNext(mode, walker) { + var DEBUG = false; + DEBUG && console.group("SRNavigator::jumpNext", walker.isEndTag() ? "/" : "", walker.getNode()); + try { + if (mode === "tab_focus") { + var tabFocusMatchFunc = getTabFocusStartFunc(true); + var tabFocusCursors = collectTabFocusCursors(tabFocusMatchFunc, walker.getNode()); + if (tabFocusCursors.length > 0) { + // console.log(tabFocusCursors.map(c => c.getNode())); + var currentTabFocusParentCursor = walker.getCurrentOrParentTabbableClone(); + var currentTabFocusCursor = currentTabFocusParentCursor && findTabFocusIndex(tabFocusCursors, currentTabFocusParentCursor) >= 0 ? currentTabFocusParentCursor : walker.clone(); + var currentIndex = findTabFocusIndex(tabFocusCursors, currentTabFocusCursor); + if (currentIndex >= 0) { + if (currentIndex + 1 < tabFocusCursors.length) { + return tabFocusCursors[currentIndex + 1].clone(); + } + return null; + } + return tabFocusCursors[0].clone(); + } + } + var retVal = walker.clone(); + var matchFunc = getStartFunc(mode); + var skipFunc = getSkipFunc(mode); + if (retVal.next(matchFunc, skipFunc)) { + DEBUG && console.log("SRNavigator::jumpNext result", retVal); + return retVal; + } + else { + return null; + } + } + finally { + console.groupEnd(); + } + } + SRNavigator.jumpNext = jumpNext; + /** + * Navigates to the previous element in screen reader navigation based on the specified mode. + * + * For tab_focus mode, this function attempts to move to the previous tabbable element by: + * 1. First trying to move backward using the mode's match and skip functions + * 2. If that fails, collecting all tab focus cursors and finding the previous one in the tab order + * + * @param mode - The navigation mode (e.g., "tab_focus") that determines how to navigate + * @param walker - The current cursor position in the screen reader navigation + * @returns A new cursor positioned at the previous element, or null if no previous element exists + */ + function jumpPrevious(mode, walker) { + if (mode === "tab_focus") { + var retVal_1 = walker.clone(); + var matchFunc_1 = getStartFunc(mode); + var skipFunc_1 = getSkipFunc(mode); + if (retVal_1.previous(matchFunc_1, skipFunc_1)) { + return retVal_1; + } + var tabFocusMatchFunc = getTabFocusStartFunc(true); + var tabFocusCursors = collectTabFocusCursors(tabFocusMatchFunc, walker.getNode()); + if (tabFocusCursors.length > 0) { + var currentTabFocusParentCursor = walker.getCurrentOrParentTabbableClone(); + var currentTabFocusCursor = currentTabFocusParentCursor && findTabFocusIndex(tabFocusCursors, currentTabFocusParentCursor) >= 0 ? currentTabFocusParentCursor : walker.clone(); + var currentIndex = findTabFocusIndex(tabFocusCursors, currentTabFocusCursor); + if (currentIndex > 0) { + return tabFocusCursors[currentIndex - 1].clone(); + } + } + return null; + } + var retVal = walker.clone(); + var matchFunc = getStartFunc(mode); + var skipFunc = getSkipFunc(mode); + if (retVal.previous(matchFunc, skipFunc)) { + return retVal; + } + else { + return null; + } + } + SRNavigator.jumpPrevious = jumpPrevious; +})(SRNavigator = exports.SRNavigator || (exports.SRNavigator = {})); + + +/***/ }, + +/***/ "./src/v4/simulator/SRRenderer.ts" +/*!****************************************!*\ + !*** ./src/v4/simulator/SRRenderer.ts ***! + \****************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SRRenderer = void 0; +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var SRNavigator_1 = __webpack_require__(/*! ./SRNavigator */ "./src/v4/simulator/SRNavigator.ts"); +var SRCursor_1 = __webpack_require__(/*! ./SRCursor */ "./src/v4/simulator/SRCursor.ts"); +var render_rules_1 = __webpack_require__(/*! ./render_rules */ "./src/v4/simulator/render_rules/index.ts"); +var common_1 = __webpack_require__(/*! ./render_rules/common */ "./src/v4/simulator/render_rules/common.ts"); +/** + * SRRenderer namespace provides functionality for simulating how screen readers + * announce content to users. It contains rules for rendering different types of + * elements and ARIA roles in various navigation modes. + * + * The renderer uses a rule-based system to determine what text should be announced + * when navigating to, within, or away from elements based on their roles and properties. + */ +var SRRenderer; +(function (SRRenderer) { + /** + * Generates the announcement text when entering an element + * + * This function looks up the appropriate rule based on the element's role or tag name + * and applies it to generate the announcement text. + * + * @param mode - The current navigation mode + * @param walker - Cursor at the current position + * @param oldWalker - Optional cursor at the previous position + * @returns Announcement text for entering the element, or null if no rule applies + */ + function renderEnter(mode, walker, oldWalker) { + var DEBUG = false; + for (var _i = 0, CONTAINER_ENTER_RULES_1 = render_rules_1.CONTAINER_ENTER_RULES; _i < CONTAINER_ENTER_RULES_1.length; _i++) { + var rule = CONTAINER_ENTER_RULES_1[_i]; + var s = rule.test(mode, walker, oldWalker); + DEBUG && console.log(mode, walker, rule, s); + if (typeof s !== "undefined" && s !== null) { + return s; + } + } + return null; + } + SRRenderer.renderEnter = renderEnter; + /** + * Generates the announcement text when leaving an element + * + * Similar to renderEnter, but applies rules for leaving elements instead. + * + * @param mode - The current navigation mode + * @param walker - Cursor at the current position + * @param oldWalker - Optional cursor at the previous position + * @returns Announcement text for leaving the element, or null if no rule applies + */ + function renderLeave(mode, walker, oldWalker) { + for (var _i = 0, CONTAINER_EXIT_RULES_1 = render_rules_1.CONTAINER_EXIT_RULES; _i < CONTAINER_EXIT_RULES_1.length; _i++) { + var rule = CONTAINER_EXIT_RULES_1[_i]; + var s = rule.test(mode, walker, oldWalker); + if (typeof s !== "undefined" && s !== null) { + return s; + } + } + return null; + } + SRRenderer.renderLeave = renderLeave; + /** + * Renders the current element and any container changes + * + * This function combines announcements for: + * - Containers being left + * - Containers being entered + * - The current element itself + * + * @param mode - The current navigation mode + * @param walker - Cursor at the current position + * @param containerChanges - Information about containers being entered or left + * @returns Combined announcement text + */ + function renderCurrent(mode, walker, containerChanges) { + var DEBUG = false; //mode === "tab_focus" && document.getElementById("fixture")?.getAttribute("class") === "tomtest"; + var startOfRender = SRNavigator_1.SRNavigator.jumpCurrent(mode, walker); + if (!startOfRender) + return null; + var endOfRenders = SRNavigator_1.SRNavigator.jumpCurrentEnd(mode, startOfRender); + if (!endOfRenders || endOfRenders.length === 0) { + endOfRenders = [null]; + } + DEBUG && console.log("AAAA", startOfRender.isStartTag(), startOfRender.getNode()); + DEBUG && console.log("BBBB", endOfRenders.map(function (val) { return val && val.isStartTag(); }), endOfRenders.map(function (val) { return val && val.getNode(); })); + var endOfRender = endOfRenders[endOfRenders.length - 1]; + var renderStr = ""; + for (var _i = 0, endOfRenders_1 = endOfRenders; _i < endOfRenders_1.length; _i++) { + var candidateEnd = endOfRenders_1[_i]; + var candidateRenderStr = SRRenderer.renderRange(mode, startOfRender, candidateEnd); + if (candidateRenderStr.trim().length > 0) { + endOfRender = candidateEnd; + renderStr = candidateRenderStr; + break; + } + } + if (renderStr === "") { + renderStr = SRRenderer.renderRange(mode, startOfRender, endOfRender); + } + DEBUG && console.log("CCCC", renderStr); + return { + start: startOfRender, + end: endOfRender, + message: (containerChanges.leaving || []).concat(containerChanges.entering || []).concat([renderStr]).join(" ").replace(/\s+/g, " ") + }; + } + SRRenderer.renderCurrent = renderCurrent; + /** + * Renders a range of elements between two cursors + * + * This function traverses the DOM from startOfRender to endOfRender, + * applying rendering rules to each element and combining the results. + * + * @param mode - The current navigation mode + * @param startOfRender - Cursor at the start of the range + * @param endOfRender - Cursor at the end of the range + * @returns Combined announcement text for the entire range + */ + function renderRange(mode, startOfRender, endOfRender) { + var _a; + var iterWalker = startOfRender.clone(); + var elemStrs = []; + var bContinue = true; + var currentLink = null; + while (bContinue) { + var elem = iterWalker.getElement(); + var node = iterWalker.getNode(); + var nodeType = node.nodeType; + var renderStrs = []; + var linkParent = AriaUtil_1.AriaUtil.getAncestorWithRole(node, "link", true); + if (linkParent && !["content", "text"].includes((_a = new SRCursor_1.SRCursor(linkParent).getNameInfo()) === null || _a === void 0 ? void 0 : _a.nameFrom)) { + // We don't consider links that announce themselves + linkParent = null; + } + for (var _i = 0, SR_RULES_1 = render_rules_1.SR_RULES; _i < SR_RULES_1.length; _i++) { + var rule = SR_RULES_1[_i]; + var s = rule.test(mode, iterWalker); + if (typeof s !== "undefined" && s !== null && s.trim().length > 0) { + if (nodeType === 1 && !iterWalker.isEndTag() && elem.getAttribute("aria-haspopup") === "menu") { + s = "[subMenu] " + s; + } + // Handle links + if (mode === "tab_focus") { + // We're in link mode + if (currentLink && (!linkParent || (linkParent && currentLink !== linkParent))) { + // We've added a string within a link (currentLink), but now we've left the link or moved to a new link + s = "".concat(s, " ").concat((0, common_1.getLinkAnnouncement)(new SRCursor_1.SRCursor(currentLink, false))); + } + } + else { + if (linkParent && (!currentLink || (currentLink !== linkParent))) { + // We're in a link, and we haven't announced this link, or we've moved to a new link + s = "".concat((0, common_1.getLinkAnnouncement)(new SRCursor_1.SRCursor(linkParent, false)), " ").concat(s); + } + } + if (s !== "") { + currentLink = linkParent; + elemStrs.push(s); + } + break; + } + } + elemStrs.push(renderStrs.filter(function (s) { return s.trim().length > 0; }).join(" ")); + bContinue = iterWalker.next(function () { return true; }, SRNavigator_1.SRNavigator.getSkipFunc(mode)) && SRCursor_1.SRCursor.compare(iterWalker, endOfRender) < 0; + } + if (mode === "tab_focus" && currentLink) { + elemStrs.push("".concat((0, common_1.getLinkAnnouncement)(new SRCursor_1.SRCursor(currentLink, false)))); + } + var retVal = elemStrs.filter(function (s) { return s.trim().length > 0; }).join(" "); + retVal = retVal.replace(/, \u0001([^\u0002]+)\u0002/g, function (match, describedByText) { + var quotedText = "\"".concat(describedByText, "\""); + var unmarkedRetVal = retVal.replace(match, ""); + return unmarkedRetVal.includes(quotedText) || unmarkedRetVal.includes(describedByText) ? "" : ", ".concat(quotedText); + }); + retVal = retVal.replace(/[\u0001\u0002]/g, ""); + return retVal; + } + SRRenderer.renderRange = renderRange; +})(SRRenderer = exports.SRRenderer || (exports.SRRenderer = {})); + + +/***/ }, + +/***/ "./src/v4/simulator/SRRendererRule.ts" +/*!********************************************!*\ + !*** ./src/v4/simulator/SRRendererRule.ts ***! + \********************************************/ +(__unused_webpack_module, exports) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SRRendererRule = void 0; +var SRRendererRule = /** @class */ (function () { + function SRRendererRule(ruleDefinition) { + this.ruleDefinition = ruleDefinition; + } + SRRendererRule.prototype.test = function (mode, cursor, oldCursor) { + if (this.ruleDefinition.modes.includes(mode) + && (this.ruleDefinition.roles.includes(cursor.getRole()) + || this.ruleDefinition.elems.includes(cursor.getNode().nodeName.toUpperCase()))) { + for (var _i = 0, _a = this.ruleDefinition.tests; _i < _a.length; _i++) { + var test_1 = _a[_i]; + var s = test_1(cursor, oldCursor, mode); + if (typeof s === "string") + return s; + } + } + return null; + }; + return SRRendererRule; +}()); +exports.SRRendererRule = SRRendererRule; + + +/***/ }, + +/***/ "./src/v4/simulator/SRTableUtil.ts" +/*!*****************************************!*\ + !*** ./src/v4/simulator/SRTableUtil.ts ***! + \*****************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SRTableUtil = void 0; +var SRCursor_1 = __webpack_require__(/*! ./SRCursor */ "./src/v4/simulator/SRCursor.ts"); +/** + * TableUtil namespace provides utility functions for handling HTML tables in the accessibility simulator. + * These functions help determine cell positions, relationships, and extract header information + * to simulate how screen readers would announce table navigation. + */ +var SRTableUtil; +(function (SRTableUtil) { + /** + * Determines if the cursor is pointing to a cell element (TD or TH) + * or has a cell-related ARIA role + * @param cursor - The SRCursor to check + * @returns true if the cursor is on a cell, false otherwise + */ + function isCursorCellRole(cursor) { + if (!cursor.getElement()) + return false; + if (["cell", "rowheader", "columnheader"].includes(cursor.getRole())) { + return true; + } + return !cursor.getElement().hasAttribute("role") && ["TH", "TD"].includes(cursor.getElement().nodeName.toUpperCase()); + } + SRTableUtil.isCursorCellRole = isCursorCellRole; + /** + * Gets a cursor pointing to the current cell or the parent cell if the cursor + * is inside a cell's content + * @param cursor - The SRCursor to check + * @returns A new SRCursor pointing to the cell or null if not in a cell + */ + function getCurrentOrParentCellCursor(cursor) { + return cursor.getCurrentOrParentByRoleClone(["cell", "rowheader", "columnheader"], ["TD", "TH"]); + } + SRTableUtil.getCurrentOrParentCellCursor = getCurrentOrParentCellCursor; + /** + * Get the colspan of a cell at a given location + * @param cursor The cursor to get the colspan from + * @returns The colspan of the cell at the cursor's location or 0 if not in a column + */ + function getColSpan(cursor) { + if (!isCursorCellRole(cursor)) + return 0; + var colSpan = cursor.getElement().getAttribute("colspan"); + if (colSpan) { + return parseInt(colSpan); + } + return 1; + } + SRTableUtil.getColSpan = getColSpan; + /** + * Get the rowspan of a cell at a given location + * @param cursor The cursor to get the rowspan from + * @returns The rowspan of the cell at the cursor's location or 0 if not in a column + */ + function getRowSpan(cursor) { + if (!isCursorCellRole(cursor)) + return 0; + var rowSpan = cursor.getElement().getAttribute("rowspan"); + if (rowSpan) { + return parseInt(rowSpan); + } + return 1; + } + SRTableUtil.getRowSpan = getRowSpan; + /** + * Builds a complete model of a table's structure, accounting for rowspan and colspan + * + * This function traverses the entire table and creates a data structure that represents + * the logical grid of cells, properly handling cells that span multiple rows or columns. + * The resulting model makes it easier to determine cell relationships and positions. + * + * @param inTableCursor - A cursor within the table + * @returns A TableModel representing the complete table structure, or null if not in a table + */ + function getTableModel(inTableCursor) { + // Get a cursor pointing to the table element + var tableCursor = inTableCursor.getCurrentOrParentByRoleClone(["table"]); + if (!tableCursor) + return null; + var walkTableCursor = tableCursor.clone(); + var retVal = []; // The complete table model we're building + var curRow = []; // The current row being processed + var prevRow; // The previous row (needed for rowspan handling) + // Walk through the table's DOM structure + while (walkTableCursor.next(function () { return true; }) && !walkTableCursor.getNode().isSameNode(tableCursor.getNode())) { + if (walkTableCursor.isEndTag() && walkTableCursor.getRole() === "row") { + // Reached the end of the row, push what we have and reset + retVal.push(curRow); + prevRow = curRow; + curRow = []; + // Handle cells with rowspan from previous rows that affect this row + // This ensures cells spanning multiple rows are properly represented in the model + while (prevRow && curRow.length < prevRow.length && + ((prevRow[curRow.length].rowIndexStart + prevRow[curRow.length].rowspan - 1) >= retVal.length)) { + curRow.push(prevRow[curRow.length]); + } + } + // Process each cell in the row + if (!walkTableCursor.isEndTag() && isCursorCellRole(walkTableCursor)) { + var colspan = getColSpan(walkTableCursor); + // Create a cell model with position and spanning information + var cellInfo = { + rowIndexStart: retVal.length, + colIndexStart: curRow.length, + rowspan: getRowSpan(walkTableCursor), + colspan: colspan, + cellCursor: walkTableCursor.clone() + }; + // For cells with colspan, add the same cell info to multiple columns + for (var idx = 0; idx < colspan; ++idx) { + curRow.push(cellInfo); + } + // Continue handling cells with rowspan from previous rows + while (prevRow && curRow.length < prevRow.length && + ((prevRow[curRow.length].rowIndexStart + prevRow[curRow.length].rowspan - 1) >= retVal.length)) { + curRow.push(prevRow[curRow.length]); + } + } + } + return retVal; + } + SRTableUtil.getTableModel = getTableModel; + /** + * Gets the cell model for a specific cell in the table + * + * This function finds the CellModel object that represents a specific cell, + * which contains information about its position and spanning. + * + * @param inCellCursor - A cursor pointing to a cell or its contents + * @param tableModel - Optional pre-built table model (will be created if not provided) + * @returns The CellModel for the specified cell, or null if not found + */ + function getCellModel(inCellCursor, tableModel) { + var cellCursor = getCurrentOrParentCellCursor(inCellCursor); + if (!tableModel) { + tableModel = getTableModel(inCellCursor); + } + // Search through the table model to find the matching cell + for (var rowIndex = 0; rowIndex < tableModel.length; ++rowIndex) { + for (var colIndex = 0; colIndex < tableModel[rowIndex].length; ++colIndex) { + if (tableModel[rowIndex][colIndex].cellCursor.isSameNode(cellCursor)) { + return tableModel[rowIndex][colIndex]; + } + } + } + return null; + } + SRTableUtil.getCellModel = getCellModel; + /** + * Checks if a cell spans a specific column + * + * @param cellModel - The cell model to check + * @param colIdx - The column index to check + * @returns True if the cell contains the specified column + */ + function cellModelContainsColumn(cellModel, colIdx) { + return colIdx >= cellModel.colIndexStart && colIdx < cellModel.colIndexStart + cellModel.colspan; + } + SRTableUtil.cellModelContainsColumn = cellModelContainsColumn; + /** + * Checks if a cell spans a specific row + * + * @param cellModel - The cell model to check + * @param rowIdx - The row index to check + * @returns True if the cell contains the specified row + */ + function cellModelContainsRow(cellModel, rowIdx) { + return rowIdx >= cellModel.rowIndexStart && rowIdx < cellModel.rowIndexStart + cellModel.rowspan; + } + SRTableUtil.cellModelContainsRow = cellModelContainsRow; + /** + * Gets the row headers associated with a cell + * First checks for explicit headers attribute, then looks for row headers in the same row + * @param cursor - The SRCursor pointing to a cell + * @returns A string containing the concatenated header names + */ + function getRowHeaders(cursor) { + return ""; + } + SRTableUtil.getRowHeaders = getRowHeaders; + /** + * Gets the column headers associated with a cell + * First checks for explicit headers attribute, then looks for column headers in the same column + * @param cursor - The SRCursor pointing to a cell + * @returns A string containing the concatenated header names + */ + function getColumnHeadersForCursor(inCellCursor, tableModel) { + if (!tableModel) { + tableModel = getTableModel(inCellCursor); + if (!tableModel) + return ""; + } + var cellModel = getCellModel(inCellCursor, tableModel); + if (!cellModel) + return ""; + var cellCursor = cellModel.cellCursor; + if (!cellCursor) + return ""; + var cellElem = cellCursor.getElement(); + if (!cellElem) + return ""; + var colDatas = []; + for (var colIdx = cellModel.colIndexStart; colIdx < cellModel.colIndexStart + cellModel.colspan; ++colIdx) { + colDatas.push({ + potentialColHeaders: [], + existsDataCell: false, + colIdx: colIdx + }); + } + var potentialHeaders = []; + if (cellElem.hasAttribute("headers")) { + potentialHeaders = cellElem.getAttribute("headers") + // Split the header attribute into ids + .split(" ") + // Get the node for each id + .map(function (id) { return document.getElementById(id); }) + // Get rid of bad mappings + .filter(function (node) { return !!node; }) + // Convert to SRCursors to that we can get accessible names + .map(function (node) { return new SRCursor_1.SRCursor(node); }) + // Remove headers that aren't in the same column (ignore column headers) + .filter(function (cursor) { return colDatas.some(function (colData) { return cellModelContainsColumn(SRTableUtil.getCellModel(cursor, tableModel), colData.colIdx); }); }); + } + else { + // Get all cells in this column + // Note - if everything in this column is empty or a header cell, this is probably not a heading + for (var rowIdx = 0; rowIdx < tableModel.length; ++rowIdx) { + var _loop_1 = function (colData) { + var colIdx = colData.colIdx; + var checkInfo = tableModel[rowIdx][colIdx]; + var checkCursor = checkInfo.cellCursor; + var checkCursorElem = checkCursor.getElement(); + // If this row/col isn't found, or is the same cursor as our original cell model, or already in our list, skip, but check if it's a data cell + if (!checkInfo || !checkCursor || checkCursor.isSameNode(cellCursor) || potentialHeaders.some(function (c) { return checkCursor.isSameNode(c); })) { + colData.existsDataCell = colData.existsDataCell || (isDataCell(checkCursor) && (checkCursor.hasNonEmptyName() || colData.potentialColHeaders.length > 0)); + return "continue"; + } + var c = checkCursor.clone(); + if (checkCursor.getRole() === "columnheader") { + potentialHeaders.push(c); + colData.potentialColHeaders.push(c); + } + else if (!checkCursorElem.hasAttribute("role") && checkCursorElem.nodeName.toUpperCase() === "TH") { + if (checkCursorElem.getAttribute("scope") === "col" || checkCursorElem.getAttribute("scope") === "axis") { + potentialHeaders.push(c); + colData.potentialColHeaders.push(c); + } + else if (!checkCursorElem.hasAttribute("scope") && checkCursor.hasNonEmptyName()) { + potentialHeaders.push(c); + colData.potentialColHeaders.push(c); + } + } + else { + colData.existsDataCell = colData.existsDataCell || (isDataCell(checkCursor) && (checkCursor.hasNonEmptyName() || colData.potentialColHeaders.length > 0)); + } + }; + for (var _i = 0, colDatas_1 = colDatas; _i < colDatas_1.length; _i++) { + var colData = colDatas_1[_i]; + _loop_1(colData); + } + } + for (var _a = 0, colDatas_2 = colDatas; _a < colDatas_2.length; _a++) { + var colData = colDatas_2[_a]; + if (!colData.existsDataCell) { + colData.potentialColHeaders = []; + } + } + potentialHeaders = potentialHeaders.filter(function (one) { return colDatas.some(function (colData) { return colData.potentialColHeaders.some(function (two) { return two.isSameNode(one); }); }); }); + } + return potentialHeaders + // And then return the names of the headers + .map(function (cursor) { var _a; return ((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) || ""; }) + .map(function (s) { return s.trim(); }) + .filter(function (s) { return s.length > 0; }) + .join(", "); + } + SRTableUtil.getColumnHeadersForCursor = getColumnHeadersForCursor; + /** + * Gets the row headers associated with a cell + * First checks for explicit headers attribute, then looks for row headers in the same row + * @param cursor - The SRCursor pointing to a cell + * @returns A string containing the concatenated header names + */ + function getRowHeadersForCursor(inCellCursor, tableModel) { + if (!tableModel) { + tableModel = getTableModel(inCellCursor); + if (!tableModel) + return ""; + } + var cellModel = getCellModel(inCellCursor, tableModel); + if (!cellModel) + return ""; + var cellCursor = cellModel.cellCursor; + if (!cellCursor) + return ""; + var cellElem = cellCursor.getElement(); + if (!cellElem) + return ""; + var rowDatas = []; + for (var rowIdx = cellModel.rowIndexStart; rowIdx < cellModel.rowIndexStart + cellModel.rowspan; ++rowIdx) { + rowDatas.push({ + potentialRowHeaders: [], + existsDataCell: false, + rowIdx: rowIdx + }); + } + var potentialHeaders = []; + if (cellElem.hasAttribute("headers")) { + potentialHeaders = cellElem.getAttribute("headers") + // Split the header attribute into ids + .split(" ") + // Get the node for each id + .map(function (id) { return document.getElementById(id); }) + // Get rid of bad mappings + .filter(function (node) { return !!node; }) + // Convert to SRCursors to that we can get accessible names + .map(function (node) { return new SRCursor_1.SRCursor(node); }) + // Remove headers that aren't in the same row (ignore column headers) + .filter(function (cursor) { return rowDatas.some(function (rowData) { return cellModelContainsRow(SRTableUtil.getCellModel(cursor, tableModel), rowData.rowIdx); }); }); + } + else { + // Get all cells in the rows + // Note - if everything in the row is empty or a header cell, this is probably not a heading + var longestRow = rowDatas.reduce(function (prev, cur) { return Math.max(prev, tableModel[cur.rowIdx].length); }, 0); + for (var colIdx = 0; colIdx < longestRow; ++colIdx) { + var _loop_2 = function (rowData) { + var rowIdx = rowData.rowIdx; + if (colIdx >= tableModel[rowIdx].length) + return "continue"; + var checkInfo = tableModel[rowIdx][colIdx]; + var checkCursor = checkInfo.cellCursor; + var checkCursorElem = checkCursor.getElement(); + // If this row/col isn't found, or is the same cursor as our original cell model, or already in our list, skip, but check if it's a data cell + if (!checkInfo || !checkCursor || checkCursor.isSameNode(cellCursor) || potentialHeaders.some(function (c) { return checkCursor.isSameNode(c); })) { + rowData.existsDataCell = rowData.existsDataCell || (isDataCell(checkCursor) && (checkCursor.hasNonEmptyName() || rowData.potentialRowHeaders.length > 0)); + return "continue"; + } + var c = checkCursor.clone(); + if (checkCursor.getRole() === "rowheader") { + potentialHeaders.push(c); + rowData.potentialRowHeaders.push(c); + } + else if (!checkCursorElem.hasAttribute("role") && checkCursorElem.nodeName.toUpperCase() === "TH") { + if (checkCursorElem.getAttribute("scope") === "row" || checkCursorElem.getAttribute("scope") === "axis") { + potentialHeaders.push(c); + rowData.potentialRowHeaders.push(c); + } + else if (!checkCursorElem.hasAttribute("scope") && checkCursor.hasNonEmptyName()) { + potentialHeaders.push(c); + rowData.potentialRowHeaders.push(c); + } + } + else { + rowData.existsDataCell = rowData.existsDataCell || (isDataCell(checkCursor) && (checkCursor.hasNonEmptyName() || rowData.potentialRowHeaders.length > 0)); + } + }; + for (var _i = 0, rowDatas_1 = rowDatas; _i < rowDatas_1.length; _i++) { + var rowData = rowDatas_1[_i]; + _loop_2(rowData); + } + } + for (var _a = 0, rowDatas_2 = rowDatas; _a < rowDatas_2.length; _a++) { + var rowData = rowDatas_2[_a]; + if (!rowData.existsDataCell) { + rowData.potentialRowHeaders = []; + } + } + potentialHeaders = potentialHeaders.filter(function (one) { return rowDatas.some(function (rowData) { return rowData.potentialRowHeaders.some(function (two) { return two.isSameNode(one); }); }); }); + } + return potentialHeaders + // And then return the names of the headers + .map(function (cursor) { var _a; return ((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) || ""; }) + .map(function (s) { return s.trim(); }) + .filter(function (s) { return s.length > 0; }) + .join(", "); + } + SRTableUtil.getRowHeadersForCursor = getRowHeadersForCursor; + /** + * Determines if a cell is a data cell (not a header cell) + * + * A data cell is one with either: + * - An explicit ARIA role of "cell" + * - A TD element without an overriding role attribute + * + * @param checkCursor - The cursor to check + * @returns True if the cursor points to a data cell + */ + function isDataCell(checkCursor) { + var checkCursorElem = checkCursor.getElement(); + if (!checkCursorElem) + return false; + return checkCursor.getRole() === "cell" || (!checkCursorElem.hasAttribute("role") && checkCursorElem.nodeName.toUpperCase() === "TD"); + } + SRTableUtil.isDataCell = isDataCell; +})(SRTableUtil = exports.SRTableUtil || (exports.SRTableUtil = {})); + + +/***/ }, + +/***/ "./src/v4/simulator/SRUtil.ts" +/*!************************************!*\ + !*** ./src/v4/simulator/SRUtil.ts ***! + \************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SRUtil = void 0; +var AriaUtil_1 = __webpack_require__(/*! ../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +var SRUtil; +(function (SRUtil) { + function isModalDialogElement(node) { + if (node.nodeType !== 1) + return false; + var elem = node; + var role = AriaUtil_1.AriaUtil.getResolvedRole(elem, true); + return role === "dialog" && elem.getAttribute("aria-modal") === "true" && VisUtil_1.VisUtil.isNodeVisible(node); + } + SRUtil.isModalDialogElement = isModalDialogElement; + /** + * Generates a unique CSS selector for a specific HTML element + * The selector is built using a combination of: + * 1. Element tag name + * 2. ID (if available) + * 3. Classes (if available) + * 4. Attributes (if needed) + * 5. nth-child selectors for position in parent + * + * @param element The HTML element to generate a selector for + * @param optimized If true, creates a shorter but possibly less robust selector + * @return A CSS selector string that uniquely identifies the element + */ + function getUniqueSelector(element, optimized) { + if (optimized === void 0) { optimized = false; } + // If the element has an ID, that's the most direct way to select it + if (element.id) { + return "#".concat(CSS.escape(element.id)); + } + // If we're at the root or document element, return the tag name + if (element.isSameNode(document.documentElement) || element.isSameNode(document.body)) { + return element.tagName.toLowerCase(); + } + // Start building the selector with the tag name + var selector = element.tagName.toLowerCase(); + // Add classes if available and we're not optimizing for brevity + if (element.classList.length && !optimized) { + // Take up to 3 classes to avoid overly specific selectors + var classes = Array.from(element.classList).slice(0, 3); + selector += classes.map(function (cls) { return ".".concat(CSS.escape(cls)); }).join(''); + } + // Add distinguishing attributes if needed and not optimizing + if (!optimized) { + // Consider adding role, aria-label, or other distinctive attributes + if (element.hasAttribute('role')) { + selector += "[role=\"".concat(CSS.escape(element.getAttribute('role') || ''), "\"]"); + } + if (element.hasAttribute('aria-label')) { + var label = element.getAttribute('aria-label') || ''; + if (label.length <= 20) { // Avoid overly long selectors + selector += "[aria-label=\"".concat(CSS.escape(label), "\"]"); + } + } + // For inputs, add type attribute + if (element.tagName.toLowerCase() === 'input' && element.hasAttribute('type')) { + selector += "[type=\"".concat(CSS.escape(element.getAttribute('type') || ''), "\"]"); + } + } + // If we have a parent node, determine position among siblings + if (element.parentElement) { + // Find all siblings with the same tag + var siblings = Array.from(element.parentElement.children) + .filter(function (child) { return child.tagName === element.tagName; }); + // If there's more than one sibling with the same tag, add nth-child + if (siblings.length > 1) { + var index = siblings.indexOf(element) + 1; + selector += ":nth-of-type(".concat(index, ")"); + } + // If we're not at the root, recursively build the parent selector + // but use optimized selectors for ancestors to keep the overall selector manageable + return "".concat(getUniqueSelector(element.parentElement, true), " > ").concat(selector); + } + return selector; + } + SRUtil.getUniqueSelector = getUniqueSelector; +})(SRUtil = exports.SRUtil || (exports.SRUtil = {})); + + +/***/ }, + +/***/ "./src/v4/simulator/SRViewer.ts" +/*!**************************************!*\ + !*** ./src/v4/simulator/SRViewer.ts ***! + \**************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SRViewer = exports.SROverlay = void 0; +var SRController_1 = __webpack_require__(/*! ./SRController */ "./src/v4/simulator/SRController.ts"); +/** + * SROverlay class for creating a UI widget to control screen reader simulation + * Provides buttons for navigation and displays results + */ +var SROverlay = /** @class */ (function () { + /** + * Creates a new SROverlay + * @param controller The SRController instance to use for navigation + */ + function SROverlay(srViewer) { + this.srViewer = srViewer; + /** Navigation modes available in the UI */ + this.navigationModes = [ + { mode: "item", label: "Item" }, + { mode: "tab_focus", label: "Tabbable" }, + { mode: "heading", label: "Heading" }, + { mode: "region", label: "Region" } + ]; + this.createOverlay(); + } + SROverlay.prototype.createDOMElement = function (elemName, attrs, styles) { + var retVal = this.srViewer.viewerDoc.createElement(elemName); + if (attrs) { + for (var key in attrs) { + retVal[key] = attrs[key]; + } + } + if (styles) { + for (var key in styles) { + retVal.style[key] = styles[key]; + } + } + return retVal; + }; + /** + * Creates the overlay UI elements and adds them to the DOM + */ + SROverlay.prototype.createOverlay = function () { + var _this = this; + // Create main container + this.container = this.createDOMElement("div", { + className: "ibma-sr-overlay" + }, { + position: 'fixed', + bottom: '0', + left: '0', + width: '100%', + backgroundColor: 'rgba(0, 0, 0, 0.8)', + color: 'white', + padding: '10px', + zIndex: '10000', + display: 'flex', + flexDirection: 'column', + gap: '10px' + }); + // Create controls container + var controlsContainer = this.createDOMElement("div", {}, { + display: "flex", flexWrap: "wrap", gap: "10px" + }); + // Create navigation mode groups + this.navigationModes.forEach(function (navMode) { + var modeGroup = _this.createDOMElement('div', {}, { + display: "flex", + alignItems: 'center', + gap: '5px', + margin: '0 10px' + }); + modeGroup.appendChild(_this.createDOMElement('span', { + textContent: navMode.label + ":" + }, {})); + // Previous button + var prevButton = _this.createDOMElement('button', { + textContent: '◀ Prev' + }, { + padding: '5px 10px', + backgroundColor: '#444', + color: 'white', + border: 'none', + borderRadius: '3px', + cursor: 'pointer' + }); + prevButton.addEventListener('click', function () { return _this.srViewer.navigatePrevious(navMode.mode); }); + modeGroup.appendChild(prevButton); + // Next button + var nextButton = _this.createDOMElement('button', { + textContent: 'Next ▶' + }, { + padding: '5px 10px', + backgroundColor: '#444', + color: 'white', + border: 'none', + borderRadius: '3px', + cursor: 'pointer' + }); + nextButton.addEventListener('click', function () { return _this.srViewer.navigateNext(navMode.mode); }); + modeGroup.appendChild(nextButton); + controlsContainer.appendChild(modeGroup); + }); + var otherButtonGroup = this.createDOMElement('div', {}, { + display: "flex", + alignItems: 'center', + gap: '5px', + margin: '0 10px' + }); + // Show all button + var showAllButton = this.createDOMElement('button', { + textContent: 'Show all' + }, { + padding: '5px 10px', + backgroundColor: '#444', + color: 'white', + border: 'none', + borderRadius: '3px', + cursor: 'pointer' + }); + showAllButton.addEventListener('click', function () { return _this.srViewer.showAll(true); }); + otherButtonGroup.appendChild(showAllButton); + // Toggle Speech Button + var toggleSpeech = this.createDOMElement('button', { + textContent: 'Toggle speech' + }, { + padding: '5px 10px', + backgroundColor: '#444', + color: 'white', + border: 'none', + borderRadius: '3px', + cursor: 'pointer' + }); + toggleSpeech.addEventListener('click', function () { return _this.srViewer.toggleSpeech(); }); + otherButtonGroup.appendChild(toggleSpeech); + controlsContainer.appendChild(otherButtonGroup); + // Create results display + this.resultsDisplay = this.createDOMElement('div', { + textContent: 'Screen reader simulation results will appear here.' + }, { + padding: '10px', + backgroundColor: 'rgba(255, 255, 255, 0.1)', + borderRadius: '3px', + minHeight: '100px', + maxHeight: '50vh', + fontFamily: 'monospace', + overflow: 'auto' + }); + // Add elements to container + this.container.appendChild(controlsContainer); + this.container.appendChild(this.resultsDisplay); + // Add to document + this.srViewer.viewerDoc.body.appendChild(this.container); + }; + /** + * Display the navigation result in the overlay + * @param result The navigation result + * @param mode The navigation mode used + * @param direction The navigation direction ('next', 'previous', or 'focus') + */ + SROverlay.prototype.displayResult = function (result, mode, direction) { + var _a, _b, _c, _d; + var displayText = ''; + if (result.success) { + // console.log("???", result); + displayText = "".concat(direction.toUpperCase(), " ").concat(mode, ": ").concat(result.renderingResult.message); + } + else { + displayText = "".concat(direction.toUpperCase(), " ").concat(mode, ": ").concat(result.renderingResult.message); + } + (_b = (_a = result.renderingResult.end) === null || _a === void 0 ? void 0 : _a.getElement()) === null || _b === void 0 ? void 0 : _b.scrollIntoView(); + (_d = (_c = result.renderingResult.start) === null || _c === void 0 ? void 0 : _c.getElement()) === null || _d === void 0 ? void 0 : _d.scrollIntoView(); + window.scrollBy(0, -200); + this.resultsDisplay.innerHTML = ""; + this.resultsDisplay.textContent = displayText; + var inspectButton = this.createDOMElement("button", { + innerText: "Debug" + }, {}); + inspectButton.addEventListener("click", function () { + var _a, _b; + console.log((_a = result.renderingResult.start) === null || _a === void 0 ? void 0 : _a.getNode(), (_b = result.renderingResult.end) === null || _b === void 0 ? void 0 : _b.getNode()); + }); + this.resultsDisplay.appendChild(inspectButton); + }; + SROverlay.prototype.displayAll = function (result) { + var _this = this; + var table = this.createDOMElement("table", {}, {}); + var headerRow = this.createDOMElement("tr", {}, {}); + var headingLabels = ["Region", "Heading", "Item", "Tabbable"]; + var headingFields = ["region", "heading", "item", "tab_focus"]; + for (var _i = 0, headingLabels_1 = headingLabels; _i < headingLabels_1.length; _i++) { + var headingLabel = headingLabels_1[_i]; + headerRow.appendChild(this.createDOMElement("th", { + scope: "col", + innerText: headingLabel + }, { + textAlign: "left", + padding: ".25rem", + margin: "0rem", + color: "white" + })); + table.appendChild(headerRow); + } + var _loop_1 = function (line) { + var dataRow = this_1.createDOMElement("tr", {}, {}); + headingFields.forEach(function (field) { + dataRow.appendChild(_this.createDOMElement("td", { + innerText: line[field] + }, { + verticalAlign: "top", + border: "solid white 1px", + padding: ".25rem", + margin: "0rem", + color: "white" + })); + }); + table.appendChild(dataRow); + }; + var this_1 = this; + for (var _a = 0, result_1 = result; _a < result_1.length; _a++) { + var line = result_1[_a]; + _loop_1(line); + } + this.resultsDisplay.innerHTML = ""; + this.resultsDisplay.appendChild(table); + }; + /** + * Remove the overlay from the DOM + */ + SROverlay.prototype.destroy = function () { + if (this.container && this.container.parentNode) { + this.container.parentNode.removeChild(this.container); + } + }; + return SROverlay; +}()); +exports.SROverlay = SROverlay; +/** + * SRViewer class for managing screen reader simulation with UI controls + */ +var SRViewer = /** @class */ (function () { + /** + * Creates a new SRViewer + * @param rootElement The root element to start from (defaults to document.body) + */ + function SRViewer(rootElement) { + if (rootElement === void 0) { rootElement = document.body; } + /** Flag to track if speech is active */ + this.isStreaming = false; + /** Flag to set if showing all */ + this.isShowingAll = false; + /** Flag to set if it should be speaking */ + this.speechEnabled = false; + this.viewerDoc = rootElement.ownerDocument; + // Create controller for the document body + this.controller = SRController_1.SRController.getController(this.viewerDoc); + // Create overlay UI + this.overlay = new SROverlay(this); + // Set up keyboard handlers + this.setupKeyboardHandlers(); + // Set up focus tracking + this.setupFocusTracking(); + // Set up mutation tracking + this.setupMutationTracking(); + } + SRViewer.prototype.showAll = function (bEnableAllMode) { + if (bEnableAllMode) { + this.isShowingAll = true; + } + var result = SRController_1.SRController.renderStructure(this.viewerDoc); + this.overlay.displayAll(result); + }; + SRViewer.prototype.toggleSpeech = function () { + this.speechEnabled = !this.speechEnabled; + }; + /** + * Navigate to the next element using the specified mode + * @param mode The navigation mode to use + */ + SRViewer.prototype.navigateNext = function (mode) { + this.isShowingAll = false; + var result = this.controller.jumpNext(mode); + this.overlay.displayResult(result, mode, 'next'); + this.speakResult(result); + }; + /** + * Navigate to the previous element using the specified mode + * @param mode The navigation mode to use + */ + SRViewer.prototype.navigatePrevious = function (mode) { + this.isShowingAll = false; + var result = this.controller.jumpPrevious(mode); + this.overlay.displayResult(result, mode, 'previous'); + this.speakResult(result); + }; + /** + * Set up keyboard event handlers for screen reader navigation + */ + SRViewer.prototype.setupKeyboardHandlers = function () { + var _this = this; + this.keyboardHandler = function (e) { + // Don't capture keyboard events when focus is in form controls + var target = e.target; + if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.tagName === 'SELECT') { + return; + } + // Handle keyboard shortcuts + if (e.ctrlKey) { + // Ctrl key stops speech + _this.stopSpeech(); + return; + } + if (e.altKey || e.metaKey) + return; + // console.log(e.key); + switch (e.key) { + case 'ArrowUp': + e.preventDefault(); + _this.navigatePrevious('item'); + break; + case ' ': + _this.isStreaming = true; + case 'ArrowDown': + e.preventDefault(); + _this.navigateNext('item'); + break; + case 'Enter': + e.preventDefault(); + _this.activateCurrentElement(); + _this.controller.setPointOfRegard(_this.viewerDoc.activeElement); + break; + case 'H': + case 'h': + if (e.shiftKey) { + e.preventDefault(); + _this.navigatePrevious('heading'); + } + else { + e.preventDefault(); + _this.navigateNext('heading'); + } + break; + case 'R': + case 'r': + if (e.shiftKey) { + e.preventDefault(); + _this.navigatePrevious('region'); + } + else { + e.preventDefault(); + _this.navigateNext('region'); + } + break; + case 'Tab': + if (e.shiftKey) { + e.preventDefault(); + _this.navigatePrevious('tab_focus'); + } + else { + e.preventDefault(); + _this.navigateNext('tab_focus'); + } + break; + } + }; + // Add the event listener + this.viewerDoc.addEventListener('keydown', this.keyboardHandler); + }; + SRViewer.prototype.speakResult = function (result) { + var _this = this; + if (!this.speechEnabled) + return; + var utterance = new SpeechSynthesisUtterance(result.renderingResult.message); + utterance.rate = 1.5; + var myThis = this; + utterance.addEventListener("end", function (event) { + if (myThis.isStreaming) { + _this.navigateNext('item'); + } + }); + speechSynthesis.cancel(); + speechSynthesis.speak(utterance); + }; + /** + * Stop speech output + */ + SRViewer.prototype.stopSpeech = function () { + this.isStreaming = false; + // Cancel any active speech synthesis + speechSynthesis.cancel(); + }; + /** + * Set up mutation tracking + */ + SRViewer.prototype.setupMutationTracking = function () { + var _this = this; + var observer = new MutationObserver(function (mutations) { + // console.log(this.isShowingAll, mutations.length); + if (_this.isShowingAll) { + var outsideOverlay = mutations.filter(function (mutation) { return mutation.target.nodeType === 1 + && !mutation.target.closest(".ibma-sr-overlay"); }); + if (outsideOverlay.length > 0) { + // console.log("Mutations",outsideOverlay); + observer.disconnect(); + var myThis_1 = _this; + myThis_1.showAll(); + setTimeout(function () { + myThis_1.showAll(); + observer.observe(_this.viewerDoc.documentElement, { + attributes: true, + childList: true, + subtree: true + }); + }, 1000); + } + } + }); + observer.observe(this.viewerDoc.documentElement, { + attributes: true, + childList: true, + subtree: true + }); + }; + /** + * Set up focus tracking to update the point of regard when focus changes + */ + SRViewer.prototype.setupFocusTracking = function () { + var _this = this; + this.focusHandler = function (e) { + // Skip if the focus is on the overlay itself + if (e.target instanceof HTMLElement) { + var target = e.target; + if (_this.overlay && target.closest('.ibma-sr-overlay')) { + return; + } + console.group("focusHandler"); + // Update the point of regard to the newly focused element + var result = _this.controller.setPointOfRegard(target); + // Announce the focus change + if (result.success) { + _this.overlay.displayResult(result, 'focus', 'focus'); + _this.speakResult(result); + } + console.groupEnd(); + } + }; + // Add the focus event listener to the document + this.viewerDoc.addEventListener('focusin', this.focusHandler); + }; + /** + * Activate (click) the element at the current point of regard + */ + SRViewer.prototype.activateCurrentElement = function () { + var currentElement = this.controller.getPointOfRegard().getElement(); + if (currentElement) { + // Announce that we're activating the element + var result = { + success: true, + renderingResult: { + message: "Activating: ".concat(currentElement.textContent || currentElement.nodeName), + start: this.controller.getPointOfRegard(), + end: this.controller.getPointOfRegard() + } + }; + this.overlay.displayResult(result, 'focus', 'focus'); + this.speakResult(result); + // Focus the element first + if (currentElement.focus) { + currentElement.focus(); + } + // Simulate a click on the element + currentElement.click(); + } + }; + /** + * Get the controller instance + * @returns The SRController instance + */ + SRViewer.prototype.getController = function () { + return this.controller; + }; + /** + * Destroy the viewer and clean up resources + */ + SRViewer.prototype.destroy = function () { + // Remove event listeners + this.viewerDoc.removeEventListener('keydown', this.keyboardHandler); + this.viewerDoc.removeEventListener('focusin', this.focusHandler); + // Stop any active speech + this.stopSpeech(); + // Destroy overlay + this.overlay.destroy(); + }; + return SRViewer; +}()); +exports.SRViewer = SRViewer; + + +/***/ }, + +/***/ "./src/v4/simulator/render_rules/common.ts" +/*!*************************************************!*\ + !*** ./src/v4/simulator/render_rules/common.ts ***! + \*************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.RULES = exports.getLinkAnnouncement = exports.getRoleDescription = exports.quoteName = exports.quoteNamePadBefore = exports.quoteNamePadAfter = void 0; +var SRCursor_1 = __webpack_require__(/*! ../SRCursor */ "./src/v4/simulator/SRCursor.ts"); +var SRRendererRule_1 = __webpack_require__(/*! ../SRRendererRule */ "./src/v4/simulator/SRRendererRule.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var VisUtil_1 = __webpack_require__(/*! ../../util/VisUtil */ "./src/v4/util/VisUtil.ts"); +/** + * Provide the name, surrounded by the quoteCharBefore and quoteCharAfter and followed by the padding if the name exists + * @param cursor The cursor for which to fetch the name + * @param padding String to add after, if the name exists + * @param quoteCharBefore The string to use as the leading quote, if the name exists + * @param quoteCharBefore The string to use as the trailing quote, if the name exists + * @returns + */ +function quoteNamePadAfter(cursor, padding, quoteCharBefore, quoteCharAfter) { + return cursor.getName() + ? "".concat(quoteName(cursor)).concat(padding || ", ") + : ""; +} +exports.quoteNamePadAfter = quoteNamePadAfter; +/** + * Provide the name, surrounded by quotes and preceded by the padding if the name exists + * @param cursor The cursor for which to fetch the name + * @param padding String to add before, if the name exists (defaults to ", ") + * @returns The quoted name with leading padding, or empty string if no name exists + */ +function quoteNamePadBefore(cursor, padding) { + return cursor.getName() + ? "".concat(padding || ", ").concat(quoteName(cursor)) + : ""; +} +exports.quoteNamePadBefore = quoteNamePadBefore; +/** + * Provide the name surrounded by quote characters + * @param cursor The cursor for which to fetch the name + * @param quoteCharBefore The string to use as the leading quote (defaults to ") + * @param quoteCharAfter The string to use as the trailing quote (defaults to ") + * @returns The quoted name, or empty string if no name exists + */ +function quoteName(cursor, quoteCharBefore, quoteCharAfter) { + return cursor.getName() + ? "".concat(quoteCharBefore || '"').concat(cursor.getName()).concat(quoteCharAfter || '"') + : ""; +} +exports.quoteName = quoteName; +/** + * Get the role description for an element, using aria-roledescription if present + * Falls back to the provided default role name if aria-roledescription is not specified or empty + * @param cursor The cursor positioned at the element + * @param defaultRole The default role name to use if aria-roledescription is not present + * @returns The role description (either custom or default) + */ +function getRoleDescription(cursor, defaultRole) { + var elem = cursor.getElement(); + if (!elem) + return defaultRole; + var roleDescription = elem.getAttribute("aria-roledescription"); + if (roleDescription && roleDescription.trim().length > 0) { + return roleDescription.trim(); + } + return defaultRole; +} +exports.getRoleDescription = getRoleDescription; +/** + * Generate the screen reader announcement for a link element + * Distinguishes between same-page links (anchors) and regular links + * @param cursor The cursor positioned at the link element + * @param mode The navigation mode (affects announcement order) + * @returns The formatted link announcement string + */ +function getLinkAnnouncement(cursor, mode) { + var href = (cursor.getNode().href) || ""; + var announceStr = ""; + if (href.startsWith(document.location.href) && href.charAt(document.location.href.length) === "#") { + announceStr = "same page link"; + } + else { + announceStr = "link"; + } + var nameInfo = cursor.getNameInfo(); + if (nameInfo && !["content", "text"].includes(nameInfo.nameFrom)) { + if (mode === "tab_focus") { + return "[".concat(quoteNamePadAfter(cursor)).concat(announceStr, "]"); + } + else { + return "[".concat(announceStr).concat(quoteNamePadBefore(cursor), "]"); + } + } + return "[".concat(announceStr, "]"); +} +exports.getLinkAnnouncement = getLinkAnnouncement; +/** + * Get the description text from aria-describedby references + * Resolves all IDs in aria-describedby and concatenates their text content + * @param elem The element with aria-describedby attribute + * @param mode The navigation mode (returns empty string in "item" mode) + * @returns The formatted description text with leading comma and quotes, or empty string + */ +function getDescribedByAnnouncements(elem, mode) { + var describedBy = elem.getAttribute("aria-describedby"); + if (!describedBy) + return ""; + var descriptionElems = describedBy + .split(/\s+/) + .map(function (id) { return document.getElementById(id); }) + .filter(function (descElem) { return !!descElem; }); + var descriptionText = descriptionElems + .map(function (descElem) { var _a; return (_a = descElem.textContent) === null || _a === void 0 ? void 0 : _a.trim(); }) + .filter(function (text) { return !!text; }) + .join(" "); + if (!descriptionText || descriptionText.length === 0) + return ""; + if (mode === "item") + return ", \u0001".concat(descriptionText, "\u0002"); + return ", \"".concat(descriptionText, "\""); +} +/** + * Get state announcements for disabled, readonly, required, and invalid attributes + * @param elem The element to check for state attributes + * @returns A string with state announcements (e.g., ", disabled", ", read only", ", required", ", invalid") + */ +function getStateAnnouncements(elem) { + var states = ""; + // Check for disabled state (both attribute and aria-disabled) + if (elem.hasAttribute("disabled") || elem.getAttribute("aria-disabled") === "true") { + states += ", disabled"; + } + // Check for readonly state (both attribute and aria-readonly) + if (elem.hasAttribute("readonly") || elem.getAttribute("aria-readonly") === "true") { + states += ", read only"; + } + // Check for required state (both attribute and aria-required) + if (elem.hasAttribute("required") || elem.getAttribute("aria-required") === "true") { + states += ", required"; + } + // Check for invalid state (aria-invalid) + if (elem.getAttribute("aria-invalid") === "true") { + states += ", invalid"; + } + return states; +} +/** + * Check if a listitem contains interactive/widget elements + * Screen readers typically don't read the accessible name of a listitem when it contains interactive elements + * Uses DOMWalker to properly traverse shadow DOM and other complex structures + */ +function listitemContainsInteractiveElement(cursor) { + var elem = cursor.getElement(); + if (!elem) + return false; + // Use DOMWalker to traverse the entire subtree including shadow DOM + var walker = new DOMWalker_1.DOMWalker(elem, false, elem, false); + // Walk through all descendants + while (walker.nextNode()) { + // Only check element nodes at start tags + if (walker.node.nodeType === 1 && !walker.bEndTag) { + var role = AriaUtil_1.AriaUtil.getResolvedRole(walker.node); + if (role && ARIADefinitions_1.ARIADefinitions.designPatterns[role] && ARIADefinitions_1.ARIADefinitions.designPatterns[role].roleType === 'widget') { + return true; + } + } + } + return false; +} +/** + * Check if an iframe's content can be accessed (not cross-origin) + * Attempts to access the iframe's document to determine if it's accessible + * @param iframe The iframe element to check + * @returns true if the iframe content is accessible, false if cross-origin or blocked + */ +function canAccessFrame(iframe) { + try { + // This throws a DOMException for cross-origin frames + var doc = iframe.contentDocument || iframe.contentWindow.document; + return doc !== null; + } + catch (e) { + return false; + // if (e instanceof DOMException && e.name === 'SecurityError') { + // return false; // Cross-origin, access blocked + // } + // throw e; // Re-throw unexpected errors + } +} +exports.RULES = [ + // Single role rules - alphabetically sorted + // Button role + new SRRendererRule_1.SRRendererRule({ + roles: ["button"], + elems: [], + modes: ["item", "button", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (!cursor.isStartTag()) + return null; + var elem = cursor.getNode(); + var roleDesc = getRoleDescription(cursor, "button"); + if (elem.getAttribute("aria-pressed") === "true") { + return "[toggle ".concat(roleDesc, ", pressed").concat(quoteNamePadBefore(cursor)).concat(getDescribedByAnnouncements(elem, mode), "]"); + } + return null; + }, + function (cursor, _oldCursor, mode) { + if (!cursor.isStartTag()) + return null; + var elem = cursor.getNode(); + var roleDesc = getRoleDescription(cursor, "button"); + if (elem.getAttribute("aria-pressed") === "false") { + return "[toggle ".concat(roleDesc, ", not pressed").concat(quoteNamePadBefore(cursor)).concat(getDescribedByAnnouncements(elem, mode), "]"); + } + return null; + }, + function (cursor, _oldCursor, mode) { + if (cursor.isEndTag()) + return undefined; + var expandStr = ""; + var elem = cursor.getElement(); + var roleDesc = getRoleDescription(cursor, "button"); + if (["menu", "true"].includes(elem.getAttribute("aria-haspopup"))) { + expandStr += ", menu"; + } + if (elem.hasAttribute("aria-expanded")) { + expandStr += ", ".concat(elem.getAttribute("aria-expanded") === "true" ? "expanded" : "collapsed"); + } + expandStr += getStateAnnouncements(elem); + return "[".concat(quoteNamePadAfter(cursor)).concat(roleDesc).concat(expandStr).concat(getDescribedByAnnouncements(elem, mode), "]"); + }, + function (cursor) { if (cursor.isEndTag()) + return ""; } + ] + }), + // Checkbox role + new SRRendererRule_1.SRRendererRule({ + roles: ["checkbox"], + elems: [], + modes: ["item", "checkbox", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (cursor.isStartTag()) { + var elem = cursor.getNode(); + var roleDesc = getRoleDescription(cursor, "checkbox"); + var stateStr = ""; + if (elem.getAttribute("aria-checked") === "mixed") { + stateStr = "half checked"; + } + else { + var bChecked = false; + if (elem.hasAttribute("aria-checked")) { + bChecked = elem.getAttribute("aria-checked") === "true"; + } + else { + bChecked = elem.checked; + } + stateStr = bChecked ? "checked" : "not checked"; + } + stateStr += getStateAnnouncements(cursor.getElement()); + return "[".concat(roleDesc, ", ").concat(stateStr).concat(quoteNamePadBefore(cursor)).concat(getDescribedByAnnouncements(cursor.getElement(), mode), "]"); + } + else { + return ""; + } + } + ] + }), + // Cell, Columnheader, and Rowheader roles + new SRRendererRule_1.SRRendererRule({ + roles: ["cell", "columnheader", "rowheader"], + elems: [], + modes: ["item", "table"], + tests: [ + function (cursor) { + var _a; + if (!cursor.isStartTag()) + return null; + // Get the cell element + var cellElem = cursor.getElement(); + if (!cellElem) + return null; + // Check if the cell has any visible content by checking: + // 1. Text content (trimmed) + // 2. Child elements with roles (buttons, links, etc.) + // 3. Images with alt text + var textContent = ((_a = cellElem.textContent) === null || _a === void 0 ? void 0 : _a.trim()) || ""; + // Check for child elements with interactive roles or content + var walker = new DOMWalker_1.DOMWalker(cellElem, false, cellElem, false); + var hasContent = textContent.length > 0; + if (!hasContent) { + // Check for elements that would have content (buttons, links, images, etc.) + while (walker.nextNode()) { + if (walker.node.nodeType === 1 && !walker.bEndTag) { + var elem = walker.node; + var role = AriaUtil_1.AriaUtil.getResolvedRole(elem); + // Check for interactive elements or elements with accessible names + if (role && ARIADefinitions_1.ARIADefinitions.designPatterns[role]) { + hasContent = true; + break; + } + // Check for images with alt text + if (elem.nodeName.toUpperCase() === "IMG" && elem.hasAttribute("alt")) { + hasContent = true; + break; + } + } + } + } + // If the cell is empty, return "[blank]" + if (!hasContent) { + return "[blank]"; + } + // Otherwise, return null to let default rendering continue + return null; + } + ] + }), + // Combobox role + new SRRendererRule_1.SRRendererRule({ + roles: ["combobox"], + elems: [], + modes: ["item", "combo", "tab_focus"], + tests: [ + function (cursor) { + if (cursor.isEndTag()) + return ""; + var roleDesc = getRoleDescription(cursor, "combo box"); + var elem = cursor.getElement(); + var state = ""; + if (cursor.getNode().nodeName.toUpperCase() === "SELECT") { + state = ", collapsed"; + var selectElem = cursor.getElement(); + var valueElem = selectElem.selectedIndex >= 0 ? selectElem.options[selectElem.selectedIndex] : null; + var valueStr = ""; + if (valueElem) { + var temp = new SRCursor_1.SRCursor(valueElem, false); + valueStr = quoteNamePadBefore(temp, ", "); + } + state += getStateAnnouncements(elem); + return "[".concat(quoteNamePadAfter(cursor)).concat(roleDesc).concat(state).concat(valueStr, "]"); + } + else if (cursor.getNode().nodeName.toUpperCase() === "INPUT" && !cursor.getElement().hasAttribute("role")) { + state = getStateAnnouncements(elem); + return "[".concat(quoteNamePadAfter(cursor)).concat(roleDesc, ", has auto complete, editable, opens list").concat(state, "]"); + } + else { + if (elem.hasAttribute("aria-expanded")) { + state = ", ".concat(elem.getAttribute("aria-expanded") === "true" ? "expanded" : "collapsed"); + if (elem.hasAttribute("aria-autocomplete")) { + state += ", has auto complete"; + } + state += ", editable, opens list"; + } + state += getStateAnnouncements(elem); + return "[".concat(quoteNamePadAfter(cursor)).concat(roleDesc).concat(state, "]"); + } + } + ] + }), + // Default role (fallback) + new SRRendererRule_1.SRRendererRule({ + roles: ["default"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var _a; + return cursor.isStartTag() ? + "!!<".concat(cursor.getRole(), ">").concat((((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) + ""), "!!") : + "!!</".concat(cursor.getRole(), ">!!"); + } + ] + }), + // Deletion role + new SRRendererRule_1.SRRendererRule({ + roles: ["deletion"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { return (cursor.isStartTag() && "[deleted]" || ""); } + ] + }), + // Dialog role + new SRRendererRule_1.SRRendererRule({ + roles: ["dialog"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + return cursor.isEndTag() ? "[End of dialog]" : "[Start of dialog".concat(quoteNamePadBefore(cursor)); + } + ] + }), + // Document role + new SRRendererRule_1.SRRendererRule({ + roles: ["document", "generic"], + elems: [], + modes: ["item"], + tests: [ + function () { return ""; } + ] + }), + // Graphics document role + new SRRendererRule_1.SRRendererRule({ + roles: ["graphics-document"], + elems: [], + modes: ["item", "image"], + tests: [ + function (cursor) { + var _a, _b; + if (cursor.isStartTag() && !((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) && ((_b = cursor.getNameInfo()) === null || _b === void 0 ? void 0 : _b.name) !== "") { + // Don't announce unlabeled graphics that are hidden inside links or headings + var parentHeadingOrLink = cursor.getCurrentOrParentByRoleClone(["heading", "link"]); + if (parentHeadingOrLink && VisUtil_1.VisUtil.isNodeHiddenFromAT(cursor.getElement())) { + return ""; + } + return "[Unlabeled graphic]"; + } + return null; + }, + function (cursor) { var _a; return (cursor.isStartTag() && (((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) === "")) ? "" : null; }, + function (cursor) { var _a; return (cursor.isStartTag() && ((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) && "[graphic".concat(quoteNamePadBefore(cursor), "]")) || null; }, + function (cursor) { return (cursor.isEndTag()) ? "" : null; } + ] + }), + // Heading role + new SRRendererRule_1.SRRendererRule({ + roles: ["heading"], + elems: [], + modes: ["item", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (mode === "tab_focus" && cursor.isStartTag()) + return ""; + if (mode === "item" && cursor.isEndTag()) + return ""; + var level; + var node = cursor.getElement(); + if (node.ariaLevel) { + // Explicit aria-level attribute + level = node.ariaLevel; + } + else if (node.getAttribute('role') === 'heading') { + // role="heading" without aria-level defaults to 2 + level = '2'; + } + else { + // Native heading element (h1-h6), extract number from tag name + level = node.nodeName.substring(1); + } + var nameInfo = cursor.getNameInfo(); + if ((!nameInfo || ["content", "text"].includes(nameInfo.nameFrom)) && !(node.textContent || "").trim()) { + return ""; + } + if (nameInfo && !["content", "text"].includes(nameInfo.nameFrom)) { + return "[heading level ".concat(level).concat(quoteNamePadBefore(cursor), "]"); + } + else { + return "[heading level ".concat(level, "]"); + } + } + ] + }), + // -- in heading mode + new SRRendererRule_1.SRRendererRule({ + roles: ["heading"], + elems: [], + modes: ["heading", "h1", "h2", "h3", "h4", "h5", "h6"], + tests: [ + function (cursor) { + if (cursor.isStartTag()) { + var node = cursor.getNode(); + var level = void 0; + if (node.ariaLevel) { + // Explicit aria-level attribute + level = node.ariaLevel; + } + else if (node.getAttribute('role') === 'heading') { + // role="heading" without aria-level defaults to 2 + level = '2'; + } + else { + // Native heading element (h1-h6), extract number from tag name + level = node.nodeName.substring(1); + } + var nameInfo = cursor.getNameInfo(); + if ((!nameInfo || ["content", "text"].includes(nameInfo.nameFrom)) && !(node.textContent || "").trim()) { + return ""; + } + return "[".concat(quoteNamePadAfter(cursor), "heading level ").concat(level, "]"); + } + return ""; + } + ] + }), + // Image role + new SRRendererRule_1.SRRendererRule({ + roles: ["img"], + elems: [], + modes: ["item", "image"], + tests: [ + function (cursor) { + var _a, _b, _c; + if (cursor.isEndTag()) { + return ""; + } + else { + if (!((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) && ((_b = cursor.getNameInfo()) === null || _b === void 0 ? void 0 : _b.name) !== "") { + // Don't announce unlabeled graphics that are hidden inside links or headings + // (these were only included because of the SKIP_ITEM_BEHAVIOR change) + var parentHeadingOrLink = cursor.getCurrentOrParentByRoleClone(["heading", "link"]); + if (parentHeadingOrLink && VisUtil_1.VisUtil.isNodeHiddenFromAT(cursor.getElement())) { + return ""; + } + return "[Unlabeled graphic]"; + } + else if (((_c = cursor.getNameInfo()) === null || _c === void 0 ? void 0 : _c.name) === "") { + return ""; + } + else { + return "[graphic".concat(quoteNamePadBefore(cursor), "]"); + } + } + } + ] + }), + // Insertion role + new SRRendererRule_1.SRRendererRule({ + roles: ["insertion"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { return (cursor.isStartTag() && "[inserted]" || ""); } + ] + }), + // Link role + new SRRendererRule_1.SRRendererRule({ + roles: ["link"], + elems: [], + modes: ["item", "region", "link", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + var _a; + if (cursor.isStartTag() && !["content", "text"].includes((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.nameFrom)) { + return getLinkAnnouncement(cursor, mode); + } + return null; + } + ] + }), + // Listitem role + new SRRendererRule_1.SRRendererRule({ + roles: ["listitem"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var _a; + var isOrdered; + var parentListElem; + var walkParents = DOMWalker_1.DOMWalker.parentNode(cursor.getNode()); + while (typeof isOrdered === "undefined" && walkParents) { + if (walkParents.nodeType === 1) { + var elem = walkParents; + if (elem.hasAttribute("role")) { + if (elem.getAttribute("role") === "list") { + isOrdered = false; + parentListElem = elem; + } + } + else if (elem.nodeName.toUpperCase() === "UL") { + isOrdered = false; + parentListElem = elem; + } + else if (elem.nodeName.toUpperCase() === "OL") { + isOrdered = true; + parentListElem = elem; + } + } + walkParents = DOMWalker_1.DOMWalker.parentNode(walkParents); + } + // Check if listitem contains interactive elements + // Screen readers don't read the accessible name when interactive elements are present + var hasInteractiveContent = listitemContainsInteractiveElement(cursor); + var nameToUse = hasInteractiveContent ? "" : (((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) || ""); + var retStr = ""; + if (!isOrdered) { + var elem = cursor.getElement(); + if ((elem.nodeName.toUpperCase() === "LI" && window.getComputedStyle(elem).listStyleType === "none") + || elem.nodeName.toUpperCase() !== "LI") { + retStr = cursor.isStartTag() ? "".concat(nameToUse) : ""; + } + else { + retStr = cursor.isStartTag() ? "[bullet] ".concat(nameToUse) : ""; + } + } + else { + // For ordered lists, count sibling listitems and account for start attribute + var count = 1; // Start at 1 by default + // Get the start attribute if it exists on the <ol> element + if (parentListElem && parentListElem.nodeName.toUpperCase() === 'OL' && + parentListElem.hasAttribute('start')) { + var startValue = parseInt(parentListElem.getAttribute('start') || '1', 10); + count = isNaN(startValue) ? 1 : startValue; + } + // Count previous sibling listitems at the same level using DOMWalker + var currentElem = cursor.getElement(); + var sibling = DOMWalker_1.DOMWalker.previousSiblingNotOwnedBySlot(currentElem); + while (sibling) { + // Only count direct siblings that are listitems (element nodes only) + if (sibling.nodeType === 1) { + var siblingElem = sibling; + if (siblingElem.getAttribute('role') === 'listitem' || + siblingElem.nodeName.toUpperCase() === 'LI') { + count++; + } + } + sibling = DOMWalker_1.DOMWalker.previousSiblingNotOwnedBySlot(sibling); + } + retStr = cursor.isStartTag() ? "".concat(count, ". ").concat(nameToUse) : ""; + } + return retStr; + } + ] + }), + // Math role + new SRRendererRule_1.SRRendererRule({ + roles: ["math"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { return cursor.isEndTag() ? "[math content]" : ""; } + ] + }), + // Link role + new SRRendererRule_1.SRRendererRule({ + roles: ["menuitem"], + elems: [], + modes: ["item", "tab_focus", "region"], + tests: [ + function (cursor) { + var retVal = ""; + if (cursor.isStartTag()) { + // let isSubMenuContainer = false; + // for (let checkChildren=cursor.getNode().firstChild; !isSubMenuContainer && checkChildren !== null; checkChildren = checkChildren.nextSibling) { + // isSubMenuContainer = checkChildren.nodeName.toUpperCase() === "UL"; + // } + // if (isSubMenuContainer) return "[????menu]"; + var expandStr = ""; + var elem = cursor.getElement(); + if (elem.getAttribute("aria-haspopup") === "true") { + expandStr += ", sub-menu"; + } + if (elem.hasAttribute("aria-expanded")) { + expandStr += ", ".concat(elem.getAttribute("aria-expanded") === "true" ? "expanded" : "collapsed"); + } + retVal = "[menu".concat(expandStr); + var nameInfo = cursor.getNameInfo(); + if (nameInfo && !["content", "text"].includes(nameInfo.nameFrom)) { + retVal += quoteNamePadBefore(cursor); + } + retVal += "]"; + } + return retVal; + } + ] + }), + // Meter role + new SRRendererRule_1.SRRendererRule({ + roles: ["meter"], + elems: [], + modes: ["item", "tab_focus"], + tests: [ + function (cursor) { return cursor.isStartTag() ? "[progress bar, ".concat((cursor.getNode().value), "]") : ""; } + ] + }), + // Progressbar role + new SRRendererRule_1.SRRendererRule({ + roles: ["progressbar"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { return cursor.isStartTag() ? "[progress bar, ".concat((cursor.getNode().value), "]") : ""; } + ] + }), + // Radio role + new SRRendererRule_1.SRRendererRule({ + roles: ["radio"], + elems: [], + modes: ["item", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (cursor.isStartTag()) { + var roleDesc = getRoleDescription(cursor, "radio button"); + var bChecked = false; + if (cursor.getElement().hasAttribute("aria-checked")) { + bChecked = cursor.getElement().getAttribute("aria-checked") === "true"; + } + else { + bChecked = cursor.getNode().checked; + } + var stateStr = getStateAnnouncements(cursor.getElement()); + return "[".concat(roleDesc, ", ").concat(bChecked ? "checked" : "not checked").concat(stateStr).concat(quoteNamePadBefore(cursor)).concat(getDescribedByAnnouncements(cursor.getElement(), mode), "]"); + } + else { + return ""; + } + } + ] + }), + // Searchbox role + new SRRendererRule_1.SRRendererRule({ + roles: ["searchbox"], + elems: [], + modes: ["item", "tab_focus"], + tests: [ + function (cursor) { return cursor.isStartTag() ? "[".concat(quoteNamePadAfter(cursor), "edit]") : ""; } + ] + }), + // Separator role + new SRRendererRule_1.SRRendererRule({ + roles: ["separator"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { return (cursor.isStartTag() && "[separator]" || ""); } + ] + }), + // Slider role + new SRRendererRule_1.SRRendererRule({ + roles: ["slider"], + elems: [], + modes: ["item", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (!cursor.isStartTag()) + return ""; + var roleDesc = getRoleDescription(cursor, "slider"); + var elem = cursor.getElement(); + // Check for aria-valuenow first, then fall back to native value property + var value = elem.hasAttribute("aria-valuenow") + ? elem.getAttribute("aria-valuenow") + : cursor.getNode().value; + return "[".concat(quoteNamePadAfter(cursor)).concat(roleDesc, ", ").concat(value).concat(getDescribedByAnnouncements(cursor.getElement(), mode), "]"); + } + ] + }), + // Spinbutton role + new SRRendererRule_1.SRRendererRule({ + roles: ["spinbutton"], + elems: [], + modes: ["item", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (!cursor.isStartTag()) + return ""; + var roleDesc = getRoleDescription(cursor, "spinbutton"); + return "[".concat(quoteNamePadAfter(cursor)).concat(roleDesc, ", editable").concat(getDescribedByAnnouncements(cursor.getElement(), mode), "]"); + } + ] + }), + // Tab role + new SRRendererRule_1.SRRendererRule({ + roles: ["tab"], + elems: [], + modes: ["item", "tab_focus"], + tests: [ + function (cursor) { + if (!cursor.isStartTag()) + return ""; + var roleDesc = getRoleDescription(cursor, "tab"); + return "[".concat(roleDesc).concat(cursor.getNode().getAttribute("aria-selected") === "true" ? ", selected" : "").concat(quoteNamePadBefore(cursor), "]"); + } + ] + }), + // Tablist role + new SRRendererRule_1.SRRendererRule({ + roles: ["tablist"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + if (cursor.getNameInfo() === null) + return null; + if (cursor.isStartTag()) { + return "[group start".concat(quoteNamePadBefore(cursor), "]"); + } + else { + return "[group end".concat(quoteNamePadBefore(cursor), "]"); + } + } + ] + }), + // Tabpanel role + new SRRendererRule_1.SRRendererRule({ + roles: ["tabpanel"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + if (cursor.getNameInfo() === null) + return null; + if (cursor.isStartTag()) { + return "[Tab panel start".concat(quoteNamePadBefore(cursor), "]"); + } + else { + return "[Tab panel end".concat(quoteNamePadBefore(cursor), "]"); + } + } + ] + }), + // Text role + new SRRendererRule_1.SRRendererRule({ + roles: ["text"], + elems: [], + modes: ["item", "link", "tab_focus", "region"], + tests: [ + function (cursor) { + var _a, _b, _c, _d; + if (cursor.isEndTag() || !((_a = cursor.getParentElement()) === null || _a === void 0 ? void 0 : _a.getElement())) + return null; + var elem = (_b = cursor.getParentElement()) === null || _b === void 0 ? void 0 : _b.getElement(); + if (elem.ownerDocument.defaultView.getComputedStyle(elem).textDecorationLine === "line-through") { + return "[strikethrough] ".concat((((_c = cursor.getNameInfo()) === null || _c === void 0 ? void 0 : _c.name) + ""), " [end strikethrough]"); + } + return "".concat((((_d = cursor.getNameInfo()) === null || _d === void 0 ? void 0 : _d.name) + "")); + } + ] + }), + // -- in heading mode + new SRRendererRule_1.SRRendererRule({ + roles: ["text"], + elems: [], + modes: ["heading"], + tests: [ + function (cursor) { return ""; } + ] + }), + // Textbox role + new SRRendererRule_1.SRRendererRule({ + roles: ["textbox"], + elems: [], + modes: ["item", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + var _a; + var elem = cursor.getElement(); + if (cursor.isEndTag()) { + return mode === "item" && elem.nodeName.toUpperCase() === "TEXTAREA" ? "[out of edit]" : ""; + } + if (!cursor.isStartTag()) { + return ""; + } + var attributes = ""; + if (elem.hasAttribute("placeholder") && elem.getAttribute("placeholder").trim().length > 0) { + attributes += ", placeholder: ".concat(elem.getAttribute("placeholder")); + } + attributes += getStateAnnouncements(elem); + var isMultiline = elem.nodeName.toUpperCase() === "TEXTAREA" || elem.getAttribute("aria-multiline") === "true"; + var describedBy = getDescribedByAnnouncements(elem, mode); + if (isMultiline) { + var textContent = mode === "tab_focus" ? (_a = elem.textContent) === null || _a === void 0 ? void 0 : _a.trim() : ""; + var contentSuffix = textContent ? " ".concat(textContent) : ""; + return "[".concat(quoteNamePadAfter(cursor), "edit, multiline").concat(attributes).concat(describedBy, "]").concat(contentSuffix); + } + return "[".concat(quoteNamePadAfter(cursor), "edit").concat(attributes).concat(describedBy, "]"); + } + ] + }), + // Treeitem role + new SRRendererRule_1.SRRendererRule({ + roles: ["treeitem"], + elems: [], + modes: ["item", "tab_focus"], + tests: [ + function (cursor) { + if (cursor.isEndTag()) + return ""; + var elem = cursor.getElement(); + // Build the announcement string without the name (let content render separately) + var announcement = "[treeview item"; + // Add selected state if present + if (elem.getAttribute("aria-selected") === "true") { + announcement += ", selected"; + } + // Add expanded/collapsed state if present + if (elem.hasAttribute("aria-expanded")) { + announcement += elem.getAttribute("aria-expanded") === "true" ? ", expanded" : ", collapsed"; + } + // Add level if explicitly set or calculate from nesting + var level = elem.getAttribute("aria-level"); + if (level) { + announcement += ", level ".concat(level); + } + else { + // Calculate level by counting parent treeitems or groups using DOMWalker for shadow DOM support + var calculatedLevel = 1; + var parent_1 = DOMWalker_1.DOMWalker.parentElement(elem); + while (parent_1) { + var parentRole = AriaUtil_1.AriaUtil.getResolvedRole(parent_1); + if (parentRole === "group" || parentRole === "tree") { + // Check if this group is inside a treeitem + var groupParent = DOMWalker_1.DOMWalker.parentElement(parent_1); + while (groupParent) { + var groupParentRole = AriaUtil_1.AriaUtil.getResolvedRole(groupParent); + if (groupParentRole === "treeitem") { + calculatedLevel++; + break; + } + else if (groupParentRole === "tree") { + break; + } + groupParent = DOMWalker_1.DOMWalker.parentElement(groupParent); + } + } + parent_1 = DOMWalker_1.DOMWalker.parentElement(parent_1); + } + if (calculatedLevel > 1) { + announcement += ", level ".concat(calculatedLevel); + } + } + // Add position information (aria-posinset/aria-setsize or calculate) + var position = elem.getAttribute("aria-posinset"); + var setSize = elem.getAttribute("aria-setsize"); + if (!position || !setSize) { + // Calculate position by counting siblings with same role using DOMWalker for shadow DOM support + var pos = 0; + var total = 0; + var parent_2 = DOMWalker_1.DOMWalker.parentElement(elem); + if (parent_2) { + // Iterate through children to count treeitems + var child = DOMWalker_1.DOMWalker.firstChildNotOwnedBySlot(parent_2); + while (child) { + if (child.nodeType === 1) { // Element node + var childElem = child; + if (AriaUtil_1.AriaUtil.getResolvedRole(childElem) === "treeitem") { + total++; + if (childElem === elem) { + pos = total; + } + } + } + child = child.nextSibling; + } + } + position = pos.toString(); + setSize = total.toString(); + } + announcement += ", ".concat(position, " of ").concat(setSize, "] "); + return announcement; + } + ] + }), + // HTML Element rules + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["BODY"], + modes: ["item", "tab_focus"], + tests: [ + function (cursor) { + var titleStr = cursor.getNode().ownerDocument.title; + return cursor.isEndTag() ? "[End of document".concat(titleStr.trim().length > 0 ? ": " + titleStr.trim() : "", "]") : "[Start of document".concat(titleStr.trim().length > 0 ? ": " + titleStr.trim() : "", "]"); + } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["IFRAME"], + modes: ["item", "tab_focus"], + tests: [ + function (cursor) { + var accessWarning = canAccessFrame(cursor.getNode()) ? "" : "{Emulator unable to access frame}"; + return cursor.isEndTag() ? "" : accessWarning; + } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["BR"], + modes: ["item"], + tests: [ + function (cursor) { + try { + var walk = cursor.clone(); + // Walk until we hit the beginning of the page, find another BR, or find something with a name + while (walk.previous(function () { return true; }) && walk.getNode().nodeName.toUpperCase() !== "BR" && walk.getNameInfo() && walk.getNameInfo().name.trim().length === 0) + ; + return walk.getNode().nodeName.toUpperCase() === "BR" ? "[blank]" : null; + } + catch (err) { + console.error(err); + } + } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["DL"], + modes: ["item"], + tests: [ + function (cursor) { return ""; } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["INPUT"], + modes: ["item", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { var _a; return (cursor.isStartTag() && ((_a = cursor.getElement()) === null || _a === void 0 ? void 0 : _a.getAttribute("type")) === "password" && "[".concat(quoteNamePadAfter(cursor), "edit, protected").concat(getDescribedByAnnouncements(cursor.getElement(), mode), "]")) || null; }, + function (cursor, _oldCursor, mode) { + var _a, _b; + if (cursor.isStartTag() && ((_a = cursor.getElement()) === null || _a === void 0 ? void 0 : _a.getAttribute("type")) === "file") { + var value = ((_b = cursor.getElement()) === null || _b === void 0 ? void 0 : _b.value) || ""; + value = value === "" ? "No file chosen" : value.substring("C:\\fakepath\\".length); + return "[".concat(quoteNamePadAfter(cursor), "button").concat(getDescribedByAnnouncements(cursor.getElement(), mode), "] [").concat(quoteNamePadAfter(cursor)).concat(value, "]"); + } + return null; + }, + function (cursor, _oldCursor, mode) { + var _a; + if (cursor.isStartTag() && ((_a = cursor.getElement()) === null || _a === void 0 ? void 0 : _a.getAttribute("type")) === "color") { + var val = cursor.getElement().value; + var r = (Number("0x".concat(val.substring(1, 3))) * 100.0 / Number("0xff")).toFixed(0); + var g = (Number("0x".concat(val.substring(3, 5))) * 100.0 / Number("0xff")).toFixed(0); + var b = (Number("0x".concat(val.substring(5))) * 100.0 / Number("0xff")).toFixed(0); + return "[".concat(quoteNamePadAfter(cursor), "clickable").concat(getDescribedByAnnouncements(cursor.getElement(), mode), "] [").concat(r, "% red ").concat(g, "% green ").concat(b, "% blue]"); + } + return null; + }, + function (cursor, _oldCursor, mode) { + var _a; + if (cursor.isStartTag() && ((_a = cursor.getElement()) === null || _a === void 0 ? void 0 : _a.getAttribute("type")) === "month") { + var val = cursor.getElement().value; + var y = "0"; + var m = "0"; + if (val.trim().length > 0) { + var date = new Date(val); + y = "" + date.getFullYear(); + m = "" + (date.getMonth() + 1); + } + return "[".concat(quoteNamePadAfter(cursor), "clickable").concat(getDescribedByAnnouncements(cursor.getElement(), mode), "] [spin button, ").concat(m, "] [spin button, ").concat(y, "] [menu button] [subMenu] Show month picker"); + } + return null; + }, + function (cursor, _oldCursor, mode) { + var _a; + if (cursor.isStartTag() && ((_a = cursor.getElement()) === null || _a === void 0 ? void 0 : _a.getAttribute("type")) === "date") { + var val = cursor.getElement().value; + var y = "0"; + var m = "0"; + var day = "0"; + if (val.trim().length > 0) { + var date = new Date(val); + y = "" + date.getFullYear(); + m = "" + (date.getMonth() + 1); + day = "" + (date.getDate()); + } + return "[".concat(quoteNamePadAfter(cursor), "clickable").concat(getDescribedByAnnouncements(cursor.getElement(), mode), "] [spin button, ").concat(m, "] / [spin button, ").concat(day, "] / [spin button, ").concat(y, "] [menu button] [subMenu] Show date picker"); + } + return null; + }, + function (cursor, _oldCursor, mode) { + var _a; + if (cursor.isStartTag() && ((_a = cursor.getElement()) === null || _a === void 0 ? void 0 : _a.getAttribute("type")) === "datetime-local") { + var val = cursor.getElement().value; // 2025-09-12T04:20 + var y = "0"; + var m = "0"; + var day = "0"; + var hour = "0"; + var min = "0"; + var ampm = "0"; + if (val.trim().length > 0) { + var date = new Date(val); + y = "" + date.getFullYear(); + m = "" + (date.getMonth() + 1); + day = "" + (date.getDate()); + if (date.getHours() === 0 || date.getHours() === 12) { + hour = "12"; + } + else if (date.getHours() < 12) { + hour = "" + date.getHours(); + } + else { + hour = "" + (date.getHours() - 12); + } + min = "" + date.getMinutes(); + ampm = date.getHours() >= 12 ? "pm" : "am"; + } + return "[".concat(quoteNamePadAfter(cursor), "clickable").concat(getDescribedByAnnouncements(cursor.getElement(), mode), "] [spin button, ").concat(m, "] / [spin button, ").concat(day, "] / [spin button, ").concat(y, "] [spin button, ").concat(hour, "] : [spin button, ").concat(min, "] [spin button, ").concat(ampm, "] [menu button] [subMenu] Show local date and time picker"); + } + return null; + }, + function (cursor, _oldCursor, mode) { + var _a; + if (cursor.isStartTag() && ((_a = cursor.getElement()) === null || _a === void 0 ? void 0 : _a.getAttribute("type")) === "time") { + var val = cursor.getElement().value; // 2025-09-12T04:20 + var hour = "0"; + var min = "0"; + var ampm = "0"; + if (val.trim().length > 0) { + var date = val.split(":"); + var hours = parseInt(date[0]); + if (hours === 0 || hours === 12) { + hour = "12"; + } + else if (hours < 12) { + hour = "" + hours; + } + else { + hour = "" + (hours - 12); + } + min = date[1]; + ampm = hours >= 12 ? "pm" : "am"; + } + return "[".concat(quoteNamePadAfter(cursor), "grouping clickable").concat(getDescribedByAnnouncements(cursor.getElement(), mode), " [spin button, ").concat(hour, "] : [spin button, ").concat(min, "] [spin button, ").concat(ampm, "] [menu button] [subMenu] Show time picker [out of grouping]"); + } + return null; + }, + function (cursor, _oldCursor, mode) { + var _a; + if (cursor.isStartTag() && ((_a = cursor.getElement()) === null || _a === void 0 ? void 0 : _a.getAttribute("type")) === "week") { + var val = cursor.getElement().value; // 2025-W38 + var year = "0"; + var week = "0"; + if (val.trim().length > 0) { + var date = val.split(/-W/); + year = date[0]; + week = date[1]; + } + return "[".concat(quoteNamePadAfter(cursor), "clickable").concat(getDescribedByAnnouncements(cursor.getElement(), mode), "] [spin button, ").concat(week, "], [spin button, ").concat(year, "] [menu button] [subMenu] Show week picker"); + } + return null; + }, + function (cursor) { var _a; return ((_a = cursor.getElement()) === null || _a === void 0 ? void 0 : _a.getAttribute("type")) === "hidden" ? "" : null; }, + function (cursor) { return (cursor.isStartTag() && "!![".concat(quoteNamePadAfter(cursor), "input!!]").concat(cursor.getElement().outerHTML)) || null; } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["LI"], + modes: ["item"], + tests: [ + function (cursor) { + var _a; + // Check if listitem contains interactive elements + // Screen readers don't read the accessible name when interactive elements are present + var hasInteractiveContent = listitemContainsInteractiveElement(cursor); + var nameToUse = hasInteractiveContent ? "" : (((_a = cursor.getNameInfo()) === null || _a === void 0 ? void 0 : _a.name) || ""); + var elem = cursor.getElement(); + if (window.getComputedStyle(elem).listStyleType === "none") { + return cursor.isStartTag() ? "".concat(nameToUse) : ""; + } + else { + return cursor.isStartTag() ? "[bullet] ".concat(nameToUse) : ""; + } + } + ] + }), + // MathML elements + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["MFRAC"], + modes: ["item"], + tests: [ + function (cursor) { return cursor.isStartTag() ? "[fraction]" : "[end fraction]"; } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["MROW"], + modes: ["item"], + tests: [ + function (cursor) { + var _a; + // Only announce over on the end tag + if (cursor.isStartTag()) + return undefined; + var fraction = cursor.getCurrentOrParentByRoleClone([], ["mfrac"]); + if (fraction && ((_a = fraction.getElement().querySelectorAll("mrow")[0]) === null || _a === void 0 ? void 0 : _a.isSameNode(cursor.getNode()))) { + return "[over]"; + } + } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["MSQRT"], + modes: ["item"], + tests: [ + function (cursor) { return cursor.isStartTag() ? "[square root]" : "[end root]"; } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["MSUP"], + modes: ["item"], + tests: [ + function (cursor) { + var _a, _b; + if (cursor.isEndTag()) + return undefined; + var mi = ((_a = cursor.getElement().querySelector("mi")) === null || _a === void 0 ? void 0 : _a.innerHTML) || ""; + var mn = ((_b = cursor.getElement().querySelector("mn")) === null || _b === void 0 ? void 0 : _b.innerHTML) || ""; + if (mn === "2") + return "".concat(mi, " [squared]"); + if (mn === "3") + return "".concat(mi, " [cubed]"); + return "".concat(mi, " [to the ").concat(mn, "]"); + } + ] + }), + // Multiple roles rules - placed at the bottom + // Default mode rules - Container elements (multiple roles) + new SRRendererRule_1.SRRendererRule({ + roles: ["article", "banner", "blockquote", "caption", "cell", "code", "columnheader", + "complementary", "contentinfo", "figure", "form", "group", "list", "main", + "mark", "navigation", "region", "row", "rowheader", "search", "table", "toolbar"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { return ""; } + ] + }), + // Default mode rules - Elements that screen readers typically ignore (multiple roles) + new SRRendererRule_1.SRRendererRule({ + roles: ["paragraph", "rowgroup", "status", "strong", "subscript", "superscript", + "term", "time", "none", "presentation"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { return ""; } + ] + }), +]; + + +/***/ }, + +/***/ "./src/v4/simulator/render_rules/container_enter.ts" +/*!**********************************************************!*\ + !*** ./src/v4/simulator/render_rules/container_enter.ts ***! + \**********************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.RULES = void 0; +var SRRendererRule_1 = __webpack_require__(/*! ../SRRendererRule */ "./src/v4/simulator/SRRendererRule.ts"); +var SRTableUtil_1 = __webpack_require__(/*! ../SRTableUtil */ "./src/v4/simulator/SRTableUtil.ts"); +var common_1 = __webpack_require__(/*! ./common */ "./src/v4/simulator/render_rules/common.ts"); +var AriaUtil_1 = __webpack_require__(/*! ../../util/AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var CommonUtil_1 = __webpack_require__(/*! ../../util/CommonUtil */ "./src/v4/util/CommonUtil.ts"); +/** + * Generates the announcement text when entering a table cell + */ +function renderEnterTableCell(newCursor, oldCursor) { + var _a; + // We seem to be at the newline text node after the cell + if (oldCursor && ((_a = oldCursor.getNode()) === null || _a === void 0 ? void 0 : _a.nodeName) === "#text") { + oldCursor = oldCursor.clone(); + oldCursor.previous(function () { return true; }); + } + var newTableModel = SRTableUtil_1.SRTableUtil.getTableModel(newCursor); + var oldCellInfo = SRTableUtil_1.SRTableUtil.getCellModel(oldCursor, newTableModel); + var newCellInfo = SRTableUtil_1.SRTableUtil.getCellModel(newCursor, newTableModel); + if (!newCellInfo) + return ""; + var retVal = []; + // Announce row information if we've moved to a different row or the rowspan has changed + if (!oldCellInfo || oldCellInfo.rowIndexStart !== newCellInfo.rowIndexStart || oldCellInfo.rowspan !== newCellInfo.rowspan) { + // If a change in row or a change in rowSpan + var rowHeaders = SRTableUtil_1.SRTableUtil.getRowHeadersForCursor(newCursor, newTableModel); + var headerInfoStr = rowHeaders && rowHeaders.trim().length > 0 ? "\"".concat(rowHeaders, "\", ") : ""; + retVal.push("[".concat(headerInfoStr, "row ").concat((newCellInfo.rowIndexStart + 1)).concat(newCellInfo.rowspan > 1 ? " through " + (newCellInfo.rowIndexStart + newCellInfo.rowspan) : "", "]")); + } + // Announce column information if we've moved to a different column or the colspan has changed + if (!oldCellInfo || oldCellInfo.colIndexStart !== newCellInfo.colIndexStart || oldCellInfo.colspan !== newCellInfo.colspan) { + // If a change in column or a change in colspan + var columnHeaders = SRTableUtil_1.SRTableUtil.getColumnHeadersForCursor(newCursor, newTableModel); + var headerInfoStr = columnHeaders && columnHeaders.trim().length > 0 ? "\"".concat(columnHeaders, "\", ") : ""; + retVal.push("[".concat(headerInfoStr, "column ").concat((newCellInfo.colIndexStart + 1)).concat(newCellInfo.colspan > 1 ? " through " + (newCellInfo.colIndexStart + newCellInfo.colspan) : "", "]")); + } + return retVal.join(" "); +} +exports.RULES = [ + // Single role rules - alphabetically sorted + // Article role + new SRRendererRule_1.SRRendererRule({ + roles: ["article"], + elems: [], + modes: ["item", "article", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (mode === "tab_focus" && !CommonUtil_1.CommonUtil.isTabbable(cursor.getNode())) + return null; + var roleDesc = (0, common_1.getRoleDescription)(cursor, "article"); + return "[".concat((0, common_1.quoteNamePadAfter)(cursor)).concat(roleDesc, "]"); + } + ] + }), + // Banner role + new SRRendererRule_1.SRRendererRule({ + roles: ["banner"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (mode === "tab_focus" && !CommonUtil_1.CommonUtil.isTabbable(cursor.getNode())) + return null; + var roleDesc = (0, common_1.getRoleDescription)(cursor, "banner region"); + return "[".concat((0, common_1.quoteNamePadAfter)(cursor)).concat(roleDesc, "]"); + } + ] + }), + // Blockquote role + new SRRendererRule_1.SRRendererRule({ + roles: ["blockquote"], + elems: [], + modes: ["item", "region"], + tests: [ + function (_cursor) { return "[blockquote]"; } + ] + }), + // Caption role + new SRRendererRule_1.SRRendererRule({ + roles: ["caption"], + elems: [], + modes: ["item", "region"], + tests: [ + function (_cursor) { return "[caption]"; } + ] + }), + // Cell role + new SRRendererRule_1.SRRendererRule({ + roles: ["cell"], + elems: [], + modes: ["item", "table"], + tests: [ + renderEnterTableCell + ] + }), + // Columnheader role + new SRRendererRule_1.SRRendererRule({ + roles: ["columnheader"], + elems: [], + modes: ["item", "table"], + tests: [ + renderEnterTableCell + ] + }), + // Complementary role + new SRRendererRule_1.SRRendererRule({ + roles: ["complementary"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (mode === "tab_focus" && !CommonUtil_1.CommonUtil.isTabbable(cursor.getNode())) + return null; + return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "complementary region]"); + } + ] + }), + // Contentinfo role + new SRRendererRule_1.SRRendererRule({ + roles: ["contentinfo"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (mode === "tab_focus" && !CommonUtil_1.CommonUtil.isTabbable(cursor.getNode())) + return null; + return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "content info region]"); + } + ] + }), + // Figure role + new SRRendererRule_1.SRRendererRule({ + roles: ["figure"], + elems: [], + modes: ["item", "region"], + tests: [ + function (_cursor) { return "[figure]"; } + ] + }), + // Form role + new SRRendererRule_1.SRRendererRule({ + roles: ["form"], + elems: [], + modes: ["item", "region", "formcontrol"], + tests: [ + function (cursor) { + if (cursor.getNameInfo() === null) { + return "[section]"; + } + else { + return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "form region]"); + } + } + ] + }), + // Group role + new SRRendererRule_1.SRRendererRule({ + roles: ["group"], + elems: [], + modes: ["item", "region"], + tests: [ + function (cursor) { + var _a; + if (cursor.getNameInfo() === null) + return null; + if (((_a = cursor.getCurrentOrParentByRoleClone(["combobox"], ["select"])) === null || _a === void 0 ? void 0 : _a.getNode().nodeName.toUpperCase()) === "SELECT") { + return ""; + } + if (cursor.getNode().nodeName.toUpperCase() === "DETAILS") { + return "[button, ".concat(cursor.getElement().hasAttribute("open") ? "expanded" : "collapsed", "]"); + } + else { + return "[grouping".concat((0, common_1.quoteNamePadBefore)(cursor), "]"); + } + } + ] + }), + // -- tab_focus + new SRRendererRule_1.SRRendererRule({ + roles: ["group"], + elems: [], + modes: ["tab_focus"], + tests: [ + function (cursor) { + var _a; + if (cursor.getNameInfo() === null) + return null; + if (((_a = cursor.getCurrentOrParentByRoleClone(["combobox"], ["select"])) === null || _a === void 0 ? void 0 : _a.getNode().nodeName.toUpperCase()) === "SELECT") { + return ""; + } + if (cursor.getNode().nodeName.toUpperCase() === "DETAILS") { + return "[button, ".concat(cursor.getElement().hasAttribute("open") ? "expanded" : "collapsed", "]"); + } + else { + return ""; + } + } + ] + }), + // List role + new SRRendererRule_1.SRRendererRule({ + roles: ["list"], + elems: [], + modes: ["item", "list"], + tests: [ + function (cursor) { + var _a; + var node = cursor.getNode(); + var descendantListItems = document.evaluate(".//li | .//*[@role='listitem']", node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + // Count items, excluding those in other lists or within presentational containers + var numItems = 0; + for (var i = 0; i < descendantListItems.snapshotLength; i++) { + var item = descendantListItems.snapshotItem(i); + // Walk up ancestors to check for both nested lists and presentational containers + var isInOtherList = false; + var hasPresentationalAncestor = false; + var ancestor = item.parentElement; + while (ancestor && ancestor !== node) { + // Check if ancestor is another list + var ancestorRole = AriaUtil_1.AriaUtil.getResolvedRole(ancestor); + if (ancestorRole === "list" || + ancestor.nodeName.toUpperCase() === "UL" || + ancestor.nodeName.toUpperCase() === "OL") { + isInOtherList = true; + break; + } + // Check if ancestor has presentational children + if (ancestorRole && ((_a = ARIADefinitions_1.ARIADefinitions.designPatterns[ancestorRole]) === null || _a === void 0 ? void 0 : _a.presentationalChildren)) { + hasPresentationalAncestor = true; + break; + } + ancestor = ancestor.parentElement; + } + if (!isInOtherList && !hasPresentationalAncestor) { + numItems++; + } + } + if (numItems === 0) + return null; + return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "list of ").concat(numItems, " items]"); + } + ] + }), + // Main role + new SRRendererRule_1.SRRendererRule({ + roles: ["main"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (mode === "tab_focus" && !CommonUtil_1.CommonUtil.isTabbable(cursor.getNode())) + return null; + return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "main region]"); + } + ] + }), + // menubar role + new SRRendererRule_1.SRRendererRule({ + roles: ["menubar"], + elems: [], + modes: ["item", "list"], + tests: [ + function (cursor) { + var node = cursor.getNode(); + var descendantListItems = document.evaluate(".//*[@role='menuitem']", node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + var descendantListItemsInOtherLists = document.evaluate(".//*[@role='menubar']//*[@role='menuitem']|.//*[@role='menu']//*[@role='menuitem']", node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + // const descendantContainers = document.evaluate(".//*[@role='menuitem']/*[@role='menu']", node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + // const descendantContainers2 = document.evaluate(".//*[@role='menubar']//*[@role='menuitem']/*[@role='menu']|.//*[@role='menu']//*[@role='menuitem']/*[@role='menu']", node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + console.log("MENUBAR", cursor.isEndTag() ? "/" : "", cursor.getNode()); + console.log(descendantListItems, descendantListItemsInOtherLists); //, descendantContainers, descendantContainers2) + var numItems = descendantListItems.snapshotLength - descendantListItemsInOtherLists.snapshotLength; //-descendantContainers.snapshotLength+descendantContainers2.snapshotLength; + if (numItems === 0) + return null; + return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "menubar with ").concat(numItems, " items]"); + } + ] + }), + // Navigation role + new SRRendererRule_1.SRRendererRule({ + roles: ["navigation"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (mode === "tab_focus" && !CommonUtil_1.CommonUtil.isTabbable(cursor.getNode())) + return null; + var roleDesc = (0, common_1.getRoleDescription)(cursor, "navigation region"); + return "[".concat((0, common_1.quoteNamePadAfter)(cursor)).concat(roleDesc, "]"); + } + ] + }), + // Radio group role + new SRRendererRule_1.SRRendererRule({ + roles: ["radiogroup"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (cursor) { + if (cursor.getNameInfo() === null) + return null; + return "[grouping".concat((0, common_1.quoteNamePadBefore)(cursor), "]"); + } + ] + }), + // Region role + new SRRendererRule_1.SRRendererRule({ + roles: ["region"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (cursor.getNameInfo() === null) + return null; + if (mode === "tab_focus" && !CommonUtil_1.CommonUtil.isTabbable(cursor.getNode())) + return null; + var roleDesc = (0, common_1.getRoleDescription)(cursor, "region"); + return "[".concat((0, common_1.quoteNamePadAfter)(cursor)).concat(roleDesc, "]"); + } + ] + }), + // Row role + new SRRendererRule_1.SRRendererRule({ + roles: ["row"], + elems: [], + modes: ["item", "table"], + tests: [ + function () { return ""; } + ] + }), + // Rowheader role + new SRRendererRule_1.SRRendererRule({ + roles: ["rowheader"], + elems: [], + modes: ["item", "table"], + tests: [ + renderEnterTableCell + ] + }), + // Search role + new SRRendererRule_1.SRRendererRule({ + roles: ["search"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (mode === "tab_focus" && !CommonUtil_1.CommonUtil.isTabbable(cursor.getNode())) + return null; + var roleDesc = (0, common_1.getRoleDescription)(cursor, "search region"); + return "[".concat((0, common_1.quoteNamePadAfter)(cursor)).concat(roleDesc, "]"); + } + ] + }), + // Table role + new SRRendererRule_1.SRRendererRule({ + roles: ["table"], + elems: [], + modes: ["item", "table"], + tests: [ + function (cursor) { + var tableWalker = cursor.clone(); + // Get to the start of the table + while (tableWalker.getRole() !== "table" && tableWalker.previous(function () { return true; })) + ; + // Set an end to the table + var tableNode = tableWalker.getNode(); + var rows = 0; + var cols = 0; + // Sanity check that the table has content + if (tableWalker.getNode().firstChild) { + var firstRowComplete = false; + while (tableWalker.next(function () { return true; }) && !tableWalker.getNode().isSameNode(tableNode)) { + var role = tableWalker.getRole(); + if (tableWalker.isStartTag()) { + if (role === "row") { + ++rows; + } + else { + if (!firstRowComplete && ["cell", "rowheader", "columnheader"].includes(role)) { + var elem = tableWalker.getNode(); + cols += parseInt(elem.getAttribute("colspan") || "1"); + } + } + } + else if (role === "row") { + firstRowComplete = true; + } + } + } + return "[table with ".concat(rows, " ").concat(rows === 1 ? "row" : "rows", " and ").concat(cols, " ").concat(cols === 1 ? "column" : "columns").concat((0, common_1.quoteNamePadBefore)(cursor), "]"); + } + ] + }), + // Toolbar role + new SRRendererRule_1.SRRendererRule({ + roles: ["toolbar"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (cursor, _oldCursor, mode) { + if (mode === "tab_focus" && !CommonUtil_1.CommonUtil.isTabbable(cursor.getNode())) + return null; + return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "toolbar]"); + } + ] + }), + // HTML Element rules + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["DL"], + modes: ["item", "list"], + tests: [ + function (cursor) { + var node = cursor.getNode(); + var descendantListItems = document.evaluate(".//dt", node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + var numItems = descendantListItems.snapshotLength; + return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "definition list of ").concat(numItems, " terms]"); + } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["FIGCAPTION"], + modes: ["item"], + tests: [ + function (_cursor) { return "[caption]"; } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["MARK"], + modes: ["item"], + tests: [ + function (_cursor) { return "[highlighted]"; } + ] + }), + // Multiple roles rules - placed at the bottom + // Heading mode rules - ignore container elements in heading mode (multiple roles) + new SRRendererRule_1.SRRendererRule({ + roles: ["article", "banner", "blockquote", "caption", "cell", "columnheader", + "complementary", "contentinfo", "figure", "form", "group", "region", + "row", "rowheader", "search", "toolbar", "list", "main", "navigation", "table"], + elems: [], + modes: ["heading"], + tests: [ + function () { return ""; } + ] + }) +]; + + +/***/ }, + +/***/ "./src/v4/simulator/render_rules/containter_exit.ts" +/*!**********************************************************!*\ + !*** ./src/v4/simulator/render_rules/containter_exit.ts ***! + \**********************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.RULES = void 0; +var SRRendererRule_1 = __webpack_require__(/*! ../SRRendererRule */ "./src/v4/simulator/SRRendererRule.ts"); +var common_1 = __webpack_require__(/*! ./common */ "./src/v4/simulator/render_rules/common.ts"); +exports.RULES = [ + // Single role rules - alphabetically sorted + // Article role + new SRRendererRule_1.SRRendererRule({ + roles: ["article"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var roleDesc = (0, common_1.getRoleDescription)(cursor, "article"); + return "[out of ".concat(roleDesc, "]"); + } + ] + }), + // Banner role + new SRRendererRule_1.SRRendererRule({ + roles: ["banner"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var roleDesc = (0, common_1.getRoleDescription)(cursor, "banner region"); + return "[out of ".concat(roleDesc, "]"); + } + ] + }), + // Blockquote role + new SRRendererRule_1.SRRendererRule({ + roles: ["blockquote"], + elems: [], + modes: ["item"], + tests: [ + function (_cursor) { return "[out of blockquote]"; } + ] + }), + // Caption role + new SRRendererRule_1.SRRendererRule({ + roles: ["caption"], + elems: [], + modes: ["item"], + tests: [ + function (_cursor) { return "[out of caption]"; } + ] + }), + // Complementary role + new SRRendererRule_1.SRRendererRule({ + roles: ["complementary"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var roleDesc = (0, common_1.getRoleDescription)(cursor, "complementary region"); + return "[out of ".concat(roleDesc, "]"); + } + ] + }), + // Contentinfo role + new SRRendererRule_1.SRRendererRule({ + roles: ["contentinfo"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var roleDesc = (0, common_1.getRoleDescription)(cursor, "content info region"); + return "[out of ".concat(roleDesc, "]"); + } + ] + }), + // Figure role + new SRRendererRule_1.SRRendererRule({ + roles: ["figure"], + elems: [], + modes: ["item", "region"], + tests: [ + function (_cursor) { return "[out of figure]"; } + ] + }), + // Form role + new SRRendererRule_1.SRRendererRule({ + roles: ["form"], + elems: [], + modes: ["item", "region", "formcontrol"], + tests: [ + function (cursor) { + if (cursor.getNameInfo() === null) { + return "[out of section]"; + } + else { + return "[out of form]"; + } + } + ] + }), + // Group role + new SRRendererRule_1.SRRendererRule({ + roles: ["group"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var _a; + if (cursor.getNameInfo() === null) + return null; + if (((_a = cursor.getCurrentOrParentByRoleClone(["combobox"], ["select"])) === null || _a === void 0 ? void 0 : _a.getNode().nodeName.toUpperCase()) === "SELECT") { + return ""; + } + else + return "[out of grouping]"; + } + ] + }), + // List role + new SRRendererRule_1.SRRendererRule({ + roles: ["list"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var node = cursor.getNode(); + var descendantListItems = document.evaluate(".//li | .//*[@role='listitem']", node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + var descendantListItemsInOtherLists = document.evaluate(".//ul//li|.//ul//*[@role='listitem']|.//ol//li|.//ol//*[@role='listitem']|.//*[@role='list']//li|.//*[@role='list']//*[@role='listitem']", node, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null); + var numItems = descendantListItems.snapshotLength - descendantListItemsInOtherLists.snapshotLength; + if (numItems === 0) + return null; + return "[".concat((0, common_1.quoteNamePadAfter)(cursor), "out of list]"); + } + ] + }), + // Main role + new SRRendererRule_1.SRRendererRule({ + roles: ["main"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var roleDesc = (0, common_1.getRoleDescription)(cursor, "main region"); + return "[out of ".concat(roleDesc, "]"); + } + ] + }), + // menubar role + new SRRendererRule_1.SRRendererRule({ + roles: ["menubar"], + elems: [], + modes: ["item", "list"], + tests: [ + function (_cursor) { return "[out of menubar]"; } + ] + }), + // Navigation role + new SRRendererRule_1.SRRendererRule({ + roles: ["navigation"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var roleDesc = (0, common_1.getRoleDescription)(cursor, "navigation region"); + return "[out of ".concat(roleDesc, "]"); + } + ] + }), + // radiogroup role + new SRRendererRule_1.SRRendererRule({ + roles: ["radiogroup"], + elems: [], + modes: ["item", "region", "tab_focus"], + tests: [ + function (_cursor) { return "[out of grouping]"; } + ] + }), + // Region role + new SRRendererRule_1.SRRendererRule({ + roles: ["region"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + if (cursor.getNameInfo() === null) + return null; + var roleDesc = (0, common_1.getRoleDescription)(cursor, "region"); + return "[out of ".concat(roleDesc, "]"); + } + ] + }), + // Search role + new SRRendererRule_1.SRRendererRule({ + roles: ["search"], + elems: [], + modes: ["item"], + tests: [ + function (cursor) { + var roleDesc = (0, common_1.getRoleDescription)(cursor, "search region"); + return "[out of ".concat(roleDesc, "]"); + } + ] + }), + // Table role + new SRRendererRule_1.SRRendererRule({ + roles: ["table"], + elems: [], + modes: ["item"], + tests: [ + function (_cursor) { return "[out of table]"; } + ] + }), + // Toolbar role + new SRRendererRule_1.SRRendererRule({ + roles: ["toolbar"], + elems: [], + modes: ["item"], + tests: [ + function (_cursor) { return "[out of toolbar]"; } + ] + }), + // HTML Element rules + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["ABBR"], + modes: ["item"], + tests: [ + function (cursor) { return cursor.getElement().hasAttribute("title") ? + "[".concat(cursor.getElement().getAttribute("title"), "]") : null; } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["DL"], + modes: ["item"], + tests: [ + function (_cursor) { return "[out of definition list]"; } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["FIGCAPTION"], + modes: ["item"], + tests: [ + function (_cursor) { return "[out of caption]"; } + ] + }), + new SRRendererRule_1.SRRendererRule({ + roles: [], + elems: ["MARK"], + modes: ["item"], + tests: [ + function (_cursor) { return "[out of highlighted]"; } + ] + }), + // Multiple roles rules - placed at the bottom + // Region mode rules - ignore container elements in region and heading mode + new SRRendererRule_1.SRRendererRule({ + roles: ["group", "article", "banner", "blockquote", "caption", "complementary", + "contentinfo", "figure", "form", "list", "region", "main", "navigation", + "search", "table", "toolbar"], + elems: [], + modes: ["region", "heading"], + tests: [ + function () { return ""; } + ] + }), +]; + + +/***/ }, + +/***/ "./src/v4/simulator/render_rules/index.ts" +/*!************************************************!*\ + !*** ./src/v4/simulator/render_rules/index.ts ***! + \************************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.CONTAINER_EXIT_RULES = exports.CONTAINER_ENTER_RULES = exports.SR_RULES = void 0; +var common_1 = __webpack_require__(/*! ./common */ "./src/v4/simulator/render_rules/common.ts"); +var container_enter_1 = __webpack_require__(/*! ./container_enter */ "./src/v4/simulator/render_rules/container_enter.ts"); +var containter_exit_1 = __webpack_require__(/*! ./containter_exit */ "./src/v4/simulator/render_rules/containter_exit.ts"); +exports.SR_RULES = common_1.RULES; +exports.CONTAINER_ENTER_RULES = container_enter_1.RULES; +exports.CONTAINER_EXIT_RULES = containter_exit_1.RULES; + + +/***/ }, + +/***/ "./src/v4/util/AccNameUtil.ts" +/*!************************************!*\ + !*** ./src/v4/util/AccNameUtil.ts ***! + \************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.AccNameUtil = void 0; +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var CommonUtil_1 = __webpack_require__(/*! ./CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var AriaUtil_1 = __webpack_require__(/*! ./AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ./VisUtil */ "./src/v4/util/VisUtil.ts"); +var CacheUtil_1 = __webpack_require__(/*! ./CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +var AccNameUtil = /** @class */ (function () { + function AccNameUtil() { + } + /** + * Computes the accessible name for an SVG element according to W3C specification + * Following the Accessible Name and Description Computation 1.1 algorithm + * https://www.w3.org/TR/accname-1.1/ + * + * @param elem The SVG element + * @returns The accessible name result or null if no accessible name is found + */ + AccNameUtil.computeAccessibleNameForSVGElementW3C = function (elem) { + if (!elem || elem.nodeName.toLowerCase() !== 'svg') + return null; + // Step 1: Check for aria-labelledby (already handled by main computeAccessibleName function) + // Step 2: Check for aria-label (already handled by main computeAccessibleName function) + // Step 3: Check for title element + var svgTitles = elem.querySelectorAll(":scope > title"); + if (svgTitles && svgTitles.length > 0) { + var text_1 = ""; + svgTitles.forEach(function (svgTitle) { + if (svgTitle && !VisUtil_1.VisUtil.isNodeHiddenFromAT(svgTitle) && !VisUtil_1.VisUtil.isNodePresentational(svgTitle)) { + var title = svgTitle.textContent; + if (title && title.trim() !== '') + text_1 += title.trim(); + } + }); + if (text_1 && text_1.trim() !== '') + return { "name": text_1.trim(), "nameFrom": "svgTitle" }; + } + // Step 4: Check for text content in SVG text elements + var textContent = ""; + var textElements = elem.querySelectorAll("text, textPath, tspan"); + if (textElements && textElements.length > 0) { + textElements.forEach(function (textElement) { + if (!VisUtil_1.VisUtil.isNodeHiddenFromAT(textElement) && !VisUtil_1.VisUtil.isNodePresentational(textElement)) { + var content = textElement.textContent; + if (content && content.trim() !== '') + textContent += " " + content.trim(); + } + }); + if (textContent.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(textContent.trim()), "nameFrom": "svgText" }; + } + // Step 5: Check for xlink:title attribute on links within SVG + var links = elem.querySelectorAll("a"); + for (var i = 0; i < links.length; i++) { + var link = links[i]; + if (!VisUtil_1.VisUtil.isNodeHiddenFromAT(link) && !VisUtil_1.VisUtil.isNodePresentational(link)) { + var xlinkTitle = link.getAttribute("xlink:title"); + if (xlinkTitle && xlinkTitle.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(xlinkTitle), "nameFrom": "svglinkTitle" }; + } + } + // Step 6: Check for aria-describedby or aria-description + var description = AriaUtil_1.AriaUtil.getAriaDescription(elem); + if (description && description.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(description), "nameFrom": "aria-description" }; + // Step 7: Check for desc element + var descElements = elem.querySelectorAll(":scope > desc"); + if (descElements && descElements.length > 0) { + var descText_1 = ""; + descElements.forEach(function (descElement) { + if (!VisUtil_1.VisUtil.isNodeHiddenFromAT(descElement) && !VisUtil_1.VisUtil.isNodePresentational(descElement)) { + var desc = descElement.textContent; + if (desc && desc.trim() !== '') + descText_1 += " " + desc.trim(); + } + }); + if (descText_1.trim() !== '') + return { "name": descText_1.trim(), "nameFrom": "svgDesc" }; + } + // Step 8: Check for title attribute + if (elem.hasAttribute("title")) { + var title = elem.getAttribute("title"); + if (title && title.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(title), "nameFrom": "title" }; + } + // No accessible name found + return null; + }; + // calculate accessible name for a given node + AccNameUtil.computeAccessibleName = function (elem) { + if (!elem) + return null; + var nodeName = elem.nodeName.toLowerCase(); + var name_pair = CacheUtil_1.CacheUtil.getCache(elem, "ELEMENT_ACCESSBLE_NAME", undefined); + if (name_pair !== undefined) + return name_pair; + // 1. name from author, or elements without a role but with aria-labelledby or aria-label + // get aria label even for the role where the name is prohibited or is 'presentation' or 'none' + var accName = AriaUtil_1.AriaUtil.getAriaLabel(elem); + if (accName && accName.trim() !== "") { + CacheUtil_1.CacheUtil.setCache(elem, "ELEMENT_ACCESSBLE_NAME", { "name": CommonUtil_1.CommonUtil.truncateText(accName), "nameFrom": "ariaLabel" }); + return { "name": CommonUtil_1.CommonUtil.truncateText(accName), "nameFrom": "ariaLabel" }; + } + // 2. accessible name mapping for native html elements + name_pair = AccNameUtil.computeAccessibleNameForNativeElement(elem); + if (name_pair) { + CacheUtil_1.CacheUtil.setCache(elem, "ELEMENT_ACCESSBLE_NAME", name_pair); + return name_pair; + } + // 3. name from native or aria attribute + /**name_pair = AccNameUtil.computeAccessibleNameFromAttribute(elem); + if (name_pair) { + CacheUtil.setCache(elem, "ELEMENT_ACCESSBLE_NAME", name_pair); + return name_pair; + }*/ + // 4. name from content for custom elements with a role + var role = AriaUtil_1.AriaUtil.getResolvedRole(elem); + if (ARIADefinitions_1.ARIADefinitions.designPatterns[role] && ARIADefinitions_1.ARIADefinitions.designPatterns[role].nameFrom.includes("contents")) { + name_pair = AccNameUtil.computeAccessibleNameFromContent(elem); + if (name_pair) { + CacheUtil_1.CacheUtil.setCache(elem, "ELEMENT_ACCESSBLE_NAME", name_pair); + return name_pair; + } + } + // 5. name from the global attribute "title" + if (elem.hasAttribute("title")) { + var title = elem.getAttribute("title").trim(); + if (title && title.trim().length > 0) { + title = CommonUtil_1.CommonUtil.truncateText(title); + CacheUtil_1.CacheUtil.setCache(elem, "ELEMENT_ACCESSBLE_NAME", { "name": title, "nameFrom": "title" }); + return { "name": title, "nameFrom": "title" }; + } + } + // 6. name from the attribute "placeholder" + if (nodeName === 'textarea' || (nodeName === 'input' && (!elem.hasAttribute("type") || CommonUtil_1.CommonUtil.input_type_with_placeholder.includes(elem.getAttribute("type"))))) { + var placeholder = elem.getAttribute("placeholder"); + if (placeholder && placeholder.trim().length > 0) { + placeholder = CommonUtil_1.CommonUtil.truncateText(placeholder); + CacheUtil_1.CacheUtil.setCache(elem, "ELEMENT_ACCESSBLE_NAME", { "name": placeholder, "nameFrom": "placeholder" }); + return { "name": placeholder, "nameFrom": "placeholder" }; + } + } + CacheUtil_1.CacheUtil.setCache(elem, "ELEMENT_ACCESSBLE_NAME", null); + return null; + }; + // calculate accessible name for native elements + AccNameUtil.computeAccessibleNameForNativeElement = function (elem) { + var nodeName = elem.nodeName.toLowerCase(); + // labellable fields + if (CommonUtil_1.CommonUtil.form_labelable_elements.includes(nodeName)) { + // Get only the non-hidden labels for element + var label = CommonUtil_1.CommonUtil.getFormFieldLabel(elem); + if (label && label.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(label), "nameFrom": "label" }; + } + // input types: button, reset, submit, image + if (nodeName === "input" && elem.hasAttribute("type")) { + if (CommonUtil_1.CommonUtil.form_button_types.includes(elem.getAttribute("type"))) { + // input types: button, reset, submit + // Get the "value" attribute for the element + var value = CommonUtil_1.CommonUtil.getElementAttribute(elem, "value"); + if (value && value.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(value), "nameFrom": "value" }; + // input 'submit' and 'reset' have visible defaults so pass if there is no explicit 'value' attribute + var type = elem.getAttribute("type"); + if (type === 'submit' || type === 'reset') + return { "name": type, "nameFrom": "internal" }; + } + else if (elem.getAttribute("type") === 'image') { + // input type = 'image' + // note that though HTML 5 spec indicates "The element's [value] attribute must be omitted", Chrome uses the value. + // Get the accessible name for the alt attribute + var alt = CommonUtil_1.CommonUtil.getElementAttribute(elem, "alt"); + if (alt && alt.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(alt), "nameFrom": "alt" }; + ; + // the visible default text for type "image" is "Submit" same with the type "submit" + //return {"name":elem.getAttribute("type"), "nameFrom": "internal"}; + } + } + // button + // note button may have a value attribute, but it's not a visible text + if (nodeName === "button") { + // first use the button text + var text = elem.innerText; + if (text && text.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "text" }; + // for image button: get the first image if exists + var image = elem.querySelector('img'); + if (image && !VisUtil_1.VisUtil.isNodeHiddenFromAT(image) && !VisUtil_1.VisUtil.isNodePresentational(image)) { + var pair = AccNameUtil.computeAccessibleName(image); + if (pair && pair.name && pair.name.trim().length > 0) + return pair; + } + // for a button with a svg image + var svg = elem.querySelector('svg'); + if (svg && !VisUtil_1.VisUtil.isNodeHiddenFromAT(svg) && !VisUtil_1.VisUtil.isNodePresentational(svg)) { + var pair = AccNameUtil.computeAccessibleName(svg); + if (pair && pair.name && pair.name.trim().length > 0) + return pair; + } + } + // fieldset + if (nodeName === "fieldset") { + // if the fieldset element's first child is a legend element, then use the subtree of the legend + var first = elem.firstElementChild; + if (first && first.nodeName.toLowerCase() === 'legend') { + // legend can be mixed text + var text = first.innerText; + if (text && text.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "legend" }; + } + } + // output + if (nodeName === "output") { + // if the associated label element exists, use concatenated accessible name(s) from labelled elements. + if (elem.hasAttribute("for")) { + var labelIDs = elem.getAttribute("for").trim().split(" "); + if (labelIDs && labelIDs.length > 0) { + var label = ""; + for (var j = 0; j < labelIDs.length; j++) { + var labelNode = elem.ownerDocument.getElementById(labelIDs[j]); + if (labelNode && !DOMUtil_1.DOMUtil.sameNode(labelNode, elem) && !VisUtil_1.VisUtil.isNodeHiddenFromAT(labelNode) && !VisUtil_1.VisUtil.isNodePresentational(labelNode)) { + var pair = AccNameUtil.computeAccessibleName(labelNode); + if (pair && pair.name && pair.name.trim().length > 0) + label += " " + CommonUtil_1.CommonUtil.normalizeSpacing(pair.name); + } + } + if (label.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(label), "nameFrom": "label" }; + } + } + } + // summary + if (nodeName === "summary") { + // use summary element subtree + var text = elem.innerText; + if (text && text.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "legend" }; + } + // details + if (nodeName === "details") { + var first = elem.firstElementChild; + if (first && first.nodeName.toLowerCase() === 'summary') { + // get accessible name from summary + var pair = AccNameUtil.computeAccessibleName(first); + if (pair && pair.name && pair.name.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(pair.name.trim()), "nameFrom": "summary" }; + } + // If no summary element as a direct child of the details element, + // the user agent should provide one with a subtree containing a localized string of the word "details". + return { "name": "details", "nameFrom": "internal" }; + } + // figure + if (nodeName === "figure") { + // if the figure element has a figcaption as a child + var caption = CommonUtil_1.CommonUtil.getChildByTagHidden(elem, "figcaption", true, false); + if (caption && caption.length > 0) { + // figcaption can be mixed text + var text = caption[0].innerText; + if (text && text.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "figcaption" }; + } + } + // img elements: use attribute "alt" + if (nodeName === "img") { + if (elem.hasAttribute("alt")) { + var alt = elem.getAttribute("alt"); + return { "name": CommonUtil_1.CommonUtil.truncateText(alt), "nameFrom": "alt" }; + } + } + // area elements: use attribute "alt" + if (nodeName === "area") { + if (elem.hasAttribute("alt")) { + var alt = elem.getAttribute("alt"); + if (alt && alt.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(alt), "nameFrom": "alt" }; + } + } + // table element + if (nodeName === "table") { + // if the figure element has a caption as the first child + var captionElem = elem.firstElementChild; + if (captionElem && captionElem.nodeName.toLowerCase() === 'caption') { + // caption can be mixed text + var caption = captionElem.innerText; + if (caption && caption.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(caption), "nameFrom": "caption" }; + } + } + // a element + if (nodeName === "a") { + // first use the link text + var text = elem.innerText; + if (text && text.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "text" }; + //for image link: get the image or svg if exists + var images = elem.querySelectorAll(":scope > img, :scope > svg"); + if (images && images.length > 0) { + var text_2 = ""; + images.forEach(function (image) { + if (!VisUtil_1.VisUtil.isNodeHiddenFromAT(image) && !VisUtil_1.VisUtil.isNodePresentational(image)) { + var pair = AccNameUtil.computeAccessibleName(image); + if (pair && pair.name && pair.name.trim().length > 0) + text_2 += " " + pair.name.trim(); + } + }); + if (text_2.trim() !== '') + return { "name": text_2.trim(), "nameFrom": "alt" }; + } + } + // optgroup + // label participate in accessible name calculation: https://www.w3.org/TR/html-aam-1.0/#att-label + // The label attribute must be specified. Its value gives the name of the group + // the value is disabled in the interface + if (nodeName === "optgroup" || nodeName === "option" || nodeName === "track") { + var label = elem.getAttribute("label"); + if (label && label.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(label), "nameFrom": "label" }; + } + // svg + if (nodeName === "svg") { + var pair = AccNameUtil.computeAccessibleNameForSVGElementW3C(elem); + if (pair && pair.name && pair.name.trim().length > 0) + return pair; + } + return null; + }; + // calculate accessible name for native elements + AccNameUtil.computeAccessibleNameForSVGElement = function (elem) { + // 1. a direct child or descendant title element + var svgTitles = elem.querySelectorAll(":scope > title"); + if (svgTitles && svgTitles.length > 0) { + var text_3 = ""; + svgTitles.forEach(function (svgTitle) { + if (svgTitle && !VisUtil_1.VisUtil.isNodeHiddenFromAT(svgTitle) && !VisUtil_1.VisUtil.isNodePresentational(svgTitle)) { + var title = svgTitle.textContent; + if (title && title.trim() !== '') + text_3 += title.trim(); + } + }); + if (text_3 && text_3.trim() !== '') + return { "name": text_3.trim(), "nameFrom": "svgTitle" }; + } + // 2. xlink:title attribute on a link + var linkTitle = elem.querySelector("a"); + if (linkTitle && !VisUtil_1.VisUtil.isNodeHiddenFromAT(linkTitle) && !VisUtil_1.VisUtil.isNodePresentational(linkTitle)) { + var link = linkTitle.getAttribute("xlink:title"); + if (link && link.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(link), "nameFrom": "svglinkTitle" }; + } + /** 3. for text container elements, the text content. + * note the SVG text content elements are: ‘text’, ‘textPath’ and ‘tspan’. + * svg element can be nested. One of the purposes is to to group SVG shapes together as a collection for responsive design. + * + * select text content excluded the text from the nested svg elements and their children + */ + var text = ""; + elem.querySelectorAll(":scope > *").forEach(function (element) { + if (element.nodeName.toLowerCase() !== 'svg' && !VisUtil_1.VisUtil.isNodeHiddenFromAT(element) && !VisUtil_1.VisUtil.isNodePresentational(element)) { + var value = CommonUtil_1.CommonUtil.getInnerText(element); + if (value && value.trim().length > 0) + text += value; + } + }); + if (text.trim() !== '') + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "svgText" }; + // 4. from aria-describedby or aria-description + var descby = AriaUtil_1.AriaUtil.getAriaDescription(elem); + if (descby && descby.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(descby), "nameFrom": "aria-description" }; + // 5. a direct child or descendant desc element + var descElems = elem.querySelectorAll(":scope > desc"); + if (descElems && descElems.length > 0) { + var text_4 = ""; + descElems.forEach(function (descElem) { + if (descElem && !VisUtil_1.VisUtil.isNodeHiddenFromAT(descElem) && !VisUtil_1.VisUtil.isNodePresentational(descElem)) { + var desc = descElem.textContent; + if (desc && desc.trim() !== '') + text_4 += desc.trim(); + } + }); + if (text_4 && text_4.trim() !== '') + return { "name": text_4.trim(), "nameFrom": "svgDesc" }; + } + }; + // calculate accessible name for custom elements marked with aria + AccNameUtil.computeAccessibleNameFromContent = function (elem) { + var nodeName = elem.nodeName.toLowerCase(); + var role = AriaUtil_1.AriaUtil.getResolvedRole(elem); + /** for acc name from content, the content from CSS pseudo-elements + * :before and :after pseudo elements [CSS2] can provide textual content for elements that have a content model. + * For :before or :after pseudo elements, user agents must prepend CSS textual content, without a space, + * to the textual content of the current node. + */ + var pair = AccNameUtil.computeAccessibleNameForCSSPseudoElement(elem, "before"); + if (pair !== null && pair.name && pair.name.trim().length > 0) + return pair; + pair = AccNameUtil.computeAccessibleNameForCSSPseudoElement(elem, "after"); + if (pair && pair.name && pair.name.trim().length > 0) + return pair; + // shadow host + if (elem.shadowRoot) { + pair = AccNameUtil.computeAccessibleNameForShadowHost(elem); + if (pair && pair.name && pair.name.trim().length > 0) + return { "name": pair.name, "nameFrom": "shadow" }; + ; + } + // slot element + if (nodeName === "slot") { + pair = AccNameUtil.computeAccessibleNameForSlotElement(elem); + if (pair && pair.name && pair.name.trim().length > 0) + return { "name": pair.name, "nameFrom": "slot" }; + } + // otherwise: get the value from the element + pair = AccNameUtil.computeAccessibleNameFromChildren(elem); + if (pair && pair.name && pair.name.trim().length > 0) + return { "name": pair.name, "nameFrom": "content" }; + // no accessible name exists + return null; + }; + // calculate accessible name from CSS generated content + AccNameUtil.computeAccessibleNameForCSSPseudoElement = function (elem, type) { + var contentElem = elem.ownerDocument.defaultView.getComputedStyle(elem, type); + if (contentElem) { + var content = contentElem.content; + if (content && content !== "none" && content !== "no" && content !== "normal") { + content = content.replace(/^"/, "").replace(/"$/, ""); + if (content.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(content), "nameFrom": "css-" + type }; + } + } + return null; + }; + // calculate accessible name for SLOT element + AccNameUtil.computeAccessibleNameForShadowHost = function (elem) { + var text = ""; + var shadowRoot = elem.shadowRoot; + if (shadowRoot) { + var children = shadowRoot.querySelectorAll('*'); + // check text from all the children elements + children.forEach(function (child) { + var pair = AccNameUtil.computeAccessibleName(child); + if (pair && pair.name && pair.name.trim().length > 0) + text += " " + pair.name.trim(); + }); + } + if (text.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "shadow-host" }; + return null; + }; + // calculate accessible name for SLOT element + AccNameUtil.computeAccessibleNameForSlotElement = function (elem) { + //if no assignedNode, check its own text + var text = ""; + if (!elem.assignedNodes() || elem.assignedNodes().length === 0) { + var pair = AccNameUtil.computeAccessibleName(elem); + if (pair && pair.name && pair.name.trim().length > 0) + text += " " + pair.name.trim(); + } + else { + // check text from all assigned nodes + for (var _i = 0, _a = elem.assignedNodes(); _i < _a.length; _i++) { + var slotChild = _a[_i]; + var pair = AccNameUtil.computeAccessibleName(slotChild); + if (pair && pair.name && pair.name.length > 0) + text += " " + pair.name.trim(); + } + } + if (text.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "content-slot" }; + return null; + }; + // calculate accessible name from children content + AccNameUtil.computeAccessibleNameFromChildren = function (elem) { + var text = ""; + //let walkChild = elem.firstChild; + var nw = new DOMWalker_1.DOMWalker(elem); + // Loop over all the childrens of the element to get the text + while (nw.nextNode() && nw.node !== elem && nw.node !== elem.parentNode) { + if (nw.bEndTag) + continue; + //while (walkChild) { + var walkChild = nw.node; + if (walkChild.nodeType === 3) { + // for the text node, get the parentnode to check visibility + var parent_1 = walkChild.parentElement; + if (!VisUtil_1.VisUtil.isNodeHiddenFromAT(parent_1) && !VisUtil_1.VisUtil.isNodePresentational(parent_1) && walkChild.nodeValue && walkChild.nodeValue.trim().length > 0) { + text += " " + walkChild.nodeValue.trim(); + } + } + else if (walkChild.nodeType === 1 && !VisUtil_1.VisUtil.isNodeHiddenFromAT(walkChild) && !VisUtil_1.VisUtil.isNodePresentational(walkChild)) { + var pair = AccNameUtil.computeAccessibleName(walkChild); + if (pair && pair.name && pair.name.length > 0) { + text += " " + pair.name.trim(); + nw.bEndTag = true; + } + // Skip children if this element only has presentational children + else if (AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(nw.node)) { + nw.bEndTag = true; + } + } + } + if (text.trim().length > 0) + return { "name": CommonUtil_1.CommonUtil.truncateText(text), "nameFrom": "content" }; + return null; + }; + // if accessible name can be ignored for image or svg + AccNameUtil.isAccessibleNameIgnorable = function (elem) { + if (!elem) + return false; + var nodeName = elem.nodeName.toLowerCase(); + if (nodeName !== 'img' && nodeName !== 'svg') + return false; + var parent = elem.parentElement; + if (parent) { + // if the parent is a widget and has an aria label, then image/svg label is not necessary + if ((AriaUtil_1.AriaUtil.isWidget(parent) || AriaUtil_1.AriaUtil.containsPresentationalChildrenOnly(parent)) && AriaUtil_1.AriaUtil.hasAriaLabel(parent)) + return true; + } + return false; + }; + return AccNameUtil; +}()); +exports.AccNameUtil = AccNameUtil; + + +/***/ }, + +/***/ "./src/v4/util/AriaUtil.ts" +/*!*********************************!*\ + !*** ./src/v4/util/AriaUtil.ts ***! + \*********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.AriaUtil = void 0; +var CacheUtil_1 = __webpack_require__(/*! ./CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var ARIAMapper_1 = __webpack_require__(/*! ../../v2/aria/ARIAMapper */ "./src/v2/aria/ARIAMapper.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var VisUtil_1 = __webpack_require__(/*! ./VisUtil */ "./src/v4/util/VisUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ./CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ./AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +var AriaUtil = /** @class */ (function () { + function AriaUtil() { + } + AriaUtil.isDefinedAriaAttributeAtIndex = function (ele, index) { + var attrName = ele.attributes[index].name; + return AriaUtil.isDefinedAriaAttribute(ele, attrName); + }; + /** + * this method returns user-defined aria attribute name from dom + * @param ele element + * @returns user defined aria attributes + */ + AriaUtil.getUserDefinedAriaAttributes = function (elem) { + var ariaAttributes = []; + var domAttributes = elem.attributes; + if (domAttributes) { + for (var i = 0; i < domAttributes.length; i++) { + var attrName = domAttributes[i].name.trim().toLowerCase(); + var isAria = attrName.substring(0, 5) === 'aria-'; + if (isAria) + ariaAttributes.push(attrName); + } + } + return ariaAttributes; + }; + /** + * this method returns user-defined html attribute name from dom + * @param ele element + * @returns user defined html attributes + */ + AriaUtil.getUserDefinedHtmlAttributes = function (elem) { + var htmlAttributes = []; + var domAttributes = elem.attributes; + if (domAttributes) { + for (var i = 0; i < domAttributes.length; i++) { + var attrName = domAttributes[i].name.trim().toLowerCase(); + var isAria = attrName.substring(0, 5) === 'aria-'; + if (!isAria) + htmlAttributes.push(attrName); + } + } + return htmlAttributes; + }; + /** + * this method returns user-defined aria attribute name-value pair from dom + * @param ele element + * @returns user defined aria attributes + */ + AriaUtil.getUserDefinedAriaAttributeNameValuePairs = function (elem) { + var ariaAttributes = []; + var domAttributes = elem.attributes; + if (domAttributes) { + for (var i = 0; i < domAttributes.length; i++) { + var attrName = domAttributes[i].name.trim().toLowerCase(); + var attrValue = elem.getAttribute(attrName); + if (attrValue === '') + attrValue = null; + var isAria = attrName.substring(0, 5) === 'aria-'; + if (isAria) + ariaAttributes.push({ name: attrName, value: attrValue }); + } + } + return ariaAttributes; + }; + /** + * this method returns user-defined html attribute name-value pair from dom + * @param ele element + * @returns user defined html attributes + */ + AriaUtil.getUserDefinedHtmlAttributeNameValuePairs = function (elem) { + var htmlAttributes = []; + var domAttributes = elem.attributes; + if (domAttributes) { + for (var i = 0; i < domAttributes.length; i++) { + var attrName = domAttributes[i].name.trim().toLowerCase(); + var attrValue = elem.getAttribute(attrName); + if (attrValue === '') + attrValue = null; + var isAria = attrName.substring(0, 5) === 'aria-'; + if (!isAria) + htmlAttributes.push({ name: attrName, value: attrValue }); + } + } + return htmlAttributes; + }; + /** + * This method handles implicit aria definitions, for example, an input with checked is equivalent to aria-checked="true" + */ + AriaUtil.getAriaAttribute = function (ele, attributeName) { + // If the attribute is defined, it takes precedence + var retVal = ele.getAttribute(attributeName); + if (ele.hasAttribute(attributeName) && retVal.trim() === "") { //"" is treated as false, so we need return it before the below check + return retVal; + } + // Then determine implicit values from other attributes + if (!retVal) { + var tag = ele.nodeName.toLowerCase(); + if (attributeName in AriaUtil.ariaAttributeImplicitMappings) { + if (tag in AriaUtil.ariaAttributeImplicitMappings[attributeName]) { + retVal = AriaUtil.ariaAttributeImplicitMappings[attributeName][tag]; + if (typeof (retVal) === "function") { + retVal = retVal(ele); + } + } + else if ("*" in AriaUtil.ariaAttributeImplicitMappings[attributeName]) { + retVal = AriaUtil.ariaAttributeImplicitMappings[attributeName]["*"]; + if (typeof (retVal) === "function") { + retVal = retVal(ele); + } + } + } + } + // Check role-based defaults + if (!retVal) { + var role = ARIAMapper_1.ARIAMapper.nodeToRole(ele); + if (role in AriaUtil.ariaAttributeRoleDefaults && attributeName in AriaUtil.ariaAttributeRoleDefaults[role]) { + retVal = AriaUtil.ariaAttributeRoleDefaults[role][attributeName]; + if (typeof (retVal) === "function") { + retVal = retVal(ele); + } + } + } + // Still not defined? Check global defaults + if (!retVal && attributeName in AriaUtil.ariaAttributeGlobalDefaults) { + retVal = AriaUtil.ariaAttributeGlobalDefaults[attributeName]; + } + return retVal; + }; + AriaUtil.isDefinedAriaAttribute = function (ele, attrName) { + var isDefinedAriaAttribute = false; + if (attrName.substring(0, 5) === 'aria-') { + // User agents SHOULD treat state and property attributes with a value of "" the same as they treat an absent attribute. + isDefinedAriaAttribute = ele.hasAttribute && ele.hasAttribute(attrName) && ele.getAttribute(attrName).length > 0; + } + return isDefinedAriaAttribute; + }; + /** + * WAI-ARIA’s role attribute may have a list of values, but only the first valid and supported WAI-ARIA role is used + * https://www.w3.org/TR/wai-aria-implementation/#mapping_role_table + * This function is responsible for retrieving the resoled role for an element. + * @parm {HTMLElement} ele - element for which to find role. + * + * @return string - resolved role for the element: + * explicit role: resoled from the list of values + * implicit role: if not explicitely specified, or none of the specified role values is allowed for the element + * null: if none of the specified role values is allowed for the element, neither implicit role exists + * + * @memberOf AriaUtil + */ + AriaUtil.getResolvedRole = function (elem, considerImplicitRoles) { + if (considerImplicitRoles === void 0) { considerImplicitRoles = true; } + if (!elem) + return null; + var role = CacheUtil_1.CacheUtil.getCache(elem, "RPTUTIL_ELEMENT_RESOLVED_ROLE", null); + if (role === null) { + var roles = AriaUtil.getUserDefinedRoles(elem); + var tagProperty = AriaUtil.getElementAriaProperty(elem); + var allowedRoles = AriaUtil.getAllowedAriaRoles(elem, tagProperty); + var containsGeneric = false; + if (roles && roles.length > 0 && allowedRoles && allowedRoles.length > 0) { + for (var i = 0; i < roles.length; i++) { + if (allowedRoles.includes("any") || allowedRoles.includes(roles[i])) { + if (allowedRoles.includes("any") && roles[i] === 'generic') { + containsGeneric = true; + continue; + } + role = roles[i]; + if (role === "presentation" || role === "none") { + // If element is focusable, then presentation roles are to be ignored + if (CommonUtil_1.CommonUtil.isFocusable(elem)) { + //reset rule to null + role = null; + continue; + } + } + break; + } + } + if (containsGeneric) + role = 'generic'; + } + if (role === null && considerImplicitRoles) { + var implicitRole = AriaUtil.getImplicitRole(elem); + role = implicitRole && implicitRole.length > 0 ? implicitRole[0] : undefined; + } + CacheUtil_1.CacheUtil.setCache(elem, "RPTUTIL_ELEMENT_RESOLVED_ROLE", role); + } + return role !== undefined ? role : null; + }; + /** + * This function is responsible for retrieving user defined element's roles from dom. + * @parm {HTMLElement} ele - element for which to find role. + * + * @return {List} roles - list of user defined roles in the element role attribute. + * + * @memberOf AriaUtil + */ + AriaUtil.getUserDefinedRoles = function (ele) { + return AriaUtil.getRoles(ele, false); + }; + /** + * This function is responsible for retrieving element's roles. + * This function also finds implicit roles. + * @parm {HTMLElement} ele - element for which to find role. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {List} roles - list of attribute roles and implicit roles. + * + * @memberOf AriaUtil + */ + AriaUtil.getRoles = function (ele, considerImplicitRoles) { + var roles = []; + if (ele && ele.hasAttribute && ele.hasAttribute("role")) { + var attrRoles = CommonUtil_1.CommonUtil.normalizeSpacing(ele.getAttribute("role").trim()).split(" "); + for (var i = 0; i < attrRoles.length; ++i) { + roles.push(attrRoles[i]); + } + } + //check if implicit roles exist. + //Note: element can have multiple implicit roles + if (considerImplicitRoles) { + var implicitRole = AriaUtil.getImplicitRole(ele); + if (implicitRole !== null && implicitRole.length > 0) { + //add implicit roles to the attributes roles. + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(implicitRole, roles); + } + } + return roles; + }; + /** + * Returns the implicit role of the elemement + * @parm {HTMLElement} ele - element for which to find role. + * + * @return the implicit role or [] if doesn't exist + * + * @memberOf AriaUtil + */ + AriaUtil.getImplicitRole = function (ele) { + if (!ele || ele.nodeType !== 1) + return null; + var implicitRoles = CacheUtil_1.CacheUtil.getCache(ele, "AriaUtil_ImplicitRole", null); + if (!implicitRoles) { + var tagProperty = AriaUtil.getElementAriaProperty(ele); + // check if there are any implicit roles for this element. + if (tagProperty && tagProperty.implicitRole) { + if (tagProperty.implicitRole.includes("generic")) { + // the 'generic' role is only allowed if a valid aria attribute exists. + var domAriaAttributes_1 = AriaUtil.getUserDefinedAriaAttributes(ele); + if (domAriaAttributes_1.length === 0) { + CacheUtil_1.CacheUtil.setCache(ele, "AriaUtil_ImplicitRole", []); + return []; + } + var roleAttributes = []; + var pattern = ARIADefinitions_1.ARIADefinitions.designPatterns['generic']; + if (pattern.reqProps && pattern.reqProps.length > 0) + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(pattern.reqProps, roleAttributes); + if (tagProperty.globalAriaAttributesValid) + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(ARIADefinitions_1.ARIADefinitions.globalProperties, roleAttributes); + if (pattern.deprecatedProps && pattern.deprecatedProps.length > 0) + CommonUtil_1.CommonUtil.reduceArrayItemList(pattern.deprecatedProps, roleAttributes); + // remove 'generic' role if roleAttributes doesn't contain any of domAriaAttributes + if (roleAttributes.length > 0 && !roleAttributes.some(function (attr) { return domAriaAttributes_1.includes(attr); })) { + var implicit = CommonUtil_1.CommonUtil.reduceArrayItemList(['generic'], tagProperty.implicitRole); + CacheUtil_1.CacheUtil.setCache(ele, "AriaUtil_ImplicitRole", implicit); + return implicit; + } + } + CacheUtil_1.CacheUtil.setCache(ele, "AriaUtil_ImplicitRole", tagProperty.implicitRole); + return tagProperty.implicitRole; + } + CacheUtil_1.CacheUtil.setCache(ele, "AriaUtil_ImplicitRole", []); + return []; + } + return implicitRoles; + }; + /** + * Returns the required properties of the role + * @parm {string} role - the role + * @parm {HTMLElement} ele - element for which to find role. + * + * @return {List} properties - list of properties that are required by the role + * + * @memberOf AriaUtil + */ + AriaUtil.getRoleRequiredProperties = function (role, ele) { + if (role === null) { + return null; + } + if (ARIADefinitions_1.ARIADefinitions.designPatterns[role]) { + var requiredAttributes = ARIADefinitions_1.ARIADefinitions.designPatterns[role].reqProps; + // handle special case of separator + if (role.toLowerCase() === "separator" && ele && CommonUtil_1.CommonUtil.isFocusable(ele)) { + requiredAttributes = CommonUtil_1.CommonUtil.concatUniqueArrayItemList(["aria-valuenow"], requiredAttributes || []); + } + return requiredAttributes; + } + else { + return null; + } + }; + /** + * This function is responsible for finding if a element has given role. + * This function aslo finds if element has given roles as implicit role. + * @parm {HTMLElement} ele - element for which to find role. + * @parm {list or string} roles - List or single role for which to find if element has these roles. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {List} retVal - true or false based on if th element has the specified role. + * + * @memberOf AriaUtil + * + * Consider to use hasRoleInSemantics() instead. + */ + AriaUtil.hasRole = function (ele, role, considerImplicitRoles) { + var retVal = false; + if (ele && ele.hasAttribute && ele.hasAttribute("role")) { + if (typeof (role) != typeof ("")) { + var roles = ele.getAttribute("role").trim().split(" "); + for (var i = 0; !retVal && i < roles.length; ++i) { + retVal = roles[i] in role; + } + } + else { + var roles = ele.getAttribute("role").trim().split(" "); + for (var i = 0; !retVal && i < roles.length; ++i) { + retVal = roles[i] === role; + } + } + } + //if none of the the attribute roles matched with given role + //check if implicit roles matches. + //Note: element can have multiple implicit roles + if (!retVal && considerImplicitRoles) { + var wRoles = []; + //check if there are any implicit roles for this element. + var implicitRole = AriaUtil.getImplicitRole(ele); + if (implicitRole !== null && implicitRole.length > 0) { + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(implicitRole, wRoles); + //if role is array loop thru and see if any of the implicit role present in the array + if (typeof (role) != typeof ("")) { + for (var i = 0; !retVal && i < wRoles.length; ++i) { + retVal = wRoles[i] in role; + } + } + else { + for (var i = 0; !retVal && i < wRoles.length; ++i) { + retVal = wRoles[i] === role; + } + } + } + } + return retVal; + }; + /** + * Checks if the element has the role, including the implied role if role is not explicitly specified. + * + * This function is replacing the hasRole function + * + * @parm {HTMLElement} ele - element for which to find role. + * @parm {list or string} roles - List or single role for which to find if element has these roles. + * + * @return {List} retVal - true or false based on if the element has the specified role. + * + * @memberOf AriaUtil + */ + AriaUtil.hasRoleInSemantics = function (ele, role) { + var retVal = false; + var roleSpecified = false; + if (ele && ele.hasAttribute && ele.hasAttribute("role")) { + if (typeof (role) != typeof ("")) { + var roles = ele.getAttribute("role").trim().toLowerCase().split(/\s+/); + for (var i = 0; !retVal && i < roles.length; ++i) { + roleSpecified = true; + retVal = roles[i] in role; + } + } + else { + var roles = ele.getAttribute("role").trim().toLowerCase().split(/\s+/); + for (var i = 0; !retVal && i < roles.length; ++i) { + roleSpecified = true; + retVal = roles[i] === role; + } + } + } + if (roleSpecified) { + return retVal; + } + //check if implicit roles matches. + //Note: element can have multiple implicit roles + //check if there are any implicit roles for this element. + var impRoles = AriaUtil.getImplicitRole(ele); + if (impRoles !== null && impRoles.length > 0) { + //if role is array loop thru and see if any of the implicit role present in the array + if (typeof (role) != typeof ("")) { + for (var i = 0; !retVal && i < impRoles.length; ++i) { + retVal = impRoles[i] in role; + } + } + else { + for (var i = 0; !retVal && i < impRoles.length; ++i) { + retVal = impRoles[i] === role; + } + } + } + return retVal; + }; + /** + * This function is responsible for finding if a element has given role. + * This function also checks if element has given roles as implicit roles. + * @parm {HTMLElement} ele - element for which to find role. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {bool} retVal - true or false based on if the element has the specified role. + * + * @memberOf AriaUtil + */ + AriaUtil.hasAnyRole = function (ele, considerImplicitRoles) { + var retVal = false; + if (ele && ele.hasAttribute && ele.hasAttribute("role")) { + retVal = true; + } + //check if implicit roles exist. + //Note: element can have multiple implicit roles + if (!retVal && considerImplicitRoles) { + //check if there are any implicit roles for this element. + var impRoles = AriaUtil.getImplicitRole(ele); + if (impRoles !== null && impRoles.length > 0) + retVal = true; + } + return retVal; + }; + AriaUtil.isPresentationalElement = function (node) { + // Elements extracted from https://developer.mozilla.org/en/docs/Web/HTML/Element#Inline_text_semantics, + // http://dev.w3.org/html5/html-author/#text-level-semantics and https://wiki.whatwg.org/wiki/Presentational_elements_and_attributes + var presentationalElements = ["abbr", "b", "bdi", "bdo", "br", "cite", "code", "data", "dfn", + "em", "i", "kbd", "mark", "q", "rp", "rt", "rtc", "ruby", "s", + "samp", "small", "span", "strong", "sub", "sup", "time", "u", + "var", "wbr", "a", "progress", "meter", "basefont", "big", "center", + "strike", "tt", "font", "blink", "h1", "h2", "h3", "h4", "h5", "h6", + "hr", "blockquote", "p" + ]; + return CommonUtil_1.CommonUtil.valInArray(node.nodeName.toLowerCase(), presentationalElements); + }; + /** + * return the ancestor of the given element and role. + * + * @parm {element} element - The element to start the node walk on to find parent node + * @parm {string} role - The role to search for on an element under the provided element + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {node} walkNode - A parent node of the element passed in, which has the provided role + * + * @memberOf AriaUtil + */ + AriaUtil.getAncestorWithRole = function (element, roleName, considerImplicitRoles) { + var walkNode = DOMWalker_1.DOMWalker.parentNode(element); + while (walkNode !== null) { + if (considerImplicitRoles) { + if (AriaUtil.hasRoleInSemantics(walkNode, roleName)) { + break; + } + } + else { + if (AriaUtil.hasRole(walkNode, roleName, false)) { + break; + } + } + walkNode = DOMWalker_1.DOMWalker.parentNode(walkNode); + } + return walkNode; + }; + /** + * return the ancestor of the given element and roles. + * + * @parm {element} element - The element to start the node walk on to find parent node + * @parm {array} roles - the role names to search for + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {node} walkNode - A parent node of the element passed in, which has the provided role + * + * @memberOf AriaUtil + */ + AriaUtil.getAncestorWithRoles = function (element, roleNames) { + if (!element || !roleNames || !roleNames.length || roleNames.length === 0) + return null; + var walkNode = element; + while (walkNode !== null) { + var role = AriaUtil.getResolvedRole(walkNode); + if (role !== null && + (roleNames.includes(role) || + (roleNames.includes("*") && !["presentation", "none"].includes(role)))) + return walkNode; + walkNode = DOMWalker_1.DOMWalker.parentNode(walkNode); + } + return null; + }; + /** + * return the roles with given role type. + * + * @parm {element} element - The element to start the node walk on to find parent node + * @parm {array} roleTyples - role types, such as 'widget', 'structure' etc. + * + * @return {array} roles - A parent node of the element passed in, which has the provided role + * + * @memberOf AriaUtil + */ + AriaUtil.getRolesWithTypes = function (element, types) { + if (!element || !types || !types.length || types.length === 0) + return null; + var roles = CacheUtil_1.CacheUtil.getCache(element.ownerDocument, "roles_with_given_types", null); + if (!roles || roles.length === 0) { + roles = []; + Object.entries(ARIADefinitions_1.ARIADefinitions.designPatterns).forEach(function (_a) { + var key = _a[0], value = _a[1]; + if (types.includes(value.roleType)) + roles.push(key); + }); + CacheUtil_1.CacheUtil.setCache(element.ownerDocument, "roles_with_given_types", roles); + } + return roles; + }; + /** + * return the roles with given role type. + * + * @parm {element} element - The element to start the node walk on to find parent node + * @parm {array} roleTyples - role types, such as 'widget', 'structure' etc. + * + * @return {array} roles - A parent node of the element passed in, which has the provided role + * + * @memberOf AriaUtil + */ + AriaUtil.isWidget = function (element) { + if (!element) + return false; + var widget = CacheUtil_1.CacheUtil.getCache(element.ownerDocument, "is_element_widget", null); + if (widget === null) { + var ret = false; + var role = AriaUtil.getResolvedRole(element); + if (role && ARIADefinitions_1.ARIADefinitions.designPatterns[role] && ARIADefinitions_1.ARIADefinitions.designPatterns[role].roleType === 'widget') + ret = true; + CacheUtil_1.CacheUtil.setCache(element.ownerDocument, "is_element_widget", ret); + return ret; + } + return widget; + }; + /** + * return if the element is owned or controlled by another element. + * If an ancestor of an element is owned or controlled by another element, then the element is also considered as owned or controlled. + * an element can be owned or controlled by another element through aria-owns or aria-controls + * when the DOM hierarchy cannot be used to represent the relationship. + * aria-owns attribute is used to define contextual relationship with a owning parent + * aria-controls attribute is used to associate an element with the controlling element. + * example elements with roles: combobox, scrollbar, tab, button, listbox, menu, menubar, radiogroup, tree, treegrid + * + * when an element is owned or controlled by another element, its navigation may be controlled by the parent + * through aria-activedescendants attribute or roving tabindex + * + * Note navigation with native combobox (input with a datalist) is in native focus navigation, not considered here + * + * @parm {element} element - The element to inspect + * @return {boolean} + * + * @memberOf AriaUtil + */ + AriaUtil.isNavigationOwnedOrControlled = function (element) { + if (!element) + return false; + var ownerElems = CacheUtil_1.CacheUtil.getCache(element.ownerDocument, "AriaUtil_NavigationOwnedOrControlled", null); + if (ownerElems !== null && ownerElems.length > 0) { + if (CommonUtil_1.CommonUtil.getAncestor(element, ownerElems)) + return true; + } + var role = AriaUtil.getResolvedRole(element); + if (!role) + return false; + var id = element.getAttribute("id"); + if (!id || id.trim().length === 0) + return false; + var elem = element.ownerDocument.querySelector("*[aria-controls~='".concat(id, "'], *[aria-owns~='").concat(id, "']")); + if (!elem) + return false; + var containers = ['combobox', 'scrollbar', 'button', 'tab', 'listbox', 'menu', 'menubar', 'radiogroup', 'tree', 'treegrid']; + if (containers.includes(role)) { + if (ownerElems === null) + ownerElems = []; + ownerElems.push(element); + CacheUtil_1.CacheUtil.setCache(element.ownerDocument, "AriaUtil_NavigationOwnedOrControlled", ownerElems); + return true; + } + return false; + }; + /** + * This function is responsible for finding a node which matches the role and is a sibling of the + * provided element. + * + * This function by default will not consider Check Hidden Setting at all. + * + * Note: This is a wrapper function to: AriaUtil.getSiblingWithRoleHidden + * + * @parm {element} element - The element to start the node walk on to find sibling node + * @parm {string} role - The role to search for on an element under the provided element + * + * @return {node} walkNode - A sibling node of the element passed in, which has the provided role + * + * @memberOf AriaUtil + */ + AriaUtil.getSiblingWithRole = function (element, role) { + return AriaUtil.getSiblingWithRoleHidden(element, role, false); + }; + /** + * This function is responsible for finding a node which matches the role and is a sibling of the + * provided element. + * + * This function also considers implicit roles for the elements. + * + * This function will also consider elements that are hidden based on the if the Check + * Hidden Content settings should be considered or not. + * + * @parm {element} element - The element to start the node walk on to find sibling node + * @parm {string} role - The role to search for on an element under the provided element + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * @parm {bool} considerImplicit - true or false based on if Implicit roles should be considered. + * + * @return {node} walkNode - A sibling node of the element passed in, which has the provided role + * + * @memberOf AriaUtil + */ + AriaUtil.getSiblingWithRoleHidden = function (element, role, considerHiddenSetting, considerImplicitRole) { + // Variable Declaration + var walkNode = null; + var hasRole = false; + // Only perform the check if element and role are both provided + if (element && role) { + // Fetch the next sibling element + walkNode = element.nextSibling; + // Keep looping over the next siblings to find element which matches + // the provided role. + while (walkNode !== null && !hasRole) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (considerHiddenSetting && CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(walkNode)) { + // Move on to the next node + walkNode = walkNode.nextSibling; + continue; + } + // Check if this node has the role that we need to check exists + if (considerImplicitRole) { + hasRole = AriaUtil.hasRoleInSemantics(walkNode, role); + } + else { + hasRole = AriaUtil.hasRole(walkNode, role, false); + } + // Move on to the next node + walkNode = walkNode.nextSibling; + } + // If we still have not found a node that matches the role, start a reverse look up + if (!walkNode) { + // Fetch the previous Sibling of this element + walkNode = element.previousSibling; + // Keep looping over all the previous siblings to search for an element which + // matches the provided role. + while (walkNode !== null && !hasRole) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (considerHiddenSetting && CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(walkNode)) { + // Move on to the next node + walkNode = walkNode.previousSibling; + continue; + } + // Check if this node has the role that we need to check exists + hasRole = AriaUtil.hasRole(walkNode, role, considerImplicitRole); + // Move on to the next node + walkNode = walkNode.previousSibling; + } + } + } + return walkNode; + }; + /** + * This function is responsible for getting a descendant element with the specified role, under + * the element that was provided. + * + * Note by default this function will not consider the Check Hidden Content Setting. + * + * Note: This is a wrapper function to: AriaUtil.getDescendantWithRoleHidden + * + * @parm {element} element - parent element for which we will be checking descendants for + * @parm {string} roleName - The role to look for on the descendant's elements + * + * @return {node} - The descendant element that matches the role specified (only one) + * + * @memberOf AriaUtil + */ + AriaUtil.getDescendantWithRole = function (element, roleName) { + return AriaUtil.getDescendantWithRoleHidden(element, roleName, false); + }; + /** + * This function is responsible for getting a descendant element with the specified role, under + * the element that was provided. This function aslo finds elements with implicit roles. + * + * @parm {element} element - parent element for which we will be checking descendants for + * @parm {string} roleName - The role to look for on the descendant's elements + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {node} - The descendant element that matches the role specified (only one) + * + * @memberOf AriaUtil + */ + AriaUtil.getDescendantWithRoleHidden = function (element, roleName, considerHiddenSetting, considerImplicitRoles) { + // Variable Decleration + var descendant = null; + var nw = new DOMWalker_1.DOMWalker(element); + // Loop over all the childrens of the element provided and check if the rolename provided exists + while (nw.nextNode() && nw.node != element && nw.node != element.nextSibling) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (considerHiddenSetting && CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(nw.node)) { + continue; + } + // Check if this node has the role specified, if it does then set this as the descendant and stop checking the rest of the + // nodes. + // Check if this node has the implicit roles, if it does then set this as the descendant and stop checking the rest of the + // nodes. + if (considerImplicitRoles ? AriaUtil.hasRoleInSemantics(nw.node, roleName) : AriaUtil.hasRole(nw.node, roleName, false)) { + descendant = nw.node; + break; + } + } + return descendant; + }; + /** + * This function is responsible for getting All descendant elements with the specified roles, under + * the element that was provided. This function aslo finds elements with implicit roles. + * + * @parm {element} element - parent element for which we will be checking descendants for + * @parm {string[]} roleNames - The roles to look for on the descendant's elements + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {node[]} - all descendant elements that match the roles specified + * + * @memberOf AriaUtil + */ + AriaUtil.getAllDescendantsWithRoles = function (element, roleNames, considerHiddenSetting, considerImplicitRoles) { + if (!roleNames || roleNames.length === 0) + return; + // Variable Decleration + var descendants = []; + roleNames.forEach(function (roleName) { + var kids = AriaUtil.getAllDescendantsWithRoleHidden(element, roleName, considerHiddenSetting, considerImplicitRoles); + if (kids && kids.length > 0) + descendants = descendants.concat(kids); + }); + return descendants; + }; + /** + * This function is responsible for getting All descendant elements with the specified role, under + * the element that was provided. This function aslo finds elements with implicit roles. + * + * @parm {element} element - parent element for which we will be checking descendants for + * @parm {string} roleName - The role to look for on the descendant's elements + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {node[]} - The descendant elements that match the role specified + * + * @memberOf AriaUtil + */ + AriaUtil.getAllDescendantsWithRoleHidden = function (element, roleName, considerHiddenSetting, considerImplicitRoles) { + // Variable Decleration + var descendants = []; + var nw = new DOMWalker_1.DOMWalker(element); + // Loop over all the childrens of the element provided and check if the rolename provided exists + while (nw.nextNode() && nw.node != element && nw.node != element.nextSibling) { + if (nw.bEndTag) { + continue; + } + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (considerHiddenSetting && CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(nw.node)) { + continue; + } + // Check if this node has the role specified, if it does then set this as the descendant and stop checking the rest of the + // nodes. + // Check if this node has the implicit roles, if it does then set this as the descendant and stop checking the rest of the + // nodes. + if (AriaUtil.hasRole(nw.node, roleName, considerImplicitRoles)) { + descendants.push(nw.node); + } + } + return descendants; + }; + /** + * This function is responsible for getting All direct children in AT tree with a role (exclude none and presentation) + * + * @parm {element} element - parent element for which we will be checking children for + * @return {node} - The direct child elements in AT tree that has a role + * + * @memberOf AriaUtil + */ + AriaUtil.getDirectATChildren = function (element) { + var requiredChildRoles = AriaUtil.getRequiredChildRoles(element, true); + var direct = []; + AriaUtil.retrieveDirectATChildren(element, requiredChildRoles, direct); + return direct; + }; + /** + * This function is responsible for recursively any child path till either no child or a child with a role is found (exclude none and presentation) + * + * @parm {element} element - parent element for which we will be checking children for + * @return {node} - The direct child elements in AT tree + * + * @memberOf AriaUtil + */ + AriaUtil.retrieveDirectATChildren = function (element, requiredChildRoles, direct) { + var children = []; + if (element.children !== null && element.children.length > 0) { + for (var i = 0; i < element.children.length; i++) { + children.push(element.children[i]); + } + } + // if the element contains "aria-own" attribute, then the aria-owned children need to be included too + var owned = element.getAttribute("aria-owns"); + if (owned) { + var doc = element.ownerDocument; + if (doc) { + var ownedIds = owned.split(" "); + for (var i = 0; i < ownedIds.length; i++) { + var ownedElem = doc.getElementById(ownedIds[i]); + if (ownedElem) { + children.push(ownedElem); + } + } + } + } + if (children.length > 0) { + for (var i = 0; i < children.length; i++) { + //ignore hidden and invisible child + if (VisUtil_1.VisUtil.isNodeHiddenFromAT(children[i]) || !VisUtil_1.VisUtil.isNodeVisible(children[i])) + continue; + var roles = AriaUtil.getRoles(children[i], false); + if (roles === null || roles.length === 0) { + roles = AriaUtil.getImplicitRole(children[i]); + } + if (roles && roles !== null && roles.length > 0) { + //remove 'none' and 'presentation' + roles = roles.filter(function (role) { + return role !== "none" && role !== "presentation"; + }); + // a 'group' role is allowed but not required for some elements so remove it if exists + if (roles.includes("group") && requiredChildRoles && requiredChildRoles.includes('group')) { + roles = roles.filter(function (role) { + return role !== 'group'; + }); + } + } + if (roles && roles !== null && roles.length > 0) { + direct.push(children[i]); + } + else { + // recursive until get a return value, + AriaUtil.retrieveDirectATChildren(children[i], requiredChildRoles, direct); + } + } + return null; + } + else + return null; + }; + /** + * this function returns null or required child roles for a given element with one more roles, + * return null if the role is 'none' or 'presentation' + * @param element + * @param includeImplicit include implicit roles if no role is explicitly provided + * @returns + */ + AriaUtil.getRequiredChildRoles = function (element, includeImplicit) { + var roles = AriaUtil.getRoles(element, false); + // if explicit role doesn't exist, get the implicit one + if ((!roles || roles.length === 0) && includeImplicit) { + roles = AriaUtil.getImplicitRole(element); + } + /** + * ignore if the element doesn't have any explicit or implicit role + */ + if (!roles || roles.length === 0) { + return null; + } + /** + * ignore if the element contains none or presentation role + */ + var presentationRoles = ["none", "presentation"]; + var found = roles.some(function (r) { return presentationRoles.includes(r); }); + if (found) + return null; + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + var requiredChildRoles = new Array(); + for (var j = 0; j < roles.length; ++j) { + if (designPatterns[roles[j]] && designPatterns[roles[j]].reqChildren !== null) { + requiredChildRoles = CommonUtil_1.CommonUtil.concatUniqueArrayItemList(designPatterns[roles[j]].reqChildren, requiredChildRoles); + } + } + return requiredChildRoles; + }; + /** + * This function is responsible for getting an element referenced by aria-owns and has the + * role that was specified. + * + * Note by default this function will not consider the Check Hidden Content Setting. + * + * Note: This is a wrapper function to: AriaUtil.getAriaOwnsWithRoleHidden + * + * @parm {element} element - Element to check for aria-owns + * @parm {string} roleName - The role to look for on the aria-owns element + * + * @return {node} - The element that is referenced by aria-owns and has role specified. + * + * @memberOf AriaUtil + */ + AriaUtil.getAriaOwnsWithRole = function (element, roleName) { + return AriaUtil.getAriaOwnsWithRoleHidden(element, roleName, false); + }; + /** + * This function is responsible for getting an element referenced by aria-owns and has the + * role that was specified. This function aslo finds elements with implicit roles. + * + * @parm {element} element - Element to check for aria-owns + * @parm {string} roleName - The role to look for on the aria-owns element + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {node} - The element that is referenced by aria-owns and has role specified. + * + * @memberOf AriaUtil + */ + AriaUtil.getAriaOwnsWithRoleHidden = function (element, roleName, considerHiddenSetting, considerImplicitRoles) { + // Variable Decleration + var referencedElement = null; + var referencedElemHasRole = false; + // In the case aria-owns is not on the element just break out of this function with null + if (CommonUtil_1.CommonUtil.attributeNonEmpty(element, "aria-owns")) { + // Get the reference ID + var referenceID = element.getAttribute("aria-owns"); + // Get the element for the reference ID + referencedElement = fragment_1.FragmentUtil.getById(element, referenceID); + //ignore if the aria-owns point to the element itself + if (DOMUtil_1.DOMUtil.sameNode(element, referencedElement)) + return null; + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + if (considerHiddenSetting && referencedElement != null && CommonUtil_1.CommonUtil.shouldNodeBeSkippedHidden(referencedElement)) { + referencedElemHasRole = null; + } + else { + referencedElemHasRole = AriaUtil.hasRole(referencedElement, roleName, considerImplicitRoles); + } + } + return referencedElemHasRole ? referencedElement : null; + }; + // Return true if the element has an ARIA label + AriaUtil.hasAriaLabel = function (element) { + // Rpt_Aria_ValidIdRef determines if the aria-labelledby id points to a valid element + return CommonUtil_1.CommonUtil.attributeNonEmpty(element, "aria-label") || CommonUtil_1.CommonUtil.attributeNonEmpty(element, "aria-labelledby"); + }; + // Given an array of elements, return true if the elements have unique ARIA labels + AriaUtil.hasUniqueAriaLabelsLocally = function (elements, isGlobal) { + if (elements.length === 0) + return false; + var doc = elements[0].ownerDocument; + var hasDuplicateLabels = false; + var uniqueAriaLabels = null; + if (isGlobal) { + uniqueAriaLabels = CacheUtil_1.CacheUtil.getCache(doc, "AriaUtil_HAS_UNIQUE_ARIA_LABELS", null); + } + if (uniqueAriaLabels === null) { + uniqueAriaLabels = {}; + } + for (var i = 0; !hasDuplicateLabels && i < elements.length; ++i) { + if (elements[i].hasAttribute) { + if (elements[i].hasAttribute("aria-label")) { + var ariaLabel = CommonUtil_1.CommonUtil.normalizeSpacing(elements[i].getAttribute("aria-label")).toLowerCase(); + hasDuplicateLabels = ariaLabel in uniqueAriaLabels; + uniqueAriaLabels[ariaLabel] = true; + } + else if (elements[i].hasAttribute("aria-labelledby")) { + var labelID = elements[i].getAttribute("aria-labelledby"); + var labelNode = fragment_1.FragmentUtil.getById(elements[i], labelID); + var label = ""; + if (labelNode && !DOMUtil_1.DOMUtil.sameNode(labelNode, elements[i])) { + label = AriaUtil.getTextContentExcludingScripts(labelNode); + } + var normalizedLabel = CommonUtil_1.CommonUtil.normalizeSpacing(label).toLowerCase(); + hasDuplicateLabels = normalizedLabel in uniqueAriaLabels; + uniqueAriaLabels[normalizedLabel] = true; + } + else { + // Has no label at all + hasDuplicateLabels = true; + } + } + } + if (isGlobal) { + CacheUtil_1.CacheUtil.setCache(doc, "AriaUtil_HAS_UNIQUE_ARIA_LABELS", uniqueAriaLabels); + } + return !hasDuplicateLabels; + }; + /** + * Get text content from an element, excluding script and style elements + * This is a simplified version that doesn't go through full accessible name computation + * to avoid circular dependencies when called from getAriaLabel + * + * Note: When an element is referenced by aria-labelledby, its content is included + * even if the element is hidden (per ARIA spec) + */ + AriaUtil.getTextContentExcludingScripts = function (elem) { + if (!elem) + return ""; + var text = ""; + var nw = new DOMWalker_1.DOMWalker(elem); + while (nw.nextNode() && nw.node !== elem && nw.node !== elem.parentNode) { + if (nw.bEndTag) + continue; + var node = nw.node; + var nodeName = node.nodeName ? node.nodeName.toLowerCase() : ""; + // Skip script and style elements + if (nodeName === 'script' || nodeName === 'style') { + nw.bEndTag = true; // Skip children + continue; + } + if (node.nodeType === 3) { // Text node + // Include text even from hidden elements when referenced by aria-labelledby + if (node.nodeValue && node.nodeValue.trim().length > 0) { + text += " " + node.nodeValue.trim(); + } + } + else if (node.nodeType === 1) { // Element node + // Handle images - get alt text + if (nodeName === 'img' && node.hasAttribute('alt')) { + text += " " + node.getAttribute('alt').trim(); + nw.bEndTag = true; // Skip children of img + } + // Handle input with type="image" - get alt text + else if (nodeName === 'input' && node.getAttribute('type') === 'image' && node.hasAttribute('alt')) { + text += " " + node.getAttribute('alt').trim(); + nw.bEndTag = true; // Skip children + } + } + } + return text.trim(); + }; + AriaUtil.getAriaLabel = function (ele) { + if (ele.hasAttribute) { + if (ele.hasAttribute("aria-labelledby")) { + var labelIDs = ele.getAttribute("aria-labelledby").trim().split(" "); + var normalizedLabel = ""; + for (var j = 0, length_1 = labelIDs.length; j < length_1; ++j) { + var labelID = labelIDs[j]; + var labelNode = fragment_1.FragmentUtil.getById(ele, labelID); + if (labelNode && !DOMUtil_1.DOMUtil.sameNode(labelNode, ele)) { + // Use our helper to get text content without circular dependency + var label = AriaUtil.getTextContentExcludingScripts(labelNode); + normalizedLabel += CommonUtil_1.CommonUtil.normalizeSpacing(label); + } + } + return normalizedLabel.trim(); + } + else if (ele.hasAttribute("aria-label")) { + return CommonUtil_1.CommonUtil.normalizeSpacing(ele.getAttribute("aria-label")).trim(); + } + } + return ""; + }; + AriaUtil.getAriaDescription = function (ele) { + if (!ele) + return ""; + var normalizedLabel = ""; + var desc = ele.getAttribute("aria-labelledby"); + if (desc && desc.trim().length > 0) { + var labelIDs = desc.trim().split(" "); + for (var j = 0, length_2 = labelIDs.length; j < length_2; ++j) { + var labelID = labelIDs[j]; + var labelNode = fragment_1.FragmentUtil.getById(ele, labelID); + if (labelNode && !DOMUtil_1.DOMUtil.sameNode(labelNode, ele)) { + var label = AriaUtil.getTextContentExcludingScripts(labelNode); + if (label && label.trim().length > 0) + normalizedLabel += CommonUtil_1.CommonUtil.normalizeSpacing(label).toLowerCase(); + } + } + if (normalizedLabel.trim().length > 0) + return normalizedLabel.trim(); + } + desc = ele.getAttribute("aria-description"); + if (desc && desc.trim().length > 0) + return desc.trim().toLowerCase(); + return ""; + }; + AriaUtil.findAriaLabelDupes = function (elements) { + var dupeMap = {}; + elements.forEach(function (ele) { + dupeMap[AriaUtil.getAriaLabel(ele)] = (dupeMap[AriaUtil.getAriaLabel(ele)] || 0) + 1; + }); + return dupeMap; + }; + /** + * return accessible names for all AT visible landmark elements + * @param doc + * @returns + */ + AriaUtil.getLandmarkAccNames = function (doc) { + var nameMap = CacheUtil_1.CacheUtil.getCache(doc, "AriaUtil_Landmark_AccNames", null); + if (nameMap && nameMap.length !== 0) + return nameMap; + nameMap = []; + var landmarkElems = doc.querySelectorAll('aside,[role="complementary"], footer,[role="contentinfo"], header,[role="banner"], main,[role="main"], nav,[role="navigation"], form,[role="form"], section,[role="region"], article,[role="article"], [role="search"],[role="application"],[role="document"]'); + if (landmarkElems.length === 0) { + CacheUtil_1.CacheUtil.setCache(doc, "AriaUtil_Landmark_AccNames", nameMap); + return nameMap; + } + landmarkElems.forEach(function (elem) { + // ignore node that is AT hidden or in a dialog that is considered as a separate location from the rest of the main page + if (!VisUtil_1.VisUtil.isNodeHiddenFromAT(elem) && CommonUtil_1.CommonUtil.getAncestor(elem, ["DIALOG"]) === null && AriaUtil.getAncestorWithRole(elem, "dialog", true) === null) { + var name_1 = ""; + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(elem); + if (pair && pair.name && pair.name.trim().length > 0) + name_1 = pair.name.trim(); + // check neested landmark to calculate the accessible name + var ancestors = __spreadArray([], landmarkElems, true).filter(function (e) { return e.contains(elem) && e !== elem; }); + if (ancestors.length > 1) { + ancestors.forEach(function (ancestor) { + var ancestor_pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(ancestor); + if (ancestor_pair && ancestor_pair.name && ancestor_pair.name.trim().length > 0) + name_1 = ancestor_pair.name.trim() + " " + name_1; + }); + } + var role = AriaUtil.getResolvedRole(elem); + nameMap.push({ "elem": elem, "role": role, "name": name_1 }); + } + }); + CacheUtil_1.CacheUtil.setCache(doc, "AriaUtil_Landmark_AccNames", nameMap); + return nameMap; + }; + /** + * check if the given element with the landmark rolw is unique + * @param element + * @param role: a specific landmark role, or "any" for all landmark role + * @param considerNoneLabel: if consider the landmarks without a label + * @returns + */ + AriaUtil.isLandmarkNameUnique = function (element, role, considerNoneLabel) { + if (considerNoneLabel === void 0) { considerNoneLabel = false; } + var nameMap = AriaUtil.getLandmarkAccNames(element.ownerDocument); + var exist = null; + if (role === 'any') + exist = nameMap.find(function (entry) { return entry.elem === element; }); + else + exist = nameMap.find(function (entry) { return entry.elem === element && entry.role === role; }); + if (!exist) + return null; + var name = exist.name; + if (!considerNoneLabel && name === '') + return null; + for (var i = 0; i < nameMap.length; i++) { + if (nameMap[i].elem === element) + continue; + if (name === nameMap[i].name) { + if (role === 'any') + return true; + else if (nameMap[i].role === role) + return true; + } + } + return false; + }; + // Given an array of elements, return true if the elements have unique ARIA labels globally + AriaUtil.hasUniqueAriaLabels = function (elements) { + return AriaUtil.hasUniqueAriaLabelsLocally(elements, true); + }; + // Given an array of elements, return true if the elements have unique ARIA labels + AriaUtil.hasDuplicateAriaLabelsLocally = function (elements, isGlobal) { + if (elements.length === 0) + return false; + var doc = elements[0].ownerDocument; + var hasDuplicateLabels = false; + var uniqueAriaLabels = null; + var duplicateLabelNameArray = new Array(); + if (isGlobal) { + uniqueAriaLabels = CacheUtil_1.CacheUtil.getCache(doc, "AriaUtil_HAS_UNIQUE_ARIA_LABELS", null); + } + if (uniqueAriaLabels === null) { + uniqueAriaLabels = {}; + } + for (var i = 0; i < elements.length; ++i) { + if (elements[i].hasAttribute) { + if (elements[i].hasAttribute("aria-label")) { + var ariaLabel = CommonUtil_1.CommonUtil.normalizeSpacing(elements[i].getAttribute("aria-label")).toLowerCase(); + hasDuplicateLabels = ariaLabel in uniqueAriaLabels; + uniqueAriaLabels[ariaLabel] = true; + if (!(ariaLabel in duplicateLabelNameArray)) { + duplicateLabelNameArray[ariaLabel] = new Array(); + } + duplicateLabelNameArray[ariaLabel].push(elements[i].nodeName.toLowerCase()); + } + else if (elements[i].hasAttribute("aria-labelledby")) { + var labelIDs = elements[i].getAttribute("aria-labelledby").trim().split(" "); + var normalizedLabel = ""; + for (var j = 0, length_3 = labelIDs.length; j < length_3; ++j) { + var labelID = labelIDs[j]; + var labelNode = fragment_1.FragmentUtil.getById(elements[i], labelID); + if (labelNode && !DOMUtil_1.DOMUtil.sameNode(labelNode, elements[i])) { + var label = AriaUtil.getTextContentExcludingScripts(labelNode); + normalizedLabel += CommonUtil_1.CommonUtil.normalizeSpacing(label).toLowerCase(); + } + } + hasDuplicateLabels = normalizedLabel in uniqueAriaLabels; + uniqueAriaLabels[normalizedLabel] = true; + if (!(normalizedLabel in duplicateLabelNameArray)) { + duplicateLabelNameArray[normalizedLabel] = new Array(); + } + duplicateLabelNameArray[normalizedLabel].push(elements[i].nodeName.toLowerCase()); + } + } + } + if (isGlobal) { + CacheUtil_1.CacheUtil.setCache(doc, "AriaUtil_HAS_UNIQUE_ARIA_LABELS", uniqueAriaLabels); + } + return duplicateLabelNameArray; + }; + // Given an array of elements, return true if the elements have unique ARIA labels globally + AriaUtil.hasDuplicateAriaLabels = function (elements) { + return AriaUtil.hasDuplicateAriaLabelsLocally(elements, true); + }; + // Given an array of elements, return true if the elements have unique aria-labelledby attributes + AriaUtil.hasUniqueAriaLabelledby = function (elements) { + var hasDuplicateLabels = false; + var labelRefs = {}; + for (var i = 0; !hasDuplicateLabels && i < elements.length; ++i) { + if (elements[i].hasAttribute && elements[i].hasAttribute("aria-labelledby") && !CommonUtil_1.CommonUtil.isIdReferToSelf(elements[i], elements[i].getAttribute("aria-labelledby"))) { + var labelRef = CommonUtil_1.CommonUtil.normalizeSpacing(elements[i].getAttribute("aria-labelledby")); + hasDuplicateLabels = labelRef in labelRefs; + labelRefs[labelRef] = true; + } + else { + hasDuplicateLabels = true; + } + } + return !hasDuplicateLabels; + }; + /** + * this function is responsible for resolving ARIA requirements for an HTML element per ARIA in HTML + * @param ruleContext the HTML element to be examined + * @returns + */ + AriaUtil.getElementAriaProperty = function (ruleContext) { + var tagProperty = CacheUtil_1.CacheUtil.getCache(ruleContext, "AriaUtil_ElementAriaProperty", null); + if (!tagProperty) { + var tagName = null; + var name_2 = null; + if (ruleContext.tagName) { + tagName = ruleContext.tagName.toLowerCase(); + } + else if (ruleContext.nodeName) { + tagName = ruleContext.nodeName.toLowerCase(); + } + // check if the tagProperty exists in the documentConformanceRequirement hash. + tagProperty = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirement[tagName]; + // The tag needs to check some special attributes + if (tagProperty === null || tagProperty === undefined) { + var specialTagProperties = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirementSpecialTags[tagName]; + switch (tagName) { // special cases + case "a": + ruleContext.hasAttribute("href") ? tagProperty = specialTagProperties["with-href"] : tagProperty = specialTagProperties["without-href"]; + break; + case "area": + ruleContext.hasAttribute("href") ? tagProperty = specialTagProperties["with-href"] : tagProperty = specialTagProperties["without-href"]; + break; + case "figure": { + var fcs = CommonUtil_1.CommonUtil.getChildByTag(ruleContext, "figcaption"); + fcs !== null && fcs.length > 0 ? tagProperty = specialTagProperties["child-figcaption"] : tagProperty = specialTagProperties["no-child-figcaption"]; + break; + } + case "footer": + case "header": + if (AriaUtil.getAncestorWithRole(ruleContext, "article", true) !== null || AriaUtil.getAncestorWithRole(ruleContext, "complementary", true) !== null + || AriaUtil.getAncestorWithRole(ruleContext, "navigation", true) !== null || AriaUtil.getAncestorWithRole(ruleContext, "region", true) !== null + || CommonUtil_1.CommonUtil.getAncestor(ruleContext, ["article", "aside", "main", "nav", "section"]) !== null) + tagProperty = specialTagProperties["des-section-article-aside-main-nav"]; + else + tagProperty = specialTagProperties["other"]; + break; + case "img": + var alt = ruleContext.hasAttribute("alt") ? ruleContext.getAttribute("alt") : null; + var title = ruleContext.hasAttribute("title") ? ruleContext.getAttribute("title") : null; + if (AriaUtil.getAriaLabel(ruleContext).trim().length !== 0 || (alt !== null && alt.length > 0) || (title !== null && title.length > 0)) { + // If the img has non-empty alt (alt="some text" or alt=" ") or an accessible name is provided + tagProperty = specialTagProperties["img-with-accname"]; + } + else { + if (alt !== null) { + // If the img has an empty alt (alt="") + tagProperty = specialTagProperties["img-without-accname-empty-alt"]; + } + else { + // If the img lacks an alt attribute + tagProperty = specialTagProperties["img-without-accname-no-alt"]; + } + } + break; + case "input": + if (CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "type")) { + var type = ruleContext.getAttribute("type").trim().toLowerCase(); + tagProperty = specialTagProperties[type]; + if (tagProperty === null || tagProperty === undefined) { + switch (type) { + case "checkbox": + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "aria-pressed") ? tagProperty = specialTagProperties["checkbox-with-aria-pressed"] : tagProperty = specialTagProperties["checkbox-without-aria-pressed"]; + break; + case "email": + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["email-with-list"] : tagProperty = specialTagProperties["email-no-list"]; + break; + case "search": + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["search-with-list"] : tagProperty = specialTagProperties["search-no-list"]; + break; + case "tel": + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["tel-with-list"] : tagProperty = specialTagProperties["tel-no-list"]; + break; + case "text": + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["text-with-list"] : tagProperty = specialTagProperties["text-no-list"]; + break; + case "url": + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["url-with-list"] : tagProperty = specialTagProperties["url-no-list"]; + break; + default: + // default + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["default-with-list"] : tagProperty = specialTagProperties["default-no-list"]; + break; + } + } + } + else { + // default type is the same as type=text + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "list") ? tagProperty = specialTagProperties["text-with-list"] : tagProperty = specialTagProperties["text-no-list"]; + } + break; + case "li": + specialTagProperties = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirementSpecialTags["li"]; + if (ruleContext.parentElement && AriaUtil.hasRoleInSemantics(ruleContext.parentElement, "list")) + tagProperty = specialTagProperties["child-of-list-role"]; + else + tagProperty = specialTagProperties["no-child-of-list-role"]; + break; + case "section": + //name = ARIAMapper.computeName(ruleContext); + //if (name && name.trim().length > 0) { + var label = AriaUtil.getAriaLabel(ruleContext); + if ((label && label.trim().length > 0) || CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "title")) { + tagProperty = specialTagProperties["with-name"]; + } + else { + tagProperty = specialTagProperties["without-name"]; + } + break; + case "select": + specialTagProperties = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirementSpecialTags["select"]; + if (ruleContext.hasAttribute("multiple") || + CommonUtil_1.CommonUtil.attributeNonEmpty(ruleContext, "size") && ruleContext.getAttribute("size") > 1) + tagProperty = specialTagProperties["multiple-attr-size-gt1"]; + else + tagProperty = specialTagProperties["no-multiple-attr-size-gt1"]; + break; + case "summary": + specialTagProperties = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirementSpecialTags["summary"]; + if (ruleContext.parentElement && ruleContext.parentElement.nodeName.toLowerCase() === 'details' + && DOMUtil_1.DOMUtil.sameNode(__spreadArray([], ruleContext.parentElement.children, true).filter(function (elem) { return elem.nodeName.toLowerCase() === 'summary'; })[0], ruleContext)) + tagProperty = specialTagProperties["first-summary-of-detail"]; + else + tagProperty = specialTagProperties["no-first-summary-of-detail"]; + break; + case "tbody": + case "td": + case "tr": + if (AriaUtil.getAncestorWithRole(ruleContext, "table", true) !== null) { + tagProperty = specialTagProperties["des-table"]; + } + else { + AriaUtil.getAncestorWithRole(ruleContext, "grid", true) || AriaUtil.getAncestorWithRole(ruleContext, "treegrid", true) ? tagProperty = specialTagProperties["des-grid"] : tagProperty = specialTagProperties["des-other"]; + } + break; + case "th": + var scope = CommonUtil_1.CommonUtil.getScopeForTh(ruleContext); + if (AriaUtil.getAncestorWithRole(ruleContext, "table", true) !== null) { + if (scope === 'column') + tagProperty = specialTagProperties["des-table-column-scope"]; + else + tagProperty = specialTagProperties["des-table-row-scope"]; + } + else if (AriaUtil.getAncestorWithRole(ruleContext, "grid", true) !== null || AriaUtil.getAncestorWithRole(ruleContext, "treegrid", true) !== null) { + if (scope === 'column') + tagProperty = specialTagProperties["des-grid-treegrid-column-scope"]; + else + tagProperty = specialTagProperties["des-grid-treegrid-row-scope"]; + } + else + tagProperty = specialTagProperties["des-other"]; + break; + case "div": + var prt = ruleContext.parentElement; + prt !== null && prt.nodeName.toLowerCase() === 'dl' ? tagProperty = specialTagProperties["child-dl"] : tagProperty = specialTagProperties["no-child-dl"]; + break; + default: + tagProperty = ARIADefinitions_1.ARIADefinitions.documentConformanceRequirementSpecialTags["default"]; + } //switch + } + } + CacheUtil_1.CacheUtil.setCache(ruleContext, "AriaUtil_ElementAriaProperty", tagProperty); + return tagProperty || null; + }; + AriaUtil.getAllowedAriaRoles = function (ruleContext, properties) { + var allowedRoles = CacheUtil_1.CacheUtil.getCache(ruleContext, "AriaUtil_AllowedAriaRoles", null); + if (!allowedRoles) { + allowedRoles = []; + var tagProperty = null; + if (properties !== null && properties !== undefined) { + tagProperty = properties; + } + else { + tagProperty = AriaUtil.getElementAriaProperty(ruleContext); + } + if (tagProperty !== null && tagProperty !== undefined) { + if (tagProperty.implicitRole !== null) { + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(tagProperty.implicitRole, allowedRoles); + } + if (tagProperty.validRoles !== null) { + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(tagProperty.validRoles, allowedRoles); + } + var implicitRoles = AriaUtil.getImplicitRole(ruleContext); + if (implicitRoles && implicitRoles.length > 0) { + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(tagProperty.validRoles, allowedRoles); + } + } + CacheUtil_1.CacheUtil.setCache(ruleContext, "AriaUtil_AllowedAriaRoles", allowedRoles); + } + return allowedRoles; + }; + AriaUtil.getAllowedAriaAttributes = function (ruleContext, roles, properties) { + var allowedAttributes = CacheUtil_1.CacheUtil.getCache(ruleContext, "AriaUtil_AllowedAriaAttributes", null); + if (!allowedAttributes) { + allowedAttributes = []; + var permittedRoles = __spreadArray([], roles, true); + var tagName = ruleContext.tagName.toLowerCase(); + var prohibitedAttributes = []; + // Element with a disabled attribute https://www.w3.org/TR/html5/disabled-elements.html + if (ARIADefinitions_1.ARIADefinitions.elementsAllowedDisabled.indexOf(tagName) > -1) { + // Use the aria-disabled attribute on any element that is allowed the disabled attribute in HTML5. + allowedAttributes = CommonUtil_1.CommonUtil.concatUniqueArrayItem("aria-disabled", allowedAttributes); + } + // Element with a required attribute http://www.the-art-of-web.com/html/html5-form-validation/ + if (ARIADefinitions_1.ARIADefinitions.elementsAllowedRequired.indexOf(tagName) > -1) { + // Use the aria-required attribute on any element that is allowed the required attribute in HTML5. + allowedAttributes = CommonUtil_1.CommonUtil.concatUniqueArrayItem("aria-required", allowedAttributes); + } + if (ARIADefinitions_1.ARIADefinitions.elementsAllowedReadOnly.indexOf(tagName) > -1) { + // Use the aria-readonly attribute on any element that is allowed the readonly attribute in HTML5. + allowedAttributes = CommonUtil_1.CommonUtil.concatUniqueArrayItem("aria-readonly", allowedAttributes); + } + var tagProperty = null; + if (properties != null && properties !== undefined) + tagProperty = properties; + else + tagProperty = AriaUtil.getElementAriaProperty(ruleContext); + if (tagProperty !== null && tagProperty !== undefined) { + // add the implicit role allowed attributes to the allowed role list if there is no specified role + // ignore if the element doesn't allow the attributes from the implicit roles + if (tagProperty.implicitRole !== null && + (permittedRoles === null || permittedRoles === undefined || permittedRoles.length === 0) + && tagProperty.allowAttributesFromImplicitRole === undefined) { + for (var i = 0; i < tagProperty.implicitRole.length; i++) { + var roleProperty = ARIADefinitions_1.ARIADefinitions.designPatterns[tagProperty.implicitRole[i]]; + if (roleProperty !== null && roleProperty !== undefined) { + var properties_1 = roleProperty.props; + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(properties_1, allowedAttributes); + properties_1 = AriaUtil.getRoleRequiredProperties(tagProperty.implicitRole[i], ruleContext); + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(properties_1, allowedAttributes); + var prohibitedProps = roleProperty.prohibitedProps; + if (prohibitedProps && prohibitedProps.length > 0) + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(prohibitedProps, prohibitedAttributes); + // special case of separator + if (tagProperty.implicitRole[i] === "separator" && CommonUtil_1.CommonUtil.isFocusable(ruleContext)) { + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(["aria-disabled", "aria-valuenow", "aria-valuemax", "aria-valuemin", "aria-valuetext"], allowedAttributes); + } + } + } + } + // Adding the global properties to the valid attribute list + if (tagProperty.globalAriaAttributesValid) { + var properties_2 = ARIADefinitions_1.ARIADefinitions.globalProperties; // global properties + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(properties_2, allowedAttributes); + } + } + // adding the other role to the allowed roles for the attributes + if (tagProperty && tagProperty.otherRolesForAttributes && tagProperty.otherRolesForAttributes.length > 0) + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(tagProperty.otherRolesForAttributes, permittedRoles); + // adding the specified role properties to the allowed attribute list + for (var i = 0; permittedRoles !== null && i < permittedRoles.length; i++) { + var roleProperties = ARIADefinitions_1.ARIADefinitions.designPatterns[permittedRoles[i]]; + if (roleProperties !== null && roleProperties !== undefined) { + // ignore the properties if the element doesn't allow attributes from the implicit role + if (!tagProperty || tagProperty.implicitRole === null || !tagProperty.implicitRole.includes(permittedRoles[i]) || (tagProperty.implicitRole.includes(permittedRoles[i]) && tagProperty.allowAttributesFromImplicitRole === undefined)) { + var properties_3 = roleProperties.props; // allowed properties + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(properties_3, allowedAttributes); + properties_3 = AriaUtil.getRoleRequiredProperties(permittedRoles[i], ruleContext); // required properties + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(properties_3, allowedAttributes); + } + var prohibitedProps = roleProperties.prohibitedProps; + if (prohibitedProps && prohibitedProps.length > 0) + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(prohibitedProps, prohibitedAttributes); + // special case for separator + if (permittedRoles[i] === "separator" && CommonUtil_1.CommonUtil.isFocusable(ruleContext)) { + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(["aria-disabled", "aria-valuemax", "aria-valuemin", "aria-valuetext"], allowedAttributes); + } + } + } + // ignore aria-level, aria-setsize or aria-posinset if "row" is not in treegrid + if (permittedRoles.includes("row") && AriaUtil.getAncestorWithRole(ruleContext, "treegrid", true) == null) { + var index = -1; + if ((index = allowedAttributes.indexOf("aria-level")) > -1) + allowedAttributes.splice(index, 1); + if ((index = allowedAttributes.indexOf("aria-setsize")) > -1) + allowedAttributes.splice(index, 1); + if ((index = allowedAttributes.indexOf("aria-posinset")) > -1) + allowedAttributes.splice(index, 1); + } + // add the other allowed attributes for the element + if (tagProperty && tagProperty.otherAllowedAriaAttributes && tagProperty.otherAllowedAriaAttributes.length > 0) { + // check attribute-value pair if exists + var allowed = []; + for (var p = 0; p < tagProperty.otherAllowedAriaAttributes.length; p++) { + var attr = tagProperty.otherAllowedAriaAttributes[p]; + if (attr.includes("=")) { + var pair = attr.split("="); + if (ruleContext.getAttribute(pair[0]) === pair[1]) + allowed.push(pair[0]); + } + else + allowed.push(attr); + } + if (allowed.length > 0) + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(allowed, allowedAttributes); + } + // add the other prohibitted attributes for the element + if (tagProperty && tagProperty.otherDisallowedAriaAttributes && tagProperty.otherDisallowedAriaAttributes.length > 0) { + // check attribute-value pair if exists + var disallowed = []; + for (var p = 0; p < tagProperty.otherDisallowedAriaAttributes.length; p++) { + var attr = tagProperty.otherDisallowedAriaAttributes[p]; + if (attr.includes("=")) { + var pair = attr.split("="); + if (ruleContext.getAttribute(pair[0]) === pair[1]) + disallowed.push(pair[0]); + } + else + disallowed.push(attr); + } + if (disallowed.length > 0) + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(disallowed, prohibitedAttributes); + } + //exclude the prohibitedAttributes from the allowedAttributes + allowedAttributes = CommonUtil_1.CommonUtil.reduceArrayItemList(prohibitedAttributes, allowedAttributes); + //exclude aria attribute for elements without implicit role and with 'Naming Prohibited' + if ((!roles || roles.length === 0) && tagProperty.implicitRole === null && tagProperty.prohibitedAriaAttributesWhenNoImplicitRole) + allowedAttributes = CommonUtil_1.CommonUtil.reduceArrayItemList(tagProperty.prohibitedAriaAttributesWhenNoImplicitRole, allowedAttributes); + CacheUtil_1.CacheUtil.setCache(ruleContext, "AriaUtil_AllowedAriaAttributes", allowedAttributes); + } + return allowedAttributes; + }; + /** + * + * @param ariaAttr + * @param htmlAttrs + * @type: conflict or overlapping + * @returns htmlAttrName, 'Pass' or null + * htmlAttrName that conflicts with the ariaAttr, + * 'Pass' with no conflict with the ariaAttr, + * or null where ariaAttr won't cause conflict + */ + AriaUtil.getConflictOrOverlappingHtmlAttribute = function (ariaAttr, htmlAttrs, type) { + var exist = ARIADefinitions_1.ARIADefinitions.relatedAriaHtmlAttributes[ariaAttr['name']]; + if (exist) { + if (!ariaAttr || ariaAttr.length == 0 || !htmlAttrs || htmlAttrs.length == 0) + return []; + var examinedHtmlAtrNames = []; + var concernTypes = null; + if (type === 'conflict') { + if (!exist.conflict || Object.keys(exist.conflict).length === 0) + return null; + concernTypes = exist.conflict; + } + else if (type === 'overlapping') { + if (!exist.overlapping || Object.keys(exist.overlapping).length === 0) + return null; + concernTypes = exist.overlapping; + } + else + return null; + var applicable = false; + var fail_1 = false; + for (var k = 0; k < concernTypes.length; k++) { + var concernAriaValue = concernTypes[k].ariaAttributeValue; + var concernHtmlNames = concernTypes[k].htmlAttributeNames; + var concernHtmlValues = concernTypes[k].htmlAttributeValues; + for (var i = 0; i < htmlAttrs.length; i++) { + var index = concernHtmlNames.indexOf(htmlAttrs[i]['name']); + if (index !== -1) { + applicable = true; + var htmlValuesInConcern = (concernHtmlValues === null || concernHtmlValues[index] === null) ? null : concernHtmlValues[index].split(","); + if (concernAriaValue === null) { + if (htmlValuesInConcern === null) { + examinedHtmlAtrNames.push({ result: 'Failed', 'attr': htmlAttrs[i]['name'] }); + fail_1 = true; + } + else if (htmlValuesInConcern.includes(htmlAttrs[i]['value'])) { + examinedHtmlAtrNames.push({ result: 'Failed', 'attr': htmlAttrs[i]['name'] }); + fail_1 = true; + } + } + else if (htmlValuesInConcern === null) { + if (concernAriaValue === ariaAttr['value']) { + examinedHtmlAtrNames.push({ result: 'Failed', 'attr': htmlAttrs[i]['name'] }); + fail_1 = true; + } + } + else if (concernAriaValue === 'VALUE' && htmlValuesInConcern.includes('VALUE') && htmlValuesInConcern[0] !== ariaAttr['value']) { + examinedHtmlAtrNames.push({ result: 'Failed', 'attr': htmlAttrs[i]['name'] }); + fail_1 = true; + } + else if (concernAriaValue === ariaAttr['value'] && htmlValuesInConcern.includes(htmlAttrs[i]['value'])) { + examinedHtmlAtrNames.push({ result: 'Failed', 'attr': htmlAttrs[i]['name'] }); + fail_1 = true; + } + } + } + } + if (applicable && !fail_1) + examinedHtmlAtrNames.push({ result: 'Pass', 'attr': '' }); + return examinedHtmlAtrNames; + } + else + return null; + }; + AriaUtil.containsPresentationalChildrenOnly = function (elem) { + var roles = AriaUtil.getRoles(elem, false); + // if explicit role doesn't exist, get the implicit one + if (!roles || roles.length === 0) + roles = AriaUtil.getImplicitRole(elem); + //ignore if the element doesn't have any explicit or implicit role, shouldn't happen + if (!roles || roles.length === 0) + return false; + for (var i = 0; roles !== null && i < roles.length; i++) { + var roleProperties = ARIADefinitions_1.ARIADefinitions.designPatterns[roles[i]]; + if (roleProperties !== null && roleProperties !== undefined) { + var presentional = roleProperties.presentationalChildren; + if (presentional === true) + return true; + } + } + return false; + }; + AriaUtil.shouldBePresentationalChild = function (element) { + var walkNode = DOMWalker_1.DOMWalker.parentElement(element); + while (walkNode) { + if (AriaUtil.containsPresentationalChildrenOnly(walkNode)) + return true; + //aria-own case: if the element is referred by an aria-won + walkNode = ARIAMapper_1.ARIAMapper.getAriaOwnedBy(walkNode) || DOMWalker_1.DOMWalker.parentElement(walkNode); + } + return false; + }; + /* + * check if any explicit role specified for the element is a valid ARIA role + * return: null if no explicit role is defined, + * true if the role(s) are defined in ARIA + * false if any role is not defined in ARIA +*/ + AriaUtil.areRolesDefined = function (roles) { + if (!roles || roles.length === 0) + return null; + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + for (var _i = 0, roles_1 = roles; _i < roles_1.length; _i++) { + var role = roles_1[_i]; + if (!(role.toLowerCase() in designPatterns)) + return false; + } + return true; + }; + /* + * check if any explicit role specified for the element is a valid ARIA role + * return: null if no explicit role is defined, + * true if the role(s) are defined in ARIA + * false if any role is not defined in ARIA + */ + AriaUtil.getInvalidRoles = function (ruleContext) { + var domRoles = AriaUtil.getUserDefinedRoles(ruleContext); + if (!domRoles || domRoles.length === 0) + return null; + // check the 'generic' role first + if (domRoles && domRoles.includes('generic')) + return ["generic"]; + // Failing roles + var failRoleTokens = []; + // Passing roles + var passRoleTokens = []; + var tagProperty = AriaUtil.getElementAriaProperty(ruleContext); + var allowedRoles = AriaUtil.getAllowedAriaRoles(ruleContext, tagProperty); + if (!allowedRoles || allowedRoles.length === 0) + return domRoles; + var invalidRoles = []; + if (allowedRoles.includes('any')) + return []; + for (var i = 0; i < domRoles.length; i++) + if (!allowedRoles.includes(domRoles[i]) && !invalidRoles.includes(domRoles[i])) + invalidRoles.push(domRoles[i]); + return invalidRoles; + }; + /* + * check if any explicit role specified for the element is not defined in ARIA + * return: list of specified roles not defined in ARIA + */ + AriaUtil.getRolesUndefinedByAria = function (element) { + if (!element) + return null; + var roles = AriaUtil.getRoles(element, false); + var undefinedRoles = []; + if (roles && roles.length > 0) { + var designPatterns = ARIADefinitions_1.ARIADefinitions.designPatterns; + for (var i = 0; i < roles.length; i++) { + if (!(roles[i] in designPatterns)) { + undefinedRoles.push(roles[i]); + } + } + } + return undefinedRoles; + }; + /* + * this method first checks explicit roles, if no explicit role, it will check the implicit role + * return: null if any explicit role is invalid, + * a list of invalid attributes + * empty list if all attributes are valid, or no aria attributes are specified + */ + AriaUtil.getInvalidAriaAttributes = function (ruleContext) { + var roles = AriaUtil.getUserDefinedRoles(ruleContext); + // the invalid role case: handled by Rpt_Aria_ValidRole. Ignore to avoid duplicated report + // for mutiple roles, skip if any role is invalid + var defined = AriaUtil.areRolesDefined(roles); + if (defined !== null && !defined) + return null; + var attrs = []; + if (!roles || roles.length == 0) + roles = AriaUtil.getImplicitRole(ruleContext); + var aria_attrs = AriaUtil.getUserDefinedAriaAttributes(ruleContext); + var tagProperty = AriaUtil.getElementAriaProperty(ruleContext); + // Attributes allowed on this node + var allowedAttributes = AriaUtil.getAllowedAriaAttributes(ruleContext, roles, tagProperty); + if (aria_attrs) { + for (var i = 0; i < aria_attrs.length; i++) { + var attrName = aria_attrs[i].trim().toLowerCase(); + if (!allowedAttributes.includes(attrName) && !attrs.includes(attrName)) + attrs.push(attrName); + } + } + return attrs; + }; + /* + * get conflict Aria and Html attributes + * return: a list of Aria and Html attribute pairs that are conflict + */ + AriaUtil.getConflictAriaAndHtmlAttributes = function (elem) { + var ariaAttrs = AriaUtil.getUserDefinedAriaAttributeNameValuePairs(elem); + var htmlAttrs = AriaUtil.getUserDefinedHtmlAttributeNameValuePairs(elem); + var ret = []; + if (ariaAttrs && ariaAttrs.length > 0 && htmlAttrs && htmlAttrs.length > 0) { + var _loop_1 = function (i) { + var examinedHtmlAtrNames = AriaUtil.getConflictOrOverlappingHtmlAttribute(ariaAttrs[i], htmlAttrs, 'conflict'); + if (examinedHtmlAtrNames === null) + return "continue"; + examinedHtmlAtrNames.forEach(function (item) { + if (item['result'] === 'Failed') //failed + ret.push({ 'ariaAttr': ariaAttrs[i]['name'], 'htmlAttr': item['attr'] }); + }); + }; + for (var i = 0; i < ariaAttrs.length; i++) { + _loop_1(i); + } + } + return ret; + }; + /* + * get deprecated Aria roles + * return: a list of deprecated Aria roles + */ + AriaUtil.getDeprecatedAriaRoles = function (element) { + if (!element) + return null; + var roles = AriaUtil.getRoles(element, false); + var ret = []; + if (roles && roles.length > 0) { + var globalDeprecatedRoles = ARIADefinitions_1.ARIADefinitions.globalDeprecatedRoles; + for (var i = 0; i < roles.length; i++) { + if (globalDeprecatedRoles.includes(roles[i])) + ret.push(roles[i]); + } + } + return ret; + }; + /* + * get deprecated Aria role-attributes + * return: a list of deprecated Aria role-attributes paris + * for global the role is marked as 'any' + */ + AriaUtil.getDeprecatedAriaAttributes = function (element) { + if (!element) + return null; + var domAttributes = element.attributes; + var ariaAttrs = []; + if (domAttributes) { + for (var i = 0; i < domAttributes.length; i++) { + var attrName = domAttributes[i].name; + if (attrName.substring(0, 5) === 'aria-') + ariaAttrs.push(attrName); + } + } + if (ariaAttrs.length === 0) + return []; + var ret = []; + var globalDeprecatedAttributes = ARIADefinitions_1.ARIADefinitions.globalDeprecatedProperties; + for (var i = 0; i < ariaAttrs.length; i++) { + if (globalDeprecatedAttributes.includes(ariaAttrs[i])) + ret.push({ "role": "any", "attribute": ariaAttrs[i] }); + } + var roles = AriaUtil.getRoles(element, false); + if (roles && roles.length > 0) { + for (var i = 0; i < roles.length; i++) { + var roleWithDeprecatedAttributes = ARIADefinitions_1.ARIADefinitions.designPatterns[roles[i]]; + if (roleWithDeprecatedAttributes) { + var deprecatedAttriNames = roleWithDeprecatedAttributes['deprecatedProps']; + if (deprecatedAttriNames && deprecatedAttriNames.length > 0) { + for (var j = 0; j < ariaAttrs.length; j++) { + if (deprecatedAttriNames.includes(ariaAttrs[j])) + ret.push({ "role": roles[i], "attribute": ariaAttrs[j] }); + } + } + } + } + } + return ret; + }; + AriaUtil.isNodeInGrid = function (node) { + return AriaUtil.getAncestorWithRole(node, "grid") != null; + }; + // This list contains a list of elements tags which have display: none by default, since we have rules triggering + AriaUtil.navLinkKeywords = ['start', 'next', 'prev', 'previous', 'contents', 'index']; + // This list contains a list of rule ids for the rules that have to check for hidden content regardless of the Check Hidden + // Content Setting. This means that when the engine is actually determine which elements to mass to the rules, it will always + // pass theses rules no matter what the Check Hidden Content Setting is. + AriaUtil.rulesThatHaveToCheckHidden = ['RPT_Elem_UniqueId']; + // https://www.w3.org/TR/wai-aria-1.1/#introstates + AriaUtil.ariaAttributeRoleDefaults = { + "alert": { + "aria-live": "assertive", + "aria-atomic": "true" + }, + "combobox": { + "aria-haspopup": "listbox" + }, + "listbox": { + "aria-orientation": "vertical" + }, + "log": { + "aria-live": "polite" + }, + "menu": { + "aria-orientation": "vertical" + }, + "menubar": { + "aria-orientation": "horizontal" + }, + "meter": { + "aria-valuemin": "0", + "aria-valuemax": "100" + }, + "option": { + "aria-selected": "false" + }, + "progressbar": { + "aria-valuemin": "0", + "aria-valuemax": "100" + }, + "scrollbar": { + "aria-orientation": "vertical", + "aria-valuemin": "0", + "aria-valuemax": "100" + }, + "separator": { + "aria-orientation": "horizontal", + "aria-valuemin": "0", + "aria-valuemax": "100" + }, + "slider": { + "aria-orientation": "horizontal", + "aria-valuemin": "0", + "aria-valuemax": "100" + }, + "spinbutton": { + // Not sure how to encode min/max (or now in 1.2 - "has no value") + //"aria-valuenow": "0" TODO: at risk: maybe delete after ARIA 1.2 reaches proposed rec + // Probably just delete spinbutton from this list completely and let user agents handle "defaults" + }, + "status": { + "aria-live": "polite", + "aria-atomic": "true" + }, + "tab": { + "aria-selected": "false" + }, + "tablist": { + "aria-orientation": "horizontal" + }, + "toolbar": { + "aria-orientation": "horizontal" + }, + "tree": { + "aria-orientation": "vertical" + } + }; + // https://www.w3.org/TR/wai-aria-1.1/#aria-atomic + AriaUtil.ariaAttributeGlobalDefaults = { + "aria-atomic": "false", + "aria-autocomplete": "none", + "aria-busy": "false", + "aria-checked": undefined, + "aria-current": "false", + "aria-disabled": "false", + "aria-dropeffect": "none", + "aria-expanded": undefined, + "aria-grabbed": undefined, + "aria-haspopup": "false", + "aria-hidden": undefined, + "aria-invalid": "false", + "aria-live": "off", + "aria-modal": "false", + "aria-multiline": "false", + "aria-multiselectable": "false", + "aria-orientation": undefined, + "aria-pressed": undefined, + "aria-readonly": "false", + //"aria-relevant": "additions text", TODO: are multiple values supported? + "aria-required": "false", + "aria-selected": undefined, + "aria-sort": "none" + }; + // https://www.w3.org/TR/html-aam-1.0/#html-attribute-state-and-property-mappings + AriaUtil.ariaAttributeImplicitMappings = { + "aria-autocomplete": { + "form": function (e) { + return "off" === e.getAttribute("autocomplete") ? "none" : "both"; + }, + "input": function (e) { + return "off" === e.getAttribute("autocomplete") ? "none" : "both"; + }, + "select": function (e) { + return "off" === e.getAttribute("autocomplete") ? "none" : "both"; + }, + "textarea": function (e) { + return "off" === e.getAttribute("autocomplete") ? "none" : "both"; + } + }, + "aria-checked": { + "input": function (e) { + if (e.hasAttribute("indeterminate")) + return "mixed"; + return "" + e.hasAttribute("checked"); + }, + "menuitem": function (e) { + if (e.hasAttribute("indeterminate")) + return "mixed"; + return "" + e.hasAttribute("checked"); + }, + "*": function (e) { + if (e.hasAttribute("indeterminate")) + return "mixed"; + }, + }, + "aria-disabled": { + "button": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + }, + "fieldset": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + }, + "input": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + }, + "optgroup": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + }, + "option": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + }, + "select": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + }, + "textarea": function (e) { + return e.hasAttribute("disabled") ? "true" : "false"; + } + }, + "aria-expanded": { + "details": function (e) { + return e.getAttribute("open"); + }, + "dialog": function (e) { + return e.getAttribute("open"); + } + }, + "aria-multiselectable": { + "select": function (e) { + if (e.hasAttribute("multiple")) + return "true"; + return; + } + }, + "aria-placeholder": { + "input": function (e) { + return e.getAttribute("placeholder"); + }, + "textarea": function (e) { + return e.getAttribute("placeholder"); + } + }, + "aria-required": { + "input": function (e) { + return e.getAttribute("required"); + }, + "select": function (e) { + return e.getAttribute("required"); + }, + "textarea": function (e) { + return e.getAttribute("required"); + } + } + }; + return AriaUtil; +}()); +exports.AriaUtil = AriaUtil; + + +/***/ }, + +/***/ "./src/v4/util/CSSUtil.ts" +/*!********************************!*\ + !*** ./src/v4/util/CSSUtil.ts ***! + \********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.CSSUtil = void 0; +var CacheUtil_1 = __webpack_require__(/*! ./CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ./CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var AriaUtil_1 = __webpack_require__(/*! ./AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var DOMMapper_1 = __webpack_require__(/*! ../../v2/dom/DOMMapper */ "./src/v2/dom/DOMMapper.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var CSSUtil = /** @class */ (function () { + function CSSUtil() { + } + CSSUtil.selectorMatchesElem = function (element, selector) { + // Early return for empty selector (before try-catch for performance) + if (!selector || selector.length === 0 || selector.trim() === "") + return false; + try { + // Modern standard method + if (typeof element.matches === "function") { + return element.matches(selector); + } + // Vendor-prefixed fallbacks (older browsers) + if (typeof element.webkitMatchesSelector === "function") { + return element.webkitMatchesSelector(selector); + } + if (typeof element.msMatchesSelector === "function") { + return element.msMatchesSelector(selector); + } + // Legacy method (deprecated but kept for compatibility) + if (typeof element.matchesSelector === "function") { + return element.matchesSelector(selector); + } + // Fallback: use querySelectorAll and check if element is in results + var doc = element.ownerDocument || element.document; + if (!doc) + return false; + var matches = doc.querySelectorAll(selector); + // Use Array.from for better performance with modern engines + return Array.from(matches).includes(element); + } + catch (err) { + // Bad selector? Doesn't match then... + return false; + } + }; + /** + * Returns the style computed for this element + * @param elem + */ + CSSUtil.getComputedStyle = function (elem, pseudoElt) { + if (!elem) + return null; + var doc = elem.ownerDocument; + var win = doc.defaultView; + return win.getComputedStyle(elem, pseudoElt); + }; + /** + * Parse and cache all stylesheet rules at the document level + * Returns an array of parsed rule objects with selector and style information + */ + CSSUtil.getParsedStylesheetRules = function (ownerDoc) { + // Check if we already have cached parsed rules for this document + var cachedRules = CacheUtil_1.CacheUtil.getCache(ownerDoc, "RPTUtil_ParsedStylesheetRules", null); + if (cachedRules) { + return cachedRules; + } + var parsedRules = []; + // Iterate through all of the stylesheets and rules + for (var ssIndex = 0; ssIndex < ownerDoc.styleSheets.length; ++ssIndex) { + var sheet = ownerDoc.styleSheets[ssIndex]; + try { + if (sheet && sheet.cssRules) { + for (var rIndex = 0; rIndex < sheet.cssRules.length; ++rIndex) { + var rule = sheet.cssRules[rIndex]; + var fullRuleSelector = rule.selectorText; + if (fullRuleSelector) { + var pseudoMatch = fullRuleSelector.match(/^(.*)(:[a-zA-Z-]*)$/); + var hasPseudoClass = !!pseudoMatch; + var selMain = hasPseudoClass ? pseudoMatch[1] : fullRuleSelector; + var selPseudo = hasPseudoClass ? pseudoMatch[2] : ""; + parsedRules.push({ + fullRuleSelector: fullRuleSelector, + hasPseudoClass: hasPseudoClass, + selMain: selMain, + selPseudo: selPseudo, + style: rule.style + }); + } + } + } + } + catch (err) { + if (!err.toString().includes("Cannot access rules") && + !err.toString().includes("SecurityError:")) { + throw err; + } + } + } + // Cache the parsed rules at the document level + CacheUtil_1.CacheUtil.setCache(ownerDoc, "RPTUtil_ParsedStylesheetRules", parsedRules); + return parsedRules; + }; + /** + * Private helper method to fill style maps from a CSSStyleDeclaration + * Handles CSS property priorities and the "all" shorthand property + */ + CSSUtil.fillStyle = function (maps, style) { + for (var sIndex = 0; sIndex < style.length; ++sIndex) { + if (style[sIndex] === "all" && style[style[sIndex]]) { + for (var _i = 0, maps_1 = maps; _i < maps_1.length; _i++) { + var map = maps_1[_i]; + for (var key in map) { + delete map[key]; + } + } + break; + } + else { + var key = style[sIndex]; + for (var _a = 0, maps_2 = maps; _a < maps_2.length; _a++) { + var map = maps_2[_a]; + var priority = style.getPropertyPriority(key); + if (key in map && map[key].endsWith("!important")) { + if (priority === "important" && + !map[key].startsWith("inherit") && + !map[key].startsWith("unset")) + map[key] = style[key] + " !important"; + else + continue; + } + else + map[key] = + style[key] + + (priority === "important" ? " !important" : ""); + } + } + } + }; + /** + * Private helper method that consolidates the logic for getting defined styles + * Used by both getDefinedStyles and getDefinedStylesMultiple + */ + CSSUtil.getDefinedStylesInternal = function (elem, props, pseudoClasses) { + var results = {}; + var definedStylesMap = {}; + var definedStylePseudoMap = {}; + // Initialize result objects for all pseudo-classes + for (var _i = 0, pseudoClasses_1 = pseudoClasses; _i < pseudoClasses_1.length; _i++) { + var pseudoClass = pseudoClasses_1[_i]; + definedStylesMap[pseudoClass] = {}; + definedStylePseudoMap[pseudoClass] = {}; + } + // Get pre-parsed stylesheet rules from cache + var parsedRules = CSSUtil.getParsedStylesheetRules(elem.ownerDocument); + // Check once if we need to handle :focus pseudo-class + var hasFocusPseudo = pseudoClasses.includes(":focus"); + var _loop_1 = function (parsedRule) { + if (props !== null && !props.some(function (prop) { return !!parsedRule.style[prop]; })) { + return "continue"; + } + var selPseudo = parsedRule.selPseudo; + var hasPseudoClass = parsedRule.hasPseudoClass; + // Handle :focus-within replacement once per rule if needed + var selMain = parsedRule.selMain; + if (hasFocusPseudo && selPseudo === ":focus") { + // If this element has focus, remove focus-within from parents + selMain = selMain.replace(/([ >][^+~ >]+):focus-within/g, "$1"); + } + // Cache selector matching result (only once per rule, not per pseudo-class) + var selectorMatches = CSSUtil.selectorMatchesElem(elem, selMain); + // Only process if selector matches + if (selectorMatches) { + // Process for each pseudo-class + for (var _c = 0, pseudoClasses_3 = pseudoClasses; _c < pseudoClasses_3.length; _c++) { + var pseudoClass = pseudoClasses_3[_c]; + // Cache map references to avoid repeated lookups + var styleMap = definedStylesMap[pseudoClass]; + var pseudoMap = definedStylePseudoMap[pseudoClass]; + // Get styles of non-pseudo selectors + if (!hasPseudoClass) { + CSSUtil.fillStyle([styleMap, pseudoMap], parsedRule.style); + } + // Get styles for matching pseudo-class + if (selPseudo === pseudoClass) { + CSSUtil.fillStyle([pseudoMap], parsedRule.style); + } + } + } + }; + // Process each cached rule + for (var _a = 0, parsedRules_1 = parsedRules; _a < parsedRules_1.length; _a++) { + var parsedRule = parsedRules_1[_a]; + _loop_1(parsedRule); + } + // Handle element styles and build results in one pass + for (var _b = 0, pseudoClasses_2 = pseudoClasses; _b < pseudoClasses_2.length; _b++) { + var pseudoClass = pseudoClasses_2[_b]; + var styleMap = definedStylesMap[pseudoClass]; + var pseudoMap = definedStylePseudoMap[pseudoClass]; + // Add element's inline styles + CSSUtil.fillStyle([styleMap, pseudoMap], elem.style); + // Build results + if (pseudoClass === "") { + results[pseudoClass] = styleMap; + } + else { + // For pseudo-classes, return only styles that differ from default + var diffStyles = {}; + var keys = Object.keys(pseudoMap); + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + if (pseudoMap[key] !== styleMap[key]) { + diffStyles[key] = pseudoMap[key]; + } + } + results[pseudoClass] = diffStyles; + } + } + return results; + }; + /** + * Returns the style defined for this element for multiple pseudo-classes in a single pass + * + * This is more efficient than calling getDefinedStyles multiple times as it only + * iterates through stylesheets once. + * + * @param {HTMLElement} elem + * @param {string[]} props Properties for which we are looking for (allows us to skip elem matching unnecessarily) + * @param {string[]} pseudoClasses - Array of pseudo-classes to retrieve. Use "" for default (no pseudo-class). + * @returns {Object} Object mapping each pseudo-class to its defined styles + */ + CSSUtil.getDefinedStylesMultiple = function (elem, props, pseudoClasses) { + if (!elem) + return null; + var results = {}; + // Create cache key that includes props filter + // Use "all" for null props, or sorted comma-separated list for specific props + var propsKey = props === null ? "all" : props.slice().sort().join(","); + // Check cache first - see if we have all requested pseudo-classes cached + var allCachedStyles = CacheUtil_1.CacheUtil.getCache(elem, "RPTUtil_DefinedStyles", null); + if (!allCachedStyles) { + allCachedStyles = {}; + } + // Get or create the cache bucket for this props filter + var cachedStyles = allCachedStyles[propsKey]; + var missingPseudoClasses = []; + if (cachedStyles) { + // Check which pseudo-classes are already cached + for (var _i = 0, pseudoClasses_4 = pseudoClasses; _i < pseudoClasses_4.length; _i++) { + var pseudoClass = pseudoClasses_4[_i]; + if (cachedStyles[pseudoClass] !== undefined) { + results[pseudoClass] = cachedStyles[pseudoClass]; + } + else { + missingPseudoClasses.push(pseudoClass); + } + } + // If all are cached, return immediately + if (missingPseudoClasses.length === 0) { + return results; + } + } + else { + cachedStyles = {}; + missingPseudoClasses = pseudoClasses; + } + // Only process missing pseudo-classes using the internal helper + if (missingPseudoClasses.length > 0) { + var newResults = CSSUtil.getDefinedStylesInternal(elem, props, missingPseudoClasses); + // Merge new results with cached results + for (var _a = 0, missingPseudoClasses_1 = missingPseudoClasses; _a < missingPseudoClasses_1.length; _a++) { + var pseudoClass = missingPseudoClasses_1[_a]; + results[pseudoClass] = newResults[pseudoClass]; + cachedStyles[pseudoClass] = newResults[pseudoClass]; + } + // Update cache with all styles (existing + new) + allCachedStyles[propsKey] = cachedStyles; + CacheUtil_1.CacheUtil.setCache(elem, "RPTUtil_DefinedStyles", allCachedStyles); + } + return results; + }; + /** + * Returns the style defined for this element + * + * This differs from the computed style in that the computed style will return + * styles defined by the user agent. This will only return styles defined by the + * application + * if rotation transform is used, the computed style returns the resolved matrix + * while the defined style return the transform function(s) + * for example, for 'transform: rotate(2.5deg);', the computed style returns 'matrix(-0.0436194, 0.999048, -0.999048, -0.0436194, 0, 0)' + * and the defined style returns 'rotate(2.5deg)' + * + * change the type of the parameter pseudoClass from PseudoClass to string to include both pseudo classes (e.g., :focus, :checked) + * and pseudo elements (e.g., ::before, ::after). + * + * @param {HTMLElement} elem + * @param {string[]} props Properties for which we are looking for (allows us to skip elem matching unnecessarily) + * @param {string} [pseudoClass] If specified, will return values that are different + * than when the pseudoClass does not match. + */ + CSSUtil.getDefinedStyles = function (elem, props, pseudoClass) { + if (!elem) + return null; + // Create cache key that includes props filter + // Use "all" for null props, or sorted comma-separated list for specific props + var propsKey = props === null ? "all" : props.slice().sort().join(","); + var pseudoKey = pseudoClass || ""; + // Check cache first - use shared cache structure with getDefinedStylesMultiple + var allCachedStyles = CacheUtil_1.CacheUtil.getCache(elem, "RPTUtil_DefinedStyles", null); + if (!allCachedStyles) { + allCachedStyles = {}; + } + // Get or create the cache bucket for this props filter + var cachedStyles = allCachedStyles[propsKey]; + if (!cachedStyles) { + cachedStyles = {}; + } + if (cachedStyles[pseudoKey] !== undefined) { + return cachedStyles[pseudoKey]; + } + // Use the internal helper method with a single pseudo-class + var results = CSSUtil.getDefinedStylesInternal(elem, props, [pseudoKey]); + var result = results[pseudoKey]; + // Cache the result + cachedStyles[pseudoKey] = result; + allCachedStyles[propsKey] = cachedStyles; + CacheUtil_1.CacheUtil.setCache(elem, "RPTUtil_DefinedStyles", allCachedStyles); + return result; + }; + /** + * Returns the media query defined for the document + * Get media orientation transforms from stylesheets with caching + * Returns transform/rotate properties for elements within media queries + * + * @param {Document} doc + */ + CSSUtil.getMediaOrientationTransform = function (doc) { + // Check if we already have cached media orientation transforms for this document + var cachedTransforms = CacheUtil_1.CacheUtil.getCache(doc, "RPTUtil_MediaOrientationTransforms", null); + if (cachedTransforms) { + return cachedTransforms; + } + var orientationTransforms = {}; + // Iterate through all of the stylesheets and rules + for (var ssIndex = 0; ssIndex < doc.styleSheets.length; ++ssIndex) { + var sheet = doc.styleSheets[ssIndex]; + try { + if (sheet && sheet.cssRules) { + for (var rIndex = 0; rIndex < sheet.cssRules.length; ++rIndex) { + var sheetRule = sheet.cssRules[rIndex]; + if (4 /* CSSRule.MEDIA_RULE */ === sheetRule.MEDIA_RULE) { + var rule = sheetRule; + if (rule && rule.media) { + var mediaList = rule.media; + for (var i = 0; i < mediaList.length; i++) { + if (!mediaList.item(i)) + continue; + var mediaKey = mediaList.item(i).toLocaleLowerCase(); + var elem_transforms = orientationTransforms[mediaKey]; + if (!elem_transforms) + elem_transforms = {}; + var styleRules = rule.cssRules; + for (var j = 0; j < styleRules.length; ++j) { + if (1 /* CSSRule.STYLE_RULE */ === styleRules[j].STYLE_RULE) { + var styleRule = styleRules[j]; + var selector = styleRule.selectorText; + if (selector) { + var transforms = {}; + var styles = styleRule.style; + for (var s = 0; s < styles.length; ++s) { + var key = styles[s]; + var keyLower = key.toLocaleLowerCase(); + if (keyLower === "transform") { + if (key === "all" && styles[key]) { + transforms = {}; + break; + } + else { + transforms[key] = styles[key]; + } + } + else if (keyLower === "rotate") { + transforms[key] = styles[key]; + } + } + if (Object.keys(transforms).length > 0) { + elem_transforms[selector] = transforms; + } + } + } + } + if (Object.keys(elem_transforms).length > 0) { + orientationTransforms[mediaKey] = elem_transforms; + } + } + } + } + } + } + } + catch (err) { + if (!err.toString().includes("Cannot access rules") && + !err.toString().includes("SecurityError:")) { + throw err; + } + } + } + // Cache the media orientation transforms at the document level + CacheUtil_1.CacheUtil.setCache(doc, "RPTUtil_MediaOrientationTransforms", orientationTransforms); + return orientationTransforms; + }; + /** + * convert given rotation transform functions to the degree transformed. + * If multiple functions are given, then the functions are applied linearly in the order. + * rotation_transform function example: rotate(45deg), rotate(2turn), rotate(2rad), rotate3d(1, 1, 1, 45deg), + * rotate(2rad) rotate3d(1, 1, 1, 45deg) + * @param rotation_transform + */ + CSSUtil.getRotationDegree = function (rotation_transform) { + var degree = 0; + try { + if (!rotation_transform) + return degree; + // normalize the rotation_transform + rotation_transform = rotation_transform.replaceAll(", ", ","); + var transform_functions = rotation_transform.split(" "); + for (var i = 0; i < transform_functions.length; i++) { + var transform_function = transform_functions[i].trim(); + if (transform_function === "") + continue; + if (transform_function.startsWith("rotate3d")) { + // example: rotate3d(1, 1, 1, 45deg); + var left = transform_function.indexOf("("); + var right = transform_function.indexOf(")"); + if (left !== -1 && right !== -1) { + var matrix = transform_function.substring(left + 1, right); + var values = void 0; + if (matrix) + values = matrix.split(","); + if (values && values.length === 4) { + var rotation = values[3]; + if (!rotation) + continue; + rotation = rotation.trim(); + if (rotation.endsWith("turn")) { + var num = rotation.substring(0, rotation.length - 4); + num = parseFloat(num); + if (!isNaN(num)) + degree = num * 360; + } + else if (rotation.endsWith("rad")) { + var num = rotation.substring(0, rotation.length - 3); + num = parseFloat(num); + if (!isNaN(num)) + degree = (num * 180) / Math.PI; + } + else if (rotation.endsWith("deg")) { + var num = rotation.substring(0, rotation.length - 3); + num = parseFloat(num); + if (!isNaN(num)) + degree += num; + } + } + } + } + else if (transform_function.startsWith("rotate") || + transform_function.startsWith("rotateZ")) { + // example: rotate(45deg); + var left = transform_function.indexOf("("); + var right = transform_function.indexOf(")"); + if (left !== -1 && right !== -1) { + var rotation = transform_function.substring(left + 1, right); + if (!rotation) + continue; + rotation = rotation.trim(); + if (rotation.endsWith("turn")) { + var num = rotation.substring(0, rotation.length - 4); + num = parseFloat(num); + if (!isNaN(num)) + degree = num * 360; + } + else if (rotation.endsWith("rad")) { + var num = rotation.substring(0, rotation.length - 3); + num = parseFloat(num); + if (!isNaN(num)) + degree = (num * 180) / Math.PI; + } + else if (rotation.endsWith("deg")) { + var num = rotation.substring(0, rotation.length - 3); + num = parseFloat(num); + if (!isNaN(num)) + degree += num; + } + } + } + else if (transform_function.startsWith("matrix3d")) { + // calculate the three Euler angles + var left = transform_function.indexOf("("); + var right = transform_function.indexOf(")"); + if (left !== -1 && right !== -1) { + var matrix = transform_function.substring(left + 1, right); + var values = null; + if (matrix) + values = matrix.split(","); + if (values !== null) { + var z_angle = Math.atan2(values[4], values[5]); + degree += Math.round(Math.round((z_angle * 180) / Math.PI)); + } + } + } + else if (transform_function.startsWith("matrix")) { + // calculate the three Euler angles + var left = transform_function.indexOf("("); + var right = transform_function.indexOf(")"); + if (left !== -1 && right !== -1) { + var matrix = transform_function.substring(left + 1, right); + var values = null; + if (matrix) + values = matrix.split(","); + if (values !== null) { + var z_angle = Math.atan2(values[1], values[0]); + degree += Math.round(Math.round((z_angle * 180) / Math.PI)); + } + } + } + } + while (degree >= 360) + degree -= 360; + } + catch (err) { + console.log("Cannot retrieve rotation degree: " + err); + throw err; + } + return degree; + }; + /** + * Convert CSS style string values to pixels. + * + * @param value style value in string, such as 3rem, 230px etc. + * @param target element. + * @return value in pixels + */ + CSSUtil.getPixelsFromStyle = function (value, elem) { + if (!value) + return 0; + var regex = /(-?[\d.]+)([a-z%]*)/; + var parsed = value.trim().match(regex); + if (parsed === null) + return 0; + if (parsed[2] === "" || parsed[1] === 0) + //no zero value without unit which is considered as error, so implicable + return 0; + var pixels = CSSUtil.convertValue2Pixels(parsed[2], parsed[1], elem); + return pixels === null ? pixels : parseFloat(pixels); + }; + /** + * Convert absolute CSS numerical values to pixels. + * + * @param unitValue in string + * @param target element. + * @return value in pixels + */ + CSSUtil.convertValue2Pixels = function (unit, unitValue, elem) { + if (unitValue === 0) + return 0; + if (!unit) + unit = "px"; + var supportedUnits = { + // absolute unit + px: function (value) { return value; }, + cm: function (value) { return value * 37.8; }, + mm: function (value) { return value * 3.78; }, + q: function (value) { return value * 0.95; }, + in: function (value) { return value * 96; }, + pc: function (value) { return value * 16; }, + pt: function (value) { return value * 1.33; }, + // relative unit + rem: function (value) { + return value * + parseFloat(getComputedStyle(elem.ownerDocument.documentElement).getPropertyValue("font-size")); + }, + em: function (value) { + return value * + parseFloat(getComputedStyle(elem).getPropertyValue("font-size")); + }, + vw: function (value) { + return (value / 100) * elem.ownerDocument.defaultView.innerWidth; + }, + vh: function (value) { + return (value / 100) * elem.ownerDocument.defaultView.innerHeight; + }, + "%": function (value) { + return (value / 100) * + parseFloat(getComputedStyle(elem).getPropertyValue("font-size")); + }, + }; + if (unit in supportedUnits) + return supportedUnits[unit](unitValue); + return null; + }; + /* + * Returns if the font for visible text of the element is defined by material icons + * + * @param {HTMLElement} elem + */ + CSSUtil.isMaterialIconFont = function (elem) { + // TODO: check the existence material icons using fetch in node 18+ + // for now (node 16) just dertermine if the stylesheet for the 'Material Icons' exists statically. note that the loading of the font stylesheet occurs at run time. + //list of known material icons and stylesheet link + var known_icons = { + "Material Icons": "https://fonts.googleapis.com/icon?family=Material+Icons", + }; + var known_css_classes = { + "material-icons": "https://fonts.googleapis.com/icon?family=Material+Icons", + }; + // material icon font can be defined either by font-family: 'Material Icons' or by class="material-icons" + var styles = CSSUtil.getDefinedStyles(elem, ["font-family"]); + var fontFamily = styles["font-family"]; + var found = false; + // font-family specifies a prioritized list of one or more font family names + if (fontFamily && + fontFamily.split(",")[0].replace(/['"]+/g, "").trim() in known_icons) + found = true; + if (!found) { + var list = elem.classList; + for (var css_class in known_css_classes) { + if (list.contains(css_class)) { + found = true; + break; + } + } + } + if (!found) + return false; + var passed = false; + // check if the stylesheet for the 'Material Icons' exists statically + var sheets = elem.ownerDocument.styleSheets; + for (var s = 0; s < sheets.length; s++) { + if (sheets && + sheets.length > 0 && + Object.values(known_icons).indexOf(sheets[s].href) > -1) { + passed = true; + break; + } + } + return passed; + }; + CSSUtil.getWeightNumber = function (styleVal) { + var map = { + light: 100, + bold: 700, + }; + var retVal = parseInt(styleVal); + if (retVal) + return retVal; + if (styleVal in map) + return map[styleVal]; + return 400; + }; + CSSUtil.getFontInPixels = function (styleVal, elem) { + var map = { + "xx-small": 16, + "x-small": 10, + small: 13, + medium: 16, + large: 18, + "x-large": 24, + "xx-large": 32, + }; + var value = parseFloat(styleVal); + if (!value) { + return map[styleVal]; + } + var units = styleVal.substring(("" + value).length); + /** + if (units === "" || units === "px") return value; + if (units === "em") return value * 16; + if (units === "%") return value / 100 * 16; + if (units === "pt") return value * 4 / 3; + return Math.round(value); + */ + return CSSUtil.convertValue2Pixels(units, value, elem); + }; + CSSUtil.getCSSStyle = function (element) { + var styleText = ""; + if (element === null) + return []; + if (element.IBM_CSS_THB) + return element.IBM_CSS_THB; + var nodeName = element.nodeName.toLowerCase(); + if (nodeName === "style") { + styleText = element.innerText; + if (styleText === undefined || styleText.trim() === "") + styleText = element.textContent; + } + else if (element.hasAttribute("style")) { + styleText = element.getAttribute("style"); + } + else + return []; + if (styleText === null || styleText.trim().length === 0) + return []; + //remove comment blocks + var re = /(\/\*+(?:(?:(?:[^\*])+)|(?:[\*]+(?!\/)))[*]+\/)|\/\/.*/g; + var subst = " "; + styleText = styleText.replace(re, subst); + // Find all "key : val;" pairs with various whitespace inbetween + var rKeyVals = /\s*([^:\s]+)\s*:\s*([^;$}]+)\s*(;|$)/g; + // Find all "selector { csskeyvals } with various whitespace inbetween + var rSelectors = /\s*([^{]*){([^}]*)}/g; + if (styleText.indexOf("{") === -1) { + var keyVals = {}; + var m = void 0; + while ((m = rKeyVals.exec(styleText)) != null) { + keyVals[m[1]] = m[2].trim().toLowerCase(); + } + var retVal = [ + { + selector: null, + values: keyVals, + }, + ]; + element.IBM_CSS_THB = retVal; + return retVal; + } + else { + var retVal = []; + var m = void 0; + var m2 = void 0; + while ((m = rSelectors.exec(styleText)) != null) { + var keyVals = {}; + var selKey = m[1]; + var selVal = m[2]; + while ((m2 = rKeyVals.exec(selVal)) != null) { + keyVals[m2[1]] = m2[2].trim().toLowerCase(); + } + retVal.push({ + selector: selKey, + values: keyVals, + }); + } + element.IBM_CSS_THB = retVal; + return retVal; + } + }; + /** + * an "inline" CSS display property tells the element to fit itself on the same line. An 'inline' element's width and height are ignored. + * some element has default inline property, such as <span>, <a> + * most formatting elements inherent inline property, such as <em>, <strong>, <i>, <small> + * other inline elements: <abbr> <acronym> <b> <bdo> <big> <br> <cite> <code> <dfn> <em> <i> <input> <kbd> <label> + * <map> <object> <output> <q> <samp> <script> <select> <small> <span> <strong> <sub> <sup> <textarea> <time> <tt> <var> + * an "inline-block" element still place element in the same line without breaking the line, but the element's width and height are applied. + * inline-block elements: img, button, select, meter, progress, marguee, also in Chrome: textarea, input + * A block-level element always starts on a new line, and the browsers automatically add some space (a margin) before and after the element. + * block-level elements: <address> <article> <aside> <blockquote> <canvas> <dd> <div> <dl> <dt> <fieldset> <figcaption> <figure> <footer> <form> + * <h1>-<h6> <header> <hr> <li> <main> <nav> <noscript> <ol> <p> <pre> <section> <table> <tfoot> <ul> <video> + * + * return: if it's inline element and { inline: true | false, text: true | false, violation: null | {node} } + */ + CSSUtil.getInlineStatus = function (element) { + if (!element) + return null; + var elem_styl = getComputedStyle(element); + if (!elem_styl) + return null; + var status = { inline: false, text: false, violation: null }; + var udisplay = elem_styl.getPropertyValue("display"); + // inline element only + if (udisplay !== "inline") + return status; + status.inline = true; + var parent = element.parentElement; + if (!parent) + return status; + var mapper = new DOMMapper_1.DOMMapper(); + var bounds = mapper.getUnadjustedBounds(element); + var style = getComputedStyle(parent); + var display = style.getPropertyValue("display"); + // an inline element is inside a block. note <body> is a block element too + if (display !== "block" && display !== "inline-block") { + //parent is inline element + if (!CommonUtil_1.CommonUtil.isInnerTextOnlyEmpty(parent)) + status.text = true; + return status; + } + /** + * @returns "yes"": inline with text, "no": inline without text, + * "violation": not spacing enough to neiboring inline target + * "block": block element, + */ + function isInlineWithText(node, before) { + // note browsers insert Text nodes to represent whitespaces. + if (node.nodeType === Node.TEXT_NODE) { + if (node.nodeValue && node.nodeValue.trim().length > 0) + return "yes"; + else + return "no"; + } + else if (node.nodeType === Node.ELEMENT_NODE) { + // special case: <br> is styled 'inline' by default, but change the line + if (node.nodeName.toLowerCase() === "br") + return "block"; + var cStyle = getComputedStyle(node); + var cDisplay = cStyle.getPropertyValue("display"); + if (cDisplay === "inline") { + if (CommonUtil_1.CommonUtil.isTarget(node)) { + if (bounds.width < 24) { + // check if the horizontal spacing is sufficient + var bnds = mapper.getUnadjustedBounds(node); + if ((before && (Math.round(bounds.width / 2) + bounds.left - bnds.left < 24)) + || (!before && (Math.round(bounds.width / 2) + bounds.left - (bnds.left + bnds.width) < 24))) { + status.violation = node.nodeName.toLowerCase(); + return "violation"; + } + else + return "no"; + } + } + if (!CommonUtil_1.CommonUtil.isInnerTextOnlyEmpty(node)) + return "yes"; + return "no"; + } + else + return "block"; + } + else + return "block"; + } + // an inline element is inside a block. note <body> is a block element too + // one or more inline elements with text in the same line: <target>, text<target>, <target>text, <inline>+text<target>, <target><inline>+text, text<target><inline>+ + var walkNode = element.nextSibling; + while (walkNode) { + var inlineText = isInlineWithText(walkNode, true); + if (inlineText === "yes") { + status.text = true; + break; + } + if (inlineText === "block") { + break; + } + walkNode = walkNode.nextSibling; + } + walkNode = element.previousSibling; + while (walkNode) { + var inlineText = isInlineWithText(walkNode, false); + if (inlineText === "yes") { + status.text = true; + break; + } + if (inlineText === "block") { + break; + } + walkNode = walkNode.previousSibling; + } + return status; + }; + /** + * a target is en element that accept a pointer action (click or touch) + * a target is a browser default if it's a native widget (no user defined role) without user style + */ + CSSUtil.isTargetBrowserDefault = function (element) { + if (!element) + return false; + // user defined widget + var roles = AriaUtil_1.AriaUtil.getRoles(element, false); + if (roles && roles.length > 0) + return false; + // no user style to space control size, including use of font + var styles = CSSUtil.getDefinedStyles(element, [ + "line-height", "height", "width", "min-height", "min-width", + "font-size", "margin-top", "margin-bottom", "margin-left", "margin-right" + ]); + if (styles["line-height"] || + styles["height"] || + styles["width"] || + styles["min-height"] || + styles["min-width"] || + styles["font-size"] || + styles["margin-top"] || + styles["margin-bottom"] || + styles["margin-left"] || + styles["margin-right"]) + return false; + return true; + }; + /* + * string contains CJK (chinese, japaneses, or korea) + * return: boolean + */ + CSSUtil.containsCKJ = function (text) { + if (!text) + return false; + // https://en.wikipedia.org/wiki/CJK_Unified_Ideographs https://ayaka.shn.hk/hanregex/ + var regex = /(?:[\u4e00-\u9fff\u3400-\u4dbf])+/g; + var replaced = text.trim().replace(regex, ""); + if (replaced.length === text.trim().length) + return false; + return true; + }; + /** + * Return the ancestor with the given style properties. + * Searches up the DOM tree to find an ancestor that has ALL specified style properties + * with values matching the criteria. + * + * @param {element} elem - The element to start the node walk on to find parent node + * @param {Object} styleProps - The style properties and values of the parent to search for. + * such as {"overflow":['auto', 'scroll'], "overflow-x":['auto', 'scroll']} + * or {"overflow":['*'], "overflow-x":['*']}, The '*' for any value to check the existence of the style prop. + * @param {Array} excludedValues - style values that should be ignored. + * @return {Element|null} - An ancestor element that has all the specified style properties, or null if none found + * @memberOf CSSUtil + */ + CSSUtil.getAncestorWithStyles = function (elem, styleProps, excludedValues) { + if (excludedValues === void 0) { excludedValues = []; } + // Create a cache key that includes the style properties being searched for + var cacheKey = "AriaUtil_AncestorWithStyles_" + JSON.stringify(styleProps) + "_" + JSON.stringify(excludedValues); + // Check if we already have a cached result for this specific query + var cachedResult = CacheUtil_1.CacheUtil.getCache(elem, cacheKey, null); + if (cachedResult !== null) { + return cachedResult === "NOT_FOUND" ? null : cachedResult; + } + // Start with the element itself (not just parent) to maintain backward compatibility + var walkNode = elem; + while (walkNode !== null) { + // Skip if not an HTMLElement (e.g., SVGElement) + // Use nodeType check instead of instanceof to work across different document contexts + if (walkNode.nodeType !== 1 || walkNode.namespaceURI === "http://www.w3.org/2000/svg") { + walkNode = DOMWalker_1.DOMWalker.parentElement(walkNode); + continue; + } + var styles = CSSUtil.getDefinedStyles(walkNode, Object.keys(styleProps)); + // Check if ANY specified style property matches the criteria (OR logic) + for (var styleProp in styleProps) { + var value = styles[styleProp]; + if (!value) { + // Property not defined on this element, try next property + continue; + } + // Remove !important suffix for comparison + value = value.split(" ")[0]; + // Check if value should be excluded + if (excludedValues.includes(value)) { + continue; + } + // Check if value matches the criteria + var acceptedValues = styleProps[styleProp]; + if (acceptedValues.includes('*')) { + // Any value is acceptable (just checking existence) + CacheUtil_1.CacheUtil.setCache(elem, cacheKey, walkNode); + return walkNode; + } + else if (acceptedValues.includes(value)) { + // Value matches one of the accepted values + CacheUtil_1.CacheUtil.setCache(elem, cacheKey, walkNode); + return walkNode; + } + } + walkNode = DOMWalker_1.DOMWalker.parentElement(walkNode); + } + // No matching element or ancestor found - cache this result to avoid re-searching + CacheUtil_1.CacheUtil.setCache(elem, cacheKey, "NOT_FOUND"); + return null; + }; + /** + * return an array [value, Unit] from a value-unit combo string + * @param valueUnitCombo, such as 20px, 2rem + * @returns + */ + CSSUtil.getValueUnitPair = function (valueUnitCombo) { + if (!valueUnitCombo) + return null; + if (Number.isInteger(valueUnitCombo)) + return ["px", valueUnitCombo]; + var value = parseInt(valueUnitCombo); + if (isNaN(value)) + return null; + valueUnitCombo = valueUnitCombo.trim().toLowerCase(); + var match = valueUnitCombo.trim().match(/([a-z]+)$/); + var unit = 'px'; + if (match) + unit = match[1]; + return [unit, value]; + }; + return CSSUtil; +}()); +exports.CSSUtil = CSSUtil; + + +/***/ }, + +/***/ "./src/v4/util/CacheUtil.ts" +/*!**********************************!*\ + !*** ./src/v4/util/CacheUtil.ts ***! + \**********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.CacheUtil = void 0; +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var CacheUtil = /** @class */ (function () { + function CacheUtil() { + } + /* Return a pointer to the given global variable + * with its initial value as given */ + CacheUtil.getCache = function (cacheSpot, keyName, initValue) { + if (!cacheSpot) + return undefined; + var cacheObj = (cacheSpot.nodeType === 9 /* Node.DOCUMENT_NODE */ || cacheSpot.nodeType === 11 /* Node.DOCUMENT_FRAGMENT_NODE */) ? cacheSpot : cacheSpot; + if (cacheObj.aceCache === undefined) { + cacheObj.aceCache = {}; + } + if (cacheObj.aceCache[keyName] === undefined) { + cacheObj.aceCache[keyName] = initValue; + } + return cacheObj.aceCache[keyName]; + }; + CacheUtil.setCache = function (cacheSpot, globalName, value) { + if (!cacheSpot) + return undefined; + var cacheObj = (cacheSpot.nodeType === 9 /* Node.DOCUMENT_NODE */ || cacheSpot.nodeType === 11 /* Node.DOCUMENT_FRAGMENT_NODE */) ? cacheSpot : cacheSpot; + if (cacheObj.aceCache === undefined) { + cacheObj.aceCache = {}; + } + cacheObj.aceCache[globalName] = value; + return value; + }; + CacheUtil.getSetCache = function (cacheSpot, keyName, initFunc) { + if (!cacheSpot) + return undefined; + var cacheObj = (cacheSpot.nodeType === 9 /* Node.DOCUMENT_NODE */ || cacheSpot.nodeType === 11 /* Node.DOCUMENT_FRAGMENT_NODE */) ? cacheSpot : cacheSpot; + if (cacheObj.aceCache === undefined) { + cacheObj.aceCache = {}; + } + if (cacheObj.aceCache[keyName] === undefined || typeof cacheObj.aceCache[keyName] === "undefined") { + cacheObj.aceCache[keyName] = initFunc(); + } + return cacheObj.aceCache[keyName]; + }; + CacheUtil.clearCaches = function (cacheRoot) { + var numNodesVisited = 0; + delete cacheRoot.ownerDocument.aceCache; + var nw = new DOMWalker_1.DOMWalker(cacheRoot, false, cacheRoot, true); + do { + ++numNodesVisited; + delete nw.node.aceCache; + nw.node.ownerDocument && delete nw.node.ownerDocument.aceCache; + } while (nw.nextNode()); + return numNodesVisited; + }; + return CacheUtil; +}()); +exports.CacheUtil = CacheUtil; + + +/***/ }, + +/***/ "./src/v4/util/ClipPathUtil.ts" +/*!*************************************!*\ + !*** ./src/v4/util/ClipPathUtil.ts ***! + \*************************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ClipPathUtil = void 0; +var CacheUtil_1 = __webpack_require__(/*! ./CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var CSSUtil_1 = __webpack_require__(/*! ./CSSUtil */ "./src/v4/util/CSSUtil.ts"); +var ClipPathUtil = /** @class */ (function () { + function ClipPathUtil() { + } + /** + * This function is responsible for checking if the node that is visually hidden by css clip-path: + * + * Note 1: If either current node or any of the parent nodes are visually hidden then this + * function will return true (node is not visually hidden). + * + * Note 2: nodes with CSS properties clip-path, the content is not considered hidden to an AT. Text hidden with these methods + * can still be reedable by screen readers. + * Note 3: if a link, form control, or other focusable element is given this style, the element would be focusable but not visible, + * keyboard users might be confused. + * + * @parm {Node} node The node which should be checked if it is visually hidden or not. + * @return {bool} true if the node is visually hidden, false otherwise + * + * @memberOf VisUtil + */ + ClipPathUtil.isNodeVisuallyHiddenByClipPath = function (node) { + if (!node || node.nodeType !== 1) + return false; + var elem = node; + var hidden = CacheUtil_1.CacheUtil.getCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", undefined); + if (hidden !== undefined) + return hidden; + var style = CSSUtil_1.CSSUtil.getComputedStyle(elem); + var width = parseInt(style.width); //always in px + var height = parseInt(style.height); //always in px + var path = style['clip-path']; + if (!path || path.trim() === 'none' || path.trim() === '') { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + path = path.trim().replace(/\s+/g, ' ').toLowerCase(); + var index = path.indexOf("inset("); + if (index !== -1) { + var round_index = path.indexOf("round"); + var str = path.substring(path.indexOf("(") + 1, path.indexOf(")")); + if (round_index !== -1) + str = path.substring(path.indexOf("(") + 1, round_index); + var numbers = str.trim().split(" "); + // When one value is specified, it applies the same inset to all four sides + if (numbers.length === 1) { + var ret = ClipPathUtil.isClippedByInset(elem, numbers[0], numbers[0], numbers[0], numbers[0]); + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", ret); + return ret; + } + // When two values are specified, the first value applies to the top and bottom, the second to the left and right. + if (numbers.length === 2) { + var ret = ClipPathUtil.isClippedByInset(elem, numbers[0], numbers[1], numbers[0], numbers[1]); + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", ret); + return ret; + } + // When three values are specified, the first applies to the top, the second to the right and left, the third to the bottom. + if (numbers.length === 3) { + var ret = ClipPathUtil.isClippedByInset(elem, numbers[0], numbers[1], numbers[1], numbers[2]); + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", ret); + return ret; + } + // When four values are specified, the values apply to the top, right, bottom, and left in that order (clockwise). + if (numbers.length === 4) { + var ret = ClipPathUtil.isClippedByInset(elem, numbers[0], numbers[1], numbers[2], numbers[3]); + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", ret); + return ret; + } + } + index = path.indexOf("rect("); + if (index !== -1) { + var round_index = path.indexOf("round"); + var str = path.substring(path.indexOf("(") + 1, path.indexOf(")")); + if (round_index !== -1) + str = path.substring(path.indexOf("(") + 1, round_index); + var numbers = str.trim().split(" "); + /** + * The first (top) and third (bottom) values are distances from the top edge of the containing block, + * and the second (right) and fourth (left) values are distances from the left edge of the containing block. + * The second (right) and third (bottom) values are clamped by the fourth (left) and first (top) values, respectively, + * + * If auto is used for the first (top) or fourth (left) value, the value of auto is 0, + * and if used for the second (right) or third (bottom) value, the value of auto is 100%. + */ + if (numbers[0] === 'auto') + numbers[0] = '0px'; + if (numbers[3] === 'auto') + numbers[3] = '0px'; + if (numbers[1] === 'auto') + numbers[1] = '100%'; + if (numbers[2] === 'auto') + numbers[2] = '100%'; + // to prevent the bottom edge from crossing over the top edge and right edge from crossing over the left edge. + // for example, rect(10px 0 0 20px) is clamped to rect(10px 20px 10px 20px) + numbers[2] = Math.max(numbers[0], numbers[2]); + numbers[1] = Math.max(numbers[1], numbers[3]); + var top_1 = parseInt(numbers[0]); + if (isNaN(top_1)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + if (numbers[0].endsWith("%")) + top_1 = top_1 * height / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(top_1); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + top_1 = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (top_1 >= height) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + var left = parseInt(numbers[3]); + if (isNaN(left)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + if (numbers[3].endsWith("%")) + left = left * width / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(left); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + left = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (left >= width) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + var right = parseInt(numbers[1]); + if (isNaN(right)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + if (numbers[1].endsWith("%")) + right = right * width / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(right); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + right = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + var bottom = parseInt(numbers[2]); + if (isNaN(bottom)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + if (numbers[2].endsWith("%")) + bottom = bottom * height / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(bottom); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + bottom = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if ((bottom - top_1) <= ClipPathUtil.THRESHOLD || (right - left) <= ClipPathUtil.THRESHOLD) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + index = path.indexOf("xywh("); + if (index !== -1) { + var round_index = path.indexOf("round"); + var str = path.substring(path.indexOf("(") + 1, path.indexOf(")")); + if (round_index !== -1) + str = path.substring(path.indexOf("(") + 1, round_index); + var numbers = str.trim().split(" "); + var x = parseInt(numbers[0]); + if (isNaN(x)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + if (numbers[0].endsWith("%")) + x = x * width / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(top); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + x = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (x >= width) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + var y = parseInt(numbers[1]); + if (isNaN(y)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + if (numbers[1].endsWith("%")) + y = y * height / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(y); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + scrollY = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (y >= height) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + var w = parseInt(numbers[2]); + if (isNaN(w)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + if (numbers[2].endsWith("%")) + w = w * width / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(w); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + w = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (w <= ClipPathUtil.THRESHOLD) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", true); + return true; + } + var h = parseInt(numbers[3]); + if (isNaN(h)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + if (numbers[3].endsWith("%")) + h = h * height / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(h); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + h = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (h <= ClipPathUtil.THRESHOLD) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + index = path.indexOf("circle("); + if (index !== -1) { + var str = path.substring(path.indexOf("(") + 1, path.indexOf(")")); + var numbers = str.trim().split(" "); + var radius = parseInt(numbers[0]); + if (isNaN(radius)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + if (numbers[0].endsWith("%")) { + var short = width > height ? height : width; + radius = radius * short / 100; + } + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(radius); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + radius = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (radius <= ClipPathUtil.THRESHOLD) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + index = path.indexOf("ellipse("); + if (index !== -1) { + var str = path.substring(path.indexOf("(") + 1, path.indexOf(")")); + var numbers = str.trim().split(" "); + // ellipse(closest-side farthest-side at 30% 40%); + if (numbers.length > 3 && numbers[0] === 'closest-side' && numbers[1] === 'farthest-side' && numbers[2] === 'at') { + var radius = parseInt(numbers[3]); + if (numbers.length === 4) { + if (numbers[3].endsWith("%")) { + var value = width > height ? height : width; + radius = radius * value / 100; + } + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(radius); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + radius = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (radius <= ClipPathUtil.THRESHOLD) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + else if (numbers.length === 5) { + for (var i = 3; i < numbers.length; i++) { + var radius_1 = parseInt(numbers[i]); + if (numbers[i].endsWith("%")) { + var value = (i === 3) ? width : height; + radius_1 = radius_1 * value / 100; + } + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(radius_1); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + radius_1 = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (radius_1 <= ClipPathUtil.THRESHOLD) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + // ellipse(40% 50% at left); + var at_index = path.indexOf("at"); + str = path.substring(path.indexOf("(") + 1, path.indexOf(")")); + if (at_index !== -1) + str = path.substring(path.indexOf("(") + 1, at_index); + numbers = str.trim().split(" "); + if (numbers.length !== 2) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + for (var i = 0; i < numbers.length; i++) { + var radius = parseInt(numbers[i]); + if (numbers[i].endsWith("%")) { + var value = (i === 0) ? width : height; + radius = radius * value / 100; + } + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(radius); + if (!pair) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + radius = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + if (radius <= ClipPathUtil.THRESHOLD) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + index = path.indexOf("polygon("); + if (index !== -1) { + var str = path.substring(path.indexOf("(") + 1, path.indexOf(")")); + var numbers = str.trim().split(","); + // polygon(nonzero|evenodd, 0% 0%, 50% 50%, 0% 100%) + if (numbers[0] === 'nonzero' || numbers[0] === 'evenodd') + numbers.shift(); + var y = 0; + var x = 0; + var changed_x = false; + var changed_y = false; + for (var i = 0; i < numbers.length; i++) { + var coordinates = numbers[i].trim().split(" "); + if (coordinates.length != 2) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + var coordinate_xy = [0, 0]; + for (var i_1 = 0; i_1 < 2; i_1++) { + var value = parseInt(coordinates[i_1]); + if (isNaN(value)) + return false; + if (coordinates[i_1].endsWith("%")) + coordinate_xy[i_1] = (i_1 === 0) ? value * width / 100 : value * height / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(coordinates[i_1]); + if (!pair) + return false; + coordinate_xy[i_1] = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + } + if (i === 0) { + x = coordinate_xy[0]; + y = coordinate_xy[1]; + } + if (Math.abs(coordinate_xy[0] - x) >= ClipPathUtil.THRESHOLD) + changed_x = true; + if (Math.abs(coordinate_xy[1] - y) >= ClipPathUtil.THRESHOLD) + changed_y = true; + } + if (changed_x && changed_y) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN_CLIPPATH", false); + return false; + }; + ClipPathUtil.isClippedByInset = function (elem, top, right, bottom, left) { + if (right === void 0) { right = '0px'; } + if (bottom === void 0) { bottom = '0px'; } + if (left === void 0) { left = '0px'; } + var style = CSSUtil_1.CSSUtil.getComputedStyle(elem); + var width = parseInt(style.width); //always in px + var height = parseInt(style.height); //always in px + // top + var top_value = parseInt(top); + if (isNaN(top_value)) + return false; + if (top.endsWith("%")) + top_value = top_value * height / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(top); + if (!pair) + return false; + top_value = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + //inset outside of the container + if (top_value > height) + return false; + // right + var right_value = parseInt(right); + if (isNaN(right_value)) + return false; + if (right.endsWith("%")) + right_value = right_value * width / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(right); + if (!pair) + return false; + right_value = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + //inset outside of the container + if (right_value > width) + return false; + // bottom + var bottom_value = parseInt(bottom); + if (isNaN(bottom_value)) + return false; + if (bottom.endsWith("%")) + bottom_value = bottom_value * height / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(bottom); + if (!pair) + return false; + bottom_value = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + //inset outside of the container + if (bottom_value > height) + return false; + // left + var left_value = parseInt(left); + if (isNaN(left_value)) + return false; + if (left.endsWith("%")) + left_value = left_value * width / 100; + else { + var pair = CSSUtil_1.CSSUtil.getValueUnitPair(left); + if (!pair) + return false; + left_value = CSSUtil_1.CSSUtil.convertValue2Pixels(pair[0], pair[1], elem); + } + //inset outside of the container + if (left_value > width) + return false; + if (height - (top_value + bottom_value) <= ClipPathUtil.THRESHOLD || width - (right_value + left_value) <= ClipPathUtil.THRESHOLD) + return true; + return false; + }; + ClipPathUtil.THRESHOLD = 5; // 5px + return ClipPathUtil; +}()); +exports.ClipPathUtil = ClipPathUtil; + + +/***/ }, + +/***/ "./src/v4/util/ColorUtil.ts" +/*!**********************************!*\ + !*** ./src/v4/util/ColorUtil.ts ***! + \**********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ColorObj = exports.ColorUtil = void 0; +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var ColorUtil = /** @class */ (function () { + function ColorUtil() { + } + // Rewrite the color object to account for alpha + ColorUtil.Color = function (cssStyleColor) { + if (!cssStyleColor) + return null; + cssStyleColor = cssStyleColor.toLowerCase(); + if (cssStyleColor === "transparent") + return new ColorObj(255, 255, 255, 0); + if (cssStyleColor in ColorUtil.CSSColorLookup) + cssStyleColor = ColorUtil.CSSColorLookup[cssStyleColor]; + if (cssStyleColor.startsWith("rgb(")) { + var rgbRegex = /\s*rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/; + var m = cssStyleColor.match(rgbRegex); + if (m === null) + return null; + else { + return new ColorObj(m[1], m[2], m[3]); + } + } + else if (cssStyleColor.startsWith("rgba(")) { + var rgbRegex = /\s*rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(.+)\s*\)/; + var m = cssStyleColor.match(rgbRegex); + if (m === null) + return null; + else { + return new ColorObj(m[1], m[2], m[3], m[4]); + } + } + else if (cssStyleColor.charAt(0) != "#") { + return null; + } + else { + if (cssStyleColor.length === 4) { + // The three-digit RGB (#rgb) is converted to six-digit form (#rrggbb) by replicating digits + // (https://www.w3.org/TR/css-color-3/#rgb-color) + cssStyleColor = "#" + cssStyleColor.charAt(1).repeat(2) + + cssStyleColor.charAt(2).repeat(2) + + cssStyleColor.charAt(3).repeat(2); + } + var thisRed = parseInt(cssStyleColor.substring(1, 3), 16); + var thisGreen = parseInt(cssStyleColor.substring(3, 5), 16); + var thisBlue = parseInt(cssStyleColor.substring(5, 7), 16); + return new ColorObj(thisRed, thisGreen, thisBlue); + } + // return null; // Unreachable + }; + ; + ColorUtil.ColorCombo = function (ruleContext) { + try { + var doc = ruleContext.ownerDocument; + if (!doc) { + return null; + } + var win = doc.defaultView; + if (!win) { + return null; + } + var ancestors = []; + var walkNode = ruleContext; + while (walkNode) { + if (walkNode.nodeType === 1) + ancestors.push(walkNode); + walkNode = DOMWalker_1.DOMWalker.parentElement(walkNode); + } + var retVal = { + "hasGradient": false, + "hasBGImage": false, + "textShadow": false, + "fg": null, + "bg": null + }; + // start + var cStyle = win.getComputedStyle(ruleContext); + var compStyleColor = cStyle.color; + if (!compStyleColor) + compStyleColor = "black"; + var fg = ColorUtil.Color(compStyleColor); + var reColor = /transparent|rgba?\([^)]+\)/gi; + var guessGradColor = function (gradList, bgColor, fgColor) { + try { + // If there's only one color, return that + if (typeof gradList.length === "undefined") + return gradList; + var overallWorst = null; + var overallWorstRatio = null; + for (var iGrad = 1; iGrad < gradList.length; ++iGrad) { + var worstColor = gradList[iGrad - 1]; + var worstRatio = fgColor.contrastRatio(gradList[iGrad - 1]); + var step = .1; + var idx = 0; + while (step > .0001) { + while (idx + step <= 1 && worstRatio > fgColor.contrastRatio(gradList[iGrad].mix(gradList[iGrad - 1], idx + step).getOverlayColor(bgColor))) { + worstColor = gradList[iGrad].mix(gradList[iGrad - 1], idx + step).getOverlayColor(bgColor); + worstRatio = fgColor.contrastRatio(worstColor); + idx = idx + step; + } + while (idx - step >= 0 && worstRatio > fgColor.contrastRatio(gradList[iGrad].mix(gradList[iGrad - 1], idx - step).getOverlayColor(bgColor))) { + worstColor = gradList[iGrad].mix(gradList[iGrad - 1], idx - step).getOverlayColor(bgColor); + worstRatio = fgColor.contrastRatio(worstColor); + idx = idx - step; + } + step = step / 10; + } + if (overallWorstRatio === null || overallWorstRatio > worstRatio) { + overallWorstRatio = worstRatio; + overallWorst = worstColor; + } + } + return overallWorst; // return the darkest color + } + catch (e) { + console.log(e); + } + return bgColor; + }; + var priorStackBG = ColorUtil.Color("white"); + var thisStackOpacity = null; + var thisStackAlpha = null; + var thisStackBG = null; + // Ancestors processed from the topmost parent toward the child + while (ancestors.length > 0) { + var procNext = ancestors.pop(); + //var procNext = ancestors.splice(0, 1)[0]; + // cStyle is the computed style of this layer + var cStyle = win.getComputedStyle(procNext); + if (cStyle === null) + continue; + // thisBgColor is the color of this layer or null if the layer is transparent + var thisBgColor = null; + if (cStyle.backgroundColor && cStyle.backgroundColor != "transparent" && cStyle.backgroundColor != "rgba(0, 0, 0, 0)") { + thisBgColor = ColorUtil.Color(cStyle.backgroundColor); + } + // If there is a gradient involved, set thisBgColor to the worst color combination available against the foreground + if (cStyle.backgroundImage && cStyle.backgroundImage.indexOf && cStyle.backgroundImage.indexOf("gradient") != -1) { + var gradColors = cStyle.backgroundImage.match(reColor); + if (gradColors) { + var gradColorComp = []; + for (var i = 0; i < gradColors.length; ++i) { + if (!gradColors[i].length) { + gradColors.splice(i--, 1); + } + else { + var colorComp = ColorUtil.Color(gradColors[i]); + if (colorComp.alpha !== undefined && colorComp.alpha < 1) { + // mix the grdient bg color wit parent bg if alpha < 1 + var compStackBg = thisStackBG || priorStackBG; + colorComp = colorComp.getOverlayColor(compStackBg); + } + gradColorComp.push(colorComp); + } + } + thisBgColor = guessGradColor(gradColorComp, thisStackBG || priorStackBG, fg); + } + } + // Handle non-solid opacity + if (thisStackOpacity === null || (cStyle.opacity && cStyle.opacity.length > 0 && parseFloat(cStyle.opacity) < 1)) { + // New stack, reset + if (thisStackBG != null) { + // Overlay + thisStackBG.alpha = thisStackOpacity * thisStackAlpha; + priorStackBG = thisStackBG.getOverlayColor(priorStackBG); + } + thisStackOpacity = 1.0; + thisStackAlpha = null; + thisStackBG = null; + if (cStyle.opacity && cStyle.opacity.length > 0) { + thisStackOpacity = parseFloat(cStyle.opacity); + } + if (thisBgColor != null) { + thisStackBG = thisBgColor; + thisStackAlpha = thisStackBG.alpha || 1.0; + delete thisStackBG.alpha; + if (thisStackOpacity === 1.0 && thisStackAlpha === 1.0) { + retVal.hasBGImage = false; + retVal.hasGradient = false; + } + } + } + // Handle solid color backgrounds and gradient color backgrounds + else if (thisBgColor != null) { + // If this stack already has a background color, blend it + if (thisStackBG === null) { + thisStackBG = thisBgColor; + thisStackAlpha = thisStackBG.alpha || 1.0; + delete thisStackBG.alpha; + } + else { + thisStackBG = thisBgColor.getOverlayColor(thisStackBG); + //thisStackAlpha = thisBgColor.alpha || 1.0; + thisStackAlpha = thisStackBG.alpha || 1.0; + } + // #526: If thisBgColor had an alpha value, it may not expose through thisStackBG in the above code + // We can't wipe out the gradient info if this layer was transparent + if (thisStackOpacity === 1.0 && thisStackAlpha === 1.0 && (thisStackBG.alpha || 1.0) === 1.0 && (thisBgColor.alpha || 1.0) === 0) // removed by dead control flow +{} + } + if (cStyle.backgroundImage && cStyle.backgroundImage != "none") { + if (cStyle.backgroundImage.indexOf && cStyle.backgroundImage.indexOf("gradient") != -1) { + retVal.hasGradient = true; + } + else { + retVal.hasBGImage = true; + } + } + } + if (thisStackBG != null) { + fg = fg.getOverlayColor(thisStackBG); + delete fg.alpha; + } + fg.alpha = (fg.alpha || 1) * thisStackOpacity; + fg = fg.getOverlayColor(priorStackBG); + if (thisStackBG != null) { + thisStackBG.alpha = thisStackOpacity * thisStackAlpha; + priorStackBG = thisStackBG.getOverlayColor(priorStackBG); + } + retVal.fg = fg; + retVal.bg = priorStackBG; + if (cStyle.textShadow && cStyle.textShadow !== 'none') + retVal.textShadow = true; + return retVal; + } + catch (err) { + // something happened, then... + return null; + } + }; + ; + ColorUtil.CSSColorLookup = { + "aliceblue": "#f0f8ff", + "antiquewhite": "#faebd7", + "aqua": "#00ffff", + "aquamarine": "#7fffd4", + "azure": "#f0ffff", + "beige": "#f5f5dc", + "bisque": "#ffe4c4", + "black": "#000000", + "blanchedalmond": "#ffebcd", + "blue": "#0000ff", + "blueviolet": "#8a2be2", + "brown": "#a52a2a", + "burlywood": "#deb887", + "cadetblue": "#5f9ea0", + "chartreuse": "#7fff00", + "chocolate": "#d2691e", + "coral": "#ff7f50", + "cornflowerblue": "#6495ed", + "cornsilk": "#fff8dc", + "crimson": "#dc143c", + "cyan": "#00ffff", + "darkblue": "#00008b", + "darkcyan": "#008b8b", + "darkgoldenrod": "#b8860b", + "darkgray": "#a9a9a9", + "darkgreen": "#006400", + "darkkhaki": "#bdb76b", + "darkmagenta": "#8b008b", + "darkolivegreen": "#556b2f", + "darkorange": "#ff8c00", + "darkorchid": "#9932cc", + "darkred": "#8b0000", + "darksalmon": "#e9967a", + "darkseagreen": "#8fbc8f", + "darkslateblue": "#483d8b", + "darkslategray": "#2f4f4f", + "darkturquoise": "#00ced1", + "darkviolet": "#9400d3", + "deeppink": "#ff1493", + "deepskyblue": "#00bfff", + "dimgray": "#696969", + "dodgerblue": "#1e90ff", + "firebrick": "#b22222", + "floralwhite": "#fffaf0", + "forestgreen": "#228b22", + "fuchsia": "#ff00ff", + "gainsboro": "#dcdcdc", + "ghostwhite": "#f8f8ff", + "gold": "#ffd700", + "goldenrod": "#daa520", + "gray": "#808080", + "green": "#008000", + "greenyellow": "#adff2f", + "honeydew": "#f0fff0", + "hotpink": "#ff69b4", + "indianred": "#cd5c5c", + "indigo": "#4b0082", + "ivory": "#fffff0", + "khaki": "#f0e68c", + "lavender": "#e6e6fa", + "lavenderblush": "#fff0f5", + "lawngreen": "#7cfc00", + "lemonchiffon": "#fffacd", + "lightblue": "#add8e6", + "lightcoral": "#f08080", + "lightcyan": "#e0ffff", + "lightgoldenrodyellow": "#fafad2", + "lightgrey": "#d3d3d3", + "lightgreen": "#90ee90", + "lightpink": "#ffb6c1", + "lightsalmon": "#ffa07a", + "lightseagreen": "#20b2aa", + "lightskyblue": "#87cefa", + "lightslategray": "#778899", + "lightsteelblue": "#b0c4de", + "lightyellow": "#ffffe0", + "lime": "#00ff00", + "limegreen": "#32cd32", + "linen": "#faf0e6", + "magenta": "#ff00ff", + "maroon": "#800000", + "mediumaquamarine": "#66cdaa", + "mediumblue": "#0000cd", + "mediumorchid": "#ba55d3", + "mediumpurple": "#9370d8", + "mediumseagreen": "#3cb371", + "mediumslateblue": "#7b68ee", + "mediumspringgreen": "#00fa9a", + "mediumturquoise": "#48d1cc", + "mediumvioletred": "#c71585", + "midnightblue": "#191970", + "mintcream": "#f5fffa", + "mistyrose": "#ffe4e1", + "moccasin": "#ffe4b5", + "navajowhite": "#ffdead", + "navy": "#000080", + "oldlace": "#fdf5e6", + "olive": "#808000", + "olivedrab": "#6b8e23", + "orange": "#ffa500", + "orangered": "#ff4500", + "orchid": "#da70d6", + "palegoldenrod": "#eee8aa", + "palegreen": "#98fb98", + "paleturquoise": "#afeeee", + "palevioletred": "#d87093", + "papayawhip": "#ffefd5", + "peachpuff": "#ffdab9", + "peru": "#cd853f", + "pink": "#ffc0cb", + "plum": "#dda0dd", + "powderblue": "#b0e0e6", + "purple": "#800080", + "red": "#ff0000", + "rosybrown": "#bc8f8f", + "royalblue": "#4169e1", + "saddlebrown": "#8b4513", + "salmon": "#fa8072", + "sandybrown": "#f4a460", + "seagreen": "#2e8b57", + "seashell": "#fff5ee", + "sienna": "#a0522d", + "silver": "#c0c0c0", + "skyblue": "#87ceeb", + "slateblue": "#6a5acd", + "slategray": "#708090", + "snow": "#fffafa", + "springgreen": "#00ff7f", + "steelblue": "#4682b4", + "tan": "#d2b48c", + "teal": "#008080", + "thistle": "#d8bfd8", + "tomato": "#ff6347", + "turquoise": "#40e0d0", + "violet": "#ee82ee", + "wheat": "#f5deb3", + "white": "#ffffff", + "whitesmoke": "#f5f5f5", + "yellow": "#ffff00", + "yellowgreen": "#9acd32", + "buttontext": "rgba(0, 0, 0, 0.847)", + "buttonface": "#ffffff", + "graytext": "rgba(0, 0, 0, 0.247)" + }; + return ColorUtil; +}()); +exports.ColorUtil = ColorUtil; +var ColorObj = /** @class */ (function () { + function ColorObj(red, green, blue, alpha) { + function fixComponent(comp) { + if (typeof (comp) != typeof ("")) + return comp; + var compStr = comp; + compStr = compStr.trim(); + if (compStr[compStr.length - 1] != "%") + return parseInt(compStr); + return Math.round(parseFloat(compStr.substring(0, compStr.length - 1)) * 2.55); + } + this.red = fixComponent(red); + this.green = fixComponent(green); + this.blue = fixComponent(blue); + if (typeof (alpha) != "undefined") { + this.alpha = (typeof (alpha) === typeof ("")) ? parseFloat(alpha) : alpha; + } + } + ColorObj.prototype.toHexHelp = function (value) { + var retVal = Math.round(value).toString(16); + if (retVal.length === 1) + return "0" + retVal; + return retVal; + }; + ; + ColorObj.prototype.toHex = function () { + return "#" + this.toHexHelp(this.red) + this.toHexHelp(this.green) + this.toHexHelp(this.blue); + }; + ; + ColorObj.prototype.contrastRatio = function (bgColor) { + var fgColor = this; + if (typeof (this.alpha) != "undefined") + fgColor = this.getOverlayColor(bgColor); + var lum1 = fgColor.relativeLuminance(); + if (!bgColor.relativeLuminance) { + var s = ""; + for (var key in bgColor) { + s += key + "\n"; + } + alert(bgColor); + alert(s); + } + var lum2 = bgColor.relativeLuminance(); + var ratio = (lum1 > lum2) ? (lum1 + .05) / (lum2 + .05) : (lum2 + .05) / (lum1 + .05); + return ratio; + }; + ; + ColorObj.prototype.relativeLuminance = function () { + var R = this.red / 255.0; + var G = this.green / 255.0; + var B = this.blue / 255.0; + R = R <= .04045 ? R / 12.92 : Math.pow((R + .055) / 1.055, 2.4); + G = G <= .04045 ? G / 12.92 : Math.pow((G + .055) / 1.055, 2.4); + B = B <= .04045 ? B / 12.92 : Math.pow((B + .055) / 1.055, 2.4); + return 0.2126 * R + 0.7152 * G + 0.0722 * B; + }; + ; + ColorObj.prototype.mix = function (color2, percThis) { + if (typeof (this.alpha) === "undefined" && typeof (color2.alpha) === "undefined") { + return new ColorObj(percThis * this.red + (1 - percThis) * color2.red, percThis * this.green + (1 - percThis) * color2.green, percThis * this.blue + (1 - percThis) * color2.blue); + } + else { + var alphaThis = this.alpha ? this.alpha : 1; + var alphaOther = color2.alpha ? color2.alpha : 1; + return new ColorObj(percThis * this.red + (1 - percThis) * color2.red, percThis * this.green + (1 - percThis) * color2.green, percThis * this.blue + (1 - percThis) * color2.blue, percThis * alphaThis + (1 - percThis) * alphaOther); + } + }; + ; + ColorObj.prototype.getOverlayColor = function (bgColor) { + if (typeof (this.alpha) === "undefined" || this.alpha >= 1) { + // No mixing required - it's opaque + return this; + } + if (this.alpha < 0) { + // Haac.Error.logError("Invalid alpha value"); + return null; + } + if (typeof (bgColor.alpha) != "undefined" && bgColor.alpha < 1) { + // Haac.Error.logError("Cannot mix with a background alpha"); + return null; + } + var retVal = this.mix(bgColor, this.alpha); + delete retVal.alpha; + return retVal; + }; + ColorObj.fromCSSColor = function (cssStyleColor) { + var thisRed = -1; + var thisGreen = -1; + var thisBlue = -1; + cssStyleColor = cssStyleColor.toLowerCase(); + if (cssStyleColor.startsWith("rgb(")) { + var rgbRegex = /\s*rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/; + var m = cssStyleColor.match(rgbRegex); + if (m === null) + return null; + else { + thisRed = m[1]; + thisGreen = m[2]; + thisBlue = m[3]; + } + } + else if (cssStyleColor.startsWith("rgba(")) { + var rgbRegex = /\s*rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(.+)\s*\)/; + var m = cssStyleColor.match(rgbRegex); + if (m === null) + return null; + else { + thisRed = m[1]; + thisGreen = m[2]; + thisBlue = m[3]; + } + } + else { + if (cssStyleColor.charAt(0) != "#") { + if (cssStyleColor in ColorUtil.CSSColorLookup) + cssStyleColor = ColorUtil.CSSColorLookup[cssStyleColor]; + else + return null; + } + var fromHex = function (val) { + var lookup = { + "a": 10, + "b": 11, + "c": 12, + "d": 13, + "e": 14, + "f": 15 + }; + var retVal = 0; + for (var i = 0; i < val.length; ++i) { + retVal = retVal * 16 + + parseInt(val.charAt(i) in lookup ? lookup[val.charAt(i)] : val.charAt(i)); + } + return retVal; + }; + if (cssStyleColor.length === 4) { + // The three-digit RGB (#rgb) is converted to six-digit form (#rrggbb) by replicating digits + // (https://www.w3.org/TR/css-color-3/#rgb-color) + cssStyleColor = "#" + cssStyleColor.charAt(1).repeat(2) + + cssStyleColor.charAt(2).repeat(2) + + cssStyleColor.charAt(3).repeat(2); + } + thisRed = fromHex(cssStyleColor.substring(1, 3)); + thisGreen = fromHex(cssStyleColor.substring(3, 5)); + thisBlue = fromHex(cssStyleColor.substring(5, 7)); + } + return new ColorObj(thisRed, thisGreen, thisBlue); + }; + return ColorObj; +}()); +exports.ColorObj = ColorObj; + + +/***/ }, + +/***/ "./src/v4/util/CommonUtil.ts" +/*!***********************************!*\ + !*** ./src/v4/util/CommonUtil.ts ***! + \***********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.CommonUtil = void 0; +var ARIADefinitions_1 = __webpack_require__(/*! ../../v2/aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var CacheUtil_1 = __webpack_require__(/*! ./CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var AriaUtil_1 = __webpack_require__(/*! ./AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var AccNameUtil_1 = __webpack_require__(/*! ./AccNameUtil */ "./src/v4/util/AccNameUtil.ts"); +var VisUtil_1 = __webpack_require__(/*! ./VisUtil */ "./src/v4/util/VisUtil.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var fragment_1 = __webpack_require__(/*! ../../v2/checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var CommonUtil = /** @class */ (function () { + function CommonUtil() { + } + CommonUtil.wordCount = function (str) { + str = str.trim(); + if (str.length === 0) + return 0; + return str.split(/\s+/g).length; + }; + /** + * Note that this only detects if the element itself is in the tab order. + * However, this element may delegate focus to another element via aria-activedescendant. + * Also, focus varies by browser... sticking to things that are focusable on Chrome and Firefox. + */ + CommonUtil.isTabbable = function (element) { + // Using https://allyjs.io/data-tables/focusable.html + // Handle the explicit cases first + if (!VisUtil_1.VisUtil.isNodeVisible(element)) + return false; + if (element.hasAttribute("inert") || DOMUtil_1.DOMUtil.getAncestorWithAttribute(element, "inert", "")) + return false; + if (element.hasAttribute("tabindex")) { + return parseInt(element.getAttribute("tabindex")) >= 0; + } + // Explicit cases handled - now the implicit + var nodeName = element.nodeName.toLowerCase(); + if (nodeName in CommonUtil.tabTagMap) { + var retVal = CommonUtil.tabTagMap[nodeName]; + if (typeof (retVal) === "function") { + retVal = retVal(element); + } + return retVal; + } + else { + if (element.hasAttribute("contenteditable")) + return true; + return false; + } + }; + /** + * Test if the ele node is focusable + */ + CommonUtil.isFocusable = function (ele) { + if (ele === "undefined" || ele === null) { + return false; + } + return CommonUtil.isTabbable(ele); + }; + /** + * Note that this only detects if the element itself is interactive, but not onclick event. + */ + CommonUtil.isClickable = function (element) { + if (!VisUtil_1.VisUtil.isNodeVisible(element)) + return false; + // native focusable element + var nodeName = element.nodeName.toLowerCase(); + if (nodeName in CommonUtil.tabTagMap) { + var retVal = CommonUtil.tabTagMap[nodeName]; + if (typeof (retVal) === "function") { + retVal = retVal(element); + } + return retVal; + } + else { + //custom widget + if (AriaUtil_1.AriaUtil.isWidget(element) && element.hasAttribute("tabindex")) { + return true; + } + } + return false; + }; + /* + * get conflict Aria and Html attributes + * return: a list of Aria and Html attribute pairs that are conflict + */ + CommonUtil.isTableDescendant = function (contextHierarchies) { + if (!contextHierarchies) + return null; + return contextHierarchies["aria"].filter(function (hier) { return ["table", "grid", "treegrid"].includes(hier.role); }); + }; + CommonUtil.tabIndexLEZero = function (elem) { + if (CommonUtil.hasAttribute(elem, "tabindex")) { + if (elem.getAttribute("tabindex").match(/^-?\d+$/)) { + var tabindexValue = parseInt(elem.getAttribute("tabindex")); + return tabindexValue === 0 || tabindexValue === -1; + } + } + return false; + }; + /** + * get number of tabbable children + * @param element + */ + CommonUtil.getTabbableChildren = function (element) { + var count = 0; + // If node has children, look for tab stops in the children + if (element.firstChild || element.nodeName.toUpperCase() === "IFRAME") { + var nw = new DOMWalker_1.DOMWalker(element); + while (nw.nextNode() && nw.node != element) { + if (nw.node.nodeType == 1 && !nw.bEndTag && CommonUtil.isTabbable(nw.node)) { + ++count; + } + } + } + return count; + }; + CommonUtil.normalizeSpacing = function (s) { + if (!s) + return ''; + return s.trim().replace(/\s+/g, ' '); + }; + ; + //TODO: function does not handle equivalents for roles: row, link, header, button + // But it may not have to. Bug reports have been about radio buttons and checkboxes. + CommonUtil.isHtmlEquiv = function (node, htmlEquiv) { + var retVal = false; + if (node) { + var nodeName = node.nodeName.toLowerCase(); + if (nodeName === "input") { + var type = node.getAttribute("type").toLowerCase(); + if (type) { + if (htmlEquiv.indexOf("checkbox") != -1) { + retVal = type === "checkbox"; + } + else if (htmlEquiv.indexOf("radio") != -1) { + retVal = type === "radio"; + } + } + } + } + return retVal; + }; + CommonUtil.nonExistantIDs = function (node, targetids) { + var returnnotfoundids = ''; + if (CommonUtil.normalizeSpacing(targetids).length < 1) + return returnnotfoundids; + var targetArray = targetids.split(" "); + var doc = node.ownerDocument; + for (var i = 0; i < targetArray.length; i++) { + var xp = "//*[@id='" + targetArray[i] + "']"; + var xpathResult = doc.evaluate(xp, node, doc.defaultNSResolver, 0 /* XPathResult.ANY_TYPE */, null); + var r = xpathResult.iterateNext(); + if (!r) + returnnotfoundids += targetArray[i] + ', '; + } + if (CommonUtil.normalizeSpacing(returnnotfoundids).length >= 2) + returnnotfoundids = returnnotfoundids.substring(0, returnnotfoundids.length - 2); + else + returnnotfoundids = ''; + return returnnotfoundids; + }; + CommonUtil.getDocElementsByTag = function (elem, tagName) { + var doc = fragment_1.FragmentUtil.getOwnerFragment(elem); + tagName = tagName.toLowerCase(); + var cache = CacheUtil_1.CacheUtil.getCache(doc, "RPT_DOCELEMSBYTAG", {}); + if (!(tagName in cache)) { + cache[tagName] = doc.querySelectorAll(tagName); + CacheUtil_1.CacheUtil.setCache(doc, "RPT_DOCELEMSBYTAG", cache); + } + return cache[tagName]; + }; + /** + * This function is responsible for get a list of all the child elemnts which match the tag + * name provided. + * + * Note: This is a wrapper function to: AriaUtil.getChildByTagHidden + * + * @parm {element} parentElem - The parent element + * @parm {string} tagName - The tag to search for under the parent element + * @parm {boolean} ignoreHidden - true if hidden elements with the tag should ignored from the list + * false if the hidden elements should be added + * + * @return {List} retVal - list of all the elements which matched the tag under the parent that were provided. + * + * @memberOf AriaUtil + */ + CommonUtil.getChildByTag = function (parentElem, tagName) { + return CommonUtil.getChildByTagHidden(parentElem, tagName, false, false); + }; + /** + * This function is responsible for get a list of all the child elemnts which match the tag + * name provided. + * + * @parm {element} parentElem - The parent element + * @parm {string} tagName - The tag to search for under the parent element + * @parm {boolean} ignoreHidden - true if hidden elements with the tag should ignored from the list + * false if the hidden elements should be added + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * + * @return {List} retVal - list of all the elements which matched the tag under the parent that were provided. + * + * @memberOf AriaUtil + */ + CommonUtil.getChildByTagHidden = function (parentElem, tagName, ignoreHidden, considerHiddenSetting) { + // Variable Decleration + var retVal = []; + var child = parentElem.firstChild; + // Loop over all the child elements of the parent to build a list of all the elements that + // match the tagName provided + while (child != null) { + // Only include the children into the return array if they match with tagname. + if (child.nodeName.toLowerCase() === tagName) { + // In the case that ignorehidden was set to true, then perform a isNodeVisible check + // and in the case the node is not visilble we more to theses then move to the next node. + // Perform a couple of checks to determine if hidden elements should be ignored or not. + // 1. When ignoreHidden is set to true upfront, then perform a isNodeVisible + // 2. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2.1. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + if ((ignoreHidden || (considerHiddenSetting && !CommonUtil.shouldCheckHiddenContent(child))) && !VisUtil_1.VisUtil.isNodeVisible(child)) { + // Move on to the next element + child = child.nextSibling; + continue; + } + // Push the element + retVal.push(child); + } + // Move to the next sibling element + child = child.nextSibling; + } + return retVal; + }; + /** + * This function is responsible for finding a list of elements that match given roles(s). + * This function by defauly will not consider Check Hidden Setting at all. + * This function by defauly will not consider implicit roles. + * Note: This is a wrapper function to: AriaUtil.getElementsByRoleHidden + * + * @parm {document} doc - The document node + * @parm {list or string} roles - List or single role for which to return elements based on. + * + * @return {List} retVal - list of all the elements which matched the role(s) that were provided. + * + * @memberOf AriaUtil + */ + CommonUtil.getElementsByRole = function (doc, roles) { + return CommonUtil.getElementsByRoleHidden(doc, roles, false, false); + }; + /** + * This function is responsible for finding a list of elements that match given roles(s). + * This function aslo finds elements with implicit roles. + * This function will also consider elements that are hidden based on the if the Check + * Hidden Content settings should be considered or not. + * + * @parm {document} doc - The document node + * @parm {list or string} roles - List or single role for which to return elements based on. + * @parm {bool} considerHiddenSetting - true or false based on if hidden setting should be considered. + * @parm {bool} considerImplicitRoles - true or false based on if implicit roles setting should be considered. + * + * @return {List} retVal - list of all the elements which matched the role(s) that were provided. + * + * @memberOf AriaUtil + */ + CommonUtil.getElementsByRoleHidden = function (doc, roles, considerHiddenSetting, considerImplicitRoles) { + // In the case that the role to element assoication is already made, and available in the global hasAttribute + // we can just use that one instead of building a new one. + var roleToElems = null; + if (considerImplicitRoles) { + roleToElems = CacheUtil_1.CacheUtil.getCache(doc, "AriaUtil_GETELEMENTSBY_ROLE_IMPLICIT", null); + } + else { + roleToElems = CacheUtil_1.CacheUtil.getCache(doc, "AriaUtil_GETELEMENTSBY_ROLE", null); + } + // Build the new role to element, this is where we loop through all the elements and extract all the + // elements bsaed on roles. + if (roleToElems === null) { + // Re-initialize the roleToElems hash + roleToElems = {}; + // Get the body of the doc + var root = doc.body; + // Keep looping until we are at the very parent node of the entire page, so that we can loop through + // all the nodes. + while (DOMWalker_1.DOMWalker.parentNode(root) !== null) { + // Get the parentNode + root = DOMWalker_1.DOMWalker.parentNode(root); + } + // Build a nodewalter based of the root node, this node walter will be use loop over all the nodes + // and build the roles to Element coralation + var nw = new DOMWalker_1.DOMWalker(root); + // Loop over the entire doc/list of nodes to build the role to element map + // Note: This will build an roleToElems hash which is in the following format. + // roleToElems = { + // document: [{div},{abbr},{var}], + // main: [{div}], + // navigation: [{div}] + // } + while (nw.nextNode()) { + if (!nw.elem()) + continue; + // Only check the elements which have the role attribute assiciated to them + if (!nw.bEndTag) { + var wRoles = []; + //check if the node has role attributes + if (nw.elem() && nw.elem().hasAttribute("role")) { + // Extract all the roles that are assigned to this element, can have multiple roles on one + // element split by space, so we need to extract all of them into an array. + wRoles = nw.elem().getAttribute("role").split(" "); + } + if (nw.elem() && wRoles.length === 0 && considerImplicitRoles) { + //check if there are any implicit roles for this element. + var implicitRole = AriaUtil_1.AriaUtil.getImplicitRole(nw.node); + if (implicitRole !== null && implicitRole.length > 0) + wRoles = implicitRole; + } + if (wRoles.length === 0) { + continue; + } + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. If considerHiddenSetting option is set to true then we perform the check to consider the + // Check Hidden Content that is provided. + // 2. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we do not + // add it to the roleToElems hash at all or even do any checking for it at all. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (considerHiddenSetting && CommonUtil.shouldNodeBeSkippedHidden(nw.node)) { + continue; + } + // Loop through all the roles and assigned this node to all thes roles + for (var i = 0; i < wRoles.length; ++i) { + // In the case that the role key is not already in the roleToElems hash, construct the + // add the key and assign empty array. + if (!(wRoles[i] in roleToElems)) { + roleToElems[wRoles[i]] = []; + } + // Add the node to the array for the role + roleToElems[wRoles[i]].push(nw.node); + } + } + } + // Set the roleToElems hash map as a global variable + if (considerImplicitRoles) { + CacheUtil_1.CacheUtil.setCache(doc, "AriaUtil_GETELEMENTSBY_ROLE_IMPLICIT", roleToElems); + } + else { + CacheUtil_1.CacheUtil.setCache(doc, "AriaUtil_GETELEMENTSBY_ROLE", roleToElems); + } + } + // Initilize the return value + var retVal = []; + // Handle the cases where the provided role is a string and not an array, + // for this case we take the string and put it into an array + if (typeof (roles) === "string") { + var role = roles; + roles = []; + roles.push(role); + } + // Loop through the roles that were provided and find the list of elements for this roles + // and add them to the return value. + if (roles.length) { + // loop over all the roles + for (var i = 0; i < roles.length; ++i) { + // Extract the role from the array + var nextRole = roles[i]; + // Fetch the list of all the elements for this role + var copyRoles = roleToElems[nextRole]; + // If there are elements to copy to another array, then perform the copy + if (copyRoles) { + // Loop over all the elements which are to be copied + for (var j = 0; j < copyRoles.length; ++j) { + // Add this element to the return val + retVal.push(copyRoles[j]); + } + } + } + } + return retVal; + }; + /** + * a target is en element that accept a pointer action (click or touch) + * + */ + CommonUtil.isTarget = function (element) { + if (!element || element.nodeType !== 1 + || ["html", "body"].includes(element.nodeName.toLowerCase()) + || CommonUtil.getAncestor(element, ["svg", "pre", "code", "script", "meta", 'head']) !== null + || !VisUtil_1.VisUtil.isNodeVisible(element) || VisUtil_1.VisUtil.isNodeVisuallyHidden(element) + || CommonUtil.isNodeDisabled(element) || VisUtil_1.VisUtil.isElementOffscreen(element)) + return false; + if (CommonUtil.isClickable(element)) + return true; + var role = AriaUtil_1.AriaUtil.getResolvedRole(element); + if (!role) + return false; + var target_roles = ["listitem", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "switch", "treeitem"]; + if (target_roles.includes(role)) { + // find the proper parent elements + var parent_1 = element.parentElement; + if (parent_1) { + var parent_role = AriaUtil_1.AriaUtil.getResolvedRole(parent_1); + // datalist, fieldset, optgroup, etc. may be just used for grouping purpose, so go up to the parent + if (parent_role === 'group') + parent_1 = parent_1.parentElement; + } + if (parent_1 && CommonUtil.isTarget(parent_1)) + return true; + } + return false; + }; + CommonUtil.getFileExt = function (url) { + var m = url.match(/\.(([^;?#\.]|^$)+)([;?#]|$)/); + if (m != null && m.length >= 2) { + return "." + m[1]; + } + return ""; + }; + CommonUtil.getFileAnchor = function (url) { + var m = url.match(/#(([^;?\.]|^$)+)([;?]|$)/); + if (m != null && m.length >= 2) { + return m[1]; + } + return ""; + }; + CommonUtil.checkObjEmbed = function (node, extTest, mimeTest) { + var nodeName = node.nodeName.toLowerCase(); + if (nodeName != "object" && nodeName != "embed" && + nodeName != "a" && nodeName != "area") + return false; + var retVal = false; + // Check mime type + if (!retVal && node.hasAttribute("type")) { + var mime = node.getAttribute("type").toLowerCase(); + retVal = mimeTest(mime); + } + if (!retVal && node.hasAttribute("codetype")) { + var mime = node.getAttribute("codetype"); + retVal = mimeTest(mime); + } + // Check the filename + if (!retVal) { + var filename = ""; + if (nodeName === "embed") { + filename = node.getAttribute("src"); + } + else if (nodeName === "a" || nodeName === "area") { + filename = node.getAttribute("href"); + } + else if (node.hasAttribute("data")) { + filename = node.getAttribute("data"); + } + if (filename === null) + filename = ""; + var ext = CommonUtil.getFileExt(filename); + retVal = extTest(ext); + } + // Check for filenames in the params + if (!retVal && nodeName === "object") { + // In the case that Check Hidden Option is set then comply with that setting + var params = CommonUtil.getChildByTagHidden(node, "param", false, true); + for (var i = 0; !retVal && params != null && i < params.length; ++i) { + retVal = params[i].hasAttribute("value") && + extTest(CommonUtil.getFileExt(params[i].getAttribute("value"))); + } + } + return retVal; + }; + CommonUtil.isAudioObjEmbedLink = function (node) { + return CommonUtil.checkObjEmbed(node, CommonUtil.isAudioExt, function (mime) { + return mime.startsWith("audio"); + }); + }; + CommonUtil.isAudioExt = function (ext) { + var audio_extensions = [".aif", ".aifc", ".aiff", ".air", ".asf", ".au", ".cda", + ".dsm", ".dss", ".dwd", ".iff", ".kar", ".m1a", ".med", + ".mp2", ".mp3", ".mpa", ".pcm", ".ra", ".ram", ".rm", + ".sam", ".sf", ".sf2", ".smp", ".snd", ".svx", ".ul", + ".voc", ".wav", ".wma", ".wve" + ]; + return CommonUtil.valInArray(ext.toLowerCase(), audio_extensions); + }; + CommonUtil.isVideoObjEmbedLink = function (node) { + return CommonUtil.checkObjEmbed(node, CommonUtil.isVideoExt, function (mime) { + return mime.startsWith("video") || + mime.startsWith("application/x-shockwave-flash"); + }); + }; + CommonUtil.isVideoExt = function (ext) { + var video_extensions = [".asf", ".avi", ".divx", ".dv", ".m1v", ".m2p", ".m2v", ".moov", + ".mov", ".mp4", ".mpeg", ".mpg", ".mpv", ".ogm", ".omf", ".qt", + ".rm", ".rv", ".smi", ".smil", ".swf", ".vob", ".wmv", ".rmvb", + ".mvb" + ]; + return CommonUtil.valInArray(ext.toLowerCase(), video_extensions); + }; + CommonUtil.isImageObjEmbedLink = function (node) { + return CommonUtil.checkObjEmbed(node, CommonUtil.isImgExt, function (mime) { + return mime.startsWith("image"); + }); + }; + CommonUtil.isImgExt = function (ext) { + return CommonUtil.valInArray(ext.toLowerCase(), CommonUtil.image_extensions); + }; + CommonUtil.isHtmlExt = function (ext) { + var html_extensions = [".asp", ".aspx", ".cfm", ".cfml", ".cgi", ".htm", ".html", ".shtm", + ".shtml", ".php", ".pl", ".py", ".shtm", ".shtml", ".xhtml" + ]; + return CommonUtil.valInArray(ext.toLowerCase(), html_extensions); + }; + CommonUtil.hasTriggered = function (doc, id) { + return CacheUtil_1.CacheUtil.getCache(doc, id, false); + }; + CommonUtil.triggerOnce = function (doc, id, passed) { + if (passed) + return true; + var triggered = CacheUtil_1.CacheUtil.getCache(doc, id, false); + CacheUtil_1.CacheUtil.setCache(doc, id, true); + return triggered; + }; + /* determine if the given value exists in the given array */ + CommonUtil.valInArray = function (value, arr) { + for (var idx in arr) { + if (arr[idx] === value) + return true; + } + return false; + }; + /** + * return the ancestor of the given element + * @param tagNames string, array, or dictionary containing the tags to search for + */ + CommonUtil.getAncestor = function (element, tagNames) { + var walkNode = element; + while (walkNode !== null) { + var thisTag = walkNode.nodeName.toLowerCase(); + if (typeof (tagNames) === "string") { + if (thisTag === tagNames.toLowerCase()) { + break; + } + } + else if (tagNames.length) { + for (var idx in tagNames) { + if (tagNames[idx] === thisTag) + return walkNode; + } + } + else if (thisTag in tagNames) { + break; + } + walkNode = DOMWalker_1.DOMWalker.parentNode(walkNode); + } + return walkNode; + }; + // return true if element1 and element2 are siblings + CommonUtil.isSibling = function (element1, element2) { + if (element1 && element2) { + var node = null; + if (DOMWalker_1.DOMWalker.parentNode(element1) && DOMWalker_1.DOMWalker.parentNode(element1).firstChild) { + node = DOMWalker_1.DOMWalker.parentNode(element1).firstChild; + } + while (node) { + if (node === element2) + return true; + node = node.nextSibling; + } + } + return false; + }; + CommonUtil.isDescendant = function (parent, child) { + var node = DOMWalker_1.DOMWalker.parentNode(child); + while (node != null) { + if (node === parent) { + return true; + } + node = DOMWalker_1.DOMWalker.parentNode(node); + } + return false; + }; + //check if the first form control child is disabled + CommonUtil.isDisabledByFirstChildFormElement = function (element) { + var formElements = ["input", "textarea", "select", "keygen", "progress", "meter", "output"]; + if (element.firstChild != null) { + var nw = new DOMWalker_1.DOMWalker(element); + while (nw.nextNode()) { + if (formElements.includes(nw.node.nodeName.toLowerCase())) { + if (CommonUtil.isNodeDisabled(nw.node)) + return true; + return false; + } + } + } + return false; + }; + CommonUtil.isDisabledByReferringElement = function (element) { + var id = element.getAttribute("id"); + var doc = element.ownerDocument; + var root = doc.body; + while (DOMWalker_1.DOMWalker.parentNode(root) !== null) { + // Get the parentNode + root = DOMWalker_1.DOMWalker.parentNode(root); + } + var nw = new DOMWalker_1.DOMWalker(root); + while (nw.nextNode()) { + // check the element whose 'aria-describedby' equals to the id + if (nw.node && nw.node.nodeType === 1 && nw.elem()) { + var AriaDescribedbyIDArray = (nw.elem().getAttribute("aria-describedby") || "").split(" "); + if (AriaDescribedbyIDArray.includes(id) && CommonUtil.isNodeDisabled(nw.node)) { + return true; + } + } + } + }; + /** get element containing label for the given element + * @deprecated Deprecated because the function name is misleading. Use getLabelForElement(element) instead + */ + CommonUtil.getInputLabel = function (element) { + return CommonUtil.getLabelForElement(element); + }; + /** + * This function is responsible for getting the element containing the label for the given element. + * + * Note: This is a wrapper function to: AriaUtil.getLabelForElementHidden + * + * @parm {element} element - The element for which to get the label element for. + * + * @return {element} element - return the element for the label, otherwise null + * + * @memberOf AriaUtil + */ + CommonUtil.getLabelForElement = function (element) { + return CommonUtil.getLabelForElementHidden(element, false); + }; + /** + * This function is responsible for getting the element containing the label for the given element. + * + * This function will return null if the containing lable element is hidden, when the ignoreHidden option + * is set to true. + * + * @parm {element} element - The element for which to get the label element for. + * @parm {boolean} ignoreHidden - true if hidden elements with label should be ignored from the list + * false if the hidden elements should be added + * + * @return {element} element - return the element for the label, otherwise null + * + * @memberOf AriaUtil + */ + CommonUtil.getLabelForElementHidden = function (element, ignoreHidden) { + // Check if the global AriaUtil_LABELS hash is available, as this will contain the label nodes based on + // for attribute. + //if (!getCache(element.ownerDocument,"AriaUtil_LABELS", null)) { + var root = element.getRootNode(); + if (!CacheUtil_1.CacheUtil.getCache((root.nodeType === 11) ? root : root, "AriaUtil_LABELS", null)) { + // Variable Decleration + var idToLabel = {}; + // Get all the label elements in the entire doc + var labelNodes = CommonUtil.getDocElementsByTag(element, "label"); + // Loop over all the label nodes, in the case the label node has a for attribute, + // extract that attribute and add this node to the hash if it is visible. + for (var i = 0; i < labelNodes.length; ++i) { + if (labelNodes[i].hasAttribute("for")) { + // If ignore hidden is specified and the node is not visible we do not add it to the + // labelNodes hash. + if (ignoreHidden && !VisUtil_1.VisUtil.isNodeVisible(labelNodes[i])) { + continue; + } + idToLabel[labelNodes[i].getAttribute("for")] = labelNodes[i]; + } + } + // Add the built hash to the ownerDocument (document), to be used later to fast retrival + //setCache(element.ownerDocument, "AriaUtil_LABELS", idToLabel); + CacheUtil_1.CacheUtil.setCache((root.nodeType === 11) ? root : root, "AriaUtil_LABELS", idToLabel); + } + // If this element has an id attribute, get the corosponding label element + if (element.hasAttribute("id")) { + // Fetch the id attribute + var ctrlId = element.getAttribute("id"); + // Return the corosponding label element. + // Note: in the case that the the id is not found in the hash that means, it does not exists or is hidden + if (ctrlId.trim().length > 0) { + //return getCache(element.getRootNode().ownerDocument,"AriaUtil_LABELS",{})[ctrlId]; + return CacheUtil_1.CacheUtil.getCache((root.nodeType === 11) ? root : root, "AriaUtil_LABELS", {})[ctrlId]; + } + } + return null; + }; + /* Return specified element attribute if present else return null */ + CommonUtil.getElementAttribute = function (element, attr) { + //return (element && element.hasAttribute && element.hasAttribute(attr)) ? element.getAttribute(attr) : null; + if (!attr || !element || !element.hasAttribute || !element.hasAttribute(attr)) + return null; + var atrValue = element.getAttribute(attr); + if (!ARIADefinitions_1.ARIADefinitions.referenceProperties.includes(attr)) + return atrValue; + //attr is a reference to other elements(s) + var values = atrValue.split(/ +/g); + //ignore if none of the referred element(s) exist or all point to the element itself + var exist = false; + for (var id = 0; values < values.length; ++id) { + var referred = document.getElementById(values[id]); + if (referred && !DOMUtil_1.DOMUtil.sameNode(referred, element)) { + exist = true; + break; + } + } + return exist ? atrValue : null; + }; + // Return true if element has valid implicit label + CommonUtil.hasImplicitLabel = function (element) { + var parentNode = CommonUtil.getAncestor(element, "label"); + // Test a) if the parent is a label which is the implicit label + // b) if the form element is the first child of the label + // c) if the form element requires an implicit or explicit label : "input", "textarea", "select", "keygen", "progress", "meter", "output" + // d) form elements which may have a label: button + // form elements that do not require implicit or explicit label element are: + // "optgroup", "option", "datalist"(added later). These were handled differently in the main rule, might need to refactor the code later + if (parentNode && parentNode.tagName.toLowerCase() === "label" && CommonUtil.isFirstFormElement(parentNode, element)) { + var parentClone = parentNode.cloneNode(true); + // exclude all form elements from the label since they might also have inner content + parentClone = CommonUtil.removeAllFormElementsFromLabel(parentClone); + return CommonUtil.hasInnerContentHidden(parentClone); + } + else { + return false; + } + }; + // Return the implicit label of the given form field + CommonUtil.getImplicitLabel = function (element) { + var parentNode = CommonUtil.getAncestor(element, "label"); + // Test a) if the parent is a label which is the implicit label + // b) if the form element is the first child of the label + // c) if the form element requires an implicit or explicit label : "input", "textarea", "select", "keygen", "progress", "meter", "output" + // d) form elements which may have a label: button + // form elements that do not require implicit or explicit label element are: + // "optgroup", "option", "datalist"(added later). These were handled differently in the main rule, might need to refactor the code later + if (parentNode && parentNode.tagName.toLowerCase() === "label" && CommonUtil.isFirstFormElement(parentNode, element)) { + var parentClone = parentNode.cloneNode(true); + // exclude all form elements from the label since they might also have inner content + parentClone = CommonUtil.removeAllFormElementsFromLabel(parentClone); + var label = CommonUtil.getInnerText(parentClone); + return label && label.trim() !== '' ? label.trim() : null; + } + else + return null; + }; + /** + * This function is responsible for getting the label for a form field element. + * + * + * @parm {element} element - The element from which to get the label. + * + * @return {string} text - return the label text or null + * + * @memberOf AriaUtil + */ + CommonUtil.getFormFieldLabel = function (elem) { + // get the label from the attribute "for" of the label element + // Get only the non-hidden labels for element + var value = ""; + var label = null; + var labelElem = CommonUtil.getLabelForElementHidden(elem, true); + if (labelElem) { + // value directly from element text + label = labelElem.innerText; // ignore hidden text + } + else { + /** if it's not label with for attribute, then find implicit label + * cases for explict label: + * <label for='my'></label><input id='my'/> + * <label for='my'><input id='my'/></label> + * cases for implicit label: + * <label><input /></label> + */ + labelElem = CommonUtil.getAncestor(elem, "label"); + if (labelElem && labelElem.tagName.toLowerCase() === "label" && CommonUtil.isFirstFormElement(labelElem, elem)) { + var parentClone = labelElem.cloneNode(true); + // exclude all the text from the first form element since they might also + // have inner content that is part of innerText + parentClone = CommonUtil.removeAllFormElementsFromLabel(parentClone); + label = CommonUtil.getInnerText(parentClone); + } + else + return null; + } + if (label && label.trim() !== "") + value += label.trim(); + // value from child element attribute + label = CommonUtil.getLabelTextFromAttribute(labelElem, true); + if (label && label.trim() !== "") + value += label.trim(); + // wired case: get aria label from label element itself just in case (though name prohibited from aria in html) + label = AriaUtil_1.AriaUtil.getAriaLabel(labelElem); + if (label && label.trim() !== "") + value += label.trim(); + return value.trim(); + }; + /** + * calculate label from embedded control: https://w3c.github.io/accname/ + * @param {element} labelElem label element + * @param {boolean} ignoreHidden - true if hidden elements with label should be ignored from the list + * false if the hidden elements should be added + * @returns label text or '' + * + * note the assumption is the labelElem refers either to a labelled element by 'for' attribute + * or its first form field is labbelled element + */ + CommonUtil.getLabelTextFromAttribute = function (labelElem, ignoreHidden) { + // label either points to a labelable element by its for attribute or the first element child + // get the labelled elment if it's an implicit label + var labeledElem = null; + for (var i = 0; i < labelElem.children.length; i++) { + var child = labelElem.children.item(i); + if (CommonUtil.form_labelable_elements.includes(child.nodeName.toLowerCase())) { + labeledElem = child; + break; + } + } + var nw = new DOMWalker_1.DOMWalker(labelElem); + var text = ''; + while (nw.nextNode() && nw.node !== labelElem) { + // only check element children + if (nw.node && nw.node.nodeType === 1 && nw.elem()) { + var elem = nw.elem(); + // ignore if it's hidden, or labelled element, or first form element if not labeled by for attribute + if ((ignoreHidden && (VisUtil_1.VisUtil.isNodeHiddenFromAT(elem) || VisUtil_1.VisUtil.isNodePresentational(elem))) + || (labeledElem && labeledElem.contains(elem))) + continue; + var role = AriaUtil_1.AriaUtil.getResolvedRole(elem); + // textbox etc. return its text value + if (role === "textbox") { + var name_1 = elem.getAttribute("value"); + if (name_1 && name_1.trim().length > 0) + text += ' ' + name_1.trim(); + } + else if (role === "combobox" || role === "listbox") { + // for combobox or listbox roles, return the text alternative of the chosen option. + var selectedId = elem.getAttribute("aria-activedescendant") || elem.getAttribute("aria-selected") || elem.getAttribute("aria-checked"); + if (selectedId) { + var selectedOption = elem.ownerDocument.getElementById(selectedId); + if (selectedOption && !DOMUtil_1.DOMUtil.sameNode(elem, selectedOption)) { + var pair = AccNameUtil_1.AccNameUtil.computeAccessibleName(selectedOption); + if (pair && pair.name) + text += ' ' + pair.name.trim(); + } + } + } + else if (["progressbar", "scrollbar", "slider", "spinbutton", "meter"].includes(role)) { + // for range role type, including "progressbar", "scrollbar", "slider", "spinbutton" roles + // If the aria-valuetext property is present, return its value + var value_1 = elem.getAttribute("aria-valuetext"); + if (value_1 && value_1.trim().length > 0) + text += ' ' + value_1.trim(); + // Otherwise, if the aria-valuenow property is present, return its value, + value_1 = elem.getAttribute("aria-valuenow"); + if (value_1 && value_1.trim().length > 0) + text += ' ' + value_1.trim(); + // finally use native value attribute + value_1 = elem.getAttribute("value"); + if (value_1 && value_1.trim().length > 0) + text += ' ' + value_1.trim(); + } + // get aria label from the element + var value = AriaUtil_1.AriaUtil.getAriaLabel(elem); + if (value && value.trim() !== "") + text += ' ' + value.trim(); + } + } + return text.trim(); + }; + CommonUtil.isFirstFormElement = function (parentNode, element) { + //let formElementsRequiringLabel = ["input", "textarea", "select", "keygen", "progress", "meter", "output"]; + if (parentNode.firstChild != null) { + var nw = new DOMWalker_1.DOMWalker(parentNode); + while (nw.nextNode()) { + if (CommonUtil.form_labelable_elements.indexOf(nw.node.nodeName.toLowerCase()) !== -1) { + return nw.node === element; + } + } + } + return false; + }; + // check if the element is a shadow host or descendant of a shadow host, but not a descedant of the shadow root of the host (to be assigned to shadow slot or ignored) + CommonUtil.isShadowHostElement = function (element) { + if (CommonUtil.isShadowElement(element)) + return false; + var walkNode = element; + while (walkNode) { + if (walkNode.shadowRoot) + return true; + walkNode = DOMWalker_1.DOMWalker.parentElement(walkNode); + } + return false; + }; + //check if an element is in a shadow tree + CommonUtil.isShadowElement = function (element) { + var root = element.getRootNode(); + if (root.toString() === "[object ShadowRoot]") + return true; + return false; + }; + CommonUtil.removeAllFormElementsFromLabel = function (element) { + var formElements = ["input", "textarea", "select", "button", "datalist", "optgroup", "option", "keygen", "output", "progress", "meter"]; + var childNodes = element.childNodes; + for (var i = 0; i < childNodes.length; i++) { + if (formElements.indexOf(childNodes[i].nodeName.toLowerCase()) > -1) { + element.removeChild(childNodes[i]); + } + } + return element; + }; + /** + * @param element + * @param idStr + * @returns true if any one (if multiple Ids) id points to itself + */ + CommonUtil.isIdReferToSelf = function (element, idStr) { + if (!idStr || idStr.trim() === '') + return false; + var ids = idStr.trim().split(" "); + for (var j = 0, length_1 = ids.length; j < length_1; ++j) { + var referredNode = fragment_1.FragmentUtil.getById(element, ids[j]); + if (referredNode && DOMUtil_1.DOMUtil.sameNode(referredNode, element)) + return true; + } + return false; + }; + /* Determine the node depth of the given element */ + CommonUtil.nodeDepth = function (element) { + var depth = 0; + var walkNode = element; + while (walkNode !== null) { + walkNode = DOMWalker_1.DOMWalker.parentNode(walkNode); + depth = depth + 1; + } + return depth; + }; + /* compare node order of the 2 given nodes */ + /* returns + * 0 if the nodes are equal + * 1 if node b is before node a + * -1 if node a is before node b + * 2 if node a is nested in node b + * -2 if node b is nested in node a + * null if either node is null or their parent nodes are not equal + */ + CommonUtil.compareNodeOrder = function (nodeA, nodeB) { + if (nodeA === nodeB) + return 0; + var aDepth = CommonUtil.nodeDepth(nodeA); + var bDepth = CommonUtil.nodeDepth(nodeB); + if (bDepth > aDepth) { + for (var i = 0; i < bDepth - aDepth; ++i) + nodeB = DOMWalker_1.DOMWalker.parentNode(nodeB); + if (nodeA === nodeB) // Node B nested in Node A + return -2; + } + else if (aDepth > bDepth) { + for (var i = 0; i < aDepth - bDepth; ++i) + nodeA = DOMWalker_1.DOMWalker.parentNode(nodeA); + if (nodeA === nodeB) // Node A nested in Node B + return 2; + } + while (nodeA != null && nodeB != null && DOMWalker_1.DOMWalker.parentNode(nodeA) != DOMWalker_1.DOMWalker.parentNode(nodeB)) { + nodeA = DOMWalker_1.DOMWalker.parentNode(nodeA); + nodeB = DOMWalker_1.DOMWalker.parentNode(nodeB); + } + if (nodeA === null || nodeB === null || DOMWalker_1.DOMWalker.parentNode(nodeA) != DOMWalker_1.DOMWalker.parentNode(nodeB)) + return null; + while (nodeB != null && nodeB != nodeA) + nodeB = nodeB.previousSibling; + if (nodeB === null) // nodeB before nodeA + return 1; + else + return -1; + }; + /** + * Determine if the given attribute of the given element is not empty + * @memberOf AriaUtil + */ + CommonUtil.attributeNonEmpty = function (element, attrStr) { + return element.hasAttribute(attrStr) && element.getAttribute(attrStr).trim().length > 0; + }; + /* Return a pointer to the given frame, null if not found */ + CommonUtil.getFrameByName = function (ruleContext, frameName) { + var window = ruleContext.ownerDocument.defaultView; + var frameList = [window]; + var idx = 0; + while (idx < frameList.length) { + try { + if (frameList[idx].name === frameName) + return frameList[idx]; + for (var i = 0; i < frameList[idx].frames.length; ++i) { + try { + // Ensure it's a real frame and avoid recursion + if (frameList[idx].frames[i] && !frameList.includes(frameList[idx].frames[i])) { + frameList.push(frameList[idx].frames[i]); + } + } + catch (e) { } + } + } + catch (e) { } + ++idx; + } + return null; + }; + CommonUtil.defaultNSResolver = function (prefix) { + var uri; + switch (prefix) { + case 'html': + uri = 'http://www.w3.org/1999/xhtml'; + case 'x2': + uri = 'http://www.w3.org/TR/xhtml2'; + case 'x': + uri = 'http://www.w3.org/1999/xhtml'; + case 'xhtml': + uri = 'http://www.w3.org/1999/xhtml'; + default: + uri = null; + } + return uri; + }; + //checking if only the inner text is empty or not + CommonUtil.isInnerTextOnlyEmpty = function (element) { + // Get the innerText of the element + var text = element.innerText; + if ((text === undefined || text === null || text.trim().length === 0) && element.nodeName.toLowerCase() !== 'slot' && element.textContent !== undefined) { + //ignore slot because its text will be filled by the corresponding content in the light DOM + // innerText is sometimes 'undefined' in headless mode, or null if the element is invisible or not erxpanded + // so we try textContent as a workaround + text = element.textContent; + } + var retVal = !(text !== null && text.trim().length > 0); + if (element.nodeType === 1 && element.nodeName.toLowerCase() === "slot") { + //TODO: need to conside its own content, a slot may have its own content or assigned content + for (var _i = 0, _a = element.assignedNodes(); _i < _a.length; _i++) { + var slotElem = _a[_i]; + retVal = retVal && CommonUtil.isInnerTextEmpty(slotElem); + } + } + // Trim the inner text and verify that it is not empty. + return retVal; + }; + /* Return the inner text of the given element */ + CommonUtil.getInnerText = function (element) { + var retVal = element.innerText; + if (retVal === undefined || retVal === null || retVal.trim() === "") + retVal = element.textContent; + return retVal; + }; + /** + * return onscreen innerText only. + * This function should return the same result as innerText if no offscreen content exists + * + * @parm {element} node The node which should be checked it has inner text or not. + * @return {null | string} null if element has empty inner text, text otherwise + * + * @memberOf AriaUtil + */ + CommonUtil.getOnScreenInnerText = function (element) { + if (!element) + return null; + if (element.nodeType === 3) + return element.nodeValue(); + var text = ""; + var nw = new DOMWalker_1.DOMWalker(element); + // Loop over all the childrens of the element to get the text + while (nw.nextNode() && nw.node !== element && nw.node !== element.parentNode) { + if (nw.bEndTag) + continue; + if (nw.node.nodeType === 1 && (VisUtil_1.VisUtil.hiddenByDefaultElements.includes(nw.node.nodeName.toLowerCase()) || !VisUtil_1.VisUtil.isNodeVisible(nw.node) || VisUtil_1.VisUtil.isElementOffscreen(nw.node))) { + /** special case for svg <title> element: + * text in a <title> element is not rendered as part of the graphic, but browsers usually display it as a tooltip + * note some svg elements, such as title, desc, have a bounds {"left":0,"top":0,"height":0,"width":0} + */ + if (nw.node.nodeName.toLowerCase() === 'title' && CommonUtil.getAncestor(nw.node, "svg")) + continue; + if (nw.node.nextSibling) { + if (nw.node.nextSibling.nodeType === 3 && nw.node.nextSibling.nodeValue && nw.node.nextSibling.nodeValue.trim() !== '') + text += ' ' + nw.node.nextSibling.nodeValue.trim(); + nw.node = nw.node.nextSibling; + continue; + } + else + break; + } + if (nw.node.nodeType === 3 && nw.node.nodeValue && nw.node.nodeValue.trim() !== '') { + text += ' ' + nw.node.nodeValue.trim(); + } + } + return text.trim(); + }; + /** Return the text content of the given node + * this is different than innerText or textContent that return text content of a node and its descendants + */ + CommonUtil.getNodeText = function (element) { + if (!element) + return ""; + var text = ""; + var childNodes = element.childNodes; + for (var i = 0; i < childNodes.length; ++i) { + if (childNodes[i].nodeType == 3) { + text += childNodes[i].nodeValue; + } + } + return text; + }; + /** + * This function is responsible for checking if elements inner text is empty or not. + * + * @parm {element} node The node which should be checked it has inner text or not. + * @return {bool} true if element has empty inner text, false otherwise + * + * @memberOf AriaUtil + */ + CommonUtil.isInnerTextEmpty = function (element) { + // Get the innerText of the element + var text = CommonUtil.getInnerText(element); + // Trim the inner text and verify that it is not empty. + return !(text != null && text.trim().length > 0); + }; + CommonUtil.hasInnerContent = function (element) { + var text = CommonUtil.getInnerText(element); + var hasContent = (text !== null && text.trim().length > 0); + if (element.firstChild !== null) { + var nw = new DOMWalker_1.DOMWalker(element); + while (!hasContent && nw.nextNode()) { + hasContent = (nw.node.nodeName.toLowerCase() === "img" && + CommonUtil.attributeNonEmpty(nw.node, "alt")); + } + } + return hasContent; + }; + /** + * This function is responsible for determine if an element has inner content. + * This function also considers cases where inner text is hidden, which now will + * be classified as does not have hidden content. + * + * @parm {element} node The node which should be checked it has inner text or not. + * @return {bool} true if element has empty inner text, false otherwise + * + * @memberOf AriaUtil + */ + CommonUtil.hasInnerContentHidden = function (element) { + return CommonUtil.hasInnerContentHiddenHyperLink(element, false); + }; + CommonUtil.svgHasName = function (element) { + return CommonUtil.attributeNonEmpty(element, "aria-label") + || CommonUtil.attributeNonEmpty(element, "aria-labelledby") + || !!element.querySelector(":scope > title"); + }; + CommonUtil.hasInnerContentHiddenHyperLink = function (element, hyperlink_flag) { + if (!element) + return false; + // Variable Decleration + var childElement = element.firstElementChild; + var hasContent = false; + // In the case that the childElement is not null then we need to check each of the elements + // to make sure that the elements are not all hidden. + if (childElement != null) { + // Get the nodewalter of the element node, so that we can loop over it and verify + // that the elements under the element are not completly hidden. + var nw = new DOMWalker_1.DOMWalker(element); + // Loop over all the nodes until there are no more nodes or we have determine that there is content under + // this parent element. + while (!hasContent && nw.nextNode() && nw.node != element) { + // Get the next node + var node = nw.node; + // In the case an img element is present with alt then we can mark this as pass + // otherwise keep checking all the other elements. Make sure that this image element is not hidden. + hasContent = (node.nodeName.toLowerCase() === "img" + && (CommonUtil.attributeNonEmpty(node, "alt") || CommonUtil.attributeNonEmpty(node, "title")) + && !VisUtil_1.VisUtil.isNodeHiddenFromAT(node) && !VisUtil_1.VisUtil.isNodePresentational(node)) || (node.nodeName.toLowerCase() === "svg" + && CommonUtil.svgHasName(node)); + // Now we check if this node is of type element, visible + if (!hasContent && node.nodeType === 1 && !VisUtil_1.VisUtil.isNodeHiddenFromAT(node) && !VisUtil_1.VisUtil.isNodePresentational(node)) { + // Check if the innerText of the element is empty or not + hasContent = !CommonUtil.isInnerTextOnlyEmpty(node); + if (!hasContent && hyperlink_flag === true) { + hasContent = CommonUtil.attributeNonEmpty(node, "aria-label") || CommonUtil.attributeNonEmpty(node, "aria-labelledby"); + var doc = node.ownerDocument; + if (doc) { + var win = doc.defaultView; + if (win) { + var cStyle = win.getComputedStyle(node); + if (!hasContent && cStyle != null) { + // console.log(cStyle.backgroundImage); + // console.log(cStyle.content) + hasContent = ((cStyle.backgroundImage && cStyle.backgroundImage.indexOf) || cStyle.content) && CommonUtil.attributeNonEmpty(node, "alt"); + } + } + } + } + } + // Check for cases where there is text node after an element under the parent + // In the case we detect nodetype as text node and the patent of the text node is + // the same element we are checking has Inner content for then get the inner content of this + // text node. + if (node.nodeType === 3 && DOMWalker_1.DOMWalker.parentElement(node) === element) { + // Check if the innerText of the element is empty or not + hasContent = !CommonUtil.isInnerTextEmpty(node); + } + } + } + // In the case there are no child elements then we can simply perform the check for only innertext + // the img with alt case will be covered in the above if, as img is considers as an element. + else { + // Check if the innerText of the element is empty or not + hasContent = !CommonUtil.isInnerTextEmpty(element); + } + return hasContent; + }; + CommonUtil.hasInnerContentOrAlt = function (element) { + var text = CommonUtil.getInnerText(element); + var hasContent = (text != null && text.trim().length > 0) || CommonUtil.attributeNonEmpty(element, "alt"); + if (element.firstChild != null) { + var nw = new DOMWalker_1.DOMWalker(element); + while (!hasContent && nw.nextNode() && nw.node != element) { + hasContent = (nw.node.nodeName.toLowerCase() === "img" && + CommonUtil.attributeNonEmpty(nw.node, "alt")); + if (!hasContent + && (AriaUtil_1.AriaUtil.hasRole(nw.node, "button", true) || AriaUtil_1.AriaUtil.hasRole(nw.node, "textbox")) + && (AriaUtil_1.AriaUtil.hasAriaLabel(nw.node) || CommonUtil.attributeNonEmpty(nw.node, "title") || CommonUtil.getLabelForElementHidden(nw.elem(), true))) { + hasContent = true; + } + } + } + return hasContent; + }; + CommonUtil.concatUniqueArrayItem = function (item, arr) { + arr.indexOf(item) === -1 && item !== null ? arr.push(item) : false; + return arr; + }; + CommonUtil.concatUniqueArrayItemList = function (itemList, arr) { + for (var i = 0; itemList !== null && i < itemList.length; i++) { + arr = CommonUtil.concatUniqueArrayItem(itemList[i], arr); + } + return arr; + }; + /** + * remove array items from a given array + * @param itemList items to be removed from arr + * @param arr the array + * @returns + */ + CommonUtil.reduceArrayItemList = function (itemList, arr) { + if (arr && arr.length > 0 && itemList && itemList.length > 0) { + var result = arr.filter(function (value) { + return !itemList.includes(value); + }); + return result; + } + return arr; + }; + CommonUtil.getScopeForTh = function (element) { + /** https://www.w3.org/TR/html5/tabular-data.html#header-and-data-cell-semantics + * A header cell anchored at the slot with coordinate (x, y) with width width and height height is + * said to be a column header if any of the following conditions are true: + * * The cell's scope attribute is in the column state, or + * * The cell's scope attribute is in the auto state, and there are no data cells in any of + * the cells covering slots with y-coordinates y .. y+height-1. + * A header cell anchored at the slot with coordinate (x, y) with width width and height height is + * said to be a row header if any of the following conditions are true: + * * The cell's scope attribute is in the row state, or + * * The cell's scope attribute is in the auto state, the cell is not a column header, and there are + * no data cells in any of the cells covering slots with x-coordinates x .. x+width-1. + */ + // Note: auto is default scope + // Easiest answer is if scope is specified + if (element.hasAttribute("scope")) { + var scope = element.getAttribute("scope").toLowerCase(); + if (scope === "row" || scope === 'rowgroup') + return "row"; + if (scope === "col" || scope === 'colgroup') + return "column"; + } + // scope is auto, default (without a scope) or invalid value. + // if all the sibling elements are th, then return "columnheader" + var siblings = __spreadArray([], element.parentElement.children, true).filter(function (node) { return node.nodeType === 1 && node.tagName.toLowerCase() != "th"; }); + if (siblings === null || siblings.length === 0) + return "column"; + else + return "row"; + }; + CommonUtil.getControlOfLabel = function (node) { + // Handle the easy case of label -> for + var labelAncestor = CommonUtil.getAncestor(node, "label"); + if (labelAncestor && labelAncestor.hasAttribute("for")) { + return fragment_1.FragmentUtil.getById(node, labelAncestor.getAttribute("for")); + } + // Create a dictionary containing ids of parent nodes + var idDict = {}; + var parentWalk = node; + while (parentWalk) { + if (parentWalk.nodeType === 1 /* Node.ELEMENT_NODE */) { + var ancestor = parentWalk; + if (ancestor.hasAttribute("id")) { + idDict[ancestor.getAttribute("id")] = true; + } + } + parentWalk = DOMWalker_1.DOMWalker.parentNode(parentWalk); + } + // Early return if no ancestor IDs found + if (Object.keys(idDict).length === 0) { + return null; + } + // Cache aria-labelledby attribute if node is an element + var nodeAriaLabelledBy = node.nodeType === 1 ? node.getAttribute("aria-labelledby") : null; + // Iterate through controls that use aria-labelledby and see if any of them reference one of my ancestor ids + var inputsUsingLabelledBy = CacheUtil_1.CacheUtil.getSetCache(node.ownerDocument, "CommonUtil::getControlOfLabel", function () { return node.ownerDocument.querySelectorAll("*[aria-labelledby]"); }); + for (var idx = 0; idx < inputsUsingLabelledBy.length; ++idx) { + var inputUsingLabelledBy = inputsUsingLabelledBy[idx]; + var ariaLabelledBy = inputUsingLabelledBy.getAttribute("aria-labelledby"); + var sp = ariaLabelledBy.split(" "); + for (var _i = 0, sp_1 = sp; _i < sp_1.length; _i++) { + var id = sp_1[_i]; + if (id in idDict && !CommonUtil.isIdReferToSelf(node, nodeAriaLabelledBy)) { + return inputUsingLabelledBy; + } + } + } + // Find the cases where we're within an aria labelledby + return null; + }; + /** + * This function is responsible for checking if the node that is provied is + * disabled or not. Following is how the check is performed: + * 1. Check if the current node is disabled with the following options: + * attribute --> disabled + * Also needs to be "button", "input", "select", "textarea", "optgroup", "option", + * "menuitem", "fieldset" nodes (in array elementsAllowedDisabled) + * attribute --> aria-disabled="true" + * 2. Check if any of the current nodes parents are disabled with the same + * options listed in 1. + * + * Note: If either current node or any of the parent nodes are disabled then this + * function will return true (node is disabled). + * + * @parm {HTMLElement} node - The node which should be checked if it is disabled or not. + * @return {bool} true if the node is disabled, false otherwise + * + * @memberOf AriaUtil + */ + CommonUtil.isNodeDisabled = function (node) { + // Set PT_NODE_DISABLED to false for all the nodes, before the check and this will be changed to + // true when we detect that the node is disabled. We have to set it to false so that we know + // the node has already been checked. Only set it to false if the setting is undefined or null + // as if it is defined we do not wnat to reset it. As if it is true then we should make use of it + // to speed up the check. + var PT_NODE_DISABLED = CacheUtil_1.CacheUtil.getCache(node, "PT_NODE_DISABLED", undefined); + if (typeof PT_NODE_DISABLED !== "undefined") + return PT_NODE_DISABLED; + PT_NODE_DISABLED = false; + // Check the nodeType of this node, if this node is a text node then + // we get the parentnode and set that as the node as a text nodes, + // disabled is directly related to the parent node. + if (node.nodeType === 3) { + node = DOMWalker_1.DOMWalker.parentNode(node); + } + // Variable Declaration + var nodeName = node.nodeName.toLowerCase(); + // Get the disabled element property, disabled and aria-disabled attribute and check that it is true + var disabledAttribute = node.hasAttribute("disabled"); + var disabledPropertyCustom = PT_NODE_DISABLED; + var ariaDisabledAttribute = node.hasAttribute('aria-disabled') && node.getAttribute("aria-disabled") === 'true'; + // If this node has disabled attribute and the node allows disabled attribute, then return true. + // Disabled attribute is only allowed on "button", "input", "select", "textarea", "optgroup", "option", "menuitem", "fieldset" + // In the case aria-disabled is set to true, then also return true + if (disabledPropertyCustom || (disabledAttribute && ARIADefinitions_1.ARIADefinitions.elementsAllowedDisabled.indexOf(nodeName) > -1) || ariaDisabledAttribute) { + PT_NODE_DISABLED = true; + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_DISABLED", PT_NODE_DISABLED); + return true; + } + // Get the parentNode for this node, becuase we have to check all parents to make sure they do not have + // disabled attribute. Only keep checking until we are all the way back to the parentNode + // element. + var parentElement = DOMWalker_1.DOMWalker.parentNode(node); + // If the parent node exists and the nodetype is element (1), then run recursive call to perform the check + // all the way up to the very parent node. Use recursive call here instead of a while loop so that we do not + // have to duplicate the logic for checking if the node is disabled or not for all the parents starting with + // child node. + if (parentElement != null && parentElement.nodeType === 1) { + // Check upwards recursively, and save the results in an variable + var nodeDisabled = CommonUtil.isNodeDisabled(parentElement); + // If the node is found to be disabled then add the custom PT_NODE_DISABLED to true. + // so that we can use this next time, to quickly determine if node is disabled or not. + // This is extra percaution, the isNodeDisabled function already sets this. + if (nodeDisabled) { + PT_NODE_DISABLED = true; + } + // Check upwards recursively + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_DISABLED", PT_NODE_DISABLED); + return nodeDisabled; + } + // Return false (node is not disabled) + return false; + }; + /** + * This function is responsible for determine if hidden content should be checked + * in rules. + * + * @parm {element} node - A node so that the document can be accessed to check for the + * option. Can be document element or a simple node element. + * @return {bool} true if hidden content should be checked, false otherwise + * + * @memberOf AriaUtil + */ + CommonUtil.shouldCheckHiddenContent = function (node) { + return false; + }; + /** + * This function is responsible for determining if node should be skipped from checking or not, based + * on the Check Hidden Content settings and if the node is visible or not. + * + * @parm {element} node - Node to check if it is visible or not based on the Check Hidden Content + * setting. + * + * @return {bool} true if node should be skipped, false otherwise + * + * @memberOf AriaUtil + */ + CommonUtil.shouldNodeBeSkippedHidden = function (node) { + // Following are the steps that are executed at this stage to determine if the node should be classified as hidden + // or not. + // 1. Only run isNodeVisible check if hidden content should NOT be checked. In the case that hidden content is to, + // be scanned then we can just scan everything as normal. In the case that the current node is hidden we + // return true to identify that the node should not be scanned/added to any hash/array. + // + // Note: The if conditions uses short-circuiting so if the first condition is not true it will not check the next one, + // so on and so forth. + if (!CommonUtil.shouldCheckHiddenContent(node) && !VisUtil_1.VisUtil.isNodeVisible(node)) { + return true; + } + return false; + }; + CommonUtil.isfocusableByDefault = function (node) { + var focusableElements = ['input', 'select', 'button', 'textarea', 'option', 'area']; + if (node.nodeName.toLowerCase() === "a" && CommonUtil.hasAttribute(node, 'href')) + return true; + if (node.nodeName.toLowerCase() === "area" && CommonUtil.hasAttribute(node, 'href')) + return true; + if (focusableElements.indexOf(node.nodeName.toLowerCase()) !== -1) + return true; + return false; + }; + /** + * This function check if a non-tabable node has valid tabable content. + * If it is tabable (the tabindex is not speicified or is not -1), returns false; + * If it is non-tabable, but a child is tabable and does not have element content, returns false; + * Otherwise, returns true. + */ + CommonUtil.nonTabableChildCheck = function (element) { + if (!element.hasAttribute("tabindex") || + (parseInt(element.getAttribute("tabindex")) != -1)) { + return false; + } + var nw = new DOMWalker_1.DOMWalker(element); + while (nw.nextNode()) { + var child = nw.elem(); + if (child === null) { // Text node. usually is a cartridge return. + continue; + } + if (child.hasAttribute("tabindex") && + (parseInt(child.getAttribute("tabindex")) != -1) && + !CommonUtil.hasInnerContent(child)) { + return false; + } + } + return true; + }; + CommonUtil.hasAttribute = function (element, attributeName) { + var hasAttribute = false; + if (element.hasAttribute) { + hasAttribute = element.hasAttribute(attributeName); + } + else if (element.attributes && element.attributes.getNamedItem) { + var attr = element.attributes.getNamedItem(attributeName); + hasAttribute = attr && attr.specified; + } + return hasAttribute; + }; + // truncate the given text to a given number of characters + // return truncated text to 150 chars, same with the media_alt_brief rule + CommonUtil.truncateText = function (text, len) { + if (len === void 0) { len = 150; } + if (!text) + return text; + text = text.trim(); + if (text.length > len) + return text.substring(0, len - 1) + "..."; + return text; + }; + CommonUtil.input_type_with_placeholder = ["text", "search", "tel", "url", "email", "password", "number"]; + CommonUtil.input_text_types = [ + "text", "file", "password", + "checkbox", "radio", + "search", "tel", "url", "email", + "date", "number", "range", + "time", "color" + ]; + CommonUtil.input_time_types = [ + "date", "month", "week", "time", "datetime-local" + ]; + CommonUtil.input_other_types = [ + "range", "color", "checkbox", "radio", "file", "image" + ]; + CommonUtil.form_button_types = [ + "button", "reset", "submit" + ]; + CommonUtil.form_labelable_elements = ["input", "textarea", "select", "keygen", "progress", "meter", "output", "button"]; + CommonUtil.tabTagMap = { + "button": function (element) { + return !element.hasAttribute("disabled"); + }, + "iframe": true, + "input": function (element) { + if (element.hasAttribute("disabled") || element.getAttribute("type") === "hidden") + return false; + if (element.getAttribute("type") === "radio") { + var name_2 = element.getAttribute("name"); + if (!name_2 || name_2.trim().length === 0) + return true; //single radio, no group + var doc = element.ownerDocument; + var group = doc.querySelectorAll("input[type='radio'][name='" + name_2.trim() + "']"); + if (group.length === 0 || group.length === 1) + return true; //single radio with the name, no others in group + var checked = null; + for (var i = 0; i < group.length; i++) { + if (group[i].checked) + checked = group[i]; + } + //only last one applies if multiple radios with 'checked' attributes + if (checked !== null) { + if (DOMUtil_1.DOMUtil.sameNode(checked, element)) + return true; + return false; + } + else { + // if nothing checked yet, return true if it's the first element + if (DOMUtil_1.DOMUtil.sameNode(group[0], element)) + return true; + return false; + } + } + else + return true; + }, + "select": function (element) { + return !element.hasAttribute("disabled"); + }, + "textarea": function (element) { + if (element.hasAttribute("disabled") || element.getAttribute("type") === "hidden") + return false; + return true; + }, + /**"div": function (element) { + return element.hasAttribute("contenteditable"); + },*/ + "a": function (element) { + // xlink:href?? see svg + return element.hasAttribute("href"); + }, + "area": function (element) { + return element.hasAttribute("href"); + }, + "audio": function (element) { + return element.hasAttribute("controls"); + }, + "video": function (element) { + return element.hasAttribute("controls"); + }, + "summary": function (element) { + // first summary child of a details element is automatically focusable + return element.parentElement && element.parentElement.nodeName.toLowerCase() === 'details' + && DOMUtil_1.DOMUtil.sameNode(__spreadArray([], element.parentElement.children, true).filter(function (elem) { return elem.nodeName.toLowerCase() === 'summary'; })[0], element); + }, + "details": function (element) { + //details element without a direct summary child is automatically focusable + return element.children && __spreadArray([], element.children, true).filter(function (elem) { return elem.nodeName.toLowerCase() === 'summary'; }).length === 0; + } + }; + CommonUtil.image_extensions = [".bmp", ".gif", ".jpg", ".jpeg", ".pcx", ".png"]; + return CommonUtil; +}()); +exports.CommonUtil = CommonUtil; + + +/***/ }, + +/***/ "./src/v4/util/TableUtil.ts" +/*!**********************************!*\ + !*** ./src/v4/util/TableUtil.ts ***! + \**********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.TableUtil = void 0; +var VisUtil_1 = __webpack_require__(/*! ./VisUtil */ "./src/v4/util/VisUtil.ts"); +var AriaUtil_1 = __webpack_require__(/*! ./AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CommonUtil_1 = __webpack_require__(/*! ./CommonUtil */ "./src/v4/util/CommonUtil.ts"); +var TableUtil = /** @class */ (function () { + function TableUtil() { + } + TableUtil.isDataTable = function (tableNode) { + return !(AriaUtil_1.AriaUtil.hasRole(tableNode, "none") || AriaUtil_1.AriaUtil.hasRole(tableNode, "presentation")); + }; + /* + * A complex data table is a data table with any of the following characteristics: + * + * a thead element that contains two or more tr elements + * a table with more than one thead element + * a table with two or more tr elements that contain only th elements + * a th or td element with a rowspan or colspan attribute + * a tr element that contains at least one td element and two or more th elements + * a table with headers not located in the first row or first column + * a td element with a headers attribute value that contains more than two IDREFs + */ + TableUtil.isComplexDataTable = function (table) { + if ("AriaUtil_isComplexDataTable" in table) { + return !!table.AriaUtil_isComplexDataTable; + } + var isComplexTable = false; + if (table && TableUtil.isDataTable(table)) { + var thNodes = null, tdNodes = null; + var trNodes = table.getElementsByTagName("tr"); + var trNodeCount = trNodes.length; + var tdNodeCount = 0, thNodeCount = 0, trNodesHavingOnlyThNodes = 0; + for (var i = 0; !isComplexTable && i < trNodeCount; ++i) { + thNodes = trNodes[i].getElementsByTagName("th"); + tdNodes = trNodes[i].getElementsByTagName("td"); + thNodeCount = thNodes.length; + tdNodeCount = tdNodes.length; + if (tdNodeCount !== 0) { + // a tr element that contains at least one td element and two or more th elements; + isComplexTable = thNodeCount > 1; + // a th element with a rowspan or colspan attribute + for (var j = 0; !isComplexTable && j < thNodeCount; ++j) { + isComplexTable = ((thNodes[j].hasAttribute("rowspan") || + thNodes[j].hasAttribute("colspan")) && + CommonUtil_1.CommonUtil.getAncestor(thNodes[j], "table") === table); + } + // a td element with a rowspan or colspan attribute + // a td element with a headers attribute value that contains more than two IDREFs + for (var k = 0; !isComplexTable && k < tdNodeCount; ++k) { + isComplexTable = ((tdNodes[k].hasAttribute("rowspan") || + tdNodes[k].hasAttribute("colspan") || + (tdNodes[k].hasAttribute("headers") && CommonUtil_1.CommonUtil.normalizeSpacing(tdNodes[k].getAttribute("headers")).split(" ").length > 2)) && + CommonUtil_1.CommonUtil.getAncestor(tdNodes[k], "table") === table); + } + } + else { + // two or more tr elements that contain only th elements + if (thNodeCount > 0) { + ++trNodesHavingOnlyThNodes; + } + isComplexTable = trNodesHavingOnlyThNodes === 2; + } + } + if (!isComplexTable) { + var theadNodes = table.getElementsByTagName("thead"); + var theadNodesLength = theadNodes.length; + if (theadNodesLength > 0) { + // table has more than one thead element + isComplexTable = theadNodesLength > 1; + // a thead element that contains two or more tr elements + if (!isComplexTable) { + isComplexTable = theadNodes[0].getElementsByTagName("tr").length > 1; + } + } + } + if (!isComplexTable && trNodeCount !== 0) { + // a table with headers not located in the first row or first column + isComplexTable = thNodeCount > 0 && !TableUtil.tableHeaderExists(table); + } + } + table.AriaUtil_isComplexDataTable = isComplexTable; + return isComplexTable; + }; + // Return true if a table cell is hidden or contain no data: <td></td> + TableUtil.isTableCellEmpty = function (cell) { + if (!cell || !VisUtil_1.VisUtil.isNodeVisible(cell) || cell.innerHTML.replace(/&nbsp;/g, ' ').trim().length === 0) + return true; + return false; + }; + // Return true if a table row is hidden or contain no data: <tr /> or <tr><td></td><td></td></tr> + TableUtil.isTableRowEmpty = function (row) { + if (!row || !row.cells || row.cells.length === 0 || !VisUtil_1.VisUtil.isNodeVisible(row)) + return true; + var passed = true; //empty + for (var c = 0; passed && c < row.cells.length; c++) { + var cell = row.cells[c]; + passed = TableUtil.isTableCellEmpty(cell); + } + return passed; + }; + // Return true if a table's header is in the first row or column + TableUtil.tableHeaderExists = function (ruleContext) { + var rows = ruleContext.rows; + if (!rows || rows.length === 0) + return null; + // note that table.rows return all all the rows in the table, + // including the rows contained within <thead>, <tfoot>, and <tbody> elements. + //case 1: headers are in the very first row with data in tbody or thead, but not in tfoot + //get the first row with data, ignoring the rows with no data + var passed = true; + var firstRow = rows[0]; + for (var r = 0; passed && r < rows.length; r++) { + firstRow = rows[r]; + // ignore the rows from tfoot + if (firstRow.parentNode && firstRow.parentNode.nodeName.toLowerCase() === 'tfoot') + continue; + passed = TableUtil.isTableRowEmpty(firstRow); + } + //table contain no data: <table><tr><td></td><td></td></tr></table> + if (passed) + return null; + // Check if the cells with data in the first data row are all TH's + passed = true; + for (var r = 0; passed && r < firstRow.cells.length; r++) { + var cell = firstRow.cells[r]; + passed = TableUtil.isTableCellEmpty(cell) || cell.nodeName.toLowerCase() === 'th'; + } + if (passed) + return true; + // Case 2: headers are in the first column with data + // Assume that the first column has all TH's or a TD without data in the first column. + passed = true; + for (var i = 0; passed && i < rows.length; ++i) { + // ignore the rows from tfoot + if (rows[i].parentNode && rows[i].parentNode.nodeName.toLowerCase() === 'tfoot') + continue; + // If no cells in this row, or no data at all, that's okay too. + passed = !rows[i].cells || + rows[i].cells.length === 0 || + rows[i].cells[0].innerHTML.trim().length === 0 || + rows[i].cells[0].nodeName.toLowerCase() != "td"; + } + if (passed) + return true; + //case 3: all td data cells have headers attributes that point to the id of a th element in the same table. + // https://html.spec.whatwg.org/multipage/tables.html#attributes-common-to-td-and-th-elements + passed = true; + var thIds = []; + var tdHeaders = []; + for (var r = 0; passed && r < rows.length; r++) { + var row = rows[r]; + // Check if the cells with data in the last data row are all TH's + for (var c = 0; c < row.cells.length; c++) { + var cell = row.cells[c]; + if (TableUtil.isTableCellEmpty(cell)) + continue; + if (cell.nodeName.toLowerCase() === 'td') { + if (!cell.getAttribute('headers') || cell.getAttribute('headers').trim().length === 0) + passed = false; + else + CommonUtil_1.CommonUtil.concatUniqueArrayItemList(cell.getAttribute('headers').trim().split(" "), tdHeaders); + } + else if (cell.nodeName.toLowerCase() === 'th' && cell.getAttribute('id') && cell.getAttribute('id').trim().length > 0) + CommonUtil_1.CommonUtil.concatUniqueArrayItem(cell.getAttribute('id').trim(), thIds); + } + } + if (passed) { // all td elements have headers, to exam if the headers point to a th id + if (thIds.length > 0 && tdHeaders.every(function (header) { return thIds.includes(header); })) + return true; + } + return false; + }; + TableUtil.isLayoutTable = function (tableNode) { + return AriaUtil_1.AriaUtil.hasRole(tableNode, "presentation") || AriaUtil_1.AriaUtil.hasRole(tableNode, "none"); + }; + /* + * get conflict Aria and Html attributes + * return: a list of Aria and Html attribute pairs that are conflict + */ + TableUtil.isTableDescendant = function (contextHierarchies) { + if (!contextHierarchies) + return null; + return contextHierarchies["aria"].filter(function (hier) { return ["table", "grid", "treegrid"].includes(hier.role); }); + }; + return TableUtil; +}()); +exports.TableUtil = TableUtil; + + +/***/ }, + +/***/ "./src/v4/util/VisUtil.ts" +/*!********************************!*\ + !*** ./src/v4/util/VisUtil.ts ***! + \********************************/ +(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.VisUtil = void 0; +var CacheUtil_1 = __webpack_require__(/*! ./CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../v2/dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var DOMMapper_1 = __webpack_require__(/*! ../../v2/dom/DOMMapper */ "./src/v2/dom/DOMMapper.ts"); +var AriaUtil_1 = __webpack_require__(/*! ./AriaUtil */ "./src/v4/util/AriaUtil.ts"); +var CSSUtil_1 = __webpack_require__(/*! ./CSSUtil */ "./src/v4/util/CSSUtil.ts"); +var ClipPathUtil_1 = __webpack_require__(/*! ./ClipPathUtil */ "./src/v4/util/ClipPathUtil.ts"); +var VisUtil = /** @class */ (function () { + function VisUtil() { + } + /** + * This function is responsible for checking if the node that is provied is + * visible or not. Following is how the check is performed: + * 1. Check if the current node is hidden with the following options: + * CSS --> dislay: none + * CSS --> visibility: hidden + * attribute --> hidden + * 2. Check if the any of the current nodes parents are hidden with the same + * options listed in 1. + * + * Note: If either current node or any of the parent nodes are hidden then this + * function will return false (node is not visible). + * + * Note: nodes with CSS properties opacity:0 or filter:opacity(0%), or similar SVG mechanisms: + * They are not considered hidden. Text hidden with these methods can still be selected or copied, + * and user agents still expose it in their accessibility trees. + * + * Note: nodes hidden off screen or behind another object: they are not considered hidden. + * They are exposed in the accessibility tree and they can even name on-screen objects. + * + * @parm {element} node The node which should be checked if it is visible or not. + * @return {bool} false if the node is NOT visible, true otherwise + * + * @memberOf VisUtil + */ + VisUtil.isNodeVisible = function (nodeIn) { + // Check the nodeType if this node, if this node is a text node then + // we get the parentnode and set that as the node as a text nodes, + // visibility is directly related to the parent node. + if (nodeIn.nodeType === 3) { + nodeIn = DOMWalker_1.DOMWalker.parentNode(nodeIn); + } + var node = nodeIn; + // We should only allow nodeType element, and TextNode all other nodesTypes + // we can return the visibility as visible. + // Following nodes will be returned as visable by default, since we can not + // actually change their visibility. + // Node.PROCESSING_INSTRUCTION_NODE --> 7 + // Node.COMMENT_NODE --> 8 + // 9 /* Node.DOCUMENT_NODE */ --> 9 + // Node.DOCUMENT_TYPE_NODE --> 10 + // Node.DOCUMENT_FRAGMENT_NODE --> 11 + if (node.nodeType !== 1) { + return true; + } + // Make sure that the ownerDocument is present before moving forward + // in detecting if the node is visible or not. In the case that ownerDocument + // does not exist then we simply return node is visible by default. + if (!node.ownerDocument) { + return true; + } + // Variable Declaration + var compStyle; + var nodeName = node.nodeName.toLowerCase(); + // In the case this node is a script, link or style node, right away return node is visible + // because scripts, links and style nodes can not be hidden by HTML attribute or CSS or are hidden by default. But we want to scan + // the elements everytime as they render content still which is still visible to users. + // script --> script elements have display: none by default + // link --> link elements have display: none by default, but the actually CSS script is still executed so we have to + // mark this element as visible at all times. + // style --> style elements have display: none by default, but the actually CSS script is still executed so we have to + // mark this element as visible at all times. + // datalist --> In the rendering, the datalist element represents nothing and it, along with its children, should be hidden. + if (VisUtil.hiddenByDefaultElements != null && VisUtil.hiddenByDefaultElements != undefined && VisUtil.hiddenByDefaultElements.indexOf(nodeName) > -1) { + //return true; + return false; + } + var cacheVal = CacheUtil_1.CacheUtil.getCache(node, "PT_NODE_HIDDEN", undefined); + if (cacheVal !== undefined) { + return cacheVal; + } + // Set PT_NODE_HIDDEN to false for all the nodes, before the check and this will be changed to + // true when we detect that the node is hidden. We have to set it to false so that we know + // the rules has already been checked. + cacheVal = CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", false); + // Check if this node is visible, we check couple of CSS properties and hidden attribute. + // area, param and audio elements we do not check if they are hidden as it does not apply to them. + // Check the unhideableElements array which is part of the rules, to check if this element is allowed to be hidden or not + // in the case that the element is part of the unhideableElements array then we do not run the hidden check on this element, + // and go stright to the parent node. + // Array check elements like: + // area --> area element is part of a map element and it can not be hidden because it is used to + // make an certian parts of an map interactive. + // param --> element can only be part of object elment and it cannot be hidden directly, it + // can only be hidden if the parent is hidden. + // audio --> If this element is hidden it will still play the music, so we should still trigger + // violations for this element. + // In the case that unhideableElements array is not defined then we just scan all elements and do no filtering at all. + if (VisUtil.unhideableElements === null || VisUtil.unhideableElements === undefined || VisUtil.unhideableElements.indexOf(nodeName) === -1) { + // Check if defaultView exists for this node, if it does then use this to run the getComputedStyle + // function to get the CSS style for the node. + if (node.ownerDocument.defaultView) { + // Run the getComputedStyle on this node to fetch the CSS compuation of the node + compStyle = node.ownerDocument.defaultView.getComputedStyle(node, null); + } + // In the case that defaultView does not exists return true to identify that this + // node is visible, because were not able to detect if it was not. + else { + return CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", true); + } + // Get the hidden element property and hidden attribute + var hiddenAttribute = node.getAttribute("hidden"); + var hiddenPropertyCustom = cacheVal; + // To get the hidden property we need to perform a special check as in some cases the hidden property will not be + // a boolean, for theses cases we set it to false as we are not able to determine the true hidden condition. + // The reason for this is because form elements are able to perform an override, so when we have id="hidden" for an element + // which is under the form element then, node.hidden gives the element/list of elements which have id="hidden". Refer to + // mozilla bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1267356 + var hiddenProperty = typeof node.hidden === "boolean" ? node.hidden : false; + // If compStyle object is empty, node does't have hidden property, node does't have hidden attribute and does't have custom PT + // hidden property then we can just return true (node visible) at this point. + if (!compStyle && + !hiddenProperty && // this covers false, null, or undefined + (hiddenAttribute === null || hiddenAttribute === undefined) && + !hiddenPropertyCustom // This covers false, null or undefined + ) { + return CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", true); + } + // In the case that the compStyle is defined we check the following: + // CSS style display set to none + // CSS style visibility set to hidden + // Note: For this property since it is inherited, need to skip the check on parents as + // the parent can have hidden but the child can be visible. So we only check this property + // on child elements/elements that are passed to this function the first time. + // node hidden property set (node.hidden) + // node attribute hidden set (to any value) + // node custom hidden property ser (node.PT_NODE_HIDDEN) + // If any of the above conditions are true then we return false as this element is not visible + if ((compStyle !== null && ((compStyle.getPropertyValue('display') === 'none' || + (!CacheUtil_1.CacheUtil.getCache(node, "Visibility_Check_Parent", null) && compStyle.getPropertyValue('visibility') === 'hidden'))) || + (compStyle.getPropertyValue('display') !== 'block' && (hiddenProperty || hiddenAttribute != null || hiddenPropertyCustom)))) { + // Set a custom expandos property on the the node to identify that it is hidden, so that we can uses + // use this in the rules to determine if the node is hidden or not, if we need to. + // Use expandos property instead of a hash map which stores the elements, adding/checking expandos + // properties is a lot faster performance whise. For Hash map we need to store based on xpath, and to calculate + // xpath it is more performance impact. + return CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", false); + } + // check content-visibility: if the content-visibility is hidden, then, return false as the element is not visible + if (VisUtil.isContentHidden(node)) { + return CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", false); + } + // check hidden by clip-path + // TODO: need to check if hidden content contains focusable elements, similarly to offscreen content + if (ClipPathUtil_1.ClipPathUtil.isNodeVisuallyHiddenByClipPath(node)) { + return CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", false); + } + } + // Get the parentNode for this node, becuase we have to check all parents to make sure they do not have + // the hidden CSS, property or attribute. Only keep checking until we are all the way back to the parentNode + // element. + var parentElement = DOMWalker_1.DOMWalker.parentNode(node); + // If the parent node exists and the nodetype is element (1), then run recursive call to perform the check + // all the way up to the very parent node. Use recursive call here instead of a while loop so that we do not + // have to duplicate the logic for checking if the node is visible or not for all the parents starting with + // child node. + if (parentElement != null && parentElement.nodeType === 1) { + // When we have a parent element going through the isNodeVisible function we have to mark it as such + // so that in the function we can skip checking visibility: hidden for parent elements since visibility: hidden + // is inherited, which allows a child to have a different setting then the child. This property only needs to be checked + // once for the first element that is passed down and that is all. Ignore it for all the parents that we iterate over. + CacheUtil_1.CacheUtil.setCache(parentElement, "Visibility_Check_Parent", true); + // Check upwards recursively, and save the results in an variable + var nodeVisible = VisUtil.isNodeVisible(parentElement); + // If the node is found to not be visible then add the custom PT_NODE_HIDDEN to true. + // so that we can use this in the rules. + // if (!nodeVisible) { + // CacheUtil.setCache(node, "PT_NODE_HIDDEN", true); + // } + // Check upwards recursively + return CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", nodeVisible); + } + // Return true (node is visible) + return CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HIDDEN", true); + }; + /** + * This function is responsible for checking if the node that is visually hidden by clipping or opaq: + * 1. Check if the current node is visually hidden: + * CSS --> clip: rect(0px, 0px, 0px, 0px) + * CSS --> opacity: 0 + * + * Note: If either current node or any of the parent nodes are visually hidden then this + * function will return true (node is not visually hidden). + * + * Note: nodes with CSS properties clip: rect(0px, 0px, 0px, 0px) or opacity:0 or filter:opacity(0%), or similar SVG mechanisms: + * They are not considered hidden to an AT. Text hidden with these methods can still be selected or copied, + * and user agents still expose it in their accessibility trees. + * + * @parm {element} node The node which should be checked if it is visually hidden or not. + * @return {bool} true if the node is visually hidden, false otherwise + * + * @memberOf VisUtil + */ + VisUtil.isNodeVisuallyHidden = function (node) { + if (!node || node.nodeType !== 1) + return false; + var elem = node; + // Set PT_NODE_HIDDEN to false for all the nodes, before the check and this will be changed to + // true when we detect that the node is hidden. We have to set it to false so that we know + // the rules has already been checked. + var hidden = CacheUtil_1.CacheUtil.getCache(elem, "PT_NODE_VISUALLY_HIDDEN", undefined); + if (hidden === undefined) { + // defined styles only give the styles that changed + var comp_styles = CSSUtil_1.CSSUtil.getComputedStyle(elem); + if ((comp_styles['position'] === 'absolute' && comp_styles['clip'] && comp_styles['clip'].replaceAll(' ', '') === 'rect(0px,0px,0px,0px)') + || (comp_styles['opacity'] && parseFloat(comp_styles['opacity']) < 0.1)) { + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN", true); + return true; + } + // Get the parentNode for this node, becuase we have to check all parents to make sure they do not have + // the hidden CSS, property or attribute. Only keep checking until we are all the way back to the parentNode + // element. + var parentElement = DOMWalker_1.DOMWalker.parentElement(elem); + if (!parentElement) + return false; + // Check upwards recursively + var hid = VisUtil.isNodeVisuallyHidden(parentElement); + CacheUtil_1.CacheUtil.setCache(elem, "PT_NODE_VISUALLY_HIDDEN", hid); + return hid; + } + return hidden; + }; + /** + * return true if the node or its ancestor is hidden by CSS content-visibility:hidden + * At this time, CSS content-visibility is partially supported by Chrome & Edge, but not supported by Firefox + * The implementation TEMPORARILY follows the Chrome test results: + * if content-visibility:hidden + * if the element is block-level (default or specified by the user), then the element and its children are normally hidden; + * if the element is inline (default or specified by the user), then the element and its children are normally NOT hidden; + * + * @param node + */ + VisUtil.isContentHidden = function (node) { + if (!node) + return false; + var vis = CacheUtil_1.CacheUtil.getCache(node, "PT_NODE_ContentHidden", undefined); + if (vis !== undefined) + return vis; + var style = getComputedStyle(node); + if (!style) { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_ContentHidden", false); + return false; + } + var content_visibility = style.getPropertyValue("content-visibility"); + if (content_visibility !== 'hidden') { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_ContentHidden", false); + return false; + } + var display = style.getPropertyValue("display"); + // inline element only + if (display === 'inline') { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_ContentHidden", false); + return false; + } + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_ContentHidden", true); + return true; + }; + /** + * return true if the node is offscreen by CSS position + * @param node + */ + VisUtil.isElementOffscreen = function (node) { + if (!node) + return true; + if (node.nodeType !== 1) + return false; + var vis = CacheUtil_1.CacheUtil.getCache(node, "PT_NODE_Offscreen", undefined); + if (vis !== undefined) + return vis; + var mapper = new DOMMapper_1.DOMMapper(); + var bounds = mapper.getUnadjustedBounds(node); + if (!bounds) { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_Offscreen", true); + return true; + } + if (bounds['height'] === 0 || bounds['width'] === 0 || (bounds['top'] + bounds['height']) <= 0 || (bounds['left'] + bounds['width']) <= 0) { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_Offscreen", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_Offscreen", false); + return false; + }; + /** + * return true if the node or its ancestor is natively hidden or aria-hidden = 'true' + * @param node + */ + VisUtil.isNodeHiddenFromAT = function (node) { + if (!node) + return false; + var vis = CacheUtil_1.CacheUtil.getCache(node, "PT_NODE_HiddenFromAT", undefined); + if (vis !== undefined) + return vis; + if (!VisUtil.isNodeVisible(node) || node.getAttribute("aria-hidden") === 'true') { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HiddenFromAT", true); + return true; + } + var ancestor = DOMUtil_1.DOMUtil.getAncestorWithAttribute(node, "aria-hidden", "true"); + if (ancestor) { + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HiddenFromAT", true); + return true; + } + CacheUtil_1.CacheUtil.setCache(node, "PT_NODE_HiddenFromAT", false); + return false; + }; + /** + * return true if the node or its ancestor is natively hidden or aria-hidden = 'true' + * @param node + */ + VisUtil.isNodePresentational = function (node) { + var role = AriaUtil_1.AriaUtil.getResolvedRole(node); + if (role && (role === 'none' || role === 'presentation')) + return true; + return false; + }; + /** + * return true if the element is scrollable + * @param node + */ + VisUtil.isElementScrollable = function (elem) { + if (!elem) + return false; + var styles = CSSUtil_1.CSSUtil.getComputedStyle(elem); + if (!styles) + return false; + var x_scroll = styles.getPropertyValue('overflow-x'); + var y_scroll = styles.getPropertyValue('overflow-y'); + //console.log("before node="+ elem.nodeName +", id="+elem.getAttribute("id") +", x_scroll="+x_scroll + ", y_scroll="+y_scroll); + // If overflow-y is hidden, scroll, or auto, and the overflow-x property is visible (default), the value will be implicitly computed as auto. + if (x_scroll === 'visible' && (y_scroll === 'hidden' || y_scroll === 'scroll' || y_scroll === 'auto')) + x_scroll = 'auto'; + // If overflow-x is hidden, scroll, or auto and the overflow-y property is visible (default), the value will be implicitly computed as auto. + if (y_scroll === 'visible' && (x_scroll === 'hidden' || x_scroll === 'scroll' || x_scroll === 'auto')) + y_scroll = 'auto'; + // setting overflow to clip in one direction when it isn't set to visible or clip in the other direction results in the clip value behaving as hidden. + if (x_scroll === 'clip' && y_scroll !== 'visible' && y_scroll !== 'clip') + x_scroll = 'hidden'; + if (y_scroll === 'clip' && x_scroll !== 'visible' && x_scroll !== 'clip') + y_scroll = 'hidden'; + // not scrollable: no scroll bars + if ((x_scroll === 'visible' || x_scroll === 'hidden' || x_scroll === 'clip') + && (y_scroll === 'visible' || y_scroll === 'hidden' || y_scroll === 'clip')) + return false; + // false if the overall scrollable element (clientWidth + scrollbarWidth and clientHeight + scrollbarHeight) is too small to be visible on screen + if (Math.max(elem.offsetWidth, elem.offsetHeight) < 30 || Math.min(elem.offsetWidth, elem.offsetHeight) < 15) + return false; + // false if content is smaller than the scrollable container: both x and y scroll distances < element's horizontal/vertical padding + var padding_x = CSSUtil_1.CSSUtil.getPixelsFromStyle(styles.paddingLeft, elem) + CSSUtil_1.CSSUtil.getPixelsFromStyle(styles.paddingRight, elem); + var padding_y = CSSUtil_1.CSSUtil.getPixelsFromStyle(styles.paddingTop, elem) + CSSUtil_1.CSSUtil.getPixelsFromStyle(styles.paddingBottom, elem); + if (elem.scrollWidth - elem.clientWidth < 1 + padding_x + && elem.scrollHeight - elem.clientHeight < 1 + padding_y) + return false; + return true; + }; + // This list contains a list of element tags which can not be hidden, when hidden is + // added to theses elements it does not do anything at all. + // area --> area element is part of a map element and it can not be hidden because it is used to + // make an certian parts of an map interactive. + // param --> element can only be part of object elment and it cannot be hidden directly, it + // can only be hidden if the parent is hidden. + // audio --> If this element is hidden it will still play the music, so we should still trigger + // violations for this element. + // Note: All element tags that are added here should be added as lowercase, as we are using indexOf to do the check. + VisUtil.unhideableElements = ['area', 'param', 'audio']; + // This list contains a list of elements tags which have display: none by default, since we have rules triggering + // on theses elements we need to make then visible by default so that the rules can trigger regardless of the + // Check Hidden Content option in the tools. + // script --> script elements have display: none by default + // link --> link elements have display: none by default, but the actually CSS script is still executed so we have to + // mark this element as visible at all times. + // style --> style elements have display: none by default, but the actually CSS script is still executed so we have to + // mark this element as visible at all times. + // head --> head elements have display: none by default, but it will still behave correct + // title --> title elements have display: none by default, but it will still display the title. remove title from the list because a title can be a child of a svg element too + // meta --> meta elements have display: none by default, but it will still perform the action that meta is suppose to + // base --> base elements have display: none by default, but it will still perform the action that meta is suppose to + // noscript --> noscript elements have display: none by default, but it will still perform the action that meta is suppose to + // template --> template elements have display: none by default, because they are just a mechanism for holding client-side content + // that is not to be rendered when a page is loaded. https://developer.mozilla.org/en/docs/Web/HTML/Element/template + // datalist --> datalist elements have display: none by default, + VisUtil.hiddenByDefaultElements = ['script', 'link', 'style', 'head', 'meta', 'base', 'noscript', 'template', 'datalist']; + return VisUtil; +}()); +exports.VisUtil = VisUtil; + + +/***/ }, + +/***/ "./src/v4/sc-urls.json" +/*!*****************************!*\ + !*** ./src/v4/sc-urls.json ***! + \*****************************/ +(module) { + +module.exports = /*#__PURE__*/JSON.parse('{"1.1.1":{"num":"1.1.1","url":"https://www.w3.org/TR/WCAG22/#non-text-content","scId":"WCAG2:non-text-content","scAltId":["text-equiv-all"],"test":"WCAG2:text-equiv-all","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#non-text-content","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/non-text-content.html","handle":"Non-text Content","level":"A","wcagType":"2.0"},"1.2.1":{"num":"1.2.1","url":"https://www.w3.org/TR/WCAG22/#audio-only-and-video-only-prerecorded","scId":"WCAG2:audio-only-and-video-only-prerecorded","scAltId":["media-equiv-av-only-alt"],"test":"WCAG2:media-equiv-av-only-alt","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-only-and-video-only-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-only-and-video-only-prerecorded.html","handle":"Audio-only and Video-only (Prerecorded)","level":"A","wcagType":"2.0"},"1.2.2":{"num":"1.2.2","url":"https://www.w3.org/TR/WCAG22/#captions-prerecorded","scId":"WCAG2:captions-prerecorded","scAltId":["media-equiv-captions"],"test":"WCAG2:media-equiv-captions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#captions-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/captions-prerecorded.html","handle":"Captions (Prerecorded)","level":"A","wcagType":"2.0"},"1.2.3":{"num":"1.2.3","url":"https://www.w3.org/TR/WCAG22/#audio-description-or-media-alternative-prerecorded","scId":"WCAG2:audio-description-or-media-alternative-prerecorded","scAltId":["media-equiv-audio-desc"],"test":"WCAG2:media-equiv-audio-desc","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-description-or-media-alternative-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-description-or-media-alternative-prerecorded.html","handle":"Audio Description or Media Alternative (Prerecorded)","level":"A","wcagType":"2.0"},"1.2.4":{"num":"1.2.4","url":"https://www.w3.org/TR/WCAG22/#captions-live","scId":"WCAG2:captions-live","scAltId":["media-equiv-real-time-captions"],"test":"WCAG2:media-equiv-real-time-captions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#captions-live","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/captions-live.html","handle":"Captions (Live)","level":"AA","wcagType":"2.0"},"1.2.5":{"num":"1.2.5","url":"https://www.w3.org/TR/WCAG22/#audio-description-prerecorded","scId":"WCAG2:audio-description-prerecorded","scAltId":["media-equiv-audio-desc-only"],"test":"WCAG2:media-equiv-audio-desc-only","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-description-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-description-prerecorded.html","handle":"Audio Description (Prerecorded)","level":"AA","wcagType":"2.0"},"1.2.6":{"num":"1.2.6","url":"https://www.w3.org/TR/WCAG22/#sign-language-prerecorded","scId":"WCAG2:sign-language-prerecorded","scAltId":["media-equiv-sign"],"test":"WCAG2:media-equiv-sign","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#sign-language-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/sign-language-prerecorded.html","handle":"Sign Language (Prerecorded)","level":"AAA","wcagType":"2.0"},"1.2.7":{"num":"1.2.7","url":"https://www.w3.org/TR/WCAG22/#extended-audio-description-prerecorded","scId":"WCAG2:extended-audio-description-prerecorded","scAltId":["media-equiv-extended-ad"],"test":"WCAG2:media-equiv-extended-ad","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#extended-audio-description-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/extended-audio-description-prerecorded.html","handle":"Extended Audio Description (Prerecorded)","level":"AAA","wcagType":"2.0"},"1.2.8":{"num":"1.2.8","url":"https://www.w3.org/TR/WCAG22/#media-alternative-prerecorded","scId":"WCAG2:media-alternative-prerecorded","scAltId":["media-equiv-text-doc"],"test":"WCAG2:media-equiv-text-doc","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#media-alternative-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/media-alternative-prerecorded.html","handle":"Media Alternative (Prerecorded)","level":"AAA","wcagType":"2.0"},"1.2.9":{"num":"1.2.9","url":"https://www.w3.org/TR/WCAG22/#audio-only-live","scId":"WCAG2:audio-only-live","scAltId":["media-equiv-live-audio-only"],"test":"WCAG2:media-equiv-live-audio-only","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-only-live","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-only-live.html","handle":"Audio-only (Live)","level":"AAA","wcagType":"2.0"},"1.3.1":{"num":"1.3.1","url":"https://www.w3.org/TR/WCAG22/#info-and-relationships","scId":"WCAG2:info-and-relationships","scAltId":["content-structure-separation-programmatic"],"test":"WCAG2:content-structure-separation-programmatic","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#info-and-relationships","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/info-and-relationships.html","handle":"Info and Relationships","level":"A","wcagType":"2.0"},"1.3.2":{"num":"1.3.2","url":"https://www.w3.org/TR/WCAG22/#meaningful-sequence","scId":"WCAG2:meaningful-sequence","scAltId":["content-structure-separation-sequence"],"test":"WCAG2:content-structure-separation-sequence","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#meaningful-sequence","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/meaningful-sequence.html","handle":"Meaningful Sequence","level":"A","wcagType":"2.0"},"1.3.3":{"num":"1.3.3","url":"https://www.w3.org/TR/WCAG22/#sensory-characteristics","scId":"WCAG2:sensory-characteristics","scAltId":["content-structure-separation-understanding"],"test":"WCAG2:content-structure-separation-understanding","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#sensory-characteristics","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/sensory-characteristics.html","handle":"Sensory Characteristics","level":"A","wcagType":"2.0"},"1.3.4":{"num":"1.3.4","url":"https://www.w3.org/TR/WCAG22/#orientation","scId":"WCAG2:orientation","scAltId":[],"test":"WCAG2:orientation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#orientation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/orientation.html","handle":"Orientation","level":"AA","wcagType":"2.1"},"1.3.5":{"num":"1.3.5","url":"https://www.w3.org/TR/WCAG22/#identify-input-purpose","scId":"WCAG2:identify-input-purpose","scAltId":[],"test":"WCAG2:identify-input-purpose","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#identify-input-purpose","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/identify-input-purpose.html","handle":"Identify Input Purpose","level":"AA","wcagType":"2.1"},"1.3.6":{"num":"1.3.6","url":"https://www.w3.org/TR/WCAG22/#identify-purpose","scId":"WCAG2:identify-purpose","scAltId":[],"test":"WCAG2:identify-purpose","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#identify-purpose","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/identify-purpose.html","handle":"Identify Purpose","level":"AAA","wcagType":"2.1"},"1.4.1":{"num":"1.4.1","url":"https://www.w3.org/TR/WCAG22/#use-of-color","scId":"WCAG2:use-of-color","scAltId":["visual-audio-contrast-without-color"],"test":"WCAG2:visual-audio-contrast-without-color","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#use-of-color","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/use-of-color.html","handle":"Use of Color","level":"A","wcagType":"2.0"},"1.4.2":{"num":"1.4.2","url":"https://www.w3.org/TR/WCAG22/#audio-control","scId":"WCAG2:audio-control","scAltId":["visual-audio-contrast-dis-audio"],"test":"WCAG2:visual-audio-contrast-dis-audio","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-control","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-control.html","handle":"Audio Control","level":"A","wcagType":"2.0"},"1.4.3":{"num":"1.4.3","url":"https://www.w3.org/TR/WCAG22/#contrast-minimum","scId":"WCAG2:contrast-minimum","scAltId":["visual-audio-contrast-contrast"],"test":"WCAG2:visual-audio-contrast-contrast","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#contrast-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/contrast-minimum.html","handle":"Contrast (Minimum)","level":"AA","wcagType":"2.0"},"1.4.4":{"num":"1.4.4","url":"https://www.w3.org/TR/WCAG22/#resize-text","scId":"WCAG2:resize-text","scAltId":["visual-audio-contrast-scale"],"test":"WCAG2:visual-audio-contrast-scale","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#resize-text","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/resize-text.html","handle":"Resize text","level":"AA","wcagType":"2.0"},"1.4.5":{"num":"1.4.5","url":"https://www.w3.org/TR/WCAG22/#images-of-text","scId":"WCAG2:images-of-text","scAltId":["visual-audio-contrast-text-presentation"],"test":"WCAG2:visual-audio-contrast-text-presentation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#images-of-text","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/images-of-text.html","handle":"Images of Text","level":"AA","wcagType":"2.0"},"1.4.6":{"num":"1.4.6","url":"https://www.w3.org/TR/WCAG22/#contrast-enhanced","scId":"WCAG2:contrast-enhanced","scAltId":["visual-audio-contrast7"],"test":"WCAG2:visual-audio-contrast7","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#contrast-enhanced","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/contrast-enhanced.html","handle":"Contrast (Enhanced)","level":"AAA","wcagType":"2.0"},"1.4.7":{"num":"1.4.7","url":"https://www.w3.org/TR/WCAG22/#low-or-no-background-audio","scId":"WCAG2:low-or-no-background-audio","scAltId":["visual-audio-contrast-noaudio"],"test":"WCAG2:visual-audio-contrast-noaudio","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#low-or-no-background-audio","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/low-or-no-background-audio.html","handle":"Low or No Background Audio","level":"AAA","wcagType":"2.0"},"1.4.8":{"num":"1.4.8","url":"https://www.w3.org/TR/WCAG22/#visual-presentation","scId":"WCAG2:visual-presentation","scAltId":["visual-audio-contrast-visual-presentation"],"test":"WCAG2:visual-audio-contrast-visual-presentation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#visual-presentation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/visual-presentation.html","handle":"Visual Presentation","level":"AAA","wcagType":"2.0"},"1.4.9":{"num":"1.4.9","url":"https://www.w3.org/TR/WCAG22/#images-of-text-no-exception","scId":"WCAG2:images-of-text-no-exception","scAltId":["visual-audio-contrast-text-images"],"test":"WCAG2:visual-audio-contrast-text-images","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#images-of-text-no-exception","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/images-of-text-no-exception.html","handle":"Images of Text (No Exception)","level":"AAA","wcagType":"2.0"},"1.4.10":{"num":"1.4.10","url":"https://www.w3.org/TR/WCAG22/#reflow","scId":"WCAG2:reflow","scAltId":[],"test":"WCAG2:reflow","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#reflow","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/reflow.html","handle":"Reflow","level":"AA","wcagType":"2.1"},"1.4.11":{"num":"1.4.11","url":"https://www.w3.org/TR/WCAG22/#non-text-contrast","scId":"WCAG2:non-text-contrast","scAltId":[],"test":"WCAG2:non-text-contrast","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#non-text-contrast","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/non-text-contrast.html","handle":"Non-text Contrast","level":"AA","wcagType":"2.1"},"1.4.12":{"num":"1.4.12","url":"https://www.w3.org/TR/WCAG22/#text-spacing","scId":"WCAG2:text-spacing","scAltId":[],"test":"WCAG2:text-spacing","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#text-spacing","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/text-spacing.html","handle":"Text Spacing","level":"AA","wcagType":"2.1"},"1.4.13":{"num":"1.4.13","url":"https://www.w3.org/TR/WCAG22/#content-on-hover-or-focus","scId":"WCAG2:content-on-hover-or-focus","scAltId":[],"test":"WCAG2:content-on-hover-or-focus","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#content-on-hover-or-focus","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/content-on-hover-or-focus.html","handle":"Content on Hover or Focus","level":"AA","wcagType":"2.1"},"2.1.1":{"num":"2.1.1","url":"https://www.w3.org/TR/WCAG22/#keyboard","scId":"WCAG2:keyboard","scAltId":["keyboard-operation-keyboard-operable"],"test":"WCAG2:keyboard-operation-keyboard-operable","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#keyboard","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/keyboard.html","handle":"Keyboard","level":"A","wcagType":"2.0"},"2.1.2":{"num":"2.1.2","url":"https://www.w3.org/TR/WCAG22/#no-keyboard-trap","scId":"WCAG2:no-keyboard-trap","scAltId":["keyboard-operation-trapping"],"test":"WCAG2:keyboard-operation-trapping","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#no-keyboard-trap","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/no-keyboard-trap.html","handle":"No Keyboard Trap","level":"A","wcagType":"2.0"},"2.1.3":{"num":"2.1.3","url":"https://www.w3.org/TR/WCAG22/#keyboard-no-exception","scId":"WCAG2:keyboard-no-exception","scAltId":["keyboard-operation-all-funcs"],"test":"WCAG2:keyboard-operation-all-funcs","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#keyboard-no-exception","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/keyboard-no-exception.html","handle":"Keyboard (No Exception)","level":"AAA","wcagType":"2.0"},"2.1.4":{"num":"2.1.4","url":"https://www.w3.org/TR/WCAG22/#character-key-shortcuts","scId":"WCAG2:character-key-shortcuts","scAltId":[],"test":"WCAG2:WCAG2:character-key-shortcuts","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#character-key-shortcuts","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/character-key-shortcuts.html","handle":"Character Key Shortcuts","level":"A","wcagType":"2.1"},"2.2.1":{"num":"2.2.1","url":"https://www.w3.org/TR/WCAG22/#timing-adjustable","scId":"WCAG2:timing-adjustable","scAltId":["time-limits-required-behaviors"],"test":"WCAG2:time-limits-required-behaviors","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#timing-adjustable","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/timing-adjustable.html","handle":"Timing Adjustable","level":"A","wcagType":"2.0"},"2.2.2":{"num":"2.2.2","url":"https://www.w3.org/TR/WCAG22/#pause-stop-hide","scId":"WCAG2:pause-stop-hide","scAltId":["time-limits-pause"],"test":"WCAG2:time-limits-pause","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pause-stop-hide","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pause-stop-hide.html","handle":"Pause, Stop, Hide","level":"A","wcagType":"2.0"},"2.2.3":{"num":"2.2.3","url":"https://www.w3.org/TR/WCAG22/#no-timing","scId":"WCAG2:no-timing","scAltId":["time-limits-no-exceptions"],"test":"WCAG2:time-limits-no-exceptions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#no-timing","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/no-timing.html","handle":"No Timing","level":"AAA","wcagType":"2.0"},"2.2.4":{"num":"2.2.4","url":"https://www.w3.org/TR/WCAG22/#interruptions","scId":"WCAG2:interruptions","scAltId":["time-limits-postponed"],"test":"WCAG2:time-limits-postponed","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#interruptions","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/interruptions.html","handle":"Interruptions","level":"AAA","wcagType":"2.0"},"2.2.5":{"num":"2.2.5","url":"https://www.w3.org/TR/WCAG22/#re-authenticating","scId":"WCAG2:re-authenticating","scAltId":["time-limits-server-timeout"],"test":"WCAG2:time-limits-server-timeout","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#re-authenticating","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/re-authenticating.html","handle":"Re-authenticating","level":"AAA","wcagType":"2.0"},"2.2.6":{"num":"2.2.6","url":"https://www.w3.org/TR/WCAG22/#timeouts","scId":"WCAG2:timeouts","scAltId":[],"test":"WCAG2:WCAG2:timeouts","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#timeouts","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/timeouts.html","handle":"Timeouts","level":"AAA","wcagType":"2.1"},"2.3.1":{"num":"2.3.1","url":"https://www.w3.org/TR/WCAG22/#three-flashes-or-below-threshold","scId":"WCAG2:three-flashes-or-below-threshold","scAltId":["seizure-does-not-violate"],"test":"WCAG2:seizure-does-not-violate","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#three-flashes-or-below-threshold","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/three-flashes-or-below-threshold.html","handle":"Three Flashes or Below Threshold","level":"A","wcagType":"2.0"},"2.3.2":{"num":"2.3.2","url":"https://www.w3.org/TR/WCAG22/#three-flashes","scId":"WCAG2:three-flashes","scAltId":["seizure-three-times"],"test":"WCAG2:seizure-three-times","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#three-flashes","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/three-flashes.html","handle":"Three Flashes","level":"AAA","wcagType":"2.0"},"2.3.3":{"num":"2.3.3","url":"https://www.w3.org/TR/WCAG22/#animation-from-interactions","scId":"WCAG2:animation-from-interactions","scAltId":[],"test":"WCAG2:WCAG2:animation-from-interactions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#animation-from-interactions","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/animation-from-interactions.html","handle":"Animation from Interactions","level":"AAA","wcagType":"2.1"},"2.4.1":{"num":"2.4.1","url":"https://www.w3.org/TR/WCAG22/#bypass-blocks","scId":"WCAG2:bypass-blocks","scAltId":["navigation-mechanisms-skip"],"test":"WCAG2:navigation-mechanisms-skip","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#bypass-blocks","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/bypass-blocks.html","handle":"Bypass Blocks","level":"A","wcagType":"2.0"},"2.4.2":{"num":"2.4.2","url":"https://www.w3.org/TR/WCAG22/#page-titled","scId":"WCAG2:page-titled","scAltId":["navigation-mechanisms-title"],"test":"WCAG2:navigation-mechanisms-title","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#page-titled","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/page-titled.html","handle":"Page Titled","level":"A","wcagType":"2.0"},"2.4.3":{"num":"2.4.3","url":"https://www.w3.org/TR/WCAG22/#focus-order","scId":"WCAG2:focus-order","scAltId":["navigation-mechanisms-focus-order"],"test":"WCAG2:navigation-mechanisms-focus-order","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-order","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-order.html","handle":"Focus Order","level":"A","wcagType":"2.0"},"2.4.4":{"num":"2.4.4","url":"https://www.w3.org/TR/WCAG22/#link-purpose-in-context","scId":"WCAG2:link-purpose-in-context","scAltId":["navigation-mechanisms-refs"],"test":"WCAG2:navigation-mechanisms-refs","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#link-purpose-in-context","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/link-purpose-in-context.html","handle":"Link Purpose (In Context)","level":"A","wcagType":"2.0"},"2.4.5":{"num":"2.4.5","url":"https://www.w3.org/TR/WCAG22/#multiple-ways","scId":"WCAG2:multiple-ways","scAltId":["navigation-mechanisms-mult-loc"],"test":"WCAG2:navigation-mechanisms-mult-loc","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#multiple-ways","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/multiple-ways.html","handle":"Multiple Ways","level":"AA","wcagType":"2.0"},"2.4.6":{"num":"2.4.6","url":"https://www.w3.org/TR/WCAG22/#headings-and-labels","scId":"WCAG2:headings-and-labels","scAltId":["navigation-mechanisms-descriptive"],"test":"WCAG2:navigation-mechanisms-descriptive","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#headings-and-labels","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/headings-and-labels.html","handle":"Headings and Labels","level":"AA","wcagType":"2.0"},"2.4.7":{"num":"2.4.7","url":"https://www.w3.org/TR/WCAG22/#focus-visible","scId":"WCAG2:focus-visible","scAltId":["navigation-mechanisms-focus-visible"],"test":"WCAG2:navigation-mechanisms-focus-visible","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-visible","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-visible.html","handle":"Focus Visible","level":"AA","wcagType":"2.0"},"2.4.8":{"num":"2.4.8","url":"https://www.w3.org/TR/WCAG22/#location","scId":"WCAG2:location","scAltId":["navigation-mechanisms-location"],"test":"WCAG2:navigation-mechanisms-location","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#location","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/location.html","handle":"Location","level":"AAA","wcagType":"2.0"},"2.4.9":{"num":"2.4.9","url":"https://www.w3.org/TR/WCAG22/#link-purpose-link-only","scId":"WCAG2:link-purpose-link-only","scAltId":["navigation-mechanisms-link"],"test":"WCAG2:navigation-mechanisms-link","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#link-purpose-link-only","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/link-purpose-link-only.html","handle":"Link Purpose (Link Only)","level":"AAA","wcagType":"2.0"},"2.4.10":{"num":"2.4.10","url":"https://www.w3.org/TR/WCAG22/#section-headings","scId":"WCAG2:section-headings","scAltId":["navigation-mechanisms-headings"],"test":"WCAG2:navigation-mechanisms-headings","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#section-headings","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/section-headings.html","handle":"Section Headings","level":"AAA","wcagType":"2.0"},"2.4.11":{"num":"2.4.11","url":"https://www.w3.org/TR/WCAG22/#focus-not-obscured-minimum","scId":"WCAG2:focus-not-obscured-minimum","scAltId":["focus-not-obscured-minimum-alt"],"test":"WCAG2:focus-not-obscured-minimum-test","howToMeetUrl":"https://www.w3.org/TR/WCAG22/#focus-not-obscured-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-not-obscured-minimum.html","handle":"Focus Not Obscured (Minimum)","level":"AA","wcagType":"2.2"},"2.4.12":{"num":"2.4.12","url":"https://www.w3.org/TR/WCAG22/#focus-not-obscured-enhanced","scId":"WCAG2:focus-not-obscured-enhanced","scAltId":[],"test":"WCAG2:focus-not-obscured-enhanced-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-not-obscured-enhanced","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-not-obscured-enhanced.html","handle":"Focus Not Obscured (Enhanced)","level":"AAA","wcagType":"2.2"},"2.4.13":{"num":"2.4.13","url":"https://www.w3.org/TR/WCAG22/#focus-appearance","scId":"WCAG2:focus-appearance","scAltId":[],"test":"WCAG2:focus-appearance","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-appearance","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-appearance.html","handle":"Focus Appearance","level":"AAA","wcagType":"2.2"},"2.5.1":{"num":"2.5.1","url":"https://www.w3.org/TR/WCAG22/#pointer-gestures","scId":"WCAG2:pointer-gestures","scAltId":[],"test":"WCAG2:pointer-gestures-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pointer-gestures","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pointer-gestures.html","handle":"Pointer Gestures","level":"A","wcagType":"2.1"},"2.5.2":{"num":"2.5.2","url":"https://www.w3.org/TR/WCAG22/#pointer-cancellation","scId":"WCAG2:pointer-cancellation","scAltId":[],"test":"WCAG2:WCAG2:pointer-cancellation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pointer-cancellation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pointer-cancellation.html","handle":"Pointer Cancellation","level":"A","wcagType":"2.1"},"2.5.3":{"num":"2.5.3","url":"https://www.w3.org/TR/WCAG22/#label-in-name","scId":"WCAG2:label-in-name","scAltId":[],"test":"WCAG2:WCAG2:label-in-name","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#label-in-name","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/label-in-name.html","handle":"Label in Name","level":"A","wcagType":"2.1"},"2.5.4":{"num":"2.5.4","url":"https://www.w3.org/TR/WCAG22/#motion-actuation","scId":"WCAG2:motion-actuation","scAltId":[],"test":"WCAG2:WCAG2:motion-actuation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#motion-actuation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/motion-actuation.html","handle":"Motion Actuation","level":"A","wcagType":"2.1"},"2.5.5":{"num":"2.5.5","url":"https://www.w3.org/TR/WCAG22/#target-size","scId":"WCAG2:target-size","scAltId":[],"test":"WCAG2:WCAG2:target-size","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#target-size","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/target-size.html","handle":"Target Size","level":"AAA","wcagType":"2.1"},"2.5.6":{"num":"2.5.6","url":"https://www.w3.org/TR/WCAG22/#concurrent-input-mechanisms","scId":"WCAG2:concurrent-input-mechanisms","scAltId":[],"test":"WCAG2:WCAG2:concurrent-input-mechanisms","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#concurrent-input-mechanisms","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/concurrent-input-mechanisms.html","handle":"Concurrent Input Mechanisms","level":"AAA","wcagType":"2.1"},"2.5.7":{"num":"2.5.7","url":"https://www.w3.org/TR/WCAG22/#dragging-movements","scId":"WCAG2:dragging-movement","scAltId":["dragging-movement-alt"],"test":"WCAG2:dragging-movement-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/Understanding/dragging-movements.html","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/dragging-movements.html","handle":"Dragging Movement","level":"AA","wcagType":"2.2"},"2.5.8":{"num":"2.5.8","url":"https://www.w3.org/TR/WCAG22/#target-size-minimum","scId":"WCAG2:minimum-target-size","scAltId":["minimum-target-size-alt"],"test":"WCAG2:minimum-target-size-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#target-size-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/target-size-minimum.html","handle":"Minimum Target Size","level":"AA","wcagType":"2.2"},"3.1.1":{"num":"3.1.1","url":"https://www.w3.org/TR/WCAG22/#language-of-page","scId":"WCAG2:language-of-page","scAltId":["meaning-doc-lang-id"],"test":"WCAG2:meaning-doc-lang-id","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#language-of-page","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/language-of-page.html","handle":"Language of Page","level":"A","wcagType":"2.0"},"3.1.2":{"num":"3.1.2","url":"https://www.w3.org/TR/WCAG22/#language-of-parts","scId":"WCAG2:language-of-parts","scAltId":["meaning-other-lang-id"],"test":"WCAG2:meaning-other-lang-id","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#language-of-parts","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/language-of-parts.html","handle":"Language of Parts","level":"AA","wcagType":"2.0"},"3.1.3":{"num":"3.1.3","url":"https://www.w3.org/TR/WCAG22/#unusual-words","scId":"WCAG2:unusual-words","scAltId":["meaning-idioms"],"test":"WCAG2:meaning-idioms","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#unusual-words","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/unusual-words.html","handle":"Unusual Words","level":"AAA","wcagType":"2.0"},"3.1.4":{"num":"3.1.4","url":"https://www.w3.org/TR/WCAG22/#abbreviations","scId":"WCAG2:abbreviations","scAltId":["meaning-located"],"test":"WCAG2:meaning-located","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#abbreviations","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/abbreviations.html","handle":"Abbreviations","level":"AAA","wcagType":"2.0"},"3.1.5":{"num":"3.1.5","url":"https://www.w3.org/TR/WCAG22/#reading-level","scId":"WCAG2:reading-level","scAltId":["meaning-supplements"],"test":"WCAG2:meaning-supplements","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#reading-level","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/reading-level.html","handle":"Reading Level","level":"AAA","wcagType":"2.0"},"3.1.6":{"num":"3.1.6","url":"https://www.w3.org/TR/WCAG22/#pronunciation","scId":"WCAG2:pronunciation","scAltId":["meaning-pronunciation"],"test":"WCAG2:meaning-pronunciation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pronunciation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pronunciation.html","handle":"Pronunciation","level":"AAA","wcagType":"2.0"},"3.2.1":{"num":"3.2.1","url":"https://www.w3.org/TR/WCAG22/#on-focus","scId":"WCAG2:on-focus","scAltId":["consistent-behavior-receive-focus"],"test":"WCAG2:consistent-behavior-receive-focus","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#on-focus","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/on-focus.html","handle":"On Focus","level":"A","wcagType":"2.0"},"3.2.2":{"num":"3.2.2","url":"https://www.w3.org/TR/WCAG22/#on-input","scId":"WCAG2:on-input","scAltId":["consistent-behavior-unpredictable-change"],"test":"WCAG2:consistent-behavior-unpredictable-change","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#on-input","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/on-input.html","handle":"On Input","level":"A","wcagType":"2.0"},"3.2.3":{"num":"3.2.3","url":"https://www.w3.org/TR/WCAG22/#consistent-navigation","scId":"WCAG2:consistent-navigation","scAltId":["consistent-behavior-consistent-locations"],"test":"WCAG2:consistent-behavior-consistent-locations","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#consistent-navigation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/consistent-navigation.html","handle":"Consistent Navigation","level":"AA","wcagType":"2.0"},"3.2.4":{"num":"3.2.4","url":"https://www.w3.org/TR/WCAG22/#consistent-identification","scId":"WCAG2:consistent-identification","scAltId":["consistent-behavior-consistent-functionality"],"test":"WCAG2:consistent-behavior-consistent-functionality","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#consistent-identification","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/consistent-identification.html","handle":"Consistent Identification","level":"AA","wcagType":"2.0"},"3.2.5":{"num":"3.2.5","url":"https://www.w3.org/TR/WCAG22/#change-on-request","scId":"WCAG2:change-on-request","scAltId":["consistent-behavior-no-extreme-changes-context"],"test":"WCAG2:consistent-behavior-no-extreme-changes-context","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#change-on-request","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/change-on-request.html","handle":"Change on Request","level":"AAA","wcagType":"2.0"},"3.2.6":{"num":"3.2.6","url":"https://www.w3.org/TR/WCAG22/#consistent-help","scId":"WCAG2:consistent-help","scAltId":["consistent-help-alt"],"test":"WCAG2:consistent-help-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#consistent-help","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/consistent-help.html","handle":"Consistent Help","level":"AA","wcagType":"2.2"},"3.3.1":{"num":"3.3.1","url":"https://www.w3.org/TR/WCAG22/#error-identification","scId":"WCAG2:error-identification","scAltId":["minimize-error-identified"],"test":"WCAG2:minimize-error-identified","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-identification","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-identification.html","handle":"Error Identification","level":"A","wcagType":"2.0"},"3.3.2":{"num":"3.3.2","url":"https://www.w3.org/TR/WCAG22/#labels-or-instructions","scId":"WCAG2:labels-or-instructions","scAltId":["minimize-error-cues"],"test":"WCAG2:minimize-error-cues","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#labels-or-instructions","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/labels-or-instructions.html","handle":"Labels or Instructions","level":"A","wcagType":"2.0"},"3.3.3":{"num":"3.3.3","url":"https://www.w3.org/TR/WCAG22/#error-suggestion","scId":"WCAG2:error-suggestion","scAltId":["minimize-error-suggestions"],"test":"WCAG2:minimize-error-suggestions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-suggestion","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-suggestion.html","handle":"Error Suggestion","level":"AA","wcagType":"2.0"},"3.3.4":{"num":"3.3.4","url":"https://www.w3.org/TR/WCAG22/#error-prevention-legal-financial-data","scId":"WCAG2:error-prevention-legal-financial-data","scAltId":["minimize-error-reversible"],"test":"WCAG2:minimize-error-reversible","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-prevention-legal-financial-data","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-prevention-legal-financial-data.html","handle":"Error Prevention (Legal, Financial, Data)","level":"AA","wcagType":"2.0"},"3.3.5":{"num":"3.3.5","url":"https://www.w3.org/TR/WCAG22/#help","scId":"WCAG2:help","scAltId":["minimize-error-context-help"],"test":"WCAG2:minimize-error-context-help","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#help","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/help.html","handle":"Help","level":"AAA","wcagType":"2.0"},"3.3.6":{"num":"3.3.6","url":"https://www.w3.org/TR/WCAG22/#error-prevention-all","scId":"WCAG2:error-prevention-all","scAltId":["minimize-error-reversible-all"],"test":"WCAG2:minimize-error-reversible-all","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-prevention-all","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-prevention-all.html","handle":"Error Prevention (All)","level":"AAA","wcagType":"2.0"},"3.3.7":{"num":"3.3.7","url":"https://www.w3.org/TR/WCAG22/#redundant-entry","scId":"WCAG2:redundant-entry","scAltId":["redundant-entry-alt"],"test":"WCAG2:redundant-entry-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#redundant-entry","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/redundant-entry.html","handle":"Redundant Entry","level":"AA","wcagType":"2.2"},"3.3.8":{"num":"3.3.8","url":"https://www.w3.org/TR/WCAG22/#accessible-authentication-minimum","scId":"WCAG2:accessible-authentication-minimum","scAltId":["accessible-authentication-minimum-alt"],"test":"WCAG2:accessible-authentication-minimum-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#accessible-authentication-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/accessible-authentication-minimum.html","handle":"Accessible Authentication (Minimum)","level":"AA","wcagType":"2.2"},"3.3.9":{"num":"3.3.9","url":"https://www.w3.org/TR/WCAG22/#accessible-authentication-enhanced","scId":"WCAG2:accessible-authentication-enhanced","scAltId":[],"test":"WCAG2:accessible-authentication-enhanced","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#accessible-authentication-enhanced","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/accessible-authentication-enhanced.html","handle":"Accessible Authentication (Enhanced)","level":"AAA","wcagType":"2.2"},"4.1.1":{"num":"4.1.1","url":"https://www.w3.org/TR/WCAG22/#parsing","scId":"WCAG2:parsing","scAltId":["ensure-compat-parses"],"test":"WCAG2:ensure-compat-parses","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/?versions=2.1#parsing","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/parsing.html","handle":"Parsing","level":"A","wcagType":"2.0"},"4.1.2":{"num":"4.1.2","url":"https://www.w3.org/TR/WCAG22/#name-role-value","scId":"WCAG2:name-role-value","scAltId":["ensure-compat-rsv"],"test":"WCAG2:ensure-compat-rsv","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#name-role-value","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/name-role-value.html","handle":"Name, Role, Value","level":"A","wcagType":"2.0"},"4.1.3":{"num":"4.1.3","url":"https://www.w3.org/TR/WCAG22/#status-messages","scId":"WCAG2:status-messages","scAltId":[],"test":"WCAG2:status-messages","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#status-messages","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/status-messages.html","handle":"Status Messages","level":"AA","wcagType":"2.1"},"HTML":{"num":"HTML","url":"https://html.spec.whatwg.org/multipage/","scId":"","scAltId":[],"test":"","howToMeetUrl":"https://html.spec.whatwg.org/multipage/","understandingUrl":"https://html.spec.whatwg.org/multipage/","handle":"specification","level":"NA","wcagType":"NA"},"ARIA":{"num":"ARIA","url":"https://www.w3.org/TR/wai-aria-1.2/","scId":"","scAltId":[],"test":"","howToMeetUrl":"https://www.w3.org/TR/wai-aria-1.2/","understandingUrl":"https://www.w3.org/TR/wai-aria-1.2/","handle":"specification","level":"NA","wcagType":"NA"}}'); + +/***/ } + +/******/ }); +/************************************************************************/ +/******/ // The module cache +/******/ const __webpack_module_cache__ = {}; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ // Check if module is in cache +/******/ const cachedModule = __webpack_module_cache__[moduleId]; +/******/ if (cachedModule !== undefined) { +/******/ return cachedModule.exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ const module = __webpack_module_cache__[moduleId] = { +/******/ // no module.id needed +/******/ // no module.loaded needed +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ if (!(moduleId in __webpack_modules__)) { +/******/ delete __webpack_module_cache__[moduleId]; +/******/ const e = new Error("Cannot find module '" + moduleId + "'"); +/******/ e.code = 'MODULE_NOT_FOUND'; +/******/ throw e; +/******/ } +/******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/************************************************************************/ +let __webpack_exports__ = {}; +// This entry needs to be wrapped in an IIFE because it needs to be isolated against other modules in the chunk. +(() => { +let exports = __webpack_exports__; +/*!**********************!*\ + !*** ./src/index.ts ***! + \**********************/ + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.checkDemo = exports.SRViewer = exports.SRCursor = exports.SRController = exports.DOMWalker = exports.Config = exports.ARIAMapper = exports.Checker = exports.Context = void 0; +var Context_1 = __webpack_require__(/*! ./v2/common/Context */ "./src/v2/common/Context.ts"); +Object.defineProperty(exports, "Context", ({ enumerable: true, get: function () { return Context_1.Context; } })); +// import { Simulator } from "./v2/simulator" +var Checker_1 = __webpack_require__(/*! ./v4/checker/Checker */ "./src/v4/checker/Checker.ts"); +Object.defineProperty(exports, "Checker", ({ enumerable: true, get: function () { return Checker_1.Checker; } })); +var ARIAMapper_1 = __webpack_require__(/*! ./v2/aria/ARIAMapper */ "./src/v2/aria/ARIAMapper.ts"); +Object.defineProperty(exports, "ARIAMapper", ({ enumerable: true, get: function () { return ARIAMapper_1.ARIAMapper; } })); +var Config_1 = __webpack_require__(/*! ./v2/config/Config */ "./src/v2/config/Config.ts"); +Object.defineProperty(exports, "Config", ({ enumerable: true, get: function () { return Config_1.Config; } })); +var DOMWalker_1 = __webpack_require__(/*! ./v2/dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +Object.defineProperty(exports, "DOMWalker", ({ enumerable: true, get: function () { return DOMWalker_1.DOMWalker; } })); +var SRController_1 = __webpack_require__(/*! ./v4/simulator/SRController */ "./src/v4/simulator/SRController.ts"); +Object.defineProperty(exports, "SRController", ({ enumerable: true, get: function () { return SRController_1.SRController; } })); +var SRCursor_1 = __webpack_require__(/*! ./v4/simulator/SRCursor */ "./src/v4/simulator/SRCursor.ts"); +Object.defineProperty(exports, "SRCursor", ({ enumerable: true, get: function () { return SRCursor_1.SRCursor; } })); +var SRViewer_1 = __webpack_require__(/*! ./v4/simulator/SRViewer */ "./src/v4/simulator/SRViewer.ts"); +Object.defineProperty(exports, "SRViewer", ({ enumerable: true, get: function () { return SRViewer_1.SRViewer; } })); +function checkDemo(timeout) { + if (!timeout) + timeout = 0; + var checker = new Checker_1.Checker(); + setTimeout(function () { + checker.check(document.documentElement, ["IBM_Accessibility", "IBM_Design"]) + .then(function (report) { + console.log(report); + var vals = { + "FAIL": 0, + "POTENTIAL": 1, + "MANUAL": 2, + "PASS": 3 + }; + for (var idx = 0; idx < report.results.length; ++idx) { + if (report.results[idx].value[1] === "PASS") { + report.results.splice(idx--, 1); + } + } + report.results.sort(function (a, b) { + if (a.category != b.category) { + return a.category.localeCompare(b.category); + } + if (a.path["aria"] === b.path["aria"]) { + return vals[a.value[1]] - vals[b.value[1]]; + } + return a.path["aria"].localeCompare(b.path["aria"]); + }); + var lastPath = null; + var category = null; + for (var _i = 0, _a = report.results; _i < _a.length; _i++) { + var result = _a[_i]; + if (category !== result.category) { + if (category !== null) { + console.groupEnd(); + console.groupEnd(); + lastPath = null; + } + category = result.category; + console.group(result.category); + } + if (result.path["aria"] != lastPath) { + if (lastPath !== null) { + console.groupEnd(); + } + lastPath = result.path["aria"]; + if (lastPath === "") { + console.group("page"); + } + else { + console.group(lastPath); + } + } + console.log(result.value, result.message); + } + console.groupEnd(); + console.groupEnd(); + }); + }, timeout); +} +exports.checkDemo = checkDemo; + +})(); + +ace = __webpack_exports__; +/******/ })() +; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,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LEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQzdtRyxDQUFFLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDeDFILENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUM3aUUsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUM1ekQsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDenhCLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDM2pCLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDeGtFLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQ25xQyxDQUFFLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQ2xsQyxDQUFFLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDeDFCLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUMzNUgsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDempFLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUN2MUgsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUMzK0YsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQy9pQyxDQUFFLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQy9uRSxDQUFFLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDblcsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUMzOUIsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDN3BHLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUN4cUcsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQztJQUN4eUIsQ0FBRSxJQUFJLEVBQUMsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDbmpCLENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQ2gzQyxDQUFFLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLENBQUM7SUFDbjVELENBQUUsSUFBSSxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0lBQzE4QyxDQUFFLElBQUksRUFBQyxJQUFJLEVBQUMsSUFBSSxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxDQUFDO0NBQzdtQyxDQUFDO0FBR0Y7SUFBQTtJQXFDQSxDQUFDO0lBbkNHLHdEQUF3RDtJQUMxQyxnQkFBTyxHQUFyQixVQUFzQixPQUFlO1FBQ2pD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LENBQUMsR0FBRyxJQUFJLE1BQU0sQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLEdBQUcsSUFBSSxNQUFNLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLEdBQUcsR0FBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7bUJBQ2xLLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7bUJBQzNJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsSUFBSSxNQUFNLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7dUJBQ3JJLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLE1BQU0sQ0FB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LENBQUMsTUFBTSxDQUFDLENBQUM7cUJBQ3pCO3lCQUFNO3dCQUNILE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7cUJBQzNCO2lCQUNKO2dCQUNELE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDN0M7WUFDRCxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbkIsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3ZCLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ2hCLENBQUM7QUF4REQsOEJBd0RDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3YyL2FyaWEvQVJJQURlZmluaXRpb25zLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92Mi9hcmlhL0FSSUFNYXBwZXIudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3YyL2FyaWEvQVJJQVdhbGtlci50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvYW5jZXN0b3IudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9sYW5nLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92Mi9jb21tb24vQ29tbW9uTWFwcGVyLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92Mi9jb21tb24vQ29udGV4dC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjIvY29tbW9uL0VuZ2luZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjIvY29uZmlnL0NvbmZpZy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjIvZG9tL0RPTU1hcHBlci50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjIvZG9tL0RPTVV0aWwudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3YyL2RvbS9ET01XYWxrZXIudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L2FwaS9JR3VpZGVsaW5lLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9hcGkvSVJ1bGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L2NoZWNrZXIvQ2hlY2tlci50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYV90YXJnZXRfd2FybmluZy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYV90ZXh0X3B1cnBvc2UudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FwcGxldF9hbHRfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcHBsaWNhdGlvbl9jb250ZW50X2FjY2Vzc2libGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyZWFfYWx0X2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9hY2Nlc3NpYmxlbmFtZV9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfYWN0aXZlZGVzY2VuZGFudF90YWJpbmRleF92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9hY3RpdmVkZXNjZW5kYW50X3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2FwcGxpY2F0aW9uX2xhYmVsX3VuaXF1ZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9hcHBsaWNhdGlvbl9sYWJlbGxlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9hcnRpY2xlX2xhYmVsX3VuaXF1ZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9hdHRyaWJ1dGVfYWxsb3dlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9hdHRyaWJ1dGVfY29uZmxpY3QudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfYXR0cmlidXRlX2RlcHJlY2F0ZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfYXR0cmlidXRlX2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9hdHRyaWJ1dGVfcmVkdW5kYW50LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2F0dHJpYnV0ZV9yZXF1aXJlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9hdHRyaWJ1dGVfdmFsdWVfdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfYmFubmVyX2xhYmVsX3VuaXF1ZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9iYW5uZXJfc2luZ2xlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2NoaWxkX3RhYmJhYmxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2NoaWxkX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxfdW5pcXVlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxfdmlzaWJsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsbGVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2NvbnRlbnRfaW5fbGFuZG1hcmsudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfY29udGVudGluZm9fbGFiZWxfdW5pcXVlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2NvbnRlbnRpbmZvX21pc3VzZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9jb250ZW50aW5mb19zaW5nbGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfZGVzY2VuZGFudF92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9kb2N1bWVudF9sYWJlbF91bmlxdWUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfZXZlbnRoYW5kbGVyX3JvbGVfdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfZm9ybV9sYWJlbF91bmlxdWUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfZ3JhcGhpY19sYWJlbGxlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9oaWRkZW5fbm9udGFiYmFibGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfaWRfdW5pcXVlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX2ltZ19sYWJlbGxlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9rZXlib2FyZF9oYW5kbGVyX2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9sYW5kbWFya19uYW1lX3VuaXF1ZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9tYWluX2xhYmVsX3VuaXF1ZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9tYWluX2xhYmVsX3Zpc2libGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfbmF2aWdhdGlvbl9sYWJlbF91bmlxdWUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfcGFyZW50X3JlcXVpcmVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX3JlZ2lvbl9sYWJlbF91bmlxdWUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FyaWFfcmVnaW9uX2xhYmVsbGVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX3JvbGVfYWxsb3dlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9yb2xlX3JlZHVuZGFudC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV9zZWFyY2hfbGFiZWxfdW5pcXVlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9hcmlhX3NlbWFudGljcy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV90b29sYmFyX2xhYmVsX3VuaXF1ZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYXJpYV93aWRnZXRfbGFiZWxsZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2FzY2lpYXJ0X2FsdF9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2JsaW5rX2Nzc19yZXZpZXcudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2JsaW5rX2VsZW1fZGVwcmVjYXRlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvYmxvY2txdW90ZV9jaXRlX2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvY2FudmFzX2NvbnRlbnRfZGVzY3JpYmVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9jYXB0aW9uX3RyYWNrX2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvY29tYm9ib3hfYWN0aXZlX2Rlc2NlbmRhbnQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2NvbWJvYm94X2F1dG9jb21wbGV0ZV92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvY29tYm9ib3hfZGVzaWduX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9jb21ib2JveF9mb2N1c2FibGVfZWxlbWVudHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2NvbWJvYm94X2hhc3BvcHVwX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9jb21ib2JveF9wb3B1cF9yZWZlcmVuY2UudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2RlYnVnX3BhdGhzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9kZXRlY3Rvcl90YWJiYWJsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZGlyX2F0dHJpYnV0ZV92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZG93bmxvYWRfa2V5Ym9hcmRfY29udHJvbGxhYmxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9kcmFnZ2FibGVfYWx0ZXJuYXRpdmVfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9lbGVtZW50X2FjY2Vzc2tleV9sYWJlbGxlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZWxlbWVudF9hY2Nlc3NrZXlfdW5pcXVlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9lbGVtZW50X2F0dHJpYnV0ZV9kZXByZWNhdGVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9lbGVtZW50X2lkX3VuaXF1ZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZWxlbWVudF9sYW5nX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9lbGVtZW50X21vdXNlZXZlbnRfa2V5Ym9hcmQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2VsZW1lbnRfb3JpZW50YXRpb25fdW5sb2NrZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2VsZW1lbnRfc2Nyb2xsYWJsZV90YWJiYWJsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZWxlbWVudF90YWJiYWJsZV9yb2xlX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9lbGVtZW50X3RhYmJhYmxlX3Vub2JzY3VyZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2VsZW1lbnRfdGFiYmFibGVfdmlzaWJsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZW1iZWRfYWx0X2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZW1vdGljb25zX2FsdF9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2Vycm9yX21lc3NhZ2VfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9maWVsZHNldF9sYWJlbF92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZmllbGRzZXRfbGVnZW5kX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9maWd1cmVfbGFiZWxfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9mb3JtX2ZvbnRfY29sb3IudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2Zvcm1faW50ZXJhY3Rpb25fcmV2aWV3LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9mb3JtX2xhYmVsX3VuaXF1ZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZm9ybV9zdWJtaXRfYnV0dG9uX2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvZm9ybV9zdWJtaXRfcmV2aWV3LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9mcmFtZV9zcmNfdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2ZyYW1lX3RpdGxlX2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaGVhZGluZ19jb250ZW50X2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaGVhZGluZ19tYXJrdXBfbWlzdXNlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9odG1sX2xhbmdfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9odG1sX3NraXBuYXZfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pZnJhbWVfaW50ZXJhY3RpdmVfdGFiYmFibGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2ltYWdlYnV0dG9uX2FsdF9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2ltYWdlbWFwX2FsdF9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2ltZ19hbHRfYmFja2dyb3VuZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW1nX2FsdF9kZWNvcmF0aXZlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pbWdfYWx0X21pc3VzZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW1nX2FsdF9udWxsLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pbWdfYWx0X3JlZHVuZGFudC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW1nX2FsdF92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW1nX2lzbWFwX21pc3VzZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW1nX2xvbmdkZXNjX21pc3VzZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2lucHV0X2F1dG9jb21wbGV0ZV92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW5wdXRfY2hlY2tib3hlc19ncm91cGVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pbnB1dF9maWVsZHNfZ3JvdXBlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW5wdXRfaGFzcG9wdXBfY29uZmxpY3QudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2lucHV0X2xhYmVsX2FmdGVyLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pbnB1dF9sYWJlbF9iZWZvcmUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2lucHV0X2xhYmVsX2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW5wdXRfbGFiZWxfdmlzaWJsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvaW5wdXRfb25jaGFuZ2VfcmV2aWV3LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9pbnB1dF9wbGFjZWhvbGRlcl9sYWJlbF92aXNpYmxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9sYWJlbF9jb250ZW50X2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvbGFiZWxfbmFtZV92aXNpYmxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9sYWJlbF9yZWZfdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2xpc3RfY2hpbGRyZW5fdmFsaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL2xpc3RfbWFya3VwX3Jldmlldy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvbGlzdF9zdHJ1Y3R1cmVfcHJvcGVyLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9tYXJxdWVlX2VsZW1fYXZvaWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL21lZGlhX2FsdF9icmllZi50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvbWVkaWFfYWx0X2V4aXN0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvbWVkaWFfYXVkaW9fdHJhbnNjcmliZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL21lZGlhX2F1dG9zdGFydF9jb250cm9sbGFibGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL21lZGlhX2tleWJvYXJkX2NvbnRyb2xsYWJsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvbWVkaWFfbGl2ZV9jYXB0aW9uZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL21lZGlhX3RyYWNrX2F2YWlsYWJsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvbWV0YV9yZWRpcmVjdF9vcHRpb25hbC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvbWV0YV9yZWZyZXNoX2RlbGF5LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9tZXRhX3ZpZXdwb3J0X3pvb21hYmxlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9ub2VtYmVkX2NvbnRlbnRfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9vYmplY3RfdGV4dF9leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3BhZ2VfdGl0bGVfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9wYWdlX3RpdGxlX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9zY3JpcHRfZm9jdXNfYmx1cl9yZXZpZXcudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3NjcmlwdF9vbmNsaWNrX2F2b2lkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9zY3JpcHRfb25jbGlja19taXN1c2UudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3NjcmlwdF9zZWxlY3RfcmV2aWV3LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9zZWxlY3Rfb3B0aW9uc19ncm91cGVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9za2lwX21haW5fZGVzY3JpYmVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9za2lwX21haW5fZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy9zdHlsZV9iYWNrZ3JvdW5kX2RlY29yYXRpdmUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3N0eWxlX2JlZm9yZV9hZnRlcl9yZXZpZXcudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3N0eWxlX2NvbG9yX21pc3VzZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvc3R5bGVfZm9jdXNfdmlzaWJsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvc3R5bGVfaGlnaGNvbnRyYXN0X3Zpc2libGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3N0eWxlX2hvdmVyX3BlcnNpc3RlbnQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3N0eWxlX3ZpZXdwb3J0X3Jlc2l6YWJsZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvc3ZnX2dyYXBoaWNzX2xhYmVsbGVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy90YWJsZV9hcmlhX2Rlc2NlbmRhbnRzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy90YWJsZV9jYXB0aW9uX2VtcHR5LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy90YWJsZV9jYXB0aW9uX25lc3RlZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvdGFibGVfaGVhZGVyc19leGlzdHMudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3RhYmxlX2hlYWRlcnNfcmVmX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy90YWJsZV9oZWFkZXJzX3JlbGF0ZWQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3RhYmxlX2xheW91dF9saW5lYXJpemVkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy90YWJsZV9zY29wZV92YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvdGFibGVfc3RydWN0dXJlX21pc3VzZS50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvdGFibGVfc3VtbWFyeV9yZWR1bmRhbnQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3RhcmdldF9zcGFjaW5nX3N1ZmZpY2llbnQudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3RleHRfYmxvY2tfaGVhZGluZy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvdGV4dF9jb250cmFzdF9zdWZmaWNpZW50LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy90ZXh0X3F1b3RlZF9jb3JyZWN0bHkudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3RleHRfc2Vuc29yeV9taXN1c2UudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3J1bGVzL3RleHRfc3BhY2luZ192YWxpZC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvcnVsZXMvdGV4dF93aGl0ZXNwYWNlX3ZhbGlkLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy93aWRnZXRfdGFiYmFibGVfZXhpc3RzLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlcy93aWRnZXRfdGFiYmFibGVfc2luZ2xlLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9ydWxlc2V0cy50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvc2ltdWxhdG9yL1NSQ29udHJvbGxlci50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvc2ltdWxhdG9yL1NSQ3Vyc29yLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9zaW11bGF0b3IvU1JOYXZpZ2F0b3IudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3NpbXVsYXRvci9TUlJlbmRlcmVyLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9zaW11bGF0b3IvU1JSZW5kZXJlclJ1bGUudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3NpbXVsYXRvci9TUlRhYmxlVXRpbC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvc2ltdWxhdG9yL1NSVXRpbC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvc2ltdWxhdG9yL1NSVmlld2VyLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9zaW11bGF0b3IvcmVuZGVyX3J1bGVzL2NvbW1vbi50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvc2ltdWxhdG9yL3JlbmRlcl9ydWxlcy9jb250YWluZXJfZW50ZXIudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3NpbXVsYXRvci9yZW5kZXJfcnVsZXMvY29udGFpbnRlcl9leGl0LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC9zaW11bGF0b3IvcmVuZGVyX3J1bGVzL2luZGV4LnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC91dGlsL0FjY05hbWVVdGlsLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC91dGlsL0FyaWFVdGlsLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC91dGlsL0NTU1V0aWwudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3V0aWwvQ2FjaGVVdGlsLnRzIiwid2VicGFjazovL2FjZS8uL3NyYy92NC91dGlsL0NsaXBQYXRoVXRpbC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvdXRpbC9Db2xvclV0aWwudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3V0aWwvQ29tbW9uVXRpbC50cyIsIndlYnBhY2s6Ly9hY2UvLi9zcmMvdjQvdXRpbC9UYWJsZVV0aWwudHMiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL3Y0L3V0aWwvVmlzVXRpbC50cyIsIndlYnBhY2s6Ly9hY2Uvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vYWNlLy4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMC0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuLypnbG9iYWwgT3BlbkFqYXgqL1xuLy8gYWxsIHJlZmVyZW5jZXMgdG8gV0FJLUFSSUEgc3BlY2lmaWNhdGlvbiBpcyB0aGUgV0FJLUFSSUEgMS4yXG4vLyBodHRwczovL3d3dy53My5vcmcvVFIvd2FpLWFyaWEtMS4yL1xuXG5leHBvcnQgdHlwZSBJRG9jdW1lbnRDb25mb3JtYW5jZVJlcXVpcmVtZW50ID0ge1xuICAgIGltcGxpY2l0Um9sZTogc3RyaW5nW10sXG4gICAgdmFsaWRSb2xlczogc3RyaW5nW10sXG4gICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogYm9vbGVhbixcbiAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlcz86IHN0cmluZ1tdLCBcbiAgICBvdGhlckRpc2FsbG93ZWRBcmlhQXR0cmlidXRlcz86IHN0cmluZ1tdLFxuICAgIG90aGVyUm9sZXNGb3JBdHRyaWJ1dGVzPzogc3RyaW5nW10sIC8vcm9sZXMsIG90aGVyIHRoYW4gaW1wbGljaXQgYW5kIHZhbGlkIHJvbGVzLCB3aG9zZSBhdHRyaWJ1dGVzIGFyZSBhbHNvIGFsbG93ZWRcbiAgICAvLyBhIGZldyBlbGVtZW50cyAoc3VjaCBhcyBkYXRhbGlzdCwgaHRtbCwgY2FwdGlvbikgdGhhdCBoYXZlIGFuIGltcGxpY2l0IHJvbGUgYnV0IGRpc2FsbG93IHNvbWUgb3IgYWxsIGF0dHJpYnV0ZXMgYWxsb3dlZCBmb3IgdGhlIHJvbGUuXG4gICAgYWxsb3dBdHRyaWJ1dGVzRnJvbUltcGxpY2l0Um9sZT86IGJvb2xlYW4sXG4gICAgcHJvaGliaXRlZEFyaWFBdHRyaWJ1dGVzV2hlbk5vSW1wbGljaXRSb2xlPzogc3RyaW5nW10gIC8vc29tZSBlbGVtZW50cyAodmFyLGFiYnIgZXRjLikgaGF2ZSBubyBpbXBsaWNpdCByb2xlIGJ1dCBuYW1pbmcgcHJvaGliaXRlZCAgIFxufVxuXG5leHBvcnQgY2xhc3MgQVJJQURlZmluaXRpb25zIHtcbiAgICBzdGF0aWMgbmFtZUZyb21Db250ZW50KHJvbGU6IHN0cmluZykgOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIChyb2xlIGluIEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJucykgXG4gICAgICAgICAgICAmJiBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNbcm9sZV0ubmFtZUZyb20gXG4gICAgICAgICAgICAmJiBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNbcm9sZV0ubmFtZUZyb20uaW5jbHVkZXMoXCJjb250ZW50c1wiKTtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIGFycmF5IG9mIFdBSS1BUklBIGdsb2JhbCBzdGF0ZXMgYW5kIHByb3BlcnRpZXNcbiAgICAgKiBAc2VlIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93YWktYXJpYS0xLjIvI2dsb2JhbF9zdGF0ZXNcbiAgICAgKi9cbiAgICBzdGF0aWMgZ2xvYmFsUHJvcGVydGllcyA6IHN0cmluZ1tdID0gW1wiYXJpYS1hdG9taWNcIiwgXCJhcmlhLWJ1c3lcIiwgXCJhcmlhLWNvbnRyb2xzXCIsIFwiYXJpYS1jdXJyZW50XCIsIFwiYXJpYS1kZXNjcmliZWRieVwiLCBcbiAgICAgICAgXCJhcmlhLWRldGFpbHNcIiwgXCJhcmlhLWZsb3d0b1wiLCBcImFyaWEtaGlkZGVuXCIsIFwiYXJpYS1rZXlzaG9ydGN1dHNcIixcbiAgICAgICAgXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCIsIFwiYXJpYS1saXZlXCIsIFwiYXJpYS1vd25zXCIsIFwiYXJpYS1yZWxldmFudFwiLCBcImFyaWEtcm9sZWRlc2NyaXB0aW9uXCJcbiAgICAgICAgLy8gdGhlIGZvbGxvd2luZyBhcmUgZGVwcmVjYXRlZCBpbiBBUklBIDEuMiwgd2lsbCBpbmRpY2F0ZSBkZXByZWNhdGlvbiBpbiBpbmRpdmlkdWFsIHJvbGVcbiAgICAgICAgLCAnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCdcbiAgICBdO1xuXG4gICAgLy9wcm9wZXJ0aWVzIGNvbnRhaW5zIGlkKHMpIHRoYXQgcmVmZXIgdG8gb3RoZXIgZWxlbWVudChzKVxuICAgIHN0YXRpYyByZWZlcmVuY2VQcm9wZXJ0aWVzIDogc3RyaW5nW10gPSBbXCJhcmlhLW93bnNcIiwgXCJhcmlhLWNvbnRyb2xzXCIsIFwiYXJpYS1kZXNjcmliZWRieVwiLCBcImFyaWEtbGFiZWxsZWRieVwiLCBcImFyaWEtZmxvd3RvXCIsIFwiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCJdO1xuXG4gICAgLy8gZGVwcmVjYXRlZCByb2xlc1xuICAgIHN0YXRpYyBnbG9iYWxEZXByZWNhdGVkUm9sZXMgOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgJ2RpcmVjdG9yeScsICdkb2MtYmlibGlvZW50cnknLCAnZG9jLWVuZG5vdGUnXG4gICAgXTtcblxuICAgIC8vIHRoZSBmb2xsb3dpbmcgYXJlIGRlcHJlY2F0ZWQgaW4gQVJJQSAxLjEgZm9yIGFsbCB0aGUgcm9sZXNcbiAgICBzdGF0aWMgZ2xvYmFsRGVwcmVjYXRlZFByb3BlcnRpZXMgOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgJ2FyaWEtZ3JhYmJlZCcsICdhcmlhLWRyb3BlZmZlY3QnXG4gICAgXTtcbiAgICBcbiAgICAvKlxuICAgICAqIFhTRCBkYXRhIHR5cGVzIGZvciBhbGwgV0FJLUFSSUEgcHJvcGVydGllc1xuICAgICAqIGFsb25nIHdpdGggdmFsaWQgdmFsdWVzIHdoZW4gdGhlIGRhdGEgdHlwZSBpcyBOTVRPS0VOXG4gICAgICogV0FJLUFSSUEgcHJvcGVydGllcyBkYXRhIHR5cGVzIGV4cGxhbmVkOlxuICAgICAqICB0eXBlOiBVc2VkIHRvIGlkZW50aWZ5IHRoZSB0eXBlIG9mIHZhbHVlcyBhbGxvd2VkIGZvciB0aGUgV0FJLUFSSUEgcHJvcGVydHlcbiAgICAgKiAgdmFsdWVzOiBVc2VkIHRvIGlkZW50aWZ5IHNwZWNpZmljIHZhbHVlcyBvZiBhbiBXQUktQVJJQSBwcm9wZXJ0eSB3aGVuIHR5cGUgaXMgbm10b2tlblxuICAgICAqICBoaWRkZW5JRFJlZlN1cHBvcnRlZDogVXNlZCB0byBpZGVudGlmeSBpZiB0aGUgV0FJLUFSSUEgcHJvcGVydHkgc3VwcG9ydHMgcmVmZXJlbmNpbmcgaGlkZGVuIElEXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHRydWU6IHJlZmVycyB0byBXQUktQVJJQSBwcm9wZXJ0eSBzdXBwb3J0cyBoaWRkZW4gSUQgcmVmZXJlbmNlc1xuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZTogcmVmZXJzIHRvIFdBSS1BUklBIHByb3BlcnR5IGRvZXMgbm90IHN1cHBvcnQgaGlkZGVuIElEIHJlZmVyZW5jZXNcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQgdmFsdWUgd2lsbCBiZSBzZXQgdG8gZmFsc2UsIGlmIG5vdCBzcGVjaWZpZWQuXG4gICAgICovXG4gICAgc3RhdGljIHByb3BlcnR5RGF0YVR5cGVzIDogeyBcbiAgICAgICAgW3Byb3A6IHN0cmluZ10gOiB7IFxuICAgICAgICAgICAgdHlwZTogc3RyaW5nLCBcbiAgICAgICAgICAgIGhpZGRlbklEUmVmU3VwcG9ydGVkPzogYm9vbGVhbixcbiAgICAgICAgICAgIHZhbHVlcz86IHN0cmluZ1tdIFxuICAgICAgICB9XG4gICAgfSA9IHtcbiAgICAgICAgXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpZHJlZlwiLFxuICAgICAgICAgICAgaGlkZGVuSURSZWZTdXBwb3J0ZWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWF0b21pY1wiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2Jvb2xlYW5cIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtYXV0b2NvbXBsZXRlXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjbm10b2tlblwiLFxuICAgICAgICAgICAgdmFsdWVzOiBbXCJpbmxpbmVcIiwgXCJsaXN0XCIsIFwiYm90aFwiLCBcIm5vbmVcIiwgXCJ1bmRlZmluZWRcIl0gLy9hZGQgdW5kZWZpbmVkIHRvIGhhbmRsZSB2YWx1ZSBlbXB0eVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtYnVzeVwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2Jvb2xlYW5cIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtY2hlY2tlZFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI25tdG9rZW5cIixcbiAgICAgICAgICAgIHZhbHVlczogW1widHJ1ZVwiLCBcImZhbHNlXCIsIFwibWl4ZWRcIiwgXCJ1bmRlZmluZWRcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWNvbGNvdW50XCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaW50XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWNvbGluZGV4XCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaW50XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWNvbHNwYW5cIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpbnRcIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtY29udHJvbHNcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpZHJlZnNcIixcbiAgICAgICAgICAgIGhpZGRlbklEUmVmU3VwcG9ydGVkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1jdXJyZW50XCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjbm10b2tlblwiLFxuICAgICAgICAgICAgdmFsdWVzOiBbXCJwYWdlXCIsIFwic3RlcFwiLCBcImxvY2F0aW9uXCIsIFwiZGF0ZVwiLCBcInRpbWVcIiwgXCJ0cnVlXCIsIFwiZmFsc2VcIiwgXCJ1bmRlZmluZWRcIl0gLy9hZGQgdW5kZWZpbmVkIGZvciBlbXB0eSB2YWx1ZVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtZGVzY3JpYmVkYnlcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpZHJlZnNcIixcbiAgICAgICAgICAgIGhpZGRlbklEUmVmU3VwcG9ydGVkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1kZXRhaWxzXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaWRyZWZzXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWRpc2FibGVkXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjYm9vbGVhblwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1kcm9wZWZmZWN0XCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjbm10b2tlbnNcIixcbiAgICAgICAgICAgIHZhbHVlczogW1wiY29weVwiLCBcIm1vdmVcIiwgXCJsaW5rXCIsIFwiZXhlY3V0ZVwiLCBcInBvcHVwXCIsIFwibm9uZVwiXVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtZXJyb3JtZXNzYWdlXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaWRyZWZcIixcbiAgICAgICAgICAgIGhpZGRlbklEUmVmU3VwcG9ydGVkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1leHBhbmRlZFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI25tdG9rZW5cIixcbiAgICAgICAgICAgIHZhbHVlczogW1widHJ1ZVwiLCBcImZhbHNlXCIsIFwidW5kZWZpbmVkXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1mbG93dG9cIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpZHJlZnNcIixcbiAgICAgICAgICAgIGhpZGRlbklEUmVmU3VwcG9ydGVkOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtZ3JhYmJlZFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI25tdG9rZW5cIixcbiAgICAgICAgICAgIHZhbHVlczogW1widHJ1ZVwiLCBcImZhbHNlXCIsIFwidW5kZWZpbmVkXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1oYXNwb3B1cFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI25tdG9rZW5cIixcbiAgICAgICAgICAgIHZhbHVlczogW1widHJ1ZVwiLCBcImZhbHNlXCIsIFwibWVudVwiLCBcImxpc3Rib3hcIiwgXCJ0cmVlXCIsIFwiZ3JpZFwiLCBcImRpYWxvZ1wiXVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtaGlkZGVuXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjbm10b2tlblwiLFxuICAgICAgICAgICAgdmFsdWVzOiBbXCJ0cnVlXCIsIFwiZmFsc2VcIiwgXCJ1bmRlZmluZWRcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWludmFsaWRcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNubXRva2VuXCIsXG4gICAgICAgICAgICB2YWx1ZXM6IFtcInRydWVcIiwgXCJmYWxzZVwiLCBcInNwZWxsaW5nXCIsIFwiZ3JhbW1hclwiLCBcInVuZGVmaW5lZFwiXSAvL2FkZCB1bmRlZmluZWQgZm9yIGVtcHR5IHZhbHVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1rZXlzaG9ydGN1dHNcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNzdHJpbmdcIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtbGFiZWxcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNzdHJpbmdcIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtbGFiZWxsZWRieVwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2lkcmVmc1wiLFxuICAgICAgICAgICAgaGlkZGVuSURSZWZTdXBwb3J0ZWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWxldmVsXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaW50XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWxpdmVcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNubXRva2VuXCIsXG4gICAgICAgICAgICB2YWx1ZXM6IFtcIm9mZlwiLCBcInBvbGl0ZVwiLCBcImFzc2VydGl2ZVwiXVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtbW9kYWxcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNib29sZWFuXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLW11bHRpbGluZVwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2Jvb2xlYW5cIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtbXVsdGlzZWxlY3RhYmxlXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjYm9vbGVhblwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1vcmllbnRhdGlvblwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI25tdG9rZW5cIixcbiAgICAgICAgICAgIHZhbHVlczogW1wiaG9yaXpvbnRhbFwiLCBcInZlcnRpY2FsXCIsIFwidW5kZWZpbmVkXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1vd25zXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaWRyZWZzXCIsXG4gICAgICAgICAgICBoaWRkZW5JRFJlZlN1cHBvcnRlZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtcGxhY2Vob2xkZXJcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNzdHJpbmdcIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtcG9zaW5zZXRcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpbnRcIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtcHJlc3NlZFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI25tdG9rZW5cIixcbiAgICAgICAgICAgIHZhbHVlczogW1widHJ1ZVwiLCBcImZhbHNlXCIsIFwibWl4ZWRcIiwgXCJ1bmRlZmluZWRcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXJlYWRvbmx5XCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjYm9vbGVhblwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1yZWxldmFudFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI25tdG9rZW5zXCIsXG4gICAgICAgICAgICB2YWx1ZXM6IFtcImFkZGl0aW9uc1wiLCBcInJlbW92YWxzXCIsIFwidGV4dFwiLCBcImFsbFwiXVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtcmVxdWlyZWRcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNib29sZWFuXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXJvbGVkZXNjcmlwdGlvblwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI3N0cmluZ1wiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1yb3djb3VudFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2ludFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1yb3dpbmRleFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2ludFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1yb3dzcGFuXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaW50XCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXNlbGVjdGVkXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjbm10b2tlblwiLFxuICAgICAgICAgICAgdmFsdWVzOiBbXCJ0cnVlXCIsIFwiZmFsc2VcIiwgXCJ1bmRlZmluZWRcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXNldHNpemVcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNpbnRcIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtc29ydFwiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI25tdG9rZW5cIixcbiAgICAgICAgICAgIHZhbHVlczogW1wiYXNjZW5kaW5nXCIsIFwiZGVzY2VuZGluZ1wiLCBcIm90aGVyXCIsIFwibm9uZVwiXVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtdmFsdWVtYXhcIjoge1xuICAgICAgICAgICAgdHlwZTogXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNkZWNpbWFsXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXZhbHVlbWluXCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjZGVjaW1hbFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS12YWx1ZW5vd1wiOiB7XG4gICAgICAgICAgICB0eXBlOiBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2RlY2ltYWxcIlxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtdmFsdWV0ZXh0XCI6IHtcbiAgICAgICAgICAgIHR5cGU6IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjc3RyaW5nXCJcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qXG4gICAgICogZGVzaWduIHBhdHRlcm5zIGZvciBjb25jcmV0ZSBXQUktQVJJQSByb2xlc1xuICAgICAqIGxlZ2l0aW1hdGUga2V5cyBmb3IgZWFjaCByb2xlIGluY2x1ZGU6XG4gICAgICpcbiAgICAgKiAtIGNvbnRhaW5lcjogYXBwcm9wcmlhdGUgY29udGFpbmVyKHMpIGZvciB0aGF0IHJvbGVcbiAgICAgKiAtIHByb3BzOiBzdGF0ZXMgYW5kIHByb3BlcnRpZXMgdGhhdCBtYXkgYmUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcm9sZSAoaW4gYWRkaXRpb24gdG8gdGhlIGdsb2JhbCBzdGF0ZXMgYW5kIHByb3BlcnRpZXMgbGlzdGVkIGFib3ZlKVxuICAgICAqIC0gcmVxUHJvcHM6IHJlcXVpcmVkIHN0YXRlcyBvciBwcm9wZXJ0aWVzIGZvciB0aGlzIHJvbGVcbiAgICAgKiAtIHJlcUNoaWxkcmVuOiByZXF1aXJlZCBjaGlsZHJlbiBmb3IgdGhpcyByb2xlXG4gICAgICogLSBodG1sRXF1aXY6IEhUTUwgZXF1aXZhbGVudCBmb3IgdGhpcyByb2xlXG4gICAgICogLSByb2xlVHlwZTogb25lIG9mIHdpZGdldCwgc3RydWN0dXJlLCBsYW5kbWFyaywgbGl2ZVJlZ2lvbiwgd2luZG93IChhcyBzZWVuIGluIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93YWktYXJpYS0xLjIvI3JvbGVzX2NhdGVnb3JpemF0aW9uKVxuICAgICAqIC0gbmFtZVJlcXVpcmVkOiBkZXRlcm1pbmVzIHdoZXRoZXIgYW4gYWNjZXNzaWJsZSBuYW1lIGlzIHJlcXVpcmVkIGZvciBhIHdpZGdldCAoc2VlIEFSSUEgc3BlYy4pXG4gICAgICogLSBuYW1lRnJvbTogZGV0ZXJtaW5lcyBob3cgYW4gYWNjZXNzaWJsZSBuYW1lIGlzIHN1cHBsaWVkIChhdXRob3Igb3IgY29udGVudCAtIHNlZSBBUklBIHNwZWMuKVxuICAgICAqIC0gZGVwcmVjYXRlZDogaWYgcHJlc2VudCwgaW5kaWNhdGVzIHRoYXQgdGhlIHJvbGUgaXMgZGVwcmVjYXRlZCwgYW5kIHByb3ZpZGVzIGEgbGlzdCBvZiBhbHRlcm5hdGl2ZSByb2xlKHMpXG4gICAgICovXG4gICAgc3RhdGljIGRlc2lnblBhdHRlcm5zIDoge1xuICAgICAgICBbcm9sZTogc3RyaW5nXToge1xuICAgICAgICAgICAgY29udGFpbmVyOiBzdHJpbmdbXSxcbiAgICAgICAgICAgIHByb3BzOiBzdHJpbmdbXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBzdHJpbmdbXSxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBzdHJpbmdbXSxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogc3RyaW5nLFxuICAgICAgICAgICAgcm9sZVR5cGU/OiBzdHJpbmcsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ/OiBib29sZWFuLFxuICAgICAgICAgICAgbmFtZUZyb20/OiBzdHJpbmdbXSxcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsQ2hpbGRyZW4/OiBib29sZWFuLFxuICAgICAgICAgICAgZGVwcmVjYXRlZD86IGJvb2xlYW4sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM/OiBzdHJpbmdbXVxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzPzogc3RyaW5nW11cbiAgICAgICAgfVxuICAgIH0gPSB7XG4gICAgICAgIFwiYWxlcnRcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGl2ZVJlZ2lvblwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiYWxlcnRkaWFsb2dcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtbW9kYWxcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2luZG93XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJhcHBsaWNhdGlvblwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIsIFwiYXJpYS1leHBhbmRlZFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIiwgLy8gb3IgY2FuIGJlIFwid2lkZ2V0XCJcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJhcnRpY2xlXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLXBvc2luc2V0XCIsIFwiYXJpYS1zZXRzaXplXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJiYW5uZXJcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiYmxvY2txdW90ZVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiYnV0dG9uXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWV4cGFuZGVkXCIsIFwiYXJpYS1wcmVzc2VkXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJidXR0b24gfCBpbnB1dFtAdHlwZT0nYnV0dG9uJ11cIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdLFxuICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxDaGlsZHJlbjogdHJ1ZSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImNhcHRpb25cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBbXCJmaWd1cmVcIiwgXCJncmlkXCIsIFwidGFibGVcIiwgXCJ0cmVlZ3JpZFwiXSxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcInByb2hpYml0ZWRcIl0sXG4gICAgICAgICAgICBwcm9oaWJpdGVkUHJvcHM6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiY2VsbFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IFtcInJvd1wiXSxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWNvbGluZGV4XCIsIFwiYXJpYS1jb2xzcGFuXCIsIFwiYXJpYS1yb3dpbmRleFwiLCBcImFyaWEtcm93c3BhblwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwidGRcIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImNoZWNrYm94XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWV4cGFuZGVkXCIsIFwiYXJpYS1yZWFkb25seVwiLCBcImFyaWEtcmVxdWlyZWRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogW1wiYXJpYS1jaGVja2VkXCJdLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwiaW5wdXRbQHR5cGU9J2NoZWNrYm94J11cIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdLFxuICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxDaGlsZHJlbjogdHJ1ZSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWhhc3BvcHVwJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJjb2RlXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcInByb2hpYml0ZWRcIl0sXG4gICAgICAgICAgICBwcm9oaWJpdGVkUHJvcHM6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiY29sdW1uaGVhZGVyXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogW1wicm93XCJdLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtY29saW5kZXhcIiwgXCJhcmlhLWNvbHNwYW5cIiwgXCJhcmlhLWV4cGFuZGVkXCIsIFwiYXJpYS1yZWFkb25seVwiLCBcImFyaWEtcmVxdWlyZWRcIiwgXCJhcmlhLXJvd2luZGV4XCIsIFwiYXJpYS1yb3dzcGFuXCIsIFwiYXJpYS1zZWxlY3RlZFwiLCBcImFyaWEtc29ydFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwidGhbQHNjb3BlPSdjb2wnXVwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl0gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJjb21ib2JveFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1jb250cm9sc1wiLCBcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiLCBcImFyaWEtYXV0b2NvbXBsZXRlXCIsIFwiYXJpYS1yZWFkb25seVwiLCBcImFyaWEtcmVxdWlyZWRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogW1wiYXJpYS1leHBhbmRlZFwiXSwgLy8gYXJpYS1jb250cm9scyBpc24ndCBhY3R1YWxseSByZXF1aXJlZCB3aGVuIGFyaWEtZXhwYW5kZWQ9XCJmYWxzZVwiXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogW10sXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJjb21wbGVtZW50YXJ5XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImNvbW1lbnRcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImNvbnRlbnRpbmZvXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImRlZmluaXRpb25cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wicHJvaGliaXRlZFwiXSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRQcm9wczogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJkZWxldGlvblwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJwcm9oaWJpdGVkXCJdLFxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImRpYWxvZ1wiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1tb2RhbFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aW5kb3dcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcbiAgICAgICAgXCJkaXJlY3RvcnlcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZDogdHJ1ZSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gIFxuICAgICAgICB9LCBcbiAgICAgICAgXCJkb2MtYWJzdHJhY3RcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWFja25vd2xlZGdtZW50c1wiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtYWZ0ZXJ3b3JkXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1hcHBlbmRpeFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtYmFja2xpbmtcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtZGlzYWJsZWRcIiwgXCJhcmlhLWV4cGFuZGVkXCIsIFwiYXJpYS1oYXNwb3B1cFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwiYSB8IGxpbmtcIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWJpYmxpb2VudHJ5XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogW1wibGlzdFwiXSxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWxldmVsXCIsIFwiYXJpYS1wb3NpbnNldFwiLCBcImFyaWEtc2V0c2l6ZVwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwibGlcIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1iaWJsaW9ncmFwaHlcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWJpYmxpb3JlZlwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1kaXNhYmxlZFwiLCBcImFyaWEtZXhwYW5kZWRcIiwgXCJhcmlhLWhhc3BvcHVwXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJhIHwgbGlua1wiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtY2hhcHRlclwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtY29sb3Bob25cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtY29uY2x1c2lvblwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtY292ZXJcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImltZ1wiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsQ2hpbGRyZW46IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtY3JlZGl0XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1jcmVkaXRzXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1kZWRpY2F0aW9uXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1lbmRub3RlXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogW1wibGlzdFwiXSxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWxldmVsXCIsIFwiYXJpYS1wb3NpbnNldFwiLCBcImFyaWEtc2V0c2l6ZVwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwibGlcIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtZW5kbm90ZXNcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtZXBpZ3JhcGhcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWVwaWxvZ3VlXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1lcnJhdGFcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWV4YW1wbGVcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWZvb3Rub3RlXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1mb3Jld29yZFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtZ2xvc3NhcnlcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLWdsb3NzcmVmXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWRpc2FibGVkXCIsIFwiYXJpYS1leHBhbmRlZFwiLCBcImFyaWEtaGFzcG9wdXBcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImEgfCBsaW5rXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1pbmRleFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtaW50cm9kdWN0aW9uXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1ub3RlcmVmXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWRpc2FibGVkXCIsIFwiYXJpYS1leHBhbmRlZFwiLCBcImFyaWEtaGFzcG9wdXBcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImEgfCBsaW5rXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1ub3RpY2VcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1wYWdlYnJlYWtcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtb3JpZW50YXRpb25cIl0sIC8vIGFyaWEtZGlzYWJsZWQsIGFyaWEtdmFsdWVtYXgsIGFyaWEtdmFsdWVtaW4sIGFyaWEtdmFsdWV0ZXh0IGFyZSB2YWxpZCBpZiBmb2N1c2FibGUuIFRoaXMgaXMgaGFuZGxlZCBpbiB0aGUgY29kZS5cbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLCAvLyBhcmlhLXZhbHVlbm93IGlzIHJlcXVpcmVkIGlmIGZvY3VzYWJsZS4gVGhpcyBpcyBoYW5kbGVkIGluIHRoZSBjb2RlLlxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIiwgLy8gb3Igd2lkZ2V0IGlmIGZvY3VzYWJsZVxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdLFxuICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxDaGlsZHJlbjogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1wYWdlbGlzdFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtcGFnZWZvb3RlclwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcInByb2hpYml0ZWRcIl0sXG4gICAgICAgICAgICBwcm9oaWJpdGVkUHJvcHM6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl0sXG4gICAgICAgIH0sXG4gICAgICAgIFwiZG9jLXBhZ2VoZWFkZXJcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGFuZG1hcmtcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJwcm9oaWJpdGVkXCJdLFxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdLFxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1wYXJ0XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1wcmVmYWNlXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1wcm9sb2d1ZVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtcHVsbHF1b3RlXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtcW5hXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvYy1zdWJ0aXRsZVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtdGlwXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJkb2MtdG9jXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcImRvY3VtZW50XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiZW1waGFzaXNcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wicHJvaGliaXRlZFwiXSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRQcm9wczogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJmZWVkXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogW1wiYXJ0aWNsZVwiXSxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJmaWd1cmVcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImZvcm1cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImZvcm1cIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJnZW5lcmljXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJkaXYgfCBzcGFuXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJwcm9oaWJpdGVkXCJdLFxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCIsIFwiYXJpYS1yb2xlZGVzY3JpcHRpb25cIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiZ3JhcGhpY3MtZG9jdW1lbnRcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXVxuICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgXCJncmFwaGljcy1vYmplY3RcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIFwiZ3JhcGhpY3Mtc3ltYm9sXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBwcmVzZW50YXRpb25hbENoaWxkcmVuOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICBcImdyaWRcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiLCBcImFyaWEtY29sY291bnRcIiwgXCJhcmlhLW11bHRpc2VsZWN0YWJsZVwiLCBcImFyaWEtcmVhZG9ubHlcIiwgXCJhcmlhLXJvd2NvdW50XCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogW1wicm93XCIsIFwicm93Z3JvdXBcIl0sIC8vIHJvd2dyb3VwIGlzIG5vdCByZXF1aXJlZCwgYnV0IGl0IGlzIGFsbG93ZWRcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJ0YWJsZVwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiZ3JpZGNlbGxcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBbXCJyb3dcIl0sXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1jb2xpbmRleFwiLCBcImFyaWEtY29sc3BhblwiLCBcImFyaWEtZGlzYWJsZWRcIiwgXCJhcmlhLWVycm9ybWVzc2FnZVwiLCBcImFyaWEtZXhwYW5kZWRcIiwgXCJhcmlhLWhhc3BvcHVwXCIsIFwiYXJpYS1pbnZhbGlkXCIsIFwiYXJpYS1yZWFkb25seVwiLCBcImFyaWEtcmVxdWlyZWRcIiwgXCJhcmlhLXJvd2luZGV4XCIsIFwiYXJpYS1yb3dzcGFuXCIsIFwiYXJpYS1zZWxlY3RlZFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwidGRcIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJncm91cFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwiaGVhZGluZ1wiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBbXCJhcmlhLWxldmVsXCJdLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwiaDEgfCBoMiB8IGgzIHwgaDQgfCBoNSB8IGg2XCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJpbWdcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImltZ1wiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxDaGlsZHJlbjogdHJ1ZSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJpbWFnZVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwiaW1nXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBwcmVzZW50YXRpb25hbENoaWxkcmVuOiB0cnVlLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImluc2VydGlvblwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJwcm9oaWJpdGVkXCJdLFxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImxpbmtcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtZXhwYW5kZWRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImEgfCBsaW5rXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcImxpc3RcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBbXCJsaXN0aXRlbVwiXSxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJvbCB8IHVsXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwibGlzdGJveFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIsIFwiYXJpYS1leHBhbmRlZFwiLCBcImFyaWEtbXVsdGlzZWxlY3RhYmxlXCIsIFwiYXJpYS1vcmllbnRhdGlvblwiLCBcImFyaWEtcmVhZG9ubHlcIiwgXCJhcmlhLXJlcXVpcmVkXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogW1wiZ3JvdXBcIiwgXCJvcHRpb25cIl0sIC8vIGdyb3VwIGlzIG5vdCByZXF1aXJlZCwgYnV0IGl0IGlzIGFsbG93ZWRcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWhhc3BvcHVwJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJsaXN0aXRlbVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IFtcImxpc3RcIl0sXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1sZXZlbFwiLCBcImFyaWEtcG9zaW5zZXRcIiwgXCJhcmlhLXNldHNpemVcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImxpXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwibG9nXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxpdmVSZWdpb25cIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwibWFpblwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJtYXJrXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJtYXJrXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJwcm9oaWJpdGVkXCJdLFxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcIm1hcnF1ZWVcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwibGl2ZVJlZ2lvblwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwibWF0aFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBwcmVzZW50YXRpb25hbENoaWxkcmVuOiBmYWxzZSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJtZW51XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIiwgXCJhcmlhLW9yaWVudGF0aW9uXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogW1wiZ3JvdXBcIiwgXCJtZW51aXRlbVwiLCBcIm1lbnVpdGVtY2hlY2tib3hcIiwgXCJtZW51aXRlbXJhZGlvXCJdLCAvLyBncm91cCBpcyBub3QgcmVxdWlyZWQsIGJ1dCBpdCBpcyBhbGxvd2VkXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJtZW51YmFyXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIiwgXCJhcmlhLW9yaWVudGF0aW9uXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogW1wiZ3JvdXBcIiwgXCJtZW51aXRlbVwiLCBcIm1lbnVpdGVtY2hlY2tib3hcIiwgXCJtZW51aXRlbXJhZGlvXCJdLCAvLyBncm91cCBpcyBub3QgcmVxdWlyZWQsIGJ1dCBpdCBpcyBhbGxvd2VkXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsIFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwibWVudWl0ZW1cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBbXCJncm91cFwiLCBcIm1lbnVcIiwgXCJtZW51YmFyXCJdLCAvLyBncm91cCBvbmx5IGNvdW50cyBhcyBhIHZhbGlkIGNvbnRhaW5lciBpZiBpdCBpcyBjb250YWluZWQgaW4gYSBtZW51IG9yIG1lbnViYXJcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWV4cGFuZGVkXCIsIFwiYXJpYS1wb3NpbnNldFwiLCBcImFyaWEtc2V0c2l6ZVwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcbiAgICAgICAgXG4gICAgICAgIFwibWVudWl0ZW1jaGVja2JveFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IFtcImdyb3VwXCIsIFwibWVudVwiLCBcIm1lbnViYXJcIl0sIC8vIGdyb3VwIG9ubHkgY291bnRzIGFzIGEgdmFsaWQgY29udGFpbmVyIGlmIGl0IGlzIGNvbnRhaW5lZCBpbiBhIG1lbnUgb3IgbWVudWJhclxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtZXhwYW5kZWRcIiwgXCJhcmlhLXBvc2luc2V0XCIsIFwiYXJpYS1zZXRzaXplXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IFtcImFyaWEtY2hlY2tlZFwiXSxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl0sXG4gICAgICAgICAgICBwcmVzZW50YXRpb25hbENoaWxkcmVuOiB0cnVlLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwibWVudWl0ZW1yYWRpb1wiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IFtcImdyb3VwXCIsIFwibWVudVwiLCBcIm1lbnViYXJcIl0sIC8vIGdyb3VwIG9ubHkgY291bnRzIGFzIGEgdmFsaWQgY29udGFpbmVyIGlmIGl0IGlzIGNvbnRhaW5lZCBpbiBhIG1lbnUgb3IgbWVudWJhclxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtZXhwYW5kZWRcIiwgXCJhcmlhLXBvc2luc2V0XCIsIFwiYXJpYS1zZXRzaXplXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IFtcImFyaWEtY2hlY2tlZFwiXSxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl0sXG4gICAgICAgICAgICBwcmVzZW50YXRpb25hbENoaWxkcmVuOiB0cnVlLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwibWV0ZXJcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtdmFsdWVtYXhcIiwgXCJhcmlhLXZhbHVlbWluXCIsIFwiYXJpYS12YWx1ZXRleHRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogW1wiYXJpYS12YWx1ZW5vd1wiXSxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxDaGlsZHJlbjogdHJ1ZSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJuYXZpZ2F0aW9uXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcIm5vbmVcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcInByb2hpYml0ZWRcIl0sXG4gICAgICAgICAgICBwcm9oaWJpdGVkUHJvcHM6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwibm90ZVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1kaXNhYmxlZCcsICdhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwib3B0aW9uXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogW1wiZ3JvdXBcIiwgXCJsaXN0Ym94XCJdLCAvLyBncm91cCBvbmx5IGNvdW50cyBhcyBhIHZhbGlkIGNvbnRhaW5lciBpZiBpdCBpcyBjb250YWluZWQgaW4gYSBsaXN0Ym94XG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1zZWxlY3RlZFwiLCBcImFyaWEtY2hlY2tlZFwiLCBcImFyaWEtcG9zaW5zZXRcIiwgXCJhcmlhLXNldHNpemVcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCwgLy8gXCJhcmlhLXNlbGVjdGVkXCIgaGFzIGEgZGVmYXVsdFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IFwib3B0aW9uXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXSxcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsQ2hpbGRyZW46IHRydWUsXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInBhcmFncmFwaFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJwcm9oaWJpdGVkXCJdLFxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInByZXNlbnRhdGlvblwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW10sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wicHJvaGliaXRlZFwiXSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRQcm9wczogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJwcm9ncmVzc2JhclwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS12YWx1ZW1heFwiLCBcImFyaWEtdmFsdWVtaW5cIiwgXCJhcmlhLXZhbHVlbm93XCIsIFwiYXJpYS12YWx1ZXRleHRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxDaGlsZHJlbjogdHJ1ZSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJyYWRpb1wiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1wb3NpbnNldFwiLCBcImFyaWEtc2V0c2l6ZVwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBbXCJhcmlhLWNoZWNrZWRcIl0sXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJpbnB1dFtAdHlwZT0ncmFkaW8nXVwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl0sXG4gICAgICAgICAgICBwcmVzZW50YXRpb25hbENoaWxkcmVuOiB0cnVlLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJyYWRpb2dyb3VwXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIiwgXCJhcmlhLW9yaWVudGF0aW9uXCIsIFwiYXJpYS1yZWFkb25seVwiLCBcImFyaWEtcmVxdWlyZWRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBbXCJyYWRpb1wiXSxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl0sXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1oYXNwb3B1cCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwicmVnaW9uXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcImxhbmRtYXJrXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInJvd1wiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IFtcImdyaWRcIiwgXCJyb3dncm91cFwiLCBcInRhYmxlXCIsIFwidHJlZWdyaWRcIl0sXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIsIFwiYXJpYS1jb2xpbmRleFwiLCBcImFyaWEtZXhwYW5kZWRcIiwgXCJhcmlhLWxldmVsXCIsIFwiYXJpYS1wb3NpbnNldFwiLCBcImFyaWEtcm93aW5kZXhcIiwgXCJhcmlhLXNlbGVjdGVkXCIsIFwiYXJpYS1zZXRzaXplXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogW1wiY2VsbFwiLCBcImNvbHVtbmhlYWRlclwiLCBcImdyaWRjZWxsXCIsIFwicm93aGVhZGVyXCJdLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcInRyXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwicm93Z3JvdXBcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBbXCJncmlkXCIsIFwidGFibGVcIiwgXCJ0cmVlZ3JpZFwiXSxcbiAgICAgICAgICAgIHByb3BzOiBbXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IFtcInJvd1wiXSxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJ0Ym9keSB8IHRmb290IHwgdGhlYWRcIixcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJyb3doZWFkZXJcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBbXCJyb3dcIl0sXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1jb2xpbmRleFwiLCBcImFyaWEtY29sc3BhblwiLCBcImFyaWEtZXhwYW5kZWRcIiwgXCJhcmlhLXJlYWRvbmx5XCIsIFwiYXJpYS1yZXF1aXJlZFwiLCBcImFyaWEtcm93aW5kZXhcIiwgXCJhcmlhLXJvd3NwYW5cIiwgXCJhcmlhLXNlbGVjdGVkXCIsIFwiYXJpYS1zb3J0XCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJ0aFtAc2NvcGU9J3JvdyddXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXVxuICAgICAgICB9LFxuXG4gICAgICAgIFwic2Nyb2xsYmFyXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLW9yaWVudGF0aW9uXCIsIFwiYXJpYS12YWx1ZW1heFwiLCBcImFyaWEtdmFsdWVtaW5cIiwgXCJhcmlhLXZhbHVldGV4dFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBbXCJhcmlhLWNvbnRyb2xzXCIsIFwiYXJpYS12YWx1ZW5vd1wiXSxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsQ2hpbGRyZW46IHRydWUsXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInNlYXJjaFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsYW5kbWFya1wiLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJzZWFyY2hib3hcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiLCBcImFyaWEtYXV0b2NvbXBsZXRlXCIsIFwiYXJpYS1tdWx0aWxpbmVcIiwgXCJhcmlhLXBsYWNlaG9sZGVyXCIsIFwiYXJpYS1yZWFkb25seVwiLCBcImFyaWEtcmVxdWlyZWRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImlucHV0W0B0eXBlPSdzZWFyY2gnXVwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJzZXBhcmF0b3JcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtb3JpZW50YXRpb25cIl0sIC8vIGFyaWEtZGlzYWJsZWQsIGFyaWEtdmFsdWVtYXgsIGFyaWEtdmFsdWVtaW4sIGFyaWEtdmFsdWV0ZXh0IGFyZSB2YWxpZCBpZiBmb2N1c2FibGUuIFRoaXMgaXMgaGFuZGxlZCBpbiB0aGUgY29kZS5cbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLCAvLyBhcmlhLXZhbHVlbm93IGlzIHJlcXVpcmVkIGlmIGZvY3VzYWJsZS4gVGhpcyBpcyBoYW5kbGVkIGluIHRoZSBjb2RlLlxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIiwgLy8gb3Igd2lkZ2V0IGlmIGZvY3VzYWJsZVxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsQ2hpbGRyZW46IHRydWUsXG4gICAgICAgICAgICBkZXByZWNhdGVkUHJvcHM6IFsnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInNsaWRlclwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1vcmllbnRhdGlvblwiLCBcImFyaWEtcmVhZG9ubHlcIiwgXCJhcmlhLXZhbHVlbWF4XCIsIFwiYXJpYS12YWx1ZW1pblwiLCBcImFyaWEtdmFsdWV0ZXh0XCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IFtcImFyaWEtdmFsdWVub3dcIl0sXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsQ2hpbGRyZW46IHRydWVcbiAgICAgICAgfSxcblxuICAgICAgICBcInNwaW5idXR0b25cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiLCBcImFyaWEtcmVhZG9ubHlcIiwgXCJhcmlhLXJlcXVpcmVkXCIsIFwiYXJpYS12YWx1ZW1heFwiLCBcImFyaWEtdmFsdWVtaW5cIiwgXCJhcmlhLXZhbHVlbm93XCIsIFwiYXJpYS12YWx1ZXRleHRcIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtaGFzcG9wdXAnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInN0YXR1c1wiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsaXZlUmVnaW9uXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInN0cm9uZ1wiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJwcm9oaWJpdGVkXCJdLFxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInN1YnNjcmlwdFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJwcm9oaWJpdGVkXCJdLFxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInN1Z2dlc3Rpb25cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wicHJvaGliaXRlZFwiXSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRQcm9wczogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJzdXBlcnNjcmlwdFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJzdHJ1Y3R1cmVcIixcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJwcm9oaWJpdGVkXCJdLFxuICAgICAgICAgICAgcHJvaGliaXRlZFByb3BzOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInN3aXRjaFwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1leHBhbmRlZFwiLCBcImFyaWEtcmVhZG9ubHlcIiwgXCJhcmlhLXJlcXVpcmVkXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IFtcImFyaWEtY2hlY2tlZFwiXSxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCIsIFwiY29udGVudHNcIl0sXG4gICAgICAgICAgICBwcmVzZW50YXRpb25hbENoaWxkcmVuOiB0cnVlLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtaGFzcG9wdXAnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInRhYlwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IFtcInRhYmxpc3RcIl0sXG4gICAgICAgICAgICBwcm9wczogW1wiYXJpYS1leHBhbmRlZFwiLCBcImFyaWEtcG9zaW5zZXRcIiwgXCJhcmlhLXNlbGVjdGVkXCIsIFwiYXJpYS1zZXRzaXplXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdLFxuICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxDaGlsZHJlbjogdHJ1ZSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInRhYmxlXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWNvbGNvdW50XCIsIFwiYXJpYS1yb3djb3VudFwiXSxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IFtcInJvd1wiLCBcInJvd2dyb3VwXCIsIFwiY2FwdGlvblwiXSwgLy8gcm93Z3JvdXAgYW5kIGNhcHRpb24gYXJlIG5vdCByZXF1aXJlZCwgYnV0IGl0IGlzIGFsbG93ZWRcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJ0YWJsZVwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJ0YWJsaXN0XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIiwgXCJhcmlhLW11bHRpc2VsZWN0YWJsZVwiLCBcImFyaWEtb3JpZW50YXRpb25cIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBbXCJ0YWJcIl0sXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogZmFsc2UsIFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWVycm9ybWVzc2FnZScsICdhcmlhLWhhc3BvcHVwJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuXG4gICAgICAgIFwidGFicGFuZWxcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInRlcm1cIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBcImRmblwiLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wicHJvaGliaXRlZFwiXSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRQcm9wczogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJ0ZXh0Ym94XCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIiwgXCJhcmlhLWF1dG9jb21wbGV0ZVwiLCBcImFyaWEtbXVsdGlsaW5lXCIsIFwiYXJpYS1wbGFjZWhvbGRlclwiLCBcImFyaWEtcmVhZG9ubHlcIiwgXCJhcmlhLXJlcXVpcmVkXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogXCJpbnB1dFtAdHlwZT0ndGV4dCddXCIsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJ3aWRnZXRcIixcbiAgICAgICAgICAgIG5hbWVSZXF1aXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIl1cbiAgICAgICAgfSxcblxuICAgICAgICBcInRpbWVcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wicHJvaGliaXRlZFwiXSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRQcm9wczogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJ0aW1lclwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IG51bGwsXG4gICAgICAgICAgICBwcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcVByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxQ2hpbGRyZW46IG51bGwsXG4gICAgICAgICAgICBodG1sRXF1aXY6IG51bGwsXG4gICAgICAgICAgICByb2xlVHlwZTogXCJsaXZlUmVnaW9uXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZGlzYWJsZWQnLCAnYXJpYS1lcnJvcm1lc3NhZ2UnLCAnYXJpYS1oYXNwb3B1cCcsICdhcmlhLWludmFsaWQnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInRvb2xiYXJcIjoge1xuICAgICAgICAgICAgY29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgcHJvcHM6IFtcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiLCBcImFyaWEtb3JpZW50YXRpb25cIl0sXG4gICAgICAgICAgICByZXFQcm9wczogbnVsbCxcbiAgICAgICAgICAgIHJlcUNoaWxkcmVuOiBudWxsLFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwic3RydWN0dXJlXCIsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJ0b29sdGlwXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBudWxsLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcInN0cnVjdHVyZVwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiBmYWxzZSwgLy8gQVJJQSAxLjIgaGFzIHRoaXMgYXMgbmFtZVJlcXVpcmVkOiB0cnVlLCBidXQgQVJJQSAxLjMgcmVtb3ZlZCBpdCBiZWNhdXNlIGl0IG1ha2VzIG5vIHNlbnNlIHRvIHJlcXVpcmUgYSBuYW1lIG9uIGEgdG9vbHRpcC5cbiAgICAgICAgICAgIG5hbWVGcm9tOiBbXCJhdXRob3JcIiwgXCJjb250ZW50c1wiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWRpc2FibGVkJywgJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaGFzcG9wdXAnLCAnYXJpYS1pbnZhbGlkJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJ0cmVlXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIiwgXCJhcmlhLW11bHRpc2VsZWN0YWJsZVwiLCBcImFyaWEtb3JpZW50YXRpb25cIiwgXCJhcmlhLXJlcXVpcmVkXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogW1wiZ3JvdXBcIiwgXCJ0cmVlaXRlbVwiXSwgLy8gZ3JvdXAgaXMgbm90IHJlcXVpcmVkLCBidXQgaXQgaXMgYWxsb3dlZFxuICAgICAgICAgICAgaHRtbEVxdWl2OiBudWxsLFxuICAgICAgICAgICAgcm9sZVR5cGU6IFwid2lkZ2V0XCIsXG4gICAgICAgICAgICBuYW1lUmVxdWlyZWQ6IHRydWUsXG4gICAgICAgICAgICBuYW1lRnJvbTogW1wiYXV0aG9yXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtaGFzcG9wdXAnXSBcbiAgICAgICAgfSxcblxuICAgICAgICBcInRyZWVncmlkXCI6IHtcbiAgICAgICAgICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIiwgXCJhcmlhLWNvbGNvdW50XCIsIFwiYXJpYS1tdWx0aXNlbGVjdGFibGVcIiwgXCJhcmlhLW9yaWVudGF0aW9uXCIsIFwiYXJpYS1yZWFkb25seVwiLCBcImFyaWEtcmVxdWlyZWRcIiwgXCJhcmlhLXJvd2NvdW50XCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogW1wicm93XCIsIFwicm93Z3JvdXBcIl0sIC8vIHJvd2dyb3VwIGlzIG5vdCByZXF1aXJlZCwgYnV0IGl0IGlzIGFsbG93ZWRcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiXSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWRQcm9wczogWydhcmlhLWhhc3BvcHVwJ10gXG4gICAgICAgIH0sXG5cbiAgICAgICAgXCJ0cmVlaXRlbVwiOiB7XG4gICAgICAgICAgICBjb250YWluZXI6IFtcImdyb3VwXCIsIFwidHJlZVwiXSxcbiAgICAgICAgICAgIHByb3BzOiBbXCJhcmlhLWNoZWNrZWRcIiwgXCJhcmlhLWV4cGFuZGVkXCIsIFwiYXJpYS1sZXZlbFwiLCBcImFyaWEtcG9zaW5zZXRcIiwgXCJhcmlhLXNlbGVjdGVkXCIsIFwiYXJpYS1zZXRzaXplXCJdLFxuICAgICAgICAgICAgcmVxUHJvcHM6IG51bGwsXG4gICAgICAgICAgICByZXFDaGlsZHJlbjogbnVsbCxcbiAgICAgICAgICAgIGh0bWxFcXVpdjogbnVsbCxcbiAgICAgICAgICAgIHJvbGVUeXBlOiBcIndpZGdldFwiLFxuICAgICAgICAgICAgbmFtZVJlcXVpcmVkOiB0cnVlLFxuICAgICAgICAgICAgbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdLFxuICAgICAgICAgICAgZGVwcmVjYXRlZFByb3BzOiBbJ2FyaWEtZXJyb3JtZXNzYWdlJywgJ2FyaWEtaW52YWxpZCddIFxuICAgICAgICB9LFxuICAgIH0gLy8gZW5kIGRlc2lnblBhdHRlcm5zXG5cbiAgICAvLyBjb3BpZWQgZnJvbSBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zZW1hbnRpY3Mtb3RoZXIuaHRtbCNkaXNhYmxlZC1lbGVtZW50c1xuICAgIC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2lucHV0Lmh0bWwjaW5wdXQtdHlwZS1hdHRyLXN1bW1hcnlcbiAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML0F0dHJpYnV0ZXMvZGlzYWJsZWRcbiAgICAvKiogbm90ZTpcbiAgICAgICogaWYgYSA8ZmllbGRzZXQ+IGlzIGRpc2FibGVkLCB0aGUgZGVzY2VuZGFudCBmb3JtIGNvbnRyb2xzIGFyZSBhbGwgZGlzYWJsZWQgZXhjZXB0IDxsZWdlbmQ+XG4gICAgICAqIElmIGFuIDxvcHRncm91cD4gaXMgZGlzYWJsZWQsIHRoZSBzZWxlY3QgaXMgc3RpbGwgaW50ZXJhY3RpdmUgKHVubGVzcyBvdGhlcndpc2UgZGlzYWJsZWQpLCBidXQgbm9uZSBvZiB0aGUgaXRlbXMgaW4gdGhlIG9wdGlvbiBncm91cCBhcmUgc2VsZWN0YWJsZS5cbiAgICAgICogV2hlbiBhbiBlbGVtZW50IGhhcyB0aGUgZGlzYWJsZWQgYXR0cmlidXRlIGFwcGxpZWQsIHRoZSA6ZGlzYWJsZWQgcHNldWRvLWNsYXNzIGFsc28gYXBwbGllcyB0byBpdC4gXG4gICAgICovXG4gICAgc3RhdGljIGVsZW1lbnRzQWxsb3dlZERpc2FibGVkID0gW1wiYnV0dG9uXCIsIFwiaW5wdXRcIiwgXCJzZWxlY3RcIiwgXCJ0ZXh0YXJlYVwiLCBcIm9wdGdyb3VwXCIsIFwib3B0aW9uXCIsIFwiZmllbGRzZXRcIl07IC8vIGFsc28gZm9ybS1hc3NvY2lhdGVkIGN1c3RvbSBlbGVtZW50XG4gICAgc3RhdGljIGVsZW1lbnRzQWxsb3dlZFJlcXVpcmVkID0gW1wic2VsZWN0XCIsIFwidGV4dGFyZWFcIl07IC8vIHJlbW92ZSAnaW5wdXQnIGFuZCBhZGQgdG8gdGhlIGluZGl2aWR1YWwgZWxlbWVudCwgYmVjdWFzZSByZXF1aXJlZCBpcyBub3Qgc3VwcG9ydGVkIG9uIGlucHV0QHR5cGU9XCJyYW5nZVwiLCBcImNvbG9yXCIsIFwiaGlkZGVuXCIgb3IgYW55IGJ1dHRvbiB0eXBlc1xuICAgIHN0YXRpYyBlbGVtZW50c0FsbG93ZWRSZWFkT25seSA9IFtcInRleHRhcmVhXCJdOyAvLyByZW1vdmUgJ2lucHV0JyBhbmQgYWRkIHRvIHRoZSBpbmRpdmlkdWFsIGVsZW1lbnQsIGJlY2F1c2UgcmVhZG9ubHkgaXMgbm90IHN1cHBvcnRlZCBvbiBpbnB1dEB0eXBlPVwiY2hlY2tib3hcIiwgXCJyYWRpb1wiLCBcInJhbmdlXCIsIFwiY29sb3JcIiwgXCJmaWxlXCIsIGhpZGRlblwiIG9yIGFueSBidXR0b24gdHlwZXNcblxuXG4gICAgLyogaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWwtYXJpYS8jZG9jY29uZm9ybWFuY2VcbiAgICAgICAgKiBkb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnQgY29udGFpbnMgcHJvcGVydGllcyBvZiB0aGUgdGFncyByZWxhdGVkIHRvIHJvbGUgd2l0aG91dCBhbnkgYWRkaXRpb25hbCBhdHRyaWJ1dGUgdmFsdWVcbiAgICAgICAgKiBkb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnRTcGVjaWFsVGFncyBjb250YWlucyB0aG9zZSB0YWdzIHRoYXQgcmVxdWlyZSBzcGVjaWFsIGNvbnNpZGVyYXRpb25zXG4gICAgICAgICovXG4gICAgc3RhdGljIGRvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudDoge1xuICAgICAgICBbcm9sZTogc3RyaW5nXTogSURvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudFxuICAgIH0gPSB7XG4gICAgICAgIFwiYWJiclwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgcHJvaGliaXRlZEFyaWFBdHRyaWJ1dGVzV2hlbk5vSW1wbGljaXRSb2xlOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwiYWRkcmVzc1wiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdyb3VwXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImFydGljbGVcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJhcnRpY2xlXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYXBwbGljYXRpb25cIiwgXCJkb2N1bWVudFwiLCBcImZlZWRcIiwgXCJtYWluXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiLCBcInJlZ2lvblwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJhc2lkZVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImNvbXBsZW1lbnRhcnlcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJkb2MtZGVkaWNhdGlvblwiLCBcImRvYy1leGFtcGxlXCIsIFwiZG9jLWZvb3Rub3RlXCIsIFwiZG9jLWdsb3NzYXJ5XCIsIFwiZG9jLXB1bGxxdW90ZVwiLCBcImRvYy10aXBcIiwgXCJmZWVkXCIsIFwibm9uZVwiLCBcIm5vdGVcIiwgXCJwcmVzZW50YXRpb25cIiwgXCJyZWdpb25cIiwgXCJzZWFyY2hcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYXVkaW9cIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYXBwbGljYXRpb25cIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYlwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdlbmVyaWNcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYmFzZVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgXCJiZGlcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImJkb1wiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdlbmVyaWNcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYmxvY2txdW90ZVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImJsb2NrcXVvdGVcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiYm9keVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdlbmVyaWNcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgb3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFsnYXJpYS1oaWRkZW4nXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJiclwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2UsXG4gICAgICAgICAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1oaWRkZW5cIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJidXR0b25cIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJidXR0b25cIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJjaGVja2JveFwiLCBcImNvbWJvYm94XCIsIFwiZ3JpZGNlbGxcIiwgXCJsaW5rXCIsIFwibWVudWl0ZW1cIiwgXCJtZW51aXRlbWNoZWNrYm94XCIsIFwibWVudWl0ZW1yYWRpb1wiLCBcIm9wdGlvblwiLCBcInJhZGlvXCIsXCJzZXBhcmF0b3JcIiwgXCJzbGlkZXJcIiwgXCJzd2l0Y2hcIiwgXCJ0YWJcIiwgXCJ0cmVlaXRlbVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJjYW52YXNcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImNhcHRpb25cIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbJ2NhcHRpb24nXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgYWxsb3dBdHRyaWJ1dGVzRnJvbUltcGxpY2l0Um9sZTogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgXCJjaXRlXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICBwcm9oaWJpdGVkQXJpYUF0dHJpYnV0ZXNXaGVuTm9JbXBsaWNpdFJvbGU6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJjb2RlXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiY29kZVwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJjb2xcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwiY29sZ3JvdXBcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwiZGF0YVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdlbmVyaWNcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiZGF0YWxpc3RcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJsaXN0Ym94XCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlLFxuICAgICAgICAgICAgYWxsb3dBdHRyaWJ1dGVzRnJvbUltcGxpY2l0Um9sZTogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgXCJkZFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImRlbFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImRlbGV0aW9uXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImRldGFpbHNcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJncm91cFwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiZGZuXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1widGVybVwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJkaWFsb2dcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJkaWFsb2dcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbGVydGRpYWxvZ1wiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICBcImRsXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImdyb3VwXCIsIFwibGlzdFwiLCBcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiZHRcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJ0ZXJtXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wibGlzdGl0ZW1cIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiZW1cIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImVtYmVkXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFwcGxpY2F0aW9uXCIsIFwiZG9jdW1lbnRcIiwgXCJpbWdcIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImZpZWxkc2V0XCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ3JvdXBcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCIsIFwicmFkaW9ncm91cFwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJmaWdjYXB0aW9uXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImdyb3VwXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICBwcm9oaWJpdGVkQXJpYUF0dHJpYnV0ZXNXaGVuTm9JbXBsaWNpdFJvbGU6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJmb3JtXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZm9ybVwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIiwgXCJzZWFyY2hcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiaGVhZFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgXCJoZ3JvdXBcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJncm91cFwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJoMVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImhlYWRpbmdcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJkb2Mtc3VidGl0bGVcIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCIsIFwidGFiXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImgyXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiaGVhZGluZ1wiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImRvYy1zdWJ0aXRsZVwiLCBcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIiwgXCJ0YWJcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiaDNcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJoZWFkaW5nXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiZG9jLXN1YnRpdGxlXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiLCBcInRhYlwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJoNFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImhlYWRpbmdcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJkb2Mtc3VidGl0bGVcIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCIsIFwidGFiXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImg1XCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiaGVhZGluZ1wiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImRvYy1zdWJ0aXRsZVwiLCBcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIiwgXCJ0YWJcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiaDZcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJoZWFkaW5nXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiZG9jLXN1YnRpdGxlXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiLCBcInRhYlwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJoclwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInNlcGFyYXRvclwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImRvYy1wYWdlYnJlYWtcIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImh0bWxcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJkb2N1bWVudFwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZSxcbiAgICAgICAgICAgIGFsbG93QXR0cmlidXRlc0Zyb21JbXBsaWNpdFJvbGU6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwiaVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdlbmVyaWNcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwiaWZyYW1lXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFwcGxpY2F0aW9uXCIsIFwiZG9jdW1lbnRcIiwgXCJpbWdcIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcImluc1wiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImluc2VydGlvblwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJrYmRcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRBcmlhQXR0cmlidXRlc1doZW5Ob0ltcGxpY2l0Um9sZTogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXVxuICAgICAgICB9LFxuICAgICAgICBcImxhYmVsXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgcHJvaGliaXRlZEFyaWFBdHRyaWJ1dGVzV2hlbk5vSW1wbGljaXRSb2xlOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwibGVnZW5kXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgcHJvaGliaXRlZEFyaWFBdHRyaWJ1dGVzV2hlbk5vSW1wbGljaXRSb2xlOiBbXCJhcmlhLWxhYmVsXCIsIFwiYXJpYS1sYWJlbGxlZGJ5XCJdXG4gICAgICAgIH0sXG4gICAgICAgIFwibGlua1wiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgXCJtYWluXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wibWFpblwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwibWFwXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcIm1hcmtcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRBcmlhQXR0cmlidXRlc1doZW5Ob0ltcGxpY2l0Um9sZTogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXVxuICAgICAgICB9LFxuICAgICAgICBcIm1hdGhcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJtYXRoXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJtZW51XCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wibGlzdFwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImdyb3VwXCIsIFwibGlzdGJveFwiLCBcIm1lbnVcIiwgXCJtZW51YmFyXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiLCBcInJhZGlvZ3JvdXBcIiwgXCJ0YWJsaXN0XCIsIFwidG9vbGJhclwiLCBcInRyZWVcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwibWV0YVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgXCJtZXRlclwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcIm1ldGVyXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICBvdGhlckRpc2FsbG93ZWRBcmlhQXR0cmlidXRlczogWydhcmlhLXZhbHVlbWF4JywgJ2FyaWEtdmFsdWVtaW4nXSxcbiAgICAgICAgICAgIGFsbG93QXR0cmlidXRlc0Zyb21JbXBsaWNpdFJvbGU6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwibmF2XCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wibmF2aWdhdGlvblwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImRvYy1pbmRleFwiLCBcImRvYy1wYWdlbGlzdFwiLCBcImRvYy10b2NcIiwgXCJtZW51XCIsIFwibWVudWJhclwiLCBcInRhYmxpc3RcIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcIm5vc2NyaXB0XCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcIm9iamVjdFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhcHBsaWNhdGlvblwiLCBcImRvY3VtZW50XCIsIFwiaW1nXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcIm9sXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wibGlzdFwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImdyb3VwXCIsIFwibGlzdGJveFwiLCBcIm1lbnVcIiwgXCJtZW51YmFyXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiLCBcInJhZGlvZ3JvdXBcIiwgXCJ0YWJsaXN0XCIsIFwidG9vbGJhclwiLCBcInRyZWVcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwib3B0Z3JvdXBcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJncm91cFwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwib3B0aW9uXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wib3B0aW9uXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICBvdGhlckRpc2FsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1zZWxlY3RlZFwiXVxuICAgICAgICB9LFxuICAgICAgICBcIm91dHB1dFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInN0YXR1c1wiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJwXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wicGFyYWdyYXBoXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInBhcmFtXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcInBpY3R1cmVcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlLFxuICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtaGlkZGVuXCJdIFxuICAgICAgICB9LFxuICAgICAgICBcInByZVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdlbmVyaWNcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwicHJvZ3Jlc3NcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJwcm9ncmVzc2JhclwiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgb3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtdmFsdWVtYXhcIl0gXG4gICAgICAgIH0sXG4gICAgICAgIFwicVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdlbmVyaWNcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwicnBcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInJ0XCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICBwcm9oaWJpdGVkQXJpYUF0dHJpYnV0ZXNXaGVuTm9JbXBsaWNpdFJvbGU6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJydWJ5XCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJzXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZGVsZXRpb25cIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgb3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtbGFiZWxcIiwgXCJhcmlhLWxhYmVsbGVkYnlcIl1cbiAgICAgICAgfSxcbiAgICAgICAgXCJzYW1wXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ2VuZXJpY1wiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJzY3JpcHRcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwic2VhcmNoXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogWydzZWFyY2gnXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFsnc2VhcmNoJywgJ2Zvcm0nLCAnZ3JvdXAnLCAnbm9uZScsICdwcmVzZW50YXRpb24nLCAncmVnaW9uJ10sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwic2xvdFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgXCJzbWFsbFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdlbmVyaWNcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwic291cmNlXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZVxuICAgICAgICB9LFxuICAgICAgICBcInNwYW5cIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInN0cm9uZ1wiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInN0cm9uZ1wiXSxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJzdHlsZVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgXCJzdWJcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJzdWJzY3JpcHRcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwic3VwXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wic3VwZXJzY3JpcHRcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwic3ZnXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ3JhcGhpY3MtZG9jdW1lbnRcIl0sIC8vIGFzIGRlZmluZWQgYnkgU1ZHIEFBTVxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInRhYmxlXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1widGFibGVcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwidGVtcGxhdGVcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwidGV4dGFyZWFcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJ0ZXh0Ym94XCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJ0Zm9vdFwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInJvd2dyb3VwXCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcInRoZWFkXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wicm93Z3JvdXBcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwidGltZVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInRpbWVcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwidGl0bGVcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwidHJhY2tcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IGZhbHNlXG4gICAgICAgIH0sXG4gICAgICAgIFwidVwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdlbmVyaWNcIl0sXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgIH0sXG4gICAgICAgIFwidWxcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJsaXN0XCJdLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiZ3JvdXBcIiwgXCJsaXN0Ym94XCIsIFwibWVudVwiLCBcIm1lbnViYXJcIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCIsIFwicmFkaW9ncm91cFwiLCBcInRhYmxpc3RcIiwgXCJ0b29sYmFyXCIsIFwidHJlZVwiXSxcbiAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgfSxcbiAgICAgICAgXCJ2YXJcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgIHByb2hpYml0ZWRBcmlhQXR0cmlidXRlc1doZW5Ob0ltcGxpY2l0Um9sZTogW1wiYXJpYS1sYWJlbFwiLCBcImFyaWEtbGFiZWxsZWRieVwiXVxuICAgICAgICB9LFxuICAgICAgICBcInZpZGVvXCI6IHtcbiAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFwcGxpY2F0aW9uXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9LFxuICAgICAgICBcIndiclwiOiB7XG4gICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2UsXG4gICAgICAgICAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1oaWRkZW5cIl1cbiAgICAgICAgfVxuICAgIH0gLy8gZW5kIGRvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudFxuXG4gICAgc3RhdGljIGRvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudFNwZWNpYWxUYWdzOiB7XG4gICAgICAgIFtyb2xlOiBzdHJpbmddOiB7XG4gICAgICAgICAgICBba2V5OiBzdHJpbmddIDogSURvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudFxuICAgICAgICB9IHwgSURvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudFxuICAgIH0gPSB7XG4gICAgICAgIFwiYVwiOiB7XG4gICAgICAgICAgICBcIndpdGgtaHJlZlwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJsaW5rXCJdLFxuICAgICAgICAgICAgICAgIC8vcm9sZUNvbmRpdGlvbjogXCIgd2hlbiBub24tZW1wdHkgaHJlZiBhdHRyaWJ1dGUgaXMgcHJlc2VudFwiLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImJ1dHRvblwiLCBcImNoZWNrYm94XCIsIFwiZG9jLWJhY2tsaW5rXCIsIFwiZG9jLWJpYmxpb3JlZlwiLCBcImRvYy1nbG9zc3JlZlwiLCBcImRvYy1ub3RlcmVmXCIsIFwibWVudWl0ZW1cIiwgXCJtZW51aXRlbWNoZWNrYm94XCIsIFwibWVudWl0ZW1yYWRpb1wiLCBcIm9wdGlvblwiLCBcInJhZGlvXCIsIFwic3dpdGNoXCIsIFwidGFiXCIsIFwidHJlZWl0ZW1cIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvdGhlckRpc2FsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1kaXNhYmxlZD10cnVlXCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJ3aXRob3V0LWhyZWZcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ2VuZXJpY1wiXSxcbiAgICAgICAgICAgICAgICAvL3JvbGVDb25kaXRpb246IFwiIHdoZW4gaHJlZiBhdHRyaWJ1dGUgaXMgbm90IHByZXNlbnRcIixcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJhbnlcIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcImFyZWFcIjoge1xuICAgICAgICAgICAgXCJ3aXRoLWhyZWZcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wibGlua1wiXSxcbiAgICAgICAgICAgICAgICAvL3JvbGVDb25kaXRpb246IFwiIHdoZW4gbm9uLWVtcHR5IGhyZWYgYXR0cmlidXRlIGlzIHByZXNlbnRcIixcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIndpdGhvdXQtaHJlZlwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgICAgIC8vcm9sZUNvbmRpdGlvbjogXCIgd2hlbiBocmVmIGF0dHJpYnV0ZSBpcyBub3QgcHJlc2VudFwiLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImJ1dHRvblwiLCBcImxpbmtcIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuLy8gVE9ET1xuLy8gICAgICAgIFwiYXV0b25vbW91cyBjdXN0b20gZWxlbWVudFwiOiB7XG4vLyAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiUm9sZSBleHBvc2VkIGZyb20gYXV0aG9yIGRlZmluZWQgRWxlbWVudEludGVybmFscy4gT3RoZXJ3aXNlIG5vIGNvcnJlc3BvbmRpbmcgcm9sZS5cIl0sXG4vLyAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcIklmIHJvbGUgZGVmaW5lZCBieSBFbGVtZW50SW50ZXJuYWxzXCIsIFwiYW55IHJvbGVcIiwgXCJubyByb2xlIE90aGVyd2lzZVwiXSxcbi8vICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuLy8gICAgICAgIH0sXG4gICAgICAgIFwiZGl2XCI6IHtcbiAgICAgICAgICAgIFwiY2hpbGQtZGxcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiZ2VuZXJpY1wiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJwcmVzZW50YXRpb25cIiwgXCJub25lXCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm5vLWNoaWxkLWRsXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdlbmVyaWNcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJmaWd1cmVcIjoge1xuICAgICAgICAgICAgXCJjaGlsZC1maWdjYXB0aW9uXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImZpZ3VyZVwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbJ2RvYy1leGFtcGxlJ10sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwibm8tY2hpbGQtZmlnY2FwdGlvblwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJmaWd1cmVcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJmb290ZXJcIjoge1xuICAgICAgICAgICAgXCJkZXMtc2VjdGlvbi1hcnRpY2xlLWFzaWRlLW1haW4tbmF2XCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdlbmVyaWNcIl0sXG4gICAgICAgICAgICAgICAgLy9yb2xlQ29uZGl0aW9uOiBcIiB3aGVuIGRlc2NlbmRhbnQgb2YgYW4gYXJ0aWNsZSwgYXNpZGUsIG1haW4sIG5hdiBvciBzZWN0aW9uIGVsZW1lbnRcIixcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJkb2MtZm9vdG5vdGVcIiwgXCJncm91cFwiLCBcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwib3RoZXJcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiY29udGVudGluZm9cIl0sXG4gICAgICAgICAgICAgICAgLy9yb2xlQ29uZGl0aW9uOiBcIiB3aGVuIG5vdCBhIGRlc2NlbmRhbnQgb2YgYW4gYXJ0aWNsZSwgYXNpZGUsIG1haW4sIG5hdiBvciBzZWN0aW9uIGVsZW1lbnRcIixcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJkb2MtZm9vdG5vdGVcIiwgXCJncm91cFwiLCBcIm5vbmVcIiwgXCJwcmVzZW50YXRpb25cIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuLy8gVE9ET1xuLy8gICAgICAgIFwiZm9ybS1hc3NvY2lhdGVkIGN1c3RvbSBlbGVtZW50XCI6IHtcbi8vICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJSb2xlIGV4cG9zZWQgZnJvbSBhdXRob3IgZGVmaW5lZCBFbGVtZW50SW50ZXJuYWxzLiBPdGhlcndpc2UgJ2dlbmVyaWMnLlwiXSxcbi8vICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiSWYgcm9sZSBkZWZpbmVkIGJ5IEVsZW1lbnRJbnRlcm5hbHNcIiwgXCJmb3JtLXJlbGF0ZWQgcm9sZXM6IGJ1dHRvblwiLCBcImNoZWNrYm94XCIsIFwiY29tYm9ib3hcIiwgXCJncm91cFwiLCBcImxpc3Rib3hcIiwgXCJwcm9ncmVzc2JhclwiLCBcInJhZGlvXCIsIFwicmFkaW9ncm91cFwiLCBcInNlYXJjaGJveFwiLCBcInNsaWRlclwiLCBcInNwaW5idXR0b25cIiwgXCJzd2l0Y2hcIiwgXCJ0ZXh0Ym94XCIsIFwibm8gcm9sZSBPdGhlcndpc2VcIl0sXG4vLyAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbi8vICAgICAgICB9LFxuXG4gICAgICAgIFwiaGVhZGVyXCI6IHtcbiAgICAgICAgICAgIFwiZGVzLXNlY3Rpb24tYXJ0aWNsZS1hc2lkZS1tYWluLW5hdlwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJnZW5lcmljXCJdLFxuICAgICAgICAgICAgICAgIC8vcm9sZUNvbmRpdGlvbjogXCIgd2hlbiBkZXNjZW5kYW50IG9mIGFuIGFydGljbGUsIGFzaWRlLCBtYWluLCBuYXYgb3Igc2VjdGlvbiBlbGVtZW50XCIsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiZ3JvdXBcIiwgXCJub25lXCIsIFwicHJlc2VudGF0aW9uXCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm90aGVyXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImJhbm5lclwiXSxcbiAgICAgICAgICAgICAgICAvL3JvbGVDb25kaXRpb246IFwiIHdoZW4gbm90IGEgZGVzY2VuZGFudCBvZiBhbiBhcnRpY2xlLCBhc2lkZSwgbWFpbiwgbmF2IG9yIHNlY3Rpb24gZWxlbWVudFwiLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImdyb3VwXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSxcbiAgICAgICAgXCJpbWdcIjoge1xuICAgICAgICAgICAgXCJpbWctd2l0aC1hY2NuYW1lXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImltZ1wiXSxcbiAgICAgICAgICAgICAgICAvL3JvbGVDb25kaXRpb246IFwid2hlbiBhY2Nlc3NpYmxlIG5hbWUgcHJlc2VudHNcIixcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJidXR0b25cIiwgXCJjaGVja2JveFwiLCBcImRvYy1jb3ZlclwiLCBcImxpbmtcIiwgXCJtZW51aXRlbVwiLCBcIm1lbnVpdGVtY2hlY2tib3hcIiwgXCJtZW51aXRlbXJhZGlvXCIsIFwibWV0ZXJcIiwgXCJvcHRpb25cIiwgXCJwcm9ncmVzc2JhclwiLCBcInJhZGlvXCIsIFwic2Nyb2xsYmFyXCIsIFwic2VwYXJhdG9yXCIsIFwic2xpZGVyXCIsIFwic3dpdGNoXCIsIFwidGFiXCIsIFwidHJlZWl0ZW1cIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiaW1nLXdpdGhvdXQtYWNjbmFtZS1lbXB0eS1hbHRcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wicHJlc2VudGF0aW9uXCIsIFwibm9uZVwiXSxcbiAgICAgICAgICAgICAgICAvL3JvbGVDb25kaXRpb246IFwid2hlbiBubyBhY2Nlc3NpYmxlIG5hbWUgcHJlc2VudHMgYW5kIGFsdD0nJ1wiLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogZmFsc2UsIFxuICAgICAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLWhpZGRlbj10cnVlXCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJpbWctd2l0aG91dC1hY2NuYW1lLW5vLWFsdFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJpbWdcIl0sXG4gICAgICAgICAgICAgICAgLy9yb2xlQ29uZGl0aW9uOiBcIndoZW4gbmVpdGhlciBhY2Nlc3NpYmxlIG5hbWUgbm8gYWx0IHByZXNlbnRzXCIsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wicHJlc2VudGF0aW9uXCIsIFwibm9uZVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZSwgXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtaGlkZGVuPXRydWVcIl1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJpbnB1dFwiOiB7XG4gICAgICAgICAgICBcImJ1dHRvblwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJidXR0b25cIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiY2hlY2tib3hcIiwgXCJjb21ib2JveFwiLCBcImdyaWRjZWxsXCIsIFwibGlua1wiLCBcIm1lbnVpdGVtXCIsIFwibWVudWl0ZW1jaGVja2JveFwiLCBcIm1lbnVpdGVtcmFkaW9cIiwgXCJvcHRpb25cIiwgXCJyYWRpb1wiLCBcInNsaWRlclwiLCBcInN3aXRjaFwiLCBcInRhYlwiLCBcInRyZWVpdGVtXCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImNoZWNrYm94LXdpdGgtYXJpYS1wcmVzc2VkXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImNoZWNrYm94XCJdLFxuICAgICAgICAgICAgICAgIC8vcm9sZUNvbmRpdGlvbjogXCIgd2l0aCB0eXBlPWNoZWNrYm94IGFuZCBhcmlhLXByZXNzZWQgYXR0cmlidXRlIGlzIHByZXNlbnRcIixcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJtZW51aXRlbWNoZWNrYm94XCIsIFwib3B0aW9uXCIsIFwic3dpdGNoXCIsIFwiYnV0dG9uXCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtcmVxdWlyZWRcIl0sXG4gICAgICAgICAgICAgICAgb3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtY2hlY2tlZFwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiY2hlY2tib3gtd2l0aG91dC1hcmlhLXByZXNzZWRcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiY2hlY2tib3hcIl0sXG4gICAgICAgICAgICAgICAgLy9yb2xlQ29uZGl0aW9uOiBcIiB3aXRoIHR5cGU9Y2hlY2tib3ggYW5kIGFyaWEtcHJlc3NlZCBhdHRyaWJ1dGUgaXMgbm90IHByZXNlbnRcIixcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJtZW51aXRlbWNoZWNrYm94XCIsIFwib3B0aW9uXCIsIFwic3dpdGNoXCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtcmVxdWlyZWRcIl0sXG4gICAgICAgICAgICAgICAgb3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtY2hlY2tlZFwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiY29sb3JcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImRhdGVcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtcmVxdWlyZWRcIiwgXCJhcmlhLXJlYWRvbmx5XCJdLFxuICAgICAgICAgICAgICAgIG90aGVyUm9sZXNGb3JBdHRyaWJ1dGVzOiBbXCJ0ZXh0Ym94XCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJkYXRldGltZS1sb2NhbFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1yZXF1aXJlZFwiLCBcImFyaWEtcmVhZG9ubHlcIl0sXG4gICAgICAgICAgICAgICAgb3RoZXJSb2xlc0ZvckF0dHJpYnV0ZXM6IFtcInRleHRib3hcIl1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImVtYWlsLW5vLWxpc3RcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1widGV4dGJveFwiXSxcbiAgICAgICAgICAgICAgICAvL3JvbGVDb25kaXRpb246IFwiIHdpdGggdHlwZT1lbWFpbCBhbmQgbm8gbGlzdCBhdHRyaWJ1dGUgaXMgcHJlc2VudFwiLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1wbGFjZWhvbGRlclwiLCBcImFyaWEtcmVxdWlyZWRcIiwgXCJhcmlhLXJlYWRvbmx5XCJdLFxuICAgICAgICAgICAgICAgIG90aGVyUm9sZXNGb3JBdHRyaWJ1dGVzOiBbXCJ0ZXh0Ym94XCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJlbWFpbC13aXRoLWxpc3RcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiY29tYm9ib3hcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJmaWxlXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLXJlcXVpcmVkXCJdLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiaGlkZGVuXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiBmYWxzZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiaW1hZ2VcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiYnV0dG9uXCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImNoZWNrYm94XCIsIFwiZ3JpZGNlbGxcIiwgXCJsaW5rXCIsIFwibWVudWl0ZW1cIiwgXCJtZW51aXRlbWNoZWNrYm94XCIsIFwibWVudWl0ZW1yYWRpb1wiLCBcIm9wdGlvblwiLCBcInJhZGlvXCIsIFwic2xpZGVyXCIsIFwic3dpdGNoXCIsIFwidGFiXCIsIFwidHJlZWl0ZW1cIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwibW9udGhcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtcmVhZG9ubHlcIl0sXG4gICAgICAgICAgICAgICAgb3RoZXJSb2xlc0ZvckF0dHJpYnV0ZXM6IFtcInRleHRib3hcIl1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm51bWJlclwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJzcGluYnV0dG9uXCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1wbGFjZWhvbGRlclwiLCBcImFyaWEtcmVxdWlyZWRcIiwgXCJhcmlhLXJlYWRvbmx5XCJdLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwicGFzc3dvcmRcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtcGxhY2Vob2xkZXJcIiwgXCJhcmlhLXJlcXVpcmVkXCIsIFwiYXJpYS1yZWFkb25seVwiXSxcbiAgICAgICAgICAgICAgICBvdGhlclJvbGVzRm9yQXR0cmlidXRlczogW1widGV4dGJveFwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwicmFkaW9cIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wicmFkaW9cIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wibWVudWl0ZW1yYWRpb1wiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLXJlcXVpcmVkXCJdLFxuICAgICAgICAgICAgICAgIG90aGVyRGlzYWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLWNoZWNrZWRcIl1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInJhbmdlXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInNsaWRlclwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtdmFsdWVtYXhcIiwgXCJhcmlhLXZhbHVlbWluXCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJyZXNldFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJidXR0b25cIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiY2hlY2tib3hcIiwgXCJjb21ib2JveFwiLCBcImdyaWRjZWxsXCIsIFwibGlua1wiLCBcIm1lbnVpdGVtXCIsIFwibWVudWl0ZW1jaGVja2JveFwiLCBcIm1lbnVpdGVtcmFkaW9cIiwgXCJvcHRpb25cIiwgXCJyYWRpb1wiLCBcInNsaWRlclwiLCBcInN3aXRjaFwiLCBcInRhYlwiLCBcInRyZWVpdGVtXCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInNlYXJjaC1uby1saXN0XCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInNlYXJjaGJveFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtcGxhY2Vob2xkZXJcIiwgXCJhcmlhLXJlcXVpcmVkXCIsIFwiYXJpYS1yZWFkb25seVwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwic2VhcmNoLXdpdGgtbGlzdFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJjb21ib2JveFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInN1Ym1pdFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJidXR0b25cIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiY2hlY2tib3hcIiwgXCJjb21ib2JveFwiLCBcImdyaWRjZWxsXCIsIFwibGlua1wiLCBcIm1lbnVpdGVtXCIsIFwibWVudWl0ZW1jaGVja2JveFwiLCBcIm1lbnVpdGVtcmFkaW9cIiwgXCJvcHRpb25cIiwgXCJyYWRpb1wiLCBcInNsaWRlclwiLCBcInN3aXRjaFwiLCBcInRhYlwiLCBcInRyZWVpdGVtXCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInRlbC1uby1saXN0XCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInRleHRib3hcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLXBsYWNlaG9sZGVyXCIsIFwiYXJpYS1yZXF1aXJlZFwiLCBcImFyaWEtcmVhZG9ubHlcIl1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcInRlbC13aXRoLWxpc3RcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiY29tYm9ib3hcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJ0ZXh0LW5vLWxpc3RcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1widGV4dGJveFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBbXCJjb21ib2JveFwiLCBcInNlYXJjaGJveFwiLCBcInNwaW5idXR0b25cIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1wbGFjZWhvbGRlclwiLCBcImFyaWEtcmVxdWlyZWRcIiwgXCJhcmlhLXJlYWRvbmx5XCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJ0ZXh0LXdpdGgtbGlzdFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJjb21ib2JveFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgICAgICAvLyBvdGhlckRpc2FsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1oYXNwb3B1cFwiXSAgLy8gY292ZXJlZCBpbiBhIGRpZmZlcmVudCBydWxlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJ0aW1lXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgIG90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzOiBbXCJhcmlhLXJlYWRvbmx5XCJdLFxuICAgICAgICAgICAgICAgIG90aGVyUm9sZXNGb3JBdHRyaWJ1dGVzOiBbXCJ0ZXh0Ym94XCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJ1cmwtbm8tbGlzdFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJ0ZXh0Ym94XCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1wbGFjZWhvbGRlclwiLCBcImFyaWEtcmVxdWlyZWRcIiwgXCJhcmlhLXJlYWRvbmx5XCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJ1cmwtd2l0aC1saXN0XCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImNvbWJvYm94XCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwid2Vla1wiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1yZWFkb25seVwiXSxcbiAgICAgICAgICAgICAgICBvdGhlclJvbGVzRm9yQXR0cmlidXRlczogW1widGV4dGJveFwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZGVmYXVsdC13aXRoLWxpc3RcIjoge1xuICAgICAgICAgICAgICAgIC8vIGlucHV0IHdpdGggYSBtaXNzaW5nIG9yIGludmFsaWQgdHlwZSwgd2l0aCBhIGxpc3QgYXR0cmlidXRlXG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJjb21ib2JveFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImRlZmF1bHQtbm8tbGlzdFwiOiB7XG4gICAgICAgICAgICAgICAgLy8gaW5wdXQgd2l0aCBhIG1pc3Npbmcgb3IgaW52YWxpZCB0eXBlLCB3aXRoIGEgbGlzdCBhdHRyaWJ1dGVcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInRleHRib3hcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogbnVsbCxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwibGlcIjoge1xuICAgICAgICAgICAgXCJjaGlsZC1vZi1saXN0LXJvbGVcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogWydsaXN0aXRlbSddLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwibm8tY2hpbGQtb2YtbGlzdC1yb2xlXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFsnZ2VuZXJpYyddLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwic2VjdGlvblwiOiB7XG4gICAgICAgICAgICBcIndpdGgtbmFtZVwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJyZWdpb25cIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYWxlcnRcIiwgXCJhbGVydGRpYWxvZ1wiLCBcImFwcGxpY2F0aW9uXCIsIFwiYmFubmVyXCIsIFwiY29tcGxlbWVudGFyeVwiLCBcImNvbnRlbnRpbmZvXCIsIFwiZGlhbG9nXCIsIFwiZG9jLWFic3RyYWN0XCIsIFwiZG9jLWFja25vd2xlZGdtZW50c1wiLCBcImRvYy1hZnRlcndvcmRcIiwgXCJkb2MtYXBwZW5kaXhcIiwgXCJkb2MtYmlibGlvZ3JhcGh5XCIsIFwiZG9jLWNoYXB0ZXJcIiwgXCJkb2MtY29sb3Bob25cIiwgXCJkb2MtY29uY2x1c2lvblwiLCBcImRvYy1jcmVkaXRcIiwgXCJkb2MtY3JlZGl0c1wiLCBcImRvYy1kZWRpY2F0aW9uXCIsIFwiZG9jLWVuZG5vdGVzXCIsIFwiZG9jLWVwaWdyYXBoXCIsIFwiZG9jLWVwaWxvZ3VlXCIsIFwiZG9jLWVycmF0YVwiLCBcImRvYy1leGFtcGxlXCIsIFwiZG9jLWZvcmV3b3JkXCIsIFwiZG9jLWdsb3NzYXJ5XCIsIFwiZG9jLWluZGV4XCIsIFwiZG9jLWludHJvZHVjdGlvblwiLCBcImRvYy1ub3RpY2VcIiwgXCJkb2MtcGFnZWxpc3RcIiwgXCJkb2MtcGFydFwiLCBcImRvYy1wcmVmYWNlXCIsIFwiZG9jLXByb2xvZ3VlXCIsIFwiZG9jLXB1bGxxdW90ZVwiLCBcImRvYy1xbmFcIiwgXCJkb2MtdG9jXCIsIFwiZG9jdW1lbnRcIiwgXCJmZWVkXCIsIFwiZ3JvdXBcIiwgXCJsb2dcIiwgXCJtYWluXCIsIFwibWFycXVlZVwiLCBcIm5hdmlnYXRpb25cIiwgXCJub25lXCIsIFwibm90ZVwiLCBcInByZXNlbnRhdGlvblwiLCBcInNlYXJjaFwiLCBcInN0YXR1c1wiLCBcInRhYnBhbmVsXCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIndpdGhvdXQtbmFtZVwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFsZXJ0XCIsIFwiYWxlcnRkaWFsb2dcIiwgXCJhcHBsaWNhdGlvblwiLCBcImJhbm5lclwiLCBcImNvbXBsZW1lbnRhcnlcIiwgXCJjb250ZW50aW5mb1wiLCBcImRpYWxvZ1wiLCBcImRvYy1hYnN0cmFjdFwiLCBcImRvYy1hY2tub3dsZWRnbWVudHNcIiwgXCJkb2MtYWZ0ZXJ3b3JkXCIsIFwiZG9jLWFwcGVuZGl4XCIsIFwiZG9jLWJpYmxpb2dyYXBoeVwiLCBcImRvYy1jaGFwdGVyXCIsIFwiZG9jLWNvbG9waG9uXCIsIFwiZG9jLWNvbmNsdXNpb25cIiwgXCJkb2MtY3JlZGl0XCIsIFwiZG9jLWNyZWRpdHNcIiwgXCJkb2MtZGVkaWNhdGlvblwiLCBcImRvYy1lbmRub3Rlc1wiLCBcImRvYy1lcGlncmFwaFwiLCBcImRvYy1lcGlsb2d1ZVwiLCBcImRvYy1lcnJhdGFcIiwgXCJkb2MtZXhhbXBsZVwiLCBcImRvYy1mb3Jld29yZFwiLCBcImRvYy1nbG9zc2FyeVwiLCBcImRvYy1pbmRleFwiLCBcImRvYy1pbnRyb2R1Y3Rpb25cIiwgXCJkb2Mtbm90aWNlXCIsIFwiZG9jLXBhZ2VsaXN0XCIsIFwiZG9jLXBhcnRcIiwgXCJkb2MtcHJlZmFjZVwiLCBcImRvYy1wcm9sb2d1ZVwiLCBcImRvYy1wdWxscXVvdGVcIiwgXCJkb2MtcW5hXCIsIFwiZG9jLXRvY1wiLCBcImRvY3VtZW50XCIsIFwiZmVlZFwiLCBcImdyb3VwXCIsIFwibG9nXCIsIFwibWFpblwiLCBcIm1hcnF1ZWVcIiwgXCJuYXZpZ2F0aW9uXCIsIFwibm9uZVwiLCBcIm5vdGVcIiwgXCJwcmVzZW50YXRpb25cIiwgXCJzZWFyY2hcIiwgXCJzdGF0dXNcIiwgXCJ0YWJwYW5lbFwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwic2VsZWN0XCI6IHtcbiAgICAgICAgICAgIFwibm8tbXVsdGlwbGUtYXR0ci1zaXplLWd0MVwiOiB7XG4gICAgICAgICAgICAgICAgLy9yb2xlQ29uZGl0aW9uOiBcIiB3aXRoIGEgbXVsdGlwbGUgYXR0cmlidXRlIG9yIGEgc2l6ZSBhdHRyaWJ1dGUgaGF2aW5nIHZhbHVlIGdyZWF0ZXIgdGhhbiAxXCJcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImNvbWJvYm94XCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcIm1lbnVcIl0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvdGhlckRpc2FsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1tdWx0aXNlbGVjdGFibGVcIl1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm11bHRpcGxlLWF0dHItc2l6ZS1ndDFcIjoge1xuICAgICAgICAgICAgICAgIC8vcm9sZUNvbmRpdGlvbjogXCIgd2l0aCBubyBtdWx0aXBsZSBhdHRyaWJ1dGUgYW5kIG5vIHNpemUgYXR0cmlidXRlIGhhdmluZyB2YWx1ZSBncmVhdGVyIHRoYW4gMVwiXG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJsaXN0Ym94XCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBvdGhlckRpc2FsbG93ZWRBcmlhQXR0cmlidXRlczogW1wiYXJpYS1tdWx0aXNlbGVjdGFibGVcIl1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJzdW1tYXJ5XCI6IHtcbiAgICAgICAgICAgIFwiZmlyc3Qtc3VtbWFyeS1vZi1kZXRhaWxcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogbnVsbCxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgb3RoZXJBbGxvd2VkQXJpYUF0dHJpYnV0ZXM6IFtcImFyaWEtZGlzYWJsZWRcIiwgXCJhcmlhLWhhc3BvcHVwXCJdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJuby1maXJzdC1zdW1tYXJ5LW9mLWRldGFpbFwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwidGJvZHlcIjoge1xuICAgICAgICAgICAgXCJkZXMtdGFibGVcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wicm93Z3JvdXBcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImRlcy1ncmlkXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInJvd2dyb3VwXCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJkZXMtdHJlZWdyaWRcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wicm93Z3JvdXBcIl0sXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImRlcy1vdGhlclwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwidGRcIjoge1xuICAgICAgICAgICAgXCJkZXMtdGFibGVcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiY2VsbFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImRlcy1ncmlkXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdyaWRjZWxsXCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZGVzLXRyZWVncmlkXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcImdyaWRjZWxsXCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZGVzLW90aGVyXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IG51bGwsXG4gICAgICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJ0aFwiOiB7XG4gICAgICAgICAgICBcImRlcy10YWJsZS1yb3ctc2NvcGVcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wicm93aGVhZGVyXCIsIFwiY2VsbFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImRlcy10YWJsZS1jb2x1bW4tc2NvcGVcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wiY29sdW1uaGVhZGVyXCIsIFwiY2VsbFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImRlcy1ncmlkLXRyZWVncmlkLXJvdy1zY29wZVwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJyb3doZWFkZXJcIiwgXCJncmlkY2VsbFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImRlcy1ncmlkLXRyZWVncmlkLWNvbHVtbi1zY29wZVwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBbXCJjb2x1bW5oZWFkZXJcIiwgXCJncmlkY2VsbFwiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImRlcy1vdGhlclwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwidHJcIjoge1xuICAgICAgICAgICAgXCJkZXMtdGFibGVcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wicm93XCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZGVzLWdyaWRcIjoge1xuICAgICAgICAgICAgICAgIGltcGxpY2l0Um9sZTogW1wicm93XCJdLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZGVzLXRyZWVncmlkXCI6IHtcbiAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGU6IFtcInJvd1wiXSxcbiAgICAgICAgICAgICAgICB2YWxpZFJvbGVzOiBudWxsLFxuICAgICAgICAgICAgICAgIGdsb2JhbEFyaWFBdHRyaWJ1dGVzVmFsaWQ6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImRlcy1vdGhlclwiOiB7XG4gICAgICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgICAgIHZhbGlkUm9sZXM6IFtcImFueVwiXSxcbiAgICAgICAgICAgICAgICBnbG9iYWxBcmlhQXR0cmlidXRlc1ZhbGlkOiB0cnVlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICBcImRlZmF1bHRcIjoge1xuICAgICAgICAgICAgaW1wbGljaXRSb2xlOiBudWxsLFxuICAgICAgICAgICAgLy9yb2xlQ29uZGl0aW9uOiBcIlwiLFxuICAgICAgICAgICAgdmFsaWRSb2xlczogW1wiYW55XCJdLFxuICAgICAgICAgICAgZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZDogdHJ1ZVxuICAgICAgICB9XG4gICAgfSAvLyBlbmQgb2YgZG9jdW1lbnRDb25mb3JtYW5jZVJlcXVpcmVtZW50U3BlY2lhbFRhZ3NcblxuICAgIC8vIG1hcCBhcmlhIGF0dHJpYnV0ZSB0byB0aGUgY29ycmVzcG9uZGluZyBuYXRpdmUgYXR0cmlidXRlLCBhcHBseSB0byBhbnkgZWxlbWVudCBhcHBsaWNhYmxlXG4gICAgLy8gbm90ZSB0aGlzIG1hcHBpbmcgaXMgZm9yIHRoZSByZWxhdGVkIGF0dHJpYnV0ZXMgaW4gdGhlIHNhbWUgZWxlbWVudCB3aXRob3V0IGNoZWNraW5nIHRoZSBwYXJlbnQgdHJlZS5cbiAgICAvLyByZWZlciB0byBodHRwczovL3czYy5naXRodWIuaW8vaHRtbC1hcmlhL1xuICAgIHN0YXRpYyByZWxhdGVkQXJpYUh0bWxBdHRyaWJ1dGVzOiB7XG4gICAgICAgIFthcmlhQXR0cjogc3RyaW5nXSA6IHtcbiAgICAgICAgICAgIGNvbmZsaWN0OiB7XG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBzdHJpbmcgfCBudWxsLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogc3RyaW5nW10sXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZVZhbHVlczogc3RyaW5nW10gfCBudWxsXG4gICAgICAgICAgICB9W10sXG4gICAgICAgICAgICBvdmVybGFwcGluZz86IHsgICAgXG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBzdHJpbmcgfCBudWxsLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogc3RyaW5nW10sXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZVZhbHVlczogc3RyaW5nW10gfCBudWxsXG4gICAgICAgICAgICB9W11cbiAgICAgICAgfSBcbiAgICB9ID0gIHtcbiAgICAgICAgXCJhcmlhLWNoZWNrZWRcIjoge1xuICAgICAgICAgICAgY29uZmxpY3Q6IFt7XG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBcImZhbHNlXCIsXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZU5hbWVzOiBbXCJjaGVja2VkXCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IG51bGxcbiAgICAgICAgICAgIH1dLFxuICAgICAgICAgICAgb3ZlcmxhcHBpbmc6IFt7ICAgIFxuICAgICAgICAgICAgICAgIGFyaWFBdHRyaWJ1dGVWYWx1ZTogXCJ0cnVlXCIsXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZU5hbWVzOiBbXCJjaGVja2VkXCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IG51bGxcbiAgICAgICAgICAgIH1dXG4gICAgICAgIH0sICAgIFxuICAgICAgICBcImFyaWEtZGlzYWJsZWRcIjoge1xuICAgICAgICAgICAgY29uZmxpY3Q6IFt7XG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBcImZhbHNlXCIsXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZU5hbWVzOiBbXCJkaXNhYmxlZFwiXSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlVmFsdWVzOiBudWxsXG4gICAgICAgICAgICB9XSxcbiAgICAgICAgICAgIG92ZXJsYXBwaW5nOiBbeyAgICBcbiAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlVmFsdWU6IFwidHJ1ZVwiLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wiZGlzYWJsZWRcIl0sXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZVZhbHVlczogbnVsbFxuICAgICAgICAgICAgfV1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWhpZGRlblwiOiB7XG4gICAgICAgICAgICBjb25mbGljdDogW3tcbiAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlVmFsdWU6IFwiZmFsc2VcIixcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IFtcImhpZGRlblwiXSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlVmFsdWVzOiBbXCJoaWRkZW4sbnVsbFwiXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlVmFsdWU6IFwidHJ1ZVwiLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wiaGlkZGVuXCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IFtcInVudGlsLWZvdW5kXCJdXG4gICAgICAgICAgICB9XSxcbiAgICAgICAgICAgIG92ZXJsYXBwaW5nOiBbeyAgICBcbiAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlVmFsdWU6IFwidHJ1ZVwiLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wiaGlkZGVuXCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IFtcImhpZGRlbixudWxsXCJdXG4gICAgICAgICAgICB9XVxuICAgICAgICB9LCAgICBcbiAgICAgICAgXCJhcmlhLXBsYWNlaG9sZGVyXCI6IHtcbiAgICAgICAgICAgIGNvbmZsaWN0OiBbe1xuICAgICAgICAgICAgICAgIGFyaWFBdHRyaWJ1dGVWYWx1ZTogbnVsbCxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IFtcInBsYWNlaG9sZGVyXCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IG51bGxcbiAgICAgICAgICAgIH1dXG4gICAgICAgIH0sICAgIFxuICAgICAgICBcImFyaWEtdmFsdWVtYXhcIjoge1xuICAgICAgICAgICAgY29uZmxpY3Q6IFt7XG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBudWxsLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wibWF4XCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IG51bGxcbiAgICAgICAgICAgIH1dXG4gICAgICAgICAgICAvL292ZXJsYXAgY2FzZSBjb3ZlcmVkIGluIHRoZSByb2xlIGRlZmluaXRpb246IEF1dGhvcnMgU0hPVUxEIE5PVCB1c2UgYXJpYS12YWx1ZW1heCBvbiBhbnkgZWxlbWVudCB3aGljaCBhbGxvd3MgdGhlIG1heCBhdHRyaWJ1dGUuIFVzZSB0aGUgbWF4IGF0dHJpYnV0ZSBpbnN0ZWFkLiBcbiAgICAgICAgfSwgICAgXG4gICAgICAgIFwiYXJpYS12YWx1ZW1pblwiOiB7XG4gICAgICAgICAgICBjb25mbGljdDogW3tcbiAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlVmFsdWU6IG51bGwsXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZU5hbWVzOiBbXCJtaW5cIl0sXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZVZhbHVlczogbnVsbFxuICAgICAgICAgICAgfV1cbiAgICAgICAgICAgIC8vLy9vdmVybGFwIGNhc2UgY292ZXJlZCBpbiB0aGUgcm9sZSBkZWZpbml0aW9uOkF1dGhvcnMgU0hPVUxEIE5PVCB1c2UgYXJpYS12YWx1ZW1pbiBvbiBhbnkgZWxlbWVudCB3aGljaCBhbGxvd3MgdGhlIG1pbiBhdHRyaWJ1dGUuIFVzZSB0aGUgbWluIGF0dHJpYnV0ZSBpbnN0ZWFkLlxuICAgICAgICB9LCAgICBcbiAgICAgICAgXCJhcmlhLXJlYWRvbmx5XCI6IHtcbiAgICAgICAgICAgIGNvbmZsaWN0OiBbe1xuICAgICAgICAgICAgICAgIGFyaWFBdHRyaWJ1dGVWYWx1ZTogXCJmYWxzZVwiLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wicmVhZG9ubHlcIiwgXCJjb250ZW50ZWRpdGFibGVcIiwgXCJpc2NvbnRlbnRlZGl0YWJsZVwiXSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlVmFsdWVzOiBbbnVsbCwgXCJmYWxzZVwiLCBcImZhbHNlXCJdXG4gICAgICAgICAgICB9XSxcbiAgICAgICAgICAgIG92ZXJsYXBwaW5nOiBbeyAgICBcbiAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlVmFsdWU6IFwidHJ1ZVwiLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wicmVhZG9ubHlcIiwgXCJjb250ZW50ZWRpdGFibGVcIiwgXCJpc2NvbnRlbnRlZGl0YWJsZVwiXSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlVmFsdWVzOiBbbnVsbCwgXCJ0cnVlXCIsIFwidHJ1ZVwiXVxuICAgICAgICAgICAgfV1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXJlcXVpcmVkXCI6IHtcbiAgICAgICAgICAgIGNvbmZsaWN0OiBbe1xuICAgICAgICAgICAgICAgIGFyaWFBdHRyaWJ1dGVWYWx1ZTogXCJmYWxzZVwiLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wicmVxdWlyZWRcIl0sXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZVZhbHVlczogbnVsbFxuICAgICAgICAgICAgfV0sXG4gICAgICAgICAgICBvdmVybGFwcGluZzogW3sgICAgXG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBcInRydWVcIixcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IFtcInJlcXVpcmVkXCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IG51bGxcbiAgICAgICAgICAgIH1dXG4gICAgICAgIH0sICAgICAgICBcbiAgICAgICAgXCJhcmlhLWNvbHNwYW5cIjoge1xuICAgICAgICAgICAgY29uZmxpY3Q6IFt7XG4gICAgICAgICAgICAgICAgLy8gY29uZmxpY3Qgb2NjdXJzIGlmIGJvdGggdmFsdWVzIGFyZSBkaWZmZXJlbnRcbiAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlVmFsdWU6IFwiVkFMVUVcIixcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlTmFtZXM6IFtcImNvbHNwYW5cIl0sXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZVZhbHVlczogW1wiVkFMVUVcIl1cbiAgICAgICAgICAgIH1dLFxuICAgICAgICAgICAgb3ZlcmxhcHBpbmc6IFt7ICAgIFxuICAgICAgICAgICAgICAgIC8vIG92ZXJsYXAgb2NjdXJzIGlmIGJvdGggZXhpc3RzXG4gICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZVZhbHVlOiBudWxsLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wiY29sc3BhblwiXSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlVmFsdWVzOiBudWxsXG4gICAgICAgICAgICB9XVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtcm93c3BhblwiOiB7XG4gICAgICAgICAgICBjb25mbGljdDogW3tcbiAgICAgICAgICAgICAgICAvLyBjb25mbGljdCBvY2N1cnMgaWYgYm90aCB2YWx1ZXMgYXJlIGRpZmZlcmVudFxuICAgICAgICAgICAgICAgIGFyaWFBdHRyaWJ1dGVWYWx1ZTogXCJWQUxVRVwiLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVOYW1lczogW1wicm93c3BhblwiXSxcbiAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlVmFsdWVzOiBbXCJWQUxVRVwiXVxuICAgICAgICAgICAgfV0sXG4gICAgICAgICAgICBvdmVybGFwcGluZzogW3sgICBcbiAgICAgICAgICAgICAgICAvLyBvdmVybGFwIG9jY3VycyBpZiBib3RoIGV4aXN0cyBcbiAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlVmFsdWU6IG51bGwsXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZU5hbWVzOiBbXCJyb3dzcGFuXCJdLFxuICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVWYWx1ZXM6IG51bGxcbiAgICAgICAgICAgIH1dXG4gICAgICAgIH0sXG4gICAgICAgIC8qKiBcImFyaWEtYXV0b2NvbXBsZXRlXCI6IHtcbiAgICAgICAgICAgIGNvbmZsaWN0OiBbe1xuICAgICAgICAgICAgICAgIC8vIGNvbmZsaWN0IG9jY3VycyBpZiBib3RoIGV4aXN0cywgYXJpYSB2YWx1ZSBpcyBvbmx5IGZvciBjdXN0b20gd2lkZ2V0LCByYXRoZXIgdGhhbiBuYXRpdmVcbiAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlVmFsdWU6IG51bGwsXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZU5hbWVzOiBbXCJhdXRvY29tcGxldGVcIl0sXG4gICAgICAgICAgICAgICAgaHRtbEF0dHJpYnV0ZVZhbHVlczogbnVsbFxuICAgICAgICAgICAgfV1cbiAgICAgICAgfSAqLyBcbiAgICB9XG5cbiAgICBzdGF0aWMgY29udGFpbmVycyA9IFtdXG59O1xuXG5sZXQgY29udGFpbmVyQXJyYXkgPSBbXTtcblxuZm9yIChjb25zdCByb2xlRGVzaWduIGluIEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJucykge1xuICAgIGNvbnN0IGNvbnRhaW5lcnMgPSBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNbcm9sZURlc2lnbl0uY29udGFpbmVyO1xuICAgIGlmIChjb250YWluZXJzICE9PSBudWxsKSB7XG4gICAgICAgIGZvciAoY29uc3QgY29udGFpbmVyIG9mIGNvbnRhaW5lcnMpIHtcbiAgICAgICAgICAgIGlmIChjb250YWluZXJBcnJheS5pbmRleE9mKGNvbnRhaW5lcikgPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBjb250YWluZXJBcnJheS5wdXNoKGNvbnRhaW5lcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5BUklBRGVmaW5pdGlvbnMuY29udGFpbmVycyA9IGNvbnRhaW5lckFycmF5O1xuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBBUklBRGVmaW5pdGlvbnMgfSBmcm9tIFwiLi9BUklBRGVmaW5pdGlvbnNcIjtcbmltcG9ydCB7IENvbW1vbk1hcHBlciB9IGZyb20gXCIuLi9jb21tb24vQ29tbW9uTWFwcGVyXCI7XG5pbXBvcnQgeyBET01VdGlsIH0gZnJvbSBcIi4uL2RvbS9ET01VdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uLy4uL3Y0L3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vLi4vdjQvdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG5pbXBvcnQgeyBJTWFwUmVzdWx0IH0gZnJvbSBcIi4uLy4uL3Y0L2FwaS9JTWFwcGVyXCI7XG5pbXBvcnQgeyBBUklBV2Fsa2VyIH0gZnJvbSBcIi4vQVJJQVdhbGtlclwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4uLy4uL3Y0L3V0aWwvQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vZG9tL0RPTVdhbGtlclwiO1xuaW1wb3J0IHsgQWNjTmFtZVV0aWwgfSBmcm9tIFwiLi4vLi4vdjQvdXRpbC9BY2NOYW1lVXRpbFwiO1xuXG50eXBlIEVsZW1DYWxjID0gKGVsZW06IEVsZW1lbnQpID0+IHN0cmluZztcbnR5cGUgTm9kZUNhbGMgPSAobm9kZTogTm9kZSkgPT4gc3RyaW5nO1xuXG5leHBvcnQgY2xhc3MgQVJJQU1hcHBlciBleHRlbmRzIENvbW1vbk1hcHBlciB7XG4gICAgY2hpbGRyZW5DYW5IYXZlUm9sZShub2RlOiBOb2RlLCByb2xlOiBzdHJpbmcpIDogYm9vbGVhbiB7XG4gICAgICAgIC8vIGlmIChub2RlLm5vZGVUeXBlID09PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovKSB7XG4gICAgICAgIC8vICAgICBjb25zdCBlbGVtID0gbm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyAgICAgaWYgKGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1oaWRkZW5cIikgPT09IFwidHJ1ZVwiKSB7XG4gICAgICAgIC8vICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyB9XG4gICAgICAgIHJldHVybiAhKHJvbGUgaW4gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zICYmIEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlXS5wcmVzZW50YXRpb25hbENoaWxkcmVuKTtcbiAgICB9XG4gICAgZ2V0Um9sZShub2RlOiBOb2RlKSA6IHN0cmluZyB7XG4gICAgICAgIGNvbnN0IHJvbGUgPSBBUklBTWFwcGVyLm5vZGVUb1JvbGUobm9kZSk7XG4gICAgICAgIHJldHVybiByb2xlO1xuICAgIH1cbiAgICBnZXROYW1lc3BhY2UoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIFwiYXJpYVwiXG4gICAgfVxuICAgIGdldEF0dHJpYnV0ZXMobm9kZTogTm9kZSkgOiB7IFtrZXk6c3RyaW5nXTogc3RyaW5nIH0ge1xuICAgICAgICBsZXQgcmV0VmFsID0ge307XG4gICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovKSB7XG4gICAgICAgICAgICBjb25zdCBjYWNoZVZhbCA9IENhY2hlVXRpbC5nZXRDYWNoZShub2RlIGFzIEhUTUxFbGVtZW50LCBcIkFSSUFNYXBwZXI6OmdldEF0dHJpYnV0ZXNcIiwgdW5kZWZpbmVkKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY2FjaGVWYWwgIT09IFwidW5kZWZpbmVkXCIpIHJldHVybiBjYWNoZVZhbDtcbiAgICAgICAgICAgIGNvbnN0IGVsZW0gPSBub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICBmb3IgKGxldCBpZHg9MDsgaWR4PGVsZW0uYXR0cmlidXRlcy5sZW5ndGg7ICsraWR4KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYXR0ckluZm8gPSBlbGVtLmF0dHJpYnV0ZXNbaWR4XTtcbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gYXR0ckluZm8ubmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoXCJhcmlhLVwiKSkge1xuICAgICAgICAgICAgICAgICAgICByZXRWYWxbbmFtZS5zdWJzdHJpbmcoNSldID0gYXR0ckluZm8ubm9kZVZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gT3B0aW1pemU6IENhY2hlIG5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgdG8gYXZvaWQgcmVwZWF0ZWQgY2FsbHNcbiAgICAgICAgICAgIGNvbnN0IG5vZGVOYW1lID0gbm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBBcHBseSBnbG9iYWwgYXR0cmlidXRlcyBmaXJzdFxuICAgICAgICAgICAgQVJJQU1hcHBlci5hcHBseUF0dHJSb2xlKGVsZW0sIFwiZ2xvYmFsXCIsIHJldFZhbCk7XG4gICAgICAgICAgICAvLyBBcHBseSBlbGVtZW50LXNwZWNpZmljIGF0dHJpYnV0ZXNcbiAgICAgICAgICAgIEFSSUFNYXBwZXIuYXBwbHlBdHRyUm9sZShlbGVtLCBub2RlTmFtZSwgcmV0VmFsKTtcbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShub2RlIGFzIEhUTUxFbGVtZW50LCBcIkFSSUFNYXBwZXI6OmdldEF0dHJpYnV0ZXNcIiwgcmV0VmFsKTtcbiAgICAgICAgfSBlbHNlIGlmIChub2RlLm5vZGVUeXBlID09PSAzIC8qIE5vZGUuVEVYVF9OT0RFICovKSB7XG4gICAgICAgICAgICBjb25zdCBjYWxjdWxhdG9ycyA9IEFSSUFNYXBwZXIudGV4dEF0dHJWYWx1ZUNhbGN1bGF0b3JzO1xuICAgICAgICAgICAgZm9yIChjb25zdCBhdHRyIGluIGNhbGN1bGF0b3JzKSB7XG4gICAgICAgICAgICAgICAgbGV0IHZhbCA9IGNhbGN1bGF0b3JzW2F0dHJdKG5vZGUpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsICE9PSBcInVuZGVmaW5lZFwiICYmIHZhbCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICByZXRWYWxbYXR0cl0gPSB2YWw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgLy8gT3B0aW1pemU6IE1vdmUgYXBwbHlBdHRyUm9sZSBvdXRzaWRlIGdldEF0dHJpYnV0ZXMgdG8gYXZvaWQgZnVuY3Rpb24gcmVjcmVhdGlvblxuICAgIHByaXZhdGUgc3RhdGljIGFwcGx5QXR0clJvbGUoZWxlbTogRWxlbWVudCwgbm9kZU5hbWU6IHN0cmluZywgcmV0VmFsOiB7IFtrZXk6c3RyaW5nXTogc3RyaW5nIH0pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY2FsY3VsYXRvcnMgPSBBUklBTWFwcGVyLmVsZW1BdHRyVmFsdWVDYWxjdWxhdG9ycztcbiAgICAgICAgaWYgKCEobm9kZU5hbWUgaW4gY2FsY3VsYXRvcnMpKSByZXR1cm47XG4gICAgICAgIFxuICAgICAgICBmb3IgKGNvbnN0IGF0dHIgaW4gY2FsY3VsYXRvcnNbbm9kZU5hbWVdKSB7XG4gICAgICAgICAgICBpZiAoIShhdHRyIGluIHJldFZhbCkpIHtcbiAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSBjYWxjdWxhdG9yc1tub2RlTmFtZV1bYXR0cl07XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9ICh2YWx1ZSBhcyBFbGVtQ2FsYykoZWxlbSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsW2F0dHJdID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGdldEFyaWFPd25lZEJ5KGVsZW06IEhUTUxFbGVtZW50KSA6IEhUTUxFbGVtZW50IHwgbnVsbCB7XG4gICAgICAgIGNvbnN0IGRvYyA9IEZyYWdtZW50VXRpbC5nZXRPd25lckZyYWdtZW50KGVsZW0pO1xuICAgICAgICBpZiAoIUNhY2hlVXRpbC5nZXRDYWNoZShkb2MsIFwiQVJJQU1hcHBlcjo6cHJlY2FsY093bmVkXCIsIGZhbHNlKSkge1xuICAgICAgICAgICAgY29uc3Qgb3duZXJzID0gZG9jLnF1ZXJ5U2VsZWN0b3JBbGwoXCJbYXJpYS1vd25zXVwiKTtcbiAgICAgICAgICAgIGZvciAobGV0IGlPd25lciA9IDA7IGlPd25lciA8IG93bmVycy5sZW5ndGg7ICsraU93bmVyKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3duZXIgPSBvd25lcnNbaU93bmVyXTtcbiAgICAgICAgICAgICAgICBjb25zdCBvd25JZHMgPSBvd25lci5nZXRBdHRyaWJ1dGUoXCJhcmlhLW93bnNcIikuc3BsaXQoLyArL2cpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGlJZD0wOyBpSWQgPCBvd25JZHMubGVuZ3RoOyArK2lJZCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvd25lZCA9IGRvYy5nZXRFbGVtZW50QnlJZChvd25JZHNbaUlkXSk7XG4gICAgICAgICAgICAgICAgICAgIC8vaWdub3JlIGlmIHRoZSBhcmlhLW93bnMgcG9pbnQgdG8gdGhlIGVsZW1lbnQgaXRzZWxmXG4gICAgICAgICAgICAgICAgICAgIC8vaWYgKG93bmVkICYmICFET01VdGlsLnNhbWVOb2RlKG93bmVyLCBvd25lZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgQ2FjaGVVdGlsLnNldENhY2hlKG93bmVkLCBcImFyaWEtb3duZWRcIiwgb3duZXIpO1xuICAgICAgICAgICAgICAgICAgICAvL31cbiAgICAgICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICAgICAqICBjaXJjdWxhciBoaWVyYXJjaHkgY2hlY2s6XG4gICAgICAgICAgICAgICAgICAgICAqICAoMSkgdGhlIG93bmVkIGVsZW1lbnQgaXMgbmVpdGhlciB0aGUgc2FtZSBlbGVtZW50IHdpdGggdGhlIG93bmVyIG5vciBhbnkgYXNjZW5kYW50IG9mIHRoZSBvd25lclxuICAgICAgICAgICAgICAgICAgICAgKiAgKDIpIGFueSBjaGlsZCB3aXRoIGFyaWEtb3ducyBjYW5ub3QgcG9pbnQgdG8gdGhlIG93bmVyIG9yIGFueSBhc2NlbmRhbnQgb2YgdGhlIG93bmVyXG4gICAgICAgICAgICAgICAgICAgICAqLyBcbiAgICAgICAgICAgICAgICAgICAgaWYgKG93bmVkICYmICFET01VdGlsLnNhbWVOb2RlKG93bmVyLCBvd25lZCkpIHsgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZSBvd25lZCB3aXRoIGFyaWEtb3ducyB0aGF0IHBvaW50cyB0byBhbm90aGVyIGVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvd25lZE5vZGVzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdWJfb3duZXJzID0gb3duZWQucXVlcnlTZWxlY3RvckFsbChcIlthcmlhLW93bnNdXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdWJfb3duZXJzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3ViX293bmVyID0gc3ViX293bmVyc1tpXTsgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3ViX293bklkcyA9IHN1Yl9vd25lci5nZXRBdHRyaWJ1dGUoXCJhcmlhLW93bnNcIikuc3BsaXQoLyArL2cpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGo9MDsgaiA8IHN1Yl9vd25JZHMubGVuZ3RoOyArK2opIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3duZWROb2RlID0gZG9jLmdldEVsZW1lbnRCeUlkKHN1Yl9vd25JZHNbal0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3duZWROb2RlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZWROb2Rlcy5wdXNoKG93bmVkTm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvd25lZE5vZGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShvd25lZCwgXCJhcmlhLW93bmVkXCIsIG93bmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiBhbnkgYXJpYS1vd25zIHBvaW50cyB0byB0aGUgZWxlbWVudCBpdHNlbGYgb3IgYW55IG9mIGl0J3MgcGFyZW50XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGFyZW50IDogRWxlbWVudCA9IG93bmVyOyAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNpcmN1bGFyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocGFyZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZm91bmQgPSBvd25lZE5vZGVzLnNvbWUoaXRlbSA9PiBET01VdGlsLnNhbWVOb2RlKHBhcmVudCwgaXRlbSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudCA9IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KHBhcmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaXJjdWxhciA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gICBcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2lyY3VsYXIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKG93bmVkLCBcImFyaWEtb3duZWRcIiwgb3duZXIpOyAgICBcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShkb2MsIFwiQVJJQU1hcHBlcjo6cHJlY2FsY093bmVkXCIsIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBDYWNoZVV0aWwuZ2V0Q2FjaGUoZWxlbSwgXCJhcmlhLW93bmVkXCIsIG51bGwpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0Tm9kZUhpZXJhcmNoeShub2RlOiBOb2RlKSB7XG4gICAgICAgIGlmICghbm9kZSkgcmV0dXJuIFtdO1xuICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSAhPT0gMSkge1xuICAgICAgICAgICAgbGV0IHBhcmVudEhpZXJhcmNoeSA9IHRoaXMuZ2V0Tm9kZUhpZXJhcmNoeShET01XYWxrZXIucGFyZW50RWxlbWVudChub2RlKSk7XG4gICAgICAgICAgICBsZXQgcGFyZW50SW5mbyA9IHBhcmVudEhpZXJhcmNoeS5sZW5ndGggPiAwID8gcGFyZW50SGllcmFyY2h5W3BhcmVudEhpZXJhcmNoeS5sZW5ndGgtMV0gOiB7XG4gICAgICAgICAgICAgICAgcm9sZTogXCJcIixcbiAgICAgICAgICAgICAgICByb2xlUGF0aDogXCJcIixcbiAgICAgICAgICAgICAgICByb2xlQ291bnQ6IHt9LFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuQ2FuSGF2ZVJvbGU6IHRydWVcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBsZXQgbm9kZUhpZXJhcmNoeSA9IFtdO1xuICAgICAgICAgICAgLy8gU2V0IGhpZXJhcmNoeVxuICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHBhcmVudEhpZXJhcmNoeSkge1xuICAgICAgICAgICAgICAgIG5vZGVIaWVyYXJjaHkucHVzaChpdGVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5vZGVIaWVyYXJjaHkucHVzaCh7XG4gICAgICAgICAgICAgICAgYXR0cmlidXRlczoge30sXG4gICAgICAgICAgICAgICAgYm91bmRzOiB0aGlzLmdldEJvdW5kcyhub2RlKSxcbiAgICAgICAgICAgICAgICBuYW1lc3BhY2U6IHRoaXMuZ2V0TmFtZXNwYWNlKCksXG4gICAgICAgICAgICAgICAgbm9kZTogbm9kZSxcbiAgICAgICAgICAgICAgICByb2xlOiB0aGlzLmdldFJvbGUobm9kZSkgfHwgbnVsbCxcbiAgICAgICAgICAgICAgICByb2xlUGF0aDogcGFyZW50SW5mby5yb2xlUGF0aCtcIi9cIisodGhpcy5nZXRSb2xlKG5vZGUpIHx8IG51bGwpLFxuICAgICAgICAgICAgICAgIHJvbGVDb3VudDoge30sXG4gICAgICAgICAgICAgICAgY2hpbGRyZW5DYW5IYXZlUm9sZTogcGFyZW50SW5mby5jaGlsZHJlbkNhbkhhdmVSb2xlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBub2RlSGllcmFyY2h5O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IGVsZW0gPSBub2RlIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgbGV0IG5vZGVIaWVyYXJjaHkgOiBBcnJheTx7XG4gICAgICAgICAgICAgICAgcm9sZTogc3RyaW5nLFxuICAgICAgICAgICAgICAgIHJvbGVQYXRoOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgcm9sZUNvdW50OiB7XG4gICAgICAgICAgICAgICAgICAgIFtyb2xlOiBzdHJpbmddOiBudW1iZXJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2hpbGRyZW5DYW5IYXZlUm9sZTogYm9vbGVhblxuICAgICAgICAgICAgfT4gPSBDYWNoZVV0aWwuZ2V0Q2FjaGUoZWxlbSwgXCJBUklBTWFwcGVyOjpnZXROb2RlSGllcmFyY2h5XCIsIG51bGwpO1xuICAgICAgICAgICAgaWYgKCFub2RlSGllcmFyY2h5KSB7XG4gICAgICAgICAgICAgICAgLy8gVGhpcyBlbGVtZW50IGhhc24ndCBiZWVuIHByb2Nlc3NlZCB5ZXQgLSBidXQgOjpyZXNldCBwcm9jZXNzZXMgdGhlbSBhbGwgaW4gdGhlIHJpZ2h0IG9yZGVyXG5cbiAgICAgICAgICAgICAgICAvLyBHZXQgZGV0YWlscyBhYm91dCB0aGUgY29ycmVjdCBwYXJlbnQgZmlyc3RcbiAgICAgICAgICAgICAgICBsZXQgcGFyZW50ID0gQVJJQU1hcHBlci5nZXRBcmlhT3duZWRCeShlbGVtKTtcbiAgICAgICAgICAgICAgICBpZiAoIXBhcmVudCkge1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBET01XYWxrZXIucGFyZW50RWxlbWVudChlbGVtKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICB9IFxuICAgICAgICAgICAgICAgIHdoaWxlIChwYXJlbnQgJiYgcGFyZW50Lm5vZGVUeXBlICE9PSAxKSB7IFxuICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBET01XYWxrZXIucGFyZW50RWxlbWVudChlbGVtKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHBhcmVudEhpZXJhcmNoeSA9IHBhcmVudCA/IHRoaXMuZ2V0Tm9kZUhpZXJhcmNoeShwYXJlbnQpIDogW107XG4gICAgICAgICAgICAgICAgbGV0IHBhcmVudEluZm8gPSBwYXJlbnRIaWVyYXJjaHkubGVuZ3RoID4gMCA/IHBhcmVudEhpZXJhcmNoeVtwYXJlbnRIaWVyYXJjaHkubGVuZ3RoLTFdIDoge1xuICAgICAgICAgICAgICAgICAgICByb2xlOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICByb2xlUGF0aDogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgcm9sZUNvdW50OiB7fSxcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW5DYW5IYXZlUm9sZTogdHJ1ZVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgd2hpbGUgKHBhcmVudEluZm8ucm9sZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnQgPSBBUklBTWFwcGVyLmdldEFyaWFPd25lZEJ5KHBhcmVudCkgfHwgRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQocGFyZW50KSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50SGllcmFyY2h5ID0gcGFyZW50ID8gdGhpcy5nZXROb2RlSGllcmFyY2h5KHBhcmVudCkgOiBbXTtcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50SW5mbyA9IHBhcmVudEhpZXJhcmNoeVtwYXJlbnRIaWVyYXJjaHkubGVuZ3RoLTFdO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFNldCBpbml0aWFsIG5vZGUgaW5mb1xuICAgICAgICAgICAgICAgIGxldCBub2RlSW5mbyA6IHtcbiAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgW3JvbGU6IHN0cmluZ106IHN0cmluZ1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJvdW5kczogYW55LFxuICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgbm9kZTogSFRNTEVsZW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIHJvbGU6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgcm9sZVBhdGg6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgcm9sZUNvdW50OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBbcm9sZTogc3RyaW5nXTogbnVtYmVyXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW5DYW5IYXZlUm9sZTogYm9vbGVhblxuICAgICAgICAgICAgICAgIH0gPSB7XG4gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IGVsZW0ubm9kZVR5cGUgPT09IDEgPyB0aGlzLmdldEF0dHJpYnV0ZXMoZWxlbSk6IHt9LCAgIFxuICAgICAgICAgICAgICAgICAgICBib3VuZHM6IHRoaXMuZ2V0Qm91bmRzKGVsZW0pLFxuICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2U6IHRoaXMuZ2V0TmFtZXNwYWNlKCksXG4gICAgICAgICAgICAgICAgICAgIG5vZGU6IGVsZW0sXG4gICAgICAgICAgICAgICAgICAgIHJvbGU6IHRoaXMuZ2V0Um9sZShlbGVtKSB8fCBudWxsLFxuICAgICAgICAgICAgICAgICAgICByb2xlUGF0aDogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgcm9sZUNvdW50OiB7fSxcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW5DYW5IYXZlUm9sZTogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIEFkanVzdCByb2xlIGlmIHdlJ3JlIHdpdGhpbiBhIHByZXNlbnRhdGlvbmFsIGNvbnRhaW5lclxuICAgICAgICAgICAgICAgIGxldCBwcmVzZW50YXRpb25hbENvbnRhaW5lciA9ICFwYXJlbnRJbmZvLmNoaWxkcmVuQ2FuSGF2ZVJvbGU7XG4gICAgICAgICAgICAgICAgaWYgKHByZXNlbnRhdGlvbmFsQ29udGFpbmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGVJbmZvLnJvbGUgPSBudWxsO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGVJbmZvLmNoaWxkcmVuQ2FuSGF2ZVJvbGUgPSBwYXJlbnRJbmZvLmNoaWxkcmVuQ2FuSGF2ZVJvbGUgXG4gICAgICAgICAgICAgICAgICAgICAgICAmJiB0aGlzLmNoaWxkcmVuQ2FuSGF2ZVJvbGUoZWxlbSwgbm9kZUluZm8ucm9sZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gU2V0IHRoZSBwYXRoc1xuICAgICAgICAgICAgICAgIGlmIChub2RlSW5mby5yb2xlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudEluZm8ucm9sZUNvdW50W25vZGVJbmZvLnJvbGVdID0gKHBhcmVudEluZm8ucm9sZUNvdW50W25vZGVJbmZvLnJvbGVdIHx8IDApICsgMTsgXG4gICAgICAgICAgICAgICAgICAgIG5vZGVJbmZvLnJvbGVQYXRoID0gcGFyZW50SW5mby5yb2xlUGF0aCtcIi9cIitub2RlSW5mby5yb2xlK1wiW1wiK3BhcmVudEluZm8ucm9sZUNvdW50W25vZGVJbmZvLnJvbGVdK1wiXVwiO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGVJbmZvLnJvbGVQYXRoID0gcGFyZW50SW5mby5yb2xlUGF0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIFNldCBoaWVyYXJjaHlcbiAgICAgICAgICAgICAgICBub2RlSGllcmFyY2h5ID0gW11cbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgcGFyZW50SGllcmFyY2h5KSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGVIaWVyYXJjaHkucHVzaChpdGVtKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbm9kZUhpZXJhcmNoeS5wdXNoKG5vZGVJbmZvKTtcbiAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJBUklBTWFwcGVyOjpnZXROb2RlSGllcmFyY2h5XCIsIG5vZGVIaWVyYXJjaHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5vZGVIaWVyYXJjaHk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXNldChub2RlOiBOb2RlKSB7XG4gICAgICAgIEFSSUFNYXBwZXIubmFtZUNvbXB1dGF0aW9uSWQgPSAwO1xuICAgICAgICB0aGlzLmhpZXJhcmNoeVJvbGUgPSBbXTtcbiAgICAgICAgdGhpcy5oaWVyYXJjaHlSZXN1bHRzID0gW107XG4gICAgICAgIHRoaXMuaGllcmFyY2h5UGF0aCA9IFt7XG4gICAgICAgICAgICByb2xlUGF0aDogXCJcIixcbiAgICAgICAgICAgIHJvbGVDb3VudDoge31cbiAgICAgICAgfV07XG4gICAgICAgIC8vIEdldCB0byB0aGUgdG9wbW9zdCBub2RlXG4gICAgICAgIGxldCBnb29kTm9kZSA9IG5vZGU7XG4gICAgICAgIGxldCBuZXh0O1xuICAgICAgICB3aGlsZSAobmV4dCA9IERPTVdhbGtlci5wYXJlbnROb2RlKGdvb2ROb2RlKSkge1xuICAgICAgICAgICAgZ29vZE5vZGUgPSBuZXh0O1xuICAgICAgICB9O1xuICAgICAgICAvLyBXYWxrIHRoZSB0cmVlIGFuZCBzZXQgdGhlIGhpZXJhcmNoaWVzIGluIHRoZSByaWdodCBvcmRlclxuICAgICAgICBsZXQgYXJpYVdhbGtlciA9IG5ldyBBUklBV2Fsa2VyKGdvb2ROb2RlLCBmYWxzZSwgZ29vZE5vZGUpO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgICBpZiAoYXJpYVdhbGtlci5ub2RlLm5vZGVUeXBlID09PSAxKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5nZXROb2RlSGllcmFyY2h5KGFyaWFXYWxrZXIubm9kZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gd2hpbGUgKGFyaWFXYWxrZXIubmV4dE5vZGUoKSk7XG4gICAgfVxuXG4gICAgb3BlblNjb3BlKG5vZGU6IE5vZGUpOiBJTWFwUmVzdWx0W10ge1xuICAgICAgICBpZiAodGhpcy5oaWVyYXJjaHlSb2xlID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0KG5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucHVzaEhpZXJhcmNoeShub2RlKVxuICAgICAgICBmb3IgKGxldCBpZHg9MDsgaWR4PHRoaXMuaGllcmFyY2h5UmVzdWx0cy5sZW5ndGg7ICsraWR4KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5oaWVyYXJjaHlSZXN1bHRzW2lkeF0ucm9sZSAmJiB0aGlzLmhpZXJhcmNoeVJlc3VsdHNbaWR4XS5yb2xlWzBdID09PSBcIi9cIikge1xuICAgICAgICAgICAgICAgIHRoaXMuaGllcmFyY2h5UmVzdWx0c1tpZHhdLnJvbGUgPSAodGhpcy5oaWVyYXJjaHlSZXN1bHRzW2lkeF0ucm9sZSA/IHRoaXMuaGllcmFyY2h5UmVzdWx0c1tpZHhdLnJvbGUuc3Vic3RyaW5nKDEpIDogbnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuaGllcmFyY2h5UmVzdWx0cztcbiAgICB9XG5cbiAgICBwdXNoSGllcmFyY2h5KG5vZGU6IE5vZGUpIHtcbiAgICAgICAgLy8gSWYgd2UncmUgbm90IGFuIGVsZW1lbnQsIG5vIHNwZWNpYWwgaGFuZGxpbmdcbiAgICAgICAgbGV0IG5vZGVIaWVyYXJjaHkgPSBbXVxuICAgICAgICAvLyBEZXRlcm1pbmUgb3VyIG5vZGUgaW5mb1xuICAgICAgICBub2RlSGllcmFyY2h5ID0gdGhpcy5nZXROb2RlSGllcmFyY2h5KG5vZGUpO1xuICAgICAgICBsZXQgbm9kZUluZm8gPSBub2RlSGllcmFyY2h5W25vZGVIaWVyYXJjaHkubGVuZ3RoLTFdO1xuICAgICAgICB0aGlzLmhpZXJhcmNoeVJvbGUucHVzaChub2RlSW5mby5yb2xlKTtcbiAgICAgICAgaWYgKG5vZGVJbmZvLnJvbGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuaGllcmFyY2h5UGF0aC5wdXNoKG5vZGVJbmZvKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaGllcmFyY2h5UmVzdWx0cyA9IG5vZGVIaWVyYXJjaHk7XG4gICAgfVxuXG4gICAgY2xvc2VTY29wZShub2RlOiBOb2RlKTogSU1hcFJlc3VsdFtdIHtcbiAgICAgICAgbGV0IHJldFZhbCA6IElNYXBSZXN1bHRbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHJlcyBvZiB0aGlzLmhpZXJhcmNoeVJlc3VsdHMpIHtcbiAgICAgICAgICAgIC8vIGNvbnN0IHRlbXAgPSByZXMubm9kZTtcbiAgICAgICAgICAgIC8vIHJlcy5ub2RlID0gbnVsbDtcbiAgICAgICAgICAgIC8vIGxldCBjbG9uZWQgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHJlcykpO1xuICAgICAgICAgICAgLy8gY2xvbmVkLm5vZGUgPSByZXMubm9kZSA9IHRlbXA7IFxuICAgICAgICAgICAgLy8gcmV0VmFsLnB1c2goY2xvbmVkKTtcbiAgICAgICAgICAgIHJldFZhbC5wdXNoKHJlcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJldFZhbC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXRWYWxbcmV0VmFsLmxlbmd0aC0xXS5yb2xlID0gXCIvXCIrcmV0VmFsW3JldFZhbC5sZW5ndGgtMV0ucm9sZVxuICAgICAgICAgICAgbGV0IHBhcmVudCA9IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KG5vZGUpO1xuICAgICAgICAgICAgdGhpcy5oaWVyYXJjaHlSZXN1bHRzID0gcGFyZW50ID8gQ2FjaGVVdGlsLmdldENhY2hlKHBhcmVudCBhcyBIVE1MRWxlbWVudCwgXCJBUklBTWFwcGVyOjpnZXROb2RlSW5mb1wiLCBbXSkgOiBbXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAvLyBIZWxwZXIgZnVuY3Rpb25zXG4gICAgLy8vL1xuXG4gICAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWwtYWFtLTEuMC8jbWFwcGluZy1odG1sLXRvLWFjY2Vzc2liaWxpdHktYXBpc1xuICAgIHB1YmxpYyBzdGF0aWMgZWxlbUF0dHJWYWx1ZUNhbGN1bGF0b3JzOiB7IFtub2RlTmFtZTpzdHJpbmddOiB7IFthdHRyOnN0cmluZ106IHN0cmluZyB8IEVsZW1DYWxjIH19ID0ge1xuICAgICAgICBcImdsb2JhbFwiOiB7XG4gICAgICAgICAgICBcIm5hbWVcIjogZWxlbSA9PiBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWUoZWxlbSk/Lm5hbWUgIC8vQVJJQU1hcHBlci5jb21wdXRlTmFtZVxuICAgICAgICB9XG4gICAgICAgICwgXCJkYXRhbGlzdFwiOiB7XG4gICAgICAgICAgICAvLyBzZXQgdG8gXCJ0cnVlXCIgaWYgdGhlIGRhdGFsaXN0J3Mgc2VsZWN0aW9uIG1vZGVsIGFsbG93cyBtdWx0aXBsZSBvcHRpb24gZWxlbWVudHMgdG8gYmVcbiAgICAgICAgICAgIC8vIHNlbGVjdGVkIGF0IGEgdGltZSwgYW5kIFwiZmFsc2VcIiBvdGhlcndpc2VcbiAgICAgICAgICAgIFwibXVsdGlzZWxlY3RhYmxlXCI6IGVsZW0gPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlkID0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJpZFwiKTtcbiAgICAgICAgICAgICAgICBpZiAoaWQgJiYgaWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgaW5wdXQgPSBlbGVtLm93bmVyRG9jdW1lbnQucXVlcnlTZWxlY3RvcihcImlucHV0W2xpc3Q9J1wiK2lkK1wiJ11cIik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIlwiKyhlbGVtLmdldEF0dHJpYnV0ZShcIm11bHRpcGxlXCIpIFxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGVsZW0uZ2V0QXR0cmlidXRlKFwibXVsdGlwbGVcIik9PVwidHJ1ZVwiIHx8IGVsZW0uZ2V0QXR0cmlidXRlKFwibXVsdGlwbGVcIik9PVwiXCIpKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAsIFwiaDFcIjoge1xuICAgICAgICAgICAgXCJsZXZlbFwiOiBcIjFcIlxuICAgICAgICB9XG4gICAgICAgICwgXCJoMlwiOiB7XG4gICAgICAgICAgICBcImxldmVsXCI6IFwiMlwiXG4gICAgICAgIH1cbiAgICAgICAgLCBcImgzXCI6IHtcbiAgICAgICAgICAgIFwibGV2ZWxcIjogXCIzXCJcbiAgICAgICAgfVxuICAgICAgICAsIFwiaDRcIjoge1xuICAgICAgICAgICAgXCJsZXZlbFwiOiBcIjRcIlxuICAgICAgICB9XG4gICAgICAgICwgXCJoNVwiOiB7XG4gICAgICAgICAgICBcImxldmVsXCI6IFwiNVwiXG4gICAgICAgIH1cbiAgICAgICAgLCBcImg2XCI6IHtcbiAgICAgICAgICAgIFwibGV2ZWxcIjogXCI2XCJcbiAgICAgICAgfVxuICAgICAgICAsIFwiaW5wdXRcIjoge1xuICAgICAgICAgICAgLy8gLSB0eXBlPVwiY2hlY2tib3hcIiBzdGF0ZSBzZXQgdG8gXCJtaXhlZFwiIGlmIHRoZSBlbGVtZW50J3MgaW5kZXRlcm1pbmF0ZSBJREwgYXR0cmlidXRlXG4gICAgICAgICAgICAvLyBpcyB0cnVlLCBvciBcInRydWVcIiBpZiB0aGUgZWxlbWVudCdzIGNoZWNrZWRuZXNzIGlzIHRydWUsIG9yIFwiZmFsc2VcIiBvdGhlcndpc2VcbiAgICAgICAgICAgIC8vIC0gdHlwZT1cInJhZGlvXCIgc3RhdGUgc2V0IHRvIFwidHJ1ZVwiIGlmIHRoZSBlbGVtZW50J3MgY2hlY2tlZG5lc3MgaXMgdHJ1ZSwgb3IgXCJmYWxzZVwiXG4gICAgICAgICAgICAvLyBvdGhlcndpc2UuXG4gICAgICAgICAgICBcImNoZWNrZWRcIjogZWxlbSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdHlwZSA9IGVsZW0uZ2V0QXR0cmlidXRlKFwidHlwZVwiKTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gXCJjaGVja2JveFwiIHx8IHR5cGUgPT09IFwicmFkaW9cIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJcIisoZWxlbSBhcyBIVE1MSW5wdXRFbGVtZW50KS5jaGVja2VkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIC0gdHlwZT1cInJhZGlvXCIgYW5kIG5vdCBpbiBtZW51IHJlZmxlY3RpbmcgbnVtYmVyIG9mIHR5cGU9cmFkaW8gaW5wdXQgZWxlbWVudHMgXG4gICAgICAgICAgICAvLyB3aXRoaW4gdGhlIHJhZGlvIGJ1dHRvbiBncm91cFxuICAgICAgICAgICAgLCBcInNldHNpemVcIjogZWxlbSA9PiB7IHJldHVybiBudWxsOyB0aHJvdyBuZXcgRXJyb3IoXCJOT1QgSU1QTEVNRU5URURcIik7IH1cbiAgICAgICAgICAgIC8vIC0gdHlwZT1cInJhZGlvXCIgYW5kIG5vdCBpbiBtZW51IHZhbHVlIHJlZmxlY3RpbmcgdGhlIGVsZW1lbnRzIHBvc2l0aW9uIFxuICAgICAgICAgICAgLy8gd2l0aGluIHRoZSByYWRpbyBidXR0b24gZ3JvdXAuXCJcbiAgICAgICAgICAgICwgXCJwb3NpbnNldFwiOiBlbGVtID0+IHsgcmV0dXJuIG51bGw7IHRocm93IG5ldyBFcnJvcihcIk5PVCBJTVBMRU1FTlRFRFwiKTsgfVxuICAgICAgICAgICAgLy8gaW5wdXQgKHR5cGUgYXR0cmlidXRlIGluIHRoZSBUZXh0LCBTZWFyY2gsIFRlbGVwaG9uZSwgVVJMLCBvciBFLW1haWwgc3RhdGVzIHdpdGggYSBcbiAgICAgICAgICAgIC8vIHN1Z2dlc3Rpb25zIHNvdXJjZSBlbGVtZW50KSBjb21ib2JveCByb2xlLCB3aXRoIHRoZSBhcmlhLW93bnMgcHJvcGVydHkgc2V0IHRvIHRoZSBzYW1lXG4gICAgICAgICAgICAvLyB2YWx1ZSBhcyB0aGUgbGlzdCBhdHRyaWJ1dGVcbiAgICAgICAgICAgICwgXCJvd25zXCI6IGVsZW0gPT4geyByZXR1cm4gbnVsbDsgdGhyb3cgbmV3IEVycm9yKFwiTk9UIElNUExFTUVOVEVEXCIpOyB9XG4gICAgICAgIH1cbiAgICAgICAgLCBcImtleWdlblwiOiB7XG4gICAgICAgICAgICBcIm11bHRpc2VsZWN0YWJsZVwiOiBcImZhbHNlXCJcbiAgICAgICAgfVxuICAgICAgICAsIFwibGlcIjoge1xuICAgICAgICAgICAgLy8gTnVtYmVyIG9mIGxpIGVsZW1lbnRzIHdpdGhpbiB0aGUgb2wsIHVsLCBtZW51XG4gICAgICAgICAgICBcInNldHNpemVcIjogZWxlbSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyZW50ID0gRE9NVXRpbC5nZXRBbmNlc3RvcihlbGVtLCBbXCJvbFwiLCBcInVsXCIsIFwibWVudVwiXSk7XG4gICAgICAgICAgICAgICAgaWYgKCFwYXJlbnQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxpcyA9IENhY2hlVXRpbC5nZXRTZXRDYWNoZShwYXJlbnQsIFwiZWxlbUF0dHJWYWx1ZUNhbGN1bGF0b3JzOjpsaXNcIiwgKCkgPT4gcGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJsaVwiKSk7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3RoZXJsaXMgPSBDYWNoZVV0aWwuZ2V0U2V0Q2FjaGUocGFyZW50LCBcImVsZW1BdHRyVmFsdWVDYWxjdWxhdG9yczo6b3RoZXJsaXNcIiwgKCkgPT4gcGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJvbCBsaSwgdWwgbGksIG1lbnUgbGlcIikpO1xuICAgICAgICAgICAgICAgIHJldHVybiBcIlwiKyhsaXMubGVuZ3RoLW90aGVybGlzLmxlbmd0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBQb3NpdGlvbiBvZiBsaSBlbGVtZW50IHdpdGhpbiB0aGUgb2wsIHVsLCBtZW51XG4gICAgICAgICAgICAsIFwicG9zaW5zZXRcIjogZWxlbSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFyZW50ID0gRE9NVXRpbC5nZXRBbmNlc3RvcihlbGVtLCBbXCJvbFwiLCBcInVsXCIsIFwibWVudVwiXSlcbiAgICAgICAgICAgICAgICBpZiAoIXBhcmVudCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgY29uc3QgbGlzID0gQ2FjaGVVdGlsLmdldFNldENhY2hlKHBhcmVudCwgXCJlbGVtQXR0clZhbHVlQ2FsY3VsYXRvcnM6Omxpc1wiLCAoKSA9PiBwYXJlbnQucXVlcnlTZWxlY3RvckFsbChcImxpXCIpKTtcbiAgICAgICAgICAgICAgICBsZXQgbnVtID0gMDtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpZHg9MDsgaWR4PGxpcy5sZW5ndGg7ICsraWR4KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpID0gbGlzW2lkeF07XG4gICAgICAgICAgICAgICAgICAgIGlmIChET01VdGlsLnNhbWVOb2RlKHBhcmVudCwgRE9NVXRpbC5nZXRBbmNlc3RvcihsaSwgW1wib2xcIiwgXCJ1bFwiLCBcIm1lbnVcIl0pKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiXCIrbnVtO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICsrbnVtO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAsIFwibWVudWl0ZW1cIjoge1xuICAgICAgICAgICAgLy8gdHlwZSA9IGNoZWNrYm94IG9yIHJhZGlvLCBzZXQgdG8gXCJ0cnVlXCIgaWYgdGhlIGNoZWNrZWQgYXR0cmlidXRlIFxuICAgICAgICAgICAgLy8gaXMgcHJlc2VudCwgYW5kIFwiZmFsc2VcIiBvdGhlcndpc2VcbiAgICAgICAgICAgIFwiY2hlY2tlZFwiOiBlbGVtID0+IFwiXCIrISEoZWxlbS5nZXRBdHRyaWJ1dGUoXCJjaGVja2VkXCIpIFxuICAgICAgICAgICAgICAgICYmIChlbGVtLmdldEF0dHJpYnV0ZShcImNoZWNrZWRcIik9PVwidHJ1ZVwiIHx8IGVsZW0uZ2V0QXR0cmlidXRlKFwiY2hlY2tlZFwiKT09XCJcIikpXG4gICAgICAgIH1cbiAgICAgICAgLCBcIm9wdGlvblwiOiB7XG4gICAgICAgICAgICAvLyBzZXQgdG8gXCJ0cnVlXCIgaWYgdGhlIGVsZW1lbnQncyBzZWxlY3RlZG5lc3MgaXMgdHJ1ZSwgb3IgXCJmYWxzZVwiIG90aGVyd2lzZS5cbiAgICAgICAgICAgIFwic2VsZWN0ZWRcIjogZWxlbSA9PiBcIlwiKyEhKGVsZW0uZ2V0QXR0cmlidXRlKFwic2VsZWN0ZWRcIikgXG4gICAgICAgICAgICAgICAgJiYgKGVsZW0uZ2V0QXR0cmlidXRlKFwic2VsZWN0ZWRcIik9PVwidHJ1ZVwiIHx8IGVsZW0uZ2V0QXR0cmlidXRlKFwic2VsZWN0ZWRcIik9PVwiXCIpKVxuICAgICAgICB9XG4gICAgICAgICwgXCJwcm9ncmVzc1wiOiB7XG4gICAgICAgICAgICBcInZhbHVlbWF4XCI6IGVsZW0gPT4gZWxlbS5nZXRBdHRyaWJ1dGUoXCJtYXhcIikgfHwgXCIxXCJcbiAgICAgICAgICAgICwgXCJ2YWx1ZW1pblwiOiBlbGVtID0+IFwiMFwiXG4gICAgICAgICAgICAsIFwidmFsdWVub3dcIjogZWxlbSA9PiBlbGVtLmdldEF0dHJpYnV0ZShcInZhbHVlXCIpXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgdGV4dEF0dHJWYWx1ZUNhbGN1bGF0b3JzOiB7IFthdHRyOnN0cmluZ106IE5vZGVDYWxjIH0gPSB7XG4gICAgICAgIFwibmFtZVwiOiBub2RlID0+IG5vZGUubm9kZVZhbHVlXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgbmFtZUNvbXB1dGF0aW9uSWQgPSAwO1xuICAgIC8qKnB1YmxpYyBzdGF0aWMgY29tcHV0ZU5hbWUoY3VyOiBOb2RlKSA6IHN0cmluZyB7XG4gICAgICAgICsrQVJJQU1hcHBlci5uYW1lQ29tcHV0YXRpb25JZDtcbiAgICAgICAgcmV0dXJuIEFSSUFNYXBwZXIuY29tcHV0ZU5hbWVIZWxwKEFSSUFNYXBwZXIubmFtZUNvbXB1dGF0aW9uSWQsIGN1ciwgZmFsc2UsIGZhbHNlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNvbXB1dGVOYW1lSGVscCh3YWxrSWQ6IG51bWJlciwgY3VyOiBOb2RlLCBsYWJlbGxlZGJ5VHJhdmVyc2U6IGJvb2xlYW4sIHdhbGtUcmF2ZXJzZTogYm9vbGVhbikgOiBzdHJpbmcge1xuICAgICAgICAvLyAyZy4gTm9uZSBvZiB0aGUgb3RoZXIgY29udGVudCBhcHBsaWVzIHRvIHRleHQgbm9kZXMsIHNvIGp1c3QgZG8gdGhpcyBmaXJzdFxuICAgICAgICBpZiAoY3VyLm5vZGVUeXBlID09PSAzICkgcmV0dXJuIGN1ci5ub2RlVmFsdWU7XG4gICAgICAgIGlmIChjdXIubm9kZVR5cGUgPT09IDExKSByZXR1cm4gXCJcIjtcbiAgICAgICAgaWYgKGN1ci5ub2RlVHlwZSAhPT0gMSApIHtcbiAgICAgICAgICAgIGlmICh3YWxrVHJhdmVyc2UgfHwgbGFiZWxsZWRieVRyYXZlcnNlKSByZXR1cm4gXCJcIjtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvciAoXCJDYW4gb25seSBjb21wdXRlIG5hbWUgb24gRWxlbWVudCBhbmQgVGV4dCBcIiArIGN1ci5ub2RlVHlwZSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBlbGVtID0gY3VyIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vIFdlJ3ZlIGJlZW4gaGVyZSBiZWZvcmUgLSBwcmV2ZW50IHJlY3Vyc2lvblxuICAgICAgICBpZiAoQ2FjaGVVdGlsLmdldENhY2hlKGVsZW0sIFwiZGF0YS1uYW1ld2Fsa1wiLCBudWxsKSA9PT0gXCJcIit3YWxrSWQpIHJldHVybiBcIlwiO1xuICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJkYXRhLW5hbWV3YWxrXCIsIFwiXCIrd2Fsa0lkKTtcbiAgICAgICAgLy8gU2VlIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sLWFhbS0xLjAvI2lucHV0LXR5cGUtdGV4dC1pbnB1dC10eXBlLXBhc3N3b3JkLWlucHV0LXR5cGUtc2VhcmNoLWlucHV0LXR5cGUtdGVsLWlucHV0LXR5cGUtdXJsLWFuZC10ZXh0YXJlYS1lbGVtZW50XG5cbiAgICAgICAgLy8gMmEuIE9ubHkgc2hvdyBoaWRkZW4gY29udGVudCBpZiBpdCdzIHJlZmVyZW5jZWQgYnkgYSBsYWJlbGxlZGJ5XG4gICAgICAgIGlmICghbGFiZWxsZWRieVRyYXZlcnNlICYmICFWaXNVdGlsLmlzTm9kZVZpc2libGUoY3VyKSkge1xuICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAyYi4gY29sbGVjdCB2YWxpZCBpZCByZWZlcmVuY2VzXG4gICAgICAgIGlmICghbGFiZWxsZWRieVRyYXZlcnNlICYmIGVsZW0uaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpKSB7XG4gICAgICAgICAgICBsZXQgbGFiZWxsZWRieSA9IGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgIGxldCB2YWxpZEVsZW1zID0gW107XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJlZiBvZiBsYWJlbGxlZGJ5KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVmRWxlbSA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKGN1ciwgcmVmKTtcbiAgICAgICAgICAgICAgICBpZiAocmVmRWxlbSAmJiAhRE9NVXRpbC5zYW1lTm9kZShlbGVtLCByZWZFbGVtKSkge1xuICAgICAgICAgICAgICAgICAgICB2YWxpZEVsZW1zLnB1c2gocmVmRWxlbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHZhbGlkRWxlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCBhY2N1bXVsYXRlZCA9IFwiXCI7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBlbGVtIG9mIHZhbGlkRWxlbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgYWNjdW11bGF0ZWQgKz0gXCIgXCIgKyB0aGlzLmNvbXB1dGVOYW1lSGVscCh3YWxrSWQsIGVsZW0sIHRydWUsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFjY3VtdWxhdGVkLnRyaW0oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNpbmNlIG5vZGVUb1JvbGUgY2FsbHMgYmFjayBoZXJlIGZvciBmb3JtIGFuZCBzZWN0aW9uLCB3ZSBuZWVkIHNwZWNpYWwgY2FzaW5nIGhlcmUgdG8gaGFuZGxlIHRob3NlIHR3byBjYXNlc1xuICAgICAgICBpZiAoW1wic2VjdGlvblwiLCBcImZvcm1cIl0uaW5jbHVkZXMoY3VyLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICAgICAgICBpZiAoZWxlbS5oYXNBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIpICYmIGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKS50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIC8vIElmIEknbSBub3QgYW4gZW1iZWRkZWQgY29udHJvbCBvciBJJ20gbm90IHJlY3Vyc2luZywgcmV0dXJuIHRoZSBhcmlhLWxhYmVsXG4gICAgICAgICAgICAgICAgaWYgKCFsYWJlbGxlZGJ5VHJhdmVyc2UgJiYgIXdhbGtUcmF2ZXJzZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIpLnRyaW0oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZWxlbS5oYXNBdHRyaWJ1dGUoXCJ0aXRsZVwiKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZShcInRpdGxlXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAyYy4gSWYgbGFiZWwgb3Igd2FsaywgYW5kIHRoaXMgaXMgYSBjb250cm9sLCBza2lwIHRvIHRoZSB2YWx1ZSwgb3RoZXJ3aXNlIHByb3ZpZGUgdGhlIGxhYmVsXG4gICAgICAgIGNvbnN0IHJvbGUgPSBBUklBTWFwcGVyLm5vZGVUb1JvbGUoY3VyKTtcbiAgICAgICAgbGV0IGlzRW1iZWRkZWRDb250cm9sID0gW1xuICAgICAgICAgICAgXCJ0ZXh0Ym94XCIsIFwiYnV0dG9uXCIsIFwiY29tYm9ib3hcIiwgXCJsaXN0Ym94XCIsIFxuICAgICAgICAgICAgXCJwcm9ncmVzc2JhclwiLCBcInNjcm9sbGJhclwiLCBcInNsaWRlclwiLCBcInNwaW5idXR0b25cIlxuICAgICAgICBdLmluY2x1ZGVzKHJvbGUpO1xuICAgICAgICBpZiAoZWxlbS5oYXNBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIpICYmIGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKS50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy8gSWYgSSdtIG5vdCBhbiBlbWJlZGRlZCBjb250cm9sIG9yIEknbSBub3QgcmVjdXJzaW5nLCByZXR1cm4gdGhlIGFyaWEtbGFiZWxcbiAgICAgICAgICAgIGlmICghbGFiZWxsZWRieVRyYXZlcnNlICYmICF3YWxrVHJhdmVyc2UgfHwgIWlzRW1iZWRkZWRDb250cm9sKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKS50cmltKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyAyZC4gXG4gICAgICAgIGlmIChyb2xlICE9PSBcInByZXNlbnRhdGlvblwiICYmIHJvbGUgIT09IFwibm9uZVwiKSB7XG4gICAgICAgICAgICBpZiAoKGN1ci5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImltZ1wiIHx8IGN1ci5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImFyZWFcIikgJiYgZWxlbS5oYXNBdHRyaWJ1dGUoXCJhbHRcIikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gRE9NVXRpbC5jbGVhbldoaXRlc3BhY2UoZWxlbS5nZXRBdHRyaWJ1dGUoXCJhbHRcIikpLnRyaW0oKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGN1ci5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImlucHV0XCIgJiYgZWxlbS5oYXNBdHRyaWJ1dGUoXCJpZFwiKSAmJiBlbGVtLmdldEF0dHJpYnV0ZShcImlkXCIpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgbGFiZWwgPSBlbGVtLm93bmVyRG9jdW1lbnQucXVlcnlTZWxlY3RvcihcImxhYmVsW2Zvcj0nXCIrZWxlbS5nZXRBdHRyaWJ1dGUoXCJpZFwiKStcIiddXCIpO1xuICAgICAgICAgICAgICAgIGlmIChsYWJlbCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobGFiZWwuaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKSB8fCAobGFiZWwuaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpICYmICFDb21tb25VdGlsLmlzSWRSZWZlclRvU2VsZihjdXIsIGxhYmVsLmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKSkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb21wdXRlTmFtZUhlbHAod2Fsa0lkLCBsYWJlbCwgZmFsc2UsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsYWJlbC50ZXh0Q29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjdXIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJmaWVsZHNldFwiKSB7XG4gICAgICAgICAgICAgICAgaWYoICg8RWxlbWVudD5jdXIpLnF1ZXJ5U2VsZWN0b3IoXCJsZWdlbmRcIikpe1xuICAgICAgICAgICAgICAgICAgICBsZXQgbGVnZW5kID0gKDxFbGVtZW50PmN1cikucXVlcnlTZWxlY3RvcihcImxlZ2VuZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlZ2VuZC5pbm5lclRleHQ7XG4gICAgICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXB1dGVOYW1lSGVscCh3YWxrSWQsIGN1ciwgZmFsc2UsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDJlLlxuICAgICAgICBpZiAoKHdhbGtUcmF2ZXJzZSB8fCBsYWJlbGxlZGJ5VHJhdmVyc2UpICYmIGlzRW1iZWRkZWRDb250cm9sKSB7XG4gICAgICAgICAgICAvLyBJZiB0aGUgZW1iZWRkZWQgY29udHJvbCBoYXMgcm9sZSB0ZXh0Ym94LCByZXR1cm4gaXRzIHZhbHVlLlxuICAgICAgICAgICAgaWYgKHJvbGUgPT09IFwidGV4dGJveFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbnB1dFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcInZhbHVlXCIpKSByZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB3YWxrVHJhdmVyc2UgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIElmIHRoZSBlbWJlZGRlZCBjb250cm9sIGhhcyByb2xlIGJ1dHRvbiwgcmV0dXJuIHRoZSB0ZXh0IGFsdGVybmF0aXZlIG9mIHRoZSBidXR0b24uXG4gICAgICAgICAgICBpZiAocm9sZSA9PT0gXCJidXR0b25cIikge1xuICAgICAgICAgICAgICAgIGlmIChlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiaW5wdXRcIikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdHlwZSA9IGVsZW0uZ2V0QXR0cmlidXRlKFwidHlwZVwiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoW1wiYnV0dG9uXCIsIFwic3VibWl0XCIsIFwicmVzZXRcIl0uaW5jbHVkZXModHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcInZhbHVlXCIpKSByZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09PSBcInN1Ym1pdFwiKSByZXR1cm4gXCJTdWJtaXRcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09PSBcInJlc2V0XCIpIHJldHVybiBcIlJlc2V0XCI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB3YWxrVHJhdmVyc2UgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFRPRE86IElmIHRoZSBlbWJlZGRlZCBjb250cm9sIGhhcyByb2xlIGNvbWJvYm94IG9yIGxpc3Rib3gsIHJldHVybiB0aGUgdGV4dCBhbHRlcm5hdGl2ZSBvZiB0aGUgY2hvc2VuIG9wdGlvbi5cbiAgICAgICAgICAgIGlmIChyb2xlID09PSBcImNvbWJvYm94XCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbS5oYXNBdHRyaWJ1dGUoXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNlbGVjdGVkID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQoZWxlbSwgXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZCAmJiAhRE9NVXRpbC5zYW1lTm9kZShlbGVtLCBzZWxlY3RlZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBUklBTWFwcGVyLmNvbXB1dGVOYW1lSGVscCh3YWxrSWQsIHNlbGVjdGVkLCBmYWxzZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJZiB0aGUgZW1iZWRkZWQgY29udHJvbCBoYXMgcm9sZSByYW5nZSAoZS5nLiwgYSBzcGluYnV0dG9uIG9yIHNsaWRlcik6XG4gICAgICAgICAgICBpZiAoW1wicHJvZ3Jlc3NiYXJcIiwgXCJzY3JvbGxiYXJcIiwgXCJzbGlkZXJcIiwgXCJzcGluYnV0dG9uXCJdLmluY2x1ZGVzKHJvbGUpKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIGFyaWEtdmFsdWV0ZXh0IHByb3BlcnR5IGlzIHByZXNlbnQsIHJldHVybiBpdHMgdmFsdWUsXG4gICAgICAgICAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwiYXJpYS12YWx1ZXRleHRcIikpIHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtdmFsdWV0ZXh0XCIpO1xuICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgaWYgdGhlIGFyaWEtdmFsdWVub3cgcHJvcGVydHkgaXMgcHJlc2VudCwgcmV0dXJuIGl0cyB2YWx1ZSxcbiAgICAgICAgICAgICAgICBpZiAoZWxlbS5oYXNBdHRyaWJ1dGUoXCJhcmlhLXZhbHVlbm93XCIpKSByZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLXZhbHVlbm93XCIpO1xuICAgICAgICAgICAgICAgIC8vIFRPRE86IE90aGVyd2lzZSwgdXNlIHRoZSB2YWx1ZSBhcyBzcGVjaWZpZWQgYnkgYSBob3N0IGxhbmd1YWdlIGF0dHJpYnV0ZS5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDJmLiAyaC5cbiAgICAgICAgaWYgKHdhbGtUcmF2ZXJzZSB8fCBBUklBRGVmaW5pdGlvbnMubmFtZUZyb21Db250ZW50KHJvbGUpIHx8IGxhYmVsbGVkYnlUcmF2ZXJzZSkge1xuICAgICAgICAgICAgLy8gMmZpLiBTZXQgdGhlIGFjY3VtdWxhdGVkIHRleHQgdG8gdGhlIGVtcHR5IHN0cmluZy5cbiAgICAgICAgICAgIGxldCBhY2N1bXVsYXRlZCA9IFwiXCI7XG4gICAgICAgICAgICAvLyAyZmlpLiBDaGVjayBmb3IgQ1NTIGdlbmVyYXRlZCB0ZXh0dWFsIGNvbnRlbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IG5vZGUgYW5kIFxuICAgICAgICAgICAgLy8gaW5jbHVkZSBpdCBpbiB0aGUgYWNjdW11bGF0ZWQgdGV4dC4gVGhlIENTUyA6YmVmb3JlIGFuZCA6YWZ0ZXIgcHNldWRvIGVsZW1lbnRzIFtDU1MyXSBcbiAgICAgICAgICAgIC8vIGNhbiBwcm92aWRlIHRleHR1YWwgY29udGVudCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIGEgY29udGVudCBtb2RlbC5cbiAgICAgICAgICAgIC8vICAgRm9yIDpiZWZvcmUgcHNldWRvIGVsZW1lbnRzLCBVc2VyIGFnZW50cyBNVVNUIHByZXBlbmQgQ1NTIHRleHR1YWwgY29udGVudCwgd2l0aG91dCBcbiAgICAgICAgICAgIC8vICAgICBhIHNwYWNlLCB0byB0aGUgdGV4dHVhbCBjb250ZW50IG9mIHRoZSBjdXJyZW50IG5vZGUuXG4gICAgICAgICAgICAvLyAgIEZvciA6YWZ0ZXIgcHNldWRvIGVsZW1lbnRzLCBVc2VyIGFnZW50cyBNVVNUIGFwcGVuZCBDU1MgdGV4dHVhbCBjb250ZW50LCB3aXRob3V0IGEgXG4gICAgICAgICAgICAvLyAgICAgc3BhY2UsIHRvIHRoZSB0ZXh0dWFsIGNvbnRlbnQgb2YgdGhlIGN1cnJlbnQgbm9kZS5cbiAgICAgICAgICAgIGxldCBiZWZvcmUgPSBudWxsO1xuICAgICAgICAgICAgYmVmb3JlID0gZWxlbS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoZWxlbSxcImJlZm9yZVwiKS5jb250ZW50O1xuXG4gICAgICAgICAgICBpZiAoYmVmb3JlICYmIGJlZm9yZSAhPT0gXCJub25lXCIpIHtcbiAgICAgICAgICAgICAgICBiZWZvcmUgPSBiZWZvcmUucmVwbGFjZSgvXlwiLyxcIlwiKS5yZXBsYWNlKC9cIiQvLFwiXCIpO1xuICAgICAgICAgICAgICAgIGFjY3VtdWxhdGVkICs9IGJlZm9yZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIDJmaWlpLiBGb3IgZWFjaCBjaGlsZCBub2RlIG9mIHRoZSBjdXJyZW50IG5vZGU6XG4gICAgICAgICAgICAvLyAgIFNldCB0aGUgY3VycmVudCBub2RlIHRvIHRoZSBjaGlsZCBub2RlLlxuICAgICAgICAgICAgLy8gICBDb21wdXRlIHRoZSB0ZXh0IGFsdGVybmF0aXZlIG9mIHRoZSBjdXJyZW50IG5vZGUgYmVnaW5uaW5nIHdpdGggc3RlcCAyLiBTZXQgdGhlIHJlc3VsdCBcbiAgICAgICAgICAgIC8vICAgICB0byB0aGF0IHRleHQgYWx0ZXJuYXRpdmUuXG4gICAgICAgICAgICAvLyAgIEFwcGVuZCB0aGUgcmVzdWx0IHRvIHRoZSBhY2N1bXVsYXRlZCB0ZXh0LlxuICAgICAgICAgICAgaWYgKGVsZW0ubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJTTE9UXCIpIHtcbiAgICAgICAgICAgICAgICAvL2lmIG5vIGFzc2lnbmVkTm9kZSwgY2hlY2sgaXRzIG93biB0ZXh0IFxuICAgICAgICAgICAgICAgIGlmICghKGVsZW0gYXMgSFRNTFNsb3RFbGVtZW50KS5hc3NpZ25lZE5vZGVzKCkgfHwgKGVsZW0gYXMgSFRNTFNsb3RFbGVtZW50KS5hc3NpZ25lZE5vZGVzKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpbm5lclRleHQgPSBDb21tb25VdGlsLmdldElubmVyVGV4dChlbGVtKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlubmVyVGV4dCAmJiBpbm5lclRleHQgIT09IG51bGwgJiYgaW5uZXJUZXh0LnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgYWNjdW11bGF0ZWQgKz0gIFwiIFwiICsgaW5uZXJUZXh0O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7ICAgIFxuICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayB0ZXh0IGZyb20gYWxsIGFzc2lnbmVkIG5vZGVzXG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc2xvdENoaWxkIG9mIChlbGVtIGFzIEhUTUxTbG90RWxlbWVudCkuYXNzaWduZWROb2RlcygpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmV4dENoaWxkQ29udGVudCA9IEFSSUFNYXBwZXIuY29tcHV0ZU5hbWVIZWxwKHdhbGtJZCwgc2xvdENoaWxkLCBsYWJlbGxlZGJ5VHJhdmVyc2UsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYWNjdW11bGF0ZWQgKz0gXCIgXCIgKyBuZXh0Q2hpbGRDb250ZW50O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgd2Fsa0NoaWxkID0gZWxlbS5maXJzdENoaWxkO1xuICAgICAgICAgICAgICAgIHdoaWxlICh3YWxrQ2hpbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5leHRDaGlsZENvbnRlbnQgPSBBUklBTWFwcGVyLmNvbXB1dGVOYW1lSGVscCh3YWxrSWQsIHdhbGtDaGlsZCwgbGFiZWxsZWRieVRyYXZlcnNlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgYWNjdW11bGF0ZWQgKz0gXCIgXCIgKyBuZXh0Q2hpbGRDb250ZW50O1xuICAgICAgICAgICAgICAgICAgICB3YWxrQ2hpbGQgPSB3YWxrQ2hpbGQubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgYWZ0ZXIgPSBudWxsO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBhZnRlciA9IGVsZW0ub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKGVsZW0sXCJhZnRlclwiKS5jb250ZW50O1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge31cblxuICAgICAgICAgICAgaWYgKGFmdGVyICYmIGFmdGVyICE9PSBcIm5vbmVcIikge1xuICAgICAgICAgICAgICAgIGFmdGVyID0gYWZ0ZXIucmVwbGFjZSgvXlwiLyxcIlwiKS5yZXBsYWNlKC9cIiQvLFwiXCIpO1xuICAgICAgICAgICAgICAgIGFjY3VtdWxhdGVkICs9IGFmdGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gMmZpdi4gUmV0dXJuIHRoZSBhY2N1bXVsYXRlZCB0ZXh0LlxuICAgICAgICAgICAgYWNjdW11bGF0ZWQgPSBhY2N1bXVsYXRlZC5yZXBsYWNlKC9cXHMrL2csXCIgXCIpLnRyaW0oKTtcbiAgICAgICAgICAgIGlmIChhY2N1bXVsYXRlZC50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhY2N1bXVsYXRlZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDJpLiBPdGhlcndpc2UsIGlmIHRoZSBjdXJyZW50IG5vZGUgaGFzIGEgVG9vbHRpcCBhdHRyaWJ1dGUsIHJldHVybiBpdHMgdmFsdWUuXG4gICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcInRpdGxlXCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoXCJ0aXRsZVwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZWxlbS50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwic3ZnXCIpIHtcbiAgICAgICAgICAgIGxldCB0aXRsZSA9IGVsZW0ucXVlcnlTZWxlY3RvcihcInRpdGxlXCIpO1xuICAgICAgICAgICAgaWYgKHRpdGxlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRpdGxlLnRleHRDb250ZW50IHx8IHRpdGxlLmlubmVyVGV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cbiAgICAqL1xuLyogICAgICAgIGlmIChyb2xlIGluIEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1xuICAgICAgICAgICAgJiYgQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVdLm5hbWVGcm9tIFxuICAgICAgICAgICAgJiYgQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVdLm5hbWVGcm9tLmluY2x1ZGVzKFwiY29udGVudHNcIikpIFxuICAgICAgICB7XG4gICAgICAgICAgICBuYW1lID0gZWxlbS50ZXh0Q29udGVudDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImlucHV0XCIgJiYgZWxlbS5oYXNBdHRyaWJ1dGUoXCJpZFwiKSAmJiBlbGVtLmdldEF0dHJpYnV0ZShcImlkXCIpLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBuYW1lID0gZWxlbS5vd25lckRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJsYWJlbFtmb3I9J1wiK2VsZW0uZ2V0QXR0cmlidXRlKFwiaWRcIikudHJpbSgpK1wiJ11cIikudGV4dENvbnRlbnQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKSkge1xuICAgICAgICAgICAgbmFtZSA9IGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZWxlbS5oYXNBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsbGVkYnlcIikpIHtcbiAgICAgICAgICAgIG5hbWUgPSBcIlwiO1xuICAgICAgICAgICAgY29uc3QgaWRzID0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsbGVkYnlcIikuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBpZCBvZiBpZHMpIHtcbiAgICAgICAgICAgICAgICBuYW1lICs9IEZyYWdtZW50VXRpbC5nZXRCeUlkKGVsZW0sIGlkKS50ZXh0Q29udGVudCArIFwiIFwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbmFtZSA9IG5hbWUudHJpbSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuYW1lO1xuICAgIH0qL1xuXG4gICAgcHVibGljIHN0YXRpYyBub2RlVG9Sb2xlKG5vZGUgOiBOb2RlKSB7XG4gICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSAzIC8qIE5vZGUuVEVYVF9OT0RFICovKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJ0ZXh0XCI7XG4gICAgICAgIH0gZWxzZSBpZiAobm9kZS5ub2RlVHlwZSAhPT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLykge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZWxlbSA9IG5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgaWYgKCFlbGVtIHx8IGVsZW0ubm9kZVR5cGUgIT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8pIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVE8gRE86IHVzZSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUoZWxlbSkgdG8gcmVwbGFjZSB0aGUgY29kZSBmb2xsb3dpbmcsIHdoaWNoIHVzZXMgb25seSB0aGUgdmFsaWQgcm9sZXMgZm9yIHRoZSBlbGVtZW50IGJhc2VkIG9uIHRoZSBhcmlhIGZhbGxiYWNrIHJ1bGVcbiAgICAgICAgLy9jb25zdCByb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKGVsZW0pO1xuICAgICAgICAvL3JldHVybiByb2xlID09PSBcInByZXNlbnRhdGlvblwiIHx8IHJvbGUgPT09IFwibm9uZVwiID8gbnVsbCA6IHJvbGU7XG4gICAgICAgIFxuICAgICAgICBpZiAoZWxlbS5oYXNBdHRyaWJ1dGUoXCJyb2xlXCIpICYmIGVsZW0uZ2V0QXR0cmlidXRlKFwicm9sZVwiKS50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGV0IHJvbGVTdHIgPSBlbGVtLmdldEF0dHJpYnV0ZShcInJvbGVcIikudHJpbSgpO1xuICAgICAgICAgICAgbGV0IHJvbGVzID0gcm9sZVN0ci5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJvbGUgb2Ygcm9sZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAocm9sZSA9PT0gXCJwcmVzZW50YXRpb25cIiB8fCByb2xlID09PSBcIm5vbmVcIikge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiBlbGVtZW50IGlzIGZvY3VzYWJsZSwgdGhlbiBwcmVzZW50YXRpb24gcm9sZXMgYXJlIHRvIGJlIGlnbm9yZWRcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFDb21tb25VdGlsLmlzRm9jdXNhYmxlKGVsZW0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocm9sZSBpbiBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJvbGU7XG4gICAgICAgICAgICAgICAgfSAgICBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvL3JldHVybiB0aGlzLmVsZW1Ub0ltcGxpY2l0Um9sZShlbGVtKTtcbiAgICAgICAgY29uc3Qgcm9sZXMgPSBBcmlhVXRpbC5nZXRJbXBsaWNpdFJvbGUoZWxlbSk7XG4gICAgICAgIC8vY29uc29sZS5sb2coXCJub2RlPVwiICsgbm9kZS5ub2RlTmFtZSArXCIsIHJvbGU9IFwiICsgKHJvbGVzID8gcm9sZXNbMF0gOiBudWxsKSArXCIsIHJlc29sdmVkPVwiICsgQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKGVsZW0pKTtcbiAgICAgICAgY29uc3Qgcm9sZSA9ICFyb2xlcyB8fCByb2xlcy5sZW5ndGggPT09MCA/IG51bGwgOiByb2xlc1swXTtcbiAgICAgICAgcmV0dXJuIHJvbGUgPT09IFwicHJlc2VudGF0aW9uXCIgfHwgcm9sZSA9PT0gXCJub25lXCIgPyBudWxsIDogcm9sZTtcbiAgICAgICAgLy9yZXR1cm4gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKGVsZW0pO1xuICAgICAgICBcbiAgICB9XG59IFxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcbmltcG9ydCB7IEFSSUFNYXBwZXIgfSBmcm9tIFwiLi9BUklBTWFwcGVyXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3Y0L3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4uL2RvbS9ET01XYWxrZXJcIjtcblxuLyoqXG4gKiBXYWxrcyBpbiBhbiBBUklBIG9yZGVyXG4gKiBcbiAqIFNlZSBhbHNvIC4uL2RvbS9ET01XYWxrZXJcbiAqL1xuZXhwb3J0IGNsYXNzIEFSSUFXYWxrZXIge1xuICAgIHJvb3QgOiBOb2RlO1xuICAgIG5vZGUgOiBOb2RlO1xuICAgIGJFbmRUYWc6IGJvb2xlYW47XG5cbiAgICBjb25zdHJ1Y3RvcihlbGVtZW50IDogTm9kZSwgYkVuZD8gOiBib29sZWFuLCByb290PyA6IE5vZGUpIHtcbiAgICAgICAgdGhpcy5yb290ID0gcm9vdCB8fCBlbGVtZW50O1xuICAgICAgICBpZiAodGhpcy5yb290Lm5vZGVUeXBlID09PSA5KSB7XG4gICAgICAgICAgICB0aGlzLnJvb3QgPSAodGhpcy5yb290IGFzIERvY3VtZW50KS5kb2N1bWVudEVsZW1lbnRcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm5vZGUgPSBlbGVtZW50O1xuICAgICAgICAvLyBpZiAodGhpcy5ub2RlLm5vZGVUeXBlID09PSA5KSB7XG4gICAgICAgIC8vICAgICB0aGlzLm5vZGUgPSAodGhpcy5ub2RlIGFzIERvY3VtZW50KS5kb2N1bWVudEVsZW1lbnRcbiAgICAgICAgLy8gfVxuICAgICAgICB0aGlzLmJFbmRUYWcgPSAoYkVuZCA9PSB1bmRlZmluZWQgPyBmYWxzZSA6IGJFbmQgPT0gdHJ1ZSk7XG4gICAgfVxuXG4gICAgYXRSb290KCkgOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCh0aGlzIGFzIGFueSkub3duZXJFbGVtZW50KSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLnJvb3QgPT09IHRoaXMubm9kZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5yb290LmlzU2FtZU5vZGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJvb3QuaXNTYW1lTm9kZSh0aGlzLm5vZGUpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucm9vdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucm9vdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbih0aGlzLm5vZGUpID09PSAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gTm90IHN1cHBvcnRlZCBpbiB0aGlzIGVudmlyb25tZW50IC0gdHJ5IG91ciBiZXN0XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5ub2RlLnBhcmVudE5vZGUgPT09IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZXh0Tm9kZSgpIDogYm9vbGVhbiB7XG4gICAgICAgIGxldCBza2lwT3duZWQgPSBmYWxzZTtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgc2tpcE93bmVkID0gZmFsc2U7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyh0aGlzLm5vZGUubm9kZU5hbWUsIHRoaXMuYkVuZFRhZz9cIkVORFwiOlwiU1RBUlRcIiwgdGhpcy5ub2RlLm5vZGVUeXBlID09PSAxICYmICh0aGlzLm5vZGUgYXMgYW55KS5nZXRBdHRyaWJ1dGUoXCJpZFwiKSk7XG4gICAgICAgICAgICBpZiAoIXRoaXMuYkVuZFRhZykge1xuICAgICAgICAgICAgICAgIGxldCBpZnJhbWVOb2RlID0gKHRoaXMubm9kZSBhcyBIVE1MSUZyYW1lRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgbGV0IGVsZW1lbnROb2RlID0gKHRoaXMubm9kZSBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgbGV0IHNsb3RFbGVtZW50ID0gKHRoaXMubm9kZSBhcyBIVE1MU2xvdEVsZW1lbnQpXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLyBcbiAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5ub2RlLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiSUZSQU1FXCJcbiAgICAgICAgICAgICAgICAgICAgJiYgVmlzVXRpbC5pc05vZGVWaXNpYmxlKGlmcmFtZU5vZGUpXG4gICAgICAgICAgICAgICAgICAgICYmIGlmcmFtZU5vZGUuY29udGVudERvY3VtZW50XG4gICAgICAgICAgICAgICAgICAgICYmIGlmcmFtZU5vZGUuY29udGVudERvY3VtZW50LmRvY3VtZW50RWxlbWVudClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBvd25lckVsZW1lbnQgPSB0aGlzLm5vZGU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IGlmcmFtZU5vZGUuY29udGVudERvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMubm9kZSBhcyBhbnkpLm93bmVyRWxlbWVudCA9IG93bmVyRWxlbWVudDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLyBcbiAgICAgICAgICAgICAgICAgICAgJiYgVmlzVXRpbC5pc05vZGVWaXNpYmxlKGVsZW1lbnROb2RlKVxuICAgICAgICAgICAgICAgICAgICAmJiBlbGVtZW50Tm9kZS5zaGFkb3dSb290XG4gICAgICAgICAgICAgICAgICAgICYmIGVsZW1lbnROb2RlLnNoYWRvd1Jvb3QuZmlyc3RDaGlsZClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBvd25lckVsZW1lbnQgPSB0aGlzLm5vZGU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IGVsZW1lbnROb2RlLnNoYWRvd1Jvb3Q7XG4gICAgICAgICAgICAgICAgICAgICh0aGlzLm5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQgPSBvd25lckVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIERPTVdhbGtlci5hc3NpZ25TbG90cyh0aGlzLm5vZGUgYXMgU2hhZG93Um9vdCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgXG4gICAgICAgICAgICAgICAgICAgICYmIGVsZW1lbnROb2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwic2xvdFwiXG4gICAgICAgICAgICAgICAgICAgICYmIHNsb3RFbGVtZW50LmFzc2lnbmVkTm9kZXMoKS5sZW5ndGggPiAwKSBcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHNsb3RFbGVtZW50LmFzc2lnbmVkTm9kZXMoKVswXTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8gfHwgdGhpcy5ub2RlLm5vZGVUeXBlID09PSAxMSAvKiBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUgKi8pIFxuICAgICAgICAgICAgICAgICAgICAmJiBET01XYWxrZXIuZmlyc3RDaGlsZE5vdE93bmVkQnlTbG90KHRoaXMubm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gRE9NV2Fsa2VyLmZpcnN0Q2hpbGROb3RPd25lZEJ5U2xvdCh0aGlzLm5vZGUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hdFJvb3QoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgodGhpcy5ub2RlIGFzIGFueSkuc2xvdE93bmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzbG90T3duZXIgPSAodGhpcy5ub2RlIGFzIGFueSkuc2xvdE93bmVyO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbmV4dFNsb3RJbmRleCA9ICh0aGlzLm5vZGUgYXMgYW55KS5zbG90SW5kZXgrMTtcbiAgICAgICAgICAgICAgICAgICAgLy8gZGVsZXRlICh0aGlzLm5vZGUgYXMgYW55KS5zbG90T3duZXI7XG4gICAgICAgICAgICAgICAgICAgIC8vIGRlbGV0ZSAodGhpcy5ub2RlIGFzIGFueSkuc2xvdEluZGV4O1xuICAgICAgICAgICAgICAgICAgICBpZiAobmV4dFNsb3RJbmRleCA8IHNsb3RPd25lci5hc3NpZ25lZE5vZGVzKCkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBzbG90T3duZXIuYXNzaWduZWROb2RlcygpW25leHRTbG90SW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBzbG90T3duZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgodGhpcy5ub2RlIGFzIGFueSkub3duZXJFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9ICh0aGlzLm5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChET01XYWxrZXIubmV4dFNpYmxpbmdOb3RPd25lZEJ5U2xvdCh0aGlzLm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IERPTVdhbGtlci5uZXh0U2libGluZ05vdE93bmVkQnlTbG90KHRoaXMubm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBza2lwT3duZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5ub2RlLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubm9kZS5wYXJlbnROb2RlLm5vZGVUeXBlID09PSAxICYmICh0aGlzLm5vZGUucGFyZW50Tm9kZSBhcyBIVE1MRWxlbWVudCkuaGFzQXR0cmlidXRlKFwiYXJpYS1vd25zXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgb3duSWRzID0gKHRoaXMubm9kZS5wYXJlbnROb2RlIGFzIEhUTUxFbGVtZW50KS5nZXRBdHRyaWJ1dGUoXCJhcmlhLW93bnNcIikuc3BsaXQoLyArL2cpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubm9kZS5ub2RlVHlwZSAhPT0gMSB8fCAhKHRoaXMubm9kZSBhcyBIVE1MRWxlbWVudCkuaGFzQXR0cmlidXRlKFwiaWRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBGcmFnbWVudFV0aWwuZ2V0T3duZXJGcmFnbWVudCh0aGlzLm5vZGUpLmdldEVsZW1lbnRCeUlkKG93bklkc1swXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpZHggPSBvd25JZHMuaW5kZXhPZigodGhpcy5ub2RlIGFzIEhUTUxFbGVtZW50KS5nZXRBdHRyaWJ1dGUoXCJpZFwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlkeCA9PT0gb3duSWRzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGFzdCBvbmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gdGhpcy5ub2RlLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IHRydWU7ICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ3JhYiBuZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IEZyYWdtZW50VXRpbC5nZXRPd25lckZyYWdtZW50KHRoaXMubm9kZSkuZ2V0RWxlbWVudEJ5SWQob3duSWRzW2lkeCsxXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSB0aGlzLm5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IHdoaWxlIChcbiAgICAgICAgICAgICh0aGlzLm5vZGUubm9kZVR5cGUgIT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8gJiYgdGhpcy5ub2RlLm5vZGVUeXBlICE9PSAxMSAmJiB0aGlzLm5vZGUubm9kZVR5cGUgIT09IDMgLyogTm9kZS5URVhUX05PREUgKi8pXG4gICAgICAgICAgICB8fCAodGhpcy5ub2RlLm5vZGVUeXBlID09PSAxICYmICh0aGlzLm5vZGUgYXMgRWxlbWVudCkuZ2V0QXR0cmlidXRlKFwiYUNoZWNrZXJcIikgPT09IFwiQUNFXCIpXG4gICAgICAgICAgICB8fCAoc2tpcE93bmVkICYmIHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSAmJiAhIUFSSUFNYXBwZXIuZ2V0QXJpYU93bmVkQnkodGhpcy5ub2RlIGFzIEhUTUxFbGVtZW50KSlcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcHJldk5vZGUoKSA6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgc2tpcE93bmVkID0gZmFsc2U7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIHNraXBPd25lZCA9IGZhbHNlO1xuICAgICAgICAgICAgaWYgKHRoaXMuYkVuZFRhZykge1xuICAgICAgICAgICAgICAgIGxldCBpZnJhbWVOb2RlID0gKHRoaXMubm9kZSBhcyBIVE1MSUZyYW1lRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgbGV0IGVsZW1lbnROb2RlID0gKHRoaXMubm9kZSBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLyBcbiAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5ub2RlLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiSUZSQU1FXCJcbiAgICAgICAgICAgICAgICAgICAgJiYgVmlzVXRpbC5pc05vZGVWaXNpYmxlKGlmcmFtZU5vZGUpXG4gICAgICAgICAgICAgICAgICAgICYmIGlmcmFtZU5vZGUuY29udGVudERvY3VtZW50XG4gICAgICAgICAgICAgICAgICAgICYmIGlmcmFtZU5vZGUuY29udGVudERvY3VtZW50LmRvY3VtZW50RWxlbWVudCkgXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb3duZXJFbGVtZW50ID0gdGhpcy5ub2RlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBpZnJhbWVOb2RlLmNvbnRlbnREb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICh0aGlzLm5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQgPSBvd25lckVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8gXG4gICAgICAgICAgICAgICAgICAgICYmIFZpc1V0aWwuaXNOb2RlVmlzaWJsZShlbGVtZW50Tm9kZSlcbiAgICAgICAgICAgICAgICAgICAgJiYgZWxlbWVudE5vZGUuc2hhZG93Um9vdFxuICAgICAgICAgICAgICAgICAgICAmJiBlbGVtZW50Tm9kZS5zaGFkb3dSb290Lmxhc3RDaGlsZCkgXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb3duZXJFbGVtZW50ID0gdGhpcy5ub2RlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBlbGVtZW50Tm9kZS5zaGFkb3dSb290O1xuICAgICAgICAgICAgICAgICAgICAodGhpcy5ub2RlIGFzIGFueSkub3duZXJFbGVtZW50ID0gb3duZXJFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICBET01XYWxrZXIuYXNzaWduU2xvdHModGhpcy5ub2RlIGFzIFNoYWRvd1Jvb3QpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLyB8fCB0aGlzLm5vZGUubm9kZVR5cGUgPT09IDExKSBcbiAgICAgICAgICAgICAgICAgICAgJiYgRE9NV2Fsa2VyLmxhc3RDaGlsZE5vdE93bmVkQnlTbG90KHRoaXMubm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gRE9NV2Fsa2VyLmxhc3RDaGlsZE5vdE93bmVkQnlTbG90KHRoaXMubm9kZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hdFJvb3QoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChET01XYWxrZXIucHJldmlvdXNTaWJsaW5nTm90T3duZWRCeVNsb3QodGhpcy5ub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBET01XYWxrZXIucHJldmlvdXNTaWJsaW5nTm90T3duZWRCeVNsb3QodGhpcy5ub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCh0aGlzLm5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gKHRoaXMubm9kZSBhcyBhbnkpLm93bmVyRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHNraXBPd25lZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm5vZGUucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5ub2RlLnBhcmVudE5vZGUubm9kZVR5cGUgPT09IDEgJiYgKHRoaXMubm9kZS5wYXJlbnROb2RlIGFzIEhUTUxFbGVtZW50KS5oYXNBdHRyaWJ1dGUoXCJhcmlhLW93bnNcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBvd25JZHMgPSAodGhpcy5ub2RlLnBhcmVudE5vZGUgYXMgSFRNTEVsZW1lbnQpLmdldEF0dHJpYnV0ZShcImFyaWEtb3duc1wiKS5zcGxpdCgvICsvZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5ub2RlLm5vZGVUeXBlICE9PSAxIHx8ICEodGhpcy5ub2RlIGFzIEhUTUxFbGVtZW50KS5oYXNBdHRyaWJ1dGUoXCJpZFwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IEZyYWdtZW50VXRpbC5nZXRPd25lckZyYWdtZW50KHRoaXMubm9kZSkuZ2V0RWxlbWVudEJ5SWQob3duSWRzWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlkeCA9IG93bklkcy5pbmRleE9mKCh0aGlzLm5vZGUgYXMgSFRNTEVsZW1lbnQpLmdldEF0dHJpYnV0ZShcImlkXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWR4ID09PSBvd25JZHMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsYXN0IG9uZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSB0aGlzLm5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gdHJ1ZTsgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBncmFiIG5leHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gRnJhZ21lbnRVdGlsLmdldE93bmVyRnJhZ21lbnQodGhpcy5ub2RlKS5nZXRFbGVtZW50QnlJZChvd25JZHNbaWR4KzFdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHRoaXMubm9kZS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IHdoaWxlIChcbiAgICAgICAgICAgICh0aGlzLm5vZGUubm9kZVR5cGUgIT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8gJiYgdGhpcy5ub2RlLm5vZGVUeXBlICE9PSAxMSlcbiAgICAgICAgICAgIHx8ICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgJiYgKHRoaXMubm9kZSBhcyBFbGVtZW50KS5nZXRBdHRyaWJ1dGUoXCJhQ2hlY2tlclwiKSA9PT0gXCJBQ0VcIilcbiAgICAgICAgICAgIHx8IChza2lwT3duZWQgJiYgdGhpcy5ub2RlLm5vZGVUeXBlID09PSAxICYmICEhQVJJQU1hcHBlci5nZXRBcmlhT3duZWRCeSh0aGlzLm5vZGUgYXMgSFRNTEVsZW1lbnQpKVxuICAgICAgICApO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi8uLi8uLi9hcGkvSUVuZ2luZVwiO1xuXG5leHBvcnQgY2xhc3MgQW5jZXN0b3JVdGlsIHtcbiAgICBwdWJsaWMgc3RhdGljIGlzUHJlc2VudGF0aW9uRnJhbWUoY29udGV4dEhpZXJhcmNoeTogUnVsZUNvbnRleHRIaWVyYXJjaHkpIDogYm9vbGVhbiB7XG4gICAgICAgIGlmIChjb250ZXh0SGllcmFyY2h5ICYmIGNvbnRleHRIaWVyYXJjaHkuZG9tKSB7XG4gICAgICAgICAgICAvLyBTa2lwIGN1cnJlbnQgbm9kZSBiZWNhdXNlIHdlIHdhbnQgYW5jZXN0cnlcbiAgICAgICAgICAgIGZvciAobGV0IGlkeD1jb250ZXh0SGllcmFyY2h5LmRvbS5sZW5ndGgtMjsgaWR4ID49IDA7IC0taWR4KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbSA9IChjb250ZXh0SGllcmFyY2h5LmRvbVtpZHhdLm5vZGUgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGlmIChlbGVtLm5vZGVUeXBlID09PSAxIFxuICAgICAgICAgICAgICAgICAgICAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiaWZyYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgJiYgKGVsZW0uZ2V0QXR0cmlidXRlKFwicm9sZVwiKSA9PT0gXCJwcmVzZW50YXRpb25cIiB8fCBlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtaGlkZGVuXCIpID09PSBcInRydWVcIikpIFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGlzRnJhbWUoY29udGV4dEhpZXJhcmNoeTogUnVsZUNvbnRleHRIaWVyYXJjaHkpIDogYm9vbGVhbiB7XG4gICAgICAgIGlmIChjb250ZXh0SGllcmFyY2h5ICYmIGNvbnRleHRIaWVyYXJjaHkuZG9tKSB7XG4gICAgICAgICAgICAvLyBTa2lwIGN1cnJlbnQgbm9kZSBiZWNhdXNlIHdlIHdhbnQgYW5jZXN0cnlcbiAgICAgICAgICAgIGZvciAobGV0IGlkeD1jb250ZXh0SGllcmFyY2h5LmRvbS5sZW5ndGgtMjsgaWR4ID49IDA7IC0taWR4KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbSA9IChjb250ZXh0SGllcmFyY2h5LmRvbVtpZHhdLm5vZGUgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGlmIChlbGVtLm5vZGVUeXBlID09PSAxICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpZnJhbWVcIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgIENvcHlyaWdodDo6IDIwMjAtIElCTSwgSW5jXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uLy4uLy4uL2FwaS9JRW5naW5lXCI7XG5cbmV4cG9ydCBjbGFzcyBGcmFnbWVudFV0aWwge1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0T3duZXJGcmFnbWVudChub2RlOiBOb2RlKSA6IERvY3VtZW50IHwgRG9jdW1lbnRGcmFnbWVudCB7XG4gICAgICAgIGxldCBuIDogTm9kZSA9IG5vZGU7XG4gICAgICAgIHdoaWxlKG4ucGFyZW50Tm9kZSAmJiAobiA9IG4ucGFyZW50Tm9kZSkpe1xuICAgICAgICAgICAgaWYgKG4ubm9kZVR5cGUgPT09IDExKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG4gYXMgRG9jdW1lbnRGcmFnbWVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbm9kZS5vd25lckRvY3VtZW50O1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0QnlJZChub2RlOiBOb2RlLCBpZDogc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE93bmVyRnJhZ21lbnQobm9kZSkuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0QW5jZXN0b3IoaGllcmFyY2hpZXM6IFJ1bGVDb250ZXh0SGllcmFyY2h5LCBlbGVtTmFtZTogc3RyaW5nKSB7XG4gICAgICAgIGxldCBtYXRjaGVzID0gaGllcmFyY2hpZXNbXCJkb21cIl0uZmlsdGVyKGluZm8gPT4gaW5mby5yb2xlID09PSBlbGVtTmFtZSk7XG4gICAgICAgIHJldHVybiBtYXRjaGVzLmxlbmd0aCA+IDAgJiYgbWF0Y2hlc1swXS5ub2RlIHx8IG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRBbmNlc3RvcldpdGhSb2xlKGhpZXJhcmNoaWVzOiBSdWxlQ29udGV4dEhpZXJhcmNoeSwgcm9sZTogc3RyaW5nKSB7XG4gICAgICAgIGxldCBtYXRjaGVzID0gaGllcmFyY2hpZXNbXCJhcmlhXCJdLmZpbHRlcihpbmZvID0+IGluZm8ucm9sZSA9PT0gcm9sZSk7XG4gICAgICAgIHJldHVybiBtYXRjaGVzLmxlbmd0aCA+IDAgJiYgbWF0Y2hlc1swXS5ub2RlIHx8IG51bGw7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMS0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuLy8gRnJvbSBodHRwczovL3d3dy5pYW5hLm9yZy9hc3NpZ25tZW50cy9sYW5ndWFnZS1zdWJ0YWctcmVnaXN0cnkvbGFuZ3VhZ2Utc3VidGFnLXJlZ2lzdHJ5XG5jb25zdCB2YWxpZFByaW1hcnlMYW5ncyA9IFsgLy8gXCJxYWEuLnF0elwiLFxuWyBcImFhXCIsXCJhYlwiLFwiYWVcIixcImFmXCIsXCJha1wiLFwiYW1cIixcImFuXCIsXCJhclwiLFwiYXNcIixcImF2XCIsXCJheVwiLFwiYXpcIixcImFhYVwiLFwiYWFiXCIsXCJhYWNcIixcImFhZFwiLFwiYWFlXCIsXCJhYWZcIixcImFhZ1wiLFwiYWFoXCIsXCJhYWlcIixcImFha1wiLFwiYWFsXCIsXCJhYW1cIixcImFhblwiLFwiYWFvXCIsXCJhYXBcIixcImFhcVwiLFwiYWFzXCIsXCJhYXRcIixcImFhdVwiLFwiYWF2XCIsXCJhYXdcIixcImFheFwiLFwiYWF6XCIsXCJhYmFcIixcImFiYlwiLFwiYWJjXCIsXCJhYmRcIixcImFiZVwiLFwiYWJmXCIsXCJhYmdcIixcImFiaFwiLFwiYWJpXCIsXCJhYmpcIixcImFibFwiLFwiYWJtXCIsXCJhYm5cIixcImFib1wiLFwiYWJwXCIsXCJhYnFcIixcImFiclwiLFwiYWJzXCIsXCJhYnRcIixcImFidVwiLFwiYWJ2XCIsXCJhYndcIixcImFieFwiLFwiYWJ5XCIsXCJhYnpcIixcImFjYVwiLFwiYWNiXCIsXCJhY2RcIixcImFjZVwiLFwiYWNmXCIsXCJhY2hcIixcImFjaVwiLFwiYWNrXCIsXCJhY2xcIixcImFjbVwiLFwiYWNuXCIsXCJhY3BcIixcImFjcVwiLFwiYWNyXCIsXCJhY3NcIixcImFjdFwiLFwiYWN1XCIsXCJhY3ZcIixcImFjd1wiLFwiYWN4XCIsXCJhY3lcIixcImFjelwiLFwiYWRhXCIsXCJhZGJcIixcImFkZFwiLFwiYWRlXCIsXCJhZGZcIixcImFkZ1wiLFwiYWRoXCIsXCJhZGlcIixcImFkalwiLFwiYWRsXCIsXCJhZG5cIixcImFkb1wiLFwiYWRwXCIsXCJhZHFcIixcImFkclwiLFwiYWRzXCIsXCJhZHRcIixcImFkdVwiLFwiYWR3XCIsXCJhZHhcIixcImFkeVwiLFwiYWR6XCIsXCJhZWFcIixcImFlYlwiLFwiYWVjXCIsXCJhZWRcIixcImFlZVwiLFwiYWVrXCIsXCJhZWxcIixcImFlbVwiLFwiYWVuXCIsXCJhZXFcIixcImFlclwiLFwiYWVzXCIsXCJhZXVcIixcImFld1wiLFwiYWV5XCIsXCJhZXpcIixcImFmYVwiLFwiYWZiXCIsXCJhZmRcIixcImFmZVwiLFwiYWZnXCIsXCJhZmhcIixcImFmaVwiLFwiYWZrXCIsXCJhZm5cIixcImFmb1wiLFwiYWZwXCIsXCJhZnNcIixcImFmdFwiLFwiYWZ1XCIsXCJhZnpcIixcImFnYVwiLFwiYWdiXCIsXCJhZ2NcIixcImFnZFwiLFwiYWdlXCIsXCJhZ2ZcIixcImFnZ1wiLFwiYWdoXCIsXCJhZ2lcIixcImFnalwiLFwiYWdrXCIsXCJhZ2xcIixcImFnbVwiLFwiYWduXCIsXCJhZ29cIixcImFncFwiLFwiYWdxXCIsXCJhZ3JcIixcImFnc1wiLFwiYWd0XCIsXCJhZ3VcIixcImFndlwiLFwiYWd3XCIsXCJhZ3hcIixcImFneVwiLFwiYWd6XCIsXCJhaGFcIixcImFoYlwiLFwiYWhnXCIsXCJhaGhcIixcImFoaVwiLFwiYWhrXCIsXCJhaGxcIixcImFobVwiLFwiYWhuXCIsXCJhaG9cIixcImFocFwiLFwiYWhyXCIsXCJhaHNcIixcImFodFwiLFwiYWlhXCIsXCJhaWJcIixcImFpY1wiLFwiYWlkXCIsXCJhaWVcIixcImFpZlwiLFwiYWlnXCIsXCJhaWhcIixcImFpaVwiLFwiYWlqXCIsXCJhaWtcIixcImFpbFwiLFwiYWltXCIsXCJhaW5cIixcImFpb1wiLFwiYWlwXCIsXCJhaXFcIixcImFpclwiLFwiYWlzXCIsXCJhaXRcIixcImFpd1wiLFwiYWl4XCIsXCJhaXlcIixcImFqYVwiLFwiYWpnXCIsXCJhamlcIixcImFqblwiLFwiYWpwXCIsXCJhanRcIixcImFqdVwiLFwiYWp3XCIsXCJhanpcIixcImFrYlwiLFwiYWtjXCIsXCJha2RcIixcImFrZVwiLFwiYWtmXCIsXCJha2dcIixcImFraFwiLFwiYWtpXCIsXCJha2pcIixcImFra1wiLFwiYWtsXCIsXCJha21cIixcImFrb1wiLFwiYWtwXCIsXCJha3FcIixcImFrclwiLFwiYWtzXCIsXCJha3RcIixcImFrdVwiLFwiYWt2XCIsXCJha3dcIixcImFreFwiLFwiYWt5XCIsXCJha3pcIixcImFsYVwiLFwiYWxjXCIsXCJhbGRcIixcImFsZVwiLFwiYWxmXCIsXCJhbGdcIixcImFsaFwiLFwiYWxpXCIsXCJhbGpcIixcImFsa1wiLFwiYWxsXCIsXCJhbG1cIixcImFsblwiLFwiYWxvXCIsXCJhbHBcIixcImFscVwiLFwiYWxyXCIsXCJhbHNcIixcImFsdFwiLFwiYWx1XCIsXCJhbHZcIixcImFsd1wiLFwiYWx4XCIsXCJhbHlcIixcImFselwiLFwiYW1hXCIsXCJhbWJcIixcImFtY1wiLFwiYW1lXCIsXCJhbWZcIixcImFtZ1wiLFwiYW1pXCIsXCJhbWpcIixcImFta1wiLFwiYW1sXCIsXCJhbW1cIixcImFtblwiLFwiYW1vXCIsXCJhbXBcIixcImFtcVwiLFwiYW1yXCIsXCJhbXNcIixcImFtdFwiLFwiYW11XCIsXCJhbXZcIixcImFtd1wiLFwiYW14XCIsXCJhbXlcIixcImFtelwiLFwiYW5hXCIsXCJhbmJcIixcImFuY1wiLFwiYW5kXCIsXCJhbmVcIixcImFuZlwiLFwiYW5nXCIsXCJhbmhcIixcImFuaVwiLFwiYW5qXCIsXCJhbmtcIixcImFubFwiLFwiYW5tXCIsXCJhbm5cIixcImFub1wiLFwiYW5wXCIsXCJhbnFcIixcImFuclwiLFwiYW5zXCIsXCJhbnRcIixcImFudVwiLFwiYW52XCIsXCJhbndcIixcImFueFwiLFwiYW55XCIsXCJhbnpcIixcImFvYVwiLFwiYW9iXCIsXCJhb2NcIixcImFvZFwiLFwiYW9lXCIsXCJhb2ZcIixcImFvZ1wiLFwiYW9oXCIsXCJhb2lcIixcImFvalwiLFwiYW9rXCIsXCJhb2xcIixcImFvbVwiLFwiYW9uXCIsXCJhb3JcIixcImFvc1wiLFwiYW90XCIsXCJhb3VcIixcImFveFwiLFwiYW96XCIsXCJhcGFcIixcImFwYlwiLFwiYXBjXCIsXCJhcGRcIixcImFwZVwiLFwiYXBmXCIsXCJhcGdcIixcImFwaFwiLFwiYXBpXCIsXCJhcGpcIixcImFwa1wiLFwiYXBsXCIsXCJhcG1cIixcImFwblwiLFwiYXBvXCIsXCJhcHBcIixcImFwcVwiLFwiYXByXCIsXCJhcHNcIixcImFwdFwiLFwiYXB1XCIsXCJhcHZcIixcImFwd1wiLFwiYXB4XCIsXCJhcHlcIixcImFwelwiLFwiYXFhXCIsXCJhcWNcIixcImFxZFwiLFwiYXFnXCIsXCJhcWtcIixcImFxbFwiLFwiYXFtXCIsXCJhcW5cIixcImFxcFwiLFwiYXFyXCIsXCJhcXRcIixcImFxelwiLFwiYXJiXCIsXCJhcmNcIixcImFyZFwiLFwiYXJlXCIsXCJhcmhcIixcImFyaVwiLFwiYXJqXCIsXCJhcmtcIixcImFybFwiLFwiYXJuXCIsXCJhcm9cIixcImFycFwiLFwiYXJxXCIsXCJhcnJcIixcImFyc1wiLFwiYXJ0XCIsXCJhcnVcIixcImFydlwiLFwiYXJ3XCIsXCJhcnhcIixcImFyeVwiLFwiYXJ6XCIsXCJhc2FcIixcImFzYlwiLFwiYXNjXCIsXCJhc2RcIixcImFzZVwiLFwiYXNmXCIsXCJhc2dcIixcImFzaFwiLFwiYXNpXCIsXCJhc2pcIixcImFza1wiLFwiYXNsXCIsXCJhc25cIixcImFzb1wiLFwiYXNwXCIsXCJhc3FcIixcImFzclwiLFwiYXNzXCIsXCJhc3RcIixcImFzdVwiLFwiYXN2XCIsXCJhc3dcIixcImFzeFwiLFwiYXN5XCIsXCJhc3pcIixcImF0YVwiLFwiYXRiXCIsXCJhdGNcIixcImF0ZFwiLFwiYXRlXCIsXCJhdGdcIixcImF0aFwiLFwiYXRpXCIsXCJhdGpcIixcImF0a1wiLFwiYXRsXCIsXCJhdG1cIixcImF0blwiLFwiYXRvXCIsXCJhdHBcIixcImF0cVwiLFwiYXRyXCIsXCJhdHNcIixcImF0dFwiLFwiYXR1XCIsXCJhdHZcIixcImF0d1wiLFwiYXR4XCIsXCJhdHlcIixcImF0elwiLFwiYXVhXCIsXCJhdWJcIixcImF1Y1wiLFwiYXVkXCIsXCJhdWVcIixcImF1ZlwiLFwiYXVnXCIsXCJhdWhcIixcImF1aVwiLFwiYXVqXCIsXCJhdWtcIixcImF1bFwiLFwiYXVtXCIsXCJhdW5cIixcImF1b1wiLFwiYXVwXCIsXCJhdXFcIixcImF1clwiLFwiYXVzXCIsXCJhdXRcIixcImF1dVwiLFwiYXV3XCIsXCJhdXhcIixcImF1eVwiLFwiYXV6XCIsXCJhdmJcIixcImF2ZFwiLFwiYXZpXCIsXCJhdmtcIixcImF2bFwiLFwiYXZtXCIsXCJhdm5cIixcImF2b1wiLFwiYXZzXCIsXCJhdnRcIixcImF2dVwiLFwiYXZ2XCIsXCJhd2FcIixcImF3YlwiLFwiYXdjXCIsXCJhd2RcIixcImF3ZVwiLFwiYXdnXCIsXCJhd2hcIixcImF3aVwiLFwiYXdrXCIsXCJhd21cIixcImF3blwiLFwiYXdvXCIsXCJhd3JcIixcImF3c1wiLFwiYXd0XCIsXCJhd3VcIixcImF3dlwiLFwiYXd3XCIsXCJhd3hcIixcImF3eVwiLFwiYXhiXCIsXCJheGVcIixcImF4Z1wiLFwiYXhrXCIsXCJheGxcIixcImF4bVwiLFwiYXh4XCIsXCJheWFcIixcImF5YlwiLFwiYXljXCIsXCJheWRcIixcImF5ZVwiLFwiYXlnXCIsXCJheWhcIixcImF5aVwiLFwiYXlrXCIsXCJheWxcIixcImF5blwiLFwiYXlvXCIsXCJheXBcIixcImF5cVwiLFwiYXlyXCIsXCJheXNcIixcImF5dFwiLFwiYXl1XCIsXCJheXhcIixcImF5eVwiLFwiYXl6XCIsXCJhemFcIixcImF6YlwiLFwiYXpjXCIsXCJhemRcIixcImF6Z1wiLFwiYXpqXCIsXCJhem1cIixcImF6blwiLFwiYXpvXCIsXCJhenRcIixcImF6elwiXVxuLFsgXCJiYVwiLFwiYmVcIixcImJnXCIsXCJiaFwiLFwiYmlcIixcImJtXCIsXCJiblwiLFwiYm9cIixcImJyXCIsXCJic1wiLFwiYmFhXCIsXCJiYWJcIixcImJhY1wiLFwiYmFkXCIsXCJiYWVcIixcImJhZlwiLFwiYmFnXCIsXCJiYWhcIixcImJhaVwiLFwiYmFqXCIsXCJiYWxcIixcImJhblwiLFwiYmFvXCIsXCJiYXBcIixcImJhclwiLFwiYmFzXCIsXCJiYXRcIixcImJhdVwiLFwiYmF2XCIsXCJiYXdcIixcImJheFwiLFwiYmF5XCIsXCJiYXpcIixcImJiYVwiLFwiYmJiXCIsXCJiYmNcIixcImJiZFwiLFwiYmJlXCIsXCJiYmZcIixcImJiZ1wiLFwiYmJoXCIsXCJiYmlcIixcImJialwiLFwiYmJrXCIsXCJiYmxcIixcImJibVwiLFwiYmJuXCIsXCJiYm9cIixcImJicFwiLFwiYmJxXCIsXCJiYnJcIixcImJic1wiLFwiYmJ0XCIsXCJiYnVcIixcImJidlwiLFwiYmJ3XCIsXCJiYnhcIixcImJieVwiLFwiYmJ6XCIsXCJiY2FcIixcImJjYlwiLFwiYmNjXCIsXCJiY2RcIixcImJjZVwiLFwiYmNmXCIsXCJiY2dcIixcImJjaFwiLFwiYmNpXCIsXCJiY2pcIixcImJja1wiLFwiYmNsXCIsXCJiY21cIixcImJjblwiLFwiYmNvXCIsXCJiY3BcIixcImJjcVwiLFwiYmNyXCIsXCJiY3NcIixcImJjdFwiLFwiYmN1XCIsXCJiY3ZcIixcImJjd1wiLFwiYmN5XCIsXCJiY3pcIixcImJkYVwiLFwiYmRiXCIsXCJiZGNcIixcImJkZFwiLFwiYmRlXCIsXCJiZGZcIixcImJkZ1wiLFwiYmRoXCIsXCJiZGlcIixcImJkalwiLFwiYmRrXCIsXCJiZGxcIixcImJkbVwiLFwiYmRuXCIsXCJiZG9cIixcImJkcFwiLFwiYmRxXCIsXCJiZHJcIixcImJkc1wiLFwiYmR0XCIsXCJiZHVcIixcImJkdlwiLFwiYmR3XCIsXCJiZHhcIixcImJkeVwiLFwiYmR6XCIsXCJiZWFcIixcImJlYlwiLFwiYmVjXCIsXCJiZWRcIixcImJlZVwiLFwiYmVmXCIsXCJiZWdcIixcImJlaFwiLFwiYmVpXCIsXCJiZWpcIixcImJla1wiLFwiYmVtXCIsXCJiZW9cIixcImJlcFwiLFwiYmVxXCIsXCJiZXJcIixcImJlc1wiLFwiYmV0XCIsXCJiZXVcIixcImJldlwiLFwiYmV3XCIsXCJiZXhcIixcImJleVwiLFwiYmV6XCIsXCJiZmFcIixcImJmYlwiLFwiYmZjXCIsXCJiZmRcIixcImJmZVwiLFwiYmZmXCIsXCJiZmdcIixcImJmaFwiLFwiYmZpXCIsXCJiZmpcIixcImJma1wiLFwiYmZsXCIsXCJiZm1cIixcImJmblwiLFwiYmZvXCIsXCJiZnBcIixcImJmcVwiLFwiYmZyXCIsXCJiZnNcIixcImJmdFwiLFwiYmZ1XCIsXCJiZndcIixcImJmeFwiLFwiYmZ5XCIsXCJiZnpcIixcImJnYVwiLFwiYmdiXCIsXCJiZ2NcIixcImJnZFwiLFwiYmdlXCIsXCJiZ2ZcIixcImJnZ1wiLFwiYmdpXCIsXCJiZ2pcIixcImJna1wiLFwiYmdsXCIsXCJiZ21cIixcImJnblwiLFwiYmdvXCIsXCJiZ3BcIixcImJncVwiLFwiYmdyXCIsXCJiZ3NcIixcImJndFwiLFwiYmd1XCIsXCJiZ3ZcIixcImJnd1wiLFwiYmd4XCIsXCJiZ3lcIixcImJnelwiLFwiYmhhXCIsXCJiaGJcIixcImJoY1wiLFwiYmhkXCIsXCJiaGVcIixcImJoZlwiLFwiYmhnXCIsXCJiaGhcIixcImJoaVwiLFwiYmhqXCIsXCJiaGtcIixcImJobFwiLFwiYmhtXCIsXCJiaG5cIixcImJob1wiLFwiYmhwXCIsXCJiaHFcIixcImJoclwiLFwiYmhzXCIsXCJiaHRcIixcImJodVwiLFwiYmh2XCIsXCJiaHdcIixcImJoeFwiLFwiYmh5XCIsXCJiaHpcIixcImJpYVwiLFwiYmliXCIsXCJiaWNcIixcImJpZFwiLFwiYmllXCIsXCJiaWZcIixcImJpZ1wiLFwiYmlqXCIsXCJiaWtcIixcImJpbFwiLFwiYmltXCIsXCJiaW5cIixcImJpb1wiLFwiYmlwXCIsXCJiaXFcIixcImJpclwiLFwiYml0XCIsXCJiaXVcIixcImJpdlwiLFwiYml3XCIsXCJiaXhcIixcImJpeVwiLFwiYml6XCIsXCJiamFcIixcImJqYlwiLFwiYmpjXCIsXCJiamRcIixcImJqZVwiLFwiYmpmXCIsXCJiamdcIixcImJqaFwiLFwiYmppXCIsXCJiampcIixcImJqa1wiLFwiYmpsXCIsXCJiam1cIixcImJqblwiLFwiYmpvXCIsXCJianBcIixcImJqcVwiLFwiYmpyXCIsXCJianNcIixcImJqdFwiLFwiYmp1XCIsXCJianZcIixcImJqd1wiLFwiYmp4XCIsXCJianlcIixcImJqelwiLFwiYmthXCIsXCJia2JcIixcImJrY1wiLFwiYmtkXCIsXCJia2ZcIixcImJrZ1wiLFwiYmtoXCIsXCJia2lcIixcImJralwiLFwiYmtrXCIsXCJia2xcIixcImJrbVwiLFwiYmtuXCIsXCJia29cIixcImJrcFwiLFwiYmtxXCIsXCJia3JcIixcImJrc1wiLFwiYmt0XCIsXCJia3VcIixcImJrdlwiLFwiYmt3XCIsXCJia3hcIixcImJreVwiLFwiYmt6XCIsXCJibGFcIixcImJsYlwiLFwiYmxjXCIsXCJibGRcIixcImJsZVwiLFwiYmxmXCIsXCJibGdcIixcImJsaFwiLFwiYmxpXCIsXCJibGpcIixcImJsa1wiLFwiYmxsXCIsXCJibG1cIixcImJsblwiLFwiYmxvXCIsXCJibHBcIixcImJscVwiLFwiYmxyXCIsXCJibHNcIixcImJsdFwiLFwiYmx2XCIsXCJibHdcIixcImJseFwiLFwiYmx5XCIsXCJibHpcIixcImJtYVwiLFwiYm1iXCIsXCJibWNcIixcImJtZFwiLFwiYm1lXCIsXCJibWZcIixcImJtZ1wiLFwiYm1oXCIsXCJibWlcIixcImJtalwiLFwiYm1rXCIsXCJibWxcIixcImJtbVwiLFwiYm1uXCIsXCJibW9cIixcImJtcFwiLFwiYm1xXCIsXCJibXJcIixcImJtc1wiLFwiYm10XCIsXCJibXVcIixcImJtdlwiLFwiYm13XCIsXCJibXhcIixcImJteVwiLFwiYm16XCIsXCJibmFcIixcImJuYlwiLFwiYm5jXCIsXCJibmRcIixcImJuZVwiLFwiYm5mXCIsXCJibmdcIixcImJuaVwiLFwiYm5qXCIsXCJibmtcIixcImJubFwiLFwiYm5tXCIsXCJibm5cIixcImJub1wiLFwiYm5wXCIsXCJibnFcIixcImJuclwiLFwiYm5zXCIsXCJibnRcIixcImJudVwiLFwiYm52XCIsXCJibndcIixcImJueFwiLFwiYm55XCIsXCJibnpcIixcImJvYVwiLFwiYm9iXCIsXCJib2VcIixcImJvZlwiLFwiYm9nXCIsXCJib2hcIixcImJvaVwiLFwiYm9qXCIsXCJib2tcIixcImJvbFwiLFwiYm9tXCIsXCJib25cIixcImJvb1wiLFwiYm9wXCIsXCJib3FcIixcImJvclwiLFwiYm90XCIsXCJib3VcIixcImJvdlwiLFwiYm93XCIsXCJib3hcIixcImJveVwiLFwiYm96XCIsXCJicGFcIixcImJwYlwiLFwiYnBkXCIsXCJicGVcIixcImJwZ1wiLFwiYnBoXCIsXCJicGlcIixcImJwalwiLFwiYnBrXCIsXCJicGxcIixcImJwbVwiLFwiYnBuXCIsXCJicG9cIixcImJwcFwiLFwiYnBxXCIsXCJicHJcIixcImJwc1wiLFwiYnB0XCIsXCJicHVcIixcImJwdlwiLFwiYnB3XCIsXCJicHhcIixcImJweVwiLFwiYnB6XCIsXCJicWFcIixcImJxYlwiLFwiYnFjXCIsXCJicWRcIixcImJxZlwiLFwiYnFnXCIsXCJicWhcIixcImJxaVwiLFwiYnFqXCIsXCJicWtcIixcImJxbFwiLFwiYnFtXCIsXCJicW5cIixcImJxb1wiLFwiYnFwXCIsXCJicXFcIixcImJxclwiLFwiYnFzXCIsXCJicXRcIixcImJxdVwiLFwiYnF2XCIsXCJicXdcIixcImJxeFwiLFwiYnF5XCIsXCJicXpcIixcImJyYVwiLFwiYnJiXCIsXCJicmNcIixcImJyZFwiLFwiYnJmXCIsXCJicmdcIixcImJyaFwiLFwiYnJpXCIsXCJicmpcIixcImJya1wiLFwiYnJsXCIsXCJicm1cIixcImJyblwiLFwiYnJvXCIsXCJicnBcIixcImJycVwiLFwiYnJyXCIsXCJicnNcIixcImJydFwiLFwiYnJ1XCIsXCJicnZcIixcImJyd1wiLFwiYnJ4XCIsXCJicnlcIixcImJyelwiLFwiYnNhXCIsXCJic2JcIixcImJzY1wiLFwiYnNlXCIsXCJic2ZcIixcImJzZ1wiLFwiYnNoXCIsXCJic2lcIixcImJzalwiLFwiYnNrXCIsXCJic2xcIixcImJzbVwiLFwiYnNuXCIsXCJic29cIixcImJzcFwiLFwiYnNxXCIsXCJic3JcIixcImJzc1wiLFwiYnN0XCIsXCJic3VcIixcImJzdlwiLFwiYnN3XCIsXCJic3hcIixcImJzeVwiLFwiYnRhXCIsXCJidGJcIixcImJ0Y1wiLFwiYnRkXCIsXCJidGVcIixcImJ0ZlwiLFwiYnRnXCIsXCJidGhcIixcImJ0aVwiLFwiYnRqXCIsXCJidGtcIixcImJ0bFwiLFwiYnRtXCIsXCJidG5cIixcImJ0b1wiLFwiYnRwXCIsXCJidHFcIixcImJ0clwiLFwiYnRzXCIsXCJidHRcIixcImJ0dVwiLFwiYnR2XCIsXCJidHdcIixcImJ0eFwiLFwiYnR5XCIsXCJidHpcIixcImJ1YVwiLFwiYnViXCIsXCJidWNcIixcImJ1ZFwiLFwiYnVlXCIsXCJidWZcIixcImJ1Z1wiLFwiYnVoXCIsXCJidWlcIixcImJ1alwiLFwiYnVrXCIsXCJidW1cIixcImJ1blwiLFwiYnVvXCIsXCJidXBcIixcImJ1cVwiLFwiYnVzXCIsXCJidXRcIixcImJ1dVwiLFwiYnV2XCIsXCJidXdcIixcImJ1eFwiLFwiYnV5XCIsXCJidXpcIixcImJ2YVwiLFwiYnZiXCIsXCJidmNcIixcImJ2ZFwiLFwiYnZlXCIsXCJidmZcIixcImJ2Z1wiLFwiYnZoXCIsXCJidmlcIixcImJ2alwiLFwiYnZrXCIsXCJidmxcIixcImJ2bVwiLFwiYnZuXCIsXCJidm9cIixcImJ2cFwiLFwiYnZxXCIsXCJidnJcIixcImJ2dFwiLFwiYnZ1XCIsXCJidnZcIixcImJ2d1wiLFwiYnZ4XCIsXCJidnlcIixcImJ2elwiLFwiYndhXCIsXCJid2JcIixcImJ3Y1wiLFwiYndkXCIsXCJid2VcIixcImJ3ZlwiLFwiYndnXCIsXCJid2hcIixcImJ3aVwiLFwiYndqXCIsXCJid2tcIixcImJ3bFwiLFwiYndtXCIsXCJid25cIixcImJ3b1wiLFwiYndwXCIsXCJid3FcIixcImJ3clwiLFwiYndzXCIsXCJid3RcIixcImJ3dVwiLFwiYnd3XCIsXCJid3hcIixcImJ3eVwiLFwiYnd6XCIsXCJieGFcIixcImJ4YlwiLFwiYnhjXCIsXCJieGRcIixcImJ4ZVwiLFwiYnhmXCIsXCJieGdcIixcImJ4aFwiLFwiYnhpXCIsXCJieGpcIixcImJ4a1wiLFwiYnhsXCIsXCJieG1cIixcImJ4blwiLFwiYnhvXCIsXCJieHBcIixcImJ4cVwiLFwiYnhyXCIsXCJieHNcIixcImJ4dVwiLFwiYnh2XCIsXCJieHdcIixcImJ4eFwiLFwiYnh6XCIsXCJieWFcIixcImJ5YlwiLFwiYnljXCIsXCJieWRcIixcImJ5ZVwiLFwiYnlmXCIsXCJieWdcIixcImJ5aFwiLFwiYnlpXCIsXCJieWpcIixcImJ5a1wiLFwiYnlsXCIsXCJieW1cIixcImJ5blwiLFwiYnlvXCIsXCJieXBcIixcImJ5cVwiLFwiYnlyXCIsXCJieXNcIixcImJ5dFwiLFwiYnl2XCIsXCJieXdcIixcImJ5eFwiLFwiYnl5XCIsXCJieXpcIixcImJ6YVwiLFwiYnpiXCIsXCJiemNcIixcImJ6ZFwiLFwiYnplXCIsXCJiemZcIixcImJ6Z1wiLFwiYnpoXCIsXCJiemlcIixcImJ6alwiLFwiYnprXCIsXCJiemxcIixcImJ6bVwiLFwiYnpuXCIsXCJiem9cIixcImJ6cFwiLFwiYnpxXCIsXCJienJcIixcImJ6c1wiLFwiYnp0XCIsXCJienVcIixcImJ6dlwiLFwiYnp3XCIsXCJienhcIixcImJ6eVwiLFwiYnp6XCJdXG4sWyBcImNhXCIsXCJjZVwiLFwiY2hcIixcImNvXCIsXCJjclwiLFwiY3NcIixcImN1XCIsXCJjdlwiLFwiY3lcIixcImNhYVwiLFwiY2FiXCIsXCJjYWNcIixcImNhZFwiLFwiY2FlXCIsXCJjYWZcIixcImNhZ1wiLFwiY2FoXCIsXCJjYWlcIixcImNhalwiLFwiY2FrXCIsXCJjYWxcIixcImNhbVwiLFwiY2FuXCIsXCJjYW9cIixcImNhcFwiLFwiY2FxXCIsXCJjYXJcIixcImNhc1wiLFwiY2F1XCIsXCJjYXZcIixcImNhd1wiLFwiY2F4XCIsXCJjYXlcIixcImNhelwiLFwiY2JhXCIsXCJjYmJcIixcImNiY1wiLFwiY2JkXCIsXCJjYmVcIixcImNiZ1wiLFwiY2JoXCIsXCJjYmlcIixcImNialwiLFwiY2JrXCIsXCJjYmxcIixcImNiblwiLFwiY2JvXCIsXCJjYnFcIixcImNiclwiLFwiY2JzXCIsXCJjYnRcIixcImNidVwiLFwiY2J2XCIsXCJjYndcIixcImNieVwiLFwiY2NhXCIsXCJjY2NcIixcImNjZFwiLFwiY2NlXCIsXCJjY2dcIixcImNjaFwiLFwiY2NqXCIsXCJjY2xcIixcImNjbVwiLFwiY2NuXCIsXCJjY29cIixcImNjcFwiLFwiY2NxXCIsXCJjY3JcIixcImNjc1wiLFwiY2RhXCIsXCJjZGNcIixcImNkZFwiLFwiY2RlXCIsXCJjZGZcIixcImNkZ1wiLFwiY2RoXCIsXCJjZGlcIixcImNkalwiLFwiY2RtXCIsXCJjZG5cIixcImNkb1wiLFwiY2RyXCIsXCJjZHNcIixcImNkeVwiLFwiY2R6XCIsXCJjZWFcIixcImNlYlwiLFwiY2VnXCIsXCJjZWtcIixcImNlbFwiLFwiY2VuXCIsXCJjZXRcIixcImNleVwiLFwiY2ZhXCIsXCJjZmRcIixcImNmZ1wiLFwiY2ZtXCIsXCJjZ2FcIixcImNnY1wiLFwiY2dnXCIsXCJjZ2tcIixcImNoYlwiLFwiY2hjXCIsXCJjaGRcIixcImNoZlwiLFwiY2hnXCIsXCJjaGhcIixcImNoalwiLFwiY2hrXCIsXCJjaGxcIixcImNobVwiLFwiY2huXCIsXCJjaG9cIixcImNocFwiLFwiY2hxXCIsXCJjaHJcIixcImNodFwiLFwiY2h3XCIsXCJjaHhcIixcImNoeVwiLFwiY2h6XCIsXCJjaWFcIixcImNpYlwiLFwiY2ljXCIsXCJjaWRcIixcImNpZVwiLFwiY2loXCIsXCJjaWtcIixcImNpbVwiLFwiY2luXCIsXCJjaXBcIixcImNpclwiLFwiY2l3XCIsXCJjaXlcIixcImNqYVwiLFwiY2plXCIsXCJjamhcIixcImNqaVwiLFwiY2prXCIsXCJjam1cIixcImNqblwiLFwiY2pvXCIsXCJjanBcIixcImNqclwiLFwiY2pzXCIsXCJjanZcIixcImNqeVwiLFwiY2thXCIsXCJja2JcIixcImNraFwiLFwiY2tsXCIsXCJja21cIixcImNrblwiLFwiY2tvXCIsXCJja3FcIixcImNrclwiLFwiY2tzXCIsXCJja3RcIixcImNrdVwiLFwiY2t2XCIsXCJja3hcIixcImNreVwiLFwiY2t6XCIsXCJjbGFcIixcImNsY1wiLFwiY2xkXCIsXCJjbGVcIixcImNsaFwiLFwiY2xpXCIsXCJjbGpcIixcImNsa1wiLFwiY2xsXCIsXCJjbG1cIixcImNsb1wiLFwiY2x0XCIsXCJjbHVcIixcImNsd1wiLFwiY2x5XCIsXCJjbWFcIixcImNtY1wiLFwiY21lXCIsXCJjbWdcIixcImNtaVwiLFwiY21rXCIsXCJjbWxcIixcImNtbVwiLFwiY21uXCIsXCJjbW9cIixcImNtclwiLFwiY21zXCIsXCJjbXRcIixcImNuYVwiLFwiY25iXCIsXCJjbmNcIixcImNuZ1wiLFwiY25oXCIsXCJjbmlcIixcImNua1wiLFwiY25sXCIsXCJjbm9cIixcImNucFwiLFwiY25yXCIsXCJjbnNcIixcImNudFwiLFwiY251XCIsXCJjbndcIixcImNueFwiLFwiY29hXCIsXCJjb2JcIixcImNvY1wiLFwiY29kXCIsXCJjb2VcIixcImNvZlwiLFwiY29nXCIsXCJjb2hcIixcImNvalwiLFwiY29rXCIsXCJjb2xcIixcImNvbVwiLFwiY29uXCIsXCJjb29cIixcImNvcFwiLFwiY29xXCIsXCJjb3RcIixcImNvdVwiLFwiY292XCIsXCJjb3dcIixcImNveFwiLFwiY295XCIsXCJjb3pcIixcImNwYVwiLFwiY3BiXCIsXCJjcGNcIixcImNwZVwiLFwiY3BmXCIsXCJjcGdcIixcImNwaVwiLFwiY3BuXCIsXCJjcG9cIixcImNwcFwiLFwiY3BzXCIsXCJjcHVcIixcImNweFwiLFwiY3B5XCIsXCJjcWRcIixcImNxdVwiLFwiY3JhXCIsXCJjcmJcIixcImNyY1wiLFwiY3JkXCIsXCJjcmZcIixcImNyZ1wiLFwiY3JoXCIsXCJjcmlcIixcImNyalwiLFwiY3JrXCIsXCJjcmxcIixcImNybVwiLFwiY3JuXCIsXCJjcm9cIixcImNycFwiLFwiY3JxXCIsXCJjcnJcIixcImNyc1wiLFwiY3J0XCIsXCJjcnZcIixcImNyd1wiLFwiY3J4XCIsXCJjcnlcIixcImNyelwiLFwiY3NhXCIsXCJjc2JcIixcImNzY1wiLFwiY3NkXCIsXCJjc2VcIixcImNzZlwiLFwiY3NnXCIsXCJjc2hcIixcImNzaVwiLFwiY3NqXCIsXCJjc2tcIixcImNzbFwiLFwiY3NtXCIsXCJjc25cIixcImNzb1wiLFwiY3NwXCIsXCJjc3FcIixcImNzclwiLFwiY3NzXCIsXCJjc3RcIixcImNzdVwiLFwiY3N2XCIsXCJjc3dcIixcImNzeFwiLFwiY3N5XCIsXCJjc3pcIixcImN0YVwiLFwiY3RjXCIsXCJjdGRcIixcImN0ZVwiLFwiY3RnXCIsXCJjdGhcIixcImN0bFwiLFwiY3RtXCIsXCJjdG5cIixcImN0b1wiLFwiY3RwXCIsXCJjdHNcIixcImN0dFwiLFwiY3R1XCIsXCJjdHlcIixcImN0elwiLFwiY3VhXCIsXCJjdWJcIixcImN1Y1wiLFwiY3VnXCIsXCJjdWhcIixcImN1aVwiLFwiY3VqXCIsXCJjdWtcIixcImN1bFwiLFwiY3VtXCIsXCJjdW9cIixcImN1cFwiLFwiY3VxXCIsXCJjdXJcIixcImN1c1wiLFwiY3V0XCIsXCJjdXVcIixcImN1dlwiLFwiY3V3XCIsXCJjdXhcIixcImN1eVwiLFwiY3ZnXCIsXCJjdm5cIixcImN3YVwiLFwiY3diXCIsXCJjd2RcIixcImN3ZVwiLFwiY3dnXCIsXCJjd3RcIixcImN5YVwiLFwiY3liXCIsXCJjeW9cIixcImN6aFwiLFwiY3prXCIsXCJjem5cIixcImN6b1wiLFwiY3p0XCJdXG4sWyBcImRhXCIsXCJkZVwiLFwiZHZcIixcImR6XCIsXCJkYWFcIixcImRhY1wiLFwiZGFkXCIsXCJkYWVcIixcImRhZlwiLFwiZGFnXCIsXCJkYWhcIixcImRhaVwiLFwiZGFqXCIsXCJkYWtcIixcImRhbFwiLFwiZGFtXCIsXCJkYW9cIixcImRhcFwiLFwiZGFxXCIsXCJkYXJcIixcImRhc1wiLFwiZGF1XCIsXCJkYXZcIixcImRhd1wiLFwiZGF4XCIsXCJkYXlcIixcImRhelwiLFwiZGJhXCIsXCJkYmJcIixcImRiZFwiLFwiZGJlXCIsXCJkYmZcIixcImRiZ1wiLFwiZGJpXCIsXCJkYmpcIixcImRibFwiLFwiZGJtXCIsXCJkYm5cIixcImRib1wiLFwiZGJwXCIsXCJkYnFcIixcImRiclwiLFwiZGJ0XCIsXCJkYnVcIixcImRidlwiLFwiZGJ3XCIsXCJkYnlcIixcImRjY1wiLFwiZGNyXCIsXCJkZGFcIixcImRkZFwiLFwiZGRlXCIsXCJkZGdcIixcImRkaVwiLFwiZGRqXCIsXCJkZG5cIixcImRkb1wiLFwiZGRyXCIsXCJkZHNcIixcImRkd1wiLFwiZGVjXCIsXCJkZWRcIixcImRlZVwiLFwiZGVmXCIsXCJkZWdcIixcImRlaFwiLFwiZGVpXCIsXCJkZWtcIixcImRlbFwiLFwiZGVtXCIsXCJkZW5cIixcImRlcFwiLFwiZGVxXCIsXCJkZXJcIixcImRlc1wiLFwiZGV2XCIsXCJkZXpcIixcImRnYVwiLFwiZGdiXCIsXCJkZ2NcIixcImRnZFwiLFwiZGdlXCIsXCJkZ2dcIixcImRnaFwiLFwiZGdpXCIsXCJkZ2tcIixcImRnbFwiLFwiZGduXCIsXCJkZ29cIixcImRnclwiLFwiZGdzXCIsXCJkZ3RcIixcImRndVwiLFwiZGd3XCIsXCJkZ3hcIixcImRnelwiLFwiZGhhXCIsXCJkaGRcIixcImRoZ1wiLFwiZGhpXCIsXCJkaGxcIixcImRobVwiLFwiZGhuXCIsXCJkaG9cIixcImRoclwiLFwiZGhzXCIsXCJkaHVcIixcImRodlwiLFwiZGh3XCIsXCJkaHhcIixcImRpYVwiLFwiZGliXCIsXCJkaWNcIixcImRpZFwiLFwiZGlmXCIsXCJkaWdcIixcImRpaFwiLFwiZGlpXCIsXCJkaWpcIixcImRpa1wiLFwiZGlsXCIsXCJkaW1cIixcImRpblwiLFwiZGlvXCIsXCJkaXBcIixcImRpcVwiLFwiZGlyXCIsXCJkaXNcIixcImRpdFwiLFwiZGl1XCIsXCJkaXdcIixcImRpeFwiLFwiZGl5XCIsXCJkaXpcIixcImRqYVwiLFwiZGpiXCIsXCJkamNcIixcImRqZFwiLFwiZGplXCIsXCJkamZcIixcImRqaVwiLFwiZGpqXCIsXCJkamtcIixcImRqbFwiLFwiZGptXCIsXCJkam5cIixcImRqb1wiLFwiZGpyXCIsXCJkanVcIixcImRqd1wiLFwiZGthXCIsXCJka2dcIixcImRra1wiLFwiZGtsXCIsXCJka3JcIixcImRrc1wiLFwiZGt4XCIsXCJkbGdcIixcImRsa1wiLFwiZGxtXCIsXCJkbG5cIixcImRtYVwiLFwiZG1iXCIsXCJkbWNcIixcImRtZFwiLFwiZG1lXCIsXCJkbWZcIixcImRtZ1wiLFwiZG1rXCIsXCJkbWxcIixcImRtbVwiLFwiZG1uXCIsXCJkbW9cIixcImRtclwiLFwiZG1zXCIsXCJkbXVcIixcImRtdlwiLFwiZG13XCIsXCJkbXhcIixcImRteVwiLFwiZG5hXCIsXCJkbmRcIixcImRuZVwiLFwiZG5nXCIsXCJkbmlcIixcImRualwiLFwiZG5rXCIsXCJkbm5cIixcImRub1wiLFwiZG5yXCIsXCJkbnRcIixcImRudVwiLFwiZG52XCIsXCJkbndcIixcImRueVwiLFwiZG9hXCIsXCJkb2JcIixcImRvY1wiLFwiZG9lXCIsXCJkb2ZcIixcImRvaFwiLFwiZG9pXCIsXCJkb2tcIixcImRvbFwiLFwiZG9uXCIsXCJkb29cIixcImRvcFwiLFwiZG9xXCIsXCJkb3JcIixcImRvc1wiLFwiZG90XCIsXCJkb3ZcIixcImRvd1wiLFwiZG94XCIsXCJkb3lcIixcImRvelwiLFwiZHBwXCIsXCJkcmFcIixcImRyYlwiLFwiZHJjXCIsXCJkcmRcIixcImRyZVwiLFwiZHJnXCIsXCJkcmhcIixcImRyaVwiLFwiZHJsXCIsXCJkcm5cIixcImRyb1wiLFwiZHJxXCIsXCJkcnJcIixcImRyc1wiLFwiZHJ0XCIsXCJkcnVcIixcImRyd1wiLFwiZHJ5XCIsXCJkc2JcIixcImRzZVwiLFwiZHNoXCIsXCJkc2lcIixcImRzbFwiLFwiZHNuXCIsXCJkc29cIixcImRzcVwiLFwiZHRhXCIsXCJkdGJcIixcImR0ZFwiLFwiZHRoXCIsXCJkdGlcIixcImR0a1wiLFwiZHRtXCIsXCJkdG5cIixcImR0b1wiLFwiZHRwXCIsXCJkdHJcIixcImR0c1wiLFwiZHR0XCIsXCJkdHVcIixcImR0eVwiLFwiZHVhXCIsXCJkdWJcIixcImR1Y1wiLFwiZHVkXCIsXCJkdWVcIixcImR1ZlwiLFwiZHVnXCIsXCJkdWhcIixcImR1aVwiLFwiZHVqXCIsXCJkdWtcIixcImR1bFwiLFwiZHVtXCIsXCJkdW5cIixcImR1b1wiLFwiZHVwXCIsXCJkdXFcIixcImR1clwiLFwiZHVzXCIsXCJkdXVcIixcImR1dlwiLFwiZHV3XCIsXCJkdXhcIixcImR1eVwiLFwiZHV6XCIsXCJkdmFcIixcImR3YVwiLFwiZHdrXCIsXCJkd2xcIixcImR3clwiLFwiZHdzXCIsXCJkd3VcIixcImR3d1wiLFwiZHd5XCIsXCJkd3pcIixcImR5YVwiLFwiZHliXCIsXCJkeWRcIixcImR5Z1wiLFwiZHlpXCIsXCJkeW1cIixcImR5blwiLFwiZHlvXCIsXCJkeXVcIixcImR5eVwiLFwiZHphXCIsXCJkemRcIixcImR6ZVwiLFwiZHpnXCIsXCJkemxcIixcImR6blwiXVxuLFsgXCJlZVwiLFwiZWxcIixcImVuXCIsXCJlb1wiLFwiZXNcIixcImV0XCIsXCJldVwiLFwiZWFhXCIsXCJlYmNcIixcImViZ1wiLFwiZWJrXCIsXCJlYm9cIixcImViclwiLFwiZWJ1XCIsXCJlY3JcIixcImVjc1wiLFwiZWN5XCIsXCJlZWVcIixcImVmYVwiLFwiZWZlXCIsXCJlZmlcIixcImVnYVwiLFwiZWdsXCIsXCJlZ29cIixcImVneFwiLFwiZWd5XCIsXCJlaHNcIixcImVodVwiLFwiZWlwXCIsXCJlaXRcIixcImVpdlwiLFwiZWphXCIsXCJla2FcIixcImVrY1wiLFwiZWtlXCIsXCJla2dcIixcImVraVwiLFwiZWtrXCIsXCJla2xcIixcImVrbVwiLFwiZWtvXCIsXCJla3BcIixcImVrclwiLFwiZWt5XCIsXCJlbGVcIixcImVsaFwiLFwiZWxpXCIsXCJlbGtcIixcImVsbVwiLFwiZWxvXCIsXCJlbHBcIixcImVsdVwiLFwiZWx4XCIsXCJlbWFcIixcImVtYlwiLFwiZW1lXCIsXCJlbWdcIixcImVtaVwiLFwiZW1rXCIsXCJlbW1cIixcImVtblwiLFwiZW1vXCIsXCJlbXBcIixcImVtcVwiLFwiZW1zXCIsXCJlbXVcIixcImVtd1wiLFwiZW14XCIsXCJlbXlcIixcImVtelwiLFwiZW5hXCIsXCJlbmJcIixcImVuY1wiLFwiZW5kXCIsXCJlbmZcIixcImVuaFwiLFwiZW5sXCIsXCJlbm1cIixcImVublwiLFwiZW5vXCIsXCJlbnFcIixcImVuclwiLFwiZW51XCIsXCJlbnZcIixcImVud1wiLFwiZW54XCIsXCJlb3RcIixcImVwaVwiLFwiZXJhXCIsXCJlcmdcIixcImVyaFwiLFwiZXJpXCIsXCJlcmtcIixcImVyb1wiLFwiZXJyXCIsXCJlcnNcIixcImVydFwiLFwiZXJ3XCIsXCJlc2VcIixcImVzZ1wiLFwiZXNoXCIsXCJlc2lcIixcImVza1wiLFwiZXNsXCIsXCJlc21cIixcImVzblwiLFwiZXNvXCIsXCJlc3FcIixcImVzc1wiLFwiZXN1XCIsXCJlc3hcIixcImVzeVwiLFwiZXRiXCIsXCJldGNcIixcImV0aFwiLFwiZXRuXCIsXCJldG9cIixcImV0clwiLFwiZXRzXCIsXCJldHRcIixcImV0dVwiLFwiZXR4XCIsXCJldHpcIixcImV1cVwiLFwiZXZlXCIsXCJldmhcIixcImV2blwiLFwiZXdvXCIsXCJleHRcIixcImV5YVwiLFwiZXlvXCIsXCJlemFcIixcImV6ZVwiXVxuLFsgXCJmYVwiLFwiZmZcIixcImZpXCIsXCJmalwiLFwiZm9cIixcImZyXCIsXCJmeVwiLFwiZmFhXCIsXCJmYWJcIixcImZhZFwiLFwiZmFmXCIsXCJmYWdcIixcImZhaFwiLFwiZmFpXCIsXCJmYWpcIixcImZha1wiLFwiZmFsXCIsXCJmYW1cIixcImZhblwiLFwiZmFwXCIsXCJmYXJcIixcImZhdFwiLFwiZmF1XCIsXCJmYXhcIixcImZheVwiLFwiZmF6XCIsXCJmYmxcIixcImZjc1wiLFwiZmVyXCIsXCJmZmlcIixcImZmbVwiLFwiZmdyXCIsXCJmaWFcIixcImZpZVwiLFwiZmlmXCIsXCJmaWxcIixcImZpcFwiLFwiZmlyXCIsXCJmaXRcIixcImZpdVwiLFwiZml3XCIsXCJma2tcIixcImZrdlwiLFwiZmxhXCIsXCJmbGhcIixcImZsaVwiLFwiZmxsXCIsXCJmbG5cIixcImZsclwiLFwiZmx5XCIsXCJmbXBcIixcImZtdVwiLFwiZm5iXCIsXCJmbmdcIixcImZuaVwiLFwiZm9kXCIsXCJmb2lcIixcImZvbVwiLFwiZm9uXCIsXCJmb3JcIixcImZvc1wiLFwiZm94XCIsXCJmcGVcIixcImZxc1wiLFwiZnJjXCIsXCJmcmRcIixcImZya1wiLFwiZnJtXCIsXCJmcm9cIixcImZycFwiLFwiZnJxXCIsXCJmcnJcIixcImZyc1wiLFwiZnJ0XCIsXCJmc2VcIixcImZzbFwiLFwiZnNzXCIsXCJmdWJcIixcImZ1Y1wiLFwiZnVkXCIsXCJmdWVcIixcImZ1ZlwiLFwiZnVoXCIsXCJmdWlcIixcImZ1alwiLFwiZnVtXCIsXCJmdW5cIixcImZ1cVwiLFwiZnVyXCIsXCJmdXRcIixcImZ1dVwiLFwiZnV2XCIsXCJmdXlcIixcImZ2clwiLFwiZndhXCIsXCJmd2VcIl1cbixbIFwiZ2FcIixcImdkXCIsXCJnbFwiLFwiZ25cIixcImd1XCIsXCJndlwiLFwiZ2FhXCIsXCJnYWJcIixcImdhY1wiLFwiZ2FkXCIsXCJnYWVcIixcImdhZlwiLFwiZ2FnXCIsXCJnYWhcIixcImdhaVwiLFwiZ2FqXCIsXCJnYWtcIixcImdhbFwiLFwiZ2FtXCIsXCJnYW5cIixcImdhb1wiLFwiZ2FwXCIsXCJnYXFcIixcImdhclwiLFwiZ2FzXCIsXCJnYXRcIixcImdhdVwiLFwiZ2F2XCIsXCJnYXdcIixcImdheFwiLFwiZ2F5XCIsXCJnYXpcIixcImdiYVwiLFwiZ2JiXCIsXCJnYmNcIixcImdiZFwiLFwiZ2JlXCIsXCJnYmZcIixcImdiZ1wiLFwiZ2JoXCIsXCJnYmlcIixcImdialwiLFwiZ2JrXCIsXCJnYmxcIixcImdibVwiLFwiZ2JuXCIsXCJnYm9cIixcImdicFwiLFwiZ2JxXCIsXCJnYnJcIixcImdic1wiLFwiZ2J1XCIsXCJnYnZcIixcImdid1wiLFwiZ2J4XCIsXCJnYnlcIixcImdielwiLFwiZ2NjXCIsXCJnY2RcIixcImdjZVwiLFwiZ2NmXCIsXCJnY2xcIixcImdjblwiLFwiZ2NyXCIsXCJnY3RcIixcImdkYVwiLFwiZ2RiXCIsXCJnZGNcIixcImdkZFwiLFwiZ2RlXCIsXCJnZGZcIixcImdkZ1wiLFwiZ2RoXCIsXCJnZGlcIixcImdkalwiLFwiZ2RrXCIsXCJnZGxcIixcImdkbVwiLFwiZ2RuXCIsXCJnZG9cIixcImdkcVwiLFwiZ2RyXCIsXCJnZHNcIixcImdkdFwiLFwiZ2R1XCIsXCJnZHhcIixcImdlYVwiLFwiZ2ViXCIsXCJnZWNcIixcImdlZFwiLFwiZ2VmXCIsXCJnZWdcIixcImdlaFwiLFwiZ2VpXCIsXCJnZWpcIixcImdla1wiLFwiZ2VsXCIsXCJnZW1cIixcImdlcVwiLFwiZ2VzXCIsXCJnZXZcIixcImdld1wiLFwiZ2V4XCIsXCJnZXlcIixcImdlelwiLFwiZ2ZrXCIsXCJnZnRcIixcImdmeFwiLFwiZ2dhXCIsXCJnZ2JcIixcImdnZFwiLFwiZ2dlXCIsXCJnZ2dcIixcImdna1wiLFwiZ2dsXCIsXCJnZ25cIixcImdnb1wiLFwiZ2dyXCIsXCJnZ3RcIixcImdndVwiLFwiZ2d3XCIsXCJnaGFcIixcImdoY1wiLFwiZ2hlXCIsXCJnaGhcIixcImdoa1wiLFwiZ2hsXCIsXCJnaG5cIixcImdob1wiLFwiZ2hyXCIsXCJnaHNcIixcImdodFwiLFwiZ2lhXCIsXCJnaWJcIixcImdpY1wiLFwiZ2lkXCIsXCJnaWVcIixcImdpZ1wiLFwiZ2loXCIsXCJnaWlcIixcImdpbFwiLFwiZ2ltXCIsXCJnaW5cIixcImdpb1wiLFwiZ2lwXCIsXCJnaXFcIixcImdpclwiLFwiZ2lzXCIsXCJnaXRcIixcImdpdVwiLFwiZ2l3XCIsXCJnaXhcIixcImdpeVwiLFwiZ2l6XCIsXCJnamlcIixcImdqa1wiLFwiZ2ptXCIsXCJnam5cIixcImdqclwiLFwiZ2p1XCIsXCJna2FcIixcImdrZFwiLFwiZ2tlXCIsXCJna25cIixcImdrb1wiLFwiZ2twXCIsXCJna3VcIixcImdsYlwiLFwiZ2xjXCIsXCJnbGRcIixcImdsaFwiLFwiZ2xpXCIsXCJnbGpcIixcImdsa1wiLFwiZ2xsXCIsXCJnbG9cIixcImdsclwiLFwiZ2x1XCIsXCJnbHdcIixcImdseVwiLFwiZ21hXCIsXCJnbWJcIixcImdtZFwiLFwiZ21lXCIsXCJnbWdcIixcImdtaFwiLFwiZ21sXCIsXCJnbW1cIixcImdtblwiLFwiZ21xXCIsXCJnbXJcIixcImdtdVwiLFwiZ212XCIsXCJnbXdcIixcImdteFwiLFwiZ215XCIsXCJnbXpcIixcImduYVwiLFwiZ25iXCIsXCJnbmNcIixcImduZFwiLFwiZ25lXCIsXCJnbmdcIixcImduaFwiLFwiZ25pXCIsXCJnbmpcIixcImdua1wiLFwiZ25sXCIsXCJnbm1cIixcImdublwiLFwiZ25vXCIsXCJnbnFcIixcImduclwiLFwiZ250XCIsXCJnbnVcIixcImdud1wiLFwiZ256XCIsXCJnb2FcIixcImdvYlwiLFwiZ29jXCIsXCJnb2RcIixcImdvZVwiLFwiZ29mXCIsXCJnb2dcIixcImdvaFwiLFwiZ29pXCIsXCJnb2pcIixcImdva1wiLFwiZ29sXCIsXCJnb21cIixcImdvblwiLFwiZ29vXCIsXCJnb3BcIixcImdvcVwiLFwiZ29yXCIsXCJnb3NcIixcImdvdFwiLFwiZ291XCIsXCJnb3dcIixcImdveFwiLFwiZ295XCIsXCJnb3pcIixcImdwYVwiLFwiZ3BlXCIsXCJncG5cIixcImdxYVwiLFwiZ3FpXCIsXCJncW5cIixcImdxclwiLFwiZ3F1XCIsXCJncmFcIixcImdyYlwiLFwiZ3JjXCIsXCJncmRcIixcImdyZ1wiLFwiZ3JoXCIsXCJncmlcIixcImdyalwiLFwiZ3JrXCIsXCJncm1cIixcImdyb1wiLFwiZ3JxXCIsXCJncnJcIixcImdyc1wiLFwiZ3J0XCIsXCJncnVcIixcImdydlwiLFwiZ3J3XCIsXCJncnhcIixcImdyeVwiLFwiZ3J6XCIsXCJnc2VcIixcImdzZ1wiLFwiZ3NsXCIsXCJnc21cIixcImdzblwiLFwiZ3NvXCIsXCJnc3BcIixcImdzc1wiLFwiZ3N3XCIsXCJndGFcIixcImd0aVwiLFwiZ3R1XCIsXCJndWFcIixcImd1YlwiLFwiZ3VjXCIsXCJndWRcIixcImd1ZVwiLFwiZ3VmXCIsXCJndWdcIixcImd1aFwiLFwiZ3VpXCIsXCJndWtcIixcImd1bFwiLFwiZ3VtXCIsXCJndW5cIixcImd1b1wiLFwiZ3VwXCIsXCJndXFcIixcImd1clwiLFwiZ3VzXCIsXCJndXRcIixcImd1dVwiLFwiZ3V2XCIsXCJndXdcIixcImd1eFwiLFwiZ3V6XCIsXCJndmFcIixcImd2Y1wiLFwiZ3ZlXCIsXCJndmZcIixcImd2alwiLFwiZ3ZsXCIsXCJndm1cIixcImd2blwiLFwiZ3ZvXCIsXCJndnBcIixcImd2clwiLFwiZ3ZzXCIsXCJndnlcIixcImd3YVwiLFwiZ3diXCIsXCJnd2NcIixcImd3ZFwiLFwiZ3dlXCIsXCJnd2ZcIixcImd3Z1wiLFwiZ3dpXCIsXCJnd2pcIixcImd3bVwiLFwiZ3duXCIsXCJnd3JcIixcImd3dFwiLFwiZ3d1XCIsXCJnd3dcIixcImd3eFwiLFwiZ3h4XCIsXCJneWFcIixcImd5YlwiLFwiZ3lkXCIsXCJneWVcIixcImd5ZlwiLFwiZ3lnXCIsXCJneWlcIixcImd5bFwiLFwiZ3ltXCIsXCJneW5cIixcImd5b1wiLFwiZ3lyXCIsXCJneXlcIixcImd5elwiLFwiZ3phXCIsXCJnemlcIixcImd6blwiXVxuLFsgXCJoYVwiLFwiaGVcIixcImhpXCIsXCJob1wiLFwiaHJcIixcImh0XCIsXCJodVwiLFwiaHlcIixcImh6XCIsXCJoYWFcIixcImhhYlwiLFwiaGFjXCIsXCJoYWRcIixcImhhZVwiLFwiaGFmXCIsXCJoYWdcIixcImhhaFwiLFwiaGFpXCIsXCJoYWpcIixcImhha1wiLFwiaGFsXCIsXCJoYW1cIixcImhhblwiLFwiaGFvXCIsXCJoYXBcIixcImhhcVwiLFwiaGFyXCIsXCJoYXNcIixcImhhdlwiLFwiaGF3XCIsXCJoYXhcIixcImhheVwiLFwiaGF6XCIsXCJoYmFcIixcImhiYlwiLFwiaGJuXCIsXCJoYm9cIixcImhidVwiLFwiaGNhXCIsXCJoY2hcIixcImhkblwiLFwiaGRzXCIsXCJoZHlcIixcImhlYVwiLFwiaGVkXCIsXCJoZWdcIixcImhlaFwiLFwiaGVpXCIsXCJoZW1cIixcImhnbVwiLFwiaGd3XCIsXCJoaGlcIixcImhoclwiLFwiaGh5XCIsXCJoaWFcIixcImhpYlwiLFwiaGlkXCIsXCJoaWZcIixcImhpZ1wiLFwiaGloXCIsXCJoaWlcIixcImhpalwiLFwiaGlrXCIsXCJoaWxcIixcImhpbVwiLFwiaGlvXCIsXCJoaXJcIixcImhpdFwiLFwiaGl3XCIsXCJoaXhcIixcImhqaVwiLFwiaGthXCIsXCJoa2VcIixcImhraFwiLFwiaGtrXCIsXCJoa25cIixcImhrc1wiLFwiaGxhXCIsXCJobGJcIixcImhsZFwiLFwiaGxlXCIsXCJobHRcIixcImhsdVwiLFwiaG1hXCIsXCJobWJcIixcImhtY1wiLFwiaG1kXCIsXCJobWVcIixcImhtZlwiLFwiaG1nXCIsXCJobWhcIixcImhtaVwiLFwiaG1qXCIsXCJobWtcIixcImhtbFwiLFwiaG1tXCIsXCJobW5cIixcImhtcFwiLFwiaG1xXCIsXCJobXJcIixcImhtc1wiLFwiaG10XCIsXCJobXVcIixcImhtdlwiLFwiaG13XCIsXCJobXhcIixcImhteVwiLFwiaG16XCIsXCJobmFcIixcImhuZFwiLFwiaG5lXCIsXCJobmdcIixcImhuaFwiLFwiaG5pXCIsXCJobmpcIixcImhublwiLFwiaG5vXCIsXCJobnNcIixcImhudVwiLFwiaG9hXCIsXCJob2JcIixcImhvY1wiLFwiaG9kXCIsXCJob2VcIixcImhvaFwiLFwiaG9pXCIsXCJob2pcIixcImhva1wiLFwiaG9sXCIsXCJob21cIixcImhvb1wiLFwiaG9wXCIsXCJob3JcIixcImhvc1wiLFwiaG90XCIsXCJob3ZcIixcImhvd1wiLFwiaG95XCIsXCJob3pcIixcImhwb1wiLFwiaHBzXCIsXCJocmFcIixcImhyY1wiLFwiaHJlXCIsXCJocmtcIixcImhybVwiLFwiaHJvXCIsXCJocnBcIixcImhyclwiLFwiaHJ0XCIsXCJocnVcIixcImhyd1wiLFwiaHJ4XCIsXCJocnpcIixcImhzYlwiLFwiaHNoXCIsXCJoc2xcIixcImhzblwiLFwiaHNzXCIsXCJodGlcIixcImh0b1wiLFwiaHRzXCIsXCJodHVcIixcImh0eFwiLFwiaHViXCIsXCJodWNcIixcImh1ZFwiLFwiaHVlXCIsXCJodWZcIixcImh1Z1wiLFwiaHVoXCIsXCJodWlcIixcImh1alwiLFwiaHVrXCIsXCJodWxcIixcImh1bVwiLFwiaHVvXCIsXCJodXBcIixcImh1cVwiLFwiaHVyXCIsXCJodXNcIixcImh1dFwiLFwiaHV1XCIsXCJodXZcIixcImh1d1wiLFwiaHV4XCIsXCJodXlcIixcImh1elwiLFwiaHZjXCIsXCJodmVcIixcImh2a1wiLFwiaHZuXCIsXCJodnZcIixcImh3YVwiLFwiaHdjXCIsXCJod29cIixcImh5YVwiLFwiaHl3XCIsXCJoeXhcIl1cbixbIFwiaWFcIixcImlkXCIsXCJpZVwiLFwiaWdcIixcImlpXCIsXCJpa1wiLFwiaW5cIixcImlvXCIsXCJpc1wiLFwiaXRcIixcIml1XCIsXCJpd1wiLFwiaWFpXCIsXCJpYW5cIixcImlhcFwiLFwiaWFyXCIsXCJpYmFcIixcImliYlwiLFwiaWJkXCIsXCJpYmVcIixcImliZ1wiLFwiaWJoXCIsXCJpYmlcIixcImlibFwiLFwiaWJtXCIsXCJpYm5cIixcImliclwiLFwiaWJ1XCIsXCJpYnlcIixcImljYVwiLFwiaWNoXCIsXCJpY2xcIixcImljclwiLFwiaWRhXCIsXCJpZGJcIixcImlkY1wiLFwiaWRkXCIsXCJpZGVcIixcImlkaVwiLFwiaWRyXCIsXCJpZHNcIixcImlkdFwiLFwiaWR1XCIsXCJpZmFcIixcImlmYlwiLFwiaWZlXCIsXCJpZmZcIixcImlma1wiLFwiaWZtXCIsXCJpZnVcIixcImlmeVwiLFwiaWdiXCIsXCJpZ2VcIixcImlnZ1wiLFwiaWdsXCIsXCJpZ21cIixcImlnblwiLFwiaWdvXCIsXCJpZ3NcIixcImlnd1wiLFwiaWhiXCIsXCJpaGlcIixcImlocFwiLFwiaWh3XCIsXCJpaW5cIixcImlpclwiLFwiaWpjXCIsXCJpamVcIixcImlqalwiLFwiaWpuXCIsXCJpam9cIixcImlqc1wiLFwiaWtlXCIsXCJpa2lcIixcImlra1wiLFwiaWtsXCIsXCJpa29cIixcImlrcFwiLFwiaWtyXCIsXCJpa3NcIixcImlrdFwiLFwiaWt2XCIsXCJpa3dcIixcImlreFwiLFwiaWt6XCIsXCJpbGFcIixcImlsYlwiLFwiaWxnXCIsXCJpbGlcIixcImlsa1wiLFwiaWxsXCIsXCJpbG1cIixcImlsb1wiLFwiaWxwXCIsXCJpbHNcIixcImlsdVwiLFwiaWx2XCIsXCJpbHdcIixcImltYVwiLFwiaW1lXCIsXCJpbWlcIixcImltbFwiLFwiaW1uXCIsXCJpbW9cIixcImltclwiLFwiaW1zXCIsXCJpbXlcIixcImluYlwiLFwiaW5jXCIsXCJpbmVcIixcImluZ1wiLFwiaW5oXCIsXCJpbmpcIixcImlubFwiLFwiaW5tXCIsXCJpbm5cIixcImlub1wiLFwiaW5wXCIsXCJpbnNcIixcImludFwiLFwiaW56XCIsXCJpb3JcIixcImlvdVwiLFwiaW93XCIsXCJpcGlcIixcImlwb1wiLFwiaXF1XCIsXCJpcXdcIixcImlyYVwiLFwiaXJlXCIsXCJpcmhcIixcImlyaVwiLFwiaXJrXCIsXCJpcm5cIixcImlyb1wiLFwiaXJyXCIsXCJpcnVcIixcImlyeFwiLFwiaXJ5XCIsXCJpc2FcIixcImlzY1wiLFwiaXNkXCIsXCJpc2VcIixcImlzZ1wiLFwiaXNoXCIsXCJpc2lcIixcImlza1wiLFwiaXNtXCIsXCJpc25cIixcImlzb1wiLFwiaXNyXCIsXCJpc3RcIixcImlzdVwiLFwiaXRiXCIsXCJpdGNcIixcIml0ZFwiLFwiaXRlXCIsXCJpdGlcIixcIml0a1wiLFwiaXRsXCIsXCJpdG1cIixcIml0b1wiLFwiaXRyXCIsXCJpdHNcIixcIml0dFwiLFwiaXR2XCIsXCJpdHdcIixcIml0eFwiLFwiaXR5XCIsXCJpdHpcIixcIml1bVwiLFwiaXZiXCIsXCJpdnZcIixcIml3a1wiLFwiaXdtXCIsXCJpd29cIixcIml3c1wiLFwiaXhjXCIsXCJpeGxcIixcIml5YVwiLFwiaXlvXCIsXCJpeXhcIixcIml6aFwiLFwiaXppXCIsXCJpenJcIixcIml6elwiXVxuLFsgXCJqYVwiLFwiamlcIixcImp2XCIsXCJqd1wiLFwiamFhXCIsXCJqYWJcIixcImphY1wiLFwiamFkXCIsXCJqYWVcIixcImphZlwiLFwiamFoXCIsXCJqYWpcIixcImpha1wiLFwiamFsXCIsXCJqYW1cIixcImphblwiLFwiamFvXCIsXCJqYXFcIixcImphclwiLFwiamFzXCIsXCJqYXRcIixcImphdVwiLFwiamF4XCIsXCJqYXlcIixcImphelwiLFwiamJlXCIsXCJqYmlcIixcImpialwiLFwiamJrXCIsXCJqYm1cIixcImpiblwiLFwiamJvXCIsXCJqYnJcIixcImpidFwiLFwiamJ1XCIsXCJqYndcIixcImpjc1wiLFwiamN0XCIsXCJqZGFcIixcImpkZ1wiLFwiamR0XCIsXCJqZWJcIixcImplZVwiLFwiamVnXCIsXCJqZWhcIixcImplaVwiLFwiamVrXCIsXCJqZWxcIixcImplblwiLFwiamVyXCIsXCJqZXRcIixcImpldVwiLFwiamdiXCIsXCJqZ2VcIixcImpna1wiLFwiamdvXCIsXCJqaGlcIixcImpoc1wiLFwiamlhXCIsXCJqaWJcIixcImppY1wiLFwiamlkXCIsXCJqaWVcIixcImppZ1wiLFwiamloXCIsXCJqaWlcIixcImppbFwiLFwiamltXCIsXCJqaW9cIixcImppcVwiLFwiaml0XCIsXCJqaXVcIixcImppdlwiLFwiaml5XCIsXCJqamVcIixcImpqclwiLFwiamthXCIsXCJqa21cIixcImprb1wiLFwiamtwXCIsXCJqa3JcIixcImprc1wiLFwiamt1XCIsXCJqbGVcIixcImpsc1wiLFwiam1hXCIsXCJqbWJcIixcImptY1wiLFwiam1kXCIsXCJqbWlcIixcImptbFwiLFwiam1uXCIsXCJqbXJcIixcImptc1wiLFwiam13XCIsXCJqbXhcIixcImpuYVwiLFwiam5kXCIsXCJqbmdcIixcImpuaVwiLFwiam5qXCIsXCJqbmxcIixcImpuc1wiLFwiam9iXCIsXCJqb2RcIixcImpvZ1wiLFwiam9yXCIsXCJqb3NcIixcImpvd1wiLFwianBhXCIsXCJqcHJcIixcImpweFwiLFwianFyXCIsXCJqcmFcIixcImpyYlwiLFwianJyXCIsXCJqcnRcIixcImpydVwiLFwianNsXCIsXCJqdWFcIixcImp1YlwiLFwianVjXCIsXCJqdWRcIixcImp1aFwiLFwianVpXCIsXCJqdWtcIixcImp1bFwiLFwianVtXCIsXCJqdW5cIixcImp1b1wiLFwianVwXCIsXCJqdXJcIixcImp1c1wiLFwianV0XCIsXCJqdXVcIixcImp1d1wiLFwianV5XCIsXCJqdmRcIixcImp2blwiLFwiandpXCIsXCJqeWFcIixcImp5ZVwiLFwianl5XCJdXG4sWyBcImthXCIsXCJrZ1wiLFwia2lcIixcImtqXCIsXCJra1wiLFwia2xcIixcImttXCIsXCJrblwiLFwia29cIixcImtyXCIsXCJrc1wiLFwia3VcIixcImt2XCIsXCJrd1wiLFwia3lcIixcImthYVwiLFwia2FiXCIsXCJrYWNcIixcImthZFwiLFwia2FlXCIsXCJrYWZcIixcImthZ1wiLFwia2FoXCIsXCJrYWlcIixcImthalwiLFwia2FrXCIsXCJrYW1cIixcImthb1wiLFwia2FwXCIsXCJrYXFcIixcImthclwiLFwia2F2XCIsXCJrYXdcIixcImtheFwiLFwia2F5XCIsXCJrYmFcIixcImtiYlwiLFwia2JjXCIsXCJrYmRcIixcImtiZVwiLFwia2JmXCIsXCJrYmdcIixcImtiaFwiLFwia2JpXCIsXCJrYmpcIixcImtia1wiLFwia2JsXCIsXCJrYm1cIixcImtiblwiLFwia2JvXCIsXCJrYnBcIixcImticVwiLFwia2JyXCIsXCJrYnNcIixcImtidFwiLFwia2J1XCIsXCJrYnZcIixcImtid1wiLFwia2J4XCIsXCJrYnlcIixcImtielwiLFwia2NhXCIsXCJrY2JcIixcImtjY1wiLFwia2NkXCIsXCJrY2VcIixcImtjZlwiLFwia2NnXCIsXCJrY2hcIixcImtjaVwiLFwia2NqXCIsXCJrY2tcIixcImtjbFwiLFwia2NtXCIsXCJrY25cIixcImtjb1wiLFwia2NwXCIsXCJrY3FcIixcImtjclwiLFwia2NzXCIsXCJrY3RcIixcImtjdVwiLFwia2N2XCIsXCJrY3dcIixcImtjeFwiLFwia2N5XCIsXCJrY3pcIixcImtkYVwiLFwia2RjXCIsXCJrZGRcIixcImtkZVwiLFwia2RmXCIsXCJrZGdcIixcImtkaFwiLFwia2RpXCIsXCJrZGpcIixcImtka1wiLFwia2RsXCIsXCJrZG1cIixcImtkblwiLFwia2RvXCIsXCJrZHBcIixcImtkcVwiLFwia2RyXCIsXCJrZHRcIixcImtkdVwiLFwia2R2XCIsXCJrZHdcIixcImtkeFwiLFwia2R5XCIsXCJrZHpcIixcImtlYVwiLFwia2ViXCIsXCJrZWNcIixcImtlZFwiLFwia2VlXCIsXCJrZWZcIixcImtlZ1wiLFwia2VoXCIsXCJrZWlcIixcImtlalwiLFwia2VrXCIsXCJrZWxcIixcImtlbVwiLFwia2VuXCIsXCJrZW9cIixcImtlcFwiLFwia2VxXCIsXCJrZXJcIixcImtlc1wiLFwia2V0XCIsXCJrZXVcIixcImtldlwiLFwia2V3XCIsXCJrZXhcIixcImtleVwiLFwia2V6XCIsXCJrZmFcIixcImtmYlwiLFwia2ZjXCIsXCJrZmRcIixcImtmZVwiLFwia2ZmXCIsXCJrZmdcIixcImtmaFwiLFwia2ZpXCIsXCJrZmpcIixcImtma1wiLFwia2ZsXCIsXCJrZm1cIixcImtmblwiLFwia2ZvXCIsXCJrZnBcIixcImtmcVwiLFwia2ZyXCIsXCJrZnNcIixcImtmdFwiLFwia2Z1XCIsXCJrZnZcIixcImtmd1wiLFwia2Z4XCIsXCJrZnlcIixcImtmelwiLFwia2dhXCIsXCJrZ2JcIixcImtnY1wiLFwia2dkXCIsXCJrZ2VcIixcImtnZlwiLFwia2dnXCIsXCJrZ2hcIixcImtnaVwiLFwia2dqXCIsXCJrZ2tcIixcImtnbFwiLFwia2dtXCIsXCJrZ25cIixcImtnb1wiLFwia2dwXCIsXCJrZ3FcIixcImtnclwiLFwia2dzXCIsXCJrZ3RcIixcImtndVwiLFwia2d2XCIsXCJrZ3dcIixcImtneFwiLFwia2d5XCIsXCJraGFcIixcImx5Z1wiLFwia2hiXCIsXCJraGNcIixcImtoZFwiLFwia2hlXCIsXCJraGZcIixcImtoZ1wiLFwia2hoXCIsXCJraGlcIixcImtoalwiLFwia2hrXCIsXCJraGxcIixcImtoblwiLFwia2hvXCIsXCJraHBcIixcImtocVwiLFwia2hyXCIsXCJraHNcIixcImtodFwiLFwia2h1XCIsXCJraHZcIixcImtod1wiLFwia2h4XCIsXCJraHlcIixcImtoelwiLFwia2lhXCIsXCJraWJcIixcImtpY1wiLFwia2lkXCIsXCJraWVcIixcImtpZlwiLFwia2lnXCIsXCJraWhcIixcImtpaVwiLFwia2lqXCIsXCJraWxcIixcImtpbVwiLFwia2lvXCIsXCJraXBcIixcImtpcVwiLFwia2lzXCIsXCJraXRcIixcImtpdVwiLFwia2l2XCIsXCJraXdcIixcImtpeFwiLFwia2l5XCIsXCJraXpcIixcImtqYVwiLFwia2piXCIsXCJramNcIixcImtqZFwiLFwia2plXCIsXCJramZcIixcImtqZ1wiLFwia2poXCIsXCJramlcIixcImtqalwiLFwia2prXCIsXCJramxcIixcImtqbVwiLFwia2puXCIsXCJram9cIixcImtqcFwiLFwia2pxXCIsXCJranJcIixcImtqc1wiLFwia2p0XCIsXCJranVcIixcImtqdlwiLFwia2p4XCIsXCJranlcIixcImtqelwiLFwia2thXCIsXCJra2JcIixcImtrY1wiLFwia2tkXCIsXCJra2VcIixcImtrZlwiLFwia2tnXCIsXCJra2hcIixcImtraVwiLFwia2tqXCIsXCJra2tcIixcImtrbFwiLFwia2ttXCIsXCJra25cIixcImtrb1wiLFwia2twXCIsXCJra3FcIixcImtrclwiLFwia2tzXCIsXCJra3RcIixcImtrdVwiLFwia2t2XCIsXCJra3dcIixcImtreFwiLFwia2t5XCIsXCJra3pcIixcImtsYVwiLFwia2xiXCIsXCJrbGNcIixcImtsZFwiLFwia2xlXCIsXCJrbGZcIixcImtsZ1wiLFwia2xoXCIsXCJrbGlcIixcImtsalwiLFwia2xrXCIsXCJrbGxcIixcImtsbVwiLFwia2xuXCIsXCJrbG9cIixcImtscFwiLFwia2xxXCIsXCJrbHJcIixcImtsc1wiLFwia2x0XCIsXCJrbHVcIixcImtsdlwiLFwia2x3XCIsXCJrbHhcIixcImtseVwiLFwia2x6XCIsXCJrbWFcIixcImttYlwiLFwia21jXCIsXCJrbWRcIixcImttZVwiLFwia21mXCIsXCJrbWdcIixcImttaFwiLFwia21pXCIsXCJrbWpcIixcImtta1wiLFwia21sXCIsXCJrbW1cIixcImttblwiLFwia21vXCIsXCJrbXBcIixcImttcVwiLFwia21yXCIsXCJrbXNcIixcImttdFwiLFwia211XCIsXCJrbXZcIixcImttd1wiLFwia214XCIsXCJrbXlcIixcImttelwiLFwia25hXCIsXCJrbmJcIixcImtuY1wiLFwia25kXCIsXCJrbmVcIixcImtuZlwiLFwia25nXCIsXCJrbmlcIixcImtualwiLFwia25rXCIsXCJrbmxcIixcImtubVwiLFwia25uXCIsXCJrbm9cIixcImtucFwiLFwia25xXCIsXCJrbnJcIixcImtuc1wiLFwia250XCIsXCJrbnVcIixcImtudlwiLFwia253XCIsXCJrbnhcIixcImtueVwiLFwia256XCIsXCJrb2FcIixcImtvY1wiLFwia29kXCIsXCJrb2VcIixcImtvZlwiLFwia29nXCIsXCJrb2hcIixcImtvaVwiLFwia29qXCIsXCJrb2tcIixcImtvbFwiLFwia29vXCIsXCJrb3BcIixcImtvcVwiLFwia29zXCIsXCJrb3RcIixcImtvdVwiLFwia292XCIsXCJrb3dcIixcImtveFwiLFwia295XCIsXCJrb3pcIixcImtwYVwiLFwia3BiXCIsXCJrcGNcIixcImtwZFwiLFwia3BlXCIsXCJrcGZcIixcImtwZ1wiLFwia3BoXCIsXCJrcGlcIixcImtwalwiLFwia3BrXCIsXCJrcGxcIixcImtwbVwiLFwia3BuXCIsXCJrcG9cIixcImtwcFwiLFwia3BxXCIsXCJrcHJcIixcImtwc1wiLFwia3B0XCIsXCJrcHVcIixcImtwdlwiLFwia3B3XCIsXCJrcHhcIixcImtweVwiLFwia3B6XCIsXCJrcWFcIixcImtxYlwiLFwia3FjXCIsXCJrcWRcIixcImtxZVwiLFwia3FmXCIsXCJrcWdcIixcImtxaFwiLFwia3FpXCIsXCJrcWpcIixcImtxa1wiLFwia3FsXCIsXCJrcW1cIixcImtxblwiLFwia3FvXCIsXCJrcXBcIixcImtxcVwiLFwia3FyXCIsXCJrcXNcIixcImtxdFwiLFwia3F1XCIsXCJrcXZcIixcImtxd1wiLFwia3F4XCIsXCJrcXlcIixcImtxelwiLFwia3JhXCIsXCJrcmJcIixcImtyY1wiLFwia3JkXCIsXCJrcmVcIixcImtyZlwiLFwia3JoXCIsXCJrcmlcIixcImtyalwiLFwia3JrXCIsXCJrcmxcIixcImtybVwiLFwia3JuXCIsXCJrcm9cIixcImtycFwiLFwia3JyXCIsXCJrcnNcIixcImtydFwiLFwia3J1XCIsXCJrcnZcIixcImtyd1wiLFwia3J4XCIsXCJrcnlcIixcImtyelwiLFwia3NhXCIsXCJrc2JcIixcImtzY1wiLFwia3NkXCIsXCJrc2VcIixcImtzZlwiLFwia3NnXCIsXCJrc2hcIixcImtzaVwiLFwia3NqXCIsXCJrc2tcIixcImtzbFwiLFwia3NtXCIsXCJrc25cIixcImtzb1wiLFwia3NwXCIsXCJrc3FcIixcImtzclwiLFwia3NzXCIsXCJrc3RcIixcImtzdVwiLFwia3N2XCIsXCJrc3dcIixcImtzeFwiLFwia3N5XCIsXCJrc3pcIixcImt0YVwiLFwia3RiXCIsXCJrdGNcIixcImt0ZFwiLFwia3RlXCIsXCJrdGZcIixcImt0Z1wiLFwia3RoXCIsXCJrdGlcIixcImt0alwiLFwia3RrXCIsXCJrdGxcIixcImt0bVwiLFwia3RuXCIsXCJrdG9cIixcImt0cFwiLFwia3RxXCIsXCJrdHJcIixcImt0c1wiLFwia3R0XCIsXCJrdHVcIixcImt0dlwiLFwia3R3XCIsXCJrdHhcIixcImt0eVwiLFwia3R6XCIsXCJrdWJcIixcImt1Y1wiLFwia3VkXCIsXCJrdWVcIixcImt1ZlwiLFwia3VnXCIsXCJrdWhcIixcImt1aVwiLFwia3VqXCIsXCJrdWtcIixcImt1bFwiLFwia3VtXCIsXCJrdW5cIixcImt1b1wiLFwia3VwXCIsXCJrdXFcIixcImt1c1wiLFwia3V0XCIsXCJrdXVcIixcImt1dlwiLFwia3V3XCIsXCJrdXhcIixcImt1eVwiLFwia3V6XCIsXCJrdmFcIixcImt2YlwiLFwia3ZjXCIsXCJrdmRcIixcImt2ZVwiLFwia3ZmXCIsXCJrdmdcIixcImt2aFwiLFwia3ZpXCIsXCJrdmpcIixcImt2a1wiLFwia3ZsXCIsXCJrdm1cIixcImt2blwiLFwia3ZvXCIsXCJrdnBcIixcImt2cVwiLFwia3ZyXCIsXCJrdnNcIixcImt2dFwiLFwia3Z1XCIsXCJrdnZcIixcImt2d1wiLFwia3Z4XCIsXCJrdnlcIixcImt2elwiLFwia3dhXCIsXCJrd2JcIixcImt3Y1wiLFwia3dkXCIsXCJrd2VcIixcImt3ZlwiLFwia3dnXCIsXCJrd2hcIixcImt3aVwiLFwia3dqXCIsXCJrd2tcIixcImt3bFwiLFwia3dtXCIsXCJrd25cIixcImt3b1wiLFwia3dwXCIsXCJrd3FcIixcImt3clwiLFwia3dzXCIsXCJrd3RcIixcImt3dVwiLFwia3d2XCIsXCJrd3dcIixcImt3eFwiLFwia3d5XCIsXCJrd3pcIixcImt4YVwiLFwia3hiXCIsXCJreGNcIixcImt4ZFwiLFwia3hlXCIsXCJreGZcIixcImt4aFwiLFwia3hpXCIsXCJreGpcIixcImt4a1wiLFwia3hsXCIsXCJreG1cIixcImt4blwiLFwia3hvXCIsXCJreHBcIixcImt4cVwiLFwia3hyXCIsXCJreHNcIixcImt4dFwiLFwia3h1XCIsXCJreHZcIixcImt4d1wiLFwia3h4XCIsXCJreHlcIixcImt4elwiLFwia3lhXCIsXCJreWJcIixcImt5Y1wiLFwia3lkXCIsXCJreWVcIixcImt5ZlwiLFwia3lnXCIsXCJreWhcIixcImt5aVwiLFwia3lqXCIsXCJreWtcIixcImt5bFwiLFwia3ltXCIsXCJreW5cIixcImt5b1wiLFwia3lwXCIsXCJreXFcIixcImt5clwiLFwia3lzXCIsXCJreXRcIixcImt5dVwiLFwia3l2XCIsXCJreXdcIixcImt5eFwiLFwia3l5XCIsXCJreXpcIixcImt6YVwiLFwia3piXCIsXCJremNcIixcImt6ZFwiLFwia3plXCIsXCJremZcIixcImt6Z1wiLFwia3poXCIsXCJremlcIixcImt6alwiLFwia3prXCIsXCJremxcIixcImt6bVwiLFwia3puXCIsXCJrem9cIixcImt6cFwiLFwia3pxXCIsXCJrenJcIixcImt6c1wiLFwia3p0XCIsXCJrenVcIixcImt6dlwiLFwia3p3XCIsXCJrenhcIixcImt6eVwiLFwia3p6XCJdXG4sWyBcImxhXCIsXCJsYlwiLFwibGdcIixcImxpXCIsXCJsblwiLFwibG9cIixcImx0XCIsXCJsdVwiLFwibHZcIixcImxhYVwiLFwibGFiXCIsXCJsYWNcIixcImxhZFwiLFwibGFlXCIsXCJsYWZcIixcImxhZ1wiLFwibGFoXCIsXCJsYWlcIixcImxhalwiLFwibGFrXCIsXCJsYWxcIixcImxhbVwiLFwibGFuXCIsXCJsYXBcIixcImxhcVwiLFwibGFyXCIsXCJsYXNcIixcImxhdVwiLFwibGF3XCIsXCJsYXhcIixcImxheVwiLFwibGF6XCIsXCJsYmFcIixcImxiYlwiLFwibGJjXCIsXCJsYmVcIixcImxiZlwiLFwibGJnXCIsXCJsYmlcIixcImxialwiLFwibGJrXCIsXCJsYmxcIixcImxibVwiLFwibGJuXCIsXCJsYm9cIixcImxicVwiLFwibGJyXCIsXCJsYnNcIixcImxidFwiLFwibGJ1XCIsXCJsYnZcIixcImxid1wiLFwibGJ4XCIsXCJsYnlcIixcImxielwiLFwibGNjXCIsXCJsY2RcIixcImxjZVwiLFwibGNmXCIsXCJsY2hcIixcImxjbFwiLFwibGNtXCIsXCJsY3BcIixcImxjcVwiLFwibGNzXCIsXCJsZGFcIixcImxkYlwiLFwibGRkXCIsXCJsZGdcIixcImxkaFwiLFwibGRpXCIsXCJsZGpcIixcImxka1wiLFwibGRsXCIsXCJsZG1cIixcImxkblwiLFwibGRvXCIsXCJsZHBcIixcImxkcVwiLFwibGVhXCIsXCJsZWJcIixcImxlY1wiLFwibGVkXCIsXCJsZWVcIixcImxlZlwiLFwibGVnXCIsXCJsZWhcIixcImxlaVwiLFwibGVqXCIsXCJsZWtcIixcImxlbFwiLFwibGVtXCIsXCJsZW5cIixcImxlb1wiLFwibGVwXCIsXCJsZXFcIixcImxlclwiLFwibGVzXCIsXCJsZXRcIixcImxldVwiLFwibGV2XCIsXCJsZXdcIixcImxleFwiLFwibGV5XCIsXCJsZXpcIixcImxmYVwiLFwibGZuXCIsXCJsZ2FcIixcImxnYlwiLFwibGdnXCIsXCJsZ2hcIixcImxnaVwiLFwibGdrXCIsXCJsZ2xcIixcImxnbVwiLFwibGduXCIsXCJsZ3FcIixcImxnclwiLFwibGd0XCIsXCJsZ3VcIixcImxnelwiLFwibGhhXCIsXCJsaGhcIixcImxoaVwiLFwibGhsXCIsXCJsaG1cIixcImxoblwiLFwibGhwXCIsXCJsaHNcIixcImxodFwiLFwibGh1XCIsXCJsaWFcIixcImxpYlwiLFwibGljXCIsXCJsaWRcIixcImxpZVwiLFwibGlmXCIsXCJsaWdcIixcImxpaFwiLFwibGlpXCIsXCJsaWpcIixcImxpa1wiLFwibGlsXCIsXCJsaW9cIixcImxpcFwiLFwibGlxXCIsXCJsaXJcIixcImxpc1wiLFwibGl1XCIsXCJsaXZcIixcImxpd1wiLFwibGl4XCIsXCJsaXlcIixcImxpelwiLFwibGphXCIsXCJsamVcIixcImxqaVwiLFwibGpsXCIsXCJsanBcIixcImxqd1wiLFwibGp4XCIsXCJsa2FcIixcImxrYlwiLFwibGtjXCIsXCJsa2RcIixcImxrZVwiLFwibGtoXCIsXCJsa2lcIixcImxralwiLFwibGtsXCIsXCJsa21cIixcImxrblwiLFwibGtvXCIsXCJsa3JcIixcImxrc1wiLFwibGt0XCIsXCJsa3VcIixcImxreVwiLFwibGxhXCIsXCJsbGJcIixcImxsY1wiLFwibGxkXCIsXCJsbGVcIixcImxsZlwiLFwibGxnXCIsXCJsbGhcIixcImxsaVwiLFwibGxqXCIsXCJsbGtcIixcImxsbFwiLFwibGxtXCIsXCJsbG5cIixcImxsb1wiLFwibGxwXCIsXCJsbHFcIixcImxsc1wiLFwibGx1XCIsXCJsbHhcIixcImxtYVwiLFwibG1iXCIsXCJsbWNcIixcImxtZFwiLFwibG1lXCIsXCJsbWZcIixcImxtZ1wiLFwibG1oXCIsXCJsbWlcIixcImxtalwiLFwibG1rXCIsXCJsbWxcIixcImxtbVwiLFwibG1uXCIsXCJsbW9cIixcImxtcFwiLFwibG1xXCIsXCJsbXJcIixcImxtdVwiLFwibG12XCIsXCJsbXdcIixcImxteFwiLFwibG15XCIsXCJsbXpcIixcImxuYVwiLFwibG5iXCIsXCJsbmRcIixcImxuZ1wiLFwibG5oXCIsXCJsbmlcIixcImxualwiLFwibG5sXCIsXCJsbm1cIixcImxublwiLFwibG5vXCIsXCJsbnNcIixcImxudVwiLFwibG53XCIsXCJsbnpcIixcImxvYVwiLFwibG9iXCIsXCJsb2NcIixcImxvZVwiLFwibG9mXCIsXCJsb2dcIixcImxvaFwiLFwibG9pXCIsXCJsb2pcIixcImxva1wiLFwibG9sXCIsXCJsb21cIixcImxvblwiLFwibG9vXCIsXCJsb3BcIixcImxvcVwiLFwibG9yXCIsXCJsb3NcIixcImxvdFwiLFwibG91XCIsXCJsb3ZcIixcImxvd1wiLFwibG94XCIsXCJsb3lcIixcImxvelwiLFwibHBhXCIsXCJscGVcIixcImxwblwiLFwibHBvXCIsXCJscHhcIixcImxyYVwiLFwibHJjXCIsXCJscmVcIixcImxyZ1wiLFwibHJpXCIsXCJscmtcIixcImxybFwiLFwibHJtXCIsXCJscm5cIixcImxyb1wiLFwibHJyXCIsXCJscnRcIixcImxydlwiLFwibHJ6XCIsXCJsc2FcIixcImxzYlwiLFwibHNkXCIsXCJsc2VcIixcImxzZ1wiLFwibHNoXCIsXCJsc2lcIixcImxzbFwiLFwibHNtXCIsXCJsc25cIixcImxzb1wiLFwibHNwXCIsXCJsc3JcIixcImxzc1wiLFwibHN0XCIsXCJsc3ZcIixcImxzeVwiLFwibHRjXCIsXCJsdGdcIixcImx0aFwiLFwibHRpXCIsXCJsdG5cIixcImx0b1wiLFwibHRzXCIsXCJsdHVcIixcImx1YVwiLFwibHVjXCIsXCJsdWRcIixcImx1ZVwiLFwibHVmXCIsXCJsdWlcIixcImx1alwiLFwibHVrXCIsXCJsdWxcIixcImx1bVwiLFwibHVuXCIsXCJsdW9cIixcImx1cFwiLFwibHVxXCIsXCJsdXJcIixcImx1c1wiLFwibHV0XCIsXCJsdXVcIixcImx1dlwiLFwibHV3XCIsXCJsdXlcIixcImx1elwiLFwibHZhXCIsXCJsdmlcIixcImx2a1wiLFwibHZzXCIsXCJsdnVcIixcImx3YVwiLFwibHdlXCIsXCJsd2dcIixcImx3aFwiLFwibHdsXCIsXCJsd21cIixcImx3b1wiLFwibHdzXCIsXCJsd3RcIixcImx3dVwiLFwibHd3XCIsXCJseG1cIixcImx5YVwiLFwibHlnXCIsXCJseW5cIixcImx6aFwiLFwibHpsXCIsXCJsem5cIixcImx6elwiXVxuLFsgXCJtZ1wiLFwibWhcIixcIm1pXCIsXCJta1wiLFwibWxcIixcIm1uXCIsXCJtb1wiLFwibXJcIixcIm1zXCIsXCJtdFwiLFwibXlcIixcIm1hYVwiLFwibWFiXCIsXCJtYWRcIixcIm1hZVwiLFwibWFmXCIsXCJtYWdcIixcIm1haVwiLFwibWFqXCIsXCJtYWtcIixcIm1hbVwiLFwibWFuXCIsXCJtYXBcIixcIm1hcVwiLFwibWFzXCIsXCJtYXRcIixcIm1hdVwiLFwibWF2XCIsXCJtYXdcIixcIm1heFwiLFwibWF6XCIsXCJtYmFcIixcIm1iYlwiLFwibWJjXCIsXCJtYmRcIixcIm1iZVwiLFwibWJmXCIsXCJtYmhcIixcIm1iaVwiLFwibWJqXCIsXCJtYmtcIixcIm1ibFwiLFwibWJtXCIsXCJtYm5cIixcIm1ib1wiLFwibWJwXCIsXCJtYnFcIixcIm1iclwiLFwibWJzXCIsXCJtYnRcIixcIm1idVwiLFwibWJ2XCIsXCJtYndcIixcIm1ieFwiLFwibWJ5XCIsXCJtYnpcIixcIm1jYVwiLFwibWNiXCIsXCJtY2NcIixcIm1jZFwiLFwibWNlXCIsXCJtY2ZcIixcIm1jZ1wiLFwibWNoXCIsXCJtY2lcIixcIm1jalwiLFwibWNrXCIsXCJtY2xcIixcIm1jbVwiLFwibWNuXCIsXCJtY29cIixcIm1jcFwiLFwibWNxXCIsXCJtY3JcIixcIm1jc1wiLFwibWN0XCIsXCJtY3VcIixcIm1jdlwiLFwibWN3XCIsXCJtY3hcIixcIm1jeVwiLFwibWN6XCIsXCJtZGFcIixcIm1kYlwiLFwibWRjXCIsXCJtZGRcIixcIm1kZVwiLFwibWRmXCIsXCJtZGdcIixcIm1kaFwiLFwibWRpXCIsXCJtZGpcIixcIm1ka1wiLFwibWRsXCIsXCJtZG1cIixcIm1kblwiLFwibWRwXCIsXCJtZHFcIixcIm1kclwiLFwibWRzXCIsXCJtZHRcIixcIm1kdVwiLFwibWR2XCIsXCJtZHdcIixcIm1keFwiLFwibWR5XCIsXCJtZHpcIixcIm1lYVwiLFwibWViXCIsXCJtZWNcIixcIm1lZFwiLFwibWVlXCIsXCJtZWZcIixcIm1lZ1wiLFwibWVoXCIsXCJtZWlcIixcIm1lalwiLFwibWVrXCIsXCJtZWxcIixcIm1lbVwiLFwibWVuXCIsXCJtZW9cIixcIm1lcFwiLFwibWVxXCIsXCJtZXJcIixcIm1lc1wiLFwibWV0XCIsXCJtZXVcIixcIm1ldlwiLFwibWV3XCIsXCJtZXlcIixcIm1lelwiLFwibWZhXCIsXCJtZmJcIixcIm1mY1wiLFwibWZkXCIsXCJtZmVcIixcIm1mZlwiLFwibWZnXCIsXCJtZmhcIixcIm1maVwiLFwibWZqXCIsXCJtZmtcIixcIm1mbFwiLFwibWZtXCIsXCJtZm5cIixcIm1mb1wiLFwibWZwXCIsXCJtZnFcIixcIm1mclwiLFwibWZzXCIsXCJtZnRcIixcIm1mdVwiLFwibWZ2XCIsXCJtZndcIixcIm1meFwiLFwibWZ5XCIsXCJtZnpcIixcIm1nYVwiLFwibWdiXCIsXCJtZ2NcIixcIm1nZFwiLFwibWdlXCIsXCJtZ2ZcIixcIm1nZ1wiLFwibWdoXCIsXCJtZ2lcIixcIm1nalwiLFwibWdrXCIsXCJtZ2xcIixcIm1nbVwiLFwibWduXCIsXCJtZ29cIixcIm1ncFwiLFwibWdxXCIsXCJtZ3JcIixcIm1nc1wiLFwibWd0XCIsXCJtZ3VcIixcIm1ndlwiLFwibWd3XCIsXCJtZ3hcIixcIm1neVwiLFwibWd6XCIsXCJtaGFcIixcIm1oYlwiLFwibWhjXCIsXCJtaGRcIixcIm1oZVwiLFwibWhmXCIsXCJtaGdcIixcIm1oaFwiLFwibWhpXCIsXCJtaGpcIixcIm1oa1wiLFwibWhsXCIsXCJtaG1cIixcIm1oblwiLFwibWhvXCIsXCJtaHBcIixcIm1ocVwiLFwibWhyXCIsXCJtaHNcIixcIm1odFwiLFwibWh1XCIsXCJtaHdcIixcIm1oeFwiLFwibWh5XCIsXCJtaHpcIixcIm1pYVwiLFwibWliXCIsXCJtaWNcIixcIm1pZFwiLFwibWllXCIsXCJtaWZcIixcIm1pZ1wiLFwibWloXCIsXCJtaWlcIixcIm1palwiLFwibWlrXCIsXCJtaWxcIixcIm1pbVwiLFwibWluXCIsXCJtaW9cIixcIm1pcFwiLFwibWlxXCIsXCJtaXJcIixcIm1pc1wiLFwibWl0XCIsXCJtaXVcIixcIm1pd1wiLFwibWl4XCIsXCJtaXlcIixcIm1pelwiLFwibWphXCIsXCJtamJcIixcIm1qY1wiLFwibWpkXCIsXCJtamVcIixcIm1qZ1wiLFwibWpoXCIsXCJtamlcIixcIm1qalwiLFwibWprXCIsXCJtamxcIixcIm1qbVwiLFwibWpuXCIsXCJtam9cIixcIm1qcFwiLFwibWpxXCIsXCJtanJcIixcIm1qc1wiLFwibWp0XCIsXCJtanVcIixcIm1qdlwiLFwibWp3XCIsXCJtanhcIixcIm1qeVwiLFwibWp6XCIsXCJta2FcIixcIm1rYlwiLFwibWtjXCIsXCJta2VcIixcIm1rZlwiLFwibWtnXCIsXCJta2hcIixcIm1raVwiLFwibWtqXCIsXCJta2tcIixcIm1rbFwiLFwibWttXCIsXCJta25cIixcIm1rb1wiLFwibWtwXCIsXCJta3FcIixcIm1rclwiLFwibWtzXCIsXCJta3RcIixcIm1rdVwiLFwibWt2XCIsXCJta3dcIixcIm1reFwiLFwibWt5XCIsXCJta3pcIixcIm1sYVwiLFwibWxiXCIsXCJtbGNcIixcIm1sZFwiLFwibWxlXCIsXCJtbGZcIixcIm1saFwiLFwibWxpXCIsXCJtbGpcIixcIm1sa1wiLFwibWxsXCIsXCJtbG1cIixcIm1sblwiLFwibWxvXCIsXCJtbHBcIixcIm1scVwiLFwibWxyXCIsXCJtbHNcIixcIm1sdVwiLFwibWx2XCIsXCJtbHdcIixcIm1seFwiLFwibWx6XCIsXCJtbWFcIixcIm1tYlwiLFwibW1jXCIsXCJtbWRcIixcIm1tZVwiLFwibW1mXCIsXCJtbWdcIixcIm1taFwiLFwibW1pXCIsXCJtbWpcIixcIm1ta1wiLFwibW1sXCIsXCJtbW1cIixcIm1tblwiLFwibW1vXCIsXCJtbXBcIixcIm1tcVwiLFwibW1yXCIsXCJtbXRcIixcIm1tdVwiLFwibW12XCIsXCJtbXdcIixcIm1teFwiLFwibW15XCIsXCJtbXpcIixcIm1uYVwiLFwibW5iXCIsXCJtbmNcIixcIm1uZFwiLFwibW5lXCIsXCJtbmZcIixcIm1uZ1wiLFwibW5oXCIsXCJtbmlcIixcIm1ualwiLFwibW5rXCIsXCJtbmxcIixcIm1ubVwiLFwibW5uXCIsXCJtbm9cIixcIm1ucFwiLFwibW5xXCIsXCJtbnJcIixcIm1uc1wiLFwibW50XCIsXCJtbnVcIixcIm1udlwiLFwibW53XCIsXCJtbnhcIixcIm1ueVwiLFwibW56XCIsXCJtb2FcIixcIm1vY1wiLFwibW9kXCIsXCJtb2VcIixcIm1vZlwiLFwibW9nXCIsXCJtb2hcIixcIm1vaVwiLFwibW9qXCIsXCJtb2tcIixcIm1vbVwiLFwibW9vXCIsXCJtb3BcIixcIm1vcVwiLFwibW9yXCIsXCJtb3NcIixcIm1vdFwiLFwibW91XCIsXCJtb3ZcIixcIm1vd1wiLFwibW94XCIsXCJtb3lcIixcIm1velwiLFwibXBhXCIsXCJtcGJcIixcIm1wY1wiLFwibXBkXCIsXCJtcGVcIixcIm1wZ1wiLFwibXBoXCIsXCJtcGlcIixcIm1walwiLFwibXBrXCIsXCJtcGxcIixcIm1wbVwiLFwibXBuXCIsXCJtcG9cIixcIm1wcFwiLFwibXBxXCIsXCJtcHJcIixcIm1wc1wiLFwibXB0XCIsXCJtcHVcIixcIm1wdlwiLFwibXB3XCIsXCJtcHhcIixcIm1weVwiLFwibXB6XCIsXCJtcWFcIixcIm1xYlwiLFwibXFjXCIsXCJtcWVcIixcIm1xZlwiLFwibXFnXCIsXCJtcWhcIixcIm1xaVwiLFwibXFqXCIsXCJtcWtcIixcIm1xbFwiLFwibXFtXCIsXCJtcW5cIixcIm1xb1wiLFwibXFwXCIsXCJtcXFcIixcIm1xclwiLFwibXFzXCIsXCJtcXRcIixcIm1xdVwiLFwibXF2XCIsXCJtcXdcIixcIm1xeFwiLFwibXF5XCIsXCJtcXpcIixcIm1yYVwiLFwibXJiXCIsXCJtcmNcIixcIm1yZFwiLFwibXJlXCIsXCJtcmZcIixcIm1yZ1wiLFwibXJoXCIsXCJtcmpcIixcIm1ya1wiLFwibXJsXCIsXCJtcm1cIixcIm1yblwiLFwibXJvXCIsXCJtcnBcIixcIm1ycVwiLFwibXJyXCIsXCJtcnNcIixcIm1ydFwiLFwibXJ1XCIsXCJtcnZcIixcIm1yd1wiLFwibXJ4XCIsXCJtcnlcIixcIm1yelwiLFwibXNiXCIsXCJtc2NcIixcIm1zZFwiLFwibXNlXCIsXCJtc2ZcIixcIm1zZ1wiLFwibXNoXCIsXCJtc2lcIixcIm1zalwiLFwibXNrXCIsXCJtc2xcIixcIm1zbVwiLFwibXNuXCIsXCJtc29cIixcIm1zcFwiLFwibXNxXCIsXCJtc3JcIixcIm1zc1wiLFwibXN0XCIsXCJtc3VcIixcIm1zdlwiLFwibXN3XCIsXCJtc3hcIixcIm1zeVwiLFwibXN6XCIsXCJtdGFcIixcIm10YlwiLFwibXRjXCIsXCJtdGRcIixcIm10ZVwiLFwibXRmXCIsXCJtdGdcIixcIm10aFwiLFwibXRpXCIsXCJtdGpcIixcIm10a1wiLFwibXRsXCIsXCJtdG1cIixcIm10blwiLFwibXRvXCIsXCJtdHBcIixcIm10cVwiLFwibXRyXCIsXCJtdHNcIixcIm10dFwiLFwibXR1XCIsXCJtdHZcIixcIm10d1wiLFwibXR4XCIsXCJtdHlcIixcIm11YVwiLFwibXViXCIsXCJtdWNcIixcIm11ZFwiLFwibXVlXCIsXCJtdWdcIixcIm11aFwiLFwibXVpXCIsXCJtdWpcIixcIm11a1wiLFwibXVsXCIsXCJtdW1cIixcIm11blwiLFwibXVvXCIsXCJtdXBcIixcIm11cVwiLFwibXVyXCIsXCJtdXNcIixcIm11dFwiLFwibXV1XCIsXCJtdXZcIixcIm11eFwiLFwibXV5XCIsXCJtdXpcIixcIm12YVwiLFwibXZiXCIsXCJtdmRcIixcIm12ZVwiLFwibXZmXCIsXCJtdmdcIixcIm12aFwiLFwibXZpXCIsXCJtdmtcIixcIm12bFwiLFwibXZtXCIsXCJtdm5cIixcIm12b1wiLFwibXZwXCIsXCJtdnFcIixcIm12clwiLFwibXZzXCIsXCJtdnRcIixcIm12dVwiLFwibXZ2XCIsXCJtdndcIixcIm12eFwiLFwibXZ5XCIsXCJtdnpcIixcIm13YVwiLFwibXdiXCIsXCJtd2NcIixcIm13ZFwiLFwibXdlXCIsXCJtd2ZcIixcIm13Z1wiLFwibXdoXCIsXCJtd2lcIixcIm13alwiLFwibXdrXCIsXCJtd2xcIixcIm13bVwiLFwibXduXCIsXCJtd29cIixcIm13cFwiLFwibXdxXCIsXCJtd3JcIixcIm13c1wiLFwibXd0XCIsXCJtd3VcIixcIm13dlwiLFwibXd3XCIsXCJtd3hcIixcIm13eVwiLFwibXd6XCIsXCJteGFcIixcIm14YlwiLFwibXhjXCIsXCJteGRcIixcIm14ZVwiLFwibXhmXCIsXCJteGdcIixcIm14aFwiLFwibXhpXCIsXCJteGpcIixcIm14a1wiLFwibXhsXCIsXCJteG1cIixcIm14blwiLFwibXhvXCIsXCJteHBcIixcIm14cVwiLFwibXhyXCIsXCJteHNcIixcIm14dFwiLFwibXh1XCIsXCJteHZcIixcIm14d1wiLFwibXh4XCIsXCJteHlcIixcIm14elwiLFwibXliXCIsXCJteWNcIixcIm15ZFwiLFwibXllXCIsXCJteWZcIixcIm15Z1wiLFwibXloXCIsXCJteWlcIixcIm15alwiLFwibXlrXCIsXCJteWxcIixcIm15bVwiLFwibXluXCIsXCJteW9cIixcIm15cFwiLFwibXlxXCIsXCJteXJcIixcIm15c1wiLFwibXl0XCIsXCJteXVcIixcIm15dlwiLFwibXl3XCIsXCJteXhcIixcIm15eVwiLFwibXl6XCIsXCJtemFcIixcIm16YlwiLFwibXpjXCIsXCJtemRcIixcIm16ZVwiLFwibXpnXCIsXCJtemhcIixcIm16aVwiLFwibXpqXCIsXCJtemtcIixcIm16bFwiLFwibXptXCIsXCJtem5cIixcIm16b1wiLFwibXpwXCIsXCJtenFcIixcIm16clwiLFwibXpzXCIsXCJtenRcIixcIm16dVwiLFwibXp2XCIsXCJtendcIixcIm16eFwiLFwibXp5XCIsXCJtenpcIl1cbixbIFwibmFcIixcIm5iXCIsXCJuZFwiLFwibmVcIixcIm5nXCIsXCJubFwiLFwibm5cIixcIm5vXCIsXCJuclwiLFwibnZcIixcIm55XCIsXCJuYWFcIixcIm5hYlwiLFwibmFjXCIsXCJuYWRcIixcIm5hZVwiLFwibmFmXCIsXCJuYWdcIixcIm5haFwiLFwibmFpXCIsXCJuYWpcIixcIm5ha1wiLFwibmFsXCIsXCJuYW1cIixcIm5hblwiLFwibmFvXCIsXCJuYXBcIixcIm5hcVwiLFwibmFyXCIsXCJuYXNcIixcIm5hdFwiLFwibmF3XCIsXCJuYXhcIixcIm5heVwiLFwibmF6XCIsXCJuYmFcIixcIm5iYlwiLFwibmJjXCIsXCJuYmRcIixcIm5iZVwiLFwibmJmXCIsXCJuYmdcIixcIm5iaFwiLFwibmJpXCIsXCJuYmpcIixcIm5ia1wiLFwibmJtXCIsXCJuYm5cIixcIm5ib1wiLFwibmJwXCIsXCJuYnFcIixcIm5iclwiLFwibmJzXCIsXCJuYnRcIixcIm5idVwiLFwibmJ2XCIsXCJuYndcIixcIm5ieFwiLFwibmJ5XCIsXCJuY2FcIixcIm5jYlwiLFwibmNjXCIsXCJuY2RcIixcIm5jZVwiLFwibmNmXCIsXCJuY2dcIixcIm5jaFwiLFwibmNpXCIsXCJuY2pcIixcIm5ja1wiLFwibmNsXCIsXCJuY21cIixcIm5jblwiLFwibmNvXCIsXCJuY3BcIixcIm5jcVwiLFwibmNyXCIsXCJuY3NcIixcIm5jdFwiLFwibmN1XCIsXCJuY3hcIixcIm5jelwiLFwibmRhXCIsXCJuZGJcIixcIm5kY1wiLFwibmRkXCIsXCJuZGZcIixcIm5kZ1wiLFwibmRoXCIsXCJuZGlcIixcIm5kalwiLFwibmRrXCIsXCJuZGxcIixcIm5kbVwiLFwibmRuXCIsXCJuZHBcIixcIm5kcVwiLFwibmRyXCIsXCJuZHNcIixcIm5kdFwiLFwibmR1XCIsXCJuZHZcIixcIm5kd1wiLFwibmR4XCIsXCJuZHlcIixcIm5kelwiLFwibmVhXCIsXCJuZWJcIixcIm5lY1wiLFwibmVkXCIsXCJuZWVcIixcIm5lZlwiLFwibmVnXCIsXCJuZWhcIixcIm5laVwiLFwibmVqXCIsXCJuZWtcIixcIm5lbVwiLFwibmVuXCIsXCJuZW9cIixcIm5lcVwiLFwibmVyXCIsXCJuZXNcIixcIm5ldFwiLFwibmV1XCIsXCJuZXZcIixcIm5ld1wiLFwibmV4XCIsXCJuZXlcIixcIm5lelwiLFwibmZhXCIsXCJuZmRcIixcIm5mbFwiLFwibmZyXCIsXCJuZnVcIixcIm5nYVwiLFwibmdiXCIsXCJuZ2NcIixcIm5nZFwiLFwibmdlXCIsXCJuZ2ZcIixcIm5nZ1wiLFwibmdoXCIsXCJuZ2lcIixcIm5nalwiLFwibmdrXCIsXCJuZ2xcIixcIm5nbVwiLFwibmduXCIsXCJuZ29cIixcIm5ncFwiLFwibmdxXCIsXCJuZ3JcIixcIm5nc1wiLFwibmd0XCIsXCJuZ3VcIixcIm5ndlwiLFwibmd3XCIsXCJuZ3hcIixcIm5neVwiLFwibmd6XCIsXCJuaGFcIixcIm5oYlwiLFwibmhjXCIsXCJuaGRcIixcIm5oZVwiLFwibmhmXCIsXCJuaGdcIixcIm5oaFwiLFwibmhpXCIsXCJuaGtcIixcIm5obVwiLFwibmhuXCIsXCJuaG9cIixcIm5ocFwiLFwibmhxXCIsXCJuaHJcIixcIm5odFwiLFwibmh1XCIsXCJuaHZcIixcIm5od1wiLFwibmh4XCIsXCJuaHlcIixcIm5oelwiLFwibmlhXCIsXCJuaWJcIixcIm5pY1wiLFwibmlkXCIsXCJuaWVcIixcIm5pZlwiLFwibmlnXCIsXCJuaWhcIixcIm5paVwiLFwibmlqXCIsXCJuaWtcIixcIm5pbFwiLFwibmltXCIsXCJuaW5cIixcIm5pb1wiLFwibmlxXCIsXCJuaXJcIixcIm5pc1wiLFwibml0XCIsXCJuaXVcIixcIm5pdlwiLFwibml3XCIsXCJuaXhcIixcIm5peVwiLFwibml6XCIsXCJuamFcIixcIm5qYlwiLFwibmpkXCIsXCJuamhcIixcIm5qaVwiLFwibmpqXCIsXCJuamxcIixcIm5qbVwiLFwibmpuXCIsXCJuam9cIixcIm5qclwiLFwibmpzXCIsXCJuanRcIixcIm5qdVwiLFwibmp4XCIsXCJuanlcIixcIm5qelwiLFwibmthXCIsXCJua2JcIixcIm5rY1wiLFwibmtkXCIsXCJua2VcIixcIm5rZlwiLFwibmtnXCIsXCJua2hcIixcIm5raVwiLFwibmtqXCIsXCJua2tcIixcIm5rbVwiLFwibmtuXCIsXCJua29cIixcIm5rcFwiLFwibmtxXCIsXCJua3JcIixcIm5rc1wiLFwibmt0XCIsXCJua3VcIixcIm5rdlwiLFwibmt3XCIsXCJua3hcIixcIm5relwiLFwibmxhXCIsXCJubGNcIixcIm5sZVwiLFwibmxnXCIsXCJubGlcIixcIm5salwiLFwibmxrXCIsXCJubGxcIixcIm5sbVwiLFwibmxuXCIsXCJubG9cIixcIm5scVwiLFwibmxyXCIsXCJubHVcIixcIm5sdlwiLFwibmx3XCIsXCJubHhcIixcIm5seVwiLFwibmx6XCIsXCJubWFcIixcIm5tYlwiLFwibm1jXCIsXCJubWRcIixcIm5tZVwiLFwibm1mXCIsXCJubWdcIixcIm5taFwiLFwibm1pXCIsXCJubWpcIixcIm5ta1wiLFwibm1sXCIsXCJubW1cIixcIm5tblwiLFwibm1vXCIsXCJubXBcIixcIm5tcVwiLFwibm1yXCIsXCJubXNcIixcIm5tdFwiLFwibm11XCIsXCJubXZcIixcIm5td1wiLFwibm14XCIsXCJubXlcIixcIm5telwiLFwibm5hXCIsXCJubmJcIixcIm5uY1wiLFwibm5kXCIsXCJubmVcIixcIm5uZlwiLFwibm5nXCIsXCJubmhcIixcIm5uaVwiLFwibm5qXCIsXCJubmtcIixcIm5ubFwiLFwibm5tXCIsXCJubm5cIixcIm5ucFwiLFwibm5xXCIsXCJubnJcIixcIm5uc1wiLFwibm50XCIsXCJubnVcIixcIm5udlwiLFwibm53XCIsXCJubnhcIixcIm5ueVwiLFwibm56XCIsXCJub2FcIixcIm5vY1wiLFwibm9kXCIsXCJub2VcIixcIm5vZlwiLFwibm9nXCIsXCJub2hcIixcIm5vaVwiLFwibm9qXCIsXCJub2tcIixcIm5vbFwiLFwibm9tXCIsXCJub25cIixcIm5vb1wiLFwibm9wXCIsXCJub3FcIixcIm5vc1wiLFwibm90XCIsXCJub3VcIixcIm5vdlwiLFwibm93XCIsXCJub3lcIixcIm5velwiLFwibnBhXCIsXCJucGJcIixcIm5wZ1wiLFwibnBoXCIsXCJucGlcIixcIm5wbFwiLFwibnBuXCIsXCJucG9cIixcIm5wc1wiLFwibnB1XCIsXCJucHhcIixcIm5weVwiLFwibnFnXCIsXCJucWtcIixcIm5xbFwiLFwibnFtXCIsXCJucW5cIixcIm5xb1wiLFwibnFxXCIsXCJucXRcIixcIm5xeVwiLFwibnJhXCIsXCJucmJcIixcIm5yY1wiLFwibnJlXCIsXCJucmZcIixcIm5yZ1wiLFwibnJpXCIsXCJucmtcIixcIm5ybFwiLFwibnJtXCIsXCJucm5cIixcIm5ycFwiLFwibnJyXCIsXCJucnRcIixcIm5ydVwiLFwibnJ4XCIsXCJucnpcIixcIm5zYVwiLFwibnNiXCIsXCJuc2NcIixcIm5zZFwiLFwibnNlXCIsXCJuc2ZcIixcIm5zZ1wiLFwibnNoXCIsXCJuc2lcIixcIm5za1wiLFwibnNsXCIsXCJuc21cIixcIm5zblwiLFwibnNvXCIsXCJuc3BcIixcIm5zcVwiLFwibnNyXCIsXCJuc3NcIixcIm5zdFwiLFwibnN1XCIsXCJuc3ZcIixcIm5zd1wiLFwibnN4XCIsXCJuc3lcIixcIm5zelwiLFwibnRkXCIsXCJudGVcIixcIm50Z1wiLFwibnRpXCIsXCJudGpcIixcIm50a1wiLFwibnRtXCIsXCJudG9cIixcIm50cFwiLFwibnRyXCIsXCJudHNcIixcIm50dVwiLFwibnR3XCIsXCJudHhcIixcIm50eVwiLFwibnR6XCIsXCJudWFcIixcIm51YlwiLFwibnVjXCIsXCJudWRcIixcIm51ZVwiLFwibnVmXCIsXCJudWdcIixcIm51aFwiLFwibnVpXCIsXCJudWpcIixcIm51a1wiLFwibnVsXCIsXCJudW1cIixcIm51blwiLFwibnVvXCIsXCJudXBcIixcIm51cVwiLFwibnVyXCIsXCJudXNcIixcIm51dFwiLFwibnV1XCIsXCJudXZcIixcIm51d1wiLFwibnV4XCIsXCJudXlcIixcIm51elwiLFwibnZoXCIsXCJudm1cIixcIm52b1wiLFwibndhXCIsXCJud2JcIixcIm53Y1wiLFwibndlXCIsXCJud2dcIixcIm53aVwiLFwibndtXCIsXCJud29cIixcIm53clwiLFwibnd4XCIsXCJud3lcIixcIm54YVwiLFwibnhkXCIsXCJueGVcIixcIm54Z1wiLFwibnhpXCIsXCJueGtcIixcIm54bFwiLFwibnhtXCIsXCJueG5cIixcIm54b1wiLFwibnhxXCIsXCJueHJcIixcIm54dVwiLFwibnh4XCIsXCJueWJcIixcIm55Y1wiLFwibnlkXCIsXCJueWVcIixcIm55ZlwiLFwibnlnXCIsXCJueWhcIixcIm55aVwiLFwibnlqXCIsXCJueWtcIixcIm55bFwiLFwibnltXCIsXCJueW5cIixcIm55b1wiLFwibnlwXCIsXCJueXFcIixcIm55clwiLFwibnlzXCIsXCJueXRcIixcIm55dVwiLFwibnl2XCIsXCJueXdcIixcIm55eFwiLFwibnl5XCIsXCJuemFcIixcIm56YlwiLFwibnpkXCIsXCJuemlcIixcIm56a1wiLFwibnptXCIsXCJuenNcIixcIm56dVwiLFwibnp5XCIsXCJuenpcIl1cbixbIFwib2NcIixcIm9qXCIsXCJvbVwiLFwib3JcIixcIm9zXCIsXCJvYWFcIixcIm9hY1wiLFwib2FyXCIsXCJvYXZcIixcIm9iaVwiLFwib2JrXCIsXCJvYmxcIixcIm9ibVwiLFwib2JvXCIsXCJvYnJcIixcIm9idFwiLFwib2J1XCIsXCJvY2FcIixcIm9jaFwiLFwib2NtXCIsXCJvY29cIixcIm9jdVwiLFwib2RhXCIsXCJvZGtcIixcIm9kdFwiLFwib2R1XCIsXCJvZm9cIixcIm9mc1wiLFwib2Z1XCIsXCJvZ2JcIixcIm9nY1wiLFwib2dlXCIsXCJvZ2dcIixcIm9nb1wiLFwib2d1XCIsXCJvaHRcIixcIm9odVwiLFwib2lhXCIsXCJvaW5cIixcIm9qYlwiLFwib2pjXCIsXCJvamdcIixcIm9qcFwiLFwib2pzXCIsXCJvanZcIixcIm9qd1wiLFwib2thXCIsXCJva2JcIixcIm9rY1wiLFwib2tkXCIsXCJva2VcIixcIm9rZ1wiLFwib2toXCIsXCJva2lcIixcIm9ralwiLFwib2trXCIsXCJva2xcIixcIm9rbVwiLFwib2tuXCIsXCJva29cIixcIm9rclwiLFwib2tzXCIsXCJva3VcIixcIm9rdlwiLFwib2t4XCIsXCJva3pcIixcIm9sYVwiLFwib2xkXCIsXCJvbGVcIixcIm9sa1wiLFwib2xtXCIsXCJvbG9cIixcIm9sclwiLFwib2x0XCIsXCJvbHVcIixcIm9tYVwiLFwib21iXCIsXCJvbWNcIixcIm9tZVwiLFwib21nXCIsXCJvbWlcIixcIm9ta1wiLFwib21sXCIsXCJvbW5cIixcIm9tb1wiLFwib21wXCIsXCJvbXFcIixcIm9tclwiLFwib210XCIsXCJvbXVcIixcIm9tdlwiLFwib213XCIsXCJvbXhcIixcIm9teVwiLFwib25hXCIsXCJvbmJcIixcIm9uZVwiLFwib25nXCIsXCJvbmlcIixcIm9ualwiLFwib25rXCIsXCJvbm5cIixcIm9ub1wiLFwib25wXCIsXCJvbnJcIixcIm9uc1wiLFwib250XCIsXCJvbnVcIixcIm9ud1wiLFwib254XCIsXCJvb2RcIixcIm9vZ1wiLFwib29uXCIsXCJvb3JcIixcIm9vc1wiLFwib3BhXCIsXCJvcGtcIixcIm9wbVwiLFwib3BvXCIsXCJvcHRcIixcIm9weVwiLFwib3JhXCIsXCJvcmNcIixcIm9yZVwiLFwib3JnXCIsXCJvcmhcIixcIm9yblwiLFwib3JvXCIsXCJvcnJcIixcIm9yc1wiLFwib3J0XCIsXCJvcnVcIixcIm9ydlwiLFwib3J3XCIsXCJvcnhcIixcIm9yeVwiLFwib3J6XCIsXCJvc2FcIixcIm9zY1wiLFwib3NpXCIsXCJvc25cIixcIm9zb1wiLFwib3NwXCIsXCJvc3RcIixcIm9zdVwiLFwib3N4XCIsXCJvdGFcIixcIm90YlwiLFwib3RkXCIsXCJvdGVcIixcIm90aVwiLFwib3RrXCIsXCJvdGxcIixcIm90bVwiLFwib3RuXCIsXCJvdG9cIixcIm90cVwiLFwib3RyXCIsXCJvdHNcIixcIm90dFwiLFwib3R1XCIsXCJvdHdcIixcIm90eFwiLFwib3R5XCIsXCJvdHpcIixcIm91YVwiLFwib3ViXCIsXCJvdWVcIixcIm91aVwiLFwib3VtXCIsXCJvdW5cIixcIm92ZFwiLFwib3dpXCIsXCJvd2xcIixcIm95YlwiLFwib3lkXCIsXCJveW1cIixcIm95eVwiLFwib3ptXCJdXG4sWyBcInBhXCIsXCJwaVwiLFwicGxcIixcInBzXCIsXCJwdFwiLFwicGFhXCIsXCJwYWJcIixcInBhY1wiLFwicGFkXCIsXCJwYWVcIixcInBhZlwiLFwicGFnXCIsXCJwYWhcIixcInBhaVwiLFwicGFrXCIsXCJwYWxcIixcInBhbVwiLFwicGFvXCIsXCJwYXBcIixcInBhcVwiLFwicGFyXCIsXCJwYXNcIixcInBhdFwiLFwicGF1XCIsXCJwYXZcIixcInBhd1wiLFwicGF4XCIsXCJwYXlcIixcInBhelwiLFwicGJiXCIsXCJwYmNcIixcInBiZVwiLFwicGJmXCIsXCJwYmdcIixcInBiaFwiLFwicGJpXCIsXCJwYmxcIixcInBibVwiLFwicGJuXCIsXCJwYm9cIixcInBicFwiLFwicGJyXCIsXCJwYnNcIixcInBidFwiLFwicGJ1XCIsXCJwYnZcIixcInBieVwiLFwicGJ6XCIsXCJwY2FcIixcInBjYlwiLFwicGNjXCIsXCJwY2RcIixcInBjZVwiLFwicGNmXCIsXCJwY2dcIixcInBjaFwiLFwicGNpXCIsXCJwY2pcIixcInBja1wiLFwicGNsXCIsXCJwY21cIixcInBjblwiLFwicGNwXCIsXCJwY3JcIixcInBjd1wiLFwicGRhXCIsXCJwZGNcIixcInBkaVwiLFwicGRuXCIsXCJwZG9cIixcInBkdFwiLFwicGR1XCIsXCJwZWFcIixcInBlYlwiLFwicGVkXCIsXCJwZWVcIixcInBlZlwiLFwicGVnXCIsXCJwZWhcIixcInBlaVwiLFwicGVqXCIsXCJwZWtcIixcInBlbFwiLFwicGVtXCIsXCJwZW9cIixcInBlcFwiLFwicGVxXCIsXCJwZXNcIixcInBldlwiLFwicGV4XCIsXCJwZXlcIixcInBlelwiLFwicGZhXCIsXCJwZmVcIixcInBmbFwiLFwicGdhXCIsXCJwZ2RcIixcInBnZ1wiLFwicGdpXCIsXCJwZ2tcIixcInBnbFwiLFwicGduXCIsXCJwZ3NcIixcInBndVwiLFwicGd5XCIsXCJwZ3pcIixcInBoYVwiLFwicGhkXCIsXCJwaGdcIixcInBoaFwiLFwicGhpXCIsXCJwaGtcIixcInBobFwiLFwicGhtXCIsXCJwaG5cIixcInBob1wiLFwicGhxXCIsXCJwaHJcIixcInBodFwiLFwicGh1XCIsXCJwaHZcIixcInBod1wiLFwicGlhXCIsXCJwaWJcIixcInBpY1wiLFwicGlkXCIsXCJwaWVcIixcInBpZlwiLFwicGlnXCIsXCJwaWhcIixcInBpaVwiLFwicGlqXCIsXCJwaWxcIixcInBpbVwiLFwicGluXCIsXCJwaW9cIixcInBpcFwiLFwicGlyXCIsXCJwaXNcIixcInBpdFwiLFwicGl1XCIsXCJwaXZcIixcInBpd1wiLFwicGl4XCIsXCJwaXlcIixcInBpelwiLFwicGp0XCIsXCJwa2FcIixcInBrYlwiLFwicGtjXCIsXCJwa2dcIixcInBraFwiLFwicGtuXCIsXCJwa29cIixcInBrcFwiLFwicGtyXCIsXCJwa3NcIixcInBrdFwiLFwicGt1XCIsXCJwbGFcIixcInBsYlwiLFwicGxjXCIsXCJwbGRcIixcInBsZVwiLFwicGxmXCIsXCJwbGdcIixcInBsaFwiLFwicGxqXCIsXCJwbGtcIixcInBsbFwiLFwicGxuXCIsXCJwbG9cIixcInBscFwiLFwicGxxXCIsXCJwbHJcIixcInBsc1wiLFwicGx0XCIsXCJwbHVcIixcInBsdlwiLFwicGx3XCIsXCJwbHlcIixcInBselwiLFwicG1hXCIsXCJwbWJcIixcInBtY1wiLFwicG1kXCIsXCJwbWVcIixcInBtZlwiLFwicG1oXCIsXCJwbWlcIixcInBtalwiLFwicG1rXCIsXCJwbWxcIixcInBtbVwiLFwicG1uXCIsXCJwbW9cIixcInBtcVwiLFwicG1yXCIsXCJwbXNcIixcInBtdFwiLFwicG11XCIsXCJwbXdcIixcInBteFwiLFwicG15XCIsXCJwbXpcIixcInBuYVwiLFwicG5iXCIsXCJwbmNcIixcInBuZFwiLFwicG5lXCIsXCJwbmdcIixcInBuaFwiLFwicG5pXCIsXCJwbmpcIixcInBua1wiLFwicG5sXCIsXCJwbm1cIixcInBublwiLFwicG5vXCIsXCJwbnBcIixcInBucVwiLFwicG5yXCIsXCJwbnNcIixcInBudFwiLFwicG51XCIsXCJwbnZcIixcInBud1wiLFwicG54XCIsXCJwbnlcIixcInBuelwiLFwicG9jXCIsXCJwb2RcIixcInBvZVwiLFwicG9mXCIsXCJwb2dcIixcInBvaFwiLFwicG9pXCIsXCJwb2tcIixcInBvbVwiLFwicG9uXCIsXCJwb29cIixcInBvcFwiLFwicG9xXCIsXCJwb3NcIixcInBvdFwiLFwicG92XCIsXCJwb3dcIixcInBveFwiLFwicG95XCIsXCJwb3pcIixcInBwYVwiLFwicHBlXCIsXCJwcGlcIixcInBwa1wiLFwicHBsXCIsXCJwcG1cIixcInBwblwiLFwicHBvXCIsXCJwcHBcIixcInBwcVwiLFwicHByXCIsXCJwcHNcIixcInBwdFwiLFwicHB1XCIsXCJwcWFcIixcInBxZVwiLFwicHFtXCIsXCJwcXdcIixcInByYVwiLFwicHJiXCIsXCJwcmNcIixcInByZFwiLFwicHJlXCIsXCJwcmZcIixcInByZ1wiLFwicHJoXCIsXCJwcmlcIixcInBya1wiLFwicHJsXCIsXCJwcm1cIixcInByblwiLFwicHJvXCIsXCJwcnBcIixcInBycVwiLFwicHJyXCIsXCJwcnNcIixcInBydFwiLFwicHJ1XCIsXCJwcndcIixcInByeFwiLFwicHJ5XCIsXCJwcnpcIixcInBzYVwiLFwicHNjXCIsXCJwc2RcIixcInBzZVwiLFwicHNnXCIsXCJwc2hcIixcInBzaVwiLFwicHNsXCIsXCJwc21cIixcInBzblwiLFwicHNvXCIsXCJwc3BcIixcInBzcVwiLFwicHNyXCIsXCJwc3NcIixcInBzdFwiLFwicHN1XCIsXCJwc3dcIixcInBzeVwiLFwicHRhXCIsXCJwdGhcIixcInB0aVwiLFwicHRuXCIsXCJwdG9cIixcInB0cFwiLFwicHRxXCIsXCJwdHJcIixcInB0dFwiLFwicHR1XCIsXCJwdHZcIixcInB0d1wiLFwicHR5XCIsXCJwdWFcIixcInB1YlwiLFwicHVjXCIsXCJwdWRcIixcInB1ZVwiLFwicHVmXCIsXCJwdWdcIixcInB1aVwiLFwicHVqXCIsXCJwdWtcIixcInB1bVwiLFwicHVvXCIsXCJwdXBcIixcInB1cVwiLFwicHVyXCIsXCJwdXRcIixcInB1dVwiLFwicHV3XCIsXCJwdXhcIixcInB1eVwiLFwicHV6XCIsXCJwd2FcIixcInB3YlwiLFwicHdnXCIsXCJwd2lcIixcInB3bVwiLFwicHduXCIsXCJwd29cIixcInB3clwiLFwicHd3XCIsXCJweG1cIixcInB5ZVwiLFwicHltXCIsXCJweW5cIixcInB5c1wiLFwicHl1XCIsXCJweXhcIixcInB5eVwiLFwicHpuXCJdXG4sWyBcInF1XCIsXCJxdWFcIixcInF1YlwiLFwicXVjXCIsXCJxdWRcIixcInF1ZlwiLFwicXVnXCIsXCJxdWhcIixcInF1aVwiLFwicXVrXCIsXCJxdWxcIixcInF1bVwiLFwicXVuXCIsXCJxdXBcIixcInF1cVwiLFwicXVyXCIsXCJxdXNcIixcInF1dlwiLFwicXV3XCIsXCJxdXhcIixcInF1eVwiLFwicXV6XCIsXCJxdmFcIixcInF2Y1wiLFwicXZlXCIsXCJxdmhcIixcInF2aVwiLFwicXZqXCIsXCJxdmxcIixcInF2bVwiLFwicXZuXCIsXCJxdm9cIixcInF2cFwiLFwicXZzXCIsXCJxdndcIixcInF2eVwiLFwicXZ6XCIsXCJxd2FcIixcInF3Y1wiLFwicXdlXCIsXCJxd2hcIixcInF3bVwiLFwicXdzXCIsXCJxd3RcIixcInF4YVwiLFwicXhjXCIsXCJxeGhcIixcInF4bFwiLFwicXhuXCIsXCJxeG9cIixcInF4cFwiLFwicXhxXCIsXCJxeHJcIixcInF4c1wiLFwicXh0XCIsXCJxeHVcIixcInF4d1wiLFwicXlhXCIsXCJxeXBcIl1cbixbIFwicm1cIixcInJuXCIsXCJyb1wiLFwicnVcIixcInJ3XCIsXCJyYWFcIixcInJhYlwiLFwicmFjXCIsXCJyYWRcIixcInJhZlwiLFwicmFnXCIsXCJyYWhcIixcInJhaVwiLFwicmFqXCIsXCJyYWtcIixcInJhbFwiLFwicmFtXCIsXCJyYW5cIixcInJhb1wiLFwicmFwXCIsXCJyYXFcIixcInJhclwiLFwicmFzXCIsXCJyYXRcIixcInJhdVwiLFwicmF2XCIsXCJyYXdcIixcInJheFwiLFwicmF5XCIsXCJyYXpcIixcInJiYlwiLFwicmJrXCIsXCJyYmxcIixcInJicFwiLFwicmNmXCIsXCJyZGJcIixcInJlYVwiLFwicmViXCIsXCJyZWVcIixcInJlZ1wiLFwicmVpXCIsXCJyZWpcIixcInJlbFwiLFwicmVtXCIsXCJyZW5cIixcInJlclwiLFwicmVzXCIsXCJyZXRcIixcInJleVwiLFwicmdhXCIsXCJyZ2VcIixcInJna1wiLFwicmduXCIsXCJyZ3JcIixcInJnc1wiLFwicmd1XCIsXCJyaGdcIixcInJocFwiLFwicmlhXCIsXCJyaWVcIixcInJpZlwiLFwicmlsXCIsXCJyaW1cIixcInJpblwiLFwicmlyXCIsXCJyaXRcIixcInJpdVwiLFwicmpnXCIsXCJyamlcIixcInJqc1wiLFwicmthXCIsXCJya2JcIixcInJraFwiLFwicmtpXCIsXCJya21cIixcInJrdFwiLFwicmt3XCIsXCJybWFcIixcInJtYlwiLFwicm1jXCIsXCJybWRcIixcInJtZVwiLFwicm1mXCIsXCJybWdcIixcInJtaFwiLFwicm1pXCIsXCJybWtcIixcInJtbFwiLFwicm1tXCIsXCJybW5cIixcInJtb1wiLFwicm1wXCIsXCJybXFcIixcInJtclwiLFwicm1zXCIsXCJybXRcIixcInJtdVwiLFwicm12XCIsXCJybXdcIixcInJteFwiLFwicm15XCIsXCJybXpcIixcInJuYVwiLFwicm5kXCIsXCJybmdcIixcInJubFwiLFwicm5uXCIsXCJybnBcIixcInJuclwiLFwicm53XCIsXCJyb2FcIixcInJvYlwiLFwicm9jXCIsXCJyb2RcIixcInJvZVwiLFwicm9mXCIsXCJyb2dcIixcInJvbFwiLFwicm9tXCIsXCJyb29cIixcInJvcFwiLFwicm9yXCIsXCJyb3VcIixcInJvd1wiLFwicnBuXCIsXCJycHRcIixcInJyaVwiLFwicnJvXCIsXCJycnRcIixcInJzYlwiLFwicnNpXCIsXCJyc2xcIixcInJzbVwiLFwicnRjXCIsXCJydGhcIixcInJ0bVwiLFwicnRzXCIsXCJydHdcIixcInJ1YlwiLFwicnVjXCIsXCJydWVcIixcInJ1ZlwiLFwicnVnXCIsXCJydWhcIixcInJ1aVwiLFwicnVrXCIsXCJydW9cIixcInJ1cFwiLFwicnVxXCIsXCJydXRcIixcInJ1dVwiLFwicnV5XCIsXCJydXpcIixcInJ3YVwiLFwicndrXCIsXCJyd2xcIixcInJ3bVwiLFwicndvXCIsXCJyd3JcIixcInJ4ZFwiLFwicnh3XCIsXCJyeW5cIixcInJ5c1wiLFwicnl1XCIsXCJyemhcIl1cbixbIFwic2FcIixcInNjXCIsXCJzZFwiLFwic2VcIixcInNnXCIsXCJzaFwiLFwic2lcIixcInNrXCIsXCJzbFwiLFwic21cIixcInNuXCIsXCJzb1wiLFwic3FcIixcInNyXCIsXCJzc1wiLFwic3RcIixcInN1XCIsXCJzdlwiLFwic3dcIixcInNhYVwiLFwic2FiXCIsXCJzYWNcIixcInNhZFwiLFwic2FlXCIsXCJzYWZcIixcInNhaFwiLFwic2FpXCIsXCJzYWpcIixcInNha1wiLFwic2FsXCIsXCJzYW1cIixcInNhb1wiLFwic2FwXCIsXCJzYXFcIixcInNhclwiLFwic2FzXCIsXCJzYXRcIixcInNhdVwiLFwic2F2XCIsXCJzYXdcIixcInNheFwiLFwic2F5XCIsXCJzYXpcIixcInNiYVwiLFwic2JiXCIsXCJzYmNcIixcInNiZFwiLFwic2JlXCIsXCJzYmZcIixcInNiZ1wiLFwic2JoXCIsXCJzYmlcIixcInNialwiLFwic2JrXCIsXCJzYmxcIixcInNibVwiLFwic2JuXCIsXCJzYm9cIixcInNicFwiLFwic2JxXCIsXCJzYnJcIixcInNic1wiLFwic2J0XCIsXCJzYnVcIixcInNidlwiLFwic2J3XCIsXCJzYnhcIixcInNieVwiLFwic2J6XCIsXCJzY2FcIixcInNjYlwiLFwic2NlXCIsXCJzY2ZcIixcInNjZ1wiLFwic2NoXCIsXCJzY2lcIixcInNja1wiLFwic2NsXCIsXCJzY25cIixcInNjb1wiLFwic2NwXCIsXCJzY3FcIixcInNjc1wiLFwic2N0XCIsXCJzY3VcIixcInNjdlwiLFwic2N3XCIsXCJzY3hcIixcInNkYVwiLFwic2RiXCIsXCJzZGNcIixcInNkZVwiLFwic2RmXCIsXCJzZGdcIixcInNkaFwiLFwic2RqXCIsXCJzZGtcIixcInNkbFwiLFwic2RtXCIsXCJzZG5cIixcInNkb1wiLFwic2RwXCIsXCJzZHFcIixcInNkclwiLFwic2RzXCIsXCJzZHRcIixcInNkdVwiLFwic2R2XCIsXCJzZHhcIixcInNkelwiLFwic2VhXCIsXCJzZWJcIixcInNlY1wiLFwic2VkXCIsXCJzZWVcIixcInNlZlwiLFwic2VnXCIsXCJzZWhcIixcInNlaVwiLFwic2VqXCIsXCJzZWtcIixcInNlbFwiLFwic2VtXCIsXCJzZW5cIixcInNlb1wiLFwic2VwXCIsXCJzZXFcIixcInNlclwiLFwic2VzXCIsXCJzZXRcIixcInNldVwiLFwic2V2XCIsXCJzZXdcIixcInNleVwiLFwic2V6XCIsXCJzZmJcIixcInNmZVwiLFwic2ZtXCIsXCJzZnNcIixcInNmd1wiLFwic2dhXCIsXCJzZ2JcIixcInNnY1wiLFwic2dkXCIsXCJzZ2VcIixcInNnZ1wiLFwic2doXCIsXCJzZ2lcIixcInNnalwiLFwic2drXCIsXCJzZ2xcIixcInNnbVwiLFwic2duXCIsXCJzZ29cIixcInNncFwiLFwic2dyXCIsXCJzZ3NcIixcInNndFwiLFwic2d1XCIsXCJzZ3dcIixcInNneFwiLFwic2d5XCIsXCJzZ3pcIixcInNoYVwiLFwic2hiXCIsXCJzaGNcIixcInNoZFwiLFwic2hlXCIsXCJzaGdcIixcInNoaFwiLFwic2hpXCIsXCJzaGpcIixcInNoa1wiLFwic2hsXCIsXCJzaG1cIixcInNoblwiLFwic2hvXCIsXCJzaHBcIixcInNocVwiLFwic2hyXCIsXCJzaHNcIixcInNodFwiLFwic2h1XCIsXCJzaHZcIixcInNod1wiLFwic2h4XCIsXCJzaHlcIixcInNoelwiLFwic2lhXCIsXCJzaWJcIixcInNpZFwiLFwic2llXCIsXCJzaWZcIixcInNpZ1wiLFwic2loXCIsXCJzaWlcIixcInNpalwiLFwic2lrXCIsXCJzaWxcIixcInNpbVwiLFwic2lvXCIsXCJzaXBcIixcInNpcVwiLFwic2lyXCIsXCJzaXNcIixcInNpdFwiLFwic2l1XCIsXCJzaXZcIixcInNpd1wiLFwic2l4XCIsXCJzaXlcIixcInNpelwiLFwic2phXCIsXCJzamJcIixcInNqZFwiLFwic2plXCIsXCJzamdcIixcInNqa1wiLFwic2psXCIsXCJzam1cIixcInNqblwiLFwic2pvXCIsXCJzanBcIixcInNqclwiLFwic2pzXCIsXCJzanRcIixcInNqdVwiLFwic2p3XCIsXCJza2FcIixcInNrYlwiLFwic2tjXCIsXCJza2RcIixcInNrZVwiLFwic2tmXCIsXCJza2dcIixcInNraFwiLFwic2tpXCIsXCJza2pcIixcInNra1wiLFwic2ttXCIsXCJza25cIixcInNrb1wiLFwic2twXCIsXCJza3FcIixcInNrclwiLFwic2tzXCIsXCJza3RcIixcInNrdVwiLFwic2t2XCIsXCJza3dcIixcInNreFwiLFwic2t5XCIsXCJza3pcIixcInNsYVwiLFwic2xjXCIsXCJzbGRcIixcInNsZVwiLFwic2xmXCIsXCJzbGdcIixcInNsaFwiLFwic2xpXCIsXCJzbGpcIixcInNsbFwiLFwic2xtXCIsXCJzbG5cIixcInNscFwiLFwic2xxXCIsXCJzbHJcIixcInNsc1wiLFwic2x0XCIsXCJzbHVcIixcInNsd1wiLFwic2x4XCIsXCJzbHlcIixcInNselwiLFwic21hXCIsXCJzbWJcIixcInNtY1wiLFwic21kXCIsXCJzbWZcIixcInNtZ1wiLFwic21oXCIsXCJzbWlcIixcInNtalwiLFwic21rXCIsXCJzbWxcIixcInNtbVwiLFwic21uXCIsXCJzbXBcIixcInNtcVwiLFwic21yXCIsXCJzbXNcIixcInNtdFwiLFwic211XCIsXCJzbXZcIixcInNtd1wiLFwic214XCIsXCJzbXlcIixcInNtelwiLFwic25iXCIsXCJzbmNcIixcInNuZVwiLFwic25mXCIsXCJzbmdcIixcInNuaFwiLFwic25pXCIsXCJzbmpcIixcInNua1wiLFwic25sXCIsXCJzbm1cIixcInNublwiLFwic25vXCIsXCJzbnBcIixcInNucVwiLFwic25yXCIsXCJzbnNcIixcInNudVwiLFwic252XCIsXCJzbndcIixcInNueFwiLFwic255XCIsXCJzbnpcIixcInNvYVwiLFwic29iXCIsXCJzb2NcIixcInNvZFwiLFwic29lXCIsXCJzb2dcIixcInNvaFwiLFwic29pXCIsXCJzb2pcIixcInNva1wiLFwic29sXCIsXCJzb25cIixcInNvb1wiLFwic29wXCIsXCJzb3FcIixcInNvclwiLFwic29zXCIsXCJzb3VcIixcInNvdlwiLFwic293XCIsXCJzb3hcIixcInNveVwiLFwic296XCIsXCJzcGJcIixcInNwY1wiLFwic3BkXCIsXCJzcGVcIixcInNwZ1wiLFwic3BpXCIsXCJzcGtcIixcInNwbFwiLFwic3BtXCIsXCJzcG5cIixcInNwb1wiLFwic3BwXCIsXCJzcHFcIixcInNwclwiLFwic3BzXCIsXCJzcHRcIixcInNwdVwiLFwic3B2XCIsXCJzcHhcIixcInNweVwiLFwic3FhXCIsXCJzcWhcIixcInNxalwiLFwic3FrXCIsXCJzcW1cIixcInNxblwiLFwic3FvXCIsXCJzcXFcIixcInNxclwiLFwic3FzXCIsXCJzcXRcIixcInNxdVwiLFwic3F4XCIsXCJzcmFcIixcInNyYlwiLFwic3JjXCIsXCJzcmVcIixcInNyZlwiLFwic3JnXCIsXCJzcmhcIixcInNyaVwiLFwic3JrXCIsXCJzcmxcIixcInNybVwiLFwic3JuXCIsXCJzcm9cIixcInNycVwiLFwic3JyXCIsXCJzcnNcIixcInNydFwiLFwic3J1XCIsXCJzcnZcIixcInNyd1wiLFwic3J4XCIsXCJzcnlcIixcInNyelwiLFwic3NhXCIsXCJzc2JcIixcInNzY1wiLFwic3NkXCIsXCJzc2VcIixcInNzZlwiLFwic3NnXCIsXCJzc2hcIixcInNzaVwiLFwic3NqXCIsXCJzc2tcIixcInNzbFwiLFwic3NtXCIsXCJzc25cIixcInNzb1wiLFwic3NwXCIsXCJzc3FcIixcInNzclwiLFwic3NzXCIsXCJzc3RcIixcInNzdVwiLFwic3N2XCIsXCJzc3hcIixcInNzeVwiLFwic3N6XCIsXCJzdGFcIixcInN0YlwiLFwic3RkXCIsXCJzdGVcIixcInN0ZlwiLFwic3RnXCIsXCJzdGhcIixcInN0aVwiLFwic3RqXCIsXCJzdGtcIixcInN0bFwiLFwic3RtXCIsXCJzdG5cIixcInN0b1wiLFwic3RwXCIsXCJzdHFcIixcInN0clwiLFwic3RzXCIsXCJzdHRcIixcInN0dVwiLFwic3R2XCIsXCJzdHdcIixcInN0eVwiLFwic3VhXCIsXCJzdWJcIixcInN1Y1wiLFwic3VlXCIsXCJzdWdcIixcInN1aVwiLFwic3VqXCIsXCJzdWtcIixcInN1bFwiLFwic3VtXCIsXCJzdW9cIixcInN1cVwiLFwic3VyXCIsXCJzdXNcIixcInN1dFwiLFwic3V2XCIsXCJzdXdcIixcInN1eFwiLFwic3V5XCIsXCJzdXpcIixcInN2YVwiLFwic3ZiXCIsXCJzdmNcIixcInN2ZVwiLFwic3ZrXCIsXCJzdm1cIixcInN2clwiLFwic3ZzXCIsXCJzdnhcIixcInN3YlwiLFwic3djXCIsXCJzd2ZcIixcInN3Z1wiLFwic3doXCIsXCJzd2lcIixcInN3alwiLFwic3drXCIsXCJzd2xcIixcInN3bVwiLFwic3duXCIsXCJzd29cIixcInN3cFwiLFwic3dxXCIsXCJzd3JcIixcInN3c1wiLFwic3d0XCIsXCJzd3VcIixcInN3dlwiLFwic3d3XCIsXCJzd3hcIixcInN3eVwiLFwic3hiXCIsXCJzeGNcIixcInN4ZVwiLFwic3hnXCIsXCJzeGtcIixcInN4bFwiLFwic3htXCIsXCJzeG5cIixcInN4b1wiLFwic3hyXCIsXCJzeHNcIixcInN4dVwiLFwic3h3XCIsXCJzeWFcIixcInN5YlwiLFwic3ljXCIsXCJzeWRcIixcInN5aVwiLFwic3lrXCIsXCJzeWxcIixcInN5bVwiLFwic3luXCIsXCJzeW9cIixcInN5clwiLFwic3lzXCIsXCJzeXdcIixcInN5eFwiLFwic3l5XCIsXCJzemFcIixcInN6YlwiLFwic3pjXCIsXCJzemRcIixcInN6ZVwiLFwic3pnXCIsXCJzemxcIixcInN6blwiLFwic3pwXCIsXCJzenNcIixcInN6dlwiLFwic3p3XCIsXCJzenlcIl1cbixbIFwidGFcIixcInRlXCIsXCJ0Z1wiLFwidGhcIixcInRpXCIsXCJ0a1wiLFwidGxcIixcInRuXCIsXCJ0b1wiLFwidHJcIixcInRzXCIsXCJ0dFwiLFwidHdcIixcInR5XCIsXCJ0YWFcIixcInRhYlwiLFwidGFjXCIsXCJ0YWRcIixcInRhZVwiLFwidGFmXCIsXCJ0YWdcIixcInRhaVwiLFwidGFqXCIsXCJ0YWtcIixcInRhbFwiLFwidGFuXCIsXCJ0YW9cIixcInRhcFwiLFwidGFxXCIsXCJ0YXJcIixcInRhc1wiLFwidGF1XCIsXCJ0YXZcIixcInRhd1wiLFwidGF4XCIsXCJ0YXlcIixcInRhelwiLFwidGJhXCIsXCJ0YmJcIixcInRiY1wiLFwidGJkXCIsXCJ0YmVcIixcInRiZlwiLFwidGJnXCIsXCJ0YmhcIixcInRiaVwiLFwidGJqXCIsXCJ0YmtcIixcInRibFwiLFwidGJtXCIsXCJ0Ym5cIixcInRib1wiLFwidGJwXCIsXCJ0YnFcIixcInRiclwiLFwidGJzXCIsXCJ0YnRcIixcInRidVwiLFwidGJ2XCIsXCJ0YndcIixcInRieFwiLFwidGJ5XCIsXCJ0YnpcIixcInRjYVwiLFwidGNiXCIsXCJ0Y2NcIixcInRjZFwiLFwidGNlXCIsXCJ0Y2ZcIixcInRjZ1wiLFwidGNoXCIsXCJ0Y2lcIixcInRja1wiLFwidGNsXCIsXCJ0Y21cIixcInRjblwiLFwidGNvXCIsXCJ0Y3BcIixcInRjcVwiLFwidGNzXCIsXCJ0Y3RcIixcInRjdVwiLFwidGN3XCIsXCJ0Y3hcIixcInRjeVwiLFwidGN6XCIsXCJ0ZGFcIixcInRkYlwiLFwidGRjXCIsXCJ0ZGRcIixcInRkZVwiLFwidGRmXCIsXCJ0ZGdcIixcInRkaFwiLFwidGRpXCIsXCJ0ZGpcIixcInRka1wiLFwidGRsXCIsXCJ0ZG1cIixcInRkblwiLFwidGRvXCIsXCJ0ZHFcIixcInRkclwiLFwidGRzXCIsXCJ0ZHRcIixcInRkdVwiLFwidGR2XCIsXCJ0ZHhcIixcInRkeVwiLFwidGVhXCIsXCJ0ZWJcIixcInRlY1wiLFwidGVkXCIsXCJ0ZWVcIixcInRlZlwiLFwidGVnXCIsXCJ0ZWhcIixcInRlaVwiLFwidGVrXCIsXCJ0ZW1cIixcInRlblwiLFwidGVvXCIsXCJ0ZXBcIixcInRlcVwiLFwidGVyXCIsXCJ0ZXNcIixcInRldFwiLFwidGV1XCIsXCJ0ZXZcIixcInRld1wiLFwidGV4XCIsXCJ0ZXlcIixcInRlelwiLFwidGZpXCIsXCJ0Zm5cIixcInRmb1wiLFwidGZyXCIsXCJ0ZnRcIixcInRnYVwiLFwidGdiXCIsXCJ0Z2NcIixcInRnZFwiLFwidGdlXCIsXCJ0Z2ZcIixcInRnZ1wiLFwidGdoXCIsXCJ0Z2lcIixcInRnalwiLFwidGduXCIsXCJ0Z29cIixcInRncFwiLFwidGdxXCIsXCJ0Z3JcIixcInRnc1wiLFwidGd0XCIsXCJ0Z3VcIixcInRndlwiLFwidGd3XCIsXCJ0Z3hcIixcInRneVwiLFwidGd6XCIsXCJ0aGNcIixcInRoZFwiLFwidGhlXCIsXCJ0aGZcIixcInRoaFwiLFwidGhpXCIsXCJ0aGtcIixcInRobFwiLFwidGhtXCIsXCJ0aG5cIixcInRocFwiLFwidGhxXCIsXCJ0aHJcIixcInRoc1wiLFwidGh0XCIsXCJ0aHVcIixcInRodlwiLFwidGh3XCIsXCJ0aHhcIixcInRoeVwiLFwidGh6XCIsXCJ0aWFcIixcInRpY1wiLFwidGlkXCIsXCJ0aWVcIixcInRpZlwiLFwidGlnXCIsXCJ0aWhcIixcInRpaVwiLFwidGlqXCIsXCJ0aWtcIixcInRpbFwiLFwidGltXCIsXCJ0aW5cIixcInRpb1wiLFwidGlwXCIsXCJ0aXFcIixcInRpc1wiLFwidGl0XCIsXCJ0aXVcIixcInRpdlwiLFwidGl3XCIsXCJ0aXhcIixcInRpeVwiLFwidGl6XCIsXCJ0amFcIixcInRqZ1wiLFwidGppXCIsXCJ0ampcIixcInRqbFwiLFwidGptXCIsXCJ0am5cIixcInRqb1wiLFwidGpwXCIsXCJ0anNcIixcInRqdVwiLFwidGp3XCIsXCJ0a2FcIixcInRrYlwiLFwidGtkXCIsXCJ0a2VcIixcInRrZlwiLFwidGtnXCIsXCJ0a2tcIixcInRrbFwiLFwidGttXCIsXCJ0a25cIixcInRrcFwiLFwidGtxXCIsXCJ0a3JcIixcInRrc1wiLFwidGt0XCIsXCJ0a3VcIixcInRrdlwiLFwidGt3XCIsXCJ0a3hcIixcInRrelwiLFwidGxhXCIsXCJ0bGJcIixcInRsY1wiLFwidGxkXCIsXCJ0bGZcIixcInRsZ1wiLFwidGxoXCIsXCJ0bGlcIixcInRsalwiLFwidGxrXCIsXCJ0bGxcIixcInRsbVwiLFwidGxuXCIsXCJ0bG9cIixcInRscFwiLFwidGxxXCIsXCJ0bHJcIixcInRsc1wiLFwidGx0XCIsXCJ0bHVcIixcInRsdlwiLFwidGx3XCIsXCJ0bHhcIixcInRseVwiLFwidG1hXCIsXCJ0bWJcIixcInRtY1wiLFwidG1kXCIsXCJ0bWVcIixcInRtZlwiLFwidG1nXCIsXCJ0bWhcIixcInRtaVwiLFwidG1qXCIsXCJ0bWtcIixcInRtbFwiLFwidG1tXCIsXCJ0bW5cIixcInRtb1wiLFwidG1wXCIsXCJ0bXFcIixcInRtclwiLFwidG1zXCIsXCJ0bXRcIixcInRtdVwiLFwidG12XCIsXCJ0bXdcIixcInRteVwiLFwidG16XCIsXCJ0bmFcIixcInRuYlwiLFwidG5jXCIsXCJ0bmRcIixcInRuZVwiLFwidG5mXCIsXCJ0bmdcIixcInRuaFwiLFwidG5pXCIsXCJ0bmtcIixcInRubFwiLFwidG5tXCIsXCJ0bm5cIixcInRub1wiLFwidG5wXCIsXCJ0bnFcIixcInRuclwiLFwidG5zXCIsXCJ0bnRcIixcInRudVwiLFwidG52XCIsXCJ0bndcIixcInRueFwiLFwidG55XCIsXCJ0bnpcIixcInRvYlwiLFwidG9jXCIsXCJ0b2RcIixcInRvZVwiLFwidG9mXCIsXCJ0b2dcIixcInRvaFwiLFwidG9pXCIsXCJ0b2pcIixcInRvbFwiLFwidG9tXCIsXCJ0b29cIixcInRvcFwiLFwidG9xXCIsXCJ0b3JcIixcInRvc1wiLFwidG91XCIsXCJ0b3ZcIixcInRvd1wiLFwidG94XCIsXCJ0b3lcIixcInRvelwiLFwidHBhXCIsXCJ0cGNcIixcInRwZVwiLFwidHBmXCIsXCJ0cGdcIixcInRwaVwiLFwidHBqXCIsXCJ0cGtcIixcInRwbFwiLFwidHBtXCIsXCJ0cG5cIixcInRwb1wiLFwidHBwXCIsXCJ0cHFcIixcInRwclwiLFwidHB0XCIsXCJ0cHVcIixcInRwdlwiLFwidHB3XCIsXCJ0cHhcIixcInRweVwiLFwidHB6XCIsXCJ0cWJcIixcInRxbFwiLFwidHFtXCIsXCJ0cW5cIixcInRxb1wiLFwidHFwXCIsXCJ0cXFcIixcInRxclwiLFwidHF0XCIsXCJ0cXVcIixcInRxd1wiLFwidHJhXCIsXCJ0cmJcIixcInRyY1wiLFwidHJkXCIsXCJ0cmVcIixcInRyZlwiLFwidHJnXCIsXCJ0cmhcIixcInRyaVwiLFwidHJqXCIsXCJ0cmtcIixcInRybFwiLFwidHJtXCIsXCJ0cm5cIixcInRyb1wiLFwidHJwXCIsXCJ0cnFcIixcInRyclwiLFwidHJzXCIsXCJ0cnRcIixcInRydVwiLFwidHJ2XCIsXCJ0cndcIixcInRyeFwiLFwidHJ5XCIsXCJ0cnpcIixcInRzYVwiLFwidHNiXCIsXCJ0c2NcIixcInRzZFwiLFwidHNlXCIsXCJ0c2ZcIixcInRzZ1wiLFwidHNoXCIsXCJ0c2lcIixcInRzalwiLFwidHNrXCIsXCJ0c2xcIixcInRzbVwiLFwidHNwXCIsXCJ0c3FcIixcInRzclwiLFwidHNzXCIsXCJ0c3RcIixcInRzdVwiLFwidHN2XCIsXCJ0c3dcIixcInRzeFwiLFwidHN5XCIsXCJ0c3pcIixcInR0YVwiLFwidHRiXCIsXCJ0dGNcIixcInR0ZFwiLFwidHRlXCIsXCJ0dGZcIixcInR0Z1wiLFwidHRoXCIsXCJ0dGlcIixcInR0alwiLFwidHRrXCIsXCJ0dGxcIixcInR0bVwiLFwidHRuXCIsXCJ0dG9cIixcInR0cFwiLFwidHRxXCIsXCJ0dHJcIixcInR0c1wiLFwidHR0XCIsXCJ0dHVcIixcInR0dlwiLFwidHR3XCIsXCJ0dHlcIixcInR0elwiLFwidHVhXCIsXCJ0dWJcIixcInR1Y1wiLFwidHVkXCIsXCJ0dWVcIixcInR1ZlwiLFwidHVnXCIsXCJ0dWhcIixcInR1aVwiLFwidHVqXCIsXCJ0dWxcIixcInR1bVwiLFwidHVuXCIsXCJ0dW9cIixcInR1cFwiLFwidHVxXCIsXCJ0dXNcIixcInR1dFwiLFwidHV1XCIsXCJ0dXZcIixcInR1d1wiLFwidHV4XCIsXCJ0dXlcIixcInR1elwiLFwidHZhXCIsXCJ0dmRcIixcInR2ZVwiLFwidHZrXCIsXCJ0dmxcIixcInR2bVwiLFwidHZuXCIsXCJ0dm9cIixcInR2c1wiLFwidHZ0XCIsXCJ0dnVcIixcInR2d1wiLFwidHZ4XCIsXCJ0dnlcIixcInR3YVwiLFwidHdiXCIsXCJ0d2NcIixcInR3ZFwiLFwidHdlXCIsXCJ0d2ZcIixcInR3Z1wiLFwidHdoXCIsXCJ0d2xcIixcInR3bVwiLFwidHduXCIsXCJ0d29cIixcInR3cFwiLFwidHdxXCIsXCJ0d3JcIixcInR3dFwiLFwidHd1XCIsXCJ0d3dcIixcInR3eFwiLFwidHd5XCIsXCJ0eGFcIixcInR4YlwiLFwidHhjXCIsXCJ0eGVcIixcInR4Z1wiLFwidHhoXCIsXCJ0eGlcIixcInR4alwiLFwidHhtXCIsXCJ0eG5cIixcInR4b1wiLFwidHhxXCIsXCJ0eHJcIixcInR4c1wiLFwidHh0XCIsXCJ0eHVcIixcInR4eFwiLFwidHh5XCIsXCJ0eWFcIixcInR5ZVwiLFwidHloXCIsXCJ0eWlcIixcInR5alwiLFwidHlsXCIsXCJ0eW5cIixcInR5cFwiLFwidHlyXCIsXCJ0eXNcIixcInR5dFwiLFwidHl1XCIsXCJ0eXZcIixcInR5eFwiLFwidHl5XCIsXCJ0eXpcIixcInR6YVwiLFwidHpoXCIsXCJ0empcIixcInR6bFwiLFwidHptXCIsXCJ0em5cIixcInR6b1wiLFwidHp4XCJdXG4sWyBcInVnXCIsXCJ1a1wiLFwidXJcIixcInV6XCIsXCJ1YW1cIixcInVhblwiLFwidWFyXCIsXCJ1YmFcIixcInViaVwiLFwidWJsXCIsXCJ1YnJcIixcInVidVwiLFwidWJ5XCIsXCJ1ZGFcIixcInVkZVwiLFwidWRnXCIsXCJ1ZGlcIixcInVkalwiLFwidWRsXCIsXCJ1ZG1cIixcInVkdVwiLFwidWVzXCIsXCJ1ZmlcIixcInVnYVwiLFwidWdiXCIsXCJ1Z2VcIixcInVnblwiLFwidWdvXCIsXCJ1Z3lcIixcInVoYVwiLFwidWhuXCIsXCJ1aXNcIixcInVpdlwiLFwidWppXCIsXCJ1a2FcIixcInVrZ1wiLFwidWtoXCIsXCJ1a2lcIixcInVra1wiLFwidWtsXCIsXCJ1a3BcIixcInVrcVwiLFwidWtzXCIsXCJ1a3VcIixcInVrdlwiLFwidWt3XCIsXCJ1a3lcIixcInVsYVwiLFwidWxiXCIsXCJ1bGNcIixcInVsZVwiLFwidWxmXCIsXCJ1bGlcIixcInVsa1wiLFwidWxsXCIsXCJ1bG1cIixcInVsblwiLFwidWx1XCIsXCJ1bHdcIixcInVtYVwiLFwidW1iXCIsXCJ1bWNcIixcInVtZFwiLFwidW1nXCIsXCJ1bWlcIixcInVtbVwiLFwidW1uXCIsXCJ1bW9cIixcInVtcFwiLFwidW1yXCIsXCJ1bXNcIixcInVtdVwiLFwidW5hXCIsXCJ1bmRcIixcInVuZVwiLFwidW5nXCIsXCJ1bmlcIixcInVua1wiLFwidW5tXCIsXCJ1bm5cIixcInVucFwiLFwidW5yXCIsXCJ1bnVcIixcInVueFwiLFwidW56XCIsXCJ1b2tcIixcInVwaVwiLFwidXB2XCIsXCJ1cmFcIixcInVyYlwiLFwidXJjXCIsXCJ1cmVcIixcInVyZlwiLFwidXJnXCIsXCJ1cmhcIixcInVyaVwiLFwidXJqXCIsXCJ1cmtcIixcInVybFwiLFwidXJtXCIsXCJ1cm5cIixcInVyb1wiLFwidXJwXCIsXCJ1cnJcIixcInVydFwiLFwidXJ1XCIsXCJ1cnZcIixcInVyd1wiLFwidXJ4XCIsXCJ1cnlcIixcInVyelwiLFwidXNhXCIsXCJ1c2hcIixcInVzaVwiLFwidXNrXCIsXCJ1c3BcIixcInVzc1wiLFwidXN1XCIsXCJ1dGFcIixcInV0ZVwiLFwidXRoXCIsXCJ1dHBcIixcInV0clwiLFwidXR1XCIsXCJ1dW1cIixcInV1blwiLFwidXVyXCIsXCJ1dXVcIixcInV2ZVwiLFwidXZoXCIsXCJ1dmxcIixcInV3YVwiLFwidXlhXCIsXCJ1em5cIixcInV6c1wiXVxuLFsgXCJ2ZVwiLFwidmlcIixcInZvXCIsXCJ2YWFcIixcInZhZVwiLFwidmFmXCIsXCJ2YWdcIixcInZhaFwiLFwidmFpXCIsXCJ2YWpcIixcInZhbFwiLFwidmFtXCIsXCJ2YW5cIixcInZhb1wiLFwidmFwXCIsXCJ2YXJcIixcInZhc1wiLFwidmF1XCIsXCJ2YXZcIixcInZheVwiLFwidmJiXCIsXCJ2YmtcIixcInZlY1wiLFwidmVkXCIsXCJ2ZWxcIixcInZlbVwiLFwidmVvXCIsXCJ2ZXBcIixcInZlclwiLFwidmdyXCIsXCJ2Z3RcIixcInZpY1wiLFwidmlkXCIsXCJ2aWZcIixcInZpZ1wiLFwidmlsXCIsXCJ2aW5cIixcInZpc1wiLFwidml0XCIsXCJ2aXZcIixcInZrYVwiLFwidmtpXCIsXCJ2a2pcIixcInZra1wiLFwidmtsXCIsXCJ2a21cIixcInZrblwiLFwidmtvXCIsXCJ2a3BcIixcInZrdFwiLFwidmt1XCIsXCJ2a3pcIixcInZscFwiLFwidmxzXCIsXCJ2bWFcIixcInZtYlwiLFwidm1jXCIsXCJ2bWRcIixcInZtZVwiLFwidm1mXCIsXCJ2bWdcIixcInZtaFwiLFwidm1pXCIsXCJ2bWpcIixcInZta1wiLFwidm1sXCIsXCJ2bW1cIixcInZtcFwiLFwidm1xXCIsXCJ2bXJcIixcInZtc1wiLFwidm11XCIsXCJ2bXZcIixcInZtd1wiLFwidm14XCIsXCJ2bXlcIixcInZtelwiLFwidm5rXCIsXCJ2bm1cIixcInZucFwiLFwidm9yXCIsXCJ2b3RcIixcInZyYVwiLFwidnJvXCIsXCJ2cnNcIixcInZydFwiLFwidnNpXCIsXCJ2c2xcIixcInZzdlwiLFwidnRvXCIsXCJ2dW1cIixcInZ1blwiLFwidnV0XCIsXCJ2d2FcIl1cbixbIFwid2FcIixcIndvXCIsXCJ3YWFcIixcIndhYlwiLFwid2FjXCIsXCJ3YWRcIixcIndhZVwiLFwid2FmXCIsXCJ3YWdcIixcIndhaFwiLFwid2FpXCIsXCJ3YWpcIixcIndha1wiLFwid2FsXCIsXCJ3YW1cIixcIndhblwiLFwid2FvXCIsXCJ3YXBcIixcIndhcVwiLFwid2FyXCIsXCJ3YXNcIixcIndhdFwiLFwid2F1XCIsXCJ3YXZcIixcIndhd1wiLFwid2F4XCIsXCJ3YXlcIixcIndhelwiLFwid2JhXCIsXCJ3YmJcIixcIndiZVwiLFwid2JmXCIsXCJ3YmhcIixcIndiaVwiLFwid2JqXCIsXCJ3YmtcIixcIndibFwiLFwid2JtXCIsXCJ3YnBcIixcIndicVwiLFwid2JyXCIsXCJ3YnNcIixcIndidFwiLFwid2J2XCIsXCJ3YndcIixcIndjYVwiLFwid2NpXCIsXCJ3ZGRcIixcIndkZ1wiLFwid2RqXCIsXCJ3ZGtcIixcIndkdVwiLFwid2R5XCIsXCJ3ZWFcIixcIndlY1wiLFwid2VkXCIsXCJ3ZWdcIixcIndlaFwiLFwid2VpXCIsXCJ3ZW1cIixcIndlblwiLFwid2VvXCIsXCJ3ZXBcIixcIndlclwiLFwid2VzXCIsXCJ3ZXRcIixcIndldVwiLFwid2V3XCIsXCJ3ZmdcIixcIndnYVwiLFwid2diXCIsXCJ3Z2dcIixcIndnaVwiLFwid2dvXCIsXCJ3Z3VcIixcIndnd1wiLFwid2d5XCIsXCJ3aGFcIixcIndoZ1wiLFwid2hrXCIsXCJ3aHVcIixcIndpYlwiLFwid2ljXCIsXCJ3aWVcIixcIndpZlwiLFwid2lnXCIsXCJ3aWhcIixcIndpaVwiLFwid2lqXCIsXCJ3aWtcIixcIndpbFwiLFwid2ltXCIsXCJ3aW5cIixcIndpclwiLFwid2l0XCIsXCJ3aXVcIixcIndpdlwiLFwid2l3XCIsXCJ3aXlcIixcIndqYVwiLFwid2ppXCIsXCJ3a2FcIixcIndrYlwiLFwid2tkXCIsXCJ3a2xcIixcIndrclwiLFwid2t1XCIsXCJ3a3dcIixcIndreVwiLFwid2xhXCIsXCJ3bGNcIixcIndsZVwiLFwid2xnXCIsXCJ3bGhcIixcIndsaVwiLFwid2xrXCIsXCJ3bGxcIixcIndsbVwiLFwid2xvXCIsXCJ3bHJcIixcIndsc1wiLFwid2x1XCIsXCJ3bHZcIixcIndsd1wiLFwid2x4XCIsXCJ3bHlcIixcIndtYVwiLFwid21iXCIsXCJ3bWNcIixcIndtZFwiLFwid21lXCIsXCJ3bWdcIixcIndtaFwiLFwid21pXCIsXCJ3bW1cIixcIndtblwiLFwid21vXCIsXCJ3bXNcIixcIndtdFwiLFwid213XCIsXCJ3bXhcIixcInduYlwiLFwid25jXCIsXCJ3bmRcIixcInduZVwiLFwid25nXCIsXCJ3bmlcIixcIndua1wiLFwid25tXCIsXCJ3bm5cIixcIndub1wiLFwid25wXCIsXCJ3bnVcIixcIndud1wiLFwid255XCIsXCJ3b2FcIixcIndvYlwiLFwid29jXCIsXCJ3b2RcIixcIndvZVwiLFwid29mXCIsXCJ3b2dcIixcIndvaVwiLFwid29rXCIsXCJ3b21cIixcIndvblwiLFwid29vXCIsXCJ3b3JcIixcIndvc1wiLFwid293XCIsXCJ3b3lcIixcIndwY1wiLFwid3JhXCIsXCJ3cmJcIixcIndyZFwiLFwid3JnXCIsXCJ3cmhcIixcIndyaVwiLFwid3JrXCIsXCJ3cmxcIixcIndybVwiLFwid3JuXCIsXCJ3cm9cIixcIndycFwiLFwid3JyXCIsXCJ3cnNcIixcIndydVwiLFwid3J2XCIsXCJ3cndcIixcIndyeFwiLFwid3J5XCIsXCJ3cnpcIixcIndzYVwiLFwid3NnXCIsXCJ3c2lcIixcIndza1wiLFwid3NyXCIsXCJ3c3NcIixcIndzdVwiLFwid3N2XCIsXCJ3dGZcIixcInd0aFwiLFwid3RpXCIsXCJ3dGtcIixcInd0bVwiLFwid3R3XCIsXCJ3dWFcIixcInd1YlwiLFwid3VkXCIsXCJ3dWhcIixcInd1bFwiLFwid3VtXCIsXCJ3dW5cIixcInd1clwiLFwid3V0XCIsXCJ3dXVcIixcInd1dlwiLFwid3V4XCIsXCJ3dXlcIixcInd3YVwiLFwid3diXCIsXCJ3d29cIixcInd3clwiLFwid3d3XCIsXCJ3eGFcIixcInd4d1wiLFwid3lhXCIsXCJ3eWJcIixcInd5aVwiLFwid3ltXCIsXCJ3eXJcIixcInd5eVwiXVxuLFsgXCJ4aFwiLFwieGFhXCIsXCJ4YWJcIixcInhhY1wiLFwieGFkXCIsXCJ4YWVcIixcInhhZ1wiLFwieGFpXCIsXCJ4YWpcIixcInhha1wiLFwieGFsXCIsXCJ4YW1cIixcInhhblwiLFwieGFvXCIsXCJ4YXBcIixcInhhcVwiLFwieGFyXCIsXCJ4YXNcIixcInhhdFwiLFwieGF1XCIsXCJ4YXZcIixcInhhd1wiLFwieGF5XCIsXCJ4YmFcIixcInhiYlwiLFwieGJjXCIsXCJ4YmRcIixcInhiZVwiLFwieGJnXCIsXCJ4YmlcIixcInhialwiLFwieGJtXCIsXCJ4Ym5cIixcInhib1wiLFwieGJwXCIsXCJ4YnJcIixcInhid1wiLFwieGJ4XCIsXCJ4YnlcIixcInhjYlwiLFwieGNjXCIsXCJ4Y2VcIixcInhjZ1wiLFwieGNoXCIsXCJ4Y2xcIixcInhjbVwiLFwieGNuXCIsXCJ4Y29cIixcInhjclwiLFwieGN0XCIsXCJ4Y3VcIixcInhjdlwiLFwieGN3XCIsXCJ4Y3lcIixcInhkYVwiLFwieGRjXCIsXCJ4ZGtcIixcInhkbVwiLFwieGRvXCIsXCJ4ZHlcIixcInhlYlwiLFwieGVkXCIsXCJ4ZWdcIixcInhlbFwiLFwieGVtXCIsXCJ4ZXBcIixcInhlclwiLFwieGVzXCIsXCJ4ZXRcIixcInhldVwiLFwieGZhXCIsXCJ4Z2FcIixcInhnYlwiLFwieGdkXCIsXCJ4Z2ZcIixcInhnZ1wiLFwieGdpXCIsXCJ4Z2xcIixcInhnbVwiLFwieGduXCIsXCJ4Z3JcIixcInhndVwiLFwieGd3XCIsXCJ4aGFcIixcInhoY1wiLFwieGhkXCIsXCJ4aGVcIixcInhoclwiLFwieGh0XCIsXCJ4aHVcIixcInhodlwiLFwieGlhXCIsXCJ4aWJcIixcInhpaVwiLFwieGlsXCIsXCJ4aW5cIixcInhpcFwiLFwieGlyXCIsXCJ4aXNcIixcInhpdlwiLFwieGl5XCIsXCJ4amJcIixcInhqdFwiLFwieGthXCIsXCJ4a2JcIixcInhrY1wiLFwieGtkXCIsXCJ4a2VcIixcInhrZlwiLFwieGtnXCIsXCJ4a2hcIixcInhraVwiLFwieGtqXCIsXCJ4a2tcIixcInhrbFwiLFwieGtuXCIsXCJ4a29cIixcInhrcFwiLFwieGtxXCIsXCJ4a3JcIixcInhrc1wiLFwieGt0XCIsXCJ4a3VcIixcInhrdlwiLFwieGt3XCIsXCJ4a3hcIixcInhreVwiLFwieGt6XCIsXCJ4bGFcIixcInhsYlwiLFwieGxjXCIsXCJ4bGRcIixcInhsZVwiLFwieGxnXCIsXCJ4bGlcIixcInhsblwiLFwieGxvXCIsXCJ4bHBcIixcInhsc1wiLFwieGx1XCIsXCJ4bHlcIixcInhtYVwiLFwieG1iXCIsXCJ4bWNcIixcInhtZFwiLFwieG1lXCIsXCJ4bWZcIixcInhtZ1wiLFwieG1oXCIsXCJ4bWpcIixcInhta1wiLFwieG1sXCIsXCJ4bW1cIixcInhtblwiLFwieG1vXCIsXCJ4bXBcIixcInhtcVwiLFwieG1yXCIsXCJ4bXNcIixcInhtdFwiLFwieG11XCIsXCJ4bXZcIixcInhtd1wiLFwieG14XCIsXCJ4bXlcIixcInhtelwiLFwieG5hXCIsXCJ4bmJcIixcInhuZFwiLFwieG5nXCIsXCJ4bmhcIixcInhuaVwiLFwieG5qXCIsXCJ4bmtcIixcInhubVwiLFwieG5uXCIsXCJ4bm9cIixcInhucVwiLFwieG5yXCIsXCJ4bnNcIixcInhudFwiLFwieG51XCIsXCJ4bnlcIixcInhuelwiLFwieG9jXCIsXCJ4b2RcIixcInhvZ1wiLFwieG9pXCIsXCJ4b2tcIixcInhvbVwiLFwieG9uXCIsXCJ4b29cIixcInhvcFwiLFwieG9yXCIsXCJ4b3dcIixcInhwYVwiLFwieHBiXCIsXCJ4cGNcIixcInhwZFwiLFwieHBlXCIsXCJ4cGZcIixcInhwZ1wiLFwieHBoXCIsXCJ4cGlcIixcInhwalwiLFwieHBrXCIsXCJ4cGxcIixcInhwbVwiLFwieHBuXCIsXCJ4cG9cIixcInhwcFwiLFwieHBxXCIsXCJ4cHJcIixcInhwc1wiLFwieHB0XCIsXCJ4cHVcIixcInhwdlwiLFwieHB3XCIsXCJ4cHhcIixcInhweVwiLFwieHB6XCIsXCJ4cWFcIixcInhxdFwiLFwieHJhXCIsXCJ4cmJcIixcInhyZFwiLFwieHJlXCIsXCJ4cmdcIixcInhyaVwiLFwieHJtXCIsXCJ4cm5cIixcInhycVwiLFwieHJyXCIsXCJ4cnRcIixcInhydVwiLFwieHJ3XCIsXCJ4c2FcIixcInhzYlwiLFwieHNjXCIsXCJ4c2RcIixcInhzZVwiLFwieHNoXCIsXCJ4c2lcIixcInhzalwiLFwieHNsXCIsXCJ4c21cIixcInhzblwiLFwieHNvXCIsXCJ4c3BcIixcInhzcVwiLFwieHNyXCIsXCJ4c3NcIixcInhzdVwiLFwieHN2XCIsXCJ4c3lcIixcInh0YVwiLFwieHRiXCIsXCJ4dGNcIixcInh0ZFwiLFwieHRlXCIsXCJ4dGdcIixcInh0aFwiLFwieHRpXCIsXCJ4dGpcIixcInh0bFwiLFwieHRtXCIsXCJ4dG5cIixcInh0b1wiLFwieHRwXCIsXCJ4dHFcIixcInh0clwiLFwieHRzXCIsXCJ4dHRcIixcInh0dVwiLFwieHR2XCIsXCJ4dHdcIixcInh0eVwiLFwieHR6XCIsXCJ4dWFcIixcInh1YlwiLFwieHVkXCIsXCJ4dWdcIixcInh1alwiLFwieHVsXCIsXCJ4dW1cIixcInh1blwiLFwieHVvXCIsXCJ4dXBcIixcInh1clwiLFwieHV0XCIsXCJ4dXVcIixcInh2ZVwiLFwieHZpXCIsXCJ4dm5cIixcInh2b1wiLFwieHZzXCIsXCJ4d2FcIixcInh3Y1wiLFwieHdkXCIsXCJ4d2VcIixcInh3Z1wiLFwieHdqXCIsXCJ4d2tcIixcInh3bFwiLFwieHdvXCIsXCJ4d3JcIixcInh3dFwiLFwieHd3XCIsXCJ4eGJcIixcInh4a1wiLFwieHhtXCIsXCJ4eHJcIixcInh4dFwiLFwieHlhXCIsXCJ4eWJcIixcInh5alwiLFwieHlrXCIsXCJ4eWxcIixcInh5dFwiLFwieHl5XCIsXCJ4emhcIixcInh6bVwiLFwieHpwXCJdXG4sWyBcInlpXCIsXCJ5b1wiLFwieWFhXCIsXCJ5YWJcIixcInlhY1wiLFwieWFkXCIsXCJ5YWVcIixcInlhZlwiLFwieWFnXCIsXCJ5YWhcIixcInlhaVwiLFwieWFqXCIsXCJ5YWtcIixcInlhbFwiLFwieWFtXCIsXCJ5YW5cIixcInlhb1wiLFwieWFwXCIsXCJ5YXFcIixcInlhclwiLFwieWFzXCIsXCJ5YXRcIixcInlhdVwiLFwieWF2XCIsXCJ5YXdcIixcInlheFwiLFwieWF5XCIsXCJ5YXpcIixcInliYVwiLFwieWJiXCIsXCJ5YmRcIixcInliZVwiLFwieWJoXCIsXCJ5YmlcIixcInlialwiLFwieWJrXCIsXCJ5YmxcIixcInlibVwiLFwieWJuXCIsXCJ5Ym9cIixcInlieFwiLFwieWJ5XCIsXCJ5Y2hcIixcInljbFwiLFwieWNuXCIsXCJ5Y3BcIixcInlkYVwiLFwieWRkXCIsXCJ5ZGVcIixcInlkZ1wiLFwieWRrXCIsXCJ5ZHNcIixcInllYVwiLFwieWVjXCIsXCJ5ZWVcIixcInllaVwiLFwieWVqXCIsXCJ5ZWxcIixcInllblwiLFwieWVyXCIsXCJ5ZXNcIixcInlldFwiLFwieWV1XCIsXCJ5ZXZcIixcInlleVwiLFwieWdhXCIsXCJ5Z2lcIixcInlnbFwiLFwieWdtXCIsXCJ5Z3BcIixcInlnclwiLFwieWdzXCIsXCJ5Z3VcIixcInlnd1wiLFwieWhhXCIsXCJ5aGRcIixcInlobFwiLFwieWhzXCIsXCJ5aWFcIixcInlpZlwiLFwieWlnXCIsXCJ5aWhcIixcInlpaVwiLFwieWlqXCIsXCJ5aWtcIixcInlpbFwiLFwieWltXCIsXCJ5aW5cIixcInlpcFwiLFwieWlxXCIsXCJ5aXJcIixcInlpc1wiLFwieWl0XCIsXCJ5aXVcIixcInlpdlwiLFwieWl4XCIsXCJ5aXlcIixcInlpelwiLFwieWthXCIsXCJ5a2dcIixcInlraVwiLFwieWtrXCIsXCJ5a2xcIixcInlrbVwiLFwieWtuXCIsXCJ5a29cIixcInlrclwiLFwieWt0XCIsXCJ5a3VcIixcInlreVwiLFwieWxhXCIsXCJ5bGJcIixcInlsZVwiLFwieWxnXCIsXCJ5bGlcIixcInlsbFwiLFwieWxtXCIsXCJ5bG5cIixcInlsb1wiLFwieWxyXCIsXCJ5bHVcIixcInlseVwiLFwieW1hXCIsXCJ5bWJcIixcInltY1wiLFwieW1kXCIsXCJ5bWVcIixcInltZ1wiLFwieW1oXCIsXCJ5bWlcIixcInlta1wiLFwieW1sXCIsXCJ5bW1cIixcInltblwiLFwieW1vXCIsXCJ5bXBcIixcInltcVwiLFwieW1yXCIsXCJ5bXNcIixcInltdFwiLFwieW14XCIsXCJ5bXpcIixcInluYVwiLFwieW5kXCIsXCJ5bmVcIixcInluZ1wiLFwieW5oXCIsXCJ5bmtcIixcInlubFwiLFwieW5uXCIsXCJ5bm9cIixcInlucVwiLFwieW5zXCIsXCJ5bnVcIixcInlvYlwiLFwieW9nXCIsXCJ5b2lcIixcInlva1wiLFwieW9sXCIsXCJ5b21cIixcInlvblwiLFwieW9zXCIsXCJ5b3RcIixcInlveFwiLFwieW95XCIsXCJ5cGFcIixcInlwYlwiLFwieXBnXCIsXCJ5cGhcIixcInlwa1wiLFwieXBtXCIsXCJ5cG5cIixcInlwb1wiLFwieXBwXCIsXCJ5cHpcIixcInlyYVwiLFwieXJiXCIsXCJ5cmVcIixcInlyaVwiLFwieXJrXCIsXCJ5cmxcIixcInlybVwiLFwieXJuXCIsXCJ5cm9cIixcInlyc1wiLFwieXJ3XCIsXCJ5cnlcIixcInlzY1wiLFwieXNkXCIsXCJ5c2dcIixcInlzbFwiLFwieXNtXCIsXCJ5c25cIixcInlzb1wiLFwieXNwXCIsXCJ5c3JcIixcInlzc1wiLFwieXN5XCIsXCJ5dGFcIixcInl0bFwiLFwieXRwXCIsXCJ5dHdcIixcInl0eVwiLFwieXVhXCIsXCJ5dWJcIixcInl1Y1wiLFwieXVkXCIsXCJ5dWVcIixcInl1ZlwiLFwieXVnXCIsXCJ5dWlcIixcInl1alwiLFwieXVrXCIsXCJ5dWxcIixcInl1bVwiLFwieXVuXCIsXCJ5dXBcIixcInl1cVwiLFwieXVyXCIsXCJ5dXRcIixcInl1dVwiLFwieXV3XCIsXCJ5dXhcIixcInl1eVwiLFwieXV6XCIsXCJ5dmFcIixcInl2dFwiLFwieXdhXCIsXCJ5d2dcIixcInl3bFwiLFwieXduXCIsXCJ5d3FcIixcInl3clwiLFwieXd0XCIsXCJ5d3VcIixcInl3d1wiLFwieXhhXCIsXCJ5eGdcIixcInl4bFwiLFwieXhtXCIsXCJ5eHVcIixcInl4eVwiLFwieXlyXCIsXCJ5eXVcIixcInl5elwiLFwieXpnXCIsXCJ5emtcIl1cbixbIFwiemFcIixcInpoXCIsXCJ6dVwiLFwiemFhXCIsXCJ6YWJcIixcInphY1wiLFwiemFkXCIsXCJ6YWVcIixcInphZlwiLFwiemFnXCIsXCJ6YWhcIixcInphaVwiLFwiemFqXCIsXCJ6YWtcIixcInphbFwiLFwiemFtXCIsXCJ6YW9cIixcInphcFwiLFwiemFxXCIsXCJ6YXJcIixcInphc1wiLFwiemF0XCIsXCJ6YXVcIixcInphdlwiLFwiemF3XCIsXCJ6YXhcIixcInpheVwiLFwiemF6XCIsXCJ6YmFcIixcInpiY1wiLFwiemJlXCIsXCJ6YmxcIixcInpidFwiLFwiemJ1XCIsXCJ6YndcIixcInpjYVwiLFwiemNoXCIsXCJ6ZGpcIixcInplYVwiLFwiemVnXCIsXCJ6ZWhcIixcInplblwiLFwiemdhXCIsXCJ6Z2JcIixcInpnaFwiLFwiemdtXCIsXCJ6Z25cIixcInpnclwiLFwiemhiXCIsXCJ6aGRcIixcInpoaVwiLFwiemhuXCIsXCJ6aHdcIixcInpoeFwiLFwiemlhXCIsXCJ6aWJcIixcInppa1wiLFwiemlsXCIsXCJ6aW1cIixcInppblwiLFwiemlyXCIsXCJ6aXdcIixcInppelwiLFwiemthXCIsXCJ6a2JcIixcInprZFwiLFwiemtnXCIsXCJ6a2hcIixcInpra1wiLFwiemtuXCIsXCJ6a29cIixcInprcFwiLFwiemtyXCIsXCJ6a3RcIixcInprdVwiLFwiemt2XCIsXCJ6a3pcIixcInpsYVwiLFwiemxlXCIsXCJ6bGpcIixcInpsbVwiLFwiemxuXCIsXCJ6bHFcIixcInpsc1wiLFwiemx3XCIsXCJ6bWFcIixcInptYlwiLFwiem1jXCIsXCJ6bWRcIixcInptZVwiLFwiem1mXCIsXCJ6bWdcIixcInptaFwiLFwiem1pXCIsXCJ6bWpcIixcInpta1wiLFwiem1sXCIsXCJ6bW1cIixcInptblwiLFwiem1vXCIsXCJ6bXBcIixcInptcVwiLFwiem1yXCIsXCJ6bXNcIixcInptdFwiLFwiem11XCIsXCJ6bXZcIixcInptd1wiLFwiem14XCIsXCJ6bXlcIixcInptelwiLFwiem5hXCIsXCJ6bmRcIixcInpuZVwiLFwiem5nXCIsXCJ6bmtcIixcInpuc1wiLFwiem9jXCIsXCJ6b2hcIixcInpvbVwiLFwiem9vXCIsXCJ6b3FcIixcInpvclwiLFwiem9zXCIsXCJ6cGFcIixcInpwYlwiLFwienBjXCIsXCJ6cGRcIixcInpwZVwiLFwienBmXCIsXCJ6cGdcIixcInpwaFwiLFwienBpXCIsXCJ6cGpcIixcInpwa1wiLFwienBsXCIsXCJ6cG1cIixcInpwblwiLFwienBvXCIsXCJ6cHBcIixcInpwcVwiLFwienByXCIsXCJ6cHNcIixcInpwdFwiLFwienB1XCIsXCJ6cHZcIixcInpwd1wiLFwienB4XCIsXCJ6cHlcIixcInpwelwiLFwienFlXCIsXCJ6cmFcIixcInpyZ1wiLFwienJuXCIsXCJ6cm9cIixcInpycFwiLFwienJzXCIsXCJ6c2FcIixcInpza1wiLFwienNsXCIsXCJ6c21cIixcInpzclwiLFwienN1XCIsXCJ6dGVcIixcInp0Z1wiLFwienRsXCIsXCJ6dG1cIixcInp0blwiLFwienRwXCIsXCJ6dHFcIixcInp0c1wiLFwienR0XCIsXCJ6dHVcIixcInp0eFwiLFwienR5XCIsXCJ6dWFcIixcInp1aFwiLFwienVtXCIsXCJ6dW5cIixcInp1eVwiLFwiendhXCIsXCJ6eHhcIixcInp5YlwiLFwienlnXCIsXCJ6eWpcIixcInp5blwiLFwienlwXCIsXCJ6emFcIixcInp6alwiXVxuXTtcblxuXG5leHBvcnQgY2xhc3MgTGFuZ1V0aWwge1xuXG4gICAgLyogRGV0ZXJtaW5lIGlmIGdpdmVuIHN0cmluZyBpcyBhIHZhbGlkIEJDUCA0NyBzdHJpbmcgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzQmNwNDcobGFuZ1N0cjogc3RyaW5nKSA6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gL14oKFthLXpBLVpdezIsM30oLVthLXpBLVpdKC1bYS16QS1aXXszfSl7MCwyfSk/fFthLXpBLVpdezR9fFthLXpBLVpdezUsOH0pKC1bYS16QS1aXXs0fSk/KC0oW2EtekEtWl17Mn18WzAtOV17M30pKT8oLShbMC05YS16QS1aXXs1LDh9fFswLTldW2EtekEtWl17M30pKSooLVswLTlhLXd5LXpBLVdZLVpdKC1bYS16QS1aMC05XXsyLDh9KSspKigteCgtW2EtekEtWjAtOV17MSw4fSkrKT98eCgtW2EtekEtWjAtOV17MSw4fSkrfChlbi1HQi1vZWR8aS1hbWl8aS1ibm58aS1kZWZhdWx0fGktZW5vY2hpYW58aS1oYWt8aS1rbGluZ29ufGktbHV4fGktbWluZ298aS1uYXZham98aS1wd258aS10YW98aS10YXl8aS10c3V8c2duLUJFLUZSfHNnbi1CRS1OTHxzZ24tQ0gtREV8YXJ0LWxvamJhbnxjZWwtZ2F1bGlzaHxuby1ib2t8bm8tbnlufHpoLWd1b3l1fHpoLWhha2thfHpoLW1pbnx6aC1taW4tbmFufHpoLXhpYW5nKSkkLy50ZXN0KGxhbmdTdHIpXG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyB2YWxpZFByaW1hcnlMYW5nKGxhbmdTdHI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgcHJpbWFyeSA9IGxhbmdTdHIudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKHByaW1hcnkuaW5jbHVkZXMoXCItXCIpKSB7XG4gICAgICAgICAgICBwcmltYXJ5ID0gcHJpbWFyeS5zcGxpdChcIi1cIilbMF07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXByaW1hcnkubWF0Y2goL1thLXpdezIsM30vKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIC8vIHFhYS4ucXR6XG4gICAgICAgIGlmIChwcmltYXJ5Lmxlbmd0aCA9PT0gMyBcbiAgICAgICAgICAgICYmIHByaW1hcnkuY2hhckF0KDApID09PSBcInFcIlxuICAgICAgICAgICAgJiYgcHJpbWFyeS5jaGFyQ29kZUF0KDEpID49IDk3ICYmIHByaW1hcnkuY2hhckNvZGVBdCgxKSA8PSAxMTZcbiAgICAgICAgICAgICYmIHByaW1hcnkuY2hhckNvZGVBdCgyKSA+PSA5NyAmJiBwcmltYXJ5LmNoYXJDb2RlQXQoMikgPD0gMTIyKSB7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbGlkUHJpbWFyeUxhbmdzW3ByaW1hcnkuY2hhckNvZGVBdCgwKS05N10uaW5jbHVkZXMocHJpbWFyeSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBtYXRjaFByaW1hcnlMYW5nKGxhbmcxOiBzdHJpbmcsIGxhbmcyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgbGV0IHByaW1hcnkxID0gbGFuZzE7XG4gICAgICAgIGlmIChwcmltYXJ5MS5pbmNsdWRlcyhcIi1cIikpIHtcbiAgICAgICAgICAgIHByaW1hcnkxID0gcHJpbWFyeTEuc3BsaXQoXCItXCIpWzBdO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHByaW1hcnkyID0gbGFuZzI7XG4gICAgICAgIGlmIChwcmltYXJ5Mi5pbmNsdWRlcyhcIi1cIikpIHtcbiAgICAgICAgICAgIHByaW1hcnkyID0gcHJpbWFyeTIuc3BsaXQoXCItXCIpWzBdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHByaW1hcnkxLnRvTG93ZXJDYXNlKCkgPT09IHByaW1hcnkyLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMC0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgSU1hcHBlciwgSU1hcFJlc3VsdCwgQm91bmRzIH0gZnJvbSBcIi4uL2FwaS9JTWFwcGVyXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vZG9tL0RPTVdhbGtlclwiO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ29tbW9uTWFwcGVyIGltcGxlbWVudHMgSU1hcHBlciB7XG4gICAgYWJzdHJhY3QgZ2V0Um9sZShub2RlOiBOb2RlKSA6IHN0cmluZztcbiAgICBhYnN0cmFjdCBnZXROYW1lc3BhY2UoKSA6IHN0cmluZztcbiAgICBhYnN0cmFjdCBnZXRBdHRyaWJ1dGVzKG5vZGU6IE5vZGUpIDogeyBba2V5OnN0cmluZ106IHN0cmluZyB9O1xuXG4gICAgcHJvdGVjdGVkIGhpZXJhcmNoeVJvbGUgOiBzdHJpbmdbXSA9IG51bGw7XG4gICAgcHJvdGVjdGVkIGhpZXJhcmNoeVBhdGg6IEFycmF5PHtcbiAgICAgICAgcm9sZVBhdGg6IHN0cmluZyxcbiAgICAgICAgcm9sZUNvdW50OiB7XG4gICAgICAgICAgICBbcm9sZTogc3RyaW5nXTogbnVtYmVyXG4gICAgICAgIH1cbiAgICB9PiA9IG51bGw7XG4gICAgcHJvdGVjdGVkIGhpZXJhcmNoeVJlc3VsdHM6IElNYXBSZXN1bHRbXSA9IG51bGw7XG5cbiAgICBnZXRCb3VuZHMobm9kZTogTm9kZSkgOiBCb3VuZHMge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXNldChub2RlOiBOb2RlKSB7XG4gICAgICAgIHRoaXMuaGllcmFyY2h5Um9sZSA9IFtdO1xuICAgICAgICB0aGlzLmhpZXJhcmNoeVJlc3VsdHMgPSBbXTtcbiAgICAgICAgdGhpcy5oaWVyYXJjaHlQYXRoID0gW3tcbiAgICAgICAgICAgIHJvbGVQYXRoOiBcIlwiLFxuICAgICAgICAgICAgcm9sZUNvdW50OiB7fVxuICAgICAgICB9XTtcblxuICAgICAgICBsZXQgYW5jZXN0b3JzIDogTm9kZVtdID0gW107XG4gICAgICAgIGxldCBwYXJlbnQgPSBET01XYWxrZXIucGFyZW50Tm9kZShub2RlKTtcbiAgICAgICAgd2hpbGUgKHBhcmVudCAmJiBwYXJlbnQubm9kZVR5cGUgIT0gOSAvKiBOb2RlLkRPQ1VNRU5UX05PREUgKi8pIHtcbiAgICAgICAgICAgIGFuY2VzdG9ycy5wdXNoKHBhcmVudCk7XG4gICAgICAgICAgICBwYXJlbnQgPSBET01XYWxrZXIucGFyZW50Tm9kZShwYXJlbnQpO1xuICAgICAgICB9XG4gICAgICAgIGFuY2VzdG9ycyA9IGFuY2VzdG9ycy5yZXZlcnNlKCk7XG4gICAgICAgIGZvciAoY29uc3QgYW5jZXN0b3Igb2YgYW5jZXN0b3JzKSB7XG4gICAgICAgICAgICBsZXQgc2libGluZ3MgPSBbXTtcbiAgICAgICAgICAgIGxldCBzaWJsaW5nID0gYW5jZXN0b3IucHJldmlvdXNTaWJsaW5nO1xuICAgICAgICAgICAgd2hpbGUgKHNpYmxpbmcpIHtcbiAgICAgICAgICAgICAgICBzaWJsaW5ncy5wdXNoKHNpYmxpbmcpO1xuICAgICAgICAgICAgICAgIHNpYmxpbmcgPSBzaWJsaW5nLnByZXZpb3VzU2libGluZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNpYmxpbmdzID0gc2libGluZ3MucmV2ZXJzZSgpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBzaWJsaW5nIG9mIHNpYmxpbmdzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wdXNoSGllcmFyY2h5KHNpYmxpbmcpO1xuICAgICAgICAgICAgICAgIHRoaXMucG9wSGllcmFyY2h5KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnB1c2hIaWVyYXJjaHkoYW5jZXN0b3IpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHB1c2hIaWVyYXJjaHkobm9kZTogTm9kZSkge1xuICAgICAgICBsZXQgcm9sZSA6IHN0cmluZyA9IHRoaXMuZ2V0Um9sZShub2RlKSB8fCBudWxsO1xuICAgICAgICB0aGlzLmhpZXJhcmNoeVJvbGUucHVzaChyb2xlKTtcbiAgICAgICAgaWYgKHJvbGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGxldCBwYXJlbnRQYXRoSW5mbyA9IHRoaXMuaGllcmFyY2h5UGF0aFt0aGlzLmhpZXJhcmNoeVBhdGgubGVuZ3RoLTFdO1xuICAgICAgICAgICAgcGFyZW50UGF0aEluZm8ucm9sZUNvdW50W3JvbGVdID0gKHBhcmVudFBhdGhJbmZvLnJvbGVDb3VudFtyb2xlXSB8fCAwKSArIDE7IFxuICAgICAgICAgICAgdGhpcy5oaWVyYXJjaHlQYXRoLnB1c2goe1xuICAgICAgICAgICAgICAgIFwicm9sZVBhdGhcIjogcGFyZW50UGF0aEluZm8ucm9sZVBhdGgrXCIvXCIrcm9sZStcIltcIitwYXJlbnRQYXRoSW5mby5yb2xlQ291bnRbcm9sZV0rXCJdXCIsXG4gICAgICAgICAgICAgICAgXCJyb2xlQ291bnRcIjoge31cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGF0dHIgPSB7fVxuICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgYXR0ciA9IHRoaXMuZ2V0QXR0cmlidXRlcyhub2RlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmhpZXJhcmNoeVJlc3VsdHMucHVzaCh7XG4gICAgICAgICAgICBub2RlOiBub2RlLFxuICAgICAgICAgICAgbmFtZXNwYWNlOiB0aGlzLmdldE5hbWVzcGFjZSgpLFxuICAgICAgICAgICAgcm9sZTogcm9sZSxcbiAgICAgICAgICAgIGF0dHJpYnV0ZXM6IGF0dHIsXG4gICAgICAgICAgICByb2xlUGF0aDogdGhpcy5oaWVyYXJjaHlQYXRoW3RoaXMuaGllcmFyY2h5UGF0aC5sZW5ndGgtMV0ucm9sZVBhdGgsXG4gICAgICAgICAgICBib3VuZHM6IHRoaXMuZ2V0Qm91bmRzKG5vZGUpXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIHBvcEhpZXJhcmNoeSgpIHtcbiAgICAgICAgbGV0IHJvbGUgPSB0aGlzLmhpZXJhcmNoeVJvbGUucG9wKCk7XG4gICAgICAgIGlmIChyb2xlICE9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmhpZXJhcmNoeVBhdGgucG9wKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5oaWVyYXJjaHlSZXN1bHRzLnBvcCgpO1xuICAgIH1cblxuICAgIG9wZW5TY29wZShub2RlOiBOb2RlKTogSU1hcFJlc3VsdFtdIHtcbiAgICAgICAgaWYgKHRoaXMuaGllcmFyY2h5Um9sZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy5yZXNldChub2RlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnB1c2hIaWVyYXJjaHkobm9kZSlcblxuICAgICAgICByZXR1cm4gdGhpcy5oaWVyYXJjaHlSZXN1bHRzO1xuICAgIH1cblxuICAgIGNsb3NlU2NvcGUobm9kZTogTm9kZSk6IElNYXBSZXN1bHRbXSB7XG4gICAgICAgIGxldCByZXRWYWwgOiBJTWFwUmVzdWx0W10gPSBbXTtcbiAgICAgICAgZm9yIChjb25zdCByZXMgb2YgdGhpcy5oaWVyYXJjaHlSZXN1bHRzKSB7XG4gICAgICAgICAgICAvLyBjb25zdCB0ZW1wID0gcmVzLm5vZGU7XG4gICAgICAgICAgICAvLyByZXMubm9kZSA9IG51bGw7XG4gICAgICAgICAgICAvLyBsZXQgY2xvbmVkID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShyZXMpKTtcbiAgICAgICAgICAgIC8vIGNsb25lZC5ub2RlID0gcmVzLm5vZGUgPSB0ZW1wOyBcbiAgICAgICAgICAgIC8vIHJldFZhbC5wdXNoKGNsb25lZCk7XG4gICAgICAgICAgICByZXRWYWwucHVzaChyZXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldFZhbFtyZXRWYWwubGVuZ3RoLTFdLnJvbGUgPSBcIi9cIityZXRWYWxbcmV0VmFsLmxlbmd0aC0xXS5yb2xlXG4gICAgICAgIHRoaXMucG9wSGllcmFyY2h5KCk7XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBJTWFwUmVzdWx0IH0gZnJvbSBcIi4uL2FwaS9JTWFwcGVyXCI7XG5pbXBvcnQgeyBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSUVuZ2luZVwiO1xuXG4vLyBDb250ZXh0IHRoYXQgd2lsbCBjYXVzZSB0aGlzIHJ1bGUgdG8gZXhlY3V0ZS4gXG4vLyBDb250ZXh0IHN5bnRheDpcbi8vICAgVHJpZ2dlcnM6XG4vLyAgICAgYXJpYTpyb2xlIC0gVHJpZ2dlcnMgb24gZWxlbWVudCB3aXRoIEFSSUEgcm9sZSByb2xlXG4vLyAgICAgYXJpYTpyb2xlW2F0dHJpYnV0ZV0gLSBUcmlnZ2VycyBvbiBlbGVtZW50cyB3aXRoIHRoZSBlcXVpdmFsZW50IGxvZ2ljYWwgXG4vLyAgICAgICBhcmlhLSBhdHRyaWJ1dGUgKGUuZy4sIGJ1dHRvbltkaXNhYmxlZF0gd2lsbCB0cmlnZ2VyIG9uIFxuLy8gICAgICAgPGJ1dHRvbiBkaXNhYmxlZD4gb3IgPGRpdiByb2xlPVwiYnV0dG9uXCIgYXJpYS1kaXNhYmxlZD1cInRydWVcIj4pXG4vLyAgICAgcm9sZVthdHRyaWJ1dGU9dmFsdWVdIC0gU2ltaWxhciB0byBhYm92ZSwgd2l0aCBjYXNlLXNlbnNpdGl2ZSBtYXRjaFxuLy8gICAgICAgdG8gdmFsdWVcbi8vICAgICByb2xlW2F0dHJpYnV0ZX52YWx1ZV0gLSBTaW1pbGFyIHRvIGFib3ZlLCB3aXRoIGNhc2UtaW5zZW5zaXRpdmUgbWF0Y2hcbi8vICAgICBkb206ZWxlbWVudCAtIFRyaWdnZXJzIG9uIGFuIGVsZW1lbnQgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWVcbi8vICAgICBkb206ZWxlbWVudFthdHRyaWJ1dGVdIC0gVHJpZ2dlcnMgb24gYSBkb20gZWxlbWVudCB3aXRoIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlXG4vLyAgICAgZG9tOipbYXR0cmlidXRlXSAtIFRyaWdnZXJzIG9uIGFsbCBlbGVtZW50cyB3aXRoIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlXG4vLyAgIENvbWJpbmluZyB0cmlnZ2Vyczpcbi8vICAgICB0cmlnZ2VyMSB0cmlnZ2VyMiAtIFRyaWdnZXJzIG9uIGVsZW1lbnRzIHdpdGggdHJpZ2dlcjIgd2l0aGluIGFuIFxuLy8gICAgICAgZWxlbWVudCB3aXRoIHRyaWdnZXIxXG4vLyAgICAgIXRyaWdnZXIxIHRyaWdnZXIyIC0gVHJpZ2dlcnMgb24gZWxlbWVudHMgd2l0aCB0cmlnZ2VyMiBub3Qgd2l0aGluXG4vLyAgICAgICBlbGVtZW50IHdpdGggdHJpZ2dlcjFcbi8vICAgICB0cmlnZ2VyMT50cmlnZ2VyMiAtIFRyaWdnZXJzIG9uIGVsZW1lbnRzIHdpdGggdHJpZ2dlcjIgd2l0aCBhblxuLy8gICAgICAgYW4gaW1tZWRpYXRlIHBhcmVudCB3aXRoIHRyaWdnZXIxXG4vLyAgICAgdHJpZ2dlcjErdHJpZ2dlcjIgLSBUcmlnZ2VycyBvbiBlbGVtZW50cyB3aXRoIHRyaWdnZXIyIHdpdGggYW5cbi8vICAgICAgIGltbWVkaWF0ZSBwcmV2aW91cyBzaWJsaW5nIHdpdGggdHJpZ2dlcjFcbi8vICAgICB0cmlnZ2VyMX50cmlnZ2VyMiAtIFRyaWdnZXJzIG9uIGVsZW1lbnRzIHdpdGggdHJpZ2dlcjIgd2l0aCBhblxuLy8gICAgICAgc29tZSBlYXJsaWVyIHNpYmxpbmcgd2l0aCB0cmlnZ2VyMVxuLy8gICAgIGNvbnRleHQsY29udGV4dCAtIFRyaWdnZXJzIG9uIGVsZW1lbnRzIHdpdGggZWl0aGVyIGNvbnRleHRcbmV4cG9ydCBjbGFzcyBBdHRySW5mbyB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBpbmNsdXNpdmU6IGJvb2xlYW4sXG4gICAgICAgIHB1YmxpYyBhdHRyOiBzdHJpbmcsXG4gICAgICAgIHB1YmxpYyBlcT86IHN0cmluZyxcbiAgICAgICAgcHVibGljIHZhbHVlPzogc3RyaW5nXG4gICAgKSB7XG4gICAgICAgIGlmICghaW5jbHVzaXZlIFxuICAgICAgICAgICAgICAgICYmICgodHlwZW9mIGVxKSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBlcS5sZW5ndGggPiAwKSlcbiAgICAgICAge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGhhdmUgIWF0dHJcIitlcStcIiBjb250ZXh0XCIpOyAgICBcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5jbHVzaXZlICYmICh0eXBlb2YgZXEpICE9PSBcInVuZGVmaW5lZFwiICYmIGVxLmxlbmd0aCA+IDAgJiYgKCh0eXBlb2YgdmFsdWUpID09PSBcInVuZGVmaW5lZFwiIHx8IHZhbHVlLmxlbmd0aCA9PT0gMCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBoYXZlIGVxdWl2YWxlbmNlIGNoZWNrIHdpdGhvdXQgYSB2YWx1ZVwiKTsgICAgXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgbWF0Y2hlcyhjb250ZXh0OiBJTWFwUmVzdWx0KSB7XG4gICAgICAgIGNvbnN0IHJ1bGVBdHRyUGFydCA9IHRoaXM7IFxuICAgICAgICBjb25zdCBlbGVtQXR0cnMgPSBjb250ZXh0LmF0dHJpYnV0ZXM7XG4gICAgICAgIGlmICghKHJ1bGVBdHRyUGFydC5hdHRyIGluIGVsZW1BdHRycykpIHtcbiAgICAgICAgICAgIHJldHVybiAhcnVsZUF0dHJQYXJ0LmluY2x1c2l2ZVxuICAgICAgICB9IGVsc2UgaWYgKCFydWxlQXR0clBhcnQuaW5jbHVzaXZlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0gZWxzZSBpZiAoIXJ1bGVBdHRyUGFydC5lcSkge1xuICAgICAgICAgICAgLy8gaW5jbHVzaXZlIG1hdGNoIGFuZCBJIGhhdmUgdGhhdCBhdHRyaWJ1dGUgYW5kIG5vIGVxdWl2YWxlbmNlIGRlZmluZWRcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gaW5jbHVzaXZlIG1hdGNoIGFuZCBJIGhhdmUgdGhhdCBhdHRyaWJ1dGUgYW5kIGVxdWl2YWxlbmNlIGRlZmluZWRcbiAgICAgICAgICAgIGNvbnN0IGF0dHJWYWx1ZSA9IGVsZW1BdHRyc1tydWxlQXR0clBhcnQuYXR0cl07XG4gICAgICAgICAgICBpZiAocnVsZUF0dHJQYXJ0LmVxID09PSBcIj1cIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBydWxlQXR0clBhcnQudmFsdWUgPT09IGF0dHJWYWx1ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAocnVsZUF0dHJQYXJ0LmVxID09PSBcIiE9XCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcnVsZUF0dHJQYXJ0LnZhbHVlICE9PSBhdHRyVmFsdWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJ1bGVBdHRyUGFydC5lcSA9PT0gXCJ+XCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcnVsZUF0dHJQYXJ0LnZhbHVlID09PSBhdHRyVmFsdWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJ1bGVBdHRyUGFydC5lcSA9PT0gXCIhflwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJ1bGVBdHRyUGFydC52YWx1ZSAhPT0gYXR0clZhbHVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb250ZXh0IGVxdWl2YWxlbmNlIG9wZXJhdG9yIG5vdCBzdXBwb3J0ZWRcIilcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFBhcnRJbmZvIHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHVibGljIGluY2x1c2l2ZTogYm9vbGVhbiwgXG4gICAgICAgIHB1YmxpYyBuYW1lc3BhY2U6IHN0cmluZyxcbiAgICAgICAgcHVibGljIHJvbGU6IHN0cmluZywgXG4gICAgICAgIHB1YmxpYyBhdHRyczogQXR0ckluZm9bXSwgXG4gICAgICAgIHB1YmxpYyBjb25uZWN0b3I6IHN0cmluZykge1xuICAgICAgICAgICAgaWYgKHJvbGUgPT09IFwiKlwiICYmICFpbmNsdXNpdmUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCIhKiBjb250ZXh0IG5vdCBzdXBwb3J0ZWRcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgIHB1YmxpYyBtYXRjaGVzKCBcbiAgICAgICAgY29udGV4dEhpZXI6IFJ1bGVDb250ZXh0SGllcmFyY2h5LFxuICAgICAgICBoaWVyTGV2ZWw6IG51bWJlcikgOiBib29sZWFuIFxuICAgIHtcbiAgICAgICAgY29uc3QgcnVsZVBhcnQgPSB0aGlzO1xuICAgICAgICBsZXQgcnVsZVJvbGVNYXRjaCA9IChydWxlUGFydC5uYW1lc3BhY2UgaW4gY29udGV4dEhpZXIpICYmIGNvbnRleHRIaWVyW3J1bGVQYXJ0Lm5hbWVzcGFjZV1baGllckxldmVsXVxuICAgICAgICAgICAgJiYgKGNvbnRleHRIaWVyW3J1bGVQYXJ0Lm5hbWVzcGFjZV1baGllckxldmVsXS5yb2xlID09PSBydWxlUGFydC5yb2xlXG4gICAgICAgICAgICAgICAgfHwgY29udGV4dEhpZXJbcnVsZVBhcnQubmFtZXNwYWNlXVtoaWVyTGV2ZWxdLnJvbGUgIT09IFwibm9uZVwiICYmIHJ1bGVQYXJ0LnJvbGUgPT09IFwiKlwiKTtcbiAgICAgICAgaWYgKHJ1bGVSb2xlTWF0Y2ggXG4gICAgICAgICAgICAmJiBydWxlUGFydC5yb2xlID09PSBcIipcIiBcbiAgICAgICAgICAgICYmIHJ1bGVQYXJ0Lm5hbWVzcGFjZSA9PT0gXCJkb21cIiBcbiAgICAgICAgICAgICYmIChjb250ZXh0SGllcltydWxlUGFydC5uYW1lc3BhY2VdW2hpZXJMZXZlbF0ucm9sZSA9PT0gXCIjdGV4dFwiXG4gICAgICAgICAgICAgICAgfHwgY29udGV4dEhpZXJbcnVsZVBhcnQubmFtZXNwYWNlXVtoaWVyTGV2ZWxdLnJvbGUgPT09IFwiLyN0ZXh0XCIpKSB7XG4gICAgICAgICAgICBydWxlUm9sZU1hdGNoID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJ1bGVQYXJ0LmluY2x1c2l2ZSAmJiAhcnVsZVJvbGVNYXRjaCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoIXJ1bGVQYXJ0LmluY2x1c2l2ZSAmJiAhcnVsZVJvbGVNYXRjaCkgcmV0dXJuIHRydWU7XG5cbiAgICAgICAgLy8gTWF0Y2ggdGhlIGF0dHJpYnV0ZXNcbiAgICAgICAgY29uc3QgcnVsZUF0dHJzID0gcnVsZVBhcnQuYXR0cnM7XG4gICAgICAgIGNvbnN0IGVsZW1Db250ZXh0ID0gY29udGV4dEhpZXJbcnVsZVBhcnQubmFtZXNwYWNlXVtoaWVyTGV2ZWxdO1xuICAgICAgICBsZXQgbWF0Y2ggPSB0cnVlO1xuICAgICAgICBmb3IgKGNvbnN0IHJ1bGVBdHRyUGFydCBvZiBydWxlQXR0cnMpIHtcbiAgICAgICAgICAgIG1hdGNoID0gbWF0Y2ggJiYgcnVsZUF0dHJQYXJ0Lm1hdGNoZXMoZWxlbUNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcnVsZVBhcnQuaW5jbHVzaXZlKSBtYXRjaCA9ICFtYXRjaDtcbiAgICAgICAgcmV0dXJuIG1hdGNoO1xuICAgIH1cblxufVxuXG5leHBvcnQgY2xhc3MgQ29udGV4dCB7XG4gICAgY29udGV4dEluZm8gOiBQYXJ0SW5mb1tdID0gW11cblxuICAgIGNvbnN0cnVjdG9yKGNvbnRleHQ6IHN0cmluZykge1xuICAgICAgICBsZXQgY29udGV4dEhpZXJNYXRjaGVzIDogc3RyaW5nW10gPSBjb250ZXh0Lm1hdGNoKC8hP1svYS16QS1aOjAtOSpcXC1fXSsoXFxbW15cXF1dK1xcXSkqWyA+K35dPy9nKTtcbiAgICAgICAgbGV0IHJlc3VsdHMgOiBQYXJ0SW5mb1tdID0gW11cbiAgICAgICAgZm9yIChjb25zdCBwYXJ0IG9mIGNvbnRleHRIaWVyTWF0Y2hlcykge1xuICAgICAgICAgICAgbGV0IHBhcnRzID0gcGFydC5tYXRjaCgvKCE/KShbL2EtekEtWjowLTkqXFwtX10rKSgoXFxbW15cXF1dK1xcXSkqKShbID4rfl0/KS8pO1xuICAgICAgICAgICAgbGV0IGF0dHJJbmZvIDogQXR0ckluZm9bXSA9IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBhdHRyUGFydCBvZiBwYXJ0c1szXS5tYXRjaCgvXFxbKFteXFxdXSspXFxdL2cpIHx8IFtdKSB7XG4gICAgICAgICAgICAgICAgbGV0IGF0dHJQYXJ0cyA9IGF0dHJQYXJ0Lm1hdGNoKC9cXFsoIT8pKFthLXo6QS1aKlxcLV9dKykoIT9bPX5dKT8oW15cXF1dKyk/XFxdLyk7XG4gICAgICAgICAgICAgICAgYXR0ckluZm8ucHVzaChuZXcgQXR0ckluZm8oXG4gICAgICAgICAgICAgICAgICAgIGF0dHJQYXJ0c1sxXSAhPT0gXCIhXCIsXG4gICAgICAgICAgICAgICAgICAgIGF0dHJQYXJ0c1syXS50b0xvd2VyQ2FzZSgpLFxuICAgICAgICAgICAgICAgICAgICBhdHRyUGFydHNbM10sXG4gICAgICAgICAgICAgICAgICAgIGF0dHJQYXJ0c1s0XVxuICAgICAgICAgICAgICAgICkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGFydHNbMl0gPSBwYXJ0c1syXS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgY29uc3QgbnNQYXJ0cyA9IHBhcnRzWzJdLnNwbGl0KFwiOlwiKTtcbiAgICAgICAgICAgIGxldCBpbmNsID0gcGFydHNbMV0gIT09IFwiIVwiO1xuICAgICAgICAgICAgY29uc3QgbnMgPSBuc1BhcnRzLnNoaWZ0KCk7XG4gICAgICAgICAgICBsZXQgcm9sZSA9IG5zUGFydHMuam9pbihcIjpcIik7XG4gICAgICAgICAgICBsZXQgcGFydEluZm8gPSBuZXcgUGFydEluZm8oaW5jbCwgbnMsIHJvbGUsIGF0dHJJbmZvLCBwYXJ0c1twYXJ0cy5sZW5ndGgtMV0pO1xuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHBhcnRJbmZvKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNvbnRleHRJbmZvID0gcmVzdWx0cztcbiAgICB9XG5cbiAgICBzdGF0aWMgY2xlYW5Db250ZXh0KGNvbnRleHQ6IHN0cmluZykgOiBzdHJpbmcge1xuICAgICAgICBjb250ZXh0ID0gY29udGV4dC50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcbiAgICAgICAgY29udGV4dCA9IGNvbnRleHQucmVwbGFjZSgvICshL2csIFwiICFcIik7XG4gICAgICAgIGNvbnRleHQgPSBjb250ZXh0LnJlcGxhY2UoLyArKFs+K34sXSkvZywgXCIkMVwiKTtcbiAgICAgICAgY29udGV4dCA9IGNvbnRleHQucmVwbGFjZSgvKFs+K34sXSkgKy9nLCBcIiQxXCIpO1xuICAgICAgICBjb250ZXh0ID0gY29udGV4dC5yZXBsYWNlKC8gKy9nLCBcIiBcIik7XG4gICAgICAgIHJldHVybiBjb250ZXh0LnRyaW0oKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgcGFyc2UoY29udGV4dDogc3RyaW5nKSB7XG4gICAgICAgIGxldCBjb250ZXh0cyA9IENvbnRleHQuc3BsaXRNdWx0aXBsZShDb250ZXh0LmNsZWFuQ29udGV4dChjb250ZXh0KSk7XG5cbiAgICAgICAgbGV0IHJldFZhbCA6IENvbnRleHRbXSA9IFtdO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29udGV4dHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGxldCBjdHggPSBuZXcgQ29udGV4dChjb250ZXh0c1tpXSk7XG4gICAgICAgICAgICByZXRWYWwucHVzaChjdHgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogSGFuZGxlcyBpbml0aWFsIHByb2Nlc3Npbmcgb2Ygc3BsaXR0aW5nIG9uIGNvbW1hIC0gY29udGV4dCxjb250ZXh0XG4gICAgICogQHBhcmFtIGNvbnRleHQgXG4gICAgICovXG4gICAgc3RhdGljIHNwbGl0TXVsdGlwbGUoY29udGV4dDogc3RyaW5nKSA6IHN0cmluZ1tdIHtcbiAgICAgICAgbGV0IGNvbnRleHRzID0gW107XG4gICAgICAgIGlmIChjb250ZXh0KSB7XG4gICAgICAgICAgICBpZiAoY29udGV4dC5pbmRleE9mKFwiLFwiKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0cy5wdXNoKGNvbnRleHQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGMgb2YgY29udGV4dC5zcGxpdChcIixcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dHMucHVzaChjKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbnRleHRzO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgIENvcHlyaWdodDo6IDIwMjAtIElCTSwgSW5jXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi9kb20vRE9NV2Fsa2VyXCI7XG5pbXBvcnQgeyBDb250ZXh0IH0gZnJvbSBcIi4vQ29udGV4dFwiO1xuaW1wb3J0IHsgQ29uZmlnIH0gZnJvbSBcIi4uL2NvbmZpZy9Db25maWdcIjtcbmltcG9ydCB7IERPTU1hcHBlciB9IGZyb20gXCIuLi9kb20vRE9NTWFwcGVyXCI7XG5pbXBvcnQgeyBET01VdGlsIH0gZnJvbSBcIi4uL2RvbS9ET01VdGlsXCI7XG5pbXBvcnQgeyBDYWNoZVV0aWwgfSBmcm9tIFwiLi4vLi4vdjQvdXRpbC9DYWNoZVV0aWxcIjtcbmltcG9ydCB7IElzc3VlLCBSdWxlLCBSdWxlQ29udGV4dCwgUnVsZUNvbnRleHRIaWVyYXJjaHksIFJ1bGVSZXN1bHQsIGVSdWxlQ29uZmlkZW5jZSB9IGZyb20gXCIuLi8uLi92NC9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEhlbHBNYXAsIElFbmdpbmUsIE5sc01hcCB9IGZyb20gXCIuLi8uLi92NC9hcGkvSUVuZ2luZVwiO1xuaW1wb3J0IHsgSU1hcHBlciB9IGZyb20gXCIuLi8uLi92NC9hcGkvSU1hcHBlclwiO1xuaW1wb3J0IHsgUmVwb3J0IH0gZnJvbSBcIi4uLy4uL3Y0L2FwaS9JUmVwb3J0XCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3Y0L3V0aWwvVmlzVXRpbFwiO1xuXG5jbGFzcyBXcmFwcGVkUnVsZSB7XG4gICAgbnM6IHN0cmluZztcbiAgICBpZHg/OiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3RvciAocHVibGljIHJ1bGU6IFJ1bGUsIHB1YmxpYyBwYXJzZWRJbmZvIDogQ29udGV4dCkge1xuICAgICAgICB0aGlzLm5zID0gdGhpcy5wYXJzZWRJbmZvLmNvbnRleHRJbmZvW3RoaXMucGFyc2VkSW5mby5jb250ZXh0SW5mby5sZW5ndGgtMV0ubmFtZXNwYWNlO1xuICAgICAgICBDb25maWcuREVCVUcgJiYgY29uc29sZS5sb2coXCJBZGRlZCBSdWxlOlwiLCBydWxlLmlkLCBKU09OLnN0cmluZ2lmeSh0aGlzLnBhcnNlZEluZm8pKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGNvbnZlcnRpbmcgdGhlIG5vZGUgaW50byBhIHNuaXBwZXQgd2hpY2ggY2FuIGJlIGFkZGVkIHRvIHJlcG9ydC5cbiAgICAgKlxuICAgICAqIE5vdGU6IFRoaXMgZnVuY3Rpb24gd2lsbCB0YWtlIHRoZSBub2RlIGFuZCBleHRyYWN0IHRoZSBub2RlIG5hbWUgYW5kIHRoZSBhdHRyaWJ1dGVzIGFuZCBidWlsZCB0aGUgc25pcHBldCBiYXNlZCBvbiB0aGlzLlxuICAgICAqXG4gICAgICogVE9ETzogRnV0dXJlLCBtYXliZSB3ZSBjYW4gZXh0cmFjdCBtb3JlIHRoZW4ganVzdCBzaW5nbGUgbGluZSwgYWRkIG1vcmUgaW5mbyBvciBldmVuIGFkZCBjbG9zaW5nIHRhZ3MgZXRjLi4uXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBub2RlIC0gVGhlIGh0bWwgZWxlbWVudCB0byBjb252ZXJ0IGludG8gZWxlbWVudCBzbmlwcGV0IHdpdGggbm9kZSBuYW1lIGFuZCBhdHRyaWJ1dGVzIG9ubHkuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IG5vZGVTbmlwcGV0IC0gcmV0dXJuIHRoZSBlbGVtZW50IHNuaXBwZXQgb2YgdGhlIGVsZW1lbnQgdGhhdCB3YXMgcHJvdmlkZWQgd2hpY2ggb25seSBjb250YWlucyxcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZW5hbWUgYW5kIGF0dHJpYnV0ZXMuIGkuZS4gPHRhYmxlIGlkPVxcXCJsYXlvdXRfdGFibGUxXFxcIiByb2xlPVxcXCJwcmVzZW50YXRpb25cXFwiPlxuICAgICAqXG4gICAgICogQG1lbWJlck9mIHRoaXNcbiAgICAgKi9cbiAgICBzdGF0aWMgY29udmVydE5vZGVUb1NuaXBwZXQobm9kZSA6IEVsZW1lbnQpIHtcbiAgICAgICAgLy8gVmFyaWFibGUgRGVjbGVyYXRpb25cbiAgICAgICAgdmFyIG5vZGVTbmlwcGV0ID0gJyc7XG5cbiAgICAgICAgLy8gRXh0cmFjdCB0aGUgbm9kZSBuYW1lIGFuZCBhZGQgaXQgdG8gdGhlIG5vZGUgc25pcHBldFxuICAgICAgICBub2RlU25pcHBldCArPSAnPCcgKyBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgLy8gRXh0cmFjdCBhbGwgdGhlIG5vZGUgYXR0cmlidXRlcyBhcyBhbiBhcnJheVxuICAgICAgICB2YXIgbm9kZUF0dHJpYnV0ZXMgPSBub2RlLmF0dHJpYnV0ZXM7XG5cbiAgICAgICAgLy8gSW4gdGhlIGNhc2UgdGhlcmUgYXJlIGF0dHJpYnV0ZXMgb24gdGhpcyBub2RlXG4gICAgICAgIGlmIChub2RlQXR0cmlidXRlcyAhPT0gbnVsbCAmJiB0eXBlb2Ygbm9kZUF0dHJpYnV0ZXMgIT09ICd1bmRlZmluZWQnKSB7XG5cbiAgICAgICAgICAgIC8vIExvb3Agb3ZlciBhbGwgdGhlc2VzIGF0dHJpYnV0ZXMgYW5kIGFkZCB0aGUgbmFtZSBhbmQgdmFsdWUgdG8gdGhlIG5vZGVTbmlwcGV0IHdoaWNoIHdpbGwgYmUgcmV0dXJuZWRcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSBub2RlQXR0cmlidXRlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgICAgIGlmIChub2RlQXR0cmlidXRlc1tpXS5uYW1lID09PSBcImRhdGEtbmFtZXdhbGtcIikgY29udGludWU7XG4gICAgICAgICAgICAgICAgLy8gQWRkIHRoZSBhdHRyaWJ1dGUgbmFtZSBhbmQgdmFsdWUuXG4gICAgICAgICAgICAgICAgbm9kZVNuaXBwZXQgKz0gJyAnICsgbm9kZUF0dHJpYnV0ZXNbaV0ubmFtZSArICc9XCInICsgbm9kZUF0dHJpYnV0ZXNbaV0udmFsdWUgKyAnXCInO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2xvc2UgdGhlIG5vZGVcbiAgICAgICAgbm9kZVNuaXBwZXQgKz0gJz4nO1xuXG4gICAgICAgIC8vIFJldHVybiB0aGUgbm9kZSBzbmlwcGV0XG4gICAgICAgIHJldHVybiBub2RlU25pcHBldDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBmaW5kaW5nIHRoZSBzb3VyY2UgbG9jYXRpb24gZm9yIGEgbm9kZSwgd2hpY2ggY2FuIGJlIGFkZGVkIHRvIGEgcmVwb3J0LlxuICAgICAqIFN1cHBvcnRzIGRlYnVnIGRpcmVjdGl2ZXMgaW4gdGhlIGZvbGxvd2luZyBmb3JtczpcbiAgICAgKiAgIDEuIEFuIGF0dHJpYnV0ZSBvbiB0aGUgZWxlbWVudCBpdHNlbGY6XG4gICAgICogICAgICAgIGlibS1hMTF5LWRlYnVnPVwiZmlsZS50czoxMDo1XCJcbiAgICAgKiAgIDIuIEEgY29tbWVudCBub2RlIHByZWNlZGluZyB0aGUgZWxlbWVudCAoYXMgYSBzaWJsaW5nIG9yIGFuY2VzdG9yIHNpYmxpbmcpOlxuICAgICAqICAgICAgICA8IS0tIGlibS1hMTF5LWRlYnVnOiBmaWxlLnRzOjEwOjUgLS0+XG4gICAgICogICAzLiBBIHdyYXBwZXIgZWxlbWVudCAoZS5nLiBkaXYpIHdob3NlIGZpcnN0IG5vbi13aGl0ZXNwYWNlIGNoaWxkIGlzIHN1Y2ggYSBjb21tZW50IG5vZGUuXG4gICAgICogICA0LiBBbiBhbmNlc3RvciBlbGVtZW50IHRoYXQgY2FycmllcyB0aGUgaWJtLWExMXktZGVidWcgYXR0cmlidXRlLlxuICAgICAqXG4gICAgICogVHJhdmVyc2FsOiBjaGVja3MgdGhlIG5vZGUgaXRzZWxmIGZvciBhbiBpbmxpbmUgYXR0cmlidXRlLCB0aGVuIHNjYW5zIHByZXZpb3VzIHNpYmxpbmdzIGF0XG4gICAgICogZWFjaCBhbmNlc3RvciBsZXZlbCB1cHdhcmQgKGFsc28gY2hlY2tpbmcgZWFjaCBhbmNlc3RvciBlbGVtZW50J3Mgb3duIGlubGluZSBhdHRyaWJ1dGUpLFxuICAgICAqIHN0b3BwaW5nIGlmIGEgYmxhbmsgb3IgJ2VuZCcgbWFya2VyIGlzIGZvdW5kLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtOb2RlfSBub2RlIC0gVGhlIERPTSBub2RlIHRvIGZpbmQgc291cmNlIGluZm8gZm9yXG4gICAgICogQHJldHVybiB7c3RyaW5nIHwgbnVsbH0gLSBUaGUgc291cmNlIGxvY2F0aW9uIHN0cmluZywgb3IgbnVsbCBpZiBub3QgZm91bmRcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiB0aGlzXG4gICAgICovXG4gICAgc3RhdGljIGNvbnZlcnROb2RlVG9Tb3VyY2Uobm9kZTogTm9kZSwgZW5hYmxlZDogYm9vbGVhbj1mYWxzZSk6IHN0cmluZyB7XG4gICAgICAgIC8vY29uc29sZS5sb2coXCJTb3VyY2UgTWFwIGVuYWJsZWQ6XCIsIGVuYWJsZWQpO1xuICAgICAgICBpZiAoIWVuYWJsZWQgfHwgIW5vZGUpIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgREVCVUdfRElSRUNUSVZFID0gXCJpYm0tYTExeS1kZWJ1Z1wiO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUeXBlZCByZXN1bHQgZnJvbSBleHRyYWN0RGlyZWN0aXZlIHRvIGF2b2lkIHNlbnRpbmVsIHN0cmluZyBjb2xsaXNpb25zLlxuICAgICAgICAgKiAgIHsgZm91bmQ6IGZhbHNlIH0gICAgICAgICAgICDigJQgbm8gZGlyZWN0aXZlIG9uIHRoaXMgbm9kZVxuICAgICAgICAgKiAgIHsgZm91bmQ6IHRydWUsIHN0b3A6IHRydWUgfSDigJQgZGlyZWN0aXZlIGlzIGEgc2NvcGUtZW5kIG1hcmtlciAoYmxhbmsgb3IgJ2VuZCcpXG4gICAgICAgICAqICAgeyBmb3VuZDogdHJ1ZSwgc3RvcDogZmFsc2UsIHNvdXJjZTogc3RyaW5nIH0g4oCUIHZhbGlkIHNvdXJjZSBsb2NhdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgdHlwZSBEaXJlY3RpdmVSZXN1bHQgPVxuICAgICAgICAgICAgfCB7IGZvdW5kOiBmYWxzZSB9XG4gICAgICAgICAgICB8IHsgZm91bmQ6IHRydWU7IHN0b3A6IHRydWUgfVxuICAgICAgICAgICAgfCB7IGZvdW5kOiB0cnVlOyBzdG9wOiBmYWxzZTsgc291cmNlOiBzdHJpbmcgfTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogUGFyc2VzIGEgc291cmNlIHN0cmluZyBpbnRvIGEgRGlyZWN0aXZlUmVzdWx0LlxuICAgICAgICAgKiBUaGUgc291cmNlIGlzIHRoZSBmaW5hbCByZXNvbHZlZCB2YWx1ZSDigJQgYWZ0ZXIgYW55ICc6JyBzZXBhcmF0b3IgaGFzIGFscmVhZHkgYmVlbiBzdHJpcHBlZC5cbiAgICAgICAgICogQSBibGFuayB2YWx1ZSBvciB0aGUgZXhhY3Qgd29yZCAnZW5kJyAoY2FzZS1pbnNlbnNpdGl2ZSkgaXMgYSBzdG9wIG1hcmtlci5cbiAgICAgICAgICovXG4gICAgICAgIGNvbnN0IHBhcnNlU291cmNlID0gZnVuY3Rpb24gKHNvdXJjZTogc3RyaW5nKTogRGlyZWN0aXZlUmVzdWx0IHtcbiAgICAgICAgICAgIGlmICghc291cmNlIHx8IHNvdXJjZS50b0xvd2VyQ2FzZSgpID09PSAnZW5kJykge1xuICAgICAgICAgICAgICAgIHJldHVybiB7IGZvdW5kOiB0cnVlLCBzdG9wOiB0cnVlIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geyBmb3VuZDogdHJ1ZSwgc3RvcDogZmFsc2UsIHNvdXJjZSB9O1xuICAgICAgICB9O1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBFeHRyYWN0cyB0aGUgZGVidWctZGlyZWN0aXZlIGNvbW1lbnQgdmFsdWUgZnJvbSBhIG5vZGUuXG4gICAgICAgICAqIEhhbmRsZXM6XG4gICAgICAgICAqICAgLSBBIGNvbW1lbnQgbm9kZSBkaXJlY3RseVxuICAgICAgICAgKiAgIC0gQSB3cmFwcGVyIGVsZW1lbnQgKGUuZy4gPGRpdj4pIHdob3NlIGZpcnN0IG5vbi13aGl0ZXNwYWNlIGNoaWxkIGlzIGEgY29tbWVudCBub2RlXG4gICAgICAgICAqXG4gICAgICAgICAqIFJldHVybnMgeyBmb3VuZDogdHJ1ZSwgc3RvcDogdHJ1ZSB9IGlmIHRoZSBkaXJlY3RpdmUgaXMgYmxhbmsgb3IgZXhhY3RseSAnZW5kJyxcbiAgICAgICAgICogcmV0dXJucyB7IGZvdW5kOiB0cnVlLCBzdG9wOiBmYWxzZSwgc291cmNlIH0gaWYgYSB2YWxpZCBzb3VyY2UgaXMgZm91bmQsXG4gICAgICAgICAqIG9yIHJldHVybnMgeyBmb3VuZDogZmFsc2UgfSBpZiBubyBkaXJlY3RpdmUgaXMgcHJlc2VudCBvbiB0aGlzIG5vZGUuXG4gICAgICAgICAqL1xuICAgICAgICBjb25zdCBleHRyYWN0RGlyZWN0aXZlID0gZnVuY3Rpb24gKGVsZW06IE5vZGUgfCBudWxsKTogRGlyZWN0aXZlUmVzdWx0IHtcbiAgICAgICAgICAgIGlmICghZWxlbSkgcmV0dXJuIHsgZm91bmQ6IGZhbHNlIH07XG5cbiAgICAgICAgICAgIGxldCBjb21tZW50VmFsdWU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gICAgICAgICAgICBpZiAoZWxlbS5ub2RlVHlwZSA9PT0gTm9kZS5DT01NRU5UX05PREUpIHtcbiAgICAgICAgICAgICAgICAvLyBEaXJlY3QgY29tbWVudCBub2RlXG4gICAgICAgICAgICAgICAgY29tbWVudFZhbHVlID0gZWxlbS5ub2RlVmFsdWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW0ubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgLy8gRWxlbWVudCB3cmFwcGVyIChlLmcuIDxkaXY+PCEtLSBpYm0tYTExeS1kZWJ1ZzogLi4uIC0tPjwvZGl2PilcbiAgICAgICAgICAgICAgICAvLyBGaW5kIHRoZSBmaXJzdCBub24td2hpdGVzcGFjZSBjaGlsZCBub2RlXG4gICAgICAgICAgICAgICAgbGV0IGNoaWxkID0gZWxlbS5maXJzdENoaWxkO1xuICAgICAgICAgICAgICAgIHdoaWxlIChjaGlsZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIHB1cmUgd2hpdGVzcGFjZSB0ZXh0IG5vZGVzXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQubm9kZVZhbHVlICYmIGNoaWxkLm5vZGVWYWx1ZS50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vbi13aGl0ZXNwYWNlIHRleHQgYmVmb3JlIGEgY29tbWVudCDigJQgbm90IGEgZGlyZWN0aXZlIHdyYXBwZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGlsZC5ub2RlVHlwZSA9PT0gTm9kZS5DT01NRU5UX05PREUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnRWYWx1ZSA9IGNoaWxkLm5vZGVWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQW55IG90aGVyIG5vZGUgdHlwZSBiZWZvcmUgYSBjb21tZW50IOKAlCBub3QgYSBkaXJlY3RpdmUgd3JhcHBlclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2hpbGQgPSBjaGlsZC5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChjb21tZW50VmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0cmltbWVkID0gY29tbWVudFZhbHVlLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAvLyBNYXRjaCBleGFjdGx5IFwiaWJtLWExMXktZGVidWdcIiBmb2xsb3dlZCBieSBlbmQtb2Ytc3RyaW5nLCB3aGl0ZXNwYWNlLCBvciAnOidcbiAgICAgICAgICAgICAgICAvLyBUaGlzIHByZXZlbnRzIFwiaWJtLWExMXktZGVidWctZXh0cmFcIiBmcm9tIGJlaW5nIHRyZWF0ZWQgYXMgYSBkaXJlY3RpdmUuXG4gICAgICAgICAgICAgICAgaWYgKHRyaW1tZWQgPT09IERFQlVHX0RJUkVDVElWRSB8fFxuICAgICAgICAgICAgICAgICAgICB0cmltbWVkLnN0YXJ0c1dpdGgoREVCVUdfRElSRUNUSVZFICsgJzonKSB8fFxuICAgICAgICAgICAgICAgICAgICB0cmltbWVkLnN0YXJ0c1dpdGgoREVCVUdfRElSRUNUSVZFICsgJyAnKSB8fFxuICAgICAgICAgICAgICAgICAgICB0cmltbWVkLnN0YXJ0c1dpdGgoREVCVUdfRElSRUNUSVZFICsgJ1xcdCcpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFN0cmlwIHRoZSBkaXJlY3RpdmUgbmFtZSBhbmQgb3B0aW9uYWwgbGVhZGluZyB3aGl0ZXNwYWNlXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFmdGVyRGlyZWN0aXZlID0gdHJpbW1lZC5zdWJzdHJpbmcoREVCVUdfRElSRUNUSVZFLmxlbmd0aCkudHJpbVN0YXJ0KCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIFN0cmlwIGEgc2luZ2xlIGxlYWRpbmcgJzonIHNlcGFyYXRvciBpZiBwcmVzZW50XG4gICAgICAgICAgICAgICAgICAgIC8vIChlLmcuIFwiaWJtLWExMXktZGVidWc6IGZpbGUudHM6MTA6NVwiIOKGkiBhZnRlckRpcmVjdGl2ZSA9IFwiOiBmaWxlLnRzOjEwOjVcIilcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc291cmNlID0gYWZ0ZXJEaXJlY3RpdmUuc3RhcnRzV2l0aCgnOicpXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGFmdGVyRGlyZWN0aXZlLnN1YnN0cmluZygxKS50cmltKClcbiAgICAgICAgICAgICAgICAgICAgICAgIDogYWZ0ZXJEaXJlY3RpdmUudHJpbSgpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VTb3VyY2Uoc291cmNlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB7IGZvdW5kOiBmYWxzZSB9O1xuICAgICAgICB9O1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBSZXR1cm5zIHRoZSBpYm0tYTExeS1kZWJ1ZyBhdHRyaWJ1dGUgdmFsdWUgZnJvbSBhbiBlbGVtZW50IG5vZGUgYXMgYSBEaXJlY3RpdmVSZXN1bHQsXG4gICAgICAgICAqIG9yIHsgZm91bmQ6IGZhbHNlIH0gaWYgYWJzZW50LiBSZWNvZ25pc2VzIHRoZSAnZW5kJyBzdG9wIG1hcmtlciBqdXN0IGxpa2UgY29tbWVudCBkaXJlY3RpdmVzLlxuICAgICAgICAgKiBUaGUgYXR0cmlidXRlIHZhbHVlIGlzIHRoZSBzb3VyY2UgZGlyZWN0bHkgKG5vICc6JyBwcmVmaXgpLCBlLmcuIGlibS1hMTF5LWRlYnVnPVwiZmlsZS50czoxMDo1XCIuXG4gICAgICAgICAqL1xuICAgICAgICBjb25zdCBnZXRJbmxpbmVBdHRyID0gZnVuY3Rpb24gKG46IE5vZGUpOiBEaXJlY3RpdmVSZXN1bHQge1xuICAgICAgICAgICAgaWYgKG4ubm9kZVR5cGUgIT09IE5vZGUuRUxFTUVOVF9OT0RFKSByZXR1cm4geyBmb3VuZDogZmFsc2UgfTtcbiAgICAgICAgICAgIGNvbnN0IHZhbCA9IChuIGFzIEVsZW1lbnQpLmdldEF0dHJpYnV0ZShERUJVR19ESVJFQ1RJVkUpO1xuICAgICAgICAgICAgaWYgKHZhbCA9PT0gbnVsbCkgcmV0dXJuIHsgZm91bmQ6IGZhbHNlIH07XG4gICAgICAgICAgICAvLyBBdHRyaWJ1dGUgdmFsdWUgaXMgdGhlIHNvdXJjZSBkaXJlY3RseSDigJQgbm8gJzonIHNlcGFyYXRvciB0byBzdHJpcFxuICAgICAgICAgICAgcmV0dXJuIHBhcnNlU291cmNlKHZhbC50cmltKCkpO1xuICAgICAgICB9O1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBUcmF2ZXJzZXMgbGVmdCAocHJldmlvdXMgc2libGluZ3MpIHRoZW4gdXB3YXJkIChwYXJlbnQpIHRvIGZpbmQgc291cmNlIGluZm8uXG4gICAgICAgICAqIERvZXMgTk9UIGNoZWNrIHRoZSBzdGFydGluZyBlbGVtZW50IGl0c2VsZiDigJQgb25seSBpdHMgcHJlY2VkaW5nIHNpYmxpbmdzIGFuZCBhbmNlc3RvcnMuXG4gICAgICAgICAqIFRoaXMgYXZvaWRzIG1pc2lkZW50aWZ5aW5nIGEgY29udGVudCBub2RlIGFzIGl0cyBvd24gc291cmNlIGRpcmVjdGl2ZS5cbiAgICAgICAgICpcbiAgICAgICAgICogQXQgZWFjaCBhbmNlc3RvciBsZXZlbCB0aGUgZnVuY3Rpb24gYWxzbyBjaGVja3MgdGhlIGFuY2VzdG9yIGVsZW1lbnQncyBvd24gaW5saW5lXG4gICAgICAgICAqIGlibS1hMTF5LWRlYnVnIGF0dHJpYnV0ZSwgc28gdGhhdCBhIHBhcmVudCBlbGVtZW50IGNhbiBhbm5vdGF0ZSBhbGwgaXRzIGRlc2NlbmRhbnRzLlxuICAgICAgICAgKlxuICAgICAgICAgKiBTaWJsaW5nIHNjYW5uaW5nIHN0b3BzIGF0IHRoZSBmaXJzdCBub2RlIHRoYXQgaXMgcmVjb2duaXNlZCBhcyBhIGRpcmVjdGl2ZSAoZm91bmQgb3Igc3RvcCkuXG4gICAgICAgICAqIE5vbi1kaXJlY3RpdmUgbm9kZXMgKHJlYWwgY29udGVudCBlbGVtZW50cywgdGV4dCBub2RlcykgYXJlIHNraXBwZWQgc28gdGhhdCBhIGRpcmVjdGl2ZVxuICAgICAgICAgKiBwbGFjZWQgZnVydGhlciBiYWNrIGluIHRoZSBzaWJsaW5nIGxpc3QgaXMgc3RpbGwgZm91bmQgZXZlbiBpZiBjb250ZW50IG5vZGVzIGludGVydmVuZS5cbiAgICAgICAgICogSG93ZXZlciwgdHJhdmVyc2FsIGRvZXMgTk9UIGNyb3NzIGVsZW1lbnQgYm91bmRhcmllcyB3aGVuIHNjYW5uaW5nIHNpYmxpbmdzIOKAlCBvbmx5XG4gICAgICAgICAqIGNvbW1lbnQgbm9kZXMgYW5kIGRlZGljYXRlZCB3cmFwcGVyIGVsZW1lbnRzICh3aG9zZSBzb2xlIGZpcnN0IGNoaWxkIGlzIGEgY29tbWVudCkgYXJlXG4gICAgICAgICAqIHRyZWF0ZWQgYXMgdHJhbnNwYXJlbnQuXG4gICAgICAgICAqXG4gICAgICAgICAqIFNoYWRvdyBET00gdHJhdmVyc2FsOiB1c2VzIERPTVdhbGtlci5wYXJlbnROb2RlKCkgdG8gY3Jvc3Mgc2hhZG93IGJvdW5kYXJpZXMgY29ycmVjdGx5LFxuICAgICAgICAgKiBpbmNsdWRpbmcgc2xvdHRlZCBjb250ZW50IGFuZCBuZXN0ZWQgU2hhZG93IERPTSAoc2hhZG93LWluLXNoYWRvdykuIFdoZW4gdGhlIHBhcmVudFxuICAgICAgICAgKiBjaGFpbiByZWFjaGVzIGEgU2hhZG93Um9vdCwgRE9NV2Fsa2VyLnBhcmVudE5vZGUoKSBhdXRvbWF0aWNhbGx5IHJlc29sdmVzIGl0IHRvIHRoZVxuICAgICAgICAgKiBzaGFkb3cgaG9zdCBlbGVtZW50IGluIHRoZSBvdXRlciBET00uIEEgcGxhaW4gRG9jdW1lbnRGcmFnbWVudCB3aXRoIG5vIGhvc3QgcmV0dXJuc1xuICAgICAgICAgKiBudWxsIGZyb20gRE9NV2Fsa2VyLnBhcmVudE5vZGUoKSwgc3RvcHBpbmcgdHJhdmVyc2FsLlxuICAgICAgICAgKlxuICAgICAgICAgKiBTaWJsaW5nIHRyYXZlcnNhbCB1c2VzIERPTVdhbGtlci5wcmV2aW91c1NpYmxpbmdOb3RPd25lZEJ5U2xvdCgpIHRvIHNraXAgbm9kZXMgdGhhdFxuICAgICAgICAgKiBhcmUgYXNzaWduZWQgdG8gc2xvdHMgKGFuZCB0aGVyZWZvcmUgbG9naWNhbGx5IGJlbG9uZyB0byBhIGRpZmZlcmVudCBwYXJ0IG9mIHRoZSB0cmVlKS5cbiAgICAgICAgICpcbiAgICAgICAgICogVXNlcyBhbiBpdGVyYXRpdmUgYXBwcm9hY2ggKHJhdGhlciB0aGFuIHJlY3Vyc2lvbikgdG8gc2FmZWx5IGhhbmRsZSBkZWVwbHkgbmVzdGVkXG4gICAgICAgICAqIERPTSBzdHJ1Y3R1cmVzIHdpdGhvdXQgcmlzayBvZiBzdGFjayBvdmVyZmxvdy5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcmFtIGVsZW0gLSBUaGUgbm9kZSB3aG9zZSBjb250ZXh0IHdlIGFyZSBzZWFyY2hpbmdcbiAgICAgICAgICogQHJldHVybnMgVGhlIHNvdXJjZSBsb2NhdGlvbiBzdHJpbmcsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICAgICAqL1xuICAgICAgICBjb25zdCBmaW5kU291cmNlID0gZnVuY3Rpb24gKGVsZW06IE5vZGUgfCBudWxsKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgICAgICBsZXQgY3VycmVudCA9IGVsZW07XG4gICAgICAgICAgICB3aGlsZSAoY3VycmVudCkge1xuICAgICAgICAgICAgICAgIC8vIFNjYW4gcHJldmlvdXMgc2libGluZ3MgZm9yIGEgZGVidWcgZGlyZWN0aXZlIGNvbW1lbnQgb3Igd3JhcHBlciBlbGVtZW50LlxuICAgICAgICAgICAgICAgIC8vIFVzZSBwcmV2aW91c1NpYmxpbmdOb3RPd25lZEJ5U2xvdCB0byBza2lwIG5vZGVzIGFzc2lnbmVkIHRvIHNsb3RzLCB3aGljaFxuICAgICAgICAgICAgICAgIC8vIGxvZ2ljYWxseSBiZWxvbmcgdG8gYSBkaWZmZXJlbnQgcGFydCBvZiB0aGUgY29tcG9zZWQgdHJlZS5cbiAgICAgICAgICAgICAgICAvLyBPbmx5IGNvbW1lbnQgbm9kZXMgYW5kIGRlZGljYXRlZCB3cmFwcGVyIGVsZW1lbnRzIGFyZSBjb25zaWRlcmVkIGRpcmVjdGl2ZXM7XG4gICAgICAgICAgICAgICAgLy8gYWxsIG90aGVyIG5vZGUgdHlwZXMgYXJlIHNraXBwZWQgKHRoZXkgZG8gbm90IGJsb2NrIGZ1cnRoZXIgc2Nhbm5pbmcpLlxuICAgICAgICAgICAgICAgIGxldCBwcmV2ID0gRE9NV2Fsa2VyLnByZXZpb3VzU2libGluZ05vdE93bmVkQnlTbG90KGN1cnJlbnQpO1xuICAgICAgICAgICAgICAgIHdoaWxlIChwcmV2KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGV4dHJhY3REaXJlY3RpdmUocHJldik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuZm91bmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuc3RvcCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHJlc3VsdCBhcyB7IGZvdW5kOiB0cnVlOyBzdG9wOiBmYWxzZTsgc291cmNlOiBzdHJpbmcgfSkuc291cmNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHByZXYgPSBET01XYWxrZXIucHJldmlvdXNTaWJsaW5nTm90T3duZWRCeVNsb3QocHJldik7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gTm8gZGlyZWN0aXZlIGZvdW5kIGFtb25nIHNpYmxpbmdzIOKAlCBtb3ZlIHVwIHRvIHBhcmVudC5cbiAgICAgICAgICAgICAgICAvLyBVc2UgRE9NV2Fsa2VyLnBhcmVudE5vZGUoKSBpbnN0ZWFkIG9mIG5vZGUucGFyZW50Tm9kZSBkaXJlY3RseSBzbyB0aGF0OlxuICAgICAgICAgICAgICAgIC8vICAgMS4gU2hhZG93IERPTSBib3VuZGFyaWVzIGFyZSBjcm9zc2VkIGF1dG9tYXRpY2FsbHkgKFNoYWRvd1Jvb3Qg4oaSIGhvc3QgZWxlbWVudCksXG4gICAgICAgICAgICAgICAgLy8gICAgICBzdXBwb3J0aW5nIGJvdGggcmVndWxhciBhbmQgbmVzdGVkIFNoYWRvdyBET00gKHNoYWRvdy1pbi1zaGFkb3cpLlxuICAgICAgICAgICAgICAgIC8vICAgMi4gU2xvdHRlZCBub2RlcyBhcmUgcmUtcGFyZW50ZWQgdG8gdGhlaXIgc2xvdCBvd25lciByYXRoZXIgdGhhbiB0aGVpclxuICAgICAgICAgICAgICAgIC8vICAgICAgbGlnaHQtRE9NIHBhcmVudCwgbWF0Y2hpbmcgdGhlIGNvbXBvc2VkIChyZW5kZXJlZCkgdHJlZSBzdHJ1Y3R1cmUuXG4gICAgICAgICAgICAgICAgLy8gICAzLiBOb2RlcyB3aXRoIGFuIG93bmVyRWxlbWVudCAoZS5nLiBpZnJhbWUgZG9jdW1lbnQgcm9vdHMpIGFyZSByZS1wYXJlbnRlZFxuICAgICAgICAgICAgICAgIC8vICAgICAgdG8gdGhlaXIgb3duZXIgZWxlbWVudC5cbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnQgPSBET01XYWxrZXIucGFyZW50Tm9kZShjdXJyZW50KTtcblxuICAgICAgICAgICAgICAgIGlmICghcGFyZW50IHx8IHBhcmVudC5ub2RlVHlwZSA9PT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFJlYWNoZWQgdGhlIHRvcCBvZiB0aGUgdHJlZSAob3IgYSBwbGFpbiBEb2N1bWVudEZyYWdtZW50IHdpdGggbm8gaG9zdClcbiAgICAgICAgICAgICAgICAgICAgLy8gd2l0aG91dCBmaW5kaW5nIGEgZGlyZWN0aXZlLlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBDaGVjayB0aGUgcGFyZW50IGVsZW1lbnQncyBvd24gaW5saW5lIGF0dHJpYnV0ZSBiZWZvcmUgY29udGludWluZyB1cHdhcmQuXG4gICAgICAgICAgICAgICAgLy8gVGhpcyBhbGxvd3MgYSBjb250YWluaW5nIGVsZW1lbnQgdG8gYW5ub3RhdGUgYWxsIGl0cyBkZXNjZW5kYW50cy5cbiAgICAgICAgICAgICAgICAvLyBBbiAnZW5kJyBpbmxpbmUgYXR0cmlidXRlIG9uIHRoZSBwYXJlbnQgc3RvcHMgdHJhdmVyc2FsIGVudGlyZWx5LlxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudEF0dHJSZXN1bHQgPSBnZXRJbmxpbmVBdHRyKHBhcmVudCk7XG4gICAgICAgICAgICAgICAgaWYgKHBhcmVudEF0dHJSZXN1bHQuZm91bmQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudEF0dHJSZXN1bHQuc3RvcCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAocGFyZW50QXR0clJlc3VsdCBhcyB7IGZvdW5kOiB0cnVlOyBzdG9wOiBmYWxzZTsgc291cmNlOiBzdHJpbmcgfSkuc291cmNlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBwYXJlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBGaXJzdCwgY2hlY2sgZm9yIGFuIGlubGluZSBhdHRyaWJ1dGUgZGlyZWN0aXZlIG9uIHRoZSBlbGVtZW50IGl0c2VsZi5cbiAgICAgICAgLy8gQW4gJ2VuZCcgYXR0cmlidXRlIG9uIHRoZSBlbGVtZW50IGl0c2VsZiBzdG9wcyB0cmF2ZXJzYWwgKHJldHVybnMgbnVsbCkuXG4gICAgICAgIGNvbnN0IHNlbGZBdHRyUmVzdWx0ID0gZ2V0SW5saW5lQXR0cihub2RlKTtcbiAgICAgICAgaWYgKHNlbGZBdHRyUmVzdWx0LmZvdW5kKSB7XG4gICAgICAgICAgICBpZiAoc2VsZkF0dHJSZXN1bHQuc3RvcCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICByZXR1cm4gKHNlbGZBdHRyUmVzdWx0IGFzIHsgZm91bmQ6IHRydWU7IHN0b3A6IGZhbHNlOyBzb3VyY2U6IHN0cmluZyB9KS5zb3VyY2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUaGVuIHRyYXZlcnNlIHRoZSBET00gdG8gZmluZCBhIHByZWNlZGluZyBjb21tZW50IGRpcmVjdGl2ZSBvciBhbmNlc3RvciBhdHRyaWJ1dGVcbiAgICAgICAgcmV0dXJuIGZpbmRTb3VyY2Uobm9kZSk7XG4gICAgfVxuXG4gICAgcnVuKGVuZ2luZTogRW5naW5lLCBjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSkgOiBJc3N1ZVtdIHtcbiAgICAgICAgY29uc3Qgc3RhcnRUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgICAgIGxldCByZXN1bHRzOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVzdWx0cyA9IHRoaXMucnVsZS5ydW4oY29udGV4dCwgb3B0aW9ucywgY29udGV4dEhpZXJhcmNoaWVzKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgY29uc3QgZXJyOiBFcnJvciA9IGU7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiUlVMRSBFWENFUFRJT046XCIsdGhpcy5ydWxlLmlkLCBjb250ZXh0LmRvbS5yb2xlUGF0aCwgZXJyLnN0YWNrKTtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZW5kVGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgICBpZiAoIXJlc3VsdHMpIHJlc3VsdHMgPSBbXTtcblxuICAgICAgICBpZiAoIShyZXN1bHRzIGluc3RhbmNlb2YgQXJyYXkpKSB7XG4gICAgICAgICAgICByZXN1bHRzID0gW3Jlc3VsdHNdO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZXRWYWwgOiBJc3N1ZVtdID0gW107XG4gICAgICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlbmdpbmUuZ2V0TWVzc2FnZSh0aGlzLnJ1bGUuaWQsIHJlc3VsdC5yZWFzb25JZCwgcmVzdWx0Lm1lc3NhZ2VBcmdzKTtcbiAgICAgICAgICAgIGNvbnN0IHBhdGggPSB7fTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbnMgaW4gY29udGV4dCkge1xuICAgICAgICAgICAgICAgIHBhdGhbbnNdID0gY29udGV4dFtuc10ucm9sZVBhdGhcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJ1bGVJZCA9IHRoaXMucnVsZS5pZC5yZXBsYWNlKC9eKC4qKVxcJFxcJFxcZCskLywgXCIkMVwiKTtcblxuICAgICAgICAgICAgcmV0VmFsLnB1c2goe1xuICAgICAgICAgICAgICAgIHJ1bGVJZDogcnVsZUlkLFxuICAgICAgICAgICAgICAgIHZhbHVlOiByZXN1bHQudmFsdWUsXG4gICAgICAgICAgICAgICAgbm9kZTogY29udGV4dFtcImRvbVwiXS5ub2RlLFxuICAgICAgICAgICAgICAgIHBhdGg6IHBhdGgsXG4gICAgICAgICAgICAgICAgcnVsZVRpbWU6IGVuZFRpbWUtc3RhcnRUaW1lLFxuICAgICAgICAgICAgICAgIHJlYXNvbklkOiByZXN1bHQucmVhc29uSWQsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogbWVzc2FnZSxcbiAgICAgICAgICAgICAgICBtZXNzYWdlQXJnczogcmVzdWx0Lm1lc3NhZ2VBcmdzLFxuICAgICAgICAgICAgICAgIGFwaUFyZ3M6IHJlc3VsdC5hcGlBcmdzLFxuICAgICAgICAgICAgICAgIGJvdW5kczogY29udGV4dFtcImRvbVwiXS5ib3VuZHMsXG4gICAgICAgICAgICAgICAgc25pcHBldDogV3JhcHBlZFJ1bGUuY29udmVydE5vZGVUb1NuaXBwZXQoY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQpLFxuICAgICAgICAgICAgICAgIHNvdXJjZTogV3JhcHBlZFJ1bGUuY29udmVydE5vZGVUb1NvdXJjZShjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudCwgZW5naW5lLmlzU291cmNlTWFwRW5hYmxlZCgpKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEVuZ2luZSBpbXBsZW1lbnRzIElFbmdpbmUge1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0TGFuZ3VhZ2VzKCkge1xuICAgICAgICBjb25zdCBlbnYgPSB0eXBlb2YgcHJvY2VzcyAhPT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2YgKHByb2Nlc3MgYXMgYW55KS5ub2RlVHlwZSA9PT0gXCJ1bmRlZmluZWRcIiAmJiBwcm9jZXNzLmVudjtcbiAgICAgICAgLy8gSWYgYWxsIGVsc2UgZmFpbHMsIGRlZmF1bHQgdG8gVVMgRW5nbGlzaFxuICAgICAgICBsZXQgbm9kZUxhbmcgPSBcImVuLVVTXCI7XG4gICAgICAgIGlmIChlbnYpIHtcbiAgICAgICAgICAgIG5vZGVMYW5nID0gZW52LkxBTkcgfHwgZW52LkxBTkdVQUdFIHx8IGVudi5MQ19BTEwgfHwgZW52LkxDX01FU1NBR0VTO1xuICAgICAgICAgICAgaWYgKG5vZGVMYW5nICYmIG5vZGVMYW5nLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBub2RlTGFuZyA9IG5vZGVMYW5nLnNwbGl0KFwiLlwiKVswXS5yZXBsYWNlKC9fL2csXCItXCIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBub2RlTGFuZyA9IFwiZW4tVVNcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHlwZW9mIG5hdmlnYXRvciAhPT0gXCJ1bmRlZmluZWRcIiAmJiBuYXZpZ2F0b3IubGFuZ3VhZ2VzIHx8IFtub2RlTGFuZ107XG4gICAgfVxuICAgIG1hcHBlcnMgOiB7IFtuYW1lc3BhY2U6IHN0cmluZ10gOiBJTWFwcGVyIH0gPSB7fTtcbiAgICBydWxlTWFwIDogeyBbaWQ6IHN0cmluZ106IFJ1bGUgfSA9IHt9O1xuICAgIHdyYXBwZWRSdWxlTWFwIDogeyBbaWQ6IHN0cmluZ106IFdyYXBwZWRSdWxlIH0gPSB7fTtcbiAgICBubHNNYXAgOiBObHNNYXAgPSB7fVxuICAgIGhlbHBNYXAgOiBIZWxwTWFwID0ge31cbiAgICBzb3VyY2VNYXBFbmFibGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICBwcml2YXRlIGluY2xSdWxlczoge1xuICAgICAgICBbbnNSb2xlOiBzdHJpbmddOiBXcmFwcGVkUnVsZVtdXG4gICAgfSA9IHt9XG5cbiAgICBwcml2YXRlIGV4Y2xSdWxlczoge1xuICAgICAgICBbbnNSb2xlOiBzdHJpbmddOiBXcmFwcGVkUnVsZVtdXG4gICAgfSA9IHt9XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgLy8gTmVlZCBhIERPTSBNYXBwZXIgYXMgYSBtaW5pbXVtXG4gICAgICAgIHRoaXMuYWRkTWFwcGVyKG5ldyBET01NYXBwZXIoKSk7XG4gICAgfVxuXG4gICAgcnVuKHJvb3Q6IERvY3VtZW50IHwgTm9kZSwgb3B0aW9ucz86IHt9KTogUHJvbWlzZTxSZXBvcnQ+IHtcbiAgICAgICAgaWYgKHJvb3QgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcIm51bGwgZG9jdW1lbnRcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJvb3Qubm9kZVR5cGUgPT09IDkgLyogTm9kZS5ET0NVTUVOVF9OT0RFICovKSB7XG4gICAgICAgICAgICByb290ID0gKHJvb3QgYXMgRG9jdW1lbnQpLmRvY3VtZW50RWxlbWVudDtcbiAgICAgICAgfVxuICAgICAgICByb290Lm93bmVyRG9jdW1lbnQgJiYgKChyb290Lm93bmVyRG9jdW1lbnQgYXMgYW55KS5QVF9DSEVDS19ISURERU5fQ09OVEVOVCA9IGZhbHNlKTtcbiAgICAgICAgY29uc3QgbnVtTm9kZXNWaXNpdGVkID0gQ2FjaGVVdGlsLmNsZWFyQ2FjaGVzKHJvb3QpO1xuICAgICAgICBjb25zdCB3YWxrZXIgPSBuZXcgRE9NV2Fsa2VyKHJvb3QsIGZhbHNlLCByb290LCB0cnVlKTtcbiAgICAgICAgY29uc3QgcmV0VmFsIDogUmVwb3J0ID0ge1xuICAgICAgICAgICAgcmVzdWx0czogW10sXG4gICAgICAgICAgICBudW1FeGVjdXRlZDogMCxcbiAgICAgICAgICAgIHJ1bGVUaW1lOiAwLFxuICAgICAgICAgICAgdG90YWxUaW1lOiAwXG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3RhcnQgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKTsgICAgICAgIFxuICAgICAgICAvLyBSZXNldCB0aGUgcm9sZSBtYXBwZXJzXG4gICAgICAgIGZvciAoY29uc3QgbmFtZXNwYWNlIGluIHRoaXMubWFwcGVycykge1xuICAgICAgICAgICAgdGhpcy5tYXBwZXJzW25hbWVzcGFjZV0ucmVzZXQocm9vdCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBjb250ZXh0IGRldGVjdG9yXG4gICAgICAgIGxldCBjdXJyZW50Tm9kZUNvdW50ID0gMDtcbiAgICAgICAgbGV0IGxhc3RSZXBvcnRlZFBlcmNlbnQgPSAtMTtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgY3VycmVudE5vZGVDb3VudCsrO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBSZXBvcnQgcHJvZ3Jlc3MgYXQgZWFjaCBwZXJjZW50YWdlIG1pbGVzdG9uZVxuICAgICAgICAgICAgY29uc3QgY3VycmVudFBlcmNlbnQgPSBNYXRoLmZsb29yKChjdXJyZW50Tm9kZUNvdW50IC8gbnVtTm9kZXNWaXNpdGVkKSAqIDEwMCk7XG4gICAgICAgICAgICBpZiAoY3VycmVudFBlcmNlbnQgPiBsYXN0UmVwb3J0ZWRQZXJjZW50KSB7XG4gICAgICAgICAgICAgICAgaWYgKG51bU5vZGVzVmlzaXRlZCA+IDEwMDAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIChjdXJyZW50UGVyY2VudCA+IDYpIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgUHJvZ3Jlc3M6ICR7Y3VycmVudFBlcmNlbnR9JSAoJHtjdXJyZW50Tm9kZUNvdW50fS8ke251bU5vZGVzVmlzaXRlZH0gbm9kZXMpYCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnN0IHJ1bGVUaW1lcyA9IHJldFZhbC5yZXN1bHRzLnJlZHVjZSgocHJldiwgY3VyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBwcmV2W2N1ci5ydWxlSWRdID0gKHByZXZbY3VyLnJ1bGVJZF0gfHwgMCkrY3VyLnJ1bGVUaW1lO1xuICAgICAgICAgICAgICAgICAgICAvLyAgICAgcmV0dXJuIHByZXY7XG4gICAgICAgICAgICAgICAgICAgIC8vIH0sIHt9KTtcbiAgICAgICAgICAgICAgICAgICAgLy8gZm9yIChjb25zdCBydWxlSWQgaW4gcnVsZVRpbWVzKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBpZiAocnVsZVRpbWVzW3J1bGVJZF0gPiAxMDAwMCkge1xuICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgIGNvbnNvbGUubG9nKGAke3J1bGVJZH06ICR7cnVsZVRpbWVzW3J1bGVJZF19YCk7XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5ncm91cEVuZCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsYXN0UmVwb3J0ZWRQZXJjZW50ID0gY3VycmVudFBlcmNlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBHZXQgdGhlIGNvbnRleHQgaW5mb3JtYXRpb24gZnJvbSB0aGUgcnVsZSBtYXBwZXJzXG4gICAgICAgICAgICBjb25zdCBjb250ZXh0SGllcmFyY2hpZXMgOiBSdWxlQ29udGV4dEhpZXJhcmNoeSA9IHt9O1xuICAgICAgICAgICAgZm9yIChjb25zdCBuYW1lc3BhY2UgaW4gdGhpcy5tYXBwZXJzKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF3YWxrZXIuYkVuZFRhZykge1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0SGllcmFyY2hpZXNbbmFtZXNwYWNlXSA9IHRoaXMubWFwcGVyc1tuYW1lc3BhY2VdLm9wZW5TY29wZSh3YWxrZXIubm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIChuYW1lc3BhY2UgPT09IFwiZG9tXCIgJiYgd2Fsa2VyLm5vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnN0IGVsZW0gPSB3YWxrZXIubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGV0IGlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwiaWRcIikgJiYgKGlkID0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJpZFwiKS50cmltKCkpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiAocm9vdC5vd25lckRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKSA9PT0gZWxlbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb250ZXh0SGllcmFyY2hpZXNbXCJkb21cIl1bY29udGV4dEhpZXJhcmNoaWVzW1wiZG9tXCJdLmxlbmd0aC0xXS5yb2xlUGF0aCA9IFwiLy8qW0BpZD0nXCIraWQrXCInXVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHRIaWVyYXJjaGllc1tuYW1lc3BhY2VdID0gdGhpcy5tYXBwZXJzW25hbWVzcGFjZV0uY2xvc2VTY29wZSh3YWxrZXIubm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAod2Fsa2VyLm5vZGUubm9kZVR5cGUgIT09IDExIFxuICAgICAgICAgICAgICAgICYmIChWaXNVdGlsLmlzTm9kZVZpc2libGUod2Fsa2VyLm5vZGUpXG4gICAgICAgICAgICAgICAgICAgIC8vIHx8IHdhbGtlci5ub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiaGVhZFwiXG4gICAgICAgICAgICAgICAgICAgIHx8IHdhbGtlci5ub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwibWV0YVwiXG4gICAgICAgICAgICAgICAgICAgIHx8IHdhbGtlci5ub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwic3R5bGVcIlxuICAgICAgICAgICAgICAgICAgICB8fCB3YWxrZXIubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImRhdGFsaXN0XCJcbiAgICAgICAgICAgICAgICAgICAgfHwgd2Fsa2VyLm5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJwYXJhbVwiXG4gICAgICAgICAgICAgICAgICAgIHx8ICFET01VdGlsLmdldEFuY2VzdG9yKHdhbGtlci5ub2RlLCBbXCJib2R5XCJdKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGxldCBjb250ZXh0IDogUnVsZUNvbnRleHQgPSB7fTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IG5zIGluIGNvbnRleHRIaWVyYXJjaGllcykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuc0hpZXIgPSBjb250ZXh0SGllcmFyY2hpZXNbbnNdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXN0SGllciA9IG5zSGllcltuc0hpZXIubGVuZ3RoLTFdO1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0W25zXSA9IGxhc3RIaWVyOyBcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgbWF0Y2hpbmdSdWxlcyA9IHRoaXMuZ2V0TWF0Y2hpbmdSdWxlcyhjb250ZXh0SGllcmFyY2hpZXMpO1xuICAgICAgICAgICAgICAgIGxldCBkZXBNYXRjaCA9IHt9XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBtYXRjaGluZ1J1bGUgb2YgbWF0Y2hpbmdSdWxlcykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZnVsZmlsbHNEZXBlbmRlbmNpZXMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGRlcCBvZiBtYXRjaGluZ1J1bGUucnVsZS5kZXBlbmRlbmNpZXMgfHwgW10pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZGVwTWF0Y2hbZGVwXSkgZnVsZmlsbHNEZXBlbmRlbmNpZXMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoZnVsZmlsbHNEZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXN1bHRzIDogSXNzdWVbXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0YXJ0ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMgPSBtYXRjaGluZ1J1bGUucnVuKHRoaXMsIGNvbnRleHQsIG9wdGlvbnMsIGNvbnRleHRIaWVyYXJjaGllcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXcmFwcGVyIHNob3dzIGVycm9yIGluIGNvbnNvbGUuIFNraXAgdGhpcyBydWxlIGFzIE4vQVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGRvbid0IHdhbnQgdG8ga2lsbCB0aGUgZW5naW5lXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBvdXQgb2Ygc2NvcGUsIGl0IGZ1bGZpbGxzIHRoZSBkZXBlbmRlbmN5XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBNYXRjaFttYXRjaGluZ1J1bGUucnVsZS5pZF0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVzdWx0cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5yZXN1bHRzLnB1c2gocmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwucnVsZVRpbWUgKz0gcmVzdWx0LnJ1bGVUaW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5udW1FeGVjdXRlZCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQudmFsdWVbMV0gPT09IGVSdWxlQ29uZmlkZW5jZS5QQVNTKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcE1hdGNoW3Jlc3VsdC5ydWxlSWRdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gd2hpbGUgKHdhbGtlci5uZXh0Tm9kZSgpKTtcbiAgICAgICAgQ2FjaGVVdGlsLmNsZWFyQ2FjaGVzKHJvb3QpO1xuICAgICAgICByZXRWYWwudG90YWxUaW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCktc3RhcnQ7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUocmV0VmFsKTtcbiAgICB9XG5cbiAgICBlbmFibGVSdWxlcyhydWxlSWRzOiBzdHJpbmdbXSkge1xuICAgICAgICBmb3IgKGNvbnN0IHJ1bGVJZCBpbiB0aGlzLnJ1bGVNYXApIHtcbiAgICAgICAgICAgIHRoaXMucnVsZU1hcFtydWxlSWRdLmVuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGNvbnN0IHJ1bGVJZCBvZiBydWxlSWRzIHx8IFtdKSB7XG4gICAgICAgICAgICBpZiAoIShydWxlSWQgaW4gdGhpcy5ydWxlTWFwKSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihcIldBUk5JTkc6IFJ1bGUgSWRcIixydWxlSWQsXCJjb3VsZCBub3QgYmUgZW5hYmxlZC5cIik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMucnVsZU1hcFtydWxlSWRdLmVuYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0UnVsZShydWxlSWQ6IHN0cmluZyk6IFJ1bGUge1xuICAgICAgICByZXR1cm4gdGhpcy5ydWxlTWFwW3J1bGVJZF07XG4gICAgfVxuXG4gICAgZ2V0UnVsZXNJZHMoKSA6IHN0cmluZ1tdIHtcbiAgICAgICAgbGV0IHJldFZhbCA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHJ1bGVJZCBpbiB0aGlzLnJ1bGVNYXApIHtcbiAgICAgICAgICAgIHJldFZhbC5wdXNoKHJ1bGVJZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICBhZGRSdWxlcyhydWxlczogUnVsZVtdKSB7XG4gICAgICAgIGZvciAoY29uc3QgcnVsZSBvZiBydWxlcykge1xuICAgICAgICAgICAgdGhpcy5hZGRSdWxlKHJ1bGUsIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3NvcnRSdWxlcygpO1xuICAgIH1cblxuICAgIGFkZFJ1bGUocnVsZTogUnVsZSwgc2tpcFNvcnQ/OiBib29sZWFuKSB7XG4gICAgICAgIGxldCBjdHhzIDpDb250ZXh0W10gPSBDb250ZXh0LnBhcnNlKHJ1bGUuY29udGV4dCk7XG4gICAgICAgIGxldCBpZHggPSAwO1xuICAgICAgICBjb25zdCBydWxlSWQgPSBydWxlLmlkO1xuICAgICAgICBpZiAocnVsZUlkIGluIHRoaXMucnVsZU1hcCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coXCJXQVJOSU5HOiBSdWxlXCIscnVsZUlkLFwiYWxyZWFkeSBhZGRlZCB0byBlbmdpbmUuIElnbm9yaW5nLi4uXCIpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucnVsZU1hcFtydWxlSWRdID0gcnVsZTtcbiAgICAgICAgZm9yIChjb25zdCBjdHggb2YgY3R4cykge1xuICAgICAgICAgICAgbGV0IHdyYXBJZCA9IHJ1bGVJZDtcbiAgICAgICAgICAgIGlmIChpZHggPj0gMSkge1xuICAgICAgICAgICAgICAgIHdyYXBJZCA9IHJ1bGVJZCtcIiQkXCIraWR4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgKytpZHg7XG4gICAgICAgICAgICBsZXQgd3JhcHBlZFJ1bGUgPSBuZXcgV3JhcHBlZFJ1bGUocnVsZSxjdHgpO1xuICAgICAgICAgICAgdGhpcy53cmFwcGVkUnVsZU1hcFt3cmFwSWRdID0gd3JhcHBlZFJ1bGU7XG4gICAgICAgICAgICBsZXQgcGFydHMgPSB3cmFwcGVkUnVsZS5wYXJzZWRJbmZvLmNvbnRleHRJbmZvO1xuICAgICAgICAgICAgbGV0IGxhc3RQYXJ0ID0gcGFydHNbcGFydHMubGVuZ3RoLTFdO1xuICAgICAgICAgICAgbGV0IHRyaWdnZXJSb2xlID0gbGFzdFBhcnQubmFtZXNwYWNlK1wiOlwiK2xhc3RQYXJ0LnJvbGU7XG4gICAgICAgICAgICBpZiAobGFzdFBhcnQuaW5jbHVzaXZlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbmNsUnVsZXNbdHJpZ2dlclJvbGVdID0gdGhpcy5pbmNsUnVsZXNbdHJpZ2dlclJvbGVdIHx8IFtdO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5jbFJ1bGVzW3RyaWdnZXJSb2xlXS5wdXNoKHdyYXBwZWRSdWxlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5leGNsUnVsZXNbdHJpZ2dlclJvbGVdID0gdGhpcy5leGNsUnVsZXNbdHJpZ2dlclJvbGVdIHx8IFtdO1xuICAgICAgICAgICAgICAgIHRoaXMuZXhjbFJ1bGVzW3RyaWdnZXJSb2xlXS5wdXNoKHdyYXBwZWRSdWxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIXNraXBTb3J0KSB7XG4gICAgICAgICAgICB0aGlzLl9zb3J0UnVsZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGVuYWJsZVNvdXJjZU1hcChlbmFibGU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5zb3VyY2VNYXBFbmFibGVkID0gZW5hYmxlO1xuICAgIH1cblxuICAgIGlzU291cmNlTWFwRW5hYmxlZCgpIDogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnNvdXJjZU1hcEVuYWJsZWQ7XG4gICAgfVxuICAgIFxuICAgIF9zb3J0UnVsZXMoKSB7XG4gICAgICAgIGZvciAoY29uc3Qgcm9sZSBpbiB0aGlzLmluY2xSdWxlcykge1xuICAgICAgICAgICAgdGhpcy5pbmNsUnVsZXNbcm9sZV0uc29ydCgocnVsZUE6IFdyYXBwZWRSdWxlLCBydWxlQjogV3JhcHBlZFJ1bGUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBoYXNEZXBBID0gcnVsZUEucnVsZS5kZXBlbmRlbmNpZXMgJiYgcnVsZUEucnVsZS5kZXBlbmRlbmNpZXMubGVuZ3RoID4gMDtcbiAgICAgICAgICAgICAgICBjb25zdCBoYXNEZXBCID0gcnVsZUIucnVsZS5kZXBlbmRlbmNpZXMgJiYgcnVsZUIucnVsZS5kZXBlbmRlbmNpZXMubGVuZ3RoID4gMDtcbiAgICAgICAgICAgICAgICAvLyBJZiBCIGRlcGVuZHMgb24gQSwgc29ydCBBIGJlZm9yZSBCXG4gICAgICAgICAgICAgICAgaWYgKGhhc0RlcEIgJiYgcnVsZUIucnVsZS5kZXBlbmRlbmNpZXMuaW5jbHVkZXMocnVsZUEucnVsZS5pZCkpIHJldHVybiAtMTtcbiAgICAgICAgICAgICAgICAvLyBJZiBBIGRlcGVuZHMgb24gQiwgc29ydCBCIGJlZm9yZSBBXG4gICAgICAgICAgICAgICAgaWYgKGhhc0RlcEEgJiYgcnVsZUEucnVsZS5kZXBlbmRlbmNpZXMuaW5jbHVkZXMocnVsZUIucnVsZS5pZCkpIHJldHVybiAxO1xuICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgZG9lc24ndCBtYXR0ZXJcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoY29uc3Qgcm9sZSBpbiB0aGlzLmV4Y2xSdWxlcykge1xuICAgICAgICAgICAgdGhpcy5leGNsUnVsZXNbcm9sZV0uc29ydCgocnVsZUE6IFdyYXBwZWRSdWxlLCBydWxlQjogV3JhcHBlZFJ1bGUpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBoYXNEZXBBID0gcnVsZUEucnVsZS5kZXBlbmRlbmNpZXMgJiYgcnVsZUEucnVsZS5kZXBlbmRlbmNpZXMubGVuZ3RoID4gMDtcbiAgICAgICAgICAgICAgICBjb25zdCBoYXNEZXBCID0gcnVsZUIucnVsZS5kZXBlbmRlbmNpZXMgJiYgcnVsZUIucnVsZS5kZXBlbmRlbmNpZXMubGVuZ3RoID4gMDtcbiAgICAgICAgICAgICAgICAvLyBJZiBCIGRlcGVuZHMgb24gQSwgc29ydCBBIGJlZm9yZSBCXG4gICAgICAgICAgICAgICAgaWYgKGhhc0RlcEIgJiYgcnVsZUIucnVsZS5kZXBlbmRlbmNpZXMuaW5jbHVkZXMocnVsZUEucnVsZS5pZCkpIHJldHVybiAtMTtcbiAgICAgICAgICAgICAgICAvLyBJZiBBIGRlcGVuZHMgb24gQiwgc29ydCBCIGJlZm9yZSBBXG4gICAgICAgICAgICAgICAgaWYgKGhhc0RlcEEgJiYgcnVsZUEucnVsZS5kZXBlbmRlbmNpZXMuaW5jbHVkZXMocnVsZUIucnVsZS5pZCkpIHJldHVybiAxO1xuICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgZG9lc24ndCBtYXR0ZXJcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYWRkTmxzTWFwKG1hcDogTmxzTWFwKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIG1hcCkge1xuICAgICAgICAgICAgdGhpcy5ubHNNYXBba2V5XSA9IG1hcFtrZXldO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYWRkSGVscE1hcChtYXA6IEhlbHBNYXApIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gbWFwKSB7XG4gICAgICAgICAgICB0aGlzLmhlbHBNYXBba2V5XSA9IG1hcFtrZXldO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0TWVzc2FnZShydWxlSWQ6IHN0cmluZywgcnVsZUlkeDogbnVtYmVyIHwgc3RyaW5nLCBtc2dBcmdzPzogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgICAgICBsZXQgc3BsaXR0ZXIgPSBydWxlSWQuaW5kZXhPZihcIiQkXCIpO1xuICAgICAgICBpZiAoc3BsaXR0ZXIgPj0gMCkge1xuICAgICAgICAgICAgcnVsZUlkID0gcnVsZUlkLnN1YnN0cmluZygwLHNwbGl0dGVyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIShydWxlSWQgaW4gdGhpcy5ubHNNYXApKSByZXR1cm4gcnVsZUlkO1xuICAgICAgICBsZXQgbWVzc2FnZVRlbXBsYXRlID0gdGhpcy5ubHNNYXBbcnVsZUlkXVtydWxlSWR4IHx8IDBdO1xuICAgICAgICBpZiAoIW1lc3NhZ2VUZW1wbGF0ZSkgcmV0dXJuIHJ1bGVJZCtcIl9cIitydWxlSWR4O1xuICAgICAgICByZXR1cm4gbWVzc2FnZVRlbXBsYXRlLnJlcGxhY2UoL1xceyhcXGQrKVxcfS9nLFxuICAgICAgICAgICAgKG1hdGNoZWRTdHIsIG1hdGNoZWROdW0sIG1hdGNoZWRJbmRleCkgPT4gbXNnQXJnc1ttYXRjaGVkTnVtXVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGdldEhlbHAocnVsZUlkOiBzdHJpbmcsIHJlYXNvbklkOiBudW1iZXIgfCBzdHJpbmcsIGFyY2hpdmVJZD86IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGlmICghYXJjaGl2ZUlkKSB7XG4gICAgICAgICAgICAvLyBTZXQgdG8gdGhlIGxhdGVzdFxuICAgICAgICAgICAgYXJjaGl2ZUlkID0gXCJsYXRlc3RcIjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYCR7Q29uZmlnLmhlbHBSb290fS8ke2FyY2hpdmVJZH0vZG9jJHt0aGlzLmdldEhlbHBSZWwocnVsZUlkLCByZWFzb25JZCl9YDtcbiAgICB9XG5cbiAgICBnZXRIZWxwUmVsKHJ1bGVJZDogc3RyaW5nLCBydWxlSWR4OiBudW1iZXIgfCBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBsZXQgc3BsaXR0ZXIgPSBydWxlSWQuaW5kZXhPZihcIiQkXCIpO1xuICAgICAgICBpZiAoc3BsaXR0ZXIgPj0gMCkge1xuICAgICAgICAgICAgcnVsZUlkID0gcnVsZUlkLnN1YnN0cmluZygwLHNwbGl0dGVyKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIShydWxlSWQgaW4gdGhpcy5oZWxwTWFwKSkgcmV0dXJuIHJ1bGVJZDtcbiAgICAgICAgcnVsZUlkeCA9IHJ1bGVJZHggfHwgMDtcbiAgICAgICAgbGV0IGhlbHBTdHIgPSBudWxsO1xuICAgICAgICBpZiAocnVsZUlkeCBpbiB0aGlzLmhlbHBNYXBbcnVsZUlkXSkge1xuICAgICAgICAgICAgaGVscFN0ciA9IHRoaXMuaGVscE1hcFtydWxlSWRdW3J1bGVJZHggfHwgMF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBoZWxwU3RyID0gdGhpcy5oZWxwTWFwW3J1bGVJZF1bMF07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWhlbHBTdHIpIHJldHVybiBydWxlSWQrXCJfXCIrcnVsZUlkeDtcbiAgICAgICAgcmV0dXJuIGhlbHBTdHI7XG4gICAgfVxuXG4gICAgYWRkTWFwcGVyKG1hcHBlcjogSU1hcHBlcikge1xuICAgICAgICB0aGlzLm1hcHBlcnNbbWFwcGVyLmdldE5hbWVzcGFjZSgpXSA9IG1hcHBlcjtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBtYXRjaChydWxlOiBXcmFwcGVkUnVsZSxcbiAgICAgICAgY29udGV4dEhpZXI6IFJ1bGVDb250ZXh0SGllcmFyY2h5KSA6IGJvb2xlYW5cbiAgICB7XG4gICAgICAgIGxldCBydWxlUGFydHMgPSBydWxlLnBhcnNlZEluZm8uY29udGV4dEluZm87XG4gICAgICAgIGxldCBwYXJ0SWR4ID0gcnVsZVBhcnRzLmxlbmd0aC0xO1xuICAgICAgICBsZXQgY3VyTlMgPSBydWxlUGFydHNbcGFydElkeF0ubmFtZXNwYWNlO1xuICAgICAgICBsZXQgY3VySGllciA9IGNvbnRleHRIaWVyW2N1ck5TXVtjb250ZXh0SGllcltjdXJOU10ubGVuZ3RoLTFdO1xuICAgICAgICBjb25zdCBjb250ZXh0Tm9kZSA9IGN1ckhpZXIubm9kZTtcblxuICAgICAgICAvLyBJZiB0aGUgZW5kIG9mIHRoZSBydWxlIHBhcnQgZG9lc24ndCBtYXRjaCB0aGUgZW5kIG9mIHRoZSBoaWVyYXJjaHksIHdlIGRvbid0IGhhdmUgYSBtYXRjaFxuICAgICAgICBpZiAoIXJ1bGVQYXJ0c1twYXJ0SWR4XS5tYXRjaGVzKGNvbnRleHRIaWVyLCBjb250ZXh0SGllcltjdXJOU10ubGVuZ3RoLTEpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgdGhlcmUgd2FzIG9ubHkgb25lIHBhcnQsIHdlIGhhdmUgYSBtYXRjaFxuICAgICAgICBpZiAocnVsZVBhcnRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTmVlZCB0byBkZWFsIHdpdGggcGFyZW50IHBhcnRzLiBUbyB3YWxrIHRoZSBoaWVyYXJjaHksIHRoZXNlIG5lZWQgdG8gYmVcbiAgICAgICAgLy8gYWxsIGluIHRoZSBzYW1lIG5hbWVzcGFjZS4gQ29uZmlybSB0aGF0IGlzIHRydWUuXG4gICAgICAgIGN1ck5TID0gcnVsZVBhcnRzWzBdLm5hbWVzcGFjZTtcbiAgICAgICAgY3VySGllciA9IGNvbnRleHRIaWVyW2N1ck5TXVtjb250ZXh0SGllcltjdXJOU10ubGVuZ3RoLTFdO1xuICAgICAgICAtLXBhcnRJZHg7XG4gICAgICAgIGlmIChydWxlUGFydHMuc2xpY2UoMCwgcnVsZVBhcnRzLmxlbmd0aC0xKS5zb21lKHBhcnQgPT4gcGFydC5uYW1lc3BhY2UgIT09IGN1ck5TKSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihgW0VSUk9SXSBSdWxlICR7cnVsZS5ydWxlLmlkfSBoYXMgaW5jb25zaXRlbnQgcGFyZW50IG5hbWVzcGFjZXNgKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiB0aGUgdGFyZ2V0IG5vZGUgbWF0Y2hlcyB0aGUgZW5kIG9mIHRoZSBoaWVyYXJjaHksIG1vdmUgdXAgcGFzdCBpdCwgb3RoZXJ3aXNlLCBzdGFydCBhdCB0aGUgZW5kXG4gICAgICAgIGxldCBoaWVySWR4ID0gY29udGV4dEhpZXJbY3VyTlNdLmxlbmd0aCAtIChjdXJIaWVyLm5vZGUuaXNTYW1lTm9kZShjb250ZXh0Tm9kZSkgPyAyIDogMSk7XG4gICAgICAgIHdoaWxlIChoaWVySWR4ID49IDAgJiYgcGFydElkeCA+PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJ0ID0gcnVsZVBhcnRzW3BhcnRJZHhdO1xuICAgICAgICAgICAgY29uc3QgbWF0Y2hlc1BhcnQgPSBydWxlUGFydHNbcGFydElkeF0ubWF0Y2hlcyhjb250ZXh0SGllciwgaGllcklkeCk7XG4gICAgICAgICAgICBpZiAocGFydC5jb25uZWN0b3IgPT09IFwiPlwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFtYXRjaGVzUGFydCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBEaXJlY3QgcGFyZW50IGNoZWNrIGFuZCBkb2Vzbid0IG1hdGNoXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBEaXJlY3QgcGFyZW50IGNoZWNrIGFuZCBkb2VzIG1hdGNoXG4gICAgICAgICAgICAgICAgICAgIC0tcGFydElkeDtcbiAgICAgICAgICAgICAgICAgICAgLS1oaWVySWR4O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGFydC5jb25uZWN0b3IgPT09IFwiIFwiKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcnQuaW5jbHVzaXZlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGluY2x1c2l2ZSBhbmNlc3RvciBtYXRjaFxuICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2hlc1BhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC0tcGFydElkeDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBJZiBkb2Vzbid0IG1hdGNoLCBqdXN0IG1vdmUgdXAgdGhlIHJvbGUgaGllcmFyY2h5XG4gICAgICAgICAgICAgICAgICAgIC0taGllcklkeDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFtYXRjaGVzUGFydCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBleGNsdXNpdmUgYW5jZXN0b3IgbWF0Y2ggYW5kIGN1cnJlbnQgbWF0Y2hlc1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXhjbHVzaXZlIGFuY2VzdG9yIG1hdGNoIGFuZCBjdXJyZW50IGRvZXNuJ3QgbWF0Y2ggLSBjaGVjayBmb3Igb3RoZXIgYW5jZXN0b3JzXG4gICAgICAgICAgICAgICAgICAgIGxldCBwYXJlbnRNYXRjaCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBzZWFyY2hJZHggPSBoaWVySWR4LTE7ICFwYXJlbnRNYXRjaCAmJiBzZWFyY2hJZHggPj0gMDsgLS1zZWFyY2hJZHgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudE1hdGNoID0gIXJ1bGVQYXJ0c1twYXJ0SWR4XS5tYXRjaGVzKGNvbnRleHRIaWVyLCBzZWFyY2hJZHgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnRNYXRjaCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBlbHNlIC0tcGFydElkeDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvbnRleHQgY29ubmVjdG9yIFwiK3BhcnQuY29ubmVjdG9yK1wiIGlzIG5vdCBzdXBwb3J0ZWRcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhcnRJZHggPT09IC0xO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0TWF0Y2hpbmdSdWxlcyhjdHhIaWVyIDogUnVsZUNvbnRleHRIaWVyYXJjaHkpIDogV3JhcHBlZFJ1bGVbXSB7XG4gICAgICAgIGxldCBtYXRjaGVzIDogV3JhcHBlZFJ1bGVbXSA9IFtdO1xuICAgICAgICBmdW5jdGlvbiBhZGRNYXRjaGVzKHJ1bGVzOiBXcmFwcGVkUnVsZVtdKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJ1bGUgb2YgcnVsZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAocnVsZS5ydWxlLmVuYWJsZWQgJiYgRW5naW5lLm1hdGNoKHJ1bGUsIGN0eEhpZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIG1hdGNoZXMucHVzaChydWxlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCBucyBpbiBjdHhIaWVyKSB7XG4gICAgICAgICAgICBsZXQgcm9sZSA9IG5zK1wiOlwiKyhjdHhIaWVyW25zXS5sZW5ndGggPiAwID8gY3R4SGllcltuc11bY3R4SGllcltuc10ubGVuZ3RoLTFdLnJvbGUgOiBcIm5vbmVcIik7XG4gICAgICAgICAgICBpZiAocm9sZSBpbiB0aGlzLmluY2xSdWxlcykge1xuICAgICAgICAgICAgICAgIGFkZE1hdGNoZXModGhpcy5pbmNsUnVsZXNbcm9sZV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChjb25zdCB4Um9sZSBpbiB0aGlzLmV4Y2xSdWxlcykge1xuICAgICAgICAgICAgICAgIGlmICh4Um9sZSAhPT0gcm9sZSkge1xuICAgICAgICAgICAgICAgICAgICBhZGRNYXRjaGVzKHRoaXMuZXhjbFJ1bGVzW3hSb2xlXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJvbGUgIT09IG5zK1wiOm5vbmVcIikge1xuICAgICAgICAgICAgICAgIGlmIChyb2xlLnN0YXJ0c1dpdGgobnMrXCI6L1wiKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobnMrXCI6LypcIiBpbiB0aGlzLmluY2xSdWxlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWRkTWF0Y2hlcyh0aGlzLmluY2xSdWxlc1tucytcIjovKlwiXSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChucytcIjoqXCIgaW4gdGhpcy5pbmNsUnVsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZE1hdGNoZXModGhpcy5pbmNsUnVsZXNbbnMrXCI6KlwiXSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5zb3J0RGVwcyhtYXRjaGVzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTb3J0cyB0aGUgcnVsZXMgaW4gb3JkZXIgdG8gZXhlY3V0ZSBkZXBlbmRlbmNpZXMgaW4gdGhlIGNvcnJlY3Qgb3JkZXJcbiAgICAgKiBAcGFyYW0gaW5SdWxlcyBMaXN0IG9mIHdyYXBwZWQgcnVsZXMgdG8gc29ydFxuICAgICAqIEByZXR1cm5zIFNvcnRlZCBsaXN0IG9mIHdyYXBwZWQgcnVsZXNcbiAgICAgKi9cbiAgICBzb3J0RGVwcyhpblJ1bGVzOiBXcmFwcGVkUnVsZVtdKSB7XG4gICAgICAgIGxldCBkZXBSdWxlczogV3JhcHBlZFJ1bGVbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHJ1bGUgb2YgaW5SdWxlcykge1xuICAgICAgICAgICAgZGVwUnVsZXMucHVzaChydWxlKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgbGV0IHJldFZhbCA6IFdyYXBwZWRSdWxlW10gPSBbXTtcbiAgICAgICAgbGV0IGlkVG9SdWxlID0ge307XG4gICAgICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgcnVsZXMuIElmIHRoYXQgcnVsZSdzIGRlcGVuZGVuY2llcyBjYW4gYmUgbWV0IGJ5IHJ1bGVzIGFscmVhZHkgaW4gdGhlIGxpc3QsIGFkZCBpdCB0byB0aGUgbGlzdFxuICAgICAgICAvLyBSZXBlYXQgdW50aWwgbm8gY2hhbmdlcyBhcmUgbWFkZSB0byB0aGUgc2F0aXNmaWVkIGxpc3RcbiAgICAgICAgLy8gSWYgYSBydWxlIGNhbm5vdCBiZSBzYXRpc2ZpZWQsIGl0IHdpbGwgbmV2ZXIgZXhlY3V0ZSwgc28gaXQgY2FuIGJlIGRyb3BwZWQuXG4gICAgICAgIGxldCBjaGFuZ2UgPSBmYWxzZTtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgY2hhbmdlID0gZmFsc2U7XG4gICAgICAgICAgICBmb3IgKGxldCBpZHg9MDsgaWR4PGRlcFJ1bGVzLmxlbmd0aDsgKytpZHgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkZXBSdWxlID0gZGVwUnVsZXNbaWR4XTtcbiAgICAgICAgICAgICAgICBpZiAoZGVwUnVsZS5ydWxlLmlkIGluIGlkVG9SdWxlKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBsZXQgYWxsTWF0Y2ggPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmIChkZXBSdWxlLnJ1bGUuZGVwZW5kZW5jaWVzICYmIGRlcFJ1bGUucnVsZS5kZXBlbmRlbmNpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGRlcElkIG9mIGRlcFJ1bGUucnVsZS5kZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGRlcElkIGluIGlkVG9SdWxlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbE1hdGNoID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gaWYgKGRlcFJ1bGUucnVsZS5wcmVyZXFzICYmIGRlcFJ1bGUucnVsZS5wcmVyZXFzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgZm9yIChjb25zdCBkZXBJZCBvZiBkZXBSdWxlLnJ1bGUucHJlcmVxcykge1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgaWYgKCEoZGVwSWQgaW4gaWRUb1J1bGUpKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgYWxsTWF0Y2ggPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyAgICAgfVxuICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICBpZiAoYWxsTWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsLnB1c2goZGVwUnVsZSk7XG4gICAgICAgICAgICAgICAgICAgIGlkVG9SdWxlW2RlcFJ1bGUucnVsZS5pZF0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBkZXBSdWxlcy5zcGxpY2UoaWR4LS0sIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAoY2hhbmdlKTtcbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5leHBvcnQgY2xhc3MgQ29uZmlnIHtcbiAgICBzdGF0aWMgREVCVUcgPSBmYWxzZTtcbiAgICBzdGF0aWMgaGVscFJvb3QgPSBcImh0dHBzOi8vYWJsZS5pYm0uY29tL3J1bGVzL2FyY2hpdmVzXCI7XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBDb21tb25NYXBwZXIgfSBmcm9tIFwiLi4vY29tbW9uL0NvbW1vbk1hcHBlclwiO1xuaW1wb3J0IHsgQm91bmRzIH0gZnJvbSBcIi4uL2FwaS9JTWFwcGVyXCI7XG5pbXBvcnQgeyBDYWNoZVV0aWwgfSBmcm9tIFwiLi4vLi4vdjQvdXRpbC9DYWNoZVV0aWxcIjtcblxuZXhwb3J0IGNsYXNzIERPTU1hcHBlciBleHRlbmRzIENvbW1vbk1hcHBlciB7XG4gICAgZ2V0Um9sZShub2RlOiBOb2RlKSA6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgfVxuICAgIGdldE5hbWVzcGFjZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gXCJkb21cIlxuICAgIH1cbiAgICBnZXRBdHRyaWJ1dGVzKG5vZGU6IE5vZGUpIDogeyBba2V5OnN0cmluZ106IHN0cmluZyB9IHtcbiAgICAgICAgbGV0IHJldFZhbCA9IHt9O1xuICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLykge1xuICAgICAgICAgICAgY29uc3QgZWxlbSA9IG5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgICAgIGZvciAobGV0IGlkeD0wOyBpZHg8ZWxlbS5hdHRyaWJ1dGVzLmxlbmd0aDsgKytpZHgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBhdHRySW5mbyA9IGVsZW0uYXR0cmlidXRlc1tpZHhdO1xuICAgICAgICAgICAgICAgIHJldFZhbFthdHRySW5mby5uYW1lLnRvTG93ZXJDYXNlKCldID0gYXR0ckluZm8ubm9kZVZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogZ2V0IHNjYWxlZCBib3VuZHMgZm9yIHNjcmVlbnNob3QgZXRjLiBhZGp1c3RlZCBmb3IgZGV2aWNlUGl4ZWxSYXRpbyBhbmQgc2Nyb2xsXG4gICAgICogQHBhcmFtIG5vZGUgXG4gICAgICogQHJldHVybnMgXG4gICAgICovXG4gICAgZ2V0Qm91bmRzKG5vZGU6IE5vZGUpIDogQm91bmRzIHtcbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgIT09IDEgLypOb2RlLkVMRU1FTlRfTk9ERSovKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBjYWNoZWRCb3VuZHMgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUobm9kZSBhcyBFbGVtZW50LCBcIkRPTU1hcHBlcl9Cb3VuZHNcIiwgdW5kZWZpbmVkKTtcbiAgICAgICAgaWYgKHR5cGVvZiBjYWNoZWRCb3VuZHMgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRCb3VuZHM7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGxldCBhZGp1c3RtZW50ID0gMTtcbiAgICAgICAgaWYgKG5vZGUub3duZXJEb2N1bWVudCAmJiBub2RlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcgJiYgbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LmRldmljZVBpeGVsUmF0aW8pIHtcbiAgICAgICAgICAgIGFkanVzdG1lbnQgPSBub2RlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuZGV2aWNlUGl4ZWxSYXRpbztcbiAgICAgICAgfVxuICAgICAgICBsZXQgYm91bmRzID0gKG5vZGUgYXMgRWxlbWVudCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICAgICAgLy8gRG8gYSBjaGVjayB3aGV0aGVyIGJvdW5kcyBoYXMgdmFsdWUgYXMgd2UgdXNlIGRpZmZlcmVudCB0b29sIChodG1sVW5pdCwgYnJvd3NlcikgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uXG4gICAgICAgIGlmIChib3VuZHMpIHtcbiAgICAgICAgICAgIGxldCBzY3JvbGxYID0gbm9kZSAmJiBub2RlLm93bmVyRG9jdW1lbnQgJiYgbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3ICYmIG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5zY3JvbGxYIHx8IDA7XG4gICAgICAgICAgICBsZXQgc2Nyb2xsWSA9IG5vZGUgJiYgbm9kZS5vd25lckRvY3VtZW50ICYmIG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyAmJiBub2RlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuc2Nyb2xsWSB8fCAwO1xuICAgICAgICAgICAgY29uc3QgcmV0ID0ge1xuICAgICAgICAgICAgICAgIFwibGVmdFwiOiBNYXRoLmNlaWwoKGJvdW5kcy5sZWZ0ICsgc2Nyb2xsWCkgKiBhZGp1c3RtZW50KSxcbiAgICAgICAgICAgICAgICBcInRvcFwiOiBNYXRoLmNlaWwoKGJvdW5kcy50b3AgKyBzY3JvbGxZKSAqIGFkanVzdG1lbnQpLFxuICAgICAgICAgICAgICAgIFwiaGVpZ2h0XCI6IE1hdGguY2VpbChib3VuZHMuaGVpZ2h0ICogYWRqdXN0bWVudCksXG4gICAgICAgICAgICAgICAgXCJ3aWR0aFwiOiBNYXRoLmNlaWwoYm91bmRzLndpZHRoICogYWRqdXN0bWVudClcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSBhcyBFbGVtZW50LCBcIkRPTU1hcHBlcl9Cb3VuZHNcIiwgcmV0KTtcbiAgICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogZ2V0IHJlYWwgQ1NTIGJvdW5kcyBpbiBjc3MgcGl4ZWxzLCBhZGp1c3RlZCBmb3Igc2Nyb2xsIG9ubHlcbiAgICAgKiBAcGFyYW0gbm9kZSBcbiAgICAgKiBAcmV0dXJucyBcbiAgICAgKi9cbiAgICBnZXRVbmFkanVzdGVkQm91bmRzKG5vZGU6IE5vZGUpIDogQm91bmRzIHtcbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgIT09IDEgLypOb2RlLkVMRU1FTlRfTk9ERSovKSByZXR1cm4gbnVsbDtcblxuXG4gICAgICAgIGNvbnN0IGNhY2hlZEJvdW5kcyA9IENhY2hlVXRpbC5nZXRDYWNoZShub2RlIGFzIEVsZW1lbnQsIFwiRE9NTWFwcGVyX1VuYWRqdXN0ZWRCb3VuZHNcIiwgdW5kZWZpbmVkKTtcbiAgICAgICAgaWYgKHR5cGVvZiBjYWNoZWRCb3VuZHMgIT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRCb3VuZHM7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBib3VuZHMgPSAobm9kZSBhcyBFbGVtZW50KS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgLy8gYWRqdXN0ZWQgZm9yIHNjcm9sbCBpZiBhbnlcbiAgICAgICAgaWYgKGJvdW5kcykge1xuICAgICAgICAgICAgbGV0IHNjcm9sbFggPSBub2RlICYmIG5vZGUub3duZXJEb2N1bWVudCAmJiBub2RlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcgJiYgbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LnNjcm9sbFggfHwgMDtcbiAgICAgICAgICAgIGxldCBzY3JvbGxZID0gbm9kZSAmJiBub2RlLm93bmVyRG9jdW1lbnQgJiYgbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3ICYmIG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldy5zY3JvbGxZIHx8IDA7XG4gICAgICAgICAgICBjb25zdCByZXQgPSB7XG4gICAgICAgICAgICAgICAgXCJsZWZ0XCI6IE1hdGguY2VpbChib3VuZHMubGVmdCArIHNjcm9sbFgpLFxuICAgICAgICAgICAgICAgIFwidG9wXCI6IE1hdGguY2VpbChib3VuZHMudG9wICsgc2Nyb2xsWSksXG4gICAgICAgICAgICAgICAgXCJoZWlnaHRcIjogTWF0aC5jZWlsKGJvdW5kcy5oZWlnaHQpLFxuICAgICAgICAgICAgICAgIFwid2lkdGhcIjogTWF0aC5jZWlsKGJvdW5kcy53aWR0aClcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSBhcyBFbGVtZW50LCBcIkRPTU1hcHBlcl9VbmFkanVzdGVkQm91bmRzXCIsIHJldCk7XG4gICAgICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMC0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4vRE9NV2Fsa2VyXCI7XG5cbi8qKlxuICogVXRpbGl0eSBjbGFzcyBwcm92aWRpbmcgaGVscGVyIG1ldGhvZHMgZm9yIERPTSBtYW5pcHVsYXRpb24gYW5kIHRyYXZlcnNhbCBvcGVyYXRpb25zLlxuICogVXNlZCB0aHJvdWdob3V0IHRoZSBhY2Nlc3NpYmlsaXR5IGNoZWNrZXIgZW5naW5lIHRvIG5hdmlnYXRlIGFuZCBhbmFseXplIERPTSBzdHJ1Y3R1cmVzLlxuICovXG5leHBvcnQgY2xhc3MgRE9NVXRpbCB7XG4gICAgXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIGEgZ2l2ZW4gbm9kZSBoYXMgYW4gYW5jZXN0b3IgZWxlbWVudCB3aXRoIGEgbm9kZSBuYW1lIG1hdGNoaW5nIGFueSBvZiB0aGUgcHJvdmlkZWQgbmFtZXMuXG4gICAgICogVHJhdmVyc2VzIHVwIHRoZSBET00gdHJlZSBmcm9tIHRoZSBnaXZlbiBub2RlIHVudGlsIGEgbWF0Y2ggaXMgZm91bmQgb3IgdGhlIHJvb3QgaXMgcmVhY2hlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBub2RlIC0gVGhlIHN0YXJ0aW5nIERPTSBub2RlIHRvIGNoZWNrXG4gICAgICogQHBhcmFtIG5hbWVzIC0gQXJyYXkgb2Ygbm9kZSBuYW1lcyAodGFnIG5hbWVzKSB0byBzZWFyY2ggZm9yIGluIHVwcGVyY2FzZSAoZS5nLiwgWydUQUJMRScsICdESVYnXSlcbiAgICAgKiBAcmV0dXJucyB0cnVlIGlmIGFuIGFuY2VzdG9yIHdpdGggYSBtYXRjaGluZyBuYW1lIGlzIGZvdW5kLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgKi9cbiAgICBzdGF0aWMgaGFzUGFyZW50KG5vZGU6IE5vZGUsIG5hbWVzOnN0cmluZ1tdKSB7XG4gICAgICAgIGxldCBwID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQobm9kZSk7XG4gICAgICAgIHdoaWxlIChwICYmICFuYW1lcy5pbmNsdWRlcyhwLm5vZGVOYW1lKSkge1xuICAgICAgICAgICAgcCA9IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KHApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAhIXA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0cmlldmVzIHRoZSBmaXJzdCBhbmNlc3RvciBlbGVtZW50IHRoYXQgbWF0Y2hlcyBhbnkgb2YgdGhlIHByb3ZpZGVkIG5vZGUgbmFtZXMgKGNhc2UtaW5zZW5zaXRpdmUpLlxuICAgICAqIFNpbWlsYXIgdG8gaGFzUGFyZW50IGJ1dCByZXR1cm5zIHRoZSBhY3R1YWwgZWxlbWVudCByZWZlcmVuY2UgYW5kIHBlcmZvcm1zIGNhc2UtaW5zZW5zaXRpdmUgY29tcGFyaXNvbi5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBub2RlIC0gVGhlIHN0YXJ0aW5nIERPTSBub2RlXG4gICAgICogQHBhcmFtIG5hbWVzIC0gQXJyYXkgb2YgbG93ZXJjYXNlIG5vZGUgbmFtZXMgdG8gc2VhcmNoIGZvciAoZS5nLiwgWyd0YWJsZScsICdkaXYnXSlcbiAgICAgKiBAcmV0dXJucyBUaGUgbWF0Y2hpbmcgYW5jZXN0b3IgZWxlbWVudCwgb3IgbnVsbCBpZiBub25lIGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIGdldEFuY2VzdG9yKG5vZGU6IE5vZGUsIG5hbWVzOnN0cmluZ1tdKSB7XG4gICAgICAgIGxldCBwID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQobm9kZSk7XG4gICAgICAgIHdoaWxlIChwICYmICFuYW1lcy5pbmNsdWRlcyhwLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICAgICAgICBwID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQocCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHA7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyBpZiB0d28gbm9kZXMgYXJlIHRoZSBzYW1lIG5vZGUsIHdpdGggZmFsbGJhY2sgc3RyYXRlZ2llcyBmb3IgZGlmZmVyZW50IGJyb3dzZXIgZW52aXJvbm1lbnRzLlxuICAgICAqIFVzZXMgbXVsdGlwbGUgY29tcGFyaXNvbiBtZXRob2RzIGZvciBjcm9zcy1icm93c2VyIGNvbXBhdGliaWxpdHk6XG4gICAgICogMS4gU3RyaWN0IGVxdWFsaXR5ICg9PT0pXG4gICAgICogMi4gaXNTYW1lTm9kZSgpIG1ldGhvZCBpZiBhdmFpbGFibGVcbiAgICAgKiAzLiBjb21wYXJlRG9jdW1lbnRQb3NpdGlvbigpIChyZXR1cm5zIDAgaWYgc2FtZSBub2RlKVxuICAgICAqIDQuIFJldHVybnMgdHJ1ZSBhcyBsYXN0IHJlc29ydCBpZiBubyBjb21wYXJpc29uIG1ldGhvZCBpcyBhdmFpbGFibGVcbiAgICAgKlxuICAgICAqIEBwYXJhbSBhIC0gRmlyc3Qgbm9kZSB0byBjb21wYXJlXG4gICAgICogQHBhcmFtIGIgLSBTZWNvbmQgbm9kZSB0byBjb21wYXJlXG4gICAgICogQHJldHVybnMgdHJ1ZSBpZiBub2RlcyBhcmUgdGhlIHNhbWUsIGZhbHNlIG90aGVyd2lzZVxuICAgICAqL1xuICAgIHN0YXRpYyBzYW1lTm9kZShhOiBOb2RlLCBiOiBOb2RlKSA6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoYSA9PT0gYikge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAoYS5pc1NhbWVOb2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gYS5pc1NhbWVOb2RlKGIpO1xuICAgICAgICB9IGVsc2UgaWYgKGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybiBhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGIpID09PSAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gTm90IHN1cHBvcnRlZCBpbiB0aGlzIGVudmlyb25tZW50IC0gdHJ5IG91ciBiZXN0XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE5vcm1hbGl6ZXMgd2hpdGVzcGFjZSBpbiBhIHN0cmluZyBieSByZXBsYWNpbmcgYWxsIHdoaXRlc3BhY2UgY2hhcmFjdGVyc1xuICAgICAqIChzcGFjZXMsIHRhYnMsIGNhcnJpYWdlIHJldHVybnMsIG5ld2xpbmVzKSB3aXRoIHNpbmdsZSBzcGFjZXMgYW5kIGNvbGxhcHNpbmdcbiAgICAgKiBtdWx0aXBsZSBjb25zZWN1dGl2ZSBzcGFjZXMgaW50byBvbmUuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcyAtIFRoZSBpbnB1dCBzdHJpbmcgdG8gY2xlYW5cbiAgICAgKiBAcmV0dXJucyBUaGUgY2xlYW5lZCBzdHJpbmcgd2l0aCBub3JtYWxpemVkIHdoaXRlc3BhY2VcbiAgICAgKiBAZXhhbXBsZSBcIkhlbGxvXFxuXFx0ICBXb3JsZFwiIOKGkiBcIkhlbGxvIFdvcmxkXCJcbiAgICAgKi9cbiAgICBzdGF0aWMgY2xlYW5XaGl0ZXNwYWNlKHM6IHN0cmluZykgOiBzdHJpbmcge1xuICAgICAgICBsZXQgcmV0VmFsID0gcy5yZXBsYWNlKC9bIFxcdFxcclxcbl0vZywgXCIgXCIpLnJlcGxhY2UoLyArL2csXCIgXCIpO1xuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbGxhcHNlcyBtdWx0aXBsZSBjb25zZWN1dGl2ZSBzcGFjZXMgaW50byBhIHNpbmdsZSBzcGFjZS5cbiAgICAgKiBVbmxpa2UgY2xlYW5XaGl0ZXNwYWNlLCBvbmx5IGhhbmRsZXMgc3BhY2VzLCBub3Qgb3RoZXIgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIGxpa2UgdGFicyBvciBuZXdsaW5lcy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBzIC0gVGhlIGlucHV0IHN0cmluZyB0byBjbGVhblxuICAgICAqIEByZXR1cm5zIFRoZSBzdHJpbmcgd2l0aCBjb2xsYXBzZWQgc3BhY2VzXG4gICAgICovXG4gICAgc3RhdGljIGNsZWFuU3BhY2Uoczogc3RyaW5nKSA6IHN0cmluZyB7XG4gICAgICAgIGxldCByZXRWYWwgPSBzLnJlcGxhY2UoLyArL2csXCIgXCIpO1xuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERldGVybWluZXMgaWYgdHdvIGVsZW1lbnRzICh0eXBpY2FsbHkgdGFibGUgY2VsbHMpIGJlbG9uZyB0byB0aGUgc2FtZSB0YWJsZSBlbGVtZW50LlxuICAgICAqIEZpbmRzIHRoZSB0YWJsZSBhbmNlc3RvciBmb3IgZWFjaCBlbGVtZW50IGFuZCBjb21wYXJlcyB0aGVtIHVzaW5nIHNhbWVOb2RlKCkuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZWxlbWVudDEgLSBGaXJzdCBlbGVtZW50IHRvIGNoZWNrXG4gICAgICogQHBhcmFtIGVsZW1lbnQyIC0gU2Vjb25kIGVsZW1lbnQgdG8gY2hlY2tcbiAgICAgKiBAcmV0dXJucyB0cnVlIGlmIGJvdGggZWxlbWVudHMgc2hhcmUgdGhlIHNhbWUgdGFibGUgYW5jZXN0b3IsIGZhbHNlIG90aGVyd2lzZVxuICAgICAqL1xuICAgIHN0YXRpYyBpc0luU2FtZVRhYmxlKGVsZW1lbnQxLCBlbGVtZW50Mikge1xuICAgICAgICBpZiAoZWxlbWVudDEgJiYgZWxlbWVudDIpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudE5hbWUgPSBbJ3RhYmxlJ107XG4gICAgICAgICAgICBjb25zdCBwYXJlbnQxPSBET01VdGlsLmdldEFuY2VzdG9yKGVsZW1lbnQxLCBwYXJlbnROYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudDI9IERPTVV0aWwuZ2V0QW5jZXN0b3IoZWxlbWVudDIsIHBhcmVudE5hbWUpO1xuICAgICAgICAgICAgaWYgKHBhcmVudDEgIT09IG51bGwgJiYgcGFyZW50MiAhPSBudWxsICYmIERPTVV0aWwuc2FtZU5vZGUocGFyZW50MSwgcGFyZW50MikpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBcbiAgICAvKipcbiAgICAgKiBUcmF2ZXJzZXMgdXAgdGhlIERPTSB0cmVlIHRvIGZpbmQgdGhlIHNoYWRvdyByb290IChkb2N1bWVudCBmcmFnbWVudCkgdGhhdCBjb250YWlucyB0aGUgZ2l2ZW4gbm9kZS5cbiAgICAgKiBJbXBvcnRhbnQgZm9yIGhhbmRsaW5nIFdlYiBDb21wb25lbnRzIGFuZCBTaGFkb3cgRE9NIHN0cnVjdHVyZXMgaW4gYWNjZXNzaWJpbGl0eSBjaGVja2luZy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBub2RlIC0gVGhlIHN0YXJ0aW5nIG5vZGVcbiAgICAgKiBAcmV0dXJucyBUaGUgc2hhZG93IHJvb3Qgbm9kZSAobm9kZVR5cGUgMTEgPSBET0NVTUVOVF9GUkFHTUVOVF9OT0RFKSwgb3IgbnVsbCBpZiBub25lIGZvdW5kXG4gICAgICovXG4gICAgc3RhdGljIHNoYWRvd1Jvb3ROb2RlKG5vZGU6IE5vZGUpIDogTm9kZSB8IG51bGwge1xuICAgICAgICBsZXQgbmQgPSBub2RlO1xuICAgICAgICB3aGlsZSAobmQgIT0gbnVsbCAmJiBuZC5ub2RlVHlwZSAhPT0gMTEgLyogTm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFICovKVxuICAgICAgICAgICAgbmQgPSBuZC5wYXJlbnROb2RlO1xuICAgICAgICByZXR1cm4gbmQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGRlZXAgY29weSBvZiBhbiBvYmplY3Qgd2hpbGUgcHJlc2VydmluZyBOb2RlIHJlZmVyZW5jZXMgKGRvZXNuJ3QgY2xvbmUgTm9kZSBvYmplY3RzKS5cbiAgICAgKiBVc2VmdWwgd2hlbiBjb3B5aW5nIGRhdGEgc3RydWN0dXJlcyB0aGF0IGNvbnRhaW4gRE9NIG5vZGUgcmVmZXJlbmNlcywgYXMgeW91IHR5cGljYWxseSB3YW50XG4gICAgICogdG8gcHJlc2VydmUgdGhvc2UgcmVmZXJlbmNlcyByYXRoZXIgdGhhbiBhdHRlbXB0aW5nIHRvIGNsb25lIHRoZSBub2RlcyB0aGVtc2VsdmVzLlxuICAgICAqXG4gICAgICogQmVoYXZpb3I6XG4gICAgICogLSBQcmltaXRpdmUgdmFsdWVzOiBEZWVwIGNvcGllZCB2aWEgSlNPTiBzZXJpYWxpemF0aW9uXG4gICAgICogLSBGdW5jdGlvbnM6IFJldHVybmVkIGFzLWlzIChyZWZlcmVuY2UpXG4gICAgICogLSBOb2RlIG9iamVjdHM6IFJldHVybmVkIGFzLWlzIChyZWZlcmVuY2UsIG5vdCBjbG9uZWQpXG4gICAgICogLSBBcnJheXMvT2JqZWN0czogUmVjdXJzaXZlbHkgY29waWVkIHdpdGggdGhlIHNhbWUgcnVsZXNcbiAgICAgKlxuICAgICAqIEBwYXJhbSByaHMgLSBUaGUgb2JqZWN0IHRvIGNvcHkgKHJpZ2h0LWhhbmQgc2lkZSlcbiAgICAgKiBAcmV0dXJucyBBIGNvcHkgb2YgdGhlIG9iamVjdCB3aXRoIE5vZGUgcmVmZXJlbmNlcyBwcmVzZXJ2ZWRcbiAgICAgKi9cbiAgICBzdGF0aWMgb2JqZWN0Q29weVdpdGhOb2RlUmVmcyhyaHM6IGFueSkge1xuICAgICAgICBpZiAoIXJocykgcmV0dXJuIHJocztcbiAgICAgICAgaWYgKHR5cGVvZiByaHMgIT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcmhzID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmhzO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShyaHMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChyaHMgaW5zdGFuY2VvZiBOb2RlIHx8ICEhcmhzLm5vZGVUeXBlKSB7XG4gICAgICAgICAgICByZXR1cm4gcmhzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IHJldFZhbDtcbiAgICAgICAgICAgIGlmIChyaHMuY29uc3RydWN0b3IubmFtZSA9PT0gXCJBcnJheVwiKSB7XG4gICAgICAgICAgICAgICAgcmV0VmFsID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHJocykge1xuICAgICAgICAgICAgICAgICAgICByZXRWYWwucHVzaCh0aGlzLm9iamVjdENvcHlXaXRoTm9kZVJlZnMoaXRlbSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0VmFsID0ge307XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gcmhzKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbFtrZXldID0gdGhpcy5vYmplY3RDb3B5V2l0aE5vZGVSZWZzKHJoc1trZXldKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmluZHMgdGhlIGZpcnN0IGFuY2VzdG9yIGVsZW1lbnQgdGhhdCBoYXMgYSBzcGVjaWZpYyBhdHRyaWJ1dGUgd2l0aCBhIHNwZWNpZmljIHZhbHVlLlxuICAgICAqIFRyYXZlcnNlcyB1cCB0aGUgRE9NIHRyZWUgZnJvbSB0aGUgZ2l2ZW4gZWxlbWVudCB1bnRpbCBhIG1hdGNoaW5nIGFuY2VzdG9yIGlzIGZvdW5kLlxuICAgICAqXG4gICAgICogQHBhcmFtIGVsZW1lbnQgLSBUaGUgc3RhcnRpbmcgZWxlbWVudFxuICAgICAqIEBwYXJhbSBhdHRyTmFtZSAtIFRoZSBhdHRyaWJ1dGUgbmFtZSB0byBzZWFyY2ggZm9yXG4gICAgICogQHBhcmFtIGF0dHJWYWx1ZSAtIFRoZSBleHBlY3RlZCBhdHRyaWJ1dGUgdmFsdWVcbiAgICAgKiBAcmV0dXJucyBUaGUgbWF0Y2hpbmcgYW5jZXN0b3IgZWxlbWVudCwgb3IgbnVsbCBpZiBub25lIGZvdW5kXG4gICAgICogQGV4YW1wbGUgRmluZGluZyBhbiBhbmNlc3RvciB3aXRoIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIG9yIGRhdGEtdGVzdGlkPVwiY29udGFpbmVyXCJcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEFuY2VzdG9yV2l0aEF0dHJpYnV0ZShlbGVtZW50LCBhdHRyTmFtZSwgYXR0clZhbHVlKSB7XG4gICAgICAgIGxldCB3YWxrTm9kZSA9IERPTVdhbGtlci5wYXJlbnROb2RlKGVsZW1lbnQpO1xuICAgICAgICB3aGlsZSAod2Fsa05vZGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGlmICh3YWxrTm9kZS5ub2RlVHlwZSA9PT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLyAmJiAoPEVsZW1lbnQ+d2Fsa05vZGUpLmdldEF0dHJpYnV0ZShhdHRyTmFtZSkgPT09IGF0dHJWYWx1ZSlcbiAgICAgICAgICAgICAgICByZXR1cm4gd2Fsa05vZGU7XG4gICAgICAgICAgICB3YWxrTm9kZSA9IERPTVdhbGtlci5wYXJlbnROb2RlKHdhbGtOb2RlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3Y0L3V0aWwvVmlzVXRpbFwiO1xuLyoqXG4gKiBXYWxrcyBpbiBhIERPTSBvcmRlclxuICogXG4gKiBBc3N1bXB0aW9uIHRoYXQgbm9kZXMgb2Ygc2hhZG93IERPTXMgY2FsbCBhc3NpZ25TbG90cyBvbiB0aGUgc2hhZG93IHJvb3QgYmVmb3JlIFxuICogZG9pbmcgb3RoZXIgcHJvY2Vzc2luZyBpbiB0aGF0IHRyZWUuIElmIHlvdSB3YWxrIGludG8gYSBzaGFkb3cgcm9vdCwgdGhlIERPTVdhbGtlclxuICogd2lsbCBkbyBpdCBhdXRvbWF0aWNhbGx5LlxuICogXG4gKiBTZWUgYWxzbyAuLi9hcmlhL0FSSUFXYWxrZXJcbiAqL1xuZXhwb3J0IGNsYXNzIERPTVdhbGtlciB7XG4gICAgcm9vdCA6IE5vZGU7XG4gICAgbm9kZSA6IE5vZGU7XG4gICAgYkVuZFRhZzogYm9vbGVhbjtcbiAgICBjb25zaWRlckhpZGRlbjogYm9vbGVhbjtcbiAgICBERUJVRzogYm9vbGVhbjtcblxuICAgIGNvbnN0cnVjdG9yKGVsZW1lbnQgOiBOb2RlLCBiRW5kPyA6IGJvb2xlYW4sIHJvb3Q/IDogTm9kZSwgY29uc2lkZXJIaWRkZW4/IDogYm9vbGVhbiwgREVCVUc/OiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuREVCVUcgPSAhIURFQlVHO1xuICAgICAgICB0aGlzLnJvb3QgPSByb290IHx8ICgoZWxlbWVudCAmJiBlbGVtZW50Lm93bmVyRG9jdW1lbnQpID8gZWxlbWVudC5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudDogZWxlbWVudCk7XG4gICAgICAgIGlmICh0aGlzLnJvb3Qubm9kZVR5cGUgPT09IDkpIHtcbiAgICAgICAgICAgIHRoaXMucm9vdCA9ICh0aGlzLnJvb3QgYXMgRG9jdW1lbnQpLmRvY3VtZW50RWxlbWVudFxuICAgICAgICB9XG4gICAgICAgIHRoaXMubm9kZSA9IGVsZW1lbnQ7XG4gICAgICAgIGlmICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDkpIHtcbiAgICAgICAgICAgIHRoaXMubm9kZSA9ICh0aGlzLm5vZGUgYXMgRG9jdW1lbnQpLmRvY3VtZW50RWxlbWVudFxuICAgICAgICB9XG4gICAgICAgIHRoaXMuYkVuZFRhZyA9IChiRW5kID09IHVuZGVmaW5lZCA/IGZhbHNlIDogYkVuZCA9PSB0cnVlKTtcbiAgICAgICAgdGhpcy5jb25zaWRlckhpZGRlbiA9IGNvbnNpZGVySGlkZGVuIHx8IGZhbHNlO1xuICAgIH1cblxuICAgIGVsZW0oKSA6IEhUTUxFbGVtZW50IHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgJiYgdGhpcy5ub2RlIGFzIEhUTUxFbGVtZW50IHx8IG51bGw7XG4gICAgfVxuICAgIFxuICAgIHN0YXRpYyBwYXJlbnROb2RlKG5vZGU6IE5vZGUpIDogTm9kZSB8IG51bGwge1xuICAgICAgICBpZiAobm9kZSA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBwIDogTm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgaWYgKChub2RlIGFzIGFueSkuc2xvdE93bmVyKSB7XG4gICAgICAgICAgICBwID0gKG5vZGUgYXMgYW55KS5zbG90T3duZXI7XG4gICAgICAgIH0gZWxzZSBpZiAoKG5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQpIHtcbiAgICAgICAgICAgIHAgPSAobm9kZSBhcyBhbnkpLm93bmVyRWxlbWVudDtcbiAgICAgICAgfSBlbHNlIGlmIChwICYmIHAubm9kZVR5cGUgPT09IDExKSB7XG4gICAgICAgICAgICBpZiAoKHAgYXMgU2hhZG93Um9vdCkuaG9zdCkge1xuICAgICAgICAgICAgICAgIHAgPSAocCBhcyBTaGFkb3dSb290KS5ob3N0O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcDtcbiAgICB9XG5cbiAgICBzdGF0aWMgcGFyZW50RWxlbWVudChub2RlOiBOb2RlKSA6IEVsZW1lbnQgfCBudWxsIHtcbiAgICAgICAgbGV0IGVsZW0gOiBFbGVtZW50ID0gbm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBkbyB7IFxuICAgICAgICAgICAgZWxlbSA9IERPTVdhbGtlci5wYXJlbnROb2RlKGVsZW0pIGFzIEVsZW1lbnQ7XG4gICAgICAgIH0gd2hpbGUgKGVsZW0gJiYgZWxlbS5ub2RlVHlwZSAhPT0gMSk7XG4gICAgICAgIHJldHVybiBlbGVtO1xuICAgIH1cblxuICAgIHN0YXRpYyBhc3NpZ25TbG90cyhyb290OiBTaGFkb3dSb290KSB7XG4gICAgICAgIGxldCBzbG90cyA9IHJvb3QucXVlcnlTZWxlY3RvckFsbChcInNsb3RcIik7XG4gICAgICAgIGZvciAobGV0IGlTbG90PTA7IGlTbG90PHNsb3RzLmxlbmd0aDsgKytpU2xvdCkge1xuICAgICAgICAgICAgbGV0IHByb2Nlc3NTbG90ID0gc2xvdHNbaVNsb3RdO1xuICAgICAgICAgICAgbGV0IGFzc2lnbmVkTm9kZXMgPSBwcm9jZXNzU2xvdC5hc3NpZ25lZE5vZGVzKCk7XG4gICAgICAgICAgICBmb3IgKGxldCBpQXNzaWduZWQ9MDsgaUFzc2lnbmVkPGFzc2lnbmVkTm9kZXMubGVuZ3RoOyArK2lBc3NpZ25lZCkge1xuICAgICAgICAgICAgICAgIChhc3NpZ25lZE5vZGVzW2lBc3NpZ25lZF0gYXMgYW55KS5zbG90T3duZXIgPSBwcm9jZXNzU2xvdDtcbiAgICAgICAgICAgICAgICAoYXNzaWduZWROb2Rlc1tpQXNzaWduZWRdIGFzIGFueSkuc2xvdEluZGV4ID0gaUFzc2lnbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGZpcnN0Q2hpbGROb3RPd25lZEJ5U2xvdChub2RlOiBOb2RlKSB7XG4gICAgICAgIGxldCByZXRWYWwgPSBub2RlLmZpcnN0Q2hpbGQ7XG4gICAgICAgIHdoaWxlIChyZXRWYWwgJiYgKHJldFZhbCBhcyBhbnkpLnNsb3RPd25lcikge1xuICAgICAgICAgICAgcmV0VmFsID0gcmV0VmFsLm5leHRTaWJsaW5nO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgc3RhdGljIGxhc3RDaGlsZE5vdE93bmVkQnlTbG90KG5vZGU6IE5vZGUpIHtcbiAgICAgICAgbGV0IHJldFZhbCA9IG5vZGUubGFzdENoaWxkO1xuICAgICAgICB3aGlsZSAocmV0VmFsICYmIChyZXRWYWwgYXMgYW55KS5zbG90T3duZXIpIHtcbiAgICAgICAgICAgIHJldFZhbCA9IHJldFZhbC5wcmV2aW91c1NpYmxpbmc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICBzdGF0aWMgbmV4dFNpYmxpbmdOb3RPd25lZEJ5U2xvdChub2RlOk5vZGUpIHtcbiAgICAgICAgbGV0IHJldFZhbCA9IG5vZGUubmV4dFNpYmxpbmc7XG4gICAgICAgIHdoaWxlIChyZXRWYWwgJiYgKHJldFZhbCBhcyBhbnkpLnNsb3RPd25lcikge1xuICAgICAgICAgICAgcmV0VmFsID0gcmV0VmFsLm5leHRTaWJsaW5nO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgc3RhdGljIHByZXZpb3VzU2libGluZ05vdE93bmVkQnlTbG90KG5vZGU6Tm9kZSkge1xuICAgICAgICBsZXQgcmV0VmFsID0gbm9kZS5wcmV2aW91c1NpYmxpbmc7XG4gICAgICAgIHdoaWxlIChyZXRWYWwgJiYgKHJldFZhbCBhcyBhbnkpLnNsb3RPd25lcikge1xuICAgICAgICAgICAgcmV0VmFsID0gcmV0VmFsLnByZXZpb3VzU2libGluZztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIGF0Um9vdCgpIDogYm9vbGVhbiB7XG4gICAgICAgIGlmICgodGhpcy5ub2RlIGFzIGFueSkub3duZXJFbGVtZW50KSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLnJvb3QgPT09IHRoaXMubm9kZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5yb290LmlzU2FtZU5vZGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnJvb3QuaXNTYW1lTm9kZSh0aGlzLm5vZGUpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucm9vdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucm9vdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbih0aGlzLm5vZGUpID09PSAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gTm90IHN1cHBvcnRlZCBpbiB0aGlzIGVudmlyb25tZW50IC0gdHJ5IG91ciBiZXN0XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5ub2RlLnBhcmVudE5vZGUgPT09IG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBERUJVR0lEWCA9IDA7XG4gICAgaW5kZW50ID0gMDtcbiAgICBuZXh0Tm9kZSgpIDogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGluZGVudCA9ICgpID0+IHtcbiAgICAgICAgICAgIGxldCBzID0gXCJcIjtcbiAgICAgICAgICAgIGZvciAobGV0IGlkeD0wOyBpZHg8dGhpcy5pbmRlbnQ7ICsraWR4KSB7XG4gICAgICAgICAgICAgICAgcyArPSBcIiBcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzO1xuICAgICAgICB9XG4gICAgICAgIGxldCBEQkcgPSBmYWxzZTsvL3RoaXMuREVCVUdJRFggPj0gNyAmJiB0aGlzLkRFQlVHSURYIDw9IDEwO1xuICAgICAgICBsZXQgc3RhcnROYW1lID0gdGhpcy5ub2RlLm5vZGVOYW1lO1xuICAgICAgICBpZiAoIXRoaXMubm9kZSkge1xuICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyh0aGlzLm5vZGUubm9kZU5hbWUsIHRoaXMuYkVuZFRhZz9cIkVORFwiOlwiU1RBUlRcIiwgdGhpcy5ub2RlLm5vZGVUeXBlID09PSAxICYmICh0aGlzLm5vZGUgYXMgYW55KS5nZXRBdHRyaWJ1dGUoXCJpZFwiKSk7XG4gICAgICAgICAgICBpZiAoIXRoaXMuYkVuZFRhZykge1xuICAgICAgICAgICAgICAgIGxldCBpZnJhbWVOb2RlID0gKHRoaXMubm9kZSBhcyBIVE1MSUZyYW1lRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgbGV0IGVsZW1lbnROb2RlID0gKHRoaXMubm9kZSBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgbGV0IHNsb3RFbGVtZW50ID0gKHRoaXMubm9kZSBhcyBIVE1MU2xvdEVsZW1lbnQpXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLyBcbiAgICAgICAgICAgICAgICAgICAgJiYgdGhpcy5ub2RlLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiSUZSQU1FXCJcbiAgICAgICAgICAgICAgICAgICAgJiYgKHRoaXMuY29uc2lkZXJIaWRkZW4gPyBWaXNVdGlsLmlzTm9kZVZpc2libGUoaWZyYW1lTm9kZSkgOiB0cnVlKVxuICAgICAgICAgICAgICAgICAgICAmJiBpZnJhbWVOb2RlLmNvbnRlbnREb2N1bWVudFxuICAgICAgICAgICAgICAgICAgICAmJiBpZnJhbWVOb2RlLmNvbnRlbnREb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBEQkcgJiYgY29uc29sZS5sb2coXCIhISFJbnRvIEZyYW1lXCIpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgb3duZXJFbGVtZW50ID0gdGhpcy5ub2RlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBpZnJhbWVOb2RlLmNvbnRlbnREb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICh0aGlzLm5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQgPSBvd25lckVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8gXG4gICAgICAgICAgICAgICAgICAgICYmICh0aGlzLmNvbnNpZGVySGlkZGVuID8gVmlzVXRpbC5pc05vZGVWaXNpYmxlKGVsZW1lbnROb2RlKSA6IHRydWUpXG4gICAgICAgICAgICAgICAgICAgICYmIGVsZW1lbnROb2RlLnNoYWRvd1Jvb3RcbiAgICAgICAgICAgICAgICAgICAgJiYgZWxlbWVudE5vZGUuc2hhZG93Um9vdC5maXJzdENoaWxkKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgREJHICYmIGNvbnNvbGUubG9nKFwiISEhSW50byBzaGFkb3cgcm9vdFwiKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG93bmVyRWxlbWVudCA9IHRoaXMubm9kZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gZWxlbWVudE5vZGUuc2hhZG93Um9vdDtcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMubm9kZSBhcyBhbnkpLm93bmVyRWxlbWVudCA9IG93bmVyRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgRE9NV2Fsa2VyLmFzc2lnblNsb3RzKHRoaXMubm9kZSBhcyBTaGFkb3dSb290KTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMVxuICAgICAgICAgICAgICAgICAgICAmJiBlbGVtZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInNsb3RcIlxuICAgICAgICAgICAgICAgICAgICAmJiBzbG90RWxlbWVudC5hc3NpZ25lZE5vZGVzKCkubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIERCRyAmJiBjb25zb2xlLmxvZyhcIiEhIUludG8gc2xvdFwiKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gc2xvdEVsZW1lbnQuYXNzaWduZWROb2RlcygpWzBdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLyB8fCB0aGlzLm5vZGUubm9kZVR5cGUgPT09IDExIC8qIE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSAqLylcbiAgICAgICAgICAgICAgICAgICAgJiYgRE9NV2Fsa2VyLmZpcnN0Q2hpbGROb3RPd25lZEJ5U2xvdCh0aGlzLm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIERCRyAmJiBjb25zb2xlLmxvZyhcIiEhIUZpcnN0IGNoaWxkXCIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBET01XYWxrZXIuZmlyc3RDaGlsZE5vdE93bmVkQnlTbG90KHRoaXMubm9kZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgREJHICYmIGNvbnNvbGUubG9nKFwiISEhRmxpcCB0byBlbmQgdGFnXCIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgREJHICYmIGNvbnNvbGUubG9nKFwiISEhMVwiKTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5hdFJvb3QoKSkge1xuICAgICAgICAgICAgICAgICAgICBEQkcgJiYgY29uc29sZS5sb2coXCIhISFEb25lIGF0IHJvb3RcIik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCh0aGlzLm5vZGUgYXMgYW55KS5zbG90T3duZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNsb3RPd25lciA9ICh0aGlzLm5vZGUgYXMgYW55KS5zbG90T3duZXI7XG4gICAgICAgICAgICAgICAgICAgIGxldCBuZXh0U2xvdEluZGV4ID0gKHRoaXMubm9kZSBhcyBhbnkpLnNsb3RJbmRleCsxO1xuICAgICAgICAgICAgICAgICAgICAvLyBkZWxldGUgKHRoaXMubm9kZSBhcyBhbnkpLnNsb3RPd25lcjtcbiAgICAgICAgICAgICAgICAgICAgLy8gZGVsZXRlICh0aGlzLm5vZGUgYXMgYW55KS5zbG90SW5kZXg7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0U2xvdEluZGV4IDwgc2xvdE93bmVyLmFzc2lnbmVkTm9kZXMoKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIERCRyAmJiBjb25zb2xlLmxvZyhcIiEhIU5leHQgc2xvdCBjaGlsZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHNsb3RPd25lci5hc3NpZ25lZE5vZGVzKClbbmV4dFNsb3RJbmRleF07XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIERCRyAmJiBjb25zb2xlLmxvZyhcIiEhIUJhY2sgdXAgdG8gc2xvdCBvd25lclwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHNsb3RPd25lcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCh0aGlzLm5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgREJHICYmIGNvbnNvbGUubG9nKFwiISEhVXAgdG8gZnJhbWUgb3duZXJcIik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9ICh0aGlzLm5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChET01XYWxrZXIubmV4dFNpYmxpbmdOb3RPd25lZEJ5U2xvdCh0aGlzLm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIERCRyAmJiBjb25zb2xlLmxvZyhcIiEhIU5leHQgc2libGluZ1wiKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gRE9NV2Fsa2VyLm5leHRTaWJsaW5nTm90T3duZWRCeVNsb3QodGhpcy5ub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5iRW5kVGFnID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm5vZGUucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgICAgICAgICBEQkcgJiYgY29uc29sZS5sb2coXCIhISFQYXJlbnRcIik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHRoaXMubm9kZS5wYXJlbnROb2RlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIERCRyAmJiBjb25zb2xlLmxvZyhcIiEhIURvbmUgd2l0aCB3YWxrXCIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKERCRyAmJiAoXG4gICAgICAgICAgICAgICAgKHRoaXMubm9kZS5ub2RlVHlwZSAhPT0gMSAmJiB0aGlzLm5vZGUubm9kZVR5cGUgIT09IDExICYmIHRoaXMubm9kZS5ub2RlVHlwZSAhPT0gMyApXG4gICAgICAgICAgICAgICAgfHwgKHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSAmJiAodGhpcy5ub2RlIGFzIEVsZW1lbnQpLmdldEF0dHJpYnV0ZShcImFDaGVja2VyXCIpID09PSBcIkFDRVwiKVxuICAgICAgICAgICAgKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuREVCVUcgJiYgY29uc29sZS5sb2coaW5kZW50KCkrYDwke3RoaXMuYkVuZFRhZz9cIi9cIjpcIlwifSR7dGhpcy5ub2RlLm5vZGVOYW1lfT4gKGZyb20gJHtzdGFydE5hbWV9KSAke3RoaXMuREVCVUdJRFgrK30gU0tJUFBFRGApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IHdoaWxlIChcbiAgICAgICAgICAgICh0aGlzLm5vZGUubm9kZVR5cGUgIT09IDEgJiYgdGhpcy5ub2RlLm5vZGVUeXBlICE9PSAxMSAmJiB0aGlzLm5vZGUubm9kZVR5cGUgIT09IDMgKVxuICAgICAgICAgICAgfHwgKHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSAmJiAodGhpcy5ub2RlIGFzIEVsZW1lbnQpLmdldEF0dHJpYnV0ZShcImFDaGVja2VyXCIpID09PSBcIkFDRVwiKVxuICAgICAgICApO1xuICAgICAgICBpZiAodGhpcy5iRW5kVGFnKSB0aGlzLmluZGVudCAtPSAyO1xuICAgICAgICB0aGlzLkRFQlVHICYmIGNvbnNvbGUubG9nKGluZGVudCgpK2A8JHt0aGlzLmJFbmRUYWc/XCIvXCI6XCJcIn0ke3RoaXMubm9kZS5ub2RlTmFtZX0+IChmcm9tICR7c3RhcnROYW1lfSkgJHt0aGlzLkRFQlVHSURYKyt9YCk7XG4gICAgICAgIHRoaXMuREVCVUcgJiYgKHRoaXMubm9kZSBhcyBhbnkpLnNsb3RPd25lciAmJiBjb25zb2xlLmxvZyhpbmRlbnQoKStgc2xvdE93bmVyOiAkeyh0aGlzLm5vZGUgYXMgYW55KS5zbG90T3duZXIubm9kZU5hbWV9YCk7XG4gICAgICAgIHRoaXMuREVCVUcgJiYgKHRoaXMubm9kZSBhcyBhbnkpLnNsb3RJbmRleCAmJiBjb25zb2xlLmxvZyhpbmRlbnQoKStgc2xvdEluZGV4OiAkeyh0aGlzLm5vZGUgYXMgYW55KS5zbG90SW5kZXh9YCk7XG4gICAgICAgIHRoaXMuREVCVUcgJiYgKHRoaXMubm9kZSBhcyBhbnkpLm93bmVyRWxlbWVudCAmJiBjb25zb2xlLmxvZyhpbmRlbnQoKStgb3duZXJFbGVtZW50OiAkeyh0aGlzLm5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQubm9kZU5hbWV9YCk7XG4gICAgICAgIGlmICghdGhpcy5iRW5kVGFnKSB0aGlzLmluZGVudCArPSAyO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwcmV2Tm9kZSgpIDogYm9vbGVhbiB7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmJFbmRUYWcpIHtcbiAgICAgICAgICAgICAgICBsZXQgaWZyYW1lTm9kZSA9ICh0aGlzLm5vZGUgYXMgSFRNTElGcmFtZUVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGxldCBlbGVtZW50Tm9kZSA9ICh0aGlzLm5vZGUgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm5vZGUubm9kZVR5cGUgPT09IDEgLyogTm9kZS5FTEVNRU5UX05PREUgKi8gXG4gICAgICAgICAgICAgICAgICAgICYmIHRoaXMubm9kZS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIklGUkFNRVwiXG4gICAgICAgICAgICAgICAgICAgICYmICh0aGlzLmNvbnNpZGVySGlkZGVuID8gVmlzVXRpbC5pc05vZGVWaXNpYmxlKGlmcmFtZU5vZGUpIDogdHJ1ZSlcbiAgICAgICAgICAgICAgICAgICAgJiYgaWZyYW1lTm9kZS5jb250ZW50RG9jdW1lbnRcbiAgICAgICAgICAgICAgICAgICAgJiYgaWZyYW1lTm9kZS5jb250ZW50RG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSBcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBvd25lckVsZW1lbnQgPSB0aGlzLm5vZGU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IGlmcmFtZU5vZGUuY29udGVudERvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMubm9kZSBhcyBhbnkpLm93bmVyRWxlbWVudCA9IG93bmVyRWxlbWVudDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqL1xuICAgICAgICAgICAgICAgICAgICAmJiAodGhpcy5jb25zaWRlckhpZGRlbiA/IFZpc1V0aWwuaXNOb2RlVmlzaWJsZShlbGVtZW50Tm9kZSkgOiB0cnVlKVxuICAgICAgICAgICAgICAgICAgICAmJiBlbGVtZW50Tm9kZS5zaGFkb3dSb290XG4gICAgICAgICAgICAgICAgICAgICYmIGVsZW1lbnROb2RlLnNoYWRvd1Jvb3QubGFzdENoaWxkKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG93bmVyRWxlbWVudCA9IHRoaXMubm9kZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gZWxlbWVudE5vZGUuc2hhZG93Um9vdDtcbiAgICAgICAgICAgICAgICAgICAgKHRoaXMubm9kZSBhcyBhbnkpLm93bmVyRWxlbWVudCA9IG93bmVyRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgRE9NV2Fsa2VyLmFzc2lnblNsb3RzKHRoaXMubm9kZSBhcyBTaGFkb3dSb290KTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMVxuICAgICAgICAgICAgICAgICAgICAmJiBlbGVtZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInNsb3RcIlxuICAgICAgICAgICAgICAgICAgICAmJiAoZWxlbWVudE5vZGUgYXMgSFRNTFNsb3RFbGVtZW50KS5hc3NpZ25lZE5vZGVzKCkubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEVudGVyIHNsb3Qgd2l0aCBhc3NpZ25lZCBub2RlcyAtIGdvIHRvIGxhc3QgYXNzaWduZWQgbm9kZVxuICAgICAgICAgICAgICAgICAgICBsZXQgc2xvdEVsZW1lbnQgPSBlbGVtZW50Tm9kZSBhcyBIVE1MU2xvdEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IHNsb3RFbGVtZW50LmFzc2lnbmVkTm9kZXMoKVtzbG90RWxlbWVudC5hc3NpZ25lZE5vZGVzKCkubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgodGhpcy5ub2RlLm5vZGVUeXBlID09PSAxIC8qIE5vZGUuRUxFTUVOVF9OT0RFICovIHx8IHRoaXMubm9kZS5ub2RlVHlwZSA9PT0gMTEpXG4gICAgICAgICAgICAgICAgICAgICYmIERPTVdhbGtlci5sYXN0Q2hpbGROb3RPd25lZEJ5U2xvdCh0aGlzLm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9IERPTVdhbGtlci5sYXN0Q2hpbGROb3RPd25lZEJ5U2xvdCh0aGlzLm5vZGUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuYXRSb290KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHRoaXMubm9kZSBhcyBhbnkpLnNsb3RPd25lcikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgc2xvdE93bmVyID0gKHRoaXMubm9kZSBhcyBhbnkpLnNsb3RPd25lcjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHByZXZTbG90SW5kZXggPSAodGhpcy5ub2RlIGFzIGFueSkuc2xvdEluZGV4IC0gMTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByZXZTbG90SW5kZXggPj0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gc2xvdE93bmVyLmFzc2lnbmVkTm9kZXMoKVtwcmV2U2xvdEluZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vZGUgPSBzbG90T3duZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJFbmRUYWcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoRE9NV2Fsa2VyLnByZXZpb3VzU2libGluZ05vdE93bmVkQnlTbG90KHRoaXMubm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gRE9NV2Fsa2VyLnByZXZpb3VzU2libGluZ05vdE93bmVkQnlTbG90KHRoaXMubm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICgodGhpcy5ub2RlIGFzIGFueSkub3duZXJFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZSA9ICh0aGlzLm5vZGUgYXMgYW55KS5vd25lckVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5ub2RlLnBhcmVudE5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub2RlID0gdGhpcy5ub2RlLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYkVuZFRhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gd2hpbGUgKFxuICAgICAgICAgICAgKHRoaXMubm9kZS5ub2RlVHlwZSAhPT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLyAmJiB0aGlzLm5vZGUubm9kZVR5cGUgIT09IDExICYmIHRoaXMubm9kZS5ub2RlVHlwZSAhPT0gMyApXG4gICAgICAgICAgICB8fCAodGhpcy5ub2RlLm5vZGVUeXBlID09PSAxICYmICh0aGlzLm5vZGUgYXMgRWxlbWVudCkuZ2V0QXR0cmlidXRlKFwiYUNoZWNrZXJcIikgPT09IFwiQUNFXCIpXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgIENvcHlyaWdodDo6IDIwMjAtIElCTSwgSW5jXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IGVSdWxlUG9saWN5IH0gZnJvbSBcIi4vSVJ1bGVcIlxuXG5leHBvcnQgZW51bSBlVG9vbGtpdExldmVsIHtcbiAgICBMRVZFTF9PTkUgPSBcIjFcIixcbiAgICBMRVZFTF9UV08gPSBcIjJcIixcbiAgICBMRVZFTF9USFJFRSA9IFwiM1wiLFxuICAgIExFVkVMX0ZPVVIgPSBcIjRcIlxufVxuXG5leHBvcnQgZW51bSBlR3VpZGVsaW5lQ2F0ZWdvcnkge1xuICAgIEFDQ0VTU0lCSUxJVFkgPSBcIkFjY2Vzc2liaWxpdHlcIixcbiAgICBERVNJR04gPSBcIkRlc2lnblwiLFxuICAgIE9USEVSID0gXCJPdGhlclwiXG59XG5cbmV4cG9ydCBlbnVtIGVHdWlkZWxpbmVUeXBlIHtcbiAgICBERUZBVUxUID0gXCJkZWZhdWx0XCIsXG4gICAgRVhURU5TSU9OID0gXCJleHRlbnNpb25cIlxufVxuXG5leHBvcnQgdHlwZSBDaGVja3BvaW50ID0ge1xuICAgIG51bTogc3RyaW5nLFxuICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vYWN0LXJ1bGVzL2FjdC10b29scy9ibG9iL21haW4vc3JjL2RhdGEvc2MtdXJscy5qc29uXG4gICAgc2NJZD86IHN0cmluZyxcbiAgICAvLyBKQ0g6IGFkZCBuYW1lIG9mIGNoZWNrcG9pbnQgYW5kIHN1bW1hcnkgZGVzY3JpcHRpb25cbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgd2NhZ0xldmVsOiBzdHJpbmcsXG4gICAgc3VtbWFyeTogc3RyaW5nLFxuICAgIHJ1bGVzPzogQXJyYXk8eyBcbiAgICAgICAgaWQ6IHN0cmluZywgXG4gICAgICAgIC8vIChvcHRpb25hbCkgUmVhc29uIGNvZGVzIHRoYXQgdGhpcyBydWxlc2V0IG1hcHBpbmcgYXBwbGllcyB0bywgXG4gICAgICAgIC8vIG9yIGFsbCBpZiBub3Qgc3BlY2lmaWVkXG4gICAgICAgIHJlYXNvbkNvZGVzPzogc3RyaW5nW10sXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeSwgXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbCxcbiAgICAgICAgZW5hYmxlZD86IGJvb2xlYW5cbiAgICB9PlxufVxuXG5leHBvcnQgdHlwZSBHdWlkZWxpbmUgPSB7XG4gICAgaWQ6IHN0cmluZyxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgY2F0ZWdvcnk6IGVHdWlkZWxpbmVDYXRlZ29yeSxcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nLFxuICAgIHR5cGU/OiBlR3VpZGVsaW5lVHlwZSxcbiAgICBjaGVja3BvaW50czogQXJyYXk8Q2hlY2twb2ludD5cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMC0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgZUd1aWRlbGluZUNhdGVnb3J5LCBlR3VpZGVsaW5lVHlwZSB9IGZyb20gXCIuL0lHdWlkZWxpbmVcIjtcbmltcG9ydCB7IElNYXBSZXN1bHQgfSBmcm9tIFwiLi9JTWFwcGVyXCI7XG5pbXBvcnQgeyBObHNNYXAgYXMgTmxzTWFwTmV3LCBIZWxwTWFwIGFzIEhlbHBNYXBOZXcsIElFbmdpbmUgYXMgSUVuZ2luZU5ldyB9IGZyb20gXCIuL0lFbmdpbmVcIjtcbmltcG9ydCB7IFJlcG9ydCBhcyBSZXBvcnROZXcgfSBmcm9tIFwiLi9JUmVwb3J0XCI7XG5pbXBvcnQgeyBlVG9vbGtpdExldmVsIGFzIGVUb29sa2l0TGV2ZWxOZXcgfSBmcm9tIFwiLi9JR3VpZGVsaW5lXCJcbmltcG9ydCB7IEJvdW5kcyB9IGZyb20gXCIuL0lCb3VuZHNcIjtcblxuZXhwb3J0IGVudW0gZVJ1bGVDb25maWRlbmNlIHtcbiAgICBQQVNTID0gXCJQQVNTXCIsXG4gICAgRkFJTCA9IFwiRkFJTFwiLFxuICAgIFBPVEVOVElBTCA9IFwiUE9URU5USUFMXCIsXG4gICAgTUFOVUFMID0gXCJNQU5VQUxcIlxufVxuXG5leHBvcnQgZW51bSBlUnVsZVBvbGljeSB7XG4gICAgVklPTEFUSU9OID0gXCJWSU9MQVRJT05cIixcbiAgICBSRUNPTU1FTkRBVElPTiA9IFwiUkVDT01NRU5EQVRJT05cIixcbiAgICBJTkZPUk1BVElPTiA9IFwiSU5GT1JNQVRJT05cIlxufVxuXG5leHBvcnQgZnVuY3Rpb24gUnVsZVBhc3MocmVhc29uSWQ6IG51bWJlciB8IHN0cmluZywgbWVzc2FnZUFyZ3M/IDogc3RyaW5nW10sIGFwaUFyZ3M/IDogYW55W10pIDogUnVsZVJlc3VsdCB7XG4gICAgaWYgKHR5cGVvZiByZWFzb25JZCA9PT0gXCJ1bmRlZmluZWRcIiB8fCByZWFzb25JZCA9PT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKFwiUmVhc29uIElEIG11c3QgYmUgZGVmaW5lZFwiKTtcbiAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogW2VSdWxlUG9saWN5LklORk9STUFUSU9OLCBlUnVsZUNvbmZpZGVuY2UuUEFTU10sXG4gICAgICAgIHJlYXNvbklkOiByZWFzb25JZCxcbiAgICAgICAgbWVzc2FnZUFyZ3M6IG1lc3NhZ2VBcmdzIHx8IFtdLFxuICAgICAgICBhcGlBcmdzOiBhcGlBcmdzIHx8IFtdXG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gUnVsZVJlbmRlcihyZWFzb25JZDogbnVtYmVyIHwgc3RyaW5nLCBtZXNzYWdlQXJncz8gOiBzdHJpbmdbXSwgYXBpQXJncz8gOiBhbnlbXSkgOiBSdWxlUmVzdWx0IHtcbiAgICBpZiAodHlwZW9mIHJlYXNvbklkID09PSBcInVuZGVmaW5lZFwiIHx8IHJlYXNvbklkID09PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoXCJSZWFzb24gSUQgbXVzdCBiZSBkZWZpbmVkXCIpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiBbZVJ1bGVQb2xpY3kuSU5GT1JNQVRJT04sIGVSdWxlQ29uZmlkZW5jZS5QQVNTXSxcbiAgICAgICAgcmVhc29uSWQ6IDAsXG4gICAgICAgIG1lc3NhZ2VBcmdzOiBtZXNzYWdlQXJncyB8fCBbXSxcbiAgICAgICAgYXBpQXJnczogYXBpQXJncyB8fCBbXVxuICAgIH1cbn1cbmV4cG9ydCBmdW5jdGlvbiBSdWxlRmFpbChyZWFzb25JZDogbnVtYmVyIHwgc3RyaW5nLCBtZXNzYWdlQXJncz8gOiBzdHJpbmdbXSwgYXBpQXJncz8gOiBhbnlbXSkgOiBSdWxlUmVzdWx0IHtcbiAgICBpZiAodHlwZW9mIHJlYXNvbklkID09PSBcInVuZGVmaW5lZFwiIHx8IHJlYXNvbklkID09PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoXCJSZWFzb24gSUQgbXVzdCBiZSBkZWZpbmVkXCIpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiBbZVJ1bGVQb2xpY3kuSU5GT1JNQVRJT04sIGVSdWxlQ29uZmlkZW5jZS5GQUlMXSxcbiAgICAgICAgcmVhc29uSWQ6IHJlYXNvbklkLFxuICAgICAgICBtZXNzYWdlQXJnczogbWVzc2FnZUFyZ3MgfHwgW10sXG4gICAgICAgIGFwaUFyZ3M6IGFwaUFyZ3MgfHwgW11cbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBSdWxlUG90ZW50aWFsKHJlYXNvbklkOiBudW1iZXIgfCBzdHJpbmcsIG1lc3NhZ2VBcmdzPyA6IHN0cmluZ1tdLCBhcGlBcmdzPyA6IGFueVtdKSA6IFJ1bGVSZXN1bHQge1xuICAgIGlmICh0eXBlb2YgcmVhc29uSWQgPT09IFwidW5kZWZpbmVkXCIgfHwgcmVhc29uSWQgPT09IG51bGwpIHRocm93IG5ldyBFcnJvcihcIlJlYXNvbiBJRCBtdXN0IGJlIGRlZmluZWRcIik7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdmFsdWU6IFtlUnVsZVBvbGljeS5JTkZPUk1BVElPTiwgZVJ1bGVDb25maWRlbmNlLlBPVEVOVElBTF0sXG4gICAgICAgIHJlYXNvbklkOiByZWFzb25JZCxcbiAgICAgICAgbWVzc2FnZUFyZ3M6IG1lc3NhZ2VBcmdzIHx8IFtdLFxuICAgICAgICBhcGlBcmdzOiBhcGlBcmdzIHx8IFtdXG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gUnVsZU1hbnVhbChyZWFzb25JZDogbnVtYmVyIHwgc3RyaW5nLCBtZXNzYWdlQXJncz8gOiBzdHJpbmdbXSwgYXBpQXJncz8gOiBhbnlbXSkgOiBSdWxlUmVzdWx0IHtcbiAgICBpZiAodHlwZW9mIHJlYXNvbklkID09PSBcInVuZGVmaW5lZFwiIHx8IHJlYXNvbklkID09PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoXCJSZWFzb24gSUQgbXVzdCBiZSBkZWZpbmVkXCIpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHZhbHVlOiBbZVJ1bGVQb2xpY3kuSU5GT1JNQVRJT04sIGVSdWxlQ29uZmlkZW5jZS5NQU5VQUxdLFxuICAgICAgICByZWFzb25JZDogcmVhc29uSWQsXG4gICAgICAgIG1lc3NhZ2VBcmdzOiBtZXNzYWdlQXJncyB8fCBbXSxcbiAgICAgICAgYXBpQXJnczogYXBpQXJncyB8fCBbXVxuICAgIH1cbn1cblxuZXhwb3J0IHR5cGUgUnVsZVJlc3VsdCA9IHtcbiAgICB2YWx1ZTogW2VSdWxlUG9saWN5LCBlUnVsZUNvbmZpZGVuY2VdLFxuICAgIHJlYXNvbklkPzogbnVtYmVyIHwgc3RyaW5nLFxuICAgIG1lc3NhZ2VBcmdzPzogc3RyaW5nW10sXG4gICAgYXBpQXJncz86IGFueVtdXG59XG5cbmV4cG9ydCB0eXBlIElzc3VlID0gUnVsZVJlc3VsdCAmIHtcbiAgICBydWxlSWQ6IHN0cmluZyxcblxuICAgIG5vZGU6IE5vZGUsXG4gICAgLy8gbmFtZXNwYWNlOiBzdHJpbmcsXG4gICAgY2F0ZWdvcnk/OiBlR3VpZGVsaW5lQ2F0ZWdvcnksXG4gICAgcGF0aDogeyBbbnM6IHN0cmluZ10gOiBzdHJpbmcgfSxcblxuICAgIHJ1bGVUaW1lOiBudW1iZXIsXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIGJvdW5kcz86IEJvdW5kcyxcbiAgICBzbmlwcGV0OiBzdHJpbmcsXG4gICAgc291cmNlPzogc3RyaW5nLFxuICAgIGxldmVsPzogc3RyaW5nXG59XG5cbmV4cG9ydCB0eXBlIFJ1bGVDb250ZXh0SGllcmFyY2h5ID0geyBbbmFtZXNwYWNlOiBzdHJpbmddIDogSU1hcFJlc3VsdFtdIH07XG5cbmV4cG9ydCB0eXBlIFJ1bGVDb250ZXh0ID0ge1xuICAgIFtuYW1lc3BhY2U6IHN0cmluZ10gOiBJTWFwUmVzdWx0XG59XG5cbmV4cG9ydCB0eXBlIFJ1bGUgPSB7XG4gICAgLy8gVW5pcXVlIHN0cmluZyBpZGVudGlmaWVyIGZvciB0aGlzIHJ1bGUgKHNob3VsZCBiZSBodW1hbiB1bmRlcnN0YW5kYWJsZSlcbiAgICAvLyBOTFMgY29kZXMgYW5kIGhlbHAgc291cmNlcyB3aWxsIGJlIGJhc2VkIG9mZiBvZiB0aGlzIGlkXG4gICAgaWQ6IHN0cmluZztcblxuICAgIHJ1bGVzZXRzOiBBcnJheTx7XG4gICAgICAgIGlkOiBzdHJpbmcgfCBzdHJpbmdbXVxuICAgICAgICBudW06IHN0cmluZyB8IHN0cmluZ1tdXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeSxcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsTmV3LFxuICAgICAgICAvLyAob3B0aW9uYWwpIFJlYXNvbiBjb2RlcyB0aGF0IHRoaXMgcnVsZXNldCBtYXBwaW5nIGFwcGxpZXMgdG8sIFxuICAgICAgICAvLyBvciBhbGwgaWYgbm90IHNwZWNpZmllZFxuICAgICAgICByZWFzb25Db2Rlcz86IHN0cmluZ1tdXG4gICAgfT5cblxuICAgIHJlZmFjdG9yPzoge1xuICAgICAgICBbb2xkUnVsZUlkOiBzdHJpbmddOiB7XG4gICAgICAgICAgICBbb2xkUmVhc29uQ29kZTogc3RyaW5nXTogc3RyaW5nXG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgW2xvY2FsZTogc3RyaW5nXToge1xuICAgICAgICAgICAgW3JlYXNvbklkOiBzdHJpbmddOiBzdHJpbmdcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBoZWxwOiB7XG4gICAgICAgIFtsb2NhbGU6IHN0cmluZ106IHtcbiAgICAgICAgICAgIFtyZWFzb25JZDogc3RyaW5nXTogc3RyaW5nXG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqIFxuICAgICAqIEhvdyB0aGlzIHJ1bGUgbWFwcyB0byBBQ1QgcnVsZXMsIGlmIGFueSAoaHR0cHM6Ly9hY3QtcnVsZXMuZ2l0aHViLmlvL3J1bGVzLylcbiAgICAgKiBcbiAgICAgKiBzdHJpbmc6IEZvciBhIHNpbmdsZSBydWxlIG1hcHBpbmcgdGhhdCBtYXRjaGVzIGV4YWN0bHkgdG8gdGhlIHJ1bGUgKFBhc3MgLT4gcGFzcywgUG90ZW50aWFsIC0+IGNhbnRUZWxsLCBGYWlsIC0+IGZhaWwsIHVubGlzdGVkID0+IGluYXBwbGljYWJsZSlcbiAgICAgKiBBcnJheTw+OiBDdXN0b20gbWFwcGluZyBvZiBydWxlIHRvIEFDVCByZXN1bHRzXG4gICAgICovXG4gICAgYWN0Pzogc3RyaW5nIHwgc3RyaW5nW10gfCBBcnJheTxzdHJpbmcgfCB7XG4gICAgICAgIFthY3RSdWxlSWQ6IHN0cmluZ106IHtcbiAgICAgICAgICAgIFtyZWFzb25JZDogc3RyaW5nXTogXCJwYXNzXCIgfCBcImZhaWxcIiB8IFwiY2FudFRlbGxcIiB8IFwiaW5hcHBsaWNhYmxlXCJcbiAgICAgICAgfVxuICAgIH0+XG5cbiAgICAvLyBTZWUgc3JjL3YyL2NvbW1vbi9Db250ZXh0LnRzIGZvciB2YWxpZCBjb250ZXh0c1xuICAgIGNvbnRleHQ6IHN0cmluZztcblxuICAgIC8vIEFycmF5IG9mIHJ1bGVzIHRoYXQgbXVzdCBwYXNzIHRvIGFsbG93IHRoaXMgdmFsaWRhdGUgdG8gcnVuIC0gdGhleSBtdXN0IGhhdmUgdGhlIHNhbWUgY29udGV4dCBwcm9wZXJ0eVxuICAgIGRlcGVuZGVuY2llcz86IHN0cmluZ1tdXG5cbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSkgPT4gUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSB8IG51bGxcblxuICAgIGVuYWJsZWQ/OiBib29sZWFuXG59XG5cbi8qKlxuICogQGRlcHJlY2F0ZWRcbiAqL1xuZXhwb3J0IHR5cGUgUnVsZURldGFpbHMgPSBJc3N1ZTtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBTZWUgSUVuZ2luZVxuICovXG5leHBvcnQgdHlwZSBSZXBvcnQgPSBSZXBvcnROZXc7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgU2VlIElFbmdpbmVcbiAqL1xuZXhwb3J0IHR5cGUgTmxzTWFwID0gTmxzTWFwTmV3O1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIFNlZSBJRW5naW5lXG4gKi9cbmV4cG9ydCB0eXBlIEhlbHBNYXAgPSBIZWxwTWFwTmV3O1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIFNlZSAuL0lFbmdpbmVcbiAqL1xuZXhwb3J0IHR5cGUgSUVuZ2luZSA9IElFbmdpbmVOZXc7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgU2VlIC4vSUd1aWRlbGluZVxuICovXG5leHBvcnQgeyBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4vSUd1aWRlbGluZVwiO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIFNlZSAuL0lHdWlkZWxpbmU6ZUd1aWRlbGluZUNhdGVnb3J5XG4gKi9cbmV4cG9ydCB7IGVHdWlkZWxpbmVDYXRlZ29yeSBhcyBlUnVsZUNhdGVnb3J5IH0gZnJvbSBcIi4vSUd1aWRlbGluZVwiO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIFNlZSAuL0lHdWlkZWxpbmU6ZUd1aWRlbGluZVR5cGVcbiAqL1xuZXhwb3J0IHsgZUd1aWRlbGluZVR5cGUgYXMgZVJ1bGVzZXRUeXBlIH0gZnJvbSBcIi4vSUd1aWRlbGluZVwiO1xuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlIGFzIFJ1bGVWNCwgZVJ1bGVQb2xpY3kgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBFbmdpbmUgfSBmcm9tIFwiLi4vLi4vdjIvY29tbW9uL0VuZ2luZVwiO1xuaW1wb3J0IHsgQVJJQU1hcHBlciB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFNYXBwZXJcIjtcbmltcG9ydCB7IGExMXlSdWxlc2V0cyB9IGZyb20gXCIuLi9ydWxlc2V0c1wiO1xuaW1wb3J0ICogYXMgY2hlY2tSdWxlc1Y0IGZyb20gXCIuLi9ydWxlc1wiO1xuaW1wb3J0IHsgR3VpZGVsaW5lLCBlR3VpZGVsaW5lQ2F0ZWdvcnkgfSBmcm9tIFwiLi4vYXBpL0lHdWlkZWxpbmVcIjtcbmltcG9ydCB7IElFbmdpbmUgfSBmcm9tIFwiLi4vYXBpL0lFbmdpbmVcIjtcbmltcG9ydCB7IFJlcG9ydCB9IGZyb20gXCIuLi9hcGkvSVJlcG9ydFwiO1xuaW1wb3J0IHsgSUNoZWNrZXIgfSBmcm9tIFwiLi4vYXBpL0lDaGVja2VyXCI7XG5cbmxldCBjaGVja1J1bGVzID0gW107XG5sZXQgY2hlY2tObHMgPSB7fTtcbmxldCBjaGVja0hlbHAgPSB7fTtcblxuZnVuY3Rpb24gX2luaXRpYWxpemUoKSB7XG4gICAgY29uc3QgbGFuZ3MgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KEVuZ2luZS5nZXRMYW5ndWFnZXMoKSkpO1xuICAgIC8vIERlZmF1bHQgbGFuZyB0byBlbi1VUyBpZiBub3RoaW5nIGVsc2Ugc3BlY2lmaWVkIGlzIGZvdW5kXG4gICAgbGFuZ3MucHVzaChcImVuLVVTXCIpO1xuICAgIC8vIFByb2Nlc3MgVjQgcnVsZXMgaW50byB0aGUgVjIgZm9ybWF0XG4gICAgZm9yIChsZXQgcnVsZW5hbWUgaW4gY2hlY2tSdWxlc1Y0KSB7XG4gICAgICAgIC8vIENvbnZlcnQgcnVsZVxuICAgICAgICBsZXQgdjRSdWxlOiBSdWxlVjQgPSBjaGVja1J1bGVzVjRbcnVsZW5hbWVdO1xuICAgICAgICBjaGVja1J1bGVzLnB1c2godjRSdWxlKTtcbiAgICAgICAgLy8gR28gYmFja3dhcmRzIGJlY2F1c2UgdGhlIGZpcnN0IGxhbmcgaXMgdGhlIHByZWZlcnJlZCwgc29cbiAgICAgICAgLy8gZWFybGllciBsYW5ndWFnZXMgd2lsbCBvdmVycmlkZSBsYXRlciBsYW5ndWFnZXNcbiAgICAgICAgZm9yIChsZXQgaWR4PWxhbmdzLmxlbmd0aC0xOyBpZHggPj0wOyAtLWlkeCkge1xuICAgICAgICAgICAgY29uc3QgbGFuZ0lkID0gbGFuZ3NbaWR4XTtcbiAgICAgICAgICAgIGlmIChsYW5nSWQgaW4gdjRSdWxlLm1lc3NhZ2VzKSB7XG4gICAgICAgICAgICAgICAgY2hlY2tObHNbdjRSdWxlLmlkXSA9IHY0UnVsZS5tZXNzYWdlc1tsYW5nSWRdO1xuICAgICAgICAgICAgICAgIGNoZWNrTmxzW3Y0UnVsZS5pZF1bMF0gPSBjaGVja05sc1t2NFJ1bGUuaWRdLmdyb3VwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGxhbmdJZCBpbiB2NFJ1bGUuaGVscCkge1xuICAgICAgICAgICAgICAgIGNoZWNrSGVscFt2NFJ1bGUuaWRdID0ge307XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCByZWFzb25JZCBpbiB2NFJ1bGUuaGVscFtsYW5nSWRdKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoZWNrSGVscFt2NFJ1bGUuaWRdW3JlYXNvbklkXSA9IGAvJHtsYW5nSWR9LyR7djRSdWxlLmhlbHBbbGFuZ0lkXVtyZWFzb25JZF19YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2hlY2tObHNbdjRSdWxlLmlkXVswXSA9IGNoZWNrTmxzW3Y0UnVsZS5pZF0uZ3JvdXA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ29udmVydCBSU1xuICAgICAgICBmb3IgKGNvbnN0IHJzU2VjdGlvbiBvZiB2NFJ1bGUucnVsZXNldHMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcnMgb2YgYTExeVJ1bGVzZXRzIGFzIEd1aWRlbGluZVtdKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNoZWNrUnNJZHMgOiBzdHJpbmdbXSA9IHR5cGVvZiByc1NlY3Rpb24uaWQgPT09IFwic3RyaW5nXCIgPyBbcnNTZWN0aW9uLmlkXSA6IHJzU2VjdGlvbi5pZDtcbiAgICAgICAgICAgICAgICBpZiAoY2hlY2tSc0lkcy5pbmNsdWRlcyhycy5pZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBjcCBvZiBycy5jaGVja3BvaW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNoZWNrQ1BJZHMgOiBzdHJpbmdbXSA9IHR5cGVvZiByc1NlY3Rpb24ubnVtID09PSBcInN0cmluZ1wiID8gW3JzU2VjdGlvbi5udW1dIDogcnNTZWN0aW9uLm51bTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGVja0NQSWRzLmluY2x1ZGVzKGNwLm51bSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcC5ydWxlcyA9IGNwLnJ1bGVzIHx8IFtdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3AucnVsZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiB2NFJ1bGUuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbkNvZGVzOiByc1NlY3Rpb24ucmVhc29uQ29kZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsOiByc1NlY3Rpb24ubGV2ZWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2xraXRMZXZlbDogcnNTZWN0aW9uLnRvb2xraXRMZXZlbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5faW5pdGlhbGl6ZSgpO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIFNlZSAuLi9hcGkvSUd1aWRlbGluZVxuICovXG5leHBvcnQgdHlwZSBSdWxlc2V0ID0gR3VpZGVsaW5lO1xuXG5leHBvcnQgY2xhc3MgQ2hlY2tlciBpbXBsZW1lbnRzIElDaGVja2VyIHtcbiAgICBwcml2YXRlIGd1aWRlbGluZXM6IEd1aWRlbGluZVtdID0gW107XG5cbiAgICBlbmdpbmU6IElFbmdpbmU7XG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIGdldEd1aWRlbGluZXMoKS5cbiAgICAgKi9cbiAgICBydWxlc2V0czogR3VpZGVsaW5lW10gPSB0aGlzLmd1aWRlbGluZXM7XG4gICAgLyoqXG4gICAgICogQGRlcHJlY2F0ZWQgVXNlIGdldEd1aWRlbGluZUlkcygpLlxuICAgICAqL1xuICAgIHJ1bGVzZXRJZHM6IHN0cmluZ1tdID0gW107XG4gICAgcnVsZXNldFJ1bGVzOiB7IFtyc0lkOiBzdHJpbmddOiBzdHJpbmdbXSB9ID0ge307XG4gICAgcnVsZUxldmVscyA6IHsgW3J1bGVJZDogc3RyaW5nXTogeyBbcnNJZDogc3RyaW5nXSA6IGVSdWxlUG9saWN5IH19ID0ge307XG4gICAgcnVsZVJlYXNvbkxldmVscyA6IHsgW3J1bGVJZDogc3RyaW5nXTogeyBbcnNJZDogc3RyaW5nXSA6IHtbcmVhc29uQ29kZXM6IHN0cmluZ10gOiBlUnVsZVBvbGljeSB9fX0gPSB7fTtcbiAgICBydWxlQ2F0ZWdvcnkgOiB7IFtydWxlSWQ6IHN0cmluZ106IHsgW3JzSWQ6IHN0cmluZ10gOiBlR3VpZGVsaW5lQ2F0ZWdvcnkgfX0gPSB7fTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgbGV0IGVuZ2luZSA9IHRoaXMuZW5naW5lID0gbmV3IEVuZ2luZSgpO1xuXG4gICAgICAgIGVuZ2luZS5hZGRNYXBwZXIobmV3IEFSSUFNYXBwZXIoKSk7XG5cbiAgICAgICAgZW5naW5lLmFkZFJ1bGVzKGNoZWNrUnVsZXMpO1xuICAgICAgICBlbmdpbmUuYWRkTmxzTWFwKGNoZWNrTmxzKTtcbiAgICAgICAgZW5naW5lLmFkZEhlbHBNYXAoY2hlY2tIZWxwKTtcblxuICAgICAgICBmb3IgKGNvbnN0IHJzIG9mIGExMXlSdWxlc2V0cykge1xuICAgICAgICAgICAgdGhpcy5hZGRSdWxlc2V0KHJzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZHMgYSBndWlkZWxpbmUgdG8gdGhlIGVuZ2luZS4gSWYgdGhlIGlkIGFscmVhZHkgZXhpc3RzLCB0aGUgcHJldmlvdXMgZ3VpZGVsaW5lIHdpbGwgYmUgcmVwbGFjZWQuXG4gICAgICogQHBhcmFtIGd1aWRlbGluZSBcbiAgICAgKi9cbiAgICBhZGRHdWlkZWxpbmUoZ3VpZGVsaW5lOiBHdWlkZWxpbmUpIHtcbiAgICAgICAgaWYgKGd1aWRlbGluZS5pZCBpbiB0aGlzLnJ1bGVzZXRSdWxlcykge1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVHdWlkZWxpbmUoZ3VpZGVsaW5lLmlkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmd1aWRlbGluZXMucHVzaChndWlkZWxpbmUpO1xuICAgICAgICB0aGlzLnJ1bGVzZXRJZHMucHVzaChndWlkZWxpbmUuaWQpO1xuICAgICAgICBjb25zdCBydWxlSWRzID0gW107XG4gICAgICAgIGZvciAoY29uc3QgY3Agb2YgZ3VpZGVsaW5lLmNoZWNrcG9pbnRzKSB7XG4gICAgICAgICAgICBjcC5ydWxlcyA9IGNwLnJ1bGVzIHx8IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBydWxlIG9mIGNwLnJ1bGVzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJ1bGUuZW5hYmxlZCAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgcnVsZUlkcy5wdXNoKHJ1bGUuaWQpO1xuICAgICAgICAgICAgICAgICAgICAvL3RoaXMucnVsZUxldmVsc1tydWxlLmlkXSA9IHRoaXMucnVsZUxldmVsc1tydWxlLmlkXSB8fCB7fTtcbiAgICAgICAgICAgICAgICAgICAgLy90aGlzLnJ1bGVMZXZlbHNbcnVsZS5pZF1bZ3VpZGVsaW5lLmlkXSA9IHJ1bGUubGV2ZWw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucnVsZVJlYXNvbkxldmVsc1tydWxlLmlkXSA9IHRoaXMucnVsZVJlYXNvbkxldmVsc1tydWxlLmlkXSB8fCB7fTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ydWxlUmVhc29uTGV2ZWxzW3J1bGUuaWRdW2d1aWRlbGluZS5pZF0gPSB0aGlzLnJ1bGVSZWFzb25MZXZlbHNbcnVsZS5pZF1bZ3VpZGVsaW5lLmlkXSB8fCB7fTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29kZSA9IHJ1bGUucmVhc29uQ29kZXMgPyBydWxlLnJlYXNvbkNvZGVzLmpvaW4oJy0tJykgOiBcIk5vbmVcIjtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ydWxlUmVhc29uTGV2ZWxzW3J1bGUuaWRdW2d1aWRlbGluZS5pZF1bY29kZV0gPSBydWxlLmxldmVsO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJ1bGVDYXRlZ29yeVtydWxlLmlkXSA9IHRoaXMucnVsZUNhdGVnb3J5W3J1bGUuaWRdIHx8IHt9O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJ1bGVDYXRlZ29yeVtydWxlLmlkXVtndWlkZWxpbmUuaWRdID0gZ3VpZGVsaW5lLmNhdGVnb3J5O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJ1bGVzZXRSdWxlc1tndWlkZWxpbmUuaWRdID0gcnVsZUlkcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFbmFibGUgYSBydWxlIGZvciBhbGwgZ3VpZGVsaW5lc1xuICAgICAqIEBwYXJhbSBydWxlSWQgXG4gICAgICovXG4gICAgZW5hYmxlUnVsZShydWxlSWQ6IHN0cmluZykge1xuICAgICAgICBmb3IgKGNvbnN0IGd1aWRlbGluZSBvZiB0aGlzLmdldEd1aWRlbGluZXMoKSkge1xuICAgICAgICAgICAgbGV0IHVwZGF0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgY3Agb2YgZ3VpZGVsaW5lLmNoZWNrcG9pbnRzKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBydWxlIG9mIGNwLnJ1bGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChydWxlLmVuYWJsZWQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBydWxlLmVuYWJsZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodXBkYXRlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkR3VpZGVsaW5lKGd1aWRlbGluZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNhYmxlIGEgcnVsZSBmb3IgYWxsIGd1aWRlbGluZXNcbiAgICAgKiBAcGFyYW0gcnVsZUlkIFxuICAgICAqL1xuICAgIGRpc2FibGVSdWxlKHJ1bGVJZDogc3RyaW5nKSB7XG4gICAgICAgIGZvciAoY29uc3QgZ3VpZGVsaW5lIG9mIHRoaXMuZ2V0R3VpZGVsaW5lcygpKSB7XG4gICAgICAgICAgICBsZXQgdXBkYXRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yIChjb25zdCBjcCBvZiBndWlkZWxpbmUuY2hlY2twb2ludHMpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHJ1bGUgb2YgY3AucnVsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGUuZW5hYmxlZCAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcnVsZS5lbmFibGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodXBkYXRlZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkR3VpZGVsaW5lKGd1aWRlbGluZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgYSBndWlkZWxpbmUgZnJvbSB0aGUgZW5naW5lXG4gICAgICogXG4gICAgICogR2VuZXJhbGx5LCB0aGVyZSBpc24ndCBhIGdvb2QgcmVhc29uIHRvIGRvIHRoaXMuIFVzZXJzIHNob3VsZCBqdXN0IG5vdCBzZWxlY3QgdGhlIGd1aWRlbGluZSBhcyBhbiBvcHRpb24gaW4gY2hlY2tcbiAgICAgKiBAcGFyYW0gZ3VpZGVsaW5lSWRcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlbW92ZUd1aWRlbGluZShndWlkZWxpbmVJZDogc3RyaW5nKSB7XG4gICAgICAgIGlmIChndWlkZWxpbmVJZCBpbiB0aGlzLnJ1bGVzZXRSdWxlcykge1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMucnVsZXNldFJ1bGVzW2d1aWRlbGluZUlkXTtcbiAgICAgICAgICAgIHRoaXMucnVsZXNldHMgPSB0aGlzLmd1aWRlbGluZXMgPSB0aGlzLmd1aWRlbGluZXMuZmlsdGVyKGd1aWRlbGluZSA9PiBndWlkZWxpbmUuaWQgIT09IGd1aWRlbGluZUlkKTtcbiAgICAgICAgICAgIHRoaXMucnVsZXNldElkcyA9IHRoaXMuZ2V0R3VpZGVsaW5lSWRzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGd1aWRlbGluZXMgYXZhaWxhYmxlIGluIHRoZSBlbmdpbmVcbiAgICAgKiBAcmV0dXJucyBcbiAgICAgKi9cbiAgICBnZXRHdWlkZWxpbmVzKCkgOiBHdWlkZWxpbmVbXSB7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuZ3VpZGVsaW5lcykpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgaWRzIG9mIHRoZSBndWlkZWxpbmVzIGF2YWlsYWJsZSBpbiB0aGUgZW5naW5lXG4gICAgICogQHJldHVybnMgXG4gICAgICovXG4gICAgZ2V0R3VpZGVsaW5lSWRzKCkgOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLmd1aWRlbGluZXMubWFwKGd1aWRlbGluZSA9PiBndWlkZWxpbmUuaWQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEBkZXByZWNhdGVkIFNlZSBhZGRHdWlkZWxpbmVcbiAgICAgKi9cbiAgICBhZGRSdWxlc2V0KHJzOiBSdWxlc2V0KSB7XG4gICAgICAgIHRoaXMuYWRkR3VpZGVsaW5lKHJzKTtcbiAgICB9XG5cbiAgICBlbmFibGVTb3VyY2VNYXAoZW5hYmxlOiBib29sZWFuKSB7XG4gICAgICAgIHRoaXMuZW5naW5lLmVuYWJsZVNvdXJjZU1hcChlbmFibGUpO1xuICAgIH1cblxuICAgIGlzU291cmNlTWFwRW5hYmxlZCgpIDogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmVuZ2luZS5pc1NvdXJjZU1hcEVuYWJsZWQoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQZXJmb3JtIGEgY2hlY2sgb2YgdGhlIHNwZWNpZmllZCBub2RlL2RvY3VtZW50XG4gICAgICogQHBhcmFtIG5vZGUgRE9NTm9kZSBvciBEb2N1bWVudCBvbiB3aGljaCB0byBydW4gdGhlIGNoZWNrXG4gICAgICogQHBhcmFtIGd1aWRlbGluZUlkcyBHdWlkZWxpbmUgaWRzIHRvIGNoZWNrIHdpdGggdG8gc3BlY2lmeSB3aGljaCBydWxlcyB0byBydW5cbiAgICAgKiBAcmV0dXJucyBcbiAgICAgKi9cbiAgICBjaGVjayhub2RlOiBOb2RlIHwgRG9jdW1lbnQsIGd1aWRlbGluZUlkcz86IHN0cmluZyB8IHN0cmluZ1tdKSA6IFByb21pc2U8UmVwb3J0PiB7XG4gICAgICAgIC8vIERldGVybWluZSB3aGljaCBydWxlcyB0byBydW5cbiAgICAgICAgbGV0IHJ1bGVJZHMgOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICAgIC8vIEZpeCB0aGUgaW5wdXRcbiAgICAgICAgaWYgKCFndWlkZWxpbmVJZHMpIHtcbiAgICAgICAgICAgIHJ1bGVJZHMgPSB0aGlzLmVuZ2luZS5nZXRSdWxlc0lkcygpO1xuICAgICAgICB9IGVsc2V7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGd1aWRlbGluZUlkcyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIGd1aWRlbGluZUlkcyA9IFtndWlkZWxpbmVJZHNdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJzSWQgb2YgZ3VpZGVsaW5lSWRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHJzSWQgaW4gdGhpcy5ydWxlc2V0UnVsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgcnVsZUlkcyA9IHJ1bGVJZHMuY29uY2F0KHRoaXMucnVsZXNldFJ1bGVzW3JzSWRdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gICAgXG4gICAgICAgIHRoaXMuZW5naW5lLmVuYWJsZVJ1bGVzKHJ1bGVJZHMpO1xuICAgICAgICAvLyBBZGQgdGhlIHJlcG9ydCBsZXZlbHNcbiAgICAgICAgbGV0IG15VGhpcyA9IHRoaXM7XG4gICAgICAgIHJldHVybiB0aGlzLmVuZ2luZS5ydW4obm9kZSlcbiAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChyZXBvcnQpIHtcbiAgICAgICAgICAgICAgICByZXBvcnQubmxzID0ge31cblxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlcG9ydC5yZXN1bHRzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQucnVsZUlkIGluIGNoZWNrTmxzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXBvcnQubmxzW3Jlc3VsdC5ydWxlSWRdID0gcmVwb3J0Lm5sc1tyZXN1bHQucnVsZUlkXSB8fCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgMDogY2hlY2tObHNbcmVzdWx0LnJ1bGVJZF1bMF1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQucmVhc29uSWQgaW4gY2hlY2tObHNbcmVzdWx0LnJ1bGVJZF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnQubmxzW3Jlc3VsdC5ydWxlSWRdW3Jlc3VsdC5yZWFzb25JZF0gPSBjaGVja05sc1tyZXN1bHQucnVsZUlkXVtyZXN1bHQucmVhc29uSWRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vcmVzdWx0LnZhbHVlWzBdID0gbXlUaGlzLmdldExldmVsKGd1aWRlbGluZUlkcyBhcyBzdHJpbmdbXSwgcmVzdWx0LnJ1bGVJZCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjb2RlID0gcmVzdWx0LnJlYXNvbklkPyByZXN1bHQucmVhc29uSWQgYXMgc3RyaW5nIDogXCJOb25lXCI7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC52YWx1ZVswXSA9IG15VGhpcy5nZXRSZWFzb25MZXZlbChndWlkZWxpbmVJZHMgYXMgc3RyaW5nW10sIHJlc3VsdC5ydWxlSWQsIGNvZGUpO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQuY2F0ZWdvcnkgPSBteVRoaXMuZ2V0Q2F0ZWdvcnkoZ3VpZGVsaW5lSWRzIGFzIHN0cmluZ1tdLCByZXN1bHQucnVsZUlkKTtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHJlc3VsdC5wYXRoLmNzcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcG9ydDtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgcHJpdmF0ZSBnZXRMZXZlbChyc0lkczogc3RyaW5nW10sIHJ1bGVJZDogc3RyaW5nKSA6IGVSdWxlUG9saWN5IHtcbiAgICAgICAgaWYgKCFyc0lkcykgcmV0dXJuIGVSdWxlUG9saWN5LklORk9STUFUSU9OO1xuICAgICAgICBsZXQgcnNJbmZvID0gdGhpcy5ydWxlTGV2ZWxzW3J1bGVJZF07XG4gICAgICAgIGxldCByZXRWYWwgPSBudWxsO1xuICAgICAgICBpZiAocnNJZHMpIHtcbiAgICAgICAgICAgIGlmICghKHJ1bGVJZCBpbiB0aGlzLnJ1bGVMZXZlbHMpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUnVsZSB0cmlnZ2VyZWQgZm9yIHdoaWNoIHdlIGhhdmUgbm8gcnVsZSBsZXZlbCBpbmZvcm1hdGlvbjogXCIrcnVsZUlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoY29uc3QgcnNJZCBvZiByc0lkcykge1xuICAgICAgICAgICAgICAgIGlmIChyc0lkIGluIHJzSW5mbykge1xuICAgICAgICAgICAgICAgICAgICBpZiAocnNJbmZvW3JzSWRdID09PSBlUnVsZVBvbGljeS5WSU9MQVRJT04pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IGVSdWxlUG9saWN5LlZJT0xBVElPTjtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyc0luZm9bcnNJZF0gPT09IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OICYmIHJldFZhbCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT047XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmV0VmFsID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwgPSBlUnVsZVBvbGljeS5JTkZPUk1BVElPTjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocmV0VmFsID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSdWxlIHRyaWdnZXJlZCBmb3Igd2hpY2ggd2UgaGF2ZSBubyBydWxlIGxldmVsIGluZm9ybWF0aW9uOiBcIitydWxlSWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRSZWFzb25MZXZlbChyc0lkczogc3RyaW5nW10sIHJ1bGVJZDogc3RyaW5nLCByZWFzb25Db2RlPzogc3RyaW5nKSA6IGVSdWxlUG9saWN5IHtcbiAgICAgICAgaWYgKCFyc0lkcykgcmV0dXJuIGVSdWxlUG9saWN5LklORk9STUFUSU9OOyBcbiAgICAgICAgbGV0IHJzSW5mbyA9IHRoaXMucnVsZVJlYXNvbkxldmVsc1tydWxlSWRdO1xuICAgICAgICBsZXQgcmV0VmFsID0gbnVsbDtcbiAgICAgICAgaWYgKHJzSWRzKSB7XG4gICAgICAgICAgICBpZiAoIShydWxlSWQgaW4gdGhpcy5ydWxlUmVhc29uTGV2ZWxzKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlJ1bGUgdHJpZ2dlcmVkIGZvciB3aGljaCB3ZSBoYXZlIG5vIHJ1bGUgbGV2ZWwgaW5mb3JtYXRpb24gXCIrcnVsZUlkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoY29uc3QgcnNJZCBvZiByc0lkcykge1xuICAgICAgICAgICAgICAgIGlmIChyc0lkIGluIHJzSW5mbykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZUNvZGUgPSBuZXcgUmVnRXhwKGAoXnwtLSkke3JlYXNvbkNvZGV9KCR8LS0pYCk7XG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHJzSW5mb1tyc0lkXSkuZm9yRWFjaChjb2RlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsZXZlbCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZSA9PT0gJ05vbmUnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsID0gcnNJbmZvW3JzSWRdW1wiTm9uZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlQ29kZS50ZXN0KGNvZGUpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsID0gcnNJbmZvW3JzSWRdW2NvZGVdOyBcbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxldmVsICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxldmVsID09PSBlUnVsZVBvbGljeS5WSU9MQVRJT04pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gZVJ1bGVQb2xpY3kuVklPTEFUSU9OO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGV2ZWwgPT09IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OICYmIHJldFZhbCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwgPSBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTjsgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXRWYWwgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gZVJ1bGVQb2xpY3kuSU5GT1JNQVRJT047XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJldFZhbCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gZVJ1bGVQb2xpY3kuSU5GT1JNQVRJT047XG4gICAgICAgICAgICAgICAgICAgIH0gICAgXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IFxuICAgICAgICBpZiAocmV0VmFsID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSdWxlIHRyaWdnZXJlZCBmb3Igd2hpY2ggd2UgaGF2ZSBubyBydWxlIGxldmVsIGluZm9ybWF0aW9uOiBcIitydWxlSWQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRDYXRlZ29yeShyc0lkczogc3RyaW5nW10sIHJ1bGVJZD86IHN0cmluZykgOiBlR3VpZGVsaW5lQ2F0ZWdvcnkge1xuICAgICAgICBsZXQgcnNJbmZvID0gdGhpcy5ydWxlQ2F0ZWdvcnlbcnVsZUlkXTtcbiAgICAgICAgbGV0IHJldFZhbCA9IFwiXCI7XG5cbiAgICAgICAgaWYgKCEocnVsZUlkIGluIHRoaXMucnVsZUNhdGVnb3J5KSkge1xuICAgICAgICAgICAgcmV0dXJuIGVHdWlkZWxpbmVDYXRlZ29yeS5PVEhFUjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJzSWRzKSB7XG4gICAgICAgICAgICByc0lkcyA9IHRoaXMuZ2V0R3VpZGVsaW5lSWRzKCk7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChjb25zdCByc0lkIG9mIHJzSWRzKSB7XG4gICAgICAgICAgICBpZiAocnNJZCBpbiByc0luZm8pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcnNJbmZvW3JzSWRdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlR3VpZGVsaW5lQ2F0ZWdvcnkuT1RIRVI7XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGNvbnN0IGFfdGFyZ2V0X3dhcm5pbmc6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYV90YXJnZXRfd2FybmluZ1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmFbdGFyZ2V0XSxkb206YXJlYVt0YXJnZXRdLGRvbTpiYXNlW3RhcmdldF1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9BX1RhcmdldEFuZFRleHRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwicG90ZW50aWFsX3dhcm5cIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBgYV90YXJnZXRfd2FybmluZy5odG1sYCxcbiAgICAgICAgICAgIFwicGFzc1wiOiBgYV90YXJnZXRfd2FybmluZy5odG1sYCxcbiAgICAgICAgICAgIFwicG90ZW50aWFsX3dhcm5cIjogYGFfdGFyZ2V0X3dhcm5pbmcuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVXNlcnMgc2hvdWxkIGJlIHdhcm5lZCBpbiBhZHZhbmNlIGlmIHRoZWlyIGlucHV0IGFjdGlvbiB3aWxsIG9wZW4gYSBuZXcgd2luZG93XCIsXG4gICAgICAgICAgICBcInBhc3NcIjogXCJUaGUgdXNlciBpcyB3YXJuZWQgaW4gYWR2YW5jZSB0aGF0IHRoZSBpbnB1dCBhY3Rpb24gb3BlbnMgYSBuZXcgd2luZG93XCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF93YXJuXCI6IFwiSW5mb3JtIHRoZSB1c2VyIHdoZW4gdGhlaXIgaW5wdXQgYWN0aW9uIHdpbGwgb3BlbiBhIG5ldyB3aW5kb3dcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFsgXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIG51bTogXCIzLjIuMlwiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vIHNraXAgdGhlIHJ1bGUgaWYgaXQncyBBVCBoaWRkZW4gYW5kIG5vdCB0YWJiYWJsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpICYmICFDb21tb25VdGlsLmlzVGFiYmFibGUocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgcGFyYW1zID0ge1xuICAgICAgICAgICAgcGFyYW1XaW5UZXh0OiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IFtcIm5ldyB3aW5kb3dcIiwgXCJuZXcgdGFiXCJdLFxuICAgICAgICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIlxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHRTdHIgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0YXJnZXRcIik7XG4gICAgICAgIGxldCBwYXNzZWQgPSB0U3RyID09IFwiX3BhcmVudFwiIHx8IHRTdHIgPT0gXCJfc2VsZlwiIHx8IHRTdHIgPT0gXCJfdG9wXCIgfHwgQ29tbW9uVXRpbC5nZXRGcmFtZUJ5TmFtZShydWxlQ29udGV4dCx0U3RyKSAhPSBudWxsO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgLy8gTmFtZSBpcyBub3QgcGFydCBvZiB0aGlzIGZyYW1lc2V0IOKAkyBtdXN0IGhhdmUgcG90ZW50aWFsIHRvIGNyZWF0ZSBuZXcgd2luZG93P1xuICAgICAgICAgICAgLy8gU2VlIGlmIGEgbmV3IHdpbmRvdyBpcyBtZW50aW9uZWRcbiAgICAgICAgICAgIGxldCB0ZXh0U3RyID0gQ29tbW9uVXRpbC5nZXRJbm5lclRleHQocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInRpdGxlXCIpKVxuICAgICAgICAgICAgICAgIHRleHRTdHIgKz0gXCIgXCIgKyBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0aXRsZVwiKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gQ2hlY2sgYXJpYS1kZXNjcmliZWRieSBmb3Igd2FybmluZyB0ZXh0XG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiYXJpYS1kZXNjcmliZWRieVwiKSkge1xuICAgICAgICAgICAgICAgIGxldCBkZXNjcmliZWRieUlkcyA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtZGVzY3JpYmVkYnlcIikudHJpbSgpLnNwbGl0KC9cXHMrLyk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaWQgb2YgZGVzY3JpYmVkYnlJZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlZmVyZW5jZWRFbGVtID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQocnVsZUNvbnRleHQsIGlkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlZmVyZW5jZWRFbGVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGVzY3JpYmVkVGV4dCA9IENvbW1vblV0aWwuZ2V0SW5uZXJUZXh0KHJlZmVyZW5jZWRFbGVtKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjcmliZWRUZXh0ICYmIGRlc2NyaWJlZFRleHQudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0U3RyICs9IFwiIFwiICsgZGVzY3JpYmVkVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7ICFwYXNzZWQgJiYgaSA8IHBhcmFtcy5wYXJhbVdpblRleHQudmFsdWUubGVuZ3RoOyArK2kpXG4gICAgICAgICAgICAgICAgaWYgKHRleHRTdHIuaW5kZXhPZihwYXJhbXMucGFyYW1XaW5UZXh0LnZhbHVlW2ldKSAhPSAtMSkgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFzc2VkID8gUnVsZVBhc3MoXCJwYXNzXCIpIDogUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF93YXJuXCIpO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFjY05hbWVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQWNjTmFtZVV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFfdGV4dF9wdXJwb3NlOiBSdWxlID0ge1xuICAgIGlkOiBcImFfdGV4dF9wdXJwb3NlXCIsXG4gICAgLy8gZG9jLWJpYmxpb3JlZiBpcyBhIGxpbmtcbiAgICBjb250ZXh0OiBcImFyaWE6bGluayxhcmlhOmRvYy1iaWJsaW9yZWZcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9BX0hhc1RleHRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImZhaWxfYWNjX25hbWVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBgYV90ZXh0X3B1cnBvc2UuaHRtbGAsXG4gICAgICAgICAgICBcInBhc3NcIjogYGFfdGV4dF9wdXJwb3NlLmh0bWxgLFxuICAgICAgICAgICAgXCJmYWlsX2FjY19uYW1lXCI6IGBhX3RleHRfcHVycG9zZS5odG1sYFxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJIeXBlcmxpbmtzIG11c3QgaGF2ZSBhbiBhY2Nlc3NpYmxlIG5hbWUgZm9yIHRoZWlyIHB1cnBvc2VcIixcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIkh5cGVybGluayBoYXMgYSBkZXNjcmlwdGlvbiBvZiBpdHMgcHVycG9zZVwiLFxuICAgICAgICAgICAgXCJmYWlsX2FjY19uYW1lXCI6IFwiSHlwZXJsaW5rIGhhcyBubyBsaW5rIHRleHQsIGxhYmVsIG9yIGltYWdlIHdpdGggYSB0ZXh0IGFsdGVybmF0aXZlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbIFwiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBudW06IFtcIjIuNC40XCIsIFwiNC4xLjJcIl0sIC8vIG51bTogWyBcIjIuNC40XCIsIFwieC55LnpcIiBdIGFsc28gYWxsb3dlZFxuICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBcImM0ODdhZVwiLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30pOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcblxuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IGlzIGhpZGRlbiBvciBkaXNhYmxlZFxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpIHx8IENvbW1vblV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gUnVsZSBvbmx5IHBhc3NlcyBpZiBhbiBlbGVtZW50IGhhcyBpbm5lciBjb250ZW50LFxuICAgICAgICAvLyBpbiB0aGUgY2FzZSB0aGF0IHRoZXJlIGlzIG9ubHkgaGlkZGVuIGNvbnRlbnQgdW5kZXIgdGhlIHRoZSBlbGVtZW50IGl0IGlzIGEgdmlvbGF0aW9uXG4gICAgICAgIGNvbnN0IGFjY05hbWVfcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZShydWxlQ29udGV4dCk7XG4gICAgICAgIGxldCBwYXNzZWQgPVxuICAgICAgICAgICAgKGFjY05hbWVfcGFpciAmJiBhY2NOYW1lX3BhaXIubmFtZSAmJiBhY2NOYW1lX3BhaXIubmFtZS50cmltKCkubGVuZ3RoID4gMCkgXG4gICAgICAgICAgICAvKipBUklBTWFwcGVyLmNvbXB1dGVOYW1lKHJ1bGVDb250ZXh0KS50cmltKCkubGVuZ3RoID4gMCovXG4gICAgICAgICAgICB8fCBDb21tb25VdGlsLm5vblRhYmFibGVDaGlsZENoZWNrKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfYWNjX25hbWVcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGNvbnN0IGFwcGxldF9hbHRfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcImFwcGxldF9hbHRfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJkb206YXBwbGV0XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfQXBwbGV0X0hhc0FsdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiRmFpbF8yXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcIkZhaWxfM1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IGBhcHBsZXRfYWx0X2V4aXN0cy5odG1sYCxcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IGBhcHBsZXRfYWx0X2V4aXN0cy5odG1sYCxcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IGBhcHBsZXRfYWx0X2V4aXN0cy5odG1sYCxcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IGBhcHBsZXRfYWx0X2V4aXN0cy5odG1sYCxcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IGBhcHBsZXRfYWx0X2V4aXN0cy5odG1sYFxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCI8YXBwbGV0PiBlbGVtZW50cyBtdXN0IHByb3ZpZGUgYW4gJ2FsdCcgYXR0cmlidXRlIGFuZCBhbiBhbHRlcm5hdGl2ZSBkZXNjcmlwdGlvblwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJBbiA8YXBwbGV0PiBlbGVtZW50IGRvZXMgbm90IGhhdmUgYW4gJ2FsdCcgYXR0cmlidXRlIHRoYXQgcHJvdmlkZXMgYSBzaG9ydCB0ZXh0IGFsdGVybmF0aXZlXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIlRoZSAnYWx0JyBhdHRyaWJ1dGUgdmFsdWUgZm9yIGFuIDxhcHBsZXQ+IGVsZW1lbnQgZHVwbGljYXRlcyB0aGUgJ2NvZGUnIGF0dHJpYnV0ZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJBbiA8YXBwbGV0PiBlbGVtZW50IHByb3ZpZGVzIGFsdGVybmF0aXZlIHRleHQsIGJ1dCBkb2VzIG5vdCBwcm92aWRlIGlubmVyIGNvbnRlbnRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFsgXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIG51bTogXCIxLjEuMVwiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICAvLyBKQ0ggLSBOTyBPVVQgT0YgU0NPUEUgaGlkZGVuIGluIGNvbnRleHRcbiAgICAgICAgaWYgKCFDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcImFsdFwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IGFsdCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFsdFwiKS50cmltKCk7XG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiY29kZVwiKSAmJiBhbHQgPT0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiY29kZVwiKS50cmltKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzJcIik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFDb21tb25VdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbihydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzNcIik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiAgICAiLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGNvbnN0IGFwcGxpY2F0aW9uX2NvbnRlbnRfYWNjZXNzaWJsZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcHBsaWNhdGlvbl9jb250ZW50X2FjY2Vzc2libGVcIixcbiAgICBjb250ZXh0OiBcImFyaWE6YXBwbGljYXRpb25cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIkhBQUNfQXBwbGljYXRpb25fUm9sZV9UZXh0XCI6IHtcbiAgICAgICAgICAgIDA6IGBIQUFDX0FwcGxpY2F0aW9uX1JvbGVfVGV4dC5odG1sYCxcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgMDogYGFwcGxpY2F0aW9uX2NvbnRlbnRfYWNjZXNzaWJsZS5odG1sYCxcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IGBhcHBsaWNhdGlvbl9jb250ZW50X2FjY2Vzc2libGUuaHRtbGAsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IGBhcHBsaWNhdGlvbl9jb250ZW50X2FjY2Vzc2libGUuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiTm9uLWRlY29yYXRpdmUgc3RhdGljIHRleHQgYW5kIGltYWdlIGNvbnRlbnQgd2l0aGluIGFuIGVsZW1lbnQgd2l0aCBcXFwiYXBwbGljYXRpb25cXFwiIHJvbGUgbXVzdCBiZSBhY2Nlc3NpYmxlXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVmVyaWZ5IHRoYXQgdGhlIG5vbi1kZWNvcmF0aXZlIHN0YXRpYyB0ZXh0IGFuZCBpbWFnZSBjb250ZW50IHdpdGhpbiBhbiBlbGVtZW50IHdpdGggXFxcImFwcGxpY2F0aW9uXFxcIiByb2xlIGFyZSBhY2Nlc3NpYmxlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbIFwiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBudW06IFtcIjEuMS4xXCIsIFwiMi4xLjFcIl0sIC8vbWF0Y2ggbGlzdGluZyBpbiBoZWxwXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuICAgICAgICBsZXQgY2hpbGRyZW4gPSBydWxlQ29udGV4dC5jaGlsZE5vZGVzO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgcGFzc2VkICYmIGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGNoaWxkcmVuW2ldLm5vZGVUeXBlID09PSAxKSB7XG4gICAgICAgICAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlVmlzaWJsZShjaGlsZHJlbltpXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gQXJpYVV0aWwuaGFzUm9sZUluU2VtYW50aWNzKGNoaWxkcmVuW2ldLCBcImRvY3VtZW50XCIpIHx8IEFyaWFVdGlsLmhhc1JvbGVJblNlbWFudGljcyhjaGlsZHJlbltpXSwgXCJhcnRpY2xlXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY2hpbGRyZW5baV0ubm9kZVR5cGUgPT09IDMpIHtcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSBjaGlsZHJlbltpXS5ub2RlVmFsdWUudHJpbSgpLmxlbmd0aCA9PT0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBwYXNzZWQgPyBSdWxlUGFzcyhcIlBhc3NfMFwiKSA6IFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG5leHBvcnQgY29uc3QgYXJlYV9hbHRfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcImFyZWFfYWx0X2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmFyZWFcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9BcmVhX0hhc0FsdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBgYXJlYV9hbHRfZXhpc3RzLmh0bWxgLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogYGFyZWFfYWx0X2V4aXN0cy5odG1sYCxcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IGBhcmVhX2FsdF9leGlzdHMuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiPGFyZWE+IGVsZW1lbnRzIGluIGFuIGltYWdlIG1hcCBtdXN0IGhhdmUgYSB0ZXh0IGFsdGVybmF0aXZlXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIjxhcmVhPiBlbGVtZW50IGluIGFuIGltYWdlIG1hcCBoYXMgbm8gdGV4dCBhbHRlcm5hdGl2ZVwiXG4gICAgICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFsgXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIG51bTogXCIxLjEuMVwiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxufV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIC8vIEpDSCAtIE5PIE9VVCBPRiBTQ09QRSBoaWRkZW4gaW4gY29udGV4dFxuICAgICAgICBpZiAoQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJhbHRcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiAgICAiLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5pbXBvcnQgeyBBY2NOYW1lVXRpbCB9IGZyb20gXCIuLi91dGlsL0FjY05hbWVVdGlsXCI7XG5pbXBvcnQgeyBBUklBRGVmaW5pdGlvbnMgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBRGVmaW5pdGlvbnNcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfYWNjZXNzaWJsZW5hbWVfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfYWNjZXNzaWJsZW5hbWVfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmNvbHVtbmhlYWRlciwgYXJpYTpoZWFkaW5nLCBhcmlhOnJvd2hlYWRlciwgYXJpYTpncmFwaGljcy1kb2N1bWVudCxhcmlhOmdyYXBoaWNzLXN5bWJvbCwgYXJpYTppbWcsYXJpYTppbWFnZSwgZG9jLWJhY2tsaW5rLCBkb2MtYmlibGlvZW50cnksIGRvYy1iaWJsaW9yZWYsIGRvYy1nbG9zc3JlZiwgZG9jLW5vdGVyZWYsIGRvYy1wYWdlYnJlYWssIGRvYy1leGFtcGxlXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImFyaWFfYWNjZXNzaWJsZW5hbWVfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9ub19hY2Nlc3NpYmxlX25hbWVcIjogXCJhcmlhX2FjY2Vzc2libGVuYW1lX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfbm9fYWNjZXNzaWJsZV9uYW1lX2ltYWdlXCI6IFwiYXJpYV9hY2Nlc3NpYmxlbmFtZV9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfYWNjZXNzaWJsZW5hbWVfZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIkFuIGFjY2Vzc2libGUgbmFtZSBpcyBwcm92aWRlZCBmb3IgdGhlIGVsZW1lbnRcIixcbiAgICAgICAgICAgIFwiZmFpbF9ub19hY2Nlc3NpYmxlX25hbWVcIjogXCJFbGVtZW50IDx7MH0+IHdpdGggXFxcInsxfVxcXCIgcm9sZSBoYXMgbm8gYWNjZXNzaWJsZSBuYW1lXCIsXG4gICAgICAgICAgICBcImZhaWxfbm9fYWNjZXNzaWJsZV9uYW1lX2ltYWdlXCI6IFwiRWxlbWVudCA8ezB9PiB3aXRoIFxcXCJ7MX1cXFwiIHJvbGUgaGFzIG5vIGFjY2Vzc2libGUgbmFtZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVsZW1lbnRzIHdpdGggY2VydGFpbiByb2xlcyBzaG91bGQgaGF2ZSBhY2Nlc3NpYmxlIG5hbWVzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkUsXG4gICAgICAgIHJlYXNvbkNvZGVzOiBbXCJmYWlsX25vX2FjY2Vzc2libGVfbmFtZVwiXVxuICAgIH0sXG4gICAge1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiQVJJQVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkUsXG4gICAgICAgIHJlYXNvbkNvZGVzOiBbXCJmYWlsX25vX2FjY2Vzc2libGVfbmFtZV9pbWFnZVwiXVxuICAgIH1dLFxuICAgIGFjdDogW3tcIjIzYTJhOFwiOiB7XCJmYWlsX25vX2FjY2Vzc2libGVfbmFtZV9pbWFnZVwiOiBcImZhaWxcIn19XSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgIC8vIHN2ZyBlbGVtZW50IGlzIGhhbmRsZWQgaW4gc3ZnX2dyYXBoaWNzX2xhYmJlbGxlZCBydWxlIGFuZCBpbWFnZSBydWxlc1xuICAgICAgICBpZiAobm9kZU5hbWUgPT09ICdzdmcnIHx8IG5vZGVOYW1lID09PSAnaW1nJykgcmV0dXJuO1xuICAgICAgICBcbiAgICAgICAgLy8gd2hlbiB0YWJsZSBlbGVtZW50IHdpdGggYSBjYXB0aW9uIGFzIGZpcnN0IGNoaWxkXG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gJ3RhYmxlJyBcbiAgICAgICAgICAgICYmIHJ1bGVDb250ZXh0LmZpcnN0RWxlbWVudENoaWxkICYmIHJ1bGVDb250ZXh0LmZpcnN0RWxlbWVudENoaWxkLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdjYXB0aW9uJ1xuICAgICAgICAgICAgJiYgcnVsZUNvbnRleHQuZmlyc3RFbGVtZW50Q2hpbGQudGV4dENvbnRlbnQgJiYgcnVsZUNvbnRleHQuZmlyc3RFbGVtZW50Q2hpbGQudGV4dENvbnRlbnQudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuXG4gICAgICAgIGNvbnN0IGludmFsaWRSb2xlcyA9IEFyaWFVdGlsLmdldFJvbGVzVW5kZWZpbmVkQnlBcmlhKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKGludmFsaWRSb2xlcyAmJiBpbnZhbGlkUm9sZXMubGVuZ3RoID4gMCkgcmV0dXJuIG51bGw7XG4gICAgICAgIGNvbnN0IGRlcHJlY2F0ZWRSb2xlcyA9IEFyaWFVdGlsLmdldERlcHJlY2F0ZWRBcmlhUm9sZXMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoZGVwcmVjYXRlZFJvbGVzICYmIGRlcHJlY2F0ZWRSb2xlcy5sZW5ndGggPiAwKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgZGVwcmVjYXRlZEF0dHJpYnV0ZXMgPSBBcmlhVXRpbC5nZXREZXByZWNhdGVkQXJpYUF0dHJpYnV0ZXMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoZGVwcmVjYXRlZEF0dHJpYnV0ZXMgJiYgZGVwcmVjYXRlZEF0dHJpYnV0ZXMubGVuZ3RoID4gMCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgbGV0IHJvbGUgPSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoIXJvbGUgfHwgIUFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlXSB8fCAhQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVdLm5hbWVSZXF1aXJlZClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgbmFtZV9wYWlyID0gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKCFuYW1lX3BhaXIgfHwgIW5hbWVfcGFpci5uYW1lIHx8IG5hbWVfcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGlmIChyb2xlID09PSAnaW1nJyB8fCByb2xlID09PSAnaW1hZ2UnKVxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfbm9fYWNjZXNzaWJsZV9uYW1lX2ltYWdlXCIsIFtydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLCByb2xlXSk7IFxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9ub19hY2Nlc3NpYmxlX25hbWVcIiwgW3J1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksIHJvbGVdKTtcbiAgICAgICAgfSAgICBcbiAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdGFiaW5kZXhfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9hY3RpdmVkZXNjZW5kYW50X3RhYmluZGV4X3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJkb206KlthcmlhLWFjdGl2ZWRlc2NlbmRhbnRdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9JbnZhbGlkVGFiaW5kZXhGb3JBY3RpdmVkZXNjZW5kYW50XCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiYXJpYV9hY3RpdmVkZXNjZW5kYW50X3RhYmluZGV4X3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV9hY3RpdmVkZXNjZW5kYW50X3RhYmluZGV4X3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdGFiaW5kZXhfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiVGhlIDx7MH0+IGVsZW1lbnQgdXNpbmcgJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCcgc2V0IHRvIFxcXCJ7MX1cXFwiIGlzIG5vdCB0YWJiYWJsZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVsZW1lbnQgdXNpbmcgJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCcgcHJvcGVydHkgc2hvdWxkIGJlIHRhYmJhYmxlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgLy8gUnVsZSBub3Qgc3VwcG9ydGVkIG9uIG1vYmlsZVxuICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiY2xhc3NcIikgJiYgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiY2xhc3NcIikuc3Vic3RyaW5nKDAsIDMpID09IFwibWJsXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRoZSBlbGVtZW50IGlzIGhpZGRlbiBieSBhIGRpc2FibGVkIEhUTUw1IGF0dHJpYnV0ZSBvciBhcmlhLWRpc2FibGVkOlxuICAgICAgICAvLyAgMS4gSW4gdGhlIGNhc2UgdGhhdCB0aGlzIGVsZW1lbnQgaGFzIGEgZGlzYWJsZWQgYXR0cmlidXRlIGFuZCB0aGUgZWxlbWVudCBzdXBwb3J0cyBpdCwgd2UgbWFyayB0aGlzIHJ1bGUgYXMgcGFzc2VkLlxuICAgICAgICAvLyAgMi4gSW4gdGhlIGNhc2UgdGhhdCB0aGlzIGVsZW1lbnQgaGFzIGFuIGFyaWEtZGlzYWJsZWQgYXR0cmlidXRlIHRoZW4sIHdlIG1hcmsgdGhpcyBydWxlIGFzIHBhc3NlZC5cbiAgICAgICAgLy8gRm9yIGJvdGggb2YgdGhlIGNhc2VzIGFib3ZlIHdlIGRvIG5vdCBuZWVkIHRvIHBlcmZvcm0gYW55IGZ1cnRoZXIgY2hlY2tzLCBhcyB0aGUgZWxlbWVudCBpcyBkaXNhYmxlZCBpbiBzb21lIGZvcm0gb3IgYW5vdGhlci5cbiAgICAgICAgaWYgKENvbW1vblV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vaWdub3JlIGlmIHRoZSBhdHRyaWJ1dGUgJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCcgaXMgYmxhbmtcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiKS50cmltKCkubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIC8vIElmIHRoZSB0YWJpbmRleCBhdHRyaWJ1dGUgaXMgcHJvdmlkZWQgdGhlbiB2ZXJpZnkgdGhhdCBpdCBpcyAwIG9yIC0xXG4gICAgICAgIHBhc3NlZCA9IENvbW1vblV0aWwuaXNUYWJiYWJsZShydWxlQ29udGV4dCk7XG5cbiAgICAgICAgLy8gcGFzcyBpZiBvbmUgb2YgdGhlIGNoaWxkcmVuIGlzIHRhYmJhYmxlLiBpbiB0aGlzIGNhc2UsIHRoZSB0YWIgd2lsbCBzdG9wIG9uIHRoZSBmaXJzdCB0YWJiYWJsZSBlbGVtZW50XG4gICAgICAgIGlmICghcGFzc2VkKSBcbiAgICAgICAgICAgIHBhc3NlZCA9IENvbW1vblV0aWwuZ2V0VGFiYmFibGVDaGlsZHJlbihydWxlQ29udGV4dCkgPiAwO1xuXG4gICAgICAgIC8vIEJ1aWxkIGFycmF5IGZvciBub2RlIHRva2VuXG4gICAgICAgIGxldCByZXRUb2tlbjEgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgcmV0VG9rZW4xLnB1c2gobm9kZU5hbWUpO1xuXG4gICAgICAgIC8vIEJ1aWxkIGFycmF5IGZvciBpZCByZWZlcmVuY2VkIGJ5IGFyaWEtYWN0aXZlZGVzY2VuZGFudFxuICAgICAgICBsZXQgcmV0VG9rZW4yID0gbmV3IEFycmF5KCk7XG4gICAgICAgIHJldFRva2VuMi5wdXNoKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiKS5zcGxpdChcIiBcIikuam9pbihcIiwgXCIpKTtcblxuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIFtydWxlQ29udGV4dF0sICcnLCAnJywgcGFzc2VkID09IHRydWUgPyBbXSA6IFtyZXRUb2tlbjEsIHJldFRva2VuMl0pO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIsIFtyZXRUb2tlbjEudG9TdHJpbmcoKSwgcmV0VG9rZW4yLnRvU3RyaW5nKCldKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgRE9NVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9hY3RpdmVkZXNjZW5kYW50X3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfYWN0aXZlZGVzY2VuZGFudF92YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbYXJpYS1hY3RpdmVkZXNjZW5kYW50XVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiSEFBQ19BY3RpdmVEZXNjZW5kYW50Q2hlY2tcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkZhaWxfMlwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJGYWlsXzNcIlxuICAgICAgICAgICAgLy8gXCJGYWlsXzRcIjogXCJGYWlsXzRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJhcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJhcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgLy8gXCJGYWlsXzRcIjogXCJhcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfYWN0aXZlZGVzY2VuZGFudF92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlRoZSAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JyBwcm9wZXJ0eSBpcyBlbXB0eVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJUaGUgJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCcgcHJvcGVydHkgcmVmZXJlbmNlcyBhIGhpZGRlbiBub2RlXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcIkVsZW1lbnQgaXMgbm90IGEgY29tYm9ib3gsIGFuZCB0aGUgcmVmZXJlbmNlZCBhY3RpdmUtZGVzY2VuZGFudCBlbGVtZW50IGlzIG5vdCBhIHZhbGlkIGRlc2NlbmRhbnRcIixcbiAgICAgICAgICAgIC8vIFwiRmFpbF80XCI6IFwiRWxlbWVudCBpcyBhIGNvbWJvYm94LCBhbmQgdGhlIHJlZmVyZW5jZWQgYWN0aXZlLWRlc2NlbmRhbnQgZWxlbWVudCBpcyBub3QgY29udHJvbGxlZCBieSB0aGlzIGNvbXBvbmVudFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JyBwcm9wZXJ0eSBtdXN0IHJlZmVyZW5jZSB0aGUgJ2lkJyBvZiBhIG5vbi1lbXB0eSwgbm9uLWhpZGRlbiBhY3RpdmUgY2hpbGQgZWxlbWVudFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbeyBcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4yXCJdLCBcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sIFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORSBcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vIGNvbWJvYm94IGFjdGl2ZSBkZXNjZW5kYW50cyBoYW5kbGVkIGJ5ICdjb21ib2JveF9hY3RpdmVfZGVzY2VuZGFudCdcbiAgICAgICAgaWYgKEFyaWFVdGlsLmhhc1JvbGVJblNlbWFudGljcyhydWxlQ29udGV4dCwgXCJjb21ib2JveFwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZGVzY2VuZGFudF9pZCA9IEFyaWFVdGlsLmdldEFyaWFBdHRyaWJ1dGUocnVsZUNvbnRleHQsIFwiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIpO1xuICAgICAgICAvLyBQT0YxOiBUaGUgYXR0cmlidXRlIGlzIGVtcHR5XG4gICAgICAgIGlmICghZGVzY2VuZGFudF9pZCB8fCBkZXNjZW5kYW50X2lkLnRyaW0oKSA9PT0gXCJcIikge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGRlc2NlbmRhbnQgPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChydWxlQ29udGV4dCwgZGVzY2VuZGFudF9pZC50cmltKCkpO1xuICAgICAgICBpZiAoIWRlc2NlbmRhbnQgfHwgRE9NVXRpbC5zYW1lTm9kZShkZXNjZW5kYW50X2lkLCBydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgIC8vIFRoZSByZWZlcmVuY2VkIGVsZW1lbnQgZG9lc24ndCBleGlzdC4gV2UgbGV0IDEwNzcgdG8gdHJpZ2dlciB0aGUgZXJyb3JcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFWaXNVdGlsLmlzTm9kZVZpc2libGUoZGVzY2VuZGFudCkpIHtcbiAgICAgICAgICAgIC8vIFBPRjI6IGFyaWEtYWN0aXZlZGVzY2VuZGFudCByZWZlcmVuY2VzIGEgaGlkZGVuIG5vZGVcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDEuIFRoZSB2YWx1ZSBvZiBhcmlhLWFjdGl2ZWRlc2NlbmRhbnQgcmVmZXJzIHRvIGFuIGVsZW1lbnQgdGhhdCBpcyBlaXRoZXIgYSBkZXNjZW5kYW50IG9mIFxuICAgICAgICAvLyB0aGUgZWxlbWVudCB3aXRoIERPTSBmb2N1c1xuICAgICAgICBpZiAocnVsZUNvbnRleHQuY29udGFpbnMoZGVzY2VuZGFudCkpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwb2ZJZCA9IDI7XG5cbiAgICAgICAgLy8gb3IgaXMgYSBsb2dpY2FsIGRlc2NlbmRhbnQgYXMgaW5kaWNhdGVkIGJ5IHRoZSBhcmlhLW93bnMgYXR0cmlidXRlLlxuICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiYXJpYS1vd25zXCIpKSB7XG4gICAgICAgICAgICBsZXQgb3duZWRfaWRzID0gQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtb3duc1wiKS50cmltKCkpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3duZWRfaWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IG93bmVkX2VsZSA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKHJ1bGVDb250ZXh0LCBvd25lZF9pZHNbaV0pO1xuICAgICAgICAgICAgICAgIGlmIChvd25lZF9lbGUgJiYgIURPTVV0aWwuc2FtZU5vZGUob3duZWRfZWxlLCBydWxlQ29udGV4dCkgJiYgb3duZWRfZWxlLmNvbnRhaW5zKGRlc2NlbmRhbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyAyLiBUaGUgZWxlbWVudCB3aXRoIERPTSBmb2N1cyBpcyBhIHRleHRib3ggd2l0aCBhcmlhLWNvbnRyb2xzIHJlZmVycmluZyB0byBhbiBlbGVtZW50IHRoYXQgXG4gICAgICAgIC8vICBzdXBwb3J0cyBhcmlhLWFjdGl2ZWRlc2NlbmRhbnQsIGFuZCB0aGUgdmFsdWUgb2YgYXJpYS1hY3RpdmVkZXNjZW5kYW50IHNwZWNpZmllZCBmb3IgdGhlIFxuICAgICAgICAvLyAgdGV4dGJveCByZWZlcnMgdG8gZWl0aGVyIGEgZGVzY2VuZGFudCBvZiB0aGUgZWxlbWVudCBjb250cm9sbGVkIGJ5IHRoZSB0ZXh0Ym94IG9yIGlzIGEgbG9naWNhbCBcbiAgICAgICAgLy8gIGRlc2NlbmRhbnQgb2YgdGhhdCBjb250cm9sbGVkIGVsZW1lbnQgYXMgaW5kaWNhdGVkIGJ5IHRoZSBhcmlhLW93bnMgYXR0cmlidXRlLlxuICAgICAgICAvL1xuICAgICAgICBpZiAoQXJpYVV0aWwuaGFzUm9sZUluU2VtYW50aWNzKHJ1bGVDb250ZXh0LCBcInRleHRib3hcIikgJiYgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiYXJpYS1jb250cm9sc1wiKSkge1xuICAgICAgICAgICAgcG9mSWQgPSAzO1xuICAgICAgICAgICAgbGV0IGNvbnRyb2xsZWRfaWRzID0gQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtY29udHJvbHNcIikudHJpbSgpKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbnRyb2xsZWRfaWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNvbnRyb2xsZWRfZWxlID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQocnVsZUNvbnRleHQsIGNvbnRyb2xsZWRfaWRzW2ldKTtcbiAgICAgICAgICAgICAgICBpZiAoY29udHJvbGxlZF9lbGUgJiYgIURPTVV0aWwuc2FtZU5vZGUoY29udHJvbGxlZF9lbGUsIHJ1bGVDb250ZXh0KSAmJiBjb250cm9sbGVkX2VsZS5jb250YWlucyhkZXNjZW5kYW50KSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjb250cm9sbGVkX2VsZS5oYXNBdHRyaWJ1dGUoXCJhcmlhLW93bnNcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG93bnNfaWRzID0gQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKGNvbnRyb2xsZWRfZWxlLmdldEF0dHJpYnV0ZShcImFyaWEtb3duc1wiKS50cmltKCkpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBvd25zX2lkcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG93bmVkX2VsZSA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKHJ1bGVDb250ZXh0LCBvd25zX2lkc1tqXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3duZWRfZWxlICYmICFET01VdGlsLnNhbWVOb2RlKG93bmVkX2VsZSwgcnVsZUNvbnRleHQpICYmIG93bmVkX2VsZS5jb250YWlucyhkZXNjZW5kYW50KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFBPRjM6IEknbSBub3QgYSBjb21ib2JveCwgYW5kIHRoZSByZWZlcmVuY2VkIGFjdGl2ZS1kZXNjZW5kYW50IGlzIG5vdCBhIGRlc2NlbmRhbnQgYW5kIG5vdCBvd25lZCBieSB0aGUgZWxlbWVudCBcbiAgICAgICAgLy8gdGhhdCByZWZlcmVuY2VkIGl0LlxuICAgICAgICBpZiAocG9mSWQgPT0gMykge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8zXCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX2FwcGxpY2F0aW9uX2xhYmVsX3VuaXF1ZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2FwcGxpY2F0aW9uX2xhYmVsX3VuaXF1ZVwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTphcHBsaWNhdGlvblwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfTXVsdGlwbGVBcHBsaWNhdGlvbkxhbmRtYXJrc1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiYXJpYV9hcHBsaWNhdGlvbl9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIjogXCJhcmlhX2FwcGxpY2F0aW9uX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9hcHBsaWNhdGlvbl9sYWJlbF91bmlxdWUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiVGhlIGVsZW1lbnQgd2l0aCBcXFwiYXBwbGljYXRpb25cXFwiIHJvbGUgaGFzIGEgdW5pcXVlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCIsXG4gICAgICAgICAgICBcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwiOiBcIk11bHRpcGxlIGVsZW1lbnRzIHdpdGggXFxcImFwcGxpY2F0aW9uXFxcIiByb2xlIGRvIG5vdCBoYXZlIHVuaXF1ZSBsYWJlbHNcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFYWNoIGVsZW1lbnQgd2l0aCBcXFwiYXBwbGljYXRpb25cXFwiIHJvbGUgbXVzdCBoYXZlIGEgdW5pcXVlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjQuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IGR1cHBlZCA9IEFyaWFVdGlsLmlzTGFuZG1hcmtOYW1lVW5pcXVlKHJ1bGVDb250ZXh0LCBcImFwcGxpY2F0aW9uXCIpOyAgICBcbiAgICAgICAgaWYgKGR1cHBlZCA9PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIGlmIChkdXBwZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBY2NOYW1lVXRpbCB9IGZyb20gXCIuLi91dGlsL0FjY05hbWVVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9hcHBsaWNhdGlvbl9sYWJlbGxlZDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2FwcGxpY2F0aW9uX2xhYmVsbGVkXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmFwcGxpY2F0aW9uXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9BcHBsaWNhdGlvbkxhbmRtYXJrTGFiZWxcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImZhaWxfbm9fbGFiZWxcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJhcmlhX2FwcGxpY2F0aW9uX2xhYmVsbGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9ub19sYWJlbFwiOiBcImFyaWFfYXBwbGljYXRpb25fbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfYXBwbGljYXRpb25fbGFiZWxsZWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiVGhlIGVsZW1lbnQgd2l0aCBcXFwiYXBwbGljYXRpb25cXFwiIHJvbGUgaGFzIGEgbGFiZWwgdGhhdCBkZXNjcmliZXMgaXRzIHB1cnBvc2VcIixcbiAgICAgICAgICAgIFwiZmFpbF9ub19sYWJlbFwiOiBcIkVsZW1lbnQgd2l0aCBcXFwiYXBwbGljYXRpb25cXFwiIHJvbGUgZG9lcyBub3QgaGF2ZSBhIGxhYmVsXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWFjaCBlbGVtZW50IHdpdGggXFxcImFwcGxpY2F0aW9uXFxcIiByb2xlIG11c3QgaGF2ZSBhIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjQuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZShydWxlQ29udGV4dCk7XG4gICAgICAgIGlmICghcGFpcikge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9ub19sYWJlbFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9hcnRpY2xlX2xhYmVsX3VuaXF1ZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2FydGljbGVfbGFiZWxfdW5pcXVlXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmFydGljbGVcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX011bHRpcGxlQXJ0aWNsZVJvbGVzX0ltcGxpY2l0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJhcmlhX2FydGljbGVfbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCI6IFwiYXJpYV9hcnRpY2xlX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9hcnRpY2xlX2xhYmVsX3VuaXF1ZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJUaGUgZWxlbWVudCB3aXRoIFxcXCJhcnRpY2xlXFxcIiByb2xlIGhhcyBhIHVuaXF1ZSBsYWJlbCB0aGF0IGRlc2NyaWJlcyBpdHMgcHVycG9zZVwiLFxuICAgICAgICAgICAgXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIjogXCJNdWx0aXBsZSBlbGVtZW50cyB3aXRoIFxcXCJhcnRpY2xlXFxcIiByb2xlIGRvIG5vdCBoYXZlIHVuaXF1ZSBsYWJlbHNcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFYWNoIGVsZW1lbnQgd2l0aCBcXFwiYXJ0aWNsZVxcXCIgcm9sZSBtdXN0IGhhdmUgYSB1bmlxdWUgbGFiZWwgdGhhdCBkZXNjcmliZXMgaXRzIHB1cnBvc2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuNC4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgY29uc3QgZHVwcGVkID0gQXJpYVV0aWwuaXNMYW5kbWFya05hbWVVbmlxdWUocnVsZUNvbnRleHQsIFwiYXJ0aWNsZVwiKTsgICAgXG4gICAgICAgIGlmIChkdXBwZWQgPT0gbnVsbCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgaWYgKGR1cHBlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFSSUFEZWZpbml0aW9ucyB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFEZWZpbml0aW9uc1wiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9hdHRyaWJ1dGVfYWxsb3dlZDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2F0dHJpYnV0ZV9hbGxvd2VkXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfVmFsaWRQcm9wZXJ0eVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBgYXJpYV9hdHRyaWJ1dGVfYWxsb3dlZC5odG1sYCxcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IGBhcmlhX2F0dHJpYnV0ZV9hbGxvd2VkLmh0bWxgLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogYGFyaWFfYXR0cmlidXRlX2FsbG93ZWQuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQVJJQSBhdHRyaWJ1dGVzIG11c3QgYmUgdmFsaWQgZm9yIHRoZSBlbGVtZW50J3Mgcm9sZVwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUaGUgYXR0cmlidXRlKHMpICd7MH0nIHJlZmVyZW5jZWQgYnkgdGhlIGVsZW1lbnQgPHsxfT4gaXMgbm90IGEgdmFsaWQgQVJJQSBzdGF0ZSBvciBwcm9wZXJ0eVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBpZDogWyBcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgbnVtOiBcIjQuMS4yXCIsIC8vIG51bTogWyBcIjIuNC40XCIsIFwieC55LnpcIiBdIGFsc28gYWxsb3dlZFxuICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBcIjVmOTlhN1wiLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBjb250ZXh0QXR0cmlidXRlcyA9IHJ1bGVDb250ZXh0LmF0dHJpYnV0ZXM7XG4gICAgICAgIFxuICAgICAgICAvLyBUaGlzIGdldHMgYWxsIGVsZW1lbnRzIHdpdGggYXR0cmlidXRlcyBzbyB3ZSBzdGlsbCBoYXZlIHNvbWVcbiAgICAgICAgLy8gT3V0IG9mIFNjb3BlIHNpbmNlIG5vdCBhbGwgYXR0cmlidXRlcyBhcmUgYXJpYSBcblxuICAgICAgICBpZiAoY29udGV4dEF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgIGxldCBwcm9wZXJ0eURhdGFUeXBlcyA9IEFSSUFEZWZpbml0aW9ucy5wcm9wZXJ0eURhdGFUeXBlcztcbiAgICAgICAgICAgIGxldCBmYWlsZWRQcm9wZXJ0aWVzID0gXCJcIjtcbiAgICAgICAgICAgIGxldCB0ZXN0ZWRQcm9wZXJ0aWVzID0gMDtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW5ndGggPSBjb250ZXh0QXR0cmlidXRlcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBhdHRyTmFtZSA9IGNvbnRleHRBdHRyaWJ1dGVzW2ldLm5hbWU7XG4gICAgICAgICAgICAgICAgaWYgKEFyaWFVdGlsLmlzRGVmaW5lZEFyaWFBdHRyaWJ1dGUocnVsZUNvbnRleHQsIGF0dHJOYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICB0ZXN0ZWRQcm9wZXJ0aWVzKys7XG4gICAgICAgICAgICAgICAgICAgIC8vIE5vdyB3ZSBqdXN0IGhhdmUgYXJpYSBhdHRyaWJ1dGVzIHdoaWNoIGNhblxuICAgICAgICAgICAgICAgICAgICAvLyBwYXNzIG9yIGZhaWwgYmFzZWQgb24gd2hldGhlciB0aGVyZSBwcm9wZXJ0eSBpcyB2YWxpZFxuICAgICAgICAgICAgICAgICAgICBsZXQgZGF0YVR5cGVzID0gcHJvcGVydHlEYXRhVHlwZXNbYXR0ck5hbWVdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWRhdGFUeXBlcykgeyAvLyBpZiBwcm9wZXJ0eSBpcyBub3QgaW4gdmFsaWQgcHJvcGVydHkgbGlzdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGZhaWxlZFByb3BlcnRpZXMgY29tbWEgc2VwIGxpc3RcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmYWlsZWRQcm9wZXJ0aWVzLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbGVkUHJvcGVydGllcyA9IGF0dHJOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsZWRQcm9wZXJ0aWVzID0gZmFpbGVkUHJvcGVydGllcyArIFwiLCBcIiArIGF0dHJOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRlc3RlZFByb3BlcnRpZXMgPT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChmYWlsZWRQcm9wZXJ0aWVzLmxlbmd0aCAhPSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIsIFtmYWlsZWRQcm9wZXJ0aWVzLCBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vcmV0dXJuIFJ1bGVQYXNzKDEpO1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIC8vIEpDSCAtIHBhc3NpbmcgaXMgYmFzZWQgb24gYWxsIGF0dHJpYnV0ZXMgbm90IGp1c3QgYXJpYSBhdHRyaWJ1dGVzXG4gICAgICAgIC8vICAgICAgIGxlYWRpbmcgdG8gT1ZFUiBDT1VOVElORyBzbyBtb3ZlZCBwYXNzIHVwXG4gICAgICAgIC8vcmV0dXJuIFJ1bGVQYXNzKDEpO1xuICAgIH1cbn1cbiAgICAiLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfYXR0cmlidXRlX2NvbmZsaWN0OiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfYXR0cmlidXRlX2NvbmZsaWN0XCIsXG4gICAgY29udGV4dDogXCJkb206KlthcmlhLXJlcXVpcmVkXSwgZG9tOipbYXJpYS1hdXRvY29tcGxldGVdLCBkb206KlthcmlhLXJlYWRvbmx5XSwgZG9tOipbYXJpYS1kaXNhYmxlZF0sIGRvbToqW2FyaWEtcGxhY2Vob2xkZXJdXCIgXG4gICAgICAgICAgICArIFwiLCBkb206KlthcmlhLWNoZWNrZWRdLCBkb206KlthcmlhLWhpZGRlbl0sIGRvbToqW2FyaWEtdmFsdWVtYXhdLCBkb206KlthcmlhLXZhbHVlbWluXSwgZG9tOipbYXJpYS1jb2xzcGFuXVwiXG4gICAgICAgICAgICArIFwiLCBkb206KlthcmlhLXJvd3NwYW5dXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIC8vIFwicGFzc1wiOiBcImFyaWFfYXR0cmlidXRlX2NvbmZsaWN0Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9jb25mbGljdFwiOiBcImFyaWFfYXR0cmlidXRlX2NvbmZsaWN0Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2F0dHJpYnV0ZV9jb25mbGljdC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICAvLyBcInBhc3NcIjogXCJUaGUgQVJJQSBhdHRyaWJ1dGUgaXMgbm90IGNvbmZsaWN0IHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgSFRNTCBhdHRyaWJ1dGVcIixcbiAgICAgICAgICAgIFwiZmFpbF9jb25mbGljdFwiOiBcIlRoZSBBUklBIGF0dHJpYnV0ZSBcXFwiezB9XFxcIiBpcyBpbiBjb25mbGljdCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIEhUTUwgYXR0cmlidXRlIFxcXCJ7MX1cXFwiXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQW4gQVJJQSBhdHRyaWJ1dGUgbXVzdCBub3QgY29uZmxpY3Qgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBIVE1MIGF0dHJpYnV0ZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAgIC8vIGRlcGVuZGVuY3kgY2hlY2s6IGlmIHRoZSBBUklBIGF0dHJpYnV0ZSBpcyBjb21wbGV0ZWx5IGludmFsaWQsIHNraXAgdGhpcyBjaGVja1xuICAgICAgICBsZXQgaW52YWxpZEF0dHJpYnV0ZXMgPSBBcmlhVXRpbC5nZXRJbnZhbGlkQXJpYUF0dHJpYnV0ZXMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoaW52YWxpZEF0dHJpYnV0ZXMgJiYgaW52YWxpZEF0dHJpYnV0ZXMubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgbGV0IHJldCA9IFtdO1xuICAgICAgICBsZXQgYXJpYUF0dHJpYnV0ZXMgPSBBcmlhVXRpbC5nZXRVc2VyRGVmaW5lZEFyaWFBdHRyaWJ1dGVzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKCFhcmlhQXR0cmlidXRlcyB8fCBhcmlhQXR0cmlidXRlcy5sZW5ndGggPT09MClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCBjb25mbGljdEF0dHJpYnV0ZXMgPSBBcmlhVXRpbC5nZXRDb25mbGljdEFyaWFBbmRIdG1sQXR0cmlidXRlcyhydWxlQ29udGV4dCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29uZmxpY3RBdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICByZXQucHVzaChSdWxlRmFpbChcImZhaWxfY29uZmxpY3RcIiwgW2NvbmZsaWN0QXR0cmlidXRlc1tpXVsnYXJpYUF0dHInXSwgY29uZmxpY3RBdHRyaWJ1dGVzW2ldWydodG1sQXR0ciddXSkpO1xuICAgICAgICAgICAgaWYgKGFyaWFBdHRyaWJ1dGVzLmluY2x1ZGVzKGNvbmZsaWN0QXR0cmlidXRlc1tpXVsnYXJpYUF0dHInXSkpXG4gICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5yZWR1Y2VBcnJheUl0ZW1MaXN0KFtjb25mbGljdEF0dHJpYnV0ZXNbaV1bJ2FyaWFBdHRyJ11dLCBhcmlhQXR0cmlidXRlcyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmV0Lmxlbmd0aCA+IDApIFxuICAgICAgICAgICAgcmV0dXJuIHJldDtcblxuICAgICAgICByZXR1cm4gbnVsbDsgIFxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9hdHRyaWJ1dGVfZGVwcmVjYXRlZDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2F0dHJpYnV0ZV9kZXByZWNhdGVkXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICAvLyBcInBhc3NcIjogXCJhcmlhX2F0dHJpYnV0ZV9kZXByZWNhdGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9hcmlhX3JvbGVcIjogXCJhcmlhX2F0dHJpYnV0ZV9kZXByZWNhdGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9hcmlhX2F0dHJcIjogXCJhcmlhX2F0dHJpYnV0ZV9kZXByZWNhdGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9yb2xlX2F0dHJcIjogXCJhcmlhX2F0dHJpYnV0ZV9kZXByZWNhdGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2F0dHJpYnV0ZV9kZXByZWNhdGVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIC8vIFwicGFzc1wiOiBcIlRoZSBBUklBIHJvbGVzIGFuZCBhdHRyaWJ1dGUgYXJlIHVzZWQgcGVyIHNwZWNpZmljYXRpb25cIixcbiAgICAgICAgICAgIFwiZmFpbF9hcmlhX3JvbGVcIjogXCJUaGUgQVJJQSByb2xlIFxcXCJ7MH1cXFwiIGlzIGRlcHJlY2F0ZWQgaW4gdGhlIEFSSUEgc3BlY2lmaWNhdGlvblwiLFxuICAgICAgICAgICAgXCJmYWlsX2FyaWFfYXR0clwiOiBcIlRoZSBBUklBIGF0dHJpYnV0ZXMgXFxcInswfVxcXCIgYXJlIGRlcHJlY2F0ZWQgaW4gdGhlIEFSSUEgc3BlY2lmaWNhdGlvblwiLFxuICAgICAgICAgICAgXCJmYWlsX3JvbGVfYXR0clwiOiBcIlRoZSBBUklBIGF0dHJpYnV0ZXMgXFxcInswfVxcXCIgYXJlIGRlcHJlY2F0ZWQgZm9yIHRoZSByb2xlIFxcXCJ7MX1cXFwiIGluIHRoZSBBUklBIHNwZWNpZmljYXRpb25cIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJObyBkZXByZWNhdGVkIEFSSUEgcm9sZSBvciBhdHRyaWJ1dGUgc2hvdWxkIGJlIHVzZWRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3sgXG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCJdLCBcbiAgICAgICAgXCJudW1cIjogW1wiQVJJQVwiXSwgXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sIFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFIFxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAgIGxldCByZXQgPSBbXTtcbiAgICAgICAgY29uc3QgZGVwcmVjYXRlZFJvbGVzID0gQXJpYVV0aWwuZ2V0RGVwcmVjYXRlZEFyaWFSb2xlcyhydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChkZXByZWNhdGVkUm9sZXMgJiYgZGVwcmVjYXRlZFJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGVwcmVjYXRlZFJvbGVzLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgICAgIHJldC5wdXNoKFJ1bGVGYWlsKCdmYWlsX2FyaWFfcm9sZScsIFtkZXByZWNhdGVkUm9sZXNbaV1dKSk7ICAgICBcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRlcHJlY2F0ZWRBdHRyaWJ1dGVzID0gQXJpYVV0aWwuZ2V0RGVwcmVjYXRlZEFyaWFBdHRyaWJ1dGVzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKGRlcHJlY2F0ZWRBdHRyaWJ1dGVzICYmIGRlcHJlY2F0ZWRBdHRyaWJ1dGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGVwcmVjYXRlZEF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAvLyBcInJvbGVcIjpcImFueVwiLCBcImF0dHJpYnV0ZVwiOmFyaWFBdHRyc1tpXX1cbiAgICAgICAgICAgICAgICBpZiAoZGVwcmVjYXRlZEF0dHJpYnV0ZXNbaV0ucm9sZSA9PT0gJ2FueScpXG4gICAgICAgICAgICAgICAgICAgIHJldC5wdXNoKFJ1bGVGYWlsKCdmYWlsX2FyaWFfYXR0cicsIFtkZXByZWNhdGVkQXR0cmlidXRlc1tpXS5hdHRyaWJ1dGVdKSk7XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICByZXQucHVzaChSdWxlRmFpbCgnZmFpbF9yb2xlX2F0dHInLCBbZGVwcmVjYXRlZEF0dHJpYnV0ZXNbaV0uYXR0cmlidXRlLCBkZXByZWNhdGVkQXR0cmlidXRlc1tpXS5yb2xlXSkpO1xuICAgICAgICAgICAgfSAgICAgICBcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKHJldC5sZW5ndGggPiAwKVxuICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IEFSSUFEZWZpbml0aW9ucyB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFEZWZpbml0aW9uc1wiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfYXR0cmlidXRlX2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2F0dHJpYnV0ZV9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbToqW3JvbGVdXCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJhcmlhX3JvbGVfYWxsb3dlZFwiXSxcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX0VtcHR5UHJvcGVydHlWYWx1ZVwiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcImZhaWxfZW1wdHlfYXR0cmlidXRlXCI6IFwiZmFpbF9lbXB0eV9hdHRyaWJ1dGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiYXJpYV9hdHRyaWJ1dGVfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9lbXB0eV9hdHRyaWJ1dGVcIjogXCJhcmlhX2F0dHJpYnV0ZV9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfYXR0cmlidXRlX2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJmYWlsX2VtcHR5X2F0dHJpYnV0ZVwiOiBcIlRoZSBlbGVtZW50IGF0dHJpYnV0ZShzKTogJ3swfScgdmFsdWUgaXMgZW1wdHlcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJXaGVuIHNwZWNpZnlpbmcgYSByZXF1aXJlZCBBUklBIGF0dHJpYnV0ZSwgdGhlIHZhbHVlIG11c3Qgbm90IGJlIGVtcHR5XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXCI2YTcyODFcIl0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcblxuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IGlzIGhpZGRlblxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGxldCBhdHRyTmFtZUFyciA9IG5ldyBBcnJheSgpO1xuICAgICAgICBsZXQgZGVzaWduUGF0dGVybnMgPSBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnM7XG4gICAgICAgIGxldCBoYXNBdHRyaWJ1dGUgPSBDb21tb25VdGlsLmhhc0F0dHJpYnV0ZTtcbiAgICAgICAgbGV0IHRlc3RlZFByb3BlcnRpZXMgPSAwO1xuXG4gICAgICAgIGxldCByb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKCFyb2xlKSByZXR1cm47XG4gICAgICAgIGlmIChkZXNpZ25QYXR0ZXJuc1tyb2xlXSAmJiBBcmlhVXRpbC5nZXRSb2xlUmVxdWlyZWRQcm9wZXJ0aWVzKHJvbGUsIHJ1bGVDb250ZXh0KSAhPSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgcmVxdWlyZWRSb2xlUHJvcHMgPSBBcmlhVXRpbC5nZXRSb2xlUmVxdWlyZWRQcm9wZXJ0aWVzKHJvbGUsIHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW5ndGggPSByZXF1aXJlZFJvbGVQcm9wcy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBhdHRyaWJ1dGUgPSByZXF1aXJlZFJvbGVQcm9wc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoaGFzQXR0cmlidXRlKHJ1bGVDb250ZXh0LCBhdHRyaWJ1dGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRlc3RlZFByb3BlcnRpZXMrKztcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5vZGVWYWx1ZSA9IENvbW1vblV0aWwubm9ybWFsaXplU3BhY2luZyhydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUocmVxdWlyZWRSb2xlUHJvcHNbaV0pKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGVWYWx1ZS5sZW5ndGggPT0gMCkgYXR0ck5hbWVBcnIucHVzaChyZXF1aXJlZFJvbGVQcm9wc1tpXSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXF1aXJlZFJvbGVQcm9wc1tpXSA9PSBcImFyaWEtbGFiZWxsZWRieVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgocm9sZSA9PSBcInJhZGlvZ3JvdXBcIikgJiYgKGhhc0F0dHJpYnV0ZShydWxlQ29udGV4dCwgXCJhcmlhLWxhYmVsXCIpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGVzdGVkUHJvcGVydGllcysrO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5vZGVWYWx1ZSA9IENvbW1vblV0aWwubm9ybWFsaXplU3BhY2luZyhydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlVmFsdWUubGVuZ3RoID09IDApIGF0dHJOYW1lQXJyLnB1c2goXCJhcmlhLWxhYmVsXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXF1aXJlZFJvbGVQcm9wc1tpXSA9PSBcImFyaWEtdmFsdWVub3dcIikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoKHJvbGUgPT0gXCJwcm9ncmVzc2JhclwiKSAmJiAoaGFzQXR0cmlidXRlKHJ1bGVDb250ZXh0LCBcImFyaWEtdmFsdWV0ZXh0XCIpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGVzdGVkUHJvcGVydGllcysrO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5vZGVWYWx1ZSA9IENvbW1vblV0aWwubm9ybWFsaXplU3BhY2luZyhydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhcmlhLXZhbHVldGV4dFwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZVZhbHVlLmxlbmd0aCA9PSAwKSBhdHRyTmFtZUFyci5wdXNoKFwiYXJpYS12YWx1ZXRleHRcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmIChkZXNpZ25QYXR0ZXJuc1tyb2xlXSkge1xuICAgICAgICAgICAgbGV0IHRhZ1Byb3BlcnR5ID0gQXJpYVV0aWwuZ2V0RWxlbWVudEFyaWFQcm9wZXJ0eShydWxlQ29udGV4dCk7XG4gICAgICAgICAgICBsZXQgcGVybWl0dGVkUm9sZXMgPSBbXTtcbiAgICAgICAgICAgIHBlcm1pdHRlZFJvbGVzLnB1c2gocm9sZSk7XG4gICAgICAgICAgICBsZXQgYWxsb3dlZEF0dHJpYnV0ZXMgPSBBcmlhVXRpbC5nZXRBbGxvd2VkQXJpYUF0dHJpYnV0ZXMocnVsZUNvbnRleHQsIHBlcm1pdHRlZFJvbGVzLCB0YWdQcm9wZXJ0eSk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuZ3RoID0gYWxsb3dlZEF0dHJpYnV0ZXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgYXR0cmlidXRlID0gYWxsb3dlZEF0dHJpYnV0ZXNbaV07XG4gICAgICAgICAgICAgICAgaWYgKGF0dHJpYnV0ZSA9PSBcImFyaWEtY2hlY2tlZFwiIHx8IGF0dHJpYnV0ZSA9PSBcImFyaWEtc2VsZWN0ZWRcIiB8fFxuICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGUgPT0gXCJhcmlhLWV4cGFuZGVkXCIgfHwgYXR0cmlidXRlID09IFwiYXJpYS1vcmllbnRhdGlvblwiIHx8XG4gICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZSA9PSBcImFyaWEtbGV2ZWxcIikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaGFzQXR0cmlidXRlKHJ1bGVDb250ZXh0LCBhdHRyaWJ1dGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXN0ZWRQcm9wZXJ0aWVzKys7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbm9kZVZhbHVlID0gQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShhdHRyaWJ1dGUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlVmFsdWUubGVuZ3RoID09IDAgJiYgIWF0dHJOYW1lQXJyLmluY2x1ZGVzKGF0dHJpYnV0ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyTmFtZUFyci5wdXNoKGF0dHJpYnV0ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmV0TXNnID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCBwYXNzZWQgPSBhdHRyTmFtZUFyci5sZW5ndGggPT0gMDtcbiAgICAgICAgcmV0TXNnLnB1c2goYXR0ck5hbWVBcnIuam9pbihcIiwgXCIpKTtcbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBbcnVsZUNvbnRleHRdLCBhdHRyTmFtZUFyciwgJycsIHJldE1zZyk7XG4gICAgICAgIGlmICh0ZXN0ZWRQcm9wZXJ0aWVzID09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9IGVsc2UgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfZW1wdHlfYXR0cmlidXRlXCIsIHJldE1zZyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9hdHRyaWJ1dGVfcmVkdW5kYW50OiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfYXR0cmlidXRlX3JlZHVuZGFudFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbYXJpYS1yZXF1aXJlZF0sIGRvbToqW2FyaWEtYXV0b2NvbXBsZXRlXSwgZG9tOipbYXJpYS1yZWFkb25seV0sIGRvbToqW2FyaWEtZGlzYWJsZWRdLCBkb206KlthcmlhLXBsYWNlaG9sZGVyXVwiIFxuICAgICAgICAgICAgKyBcIiwgZG9tOipbYXJpYS1jaGVja2VkXSwgZG9tOipbYXJpYS1oaWRkZW5dLCBkb206KlthcmlhLXZhbHVlbWF4XSwgZG9tOipbYXJpYS12YWx1ZW1pbl0sIGRvbToqW2FyaWEtY29sc3Bhbl1cIlxuICAgICAgICAgICAgKyBcIiwgZG9tOipbYXJpYS1yb3dzcGFuXVwiLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJhcmlhX2F0dHJpYnV0ZV9yZWR1bmRhbnQuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX3JlZHVuZGFudFwiOiBcImFyaWFfYXR0cmlidXRlX3JlZHVuZGFudC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9hdHRyaWJ1dGVfcmVkdW5kYW50Lmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlRoZSBBUklBIGF0dHJpYnV0ZSBpcyBub3QgcmVkdW5kYW50IHdpdGggYSBjb3JyZXNwb25kaW5nIEhUTUwgYXR0cmlidXRlXCIsXG4gICAgICAgICAgICBcImZhaWxfcmVkdW5kYW50XCI6IFwiVGhlIEFSSUEgYXR0cmlidXRlIFxcXCJ7MH1cXFwiIGlzIHJlZHVuZGFudCB3aXRoIHRoZSBIVE1MIGF0dHJpYnV0ZSBcXFwiezF9XFxcIlwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkFuIEFSSUEgYXR0cmlidXRlIHNob3VsZCBub3QgYmUgcmVkdW5kYW50IHdpdGggYSBjb3JyZXNwb25kaW5nIEhUTUwgYXR0cmlidXRlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIFxuICAgICAgICAvLyBkZXBlbmRlbmN5IGNoZWNrOiBpZiB0aGUgQVJJQSBhdHRyaWJ1dGUgaXMgY29tcGxldGVseSBpbnZhbGlkLCBza2lwIHRoaXMgY2hlY2tcbiAgICAgICAgbGV0IGludmFsaWRBdHRyaWJ1dGVzID0gQXJpYVV0aWwuZ2V0SW52YWxpZEFyaWFBdHRyaWJ1dGVzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKGludmFsaWRBdHRyaWJ1dGVzICYmIGludmFsaWRBdHRyaWJ1dGVzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICAvLyBpZiBjb25mbGljdCBhbHJlYWR5IHJlcG9ydGVkLCBpZ25vcmUgcmVwb3J0aW5nIG92ZXJsYXBcbiAgICAgICAgbGV0IGNvbmZsaWN0QXR0cmlidXRlcyA9IEFyaWFVdGlsLmdldENvbmZsaWN0QXJpYUFuZEh0bWxBdHRyaWJ1dGVzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKGNvbmZsaWN0QXR0cmlidXRlcyAmJiBjb25mbGljdEF0dHJpYnV0ZXMubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCBkb21BdHRyaWJ1dGVzID0gcnVsZUNvbnRleHQuYXR0cmlidXRlcztcbiAgICAgICAgbGV0IGFyaWFBdHRycyA9IFtdO1xuICAgICAgICBsZXQgaHRtbEF0dHJzID0gW107XG4gICAgICAgIGlmIChkb21BdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRvbUF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgYXR0ck5hbWUgPSBkb21BdHRyaWJ1dGVzW2ldLm5hbWUudHJpbSgpLnRvTG93ZXJDYXNlKCk7IFxuICAgICAgICAgICAgICAgIGxldCBhdHRyVmFsdWUgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoYXR0ck5hbWUpO1xuICAgICAgICAgICAgICAgIGlmIChhdHRyVmFsdWUgPT09ICcnKSBhdHRyVmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgICAgIGlmIChhdHRyTmFtZS5zdWJzdHJpbmcoMCwgNSkgPT09ICdhcmlhLScpIFxuICAgICAgICAgICAgICAgICAgICBhcmlhQXR0cnMucHVzaCh7bmFtZTogYXR0ck5hbWUsIHZhbHVlOiBhdHRyVmFsdWV9KTtcbiAgICAgICAgICAgICAgICBlbHNlIFxuICAgICAgICAgICAgICAgICAgICBodG1sQXR0cnMucHVzaCh7bmFtZTogYXR0ck5hbWUsIHZhbHVlOiBhdHRyVmFsdWV9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgcmV0ID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJpYUF0dHJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBleGFtaW5lZEh0bWxBdHJOYW1lcyA9IEFyaWFVdGlsLmdldENvbmZsaWN0T3JPdmVybGFwcGluZ0h0bWxBdHRyaWJ1dGUoYXJpYUF0dHJzW2ldLCBodG1sQXR0cnMsICdvdmVybGFwcGluZycpO1xuICAgICAgICAgICAgaWYgKGV4YW1pbmVkSHRtbEF0ck5hbWVzID09PSBudWxsKSBjb250aW51ZTtcbiAgICAgICAgICAgIGV4YW1pbmVkSHRtbEF0ck5hbWVzLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGl0ZW1bJ3Jlc3VsdCddID09PSAnUGFzcycpIHsgLy9wYXNzXG4gICAgICAgICAgICAgICAgICAgIHJldC5wdXNoKFJ1bGVQYXNzKFwicGFzc1wiKSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpdGVtWydyZXN1bHQnXSA9PT0gJ0ZhaWxlZCcpIHsgLy9mYWlsZWRcbiAgICAgICAgICAgICAgICAgICAgcmV0LnB1c2goUnVsZUZhaWwoXCJmYWlsX3JlZHVuZGFudFwiLCBbYXJpYUF0dHJzW2ldWyduYW1lJ10sIGl0ZW1bJ2F0dHInXV0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTsgICAgXG4gICAgICAgIH0gICAgXG4gICAgICAgIGlmIChyZXQubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgQVJJQURlZmluaXRpb25zIH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQURlZmluaXRpb25zXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfYXR0cmlidXRlX3JlcXVpcmVkOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfYXR0cmlidXRlX3JlcXVpcmVkXCIsXG4gICAgY29udGV4dDogXCJkb206Kltyb2xlXVwiLFxuICAgIGRlcGVuZGVuY2llczogW1wiYXJpYV9yb2xlX2FsbG93ZWRcIl0sXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9SZXF1aXJlZFByb3BlcnRpZXNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImZhaWxfbWlzc2luZ1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IGBhcmlhX2F0dHJpYnV0ZV9yZXF1aXJlZC5odG1sYCxcbiAgICAgICAgICAgIFwicGFzc1wiOiBgYXJpYV9hdHRyaWJ1dGVfcmVxdWlyZWQuaHRtbGAsXG4gICAgICAgICAgICBcImZhaWxfbWlzc2luZ1wiOiBgYXJpYV9hdHRyaWJ1dGVfcmVxdWlyZWQuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGhlIHJlcXVpcmVkIGF0dHJpYnV0ZXMgZm9yIHRoZSBlbGVtZW50IHdpdGggYSByb2xlIG11c3QgYmUgZGVmaW5lZFwiLFxuICAgICAgICAgICAgXCJwYXNzXCI6IFwiVGhlIHJlcXVpcmVkIGF0dHJpYnV0ZXMgZm9yIHRoZSBlbGVtZW50IHdpdGggdGhlIHJvbGUgYXJlIGRlZmluZWRcIixcbiAgICAgICAgICAgIFwiZmFpbF9taXNzaW5nXCI6IFwiRWxlbWVudCB3aXRoICd7MH0nIHJvbGUgZG9lcyBub3QgaGF2ZSB0aGUgcmVxdWlyZWQgQVJJQSBhdHRyaWJ1dGUocyk6ICd7MX0nXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbIFwiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBudW06IFwiNC4xLjJcIiwgLy8gbnVtOiBbIFwiMi40LjRcIiwgXCJ4LnkuelwiIF0gYWxzbyBhbGxvd2VkXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFwiNGU4YWI2XCIsXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IGF0dHJOYW1lQXJyID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCByb2xlTmFtZUFyciA9IG5ldyBBcnJheSgpO1xuICAgICAgICBsZXQgZGVzaWduUGF0dGVybnMgPSBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnM7XG4gICAgICAgIC8vbGV0IGltcGxpY2l0Um9sZSA9IEFSSUFNYXBwZXIuZWxlbVRvSW1wbGljaXRSb2xlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgLy9sZXQgaW1wbGljaXRSb2xlID0gQXJpYVV0aWwuZ2V0SW1wbGljaXRSb2xlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgbGV0IGhhc0F0dHJpYnV0ZSA9IENvbW1vblV0aWwuaGFzQXR0cmlidXRlO1xuICAgICAgICBsZXQgdGVzdGVkUm9sZXMgPSAwO1xuXG4gICAgICAgIGxldCB0YWdQcm9wZXJ0eSA9IEFyaWFVdGlsLmdldEVsZW1lbnRBcmlhUHJvcGVydHkocnVsZUNvbnRleHQpO1xuICAgICAgICBsZXQgcm9sZSA9IEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZShydWxlQ29udGV4dCk7XG4gICAgICAgIGlmICghcm9sZSkgcmV0dXJuO1xuICAgICAgICBcbiAgICAgICAgbGV0IHJlcXVpcmVkUm9sZVByb3BzID0gQXJpYVV0aWwuZ2V0Um9sZVJlcXVpcmVkUHJvcGVydGllcyhyb2xlLCBydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChkZXNpZ25QYXR0ZXJuc1tyb2xlXSAmJiByZXF1aXJlZFJvbGVQcm9wcyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IGFsbG93ZWRSb2xlUHJvcHMgPSBBcmlhVXRpbC5nZXRBbGxvd2VkQXJpYUF0dHJpYnV0ZXMocnVsZUNvbnRleHQsIHJvbGUsIHRhZ1Byb3BlcnR5KTtcbiAgICAgICAgICAgIGxldCByb2xlTWlzc2luZ1JlcVByb3AgPSBmYWxzZTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBwcm9wZXJ0aWVzTGVuZ3RoID0gcmVxdWlyZWRSb2xlUHJvcHMubGVuZ3RoOyBpIDwgcHJvcGVydGllc0xlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFhbGxvd2VkUm9sZVByb3BzLmluY2x1ZGVzKHJlcXVpcmVkUm9sZVByb3BzW2ldKSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgaWYgKCFoYXNBdHRyaWJ1dGUocnVsZUNvbnRleHQsIHJlcXVpcmVkUm9sZVByb3BzW2ldKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiBhbiBhcmlhLWxhYmVsbGVkYnkgaXNuJ3QgcHJlc2VudCwgYW4gYXJpYS1sYWJlbCB3aWxsIG1lZXQgdGhlIHJlcXVpcmVtZW50LlxuICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWlyZWRSb2xlUHJvcHNbaV0gPT0gXCJhcmlhLWxhYmVsbGVkYnlcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCghaGFzQXR0cmlidXRlKHJ1bGVDb250ZXh0LCBcImFyaWEtbGFiZWxcIikpIHx8IChyb2xlICE9IFwicmFkaW9ncm91cFwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJOYW1lQXJyLnB1c2gocmVxdWlyZWRSb2xlUHJvcHNbaV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGVNaXNzaW5nUmVxUHJvcCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVxdWlyZWRSb2xlUHJvcHNbaV0gPT0gXCJhcmlhLXZhbHVlbm93XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoIWhhc0F0dHJpYnV0ZShydWxlQ29udGV4dCwgXCJhcmlhLXZhbHVldGV4dFwiKSkgfHwgKHJvbGUgIT0gXCJwcm9ncmVzc2JhclwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJOYW1lQXJyLnB1c2gocmVxdWlyZWRSb2xlUHJvcHNbaV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGVNaXNzaW5nUmVxUHJvcCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVxdWlyZWRSb2xlUHJvcHNbaV0gPT0gXCJhcmlhLWNvbnRyb2xzXCIgJiYgcm9sZSA9PSBcImNvbWJvYm94XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNraXAgdGhpcyBjaGVjayBzaW5jZSBhcmlhLWNvbnRyb2xzIGluIHRoZSB0ZXh0Ym94IG9mIGEgY29tYm9ib3ggaXMgYWxyZWFkeSBoYW5kbGVkIGluIHJ1bGUgSEFBQ19Db21ib2JveF9NdXN0X2hhdmVfVGV4dF9JbnB1dFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXR0ck5hbWVBcnIucHVzaChyZXF1aXJlZFJvbGVQcm9wc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByb2xlTWlzc2luZ1JlcVByb3AgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJvbGVNaXNzaW5nUmVxUHJvcCA9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgcm9sZU5hbWVBcnIucHVzaChyb2xlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgbGV0IHBhc3NlZCA9IHJvbGVOYW1lQXJyLmxlbmd0aCA9PSAwIHx8IGF0dHJOYW1lQXJyLmxlbmd0aCA9PSAwOyAvLyBvbmx5IGFyaWEgYXR0cmlidXRlcyBzbyBOTyBPVVQgT0YgU0NPUEVcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIGxldCByZXRUb2tlbiA9IG5ldyBBcnJheSgpO1xuICAgICAgICAgICAgcmV0VG9rZW4ucHVzaChyb2xlTmFtZUFyci5qb2luKFwiLCBcIikpO1xuICAgICAgICAgICAgcmV0VG9rZW4ucHVzaChhdHRyTmFtZUFyci5qb2luKFwiLCBcIikpO1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9taXNzaW5nXCIsIHJldFRva2VuKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBBUklBRGVmaW5pdGlvbnMgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBRGVmaW5pdGlvbnNcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfYXR0cmlidXRlX3ZhbHVlX3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfYXR0cmlidXRlX3ZhbHVlX3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIGRlcGVuZGVuY2llczogW1wiYXJpYV9hdHRyaWJ1dGVfYWxsb3dlZFwiXSxcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX1ZhbGlkUHJvcGVydHlWYWx1ZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfYXR0cmlidXRlX3ZhbHVlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9hdHRyaWJ1dGVfdmFsdWVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2F0dHJpYnV0ZV92YWx1ZV92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQVJJQSBwcm9wZXJ0eSB2YWx1ZXMgbXVzdCBiZSB2YWxpZFwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUaGUgdmFsdWUgXFxcInswfVxcXCIgc3BlY2lmaWVkIGZvciBhdHRyaWJ1dGUgJ3sxfScgb24gZWxlbWVudCA8ezJ9PiBpcyBub3QgdmFsaWRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFwiNmE3MjgxXCIsXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHZhbHVlQXJyID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCBhdHRyTmFtZUFyciA9IG5ldyBBcnJheSgpO1xuICAgICAgICBsZXQgZGF0YVR5cGVBcnIgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgbGV0IHByb3BlcnR5RGF0YVR5cGVzID0gQVJJQURlZmluaXRpb25zLnByb3BlcnR5RGF0YVR5cGVzO1xuICAgICAgICBsZXQgY29udGV4dEF0dHJpYnV0ZXMgPSBydWxlQ29udGV4dC5hdHRyaWJ1dGVzO1xuICAgICAgICBsZXQgdGVzdGVkUHJvcGVydHlWYWx1ZXMgPSAwO1xuXG4gICAgICAgIGlmIChjb250ZXh0QXR0cmlidXRlcykge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbmd0aCA9IGNvbnRleHRBdHRyaWJ1dGVzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGF0dHJOYW1lID0gY29udGV4dEF0dHJpYnV0ZXNbaV0ubmFtZTtcbiAgICAgICAgICAgICAgICBpZiAoQXJpYVV0aWwuaXNEZWZpbmVkQXJpYUF0dHJpYnV0ZShydWxlQ29udGV4dCwgYXR0ck5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkYXRhVHlwZXMgPSBwcm9wZXJ0eURhdGFUeXBlc1thdHRyTmFtZV07XG4gICAgICAgICAgICAgICAgICAgIGxldCBub2RlVmFsdWUgPSBDb21tb25VdGlsLm5vcm1hbGl6ZVNwYWNpbmcoY29udGV4dEF0dHJpYnV0ZXNbaV0ubm9kZVZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGVzdGVkUHJvcGVydHlWYWx1ZXMrKztcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFUeXBlcyAmJiBkYXRhVHlwZXMudmFsdWVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YVR5cGVzLnZhbHVlcy5pbmRleE9mKG5vZGVWYWx1ZSkgPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YVR5cGVzLnZhbHVlcy5pbmRleE9mKCd1bmRlZmluZWQnKSAhPSAtMSAmJiBub2RlVmFsdWUubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy90cmFuc2xhdGUgJ3VuZGVmaW5lZCcgdG8gbWVhbiAnJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFyaWEtcmVsZXZhbnQgaXMgcmVwcmVzZW50ZWQgYXMgYSBzcGFjZSBkZWxpbWl0ZWQgbGlzdCBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczogXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZGl0aW9ucywgcmVtb3ZhbHMsIHRleHQ7IG9yIGEgc2luZ2xlIGNhdGNoLWFsbCB2YWx1ZSBhbGwuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhVHlwZXMudHlwZSA9PT0gXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNubXRva2Vuc1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYXR0clZhbHVlcyA9IGNvbnRleHRBdHRyaWJ1dGVzW2ldLm5vZGVWYWx1ZS50cmltKCkuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHZhbHVlIGFsbCBpcyBzcGVjaWZpZWQsIGl0IGNhbm5vdCBoYXZlIGFueSBvdGhlciB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF0dHJWYWx1ZXMubGVuZ3RoID4gMSAmJiBhdHRyVmFsdWVzLmluY2x1ZGVzKFwiYWxsXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVBcnIucHVzaChjb250ZXh0QXR0cmlidXRlc1tpXS5ub2RlVmFsdWUuc3BsaXQoXCIgXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyTmFtZUFyci5wdXNoKGF0dHJOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhVHlwZUFyci5wdXNoKGRhdGFUeXBlcy52YWx1ZXMudG9TdHJpbmcoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoYXNoID0ge307XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBhdHRyVmFsdWVzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBpbmRpdmlkdWFsIHZhbHVlIGlzIG5vdCBpbiB0aGUgbGlzdCBvZiBhbGxvd2VkIHZhbHVlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXR0clZhbHVlc1tqXSAhPSBcIlwiICYmICFkYXRhVHlwZXMudmFsdWVzLmluY2x1ZGVzKGF0dHJWYWx1ZXNbal0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc2guaGFzT3duUHJvcGVydHkoYXR0ck5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaFthdHRyTmFtZV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJOYW1lQXJyLnB1c2goYXR0ck5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVBcnIucHVzaChhdHRyVmFsdWVzW2pdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlQXJyLnB1c2goZGF0YVR5cGVzLnZhbHVlcy50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlQXJyLnB1c2goY29udGV4dEF0dHJpYnV0ZXNbaV0ubm9kZVZhbHVlLnNwbGl0KFwiIFwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyTmFtZUFyci5wdXNoKGF0dHJOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFUeXBlQXJyLnB1c2goZGF0YVR5cGVzLnZhbHVlcy50b1N0cmluZygpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhVHlwZXMgJiYgZGF0YVR5cGVzLnR5cGUgJiYgZGF0YVR5cGVzLnR5cGUgPT09IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjaW50XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpVmFsID0gcGFyc2VJbnQobm9kZVZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc05hTihpVmFsKSB8fCAoXCJcIiArIGlWYWwgIT09IG5vZGVWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUFyci5wdXNoKG5vZGVWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ck5hbWVBcnIucHVzaChhdHRyTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGF0YVR5cGVzICYmIGRhdGFUeXBlcy50eXBlICYmIGRhdGFUeXBlcy50eXBlID09IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjZGVjaW1hbFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZlZhbCA9IHBhcnNlRmxvYXQobm9kZVZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc05hTihmVmFsKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlQXJyLnB1c2gobm9kZVZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyTmFtZUFyci5wdXNoKGF0dHJOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhVHlwZXMgJiYgZGF0YVR5cGVzLnR5cGUgJiYgKGRhdGFUeXBlcy50eXBlID09IFwiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjYm9vbGVhblwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRtcFYgPSBub2RlVmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodG1wViAhPT0gXCJ0cnVlXCIgJiYgdG1wViAhPT0gXCJmYWxzZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVBcnIucHVzaChub2RlVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJOYW1lQXJyLnB1c2goYXR0ck5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRhdGFUeXBlcyAmJiBkYXRhVHlwZXMudHlwZSAmJiAoZGF0YVR5cGVzLnR5cGUgPT0gXCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNzdHJpbmdcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RlZFByb3BlcnR5VmFsdWVzLS07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJldE1zZyA9IG5ldyBBcnJheSgpO1xuICAgICAgICBsZXQgcGFzc2VkID0gYXR0ck5hbWVBcnIubGVuZ3RoID09IDA7XG4gICAgICAgIHJldE1zZy5wdXNoKHZhbHVlQXJyLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgIHJldE1zZy5wdXNoKGF0dHJOYW1lQXJyLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgIHJldE1zZy5wdXNoKHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICAvLyByZXRNc2cucHVzaCAoZGF0YVR5cGVBcnIuam9pbihcIiwgXCIpKTtcbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBbcnVsZUNvbnRleHRdLCBhdHRyTmFtZUFyciwgJycsIHJldE1zZyk7XG4gICAgICAgIGlmICh0ZXN0ZWRQcm9wZXJ0eVZhbHVlcyA9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSBlbHNlIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgcmV0TXNnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX2Jhbm5lcl9sYWJlbF91bmlxdWU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9iYW5uZXJfbGFiZWxfdW5pcXVlXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmJhbm5lclwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfTXVsdGlwbGVCYW5uZXJMYW5kbWFya3NfSW1wbGljaXRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImFyaWFfYmFubmVyX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwiOiBcImFyaWFfYmFubmVyX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9iYW5uZXJfbGFiZWxfdW5pcXVlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlRoZSBlbGVtZW50IHdpdGggXFxcImJhbm5lclxcXCIgcm9sZSBoYXMgYSB1bmlxdWUgbGFiZWwgdGhhdCBkZXNjcmliZXMgaXRzIHB1cnBvc2VcIixcbiAgICAgICAgICAgIFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCI6IFwiTXVsdGlwbGUgZWxlbWVudHMgd2l0aCBcXFwiYmFubmVyXFxcIiByb2xlIGRvIG5vdCBoYXZlIHVuaXF1ZSBsYWJlbHNcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFYWNoIGVsZW1lbnQgd2l0aCBcXFwiYmFubmVyXFxcIiByb2xlIG11c3QgaGF2ZSBhIHVuaXF1ZSBsYWJlbCB0aGF0IGRlc2NyaWJlcyBpdHMgcHVycG9zZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBkdXBwZWQgPSBBcmlhVXRpbC5pc0xhbmRtYXJrTmFtZVVuaXF1ZShydWxlQ29udGV4dCwgXCJiYW5uZXJcIiwgdHJ1ZSk7ICAgIFxuICAgICAgICBpZiAoZHVwcGVkID09IG51bGwpIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgaWYgKGR1cHBlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX2Jhbm5lcl9zaW5nbGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9iYW5uZXJfc2luZ2xlXCIsXG4gICAgY29udGV4dDogXCJkb206Kltyb2xlXSwgZG9tOmhlYWRlclwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfT25lQmFubmVySW5TaWJsaW5nU2V0X0ltcGxpY2l0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9iYW5uZXJfc2luZ2xlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV9iYW5uZXJfc2luZ2xlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2Jhbm5lcl9zaW5nbGUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJNdWx0aXBsZSBlbGVtZW50cyB3aXRoIFxcXCJiYW5uZXJcXFwiIHJvbGUgZm91bmQgb24gdGhlIHBhZ2VcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBIHBhZ2UsIGRvY3VtZW50LCBvciBhcHBsaWNhdGlvbiBzaG91bGQgb25seSBoYXZlIG9uZSBlbGVtZW50IHdpdGggXFxcImJhbm5lclxcXCIgcm9sZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBpZiAoIUFyaWFVdGlsLmhhc1JvbGVJblNlbWFudGljcyhydWxlQ29udGV4dCwgXCJiYW5uZXJcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhc3NlZCA9XG4gICAgICAgICAgICBBcmlhVXRpbC5nZXRTaWJsaW5nV2l0aFJvbGVIaWRkZW4oXG4gICAgICAgICAgICAgICAgcnVsZUNvbnRleHQsXG4gICAgICAgICAgICAgICAgXCJiYW5uZXJcIixcbiAgICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgIHRydWVcbiAgICAgICAgICAgICkgPT09IG51bGw7XG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KHBhc3NlZCwgW3J1bGVDb250ZXh0XSwgJ3JvbGUnLCAnJywgW10pO1xuICAgICAgICBpZiAocGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgQVJJQURlZmluaXRpb25zIH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQURlZmluaXRpb25zXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9jaGlsZF90YWJiYWJsZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2NoaWxkX3RhYmJhYmxlXCIsXG4gICAgY29udGV4dDogXCJkb206Kltyb2xlXVwiLFxuICAgIGRlcGVuZGVuY2llczogW1wiYXJpYV9yb2xlX2FsbG93ZWRcIl0sXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9NaXNzaW5nRm9jdXNhYmxlQ2hpbGRcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJmYWlsX21pc3NpbmdfY2hpbGRcIjogXCJmYWlsX21pc3NpbmdfY2hpbGRcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJhcmlhX2NoaWxkX3RhYmJhYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9taXNzaW5nX2NoaWxkXCI6IFwiYXJpYV9jaGlsZF90YWJiYWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9jaGlsZF90YWJiYWJsZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJmYWlsX21pc3NpbmdfY2hpbGRcIjogXCJOb25lIG9mIHRoZSBkZXNjZW5kZW50IGVsZW1lbnRzIHdpdGggXFxcInsxfVxcXCIgcm9sZSBpcyB0YWJiYWJsZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlVJIGNvbXBvbmVudCBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIHRhYmJhYmxlIGRlc2NlbmRhbnQgZm9yIGtleWJvYXJkIGFjY2Vzc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgICAgLy9za2lwIHRoZSBjaGVjayBpZiB0aGUgZWxlbWVudCBpcyBoaWRkZW4gb3IgZGlzYWJsZWRcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSB8fCBDb21tb25VdGlsLmlzTm9kZURpc2FibGVkKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgcmVxdWlyZXMgcHJlc2VudGF0aW9uYWwgY2hpbGRyZW4gb25seVxuICAgICAgICBpZiAoQXJpYVV0aWwuY29udGFpbnNQcmVzZW50YXRpb25hbENoaWxkcmVuT25seShydWxlQ29udGV4dCkgfHwgQXJpYVV0aWwuc2hvdWxkQmVQcmVzZW50YXRpb25hbENoaWxkKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICAvLyBBbiBBUklBIGxpc3QgaXMgbm90IGludGVyYWN0aXZlXG4gICAgICAgIGlmIChBcmlhVXRpbC5oYXNSb2xlKHJ1bGVDb250ZXh0LCB7IFwibGlzdFwiOiB0cnVlLCBcInJvd1wiOiB0cnVlLCBcInJvd2dyb3VwXCI6IHRydWUsIFwidGFibGVcIjogdHJ1ZSwgXCJncmlkXCI6IHRydWUgfSkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTm90IGEgdmFsaWQgbWVzc2FnZSBmb3IgbW9iaWxlIGJlY2F1c2UgYWxsIGVsZW1lbnRzIGFyZSBmb2N1c2FibGUgaW4gaU9TIHdoZW4gVm9pY2VPdmVyIGlzIGVuYWJsZWQuXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJjbGFzc1wiKSAmJiBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJjbGFzc1wiKS5zdWJzdHJpbmcoMCwgMykgPT0gXCJtYmxcIikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvL2lnbm9yZSBkYXRhbGlzdCBlbGVtZW50IGNoZWNrIHNpbmNlIGl0IHdpbGwgYmUgcGFydCBvZiBhIGlucHV0IGVsZW1lbnQgb3IgaGlkZGVuIGJ5IGRlZmF1bHRcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdkYXRhbGlzdCcpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICAvLyBpZ25vcmUgaWYgdGhlIGVsZW1lbnQncyBuYXZpZ2F0aW9uIGlzIGNvbnRyb2xsZWQgYnkgYW5vdGhlciBlbGVtZW50LCBzdWNoIGFzIGNvbWJvYm94XG4gICAgICAgIGlmIChBcmlhVXRpbC5pc05hdmlnYXRpb25Pd25lZE9yQ29udHJvbGxlZChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDsgIFxuXG4gICAgICAgIGxldCByb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGxldCBkb2MgPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50O1xuICAgICAgICBsZXQgaGFzQXR0cmlidXRlID0gQ29tbW9uVXRpbC5oYXNBdHRyaWJ1dGU7XG4gICAgICAgIGxldCByb2xlTmFtZUFyciA9IG5ldyBBcnJheSgpO1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBcIlwiO1xuICAgICAgICBsZXQgaW5TY29wZSA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChBUklBRGVmaW5pdGlvbnMuY29udGFpbmVycy5pbmNsdWRlcyhyb2xlKSkge1xuICAgICAgICAgICAgbGV0IGRpc2FibGVkID0gaGFzQXR0cmlidXRlKHJ1bGVDb250ZXh0LCAnYXJpYS1kaXNhYmxlZCcpID8gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYXJpYS1kaXNhYmxlZFwiKSA6ICcnO1xuICAgICAgICAgICAgaWYgKGRpc2FibGVkICE9ICd0cnVlJyAmJiAhaGFzQXR0cmlidXRlKHJ1bGVDb250ZXh0LCAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JykgJiYgIUNvbW1vblV0aWwuaXNUYWJiYWJsZShydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgICAgICBsZXQgcmVxQ2hpbGRyZW4gPSBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNbcm9sZV0ucmVxQ2hpbGRyZW47XG4gICAgICAgICAgICAgICAgaWYgKHJlcUNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgICAgIGluU2NvcGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHhwID0gXCJkZXNjZW5kYW50OjoqW1wiO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlcUNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB4cCArPSBcIkByb2xlPSdcIiArIHJlcUNoaWxkcmVuW2ldICsgXCInIG9yIFwiO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHhwID0geHAuc3Vic3RyaW5nKDAsIHhwLmxlbmd0aCAtIDQpICsgJ10nO1xuICAgICAgICAgICAgICAgICAgICBsZXQgeHBhdGhSZXN1bHQgPSBkb2MuZXZhbHVhdGUoeHAsIHJ1bGVDb250ZXh0LCBDb21tb25VdGlsLmRlZmF1bHROU1Jlc29sdmVyLCAwIC8qIFhQYXRoUmVzdWx0LkFOWV9UWVBFICovLCBudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHI6IEVsZW1lbnQgPSB4cGF0aFJlc3VsdC5pdGVyYXRlTmV4dCgpIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChyICYmICFwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvbGxvd2luZyBhcmUgdGhlIHN0ZXBzIHRoYXQgYXJlIGV4ZWN1dGVkIGF0IHRoaXMgc3RhZ2UgdG8gZGV0ZXJtaW5lIGlmIHRoZSBub2RlIHNob3VsZCBiZSBjbGFzc2lmaWVkIGFzIGhpZGRlblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3Igbm90LlxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gIDEuIE9ubHkgcnVuIGlzTm9kZVZpc2libGUgY2hlY2sgaWYgaGlkZGVuIGNvbnRlbnQgc2hvdWxkIE5PVCBiZSBjaGVja2VkLiBJbiB0aGUgY2FzZSB0aGF0IGhpZGRlbiBjb250ZW50IGlzIHRvLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGJlIHNjYW5uZWQgdGhlbiB3ZSBjYW4ganVzdCBzY2FuIGV2ZXJ5dGhpbmcgYXMgbm9ybWFsLiBJbiB0aGUgY2FzZSB0aGF0IHRoZSBjdXJyZW50IG5vZGUgaXMgaGlkZGVuIHdlIGRvIG5vdFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGFkZCBpdCB0byB0aGUgcm9sZVRvRWxlbXMgaGFzaCBhdCBhbGwgb3IgZXZlbiBkbyBhbnkgY2hlY2tpbmcgZm9yIGl0IGF0IGFsbC5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3RlOiBUaGUgaWYgY29uZGl0aW9ucyB1c2VzIHNob3J0LWNpcmN1aXRpbmcgc28gaWYgdGhlIGZpcnN0IGNvbmRpdGlvbiBpcyBub3QgdHJ1ZSBpdCB3aWxsIG5vdCBjaGVjayB0aGUgbmV4dCBvbmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICBzbyBvbiBhbmQgc28gZm9ydGguXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ29tbW9uVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKHIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9IHhwYXRoUmVzdWx0Lml0ZXJhdGVOZXh0KCkgYXMgRWxlbWVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gQ29tbW9uVXRpbC5pc1RhYmJhYmxlKHIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXF1aXJlZCBjaGlsZCBpcyBub3QgZm9jdXNhYmxlIHZpYSB0YWJpbmRleC4gU2VlIGlmIHRoZXJlIGlzIGEgZ3JhbmRjaGlsZCB0aGF0IGlzIGZvY3VzYWJsZSBieSBkZWZhdWx0IG9yIGJ5IHRhYmluZGV4LlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgeHAyID0gXCJkZXNjZW5kYW50OjoqXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHhwYXRoUmVzdWx0MiA9IGRvYy5ldmFsdWF0ZSh4cDIsIHIsIENvbW1vblV0aWwuZGVmYXVsdE5TUmVzb2x2ZXIsIDAgLyogWFBhdGhSZXN1bHQuQU5ZX1RZUEUgKi8sIG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByMiA9IHhwYXRoUmVzdWx0Mi5pdGVyYXRlTmV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChyMiAmJiAhcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvbGxvd2luZyBhcmUgdGhlIHN0ZXBzIHRoYXQgYXJlIGV4ZWN1dGVkIGF0IHRoaXMgc3RhZ2UgdG8gZGV0ZXJtaW5lIGlmIHRoZSBub2RlIHNob3VsZCBiZSBjbGFzc2lmaWVkIGFzIGhpZGRlblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvciBub3QuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAxLiBPbmx5IHJ1biBpc05vZGVWaXNpYmxlIGNoZWNrIGlmIGhpZGRlbiBjb250ZW50IHNob3VsZCBOT1QgYmUgY2hlY2tlZC4gSW4gdGhlIGNhc2UgdGhhdCBoaWRkZW4gY29udGVudCBpcyB0byxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGJlIHNjYW5uZWQgdGhlbiB3ZSBjYW4ganVzdCBzY2FuIGV2ZXJ5dGhpbmcgYXMgbm9ybWFsLiBJbiB0aGUgY2FzZSB0aGF0IHRoZSBjdXJyZW50IG5vZGUgaXMgaGlkZGVuIHdlIGRvIG5vdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgYWRkIGl0IHRvIHRoZSByb2xlVG9FbGVtcyBoYXNoIGF0IGFsbCBvciBldmVuIGRvIGFueSBjaGVja2luZyBmb3IgaXQgYXQgYWxsLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3RlOiBUaGUgaWYgY29uZGl0aW9ucyB1c2VzIHNob3J0LWNpcmN1aXRpbmcgc28gaWYgdGhlIGZpcnN0IGNvbmRpdGlvbiBpcyBub3QgdHJ1ZSBpdCB3aWxsIG5vdCBjaGVjayB0aGUgbmV4dCBvbmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgIHNvIG9uIGFuZCBzbyBmb3J0aC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENvbW1vblV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbihyMikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIyID0geHBhdGhSZXN1bHQyLml0ZXJhdGVOZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBDb21tb25VdGlsLmlzVGFiYmFibGUocik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIyID0geHBhdGhSZXN1bHQyLml0ZXJhdGVOZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGVOYW1lQXJyID0gci5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpLnRyaW0oKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZU5hbWUgPSByLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByID0geHBhdGhSZXN1bHQuaXRlcmF0ZU5leHQoKSBhcyBFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVmFyaWFibGUgRGVjbGVyYXRpb25cbiAgICAgICAgbGV0IHJldFRva2VuMSA9IG5ldyBBcnJheSgpO1xuICAgICAgICBsZXQgcmV0VG9rZW4yID0gbmV3IEFycmF5KCk7XG5cbiAgICAgICAgLy8gSW4gdGhlIGNhc2UgdGhlIGFycmF5cy9zdHJpbmdzIGFyZSBlbXB0eSwgdGhhdCBtZWFucyB0aGF0IHRoZXJlIGlzIG5vIHZpb2xhdGlvbiBzbyB3ZSBjYW4gcmVzZXQgaXQgYmFjayB0byBwYXNzZWQsIHRoZSByZWFzb24gZm9yIHRoaXNcbiAgICAgICAgLy8gaXMgdGhhdCB3ZSBhcmUgc2V0dGluZyBwYXNzZWQ9ZmFsc2Ugd2hpbGUgd2UgcGVyZm9ybSBhIGxvb3Agd2hpY2ggY2F1c2VzIHZpb2xhdGlvbiB0byB0cmlnZ2VyIGV2ZW4gaWYgdGhlcmUgaXMgbm8gaXNzdWVzLiBJbnN0ZWFkIG9mXG4gICAgICAgIC8vIHVwZGF0aW5nIHRoZSB3aG9sZSBydWxlIHRvIHN3aXRjaCBmcm9tIHVzaW5nIHBhc3NlZCBpbiB0aGF0IHdheSBzaW1wbHkgZG8gdGhlIGNoZWNrIGF0IHRoaXMgcG9pbnQuXG4gICAgICAgIGlmIChub2RlTmFtZS5sZW5ndGggPiAwICYmIHJvbGVOYW1lQXJyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldFRva2VuMS5wdXNoKG5vZGVOYW1lKTtcbiAgICAgICAgICAgIHJldFRva2VuMi5wdXNoKHJvbGVOYW1lQXJyLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBbcnVsZUNvbnRleHRdLCAncm9sZScsICcnLCBwYXNzZWQgPT0gdHJ1ZSA/IFtdIDogW3JldFRva2VuMSwgcmV0VG9rZW4yXSk7XG4gICAgICAgIGlmICghaW5TY29wZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0gZWxzZSBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9taXNzaW5nX2NoaWxkXCIsIFtyZXRUb2tlbjEudG9TdHJpbmcoKSwgcmV0VG9rZW4yLnRvU3RyaW5nKCldKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfY2hpbGRfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9jaGlsZF92YWxpZFwiLFxuICAgIC8vY29udGV4dDogXCJkb206Kltyb2xlXVwiLFxuICAgIC8vZGVwZW5kZW5jaWVzOiBbXCJScHRfQXJpYV9WYWxpZFJvbGVcIl0sXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIGRlcGVuZGVuY2llczogW1wiYXJpYV9yb2xlX3ZhbGlkXCIsIFwiYXJpYV9kZXNjZW5kYW50X3ZhbGlkXCJdLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9jaGlsZF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NcIjogXCJhcmlhX2NoaWxkX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF9ub19jaGlsZFwiOiBcImFyaWFfY2hpbGRfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX2ludmFsaWRfY2hpbGRcIjogXCJhcmlhX2NoaWxkX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBbiBlbGVtZW50IHdpdGggYW4gQVJJQSByb2xlIG11c3Qgb3duIGEgcmVxdWlyZWQgY2hpbGRcIixcbiAgICAgICAgICAgIFwiUGFzc1wiOiBcIkFuIGVsZW1lbnQgd2l0aCBhbiBBUklBIHJvbGUgb3ducyBhIHJlcXVpcmVkIGNoaWxkXCIsXG4gICAgICAgICAgICBcIkZhaWxfbm9fY2hpbGRcIjogXCJUaGUgZWxlbWVudCB3aXRoIHJvbGUgXFxcInswfVxcXCIgZG9lcyBub3Qgb3duIGFueSBjaGlsZCBlbGVtZW50IHdpdGggYW55IG9mIHRoZSBmb2xsb3dpbmcgcm9sZShzKTogXFxcInsxfVxcXCJcIixcbiAgICAgICAgICAgIFwiRmFpbF9pbnZhbGlkX2NoaWxkXCI6IFwiVGhlIGVsZW1lbnQgd2l0aCByb2xlIFxcXCJ7MH1cXFwiIG93bnMgdGhlIGNoaWxkIGVsZW1lbnQgd2l0aCB0aGUgcm9sZSBcXFwiezF9XFxcIiB0aGF0IGlzIG5vdCBvbmUgb2YgdGhlIGFsbG93ZWQgcm9sZShzKTogXFxcInsyfVxcXCJcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIC8vIFRPRE86IEFDVDogVmVyaWZ5IG1hcHBpbmdcbiAgICBhY3Q6IFtcImJjNGE3NVwiXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIG9yIGRpc2FibGVkXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkgfHwgQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIFxuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IHJlcXVpcmVzIHByZXNlbnRhdGlvbmFsIGNoaWxkcmVuIG9ubHlcbiAgICAgICAgaWYgKEFyaWFVdGlsLmNvbnRhaW5zUHJlc2VudGF0aW9uYWxDaGlsZHJlbk9ubHkocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBcbiAgICAgICAgbGV0IHJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXMocnVsZUNvbnRleHQsIGZhbHNlKTtcbiAgICAgICAgLy8gaWYgZXhwbGljaXQgcm9sZSBkb2Vzbid0IGV4aXN0LCBnZXQgdGhlIGltcGxpY2l0IG9uZVxuICAgICAgICBpZiAoIXJvbGVzIHx8IHJvbGVzLmxlbmd0aCA9PT0gMCkgXG4gICAgICAgICAgICByb2xlcyA9ICBBcmlhVXRpbC5nZXRJbXBsaWNpdFJvbGUocnVsZUNvbnRleHQpO1xuICAgICAgICBcbiAgICAgICAgLy9pZ25vcmUgaWYgdGhlIGVsZW1lbnQgZG9lc24ndCBoYXZlIGFueSBleHBsaWNpdCBvciBpbXBsaWNpdCByb2xlLCBzaG91bGRuJ3QgaGFwcGVuXG4gICAgICAgIGlmICghcm9sZXMgfHwgcm9sZXMubGVuZ3RoID09PSAwKSBcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgLy8gaWdub3JlIGlmIHRoZSBlbGVtZW50IGNvbnRhaW5zIG5vbmUgb3IgcHJlc2VudGF0aW9uIHJvbGVcbiAgICAgICAgbGV0IHByZXNlbnRhdGlvblJvbGVzID0gW1wibm9uZVwiLCBcInByZXNlbnRhdGlvblwiXTtcbiAgICAgICAgY29uc3QgZm91bmQgPSByb2xlcy5zb21lKHI9PiBwcmVzZW50YXRpb25Sb2xlcy5pbmNsdWRlcyhyKSk7XG4gICAgICAgIGlmIChmb3VuZCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gIEZvciBjb21ib2JveCwgd2UgaGF2ZSBnMTE5MyAuLi4gZzExOTkgdG8gY2hlY2sgdGhlIHZhbHVlcyBldGMuXG4gICAgICAgIC8vICBXZSBkb24ndCB3YW50IHRvIHRyaWdnZXIgMTE1MiBhZ2Fpbi4gU28sIHdlIGJ5cGFzcyBpdCBoZXJlLlxuICAgICAgICBpZiAocm9sZXMuaW5jbHVkZXMoXCJjb21ib2JveFwiKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgbGV0IHJlcXVpcmVkQ2hpbGRSb2xlcyA9IEFyaWFVdGlsLmdldFJlcXVpcmVkQ2hpbGRSb2xlcyhydWxlQ29udGV4dCwgdHJ1ZSk7XG4gICAgICAgIC8vIGEgJ2dyb3VwJyByb2xlIGlzIGFsbG93ZWQgYnV0IG5vdCByZXF1aXJlZCBmb3Igc29tZSBlbGVtZW50cyBzbyByZW1vdmUgaXQgaWYgZXhpc3RzXG4gICAgICAgIGlmIChyZXF1aXJlZENoaWxkUm9sZXMuaW5jbHVkZXMoJ2dyb3VwJykpIHtcbiAgICAgICAgICAgIGxldCBpbmRleCA9IHJlcXVpcmVkQ2hpbGRSb2xlcy5pbmRleE9mKCdncm91cCcpO1xuICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpXG4gICAgICAgICAgICAgICAgcmVxdWlyZWRDaGlsZFJvbGVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8qKiAgXG4gICAgICAgICAqIGlnbm9yZSBpZiBhIHJvbGUgZG9lc24ndCByZXF1aXJlIGEgY2hpbGQgd2l0aCBhbnkgc3BlY2lmaWMgcm9sZVxuICAgICAgICAgKiB0aGUgcmV2ZXJzZSBtaWdodCBiZSBub3QgdHJ1ZSAtIHBhcmVudCB3aWxsIGJlIGNoZWNrZWQgaW4gUnB0X0FyaWFfUmVxdWlyZWRQYXJlbnRfTmF0aXZlX0hvc3RfU2VtYXRpY3MgcnVsZVxuICAgICAgICAqL1xuICAgICAgICAgaWYgKHJlcXVpcmVkQ2hpbGRSb2xlcy5sZW5ndGggPT0gMClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIGdldCBhbGwgdGhlIGNoaWxkcmVuIGZyb20gYWNjZXNzaWJpbGl0eSB0cmVlLCBcbiAgICAgICAgLy8gaW5jbHVkaW5nIG9uZXMgd2l0aCBhcmlhLW93bnMgICAgXG4gICAgICAgIGxldCBkaXJlY3RBVENoaWxkcmVuID0gQXJpYVV0aWwuZ2V0RGlyZWN0QVRDaGlsZHJlbihydWxlQ29udGV4dCk7XG4gICAgICAgIFxuICAgICAgICBpZiAoIWRpcmVjdEFUQ2hpbGRyZW4gfHwgZGlyZWN0QVRDaGlsZHJlbi5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgLy8gdGhlIGVsZW1lbnQgd2l0aCBhdCBsZWFzdCBvbmUgcmVxdWlyZWQgcm9sZSBkb3Nlbid0IGNvbnRhaW4gYW55IGFjY2Vzc2libGUgY2hpbGRcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogV2hlbiBhIHdpZGdldCBpcyBtaXNzaW5nIHJlcXVpcmVkIG93bmVkIGVsZW1lbnRzIGR1ZSB0byBzY3JpcHQgZXhlY3V0aW9uIG9yIGxvYWRpbmcsIFxuICAgICAgICAgICAgICogYXV0aG9ycyBNVVNUIG1hcmsgYSBjb250YWluaW5nIGVsZW1lbnQgd2l0aCAnYXJpYS1idXN5JyBlcXVhbCB0byB0cnVlLiBcbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgIGxldCBidXN5ID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYXJpYS1idXN5XCIpO1xuICAgICAgICAgICAgIGlmICghYnVzeSB8fCBidXN5ICE9PSAndHJ1ZScpIHtcbiAgICAgICAgICAgICAgICAgbGV0IHJldFRva2VuID0gbmV3IEFycmF5KCk7XG4gICAgICAgICAgICAgICAgIHJldFRva2VuLnB1c2gocm9sZXMuam9pbihcIiwgXCIpKTtcbiAgICAgICAgICAgICAgICAgcmV0VG9rZW4ucHVzaChyZXF1aXJlZENoaWxkUm9sZXMuam9pbihcIiwgXCIpKTtcbiAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF9ub19jaGlsZFwiLCByZXRUb2tlbik7XG4gICAgICAgICAgICAgfSBcbiAgICAgICAgICAgICAvLyBpdCdzICdidXN5JyBsb2FkaW5nLCBpZ25vcmUgaXQgXG4gICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGxldCB2aW9sYXRlRWxlbVJvbGVzID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGZvciAobGV0IGo9MDsgaiA8IGRpcmVjdEFUQ2hpbGRyZW4ubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGxldCBjaGlsZFJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXMoZGlyZWN0QVRDaGlsZHJlbltqXSwgZmFsc2UpO1xuICAgICAgICAgICAgLy8gaWYgZXhwbGljaXQgcm9sZSBkb2Vzbid0IGV4aXN0LCBnZXQgdGhlIGltcGxpY2l0IG9uZVxuICAgICAgICAgICAgaWYgKCFjaGlsZFJvbGVzIHx8IGNoaWxkUm9sZXMubGVuZ3RoID09IDApIFxuICAgICAgICAgICAgICAgIGNoaWxkUm9sZXMgPSAgQXJpYVV0aWwuZ2V0SW1wbGljaXRSb2xlKGRpcmVjdEFUQ2hpbGRyZW5bal0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoY2hpbGRSb2xlcyAmJiBjaGlsZFJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgKiB3aGVuIG11bHRpcGxlIHJvbGVzIGFyZSBzcGVjaWZpZWQgYXMgcmVxdWlyZWQgb3duZWQgZWxlbWVudHMgZm9yIGEgcm9sZSwgYXQgbGVhc3Qgb25lIGluc3RhbmNlIG9mIG9uZSByZXF1aXJlZCBvd25lZCBlbGVtZW50IGlzIGV4cGVjdGVkLiBcbiAgICAgICAgICAgICAgICAgKiB0aGUgc3BlY2lmaWNhdGlvbiBkb2VzIG5vdCByZXF1aXJlIGFuIGluc3RhbmNlIG9mIGVhY2ggb2YgdGhlIGxpc3RlZCBvd25lZCByb2xlcy5cbiAgICAgICAgICAgICAgICAgKiB0aGVyZWZvcmUsIHRoZSByZXF1aXJlbWVudCBpcyBtZXQgaWYgaXQgaGFzIGFueSBvbmUgb2YgdGhlIHJlcXVpcmVkIHJvbGVzLlxuICAgICAgICAgICAgICAgICAqLyAgICBcbiAgICAgICAgICAgICAgICBjb25zdCBmb3VuZCA9IGNoaWxkUm9sZXMuc29tZShyPT4gcmVxdWlyZWRDaGlsZFJvbGVzLmluY2x1ZGVzKHIpKTtcbiAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSBcbiAgICAgICAgICAgICAgICAgICAgdmlvbGF0ZUVsZW1Sb2xlcy5wdXNoKGNoaWxkUm9sZXMuam9pbihcIiwgXCIpKTsgXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGlnbm9yZSB0aGUgZWxlbWVudCBzaW5jZSBpdCdzIG5vdCBzZW1hbnRpYywgc2hvdWxkbid0IGhhcHBlbiBcbiAgICAgICAgICAgIH0gICAgIFxuICAgICAgICB9IFxuICAgICAgICBcbiAgICAgICAgaWYgKHZpb2xhdGVFbGVtUm9sZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGV0IHJldFZhbHVlcyA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgdmlvbGF0ZUVsZW1Sb2xlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCByZXRUb2tlbiA9IG5ldyBBcnJheSgpO1xuICAgICAgICAgICAgICAgIHJldFRva2VuLnB1c2gocm9sZXMuam9pbihcIiwgXCIpKTtcbiAgICAgICAgICAgICAgICByZXRUb2tlbi5wdXNoKHZpb2xhdGVFbGVtUm9sZXNbaV0pO1xuICAgICAgICAgICAgICAgIHJldFRva2VuLnB1c2gocmVxdWlyZWRDaGlsZFJvbGVzLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgICAgICAgICAgcmV0VmFsdWVzLnB1c2goUnVsZUZhaWwoXCJGYWlsX2ludmFsaWRfY2hpbGRcIiwgcmV0VG9rZW4pKTtcbiAgICAgICAgICAgIH0gXG4gICAgICAgICAgICByZXR1cm4gcmV0VmFsdWVzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfY29tcGxlbWVudGFyeV9sYWJlbF91bmlxdWU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsX3VuaXF1ZVwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpjb21wbGVtZW50YXJ5XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9NdWx0aXBsZUNvbXBsZW1lbnRhcnlMYW5kbWFya3NfSW1wbGljaXRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImFyaWFfY29tcGxlbWVudGFyeV9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIjogXCJhcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxfdW5pcXVlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlRoZSBlbGVtZW50IHdpdGggXFxcImNvbXBsZW1lbnRhcnlcXFwiIHJvbGUgaGFzIGEgdW5pcXVlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCIsXG4gICAgICAgICAgICBcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwiOiBcIk11bHRpcGxlIGVsZW1lbnRzIHdpdGggXFxcImNvbXBsZW1lbnRhcnlcXFwiIHJvbGUgZG8gbm90IGhhdmUgdW5pcXVlIGxhYmVsc1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVhY2ggZWxlbWVudCB3aXRoIFxcXCJjb21wbGVtZW50YXJ5XFxcIiByb2xlIG11c3QgaGF2ZSBhIHVuaXF1ZSBsYWJlbCB0aGF0IGRlc2NyaWJlcyBpdHMgcHVycG9zZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBkdXBwZWQgPSBBcmlhVXRpbC5pc0xhbmRtYXJrTmFtZVVuaXF1ZShydWxlQ29udGV4dCwgXCJjb21wbGVtZW50YXJ5XCIpOyAgICBcbiAgICAgICAgaWYgKGR1cHBlZCA9PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgaWYgKGR1cHBlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsX3Zpc2libGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsX3Zpc2libGVcIixcbiAgICBjb250ZXh0OiBcImRvbToqW3JvbGVdLCBkb206YXNpZGVcIixcbiAgICBkZXBlbmRlbmNpZXM6IFtcImFyaWFfY29tcGxlbWVudGFyeV9sYWJlbGxlZFwiXSxcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX0NvbXBsZW1lbnRhcnlMYW5kbWFya0xhYmVsX0ltcGxpY2l0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsX3Zpc2libGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxfdmlzaWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9jb21wbGVtZW50YXJ5X2xhYmVsX3Zpc2libGUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJFbGVtZW50IHdpdGggXFxcImNvbXBsZW1lbnRhcnlcXFwiIHJvbGUgZG9lcyBub3QgaGF2ZSBhIHZpc2libGUgbGFiZWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFYWNoIGVsZW1lbnQgd2l0aCBcXFwiY29tcGxlbWVudGFyeVxcXCIgcm9sZSBzaG91bGQgaGF2ZSBhIHZpc2libGUgbGFiZWwgdGhhdCBkZXNjcmliZXMgaXRzIHB1cnBvc2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBpZiAoIUFyaWFVdGlsLmhhc1JvbGVJblNlbWFudGljcyhydWxlQ29udGV4dCwgXCJjb21wbGVtZW50YXJ5XCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwYXNzZWQgPSBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KFxuICAgICAgICAgICAgcnVsZUNvbnRleHQsXG4gICAgICAgICAgICBcImFyaWEtbGFiZWxsZWRieVwiXG4gICAgICAgICk7XG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KHBhc3NlZCwgW3J1bGVDb250ZXh0XSwgJ3JvbGUnLCAnJywgW10pO1xuICAgICAgICBpZiAocGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBBY2NOYW1lVXRpbCB9IGZyb20gXCIuLi91dGlsL0FjY05hbWVVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfY29tcGxlbWVudGFyeV9sYWJlbGxlZDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxsZWRcIixcbiAgICBjb250ZXh0OiBcImFyaWE6Y29tcGxlbWVudGFyeVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfQ29tcGxlbWVudGFyeVJlcXVpcmVkTGFiZWxfSW1wbGljaXRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfY29tcGxlbWVudGFyeV9sYWJlbGxlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkVsZW1lbnQgd2l0aCBcXFwiY29tcGxlbWVudGFyeVxcXCIgcm9sZSBkb2VzIG5vdCBoYXZlIGEgbGFiZWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFYWNoIGVsZW1lbnQgd2l0aCBcXFwiY29tcGxlbWVudGFyeVxcXCIgcm9sZSBtdXN0IGhhdmUgYSBsYWJlbCB0aGF0IGRlc2NyaWJlcyBpdHMgcHVycG9zZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IHBhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWUocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAocGFpcikge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01XYWxrZXJcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5pbXBvcnQgeyBUYWJsZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9UYWJsZVV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfY29udGVudF9pbl9sYW5kbWFyazogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2NvbnRlbnRfaW5fbGFuZG1hcmtcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9PcnBoYW5lZENvbnRlbnRfTmF0aXZlX0hvc3RfU2VtYXRpY3NcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX2NvbnRlbnRfaW5fbGFuZG1hcmsuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2NvbnRlbnRfaW5fbGFuZG1hcmsuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfY29udGVudF9pbl9sYW5kbWFyay5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkNvbnRlbnQgaXMgbm90IHdpdGhpbiBhIGxhbmRtYXJrIGVsZW1lbnRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBbGwgY29udGVudCBtdXN0IHJlc2lkZSB3aXRoaW4gYW4gZWxlbWVudCB3aXRoIGEgbGFuZG1hcmsgcm9sZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaWRcIjogW1wiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgbGV0IHBhcmFtcyA9IENhY2hlVXRpbC5nZXRDYWNoZShjb250ZXh0LmRvbS5ub2RlLm93bmVyRG9jdW1lbnQsIFwiYXJpYV9jb250ZW50X2luX2xhbmRtYXJrXCIsIG51bGwpO1xuICAgICAgICBpZiAoIXBhcmFtcykge1xuICAgICAgICAgICAgcGFyYW1zID0ge1xuICAgICAgICAgICAgICAgIGxhbmRtYXJrczoge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogW1wiYmFubmVyXCIsIFwiY29tcGxlbWVudGFyeVwiLCBcImNvbnRlbnRpbmZvXCIsIFwiZm9ybVwiLCBcIm1haW5cIiwgXCJuYXZpZ2F0aW9uXCIsIFwicmVnaW9uXCIsIFwic2VhcmNoXCJdLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImFycmF5XCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHBvc3NpYmxlT3JwaGFuZWRXaWRnZXRzOiB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBbXCJidXR0b25cIiwgXCJjb21ib2JveFwiLCBcImNoZWNrYm94XCIsIFwiZ3JpZFwiLCBcImhlYWRpbmdcIiwgXCJsaW5rXCIsIFwibGlzdFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJsaXN0Ym94XCIsIFwibWVudVwiLCBcIm1lbnViYXJcIiwgXCJwcm9ncmVzc2JhclwiLCBcInJhZGlvXCIsIFwidGFibGlzdFwiLCBcInRleHRib3hcIiwgXCJ0b29sYmFyXCIsIFwidHJlZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJ0cmVlZ3JpZFwiXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiYXJyYXlcIlxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcG9zc2libGVPcnBoYW5lZEVsZW1lbnRzOiB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBbXCJwXCIsIFwidGFibGVcIiwgXCJpbnB1dFwiLCBcInRleHRhcmVhXCIsIFwic2VsZWN0XCIsIFwiYnV0dG9uXCIsIFwiYVwiLCBcIm9sXCIsIFwidWxcIiwgXCJkbFwiLCBcImgxXCIsIFwiaDJcIiwgXCJoM1wiLCBcImg0XCIsIFwiaDVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiaDZcIiwgXCJlbWJlZFwiLCBcIm9iamVjdFwiLCBcImFyZWFcIlxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImFycmF5XCJcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG5vTGFuZG1hcmtlZFJvbGVzOiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRoZXNlIHJvbGVzIGRvbid0IHJlcXVpcmUgbGFuZG1hcmtzXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBbXCJhbGVydFwiLCBcImFsZXJ0ZGlhbG9nXCIsIFwiZGlhbG9nXCIsIFwidG9vbHRpcFwiXSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJhcnJheVwiXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBtYXBMYW5kbWFya3M6IHt9LFxuICAgICAgICAgICAgICAgIG1hcFBvc3NpYmxlT3JwaGFuZWRXaWRnZXRzOiB7fSxcbiAgICAgICAgICAgICAgICBtYXBQb3NzaWJsZU9ycGhhbmVkRWxlbWVudHM6IHt9LFxuICAgICAgICAgICAgICAgIG1hcE5vTGFuZG1hcmtlZFJvbGVzOiB7fVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQ29udmVydCBhcnJheXMgdG8gbWFwc1xuICAgICAgICAgICAgcGFyYW1zLm1hcExhbmRtYXJrcyA9IHt9O1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJhbXMubGFuZG1hcmtzLnZhbHVlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgcGFyYW1zLm1hcExhbmRtYXJrc1twYXJhbXMubGFuZG1hcmtzLnZhbHVlW2ldXSA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHBhcmFtcy5tYXBQb3NzaWJsZU9ycGhhbmVkV2lkZ2V0cyA9IHt9XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcmFtcy5wb3NzaWJsZU9ycGhhbmVkV2lkZ2V0cy52YWx1ZS5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIHBhcmFtcy5tYXBQb3NzaWJsZU9ycGhhbmVkV2lkZ2V0c1twYXJhbXMucG9zc2libGVPcnBoYW5lZFdpZGdldHMudmFsdWVbaV1dID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcGFyYW1zLm1hcFBvc3NpYmxlT3JwaGFuZWRFbGVtZW50cyA9IHt9XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhcmFtcy5wb3NzaWJsZU9ycGhhbmVkRWxlbWVudHMudmFsdWUubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBwYXJhbXMubWFwUG9zc2libGVPcnBoYW5lZEVsZW1lbnRzW3BhcmFtcy5wb3NzaWJsZU9ycGhhbmVkRWxlbWVudHMudmFsdWVbaV1dID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcGFyYW1zLm1hcE5vTGFuZG1hcmtlZFJvbGVzID0ge31cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFyYW1zLm5vTGFuZG1hcmtlZFJvbGVzLnZhbHVlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgcGFyYW1zLm1hcE5vTGFuZG1hcmtlZFJvbGVzW3BhcmFtcy5ub0xhbmRtYXJrZWRSb2xlcy52YWx1ZVtpXV0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoY29udGV4dC5kb20ubm9kZS5vd25lckRvY3VtZW50LCBcImFyaWFfY29udGVudF9pbl9sYW5kbWFya1wiLCBwYXJhbXMpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKHJ1bGVDb250ZXh0KSB8fCAgLy8gYXZvaWQgZGlhZ25vc2luZyBnMTE1NyBmb3Igbm9uLXZpc2libGUgbm9kZXNcbiAgICAgICAgICAgIChWaXNVdGlsLmhpZGRlbkJ5RGVmYXVsdEVsZW1lbnRzICE9IG51bGwgJiZcbiAgICAgICAgICAgICAgICBWaXNVdGlsLmhpZGRlbkJ5RGVmYXVsdEVsZW1lbnRzICE9IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgIFZpc1V0aWwuaGlkZGVuQnlEZWZhdWx0RWxlbWVudHMuaW5kZXhPZihub2RlTmFtZSkgPiAtMSkpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBlbGVtc1dpdGhvdXRDb250ZW50ID0gW1wiYXJlYVwiLCBcImlucHV0XCIsIFwiZW1iZWRcIiwgXCJidXR0b25cIiwgXCJ0ZXh0YXJlYVwiLCBcInNlbGVjdFwiXTtcbiAgICAgICAgaWYgKCFDb21tb25VdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbihydWxlQ29udGV4dCkgJiYgLy9vbmx5IHRyaWdnZXIgdGhlIHJ1bGUgb24gZWxlbWVudHMgdGhhdCBoYXZlIGNvbnRlbnRcbiAgICAgICAgICAgIGVsZW1zV2l0aG91dENvbnRlbnQuaW5kZXhPZihub2RlTmFtZSkgPT09IC0xKSB7IC8vIGEgZmV3IGVsZW1zIHdpaG91dCBjb250ZW50IHNob3VsZCBub3QgYmUgc2tpcHBlZFxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2hvcnQgY2lyY3VpdCBmb3IgbGF5b3V0IHRhYmxlc1xuICAgICAgICBpZiAobm9kZU5hbWUgPT0gXCJ0YWJsZVwiICYmIFRhYmxlVXRpbC5pc0xheW91dFRhYmxlKHJ1bGVDb250ZXh0KSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBpZiBpdCBpcyBhIHBvc3NpYmxlIG9ycGhhblxuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgbGV0IGlzUG9zc2libGVPcnBoYW5lZFdpZGdldCA9IEFyaWFVdGlsLmhhc1JvbGUocnVsZUNvbnRleHQsIHBhcmFtcy5tYXBQb3NzaWJsZU9ycGhhbmVkV2lkZ2V0cywgdHJ1ZSk7XG4gICAgICAgIC8vZXhjbHVkZSA8bGluayByZWw9XCJzdHlsZXNoZWV0XCIgaHJlZj1cInh5ei5jc3NcIj4gaW4gdGhlIDxoZWFkPiBhbmQgPGJvZHk+KCM2MDgpXG4gICAgICAgIC8vaGF2aW5nIGxpbmsgaW4gdGhlIGhlYWQgY291bGQgY2F1c2UgbG90IG9mIHZpb2xhaW9ucyAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gJ2xpbmsnKSB7XG4gICAgICAgICAgICBpc1Bvc3NpYmxlT3JwaGFuZWRXaWRnZXQgPSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBpc1Bvc3NpYmxlT3JwaGFuZWRFbGVtZW50ID0gbm9kZU5hbWUgaW4gcGFyYW1zLm1hcFBvc3NpYmxlT3JwaGFuZWRFbGVtZW50cztcbiAgICAgICAgaWYgKGlzUG9zc2libGVPcnBoYW5lZFdpZGdldCB8fCBpc1Bvc3NpYmxlT3JwaGFuZWRFbGVtZW50KSB7XG4gICAgICAgICAgICAvLyBTZWUgaWYgYW5jZXN0b3IgaGFzIGxhbmRtYXJrIHJvbGVzIG9yIGltcGxpY2l0IGxhbmQgbWFyayByb2xlc1xuICAgICAgICAgICAgbGV0IHBhcmVudFJvbGVzID0gY29udGV4dEhpZXJhcmNoaWVzW1wiYXJpYVwiXS5tYXAoaW5mbyA9PiBpbmZvLnJvbGUpO1xuICAgICAgICAgICAgcGFzc2VkID0gcGFyZW50Um9sZXMuZmlsdGVyKHJvbGUgPT4gcm9sZSBpbiBwYXJhbXMubWFwTGFuZG1hcmtzKS5sZW5ndGggPiAwXG4gICAgICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgIC8vIERvbid0IGZhaWwgZWxlbWVudHMgd2hlbiBhIHBhcmVudCBvciBzaWJsaW5nIGhhcyBmYWlsZWQgLSBjYXVzZXMgdG9vIG1hbnkgbWVzc2FnZXMuXG4gICAgICAgICAgICAgICAgbGV0IHdhbGtFbGVtZW50ID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgICAgIHdoaWxlICghcGFzc2VkICYmIHdhbGtFbGVtZW50ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gQ2FjaGVVdGlsLmdldENhY2hlKHdhbGtFbGVtZW50LCBcIlJwdF9BcmlhX09ycGhhbmVkQ29udGVudFwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHdhbGtFbGVtZW50ID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQod2Fsa0VsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB3YWxrRWxlbWVudCA9IHJ1bGVDb250ZXh0Lm5leHRFbGVtZW50U2libGluZztcbiAgICAgICAgICAgICAgICB3aGlsZSAoIXBhc3NlZCAmJiB3YWxrRWxlbWVudCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IENhY2hlVXRpbC5nZXRDYWNoZSh3YWxrRWxlbWVudCwgXCJScHRfQXJpYV9PcnBoYW5lZENvbnRlbnRcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICB3YWxrRWxlbWVudCA9IHdhbGtFbGVtZW50Lm5leHRFbGVtZW50U2libGluZztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgd2Fsa0VsZW1lbnQgPSBydWxlQ29udGV4dC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIHdoaWxlICghcGFzc2VkICYmIHdhbGtFbGVtZW50ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gQ2FjaGVVdGlsLmdldENhY2hlKHdhbGtFbGVtZW50LCBcIlJwdF9BcmlhX09ycGhhbmVkQ29udGVudFwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHdhbGtFbGVtZW50ID0gd2Fsa0VsZW1lbnQucHJldmlvdXNFbGVtZW50U2libGluZztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKHJ1bGVDb250ZXh0LCBcIlJwdF9BcmlhX09ycGhhbmVkQ29udGVudFwiLCB0cnVlKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCB0cmlnZ2VyIHJ1bGUgaWYgZWxlbWVudCBpcyBhIHN0YW5kLWFsb25lIHdpZGdldFxuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUocnVsZUNvbnRleHQsIFwiUnB0X0FyaWFfT3JwaGFuZWRDb250ZW50X05vVHJpZ2dlclwiLCBmYWxzZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIEFyaWFVdGlsLmhhc1JvbGUocnVsZUNvbnRleHQsIHBhcmFtcy5tYXBOb0xhbmRtYXJrZWRSb2xlcywgdHJ1ZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUocnVsZUNvbnRleHQsIHBhcmFtcy5tYXBOb0xhbmRtYXJrZWRSb2xlcywgdHJ1ZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3NlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKHJ1bGVDb250ZXh0LCBcIlJwdF9BcmlhX09ycGhhbmVkQ29udGVudF9Ob1RyaWdnZXJcIiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBbcnVsZUNvbnRleHRdLCAnJywgJycsIFtdKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX2NvbnRlbnRpbmZvX2xhYmVsX3VuaXF1ZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2NvbnRlbnRpbmZvX2xhYmVsX3VuaXF1ZVwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpjb250ZW50aW5mb1wiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfTXVsdGlwbGVDb250ZW50aW5mb0xhbmRtYXJrc19JbXBsaWNpdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiYXJpYV9jb250ZW50aW5mb19sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIjogXCJhcmlhX2NvbnRlbnRpbmZvX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9jb250ZW50aW5mb19sYWJlbF91bmlxdWUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiVGhlIGVsZW1lbnQgd2l0aCBcXFwiY29udGVudGluZm9cXFwiIHJvbGUgaGFzIGEgdW5pcXVlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCIsXG4gICAgICAgICAgICBcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwiOiBcIk11bHRpcGxlIGVsZW1lbnRzIHdpdGggXFxcImNvbnRlbnRpbmZvXFxcIiByb2xlIGRvIG5vdCBoYXZlIHVuaXF1ZSBsYWJlbHNcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFYWNoIGVsZW1lbnQgd2l0aCBcXFwiY29udGVudGluZm9cXFwiIHJvbGUgbXVzdCBoYXZlIGEgdW5pcXVlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IGR1cHBlZCA9IEFyaWFVdGlsLmlzTGFuZG1hcmtOYW1lVW5pcXVlKHJ1bGVDb250ZXh0LCBcImNvbnRlbnRpbmZvXCIsIHRydWUpOyAgICBcbiAgICAgICAgaWYgKGR1cHBlZCA9PSBudWxsKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBpZiAoZHVwcGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX2NvbnRlbnRpbmZvX21pc3VzZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2NvbnRlbnRpbmZvX21pc3VzZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbcm9sZV0sIGRvbTpmb290ZXIsIGRvbTphZGRyZXNzXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9Db250ZW50aW5mb1dpdGhOb01haW5fSW1wbGljaXRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9jb250ZW50aW5mb19taXN1c2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2NvbnRlbnRpbmZvX21pc3VzZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9jb250ZW50aW5mb19taXN1c2UuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJFbGVtZW50IHdpdGggXFxcImNvbnRlbnRpbmZvXFxcIiByb2xlIGlzIHByZXNlbnQgd2l0aG91dCBhbiBlbGVtZW50IHdpdGggXFxcIm1haW5cXFwiIHJvbGVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFYWNoIGVsZW1lbnQgd2l0aCBcXFwiY29udGVudGluZm9cXFwiIHJvbGUgaXMgb25seSBwZXJtaXR0ZWQgd2l0aCBhbiBlbGVtZW50IHdpdGggXFxcIm1haW5cXFwiIHJvbGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcblxuICAgICAgICAvL2NvbnNpZGVyIGltcGxpY2l0IHJvbGVcbiAgICAgICAgaWYgKCFBcmlhVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MocnVsZUNvbnRleHQsIFwiY29udGVudGluZm9cIikpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29uc2lkZXIgdGhlIENoZWNrIEhpZGRlbiBDb250ZW50IHNldHRpbmcgdGhhdCBpcyBzZXQgYnkgdGhlIHJ1bGVzXG4gICAgICAgIGxldCBwYXNzZWQgPVxuICAgICAgICAgICAgQ29tbW9uVXRpbC5nZXRFbGVtZW50c0J5Um9sZUhpZGRlbihcbiAgICAgICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgICAgIFwibWFpblwiLFxuICAgICAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgdHJ1ZVxuICAgICAgICAgICAgKS5sZW5ndGggPiAwO1xuXG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KHBhc3NlZCwgW3J1bGVDb250ZXh0XSwgJ3JvbGUnLCAnJywgW10pO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfY29udGVudGluZm9fc2luZ2xlOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfY29udGVudGluZm9fc2luZ2xlXCIsXG4gICAgY29udGV4dDogXCJkb206Kltyb2xlXSwgZG9tOmZvb3RlciwgZG9tOmFkZHJlc3NcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX011bHRpcGxlQ29udGVudGluZm9JblNpYmxpbmdTZXRfSW1wbGljaXRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX2NvbnRlbnRpbmZvX3NpbmdsZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfY29udGVudGluZm9fc2luZ2xlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2NvbnRlbnRpbmZvX3NpbmdsZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIk11bHRpcGxlIGVsZW1lbnRzIHdpdGggXFxcImNvbnRlbnRpbmZvXFxcIiByb2xlIGZvdW5kIG9uIHRoZSBwYWdlXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQSBwYWdlLCBkb2N1bWVudCwgb3IgYXBwbGljYXRpb24gc2hvdWxkIG9ubHkgaGF2ZSBvbmUgZWxlbWVudCB3aXRoIFxcXCJjb250ZW50aW5mb1xcXCIgcm9sZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcblxuICAgICAgICAvL2ZpbmQgb3V0IGlmIDxmb290ZXI+IGVsZW1lbnQgaGFzIHNpYmxpbmdzIGFzIDxmb290ZXI+IGhhcyBpbXBsaWNpdCBjb250ZW50aW5mbyByb2xlXG4gICAgICAgIGlmICghQXJpYVV0aWwuaGFzUm9sZUluU2VtYW50aWNzKHJ1bGVDb250ZXh0LCBcImNvbnRlbnRpbmZvXCIpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwYXNzZWQgPSAhQXJpYVV0aWwuZ2V0U2libGluZ1dpdGhSb2xlSGlkZGVuKFxuICAgICAgICAgICAgcnVsZUNvbnRleHQsXG4gICAgICAgICAgICBcImNvbnRlbnRpbmZvXCIsXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgdHJ1ZVxuICAgICAgICApO1xuXG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KHBhc3NlZCwgW3J1bGVDb250ZXh0XSwgJ3JvbGUnLCAnJywgW10pO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX2Rlc2NlbmRhbnRfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9kZXNjZW5kYW50X3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIGRlcGVuZGVuY2llczogW1wiYXJpYV9yb2xlX3ZhbGlkXCJdLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9kZXNjZW5kYW50X3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImFyaWFfZGVzY2VuZGFudF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9jaGlsZF9pbXBsaWNpdF9yb2xlXCI6IFwiYXJpYV9kZXNjZW5kYW50X3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwicmVjb21tZW5kYXRpb25fbm9faW1wYWN0X3JvbGVcIjogXCJhcmlhX2Rlc2NlbmRhbnRfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2NoaWxkX2V4cGxpY2l0X3JvbGVcIjogXCJhcmlhX2Rlc2NlbmRhbnRfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIkJyb3dzZXJzIGlnbm9yZSB0aGUgZXhwbGljaXQgYW5kIGltcGxpY2l0IEFSSUEgcm9sZXMgb2YgdGhlIGRlc2NlbmRhbnRzIG9mIGNlcnRhaW4gZWxlbWVudHNcIixcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlRoZSBlbGVtZW50IGNvbnRhaW5zIHZhbGlkIGRlc2NlbmRhbnRzXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9jaGlsZF9pbXBsaWNpdF9yb2xlXCI6IFwiVGhlIGVsZW1lbnQgd2l0aCByb2xlIFxcXCJ7MH1cXFwiIGNvbnRhaW5zIGRlc2NlbmRhbnRzIHdpdGggaW1wbGljaXQgcm9sZXMgXFxcInsxfVxcXCIgd2hpY2ggYXJlIGlnbm9yZWQgYnkgYnJvd3NlcnNcIixcbiAgICAgICAgICAgIFwicmVjb21tZW5kYXRpb25fbm9faW1wYWN0X3JvbGVcIjogXCJUaGUgZWxlbWVudCB3aXRoIHJvbGUgXFxcInswfVxcXCIgY29udGFpbnMgZGVzY2VuZGFudHMgd2l0aCByb2xlcyBcXFwiezF9XFxcIiB3aGljaCBhcmUgaWdub3JlZCBieSBicm93c2Vyc1wiLFxuICAgICAgICAgICAgXCJmYWlsX2NoaWxkX2V4cGxpY2l0X3JvbGVcIjogXCJUaGUgZWxlbWVudCB3aXRoIHJvbGUgXFxcInswfVxcXCIgY29udGFpbnMgZGVzY2VuZGFudHMgd2l0aCByb2xlcyBcXFwiezF9XFxcIiB3aGljaCBhcmUgaWdub3JlZCBieSBicm93c2Vyc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORSxcbiAgICAgICAgcmVhc29uQ29kZXM6IFtcInBhc3NcIiwgXCJwb3RlbnRpYWxfY2hpbGRfaW1wbGljaXRfcm9sZVwiLCBcImZhaWxfY2hpbGRfZXhwbGljaXRfcm9sZVwiXVxuICAgIH0se1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FLFxuICAgICAgICByZWFzb25Db2RlczogW1wicmVjb21tZW5kYXRpb25fbm9faW1wYWN0X3JvbGVcIl1cbiAgICB9XSxcbiAgICAvLyBUT0RPOiBBQ1Q6IFZlcmlmeSBtYXBwaW5nXG4gICAgYWN0OiBbXCIzMDduNXpcIl0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIFxuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IGlzIGhpZGRlbiBvciBkaXNhYmxlZFxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpIHx8IENvbW1vblV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBcbiAgICAgICAgLy9za2lwIHRoZSBjaGVjayBpZiB0aGUgZWxlbWVudCBkb2Vzbid0IHJlcXVpcmUgcHJlc2VudGF0aW9uYWwgY2hpbGRyZW4gb25seVxuICAgICAgICBpZiAoIUFyaWFVdGlsLmNvbnRhaW5zUHJlc2VudGF0aW9uYWxDaGlsZHJlbk9ubHkocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBcbiAgICAgICAgbGV0IHJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXMocnVsZUNvbnRleHQsIGZhbHNlKTtcbiAgICAgICAgLy8gaWYgZXhwbGljaXQgcm9sZSBkb2Vzbid0IGV4aXN0LCBnZXQgdGhlIGltcGxpY2l0IG9uZVxuICAgICAgICBpZiAoIXJvbGVzIHx8IHJvbGVzLmxlbmd0aCA9PT0gMCkgXG4gICAgICAgICAgICByb2xlcyA9ICBBcmlhVXRpbC5nZXRJbXBsaWNpdFJvbGUocnVsZUNvbnRleHQpO1xuICAgICAgICBcbiAgICAgICAgLy9pZ25vcmUgaWYgdGhlIGVsZW1lbnQgZG9lc24ndCBoYXZlIGFueSBleHBsaWNpdCBvciBpbXBsaWNpdCByb2xlLCBzaG91bGRuJ3QgaGFwcGVuXG4gICAgICAgIGlmICghcm9sZXMgfHwgcm9sZXMubGVuZ3RoID09PSAwKSBcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIGxldCB0YWdOYW1lID0gcnVsZUNvbnRleHQudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAvLyBnZXQgYWxsIHRoZSBjaGlsZHJlbiBmcm9tIGFjY2Vzc2liaWxpdHkgdHJlZSwgXG4gICAgICAgIC8vIGluY2x1ZGluZyBvbmVzIHdpdGggYXJpYS1vd25zICAgIFxuICAgICAgICBsZXQgZGlyZWN0QVRDaGlsZHJlbiA9IEFyaWFVdGlsLmdldERpcmVjdEFUQ2hpbGRyZW4ocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoZGlyZWN0QVRDaGlsZHJlbiAmJiBkaXJlY3RBVENoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vIHRoZSBlbGVtZW50IHdpdGggYXQgbGVhc3Qgb25lIG5vbi1wcmVzZW50YXRpb25hbCBjaGlsZHJlblxuICAgICAgICAgICAgbGV0IGV4cGxpY2l0Um9sZXMgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgICAgIGxldCBpbXBsaWNpdFJvbGVzID0gbmV3IEFycmF5KCk7XG4gICAgICAgICAgICBsZXQgbm9JbXBhY3RSb2xlcyA9IG5ldyBBcnJheSgpO1xuICAgICAgICAgICAgZm9yIChsZXQgaj0wOyBqIDwgZGlyZWN0QVRDaGlsZHJlbi5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIC8vIGlnbm9yZSA8aW1nPiBhbmQgPHN2Zz5cbiAgICAgICAgICAgICAgICBjb25zdCB0YWcgPSBkaXJlY3RBVENoaWxkcmVuW2pdLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgaWYgKHRhZyA9PT0gJ2ltZycgfHwgdGFnID09PSAnc3ZnJykgY29udGludWU7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gZ2V0IGV4cGxpY2l0IHJvbGUgaWYgZXhpc3RzXG4gICAgICAgICAgICAgICAgbGV0IGNoaWxkUm9sZXMgPSBBcmlhVXRpbC5nZXRSb2xlcyhkaXJlY3RBVENoaWxkcmVuW2pdLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkUm9sZXMgJiYgY2hpbGRSb2xlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHNlcGFyYXRlIGNhc2UgZm9yIHJvbGU9XCJjb2RlXCJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkUm9sZXMuaW5jbHVkZXMoXCJjb2RlXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBub0ltcGFjdFJvbGVzLnB1c2goY2hpbGRSb2xlcy5maWx0ZXIocm9sZSA9PiByb2xlID09PSBcImNvZGVcIikuam9pbihcIiwgXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBleHBsaWNpdFJvbGVzLnB1c2goY2hpbGRSb2xlcy5maWx0ZXIocm9sZSA9PiByb2xlICE9PSBcImNvZGVcIikuam9pbihcIiwgXCIpKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBnZXQgaW1wbGljaXQgcm9sZSBpZiBleGlzdHNcbiAgICAgICAgICAgICAgICAgICAgY2hpbGRSb2xlcyA9ICBBcmlhVXRpbC5nZXRJbXBsaWNpdFJvbGUoZGlyZWN0QVRDaGlsZHJlbltqXSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIHNlcGFyYXRlIGNhc2UgZm9yIHJvbGU9XCJjb2RlXCJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkUm9sZXMuaW5jbHVkZXMoXCJjb2RlXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBub0ltcGFjdFJvbGVzLnB1c2goY2hpbGRSb2xlcy5maWx0ZXIocm9sZSA9PiByb2xlID09PSBcImNvZGVcIikuam9pbihcIiwgXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGRSb2xlcyAmJiBjaGlsZFJvbGVzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgICAgICBpbXBsaWNpdFJvbGVzLnB1c2goY2hpbGRSb2xlcy5maWx0ZXIocm9sZSA9PiByb2xlICE9PSBcImNvZGVcIikuam9pbihcIiwgXCIpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChleHBsaWNpdFJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgcmV0VmFsdWVzID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgZXhwbGljaXRSb2xlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmV0VG9rZW4gPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0VG9rZW4ucHVzaChyb2xlcy5qb2luKFwiLCBcIikpO1xuICAgICAgICAgICAgICAgICAgICByZXRUb2tlbi5wdXNoKGV4cGxpY2l0Um9sZXNbaV0pO1xuICAgICAgICAgICAgICAgICAgICByZXRWYWx1ZXMucHVzaChSdWxlRmFpbChcImZhaWxfY2hpbGRfZXhwbGljaXRfcm9sZVwiLCByZXRUb2tlbikpO1xuICAgICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbHVlcztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGltcGxpY2l0Um9sZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCByZXRWYWx1ZXMgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBpbXBsaWNpdFJvbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCByZXRUb2tlbiA9IG5ldyBBcnJheSgpO1xuICAgICAgICAgICAgICAgICAgICByZXRUb2tlbi5wdXNoKHJvbGVzLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgICAgICAgICAgICAgIHJldFRva2VuLnB1c2goaW1wbGljaXRSb2xlc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbHVlcy5wdXNoKFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfY2hpbGRfaW1wbGljaXRfcm9sZVwiLCByZXRUb2tlbikpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmV0VmFsdWVzO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobm9JbXBhY3RSb2xlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJldFZhbHVlcyA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGk9MDsgaSA8IG5vSW1wYWN0Um9sZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJldFRva2VuID0gbmV3IEFycmF5KCk7XG4gICAgICAgICAgICAgICAgICAgIHJldFRva2VuLnB1c2gocm9sZXMuam9pbihcIiwgXCIpKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0VG9rZW4ucHVzaChub0ltcGFjdFJvbGVzW2ldKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsdWVzLnB1c2goUnVsZVBvdGVudGlhbChcInJlY29tbWVuZGF0aW9uX25vX2ltcGFjdF9yb2xlXCIsIHJldFRva2VuKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXRWYWx1ZXM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTsgICAgICAgXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfZG9jdW1lbnRfbGFiZWxfdW5pcXVlOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfZG9jdW1lbnRfbGFiZWxfdW5pcXVlXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmRvY3VtZW50XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9NdWx0aXBsZURvY3VtZW50Um9sZXNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImFyaWFfZG9jdW1lbnRfbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCI6IFwiYXJpYV9kb2N1bWVudF9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfZG9jdW1lbnRfbGFiZWxfdW5pcXVlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlRoZSBlbGVtZW50IHdpdGggXFxcImRvY3VtZW50XFxcIiByb2xlIGhhcyBhIHVuaXF1ZSBsYWJlbCB0aGF0IGRlc2NyaWJlcyBpdHMgcHVycG9zZVwiLFxuICAgICAgICAgICAgXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIjogXCJNdWx0aXBsZSBlbGVtZW50cyB3aXRoIFxcXCJkb2N1bWVudFxcXCIgcm9sZXMgZG8gbm90IGhhdmUgdW5pcXVlIGxhYmVsc1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVhY2ggZWxlbWVudCB3aXRoIFxcXCJkb2N1bWVudFxcXCIgcm9sZSBtdXN0IGhhdmUgYSB1bmlxdWUgbGFiZWwgdGhhdCBkZXNjcmliZXMgaXRzIHB1cnBvc2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuNC4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgY29uc3QgZHVwcGVkID0gQXJpYVV0aWwuaXNMYW5kbWFya05hbWVVbmlxdWUocnVsZUNvbnRleHQsIFwiZG9jdW1lbnRcIiwgdHJ1ZSk7ICAgIFxuICAgICAgICBpZiAoZHVwcGVkID09IG51bGwpIHJldHVybiBudWxsOyBcbiAgICAgICAgaWYgKGR1cHBlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX2V2ZW50aGFuZGxlcl9yb2xlX3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfZXZlbnRoYW5kbGVyX3JvbGVfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqW29uY2xpY2tdLGRvbToqW29uYmx1cl0sIGRvbToqW29uZGJsY2xpY2tdLCBkb206KltvbmZvY3VzXSwgZG9tOipbb25rZXlkb3duXSxkb206KltvbmtleXByZXNzXSwgZG9tOipbb25rZXl1cF0sIGRvbToqW29ubW91c2Vkb3duXSwgZG9tOipbb25tb3VzZXVwXSwgZG9tOipbb25tb3VzZW1vdmVdLCBkb206Kltvbm1vdXNlb3V0XSwgZG9tOipbb25tb3VzZW92ZXJdLCBkb206KltvbnJlc2l6ZV0sIGRvbToqW29uY2hhbmdlXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfRXZlbnRIYW5kbGVyTWlzc2luZ1JvbGVfTmF0aXZlX0hvc3RfU2VtYXRpY3NcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX2V2ZW50aGFuZGxlcl9yb2xlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV9ldmVudGhhbmRsZXJfcm9sZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9ldmVudGhhbmRsZXJfcm9sZV92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlRoZSA8ezB9PiBlbGVtZW50IHdpdGggJ3sxfScgZG9lcyBub3QgaGF2ZSBhIHZhbGlkIEFSSUEgcm9sZSBzcGVjaWZpZWRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFbGVtZW50cyB3aXRoIGV2ZW50IGhhbmRsZXJzIG11c3QgaGF2ZSBhIHZhbGlkIEFSSUEgcm9sZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy8gRG9uJ3QgdHJpZ2dlciB0aGlzIGZvciBTVkcgZWxlbWVudCBmb3Igbm93IHVudGlsIGEgZGV0ZXJtaW5hdGlvbiBpcyBtYWRlIChieSBSaWNoKVxuICAgICAgICAvLyB0byBzdXBwb3J0IFNWRyBhdCBhIHBvaW50IHdoZW4gdGhlIFNWRyBhMTF5IHNwZWMgaXMgcmVhZHkuXG4gICAgICAgIGlmIChDb21tb25VdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBcInN2Z1wiKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvL3RoaXMgcnVsZSBpcyBwYXNzZWQgaWYgYSBlbGVtZW50IGhhcyBhdHRyaWJ1dCByb2xlIFxuICAgICAgICAvL2Fsc28sIHBhc3NlZCBvZiBlbGVtZW50IGhhcyBhbnkgaW1wbGljaXQgcm9sZXMuIFxuICAgICAgICBpZiAoQXJpYVV0aWwuaGFzQW55Um9sZShydWxlQ29udGV4dCwgdHJ1ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vcGFzcyBpZiB0aGlzIGVsZW1lbnQgaXMgcmVjZWl2ZWQgZm9jdXMgYnkgZGVmYXVsdFxuICAgICAgICBpZiAoQ29tbW9uVXRpbC5pc2ZvY3VzYWJsZUJ5RGVmYXVsdChydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vdmFsaWRhdGUgaWYgdGhpcyBlbGVtZW50IGhhcyBhbnkgb2YgdGhlIGdpdmVuIGV2ZW50IGhhbmRsZXInc1xuICAgICAgICBsZXQgcmV0VG9rZW4xID0gbmV3IEFycmF5KCk7XG4gICAgICAgIHJldFRva2VuMS5wdXNoKHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICBsZXQgZXZlbnRBcnIgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgLy8gRnJvbSBXQ0FHMjBfU2NyaXB0X1VzZVczQ0RvbUZ1bmN0aW9uc1xuICAgICAgICAvL2xldCBldmVudHMgPSBbXCJvbmJsdXJcIiwgXCJvbmZvY3VzXCIsIFwib25jaGFuZ2VcIiwgXCJvbmNsaWNrXCIsIFwib25jb250ZXh0bWVudVwiLCBcIm9uZGJsY2xpY2tcIiwgXCJvbmtleWRvd25cIixcbiAgICAgICAgLy8gICAgICAgICAgICAgIFwib25rZXlwcmVzc1wiLCBcIm9ua2V5dXBcIiwgXCJvbmxvYWRcIiwgXCJvbm1vdXNlZG93blwiLCBcIm9ubW91c2V1cFwiLCBcIm9ubW91c2Vtb3ZlXCIsIFwib25tb3VzZW91dFwiLFxuICAgICAgICAvLyAgICAgICAgICAgICAgXCJvbm1vdXNlb3ZlclwiLCBcIm9ubW91c2V3aGVlbFwiLCBcIm9ucmVzZXRcIiwgXCJvbnBhc3RlXCIsIFwib25yZXNpemVcIiwgXCJvbnNjcm9sbFwiLFxuICAgICAgICAvLyAgICAgICAgICAgICAgXCJvbnNlbGVjdFwiLCBcIm9uc3VibWl0XCIsIFwib25hY3RpdmF0ZVwiLCBcIm9uZGVhY3RpdmF0ZVwiLCBcIm9ubW91c2VlbnRlclwiLCBcIm9ubW91c2VsZWF2ZVwiXTtcbiAgICAgICAgbGV0IGV2ZW50cyA9IFtcIm9uYmx1clwiLCBcIm9uZm9jdXNcIiwgXCJvbmNoYW5nZVwiLCBcIm9uY2xpY2tcIiwgXCJvbmRibGNsaWNrXCIsIFwib25rZXlkb3duXCIsXG4gICAgICAgICAgICBcIm9ua2V5cHJlc3NcIiwgXCJvbmtleXVwXCIsIFwib25tb3VzZWRvd25cIiwgXCJvbm1vdXNldXBcIiwgXCJvbm1vdXNlbW92ZVwiLCBcIm9ubW91c2VvdXRcIixcbiAgICAgICAgICAgIFwib25tb3VzZW92ZXJcIiwgXCJvbnJlc2l6ZVwiXG4gICAgICAgIF07XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXZlbnRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKGV2ZW50c1tpXSkpXG4gICAgICAgICAgICAgICAgZXZlbnRBcnIucHVzaChldmVudHNbaV0pO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZXRUb2tlbjIgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgcmV0VG9rZW4yLnB1c2goZXZlbnRBcnIuam9pbihcIiwgXCIpKTtcbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQoZmFsc2UsIFtydWxlQ29udGV4dF0sICcnLCAnJywgW3JldFRva2VuMSwgcmV0VG9rZW4yXSk7XG4gICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiLCBbcmV0VG9rZW4xLnRvU3RyaW5nKCksIHJldFRva2VuMi50b1N0cmluZygpXSk7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfZm9ybV9sYWJlbF91bmlxdWU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9mb3JtX2xhYmVsX3VuaXF1ZVwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpmb3JtXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9NdWx0aXBsZUZvcm1MYW5kbWFya3NfSW1wbGljaXRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImFyaWFfZm9ybV9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIjogXCJhcmlhX2Zvcm1fbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2Zvcm1fbGFiZWxfdW5pcXVlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlRoZSBlbGVtZW50IHdpdGggXFxcImZvcm1cXFwiIHJvbGUgaGFzIGEgdW5pcXVlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCIsXG4gICAgICAgICAgICBcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwiOiBcIk11bHRpcGxlIGVsZW1lbnRzIHdpdGggXFxcImZvcm1cXFwiIHJvbGUgZG8gbm90IGhhdmUgdW5pcXVlIGxhYmVsc1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVhY2ggZWxlbWVudCB3aXRoIFxcXCJmb3JtXFxcIiByb2xlIG11c3QgaGF2ZSBhIHVuaXF1ZSBsYWJlbCB0aGF0IGRlc2NyaWJlcyBpdHMgcHVycG9zZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBkdXBwZWQgPSBBcmlhVXRpbC5pc0xhbmRtYXJrTmFtZVVuaXF1ZShydWxlQ29udGV4dCwgXCJmb3JtXCIsIHRydWUpOyAgICBcbiAgICAgICAgaWYgKGR1cHBlZCA9PSBudWxsKSByZXR1cm4gbnVsbDsgXG4gICAgICAgIGlmIChkdXBwZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX2dyYXBoaWNfbGFiZWxsZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9ncmFwaGljX2xhYmVsbGVkXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmdyYXBoaWNzLWRvY3VtZW50LGFyaWE6Z3JhcGhpY3Mtc3ltYm9sXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJIQUFDX0FyaWFfU3ZnQWx0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJGYWlsXzJcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiRmFpbF8zXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2dyYXBoaWNfbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX2dyYXBoaWNfbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX2dyYXBoaWNfbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJhcmlhX2dyYXBoaWNfbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJhcmlhX2dyYXBoaWNfbGFiZWxsZWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIkFuIGVsZW1lbnQgd2l0aCBhIGdyYXBoaWNzIHJvbGUgbXVzdCBoYXZlIGEgbm9uLWVtcHR5IGxhYmVsXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkVsZW1lbnQgd2l0aCBcXFwiezB9XFxcIiBncmFwaGljcyByb2xlIGhhcyBubyBsYWJlbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJFbGVtZW50IHdpdGggXFxcInswfVxcXCIgZ3JhcGhpY3Mgcm9sZSBoYXMgbm8gbGFiZWwgb3IgYW4gZW1wdHkgbGFiZWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiRWxlbWVudCB3aXRoIFxcXCJ7MH1cXFwiIGdyYXBoaWNzIHJvbGUgbWlzc2luZyBub24tZW1wdHkgJ2FyaWEtbGFiZWwnIG9yICdhcmlhLWxhYmVsbGVkYnknXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFtdLFxuICAgIGFjdDogW3tcbiAgICAgICAgXCI3ZDY3MzRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImluYXBwbGljYWJsZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJmYWlsXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcImluYXBwbGljYWJsZVwiXG4gICAgICAgIH1cbiAgICB9XSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuXG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBpZiAoIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInJvbGVcIikgfHwgIXJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInJvbGVcIikuaW5jbHVkZXMoXCJncmFwaGljcy1cIikpIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8qIHJlbW92ZWQgdGhlIHJvbGUgY2hlY2sgcm9sZT0gcHJlc2VudGF0aW9uIHNpbmNlIGlmIGFuIGVsZW1lbnQgaGFzIHJvbGU9aW1nLCB0aGVuIHRoZXJlIG5lZWRzIHRvIGJlIGEgY2hlY2sgZm9yIGFsdCBhdHRyaWJ1dGUgcmVnYXJkbGVzcyBvZiB0aGUgcHJlc2VjbmUgb2Ygcm9sZT1wcmVzZW50YXRpb25cbiAgICAgICAgaWYgKFJQVFV0aWwuaGFzUm9sZShydWxlQ29udGV4dCwgXCJwcmVzZW50YXRpb25cIikgfHwgUlBUVXRpbC5oYXNSb2xlKHJ1bGVDb250ZXh0LCBcIm5vbmVcIikpe1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcygxKTtcbiAgICAgICAgfSovXG5cbiAgICAgICAgLy8gSWYgcm9sZSA9PT0gaW1nLCB5b3UgbXVzdCB1c2UgYW4gYXJpYSBsYWJlbFxuICAgICAgICAvL2NoZWNrIGF0dHJpYnV0ZXMgYXJpYS1sYWJlbCBhbmQgYXJpYS1sYWJlbGxlZGJ5IGZvciBvdGhlciB0YWdzIChlLmcuLCA8ZGl2PiwgPHNwYW4+LCBldGMpXG4gICAgICAgIGxldCBwYXNzZWQgPSBBcmlhVXRpbC5nZXRBcmlhTGFiZWwocnVsZUNvbnRleHQpLmxlbmd0aCA+IDA7XG5cbiAgICAgICAgaWYgKCFwYXNzZWQgJiYgcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJzdmdcIikge1xuICAgICAgICAgICAgbGV0IHN2Z1RpdGxlID0gcnVsZUNvbnRleHQucXVlcnlTZWxlY3RvcihcInRpdGxlXCIpO1xuICAgICAgICAgICAgcGFzc2VkID0gc3ZnVGl0bGUgJiYgQ29tbW9uVXRpbC5oYXNJbm5lckNvbnRlbnQoc3ZnVGl0bGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIC8vY2hlY2sgdGl0bGUgYXR0cmlidXRlXG4gICAgICAgICAgICBwYXNzZWQgPSBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInRpdGxlXCIpO1xuICAgICAgICAgICAgLy8gV2Ugc2hvdWxkIGd1aWRlIHBlb3BsZSB0byB1c2UgYWx0IG9yIGxhYmVsIC0gdGhpcyBpcyBqdXN0IGEgc2Vjb25kYXJ5IGFwcHJvYWNoIHRvIHNpbGVuY2UgdGhlIHJ1bGUuXG4gICAgICAgICAgICAvLyBTbywgd2Ugc2hvdWxkIGtlZXAgdGhlIFBPRiBmcm9tIGFib3ZlLlxuICAgICAgICAgICAgLy8gaWYgKCFwYXNzZWQpIFBPRiA9IFwiRmFpbF8zXCI7XG4gICAgICAgIH1cbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBbcnVsZUNvbnRleHRdLCAncm9sZScsICcnLCBbXSk7XG4gICAgICAgIGlmIChwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMlwiLCBbcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwicm9sZVwiKV0pXG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX2hpZGRlbl9ub250YWJiYWJsZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2hpZGRlbl9ub250YWJiYWJsZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbYXJpYS1oaWRkZW49dHJ1ZV0sIGRvbToqW2FyaWEtaGlkZGVuPXRydWVdIGRvbToqXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJhcmlhX2hpZGRlbl9mb2N1c19taXN1c2VcIjogeyBcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IGBhcmlhX2hpZGRlbl9ub250YWJiYWJsZS5odG1sYCwgXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBgYXJpYV9oaWRkZW5fbm9udGFiYmFibGUuaHRtbGAsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBgYXJpYV9oaWRkZW5fbm9udGFiYmFibGUuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQSBoaWRkZW4gZWxlbWVudCBzaG91bGQgbm90IGNvbnRhaW4gYW55IHRhYmJhYmxlIGVsZW1lbnRzXCIsIFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJFbGVtZW50IFxcXCJ7MH1cXFwiIHNob3VsZCBub3QgYmUgZm9jdXNhYmxlIHdpdGhpbiB0aGUgc3VidHJlZSBvZiBhbiBlbGVtZW50IHdpdGggYW4gJ2FyaWEtaGlkZGVuJyBhdHRyaWJ1dGUgd2l0aCB2YWx1ZSAndHJ1ZSdcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFsgXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIG51bTogW1wiMS4zLjFcIiwgXCI0LjEuMlwiXSwgLy8gbnVtOiBbIFwiMi40LjRcIiwgXCJ4LnkuelwiIF0gYWxzbyBhbGxvd2VkXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICAvLyBUT0RPOiBBQ1Q6IEhhbmRsZSB0ZXN0Y2FzZSB3aXRoIGZvY3VzIGp1bXBpbmcgYXdheVxuICAgIGFjdDogXCI2Y2ZhODRcIixcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAgICAgXG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChDb21tb25VdGlsLmlzVGFiYmFibGUocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW25vZGVOYW1lXSk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcbmltcG9ydCB7IEFSSUFEZWZpbml0aW9ucyB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFEZWZpbml0aW9uc1wiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfaWRfdW5pcXVlOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfaWRfdW5pcXVlXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfVmFsaWRJZFJlZlwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfaWRfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV9pZF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfaWRfdW5pcXVlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiVGhlICdpZCcgXFxcInswfVxcXCIgc3BlY2lmaWVkIGZvciB0aGUgQVJJQSBwcm9wZXJ0eSAnezF9JyB2YWx1ZSBpcyBub3QgdmFsaWRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgQVJJQSBwcm9wZXJ0eSBtdXN0IHJlZmVyZW5jZSBhIG5vbi1lbXB0eSB1bmlxdWUgaWQgb2YgYW4gZXhpc3RpbmcgZWxlbWVudCB0aGF0IGlzIHZpc2libGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICAvLyBUT0RPOiBBQ1Q6IDZhNzI4MSAtIE5lZWQgYSBzZXBhcmF0ZSByZWFzb24gY29kZSB3aGVuIHRoZSBwcm9wZXJ0eSBpcyBub3QgcmVxdWlyZWQuIEFDVCBzYXlzIGl0J3Mgb2theSB0byBiZVxuICAgIC8vIGludmFsaWQgd2hlbiBub3QgcmVxdWlyZWQuIEkgdGhpbmsgd2Ugc2hvdWxkIHN0aWxsIGZhaWwsIGJ1dCBmbGFnIGl0IGFzIGEgZGlmZmVyZW50IHJlYXNvbiBzbyB0aGF0IHdlIGNhbiBoYXZlIGEgc3Vic2V0XG4gICAgLy8gYWxpZ25zIHdpdGggQUNULlxuICAgIGFjdDogW1wiNTk3OTZmXCIsIFwiNmE3MjgxXCJdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzID0gdHJ1ZTtcbiAgICAgICAgbGV0IGF0dHJOYW1lQXJyID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCBub25FeGlzdGFudElEcyA9IG5ldyBBcnJheSgpO1xuICAgICAgICBsZXQgb3duZXJEb2N1bWVudCA9IEZyYWdtZW50VXRpbC5nZXRPd25lckZyYWdtZW50KHJ1bGVDb250ZXh0KTtcbiAgICAgICAgbGV0IGNvbnRleHRBdHRyaWJ1dGVzID0gcnVsZUNvbnRleHQuYXR0cmlidXRlcztcbiAgICAgICAgbGV0IGlkVG9rZW5zID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCB0ZXN0ZWRSZWZlcmVuY2VzID0gMDtcblxuICAgICAgICBpZiAoY29udGV4dEF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBhdHRyTGVuZ3RoID0gY29udGV4dEF0dHJpYnV0ZXMubGVuZ3RoOyBpIDwgYXR0ckxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgcGFzcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgbGV0IGF0dHJOYW1lID0gY29udGV4dEF0dHJpYnV0ZXNbaV0ubmFtZTtcbiAgICAgICAgICAgICAgICBpZiAoQXJpYVV0aWwuaXNEZWZpbmVkQXJpYUF0dHJpYnV0ZShydWxlQ29udGV4dCwgYXR0ck5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkYXRhVHlwZXMgPSBBUklBRGVmaW5pdGlvbnMucHJvcGVydHlEYXRhVHlwZXNbYXR0ck5hbWVdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YVR5cGVzICYmIGRhdGFUeXBlcy50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3VwcG9ydHNPbmVJRFJlZiA9IChkYXRhVHlwZXMudHlwZSA9PSBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2lkcmVmXCIpID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9JZiB0aGUgZGF0YSB0eXBlIHN1cHBvcnRzIG9uZSBvciBtb3JlIGlkIHJlZnMgZG8gZXJyb3IgY2hlY2tpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdXBwb3J0c09uZUlEUmVmIHx8IChkYXRhVHlwZXMudHlwZSA9PSBcImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2lkcmVmc1wiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RlZFJlZmVyZW5jZXMrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbm9kZVZhbHVlTGVuZ3RoID0gQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKGNvbnRleHRBdHRyaWJ1dGVzW2ldLm5vZGVWYWx1ZSkubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpZEFycmF5ID0gY29udGV4dEF0dHJpYnV0ZXNbaV0ubm9kZVZhbHVlLnNwbGl0KFwiIFwiKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBhbiBlbXB0eSBJRCBSZWZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZVZhbHVlTGVuZ3RoIDwgMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkVG9rZW5zLnB1c2goXCJcXFwiXCIgKyBjb250ZXh0QXR0cmlidXRlc1tpXS5ub2RlVmFsdWUgKyBcIlxcXCJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIHRvIHNlZSBpZiB0b28gbWFueSBJRFJlZnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzdXBwb3J0c09uZUlEUmVmKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vSWYgaGFzIHRvbyBtYW55IElEUmVmcyBpdCBpcyBhbiBlcnJvclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZVZhbHVlTGVuZ3RoID49IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZEFycmF5Lmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmVlZCB0byBjYXB0dXJlIGFsbCB0aGUgSURSZWZzIGZvciBpZFRva2Vuc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHogPSAwLCBsZW5ndGggPSBpZEFycmF5Lmxlbmd0aDsgeiA8IGxlbmd0aDsgKyt6KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZEFycmF5W3pdICE9IFwiXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkVG9rZW5zLnB1c2goaWRBcnJheVt6XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgdG8gc2VlIGlmIGlkIHJlZnMgYXJlIGludmFsaWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFzcyAmJiBub2RlVmFsdWVMZW5ndGggPj0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMCwgbGVuZ3RoID0gaWRBcnJheS5sZW5ndGg7IGogPCBsZW5ndGg7ICsraikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlkQXJyYXlbal0ubGVuZ3RoID4gMCkgeyAvLyBpdCBpcyBhbiBlbXB0eSBzdHJpbmcgaWYgc3BhY2VzIGFyZSBvbmUgYWZ0ZXIgdGhlIG90aGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBlbGVtZW50IGJ5IElkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVsZW1lbnRCeUlkID0gb3duZXJEb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZEFycmF5W2pdKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBhc3MgaWYgdGhlIGVsZW1lbnQgZXhpc3RzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzcyA9IGVsZW1lbnRCeUlkICE9IG51bGw7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgZWxlbWVudCBleGlzdHMgYW5kIHRoaXMgaXMgYW4gYXJpYSBhdHRyaWJ1dGUgdGhhdCBkb2Vzbid0IHN1cHBvcnQgaGlkZGVuIElEIHJlZmVyZW5jZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZW4gcGVyZm9ybSBhIGlzTm9kZVZpc2libGUgY2hlY2ssIGluIHRoZSBjYXNlIHRoZSBub2RlIGlzIG5vdCB2aXNpYmxlIHRoZW4gd2UgcmV0dXJuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmFsc2UgYW5kIHRydWUgb3RoZXJ3aXNlLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXNzICYmICFkYXRhVHlwZXMuaGlkZGVuSURSZWZTdXBwb3J0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzcyA9IFZpc1V0aWwuaXNOb2RlVmlzaWJsZShlbGVtZW50QnlJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZEFycmF5W2pdICE9IFwiXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkVG9rZW5zLnB1c2goaWRBcnJheVtqXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSBvbmUgb2YgdGhlIGlkIHJlZmVyZW5jZXMgbmVlZCB0byBiZSB2YWxpZCB0byBtYXJrIHRoZSBydWxlIGFzIHBhc3NlZC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGVyZWZvcmUgaWYgd2UgZmluZCBhIHNpbmdsZSB2aXNpYmxlIGVsZW1lbnQgdGhlbiBzdG9wIGNoZWNraW5nIGFuZCBtYXJrIGFzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFzc2VkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXNzKSBhdHRyTmFtZUFyci5wdXNoKGF0dHJOYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHBhc3NlZCA9IGF0dHJOYW1lQXJyLmxlbmd0aCA9PSAwO1xuICAgICAgICBsZXQgcmV0VG9rZW4xID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCByZXRUb2tlbjIgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgbGV0IHJldFRva2VuMyA9IG5ldyBBcnJheSgpO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuXG4gICAgICAgICAgICByZXRUb2tlbjIucHVzaChhdHRyTmFtZUFyci5qb2luKFwiLCBcIikpO1xuICAgICAgICAgICAgcmV0VG9rZW4zLnB1c2gocnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgICAgICBpZiAoaWRUb2tlbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHJldFRva2VuMS5wdXNoKGlkVG9rZW5zLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIFtydWxlQ29udGV4dF0sIGF0dHJOYW1lQXJyLCAnJywgcGFzc2VkID09IHRydWUgPyBbXSA6IFtyZXRUb2tlbjEsIHJldFRva2VuMiwgcmV0VG9rZW4zXSk7XG4gICAgICAgIGlmICh0ZXN0ZWRSZWZlcmVuY2VzID09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9IGVsc2UgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiLCBbcmV0VG9rZW4xLnRvU3RyaW5nKCksIHJldFRva2VuMi50b1N0cmluZygpLCByZXRUb2tlbjMudG9TdHJpbmcoKV0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9pbWdfbGFiZWxsZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9pbWdfbGFiZWxsZWRcIixcbiAgICBjb250ZXh0OiBcImFyaWE6aW1nLCBhcmlhOmltYWdlXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJIQUFDX0FyaWFfSW1nQWx0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJGYWlsXzJcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiRmFpbF8zXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2ltZ19sYWJlbGxlZC5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfaW1nX2xhYmVsbGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV9pbWdfbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJhcmlhX2ltZ19sYWJlbGxlZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcImFyaWFfaW1nX2xhYmVsbGVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBbiBlbGVtZW50IHdpdGggXFxcImltZ1xcXCIgcm9sZSBtdXN0IGhhdmUgYSBub24tZW1wdHkgbGFiZWxcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRWxlbWVudCB3aXRoIFxcXCJpbWdcXFwiIHJvbGUgaGFzIG5vIGxhYmVsXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkVsZW1lbnQgd2l0aCBcXFwiaW1nXFxcIiByb2xlIGhhcyBubyBsYWJlbCBvciBhbiBlbXB0eSBsYWJlbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJFbGVtZW50IHdpdGggXFxcImltZ1xcXCIgcm9sZSBtaXNzaW5nIG5vbi1lbXB0eSAnYXJpYS1sYWJlbCcgb3IgJ2FyaWEtbGFiZWxsZWRieSdcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW10sXG4gICAgYWN0OiBbXCIyM2EyYThcIiwge1xuICAgICAgICBcIjdkNjczNFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcImZhaWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiaW5hcHBsaWNhYmxlXCJcbiAgICAgICAgfVxuICAgIH1dLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJyb2xlXCIpKSB7XG4gICAgICAgICAgICAvLyBJZiBubyByb2xlLCB0aGlzIGlzIGltcGxpY2l0LCBhbmQgY292ZXJlZCBieSBXQ0FHMjBfSW1nX0hhc0FsdFxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICAvLyBzdmcgYW5kIGltZyBlbGVtZW50cyBhcmUgaGFuZGxlZCBpbiBzdmdfZ3JhcGhpY3NfbGFiYmVsbGVkIGFuZCBpbWdfYWx0X3ZhbGlkIHJ1bGVzXG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gJ3N2ZycgfHwgbm9kZU5hbWUgPT09ICdpbWcnKSByZXR1cm47XG5cbiAgICAgICAgLyogcmVtb3ZlZCB0aGUgcm9sZSBjaGVjayByb2xlPSBwcmVzZW50YXRpb24gc2luY2UgaWYgYW4gZWxlbWVudCBoYXMgcm9sZT1pbWcsIHRoZW4gdGhlcmUgbmVlZHMgdG8gYmUgYSBjaGVjayBmb3IgYWx0IGF0dHJpYnV0ZSByZWdhcmRsZXNzIG9mIHRoZSBwcmVzZWNuZSBvZiByb2xlPXByZXNlbnRhdGlvblxuICAgICAgICBpZiAoUlBUVXRpbC5oYXNSb2xlKHJ1bGVDb250ZXh0LCBcInByZXNlbnRhdGlvblwiKSB8fCBSUFRVdGlsLmhhc1JvbGUocnVsZUNvbnRleHQsIFwibm9uZVwiKSl7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKDEpO1xuICAgICAgICB9Ki9cblxuICAgICAgICAvKiBKQ0ggLSBQb2ludHMgb2YgZmFpbHVyZVxuICAgICAgICAgKiAgICAwLiBNaXNzaW5nIGFsdCBhdHRyIHdpdGggdmFsdWVcbiAgICAgICAgICogICAgMS4gTWlzc2luZyBhcmlhLWxhYmVsIG9yIGFyaWEtbGFiZWxsZWRieVxuICAgICAgICAgKiAgICAyLiBNaXNzaW5nIHRpdGxlIGF0dHIgd2l0aCB2YWx1ZVxuICAgICAgICAgKi9cbiAgICAgICAgXG4gICAgICAgIC8vIElmIHJvbGUgPT09IGltZywgeW91IG11c3QgdXNlIGFuIGFyaWEgbGFiZWxcbiAgICAgICAgLy9jaGVjayBhdHRyaWJ1dGVzIGFyaWEtbGFiZWwgYW5kIGFyaWEtbGFiZWxsZWRieSBmb3Igb3RoZXIgdGFncyAoZS5nLiwgPGRpdj4sIDxzcGFuPiwgZXRjKVxuICAgICAgICBsZXQgcGFzc2VkID0gQXJpYVV0aWwuZ2V0QXJpYUxhYmVsKHJ1bGVDb250ZXh0KS5sZW5ndGggPiAwO1xuXG4gICAgICAgIGlmICghcGFzc2VkICYmIHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwic3ZnXCIpIHtcbiAgICAgICAgICAgIGxldCBzdmdUaXRsZSA9IHJ1bGVDb250ZXh0LnF1ZXJ5U2VsZWN0b3IoXCJ0aXRsZVwiKTtcbiAgICAgICAgICAgIHBhc3NlZCA9IHN2Z1RpdGxlICYmIENvbW1vblV0aWwuaGFzSW5uZXJDb250ZW50KHN2Z1RpdGxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAvL2NoZWNrIHRpdGxlIGF0dHJpYnV0ZVxuICAgICAgICAgICAgcGFzc2VkID0gQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJ0aXRsZVwiKTtcbiAgICAgICAgICAgIC8vIFdlIHNob3VsZCBndWlkZSBwZW9wbGUgdG8gdXNlIGFsdCBvciBsYWJlbCAtIHRoaXMgaXMganVzdCBhIHNlY29uZGFyeSBhcHByb2FjaCB0byBzaWxlbmNlIHRoZSBydWxlLlxuICAgICAgICAgICAgLy8gU28sIHdlIHNob3VsZCBrZWVwIHRoZSBQT0YgZnJvbSBhYm92ZS5cbiAgICAgICAgICAgIC8vIGlmICghcGFzc2VkKSBQT0YgPSBcIkZhaWxfM1wiO1xuICAgICAgICB9XG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KHBhc3NlZCwgW3J1bGVDb250ZXh0XSwgJ3JvbGUnLCAnJywgW10pO1xuICAgICAgICBpZiAocGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzJcIilcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgQVJJQURlZmluaXRpb25zIH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQURlZmluaXRpb25zXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9rZXlib2FyZF9oYW5kbGVyX2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX2tleWJvYXJkX2hhbmRsZXJfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJkb206Kltyb2xlXVwiLFxuICAgIGRlcGVuZGVuY2llczogW1wiYXJpYV9yb2xlX2FsbG93ZWRcIl0sXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9NaXNzaW5nS2V5Ym9hcmRIYW5kbGVyXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX25vX2tleWJvYXJkX2FjY2Vzc1wiOiBcInBvdGVudGlhbF9ub19rZXlib2FyZF9hY2Nlc3NcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJhcmlhX2tleWJvYXJkX2hhbmRsZXJfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX25vX2tleWJvYXJkX2FjY2Vzc1wiOiBcImFyaWFfa2V5Ym9hcmRfaGFuZGxlcl9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfa2V5Ym9hcmRfaGFuZGxlcl9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX25vX2tleWJvYXJkX2FjY2Vzc1wiOiBcIlZlcmlmeSB0aGUgPHswfT4gZWxlbWVudCB3aXRoIFxcXCJ7MX1cXFwiIHJvbGUgaGFzIGtleWJvYXJkIGFjY2Vzc1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkludGVyYWN0aXZlIFdBSV9BUklBIFVJIGNvbXBvbmVudHMgbXVzdCBwcm92aWRlIGtleWJvYXJkIGFjY2Vzc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcblxuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IGlzIGhpZGRlbiBvciBkaXNhYmxlZFxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpIHx8IENvbW1vblV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuICAgICAgICBsZXQgc2F2ZWRQYXNzZWQgPSBwYXNzZWQ7XG4gICAgICAgIGxldCBkb2MgPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50O1xuICAgICAgICBsZXQgZGVzaWduUGF0dGVybnMgPSBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnM7XG4gICAgICAgIC8vbGV0IHJvbGVzID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwicm9sZVwiKS50cmltKCkudG9Mb3dlckNhc2UoKS5zcGxpdCgvXFxzKy8pO1xuICAgICAgICAvL29ubHkgY29uc2lkZXIgdXNlciBzcGVjaWZpZWQgcm9sZShzKSwgcmF0aGVyIHRoYW4gbmF0aXZlIGNvbnRhaW5lcnNcbiAgICAgICAgbGV0IHJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXMocnVsZUNvbnRleHQsIGZhbHNlKTtcbiAgICAgICAgXG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIC8vaWYgYW4gZXhwbGljaXQgcm9sZSBpcyBzcGVjaWZpZWQsIHRoZSAnYXJpYV9yb2xlX3JlZHVuZGFudCcgcnVsZSBzaG91bGQgYmUgdHJpZ2dlcmVkIGFuZCBhZGRyZXNzZWQgZmlyc3QsXG4gICAgICAgIC8vIGFuZCB0aGUgY3VycmVudCBydWxlIHNob3VsZCBiZSBpZ25vcmVkXG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gJ2RhdGFsaXN0JyAmJiByb2xlcyAmJiByb2xlcy5pbmNsdWRlcyhcImxpc3Rib3hcIikpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIFxuICAgICAgICAvLyBDb21wb3NpdGUgdXNlciBpbnRlcmZhY2Ugd2lkZ2V0IHJvbGVzLiBUaGV5IGFjdCBhcyBjb250YWluZXJzIHRoYXQgbWFuYWdlIG90aGVyLCBjb250YWluZWQgd2lkZ2V0cy5cbiAgICAgICAgbGV0IHJvbGVDb250YWluZXJzID0gW1wiY29tYm9ib3hcIiwgXCJncmlkXCIsIFwibGlzdGJveFwiLCBcIm1lbnVcIiwgXCJtZW51YmFyXCIsIFwicmFkaW9ncm91cFwiLCBcInRhYmxpc3RcIiwgXCJ0cmVlXCIsIFwidHJlZWdyaWRcIl07XG4gICAgICAgIGZvciAoY29uc3Qgcm9sZSBvZiByb2xlQ29udGFpbmVycykge1xuICAgICAgICAgICAgaWYgKEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUocnVsZUNvbnRleHQsIHJvbGUsIHRydWUpICE9IG51bGwpIFxuICAgICAgICAgICAgICAgIC8vIGl0J3MgYSBkZXNjZW5kYW50IG9mIGEgY29tcG9zaXRlIHdpZGdldCBhbHJlYWR5IGV4YW1pbmVkXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGxldCBoYXNBdHRyaWJ1dGUgPSBDb21tb25VdGlsLmhhc0F0dHJpYnV0ZTtcbiAgICAgICAgXG4gICAgICAgIGxldCByb2xlTmFtZUFyciA9IG5ldyBBcnJheSgpO1xuXG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcm9sZXMubGVuZ3RoOyArK2opIHtcbiAgICAgICAgICAgIGxldCBwYXR0ZXJuID0gZGVzaWduUGF0dGVybnNbcm9sZXNbal1dO1xuICAgICAgICAgICAgaWYgKHJvbGVDb250YWluZXJzLmluZGV4T2Yocm9sZXNbal0pID49IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgZGlzYWJsZWQgPSBoYXNBdHRyaWJ1dGUocnVsZUNvbnRleHQsICdhcmlhLWRpc2FibGVkJykgPyBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWRpc2FibGVkXCIpIDogJyc7XG4gICAgICAgICAgICAgICAgaWYgKCFkaXNhYmxlZCkge1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFNlZSBpZiB0aGVyZSBpcyBhIGtleWJvYXJkIGV2ZW50IGhhbmRsZXIgb24gdGhlIHBhcmVudCBlbGVtZW50LlxuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25rZXlkb3duXCIpIHx8IHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9ua2V5cHJlc3NcIikgfHwgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25rZXl1cFwiKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gTm8ga2V5Ym9hcmQgZXZlbnQgaGFuZGxlciBmb3VuZCBvbiBwYXJlbnQuIFNlZSBpZiBrZXlib2FyZCBldmVudCBoYW5kbGVycyBhcmUgb24gcmVxdWlyZWQgY2hpbGQgZWxlbWVudHMuXG4gICAgICAgICAgICAgICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc0F0dHJpYnV0ZShydWxlQ29udGV4dCwgJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlcUNoaWxkcmVuID0gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVzW2pdXS5yZXFDaGlsZHJlbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVxQ2hpbGRyZW4pIHsgLyogU01GIFRPRE8gbWVudWJhciBkb2VzIG5vdCBoYXZlIGFueSByZXFDaGlsZHJlbiAqL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgcmVxdWlyZWRDaGlsZHJlbkxlbmd0aCA9IHJlcUNoaWxkcmVuLmxlbmd0aDsgaSA8IHJlcXVpcmVkQ2hpbGRyZW5MZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHhwID0gXCIqW2NvbnRhaW5zKEByb2xlLCdcIiArIHJlcUNoaWxkcmVuW2ldICsgXCInKV1cIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB4cGF0aFJlc3VsdCA9IGRvYy5ldmFsdWF0ZSh4cCwgcnVsZUNvbnRleHQsIENvbW1vblV0aWwuZGVmYXVsdE5TUmVzb2x2ZXIsIDAgLyogWFBhdGhSZXN1bHQuQU5ZX1RZUEUgKi8sIG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHIgPSB4cGF0aFJlc3VsdC5pdGVyYXRlTmV4dCgpIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocikge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gKHIuaGFzQXR0cmlidXRlKFwib25rZXlkb3duXCIpIHx8IHIuaGFzQXR0cmlidXRlKFwib25rZXlwcmVzc1wiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXNzZWQpIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGlsZCBkaWQgbm90IGhhdmUgYSBrZXkgaGFuZGxlci4gU2VlIGlmIGFueSBvZiB0aGUgZ3JhbmRjaGlsZHJlbiBkby5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHhwMiA9IFwiZGVzY2VuZGFudDo6KlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgeHBhdGhSZXN1bHQyID0gZG9jLmV2YWx1YXRlKHhwMiwgciwgQ29tbW9uVXRpbC5kZWZhdWx0TlNSZXNvbHZlciwgMCAvKiBYUGF0aFJlc3VsdC5BTllfVFlQRSAqLywgbnVsbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByMjogRWxlbWVudCA9IHhwYXRoUmVzdWx0Mi5pdGVyYXRlTmV4dCgpIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChyMiAmJiAhcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGb2xsb3dpbmcgYXJlIHRoZSBzdGVwcyB0aGF0IGFyZSBleGVjdXRlZCBhdCB0aGlzIHN0YWdlIHRvIGRldGVybWluZSBpZiB0aGUgbm9kZSBzaG91bGQgYmUgY2xhc3NpZmllZCBhcyBoaWRkZW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yIG5vdC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAxLiBPbmx5IHJ1biBpc05vZGVWaXNpYmxlIGNoZWNrIGlmIGhpZGRlbiBjb250ZW50IHNob3VsZCBOT1QgYmUgY2hlY2tlZC4gSW4gdGhlIGNhc2UgdGhhdCBoaWRkZW4gY29udGVudCBpcyB0byxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBiZSBzY2FubmVkIHRoZW4gd2UgY2FuIGp1c3Qgc2NhbiBldmVyeXRoaW5nIGFzIG5vcm1hbC4gSW4gdGhlIGNhc2UgdGhhdCB0aGUgY3VycmVudCBub2RlIGlzIGhpZGRlbiB3ZSBkbyBub3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBhZGQgaXQgdG8gdGhlIHJvbGVUb0VsZW1zIGhhc2ggYXQgYWxsIG9yIGV2ZW4gZG8gYW55IGNoZWNraW5nIGZvciBpdCBhdCBhbGwuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90ZTogVGhlIGlmIGNvbmRpdGlvbnMgdXNlcyBzaG9ydC1jaXJjdWl0aW5nIHNvIGlmIHRoZSBmaXJzdCBjb25kaXRpb24gaXMgbm90IHRydWUgaXQgd2lsbCBub3QgY2hlY2sgdGhlIG5leHQgb25lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgc28gb24gYW5kIHNvIGZvcnRoLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENvbW1vblV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbihyMikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByMiA9IHhwYXRoUmVzdWx0Mi5pdGVyYXRlTmV4dCgpIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IENvbW1vblV0aWwuaXNUYWJiYWJsZShyMikgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocjIuaGFzQXR0cmlidXRlKFwib25rZXlkb3duXCIpIHx8IHIyLmhhc0F0dHJpYnV0ZShcIm9ua2V5cHJlc3NcIikpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJcyB0aGlzIGFuIGFjdGlvbiBsaW5rP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocjIubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSBcImFcIiAmJiByMi5oYXNBdHRyaWJ1dGUoXCJocmVmXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaHJlZiA9IHIyLmdldEF0dHJpYnV0ZShcImhyZWZcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBY3Rpb24gbGluayBtdXN0IHN0YXJ0IHdpdGggXCJqYXZhc2NyaXB0OlwiLCBtdXN0IG5vdCBjb250YWluIGEgXCJ2b2lkXCIgYW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtdXN0IGhhdmUgYSBmdW5jdGlvbiBuYW1lIGZvbGxvd2luZyBcImphdmFzY3JpcHQ6XCIgKGkuZS4sIGhyZWYubGVuZ3RoID4gMTEpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSAoaHJlZi5zdGFydHNXaXRoKFwiamF2YXNjcmlwdDpcIikgJiYgaHJlZi5pbmRleE9mKFwidm9pZFwiKSA9PSAtMSAmJiBocmVmLmxlbmd0aCA+IDExKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcjIgPSB4cGF0aFJlc3VsdDIuaXRlcmF0ZU5leHQoKSBhcyBFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFsbCB0aGUgcmVxdWlyZWQgY2hpbGRyZW4gKG9yIGFueSBkZXNjZW5kYW50cyBvZiB0aGUgcmVxdWlyZWQgY2hpbGRyZW4pIG11c3QgaGF2ZSBrZXlwcmVzcy9rZXlkb3duXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIG5vdCwgaXQgaXMgYSBmYWlsdXJlLCBubyBuZWVkIHRvIGtlZXAgY2hlY2tpbmcgYW55IG1vcmUuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByID0geHBhdGhSZXN1bHQuaXRlcmF0ZU5leHQoKSBhcyBFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGN1cnJlbnQgZWxlbWVudCBmYWlsZWQgdGhlIGtleWRvd24va2V5cHJlc3MsIGFuZCBpdCBkb2VzIG5vdCBoYXZlIHJlcXVpcmVkIGNoaWxkcmVuLCBzdWNoIGFzIG1lbnViYXIuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExldCdzIGNoZWNrIGl0cyBkZXNjZW5kYW50cy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHhwMiA9IFwiZGVzY2VuZGFudDo6KlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgeHBhdGhSZXN1bHQyID0gZG9jLmV2YWx1YXRlKHhwMiwgcnVsZUNvbnRleHQsIENvbW1vblV0aWwuZGVmYXVsdE5TUmVzb2x2ZXIsIDAgLyogWFBhdGhSZXN1bHQuQU5ZX1RZUEUgKi8sIG51bGwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcjIgPSB4cGF0aFJlc3VsdDIuaXRlcmF0ZU5leHQoKSBhcyBFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocjIgJiYgIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9sbG93aW5nIGFyZSB0aGUgc3RlcHMgdGhhdCBhcmUgZXhlY3V0ZWQgYXQgdGhpcyBzdGFnZSB0byBkZXRlcm1pbmUgaWYgdGhlIG5vZGUgc2hvdWxkIGJlIGNsYXNzaWZpZWQgYXMgaGlkZGVuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvciBub3QuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgMS4gT25seSBydW4gaXNOb2RlVmlzaWJsZSBjaGVjayBpZiBoaWRkZW4gY29udGVudCBzaG91bGQgTk9UIGJlIGNoZWNrZWQuIEluIHRoZSBjYXNlIHRoYXQgaGlkZGVuIGNvbnRlbnQgaXMgdG8sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgYmUgc2Nhbm5lZCB0aGVuIHdlIGNhbiBqdXN0IHNjYW4gZXZlcnl0aGluZyBhcyBub3JtYWwuIEluIHRoZSBjYXNlIHRoYXQgdGhlIGN1cnJlbnQgbm9kZSBpcyBoaWRkZW4gd2UgZG8gbm90XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgYWRkIGl0IHRvIHRoZSByb2xlVG9FbGVtcyBoYXNoIGF0IGFsbCBvciBldmVuIGRvIGFueSBjaGVja2luZyBmb3IgaXQgYXQgYWxsLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGU6IFRoZSBpZiBjb25kaXRpb25zIHVzZXMgc2hvcnQtY2lyY3VpdGluZyBzbyBpZiB0aGUgZmlyc3QgY29uZGl0aW9uIGlzIG5vdCB0cnVlIGl0IHdpbGwgbm90IGNoZWNrIHRoZSBuZXh0IG9uZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgIHNvIG9uIGFuZCBzbyBmb3J0aC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDb21tb25VdGlsLnNob3VsZE5vZGVCZVNraXBwZWRIaWRkZW4ocjIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcjIgPSB4cGF0aFJlc3VsdDIuaXRlcmF0ZU5leHQoKSBhcyBFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBDb21tb25VdGlsLmlzVGFiYmFibGUocjIpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHIyLmhhc0F0dHJpYnV0ZShcIm9ua2V5ZG93blwiKSB8fCByMi5oYXNBdHRyaWJ1dGUoXCJvbmtleXByZXNzXCIpKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJcyB0aGlzIGFuIGFjdGlvbiBsaW5rP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyMi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09IFwiYVwiICYmIHIyLmhhc0F0dHJpYnV0ZShcImhyZWZcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhyZWYgPSByMi5nZXRBdHRyaWJ1dGUoXCJocmVmXCIpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFjdGlvbiBsaW5rIG11c3Qgc3RhcnQgd2l0aCBcImphdmFzY3JpcHQ6XCIsIG11c3Qgbm90IGNvbnRhaW4gYSBcInZvaWRcIiBhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbXVzdCBoYXZlIGEgZnVuY3Rpb24gbmFtZSBmb2xsb3dpbmcgXCJqYXZhc2NyaXB0OlwiIChpLmUuLCBocmVmLmxlbmd0aCA+IDExKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSAoaHJlZi5zdGFydHNXaXRoKFwiamF2YXNjcmlwdDpcIikgJiYgaHJlZi5pbmRleE9mKFwidm9pZFwiKSA9PSAtMSAmJiBocmVmLmxlbmd0aCA+IDExKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByMiA9IHhwYXRoUmVzdWx0Mi5pdGVyYXRlTmV4dCgpIGFzIEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEF0dHJpYnV0ZSAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JyBpcyBzcGVjaWZpZWQuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgcm9sZU5hbWVBcnIucHVzaChyb2xlc1tqXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXBhc3NlZCAmJiBzYXZlZFBhc3NlZCkge1xuICAgICAgICAgICAgICAgIHNhdmVkUGFzc2VkID0gcGFzc2VkO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJldFRva2VuMSA9IG5ldyBBcnJheSgpO1xuICAgICAgICByZXRUb2tlbjEucHVzaChydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgbGV0IHJldFRva2VuMiA9IG5ldyBBcnJheSgpO1xuICAgICAgICByZXRUb2tlbjIucHVzaChyb2xlTmFtZUFyci5qb2luKFwiLCBcIikpO1xuXG4gICAgICAgIC8vIERldGVybWluZSBpZiB0aGlzIGlzIHJlZmVyZW5jZWQgYnkgYSBjb21ib2JveC4gSWYgc28sIGxlYXZlIGl0IHRvIHRoZSBjb21ib2JveCBydWxlcyB0byBjaGVja1xuICAgICAgICBsZXQgaWQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJpZFwiKTtcbiAgICAgICAgaWYgKGlkICYmIGlkLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAqW2FyaWEtY29udHJvbHM9JyR7aWR9J11bcm9sZT0nY29tYm9ib3gnXWApKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHNhdmVkUGFzc2VkID8gUnVsZVBhc3MoXCJwYXNzXCIpIDogUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF9ub19rZXlib2FyZF9hY2Nlc3NcIiwgW3JldFRva2VuMS50b1N0cmluZygpLCByZXRUb2tlbjIudG9TdHJpbmcoKV0pO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFSSUFNYXBwZXIgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBTWFwcGVyXCI7XG5pbXBvcnQgeyBET01VdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01VdGlsXCI7XG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgQWNjTmFtZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BY2NOYW1lVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX2xhbmRtYXJrX25hbWVfdW5pcXVlOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfbGFuZG1hcmtfbmFtZV91bmlxdWVcIixcbiAgICBjb250ZXh0OiBcImFyaWE6Y29tcGxlbWVudGFyeSwgYXJpYTpiYW5uZXIsIGFyaWE6Y29udGVudGluZm8sIGFyaWE6bWFpbiwgYXJpYTpuYXZpZ2F0aW9uLCBhcmlhOnJlZ2lvbiwgYXJpYTpzZWFyY2gsIGFyaWE6Zm9ybVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwibGFuZG1hcmtfbmFtZV91bmlxdWVcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMFwiOiBcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImFyaWFfbGFuZG1hcmtfbmFtZV91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIjogXCJhcmlhX2xhbmRtYXJrX25hbWVfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX2xhbmRtYXJrX25hbWVfdW5pcXVlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIk11bHRpcGxlIGVsZW1lbnRzIHdpdGggXFxcInswfVxcXCIgbGFuZG1hcmtzIHdpdGhpbiB0aGUgc2FtZSBwYXJlbnQgcmVnaW9uIGFyZSBkaXN0aW5ndWlzaGVkIGJ5IHVuaXF1ZSAnYXJpYS1sYWJlbCcgb3IgJ2FyaWEtbGFiZWxsZWRieSdcIixcbiAgICAgICAgICAgIFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCI6IFwiTXVsdGlwbGUgZWxlbWVudHMgd2l0aCBcXFwiezB9XFxcIiBsYW5kbWFya3Mgd2l0aGluIHRoZSBzYW1lIHBhcmVudCByZWdpb24gYXJlIG5vdCBkaXN0aW5ndWlzaGVkIGZyb20gb25lIGFub3RoZXIgYmVjYXVzZSB0aGV5IGhhdmUgdGhlIHNhbWUgXFxcInsxfVxcXCIgbGFiZWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFYWNoIGxhbmRtYXJrIHNob3VsZCBoYXZlIGEgdW5pcXVlICdhcmlhLWxhYmVsbGVkYnknIG9yICdhcmlhLWxhYmVsJyBvciBiZSBuZXN0ZWQgaW4gYSBkaWZmZXJlbnQgcGFyZW50IHJlZ2lvblwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaWRcIjogW1wiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgLy8gVE9ETyBkbyBJIG5lZWQgdG8gZml0ZXIgb3V0IGJhZCBjb250ZW50aW5mbyBub2RlczogVGhlIGZvb3RlciBlbGVtZW50IGlzIG5vdCBhIGNvbnRlbnRpbmZvIGxhbmRtYXJrIHdoZW4gaXQgaXMgYSBkZXNjZW5kYW50IG9mIHRoZSBmb2xsb3dpbmcgSFRNTDUgc2VjdGlvbmluZyBlbGVtZW50czogaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTcvTk9URS13YWktYXJpYS1wcmFjdGljZXMtMS4xLTIwMTcxMjE0L2V4YW1wbGVzL2xhbmRtYXJrcy9IVE1MNS5odG1sXG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgLy8gQ2hlY2tpbmcgaWYgdGhpcyBsYW5kbWFyayBpcyBpbnNpZGUgYSBkaWFsb2cgZWxlbWVudC4gSWYgaXQgaXMgd2UgYXJlIGdvaW5nIHRvIHNraXAgY2hlY2tpbmcgaXQuIFxuICAgICAgICAvKip2YXIgY29weU9mUnVsZUNvbnRleHQgPSBydWxlQ29udGV4dDtcbiAgICAgICAgdmFyIHBhcm5ldE5vZGVzT2ZSdWxlQ29udGV4dCA9IFtdO1xuICAgICAgICB3aGlsZSAoY29weU9mUnVsZUNvbnRleHQpIHtcbiAgICAgICAgICAgIHBhcm5ldE5vZGVzT2ZSdWxlQ29udGV4dC51bnNoaWZ0KGNvcHlPZlJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgIGNvcHlPZlJ1bGVDb250ZXh0ID0gY29weU9mUnVsZUNvbnRleHQucGFyZW50RWxlbWVudDtcbiAgICAgICAgfVxuICAgICAgICBwYXJuZXROb2Rlc09mUnVsZUNvbnRleHQuZm9yRWFjaChlbGVtID0+IHtcbiAgICAgICAgICAgIGlmIChlbGVtICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW0udGFnTmFtZSA9PSBcIkRJQUxPR1wiIHx8IGVsZW0uZ2V0QXR0cmlidXRlKCdyb2xlJykgPT0gXCJkaWFsb2dcIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbCAvLyBTa2lwcGluZyBjaGVja2luZyBsYW5kbWFya3MgdGhhdCBoYXBwZW4gdG8gYmUgaW5zaWRlIGRpYWxvZyBlbGVtZW50c1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgKi9cbiAgICAgICAgaWYgKENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFtcIkRJQUxPR1wiXSkgIT09IG51bGwgfHwgQXJpYVV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShydWxlQ29udGV4dCwgXCJkaWFsb2dcIiwgdHJ1ZSkgIT09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICAvLyBCZWdpbmluZyBmb3JtQ2FjaGUgd29ya1xuICAgICAgICBsZXQgb3duZXJEb2N1bWVudCA9IEZyYWdtZW50VXRpbC5nZXRPd25lckZyYWdtZW50KHJ1bGVDb250ZXh0KTtcbiAgICAgICAgbGV0IGZvcm1DYWNoZSA6IHtcbiAgICAgICAgICAgIG5hdmlnYXRpb25Ob2RlczogYW55W10sXG4gICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNDb21wdXRlZExhYmVsczogc3RyaW5nW10sXG4gICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNQYXJlbnRzOiBhbnlbXSxcbiAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc01hdGNoRm91bmQ6IHN0cmluZ1tdXG4gICAgICAgIH0gPSBDYWNoZVV0aWwuZ2V0Q2FjaGUoXG4gICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgXCJhcmlhX2xhbmRtYXJrX25hbWVfdW5pcXVlXCIsXG4gICAgICAgICAgICBudWxsXG4gICAgICAgICk7XG4gICAgICAgIGlmICghZm9ybUNhY2hlKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIi0tLS0tLS0tLUVOVEVSSU5HIEZPUk0gQ0FDSEVcIilcbiAgICAgICAgICAgIGZvcm1DYWNoZSA9IHtcbiAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXM6IFtdLFxuICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc0NvbXB1dGVkTGFiZWxzOiBbXSxcbiAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNQYXJlbnRzOiBbXSxcbiAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNNYXRjaEZvdW5kOiBbXVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGxldCBuYXZpZ2F0aW9uTm9kZXNUZW1wID0gb3duZXJEb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKFxuICAgICAgICAgICAgICAgICdhc2lkZSxbcm9sZT1cImNvbXBsZW1lbnRhcnlcIl0sIGZvb3Rlcixbcm9sZT1cImNvbnRlbnRpbmZvXCJdLCBoZWFkZXIsW3JvbGU9XCJiYW5uZXJcIl0sIG1haW4sW3JvbGU9XCJtYWluXCJdLCBuYXYsW3JvbGU9XCJuYXZpZ2F0aW9uXCJdLCBmb3JtLFtyb2xlPVwiZm9ybVwiXSwgc2VjdGlvbixbcm9sZT1cInJlZ2lvblwiXSxbcm9sZT1cInNlYXJjaFwiXSdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBsZXQgbmF2aWdhdGlvbk5vZGVzID0gQXJyYXkuZnJvbShuYXZpZ2F0aW9uTm9kZXNUZW1wKTtcbiAgICAgICAgICAgIGxldCBuYXZpZ2F0aW9uTm9kZXNQYXJlbnRzID0gW107XG4gICAgICAgICAgICBsZXQgbmF2aWdhdGlvbk5vZGVzTWF0Y2hGb3VuZCA6IHN0cmluZ1tdID0gW107XG5cbiAgICAgICAgICAgIC8vIFRoaXMgYmxvY2sgb2YgY29kZSBmaWx0ZXJzIG91dCBhbnkgbmF2IGVsZW1lbnRzIHRoYXQgYXJlIHVuZGVyIGEgZGlhbG9nLiBBcyB0aG9zZSBhcmUgbm90IG9uZXMgd2Ugd2FudCB0byB0ZXN0IGFnYWluc3QgYXMgd2UgY29uc2lkZXIgZGlhbG9ncyBhcmUgc2VwYXJhdGUgbG9jYXRpb25zIGZyb20gdGhlIHJlc3Qgb2YgdGhlIG1haW4gcGFnZS5cbiAgICAgICAgICAgIGxldCBuYXZpZ2F0aW9uTm9kZXNXaXRob3V0RGlhbG9ncyA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYXZpZ2F0aW9uTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAvKipsZXQgYSA9IG5hdmlnYXRpb25Ob2Rlc1tpXTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBsZXQgZGlhbG9nTm9kZUZvdW5kRmxhZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHdoaWxlIChhKSB7XG4gICAgICAgICAgICAgICAgICAgIGEgPSBhLnBhcmVudEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYS50YWdOYW1lID09IFwiRElBTE9HXCIgfHwgYS5nZXRBdHRyaWJ1dGUoJ3JvbGUnKSA9PSBcImRpYWxvZ1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlhbG9nTm9kZUZvdW5kRmxhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFkaWFsb2dOb2RlRm91bmRGbGFnKSB7XG4gICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc1dpdGhvdXREaWFsb2dzLnB1c2gobmF2aWdhdGlvbk5vZGVzW2ldKVxuICAgICAgICAgICAgICAgIH0qL1xuXG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIG5vZGUgdGhhdCBpcyBBVCBoaWRkZW4gb3IgaW4gYSBkaWFsb2dcbiAgICAgICAgICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQobmF2aWdhdGlvbk5vZGVzW2ldKSB8fCBDb21tb25VdGlsLmdldEFuY2VzdG9yKG5hdmlnYXRpb25Ob2Rlc1tpXSwgW1wiRElBTE9HXCJdKSAhPT0gbnVsbCB8fCBBcmlhVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKG5hdmlnYXRpb25Ob2Rlc1tpXSwgXCJkaWFsb2dcIiwgdHJ1ZSkgIT09IG51bGwpIFxuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNXaXRob3V0RGlhbG9ncy5wdXNoKG5hdmlnYXRpb25Ob2Rlc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzID0gbmF2aWdhdGlvbk5vZGVzV2l0aG91dERpYWxvZ3M7XG5cblxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYXZpZ2F0aW9uTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAvLyBMb29wIG92ZXIgYWxsIHRoZSBsYW5kbWFyayBub2Rlc1xuICAgICAgICAgICAgICAgIGxldCBlbHMgPSBbXTtcbiAgICAgICAgICAgICAgICBsZXQgYSA9IG5hdmlnYXRpb25Ob2Rlc1tpXS5wYXJlbnRFbGVtZW50O1xuICAgICAgICAgICAgICAgIHdoaWxlIChhKSB7XG4gICAgICAgICAgICAgICAgICAgIGVscy5wdXNoKGEpO1xuICAgICAgICAgICAgICAgICAgICBhID0gYS5wYXJlbnRFbGVtZW50O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgZWxzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIExvb3Agb3ZlciBhbGwgdGhlIHBhcmVudHMgb2YgdGhlIGxhbmRtYXJrIG5vZGVzXG4gICAgICAgICAgICAgICAgICAgIC8vIEZpbmQgbmVhcmVzdCBsYW5kbWFyayBwYXJlbnQgYmFzZWQgb24gdGhlIHRhZ05hbWUgb3IgdGhlIHJvbGUgYXR0cmlidXRlXG4gICAgICAgICAgICAgICAgICAgIGxldCB0YWdOYW1lVHJpZ2dlciA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiQVNJREVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiRk9PVEVSXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIkZPUk1cIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiSEVBREVSXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIk1BSU5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiTkFWXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlNFQ1RJT05cIixcbiAgICAgICAgICAgICAgICAgICAgXS5pbmNsdWRlcyhlbHNbal0udGFnTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCByb2xlTmFtZVRyaWdnZXIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsc1tqXS5oYXNBdHRyaWJ1dGUoXCJyb2xlXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByb2xlTmFtZVRyaWdnZXIgPSBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJjb21wbGVtZW50YXJ5XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJjb250ZW50aW5mb1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZm9ybVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYmFubmVyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJtYWluXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYXZpZ2F0aW9uXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJyZWdpb25cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInNlYXJjaFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXS5pbmNsdWRlcyhlbHNbal0uZ2V0QXR0cmlidXRlKFwicm9sZVwiKSk7IC8vIFRPRE8gd2UgYXJlIG5vdCBjb3ZlcmluZyB0aGUgY2FzZSB3aGVyZSBhIGVsZW1lbmVudCB3aXRoIG11bHRpcGxlIHJvbGVzLiBlLmcuLCByb2xlID0gXCJmb3JtIGJhbm5lclwiLiBUaGlzIGlzIGEgaW1wcm92bWVudCB3ZSBtaWdodCB3YW50IHRvIGFkZCBpbiB0aGUgZnV0dXJlLlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWdOYW1lVHJpZ2dlciB8fCByb2xlTmFtZVRyaWdnZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5lYXJlc3QgcGFyZW50LWxhbmRtYXJrIGZvdW5kXG4gICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNQYXJlbnRzLnB1c2goZWxzW2pdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChqID09PSBlbHMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBub2RlIGlzIGF0IHRoZSBoZWFkIG9mIHRoZSBmaWxlIHNvIGl0IGRvZXMgbm90IGhhdmUgYSBwYXJlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc1BhcmVudHMucHVzaChudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgbmF2aWdhdGlvbk5vZGVzQ29tcHV0ZWRMYWJlbHMgPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmF2aWdhdGlvbk5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZShuYXZpZ2F0aW9uTm9kZXNbaV0pO1xuICAgICAgICAgICAgICAgIC8vIExvb3Agb3ZlciBhbGwgdGhlIGxhbmRtYXJrIG5vZGVzXG4gICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzQ29tcHV0ZWRMYWJlbHMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgLyoqQVJJQU1hcHBlci5jb21wdXRlTmFtZShuYXZpZ2F0aW9uTm9kZXNbaV0pKi9cbiAgICAgICAgICAgICAgICAgICAgcGFpciAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwID8gcGFpci5uYW1lLnRyaW0oKSA6IFwiXCJcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYXZpZ2F0aW9uTm9kZXNQYXJlbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgLy8gTG9vcCBvdmVyIGFsbCB0aGUgcGFyZW50cyBvZiB0aGUgbGFuZG1hcmsgbm9kZXMgdG8gZmluZCBkdXBsaWNhdGVzXG4gICAgICAgICAgICAgICAgbGV0IG1hdGNoRm91bmQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBsZXQgcGFzc18wX2ZsYWcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG5hdmlnYXRpb25Ob2Rlc1BhcmVudHMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGogPT09IGkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGRvIG5vdCB3YW50IHRvIGNvbXBhcmUgYWdhaW5zdCBvdXJzZWxmc1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlmIHN0YXRlbWVudCBmb2N1cyBvbiB0aGUgY2FzZSB3aGVyZSB0aGUgcGFyZW50IGxhbmRtYXJrIGlzIG51bGxcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzUGFyZW50c1tpXSA9PT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzUGFyZW50c1tqXSA9PT0gbnVsbFxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBsb29raW5nIGF0IHR3byByb290IG5vZGVzLCBzbyB3ZSBzaG91bGQgY29tcGFyZSB0aGVtLlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSSUFNYXBwZXIubm9kZVRvUm9sZShuYXZpZ2F0aW9uTm9kZXNbaV0pID09PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSSUFNYXBwZXIubm9kZVRvUm9sZShuYXZpZ2F0aW9uTm9kZXNbal0pXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCb3RoIG5vZGVzIGhhdmUgdGhlIHNhbWUgcm9sZSBBTkRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc0NvbXB1dGVkTGFiZWxzW2ldID09PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNDb21wdXRlZExhYmVsc1tqXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBib3RoIGhhdmUgdGhlIHNhbWUgKGNvbXB1dGVkKSBhcmlhLWxhYmVsL2FyaWEtbGFiZWxsZWRieVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiAobmF2aWdhdGlvbk5vZGVzQ29tcHV0ZWRMYWJlbHNbaV0gPT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzTWF0Y2hGb3VuZC5wdXNoKFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCIpOyAvLyBGYWlsIDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hGb3VuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSBwYXJlbnRzICYmIHNhbWUgbm9kZSByb2xlcyBCVVQgZGlmZmVyZW50IGNvbXB1dGVkIGFyaWEtbGFiZWwvYXJpYS1sYWJlbGxlZGJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgYXQgbGVhc3QgYSBQYXNzXzAuIEJ1dCB3ZSBuZWVkIHRvIGNoZWNrIGFsbCBub2RlcyB0byBzZWUgaWYgYW5vdGhlciBvbmUgZmFpbHMuIFNvIHNldCBhIGZsYWcuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NfMF9mbGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhbWUgcGFyZW50cyBidXQgZGlmZmVyZW50IG5vZGUgcm9sZXMgLy8gTm90IGFwcGxpY2FibGVcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc1BhcmVudHNbaV0gPT09IG51bGwgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc1BhcmVudHNbal0gPT09IG51bGxcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBhcmUgbG9va2luZyBhdCBhIHNpbmdsZSByb290IG5vZGVcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpZiBzdGF0ZW1lbnQgZm9jdXMgb24gdGhlIGNhc2Ugd2hlcmUgdGhlIHBhcmVudCBsYW5kbWFyayBpcyBOT1QgbnVsbFxuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBET01VdGlsLnNhbWVOb2RlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc1BhcmVudHNbaV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzUGFyZW50c1tqXVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgdGhlIHNhbWUgcGFyZW50LWxhbmRtYXJrIEFORFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSSUFNYXBwZXIubm9kZVRvUm9sZShuYXZpZ2F0aW9uTm9kZXNbaV0pID09PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFSSUFNYXBwZXIubm9kZVRvUm9sZShuYXZpZ2F0aW9uTm9kZXNbal0pXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCb3RoIG5vZGVzIGhhdmUgdGhlIHNhbWUgcm9sZSBBTkRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc0NvbXB1dGVkTGFiZWxzW2ldID09PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uTm9kZXNDb21wdXRlZExhYmVsc1tqXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBib3RoIGhhdmUgdGhlIHNhbWUgKGNvbXB1dGVkKSBhcmlhLWxhYmVsL2FyaWEtbGFiZWxsZWRieVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiAobmF2aWdhdGlvbk5vZGVzQ29tcHV0ZWRMYWJlbHNbaV0gPT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzTWF0Y2hGb3VuZC5wdXNoKFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCIpOyAvLyBGYWlsIDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hGb3VuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSBwYXJlbnRzICYmIHNhbWUgbm9kZSByb2xlcyBCVVQgZGlmZmVyZW50IGNvbXB1dGVkIGFyaWEtbGFiZWwvYXJpYS1sYWJlbGxlZGJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgYXQgbGVhc3QgYSBQYXNzXzAuIEJ1dCB3ZSBuZWVkIHRvIGNoZWNrIGFsbCBub2RlcyB0byBzZWUgaWYgYW5vdGhlciBvbmUgZmFpbHMuIFNvIHNldCBhIGZsYWcuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NfMF9mbGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNhbWUgcGFyZW50cyBidXQgZGlmZmVyZW50IG5vZGUgcm9sZXMgLy8gTm90IGFwcGxpY2FibGVcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIERpZmZlcmVudCBwYXJlbnRzIC8vIE5vdCBhcHBsaWNhYmxlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFtYXRjaEZvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXNzXzBfZmxhZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzTWF0Y2hGb3VuZC5wdXNoKFwicGFzc1wiKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hdmlnYXRpb25Ob2Rlc01hdGNoRm91bmQucHVzaChcIm51bGxcIik7IC8vIFRoaXMgaXMgbm90IHRoZSBrZXl3b3JkIG51bGwgb24gcHVycG9zZS4gSXQgaXMgYSBzcGFjZWhvbGRlciBpbiB0aGUgYXJyYXkgc28gaW5kZXhlcyBtYXRjaCB1cC5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvcm1DYWNoZS5uYXZpZ2F0aW9uTm9kZXNDb21wdXRlZExhYmVscyA9XG4gICAgICAgICAgICAgICAgbmF2aWdhdGlvbk5vZGVzQ29tcHV0ZWRMYWJlbHM7XG4gICAgICAgICAgICBmb3JtQ2FjaGUubmF2aWdhdGlvbk5vZGVzID0gbmF2aWdhdGlvbk5vZGVzO1xuICAgICAgICAgICAgZm9ybUNhY2hlLm5hdmlnYXRpb25Ob2Rlc1BhcmVudHMgPSBuYXZpZ2F0aW9uTm9kZXNQYXJlbnRzO1xuICAgICAgICAgICAgZm9ybUNhY2hlLm5hdmlnYXRpb25Ob2Rlc01hdGNoRm91bmQgPSBuYXZpZ2F0aW9uTm9kZXNNYXRjaEZvdW5kO1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKFxuICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICAgICAgXCJhcmlhX2xhbmRtYXJrX25hbWVfdW5pcXVlXCIsXG4gICAgICAgICAgICAgICAgZm9ybUNhY2hlXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyBUT0RPIEFkZCB2YWxpZGF0aW9uIHRoYXQgYWxsIDMgYXJyYXlzIGFyZSB0aGUgc2FtZSBsZW5ndGhcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiLS0tLS0tLS0tLS0tLUVuZCBmb3JtQ2FjaGVcIilcbiAgICAgICAgfSAvLyBFbmQgZm9ybUNhY2hlXG5cbiAgICAgICAgbGV0IGluZGV4VG9DaGVjayA9IC0xO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZvcm1DYWNoZS5uYXZpZ2F0aW9uTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5pc1NhbWVOb2RlKGZvcm1DYWNoZS5uYXZpZ2F0aW9uTm9kZXNbaV0pKSB7XG4gICAgICAgICAgICAgICAgaW5kZXhUb0NoZWNrID0gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5kZXhUb0NoZWNrID09PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZvcm1DYWNoZS5uYXZpZ2F0aW9uTm9kZXNNYXRjaEZvdW5kW2luZGV4VG9DaGVja10gPT09IFwicGFzc1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIsXG4gICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICBBUklBTWFwcGVyLm5vZGVUb1JvbGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ2FjaGUubmF2aWdhdGlvbk5vZGVzW2luZGV4VG9DaGVja11cbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKGZvcm1DYWNoZS5uYXZpZ2F0aW9uTm9kZXNNYXRjaEZvdW5kW2luZGV4VG9DaGVja10gPT09IFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwiLFxuICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgQVJJQU1hcHBlci5ub2RlVG9Sb2xlKFxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNhY2hlLm5hdmlnYXRpb25Ob2Rlc1tpbmRleFRvQ2hlY2tdXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIGZvcm1DYWNoZS5uYXZpZ2F0aW9uTm9kZXNDb21wdXRlZExhYmVsc1tpbmRleFRvQ2hlY2tdLFxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9tYWluX2xhYmVsX3VuaXF1ZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX21haW5fbGFiZWxfdW5pcXVlXCIsXG4gICAgY29udGV4dDogXCJhcmlhOm1haW5cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX011bHRpcGxlTWFpbnNSZXF1aXJlTGFiZWxfSW1wbGljaXRfMlwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfbWFpbl9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX21haW5fbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX21haW5fbGFiZWxfdW5pcXVlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiTXVsdGlwbGUgZWxlbWVudHMgd2l0aCBcXFwibWFpblxcXCIgcm9sZSBkbyBub3QgaGF2ZSB1bmlxdWUgbGFiZWxzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWFjaCBlbGVtZW50IHdpdGggXFxcIm1haW5cXFwiIHJvbGUgbXVzdCBoYXZlIHVuaXF1ZSBsYWJlbCB0aGF0IGRlc2NyaWJlcyBpdHMgcHVycG9zZXNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgbGV0IGNvbnRleHRMYWJlbCA9IEFyaWFVdGlsLmdldEFyaWFMYWJlbChydWxlQ29udGV4dCk7XG5cbiAgICAgICAgbGV0IHBhcmVudERvY1JvbGUgPSBBcmlhVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKFxuICAgICAgICAgICAgcnVsZUNvbnRleHQsXG4gICAgICAgICAgICBcImRvY3VtZW50XCIsXG4gICAgICAgICAgICB0cnVlXG4gICAgICAgICk7XG4gICAgICAgIGxldCBtYWlucyA9IENvbW1vblV0aWwuZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW4oXG4gICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgXCJtYWluXCIsXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgdHJ1ZVxuICAgICAgICApO1xuICAgICAgICBsZXQgcmVzdWx0ID0gbnVsbDtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYWlucy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgaWYgKG1haW5zW2ldID09PSBydWxlQ29udGV4dCkgY29udGludWU7XG4gICAgICAgICAgICByZXN1bHQgPSBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgICAgIGxldCB0aGlzUGFyZW50RG9jUm9sZSA9IEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUoXG4gICAgICAgICAgICAgICAgbWFpbnNbaV0sXG4gICAgICAgICAgICAgICAgXCJkb2N1bWVudFwiLFxuICAgICAgICAgICAgICAgIHRydWVcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAodGhpc1BhcmVudERvY1JvbGUgPT09IHBhcmVudERvY1JvbGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoQXJpYVV0aWwuZ2V0QXJpYUxhYmVsKG1haW5zW2ldKSA9PT0gY29udGV4dExhYmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfbWFpbl9sYWJlbF92aXNpYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfbWFpbl9sYWJlbF92aXNpYmxlXCIsXG4gICAgY29udGV4dDogXCJkb206Ym9keVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfTXVsdGlwbGVNYWluc1Zpc2libGVMYWJlbF9JbXBsaWNpdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfbWFpbl9sYWJlbF92aXNpYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV9tYWluX2xhYmVsX3Zpc2libGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfbWFpbl9sYWJlbF92aXNpYmxlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiTXVsdGlwbGUgZWxlbWVudHMgd2l0aCBcXFwibWFpblxcXCIgcm9sZSBkbyBub3QgaGF2ZSB1bmlxdWUgdmlzaWJsZSBsYWJlbHNcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFYWNoIGVsZW1lbnQgd2l0aCBcXFwibWFpblxcXCIgcm9sZSBzaG91bGQgaGF2ZSBhIHVuaXF1ZSB2aXNpYmxlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gQ29uc2lkZXIgdGhlIENoZWNrIEhpZGRlbiBDb250ZW50IHNldHRpbmcgdGhhdCBpcyBzZXQgYnkgdGhlIHJ1bGVzXG4gICAgICAgIC8vY2FsbCBnZXRFbGVtZW50c0J5Um9sZUhpZGRlbiB3aXRoIGNvbnNpZGVySW1wbGljaXQgZmxhZyBhcyB0cnVlXG4gICAgICAgIC8vc28gdGhhdCB0aGUgbWV0aG9kIHJldHVycyA8bWFpbj4gZWxlbWVudHNcbiAgICAgICAgbGV0IGxhbmRtYXJrcyA9IENvbW1vblV0aWwuZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW4oXG4gICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgXCJtYWluXCIsXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgdHJ1ZVxuICAgICAgICApO1xuICAgICAgICBpZiAobGFuZG1hcmtzLmxlbmd0aCA9PT0gMCB8fCBsYW5kbWFya3MubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwYXNzZWQgPSBBcmlhVXRpbC5oYXNVbmlxdWVBcmlhTGFiZWxsZWRieShsYW5kbWFya3MpO1xuXG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9uYXZpZ2F0aW9uX2xhYmVsX3VuaXF1ZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX25hdmlnYXRpb25fbGFiZWxfdW5pcXVlXCIsXG4gICAgY29udGV4dDogXCJhcmlhOm5hdmlnYXRpb25cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX011bHRpcGxlTmF2aWdhdGlvbkxhbmRtYXJrc19JbXBsaWNpdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiYXJpYV9uYXZpZ2F0aW9uX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwiOiBcImFyaWFfbmF2aWdhdGlvbl9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfbmF2aWdhdGlvbl9sYWJlbF91bmlxdWUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiVGhlIGVsZW1lbnQgd2l0aCBcXFwibmF2aWdhdGlvblxcXCIgcm9sZSBoYXMgYSB1bmlxdWUgbGFiZWwgdGhhdCBkZXNjcmliZXMgaXRzIHB1cnBvc2VcIixcbiAgICAgICAgICAgIFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCI6IFwiTXVsdGlwbGUgZWxlbWVudHMgd2l0aCBcXFwibmF2aWdhdGlvblxcXCIgcm9sZSBkbyBub3QgaGF2ZSB1bmlxdWUgbGFiZWxzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWFjaCBlbGVtZW50IHdpdGggXFxcIm5hdmlnYXRpb25cXFwiIHJvbGUgbXVzdCBoYXZlIGEgdW5pcXVlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IGR1cHBlZCA9IEFyaWFVdGlsLmlzTGFuZG1hcmtOYW1lVW5pcXVlKHJ1bGVDb250ZXh0LCBcIm5hdmlnYXRpb25cIiwgdHJ1ZSk7ICAgIFxuICAgICAgICBpZiAoZHVwcGVkID09IG51bGwpIHJldHVybiBudWxsOyBcbiAgICAgICAgaWYgKGR1cHBlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgfSAgICBcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBUklBRGVmaW5pdGlvbnMgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBRGVmaW5pdGlvbnNcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYXJpYV9wYXJlbnRfcmVxdWlyZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9wYXJlbnRfcmVxdWlyZWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqW3JvbGVdXCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJhcmlhX3JvbGVfYWxsb3dlZFwiXSxcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX1JlcXVpcmVkUGFyZW50X05hdGl2ZV9Ib3N0X1NlbWF0aWNzXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9wYXJlbnRfcmVxdWlyZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX3BhcmVudF9yZXF1aXJlZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfcGFyZW50X3JlcXVpcmVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFYWNoIGVsZW1lbnQgd2l0aCBhbiBpbXBsaWNpdCBvciBleHBsaWNpdCByb2xlIG11c3QgYmUgY29udGFpbmVkIHdpdGhpbiBhIHZhbGlkIGVsZW1lbnRcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRWxlbWVudCB3aXRoIFxcXCJ7MH1cXFwiIHJvbGUgaXMgbm90IGNvbnRhaW5lZCBpbiBvciBvd25lZCBieSBhbiBlbGVtZW50IHdpdGggb25lIG9mIHRoZSBmb2xsb3dpbmcgcm9sZXM6IFxcXCJ7MX1cXFwiXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgLy8gVE9ETzogQUNUOiBDaGVjayBGYWlsIDNcbiAgICBhY3Q6IFwiZmY4OWM5XCIsXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIFxuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IGlzIGhpZGRlbiBvciBkaXNhYmxlZFxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpIHx8IENvbW1vblV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBcbiAgICAgICAgLy9za2lwIHRoZSBjaGVjayBpZiB0aGUgZWxlbWVudCBzaG91bGQgYmUgYSBwcmVzZW50YXRpb25hbCBjaGlsZCBvZiBhbiBlbGVtZW50XG4gICAgICAgIGlmIChBcmlhVXRpbC5zaG91bGRCZVByZXNlbnRhdGlvbmFsQ2hpbGQocnVsZUNvbnRleHQpIHx8IFZpc1V0aWwuaXNOb2RlUHJlc2VudGF0aW9uYWwocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGxldCBkZXNpZ25QYXR0ZXJucyA9IEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJucztcbiAgICAgICAgbGV0IHJvbGVOYW1lQXJyID0gbmV3IEFycmF5KCk7XG4gICAgICAgIGxldCBjb250YWluZXJSb2xlcyA9IG5ldyBBcnJheSgpO1xuICAgICAgICBsZXQgdGVzdGVkQ29udGFpbmVyID0gMDtcblxuICAgICAgICBsZXQgYW5jZXN0b3JSb2xlcyA9IGNvbnRleHRIaWVyYXJjaGllc1tcImFyaWFcIl0ubWFwKGluZm8gPT4gaW5mby5yb2xlKTtcbiAgICAgICAgbGV0IHBhcmVudFJvbGUgPSBhbmNlc3RvclJvbGVzW2FuY2VzdG9yUm9sZXMubGVuZ3RoIC0gMl07XG4gICAgICAgIGxldCBjb3VudCA9IDI7XG4gICAgICAgIHdoaWxlIChwYXJlbnRSb2xlID09PSAnbm9uZScpIHtcbiAgICAgICAgICAgIGNvdW50Kys7XG4gICAgICAgICAgICBwYXJlbnRSb2xlID0gYW5jZXN0b3JSb2xlc1thbmNlc3RvclJvbGVzLmxlbmd0aCAtIGNvdW50XTtcblxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvKipmb3IgKGxldCBqID0gMCwgbGVuZ3RoID0gcm9sZXMubGVuZ3RoOyBqIDwgbGVuZ3RoOyArK2opIHtcbiAgICAgICAgICAgIGlmIChkZXNpZ25QYXR0ZXJuc1tyb2xlc1tqXV0gJiYgZGVzaWduUGF0dGVybnNbcm9sZXNbal1dLmNvbnRhaW5lciAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGVzdGVkQ29udGFpbmVyKys7XG4gICAgICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgY29udGFpbmVyUm9sZXMgPSBkZXNpZ25QYXR0ZXJuc1tyb2xlc1tqXV0uY29udGFpbmVyO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBjb250YWluZXJzTGVuZ3RoID0gY29udGFpbmVyUm9sZXMubGVuZ3RoOyAhcGFzc2VkICYmIGkgPCBjb250YWluZXJzTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gcGFyZW50Um9sZSA9PT0gY29udGFpbmVyUm9sZXNbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXNzZWQpIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocGFzc2VkID09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJvbGVOYW1lQXJyLnB1c2gocm9sZXNbal0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBcbiAgICAgICAgKi9cbiAgICAgICAgY29uc3Qgcm9sZSA9IEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZShydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChkZXNpZ25QYXR0ZXJuc1tyb2xlXSAmJiBkZXNpZ25QYXR0ZXJuc1tyb2xlXS5jb250YWluZXIgIT0gbnVsbCkge1xuICAgICAgICAgICAgdGVzdGVkQ29udGFpbmVyKys7XG4gICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGNvbnRhaW5lclJvbGVzID0gZGVzaWduUGF0dGVybnNbcm9sZV0uY29udGFpbmVyO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDAsIGNvbnRhaW5lcnNMZW5ndGggPSBjb250YWluZXJSb2xlcy5sZW5ndGg7ICFwYXNzZWQgJiYgaSA8IGNvbnRhaW5lcnNMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9IHBhcmVudFJvbGUgPT09IGNvbnRhaW5lclJvbGVzW2ldO1xuICAgICAgICAgICAgICAgIGlmIChwYXNzZWQpIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHBhc3NlZCA9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgIHJvbGVOYW1lQXJyLnB1c2gocm9sZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmV0VG9rZW4xID0gbmV3IEFycmF5KCk7XG4gICAgICAgIHJldFRva2VuMS5wdXNoKHJvbGVOYW1lQXJyLmpvaW4oXCIsIFwiKSk7XG4gICAgICAgIGxldCByZXRUb2tlbjIgPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgcmV0VG9rZW4yLnB1c2goY29udGFpbmVyUm9sZXMuam9pbihcIiwgXCIpKTtcbiAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQocGFzc2VkLCBbcnVsZUNvbnRleHRdLCAnJywgJycsIHBhc3NlZCA9PSB0cnVlID8gW10gOiBbcmV0VG9rZW4xLCByZXRUb2tlbjJdKTtcbiAgICAgICAgaWYgKHRlc3RlZENvbnRhaW5lciA9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSBlbHNlIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW3JldFRva2VuMS50b1N0cmluZygpLCByZXRUb2tlbjIudG9TdHJpbmcoKV0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfcmVnaW9uX2xhYmVsX3VuaXF1ZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX3JlZ2lvbl9sYWJlbF91bmlxdWVcIixcbiAgICBjb250ZXh0OiBcImFyaWE6cmVnaW9uXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9NdWx0aXBsZVJlZ2lvbnNVbmlxdWVMYWJlbF9JbXBsaWNpdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiYXJpYV9yZWdpb25fbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCI6IFwiYXJpYV9yZWdpb25fbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX3JlZ2lvbl9sYWJlbF91bmlxdWUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiVGhlIGVsZW1lbnQgd2l0aCBcXFwicmVnaW9uXFxcIiByb2xlIGhhcyBhIHVuaXF1ZSBsYWJlbCB0aGF0IGRlc2NyaWJlcyBpdHMgcHVycG9zZVwiLFxuICAgICAgICAgICAgXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIjogXCJNdWx0aXBsZSBlbGVtZW50cyB3aXRoIFxcXCJyZWdpb25cXFwiIHJvbGUgZG8gbm90IGhhdmUgdW5pcXVlIGxhYmVsc1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVhY2ggZWxlbWVudCB3aXRoIFxcXCJyZWdpb25cXFwiIHJvbGUgbXVzdCBoYXZlIGEgdW5pcXVlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgY29uc3QgZHVwcGVkID0gQXJpYVV0aWwuaXNMYW5kbWFya05hbWVVbmlxdWUocnVsZUNvbnRleHQsIFwicmVnaW9uXCIpOyAgICBcbiAgICAgICAgaWYgKGR1cHBlZCA9PSBudWxsKSByZXR1cm4gbnVsbDsgXG4gICAgICAgIGlmIChkdXBwZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfbGFiZWxfbm90X3VuaXF1ZVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfcmVnaW9uX2xhYmVsbGVkOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfcmVnaW9uX2xhYmVsbGVkXCIsXG4gICAgY29udGV4dDogXCJhcmlhOnJlZ2lvblwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfUmVnaW9uTGFiZWxfSW1wbGljaXRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJcbiAgICAgICAgICAgIC8vIFwiRmFpbF8yXCI6IFwiRmFpbF8yXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9yZWdpb25fbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX3JlZ2lvbl9sYWJlbGxlZC5odG1sXCIsXG4gICAgICAgICAgICAvLyBcIkZhaWxfMlwiOiBcImFyaWFfcmVnaW9uX2xhYmVsbGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX3JlZ2lvbl9sYWJlbGxlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkVsZW1lbnQgd2l0aCBcXFwicmVnaW9uXFxcIiByb2xlIGRvZXMgbm90IGhhdmUgYSBsYWJlbFwiLFxuICAgICAgICAgICAgLy8gXCJGYWlsXzJcIjogXCJFbGVtZW50IHdpdGggXFxcInJlZ2lvblxcXCIgcm9sZSBpcyBub3QgbGFiZWxlZCB3aXRoICdhcmlhLWxhYmVsJyBvciAnYXJpYS1sYWJlbGxlZGJ5J1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVhY2ggZWxlbWVudCB3aXRoIFxcXCJyZWdpb25cXFwiIHJvbGUgbXVzdCBoYXZlIGEgbGFiZWwgdGhhdCBkZXNjcmliZXMgaXRzIHB1cnBvc2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICBsZXQgcGFzc2VkID0gQXJpYVV0aWwuaGFzQXJpYUxhYmVsKHJ1bGVDb250ZXh0KSB8fCBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInRpdGxlXCIpO1xuICAgICAgICBpZiAocGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhcmlhX3JvbGVfYWxsb3dlZDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX3JvbGVfYWxsb3dlZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbcm9sZV1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJwdF9BcmlhX1ZhbGlkUm9sZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJGYWlsXzJcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IGBhcmlhX3JvbGVfYWxsb3dlZC5odG1sYCxcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IGBhcmlhX3JvbGVfYWxsb3dlZC5odG1sYCxcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IGBhcmlhX3JvbGVfYWxsb3dlZC5odG1sYCxcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogYGFyaWFfcm9sZV9hbGxvd2VkLmh0bWxgXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVsZW1lbnRzIG11c3QgaGF2ZSBhIHZhbGlkICdyb2xlJyBwZXIgQVJJQSBzcGVjaWZpY2F0aW9uXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIlRoZSByb2xlICd7MH0nIGRlZmluZWQgb24gdGhlIGVsZW1lbnQgaXMgbm90IHZhbGlkIHBlciBBUklBIHNwZWNpZmljYXRpb25cIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJTb21lIG9mIHRoZSByb2xlcywgJ3swfScsIGRlZmluZWQgb24gdGhlIGVsZW1lbnQgYXJlIG5vdCB2YWxpZCBwZXIgQVJJQSBzcGVjaWZpY2F0aW9uXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbIFwiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBudW06IFwiNC4xLjJcIiwgLy8gbnVtOiBbIFwiMi40LjRcIiwgXCJ4LnkuelwiIF0gYWxzbyBhbGxvd2VkXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICAvLyBUT0RPOiBBQ1Q6IFJlY2hlY2tcbiAgICBhY3Q6IFwiNjc0YjEwXCIsXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHJvbGVTdHIgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAocm9sZVN0ci5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhcmlhLWhpZGRlblwiKSAmJiBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWhpZGRlblwiKS50b0xvd2VyQ2FzZSgpID09PSBcInRydWVcIikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaW52YWxpZFJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXNVbmRlZmluZWRCeUFyaWEocnVsZUNvbnRleHQpO1xuXG4gICAgICAgIGlmICghaW52YWxpZFJvbGVzIHx8IGludmFsaWRSb2xlcy5sZW5ndGggPT09IDApXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IHJvbGVzID0gcm9sZVN0ci5zcGxpdCgvXFxzKy8pO1xuICAgICAgICAgICAgaWYgKGludmFsaWRSb2xlcy5sZW5ndGggPT09IHJvbGVzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMlwiLCBbaW52YWxpZFJvbGVzLmpvaW4oXCIsXCIpXSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGludmFsaWRSb2xlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiLCBbaW52YWxpZFJvbGVzLmpvaW4oXCIsXCIpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4gICAgIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBUYWJsZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9UYWJsZVV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfcm9sZV9yZWR1bmRhbnQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9yb2xlX3JlZHVuZGFudFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbcm9sZV1cIixcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiYXJpYV9yb2xlX3JlZHVuZGFudC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfcmVkdW5kYW50XCI6IFwiYXJpYV9yb2xlX3JlZHVuZGFudC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV9yb2xlX3JlZHVuZGFudC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJBbiBleHBsaWNpdGx5LWFzc2lnbmVkIEFSSUEgcm9sZSBpcyBub3QgcmVkdW5kYW50IHdpdGggdGhlIGltcGxpY2l0IHJvbGUgb2YgdGhlIGVsZW1lbnRcIixcbiAgICAgICAgICAgIFwiZmFpbF9yZWR1bmRhbnRcIjogXCJUaGUgZXhwbGljaXRseS1hc3NpZ25lZCBBUklBIHJvbGUgXFxcInswfVxcXCIgaXMgcmVkdW5kYW50IHdpdGggdGhlIGltcGxpY2l0IHJvbGUgb2YgdGhlIGVsZW1lbnQgPHsxfT5cIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBbiBleHBsaWNpdGx5LWFzc2lnbmVkIEFSSUEgcm9sZSBzaG91bGQgbm90IGJlIHJlZHVuZGFudCB3aXRoIHRoZSBpbXBsaWNpdCByb2xlIG9mIHRoZSBlbGVtZW50XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCJdLFxuICAgICAgICBcIm51bVwiOiBbXCJBUklBXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgZWxlbU5hbWUgPSBydWxlQ29udGV4dC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIFxuICAgICAgICBsZXQgYXJpYVJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXMocnVsZUNvbnRleHQsIGZhbHNlKTtcbiAgICAgICAgaWYgKCFhcmlhUm9sZXMgfHwgYXJpYVJvbGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICAgIC8vIHRoZSBpbnZhbGlkIHJvbGUgY2FzZTogaGFuZGxlZCBieSBScHRfQXJpYV9WYWxpZFJvbGUuIElnbm9yZSB0byBhdm9pZCBkdXBsaWNhdGVkIHJlcG9ydFxuICAgICAgICBsZXQgcm9sZV9kZWZpbmVkID0gQXJpYVV0aWwuYXJlUm9sZXNEZWZpbmVkKGFyaWFSb2xlcyk7XG4gICAgICAgIGlmICghcm9sZV9kZWZpbmVkKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gZGVwZW5kZW5jeSBjaGVjazogaWYgaXQncyBhbHJlYWR5IGZhaWxlZCBpbiB0aGUgcGFyZW50IHJlbGF0aW9uLCB0aGVuIHNraXAgdGhpcyBjaGVja1xuICAgICAgICAvLyBjb21tZW50IG91dCB0byByZXBvcnQgdGhlIHJlZHVuZGFudCByb2xlIGZvciB0YWJsZSBlbGVtZW50OiB0ciwgdGQgJiB0aFxuICAgICAgICAvKippZiAoW1widGRcIiwgXCJ0aFwiLCBcInRyXCJdLmluY2x1ZGVzKGVsZW1OYW1lKSkge1xuICAgICAgICAgICAgbGV0IHBhcmVudFJvbGUgPSBUYWJsZVV0aWwuaXNUYWJsZURlc2NlbmRhbnQoY29udGV4dEhpZXJhcmNoaWVzKTtcbiAgICAgICAgICAgIGlmIChwYXJlbnRSb2xlICE9PSBudWxsICYmIHBhcmVudFJvbGUubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSovXG5cbiAgICAgICAgbGV0IGltcGxpY2l0Um9sZXMgPSBBcmlhVXRpbC5nZXRJbXBsaWNpdFJvbGUocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoIWltcGxpY2l0Um9sZXMgfHwgaW1wbGljaXRSb2xlcy5sZW5ndGggPT09IDApXG4gICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcblxuICAgICAgICBsZXQgcmV0ID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJpYVJvbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoIWltcGxpY2l0Um9sZXMuaW5jbHVkZXMoYXJpYVJvbGVzW2ldKSkgIFxuICAgICAgICAgICAgICAgIHJldC5wdXNoKFJ1bGVQYXNzKFwicGFzc1wiKSk7XG4gICAgICAgICAgICBlbHNlICAgICBcbiAgICAgICAgICAgICAgICByZXQucHVzaChSdWxlRmFpbChcImZhaWxfcmVkdW5kYW50XCIsIFthcmlhUm9sZXNbaV0sIGVsZW1OYW1lXSkpO1xuICAgICAgICB9ICBcbiAgICAgICAgaWYgKHJldC5sZW5ndGggPiAwKSAgXG4gICAgICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgICByZXR1cm4gbnVsbDsgICAgXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfc2VhcmNoX2xhYmVsX3VuaXF1ZTogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX3NlYXJjaF9sYWJlbF91bmlxdWVcIixcbiAgICBjb250ZXh0OiBcImFyaWE6c2VhcmNoXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9NdWx0aXBsZVNlYXJjaExhbmRtYXJrc1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiYXJpYV9zZWFyY2hfbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9sYWJlbF9ub3RfdW5pcXVlXCI6IFwiYXJpYV9zZWFyY2hfbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX3NlYXJjaF9sYWJlbF91bmlxdWUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiVGhlIGVsZW1lbnQgd2l0aCBcXFwic2VhcmNoXFxcIiByb2xlIGhhcyBhIHVuaXF1ZSBsYWJlbCB0aGF0IGRlc2NyaWJlcyBpdHMgcHVycG9zZVwiLFxuICAgICAgICAgICAgXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIjogXCJNdWx0aXBsZSBlbGVtZW50cyB3aXRoIFxcXCJzZWFyY2hcXFwiIHJvbGUgZG8gbm90IGhhdmUgdW5pcXVlIGxhYmVsc1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVhY2ggZWxlbWVudCB3aXRoIFxcXCJzZWFyY2hcXFwiIHJvbGUgbXVzdCBoYXZlIGEgdW5pcXVlIGxhYmVsIHRoYXQgZGVzY3JpYmVzIGl0cyBwdXJwb3NlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogZGVwcmVjYXRlZCB0aGUgcnVsZSBvbiAwMS8yNy8yMDI1XG4gICAgICogcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSwqL1xuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IGR1cHBlZCA9IEFyaWFVdGlsLmlzTGFuZG1hcmtOYW1lVW5pcXVlKHJ1bGVDb250ZXh0LCBcInNlYXJjaFwiLCB0cnVlKTsgICAgXG4gICAgICAgIGlmIChkdXBwZWQgPT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICBpZiAoZHVwcGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2xhYmVsX25vdF91bmlxdWVcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfcm9sZV92YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJhcmlhX3JvbGVfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJhcmlhX2F0dHJpYnV0ZV9hbGxvd2VkXCJdLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiYXJpYV9zZW1hbnRpY3Nfcm9sZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiRmFpbF8yXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiYXJpYV9yb2xlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiYXJpYV9yb2xlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiYXJpYV9yb2xlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX3JvbGVfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUaGUgQVJJQSByb2xlICd7MH0nIGlzIG5vdCB2YWxpZCBmb3IgdGhlIGVsZW1lbnQgPHsxfT5cIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiVGhlIEFSSUEgcm9sZSAnezB9JyBpcyBub3QgdmFsaWQgZm9yIHRoZSBlbGVtZW50IDx7MX0+IGFuZCBtYXkgYmUgaWdub3JlZCBieSB0aGUgYnJvd3NlciBzaW5jZSB0aGUgZWxlbWVudCBpcyBmb2N1c2FibGVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBUklBIHJvbGVzIG11c3QgYmUgdmFsaWQgZm9yIHRoZSBlbGVtZW50IHRvIHdoaWNoIHRoZXkgYXJlIGFzc2lnbmVkXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgdGFnTmFtZSA9IHJ1bGVDb250ZXh0LnRhZ05hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgLy8gb25seSBjaGVrIGVsZW1lbnQgKDEpIGFuZCBmcmFnbWVudCBub2RlcyAoMTEpXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5ub2RlVHlwZSAhPT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLylcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICAvLyB0aGUgaW52YWxpZCByb2xlIGNhc2U6IGhhbmRsZWQgYnkgYXJpYV9yb2xlX2FsbG93ZWQuIElnbm9yZSB0byBhdm9pZCBkdXBsaWNhdGVkIHJlcG9ydFxuICAgICAgICBjb25zdCB1bmRlZmluZWRSb2xlcyA9IEFyaWFVdGlsLmdldFJvbGVzVW5kZWZpbmVkQnlBcmlhKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKHVuZGVmaW5lZFJvbGVzICYmIHVuZGVmaW5lZFJvbGVzLmxlbmd0aCA+IDApIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCBkZXByZWNhdGVkUm9sZXMgPSBBcmlhVXRpbC5nZXREZXByZWNhdGVkQXJpYVJvbGVzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKGRlcHJlY2F0ZWRSb2xlcyAmJiBkZXByZWNhdGVkUm9sZXMubGVuZ3RoID4gMCkgcmV0dXJuIG51bGw7XG4gICAgICAgIGNvbnN0IGRlcHJlY2F0ZWRBdHRyaWJ1dGVzID0gQXJpYVV0aWwuZ2V0RGVwcmVjYXRlZEFyaWFBdHRyaWJ1dGVzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKGRlcHJlY2F0ZWRBdHRyaWJ1dGVzICYmIGRlcHJlY2F0ZWRBdHRyaWJ1dGVzLmxlbmd0aCA+IDApIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIGRlcGVuZGVuY3kgY2hlY2s6IGlmIGl0J3MgYWxyZWFkeSBmYWlsZWQsIHRoZW4gc2tpcFxuICAgICAgICBpZiAoW1widGRcIiwgXCJ0aFwiLCBcInRyXCJdLmluY2x1ZGVzKHRhZ05hbWUpKSB7XG4gICAgICAgICAgICBsZXQgcGFyZW50Um9sZSA9IENvbW1vblV0aWwuaXNUYWJsZURlc2NlbmRhbnQoY29udGV4dEhpZXJhcmNoaWVzKTtcbiAgICAgICAgICAgIGlmIChwYXJlbnRSb2xlICE9PSBudWxsICYmIHBhcmVudFJvbGUubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBkb21Sb2xlczogc3RyaW5nW10gPSBBcmlhVXRpbC5nZXRVc2VyRGVmaW5lZFJvbGVzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKCFkb21Sb2xlcyB8fCBkb21Sb2xlcy5sZW5ndGggPT09MClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIGNoZWNrIHRoZSAnZ2VuZXJpYycgcm9sZSBmaXJzdFxuICAgICAgICBpZiAoZG9tUm9sZXMuaW5jbHVkZXMoJ2dlbmVyaWMnKSlcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiLCBbXCJnZW5lcmljXCIsIHRhZ05hbWVdKTtcbiAgICAgICAgXG4gICAgICAgIGxldCBpbnZhbGlkUm9sZXMgPSBBcmlhVXRpbC5nZXRJbnZhbGlkUm9sZXMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoaW52YWxpZFJvbGVzID09PSBudWxsIHx8IGludmFsaWRSb2xlcy5sZW5ndGggPT09MClcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiLCBbZG9tUm9sZXMuam9pbihcIiwgXCIpLCB0YWdOYW1lXSk7XG5cbiAgICAgICAgaWYgKGludmFsaWRSb2xlcy5pbmNsdWRlcyhcInByZXNlbnRhdGlvblwiKSB8fCBpbnZhbGlkUm9sZXMuaW5jbHVkZXMoXCJub25lXCIpICYmIENvbW1vblV0aWwuaXNUYWJiYWJsZShydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzJcIiwgW2ludmFsaWRSb2xlcy5qb2luKFwiLCBcIiksIHRhZ05hbWVdKTtcbiAgICAgICAgXG4gICAgICAgIGlmIChpbnZhbGlkUm9sZXMubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiLCBbaW52YWxpZFJvbGVzLmpvaW4oXCIsIFwiKSwgdGFnTmFtZV0pO1xuICAgICAgICBcbiAgICAgICAgaWYgKGRvbVJvbGVzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIiwgW2RvbVJvbGVzLmpvaW4oXCIsIFwiKSwgdGFnTmFtZV0pO1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufVxuXG4vLyBUaGlzIHJ1bGUgaXMgaW4gdGhlIHNhbWUgZmlsZSBiZWNhdXNlIHRoZXJlIGlzIGEgZGVwZW5kZW5jeSB0aGF0IGFyaWFfcm9sZV92YWxpZCBydW5zIGZpcnN0LFxuLy8gYW5kIHRoZSBpbmZvIGlzIHBhc3NlZCBieSBjYWNoZSwgYnV0IHRoZXJlIGlzbid0IGEgZGVwZW5kZW5jeSBpbiB0aGUgRmFpbF8yIHNjZW5hcmlvLCBzbyByZWd1bGFyXG4vLyBkZXBlbmRlbmN5IGNhbm5vdCBiZSB1c2VkXG5leHBvcnQgY29uc3QgYXJpYV9hdHRyaWJ1dGVfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV9hdHRyaWJ1dGVfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgLy8gVGhlIHRoZSBBUklBIHJvbGUgaXMgY29tcGxldGVseSBpbnZhbGlkLCBza2lwIHRoaXMgY2hlY2tcbiAgICBkZXBlbmRlbmNpZXM6IFtcImFyaWFfYXR0cmlidXRlX2RlcHJlY2F0ZWRcIiwgXCJhcmlhX3JvbGVfdmFsaWRcIl0sXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJhcmlhX2F0dHJpYnV0ZV9hbGxvd2VkXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc1wiOiBcIlBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF9pbnZhbGlkX3JvbGVfYXR0clwiOiBcIkZhaWxfaW52YWxpZF9yb2xlX2F0dHJcIixcbiAgICAgICAgICAgIFwiRmFpbF9pbnZhbGlkX2ltcGxpY2l0X3JvbGVfYXR0clwiOiBcIkZhaWxfaW52YWxpZF9pbXBsaWNpdF9yb2xlX2F0dHJcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcImFyaWFfYXR0cmlidXRlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc1wiOiBcImFyaWFfYXR0cmlidXRlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF9pbnZhbGlkX3JvbGVfYXR0clwiOiBcImFyaWFfYXR0cmlidXRlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF9pbnZhbGlkX2ltcGxpY2l0X3JvbGVfYXR0clwiOiBcImFyaWFfYXR0cmlidXRlX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBUklBIGF0dHJpYnV0ZXMgc2hvdWxkIGJlIHZhbGlkIGZvciB0aGUgZWxlbWVudCBhbmQgQVJJQSByb2xlIHRvIHdoaWNoIHRoZXkgYXJlIGFzc2lnbmVkXCIsXG4gICAgICAgICAgICBcIlBhc3NcIjogXCJBUklBIGF0dHJpYnV0ZXMgYXJlIHZhbGlkIGZvciB0aGUgZWxlbWVudCBhbmQgQVJJQSByb2xlXCIsXG4gICAgICAgICAgICBcIkZhaWxfaW52YWxpZF9yb2xlX2F0dHJcIjogXCJUaGUgQVJJQSBhdHRyaWJ1dGVzIFxcXCJ7MH1cXFwiIGFyZSBub3QgdmFsaWQgZm9yIHRoZSBlbGVtZW50IDx7MX0+IHdpdGggQVJJQSByb2xlIFxcXCJ7Mn1cXFwiXCIsXG4gICAgICAgICAgICBcIkZhaWxfaW52YWxpZF9pbXBsaWNpdF9yb2xlX2F0dHJcIjogXCJUaGUgQVJJQSBhdHRyaWJ1dGVzIFxcXCJ7MH1cXFwiIGFyZSBub3QgdmFsaWQgZm9yIHRoZSBlbGVtZW50IDx7MX0+IHdpdGggaW1wbGljaXQgQVJJQSByb2xlIFxcXCJ7Mn1cXFwiXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCJBUklBXCJdLCAvL3JlbW92ZWQgbWFwcGluZyB0byA0LjEuMiBmcm9tIGhlcmUgYW5kIGhlbHBcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXCI1YzAxZWFcIiwgeyBcIjQ2Y2E3ZlwiOiB7IFwiUGFzc1wiOiBcInBhc3NcIiwgXCJGYWlsX2ludmFsaWRfcm9sZV9hdHRyXCI6IFwiZmFpbFwiLCBcIkZhaWxfaW52YWxpZF9pbXBsaWNpdF9yb2xlX2F0dHJcIjogXCJmYWlsXCJ9fV0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy8gb25seSBjaGVrIGVsZW1lbnQgKDEpXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5ub2RlVHlwZSAhPT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLylcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIGlnbm9yZSBpZiBubyBhcmlhIGF0dHJpYnV0ZVxuICAgICAgICBsZXQgYXJpYUF0dHJpYnV0ZXM6c3RyaW5nW10gPSBBcmlhVXRpbC5nZXRVc2VyRGVmaW5lZEFyaWFBdHRyaWJ1dGVzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKGFyaWFBdHRyaWJ1dGVzID09PSBudWxsIHx8IGFyaWFBdHRyaWJ1dGVzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgIFxuICAgICAgICBsZXQgcm9sZXM6IHN0cmluZ1tdID0gQXJpYVV0aWwuZ2V0VXNlckRlZmluZWRSb2xlcyhydWxlQ29udGV4dCk7XG4gICAgICAgIGxldCBleHBsaWNpdCA9IHRydWU7XG4gICAgICAgIGlmIChyb2xlcyAmJiByb2xlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvLyB0aGUgaW52YWxpZCByb2xlIGNhc2U6IGhhbmRsZWQgYnkgUnB0X0FyaWFfVmFsaWRSb2xlLiBJZ25vcmUgdG8gYXZvaWQgZHVwbGljYXRlZCByZXBvcnRcbiAgICAgICAgICAgIGlmICghQXJpYVV0aWwuYXJlUm9sZXNEZWZpbmVkKHJvbGVzKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vbm8gZXhwbGljaXQgcm9sZSBkZWZpbmVkXG4gICAgICAgICAgICByb2xlcyA9ICBBcmlhVXRpbC5nZXRJbXBsaWNpdFJvbGUocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgZXhwbGljaXQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgbGV0IHRhZ05hbWUgPSBydWxlQ29udGV4dC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGxldCBmYWlsZWRBdHRyaWJ1dGVzID0gQXJpYVV0aWwuZ2V0SW52YWxpZEFyaWFBdHRyaWJ1dGVzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKCFmYWlsZWRBdHRyaWJ1dGVzIHx8IGZhaWxlZEF0dHJpYnV0ZXMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc1wiLCBbYXJpYUF0dHJpYnV0ZXMuam9pbihcIiwgXCIpLCB0YWdOYW1lLCByb2xlcy5qb2luKFwiLCBcIildKTtcblxuICAgICAgICBpZiAocm9sZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgaWYgKGV4cGxpY2l0KVxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfaW52YWxpZF9yb2xlX2F0dHJcIiwgW2ZhaWxlZEF0dHJpYnV0ZXMuam9pbihcIiwgXCIpLCB0YWdOYW1lLCByb2xlcy5qb2luKFwiLCBcIildKTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsX2ludmFsaWRfaW1wbGljaXRfcm9sZV9hdHRyXCIsIFtmYWlsZWRBdHRyaWJ1dGVzLmpvaW4oXCIsIFwiKSwgdGFnTmFtZSwgcm9sZXMuam9pbihcIiwgXCIpXSk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfaW52YWxpZF9yb2xlX2F0dHJcIiwgW2ZhaWxlZEF0dHJpYnV0ZXMuam9pbihcIiwgXCIpLCB0YWdOYW1lLCBcIm5vbmVcIl0pO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBDYWNoZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfdG9vbGJhcl9sYWJlbF91bmlxdWU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiYXJpYV90b29sYmFyX2xhYmVsX3VuaXF1ZVwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTp0b29sYmFyXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJScHRfQXJpYV9NdWx0aXBsZVRvb2xiYXJVbmlxdWVMYWJlbFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFyaWFfdG9vbGJhcl9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJhcmlhX3Rvb2xiYXJfbGFiZWxfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJhcmlhX3Rvb2xiYXJfbGFiZWxfdW5pcXVlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiTXVsdGlwbGUgZWxlbWVudHMgd2l0aCBcXFwidG9vbGJhclxcXCIgcm9sZXMgZG8gbm90IGhhdmUgdW5pcXVlIGxhYmVsc1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVhY2ggZWxlbWVudCB3aXRoIFxcXCJ0b29sYmFyXFxcIiByb2xlIG11c3QgaGF2ZSBhIHVuaXF1ZSBsYWJlbCB0aGF0IGRlc2NyaWJlcyBpdHMgcHVycG9zZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi40LjFcIl0sIC8vdXBkYXRlZCBtYXBwaW5nIHRvIG1hdGNoIG90aGVyIGxhbmRtYXJrIHJlZ2lvbnMgcnVsZXNcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBDb25zaWRlciB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyB0aGF0IGlzIHNldCBieSB0aGUgcnVsZXNcbiAgICAgICAgLy8gQWxzbywgY29uc2lkZXIgSW1wbGljaXQgcm9sZSBjaGVja2luZy5cbiAgICAgICAgbGV0IGxhbmRtYXJrcyA9IENvbW1vblV0aWwuZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW4oXG4gICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgXCJ0b29sYmFyXCIsXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgdHJ1ZVxuICAgICAgICApO1xuICAgICAgICBpZiAobGFuZG1hcmtzLmxlbmd0aCA9PT0gMCB8fCBsYW5kbWFya3MubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBkdXBlcyA9IENhY2hlVXRpbC5nZXRDYWNoZShcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICBcImFyaWFfdG9vbGJhcl9sYWJlbF91bmlxdWVcIixcbiAgICAgICAgICAgIG51bGxcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKCFkdXBlcykge1xuICAgICAgICAgICAgZHVwZXMgPSBBcmlhVXRpbC5maW5kQXJpYUxhYmVsRHVwZXMobGFuZG1hcmtzKTtcbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShcbiAgICAgICAgICAgICAgICBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LFxuICAgICAgICAgICAgICAgIFwiYXJpYV90b29sYmFyX2xhYmVsX3VuaXF1ZVwiLFxuICAgICAgICAgICAgICAgIGR1cGVzXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGxldCBteUxhYmVsID0gQXJpYVV0aWwuZ2V0QXJpYUxhYmVsKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgbGV0IHBhc3NlZCA9XG4gICAgICAgICAgICBteUxhYmVsICE9PSBcIlwiICYmICghKG15TGFiZWwgaW4gZHVwZXMpIHx8IGR1cGVzW215TGFiZWxdIDw9IDEpO1xuXG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW215TGFiZWxdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBBUklBTWFwcGVyIH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQU1hcHBlclwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG5pbXBvcnQgeyBBUklBRGVmaW5pdGlvbnMgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBRGVmaW5pdGlvbnNcIjtcbmltcG9ydCB7IERPTVV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGFyaWFfd2lkZ2V0X2xhYmVsbGVkOiBSdWxlID0ge1xuICAgIGlkOiBcImFyaWFfd2lkZ2V0X2xhYmVsbGVkXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUnB0X0FyaWFfV2lkZ2V0TGFiZWxzX0ltcGxpY2l0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiYXJpYV93aWRnZXRfbGFiZWxsZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJhcmlhX3dpZGdldF9sYWJlbGxlZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImFyaWFfd2lkZ2V0X2xhYmVsbGVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJJbnRlcmFjdGl2ZSBjb21wb25lbnQgbXVzdCBoYXZlIGEgcHJvZ3JhbW1hdGljYWxseSBhc3NvY2lhdGVkIG5hbWVcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiSW50ZXJhY3RpdmUgY29tcG9uZW50IHdpdGggQVJJQSByb2xlICd7MH0nIGRvZXMgbm90IGhhdmUgYSBwcm9ncmFtbWF0aWNhbGx5IGFzc29jaWF0ZWQgbmFtZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogXCJtNmIxcTNcIixcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvKiByZW1vdmVkIHRoZSByb2xlIGNoZWNrIHJvbGU9IHByZXNlbnRhdGlvbiBhbmQgcm9sZT1ub25lIHNpbmNlIHRoZXNlIDIgcm9sZXMgYXJlIG5vdCBpbiB0aGUgbGlzdCBvZiB3aWRnZXQgdHlwZSByb2xlcyAqL1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidHlwZVwiKSAmJlxuICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInR5cGVcIikgPT09IFwiaGlkZGVuXCIpIHx8XG4gICAgICAgICAgICAoQXJpYVV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShydWxlQ29udGV4dCwgXCJjb21ib2JveFwiKSAmJlxuICAgICAgICAgICAgICAgICEoXG4gICAgICAgICAgICAgICAgICAgIEFyaWFVdGlsLmhhc1JvbGVJblNlbWFudGljcyhydWxlQ29udGV4dCwgXCJ0ZXh0Ym94XCIpIHx8XG4gICAgICAgICAgICAgICAgICAgIEFyaWFVdGlsLmhhc1JvbGVJblNlbWFudGljcyhydWxlQ29udGV4dCwgXCJzZWFyY2hib3hcIilcbiAgICAgICAgICAgICAgICApKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gZGlhZ25vc2UgdGhhdCBhIGNvbWJvYm94IGlucHV0IHRleHRib3ggaGFzIGEgbGFiZWwoZ2l0aHViIGlzc3VlICMxMTA0KVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZWxlbVJvbGUgPSBBUklBTWFwcGVyLm5vZGVUb1JvbGUocnVsZUNvbnRleHQpO1xuICAgICAgICBsZXQgdGFnTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgLy8gSGFuZGxlZCBieSBpbnB1dF9sYWJlbF9leGlzdHNcbiAgICAgICAgbGV0IHNraXBSb2xlcyA9IFtcbiAgICAgICAgICAgIFwiYnV0dG9uXCIsXG4gICAgICAgICAgICBcImNoZWNrYm94XCIsXG4gICAgICAgICAgICBcImNvbWJvYm94XCIsXG4gICAgICAgICAgICBcImxpc3Rib3hcIixcbiAgICAgICAgICAgIFwibWVudWl0ZW1jaGVja2JveFwiLFxuICAgICAgICAgICAgXCJtZW51aXRlbXJhZGlvXCIsXG4gICAgICAgICAgICBcInJhZGlvXCIsXG4gICAgICAgICAgICBcInNlYXJjaGJveFwiLFxuICAgICAgICAgICAgXCJzbGlkZXJcIixcbiAgICAgICAgICAgIFwic3BpbmJ1dHRvblwiLFxuICAgICAgICAgICAgXCJzd2l0Y2hcIixcbiAgICAgICAgICAgIFwidGV4dGJveFwiLFxuICAgICAgICAgICAgXCJwcm9ncmVzc2JhclwiLFxuICAgICAgICAgICAgXCJsaW5rXCIsXG4gICAgICAgIF07XG4gICAgICAgIGlmIChza2lwUm9sZXMuaW5jbHVkZXMoZWxlbVJvbGUpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGFnTmFtZSA9PT0gXCJvdXRwdXRcIiB8fFxuICAgICAgICAgICAgKHRhZ05hbWUgPT09IFwiaW5wdXRcIiAmJlxuICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInR5cGVcIikgPT09IFwiZmlsZVwiKVxuICAgICAgICApIHtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInJvbGVcIikpIHtcbiAgICAgICAgICAgIC8vIEZvcm0vaW5wdXQgZWxlbWVudHMgYXJlIGNoZWNrZWQgYnkgRzQxLCB3ZSBza2lwIHRoZW0gZnJvbSB0aGlzIHJ1bGUuIEdpdGh1YiBpc3N1ZSA0NDlcbiAgICAgICAgICAgIGxldCBza2lwRWxlbWVudHMgPSBbXG4gICAgICAgICAgICAgICAgXCJpbnB1dFwiLFxuICAgICAgICAgICAgICAgIFwidGV4dGFyZWFcIixcbiAgICAgICAgICAgICAgICBcInNlbGVjdFwiLFxuICAgICAgICAgICAgICAgIFwiYnV0dG9uXCIsXG4gICAgICAgICAgICAgICAgXCJkYXRhbGlzdFwiLFxuICAgICAgICAgICAgICAgIFwib3B0Z3JvdXBcIixcbiAgICAgICAgICAgICAgICBcIm9wdGlvblwiLFxuICAgICAgICAgICAgICAgIFwia2V5Z2VuXCIsXG4gICAgICAgICAgICAgICAgXCJvdXRwdXRcIixcbiAgICAgICAgICAgICAgICBcInByb2dyZXNzXCIsXG4gICAgICAgICAgICAgICAgXCJtZXRlclwiLFxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBza2lwRWxlbWVudHMuaW5kZXhPZihydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSAhPVxuICAgICAgICAgICAgICAgIC0xXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGF2b2lkIGRpYWdub3NpbmcgdGhlIHBvcHVwIGxpc3Qgb2YgYSBjb21ib2JveC5cbiAgICAgICAgbGV0IHJvbGVzVG9DaGVjayA9IFtcImxpc3Rib3hcIiwgXCJ0cmVlXCIsIFwiZ3JpZFwiLCBcImRpYWxvZ1wiXTtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByb2xlc1RvQ2hlY2subGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgIGlmIChBcmlhVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MocnVsZUNvbnRleHQsIHJvbGVzVG9DaGVja1tqXSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgY29tYm9ib3hlcyA9IENvbW1vblV0aWwuZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW4oXG4gICAgICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIFwiY29tYm9ib3hcIixcbiAgICAgICAgICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgdHJ1ZVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBjb21ib2JveGVzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjb21ib2JveCA9IGNvbWJvYm94ZXNba107XG4gICAgICAgICAgICAgICAgICAgIGxldCBhcmlhX293bnMgPSBDb21tb25VdGlsLmdldEVsZW1lbnRBdHRyaWJ1dGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21ib2JveCxcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiYXJpYS1vd25zXCJcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFyaWFfb3ducykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG93bnMgPSBDb21tb25VdGlsLm5vcm1hbGl6ZVNwYWNpbmcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYV9vd25zLnRyaW0oKVxuICAgICAgICAgICAgICAgICAgICAgICAgKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG93bnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgb3duZWQgPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZUNvbnRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG93bnNbaV1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvd25lZCA9PT0gcnVsZUNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGxldCBwcm9oaWJpdGVkID0gZmFsc2U7XG4gICAgICAgIGxldCBkZXNpZ25QYXR0ZXJucyA9IEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJucztcbiAgICAgICAgLy9nZXQgYXR0cmlidXRlIHJvbGVzIGFzIHdlbGwgYXMgaW1wbGljaXQgcm9sZXMuXG4gICAgICAgIGxldCByb2xlcyA9IEFyaWFVdGlsLmdldFJvbGVzKHJ1bGVDb250ZXh0LCB0cnVlKTtcbiAgICAgICAgbGV0IG51bVdpZGdldHNUZXN0ZWQgPSAwO1xuICAgICAgICBsZXQgaW50ZXJhY3RpdmVSb2xlVHlwZXMgPSBbXCJ3aWRnZXRcIiwgXCJsaXZlUmVnaW9uXCIsIFwid2luZG93XCJdO1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuZ3RoID0gcm9sZXMubGVuZ3RoOyBwYXNzZWQgJiYgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBsZXQgcGF0dGVybiA9IGRlc2lnblBhdHRlcm5zW3JvbGVzW2ldXTtcblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHBhdHRlcm4gJiZcbiAgICAgICAgICAgICAgICBwYXR0ZXJuLm5hbWVSZXF1aXJlZCAmJlxuICAgICAgICAgICAgICAgIHBhdHRlcm4ucm9sZVR5cGUgJiZcbiAgICAgICAgICAgICAgICBpbnRlcmFjdGl2ZVJvbGVUeXBlcy5pbmNsdWRlcyhwYXR0ZXJuLnJvbGVUeXBlKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgKytudW1XaWRnZXRzVGVzdGVkO1xuXG4gICAgICAgICAgICAgICAgLy8gQWxsIHdpZGdldHMgbWF5IGhhdmUgYW4gYXV0aG9yIHN1cHBsaWVkIGFjY2Vzc2libGUgbmFtZS5cbiAgICAgICAgICAgICAgICAvLyBUaXRsZSBpcyBsZWdhbCwgYnV0IGRvbid0IGFkdmVydGlzZSBpdHMgdXNlIGluIGRvY3VtZW50YXRpb24uXG4gICAgICAgICAgICAgICAgLy8gRW5jb3VyYWdlIHVzZSBvZiBhcmlhLWxhYmVsLCBhcmlhLWxhYmVsbGVkYnkgb3IgaHRtbCBsYWJlbCBlbGVtZW50LlxuICAgICAgICAgICAgICAgIHBhc3NlZCA9XG4gICAgICAgICAgICAgICAgICAgIEFyaWFVdGlsLmhhc0FyaWFMYWJlbChydWxlQ29udGV4dCkgfHxcbiAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJ0aXRsZVwiKSB8fFxuICAgICAgICAgICAgICAgICAgICBDb21tb25VdGlsLmdldExhYmVsRm9yRWxlbWVudEhpZGRlbihydWxlQ29udGV4dCwgdHJ1ZSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICFwYXNzZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgcGF0dGVybi5uYW1lRnJvbSAmJlxuICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuLm5hbWVGcm9tLmluZGV4T2YoXCJjb250ZW50c1wiKSA+PSAwXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNlZSBpZiB3aWRnZXQncyBhY2Nlc3NpYmxlIG5hbWUgaXMgc3VwcGxpZWQgYnkgZWxlbWVudCdzIGlubmVyIHRleHRcbiAgICAgICAgICAgICAgICAgICAgLy8gbmFtZUZyb206IFtcImF1dGhvclwiLCBcImNvbnRlbnRzXCJdXG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IENvbW1vblV0aWwuaGFzSW5uZXJDb250ZW50T3JBbHQocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIGl0IGhhcyBpbXBsaWNpdCBsYWJlbCwgbGlrZSA8bGFiZWw+PGlucHV0IC4uLi4+YWJjIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IENvbW1vblV0aWwuaGFzSW1wbGljaXRMYWJlbChydWxlQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAhcGFzc2VkICYmXG4gICAgICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbWdcIiAmJlxuICAgICAgICAgICAgICAgICAgICAhcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwicm9sZVwiKSAmJlxuICAgICAgICAgICAgICAgICAgICBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhbHRcIilcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID1cbiAgICAgICAgICAgICAgICAgICAgICAgIERPTVV0aWwuY2xlYW5XaGl0ZXNwYWNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFsdFwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgKS50cmltKCkubGVuZ3RoID4gMDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAocGF0dGVybi5uYW1lRnJvbS5pbmRleE9mKFwicHJvaGliaXRlZFwiKSA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHByb2hpYml0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChudW1XaWRnZXRzVGVzdGVkID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSBlbHNlIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW2VsZW1Sb2xlXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvL1RPRE9cbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIGlmIChwcm9oaWJpdGVkKSB7XG4gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8yXCIpO1xuICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBhc2NpaWFydF9hbHRfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcImFzY2lpYXJ0X2FsdF9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTpwcmUsIGRvbTpsaXN0aW5nLCBkb206eG1wLCBkb206cGxhaW50ZXh0XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfUHJlX0FTQ0lJQXJ0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImFzY2lpYXJ0X2FsdF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcImFzY2lpYXJ0X2FsdF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImFzY2lpYXJ0X2FsdF9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0aGF0IEFTQ0lJIGFydCBoYXMgYSB0ZXh0IGFsdGVybmF0aXZlXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQVNDSUkgYXJ0IG11c3QgaGF2ZSBhIHRleHQgYWx0ZXJuYXRpdmVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBEZWNpc2lvbiBpbiBwbGFubmluZyA5LzcvMjMgdGhhdCB0aGlzIHJ1bGUgY2F1c2VzIG1vcmUgcmV2aWV3cyB0aGF0IHdlIHNlZSBhY3R1YWwgcHJvYmxlbXMgaW4gY29udGVudCwgc28gdHVybiB0aGVzZSBydWxlcyBvZmZcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICAqL1xuICAgIHJ1bGVzZXRzOiBbXSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG5cbiAgICAgICAgLy8gRml4IGZvciBJRFdCIHdyaXRlcnMuIERvbid0IHRyaWdnZXIgaWYgY29udGVudCBpcyBpbiBhIGNvZGUgZWxlbWVudC4gIFRoZSBjb2RlIGVsZW1lbnQgaXMgc2VhcmNoZWQgZm9yXG4gICAgICAgIC8vIGluIHZhcmlvdXMgcGxhY2VzIGJlY2F1c2Ugb2YgdGhlIHdlaXJkIHdheSB2YXJpb3VzIGJyb3dzZXJzIHJlbmRlciA8Y29kZT48cHJlPjwvcHJlPjwvY29kZS4gIEZpcmVmb3gsXG4gICAgICAgIC8vIEh0bWxVbml0IGFuZCBDaHJvbWUgYWxsIHJlbmRlciBkaWZmZXJlbnRseS4gIEZpcmVmb3g6IDxjb2RlPjwvY29kZT48cHJlPjwvcHJlPiAgSHRtbFVuaXQ6IDwvY29kZT48cHJlPjxjb2RlPjwvY29kZT48L3ByZT5cbiAgICAgICAgLy8gU2VlIHVuaXQgdGVzdCBDb2RlRWxlbWVudEFib3ZlUHJlRWxlbWVudC5odG1sLiAgRG9uJ3Qga25vdyBob3cgUlBUIHJlbmRlcnMsIHNvIGNvdmVyIGFsbCB0aGUgYmFzZXMuXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09IFwicHJlXCIpIHtcbiAgICAgICAgICAgIGlmICgocnVsZUNvbnRleHQucHJldmlvdXNTaWJsaW5nICYmIHJ1bGVDb250ZXh0LnByZXZpb3VzU2libGluZy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09IFwiY29kZVwiKSB8fFxuICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiY29kZVwiKS5sZW5ndGggPiAwIHx8XG4gICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgXCJjb2RlXCIpKSB7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgbGV0IHR4dFZhbHVlID0gQ29tbW9uVXRpbC5nZXRJbm5lclRleHQocnVsZUNvbnRleHQpO1xuICAgICAgICBsZXQgbm9uQWxwaGFOdW1lcmljTm9yU3BhY2VDb3VudCA9IDA7XG4gICAgICAgIGxldCBhbHBoTnVtU2FtZUNoYXJhY3RlckNvdW50ID0gMDtcbiAgICAgICAgbGV0IGxhc3RDaGFyYWN0ZXIgPSBcIlwiO1xuXG4gICAgICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgdGV4dCBjb250ZW50XG4gICAgICAgIGZvciAobGV0IGlkeCA9IDA7IHBhc3NlZCAmJiAoaWR4IDwgdHh0VmFsdWUubGVuZ3RoKTsgKytpZHgpIHtcbiAgICAgICAgICAgIGxldCBjaFN0ciA9IHR4dFZhbHVlLnN1YnN0cihpZHgsIDEpO1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgaXQgaXMgYWxwaGFudW1lcmljIG9yIHB1bmN0dWF0aW9uXG4gICAgICAgICAgICBpZiAoL1tcXHchQCMkJSZcXCooKS4sP1xcW1xcXXt9PD49XCI6XFwvXFxcXC1dLy50ZXN0KGNoU3RyKSkge1xuICAgICAgICAgICAgICAgIC8vIERldGVjdCBzYW1lIGNoYXJhY3RlciBzZXF1ZW5jZVxuICAgICAgICAgICAgICAgIGlmIChsYXN0Q2hhcmFjdGVyID09IGNoU3RyKSB7XG4gICAgICAgICAgICAgICAgICAgIGFscGhOdW1TYW1lQ2hhcmFjdGVyQ291bnQgPSBhbHBoTnVtU2FtZUNoYXJhY3RlckNvdW50ICsgMTs7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYWxwaE51bVNhbWVDaGFyYWN0ZXJDb3VudCA9IDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmICgvXFxzLy50ZXN0KGNoU3RyKSkge1xuICAgICAgICAgICAgICAgIGFscGhOdW1TYW1lQ2hhcmFjdGVyQ291bnQgPSAwO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBub25BbHBoYU51bWVyaWNOb3JTcGFjZUNvdW50ID0gbm9uQWxwaGFOdW1lcmljTm9yU3BhY2VDb3VudCArIDE7XG4gICAgICAgICAgICAgICAgYWxwaE51bVNhbWVDaGFyYWN0ZXJDb3VudCA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsYXN0Q2hhcmFjdGVyID0gY2hTdHI7XG5cbiAgICAgICAgICAgIC8vIE1ha2UgdGhlIGRlY2lzaW9uXG4gICAgICAgICAgICBpZiAobm9uQWxwaGFOdW1lcmljTm9yU3BhY2VDb3VudCA+PSA1IHx8IGFscGhOdW1TYW1lQ2hhcmFjdGVyQ291bnQgPj0gNCkge1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgYmxpbmtfY3NzX3JldmlldzogUnVsZSA9IHtcbiAgICBpZDogXCJibGlua19jc3NfcmV2aWV3XCIsXG4gICAgY29udGV4dDogXCJkb206c3R5bGUsIGRvbToqW3N0eWxlXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX0JsaW5rX0NTU1RyaWdnZXIxXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBgYmxpbmtfY3NzX3Jldmlldy5odG1sYCxcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IGBibGlua19jc3NfcmV2aWV3Lmh0bWxgLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBgYmxpbmtfY3NzX3Jldmlldy5odG1sYFxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJEbyBub3QgdXNlIHRoZSBcXFwiYmxpbmtcXFwiIHZhbHVlIG9mIHRoZSAndGV4dC1kZWNvcmF0aW9uJyBwcm9wZXJ0eSBmb3IgbG9uZ2VyIHRoYW4gZml2ZSBzZWNvbmRzXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiQ2hlY2sgdGhlIFxcXCJibGlua1xcXCIgdmFsdWUgb2YgdGhlIENTUyAndGV4dC1kZWNvcmF0aW9uJyBwcm9wZXJ0eSBpcyBub3QgdXNlZCBmb3IgbW9yZSB0aGFuIHRoYW4gZml2ZSBzZWNvbmRzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIG51bTogXCIyLjIuMlwiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHRleHRWYWx1ZSA9IENvbW1vblV0aWwuZ2V0SW5uZXJUZXh0KHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZSgnc3R5bGUnKSkge1xuICAgICAgICAgICAgdGV4dFZhbHVlID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKCdzdHlsZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhc3NlZCA9IHRleHRWYWx1ZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoXCJ0ZXh0LWRlY29yYXRpb246YmxpbmtcIikgPT0gLTE7XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGNvbnN0IGJsaW5rX2VsZW1fZGVwcmVjYXRlZDogUnVsZSA9IHtcbiAgICBpZDogXCJibGlua19lbGVtX2RlcHJlY2F0ZWRcIixcbiAgICBjb250ZXh0OiBcImRvbTpibGlua1wiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0JsaW5rX0Fsd2F5c1RyaWdnZXJcIjoge1xuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBgYmxpbmtfZWxlbV9kZXByZWNhdGVkLmh0bWxgLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogYGJsaW5rX2VsZW1fZGVwcmVjYXRlZC5odG1sYFxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJDb250ZW50IHRoYXQgYmxpbmtzIHBlcnNpc3RlbnRseSBtdXN0IG5vdCBiZSB1c2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkNvbnRlbnQgZm91bmQgdGhhdCBibGlua3MgcGVyc2lzdGVudGx5XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbIFwiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBudW06IFwiMi4yLjJcIiwgLy8gbnVtOiBbIFwiMi40LjRcIiwgXCJ4LnkuelwiIF0gYWxzbyBhbGxvd2VkXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIC8vIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICB9XG59XG4gICAgIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBibG9ja3F1b3RlX2NpdGVfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcImJsb2NrcXVvdGVfY2l0ZV9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTpibG9ja3F1b3RlXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfQmxvY2txdW90ZV9IYXNDaXRlXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImJsb2NrcXVvdGVfY2l0ZV9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcImJsb2NrcXVvdGVfY2l0ZV9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImJsb2NrcXVvdGVfY2l0ZV9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0aGF0IDxibG9ja3F1b3RlPiBzaG91bGQgaGF2ZSBhICdjaXRlJyBhdHRyaWJ1dGUgYW5kIG5vdCBiZSB1c2VkIGZvciBpbmRlbnRhdGlvbiBvbmx5XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVXNlIDxibG9ja3F1b3RlPiBvbmx5IGZvciBxdW90YXRpb25zLCBub3QgaW5kZW50YXRpb25cIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwiY2l0ZVwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIGxldCBjaXRlRWxlbXMgPSBDb21tb25VdGlsLmdldERvY0VsZW1lbnRzQnlUYWcocnVsZUNvbnRleHQsIFwiY2l0ZVwiKTtcbiAgICAgICAgICAgIHBhc3NlZCA9IGNpdGVFbGVtcyAhPSBudWxsICYmIGNpdGVFbGVtcy5sZW5ndGggPiAwO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVNYW51YWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGNhbnZhc19jb250ZW50X2Rlc2NyaWJlZDogUnVsZSA9IHtcbiAgICBpZDogXCJjYW52YXNfY29udGVudF9kZXNjcmliZWRcIixcbiAgICBjb250ZXh0OiBcImRvbTpjYW52YXNcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIkhBQUNfQ2FudmFzXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwiTWFudWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImNhbnZhc19jb250ZW50X2Rlc2NyaWJlZC5odG1sXCIsXG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwiY2FudmFzX2NvbnRlbnRfZGVzY3JpYmVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJjYW52YXNfY29udGVudF9kZXNjcmliZWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIlZlcmlmeSBhY2Nlc3NpYmlsaXR5IG9mIHRoZSA8Y2FudmFzPiBlbGVtZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGhlIDxjYW52YXM+IGVsZW1lbnQgbWF5IG5vdCBiZSBhY2Nlc3NpYmxlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiLCBcIjIuMS4xXCIsIFwiNC4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHJ1bGVDb250ZXh0LmlubmVySFRNTC50cmltKCkubGVuZ3RoID4gMDtcbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVNYW51YWwoXCJNYW51YWxfMVwiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGNvbnN0IGNhcHRpb25fdHJhY2tfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcImNhcHRpb25fdHJhY2tfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJkb206dmlkZW9cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIkhBQUNfVmlkZW9fSGFzTm9UcmFja1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJjYXB0aW9uX3RyYWNrX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiY2FwdGlvbl90cmFja19leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImNhcHRpb25fdHJhY2tfZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgdGhhdCBjYXB0aW9ucyBhcmUgYXZhaWxhYmxlIGZvciBhbnkgbWVhbmluZ2Z1bCBhdWRpbyBvciBwcm92aWRlIGEgY2FwdGlvbiB0cmFjayBmb3IgdGhlIDx2aWRlbz4gZWxlbWVudFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkEgPHZpZGVvPiBlbGVtZW50IG11c3QgaGF2ZSBhIHRleHQgYWx0ZXJuYXRpdmUgZm9yIGFueSBtZWFuaW5nZnVsIGF1ZGlvIGNvbnRlbnRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMi4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEhUTUxWaWRlb0VsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSBmYWxzZTtcblxuICAgICAgICAvLyBpZ25vcmUgZGVjb3JhdGl2ZSB2aWRlbyBpZiB1c2VyIHVzZXMgYXJpYS1oaWRkZW5cbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtaGlkZGVuXCIpID09PSBcInRydWVcIikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdHJhY2tzID0gcnVsZUNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJ0cmFja1wiKTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRyYWNrcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgcGFzc2VkID0gcGFzc2VkIHx8IHRyYWNrc1tpXS5nZXRBdHRyaWJ1dGUoXCJraW5kXCIpID09PSAnY2FwdGlvbnMnO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNoZWNrcyBmb3IgYWRkaXRpb24gb2YgZHluYW1pYyB0cmFja3NcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0LnRleHRUcmFja3MgJiYgcnVsZUNvbnRleHQudGV4dFRyYWNrcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJ1bGVDb250ZXh0LnRleHRUcmFja3MubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSBwYXNzZWQgfHwgcnVsZUNvbnRleHQudGV4dFRyYWNrc1tpXS5raW5kID09PSAnY2FwdGlvbnMnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IEZyYWdtZW50VXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9mcmFnbWVudFwiO1xuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01XYWxrZXJcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGNvbWJvYm94X2FjdGl2ZV9kZXNjZW5kYW50OiBSdWxlID0ge1xuICAgIGlkOiBcImNvbWJvYm94X2FjdGl2ZV9kZXNjZW5kYW50XCIsXG4gICAgY29udGV4dDogXCJhcmlhOmNvbWJvYm94XCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJjb21ib2JveF9wb3B1cF9yZWZlcmVuY2VcIl0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc1wiOiBcImNvbWJvYm94X2FjdGl2ZV9kZXNjZW5kYW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF9taXNzaW5nXCI6IFwiY29tYm9ib3hfYWN0aXZlX2Rlc2NlbmRhbnQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX25vdF9pbl9wb3B1cFwiOiBcImNvbWJvYm94X2FjdGl2ZV9kZXNjZW5kYW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF9hY3RpdmVfcm9sZV9pbnZhbGlkXCI6IFwiY29tYm9ib3hfYWN0aXZlX2Rlc2NlbmRhbnQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX2FjdGl2ZV9ub3Rfc2VsZWN0ZWRcIjogXCJjb21ib2JveF9hY3RpdmVfZGVzY2VuZGFudC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiY29tYm9ib3hfYWN0aXZlX2Rlc2NlbmRhbnQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXCI6IFwiJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCcgaXMgdXNlZCBhcHByb3ByaWF0ZWx5IGZvciB0aGlzIGNvbWJvYm94XCIsXG4gICAgICAgICAgICBcIkZhaWxfbWlzc2luZ1wiOiBcIlRoZSBlbGVtZW50IHJlZmVyZW5jZWQgYnkgJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCcgXFxcInswfVxcXCIgZG9lcyBub3QgZXhpc3RcIixcbiAgICAgICAgICAgIFwiRmFpbF9ub3RfaW5fcG9wdXBcIjogXCJUaGUgZWxlbWVudCByZWZlcmVuY2VkIGJ5ICdhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnIFxcXCJ7MH1cXFwiIGRvZXMgbm90IGV4aXN0IHdpdGhpbiB0aGUgcG9wdXAgcmVmZXJlbmNlZCBieSAnaWQnIFxcXCJ7MX1cXFwiXCIsXG4gICAgICAgICAgICBcIkZhaWxfYWN0aXZlX3JvbGVfaW52YWxpZFwiOiBcIlRoZSAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JyBcXFwiezB9XFxcIiByZWZlcmVuY2VzIGFuIGVsZW1lbnQgd2l0aCB0aGUgcm9sZXMgXFxcInsxfVxcXCIsIHdoaWNoIGRvZXMgbm90IGhhdmUgYSB2YWxpZCBBUklBIHJvbGUgb2YgJ29wdGlvbicsICdncmlkY2VsbCcsICdyb3cnLCBvciAndHJlZWl0ZW0nXCIsXG4gICAgICAgICAgICBcIkZhaWxfYWN0aXZlX25vdF9zZWxlY3RlZFwiOiBcIlRoZSAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JyBcXFwiezB9XFxcIiByZWZlcmVuY2VzIGFuIGVsZW1lbnQgdGhhdCBkb2VzIG5vdCBoYXZlICdhcmlhLXNlbGVjdGVkJyBzZXQgdG8gdHJ1ZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIidhcmlhLWFjdGl2ZWRlc2NlbmRhbnQnIG11c3QgYmUgdXNlZCB0byBkZWZpbmUgZm9jdXMgd2l0aGluIHRoZSBjb21ib2JveCBwb3B1cCwgZXhjZXB0IHdoZW4gdXNpbmcgYSBkaWFsb2cgcG9wdXBcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBjYWNoZSA9IENhY2hlVXRpbC5nZXRDYWNoZShydWxlQ29udGV4dC5vd25lckRvY3VtZW50LCBcImNvbWJvYm94XCIsIHt9KTtcbiAgICAgICAgaWYgKCFjYWNoZSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBjYWNoZWRFbGVtID0gY2FjaGVbY29udGV4dFtcImRvbVwiXS5yb2xlUGF0aF07XG4gICAgICAgIGlmICghY2FjaGVkRWxlbSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGNvbnN0IHsgcG9wdXBFbGVtZW50LCBwb3B1cElkIH0gPSBjYWNoZWRFbGVtO1xuICAgICAgICAvLyBJZiB0aGlzIGlzbid0IGRlZmluZWQsIHRoZSBjb21ib2JveCBpcyBwcm9iYWJseSBjb2xsYXBzZWQuIEEgcmVmZXJlbmNlIGVycm9yIGlzXG4gICAgICAgIC8vIGRldGVjdGVkIGluIGNvbWJvYm94X3BvcHVwX3JlZmVyZW5jZVxuICAgICAgICBpZiAoIXBvcHVwRWxlbWVudCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gVGhpcyBydWxlIG9ubHkgYXBwbGllcyBpZiB0aGUgYWN0aXZlZGVzY2VuZGFudCBpcyBzcGVjaWZpZWRcbiAgICAgICAgbGV0IGFjdGl2ZUlkID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIpO1xuICAgICAgICBpZiAoIWFjdGl2ZUlkIHx8IGFjdGl2ZUlkLnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGFjdGl2ZUVsZW0gPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChydWxlQ29udGV4dCwgYWN0aXZlSWQpO1xuICAgICAgICBpZiAoIWFjdGl2ZUVsZW0pIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfbWlzc2luZ1wiLCBbYWN0aXZlSWRdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBmb3VuZCA9IGZhbHNlO1xuXG4gICAgICAgIC8vIGV4YW1pbmUgdGhlIGNoaWxkcmVuXG4gICAgICAgIGlmIChwb3B1cEVsZW1lbnQpIHtcbiAgICAgICAgICAgIGxldCBudyA9IG5ldyBET01XYWxrZXIocG9wdXBFbGVtZW50KTtcbiAgICAgICAgICAgIHdoaWxlICghZm91bmQgJiYgbncubmV4dE5vZGUoKSAmJiBudy5ub2RlICE9IHBvcHVwRWxlbWVudCAmJiBudy5ub2RlICE9IHBvcHVwRWxlbWVudC5uZXh0U2libGluZykge1xuICAgICAgICAgICAgICAgIGlmIChudy5ub2RlLm5vZGVUeXBlID09PSAxICYmIFZpc1V0aWwuaXNOb2RlVmlzaWJsZShudy5ub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG53LmVsZW0oKS5nZXRBdHRyaWJ1dGUoXCJpZFwiKSA9PT0gYWN0aXZlSWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJldFZhbCA9IFtdO1xuXG4gICAgICAgIGlmICghZm91bmQpIHtcbiAgICAgICAgICAgIHJldFZhbC5wdXNoKFJ1bGVQYXNzKFwiRmFpbF9ub3RfaW5fcG9wdXBcIiwgW2FjdGl2ZUlkLCBwb3B1cElkXSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGFjdGl2ZVJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXMoYWN0aXZlRWxlbSwgdHJ1ZSk7XG4gICAgICAgIGxldCB2YWxpZFJvbGVzID0gW1wib3B0aW9uXCIsIFwiZ3JpZGNlbGxcIiwgXCJyb3dcIiwgXCJ0cmVlaXRlbVwiXS5maWx0ZXIoKHZhbGlkUm9sZSkgPT4gYWN0aXZlUm9sZXMuaW5jbHVkZXModmFsaWRSb2xlKSk7XG4gICAgICAgIGlmICh2YWxpZFJvbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0VmFsLnB1c2goUnVsZUZhaWwoXCJGYWlsX2FjdGl2ZV9yb2xlX2ludmFsaWRcIiwgW2FjdGl2ZUlkLCBhY3RpdmVSb2xlcy5qb2luKFwiLFwiKV0pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhY3RpdmVFbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtc2VsZWN0ZWRcIikgIT09IFwidHJ1ZVwiKSB7XG4gICAgICAgICAgICByZXRWYWwucHVzaChSdWxlRmFpbChcIkZhaWxfYWN0aXZlX25vdF9zZWxlY3RlZFwiLCBbYWN0aXZlSWRdKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmV0VmFsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc1wiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgY29tYm9ib3hfYXV0b2NvbXBsZXRlX3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcImNvbWJvYm94X2F1dG9jb21wbGV0ZV92YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpjb21ib2JveFwiLFxuICAgIGRlcGVuZGVuY2llczogW1wiY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlXCJdLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiY29tYm9ib3hfYXV0b2NvbXBsZXRlXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc1wiOiBcIlBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCIsXG4gICAgICAgICAgICBcIkZhaWxfaW5saW5lXCI6IFwiRmFpbF9pbmxpbmVcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NcIjogXCJjb21ib2JveF9hdXRvY29tcGxldGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJjb21ib2JveF9hdXRvY29tcGxldGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX2lubGluZVwiOiBcImNvbWJvYm94X2F1dG9jb21wbGV0ZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiY29tYm9ib3hfYXV0b2NvbXBsZXRlX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc1wiOiBcIlRoZSBjb21ib2JveCBkb2VzIG5vdCB1c2UgJ2FyaWEtYXV0b2NvbXBsZXRlJyB2YWx1ZSAnXFxcImlubGluZVxcXCInIG5vciBkb2VzIGl0IGhhdmUgJ2FyaWEtYXV0b2NvbXBsZXRlJyBkZWZpbmVkIHdpdGhpbiB0aGUgcG9wdXBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiVGhlIGNvbWJvYm94IGhhcyB0aGUgJ2FyaWEtYXV0b2NvbXBsZXRlJyBhdHRyaWJ1dGUgaW5jb3JyZWN0bHkgc2V0IG9uIGFuIGVsZW1lbnQgd2l0aGluIHRoZSBwb3B1cCByZWZlcmVuY2VkIGJ5IFxcXCJ7MH1cXFwiXCIsXG4gICAgICAgICAgICBcIkZhaWxfaW5saW5lXCI6IFwiVGhlIGNvbWJvYm94IGRvZXMgbm90IHN1cHBvcnQgYW4gJ2FyaWEtYXV0b2NvbXBsZXRlJyBhdHRyaWJ1dGUgdmFsdWUgc2V0IHRvICdcXFwiaW5saW5lXFxcIicgXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQSBjb21ib2JveCB0aGF0IHN1cHBvcnRzIGF1dG9jb21wbGV0aW9uIGJlaGF2aW9yIG11c3QgaGF2ZSB0aGUgJ2FyaWEtYXV0b2NvbXBsZXRlJyBhdHRyaWJ1dGUgb25seSBvbiBpdHMgdGV4dCBpbnB1dCBlbGVtZW50IHdpdGggYSB2YWxpZCB2YWx1ZTsgYSB2YWx1ZSBvZiAnXFxcImlubGluZVxcXCInIGlzIG5vdCBzdXBwb3J0ZWRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3sgXG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLCBcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sIFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTiwgXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FIFxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IGNhY2hlID0gQ2FjaGVVdGlsLmdldENhY2hlKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsIFwiY29tYm9ib3hcIiwge30pO1xuICAgICAgICBpZiAoIWNhY2hlKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IGNhY2hlZEVsZW0gPSBjYWNoZVtjb250ZXh0W1wiZG9tXCJdLnJvbGVQYXRoXTtcbiAgICAgICAgaWYgKCFjYWNoZWRFbGVtKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgeyBwb3B1cElkLCBwb3B1cEVsZW1lbnQgfSA9IGNhY2hlZEVsZW07XG4gICAgICAgIGxldCByZXRWYWwgPSBbXTtcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtYXV0b2NvbXBsZXRlXCIpID09PSBcImlubGluZVwiKSB7XG4gICAgICAgICAgICByZXRWYWwucHVzaChSdWxlRmFpbChcIkZhaWxfaW5saW5lXCIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlOyBcbiAgICAgICAgLy8gZXhhbWluZSB0aGUgY2hpbGRyZW5cbiAgICAgICAgaWYgKHBvcHVwRWxlbWVudCAmJiBWaXNVdGlsLmlzTm9kZVZpc2libGUocG9wdXBFbGVtZW50KSkge1xuICAgICAgICAgICAgLy8gaWYgcG9wdXBFbGVtZW50IGl0c2VsZiBoYXMgXCJhcmlhLWF1dG9jb21wbGV0ZVwiXG4gICAgICAgICAgICBwYXNzZWQgPSAhcG9wdXBFbGVtZW50Lmhhc0F0dHJpYnV0ZShcImFyaWEtYXV0b2NvbXBsZXRlXCIpO1xuICAgICAgICAgICAgLy8gaWYgYW55IGNoaWxkIG9mIHBvcHVwRWxlbWVudCBoYXMgXCJhcmlhLWF1dG9jb21wbGV0ZVwiXG4gICAgICAgICAgICBpZiAocGFzc2VkICYmIHBvcHVwRWxlbWVudC5jaGlsZHJlbiAmJiBwb3B1cEVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCBudyA9IG5ldyBET01XYWxrZXIocG9wdXBFbGVtZW50KTtcbiAgICAgICAgICAgICAgICB3aGlsZSAocGFzc2VkICYmIG53Lm5leHROb2RlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG53Lm5vZGUubm9kZVR5cGUgPT09IDEgJiYgVmlzVXRpbC5pc05vZGVWaXNpYmxlKG53Lm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSAhbncuZWxlbSgpLmhhc0F0dHJpYnV0ZShcImFyaWEtYXV0b2NvbXBsZXRlXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG53LmJFbmRUYWcgJiYgbncubm9kZSA9PT0gcG9wdXBFbGVtZW50Lmxhc3RFbGVtZW50Q2hpbGQpIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldFZhbC5wdXNoKFJ1bGVGYWlsKFwiRmFpbF8xXCIsIFtwb3B1cElkXSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJldFZhbC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc1wiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5cbmZ1bmN0aW9uIHBhdHRlcm5EZXRlY3QoZWxlbTogRWxlbWVudCk6IFN0cmluZyB7XG4gICAgLy8gY2hlY2sgJ2V4cGxpY2l0JyByb2xlIGNvbWJvYm94IGFuZCB0aGF0IGl0IGlzIG5vdCA8c2VsZWN0Pi4gXG4gICAgaWYgKGVsZW0udGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInNlbGVjdFwiICYmIGVsZW0uZ2V0QXR0cmlidXRlKFwicm9sZVwiKSAhPT0gXCJjb21ib2JveFwiKSB7XG4gICAgICAgIHJldHVybiBcImltcGxpY2l0XCI7XG4gICAgfSBlbHNlIGlmIChlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiaW5wdXRcIlxuICAgICAgICAmJiAoIWVsZW0uaGFzQXR0cmlidXRlKFwidHlwZVwiKSB8fCBlbGVtLmdldEF0dHJpYnV0ZShcInR5cGVcIikgPT09IFwidGV4dFwiKVxuICAgICAgICAmJiBlbGVtLmhhc0F0dHJpYnV0ZShcImFyaWEtb3duc1wiKSAmJiAhZWxlbS5oYXNBdHRyaWJ1dGUoXCJhcmlhLWNvbnRyb2xzXCIpKSB7XG4gICAgICAgIC8vIExvb2tzIGxpa2UgdGhpcyBpcyBhbiBBUklBIDEuMCBwYXR0ZXJuLCB3aGljaCB0aGUgQVJJQSAxLjIgc3BlYyBzYXlzIHRvIGNvbnRpbnVlIHRvIGFsbG93XG4gICAgICAgIHJldHVybiBcIjEuMFwiO1xuICAgIH0gZWxzZSBpZiAoZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9PSBcImlucHV0XCJcbiAgICAgICAgJiYgZWxlbS5oYXNBdHRyaWJ1dGUoXCJhcmlhLW93bnNcIikgJiYgIWVsZW0uaGFzQXR0cmlidXRlKFwiYXJpYS1jb250cm9sc1wiKSkge1xuICAgICAgICAvLyBMb29rcyBsaWtlIHRoaXMgaXMgYW4gQVJJQSAxLjEgcGF0dGVybiwgd2hpY2ggdGhlIEFSSUEgMS4yIHNwZWMgc2F5cyBpcyBub3cgaW52YWxpZFxuICAgICAgICByZXR1cm4gXCIxLjFcIjtcbiAgICB9XG4gICAgLy8gQXNzdW1lIHRoZXkncmUgdHJ5aW5nIHRvIGRvIHRoZSBsYXRlc3QsIDEuMiBwYXR0ZXJuXG4gICAgcmV0dXJuIFwiMS4yXCI7XG59XG5cbmV4cG9ydCBjb25zdCBjb21ib2JveF9kZXNpZ25fdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiY29tYm9ib3hfZGVzaWduX3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmNvbWJvYm94XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJjb21ib2JveF92ZXJzaW9uXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18xLjBcIjogXCJQYXNzXzEuMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzEuMVwiOiBcIkZhaWxfMS4xXCIsXG4gICAgICAgICAgICBcIlBhc3NfMS4yXCI6IFwiUGFzc18xLjJcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMS4wXCI6IFwiY29tYm9ib3hfZGVzaWduX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xLjFcIjogXCJjb21ib2JveF9kZXNpZ25fdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJQYXNzXzEuMlwiOiBcImNvbWJvYm94X2Rlc2lnbl92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiY29tYm9ib3hfZGVzaWduX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18xLjBcIjogXCJUaGUgY29tYm9ib3ggZGVzaWduIHBhdHRlcm4gaXMgZGV0ZWN0ZWQgYXMgQVJJQSAxLjAsIHdoaWNoIGlzIGFsbG93ZWQgYnkgQVJJQSAxLjJcIixcbiAgICAgICAgICAgIFwiRmFpbF8xLjFcIjogXCJUaGUgY29tYm9ib3ggZGVzaWduIHBhdHRlcm4gaXMgZGV0ZWN0ZWQgYXMgQVJJQSAxLjEsIHdoaWNoIGlzIG5vdCBhbGxvd2VkIGJ5IEFSSUEgMS4yXCIsXG4gICAgICAgICAgICBcIlBhc3NfMS4yXCI6IFwiVGhlIGNvbWJvYm94IGRlc2lnbiBwYXR0ZXJuIGlzIGRldGVjdGVkIGFzIEFSSUEgMS4yXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGhlIGNvbWJvYm94IGRlc2lnbiBwYXR0ZXJuIG11c3QgYmUgdmFsaWQgZm9yIEFSSUEgMS4yXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7IFxuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSwgXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4yXCJdLCBcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sIFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORSBcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKHJ1bGVDb250ZXh0KSB8fCBDb21tb25VdGlsLmlzTm9kZURpc2FibGVkKHJ1bGVDb250ZXh0KSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHBhdHRlcm4gPSBwYXR0ZXJuRGV0ZWN0KHJ1bGVDb250ZXh0KTtcblxuICAgICAgICAvLyBXZSBkb24ndCBhc3Nlc3MgbmF0aXZlIHNlbGVjdCBlbGVtZW50cyBoZXJlXG4gICAgICAgIGlmIChwYXR0ZXJuID09PSBcImltcGxpY2l0XCIpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHRhZ05hbWUgPSBydWxlQ29udGV4dC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGxldCBleHBhbmRlZCA9IChBcmlhVXRpbC5nZXRBcmlhQXR0cmlidXRlKHJ1bGVDb250ZXh0LCBcImFyaWEtZXhwYW5kZWRcIikgfHwgXCJcIikudHJpbSgpLnRvTG93ZXJDYXNlKCkgPT09IFwidHJ1ZVwiO1xuICAgICAgICBsZXQgZWRpdGFibGUgPSB0YWdOYW1lID09PSBcImlucHV0XCIgJiYgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0eXBlXCIpIHx8IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInR5cGVcIikudG9Mb3dlckNhc2UoKSA9PT0gXCJ0ZXh0XCIpO1xuXG4gICAgICAgIGxldCBrZXkgPSBjb250ZXh0W1wiZG9tXCJdLnJvbGVQYXRoO1xuICAgICAgICBpZiAoa2V5KSB7XG4gICAgICAgICAgICBsZXQgY2FjaGUgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUocnVsZUNvbnRleHQub3duZXJEb2N1bWVudCwgXCJjb21ib2JveFwiLCB7fSk7XG4gICAgICAgICAgICBpZiAoIWNhY2hlKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNhY2hlW2tleV0gPSB7XG4gICAgICAgICAgICAgICAgXCJpbnB1dEVsZW1lbnRcIjogZWRpdGFibGUgPyBydWxlQ29udGV4dCA6IG51bGwsXG4gICAgICAgICAgICAgICAgXCJwYXR0ZXJuXCI6IHBhdHRlcm4sXG4gICAgICAgICAgICAgICAgXCJleHBhbmRlZFwiOiBleHBhbmRlZFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShydWxlQ29udGV4dC5vd25lckRvY3VtZW50LCBcImNvbWJvYm94XCIsIGNhY2hlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIE5vIHhwYXRoP1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGF0dGVybiA9PT0gXCIxLjBcIikge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18xLjBcIik7XG4gICAgICAgIH0gZWxzZSBpZiAocGF0dGVybiA9PT0gXCIxLjFcIikge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xLjFcIik7XG4gICAgICAgIH0gZWxzZSBpZiAocGF0dGVybiA9PT0gXCIxLjJcIikge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18xLjJcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGNvbWJvYm94X2ZvY3VzYWJsZV9lbGVtZW50czogUnVsZSA9IHtcbiAgICBpZDogXCJjb21ib2JveF9mb2N1c2FibGVfZWxlbWVudHNcIixcbiAgICBjb250ZXh0OiBcImFyaWE6Y29tYm9ib3hcIixcbiAgICBkZXBlbmRlbmNpZXM6IFtcImNvbWJvYm94X3BvcHVwX3JlZmVyZW5jZVwiXSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXCI6IFwiY29tYm9ib3hfZm9jdXNhYmxlX2VsZW1lbnRzLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF9ub3RfdGFiYmFibGVcIjogXCJjb21ib2JveF9mb2N1c2FibGVfZWxlbWVudHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX3RhYmJhYmxlX2NoaWxkXCI6IFwiY29tYm9ib3hfZm9jdXNhYmxlX2VsZW1lbnRzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJjb21ib2JveF9mb2N1c2FibGVfZWxlbWVudHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXCI6IFwiRE9NIGZvY3VzIGlzIGFsbG93ZWQgb25seSBvbiB0aGUgY29tYm9ib3ggZWxlbWVudCBhcyByZXF1aXJlZFwiLFxuICAgICAgICAgICAgXCJGYWlsX25vdF90YWJiYWJsZVwiOiBcIlRoZSBjb21ib2JveCBlbGVtZW50IGRvZXMgbm90IGFsbG93IERPTSBmb2N1cyBhcyByZXF1aXJlZFwiLFxuICAgICAgICAgICAgXCJGYWlsX3RhYmJhYmxlX2NoaWxkXCI6IFwiVGhlIHBvcHVwIG9mIHRoZSBjb21ib2JveCBoYXMgRE9NIGZvY3VzIG9yIGhhcyAnYXJpYS1hY3RpdmVkZXNjZW5kYW50JyBkZWZpbmVkLCB3aGljaCBpcyBub3QgYWxsb3dlZFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRhYmJhYmxlIGZvY3VzIGZvciB0aGUgY29tYm9ib3ggbXVzdCBiZSBhbGxvd2VkIG9ubHkgb24gdGhlIHRleHQgaW5wdXQsIGV4Y2VwdCB3aGVuIHVzaW5nIGEgZGlhbG9nIHBvcHVwXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7IFxuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sIFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTiwgXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FIFxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IGNhY2hlID0gQ2FjaGVVdGlsLmdldENhY2hlKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsIFwiY29tYm9ib3hcIiwge30pO1xuICAgICAgICBpZiAoIWNhY2hlKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IGNhY2hlZEVsZW0gPSBjYWNoZVtjb250ZXh0W1wiZG9tXCJdLnJvbGVQYXRoXTtcbiAgICAgICAgaWYgKCFjYWNoZWRFbGVtKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgeyBwb3B1cEVsZW1lbnQsIGV4cGFuZGVkIH0gPSBjYWNoZWRFbGVtO1xuICAgICAgICAvLyBJZiB0aGlzIGlzbid0IGRlZmluZWQsIHRoZSBjb21ib2JveCBpcyBwcm9iYWJseSBjb2xsYXBzZWQuIEEgcmVmZXJlbmNlIGVycm9yIGlzXG4gICAgICAgIC8vIGRldGVjdGVkIGluIGNvbWJvYm94X3BvcHVwX3JlZmVyZW5jZVxuICAgICAgICBpZiAoIXBvcHVwRWxlbWVudCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgY29uc3QgcG9wdXBSb2xlID0gQXJpYVV0aWwuZ2V0Um9sZXMocG9wdXBFbGVtZW50LCB0cnVlKVswXTtcblxuICAgICAgICBsZXQgcmV0VmFsID0gW11cbiAgICAgICAgaWYgKCFDb21tb25VdGlsLmlzVGFiYmFibGUocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICByZXRWYWwucHVzaChSdWxlRmFpbChcIkZhaWxfbm90X3RhYmJhYmxlXCIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE9ubHkgbWFrZXMgc2Vuc2UgdG8gY2hlY2sgdGhlIHBvcHVwIHdoZW4gZXhwYW5kZWRcbiAgICAgICAgLy8gdGhpcyBkb2VzIG5vdCBhcHBseSB0byBkaWFsb2dzLCByZXR1cm4gcGFzcyBzaW5jZSB0aGUgbWFpbiBlbGVtZW50IHdhcyBmb2N1c2FibGUgYWJvdmVcbiAgICAgICAgaWYgKGV4cGFuZGVkID09PSBmYWxzZSB8fCBwb3B1cFJvbGUgPT09IFwiZGlhbG9nXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NcIik7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcblxuICAgICAgICAvLyBleGFtaW5lIHRoZSBjaGlsZHJlblxuICAgICAgICBpZiAocG9wdXBFbGVtZW50ICAmJiBWaXNVdGlsLmlzTm9kZVZpc2libGUocG9wdXBFbGVtZW50KSkge1xuICAgICAgICAgICAgLy8gaWYgcG9wdXBFbGVtZW50IGl0c2VsZiBoYXMgXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIlxuICAgICAgICAgICAgcGFzc2VkID0gIUNvbW1vblV0aWwuaXNUYWJiYWJsZShwb3B1cEVsZW1lbnQpICYmICFBcmlhVXRpbC5nZXRBcmlhQXR0cmlidXRlKHBvcHVwRWxlbWVudCwgXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIik7O1xuICAgICAgICAgICAgLy8gaWYgYW55IGNoaWxkIG9mIHBvcHVwRWxlbWVudCBoYXMgXCJhcmlhLWF1dG9jb21wbGV0ZVwiXG4gICAgICAgICAgICBpZiAocGFzc2VkICYmIHBvcHVwRWxlbWVudC5jaGlsZHJlbiAmJiBwb3B1cEVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCBudyA9IG5ldyBET01XYWxrZXIocG9wdXBFbGVtZW50KTtcbiAgICAgICAgICAgICAgICB3aGlsZSAocGFzc2VkICYmIG53Lm5leHROb2RlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG53Lm5vZGUubm9kZVR5cGUgPT09IDEgJiYgVmlzVXRpbC5pc05vZGVWaXNpYmxlKG53Lm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSAhQ29tbW9uVXRpbC5pc1RhYmJhYmxlKG53Lm5vZGUpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIUFyaWFVdGlsLmdldEFyaWFBdHRyaWJ1dGUobncubm9kZSwgXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobncuYkVuZFRhZyAmJiBudy5ub2RlID09PSBwb3B1cEVsZW1lbnQubGFzdEVsZW1lbnRDaGlsZCkgYnJlYWs7ICAgIFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldFZhbC5wdXNoKFJ1bGVGYWlsKFwiRmFpbF90YWJiYWJsZV9jaGlsZFwiKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmV0VmFsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc1wiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDYWNoZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGNvbWJvYm94X2hhc3BvcHVwX3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcImNvbWJvYm94X2hhc3BvcHVwX3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmNvbWJvYm94XCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJjb21ib2JveF9wb3B1cF9yZWZlcmVuY2VcIl0sXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJjb21ib2JveF9oYXNwb3B1cFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NcIjogXCJQYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfcG9wdXBfcm9sZV9pbnZhbGlkXCI6IFwiRmFpbF9wb3B1cF9yb2xlX2ludmFsaWRcIixcbiAgICAgICAgICAgIFwiRmFpbF9jb21ib2JveF9wb3B1cF9yb2xlX21pc21hdGNoXCI6IFwiRmFpbF9jb21ib2JveF9wb3B1cF9yb2xlX21pc21hdGNoXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXCI6IFwiY29tYm9ib3hfaGFzcG9wdXBfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX3BvcHVwX3JvbGVfaW52YWxpZFwiOiBcImNvbWJvYm94X2hhc3BvcHVwX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF9jb21ib2JveF9wb3B1cF9yb2xlX21pc21hdGNoXCI6IFwiY29tYm9ib3hfaGFzcG9wdXBfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImNvbWJvYm94X2hhc3BvcHVwX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc1wiOiBcIlRoZSAnYXJpYS1jb250cm9scycgKEFSSUEgMS4yKSBvciAnYXJpYS1vd25zJyAoQVJJQSAxLjApIGFwcHJvcHJpYXRlbHkgcmVmZXJlbmNlcyBhIHZhbGlkIHBvcHVwICdpZCcgdmFsdWVcIixcbiAgICAgICAgICAgIFwiRmFpbF9wb3B1cF9yb2xlX2ludmFsaWRcIjogXCJUaGUgJ3JvbGUnIHZhbHVlIFxcXCJ7MH1cXFwiIG9mIHRoZSBwb3B1cCBlbGVtZW50IFxcXCJ7MX1cXFwiIHNob3VsZCBiZSBvbmUgb2YgXFxcImxpc3Rib3hcXFwiLCBcXFwiZ3JpZFxcXCIsIFxcXCJ0cmVlXFxcIiBvciBcXFwiZGlhbG9nXFxcIlwiLFxuICAgICAgICAgICAgXCJGYWlsX2NvbWJvYm94X3BvcHVwX3JvbGVfbWlzbWF0Y2hcIjogXCJUaGUgdmFsdWUgb2YgdGhlIGNvbWJvYm94ICdhcmlhLWhhc3BvcHVwJyBhdHRyaWJ1dGUgXFxcInswfVxcXCIgZG9lcyBub3QgbWF0Y2ggdGhlICdyb2xlJyB2YWx1ZSBvZiB0aGUgcG9wdXAgZWxlbWVudCBcXFwiezF9XFxcIlwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSBjb21ib2JveCBhdHRyaWJ1dGUgJ2FyaWEtaGFzcG9wdXAnIHZhbHVlIG11c3QgYmUgYXBwcm9wcmlhdGUgZm9yIHRoZSByb2xlIG9mIHRoZSBlbGVtZW50IHJlZmVyZW5jZWQgYnkgJ2FyaWEtY29udHJvbHMnIChBUklBIDEuMikgb3IgJ2FyaWEtb3ducycgKEFSSUEgMS4wKVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbeyBcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sIFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSwgXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLCBcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkUgXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBjb25zdCBjYWNoZSA9IENhY2hlVXRpbC5nZXRDYWNoZShydWxlQ29udGV4dC5vd25lckRvY3VtZW50LCBcImNvbWJvYm94XCIsIHt9KTtcbiAgICAgICAgaWYgKCFjYWNoZSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGNvbnN0IGNhY2hlS2V5ID0gY29udGV4dFtcImRvbVwiXS5yb2xlUGF0aDtcbiAgICAgICAgY29uc3QgY2FjaGVkRWxlbSA9IGNhY2hlW2NhY2hlS2V5XTtcbiAgICAgICAgaWYgKCFjYWNoZWRFbGVtKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgeyBwb3B1cEVsZW1lbnQsIHBvcHVwSWQgfSA9IGNhY2hlZEVsZW07XG4gICAgICAgIC8vIElmIHRoaXMgaXNuJ3QgZGVmaW5lZCwgdGhlIGNvbWJvYm94IGlzIHByb2JhYmx5IGNvbGxhcHNlZC4gQSByZWZlcmVuY2UgZXJyb3IgaXNcbiAgICAgICAgLy8gZGV0ZWN0ZWQgaW4gY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlXG4gICAgICAgIGlmICghcG9wdXBFbGVtZW50KSByZXR1cm4gbnVsbDtcbiAgICAgICAgLy8gQ2hlY2sgdGhhdCBwb3B1cCByb2xlIGlzIGxpc3Rib3gsIGdyaWQsIHRyZWUsIG9yIGRpYWxvZyBhbmQgdGhhdCBpdCBtYXRjaGVzIHRoZSBjb21ib2JveFxuICAgICAgICBsZXQgcG9wdXBSb2xlcyA9IEFyaWFVdGlsLmdldFJvbGVzKHBvcHVwRWxlbWVudCwgdHJ1ZSk7XG4gICAgICAgIGxldCB2YWxpZFJvbGVzID0gW1wibGlzdGJveFwiLCBcImdyaWRcIiwgXCJ0cmVlXCIsIFwiZGlhbG9nXCJdLmZpbHRlcigodmFsaWRSb2xlKSA9PiBwb3B1cFJvbGVzLmluY2x1ZGVzKHZhbGlkUm9sZSkpO1xuICAgICAgICBpZiAodmFsaWRSb2xlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfcG9wdXBfcm9sZV9pbnZhbGlkXCIsIFtwb3B1cFJvbGVzLmpvaW4oXCIsXCIpLCBwb3B1cElkXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgcG9wdXBSb2xlID0gdmFsaWRSb2xlc1swXTtcbiAgICAgICAgICAgIGxldCBoYXNwb3B1cFZhbCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtaGFzcG9wdXBcIikgfHwgXCJsaXN0Ym94XCI7XG4gICAgICAgICAgICAvLyBQb3B1cCByb2xlIG11c3QgbWF0Y2ggYXJpYS1oYXNwb3B1cCB1bmxlc3MgcG9wdXBSb2xlIGlzIGxpc3Rib3gsIHRoZW4gYXJpYS1oYXNwb3B1cCBzaG91bGQgbm90IGJlIGRlZmluZWQgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoaGFzcG9wdXBWYWwgIT09IHBvcHVwUm9sZSkge1xuICAgICAgICAgICAgICAgIGlmIChwb3B1cFJvbGUgIT09IFwibGlzdGJveFwiIHx8IHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImFyaWEtaGFzcG9wdXBcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF9jb21ib2JveF9wb3B1cF9yb2xlX21pc21hdGNoXCIsIFtoYXNwb3B1cFZhbCwgcG9wdXBSb2xlXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG5pbXBvcnQgeyBDYWNoZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBjb21ib2JveF9wb3B1cF9yZWZlcmVuY2U6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmNvbWJvYm94XCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJjb21ib2JveF9kZXNpZ25fdmFsaWRcIl0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJjb21ib2JveF9wb3B1cF9yZWZlcmVuY2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJQYXNzXzEuMF9leHBhbmRlZFwiOiBcImNvbWJvYm94X3BvcHVwX3JlZmVyZW5jZS5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NfMS4wX2NvbGxhcHNlZFwiOiBcImNvbWJvYm94X3BvcHVwX3JlZmVyZW5jZS5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NfMS4yX2V4cGFuZGVkXCI6IFwiY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc18xLjJfY29sbGFwc2VkXCI6IFwiY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xLjBfbWlzc2luZ19vd25zXCI6IFwiY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xLjJfbWlzc2luZ19jb250cm9sc1wiOiBcImNvbWJvYm94X3BvcHVwX3JlZmVyZW5jZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMS4wX3BvcHVwX3JlZmVyZW5jZV9taXNzaW5nXCI6IFwiY29tYm9ib3hfcG9wdXBfcmVmZXJlbmNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xLjJfcG9wdXBfcmVmZXJlbmNlX21pc3NpbmdcIjogXCJjb21ib2JveF9wb3B1cF9yZWZlcmVuY2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsX2NvbWJvYm94X2V4cGFuZGVkX2hpZGRlblwiOiBcImNvbWJvYm94X3BvcHVwX3JlZmVyZW5jZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfY29tYm9ib3hfY29sbGFwc2VkX3Zpc2libGVcIjogXCJjb21ib2JveF9wb3B1cF9yZWZlcmVuY2UuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSAnYXJpYS1jb250cm9scycgKGZvciBBUklBIDEuMikgb3IgdGhlICdhcmlhLW93bnMnIChmb3IgQVJJQSAxLjApIGF0dHJpYnV0ZSBvZiB0aGUgZXhwYW5kZWQgY29tYm9ib3ggbXVzdCByZWZlcmVuY2UgYSB2YWxpZCBwb3B1cCAnaWQnIHZhbHVlXCIsXG4gICAgICAgICAgICBcIlBhc3NfMS4wX2V4cGFuZGVkXCI6IFwiVGhlIGNvbWJvYm94IHBvcHVwIHJlZmVyZW5jZWQgYnkgJ2FyaWEtb3ducycgKEFSSUEgMS4wKSBleGlzdHMgYW5kIGlzIHZpc2libGVcIixcbiAgICAgICAgICAgIFwiUGFzc18xLjBfY29sbGFwc2VkXCI6IFwiVGhlIGNvbWJvYm94IHBvcHVwIGluIGl0cyBjb2xsYXBzZWQgc3RhdGUgZG9lcyBub3QgcmVmZXJlbmNlIGFueSB2aXNpYmxlIHBvcHVwIGFzIHJlcXVpcmVkXCIsXG4gICAgICAgICAgICBcIlBhc3NfMS4yX2V4cGFuZGVkXCI6IFwiVGhlIGNvbWJvYm94IHBvcHVwIHJlZmVyZW5jZWQgYnkgJ2FyaWEtY29udHJvbHMnIChBUklBIDEuMikgZXhpc3RzIGFuZCBpcyB2aXNpYmxlXCIsXG4gICAgICAgICAgICBcIlBhc3NfMS4yX2NvbGxhcHNlZFwiOiBcIlRoZSBjb21ib2JveCBwb3B1cCBpbiBpdHMgY29sbGFwc2VkIHN0YXRlIGRvZXMgbm90IHJlZmVyZW5jZSBhbnkgdmlzaWJsZSBwb3B1cCBhcyByZXF1aXJlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzEuMF9taXNzaW5nX293bnNcIjogXCJUaGUgJ2FyaWEtb3ducycgYXR0cmlidXRlIG9mIHRoZSBleHBhbmRlZCBjb21ib2JveCBpcyBtaXNzaW5nXCIsXG4gICAgICAgICAgICBcIkZhaWxfMS4yX21pc3NpbmdfY29udHJvbHNcIjogXCJUaGUgJ2FyaWEtY29udHJvbHMnIGF0dHJpYnV0ZSBvZiB0aGUgZXhwYW5kZWQgY29tYm9ib3ggaXMgbWlzc2luZ1wiLFxuICAgICAgICAgICAgXCJGYWlsXzEuMF9wb3B1cF9yZWZlcmVuY2VfbWlzc2luZ1wiOiBcIlRoZSAnYXJpYS1vd25zJyBhdHRyaWJ1dGUgXFxcInswfVxcXCIgb2YgdGhlIGV4cGFuZGVkIGNvbWJvYm94IGRvZXMgbm90IHJlZmVyZW5jZSBhIHZhbGlkIHBvcHVwICdpZCcgdmFsdWVcIixcbiAgICAgICAgICAgIFwiRmFpbF8xLjJfcG9wdXBfcmVmZXJlbmNlX21pc3NpbmdcIjogXCJUaGUgJ2FyaWEtY29udHJvbHMnIGF0dHJpYnV0ZSBcXFwiezB9XFxcIiBvZiB0aGUgZXhwYW5kZWQgY29tYm9ib3ggZG9lcyBub3QgcmVmZXJlbmNlIGEgdmFsaWQgcG9wdXAgJ2lkJyB2YWx1ZVwiLFxuICAgICAgICAgICAgXCJGYWlsX2NvbWJvYm94X2V4cGFuZGVkX2hpZGRlblwiOiBcIlRoZSBjb21ib2JveCAnYXJpYS1leHBhbmRlZCcgYXR0cmlidXRlIGlzIHRydWUsIGJ1dCB0aGUgY29tYm9ib3ggcG9wdXAgaXMgbm90IHZpc2libGVcIixcbiAgICAgICAgICAgIFwiRmFpbF9jb21ib2JveF9jb2xsYXBzZWRfdmlzaWJsZVwiOiBcIlRoZSBjb21ib2JveCAnYXJpYS1leHBhbmRlZCcgYXR0cmlidXRlIGlzIGZhbHNlLCBidXQgdGhlIGNvbWJvYm94IHBvcHVwIGlzIHZpc2libGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFt7XG4gICAgICAgIFwiNGU4YWI2XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18xLjBfZXhwYW5kZWRcIjogXCJmYWlsXCIsXG4gICAgICAgICAgICBcIlBhc3NfMS4wX2NvbGxhcHNlZFwiOiBcImZhaWxcIixcbiAgICAgICAgICAgIFwiUGFzc18xLjJfZXhwYW5kZWRcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIlBhc3NfMS4yX2NvbGxhcHNlZFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xLjBfbWlzc2luZ19vd25zXCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgICAgICBcIkZhaWxfMS4yX21pc3NpbmdfY29udHJvbHNcIjogXCJmYWlsXCIsXG4gICAgICAgICAgICBcIkZhaWxfMS4wX3BvcHVwX3JlZmVyZW5jZV9taXNzaW5nXCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgICAgICBcIkZhaWxfMS4yX3BvcHVwX3JlZmVyZW5jZV9taXNzaW5nXCI6IFwiZmFpbFwiLFxuICAgICAgICAgICAgXCJGYWlsX2NvbWJvYm94X2V4cGFuZGVkX2hpZGRlblwiOiBcImluYXBwbGljYWJsZVwiLFxuICAgICAgICAgICAgXCJGYWlsX2NvbWJvYm94X2NvbGxhcHNlZF92aXNpYmxlXCI6IFwiaW5hcHBsaWNhYmxlXCJcbiAgICAgICAgfVxuICAgIH1dLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IGNhY2hlID0gQ2FjaGVVdGlsLmdldENhY2hlKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsIFwiY29tYm9ib3hcIiwge30pO1xuICAgICAgICBpZiAoIWNhY2hlKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgY2FjaGVLZXkgPSBjb250ZXh0W1wiZG9tXCJdLnJvbGVQYXRoO1xuICAgICAgICBjb25zdCBjYWNoZWRFbGVtID0gY2FjaGVbY2FjaGVLZXldO1xuICAgICAgICBpZiAoIWNhY2hlZEVsZW0pIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCB7IHBhdHRlcm4sIGV4cGFuZGVkIH0gPSBjYWNoZWRFbGVtO1xuXG4gICAgICAgIGxldCBwb3B1cElkO1xuICAgICAgICBsZXQgcG9wdXBFbGVtZW50O1xuICAgICAgICBpZiAocGF0dGVybiA9PT0gXCIxLjBcIikge1xuICAgICAgICAgICAgaWYgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhcmlhLW93bnNcIikpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgY29tYm9ib3ggaXNuJ3QgZXhwYW5kZWQsIHRoaXMgYXR0cmlidXRlIGlzbid0IHJlcXVpcmVkXG4gICAgICAgICAgICAgICAgcmV0dXJuICFleHBhbmRlZCA/IG51bGwgOiBSdWxlRmFpbChcIkZhaWxfMS4wX21pc3Npbmdfb3duc1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBvcHVwSWQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhcmlhLW93bnNcIik7XG4gICAgICAgICAgICBwb3B1cEVsZW1lbnQgPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChydWxlQ29udGV4dCwgcG9wdXBJZCk7XG4gICAgICAgICAgICBpZiAoIXBvcHVwRWxlbWVudCkge1xuICAgICAgICAgICAgICAgIC8vIElmIHRoZSBjb21ib2JveCBpc24ndCBleHBhbmRlZCwgdGhpcyBhdHRyaWJ1dGUgaXNuJ3QgcmVxdWlyZWRcbiAgICAgICAgICAgICAgICByZXR1cm4gIWV4cGFuZGVkID8gbnVsbCA6IFJ1bGVGYWlsKFwiRmFpbF8xLjBfcG9wdXBfcmVmZXJlbmNlX21pc3NpbmdcIiwgW3BvcHVwSWRdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChwYXR0ZXJuID09PSBcIjEuMlwiKSB7XG4gICAgICAgICAgICBpZiAoIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImFyaWEtY29udHJvbHNcIikpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgY29tYm9ib3ggaXNuJ3QgZXhwYW5kZWQsIHRoaXMgYXR0cmlidXRlIGlzbid0IHJlcXVpcmVkXG4gICAgICAgICAgICAgICAgcmV0dXJuICFleHBhbmRlZCA/IG51bGwgOiBSdWxlRmFpbChcIkZhaWxfMS4yX21pc3NpbmdfY29udHJvbHNcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwb3B1cElkID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYXJpYS1jb250cm9sc1wiKTtcbiAgICAgICAgICAgIHBvcHVwRWxlbWVudCA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKHJ1bGVDb250ZXh0LCBwb3B1cElkKTtcbiAgICAgICAgICAgIGlmICghcG9wdXBFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIGNvbWJvYm94IGlzbid0IGV4cGFuZGVkLCB0aGlzIGF0dHJpYnV0ZSBpc24ndCByZXF1aXJlZFxuICAgICAgICAgICAgICAgIHJldHVybiAhZXhwYW5kZWQgPyBudWxsIDogUnVsZUZhaWwoXCJGYWlsXzEuMl9wb3B1cF9yZWZlcmVuY2VfbWlzc2luZ1wiLCBbcG9wdXBJZF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBXZSBoYXZlIGFuIGVsZW1lbnQsIHN0aWNrIGl0IGluIHRoZSBjYWNoZSBhbmQgdGhlbiBjaGVjayBpdHMgcm9sZVxuICAgICAgICBjYWNoZWRFbGVtLnBvcHVwSWQgPSBwb3B1cElkO1xuICAgICAgICBjYWNoZWRFbGVtLnBvcHVwRWxlbWVudCA9IHBvcHVwRWxlbWVudDtcblxuXG4gICAgICAgIGlmIChleHBhbmRlZCAmJiAhVmlzVXRpbC5pc05vZGVWaXNpYmxlKHBvcHVwRWxlbWVudCkpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfY29tYm9ib3hfZXhwYW5kZWRfaGlkZGVuXCIpO1xuICAgICAgICB9IGVsc2UgaWYgKCFleHBhbmRlZCAmJiBWaXNVdGlsLmlzTm9kZVZpc2libGUocG9wdXBFbGVtZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF9jb21ib2JveF9jb2xsYXBzZWRfdmlzaWJsZVwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXR0ZXJuID09PSBcIjEuMFwiKSB7XG4gICAgICAgICAgICBpZiAoZXhwYW5kZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzEuMF9leHBhbmRlZFwiKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18xLjBfY29sbGFwc2VkXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGV4cGFuZGVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18xLjJfZXhwYW5kZWRcIik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMS4yX2NvbGxhcHNlZFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5cbmV4cG9ydCBjb25zdCBkZWJ1Z19wYXRoczogUnVsZSA9IHtcbiAgICBpZDogXCJkZWJ1Z19wYXRoc1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipcIixcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBgYCxcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IGBgXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIlwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFtcIkRFQlVHXCJdLFxuICAgICAgICBudW06IFwiMVwiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LklORk9STUFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfRk9VUlxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgcnVsZUNvbnRleHQuc2V0QXR0cmlidXRlKFwiZG9tUGF0aFwiLCBjb250ZXh0W1wiZG9tXCJdLnJvbGVQYXRoKTtcbiAgICAgICAgcnVsZUNvbnRleHQuc2V0QXR0cmlidXRlKFwiYXJpYVBhdGhcIiwgY29udGV4dFtcImFyaWFcIl0ucm9sZVBhdGgpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGNvbnN0IGRldGVjdG9yX3RhYmJhYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcImRldGVjdG9yX3RhYmJhYmxlXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IGBgLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogYGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBpZDogW1wiRVhURU5TSU9OU1wiXSxcbiAgICAgICAgbnVtOiBcIjFcIiwgLy8gbnVtOiBbIFwiMi40LjRcIiwgXCJ4LnkuelwiIF0gYWxzbyBhbGxvd2VkXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5JTkZPUk1BVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX0ZPVVJcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmICghQ29tbW9uVXRpbC5pc1RhYmJhYmxlKHJ1bGVDb250ZXh0KSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGhpZXJDb250ZXh0ID0gY29udGV4dEhpZXJhcmNoaWVzLmFyaWFbY29udGV4dEhpZXJhcmNoaWVzLmFyaWEubGVuZ3RoIC0gMV07XG4gICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiLCBbXSwgW3tcbiAgICAgICAgICAgIG5hbWU6IGhpZXJDb250ZXh0LmF0dHJpYnV0ZXMubmFtZSxcbiAgICAgICAgICAgIHJvbGU6IGhpZXJDb250ZXh0LnJvbGUsXG4gICAgICAgICAgICB0YWJpbmRleDogcGFyc2VJbnQocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidGFiaW5kZXhcIikgfHwgXCIwXCIpXG4gICAgICAgIH1dKTtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGNvbnN0IGRpcl9hdHRyaWJ1dGVfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZGlyX2F0dHJpYnV0ZV92YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbZGlyXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiVmFsZXJpZV9FbGVtX0RpclZhbGlkXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiZGlyX2F0dHJpYnV0ZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImRpcl9hdHRyaWJ1dGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImRpcl9hdHRyaWJ1dGVfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJJbnZhbGlkIHZhbHVlIHVzZWQgZm9yIHRoZSAnZGlyJyBhdHRyaWJ1dGVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCInZGlyJyBhdHRyaWJ1dGUgdmFsdWUgbXVzdCBiZSBcXFwibHRyXFxcIiwgXFxcInJ0bFxcXCIsIG9yIFxcXCJhdXRvXFxcIlwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgZGlyU3RyID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiZGlyXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGxldCBwYXNzZWQgPSBkaXJTdHIgPT0gXCJsdHJcIiB8fCBkaXJTdHIgPT0gXCJydGxcIiB8fCBkaXJTdHIgPT0gXCJhdXRvXCI7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlTWFudWFsLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBkb3dubG9hZF9rZXlib2FyZF9jb250cm9sbGFibGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZG93bmxvYWRfa2V5Ym9hcmRfY29udHJvbGxhYmxlXCIsXG4gICAgY29udGV4dDogXCJkb206YVtocmVmXSxkb206YXJlYVtocmVmXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiSEFBQ19NZWRpYV9Eb2N1bWVudFRyaWdnZXIyXCI6IHtcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJNYW51YWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJkb3dubG9hZF9rZXlib2FyZF9jb250cm9sbGFibGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImRvd25sb2FkX2tleWJvYXJkX2NvbnRyb2xsYWJsZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwiVmVyaWZ5IHRoYXQgdGhlIGZpbGUgZG93bmxvYWQgbWVjaGFuaXNtIGRvZXMgbm90IGNhdXNlIGEga2V5Ym9hcmQgdHJhcFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkZpbGUgZG93bmxvYWQgbWVjaGFuaXNtcyBzaG91bGQgYmUga2V5Ym9hcmQtb3BlcmFibGUgYW5kIHByZXNlcnZlIHBhZ2UgZm9jdXMgbG9jYXRpb25cIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuMS4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgaHJlZiA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImhyZWZcIik7XG4gICAgICAgIGxldCBleHQgPSBDb21tb25VdGlsLmdldEZpbGVFeHQoaHJlZik7XG4gICAgICAgIGxldCBwYXNzZWQgPSAhW1wiLmRvY3hcIiwgXCIuZG9jXCIsIFwiLnBkZlwiLCBcIi5vZHRcIl0uaW5jbHVkZXMoZXh0KTtcbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZU1hbnVhbChcIk1hbnVhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSwgUnVsZVBvdGVudGlhbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGRyYWdnYWJsZV9hbHRlcm5hdGl2ZV9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZHJhZ2dhYmxlX2FsdGVybmF0aXZlX2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbZHJhZ2dhYmxlXVwiLFxuICAgIGRlcGVuZGVuY2llczogW10sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJkcmFnZ2FibGVfYWx0ZXJuYXRpdmVfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIC8vIFwicGFzc19hbHRlcm5hdGl2ZVwiOiBcImRyYWdnYWJsZV9hbHRlcm5hdGl2ZV9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJwYXNzX3VuZHJhZ2dhYmxlXCI6IFwiZHJhZ2dhYmxlX2FsdGVybmF0aXZlX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9hbHRlcm5hdGl2ZVwiOiBcImRyYWdnYWJsZV9hbHRlcm5hdGl2ZV9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIkEgZHJhZ2dhYmxlIGVsZW1lbnQgbXVzdCBoYXZlIGEgXFxcInNpbmdsZSBwb2ludGVyXFxcIiBhbHRlcm5hdGl2ZVwiLFxuICAgICAgICAgICAgLy8gXCJwYXNzX2FsdGVybmF0aXZlXCI6IFwiVGhlIGRyYWdnYWJsZSBlbGVtZW50IFxcXCJ7MH1cXFwiIGhhcyBhIFxcXCJzaW5nbGUgcG9pbnRlclxcXCIgYWx0ZXJuYXRpdmVcIixcbiAgICAgICAgICAgIFwicGFzc191bmRyYWdnYWJsZVwiOiBcIlRoZSBlbGVtZW50IFxcXCJ7MH1cXFwiIGlzIG5vdCBkcmFnZ2FibGVcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX2FsdGVybmF0aXZlXCI6IFwiRW5zdXJlIHRoZSBkcmFnZ2FibGUgZWxlbWVudCBcXFwiezB9XFxcIiBoYXMgYSBcXFwic2luZ2xlIHBvaW50ZXJcXFwiIGFsdGVybmF0aXZlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbIFwiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIG51bTogW1wiMi41LjdcIl0sXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgY29uc3Qgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvY2FsZUxvd2VyQ2FzZSgpOyBcbiAgICAgICAgICBcbiAgICAgICAgLy9pZ25vcmUgY2VydGFpbiBlbGVtZW50c1xuICAgICAgICBpZiAoQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgW1wicHJlXCIsIFwiY29kZVwiLCBcInNjcmlwdFwiLCBcIm1ldGFcIl0pICE9PSBudWxsIFxuICAgICAgICAgICAgfHwgbm9kZU5hbWUgPT09IFwiYm9keVwiIHx8IG5vZGVOYW1lID09PSBcImh0bWxcIiApXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJkcmFnZ2FibGVcIikgPT09ICd0cnVlJykgXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF9hbHRlcm5hdGl2ZVwiLCBbbm9kZU5hbWVdKTtcbiAgICAgICAgZWxzZSBpZiAocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiZHJhZ2dhYmxlXCIpID09PSAnZmFsc2UnKSBcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NfdW5kcmFnZ2FibGVcIiwgW25vZGVOYW1lXSk7XG4gICAgICAgIGVsc2UgXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5pbXBvcnQgeyBBUklBRGVmaW5pdGlvbnMgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBRGVmaW5pdGlvbnNcIjtcbmltcG9ydCB7IEFSSUFNYXBwZXIgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBTWFwcGVyXCI7XG5pbXBvcnQgeyBBY2NOYW1lVXRpbCB9IGZyb20gXCIuLi91dGlsL0FjY05hbWVVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBlbGVtZW50X2FjY2Vzc2tleV9sYWJlbGxlZDogUnVsZSA9IHtcbiAgICBpZDogXCJlbGVtZW50X2FjY2Vzc2tleV9sYWJlbGxlZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbYWNjZXNza2V5XVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiSEFBQ19BY2Nlc3NrZXlfTmVlZExhYmVsXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImVsZW1lbnRfYWNjZXNza2V5X2xhYmVsbGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJlbGVtZW50X2FjY2Vzc2tleV9sYWJlbGxlZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZWxlbWVudF9hY2Nlc3NrZXlfbGFiZWxsZWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlRoZSBlbGVtZW50IHdpdGggYW4gYXNzaWduZWQgJ2FjY2Vzc2tleScgYXR0cmlidXRlIGRvZXMgbm90IGhhdmUgYW4gYXNzb2NpYXRlZCBsYWJlbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkFuIGVsZW1lbnQgd2l0aCBhbiBhc3NpZ25lZCAnYWNjZXNza2V5JyBhdHRyaWJ1dGUgbXVzdCBoYXZlIGFuIGFzc29jaWF0ZWQgbGFiZWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3sgXG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLCBcbiAgICAgICAgXCJudW1cIjogW1wiMy4zLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sIFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORSBcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IGlzIGhpZGRlbiBvciBkaXNhYmxlZFxuICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShydWxlQ29udGV4dCkgfHwgQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgLy9za2lwIGlmIHRoZSBlbGVtZW50IGlzIHRhYmJhYmxlLCBpdCdzIGNvdmVyZWQgYnkgb3RoZXIgcnVsZXNcbiAgICAgICAgaWYgKENvbW1vblV0aWwuaXNUYWJiYWJsZShydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgbGV0IHJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXMocnVsZUNvbnRleHQsIHRydWUpO1xuICAgICAgICAvL3NraXAgdGhlIG5hdGl2ZSBlbGVtZW50LCBtb3N0bHkgdGV4dCBlbGVtZW50c1xuICAgICAgICBpZiAoIXJvbGVzIHx8IHJvbGVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgICAgIGxldCBwYXR0ZXJucyA9IEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlc1swXV1cbiAgICAgICAgaWYgKCFwYXR0ZXJucyB8fCAhcGF0dGVybnMubmFtZUZyb20pIFxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIC8vIGlnbm9yZSBpZiBhY2Nlc3NibGUgbmFtZSBpcyByZXF1aXJlZCAoY2hlY2tlZCBpbiBvdGhlciBydWxlcykgb3IgcHJvaGliaXRlZCAodGV4dCBlbGVtZW50KSAgICBcbiAgICAgICAgaWYgKHBhdHRlcm5zLm5hbWVSZXF1aXJlZCB8fCAhcGF0dGVybnMubmFtZUZyb20gfHwgcGF0dGVybnMubmFtZUZyb20uaW5jbHVkZXMoXCJwcm9oaWJpdGVkXCIpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICBcbiAgICAgICAgLy9zcGVjaWFsIGNhc2U6IGxlZ2VuZCwgYXMgYSBjaGlsZCBvZiBhIGZpZWxkc2V0LCBkZWxlZ2F0ZSB0aGUgYWNjZXNza2V5IGNvbW1hbmQgdG8gdGhlIGZpZWxkIG9mIHRoZSBmaWVsZHNldCB3aGljaCBpcyBjb3ZlcmVkIGJ5IG90aGVyIHJ1bGVzIFxuICAgICAgICBpZiAocnVsZUNvbnRleHQucGFyZW50RWxlbWVudCAmJiBydWxlQ29udGV4dC5wYXJlbnRFbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdmaWVsZHNldCcpXG4gICAgICAgICAgICByZXR1cm47XG5cbiAgICAgICAgLy8gY2hlY2sgaWYgYWNjZXNzaWJsZSBuYW1lIGV4aXN0c1xuICAgICAgICBjb25zdCBwYWlyID0gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKHBhaXIgJiYgcGFpci5uYW1lICYmIHBhaXIubmFtZS50cmltKCkubGVuZ3RoID4gMClcbiAgICAgICAgLy9pZiAoQVJJQU1hcHBlci5jb21wdXRlTmFtZShydWxlQ29udGV4dCkudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDYWNoZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGVsZW1lbnRfYWNjZXNza2V5X3VuaXF1ZTogUnVsZSA9IHtcbiAgICBpZDogXCJlbGVtZW50X2FjY2Vzc2tleV91bmlxdWVcIixcbiAgICBjb250ZXh0OiBcImRvbToqW2FjY2Vzc2tleV1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9FbGVtX1VuaXF1ZUFjY2Vzc0tleVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImVsZW1lbnRfYWNjZXNza2V5X3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImVsZW1lbnRfYWNjZXNza2V5X3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZWxlbWVudF9hY2Nlc3NrZXlfdW5pcXVlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiJ2FjY2Vzc2tleScgYXR0cmlidXRlIHZhbHVlIG9uIHRoZSBlbGVtZW50IGlzIG5vdCB1bmlxdWVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCInYWNjZXNza2V5JyBhdHRyaWJ1dGUgdmFsdWVzIG9uIGVhY2ggZWxlbWVudCBtdXN0IGJlIHVuaXF1ZSBmb3IgdGhlIHBhZ2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIkhUTUxcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgbWFwID0gQ2FjaGVVdGlsLmdldENhY2hlKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsIFwiZWxlbWVudF9hY2Nlc3NrZXlfdW5pcXVlXCIsIHt9KTtcbiAgXG4gICAgICAgIGxldCBrZXkgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhY2Nlc3NrZXlcIik7XG5cbiAgICAgICAgbGV0IHBhc3NlZCA9ICEoa2V5IGluIG1hcCk7XG4gICAgICAgIG1hcFtrZXldID0gdHJ1ZTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuY29uc3QgREVQUkVDQVRFRF9FTEVNRU5UUyA9IFtcbiAgICAvKiogb3JpZ2luYWwgKi9cbiAgICBcImFwcGxldFwiLCBcImJhc2Vmb250XCIsIFwiY2VudGVyXCIsIFwiZGlyXCIsIFwiZm9udFwiLCBcImlzaW5kZXhcIiwgXCJsaXN0aW5nXCIsXG4gICAgXCJwbGFpbnRleHRcIiwgXCJzcGFjZXJcIiwgXCJzXCIsIFwic3RyaWtlXCIsIFwidVwiLCBcInhtcFwiLFxuICAgIC8qKiBhZGRlZCBmcm9tIGh0dHBzOi8vZGV2LnczLm9yZy9odG1sNS9wZi1zdW1tYXJ5L29ic29sZXRlLmh0bWwgKi9cbiAgICBcImFjcm9ueW1cIiwgXCJmcmFtZVwiLCBcImZyYW1lc2V0XCIsIFwibm9mcmFtZXNcIiwgXCJub2VtYmVkXCIsIFwiYmlnXCIsIFwiYmxpbmtcIiwgXCJtYXJxdWVlXCIsIFwidHRcIixcblxuXVxuXG5jb25zdCBERVBSRUNBVEVEX0hUTUxfR0xPQkFMX0FUVFJJQlVURVMgPSBbXG4gICAgLyoqIG9yaWdpbmFsICovXG4gICAgXCJhbGlnblwiLCBcImxpbmtcIiwgXCJhcmNoaXZlXCIsIFwiYmFja2dyb3VuZFwiLCBcImJnY29sb3JcIiwgXCJjbGVhclwiLCBcImNvZGVcIiwgXCJjb2xvclwiLFxuICAgIFwiY29tcGFjdFwiLCBcImZhY2VcIiwgXCJoc3BhY2VcIiwgXCJsYW5ndWFnZVwiLCBcImxpbmtcIiwgXCJub3NoYWRlXCIsIFwibm93cmFwXCIsIFwib2JqZWN0XCIsXG4gICAgXCJwcm9tcHRcIiwgXCJzdGFydFwiLCBcInRleHRcIiwgXCJ2ZXJzaW9uXCIsIFwidmxpbmtcIiwgXCJ2c3BhY2VcIlxuXVxuXG5jb25zdCBERVBSRUNBVEVEX0VMRU1FTlRfQVRUUklCVVRFUyA9IHtcbiAgICAvKiogb3JpZ2luYWwgKi9cbiAgICBcInRkXCI6IFtcImhlaWdodFwiLCBcIndpZHRoXCIsIFwiYWJiclwiLCBcImF4aXNcIiwgXCJjaGFyXCIsIFwiY2hhcm9mZlwiLCBcImhlaWdodFwiLCBcIm5vd3JhcFwiLCBcInZhbGlnblwiLCBcIndpZHRoXCIsIFwiYWxpZ25cIiwgXCJiZ2NvbG9yXCJdLFxuICAgIFwidGhcIjogW1wiaGVpZ2h0XCIsIFwid2lkdGhcIiwgXCJhYmJyXCIsIFwiYXhpc1wiLCBcImNoYXJvZmZcIiwgXCJoZWlnaHRcIiwgXCJiZ2NvbG9yXCIsIFwiYWxpZ25cIiwgXCJub3dyYXBcIiwgXCJjaGFyXCIsIFwidmFsaWduXCIsIFwid2lkdGhcIl0sXG4gICAgXCJsaVwiOiBbXCJ0eXBlXCIsIFwidmFsdWVcIiwgXCJ0eXBlXCJdLFxuICAgIFwidWxcIjogW1widHlwZVwiLCBcImNvbXBhY3RcIl0sXG4gICAgXCJwcmVcIjogW1wid2lkdGhcIl0sXG5cbiAgICAvKiogYWRkZWQgZnJvbSBodHRwczovL2Rldi53My5vcmcvaHRtbDUvcGYtc3VtbWFyeS9vYnNvbGV0ZS5odG1sICovXG4gICAgXCJtZXRhXCI6IFtcImh0dHAtZXF1aXZcIl0sXG4gICAgXCJhXCI6IFtcImNoYXJzZXRcIiwgXCJjb29yZHNcIiwgXCJzaGFwZVwiLCBcInJldlwiLCBcInNjaGVtZVwiXSxcbiAgICBcImxpbmtcIjogW1wicmV2XCIsIFwiY2hhcnNldFwiLCBcInRhcmdldFwiXSxcbiAgICBcImltZ1wiOiBbXCJuYW1lXCIsIFwibG9uZ2Rlc2NcIiwgXCJhbGlnblwiLCBcImhzcGFjZVwiLCBcInZzcGFjZVwiLCBcImJvcmRlclwiXSxcbiAgICBcImFyZWFcIjogW1wibm9ocmVmXCJdLFxuICAgIFwiaGVhZFwiOiBbXCJwcm9maWxlXCJdLFxuICAgIFwiaHRtbFwiOiBbXCJ2ZXJzaW9uXCJdLFxuICAgIFwiaWZyYW1lXCI6IFtcImxvbmdkZXNjXCIsIFwiYWxpZ25cIiwgXCJmcmFtZWJvcmRlclwiLCBcIm1hcmdpbmhlaWdodFwiLCBcIm1hcmdpbndpZHRoXCIsIFwic2Nyb2xsaW5nXCJdLFxuICAgIFwib2JqZWN0XCI6IFtcImFyY2hpdmVcIiwgXCJjb2RlXCIsIFwiY29kZWJhc2VcIiwgXCJjb2RldHlwZVwiLCBcImRlY2xhcmVcIiwgXCJzdGFuZGJ5XCIsIFwiYWxpZ25cIiwgXCJoc3BhY2VcIiwgXCJ2c3BhY2VcIiwgXCJib3JkZXJcIl0sXG4gICAgXCJwYXJhbVwiOiBbXCJ0eXBlXCIsIFwidmFsdWV0eXBlXCJdLFxuICAgIFwic2NyaXB0XCI6IFtcImxhbmd1YWdlXCJdLFxuICAgIFwiYm9keVwiOiBbXCJhbGlua1wiLCBcImJhY2tncm91bmRcIiwgXCJiZ2NvbG9yXCIsIFwibGlua1wiLCBcInRleHRcIiwgXCJ2bGlua1wiXSxcbiAgICBcImJyXCI6IFtcImNsZWFyXCJdLFxuICAgIFwiY2FwdGlvblwiOiBbXCJhbGlnblwiXSxcbiAgICBcImNvbFwiOiBbXCJhbGlnblwiLCBcImNoYXJcIiwgXCJjaGFyb2ZmXCIsIFwidmFsaWduXCIsIFwid2lkdGhcIl0sXG4gICAgXCJkaXZcIjogW1wiYWxpZ25cIl0sXG4gICAgXCJkbFwiOiBbXCJjb21wYWN0XCJdLFxuICAgIFwiaHJcIjogW1wiYWxpZ25cIiwgXCJub3NoYWRlXCIsIFwic2l6ZVwiLCBcIndpZHRoXCIsIFwiYWxpZ25cIl0sXG4gICAgXCJoMlwiOiBbXCJhbGlnblwiXSxcbiAgICBcImgzXCI6IFtcImFsaWduXCJdLFxuICAgIFwiaDRcIjogW1wiYWxpZ25cIl0sXG4gICAgXCJoNVwiOiBbXCJhbGlnblwiXSxcbiAgICBcImg2XCI6IFtcImFsaWduXCJdLFxuICAgIFwiaW5wdXRcIjogW1wiYWxpZ25cIiwgXCJ1c2VtYXBcIl0sXG4gICAgXCJsZWdlbmRcIjogW1wiYWxpZ25cIl0sXG4gICAgXCJtZW51XCI6IFtcImNvbXBhY3RcIl0sXG4gICAgXCJvbFwiOiBbXCJjb21wYWN0XCIsIFwidHlwZVwiLCBcInR5cGVcIl0sXG4gICAgXCJwXCI6IFtcImFsaWduXCJdLFxuICAgIFwidGFibGVcIjogW1wiYmdjb2xvclwiLCBcImNlbGxwYWRkaW5nXCIsIFwiY2VsbHNwYWNpbmdcIiwgXCJmcmFtZVwiLCBcInJ1bGVzXCIsIFwid2lkdGhcIiwgXCJhbGlnblwiXSxcbiAgICBcInRib2R5XCI6IFtcImFsaWduXCIsIFwiY2hhclwiLCBcInZhbGlnblwiLCBcImNoYXJvZmZcIl0sXG4gICAgXCJ0Zm9vdFwiOiBbXCJhbGlnblwiLCBcImNoYXJvZmZcIiwgXCJjaGFyXCIsIFwidmFsaWduXCJdLFxuICAgIFwidGhlYWRcIjogW1wiY2hhclwiLCBcImNoYXJvZmZcIiwgXCJ2YWxpZ25cIiwgXCJhbGlnblwiXSxcbiAgICBcInRyXCI6IFtcImFsaWduXCIsIFwiYmdjb2xvclwiLCBcImNoYXJcIiwgXCJjaGFyb2ZmXCIsIFwidmFsaWduXCJdXG59XG5cbmZ1bmN0aW9uIGFycmF5VG9Db250ZXh0U3RyKG9iaiwgdHlwZSkge1xuICAgIGxldCBzdHIgPSBcIlwiO1xuICAgIGZvciAoY29uc3QgcHJvcCBvZiBvYmopIHtcbiAgICAgICAgaWYgKHN0ciAhPT0gJycgJiYgIXN0ci5lbmRzV2l0aCgnLCAnKSkgc3RyICs9IFwiLCBcIjtcbiAgICAgICAgaWYgKHR5cGUgPT09ICdIVE1MX0VMRU1FTlRTJylcbiAgICAgICAgICAgIHN0ciArPSAnZG9tOicgKyBwcm9wO1xuICAgICAgICBlbHNlIGlmICh0eXBlID09PSAnSFRNTF9BVFRSSUJVVEVTJylcbiAgICAgICAgICAgIHN0ciArPSAnZG9tOipbJyArIHByb3AgKyBcIl1cIjtcbiAgICB9XG4gICAgcmV0dXJuIHN0cjtcbn1cblxuZnVuY3Rpb24gb2JqVG9Db250ZXh0U3RyKG9iaiwgdHlwZTogc3RyaW5nKSB7XG4gICAgbGV0IHN0ciA9IFwiXCI7XG4gICAgZm9yIChjb25zdCBwcm9wIGluIG9iaikge1xuICAgICAgICBpZiAoc3RyICE9PSAnJyAmJiAhc3RyLmVuZHNXaXRoKCcsICcpKSBzdHIgKz0gXCIsIFwiO1xuICAgICAgICBpZiAodHlwZSA9PT0gJ0hUTUxfRUxFTUVOVF9BVFRSSUJVVEVTJykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIG9ialtwcm9wXSBhcyBTdHJpbmdbXSkge1xuICAgICAgICAgICAgICAgIGlmIChzdHIgIT09ICcnICYmICFzdHIuZW5kc1dpdGgoXCIsIFwiKSkgc3RyICs9IFwiLCBcIjtcbiAgICAgICAgICAgICAgICBzdHIgKz0gJ2RvbTonICsgcHJvcCArICdbJyArIGl0ZW0gKyAnXSc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gXG4gICAgfVxuICAgIHJldHVybiBzdHI7XG59XG5cbmV4cG9ydCBjb25zdCBlbGVtZW50X2F0dHJpYnV0ZV9kZXByZWNhdGVkOiBSdWxlID0ge1xuICAgIGlkOiBcImVsZW1lbnRfYXR0cmlidXRlX2RlcHJlY2F0ZWRcIixcbiAgICBjb250ZXh0OiBcImRvbTphcHBsZXQsIGRvbTpiYXNlZm9udCwgZG9tOmNlbnRlciwgZG9tOmRpciwgZG9tOmZvbnQsIGRvbTppc2luZGV4LCBkb206bGlzdGluZywgZG9tOm1lbnUsIGRvbTpwbGFpbnRleHQsIGRvbTpzcGFjZXIsIGRvbTpzLCBkb206c3RyaWtlLCBkb206dSwgZG9tOnhtcCwgZG9tOmFjcm9ueW0sIGRvbTpmcmFtZSwgZG9tOmZyYW1lc2V0LCBkb206bm9mcmFtZXMsIGRvbTpub2VtYmVkLCBkb206YmlnLCBkb206YmxpbmssIGRvbTptYXJxdWVlLCBkb206dHROYU5kb206KlthbGlnbl0sIGRvbToqW2xpbmtdLCBkb206KlthcmNoaXZlXSwgZG9tOipbYmFja2dyb3VuZF0sIGRvbToqW2JnY29sb3JdLCBkb206KltjbGVhcl0sIGRvbToqW2NvZGVdLCBkb206Kltjb2xvcl0sIGRvbToqW2NvbXBhY3RdLCBkb206KltmYWNlXSwgZG9tOipbaHNwYWNlXSwgZG9tOipbbGFuZ3VhZ2VdLCBkb206KltsaW5rXSwgZG9tOipbbm9zaGFkZV0sIGRvbToqW25vd3JhcF0sIGRvbToqW29iamVjdF0sIGRvbToqW3Byb21wdF0sIGRvbToqW3N0YXJ0XSwgZG9tOipbdGV4dF0sIGRvbToqW3ZlcnNpb25dLCBkb206Klt2bGlua10sIGRvbToqW3ZzcGFjZV1OYU5kb206dGRbaGVpZ2h0XSwgZG9tOnRkW3dpZHRoXSwgZG9tOnRkW2FiYnJdLCBkb206dGRbYXhpc10sIGRvbTp0ZFtjaGFyXSwgZG9tOnRkW2NoYXJvZmZdLCBkb206dGRbaGVpZ2h0XSwgZG9tOnRkW25vd3JhcF0sIGRvbTp0ZFt2YWxpZ25dLCBkb206dGRbd2lkdGhdLCBkb206dGRbYWxpZ25dLCBkb206dGRbYmdjb2xvcl0sIGRvbTp0aFtoZWlnaHRdLCBkb206dGhbd2lkdGhdLCBkb206dGhbYWJicl0sIGRvbTp0aFtheGlzXSwgZG9tOnRoW2NoYXJvZmZdLCBkb206dGhbaGVpZ2h0XSwgZG9tOnRoW2JnY29sb3JdLCBkb206dGhbYWxpZ25dLCBkb206dGhbbm93cmFwXSwgZG9tOnRoW2NoYXJdLCBkb206dGhbdmFsaWduXSwgZG9tOnRoW3dpZHRoXSwgZG9tOmxpW3R5cGVdLCBkb206bGlbdmFsdWVdLCBkb206bGlbdHlwZV0sIGRvbTp1bFt0eXBlXSwgZG9tOnVsW2NvbXBhY3RdLCBkb206cHJlW3dpZHRoXSwgZG9tOm1ldGFbaHR0cC1lcXVpdl0sIGRvbTphW2NoYXJzZXRdLCBkb206YVtjb29yZHNdLCBkb206YVtzaGFwZV0sIGRvbTphW3Jldl0sIGRvbTphW3NjaGVtZV0sIGRvbTpsaW5rW3Jldl0sIGRvbTpsaW5rW2NoYXJzZXRdLCBkb206bGlua1t0YXJnZXRdLCBkb206aW1nW25hbWVdLCBkb206aW1nW2xvbmdkZXNjXSwgZG9tOmltZ1thbGlnbl0sIGRvbTppbWdbaHNwYWNlXSwgZG9tOmltZ1t2c3BhY2VdLCBkb206aW1nW2JvcmRlcl0sIGRvbTphcmVhW25vaHJlZl0sIGRvbTpoZWFkW3Byb2ZpbGVdLCBkb206aHRtbFt2ZXJzaW9uXSwgZG9tOmlmcmFtZVtsb25nZGVzY10sIGRvbTppZnJhbWVbYWxpZ25dLCBkb206aWZyYW1lW2ZyYW1lYm9yZGVyXSwgZG9tOmlmcmFtZVttYXJnaW5oZWlnaHRdLCBkb206aWZyYW1lW21hcmdpbndpZHRoXSwgZG9tOmlmcmFtZVtzY3JvbGxpbmddLCBkb206b2JqZWN0W2FyY2hpdmVdLCBkb206b2JqZWN0W2NvZGVdLCBkb206b2JqZWN0W2NvZGViYXNlXSwgZG9tOm9iamVjdFtjb2RldHlwZV0sIGRvbTpvYmplY3RbZGVjbGFyZV0sIGRvbTpvYmplY3Rbc3RhbmRieV0sIGRvbTpvYmplY3RbYWxpZ25dLCBkb206b2JqZWN0W2hzcGFjZV0sIGRvbTpvYmplY3RbdnNwYWNlXSwgZG9tOm9iamVjdFtib3JkZXJdLCBkb206cGFyYW1bdHlwZV0sIGRvbTpwYXJhbVt2YWx1ZXR5cGVdLCBkb206c2NyaXB0W2xhbmd1YWdlXSwgZG9tOmJvZHlbYWxpbmtdLCBkb206Ym9keVtiYWNrZ3JvdW5kXSwgZG9tOmJvZHlbYmdjb2xvcl0sIGRvbTpib2R5W2xpbmtdLCBkb206Ym9keVt0ZXh0XSwgZG9tOmJvZHlbdmxpbmtdLCBkb206YnJbY2xlYXJdLCBkb206Y2FwdGlvblthbGlnbl0sIGRvbTpjb2xbYWxpZ25dLCBkb206Y29sW2NoYXJdLCBkb206Y29sW2NoYXJvZmZdLCBkb206Y29sW3ZhbGlnbl0sIGRvbTpjb2xbd2lkdGhdLCBkb206ZGl2W2FsaWduXSwgZG9tOmRsW2NvbXBhY3RdLCBkb206aHJbYWxpZ25dLCBkb206aHJbbm9zaGFkZV0sIGRvbTpocltzaXplXSwgZG9tOmhyW3dpZHRoXSwgZG9tOmhyW2FsaWduXSwgZG9tOmgyW2FsaWduXSwgZG9tOmgzW2FsaWduXSwgZG9tOmg0W2FsaWduXSwgZG9tOmg1W2FsaWduXSwgZG9tOmg2W2FsaWduXSwgZG9tOmlucHV0W2FsaWduXSwgZG9tOmlucHV0W3VzZW1hcF0sIGRvbTpsZWdlbmRbYWxpZ25dLCBkb206bWVudVtjb21wYWN0XSwgZG9tOm9sW2NvbXBhY3RdLCBkb206b2xbdHlwZV0sIGRvbTpvbFt0eXBlXSwgZG9tOnBbYWxpZ25dLCBkb206dGFibGVbYmdjb2xvcl0sIGRvbTp0YWJsZVtjZWxscGFkZGluZ10sIGRvbTp0YWJsZVtjZWxsc3BhY2luZ10sIGRvbTp0YWJsZVtmcmFtZV0sIGRvbTp0YWJsZVtydWxlc10sIGRvbTp0YWJsZVt3aWR0aF0sIGRvbTp0YWJsZVthbGlnbl0sIGRvbTp0Ym9keVthbGlnbl0sIGRvbTp0Ym9keVtjaGFyXSwgZG9tOnRib2R5W3ZhbGlnbl0sIGRvbTp0Ym9keVtjaGFyb2ZmXSwgZG9tOnRmb290W2FsaWduXSwgZG9tOnRmb290W2NoYXJvZmZdLCBkb206dGZvb3RbY2hhcl0sIGRvbTp0Zm9vdFt2YWxpZ25dLCBkb206dGhlYWRbY2hhcl0sIGRvbTp0aGVhZFtjaGFyb2ZmXSwgZG9tOnRoZWFkW3ZhbGlnbl0sIGRvbTp0aGVhZFthbGlnbl0sIGRvbTp0clthbGlnbl0sIGRvbTp0cltiZ2NvbG9yXSwgZG9tOnRyW2NoYXJdLCBkb206dHJbY2hhcm9mZl0sIGRvbTp0clt2YWxpZ25dXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImVsZW1lbnRfYXR0cmlidXRlX2RlcHJlY2F0ZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2VsZW1cIjogXCJlbGVtZW50X2F0dHJpYnV0ZV9kZXByZWNhdGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9hdHRyXCI6IFwiZWxlbWVudF9hdHRyaWJ1dGVfZGVwcmVjYXRlZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfZWxlbV9hdHRyXCI6IFwiZWxlbWVudF9hdHRyaWJ1dGVfZGVwcmVjYXRlZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZWxlbWVudF9hdHRyaWJ1dGVfZGVwcmVjYXRlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJmYWlsX2VsZW1cIjogXCJUaGUgPHswfT4gZWxlbWVudCBpcyBkZXByZWNhdGVkIGluIEhUTUwgNVwiLFxuICAgICAgICAgICAgXCJmYWlsX2F0dHJcIjogXCJUaGUgSFRNTCBhdHRyaWJ1dGUocykgXFxcInswfVxcXCIgaXMgZGVwcmVjYXRlZCBpbiBIVE1MIDVcIixcbiAgICAgICAgICAgIFwiZmFpbF9lbGVtX2F0dHJcIjogXCJUaGUgSFRNTCBhdHRyaWJ1dGUocykgXFxcInswfVxcXCIgaXMgZGVwcmVjYXRlZCBmb3IgdGhlIDx7MX0+IGVsZW1lbnQgaW4gSFRNTCA1XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQXZvaWQgdXNlIG9mIG9ic29sZXRlIGZlYXR1cmVzIGlmIHBvc3NpYmxlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7IFxuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiXSwgXG4gICAgICAgIFwibnVtXCI6IFtcIkhUTUxcIl0sIFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLCBcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRSBcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG5cbiAgICAgICAgLy8gSFRNTFVuaXQgYXV0byBhZGRzIGEgdGJvZHlbYWxpZ249bGVmdF0gdG8gdGFibGVzIGlmIHRib2R5IGlzIG1pc3NpbmchXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInRib2R5XCIgJiYgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiYWxpZ25cIikpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lm5vZGVOYW1lLmluY2x1ZGVzKFwiLVwiKSkge1xuICAgICAgICAgICAgLy8gVGhpcyBpcyBhIHdlYmNvbXBvbmVudCBlbGVtZW50LCBIVE1MIGRvZXNuJ3QgZGVmaW5lIHdoYXQncyBkZXByZWNhdGVkXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICBsZXQgcmV0ID0gW107XG4gICAgICAgIC8vIGNoZWNrIGlmIGl0J3MgYSBkZXByZWNhdGVkIGVsZW1lbnRcbiAgICAgICAgaWYgKERFUFJFQ0FURURfRUxFTUVOVFMuaW5jbHVkZXMobm9kZU5hbWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2VsZW1cIiwgW25vZGVOYW1lXSk7XG5cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNoZWNrIGlmIGl0J3MgYSBkZXByZWNhdGVkIEhUTUwgZ2xvYmFsIGF0dHJpYnV0ZVxuICAgICAgICBjb25zdCBhdHRycyA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZU5hbWVzKCk7XG4gICAgICAgIGxldCB2aW9sYXRpb25zID0gJyc7XG4gICAgICAgIGZvciAoY29uc3QgYXR0ciBvZiBhdHRycykge1xuICAgICAgICAgICAgaWYgKERFUFJFQ0FURURfSFRNTF9HTE9CQUxfQVRUUklCVVRFUy5pbmNsdWRlcyhhdHRyKSkge1xuICAgICAgICAgICAgICAgIGlmICh2aW9sYXRpb25zICE9PSAnJykgdmlvbGF0aW9ucyArPSAnLCAnO1xuICAgICAgICAgICAgICAgIHZpb2xhdGlvbnMgKz0gYXR0cjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodmlvbGF0aW9ucyAhPT0gJycpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfYXR0clwiLCBbdmlvbGF0aW9uc10pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2hlY2sgaWYgaXQncyBhIGRlcHJlY2F0ZWQgSFRNTCBlbGVtZW50ICYgYXR0cmlidXRlXG4gICAgICAgIHZpb2xhdGlvbnMgPSAnJztcbiAgICAgICAgaWYgKG5vZGVOYW1lIGluIERFUFJFQ0FURURfRUxFTUVOVF9BVFRSSUJVVEVTKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGF0dHIgb2YgYXR0cnMpIHtcbiAgICAgICAgICAgICAgICBpZiAoREVQUkVDQVRFRF9FTEVNRU5UX0FUVFJJQlVURVNbbm9kZU5hbWVdICYmIERFUFJFQ0FURURfRUxFTUVOVF9BVFRSSUJVVEVTW25vZGVOYW1lXS5pbmNsdWRlcyhhdHRyKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodmlvbGF0aW9ucyAhPT0gJycpIHZpb2xhdGlvbnMgKz0gJywgJztcbiAgICAgICAgICAgICAgICAgICAgdmlvbGF0aW9ucyArPSBhdHRyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh2aW9sYXRpb25zICE9PSAnJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfZWxlbV9hdHRyXCIsIFt2aW9sYXRpb25zLCBub2RlTmFtZV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEZyYWdtZW50VXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9mcmFnbWVudFwiO1xuXG5leHBvcnQgY29uc3QgZWxlbWVudF9pZF91bmlxdWU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZWxlbWVudF9pZF91bmlxdWVcIixcbiAgICBjb250ZXh0OiBcImRvbToqW2lkXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX0VsZW1fVW5pcXVlSWRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcInBvdGVudGlhbF9lbXB0eVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJwb3RlbnRpYWxfaW5fdXNlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJlbGVtZW50X2lkX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcInBhc3NcIjogXCJlbGVtZW50X2lkX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9lbXB0eVwiOiBcImVsZW1lbnRfaWRfdW5pcXVlLmh0bWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX2luX3VzZVwiOiBcImVsZW1lbnRfaWRfdW5pcXVlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFbGVtZW50ICdpZCcgYXR0cmlidXRlIHZhbHVlcyBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYSBkb2N1bWVudFwiLFxuICAgICAgICAgICAgXCJwYXNzXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX2VtcHR5XCI6IFwiVGhlIDx7MH0+IGVsZW1lbnQgaGFzIHRoZSBpZCBcXFwiezF9XFxcIiB0aGF0IGlzIGVtcHR5XCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9pbl91c2VcIjogXCJUaGUgPHswfT4gZWxlbWVudCBoYXMgdGhlIGlkIFxcXCJ7MX1cXFwiIHRoYXQgaXMgYWxyZWFkeSBpbiB1c2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIkhUTUxcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbe1xuICAgICAgICBcIjNlYTBjOFwiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9lbXB0eVwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX2luX3VzZVwiOiBcImZhaWxcIlxuICAgICAgICB9XG4gICAgfV0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAgIGxldCBpZCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImlkXCIpO1xuXG4gICAgICAgIC8vIEluIHRoZSBjYXNlIHRoYXQgaWQgaXMgZW1wdHkgd2Ugc2hvdWxkIHRyaWdnZXIgYSB2aW9sYXRpb24gcmlnaHQgYXdheSB3aXRoIG91dCBjaGVja2luZyBcbiAgICAgICAgLy8gZm9yIHVuaXF1ZW5lc3MuXG4gICAgICAgIGlmIChpZCA9PT0gXCJcIikge1xuICAgICAgICAgICAgLy9yZXR1cm4gbmV3IFZhbGlkYXRpb25SZXN1bHQoZmFsc2UsIFtydWxlQ29udGV4dF0sICcnLCAnJywgW3J1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksIGlkXSk7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF9lbXB0eVwiLCBbcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSwgaWRdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBlbGVtZW50ID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQocnVsZUNvbnRleHQsIGlkKTtcbiAgICAgICAgbGV0IHBhc3NlZCA9IGVsZW1lbnQgPT09IHJ1bGVDb250ZXh0O1xuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIFtydWxlQ29udGV4dF0sICcnLCAnJywgcGFzc2VkID09IHRydWUgPyBbXSA6IFtydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLCBpZF0pO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfaW5fdXNlXCIsIFtydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLCBpZF0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHksIGVSdWxlQ29uZmlkZW5jZSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgTGFuZ1V0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvbGFuZ1wiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5pbXBvcnQgeyBBUklBTWFwcGVyIH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQU1hcHBlclwiO1xuaW1wb3J0IHsgQWNjTmFtZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BY2NOYW1lVXRpbFwiO1xuXG5jb25zdCB2YWxpZGF0ZUxhbmcgPSAoY29udGV4dDogUnVsZUNvbnRleHQpOiBudW1iZXIgPT4ge1xuICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwibGFuZ1wiKSkge1xuICAgICAgICBpZiAobm9kZU5hbWUgIT09IFwiaHRtbFwiICYmIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImxhbmdcIikgPT09IFwiXCIpIHtcbiAgICAgICAgICAgIC8vIEl0J3Mgb2theSB0byBoYXZlIGEgbGFuZz1cIlwiIGlmIG5vdCBvbiBodG1sXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgbGFuZ1N0ciA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImxhbmdcIik7XG4gICAgICAgICAgICBpZiAoIUxhbmdVdGlsLnZhbGlkUHJpbWFyeUxhbmcobGFuZ1N0cikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghTGFuZ1V0aWwuaXNCY3A0NyhsYW5nU3RyKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAyO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ4bWw6bGFuZ1wiKSkge1xuICAgICAgICBpZiAobm9kZU5hbWUgIT09IFwiaHRtbFwiICYmIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInhtbDpsYW5nXCIpID09PSBcIlwiKSB7XG4gICAgICAgICAgICAvLyBJdCdzIG9rYXkgdG8gaGF2ZSBhIGxhbmc9XCJcIiBpZiBub3Qgb24gaHRtbFxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IGxhbmdTdHIgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ4bWw6bGFuZ1wiKTtcbiAgICAgICAgICAgIGlmICghTGFuZ1V0aWwudmFsaWRQcmltYXJ5TGFuZyhsYW5nU3RyKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFMYW5nVXRpbC5pc0JjcDQ3KGxhbmdTdHIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIDA7XG59XG5cbmV4cG9ydCBjb25zdCBodG1sX2xhbmdfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaHRtbF9sYW5nX3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJkb206aHRtbFtsYW5nXSwgZG9tOmh0bWxbeG1sOmxhbmddXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiaHRtbF9sYW5nX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiaHRtbF9sYW5nX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiaHRtbF9sYW5nX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiaHRtbF9sYW5nX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF80XCI6IFwiaHRtbF9sYW5nX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJodG1sX2xhbmdfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJMYW5nIGhhcyBhIHZhbGlkIHByaW1hcnkgbGFuZyBhbmQgY29uZm9ybXMgdG8gQkNQIDQ3XCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlNwZWNpZmllZCAnbGFuZycgYXR0cmlidXRlIGRvZXMgbm90IGluY2x1ZGUgYSB2YWxpZCBwcmltYXJ5IGxhbmd1YWdlXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIlNwZWNpZmllZCAnbGFuZycgYXR0cmlidXRlIGRvZXMgbm90IGNvbmZvcm0gdG8gQkNQIDQ3XCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcIlNwZWNpZmllZCAneG1sOmxhbmcnIGF0dHJpYnV0ZSBkb2VzIG5vdCBpbmNsdWRlIGEgdmFsaWQgcHJpbWFyeSBsYW5ndWFnZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzRcIjogXCJTcGVjaWZpZWQgJ3htbDpsYW5nJyBhdHRyaWJ1dGUgZG9lcyBub3QgY29uZm9ybSB0byBCQ1AgNDdcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgZGVmYXVsdCBodW1hbiBsYW5ndWFnZSBvZiB0aGUgcGFnZSBtdXN0IGJlIHZhbGlkIGFuZCBzcGVjaWZpZWQgaW4gYWNjb3JkYW5jZSB3aXRoIEJDUCA0N1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMy4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW3tcbiAgICAgICAgXCJiNWMzZjhcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImZhaWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcImluYXBwbGljYWJsZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzRcIjogXCJpbmFwcGxpY2FibGVcIlxuICAgICAgICB9LFxuICAgICAgICBcImJmMDUxYVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZmFpbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcImZhaWxcIixcbiAgICAgICAgICAgIFwiRmFpbF80XCI6IFwiaW5hcHBsaWNhYmxlXCJcbiAgICAgICAgfSxcbiAgICAgICAgLy8gVE9ETzogQUNUOiBNaXNtYXRjaCBiZWNhdXNlIHRoZXkgZG9uJ3QgY2hlY2sgdGhlIGh0bWwgZWxlbWVudCBpbiB0aGUgc2FtZSBydWxlXG4gICAgICAgIC8vIFwiZGU0NmU0XCI6IHtcbiAgICAgICAgLy8gICAgIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAvLyAgICAgXCJGYWlsXzFcIjogXCJmYWlsXCIsXG4gICAgICAgIC8vICAgICBcIkZhaWxfMlwiOiBcInBhc3NcIixcbiAgICAgICAgLy8gICAgIFwiRmFpbF8zXCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgIC8vICAgICBcIkZhaWxfNFwiOiBcImluYXBwbGljYWJsZVwiXG4gICAgICAgIC8vIH1cbiAgICB9XSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBsZXQgcmVhc29uQ29kZSA9IHZhbGlkYXRlTGFuZyhjb250ZXh0KTtcbiAgICAgICAgLy8gVGhpcyBpcyBkb25lIGhlcmUgaW5zdGVhZCBvZiBpbiB2YWxpZGF0ZUxhbmcgc28gdGhhdCB0aGUgZ2VuSGVscCBjb2RlIHdpbGwgcGljayBpdCB1cFxuICAgICAgICBsZXQgcmV0QXJyID0gW1xuICAgICAgICAgICAgUnVsZVBhc3MoXCJQYXNzXzBcIiksXG4gICAgICAgICAgICBSdWxlRmFpbChcIkZhaWxfMVwiKSxcbiAgICAgICAgICAgIFJ1bGVGYWlsKFwiRmFpbF8yXCIpLFxuICAgICAgICAgICAgUnVsZUZhaWwoXCJGYWlsXzNcIiksXG4gICAgICAgICAgICBSdWxlRmFpbChcIkZhaWxfNFwiKVxuICAgICAgICBdXG4gICAgICAgIHJldHVybiByZXRBcnJbcmVhc29uQ29kZV07XG4gICAgfVxufVxuXG5leHBvcnQgY29uc3QgZWxlbWVudF9sYW5nX3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcImVsZW1lbnRfbGFuZ192YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbbGFuZ10sIGRvbToqW3htbDpsYW5nXVwiLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImVsZW1lbnRfbGFuZ192YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImVsZW1lbnRfbGFuZ192YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcImVsZW1lbnRfbGFuZ192YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcImVsZW1lbnRfbGFuZ192YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfNFwiOiBcImVsZW1lbnRfbGFuZ192YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZWxlbWVudF9sYW5nX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiTGFuZyBoYXMgYSB2YWxpZCBwcmltYXJ5IGxhbmcgYW5kIGNvbmZvcm1zIHRvIEJDUCA0N1wiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJTcGVjaWZpZWQgJ2xhbmcnIGF0dHJpYnV0ZSBkb2VzIG5vdCBpbmNsdWRlIGEgdmFsaWQgcHJpbWFyeSBsYW5ndWFnZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJTcGVjaWZpZWQgJ2xhbmcnIGF0dHJpYnV0ZSBkb2VzIG5vdCBjb25mb3JtIHRvIEJDUCA0N1wiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJTcGVjaWZpZWQgJ3htbDpsYW5nJyBhdHRyaWJ1dGUgZG9lcyBub3QgaW5jbHVkZSBhIHZhbGlkIHByaW1hcnkgbGFuZ3VhZ2VcIixcbiAgICAgICAgICAgIFwiRmFpbF80XCI6IFwiU3BlY2lmaWVkICd4bWw6bGFuZycgYXR0cmlidXRlIGRvZXMgbm90IGNvbmZvcm0gdG8gQkNQIDQ3XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGhlIGNoYW5nZSBpbiBsYW5ndWFnZSBvZiBzcGVjaWZpYyBjb250ZW50IG11c3QgYmUgdmFsaWQgYW5kIHNwZWNpZmllZCBpbiBhY2NvcmRhbmNlIHdpdGggQkNQIDQ3XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIzLjEuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFt7XG4gICAgICAgIC8vIFwiYjVjM2Y4XCI6IHtcbiAgICAgICAgLy8gICAgIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAvLyAgICAgXCJGYWlsXzFcIjogXCJmYWlsXCIsXG4gICAgICAgIC8vICAgICBcIkZhaWxfMlwiOiBcImluYXBwbGljYWJsZVwiLFxuICAgICAgICAvLyAgICAgXCJGYWlsXzNcIjogXCJpbmFwcGxpY2FibGVcIixcbiAgICAgICAgLy8gICAgIFwiRmFpbF80XCI6IFwiaW5hcHBsaWNhYmxlXCJcbiAgICAgICAgLy8gfSxcbiAgICAgICAgLy8gXCJiZjA1MWFcIjoge1xuICAgICAgICAvLyAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgIC8vICAgICBcIkZhaWxfMVwiOiBcImZhaWxcIixcbiAgICAgICAgLy8gICAgIFwiRmFpbF8yXCI6IFwicGFzc1wiLFxuICAgICAgICAvLyAgICAgXCJGYWlsXzNcIjogXCJmYWlsXCIsXG4gICAgICAgIC8vICAgICBcIkZhaWxfNFwiOiBcImluYXBwbGljYWJsZVwiXG4gICAgICAgIC8vIH0sXG4gICAgICAgIC8vIFRPRE86IEFDVDogTWlzbWF0Y2ggYmVjYXVzZSB0aGV5IGRvbid0IGNoZWNrIHRoZSBodG1sIGVsZW1lbnQgaW4gdGhlIHNhbWUgcnVsZVxuICAgICAgICBcImRlNDZlNFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZmFpbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcImluYXBwbGljYWJsZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzRcIjogXCJpbmFwcGxpY2FibGVcIlxuICAgICAgICB9XG4gICAgfV0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgLy8gSWYgaXQncyB0aGUgSFRNTCBub2RlLCB0aGF0J3MgaGFuZGxlZCBieSBodG1sX2xhbmdfdmFsaWRcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSBcImh0bWxcIikgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCByZWFzb25Db2RlID0gdmFsaWRhdGVMYW5nKGNvbnRleHQpO1xuICAgICAgICAvLyBUaGlzIGlzIGRvbmUgaGVyZSBpbnN0ZWFkIG9mIGluIHZhbGlkYXRlTGFuZyBzbyB0aGF0IHRoZSBnZW5IZWxwIGNvZGUgd2lsbCBwaWNrIGl0IHVwXG4gICAgICAgIGxldCByZXRBcnIgPSBbXG4gICAgICAgICAgICBSdWxlUGFzcyhcIlBhc3NfMFwiKSxcbiAgICAgICAgICAgIFJ1bGVGYWlsKFwiRmFpbF8xXCIpLFxuICAgICAgICAgICAgUnVsZUZhaWwoXCJGYWlsXzJcIiksXG4gICAgICAgICAgICBSdWxlRmFpbChcIkZhaWxfM1wiKSxcbiAgICAgICAgICAgIFJ1bGVGYWlsKFwiRmFpbF80XCIpXG4gICAgICAgIF1cbiAgICAgICAgbGV0IHJldFZhbCA9IHJldEFycltyZWFzb25Db2RlXTtcbiAgICAgICAgaWYgKHJldFZhbC52YWx1ZVsxXSAhPT0gZVJ1bGVDb25maWRlbmNlLlBBU1MpIHtcbiAgICAgICAgICAgIC8vIEVuc3VyZSB0aGF0IHRoZXJlJ3MgYWN0dWFsbHkgY29udGVudCBvZiB0aGlzIGVsZW1lbnQgLSBza2lwIHN1YnRyZWVzIHRoYXQgaGF2ZSBvdGhlciBsYW5nIGF0dHJpYnV0ZXNcbiAgICAgICAgICAgIGxldCBoYXNDb250ZW50ID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuZmlyc3RDaGlsZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGxldCBudyA9IG5ldyBET01XYWxrZXIocnVsZUNvbnRleHQsIGZhbHNlLCBydWxlQ29udGV4dCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgd2hpbGUgKCFoYXNDb250ZW50ICYmIG53Lm5leHROb2RlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gU2tpcCBoaWRkZW5cbiAgICAgICAgICAgICAgICAgICAgaWYgKG53Lm5vZGUubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlbGVtZW50ID0gbncubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFWaXNVdGlsLmlzTm9kZVZpc2libGUoZWxlbWVudCkgfHwgZWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJsYW5nXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbncuYkVuZFRhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWUoZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzQ29udGVudCA9IGhhc0NvbnRlbnQgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbWdcIiAmJiAocGFpciAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwKS8qKkFSSUFNYXBwZXIuY29tcHV0ZU5hbWUoZWxlbWVudCkudHJpbSgpLmxlbmd0aCA+IDAqLztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhc0NvbnRlbnQgPSBoYXNDb250ZW50IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG53Lm5vZGUubm9kZVR5cGUgPT09IDMgJiYgbncubm9kZS5ub2RlVmFsdWUudHJpbSgpLmxlbmd0aCA+IDA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWhhc0NvbnRlbnQpIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlTWFudWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGNvbnN0IGVsZW1lbnRfbW91c2VldmVudF9rZXlib2FyZDogUnVsZSA9IHtcbiAgICBpZDogXCJlbGVtZW50X21vdXNlZXZlbnRfa2V5Ym9hcmRcIixcbiAgICBjb250ZXh0OiBcImRvbToqW29uZGJsY2xpY2tdLCBkb206Kltvbm1vdXNlbW92ZV0sIGRvbToqW29ubW91c2Vkb3duXSwgZG9tOipbb25tb3VzZXVwXSwgZG9tOipbb25tb3VzZW92ZXJdLCBkb206Kltvbm1vdXNlb3V0XSwgZG9tOipbb25jbGlja11cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9FbGVtX0V2ZW50TW91c2VBbmRLZXlcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJNYW51YWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiZWxlbWVudF9tb3VzZWV2ZW50X2tleWJvYXJkLmh0bWxcIixcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJlbGVtZW50X21vdXNlZXZlbnRfa2V5Ym9hcmQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImVsZW1lbnRfbW91c2VldmVudF9rZXlib2FyZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwiQ29uZmlybSB0aGUgPHswfT4gZWxlbWVudCB3aXRoIG1vdXNlIGV2ZW50IGhhbmRsZXIocykgJ3sxfScgaGFzIGEgY29ycmVzcG9uZGluZyBrZXlib2FyZCBoYW5kbGVyKHMpXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQWxsIGludGVyYWN0aXZlIGNvbnRlbnQgd2l0aCBtb3VzZSBldmVudCBoYW5kbGVycyBtdXN0IGhhdmUgZXF1aXZhbGVudCBrZXlib2FyZCBhY2Nlc3NcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImhyZWZcIikgfHxcbiAgICAgICAgICAgICghcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25kYmxjbGlja1wiKSAmJlxuICAgICAgICAgICAgICAgICFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbm1vdXNlbW92ZVwiKSAmJlxuICAgICAgICAgICAgICAgICghcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25tb3VzZWRvd25cIikgfHwgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25rZXlkb3duXCIpKSAmJlxuICAgICAgICAgICAgICAgICghcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25tb3VzZXVwXCIpIHx8IHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9ua2V5dXBcIikpICYmXG4gICAgICAgICAgICAgICAgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbm1vdXNlb3ZlclwiKSB8fCBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmZvY3VzXCIpKSAmJlxuICAgICAgICAgICAgICAgICghcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25tb3VzZW91dFwiKSB8fCBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmJsdXJcIikpICYmXG4gICAgICAgICAgICAgICAgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmNsaWNrXCIpIHx8IHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9ua2V5cHJlc3NcIikgfHxcbiAgICAgICAgICAgICAgICAgICAgbm9kZU5hbWUgPT0gXCJhXCIgfHwgbm9kZU5hbWUgPT0gXCJidXR0b25cIikpO1xuXG4gICAgICAgIGxldCBmYWlsZWRNb3VzZUV2ZW50cyA9IG5ldyBBcnJheSgpO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgLy9zdG9yZSBhbmQgZGlzcGxheSBldmVudCBuYW1lIGFuZCBub2RlIG5hbWUgaW4gdGhlIHRva2Vuc1xuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9uZGJsY2xpY2tcIikpIHtcbiAgICAgICAgICAgICAgICBmYWlsZWRNb3VzZUV2ZW50cy5wdXNoKFwib25kYmxjbGlja1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbm1vdXNlbW92ZVwiKSkge1xuICAgICAgICAgICAgICAgIGZhaWxlZE1vdXNlRXZlbnRzLnB1c2goXCJvbm1vdXNlbW92ZVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbm1vdXNlZG93blwiKSAmJiAhcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25rZXlkb3duXCIpKSB7XG4gICAgICAgICAgICAgICAgZmFpbGVkTW91c2VFdmVudHMucHVzaChcIm9ubW91c2Vkb3duXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9ubW91c2V1cFwiKSAmJiAhcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25rZXl1cFwiKSkge1xuICAgICAgICAgICAgICAgIGZhaWxlZE1vdXNlRXZlbnRzLnB1c2goXCJvbm1vdXNldXBcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25tb3VzZW92ZXJcIikgJiYgIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9uZm9jdXNcIikpIHtcbiAgICAgICAgICAgICAgICBmYWlsZWRNb3VzZUV2ZW50cy5wdXNoKFwib25tb3VzZW92ZXJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25tb3VzZW91dFwiKSAmJiAhcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25ibHVyXCIpKSB7XG4gICAgICAgICAgICAgICAgZmFpbGVkTW91c2VFdmVudHMucHVzaChcIm9ubW91c2VvdXRcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25jbGlja1wiKSAmJiAhcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwib25rZXlwcmVzc1wiKSkge1xuICAgICAgICAgICAgICAgIGlmICghKG5vZGVOYW1lID09IFwiYVwiIHx8IG5vZGVOYW1lID09IFwiYnV0dG9uXCIpKVxuICAgICAgICAgICAgICAgICAgICBmYWlsZWRNb3VzZUV2ZW50cy5wdXNoKFwib25jbGlja1wiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFzc2VkID8gUnVsZVBhc3MoXCJQYXNzXzBcIikgOiBSdWxlTWFudWFsKFwiTWFudWFsXzFcIiwgW25vZGVOYW1lLCBmYWlsZWRNb3VzZUV2ZW50cy5qb2luKFwiLCBcIildKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDU1NVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ1NTVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgZWxlbWVudF9vcmllbnRhdGlvbl91bmxvY2tlZDogUnVsZSA9IHtcbiAgICBpZDogXCJlbGVtZW50X29yaWVudGF0aW9uX3VubG9ja2VkXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJlbGVtZW50X29yaWVudGF0aW9uX3VubG9ja2VkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9sb2NrZWRcIjogXCJlbGVtZW50X29yaWVudGF0aW9uX3VubG9ja2VkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJlbGVtZW50X29yaWVudGF0aW9uX3VubG9ja2VkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlRoZSBlbGVtZW50IGlzIG5vdCByZXN0cmljdGVkIHRvIGVpdGhlciBsYW5kc2NhcGUgb3IgcG9ydHJhaXQgb3JpZW50YXRpb24gdXNpbmcgQ1NTIHRyYW5zZm9ybSBwcm9wZXJ0eVwiLFxuICAgICAgICAgICAgXCJmYWlsX2xvY2tlZFwiOiBcIlRoZSBlbGVtZW50IDx7MH0+IGlzIHJlc3RyaWN0ZWQgdG8gZWl0aGVyIGxhbmRzY2FwZSBvciBwb3J0cmFpdCBvcmllbnRhdGlvbiB1c2luZyBDU1MgdHJhbnNmb3JtIHByb3BlcnR5XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiRWxlbWVudHMgc2hvdWxkIG5vdCBiZSByZXN0cmljdGVkIHRvIGVpdGhlciBsYW5kc2NhcGUgb3IgcG9ydHJhaXQgb3JpZW50YXRpb24gdXNpbmcgQ1NTIHRyYW5zZm9ybSBwcm9wZXJ0eVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjRcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogWydiMzNlZmYnXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgICAvL3NraXAgaW52aXNpYmxlIGVsZW1lbnRcbiAgICAgICAgaWYgKCFWaXNVdGlsLmlzTm9kZVZpc2libGUocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICAvL3NraXAgZWxlbWVudHNcbiAgICAgICAgaWYgKENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFtcInNjcmlwdFwiLCBcIm1ldGFcIiwgXCJ0aXRsZVwiXSkpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIFxuICAgICAgICAvLyBjYWNoZSB0aGUgb3JpZW50YXRpb24gcmVzdWx0IGZvciBhbGwgdGhlIGVsZW1lbnRzIGluIHRoZSBwYWdlXG4gICAgICAgIGxldCBkb2MgPSBGcmFnbWVudFV0aWwuZ2V0T3duZXJGcmFnbWVudChydWxlQ29udGV4dCkgYXMgYW55O1xuICAgICAgICBsZXQgb3JpZW50YXRpb25UcmFuc2Zvcm1zID0gQ2FjaGVVdGlsLmdldENhY2hlKGRvYywgXCJSUFRVdGlsX01FRElBX09SSUVOVEFUSU9OX1RSQU5TRlJPTVwiLCBudWxsKTtcbiAgICAgICAgaWYgKCFvcmllbnRhdGlvblRyYW5zZm9ybXMpIHtcbiAgICAgICAgICAgIG9yaWVudGF0aW9uVHJhbnNmb3JtcyA9IENTU1V0aWwuZ2V0TWVkaWFPcmllbnRhdGlvblRyYW5zZm9ybShkb2MpO1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGRvYywgXCJSUFRVdGlsX01FRElBX09SSUVOVEFUSU9OX1RSQU5TRlJPTVwiLCBvcmllbnRhdGlvblRyYW5zZm9ybXMpO1xuICAgICAgICB9IFxuICAgICAgICBcbiAgICAgICAgLy8gZmluZCBpZiB0aGUgZWxlbWVudCBtYXRjaGVzIG9yaWVudGF0aW9uIHNlbGVjdG9yKHMpXG4gICAgICAgIGxldCBtZWRpYV90cmFuc2Zvcm1zID0gW107XG4gICAgICAgIE9iamVjdC5rZXlzKG9yaWVudGF0aW9uVHJhbnNmb3JtcykuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgICAgICAgT2JqZWN0LmtleXMob3JpZW50YXRpb25UcmFuc2Zvcm1zW2tleV0pLmZvckVhY2godGFnID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMob3JpZW50YXRpb25UcmFuc2Zvcm1zW2tleV1bdGFnXSkubGVuZ3RoID4gMCAmJiBDU1NVdGlsLnNlbGVjdG9yTWF0Y2hlc0VsZW0ocnVsZUNvbnRleHQsIHRhZykpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWVudGF0aW9uVHJhbnNmb3Jtc1trZXldW3RhZ10udHJhbnNmb3JtKVxuICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFfdHJhbnNmb3Jtcy5wdXNoKG9yaWVudGF0aW9uVHJhbnNmb3Jtc1trZXldW3RhZ10udHJhbnNmb3JtKTtcbiAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFfdHJhbnNmb3Jtcy5wdXNoKG9yaWVudGF0aW9uVHJhbnNmb3Jtc1trZXldW3RhZ10pO1xuICAgICAgICAgICAgICAgIH0gICAgXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICAvLyBubyBtYXRjaCwgdGhlIGVsZW1lbnQgaXMgbm90IGluIG1lZGlhIG9yaWVudGF0aW9uIHRyYW5zZm9ybVxuICAgICAgICBpZiAobWVkaWFfdHJhbnNmb3Jtcy5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgbGV0IHJldCA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBtZWRpYV90cmFuc2Zvcm1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgbWVkaWFfdHJhbnNmb3JtID0gbWVkaWFfdHJhbnNmb3Jtc1tpXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbWVkaWFfdHJhbnNmb3JtID09PSAnb2JqZWN0JylcbiAgICAgICAgICAgICAgICBmb3IodmFyIGtleSBpbiBtZWRpYV90cmFuc2Zvcm0pXG4gICAgICAgICAgICAgICAgICAgIG1lZGlhX3RyYW5zZm9ybSA9IGtleSArXCIoXCIgKyBtZWRpYV90cmFuc2Zvcm1ba2V5XSArXCIpXCI7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGxldCBjb250YWluc1JvdGF0aW9uID0gZmFsc2U7XG4gICAgICAgICAgICBbJ3JvdGF0ZScsICdyb3RhdGUzZCcsICdyb3RhdGVaJywgJ21hdHJpeCcsICdtYXRyaXgzZCddLmZvckVhY2gocm90YXRpb24gPT4ge1xuICAgICAgICAgICAgICAgIGlmIChtZWRpYV90cmFuc2Zvcm0uaW5jbHVkZXMocm90YXRpb24pKSBjb250YWluc1JvdGF0aW9uID0gdHJ1ZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gbm8gcm90YXRpb24gdHJhbnNmb3JtLCBza2lwXG4gICAgICAgICAgICBpZiAoIWNvbnRhaW5zUm90YXRpb24pIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBsZXQgZGVncmVlID0gQ1NTVXRpbC5nZXRSb3RhdGlvbkRlZ3JlZShtZWRpYV90cmFuc2Zvcm0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBubyBvciAzNjBuIGRlZ3JlZSByb3RhdGlvbiBcbiAgICAgICAgICAgIGlmIChkZWdyZWUgPT09IDApIHsgXG4gICAgICAgICAgICAgICAgcmV0LnB1c2goUnVsZVBhc3MoXCJwYXNzXCIpKTtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogY2FsY3VsYXRlIHRoZSBvcmlnaW5hbCBwYWdlIHJvdGF0aW9uIHRyYW5zZm9ybWF0aW9uLCBleGFtcGxlXG4gICAgICAgICAgICAgKiAgaHRtbCB7IHRyYW5zZm9ybTogcm90YXRlKDIuNWRlZyk7IH1cbiAgICAgICAgICAgICovXG4gICAgICAgICAgICBjb25zdCBkZWZpbmVkU3R5bGUgPSBDU1NVdGlsLmdldERlZmluZWRTdHlsZXMocnVsZUNvbnRleHQsIFtcInRyYW5zZm9ybVwiXSk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8qKiBcbiAgICAgICAgICAgICAqIGNvbXBlbnNhdGUgdGhlIG1lZGlhIG9yaWVudGF0aW9uIHdpdGggdGhlIHBhZ2Ugb3JpZW50YXRpb25cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgaWYgKGRlZmluZWRTdHlsZVsndHJhbnNmb3JtJ10pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYWdlX2RlZ3JlZSA9IENTU1V0aWwuZ2V0Um90YXRpb25EZWdyZWUoZGVmaW5lZFN0eWxlWyd0cmFuc2Zvcm0nXSk7XG4gICAgICAgICAgICAgICAgLy8gcm90YXRlIGlzIGFkZGl0aXZlXG4gICAgICAgICAgICAgICAgZGVncmVlICs9IHBhZ2VfZGVncmVlO1xuICAgICAgICAgICAgfSAgICBcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gV2hlbiBkZWdyZWUgaXMgMSB0dXJuICgzNjAgZGVncmVlKSwgaXQgaXMgbm90IGNvbnNpZGVyZWQgYW4gb3JpZW50YXRpb24gbG9ja1xuICAgICAgICAgICAgLy8gYWxsb3cgMSBkZWdyZWUgZmxvYXRpbmcgcmFuZ2UgZm9yIHRoZSByaWdodCBhbmdsZVxuICAgICAgICAgICAgaWYgKE1hdGguYWJzKGRlZ3JlZSAtIDM2MCkgJSAzNjAgPiAxKVxuICAgICAgICAgICAgICAgIHJldC5wdXNoKFJ1bGVGYWlsKFwiZmFpbF9sb2NrZWRcIiwgW25vZGVOYW1lXSkpO1xuICAgICAgICAgICAgZWxzZSByZXQucHVzaChSdWxlUGFzcyhcInBhc3NcIikpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXQubGVuZ3RoID4gMCkgIFxuICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgcmV0dXJuIG51bGw7IFxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgZWxlbWVudF9zY3JvbGxhYmxlX3RhYmJhYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcImVsZW1lbnRfc2Nyb2xsYWJsZV90YWJiYWJsZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipcIixcbiAgICBkZXBlbmRlbmNpZXM6IFtdLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZWxlbWVudF9zY3JvbGxhYmxlX3RhYmJhYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwicGFzc190YWJiYWJsZVwiOiBcImVsZW1lbnRfc2Nyb2xsYWJsZV90YWJiYWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcInBhc3NfaW50ZXJhY3RpdmVcIjogXCJlbGVtZW50X3Njcm9sbGFibGVfdGFiYmFibGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX3Njcm9sbGFibGVcIjogXCJlbGVtZW50X3Njcm9sbGFibGVfdGFiYmFibGUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIlNjcm9sbGFibGUgZWxlbWVudHMgc2hvdWxkIGJlIHRhYmJhYmxlIG9yIGNvbnRhaW4gdGFiYmFibGUgY29udGVudFwiLFxuICAgICAgICAgICAgXCJwYXNzX3RhYmJhYmxlXCI6IFwiVGhlIHNjcm9sbGFibGUgZWxlbWVudCBpcyB0YWJiYWJsZVwiLFxuICAgICAgICAgICAgXCJwYXNzX2ludGVyYWN0aXZlXCI6IFwiVGhlIHNjcm9sbGFibGUgZWxlbWVudCBoYXMgdGFiYmFibGUgY29udGVudFwiLFxuICAgICAgICAgICAgXCJmYWlsX3Njcm9sbGFibGVcIjogXCJUaGUgc2Nyb2xsYWJsZSBlbGVtZW50IDx7MH0+IHdpdGggbm9uLWludGVyYWN0aXZlIGNvbnRlbnQgaXMgbm90IHRhYmJhYmxlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogZGVwcmVjYXRlZCBvbiA2LzEwLzIwMjUgZHVlIHRvIEJyb3dzZXIgc3VwcG9ydCBmb3IgYXV0by1mb2N1cyBvZiBhIHNjcm9sbGFibGUgZWxlbWVudCBcbiAgICAgKiBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgbnVtOiBbXCIyLjEuMVwiXSxcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLCovXG4gICAgcnVsZXNldHM6IFtdLFxuICAgIGFjdDogW1wiMHNzdzlrXCJdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IGlzIGhpZGRlbiBvciBkaXNhYmxlZFxuICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShydWxlQ29udGV4dCkgfHwgQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIFxuICAgICAgICAvL3NraXAgZWxlbWVudHNcbiAgICAgICAgaWYgKENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFtcImlmcmFtZVwiLCBcInN2Z1wiLCBcInNjcmlwdFwiLCBcIm1ldGFcIiwgXCJzdHlsZVwiXSkpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICAvL3NraXAgaWYgbm8gdmlzaWJsZSBjb250ZW50XG4gICAgICAgIGlmICghQ29tbW9uVXRpbC5oYXNJbm5lckNvbnRlbnQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBcbiAgICAgICAgLy8gaWdub3JlIGlmIHRoZSBlbGVtZW50J3MgbmF2aWdhdGlvbiBpcyBjb250cm9sbGVkIG9yIG93bmVkIGJ5IGFub3RoZXIgZWxlbWVudFxuICAgICAgICBpZiAoQXJpYVV0aWwuaXNOYXZpZ2F0aW9uT3duZWRPckNvbnRyb2xsZWQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7ICBcblxuICAgICAgICAvLyBpZ25vcmUgaWYgdGhlIGVsZW1lbnQgaXMgbm90IHNjcm9sbGFibGUgb3IgY29udGVudCB3aXRob3V0aW5nIG5lZWRpbmcgYSBzY3JvbGxcbiAgICAgICAgaWYgKCFWaXNVdGlsLmlzRWxlbWVudFNjcm9sbGFibGUocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gcGFzcyBpZiBlbGVtZW50IGlzIHRhYmJhYmxlXG4gICAgICAgIGlmIChDb21tb25VdGlsLmlzVGFiYmFibGUocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc190YWJiYWJsZVwiKTtcblxuICAgICAgICAvLyBjaGVjayBpZiBlbGVtZW50IGNvbnRlbnQgaXMgdGFiYmFibGVcbiAgICAgICAgY29uc3QgY291bnQgPSBDb21tb25VdGlsLmdldFRhYmJhYmxlQ2hpbGRyZW4ocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoY291bnQgPiAwKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc19pbnRlcmFjdGl2ZVwiKTtcblxuICAgICAgICAvLyBpZ25vcmUgaW4gRmlyZWZveCBpZiBubyB0YWJpbmRleCBhdCBhbGwgKG5vdCB0ZXN0ZWQgaW4gZW1iZWRkZWQgb3IgYW55IHNpbXVsYXRvcilcbiAgICAgICAgaWYgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSAmJiBuYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoXCJGaXJlZm94XCIpID4gLTEpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX3Njcm9sbGFibGVcIiwgW3J1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldKTsgICAgXG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgQVJJQURlZmluaXRpb25zIH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQURlZmluaXRpb25zXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGVsZW1lbnRfdGFiYmFibGVfcm9sZV92YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJlbGVtZW50X3RhYmJhYmxlX3JvbGVfdmFsaWRcIixcbiAgICBjb250ZXh0OlwiZG9tOipcIixcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiZWxlbWVudF90YWJiYWJsZV9yb2xlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9pbnZhbGlkX3JvbGVcIjogXCJlbGVtZW50X3RhYmJhYmxlX3JvbGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX25vX3ZhbGlkX3JvbGVcIjogXCJlbGVtZW50X3RhYmJhYmxlX3JvbGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImVsZW1lbnRfdGFiYmFibGVfcm9sZV92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJUaGUgdGFiYmFibGUgZWxlbWVudCBoYXMgYSB3aWRnZXQgcm9sZVwiLFxuICAgICAgICAgICAgXCJmYWlsX2ludmFsaWRfcm9sZVwiOiBcIlRoZSB0YWJiYWJsZSBlbGVtZW50J3Mgcm9sZSAnezB9JyBpcyBub3QgYSB3aWRnZXQgcm9sZVwiLFxuICAgICAgICAgICAgXCJmYWlsX25vX3ZhbGlkX3JvbGVcIjogXCJUaGUgdGFiYmFibGUgZWxlbWVudCBkb2VzIG5vdCBoYXZlIGEgdmFsaWQgd2lkZ2V0IHJvbGVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBIHRhYmJhYmxlIGVsZW1lbnQgbXVzdCBoYXZlIGEgdmFsaWQgd2lkZ2V0IHJvbGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCJdLFxuICAgICAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwiaWRcIjogW1wiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICAgICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAgIGlmIChDb21tb25VdGlsLmlzTm9kZURpc2FibGVkKHJ1bGVDb250ZXh0KSB8fCBWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgY29uc3Qgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAvLyBpZiB0aGUgZWxlbWVudCBpcyB0YWJiYWJsZSBieSBkZWZhdWx0IHdpdGggb3Igd2l0aG91dCB0YWJpbmRleCwgbGV0IHRoZSBvdGhlciBydWxlcyAoc3VjaCBhcyB3aWRnZXRfdGFiYmFibGVfc2luZ2xlKSB0byBoYW5kbGUgaXRcbiAgICAgICAgaWYgKG5vZGVOYW1lIGluIENvbW1vblV0aWwudGFiVGFnTWFwICkge1xuICAgICAgICAgICAgbGV0IHZhbHVlID0gQ29tbW9uVXRpbC50YWJUYWdNYXBbbm9kZU5hbWVdO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiAodmFsdWUpID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgIH0gXG4gICAgICAgICAgICBpZiAodmFsdWUpIHJldHVybiBudWxsO1xuICAgICAgICB9IFxuICAgICAgICBcbiAgICAgICAgLy8gaGFuZGxlIHRoZSBjYXNlOiBubyB0YWJpbmRleCBvciB0YWJpbmRleCA8IDBcbiAgICAgICAgaWYgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSB8fCBwYXJzZUludChydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSkgPCAwKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gaWdub3JlIGlmIHRoZSBlbGVtZW50J3MgbmF2aWdhdGlvbiBpcyBjb250cm9sbGVkIGJ5IGFub3RoZXIgZWxlbWVudCwgc3VjaCBhcyBjb21ib2JveFxuICAgICAgICBpZiAoQXJpYVV0aWwuaXNOYXZpZ2F0aW9uT3duZWRPckNvbnRyb2xsZWQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7ICBcblxuICAgICAgICAvLyBpZ25vcmUgaWYgdGhlIGVsZW1lbnQgaXMgc2Nyb2xsYWJsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc0VsZW1lbnRTY3JvbGxhYmxlKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybiBudWxsOyAgICBcblxuICAgICAgICAvLyBlbGVtZW50cyB3aG9zZSByb2xlcyBhbGxvdyBubyBkZXNjZW5kYW50cyB0aGF0IGFyZSBpbnRlcmFjdGl2ZSBvciB3aXRoIGEgdGFiaW5kZXggPj0gMCBcbiAgICAgICAgLy8gdGhpcyBjYXNlIHNob3VsZCBiZSBoYW5kbGVkIGluIHdpZGdldF90YWJiYWJsZV9zaW5nbGUgYW5kIGFyaWFfY2hpbGRfdGFiYmFibGVcbiAgICAgICAgY29uc3Qgcm9sZXNfbm9faW50ZXJhY3RpdmVfY2hpbGQgPVtcImJ1dHRvblwiLCBcImNoZWNrYm94XCIsIFwiaW1nXCIsIFwibGlua1wiLCBcIm1lbnVpdGVtXCIsIFwibWVudWl0ZW1jaGVja2JveFwiLCBcIm1lbnVpdGVtcmFkaW9cIiwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJvcHRpb25cIiwgXCJyYWRpb1wiLCBcInN3aXRjaFwiLCBcInRhYlwiXTtcblxuICAgICAgICBjb25zdCBwYXJlbnQgPSBET01XYWxrZXIucGFyZW50Tm9kZShydWxlQ29udGV4dCk7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBwYXJlbnRfcm9sZSA9IEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZShwYXJlbnQgYXMgRWxlbWVudCk7XG4gICAgICAgIFxuICAgICAgICAvLyBpZ25vcmUgaWYgdGhlIHBhcmVudCByb2xlIGlzIGluIHJvbGVzX25vX2ludGVyYWN0aXZlX2NoaWxkXG4gICAgICAgIGlmIChyb2xlc19ub19pbnRlcmFjdGl2ZV9jaGlsZC5pbmNsdWRlcyhwYXJlbnRfcm9sZSkpXG4gICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgbGV0IHJvbGUgPSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoIXJvbGUpIFxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9ub192YWxpZF9yb2xlXCIpOyBcbiAgICAgICAgLy8gaWdub3JlICdhcHBsaWNhdGlvbicgcm9sZSB0aGF0IGNvbnRhaW5zIG9uZSBvciBtb3JlIGZvY3VzYWJsZSBlbGVtZW50cyB0aGF0IGRvIG5vdCBmb2xsb3cgYSBzdGFuZGFyZCBpbnRlcmFjdGlvbiBwYXR0ZXJuIHN1cHBvcnRlZCBieSBhIHdpZGdldCByb2xlOmh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDIzL1BSLVdBSS1BUklBLTEuMi0yMDIzMDMyOC8jYXBwbGljYXRpb24gXG4gICAgICAgIGlmIChyb2xlID09PSBcImFwcGxpY2F0aW9uXCIpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICAvLyBoYW5kbGUgdGhlIGNhc2U6IHRhYmluZGV4ID49IDAgdG8gZXhhbWluZSB3aGV0aGVyIGEgd2lkZ2V0IHJvbGUgaXMgc2V0dXAgb3Igbm90IFxuICAgICAgICAvLyBwYXNzIGlmIG9uZSBvZiB0aGUgcm9sZXMgaXMgYSB3aWRnZXQgdHlwZVxuICAgICAgICAvLyBSb3cgaXMgd2VpcmQuIEl0J3Mgc3RydWN0dXJlLCBidXQgY2FuIGFsc28gYmUgd2lkZ2V0XG4gICAgICAgIC8vIEZvY3VzYWJsZSBzZXBhcmF0b3JzIGFyZSB3aWRnZXRzXG4gICAgICAgIGlmIChyb2xlID09PSBcInJvd1wiIHx8IHJvbGUgPT09IFwic2VwYXJhdG9yXCIgfHwgQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVdLnJvbGVUeXBlID09PSAnd2lkZ2V0Jykge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2ludmFsaWRfcm9sZVwiLCBbcm9sZV0pO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHksIFJ1bGVQb3RlbnRpYWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5pbXBvcnQgeyBET01NYXBwZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTU1hcHBlclwiO1xuaW1wb3J0IHsgQ29sb3JVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29sb3JVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBlbGVtZW50X3RhYmJhYmxlX3Vub2JzY3VyZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZWxlbWVudF90YWJiYWJsZV91bm9ic2N1cmVkXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIGRlcGVuZGVuY2llczogW10sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJlbGVtZW50X3RhYmJhYmxlX3Vub2JzY3VyZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJwYXNzXCI6IFwiZWxlbWVudF90YWJiYWJsZV91bm9ic2N1cmVkLmh0bWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX29ic2N1cmVkXCI6IFwiZWxlbWVudF90YWJiYWJsZV91bm9ic2N1cmVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJXaGVuIGFuIGVsZW1lbnQgcmVjZWl2ZXMgZm9jdXMsIGl0IGlzIG5vdCBlbnRpcmVseSBjb3ZlcmVkIGJ5IG90aGVyIGNvbnRlbnRcIixcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlRoZSBlbGVtZW50IGlzIG5vdCBlbnRpcmVseSBjb3ZlcmVkIGJ5IG90aGVyIGNvbnRlbnRcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX29ic2N1cmVkXCI6IFwiQ29uZmlybSB0aGF0IHdoZW4gdGhlIGVsZW1lbnQgcmVjZWl2ZXMgZm9jdXMsIGl0IGlzIG5vdCBjb3ZlcmVkIG9yLCBpZiBjb3ZlcmVkIGJ5IHVzZXIgYWN0aW9uLCBjYW4gYmUgdW5jb3ZlcmVkIHdpdGhvdXQgbW92aW5nIGZvY3VzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbIFwiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIG51bTogW1wiMi40LjExXCJdLFxuICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEhUTUxFbGVtZW50O1xuXG4gICAgICAgIC8vIEVhcmx5IGV4aXQ6IGNoZWNrIHZpc2liaWxpdHkgYW5kIHRhYmJhYmlsaXR5IGZpcnN0XG4gICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKHJ1bGVDb250ZXh0KSB8fCAhQ29tbW9uVXRpbC5pc1RhYmJhYmxlKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgY29uc3Qgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICAgIFxuICAgICAgICAvLyBFYXJseSBleGl0OiBpZ25vcmUgY2VydGFpbiBlbGVtZW50c1xuICAgICAgICBpZiAoQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgW1wicHJlXCIsIFwiY29kZVwiLCBcInNjcmlwdFwiLCBcIm1ldGFcIl0pICE9PSBudWxsXG4gICAgICAgICAgICB8fCBub2RlTmFtZSA9PT0gXCJib2R5XCIgfHwgbm9kZU5hbWUgPT09IFwiaHRtbFwiKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBkb2MgPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50O1xuICAgICAgICBpZiAoIWRvYykgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICBjb25zdCB3aW4gPSBkb2MuZGVmYXVsdFZpZXc7XG4gICAgICAgIGlmICghd2luKSByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIC8vIFJldXNlIHNpbmdsZSBET01NYXBwZXIgaW5zdGFuY2VcbiAgICAgICAgY29uc3QgbWFwcGVyOiBET01NYXBwZXIgPSBuZXcgRE9NTWFwcGVyKCk7XG4gICAgICAgIGNvbnN0IGJvdW5kcyA9IG1hcHBlci5nZXRVbmFkanVzdGVkQm91bmRzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgXG4gICAgICAgIC8vIEVhcmx5IGV4aXQ6IGJvdW5kcyBub3QgYXZhaWxhYmxlIG9yIGVsZW1lbnQgaGFzIG5vIGRpbWVuc2lvbnNcbiAgICAgICAgaWYgKCFib3VuZHMgfHwgYm91bmRzLmhlaWdodCA9PT0gMCB8fCBib3VuZHMud2lkdGggPT09IDApXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IGNTdHlsZSA9IHdpbi5nZXRDb21wdXRlZFN0eWxlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKCFjU3R5bGUpIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgLy8gUGFyc2Ugei1pbmRleCBvbmNlIGFuZCBjYWNoZVxuICAgICAgICBjb25zdCB6aW5kZXggPSBwYXJzZUludChjU3R5bGUuekluZGV4ID09PSAnYXV0bycgfHwgIWNTdHlsZS56SW5kZXggPyAnMCcgOiBjU3R5bGUuekluZGV4KTtcbiAgICAgICAgXG4gICAgICAgIC8vIE1vcmUgc3BlY2lmaWMgc2VsZWN0b3IgdG8gcmVkdWNlIGl0ZXJhdGlvblxuICAgICAgICBjb25zdCBlbGVtcyA9IGRvYy5xdWVyeVNlbGVjdG9yQWxsKCdib2R5ICo6bm90KHNjcmlwdCk6bm90KHN0eWxlKTpub3QobWV0YSk6bm90KGxpbmspJyk7XG4gICAgICAgIGlmICghZWxlbXMgfHwgZWxlbXMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICBcbiAgICAgICAgbGV0IGJlZm9yZSA9IHRydWU7XG4gICAgICAgIGNvbnN0IGJvdW5kc1JpZ2h0ID0gYm91bmRzLmxlZnQgKyBib3VuZHMud2lkdGg7XG4gICAgICAgIGNvbnN0IGJvdW5kc0JvdHRvbSA9IGJvdW5kcy50b3AgKyBib3VuZHMuaGVpZ2h0O1xuICAgICAgICBcbiAgICAgICAgLy8gQ2hlY2sgZm9yIG9ic2N1cmluZyBlbGVtZW50c1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsZW1zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtID0gZWxlbXNbaV07XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogVGhlIG5vZGVzIHJldHVybmVkIGZyb20gcXVlcnlTZWxlY3RvckFsbCBhcmUgaW4gZG9jdW1lbnQgb3JkZXIuXG4gICAgICAgICAgICAgKiBJZiB0d28gZWxlbWVudHMgb3ZlcmxhcCBhbmQgei1pbmRleCBhcmUgbm90IGRlZmluZWQsIHRoZW4gdGhlIG5vZGVcbiAgICAgICAgICAgICAqIHJlbmRlcmVkIGVhcmxpZXIgd2lsbCBiZSBvdmVybGFpZCBieSB0aGUgbm9kZSByZW5kZXJlZCBsYXRlci5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgLy8gVXNlIGNvbXBhcmVEb2N1bWVudFBvc2l0aW9uIHRvIGNoZWNrIGNvbnRhaW5tZW50IHJlbGF0aW9uc2hpcHNcbiAgICAgICAgICAgIC8vIE5vdGU6IGNvbXBhcmVEb2N1bWVudFBvc2l0aW9uIHJldHVybnMgMCB3aGVuIGNvbXBhcmluZyBhIG5vZGUgdG8gaXRzZWxmXG4gICAgICAgICAgICBjb25zdCBwb3NpdGlvbiA9IHJ1bGVDb250ZXh0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGVsZW0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBET0NVTUVOVF9QT1NJVElPTl9DT05UQUlORURfQlkgKDE2KTogZWxlbSBpcyBjb250YWluZWQgYnkgcnVsZUNvbnRleHRcbiAgICAgICAgICAgIC8vIEFsc28gaGFuZGxlIHNlbGYtY29tcGFyaXNvbiAocG9zaXRpb24gPT09IDApXG4gICAgICAgICAgICBpZiAocG9zaXRpb24gPT09IDAgfHwgKHBvc2l0aW9uICYgTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9DT05UQUlORURfQlkpKSB7XG4gICAgICAgICAgICAgICAgLy8gVGhlIG5leHQgbm9kZSBpbiBlbGVtcyB3aWxsIGJlIGFmdGVyIHRoZSB0YXJnZXQgbm9kZSAocnVsZUNvbnRleHQpXG4gICAgICAgICAgICAgICAgYmVmb3JlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIERPQ1VNRU5UX1BPU0lUSU9OX0NPTlRBSU5TICg4KTogZWxlbSBjb250YWlucyBydWxlQ29udGV4dFxuICAgICAgICAgICAgLy8gU2tpcCBpZiBlbGVtZW50IGNvbnRhaW5zIHJ1bGVDb250ZXh0IG9yIGlzIG5vdCB2aXNpYmxlXG4gICAgICAgICAgICBpZiAoKHBvc2l0aW9uICYgTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9DT05UQUlOUykgfHwgIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShlbGVtKSlcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY29uc3QgYm5kcyA9IG1hcHBlci5nZXRVbmFkanVzdGVkQm91bmRzKGVsZW0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBTa2lwIGlmIG5vIGJvdW5kcyBvciB6ZXJvIGRpbWVuc2lvbnNcbiAgICAgICAgICAgIGlmICghYm5kcyB8fCBibmRzLmhlaWdodCA9PT0gMCB8fCBibmRzLndpZHRoID09PSAwKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBRdWljayBib3VuZHMgY2hlY2s6IGRvZXMgZWxlbSBjb21wbGV0ZWx5IGNvdmVyIHJ1bGVDb250ZXh0P1xuICAgICAgICAgICAgaWYgKGJuZHMudG9wID4gYm91bmRzLnRvcCB8fCBibmRzLmxlZnQgPiBib3VuZHMubGVmdClcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgY29uc3QgYm5kc1JpZ2h0ID0gYm5kcy5sZWZ0ICsgYm5kcy53aWR0aDtcbiAgICAgICAgICAgIGNvbnN0IGJuZHNCb3R0b20gPSBibmRzLnRvcCArIGJuZHMuaGVpZ2h0O1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoYm5kc1JpZ2h0IDwgYm91bmRzUmlnaHQgfHwgYm5kc0JvdHRvbSA8IGJvdW5kc0JvdHRvbSlcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gQ2hlY2sgei1pbmRleCB0byBkZXRlcm1pbmUgaWYgZWxlbSBvYnNjdXJlcyBydWxlQ29udGV4dFxuICAgICAgICAgICAgY29uc3QgelN0eWxlID0gd2luLmdldENvbXB1dGVkU3R5bGUoZWxlbSk7XG4gICAgICAgICAgICBpZiAoIXpTdHlsZSkgY29udGludWU7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNvbnN0IGVsZW1aaW5kZXggPSBwYXJzZUludCh6U3R5bGUuekluZGV4ID09PSAnYXV0bycgfHwgIXpTdHlsZS56SW5kZXggfHwgaXNOYU4oTnVtYmVyKHpTdHlsZS56SW5kZXgpKSA/ICcwJyA6IHpTdHlsZS56SW5kZXgpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBJZiBiZWZvcmUgcnVsZUNvbnRleHQgaW4gRE9NIG9yZGVyLCBlbGVtIG11c3QgaGF2ZSBoaWdoZXIgei1pbmRleCB0byBvYnNjdXJlXG4gICAgICAgICAgICAvLyBJZiBhZnRlciBydWxlQ29udGV4dCBpbiBET00gb3JkZXIsIGVsZW0gY2FuIG9ic2N1cmUgd2l0aCBlcXVhbCBvciBoaWdoZXIgei1pbmRleFxuICAgICAgICAgICAgaWYgKChiZWZvcmUgJiYgZWxlbVppbmRleCA+IHppbmRleCkgfHwgKCFiZWZvcmUgJiYgZWxlbVppbmRleCA+PSB6aW5kZXgpKSB7XG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgZWxlbWVudCBoYXMgb3BhcXVlIGJhY2tncm91bmRcbiAgICAgICAgICAgICAgICBsZXQgaGFzT3BhcXVlQmFja2dyb3VuZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmICh6U3R5bGUuYmFja2dyb3VuZCAmJiB6U3R5bGUuYmFja2dyb3VuZCAhPT0gJ25vbmUnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJnQ29sb3IgPSBDb2xvclV0aWwuQ29sb3IoelN0eWxlLmJhY2tncm91bmQpO1xuICAgICAgICAgICAgICAgICAgICBoYXNPcGFxdWVCYWNrZ3JvdW5kID0gYmdDb2xvciAmJiAoYmdDb2xvci5hbHBoYSA9PT0gdW5kZWZpbmVkIHx8IGJnQ29sb3IuYWxwaGEgPiAwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFoYXNPcGFxdWVCYWNrZ3JvdW5kICYmIHpTdHlsZS5iYWNrZ3JvdW5kQ29sb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYmdDb2xvciA9IENvbG9yVXRpbC5Db2xvcih6U3R5bGUuYmFja2dyb3VuZENvbG9yKTtcbiAgICAgICAgICAgICAgICAgICAgaGFzT3BhcXVlQmFja2dyb3VuZCA9IGJnQ29sb3IgJiYgKGJnQ29sb3IuYWxwaGEgPT09IHVuZGVmaW5lZCB8fCBiZ0NvbG9yLmFscGhhID4gMCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIElmIGVsZW1lbnQgaGFzIG5vIGNvbnRlbnQgYW5kIG5vIG9wYXF1ZSBiYWNrZ3JvdW5kLCBza2lwIGl0XG4gICAgICAgICAgICAgICAgaWYgKCFDb21tb25VdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbihlbGVtKSAmJiAhaGFzT3BhcXVlQmFja2dyb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfb2JzY3VyZWRcIiwgW10pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgQ1NTVXRpbCB9IGZyb20gXCIuLi91dGlsL0NTU1V0aWxcIjtcbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHksIFJ1bGVQb3RlbnRpYWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IERPTU1hcHBlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NTWFwcGVyXCI7XG5cbmV4cG9ydCBjb25zdCBlbGVtZW50X3RhYmJhYmxlX3Zpc2libGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZWxlbWVudF90YWJiYWJsZV92aXNpYmxlXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIGRlcGVuZGVuY2llczogW10sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJlbGVtZW50X3RhYmJhYmxlX3Zpc2libGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJwYXNzXCI6IFwiZWxlbWVudF90YWJiYWJsZV92aXNpYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX3Zpc2libGVcIjogXCJlbGVtZW50X3RhYmJhYmxlX3Zpc2libGUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIkEgdGFiYmFibGUgZWxlbWVudCBzaG91bGQgYmUgdmlzaWJsZSBvbiB0aGUgc2NyZWVuIHdoZW4gaXQgaGFzIGtleWJvYXJkIGZvY3VzXCIsXG4gICAgICAgICAgICBcInBhc3NcIjogXCJUaGUgdGFiYmFibGUgZWxlbWVudCBpcyB2aXNpYmxlIG9uIHRoZSBzY3JlZW5cIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX3Zpc2libGVcIjogXCJDb25maXJtIHRoZSBlbGVtZW50IHNob3VsZCBiZSB0YWJiYWJsZSBhbmQgaWYgc28sIGl0IGJlY29tZXMgdmlzaWJsZSB3aGVuIGl0IGhhcyBrZXlib2FyZCBmb2N1c1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBpZDogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBudW06IFtcIjIuNC43XCJdLFxuICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgaWYgKCFDb21tb25VdGlsLmlzVGFiYmFibGUocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgIGNvbnN0IG1hcHBlciA6IERPTU1hcHBlciA9IG5ldyBET01NYXBwZXIoKTtcbiAgICAgICAgY29uc3QgYm91bmRzID0gbWFwcGVyLmdldFVuYWRqdXN0ZWRCb3VuZHMocnVsZUNvbnRleHQpO1xuICAgICAgICBcbiAgICAgICAgLy9pbiBjYXNlIHRoZSBib3VuZHMgbm90IGF2YWlsYWJsZVxuICAgICAgICBpZiAoIWJvdW5kcykgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICAvLyBHZXQgYWxsIG5lZWRlZCBzdHlsZXMgaW4gYSBzaW5nbGUgcGFzcyB0aHJvdWdoIHN0eWxlc2hlZXRzXG4gICAgICAgIGNvbnN0IGFsbFN0eWxlcyA9IENTU1V0aWwuZ2V0RGVmaW5lZFN0eWxlc011bHRpcGxlKHJ1bGVDb250ZXh0LCBbXCJwb3NpdGlvblwiLCBcImNsaXBcIl0sIFtcIlwiLCBcIjpmb2N1c1wiXSk7XG4gICAgICAgIGNvbnN0IGRlZmluZWRfc3R5bGVzID0gYWxsU3R5bGVzW1wiXCJdO1xuICAgICAgICBjb25zdCBvbmZvY3VzX3N0eWxlcyA9IGFsbFN0eWxlc1tcIjpmb2N1c1wiXTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgaWYgKGJvdW5kc1snaGVpZ2h0J10gPT09IDAgfHwgYm91bmRzWyd3aWR0aCddID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfdmlzaWJsZVwiLCBbXSk7XG5cbiAgICAgICAgaWYgKGRlZmluZWRfc3R5bGVzWydwb3NpdGlvbiddPT09J2Fic29sdXRlJyAmJiBkZWZpbmVkX3N0eWxlc1snY2xpcCddICYmIGRlZmluZWRfc3R5bGVzWydjbGlwJ10ucmVwbGFjZUFsbCgnICcsICcnKT09PSdyZWN0KDBweCwwcHgsMHB4LDBweCknXG4gICAgICAgICAgICAmJiAhb25mb2N1c19zdHlsZXNbJ2NsaXAnXSkge1xuICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgKiBub3RlIHRoYXQgQSB1c2VyIGNhbiBzZWxlY3QgYSBjaGVja2JveCBhbmQgcmFkaW8gYnV0dG9uIGJ5IHNlbGVjdGluZyB0aGUgYnV0dG9uIG9yIHRoZSBsYWJlbCB0ZXh0LlxuICAgICAgICAgICAgICogV2hlbiBhIGNoZWNrYm94IG9yIHJhZGlvIGJ1dHRvbiBpcyBjbGlwcGVkIHRvIDAgc2l6ZSwgaXQgaXMgc3RpbGwgYXZhaWxhYmxlIHRvIGEga2V5Ym9hcmQgb3IgYSBzY3JlZW4gcmVhZGVyLlxuICAgICAgICAgICAgICogVGhlIHJ1bGUgc2hvdWxkIGJlIHBhc3NlZCBpZiB0aGUgbGFiZWwgdGV4dCBleGlzdHMgYW5kIHRoZSBidXR0b24gb24tZm9jdXMgc3R5bGUgaXMgZGVmaW5lZCBieSB0aGUgdXNlcixcbiAgICAgICAgICAgICAqIHdoaWNoIGxpa2VseSBpbmN1cnMgdGhlIGNoYW5nZXMgb2YgdGhlIGxhYmVsIHN0eWxlLlxuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBpZiAobm9kZU5hbWUgPT09ICdpbnB1dCcgJiYgKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZSgndHlwZScpPT09J2NoZWNrYm94JyB8fCBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoJ3R5cGUnKT09PSdyYWRpbycpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGFiZWwgPSBDb21tb25VdGlsLmdldExhYmVsRm9yRWxlbWVudChydWxlQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgaWYgKGxhYmVsICYmICFDb21tb25VdGlsLmlzSW5uZXJUZXh0RW1wdHkobGFiZWwpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEdldCBhZGRpdGlvbmFsIHBzZXVkby1jbGFzcyBzdHlsZXMgKHJldXNlIG9uZm9jdXNfc3R5bGVzIGZyb20gbGluZSA2MClcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHNldWRvU3R5bGVzID0gQ1NTVXRpbC5nZXREZWZpbmVkU3R5bGVzTXVsdGlwbGUocnVsZUNvbnRleHQsIG51bGwsIFtcIjpmb2N1cy12aXNpYmxlXCIsIFwiOmZvY3VzLXdpdGhpblwiLCBcIjpjaGVja2VkXCIsIFwiOmZvY3VzXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9jdXNfdmlzaWJsZV9zdHlsZXMgPSBwc2V1ZG9TdHlsZXNbXCI6Zm9jdXMtdmlzaWJsZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9jdXNfd2l0aGluX3N0eWxlcyA9IHBzZXVkb1N0eWxlc1tcIjpmb2N1cy13aXRoaW5cIl07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoZWNrZWRfc3R5bGVzID0gcHNldWRvU3R5bGVzW1wiOmNoZWNrZWRcIl07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9uZm9jdXNfc3R5bGVzID0gcHNldWRvU3R5bGVzW1wiOmZvY3VzXCJdO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChvbmZvY3VzX3N0eWxlcyB8fCBmb2N1c192aXNpYmxlX3N0eWxlcyB8fCBmb2N1c193aXRoaW5fc3R5bGVzIHx8IGNoZWNrZWRfc3R5bGVzKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF92aXNpYmxlXCIsIFtdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChib3VuZHNbJ3RvcCddID49IDAgJiYgYm91bmRzWydsZWZ0J10gPj0gMClcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBkZWZhdWx0X3N0eWxlcyA9IGdldENvbXB1dGVkU3R5bGUocnVsZUNvbnRleHQpO1xuICAgICAgICBcbiAgICAgICAgbGV0IHRvcCA9IGJvdW5kc1sndG9wJ107XG4gICAgICAgIGxldCBsZWZ0ID0gYm91bmRzWydsZWZ0J107XG4gICAgICAgXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhvbmZvY3VzX3N0eWxlcykubGVuZ3RoID09PSAwICkge1xuICAgICAgICAgICAgLy8gbm8gb25mb2N1cyBwb3NpdGlvbiBjaGFuZ2UsIGJ1dCBjb3VsZCBiZSBjaGFuZ2VkIGZyb20ganNcbiAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX3Zpc2libGVcIiwgW10pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gd2l0aCBvbmZvY3VzIHBvc2l0aW9uIGNoYW5nZVxuICAgICAgICAgICAgdmFyIHBvc2l0aW9ucyA9IFsnYWJzb2x1dGUnLCAnZml4ZWQnXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb25mb2N1c19zdHlsZXNbJ3RvcCddICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbnMuaW5jbHVkZXMob25mb2N1c19zdHlsZXNbJ3Bvc2l0aW9uJ10pIHx8ICh0eXBlb2Ygb25mb2N1c19zdHlsZXNbJ3Bvc2l0aW9uJ10gPT09ICd1bmRlZmluZWQnICYmIHBvc2l0aW9ucy5pbmNsdWRlcyhkZWZhdWx0X3N0eWxlc1sncG9zaXRpb24nXSkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRvcCA9IG9uZm9jdXNfc3R5bGVzWyd0b3AnXS5yZXBsYWNlKC9cXEQvZywnJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHBvc2l0aW9uIGlzIHVuZGVmaW5lZCBhbmQgdGhlIHBhcmVudCdzIHBvc2l0aW9uIGlzICdyZWxhdGl2ZSdcbiAgICAgICAgICAgICAgICAgICAgdG9wID0gTnVtYmVyLk1JTl9WQUxVRTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodHlwZW9mIG9uZm9jdXNfc3R5bGVzWydsZWZ0J10gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9ucy5pbmNsdWRlcyhvbmZvY3VzX3N0eWxlc1sncG9zaXRpb24nXSkgfHwgKHR5cGVvZiBvbmZvY3VzX3N0eWxlc1sncG9zaXRpb24nXSA9PT0gJ3VuZGVmaW5lZCcgJiYgcG9zaXRpb25zLmluY2x1ZGVzKGRlZmF1bHRfc3R5bGVzWydwb3NpdGlvbiddKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbGVmdCA9IG9uZm9jdXNfc3R5bGVzWydsZWZ0J10ucmVwbGFjZSgvXFxEL2csJycpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBwb3NpdGlvbiBpcyB1bmRlZmluZWQgYW5kIHRoZSBwYXJlbnQncyBwb3NpdGlvbiBpcyAncmVsYXRpdmUnXG4gICAgICAgICAgICAgICAgICAgIGxlZnQgPSBOdW1iZXIuTUlOX1ZBTFVFO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKHRvcCA+PSAwICYmIGxlZnQgPj0gMClcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIGVsc2VcbiAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX3Zpc2libGVcIiwgW10pO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGVtYmVkX2FsdF9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZW1iZWRfYWx0X2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmVtYmVkXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfRW1iZWRfSGFzQWx0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImVtYmVkX2FsdF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcImVtYmVkX2FsdF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImVtYmVkX2FsdF9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0aGF0IHRoZSA8ZW1iZWQ+IGVsZW1lbnQgaGFzIGFsdGVybmF0aXZlIGNvbnRlbnRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJQcm92aWRlIGFsdGVybmF0aXZlIGNvbnRlbnQgZm9yIDxlbWJlZD4gZWxlbWVudHNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX0ZPVVJcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwiYWx0XCIpO1xuICAgICAgICByZXR1cm4gcGFzc2VkID8gUnVsZVBhc3MoXCJQYXNzXzBcIikgOiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGVtb3RpY29uc19hbHRfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcImVtb3RpY29uc19hbHRfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX1RleHRfRW1vdGljb25zXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImVtb3RpY29uc19hbHRfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJlbW90aWNvbnNfYWx0X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZW1vdGljb25zX2FsdF9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0aGF0IGVtb3RpY29ucyBoYXZlIGEgdGV4dCBhbHRlcm5hdGl2ZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkVtb3RpY29ucyBtdXN0IGhhdmUgYSBzaG9ydCB0ZXh0IGFsdGVybmF0aXZlIHRoYXQgZGVzY3JpYmVzIHRoZWlyIHB1cnBvc2VcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBEZWNpc2lvbiBpbiBwbGFubmluZyA5LzcvMjMgdGhhdCB0aGlzIHJ1bGUgY2F1c2VzIG1vcmUgcmV2aWV3cyB0aGF0IHdlIHNlZSBhY3R1YWwgcHJvYmxlbXMgaW4gY29udGVudCwgc28gdHVybiB0aGVzZSBydWxlcyBvZmZcbiAgICBcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICAqL1xuICAgIHJ1bGVzZXRzOiBbXSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRlUGFyYW1zID0ge1xuICAgICAgICAgICAgZW1vdGljb25zOiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IFtcIjotKVwiLCBcIjopXCIsIFwiOm8pXCIsIFwiOl1cIiwgXCI6M1wiLCBcIjpjKVwiLCBcIjo+XCIsIFwiPV1cIiwgXCI4KVwiLCBcIj0pXCIsIFwiOkRcIiwgXCJDOlwiLFxuICAgICAgICAgICAgICAgICAgICBcIjotRFwiLCBcIjpEXCIsIFwiOERcIiwgXCJYRFwiLCBcIj1EXCIsIFwiPTNcIiwgXCI8PTNcIiwgXCI8PThcIiwgXCItLSEtLVwiLCBcIjotKFwiLCBcIjooXCIsIFwiOmNcIiwgXCI6PFwiLCBcIjpbXCIsXG4gICAgICAgICAgICAgICAgICAgIFwiRDpcIiwgXCJEOFwiLCBcIkQ7XCIsIFwiRD1cIiwgXCJEWFwiLCBcInYudlwiLCBcIjotOVwiLCBcIjstKVwiLCBcIjspXCIsIFwiKilcIiwgXCI7XVwiLCBcIjtEXCIsIFwiOi1QXCIsIFwiOlBcIixcbiAgICAgICAgICAgICAgICAgICAgXCI6LXBcIiwgXCI6cFwiLCBcIj1wXCIsIFwiOi3DnlwiLCBcIjrDnlwiLCBcIjotYlwiLCBcIjpiXCIsIFwiOi1PXCIsIFwiOk9cIiwgXCJPX09cIiwgXCJvX29cIiwgXCI4T1wiLCBcIk93T1wiLCBcIk8tT1wiLFxuICAgICAgICAgICAgICAgICAgICBcIjBfb1wiLCBcIk9fb1wiLCBcIk8zT1wiLCBcIm8wb8KgO29fbztcIiwgXCJvLi4ub1wiLCBcIjB3MFwiLCBcIjotL1wiLCBcIjovXCIsIFwiOlxcXFxcIiwgXCI9L1wiLCBcIj1cXFxcXCIsIFwiOlNcIiwgXCI6fFwiLFxuICAgICAgICAgICAgICAgICAgICBcImQ6LSlcIiwgXCJxQi0pXCIsIFwiOil+XCIsIFwiOi0pPi4uLi5cIiwgXCI6LVhcIiwgXCI6WFwiLCBcIjotI1wiLCBcIjojXCIsIFwiTzotKVwiLCBcIjA6M1wiLCBcIk86KVwiLCBcIjonKFwiLCBcIjsqKFwiLFxuICAgICAgICAgICAgICAgICAgICBcIlRfVFwiLCBcIlRUX1RUXCIsIFwiVC5UXCIsIFwiOi0qXCIsIFwiOipcIiwgXCJebylcIiwgXCI+OilcIiwgXCI+OylcIiwgXCI+Oi0pXCIsIFwiQilcIiwgXCJCLSlcIiwgXCI4KVwiLCBcIjgtKVwiLFxuICAgICAgICAgICAgICAgICAgICBcIl4+Lj5eXCIsIFwiXjwuPF5cIiwgXCJePl8+XlwiLCBcIl48XzxeXCIsIFwiRDo8XCIsIFwiPjooXCIsIFwiRC06PFwiLCBcIj46LShcIiwgXCI6LUBbMV1cIiwgXCI7KFwiLCBcImBfwrRcIiwgXCJEPFwiLFxuICAgICAgICAgICAgICAgICAgICBcIjwzXCIsIFwiPDMzM1wiLCBcIj1eX149XCIsIFwiPT4uPj1cIiwgXCI9PF88PVwiLCBcIj0+Ljw9XCIsIFwiXFxcXCwsL1wiLCBcIlxcXFxtL1wiLCBcIlxcXFxtL1xcXFw+LjwvXFxcXG0vXCIsIFwiXFxcXG8vXCIsIFwiXFxcXG8gby9cIixcbiAgICAgICAgICAgICAgICAgICAgXCJvL1xcXFxvXCIsIFwiOiZcIiwgXCI6dVwiXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICB0eXBlOiBcIltzdHJpbmddXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgZW1vdGljb25zID0gdmFsaWRhdGVQYXJhbXMuZW1vdGljb25zLnZhbHVlO1xuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgbGV0IHRlc3RUZXh0ID0gXCJcIjtcblxuICAgICAgICBsZXQgd2Fsa05vZGU6IE5vZGUgPSBydWxlQ29udGV4dC5maXJzdENoaWxkO1xuICAgICAgICB3aGlsZSAod2Fsa05vZGUpIHtcbiAgICAgICAgICAgIC8vIENvbXBseSB0byB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyB3aWxsIGJlIGRvbmUgYnkgZGVmYXVsdCBhcyB0aGlzIHJ1bGUgdHJpZ2dlcnMgb24gZWFjaCBlbGVtZW50XG4gICAgICAgICAgICAvLyBhbmQgZm9yIGVhY2ggZWxlbWVudCBpdCBvbmx5IGNoZWNrcyB0aGF0IHNpbmdsZSBlbGVtZW50cyB0ZXh0IG5vZGVzIGFuZCBub3RoaW5nIGVsc2UuIFNvIGFsbCBpbm5lciBlbGVtZW50cyB3aWxsIGJlXG4gICAgICAgICAgICAvLyBjb3ZlcmVkIG9uIHRoZWlyIG93bi4gQ3VycmVudGx5IGZvciB0aGlzIHJ1bGUgYnkgZGVmYXVsdCBDaGVjayBIaWRkZW4gQ29udGVudCB3aWxsIHdvcmssIGFzIHdlIGFyZSBkb2luZ1xuICAgICAgICAgICAgLy8gYSBub2RlIHdhbGsgb25seSBvbiBzaWJsaW5ncyBzbyBpdCB3b3VsZCBub3QgZ2V0IHRleHQgbm9kZXMgZnJvbSBvdGhlciBzaWJsaW5ncyBhdCBhbGwuXG4gICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSBpbiB0aGUgZnV0dXJlIHNvbWV0aGluZyBjaG5nZXMsIGp1c3QgbmVlZCB0byBhZGQgJiYgIVJQVFV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbih3YWxrTm9kZSkgdG8gdGhlIGJlbG93XG4gICAgICAgICAgICAvLyBpZi5cbiAgICAgICAgICAgIGlmICh3YWxrTm9kZS5ub2RlTmFtZSA9PSBcIiN0ZXh0XCIpIHtcbiAgICAgICAgICAgICAgICB0ZXN0VGV4dCArPSBcIiBcIiArIHdhbGtOb2RlLm5vZGVWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdhbGtOb2RlID0gd2Fsa05vZGUubmV4dFNpYmxpbmc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGVzdFRleHQudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBwYXNzZWQgJiYgaiA8IGVtb3RpY29ucy5sZW5ndGg7ICsraikge1xuICAgICAgICAgICAgICAgIGxldCBlbW90SWR4ID0gdGVzdFRleHQuaW5kZXhPZihlbW90aWNvbnNbal0pO1xuICAgICAgICAgICAgICAgIGxldCBlTG5ndGggPSBlbW90aWNvbnNbal0ubGVuZ3RoO1xuICAgICAgICAgICAgICAgIHdoaWxlIChwYXNzZWQgJiYgZW1vdElkeCAhPSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBQYXNzZXMgaWY6IHRoZSBlbW90aWNvbiBpcyBub3QgcHJlY2VkZWQgYnkgd2hpdGVzcGFjZSxcbiAgICAgICAgICAgICAgICAgICAgLy8gb3IgdGhlIGVtb3RpY29uIGlzIG5vdCBmb2xsb3dlZCBieSB3aGl0ZXNwYWNlIHVubGVzcyBpdCdzIHB1bmN0dWF0aW9uLFxuICAgICAgICAgICAgICAgICAgICAvLyBvciBpdCdzIGluIGEgcHJlLCBjb2RlLCBvciBzY3JpcHRcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID1cbiAgICAgICAgICAgICAgICAgICAgICAgIChlbW90SWR4ID4gMCAmJiAhL1xccy8udGVzdCh0ZXN0VGV4dC5zdWJzdHJpbmcoZW1vdElkeCAtIDEsIGVtb3RJZHgpKSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIChlbW90SWR4IDwgdGVzdFRleHQubGVuZ3RoIC0gZUxuZ3RoICYmICEvXFxzLy50ZXN0KHRlc3RUZXh0LnN1YnN0cmluZyhlbW90SWR4ICsgZUxuZ3RoLCBlbW90SWR4ICsgZUxuZ3RoICsgMSkpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIS9bLiwhJ1wiP10vLnRlc3QodGVzdFRleHQuc3Vic3RyaW5nKGVtb3RJZHggKyBlTG5ndGgsIGVtb3RJZHggKyBlTG5ndGggKyAxKSkpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIEFsbG93IHVzYWdlIG9mICg6IHN0dWZmIDopIHNpbmNlIHRoaXMgaXMgYSBjb21tZW50IGluIHNvbWUgbGFuZ3VhZ2VzXG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IHBhc3NlZCB8fCAoKGVtb3RpY29uc1tqXSA9PSBcIjopXCIgfHwgZW1vdGljb25zW2pdID09IFwiKDpcIikgJiYgL1xcKFxcOi4qXFw6XFwpLy50ZXN0KHRlc3RUZXh0KSk7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IHBhc3NlZCB8fCAoKGVtb3RpY29uc1tqXSA9PSBcIjspXCIgfHwgZW1vdGljb25zW2pdID09IFwiKDtcIikgJiYgL1xcKFxcOy4qXFw7XFwpLy50ZXN0KHRlc3RUZXh0KSk7XG4gICAgICAgICAgICAgICAgICAgIGVtb3RJZHggPSB0ZXN0VGV4dC5pbmRleE9mKGVtb3RpY29uc1tqXSwgZW1vdElkeCArIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAvLyBEb24ndCB0cmlnZ2VyIGlmIHdlJ3JlIG5vdCBpbiB0aGUgYm9keSBvciBpZiB3ZSdyZSBpbiBhIHNjcmlwdCwgcHJlLCBjb2RlXG4gICAgICAgICAgICBsZXQgY2hlY2tBbmNlc3RvciA9IENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFtcInByZVwiLCBcImNvZGVcIiwgXCJzY3JpcHRcIiwgXCJib2R5XCJdKTtcbiAgICAgICAgICAgIHBhc3NlZCA9IGNoZWNrQW5jZXN0b3IgPT0gbnVsbCB8fCBjaGVja0FuY2VzdG9yLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgIT0gXCJib2R5XCI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBlcnJvcl9tZXNzYWdlX2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJlcnJvcl9tZXNzYWdlX2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbYXJpYS1pbnZhbGlkPXRydWVdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJIQUFDX0FyaWFfRXJyb3JNZXNzYWdlXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJGYWlsXzJcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImVycm9yX21lc3NhZ2VfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZXJyb3JfbWVzc2FnZV9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJlcnJvcl9tZXNzYWdlX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZXJyb3JfbWVzc2FnZV9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJDdXN0b20gZXJyb3IgbWVzc2FnZSBoYXMgaW52YWxpZCByZWZlcmVuY2UgJ2lkJyB2YWx1ZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJDdXN0b20gZXJyb3IgbWVzc2FnZSBpcyBub3QgdmlzaWJsZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkEgY3VzdG9tIGVycm9yIG1lc3NhZ2UgbXVzdCByZWZlcmVuY2UgYSB2YWxpZCAnaWQnIHZhbHVlIGFuZCB3aGVuIHRyaWdnZXJlZCB0aGUgbWVzc2FnZSBtdXN0IGJlIGFwcHJvcHJpYXRlbHkgZXhwb3NlZFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMy4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IGFyaWFfZXJyTXNnSWQgPSBBcmlhVXRpbC5nZXRBcmlhQXR0cmlidXRlKHJ1bGVDb250ZXh0LCBcImFyaWEtZXJyb3JtZXNzYWdlXCIpO1xuXG4gICAgICAgIC8vIElmIGFyaWEtZXJyb3JtZXNzYWdlIGlzIG5vdCBwcm92aWRlZCwgdGhlbiBPVVRfT0ZfU0NPUEVcbiAgICAgICAgaWYgKCFhcmlhX2Vyck1zZ0lkKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBtc2dfZWxlID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQocnVsZUNvbnRleHQsIGFyaWFfZXJyTXNnSWQpO1xuXG4gICAgICAgIC8vIFBPRjA6IEludmFsaWQgaWQgcmVmZXJlbmNlXG4gICAgICAgIGlmICghbXNnX2VsZSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUE9GMTogUmVmZXJlbmNlZCBlbGVtZW50IGlzIG5vdCB2aXNpYmxlXG4gICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKG1zZ19lbGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzJcIik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG5pbXBvcnQgeyBDYWNoZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgQWNjTmFtZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BY2NOYW1lVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgZmllbGRzZXRfbGFiZWxfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZmllbGRzZXRfbGFiZWxfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImFyaWE6Z3JvdXBcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcImdyb3VwX3dpdGhJbnB1dHNfaGFzTmFtZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMVwiOiBcIlBhc3NfMVwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiRmFpbF8yXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzFcIjogXCJmaWVsZHNldF9sYWJlbF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImZpZWxkc2V0X2xhYmVsX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiZmllbGRzZXRfbGFiZWxfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImZpZWxkc2V0X2xhYmVsX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18xXCI6IFwiR3JvdXAvRmllbGRzZXQgXFxcInswfVxcXCIgd2l0aCBhbiBpbnB1dCBoYXMgYSB1bmlxdWUgbmFtZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJHcm91cC9GaWVsZHNldCBkb2VzIG5vdCBoYXZlIGFuIGFjY2Vzc2libGUgbmFtZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJHcm91cC9GaWVsZHNldCBcXFwiezB9XFxcIiBoYXMgYSBkdXBsaWNhdGUgbmFtZSB0byBhbm90aGVyIGdyb3VwXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiR3JvdXBzIHdpdGggbmVzdGVkIGlucHV0cyBtdXN0IGhhdmUgdW5pcXVlIGFjY2Vzc2libGUgbmFtZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbeyBcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sIFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiLCBcIjMuMy4yXCJdLCBcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sIFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFIFxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcblxuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IGlzIGhpZGRlbiBvciBkaXNhYmxlZFxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpIHx8IENvbW1vblV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIGxldCBvd25lckRvY3VtZW50ID0gRnJhZ21lbnRVdGlsLmdldE93bmVyRnJhZ21lbnQocnVsZUNvbnRleHQpO1xuICAgICAgICBsZXQgZm9ybUNhY2hlID0gQ2FjaGVVdGlsLmdldENhY2hlKFxuICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudCxcbiAgICAgICAgICAgIFwibGFuZG1hcmtfZ3JvdXBfaW5wdXRcIixcbiAgICAgICAgICAgIG51bGxcbiAgICAgICAgKTtcbiAgICAgICAgXG4gICAgICAgIGlmICghZm9ybUNhY2hlKSB7XG4gICAgICAgICAgICBmb3JtQ2FjaGUgPSB7XG4gICAgICAgICAgICAgICAgZ3JvdXBzV2l0aElucHV0czogW10sXG4gICAgICAgICAgICAgICAgZ3JvdXBzV2l0aElucHV0c0NvbXB1dGVkTGFiZWxzOiBbXSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBsZXQgYWxsR3JvdXBzVGVtcCA9IG93bmVyRG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcbiAgICAgICAgICAgICAgICAnZmllbGRzZXQsW3JvbGU9XCJncm91cFwiXSdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBsZXQgYWxsR3JvdXBzID0gQXJyYXkuZnJvbShhbGxHcm91cHNUZW1wKTtcbiAgICAgICAgICAgIGxldCBncm91cHNXaXRoSW5wdXRzID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFsbEdyb3Vwcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIC8vIExvb3Agb3ZlciBhbGwgdGhlIGdyb3VwIG5vZGVzXG4gICAgICAgICAgICAgICAgaWYgKGFsbEdyb3Vwc1tpXS5xdWVyeVNlbGVjdG9yKFwiaW5wdXRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBzV2l0aElucHV0cy5wdXNoKGFsbEdyb3Vwc1tpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGdyb3Vwc1dpdGhJbnB1dHNDb21wdXRlZExhYmVscyA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBncm91cHNXaXRoSW5wdXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZShncm91cHNXaXRoSW5wdXRzW2ldKTtcbiAgICAgICAgICAgICAgICAvLyBMb29wIG92ZXIgYWxsIHRoZSBsYW5kbWFyayBub2Rlc1xuICAgICAgICAgICAgICAgIGdyb3Vwc1dpdGhJbnB1dHNDb21wdXRlZExhYmVscy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAvKipBUklBTWFwcGVyLmNvbXB1dGVOYW1lKGdyb3Vwc1dpdGhJbnB1dHNbaV0pKi9cbiAgICAgICAgICAgICAgICAgICAgcGFpciAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwID8gcGFpci5uYW1lLnRyaW0oKSA6IFwiXCJcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9ybUNhY2hlLmdyb3Vwc1dpdGhJbnB1dHMgPSBncm91cHNXaXRoSW5wdXRzO1xuICAgICAgICAgICAgZm9ybUNhY2hlLmdyb3Vwc1dpdGhJbnB1dHNDb21wdXRlZExhYmVscyA9XG4gICAgICAgICAgICAgICAgZ3JvdXBzV2l0aElucHV0c0NvbXB1dGVkTGFiZWxzO1xuXG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUocnVsZUNvbnRleHQub3duZXJEb2N1bWVudCwgXCJsYW5kbWFya19ncm91cF9pbnB1dFwiLGZvcm1DYWNoZSk7ICAgIFxuICAgICAgICB9XG4gICAgICAgIC8vIGZvcm1DYWNoZS5ncm91cHNXaXRoSW5wdXRzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgIC8vICAgICBjb25zb2xlLmxvZyhcImZvcm1DYWNoZS5ncm91cHNXaXRoSW5wdXRzOiBcIiArZWxlbWVudC5pZClcbiAgICAgICAgLy8gfSk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiZm9ybUNhY2hlLmdyb3Vwc1dpdGhJbnB1dHNDb21wdXRlZExhYmVsczogXCIgK2Zvcm1DYWNoZS5ncm91cHNXaXRoSW5wdXRzQ29tcHV0ZWRMYWJlbHMpXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiZm9ybUNhY2hlLmdyb3Vwc1dpdGhJbnB1dHNDb21wdXRlZExhYmVsczogXCIgK2Zvcm1DYWNoZS5ncm91cHNXaXRoSW5wdXRzQ29tcHV0ZWRMYWJlbHMubGVuZ3RoKVxuXG4gICAgICAgIGxldCBydWxlQ29udGV4dEZvdW5kSW5ncm91cHNXaXRoSW5wdXRzRmxhZyA9IGZhbHNlO1xuICAgICAgICBsZXQgY29tcHV0ZWROYW1lID0gXCJcIjtcbiAgICAgICAgaWYgKCFmb3JtQ2FjaGUuZ3JvdXBzV2l0aElucHV0cykge1xuICAgICAgICAgICAgLy8gV2UgZG8gbm90IGhhdmUgYW55IGdyb3VwcyB3aXRoIGlucHV0cy4gVGhlcmVmb3JlIHdlIHNob3VsZCBza2lwIHRoaXMgcnVsZSB0cmlnZ2VyLlxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZvcm1DYWNoZS5ncm91cHNXaXRoSW5wdXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuaXNTYW1lTm9kZShmb3JtQ2FjaGUuZ3JvdXBzV2l0aElucHV0c1tpXSkpIHtcbiAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIGZvdW5kIG91ciBydWxlQ29udGV4dCBpbiB0aGUgY2FjaGVcbiAgICAgICAgICAgICAgICBydWxlQ29udGV4dEZvdW5kSW5ncm91cHNXaXRoSW5wdXRzRmxhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBmb3JtQ2FjaGUuZ3JvdXBzV2l0aElucHV0c0NvbXB1dGVkTGFiZWxzW2ldID09PSBcIlwiIHx8XG4gICAgICAgICAgICAgICAgICAgIGZvcm1DYWNoZS5ncm91cHNXaXRoSW5wdXRzQ29tcHV0ZWRMYWJlbHNbaV0gPT09IG51bGxcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJGYWlsXzFcIilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgZm91bmRTYW1lTmFtZUZsYWcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBmb3IgKFxuICAgICAgICAgICAgICAgICAgICBsZXQgaiA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGogPCBmb3JtQ2FjaGUuZ3JvdXBzV2l0aElucHV0c0NvbXB1dGVkTGFiZWxzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgaisrXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpID09IGopIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9IC8vIFdlIGRvIG5vdCB3YW50IHRvIGNvbXBhcmUgYWdhaW5zdCBvdXJzZWxmc1xuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ2FjaGUuZ3JvdXBzV2l0aElucHV0c0NvbXB1dGVkTGFiZWxzW2ldID09PVxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNhY2hlLmdyb3Vwc1dpdGhJbnB1dHNDb21wdXRlZExhYmVsc1tqXVxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kU2FtZU5hbWVGbGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZm91bmRTYW1lTmFtZUZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJGYWlsXzJcIilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8yXCIsIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1DYWNoZS5ncm91cHNXaXRoSW5wdXRzQ29tcHV0ZWRMYWJlbHNbaV0sXG4gICAgICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb21wdXRlZE5hbWUgPSBmb3JtQ2FjaGUuZ3JvdXBzV2l0aElucHV0c0NvbXB1dGVkTGFiZWxzW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghcnVsZUNvbnRleHRGb3VuZEluZ3JvdXBzV2l0aElucHV0c0ZsYWcpIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwibnVsbCByZXR1cm5cIilcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwiUGFzc18xXCIpXG4gICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMVwiLCBbY29tcHV0ZWROYW1lXSk7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBmaWVsZHNldF9sZWdlbmRfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZmllbGRzZXRfbGVnZW5kX3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJkb206ZmllbGRzZXRcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9GaWVsZHNldF9IYXNMZWdlbmRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkZhaWxfMlwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJGYWlsXzNcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImZpZWxkc2V0X2xlZ2VuZF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImZpZWxkc2V0X2xlZ2VuZF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcImZpZWxkc2V0X2xlZ2VuZF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcImZpZWxkc2V0X2xlZ2VuZF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZmllbGRzZXRfbGVnZW5kX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiPGZpZWxkc2V0PiBlbGVtZW50IGRvZXMgbm90IGhhdmUgYSA8bGVnZW5kPlwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCI8ZmllbGRzZXQ+IGVsZW1lbnQgaGFzIG1vcmUgdGhhbiBvbmUgPGxlZ2VuZD5cIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiPGZpZWxkc2V0PiBlbGVtZW50IDxsZWdlbmQ+IGlzIGVtcHR5XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiIDxmaWVsZHNldD4gZWxlbWVudHMgc2hvdWxkIGhhdmUgYSBzaW5nbGUsIG5vbi1lbXB0eSA8bGVnZW5kPiBhcyBhIGxhYmVsXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSwgIC8vaHR0cHM6Ly93d3cudzMub3JnL1dBSS9XQ0FHMjIvVGVjaG5pcXVlcy9odG1sL0g3MVxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAvL3NraXAgaWYgdGhlIGZpZWxkc2V0IGlzIGhpZGRlbiBvciBkaXNhYmxlZFxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpIHx8IENvbW1vblV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gSW4gdGhlIGNhc2UgYSBsZWdlbmQgaXMgaGlkZGVuLCB3ZSBzaG91bGQgc3RpbGwgdHJpZ2dlciBhIHZpb2xhdGlvbnMgZm9yIHRoaXNcbiAgICAgICAgbGV0IGxlZ2VuZHMgPSBDb21tb25VdGlsLmdldENoaWxkQnlUYWdIaWRkZW4ocnVsZUNvbnRleHQsIFwibGVnZW5kXCIsIHRydWUsIGZhbHNlKTtcbiAgICAgICAgaWYgKGxlZ2VuZHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBGaWVsZHNldCBoYXMgTk8gTGVnZW5kXG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH0gZWxzZSBpZiAobGVnZW5kcy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAvLyBGaWVsZHNldCBoYXMgbW9yZSB0aGFuIG9uZSBsZWdlbmRcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMlwiKTtcbiAgICAgICAgfSBlbHNlIGlmIChDb21tb25VdGlsLmdldElubmVyVGV4dChsZWdlbmRzWzBdKS50cmltKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAvLyBGaWVsZHNldCBoYXMgbGVnZW5kIGJ1dCBsZWdlbmQgaXMgZW1wdHlcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfM1wiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcbmltcG9ydCB7IEFjY05hbWVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQWNjTmFtZVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBmaWd1cmVfbGFiZWxfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcImZpZ3VyZV9sYWJlbF9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTpmaWd1cmVcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIkhBQUNfRmlndXJlX2xhYmVsXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiZmlndXJlX2xhYmVsX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImZpZ3VyZV9sYWJlbF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImZpZ3VyZV9sYWJlbF9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUaGUgPGZpZ3VyZT4gZWxlbWVudCBkb2VzIG5vdCBoYXZlIGFuIGFzc29jaWF0ZWQgbGFiZWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBIDxmaWd1cmU+IGVsZW1lbnQgbXVzdCBoYXZlIGFuIGFzc29jaWF0ZWQgbGFiZWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICAvLyBpZ25vcmUgaWYgYW4gZXhwbGljaXQgcm9sZSBpcyBzcGVjaWZpZWQuIHRoaXMgY2FzZSB3aWxsIGJlIGNvdmVyZWQgaW4gdGhlIGFyaWFfYWNjZXNzaWJsZW5hbWVfZXhpc3RzIHJ1bGVzXG4gICAgICAgIGxldCByb2xlID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwicm9sZVwiKTtcbiAgICAgICAgaWYgKHJvbGUpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9sZXQgcGFzc2VkID0gQXJpYVV0aWwuaGFzQXJpYUxhYmVsKHJ1bGVDb250ZXh0KSB8fCBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInRpdGxlXCIpO1xuICAgICAgICBjb25zdCBwYWlyID0gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgY29uc3QgcGFzc2VkID0gcGFpciAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwO1xuICAgICAgICAvL3JldHVybiBuZXcgVmFsaWRhdGlvblJlc3VsdChwYXNzZWQsIFtydWxlQ29udGV4dF0sICcnLCAnJywgW10pO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIsIFtdKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG5leHBvcnQgY29uc3QgZm9ybV9mb250X2NvbG9yOiBSdWxlID0ge1xuICAgIGlkOiBcImZvcm1fZm9udF9jb2xvclwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmZvcm1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9Gb250X0NvbG9ySW5Gb3JtXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImZvcm1fZm9udF9jb2xvci5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiZm9ybV9mb250X2NvbG9yLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJmb3JtX2ZvbnRfY29sb3IuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIkNoZWNrIGNvbG9yIGlzIG5vdCB1c2VkIGFzIHRoZSBvbmx5IHZpc3VhbCBtZWFucyB0byBjb252ZXkgd2hpY2ggZmllbGRzIGFyZSByZXF1aXJlZFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkNvbWJpbmUgY29sb3IgYW5kIGRlc2NyaXB0aXZlIG1hcmt1cCB0byBpbmRpY2F0ZSByZXF1aXJlZCBmb3JtIGZpZWxkc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS40LjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGxldCBmb250cyA9IHJ1bGVDb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiZm9udFwiKTtcbiAgICAgICAgaWYgKGZvbnRzICE9IG51bGwpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZm9udHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSAhZm9udHNbaV0uaGFzQXR0cmlidXRlKFwiY29sb3JcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGZvcm1faW50ZXJhY3Rpb25fcmV2aWV3OiBSdWxlID0ge1xuICAgIGlkOiBcImZvcm1faW50ZXJhY3Rpb25fcmV2aWV3XCIsXG4gICAgY29udGV4dDogXCJkb206Zm9ybVt0YXJnZXRdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfRm9ybV9UYXJnZXRBbmRUZXh0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImZvcm1faW50ZXJhY3Rpb25fcmV2aWV3Lmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJmb3JtX2ludGVyYWN0aW9uX3Jldmlldy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZm9ybV9pbnRlcmFjdGlvbl9yZXZpZXcuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0aGF0IGludGVyYWN0aW5nIHdpdGggY29udGVudCB3aWxsIG5vdCBvcGVuIHBvcC11cCB3aW5kb3dzIG9yIGNoYW5nZSB0aGUgYWN0aXZlIHdpbmRvdyB3aXRob3V0IGluZm9ybWluZyB0aGUgdXNlclwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlVzZXIgc2hvdWxkIGJlIGluZm9ybWVkIGluIGFkdmFuY2Ugd2hlbiBpbnRlcmFjdGluZyB3aXRoIGNvbnRlbnQgY2F1c2VzIGEgY2hhbmdlIG9mIGNvbnRleHRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjMuMi4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgdmFsaWRhdGVQYXJhbXMgPSB7XG4gICAgICAgICAgICBwYXJhbVdpblRleHQ6IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogW1wibmV3IHdpbmRvd1wiXSxcbiAgICAgICAgICAgICAgICB0eXBlOiBcImFycmF5XCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgdFN0ciA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInRhcmdldFwiKTtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRTdHIgPT09IFwiX3BhcmVudFwiIHx8IHRTdHIgPT09IFwiX3NlbGZcIiB8fCB0U3RyID09PSBcIl90b3BcIiB8fCBDb21tb25VdGlsLmdldEZyYW1lQnlOYW1lKHJ1bGVDb250ZXh0LCB0U3RyKSAhPSBudWxsO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgLy8gTmFtZSBpcyBub3QgcGFydCBvZiB0aGlzIGZyYW1lc2V0IOKAkyBtdXN0IGhhdmUgcG90ZW50aWFsIHRvIGNyZWF0ZSBuZXcgd2luZG93P1xuICAgICAgICAgICAgLy8gU2VlIGlmIGEgbmV3IHdpbmRvdyBpcyBtZW50aW9uZWRcbiAgICAgICAgICAgIGxldCB0ZXh0U3RyID0gQ29tbW9uVXRpbC5nZXRJbm5lclRleHQocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInRpdGxlXCIpKVxuICAgICAgICAgICAgICAgIHRleHRTdHIgKz0gXCIgXCIgKyBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0aXRsZVwiKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyAhcGFzc2VkICYmIGkgPCB2YWxpZGF0ZVBhcmFtcy5wYXJhbVdpblRleHQudmFsdWUubGVuZ3RoOyArK2kpXG4gICAgICAgICAgICAgICAgaWYgKHRleHRTdHIuaW5kZXhPZih2YWxpZGF0ZVBhcmFtcy5wYXJhbVdpblRleHQudmFsdWVbaV0pICE9IC0xKSBwYXNzZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgZm9ybV9sYWJlbF91bmlxdWU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZm9ybV9sYWJlbF91bmlxdWVcIixcbiAgICBjb250ZXh0OiBcImRvbTpsYWJlbFtmb3JdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfTGFiZWxfVW5pcXVlRm9yXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiZm9ybV9sYWJlbF91bmlxdWUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJmb3JtX2xhYmVsX3VuaXF1ZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZm9ybV9sYWJlbF91bmlxdWUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGb3JtIGNvbnRyb2wgaGFzIG1vcmUgdGhhbiBvbmUgbGFiZWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJGb3JtIGNvbnRyb2xzIHNob3VsZCBoYXZlIGV4YWN0bHkgb25lIGxhYmVsXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBKQ0ggLSBOTyBPVVQgT0YgU0NPUEUgaGlkZGVuIGluIGNvbnRleHRcbiAgICAgICAgbGV0IGxhYmVsSWRzID0gQ2FjaGVVdGlsLmdldENhY2hlKEZyYWdtZW50VXRpbC5nZXRPd25lckZyYWdtZW50KHJ1bGVDb250ZXh0KSwgXCJSUFRfTGFiZWxfU2luZ2xlXCIsIHt9KVxuICAgICAgICBsZXQgaWQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJmb3JcIik7XG4gICAgICAgIGxldCBwYXNzZWQgPSAhKGlkIGluIGxhYmVsSWRzKTtcbiAgICAgICAgbGFiZWxJZHNbaWRdID0gdHJ1ZTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01XYWxrZXJcIjtcblxuZXhwb3J0IGNvbnN0IGZvcm1fc3VibWl0X2J1dHRvbl9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZm9ybV9zdWJtaXRfYnV0dG9uX2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmZvcm1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9Gb3JtX0hhc1N1Ym1pdFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJmb3JtX3N1Ym1pdF9idXR0b25fZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJmb3JtX3N1Ym1pdF9idXR0b25fZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJmb3JtX3N1Ym1pdF9idXR0b25fZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgdGhlIDxmb3JtPiBlbGVtZW50IGhhcyBhIHN1Ym1pdCBidXR0b24gb3IgYW4gaW1hZ2UgYnV0dG9uXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQSA8Zm9ybT4gZWxlbWVudCBzaG91bGQgaGF2ZSBhIHN1Ym1pdCBidXR0b24gb3IgYW4gaW1hZ2UgYnV0dG9uXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIzLjIuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0LmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICAgIC8vIHN1Ym1pdCBidXR0b25zIGFyZSB1c3VhbGx5IGF0IHRoZSBib3R0b20gLSB3YWxrIGJhY2t3YXJkc1xuICAgICAgICAgICAgbGV0IG53ID0gbmV3IERPTVdhbGtlcihydWxlQ29udGV4dCwgdHJ1ZSk7XG4gICAgICAgICAgICB3aGlsZSAoIXBhc3NlZCAmJiBudy5wcmV2Tm9kZSgpICYmIG53Lm5vZGUgIT0gcnVsZUNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICBpZiAoIW53LmJFbmRUYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5vZGVOYW1lID0gbncubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwiaW5wdXRcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHR5cGUgPSBudy5lbGVtKCkuZ2V0QXR0cmlidXRlKFwidHlwZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IHR5cGUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IHR5cGUgPT09IFwic3VibWl0XCIgfHwgdHlwZSA9PT0gXCJpbWFnZVwiO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5vZGVOYW1lID09PSBcImJ1dHRvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBudy5lbGVtKCkuaGFzQXR0cmlidXRlKFwidHlwZVwiKSAmJiBudy5lbGVtKCkuZ2V0QXR0cmlidXRlKFwidHlwZVwiKS50b0xvd2VyQ2FzZSgpID09PSBcInN1Ym1pdFwiO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG53Lm5vZGUubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IEFyaWFVdGlsLmhhc1JvbGUobncubm9kZSwgXCJidXR0b25cIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5cbmV4cG9ydCBjb25zdCBmb3JtX3N1Ym1pdF9yZXZpZXc6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiZm9ybV9zdWJtaXRfcmV2aWV3XCIsXG4gICAgY29udGV4dDogXCJkb206c2VsZWN0W29uY2hhbmdlXSwgZG9tOmlucHV0W29uY2hhbmdlXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX0Zvcm1fQ2hhbmdlRW1wdHlcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiZm9ybV9zdWJtaXRfcmV2aWV3Lmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJmb3JtX3N1Ym1pdF9yZXZpZXcuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImZvcm1fc3VibWl0X3Jldmlldy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiQ29uZmlybSB0aGUgZm9ybSBkb2VzIG5vdCBzdWJtaXQgYXV0b21hdGljYWxseSB3aXRob3V0IHdhcm5pbmdcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBIGZvcm0gc2hvdWxkIG5vdCBiZSBzdWJtaXR0ZWQgYXV0b21hdGljYWxseSB3aXRob3V0IHdhcm5pbmcgdGhlIHVzZXJcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIzLjIuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSwqL1xuICAgIC8vZGVwcmVjYXRlIHRoZSBydWxlIG9uIEp1biAxMCwgMjAyNFxuICAgIHJ1bGVzZXRzOiBbXSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJvbmNoYW5nZVwiKS50cmltKCkubGVuZ3RoID09PSAwO1xuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgZnJhbWVfc3JjX3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcImZyYW1lX3NyY192YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmZyYW1lLCBkb206aWZyYW1lXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJWYWxlcmllX0ZyYW1lX1NyY0h0bWxcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImZyYW1lX3NyY192YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiZnJhbWVfc3JjX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJmcmFtZV9zcmNfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSA8ZnJhbWU+IGNvbnRlbnQgaXMgYWNjZXNzaWJsZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkEgPGZyYW1lPiBjb250YWluaW5nIG5vbi1IVE1MIGNvbnRlbnQgbXVzdCBiZSBtYWRlIGFjY2Vzc2libGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuNC4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwic3JjXCIpICYmXG4gICAgICAgICAgICBDb21tb25VdGlsLmlzSHRtbEV4dChDb21tb25VdGlsLmdldEZpbGVFeHQocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwic3JjXCIpKSk7XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBY2NOYW1lVXRpbCB9IGZyb20gXCIuLi91dGlsL0FjY05hbWVVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGZyYW1lX3RpdGxlX2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJmcmFtZV90aXRsZV9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTpmcmFtZSwgZG9tOmlmcmFtZVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0ZyYW1lX0hhc1RpdGxlXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiZnJhbWVfdGl0bGVfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiZnJhbWVfdGl0bGVfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZnJhbWVfdGl0bGVfZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJJbmxpbmUgZnJhbWVzIG11c3QgaGF2ZSBhIHVuaXF1ZSwgbm9uLWVtcHR5ICd0aXRsZScgYXR0cmlidXRlXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIklubGluZSBmcmFtZSBkb2VzIG5vdCBoYXZlIGEgJ3RpdGxlJyBhdHRyaWJ1dGVcIixcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCI0LjEuMlwiXSwgLypDaGFuZ2UgbWFwcGluZyB0byA0LjEuMiBmcm9tIDIuNC4xIHR5cG8/ICovXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBcImNhZTc2MFwiLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIC8vIGlnbm9yZSBpZiBhbiBleHBsaWNpdCByb2xlIGlzIHNwZWNpZmllZC4gdGhpcyBjYXNlIHdpbGwgYmUgY292ZXJlZCBpbiB0aGUgYXJpYV9hY2Nlc3NpYmxlbmFtZV9leGlzdHMgcnVsZXNcbiAgICAgICAgbGV0IHJvbGUgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpO1xuICAgICAgICBpZiAocm9sZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuYW1lX3BhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWUocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAobmFtZV9wYWlyICYmIG5hbWVfcGFpci5uYW1lICYmIG5hbWVfcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vaWYgKENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwidGl0bGVcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGhlYWRpbmdfY29udGVudF9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaGVhZGluZ19jb250ZW50X2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmgxLCBkb206aDIsIGRvbTpoMywgZG9tOmg0LCBkb206aDUsIGRvbTpoNlwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX0hlYWRlcl9IYXNDb250ZW50XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiaGVhZGluZ19jb250ZW50X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImhlYWRpbmdfY29udGVudF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImhlYWRpbmdfY29udGVudF9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJIZWFkaW5nIGVsZW1lbnQgaGFzIGRlc2NyaXB0aXZlIHRleHRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiSGVhZGluZyBlbGVtZW50IGhhcyBubyBkZXNjcmlwdGl2ZSBjb250ZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiSGVhZGluZyBlbGVtZW50cyBtdXN0IHByb3ZpZGUgZGVzY3JpcHRpdmUgdGV4dFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi40LjZcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcGFzc2VkID1Db21tb25VdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbihydWxlQ29udGV4dCk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBoZWFkaW5nX21hcmt1cF9taXN1c2U6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaGVhZGluZ19tYXJrdXBfbWlzdXNlXCIsXG4gICAgY29udGV4dDogXCJkb206aDEsIGRvbTpoMiwgZG9tOmgzLCBkb206aDQsIGRvbTpoNSwgZG9tOmg2XCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJoZWFkaW5nX2NvbnRlbnRfZXhpc3RzXCJdLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX0hlYWRlcnNfRmV3V29yZHNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiaGVhZGluZ19tYXJrdXBfbWlzdXNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJoZWFkaW5nX21hcmt1cF9taXN1c2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImhlYWRpbmdfbWFya3VwX21pc3VzZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVmVyaWZ5IHRoYXQgdGhlIGhlYWRpbmcgZWxlbWVudCBpcyBhIGdlbnVpbmUgaGVhZGluZ1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkhlYWRpbmcgZWxlbWVudHMgbXVzdCBub3QgYmUgdXNlZCBmb3IgcHJlc2VudGF0aW9uXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCB2YWxpZGF0ZVBhcmFtcyA9IHtcbiAgICAgICAgICAgIGhlYWRpbmdMZW5ndGhUaHJlc2g6IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogMjAsXG4gICAgICAgICAgICAgICAgdHlwZTogXCJpbnRlZ2VyXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgaGVhZGluZ0xlbmd0aFRocmVzaCA9IHZhbGlkYXRlUGFyYW1zLmhlYWRpbmdMZW5ndGhUaHJlc2gudmFsdWU7XG4gICAgICAgIGxldCBwYXNzZWQgPSBDb21tb25VdGlsLndvcmRDb3VudChDb21tb25VdGlsLmdldElubmVyVGV4dChydWxlQ29udGV4dCkpIDw9IGhlYWRpbmdMZW5ndGhUaHJlc2g7XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBbmNlc3RvclV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvYW5jZXN0b3JcIjtcbmltcG9ydCB7IExhbmdVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2xhbmdcIjtcblxuZXhwb3J0IGNvbnN0IGh0bWxfbGFuZ19leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaHRtbF9sYW5nX2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmh0bWxcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9IdG1sX0hhc0xhbmdcIjogeyBcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJGYWlsXzJcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiRmFpbF8zXCIsXG4gICAgICAgICAgICBcIkZhaWxfNFwiOiBcIkZhaWxfNFwiLFxuICAgICAgICAgICAgXCJGYWlsXzVcIjogXCJGYWlsXzVcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzVcIjogXCJQb3RlbnRpYWxfNVwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfNlwiOiBcIlBvdGVudGlhbF82XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogYGh0bWxfbGFuZ19leGlzdHMuaHRtbGAsIFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogYGh0bWxfbGFuZ19leGlzdHMuaHRtbGAsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBgaHRtbF9sYW5nX2V4aXN0cy5odG1sYCxcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IGBodG1sX2xhbmdfZXhpc3RzLmh0bWxgLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogYGh0bWxfbGFuZ19leGlzdHMuaHRtbGAsXG4gICAgICAgICAgICBcIkZhaWxfNFwiOiBgaHRtbF9sYW5nX2V4aXN0cy5odG1sYCxcbiAgICAgICAgICAgIFwiRmFpbF81XCI6IGBodG1sX2xhbmdfZXhpc3RzLmh0bWxgLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfNVwiOiBgaHRtbF9sYW5nX2V4aXN0cy5odG1sYCxcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzZcIjogYGh0bWxfbGFuZ19leGlzdHMuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiUGFnZSBtdXN0IGlkZW50aWZ5IHRoZSBkZWZhdWx0IGxhbmd1YWdlIG9mIHRoZSBkb2N1bWVudCB3aXRoIGEgJ2xhbmcnIGF0dHJpYnV0ZVwiLCBcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFnZSBsYW5ndWFnZSBkZXRlY3RlZCBhcyBcXFwiezB9XFxcIlwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJQYWdlIGRldGVjdGVkIGFzIFhIVE1MIDEuMCwgYnV0IGhhcyBuZWl0aGVyICdsYW5nJyBub3IgJ3htbDpsYW5nJyBhdHRyaWJ1dGVzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIlBhZ2UgZGV0ZWN0ZWQgYXMgWEhUTUwsIGJ1dCBkb2VzIG5vdCBoYXZlIGFuICd4bWw6bGFuZycgYXR0cmlidXRlXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcIlBhZ2UgZGV0ZWN0ZWQgYXMgSFRNTCwgYnV0IGRvZXMgbm90IGhhdmUgYSAnbGFuZycgYXR0cmlidXRlXCIsXG4gICAgICAgICAgICBcIkZhaWxfNFwiOiBcIlBhZ2UgZGV0ZWN0ZWQgd2l0aCAnbGFuZycgYW5kICd4bWw6bGFuZycgYXR0cmlidXRlcyBhbmQgcHJpbWFyeSBsYW5ndWFnZXMgZG8gbm90IG1hdGNoOiBcXFwiezB9XFxcIiwgXFxcInsxfVxcXCJcIixcbiAgICAgICAgICAgIFwiRmFpbF81XCI6IFwiUGFnZSBkZXRlY3RlZCB3aXRoICdsYW5nJyBhbmQgJ3htbDpsYW5nJyBhdHRyaWJ1dGVzIHRoYXQgZG8gbm90IG1hdGNoOiBcXFwiezB9XFxcIiwgXFxcInsxfVxcXCJcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzVcIjogXCJQYWdlIGRldGVjdGVkIGFzIFhIVE1MIDEuMCB3aXRoIG9ubHkgYSAnbGFuZycgYXR0cmlidXRlLiBDb25maXJtIHRoYXQgcGFnZSBpcyBvbmx5IGRlbGl2ZXJlZCB2aWEgdGV4dC9odG1sIG1pbWUgdHlwZVwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfNlwiOiBcIlBhZ2UgZGV0ZWN0ZWQgYXMgWEhUTUwgMS4wIHdpdGggb25seSBhbiAneG1sOmxhbmcnIGF0dHJpYnV0ZS4gQ29uZmlybSB0aGF0IHBhZ2UgaXMgb25seSBkZWxpdmVyZWQgdmlhIHhtbCBtaW1lIHR5cGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFsgXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIG51bTogXCIzLjEuMVwiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW3tcbiAgICAgICAgXCJiNWMzZjhcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImluYXBwbGljYWJsZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJpbmFwcGxpY2FibGVcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiZmFpbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzRcIjogXCJpbmFwcGxpY2FibGVcIixcbiAgICAgICAgICAgIFwiRmFpbF81XCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF81XCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF82XCI6IFwiaW5hcHBsaWNhYmxlXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCI1YjdhZTBcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImluYXBwbGljYWJsZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJpbmFwcGxpY2FibGVcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiaW5hcHBsaWNhYmxlXCIsXG4gICAgICAgICAgICBcIkZhaWxfNFwiOiBcImZhaWxcIixcbiAgICAgICAgICAgIFwiRmFpbF81XCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfNVwiOiBcImluYXBwbGljYWJsZVwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfNlwiOiBcImluYXBwbGljYWJsZVwiXG4gICAgICAgIH1cbiAgICB9XSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICAvLyBUaGlzIHJ1bGUgZG9lcyBub3QgYXBwbHkgaW5zaWRlIGEgcHJlc2VudGF0aW9uYWwgZnJhbWVcbiAgICAgICAgaWYgKEFuY2VzdG9yVXRpbC5pc1ByZXNlbnRhdGlvbkZyYW1lKGNvbnRleHRIaWVyYXJjaGllcykpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBkb2N0eXBlU3RyaW5nID0gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5kb2N0eXBlID8gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5kb2N0eXBlLnB1YmxpY0lkIDogXCJcIjtcbiAgICAgICAgaWYgKCFkb2N0eXBlU3RyaW5nKSBkb2N0eXBlU3RyaW5nID0gXCJcIjtcbiAgICAgICAgbGV0IGxhbmcgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJsYW5nXCIpO1xuICAgICAgICBsZXQgbGFuZ1hNTCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInhtbDpsYW5nXCIpO1xuXG4gICAgICAgIGlmIChkb2N0eXBlU3RyaW5nLmluY2x1ZGVzKCdYSFRNTCcpICYmICFkb2N0eXBlU3RyaW5nLmluY2x1ZGVzKFwiMS4wXCIpKSB7XG4gICAgICAgICAgICBpZiAoIWxhbmdYTUwpIHtcbiAgICAgICAgICAgICAgICAvLyBYSFRNTCAhPSAxLjAgKG11c3QgaGF2ZSB4bWw6bGFuZ1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMlwiKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIsW2xhbmdYTUxdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChkb2N0eXBlU3RyaW5nLmluY2x1ZGVzKCdYSFRNTCcpICYmIGRvY3R5cGVTdHJpbmcuaW5jbHVkZXMoXCIxLjBcIikpIHtcbiAgICAgICAgICAgIC8vIEhhbmRsZSBYSFRNTCAxLjBcbiAgICAgICAgICAgIC8vIElmIG5laXRoZXIgaXMgcHJvdmlkZWQsIGl0J3MgYSBmYWlsdXJlXG4gICAgICAgICAgICBpZiAoIWxhbmcgJiYgIWxhbmdYTUwpIHtcbiAgICAgICAgICAgICAgICAvLyBYSFRNTCBhbmQgbm8gbGFuZ1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobGFuZyAmJiBsYW5nWE1MKSB7XG4gICAgICAgICAgICAgICAgaWYgKGxhbmcgIT09IGxhbmdYTUwpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFMYW5nVXRpbC52YWxpZFByaW1hcnlMYW5nKGxhbmcpIHx8ICFMYW5nVXRpbC52YWxpZFByaW1hcnlMYW5nKGxhbmdYTUwpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBMZXQgRWxlbV9MYW5nX1ZhbGlkIGhhbmRsZSB0aGlzXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIUxhbmdVdGlsLm1hdGNoUHJpbWFyeUxhbmcobGFuZywgbGFuZ1hNTCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFhIVE1MIGFuZCBsYW5nIGFuZCB4bWw6bGFuZywgYnV0IHRoZXkgZG9uJ3QgbWF0Y2hcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfNFwiLCBbbGFuZywgbGFuZ1hNTF0sIFtdKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfNVwiLCBbbGFuZywgbGFuZ1hNTF0sIFtdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFhIVE1MIGFuZCBsYW5nIGFuZCB4bWw6bGFuZyBtYXRjaFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIixbbGFuZ10pXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChsYW5nKSB7XG4gICAgICAgICAgICAgICAgLy8gWEhUTUwgYW5kIG9ubHkgbGFuZyAob2theSBpZiBvbmx5IGRlbGl2ZXJlZCB2aWEgdGV4dC9odG1sKVxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzVcIik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFhIVE1MIGFuZCBvbmx5IHhtbDpsYW5nIChva2F5IGlmIG9ubHkgZGVsaXZlcmVkIHZpYSB4bWwgbWltZSB0eXBlKVxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzZcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIWxhbmcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzNcIik7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxhbmcgJiYgbGFuZ1hNTCkge1xuICAgICAgICAgICAgICAgIC8vIEhUTUw1IHBvbHlnbG90IGRvY3VtZW50c1xuICAgICAgICAgICAgICAgIGlmIChsYW5nICE9PSBsYW5nWE1MKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghTGFuZ1V0aWwudmFsaWRQcmltYXJ5TGFuZyhsYW5nKSB8fCAhTGFuZ1V0aWwudmFsaWRQcmltYXJ5TGFuZyhsYW5nWE1MKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGV0IEVsZW1fTGFuZ19WYWxpZCBoYW5kbGUgdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFMYW5nVXRpbC5tYXRjaFByaW1hcnlMYW5nKGxhbmcsIGxhbmdYTUwpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBYSFRNTCBhbmQgbGFuZyBhbmQgeG1sOmxhbmcsIGJ1dCB0aGV5IGRvbid0IG1hdGNoXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzRcIiwgW2xhbmcsIGxhbmdYTUxdLCBbXSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzVcIiwgW2xhbmcsIGxhbmdYTUxdLCBbXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBYSFRNTCBhbmQgbGFuZyBhbmQgeG1sOmxhbmcgbWF0Y2hcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIsW2xhbmddKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIsW2xhbmddKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG4gICAgXG5leHBvcnQgY29uc3QgaHRtbF9za2lwbmF2X2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJodG1sX3NraXBuYXZfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJkb206aHRtbFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX0h0bWxfU2tpcE5hdlwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogYGh0bWxfc2tpcG5hdl9leGlzdHMuaHRtbGAsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBgaHRtbF9za2lwbmF2X2V4aXN0cy5odG1sYCxcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogYGh0bWxfc2tpcG5hdl9leGlzdHMuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiUHJvdmlkZSBhIHdheSB0byBieXBhc3MgYmxvY2tzIG9mIGNvbnRlbnQgdGhhdCBhcmUgcmVwZWF0ZWQgb24gbXVsdGlwbGUgV2ViIHBhZ2VzXCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVmVyaWZ5IHRoZXJlIGlzIGEgd2F5IHRvIGJ5cGFzcyBibG9ja3Mgb2YgY29udGVudCB0aGF0IGFyZSByZXBlYXRlZCBvbiBtdWx0aXBsZSBXZWIgcGFnZXNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFsgXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIG51bTogXCIyLjQuMVwiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgIGxldCBmcmFtZXMgPSBDb21tb25VdGlsLmdldERvY0VsZW1lbnRzQnlUYWcocnVsZUNvbnRleHQsIFwiZnJhbWVcIik7XG4gICAgICAgIGxldCBoZWFkZXJzID0gQ29tbW9uVXRpbC5nZXREb2NFbGVtZW50c0J5VGFnKHJ1bGVDb250ZXh0LCBcImgxXCIpO1xuXG4gICAgICAgIGlmICgoZnJhbWVzICE9IG51bGwgJiYgZnJhbWVzLmxlbmd0aCA+IDApIHx8IChoZWFkZXJzICE9IG51bGwgJiYgaGVhZGVycy5sZW5ndGggPiAwKSkge1xuICAgICAgICAgICAgLy8gSWYgZnJhbWVzIG9yIGhlYWRpbmdzIGFyZSB1c2VkLCBwYXNzXG4gICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gTG9vayBmb3Igc2tpcCBhbmNob3JzXG4gICAgICAgICAgICBsZXQgYW5jaG9ycyA9IENvbW1vblV0aWwuZ2V0RG9jRWxlbWVudHNCeVRhZyhydWxlQ29udGV4dCwgXCJhXCIpO1xuICAgICAgICAgICAgbGV0IHRhcmdldHMgPSB7fTtcbiAgICAgICAgICAgIGZvciAobGV0IGlkeCA9IDA7ICFwYXNzZWQgJiYgaWR4IDwgYW5jaG9ycy5sZW5ndGg7ICsraWR4KSB7XG4gICAgICAgICAgICAgICAgaWYgKGFuY2hvcnNbaWR4XS5oYXNBdHRyaWJ1dGUoXCJocmVmXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBocmVmID0gYW5jaG9yc1tpZHhdLmhyZWY7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaHJlZiAhPT0gdHlwZW9mIFwiXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChocmVmLmJhc2VWYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBocmVmID0gaHJlZi5iYXNlVmFsO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBocmVmID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZXQgdG1wTG9jYXRpb247XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgKChydWxlQ29udGV4dC5vd25lckRvY3VtZW50IGFzIGFueSkubG9jYXRpb25Gcm9tREFQKSAhPSBcInVuZGVmaW5lZFwiICYmIChydWxlQ29udGV4dC5vd25lckRvY3VtZW50IGFzIGFueSkubG9jYXRpb25Gcm9tREFQICE9IG51bGwpIHsgLy8gREFQIHNldHMgaXRcbiAgICAgICAgICAgICAgICAgICAgICAgIHRtcExvY2F0aW9uID0gKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQgYXMgYW55KS5sb2NhdGlvbkZyb21EQVA7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIHNlcnZlciBzY2FuIGhhcyB0aGUgbG9jYXRpb24gb2JqZWN0XG4gICAgICAgICAgICAgICAgICAgICAgICB0bXBMb2NhdGlvbiA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQubG9jYXRpb247XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGV0IGRvY0hyZWYgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICBpZiAodG1wTG9jYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY0hyZWYgPSB0bXBMb2NhdGlvbi5ocmVmO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIEZpeCB3ZWlyZCBidWdzIHdpdGggaG93IHZhcmlvdXMgcGFyc2VycyByZXBvcnQgb24gZmlsZTogdXJsJ3M6XG4gICAgICAgICAgICAgICAgICAgIGlmIChocmVmLnN0YXJ0c1dpdGgoXCJmaWxlOi8vL1wiKSkgaHJlZiA9IFwiZmlsZTovXCIgKyBocmVmLnN1YnN0cmluZyhcImZpbGU6Ly8vXCIubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRvY0hyZWYuc3RhcnRzV2l0aChcImZpbGU6Ly8vXCIpKSBkb2NIcmVmID0gXCJmaWxlOi9cIiArIGRvY0hyZWYuc3Vic3RyaW5nKFwiZmlsZTovLy9cIi5sZW5ndGgpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChocmVmLmNoYXJBdCgwKSA9PSBcIiNcIiB8fCBocmVmLnN0YXJ0c1dpdGgoZG9jSHJlZiArIFwiI1wiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRhcmdldCA9IENvbW1vblV0aWwuZ2V0RmlsZUFuY2hvcihocmVmKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChGcmFnbWVudFV0aWwuZ2V0QnlJZChydWxlQ29udGV4dCwgdGFyZ2V0KSAhPSBudWxsKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0c1t0YXJnZXRdID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYW5jaG9yc1tpZHhdLmhhc0F0dHJpYnV0ZShcIm5hbWVcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQXNzdW1lIGZvcndhcmQganVtcGluZyB0YXJnZXRzXG4gICAgICAgICAgICAgICAgICAgIGxldCBuYW1lID0gYW5jaG9yc1tpZHhdLmdldEF0dHJpYnV0ZShcIm5hbWVcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lLmluZGV4T2YoXCIjXCIpICE9IC0xKVxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IENvbW1vblV0aWwuZ2V0RmlsZUFuY2hvcihuYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gbmFtZSBpbiB0YXJnZXRzO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5pbXBvcnQgeyBET01NYXBwZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTU1hcHBlclwiO1xuXG5leHBvcnQgY29uc3QgaWZyYW1lX2ludGVyYWN0aXZlX3RhYmJhYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcImlmcmFtZV9pbnRlcmFjdGl2ZV90YWJiYWJsZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmlmcmFtZVwiLFxuICAgIGRlcGVuZGVuY2llczogW10sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpZnJhbWVfaW50ZXJhY3RpdmVfdGFiYmFibGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJwYXNzXCI6IFwiaWZyYW1lX2ludGVyYWN0aXZlX3RhYmJhYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9pbnZhbGlkXCI6IFwiaWZyYW1lX2ludGVyYWN0aXZlX3RhYmJhYmxlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJJZnJhbWUgd2l0aCBpbnRlcmFjdGl2ZSBjb250ZW50IHNob3VsZCBub3QgYmUgZXhjbHVkZWQgZnJvbSB0YWIgb3JkZXIgdXNpbmcgdGFiaW5kZXhcIixcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlRoZSBpZnJhbWUgd2l0aCBpbnRlcmFjdGl2ZSBjb250ZW50IGlzIG5vdCBleGNsdWRlZCBmcm9tIHRoZSB0YWIgb3JkZXIgdXNpbmcgdGFiaW5kZXhcIixcbiAgICAgICAgICAgIFwiZmFpbF9pbnZhbGlkXCI6IFwiVGhlIDxpZnJhbWU+IHdpdGggaW50ZXJhY3RpdmUgY29udGVudCBpcyBleGNsdWRlZCBmcm9tIHRhYiBvcmRlciB1c2luZyB0YWJpbmRleFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBpZDogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBudW06IFtcIjIuMS4xXCJdLFxuICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXCJha243Ym5cIl0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIG9yIGRpc2FibGVkXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkgfHwgQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIFxuICAgICAgICBjb25zdCBtYXBwZXIgOiBET01NYXBwZXIgPSBuZXcgRE9NTWFwcGVyKCk7XG4gICAgICAgIGNvbnN0IGJvdW5kcyA9IG1hcHBlci5nZXRVbmFkanVzdGVkQm91bmRzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgLy9pbiBjYXNlIHRoZSBib3VuZHMgbm90IGF2YWlsYWJsZVxuICAgICAgICBpZiAoIWJvdW5kcykgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICAvLyBpZ25vcmUgaWYgaWZyYW1lIGlzIHRvbyBzbWFsbCB0byBiZSB2aXNpYmxlIG9uIHNjcmVlblxuICAgICAgICBpZiAoTWF0aC5tYXgoYm91bmRzWydoZWlnaHQnXSwgYm91bmRzWyd3aWR0aCddKSA8IDMwIHx8IE1hdGgubWluKGJvdW5kc1snaGVpZ2h0J10sIGJvdW5kc1snd2lkdGgnXSkgPCAxNSkgIFxuICAgICAgICAgICByZXR1cm4gbnVsbDsgXG5cbiAgICAgICAgLy8gcGFzcyBpZnJhbWUgZWxlbWVudCBkb2VzIG5vdCBoYXZlIGEgdGFiaW5kZXggYXR0cmlidXRlIHZhbHVlIHRoYXQgaXMgYSBuZWdhdGl2ZSBudW1iZXJcbiAgICAgICAgaWYgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSB8fCBwYXJzZUludChydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSkgPj0gMClcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG5cbiAgICAgICAgLy8gY2hlY2sgaWZyYW1lIGNvbnRlbnRcbiAgICAgICAgY29uc3QgaWZyYW1FbGVtID0gcnVsZUNvbnRleHQgYXMgSFRNTElGcmFtZUVsZW1lbnQ7XG4gICAgICAgIGlmICghaWZyYW1FbGVtIHx8ICFpZnJhbUVsZW0uY29udGVudERvY3VtZW50IHx8ICFpZnJhbUVsZW0uY29udGVudERvY3VtZW50LmRvY3VtZW50RWxlbWVudClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IGNvdW50ID0gQ29tbW9uVXRpbC5nZXRUYWJiYWJsZUNoaWxkcmVuKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKGNvdW50ID4gMClcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfaW52YWxpZFwiKTtcblxuICAgICAgICByZXR1cm4gbnVsbDsgICAgXG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgaW1hZ2VidXR0b25fYWx0X2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJpbWFnZWJ1dHRvbl9hbHRfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJkb206aW5wdXRcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9JbnB1dF9FeHBsaWNpdExhYmVsSW1hZ2VcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUGFzc18xXCI6IFwiUGFzc18xXCIsXG4gICAgICAgICAgICBcIlBhc3NfMlwiOiBcIlBhc3NfMlwiLFxuICAgICAgICAgICAgXCJGYWlsXCI6IFwiRmFpbFwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiaW1hZ2VidXR0b25fYWx0X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NfMVwiOiBcImltYWdlYnV0dG9uX2FsdF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJQYXNzXzJcIjogXCJpbWFnZWJ1dHRvbl9hbHRfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbFwiOiBcImltYWdlYnV0dG9uX2FsdF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImltYWdlYnV0dG9uX2FsdF9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJJbWFnZSBidXR0b24gcHJvdmlkZXMgYWx0ZXJuYXRpdmUgdGV4dCB1c2luZyB0aGUgJ2FsdCcgYXR0cmlidXRlXCIsXG4gICAgICAgICAgICBcIlBhc3NfMVwiOiBcIkltYWdlIGJ1dHRvbiBwcm92aWRlcyBhbHRlcm5hdGl2ZSB0ZXh0IHVzaW5nIGFuIEFSSUEgbGFiZWxcIixcbiAgICAgICAgICAgIFwiUGFzc18yXCI6IFwiSW1hZ2UgYnV0dG9uIHByb3ZpZGVzIGFsdGVybmF0aXZlIHRleHQgdXNpbmcgdGhlICd0aXRsZScgYXR0cmlidXRlXCIsXG4gICAgICAgICAgICBcIkZhaWxcIjogXCJUaGUgPGlucHV0PiBlbGVtZW50IG9mIHR5cGUgXFxcImltYWdlXFxcIiBoYXMgbm8gdGV4dCBhbHRlcm5hdGl2ZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSA8aW5wdXQ+IGVsZW1lbnQgb2YgdHlwZSBcXFwiaW1hZ2VcXFwiIHNob3VsZCBoYXZlIGEgdGV4dCBhbHRlcm5hdGl2ZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogXCI1OTc5NmZcIixcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICAvLyBTZWUgaHR0cHM6Ly93d3cudzMub3JnL1dBSS9XQ0FHMjIvVGVjaG5pcXVlcy9mYWlsdXJlcy9GNjVcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgaWYgKCFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0eXBlXCIpIHx8IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInR5cGVcIikudG9Mb3dlckNhc2UoKSAhPSBcImltYWdlXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGlmIChDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcImFsdFwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9IGVsc2UgaWYgKEFyaWFVdGlsLmhhc0FyaWFMYWJlbChydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMVwiKTtcbiAgICAgICAgfSBlbHNlIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0aXRsZVwiKSAmJiBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0aXRsZVwiKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzJcIik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbFwiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGltYWdlbWFwX2FsdF9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaW1hZ2VtYXBfYWx0X2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmltZ1t1c2VtYXBdLCBkb206aW1nW2lzbWFwXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiSEFBQ19JbWdfVXNlbWFwQWx0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiaW1hZ2VtYXBfYWx0X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImltYWdlbWFwX2FsdF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImltYWdlbWFwX2FsdF9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJJbWFnZSBtYXAgb3IgY2hpbGQgPGFyZWE+IGhhcyBubyB0ZXh0IGFsdGVybmF0aXZlXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQW4gaW1hZ2UgbWFwIGFuZCBlYWNoIDxhcmVhPiBlbGVtZW50IGluIGFuIGltYWdlIG1hcCBtdXN0IGhhdmUgdGV4dCBhbHRlcm5hdGl2ZShzKVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgcGFzc2VkID0gQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJhbHRcIikgfHxcbiAgICAgICAgICAgICghcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiaXNtYXBcIikgJiYgIUNvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwidXNlbWFwXCIpKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgaW1nX2FsdF9iYWNrZ3JvdW5kOiBSdWxlID0ge1xuICAgIGlkOiBcImltZ19hbHRfYmFja2dyb3VuZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIkhBQUNfQmFja2dyb3VuZEltZ19IYXNUZXh0T3JUaXRsZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIk1hbnVhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJpbWdfYWx0X2JhY2tncm91bmQuaHRtbFwiLFxuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcImltZ19hbHRfYmFja2dyb3VuZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiaW1nX2FsdF9iYWNrZ3JvdW5kLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJWZXJpZnkgaW1wb3J0YW50IGJhY2tncm91bmQgaW1hZ2UgaW5mb3JtYXRpb24gaGFzIGEgdGV4dCBhbHRlcm5hdGl2ZSBpbiBzeXN0ZW0gaGlnaCBjb250cmFzdCBtb2RlXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQmFja2dyb3VuZCBpbWFnZXMgdGhhdCBjb252ZXkgaW1wb3J0YW50IGluZm9ybWF0aW9uIG11c3QgaGF2ZSBhIHRleHQgYWx0ZXJuYXRpdmUgdGhhdCBkZXNjcmliZXMgdGhlIGltYWdlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IGRvYyA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQ7XG4gICAgICAgIGxldCBzdHlsZSA9IGRvYy5kZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKHN0eWxlID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYmFja2dyb3VuZEltZ3MgPSBzdHlsZS5iYWNrZ3JvdW5kSW1hZ2U7XG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuXG4gICAgICAgIGlmIChiYWNrZ3JvdW5kSW1ncyAhPSBudWxsICYmIGJhY2tncm91bmRJbWdzICE9IFwiXCIgJiYgYmFja2dyb3VuZEltZ3MgIT0gJ25vbmUnICYmIGJhY2tncm91bmRJbWdzICE9ICdpbmhlcml0Jykge1xuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0LmlubmVySFRNTCAhPSBudWxsICYmIHJ1bGVDb250ZXh0LmlubmVySFRNTC50cmltKCkubGVuZ3RoICE9IDApIHtcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHRpdGxlID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKCd0aXRsZScpO1xuICAgICAgICAgICAgICAgIGlmICh0aXRsZSAhPSBudWxsICYmIHRpdGxlLmxlbmd0aCAhPSAwKVxuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZU1hbnVhbChcIk1hbnVhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGltZ19hbHRfZGVjb3JhdGl2ZTogUnVsZSA9IHtcbiAgICBpZDogXCJpbWdfYWx0X2RlY29yYXRpdmVcIixcbiAgICBjb250ZXh0OiBcImRvbTppbWdbYWx0XVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0ltZ19QcmVzZW50YXRpb25JbWdIYXNOb25OdWxsQWx0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiaW1nX2FsdF9kZWNvcmF0aXZlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiaW1nX2FsdF9kZWNvcmF0aXZlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpbWdfYWx0X2RlY29yYXRpdmUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJJbWFnZSBkZXNpZ25hdGVkIGFzIGRlY29yYXRpdmUgaGFzIG5vbi1udWxsICdhbHQnIGF0dHJpYnV0ZVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkltYWdlIGRlc2lnbmF0ZWQgYXMgZGVjb3JhdGl2ZSBtdXN0IGhhdmUgJ2FsdD1cXFwiXFxcIlwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgaWYgKEFyaWFVdGlsLmhhc1JvbGUocnVsZUNvbnRleHQsIFwicHJlc2VudGF0aW9uXCIpIHx8IEFyaWFVdGlsLmhhc1JvbGUocnVsZUNvbnRleHQsIFwibm9uZVwiKSkge1xuICAgICAgICAgICAgcGFzc2VkID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYWx0XCIpLmxlbmd0aCA9PSAwO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBpbWdfYWx0X21pc3VzZTogUnVsZSA9IHtcbiAgICBpZDogXCJpbWdfYWx0X21pc3VzZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmltZywgZG9tOmFyZWEsIGRvbTppbnB1dFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX0ltZ19BbHRDb21tb25NaXN1c2VcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiaW1nX2FsdF9taXN1c2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcImltZ19hbHRfbWlzdXNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpbWdfYWx0X21pc3VzZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVmVyaWZ5IHRoYXQgdGhlIGZpbGUgbmFtZSBzZXJ2ZXMgYXMgYSBnb29kIGlubGluZSByZXBsYWNlbWVudCBmb3IgdGhlIGltYWdlXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiJ2FsdCcgYXR0cmlidXRlIHZhbHVlIG11c3QgYmUgYSBnb29kIGlubGluZSByZXBsYWNlbWVudCBmb3IgdGhlIGltYWdlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCB2YWxpZGF0ZVBhcmFtcyA9IHtcbiAgICAgICAgICAgIGJhZFRleHQ6IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogW1wic2hvcnQgZGVzY3JpcHRpb25cIl0sXG4gICAgICAgICAgICAgICAgdHlwZTogXCJbc3RyaW5nXVwiXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgLy8gQWx0IHRleHQgY2hlY2sgYXJlIGVsc2V3aGVyZSAoU2VlIDQxLCAyNDAsIDQ1NSlcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImFsdFwiKSkge1xuICAgICAgICAgICAgbGV0IGFsdFRleHQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhbHRcIikudHJpbSgpO1xuICAgICAgICAgICAgaWYgKGFsdFRleHQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCBiYWRUZXh0ID0gdmFsaWRhdGVQYXJhbXMuYmFkVGV4dC52YWx1ZTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgcGFzc2VkICYmIGkgPCBiYWRUZXh0Lmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGFsdFRleHQuaW5kZXhPZihiYWRUZXh0W2ldKSA9PSAtMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHBhc3NlZCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgc3JjID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKChub2RlTmFtZSA9PSBcImFyZWFcIikgPyBcImhyZWZcIiA6IFwic3JjXCIpO1xuICAgICAgICAgICAgICAgICAgICAvLyBBbGxvdyBpdCB0byBwYXNzIGlmIHRoZXJlJ3Mgbm8gc3JjIC0gY2FuJ3QgZGV0ZXJtaW5lIHRoZXNlLlxuICAgICAgICAgICAgICAgICAgICBpZiAoc3JjICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZhaWwgaWYgdGhlIGFsdCBtYXRjaGVzIHRoZSBzcmMgZXhhY3RseVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWxzbyBmYWlsIGlmIHRoZSBhbHQgaGFzIGEgLiBpbiBpdCBhbmQgZWl0aGVyIHRoZSBzcmMgaXMgaW4gdGhlIGFsdCBvciB0aGUgYWx0IGlzIGluIHRoZSBzcmNcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IHNyYy50cmltKCkgIT0gYWx0VGV4dCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbHRUZXh0LmluZGV4T2YoXCIuXCIpID09IC0xIHx8IChhbHRUZXh0LmluZGV4T2Yoc3JjKSA9PSAtMSAmJiBzcmMuaW5kZXhPZihhbHRUZXh0KSA9PSAtMSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlUG90ZW50aWFsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGltZ19hbHRfbnVsbDogUnVsZSA9IHtcbiAgICBpZDogXCJpbWdfYWx0X251bGxcIixcbiAgICBjb250ZXh0OiBcImRvbTppbWdbYWx0XVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0ltZ19UaXRsZUVtcHR5V2hlbkFsdE51bGxcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImZhaWxfZGVjb3JhdGl2ZVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImltZ19hbHRfbnVsbC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfZGVjb3JhdGl2ZVwiOiBcImltZ19hbHRfbnVsbC5odG1sXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9hcmlhX292ZXJyaWRlXCI6IFwiaW1nX2FsdF9udWxsLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpbWdfYWx0X251bGwuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiTmVpdGhlciAnYXJpYScgbm9yICd0aXRsZScgYXR0cmlidXRlcyBhcmUgdXNlZCBmb3IgdGhlIGRlY29yYXRpdmUgaW1hZ2VcIixcbiAgICAgICAgICAgIFwiZmFpbF9kZWNvcmF0aXZlXCI6IFwiVGhlIGltYWdlICdhbHQnIGF0dHJpYnV0ZSBpcyBlbXB0eSwgYnV0IHRoZSAndGl0bGUnIGF0dHJpYnV0ZSBpcyBub3QgZW1wdHlcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX2FyaWFfb3ZlcnJpZGVcIjogXCJUaGUgaW1hZ2UgJ2FsdCcgYXR0cmlidXRlIGlzIGVtcHR5LCBidXQgdGhlICdhcmlhJyBsYWJlbCBpcyBub3QgZW1wdHkgYW5kIG92ZXJyaWRlcyB0aGUgJ2FsdCcgYXR0cmlidXRlXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiV2hlbiB0aGUgaW50ZW50IGlzIHRvIG1hcmsgYW4gaW1hZ2UgYXMgZGVjb3JhdGl2ZSB3aXRoIGFuIGVtcHR5ICdhbHQnIGF0dHJpYnV0ZSwgdGhlICdhcmlhJyBvciAndGl0bGUnIGF0dHJpYnV0ZXMgc2hvdWxkIG5vdCBiZSB1c2VkXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FLFxuICAgICAgICByZWFzb25Db2RlczogW1wiZmFpbF9kZWNvcmF0aXZlXCJdXG4gICAgfSxcbiAgICB7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCJBUklBXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkUsXG4gICAgICAgIHJlYXNvbkNvZGVzOiBbXCJwb3RlbnRpYWxfYXJpYV9vdmVycmlkZVwiXVxuICAgIH1cbiAgICBdLFxuICAgIGFjdDogW3tcIjQ2Y2E3ZlwiOiB7XCJwb3RlbnRpYWxfYXJpYV9vdmVycmlkZVwiOiBcImZhaWxcIn19XSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmIChydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhbHRcIikudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdlIGhhdmUgYSB0aXRsZSwgYnV0IGFsdCBpcyBlbXB0eVxuICAgICAgICBpZiAoQXJpYVV0aWwuZ2V0QXJpYUxhYmVsKHJ1bGVDb250ZXh0KS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF9hcmlhX292ZXJyaWRlXCIpO1xuICAgICAgICB9IGVsc2UgaWYgKENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwidGl0bGVcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfZGVjb3JhdGl2ZVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGltZ19hbHRfcmVkdW5kYW50OiBSdWxlID0ge1xuICAgIGlkOiBcImltZ19hbHRfcmVkdW5kYW50XCIsXG4gICAgY29udGV4dDogXCJkb206aW1nW2FsdF1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9JbWdfTGlua1RleHROb3RSZWR1bmRhbnRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkZhaWxfMlwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJGYWlsXzNcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImltZ19hbHRfcmVkdW5kYW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiaW1nX2FsdF9yZWR1bmRhbnQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJpbWdfYWx0X3JlZHVuZGFudC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcImltZ19hbHRfcmVkdW5kYW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpbWdfYWx0X3JlZHVuZGFudC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkxpbmsgdGV4dCBpcyByZXBlYXRlZCBpbiBhbiBpbWFnZSAnYWx0JyB2YWx1ZSB3aXRoaW4gdGhlIHNhbWUgbGlua1wiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJMaW5rIHRleHQgb2YgcHJldmlvdXMgbGluayBpcyByZXBlYXRlZCBpbiBpbWFnZSAnYWx0JyB2YWx1ZSBvZiBhIGxpbmtcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwiSW1hZ2UgJ2FsdCcgdmFsdWUgd2l0aGluIGEgbGluayBpcyByZXBlYXRlZCBpbiBsaW5rIHRleHQgb2YgdGhlIGxpbmsgYWZ0ZXJcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgdGV4dCBhbHRlcm5hdGl2ZSBmb3IgYW4gaW1hZ2Ugd2l0aGluIGEgbGluayBzaG91bGQgbm90IHJlcGVhdCB0aGUgbGluayB0ZXh0IG9yIGFkamFjZW50IGxpbmsgdGV4dFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4xLjFcIiwgXCIyLjQuNFwiXSwgLy9tYXRjaCBoZWxwIHJlZmVyZW5jZXNcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgYU5vZGUgPSBDb21tb25VdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBcImFcIik7XG4gICAgICAgIC8vSWYgbm90IGluIGFuIGFuY2hvciwgT3V0IG9mIFNjb3BlXG4gICAgICAgIGlmIChhTm9kZSA9PSBudWxsKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgYWx0VGV4dCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFsdFwiKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKGFsdFRleHQubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIC8vIElmIGFsdCB0ZXh0IGlzIGVtcHR5LCB0aGVyZSdzIG5vIHRleHQgdG8gYmUgcmVkdW5kYW50IC0gbGV0IGFfdGV4dF9wdXJwb3NlXG4gICAgICAgICAgICAvLyB0cmlnZ2VyIGluIHRoYXQgY2FzZS5cbiAgICAgICAgICAgIC8vIFNvIE91dCBvZiBTY29wZSBmb3IgdGhpcyBydWxlXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgaW5uZXJUZXh0ID0gYU5vZGUuaW5uZXJUZXh0O1xuICAgICAgICBsZXQgbGlua1RleHQgPSBcIlwiO1xuXG4gICAgICAgIGlmIChpbm5lclRleHQgIT0gbnVsbCkge1xuICAgICAgICAgICAgbGlua1RleHQgPSBpbm5lclRleHQudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxpbmtUZXh0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGlmIChhbHRUZXh0ID09IGxpbmtUZXh0KSB7XG4gICAgICAgICAgICAgICAgLy8gVGV4dCBpbiBsaW5rXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgICAgICAvL2FsdCBpcyBub24temVybywgYnV0IG5vIGxpbmsgdGV4dCAtIGVuc3VyZSBhZGphY2VudCBsaW5rIHRleHQgaXNuJ3QgcmVkdW5kYW50XG4gICAgICAgICAgICBsZXQgd2FsayA9IG5ldyBET01XYWxrZXIoYU5vZGUpO1xuICAgICAgICAgICAgd2hpbGUgKHBhc3NlZCAmJiB3YWxrLnByZXZOb2RlKCkpIHtcbiAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIG5vZGUgYW5kIG5vZGVOYW1lXG4gICAgICAgICAgICAgICAgbGV0IG5vZGUgPSB3YWxrLm5vZGU7XG4gICAgICAgICAgICAgICAgbGV0IG5vZGVOYW1lID0gbm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIGlmICgobm9kZU5hbWUgPT0gXCIjdGV4dFwiICYmIG5vZGUubm9kZVZhbHVlLmxlbmd0aCA+IDApIHx8XG4gICAgICAgICAgICAgICAgICAgIChub2RlTmFtZSA9PSBcImltZ1wiICYmIENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkobm9kZSwgXCJhbHRcIikpKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBDb21wbHkgd2l0aCB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgU2V0dGluZyBpZiB0aGUgYSBlbGVtZW50IHNob3VsZCBiZSBjaGVja2VkIG9yIG5vdFxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5vZGVOYW1lID09PSBcImFcIiAmJiAhQ29tbW9uVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRleHQgYmVmb3JlIGltYWdlIGxpbmtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gKChub2RlIGFzIEhUTUxFbGVtZW50KS5pbm5lclRleHQgfHwgbm9kZS50ZXh0Q29udGVudCB8fCBcIlwiKS50cmltKCkudG9Mb3dlckNhc2UoKSAhPSBhbHRUZXh0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8yXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2FsayA9IG5ldyBET01XYWxrZXIoYU5vZGUsIHRydWUpO1xuICAgICAgICAgICAgd2hpbGUgKHBhc3NlZCAmJiB3YWxrLm5leHROb2RlKCkpIHtcbiAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIG5vZGUgYW5kIG5vZGVOYW1lXG4gICAgICAgICAgICAgICAgbGV0IG5vZGUgPSB3YWxrLm5vZGU7XG4gICAgICAgICAgICAgICAgbGV0IG5vZGVOYW1lID0gbm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgICAgICAgICAgaWYgKChub2RlTmFtZSA9PSBcIiN0ZXh0XCIgJiYgbm9kZS5ub2RlVmFsdWUubGVuZ3RoID4gMCkgfHxcbiAgICAgICAgICAgICAgICAgICAgKG5vZGVOYW1lID09IFwiaW1nXCIgJiYgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShub2RlLCBcImFsdFwiKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIENvbXBseSB3aXRoIHRoZSBDaGVjayBIaWRkZW4gQ29udGVudCBTZXR0aW5nIGlmIHRoZSBhIGVsZW1lbnQgc2hvdWxkIGJlIGNoZWNrZWQgb3Igbm90XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAobm9kZU5hbWUgPT0gXCJhXCIgJiYgIUNvbW1vblV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbihub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSAobm9kZSBhcyBIVE1MRWxlbWVudCkuaW5uZXJUZXh0LnRyaW0oKS50b0xvd2VyQ2FzZSgpICE9IGFsdFRleHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBUZXh0IGFmdGVyIGltYWdlIGxpbmtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzNcIik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5pbXBvcnQgeyBBY2NOYW1lVXRpbCB9IGZyb20gXCIuLi91dGlsL0FjY05hbWVVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBpbWdfYWx0X3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcImltZ19hbHRfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbTppbWdcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9JbWdfSGFzQWx0XCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiZmFpbF9ibGFua19hbHRcIjogXCJmYWlsX2JsYW5rX2FsdFwiLFxuICAgICAgICAgICAgXCJmYWlsX25vX2FsdFwiOiBcImZhaWxfbm9fYWx0XCIsXG4gICAgICAgICAgICBcImZhaWxfYmxhbmtfdGl0bGVcIjogXCJmYWlsX2JsYW5rX3RpdGxlXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiaW1nX2FsdF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfYmxhbmtfYWx0XCI6IFwiaW1nX2FsdF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfbm9fYWx0XCI6IFwiaW1nX2FsdF92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfYmxhbmtfdGl0bGVcIjogXCJpbWdfYWx0X3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpbWdfYWx0X3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlRoZSBpbWFnZSBoYXMgYW4gYWNjZXNzaWJsZSBuYW1lIG9yIGlzIGNvcnJlY3RseSBtYXJrZWQgYXMgZGVjb3JhdGl2ZSBvciByZWR1bmRhbnRcIixcbiAgICAgICAgICAgIFwiZmFpbF9ibGFua19hbHRcIjogXCJJbWFnZSAnYWx0JyBhdHRyaWJ1dGUgdmFsdWUgY29uc2lzdHMgb25seSBvZiBibGFuayBzcGFjZShzKVwiLFxuICAgICAgICAgICAgXCJmYWlsX25vX2FsdFwiOiBcIlRoZSBpbWFnZSBoYXMgbmVpdGhlciBhbiBhY2Nlc3NpYmxlIG5hbWUgbm9yIGlzIG1hcmtlZCBhcyBkZWNvcmF0aXZlIG9yIHJlZHVuZGFudFwiLFxuICAgICAgICAgICAgXCJmYWlsX2JsYW5rX3RpdGxlXCI6IFwiVGhlIGltYWdlIGRvZXMgbm90IGhhdmUgYW4gJ2FsdCcgYXR0cmlidXRlIG9yIEFSSUEgbGFiZWwsIGFuZCB0aGUgJ3RpdGxlJyBhdHRyaWJ1dGUgdmFsdWUgY29uc2lzdHMgb25seSBvZiBibGFuayBzcGFjZShzKVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkltYWdlcyBtdXN0IGhhdmUgYWNjZXNzaWJsZSBuYW1lcyB1bmxlc3MgdGhleSBhcmUgZGVjb3JhdGl2ZSBvciByZWR1bmRhbnRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFwiMjNhMmE4XCIsXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy8gSWYgbm90IHZpc2libGUgdG8gdGhlIHNjcmVlbiByZWFkZXIsIG9yIGNhbiBiZSBpZ25vcmVkXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkgfHwgQWNjTmFtZVV0aWwuaXNBY2Nlc3NpYmxlTmFtZUlnbm9yYWJsZShydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIGlmIChBcmlhVXRpbC5nZXRBcmlhTGFiZWwocnVsZUNvbnRleHQpLnRyaW0oKS5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIC8vIHRoZSBpbWcgaGFzIG5vbi1lbXB0eSBhcmlhIGxhYmVsXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGFsdCA9IHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImFsdFwiKSA/IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFsdFwiKSA6IG51bGw7XG4gICAgICAgIFxuICAgICAgICAvLyBjaGVjayB0aXRsZSBhdHRyaWJ1dGVcbiAgICAgICAgaWYgKGFsdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gdGhlIGltZyBoYXMgbm8gYWx0IG9yIGF0dHJpYnV0ZSwgZXhhbWluZSB0aGUgdGl0bGUgYXR0cmlidXRlXG4gICAgICAgICAgICBsZXQgdGl0bGUgPSBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0aXRsZVwiKSA/IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInRpdGxlXCIpIDogbnVsbDtcbiAgICAgICAgICAgIGlmICh0aXRsZSA9PT0gbnVsbCB8fCB0aXRsZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAvLyBubyB0aXRsZSBvciB0aXRsZSBpcyBlbXB0eSwgZXhhbWluZSBhbHQgZnVydGhlclxuICAgICAgICAgICAgICAgIGlmIChhbHQgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJvbGUgPSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUocnVsZUNvbnRleHQsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJvbGUgPT09ICdwcmVzZW50YXRpb24nIHx8IHJvbGUgPT09ICdub25lJylcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX25vX2FsdFwiKTtcbiAgICAgICAgICAgICAgICB9ICAgIFxuICAgICAgICAgICAgICAgIGlmIChhbHQubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpOyBcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKHRpdGxlLnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdGl0bGUgY29udGFpbnMgYmxhbmsgc3BhY2Ugb25seSAodGl0bGU9XCIgIFwiKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2JsYW5rX3RpdGxlXCIpOyBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gdGl0bGUgY29udGFpbnMgc29tZSB0ZXh0ICh0aXRsZT1cInNvbWUgdGV4dFwiKVxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoYWx0Lmxlbmd0aCA9PT0gMCB8fCBhbHQudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAvLyB0aGUgaW1nIGhhcyBlbXB0eSBhbHQgKGFsdD1cIlwiKSBvciBub24tZW1wdHkgYWx0IChhbHQ9XCJzb21lIHRleHRcIilcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpOyBcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gYWx0IGNvbnRhaW5zIGJsYW5rIHNwYWNlIG9ubHkgKGFsdD1cIiBcIilcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2JsYW5rX2FsdFwiKTsgXG4gICAgICAgICAgICB9ICAgIFxuICAgICAgICB9ICAgICAgICBcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgaW1nX2lzbWFwX21pc3VzZTogUnVsZSA9IHtcbiAgICBpZDogXCJpbWdfaXNtYXBfbWlzdXNlXCIsXG4gICAgY29udGV4dDogXCJkb206aW1nW2lzbWFwXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX0ltZ19Vc2VtYXBWYWxpZFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJpbWdfaXNtYXBfbWlzdXNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJpbWdfaXNtYXBfbWlzdXNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpbWdfaXNtYXBfbWlzdXNlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJTZXJ2ZXItc2lkZSBpbWFnZSBtYXAgaG90LXNwb3RzIGRvIG5vdCBoYXZlIGR1cGxpY2F0ZSB0ZXh0IGxpbmtzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiU2VydmVyLXNpZGUgaW1hZ2UgbWFwIGhvdC1zcG90cyBtdXN0IGhhdmUgZHVwbGljYXRlIHRleHQgbGlua3NcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidXNlbWFwXCIpKSB7XG4gICAgICAgICAgICBsZXQgdXNlbWFwID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidXNlbWFwXCIpO1xuICAgICAgICAgICAgdXNlbWFwID0gdXNlbWFwLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgbGV0IGlkeCA9IHVzZW1hcC5pbmRleE9mKFwiI1wiKTtcbiAgICAgICAgICAgIGlmIChpZHggIT0gLTEpXG4gICAgICAgICAgICAgICAgdXNlbWFwID0gdXNlbWFwLnN1YnN0cihpZHggKyAxKTtcblxuICAgICAgICAgICAgaWYgKHVzZW1hcC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IG1hcHMgPSBDb21tb25VdGlsLmdldERvY0VsZW1lbnRzQnlUYWcocnVsZUNvbnRleHQsIFwibWFwXCIpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyAhcGFzc2VkICYmIGkgPCBtYXBzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IG1hcHNbaV0uaGFzQXR0cmlidXRlKFwibmFtZVwiKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgbWFwc1tpXS5nZXRBdHRyaWJ1dGUoXCJuYW1lXCIpLnRvTG93ZXJDYXNlKCkgPT0gdXNlbWFwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGltZ19sb25nZGVzY19taXN1c2U6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaW1nX2xvbmdkZXNjX21pc3VzZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmltZ1tsb25nZGVzY11cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9JbWdfTG9uZ0Rlc2NyaXB0aW9uMlwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJpbWdfbG9uZ2Rlc2NfbWlzdXNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJpbWdfbG9uZ2Rlc2NfbWlzdXNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpbWdfbG9uZ2Rlc2NfbWlzdXNlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgdGhhdCB0aGUgZmlsZSBkZXNpZ25hdGVkIGJ5IHRoZSAnbG9uZ2Rlc2MnIGF0dHJpYnV0ZSBjb250YWlucyB2YWxpZCBIVE1MIGNvbnRlbnQgKGZpbGUgZXh0ZW5zaW9uIG5vdCByZWNvZ25pemVkKVwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIiBUaGUgJ2xvbmdkZXNjJyBhdHRyaWJ1dGUgbXVzdCByZWZlcmVuY2UgSFRNTCBjb250ZW50XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBsb25nZGVzYyA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImxvbmdkZXNjXCIpO1xuICAgICAgICAvLyBpZiAobG9uZ2Rlc2MgaXMgYmFkIFVSTCkgcGFzc2VkID0gZmFsc2U7XG5cbiAgICAgICAgbGV0IGV4dCA9IENvbW1vblV0aWwuZ2V0RmlsZUV4dChsb25nZGVzYyk7XG4gICAgICAgIGxldCBwYXNzZWQgPSBleHQubGVuZ3RoICE9IDAgJiYgQ29tbW9uVXRpbC5pc0h0bWxFeHQoZXh0KVxuICAgICAgICAgICAgfHwgbG9uZ2Rlc2Muc3RhcnRzV2l0aChcIiNcIilcbiAgICAgICAgICAgIHx8IGxvbmdkZXNjLnN0YXJ0c1dpdGgoXCJodHRwOi8vXCIpXG4gICAgICAgICAgICB8fCBsb25nZGVzYy5zdGFydHNXaXRoKFwiaHR0cHM6Ly9cIilcbiAgICAgICAgICAgIHx8IGxvbmdkZXNjLnN0YXJ0c1dpdGgoXCJkYXRhOlwiKTtcblxuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4vLyBUaGlzIGZpbGUgaXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgXCJucG0gcnVuIHByZWJ1aWxkXCIuIERvIG5vdCBlZGl0XG5cbmV4cG9ydCAqIGZyb20gXCIuL2FfdGFyZ2V0X3dhcm5pbmdcIlxuZXhwb3J0ICogZnJvbSBcIi4vYV90ZXh0X3B1cnBvc2VcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXBwbGV0X2FsdF9leGlzdHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXBwbGljYXRpb25fY29udGVudF9hY2Nlc3NpYmxlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyZWFfYWx0X2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2FjY2Vzc2libGVuYW1lX2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2FjdGl2ZWRlc2NlbmRhbnRfdGFiaW5kZXhfdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9hY3RpdmVkZXNjZW5kYW50X3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfYXBwbGljYXRpb25fbGFiZWxfdW5pcXVlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfYXBwbGljYXRpb25fbGFiZWxsZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9hcnRpY2xlX2xhYmVsX3VuaXF1ZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2F0dHJpYnV0ZV9hbGxvd2VkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfYXR0cmlidXRlX2NvbmZsaWN0XCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfYXR0cmlidXRlX2RlcHJlY2F0ZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9hdHRyaWJ1dGVfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfYXR0cmlidXRlX3JlZHVuZGFudFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2F0dHJpYnV0ZV9yZXF1aXJlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2F0dHJpYnV0ZV92YWx1ZV92YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2Jhbm5lcl9sYWJlbF91bmlxdWVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9iYW5uZXJfc2luZ2xlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfY2hpbGRfdGFiYmFibGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9jaGlsZF92YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2NvbXBsZW1lbnRhcnlfbGFiZWxfdW5pcXVlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfY29tcGxlbWVudGFyeV9sYWJlbF92aXNpYmxlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfY29tcGxlbWVudGFyeV9sYWJlbGxlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2NvbnRlbnRfaW5fbGFuZG1hcmtcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9jb250ZW50aW5mb19sYWJlbF91bmlxdWVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9jb250ZW50aW5mb19taXN1c2VcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9jb250ZW50aW5mb19zaW5nbGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9kZXNjZW5kYW50X3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfZG9jdW1lbnRfbGFiZWxfdW5pcXVlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfZXZlbnRoYW5kbGVyX3JvbGVfdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9mb3JtX2xhYmVsX3VuaXF1ZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2dyYXBoaWNfbGFiZWxsZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9oaWRkZW5fbm9udGFiYmFibGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9pZF91bmlxdWVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9pbWdfbGFiZWxsZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9rZXlib2FyZF9oYW5kbGVyX2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX2xhbmRtYXJrX25hbWVfdW5pcXVlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2FyaWFfbWFpbl9sYWJlbF91bmlxdWVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9tYWluX2xhYmVsX3Zpc2libGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9uYXZpZ2F0aW9uX2xhYmVsX3VuaXF1ZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX3BhcmVudF9yZXF1aXJlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX3JlZ2lvbl9sYWJlbF91bmlxdWVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9yZWdpb25fbGFiZWxsZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9yb2xlX2FsbG93ZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9yb2xlX3JlZHVuZGFudFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX3NlYXJjaF9sYWJlbF91bmlxdWVcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV9zZW1hbnRpY3NcIlxuZXhwb3J0ICogZnJvbSBcIi4vYXJpYV90b29sYmFyX2xhYmVsX3VuaXF1ZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9hcmlhX3dpZGdldF9sYWJlbGxlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9hc2NpaWFydF9hbHRfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2JsaW5rX2Nzc19yZXZpZXdcIlxuZXhwb3J0ICogZnJvbSBcIi4vYmxpbmtfZWxlbV9kZXByZWNhdGVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2Jsb2NrcXVvdGVfY2l0ZV9leGlzdHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vY2FudmFzX2NvbnRlbnRfZGVzY3JpYmVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2NhcHRpb25fdHJhY2tfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2NvbWJvYm94X2FjdGl2ZV9kZXNjZW5kYW50XCJcbmV4cG9ydCAqIGZyb20gXCIuL2NvbWJvYm94X2F1dG9jb21wbGV0ZV92YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9jb21ib2JveF9kZXNpZ25fdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vY29tYm9ib3hfZm9jdXNhYmxlX2VsZW1lbnRzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2NvbWJvYm94X2hhc3BvcHVwX3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2NvbWJvYm94X3BvcHVwX3JlZmVyZW5jZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9kZWJ1Z19wYXRoc1wiXG5leHBvcnQgKiBmcm9tIFwiLi9kZXRlY3Rvcl90YWJiYWJsZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9kaXJfYXR0cmlidXRlX3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2Rvd25sb2FkX2tleWJvYXJkX2NvbnRyb2xsYWJsZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9kcmFnZ2FibGVfYWx0ZXJuYXRpdmVfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2VsZW1lbnRfYWNjZXNza2V5X2xhYmVsbGVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2VsZW1lbnRfYWNjZXNza2V5X3VuaXF1ZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9lbGVtZW50X2F0dHJpYnV0ZV9kZXByZWNhdGVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2VsZW1lbnRfaWRfdW5pcXVlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2VsZW1lbnRfbGFuZ192YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9lbGVtZW50X21vdXNlZXZlbnRfa2V5Ym9hcmRcIlxuZXhwb3J0ICogZnJvbSBcIi4vZWxlbWVudF9vcmllbnRhdGlvbl91bmxvY2tlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9lbGVtZW50X3Njcm9sbGFibGVfdGFiYmFibGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vZWxlbWVudF90YWJiYWJsZV9yb2xlX3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2VsZW1lbnRfdGFiYmFibGVfdW5vYnNjdXJlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9lbGVtZW50X3RhYmJhYmxlX3Zpc2libGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vZW1iZWRfYWx0X2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9lbW90aWNvbnNfYWx0X2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9lcnJvcl9tZXNzYWdlX2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9maWVsZHNldF9sYWJlbF92YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9maWVsZHNldF9sZWdlbmRfdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vZmlndXJlX2xhYmVsX2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9mb3JtX2ZvbnRfY29sb3JcIlxuZXhwb3J0ICogZnJvbSBcIi4vZm9ybV9pbnRlcmFjdGlvbl9yZXZpZXdcIlxuZXhwb3J0ICogZnJvbSBcIi4vZm9ybV9sYWJlbF91bmlxdWVcIlxuZXhwb3J0ICogZnJvbSBcIi4vZm9ybV9zdWJtaXRfYnV0dG9uX2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9mb3JtX3N1Ym1pdF9yZXZpZXdcIlxuZXhwb3J0ICogZnJvbSBcIi4vZnJhbWVfc3JjX3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2ZyYW1lX3RpdGxlX2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9oZWFkaW5nX2NvbnRlbnRfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2hlYWRpbmdfbWFya3VwX21pc3VzZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9odG1sX2xhbmdfZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL2h0bWxfc2tpcG5hdl9leGlzdHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vaWZyYW1lX2ludGVyYWN0aXZlX3RhYmJhYmxlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2ltYWdlYnV0dG9uX2FsdF9leGlzdHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vaW1hZ2VtYXBfYWx0X2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9pbWdfYWx0X2JhY2tncm91bmRcIlxuZXhwb3J0ICogZnJvbSBcIi4vaW1nX2FsdF9kZWNvcmF0aXZlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2ltZ19hbHRfbWlzdXNlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2ltZ19hbHRfbnVsbFwiXG5leHBvcnQgKiBmcm9tIFwiLi9pbWdfYWx0X3JlZHVuZGFudFwiXG5leHBvcnQgKiBmcm9tIFwiLi9pbWdfYWx0X3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2ltZ19pc21hcF9taXN1c2VcIlxuZXhwb3J0ICogZnJvbSBcIi4vaW1nX2xvbmdkZXNjX21pc3VzZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9pbnB1dF9hdXRvY29tcGxldGVfdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vaW5wdXRfY2hlY2tib3hlc19ncm91cGVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2lucHV0X2ZpZWxkc19ncm91cGVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2lucHV0X2hhc3BvcHVwX2NvbmZsaWN0XCJcbmV4cG9ydCAqIGZyb20gXCIuL2lucHV0X2xhYmVsX2FmdGVyXCJcbmV4cG9ydCAqIGZyb20gXCIuL2lucHV0X2xhYmVsX2JlZm9yZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9pbnB1dF9sYWJlbF9leGlzdHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vaW5wdXRfbGFiZWxfdmlzaWJsZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9pbnB1dF9vbmNoYW5nZV9yZXZpZXdcIlxuZXhwb3J0ICogZnJvbSBcIi4vaW5wdXRfcGxhY2Vob2xkZXJfbGFiZWxfdmlzaWJsZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9sYWJlbF9jb250ZW50X2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9sYWJlbF9uYW1lX3Zpc2libGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vbGFiZWxfcmVmX3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL2xpc3RfY2hpbGRyZW5fdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vbGlzdF9tYXJrdXBfcmV2aWV3XCJcbmV4cG9ydCAqIGZyb20gXCIuL2xpc3Rfc3RydWN0dXJlX3Byb3BlclwiXG5leHBvcnQgKiBmcm9tIFwiLi9tYXJxdWVlX2VsZW1fYXZvaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vbWVkaWFfYWx0X2JyaWVmXCJcbmV4cG9ydCAqIGZyb20gXCIuL21lZGlhX2FsdF9leGlzdHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vbWVkaWFfYXVkaW9fdHJhbnNjcmliZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vbWVkaWFfYXV0b3N0YXJ0X2NvbnRyb2xsYWJsZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9tZWRpYV9rZXlib2FyZF9jb250cm9sbGFibGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vbWVkaWFfbGl2ZV9jYXB0aW9uZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vbWVkaWFfdHJhY2tfYXZhaWxhYmxlXCJcbmV4cG9ydCAqIGZyb20gXCIuL21ldGFfcmVkaXJlY3Rfb3B0aW9uYWxcIlxuZXhwb3J0ICogZnJvbSBcIi4vbWV0YV9yZWZyZXNoX2RlbGF5XCJcbmV4cG9ydCAqIGZyb20gXCIuL21ldGFfdmlld3BvcnRfem9vbWFibGVcIlxuZXhwb3J0ICogZnJvbSBcIi4vbm9lbWJlZF9jb250ZW50X2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi9vYmplY3RfdGV4dF9leGlzdHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vcGFnZV90aXRsZV9leGlzdHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vcGFnZV90aXRsZV92YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9zY3JpcHRfZm9jdXNfYmx1cl9yZXZpZXdcIlxuZXhwb3J0ICogZnJvbSBcIi4vc2NyaXB0X29uY2xpY2tfYXZvaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vc2NyaXB0X29uY2xpY2tfbWlzdXNlXCJcbmV4cG9ydCAqIGZyb20gXCIuL3NjcmlwdF9zZWxlY3RfcmV2aWV3XCJcbmV4cG9ydCAqIGZyb20gXCIuL3NlbGVjdF9vcHRpb25zX2dyb3VwZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vc2tpcF9tYWluX2Rlc2NyaWJlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi9za2lwX21haW5fZXhpc3RzXCJcbmV4cG9ydCAqIGZyb20gXCIuL3N0eWxlX2JhY2tncm91bmRfZGVjb3JhdGl2ZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9zdHlsZV9iZWZvcmVfYWZ0ZXJfcmV2aWV3XCJcbmV4cG9ydCAqIGZyb20gXCIuL3N0eWxlX2NvbG9yX21pc3VzZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9zdHlsZV9mb2N1c192aXNpYmxlXCJcbmV4cG9ydCAqIGZyb20gXCIuL3N0eWxlX2hpZ2hjb250cmFzdF92aXNpYmxlXCJcbmV4cG9ydCAqIGZyb20gXCIuL3N0eWxlX2hvdmVyX3BlcnNpc3RlbnRcIlxuZXhwb3J0ICogZnJvbSBcIi4vc3R5bGVfdmlld3BvcnRfcmVzaXphYmxlXCJcbmV4cG9ydCAqIGZyb20gXCIuL3N2Z19ncmFwaGljc19sYWJlbGxlZFwiXG5leHBvcnQgKiBmcm9tIFwiLi90YWJsZV9hcmlhX2Rlc2NlbmRhbnRzXCJcbmV4cG9ydCAqIGZyb20gXCIuL3RhYmxlX2NhcHRpb25fZW1wdHlcIlxuZXhwb3J0ICogZnJvbSBcIi4vdGFibGVfY2FwdGlvbl9uZXN0ZWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vdGFibGVfaGVhZGVyc19leGlzdHNcIlxuZXhwb3J0ICogZnJvbSBcIi4vdGFibGVfaGVhZGVyc19yZWZfdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vdGFibGVfaGVhZGVyc19yZWxhdGVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL3RhYmxlX2xheW91dF9saW5lYXJpemVkXCJcbmV4cG9ydCAqIGZyb20gXCIuL3RhYmxlX3Njb3BlX3ZhbGlkXCJcbmV4cG9ydCAqIGZyb20gXCIuL3RhYmxlX3N0cnVjdHVyZV9taXN1c2VcIlxuZXhwb3J0ICogZnJvbSBcIi4vdGFibGVfc3VtbWFyeV9yZWR1bmRhbnRcIlxuZXhwb3J0ICogZnJvbSBcIi4vdGFyZ2V0X3NwYWNpbmdfc3VmZmljaWVudFwiXG5leHBvcnQgKiBmcm9tIFwiLi90ZXh0X2Jsb2NrX2hlYWRpbmdcIlxuZXhwb3J0ICogZnJvbSBcIi4vdGV4dF9jb250cmFzdF9zdWZmaWNpZW50XCJcbmV4cG9ydCAqIGZyb20gXCIuL3RleHRfcXVvdGVkX2NvcnJlY3RseVwiXG5leHBvcnQgKiBmcm9tIFwiLi90ZXh0X3NlbnNvcnlfbWlzdXNlXCJcbmV4cG9ydCAqIGZyb20gXCIuL3RleHRfc3BhY2luZ192YWxpZFwiXG5leHBvcnQgKiBmcm9tIFwiLi90ZXh0X3doaXRlc3BhY2VfdmFsaWRcIlxuZXhwb3J0ICogZnJvbSBcIi4vd2lkZ2V0X3RhYmJhYmxlX2V4aXN0c1wiXG5leHBvcnQgKiBmcm9tIFwiLi93aWRnZXRfdGFiYmFibGVfc2luZ2xlXCIiLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgaW5wdXRfYXV0b2NvbXBsZXRlX3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcImlucHV0X2F1dG9jb21wbGV0ZV92YWxpZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmlucHV0W2F1dG9jb21wbGV0ZV0sIGRvbTp0ZXh0YXJlYVthdXRvY29tcGxldGVdLCBkb206c2VsZWN0W2F1dG9jb21wbGV0ZV1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMV9JbnB1dF9BdXRvY29tcGxldGVcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImZhaWxfaW5hcHByb3ByaWF0ZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJmYWlsX2ludmFsaWRcIixcbiAgICAgICAgICAgIFwiRmFpbF9hdHRyaWJ1dGVfaW5jb3JyZWN0XCI6IFwiZmFpbF9pbmNvcnJlY3RcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcImlucHV0X2F1dG9jb21wbGV0ZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcInBhc3NcIjogXCJpbnB1dF9hdXRvY29tcGxldGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2luYXBwcm9wcmlhdGVcIjogXCJpbnB1dF9hdXRvY29tcGxldGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2ludmFsaWRcIjogXCJpbnB1dF9hdXRvY29tcGxldGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX2luY29ycmVjdFwiOiBcImlucHV0X2F1dG9jb21wbGV0ZV92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGhlICdhdXRvY29tcGxldGUnIGF0dHJpYnV0ZSdzIHRva2VuKHMpIG11c3QgYmUgYXBwcm9wcmlhdGUgZm9yIHRoZSBpbnB1dCBmb3JtIGZpZWxkXCIsXG4gICAgICAgICAgICBcInBhc3NcIjogXCJUaGUgJ2F1dG9jb21wbGV0ZScgYXR0cmlidXRlJ3MgdG9rZW4ocykgaXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBpbnB1dCBmb3JtIGZpZWxkXCIsXG4gICAgICAgICAgICBcImZhaWxfaW5hcHByb3ByaWF0ZVwiOiBcIlRoZSAnYXV0b2NvbXBsZXRlJyBhdHRyaWJ1dGUncyB0b2tlbihzKSBhcmUgbm90IGFwcHJvcHJpYXRlIGZvciB0aGUgaW5wdXQgZm9ybSBmaWVsZFwiLFxuICAgICAgICAgICAgXCJmYWlsX2ludmFsaWRcIjogXCJUaGUgJ2F1dG9jb21wbGV0ZScgYXR0cmlidXRlJ3MgdG9rZW4ocykgYXJlIG5vdCBhcHByb3ByaWF0ZSBmb3IgYW4gaW5wdXQgZm9ybSBmaWVsZCBvZiBhbnkgdHlwZVwiLFxuICAgICAgICAgICAgXCJmYWlsX2luY29ycmVjdFwiOiBcIlRoZSAnYXV0b2NvbXBsZXRlJyBhdHRyaWJ1dGUgaGFzIGFuIGluY29ycmVjdCB2YWx1ZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjVcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgXG4gICAgYWN0OiBbe1xuICAgICAgICBcIjczZjJjMlwiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcImZhaWxfaW5hcHByb3ByaWF0ZVwiOiBcImZhaWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9pbnZhbGlkXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJmYWlsX2luY29ycmVjdFwiOiBcImZhaWxcIlxuICAgICAgICB9XG4gICAgfV0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIG9yIGRpc2FibGVkXG4gICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKHJ1bGVDb250ZXh0KSB8fCBDb21tb25VdGlsLmlzTm9kZURpc2FibGVkKHJ1bGVDb250ZXh0KSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGxldCBhdXRvY29tcGxldGVBdHRyID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYXV0b2NvbXBsZXRlXCIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIGxldCB0b2tlbnMgPSBhdXRvY29tcGxldGVBdHRyLnNwbGl0KC9cXHMrLyk7XG4gICAgICAgIGlmICh0b2tlbnMubGVuZ3RoID09PSAwIHx8IGF1dG9jb21wbGV0ZUF0dHIubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGNhY2hlID0ge1xuICAgICAgICAgICAgXCJ0b2tlbnNPbk9mZlwiOiBbXCJvblwiLCBcIm9mZlwiXSxcbiAgICAgICAgICAgIFwidG9rZW5PcHRpb25hbFNlY3Rpb25cIjogXCJzZWN0aW9uLVwiLFxuICAgICAgICAgICAgXCJ0b2tlbnNPcHRpb25hbFB1cnBvc2VcIjogW1wic2hpcHBpbmdcIiwgXCJiaWxsaW5nXCJdLFxuICAgICAgICAgICAgXCJ0b2tlbnNNYW5kYXRvcnlHcm91cDFfcGFzc3dvcmRcIjogW1wibmV3LXBhc3N3b3JkXCIsIFwiY3VycmVudC1wYXNzd29yZFwiLCBcIm9uZS10aW1lLWNvZGVcIl0sXG4gICAgICAgICAgICBcInRva2Vuc01hbmRhdG9yeUdyb3VwMV9tdWx0aWxpbmVcIjogW1wic3RyZWV0LWFkZHJlc3NcIl0sXG4gICAgICAgICAgICBcInRva2Vuc01hbmRhdG9yeUdyb3VwMV9tb250aFwiOiBbXCJjYy1leHBcIl0sXG4gICAgICAgICAgICBcInRva2Vuc01hbmRhdG9yeUdyb3VwMV9udW1lcmljXCI6IFtcImNjLWV4cC1tb250aFwiLFxuICAgICAgICAgICAgICAgIFwiY2MtZXhwLXllYXJcIixcbiAgICAgICAgICAgICAgICBcInRyYW5zYWN0aW9uLWFtb3VudFwiLFxuICAgICAgICAgICAgICAgIFwiYmRheS1kYXlcIixcbiAgICAgICAgICAgICAgICBcImJkYXktbW9udGhcIixcbiAgICAgICAgICAgICAgICBcImJkYXkteWVhclwiXSxcbiAgICAgICAgICAgIFwidG9rZW5zTWFuZGF0b3J5R3JvdXAxX2RhdGVcIjogW1wiYmRheVwiXSxcbiAgICAgICAgICAgIFwidG9rZW5zTWFuZGF0b3J5R3JvdXAxX3VybFwiOiBbXCJ1cmxcIiwgXCJwaG90b1wiXSxcbiAgICAgICAgICAgIFwidG9rZW5zTWFuZGF0b3J5R3JvdXAxX3RleHRcIjogW1wibmFtZVwiLFxuICAgICAgICAgICAgICAgIFwiaG9ub3JpZmljLXByZWZpeFwiLFxuICAgICAgICAgICAgICAgIFwiZ2l2ZW4tbmFtZVwiLFxuICAgICAgICAgICAgICAgIFwiYWRkaXRpb25hbC1uYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJmYW1pbHktbmFtZVwiLFxuICAgICAgICAgICAgICAgIFwiaG9ub3JpZmljLXN1ZmZpeFwiLFxuICAgICAgICAgICAgICAgIFwibmlja25hbWVcIixcbiAgICAgICAgICAgICAgICBcInVzZXJuYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJvcmdhbml6YXRpb24tdGl0bGVcIixcbiAgICAgICAgICAgICAgICBcIm9yZ2FuaXphdGlvblwiLFxuICAgICAgICAgICAgICAgIFwiYWRkcmVzcy1saW5lMVwiLFxuICAgICAgICAgICAgICAgIFwiYWRkcmVzcy1saW5lMlwiLFxuICAgICAgICAgICAgICAgIFwiYWRkcmVzcy1saW5lM1wiLFxuICAgICAgICAgICAgICAgIFwiYWRkcmVzcy1sZXZlbDRcIixcbiAgICAgICAgICAgICAgICBcImFkZHJlc3MtbGV2ZWwzXCIsXG4gICAgICAgICAgICAgICAgXCJhZGRyZXNzLWxldmVsMlwiLFxuICAgICAgICAgICAgICAgIFwiYWRkcmVzcy1sZXZlbDFcIixcbiAgICAgICAgICAgICAgICBcImNvdW50cnlcIixcbiAgICAgICAgICAgICAgICBcImNvdW50cnktbmFtZVwiLFxuICAgICAgICAgICAgICAgIFwicG9zdGFsLWNvZGVcIixcbiAgICAgICAgICAgICAgICBcImNjLW5hbWVcIixcbiAgICAgICAgICAgICAgICBcImNjLWdpdmVuLW5hbWVcIixcbiAgICAgICAgICAgICAgICBcImNjLWFkZGl0aW9uYWwtbmFtZVwiLFxuICAgICAgICAgICAgICAgIFwiY2MtZmFtaWx5LW5hbWVcIixcbiAgICAgICAgICAgICAgICBcImNjLW51bWJlclwiLFxuICAgICAgICAgICAgICAgIFwiY2MtY3NjXCIsXG4gICAgICAgICAgICAgICAgXCJjYy10eXBlXCIsXG4gICAgICAgICAgICAgICAgXCJ0cmFuc2FjdGlvbi1jdXJyZW5jeVwiLFxuICAgICAgICAgICAgICAgIFwibGFuZ3VhZ2VcIixcbiAgICAgICAgICAgICAgICBcInNleFwiXSxcbiAgICAgICAgICAgIFwidG9rZW5zTWFuZGF0b3J5R3JvdXAxX2FsbFwiOiBbXCJuYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJob25vcmlmaWMtcHJlZml4XCIsXG4gICAgICAgICAgICAgICAgXCJnaXZlbi1uYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJhZGRpdGlvbmFsLW5hbWVcIixcbiAgICAgICAgICAgICAgICBcImZhbWlseS1uYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJob25vcmlmaWMtc3VmZml4XCIsXG4gICAgICAgICAgICAgICAgXCJuaWNrbmFtZVwiLFxuICAgICAgICAgICAgICAgIFwidXNlcm5hbWVcIixcbiAgICAgICAgICAgICAgICBcIm5ldy1wYXNzd29yZFwiLFxuICAgICAgICAgICAgICAgIFwiY3VycmVudC1wYXNzd29yZFwiLFxuICAgICAgICAgICAgICAgIFwib3JnYW5pemF0aW9uLXRpdGxlXCIsXG4gICAgICAgICAgICAgICAgXCJvcmdhbml6YXRpb25cIixcbiAgICAgICAgICAgICAgICBcInN0cmVldC1hZGRyZXNzXCIsXG4gICAgICAgICAgICAgICAgXCJhZGRyZXNzLWxpbmUxXCIsXG4gICAgICAgICAgICAgICAgXCJhZGRyZXNzLWxpbmUyXCIsXG4gICAgICAgICAgICAgICAgXCJhZGRyZXNzLWxpbmUzXCIsXG4gICAgICAgICAgICAgICAgXCJhZGRyZXNzLWxldmVsNFwiLFxuICAgICAgICAgICAgICAgIFwiYWRkcmVzcy1sZXZlbDNcIixcbiAgICAgICAgICAgICAgICBcImFkZHJlc3MtbGV2ZWwyXCIsXG4gICAgICAgICAgICAgICAgXCJhZGRyZXNzLWxldmVsMVwiLFxuICAgICAgICAgICAgICAgIFwiY291bnRyeVwiLFxuICAgICAgICAgICAgICAgIFwiY291bnRyeS1uYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJwb3N0YWwtY29kZVwiLFxuICAgICAgICAgICAgICAgIFwiY2MtbmFtZVwiLFxuICAgICAgICAgICAgICAgIFwiY2MtZ2l2ZW4tbmFtZVwiLFxuICAgICAgICAgICAgICAgIFwiY2MtYWRkaXRpb25hbC1uYW1lXCIsXG4gICAgICAgICAgICAgICAgXCJjYy1mYW1pbHktbmFtZVwiLFxuICAgICAgICAgICAgICAgIFwiY2MtbnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgXCJjYy1leHBcIixcbiAgICAgICAgICAgICAgICBcImNjLWV4cC1tb250aFwiLFxuICAgICAgICAgICAgICAgIFwiY2MtZXhwLXllYXJcIixcbiAgICAgICAgICAgICAgICBcImNjLWNzY1wiLFxuICAgICAgICAgICAgICAgIFwiY2MtdHlwZVwiLFxuICAgICAgICAgICAgICAgIFwidHJhbnNhY3Rpb24tY3VycmVuY3lcIixcbiAgICAgICAgICAgICAgICBcInRyYW5zYWN0aW9uLWFtb3VudFwiLFxuICAgICAgICAgICAgICAgIFwibGFuZ3VhZ2VcIixcbiAgICAgICAgICAgICAgICBcImJkYXlcIixcbiAgICAgICAgICAgICAgICBcImJkYXktZGF5XCIsXG4gICAgICAgICAgICAgICAgXCJiZGF5LW1vbnRoXCIsXG4gICAgICAgICAgICAgICAgXCJiZGF5LXllYXJcIixcbiAgICAgICAgICAgICAgICBcInNleFwiLFxuICAgICAgICAgICAgICAgIFwidXJsXCIsXG4gICAgICAgICAgICAgICAgXCJwaG90b1wiXSxcbiAgICAgICAgICAgIFwidG9rZW5zT3B0aW9uYWxHcm91cDJcIjogW1wiaG9tZVwiLFxuICAgICAgICAgICAgICAgIFwid29ya1wiLFxuICAgICAgICAgICAgICAgIFwibW9iaWxlXCIsXG4gICAgICAgICAgICAgICAgXCJmYXhcIixcbiAgICAgICAgICAgICAgICBcInBhZ2VyXCJdLFxuXG4gICAgICAgICAgICBcInRva2Vuc01hbmRhdG9yeUdyb3VwMl90ZWxcIjogW1widGVsXCJdLFxuICAgICAgICAgICAgXCJ0b2tlbnNNYW5kYXRvcnlHcm91cDJfZW1haWxcIjogW1wiZW1haWxcIl0sXG4gICAgICAgICAgICBcInRva2Vuc01hbmRhdG9yeUdyb3VwMl91cmxcIjogW1wiaW1wcFwiXSxcbiAgICAgICAgICAgIFwidG9rZW5zTWFuZGF0b3J5R3JvdXAyX3RleHRcIjogW1widGVsLWNvdW50cnktY29kZVwiLFxuICAgICAgICAgICAgICAgIFwidGVsLW5hdGlvbmFsXCIsXG4gICAgICAgICAgICAgICAgXCJ0ZWwtYXJlYS1jb2RlXCIsXG4gICAgICAgICAgICAgICAgXCJ0ZWwtbG9jYWxcIixcbiAgICAgICAgICAgICAgICBcInRlbC1sb2NhbC1wcmVmaXhcIixcbiAgICAgICAgICAgICAgICBcInRlbC1sb2NhbC1zdWZmaXhcIixcbiAgICAgICAgICAgICAgICBcInRlbC1leHRlbnNpb25cIl0sXG4gICAgICAgICAgICBcInRva2Vuc01hbmRhdG9yeUdyb3VwMl9hbGxcIjogW1widGVsXCIsXG4gICAgICAgICAgICAgICAgXCJ0ZWwtY291bnRyeS1jb2RlXCIsXG4gICAgICAgICAgICAgICAgXCJ0ZWwtbmF0aW9uYWxcIixcbiAgICAgICAgICAgICAgICBcInRlbC1hcmVhLWNvZGVcIixcbiAgICAgICAgICAgICAgICBcInRlbC1sb2NhbFwiLFxuICAgICAgICAgICAgICAgIFwidGVsLWxvY2FsLXByZWZpeFwiLFxuICAgICAgICAgICAgICAgIFwidGVsLWxvY2FsLXN1ZmZpeFwiLFxuICAgICAgICAgICAgICAgIFwidGVsLWV4dGVuc2lvblwiLFxuICAgICAgICAgICAgICAgIFwiZW1haWxcIixcbiAgICAgICAgICAgICAgICBcImltcHBcIl0sXG4gICAgICAgICAgICBcInRva2Vuc09wdGlvbkdyb3VwMV93ZWJhdXRoblwiOiBbXCJ3ZWJhdXRoblwiXSAgICBcbiAgICAgICAgfVxuICAgICAgICBsZXQgdmFsaWRfdmFsdWVzID0gW107XG4gICAgICAgIGZvciAodmFyIGtleSBpbiBjYWNoZSlcbiAgICAgICAgICAgIHZhbGlkX3ZhbHVlcz12YWxpZF92YWx1ZXMuY29uY2F0KGNhY2hlW2tleV0pO1xuICAgICAgICBcbiAgICAgICAgbGV0IGZvdW5kTWFuZGF0b3J5VG9rZW4gPSBmYWxzZTtcbiAgICAgICAgbGV0IGZvdW5kUmVjb2duaXplZFRva2VuID0gdHJ1ZTtcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKCF0b2tlbnMuZXZlcnkociA9PiB2YWxpZF92YWx1ZXMuaW5jbHVkZXMocikgfHwgci5zdGFydHNXaXRoKGNhY2hlWyd0b2tlbk9wdGlvbmFsU2VjdGlvbiddKSkpXG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2luY29ycmVjdFwiKTtcbiAgICAgICAgXG4gICAgICAgIGxldCB0eXBlID0gcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidHlwZVwiKSA/IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInR5cGVcIikudHJpbSgpLnRvTG93ZXJDYXNlKCkgOiBcInRleHRcIjtcbiAgICAgICAgXG4gICAgICAgIGxldCB0b2tlbnNNYW5kYXRvcnlHcm91cDEgPSBbXTtcbiAgICAgICAgbGV0IHRva2Vuc01hbmRhdG9yeUdyb3VwMiA9IFtdO1xuICAgICAgICBsZXQgdG9rZW5zT3B0aW9uYWxHcm91cCA9IFtdO1xuXG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJ0ZXh0YXJlYVwiIHx8IG5vZGVOYW1lID09PSBcInNlbGVjdFwiKSB7XG4gICAgICAgICAgICAvLyBhY2NlcHQgYWxsIHRva2Vuc1xuICAgICAgICAgICAgdG9rZW5zTWFuZGF0b3J5R3JvdXAxID0gY2FjaGUudG9rZW5zTWFuZGF0b3J5R3JvdXAxX2FsbDtcbiAgICAgICAgICAgIHRva2Vuc01hbmRhdG9yeUdyb3VwMiA9IGNhY2hlLnRva2Vuc01hbmRhdG9yeUdyb3VwMl9hbGw7XG4gICAgICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwidGV4dGFyZWFcIilcbiAgICAgICAgICAgICAgICB0b2tlbnNPcHRpb25hbEdyb3VwID0gY2FjaGUudG9rZW5zT3B0aW9uR3JvdXAxX3dlYmF1dGhuO1xuXG4gICAgICAgIH0gZWxzZSBpZiAobm9kZU5hbWUgPT09IFwiaW5wdXRcIikge1xuICAgICAgICAgICAgdG9rZW5zT3B0aW9uYWxHcm91cCA9IGNhY2hlLnRva2Vuc09wdGlvbkdyb3VwMV93ZWJhdXRobjtcbiAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgdmFyaW91cyAnaW5wdXQnIHR5cGVzXG4gICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHtcblxuICAgICAgICAgICAgICAgIC8vIERpc2FibGUgY2hlY2sgZm9yIGlucHV0IHR5cGU9aGlkZGVuIGZvciBub3cgYmFzZWQgb24gc2NydW0gZGlzY3Vzc2lvblxuICAgICAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgICAgY2FzZSBcImhpZGRlblwiOlxuICAgICAgICAgICAgICAgICAgICAvLyBhY2NlcHQgYWxsIHRva2Vuc1xuICAgICAgICAgICAgICAgICAgICB0b2tlbnNNYW5kYXRvcnlHcm91cDEgPSBjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDFfYWxsO1xuICAgICAgICAgICAgICAgICAgICB0b2tlbnNNYW5kYXRvcnlHcm91cDIgPSBjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDJfYWxsO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAqL1xuXG4gICAgICAgICAgICAgICAgY2FzZSBcInRleHRcIjpcbiAgICAgICAgICAgICAgICBjYXNlIFwic2VhcmNoXCI6XG4gICAgICAgICAgICAgICAgICAgIHRva2Vuc01hbmRhdG9yeUdyb3VwMSA9IGNhY2hlLnRva2Vuc01hbmRhdG9yeUdyb3VwMV90ZXh0LmNvbmNhdChjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDFfcGFzc3dvcmQsXG4gICAgICAgICAgICAgICAgICAgICAgICBjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDFfdXJsLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FjaGUudG9rZW5zTWFuZGF0b3J5R3JvdXAxX251bWVyaWMsXG4gICAgICAgICAgICAgICAgICAgICAgICBjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDFfbW9udGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDFfZGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRva2Vuc01hbmRhdG9yeUdyb3VwMiA9IGNhY2hlLnRva2Vuc01hbmRhdG9yeUdyb3VwMl9hbGw7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJwYXNzd29yZFwiOlxuICAgICAgICAgICAgICAgICAgICB0b2tlbnNNYW5kYXRvcnlHcm91cDEgPSBjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDFfcGFzc3dvcmQ7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgXCJ1cmxcIjpcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5zTWFuZGF0b3J5R3JvdXAxID0gY2FjaGUudG9rZW5zTWFuZGF0b3J5R3JvdXAxX3VybDtcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5zTWFuZGF0b3J5R3JvdXAyID0gY2FjaGUudG9rZW5zTWFuZGF0b3J5R3JvdXAyX3VybDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcImVtYWlsXCI6XG4gICAgICAgICAgICAgICAgICAgIHRva2Vuc01hbmRhdG9yeUdyb3VwMiA9IGNhY2hlLnRva2Vuc01hbmRhdG9yeUdyb3VwMl9lbWFpbDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcInRlbFwiOlxuICAgICAgICAgICAgICAgICAgICB0b2tlbnNNYW5kYXRvcnlHcm91cDIgPSBjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDJfdGVsO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwibnVtYmVyXCI6XG4gICAgICAgICAgICAgICAgICAgIHRva2Vuc01hbmRhdG9yeUdyb3VwMSA9IGNhY2hlLnRva2Vuc01hbmRhdG9yeUdyb3VwMV9udW1lcmljO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwibW9udGhcIjpcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5zTWFuZGF0b3J5R3JvdXAxID0gY2FjaGUudG9rZW5zTWFuZGF0b3J5R3JvdXAxX21vbnRoO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFwiZGF0ZVwiOlxuICAgICAgICAgICAgICAgICAgICB0b2tlbnNNYW5kYXRvcnlHcm91cDEgPSBjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDFfZGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgLy8gdW5zdXBwb3J0ZWQgdHlwZSBmb3IgdGhpcyBydWxlLlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gc2hvdWxkIG5ldmVyIGdldCBoZXJlLlxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEaXNhYmxlIGNoZWNrIGZvciBpbnB1dCB0eXBlPWhpZGRlbiBmb3Igbm93IGJhc2VkIG9uIHNjcnVtIGRpc2N1c3Npb25cbiAgICAgICAgbGV0IGF1dG9maWxsTWFudGxlID0gLyogKG5vZGVOYW1lPT09XCJpbnB1dFwiICYmIHR5cGU9PT1cImhpZGRlblwiKSA/IFwiYW5jaG9yXCIgOiAqLyBcImV4cGVjdGF0aW9uXCI7XG5cbiAgICAgICAgaWYgKGF1dG9maWxsTWFudGxlID09PSBcImV4cGVjdGF0aW9uXCIpIHtcbiAgICAgICAgICAgIC8vIGNoZWNrIG9ufG9mZiBmb3IgZXhwZWN0YXRpb24gbWFudGxlLlxuICAgICAgICAgICAgaWYgKHRva2Vucy5pbmNsdWRlcyhcIm9uXCIpIHx8IHRva2Vucy5pbmNsdWRlcyhcIm9mZlwiKSkge1xuICAgICAgICAgICAgICAgIC8vIG9ufG9mZiBzaG91bGQgYmUgdGhlIG9ubHkgdG9rZW5cbiAgICAgICAgICAgICAgICBpZiAodG9rZW5zLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfaW52YWxpZFwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjaGVjayBkZXRhaWwgYXV0b2ZpbGwgdG9rZW5zXG4gICAgICAgIGxldCBjdXJySW5kZXggPSAwO1xuICAgICAgICBsZXQgY3VyclJlY29nbml6ZWRJbmRleCA9IDA7XG5cbiAgICAgICAgLy8gY2hlY2sgb3B0aW9uYWwgJ3NlY3Rpb24tKicgdG9rZW5zXG4gICAgICAgIGlmICh0b2tlbnNbY3VyckluZGV4XS5zdGFydHNXaXRoKGNhY2hlLnRva2VuT3B0aW9uYWxTZWN0aW9uKSAmJlxuICAgICAgICAgICAgdG9rZW5zW2N1cnJJbmRleF0ubGVuZ3RoID4gOCkge1xuICAgICAgICAgICAgY3VyckluZGV4Kys7IC8vIGNvbnN1bWUgdG9rZW5cbiAgICAgICAgICAgIGN1cnJSZWNvZ25pemVkSW5kZXgrKztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNoZWNrIG9wdGlvbmFsICdzaGlwcGluZ3xiaWxsaW5nJyB0b2tlbnNcbiAgICAgICAgaWYgKHRva2Vucy5sZW5ndGggPiBjdXJySW5kZXggJiZcbiAgICAgICAgICAgIGNhY2hlLnRva2Vuc09wdGlvbmFsUHVycG9zZS5pbmNsdWRlcyh0b2tlbnNbY3VyckluZGV4XSkpIHtcbiAgICAgICAgICAgIGN1cnJJbmRleCsrOyAvLyBjb25zdW1lICB0b2tlblxuICAgICAgICAgICAgY3VyclJlY29nbml6ZWRJbmRleCsrO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2hlY2sgZWl0aGVyIG1hbmRhdG9yeSBncm91cCAxIG9yIDIgdG9rZW5zXG4gICAgICAgIGlmICh0b2tlbnMubGVuZ3RoID4gY3VyckluZGV4KSB7XG4gICAgICAgICAgICAvLyBjaGVjayBtYW5kYXRvcnkgZ3JvdXAgMVxuICAgICAgICAgICAgaWYgKHRva2Vuc01hbmRhdG9yeUdyb3VwMS5pbmNsdWRlcyh0b2tlbnNbY3VyckluZGV4XSkpIHtcbiAgICAgICAgICAgICAgICBmb3VuZE1hbmRhdG9yeVRva2VuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjdXJySW5kZXgrKztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gY2hlY2sgb3B0aW9uYWwgdG9rZW5zIGZvciBncm91cCAyXG4gICAgICAgICAgICAgICAgaWYgKGNhY2hlLnRva2Vuc09wdGlvbmFsR3JvdXAyLmluY2x1ZGVzKHRva2Vuc1tjdXJySW5kZXhdKSkge1xuICAgICAgICAgICAgICAgICAgICBjdXJySW5kZXgrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gY2hlY2sgbWFuZGF0b3J5IGdyb3VwIDJcbiAgICAgICAgICAgICAgICBpZiAodG9rZW5zTWFuZGF0b3J5R3JvdXAyLmluY2x1ZGVzKHRva2Vuc1tjdXJySW5kZXhdKSkge1xuICAgICAgICAgICAgICAgICAgICBmb3VuZE1hbmRhdG9yeVRva2VuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgY3VyckluZGV4Kys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2hlY2sgZWl0aGVyIG1hbmRhdG9yeSBncm91cCAxIG9yIDIgdG9rZW5zXG4gICAgICAgIGlmICh0b2tlbnMubGVuZ3RoID4gY3VyclJlY29nbml6ZWRJbmRleCkge1xuICAgICAgICAgICAgLy8gY2hlY2sgbWFuZGF0b3J5IGdyb3VwIDFcbiAgICAgICAgICAgIGlmIChjYWNoZS50b2tlbnNNYW5kYXRvcnlHcm91cDFfYWxsLmluY2x1ZGVzKHRva2Vuc1tjdXJyUmVjb2duaXplZEluZGV4XSkpIHtcbiAgICAgICAgICAgICAgICBmb3VuZFJlY29nbml6ZWRUb2tlbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgY3VyclJlY29nbml6ZWRJbmRleCsrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBjaGVjayBvcHRpb25hbCB0b2tlbnMgZm9yIGdyb3VwIDJcbiAgICAgICAgICAgICAgICBpZiAoY2FjaGUudG9rZW5zT3B0aW9uYWxHcm91cDIuaW5jbHVkZXModG9rZW5zW2N1cnJSZWNvZ25pemVkSW5kZXhdKSkge1xuICAgICAgICAgICAgICAgICAgICBjdXJyUmVjb2duaXplZEluZGV4Kys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGNoZWNrIG1hbmRhdG9yeSBncm91cCAyXG4gICAgICAgICAgICAgICAgaWYgKGNhY2hlLnRva2Vuc01hbmRhdG9yeUdyb3VwMl9hbGwuaW5jbHVkZXModG9rZW5zW2N1cnJSZWNvZ25pemVkSW5kZXhdKSkge1xuICAgICAgICAgICAgICAgICAgICBmb3VuZFJlY29nbml6ZWRUb2tlbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGN1cnJSZWNvZ25pemVkSW5kZXgrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmICh0b2tlbnMubGVuZ3RoID4gY3VyckluZGV4ICsgY3VyclJlY29nbml6ZWRJbmRleCkge1xuICAgICAgICAgICAgLy8gY2hlY2sgb3B0aW9uYWwgdG9rZW5zIHdlYmF1dGhuXG4gICAgICAgICAgICBpZiAodG9rZW5zT3B0aW9uYWxHcm91cC5pbmNsdWRlcyh0b2tlbnNbY3VyckluZGV4ICsgY3VyclJlY29nbml6ZWRJbmRleF0pKSB7XG4gICAgICAgICAgICAgICAgY3VyckluZGV4Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCh0b2tlbnMubGVuZ3RoID4gY3VyckluZGV4ICYmIHRva2Vuc09wdGlvbmFsR3JvdXAuaW5jbHVkZXModG9rZW5zW2N1cnJJbmRleF0pKVxuICAgICAgICAgICAgfHwgKHRva2Vucy5sZW5ndGggPiBjdXJyUmVjb2duaXplZEluZGV4ICYmIHRva2Vuc09wdGlvbmFsR3JvdXAuaW5jbHVkZXModG9rZW5zW2N1cnJSZWNvZ25pemVkSW5kZXhdKSkpIHtcbiAgICAgICAgICAgIGN1cnJJbmRleCsrO1xuICAgICAgICAgICAgY3VyclJlY29nbml6ZWRJbmRleCsrO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT25seSBwYXNzIGlmIHdlIGhhdmUgc2VlbiBlaXRoZXIgb2YgdGhlIG1hbmRhdG9yeSBncm91cHMgYW5kIGFsbCB0b2tlbnMgaGF2ZSBiZWVuIGNvbnN1bWVkXG4gICAgICAgIGlmIChmb3VuZE1hbmRhdG9yeVRva2VuICYmIHRva2Vucy5sZW5ndGggPT09IGN1cnJJbmRleCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgfSBlbHNlIGlmIChmb3VuZFJlY29nbml6ZWRUb2tlbiAmJiB0b2tlbnMubGVuZ3RoID09PSBjdXJyUmVjb2duaXplZEluZGV4KSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2luY29ycmVjdFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfaW5hcHByb3ByaWF0ZVwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgVGFibGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVGFibGVVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBpbnB1dF9jaGVja2JveGVzX2dyb3VwZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaW5wdXRfY2hlY2tib3hlc19ncm91cGVkXCIsXG4gICAgY29udGV4dDogXCJkb206aW5wdXRbdHlwZT1yYWRpb10sIGRvbTppbnB1dFt0eXBlPWNoZWNrYm94XVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0lucHV0X1JhZGlvQ2hrSW5GaWVsZFNldFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfTG9uZU5vZ3JvdXBcIjogXCJwYXNzX2xvbmVub2dyb3VwXCIsXG4gICAgICAgICAgICBcIlBhc3NfR3JvdXBlZFwiOiBcInBhc3NfZ3JvdXBlZFwiLFxuICAgICAgICAgICAgXCJQYXNzX1JhZGlvTm9OYW1lXCI6IFwicGFzc19yYWRpb05vTmFtZVwiLFxuICAgICAgICAgICAgXCJGYWlsX0NvbnRyb2xOYW1lTWlzbWF0Y2hcIjogXCJmYWlsX2NvbnRyb2xuYW1lbWlzbWF0Y2hcIixcbiAgICAgICAgICAgIFwiRmFpbF9Ob3RHcm91cGVkT3RoZXJHcm91cGVkXCI6IFwiZmFpbF9ub3Rncm91cGVkb3RoZXJncm91cGVkXCIsXG4gICAgICAgICAgICBcIkZhaWxfTm90R3JvdXBlZE90aGVyTm90R3JvdXBlZFwiOiBcImZhaWxfbm90Z3JvdXBlZG90aGVybm90Z3JvdXBlZFwiLFxuICAgICAgICAgICAgXCJGYWlsX05vdFNhbWVHcm91cFwiOiBcImZhaWxfbm90c2FtZWdyb3VwXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF9Mb25lQ2hlY2tib3hcIjogXCJwb3RlbnRpYWxfbG9uZWNoZWNrYm94XCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF9Vbm5hbWVkQ2hlY2tib3hcIjogXCJwb3RlbnRpYWxfdW5uYW1lZGNoZWNrYm94XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpbnB1dF9jaGVja2JveGVzX2dyb3VwZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJwYXNzX2xvbmVub2dyb3VwXCI6IFwiaW5wdXRfY2hlY2tib3hlc19ncm91cGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwicGFzc19ncm91cGVkXCI6IFwiaW5wdXRfY2hlY2tib3hlc19ncm91cGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwicGFzc19yYWRpb25vbmFtZVwiOiBcImlucHV0X2NoZWNrYm94ZXNfZ3JvdXBlZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfY29udHJvbG5hbWVtaXNtYXRjaFwiOiBcImlucHV0X2NoZWNrYm94ZXNfZ3JvdXBlZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfbm90Z3JvdXBlZG90aGVyZ3JvdXBlZFwiOiBcImlucHV0X2NoZWNrYm94ZXNfZ3JvdXBlZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfbm90Z3JvdXBlZG90aGVybm90Z3JvdXBlZFwiOiBcImlucHV0X2NoZWNrYm94ZXNfZ3JvdXBlZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfbm90c2FtZWdyb3VwXCI6IFwiaW5wdXRfY2hlY2tib3hlc19ncm91cGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX2xvbmVjaGVja2JveFwiOiBcImlucHV0X2NoZWNrYm94ZXNfZ3JvdXBlZC5odG1sXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF91bm5hbWVkY2hlY2tib3hcIjogXCJpbnB1dF9jaGVja2JveGVzX2dyb3VwZWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIlJlbGF0ZWQgc2V0cyBvZiByYWRpbyBidXR0b25zIG9yIGNoZWNrYm94ZXMgc2hvdWxkIGJlIHByb2dyYW1tYXRpY2FsbHkgZ3JvdXBlZFwiLFxuICAgICAgICAgICAgXCJwYXNzX2xvbmVub2dyb3VwXCI6IFwiezB9IGdyb3VwaW5nIG5vdCByZXF1aXJlZCBmb3IgYSBjb250cm9sIG9mIHRoaXMgdHlwZVwiLFxuICAgICAgICAgICAgXCJwYXNzX2dyb3VwZWRcIjogXCJ7MH0gaW5wdXQgaXMgZ3JvdXBlZCB3aXRoIG90aGVyIHJlbGF0ZWQgY29udHJvbHMgd2l0aCB0aGUgc2FtZSBuYW1lXCIsXG4gICAgICAgICAgICBcInBhc3NfcmFkaW9ub25hbWVcIjogXCJSYWRpbyBpbnB1dCBpcyBub3QgZ3JvdXBlZCwgYnV0IHBhc3NlcyBiZWNhdXNlIGl0IGhhcyBubyBuYW1lIHRvIGdyb3VwIHdpdGggb3RoZXIgcmFkaW8gaW5wdXRzXCIsXG4gICAgICAgICAgICBcImZhaWxfY29udHJvbG5hbWVtaXNtYXRjaFwiOiBcInswfSBpbnB1dCBmb3VuZCB0aGF0IGhhcyB0aGUgc2FtZSBuYW1lLCBcXFwiezJ9XFxcIiBhcyBhIHsxfSBpbnB1dFwiLFxuICAgICAgICAgICAgXCJmYWlsX25vdGdyb3VwZWRvdGhlcmdyb3VwZWRcIjogXCJ7MH0gaW5wdXQgaXMgbm90IGluIHRoZSBncm91cCB3aXRoIGFub3RoZXIgezB9IHdpdGggdGhlIG5hbWUgXFxcInsxfVxcXCJcIixcbiAgICAgICAgICAgIFwiZmFpbF9ub3Rncm91cGVkb3RoZXJub3Rncm91cGVkXCI6IFwiezB9IGlucHV0IGFuZCBvdGhlcnMgd2l0aCB0aGUgbmFtZSBcXFwiezF9XFxcIiBhcmUgbm90IGdyb3VwZWQgdG9nZXRoZXJcIixcbiAgICAgICAgICAgIFwiZmFpbF9ub3RzYW1lZ3JvdXBcIjogXCJ7MH0gaW5wdXQgaXMgaW4gYSBkaWZmZXJlbnQgZ3JvdXAgdGhhbiBhbm90aGVyIHswfSB3aXRoIHRoZSBuYW1lIFxcXCJ7MX1cXFwiXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9sb25lY2hlY2tib3hcIjogXCJWZXJpZnkgdGhhdCB0aGlzIHVuZ3JvdXBlZCBjaGVja2JveCBpbnB1dCBpcyBub3QgcmVsYXRlZCB0byBvdGhlciBjaGVja2JveGVzXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF91bm5hbWVkY2hlY2tib3hcIjogXCJWZXJpZnkgdGhhdCB0aGlzIHVuLW5hbWVkLCB1bmdyb3VwZWQgY2hlY2tib3ggaW5wdXQgaXMgbm90IHJlbGF0ZWQgdG8gb3RoZXIgY2hlY2tib3hlc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBnZXRHcm91cCA9IChlOiBFbGVtZW50KSA9PiB7XG4gICAgICAgICAgICBsZXQgcmV0VmFsID0gQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihlLCBcImZpZWxkc2V0XCIpXG4gICAgICAgICAgICAgICAgfHwgQXJpYVV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShlLCBcInJhZGlvZ3JvdXBcIilcbiAgICAgICAgICAgICAgICB8fCBBcmlhVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKGUsIFwiZ3JvdXBcIilcbiAgICAgICAgICAgICAgICB8fCBBcmlhVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKGUsIFwiZ3JpZFwiKVxuICAgICAgICAgICAgICAgIHx8IEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUoZSwgXCJ0YWJsZVwiKTtcbiAgICAgICAgICAgIGlmICghcmV0VmFsKSB7XG4gICAgICAgICAgICAgICAgcmV0VmFsID0gQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihlLCBcInRhYmxlXCIpO1xuICAgICAgICAgICAgICAgIGlmIChyZXRWYWwgJiYgIVRhYmxlVXRpbC5pc0RhdGFUYWJsZShyZXRWYWwpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE9ubHkgcmFkaW8gYnV0dG9ucyBhbmQgY2hlY2tib3hlcyBhcmUgaW4gc2NvcGVcbiAgICAgICAgbGV0IGN0eFR5cGUgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIFxuICAgICAgICAvLyBEZXRlcm1pbmUgd2hpY2ggZm9ybSB3ZSdyZSBpbiAoaWYgYW55KSB0byBkZXRlcm1pbmUgb3VyIHNjb3BlXG4gICAgICAgIGxldCBjdHhGb3JtID0gQXJpYVV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShydWxlQ29udGV4dCwgXCJmb3JtXCIpXG4gICAgICAgICAgICB8fCBDb21tb25VdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBcImh0bWxcIilcbiAgICAgICAgICAgIHx8IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuXG4gICAgICAgIC8vIEdldCBkYXRhIGFib3V0IGFsbCBvZiB0aGUgdmlzaWJsZSBjaGVja2JveGVzIGFuZCByYWRpb3MgaW4gdGhlIHNjb3BlIG9mIHRoaXMgZm9ybVxuICAgICAgICAvLyBhbmQgY2FjaGUgaXQgZm9yIGFsbCBvZiB0aGUgb3RoZXIgaW5wdXRzIGluIHRoaXMgc2NvcGVcbiAgICAgICAgbGV0IGZvcm1DYWNoZSA9IENhY2hlVXRpbC5nZXRDYWNoZShjdHhGb3JtLCBcImlucHV0X2NoZWNrYm94ZXNfZ3JvdXBlZFwiLCBudWxsKTtcbiAgICAgICAgaWYgKCFmb3JtQ2FjaGUpIHtcbiAgICAgICAgICAgIGZvcm1DYWNoZSA9IHtcbiAgICAgICAgICAgICAgICBjaGVja2JveEJ5TmFtZToge30sXG4gICAgICAgICAgICAgICAgcmFkaW9zQnlOYW1lOiB7fSxcbiAgICAgICAgICAgICAgICBuYW1lVG9Hcm91cDoge1xuXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBudW1DaGVja2JveGVzOiAwLFxuICAgICAgICAgICAgICAgIG51bVJhZGlvczogMFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gR2V0IGFsbCBvZiB0aGUgY2hlY2tib3hlcyBpbiB0aGUgZm9ybSBvciBib2R5IChidXQgbm90IG5lc3RlZCBpbiBzb21ldGhpbmcgZWxzZSBhbmQgbm90IGhpZGRlbilcbiAgICAgICAgICAgIC8vIEFuZCBnZXQgYSBtYXBwaW5nIG9mIHRoZXNlIGNoZWNrYm94ZXMgdG9cbiAgICAgICAgICAgIGxldCBjV2Fsa2VyID0gbmV3IERPTVdhbGtlcihjdHhGb3JtLCBmYWxzZSwgY3R4Rm9ybSwgdHJ1ZSk7XG4gICAgICAgICAgICBsZXQgY2hlY2tib3hRID0gW107XG4gICAgICAgICAgICBsZXQgcmFkaW9zUSA9IFtdO1xuICAgICAgICAgICAgd2hpbGUgKGNXYWxrZXIubmV4dE5vZGUoKSkge1xuICAgICAgICAgICAgICAgIGlmICghY1dhbGtlci5iRW5kVGFnXG4gICAgICAgICAgICAgICAgICAgICYmIGNXYWxrZXIubm9kZS5ub2RlVHlwZSA9PT0gMVxuICAgICAgICAgICAgICAgICAgICAmJiBjV2Fsa2VyLm5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgICYmIFZpc1V0aWwuaXNOb2RlVmlzaWJsZShjV2Fsa2VyLm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0eXBlID0gKGNXYWxrZXIubm9kZSBhcyBFbGVtZW50KS5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gXCJjaGVja2JveFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGVja2JveFEucHVzaChjV2Fsa2VyLm5vZGUpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFwicmFkaW9cIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmFkaW9zUS5wdXNoKGNXYWxrZXIubm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBsZXQgY2hlY2tib3hRID0gY3R4Rm9ybS5xdWVyeVNlbGVjdG9yQWxsKFwiaW5wdXRbdHlwZT1jaGVja2JveF1cIik7XG4gICAgICAgICAgICBmb3IgKGxldCBpZHggPSAwOyBpZHggPCBjaGVja2JveFEubGVuZ3RoOyArK2lkeCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNiID0gY2hlY2tib3hRW2lkeF07XG4gICAgICAgICAgICAgICAgaWYgKChBcmlhVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKGNiLCBcImZvcm1cIilcbiAgICAgICAgICAgICAgICAgICAgfHwgQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgXCJodG1sXCIpXG4gICAgICAgICAgICAgICAgICAgIHx8IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSA9PT0gY3R4Rm9ybVxuICAgICAgICAgICAgICAgICAgICAmJiAhQ29tbW9uVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKGNiKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gY2IuZ2V0QXR0cmlidXRlKFwibmFtZVwiKSB8fCBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAoZm9ybUNhY2hlLmNoZWNrYm94QnlOYW1lW25hbWVdID0gZm9ybUNhY2hlLmNoZWNrYm94QnlOYW1lW25hbWVdIHx8IFtdKS5wdXNoKGNiKTtcbiAgICAgICAgICAgICAgICAgICAgZm9ybUNhY2hlLm5hbWVUb0dyb3VwW25hbWVdID0gZm9ybUNhY2hlLm5hbWVUb0dyb3VwW25hbWVdIHx8IGdldEdyb3VwKGNiKTtcbiAgICAgICAgICAgICAgICAgICAgKytmb3JtQ2FjaGUubnVtQ2hlY2tib3hlcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBHZXQgYWxsIG9mIHRoZSByYWRpb3MgaW4gdGhlIGZvcm0gb3IgYm9keSAoYnV0IG5vdCBuZXN0ZWQgaW4gc29tZXRoaW5nIGVsc2UgYW5kIG5vdCBoaWRkZW4pXG4gICAgICAgICAgICAvLyBsZXQgcmFkaW9zUSA9IGN0eEZvcm0ucXVlcnlTZWxlY3RvckFsbChcImlucHV0W3R5cGU9cmFkaW9dXCIpO1xuICAgICAgICAgICAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgcmFkaW9zUS5sZW5ndGg7ICsraWR4KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgciA9IHJhZGlvc1FbaWR4XTtcbiAgICAgICAgICAgICAgICBjb25zdCByYWRDdHggPSAoQXJpYVV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShyLCBcImZvcm1cIilcbiAgICAgICAgICAgICAgICAgICAgfHwgQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgXCJodG1sXCIpXG4gICAgICAgICAgICAgICAgICAgIHx8IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KTtcbiAgICAgICAgICAgICAgICBpZiAocmFkQ3R4ID09PSBjdHhGb3JtXG4gICAgICAgICAgICAgICAgICAgICYmICFDb21tb25VdGlsLnNob3VsZE5vZGVCZVNraXBwZWRIaWRkZW4ocikpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IHIuZ2V0QXR0cmlidXRlKFwibmFtZVwiKSB8fCBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAoZm9ybUNhY2hlLnJhZGlvc0J5TmFtZVtuYW1lXSA9IGZvcm1DYWNoZS5yYWRpb3NCeU5hbWVbbmFtZV0gfHwgW10pLnB1c2gocik7XG4gICAgICAgICAgICAgICAgICAgIGZvcm1DYWNoZS5uYW1lVG9Hcm91cFtuYW1lXSA9IGZvcm1DYWNoZS5uYW1lVG9Hcm91cFtuYW1lXSB8fCBnZXRHcm91cChyKTtcbiAgICAgICAgICAgICAgICAgICAgKytmb3JtQ2FjaGUubnVtUmFkaW9zO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShjdHhGb3JtLCBcImlucHV0X2NoZWNrYm94ZXNfZ3JvdXBlZFwiLCBmb3JtQ2FjaGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8vLy8vLy8vLy8vLyBDYWxjdWxhdGVkIGV2ZXJ5dGhpbmcsIG5vdyBjaGVjayB0aGUgdmFyaW91cyBjYXNlc1xuXG4gICAgICAgIGNvbnN0IGN0eE5hbWUgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJuYW1lXCIpO1xuICAgICAgICBjb25zdCBjdHhHcm91cCA9IGdldEdyb3VwKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgY3R4VHlwZSA9IGN0eFR5cGUgPT09IFwicmFkaW9cIiA/IFwiUmFkaW9cIiA6IFwiQ2hlY2tib3hcIjtcblxuICAgICAgICBpZiAoIWN0eE5hbWUgfHwgY3R4TmFtZSA9PT0gXCJcIikge1xuICAgICAgICAgICAgLy8gRmlyc3QgcHJvY2VzcyBjYXNlcyB3aGVyZSB0aGUgY29udHJvbCBpcyBub3QgbmFtZWRcbiAgICAgICAgICAgIGlmIChjdHhUeXBlID09PSBcIlJhZGlvXCIpIHtcbiAgICAgICAgICAgICAgICAvLyBSYWRpb3Mgd2l0aG91dCBuYW1lcyBkb24ndCBhY3QgbGlrZSBncm91cHMsIHNvIGRvbid0IGVuZm9yY2UgZ3JvdXBpbmdcbiAgICAgICAgICAgICAgICBpZiAoY3R4R3JvdXAgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc19yYWRpb25vbmFtZVwiLCBbY3R4VHlwZV0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NfZ3JvdXBlZFwiLCBbY3R4VHlwZV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gTXVzdCBiZSBhbiB1bm5hbWVkIGNoZWNrYm94XG4gICAgICAgICAgICAgICAgaWYgKGN0eEdyb3VwID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgoZm9ybUNhY2hlLmNoZWNrYm94QnlOYW1lW1wiXCJdIHx8IFtdKS5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF91bm5hbWVkY2hlY2tib3hcIiwgW2N0eFR5cGVdKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NfbG9uZW5vZ3JvdXBcIiwgW2N0eFR5cGVdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NfZ3JvdXBlZFwiLCBbY3R4VHlwZV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIENvbnNpZGVyaW5nIGEgbmFtZWQgY2hlY2tib3hcbiAgICAgICAgICAgIGNvbnN0IG51bVJhZGlvc1dpdGhOYW1lID0gKGZvcm1DYWNoZS5yYWRpb3NCeU5hbWVbY3R4TmFtZV0gfHwgW10pLmxlbmd0aDtcbiAgICAgICAgICAgIGNvbnN0IG51bUNoZWNrYm94ZXNXaXRoTmFtZSA9IChmb3JtQ2FjaGUuY2hlY2tib3hCeU5hbWVbY3R4TmFtZV0gfHwgW10pLmxlbmd0aDtcbiAgICAgICAgICAgIC8vIENhcGl0YWxpemUgdGhlIGlucHV0IHR5cGUgZm9yIG1lc3NhZ2VzXG4gICAgICAgICAgICBpZiAobnVtUmFkaW9zV2l0aE5hbWUgPiAwICYmIG51bUNoZWNrYm94ZXNXaXRoTmFtZSA+IDApIHtcbiAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIGEgbmFtaW5nIG1pc21hdGNoIGJldHdlZW4gZGlmZmVyZW50IGNvbnRyb2xzXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9jb250cm9sbmFtZW1pc21hdGNoXCIsIFtjdHhUeXBlLCBjdHhUeXBlID09PSBcImNoZWNrYm94XCIgPyBcInJhZGlvXCIgOiBcImNoZWNrYm94XCIsIGN0eE5hbWVdKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY3R4VHlwZSA9PT0gXCJSYWRpb1wiICYmIChmb3JtQ2FjaGUubnVtUmFkaW9zID09PSAxIHx8IG51bVJhZGlvc1dpdGhOYW1lID09PSAxKVxuICAgICAgICAgICAgICAgIHx8IGN0eFR5cGUgPT09IFwiQ2hlY2tib3hcIiAmJiBmb3JtQ2FjaGUubnVtQ2hlY2tib3hlcyA9PT0gMSkge1xuICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBsb25lIGNvbnRyb2wgKGVpdGhlciBvbmx5IGNvbnRyb2wgb2YgdGhpcyB0eXBlIG9uIHRoZSBwYWdlLCBvciBhIHJhZGlvIGJ1dHRvbiB3aXRob3V0IGFueSBvdGhlcnMgYnkgdGhhdCBuYW1lKVxuICAgICAgICAgICAgICAgIC8vIFdlIHBhc3MgdGhpcyBjb250cm9sIGluIGFsbCBjYXNlc1xuICAgICAgICAgICAgICAgIGlmIChjdHhHcm91cCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzX2xvbmVub2dyb3VwXCIsIFtjdHhUeXBlXSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc19ncm91cGVkXCIsIFtjdHhUeXBlXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChjdHhUeXBlID09PSBcIkNoZWNrYm94XCIgJiYgZm9ybUNhY2hlLm51bUNoZWNrYm94ZXMgPiAxICYmIG51bUNoZWNrYm94ZXNXaXRoTmFtZSA9PT0gMSkge1xuICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgb25seSBvbmUgY2hlY2tib3ggd2l0aCB0aGlzIG5hbWUsIGJ1dCB0aGVyZSBhcmUgb3RoZXIgY2hlY2tib3hlcyBpbiB0aGUgZm9ybS5cbiAgICAgICAgICAgICAgICAvLyBJZiB3ZSdyZSBub3QgZ3JvdXBlZCwgYXNrIHRoZW0gdG8gZXhhbWluZSBpdFxuICAgICAgICAgICAgICAgIGlmIChjdHhHcm91cCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF9sb25lY2hlY2tib3hcIiwgW2N0eFR5cGVdKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzX2dyb3VwZWRcIiwgW2N0eFR5cGVdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFdlIHNoYXJlIGEgbmFtZSB3aXRoIGFub3RoZXIgc2ltaWxhciBjb250cm9sLiBBcmUgd2UgZ3JvdXBlZCB0b2dldGhlcj9cbiAgICAgICAgICAgICAgICBpZiAoY3R4R3JvdXAgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZvcm1DYWNoZS5uYW1lVG9Hcm91cFtjdHhOYW1lXSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UncmUgbm90IGdyb3VwZWQsIGJ1dCBzb21lIGNvbnRyb2wgd2l0aCB0aGUgc2FtZSBuYW1lIGlzIGluIGEgZ3JvdXBcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfbm90Z3JvdXBlZG90aGVyZ3JvdXBlZFwiLCBbY3R4VHlwZSwgY3R4TmFtZV0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm9uZSBvZiB1cyBhcmUgZ3JvdXBlZFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiZmFpbF9ub3Rncm91cGVkb3RoZXJub3Rncm91cGVkXCIsIFtjdHhUeXBlLCBjdHhOYW1lXSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZm9ybUNhY2hlLm5hbWVUb0dyb3VwW2N0eE5hbWVdICE9PSBjdHhHcm91cCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBXZSdyZSBub3QgaW4gdGhlIG1haW4gZ3JvdXAgd2l0aCB0aGUgb3RoZXJzXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfbm90c2FtZWdyb3VwXCIsIFtjdHhUeXBlLCBjdHhOYW1lXSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gV2UncmUgYWxsIGdyb3VwZWQgdXAhXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NfZ3JvdXBlZFwiLCBbY3R4VHlwZV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGlucHV0X2ZpZWxkc19ncm91cGVkOiBSdWxlID0ge1xuICAgIGlkOiBcImlucHV0X2ZpZWxkc19ncm91cGVkXCIsXG4gICAgY29udGV4dDogXCJkb206aW5wdXQsIGRvbTp0ZXh0YXJlYSwgZG9tOnNlbGVjdFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0lucHV0X0luRmllbGRTZXRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiaW5wdXRfZmllbGRzX2dyb3VwZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcImlucHV0X2ZpZWxkc19ncm91cGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpbnB1dF9maWVsZHNfZ3JvdXBlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVXNlIHRoZSA8ZmllbGRzZXQ+IGVsZW1lbnQgdG8gZ3JvdXAgbG9naWNhbGx5IHJlbGF0ZWQgaW5wdXQgZWxlbWVudHNcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJHcm91cHMgb2YgbG9naWNhbGx5IHJlbGF0ZWQgaW5wdXQgZWxlbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCB3aXRoaW4gYSA8ZmllbGRzZXQ+IGVsZW1lbnRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy8gRG9uJ3QgdHJpZ2dlciBmb3Igb3RoZXIgaW5wdXQgdHlwZXMgb3IgaWYgd2UncmUgaW4gYSBmaWVsZHNldFxuICAgICAgICBpZiAocnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSBcImlucHV0XCIgJiYgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidHlwZVwiKSkge1xuICAgICAgICAgICAgbGV0IHR5cGUgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBpZiAodHlwZSAhPSBcInRleHRcIiAmJiB0eXBlICE9IFwiZmlsZVwiICYmIHR5cGUgIT0gXCJwYXNzd29yZFwiKVxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgXCJmaWVsZHNldFwiKSAhPSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuXG4gICAgICAgIC8vIE5vIGZpZWxkc2V0IC0gc2VlIGlmIHRoaXMgaW5wdXQgaXMgYWxsIGJ5IGl0c2VsZiAtIG5vIG5lZWQgdG8gZ3JvdXAgc2luZ2xlIGlucHV0c1xuICAgICAgICBsZXQgcGFyZW50ID0gQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgW1wiZm9ybVwiLCBcImJvZHlcIl0pO1xuICAgICAgICBsZXQgY2hlY2tUeXBlcyA9IFtcImlucHV0XCIsIFwidGV4dGFyZWFcIiwgXCJzZWxlY3RcIl07XG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBwYXNzZWQgJiYgaSA8IGNoZWNrVHlwZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGxldCBjb250cm9scyA9IHBhcmVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShjaGVja1R5cGVzW2ldKTtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBwYXNzZWQgJiYgaiA8IGNvbnRyb2xzLmxlbmd0aDsgKytqKSB7XG5cbiAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgbm9kZSBzaG91bGQgYmUgc2tpcHBlZCBvciBub3QgYmFzZWQgb24gdGhlIENoZWNrIEhpZGRlbiBDb250ZW50IHNldHRpbmcgYW5kIGlmIHRoZSBub2RlIGlzVmlzaWJsZSBvclxuICAgICAgICAgICAgICAgIC8vIG5vdC5cbiAgICAgICAgICAgICAgICBpZiAoQ29tbW9uVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKGNvbnRyb2xzW2pdKSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGV4dGFyZWFzIGFuZCBzZWxlY3RzIHdpbGwgYmUgY2FsbGVkIHR5cGU9J3RleHQnXG4gICAgICAgICAgICAgICAgbGV0IHR5cGUgPSBjb250cm9sc1tqXS5oYXNBdHRyaWJ1dGUoXCJ0eXBlXCIpID8gY29udHJvbHNbal0uZ2V0QXR0cmlidXRlKFwidHlwZVwiKS50b0xvd2VyQ2FzZSgpIDogXCJ0ZXh0XCI7XG4gICAgICAgICAgICAgICAgLy8gT25seSBmYWlsIGlmIHRoaXMgaXMgYW5vdGhlciBjb250cm9sIGluIHRoZSBmb3JtIGFuZCBpdHMgdHlwZSBpcyBhbm90aGVyIHRleHQtbGlrZSBpbnB1dFxuICAgICAgICAgICAgICAgIHBhc3NlZCA9IGNvbnRyb2xzW2pdID09IHJ1bGVDb250ZXh0IHx8ICh0eXBlICE9IFwidGV4dFwiICYmIHR5cGUgIT0gXCJwYXNzd29yZFwiICYmIHR5cGUgIT0gXCJmaWxlXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgaW5wdXRfaGFzcG9wdXBfY29uZmxpY3Q6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaW5wdXRfaGFzcG9wdXBfY29uZmxpY3RcIixcbiAgICBjb250ZXh0OiBcImRvbTppbnB1dFtsaXN0XVthcmlhLWhhc3BvcHVwXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiaW5wdXRfaGFzcG9wdXBfaW52YWxpZFwiOiB7XG4gICAgICAgICAgICAvLyBcIlBhc3NcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwicG90ZW50aWFsX3R5cGVfbWlzdXNlXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8yXCI6IFwicG90ZW50aWFsX21pc3VzZVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpbnB1dF9oYXNwb3B1cF9jb25mbGljdC5odG1sXCIsXG4gICAgICAgICAgICAvLyBcInBhc3NcIjogXCJpbnB1dF9oYXNwb3B1cF9jb25mbGljdC5odG1sXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF90eXBlX21pc3VzZVwiOiBcImlucHV0X2hhc3BvcHVwX2NvbmZsaWN0Lmh0bWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX21pc3VzZVwiOiBcImlucHV0X2hhc3BvcHVwX2NvbmZsaWN0Lmh0bWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX2xpc3Rfbm90ZXhpc3RcIjogXCJpbnB1dF9oYXNwb3B1cF9jb25mbGljdC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfaW52YWxpZF9saXN0X3R5cGVcIjogXCJpbnB1dF9oYXNwb3B1cF9jb25mbGljdC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfaW52YWxpZF9saXN0X2VsZW1cIjogXCJpbnB1dF9oYXNwb3B1cF9jb25mbGljdC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiPGlucHV0PiBlbGVtZW50IHdpdGggYSAnbGlzdCcgYXR0cmlidXRlIHNob3VsZCBub3QgdXNlIGFuIGV4cGxpY2l0ICdhcmlhLWhhc3BvcHVwJyBhdHRyaWJ1dGVcIixcbiAgICAgICAgICAgIC8vIFwicGFzc1wiOiBcIlRoZSA8aW5wdXQ+IGVsZW1lbnQgd2l0aCBhICdsaXN0JyBhdHRyaWJ1dGUgZG9lcyBub3QgdXNlIGFuIGV4cGxpY2l0ICdhcmlhLWhhc3BvcHVwJyBhdHRyaWJ1dGVcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX3R5cGVfbWlzdXNlXCI6IFwiVGhlIDxpbnB1dD4gZWxlbWVudCB3aXRoIHR5cGUgXFxcInswfVxcXCIgYW5kICdsaXN0JyBhdHRyaWJ1dGUgdXNlcyBhbiBleHBsaWNpdCAnYXJpYS1oYXNwb3B1cCcgYXR0cmlidXRlXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9taXN1c2VcIjogXCJUaGUgPGlucHV0PiBlbGVtZW50IHdpdGggYSBtaXNzaW5nIG9yIGludmFsaWQgdHlwZSBhbmQgJ2xpc3QnIGF0dHJpYnV0ZSB1c2VzIGFuIGV4cGxpY2l0ICdhcmlhLWhhc3BvcHVwJyBhdHRyaWJ1dGVcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX2xpc3Rfbm90ZXhpc3RcIjogXCJUaGUgbGlzdCBhdHRyaWJ1dGUgZm9yIHRoZSA8aW5wdXQ+IGVsZW1lbnQgaXMgaW52YWxpZFwiLFxuICAgICAgICAgICAgXCJmYWlsX2ludmFsaWRfbGlzdF90eXBlXCI6IFwiVGhlIGxpc3QgYXR0cmlidXRlIGZvciB0aGUgPGlucHV0PiBlbGVtZW50IHdpdGggdGhlIHR5cGUgXFxcInswfVxcXCIgaXMgaW52YWxpZFwiLFxuICAgICAgICAgICAgXCJmYWlsX2ludmFsaWRfbGlzdF9lbGVtXCI6IFwiVGhlIGxpc3QgYXR0cmlidXRlIGZvciB0aGUgPGlucHV0PiBlbGVtZW50IGRvZXMgbm90IHJlZmVyZW5jZSBhIGRhdGFsaXN0IGVsZW1lbnRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjQuMS4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG5cbiAgICAgICAgLy9za2lwIGlmIHRoZSBmaWVsZHNldCBpcyBoaWRkZW4gb3IgZGlzYWJsZWRcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSB8fCBDb21tb25VdGlsLmlzTm9kZURpc2FibGVkKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCByb2xlcyA9IEFyaWFVdGlsLmdldFVzZXJEZWZpbmVkUm9sZXMocnVsZUNvbnRleHQpO1xuICAgICAgICAvLyBsZXQgXCJhcmlhX3JvbGVfdmFsaWRcIiB0byBoYW5kbGUgaW52YWxpZCByb2xlLiBPbmx5IGFsbG93ZWQgcm9sZSBpcyBjb21ib2JveCB3aGljaCBpcyBpbXBsaWNpdC4gXG4gICAgICAgIGlmIChyb2xlcyAmJiByb2xlcy5sZW5ndGggPiAwICYmICFyb2xlcy5pbmNsdWRlcygnY29tYm9ib3gnKSkgXG4gICAgICAgICAgICByZXR1cm4gbnVsbDsgICAgICAgICBcblxuICAgICAgICAvL3RyaWdnZXJpbmcgaW5wdXQgdHlwZXM6IHRleHQsIHNlYXJjaCwgdGVsLCB1cmwsIGVtYWlsLCBvciBtaXNzaW5nIG9yIGludmFsaWQgXG4gICAgICAgIGxldCB5ZXNUeXBlcyA9IFtcInRleHRcIiwgXCJzZWFyY2hcIiwgXCJ0ZWxcIiwgXCJ1cmxcIiwgXCJlbWFpbFwiLCBcImRhdGVcIiwgXCJtb250aFwiLCBcIndlZWtcIiwgXCJ0aW1lXCIsIFwiZGF0ZXRpbWUtbG9jYWxcIiwgXCJudW1iZXJcIiwgXCJyYW5nZVwiLCBcImNvbG9yXCJdO1xuICAgICAgICBsZXQgbm9UeXBlcyA9IFtcImZpbGVcIiwgXCJwYXNzd29yZFwiLCBcImNoZWNrYm94XCIsIFwicmFkaW9cIiwgXCJzdWJtaXRcIiwgXCJyZXNldFwiLCBcImltYWdlXCIsIFwiaGlkZGVuXCIsIFwiYnV0dG9uXCJdO1xuXG4gICAgICAgIGxldCBhdHRyVmFsdWUgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpO1xuICAgICAgICAvL21pc3NpbmcgaW5wdXQgdHlwZSBmb3IgbGlzdCBidXQgd2l0aCBhcmlhX2hhc19wb3B1cFxuICAgICAgICBpZiAoIWF0dHJWYWx1ZSB8fCBhdHRyVmFsdWUudHJpbSgpLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX21pc3VzZVwiKTtcblxuICAgICAgICBhdHRyVmFsdWUgPSBhdHRyVmFsdWUudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIC8vaW52YWxpZCBpbnB1dCB0eXBlcyBmb3IgbGlzdCBidXQgd2l0aCBhcmlhX2hhc19wb3B1cFxuICAgICAgICBpZiAoIXllc1R5cGVzLmluY2x1ZGVzKGF0dHJWYWx1ZSkgJiYgIW5vVHlwZXMuaW5jbHVkZXMoYXR0clZhbHVlKSlcbiAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX21pc3VzZVwiKTtcblxuICAgICAgICAvLyB0aGUgbGlzdCBhdHRyaWJ1dGUgaXMgdXNlZCBmb3Igd3JvbmcgaW5wdXQgdHlwZVxuICAgICAgICBpZiAoYXR0clZhbHVlICYmIG5vVHlwZXMuaW5jbHVkZXMoYXR0clZhbHVlKSlcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfaW52YWxpZF9saXN0X3R5cGVcIik7XG5cbiAgICAgICAgbGV0IGxpc3QgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJsaXN0XCIpO1xuICAgICAgICAvLyB0aGUgbGlzdCBhdHRyaWJ1dGUgaXMgYmxhbmtcbiAgICAgICAgaWYgKCFsaXN0IHx8IGxpc3QudHJpbSgpLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX2xpc3Rfbm90ZXhpc3RcIik7XG5cbiAgICAgICAgbGV0IGxpc3RFbGVtID0gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5nZXRFbGVtZW50QnlJZChsaXN0KTtcbiAgICAgICAgLy8gdGhlIGxpc3QgZWxlbWVudCBkb2Vzbid0IGV4aXN0XG4gICAgICAgIGlmICghbGlzdEVsZW0pXG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJwb3RlbnRpYWxfbGlzdF9ub3RleGlzdFwiKTtcblxuICAgICAgICAvLyB0aGUgbGlzdCBlbGVtZW50IGlzIG5vdCBhIGRhdGFsaXN0IGVsZW1lbnRcbiAgICAgICAgaWYgKGxpc3RFbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgIT09ICdkYXRhbGlzdCcpXG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2ludmFsaWRfbGlzdF9lbGVtXCIpO1xuXG4gICAgICAgIC8vIHZhbGlkIGlucHV0IHR5cGVzIGZvciBsaXN0IGJ1dCB3aXRoIGFyaWFfaGFzX3BvcHVwICAgIFxuICAgICAgICBpZiAoeWVzVHlwZXMuaW5jbHVkZXMoYXR0clZhbHVlKSlcbiAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX3R5cGVfbWlzdXNlXCIsIFthdHRyVmFsdWVdKTtcbiAgICAgICAgXG4gICAgICAgIC8vIHNob3VsZG4ndCBnZXQgaGVyZSBcbiAgICAgICAgICAgIHJldHVybjtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGlucHV0X2xhYmVsX2FmdGVyOiBSdWxlID0ge1xuICAgIGlkOiBcImlucHV0X2xhYmVsX2FmdGVyXCIsXG4gICAgY29udGV4dDogXCJkb206aW5wdXRcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9JbnB1dF9MYWJlbEFmdGVyXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJGYWlsXzJcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcImlucHV0X2xhYmVsX2FmdGVyLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiaW5wdXRfbGFiZWxfYWZ0ZXIuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJpbnB1dF9sYWJlbF9hZnRlci5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiaW5wdXRfbGFiZWxfYWZ0ZXIuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJDaGVja2JveCBvciByYWRpbyBidXR0b24gaXMgbmVzdGVkIGluIGxhYmVsLCBzbyBsYWJlbCBpcyBub3QgYWZ0ZXIgdGhlIGlucHV0IGNvbnRyb2xcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiTGFiZWwgdGV4dCBpcyBsb2NhdGVkIGJlZm9yZSBpdHMgYXNzb2NpYXRlZCBjaGVja2JveCBvciByYWRpbyBidXR0b24gZWxlbWVudFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkNoZWNrYm94ZXMgYW5kIHJhZGlvIGJ1dHRvbnMgbXVzdCBoYXZlIGEgbGFiZWwgYWZ0ZXIgdGhlIGlucHV0IGNvbnRyb2xcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjMuMy4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCB0eXBlID0gXCJcIjtcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInR5cGVcIikpXG4gICAgICAgICAgICB0eXBlID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidHlwZVwiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAodHlwZSAhPSBcImNoZWNrYm94XCIgJiYgdHlwZSAhPSBcInJhZGlvXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IG9ubHkgdGhlIG5vbi1oaWRkZW4gbGFiZWxzIGZvciBlbGVtZW50XG4gICAgICAgIGxldCBsYWJlbEVsZW0gPSBDb21tb25VdGlsLmdldExhYmVsRm9yRWxlbWVudEhpZGRlbihydWxlQ29udGV4dCwgdHJ1ZSk7XG4gICAgICAgIGlmIChsYWJlbEVsZW0gPT09IG51bGwgfHwgIUNvbW1vblV0aWwuaGFzSW5uZXJDb250ZW50SGlkZGVuKGxhYmVsRWxlbSkpIHtcbiAgICAgICAgICAgIC8vIER1ZSB0byBkZXBlbmRlbmN5LCBsYWJlbCBtdXN0IGJlIGRvbmUgdmlhIHRpdGxlIC0gdGhpcyBydWxlIGRvZXNuJ3QgYXBwbHlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGxldCB2YWx1ZSA9IENvbW1vblV0aWwuY29tcGFyZU5vZGVPcmRlcihsYWJlbEVsZW0sIHJ1bGVDb250ZXh0KTtcbiAgICAgICAgbGV0IHBhc3NlZDtcbiAgICAgICAgaWYgKHZhbHVlID09PSAtMikge1xuICAgICAgICAgICAgLy8gaW5wdXQgbmVzdGVkIGluIGxhYmVsXG4gICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCB3YWxrTm9kZSA9IG5ldyBET01XYWxrZXIobGFiZWxFbGVtKTtcbiAgICAgICAgICAgIHdhbGtOb2RlLm5vZGUgPSBydWxlQ29udGV4dDtcbiAgICAgICAgICAgIHdoaWxlICghcGFzc2VkICYmIHdhbGtOb2RlLm5leHROb2RlKCkpIHtcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSAoKHdhbGtOb2RlLm5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCIjdGV4dFwiICYmIHdhbGtOb2RlLm5vZGUubm9kZVZhbHVlLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICB8fCAod2Fsa05vZGUubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInNwYW5cIiAmJiB3YWxrTm9kZS5ub2RlLnRleHRDb250ZW50LnRyaW0oKS5sZW5ndGggPiAwKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgIC8vIElucHV0IG5lc3RlZCBpbiBsYWJlbCBhbmQgdGV4dCBiZWZvcmUgaW5wdXRcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodmFsdWUgIT0gMSkge1xuICAgICAgICAgICAgICAgIC8vIGxhYmVsIGlzIGJlZm9yZSBpbnB1dFxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGlucHV0X2xhYmVsX2JlZm9yZTogUnVsZSA9IHtcbiAgICBpZDogXCJpbnB1dF9sYWJlbF9iZWZvcmVcIixcbiAgICBjb250ZXh0OiBcImRvbTppbnB1dCwgZG9tOnRleHRhcmVhLCBkb206c2VsZWN0XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfSW5wdXRfTGFiZWxCZWZvcmVcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkZhaWxfMlwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiaW5wdXRfbGFiZWxfYmVmb3JlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiaW5wdXRfbGFiZWxfYmVmb3JlLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiaW5wdXRfbGFiZWxfYmVmb3JlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpbnB1dF9sYWJlbF9iZWZvcmUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUZXh0IGlucHV0IGlzIG5lc3RlZCBpbiBsYWJlbCBzdWNoIHRoYXQgaW5wdXQgcHJlY2VkZXMgdGhlIGxhYmVsIHRleHRcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiTGFiZWwgdGV4dCBpcyBsb2NhdGVkIGFmdGVyIGl0cyBhc3NvY2lhdGVkIHRleHQgaW5wdXQgb3IgPHNlbGVjdD4gZWxlbWVudFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRleHQgaW5wdXRzIGFuZCA8c2VsZWN0PiBlbGVtZW50cyBtdXN0IGhhdmUgYSBsYWJlbCBiZWZvcmUgdGhlIGlucHV0IGNvbnRyb2xcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjMuMy4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmIChydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09IFwiaW5wdXRcIiAmJiBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0eXBlXCIpKSB7XG4gICAgICAgICAgICBsZXQgdHlwZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInR5cGVcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIGlmICh0eXBlICE9IFwidGV4dFwiICYmIHR5cGUgIT0gXCJmaWxlXCIgJiYgdHlwZSAhPSBcInBhc3N3b3JkXCIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdldCBvbmx5IHRoZSBub24taGlkZGVuIGxhYmVscyBmb3IgZWxlbWVudFxuICAgICAgICBsZXQgbGFiZWxFbGVtID0gQ29tbW9uVXRpbC5nZXRMYWJlbEZvckVsZW1lbnRIaWRkZW4ocnVsZUNvbnRleHQsIHRydWUpO1xuICAgICAgICBcbiAgICAgICAgaWYgKGxhYmVsRWxlbSA9PSBudWxsIHx8ICFDb21tb25VdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbihsYWJlbEVsZW0pKSB7XG4gICAgICAgICAgICAvLyBEdWUgdG8gZGVwZW5kZW5jeSwgbGFiZWwgbXVzdCBiZSBkb25lIHZpYSB0aXRsZSAtIHRoaXMgcnVsZSBkb2Vzbid0IGFwcGx5XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB2YWx1ZSA9IENvbW1vblV0aWwuY29tcGFyZU5vZGVPcmRlcihsYWJlbEVsZW0sIHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKHZhbHVlID09PSAtMikge1xuICAgICAgICAgICAgLy8gaWdub3JlIGlmIG5vIGxhYmVsIG9yIHRoZSBjb250ZW50IGZvciB0aGUgbGFiZWwgaXMgb25seSBmcm9tIHRoZSBuZXN0ZWQgaW5wdXQgY29udHJvbCBcbiAgICAgICAgICAgIGxldCB0ZXh0ID0gQ29tbW9uVXRpbC5nZXRJbm5lclRleHQocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgaWYgKHRleHQgJiYgdGV4dC50cmltKCkubGVuZ3RoID4gMCAmJiBDb21tb25VdGlsLmdldElubmVyVGV4dChydWxlQ29udGV4dCkudHJpbSgpID09PSB0ZXh0LnRyaW0oKSkge1xuICAgICAgICAgICAgICAgIC8vIER1ZSB0byBkZXBlbmRlbmN5LCBsYWJlbCBtdXN0IGJlIGRvbmUgdmlhIHRpdGxlIC0gdGhpcyBydWxlIGRvZXNuJ3QgYXBwbHlcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaW5wdXQgbmVzdGVkIGluIGxhYmVsXG4gICAgICAgICAgICBsZXQgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgd2Fsa05vZGUgPSBydWxlQ29udGV4dC5wcmV2aW91c1NpYmxpbmc7XG4gICAgICAgICAgICB3aGlsZSAoIXBhc3NlZCAmJiB3YWxrTm9kZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9ICgod2Fsa05vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSBcIiN0ZXh0XCIgJiYgd2Fsa05vZGUubm9kZVZhbHVlLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICB8fCAod2Fsa05vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSBcInNwYW5cIiAmJiB3YWxrTm9kZS50ZXh0Q29udGVudC50cmltKCkubGVuZ3RoID4gMCkpO1xuICAgICAgICAgICAgICAgIHdhbGtOb2RlID0gd2Fsa05vZGUucHJldmlvdXNTaWJsaW5nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgICAgICAvLyBJbnB1dCBuZXN0ZWQgaW4gbGFiZWwgYW5kIHRleHQgYWZ0ZXIgaW5wdXRcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodmFsdWUgIT0gLTEpIHtcbiAgICAgICAgICAgICAgICAvLyBsYWJlbCBpcyBhZnRlciBpbnB1dFxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMlwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBIYXZlbid0IHJldHVybmVkIHlldCwgdGhlbiBJIHBhc3NcbiAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5pbXBvcnQgeyBBY2NOYW1lVXRpbCB9IGZyb20gXCIuLi91dGlsL0FjY05hbWVVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBpbnB1dF9sYWJlbF9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwiaW5wdXRfbGFiZWxfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmJ1dHRvbixhcmlhOmNoZWNrYm94LGFyaWE6Y29tYm9ib3gsYXJpYTpsaXN0Ym94LGFyaWE6bWVudWl0ZW1jaGVja2JveCxhcmlhOm1lbnVpdGVtcmFkaW8sYXJpYTpyYWRpbyxhcmlhOnNlYXJjaGJveCxhcmlhOnNsaWRlcixhcmlhOnNwaW5idXR0b24sYXJpYTpzd2l0Y2gsYXJpYTp0ZXh0Ym94LGFyaWE6cHJvZ3Jlc3NiYXIsZG9tOmlucHV0W3R5cGU9ZmlsZV0sZG9tOm91dHB1dCxkb206bWV0ZXIsZG9tOmlucHV0W3R5cGU9cGFzc3dvcmRdXCIsXG4gICAgLy9kZXBlbmRlbmNpZXM6IFtcImFyaWFfcm9sZV9yZWR1bmRhbnRcIiwgXCJhcmlhX3JvbGVfdmFsaWRcIl0sXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfSW5wdXRfRXhwbGljaXRMYWJlbFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiRmFpbF8yXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJpbnB1dF9sYWJlbF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJpbnB1dF9sYWJlbF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJpbnB1dF9sYWJlbF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImlucHV0X2xhYmVsX2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZvcm0gY29udHJvbCBlbGVtZW50IDx7MH0+IGhhcyBubyBhc3NvY2lhdGVkIGxhYmVsXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkZvcm0gY29udHJvbCB3aXRoIFxcXCJ7MH1cXFwiIHJvbGUgaGFzIG5vIGFzc29jaWF0ZWQgbGFiZWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJFYWNoIGZvcm0gY29udHJvbCBtdXN0IGhhdmUgYW4gYXNzb2NpYXRlZCBsYWJlbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sIC8qIHJlbW92ZSAxLjEuMSBtYXBwaW5nLCBrZWVwIDQuMS4yICovXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIC8vIFRPRE86IEFDVDogaHR0cHM6Ly9naXRodWIuY29tL0lCTWEvZXF1YWwtYWNjZXNzL2lzc3Vlcy83NTZcbiAgICBhY3Q6IFtcIjk3YTRlMVwiLCBcImUwODZlNVwiXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAvL2lnbm9yZSBkYXRhbGlzdCBlbGVtZW50IGNoZWNrIHNpbmNlIGl0IHdpbGwgYmUgcGFydCBvZiBhIGlucHV0IGVsZW1lbnQgb3IgaGlkZGVuIGJ5IGRlZmF1bHRcbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSAnZGF0YWxpc3QnKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICAvLyBEZXRlcm1pbmUgdGhlIGlucHV0IHR5cGVcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGxldCB0eXBlID0gXCJ0ZXh0XCI7XG4gICAgICAgIGlmIChub2RlTmFtZSA9PSBcImlucHV0XCIgJiYgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidHlwZVwiKSkge1xuICAgICAgICAgICAgdHlwZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInR5cGVcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgfSBlbHNlIGlmIChub2RlTmFtZSA9PT0gXCJidXR0b25cIiB8fCBBcmlhVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MocnVsZUNvbnRleHQsIFwiYnV0dG9uXCIpKSB7XG4gICAgICAgICAgICB0eXBlID0gXCJidXR0b25lbGVtXCI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5vZGVOYW1lID09IFwiaW5wdXRcIiAmJiB0eXBlID09IFwiXCIpIHtcbiAgICAgICAgICAgIHR5cGUgPSBcInRleHRcIjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZSA9PT0gXCJpbWFnZVwiKSB7XG4gICAgICAgICAgICAvLyBIYW5kbGVkIGJ5IGlucHV0X2xhYmVsX2V4aXN0c0ltYWdlXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuLyoqIFxuICAgICAgICBsZXQgUE9GID0gLTE7XG4gICAgICAgIGxldCB0ZXh0VHlwZXMgPSBDb21tb25VdGlsLmlucHV0X3RleHRfdHlwZXM7XG4gICAgICAgIGxldCBidXR0b25UeXBlcyA9IENvbW1vblV0aWwuZm9ybV9idXR0b25fdHlwZXM7ICBcbiAgICAgICBcbiAgICAgICAgbGV0IGJ1dHRvblR5cGVzV2l0aERlZmF1bHRzID0gW1wicmVzZXRcIiwgXCJzdWJtaXRcIl07IC8vICdzdWJtaXQnIGFuZCAncmVzZXQnIGhhdmUgdmlzaWJsZSBkZWZhdWx0cy5cbiAgICAgICAgaWYgKHRleHRUeXBlcy5pbmRleE9mKHR5cGUpICE9PSAtMSkgeyAvLyBJZiB0eXBlIGlzIGluIHRoZSBsaXN0XG4gICAgICAgICAgICAvLyBHZXQgb25seSB0aGUgbm9uLWhpZGRlbiBsYWJlbHMgZm9yIGVsZW1lbnRzLCBpbiB0aGUgY2FzZSB0aGF0IGEgbGFiZWwgaXMgaGlkZGVuIHRoZW4gaXQgaXMgYSB2aW9sYXRpb25cbiAgICAgICAgICAgIC8vIE5vdGU6IGxhYmVsW2Zvcl0gZG9lcyBub3Qgd29yayBmb3IgQVJJQSBkZWZpbmVkIGlucHV0c1xuICAgICAgICAgICAgbGV0IGxhYmVsRWxlbSA9IHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInJvbGVcIikgPyBudWxsIDogQ29tbW9uVXRpbC5nZXRMYWJlbEZvckVsZW1lbnRIaWRkZW4ocnVsZUNvbnRleHQsIHRydWUpO1xuICAgICAgICAgICAgbGV0IGhhc0xhYmVsRWxlbUNvbnRlbnQgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChsYWJlbEVsZW0pIHtcbiAgICAgICAgICAgICAgICBpZiAoQ29tbW9uVXRpbC5oYXNJbm5lckNvbnRlbnRIaWRkZW4obGFiZWxFbGVtKSkge1xuICAgICAgICAgICAgICAgICAgICBoYXNMYWJlbEVsZW1Db250ZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChsYWJlbEVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKSB8fCBcIlwiKS50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBoYXNMYWJlbEVsZW1Db250ZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxhYmVsRWxlbS5oYXNBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsbGVkYnlcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsbGVkQnlFbGVtID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQobGFiZWxFbGVtLCBsYWJlbEVsZW0uZ2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsbGVkYnknKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsYWJlbGxlZEJ5RWxlbSAmJiAhRE9NVXRpbC5zYW1lTm9kZShsYWJlbGxlZEJ5RWxlbSwgbGFiZWxFbGVtKSAmJiBDb21tb25VdGlsLmhhc0lubmVyQ29udGVudChsYWJlbGxlZEJ5RWxlbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGhhc0xhYmVsRWxlbUNvbnRlbnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcGFzc2VkID0gKCEhbGFiZWxFbGVtICYmIGhhc0xhYmVsRWxlbUNvbnRlbnQpIHx8XG4gICAgICAgICAgICAgICAgKCFsYWJlbEVsZW0gJiYgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJ0aXRsZVwiKSB8fCBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInBsYWNlaG9sZGVyXCIpKSB8fFxuICAgICAgICAgICAgICAgIEFyaWFVdGlsLmdldEFyaWFMYWJlbChydWxlQ29udGV4dCkudHJpbSgpLmxlbmd0aCA+IDAgfHwgQ29tbW9uVXRpbC5oYXNJbXBsaWNpdExhYmVsKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgIGlmICghcGFzc2VkKSBQT0YgPSAyICsgdGV4dFR5cGVzLmluZGV4T2YodHlwZSk7XG4gICAgICAgICAgICBcbiAgICAgICAgfSBlbHNlIGlmIChidXR0b25UeXBlcy5pbmRleE9mKHR5cGUpICE9PSAtMSkgeyAvLyBJZiB0eXBlIGlzIGEgYnV0dG9uXG4gICAgICAgICAgICBpZiAoYnV0dG9uVHlwZXNXaXRoRGVmYXVsdHMuaW5kZXhPZih0eXBlKSAhPT0gLTEgJiYgIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInZhbHVlXCIpKSB7XG4gICAgICAgICAgICAgICAgLy8gJ3N1Ym1pdCcgYW5kICdyZXNldCcgaGF2ZSB2aXNpYmxlIGRlZmF1bHRzIHNvIHBhc3MgaWYgdGhlcmUgaXMgbm8gJ3ZhbHVlJyBhdHRyaWJ1dGVcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInZhbHVlXCIpIHx8IEFyaWFVdGlsLmhhc0FyaWFMYWJlbChydWxlQ29udGV4dCkgfHwgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJ0aXRsZVwiKTtcbiAgICAgICAgICAgICAgICBpZiAoIXBhc3NlZCkgUE9GID0gMiArIHRleHRUeXBlcy5sZW5ndGggKyBidXR0b25UeXBlcy5pbmRleE9mKHR5cGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gXCJidXR0b25lbGVtXCIpIHtcbiAgICAgICAgICAgIC8vIElmIEkgYW0gYW4gaW1hZ2UgYW5kIEkgaGF2ZSBhbHQgdGV4dCAtIGFjY2Vzc2liaWxpdHktd2ViLWVuZ2luZSMyNjlcbiAgICAgICAgICAgIGxldCBiQWx0ID0gZmFsc2U7XG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbWdcIiAmJiBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhbHRcIikpIHtcbiAgICAgICAgICAgICAgICBsZXQgYWx0ID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYWx0XCIpO1xuICAgICAgICAgICAgICAgIGlmIChhbHQudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBiQWx0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYkFsdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHBhc3NlZCA9IENvbW1vblV0aWwuaGFzSW5uZXJDb250ZW50SGlkZGVuKHJ1bGVDb250ZXh0KSB8fCBBcmlhVXRpbC5oYXNBcmlhTGFiZWwocnVsZUNvbnRleHQpIHx8IGJBbHQgfHwgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJ0aXRsZVwiKTtcblxuICAgICAgICAgICAgaWYgKCFwYXNzZWQpIFBPRiA9IDIgKyB0ZXh0VHlwZXMubGVuZ3RoICsgYnV0dG9uVHlwZXMubGVuZ3RoICsgMTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vY2hlY2sgaWYgYSBuYXRpdmUgYnV0dG9uIGlzIGxhYmVsbGVkXG4gICAgICAgIGlmICghcGFzc2VkICYmIG5vZGVOYW1lID09IFwiYnV0dG9uXCIpIHtcbiAgICAgICAgICAgICBpZiAoQ29tbW9uVXRpbC5oYXNJbXBsaWNpdExhYmVsKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBsYWJlbCA9IENvbW1vblV0aWwuZ2V0TGFiZWxGb3JFbGVtZW50KHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgICAgICBpZiAobGFiZWwgJiYgQ29tbW9uVXRpbC5oYXNJbm5lckNvbnRlbnRIaWRkZW4obGFiZWwpKVxuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSB0cnVlOyAgICBcbiAgICAgICAgICAgICB9ICAgIFxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUnB0X0FyaWFfVmFsaWRJZFJlZiBkZXRlcm1pbmVzIGlmIHRoZSBhcmlhLWxhYmVsbGVkYnkgaWQgcG9pbnRzIHRvIGEgdmFsaWQgZWxlbWVudFxuICAgICAgICBpZiAoIXBhc3NlZCAmJiAoYnV0dG9uVHlwZXMuaW5kZXhPZih0eXBlKSAhPT0gLTEpKSB7XG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiY2xhc3NcIikgJiYgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiY2xhc3NcIikgPT0gXCJkaWppdE9mZlNjcmVlblwiICYmIERPTVdhbGtlci5wYXJlbnRFbGVtZW50KHJ1bGVDb250ZXh0KS5oYXNBdHRyaWJ1dGUoXCJ3aWRnZXRpZFwiKSkge1xuICAgICAgICAgICAgICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIGRpaml0IGJ1dHRvbnNcbiAgICAgICAgICAgICAgICBsZXQgbGFiZWxJZCA9IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KHJ1bGVDb250ZXh0KS5nZXRBdHRyaWJ1dGUoXCJ3aWRnZXRpZFwiKSArIFwiX2xhYmVsXCI7XG4gICAgICAgICAgICAgICAgbGV0IGxhYmVsID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQocnVsZUNvbnRleHQsIGxhYmVsSWQpO1xuICAgICAgICAgICAgICAgIGlmIChsYWJlbCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IENvbW1vblV0aWwuaGFzSW5uZXJDb250ZW50SGlkZGVuKGxhYmVsKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBtZWFucyBJIGZhaWxlZCBhYm92ZSBhbHNvXG4gICAgICAgICAgICAgICAgICAgIGlmICghcGFzc2VkKSBQT0YgPSAyICsgdGV4dFR5cGVzLmxlbmd0aCArIGJ1dHRvblR5cGVzLmxlbmd0aCArIDQgKyBidXR0b25UeXBlcy5pbmRleE9mKHR5cGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghcGFzc2VkICYmIG5vZGVOYW1lID09IFwib3B0Z3JvdXBcIikge1xuICAgICAgICAgICAgcGFzc2VkID0gQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJsYWJlbFwiKTtcbiAgICAgICAgICAgIGlmICghcGFzc2VkKSBQT0YgPSAyICsgdGV4dFR5cGVzLmxlbmd0aCArIGJ1dHRvblR5cGVzLmxlbmd0aCArIDI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFwYXNzZWQgJiYgbm9kZU5hbWUgPT0gXCJvcHRpb25cIikge1xuICAgICAgICAgICAgLy8gSXMgYSBub24tZW1wdHkgdmFsdWUgYXR0cmlidXRlIGFsc28gZW5vdWdoIGZvciBhbiBvcHRpb24gZWxlbWVudD9cbiAgICAgICAgICAgIHBhc3NlZCA9IENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwibGFiZWxcIikgfHwgcnVsZUNvbnRleHQuaW5uZXJIVE1MLnRyaW0oKS5sZW5ndGggPiAwO1xuICAgICAgICAgICAgaWYgKCFwYXNzZWQpIFBPRiA9IDIgKyB0ZXh0VHlwZXMubGVuZ3RoICsgYnV0dG9uVHlwZXMubGVuZ3RoICsgMztcbiAgICAgICAgfSBcbiAgICAgICAgXG4gICAgICAgIGlmICghcGFzc2VkKVxuICAgICAgICAgICAgcGFzc2VkID0gQXJpYVV0aWwuZ2V0QXJpYUxhYmVsKHJ1bGVDb250ZXh0KS50cmltKCkubGVuZ3RoID4gMCB8fCBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInRpdGxlXCIpO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgLy8gY2hlY2sgYXJpYSByb2xlIHRvIGZpZ3VyZSBvdXQgaWYgdGhlIGFjY2Vzc2libGUgbmFtZSBjYW4gYmUgZnJvbSBjb250ZW50IFxuICAgICAgICAgICAgY29uc3Qgcm9sZXMgPSBBcmlhVXRpbC5nZXRSb2xlcyhydWxlQ29udGV4dCwgdHJ1ZSk7XG4gICAgICAgICAgICAvL3doZW4gbXVsdGlwbGUgcm9sZXMgc3BlY2lmaWVkLCBvbmx5IHRoZSBmaXJzdCB2YWxpZCByb2xlIChndWFyYW50ZWVkIGJ5IGRlcGVuZGVuY2llcykgaXMgYXBwbGllZCwgYW5kIHRoZSBvdGhlcnMganVzdCBhcyBmYWxsYmFja3NcbiAgICAgICAgICAgIGlmIChBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNbcm9sZXNbMF1dICYmIEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlc1swXV0ubmFtZUZyb20gJiYgQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVzWzBdXS5uYW1lRnJvbS5pbmNsdWRlcyhcImNvbnRlbnRzXCIpKVxuICAgICAgICAgICAgICAgIHBhc3NlZCA9IENvbW1vblV0aWwuaGFzSW5uZXJDb250ZW50SGlkZGVuKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgfVxuKi9cbiAgICAgICAgY29uc3QgcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZShydWxlQ29udGV4dCk7XG4gICAgICAgIHBhc3NlZCA9IHBhaXIgJiYgcGFpci5uYW1lICYmIHBhaXIubmFtZS50cmltKCkubGVuZ3RoID4gMDtcblxuICAgICAgICBpZiAocGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH0gZWxzZSBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwicm9sZVwiKSAmJiBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzJcIiwgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwicm9sZVwiKS5zcGxpdChcIiBcIikpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIsIFtub2RlTmFtZV0pO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBGcmFnbWVudFV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvY2hlY2tlci9hY2Nlc3NpYmlsaXR5L3V0aWwvZnJhZ21lbnRcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5pbXBvcnQgeyBET01VdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01VdGlsXCI7XG5pbXBvcnQgeyBBY2NOYW1lVXRpbCB9IGZyb20gXCIuLi91dGlsL0FjY05hbWVVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBpbnB1dF9sYWJlbF92aXNpYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcImlucHV0X2xhYmVsX3Zpc2libGVcIixcbiAgICBjb250ZXh0OiBcImFyaWE6YnV0dG9uLGFyaWE6Y2hlY2tib3gsYXJpYTpjb21ib2JveCxhcmlhOmxpc3Rib3gsYXJpYTptZW51aXRlbWNoZWNrYm94LGFyaWE6bWVudWl0ZW1yYWRpbyxhcmlhOnJhZGlvLGFyaWE6c2VhcmNoYm94LGFyaWE6c2xpZGVyLGFyaWE6c3BpbmJ1dHRvbixhcmlhOnN3aXRjaCxhcmlhOnRleHRib3hcIixcbiAgICBkZXBlbmRlbmNpZXM6IFtcImlucHV0X2xhYmVsX2V4aXN0c1wiXSwgXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfSW5wdXRfVmlzaWJsZUxhYmVsXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcInBvdGVudGlhbF9ub19sYWJlbFwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfcGxhY2Vob2xkZXJfb25seVwiOiBcInBvdGVudGlhbF9wbGFjZWhvbGRlcl9vbmx5XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImlucHV0X2xhYmVsX3Zpc2libGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfcGxhY2Vob2xkZXJfb25seVwiOiBcImlucHV0X2xhYmVsX3Zpc2libGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfbm9fbGFiZWxcIjogXCJpbnB1dF9sYWJlbF92aXNpYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpbnB1dF9sYWJlbF92aXNpYmxlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlRoZSBpbnB1dCBlbGVtZW50IGhhcyBhbiBhc3NvY2lhdGVkIHZpc2libGUgbGFiZWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX3BsYWNlaG9sZGVyX29ubHlcIjogXCJUaGUg4oCYcGxhY2Vob2xkZXLigJkgaXMgdGhlIG9ubHkgdmlzaWJsZSBsYWJlbFwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfbm9fbGFiZWxcIjogXCJUaGUgaW5wdXQgZWxlbWVudCBkb2VzIG5vdCBoYXZlIGFuIGFzc29jaWF0ZWQgdmlzaWJsZSBsYWJlbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkFuIGlucHV0IGVsZW1lbnQgbXVzdCBoYXZlIGFuIGFzc29jaWF0ZWQgdmlzaWJsZSBsYWJlbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi41LjNcIiwgXCIzLjMuMlwiXSwgLy9tYXAgdG8gYm90aCByZXF1aXJlbWVudHMgaW4gaGVscFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIFxuICAgICAgICAvL2lnbm9yZSBkYXRhbGlzdCBlbGVtZW50IGNoZWNrIHNpbmNlIGl0IHdpbGwgYmUgcGFydCBvZiBhIGlucHV0IGVsZW1lbnQgb3IgaGlkZGVuIGJ5IGRlZmF1bHRcbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSAnZGF0YWxpc3QnKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgaWYgKCFWaXNVdGlsLmlzTm9kZVZpc2libGUocnVsZUNvbnRleHQpIHx8IENvbW1vblV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIFxuICAgICAgICAvLyBpZiBhIGNvbnRyb2wgaXMgaW4gYSB0YWJsZSBjZWxsLCB0aGUgY29sIGhlYWRlcnMgY2FuIGFjdCBhcyB2aXNpYmxlIGxhYmVsLCB3aGljaCBpcyBjaGVja2VkIGluIHRhYmxlIGhlYWRpbmcgcnVsZVxuICAgICAgICBpZiAoQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgXCJ0YWJsZVwiKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIGN1c3RvbSB3aWRnZXQgc3VibWlzc2lvbiBpcyBub3QgaW4gc2NvcGUgZm9yIHRoaXMgc3VjY2VzcyBjcml0ZXJpYSAoSUJNYS9lcXVhbC1hY2Nlc3MjMjA0KSBpZiBpdCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIGRhdGEgZW50cnlcbiAgICAgICAgbGV0IHJvbGUgPSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAocm9sZSAmJiByb2xlID09PSBcImJ1dHRvblwiICYmIG5vZGVOYW1lICE9PSAnaW5wdXQnICYmIG5vZGVOYW1lICE9PSAnYnV0dG9uJykgeyAgICBcbiAgICAgICAgICAgIC8vIGxpa2VseSBhIGN1c3RvbSB3aWRnZXQsIHNraXAgaWYgbm90IGFzc29jaWF0ZWQgd2l0aCBkYXRhIGVudHJ5XG4gICAgICAgICAgICBpZiAoIUNvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFwiZm9ybVwiKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsgICAgXG4gICAgICAgIH1cblxuICAgICAgICAvLyB3aGVuIGluIGEgY29tYm9ib3gsIG9ubHkgbG9vayBhdCB0aGUgaW5wdXQgdGV4dGJveC5cbiAgICAgICAgaWYgKEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUocnVsZUNvbnRleHQsIFwiY29tYm9ib3hcIikgJiZcbiAgICAgICAgICAgICEoQXJpYVV0aWwuaGFzUm9sZUluU2VtYW50aWNzKHJ1bGVDb250ZXh0LCBcInRleHRib3hcIikgfHwgQXJpYVV0aWwuaGFzUm9sZUluU2VtYW50aWNzKHJ1bGVDb250ZXh0LCBcInNlYXJjaGJveFwiKSB8fFxuICAgICAgICAgICAgICAgIG5vZGVOYW1lID09PSBcImlucHV0XCIgfHwgKG5vZGVOYW1lID09PSBcInNlbGVjdFwiICYmIEFyaWFVdGlsLmhhc1JvbGVJblNlbWFudGljcyhydWxlQ29udGV4dCwgXCJjb21ib2JveFwiKSkpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICAvLyBhdm9pZCBkaWFnbm9zaW5nIHRoZSBwb3B1cCBsaXN0IG9mIGEgY29tYm9ib3guXG4gICAgICAgIGxldCByb2xlc1RvQ2hlY2sgPSBbXCJsaXN0Ym94XCIsIFwidHJlZVwiLCBcImdyaWRcIiwgXCJkaWFsb2dcIl07XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcm9sZXNUb0NoZWNrLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBpZiAoQXJpYVV0aWwuaGFzUm9sZUluU2VtYW50aWNzKHJ1bGVDb250ZXh0LCByb2xlc1RvQ2hlY2tbal0pKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNvbWJvYm94ZXMgPSBDb21tb25VdGlsLmdldEVsZW1lbnRzQnlSb2xlSGlkZGVuKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsIFwiY29tYm9ib3hcIiwgdHJ1ZSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBjb21ib2JveGVzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjb21ib2JveCA9IGNvbWJvYm94ZXNba107XG4gICAgICAgICAgICAgICAgICAgIGxldCBhcmlhX293bnMgPSBDb21tb25VdGlsLmdldEVsZW1lbnRBdHRyaWJ1dGUoY29tYm9ib3gsIFwiYXJpYS1vd25zXCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoYXJpYV9vd25zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgb3ducyA9IENvbW1vblV0aWwubm9ybWFsaXplU3BhY2luZyhhcmlhX293bnMudHJpbSgpKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG93bnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgb3duZWQgPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChydWxlQ29udGV4dCwgb3duc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG93bmVkID09PSBydWxlQ29udGV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGNvbnN0IHBhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWUocnVsZUNvbnRleHQpO1xuICAgICAgICAvLyBjaGVjayB2aXNpYmxlIGxhYmVsIGZvciBpbnB1dCBvciBidXR0b25cbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSAnaW5wdXQnIHx8IG5vZGVOYW1lID09PSAnYnV0dG9uJykge1xuICAgICAgICAgICAgaWYgKHBhaXIgJiYgcGFpci5uYW1lICYmIHBhaXIubmFtZS50cmltKCkubGVuZ3RoID4gMCAmJiAocGFpci5uYW1lRnJvbSA9PT0gJ2xhYmVsJyB8fCBwYWlyLm5hbWVGcm9tID09PSAnaW50ZXJuYWwnIHx8IHBhaXIubmFtZUZyb20gPT09ICdhbHQnKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2hlY2sgaWYgYW4gYWx0ZXJuYXRpdmUgdG9vbHRpcCBleGlzdHMgdGhhdCBjYW4gYmUgbWFkZSB2aXNpYmxlIHRocm91Z2ggbW91c2VvdmVyXG4gICAgICAgIGlmIChwYWlyICYmIHBhaXIubmFtZSAmJiBwYWlyLm5hbWUudHJpbSgpLmxlbmd0aCA+IDAgJiYgKHBhaXIubmFtZUZyb20gPT09ICd0ZXh0JyB8fCBwYWlyLm5hbWVGcm9tID09PSAndGl0bGUnKSlcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG5cbiAgICAgICAgLy8gY2hlY2sgaWYgYW55IHZpc2libGUgdGV4dCBmcm9tIHRoZSBjb250cm9sLiBcbiAgICAgICAgLy8gbm90ZSB0aGF0ICgxKSB0aGUgdGV4dCBkb2VzbuKAmXQgbmVlZCB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbnRyb2wgdG8gZm9ybSBhIHJlbGF0aW9uc2hpcFxuICAgICAgICAvLyAgKDIpIHRoZSB0ZXh0IGRvZXNuJ3QgbmVlZCB0byBmb2xsb3cgYWNjZXNzaWJsZSBuYW1lIHJlcXVpcmVtZW50IChlLmcuIG5hbWVGcm9tKVxuICAgICAgICBjb25zdCB0ZXh0ID0gQ29tbW9uVXRpbC5nZXRPblNjcmVlbklubmVyVGV4dChydWxlQ29udGV4dCk7XG4gICAgICAgIGlmICh0ZXh0ICYmIHRleHQubGVuZ3RoICE9PSAwKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgXG4gICAgICAgIC8vIGNoZWNrIGlmIGFueSBkZXNjZW5kYW50IHdpdGggYW4gYWx0ZXJuYXRpdmUgdG9vbHRpcCB0aGF0IGNhbiBiZSBtYWRlIHZpc2libGUgdGhyb3VnaCBtb3VzZW92ZXJcbiAgICAgICAgLy8gb25seSBjb25zaWRlciBpbWcgYW5kIHN2ZywgYW5kIG90aGVyIHRleHQgY29udGVudCBvZiB0aGUgZGVzY2VuZGFudCBpcyBjb3ZlcmVkIGluIHRoZSBpc0lubmVyVGV4dCBhYm92ZSAgXG4gICAgICAgIGxldCBkZXNjZW5kYW50cyA9IEFyaWFVdGlsLmdldEFsbERlc2NlbmRhbnRzV2l0aFJvbGVzKHJ1bGVDb250ZXh0LCBbXCJpbWdcIiwgXCJncmFwaGljcy1kb2N1bWVudFwiLCBcImdyYXBoaWNzLW9iamVjdFwiLCBcImdyYXBoaWNzLXN5bWJvbFwiXSwgZmFsc2UsIHRydWUpO1xuICAgICAgICBpZiAoZGVzY2VuZGFudHMgJiYgZGVzY2VuZGFudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yIChsZXQgZD0wOyBkIDwgZGVzY2VuZGFudHMubGVuZ3RoOyBkKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShkZXNjZW5kYW50c1tkXSwgXCJ0aXRsZVwiKSB8fCBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KGRlc2NlbmRhbnRzW2RdLCBcImFsdFwiKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgICAgIH0gXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIGNoZWNrIGlmIHRoZXJlIGlzIGEgdmlzaWJsZSBsYWJlbCBwb2ludGVkIHRvIGJ5IHRoZSBhcmlhLWxhYmVsbGVkYnkgYXR0cmlidXRlLlxuICAgICAgICBpZiAoQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJhcmlhLWxhYmVsbGVkYnlcIikpIHtcbiAgICAgICAgICAgIGxldCB0aGVMYWJlbCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKTtcbiAgICAgICAgICAgIGxldCBsYWJlbFZhbHVlcyA9IHRoZUxhYmVsLnNwbGl0KC9cXHMrLyk7XG4gICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGxhYmVsVmFsdWVzLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICAgICAgbGV0IGVsZW1lbnRCeUlkID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQocnVsZUNvbnRleHQsIGxhYmVsVmFsdWVzW2pdKTtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudEJ5SWQgJiYgIURPTVV0aWwuc2FtZU5vZGUoZWxlbWVudEJ5SWQsIHJ1bGVDb250ZXh0KSAmJiBWaXNVdGlsLmlzTm9kZVZpc2libGUoZWxlbWVudEJ5SWQpICYmIENvbW1vblV0aWwuaGFzSW5uZXJDb250ZW50SGlkZGVuKGVsZW1lbnRCeUlkKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpOyBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoKG5vZGVOYW1lID09PSBcIm9wdGdyb3VwXCIgfHwgbm9kZU5hbWUgPT0gXCJvcHRpb25cIikgJiYgKHBhaXIgJiYgcGFpci5uYW1lICYmIHBhaXIubmFtZS50cmltKCkubGVuZ3RoID4gMCAmJiAocGFpci5uYW1lRnJvbSA9PT0gJ2xhYmVsJyB8fCBwYWlyLm5hbWVGcm9tID09PSAnY29udGVudCcpKSlcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG5cbiAgICAgICAgLy8gRGV0ZXJtaW5lIGlmIHRoaXMgaXMgcmVmZXJlbmNlZCBieSBhIGNvbWJvYm94LiBJZiBzbywgdGhlIGxhYmVsIGJlbG9uZ3MgdG8gdGhlIGNvbWJvYm94XG4gICAgICAgIGxldCBpZCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImlkXCIpO1xuICAgICAgICBpZiAoaWQgJiYgaWQudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5vd25lckRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYCpbYXJpYS1jb250cm9scz0nJHtpZH0nXVtyb2xlPSdjb21ib2JveCddYCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNoZWNrIGlmIGEgcGxhY2Vob2xkZXIgZXhpc3RzIGV2ZW4gdGhvdWdoIGEgcGxhY2Vob2xkZXIgdGV4dCBpcyBub3Qgc3VmZmljaWVudCBhcyBhIHZpc2libGUgdGV4dFxuICAgICAgICBpZiAoQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJwbGFjZWhvbGRlclwiKSlcbiAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX3BsYWNlaG9sZGVyX29ubHlcIik7XG5cbiAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfbm9fbGFiZWxcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGNvbnN0IGlucHV0X29uY2hhbmdlX3JldmlldzogUnVsZSA9IHtcbiAgICBpZDogXCJpbnB1dF9vbmNoYW5nZV9yZXZpZXdcIixcbiAgICBjb250ZXh0OiBcImRvbTppbnB1dFtvbmNoYW5nZV0sIGRvbTp0ZXh0YXJlYVtvbmNoYW5nZV0sIGRvbTpzZWxlY3Rbb25jaGFuZ2VdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfSW5wdXRfSGFzT25jaGFuZ2VcIjoge1xuICAgICAgICAgICAgLy8gXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwicG90ZW50aWFsX3dhcm5pbmdcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICAvLyBcInBhc3NcIjogXCJpbnB1dF9vbmNoYW5nZV9yZXZpZXcuaHRtbFwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfd2FybmluZ1wiOiBcImlucHV0X29uY2hhbmdlX3Jldmlldy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiaW5wdXRfb25jaGFuZ2VfcmV2aWV3Lmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJVc2VycyBtdXN0IGJlIGFkdmlzZWQgaWYsIGR1ZSB0byBhIGNoYW5nZSBvZiBlbGVtZW50IHZhbHVlLCBhIGZvcm0gYXV0b21hdGljYWxseSBzdWJtaXRzLCBhIG5ldyB3aW5kb3cgb3BlbnMsIG9yIGEgY2hhbmdlIGluIGZvY3VzIG9jY3Vyc1wiLFxuICAgICAgICAgICAgLy8gXCJwYXNzXCI6IFwiVGhlIHVzZXIgaXMgYWR2aXNlZCBvZiB0aGUgYXV0b21hdGljIGZvcm0gc3VibWlzc2lvbiwgbmV3IHdpbmRvdyBvcGVuaW5nLCBvciBmb2N1cyBjaGFuZ2VcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX3dhcm5pbmdcIjogXCJDb25maXJtIHRoYXQgdGhlIHVzZXIgaXMgYWR2aXNlZCBpZiwgZHVlIHRvIGEgY2hhbmdlIG9mIGVsZW1lbnQgdmFsdWUsIGEgZm9ybSBhdXRvbWF0aWNhbGx5IHN1Ym1pdHMsIGEgbmV3IHdpbmRvdyBvcGVucywgb3IgYSBjaGFuZ2UgaW4gZm9jdXMgb2NjdXJzXCIgICAgXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMy4yLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAocnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSBcImlucHV0XCIgJiYgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidHlwZVwiKSkge1xuICAgICAgICAgICAgbGV0IHR5cGUgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gXCJoaWRkZW5cIiB8fCB0eXBlID09PSBcInN1Ym1pdFwiIHx8IHR5cGUgPT09IFwiaW1hZ2VcIiB8fCB0eXBlID09PSBcImJ1dHRvblwiIHx8IHR5cGUgPT09IFwicmVzZXRcIilcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX3dhcm5pbmdcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5cbmV4cG9ydCBjb25zdCBpbnB1dF9wbGFjZWhvbGRlcl9sYWJlbF92aXNpYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcImlucHV0X3BsYWNlaG9sZGVyX2xhYmVsX3Zpc2libGVcIixcbiAgICBjb250ZXh0OiBcImRvbTppbnB1dFtwbGFjZWhvbGRlcl0sIGRvbTp0ZXh0YXJlYVtwbGFjZWhvbGRlcl1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIkhBQUNfSW5wdXRfUGxhY2Vob2xkZXJcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMlwiOiBcIlBvdGVudGlhbF8yXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJpbnB1dF9wbGFjZWhvbGRlcl9sYWJlbF92aXNpYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJpbnB1dF9wbGFjZWhvbGRlcl9sYWJlbF92aXNpYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzJcIjogXCJpbnB1dF9wbGFjZWhvbGRlcl9sYWJlbF92aXNpYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJpbnB1dF9wbGFjZWhvbGRlcl9sYWJlbF92aXNpYmxlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJIVE1MNSBwbGFjZWhvbGRlciBpcyB0aGUgb25seSB2aXNpYmxlIGxhYmVsXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8yXCI6IFwiQWRkaXRpb25hbCB2aXNpYmxlIGxhYmVsIHJlZmVyZW5jZWQgYnkgJ2FyaWEtbGFiZWxsZWRieScgaXMgbm90IHZhbGlkXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiSFRNTDUgJ3BsYWNlaG9sZGVyJyBhdHRyaWJ1dGUgbXVzdCBub3QgYmUgdXNlZCBhcyBhIHZpc2libGUgbGFiZWwgcmVwbGFjZW1lbnRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBtZXJnZSB0aGUgcnVsZSBpbnRvIGlucHV0X2xhYmVsX3Zpc2libGVcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjMuMy4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICAqL1xuICAgIHJ1bGVzZXRzOiBbXSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0eXBlXCIpKSB7XG4gICAgICAgICAgICBsZXQgdHlwZSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInR5cGVcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIGlmICh0eXBlID09IFwiaGlkZGVuXCIgfHwgdHlwZSA9PSBcImJ1dHRvblwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImhpZGRlblwiKSkge1xuICAgICAgICAgICAgbGV0IGhpZGRlbiA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImhpZGRlblwiKTtcbiAgICAgICAgICAgIGlmIChoaWRkZW4gPT0gXCJcIiB8fCBoaWRkZW4udG9Mb3dlckNhc2UoKSA9PSBcImhpZGRlblwiKSB7IC8vIHdoZW4gaGlkZGVuIGlzIGVtcHR5IGluIHRoZSBlbGVtZW50LCBcIlwiIGlzIHJldHVybmVkLCBzYW1lIGFzIGl0IGhhcyBhIHZhbHVlIG9mIFwiXCIuXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImFyaWEtbGFiZWxcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpICYmIHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImlkXCIpKSB7XG4gICAgICAgICAgICBsZXQgaWQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJpZFwiKS50cmltKCk7XG4gICAgICAgICAgICBsZXQgcmVmSWRzID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpLnRyaW0oKS5zcGxpdCgvXFxzKy8pOyAvLyBzZXBhcmF0ZWQgYnkgb25lIG9yIG1vcmUgd2hpdGUgc3BhY2VzXG4gICAgICAgICAgICBpZiAoIXJlZklkcy5pbmNsdWRlcyhpZCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzJcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IEZyYWdtZW50VXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9mcmFnbWVudFwiO1xuaW1wb3J0IHsgRE9NVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgbGFiZWxfY29udGVudF9leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwibGFiZWxfY29udGVudF9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTpsYWJlbFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiVmFsZXJpZV9MYWJlbF9IYXNDb250ZW50XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc19SZWd1bGFyXCI6IFwiUGFzc19SZWd1bGFyXCIsXG4gICAgICAgICAgICBcIlBhc3NfQXJpYUxhYmVsXCI6IFwiUGFzc19BcmlhTGFiZWxcIixcbiAgICAgICAgICAgIFwiUGFzc19MYWJlbGxlZEJ5XCI6IFwiUGFzc19MYWJlbGxlZEJ5XCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfUmVndWxhclwiOiBcImxhYmVsX2NvbnRlbnRfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc19BcmlhTGFiZWxcIjogXCJsYWJlbF9jb250ZW50X2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIlBhc3NfTGFiZWxsZWRCeVwiOiBcImxhYmVsX2NvbnRlbnRfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwibGFiZWxfY29udGVudF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImxhYmVsX2NvbnRlbnRfZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc19SZWd1bGFyXCI6IFwiPGxhYmVsPiBlbGVtZW50IGhhcyBhY2Nlc3NpYmxlIG5hbWUgd2l0aCBpbm5lciBjb250ZW50XCIsXG4gICAgICAgICAgICBcIlBhc3NfQXJpYUxhYmVsXCI6IFwiPGxhYmVsPiBlbGVtZW50IGhhcyBhY2Nlc3NpYmxlIG5hbWUgdmlhICdhcmlhLWxhYmVsJ1wiLFxuICAgICAgICAgICAgXCJQYXNzX0xhYmVsbGVkQnlcIjogXCI8bGFiZWw+IGVsZW1lbnQgaGFzIGFjY2Vzc2libGUgbmFtZSB2aWEgJ2FyaWEtbGFiZWxsZWRieSdcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiVGhlIDxsYWJlbD4gZWxlbWVudCBkb2VzIG5vdCBoYXZlIGRlc2NyaXB0aXZlIHRleHQgdGhhdCBpZGVudGlmaWVzIHRoZSBleHBlY3RlZCBpbnB1dFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkEgPGxhYmVsPiBlbGVtZW50IG11c3QgaGF2ZSBub24tZW1wdHkgZGVzY3JpcHRpdmUgdGV4dCB0aGF0IGlkZW50aWZpZXMgdGhlIHB1cnBvc2Ugb2YgdGhlIGludGVyYWN0aXZlIGNvbXBvbmVudFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgaWYgKENvbW1vblV0aWwuaGFzSW5uZXJDb250ZW50SGlkZGVuKHJ1bGVDb250ZXh0KSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc19SZWd1bGFyXCIpO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIikgfHwgXCJcIikudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfQXJpYUxhYmVsXCIpO1xuICAgICAgICB9IGVsc2UgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKSkge1xuICAgICAgICAgICAgbGV0IGxhYmVsRWxlbSA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKHJ1bGVDb250ZXh0LCBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWxsZWRieScpKTtcbiAgICAgICAgICAgIGlmIChsYWJlbEVsZW0gJiYgIURPTVV0aWwuc2FtZU5vZGUobGFiZWxFbGVtLCBydWxlQ29udGV4dCkgJiYgQ29tbW9uVXRpbC5oYXNJbm5lckNvbnRlbnQobGFiZWxFbGVtKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfTGFiZWxsZWRCeVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IEZyYWdtZW50VXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9mcmFnbWVudFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcbmltcG9ydCB7IENTU1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9DU1NVdGlsXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuXG5leHBvcnQgY29uc3QgbGFiZWxfbmFtZV92aXNpYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcImxhYmVsX25hbWVfdmlzaWJsZVwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpidXR0b24sYXJpYTpjaGVja2JveCxhcmlhOmdyaWRjZWxsLGFyaWE6bGluayxhcmlhOm1lbnVpdGVtLGFyaWE6bWVudWl0ZW1jaGVja2JveCxhcmlhOm1lbnVpdGVtcmFkaW8sYXJpYTpvcHRpb24sYXJpYTpyYWRpbyxhcmlhOnN3aXRjaCxhcmlhOnRhYixhcmlhOnRyZWVpdGVtLGRvbTppbnB1dCxkb206dGV4dGFyZWEsZG9tOnNlbGVjdCxkb206b3V0cHV0LGRvbTptZXRlclwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIxX0xhYmVsX0FjY2Vzc2libGVcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJsYWJlbF9uYW1lX3Zpc2libGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJsYWJlbF9uYW1lX3Zpc2libGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImxhYmVsX25hbWVfdmlzaWJsZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIkFjY2Vzc2libGUgbmFtZSBtYXRjaGVzIG9yIGNvbnRhaW5zIHRoZSB2aXNpYmxlIGxhYmVsIHRleHRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiQWNjZXNzaWJsZSBuYW1lIGRvZXMgbm90IG1hdGNoIG9yIGNvbnRhaW4gdGhlIHZpc2libGUgbGFiZWwgdGV4dFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkFjY2Vzc2libGUgbmFtZSBtdXN0IG1hdGNoIG9yIGNvbnRhaW4gdGhlIHZpc2libGUgbGFiZWwgdGV4dFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuNS4zXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICAvLyBUT0RPOiBBQ1Q6IFJldmlldyBodHRwczovL2dpdGh1Yi5jb20vYWN0LXJ1bGVzL2FjdC1ydWxlcy5naXRodWIuaW8vaXNzdWVzLzE2MThcbiAgICAvLyBodHRwczovL3d3dy53My5vcmcvV0FJL1dDQUcyMS9UZWNobmlxdWVzL2FyaWEvQVJJQTI0XG4gICAgYWN0OiBcIjJlZThiOFwiLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShydWxlQ29udGV4dCkgfHxcbiAgICAgICAgICAgIENvbW1vblV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHBhc3MgaWYgdGhlIHZpc2libGUgdGV4dCB1c2VzIE1hdGVyaWFsIEljb24gZm9udFxuICAgICAgICBpZiAoQ1NTVXRpbC5pc01hdGVyaWFsSWNvbkZvbnQocnVsZUNvbnRleHQpKSBcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcblxuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcblxuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIGxldCBpc0lucHV0QnV0dG9uID0gZmFsc2U7XG4gICAgICAgIC8vbGV0IGJ1dHRvblR5cGVzID0gW1wiYnV0dG9uXCIsIFwicmVzZXRcIiwgXCJzdWJtaXRcIl07IC8vXCJpbWFnZVwiXG4gICAgICAgIGxldCBpbnB1dFR5cGUgPSBudWxsO1xuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwiaW5wdXRcIiAmJiBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0eXBlXCIpKSB7XG4gICAgICAgICAgICBpbnB1dFR5cGUgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBpZiAoQ29tbW9uVXRpbC5mb3JtX2J1dHRvbl90eXBlcy5pbmRleE9mKGlucHV0VHlwZSkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgaXNJbnB1dEJ1dHRvbiA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdGhlTGFiZWxCeSA9IEFyaWFVdGlsLmdldEFyaWFBdHRyaWJ1dGUocnVsZUNvbnRleHQsIFwiYXJpYS1sYWJlbGxlZGJ5XCIpO1xuICAgICAgICBpZiAodGhlTGFiZWxCeSAmJiAhQ29tbW9uVXRpbC5pc0lkUmVmZXJUb1NlbGYocnVsZUNvbnRleHQsIHRoZUxhYmVsQnkpICYmICFpc0lucHV0QnV0dG9uKSB7XG4gICAgICAgICAgICAvLyBza2lwIHRoZSBjaGVja3MgaWYgaXQgaGFzIGFuIGFyaWEtbGFiZWxsZWRieSBzaW5jZSBpdCB0YWtlcyBwcmVjZWRlbmNlLlxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IHRoZUxhYmVsID0gbnVsbDtcbiAgICAgICAgICAgIGlmICh0aGVMYWJlbEJ5ICYmICFDb21tb25VdGlsLmlzSWRSZWZlclRvU2VsZihydWxlQ29udGV4dCwgdGhlTGFiZWxCeSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgbGFiZWxWYWx1ZXMgPSB0aGVMYWJlbEJ5LnNwbGl0KC9cXHMrLyk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBsYWJlbFZhbHVlcy5sZW5ndGg7ICsraikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZWxlbWVudEJ5SWQgPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChydWxlQ29udGV4dCwgbGFiZWxWYWx1ZXNbal0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudEJ5SWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoZUxhYmVsID0gQ29tbW9uVXRpbC5nZXRJbm5lclRleHQoZWxlbWVudEJ5SWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoZUxhYmVsID0gQXJpYVV0aWwuZ2V0QXJpYUF0dHJpYnV0ZShydWxlQ29udGV4dCwgXCJhcmlhLWxhYmVsXCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXRoZUxhYmVsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGxldCB0ZXh0ID0gbnVsbDtcblxuICAgICAgICAgICAgaWYgKGlzSW5wdXRCdXR0b24pIHtcbiAgICAgICAgICAgICAgICAvKiBOb3RlOiBEaXNhYmxlIHRoZSBhbHQgY2hlY2sgaW4gaW1hZ2VzIHVudGlsIHdlIGdldCBjb25maXJtYXRpb25cbiAgICAgICAgICAgICAgICBpZiAoaW5wdXRUeXBlPT09XCJpbWFnZVwiICYmIHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImFsdFwiKSl7XG4gICAgICAgICAgICAgICAgICAgIC8vIHVzZSAnYWx0JyBhdHRyaWJ1dGUgYXMgdmlzaWJsZSB0ZXh0XG4gICAgICAgICAgICAgICAgICAgIHRleHQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhbHRcIik7XG4gICAgICAgICAgICAgICAgfWVsc2UgXG4gICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidmFsdWVcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdXNlICd2YWx1ZScgYXR0cmlidXRlIGFzIHZpc2libGUgdGV4dFxuICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidmFsdWVcIik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdXNlIGRlZmF1bHQgdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0VHlwZSA9PT0gXCJzdWJtaXRcIi8qfHxpbnB1dFR5cGU9PT1cImltYWdlXCIqLykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IFwic3VibWl0XCI7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5wdXRUeXBlID09PSBcInJlc2V0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSBcInJlc2V0XCI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cblxuICAgICAgICAgICAgaWYgKCF0ZXh0KSB7XG4gICAgICAgICAgICAgICAgLy8gbG9vayBmb3IgYSA8bGFiZWw+IGVsZW1lbnRcbiAgICAgICAgICAgICAgICBsZXQgbGFiZWxFbGVtID0gQ29tbW9uVXRpbC5nZXRMYWJlbEZvckVsZW1lbnRIaWRkZW4ocnVsZUNvbnRleHQsIHRydWUpO1xuICAgICAgICAgICAgICAgIGlmICghbGFiZWxFbGVtKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwYXJlbnROb2RlID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImxhYmVsXCIgLyomJiBSUFRVdGlsLmlzRmlyc3RGb3JtRWxlbWVudChwYXJlbnROb2RlLCBydWxlQ29udGV4dCkqLykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBhcmVudENsb25lID0gcGFyZW50Tm9kZS5jbG9uZU5vZGUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBleGNsdWRlIGFsbCBmb3JtIGVsZW1lbnRzIGZyb20gdGhlIGxhYmVsIHNpbmNlIHRoZXkgbWlnaHQgYWxzbyBoYXZlIGlubmVyIGNvbnRlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsRWxlbSA9IENvbW1vblV0aWwucmVtb3ZlQWxsRm9ybUVsZW1lbnRzRnJvbUxhYmVsKHBhcmVudENsb25lKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCBlbGVtZW50ID0gbGFiZWxFbGVtID8gbGFiZWxFbGVtIDogcnVsZUNvbnRleHQ7XG5cbiAgICAgICAgICAgICAgICBsZXQgZWxlbWVudHNUb1NraXBDb250ZW50Q2hlY2sgPSBbXCJtZXRlclwiLCBcIm91dHB1dFwiLCBcInByb2dyZXNzXCIsIFwic2VsZWN0XCIsIFwidGV4dGFyZWFcIl07XG4gICAgICAgICAgICAgICAgaWYgKCFsYWJlbEVsZW0gJiYgZWxlbWVudHNUb1NraXBDb250ZW50Q2hlY2suaW5kZXhPZihub2RlTmFtZSkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHRleHQgPSBcIlwiOyAvLyBza2lwIGNvbnRlbnQgY2hlY2sgZm9yIHNvbWUgZWxlbWVudHNcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIHZpc2libGUgdGV4dCBvbmx5XG4gICAgICAgICAgICAgICAgICAgIHRleHQgPSBDb21tb25VdGlsLmdldE9uU2NyZWVuSW5uZXJUZXh0KGVsZW1lbnQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8qIE5vdGU6IERpc2FibGUgdGhpcyBhbHQgY2hlY2sgaW4gaW1hZ2VzIGZvciBub3cgdW50aWwgd2UgZ2V0IGNvbmZpcm1hdGlvblxuICAgICAgICAgICAgICAgIC8vIExvb2sgZm9yIHRoZSBhbHQgYXR0cmlidXRlIG9mIGFuIGltYWdlIHdoaWNoIGlzIGNvbnNpZGVyZWQgdmlzaWJsZSB0ZXh0LlxuICAgICAgICAgICAgICAgIGxldCBoYXNJbWdBbHQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5maXJzdENoaWxkICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG53ID0gUlBUVXRpbC5uZXcgTm9kZVdhbGtlcihlbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCFoYXNJbWdBbHQgJiYgbncubmV4dE5vZGUoKSAmJiBudy5ub2RlICE9IGVsZW1lbnQgJiYgbncubm9kZSAhPSBlbGVtZW50Lm5leHRTaWJsaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBoYXNJbWdBbHQgPSAobncubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09IFwiaW1nXCIgJiYgUlBUVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShudy5ub2RlLCBcImFsdFwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzSW1nQWx0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHRleHQgPyB0ZXh0ICsgbncubm9kZS5nZXRBdHRyaWJ1dGUoXCJhbHRcIikgOiBudy5ub2RlLmdldEF0dHJpYnV0ZShcImFsdFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgbm9uYWxwaGFudW1lcmljID0gL1teYS16QS1aMC05XS9nO1xuXG4gICAgICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKG5vbmFscGhhbnVtZXJpYywgXCIgXCIpOyAvLyBvbmx5IGNvbnNpZGVyIGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzXG4gICAgICAgICAgICBsZXQgbm9ybWFsaXplZFRleHQgPSBDb21tb25VdGlsLm5vcm1hbGl6ZVNwYWNpbmcodGV4dCkudG9Mb3dlckNhc2UoKTsgLy8gTGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSBhbmQgZGlmZmVyZW5jZSBpbiBjYXNlIHNlbnNpdGl2aXR5IHNob3VsZCBiZSBpZ25vcmVkLlxuXG4gICAgICAgICAgICB0aGVMYWJlbCA9IHRoZUxhYmVsLnJlcGxhY2Uobm9uYWxwaGFudW1lcmljLCBcIiBcIik7IC8vIG9ubHkgY29uc2lkZXIgYWxwaGFudW1lcmljIGNoYXJhY3RlcnNcbiAgICAgICAgICAgIGxldCBub3JtYWxpemVkTGFiZWwgPSBDb21tb25VdGlsLm5vcm1hbGl6ZVNwYWNpbmcodGhlTGFiZWwpLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgICAgIGlmIChub3JtYWxpemVkVGV4dC5sZW5ndGggPiAxKSB7IC8vIHNraXAgbm9uLXRleHQgY29udGVudC4gZS5nLiwgPGJ1dHRvbiBhcmlhLWxhYmVsPVwiY2xvc2VcIj5YPC9idXR0b24+XG4gICAgICAgICAgICAgICAgbGV0IGxvY2F0aW9uID0gbm9ybWFsaXplZExhYmVsLmluZGV4T2Yobm9ybWFsaXplZFRleHQpO1xuXG4gICAgICAgICAgICAgICAgLy8gQXZvaWQgbWF0Y2hpbmcgcGFydGlhbCB3b3Jkcy5lLmcuLCB0ZXh0IFwibmFtZVwiIHNob3VsZCBub3QgbWF0Y2ggJ3N1cm5hbWUnIG9yICduYW1lcydcbiAgICAgICAgICAgICAgICBpZiAobG9jYXRpb24gPj0gMCAmJiBub3JtYWxpemVkTGFiZWwubGVuZ3RoID4gbm9ybWFsaXplZFRleHQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBsZXR0ZXJzID0gL15bMC05YS16QS1aXSskLztcbiAgICAgICAgICAgICAgICAgICAgaWYgKChsb2NhdGlvbiArIG5vcm1hbGl6ZWRUZXh0Lmxlbmd0aCkgPCBub3JtYWxpemVkTGFiZWwubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBlbmRpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0aGVDaGFyID0gbm9ybWFsaXplZExhYmVsLmNoYXJBdChsb2NhdGlvbiArIG5vcm1hbGl6ZWRUZXh0Lmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhlQ2hhci5tYXRjaChsZXR0ZXJzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXNzZWQgJiYgbG9jYXRpb24gPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBiZWdpbm5pbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0aGVDaGFyID0gbm9ybWFsaXplZExhYmVsLmNoYXJBdChsb2NhdGlvbiAtIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoZUNoYXIubWF0Y2gobGV0dGVycykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobG9jYXRpb24gPT09IC0xKSB7IC8vIGNoZWNrIHRoYXQgdmlzaWJsZSB0ZXh0IGNvbnRlbnQgb2YgdGhlIHRhcmdldCBpcyBjb250YWluZWQgd2l0aGluIGl0cyBhY2Nlc3NpYmxlIG5hbWUuXG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEZyYWdtZW50VXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9mcmFnbWVudFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGxhYmVsX3JlZl92YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJsYWJlbF9yZWZfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbTpsYWJlbFtmb3JdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfTGFiZWxfUmVmVmFsaWRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcImZhaWxfaW52YWxpZFwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcImxhYmVsX3JlZl92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfaW52YWxpZFwiOiBcImxhYmVsX3JlZl92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwibGFiZWxfcmVmX3ZhbGlkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlRoZSAnZm9yJyBhdHRyaWJ1dGUgZm9yIGEgbGFiZWwgcmVmZXJlbmNlYSBhIHVuaXF1ZSBub24tZW1wdHkgJ2lkJyBhdHRyaWJ1dGUgb2YgYSB2YWxpZCBlbGVtZW50XCIsXG4gICAgICAgICAgICBcImZhaWxfaW52YWxpZFwiOiBcIlRoZSB2YWx1ZSBcXFwiezB9XFxcIiBvZiB0aGUgJ2ZvcicgYXR0cmlidXRlIGlzIG5vdCB0aGUgJ2lkJyBvZiBhIHZhbGlkIGVsZW1lbnRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgJ2ZvcicgYXR0cmlidXRlIGZvciBhIGxhYmVsIHNob3VsZCByZWZlcmVuY2UgYSBub24tZW1wdHksIHVuaXF1ZSAnaWQnIGF0dHJpYnV0ZSBvZiBhIHZhbGlkIGVsZW1lbnRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBpZCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImZvclwiKTtcbiAgICAgICAgbGV0IHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICBsZXQgdGFyZ2V0ID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQocnVsZUNvbnRleHQsIGlkKTtcbiAgICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICAgICAgLy8gaWdub3JlIGlmIGJvdGggbGFiZWwgYW5kIGNvbnRyb2wgYXJlIGludmlzaWJsZVxuICAgICAgICAgICAgaWYgKCFWaXNVdGlsLmlzTm9kZVZpc2libGUodGFyZ2V0KSAmJiAhVmlzVXRpbC5pc05vZGVWaXNpYmxlKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIC8vIGhhbmRsZXMgbnVsbCBhbmQgdW5kZWZpbmVkXG4gICAgICAgICAgICBpZiAoIXRhcmdldC5oYXNBdHRyaWJ1dGUoXCJyb2xlXCIpKSB7XG4gICAgICAgICAgICAgICAgLy8gRmFpbCBpZiB3ZSdyZSBwb2ludGluZyBhdCBzb21ldGhpbmcgdGhhdCBpcyBsYWJlbGxlZCBieSBhbm90aGVyIG1lY2hhbmlzbVxuICAgICAgICAgICAgICAgIGxldCBub2RlTmFtZSA9IHRhcmdldC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9IG5vZGVOYW1lID09IFwiaW5wdXRcIiB8fCBub2RlTmFtZSA9PSBcInNlbGVjdFwiIHx8IG5vZGVOYW1lID09IFwidGV4dGFyZWFcIlxuICAgICAgICAgICAgICAgICAgICB8fCBub2RlTmFtZSA9PSBcImJ1dHRvblwiIHx8IG5vZGVOYW1lID09IFwiZGF0YWxpc3RcIlxuICAgICAgICAgICAgICAgICAgICB8fCBub2RlTmFtZSA9PSBcIm9wdGdyb3VwXCIgfHwgbm9kZU5hbWUgPT0gXCJvcHRpb25cIlxuICAgICAgICAgICAgICAgICAgICB8fCBub2RlTmFtZSA9PSBcImtleWdlblwiIHx8IG5vZGVOYW1lID09IFwib3V0cHV0XCJcbiAgICAgICAgICAgICAgICAgICAgfHwgbm9kZU5hbWUgPT0gXCJwcm9ncmVzc1wiIHx8IG5vZGVOYW1lID09IFwibWV0ZXJcIlxuICAgICAgICAgICAgICAgICAgICB8fCBub2RlTmFtZSA9PSBcImZpZWxkc2V0XCIgfHwgbm9kZU5hbWUgPT0gXCJsZWdlbmRcIjtcbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT0gXCJpbnB1dFwiICYmIHRhcmdldC5oYXNBdHRyaWJ1dGUoXCJ0eXBlXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0eXBlID0gdGFyZ2V0LmdldEF0dHJpYnV0ZShcInR5cGVcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gdHlwZSA9PSBcInRleHRcIiB8fCB0eXBlID09IFwicGFzc3dvcmRcIiB8fCB0eXBlID09IFwiZmlsZVwiIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlID09IFwiY2hlY2tib3hcIiB8fCB0eXBlID09IFwicmFkaW9cIiB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9PSBcImhpZGRlblwiIHx8IHR5cGUgPT0gXCJzZWFyY2hcIiB8fCB0eXBlID09IFwidGVsXCIgfHwgdHlwZSA9PSBcInVybFwiIHx8IHR5cGUgPT0gXCJlbWFpbFwiIHx8ICAvL0hUTUwgNVxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9PSBcImRhdGVcIiB8fCB0eXBlID09IFwibnVtYmVyXCIgfHwgdHlwZSA9PSBcInJhbmdlXCIgfHwgdHlwZSA9PSBcImltYWdlXCIgfHwgLy9IVE1MIDVcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPT0gXCJ0aW1lXCIgfHwgdHlwZSA9PSBcImNvbG9yXCIgfHwgIC8vIEhUTUwgNVxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9PSBcImRhdGV0aW1lLWxvY2FsXCIgfHwgdHlwZSA9PSBcIm1vbnRoXCIgfHwgdHlwZSA9PSBcIndlZWtcIjsgLy9IVE1MNS4xXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBBZGQgb25lIG1vcmUgY2hlY2sgdG8gbWFrZSBzdXJlIHRoZSB0YXJnZXQgZWxlbWVudCBpcyBOT1QgaGlkZGVuLCBpbiB0aGUgY2FzZSB0aGUgdGFyZ2V0IGlzIGhpZGRlblxuICAgICAgICAgICAgLy8gZmxhZyBhIHZpb2xhdGlvbiByZWdhcmRsZXNzIG9mIHdoYXQgdGhlIENoZWNrIEhpZGRlbiBDb250ZW50IHNldHRpbmcgaXMuXG4gICAgICAgICAgICBpZiAocGFzc2VkICYmICFWaXNVdGlsLmlzTm9kZVZpc2libGUodGFyZ2V0KSkge1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCByZXRUb2tlbjogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldFRva2VuLnB1c2goaWQpO1xuICAgICAgICB9XG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KHBhc3NlZCwgW3J1bGVDb250ZXh0XSwgJycsICcnLCBwYXNzZWQgPT0gdHJ1ZSA/IFtdIDogW3JldFRva2VuXSk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2ludmFsaWRcIiwgcmV0VG9rZW4pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuXG5leHBvcnQgY29uc3QgbGlzdF9jaGlsZHJlbl92YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJsaXN0X2NoaWxkcmVuX3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmdyb3VwXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJIQUFDX0xpc3RfR3JvdXBfTGlzdEl0ZW1cIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJsaXN0X2NoaWxkcmVuX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwibGlzdF9jaGlsZHJlbl92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwibGlzdF9jaGlsZHJlbl92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkxpc3QgY29tcG9uZW50IHdpdGggXFxcImdyb3VwXFxcIiByb2xlIGhhcyBjaGlsZHJlbiB0aGF0IGFyZSBub3QgPGxpc3RpdGVtPiBlbGVtZW50c1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkxpc3QgY29tcG9uZW50IHdpdGggXFxcImdyb3VwXFxcIiByb2xlIG11c3QgbGltaXQgY2hpbGRyZW4gdG8gPGxpc3RpdGVtPiBlbGVtZW50c1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHBhcmVudCA9IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKCFBcmlhVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MocGFyZW50LCBcImxpc3RcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGxldCBjaGlsZHJlbiA9IHJ1bGVDb250ZXh0LmNoaWxkcmVuO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgcGFzc2VkICYmIGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcGFzc2VkID0gQXJpYVV0aWwuaGFzUm9sZUluU2VtYW50aWNzKGNoaWxkcmVuW2ldLCBcImxpc3RpdGVtXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgbGlzdF9tYXJrdXBfcmV2aWV3OiBSdWxlID0ge1xuICAgIGlkOiBcImxpc3RfbWFya3VwX3Jldmlld1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9MaXN0X1VzZU1hcmt1cFwiOiB7XG4gICAgICAgICAgICAvLyBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgLy8gXCJwYXNzXCI6IFwibGlzdF9tYXJrdXBfcmV2aWV3Lmh0bWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX2xpc3RcIjogXCJsaXN0X21hcmt1cF9yZXZpZXcuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImxpc3RfbWFya3VwX3Jldmlldy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICAvLyBcInBhc3NcIjogXCJQcm9wZXIgSFRNTCBlbGVtZW50cyBhcmUgdXNlZCB0byBjcmVhdGUgYSBsaXN0XCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9saXN0XCI6IFwiVmVyaWZ5IHRoaXMgaXMgYSBsaXN0IGFuZCBpZiBzbywgbW9kaWZ5IHRvIHVzZSBwcm9wZXIgSFRNTCBlbGVtZW50cyBmb3IgdGhlIGxpc3RcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJQcm9wZXIgSFRNTCBlbGVtZW50cyBzaG91bGQgYmUgdXNlZCB0byBjcmVhdGUgYSBsaXN0XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG5cbiAgICAgICAgLy8gRXh0cmFjdCB0aGUgbm9kZU5hbWUgb2YgdGhlIGNvbnRleHQgbm9kZVxuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIG9yIGRpc2FibGVkXG4gICAgICAgIGlmIChDb21tb25VdGlsLmlzTm9kZURpc2FibGVkKHJ1bGVDb250ZXh0KSB8fCBWaXNVdGlsLmhpZGRlbkJ5RGVmYXVsdEVsZW1lbnRzLmluY2x1ZGVzKG5vZGVOYW1lKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIERvbid0IHRyaWdnZXIgaWYgd2UncmUgbm90IGluIHRoZSBib2R5IG9yIGlmIHdlJ3JlIGluIGEgc2NyaXB0XG4gICAgICAgIGlmIChDb21tb25VdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBbXCJib2R5XCJdKSA9PT0gbnVsbCkgXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICAvLyBpZ25vcmUgc2NyaXB0LCBsYWJlbCBhbmQgdGhlaXIgY2hpbGQgZWxlbWVudHNcbiAgICAgICAgaWYgKENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFtcInNjcmlwdFwiLCAnbGFiZWwnXSkgIT09IG51bGwpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICAvLyBpZ25vcmUgYWxsIHdpZGdldHMgYW5kIHRoZWlyIGNoaWxkcmVuLCBhbmQgY2VydGFpbiBzdHJ1Y3R1cmUgcm9sZXNcbiAgICAgICAgbGV0IHJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXNXaXRoVHlwZXMocnVsZUNvbnRleHQsIFtcIndpZGdldFwiXSk7XG4gICAgICAgIC8vIGFkZCBzb21lIHN0cnVjdHVyZSByb2xlc1xuICAgICAgICBDb21tb25VdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QoW1wiY2FwdGlvblwiLCBcImNvZGVcIiwgXCJjb2x1bW5oZWFkZXJcIiwgIFwiZmlndXJlXCIsIFwibGlzdFwiLCBcImxpc3RpdGVtXCIsIFwibWF0aFwiLCBcIm1ldGVyXCIsIFwiY29sdW1uaGVhZGVyXCIsIFwicm93aGVhZGVyXCJdLCByb2xlcyk7XG4gICAgICAgIGlmIChBcmlhVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlcyhydWxlQ29udGV4dCwgcm9sZXMpICE9PSBudWxsKSBcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuICAgICAgICBsZXQgd2Fsa05vZGUgPSBydWxlQ29udGV4dC5maXJzdENoaWxkIGFzIE5vZGU7XG4gICAgICAgIHdoaWxlIChwYXNzZWQgJiYgd2Fsa05vZGUpIHtcbiAgICAgICAgICAgIC8vIENvbXBseSB0byB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyB3aWxsIGJlIGRvbmUgYnkgZGVmYXVsdCBhcyB0aGlzIHJ1bGUgdHJpZ2dlcnMgb24gZWFjaCBlbGVtZW50XG4gICAgICAgICAgICAvLyBhbmQgZm9yIGVhY2ggZWxlbWVudCBpdCBvbmx5IGNoZWNrcyB0aGF0IHNpbmdsZSBlbGVtZW50cyB0ZXh0IG5vZGVzIGFuZCBub3RoaW5nIGVsc2UuIFNvIGFsbCBpbm5lciBlbGVtZW50cyB3aWxsIGJlXG4gICAgICAgICAgICAvLyBjb3ZlcmVkIG9uIHRoZWlyIG93bi4gQ3VycmVudGx5IGZvciB0aGlzIHJ1bGUgYnkgZGVmYXVsdCBDaGVjayBIaWRkZW4gQ29udGVudCB3aWxsIHdvcmssIGFzIHdlIGFyZSBkb2luZ1xuICAgICAgICAgICAgLy8gYSBub2RlIHdhbGsgb25seSBvbiBzaWJsaW5ncyBzbyBpdCB3b3VsZCBub3QgZ2V0IHRleHQgbm9kZXMgZnJvbSBvdGhlciBzaWJsaW5ncyBhdCBhbGwuXG4gICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSBpbiB0aGUgZnV0dXJlIHNvbWV0aGluZyBjaGFuZ2VzLCBqdXN0IG5lZWQgdG8gYWRkICYmICFSUFRVdGlsLnNob3VsZE5vZGVCZVNraXBwZWRIaWRkZW4od2Fsa05vZGUpIHRvIHRoZSBiZWxvd1xuICAgICAgICAgICAgLy8gaWYuXG4gICAgICAgICAgICBpZiAod2Fsa05vZGUubm9kZU5hbWUgPT0gXCIjdGV4dFwiKSB7XG4gICAgICAgICAgICAgICAgbGV0IHR4dFZhbCA9IHdhbGtOb2RlLm5vZGVWYWx1ZTtcbiAgICAgICAgICAgICAgICBsZXQgZmFpbHVyZSA9IC9eWyBcXHRcXHJcXG5dKlsoIF0qWzEtOV0qW1xcKlxcLSkuXVsgXFx0XVtBLVosYS16XSsvLnRlc3QodHh0VmFsKTtcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSAhZmFpbHVyZTtcbiAgICAgICAgICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGVyZSdzIHNvbWUgc29ydCBvZiBibG9jayBsZXZlbCBlbGVtZW50IGJlZm9yZSB0aGlzXG4gICAgICAgICAgICAgICAgICAgIC8vIEF2b2lkIGZhaWx1cmVzIGR1ZSB0byB0aGluZ3MgbGlrZSA8aT5Tb21lIHNlbnRlbmNlPC9pPi4gTmV3IHNlbnRlbmNlLlxuICAgICAgICAgICAgICAgICAgICBsZXQgbncgPSBuZXcgRE9NV2Fsa2VyKHdhbGtOb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCFwYXNzZWQgJiYgbncucHJldk5vZGUoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5vZGVOYW1lID0gbncubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFtcImJsb2NrcXVvdGVcIiwgXCJjZW50ZXJcIiwgXCJkaXJcIiwgXCJkaXZcIiwgXCJmb3JtXCIsIFwiaDFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImgyXCIsIFwiaDNcIiwgXCJoNFwiLCBcImg1XCIsIFwiaDZcIiwgXCJoclwiLCBcImJyXCIsIFwibWVudVwiLCBcInBcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInByZVwiXS5pbmNsdWRlcyhub2RlTmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlTmFtZSA9PSBcIiN0ZXh0XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdHh0ID0gbncubm9kZS5ub2RlVmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gdHh0Lmxlbmd0aCA+IDAgJiYgIVtcIiBcIiwgXCJcXHRcIiwgXCJcXG5cIl0uaW5jbHVkZXModHh0LmNoYXJBdCh0eHQubGVuZ3RoIC0gMSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2Fsa05vZGUgPSB3YWxrTm9kZS5uZXh0U2libGluZztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBudWxsO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfbGlzdFwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IGxpc3Rfc3RydWN0dXJlX3Byb3BlcjogUnVsZSA9IHtcbiAgICBpZDogXCJsaXN0X3N0cnVjdHVyZV9wcm9wZXJcIixcbiAgICBjb250ZXh0OiBcImRvbTpkbCwgZG9tOnVsLCBkb206b2wsIGRvbTpkaXIsIGRvbTptZW51LCBkb206bGksIGRvbTpkZCwgZG9tOmR0XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfTGlzdF9NaXN1c2VcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwibGlzdF9zdHJ1Y3R1cmVfcHJvcGVyLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJsaXN0X3N0cnVjdHVyZV9wcm9wZXIuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcImxpc3Rfc3RydWN0dXJlX3Byb3Blci5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiTGlzdCBlbGVtZW50IGlzIG1pc3Npbmcgb3IgaW1wcm9wZXJseSBzdHJ1Y3R1cmVkXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiTGlzdCBlbGVtZW50cyBzaG91bGQgb25seSBiZSB1c2VkIGZvciBsaXN0cyBvZiByZWxhdGVkIGl0ZW1zXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHBhc3NlZDtcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAvLyBHZXQgYWxsIHRoZSBjaGlsZHJlbnMgb2YgdGhlIHJ1bGVDb250ZXh0XG4gICAgICAgIGxldCBjaGlsZHJlbiA9IHJ1bGVDb250ZXh0LmNoaWxkcmVuXG5cbiAgICAgICAgaWYgKG5vZGVOYW1lID09IFwiZGxcIikge1xuICAgICAgICAgICAgbGV0IGZpcnN0ID0gXCJcIjtcbiAgICAgICAgICAgIGxldCBsYXN0ID0gXCJcIjtcbiAgICAgICAgICAgIGxldCB3YWxrQ2hpbGRyZW4gPSBydWxlQ29udGV4dC5maXJzdENoaWxkIGFzIE5vZGU7XG4gICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgbGV0IHByZXNlbnRhdGlvbmFsRm91bmQgPSBmYWxzZTtcblxuICAgICAgICAgICAgLy8gSWYgdGhlcmUgYXJlIG5vIGNoaWxkcmVucyBzZXQgYXMgcGFzc2VkLCBzaW5jZSBkbCBlbGVtZW50cyBjYW4gaGF2ZVxuICAgICAgICAgICAgLy8gemVybyBvciBtb3JlIG9mOiBvbmUgb3IgbW9yZSBkdCBlbGVtZW50cywgZm9sbG93ZWQgYnkgb25lIG9yIG1vcmUgZGQgZWxlbWVudHNcbiAgICAgICAgICAgIGlmICghcnVsZUNvbnRleHQuY2hpbGRyZW4gfHwgcnVsZUNvbnRleHQuY2hpbGRyZW4ubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB3aGlsZSAocGFzc2VkICYmIHdhbGtDaGlsZHJlbiAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh3YWxrQ2hpbGRyZW4ubm9kZVR5cGUgPT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5vZGVOYW1lID0gd2Fsa0NoaWxkcmVuLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdoaWxlIHdhbGtpbmcgdGhyb3VnaCB0aGUgZWxlbWVudHMgdW5kZXIgZGwsIGlmIHdlIGZpbmQgYSBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByZXNlbnRhdGlvbmFsIGVsZW1lbnQgd2UgbW92ZSB0byB0aGUgbmV4dCBlbGVtZW50IGFzIHByZXNlbnRhdGlvbmFsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlbGVtZW50cyBhcmUgYWxsb3dlZCB1bmRlciBsaXN0IGVsZW1lbnRzIGFzIHRoZXkgYXJlIG9ubHkgZm9yXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3JtYXR0aW5nIHRleHQgbm9kZXMuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJpYVV0aWwuaXNQcmVzZW50YXRpb25hbEVsZW1lbnQod2Fsa0NoaWxkcmVuKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNlbnRhdGlvbmFsRm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbGtDaGlsZHJlbiA9IHdhbGtDaGlsZHJlbi5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSBzZXQgdG8gcGFzcyBpZiB3ZSBmaW5kIGRkIG9yIGR0IGVsZW1lbnQsIGluIHRoZSBjYXNlIG9mXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbiBlbGVtZW50IHRoYXQgaXMgbm90IHN1cHBvcnRlZCB3ZSB3aWxsIGNhdGNoIGl0IGhlcmUuIGkuZS4gaW1nIFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWxlbWVudFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gbm9kZU5hbWUgPT0gXCJkZFwiIHx8IG5vZGVOYW1lID09IFwiZHRcIjtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2V0IHRoZSBmaXJzdCBhbmQgbGFzdCBub2RlIGRlcGVuZGluZyBvbiB3aGljaCBpcyBmb3VuZCBmaXJzdCBhbmQgbGFzdFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0ID09IFwiXCIpIGZpcnN0ID0gbm9kZU5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYXN0ID0gbm9kZU5hbWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgd2Fsa0NoaWxkcmVuID0gd2Fsa0NoaWxkcmVuLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IHdlIGhhdmUgZm91bmQgZHQgYW5kIGRkIGVsZW1lbnRzIHVuZGVyIGRsIHdlIHBhc3MgcmlnaHQgYXdheS5cbiAgICAgICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IHRoZXJlIGlzIG5vIGR0IG9yIGRkIGVsZW1lbnQsIGJ1dCBidW5jaCBvZiBwcmVzZW50YXRpb25hbCBlbGVtZW50cyB3ZSBtYXJrIHRoaXMgYXMgYVxuICAgICAgICAgICAgICAgIC8vIHBhc3MuIEluIHRoZSBjYXNlIHRoYXQgdGhlcmUgYXJlIG90aGVyIGVsZW1lbnRzLCBzdWNoIGFzIGltZyB3ZSB3aWxsIHN0aWxsIHRyaWdnZXIgYSB2aW9sYXRpb24uXG4gICAgICAgICAgICAgICAgcGFzc2VkID0gKHBhc3NlZCAmJiBmaXJzdCA9PSBcImR0XCIgJiYgbGFzdCA9PSBcImRkXCIpIHx8IChwYXNzZWQgJiYgcHJlc2VudGF0aW9uYWxGb3VuZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAobm9kZU5hbWUgPT0gXCJsaVwiKSB7XG4gICAgICAgICAgICBwYXNzZWQgPSBDb21tb25VdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBbXCJ1bFwiLCBcIm9sXCIsIFwiZGlyXCIsIFwibWVudVwiXSkgIT0gbnVsbDtcbiAgICAgICAgfSBlbHNlIGlmIChub2RlTmFtZSA9PSBcImRkXCIgfHwgbm9kZU5hbWUgPT0gXCJkdFwiKSB7XG4gICAgICAgICAgICBwYXNzZWQgPSBDb21tb25VdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBcImRsXCIpICE9IG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgd2Fsa0NoaWxkcmVuID0gcnVsZUNvbnRleHQuZmlyc3RDaGlsZCBhcyBOb2RlO1xuICAgICAgICAgICAgLy8gWmVybyBvciBtb3JlIGxpIGVsZW1lbnRzIGFyZSBwZXJtaXR0ZWQgaW5zaWRlIG9mIDxvbD4sIDx1bD4gb3IgPG1lbnU+IGVsZW1lbnRzIG5vdyBhcyBwZXIgdGhlIGh0bWw1IHNwZWMuIFRoaXMgaGFuZGxlcyB0aGUgY2FzZVxuICAgICAgICAgICAgLy8gd2hlbiB0aGVyZSBhcmUgemVybyBlbGVtZW50cyB1bmRlciB0aGUgPG9sPiwgPHVsPiBvciA8bWVudT4uXG4gICAgICAgICAgICBpZiAoKG5vZGVOYW1lID09IFwidWxcIiB8fCBub2RlTmFtZSA9PSBcIm9sXCIgfHwgbm9kZU5hbWUgPT0gXCJtZW51XCIpICYmICghcnVsZUNvbnRleHQuY2hpbGRyZW4gfHwgcnVsZUNvbnRleHQuY2hpbGRyZW4ubGVuZ3RoID09IDApKSB7XG4gICAgICAgICAgICAgICAgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IGxpRm91bmQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBsZXQgcHJlc2VudGF0aW9uYWxGb3VuZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHBhc3NlZCAmJiB3YWxrQ2hpbGRyZW4gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBXaGlsZSB3YWxraW5nIHRocm91Z2ggdGhlIGxpc3QgZWxlbWVudHMsIGlmIHdlIGZpbmQgYSBcbiAgICAgICAgICAgICAgICAgICAgLy8gcHJlc2VudGF0aW9uYWwgZWxlbWVudCB3ZSBza2lwIGNoZWNraW5nIGFzIHByZXNlbnRhdGlvbmFsXG4gICAgICAgICAgICAgICAgICAgIC8vIGVsZW1lbnRzIGFyZSBhbGxvd2VkIHVuZGVyIGxpc3QgZWxlbWVudHMgYXMgdGhleSBhcmUgb25seSBmb3JcbiAgICAgICAgICAgICAgICAgICAgLy8gZm9ybWF0dGluZyB0ZXh0LlxuICAgICAgICAgICAgICAgICAgICBpZiAoQXJpYVV0aWwuaXNQcmVzZW50YXRpb25hbEVsZW1lbnQod2Fsa0NoaWxkcmVuKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJlc2VudGF0aW9uYWxGb3VuZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB3YWxrQ2hpbGRyZW4gPSB3YWxrQ2hpbGRyZW4ubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIFBhc3MgaWYgdGhlIG5vZGUgdHlwZSBpcyBhbnl0aGluZyBidXQgMSwgb3IgaW4gdGhlIGNhc2UgdGhhdCBpdCBpcyBhIGxpIGVsZW1lbnQuIEZvciBhbnkgb3RoZXIgbm9kZSBcbiAgICAgICAgICAgICAgICAgICAgLy8gaXQgd2lsbCBiZSBjYXVnaHQgaGVyZSB0aGF0IGVsZW1lbnQgaXMgbm90IGFsbG93ZWQgdW5kZXIgbGlzdCBub2RlLlxuICAgICAgICAgICAgICAgICAgICAvLyBGdXJ0aGVybW9yZSBpbiB0aGUgY2FzZSB0aGF0IHRoZXJlIGlzIGEgdGVtcGxhdGUgZWxlbWVudCB3aXRoIHRoZSBwYXJlbnQgYmVpbmcgdWwvb2wgZG9uJ3QgZmxhZyBhIHZpb2xhdGlvblxuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSB3YWxrQ2hpbGRyZW4ubm9kZVR5cGUgIT0gMSB8fCB3YWxrQ2hpbGRyZW4ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSBcImxpXCIgfHwgKHdhbGtDaGlsZHJlbi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09IFwidGVtcGxhdGVcIiAmJiAobm9kZU5hbWUgPT0gXCJ1bFwiIHx8IG5vZGVOYW1lID09IFwib2xcIikpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFNldCBsaSBmb3VuZCB0byB0cnVlIGlmIHRoZSBjdXJyZW50IGVsZW1lbnQgKG5vZGVUeXBlPTEpIGlzIGFuIGxpIGVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgbGlGb3VuZCA9IGxpRm91bmQgfHwgKHdhbGtDaGlsZHJlbi5ub2RlVHlwZSA9PSAxICYmIHdhbGtDaGlsZHJlbi5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09IFwibGlcIik7XG4gICAgICAgICAgICAgICAgICAgIHdhbGtDaGlsZHJlbiA9IHdhbGtDaGlsZHJlbi5uZXh0U2libGluZztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gSW4gdGhlIGNhc2UgdGhhdCBpdCBoYXMgcGFzc2VkIGFuZCBhbHNvIGxpIGVsZW1lbnQgaXMgZm91bmQgdW5kZXIgbGlzdCBub2RlLCB3ZSBwYXNzIHJpZ2h0IGF3YXkuXG4gICAgICAgICAgICAgICAgLy8gSW4gdGhlIGNhc2UgdGhhdCB0aGVyZSBpcyBubyBsaSBlbGVtZW50LCBidXQgYnVuY2ggb2YgcHJlc2VudGF0aW9uYWwgZWxlbWVudHMgd2UgbWFyayB0aGlzIGFzIGFcbiAgICAgICAgICAgICAgICAvLyBwYXNzLiBJbiB0aGUgY2FzZSB0aGF0IHRoZXJlIGFyZSBvdGhlciBlbGVtZW50cywgc3VjaCBhcyBpbWcgd2Ugd2lsbCBzdGlsbCB0cmlnZ2VyIGEgdmlvbGF0aW9uLlxuICAgICAgICAgICAgICAgIHBhc3NlZCA9IChwYXNzZWQgJiYgbGlGb3VuZCkgfHwgKHBhc3NlZCAmJiBwcmVzZW50YXRpb25hbEZvdW5kKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5cbmV4cG9ydCBjb25zdCBtYXJxdWVlX2VsZW1fYXZvaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwibWFycXVlZV9lbGVtX2F2b2lkXCIsXG4gICAgY29udGV4dDogXCJkb206bWFycXVlZVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX01hcnF1ZWVfVHJpZ2dlclwiOiB7XG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIm1hcnF1ZWVfZWxlbV9hdm9pZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwibWFycXVlZV9lbGVtX2F2b2lkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiU2Nyb2xsaW5nIGNvbnRlbnQgZm91bmQgdGhhdCB1c2VzIHRoZSBvYnNvbGV0ZSA8bWFycXVlZT4gZWxlbWVudFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSA8bWFycXVlZT4gZWxlbWVudCBpcyBvYnNvbGV0ZSBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjIuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vIEpDSCAtIE5PIE9VVCBPRiBTQ09QRSBoaWRkZW4gaW4gY29udGV4dFxuICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgbWVkaWFfYWx0X2JyaWVmOiBSdWxlID0ge1xuICAgIGlkOiBcIm1lZGlhX2FsdF9icmllZlwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmltZ1thbHRdLCBkb206YXBwbGV0W2FsdF0sIGRvbTphcmVhW2FsdF0sIGRvbTplbWJlZFthbHRdLCBkb206aW5wdXRbdHlwZV1bYWx0XVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX01lZGlhX0FsdEJyaWVmXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIm1lZGlhX2FsdF9icmllZi5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwibWVkaWFfYWx0X2JyaWVmLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJtZWRpYV9hbHRfYnJpZWYuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlRleHQgYWx0ZXJuYXRpdmUgaXMgbW9yZSB0aGFuIDE1MCBjaGFyYWN0ZXJzXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQWx0ZXJuYXRpdmUgdGV4dCBpbiAnYWx0JyBhdHRyaWJ1dGUgc2hvdWxkIGJlIGJyaWVmICg8MTUwIGNoYXJhY3RlcnMpXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRlUGFyYW1zID0ge1xuICAgICAgICAgICAgbWF4QWx0OiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IDE1MCxcbiAgICAgICAgICAgICAgICB0eXBlOiBcImludGVnZXJcIlxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IGFsdExlbmd0aCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImFsdFwiKS50cmltKCkubGVuZ3RoO1xuICAgICAgICBsZXQgcGFzc2VkID0gYWx0TGVuZ3RoIDw9IHZhbGlkYXRlUGFyYW1zLm1heEFsdC52YWx1ZTtcbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBtZWRpYV9hbHRfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcIm1lZGlhX2FsdF9leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTphcmVhW2FsdF0sIGRvbTplbWJlZFthbHRdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfTWVkaWFfQXVkaW9WaWRlb0FsdEZpbGVuYW1lXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIm1lZGlhX2FsdF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIm1lZGlhX2FsdF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIm1lZGlhX2FsdF9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIkZpbGVuYW1lIHVzZWQgYXMgbGFiZWwgZm9yIGVtYmVkZGVkIGF1ZGlvIG9yIHZpZGVvXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQXVkaW8gb3IgdmlkZW8gb24gdGhlIHBhZ2UgbXVzdCBoYXZlIGEgc2hvcnQgdGV4dCBhbHRlcm5hdGl2ZSB0aGF0IGRlc2NyaWJlcyB0aGUgbWVkaWEgY29udGVudFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgdXJpID0gXCJcIjtcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT0gXCJhcmVhXCIpIHtcbiAgICAgICAgICAgIHVyaSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImhyZWZcIilcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHVyaSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInNyY1wiKVxuICAgICAgICB9XG4gICAgICAgIGlmICh1cmkgPT0gbnVsbCkgdXJpID0gXCJcIjtcbiAgICAgICAgbGV0IGV4dCA9IENvbW1vblV0aWwuZ2V0RmlsZUV4dCh1cmkpO1xuICAgICAgICBsZXQgaXNBdWRWaWQgPSBleHQubGVuZ3RoICE9IDAgJiYgKENvbW1vblV0aWwuaXNBdWRpb0V4dChleHQpIHx8IENvbW1vblV0aWwuaXNWaWRlb0V4dChleHQpKTtcbiAgICAgICAgbGV0IGFsdFRleHQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhbHRcIik7XG4gICAgICAgIGxldCBwYXNzZWQgPSAhaXNBdWRWaWQgfHwgKGFsdFRleHQubGVuZ3RoID4gMCAmJiBhbHRUZXh0LmluZGV4T2YoZXh0KSA9PSAtMSk7XG5cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVNYW51YWwsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IG1lZGlhX2F1ZGlvX3RyYW5zY3JpYmVkOiBSdWxlID0ge1xuICAgIGlkOiBcIm1lZGlhX2F1ZGlvX3RyYW5zY3JpYmVkXCIsXG4gICAgY29udGV4dDogXCJkb206Ymdzb3VuZCwgZG9tOmFbaHJlZl0sIGRvbTphcmVhW2hyZWZdLCBkb206ZW1iZWQsIGRvbTpvYmplY3RcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9NZWRpYV9BdWRpb1RyaWdnZXJcIjoge1xuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIk1hbnVhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIm1lZGlhX2F1ZGlvX3RyYW5zY3JpYmVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJtZWRpYV9hdWRpb190cmFuc2NyaWJlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwiUHJvdmlkZSB0cmFuc2NyaXB0cyBmb3IgYXVkaW8gZmlsZXNcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBdWRpbyBpbmZvcm1hdGlvbiBzaG91bGQgYWxzbyBiZSBhdmFpbGFibGUgaW4gdGV4dCBmb3JtXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjIuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgcGFzc2VkO1xuICAgICAgICBsZXQgdGhpc05vZGUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAodGhpc05vZGUgPT0gXCJiZ3NvdW5kXCIpIHtcbiAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGFzc2VkID0gIUNvbW1vblV0aWwuaXNBdWRpb09iakVtYmVkTGluayhydWxlQ29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIG51bGw7IC8vIE91dCBvZiBTY29wZVxuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVNYW51YWwoXCJNYW51YWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG5leHBvcnQgY29uc3QgbWVkaWFfYXV0b3N0YXJ0X2NvbnRyb2xsYWJsZTogUnVsZSA9IHtcbiAgICBpZDogXCJtZWRpYV9hdXRvc3RhcnRfY29udHJvbGxhYmxlXCIsXG4gICAgY29udGV4dDogXCJkb206cGFyYW1bbmFtZT1hdXRvcGxheV0sIGRvbTpwYXJhbVtuYW1lPWF1dG9zdGFydF0sIGRvbTplbWJlZFtmbGFzaHZhcnNdLCBkb206ZW1iZWRbc3JjXSwgZG9tOipbYXV0b3N0YXJ0PXRydWVdLCBkb206KlthdXRvc3RhcnQ9MV0sIGRvbTpiZ3NvdW5kXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfRW1iZWRfQXV0b1N0YXJ0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIm1lZGlhX2F1dG9zdGFydF9jb250cm9sbGFibGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIm1lZGlhX2F1dG9zdGFydF9jb250cm9sbGFibGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIm1lZGlhX2F1dG9zdGFydF9jb250cm9sbGFibGUuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0aGVyZSBpcyBhIG1lY2hhbmlzbSB0byBwYXVzZSBvciBzdG9wIGFuZCBjb250cm9sIHRoZSB2b2x1bWUgZm9yIHRoZSBhdWRpbyB0aGF0IHBsYXlzIGF1dG9tYXRpY2FsbHlcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJNZWNoYW5pc20gbXVzdCBiZSBhdmFpbGFibGUgdG8gcGF1c2Ugb3Igc3RvcCBhbmQgY29udHJvbCB0aGUgdm9sdW1lIG9mIHRoZSBhdWRpbyB0aGF0IHBsYXlzIGF1dG9tYXRpY2FsbHlcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuNC4yXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGxldCBwYXNzZWQ7XG4gICAgICAgIGlmIChub2RlTmFtZSA9PSBcImJnc291bmRcIikge1xuICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSBpZiAobm9kZU5hbWUgPT0gXCJwYXJhbVwiKSB7XG4gICAgICAgICAgICBsZXQgY29udGVudCA9IFwiXCI7XG4gICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidmFsdWVcIikpXG4gICAgICAgICAgICAgICAgY29udGVudCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInZhbHVlXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBwYXNzZWQgPSBjb250ZW50LmluZGV4T2YoXCIwO1wiKSA9PSAwIHx8XG4gICAgICAgICAgICAgICAgIShjb250ZW50LmluZGV4T2YoXCJ0cnVlXCIpICE9IC0xIHx8IGNvbnRlbnQuaW5kZXhPZihcIjFcIikgIT0gLTEpO1xuICAgICAgICB9IGVsc2UgaWYgKG5vZGVOYW1lID09IFwiZW1iZWRcIikge1xuICAgICAgICAgICAgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJmbGFzaHZhcnNcIikpIHtcbiAgICAgICAgICAgICAgICBsZXQgc3RyID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiZmxhc2h2YXJzXCIpO1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9IHN0ci5pbmRleE9mKFwiYXV0b3N0YXJ0PXRydWVcIikgPT0gLTEgJiZcbiAgICAgICAgICAgICAgICAgICAgc3RyLmluZGV4T2YoXCJhdXRvc3RhcnQ9MVwiKSA9PSAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChwYXNzZWQgJiYgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwic3JjXCIpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHN0ciA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInNyY1wiKTtcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSBzdHIuaW5kZXhPZihcImF1dG9zdGFydD10cnVlXCIpID09IC0xICYmXG4gICAgICAgICAgICAgICAgICAgIHN0ci5pbmRleE9mKFwiYXV0b3N0YXJ0PTFcIikgPT0gLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhc3NlZCAmJiBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhdXRvc3RhcnRcIikpIHtcbiAgICAgICAgICAgIGxldCB2YWwgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhdXRvc3RhcnRcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIHBhc3NlZCA9IHZhbCAhPSAndHJ1ZScgJiYgdmFsICE9ICcxJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFzc2VkID8gUnVsZVBhc3MoXCJQYXNzXzBcIikgOiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgbWVkaWFfa2V5Ym9hcmRfY29udHJvbGxhYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcIm1lZGlhX2tleWJvYXJkX2NvbnRyb2xsYWJsZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmF1ZGlvLCBkb206dmlkZW9cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIkhBQUNfQXVkaW9fVmlkZW9fVHJpZ2dlclwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIk1hbnVhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJtZWRpYV9rZXlib2FyZF9jb250cm9sbGFibGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIm1lZGlhX2tleWJvYXJkX2NvbnRyb2xsYWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwibWVkaWFfa2V5Ym9hcmRfY29udHJvbGxhYmxlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJWZXJpZnkgbWVkaWEgdXNpbmcgPGF1ZGlvPiBhbmQvb3IgPHZpZGVvPiBlbGVtZW50cyBoYXZlIGtleWJvYXJkIGFjY2Vzc2libGUgY29udHJvbHNcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJNZWRpYSB1c2luZyA8YXVkaW8+IGFuZC9vciA8dmlkZW8+IGVsZW1lbnRzIG11c3QgaGF2ZSBrZXlib2FyZCBhY2Nlc3NpYmxlIGNvbnRyb2xzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAobm9kZU5hbWUgPT0gXCJhdWRpb1wiIHx8IG5vZGVOYW1lID09PSBcInZpZGVvXCIpIHtcbiAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXNzZWQgPyBSdWxlUGFzcyhcIlBhc3NfMFwiKSA6IFJ1bGVNYW51YWwoXCJNYW51YWxfMVwiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlTWFudWFsLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IG1lZGlhX2xpdmVfY2FwdGlvbmVkOiBSdWxlID0ge1xuICAgIGlkOiBcIm1lZGlhX2xpdmVfY2FwdGlvbmVkXCIsXG4gICAgY29udGV4dDogXCJkb206ZW1iZWQsIGRvbTpvYmplY3RcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9NZWRpYV9WaWRlb09iamVjdFRyaWdnZXJcIjoge1xuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIk1hbnVhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIm1lZGlhX2xpdmVfY2FwdGlvbmVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJtZWRpYV9saXZlX2NhcHRpb25lZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwiVmVyaWZ5IGNhcHRpb25zIGFyZSBwcm92aWRlZCBmb3IgbGl2ZSBtZWRpYSAoc3RyZWFtaW5nIHZpZGVvIHdpdGggYXVkaW8pXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiTGl2ZSBtZWRpYSAoc3RyZWFtaW5nIHZpZGVvIHdpdGggYXVkaW8pIHNob3VsZCBoYXZlIGNhcHRpb25zIGZvciBhdWRpbyBjb250ZW50XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjIuNFwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSAhQ29tbW9uVXRpbC5pc1ZpZGVvT2JqRW1iZWRMaW5rKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIG51bGw7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZU1hbnVhbChcIk1hbnVhbF8xXCIpO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVNYW51YWwsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IG1lZGlhX3RyYWNrX2F2YWlsYWJsZTogUnVsZSA9IHtcbiAgICBpZDogXCJtZWRpYV90cmFja19hdmFpbGFibGVcIixcbiAgICBjb250ZXh0OiBcImRvbTphW2hyZWZdLCBkb206YXJlYVtocmVmXSwgZG9tOmFwcGxldCwgZG9tOmVtYmVkLCBkb206b2JqZWN0XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfTWVkaWFfVmlkZW9SZWZlcmVuY2VUcmlnZ2VyXCI6IHtcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJNYW51YWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJtZWRpYV90cmFja19hdmFpbGFibGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIm1lZGlhX3RyYWNrX2F2YWlsYWJsZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwiVmVyaWZ5IGF2YWlsYWJpbGl0eSBvZiBhIHVzZXItc2VsZWN0YWJsZSBhdWRpbyB0cmFjayB3aXRoIGRlc2NyaXB0aW9uIG9mIHZpc3VhbCBjb250ZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiUHJlLXJlY29yZGVkIG1lZGlhIHNob3VsZCBoYXZlIGFuIGF1ZGlvIHRyYWNrIHRoYXQgZGVzY3JpYmVzIHZpc3VhbCBpbmZvcm1hdGlvblwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4yLjNcIiwgXCIxLjIuNVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcblxuICAgICAgICBpZiAobm9kZU5hbWUgPT0gXCJhcHBsZXRcIikge1xuICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwYXNzZWQgPSAhQ29tbW9uVXRpbC5pc1ZpZGVvT2JqRW1iZWRMaW5rKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBudWxsO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVNYW51YWwoXCJNYW51YWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgbWV0YV9yZWRpcmVjdF9vcHRpb25hbDogUnVsZSA9IHtcbiAgICBpZDogXCJtZXRhX3JlZGlyZWN0X29wdGlvbmFsXCIsXG4gICAgY29udGV4dDogXCJkb206bWV0YVtodHRwLWVxdWl2XVtjb250ZW50XVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX01ldGFfUmVkaXJlY3RaZXJvXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiZmFpbFwiOiBcImZhaWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9sb25ncmVmcmVzaFwiOiBcImZhaWxfbG9uZ3JlZnJlc2hcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIm1ldGFfcmVkaXJlY3Rfb3B0aW9uYWwuaHRtbFwiLFxuICAgICAgICAgICAgXCJwYXNzXCI6IFwibWV0YV9yZWRpcmVjdF9vcHRpb25hbC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxcIjogXCJtZXRhX3JlZGlyZWN0X29wdGlvbmFsLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9sb25ncmVmcmVzaFwiOiBcIm1ldGFfcmVkaXJlY3Rfb3B0aW9uYWwuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIlBhZ2Ugc2hvdWxkIG5vdCBhdXRvbWF0aWNhbGx5IHJlZnJlc2ggd2l0aG91dCB3YXJuaW5nIG9yIG9wdGlvbiB0byB0dXJuIGl0IG9mZiBvciBhZGp1c3QgdGhlIHRpbWUgbGltaXRcIixcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcImZhaWxcIjogXCJDaGVjayBwYWdlIGRvZXMgbm90IGF1dG9tYXRpY2FsbHkgcmVmcmVzaCB3aXRob3V0IHdhcm5pbmcgb3Igb3B0aW9uc1wiLFxuICAgICAgICAgICAgXCJmYWlsX2xvbmdyZWZyZXNoXCI6IFwiQ2hlY2sgcGFnZSBkb2VzIG5vdCBhdXRvbWF0aWNhbGx5IHJlZnJlc2ggd2l0aG91dCB3YXJuaW5nIG9yIG9wdGlvbnNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBkZXByZWNhdGUgV0NBRyBBQUFcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuMi40XCIsIFwiMy4yLjVcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgKi9cbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi4yLjRcIiwgXCIzLjIuNVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICAvLyBSZW1vdmVkIEFDVCBiaXN6NTggQUFBXG4gICAgLyoqYWN0OiBbeyBcbiAgICAgICAgXCJiYzY1OWFcIiA6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiZmFpbFwiOiBcImZhaWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9sb25ncmVmcmVzaFwiOiBcInBhc3NcIlxuICAgICAgICB9XG4gICAgfV0sKi9cbiAgICBhY3Q6IFsgXCJiaXN6NThcIl0sICAvLyBmYWlsIGV2ZW4gaWYgYSBwYWdlIGlzIHJlZGlyZWN0ZWQgYWZ0ZXIgbW9yZSB0aGFuIDIwIGhvdXJzICg3MjAwKVxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIFxuICAgICAgICBpZiAocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiaHR0cC1lcXVpdlwiKS50b0xvd2VyQ2FzZSgpICE9PSAncmVmcmVzaCcpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGRvYyA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQ7XG4gICAgICAgIGlmICghZG9jKSByZXR1cm47XG5cbiAgICAgICAgLy8gY2hlY2sgaWYgdGhlIHJ1bGUgYWxyZWFkeSBwYXNzZWQgb3IgZmFpbGVkOiBvbmx5IHRoZSBmaXJzdCBvbmUgdHJpZGRlcnMgaWYgbXVsdGlwbGVcbiAgICAgICAgaWYgKENhY2hlVXRpbC5nZXRDYWNoZShkb2MsIFwibWV0YV9yZWRpcmVjdF9vcHRpb25hbF9kb25lXCIsIGZhbHNlKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsOyAgICBcblxuICAgICAgICBsZXQgY29udGVudCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImNvbnRlbnRcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKCFjb250ZW50IHx8IGNvbnRlbnQudHJpbSgpLmxlbmd0aCA9PT0wKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgbGV0IHRpbWU6bnVtYmVyID0gLTE7XG4gICAgICAgIGlmIChjb250ZW50Lm1hdGNoKC9eXFxkKyQvKSkgXG4gICAgICAgICAgICB0aW1lID0gcGFyc2VJbnQoY29udGVudCk7XG4gICAgICAgIGVsc2UgaWYgKGNvbnRlbnQubWF0Y2goL15cXGQrOy8pKSB7XG4gICAgICAgICAgICBsZXQgcG9zID0gY29udGVudC5pbmRleE9mKFwiO1wiKTtcbiAgICAgICAgICAgIHRpbWUgPSBwYXJzZUludChjb250ZW50LnN1YnN0cmluZygwLCBwb3MpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJbnZhbGlkIGNvbnRlbnQgZmllbGRcbiAgICAgICAgaWYgKHRpbWUgPT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShkb2MsIFwibWV0YV9yZWRpcmVjdF9vcHRpb25hbF9kb25lXCIsIHRydWUpO1xuICAgICAgICBpZiAodGltZSA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIGVsc2UgaWYgKHRpbWUgPCA3MjAwMSlcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxcIik7XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2xvbmdyZWZyZXNoXCIpOyAgICBcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBtZXRhX3JlZnJlc2hfZGVsYXk6IFJ1bGUgPSB7XG4gICAgaWQ6IFwibWV0YV9yZWZyZXNoX2RlbGF5XCIsXG4gICAgY29udGV4dDogXCJkb206bWV0YVtodHRwLWVxdWl2XVtjb250ZW50XVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX01ldGFfUmVmcmVzaFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJwb3RlbnRpYWxfcmVmcmVzaFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwibWV0YV9yZWZyZXNoX2RlbGF5Lmh0bWxcIixcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIm1ldGFfcmVmcmVzaF9kZWxheS5odG1sXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9yZWZyZXNoXCI6IFwibWV0YV9yZWZyZXNoX2RlbGF5Lmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJQYWdlcyBzaG91bGQgbm90IHJlZnJlc2ggYXV0b21hdGljYWxseVwiLFxuICAgICAgICAgICAgXCJwYXNzXCI6IFwiUGFnZXMgZG8gbm90IHJlZnJlc2ggYXV0b21hdGljYWxseVwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfcmVmcmVzaFwiOiBcIlZlcmlmeSBwYWdlIGlzIG5vdCBiZWluZyBjYXVzZWQgdG8gcmVmcmVzaCBhdXRvbWF0aWNhbGx5XCIsXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi4yLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgLy9hY3Q6IFsgXCJiaXN6NThcIiwgXCJiYzY1OWFcIiBdLFxuICAgIGFjdDogWyBcImJjNjU5YVwiIF0sICAvLyBwYXNzIGlmIGEgcGFnZSBpcyByZWRpcmVjdGVkIGFmdGVyIG1vcmUgdGhhbiAyMCBob3VycyAoNzIwMClcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBpZiAocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiaHR0cC1lcXVpdlwiKS50b0xvd2VyQ2FzZSgpICE9PSAncmVmcmVzaCcpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgZG9jID0gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudDtcbiAgICAgICAgaWYgKCFkb2MpIHJldHVybjtcblxuICAgICAgICAvLyBjaGVjayBpZiB0aGUgcnVsZSBhbHJlYWR5IHBhc3NlZDogdGhlIGZpcnN0IG9uZSB0YWtlcyBwcmlvcml0eVxuICAgICAgICBpZiAoQ2FjaGVVdGlsLmdldENhY2hlKGRvYywgXCJtZXRhX3JlZnJlc2hfZGVsYXlfZG9uZVwiLCBmYWxzZSkpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgY29udGVudCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImNvbnRlbnRcIikudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKCFjb250ZW50IHx8IGNvbnRlbnQudHJpbSgpLmxlbmd0aCA9PT0wKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgbGV0IHRpbWU6bnVtYmVyID0gLTE7XG4gICAgICAgIGlmIChjb250ZW50Lm1hdGNoKC9eXFxkKyQvKSkgXG4gICAgICAgICAgICB0aW1lID0gcGFyc2VJbnQoY29udGVudCk7XG4gICAgICAgIGVsc2UgaWYgKGNvbnRlbnQubWF0Y2goL15cXGQrOy8pKSB7XG4gICAgICAgICAgICBsZXQgcG9zID0gY29udGVudC5pbmRleE9mKFwiO1wiKTtcbiAgICAgICAgICAgIHRpbWUgPSBwYXJzZUludChjb250ZW50LnN1YnN0cmluZygwLCBwb3MpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJbnZhbGlkIGNvbnRlbnQgZmllbGRcbiAgICAgICAgaWYgKHRpbWUgPT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShkb2MsIFwibWV0YV9yZWZyZXNoX2RlbGF5X2RvbmVcIiwgdHJ1ZSk7XG4gICAgICAgIGlmICh0aW1lID09PSAwKSBcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX3JlZnJlc2hcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5cbmV4cG9ydCBjb25zdCBtZXRhX3ZpZXdwb3J0X3pvb21hYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcIm1ldGFfdmlld3BvcnRfem9vbWFibGVcIixcbiAgICBjb250ZXh0OiBcImRvbTptZXRhW25hbWVdW2NvbnRlbnRdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJtZXRhX3ZpZXdwb3J0X3pvb21cIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwicG90ZW50aWFsX3pvb21hYmxlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJtZXRhX3ZpZXdwb3J0X3pvb21hYmxlLmh0bWxcIixcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIm1ldGFfdmlld3BvcnRfem9vbWFibGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfem9vbWFibGVcIjogXCJtZXRhX3ZpZXdwb3J0X3pvb21hYmxlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgJ21ldGFbbmFtZT12aWV3cG9ydF0nIHNob3VsZCBub3QgcHJldmVudCB0aGUgYnJvd3NlciB6b29taW5nIHRoZSBjb250ZW50XCIsXG4gICAgICAgICAgICBcInBhc3NcIjogXCJUaGUgJ21ldGFbbmFtZT12aWV3cG9ydF0nIGRvZXMgbm90IHByZXZlbnQgdGhlIGJyb3dzZXIgem9vbWluZyB0aGUgY29udGVudFwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfem9vbWFibGVcIjogXCJDb25maXJtIHRoZSAnbWV0YVtuYW1lPXZpZXdwb3J0XScgd2l0aCBcXFwiezB9XFxcIiBjYW4gYmUgem9vbWVkIGJ5IHVzZXJcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuNC40XCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbe1xuICAgICAgICBcImI0ZjBjM1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF96b29tYWJsZVwiOiBcImZhaWxcIlxuICAgICAgICB9XG4gICAgfV0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcblxuICAgICAgICBpZiAocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwibmFtZVwiKS50b0xvd2VyQ2FzZSgpICE9PSAndmlld3BvcnQnKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgbGV0IGNvbnRlbnQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJjb250ZW50XCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIC8vIG5laXRoZXIgbWF4aW11bS1zY2FsZSBub3IgdXNlci1zY2FsYWJsZSAoZGVmYXVsdCB5ZXMpXG4gICAgICAgIGlmICghY29udGVudCB8fCBjb250ZW50LnRyaW0oKSA9PT0gJycgfHwgKCFjb250ZW50LmluY2x1ZGVzKCdtYXhpbXVtLXNjYWxlJykgJiYgIWNvbnRlbnQuaW5jbHVkZXMoJ3VzZXItc2NhbGFibGUnKSkpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgdXNlcl9tc2cgPSBudWxsO1xuICAgICAgICBsZXQgbWF4X21zZyA9IG51bGw7XG4gICAgICAgIGNvbnN0IHByb3BzID0gY29udGVudC5zcGxpdChcIixcIik7XG4gICAgICAgIGxldCB1c2VyX3NjYWxlX3ZhbHVlID0gJ3llcyc7XG4gICAgICAgIGxldCBtYXhpbXVtX3NjYWxlX3ZhbHVlID0gJzIuMCc7XG4gICAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBwcm9wcykge1xuICAgICAgICAgICAgY29uc3QgcGllY2VzID0gcHJvcC50cmltKCkuc3BsaXQoJz0nKTtcbiAgICAgICAgICAgIGlmIChwaWVjZXMubGVuZ3RoIDwgMikgY29udGludWU7XG4gICAgICAgICAgICBpZiAocHJvcC5pbmNsdWRlcygndXNlci1zY2FsYWJsZScpKSB7XG4gICAgICAgICAgICAgICAgdXNlcl9tc2cgPSBwcm9wO1xuICAgICAgICAgICAgICAgIHVzZXJfc2NhbGVfdmFsdWUgPSBwaWVjZXNbMV0udHJpbSgpO1xuICAgICAgICAgICAgICAgIGlmICh1c2VyX3NjYWxlX3ZhbHVlLnN0YXJ0c1dpdGgoXCInXCIpIHx8IHVzZXJfc2NhbGVfdmFsdWUuc3RhcnRzV2l0aCgnXCInKSkge1xuICAgICAgICAgICAgICAgICAgICB1c2VyX3NjYWxlX3ZhbHVlID0gdXNlcl9zY2FsZV92YWx1ZS5zdWJzdHJpbmcoMSwgdXNlcl9zY2FsZV92YWx1ZS5sZW5ndGggLSAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHByb3AuaW5jbHVkZXMoJ21heGltdW0tc2NhbGUnKSkge1xuICAgICAgICAgICAgICAgIG1heF9tc2cgPSBwcm9wO1xuICAgICAgICAgICAgICAgIG1heGltdW1fc2NhbGVfdmFsdWUgPSBwaWVjZXNbMV0udHJpbSgpO1xuICAgICAgICAgICAgICAgIGlmIChtYXhpbXVtX3NjYWxlX3ZhbHVlLnN0YXJ0c1dpdGgoXCInXCIpIHx8IG1heGltdW1fc2NhbGVfdmFsdWUuc3RhcnRzV2l0aCgnXCInKSkge1xuICAgICAgICAgICAgICAgICAgICBtYXhpbXVtX3NjYWxlX3ZhbHVlID0gbWF4aW11bV9zY2FsZV92YWx1ZS5zdWJzdHJpbmcoMSwgbWF4aW11bV9zY2FsZV92YWx1ZS5sZW5ndGggLSAxKS50cmltKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHZhbHVlID0gTnVtYmVyKHVzZXJfc2NhbGVfdmFsdWUpO1xuICAgICAgICBpZiAoIWlzTmFOKHZhbHVlKSkge1xuICAgICAgICAgICAgaWYgKHZhbHVlID49IDEgfHwgdmFsdWUgPD0gLTEpIHVzZXJfc2NhbGVfdmFsdWUgPSAneWVzJztcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBtYXhpbXVtX3NjYWxlID0gMi4wO1xuICAgICAgICB2YWx1ZSA9IE51bWJlcihtYXhpbXVtX3NjYWxlX3ZhbHVlKTtcbiAgICAgICAgaWYgKCFpc05hTih2YWx1ZSkpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSA8IDApIG1heGltdW1fc2NhbGUgPSAyLjA7XG4gICAgICAgICAgICBlbHNlIG1heGltdW1fc2NhbGUgPSB2YWx1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChtYXhpbXVtX3NjYWxlX3ZhbHVlID09PSAneWVzJykgbWF4aW11bV9zY2FsZSA9IDEuMDtcbiAgICAgICAgICAgIGVsc2UgbWF4aW11bV9zY2FsZSA9IDAuMTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHVzZXItc2NhbGFibGUgaXMgbm90IHNldCB0byAneWVzJywgaWdub3JlIG1heGltdW1fc2NhbGVcbiAgICAgICAgaWYgKHVzZXJfc2NhbGVfdmFsdWUgIT09ICd5ZXMnKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF96b29tYWJsZVwiLCBbdXNlcl9tc2ddKTtcbiAgICAgICAgfVxuICAgICAgICAvLyB1c2VyLXNjYWxhYmxlIGlzICd5ZXMnLCBidXQgbWF4aW11bV9zY2FsZSBpcyB0b28gc21hbGxcbiAgICAgICAgaWYgKG1heGltdW1fc2NhbGUgPCAyLjApIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX3pvb21hYmxlXCIsIFttYXhfbXNnXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3Qgbm9lbWJlZF9jb250ZW50X2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJub2VtYmVkX2NvbnRlbnRfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJkb206bm9lbWJlZFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiVmFsZXJpZV9Ob2VtYmVkX0hhc0NvbnRlbnRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIm5vZW1iZWRfY29udGVudF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIm5vZW1iZWRfY29udGVudF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIm5vZW1iZWRfY29udGVudF9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIkFkZCBkZXNjcmlwdGl2ZSB0ZXh0IHRvIHRoZSA8bm9lbWJlZD4gZWxlbWVudFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIjxub2VtYmVkPiBlbGVtZW50cyBzaG91bGQgY29udGFpbiBkZXNjcmlwdGl2ZSB0ZXh0XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5SRUNPTU1FTkRBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9GT1VSXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvL3NraXAgdGhlIHJ1bGVcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBwYXNzZWQgPSBDb21tb25VdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbihydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgQWNjTmFtZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BY2NOYW1lVXRpbFwiO1xuXG5leHBvcnQgY29uc3Qgb2JqZWN0X3RleHRfZXhpc3RzOiBSdWxlID0ge1xuICAgIGlkOiBcIm9iamVjdF90ZXh0X2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOm9iamVjdFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX09iamVjdF9IYXNUZXh0XCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiZmFpbF9ub190ZXh0X2FsdGVybmF0aXZlXCI6IFwiZmFpbF9ub190ZXh0X2FsdGVybmF0aXZlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJvYmplY3RfdGV4dF9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJwYXNzXCI6IFwib2JqZWN0X3RleHRfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZmFpbF9ub190ZXh0X2FsdGVybmF0aXZlXCI6IFwib2JqZWN0X3RleHRfZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCI8b2JqZWN0PiBlbGVtZW50IG11c3QgaGF2ZSBhIHRleHQgYWx0ZXJuYXRpdmUgZm9yIHRoZSBjb250ZW50IHJlbmRlcmVkIGJ5IHRoZSBvYmplY3RcIixcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIjxvYmplY3Q+IGVsZW1lbnQgaGFzIGEgdGV4dCBhbHRlcm5hdGl2ZVwiLFxuICAgICAgICAgICAgXCJmYWlsX25vX3RleHRfYWx0ZXJuYXRpdmVcIjogXCJBbiA8b2JqZWN0PiBlbGVtZW50IGRvZXMgbm90IGhhdmUgYSB0ZXh0IGFsdGVybmF0aXZlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjEuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBcIjhmYzNiNlwiLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIC8vIERldGVjdCBpZiB0aGlzIG9iamVjdCBpcyBvZiB0eXBlIHRleHQsIGJ5IGNoZWNraW5nIHRoZSBvYmplY3QgdHlwZSBpbiB0aGUgY2FzZSBpdCBpcyB0ZXh0IHRoZW4gZG8gbm90IHRyaWdnZXIgdGhpcyBydWxlXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJ0eXBlXCIpICYmIChydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpKS5pbmRleE9mKFwidGV4dFwiKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBpZ25vcmUgaWYgYW4gZXhwbGljaXQgcm9sZSBpcyBzcGVjaWZpZWQ6IGluY2x1ZGluZyAncHJlc2VudGF0aW9uJywgJ25vbmUnLCAnYXBwbGljYXRpb24nLCAnZG9jdW1lbnQnIG9yICdpbWcnXG4gICAgICAgIC8vIHRoaXMgY2FzZSB3aWxsIGJlIGNvdmVyZWQgaW4gb3RoZXIgcnVsZXNcbiAgICAgICAgbGV0IHJvbGUgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpO1xuICAgICAgICBpZiAocm9sZSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBQZXIgQUNULCBpZ25vcmUgZW1iZWRkZWQgSFRNTCBmaWxlc1xuICAgICAgICBsZXQgZGF0YSA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcImRhdGFcIik7XG4gICAgICAgIGxldCBleHQgPSBkYXRhICYmIHR5cGVvZiBkYXRhID09PSB0eXBlb2YgXCJcIiA/IGRhdGEuc3Vic3RyaW5nKGRhdGEubGFzdEluZGV4T2YoXCIuXCIpKSA6IFwiXCI7XG4gICAgICAgIGlmIChleHQgPT09IFwiLmh0bWxcIiB8fCBleHQgPT09IFwiLmh0bVwiKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgY29uc3QgcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZShydWxlQ29udGV4dCk7XG4gICAgICAgIGNvbnN0IHBhc3NlZCA9IHBhaXIgJiYgcGFpci5uYW1lICYmIHBhaXIubmFtZS50cmltKCkubGVuZ3RoID4gMDtcbiAgICAgICAgLy9sZXQgcGFzc2VkID0gQVJJQU1hcHBlci5jb21wdXRlTmFtZShydWxlQ29udGV4dCkudHJpbSgpLmxlbmd0aCA+IDA7XG4gICAgICAgIGlmIChwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX25vX3RleHRfYWx0ZXJuYXRpdmVcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgQW5jZXN0b3JVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2FuY2VzdG9yXCI7XG5cbmV4cG9ydCBjb25zdCBwYWdlX3RpdGxlX2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJwYWdlX3RpdGxlX2V4aXN0c1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmh0bWxcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9Eb2NfSGFzVGl0bGVcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkZhaWxfMlwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJGYWlsXzNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcInBhZ2VfdGl0bGVfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwicGFnZV90aXRsZV9leGlzdHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJwYWdlX3RpdGxlX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcInBhZ2VfdGl0bGVfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwicGFnZV90aXRsZV9leGlzdHMuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSBwYWdlIHNob3VsZCBoYXZlIGEgdGl0bGUgdGhhdCBjb3JyZWN0bHkgaWRlbnRpZmllcyB0aGUgc3ViamVjdCBvZiB0aGUgcGFnZVwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJNaXNzaW5nIDxoZWFkPiBlbGVtZW50IHNvIHRoZXJlIGNhbiBiZSBubyA8dGl0bGU+IGVsZW1lbnQgcHJlc2VudFwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJNaXNzaW5nIDx0aXRsZT4gZWxlbWVudCBpbiA8aGVhZD4gZWxlbWVudFwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJUaGUgPHRpdGxlPiBlbGVtZW50IGlzIGVtcHR5IChubyBpbm5lckhUTUwpXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjQuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbe1xuICAgICAgICBcIjI3NzlhNVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJmYWlsXCIsXG4gICAgICAgICAgICBcIkZhaWxfM1wiOiBcImZhaWxcIlxuICAgICAgICB9XG4gICAgfV0sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgLy8gVGhpcyBydWxlIGRvZXMgbm90IGFwcGx5IGluc2lkZSBhIHByZXNlbnRhdGlvbmFsIGZyYW1lXG4gICAgICAgIGlmIChBbmNlc3RvclV0aWwuaXNGcmFtZShjb250ZXh0SGllcmFyY2hpZXMpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBOb2RlO1xuICAgICAgICAvLyBGaXJzdCwgZmluZCB0aGUgaGVhZCBlbGVtZW50XG4gICAgICAgIGxldCBmaW5kSGVhZCA9IHJ1bGVDb250ZXh0LmZpcnN0Q2hpbGQgYXMgTm9kZTtcbiAgICAgICAgbGV0IGZpbmRUaXRsZSA9IG51bGw7XG4gICAgICAgIHdoaWxlIChmaW5kSGVhZCAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoZmluZEhlYWQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PSBcImhlYWRcIilcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGZpbmRIZWFkID0gZmluZEhlYWQubmV4dFNpYmxpbmc7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHBvc3NpYmxlVGl0bGVzID0gKHJ1bGVDb250ZXh0IGFzIEVsZW1lbnQpLnF1ZXJ5U2VsZWN0b3JBbGwoXCJ0aXRsZVwiKTtcbiAgICAgICAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgcG9zc2libGVUaXRsZXMubGVuZ3RoOyArK2lkeCkge1xuICAgICAgICAgICAgaWYgKCFDb21tb25VdGlsLmdldEFuY2VzdG9yKHBvc3NpYmxlVGl0bGVzW2lkeF0sIFtcInN2Z1wiXSkpIHtcbiAgICAgICAgICAgICAgICBmaW5kVGl0bGUgPSBwb3NzaWJsZVRpdGxlc1tpZHhdO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChmaW5kSGVhZCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKCFmaW5kVGl0bGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZmluZFRpdGxlID09PSBudWxsKSB7IC8vIGRvbid0IGhhdmUgdGl0bGUgc2Vjb25kIFBvRlxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8yXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaWYgd2UgZ2V0IGhlcmUgd2UgaGF2ZSA8aGVhZD4gYW5kIDx0aXRsZT5cblxuICAgICAgICBpZiAoZmluZFRpdGxlICE9IG51bGwgJiYgQ29tbW9uVXRpbC5nZXRJbm5lclRleHQoZmluZFRpdGxlKS50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9IGVsc2UgeyAvLyA8dGl0bGU+IGhhcyBubyBpbm5lckhUTUwgdGhpcmQgUG9GXG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzNcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBwYWdlX3RpdGxlX3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcInBhZ2VfdGl0bGVfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbTpoZWFkIGRvbTp0aXRsZVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX1RpdGxlX1ZhbGlkXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICAvLyBcIkZhaWxfMVwiOiBcIkZhaWxfMVwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMlwiOiBcIlBvdGVudGlhbF8yXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJwYWdlX3RpdGxlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIC8vIFwiRmFpbF8xXCI6IFwicGFnZV90aXRsZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8yXCI6IFwicGFnZV90aXRsZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwicGFnZV90aXRsZV92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICAvLyBcIkZhaWxfMVwiOiBcIlBhZ2UgPHRpdGxlPiBpcyBlbXB0eVwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMlwiOiBcIlZlcmlmeSB0aGF0IHVzaW5nIHRoZSBmaWxlbmFtZSBhcyB0aGUgcGFnZSA8dGl0bGU+IHZhbHVlIGlzIGRlc2NyaXB0aXZlXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiUGFnZSA8dGl0bGU+IHNob3VsZCBiZSBhIGRlc2NyaXB0aXZlIHRpdGxlLCByYXRoZXIgdGhhbiBhIGZpbGVuYW1lXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjQuMlwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuXG4gICAgICAgIGxldCB0aXRsZVN0ciA9IENvbW1vblV0aWwuZ2V0SW5uZXJUZXh0KHJ1bGVDb250ZXh0KS50cmltKCk7XG5cbiAgICAgICAgLy8gYWxsb3cgLmNvbSwgLm5ldCBhbmQgLm9yZ1xuICAgICAgICBsZXQgdGl0bGVTdHJMb3dlcmNhc2UgPSB0aXRsZVN0ci50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAodGl0bGVTdHJMb3dlcmNhc2UuaW5jbHVkZXMoXCIuY29tXCIpIHx8IHRpdGxlU3RyTG93ZXJjYXNlLmluY2x1ZGVzKFwiLm5ldFwiKSB8fCB0aXRsZVN0ckxvd2VyY2FzZS5pbmNsdWRlcyhcIi5vcmdcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiLCBbdGl0bGVTdHJdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aXRsZVN0ci5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIC8vIFRoaXMgaXMgY292ZXJlZCBieSBwYWdlX3RpdGxlX2V4aXN0c1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7Ly9SdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBwYXNzZWQgPSAhL15cXFMqXFwuW2EtekEtWl17MSw0fSg/IS4pfF5odHRwcz86XFwvXFwvXFxTKi9pLnRlc3QodGl0bGVTdHIpO1xuXG4gICAgICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzJcIik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiLCBbdGl0bGVTdHJdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG5leHBvcnQgY29uc3Qgc2NyaXB0X2ZvY3VzX2JsdXJfcmV2aWV3OiBSdWxlID0ge1xuICAgIGlkOiBcInNjcmlwdF9mb2N1c19ibHVyX3Jldmlld1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipbb25mb2N1c11cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9TY3JpcHRfRm9jdXNCbHVyc1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJzY3JpcHRfZm9jdXNfYmx1cl9yZXZpZXcuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcInNjcmlwdF9mb2N1c19ibHVyX3Jldmlldy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwic2NyaXB0X2ZvY3VzX2JsdXJfcmV2aWV3Lmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgc2NyaXB0IGRvZXMgbm90IHJlbW92ZSBmb2N1cyBmcm9tIGNvbnRlbnQgdGhhdCBub3JtYWxseSByZWNlaXZlcyBmb2N1c1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlNjcmlwdGluZyBtdXN0IG5vdCByZW1vdmUgZm9jdXMgZnJvbSBjb250ZW50IHRoYXQgbm9ybWFsbHkgcmVjZWl2ZXMgZm9jdXNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjIuMS4xXCIsIFwiMi40LjdcIiwgXCIzLjIuMVwiXSwgLy9tYXRjaCByZXF1aXJlbWVudHMgbGlzdGVkIGluIGhlbHBcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcGFzc2VkID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwib25mb2N1c1wiKS5pbmRleE9mKFwiLmJsdXIoXCIpID09IC0xO1xuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgY29uc3Qgc2NyaXB0X29uY2xpY2tfYXZvaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwic2NyaXB0X29uY2xpY2tfYXZvaWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqW29uY2xpY2tdXCIsXG4gICAgZGVwZW5kZW5jaWVzOiBbXCJzY3JpcHRfb25jbGlja19taXN1c2VcIl0sXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfU2NyaXB0X09uY2xpY2tIVE1MMlwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJzY3JpcHRfb25jbGlja19hdm9pZC5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwic2NyaXB0X29uY2xpY2tfYXZvaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInNjcmlwdF9vbmNsaWNrX2F2b2lkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgdGhhdCAnb25jbGljaycgZXZlbnRzIGFyZSBub3QgdXNlZCBpbiBzY3JpcHQgdG8gZW11bGF0ZSBhIGxpbmtcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJTY3JpcHRzIHNob3VsZCBub3QgYmUgdXNlZCB0byBlbXVsYXRlIGxpbmtzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjEuMVwiXSwgLy9oZWxwIGFuZCBtYXRjaCBtYXBwaW5nIHRvIDIuMS4xIG9ubHkgXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfRk9VUlxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy8gRG9uJ3QgdHJpZ2dlciB0aGlzIGZvciBTVkcgZWxlbWVudCBmb3Igbm93IHVudGlsIGEgZGV0ZXJtaW5hdGlvbiBpcyBtYWRlIChieSBSaWNoKVxuICAgICAgICAvLyB0byBzdXBwb3J0IFNWRyBhdCBhIHBvaW50IHdoZW4gdGhlIFNWRyBhMTF5IHNwZWMgaXMgcmVhZHkuXG4gICAgICAgIGlmIChDb21tb25VdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBcInN2Z1wiKSkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIHRoZXJlJ3MgYW4gYXJpYS1yb2xlIHNwZWNpZmllZCwgZG9uJ3QgdHJpZ2dlciB0aGlzLlxuICAgICAgICBpZiAoQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJyb2xlXCIpKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuXG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGxldCBwYXNzZWQgPSBub2RlTmFtZSA9PSBcImFcIiB8fCBub2RlTmFtZSA9PSBcImFyZWFcIiB8fCBub2RlTmFtZSA9PSBcImlucHV0XCI7XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBzY3JpcHRfb25jbGlja19taXN1c2U6IFJ1bGUgPSB7XG4gICAgaWQ6IFwic2NyaXB0X29uY2xpY2tfbWlzdXNlXCIsXG4gICAgY29udGV4dDogXCJkb206KltvbmNsaWNrXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX1NjcmlwdF9PbmNsaWNrSFRNTDFcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwic2NyaXB0X29uY2xpY2tfbWlzdXNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJzY3JpcHRfb25jbGlja19taXN1c2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInNjcmlwdF9vbmNsaWNrX21pc3VzZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG9zc2libGUgdXNlIG9mIGEgc2NyaXB0IHRvIGVtdWxhdGUgYSBsaW5rXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiU2NyaXB0cyBzaG91bGQgbm90IGJlIHVzZWQgdG8gZW11bGF0ZSBsaW5rc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi4xLjFcIl0sIC8vaGVscCBhbmQgbWF0Y2ggbWFwcGluZyB0byAyLjEuMSBvbmx5IFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRlUGFyYW1zID0ge1xuICAgICAgICAgICAgZmFpbFN1YnN0cmluZzoge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBbXCIuYXNwXCIsIFwiLmFzcHhcIiwgXCIuY2ZtXCIsIFwiLmNmbWxcIiwgXCIuY2dpXCIsIFwiLmh0bVwiLCBcIi5odG1sXCIsIFwiLnNodG1cIixcbiAgICAgICAgICAgICAgICAgICAgXCIuc2h0bWxcIiwgXCIucGhwXCIsIFwiLnBsXCIsIFwiLnB5XCIsIFwiLnNodG1cIiwgXCIuc2h0bWxcIiwgXCIueGh0bWxcIixcbiAgICAgICAgICAgICAgICAgICAgXCJsb2NhdGlvbi5ocmVmXCJdLFxuICAgICAgICAgICAgICAgIHR5cGU6IFwiW3N0cmluZ11cIlxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBJZiB0aGVyZSdzIGFuIGFyaWEtcm9sZSBzcGVjaWZpZWQsIGRvbid0IHRyaWdnZXIgdGhpcy5cbiAgICAgICAgbGV0IHBhc3NlZCA9IENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwicm9sZVwiKTtcbiAgICAgICAgLy8gSWYgdGhpcyBpcyBhbiBhIG9yIGFyZWEsIGRvbid0IHRyaWdnZXIgaWYgdGhlcmUncyBhbiBocmVmLlxuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBwYXNzZWQgPSBwYXNzZWQgfHwgKChub2RlTmFtZSA9PSBcImFcIiB8fCBub2RlTmFtZSA9PSBcImFyZWFcIikgJiYgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJocmVmXCIpKTtcblxuICAgICAgICAvLyBJZiB0aGUgZ3VhcmRzIGZhaWxlZCwgY2hlY2sgdG8gc2VlIGlmIHRoZXkncmUgbG9va2luZyBhdCBsaW5rc1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgbGV0IGZhaWxTdWJzdHJpbmcgPSB2YWxpZGF0ZVBhcmFtcy5mYWlsU3Vic3RyaW5nLnZhbHVlOztcbiAgICAgICAgICAgIGxldCBvbmNsaWNrID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwib25jbGlja1wiKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBwYXNzZWQgJiYgaSA8IGZhaWxTdWJzdHJpbmcubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSBvbmNsaWNrLmluZGV4T2YoZmFpbFN1YnN0cmluZ1tpXSkgPT0gLTE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5cbmV4cG9ydCBjb25zdCBzY3JpcHRfc2VsZWN0X3JldmlldzogUnVsZSA9IHtcbiAgICBpZDogXCJzY3JpcHRfc2VsZWN0X3Jldmlld1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOnNlbGVjdFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX1NlbGVjdF9Ob0NoYW5nZUFjdGlvblwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJzY3JpcHRfc2VsZWN0X3Jldmlldy5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwic2NyaXB0X3NlbGVjdF9yZXZpZXcuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInNjcmlwdF9zZWxlY3RfcmV2aWV3Lmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgdGhhdCBubyBjaGFuZ2Ugb2YgY29udGV4dCBvciBhY3Rpb24gb2NjdXJzIHdoZW4gc2VsZWN0aW9uIG9wdGlvbnMgaW4gdGhpcyBjb21wb25lbnQgcmVjZWl2ZSBmb2N1c1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIk5vIGNoYW5nZXMgb2YgY29udGV4dCBzaG91bGQgb2NjdXIgd2hlbiBhIHNlbGVjdGlvbiB2YWx1ZSByZWNlaXZlcyBmb2N1c1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMy4yLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcGFzc2VkID0gIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm9uY2hhbmdlXCIpICYmICFydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJvbmZvY3VzXCIpO1xuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG5leHBvcnQgY29uc3Qgc2VsZWN0X29wdGlvbnNfZ3JvdXBlZDogUnVsZSA9IHtcbiAgICBpZDogXCJzZWxlY3Rfb3B0aW9uc19ncm91cGVkXCIsXG4gICAgY29udGV4dDogXCJkb206c2VsZWN0XCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfU2VsZWN0X0hhc09wdEdyb3VwXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInNlbGVjdF9vcHRpb25zX2dyb3VwZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcInNlbGVjdF9vcHRpb25zX2dyb3VwZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInNlbGVjdF9vcHRpb25zX2dyb3VwZWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIkdyb3VwIG9mIHJlbGF0ZWQgb3B0aW9ucyBtYXkgbmVlZCA8b3B0Z3JvdXA+XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiR3JvdXBzIG9mIHJlbGF0ZWQgb3B0aW9ucyB3aXRoaW4gYSBzZWxlY3Rpb24gbGlzdCBzaG91bGQgYmUgZ3JvdXBlZCB3aXRoIDxvcHRncm91cD5cIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlJFQ09NTUVOREFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCB2YWxpZGF0ZVBhcmFtcyA9IHtcbiAgICAgICAgICAgIHBhcmFtTnVtT3B0aW9uczoge1xuICAgICAgICAgICAgICAgIHZhbHVlOiAxMCxcbiAgICAgICAgICAgICAgICB0eXBlOiBcImludGVnZXJcIlxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vIEhhbmRsZSB0aGUgY2FzZXMgd2hlcmUgb3B0Z3JvdXAgaXMgaGlkZGVuLCB3aGljaCBzaG91bGQgdHJpZ2dlciBhIHZpb2xhdGlvbnNcbiAgICAgICAgLy8gYnV0IGluIHRoZSBjYXNlIHRoYXQgQ2hlY2sgaGlkZGVuIG9wdGlvbiBpcyBzZXQgdGhlbiBzaG91bGQgbm90IHRyaWdnZXIgYSB2aW9sYXRpb24uXG4gICAgICAgIGxldCBwYXNzZWQgPSBDb21tb25VdGlsLmdldENoaWxkQnlUYWdIaWRkZW4ocnVsZUNvbnRleHQsIFwib3B0Z3JvdXBcIiwgZmFsc2UsIHRydWUpLmxlbmd0aCA+IDAgfHxcbiAgICAgICAgICAgIENvbW1vblV0aWwuZ2V0Q2hpbGRCeVRhZ0hpZGRlbihydWxlQ29udGV4dCwgXCJvcHRpb25cIiwgZmFsc2UsIHRydWUpLmxlbmd0aCA8PVxuICAgICAgICAgICAgdmFsaWRhdGVQYXJhbXMucGFyYW1OdW1PcHRpb25zLnZhbHVlO1xuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3Qgc2tpcF9tYWluX2Rlc2NyaWJlZDogUnVsZSA9IHtcbiAgICBpZDogXCJza2lwX21haW5fZGVzY3JpYmVkXCIsXG4gICAgY29udGV4dDogXCJkb206Ym9keVwiLFxuICAgIGRlcGVuZGVuY2llczogW1wic2tpcF9tYWluX2V4aXN0c1wiXSxcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIldDQUcyMF9Cb2R5X0ZpcnN0QUNvbnRhaW5zU2tpcFRleHRfTmF0aXZlX0hvc3RfU2VtYXRpY3NcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJQb3RlbnRpYWxfMVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInNraXBfbWFpbl9kZXNjcmliZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcInNraXBfbWFpbl9kZXNjcmliZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInNraXBfbWFpbl9kZXNjcmliZWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSB0aGF0IGlmIHRoaXMgaHlwZXJsaW5rIHNraXBzIGNvbnRlbnQsIHRoZSBkZXNjcmlwdGlvbiBjb21tdW5pY2F0ZXMgd2hlcmUgaXQgbGlua3MgdG9cIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgZGVzY3JpcHRpb24gb2YgYSBoeXBlcmxpbmsgdXNlZCB0byBza2lwIGNvbnRlbnQgbXVzdCBjb21tdW5pY2F0ZSB3aGVyZSBpdCBsaW5rcyB0b1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi40LjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCB2YWxpZGF0ZVBhcmFtcyA9IHtcbiAgICAgICAgICAgIHBhcmFtU2tpcFRleHQ6IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogW1wic2tpcFwiLCBcImp1bXBcIl0sXG4gICAgICAgICAgICAgICAgdHlwZTogXCJbc3RyaW5nXVwiXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy8gR2V0IHRoZSBhbmNob3JzIG9uIHRoZSBwYWdlXG4gICAgICAgIGxldCBkb2MgPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50O1xuXG4gICAgICAgIC8vIENoZWNrIGZvciBsYW5kbWFya3MgZmlyc3RcbiAgICAgICAgbGV0IHBhc3NlZDtcbiAgICAgICAgaWYgKENhY2hlVXRpbC5nZXRDYWNoZShydWxlQ29udGV4dCwgXCJJQk1faGFzTGFuZG1hcmtzX0ltcGxpY2l0XCIsIG51bGwpID09PSBudWxsKSB7XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUocnVsZUNvbnRleHQsIFwiSUJNX2hhc0xhbmRtYXJrc19JbXBsaWNpdFwiLCBDb21tb25VdGlsLmdldEVsZW1lbnRzQnlSb2xlSGlkZGVuKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsIFtcImFwcGxpY2F0aW9uXCIsIFwiYmFubmVyXCIsIFwiY29tcGxlbWVudGFyeVwiLCBcImNvbnRlbnRpbmZvXCIsXG4gICAgICAgICAgICAgICAgXCJmb3JtXCIsIFwibWFpblwiLCBcIm5hdmlnYXRpb25cIiwgXCJzZWFyY2hcIlxuICAgICAgICAgICAgXSwgdHJ1ZSwgdHJ1ZSkubGVuZ3RoID4gMCk7XG4gICAgICAgIH1cbiAgICAgICAgcGFzc2VkID0gQ2FjaGVVdGlsLmdldENhY2hlKHJ1bGVDb250ZXh0LCBcIklCTV9oYXNMYW5kbWFya3NfSW1wbGljaXRcIiwgZmFsc2UpO1xuXG4gICAgICAgIGlmICghcGFzc2VkKSB7IC8vIE5vIGxhbmRtYXJrcywgY2hlY2sgZm9yIHNraXAgbGlua3NcbiAgICAgICAgICAgIGxldCBsaW5rcyA9IGRvYy5saW5rcztcbiAgICAgICAgICAgIC8vIFNraXAgbGluayBzaG91bGQgYmUgdGhlIGZpcnN0IG9uZSBvbiB0aGUgcGFnZSB3aXRoIGFuIGhyZWYgYXR0cmlidXRlIChpLmUuLCBsaW5rc1swXSlcbiAgICAgICAgICAgIC8vIGFsc28gaWYgdGhlIGZpcnN0IGxpbmsgaXMgaGlkZGVuIHRoZW4gd2Ugc2hvdWxkIGFsc28gdHJpZ2dlciBhIHZpb2xhdGlvbi5cbiAgICAgICAgICAgIGlmIChsaW5rcyAmJiBsaW5rcy5sZW5ndGggPiAwICYmIFZpc1V0aWwuaXNOb2RlVmlzaWJsZShsaW5rc1swXSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgdGVzdFRleHQgPSBDb21tb25VdGlsLmdldElubmVyVGV4dChkb2MubGlua3NbMF0pLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7ICFwYXNzZWQgJiYgaSA8IHZhbGlkYXRlUGFyYW1zLnBhcmFtU2tpcFRleHQudmFsdWUubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gdGVzdFRleHQuaW5kZXhPZih2YWxpZGF0ZVBhcmFtcy5wYXJhbVNraXBUZXh0LnZhbHVlW2ldKSAhPSAtMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgcGFzc2VkID0gZmFsc2U7XG5cbiAgICAgICAgfVxuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuXG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IEFuY2VzdG9yVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9jaGVja2VyL2FjY2Vzc2liaWxpdHkvdXRpbC9hbmNlc3RvclwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3Qgc2tpcF9tYWluX2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJza2lwX21haW5fZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJkb206Ym9keVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX0JvZHlfRmlyc3RBU2tpcHNfTmF0aXZlX0hvc3RfU2VtYXRpY3NcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJza2lwX21haW5fZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwic2tpcF9tYWluX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwic2tpcF9tYWluX2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlRoZSBwYWdlIGRvZXMgbm90IHByb3ZpZGUgYSB3YXkgdG8gcXVpY2tseSBuYXZpZ2F0ZSB0byB0aGUgbWFpbiBjb250ZW50IChBUklBIFxcXCJtYWluXFxcIiBsYW5kbWFyayBvciBhIHNraXAgbGluaylcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJQYWdlcyBtdXN0IHByb3ZpZGUgYSB3YXkgdG8gc2tpcCBkaXJlY3RseSB0byB0aGUgbWFpbiBjb250ZW50XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIyLjQuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIC8vIFRoaXMgcnVsZSBkb2VzIG5vdCBhcHBseSBpbnNpZGUgYSBwcmVzZW50YXRpb25hbCBmcmFtZVxuICAgICAgICBpZiAoQW5jZXN0b3JVdGlsLmlzUHJlc2VudGF0aW9uRnJhbWUoY29udGV4dEhpZXJhcmNoaWVzKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy8gR2V0IHRoZSBhbmNob3JzIG9uIHRoZSBwYWdlXG4gICAgICAgIGxldCBkb2MgPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50O1xuXG4gICAgICAgIC8vIENoZWNrIGZvciBsYW5kbWFya3MgZmlyc3RcbiAgICAgICAgbGV0IHBhc3NlZDtcbiAgICAgICAgaWYgKENhY2hlVXRpbC5nZXRDYWNoZShydWxlQ29udGV4dCwgXCJJQk1faGFzTGFuZG1hcmtzX0ltcGxpY2l0XCIsIG51bGwpID09PSBudWxsKSB7XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUocnVsZUNvbnRleHQsIFwiSUJNX2hhc0xhbmRtYXJrc19JbXBsaWNpdFwiLCBDb21tb25VdGlsLmdldEVsZW1lbnRzQnlSb2xlSGlkZGVuKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsIFtcImFwcGxpY2F0aW9uXCIsIFwiYmFubmVyXCIsIFwiY29tcGxlbWVudGFyeVwiLCBcImNvbnRlbnRpbmZvXCIsXG4gICAgICAgICAgICAgICAgXCJmb3JtXCIsIFwibWFpblwiLCBcIm5hdmlnYXRpb25cIiwgXCJzZWFyY2hcIlxuICAgICAgICAgICAgXSwgdHJ1ZSwgdHJ1ZSkubGVuZ3RoID4gMCk7XG4gICAgICAgIH1cbiAgICAgICAgcGFzc2VkID0gQ2FjaGVVdGlsLmdldENhY2hlKHJ1bGVDb250ZXh0LCBcIklCTV9oYXNMYW5kbWFya3NfSW1wbGljaXRcIiwgZmFsc2UpO1xuXG4gICAgICAgIGlmICghcGFzc2VkKSB7IC8vIE5vIGxhbmRtYXJrcywgY2hlY2sgZm9yIHNraXAgbGlua3NcbiAgICAgICAgICAgIGxldCBhbmNob3JzID0gQ29tbW9uVXRpbC5nZXREb2NFbGVtZW50c0J5VGFnKHJ1bGVDb250ZXh0LCBcImFcIik7XG5cbiAgICAgICAgICAgIC8vIFNraXAgYW5jaG9yIHNob3VsZCBiZSB0aGUgZmlyc3Qgb25lIG9uIHRoZSBwYWdlIHdpdGggYW4gaHJlZiBhdHRyaWJ1dGVcbiAgICAgICAgICAgIGxldCB0ZXN0QW5jaG9yID0gbnVsbDtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYW5jaG9ycy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIGlmIChhbmNob3JzW2ldLmhhc0F0dHJpYnV0ZShcImhyZWZcIikgJiYgVmlzVXRpbC5pc05vZGVWaXNpYmxlKGFuY2hvcnNbaV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIHRlc3RBbmNob3IgPSBhbmNob3JzW2ldO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFB1bGwgb3V0IHRoZSB0YXJnZXQgaWRcbiAgICAgICAgICAgIGxldCB0YXJnZXRJZCA9IG51bGw7XG4gICAgICAgICAgICBpZiAodGVzdEFuY2hvciAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgbGV0IGhyZWZTdHIgPSB0ZXN0QW5jaG9yLmdldEF0dHJpYnV0ZShcImhyZWZcIik7XG4gICAgICAgICAgICAgICAgbGV0IGlkeCA9IGhyZWZTdHIuaW5kZXhPZihcIiNcIik7XG4gICAgICAgICAgICAgICAgaWYgKGlkeCAhPSAtMSkge1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXRJZCA9IGhyZWZTdHIuc3Vic3RyaW5nKGlkeCArIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIERldGVybWluZSBpZiB0aGVyZSBpcyBhbiBlbGVtZW50IGlkIG9yIG5hbWVkIGFuY2hvciBvbiB0aGUgcGFnZSB3aXRoIHRoaXNcbiAgICAgICAgICAgIC8vIHRhcmdldCBpZC5cblxuICAgICAgICAgICAgaWYgKHRhcmdldElkICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBwYXNzZWQgPSBkb2MuZ2V0RWxlbWVudEJ5SWQodGFyZ2V0SWQpICE9IG51bGw7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7ICFwYXNzZWQgJiYgaSA8IGFuY2hvcnMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFhbmNob3JzW2ldLmhhc0F0dHJpYnV0ZShcImhyZWZcIikgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGFuY2hvcnNbaV0uaGFzQXR0cmlidXRlKFwibmFtZVwiKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yc1tpXS5nZXRBdHRyaWJ1dGUoXCJuYW1lXCIpID09IHRhcmdldElkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KHBhc3NlZCwgW3J1bGVDb250ZXh0XSwgJycsICcnLCBbXSk7XG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBzdHlsZV9iYWNrZ3JvdW5kX2RlY29yYXRpdmU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwic3R5bGVfYmFja2dyb3VuZF9kZWNvcmF0aXZlXCIsXG4gICAgY29udGV4dDogXCJkb206c3R5bGUsIGRvbToqW3N0eWxlXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX1N0eWxlX0JhY2tncm91bmRJbWFnZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJzdHlsZV9iYWNrZ3JvdW5kX2RlY29yYXRpdmUuaHRtbFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcInN0eWxlX2JhY2tncm91bmRfZGVjb3JhdGl2ZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwic3R5bGVfYmFja2dyb3VuZF9kZWNvcmF0aXZlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgdGhlIENTUyBiYWNrZ3JvdW5kIGltYWdlIGRvZXMgbm90IGNvbnZleSBpbXBvcnRhbnQgaW5mb3JtYXRpb25cIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJJbWFnZXMgaW5jbHVkZWQgYnkgdXNpbmcgQ1NTIGFsb25lIG11c3Qgbm90IGNvbnZleSBpbXBvcnRhbnQgaW5mb3JtYXRpb25cIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwibGlua1wiICYmIHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInJlbFwiKSAmJlxuICAgICAgICAgICAgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwicmVsXCIpLnRvTG93ZXJDYXNlKCkgPT09IFwic3R5bGVzaGVldFwiKSB7XG4gICAgICAgICAgICAvLyBFeHRlcm5hbCBzdHlsZXNoZWV0IC0gdHJpZ2dlclxuICAgICAgICAgICAgcGFzc2VkID0gQ29tbW9uVXRpbC50cmlnZ2VyT25jZShydWxlQ29udGV4dCwgXCJzdHlsZV9iYWNrZ3JvdW5kX2RlY29yYXRpdmVcIiwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWQgJiYgbm9kZU5hbWUgPT09IFwic3R5bGVcIiB8fCBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJzdHlsZVwiKSkge1xuICAgICAgICAgICAgbGV0IHN0eWxlVGV4dDtcbiAgICAgICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJzdHlsZVwiKVxuICAgICAgICAgICAgICAgIHN0eWxlVGV4dCA9IENvbW1vblV0aWwuZ2V0SW5uZXJUZXh0KHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBzdHlsZVRleHQgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJzdHlsZVwiKTtcbiAgICAgICAgICAgIGxldCBiZ01hdGNoZXMgPSBzdHlsZVRleHQubWF0Y2goL2JhY2tncm91bmQ6W147XSovZyk7XG4gICAgICAgICAgICBpZiAoYmdNYXRjaGVzICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IHBhc3NlZCAmJiBpIDwgYmdNYXRjaGVzLmxlbmd0aDsgKytpKVxuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBiZ01hdGNoZXNbaV0uaW5kZXhPZihcInVybChcIikgPT09IC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG5cbiAgICB9XG59IiwiXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ1NTVXRpbCB9IGZyb20gXCIuLi91dGlsL0NTU1V0aWxcIjtcblxuLyoqXG4gKiBEZXNjcmlwdGlvbjogVHJpZ2dlciBpZiA6YmVmb3JlIGFuZCA6YWZ0ZXIgYXJlIHVzZWQgaW4gQ1NTIChJbnRlcm5hbCBhbmQgRXh0ZXJuYWwpIHdpdGggY29udGVudFxuICogT3JpZ2luOiBXQ0FHIDIuMCBGODdcbiAqL1xuZXhwb3J0IGNvbnN0IHN0eWxlX2JlZm9yZV9hZnRlcl9yZXZpZXc6IFJ1bGUgPSB7XG4gICAgaWQ6IFwic3R5bGVfYmVmb3JlX2FmdGVyX3Jldmlld1wiLFxuICAgIGNvbnRleHQ6IFwiZG9tOnN0eWxlLCBkb206bGlua1wiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX1N0eWxlX0JlZm9yZUFmdGVyXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBgc3R5bGVfYmVmb3JlX2FmdGVyX3Jldmlldy5odG1sYCxcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IGBzdHlsZV9iZWZvcmVfYWZ0ZXJfcmV2aWV3Lmh0bWxgLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBgc3R5bGVfYmVmb3JlX2FmdGVyX3Jldmlldy5odG1sYFxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJEbyBub3QgdXNlIENTUyAnOjpiZWZvcmUnIGFuZCAnOjphZnRlcicgcHNldWRvLWVsZW1lbnRzIHRvIGluc2VydCBub24tZGVjb3JhdGl2ZSBjb250ZW50XCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVmVyaWZ5IHRoZSAnOjpiZWZvcmUnIGFuZCAnOjphZnRlcicgcHNldWRvLWVsZW1lbnRzIGRvIG5vdCBpbnNlcnQgbm9uLWRlY29yYXRpdmUgY29udGVudFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICAvLyBUdXJuIG9mZiB0aGUgcnVsZSBkdWUgdG8gdGhlIG9ic29sZXRlIHJlcXVpcmVtZW50XG4gICAgICAgIC8vaWQ6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgaWQ6IFtdLFxuICAgICAgICBudW06IFwiMS4zLjFcIiwgLy8gbnVtOiBbIFwiMi40LjRcIiwgXCJ4LnkuelwiIF0gYWxzbyBhbGxvd2VkXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIC8vY2hlY2sgSW50ZXJuYWwgc3R5bGVzICAgICAgICBcbiAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwic3R5bGVcIikge1xuICAgICAgICAgICAgbGV0IGNzcyA9IENTU1V0aWwuZ2V0Q1NTU3R5bGUocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IHBhc3NlZCAmJiBpIDwgY3NzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgLy8gR3VhcmQgYWdhaW5zdCBiYWQgQ1NTXG4gICAgICAgICAgICAgICAgaWYgKGNzc1tpXS5zZWxlY3Rvcikge1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSAoY3NzW2ldLnNlbGVjdG9yLmluZGV4T2YoXCI6YmVmb3JlXCIpID09PSAtMSAmJiBjc3NbaV0uc2VsZWN0b3IuaW5kZXhPZihcIjphZnRlclwiKSA9PT0gLTEpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAhKFwiY29udGVudFwiIGluIGNzc1tpXS52YWx1ZXMpIHx8IGNzc1tpXS52YWx1ZXNbXCJjb250ZW50XCJdLnRyaW0oKS5sZW5ndGggPT09IDAgfHwgY3NzW2ldLnZhbHVlc1tcImNvbnRlbnRcIl0udHJpbSgpID09PSBcIlxcXCJcXFwiXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8IGNzc1tpXS52YWx1ZXNbXCJjb250ZW50XCJdLnRyaW0oKSA9PT0gXCJcXCdcXCdcIiB8fCBjc3NbaV0udmFsdWVzW1wiY29udGVudFwiXS50cmltKCkgPT09IFwibm9uZVwiIHx8IGNzc1tpXS52YWx1ZXNbXCJjb250ZW50XCJdLnRyaW0oKSA9PT0gXCJhdHRyKHgpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8IGNzc1tpXS52YWx1ZXNbXCJjb250ZW50XCJdLnRyaW0oKSA9PT0gXCJhdHRyKHkpXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBjaGVjayBzcGVjaWFsIHJ1bGVzIGluIHRoZSBzdHlsZXNoZWV0c1xuICAgICAgICAgICAgaWYgKHBhc3NlZCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHNJbmRleCA9IDA7IHNJbmRleCA8IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHMubGVuZ3RoOyBzSW5kZXgrKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgc2hlZXQgPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LnN0eWxlU2hlZXRzW3NJbmRleF0gYXMgQ1NTU3R5bGVTaGVldDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNoZWV0Lm93bmVyTm9kZSA9PT0gcnVsZUNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0eWxlUnVsZXMgPSBzaGVldC5jc3NSdWxlcyA/IHNoZWV0LmNzc1J1bGVzIDogc2hlZXQucnVsZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlUnVsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgc3R5bGVSdWxlSW5kZXggPSAwOyBwYXNzZWQgJiYgc3R5bGVSdWxlSW5kZXggPCBzdHlsZVJ1bGVzLmxlbmd0aDsgc3R5bGVSdWxlSW5kZXgrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0eWxlUnVsZSA9IHN0eWxlUnVsZXNbc3R5bGVSdWxlSW5kZXhdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBAbWVkaWEgcnVsZXMgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGNoZWNrICdpZiAoc3R5bGVSdWxlIGluc3RhbmNlb2YgQ1NTTWVkaWFSdWxlKScgZG9lc24ndCB3b3JrIHdoZW4gcnVuIGluIEthcm1hKGJ1dCB3b3JrcyBpbiBEQVApIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc28gbGV0J3MgYWNjZXNzIHRoZSB0eXBlIGRpcmVjdGx5IGFzIGEgd29ya2Fyb3VuZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0eWxlSW1wb3J0UnVsZTogQ1NTSW1wb3J0UnVsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZVJ1bGUudHlwZSAmJiBzdHlsZVJ1bGUudHlwZSA9PT0gNCAvKiBDU1NSdWxlLk1FRElBX1JVTEUgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3R5bGVNZWRpYVJ1bGUgPSBzdHlsZVJ1bGUgYXMgQ1NTTWVkaWFSdWxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtZWRpYVJ1bGVzID0gc3R5bGVNZWRpYVJ1bGUuY3NzUnVsZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lZGlhUnVsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgckluZGV4ID0gMDsgcGFzc2VkICYmIHJJbmRleCA8IG1lZGlhUnVsZXMubGVuZ3RoOyBySW5kZXgrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1SdWxlID0gbWVkaWFSdWxlc1tySW5kZXhdIGFzIGFueTsgLy8gc2VsZWN0b3JUZXh0IG5vdCByZWNvZ25pemVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVJ1bGUuc2VsZWN0b3JUZXh0ICE9PSBudWxsICYmIG1SdWxlLnNlbGVjdG9yVGV4dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGUgPSBtUnVsZS5zZWxlY3RvclRleHQudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZS5pbmRleE9mKFwiOmJlZm9yZVwiKSAhPT0gLTEgfHwgcnVsZS5pbmRleE9mKFwiOmFmdGVyXCIpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29udGVudCA9IG1SdWxlLnN0eWxlWydjb250ZW50J107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50ICYmIGNvbnRlbnQudHJpbSgpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQudHJpbSgpICE9PSBcIlxcXCJcXFwiXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LnRyaW0oKSAhPT0gXCJcXCdcXCdcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcIm5vbmVcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcImF0dHIoeClcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcImF0dHIoeSlcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBpbXBvcnQgcnVsZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0eWxlUnVsZS50eXBlICYmIHN0eWxlUnVsZS50eXBlID09PSAzIC8qIENTU1J1bGUuSU1QT1JUX1JVTEUgKi8gJiYgKHN0eWxlSW1wb3J0UnVsZSA9IHN0eWxlUnVsZSBhcyBDU1NJbXBvcnRSdWxlKS5zdHlsZVNoZWV0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGVzID0gc3R5bGVJbXBvcnRSdWxlLnN0eWxlU2hlZXQuY3NzUnVsZXMgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZUltcG9ydFJ1bGUuc3R5bGVTaGVldC5jc3NSdWxlcyA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlSW1wb3J0UnVsZS5zdHlsZVNoZWV0LnJ1bGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBySW5kZXggPSAwOyBwYXNzZWQgJiYgckluZGV4IDwgcnVsZXMubGVuZ3RoOyBySW5kZXgrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGltcG9ydGVkUnVsZSA9IHJ1bGVzW3JJbmRleF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBAbWVkaWEgcnVsZXMgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW1wb3J0ZWRSdWxlLnR5cGUgJiYgaW1wb3J0ZWRSdWxlLnR5cGUgPT09IDQgLyogQ1NTUnVsZS5NRURJQV9SVUxFICovKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1lZGlhUnVsZXMgPSAoaW1wb3J0ZWRSdWxlIGFzIENTU01lZGlhUnVsZSkuY3NzUnVsZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lZGlhUnVsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgbUluZGV4ID0gMDsgbUluZGV4IDwgbWVkaWFSdWxlcy5sZW5ndGg7IG1JbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbVJ1bGUgPSBtZWRpYVJ1bGVzW21JbmRleF0gYXMgYW55OyAvLyBzZWxlY3RvclRleHQgbm90IHJlY29nbml6ZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtUnVsZS5zZWxlY3RvclRleHQgIT09IG51bGwgJiYgbVJ1bGUuc2VsZWN0b3JUZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcnVsZSA9IG1SdWxlLnNlbGVjdG9yVGV4dC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlLmluZGV4T2YoXCI6YmVmb3JlXCIpICE9PSAtMSB8fCBydWxlLmluZGV4T2YoXCI6YWZ0ZXJcIikgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb250ZW50ID0gbVJ1bGUuc3R5bGVbJ2NvbnRlbnQnXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQgJiYgY29udGVudC50cmltKCkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudC50cmltKCkgIT09IFwiXFxcIlxcXCJcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcIlxcJ1xcJ1wiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC50cmltKCkgIT09IFwibm9uZVwiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC50cmltKCkgIT09IFwiYXR0cih4KVwiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC50cmltKCkgIT09IFwiYXR0cih5KVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgoaW1wb3J0ZWRSdWxlIGFzIGFueSkuc2VsZWN0b3JUZXh0ICE9PSBudWxsICYmIChpbXBvcnRlZFJ1bGUgYXMgYW55KS5zZWxlY3RvclRleHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBydWxlID0gKGltcG9ydGVkUnVsZSBhcyBhbnkpLnNlbGVjdG9yVGV4dC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vc3VwcG9ydCBib3RoIHNpbmdsZSBjb2xvbiAoOikgYW5kIGRvdWJsZSBjb2xvbiAoOjopIHBzZXVkbyAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlLmluZGV4T2YoXCI6YmVmb3JlXCIpICE9PSAtMSB8fCBydWxlLmluZGV4T2YoXCI6YWZ0ZXJcIikgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb250ZW50ID0gKGltcG9ydGVkUnVsZSBhcyBhbnkpLnN0eWxlWydjb250ZW50J107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50ICYmIGNvbnRlbnQudHJpbSgpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQudHJpbSgpICE9PSBcIlxcXCJcXFwiXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LnRyaW0oKSAhPT0gXCJcXCdcXCdcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcIm5vbmVcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcImF0dHIoeClcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcImF0dHIoeSlcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBjc3MgYWNjZXNzIGlzc3Vlc1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy9jaGVjayBleHRlcm5hbCBzdHlsZXMgXG4gICAgICAgIGlmIChydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImxpbmtcIiAmJiBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJyZWxcIikgJiZcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInJlbFwiKS50b0xvd2VyQ2FzZSgpID09PSBcInN0eWxlc2hlZXRcIiAmJlxuICAgICAgICAgICAgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiaHJlZlwiKSAmJiBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJocmVmXCIpLnRyaW0oKS5sZW5ndGggIT09IDApIHtcblxuICAgICAgICAgICAgZm9yIChsZXQgc0luZGV4ID0gMDsgc0luZGV4IDwgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5zdHlsZVNoZWV0cy5sZW5ndGg7IHNJbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNoZWV0ID0gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5zdHlsZVNoZWV0c1tzSW5kZXhdIGFzIENTU1N0eWxlU2hlZXQ7XG4gICAgICAgICAgICAgICAgaWYgKHNoZWV0ICYmIHNoZWV0Lm93bmVyTm9kZSA9PT0gcnVsZUNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBydWxlcyA9IHNoZWV0LmNzc1J1bGVzID8gc2hlZXQuY3NzUnVsZXMgOiBzaGVldC5ydWxlcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHJJbmRleCA9IDA7IHBhc3NlZCAmJiBySW5kZXggPCBydWxlcy5sZW5ndGg7IHJJbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBydWxlRnJvbUxpbmsgPSBydWxlc1tySW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBAbWVkaWEgcnVsZXMgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlRnJvbUxpbmsudHlwZSAmJiBydWxlRnJvbUxpbmsudHlwZSA9PT0gNCAvKiBDU1NSdWxlLk1FRElBX1JVTEUgKi8pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtZWRpYVJ1bGVzID0gKHJ1bGVGcm9tTGluayBhcyBDU1NNZWRpYVJ1bGUpLmNzc1J1bGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1lZGlhUnVsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBtSW5kZXggPSAwOyBwYXNzZWQgJiYgbUluZGV4IDwgbWVkaWFSdWxlcy5sZW5ndGg7IG1JbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtUnVsZSA9IG1lZGlhUnVsZXNbbUluZGV4XSBhcyBhbnk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtUnVsZS5zZWxlY3RvclRleHQgIT09IG51bGwgJiYgbVJ1bGUuc2VsZWN0b3JUZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBydWxlU2VsVHh0ID0gbVJ1bGUuc2VsZWN0b3JUZXh0LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZVNlbFR4dC5pbmRleE9mKFwiOmJlZm9yZVwiKSAhPT0gLTEgfHwgcnVsZVNlbFR4dC5pbmRleE9mKFwiOmFmdGVyXCIpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb250ZW50ID0gbVJ1bGUuc3R5bGVbJ2NvbnRlbnQnXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudCAmJiBjb250ZW50LnRyaW0oKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQudHJpbSgpICE9PSBcIlxcXCJcXFwiXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcIlxcJ1xcJ1wiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LnRyaW0oKSAhPT0gXCJub25lXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcImF0dHIoeClcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC50cmltKCkgIT09IFwiYXR0cih5KVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgocnVsZXNbckluZGV4XSBhcyBhbnkpLnNlbGVjdG9yVGV4dCAhPT0gbnVsbCAmJiAocnVsZXNbckluZGV4XSBhcyBhbnkpLnNlbGVjdG9yVGV4dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcnVsZSA9IChydWxlc1tySW5kZXhdIGFzIGFueSkuc2VsZWN0b3JUZXh0LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3N1cHBvcnQgYm90aCBzaW5nbGUgY29sb24gKDopIGFuZCBkb3VibGUgY29sb24gKDo6KSBwc2V1ZG8gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlLmluZGV4T2YoXCI6YmVmb3JlXCIpICE9PSAtMSB8fCBydWxlLmluZGV4T2YoXCI6YWZ0ZXJcIikgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSAocnVsZXNbckluZGV4XSBhcyBhbnkpLnN0eWxlWydjb250ZW50J107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQgJiYgY29udGVudC50cmltKCkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50LnRyaW0oKSAhPT0gXCJcXFwiXFxcIlwiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LnRyaW0oKSAhPT0gXCJcXCdcXCdcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudC50cmltKCkgIT09IFwibm9uZVwiICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50LnRyaW0oKSAhPT0gXCJhdHRyKHgpXCIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQudHJpbSgpICE9PSBcImF0dHIoeSlcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBjc3MgYWNjZXNzIGlzc3Vlc1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCBzdHlsZV9jb2xvcl9taXN1c2U6IFJ1bGUgPSB7XG4gICAgaWQ6IFwic3R5bGVfY29sb3JfbWlzdXNlXCIsXG4gICAgY29udGV4dDogXCJkb206c3R5bGUsIGRvbToqW3N0eWxlXSwgZG9tOmZvbnRbY29sb3JdLCBkb206bGlua1wiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX1N0eWxlX0NvbG9yU2VtYW50aWNzMVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogYHN0eWxlX2NvbG9yX21pc3VzZS5odG1sYCxcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IGBzdHlsZV9jb2xvcl9taXN1c2UuaHRtbGAsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IGBzdHlsZV9jb2xvcl9taXN1c2UuaHRtbGBcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQ29tYmluZSBjb2xvciBhbmQgZGVzY3JpcHRpdmUgbWFya3VwIHRvIGNvbnZleSBpbmZvcm1hdGlvblwiLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlZlcmlmeSBjb2xvciBpcyBub3QgdXNlZCBhcyB0aGUgb25seSB2aXN1YWwgbWVhbnMgb2YgY29udmV5aW5nIGluZm9ybWF0aW9uXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIG51bTogXCIxLjQuMVwiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgbGV0IHN0eWxlVGV4dCA9IFwiXCI7XG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJzdHlsZVwiKSB7XG4gICAgICAgICAgICBzdHlsZVRleHQgPSBDb21tb25VdGlsLmdldElubmVyVGV4dChydWxlQ29udGV4dCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIC8vIGNoZWNrIGltcG9ydFxuICAgICAgICAgICAgZm9yIChsZXQgc0luZGV4ID0gMDsgc0luZGV4IDwgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5zdHlsZVNoZWV0cy5sZW5ndGg7IHNJbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNoZWV0ID0gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5zdHlsZVNoZWV0c1tzSW5kZXhdIGFzIENTU1N0eWxlU2hlZXQ7XG4gICAgICAgICAgICAgICAgaWYgKHNoZWV0ICYmIHNoZWV0Lm93bmVyTm9kZSA9PT0gcnVsZUNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHlsZVJ1bGVzID0gc2hlZXQuY3NzUnVsZXMgPyBzaGVldC5jc3NSdWxlcyA6IHNoZWV0LnJ1bGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgc3R5bGVSdWxlSW5kZXggPSAwOyBzdHlsZVJ1bGVJbmRleCA8IHN0eWxlUnVsZXMubGVuZ3RoOyBzdHlsZVJ1bGVJbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0eWxlUnVsZSA9IHN0eWxlUnVsZXNbc3R5bGVSdWxlSW5kZXhdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHlsZUltcG9ydFJ1bGU6IENTU0ltcG9ydFJ1bGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlUnVsZS50eXBlICYmIHN0eWxlUnVsZS50eXBlID09PSAzIC8qIENTU1J1bGUuSU1QT1JUX1JVTEUgKi8gJiYgKHN0eWxlSW1wb3J0UnVsZSA9IHN0eWxlUnVsZSBhcyBDU1NJbXBvcnRSdWxlKS5zdHlsZVNoZWV0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbXBvcnRSdWxlcyA9IHN0eWxlSW1wb3J0UnVsZS5zdHlsZVNoZWV0LmNzc1J1bGVzID8gc3R5bGVJbXBvcnRSdWxlLnN0eWxlU2hlZXQuY3NzUnVsZXMgOiBzdHlsZUltcG9ydFJ1bGUuc3R5bGVTaGVldC5ydWxlcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgckluZGV4ID0gMDsgckluZGV4IDwgaW1wb3J0UnVsZXMubGVuZ3RoOyBySW5kZXgrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGlSdWxlID0gaW1wb3J0UnVsZXNbckluZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlVGV4dCArPSBpUnVsZS5jc3NUZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTaWxlbmNlIGNzcyBhY2Nlc3MgaXNzdWVzXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwic3R5bGVcIikpIHtcbiAgICAgICAgICAgIHN0eWxlVGV4dCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInN0eWxlXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobm9kZU5hbWUgPT09IFwibGlua1wiICYmIC8vY2hlY2sgZXh0ZXJuYWwgc3R5bGVzXG4gICAgICAgICAgICBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJyZWxcIikgJiZcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInJlbFwiKS50b0xvd2VyQ2FzZSgpID09PSBcInN0eWxlc2hlZXRcIiAmJlxuICAgICAgICAgICAgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiaHJlZlwiKSAmJlxuICAgICAgICAgICAgcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKS50cmltKCkubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBzSW5kZXggPSAwOyBzSW5kZXggPCBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LnN0eWxlU2hlZXRzLmxlbmd0aDsgc0luZGV4KyspIHtcbiAgICAgICAgICAgICAgICBsZXQgc2hlZXQgPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LnN0eWxlU2hlZXRzW3NJbmRleF0gYXMgQ1NTU3R5bGVTaGVldDtcbiAgICAgICAgICAgICAgICBpZiAoc2hlZXQgJiYgc2hlZXQub3duZXJOb2RlID09PSBydWxlQ29udGV4dCkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGVzID0gc2hlZXQuY3NzUnVsZXMgPyBzaGVldC5jc3NSdWxlcyA6IHNoZWV0LnJ1bGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgckluZGV4ID0gMDsgckluZGV4IDwgcnVsZXMubGVuZ3RoOyBySW5kZXgrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlVGV4dCArPSBydWxlc1tySW5kZXhdLmNzc1RleHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNpbGVuY2UgY3NzIGFjY2VzcyBpc3N1ZXNcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcblxuICAgICAgICAvLyBEZWZlY3QgMTAyMjogRmluZCB1c2VzIG9mICdjb2xvcicgYW5kICcqYmFja2dyb3VuZConIG9ubHlcbiAgICAgICAgbGV0IGlzQmdVc2VkID0gc3R5bGVUZXh0Lm1hdGNoKC9cXGJiYWNrZ3JvdW5kXFxiL2kpO1xuXG4gICAgICAgIGxldCB0aGVDb2xvclN0eWxlVG9DaGVjayA9IHN0eWxlVGV4dC5yZXBsYWNlKC8tY29sb3IvZywgXCJcIik7XG4gICAgICAgIGxldCBpc0NvbG9yVXNlZCA9IHRoZUNvbG9yU3R5bGVUb0NoZWNrLm1hdGNoKC9cXGJjb2xvclxcYi9pKTtcblxuICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiY29sb3JcIikgfHwgaXNDb2xvclVzZWQgfHwgaXNCZ1VzZWQpIHtcbiAgICAgICAgICAgIGxldCBnb29kVGFnTmFtZXMgPSB7XG4gICAgICAgICAgICAgICAgXCJlbVwiOiBcIlwiLCBcInN0cm9uZ1wiOiBcIlwiLCBcImNpdGVcIjogXCJcIiwgXCJkZm5cIjogXCJcIixcbiAgICAgICAgICAgICAgICBcImNvZGVcIjogXCJcIiwgXCJzYW1wXCI6IFwiXCIsIFwia2JkXCI6IFwiXCIsIFwidmFyXCI6IFwiXCIsIFwiYWJiclwiOiBcIlwiLCBcImFjcm9ueW1cIjogXCJcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQ29sb3IgdXNlZCDvv70gYXJlIHRoZXJlIHNlbWFudGljcyBpbnZvbHZlZD9cbiAgICAgICAgICAgIHBhc3NlZCA9IG5vZGVOYW1lIGluIGdvb2RUYWdOYW1lcyB8fFxuICAgICAgICAgICAgICAgIENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIGdvb2RUYWdOYW1lcykgIT09IG51bGw7XG4gICAgICAgICAgICBpZiAoIXBhc3NlZCAmJiBydWxlQ29udGV4dC5oYXNDaGlsZE5vZGVzKCkpIHtcbiAgICAgICAgICAgICAgICBsZXQgbncgPSBuZXcgRE9NV2Fsa2VyKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgICAgICB3aGlsZSAoIXBhc3NlZCAmJiBudy5uZXh0Tm9kZSgpICYmIG53Lm5vZGUgIT09IHJ1bGVDb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IG53Lm5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSBpbiBnb29kVGFnTmFtZXM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIFRyaWdnZXIgb25seSBvbmNlXG4gICAgICAgIGlmICghcGFzc2VkKSB7XG4gICAgICAgICAgICBsZXQgdHJpZ2dlcmVkID0gQ2FjaGVVdGlsLmdldENhY2hlKHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQsIFwic3R5bGVfY29sb3JfbWlzdXNlXCIsIGZhbHNlKTtcbiAgICAgICAgICAgIHBhc3NlZCA9IHRyaWdnZXJlZDtcbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShydWxlQ29udGV4dC5vd25lckRvY3VtZW50LCBcInN0eWxlX2NvbG9yX21pc3VzZVwiLCB0cnVlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ1NTVXRpbCB9IGZyb20gXCIuLi91dGlsL0NTU1V0aWxcIjtcbmltcG9ydCB7IENvbG9yVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbG9yVXRpbFwiO1xuXG5leHBvcnQgY29uc3Qgc3R5bGVfZm9jdXNfdmlzaWJsZTogUnVsZSA9IHtcbiAgICBpZDogXCJzdHlsZV9mb2N1c192aXNpYmxlXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX1N0eWxlX0hpbmRlckZvY3VzMVwiOiB7XG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwicG90ZW50aWFsX2ZvY3VzX25vdF92aXNpYmxlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogYHN0eWxlX2ZvY3VzX3Zpc2libGUuaHRtbGAsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9mb2N1c19ub3RfdmlzaWJsZVwiOiBgc3R5bGVfZm9jdXNfdmlzaWJsZS5odG1sYCxcbiAgICAgICAgICAgIFwicGFzc19mb2N1c192aXNpYmxlXCI6IGBzdHlsZV9mb2N1c192aXNpYmxlLmh0bWxgXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSBrZXlib2FyZCBmb2N1cyBpbmRpY2F0b3Igc2hvdWxkIGJlIHZpc2libGUgd2hlbiBkZWZhdWx0IGJvcmRlciBvciBvdXRsaW5lIGlzIG1vZGlmaWVkIGJ5IENTU1wiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfZm9jdXNfbm90X3Zpc2libGVcIjogXCJDaGVjayB0aGUga2V5Ym9hcmQgZm9jdXMgaW5kaWNhdG9yIGlzIHZpc2libGUgd2hlbiB1c2luZyBDU1MgZGVjbGFyYXRpb24gZm9yICdib3JkZXInIG9yICdvdXRsaW5lJ1wiLFxuICAgICAgICAgICAgXCJwYXNzX2ZvY3VzX3Zpc2libGVcIjogXCJUaGUga2V5Ym9hcmQgZm9jdXMgaW5kaWNhdG9yIGlzIHZpc2libGUgb3IgaXMgbm90IGNoYW5nZWQgZnJvbSB0aGUgYnJvd3NlciBkZWZhdWx0XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIG51bTogXCIyLjQuN1wiLCAvLyBudW06IFsgXCIyLjQuNFwiLCBcIngueS56XCIgXSBhbHNvIGFsbG93ZWRcbiAgICAgICAgbGV2ZWw6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgdG9vbGtpdExldmVsOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgdmFsaWRhdGVQYXJhbXMgPSB7XG4gICAgICAgICAgICBza2lwTm9kZXM6IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogW1widGFibGVcIl0sXG4gICAgICAgICAgICAgICAgdHlwZTogXCJbc3RyaW5nXVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2hlY2tQYXJhbXM6IHtcbiAgICAgICAgICAgICAgICB2YWx1ZTogW1wiYm9yZGVyXCIsIFwiYm9yZGVyLXdpZHRoXCIsIFwiYm9yZGVyLXN0eWxlXCIsIFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJib3JkZXItdG9wLXdpZHRoXCIsIFwiYm9yZGVyLXJpZ2h0LXdpZHRoXCIsIFwiYm9yZGVyLWJvdHRvbS13aWR0aFwiLCBcImJvcmRlci1sZWZ0LXdpZHRoXCIsIFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJib3JkZXItdG9wLWNvbG9yXCIsIFwiYm9yZGVyLXJpZ2h0LWNvbG9yXCIsIFwiYm9yZGVyLWJvdHRvbS1jb2xvclwiLCBcImJvcmRlci1sZWZ0LWNvbG9yXCIsIFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJib3JkZXItdG9wLXN0eWxlXCIsIFwiYm9yZGVyLXJpZ2h0LXN0eWxlXCIsIFwiYm9yZGVyLWJvdHRvbS1zdHlsZVwiLCBcImJvcmRlci1sZWZ0LXN0eWxlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIm91dGxpbmVcIiwgXCJvdXRsaW5lLXdpZHRoXCIsIFwib3V0bGluZS1jb2xvclwiLCBcIm91dGxpbmUtc3R5bGVcIl0sXG4gICAgICAgICAgICAgICAgdHlwZTogXCJbc3RyaW5nXVwiXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGlmICghQ29tbW9uVXRpbC5pc1RhYmJhYmxlKHJ1bGVDb250ZXh0KSB8fCB2YWxpZGF0ZVBhcmFtcy5za2lwTm9kZXMudmFsdWUuaW5jbHVkZXMocnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIC8vIEdldCBhbGwgc3R5bGVzIGluIGEgc2luZ2xlIHBhc3MgdGhyb3VnaCBzdHlsZXNoZWV0c1xuICAgICAgICBjb25zdCBhbGxTdHlsZXMgPSBDU1NVdGlsLmdldERlZmluZWRTdHlsZXNNdWx0aXBsZShydWxlQ29udGV4dCwgbnVsbCwgW1wiXCIsIFwiOmZvY3VzXCIsIFwiOmZvY3VzLXZpc2libGVcIiwgXCI6Zm9jdXMtd2l0aGluXCJdKTtcbiAgICAgICAgbGV0IG5vcm1hbFN0eWxlcyA9IGFsbFN0eWxlc1tcIlwiXTsgLy8gY29uc2lkZXIgYm90aCB1c2VyLWRlZmluZWQgYW5kIGJyb3dzZXIgZGVmYXVsdFxuICAgICAgICBsZXQgZm9jdXNTdHlsZXMgPSBbXVxuICAgICAgICBmb2N1c1N0eWxlcy5wdXNoKGFsbFN0eWxlc1tcIjpmb2N1c1wiXSk7XG4gICAgICAgIGZvY3VzU3R5bGVzLnB1c2goYWxsU3R5bGVzW1wiOmZvY3VzLXZpc2libGVcIl0pO1xuICAgICAgICBmb2N1c1N0eWxlcy5wdXNoKGFsbFN0eWxlc1tcIjpmb2N1cy13aXRoaW5cIl0pO1xuICAgICAgICBcbiAgICAgICAgLy8gaWYgZm9jdXMgc3R5bGUgaXMgZGVmaW5lZFxuICAgICAgICBsZXQgc3R5bGVPYmogPSBmb2N1c1N0eWxlc1swXTtcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHN0eWxlT2JqKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvL3Bhc3MgaWYgb3V0bGluZSBpcyBub3QgZGVmaW5lZCBhdCBhbGwsIGJyb3dzZXIgd2lsbCBvdmVycmlkZSBcbiAgICAgICAgICAgIGlmICgoKCFub3JtYWxTdHlsZXNbXCJvdXRsaW5lLXdpZHRoXCJdICYmICFub3JtYWxTdHlsZXNbXCJvdXRsaW5lLXN0eWxlXCJdKVxuICAgICAgICAgICAgICAgIHx8IChub3JtYWxTdHlsZXNbXCJvdXRsaW5lLXdpZHRoXCJdID09PSAnMHB4JyB8fCBub3JtYWxTdHlsZXNbXCJvdXRsaW5lLXN0eWxlXCJdID09PSAnbm9uZScpKVxuICAgICAgICAgICAgICAgICYmICghc3R5bGVPYmpbXCJvdXRsaW5lLXN0eWxlXCJdIHx8IHN0eWxlT2JqW1wib3V0bGluZS1zdHlsZVwiXSAhPT0gJ25vbmUnKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzX2ZvY3VzX3Zpc2libGVcIik7ICAgICAgIFxuXG4gICAgICAgICAgICBsZXQgbm9uZVN0eWxlID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgbnVtT3RoZXJTdHlsZSA9IDA7XG4gICAgICAgICAgICBmb3IgKGxldCBmb2N1c1N0eWxlIGluIHN0eWxlT2JqKSB7XG4gICAgICAgICAgICAgICAgaWYgKHZhbGlkYXRlUGFyYW1zLmNoZWNrUGFyYW1zLnZhbHVlLmluY2x1ZGVzKGZvY3VzU3R5bGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAgICAgKiBmYWlsdXJlIGNhc2U6ICBcbiAgICAgICAgICAgICAgICAgICAgICogIDEuIGZvY3VzIG91dGxpbmUgb3IgYm9yZGVyIHN0eWxlIGlzIG5vbmUgYW5kIG5vIG90aGVyIHN0eWxlIChjb2xvciBvciB3aWR0aCkgZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgKiAgMi4gZm9jdXMgb3V0bGluZSBvciBib3JkZXIgc3R5bGUgaXMgc2FtZSB3aXRoIHRoZSBub3JtYWxcbiAgICAgICAgICAgICAgICAgICAgICogIDMuIHNpemUgaW4gZm9jdXMgaXMgc2FtZSBvciBzbWFsbGVyIHRoYW4gZGVmYXVsdFxuICAgICAgICAgICAgICAgICAgICAgKiAgNC4gY29sb3IgY29udHJhc3QgaW4gZm9jdXMgaXMgYmV0dGVyICBcbiAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgICAgIGxldCBmb2N1c1N0eWxlVmFsdWUgPSBzdHlsZU9ialtmb2N1c1N0eWxlXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5vcm1hbFN0eWxlVmFsdWUgPSBub3JtYWxTdHlsZXNbZm9jdXNTdHlsZV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChmb2N1c1N0eWxlLmluY2x1ZGVzKFwic3R5bGVcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb2N1c1N0eWxlVmFsdWUgPT09IFwibm9uZVwiKSBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25lU3R5bGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25lU3R5bGUgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vcm1hbFN0eWxlVmFsdWUgJiYgZm9jdXNTdHlsZVZhbHVlICE9PSBcIm5vbmVcIiAmJiBmb2N1c1N0eWxlVmFsdWUgPT09IG5vcm1hbFN0eWxlVmFsdWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfZm9jdXNfbm90X3Zpc2libGVcIik7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZvY3VzU3R5bGUuaW5jbHVkZXMoXCJ3aWR0aFwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbnVtT3RoZXJTdHlsZSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAvL3Byb3hpbWF0aW9uIG9mIHRoZSB3aWR0aCBzdHlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvY3VzU3R5bGVWYWx1ZSA9PT0gJ2luaXRpYWwnKSBmb2N1c1N0eWxlVmFsdWUgPSAnMnB4JztcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZvY3VzU3R5bGVWYWx1ZSA9PT0gJ3RoaW4nKSBmb2N1c1N0eWxlVmFsdWUgPSAnMXB4JztcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZvY3VzU3R5bGVWYWx1ZSA9PT0gJ21lZGl1bScpIGZvY3VzU3R5bGVWYWx1ZSA9ICcycHgnO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZm9jdXNTdHlsZVZhbHVlID09PSAndGhpY2snKSBmb2N1c1N0eWxlVmFsdWUgPSAnM3B4JzsgIFxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9ybWFsU3R5bGVWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub3JtYWxTdHlsZVZhbHVlID09PSAnaW5pdGlhbCcpIG5vcm1hbFN0eWxlVmFsdWUgPSAnMnB4JztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChub3JtYWxTdHlsZVZhbHVlID09PSAndGhpbicpIG5vcm1hbFN0eWxlVmFsdWUgPSAnMXB4JztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChub3JtYWxTdHlsZVZhbHVlID09PSAnbWVkaXVtJykgbm9ybWFsU3R5bGVWYWx1ZSA9ICcycHgnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5vcm1hbFN0eWxlVmFsdWUgPT09ICd0aGljaycpIG5vcm1hbFN0eWxlVmFsdWUgPSAnM3B4JzsgIFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZm9jdXNTdHlsZVZhbHVlID0gQ1NTVXRpbC5nZXRQaXhlbHNGcm9tU3R5bGUoZm9jdXNTdHlsZVZhbHVlLCBydWxlQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxTdHlsZVZhbHVlID0gQ1NTVXRpbC5nZXRQaXhlbHNGcm9tU3R5bGUobm9ybWFsU3R5bGVWYWx1ZSwgcnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvY3VzU3R5bGVWYWx1ZSA9PSAwIHx8IGZvY3VzU3R5bGVWYWx1ZSA8PSBub3JtYWxTdHlsZVZhbHVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX2ZvY3VzX25vdF92aXNpYmxlXCIpO1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmb2N1c1N0eWxlLmluY2x1ZGVzKFwiY29sb3JcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG51bU90aGVyU3R5bGUrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBlbGVtZW50IGJnIGNvbG9yXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29sb3JDb21ibyA9IENvbG9yVXRpbC5Db2xvckNvbWJvKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2xvckNvbWJvID09PSBudWxsKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBiZyA9IGNvbG9yQ29tYm8uYmc7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWJnKSBjb250aW51ZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy9wcm94aW1hdGlvbiBvZiB0aGUgd2lkdGggc3R5bGVcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb2N1c1N0eWxlVmFsdWUgPT09ICdpbml0aWFsJykgZm9jdXNTdHlsZVZhbHVlID0gJ2JsYWNrJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub3JtYWxTdHlsZVZhbHVlICYmIG5vcm1hbFN0eWxlVmFsdWUgPT09ICdpbml0aWFsJykgbm9ybWFsU3R5bGVWYWx1ZSA9ICdibGFjayc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGJvcmRlci9vdXRsaW5lIGNvbG9yIGFzIGZnIGNvbG9yc1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9jdXNTdHlsZVZhbHVlID0gQ29sb3JVdGlsLkNvbG9yKGZvY3VzU3R5bGVWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxTdHlsZVZhbHVlID0gQ29sb3JVdGlsLkNvbG9yKG5vcm1hbFN0eWxlVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvY3VzU3R5bGVWYWx1ZSA9PT0gbnVsbCB8fCBub3JtYWxTdHlsZVZhbHVlID09PSBudWxsKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgLy9nZXQgdGhlIGJvcmRlci9vdXRsaW5lIGNvbG9yIGNvbnRyYXN0IHJhdGlvc1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZvY3VzUmF0aW8gPSBmb2N1c1N0eWxlVmFsdWUuY29udHJhc3RSYXRpbyhiZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbm9ybWFsUmF0aW8gPSBub3JtYWxTdHlsZVZhbHVlLmNvbnRyYXN0UmF0aW8oYmcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvY3VzUmF0aW8gPCAzLjAgfHwgZm9jdXNSYXRpbyA8PSBub3JtYWxSYXRpbylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF9mb2N1c19ub3RfdmlzaWJsZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vb3RoZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIG51bU90aGVyU3R5bGUrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub3JtYWxTdHlsZVZhbHVlICE9IG51bGwgJiYgZm9jdXNTdHlsZVZhbHVlID09PSBub3JtYWxTdHlsZVZhbHVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX2ZvY3VzX25vdF92aXNpYmxlXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gd2FybiBpZiBhIGJvcmRlci9vdXRsaW5lIGZvY3VzIHN0eWxlIGlzICdub25lJyBhbmQgbm9lIG90aGVyIChjb2xvciBhbmQvb3Igd2lkdGgpIGlzIGRlZmluZWQgXG4gICAgICAgICAgICBpZiAobm9uZVN0eWxlICYmIG51bU90aGVyU3R5bGUgPT09IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfZm9jdXNfbm90X3Zpc2libGVcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBubyBmb2N1cyBzdHlsZSBkZWZpbmVkIFxuICAgICAgICAgICAgLy8gd2FybiBpZiBub3JtYWwgc3R5bGUgaXMgZGVmaW5lZCBhbmQgaXMgbm90IFwibm9uZVwiXG4gICAgICAgICAgICBmb3IgKGxldCBub3JtYWxTdHlsZSBpbiBub3JtYWxTdHlsZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAodmFsaWRhdGVQYXJhbXMuY2hlY2tQYXJhbXMudmFsdWUuaW5jbHVkZXMobm9ybWFsU3R5bGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBub3JtYWxTdHlsZVZhbHVlID0gbm9ybWFsU3R5bGVzW25vcm1hbFN0eWxlXTtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIGlmIGJvcmRlciBvciBvdXRsaW5lIHN0eWxlIGlzIFwibm9uZVwiIFxuICAgICAgICAgICAgICAgICAgICBpZiAobm9ybWFsU3R5bGVWYWx1ZSAhPT0gJ25vbmUnKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfZm9jdXNfbm90X3Zpc2libGVcIik7XG4gICAgICAgICAgICAgICAgfSAgICAgICAgXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gICBcbiAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc19mb2N1c192aXNpYmxlXCIpO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZU1hbnVhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDYWNoZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9DYWNoZVV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IHN0eWxlX2hpZ2hjb250cmFzdF92aXNpYmxlOiBSdWxlID0ge1xuICAgIGlkOiBcInN0eWxlX2hpZ2hjb250cmFzdF92aXNpYmxlXCIsXG4gICAgY29udGV4dDogXCJkb206c3R5bGUsIGRvbTpsaW5rLCBkb206KltzdHlsZV1cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlJQVF9TdHlsZV9UcmlnZ2VyMlwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJNYW51YWxfMVwiOiBcIk1hbnVhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJzdHlsZV9oaWdoY29udHJhc3RfdmlzaWJsZS5odG1sXCIsXG4gICAgICAgICAgICBcIk1hbnVhbF8xXCI6IFwic3R5bGVfaGlnaGNvbnRyYXN0X3Zpc2libGUuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInN0eWxlX2hpZ2hjb250cmFzdF92aXNpYmxlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiTWFudWFsXzFcIjogXCJDb25maXJtIFdpbmRvd3MgaGlnaCBjb250cmFzdCBtb2RlIGlzIHN1cHBvcnRlZCB3aGVuIHVzaW5nIENTUyB0byBpbmNsdWRlLCBwb3NpdGlvbiBvciBhbHRlciBub24tZGVjb3JhdGl2ZSBjb250ZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiV2luZG93cyBoaWdoIGNvbnRyYXN0IG1vZGUgbXVzdCBiZSBzdXBwb3J0ZWQgd2hlbiB1c2luZyBDU1MgdG8gaW5jbHVkZSwgcG9zaXRpb24gb3IgYWx0ZXIgbm9uLWRlY29yYXRpdmUgY29udGVudFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4xLjFcIiwgXCIxLjMuMlwiLCBcIjEuNC4xMVwiXSwgIC8vb3RoZXIgXCJzdHlsZVwiIHJ1bGVzIGZvciBmb2N1cywgaG92ZXIsIGFuZCBjb2xvclxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9PTkVcbiAgICB9LFxuICAgIHtcbiAgICAgICAgXCJpZFwiOiBbXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCIsIFwiMS4zLjJcIiwgXCIxLjQuMTFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwibGlua1wiICYmXG4gICAgICAgICAgICAoIXJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInJlbFwiKSB8fCBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJyZWxcIikudG9Mb3dlckNhc2UoKSAhPT0gXCJzdHlsZXNoZWV0XCIpKVxuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAobm9kZU5hbWUgIT09IFwic3R5bGVcIiAmJiBub2RlTmFtZSAhPT0gXCJsaW5rXCIgJiZcbiAgICAgICAgICAgIHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcInN0eWxlXCIpICYmIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInN0eWxlXCIpLnRyaW0oKS5sZW5ndGggPT09IDApXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGxldCB0cmlnZ2VyZWQgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUocnVsZUNvbnRleHQub3duZXJEb2N1bWVudCwgXCJzdHlsZV9oaWdoY29udHJhc3RfdmlzaWJsZVwiLCBmYWxzZSk7XG4gICAgICAgIGxldCBwYXNzZWQgPSB0cmlnZ2VyZWQ7XG4gICAgICAgIC8vICAgICAgICBQYWNrYWdlcy5qYXZhLmxhbmcuU3lzdGVtLm91dC5wcmludGxuKHRyaWdnZXJlZCk7XG4gICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShydWxlQ29udGV4dC5vd25lckRvY3VtZW50LCBcInN0eWxlX2hpZ2hjb250cmFzdF92aXNpYmxlXCIsIHRydWUpO1xuICAgICAgICBpZiAocGFzc2VkKSByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIGlmICghcGFzc2VkKSByZXR1cm4gUnVsZU1hbnVhbChcIk1hbnVhbF8xXCIpO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IHN0eWxlX2hvdmVyX3BlcnNpc3RlbnQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwic3R5bGVfaG92ZXJfcGVyc2lzdGVudFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOnN0eWxlLCBkb206KltzdHlsZV0sIGRvbToqXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwic3R5bGVfaG92ZXJfcGVyc2lzdGVudC5odG1sXCIsXG4gICAgICAgICAgICAvLyBcIlBhc3NfMVwiOiBcInN0eWxlX2hvdmVyX3BlcnNpc3RlbnQuaHRtbFwiLFxuICAgICAgICAgICAgXCJQYXNzXzJcIjogXCJzdHlsZV9ob3Zlcl9wZXJzaXN0ZW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJzdHlsZV9ob3Zlcl9wZXJzaXN0ZW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzJcIjogXCJzdHlsZV9ob3Zlcl9wZXJzaXN0ZW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzNcIjogXCJzdHlsZV9ob3Zlcl9wZXJzaXN0ZW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJzdHlsZV9ob3Zlcl9wZXJzaXN0ZW50Lmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwidGhlIGhvdmVyOiBwc2V1ZG8tY2xhc3MgaXMgbm90IHVzZWQgdG8gZGlzcGxheSBjb250ZW50XCIsXG4gICAgICAgICAgICAvLyBcIlBhc3NfMVwiOiBcImNvbnRlbnQgZGlzcGxheWVkIHZpYSB0aGUgOmhvdmVyIHBzZXVkby1jbGFzcyBpcyBhIGRpcmVjdCBjaGlsZCBvZiB0aGUgdHJpZ2dlciBlbGVtZW50XCIsXG4gICAgICAgICAgICBcIlBhc3NfMlwiOiBcImNvbnRlbnQgZGlzcGxheWVkIHZpYSB0aGUgOmhvdmVyIHBzZXVkby1jbGFzcyBpcyB0aGUgYWRqYWNlbnQgc2libGluZyBvZiB0aGUgdHJpZ2dlciBlbGVtZW50XCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiQ29uZmlybSB0aGUgcG9pbnRlciBjYW4gYmUgcG9zaXRpb25lZCBvdmVyIHRoZSBkaXNwbGF5ZWQgZWxlbWVudCwgbm90IGp1c3QgdGhlIHRyaWdnZXJcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzJcIjogXCJDb25maXJtIHRoZSBwb2ludGVyIGNhbiBiZSBwb3NpdGlvbmVkIG92ZXIgYWxsIHRoZSBpbmZvcm1hdGlvbiBkaXNwbGF5ZWQgb24gaG92ZXJcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzNcIjogXCJDb25maXJtIHRoZSBtYXJnaW4gc3R5bGUgYXR0cmlidXRlIGhhcyBub3QgcHJldmVudGVkIHRoZSBwb2ludGVyIGZyb20gaG92ZXJpbmcgb3ZlciB0aGUgZGlzcGxheWVkIGVsZW1lbnQsIG5vdCBqdXN0IHRoZSB0cmlnZ2VyXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGhlIHBvaW50ZXIgc2hvdWxkIGJlIGFibGUgdG8gbW92ZSBvdmVyIGNvbnRlbnQgZGlzcGxheWVkIG9uIGhvdmVyXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS40LjEzXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGxldCBwYXNzMCA9IGZhbHNlO1xuICAgICAgICBsZXQgcGFzczEgPSBmYWxzZTtcbiAgICAgICAgbGV0IHBhc3MyID0gZmFsc2U7IC8vIG5ldmVyIGhhcHBlblxuICAgICAgICBsZXQgcG90ZW50aWFsMSA9IGZhbHNlO1xuICAgICAgICBsZXQgcG90ZW50aWFsMiA9IGZhbHNlO1xuICAgICAgICBsZXQgcG90ZW50aWFsMyA9IGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGxldCBzdHlsZVRleHQgPSBcIlwiO1xuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwic3R5bGVcIikge1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJSVUxFIFJVTiAqKioqKioqKioqKioqKioqKipcIik7XG4gICAgICAgICAgICBzdHlsZVRleHQgPSBDb21tb25VdGlsLmdldElubmVyVGV4dChydWxlQ29udGV4dCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIC8vIGNoZWNrIGltcG9ydFxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJydWxlQ29udGV4dC5vd25lckRvY3VtZW50LnN0eWxlU2hlZXRzLmxlbmd0aCA9IFwiK3J1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHMubGVuZ3RoKTtcbiAgICAgICAgICAgIGZvciAobGV0IHNJbmRleCA9IDA7IHNJbmRleCA8IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHMubGVuZ3RoOyArK3NJbmRleCkge1xuICAgICAgICAgICAgICAgIGxldCBzaGVldCA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHNbc0luZGV4XSBhcyBDU1NTdHlsZVNoZWV0O1xuICAgICAgICAgICAgICAgIGlmIChzaGVldCAmJiBzaGVldC5vd25lck5vZGUgPT09IHJ1bGVDb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3R5bGVSdWxlcyA9IHNoZWV0LmNzc1J1bGVzID8gc2hlZXQuY3NzUnVsZXMgOiBzaGVldC5ydWxlcztcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwic3R5bGVSdWxlcy5sZW5ndGggPSBcIitzdHlsZVJ1bGVzLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBzdHlsZVJ1bGVJbmRleCA9IDA7IHN0eWxlUnVsZUluZGV4IDwgc3R5bGVSdWxlcy5sZW5ndGg7IHN0eWxlUnVsZUluZGV4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIioqKioqKioqKipcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIqKioqKioqKioqIEZPUiBMT09QIHN0eWxlUnVsZUluZGV4ID0gXCIrc3R5bGVSdWxlSW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmb3VuZEhvdmVyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGhvdmVyRWxlbWVudCA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBsdXNDb21iaW5hdG9yID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRpbGRlQ29tYmluYXRvciA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhZnRlckNvbWJpbmF0b3JFbGVtZW50ID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYWZ0ZXJDb21iaW5hdG9yRWxlbWVudERpc3BsYXkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYWZ0ZXJDb21iaW5hdG9yRWxlbWVudERpc3BsYXlWYWx1ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhZnRlckNvbWJpbmF0b3JFbGVtZW50SG92ZXIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3VwcG9ydGluZ0VsZW1lbnQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3VwcG9ydGluZ0hvdmVyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5UHJvcGVydHkgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3VwcG9ydGluZ0hvdmVyRWxlbWVudERpc3BsYXlWYWx1ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhZGphY2VudFBsdXNTaWJsaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFkamFjZW50VGlsZGVNdWx0aXBsZVNpYmxpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3R5bGVSdWxlID0gc3R5bGVSdWxlc1tzdHlsZVJ1bGVJbmRleF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGVUZXh0ID0gc3R5bGVSdWxlc1tzdHlsZVJ1bGVJbmRleF0uY3NzVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInN0eWxlUnVsZXNbXCIrc3R5bGVSdWxlSW5kZXgrXCJdID0gXCIrcnVsZVRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEuIENoZWNrIGZvciA6aG92ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZVRleHQubWF0Y2goLzpob3Zlci9nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEhvdmVyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIxLiBmb3VuZCA6aG92ZXIgPSBcIisgZm91bmRIb3Zlcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDIuIEdldCBob3ZlciBlbGVtZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvdmVyRWxlbWVudCA9IHJ1bGVUZXh0LnNwbGl0KFwiOlwiKVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIyLiBmb3VuZCBlbGVtZW50IHRoYXQgZ29lcyB3aXRoIDpob3ZlciA9IFwiK2hvdmVyRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIxLiBObyBob3ZlciBvbiBjc3MgZWxlbWVudCBzbyBza2lwIHRoaXMgcnVsZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8vIGlmIG5vIDpob3ZlciBza2lwIHRoaXMgcnVsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAzYS4gQ2hlY2sgZm9yIGNzcyBjb21iaW5hdG9yICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA0YS4gaWYgc28gZG8gd2UgaGF2ZSBhbiBhZnRlciBjb21iaW5hdG9yIGVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGx1c1RlbXBTdHIgPSBydWxlVGV4dC5zdWJzdHJpbmcocnVsZVRleHQuaW5kZXhPZihcIitcIikgKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVzVGVtcFN0ciA9IHBsdXNUZW1wU3RyLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZVRleHQubWF0Y2goLzpob3ZlciBcXCsvZykgfHwgcnVsZVRleHQubWF0Y2goLzpob3ZlclxcKy9nKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbHVzQ29tYmluYXRvciA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiM2EuIEZvdW5kIHBsdXNDb21iaW5hdG9yID0gXCIrIHBsdXNDb21iaW5hdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJDb21iaW5hdG9yRWxlbWVudCA9IHBsdXNUZW1wU3RyLnNwbGl0KFwiIFwiKVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCI0YS4gRm91bmQgcGx1cyBhZnRlckNvbWJpbmF0b3JFbGVtZW50ID0gXCIrYWZ0ZXJDb21iaW5hdG9yRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gM2IuIENoZWNrIGZvciBjc3MgY29tYmluYXRvciArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNGIuIGlmIHNvIGRvIHdlIGhhdmUgYW4gYWZ0ZXIgY29tYmluYXRvciBlbGVtZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGVUZXh0Lm1hdGNoKC86aG92ZXIgXFx+L2cpIHx8IHJ1bGVUZXh0Lm1hdGNoKC86aG92ZXJcXH4vZykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJtYXRjaCA9IFwiK3J1bGVUZXh0Lm1hdGNoKFwiOmhvdmVyIFxcflwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbGRlQ29tYmluYXRvciA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiM2IuIEZvdW5kIHRpbGRlQ29tYmluYXRvciA9IFwiKyB0aWxkZUNvbWJpbmF0b3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGx1c1RlbXBTdHIgPSBydWxlVGV4dC5zdWJzdHJpbmcocnVsZVRleHQuaW5kZXhPZihcIn5cIikgKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1c1RlbXBTdHIgPSBwbHVzVGVtcFN0ci50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyQ29tYmluYXRvckVsZW1lbnQgPSBwbHVzVGVtcFN0ci5zcGxpdChcIiBcIilbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiNGIuIEZvdW5kIHRpbGRlIGFmdGVyQ29tYmluYXRvckVsZW1lbnQgPSBcIithZnRlckNvbWJpbmF0b3JFbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBsdXNDb21iaW5hdG9yICYmICF0aWxkZUNvbWJpbmF0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTk8gcGx1c0NvbWJpbmF0b3Igb3IgdGlsZGVDb21iaW5hdG9yIHNvIHNraXAgdGhpcyBydWxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiTk8gcGx1c0NvbWJpbmF0b3Igb3IgdGlsZGVDb21iaW5hdG9yIHNvIFBBU1NcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiKioqKiBSRVBPUlQgUEFTUyAwIEhFUkVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTsgLy8gSkNIOiBzaG91bGQgd2UgaGF2ZSBhIE4vQSBwYXNzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU28gbm93IHdlIGhhdmUgYSBjc3MgZWxlbWVudCB3aXRoIGhvdmVyIC0gZWxlbWVudDpob3ZlciBzbyB3ZSBoYXZlIHByb2JsZW1zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gY2hlY2tcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDUuIENoZWNrIGlmIHRoZSBhZnRlciBjb21iaW5hdG9yIGVsZW1lbnQgaGFzIGRpc3BsYXk6IHByb3BlcnR5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gNi4gQ2hlY2sgaWYgZGlzcGxheSBwcm9wZXJ0eSBpcyBub3Qgbm9uZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZnRlckNvbWJpbmF0b3JFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCBpbmRleCBvZiBkaXNwbGF5OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInBsdXNUZW1wU3RyID0gXCIrcGx1c1RlbXBTdHIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSBwbHVzVGVtcFN0ci5pbmRleE9mKFwiZGlzcGxheTpcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXJDb21iaW5hdG9yRWxlbWVudERpc3BsYXkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCI1LiBGb3VuZCBhZnRlckNvbWJpbmF0b3JFbGVtZW50RGlzcGxheSA9IFwiK2FmdGVyQ29tYmluYXRvckVsZW1lbnREaXNwbGF5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbHVzVGVtcFN0ci5zbGljZShpbmRleCArIDgpLnRyaW0oKS5zcGxpdChcIiBcIilbMF0gIT09IFwibm9uZTtcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyQ29tYmluYXRvckVsZW1lbnREaXNwbGF5VmFsdWUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiNi4gRm91bmQgYWZ0ZXJDb21iaW5hdG9yRWxlbWVudERpc3BsYXlWYWx1ZSBub3Qgbm9uZSA9IFwiK2FmdGVyQ29tYmluYXRvckVsZW1lbnREaXNwbGF5VmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImFmdGVyQ29tYmluYXRvckVsZW1lbnREaXNwbGF5VmFsdWUgPT09IG5vbmVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIqKioqIFBVVCBQT1RFTlRJQUwgMCBIRVJFXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBiYWQgY3NzIHNvIGl0IHdvbid0IGhhcHBlblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJOTyBhZnRlckNvbWJpbmF0b3JFbGVtZW50RGlzcGxheSBzbyBza2lwIHRoaXMgcnVsZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBiYWQgY3NzIHNvIGl0IHdvbid0IGhhcHBlblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIk5PIGFmdGVyQ29tYmluYXRvckVsZW1lbnQgc28gc2tpcCB0aGlzIHJ1bGVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhZnRlckNvbWJpbmF0b3JFbGVtZW50RGlzcGxheVZhbHVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hlZXQgJiYgc2hlZXQub3duZXJOb2RlID09PSBydWxlQ29udGV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIqKioqIEF0IHRoaXMgcG9pbnQgd2UgaGF2ZSB2ZXJpZmllZCB0aGF0IHdlIGhhdmUgYSBjc3MgZWxlbWVudCB3aXRoIGEgaG92ZXIgb2YgdGhlIGZvcm1hdCBzcGFuOmhvdmVyICsgZGl2IHsgZGlzcGxheTogYmxvY2s7IH0gd2l0aCBhbGwgdGhlIHByb3BlciBwcm9wZXJ0aWVzIGFuZCB2YWx1ZXNcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiBBdCB0aGlzIHBvaW50IHdlIGhhdmUgdmVyaWZpZWQgdGhhdCB3ZSBoYXZlIGEgY3NzIGVsZW1lbnQgd2l0aCBhIGhvdmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICBvZiB0aGUgZm9ybWF0IHNwYW46aG92ZXIgKyBkaXYgeyBkaXNwbGF5OiBibG9jazsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgd2l0aCBhbGwgdGhlIHByb3BlciBwcm9wZXJ0aWVzIGFuZCB2YWx1ZXNcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3R5bGVSdWxlczIgPSBzaGVldC5jc3NSdWxlcyA/IHNoZWV0LmNzc1J1bGVzIDogc2hlZXQucnVsZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJzdHlsZVJ1bGVzMi5sZW5ndGggPSBcIitzdHlsZVJ1bGVzMi5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHN0eWxlUnVsZUluZGV4MiA9IDA7IHN0eWxlUnVsZUluZGV4MiA8IHN0eWxlUnVsZXMyLmxlbmd0aDsgc3R5bGVSdWxlSW5kZXgyKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgcnVsZSBmb3IgYWZ0ZXJDb21pbmF0b3JFbGVtZW50OmhvdmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGZpbmQgYWZ0ZXJDb21iaW5hdG9yRWxlbWVudDpob3ZlciBzZWUgaWYgcnVsZSBoYXMgcHJvcGVydHkgZGlzcGxheTogdmFsdWUgd2hlcmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmFsdWUgIT0gbm9uZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIioqKioqKioqKipcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiKioqKioqKioqKiAybmQgRk9SIHN0eWxlUnVsZUluZGV4MiA9IFwiK3N0eWxlUnVsZUluZGV4Mik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBydWxlVGV4dDIgPSBzdHlsZVJ1bGVzW3N0eWxlUnVsZUluZGV4Ml0uY3NzVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJydWxlVGV4dDIgPSBcIiwgcnVsZVRleHQyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJhZnRlckNvbWJpbmF0b3JFbGVtZW50ID0gXCIrYWZ0ZXJDb21iaW5hdG9yRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGFsbCBzdXBwb3J0aW5nIGVsZW1lbnRzIGZvciBtYXJnaW4gcHJvcGVydHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgZmluZCBtYXJnaW4gU1RPUCBhbmQgUkVQT1JUIEVSUk9SXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZWdFeFN0cmluZyA9IGFmdGVyQ29tYmluYXRvckVsZW1lbnQgKyBcIiB7XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0cmltUnVsZVRleHQyID0gcnVsZVRleHQyLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlZ0luZGV4ID0gdHJpbVJ1bGVUZXh0Mi5pbmRleE9mKHJlZ0V4U3RyaW5nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFmdGVyQ29tYmluYXRvckVsZW1lbnRQcm9wZXJ0aWVzID0gdHJpbVJ1bGVUZXh0Mi5zbGljZShyZWdJbmRleCkudHJpbSgpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgKCFhZnRlckNvbWJpbmF0b3JFbGVtZW50UHJvcGVydGllcy5tYXRjaCgvbWFyZ2luL2cpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdHJpbVJ1bGVUZXh0Mi5tYXRjaCgvbWFyZ2luL2cpKSB7ICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJObyBtYXJnaW4gcHJvYmxlbSBzbyBjb250aW51ZSBvbi4uLlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvIHdlIGhhdmUgYSBzdXBwb3J0aW5nIGVsZW1lbnQgY3NzIGRlZmluaXRpb25zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3VwcG9ydGluZ0hvdmVyRWxlbWVudCA9IHJ1bGVUZXh0Mi5zcGxpdChcIjpcIilbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0aW5nSG92ZXJFbGVtZW50ID0gc3VwcG9ydGluZ0hvdmVyRWxlbWVudC5zcGxpdChcIiBcIilbMF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInN1cHBvcnRpbmdIb3ZlckVsZW1lbnQgPSBcIitzdXBwb3J0aW5nSG92ZXJFbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiYWZ0ZXJDb21iaW5hdG9yRWxlbWVudCA9IFwiK2FmdGVyQ29tYmluYXRvckVsZW1lbnQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBORUVEIFRPIENIRUNLIEZPUiBhZnRlckNvbWluYXRvckVsZW1lbnQ6aG92ZXIgaW4gT05FIFNURVBcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1cHBvcnRpbmdIb3ZlckVsZW1lbnQgPT09IGFmdGVyQ29tYmluYXRvckVsZW1lbnQgJiYgcnVsZVRleHQyLm1hdGNoKC86aG92ZXIvZykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIjcuIEZvdW5kIHN1cHBvcnRpbmcgaG92ZXIgZWxlbWVudCBzYW1lIGFzIGFmdGVyQ29tYmluYXRvckVsZW1lbnRcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA3LiBGb3VuZCBzdXBwb3J0aW5nIGhvdmVyIGVsZW1lbnQgc2FtZSBhcyBhZnRlckNvbWJpbmF0b3JFbGVtZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGluZ0VsZW1lbnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvZXMgc3VwcG9ydGluZyBlbGVtZW50IGhhdmUgaG92ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIjguIFN1cHBvcnRpbmcgZWxlbWVudCBoYXMgaG92ZXIgYWxzbyA9IFwiKyBmb3VuZEhvdmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA4LiBTdXBwb3J0aW5nIGVsZW1lbnQgaGFzIGhvdmVyIGFsc29cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0aW5nSG92ZXIgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IHJ1bGVUZXh0Mi5pbmRleE9mKFwiZGlzcGxheTpcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJpbmRleCA9IFwiK2luZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gOS4gRm91bmQgc3VwcG9ydGluZ0hvdmVyRWxlbWVudERpc3BsYXlQcm9wZXJ0eVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVByb3BlcnR5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCI5LiBGb3VuZCBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVByb3BlcnR5ID0gXCIrc3VwcG9ydGluZ0hvdmVyRWxlbWVudERpc3BsYXlQcm9wZXJ0eSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbHVzVGVtcFN0ci5zbGljZShpbmRleCArIDgpLnRyaW0oKS5zcGxpdChcIiBcIilbMF0gIT09IFwibm9uZTtcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMTAuIEZvdW5kIHN1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5VmFsdWUgbm90IG5vbmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5VmFsdWUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIxMC4gRm91bmQgc3VwcG9ydGluZ0hvdmVyRWxlbWVudERpc3BsYXlWYWx1ZSBub3Qgbm9uZSA9IFwiK3N1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5VmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IGxpc3Qgb2YgaG92ZXIgZWxlbWVudHMgYW5kIG5leHQgc2libGluZyBmb3IgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9yICsgdGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgQURKQUNFTlQgc2libGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhvdmVyRWxlbWVudCAhPT0gXCJcIiAmJiBwbHVzQ29tYmluYXRvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBob3ZlckVsZW1lbnRMaXN0ID0gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShob3ZlckVsZW1lbnQudG9VcHBlckNhc2UoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJob3ZlckVsZW1lbnRMaXN0Lmxlbmd0aCA9IFwiK2hvdmVyRWxlbWVudExpc3QubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImhvdmVyRWxlbWVudExpc3RbMF0udGFnTmFtZSA9IFwiK2hvdmVyRWxlbWVudExpc3RbMF0udGFnTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR2V0IGFkamFjZW50IHNpYmxpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkFkamFjZW50IHNpYmxpbmcgPSBcIitob3ZlckVsZW1lbnRMaXN0WzBdLm5leHRFbGVtZW50U2libGluZy50YWdOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImFmdGVyQ29tYmluYXRvckVsZW1lbnQudG9VcHBlckNhc2UoKSA9IFwiK2FmdGVyQ29tYmluYXRvckVsZW1lbnQudG9VcHBlckNhc2UoKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWZ0ZXJDb21iaW5hdG9yRWxlbWVudC50b1VwcGVyQ2FzZSgpID09PSBob3ZlckVsZW1lbnRMaXN0WzBdLm5leHRFbGVtZW50U2libGluZy50YWdOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiMTFhLiBIb3ZlciB3aXRoIHBsdXMgaGFzIGFkamFjZW50IHNpYmxpbmcuXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDExYS4gSG92ZXIgd2l0aCBwbHVzIGhhcyBhZGphY2VudCBzaWJsaW5nLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGphY2VudFBsdXNTaWJsaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCB3ZSBoYXZlIHZlcmlmaWVkIGEgc3VwcG9ydGluZyBhZnRlckNvbWJpbmF0b3JFbGVtZW50IGNzcyBydWxlIHRoYXQgY29udGFpbnMgaG92ZXIgYW5kIGRpc3BsYXkgcHJvcGVydHkgdGhhdCBpcyBub3QgZXF1YWwgdG8gbm9uZSBhbmQgaGFzIGEgaG92ZXIgZWxlbWVudCBpbiB0aGUgYm9keSB3aXRoIGFuIGFkamFjZW50IHNpYmxpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIqKioqIFJFUE9SVCBQQVNTIDEgSEVSRVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzczAgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBsdXNDb21iaW5hdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIxMWEuIE1haW4gaG92ZXIgd2l0aCArIGNvbWJpbmF0b3IgaGFzIG5vIGFkamFjZW50IHNpYmxpbmdcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwb3RlbnRpYWwxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiKioqKiBQVVQgUE9URU5USUFMIDEgSEVSRVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG90ZW50aWFsMSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdldCBsaXN0IG9mIGhvdmVyIGVsZW1lbnRzIGFuZCBkZXRlcm1pbmUgaWYgdGhlcmUgYXJlIDIgb3IgbW9yZSBhZGphY2VudCBzaWJsaW5ncyBmb3IgflxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9yIH4gdGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgQURKQUNFTlQgc2libGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhvdmVyRWxlbWVudCAhPT0gXCJcIiAmJiB0aWxkZUNvbWJpbmF0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImhvdmVyRWxlbWVudC50b1VwcGVyQ2FzZSgpID0gXCIraG92ZXJFbGVtZW50LnRvVXBwZXJDYXNlKCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBob3ZlckVsZW1lbnRMaXN0ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVsZUNvbnRleHQub3duZXJEb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvdmVyRWxlbWVudC50b1VwcGVyQ2FzZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJob3ZlckVsZW1lbnRMaXN0Lmxlbmd0aCA9IFwiK2hvdmVyRWxlbWVudExpc3QubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgdHdvIG9yIG1vcmUgYWRqYWNlbnQgc2libGluZ3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2libGluZ3MgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2libGluZyA9IGhvdmVyRWxlbWVudExpc3RbMF0ubmV4dEVsZW1lbnRTaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJzaWJsaW5nLnRhZ05hbWUgPSBcIitzaWJsaW5nLnRhZ05hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2libGluZy50YWdOYW1lID09PSBhZnRlckNvbWJpbmF0b3JFbGVtZW50LnRvVXBwZXJDYXNlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpYmxpbmdzLnB1c2goc2libGluZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKChzaWJsaW5nID0gc2libGluZy5uZXh0RWxlbWVudFNpYmxpbmcpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2libGluZ0NvdW50ID0gc2libGluZ3MubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwic2libGluZ0NvdW50ID0gXCIrc2libGluZ0NvdW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBKQ0ggVE9ETzogd2hhdCBpZiBzaWJsaW5nIGNvdW50IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2libGluZ0NvdW50ID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiMTFiLiBIb3ZlciB3aXRoIHRpbGRlIGFuZCBvbmUgYWRqYWNlbnQgc2libGluZ1wiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRqYWNlbnRUaWxkZU11bHRpcGxlU2libGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiKioqKiBSRVBPUlQgUEFTUyAyIEhFUkVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNpYmxpbmdDb3VudCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJNYWluIGhvdmVyIHdpdGggfiBjb21iaW5hdG9yIGhhcyB0d28gb3IgbW9yZSBzaWJsaW5nc1wiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwb3RlbnRpYWwyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIioqKiogUFVUIFBPVEVOVElBTCAyIEhFUkVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8yXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBsdXNDb21iaW5hdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSBtYWtlIGl0IHRvIHRoZSBsYXN0IHJ1bGUgYW5kIHN1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5VmFsdWUgaXMgc3RpbGwgZmFsc2UgPT4gcG90ZW50aWFsMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlUnVsZUluZGV4MiA9PT0gc3R5bGVSdWxlczIubGVuZ3RoIC0gMSAmJiBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVZhbHVlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiTk8gcGx1cyBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVByb3BlcnR5XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiKioqKiBQVVQgUE9URU5USUFMIDEgSEVSRVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aWxkZUNvbWJpbmF0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIG1ha2UgaXQgdG8gdGhlIGxhc3QgcnVsZSBhbmQgc3VwcG9ydGluZ0hvdmVyRWxlbWVudERpc3BsYXlWYWx1ZSBpcyBzdGlsbCBmYWxzZSA9PiBwb3RlbnRpYWwyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVSdWxlSW5kZXgyID09PSBzdHlsZVJ1bGVzMi5sZW5ndGggLSAxICYmIHN1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5VmFsdWUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJOTyBwbHVzIHN1cHBvcnRpbmdIb3ZlckVsZW1lbnREaXNwbGF5UHJvcGVydHlcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIqKioqIFBVVCBQT1RFTlRJQUwgMiBIRVJFXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90ZSBhdCBsZWFzdCBvbmUgb2YgdGhlIHJ1bGVzIG11c3QgaGF2ZSBhIGRpc3BsYXkgcHJvcGVydHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBsdXNDb21iaW5hdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIG1ha2UgaXQgdG8gdGhlIGxhc3QgcnVsZSBhbmQgc3VwcG9ydGluZ0hvdmVyRWxlbWVudERpc3BsYXlQcm9wZXJ0eSBpcyBzdGlsbCBmYWxzZSA9PiBwb3RlbnRpYWwxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZVJ1bGVJbmRleDIgPT09IHN0eWxlUnVsZXMyLmxlbmd0aCAtIDEgJiYgc3VwcG9ydGluZ0hvdmVyRWxlbWVudERpc3BsYXlQcm9wZXJ0eSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiTk8gcGx1cyBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVByb3BlcnR5XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIqKioqIFBVVCBQT1RFTlRJQUwgMSBIRVJFXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aWxkZUNvbWJpbmF0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgbWFrZSBpdCB0byB0aGUgbGFzdCBydWxlIGFuZCBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVByb3BlcnR5IGlzIHN0aWxsIGZhbHNlID0+IHBvdGVudGlhbDJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlUnVsZUluZGV4MiA9PT0gc3R5bGVSdWxlczIubGVuZ3RoIC0gMSAmJiBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVByb3BlcnR5ID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJOTyB0aWxkZSBzdXBwb3J0aW5nSG92ZXJFbGVtZW50RGlzcGxheVByb3BlcnR5XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIqKioqIFBVVCBQT1RFTlRJQUwgMiBIRVJFXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90ZSBhdCBsZWFzdCBvbmUgb2YgdGhlIHJ1bGVzIG11c3QgaGF2ZSBhIHN1cHBvcnRpbmdFbGVtZW50OmhvdmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBsdXNDb21iaW5hdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgd2UgbWFrZSBpdCB0byB0aGUgbGFzdCBydWxlIGFuZCBzdXBwb3J0aW5nRWxlbWVudCBpcyBzdGlsbCBmYWxzZSA9PiBwb3RlbnRpYWwxXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJzdHlsZVJ1bGVJbmRleDIgPSBcIitzdHlsZVJ1bGVJbmRleDIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwic3R5bGVSdWxlczIubGVuZ3RoID0gXCIrc3R5bGVSdWxlczIubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInN1cHBvcnRpbmdFbGVtZW50ID0gXCIrc3VwcG9ydGluZ0hvdmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVSdWxlSW5kZXgyID09PSBzdHlsZVJ1bGVzMi5sZW5ndGggLSAxICYmIHN1cHBvcnRpbmdIb3ZlciA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJOTyBwbHVzIHN1cHBvcnRpbmdFbGVtZW50OmhvdmVyXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIioqKiogUFVUIFBPVEVOVElBTCAxIEhFUkVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aWxkZUNvbWJpbmF0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSBtYWtlIGl0IHRvIHRoZSBsYXN0IHJ1bGUgYW5kIHN1cHBvcnRpbmdFbGVtZW50IGlzIHN0aWxsIGZhbHNlID0+IHBvdGVudGlhbDJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInN0eWxlUnVsZUluZGV4MiA9IFwiK3N0eWxlUnVsZUluZGV4Mik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJzdHlsZVJ1bGVzMi5sZW5ndGggPSBcIitzdHlsZVJ1bGVzMi5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwic3VwcG9ydGluZ0VsZW1lbnQgPSBcIitzdXBwb3J0aW5nSG92ZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZVJ1bGVJbmRleDIgPT09IHN0eWxlUnVsZXMyLmxlbmd0aCAtIDEgJiYgc3VwcG9ydGluZ0hvdmVyID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIk5PIHRpbGRlIHN1cHBvcnRpbmdFbGVtZW50OmhvdmVyXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIioqKiogUFVUIFBPVEVOVElBTCAyIEhFUkVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzJcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJUaGVyZSBpcyBhIG1hcmdpbiBpbiB0aGUgc3VwcG9ydGluZyBlbGVtZW50XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwb3RlbnRpYWwzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIqKioqIFBVVCBQT1RFTlRJQUwgMyBIRVJFXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvdGVudGlhbDMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzNcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2lsZW5jZSBjc3MgYWNjZXNzIGlzc3Vlc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNpbGVuY2UgY3NzIGFjY2VzcyBpc3N1ZXNcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cIik7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwicGFzczAgPSBcIitwYXNzMCk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwicGFzczEgPSBcIitwYXNzMSk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwicGFzczIgPSBcIitwYXNzMik7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKFwicG90ZW50aWFsMSA9IFwiK3BvdGVudGlhbDEpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyhcInBvdGVudGlhbDIgPSBcIitwb3RlbnRpYWwyKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coXCJwb3RlbnRpYWwzID0gXCIrcG90ZW50aWFsMyk7XG4gICAgICAgIGlmIChwYXNzMCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICAvLyBpZiAocGFzczEpIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMlwiKTsgLy8gRG9lc24ndCB0cmlnZ2VyXG4gICAgICAgIC8vIGlmIChwYXNzMikgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18zXCIpOyAvLyBEb2Vzbid0IHRyaWdnZXJcbiAgICAgICAgaWYgKHBvdGVudGlhbDEpIHJldHVybiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgICAgIGlmIChwb3RlbnRpYWwyKSByZXR1cm4gUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8yXCIpO1xuICAgICAgICBpZiAocG90ZW50aWFsMykgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfM1wiKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuLyoqXG4gKiBEZXNjcmlwdGlvbjogVHJpZ2dlciB3aGVuIHZpZXdwb3J0IHVuaXRzIGFyZSB1c2VkIGZvciBmb250IHNpemUuXG4gKiBPcmlnaW46IFZhcmlvdXNcbiAqL1xuZXhwb3J0IGNvbnN0IHN0eWxlX3ZpZXdwb3J0X3Jlc2l6YWJsZTogUnVsZSA9IHtcbiAgICBpZDogXCJzdHlsZV92aWV3cG9ydF9yZXNpemFibGVcIixcbiAgICBjb250ZXh0OiBcImRvbTpsaW5rLCBkb206c3R5bGUsIGRvbToqW3N0eWxlXVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIxX1N0eWxlX1ZpZXdwb3J0XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiUG90ZW50aWFsXzFcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBgc3R5bGVfdmlld3BvcnRfcmVzaXphYmxlLmh0bWxgLFxuICAgICAgICAgICAgXCJQYXNzXzBcIjogYHN0eWxlX3ZpZXdwb3J0X3Jlc2l6YWJsZS5odG1sYCxcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogYHN0eWxlX3ZpZXdwb3J0X3Jlc2l6YWJsZS5odG1sYFxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUZXh0IG11c3Qgc2NhbGUgdXAgdG8gMjAwJSB3aXRob3V0IGxvc3Mgb2YgY29udGVudCBvciBmdW5jdGlvbmFsaXR5XCIsXG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwiVmVyaWZ5IHRoYXQgdGV4dCBzaXplZCB1c2luZyB2aWV3cG9ydCB1bml0cyBjYW4gYmUgcmVzaXplZCB1cCB0byAyMDAlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIGlkOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIG51bTogW1wiMS40LjRcIiwgXCIxLjQuMTBcIl0sIC8vIG1hdGNoIGhlbHAgZm9yIGJvdGggXG4gICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIHRvb2xraXRMZXZlbDogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGxldCB0aGVQYXR0ZXJuID0gL1xcZCsodnd8dmh8dm1pbnx2bWF4KS9naTtcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSBcInN0eWxlXCIpIHtcbiAgICAgICAgICAgIGZvciAobGV0IHNJbmRleCA9IDA7IHNJbmRleCA8IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHMubGVuZ3RoOyBzSW5kZXgrKykge1xuICAgICAgICAgICAgICAgIGxldCBzaGVldCA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuc3R5bGVTaGVldHNbc0luZGV4XSBhcyBDU1NTdHlsZVNoZWV0XG4gICAgICAgICAgICAgICAgaWYgKHNoZWV0Lm93bmVyTm9kZSA9PT0gcnVsZUNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHlsZVJ1bGVzID0gc2hlZXQuY3NzUnVsZXMgPyBzaGVldC5jc3NSdWxlcyA6IHNoZWV0LnJ1bGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlUnVsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBzdHlsZVJ1bGVJbmRleCA9IDA7IHBhc3NlZCAmJiBzdHlsZVJ1bGVJbmRleCA8IHN0eWxlUnVsZXMubGVuZ3RoOyBzdHlsZVJ1bGVJbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBydWxlID0gc3R5bGVSdWxlc1tzdHlsZVJ1bGVJbmRleF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlLnR5cGUgJiYgcnVsZS50eXBlID09PSAxIC8qIENTU1J1bGUuU1RZTEVfUlVMRSAqLykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0eWxlUnVsZSA9IHJ1bGUgYXMgQ1NTU3R5bGVSdWxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlUnVsZS5zdHlsZVsnZm9udFNpemUnXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmb250U2l6ZSA9IHN0eWxlUnVsZS5zdHlsZVsnZm9udFNpemUnXS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZvdW5kID0gZm9udFNpemUubWF0Y2godGhlUGF0dGVybik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvbnRTaXplLmxlbmd0aCAmJiBmb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgaW1wb3J0IHJ1bGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJ1bGUudHlwZSAmJiBydWxlLnR5cGUgPT09IDMgLyogQ1NTUnVsZS5JTVBPUlRfUlVMRSAqLyAmJiAocnVsZSBhcyBDU1NJbXBvcnRSdWxlKS5zdHlsZVNoZWV0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW1wb3J0UnVsZSA9IHJ1bGUgYXMgQ1NTSW1wb3J0UnVsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBydWxlcyA9IGltcG9ydFJ1bGUuc3R5bGVTaGVldC5jc3NSdWxlcyA/IGltcG9ydFJ1bGUuc3R5bGVTaGVldC5jc3NSdWxlcyA6IGltcG9ydFJ1bGUuc3R5bGVTaGVldC5ydWxlcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydWxlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHJJbmRleCA9IDA7IHBhc3NlZCAmJiBySW5kZXggPCBydWxlcy5sZW5ndGg7IHJJbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbXBvcnRlZFJ1bGUgPSBydWxlc1tySW5kZXhdIGFzIGFueVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW1wb3J0ZWRSdWxlLnR5cGUgJiYgaW1wb3J0ZWRSdWxlLnR5cGUgPT09IDEgLyogQ1NTUnVsZS5TVFlMRV9SVUxFICovKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW1wb3J0ZWRSdWxlLnN0eWxlWydmb250U2l6ZSddKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZvbnRTaXplID0gaW1wb3J0ZWRSdWxlLnN0eWxlWydmb250U2l6ZSddLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZm91bmQgPSBmb250U2l6ZS5tYXRjaCh0aGVQYXR0ZXJuKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm9udFNpemUubGVuZ3RoICYmIGZvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlIGNzcyBhY2Nlc3MgaXNzdWVzXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAobm9kZU5hbWUgPT09IFwibGlua1wiKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBzSW5kZXggPSAwOyBzSW5kZXggPCBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LnN0eWxlU2hlZXRzLmxlbmd0aDsgc0luZGV4KyspIHtcbiAgICAgICAgICAgICAgICBsZXQgc2hlZXQgPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LnN0eWxlU2hlZXRzW3NJbmRleF0gYXMgQ1NTU3R5bGVTaGVldDtcbiAgICAgICAgICAgICAgICBpZiAoc2hlZXQgJiYgc2hlZXQub3duZXJOb2RlID09PSBydWxlQ29udGV4dCkge1xuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGVzID0gc2hlZXQuY3NzUnVsZXMgPyBzaGVldC5jc3NSdWxlcyA6IHNoZWV0LnJ1bGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgckluZGV4ID0gMDsgcGFzc2VkICYmIHJJbmRleCA8IHJ1bGVzLmxlbmd0aDsgckluZGV4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bGVGcm9tTGluayA9IHJ1bGVzW3JJbmRleF0gYXMgYW55O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBydWxlcyBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGVGcm9tTGluay50eXBlICYmIHJ1bGVGcm9tTGluay50eXBlID09PSAxIC8qIENTU1J1bGUuU1RZTEVfUlVMRSAqLykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGVGcm9tTGluay5zdHlsZVsnZm9udFNpemUnXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmb250U2l6ZSA9IHJ1bGVGcm9tTGluay5zdHlsZVsnZm9udFNpemUnXS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZvdW5kID0gZm9udFNpemUubWF0Y2godGhlUGF0dGVybik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvbnRTaXplLmxlbmd0aCAmJiBmb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBjc3MgYWNjZXNzIGlzc3Vlc1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IHN0eWxlVmFsdWUgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoJ3N0eWxlJyk7XG4gICAgICAgICAgICBpZiAoc3R5bGVWYWx1ZSkge1xuICAgICAgICAgICAgICAgIGxldCBzdHlsZVBhdHRlcm4gPSAvZm9udC1zaXplOlxccypcXGQrKHZ3fHZofHZtaW58dm1heCkvZ2k7XG4gICAgICAgICAgICAgICAgbGV0IGZvdW5kID0gc3R5bGVWYWx1ZS5tYXRjaChzdHlsZVBhdHRlcm4pO1xuICAgICAgICAgICAgICAgIGlmIChmb3VuZCkge1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcGFzc2VkID8gUnVsZVBhc3MoXCJQYXNzXzBcIikgOiBSdWxlUG90ZW50aWFsKFwiUG90ZW50aWFsXzFcIik7XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBY2NOYW1lVXRpbCB9IGZyb20gXCIuLi91dGlsL0FjY05hbWVVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3Qgc3ZnX2dyYXBoaWNzX2xhYmVsbGVkOiBSdWxlID0ge1xuICAgIGlkOiBcInN2Z19ncmFwaGljc19sYWJlbGxlZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOnN2Z1wiLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwic3ZnX2dyYXBoaWNzX2xhYmVsbGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwicGFzc1wiOiBcInN2Z19ncmFwaGljc19sYWJlbGxlZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfYWNjX25hbWVcIjogXCJzdmdfZ3JhcGhpY3NfbGFiZWxsZWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIkEgbm9uLWRlY29yYXRpdmUgU1ZHIGVsZW1lbnQgbXVzdCBoYXZlIGFuIGFjY2Vzc2libGUgbmFtZVwiLFxuICAgICAgICAgICAgXCJwYXNzXCI6IFwiVGhlIFNWRyBlbGVtZW50IGhhcyBhbiBhY2Nlc3NpYmxlIG5hbWVcIixcbiAgICAgICAgICAgIFwiZmFpbF9hY2NfbmFtZVwiOiBcIlRoZSBTVkcgZWxlbWVudCBoYXMgbm8gYWNjZXNzaWJsZSBuYW1lXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMS4xXCJdLCBcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbe1xuICAgICAgICBcIjdkNjczNFwiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcImZhaWxfYWNjX25hbWVcIjogXCJmYWlsXCJcbiAgICAgICAgfVxuICAgIH1dLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG5cbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkgfHwgVmlzVXRpbC5pc05vZGVQcmVzZW50YXRpb25hbChydWxlQ29udGV4dCkgfHwgQWNjTmFtZVV0aWwuaXNBY2Nlc3NpYmxlTmFtZUlnbm9yYWJsZShydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IG5hbWVfcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZShydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChuYW1lX3BhaXIgJiYgbmFtZV9wYWlyLm5hbWUgJiYgbmFtZV9wYWlyLm5hbWUudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJwYXNzXCIpO1xuICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJmYWlsX2FjY19uYW1lXCIpXG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlQ29udGV4dEhpZXJhcmNoeSwgUnVsZUZhaWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5cbmV4cG9ydCBjb25zdCB0YWJsZV9hcmlhX2Rlc2NlbmRhbnRzOiBSdWxlID0ge1xuICAgIGlkOiBcInRhYmxlX2FyaWFfZGVzY2VuZGFudHNcIixcbiAgICBjb250ZXh0OiBcImFyaWE6dGFibGUgZG9tOnRyW3JvbGVdLCBhcmlhOnRhYmxlIGRvbTp0aFtyb2xlXSwgYXJpYTp0YWJsZSBkb206dGRbcm9sZV0sIGFyaWE6Z3JpZCBkb206dHJbcm9sZV0sIGFyaWE6Z3JpZCBkb206dGhbcm9sZV0sIGFyaWE6Z3JpZCBkb206dGRbcm9sZV0sIGFyaWE6dHJlZWdyaWQgZG9tOnRyW3JvbGVdLCBhcmlhOnRyZWVncmlkIGRvbTp0aFtyb2xlXSwgYXJpYTp0cmVlZ3JpZCBkb206dGRbcm9sZV1cIixcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcInRhYmxlX2FyaWFfZGVzY2VuZGFudHMuaHRtbFwiLFxuICAgICAgICAgICAgXCJleHBsaWNpdF9yb2xlXCI6IFwidGFibGVfYXJpYV9kZXNjZW5kYW50cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGFibGUgc3RydWN0dXJlIGVsZW1lbnRzIGNhbm5vdCBzcGVjaWZ5IGFuIGV4cGxpY2l0ICdyb2xlJyB3aXRoaW4gdGFibGUgY29udGFpbmVyc1wiLFxuICAgICAgICAgICAgXCJleHBsaWNpdF9yb2xlXCI6IFwiQW4gZXhwbGljaXQgQVJJQSAncm9sZScgaXMgbm90IHZhbGlkIGZvciA8ezB9PiBlbGVtZW50IHdpdGhpbiBhbiBBUklBIHJvbGUgJ3sxfScgcGVyIHRoZSBBUklBIGluIEhUTUwgc3BlY2lmaWNhdGlvblwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiNC4xLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDsgXG4gICAgICAgIGxldCBwYXJlbnRSb2xlID0gQ29tbW9uVXRpbC5pc1RhYmxlRGVzY2VuZGFudChjb250ZXh0SGllcmFyY2hpZXMpO1xuICAgICAgICAvLyBjYWNoZSB0aGUgcmVzdWx0XG4gICAgICAgIGlmIChwYXJlbnRSb2xlID09PSBudWxsIHx8IHBhcmVudFJvbGUubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgIC8vIGlnbm9yZSB0aGUgcmVkdW5kYW5jeSBjYXNlczogcmVwb3J0ZWQgaW4gdGhlIGFyaWFfcm9sZV9yZWR1bmRhbnQgcnVsZVxuICAgICAgICBjb25zdCBpbXBsaWNpdFJvbGVzID0gQXJpYVV0aWwuZ2V0SW1wbGljaXRSb2xlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgY29uc3QgZXhwbGljaXRSb2xlcyA9IEFyaWFVdGlsLmdldFJvbGVzKHJ1bGVDb250ZXh0LCBmYWxzZSk7O1xuICAgICAgICBpZiAoaW1wbGljaXRSb2xlcyAmJiBpbXBsaWNpdFJvbGVzLmxlbmd0aCA+IDAgJiYgZXhwbGljaXRSb2xlcyAmJiBleHBsaWNpdFJvbGVzLmxlbmd0aCA+IDAgXG4gICAgICAgICAgICAmJiBleHBsaWNpdFJvbGVzLnNvbWUoaXRlbSA9PiBpbXBsaWNpdFJvbGVzLmluY2x1ZGVzKGl0ZW0pKSlcbiAgICAgICAgICAgIHJldHVybjtcblxuICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJleHBsaWNpdF9yb2xlXCIsIFtjb250ZXh0W1wiZG9tXCJdLm5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSwgcGFyZW50Um9sZVswXS5yb2xlXSk7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IHRhYmxlX2NhcHRpb25fZW1wdHk6IFJ1bGUgPSB7XG4gICAgaWQ6IFwidGFibGVfY2FwdGlvbl9lbXB0eVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmNhcHRpb25cIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIlZhbGVyaWVfQ2FwdGlvbl9IYXNDb250ZW50XCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUGFzc18wXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkZhaWxfMVwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwidGFibGVfY2FwdGlvbl9lbXB0eS5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcInRhYmxlX2NhcHRpb25fZW1wdHkuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInRhYmxlX2NhcHRpb25fZW1wdHkuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUaGUgPHRhYmxlPiBlbGVtZW50IGhhcyBhbiBlbXB0eSA8Y2FwdGlvbj4gZWxlbWVudFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkEgPGNhcHRpb24+IGVsZW1lbnQgZm9yIGEgPHRhYmxlPiBlbGVtZW50IG11c3QgY29udGFpbiBkZXNjcmlwdGl2ZSB0ZXh0XCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcGFzc2VkID0gQ29tbW9uVXRpbC5oYXNJbm5lckNvbnRlbnRIaWRkZW4ocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IHRhYmxlX2NhcHRpb25fbmVzdGVkOiBSdWxlID0ge1xuICAgIGlkOiBcInRhYmxlX2NhcHRpb25fbmVzdGVkXCIsXG4gICAgY29udGV4dDogXCJkb206Y2FwdGlvblwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiVmFsZXJpZV9DYXB0aW9uX0luVGFibGVcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJ0YWJsZV9jYXB0aW9uX25lc3RlZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcInRhYmxlX2NhcHRpb25fbmVzdGVkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJ0YWJsZV9jYXB0aW9uX25lc3RlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIjxjYXB0aW9uPiBlbGVtZW50IGlzIG5vdCBuZXN0ZWQgaW5zaWRlIGEgPHRhYmxlPiBlbGVtZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGhlIDxjYXB0aW9uPiBlbGVtZW50IG11c3QgYmUgbmVzdGVkIGluc2lkZSB0aGUgYXNzb2NpYXRlZCA8dGFibGU+IGVsZW1lbnRcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9USFJFRVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgbGV0IHBhc3NlZCA9IENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFwidGFibGVcIikgIT0gbnVsbDtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IFRhYmxlVXRpbCB9IGZyb20gXCIuLi91dGlsL1RhYmxlVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgdGFibGVfaGVhZGVyc19leGlzdHM6IFJ1bGUgPSB7XG4gICAgaWQ6IFwidGFibGVfaGVhZGVyc19leGlzdHNcIixcbiAgICBjb250ZXh0OiBcImRvbTp0YWJsZVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiUlBUX1RhYmxlX0RhdGFIZWFkaW5nc0FyaWFcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJ0YWJsZV9oZWFkZXJzX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcInRhYmxlX2hlYWRlcnNfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJ0YWJsZV9oZWFkZXJzX2V4aXN0cy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlRhYmxlIGhhcyBubyBoZWFkZXJzIGlkZW50aWZpZWRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJEYXRhIHRhYmxlIG11c3QgaWRlbnRpZnkgaGVhZGVyc1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgSFRNTFRhYmxlRWxlbWVudDtcbiAgICAgICAgLy8gSWYgdGhpcyBpcyBhIGxheW91dCB0YWJsZSBvciB0aGVyZSBhcmUgbm8gcm93cywgdGhlIHJ1bGUgZG9lcyBub3QgYXBwbHkuXG4gICAgICAgIGxldCByb3dzID0gcnVsZUNvbnRleHQucm93cztcbiAgICAgICAgaWYgKCFUYWJsZVV0aWwuaXNEYXRhVGFibGUocnVsZUNvbnRleHQpIHx8IHJvd3MgPT09IG51bGwgfHwgcm93cy5sZW5ndGggPT09IDApXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgcGFzc2VkID0gVGFibGVVdGlsLnRhYmxlSGVhZGVyRXhpc3RzKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKHBhc3NlZCA9PT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIFxuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IERPTVV0aWwgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5pbXBvcnQgeyBBUklBTWFwcGVyIH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQU1hcHBlclwiO1xuXG5leHBvcnQgY29uc3QgdGFibGVfaGVhZGVyc19yZWZfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwidGFibGVfaGVhZGVyc19yZWZfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbTp0ZFtoZWFkZXJzXSwgZG9tOnRoW2hlYWRlcnNdXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwidGFibGVfaGVhZGVyc19yZWZfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJ0YWJsZV9oZWFkZXJzX3JlZl92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcInRhYmxlX2hlYWRlcnNfcmVmX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8zXCI6IFwidGFibGVfaGVhZGVyc19yZWZfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzRcIjogXCJ0YWJsZV9oZWFkZXJzX3JlZl92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwidGFibGVfaGVhZGVyc19yZWZfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJUaGUgJ2hlYWRlcnMnIGF0dHJpYnV0ZSB2YWx1ZSBcXFwiezB9XFxcIiBkb2VzIG5vdCByZWZlcmVuY2UgYSB2YWxpZCAnaWQnIGluIHRoaXMgZG9jdW1lbnRcIixcbiAgICAgICAgICAgIFwiRmFpbF8yXCI6IFwiVGhlICdoZWFkZXJzJyBhdHRyaWJ1dGUgdmFsdWUgXFxcInswfVxcXCIgcmVmZXJzIHRvIGl0c2VsZlwiLFxuICAgICAgICAgICAgXCJGYWlsXzNcIjogXCJUaGUgJ2hlYWRlcnMnIGF0dHJpYnV0ZSB2YWx1ZSBcXFwiezB9XFxcIiBkb2VzIG5vdCByZWZlciB0byBhIGNlbGwgaW4gdGhlIHNhbWUgdGFibGVcIixcbiAgICAgICAgICAgIFwiRmFpbF80XCI6IFwiVGhlICdoZWFkZXJzJyBhdHRyaWJ1dGUgdmFsdWUgXFxcInswfVxcXCIgZG9lcyBub3QgcmVmZXIgdG8gYSBjZWxsIGluZGljYXRlZCB3aXRoIDx0aD4gb3IgYSByb2xlIG9mIFxcXCJjb2x1bW5oZWFkZXJcXFwiIG9yIFxcXCJyb3doZWFkZXJcXFwiXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiVGhlICdoZWFkZXJzJyBhdHRyaWJ1dGUgc2hvdWxkIHJlZmVyIHRvIGEgdmFsaWQgY2VsbCBpbiB0aGUgc2FtZSB0YWJsZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogW1wiYTI1ZjQ1XCJdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIGxldCBwYXJlbnRUYWJsZSA9IENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFwidGFibGVcIik7XG4gICAgICAgIGxldCBwYXJlbnRSb2xlID0gQVJJQU1hcHBlci5ub2RlVG9Sb2xlKHBhcmVudFRhYmxlKTtcbiAgICAgICAgLy8gSWYgdGhpcyBpcyBhIGxheW91dCB0YWJsZSBvciBhIHNpbXBsZSB0YWJsZSB0aGUgcnVsZSBkb2VzIG5vdCBhcHBseS5cbiAgICAgICAgaWYgKHBhcmVudFRhYmxlID09IG51bGwgfHwgIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShwYXJlbnRUYWJsZSkgfHwgIVtcInRhYmxlXCIsIFwiZ3JpZFwiXS5pbmNsdWRlcyhwYXJlbnRSb2xlKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGxldCBkb2MgPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50O1xuICAgICAgICBsZXQgdmFsdWUgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJoZWFkZXJzXCIpO1xuICAgICAgICBpZiAoIXZhbHVlKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IGlkcyA9IHZhbHVlLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgbGV0IGludmFsaWRIZWFkZXJWYWx1ZXMgPSBbXTtcbiAgICAgICAgbGV0IHNhbWVOb2RlSGVhZGVyVmFsdWVzID0gW107XG4gICAgICAgIGxldCBzYW1lVGFibGVIZWFkZXJWYWx1ZXMgPSBbXTtcbiAgICAgICAgbGV0IGludmFsaWRFbGVtSGVhZGVyVmFsdWVzID0gW107XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgaWQgPSBpZHNbaV07XG4gICAgICAgICAgICBpZiAoaWQudHJpbSgpID09PSAnJykgY29udGludWU7XG4gICAgICAgICAgICBjb25zdCBlbGVtID0gZG9jLmdldEVsZW1lbnRCeUlkKGlkKTtcbiAgICAgICAgICAgIGlmICghZWxlbSlcbiAgICAgICAgICAgICAgICBpbnZhbGlkSGVhZGVyVmFsdWVzLnB1c2goaWQpO1xuICAgICAgICAgICAgZWxzZSBpZiAoRE9NVXRpbC5zYW1lTm9kZShlbGVtLCBydWxlQ29udGV4dCkpXG4gICAgICAgICAgICAgICAgc2FtZU5vZGVIZWFkZXJWYWx1ZXMucHVzaChpZCk7XG4gICAgICAgICAgICBlbHNlIGlmICghRE9NVXRpbC5pc0luU2FtZVRhYmxlKGVsZW0sIHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgICAgICBzYW1lVGFibGVIZWFkZXJWYWx1ZXMucHVzaChpZCk7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgZWxlbU5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW1OYW1lICE9PSAndGgnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXMoZWxlbSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghcm9sZXMuaW5jbHVkZXMoJ2NvbHVtbmhlYWRlcicpICYmICFyb2xlcy5pbmNsdWRlcygncm93aGVhZGVyJykpXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkRWxlbUhlYWRlclZhbHVlcy5wdXNoKGlkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmVzdWx0cyA9IFtdO1xuICAgICAgICBpZiAoaW52YWxpZEhlYWRlclZhbHVlcy5sZW5ndGggIT0gMClcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaChSdWxlRmFpbChcIkZhaWxfMVwiLCBbaW52YWxpZEhlYWRlclZhbHVlcy50b1N0cmluZygpXSkpO1xuICAgICAgICBpZiAoc2FtZU5vZGVIZWFkZXJWYWx1ZXMubGVuZ3RoICE9IDApXG4gICAgICAgICAgICByZXN1bHRzLnB1c2goUnVsZUZhaWwoXCJGYWlsXzJcIiwgW3NhbWVOb2RlSGVhZGVyVmFsdWVzLnRvU3RyaW5nKCldKSk7XG4gICAgICAgIGlmIChzYW1lVGFibGVIZWFkZXJWYWx1ZXMubGVuZ3RoICE9IDApXG4gICAgICAgICAgICByZXN1bHRzLnB1c2goUnVsZUZhaWwoXCJGYWlsXzNcIiwgW3NhbWVUYWJsZUhlYWRlclZhbHVlcy50b1N0cmluZygpXSkpO1xuICAgICAgICBpZiAoaW52YWxpZEVsZW1IZWFkZXJWYWx1ZXMubGVuZ3RoICE9IDApXG4gICAgICAgICAgICByZXN1bHRzLnB1c2goUnVsZUZhaWwoXCJGYWlsXzRcIiwgW2ludmFsaWRFbGVtSGVhZGVyVmFsdWVzLnRvU3RyaW5nKCldKSk7XG5cbiAgICAgICAgaWYgKHJlc3VsdHMubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHRzO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlRmFpbCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgVGFibGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVGFibGVVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCB0YWJsZV9oZWFkZXJzX3JlbGF0ZWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwidGFibGVfaGVhZGVyc19yZWxhdGVkXCIsXG4gICAgY29udGV4dDogXCJkb206dGQsIGRvbTp0aFwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiVmFsZXJpZV9UYWJsZV9EYXRhQ2VsbFJlbGF0aW9uc2hpcHNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJ0YWJsZV9oZWFkZXJzX3JlbGF0ZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJ0YWJsZV9oZWFkZXJzX3JlbGF0ZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInRhYmxlX2hlYWRlcnNfcmVsYXRlZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIkNvbXBsZXggdGFibGUgZG9lcyBub3QgaGF2ZSBoZWFkZXJzIGZvciBlYWNoIGNlbGwgcHJvcGVybHkgZGVmaW5lZCB3aXRoICdoZWFkZXInIG9yICdzY29wZSdcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJGb3IgYSBjb21wbGV4IGRhdGEgdGFibGUsIGFsbCA8dGg+IGFuZCA8dGQ+IGVsZW1lbnRzIG11c3QgYmUgcmVsYXRlZCB2aWEgJ2hlYWRlcicgb3IgJ3Njb3BlJyBhdHRyaWJ1dGVzXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVFdPXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcGFyZW50VGFibGUgPSBDb21tb25VdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBcInRhYmxlXCIpO1xuICAgICAgICAvLyBJZiB0aGlzIGlzIGEgbGF5b3V0IHRhYmxlIG9yIGEgc2ltcGxlIHRhYmxlIHRoZSBydWxlIGRvZXMgbm90IGFwcGx5LlxuICAgICAgICBpZiAocGFyZW50VGFibGUgPT0gbnVsbCB8fCAhVGFibGVVdGlsLmlzQ29tcGxleERhdGFUYWJsZShwYXJlbnRUYWJsZSkpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgICAvLyBJZiB0aGlzIHRhYmxlIGhhc24ndCBiZWVuIHByZXByb2Nlc3NlZCwgcHJvY2VzcyBpdC5cbiAgICAgICAgaWYgKENhY2hlVXRpbC5nZXRDYWNoZShydWxlQ29udGV4dCwgXCJ0YWJsZV9oZWFkZXJzX3JlbGF0ZWRcIiwgbnVsbCkgPT09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIEJ1aWxkIGEgZ3JpZCB0aGF0J3MgYWN0dWFsbHkgdXNhYmxlIChyb3dzcGFuIGFuZCBjb2xzcGFuIGVsZW1lbnRzIGFyZSBkdXBsaWNhdGVkKVxuICAgICAgICAgICAgLy8gVGhpcyBidWlsZHMgYSByZWFsIDJkIHRhYmxlIGFycmF5LlxuICAgICAgICAgICAgbGV0IGdyaWQgPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFyZW50VGFibGUucm93cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIGxldCByb3cgPSBwYXJlbnRUYWJsZS5yb3dzW2ldO1xuICAgICAgICAgICAgICAgIGlmICghZ3JpZFtpXSkgZ3JpZFtpXSA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcm93LmNlbGxzLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjZWxsID0gcm93LmNlbGxzW2pdO1xuICAgICAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoY2VsbCwgXCJ0YWJsZV9oZWFkZXJzX3JlbGF0ZWRcIiwgaSArIFwiOlwiICsgaik7XG4gICAgICAgICAgICAgICAgICAgIGxldCB3aWR0aCA9IHBhcnNlSW50KGNlbGwuZ2V0QXR0cmlidXRlKFwiY29sc3BhblwiKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghd2lkdGgpIHdpZHRoID0gMTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGhlaWdodCA9IHBhcnNlSW50KGNlbGwuZ2V0QXR0cmlidXRlKFwicm93c3BhblwiKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaGVpZ2h0KSBoZWlnaHQgPSAxO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZ1ggPSAwO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoZ3JpZFtpXVtnWF0pIGdYICs9IDE7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgaGVpZ2h0OyArK2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZ3JpZFtpICsga10pIGdyaWRbaSArIGtdID0gW11cbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGwgPSAwOyBsIDwgd2lkdGg7ICsrbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyaWRbaSArIGtdW2dYICsgbF0gPSBjZWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJdGVyYXRlIHRocm91Z2ggdGhlIHRhYmxlIGdyaWQgYW5kIHJlY29yZCBoZWFkZXJzIHRoYXQgcG9pbnQgdG8gY2VsbHMgYW5kXG4gICAgICAgICAgICAvLyBjZWxscyB0aGF0IGFyZSBwb2ludGVkIHRvIGJ5IGhlYWRlcnNcbiAgICAgICAgICAgIGxldCBkb2MgPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50O1xuICAgICAgICAgICAgbGV0IGxvb2t1cCA9IHt9XG4gICAgICAgICAgICBsZXQgc2NvcGVkQ29scyA9IHt9O1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBncmlkLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJvd1Njb3BlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgZ3JpZFtpXS5sZW5ndGg7ICsraikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZ3JpZENlbGwgPSBncmlkW2ldW2pdO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZ3JpZE5vZGVOYW1lID0gZ3JpZENlbGwubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGdyaWROb2RlTmFtZSA9PSBcInRoXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChncmlkQ2VsbC5nZXRBdHRyaWJ1dGUoXCJzY29wZVwiKSA9PSBcInJvd1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm93U2NvcGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSdzIGFuIGF4aXMgYXR0cmlidXRlLCBpdCBtdXN0IGJlIHJlZmVycmVkIHRvIGJ5IGhlYWRlcnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2NvcGUgaXMgbm90IGVub3VnaC5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUNvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkoZ3JpZENlbGwsIFwiYXhpc1wiKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9va3VwW0NhY2hlVXRpbC5nZXRDYWNoZShncmlkQ2VsbCwgXCJ0YWJsZV9oZWFkZXJzX3JlbGF0ZWRcIiwgbnVsbCldID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZ3JpZENlbGwuZ2V0QXR0cmlidXRlKFwic2NvcGVcIikgPT0gXCJjb2xcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlZENvbHNbal0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlJ3MgYW4gYXhpcyBhdHRyaWJ1dGUsIGl0IG11c3QgYmUgcmVmZXJyZWQgdG8gYnkgaGVhZGVycyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzY29wZSBpcyBub3QgZW5vdWdoLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShncmlkQ2VsbCwgXCJheGlzXCIpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rdXBbQ2FjaGVVdGlsLmdldENhY2hlKGdyaWRDZWxsLCBcInRhYmxlX2hlYWRlcnNfcmVsYXRlZFwiLCBudWxsKV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gSGVhZGVycyBjYW4gcmVmZXIgdG8gb3RoZXIgaGVhZGVyc1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkoZ3JpZENlbGwsIFwiaGVhZGVyc1wiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoZHJzID0gZ3JpZENlbGwuZ2V0QXR0cmlidXRlKFwiaGVhZGVyc1wiKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBoZHJzLmxlbmd0aDsgKytrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoZWFkRWxlbSA9IGRvYy5nZXRFbGVtZW50QnlJZChoZHJzW2tdLnRyaW0oKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoZWFkRWxlbSAmJiBDb21tb25VdGlsLmdldEFuY2VzdG9yKGhlYWRFbGVtLCBcInRhYmxlXCIpID09IHBhcmVudFRhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rdXBbQ2FjaGVVdGlsLmdldENhY2hlKGhlYWRFbGVtLCBcInRhYmxlX2hlYWRlcnNfcmVsYXRlZFwiLCBudWxsKV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGdyaWROb2RlTmFtZSA9PSBcInRkXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3dTY29wZWQgfHwgc2NvcGVkQ29sc1tqXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb2t1cFtDYWNoZVV0aWwuZ2V0Q2FjaGUoZ3JpZENlbGwsIFwidGFibGVfaGVhZGVyc19yZWxhdGVkXCIsIG51bGwpXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkoZ3JpZENlbGwsIFwiaGVhZGVyc1wiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoZHJzID0gZ3JpZENlbGwuZ2V0QXR0cmlidXRlKFwiaGVhZGVyc1wiKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBoZHJzLmxlbmd0aDsgKytrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoZWFkRWxlbSA9IGRvYy5nZXRFbGVtZW50QnlJZChoZHJzW2tdLnRyaW0oKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoZWFkRWxlbSAmJiBDb21tb25VdGlsLmdldEFuY2VzdG9yKGhlYWRFbGVtLCBcInRhYmxlXCIpID09IHBhcmVudFRhYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29rdXBbQ2FjaGVVdGlsLmdldENhY2hlKGdyaWRDZWxsLCBcInRhYmxlX2hlYWRlcnNfcmVsYXRlZFwiLCBudWxsKV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9va3VwW0NhY2hlVXRpbC5nZXRDYWNoZShoZWFkRWxlbSwgXCJ0YWJsZV9oZWFkZXJzX3JlbGF0ZWRcIiwgbnVsbCldID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShwYXJlbnRUYWJsZSwgXCJ0YWJsZV9oZWFkZXJzX3JlbGF0ZWRcIiwgbG9va3VwKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByY0luZm8gPSBDYWNoZVV0aWwuZ2V0Q2FjaGUocnVsZUNvbnRleHQsIFwidGFibGVfaGVhZGVyc19yZWxhdGVkXCIsIG51bGwpO1xuICAgICAgICBsZXQgdEluZm8gPSBDYWNoZVV0aWwuZ2V0Q2FjaGUocGFyZW50VGFibGUsIFwidGFibGVfaGVhZGVyc19yZWxhdGVkXCIsIG51bGwpO1xuICAgICAgICBsZXQgcGFzc2VkID0gcmNJbmZvICYmIHRJbmZvICYmIHJjSW5mbyBpbiB0SW5mbztcblxuICAgICAgICBpZiAoIXBhc3NlZCAmJiByY0luZm8gPT09IFwiMDowXCIgJiZcbiAgICAgICAgICAgIENvbW1vblV0aWwuZ2V0SW5uZXJUZXh0KHJ1bGVDb250ZXh0KS50cmltKCkubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIC8vIFdlIGRvbid0IHRlc3QgaWYgaXQncyB0aGUgdXBwZXItbGVmdCBjZWxsIGFuZCBpdCdzIGVtcHR5XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRoZSB0YWJsZSBoYXMgbm8gdGgncywgaXQgbWF5IGp1c3QgYmUgdGhhdCB0aGlzIHdhcyBzdXBwb3NlZCB0byBiZSBhIGxheW91dFxuICAgICAgICAvLyB0YWJsZSwgd2hpY2ggaW50cm9kdWNlcyBhIGxvdCBvZiBub2lzZS4gIEluIHRoYXQgY2FzZSwgb25seSB0cmlnZ2VyIHRoaXMgZXJyb3JcbiAgICAgICAgLy8gb25jZSBwZXIgdGFibGUuXG4gICAgICAgIGlmICghcGFzc2VkICYmIHBhcmVudFRhYmxlLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwidGhcIikubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgIGlmIChDYWNoZVV0aWwuZ2V0Q2FjaGUocGFyZW50VGFibGUsIFwidGFibGVfaGVhZGVyc19yZWxhdGVkX1RyaWdPbmNlXCIsIGZhbHNlKSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShwYXJlbnRUYWJsZSwgXCJ0YWJsZV9oZWFkZXJzX3JlbGF0ZWRfVHJpZ09uY2VcIiwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXBhc3NlZCkge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgVGFibGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVGFibGVVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCB0YWJsZV9sYXlvdXRfbGluZWFyaXplZDogUnVsZSA9IHtcbiAgICBpZDogXCJ0YWJsZV9sYXlvdXRfbGluZWFyaXplZFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOnRhYmxlXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfVGFibGVfTGF5b3V0VHJpZ2dlclwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIlBvdGVudGlhbF8xXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJ0YWJsZV9sYXlvdXRfbGluZWFyaXplZC5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwidGFibGVfbGF5b3V0X2xpbmVhcml6ZWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInRhYmxlX2xheW91dF9saW5lYXJpemVkLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiUG90ZW50aWFsXzFcIjogXCJWZXJpZnkgdGFibGUgaXMgbm90IGJlaW5nIHVzZWQgdG8gZm9ybWF0IHRleHQgY29udGVudCBpbiBjb2x1bW5zIHVubGVzcyB0aGUgdGFibGUgY2FuIGJlIGxpbmVhcml6ZWRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJBdm9pZCB1c2luZyB0YWJsZXMgdG8gZm9ybWF0IHRleHQgZG9jdW1lbnRzIGluIGNvbHVtbnMgdW5sZXNzIHRoZSB0YWJsZSBjYW4gYmUgbGluZWFyaXplZFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfRk9VUlxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBydWxlXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgcGFzc2VkID0gIVRhYmxlVXRpbC5pc0xheW91dFRhYmxlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwiUGFzc18wXCIpO1xuICAgICAgICBpZiAoIXBhc3NlZCkgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJQb3RlbnRpYWxfMVwiKTtcblxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcblxuZXhwb3J0IGNvbnN0IHRhYmxlX3Njb3BlX3ZhbGlkOiBSdWxlID0ge1xuICAgIGlkOiBcInRhYmxlX3Njb3BlX3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJkb206dGRbc2NvcGVdLCBkb206dGhbc2NvcGVdXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfVGFibGVfU2NvcGVfVmFsaWRcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJQYXNzXzBcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiRmFpbF8xXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcIkZhaWxfMlwifVxuICAgIH0sXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwidGFibGVfc2NvcGVfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJ0YWJsZV9zY29wZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcIkZhaWxfMlwiOiBcInRhYmxlX3Njb3BlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJ0YWJsZV9zY29wZV92YWxpZC5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcIkZhaWxfMVwiOiBcIlZhbHVlIHByb3ZpZGVkIGlzIGludmFsaWQgZm9yIHRoZSAnc2NvcGUnIGF0dHJpYnV0ZVwiLFxuICAgICAgICAgICAgXCJGYWlsXzJcIjogXCJUaGUgJ3Njb3BlJyBhdHRyaWJ1dGUgc2hvdWxkIG9ubHkgYmUgdXNlZCBvbiBhIDx0aD4gZWxlbWVudFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlZhbHVlIGZvciAnc2NvcGUnIGF0dHJpYnV0ZSBtdXN0IGJlIFxcXCJyb3dcXFwiLCBcXFwiY29sXFxcIiwgXFxcInJvd2dyb3VwXFxcIiwgb3IgXFxcImNvbGdyb3VwXFxcIlwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RXT1xuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgRWxlbWVudDtcbiAgICAgICAgY29uc3Qgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAobm9kZU5hbWUgPT09ICd0ZCcpXG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzJcIik7XG5cbiAgICAgICAgLy9vbmx5IGNvbnRpbnVlIGZvciAndGgnXG4gICAgICAgIGxldCBzY29wZVZhbCA9IHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInNjb3BlXCIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBsZXQgcGFzc2VkID0gL14ocm93fGNvbHxyb3dncm91cHxjb2xncm91cCkkLy50ZXN0KHNjb3BlVmFsKTtcbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcIkZhaWxfMVwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcIlBhc3NfMFwiKTtcbiAgICAgICAgfVxuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgVGFibGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVGFibGVVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCB0YWJsZV9zdHJ1Y3R1cmVfbWlzdXNlOiBSdWxlID0ge1xuICAgIGlkOiBcInRhYmxlX3N0cnVjdHVyZV9taXN1c2VcIixcbiAgICBjb250ZXh0OiBcImRvbTp0YWJsZVwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiV0NBRzIwX1RhYmxlX1N0cnVjdHVyZVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInRhYmxlX3N0cnVjdHVyZV9taXN1c2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJ0YWJsZV9zdHJ1Y3R1cmVfbWlzdXNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJ0YWJsZV9zdHJ1Y3R1cmVfbWlzdXNlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiVGhlIDx7MH0+IGVsZW1lbnQgd2l0aCBcXFwicHJlc2VudGF0aW9uXFxcIiByb2xlIG9yIFxcXCJub25lXFxcIiByb2xlIGhhcyBzdHJ1Y3R1cmFsIGVsZW1lbnQocykgYW5kL29yIGF0dHJpYnV0ZShzKSAnezF9J1wiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRhYmxlIGVsZW1lbnRzIHdpdGggJ3JvbGU9XFxcInByZXNlbnRhdGlvblxcXCIgb3IgJ3JvbGU9XFxcIm5vbmVcXFwiIHNob3VsZCBub3QgaGF2ZSBzdHJ1Y3R1cmFsIGVsZW1lbnRzIG9yIGF0dHJpYnV0ZXNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4xXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vc2tpcCB0aGUgcnVsZVxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgLy8gSkNIIC0gT1VUIE9GIFNDT1BFIGhpZGRlbiBpbiBjb250ZXh0XG4gICAgICAgIGlmIChUYWJsZVV0aWwuaXNEYXRhVGFibGUocnVsZUNvbnRleHQpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKEFyaWFVdGlsLmlzTm9kZUluR3JpZChydWxlQ29udGV4dCkpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCBlcnJvck5vZGVzID0gW107XG4gICAgICAgIGlmIChDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcInN1bW1hcnlcIikpXG4gICAgICAgICAgICBlcnJvck5vZGVzLnB1c2gocnVsZUNvbnRleHQpO1xuXG4gICAgICAgIGxldCBjYXB0aW9uRWxlbXMgPSBydWxlQ29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZShcImNhcHRpb25cIik7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2FwdGlvbkVsZW1zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBpZiAoQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihjYXB0aW9uRWxlbXNbaV0sIFwidGFibGVcIikgPT0gcnVsZUNvbnRleHQpIHtcblxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBub2RlIHNob3VsZCBiZSBza2lwcGVkIG9yIG5vdCBiYXNlZCBvbiB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyBhbmQgaWYgdGhlIG5vZGUgaXNWaXNpYmxlIG9yXG4gICAgICAgICAgICAgICAgLy8gbm90LlxuICAgICAgICAgICAgICAgIGlmIChDb21tb25VdGlsLnNob3VsZE5vZGVCZVNraXBwZWRIaWRkZW4oY2FwdGlvbkVsZW1zW2ldKSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIG5vZGUgdG8gdGhlIGVycm9yTm9kZXNcbiAgICAgICAgICAgICAgICBlcnJvck5vZGVzLnB1c2goY2FwdGlvbkVsZW1zW2ldKTtcblxuICAgICAgICAgICAgICAgIC8vIFNpbmNlIHdlIGFyZSBub3QgYWN0dWFsbHkgbWFraW5nIHVzZSBvZiB0aGVzZXMgZXJyb3JOb2RlcyBldmVuIHRob3VnaCB0aGV5IGFyZSBwYXNzZWQgYWxvbmcgd2l0aFxuICAgICAgICAgICAgICAgIC8vIFZhbGlkYXRpb25SZXN1bHQsIHdlIGRvIG5vdCBuZWVkIHRvIGtlZXAgbG9vcGluZyBvdmVyIGFuZCBnZXR0aW5nIGV2ZXJ5IHNpbmdsZSB2aW9sYXRpbmcgbm9kZSB1bmRlclxuICAgICAgICAgICAgICAgIC8vIHRoZSBydWxlIGNvbnRleHQuIFRoaXMgY2FuIGJlIGEgZnV0dXJlIGVuaGFuY2VubWVudCB3aGVyZSB3ZSBhY3R1YWxseSBtYWtlIHVzZSBvZiB0aGUgZXJyb3Igbm9kZXMgdGhhdFxuICAgICAgICAgICAgICAgIC8vIGFyZSBwYXNzZWQgYWxvbmcuIEFkZGluZyB0aGlzIGJyZWFrIHRvIHNwZWVkIHVwIHBlcmZvcm1hbmNlIGF0IHRoaXMgcG9pbnQuXG4gICAgICAgICAgICAgICAgYnJlYWs7IC8vIFRoZXJlIGlzIG5vIHBvaW50IHRvIGtlZXAgYWRkaW5nIHRoZSBlcnJvciBub2Rlcywgc3RvcCBhZnRlciBmaW5kaW5nIHRoZSBmaXJzdCBvbmVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB0aE5vZGVzID0gcnVsZUNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJ0aFwiKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aE5vZGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBpZiAoQ29tbW9uVXRpbC5nZXRBbmNlc3Rvcih0aE5vZGVzW2ldLCBcInRhYmxlXCIpID09IHJ1bGVDb250ZXh0KSB7XG5cbiAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgbm9kZSBzaG91bGQgYmUgc2tpcHBlZCBvciBub3QgYmFzZWQgb24gdGhlIENoZWNrIEhpZGRlbiBDb250ZW50IHNldHRpbmcgYW5kIGlmIHRoZSBub2RlIGlzVmlzaWJsZSBvclxuICAgICAgICAgICAgICAgIC8vIG5vdC5cbiAgICAgICAgICAgICAgICBpZiAoQ29tbW9uVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKHRoTm9kZXNbaV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgbm9kZSB0byB0aGUgZXJyb3JOb2Rlc1xuICAgICAgICAgICAgICAgIGVycm9yTm9kZXMucHVzaCh0aE5vZGVzW2ldKTtcblxuICAgICAgICAgICAgICAgIC8vIFNpbmNlIHdlIGFyZSBub3QgYWN0dWFsbHkgbWFraW5nIHVzZSBvZiB0aGVzZXMgZXJyb3JOb2RlcyBldmVuIHRob3VnaCB0aGV5IGFyZSBwYXNzZWQgYWxvbmcgd2l0aFxuICAgICAgICAgICAgICAgIC8vIFZhbGlkYXRpb25SZXN1bHQsIHdlIGRvIG5vdCBuZWVkIHRvIGtlZXAgbG9vcGluZyBvdmVyIGFuZCBnZXR0aW5nIGV2ZXJ5IHNpbmdsZSB2aW9sYXRpbmcgbm9kZSB1bmRlclxuICAgICAgICAgICAgICAgIC8vIHRoZSBydWxlIGNvbnRleHQuIFRoaXMgY2FuIGJlIGEgZnV0dXJlIGVuaGFuY2VubWVudCB3aGVyZSB3ZSBhY3R1YWxseSBtYWtlIHVzZSBvZiB0aGUgZXJyb3Igbm9kZXMgdGhhdFxuICAgICAgICAgICAgICAgIC8vIGFyZSBwYXNzZWQgYWxvbmcuIEFkZGluZyB0aGlzIGJyZWFrIHRvIHNwZWVkIHVwIHBlcmZvcm1hbmNlIGF0IHRoaXMgcG9pbnQuXG4gICAgICAgICAgICAgICAgYnJlYWs7IC8vIFRoZXJlIGlzIG5vIHBvaW50IHRvIGtlZXAgYWRkaW5nIHRoZSBlcnJvciBub2Rlcywgc3RvcCBhZnRlciBmaW5kaW5nIHRoZSBmaXJzdCBvbmVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgdGROb2RlcyA9IHJ1bGVDb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwidGRcIik7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGROb2Rlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgaWYgKCh0ZE5vZGVzW2ldLmhhc0F0dHJpYnV0ZShcInNjb3BlXCIpIHx8IHRkTm9kZXNbaV0uaGFzQXR0cmlidXRlKFwiaGVhZGVyc1wiKSkgJiZcbiAgICAgICAgICAgICAgICBDb21tb25VdGlsLmdldEFuY2VzdG9yKHRkTm9kZXNbaV0sIFwidGFibGVcIikgPT0gcnVsZUNvbnRleHQpIHtcblxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBub2RlIHNob3VsZCBiZSBza2lwcGVkIG9yIG5vdCBiYXNlZCBvbiB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyBhbmQgaWYgdGhlIG5vZGUgaXNWaXNpYmxlIG9yXG4gICAgICAgICAgICAgICAgLy8gbm90LlxuICAgICAgICAgICAgICAgIGlmIChDb21tb25VdGlsLnNob3VsZE5vZGVCZVNraXBwZWRIaWRkZW4odGROb2Rlc1tpXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gQWRkIHRoZSBub2RlIHRvIHRoZSBlcnJvck5vZGVzXG4gICAgICAgICAgICAgICAgZXJyb3JOb2Rlcy5wdXNoKHRkTm9kZXNbaV0pO1xuXG4gICAgICAgICAgICAgICAgLy8gU2luY2Ugd2UgYXJlIG5vdCBhY3R1YWxseSBtYWtpbmcgdXNlIG9mIHRoZXNlcyBlcnJvck5vZGVzIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIHBhc3NlZCBhbG9uZyB3aXRoXG4gICAgICAgICAgICAgICAgLy8gVmFsaWRhdGlvblJlc3VsdCwgd2UgZG8gbm90IG5lZWQgdG8ga2VlcCBsb29waW5nIG92ZXIgYW5kIGdldHRpbmcgZXZlcnkgc2luZ2xlIHZpb2xhdGluZyBub2RlIHVuZGVyXG4gICAgICAgICAgICAgICAgLy8gdGhlIHJ1bGUgY29udGV4dC4gVGhpcyBjYW4gYmUgYSBmdXR1cmUgZW5oYW5jZW5tZW50IHdoZXJlIHdlIGFjdHVhbGx5IG1ha2UgdXNlIG9mIHRoZSBlcnJvciBub2RlcyB0aGF0XG4gICAgICAgICAgICAgICAgLy8gYXJlIHBhc3NlZCBhbG9uZy4gQWRkaW5nIHRoaXMgYnJlYWsgdG8gc3BlZWQgdXAgcGVyZm9ybWFuY2UgYXQgdGhpcyBwb2ludC5cbiAgICAgICAgICAgICAgICBicmVhazsgLy8gVGhlcmUgaXMgbm8gcG9pbnQgdG8ga2VlcCBhZGRpbmcgdGhlIGVycm9yIG5vZGVzLCBzdG9wIGFmdGVyIGZpbmRpbmcgdGhlIGZpcnN0IG9uZVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gR2V0IHRoZSBub2RlIG5hbWUgZm9yIHRoZSBydWxlIGNvbnRleHQgZWxlbWVudCBpbiB0aGlzIGNhc2UgaXQgd2lsbCBhbHdheXMgYmUgdGFibGVcbiAgICAgICAgbGV0IGN1cnJlbnRFbGVtZW50VG9rZW4gPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICAgIC8vIENvbnN0cnVjdCBhIG5ldyBhcnJheSB3aGljaCB3aWxsIGNvbnRhbiBvbmx5IHRoZSBlbGVtZW50IHRhZyBmb3IgdGhlIHZpb2xhdGlvbiBlbGVtZW50c1xuICAgICAgICBsZXQgc3RydWN0dXJhbEVsZW1lbnRUb2tlbnMgPSBuZXcgQXJyYXkoKTtcblxuICAgICAgICAvLyBDb25zdHJ1Y3QgYSBzZWVuIGhhc2ggdGhhdCB3aWxsIGtlZXAgdHJhc2sgb2YgYWxsIHRoZSBlbGVtZW50cyB0aGF0IHdlcmUgYWxyZWFkeSBhZGRlZCB0byB0aGUgdG9rZW4gYXJyYXksIHRvIG1ha2Ugc3VyZVxuICAgICAgICAvLyB3ZSBkbyBub3QgZHVwbGljYXRlIGFueSBvZiB0aGUgZWxlbWVudHMuIER1cGxpY2F0ZSBlbGVtZW50IHRhZ3MgaW4gdGhlIHRva2VuIG1lc3NhZ2UgbG9va3MgYmFkIGFuZCBjb25mdXNpbmcuXG4gICAgICAgIGxldCBzZWVuID0ge307XG5cbiAgICAgICAgLy8gTG9vcCB0aHJvdWdoIGFsbCB0aGUgdmlvbGF0aW5nIHN0cnVjdHVyYWwgZWxlbWVudHMgYW5kIGV4dHJhY3QgdGhlIGVsZW1lbnQgdGFnIHRvIGJlIHVzZWQgYXMgYSB0b2tlblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVycm9yTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIC8vIEdldCB0aGUgbm9kZSBuYW1lICh0YWcgbmFtZSkgZm9yIHRoZSB2aW9sYXRpbmcgc3RydWN0dXJhbCBlbGVtZW50XG4gICAgICAgICAgICBsZXQgbm9kZU5hbWUgPSBlcnJvck5vZGVzW2ldLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgICAgIC8vIE9ubHkgbmVlZCB0byBhZGQgdGhlIHZpb2xhdGluZyBlbGVtZW50IG9uY2VcbiAgICAgICAgICAgIGlmICghc2Vlbi5oYXNPd25Qcm9wZXJ0eShub2RlTmFtZSkpIHtcbiAgICAgICAgICAgICAgICAvLyBTaW5jZSB3ZSBhcmUgYWRkaW5nIHRoZSB0b2tlbiBhcyBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyB3ZSBuZWVkIHRvIGhhbmRsZVxuICAgICAgICAgICAgICAgIC8vIHRoZSBzdW1tYXJ5IGF0dHJpYnV0ZSBvbiB0aGUgcnVsZUNvbnRleHQgKHRhYmxlKS4gV2Ugb25seSBhZGQgc3VtbWFyeSBvbmNlLCBzYW1lIGFzXG4gICAgICAgICAgICAgICAgLy8gZm9yIGVsZW1lbnRzIHRvIGF2b2lkIGR1cGxpY2F0aW9uIGluIHRoZSBtZXNzYWdlLiAoU3VtbWFyeSBzaG91bGQgbm90IGR1cGxpY2F0ZSwgYnV0IGp1c3QgaW4gY2FzZSlcbiAgICAgICAgICAgICAgICBpZiAobm9kZU5hbWUgPT0gXCJ0YWJsZVwiICYmICFzZWVuLmhhc093blByb3BlcnR5W1wic3VtbWFyeVwiXSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBNYXJrIHRoaXMgYXMgYSBuZXcgYXR0cmlidXRlXG4gICAgICAgICAgICAgICAgICAgIHNlZW5bXCJzdW1tYXJ5XCJdID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBTaW5jZSB0aGlzIGlzIGEgbmV3IHZpb2xhdGluZyBlbGVtZW50IGFkZCBpdCB0byB0aGUgc3RydWN0dXJhbCBlbGVtZW50IHRva2VucyBhcnJheVxuICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmFsRWxlbWVudFRva2Vucy5wdXNoKFwic3VtbWFyeVwiKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBNYXJrIHRoaXMgYXMgYSBuZXcgZWxlbWVudFxuICAgICAgICAgICAgICAgICAgICBzZWVuW25vZGVOYW1lXSA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gU2luY2UgdGhpcyBpcyBhIG5ldyB2aW9sYXRpbmcgZWxlbWVudCBhZGQgaXQgdG8gdGhlIHN0cnVjdHVyYWwgZWxlbWVudCB0b2tlbnMgYXJyYXlcbiAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJhbEVsZW1lbnRUb2tlbnMucHVzaChub2RlTmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2UgbmVlZCB0byB0YWtlIHRoZSBhcnJheSBvZiBzdHJ1Y3R1cmFsIGVsZW1lbnRzIGFuZCBqb2luIHRoZW0gd2l0aCBhIGNvbW1hIGFuZCBhIHNwYWNlIHRvIG1ha2UgZ3JhbW1hdGljYWwgY29ycmVjdCBpblxuICAgICAgICAvLyB0aGUgbWVzc2FnZS5cbiAgICAgICAgbGV0IHN0cnVjdHVyYWxFbGVtZW50VG9rZW5zU3RyID0gc3RydWN0dXJhbEVsZW1lbnRUb2tlbnMuam9pbihcIiwgXCIpO1xuXG4gICAgICAgIC8vcmV0dXJuIG5ldyBWYWxpZGF0aW9uUmVzdWx0KGVycm9yTm9kZXMubGVuZ3RoID09IDAsIGVycm9yTm9kZXMsICcnLCAnJywgW2N1cnJlbnRFbGVtZW50VG9rZW4sIHN0cnVjdHVyYWxFbGVtZW50VG9rZW5zXSk7XG4gICAgICAgIGlmIChlcnJvck5vZGVzLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJGYWlsXzFcIiwgW2N1cnJlbnRFbGVtZW50VG9rZW4sIHN0cnVjdHVyYWxFbGVtZW50VG9rZW5zU3RyXSk7XG4gICAgICAgIH1cbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG5pbXBvcnQgeyBET01VdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01VdGlsXCI7XG5cbmV4cG9ydCBjb25zdCB0YWJsZV9zdW1tYXJ5X3JlZHVuZGFudDogUnVsZSA9IHtcbiAgICBpZDogXCJ0YWJsZV9zdW1tYXJ5X3JlZHVuZGFudFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOnRhYmxlXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJXQ0FHMjBfVGFibGVfQ2FwU3VtbVJlZHVuZGFudFwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcIlBhc3NfMFwiLFxuICAgICAgICAgICAgXCJGYWlsXzFcIjogXCJGYWlsXzFcIn1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInRhYmxlX3N1bW1hcnlfcmVkdW5kYW50Lmh0bWxcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwidGFibGVfc3VtbWFyeV9yZWR1bmRhbnQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInRhYmxlX3N1bW1hcnlfcmVkdW5kYW50Lmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwiUGFzc18wXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiVGhlIHRhYmxlIHN1bW1hcnkgZHVwbGljYXRlcyB0aGUgY2FwdGlvblwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSB0YWJsZSBzdW1tYXJ5IG11c3Qgbm90IGR1cGxpY2F0ZSB0aGUgY2FwdGlvblwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICBsZXQgcG9mSWQ7XG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuICAgICAgICBsZXQgc3VtU3RyO1xuICAgICAgICBpZiAocnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwic3VtbWFyeVwiKSkge1xuICAgICAgICAgICAgcG9mSWQgPSAwO1xuICAgICAgICAgICAgc3VtU3RyID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwic3VtbWFyeVwiKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgfSBlbHNlIGlmIChydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhcmlhLWRlc2NyaWJlZGJ5XCIpKSB7XG4gICAgICAgICAgICBwb2ZJZCA9IDE7XG4gICAgICAgICAgICBsZXQgc3VtbWFyeU5vZGVJZHMgPSBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhcmlhLWRlc2NyaWJlZGJ5XCIpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgIGxldCBzdW1tYXJ5Tm9kZUNvbmNhdCA9IFwiXCI7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN1bW1hcnlOb2RlSWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHN1bW1hcnlOb2RlSWQgPSBzdW1tYXJ5Tm9kZUlkc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoc3VtbWFyeU5vZGVJZCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgc3VtbWFyeU5vZGUgPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChydWxlQ29udGV4dCwgc3VtbWFyeU5vZGVJZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdW1tYXJ5Tm9kZSAmJiAhRE9NVXRpbC5zYW1lTm9kZShzdW1tYXJ5Tm9kZSxydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1bW1hcnlOb2RlQ29uY2F0ICs9IFwiIFwiICsgQ29tbW9uVXRpbC5nZXRJbm5lclRleHQoc3VtbWFyeU5vZGUpLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3VtU3RyID0gc3VtbWFyeU5vZGVDb25jYXQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFzdW1TdHIpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IGNhcEVsZW1zID0gcnVsZUNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJjYXB0aW9uXCIpO1xuICAgICAgICAgICAgaWYgKGNhcEVsZW1zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChzdW1TdHIubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCBjYXBTdHIgPSBDb21tb25VdGlsLmdldElubmVyVGV4dChjYXBFbGVtc1swXSkudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgaWYgKCFzdW1TdHIuaW5jbHVkZXMoY2FwU3RyKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBhc3MoXCJQYXNzXzBcIik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwiRmFpbF8xXCIpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSwgUnVsZUZhaWwsIFJ1bGVQb3RlbnRpYWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IERPTU1hcHBlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NTWFwcGVyXCI7XG5pbXBvcnQgeyBDU1NVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ1NTVXRpbFwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ2FjaGVVdGlsXCI7XG4gICAgXG4gICAgZXhwb3J0IGNvbnN0IHRhcmdldF9zcGFjaW5nX3N1ZmZpY2llbnQ6IFJ1bGUgPSB7XG4gICAgICAgIGlkOiBcInRhcmdldF9zcGFjaW5nX3N1ZmZpY2llbnRcIixcbiAgICAgICAgY29udGV4dDogXCJkb206KlwiLFxuICAgICAgICBkZXBlbmRlbmNpZXM6IFtdLFxuICAgICAgICBoZWxwOiB7XG4gICAgICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgICAgICBcImdyb3VwXCI6IFwidGFyZ2V0X3NwYWNpbmdfc3VmZmljaWVudC5odG1sXCIsXG4gICAgICAgICAgICAgICAgXCJwYXNzX3NwYWNpbmdcIjogXCJ0YXJnZXRfc3BhY2luZ19zdWZmaWNpZW50Lmh0bWxcIixcbiAgICAgICAgICAgICAgICBcInBhc3Nfc2l6ZWRcIjogXCJ0YXJnZXRfc3BhY2luZ19zdWZmaWNpZW50Lmh0bWxcIixcbiAgICAgICAgICAgICAgICBcInBhc3NfaW5saW5lXCI6IFwidGFyZ2V0X3NwYWNpbmdfc3VmZmljaWVudC5odG1sXCIsXG4gICAgICAgICAgICAgICAgXCJwYXNzX2RlZmF1bHRcIjogXCJ0YXJnZXRfc3BhY2luZ19zdWZmaWNpZW50Lmh0bWxcIixcbiAgICAgICAgICAgICAgICBcInZpb2xhdGlvbl9zcGFjaW5nXCI6IFwidGFyZ2V0X3NwYWNpbmdfc3VmZmljaWVudC5odG1sXCIsXG4gICAgICAgICAgICAgICAgXCJyZWNvbW1lbmRhdGlvbl9pbmxpbmVcIjogXCJ0YXJnZXRfc3BhY2luZ19zdWZmaWNpZW50Lmh0bWxcIixcbiAgICAgICAgICAgICAgICBcInBvdGVudGlhbF9vdmVybGFwXCI6IFwidGFyZ2V0X3NwYWNpbmdfc3VmZmljaWVudC5odG1sXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbWVzc2FnZXM6IHtcbiAgICAgICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJUaGUgdGFyZ2V0IG11c3QgYmUgc3VmZmljaWVudGx5IHNpemVkIG9yIHNwYWNlZCBmcm9tIG90aGVyIHRhcmdldHNcIixcbiAgICAgICAgICAgICAgICBcInBhc3Nfc3BhY2luZ1wiOiBcIlRoZSB0YXJnZXQncyBzcGFjaW5nIGZyb20gb3RoZXIgdGFyZ2V0cyBpcyBzdWZmaWNpZW50XCIsXG4gICAgICAgICAgICAgICAgXCJwYXNzX3NpemVkXCI6IFwiVGhlIHRhcmdldOKAmXMgc2l6ZSBpcyBtb3JlIHRoYW4gMjQgQ1NTIHBpeGVsc1wiLFxuICAgICAgICAgICAgICAgIFwicGFzc19pbmxpbmVcIjogXCJUaGUgdGFyZ2V0IGlzIGluIGEgc2VudGVuY2Ugb3IgaXRzIHNpemUgaXMgb3RoZXJ3aXNlIGNvbnN0cmFpbmVkIGJ5IHRoZSBsaW5lLWhlaWdodCBvZiBub24tdGFyZ2V0IHRleHRcIixcbiAgICAgICAgICAgICAgICBcInBhc3NfZGVmYXVsdFwiOiBcIlRoZSB0YXJnZXQncyBzaXplIGlzIGRldGVybWluZWQgYnkgdGhlIHVzZXIgYWdlbnQgYW5kIGlzIG5vdCBtb2RpZmllZCBieSB0aGUgYXV0aG9yXCIsXG4gICAgICAgICAgICAgICAgXCJ2aW9sYXRpb25fc3BhY2luZ1wiOiBcIlVuZGVyc2l6ZWQgdGFyZ2V0IFxcXCJ7MH1cXFwiIGRvZXMgbm90IGhhdmUgc3VmZmljaWVudCBzcGFjaW5nIG9mIDEyIENTUyBwaXhlbHMgZnJvbSBhbm90aGVyIHRhcmdldCBcXFwiezF9XFxcIlwiLFxuICAgICAgICAgICAgICAgIFwicmVjb21tZW5kYXRpb25faW5saW5lXCI6IFwiQ29uZmlybSB0aGUgaW5saW5lIHRhcmdldCBcXFwiezB9XFxcIiBpcyBzdWZmaWNpZW50bHkgc3BhY2VkIGZyb20gYW5vdGhlciBpbmxpbmUgdGFyZ2V0IFxcXCJ7MX1cXFwiXCIsXG4gICAgICAgICAgICAgICAgXCJwb3RlbnRpYWxfb3ZlcmxhcFwiOiBcIkVuc3VyZSB0aGUgb3ZlcmxhcHBlZCB0YXJnZXQgXFxcInswfVxcXCIgbWVldHMgYSBtaW5pbXVtIHRhcmdldCBzaXplIG9yIGhhcyBzdWZmaWNpZW50IHNwYWNpbmcgZnJvbSB0aGUgb3ZlcmxhcHBpbmcgdGFyZ2V0IFxcXCJ7MX1cXFwiXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgcnVsZXNldHM6IFt7XG4gICAgICAgICAgICBpZDogWyBcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICAgICAgbnVtOiBbXCIyLjUuOFwiXSxcbiAgICAgICAgICAgIGxldmVsOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUUsXG4gICAgICAgICAgICByZWFzb25Db2RlczogW1wicGFzc19zcGFjaW5nXCIsXCJwYXNzX3NpemVkXCIsIFwicGFzc19pbmxpbmVcIixcInBhc3NfZGVmYXVsdFwiLCBcInZpb2xhdGlvbl9zcGFjaW5nXCIsIFwicG90ZW50aWFsX292ZXJsYXBcIl1cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgaWQ6IFsgXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgICAgIG51bTogW1wiMi41LjhcIl0sXG4gICAgICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3kuUkVDT01NRU5EQVRJT04sXG4gICAgICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfVEhSRUUsXG4gICAgICAgICAgICByZWFzb25Db2RlczogW1wicmVjb21tZW5kYXRpb25faW5saW5lXCJdXG4gICAgICAgIH1dLFxuICAgICAgICBhY3Q6IFtdLFxuICAgICAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICBjb25zdCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCk7IFxuICAgICAgICAgICAgXG4gICAgICAgICAgICBjb25zdCBtYXBwZXIgOiBET01NYXBwZXIgPSBuZXcgRE9NTWFwcGVyKCk7XG4gICAgICAgICAgICBjb25zdCBib3VuZHMgPSBtYXBwZXIuZ2V0VW5hZGp1c3RlZEJvdW5kcyhydWxlQ29udGV4dCk7IC8vY29udGV4dFtcImRvbVwiXS5ib3VuZHM7ICAgIFxuICAgICAgICAgICAgaWYgKCFib3VuZHMpIFxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBpZ25vcmUgaGlkZGVuLCBub24tdGFyZ2V0XG4gICAgICAgICAgICBpZiAoIUNvbW1vblV0aWwuaXNUYXJnZXQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgICAgICBpZiAoYm91bmRzLmhlaWdodCA+PSAyNCAmJiBib3VuZHMud2lkdGggPj0gMjQpXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc19zaXplZFwiKTsgXG5cbiAgICAgICAgICAgIC8vIGNoZWNrIGlubGluZSBlbGVtZW50OiB3aXRob3V0IHRleHQgaW4gdGhlIHNhbWUgbGluZVxuICAgICAgICAgICAgY29uc3Qgc3RhdHVzID0gQ1NTVXRpbC5nZXRJbmxpbmVTdGF0dXMocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgaWYgKHN0YXR1cyA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBpZiAoc3RhdHVzLmlubGluZSkge1xuICAgICAgICAgICAgICAgIGlmIChzdGF0dXMudGV4dCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzLnZpb2xhdGlvbiA9PT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NfaW5saW5lXCIpO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjYXNlIDE6IGlubGluZSBlbGVtZW50IGlzIHRvbyBjbG9zZSBob3Jpem9udGFsbHlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicmVjb21tZW5kYXRpb25faW5saW5lXCIsIFtub2RlTmFtZSwgc3RhdHVzLnZpb2xhdGlvbl0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMudmlvbGF0aW9uID09PSBudWxsKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc19kZWZhdWx0XCIpO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjYXNlIDE6IGlubGluZSBlbGVtZW50IGlzIHRvbyBjbG9zZSBob3Jpem9udGFsbHlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicmVjb21tZW5kYXRpb25faW5saW5lXCIsIFtub2RlTmFtZSwgc3RhdHVzLnZpb2xhdGlvbl0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIGJyb3dzZXIgZGVmYXVsdFxuICAgICAgICAgICAgICAgIGlmIChDU1NVdGlsLmlzVGFyZ2V0QnJvd3NlckRlZmF1bHQocnVsZUNvbnRleHQpKSBcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc19kZWZhdWx0XCIpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgZG9jID0gcnVsZUNvbnRleHQub3duZXJEb2N1bWVudDtcbiAgICAgICAgICAgIGlmICghZG9jKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGxldCBjU3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgIGlmIChjU3R5bGUgPT09IG51bGwpIFxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBsZXQgemluZGV4ID0gY1N0eWxlLnpJbmRleDsgICBcbiAgICAgICAgICAgIGlmICghemluZGV4IHx8IGlzTmFOKE51bWJlcih6aW5kZXgpKSlcbiAgICAgICAgICAgICAgICB6aW5kZXggPSBcIjBcIjtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gR2V0IHRoZSBsaXN0IG9mIHRhcmdldCBlbGVtZW50c1xuICAgICAgICAgICAgbGV0IHRhcmdldEVsZW1zID0gQ2FjaGVVdGlsLmdldENhY2hlKGRvYy5kb2N1bWVudEVsZW1lbnQsIFwidGFyZ2V0X3NwYWNpbmdfc3VmZmljaWVudDo6dGFyZ2V0c1wiLCB1bmRlZmluZWQpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0YXJnZXRFbGVtcyA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgICAgIHRhcmdldEVsZW1zID0gW107XG4gICAgICAgICAgICAgICAgLy9zZWxlY3QgYWxsIGVsZW1lbnRzIGV4Y2VwdCBpdHNlbGYgYW5kIGRlc2NlbmRhbnRzXG4gICAgICAgICAgICAgICAgbGV0IGVsZW1zID0gZG9jLnF1ZXJ5U2VsZWN0b3JBbGwoJ2JvZHkgKjpub3Qoc2NyaXB0KTpub3Qoc3R5bGUpJyk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgZWxlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZWxlbSA9IGVsZW1zW2ldIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICBpZiAoQ29tbW9uVXRpbC5pc1RhcmdldChlbGVtKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0RWxlbXMucHVzaChlbGVtKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZG9jLmRvY3VtZW50RWxlbWVudCwgXCJ0YXJnZXRfc3BhY2luZ19zdWZmaWNpZW50Ojp0YXJnZXRzXCIsIHRhcmdldEVsZW1zKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCF0YXJnZXRFbGVtcyB8fCB0YXJnZXRFbGVtcy5sZW5ndGggPT09IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuXG4gICAgICAgICAgICBsZXQgYmVmb3JlID0gdHJ1ZTtcbiAgICAgICAgICAgIGxldCBtaW5YID0gMjQ7XG4gICAgICAgICAgICBsZXQgbWluWSA9IDI0O1xuICAgICAgICAgICAgbGV0IGFkamFjZW50WCA9IG51bGw7XG4gICAgICAgICAgICBsZXQgYWRqYWNlbnRZID0gbnVsbDtcbiAgICAgICAgICAgIGxldCBjaGVja2VkID0gW107IC8vY29udGFpbnMgYSBsaXN0IG9mIGVsZW1lbnRzIHRoYXQgaGF2ZSBiZWVuIGNoZWNrZWQgc28gdGhlaXIgZGVzY2VuZGFudHMgZG9uJ3QgbmVlZCB0byBiZSBjaGVja2VkIGFnYWluXG4gICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCB0YXJnZXRFbGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW0gPSB0YXJnZXRFbGVtc1tpXSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgKiAgdGhlIG5vZGVzIHJldHVybmVkIGZyb20gcXVlcnlTZWxlY3RvckFsbCBpcyBpbiBkb2N1bWVudCBvcmRlclxuICAgICAgICAgICAgICAgICAqICBpZiB0d28gZWxlbWVudHMgb3ZlcmxhcCBhbmQgei1pbmRleCBhcmUgbm90IGRlZmluZWQsIHRoZW4gdGhlIG5vZGUgcmVuZGVyZWQgZWFybGllciB3aWxsIGJlIG92ZXJsYWlkIGJ5IHRoZSBub2RlIHJlbmRlcmVkIGxhdGVyXG4gICAgICAgICAgICAgICAgICogIGZpbHRlciBvdXQgdGhlIGVsZW1lbnRzIHRoYXTigJlyZSBkZXNjZW5kYW50IG9yIGFuY2VzdG9ycyBvZiB0aGUgdGFyZ2V0IGVsZW1lbnQsIG5vciBkZXNjZW5kYW50IG9mIHRoZSB0YXJnZXQgZWxlbWVudCdzIHNpYmxpbmdzXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgLy8gVXNlIGNvbXBhcmVEb2N1bWVudFBvc2l0aW9uIHRvIGNoZWNrIGNvbnRhaW5tZW50IHJlbGF0aW9uc2hpcHNcbiAgICAgICAgICAgICAgICAvLyBOb3RlOiBjb21wYXJlRG9jdW1lbnRQb3NpdGlvbiByZXR1cm5zIDAgd2hlbiBjb21wYXJpbmcgYSBub2RlIHRvIGl0c2VsZlxuICAgICAgICAgICAgICAgIGNvbnN0IHBvc2l0aW9uID0gcnVsZUNvbnRleHQuY29tcGFyZURvY3VtZW50UG9zaXRpb24oZWxlbSk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gRE9DVU1FTlRfUE9TSVRJT05fQ09OVEFJTkVEX0JZICgxNik6IGVsZW0gaXMgY29udGFpbmVkIGJ5IHJ1bGVDb250ZXh0XG4gICAgICAgICAgICAgICAgLy8gQWxzbyBoYW5kbGUgc2VsZi1jb21wYXJpc29uIChwb3NpdGlvbiA9PT0gMClcbiAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24gPT09IDAgfHwgKHBvc2l0aW9uICYgTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9DT05UQUlORURfQlkpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vdGhlIG5leHQgbm9kZSBpbiBlbGVtcyB3aWxsIGJlIGFmdGVyIHRoZSB0YXJnZXQgbm9kZSAocnVsZUNvbnRleHQpLlxuICAgICAgICAgICAgICAgICAgICBiZWZvcmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIERPQ1VNRU5UX1BPU0lUSU9OX0NPTlRBSU5TICg4KTogZWxlbSBjb250YWlucyBydWxlQ29udGV4dFxuICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBhc2NlbmRhbnRzIG9mIHRoZSBlbGVtZW50LCBvciBpdHNlbGYgb3IgaXRzIGFzY2VuZGFudCBhbHJlYWR5IGNoZWNrZWRcbiAgICAgICAgICAgICAgICBpZiAoKHBvc2l0aW9uICYgTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9DT05UQUlOUykgfHwgY2hlY2tlZC5zb21lKGl0ZW0gPT4gaXRlbS5jb250YWlucyhlbGVtKSkpXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgYm5kcyA9IG1hcHBlci5nZXRVbmFkanVzdGVkQm91bmRzKGVsZW0pO1xuICAgICAgICAgICAgICAgIGlmICghYm5kcykgY29udGludWU7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgbGV0IHpTdHlsZSA9IGdldENvbXB1dGVkU3R5bGUoZWxlbSk7IFxuICAgICAgICAgICAgICAgIGxldCB6X2luZGV4ID0gJzAnO1xuICAgICAgICAgICAgICAgIGlmICh6U3R5bGUpIHtcbiAgICAgICAgICAgICAgICAgICAgel9pbmRleCA9IHpTdHlsZS56SW5kZXg7XG4gICAgICAgICAgICAgICAgICAgIGlmICghel9pbmRleCB8fCBpc05hTihOdW1iZXIoel9pbmRleCkpKVxuICAgICAgICAgICAgICAgICAgICAgICAgel9pbmRleCA9IFwiMFwiO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIGNhc2UgMjogdGhlIGVsZW1lbnQgb3ZlcmxhcHMgdGhlIHRhcmdldCBlbnRpcmVseVxuICAgICAgICAgICAgICAgIC8vIG5vdGUgd2hlbiBhIGxpbmsgaXMgaW5saW5lIHdpdGggb3RoZXIgdGFyZ2V0LCBpZiB0aGUgbGluayB0ZXh0IHdyYXBzIGluIGFub3RoZXIgbGluZSBpbiBhIGdpdmVuIHZpZXdwb3J0LCAgXG4gICAgICAgICAgICAgICAgLy8gdGhlIGJvdW5kcyBvZiB0aGUgbGluayBtYXkgY292ZXIgYW5kIHRoZSBlbnRpcmUgdHdvIGxpbmVzLCBjYXVzaW5nIHRoZSBvdGhlciB0YWdldHMgdG8gYmUgb3ZlcmxhcHBlZCwgc2VlIHR3byBsaW5rcyBpbiB0aGUgdGVzdCBjYXNlOiBlbGVtZW50X2lubGluZS5odG1sIFxuICAgICAgICAgICAgICAgIGlmIChibmRzLnRvcCA8PSBib3VuZHMudG9wICYmIGJuZHMubGVmdCA8PSBib3VuZHMubGVmdCAmJiBibmRzLnRvcCArIGJuZHMuaGVpZ2h0ID49IGJvdW5kcy50b3AgKyBib3VuZHMuaGVpZ2h0IFxuICAgICAgICAgICAgICAgICAgICAmJiBibmRzLmxlZnQgKyBibmRzLndpZHRoID49IGJvdW5kcy5sZWZ0ICsgYm91bmRzLndpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSB0YXJnZXQgb24gdG9wICAgIFxuICAgICAgICAgICAgICAgICAgICBpZiAoYmVmb3JlID8gcGFyc2VJbnQoemluZGV4KSA8IHBhcnNlSW50KHpfaW5kZXgpOiBwYXJzZUludCh6aW5kZXgpIDw9IHBhcnNlSW50KHpfaW5kZXgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdGFyZ2V0IGlzIGVudGlyZWx5IGNvdmVyZWQ6IHRhYmJhYmxlIHRhcmdldCBoYW5kbGVkIGJ5IGVsZW1lbnRfdGFiYmFibGVfdW5vYnNjdXJlZCBhbmQgdGFiaW5kZXg9LTEgaWdub3JlZFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfb3ZlcmxhcFwiLCBbbm9kZU5hbWUsIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pO1xuICAgICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gY2FzZSAzOiBpZiB0aGUgdGFyZ2V0IG92ZXJsYXBzIHRoZSBlbGVtZW50IGVudGlyZWx5XG4gICAgICAgICAgICAgICAgaWYgKGJvdW5kcy50b3AgPD0gYm5kcy50b3AgJiYgYm91bmRzLmxlZnQgPD0gYm5kcy5sZWZ0ICYmIGJvdW5kcy50b3AgKyBib3VuZHMuaGVpZ2h0ID49IGJuZHMudG9wICsgYm5kcy5oZWlnaHQgXG4gICAgICAgICAgICAgICAgICAgICYmIGJvdW5kcy5sZWZ0ICsgYm91bmRzLndpZHRoID49IGJuZHMubGVmdCArIGJuZHMud2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGVsZW1lbnQgb24gdG9wICAgIFxuICAgICAgICAgICAgICAgICAgICBpZiAoYmVmb3JlID8gcGFyc2VJbnQoemluZGV4KSA8IHBhcnNlSW50KHpfaW5kZXgpOiBwYXJzZUludCh6aW5kZXgpIDw9IHBhcnNlSW50KHpfaW5kZXgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF9vdmVybGFwXCIsIFtub2RlTmFtZSwgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSk7IFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgLy8gdGhlIHRhcmdldCBvbiB0b3BcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcInZpb2xhdGlvbl9zcGFjaW5nXCIsIFtub2RlTmFtZSwgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSk7ICAgICBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gY2FzZSA0OiB0aGUgZWxlbWVudCBvdmVybGFwcyBwYXJ0aWFsbHkgd2l0aCB0aGUgdGFyZ2V0XG4gICAgICAgICAgICAgICAgaWYgKCgoKGJvdW5kcy50b3AgPj0gYm5kcy50b3AgJiYgYm91bmRzLnRvcCA8PSBibmRzLnRvcCArIGJuZHMuaGVpZ2h0KSB8fCAoYm91bmRzLnRvcCArIGJvdW5kcy5oZWlnaHQgPD0gYm5kcy50b3AgJiYgYm91bmRzLnRvcCArIGJvdW5kcy5oZWlnaHQgPj0gYm5kcy50b3AgK2JuZHMuaGVpZ2h0KSlcbiAgICAgICAgICAgICAgICAgICAgICYmICgoYm91bmRzLmxlZnQgPiBibmRzLmxlZnQgJiYgYm91bmRzLmxlZnQgPCBibmRzLmxlZnQgKyBibmRzLndpZHRoKSB8fCAoYm5kcy5sZWZ0ID4gYm91bmRzLmxlZnQgJiYgYm5kcy5sZWZ0IDwgYm91bmRzLmxlZnQgKyBib3VuZHMud2lkdGgpKSkgXG4gICAgICAgICAgICAgICAgICAgICB8fCAoKChib3VuZHMudG9wID4gYm5kcy50b3AgJiYgYm91bmRzLnRvcCA8IGJuZHMudG9wICsgYm5kcy5oZWlnaHQpIHx8IChibmRzLnRvcCA+IGJvdW5kcy50b3AgJiYgYm5kcy50b3AgPCBib3VuZHMudG9wICsgYm91bmRzLmhlaWdodCkpXG4gICAgICAgICAgICAgICAgICAgICAmJiAoKGJvdW5kcy5sZWZ0ID49IGJuZHMubGVmdCAmJiBib3VuZHMubGVmdCA8PSBibmRzLmxlZnQgKyBibmRzLndpZHRoKSB8fCAoYm91bmRzLmxlZnQgKyBib3VuZHMud2lkdGggPj0gYm5kcy5sZWZ0ICYmIGJvdW5kcy5sZWZ0ICsgYm91bmRzLndpZHRoIDw9IGJuZHMubGVmdCArIGJuZHMud2lkdGgpKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IG1vcmUgY2hlY2sgdG8gdHVybiB0byB2aW9sYXRpb24gIFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfb3ZlcmxhcFwiLCBbbm9kZU5hbWUsIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pOyBcblxuICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIG5vIG92ZXJsYXAgd2l0aCB0aGUgZWxlbSwgdGhvdWdoIG1heSBvdmVybGFwIHdpdGhlIG90aGVyIGVsZW1lbnRzXG4gICAgICAgICAgICAgICAgICAgIGxldCBkaXNYID0gMjQ7IFxuICAgICAgICAgICAgICAgICAgICBsZXQgZGlzWSA9IDI0OyAgIFxuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZWxlbWVudCBpcyBpbiB0aGUgaG9yaXpvbnRhbGx5IHNhbWUgcm93IHdpdGggdGhlIHRhcmdldFxuICAgICAgICAgICAgICAgICAgICBpZiAoYm91bmRzLndpZHRoIDwgMjQgJiYgKChib3VuZHMudG9wID49IGJuZHMudG9wICYmIGJvdW5kcy50b3AgPD0gYm5kcy50b3AgKyBibmRzLmhlaWdodCkgfHwgKGJvdW5kcy50b3AgPD0gYm5kcy50b3AgJiYgYm91bmRzLnRvcCArIGJvdW5kcy5oZWlnaHQgPiBibmRzLnRvcCkpKVxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzWCA9IE1hdGgubWluKCBNYXRoLmFicyhib3VuZHMubGVmdCAtIGJuZHMubGVmdCksIE1hdGguYWJzKGJvdW5kcy5sZWZ0IC0gKGJuZHMubGVmdCArIGJuZHMud2lkdGgpKSwgIE1hdGguYWJzKGJvdW5kcy5sZWZ0ICsgYm91bmRzLndpZHRoIC0gKGJuZHMubGVmdCArIGJuZHMud2lkdGgpKSwgTWF0aC5hYnMoYm91bmRzLmxlZnQgKyBib3VuZHMud2lkdGggLSBibmRzLmxlZnQpKTtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBlbGVtZW50IGlzIGluIHRoZSB2ZXJ0aWNhbGx5IHNhbWUgY29sdW1uIHdpdGggdGhlIHRhcmdldCAgICBcbiAgICAgICAgICAgICAgICAgICAgaWYgKGJvdW5kcy5oZWlnaHQgPCAyNCAmJiAoKGJvdW5kcy5sZWZ0ID49IGJuZHMubGVmdCAmJiBib3VuZHMubGVmdCA8PSBibmRzLmxlZnQgKyBibmRzLndpZHRoKSB8fCAoYm91bmRzLmxlZnQgPD0gYm5kcy5sZWZ0ICYmIGJvdW5kcy5sZWZ0ICsgYm91bmRzLndpZHRoID4gYm5kcy5sZWZ0KSkpXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNZID0gTWF0aC5taW4oTWF0aC5hYnMoYm91bmRzLnRvcCAtIGJuZHMudG9wKSwgTWF0aC5hYnMoYm91bmRzLnRvcCAtIChibmRzLnRvcCArIGJuZHMuaGVpZ2h0KSksICBNYXRoLmFicyhib3VuZHMudG9wICsgYm91bmRzLmhlaWdodCAtIChibmRzLnRvcCArIGJuZHMuaGVpZ2h0KSksIE1hdGguYWJzKGJvdW5kcy50b3AgKyBib3VuZHMuaGVpZ2h0IC0gYm5kcy50b3ApKTtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIGlmIChkaXNYIDwgbWluWCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWluWCA9IGRpc1g7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGphY2VudFggPSBlbGVtO1xuICAgICAgICAgICAgICAgICAgICB9ICAgIFxuICAgICAgICAgICAgICAgICAgICBpZiAoZGlzWSA8IG1pblkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pblkgPSBkaXNZOyAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgYWRqYWNlbnRZID0gZWxlbTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjaGVja2VkLnB1c2goZWxlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIGNhc2UgNTogbm8gb3ZlcmxhcCArIGluc3VmZmljaWVudCB0YXJnZXQgc2l6ZS4gY2hlY2sgc3BhY2luZyAgICBcbiAgICAgICAgICAgIGlmIChNYXRoLnJvdW5kKGJvdW5kcy53aWR0aC8yKSArIG1pblggPCAxMiB8fCBNYXRoLnJvdW5kKGJvdW5kcy5oZWlnaHQvMikgKyBtaW5ZIDwgMTIpIHtcbiAgICAgICAgICAgICAgICBpZiAoTWF0aC5yb3VuZChib3VuZHMud2lkdGgvMikgKyBtaW5YIDwgTWF0aC5yb3VuZChib3VuZHMuaGVpZ2h0LzIpICsgbWluWSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVGYWlsKFwidmlvbGF0aW9uX3NwYWNpbmdcIiwgW25vZGVOYW1lLCBhZGphY2VudFgubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pOyBcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZUZhaWwoXCJ2aW9sYXRpb25fc3BhY2luZ1wiLCBbbm9kZU5hbWUsIGFkamFjZW50WS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSk7XG4gICAgICAgICAgICB9IGVsc2UgXG4gICAgICAgICAgICAgICAgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc19zcGFjaW5nXCIpO1xuICAgICAgICB9XG4gICAgfVxuICAgICIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuaW1wb3J0IHsgQ1NTVXRpbCB9IGZyb20gXCIuLi91dGlsL0NTU1V0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCB0ZXh0X2Jsb2NrX2hlYWRpbmc6IFJ1bGUgPSB7XG4gICAgaWQ6IFwidGV4dF9ibG9ja19oZWFkaW5nXCIsXG4gICAgY29udGV4dDogXCJkb206cCwgZG9tOmRpdiwgZG9tOmJyXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfQmxvY2tfU2hvdWxkQmVIZWFkaW5nXCI6IHtcbiAgICAgICAgICAgIC8vIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcInBvdGVudGlhbF9oZWFkaW5nXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgLy8gXCJwYXNzXCI6IFwidGV4dF9ibG9ja19oZWFkaW5nLmh0bWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX2hlYWRpbmdcIjogXCJ0ZXh0X2Jsb2NrX2hlYWRpbmcuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInRleHRfYmxvY2tfaGVhZGluZy5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICAvLyBcInBhc3NcIjogXCJIZWFkaW5nIHRleHQgdXNlcyBhIGhlYWRpbmcgZWxlbWVudCBvciByb2xlXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9oZWFkaW5nXCI6IFwiQ29uZmlybSB0aGlzIHRleHQgJ3swfScgaXMgdXNlZCBhcyBhIGhlYWRpbmcgYW5kIGlmIHNvLCBtb2RpZnkgdG8gdXNlIGEgaGVhZGluZyBlbGVtZW50IG9yIHJvbGVcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJIZWFkaW5nIHRleHQgc2hvdWxkIHVzZSBhIGhlYWRpbmcgZWxlbWVudCBvciByb2xlXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgcnVsZXNldHM6IFt7XG4gICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICBcIm51bVwiOiBbXCIxLjMuMVwiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgLy9za2lwIHRoZSBjaGVjayBpZiB0aGUgZWxlbWVudCBpcyBoaWRkZW4gb3IgZGlzYWJsZWRcbiAgICAgICAgaWYgKENvbW1vblV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpIHx8ICFWaXNVdGlsLmlzTm9kZVZpc2libGUocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gRG9uJ3QgdHJpZ2dlciBpZiB3ZSdyZSBub3QgaW4gdGhlIGJvZHkgb3IgaWYgd2UncmUgaW4gYSBzY3JpcHRcbiAgICAgICAgaWYgKENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFtcImJvZHlcIl0pID09PSBudWxsIHx8IENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFtcInNjcmlwdFwiXSkgIT09IG51bGwpIFxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgY29uc3QgdmFsaWRhdGVQYXJhbXMgPSB7XG4gICAgICAgICAgICBudW1Xb3Jkczoge1xuICAgICAgICAgICAgICAgIHZhbHVlOiAxMCxcbiAgICAgICAgICAgICAgICB0eXBlOiBcImludGVnZXJcIlxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBsZXQgYm9keUZvbnQgPSAwO1xuICAgICAgICBsZXQgYm9keSA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCJib2R5XCIpO1xuICAgICAgICBpZiAoYm9keSAhPSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgYm9keVN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShib2R5WzBdKTtcbiAgICAgICAgICAgIGlmIChib2R5U3R5bGUpIGJvZHlGb250ID0gQ1NTVXRpbC5nZXRQaXhlbHNGcm9tU3R5bGUoYm9keVN0eWxlWydmb250LXNpemUnXSwgYm9keSk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG51bVdvcmRzID0gdmFsaWRhdGVQYXJhbXMubnVtV29yZHMudmFsdWU7XG4gICAgICAgIGxldCB3b3Jkc1NlZW4gPSAwO1xuICAgICAgICBsZXQgd29yZFN0cjogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgbGV0IGVtcGhhc2l6ZWRUZXh0ID0gZmFsc2U7XG4gICAgICAgIGxldCBudyA9IG5ldyBET01XYWxrZXIocnVsZUNvbnRleHQpO253Lm5leHROb2RlKCk7XG4gICAgICAgIGxldCBwYXNzZWQgPSBmYWxzZTtcbiAgICAgICAgd2hpbGUgKCFwYXNzZWQgJiZcbiAgICAgICAgICAgIG53Lm5leHROb2RlKCkgJiYgXG4gICAgICAgICAgICBudy5ub2RlICE9PSBydWxlQ29udGV4dCAmJlxuICAgICAgICAgICAgbncubm9kZSAhPT0gRE9NV2Fsa2VyLnBhcmVudE5vZGUocnVsZUNvbnRleHQpICYmXG4gICAgICAgICAgICAhW1wiYnJcIiwgXCJkaXZcIiwgXCJwXCJdLmluY2x1ZGVzKG53Lm5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkpIC8vIERvbid0IHJlcG9ydCB0d2ljZVxuICAgICAgICB7ICAgXG4gICAgICAgICAgICBpZiAobncubm9kZSA9PT0gcnVsZUNvbnRleHQgfHwgQ29tbW9uVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKG53Lm5vZGUpKVxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBsZXQgbndOYW1lID0gbncubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgaWYgKG53Lm5vZGUubm9kZVR5cGUgPT09IDMpIHsgXG4gICAgICAgICAgICAgICAgLy8gZm9yIHRleHQgY2hpbGRcbiAgICAgICAgICAgICAgICBpZiAobncubm9kZS5ub2RlVmFsdWUudHJpbSgpLmxlbmd0aCA+IDAgJiYgbncubm9kZS5wYXJlbnRFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGl0J3Mgc3R5bGUgaWYgdGhlIHRhcmdldCBlbGVtZW50IGNvbnRhaW5zIHRleHQsIGUuZy4sIDxwPiBmYWtlIGhlYWRpbmc8L3A+IFxuICAgICAgICAgICAgICAgICAgICBsZXQgc3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKG53Lm5vZGUucGFyZW50RWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZSAmJiAoc3R5bGVbJ2ZvbnQtd2VpZ2h0J10gPT09ICdib2xkJyB8fCBzdHlsZVsnZm9udC13ZWlnaHQnXSA+PSA3MDBcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8ICAoc3R5bGVbJ2ZvbnQtc2l6ZSddICYmIHN0eWxlWydmb250LXNpemUnXS5pbmNsdWRlcyhcImxhcmdlXCIpKSBcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8IChzdHlsZVsnZm9udC1zaXplJ10gJiYgYm9keUZvbnQgIT09IDAgJiYgQ1NTVXRpbC5nZXRQaXhlbHNGcm9tU3R5bGUoc3R5bGVbJ2ZvbnQtc2l6ZSddLG53Lm5vZGUucGFyZW50RWxlbWVudCkgID4gYm9keUZvbnQpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5leHRTdHIgPSBudy5ub2RlLm5vZGVWYWx1ZS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB3YyA9IENvbW1vblV0aWwud29yZENvdW50KG5leHRTdHIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdjID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmRTdHIucHVzaChuZXh0U3RyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbXBoYXNpemVkVGV4dCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yZHNTZWVuICs9IHdjO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gd29yZHNTZWVuID4gbnVtV29yZHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIHRoaXMgbm9kZSBiZWNhdXNlIGl0J3MgZW1waGFzaXplZFxuICAgICAgICAgICAgICAgICAgICAgICAgbncuYkVuZFRhZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbm9kZSBjb250YWluIHJlZ3VsYXIgdGV4dFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSAgIFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAobncubm9kZS5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgICAgIC8vIGZvciBlbGVtZW50IGNoaWxkXG4gICAgICAgICAgICAgICAgaWYgKG53TmFtZSA9PT0gXCJiXCIgfHwgbndOYW1lID09PSBcInN0cm9uZ1wiIHx8IG53TmFtZSA9PT0gXCJ1XCIgfHwgbndOYW1lID09PSBcImZvbnRcIikge1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgdGFyZ2V0IGVsZW1lbnQgY29udGFpbnMgZW1waGFzaXMgY2hpbGQsIGUuZy4sIDxwPjxzdHJvbmc+ZmFrZSBoZWFkaW5nPC9zdHJvbmc+PC9wPiBcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5leHRTdHIgPSBDb21tb25VdGlsLmdldElubmVyVGV4dChudy5ub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIGxldCB3YyA9IENvbW1vblV0aWwud29yZENvdW50KG5leHRTdHIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAod2MgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JkU3RyLnB1c2gobmV4dFN0cik7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbXBoYXNpemVkVGV4dCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3Jkc1NlZW4gKz0gd2M7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gd29yZHNTZWVuID4gbnVtV29yZHM7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNraXAgdGhpcyBub2RlIGJlY2F1c2UgaXQncyBlbXBoYXNpemVkXG4gICAgICAgICAgICAgICAgICAgIG53LmJFbmRUYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSB0aGUgZWxlbWVudCB3aGljaCBoYXMgYSByb2xlIGV4Y2VwdCAnZ2VuZXJpYycsICdwYXJhZ3JhcGgnIG9yICdzdHJvbmcnXG4gICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBhcHBsZXQgZWxlbWVudCB0aGF0IGlzIGRlcHJlY2F0ZWQgYW55d2F5XG4gICAgICAgICAgICAgICAgICAgIGxldCByb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKG53Lm5vZGUgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICBwYXNzZWQgPSAocm9sZSAhPT0gbnVsbCAmJiByb2xlICE9PSAnZ2VuZXJpYycgJiYgcm9sZSAhPT0gJ3BhcmFncmFwaCcgJiYgcm9sZSAhPT0gJ3N0cm9uZycpIHx8IG53TmFtZSA9PT0gXCJhcHBsZXRcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHdvcmRzU2VlbiA9PSAwKSBwYXNzZWQgPSB0cnVlO1xuICAgICAgICAvL2lnbm9yZSBpZiB0aGUgc3RyaW5nIGVuZHMgd2l0aCDigJw64oCdICDigJws4oCdICDigJwt4oCdICDigJw74oCdIG9yIOKAnC7igJ0gXG4gICAgICAgIGlmICghcGFzc2VkKSBwYXNzZWQgPSAvWzosO1xcLVxcLl0kLy50ZXN0KHdvcmRTdHIuam9pbihcIiBcIikudHJpbSgpKTtcbiAgICAgICAgXG4gICAgICAgIGlmIChwYXNzZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfaGVhZGluZ1wiLCBbd29yZFN0ci5qb2luKFwiIFwiKV0pO1xuICAgICAgICB9XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcbmltcG9ydCB7IENvbG9yVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbG9yVXRpbFwiO1xuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUZhaWwsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlUGFzcywgUnVsZUNvbnRleHRIaWVyYXJjaHkgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBlUnVsZVBvbGljeSwgZVRvb2xraXRMZXZlbCB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5pbXBvcnQgeyBDU1NVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ1NTVXRpbFwiO1xuXG5leHBvcnQgY29uc3QgdGV4dF9jb250cmFzdF9zdWZmaWNpZW50OiBSdWxlID0ge1xuICAgIGlkOiBcInRleHRfY29udHJhc3Rfc3VmZmljaWVudFwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOipcIixcbiAgICByZWZhY3Rvcjoge1xuICAgICAgICBcIklCTUFfQ29sb3JfQ29udHJhc3RfV0NBRzJBQVwiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInBhc3NcIixcbiAgICAgICAgICAgIFwiRmFpbF8xXCI6IFwiZmFpbF9jb250cmFzdFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcInBvdGVudGlhbF9zYW1lX2NvbG9yXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJJQk1BX0NvbG9yX0NvbnRyYXN0X1dDQUcyQUFfUFZcIjoge1xuICAgICAgICAgICAgXCJwYXNzXzBcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF8xXCI6IFwicG90ZW50aWFsX2dyYXBoaWNfYmFja2dyb3VuZFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcImdyb3VwXCI6IGB0ZXh0X2NvbnRyYXN0X3N1ZmZpY2llbnQuaHRtbGAsXG4gICAgICAgICAgICBcInBhc3NcIjogYHRleHRfY29udHJhc3Rfc3VmZmljaWVudC5odG1sYCxcbiAgICAgICAgICAgIFwiZmFpbF9jb250cmFzdFwiOiBgdGV4dF9jb250cmFzdF9zdWZmaWNpZW50Lmh0bWxgLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfc2FtZV9jb2xvclwiOiBgdGV4dF9jb250cmFzdF9zdWZmaWNpZW50Lmh0bWxgLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfZ3JhcGhpY19iYWNrZ3JvdW5kXCI6IGB0ZXh0X2NvbnRyYXN0X3N1ZmZpY2llbnQuaHRtbGAsXG4gICAgICAgICAgICBcInBvdGVudGlhbF90ZXh0X3NoYWRvd1wiOiBgdGV4dF9jb250cmFzdF9zdWZmaWNpZW50Lmh0bWxgXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJncm91cFwiOiBcIlRoZSBjb250cmFzdCByYXRpbyBvZiB0ZXh0IHdpdGggaXRzIGJhY2tncm91bmQgbXVzdCBtZWV0IFdDQUcgQUEgcmVxdWlyZW1lbnRzXCIsXG4gICAgICAgICAgICBcInBhc3NcIjogXCJUaGUgY29udHJhc3QgcmF0aW8gb2YgdGV4dCB3aXRoIGl0cyBiYWNrZ3JvdW5kIG1lZXRzIFdDQUcgQUEgcmVxdWlyZW1lbnRzXCIsXG4gICAgICAgICAgICBcImZhaWxfY29udHJhc3RcIjogXCJUZXh0IGNvbnRyYXN0IG9mIHswfSB3aXRoIGl0cyBiYWNrZ3JvdW5kIGlzIGxlc3MgdGhhbiB0aGUgV0NBRyBBQSBtaW5pbXVtIHJlcXVpcmVtZW50cyBmb3IgdGV4dCBvZiBzaXplIHsxfXB4IGFuZCB3ZWlnaHQgb2YgezJ9XCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9zYW1lX2NvbG9yXCI6IFwiVGhlIGZvcmVncm91bmQgdGV4dCBhbmQgaXRzIGJhY2tncm91bmQgY29sb3IgYXJlIGJvdGggZGV0ZWN0ZWQgYXMgezN9LiBWZXJpZnkgdGhlIHRleHQgbWVldHMgdGhlIFdDQUcgQUEgcmVxdWlyZW1lbnRzIGZvciBtaW5pbXVtIGNvbnRyYXN0XCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9ncmFwaGljX2JhY2tncm91bmRcIjogXCJWZXJpZnkgdGhlIGNvbnRyYXN0IHJhdGlvIG9mIHRoZSB0ZXh0IGFnYWluc3QgdGhlIGxpZ2h0ZXN0IGFuZCB0aGUgZGFya2VzdCBjb2xvcnMgb2YgdGhlIGJhY2tncm91bmQgbWVldHMgdGhlIFdDQUcgQUEgbWluaW11bSByZXF1aXJlbWVudHMgZm9yIHRleHQgb2Ygc2l6ZSB7MX1weCBhbmQgd2VpZ2h0IG9mIHsyfVwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfdGV4dF9zaGFkb3dcIjogXCJWZXJpZnkgdGhlIGNvbnRyYXN0IHJhdGlvIG9mIHRoZSB0ZXh0IHdpdGggc2hhZG93IG1lZXRzIHRoZSBXQ0FHIEFBIG1pbmltdW0gcmVxdWlyZW1lbnRzIGZvciB0ZXh0IG9mIHNpemUgezF9cHggYW5kIHdlaWdodCBvZiB7Mn1cIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgaWQ6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgbnVtOiBcIjEuNC4zXCIsIC8vIG51bTogWyBcIjIuNC40XCIsIFwieC55LnpcIiBdIGFsc28gYWxsb3dlZFxuICAgICAgICBsZXZlbDogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICB0b29sa2l0TGV2ZWw6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbJ2FmdzRmNyddLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAvLyBhdm9pZCBkaWFnbm9zaW5nIGVsZW1lbnRzIHRoYXQgYXJlIG5vdCB2aXNpYmxlXG4gICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKHJ1bGVDb250ZXh0KSB8fFxuICAgICAgICAgICAgKFZpc1V0aWwuaGlkZGVuQnlEZWZhdWx0RWxlbWVudHMgIT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgIFZpc1V0aWwuaGlkZGVuQnlEZWZhdWx0RWxlbWVudHMgIT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgVmlzVXRpbC5oaWRkZW5CeURlZmF1bHRFbGVtZW50cy5pbmRleE9mKG5vZGVOYW1lKSA+IC0xKSkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vVE9ETyA/IHNob3VsZCBvbmx5IGNvbnNpZGVyIG5hdGl2ZSBkaXNhYmxlZCwgaWdub3JlIGFyaWEtZGlzYWJsZWRcbiAgICAgICAgLy9za2lwIGRpc2FibGVkIGVsZW1lbnRcbiAgICAgICAgaWYgKENvbW1vblV0aWwuaXNOb2RlRGlzYWJsZWQocnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy9za2lwIGVsZW1lbnRzXG4gICAgICAgIGlmIChDb21tb25VdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBbXCJzdmdcIiwgXCJzY3JpcHRcIiwgXCJtZXRhXCIsIFwic3R5bGVcIl0pKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgbGV0IGRvYyA9IHJ1bGVDb250ZXh0Lm93bmVyRG9jdW1lbnQ7XG4gICAgICAgIGlmICghZG9jKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIFxuICAgICAgICBsZXQgd2luID0gZG9jLmRlZmF1bHRWaWV3O1xuICAgICAgICBpZiAoIXdpbikge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGlzIGVsZW1lbnQgaGFzIGNoaWxkcmVuIHdpdGggYWN0dWFsIHRleHQuXG4gICAgICAgIGxldCBjaGlsZFN0ciA9IENvbW1vblV0aWwuZ2V0Tm9kZVRleHQocnVsZUNvbnRleHQpO1xuICAgICAgICBcbiAgICAgICAgaWYgKCFDb21tb25VdGlsLmlzU2hhZG93SG9zdEVsZW1lbnQocnVsZUNvbnRleHQpIHx8IChDb21tb25VdGlsLmlzU2hhZG93SG9zdEVsZW1lbnQocnVsZUNvbnRleHQpICYmIENvbW1vblV0aWwuZ2V0Tm9kZVRleHQocnVsZUNvbnRleHQuc2hhZG93Um9vdCkgPT09ICcnKSkge1xuICAgICAgICAgICAgaWYgKGNoaWxkU3RyLnRyaW0oKS5sZW5ndGggPT0gMCApXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIGlnbm9yZSBpZiB0aGUgdGV4dCBkb2VzIG5vdCBjb252ZXkgYW55dGhpbmcgaW4gaHVtYW4gbGFuZ3VhZ2VcbiAgICAgICAgICAgIC8qKiBcbiAgICAgICAgICAgICAqICgxKSBpZ25vcmUgbm9uLWFscGhhbnVtZXJpYyBvciBzcGVjaWFsIGNoYXJhY3RlcnMgaW4gQVNDSTogXihhLXpBLVpcXGRcXHMpXG4gICAgICAgICAgICAgKiAoMikgaWdub3JlIG5vbi1wcmludGFibGUgdW5pY29kZSBjaGFyYWN0ZXJzOiBcXHUwMDAwLVxcdTAwMDhcXHUwMDBCLVxcdTAwMUZcXHUwMDdGLVxcdTAwOUZcXHUyMDAwLVxcdTIwMEZcXHUyMDI4LVxcdTIwMkZcXHUyMDVGLVxcdTIwNkZcXHUzMDAwXFx1RkVGRlxuICAgICAgICAgICAgICogIHNlZSBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8zNzcwMTE3L3doYXQtaXMtdGhlLXJhbmdlLW9mLXVuaWNvZGUtcHJpbnRhYmxlLWNoYXJhY3RlcnNcbiAgICAgICAgICAgICAqICgzKSBmb3Igbm93IG5vdCBjb25zaWRlciB1bmljb2RlIHNwZWNpYWwgY2hhcmFjdGVycyB0aGF0IGFyZSBkaWZmZXJlbnQgaW4gZGlmZmVyZW50IGxhbmd1YWdlc1xuICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIC8vbGV0IHJlZ2V4ID0gL1teKGEtekEtWlxcZFxccylcXHUwMDAwLVxcdTAwMDhcXHUwMDBCLVxcdTAwMUZcXHUwMDdGLVxcdTAwOUZcXHUyMDAwLVxcdTIwMEZcXHUyMDI4LVxcdTIwMkZcXHUyMDVGLVxcdTIwNkZcXHUzMDAwXFx1RkVGRl0rL2c7XG4gICAgICAgICAgICBsZXQgcmVnZXggPSAvW14oYS16QS1aXFxkXFxzKVxcXihcXHU0ZTAwLVxcdTlmZmZcXHUzNDAwLVxcdTRkYmYpXFx1MDAwMC1cXHUwMDA4XFx1MDAwQi1cXHUwMDFGXFx1MDA3Ri1cXHUwMDlGXFx1MjAwMC1cXHUyMDBGXFx1MjAyOC1cXHUyMDJGXFx1MjA1Ri1cXHUyMDZGXFx1MzAwMFxcdUZFRkZdKy9nO1xuICAgICAgICAgICAgY2hpbGRTdHIgPSBjaGlsZFN0ci50cmltKCkucmVwbGFjZShyZWdleCwgJycpO1xuICAgICAgICAgICAgaWYgKGNoaWxkU3RyLnRyaW0oKS5sZW5ndGggPT09IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZWxlbSA9IHJ1bGVDb250ZXh0O1xuICAgICAgICAvLyB0aGUgY2hpbGQgZWxlbWVudHMgKHJhdGhlciB0aGFuIHNoYWRvdyByb290KSBvZiBhIHNoYWRvdyBob3N0IGlzIGVpdGhlciByZS1hc3NpZ25lZCB0byB0aGUgc2hhZG93IHNsb3QgaWYgdGhlIHNsb3QgZXhpc3RzIFxuICAgICAgICAvLyBvciBub3QgZGlzcGxheWVkLCBzbyBzaG91bGRuJ3QgYmUgY2hlY2tlZCBmcm9tIHRoZSBsaWdodCBET00sIHJhdGhlciBpdCBzaG91bGQgYmUgY2hlY2tlZCBhcyByZWFzc2dpbmdlZCBzbG90IGVsZW1lbnQocykgaW4gdGhlIHNoYWRvdyBET00uXG4gICAgICAgIGlmIChDb21tb25VdGlsLmlzU2hhZG93SG9zdEVsZW1lbnQocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICAvLyBpZiBpdCdzIGRpcmVjdCB0ZXh0IG9mIGEgc2hhZG93IGhvc3RcbiAgICAgICAgICAgIGlmIChydWxlQ29udGV4dC5zaGFkb3dSb290KSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgbm9kZT1ydWxlQ29udGV4dC5maXJzdENoaWxkOyBub2RlOyBub2RlPW5vZGUubmV4dFNpYmxpbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGU9PTMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgbXVsdGlwbGUgdGV4dHMgZXhpc3QsIG9ubHkgbmVlZCB0byBjaGVjayBvbmUgXG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtID0gKG5vZGUgYXMgVGV4dCkuYXNzaWduZWRTbG90O1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH0gICBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZWxlbSA9PT0gbnVsbCkgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBsZXQgc3R5bGUgPSB3aW4uZ2V0Q29tcHV0ZWRTdHlsZShlbGVtKTtcbiAgICAgICAgXG4gICAgICAgIC8vIEpDSCBjbGlwIElORk86XG4gICAgICAgIC8vICAgICAgVGhlIGNsaXAgcHJvcGVydHkgbGV0cyB5b3Ugc3BlY2lmeSBhIHJlY3RhbmdsZSB0byBjbGlwIGFuIGFic29sdXRlbHkgcG9zaXRpb25lZCBlbGVtZW50LiBcbiAgICAgICAgLy8gICAgICBUaGUgcmVjdGFuZ2xlIHNwZWNpZmllZCBhcyBmb3VyIGNvb3JkaW5hdGVzLCBhbGwgZnJvbSB0aGUgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBlbGVtZW50IHRvIGJlIGNsaXBwZWQuXG4gICAgICAgIC8vICAgICAgUHJvcGVydHkgdmFsdWVzOlxuICAgICAgICAvLyAgICAgICAgICBub25lICAgICAgICBUaGlzIGlzIGRlZmF1bHQuIE5vIGNsaXBwaW5nIGlzIGRvbmVcbiAgICAgICAgLy8gICAgICAgICAgYXV0byAgICAgICAgTm8gY2xpcHBpbmcgd2lsbCBiZSBkb25lXG4gICAgICAgIC8vICAgICAgICAgIHNoYXBlICAgICAgIFRoZSBvbmx5IHZhbGlkIHZhbHVlIGlzOiByZWN0ICh0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnQpXG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgIGUuZy4sIGNsaXA6IHJlY3QoMTBweCwgMjBweCwgMzBweCwgNDBweCk7XG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IHRoZSBmb3VyIHZhbHVlcyBhcmUgaW4gdGhlIHNhbWUgb3JkZXIgYXMgbWFyZ2luL3BhZGRpbmdcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgVGhlIHJlY3QgdmFsdWVzIGFyZSBwb3NpdGl2ZSBwaXhlbCB2YWx1ZXMsIGUuZy4sIDEwcHgsIGV0Yy5cbiAgICAgICAgLy8gICAgICAgICAgbWFyZ2luLWJveCAgVXNlcyB0aGUgbWFyZ2luIGJveCBhcyB0aGUgcmVmZXJlbmNlIGJveFxuICAgICAgICAvLyAgICAgICAgICBib3JkZXItYm94ICBVc2VzIHRoZSBib3JkZXIgYm94IGFzIHRoZSByZWZlcmVuY2UgYm94XG4gICAgICAgIC8vICAgICAgICAgIHBhZGRpbmctYm94IFVzZXMgdGhlIHBhZGRpbmcgYm94IGFzIHRoZSByZWZlcmVuY2UgYm94XG4gICAgICAgIC8vICAgICAgICAgIGNvbnRlbnQtYm94XG4gICAgICAgIC8vICAgICAgICAgIGZpbGwtYm94XG4gICAgICAgIC8vICAgICAgICAgIHN0cm9rZS1ib3hcbiAgICAgICAgLy8gICAgICBOT1RFOiB0aGUgQ1NTIGNsaXAgcHJvcGVydHkgaXMgZGVwcmVjYXRlZFxuICAgICAgICAvLyAgICAgIEFsc286IGNsaXAgb25seSB3b3JrcyBpZiB0aGUgZWxlbWVudCBpcyBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQgYW5kIGNhbiBvbmx5IGRvIHJlY3RhbmdsZXNcbiAgICAgICAgLy8gY2hlY2sgaWYgZWxlbWVudCB2aXNpYmxlXG4gICAgICAgIGxldCB2aXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgaWYgKHN0eWxlLndpZHRoICE9PSBcIjBcIiAmJlxuICAgICAgICAgICAgc3R5bGUuaGVpZ2h0ICE9PSBcIjBcIiAmJlxuICAgICAgICAgICAgc3R5bGUub3BhY2l0eSAhPT0gXCIwXCIgJiZcbiAgICAgICAgICAgIHN0eWxlLmRpc3BsYXkgIT09ICdub25lJyAmJlxuICAgICAgICAgICAgc3R5bGUudmlzaWJpbGl0eSAhPT0gJ2hpZGRlbicgJiZcbiAgICAgICAgICAgIHN0eWxlLm92ZXJmbG93ICE9PSAnaGlkZGVuJyAmJlxuICAgICAgICAgICAgLy8gbGVmdCBhbmQgcmlnaHQgd29yayB3aXRoIGFsbCBhYnNvbHV0ZSB1bml0c1xuICAgICAgICAgICAgKHN0eWxlLmxlZnQgPT09IFwiYXV0b1wiIHx8IChzdHlsZS5wb3NpdGlvbiA9PT0gJ2Fic29sdXRlJyAmJiBwYXJzZUludChzdHlsZS5sZWZ0LnJlcGxhY2UoL1teMC05ListXS8sICcnKSkgPiAwKSkgJiZcbiAgICAgICAgICAgIChzdHlsZS5sZWZ0ID09PSBcImF1dG9cIiB8fCAoc3R5bGUucG9zaXRpb24gPT09ICdhYnNvbHV0ZScgJiYgcGFyc2VJbnQoc3R5bGUudG9wLnJlcGxhY2UoL1teMC05ListXS8sICcnKSkgPiAwKSkpIHtcbiAgICAgICAgICAgIHZpc2libGUgPSB0cnVlO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJlbGVtZW50IElTIHZpc2libGVcIik7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkNIRUNLIENPTE9SIENPTlRSQVNUIHVubGVzcyB0byBzbWFsbFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZpc2libGUgPSBmYWxzZTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiZWxlbWVudCBOT1QgdmlzaWJsZVwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmlzaWJsZSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiRE8gTk9UIENIRUNLIENPTE9SIENPTlRSQVNUXCIpO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuXG4gICAgICAgIGxldCBjbGlwSGVpZ2h0ID0gLTE7XG4gICAgICAgIGlmIChzdHlsZS5jbGlwICE9PSBcImF1dG9cIikge1xuICAgICAgICAgICAgbGV0IGNsaXBTdHJpbmcgPSBzdHlsZS5jbGlwLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBpZiAoY2xpcFN0cmluZy5pbmNsdWRlcyhcInJlY3RcIikpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVCcmFja2V0cyA9IC9cXCgoLiopXFwpL2c7XG4gICAgICAgICAgICAgICAgdmFyIGxpc3RPZlRleHQgPSBbXTtcbiAgICAgICAgICAgICAgICB2YXIgZm91bmQgPSByZUJyYWNrZXRzLmV4ZWMoY2xpcFN0cmluZyk7XG4gICAgICAgICAgICAgICAgdmFyIGZvdW5kQXJyID0gZm91bmRbMV0uc3BsaXQoJywgJyk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmb3VuZEFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImZvdW5kQXJyW1wiLGksXCJdID0gXCIsZm91bmRBcnJbaV0pO1xuICAgICAgICAgICAgICAgICAgICBsaXN0T2ZUZXh0LnB1c2goZm91bmRBcnJbaV0pO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImxpc3RPZlRleHQgPSBcIixsaXN0T2ZUZXh0KTtcbiAgICAgICAgICAgIGNsaXBIZWlnaHQgPSBwYXJzZUludChsaXN0T2ZUZXh0WzBdLnJlcGxhY2UoL3B4L2csICcnKSkgLSBwYXJzZUludChsaXN0T2ZUZXh0WzJdLnJlcGxhY2UoL3B4L2csICcnKSk7XG4gICAgICAgICAgICBjbGlwSGVpZ2h0ID0gTWF0aC5hYnMoY2xpcEhlaWdodCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBKQ0ggY2xpcC1wYXRoIElORk86XG4gICAgICAgIC8vICAgICAgRXhjZWxsZW50IGFydGljbGUgb24gY2xpcC1wYXRoOiBodHRwczovL2lzaGFkZWVkLmNvbS9hcnRpY2xlL2NsaXAtcGF0aC9cbiAgICAgICAgLy8gICAgICBjbGlwLXBhdGggaXMgYSB0b3RhbGx5IGRpZmZlcmVudCBhbmltYWwgd2l0aCBtYW55LCBtYW55IGRpZmZlcmVudCB2YXJpYXRpb25zXG4gICAgICAgIC8vICAgICAgVGhlIGdvYWwgd2FzIGZvciBpdCB0byBub3QgYmUgYXMgbGltaXRlZCBhcyBjbGlwXG4gICAgICAgIC8vICAgICAgVGhlIHN5bnRheCBpcyBtb3JlIGNvbXBsaWNhdGVkIChhcyBpdCBkb2VzIG1vcmUpIGFuZCBpdCBpcyBkaWZmZXJlbnQgZnJvbSBjbGlwLFxuICAgICAgICAvLyAgICAgIGUuZy4sIHRoZSBhYm92ZSBjbGlwIHJlY3RhbmdsZSB3b3VsZCBiZSBjbGlwLXBhdGg6IGluc2V0KDEwcHggMjBweCAzMHB4IDQwcHgpO1xuICAgICAgICAvLyAgICAgIE5vdGU6IHRoZXJlIGFyZSBubyBjb21tYXNcbiAgICAgICAgLy8gICAgICBBbHNvLCBpdCBjYW4gdGFrZSBzaW5nbGUgdmFsdWVzIHRvIG1ha2UgYWxsIHNpZGVzIHRoZSBzYW1lLCBvciAyIHZhbHVlcyAodmVydC9ob3JpKS5cbiAgICAgICAgLy8gICAgICBvciAzIHZhbHVlcyAodG9wL2hvcmkvYm90dG9tKVxuICAgICAgICAvLyAgICAgIEFuZCBwZXJjZW50YWdlcyBjYW4gd29ya3MgYXMgd2VsbCBhcyBweFxuICAgICAgICAvLyAgICAgIFxuICAgICAgICAvLyAgICAgIEFsdGhvdWdoIHRoZXJlIGFyZSBmaXZlIGRpZmZlcmVudCBzaGFwZXM6IGluc2V0ICh0ZXJtIHVzZWQgZm9yIHJlY3RhbmdsZSksIGNpcmNsZSxcbiAgICAgICAgLy8gICAgICAgICAgZWxsaXBzZSwgcG9seWdvbiwgcGF0aCAtIHdlIHdpbGwgb25seSBjb25jZXJuIG91cnNlbHZlcyB3aXRoIGluc2V0XG4gICAgICAgIC8vICAgICAgVGhlcmUgYXJlIDcgYm94IHZhbHVlczogbWFyZ2luLWJveCwgYm9yZGVyLWJveCwgcGFkZGluZy1ib3gsIGNvbnRlbnQtYm94LCBmaWxsLWJveCwgc3Ryb2tlLWJveCwgdmlldy1ib3hcbiAgICAgICAgLy8gICAgICBCb3ggYW5kIHNoYXBlIHZhbHVlcyBtYXkgYmUgY29tYmluZWQ6IGNsaXAtcGF0aDogcGFkZGluZy1ib3ggY2lyY2xlKDUwcHggYXQgMCAxMDBweCk7XG4gICAgICAgIC8vICAgICAgTk9URTogdGhlIGJveCB2YWx1ZXMgYXJlIE5PVCBpbnR1aXRpdmUsIHNlZTogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL0NTU19TaGFwZXMvRnJvbV9ib3hfdmFsdWVzI21hcmdpbi1ib3hcbiAgICAgICAgLy8gICAgICBcbiAgICAgICAgLy8gICAgICBTbyB0aGUga2V5IHF1ZXN0aW9uIGlzIHdoYXQgYW1vdW50IG9mIGVmZm9ydCBkbyB3ZSB3YW50IHRvIGludmVzdCBpbnRvIGNsaXAtcGF0aFxuICAgICAgICAvLyBcblxuICAgICAgICAvLyBKQ0ggZG9uJ3QgZG8gY2xpcC1wYXRoIG5vdyBcbiAgICAgICAgbGV0IGNsaXBQYXRoSGVpZ2h0ID0gLTE7XG4gICAgICAgIC8vIGlmIChzdHlsZS5jbGlwUGF0aCAhPT0gXCJhdXRvXCIpIHtcbiAgICAgICAgLy8gICAgIGNvbnNvbGUubG9nKFwic3R5bGUuY2xpcFBhdGggPSBcIixzdHlsZS5jbGlwUGF0aCk7XG4gICAgICAgIC8vICAgICBjb25zb2xlLmxvZyhcInN0eWxlLmNsaXBQYXRoLnRvU3RyaW5nID0gXCIsc3R5bGUuY2xpcFBhdGgudG9TdHJpbmcoKSk7XG4gICAgICAgIC8vICAgICBsZXQgY2xpcFN0cmluZyA9IHN0eWxlLmNsaXBQYXRoLnRvU3RyaW5nKCk7XG4gICAgICAgIC8vICAgICBpZiAoY2xpcFN0cmluZy5pbmNsdWRlcyhcImluc2V0XCIpKSB7XG4gICAgICAgIC8vICAgICAgICAgdmFyIHJlQnJhY2tldHMgPSAvXFwoKC4qKVxcKS9nO1xuICAgICAgICAvLyAgICAgICB2YXIgbGlzdE9mVGV4dCA9IFtdO1xuICAgICAgICAvLyAgICAgICB2YXIgZm91bmQgPSByZUJyYWNrZXRzLmV4ZWMoY2xpcFN0cmluZyk7XG4gICAgICAgIC8vICAgICAgIHZhciBmb3VuZEFyciA9IGZvdW5kWzFdLnNwbGl0KCcgJyk7XG4gICAgICAgIC8vICAgICAgIGZvciAobGV0IGk9MDsgaTxmb3VuZEFyci5sZW5ndGg7IGkrKykge1xuICAgICAgICAvLyAgICAgICAgIGNvbnNvbGUubG9nKFwiZm91bmRBcnJbXCIsaSxcIl0gPSBcIixmb3VuZEFycltpXSk7XG4gICAgICAgIC8vICAgICAgICAgbGlzdE9mVGV4dC5wdXNoKGZvdW5kQXJyW2ldKTtcbiAgICAgICAgLy8gICAgICAgfTtcbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gICAgIGNvbnNvbGUubG9nKFwibGlzdE9mVGV4dCA9IFwiLGxpc3RPZlRleHQpO1xuICAgICAgICAvLyBjbGlwUGF0aEhlaWdodCA9IHBhcnNlSW50KGxpc3RPZlRleHRbMF0ucmVwbGFjZSgvcHgvZywgJycpKSAtIHBhcnNlSW50KGxpc3RPZlRleHRbMl0ucmVwbGFjZSgvcHgvZywgJycpKTtcbiAgICAgICAgLy8gY2xpcFBhdGhIZWlnaHQgPSBNYXRoLmFicyhjbGlwSGVpZ2h0KTtcbiAgICAgICAgLy8gfVxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcImNsaXBQYXRoSGVpZ2h0ID0gXCIsIGNsaXBQYXRoSGVpZ2h0KTtcblxuICAgICAgICAvLyBpZiAoc3R5bGUucG9zaXRpb24gPT09IFwiYWJzb2x1dGVcIiAmJiBzdHlsZS5jbGlwID09PSBcInJlY3QoMHB4LCAwcHgsIDBweCwgMHB4KVwiICYmIHN0eWxlLm92ZXJmbG93ICE9PSBcInZpc2libGVcIikge1xuICAgICAgICAvLyBKQ0ggYXJiaXRyYXJpbHkgdXNlIGxlc3MgdGhhdCA3cHggZm9yIGNsaXBIZWlnaHRcbiAgICAgICAgaWYgKHN0eWxlLnBvc2l0aW9uID09PSBcImFic29sdXRlXCIgJiYgY2xpcEhlaWdodCA8IDcgJiYgY2xpcEhlaWdodCAhPT0gLTEpIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiRE8gTk9UIENIRUNLIENPTE9SIENPTlRSQVNUIGJlY2F1c2UgdG9vIHNtYWxsXCIpO1xuICAgICAgICAgICAgLy8gQ29ybmVyIGNhc2Ugd2hlcmUgaXRlbSBpcyBoaWRkZW4gKGFjY2Vzc2liaWxpdHkgaGlkaW5nIHRlY2huaXF1ZSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBGaXJzdCBkZXRlcm1pbmUgdGhlIGNvbG9yIGNvbnRyYXN0IHJhdGlvXG4gICAgICAgIGxldCBjb2xvckNvbWJvID0gQ29sb3JVdGlsLkNvbG9yQ29tYm8oZWxlbSk7XG4gICAgICAgIGlmIChjb2xvckNvbWJvID09PSBudWxsKSB7XG4gICAgICAgICAgICAvL3NvbWUgZXhjZXB0aW9uIG9jY3VycmVkLCBvciBub3QgYWJsZSB0byBnZXQgY29sb3IgY29tYm8gZm9yIHNvbWUgcmVhc29uXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcInVuYWJsZSB0byBnZXQgY29sb3IgY29tYm8gZm9yIGVsZW1lbnQ6IFwiICsgZWxlbS5ub2RlTmFtZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGZnID0gY29sb3JDb21iby5mZztcbiAgICAgICAgbGV0IGJnID0gY29sb3JDb21iby5iZztcbiAgICAgICAgbGV0IHJhdGlvID0gZmcuY29udHJhc3RSYXRpbyhiZyk7XG4gICAgICAgIGxldCB3ZWlnaHQgPSBDU1NVdGlsLmdldFdlaWdodE51bWJlcihzdHlsZS5mb250V2VpZ2h0KTtcbiAgICAgICAgbGV0IHNpemUgPSBDU1NVdGlsLmdldEZvbnRJblBpeGVscyhzdHlsZS5mb250U2l6ZSwgZWxlbSk7XG4gICAgICAgIGxldCBpc0xhcmdlU2NhbGUgPSBzaXplID49IDI0IHx8IHNpemUgPj0gMTguNiAmJiB3ZWlnaHQgPj0gNzAwO1xuICAgICAgICBcbiAgICAgICAgaWYgKENTU1V0aWwuY29udGFpbnNDS0ooY2hpbGRTdHIpKSB7XG4gICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYWN0LXJ1bGVzL2FjdC1ydWxlcy5naXRodWIuaW8vcHVsbC8yMTIxL2ZpbGVzXG4gICAgICAgICAgICAvLyBmb3IgQ0pLLCAyMiBwdCBvciAxOCBwdCB3aXRoIGZvbnQtd2VpZ2h0ID49IDcwMCwgMXB0ID0gMS4zMzMgcHhcbiAgICAgICAgICAgIGlzTGFyZ2VTY2FsZSA9IHNpemUgPj0gMjkuMyB8fCBzaXplID49IDI0ICYmIHdlaWdodCA+PSA3MDA7XG4gICAgICAgIH0gICAgXG4gICAgICAgIGxldCBwYXNzZWQgPSByYXRpbyA+PSA0LjUgfHwgKHJhdGlvID49IDMgJiYgaXNMYXJnZVNjYWxlKTtcbiAgICAgICAgbGV0IGhhc0JhY2tncm91bmQgPSBjb2xvckNvbWJvLmhhc0JHSW1hZ2UgfHwgY29sb3JDb21iby5oYXNHcmFkaWVudDtcbiAgICAgICAgbGV0IHRleHRTaGFkb3cgPSBjb2xvckNvbWJvLnRleHRTaGFkb3c7XG4gICAgICAgIGxldCBpc0Rpc2FibGVkID0gQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChlbGVtKTtcbiAgICAgICAgaWYgKCFpc0Rpc2FibGVkKSB7XG4gICAgICAgICAgICBsZXQgY29udHJvbCA9IENvbW1vblV0aWwuZ2V0Q29udHJvbE9mTGFiZWwoZWxlbSk7XG4gICAgICAgICAgICBpZiAoY29udHJvbCkge1xuICAgICAgICAgICAgICAgIGlzRGlzYWJsZWQgPSBDb21tb25VdGlsLmlzTm9kZURpc2FibGVkKGNvbnRyb2wpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZiAoIWlzRGlzYWJsZWQgJiYgbm9kZU5hbWUgPT09ICdsYWJlbCcgJiYgQ29tbW9uVXRpbC5pc0Rpc2FibGVkQnlGaXJzdENoaWxkRm9ybUVsZW1lbnQoZWxlbSkpIHtcbiAgICAgICAgICAgIGlzRGlzYWJsZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc0Rpc2FibGVkICYmIHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImlkXCIpICYmIENvbW1vblV0aWwuaXNEaXNhYmxlZEJ5UmVmZXJyaW5nRWxlbWVudChlbGVtKSkge1xuICAgICAgICAgICAgaXNEaXNhYmxlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvKipzZXRDYWNoZShydWxlQ29udGV4dCwgXCJFWFRfQ29sb3JfQ29udHJhc3RfV0NBRzJBQVwiLCB7XG4gICAgICAgICAgICBcInJhdGlvXCI6IHJhdGlvLFxuICAgICAgICAgICAgXCJpc0xhcmdlU2NhbGVcIjogaXNMYXJnZVNjYWxlLFxuICAgICAgICAgICAgXCJ3ZWlnaHRcIjogd2VpZ2h0LFxuICAgICAgICAgICAgXCJzaXplXCI6IHNpemUsXG4gICAgICAgICAgICBcImhhc0JhY2tncm91bmRcIjogaGFzQmFja2dyb3VuZCxcbiAgICAgICAgICAgIFwiaXNEaXNhYmxlZFwiOiBpc0Rpc2FibGVkXG4gICAgICAgIH0pOyovXG4gICAgICAgIFxuICAgICAgICAvLyBJZiBlbGVtZW50IG9yIHBhcmVudCBpcyBkaXNhYmxlZCwgdGhpcyBydWxlIGRvZXMgbm90IGFwcGx5IChidXQgbWF5IGJlIDM6MSBpbiBmdXR1cmUpXG4gICAgICAgIGlmICghcGFzc2VkICYmIGlzRGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFwYXNzZWQpIHtcbiAgICAgICAgICAgIGlmIChoYXNCYWNrZ3JvdW5kKSB7XG4gICAgICAgICAgICAgICAgLy8gZmlyZSBwb3RlbnRpYWwgc2luY2UgYSB0ZXh0IG9uIGFuIGltYWdlIG9yIGdyYWRpZW50IG1heSBiZSBzdGlsbCB2aWV3YWJsZSwgZGVwZW5kaW5nIG9uIHRoZSB0ZXh0IGxvY2F0aW9uIG9uIHRoZSBncmFkaWVudCBvciBpbWFnZVxuICAgICAgICAgICAgICAgIHJldHVybiBSdWxlUG90ZW50aWFsKFwicG90ZW50aWFsX2dyYXBoaWNfYmFja2dyb3VuZFwiLCBbcmF0aW8udG9GaXhlZCgyKSwgc2l6ZSwgd2VpZ2h0XSk7O1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0ZXh0U2hhZG93KSB7XG4gICAgICAgICAgICAgICAgLy8gZmlyZSBwb3RlbnRpYWwgc2luY2UgYSB0ZXh0IHdpdGggc2hhZG93IG1heSBiZSBzdGlsbCB2aWV3YWJsZSwgZGVwZW5kaW5nIG9uIHRoZSBzaGFkb3cgZWZmZmVjdHNcbiAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF90ZXh0X3NoYWRvd1wiLCBbcmF0aW8udG9GaXhlZCgyKSwgc2l6ZSwgd2VpZ2h0XSk7O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoZmcudG9IZXgoKSA9PT0gYmcudG9IZXgoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF9zYW1lX2NvbG9yXCIsIFtyYXRpby50b0ZpeGVkKDIpLCBzaXplLCB3ZWlnaHQsIGZnLnRvSGV4KCksIGJnLnRvSGV4KCksIGNvbG9yQ29tYm8uaGFzQkdJbWFnZSwgY29sb3JDb21iby5oYXNHcmFkaWVudF0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBSdWxlRmFpbChcImZhaWxfY29udHJhc3RcIiwgW3JhdGlvLnRvRml4ZWQoMiksIHNpemUsIHdlaWdodCwgZmcudG9IZXgoKSwgYmcudG9IZXgoKSwgY29sb3JDb21iby5oYXNCR0ltYWdlLCBjb2xvckNvbWJvLmhhc0dyYWRpZW50XSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSAgICBcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBSdWxlUGFzcyhcInBhc3NcIiwgW3JhdGlvLnRvRml4ZWQoMiksIHNpemUsIHdlaWdodCwgZmcudG9IZXgoKSwgYmcudG9IZXgoKSwgY29sb3JDb21iby5oYXNCR0ltYWdlLCBjb2xvckNvbWJvLmhhc0dyYWRpZW50XSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBjb25zdCB0ZXh0X3F1b3RlZF9jb3JyZWN0bHk6IFJ1bGUgPSB7XG4gICAgaWQ6IFwidGV4dF9xdW90ZWRfY29ycmVjdGx5XCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcIlBhc3NfMFwiOiBcInRleHRfcXVvdGVkX2NvcnJlY3RseS5odG1sXCIsXG4gICAgICAgICAgICBcIlBvdGVudGlhbF8xXCI6IFwidGV4dF9xdW90ZWRfY29ycmVjdGx5Lmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJ0ZXh0X3F1b3RlZF9jb3JyZWN0bHkuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJQYXNzXzBcIjogXCJSdWxlIFBhc3NlZFwiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcIklmIHRoZSBmb2xsb3dpbmcgdGV4dCBpcyBhIHF1b3RhdGlvbiwgbWFyayBpdCBhcyBhIDxxPiBvciA8YmxvY2txdW90ZT4gZWxlbWVudDogezB9XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiUXVvdGF0aW9ucyBzaG91bGQgYmUgbWFya2VkIHdpdGggPHE+IG9yIDxibG9ja3F1b3RlPiBlbGVtZW50c1wiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuICAgICAgICAvLyBpZ25vcmUgdGhlIGNoZWNrIGlmIHRoZSBub2RlIGlzIGhpZGRlblxuICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShydWxlQ29udGV4dCkgKSByZXR1cm4gbnVsbDtcbiAgICAgICAgLy8gRG9uJ3QgdHJpZ2dlciBpZiB0aGUgZWxlbWVudCBpcyBub3QgaW4gdGhlIGJvZHlcbiAgICAgICAgaWYgKENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFtcImJvZHlcIl0pID09PSBudWxsKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCB2YWxpZGF0ZVBhcmFtcyA9IHtcbiAgICAgICAgICAgIG1pbldvcmRzOiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IDMsXG4gICAgICAgICAgICAgICAgdHlwZTogXCJpbnRlZ2VyXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBsZXQgbWluV29yZHMgPSB2YWxpZGF0ZVBhcmFtcy5taW5Xb3Jkcy52YWx1ZTtcblxuICAgICAgICBsZXQgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgbGV0IHdhbGtOb2RlID0gcnVsZUNvbnRleHQuZmlyc3RDaGlsZCBhcyBOb2RlO1xuICAgICAgICBsZXQgdmlvbGF0ZWR0ZXh0ID0gbnVsbDtcbiAgICAgICAgLy8gaWdub3JlIHRoZSBjaGVjayBmb3IgdGhlIHRleHQgb2YgdGhlIGZvbGxvd2luZyBlbGVtZW50c1xuICAgICAgICBjb25zdCBpZ25vcmVkID0gW1wiYmxvY2txdW90ZVwiLCBcInFcIiwgXCJzY3JpcHRcIiwgXCJzdHlsZVwiLCBcInByZVwiLCBcImNvZGVcIiwgXCJydWJ5XCIsIFwic2FtcFwiXTtcbiAgICAgICAgd2hpbGUgKHBhc3NlZCAmJiB3YWxrTm9kZSkge1xuICAgICAgICAgICAgLy8gQ29tcGx5IHRvIHRoZSBDaGVjayBIaWRkZW4gQ29udGVudCBzZXR0aW5nIHdpbGwgYmUgZG9uZSBieSBkZWZhdWx0IGFzIHRoaXMgcnVsZSB0cmlnZ2VycyBvbiBlYWNoIGVsZW1lbnRcbiAgICAgICAgICAgIC8vIGFuZCBmb3IgZWFjaCBlbGVtZW50IGl0IG9ubHkgY2hlY2tzIHRoYXQgc2luZ2xlIGVsZW1lbnRzIHRleHQgbm9kZXMgYW5kIG5vdGhpbmcgZWxzZS4gU28gYWxsIGlubmVyIGVsZW1lbnRzIHdpbGwgYmVcbiAgICAgICAgICAgIC8vIGNvdmVyZWQgb24gdGhlaXIgb3duLiBDdXJyZW50bHkgZm9yIHRoaXMgcnVsZSBieSBkZWZhdWx0IENoZWNrIEhpZGRlbiBDb250ZW50IHdpbGwgd29yaywgYXMgd2UgYXJlIGRvaW5nXG4gICAgICAgICAgICAvLyBhIG5vZGUgd2FsayBvbmx5IG9uIHNpYmxpbmdzIHNvIGl0IHdvdWxkIG5vdCBnZXQgdGV4dCBub2RlcyBmcm9tIG90aGVyIHNpYmxpbmdzIGF0IGFsbC5cbiAgICAgICAgICAgIC8vIEluIHRoZSBjYXNlIGluIHRoZSBmdXR1cmUgc29tZXRoaW5nIGNobmdlcywganVzdCBuZWVkIHRvIGFkZCAmJiAhUlBUVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKHdhbGtOb2RlKSB0byB0aGUgYmVsb3dcbiAgICAgICAgICAgIC8vIGlmLlxuICAgICAgICAgICAgaWYgKHdhbGtOb2RlLm5vZGVOYW1lID09PSBcIiN0ZXh0XCIpIHtcbiAgICAgICAgICAgICAgICBsZXQgdHh0VmFsID0gd2Fsa05vZGUubm9kZVZhbHVlO1xuICAgICAgICAgICAgICAgIC8vIERvIHRoZSByZWdleCB0ZXN0cyBmaXJzdCAtIHNob3VsZCBiZSBmYXN0XG5cbiAgICAgICAgICAgICAgICAvLyBSZW1vdmUgYXBvc3Ryb3BoZSdzXG4gICAgICAgICAgICAgICAgdHh0VmFsID0gdHh0VmFsLnJlcGxhY2UoLyhcXFMpJyhcXFMpL2csIFwiJDEkMlwiKTtcbiAgICAgICAgICAgICAgICBsZXQgZGJsUXVvdGVzID0gdHh0VmFsLm1hdGNoKC8oXCJbXlwiXStcIikvZyk7XG4gICAgICAgICAgICAgICAgbGV0IHNuZ2xRdW90ZXMgPSB0eHRWYWwubWF0Y2goLygnW14nXSsnKS9nKTtcbiAgICAgICAgICAgICAgICAvLyBXYWxrIHRoZSBwYXJlbnRzIC0gb25seSBjb250aW51ZSB0ZXN0aW5nIGlmIHdlIGZvdW5kIGEgcXVvdGUsIGJ1dFxuICAgICAgICAgICAgICAgIC8vIHdlJ3JlIG5vdCBhbHJlYWR5IG1hcmtlZCB1cFxuICAgICAgICAgICAgICAgIC8vIEFsc28gc2tpcCBpZiB3ZSdyZSBpbiBhIHNjcmlwdCAtIHRoZXJlJ3MgbG90cyBvZiBxdW90ZXMgdXNlZCBpbiBzY3JpcHRzXG4gICAgICAgICAgICAgICAgaWYgKChkYmxRdW90ZXMgIT09IG51bGwgfHwgc25nbFF1b3RlcyAhPT0gbnVsbCkgJiZcbiAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5nZXRBbmNlc3Rvcih3YWxrTm9kZSwgaWdub3JlZCkgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRibFF1b3RlcyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgcGFzc2VkICYmIGkgPCBkYmxRdW90ZXMubGVuZ3RoOyArK2kpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gQ29tbW9uVXRpbC53b3JkQ291bnQoZGJsUXVvdGVzW2ldKSA8IG1pbldvcmRzO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChzbmdsUXVvdGVzICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBwYXNzZWQgJiYgaSA8IHNuZ2xRdW90ZXMubGVuZ3RoOyArK2kpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkID0gQ29tbW9uVXRpbC53b3JkQ291bnQoc25nbFF1b3Rlc1tpXSkgPCBtaW5Xb3JkcztcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBhbnkgbGluZWZlZWQgaW5zaWRlIHRoZSBxdW90ZVxuICAgICAgICAgICAgICAgICAgICAvLyB2aW9sYXRlZHRleHQgPSB0eHRWYWwucmVwbGFjZShuZXcgUmVnRXhwKFwiXFxcXHI/XFxcXG58XFxcXHJcIixcImdcIiksXCJcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkYmxRdW90ZXMgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpb2xhdGVkdGV4dCA9IHNuZ2xRdW90ZXMuam9pbihcIiwgXCIpLnJlcGxhY2UobmV3IFJlZ0V4cChcIlxcXFxyP1xcXFxufFxcXFxyXCIsIFwiZ1wiKSwgXCJcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc25nbFF1b3RlcyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmlvbGF0ZWR0ZXh0ID0gZGJsUXVvdGVzLmpvaW4oXCIsIFwiKS5yZXBsYWNlKG5ldyBSZWdFeHAoXCJcXFxccj9cXFxcbnxcXFxcclwiLCBcImdcIiksIFwiXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmlvbGF0ZWR0ZXh0ID0gZGJsUXVvdGVzLmNvbmNhdChzbmdsUXVvdGVzKS5qb2luKFwiLCBcIikucmVwbGFjZShuZXcgUmVnRXhwKFwiXFxcXHI/XFxcXG58XFxcXHJcIiwgXCJnXCIpLCBcIlwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdhbGtOb2RlID0gd2Fsa05vZGUubmV4dFNpYmxpbmc7XG4gICAgICAgIH1cblxuICAgICAgICAvL2lmIHRoZSB2aW9sYXRlZHRleHQgaXMgbG9uZ2VyIHRoYW4gNjkgY2hhcnMsIG9ubHkga2VlcCB0aGUgZmlyc3QgMzIsIHRoZSBcIiAuLi4gXCIsIGFuZCB0aGUgbGFzdCAzMiBjaGFycyBcbiAgICAgICAgaWYgKCFwYXNzZWQgJiYgdmlvbGF0ZWR0ZXh0Lmxlbmd0aCAmJiB2aW9sYXRlZHRleHQubGVuZ3RoID4gNjkpIHtcbiAgICAgICAgICAgIHZpb2xhdGVkdGV4dCA9IHZpb2xhdGVkdGV4dC5zdWJzdHJpbmcoMCwgMzIpICsgXCIgLi4uIFwiICsgdmlvbGF0ZWR0ZXh0LnN1YnN0cmluZyh2aW9sYXRlZHRleHQubGVuZ3RoIC0gMzIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBhc3NlZCA/IFJ1bGVQYXNzKFwiUGFzc18wXCIpIDogUnVsZVBvdGVudGlhbChcIlBvdGVudGlhbF8xXCIsIFt2aW9sYXRlZHRleHRdKTtcbiAgICB9XG59IiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IFJ1bGUsIFJ1bGVSZXN1bHQsIFJ1bGVDb250ZXh0LCBSdWxlUG90ZW50aWFsLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IHRleHRfc2Vuc29yeV9taXN1c2U6IFJ1bGUgPSB7XG4gICAgaWQ6IFwidGV4dF9zZW5zb3J5X21pc3VzZVwiLFxuICAgIGNvbnRleHQ6IFwiZG9tOmJvZHksIGRvbTpib2R5IGRvbToqXCIsXG4gICAgcmVmYWN0b3I6IHtcbiAgICAgICAgXCJSUFRfVGV4dF9TZW5zb3J5UmVmZXJlbmNlXCI6IHtcbiAgICAgICAgICAgIC8vIFwiUGFzc18wXCI6IFwicGFzc1wiLFxuICAgICAgICAgICAgXCJQb3RlbnRpYWxfMVwiOiBcInBvdGVudGlhbF9wb3NpdGlvbiwgcG90ZW50aWFsX290aGVyXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgLy8gXCJwYXNzXCI6IFwidGV4dF9zZW5zb3J5X21pc3VzZS5odG1sXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9wb3NpdGlvblwiOiBcInRleHRfc2Vuc29yeV9taXN1c2UuaHRtbFwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfb3RoZXJcIjogXCJ0ZXh0X3NlbnNvcnlfbWlzdXNlLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJ0ZXh0X3NlbnNvcnlfbWlzdXNlLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIC8vIFwicGFzc1wiOiBcIkluc3RydWN0aW9ucyBhcmUgbWVhbmluZ2Z1bCB3aXRob3V0IHJlbHlpbmcgc29sZWx5IG9uIHNoYXBlLCBzaXplLCBvciBsb2NhdGlvbiB3b3Jkc1wiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfcG9zaXRpb25cIjogXCJDb25maXJtIHRoZSB3b3JkKHMpICd7MH0nIG9mIHRoZSB1c2VyIGluc3RydWN0aW9uIGlzIHVzZWQgdG8gaW5kaWNhdGUgYSBsb2dpY2FsIHJhdGhlciB0aGFuIHZpc3VhbCBwb3NpdGlvblwiLFxuICAgICAgICAgICAgXCJwb3RlbnRpYWxfb3RoZXJcIjogXCJDb25maXJtIHRoZSB1c2VyIGluc3RydWN0aW9uIGlzIHN0aWxsIHVuZGVyc3RhbmRhYmxlIHdpdGhvdXQgdGhlIHdvcmQocykgJ3swfSdcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJJbnN0cnVjdGlvbnMgc2hvdWxkIGJlIG1lYW5pbmdmdWwgd2l0aG91dCByZWx5aW5nIHNvbGVseSBvbiBzaGFwZSwgc2l6ZSwgb3IgbG9jYXRpb24gd29yZHNcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgXCJpZFwiOiBbXCJJQk1fQWNjZXNzaWJpbGl0eVwiLCBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIiwgXCJXQ0FHXzJfMVwiLCBcIldDQUdfMl8wXCIsIFwiV0NBR18yXzJcIl0sXG4gICAgICAgIFwibnVtXCI6IFtcIjEuMy4zXCJdLFxuICAgICAgICBcImxldmVsXCI6IGVSdWxlUG9saWN5LlZJT0xBVElPTixcbiAgICAgICAgXCJ0b29sa2l0TGV2ZWxcIjogZVRvb2xraXRMZXZlbC5MRVZFTF9UV09cbiAgICB9XSxcbiAgICBhY3Q6IFtdLFxuICAgIHJ1bjogKGNvbnRleHQ6IFJ1bGVDb250ZXh0LCBvcHRpb25zPzoge30sIGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KTogUnVsZVJlc3VsdCB8IFJ1bGVSZXN1bHRbXSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1bGVDb250ZXh0ID0gY29udGV4dFtcImRvbVwiXS5ub2RlIGFzIEVsZW1lbnQ7XG4gICAgICAgIC8vIEV4dHJhY3QgdGhlIG5vZGVOYW1lIG9mIHRoZSBjb250ZXh0IG5vZGVcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gcnVsZUNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIG9yIGRpc2FibGVkXG4gICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKHJ1bGVDb250ZXh0KSB8fCBDb21tb25VdGlsLmlzTm9kZURpc2FibGVkKHJ1bGVDb250ZXh0KSB8fCBWaXNVdGlsLmhpZGRlbkJ5RGVmYXVsdEVsZW1lbnRzLmluY2x1ZGVzKG5vZGVOYW1lKSlcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgLy8gRG9uJ3QgdHJpZ2dlciBpZiB3ZSdyZSBub3QgaW4gdGhlIGJvZHkgb3IgaWYgd2UncmUgaW4gYSBzY3JpcHRcbiAgICAgICAgaWYgKENvbW1vblV0aWwuZ2V0QW5jZXN0b3IocnVsZUNvbnRleHQsIFtcImJvZHlcIl0pID09PSBudWxsKSBcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgLy8gaWdub3JlIHNjcmlwdCwgbGluaywgbGFiZWwgYW5kIHRoZWlyIGNoaWxkIGVsZW1lbnRzXG4gICAgICAgIGlmIChDb21tb25VdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBbXCJzY3JpcHRcIiwgXCJhXCIsICdsYWJlbCddKSAhPT0gbnVsbClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgIFxuICAgICAgICAvLyBpZ25vcmUgdGV4dCBvbiBsYW5kbWFyayByb2xlcywgYnV0IG5vdCBvbiB0aGVpciBjaGlsZHJlbiAoZS5nLiwgc2VjdGlvbiwgbWFpbilcbiAgICAgICAgY29uc3Qgcm9sZSA9IEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZShydWxlQ29udGV4dCk7XG4gICAgICAgIGlmIChyb2xlKSB7XG4gICAgICAgICAgICBsZXQgbG1Sb2xlcyA9IEFyaWFVdGlsLmdldFJvbGVzV2l0aFR5cGVzKHJ1bGVDb250ZXh0LCBbXCJsYW5kbWFya1wiXSk7XG4gICAgICAgICAgICBpZiAobG1Sb2xlcyAmJiBsbVJvbGVzLmluY2x1ZGVzKHJvbGUpKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9ICAgIFxuICAgICAgICBcbiAgICAgICAgLy8gaWdub3JlIGFsbCB3aWRnZXRzIGFuZCBoZWFkaW5ncywgYW5kIHRoZWlyIGNoaWxkcmVuLCBhbmQgY2VydGFpbiBzdHJ1Y3R1cmUgcm9sZXNcbiAgICAgICAgbGV0IHJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXNXaXRoVHlwZXMocnVsZUNvbnRleHQsIFtcIndpZGdldFwiLCBcImhlYWRpbmdcIl0pO1xuICAgICAgICAvLyBhZGQgc29tZSBzdHJ1Y3R1cmUgcm9sZXNcbiAgICAgICAgQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KFtcImNhcHRpb25cIiwgXCJjZWxsXCIsIFwiY29kZVwiLCBcImNvbHVtbmhlYWRlclwiLCBcImRlZmluaXRpb25cIiwgXCJmaWd1cmVcIiwgXCJsaXN0XCIsIFwibGlzdGl0ZW1cIiwgXCJtYXRoXCIsIFwibWV0ZXJcIiwgXCJyb3dcIiwgXCJyb3dncm91cFwiLCBcInJvd2hlYWRlclwiLCBcInRlcm1cIl0sIHJvbGVzKTtcbiAgICAgICAgaWYgKEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGVzKHJ1bGVDb250ZXh0LCByb2xlcykgIT09IG51bGwpIFxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgbGV0IHZpb2xhdGVkUG9zaXRpb25UZXh0ID0gXCJcIjtcbiAgICAgICAgbGV0IHZpb2xhdGVkT3RoZXJUZXh0ID0gXCJcIjtcbiAgICAgICAgbGV0IHdhbGtOb2RlID0gcnVsZUNvbnRleHQuZmlyc3RDaGlsZCBhcyBOb2RlO1xuICAgICAgICBsZXQgdHh0VmFsID0gXCJcIjsgXG4gICAgICAgIHdoaWxlICh3YWxrTm9kZSkge1xuICAgICAgICAgICAgLy8gZm9yIGVhY2ggZWxlbWVudCBpdCBvbmx5IGNoZWNrcyB0aGF0IHNpbmdsZSBlbGVtZW50cyB0ZXh0IG5vZGVzIGFuZCBub3RoaW5nIGVsc2UuIFxuICAgICAgICAgICAgLy8gYWxsIGlubmVyIGVsZW1lbnRzIHdpbGwgYmUgY292ZXJlZCBvbiB0aGVpciBvd24uIFxuICAgICAgICAgICAgLy8gd2hpdGVzcGFjZSBjaGFyYWN0ZXJzIChzcGFjZSwgbmV3bGluZSwgdGFiKSBiZXR3ZWVuIGVsZW1lbnRzIGFyZSBjb25zaWRlcmVkIGEgbm9kZSB0b28uXG4gICAgICAgICAgICBpZiAod2Fsa05vZGUubm9kZU5hbWUgPT09IFwiI3RleHRcIikge1xuICAgICAgICAgICAgICAgIGxldCB0eHQgPSB3YWxrTm9kZS5ub2RlVmFsdWUudHJpbSgpO1xuICAgICAgICAgICAgICAgIGlmICh0eHQubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICAgICAgdHh0VmFsICs9ICh0eHRWYWwubGVuZ3RoID4gMCA/IFwiLCBcIiArIHR4dCA6IHR4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3YWxrTm9kZSA9IHdhbGtOb2RlLm5leHRTaWJsaW5nO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZiAodHh0VmFsLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAvLyBmaXJzdCB0byByZW1vdmUgZWFjaCBleGVtcHQgd29yZCB3aXRoIGEgc2luZ2xlIHNwYWNlIGluIHRoZSB0ZXh0XG4gICAgICAgICAgICBsZXQgZXhlbXB0UmVnZXggPSBnZXRSZWdleChydWxlQ29udGV4dC5vd25lckRvY3VtZW50LCBcImV4ZW1wdFRleHRcIik7XG4gICAgICAgICAgICB0eHRWYWwgPSB0eHRWYWwucmVwbGFjZShleGVtcHRSZWdleCwgXCIgXCIpO1xuXG4gICAgICAgICAgICB2aW9sYXRlZFBvc2l0aW9uVGV4dCA9IGdldFZpb2xhdGVkVGV4dChydWxlQ29udGV4dC5vd25lckRvY3VtZW50LCBcInBvc2l0aW9uVGV4dFwiLCB0eHRWYWwpO1xuICAgICAgICAgICAgdmlvbGF0ZWRPdGhlclRleHQgPSBnZXRWaW9sYXRlZFRleHQocnVsZUNvbnRleHQub3duZXJEb2N1bWVudCwgXCJvdGhlclRleHRcIiwgdHh0VmFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXQgPSBbXTsgXG4gICAgICAgIGlmICh2aW9sYXRlZFBvc2l0aW9uVGV4dCkgcmV0LnB1c2goUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF9wb3NpdGlvblwiLCBbdmlvbGF0ZWRQb3NpdGlvblRleHRdKSk7XG4gICAgICAgIGlmICh2aW9sYXRlZE90aGVyVGV4dCkgcmV0LnB1c2goUnVsZVBvdGVudGlhbChcInBvdGVudGlhbF9vdGhlclwiLCBbdmlvbGF0ZWRPdGhlclRleHRdKSk7XG4gICAgICAgIHJldHVybiByZXQubGVuZ3RoID09IDAgPyBudWxsIDogcmV0O1xuICAgIH1cbn1cblxuY29uc3QgdmFsaWRhdGVQYXJhbXMgPSB7XG4gICAgcG9zaXRpb25UZXh0OiB7XG4gICAgICAgIHZhbHVlOiBbXCJ0b3AtbGVmdFwiLCBcInRvcC1yaWdodFwiLCBcImJvdHRvbS1yaWdodFwiLCBcImJvdHRvbS1sZWZ0XCIsXG4gICAgICAgICAgICBcInRvcC10by1ib3R0b21cIiwgXCJsZWZ0LXRvLXJpZ2h0XCIsIFwiYm90dG9tLXRvLXRvcFwiLCBcInJpZ2h0LXRvLWxlZnRcIixcbiAgICAgICAgICAgIFwicmlnaHRcIiwgXCJsZWZ0XCIsIFwiYWJvdmVcIiwgXCJiZWxvd1wiLCBcInRvcFwiLCBcImJvdHRvbVwiLFxuICAgICAgICAgICAgXCJ1cHBlclwiLCBcImxvd2VyXCIsIFwiY29ybmVyXCIsIFwiYmVzaWRlXCJcbiAgICAgICAgXSxcbiAgICAgICAgdHlwZTogXCJbc3RyaW5nXVwiXG4gICAgfSxcbiAgICBvdGhlclRleHQ6IHtcbiAgICAgICAgdmFsdWU6IFtcInJvdW5kXCIsIFwic3F1YXJlXCIsIFwic2hhcGVcIiwgXCJyZWN0YW5nbGVcIiwgXCJ0cmlhbmdsZVwiLFxuICAgICAgICAgICAgXCJzaXplXCIsIFwibGFyZ2VcIiwgXCJzbWFsbFwiLCBcIm1lZGl1bVwiLCBcImJpZ1wiLCBcImh1Z2VcIiwgXCJ0aW55XCIsIFwiZXh0cmFcIixcbiAgICAgICAgICAgIFwibGFyZ2VyXCIsIFwic21hbGxlclwiLCBcImJpZ2dlclwiLCBcImxpdHRsZVwiLCBcImxhcmdlc3RcIiwgXCJzbWFsbGVzdFwiLCBcImJpZ2dlc3RcIlxuICAgICAgICBdLFxuICAgICAgICB0eXBlOiBcIltzdHJpbmddXCJcbiAgICB9LFxuICAgIGV4ZW1wdFRleHQ6IHtcbiAgICAgICAgdmFsdWU6IFtcInJpZ2h0LWNsaWNrXCIsIFwibGVmdC1jbGlja1wiLCBcInJpZ2h0LWNsaWNraW5nXCIsIFwicmlnaHQtY2xpY2tzXCIsIFxuICAgICAgICAgICBcImxlZnQtY2xpY2tpbmdcIiwgXCJsZWZ0LWNsaWNrc1wiLCBcInNxdWFyZSByb290XCIsIFwicmlnaHQgbm93XCIsIFwib2ZmIHRoZSB0b3BcIiAgIC8vYXBwZW5kIGFzIG5lZWRlZFxuICAgICAgICBdLFxuICAgICAgICB0eXBlOiBcIltzdHJpbmddXCJcbiAgICB9ICAgIFxufVxuXG5mdW5jdGlvbiBnZXRSZWdleChkb2MsIHR5cGUpIHtcbiAgICBpZiAoIXZhbGlkYXRlUGFyYW1zW3R5cGVdKSByZXR1cm4gXCJcIjtcbiAgICBsZXQgc2Vuc29yeVJlZ2V4ID0gQ2FjaGVVdGlsLmdldENhY2hlKGRvYywgdHlwZSArIFwiX3NlbnNvcnlfbWlzdXNlXCIsIG51bGwpO1xuICAgIGlmIChzZW5zb3J5UmVnZXggPT0gbnVsbCkge1xuICAgICAgICBsZXQgc2Vuc29yeVRleHQgPSB2YWxpZGF0ZVBhcmFtc1t0eXBlXS52YWx1ZTtcbiAgICAgICAgbGV0IHJlZ2V4U3RyID0gXCIoXFxzXFxzK3xcIiArIHNlbnNvcnlUZXh0WzBdO1xuICAgICAgICBmb3IgKGxldCBqID0gMTsgaiA8IHNlbnNvcnlUZXh0Lmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICBsZXQgd29yZHMgPSBzZW5zb3J5VGV4dFtqXS50cmltKCkuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgcmVnZXhTdHIgKz0gXCJ8XCIgKyB3b3Jkc1swXTtcbiAgICAgICAgICAgIGlmICh3b3Jkcy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgYyA9IDE7IGMgPCB3b3Jkcy5sZW5ndGg7ICsrYylcbiAgICAgICAgICAgICAgICAgICAgcmVnZXhTdHIgKz0gXCIgK1wiICsgd29yZHNbY107XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy9yZWdleFN0ciArPSBcIilcXFxcV1wiO1xuICAgICAgICByZWdleFN0ciArPSBcIilcIjtcbiAgICAgICAgc2Vuc29yeVJlZ2V4ID0gbmV3IFJlZ0V4cChyZWdleFN0ciwgXCJnaVwiKTtcbiAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGRvYywgdHlwZSArXCJfc2Vuc29yeV9taXN1c2VcIiwgc2Vuc29yeVJlZ2V4KTtcbiAgICB9XG4gICAgcmV0dXJuIHNlbnNvcnlSZWdleDtcbn1cblxuZnVuY3Rpb24gZ2V0VmlvbGF0ZWRUZXh0KGRvYywgdHlwZSwgdHh0VmFsKSB7XG4gICAgaWYgKCF0eHRWYWwpIHJldHVybiBcIlwiO1xuICAgIGxldCBzZW5zb3J5VGV4dEFyciA9IHZhbGlkYXRlUGFyYW1zW3R5cGVdLnZhbHVlXG4gICAgbGV0IGhhc2ggPSB7fSwgcmVzdWx0ID0gW107XG4gICAgXG4gICAgLy8gc3BsaXQgdGhlIHN0cmluZyBpbnRvIHdvcmRzXG4gICAgbGV0IGNvdW50cyA9IHR4dFZhbC5zcGxpdCgvXFxzKy8pLnJlZHVjZShmdW5jdGlvbiAobWFwLCB3b3JkKSB7XG4gICAgICAgIGxldCB3b3JkV29UcmFpbGluZ1B1bmMgPSB3b3JkLnJlcGxhY2UoL1suPyE6OygpJ1wiLGBcXF1dKyQvLCBcIlwiKTtcbiAgICAgICAgbGV0IGxjV29yZFdvUHVuYyA9IHdvcmQudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bLj8hOjsoKSdcIixgXFxdXS9nLCBcIlwiKTtcblxuICAgICAgICBmb3IgKGxldCBjb3VudGVyID0gMDsgY291bnRlciA8IHNlbnNvcnlUZXh0QXJyLmxlbmd0aDsgY291bnRlcisrKSB7XG4gICAgICAgICAgICBsZXQgYSA9IGxjV29yZFdvUHVuYy5pbmRleE9mKHNlbnNvcnlUZXh0QXJyW2NvdW50ZXJdKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgbGV0IHNlbnNvcnlXb3JkTGVuID0gc2Vuc29yeVRleHRBcnJbY291bnRlcl0ubGVuZ3RoO1xuICAgICAgICAgICAgbGV0IGNoYXJGb2xsb3dTZW5zb3J5VGV4dCA9IGxjV29yZFdvUHVuYy5jaGFyQXQoc2Vuc29yeVdvcmRMZW4gKyBhKTtcblxuICAgICAgICAgICAgLy8gSWYgdGhlIHdvcmQgZG9lcyBub3QgY29udGFpbnMgc3Vic3RyaW5nIG9mIHNlbnNvcnlUZXh0QXJyW2NvdW50ZXJdXG4gICAgICAgICAgICAvLyBwcm9jZWVkIHRvIHRoZSBuZXh0IGxvb3AgaXRlcmF0aW9uIGZvciBuZXh0IHNlbnNvcnlUZXh0LlxuICAgICAgICAgICAgaWYgKGEgPCAwKSB7IGNvbnRpbnVlOyB9XG5cbiAgICAgICAgICAgIC8vY2hlY2sgdGhlIGZvbGxvd2luZyBhbmQgcHJvY2VlZGluZyBwdW5jdHVhdGlvbnNcbiAgICAgICAgICAgIC8vbGV0IGlzUHVuY2ZvbGxvd2luZyA9ICgoY2hhckZvbGxvd1NlbnNvcnlUZXh0ID09ICdcXC0nKSB8fFxuICAgICAgICAgICAgbGV0IGlzUHVuY2ZvbGxvd2luZyA9IChcbiAgICAgICAgICAgICAgICAoY2hhckZvbGxvd1NlbnNvcnlUZXh0ID09ICdcXC4nKSB8fFxuICAgICAgICAgICAgICAgIChjaGFyRm9sbG93U2Vuc29yeVRleHQgPT0gJ1xcPycpIHx8IChjaGFyRm9sbG93U2Vuc29yeVRleHQgPT0gJ1xcIScpIHx8XG4gICAgICAgICAgICAgICAgKGNoYXJGb2xsb3dTZW5zb3J5VGV4dCA9PSAnXFw6JykgfHwgKGNoYXJGb2xsb3dTZW5zb3J5VGV4dCA9PSAnXFw7JykgfHxcbiAgICAgICAgICAgICAgICAoY2hhckZvbGxvd1NlbnNvcnlUZXh0ID09ICdcXCgnKSB8fCAoY2hhckZvbGxvd1NlbnNvcnlUZXh0ID09ICdcXCknKSB8fFxuICAgICAgICAgICAgICAgIChjaGFyRm9sbG93U2Vuc29yeVRleHQgPT0gJ1xcJycpIHx8IChjaGFyRm9sbG93U2Vuc29yeVRleHQgPT0gJ1xcXCInKSB8fFxuICAgICAgICAgICAgICAgIChjaGFyRm9sbG93U2Vuc29yeVRleHQgPT0gJ1xcLCcpIHx8IChjaGFyRm9sbG93U2Vuc29yeVRleHQgPT0gJy5cXGAnKSB8fFxuICAgICAgICAgICAgICAgIChjaGFyRm9sbG93U2Vuc29yeVRleHQgPT0gJ1xcXFwnKSB8fCAoY2hhckZvbGxvd1NlbnNvcnlUZXh0ID09ICdcXF0nKSk7XG5cbiAgICAgICAgICAgIGxldCBpc1B1bmNQcmVjZWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChhID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCBjaGFyUHJlY2VkZVNlbnNvcnlUZXh0ID0gbGNXb3JkV29QdW5jLmNoYXJBdChhIC0gMSk7XG4gICAgICAgICAgICAgICAgaXNQdW5jUHJlY2VkaW5nID0gKChjaGFyUHJlY2VkZVNlbnNvcnlUZXh0ID09ICdcXC0nKSB8fFxuICAgICAgICAgICAgICAgICAgICAoY2hhclByZWNlZGVTZW5zb3J5VGV4dCA9PSAnXFwuJykgfHxcbiAgICAgICAgICAgICAgICAgICAgKGNoYXJQcmVjZWRlU2Vuc29yeVRleHQgPT0gJ1xcPycpIHx8IChjaGFyUHJlY2VkZVNlbnNvcnlUZXh0ID09ICdcXCEnKSB8fFxuICAgICAgICAgICAgICAgICAgICAoY2hhclByZWNlZGVTZW5zb3J5VGV4dCA9PSAnXFw6JykgfHwgKGNoYXJQcmVjZWRlU2Vuc29yeVRleHQgPT0gJ1xcOycpIHx8XG4gICAgICAgICAgICAgICAgICAgIChjaGFyUHJlY2VkZVNlbnNvcnlUZXh0ID09ICdcXCgnKSB8fCAoY2hhclByZWNlZGVTZW5zb3J5VGV4dCA9PSAnXFwpJykgfHxcbiAgICAgICAgICAgICAgICAgICAgKGNoYXJQcmVjZWRlU2Vuc29yeVRleHQgPT0gJ1xcJycpIHx8IChjaGFyUHJlY2VkZVNlbnNvcnlUZXh0ID09ICdcXFwiJykgfHxcbiAgICAgICAgICAgICAgICAgICAgKGNoYXJQcmVjZWRlU2Vuc29yeVRleHQgPT0gJ1xcLCcpIHx8IChjaGFyUHJlY2VkZVNlbnNvcnlUZXh0ID09ICcuXFxgJykgfHxcbiAgICAgICAgICAgICAgICAgICAgKGNoYXJQcmVjZWRlU2Vuc29yeVRleHQgPT0gJ1xcXFwnKSB8fCAoY2hhclByZWNlZGVTZW5zb3J5VGV4dCA9PSAnXFxdJykpO1xuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICgoKGxjV29yZFdvUHVuYy5sZW5ndGggPT0gc2Vuc29yeVdvcmRMZW4pIHx8IChpc1B1bmNmb2xsb3dpbmcgPT0gdHJ1ZSkgfHwgKGlzUHVuY1ByZWNlZGluZyA9PSB0cnVlKSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWhhc2guaGFzT3duUHJvcGVydHkod29yZFdvVHJhaWxpbmdQdW5jKSkge1xuICAgICAgICAgICAgICAgICAgICBoYXNoW3dvcmRXb1RyYWlsaW5nUHVuY10gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh3b3JkV29UcmFpbGluZ1B1bmMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb3VudGVyID0gc2Vuc29yeVRleHRBcnIubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG1hcFt3b3JkV29UcmFpbGluZ1B1bmNdID0gKG1hcFt3b3JkV29UcmFpbGluZ1B1bmNdIHx8IDApICsgMTtcbiAgICAgICAgcmV0dXJuIG1hcDtcbiAgICB9LCBPYmplY3QuY3JlYXRlKG51bGwpKTtcbiAgICByZXR1cm4gcmVzdWx0LmpvaW4oXCIsIFwiKTtcbn0gIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsLCBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBhc3MsIFJ1bGVGYWlsLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi4vdXRpbC9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgQ1NTVXRpbCB9IGZyb20gXCIuLi91dGlsL0NTU1V0aWxcIjtcbmltcG9ydCB7IERPTU1hcHBlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NTWFwcGVyXCI7XG5cbi8vIE1vZHVsZS1sZXZlbCBjb25zdGFudHNcbmNvbnN0IFNUWUxFX1ZBTFVFX1JFR0VYID0gLygtP1tcXGQuXSspKFthLXolXSopLztcbmNvbnN0IE1JTl9XT1JEX1NQQUNJTkdfUkFUSU8gPSAwLjE2O1xuY29uc3QgTUlOX0xFVFRFUl9TUEFDSU5HX1JBVElPID0gMC4xMjtcbmNvbnN0IE1JTl9MSU5FX0hFSUdIVF9SQVRJTyA9IDEuNTtcbmNvbnN0IElNUE9SVEFOVF9TVUZGSVggPSBcIiFpbXBvcnRhbnRcIjtcbmNvbnN0IElNUE9SVEFOVF9TVUZGSVhfTEVOR1RIID0gSU1QT1JUQU5UX1NVRkZJWC5sZW5ndGggKyAxOyAvLyArMSBmb3IgdGhlIHNwYWNlIGJlZm9yZSAhaW1wb3J0YW50XG5cbi8qKlxuICogUmVzb2x2ZXMgaW5oZXJpdGVkIG9yIHVuc2V0IHN0eWxlIHZhbHVlcyBieSB0cmF2ZXJzaW5nIHVwIHRoZSBET00gdHJlZVxuICogQHBhcmFtIGVsZW1lbnQgLSBUaGUgZWxlbWVudCB0byByZXNvbHZlIHRoZSBzdHlsZSBmb3JcbiAqIEBwYXJhbSBwcm9wZXJ0eSAtIFRoZSBDU1MgcHJvcGVydHkgbmFtZVxuICogQHBhcmFtIGN1cnJlbnRWYWx1ZSAtIFRoZSBjdXJyZW50IHN0eWxlIHZhbHVlXG4gKiBAcmV0dXJucyBUaGUgcmVzb2x2ZWQgc3R5bGUgdmFsdWVcbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZUluaGVyaXRlZFN0eWxlKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBwcm9wZXJ0eTogc3RyaW5nLCBjdXJyZW50VmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKGN1cnJlbnRWYWx1ZS5zdGFydHNXaXRoKCdpbmhlcml0JykgfHwgY3VycmVudFZhbHVlLnN0YXJ0c1dpdGgoJ3Vuc2V0JykpIHtcbiAgICAgICAgY29uc3QgYW5jZXN0b3IgPSBDU1NVdGlsLmdldEFuY2VzdG9yV2l0aFN0eWxlcyhcbiAgICAgICAgICAgIGVsZW1lbnQucGFyZW50RWxlbWVudCxcbiAgICAgICAgICAgIHtbcHJvcGVydHldOiBbXCIqXCJdfSxcbiAgICAgICAgICAgIFsnaW5oZXJpdCcsICd1bnNldCddXG4gICAgICAgICk7XG4gICAgICAgIGlmIChhbmNlc3RvciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIENTU1V0aWwuZ2V0RGVmaW5lZFN0eWxlcyhhbmNlc3RvciwgW3Byb3BlcnR5XSlbcHJvcGVydHldO1xuICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRWYWx1ZS5zdGFydHNXaXRoKCd1bnNldCcpKSB7XG4gICAgICAgICAgICByZXR1cm4gXCJpbml0aWFsXCI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGN1cnJlbnRWYWx1ZTtcbn1cblxuLyoqXG4gKiBSZW1vdmVzIHRoZSAhaW1wb3J0YW50IHN1ZmZpeCBmcm9tIGEgc3R5bGUgdmFsdWVcbiAqIEBwYXJhbSBzdHlsZVZhbHVlIC0gVGhlIHN0eWxlIHZhbHVlIHBvdGVudGlhbGx5IGNvbnRhaW5pbmcgIWltcG9ydGFudFxuICogQHJldHVybnMgVGhlIHN0eWxlIHZhbHVlIHdpdGhvdXQgIWltcG9ydGFudFxuICovXG5mdW5jdGlvbiByZW1vdmVJbXBvcnRhbnRTdWZmaXgoc3R5bGVWYWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gc3R5bGVWYWx1ZS5zdWJzdHJpbmcoMCwgc3R5bGVWYWx1ZS5sZW5ndGggLSBJTVBPUlRBTlRfU1VGRklYX0xFTkdUSCk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGlmIGEgc3BhY2luZyBwcm9wZXJ0eSB2aW9sYXRlcyBhY2Nlc3NpYmlsaXR5IHJlcXVpcmVtZW50c1xuICogQHBhcmFtIGVsZW1lbnQgLSBUaGUgSFRNTCBlbGVtZW50IGJlaW5nIGNoZWNrZWRcbiAqIEBwYXJhbSBwcm9wZXJ0eSAtIFRoZSBDU1MgcHJvcGVydHkgbmFtZSAod29yZC1zcGFjaW5nLCBsZXR0ZXItc3BhY2luZywgbGluZS1oZWlnaHQpXG4gKiBAcGFyYW0gc3R5bGVWYWx1ZSAtIFRoZSBjdXJyZW50IHN0eWxlIHZhbHVlXG4gKiBAcGFyYW0gZm9udFNpemUgLSBUaGUgY29tcHV0ZWQgZm9udCBzaXplIGluIHBpeGVsc1xuICogQHBhcmFtIG1pblJhdGlvIC0gVGhlIG1pbmltdW0gcmF0aW8gdGhyZXNob2xkXG4gKiBAcGFyYW0gYWxsb3dVbml0bGVzcyAtIFdoZXRoZXIgdW5pdGxlc3MgdmFsdWVzIGFyZSBhbGxvd2VkIChmb3IgbGluZS1oZWlnaHQpXG4gKiBAcmV0dXJucyBSdWxlUmVzdWx0IGluZGljYXRpbmcgcGFzcyBvciBmYWlsXG4gKi9cbmZ1bmN0aW9uIGNoZWNrU3BhY2luZ1Byb3BlcnR5KFxuICAgIGVsZW1lbnQ6IEhUTUxFbGVtZW50LFxuICAgIHByb3BlcnR5OiBzdHJpbmcsXG4gICAgc3R5bGVWYWx1ZTogc3RyaW5nLFxuICAgIGZvbnRTaXplOiBudW1iZXIsXG4gICAgbWluUmF0aW86IG51bWJlcixcbiAgICBhbGxvd1VuaXRsZXNzOiBib29sZWFuID0gZmFsc2Vcbik6IGJvb2xlYW4ge1xuICAgIC8vIENoZWNrIGlmICFpbXBvcnRhbnQgaXMgdXNlZFxuICAgIGlmIChlbGVtZW50LnN0eWxlLmdldFByb3BlcnR5UHJpb3JpdHkocHJvcGVydHkpICE9PSAnaW1wb3J0YW50Jykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgIWltcG9ydGFudCBzdWZmaXhcbiAgICBjb25zdCBjbGVhblZhbHVlID0gcmVtb3ZlSW1wb3J0YW50U3VmZml4KHN0eWxlVmFsdWUpO1xuXG4gICAgLy8gQ2hlY2sgZm9yIGluaXRpYWwgb3Igbm9ybWFsIHZhbHVlcyAoY29tcHV0ZWQgc3BhY2UgaXMgMClcbiAgICBpZiAoY2xlYW5WYWx1ZSA9PT0gJ2luaXRpYWwnIHx8IGNsZWFuVmFsdWUgPT09ICdub3JtYWwnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBQYXJzZSB0aGUgbnVtZXJpYyB2YWx1ZVxuICAgIGNvbnN0IG51bWVyaWNWYWx1ZSA9IHBhcnNlRmxvYXQoY2xlYW5WYWx1ZSk7XG4gICAgaWYgKGlzTmFOKG51bWVyaWNWYWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gTWF0Y2ggdmFsdWUgYW5kIHVuaXRcbiAgICBjb25zdCBwYXJzZWRWYWx1ZSA9IGNsZWFuVmFsdWUudHJpbSgpLm1hdGNoKFNUWUxFX1ZBTFVFX1JFR0VYKTtcbiAgICBpZiAoIXBhcnNlZFZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGNvbnN0IFssIHZhbHVlLCB1bml0XSA9IHBhcnNlZFZhbHVlO1xuXG4gICAgLy8gSGFuZGxlIHVuaXRsZXNzIHZhbHVlcyAob25seSBmb3IgbGluZS1oZWlnaHQpXG4gICAgaWYgKHVuaXQgPT09ICcnKSB7XG4gICAgICAgIGlmIChhbGxvd1VuaXRsZXNzKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VGbG9hdCh2YWx1ZSkgPCBtaW5SYXRpbyA/IGZhbHNlIDogdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBGb3Igb3RoZXIgcHJvcGVydGllcywgemVybyB2YWx1ZSB3aXRob3V0IHVuaXQgaXMgaWdub3JlZFxuICAgICAgICBpZiAocGFyc2VGbG9hdCh2YWx1ZSkgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gU2tpcCBpZiBubyB1bml0IGFuZCBub24temVybyAoZXJyb3IgY2FzZSwgaW5hcHBsaWNhYmxlKVxuICAgIGlmICh1bml0ID09PSAnJyAmJiBwYXJzZUZsb2F0KHZhbHVlKSAhPT0gMCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBDb252ZXJ0IHRvIHBpeGVscyBhbmQgY2hlY2sgcmF0aW9cbiAgICBjb25zdCBwaXhlbHMgPSBDU1NVdGlsLmNvbnZlcnRWYWx1ZTJQaXhlbHModW5pdCwgdmFsdWUsIGVsZW1lbnQpO1xuICAgIGlmIChwaXhlbHMgIT09IG51bGwgJiYgcGl4ZWxzIC8gZm9udFNpemUgPCBtaW5SYXRpbykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBjb25zdCB0ZXh0X3NwYWNpbmdfdmFsaWQ6IFJ1bGUgPSB7XG4gICAgaWQ6IFwidGV4dF9zcGFjaW5nX3ZhbGlkXCIsXG4gICAgY29udGV4dDogXCJkb206KlwiLFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJ0ZXh0X3NwYWNpbmdfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcInRleHRfc3BhY2luZ192YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfbGV0dGVyX3NwYWNpbmdfc3R5bGVcIjogXCJ0ZXh0X3NwYWNpbmdfdmFsaWQuaHRtbFwiLFxuICAgICAgICAgICAgXCJmYWlsX3dvcmRfc3BhY2luZ19zdHlsZVwiOiBcInRleHRfc3BhY2luZ192YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfbGluZV9oZWlnaHRfc3R5bGVcIjogXCJ0ZXh0X3NwYWNpbmdfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiQ1NTICFpbXBvcnRhbnQgaXMgbm90IHVzZWQgaW4gaW5saW5lIHN0eWxlIHRvIGNvbnRyb2wgbGV0dGVyIG9yIHdvcmQgc3BhY2luZyBvciBsaW5lIGhlaWdodFwiLFxuICAgICAgICAgICAgXCJncm91cFwiOiBcIkNTUyAhaW1wb3J0YW50IHNob3VsZCBub3QgYmUgdXNlZCBpbiBpbmxpbmUgc3R5bGUgdG8gY29udHJvbCBsZXR0ZXIgb3Igd29yZCBzcGFjaW5nIG9yIGxpbmUgaGVpZ2h0XCIsXG4gICAgICAgICAgICBcImZhaWxfbGV0dGVyX3NwYWNpbmdfc3R5bGVcIjogXCJDU1MgIWltcG9ydGFudCBzaG91bGQgbm90IGJlIHVzZWQgaW4gaW5saW5lIOKAmGxldHRlci1zcGFjaW5n4oCZIHN0eWxlXCIsXG4gICAgICAgICAgICBcImZhaWxfd29yZF9zcGFjaW5nX3N0eWxlXCI6IFwiQ1NTICFpbXBvcnRhbnQgc2hvdWxkIG5vdCBiZSB1c2VkIGluIGlubGluZSDigJh3b3JkLXNwYWNpbmfigJkgc3R5bGVcIixcbiAgICAgICAgICAgIFwiZmFpbF9saW5lX2hlaWdodF9zdHlsZVwiOiBcIkNTUyAhaW1wb3J0YW50IHNob3VsZCBub3QgYmUgdXNlZCBpbiBpbmxpbmUg4oCYbGluZS1oZWlnaHTigJkgc3R5bGVcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlc2V0czogW3tcbiAgICAgICAgIFwiaWRcIjogW1wiSUJNX0FjY2Vzc2liaWxpdHlcIiwgXCJJQk1fQWNjZXNzaWJpbGl0eV9uZXh0XCIsIFwiV0NBR18yXzFcIiwgXCJXQ0FHXzJfMFwiLCBcIldDQUdfMl8yXCJdLFxuICAgICAgICAgXCJudW1cIjogW1wiMS40LjEyXCJdLFxuICAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OlsnOWU0NWVjJywgJzI0YWZjMicsICc3OGZkMzInXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MRWxlbWVudDtcblxuICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGlzIGVsZW1lbnQgaGFzIGNoaWxkcmVuIHdpdGggYWN0dWFsIHRleHRcbiAgICAgICAgbGV0IGNoaWxkU3RyID0gXCJcIjtcbiAgICAgICAgY29uc3QgY2hpbGROb2RlcyA9IHJ1bGVDb250ZXh0LmNoaWxkTm9kZXM7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGROb2Rlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgaWYgKGNoaWxkTm9kZXNbaV0ubm9kZVR5cGUgPT09IDMpIHsgLy8gVGV4dCBub2RlXG4gICAgICAgICAgICAgICAgY2hpbGRTdHIgKz0gY2hpbGROb2Rlc1tpXS5ub2RlVmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoaWxkU3RyLnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIG9yIGRpc2FibGVkXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkgfHwgQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgb2ZmIHNjcmVlblxuICAgICAgICBjb25zdCBtYXBwZXI6IERPTU1hcHBlciA9IG5ldyBET01NYXBwZXIoKTtcbiAgICAgICAgY29uc3QgYm91bmRzID0gbWFwcGVyLmdldFVuYWRqdXN0ZWRCb3VuZHMocnVsZUNvbnRleHQpO1xuICAgICAgICBpZiAoIWJvdW5kcyB8fCBib3VuZHNbJ3RvcCddIDwgMCB8fCBib3VuZHNbJ2xlZnQnXSA8IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2tpcCBub24tSFRNTCBlbGVtZW50cyAoZS5nLiwgU1ZHKVxuICAgICAgICBpZiAoQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgXCJzdmdcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRm9udCBzaXplIGFsd2F5cyByZXNvbHZlZCB0byAncHgnXG4gICAgICAgIGNvbnN0IGNvbXB1dGVkU3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgY29uc3QgZm9udFNpemUgPSBwYXJzZUZsb2F0KGNvbXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnZm9udC1zaXplJykpO1xuXG4gICAgICAgIC8vIEVhcmx5IGV4aXQgb3B0aW1pemF0aW9uOiBDaGVjayBpZiBjb21wdXRlZCBzdHlsZXMgYWxyZWFkeSBwYXNzXG4gICAgICAgIC8vIElmIGFsbCB0aHJlZSBwcm9wZXJ0aWVzIGhhdmUgcGFzc2luZyB2YWx1ZXMsIHdlIGNhbiBza2lwIHRoZSBleHBlbnNpdmUgZ2V0RGVmaW5lZFN0eWxlcyBjYWxsXG4gICAgICAgIGNvbnN0IGNvbXB1dGVkV29yZFNwYWNpbmcgPSBjb21wdXRlZFN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ3dvcmQtc3BhY2luZycpO1xuICAgICAgICBjb25zdCBjb21wdXRlZExldHRlclNwYWNpbmcgPSBjb21wdXRlZFN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ2xldHRlci1zcGFjaW5nJyk7XG4gICAgICAgIGNvbnN0IGNvbXB1dGVkTGluZUhlaWdodCA9IGNvbXB1dGVkU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnbGluZS1oZWlnaHQnKTtcblxuICAgICAgICAvLyBDaGVjayBpZiBjb21wdXRlZCB2YWx1ZXMgcGFzcyB0aGUgcmVxdWlyZW1lbnRzXG4gICAgICAgIGxldCB3b3JkU3BhY2luZ1Bhc3NlcyA9IHRydWU7XG4gICAgICAgIGxldCBsZXR0ZXJTcGFjaW5nUGFzc2VzID0gdHJ1ZTtcbiAgICAgICAgbGV0IGxpbmVIZWlnaHRQYXNzZXMgPSB0cnVlO1xuXG4gICAgICAgIC8vIENoZWNrIHdvcmQtc3BhY2luZyAoaWdub3JlIDBweCB3aGljaCByZXByZXNlbnRzIGRlZmF1bHQvbm9ybWFsKVxuICAgICAgICBpZiAoY29tcHV0ZWRXb3JkU3BhY2luZykge1xuICAgICAgICAgICAgY29uc3Qgd29yZFZhbHVlID0gcGFyc2VGbG9hdChjb21wdXRlZFdvcmRTcGFjaW5nKTtcbiAgICAgICAgICAgIGlmICghaXNOYU4od29yZFZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHdvcmRQaXhlbHMgPSBDU1NVdGlsLmNvbnZlcnRWYWx1ZTJQaXhlbHMoJ3B4Jywgd29yZFZhbHVlLnRvU3RyaW5nKCksIHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgICAgICBpZiAod29yZFBpeGVscyAhPT0gbnVsbCAmJiB3b3JkUGl4ZWxzIC8gZm9udFNpemUgPCBNSU5fV09SRF9TUEFDSU5HX1JBVElPKSB7XG4gICAgICAgICAgICAgICAgICAgIHdvcmRTcGFjaW5nUGFzc2VzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgbGV0dGVyLXNwYWNpbmcgKGlnbm9yZSAwcHggd2hpY2ggcmVwcmVzZW50cyBkZWZhdWx0L25vcm1hbClcbiAgICAgICAgaWYgKGNvbXB1dGVkTGV0dGVyU3BhY2luZykge1xuICAgICAgICAgICAgY29uc3QgbGV0dGVyVmFsdWUgPSBwYXJzZUZsb2F0KGNvbXB1dGVkTGV0dGVyU3BhY2luZyk7XG4gICAgICAgICAgICBpZiAoIWlzTmFOKGxldHRlclZhbHVlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxldHRlclBpeGVscyA9IENTU1V0aWwuY29udmVydFZhbHVlMlBpeGVscygncHgnLCBsZXR0ZXJWYWx1ZS50b1N0cmluZygpLCBydWxlQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgaWYgKGxldHRlclBpeGVscyAhPT0gbnVsbCAmJiBsZXR0ZXJQaXhlbHMgLyBmb250U2l6ZSA8IE1JTl9MRVRURVJfU1BBQ0lOR19SQVRJTykge1xuICAgICAgICAgICAgICAgICAgICBsZXR0ZXJTcGFjaW5nUGFzc2VzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgbGluZS1oZWlnaHRcbiAgICAgICAgaWYgKGNvbXB1dGVkTGluZUhlaWdodCkge1xuICAgICAgICAgICAgY29uc3QgbGluZVZhbHVlID0gcGFyc2VGbG9hdChjb21wdXRlZExpbmVIZWlnaHQpO1xuICAgICAgICAgICAgaWYgKCFpc05hTihsaW5lVmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgLy8gTGluZSBoZWlnaHQgY2FuIGJlIHVuaXRsZXNzIG9yIGluIHBpeGVsc1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gY29tcHV0ZWRMaW5lSGVpZ2h0Lm1hdGNoKFNUWUxFX1ZBTFVFX1JFR0VYKTtcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgWywgdmFsdWUsIHVuaXRdID0gbWF0Y2g7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1bml0ID09PSAnJyB8fCB1bml0ID09PSAncHgnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByYXRpbyA9IHVuaXQgPT09ICcnID8gcGFyc2VGbG9hdCh2YWx1ZSkgOiBwYXJzZUZsb2F0KHZhbHVlKSAvIGZvbnRTaXplO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhdGlvIDwgTUlOX0xJTkVfSEVJR0hUX1JBVElPKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZUhlaWdodFBhc3NlcyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgYWxsIGNvbXB1dGVkIHZhbHVlcyBwYXNzLCB3ZSBjYW4gc2tpcCB0aGUgZXhwZW5zaXZlIGdldERlZmluZWRTdHlsZXMgY2hlY2tcbiAgICAgICAgaWYgKHdvcmRTcGFjaW5nUGFzc2VzICYmIGxldHRlclNwYWNpbmdQYXNzZXMgJiYgbGluZUhlaWdodFBhc3Nlcykge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgZGVmaW5lZCBzdHlsZXMgdG8gY2hlY2sgZm9yICFpbXBvcnRhbnQgZGVjbGFyYXRpb25zXG4gICAgICAgIGNvbnN0IHN0eWxlcyA9IENTU1V0aWwuZ2V0RGVmaW5lZFN0eWxlcyhydWxlQ29udGV4dCwgW1wid29yZC1zcGFjaW5nXCIsIFwibGV0dGVyLXNwYWNpbmdcIiwgXCJsaW5lLWhlaWdodFwiXSk7XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhzdHlsZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCByZXN1bHRzOiBSdWxlUmVzdWx0W10gPSBbXTtcblxuICAgICAgICAvLyBDaGVjayB3b3JkLXNwYWNpbmdcbiAgICAgICAgbGV0IHdvcmRTdHlsZSA9IHN0eWxlc1snd29yZC1zcGFjaW5nJ107XG4gICAgICAgIGlmICh3b3JkU3R5bGUpIHtcbiAgICAgICAgICAgIHdvcmRTdHlsZSA9IHJlc29sdmVJbmhlcml0ZWRTdHlsZShydWxlQ29udGV4dCwgJ3dvcmQtc3BhY2luZycsIHdvcmRTdHlsZSk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBjaGVja1NwYWNpbmdQcm9wZXJ0eShcbiAgICAgICAgICAgICAgICBydWxlQ29udGV4dCxcbiAgICAgICAgICAgICAgICAnd29yZC1zcGFjaW5nJyxcbiAgICAgICAgICAgICAgICB3b3JkU3R5bGUsXG4gICAgICAgICAgICAgICAgZm9udFNpemUsXG4gICAgICAgICAgICAgICAgTUlOX1dPUkRfU1BBQ0lOR19SQVRJT1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaChyZXN1bHQgPyBSdWxlUGFzcyhcInBhc3NcIikgOiBSdWxlRmFpbCgnZmFpbF93b3JkX3NwYWNpbmdfc3R5bGUnKSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBsZXR0ZXItc3BhY2luZ1xuICAgICAgICBsZXQgbGV0dGVyU3R5bGUgPSBzdHlsZXNbJ2xldHRlci1zcGFjaW5nJ107XG4gICAgICAgIGlmIChsZXR0ZXJTdHlsZSkge1xuICAgICAgICAgICAgbGV0dGVyU3R5bGUgPSByZXNvbHZlSW5oZXJpdGVkU3R5bGUocnVsZUNvbnRleHQsICdsZXR0ZXItc3BhY2luZycsIGxldHRlclN0eWxlKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNoZWNrU3BhY2luZ1Byb3BlcnR5KFxuICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0LFxuICAgICAgICAgICAgICAgICdsZXR0ZXItc3BhY2luZycsXG4gICAgICAgICAgICAgICAgbGV0dGVyU3R5bGUsXG4gICAgICAgICAgICAgICAgZm9udFNpemUsXG4gICAgICAgICAgICAgICAgTUlOX0xFVFRFUl9TUEFDSU5HX1JBVElPXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHJlc3VsdCA/IFJ1bGVQYXNzKFwicGFzc1wiKSA6IFJ1bGVGYWlsKCdmYWlsX2xldHRlcl9zcGFjaW5nX3N0eWxlJykpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgbGluZS1oZWlnaHQgKG9ubHkgaWYgbm8gc2Nyb2xsYWJsZSBhbmNlc3RvcilcbiAgICAgICAgbGV0IGxpbmVTdHlsZSA9IHN0eWxlc1snbGluZS1oZWlnaHQnXTtcbiAgICAgICAgY29uc3Qgb3ZlcmZsb3dTdHlsZXMgPSB7XG4gICAgICAgICAgICBcIm92ZXJmbG93XCI6IFsnYXV0bycsICdzY3JvbGwnXSxcbiAgICAgICAgICAgIFwib3ZlcmZsb3cteFwiOiBbJ2F1dG8nLCAnc2Nyb2xsJ10sXG4gICAgICAgICAgICBcIm92ZXJmbG93LXlcIjogWydhdXRvJywgJ3Njcm9sbCddXG4gICAgICAgIH07XG4gICAgICAgIGlmIChsaW5lU3R5bGUgJiYgQ1NTVXRpbC5nZXRBbmNlc3RvcldpdGhTdHlsZXMocnVsZUNvbnRleHQsIG92ZXJmbG93U3R5bGVzKSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgbGluZVN0eWxlID0gcmVzb2x2ZUluaGVyaXRlZFN0eWxlKHJ1bGVDb250ZXh0LCAnbGluZS1oZWlnaHQnLCBsaW5lU3R5bGUpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gY2hlY2tTcGFjaW5nUHJvcGVydHkoXG4gICAgICAgICAgICAgICAgcnVsZUNvbnRleHQsXG4gICAgICAgICAgICAgICAgJ2xpbmUtaGVpZ2h0JyxcbiAgICAgICAgICAgICAgICBsaW5lU3R5bGUsXG4gICAgICAgICAgICAgICAgZm9udFNpemUsXG4gICAgICAgICAgICAgICAgTUlOX0xJTkVfSEVJR0hUX1JBVElPLFxuICAgICAgICAgICAgICAgIHRydWUgLy8gQWxsb3cgdW5pdGxlc3MgdmFsdWVzIGZvciBsaW5lLWhlaWdodFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaChyZXN1bHQgPyBSdWxlUGFzcyhcInBhc3NcIikgOiBSdWxlRmFpbCgnZmFpbF9saW5lX2hlaWdodF9zdHlsZScpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHRzLmxlbmd0aCA+IDAgPyByZXN1bHRzIDogbnVsbDtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gIENvcHlyaWdodDo6IDIwMjItIElCTSwgSW5jXG4gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUnVsZSwgUnVsZVJlc3VsdCwgUnVsZUNvbnRleHQsIFJ1bGVQb3RlbnRpYWwsIFJ1bGVQYXNzLCBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IGVSdWxlUG9saWN5LCBlVG9vbGtpdExldmVsIH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcblxuZXhwb3J0IGNvbnN0IHRleHRfd2hpdGVzcGFjZV92YWxpZDogUnVsZSA9IHtcbiAgICBpZDogXCJ0ZXh0X3doaXRlc3BhY2VfdmFsaWRcIixcbiAgICBjb250ZXh0OiBcImRvbToqXCIsXG4gICAgaGVscDoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcInRleHRfd2hpdGVzcGFjZV92YWxpZC5odG1sXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF90ZXh0XCI6IFwidGV4dF93aGl0ZXNwYWNlX3ZhbGlkLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJ0ZXh0X3doaXRlc3BhY2VfdmFsaWQuaHRtbFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIG1lc3NhZ2VzOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwiUnVsZSBQYXNzZWRcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX3RleHRcIjogXCJTcGFjZSBjaGFyYWN0ZXJzIHNob3VsZCBub3QgYmUgdXNlZCB0byBjcmVhdGUgc3BhY2UgYmV0d2VlbiB0aGUgbGV0dGVycyBvZiBhIHdvcmRcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJTcGFjZSBjaGFyYWN0ZXJzIHNob3VsZCBub3QgYmUgdXNlZCB0byBjb250cm9sIHNwYWNpbmcgd2l0aGluIGEgd29yZFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMS4zLjJcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX1RIUkVFXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBFbGVtZW50O1xuXG4gICAgICAgIC8vIERvbid0IHRyaWdnZXIgaWYgd2UncmUgbm90IGluIHRoZSBib2R5IG9yIGlmIHdlJ3JlIGluIGEgc2NyaXB0XG4gICAgICAgIGxldCBjaGVja0FuY2VzdG9yID0gQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihydWxlQ29udGV4dCwgW1wiYm9keVwiLCBcInNjcmlwdFwiLCBcImNvZGVcIl0pO1xuICAgICAgICBpZiAoY2hlY2tBbmNlc3RvciA9PSBudWxsIHx8IGNoZWNrQW5jZXN0b3Iubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPSBcImJvZHlcIilcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgXG4gICAgICAgIGxldCBwYXNzZWQgPSB0cnVlO1xuICAgICAgICBsZXQgd2Fsa05vZGUgPSBydWxlQ29udGV4dC5maXJzdENoaWxkIGFzIE5vZGU7XG4gICAgICAgIHdoaWxlIChwYXNzZWQgJiYgd2Fsa05vZGUpIHtcbiAgICAgICAgICAgIC8vIENvbXBseSB0byB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgc2V0dGluZyB3aWxsIGJlIGRvbmUgYnkgZGVmYXVsdCBhcyB0aGlzIHJ1bGUgdHJpZ2dlcnMgb24gZWFjaCBlbGVtZW50XG4gICAgICAgICAgICAvLyBhbmQgZm9yIGVhY2ggZWxlbWVudCBpdCBvbmx5IGNoZWNrcyB0aGF0IHNpbmdsZSBlbGVtZW50cyB0ZXh0IG5vZGVzIGFuZCBub3RoaW5nIGVsc2UuIFNvIGFsbCBpbm5lciBlbGVtZW50cyB3aWxsIGJlXG4gICAgICAgICAgICAvLyBjb3ZlcmVkIG9uIHRoZWlyIG93bi4gQ3VycmVudGx5IGZvciB0aGlzIHJ1bGUgYnkgZGVmYXVsdCBDaGVjayBIaWRkZW4gQ29udGVudCB3aWxsIHdvcmssIGFzIHdlIGFyZSBkb2luZ1xuICAgICAgICAgICAgLy8gYSBub2RlIHdhbGsgb25seSBvbiBzaWJsaW5ncyBzbyBpdCB3b3VsZCBub3QgZ2V0IHRleHQgbm9kZXMgZnJvbSBvdGhlciBzaWJsaW5ncyBhdCBhbGwuXG4gICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSBpbiB0aGUgZnV0dXJlIHNvbWV0aGluZyBjaG5nZXMsIGp1c3QgbmVlZCB0byBhZGQgJiYgIVJQVFV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbih3YWxrTm9kZSkgdG8gdGhlIGJlbG93XG4gICAgICAgICAgICAvLyBpZi5cbiAgICAgICAgICAgIGlmICh3YWxrTm9kZS5ub2RlTmFtZSA9PSBcIiN0ZXh0XCIpIHtcbiAgICAgICAgICAgICAgICBsZXQgdHh0VmFsID0gd2Fsa05vZGUubm9kZVZhbHVlO1xuICAgICAgICAgICAgICAgIHBhc3NlZCA9ICEoLyhefFxccylbYS16QS1aXSBbYS16QS1aXSBbYS16QS1aXSgkfFxccykvLnRlc3QodHh0VmFsKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3YWxrTm9kZSA9IHdhbGtOb2RlLm5leHRTaWJsaW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHBhc3NlZCkgcmV0dXJuIFJ1bGVQYXNzKFwicGFzc1wiKTtcbiAgICAgICAgcmV0dXJuIFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfdGV4dFwiKTtcblxuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgQVJJQU1hcHBlciB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFNYXBwZXJcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG5leHBvcnQgY29uc3Qgd2lkZ2V0X3RhYmJhYmxlX2V4aXN0czogUnVsZSA9IHtcbiAgICBpZDogXCJ3aWRnZXRfdGFiYmFibGVfZXhpc3RzXCIsXG4gICAgY29udGV4dDogXCJhcmlhOmJ1dHRvbixhcmlhOmxpbmssYXJpYTpzcGluYnV0dG9uLGFyaWE6dGFibGlzdCxhcmlhOmNvbWJvYm94LGFyaWE6bGlzdGJveCxhcmlhOm1lbnUsYXJpYTpyYWRpb2dyb3VwLGFyaWE6dHJlZSxhcmlhOm1lbnViYXIsIGFyaWE6Z3JpZCwgYXJpYTp0cmVlZ3JpZCwgYXJpYTpjaGVja2JveCxhcmlhOnNsaWRlcixhcmlhOnNwaW5idXR0b24sYXJpYTp0ZXh0Ym94LGFyaWE6c2Nyb2xsYmFyLGFyaWE6c2xpZGVyLGFyaWE6c3BpbmJ1dHRvblwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiSUJNQV9Gb2N1c19UYWJiYWJsZVwiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcImZhaWxfbm9fdGFiYmFibGVcIjogXCJmYWlsX25vX3RhYmJhYmxlXCJ9XG4gICAgfSxcbiAgICBoZWxwOiB7XG4gICAgICAgIFwiZW4tVVNcIjoge1xuICAgICAgICAgICAgXCJwYXNzXCI6IFwid2lkZ2V0X3RhYmJhYmxlX2V4aXN0cy5odG1sXCIsXG4gICAgICAgICAgICBcImZhaWxfbm9fdGFiYmFibGVcIjogXCJ3aWRnZXRfdGFiYmFibGVfZXhpc3RzLmh0bWxcIixcbiAgICAgICAgICAgIFwiZ3JvdXBcIjogXCJ3aWRnZXRfdGFiYmFibGVfZXhpc3RzLmh0bWxcIlxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXNzYWdlczoge1xuICAgICAgICBcImVuLVVTXCI6IHtcbiAgICAgICAgICAgIFwicGFzc1wiOiBcIlJ1bGUgUGFzc2VkXCIsXG4gICAgICAgICAgICBcImZhaWxfbm9fdGFiYmFibGVcIjogXCJDb21wb25lbnQgd2l0aCBcXFwiezB9XFxcIiByb2xlIGRvZXMgbm90IGhhdmUgYSB0YWJiYWJsZSBlbGVtZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQ29tcG9uZW50IG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgdGFiYmFibGUgZWxlbWVudFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi4xLjFcIl0sXG4gICAgICAgIFwibGV2ZWxcIjogZVJ1bGVQb2xpY3kuVklPTEFUSU9OLFxuICAgICAgICBcInRvb2xraXRMZXZlbFwiOiBlVG9vbGtpdExldmVsLkxFVkVMX09ORVxuICAgIH1dLFxuICAgIGFjdDogW10sXG4gICAgcnVuOiAoY29udGV4dDogUnVsZUNvbnRleHQsIG9wdGlvbnM/OiB7fSwgY29udGV4dEhpZXJhcmNoaWVzPzogUnVsZUNvbnRleHRIaWVyYXJjaHkpOiBSdWxlUmVzdWx0IHwgUnVsZVJlc3VsdFtdID0+IHtcbiAgICAgICAgY29uc3QgcnVsZUNvbnRleHQgPSBjb250ZXh0W1wiZG9tXCJdLm5vZGUgYXMgSFRNTEVsZW1lbnQ7XG5cbiAgICAgICAgLy9za2lwIHRoZSBjaGVjayBpZiB0aGUgZWxlbWVudCBpcyBoaWRkZW4gb3IgZGlzYWJsZWRcbiAgICAgICAgaWYgKFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHJ1bGVDb250ZXh0KSB8fCBDb21tb25VdGlsLmlzTm9kZURpc2FibGVkKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgc2hvdWxkIGJlIGEgcHJlc2VudGF0aW9uYWwgY2hpbGQgb2YgYW4gZWxlbWVudFxuICAgICAgICBpZiAoQXJpYVV0aWwuc2hvdWxkQmVQcmVzZW50YXRpb25hbENoaWxkKHJ1bGVDb250ZXh0KSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgXG4gICAgICAgIGxldCBub2RlTmFtZSA9IHJ1bGVDb250ZXh0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIC8vaWdub3JlIGRhdGFsaXN0IGVsZW1lbnQgY2hlY2sgc2luY2UgaXQgd2lsbCBiZSBwYXJ0IG9mIGEgaW5wdXQgZWxlbWVudCBvciBoaWRkZW4gYnkgZGVmYXVsdFxuICAgICAgICBpZiAobm9kZU5hbWUgPT09ICdkYXRhbGlzdCcpXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIFxuICAgICAgICAvLyBDb21wb3NpdGUgdXNlciBpbnRlcmZhY2Ugd2lkZ2V0IHJvbGVzLiBUaGV5IGFjdCBhcyBjb250YWluZXJzIHRoYXQgbWFuYWdlIG90aGVyLCBjb250YWluZWQgd2lkZ2V0cy5cbiAgICAgICAgbGV0IHJvbGVDb250YWluZXJzID0gW1wiY29tYm9ib3hcIiwgXCJncmlkXCIsIFwibGlzdGJveFwiLCBcIm1lbnVcIiwgXCJtZW51YmFyXCIsIFwicmFkaW9ncm91cFwiLCBcInRhYmxpc3RcIiwgXCJ0cmVlXCIsIFwidHJlZWdyaWRcIl07XG4gICAgICAgIGZvciAoY29uc3Qgcm9sZSBvZiByb2xlQ29udGFpbmVycykge1xuICAgICAgICAgICAgaWYgKEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUocnVsZUNvbnRleHQsIHJvbGUsIHRydWUpICE9IG51bGwpIFxuICAgICAgICAgICAgICAgIC8vIGl0J3MgYSBkZXNjZW5kYW50IG9mIGEgY29tcG9zaXRlIHdpZGdldCBhbHJlYWR5IGV4YW1pbmVkXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0gICAgXG4gICAgICAgIGxldCByb2xlID0gQVJJQU1hcHBlci5ub2RlVG9Sb2xlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgbGV0IGNvdW50ID0gMDtcbiAgICAgICAgaWYgKENvbW1vblV0aWwuaXNUYWJiYWJsZShydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgICsrY291bnQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgbm9kZSBoYXMgY2hpbGRyZW4sIGxvb2sgZm9yIHRhYiBzdG9wcyBpbiB0aGUgY2hpbGRyZW5cbiAgICAgICAgLy8gc2tpcCB0aGUgY291bnQgaWYgdGhlIGVsZW1lbnQgcmVxdWlyZXMgcHJlc2VudGF0aW9uYWwgY2hpbGRyZW4gb25seVxuICAgICAgICBpZiAoY291bnQgPCAxICYmICFBcmlhVXRpbC5jb250YWluc1ByZXNlbnRhdGlvbmFsQ2hpbGRyZW5Pbmx5KHJ1bGVDb250ZXh0KSAmJiBydWxlQ29udGV4dC5maXJzdENoaWxkKSB7XG4gICAgICAgICAgICBsZXQgbncgPSBuZXcgRE9NV2Fsa2VyKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgIHdoaWxlIChjb3VudCA8IDEgJiYgbncubmV4dE5vZGUoKSAmJiBudy5ub2RlICE9IHJ1bGVDb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgaWYgKG53Lm5vZGUubm9kZVR5cGUgPT0gMSAmJiAhbncuYkVuZFRhZyAmJiBDb21tb25VdGlsLmlzVGFiYmFibGUobncubm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgKytjb3VudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHBhc3NlZCA9IGNvdW50ID49IDE7XG4gICAgICAgIHJldHVybiBwYXNzZWQgPyBSdWxlUGFzcyhcInBhc3NcIikgOiBSdWxlUG90ZW50aWFsKFwiZmFpbF9ub190YWJiYWJsZVwiLCBbcm9sZV0pO1xuICAgIH1cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBSdWxlLCBSdWxlUmVzdWx0LCBSdWxlQ29udGV4dCwgUnVsZVBvdGVudGlhbCwgUnVsZVBhc3MsIFJ1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuaW1wb3J0IHsgZVJ1bGVQb2xpY3ksIGVUb29sa2l0TGV2ZWwgfSBmcm9tIFwiLi4vYXBpL0lSdWxlXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IEFSSUFNYXBwZXIgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBTWFwcGVyXCI7XG5cbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuLi91dGlsL1Zpc1V0aWxcIjtcblxuZXhwb3J0IGNvbnN0IHdpZGdldF90YWJiYWJsZV9zaW5nbGU6IFJ1bGUgPSB7XG4gICAgaWQ6IFwid2lkZ2V0X3RhYmJhYmxlX3NpbmdsZVwiLFxuICAgIGNvbnRleHQ6IFwiYXJpYTpidXR0b24sYXJpYTpsaW5rLGFyaWE6bWVudWl0ZW0sYXJpYTpzcGluYnV0dG9uLGFyaWE6dGFibGlzdCxhcmlhOmNvbWJvYm94LGFyaWE6bGlzdGJveCxhcmlhOm1lbnUsYXJpYTpyYWRpb2dyb3VwLGFyaWE6dHJlZSxhcmlhOmNoZWNrYm94LGFyaWE6b3B0aW9uLGFyaWE6cmFkaW8sYXJpYTpzbGlkZXIsYXJpYTpzcGluYnV0dG9uLGFyaWE6dGV4dGJveCxhcmlhOmNvbHVtbmhlYWRlcixhcmlhOnJvd2hlYWRlcixhcmlhOnNsaWRlcixhcmlhOnRhYlwiLFxuICAgIHJlZmFjdG9yOiB7XG4gICAgICAgIFwiSUJNQV9Gb2N1c19NdWx0aVRhYlwiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJwYXNzXCIsXG4gICAgICAgICAgICBcInBvdGVudGlhbF9tdWx0aXBsZV90YWJiYWJsZVwiOiBcInBvdGVudGlhbF9tdWx0aXBsZV90YWJiYWJsZVwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGhlbHA6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJ3aWRnZXRfdGFiYmFibGVfc2luZ2xlLmh0bWxcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX211bHRpcGxlX3RhYmJhYmxlXCI6IFwid2lkZ2V0X3RhYmJhYmxlX3NpbmdsZS5odG1sXCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwid2lkZ2V0X3RhYmJhYmxlX3NpbmdsZS5odG1sXCJcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWVzc2FnZXM6IHtcbiAgICAgICAgXCJlbi1VU1wiOiB7XG4gICAgICAgICAgICBcInBhc3NcIjogXCJDb21wb25lbnRzIHdpdGggYSB3aWRnZXQgcm9sZSBzaG91bGQgaGF2ZSBubyBtb3JlIHRoYW4gb25lIHRhYmJhYmxlIGVsZW1lbnRcIixcbiAgICAgICAgICAgIFwicG90ZW50aWFsX211bHRpcGxlX3RhYmJhYmxlXCI6IFwiQ29tcG9uZW50IHdpdGggXFxcInswfVxcXCIgcm9sZSBoYXMgbW9yZSB0aGFuIG9uZSB0YWJiYWJsZSBlbGVtZW50XCIsXG4gICAgICAgICAgICBcImdyb3VwXCI6IFwiQ29tcG9uZW50cyB3aXRoIGEgd2lkZ2V0IHJvbGUgbXVzdCBoYXZlIG5vIG1vcmUgdGhhbiBvbmUgdGFiYmFibGUgZWxlbWVudFwiXG4gICAgICAgIH1cbiAgICB9LFxuICAgIHJ1bGVzZXRzOiBbe1xuICAgICAgICBcImlkXCI6IFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0FjY2Vzc2liaWxpdHlfbmV4dFwiLCBcIldDQUdfMl8xXCIsIFwiV0NBR18yXzBcIiwgXCJXQ0FHXzJfMlwiXSxcbiAgICAgICAgXCJudW1cIjogW1wiMi4xLjFcIiwgXCIyLjQuM1wiXSxcbiAgICAgICAgXCJsZXZlbFwiOiBlUnVsZVBvbGljeS5WSU9MQVRJT04sXG4gICAgICAgIFwidG9vbGtpdExldmVsXCI6IGVUb29sa2l0TGV2ZWwuTEVWRUxfT05FXG4gICAgfV0sXG4gICAgYWN0OiBbXSxcbiAgICBydW46IChjb250ZXh0OiBSdWxlQ29udGV4dCwgb3B0aW9ucz86IHt9LCBjb250ZXh0SGllcmFyY2hpZXM/OiBSdWxlQ29udGV4dEhpZXJhcmNoeSk6IFJ1bGVSZXN1bHQgfCBSdWxlUmVzdWx0W10gPT4ge1xuICAgICAgICBjb25zdCBydWxlQ29udGV4dCA9IGNvbnRleHRbXCJkb21cIl0ubm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAgIC8vc2tpcCB0aGUgY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIG9yIGRpc2FibGVkXG4gICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChydWxlQ29udGV4dCkgfHwgQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIFxuICAgICAgICAvL3NraXAgdGhlIGNoZWNrIGlmIHRoZSBlbGVtZW50IHNob3VsZCBiZSBhIHByZXNlbnRhdGlvbmFsIGNoaWxkIG9mIGFuIGVsZW1lbnRcbiAgICAgICAgaWYgKEFyaWFVdGlsLnNob3VsZEJlUHJlc2VudGF0aW9uYWxDaGlsZChydWxlQ29udGV4dCkpXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIFxuICAgICAgICBsZXQgcm9sZSA9IEFSSUFNYXBwZXIubm9kZVRvUm9sZShydWxlQ29udGV4dCk7XG4gICAgICAgIGxldCBjb3VudCA9IDA7XG4gICAgICAgIGlmIChDb21tb25VdGlsLmlzVGFiYmFibGUocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICArK2NvdW50O1xuICAgICAgICB9XG4gICAgICAgIC8vIElmIG5vZGUgaGFzIGNoaWxkcmVuLCBsb29rIGZvciB0YWIgc3RvcHMgaW4gdGhlIGNoaWxkcmVuXG4gICAgICAgIC8vc2tpcCB0aGUgY291bnQgaWYgdGhlIGVsZW1lbnQgcmVxdWlyZXMgcHJlc2VudGF0aW9uYWwgY2hpbGRyZW4gb25seVxuICAgICAgICBsZXQgbmFtZSA9IFtdO1xuICAgICAgICBpZiAoY291bnQgPCAyICYmICFBcmlhVXRpbC5jb250YWluc1ByZXNlbnRhdGlvbmFsQ2hpbGRyZW5Pbmx5KHJ1bGVDb250ZXh0KSAmJiBydWxlQ29udGV4dC5maXJzdENoaWxkKSB7XG4gICAgICAgICAgICBsZXQgbncgPSBuZXcgRE9NV2Fsa2VyKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgIHdoaWxlIChjb3VudCA8IDIgJiYgbncubmV4dE5vZGUoKSAmJiBudy5ub2RlICE9IHJ1bGVDb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgaWYgKG53Lm5vZGUubm9kZVR5cGUgPT0gMSAmJiAhbncuYkVuZFRhZyAmJiBDb21tb25VdGlsLmlzVGFiYmFibGUobncubm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUmFkaW8gaW5wdXRzIHdpdGggdGhlIHNhbWUgbmFtZSBuYXRpdmVseSBhcmUgb25seSBvbmUgdGFiIHN0b3BcbiAgICAgICAgICAgICAgICAgICAgLyoqaWYgKG53Lm5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2lucHV0JyAmJiAobncubm9kZSBhcyBFbGVtZW50KS5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpID09PSAncmFkaW8nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY3VyTmFtZSA9IChudy5ub2RlIGFzIEVsZW1lbnQpLmdldEF0dHJpYnV0ZShcIm5hbWVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZS5pbmNsdWRlcyhjdXJOYW1lKSkgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS5wdXNoKGN1ck5hbWUpO1xuICAgICAgICAgICAgICAgICAgICB9Ki9cbiAgICAgICAgICAgICAgICAgICAgKytjb3VudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHBhc3NlZCA9IGNvdW50IDwgMjtcbiAgICAgICAgaWYgKCFwYXNzZWQpXG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUocnVsZUNvbnRleHQsIFwid2lkZ2V0X3RhYmJhYmxlX3NpbmdsZVwiLCBcInBvdGVudGlhbF9tdWx0aXBsZV90YWJiYWJsZVwiKTtcbiAgICAgICAgcmV0dXJuIHBhc3NlZCA/IFJ1bGVQYXNzKFwicGFzc1wiKSA6IFJ1bGVQb3RlbnRpYWwoXCJwb3RlbnRpYWxfbXVsdGlwbGVfdGFiYmFibGVcIiwgW3JvbGVdKTtcbiAgICB9XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgIENvcHlyaWdodDo6IDIwMjAtIElCTSwgSW5jXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbi8vIFRoaXMgZmlsZSBjb21lcyBmcm9tIGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9hY3QtcnVsZXMvYWN0LXRvb2xzL21haW4vc3JjL2RhdGEvc2MtdXJscy5qc29uXG5pbXBvcnQgKiBhcyBTQ1VSTHMgZnJvbSBcIi4vc2MtdXJscy5qc29uXCJcbmltcG9ydCB7IEd1aWRlbGluZSwgZUd1aWRlbGluZUNhdGVnb3J5LCBlR3VpZGVsaW5lVHlwZSB9IGZyb20gXCIuL2FwaS9JR3VpZGVsaW5lXCI7XG5jb25zdCBTQ3MgPSBbXTtcbmZvciAoY29uc3Qga2V5IGluIFNDVVJMcykge1xuICAgIFNDcy5wdXNoKFNDVVJMc1trZXldKTtcbn1cblxuY29uc3Qgc3VtbWFyaWVzID0ge1xuICAgIFwiMS4xLjFcIjogXCJBbGwgbm9uLXRleHQgY29udGVudCB0aGF0IGlzIHByZXNlbnRlZCB0byB0aGUgdXNlciBoYXMgYSB0ZXh0IGFsdGVybmF0aXZlIHRoYXQgc2VydmVzIHRoZSBlcXVpdmFsZW50IHB1cnBvc2UuXCIsXG4gICAgXCIxLjIuMVwiOiBcIkZvciBwcmVyZWNvcmRlZCBhdWRpby1vbmx5IG9yIHZpZGVvLW9ubHkgbWVkaWEsIGFuIGFsdGVybmF0aXZlIHByb3ZpZGVzIGVxdWl2YWxlbnQgaW5mb3JtYXRpb24uXCIsXG4gICAgXCIxLjIuMlwiOiBcIkNhcHRpb25zIGFyZSBwcm92aWRlZCBmb3IgYWxsIHByZXJlY29yZGVkIGF1ZGlvIGNvbnRlbnQgaW4gc3luY2hyb25pemVkIG1lZGlhLlwiLFxuICAgIFwiMS4yLjNcIjogXCJBbiBhbHRlcm5hdGl2ZSBmb3IgdGltZS1iYXNlZCBtZWRpYSBvciBhdWRpbyBkZXNjcmlwdGlvbiBvZiB0aGUgcHJlcmVjb3JkZWQgdmlkZW8gY29udGVudCBpcyBwcm92aWRlZCBmb3Igc3luY2hyb25pemVkIG1lZGlhLlwiLFxuICAgIFwiMS4yLjRcIjogXCJDYXB0aW9ucyBhcmUgcHJvdmlkZWQgZm9yIGFsbCBsaXZlIGF1ZGlvIGNvbnRlbnQgaW4gc3luY2hyb25pemVkIG1lZGlhLlwiLFxuICAgIFwiMS4yLjVcIjogXCJBdWRpbyBkZXNjcmlwdGlvbiBpcyBwcm92aWRlZCBmb3IgYWxsIHByZXJlY29yZGVkIHZpZGVvIGNvbnRlbnQgaW4gc3luY2hyb25pemVkIG1lZGlhLlwiLFxuICAgIFwiMS4zLjFcIjogXCJJbmZvcm1hdGlvbiwgc3RydWN0dXJlLCBhbmQgcmVsYXRpb25zaGlwcyBjb252ZXllZCB0aHJvdWdoIHByZXNlbnRhdGlvbiBjYW4gYmUgcHJvZ3JhbW1hdGljYWxseSBkZXRlcm1pbmVkIG9yIGFyZSBhdmFpbGFibGUgaW4gdGV4dC5cIixcbiAgICBcIjEuMy4yXCI6IFwiV2hlbiB0aGUgc2VxdWVuY2UgaW4gd2hpY2ggY29udGVudCBpcyBwcmVzZW50ZWQgYWZmZWN0cyBpdHMgbWVhbmluZywgYSBjb3JyZWN0IHJlYWRpbmcgc2VxdWVuY2UgY2FuIGJlIHByb2dyYW1tYXRpY2FsbHkgZGV0ZXJtaW5lZC5cIixcbiAgICBcIjEuMy4zXCI6IFwiSW5zdHJ1Y3Rpb25zIHByb3ZpZGVkIGZvciB1bmRlcnN0YW5kaW5nIGFuZCBvcGVyYXRpbmcgY29udGVudCBkbyBub3QgcmVseSBzb2xlbHkgb24gc2Vuc29yeSBjaGFyYWN0ZXJpc3RpY3Mgb2YgY29tcG9uZW50cyBzdWNoIGFzIHNoYXBlLCBzaXplLCB2aXN1YWwgbG9jYXRpb24sIG9yaWVudGF0aW9uLCBvciBzb3VuZC5cIixcbiAgICBcIjEuMy40XCI6IFwiQ29udGVudCBkb2VzIG5vdCByZXN0cmljdCBpdHMgdmlldyBhbmQgb3BlcmF0aW9uIHRvIGEgc2luZ2xlIGRpc3BsYXkgb3JpZW50YXRpb24sIHN1Y2ggYXMgcG9ydHJhaXQgb3IgbGFuZHNjYXBlLlwiLFxuICAgIFwiMS4zLjVcIjogXCJUaGUgcHVycG9zZSBvZiBlYWNoIGlucHV0IGZpZWxkIHRoYXQgY29sbGVjdHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHVzZXIgY2FuIGJlIHByb2dyYW1tYXRpY2FsbHkgZGV0ZXJtaW5lZCB3aGVuIHRoZSBmaWVsZCBzZXJ2ZXMgYSBjb21tb24gcHVycG9zZS5cIixcbiAgICBcIjEuNC4xXCI6IFwiQ29sb3IgaXMgbm90IHVzZWQgYXMgdGhlIG9ubHkgdmlzdWFsIG1lYW5zIG9mIGNvbnZleWluZyBpbmZvcm1hdGlvbiwgaW5kaWNhdGluZyBhbiBhY3Rpb24sIHByb21wdGluZyBhIHJlc3BvbnNlLCBvciBkaXN0aW5ndWlzaGluZyBhIHZpc3VhbCBlbGVtZW50LlwiLFxuICAgIFwiMS40LjJcIjogXCJJZiBhbnkgYXVkaW8gcGxheXMgYXV0b21hdGljYWxseSBmb3IgbW9yZSB0aGFuIDMgc2Vjb25kcywgZWl0aGVyIGEgbWVjaGFuaXNtIGlzIGF2YWlsYWJsZSB0byBwYXVzZSBvciBzdG9wIHRoZSBhdWRpbywgb3IgYSBtZWNoYW5pc20gaXMgYXZhaWxhYmxlIHRvIGNvbnRyb2wgYXVkaW8gdm9sdW1lIGluZGVwZW5kZW50bHkgZnJvbSB0aGUgb3ZlcmFsbCBzeXN0ZW0gdm9sdW1lIGxldmVsLlwiLFxuICAgIFwiMS40LjNcIjogXCJUaGUgdmlzdWFsIHByZXNlbnRhdGlvbiBvZiB0ZXh0IGFuZCBpbWFnZXMgb2YgdGV4dCBoYXMgYSBjb250cmFzdCByYXRpbyBvZiBhdCBsZWFzdCA0LjU6MSwgd2l0aCBhIDM6MSByYXRpbyBmb3IgbGFyZ2Utc2NhbGUgdGV4dC5cIixcbiAgICBcIjEuNC40XCI6IFwiVGV4dCBjYW4gYmUgcmVzaXplZCB3aXRob3V0IGFzc2lzdGl2ZSB0ZWNobm9sb2d5IHVwIHRvIDIwMCBwZXJjZW50IHdpdGhvdXQgbG9zcyBvZiBjb250ZW50IG9yIGZ1bmN0aW9uYWxpdHkuXCIsXG4gICAgXCIxLjQuNVwiOiBcIklmIHRoZSB0ZWNobm9sb2dpZXMgYmVpbmcgdXNlZCBjYW4gYWNoaWV2ZSB0aGUgdmlzdWFsIHByZXNlbnRhdGlvbiwgdGV4dCBzaG91bGQgbm90IGJlIHVzZWQgdG8gY29udmV5IGluZm9ybWF0aW9uIHJhdGhlciB0aGFuIGltYWdlcyBvZiB0ZXh0LlwiLFxuICAgIFwiMS40LjEwXCI6IFwiQ29udGVudCBjYW4gcmVmbG93IHdpdGhvdXQgbG9zcyBvZiBpbmZvcm1hdGlvbiBvciBmdW5jdGlvbmFsaXR5LCBhbmQgd2l0aG91dCByZXF1aXJpbmcgc2Nyb2xsaW5nIGluIHR3byBkaW1lbnNpb25zLlwiLFxuICAgIFwiMS40LjExXCI6IFwiVGhlIHBhcnRzIG9mIGdyYXBoaWNhbCBvYmplY3RzIHJlcXVpcmVkIHRvIHVuZGVyc3RhbmQgdGhlIGNvbnRlbnQsIGFuZCB0aGUgdmlzdWFsIGluZm9ybWF0aW9uIHJlcXVpcmVkIHRvIGlkZW50aWZ5IFVJIGNvbXBvbmVudHMgYW5kIHN0YXRlcywgaGF2ZSBhIGNvbnRyYXN0IHJhdGlvIG9mIGF0IGxlYXN0IDM6MSBhZ2FpbnN0IGFkamFjZW50IGNvbG9ycy5cIixcbiAgICBcIjEuNC4xMlwiOiBcIk5vIGxvc3Mgb2YgY29udGVudCBvciBmdW5jdGlvbmFsaXR5IG9jY3VycyB3aGVuIHVzZXJzIGNoYW5nZSBsZXR0ZXIsIHdvcmQgYW5kIHBhcmFncmFwaCBzcGFjaW5nLCBhcyB3ZWxsIGFzIGxpbmUgaGVpZ2h0LlwiLFxuICAgIFwiMS40LjEzXCI6IFwiV2hlcmUgaG92ZXIgb3IgZm9jdXMgYWN0aW9ucyBjYXVzZSBhZGRpdGlvbmFsIGNvbnRlbnQgdG8gYmVjb21lIHZpc2libGUgYW5kIGhpZGRlbiwgdGhlIGFkZGl0aW9uYWwgY29udGVudCBpcyBkaXNtaXNzYWJsZSwgaG92ZXJhYmxlIGFuZCBwZXJzaXN0ZW50LlwiLFxuICAgIFwiMi4xLjFcIjogXCJBbGwgZnVuY3Rpb25hbGl0eSBvZiB0aGUgY29udGVudCBpcyBvcGVyYWJsZSB0aHJvdWdoIGEga2V5Ym9hcmQgaW50ZXJmYWNlIHdpdGhvdXQgcmVxdWlyaW5nIHNwZWNpZmljIHRpbWluZ3MgZm9yIGluZGl2aWR1YWwga2V5c3Ryb2tlcy5cIixcbiAgICBcIjIuMS4yXCI6IFwiSWYga2V5Ym9hcmQgZm9jdXMgY2FuIGJlIG1vdmVkIHRvIGEgY29tcG9uZW50IHVzaW5nIGEga2V5Ym9hcmQgaW50ZXJmYWNlLCB0aGVuIGZvY3VzIGNhbiBiZSBtb3ZlZCBhd2F5IGZyb20gdGhhdCBjb21wb25lbnQgdXNpbmcgb25seSBhIGtleWJvYXJkIGludGVyZmFjZSwgYW5kLCBpZiBpdCByZXF1aXJlcyBtb3JlIHRoYW4gdW5tb2RpZmllZCBhcnJvdyBvciB0YWIga2V5cyBvciBvdGhlciBzdGFuZGFyZCBleGl0IG1ldGhvZHMsIHRoZSB1c2VyIGlzIGFkdmlzZWQgb2YgdGhlIG1ldGhvZCBmb3IgbW92aW5nIGZvY3VzIGF3YXkuXCIsXG4gICAgXCIyLjEuNFwiOiBcIklmIGEga2V5Ym9hcmQgc2hvcnRjdXQgaXMgaW1wbGVtZW50ZWQgdXNpbmcgb25seSBsZXR0ZXIsIHB1bmN0dWF0aW9uLCBudW1iZXIgb3Igc3ltYm9sIGNoYXJhY3RlcnMsIHRoZW4gdGhlIHNob3J0Y3V0IGNhbiBiZSB0dXJuZWQgb2ZmLCByZW1hcHBlZCBvciBhY3RpdmF0ZWQgb25seSBvbiBmb2N1cy5cIixcbiAgICBcIjIuMi4xXCI6IFwiRm9yIGVhY2ggdGltZSBsaW1pdCB0aGF0IGlzIHNldCBieSB0aGUgY29udGVudCwgdGhlIHVzZXIgY2FuIHR1cm4gb2ZmLCBhZGp1c3QsIG9yIGV4dGVuZCB0aGUgbGltaXQuXCIsXG4gICAgXCIyLjIuMlwiOiBcIkZvciBtb3ZpbmcsIGJsaW5raW5nLCBzY3JvbGxpbmcsIG9yIGF1dG8tdXBkYXRpbmcgaW5mb3JtYXRpb24sIHRoZSB1c2VyIGNhbiBwYXVzZSwgc3RvcCwgaGlkZSBvciBhZGp1c3QgdGhlIGluZm9ybWF0aW9uLlwiLFxuICAgIFwiMi4zLjFcIjogXCJDb250ZW50IGRvZXMgbm90IGNvbnRhaW4gYW55dGhpbmcgdGhhdCBmbGFzaGVzIG1vcmUgdGhhbiB0aHJlZSB0aW1lcyBpbiBhbnkgb25lIHNlY29uZCBwZXJpb2QsIG9yIHRoZSBmbGFzaCBpcyBiZWxvdyB0aGUgZ2VuZXJhbCBmbGFzaCBhbmQgcmVkIGZsYXNoIHRocmVzaG9sZHMuXCIsXG4gICAgXCIyLjQuMVwiOiBcIkEgbWVjaGFuaXNtIGlzIGF2YWlsYWJsZSB0byBieXBhc3MgYmxvY2tzIG9mIGNvbnRlbnQgdGhhdCBhcmUgcmVwZWF0ZWQgb24gbXVsdGlwbGUgV2ViIHBhZ2VzLlwiLFxuICAgIFwiMi40LjJcIjogXCJXZWIgcGFnZXMsIG5vbi13ZWIgZG9jdW1lbnRzLCBhbmQgc29mdHdhcmUgaGF2ZSB0aXRsZXMgdGhhdCBkZXNjcmliZSB0b3BpYyBvciBwdXJwb3NlLlwiLFxuICAgIFwiMi40LjNcIjogXCJJZiBjb250ZW50IGNhbiBiZSBuYXZpZ2F0ZWQgc2VxdWVudGlhbGx5IGFuZCB0aGUgbmF2aWdhdGlvbiBzZXF1ZW5jZXMgYWZmZWN0IG1lYW5pbmcgb3Igb3BlcmF0aW9uLCBmb2N1c2FibGUgY29tcG9uZW50cyByZWNlaXZlIGZvY3VzIGluIGFuIG9yZGVyIHRoYXQgcHJlc2VydmVzIG1lYW5pbmcgYW5kIG9wZXJhYmlsaXR5LlwiLFxuICAgIFwiMi40LjRcIjogXCJUaGUgcHVycG9zZSBvZiBlYWNoIGxpbmsgY2FuIGJlIGRldGVybWluZWQgZnJvbSB0aGUgbGluayB0ZXh0IGFsb25lIG9yIGZyb20gdGhlIGxpbmsgdGV4dCB0b2dldGhlciB3aXRoIGl0cyBwcm9ncmFtbWF0aWNhbGx5IGRldGVybWluZWQgbGluayBjb250ZW50LlwiLFxuICAgIFwiMi40LjVcIjogXCJNb3JlIHRoYW4gb25lIHdheSBpcyBhdmFpbGFibGUgdG8gbG9jYXRlIGEgV2ViIHBhZ2Ugd2l0aGluIGEgc2V0IG9mIFdlYiBwYWdlcywgZXhjZXB0IHdoZXJlIHRoZSBXZWIgUGFnZSBpcyB0aGUgcmVzdWx0IG9mLCBvciBhIHN0ZXAgaW4sIGEgcHJvY2Vzcy5cIixcbiAgICBcIjIuNC42XCI6IFwiSGVhZGluZ3MgYW5kIGxhYmVscyBkZXNjcmliZSB0b3BpYyBvciBwdXJwb3NlLlwiLFxuICAgIFwiMi40LjdcIjogXCJBbnkga2V5Ym9hcmQgb3BlcmFibGUgdXNlciBpbnRlcmZhY2UgaGFzIGEgbW9kZSBvZiBvcGVyYXRpb24gd2hlcmUgdGhlIGtleWJvYXJkIGZvY3VzIGluZGljYXRvciBpcyB2aXNpYmxlLlwiLFxuICAgIFwiMi40LjExXCI6IFwiV2hlbiBhbiBlbGVtZW50IHJlY2VpdmVzIGZvY3VzLCBpdCBpcyBub3QgZW50aXJlbHkgY292ZXJlZCBieSBvdGhlciBjb250ZW50LlwiLFxuICAgIFwiMi41LjFcIjogXCJBbGwgZnVuY3Rpb25hbGl0eSB0aGF0IHVzZXMgbXVsdGlwb2ludCBvciBwYXRoLWJhc2VkIGdlc3R1cmVzIGZvciBvcGVyYXRpb24gY2FuIGJlIG9wZXJhdGVkIHdpdGggYSBzaW5nbGUgcG9pbnRlciB3aXRob3V0IGEgcGF0aC1iYXNlZCBnZXN0dXJlLlwiLFxuICAgIFwiMi41LjJcIjogXCJGb3IgZnVuY3Rpb25hbGl0eSB0aGF0IGNhbiBiZSBvcGVyYXRlZCB1c2luZyBhIHNpbmdsZSBwb2ludGVyLCBjb21wbGV0aW9uIG9mIHRoZSBmdW5jdGlvbiBpcyBvbiB0aGUgdXAtZXZlbnQgd2l0aCBhbiBhYmlsaXR5IHRvIGFib3J0LCB1bmRvIG9yIHJldmVyc2UgdGhlIG91dGNvbWUuXCIsXG4gICAgXCIyLjUuM1wiOiBcIkZvciB1c2VyIGludGVyZmFjZSBjb21wb25lbnRzIHdpdGggbGFiZWxzIHRoYXQgaW5jbHVkZSB0ZXh0IG9yIGltYWdlcyBvZiB0ZXh0LCB0aGUgYWNjZXNzaWJsZSBuYW1lIGNvbnRhaW5zIHRoZSB0ZXh0IHRoYXQgaXMgcHJlc2VudGVkIHZpc3VhbGx5LlwiLFxuICAgIFwiMi41LjRcIjogXCJGdW5jdGlvbmFsaXR5IHRoYXQgY2FuIGJlIG9wZXJhdGVkIGJ5IG1vdGlvbiBjYW4gYWxzbyBiZSBvcGVyYXRlZCBieSB1c2VyIGludGVyZmFjZSBjb21wb25lbnRzLCBhbmQgdGhlIG1vdGlvbiB0cmlnZ2VyIGNhbiBiZSBkaXNhYmxlZC5cIixcbiAgICBcIjIuNS44XCI6IFwiVGhlIHNpemUgb2YgdGhlIHRhcmdldCBmb3IgcG9pbnRlciBpbnB1dHMgaXMgYXQgbGVhc3QgMjQgYnkgMjQgQ1NTIHBpeGVscy5cIixcbiAgICBcIjIuNS43XCI6IFwiQWxsIGZ1bmN0aW9uYWxpdHkgdGhhdCB1c2VzIGEgZHJhZ2dpbmcgbW92ZW1lbnQgZm9yIG9wZXJhdGlvbiBjYW4gYmUgYWNoaWV2ZWQgYnkgYSBzaW5nbGUgcG9pbnRlciB3aXRob3V0IGRyYWdnaW5nLlwiLFxuICAgIFwiMy4xLjFcIjogXCJUaGUgZGVmYXVsdCBodW1hbiBsYW5ndWFnZSBvZiBXZWIgcGFnZXMsIG5vbi1XZWIgZG9jdW1lbnRzLCBvciBzb2Z0d2FyZSBjYW4gYmUgcHJvZ3JhbW1hdGljYWxseSBkZXRlcm1pbmVkLlwiLFxuICAgIFwiMy4xLjJcIjogXCJUaGUgaHVtYW4gbGFuZ3VhZ2Ugb2YgZWFjaCBwYXNzYWdlIG9yIHBocmFzZSBpbiB0aGUgY29udGVudCBjYW4gYmUgcHJvZ3JhbW1hdGljYWxseSBkZXRlcm1pbmVkLlwiLFxuICAgIFwiMy4yLjFcIjogXCJXaGVuIGFueSBjb21wb25lbnQgcmVjZWl2ZXMgZm9jdXMsIGl0IGRvZXMgbm90IGluaXRpYXRlIGEgY2hhbmdlIG9mIGNvbnRleHQuXCIsXG4gICAgXCIzLjIuMlwiOiBcIkNoYW5naW5nIHRoZSBzZXR0aW5nIG9mIGFueSB1c2VyIGludGVyZmFjZSBjb21wb25lbnQgZG9lcyBub3QgYXV0b21hdGljYWxseSBjYXVzZSBhIGNoYW5nZSBvZiBjb250ZXh0IHVubGVzcyB0aGUgdXNlciBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBiZWhhdmlvciBiZWZvcmUgdXNpbmcgdGhlIGNvbXBvbmVudC5cIixcbiAgICBcIjMuMi4zXCI6IFwiTmF2aWdhdGlvbmFsIG1lY2hhbmlzbXMgdGhhdCBhcmUgcmVwZWF0ZWQgb24gbXVsdGlwbGUgV2ViIHBhZ2VzIHdpdGhpbiBhIHNldCBvZiBXZWIgcGFnZXMgb2NjdXIgaW4gdGhlIHNhbWUgcmVsYXRpdmUgb3JkZXIgZWFjaCB0aW1lIHRoZXkgYXJlIHJlcGVhdGVkLCB1bmxlc3MgYSBjaGFuZ2UgaXMgaW5pdGlhdGVkIGJ5IHRoZSB1c2VyLlwiLFxuICAgIFwiMy4yLjRcIjogXCJDb21wb25lbnRzIHRoYXQgaGF2ZSB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IHdpdGhpbiBhIHNldCBvZiBXZWIgcGFnZXMgYXJlIGlkZW50aWZpZWQgY29uc2lzdGVudGx5LlwiLFxuICAgIFwiMy4yLjZcIjogXCJNYWtlIGl0IGVhc2llciB0byBmaW5kIGhlbHAgYW5kIHN1cHBvcnQuIElmIGEgV2ViIHBhZ2UgY29udGFpbnMgaGVscCBtZWNoYW5pc21zIHRoZXkgb2NjdXIgaW4gdGhlIHNhbWUgb3JkZXIgcmVsYXRpdmUgdG8gb3RoZXIgcGFnZSBjb250ZW50LCB1bmxlc3MgYSBjaGFuZ2UgaXMgaW5pdGlhdGVkIGJ5IHRoZSB1c2VyLlwiLFxuICAgIFwiMy4zLjFcIjogXCJJZiBhbiBpbnB1dCBlcnJvciBpcyBhdXRvbWF0aWNhbGx5IGRldGVjdGVkLCB0aGUgaXRlbSB0aGF0IGlzIGluIGVycm9yIGlzIGlkZW50aWZpZWQgYW5kIHRoZSBlcnJvciBpcyBkZXNjcmliZWQgdG8gdGhlIHVzZXIgaW4gdGV4dC5cIixcbiAgICBcIjMuMy4yXCI6IFwiTGFiZWxzIG9yIGluc3RydWN0aW9ucyBhcmUgcHJvdmlkZWQgd2hlbiBjb250ZW50IHJlcXVpcmVzIHVzZXIgaW5wdXQuXCIsXG4gICAgXCIzLjMuM1wiOiBcIklmIGFuIGlucHV0IGVycm9yIGlzIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgYW5kIHN1Z2dlc3Rpb25zIGZvciBjb3JyZWN0aW9uIGFyZSBrbm93biwgdGhlbiB0aGUgc3VnZ2VzdGlvbnMgYXJlIHByb3ZpZGVkIHRvIHRoZSB1c2VyLCB1bmxlc3MgaXQgd291bGQgamVvcGFyZGl6ZSB0aGUgc2VjdXJpdHkgb3IgcHVycG9zZSBvZiB0aGUgY29udGVudC5cIixcbiAgICBcIjMuMy40XCI6IFwiRm9yIGNvbnRlbnQgdGhhdCBjYXVzZSBsZWdhbCBjb21taXRtZW50cyBvciBmaW5hbmNpYWwgdHJhbnNhY3Rpb25zIGZvciB0aGUgdXNlciB0byBvY2N1ciwgdGhhdCBtb2RpZnkgb3IgZGVsZXRlIHVzZXItY29udHJvbGxhYmxlIGRhdGEgaW4gZGF0YSBzdG9yYWdlIHN5c3RlbXMsIG9yIHRoYXQgc3VibWl0IHVzZXIgdGVzdCByZXNwb25zZXMsIHRoZSB1c2VyIGNhbiByZXZlcnNlLCBjb3JyZWN0LCBvciBjb25maXJtIHRoZSBhY3Rpb24uXCIsXG4gICAgXCIzLjMuN1wiOiBcIk1ha2UgaXQgZWFzaWVyIGZvciB1c2VycyB0byBjb21wbGV0ZSBtdWx0aS1zdGVwIHByb2Nlc3Nlcy4gRG9uJ3QgYXNrIGZvciB0aGUgc2FtZSBpbmZvcm1hdGlvbiB0d2ljZSBpbiB0aGUgc2FtZSBzZXNzaW9uLlwiLFxuICAgIFwiMy4zLjhcIjogXCJNYWtlIGxvZ2lucyBwb3NzaWJsZSB3aXRoIGxlc3MgbWVudGFsIGVmZm9ydC4gRG9uJ3QgbWFrZSBwZW9wbGUgc29sdmUsIHJlY2FsbCwgb3IgdHJhbnNjcmliZSBzb21ldGhpbmcgdG8gbG9nIGluLlwiLFxuICAgIFwiNC4xLjFcIjogXCIoT2Jzb2xldGUgYW5kIHJlbW92ZWQpIFRoaXMgcmVxdWlyZW1lbnQgd2FzIG9yaWdpbmFsbHkgYWRvcHRlZCB0byBhZGRyZXNzIHByb2JsZW1zIHRoYXQgYXNzaXN0aXZlIHRlY2hub2xvZ3kgKEFUKSBoYWQgZGlyZWN0bHkgcGFyc2luZyBIVE1MLiBBVCBubyBsb25nZXIgaGFzIGFueSBuZWVkIHRvIGRpcmVjdGx5IHBhcnNlIEhUTUwuIENvbnNlcXVlbnRseSwgdGhlc2UgcHJvYmxlbXMgZWl0aGVyIG5vIGxvbmdlciBleGlzdCBvciBhcmUgYWRkcmVzc2VkIGJ5IG90aGVyIHJlcXVpcmVtZW50cy5cIiwgXG4gICAgXCI0LjEuMlwiOiBcIkZvciBhbGwgdXNlciBpbnRlcmZhY2UgY29tcG9uZW50cyAoaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG86IGZvcm0gZWxlbWVudHMsIGxpbmtzIGFuZCBjb21wb25lbnRzIGdlbmVyYXRlZCBieSBzY3JpcHRzKSwgdGhlIG5hbWUgYW5kIHJvbGUgY2FuIGJlIHByb2dyYW1tYXRpY2FsbHkgZGV0ZXJtaW5lZDsgc3RhdGVzLCBwcm9wZXJ0aWVzLCBhbmQgdmFsdWVzIHRoYXQgY2FuIGJlIHNldCBieSB0aGUgdXNlciBjYW4gYmUgcHJvZ3JhbW1hdGljYWxseSBzZXQ7IGFuZCBub3RpZmljYXRpb24gb2YgY2hhbmdlcyB0byB0aGVzZSBpdGVtcyBpcyBhdmFpbGFibGUgdG8gdXNlciBhZ2VudHMsIGluY2x1ZGluZyBhc3Npc3RpdmUgdGVjaG5vbG9naWVzLlwiLFxuICAgIFwiNC4xLjNcIjogXCJJbiBjb250ZW50IGltcGxlbWVudGVkIHVzaW5nIG1hcmt1cCBsYW5ndWFnZXMsIHN0YXR1cyBtZXNzYWdlcyBjYW4gYmUgcHJvZ3JhbW1hdGljYWxseSBkZXRlcm1pbmVkIHRocm91Z2ggcm9sZSBvciBwcm9wZXJ0aWVzIHN1Y2ggdGhhdCB0aGV5IGNhbiBiZSBwcmVzZW50ZWQgdG8gdGhlIHVzZXIgYnkgYXNzaXN0aXZlIHRlY2hub2xvZ2llcyB3aXRob3V0IHJlY2VpdmluZyBmb2N1cy5cIixcbiAgICBcIkhUTUxcIjogXCJUaGUgSFRNTCBzcGVjaWZpY2F0aW9uIGlzc3VlcyB0aGF0IGNhdXNlIGFjY2Vzc2liaWxpdHkgaXNzdWVzIG1heSBiZSBjb3ZlcmVkIGJ5IG90aGVyIHJ1bGVzIGFuZCB3aWxsIGJlIHJlcG9ydGVkIHVuZGVyIHRob3NlIGFjY2Vzc2liaWxpdHkgcmVxdWlyZW1lbnRzLiBIb3dldmVyLCBzb21lIG5vbi1jb25mb3JtaW5nIEhUTUwgc3BlY2lmaWNhdGlvbiBpc3N1ZXMgYXJlIHN0aWxsIHJlcG9ydGVkLlwiLFxuICAgIFwiQVJJQVwiOiBcIlRoZSBBUklBIHNwZWNpZmljYXRpb24gaXNzdWVzIHRoYXQgY2F1c2UgYWNjZXNzaWJpbGl0eSBpc3N1ZXMgbWF5IGJlIGNvdmVyZWQgYnkgb3RoZXIgcnVsZXMgYW5kIHdpbGwgYmUgcmVwb3J0ZWQgdW5kZXIgdGhvc2UgYWNjZXNzaWJpbGl0eSByZXF1aXJlbWVudHMuIEhvd2V2ZXIsIHNvbWUgbm9uLWNvbmZvcm1pbmcgQVJJQSBzcGVjaWZpY2F0aW9uIGlzc3VlcyBhcmUgc3RpbGwgcmVwb3J0ZWQuXCIsXG59ICAgICBcblxuZXhwb3J0IGNvbnN0IGExMXlSdWxlc2V0czogR3VpZGVsaW5lW10gPSBbXG4gICAgLy8ge1xuICAgIC8vICAgICBpZDogXCJERUJVR1wiLFxuICAgIC8vICAgICBuYW1lOiBcIkRFQlVHIFJ1bGVzXCIsXG4gICAgLy8gICAgIGNhdGVnb3J5OiBlUnVsZUNhdGVnb3J5LkFDQ0VTU0lCSUxJVFksXG4gICAgLy8gICAgIGRlc2NyaXB0aW9uOiBcIlJ1bGVzIGZvciBkZWJ1Z2dpbmdcIixcbiAgICAvLyAgICAgY2hlY2twb2ludHM6IFt7XG4gICAgLy8gICAgICAgICBudW06IFwiMVwiLFxuICAgIC8vICAgICAgICAgbmFtZTogXCJEZWJ1ZyBDUCAxXCIsXG4gICAgLy8gICAgICAgICB3Y2FnTGV2ZWw6IFwiQVwiLFxuICAgIC8vICAgICAgICAgc3VtbWFyeTogXCJSdWxlcyBmb3IgRGVidWdcIlxuICAgIC8vICAgICB9XVxuICAgIC8vIH0sXG4gICAge1xuICAgICAgICBpZDogXCJFWFRFTlNJT05TXCIsXG4gICAgICAgIG5hbWU6IFwiRXh0ZW5zaW9uIFJ1bGVzXCIsXG4gICAgICAgIGNhdGVnb3J5OiBlR3VpZGVsaW5lQ2F0ZWdvcnkuQUNDRVNTSUJJTElUWSxcbiAgICAgICAgZGVzY3JpcHRpb246IFwiUnVsZXMgZm9yIGVuYWJsaW5nIHRoZSBicm93c2VyIGV4dGVuc2lvbnNcIixcbiAgICAgICAgdHlwZTogZUd1aWRlbGluZVR5cGUuRVhURU5TSU9OLFxuICAgICAgICBjaGVja3BvaW50czogW3tcbiAgICAgICAgICAgIG51bTogXCIxXCIsXG4gICAgICAgICAgICBuYW1lOiBcIkV4dGVuc2lvbiBDUCAxXCIsXG4gICAgICAgICAgICB3Y2FnTGV2ZWw6IFwiQVwiLFxuICAgICAgICAgICAgc3VtbWFyeTogXCJSdWxlcyBmb3IgRXh0ZW5zaW9uXCJcbiAgICAgICAgfV1cbiAgICB9LFxuICAgIHtcbiAgICAgICAgaWQ6IFwiSUJNX0FjY2Vzc2liaWxpdHlcIixcbiAgICAgICAgbmFtZTogXCJJQk0gQWNjZXNzaWJpbGl0eSA3LjNcIixcbiAgICAgICAgY2F0ZWdvcnk6IGVHdWlkZWxpbmVDYXRlZ29yeS5BQ0NFU1NJQklMSVRZLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJSdWxlcyBmb3IgV0NBRyAyLjAsIDIuMSwgMi4yIEEgYW5kIEFBIHBsdXMgYWRkaXRpb25hbCBJQk0gc3VwcGxlbWVudGFsIHJlcXVpcmVtZW50cy5cIixcbiAgICAgICAgLy8gVGhpcyBydWxlc2V0IGhhcyBhbGwgMi4wIGFuZCAyLjEgY2hlY2twb2ludHMgdGhhdCBhcmUgQSBvciBBQVxuICAgICAgICBjaGVja3BvaW50czogU0NzXG4gICAgICAgICAgICAuZmlsdGVyKHNjID0+IChzYy5sZXZlbCA9PT0gXCJBXCIgfHwgc2MubGV2ZWwgPT09IFwiQUFcIiB8fCBzYy5sZXZlbCA9PT0gXCJOQVwiKSAmJiAoc2Mud2NhZ1R5cGUgPT09IFwiMi4wXCIgfHwgc2Mud2NhZ1R5cGUgPT09IFwiMi4xXCIgfHwgc2Mud2NhZ1R5cGUgPT09IFwiMi4yXCIgfHwgc2Mud2NhZ1R5cGUgPT09IFwiTkFcIikpXG4gICAgICAgICAgICAubWFwKHNjID0+ICh7XG4gICAgICAgICAgICAgICAgbnVtOiBzYy5udW0sXG4gICAgICAgICAgICAgICAgc2NJZDogc2Muc2NJZCxcbiAgICAgICAgICAgICAgICBuYW1lOiBzYy5oYW5kbGUsXG4gICAgICAgICAgICAgICAgd2NhZ0xldmVsOiBzYy5sZXZlbCxcbiAgICAgICAgICAgICAgICBzdW1tYXJ5OiBzdW1tYXJpZXNbc2MubnVtXVxuICAgICAgICAgICAgfSkpXG4gICAgfSxcbiAgICB7XG4gICAgICAgIGlkOiBcIklCTV9BY2Nlc3NpYmlsaXR5X25leHRcIixcbiAgICAgICAgbmFtZTogXCJJQk0gQWNjZXNzaWJpbGl0eSBuZXh0XCIsXG4gICAgICAgIGNhdGVnb3J5OiBlR3VpZGVsaW5lQ2F0ZWdvcnkuQUNDRVNTSUJJTElUWSxcbiAgICAgICAgZGVzY3JpcHRpb246IFwiUnVsZXMgZm9yIFdDQUcgMi4wLCAyLjEsIDIuMiBBIGFuZCBBQSBwbHVzIGFkZGl0aW9uYWwgSUJNIHN1cHBsZW1lbnRhbCByZXF1aXJlbWVudHMuXCIsXG4gICAgICAgIC8vIFRoaXMgcnVsZXNldCBoYXMgYWxsIDIuMCBhbmQgMi4xIGNoZWNrcG9pbnRzIHRoYXQgYXJlIEEgb3IgQUFcbiAgICAgICAgY2hlY2twb2ludHM6IFNDc1xuICAgICAgICAgICAgLmZpbHRlcihzYyA9PiAoc2MubGV2ZWwgPT09IFwiQVwiIHx8IHNjLmxldmVsID09PSBcIkFBXCIgfHwgc2MubGV2ZWwgPT09IFwiTkFcIikgJiYgKHNjLndjYWdUeXBlID09PSBcIjIuMFwiIHx8IHNjLndjYWdUeXBlID09PSBcIjIuMVwiIHx8IHNjLndjYWdUeXBlID09PSBcIjIuMlwiIHx8IHNjLndjYWdUeXBlID09PSBcIk5BXCIpKVxuICAgICAgICAgICAgLm1hcChzYyA9PiAoe1xuICAgICAgICAgICAgICAgIG51bTogc2MubnVtLFxuICAgICAgICAgICAgICAgIHNjSWQ6IHNjLnNjSWQsXG4gICAgICAgICAgICAgICAgbmFtZTogc2MuaGFuZGxlLFxuICAgICAgICAgICAgICAgIHdjYWdMZXZlbDogc2MubGV2ZWwsXG4gICAgICAgICAgICAgICAgc3VtbWFyeTogc3VtbWFyaWVzW3NjLm51bV1cbiAgICAgICAgICAgIH0pKVxuICAgIH0sXG4gICAge1xuICAgICAgICBpZDogXCJXQ0FHXzJfMlwiLFxuICAgICAgICBuYW1lOiBcIldDQUcgMi4yIChBLCBBQSlcIixcbiAgICAgICAgY2F0ZWdvcnk6IGVHdWlkZWxpbmVDYXRlZ29yeS5BQ0NFU1NJQklMSVRZLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJSdWxlcyBmb3IgV0NBRyAyLjIgQSAmIEFBLiBUaGlzIGlzIHRoZSBjdXJyZW50IFczQyByZWNvbW1lbmRhdGlvbiAoc3BlY2lmaWNhdGlvbikuIENvbnRlbnQgdGhhdCBjb25mb3JtcyB0byBXQ0FHIDIuMiBhbHNvIGNvbmZvcm1zIHRvIFdDQUcgMi4xLlwiLFxuICAgICAgICAvLyBUaGlzIHJ1bGVzZXQgaGFzIGFsbCAyLjAgYW5kIDIuMSBjaGVja3BvaW50cyB0aGF0IGFyZSBBIG9yIEFBXG4gICAgICAgIGNoZWNrcG9pbnRzOiBTQ3NcbiAgICAgICAgICAgIC5maWx0ZXIoc2MgPT4gKHNjLmxldmVsID09PSBcIkFcIiB8fCBzYy5sZXZlbCA9PT0gXCJBQVwiKSAmJiAoc2Mud2NhZ1R5cGUgPT09IFwiMi4wXCIgfHwgc2Mud2NhZ1R5cGUgPT09IFwiMi4xXCIgfHwgc2Mud2NhZ1R5cGUgPT09IFwiMi4yXCIpKVxuICAgICAgICAgICAgLm1hcChzYyA9PiAoe1xuICAgICAgICAgICAgICAgIG51bTogc2MubnVtLFxuICAgICAgICAgICAgICAgIHNjSWQ6IHNjLnNjSWQsXG4gICAgICAgICAgICAgICAgbmFtZTogc2MuaGFuZGxlLFxuICAgICAgICAgICAgICAgIHdjYWdMZXZlbDogc2MubGV2ZWwsXG4gICAgICAgICAgICAgICAgc3VtbWFyeTogc3VtbWFyaWVzW3NjLm51bV1cbiAgICAgICAgICAgIH0pKVxuICAgIH0sXG4gICAge1xuICAgICAgICBpZDogXCJXQ0FHXzJfMVwiLFxuICAgICAgICBuYW1lOiBcIldDQUcgMi4xIChBLCBBQSlcIixcbiAgICAgICAgY2F0ZWdvcnk6IGVHdWlkZWxpbmVDYXRlZ29yeS5BQ0NFU1NJQklMSVRZLFxuICAgICAgICBkZXNjcmlwdGlvbjogXCJSdWxlcyBmb3IgV0NBRyAyLjEgQSAmIEFBLiBDb250ZW50IHRoYXQgY29uZm9ybXMgdG8gV0NBRyAyLjEgYWxzbyBjb25mb3JtcyB0byBXQ0FHIDIuMC5cIixcbiAgICAgICAgLy8gVGhpcyBydWxlc2V0IGhhcyBhbGwgMi4wIGFuZCAyLjEgY2hlY2twb2ludHMgdGhhdCBhcmUgQSBvciBBQVxuICAgICAgICBjaGVja3BvaW50czogU0NzXG4gICAgICAgICAgICAuZmlsdGVyKHNjID0+IChzYy5sZXZlbCA9PT0gXCJBXCIgfHwgc2MubGV2ZWwgPT09IFwiQUFcIikgJiYgKHNjLndjYWdUeXBlID09PSBcIjIuMFwiIHx8IHNjLndjYWdUeXBlID09PSBcIjIuMVwiKSlcbiAgICAgICAgICAgIC5tYXAoc2MgPT4gKHtcbiAgICAgICAgICAgICAgICBudW06IHNjLm51bSxcbiAgICAgICAgICAgICAgICBzY0lkOiBzYy5zY0lkLFxuICAgICAgICAgICAgICAgIG5hbWU6IHNjLmhhbmRsZSxcbiAgICAgICAgICAgICAgICB3Y2FnTGV2ZWw6IHNjLmxldmVsLFxuICAgICAgICAgICAgICAgIHN1bW1hcnk6IHN1bW1hcmllc1tzYy5udW1dXG4gICAgICAgICAgICB9KSlcbiAgICB9LFxuICAgIHtcbiAgICAgICAgaWQ6IFwiV0NBR18yXzBcIixcbiAgICAgICAgbmFtZTogXCJXQ0FHIDIuMCAoQSwgQUEpXCIsXG4gICAgICAgIGNhdGVnb3J5OiBlR3VpZGVsaW5lQ2F0ZWdvcnkuQUNDRVNTSUJJTElUWSxcbiAgICAgICAgZGVzY3JpcHRpb246IFwiUnVsZXMgZm9yIFdDQUcgMi4wIEEgJiBBQS4gUmVmZXJlbmNlZCBieSBVUyBTZWN0aW9uIDUwOCwgYnV0IG5vdCB0aGUgbGF0ZXN0IFczQyByZWNvbW1lbmRhdGlvbi5cIixcbiAgICAgICAgLy8gVGhpcyBydWxlc2V0IGhhcyBhbGwgMi4wIGNoZWNrcG9pbnRzIHRoYXQgYXJlIEEgb3IgQUFcbiAgICAgICAgY2hlY2twb2ludHM6IFNDc1xuICAgICAgICAgICAgLmZpbHRlcihzYyA9PiAoc2MubGV2ZWwgPT09IFwiQVwiIHx8IHNjLmxldmVsID09PSBcIkFBXCIpICYmIChzYy53Y2FnVHlwZSA9PT0gXCIyLjBcIikpXG4gICAgICAgICAgICAubWFwKHNjID0+ICh7XG4gICAgICAgICAgICAgICAgbnVtOiBzYy5udW0sXG4gICAgICAgICAgICAgICAgc2NJZDogc2Muc2NJZCxcbiAgICAgICAgICAgICAgICBuYW1lOiBzYy5oYW5kbGUsXG4gICAgICAgICAgICAgICAgd2NhZ0xldmVsOiBzYy5sZXZlbCxcbiAgICAgICAgICAgICAgICBzdW1tYXJ5OiBzdW1tYXJpZXNbc2MubnVtXVxuICAgICAgICAgICAgfSkpXG4gICAgfVxuXVxuIiwiXG5pbXBvcnQgeyBTUkN1cnNvciB9IGZyb20gXCIuL1NSQ3Vyc29yXCI7XG5pbXBvcnQgeyBTUlJlbmRlcmVyIH0gZnJvbSBcIi4vU1JSZW5kZXJlclwiO1xuaW1wb3J0IHsgTmF2aWdhdGlvbk1vZGUsIE5hdmlnYXRpb25SZXN1bHQsIFJlbmRlclJlc3VsdCB9IGZyb20gXCIuL1NSVHlwZXNcIjtcbmltcG9ydCB7IFNSTmF2aWdhdG9yIH0gZnJvbSBcIi4vU1JOYXZpZ2F0b3JcIjtcbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuLi91dGlsL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgU1JVdGlsIH0gZnJvbSBcIi4vU1JVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uL3V0aWwvVmlzVXRpbFwiO1xuXG4vKipcbiAqIFNSQ29udHJvbGxlciBjbGFzcyBmb3IgbWFuYWdpbmcgc2NyZWVuIHJlYWRlciBzaW11bGF0aW9uXG4gKiBNYWludGFpbnMgYSBwb2ludCBvZiByZWdhcmQgYW5kIHByb3ZpZGVzIG5hdmlnYXRpb24gZnVuY3Rpb25zXG4gKi9cbmV4cG9ydCBjbGFzcyBTUkNvbnRyb2xsZXIge1xuICAgIHB1YmxpYyBzdGF0aWMgc2luZ2xldG9uO1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Q29udHJvbGxlcihjdHJsRG9jOiBIVE1MRG9jdW1lbnQgPSBkb2N1bWVudCkge1xuICAgICAgICBpZiAoIXRoaXMuc2luZ2xldG9uKSB7XG4gICAgICAgICAgICB0aGlzLnNpbmdsZXRvbiA9IG5ldyBTUkNvbnRyb2xsZXIoY3RybERvYy5ib2R5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5zaW5nbGV0b24gYXMgU1JDb250cm9sbGVyO1xuICAgIH1cblxuICAgIC8qKiBUaGUgY3VycmVudCBwb2ludCBvZiByZWdhcmQgKi9cbiAgICBwcml2YXRlIHBvaW50T2ZSZWdhcmQ6IFNSQ3Vyc29yO1xuICAgIHByaXZhdGUgbXV0YXRpb25PYnNlcnZlcjogTXV0YXRpb25PYnNlcnZlcjtcbiAgICBwcml2YXRlIGxpdmVMaXN0ZW5lcnM6IEFycmF5PChyZXN1bHQ6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPj4gPSBbXTtcbiAgICBwcml2YXRlIGN0cmxEb2M7XG4gICAgXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBTUkNvbnRyb2xsZXJcbiAgICAgKiBAcGFyYW0gcm9vdEVsZW1lbnQgVGhlIHJvb3QgZWxlbWVudCB0byBzdGFydCBmcm9tIChkZWZhdWx0cyB0byBkb2N1bWVudC5ib2R5KVxuICAgICAqL1xuICAgIHByaXZhdGUgY29uc3RydWN0b3IocHJpdmF0ZSByb290RWxlbWVudDogTm9kZSA9IGRvY3VtZW50LmJvZHkpIHtcbiAgICAgICAgdGhpcy5jdHJsRG9jID0gcm9vdEVsZW1lbnQub3duZXJEb2N1bWVudDtcbiAgICAgICAgdGhpcy5zZXRQb2ludE9mUmVnYXJkKHJvb3RFbGVtZW50KTtcbiAgICAgICAgdGhpcy5zZXR1cE11dGF0aW9uVHJhY2tpbmcoKTtcbiAgICAgICAgY29uc29sZS5pbmZvKGBbV0FSTklOR10gVGhlIFNSQ29udHJvbGxlciBpcyBhIG5ldyBmZWF0dXJlIHRoYXQgaXMgbm90IHlldCBcInN0YWJsZVwiLiBXaGF0IHRoaXMgbWVhbnM6XG4qIEFQSSBzdWJqZWN0IHRvIGNoYW5nZSwgZXZlbiBiZXR3ZWVuIG1pbm9yIHZlcnNpb25zIG9mIHRoZSBjaGVja2VyXG4qIFJlc3VsdHMgc2hvdWxkIGJlIGNvbnNpZGVyZWQgZXhwZXJpbWVudGFsLiBUaGVyZSBhcmUgYSB2YXJpZXR5IG9mIGtub3duIGlzc3VlcywgYnV0IG1ha2luZyB0aGlzIGF2YWlsYWJsZSBmb3IgZWFybHkgZXhwZXJpbWVudGF0aW9uIC8gZmVlZGJhY2suYCk7XG4gICAgfVxuXG4gICAgcHVibGljIGRpc2Nvbm5lY3QoKSB7XG4gICAgICAgIGlmICh0aGlzLm11dGF0aW9uT2JzZXJ2ZXIpIHtcbiAgICAgICAgICAgIHRoaXMubXV0YXRpb25PYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgcHJpdmF0ZSBmaW5kQWxsU2hhZG93Um9vdHMocm9vdDogRG9jdW1lbnQgfCBEb2N1bWVudEZyYWdtZW50IHwgTm9kZSA9IGRvY3VtZW50KTogTm9kZVtdIHtcbiAgICAgICAgY29uc3Qgc2hhZG93Um9vdHM6IE5vZGVbXSA9IFtdO1xuXG4gICAgICAgIC8vIEdldCBhbGwgZWxlbWVudHMgaW4gdGhlIGN1cnJlbnQgcm9vdFxuICAgICAgICBjb25zdCB3YWxrZXIgPSB0aGlzLmN0cmxEb2MuY3JlYXRlVHJlZVdhbGtlcihcbiAgICAgICAgICAgIHJvb3QsXG4gICAgICAgICAgICBOb2RlRmlsdGVyLlNIT1dfRUxFTUVOVCxcbiAgICAgICAgICAgIG51bGxcbiAgICAgICAgKTtcblxuICAgICAgICBsZXQgbm9kZTogTm9kZSB8IG51bGw7XG4gICAgICAgIHdoaWxlIChub2RlID0gd2Fsa2VyLm5leHROb2RlKCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBub2RlIGFzIEVsZW1lbnQ7XG5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgZWxlbWVudCBoYXMgYW4gb3BlbiBzaGFkb3cgcm9vdFxuICAgICAgICAgICAgaWYgKGVsZW1lbnQuc2hhZG93Um9vdCkge1xuICAgICAgICAgICAgICAgIHNoYWRvd1Jvb3RzLnB1c2goZWxlbWVudC5zaGFkb3dSb290KTtcblxuICAgICAgICAgICAgICAgIC8vIFJlY3Vyc2l2ZWx5IHNlYXJjaCBpbnNpZGUgdGhpcyBzaGFkb3cgcm9vdFxuICAgICAgICAgICAgICAgIGNvbnN0IG5lc3RlZFNoYWRvd1Jvb3RzID0gdGhpcy5maW5kQWxsU2hhZG93Um9vdHMoZWxlbWVudC5zaGFkb3dSb290KTtcbiAgICAgICAgICAgICAgICBzaGFkb3dSb290cy5wdXNoKC4uLm5lc3RlZFNoYWRvd1Jvb3RzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzaGFkb3dSb290cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdXAgbXV0YXRpb24gdHJhY2tpbmdcbiAgICAgKiBcbiAgICAgKiBJbiB0aGUgZXZlbnQgdGhhdCB0aGUgcG9pbnQgb2YgcmVnYXJkIGlzIHJlbW92ZWQgZnJvbSB0aGUgRE9NLCB3ZSBuZWVkIHRvIGdldCB1cCB0byB0aGUgbmVhcmVzdCBwYXJlbnQgdGhhdCdzIG5vdCBiZWluZyByZW1vdmVkXG4gICAgICovXG4gICAgcHJpdmF0ZSBzZXR1cE11dGF0aW9uVHJhY2tpbmcoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm11dGF0aW9uT2JzZXJ2ZXIpIHtcbiAgICAgICAgICAgIHRoaXMubXV0YXRpb25PYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbXlUaGlzID0gdGhpcztcbiAgICAgICAgY29uc3Qgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigobXV0YXRpb25zKSA9PiB7XG4gICAgICAgICAgICBsZXQgcG9yTm9kZSA9IG15VGhpcy5wb2ludE9mUmVnYXJkLmdldE5vZGUoKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcmVtb3ZhbE11dGF0aW9uIG9mIG11dGF0aW9ucy5maWx0ZXIobXV0YXRpb24gPT4gbXV0YXRpb24ucmVtb3ZlZE5vZGVzPy5sZW5ndGggPiAwKSkge1xuICAgICAgICAgICAgICAgIHJlbW92YWxNdXRhdGlvbi5yZW1vdmVkTm9kZXMuZm9yRWFjaCgocmVtb3ZlZE5vZGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlbW92ZWROb2RlLmlzU2FtZU5vZGUocG9yTm9kZSkgfHwgcmVtb3ZlZE5vZGUuY29udGFpbnMocG9yTm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuaW5mbyhcIkFkanVzdGluZyBQb1IgZHVlIHRvIERPTSBtdXRhdGlvbiByZW1vdmluZyBQb1JcIik7Ly8sIHJlbW92YWxNdXRhdGlvbi50YXJnZXQsIHJlbW92ZWROb2RlLCBwb3JOb2RlKVxuICAgICAgICAgICAgICAgICAgICAgICAgcG9yTm9kZSA9IHJlbW92YWxNdXRhdGlvbi50YXJnZXQ7XG4gICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5zZXRQb2ludE9mUmVnYXJkKHBvck5vZGUpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBmb3IgKGNvbnN0IG11dGF0aW9uIG9mIG11dGF0aW9ucykge1xuICAgICAgICAgICAgICAgIGlmIChtdXRhdGlvbi5hZGRlZE5vZGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIG11dGF0aW9uLmFkZGVkTm9kZXMuZm9yRWFjaChhZGRlZE5vZGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWRkIG9ic2VydmF0aW9uIG9mIG5ldyBzaGFkb3cgcm9vdHNcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhbGxSb290cyA9IHRoaXMuZmluZEFsbFNoYWRvd1Jvb3RzKGFkZGVkTm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHJvb3Qgb2YgYWxsUm9vdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5vYnNlcnZlKHJvb3QsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRMaXN0OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJ0cmVlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJEYXRhOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBtdXRhdGlvbi50YXJnZXQ7XG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbSA9IG5vZGUubm9kZVR5cGUgPT09IDEgPyBub2RlIGFzIEhUTUxFbGVtZW50IDogbm9kZS5wYXJlbnRFbGVtZW50O1xuICAgICAgICAgICAgICAgIGlmIChlbGVtIFxuICAgICAgICAgICAgICAgICAgICAmJiAhZWxlbS5jbG9zZXN0KGBbYXJpYS1idXN5PVwidHJ1ZVwiXWApXG4gICAgICAgICAgICAgICAgICAgICYmIGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1idXN5XCIpICE9PSBcInRydWVcIlxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZGVudGlmeSB0aGUgbGl2ZSByZWdpb24gY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpdmVSZWdpb25FbGVtID0gXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZWxlbWVudCBpdHNlbGYgaXMgYSBsaXZlIHJlZ2lvbiBjb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICgoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW1wicG9saXRlXCIsIFwiYXNzZXJ0aXZlXCJdLmluY2x1ZGVzKGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1saXZlXCIpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBlbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiT1VUUFVUXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgW1wic3RhdHVzXCIsIFwibG9nXCIsIFwicHJvZ3Jlc3NiYXJcIiwgXCJhbGVydFwiLCBcInRpbWVyXCJdLmluY2x1ZGVzKGVsZW0uZ2V0QXR0cmlidXRlKFwicm9sZVwiKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICkgJiYgZWxlbSkgXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBPciBnZXQgdGhlIG5lYXJlc3QgYW5jZXN0b3JcbiAgICAgICAgICAgICAgICAgICAgICAgIHx8IGVsZW0uY2xvc2VzdChgW2FyaWEtbGl2ZT1cInBvbGl0ZVwiXSxbYXJpYS1saXZlPVwiYXNzZXJ0aXZlXCJdLG91dHB1dCxbcm9sZT1cInN0YXR1c1wiXSxbcm9sZT1cImxvZ1wiXSxbcm9sZT1cInByb2dyZXNzYmFyXCJdLFtyb2xlPVwiYWxlcnRcIl0sW3JvbGU9XCJ0aW1lclwiXWApO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBpc011dGF0aW9uUmVsZXZhbnQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlbGV2YW5jZSA9IFtcImFkZGl0aW9uc1wiLCBcInRleHRcIl07XG4gICAgICAgICAgICAgICAgICAgIGlmIChsaXZlUmVnaW9uRWxlbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIHdoYXQga2luZHMgb2YgY2hhbmdlcyBhcmUgJ3JlbGV2YW50J1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVsZXZhbnRFbGVtID0gZWxlbS5jbG9zZXN0KFwiW2FyaWEtcmVsZXZhbnRdXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlbGV2YW50RWxlbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGV2YW5jZSA9IHJlbGV2YW50RWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLXJlbGV2YW50XCIpLnNwbGl0KC8gKy9nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpdmVSZWdpb25FbGVtLmdldEF0dHJpYnV0ZShcInJvbGVcIikgPT09IFwibG9nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxldmFuY2UgPSBbXCJhZGRpdGlvbnNcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGl2ZVJlZ2lvbkVsZW0uaGFzQXR0cmlidXRlKFwiYXJpYS1yZWxldmFudFwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGV2YW5jZSA9IGxpdmVSZWdpb25FbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtcmVsZXZhbnRcIikuc3BsaXQoLyArL2cpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlbGV2YW5jZS5pbmNsdWRlcyhcImFsbFwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGV2YW5jZSA9IFtcImFkZGl0aW9uc1wiLCBcInJlbW92YWxzXCIsIFwidGV4dFwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlzTXV0YXRpb25SZWxldmFudCA9IChtdXRhdGlvbi50YXJnZXQubm9kZVR5cGUgPT09IDMgJiYgcmVsZXZhbmNlLmluY2x1ZGVzKFwidGV4dFwiKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAobXV0YXRpb24uYWRkZWROb2Rlcy5sZW5ndGggPiAwICYmIHJlbGV2YW5jZS5pbmNsdWRlcyhcImFkZGl0aW9uc1wiKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAobXV0YXRpb24ucmVtb3ZlZE5vZGVzLmxlbmd0aCA+IDAgJiYgcmVsZXZhbmNlLmluY2x1ZGVzKFwicmVtb3ZhbHNcIikpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIFxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChsaXZlUmVnaW9uRWxlbSAmJiBpc011dGF0aW9uUmVsZXZhbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzQXRvbWljID0gbGl2ZVJlZ2lvbkVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1hdG9taWNcIikgPT09IFwidHJ1ZVwiIHx8IFtcImFsZXJ0XCIsIFwic3RhdHVzXCIsIFwidGltZXJcIiwgXCJtYXJxdWVlXCJdLmluY2x1ZGVzKGxpdmVSZWdpb25FbGVtLmdldEF0dHJpYnV0ZShcInJvbGVcIikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVhZCB0aGUgd2hvbGUgcmVnaW9uIGlmIGF0b21pY1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0F0b21pYyAmJiBtdXRhdGlvbi50eXBlID09PSBcImNoYXJhY3RlckRhdGFcIiAmJiBtdXRhdGlvbi50YXJnZXQubm9kZVR5cGUgPT09IDMgJiYgIVZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKG11dGF0aW9uLnRhcmdldC5wYXJlbnRFbGVtZW50KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbGl2ZUxpc3RlbmVyIG9mIHRoaXMubGl2ZUxpc3RlbmVycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXZlTGlzdGVuZXIobXV0YXRpb24udGFyZ2V0Lm5vZGVWYWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGl2ZVRhcmdldCA9IGlzQXRvbWljID8gbGl2ZVJlZ2lvbkVsZW0gOiBtdXRhdGlvbi50YXJnZXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChsaXZlVGFyZ2V0IGFzIGFueSkubGl2ZUFubm91bmNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCgobGl2ZVRhcmdldCBhcyBhbnkpLmxpdmVBbm5vdW5jZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsaXZlVGFyZ2V0IGFzIGFueSkubGl2ZUFubm91bmNlID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXN1bHRzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpc1JlbW92YWwgPSAocmVsZXZhbmNlLmluY2x1ZGVzKFwicmVtb3ZhbHNcIikgJiYgbXV0YXRpb24ucmVtb3ZlZE5vZGVzLmxlbmd0aCA+IDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNBdG9taWMgfHwgaXNSZW1vdmFsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGl2ZUN1cnNvciA9IG5ldyBTUkN1cnNvcihsaXZlVGFyZ2V0LCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGl2ZUN1cnNvckVuZCA9IG5ldyBTUkN1cnNvcihsaXZlVGFyZ2V0LCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpdmVDdXJzb3JFbmQubmV4dCgoKSA9PiB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaCgoaXNSZW1vdmFsP1wiW3JlbW92ZWRdIFwiOlwiXCIpK1NSUmVuZGVyZXIucmVuZGVyUmFuZ2UoXCJpdGVtXCIsIGxpdmVDdXJzb3IsIGxpdmVDdXJzb3JFbmQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZWxldmFuY2UuaW5jbHVkZXMoXCJhZGRpdGlvbnNcIikgJiYgbXV0YXRpb24uYWRkZWROb2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhdGlvbi5hZGRlZE5vZGVzLmZvckVhY2goYWRkZWROb2RlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBKdXN0IHJlbmRlciB0aGUgYWRkaXRpb25zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxpdmVDdXJzb3IgPSBuZXcgU1JDdXJzb3IoYWRkZWROb2RlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxpdmVDdXJzb3JFbmQgPSBuZXcgU1JDdXJzb3IoYWRkZWROb2RlLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXZlQ3Vyc29yRW5kLm5leHQoKCkgPT4gdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKFNSUmVuZGVyZXIucmVuZGVyUmFuZ2UoXCJpdGVtXCIsIGxpdmVDdXJzb3IsIGxpdmVDdXJzb3JFbmQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbGl2ZUxpc3RlbmVyIG9mIHRoaXMubGl2ZUxpc3RlbmVycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGl2ZUxpc3RlbmVyKHJlc3VsdHMuam9pbihcIlxcblwiKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCAxMDApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBOZWVkIHRvIG9ic2VydmUgYWxsIG9mIHRoZSBzaGFkb3cgcm9vdHNcbiAgICAgICAgbGV0IGFsbFJvb3RzID0gdGhpcy5maW5kQWxsU2hhZG93Um9vdHModGhpcy5jdHJsRG9jLmRvY3VtZW50RWxlbWVudCk7XG4gICAgICAgIGFsbFJvb3RzLnB1c2godGhpcy5jdHJsRG9jLmRvY3VtZW50RWxlbWVudCk7XG4gICAgICAgIGZvciAoY29uc3Qgcm9vdCBvZiBhbGxSb290cykge1xuICAgICAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShyb290LCB7XG4gICAgICAgICAgICAgICAgY2hpbGRMaXN0OiB0cnVlLFxuICAgICAgICAgICAgICAgIHN1YnRyZWU6IHRydWUsXG4gICAgICAgICAgICAgICAgY2hhcmFjdGVyRGF0YTogdHJ1ZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkTGl2ZUxpc3RlbmVyKGxpc3RlbmVyOiAocmVzdWx0OiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD4pIHtcbiAgICAgICAgdGhpcy5saXZlTGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICAgIH1cblxuICAgIHB1YmxpYyByZW1vdmVMaXZlTGlzdGVuZXIocmVtb3ZlTGlzdGVuZXI6IChyZXN1bHQ6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPikge1xuICAgICAgICB0aGlzLmxpdmVMaXN0ZW5lcnMgPSB0aGlzLmxpdmVMaXN0ZW5lcnMuZmlsdGVyKGxpc3RlbmVyID0+IGxpc3RlbmVyICE9PSByZW1vdmVMaXN0ZW5lcik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBjdXJyZW50IHBvaW50IG9mIHJlZ2FyZFxuICAgICAqIEByZXR1cm5zIFRoZSBjdXJyZW50IFNSQ3Vyc29yIHJlcHJlc2VudGluZyB0aGUgcG9pbnQgb2YgcmVnYXJkXG4gICAgICovXG4gICAgcHVibGljIGdldFBvaW50T2ZSZWdhcmQoKTogU1JDdXJzb3Ige1xuICAgICAgICByZXR1cm4gdGhpcy5wb2ludE9mUmVnYXJkO1xuICAgIH1cbiAgICBcbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIHBvaW50IG9mIHJlZ2FyZCB0byBhIHNwZWNpZmljIERPTSBub2RlXG4gICAgICogQHBhcmFtIG5vZGUgVGhlIG5vZGUgdG8gc2V0IGFzIHRoZSBwb2ludCBvZiByZWdhcmRcbiAgICAgKiBAcmV0dXJucyBOYXZpZ2F0aW9uUmVzdWx0IGluZGljYXRpbmcgc3VjY2VzcyBvciBmYWlsdXJlXG4gICAgICovXG4gICAgcHVibGljIHNldFBvaW50T2ZSZWdhcmQobm9kZTogTm9kZSk6IE5hdmlnYXRpb25SZXN1bHQge1xuICAgICAgICBjb25zdCBERUJVRyA9IGZhbHNlO1xuICAgICAgICBERUJVRyAmJiBjb25zb2xlLmdyb3VwKFwic2V0UG9pbnRPZlJlZ2FyZFwiKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHRoaXMucG9pbnRPZlJlZ2FyZCA9IG5ldyBTUkN1cnNvcihub2RlKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gVXBkYXRlIGNvbnRhaW5lciBzdGF0ZVxuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyQ2hhbmdlcyA9IFNSQ29udHJvbGxlci5kaWZmQ29udGFpbmVycyhcImZvY3VzXCIsIHRoaXMucG9pbnRPZlJlZ2FyZCk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNvbnN0IHJvbGUgPSB0aGlzLnBvaW50T2ZSZWdhcmQuZ2V0Um9sZSgpO1xuICAgICAgICAgICAgY29uc3QgbmFtZSA9IHRoaXMucG9pbnRPZlJlZ2FyZC5nZXROYW1lSW5mbygpPy5uYW1lO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgICAgICAgcmVuZGVyaW5nUmVzdWx0OiBTUlJlbmRlcmVyLnJlbmRlckN1cnJlbnQoXCJmb2N1c1wiLCB0aGlzLnBvaW50T2ZSZWdhcmQsIGNvbnRhaW5lckNoYW5nZXMpLFxuICAgICAgICAgICAgICAgIHJvbGUsXG4gICAgICAgICAgICAgICAgbmFtZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICAgICAgcmVuZGVyaW5nUmVzdWx0OiB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0OiB0aGlzLnBvaW50T2ZSZWdhcmQuY2xvbmUoKSxcbiAgICAgICAgICAgICAgICAgICAgZW5kOiB0aGlzLnBvaW50T2ZSZWdhcmQuY2xvbmUoKSxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYEZhaWxlZCB0byBzZXQgcG9pbnQgb2YgcmVnYXJkOiAke2Vycm9yLm1lc3NhZ2V9YFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBERUJVRyAmJiBjb25zb2xlLmdyb3VwRW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLyoqXG4gICAgICogSnVtcCB0byB0aGUgbmV4dCBlbGVtZW50IGJ5IHRoZSBzcGVjaWZpZWQgbW9kZVxuICAgICAqIEBwYXJhbSBtb2RlIFRoZSBuYXZpZ2F0aW9uIG1vZGUgdG8gdXNlXG4gICAgICogQHJldHVybnMgTmF2aWdhdGlvblJlc3VsdCBpbmRpY2F0aW5nIHN1Y2Nlc3Mgb3IgZmFpbHVyZVxuICAgICAqL1xuICAgIHB1YmxpYyBqdW1wTmV4dChtb2RlOiBOYXZpZ2F0aW9uTW9kZSk6IE5hdmlnYXRpb25SZXN1bHQge1xuICAgICAgICBDYWNoZVV0aWwuY2xlYXJDYWNoZXModGhpcy5jdHJsRG9jLmRvY3VtZW50RWxlbWVudCk7XG4gICAgICAgIGNvbnN0IG9sZFBvaW50T2ZSZWdhcmQgPSB0aGlzLnBvaW50T2ZSZWdhcmQuY2xvbmUoKTtcbiAgICAgICAgY29uc3QgREVCVUcgPSBmYWxzZTtcbiAgICAgICAgREVCVUcgJiYgY29uc29sZS5ncm91cChcImp1bXBOZXh0XCIpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IGJDb250aW51ZSA9IHRydWU7XG4gICAgICAgICAgICBsZXQgbmV4dEp1bXAgPSB0aGlzLnBvaW50T2ZSZWdhcmQuY2xvbmUoKTtcbiAgICAgICAgICAgIGxldCByZW5kZXJpbmdSZXN1bHQ7XG4gICAgICAgICAgICB3aGlsZSAoYkNvbnRpbnVlICYmIG5leHRKdW1wKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGFzdEp1bXAgPSBuZXh0SnVtcC5jbG9uZSgpO1xuICAgICAgICAgICAgICAgIG5leHRKdW1wID0gU1JOYXZpZ2F0b3IuanVtcE5leHQobW9kZSwgbmV4dEp1bXApO1xuICAgICAgICAgICAgICAgIGlmIChuZXh0SnVtcCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY29udGFpbmVyQ2hhbmdlcyA9IFNSQ29udHJvbGxlci5kaWZmQ29udGFpbmVycyhtb2RlLCBuZXh0SnVtcCwgbGFzdEp1bXApO1xuICAgICAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gXCJpdGVtXCIgJiYgIVNSTmF2aWdhdG9yLmdldFN0YXJ0RnVuYyhtb2RlKShuZXh0SnVtcC5nZXRSb2xlKCksICFuZXh0SnVtcC5pc0VuZFRhZygpLCBuZXh0SnVtcC5nZXROb2RlKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJDaGFuZ2VzID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudGVyaW5nOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWF2aW5nOiBbXVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJlbmRlcmluZ1Jlc3VsdCA9IFNSUmVuZGVyZXIucmVuZGVyQ3VycmVudChtb2RlLCBuZXh0SnVtcCwgY29udGFpbmVyQ2hhbmdlcyk7XG4gICAgICAgICAgICAgICAgICAgIC8vIEtlZXAgZ29pbmcgaWYgdGhlIGxhbmRpbmcgcG9pbnQgaXMgZW1wdHksIHVubGVzcyBpdCdzIGNlcnRhaW4gbmF2IG1vZGVzIChlLmcuLCByZWdpb24pXG4gICAgICAgICAgICAgICAgICAgIGJDb250aW51ZSA9IHJlbmRlcmluZ1Jlc3VsdC5tZXNzYWdlLnRyaW0oKS5sZW5ndGggPT09IDAgJiYgIVtcInJlZ2lvblwiXS5pbmNsdWRlcyhtb2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIW5leHRKdW1wKSB7XG4gICAgICAgICAgICAgICAgLy8gUmVzdG9yZSB0aGUgb3JpZ2luYWwgcG9pbnQgb2YgcmVnYXJkXG4gICAgICAgICAgICAgICAgdGhpcy5wb2ludE9mUmVnYXJkID0gb2xkUG9pbnRPZlJlZ2FyZDtcbiAgICAgICAgICAgICAgICBsZXQgY3VycmVudFJlc3VsdCA9IFNSUmVuZGVyZXIucmVuZGVyQ3VycmVudChtb2RlLCBvbGRQb2ludE9mUmVnYXJkLCB7IGxlYXZpbmc6IFtdLCBlbnRlcmluZzogW119KTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyaW5nUmVzdWx0OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFydDogb2xkUG9pbnRPZlJlZ2FyZC5jbG9uZSgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiBvbGRQb2ludE9mUmVnYXJkLmNsb25lKCksXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgTm8gbmV4dCAke21vZGV9LiAke2N1cnJlbnRSZXN1bHQ/Lm1lc3NhZ2UgfHwgXCJcIn1gXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBvaW50T2ZSZWdhcmQgPSBuZXh0SnVtcDtcbiAgICAgICAgICAgICAgICBjb25zdCByb2xlID0gdGhpcy5wb2ludE9mUmVnYXJkLmdldFJvbGUoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gdGhpcy5wb2ludE9mUmVnYXJkLmdldE5hbWVJbmZvKCk/Lm5hbWU7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGNvbnRhaW5lciBjaGFuZ2VzXG4gICAgICAgICAgICAgICAgREVCVUcgJiYgY29uc29sZS5sb2coXCJOZXcgUE9SOlwiLCB0aGlzLnBvaW50T2ZSZWdhcmQuZ2V0Tm9kZSgpLCByZW5kZXJpbmdSZXN1bHQpO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHJlbmRlcmluZ1Jlc3VsdCxcbiAgICAgICAgICAgICAgICAgICAgcm9sZSxcbiAgICAgICAgICAgICAgICAgICAgbmFtZVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIC8vIFJlc3RvcmUgdGhlIG9yaWdpbmFsIHBvaW50IG9mIHJlZ2FyZFxuICAgICAgICAgICAgdGhpcy5wb2ludE9mUmVnYXJkID0gb2xkUG9pbnRPZlJlZ2FyZDtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICAgICAgcmVuZGVyaW5nUmVzdWx0OiB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBvbGRQb2ludE9mUmVnYXJkLmNsb25lKCksXG4gICAgICAgICAgICAgICAgICAgIGVuZDogb2xkUG9pbnRPZlJlZ2FyZC5jbG9uZSgpLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgTmF2aWdhdGlvbiBlcnJvcjogJHtlcnJvci5tZXNzYWdlfWBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgY29uc29sZS5ncm91cEVuZCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8qKlxuICAgICAqIEp1bXAgdG8gdGhlIHByZXZpb3VzIGVsZW1lbnQgYnkgdGhlIHNwZWNpZmllZCBtb2RlXG4gICAgICogQHBhcmFtIG1vZGUgVGhlIG5hdmlnYXRpb24gbW9kZSB0byB1c2VcbiAgICAgKiBAcmV0dXJucyBOYXZpZ2F0aW9uUmVzdWx0IGluZGljYXRpbmcgc3VjY2VzcyBvciBmYWlsdXJlXG4gICAgICovXG4gICAgcHVibGljIGp1bXBQcmV2aW91cyhtb2RlOiBOYXZpZ2F0aW9uTW9kZSk6IE5hdmlnYXRpb25SZXN1bHQge1xuICAgICAgICBDYWNoZVV0aWwuY2xlYXJDYWNoZXModGhpcy5jdHJsRG9jLmRvY3VtZW50RWxlbWVudCk7XG4gICAgICAgIGNvbnN0IG9sZFBvaW50T2ZSZWdhcmQgPSB0aGlzLnBvaW50T2ZSZWdhcmQuY2xvbmUoKTtcbiAgICAgICAgXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBsZXQgYkNvbnRpbnVlID0gdHJ1ZTtcbiAgICAgICAgICAgIGxldCBwcmV2SnVtcCA9IHRoaXMucG9pbnRPZlJlZ2FyZC5jbG9uZSgpO1xuICAgICAgICAgICAgbGV0IHJlbmRlcmluZ1Jlc3VsdDtcbiAgICAgICAgICAgIHdoaWxlIChiQ29udGludWUgJiYgcHJldkp1bXApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsYXN0SnVtcCA9IHByZXZKdW1wLmNsb25lKCk7XG4gICAgICAgICAgICAgICAgcHJldkp1bXAgPSBTUk5hdmlnYXRvci5qdW1wUHJldmlvdXMobW9kZSwgcHJldkp1bXApO1xuICAgICAgICAgICAgICAgIGlmIChwcmV2SnVtcCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY29udGFpbmVyQ2hhbmdlcyA9IFNSQ29udHJvbGxlci5kaWZmQ29udGFpbmVycyhtb2RlLCBwcmV2SnVtcCwgbGFzdEp1bXApO1xuICAgICAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gXCJpdGVtXCIgJiYgIVNSTmF2aWdhdG9yLmdldFN0YXJ0RnVuYyhtb2RlKShwcmV2SnVtcC5nZXRSb2xlKCksICFwcmV2SnVtcC5pc0VuZFRhZygpLCBwcmV2SnVtcC5nZXROb2RlKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJDaGFuZ2VzID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudGVyaW5nOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWF2aW5nOiBbXVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJlbmRlcmluZ1Jlc3VsdCA9IFNSUmVuZGVyZXIucmVuZGVyQ3VycmVudChtb2RlLCBwcmV2SnVtcCwgY29udGFpbmVyQ2hhbmdlcyk7XG4gICAgICAgICAgICAgICAgICAgIC8vIEtlZXAgZ29pbmcgaWYgdGhlIGxhbmRpbmcgcG9pbnQgaXMgZW1wdHksIHVubGVzcyBpdCdzIGNlcnRhaW4gbmF2IG1vZGVzIChlLmcuLCByZWdpb24pXG4gICAgICAgICAgICAgICAgICAgIGJDb250aW51ZSA9IHJlbmRlcmluZ1Jlc3VsdC5tZXNzYWdlLnRyaW0oKS5sZW5ndGggPT09IDAgJiYgIVtcInJlZ2lvblwiXS5pbmNsdWRlcyhtb2RlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmICghcHJldkp1bXApIHtcbiAgICAgICAgICAgICAgICAvLyBSZXN0b3JlIHRoZSBvcmlnaW5hbCBwb2ludCBvZiByZWdhcmRcbiAgICAgICAgICAgICAgICB0aGlzLnBvaW50T2ZSZWdhcmQgPSBvbGRQb2ludE9mUmVnYXJkO1xuICAgICAgICAgICAgICAgIGxldCBjdXJyZW50UmVzdWx0ID0gU1JSZW5kZXJlci5yZW5kZXJDdXJyZW50KG1vZGUsIG9sZFBvaW50T2ZSZWdhcmQsIHsgbGVhdmluZzogW10sIGVudGVyaW5nOiBbXX0pO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICByZW5kZXJpbmdSZXN1bHQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBvbGRQb2ludE9mUmVnYXJkLmNsb25lKCksXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmQ6IG9sZFBvaW50T2ZSZWdhcmQuY2xvbmUoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBObyBwcmV2aW91cyAke21vZGV9LiAke2N1cnJlbnRSZXN1bHQ/Lm1lc3NhZ2UgfHwgXCJcIn1gXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBvaW50T2ZSZWdhcmQgPSBwcmV2SnVtcDtcbiAgICAgICAgICAgICAgICBjb25zdCByb2xlID0gdGhpcy5wb2ludE9mUmVnYXJkLmdldFJvbGUoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gdGhpcy5wb2ludE9mUmVnYXJkLmdldE5hbWVJbmZvKCk/Lm5hbWU7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gLy8gQ2hlY2sgZm9yIGNvbnRhaW5lciBjaGFuZ2VzXG4gICAgICAgICAgICAgICAgLy8gY29uc3QgY29udGFpbmVyQ2hhbmdlcyA9IFNSQ29udHJvbGxlci5kaWZmQ29udGFpbmVycyhtb2RlLCB0aGlzLnBvaW50T2ZSZWdhcmQsIG9sZFBvaW50T2ZSZWdhcmQpO1xuICAgICAgICAgICAgICAgIC8vIGxldCBzID0gU1JSZW5kZXJlci5yZW5kZXJFbnRlcihtb2RlLCB0aGlzLnBvaW50T2ZSZWdhcmQpO1xuICAgICAgICAgICAgICAgIC8vIGlmIChjb250YWluZXJDaGFuZ2VzLmVudGVyaW5nW2NvbnRhaW5lckNoYW5nZXMuZW50ZXJpbmcubGVuZ3RoLTFdICE9PSBzKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIGNvbnRhaW5lckNoYW5nZXMuZW50ZXJpbmcucHVzaChzKTtcbiAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgcmVuZGVyaW5nUmVzdWx0LFxuICAgICAgICAgICAgICAgICAgICByb2xlLFxuICAgICAgICAgICAgICAgICAgICBuYW1lXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgLy8gUmVzdG9yZSB0aGUgb3JpZ2luYWwgcG9pbnQgb2YgcmVnYXJkXG4gICAgICAgICAgICB0aGlzLnBvaW50T2ZSZWdhcmQgPSBvbGRQb2ludE9mUmVnYXJkO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICByZW5kZXJpbmdSZXN1bHQ6IHtcbiAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IG9sZFBvaW50T2ZSZWdhcmQuY2xvbmUoKSxcbiAgICAgICAgICAgICAgICAgICAgZW5kOiBvbGRQb2ludE9mUmVnYXJkLmNsb25lKCksXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBOYXZpZ2F0aW9uIGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lIHRoZSBkaWZmZXJlbnQgaW4gY29udGFpbmVycyBiZXR3ZWVuIHRoZSB0d28gbm9kZXNcbiAgICAgKiBAcGFyYW0gbmV3V2Fsa2VyIFRoZSBuZXcgbm9kZSB3ZSdyZSBuYXZpZ2F0aW5nIHRvXG4gICAgICogQHBhcmFtIG9sZFdhbGtlciBUaGUgcHJldmlvdXMgbm9kZSB3ZSB3ZXJlIGF0XG4gICAgICogQHJldHVybnMgQXJyYXkgb2YgY29udGFpbmVyIGNoYW5nZSBtZXNzYWdlc1xuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZGlmZkNvbnRhaW5lcnMobW9kZTogTmF2aWdhdGlvbk1vZGUgfCBcImZvY3VzXCIsIG5ld1dhbGtlcjogU1JDdXJzb3IsIG9sZFdhbGtlcj86IFNSQ3Vyc29yKTogeyBsZWF2aW5nOiBzdHJpbmdbXSwgZW50ZXJpbmc6IHN0cmluZ1tdIH0ge1xuICAgICAgICBjb25zdCBERUJVRyA9IGZhbHNlO1xuICAgICAgICBERUJVRyAmJiBjb25zb2xlLmxvZyhcIi09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LT0tPS09LVwiKTtcbiAgICAgICAgREVCVUcgJiYgY29uc29sZS5sb2coXCJBKVwiLCBvbGRXYWxrZXIuZ2V0Tm9kZSgpLm5vZGVOYW1lLCBuZXdXYWxrZXIuZ2V0Tm9kZSgpLm5vZGVOYW1lKTtcbiAgICAgICAgbGV0IGxlYXZpbmc6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGxldCBlbnRlcmluZzogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGRvY1Jvb3QgPSBuZXdXYWxrZXIgP1xuICAgICAgICAgICAgICAgIChuZXdXYWxrZXIuZ2V0Tm9kZSgpLm93bmVyRG9jdW1lbnQuYm9keSB8fCBuZXdXYWxrZXIuZ2V0Tm9kZSgpLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSA6XG4gICAgICAgICAgICAgICAgb2xkV2Fsa2VyID9cbiAgICAgICAgICAgICAgICAgICAgKG9sZFdhbGtlci5nZXROb2RlKCkub3duZXJEb2N1bWVudC5ib2R5IHx8IG9sZFdhbGtlci5nZXROb2RlKCkub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIDpcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keSB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG5cbiAgICAgICAgICAgIGxldCB3YWxrTmV3ID0gbmV3V2Fsa2VyID8gbmV3V2Fsa2VyLmNsb25lKCkgOiAobmV3IFNSQ3Vyc29yKGRvY1Jvb3QpKTtcbiAgICAgICAgICAgIGxldCB3YWxrT2xkID0gb2xkV2Fsa2VyID8gb2xkV2Fsa2VyLmNsb25lKCkgOiAobmV3IFNSQ3Vyc29yKGRvY1Jvb3QpKTtcbiAgICAgICAgICAgIGlmICghd2Fsa05ldy5nZXROb2RlKCkuaXNTYW1lTm9kZSh3YWxrT2xkLmdldE5vZGUoKSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgY29tbW9uUGFyZW50ID0gU1JDb250cm9sbGVyLmNvbW1vblBhcmVudCh3YWxrTmV3LCB3YWxrT2xkKTtcbiAgICAgICAgICAgICAgICBpZiAoY29tbW9uUGFyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIERFQlVHICYmIGNvbnNvbGUubG9nKFwiQilcIiwgY29tbW9uUGFyZW50LmdldE5vZGUoKS5ub2RlTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChjb21tb25QYXJlbnQuY29udGFpbnMod2Fsa05ldykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHICYmIGNvbnNvbGUubG9nKFwiRW50ZXJpbmc6XCIsIHdhbGtOZXcuZ2V0Tm9kZSgpLm5vZGVOYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVudGVyaW5nLnB1c2goU1JSZW5kZXJlci5yZW5kZXJFbnRlcihtb2RlLCB3YWxrTmV3LCB3YWxrT2xkKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB3YWxrTmV3LnBhcmVudCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVudGVyaW5nLnJldmVyc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgZW50ZXJpbmcgPSBlbnRlcmluZy5maWx0ZXIocyA9PiBzICYmIHMudHJpbSgpLmxlbmd0aCA+IDApLm1hcChzID0+IHMudHJpbSgpKTs7XG5cbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNvbW1vblBhcmVudC5jb250YWlucyh3YWxrT2xkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgREVCVUcgJiYgY29uc29sZS5sb2coXCJMZWF2aW5nOlwiLCB3YWxrT2xkLmdldE5vZGUoKS5ub2RlTmFtZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZWF2aW5nLnB1c2goU1JSZW5kZXJlci5yZW5kZXJMZWF2ZShtb2RlLCB3YWxrT2xkLCB3YWxrT2xkKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB3YWxrT2xkLnBhcmVudCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxlYXZpbmcgPSBsZWF2aW5nLmZpbHRlcihzID0+IHMgJiYgcy50cmltKCkubGVuZ3RoID4gMCkubWFwKHMgPT4gcy50cmltKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgIH1cbiAgICAgICAgREVCVUcgJiYgY29uc29sZS5sb2cobGVhdmluZywgZW50ZXJpbmcpO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsZWF2aW5nLFxuICAgICAgICAgICAgZW50ZXJpbmdcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBjb21tb25QYXJlbnQod2Fsa2VyT25lOiBTUkN1cnNvciwgd2Fsa2VyVHdvOiBTUkN1cnNvcik6IFNSQ3Vyc29yIHtcbiAgICAgICAgaWYgKHdhbGtlck9uZS5jb250YWlucyh3YWxrZXJUd28pKSB7XG4gICAgICAgICAgICByZXR1cm4gd2Fsa2VyT25lLmNsb25lKCk7XG4gICAgICAgIH0gZWxzZSBpZiAod2Fsa2VyVHdvLmNvbnRhaW5zKHdhbGtlck9uZSkpIHtcbiAgICAgICAgICAgIHJldHVybiB3YWxrZXJUd28uY2xvbmUoKTsgXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgY29tbW9uUGFyZW50OiBTUkN1cnNvciA9IHdhbGtlck9uZS5jbG9uZSgpO1xuICAgICAgICAgICAgd2hpbGUgKCFjb21tb25QYXJlbnQuY29udGFpbnMod2Fsa2VyVHdvKSAmJiBjb21tb25QYXJlbnQucGFyZW50KCkpO1xuICAgICAgICAgICAgaWYgKCFjb21tb25QYXJlbnQuY29udGFpbnMod2Fsa2VyT25lKSB8fCAhY29tbW9uUGFyZW50LmNvbnRhaW5zKHdhbGtlclR3bykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH0gXG4gICAgICAgICAgICByZXR1cm4gY29tbW9uUGFyZW50O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyByZW5kZXJBbGwobW9kZTogTmF2aWdhdGlvbk1vZGUpOiBzdHJpbmdbXSB7XG4gICAgICAgIGxldCBjdHJsID0gU1JDb250cm9sbGVyLmdldENvbnRyb2xsZXIoKTtcbiAgICAgICAgbGV0IGRpYWxvZ3MgPSBjdHJsLmN0cmxEb2MuYm9keS5xdWVyeVNlbGVjdG9yQWxsKFwiZGlhbG9nLFtyb2xlPSdkaWFsb2cnXVwiKTtcbiAgICAgICAgZGlhbG9ncy5mb3JFYWNoKGRpYWxvZyA9PiB7XG4gICAgICAgICAgICBpZiAoU1JVdGlsLmlzTW9kYWxEaWFsb2dFbGVtZW50KGRpYWxvZykpIHtcbiAgICAgICAgICAgICAgICBjdHJsLnNldFBvaW50T2ZSZWdhcmQoZGlhbG9nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgbGV0IHJlc3VsdHM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIC8vIEhhbmRsZSB0aGUgaW5pdGlhbCBpdGVtIGZpcnN0IChpZiB0aGVyZSBpcyBvbmUpXG4gICAgICAgIGxldCBzdGFydGVyTXNnID0gU1JSZW5kZXJlci5yZW5kZXJDdXJyZW50KG1vZGUsIGN0cmwuZ2V0UG9pbnRPZlJlZ2FyZCgpLCB7ZW50ZXJpbmc6IFtdLCBsZWF2aW5nOiBbXX0pO1xuICAgICAgICBpZiAoc3RhcnRlck1zZykge1xuICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHN0YXJ0ZXJNc2cubWVzc2FnZSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYkNvbnRpbnVlID0gdHJ1ZTtcbiAgICAgICAgd2hpbGUgKGJDb250aW51ZSkge1xuICAgICAgICAgICAgbGV0IG5leHRWYWwgPSBjdHJsLmp1bXBOZXh0KG1vZGUpO1xuICAgICAgICAgICAgaWYgKG5leHRWYWwuc3VjY2Vzcykge1xuICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaChuZXh0VmFsLnJlbmRlcmluZ1Jlc3VsdC5tZXNzYWdlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYkNvbnRpbnVlID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyByZW5kZXJBbGxEZXRhaWwoZG9jOiBIVE1MRG9jdW1lbnQsIG1vZGU6IE5hdmlnYXRpb25Nb2RlKTogUmVuZGVyUmVzdWx0W10ge1xuICAgICAgICBsZXQgY3RybCA9IFNSQ29udHJvbGxlci5nZXRDb250cm9sbGVyKGRvYyk7XG4gICAgICAgIGN0cmwuc2V0UG9pbnRPZlJlZ2FyZChkb2MuYm9keSk7XG4gICAgICAgIGxldCBkaWFsb2dzID0gZG9jLmJvZHkucXVlcnlTZWxlY3RvckFsbChcImRpYWxvZyxbcm9sZT0nZGlhbG9nJ11cIik7XG4gICAgICAgIGRpYWxvZ3MuZm9yRWFjaChkaWFsb2cgPT4ge1xuICAgICAgICAgICAgaWYgKFNSVXRpbC5pc01vZGFsRGlhbG9nRWxlbWVudChkaWFsb2cpKSB7XG4gICAgICAgICAgICAgICAgY3RybC5zZXRQb2ludE9mUmVnYXJkKGRpYWxvZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIGxldCByZXN1bHRzOiBSZW5kZXJSZXN1bHRbXSA9IFtdO1xuICAgICAgICAvLyBIYW5kbGUgdGhlIGluaXRpYWwgaXRlbSBmaXJzdCAoaWYgdGhlcmUgaXMgb25lKVxuICAgICAgICBsZXQgc3RhcnRlck1zZyA9IFNSUmVuZGVyZXIucmVuZGVyQ3VycmVudChtb2RlLCBjdHJsLmdldFBvaW50T2ZSZWdhcmQoKSwge2VudGVyaW5nOiBbXSwgbGVhdmluZzogW119KTtcbiAgICAgICAgaWYgKHN0YXJ0ZXJNc2cpIHtcbiAgICAgICAgICAgIHJlc3VsdHMucHVzaChzdGFydGVyTXNnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBiQ29udGludWUgPSB0cnVlO1xuICAgICAgICB3aGlsZSAoYkNvbnRpbnVlKSB7XG4gICAgICAgICAgICBsZXQgbmV4dFZhbCA9IGN0cmwuanVtcE5leHQobW9kZSk7XG4gICAgICAgICAgICBpZiAobmV4dFZhbC5zdWNjZXNzKSB7XG4gICAgICAgICAgICAgICAgLy8gbW9kZSA9PT0gXCJpdGVtXCIgJiYgY29uc29sZS5sb2cobmV4dFZhbCk7XG4gICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKG5leHRWYWwucmVuZGVyaW5nUmVzdWx0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYkNvbnRpbnVlID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyByZW5kZXJTdHJ1Y3R1cmUoZG9jOiBIVE1MRG9jdW1lbnQpOiBBcnJheTx7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9PiB7XG4gICAgICAgIGNvbnN0IG1vZGVzOiBOYXZpZ2F0aW9uTW9kZVtdID0gWyBcInJlZ2lvblwiLCBcImhlYWRpbmdcIiwgXCJpdGVtXCIsIFwidGFiX2ZvY3VzXCIsIFwiaW1hZ2VcIiBdO1xuICAgICAgICBsZXQgZGV0YWlscyA9IG1vZGVzLm1hcChtb2RlTGFiZWwgPT4gU1JDb250cm9sbGVyLnJlbmRlckFsbERldGFpbChkb2MsIG1vZGVMYWJlbCkpO1xuICAgICAgICBsZXQgcmV0VmFsOiBBcnJheTx7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9PiA9IFtdO1xuICAgICAgICB3aGlsZSAoZGV0YWlscy5zb21lKGRldGFpbCA9PiBkZXRhaWwubGVuZ3RoID4gMCkpIHtcbiAgICAgICAgICAgIGxldCBuZXh0ID0gZGV0YWlsc1swXVswXT8uc3RhcnQ7XG4gICAgICAgICAgICBtb2Rlcy5mb3JFYWNoKChtb2RlLCBpZHgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZGV0YWlsc1tpZHhdLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFuZXh0IHx8IFNSQ3Vyc29yLmNvbXBhcmUoZGV0YWlsc1tpZHhdWzBdLnN0YXJ0LCBuZXh0KSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgPSBkZXRhaWxzW2lkeF1bMF0uc3RhcnQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgbGV0IG5leHRJdGVtOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge307XG4gICAgICAgICAgICBsZXQgaGFzVmFsdWUgPSBmYWxzZTtcbiAgICAgICAgICAgIG1vZGVzLmZvckVhY2goKG1vZGUsIGlkeCkgPT4ge1xuICAgICAgICAgICAgICAgIG5leHRJdGVtW21vZGVdID0gXCJcIjtcbiAgICAgICAgICAgICAgICBpZiAoZGV0YWlsc1tpZHhdLmxlbmd0aCA+IDAgJiYgU1JDdXJzb3IuY29tcGFyZShkZXRhaWxzW2lkeF1bMF0uc3RhcnQsIG5leHQpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIG5leHRJdGVtW21vZGVdID0gZGV0YWlsc1tpZHhdLnNoaWZ0KCkubWVzc2FnZTtcbiAgICAgICAgICAgICAgICAgICAgaGFzVmFsdWUgPSBuZXh0SXRlbVttb2RlXSAhPT0gXCJcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKGhhc1ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbSA9IG5leHQuZ2V0RWxlbWVudCgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdG9yID0gZWxlbSAmJiBTUlV0aWwuZ2V0VW5pcXVlU2VsZWN0b3IoZWxlbSk7XG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdG9yICYmIGRvYy5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKSkge1xuICAgICAgICAgICAgICAgICAgICBuZXh0SXRlbS5zZWxlY3RvciA9IHNlbGVjdG9yO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXRWYWwucHVzaChuZXh0SXRlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG59IiwiaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01XYWxrZXJcIjtcbmltcG9ydCB7IEFjY2Vzc2libGVOYW1lUmVzdWx0LCBBY2NOYW1lVXRpbCB9IGZyb20gXCIuLi91dGlsL0FjY05hbWVVdGlsXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgU1JVdGlsIH0gZnJvbSBcIi4vU1JVdGlsXCI7XG5cbi8qKlxuICogRnVuY3Rpb24gdHlwZSBmb3IgbWF0Y2hpbmcgbm9kZXMgZHVyaW5nIGN1cnNvciBuYXZpZ2F0aW9uXG4gKiBAcGFyYW0gcm9sZSAtIFRoZSBBUklBIHJvbGUgb2YgdGhlIGN1cnJlbnQgbm9kZVxuICogQHBhcmFtIGJTdGFydFRhZyAtIFdoZXRoZXIgdGhpcyBpcyBhIHN0YXJ0IHRhZyAodHJ1ZSkgb3IgZW5kIHRhZyAoZmFsc2UpXG4gKiBAcGFyYW0gbm9kZSAtIFRoZSBET00gbm9kZSBiZWluZyBldmFsdWF0ZWRcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIG5vZGUgbWF0Y2hlcyB0aGUgY3JpdGVyaWEsIGZhbHNlIG90aGVyd2lzZVxuICovXG5leHBvcnQgdHlwZSBTUkN1cnNvck1hdGNoRnVuYyA9IChyb2xlOiBzdHJpbmcsIGJTdGFydFRhZzogYm9vbGVhbiwgbm9kZTogTm9kZSkgPT4gYm9vbGVhbjtcblxuZXhwb3J0IHR5cGUgU1JDdXJzb3JTa2lwRnVuYyA9IChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7IHNraXBDdXJyZW50OiBib29sZWFuLCBza2lwQ2hpbGRyZW46IGJvb2xlYW59IHwgbnVsbDtcblxuLyoqXG4gKiBTUkN1cnNvciAoU2NyZWVuIFJlYWRlciBDdXJzb3IpIGNsYXNzXG4gKlxuICogVGhpcyBjbGFzcyBwcm92aWRlcyBhIGN1cnNvci1saWtlIGludGVyZmFjZSBmb3IgbmF2aWdhdGluZyB0aGUgRE9NIGluIGEgd2F5IHRoYXRcbiAqIHNpbXVsYXRlcyBob3cgc2NyZWVuIHJlYWRlcnMgcHJvY2VzcyBhbmQgbmF2aWdhdGUgY29udGVudC4gSXQgdHJhY2tzOlxuICogLSBUaGUgY3VycmVudCBub2RlIHBvc2l0aW9uXG4gKiAtIFdoZXRoZXIgaXQncyBhdCBhIHN0YXJ0IG9yIGVuZCB0YWdcbiAqIC0gVGhlIEFSSUEgcm9sZSBvZiB0aGUgY3VycmVudCBub2RlXG4gKiAtIFRoZSBhY2Nlc3NpYmxlIG5hbWUgb2YgdGhlIGN1cnJlbnQgbm9kZVxuICovXG5leHBvcnQgY2xhc3MgU1JDdXJzb3Ige1xuICAgIC8qKiBUaGUgQVJJQSByb2xlIG9mIHRoZSBjdXJyZW50IG5vZGUgKi9cbiAgICBwcml2YXRlIHJvbGU6IHN0cmluZztcbiAgICAvKiogVGhlIGNvbXB1dGVkIGFjY2Vzc2libGUgbmFtZSBvZiB0aGUgY3VycmVudCBub2RlICovXG4gICAgcHJpdmF0ZSBuYW1lOiBBY2Nlc3NpYmxlTmFtZVJlc3VsdDtcbiAgICAvKiogVGhlIHVuZGVybHlpbmcgRE9NIHdhbGtlciB0aGF0IGhhbmRsZXMgbm9kZSB0cmF2ZXJzYWwgKi9cbiAgICBwcml2YXRlIHdhbGtlcjogRE9NV2Fsa2VyO1xuICAgIFxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgU1JDdXJzb3IgcG9zaXRpb25lZCBhdCB0aGUgc3BlY2lmaWVkIGVsZW1lbnRcbiAgICAgKiBAcGFyYW0gZWxlbWVudCAtIFRoZSBET00gbm9kZSB0byBwb3NpdGlvbiB0aGUgY3Vyc29yIGF0XG4gICAgICogQHBhcmFtIGJFbmQgLSBXaGV0aGVyIHRvIHBvc2l0aW9uIGF0IHRoZSBlbmQgdGFnICh0cnVlKSBvciBzdGFydCB0YWcgKGZhbHNlKVxuICAgICAqL1xuICAgIGNvbnN0cnVjdG9yKGVsZW1lbnQgOiBOb2RlLCBiRW5kPyA6IGJvb2xlYW4pIHtcbiAgICAgICAgLy8gVXNlIERPTVdhbGtlciB3aXRoIGNvbnNpZGVySGlkZGVuPWZhbHNlIHRvIHByb2Nlc3MgYWxsIGNvbnRlbnQgKGluY2x1ZGluZyBoaWRkZW4gZWxlbWVudHMpXG4gICAgICAgIC8vIFRoaXMgaXMgaW1wb3J0YW50IGZvciBzY3JlZW4gcmVhZGVyIHNpbXVsYXRpb24gd2hpY2ggbmVlZHMgdG8gc2VlIGFsbCBjb250ZW50XG4gICAgICAgIHRoaXMud2Fsa2VyID0gbmV3IERPTVdhbGtlcihlbGVtZW50LCBiRW5kLCB1bmRlZmluZWQsIGZhbHNlKTtcbiAgICAgICAgaWYgKGVsZW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaE5hbWUoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBjb3B5IG9mIHRoaXMgY3Vyc29yIGF0IHRoZSBzYW1lIHBvc2l0aW9uXG4gICAgICogQHJldHVybnMgQSBuZXcgU1JDdXJzb3IgaW5zdGFuY2Ugd2l0aCB0aGUgc2FtZSBwb3NpdGlvbiBhbmQgcHJvcGVydGllc1xuICAgICAqL1xuICAgIGNsb25lKCkgOiBTUkN1cnNvciB7XG4gICAgICAgIGxldCByZXRWYWwgPSBuZXcgU1JDdXJzb3IodGhpcy53YWxrZXIubm9kZSwgdGhpcy53YWxrZXIuYkVuZFRhZyk7XG4gICAgICAgIHJldFZhbC5yb2xlID0gdGhpcy5yb2xlO1xuICAgICAgICByZXRWYWwubmFtZSA9IHRoaXMubmFtZTtcbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIHRoZSByb2xlIGFuZCBhY2Nlc3NpYmxlIG5hbWUgcHJvcGVydGllcyBiYXNlZCBvbiB0aGUgY3VycmVudCBub2RlXG4gICAgICogVGhpcyBpcyBjYWxsZWQgd2hlbmV2ZXIgdGhlIGN1cnNvciBwb3NpdGlvbiBjaGFuZ2VzXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHJlZnJlc2hOYW1lKCkge1xuICAgICAgICBpZiAodGhpcy53YWxrZXIubm9kZS5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgLy8gRWxlbWVudCBub2RlXG4gICAgICAgICAgICB0aGlzLnJvbGUgPSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUodGhpcy53YWxrZXIubm9kZSBhcyBIVE1MRWxlbWVudCwgdHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLm5hbWUgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWUodGhpcy53YWxrZXIubm9kZSBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy53YWxrZXIubm9kZS5ub2RlVHlwZSA9PT0gMykge1xuICAgICAgICAgICAgLy8gVGV4dCBub2RlXG4gICAgICAgICAgICB0aGlzLnJvbGUgPSBcInRleHRcIjtcbiAgICAgICAgICAgIHRoaXMubmFtZSA9IHsgbmFtZTogdGhpcy53YWxrZXIubm9kZS50ZXh0Q29udGVudCwgbmFtZUZyb206IFwidGV4dFwiIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBPdGhlciBub2RlIHR5cGVzXG4gICAgICAgICAgICB0aGlzLnJvbGUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0aGlzLm5hbWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNb3ZlcyB0aGUgY3Vyc29yIHRvIHRoZSBuZXh0IG5vZGUgdGhhdCBtYXRjaGVzIHRoZSBwcm92aWRlZCBjcml0ZXJpYVxuICAgICAqIEBwYXJhbSBtYXRjaGluZ0Z1bmMgLSBGdW5jdGlvbiB0aGF0IGRldGVybWluZXMgaWYgYSBub2RlIG1hdGNoZXMgdGhlIHNlYXJjaCBjcml0ZXJpYVxuICAgICAqIEByZXR1cm5zIHRydWUgaWYgYSBtYXRjaGluZyBub2RlIHdhcyBmb3VuZCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgICovXG4gICAgcHVibGljIG5leHQobWF0Y2hpbmdGdW5jOiBTUkN1cnNvck1hdGNoRnVuYywgc2tpcEZ1bmM/OiBTUkN1cnNvclNraXBGdW5jKSA6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBERUJVRyA9IGZhbHNlO1xuXG4gICAgICAgIC8vIGNvbnN0IERFQlVHID0gZmFsc2U7XG4gICAgICAgIGxldCBmb3VuZE5leHQgPSBmYWxzZTtcblxuICAgICAgICAvLyBHZXQgdGhlIHNraXAgaW5mbyBmb3IgdGhlIGN1cnJlbnQgc3BvdFxuICAgICAgICB0aGlzLnJlZnJlc2hOYW1lKCk7XG4gICAgICAgIERFQlVHICYmIGNvbnNvbGUuZ3JvdXAoYG5leHQgZnVuY3Rpb25gKTtcbiAgICAgICAgREVCVUcgJiYgY29uc29sZS5sb2codGhpcy5pc0VuZFRhZygpP1wiL1wiOlwiXCIsIHRoaXMuZ2V0Tm9kZSgpKTtcbiAgICAgICAgbGV0IHsgc2tpcEN1cnJlbnQsIHNraXBDaGlsZHJlbiB9ID0gKHNraXBGdW5jICYmIHNraXBGdW5jKHRoaXMpKSB8fCB7IHNraXBDdXJyZW50OiBmYWxzZSwgc2tpcENoaWxkcmVuOiBmYWxzZSB9O1xuICAgICAgICBERUJVRyAmJiBjb25zb2xlLmxvZyhcInNraXBDdXJyZW50OlwiLCBza2lwQ3VycmVudCwgXCJza2lwQ2hpbGRyZW46XCIsIHNraXBDaGlsZHJlbik7XG5cbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgLy8gTW92ZSBhcyBhcHByb3ByaWF0ZSBmcm9tIHRoZSBjdXJyZW50IHNwb3RcbiAgICAgICAgICAgIGlmIChza2lwQ2hpbGRyZW4gJiYgIXRoaXMud2Fsa2VyLmJFbmRUYWcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLndhbGtlci5iRW5kVGFnID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMud2Fsa2VyLm5leHROb2RlKCkpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBza2lwIGluZm8gZm9yIHRoZSBuZXcgc3BvdFxuICAgICAgICAgICAgdGhpcy5yZWZyZXNoTmFtZSgpO1xuICAgICAgICAgICAgREVCVUcgJiYgY29uc29sZS5sb2codGhpcy5pc0VuZFRhZygpP1wiL1wiOlwiXCIsIHRoaXMuZ2V0Tm9kZSgpKTtcbiAgICAgICAgICAgICh7IHNraXBDdXJyZW50LCBza2lwQ2hpbGRyZW4gfSA9IChza2lwRnVuYyAmJiBza2lwRnVuYyh0aGlzKSkgfHwgeyBza2lwQ3VycmVudDogZmFsc2UsIHNraXBDaGlsZHJlbjogZmFsc2UgfSk7XG4gICAgICAgICAgICBERUJVRyAmJiBjb25zb2xlLmxvZyhcInNraXBDdXJyZW50OlwiLCBza2lwQ3VycmVudCwgXCJza2lwQ2hpbGRyZW46XCIsIHNraXBDaGlsZHJlbik7XG5cbiAgICAgICAgICAgIC8vIFVwZGF0ZSByb2xlIGJhc2VkIG9uIG5vZGUgdHlwZVxuICAgICAgICAgICAgaWYgKHRoaXMud2Fsa2VyLm5vZGUubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJvbGUgPSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUodGhpcy53YWxrZXIubm9kZSBhcyBIVE1MRWxlbWVudCwgdHJ1ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMud2Fsa2VyLm5vZGUubm9kZVR5cGUgPT09IDMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJvbGUgPSBcInRleHRcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChTUlV0aWwuaXNNb2RhbERpYWxvZ0VsZW1lbnQodGhpcy5nZXROb2RlKCkpICYmIHRoaXMuaXNFbmRUYWcoKSkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXNraXBDdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBub2RlIG1hdGNoZXMgb3VyIGNyaXRlcmlhXG4gICAgICAgICAgICAgICAgZm91bmROZXh0ID0gbWF0Y2hpbmdGdW5jKHRoaXMucm9sZSwgIXRoaXMud2Fsa2VyLmJFbmRUYWcsIHRoaXMud2Fsa2VyLm5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IHdoaWxlICghZm91bmROZXh0KTtcbiAgICAgICAgREVCVUcgJiYgY29uc29sZS5sb2coXCJmb3VuZE5leHQ6XCIsIGZvdW5kTmV4dCwgdGhpcy5pc0VuZFRhZygpP1wiL1wiOlwiXCIsIHRoaXMuZ2V0Tm9kZSgpKTtcbiAgICAgICAgREVCVUcgJiYgY29uc29sZS5ncm91cEVuZCgpO1xuXG4gICAgICAgIGlmIChmb3VuZE5leHQpIHtcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaE5hbWUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFJlc2V0IHByb3BlcnRpZXMgaWYgbm8gbWF0Y2ggd2FzIGZvdW5kXG4gICAgICAgICAgICB0aGlzLnJvbGUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0aGlzLm5hbWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZvdW5kTmV4dDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBNb3ZlcyB0aGUgY3Vyc29yIHRvIHRoZSBwcmV2aW91cyBub2RlIHRoYXQgbWF0Y2hlcyB0aGUgcHJvdmlkZWQgY3JpdGVyaWFcbiAgICAgKiBAcGFyYW0gbWF0Y2hpbmdGdW5jIC0gRnVuY3Rpb24gdGhhdCBkZXRlcm1pbmVzIGlmIGEgbm9kZSBtYXRjaGVzIHRoZSBzZWFyY2ggY3JpdGVyaWFcbiAgICAgKiBAcmV0dXJucyB0cnVlIGlmIGEgbWF0Y2hpbmcgbm9kZSB3YXMgZm91bmQsIGZhbHNlIG90aGVyd2lzZVxuICAgICAqL1xuICAgIHB1YmxpYyBwcmV2aW91cyhtYXRjaGluZ0Z1bmM6IFNSQ3Vyc29yTWF0Y2hGdW5jLCBza2lwRnVuYz86IFNSQ3Vyc29yU2tpcEZ1bmMpIDogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IERFQlVHID0gZmFsc2U7XG4gICAgICAgIGxldCBmb3VuZFByZXZpb3VzID0gZmFsc2U7XG5cbiAgICAgICAgLy8gR2V0IHRoZSBza2lwIGluZm8gZm9yIHRoZSBjdXJyZW50IHNwb3RcbiAgICAgICAgdGhpcy5yZWZyZXNoTmFtZSgpO1xuICAgICAgICBERUJVRyAmJiBjb25zb2xlLmdyb3VwKGBwcmV2aW91cyBmdW5jdGlvbmApO1xuICAgICAgICBERUJVRyAmJiBjb25zb2xlLmxvZyh0aGlzLmlzRW5kVGFnKCksIHRoaXMuZ2V0Tm9kZSgpKTtcbiAgICAgICAgbGV0IHsgc2tpcEN1cnJlbnQsIHNraXBDaGlsZHJlbiB9ID0gKHNraXBGdW5jICYmIHNraXBGdW5jKHRoaXMpKSB8fCB7IHNraXBDdXJyZW50OiBmYWxzZSwgc2tpcENoaWxkcmVuOiBmYWxzZSB9O1xuICAgICAgICBERUJVRyAmJiBjb25zb2xlLmxvZyhza2lwQ3VycmVudCwgc2tpcENoaWxkcmVuKTtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgLy8gTW92ZSBhcyBhcHByb3ByaWF0ZSBmcm9tIHRoZSBjdXJyZW50IHNwb3RcbiAgICAgICAgICAgIGlmIChza2lwQ2hpbGRyZW4gJiYgdGhpcy53YWxrZXIuYkVuZFRhZykge1xuICAgICAgICAgICAgICAgIERFQlVHICYmIGNvbnNvbGUubG9nKFwiU2tpcHBpbmcgbm9kZVwiKVxuICAgICAgICAgICAgICAgIHRoaXMud2Fsa2VyLmJFbmRUYWcgPSBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRoaXMud2Fsa2VyLnByZXZOb2RlKCkpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBza2lwIGluZm8gZm9yIHRoZSBuZXcgc3BvdFxuICAgICAgICAgICAgdGhpcy5yZWZyZXNoTmFtZSgpO1xuICAgICAgICAgICAgREVCVUcgJiYgY29uc29sZS5sb2codGhpcy5pc0VuZFRhZygpLCB0aGlzLmdldE5vZGUoKSk7XG4gICAgICAgICAgICAoeyBza2lwQ3VycmVudCwgc2tpcENoaWxkcmVuIH0gPSAoc2tpcEZ1bmMgJiYgc2tpcEZ1bmModGhpcykpIHx8IHsgc2tpcEN1cnJlbnQ6IGZhbHNlLCBza2lwQ2hpbGRyZW46IGZhbHNlIH0pO1xuICAgICAgICAgICAgREVCVUcgJiYgY29uc29sZS5sb2coc2tpcEN1cnJlbnQsIHNraXBDaGlsZHJlbik7XG5cbiAgICAgICAgICAgIC8vIFVwZGF0ZSByb2xlIGJhc2VkIG9uIG5vZGUgdHlwZVxuICAgICAgICAgICAgaWYgKHRoaXMud2Fsa2VyLm5vZGUubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJvbGUgPSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUodGhpcy53YWxrZXIubm9kZSBhcyBIVE1MRWxlbWVudCwgdHJ1ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMud2Fsa2VyLm5vZGUubm9kZVR5cGUgPT09IDMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJvbGUgPSBcInRleHRcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChTUlV0aWwuaXNNb2RhbERpYWxvZ0VsZW1lbnQodGhpcy5nZXROb2RlKCkpICYmICF0aGlzLmlzRW5kVGFnKCkpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghc2tpcEN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGlzIG5vZGUgbWF0Y2hlcyBvdXIgY3JpdGVyaWFcbiAgICAgICAgICAgICAgICBmb3VuZFByZXZpb3VzID0gbWF0Y2hpbmdGdW5jKHRoaXMucm9sZSwgIXRoaXMud2Fsa2VyLmJFbmRUYWcsIHRoaXMud2Fsa2VyLm5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IHdoaWxlICghZm91bmRQcmV2aW91cyk7XG4gICAgICAgIERFQlVHICYmIGNvbnNvbGUubG9nKHRoaXMuaXNFbmRUYWcoKSwgdGhpcy5nZXROb2RlKCkpO1xuICAgICAgICBERUJVRyAmJiBjb25zb2xlLmdyb3VwRW5kKCk7XG4gICAgICAgIGlmIChmb3VuZFByZXZpb3VzKSB7XG4gICAgICAgICAgICB0aGlzLnJlZnJlc2hOYW1lKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBSZXNldCBwcm9wZXJ0aWVzIGlmIG5vIG1hdGNoIHdhcyBmb3VuZFxuICAgICAgICAgICAgdGhpcy5yb2xlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5uYW1lID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmb3VuZFByZXZpb3VzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1vdmVzIHRoZSBjdXJzb3IgdG8gdGhlIHBhcmVudCBub2RlIG9mIHRoZSBjdXJyZW50IG5vZGVcbiAgICAgKiBAcGFyYW0gZW5kVGFnIC0gV2hldGhlciB0byBwb3NpdGlvbiBhdCB0aGUgZW5kIHRhZyAodHJ1ZSkgb3Igc3RhcnQgdGFnIChmYWxzZSlcbiAgICAgKiBAcmV0dXJucyB0cnVlIGlmIHN1Y2Nlc3NmdWxseSBtb3ZlZCB0byBwYXJlbnQsIGZhbHNlIGlmIG5vIHBhcmVudCBleGlzdHNcbiAgICAgKi9cbiAgICBwdWJsaWMgcGFyZW50KGVuZFRhZz86IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKCF0aGlzLndhbGtlci5ub2RlLnBhcmVudE5vZGUpIHJldHVybiBmYWxzZTtcbiAgICAgICAgdGhpcy53YWxrZXIubm9kZSA9IHRoaXMud2Fsa2VyLm5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgdGhpcy53YWxrZXIuYkVuZFRhZyA9IGVuZFRhZyA9PT0gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMud2Fsa2VyLm5vZGUubm9kZVR5cGUgPT09IDEpIHtcbiAgICAgICAgICAgIHRoaXMucm9sZSA9IEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZSh0aGlzLndhbGtlci5ub2RlIGFzIEhUTUxFbGVtZW50LCB0cnVlKTtcbiAgICAgICAgICAgIHRoaXMubmFtZSA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZSh0aGlzLndhbGtlci5ub2RlIGFzIEhUTUxFbGVtZW50KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLndhbGtlci5ub2RlLm5vZGVUeXBlID09PSAzKSB7XG4gICAgICAgICAgICB0aGlzLnJvbGUgPSBcInRleHRcIjtcbiAgICAgICAgICAgIHRoaXMubmFtZSA9IHsgbmFtZTogdGhpcy53YWxrZXIubm9kZS50ZXh0Q29udGVudCwgbmFtZUZyb206IFwidGV4dFwiIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJvbGUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB0aGlzLm5hbWUgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTW92ZXMgdGhlIGN1cnNvciB1cCB0aGUgRE9NIHRyZWUgdW50aWwgZmluZGluZyBhIG5vZGUgd2l0aCBhIG1hdGNoaW5nIHJvbGUgb3IgZWxlbWVudCBuYW1lXG4gICAgICogQHBhcmFtIHJvbGVzIC0gQXJyYXkgb2YgQVJJQSByb2xlcyB0byBtYXRjaFxuICAgICAqIEBwYXJhbSBlbGVtcyAtIE9wdGlvbmFsIGFycmF5IG9mIGVsZW1lbnQgbmFtZXMgdG8gbWF0Y2hcbiAgICAgKiBAcmV0dXJucyB0cnVlIGlmIGEgbWF0Y2hpbmcgbm9kZSB3YXMgZm91bmQsIGZhbHNlIG90aGVyd2lzZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRDdXJyZW50T3JQYXJlbnRCeVJvbGUocm9sZXM6IHN0cmluZ1tdLCBlbGVtcz86IHN0cmluZ1tdKSB7XG4gICAgICAgIGNvbnN0IHVwcEVsZW1zID0gZWxlbXMgPyBlbGVtcy5tYXAoZWxlbSA9PiBlbGVtLnRvVXBwZXJDYXNlKCkpIDogW107XG4gICAgICAgIGNvbnN0IG1hdGNoZXMgPSAod2Fsa2VyOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgY29uc3QgZWxlbSA9IHdhbGtlci5nZXRFbGVtZW50KCk7XG4gICAgICAgICAgICByZXR1cm4gcm9sZXMuaW5jbHVkZXModGhpcy5nZXRSb2xlKCkpXG4gICAgICAgICAgICB8fCAoZWxlbSAmJiAhZWxlbS5oYXNBdHRyaWJ1dGUoXCJyb2xlXCIpICYmIHVwcEVsZW1zLmluY2x1ZGVzKGVsZW0ubm9kZU5hbWUudG9VcHBlckNhc2UoKSkpO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlICghbWF0Y2hlcyh0aGlzKSAmJiB0aGlzLnBhcmVudCgpKTtcbiAgICAgICAgcmV0dXJuIG1hdGNoZXModGhpcyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBjdXJzb3IgYW5kIG1vdmVzIGl0IHVwIHRoZSBET00gdHJlZSB1bnRpbCBmaW5kaW5nIGEgbm9kZSB3aXRoIGEgbWF0Y2hpbmcgcm9sZSBvciBlbGVtZW50IG5hbWVcbiAgICAgKiBAcGFyYW0gcm9sZXMgLSBBcnJheSBvZiBBUklBIHJvbGVzIHRvIG1hdGNoXG4gICAgICogQHBhcmFtIGVsZW1zIC0gT3B0aW9uYWwgYXJyYXkgb2YgZWxlbWVudCBuYW1lcyB0byBtYXRjaFxuICAgICAqIEByZXR1cm5zIEEgbmV3IGN1cnNvciBhdCB0aGUgbWF0Y2hpbmcgbm9kZSwgb3IgbnVsbCBpZiBubyBtYXRjaCBmb3VuZFxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRDdXJyZW50T3JQYXJlbnRCeVJvbGVDbG9uZShyb2xlczogc3RyaW5nW10sIGVsZW1zPzogc3RyaW5nW10pIHtcbiAgICAgICAgbGV0IHJldFZhbCA9IHRoaXMuY2xvbmUoKTtcbiAgICAgICAgaWYgKHJldFZhbC5nZXRDdXJyZW50T3JQYXJlbnRCeVJvbGUocm9sZXMsIGVsZW1zKSkge1xuICAgICAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Q3VycmVudE9yUGFyZW50VGFiYmFibGVDbG9uZSgpIHtcbiAgICAgICAgbGV0IHJldFZhbCA9IHRoaXMuY2xvbmUoKTtcbiAgICAgICAgd2hpbGUgKHJldFZhbCkge1xuICAgICAgICAgICAgY29uc3QgZWxlbSA9IHJldFZhbC5nZXRFbGVtZW50KCk7XG4gICAgICAgICAgICBpZiAocmV0VmFsLmlzU3RhcnRUYWcoKSAmJiBlbGVtICYmIENvbW1vblV0aWwuaXNUYWJiYWJsZShlbGVtKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXJldFZhbC5wYXJlbnQoZmFsc2UpKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgQVJJQSByb2xlIG9mIHRoZSBjdXJyZW50IG5vZGVcbiAgICAgKiBAcmV0dXJucyBUaGUgQVJJQSByb2xlIGFzIGEgc3RyaW5nLCBvciB1bmRlZmluZWQgaWYgbm90IGF2YWlsYWJsZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRSb2xlKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvbGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgYWNjZXNzaWJsZSBuYW1lIGluZm8gZm9yIHRoZSBjdXJyZW50IG5vZGVcbiAgICAgKiBAcmV0dXJucyBUaGUgQWNjZXNzaWJsZU5hbWVSZXN1bHQgb2JqZWN0LCBvciB1bmRlZmluZWQgaWYgbm90IGF2YWlsYWJsZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXROYW1lSW5mbygpOiBBY2Nlc3NpYmxlTmFtZVJlc3VsdCB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiB0aGlzLm5hbWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBhY2Nlc3NpYmxlIG5hbWUgb2YgdGhlIGN1cnJlbnQgbm9kZVxuICAgICAqL1xuICAgIHB1YmxpYyBnZXROYW1lKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgICAgIC8vIEhhbmRsZSBvbmUtb2ZmIHF1aXJrcyBpbiB0aGUgbmFtZSBjYWxjdWxhdGlvblxuICAgICAgICBjb25zdCBuYW1lSW5mbyA9IHRoaXMuZ2V0TmFtZUluZm8oKTtcbiAgICAgICAgaWYgKG5hbWVJbmZvICYmIG5hbWVJbmZvLm5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBuYW1lSW5mby5uYW1lO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVsZW0gPSB0aGlzLmdldEVsZW1lbnQoKTtcbiAgICAgICAgaWYgKGVsZW0pIHtcbiAgICAgICAgICAgIGNvbnN0IGxhYmVsRWxlbSA9IENvbW1vblV0aWwuZ2V0TGFiZWxGb3JFbGVtZW50SGlkZGVuKGVsZW0sIHRydWUpO1xuICAgICAgICAgICAgaWYgKGxhYmVsRWxlbSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBsYWJlbEVsZW0uaW5uZXJUZXh0IHx8IGxhYmVsRWxlbS50ZXh0Q29udGVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFNldHMgd2hldGhlciB0aGUgY3Vyc29yIGlzIGF0IGFuIGVuZCB0YWcgb3Igc3RhcnQgdGFnXG4gICAgICogQHBhcmFtIHZhbCAtIFRydWUgZm9yIGVuZCB0YWcsIGZhbHNlIGZvciBzdGFydCB0YWdcbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0RW5kVGFnKHZhbDogYm9vbGVhbikge1xuICAgICAgICB0aGlzLndhbGtlci5iRW5kVGFnID0gdmFsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIERPTSBub2RlIGF0IHRoZSBjdXJyZW50IGN1cnNvciBwb3NpdGlvblxuICAgICAqIEByZXR1cm5zIFRoZSBjdXJyZW50IERPTSBub2RlXG4gICAgICovXG4gICAgcHVibGljIGdldE5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLndhbGtlci5ub2RlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGN1cnJlbnQgbm9kZSBhcyBhbiBIVE1MRWxlbWVudCBpZiBpdCBpcyBhbiBlbGVtZW50IG5vZGVcbiAgICAgKiBAcmV0dXJucyBUaGUgY3VycmVudCBub2RlIGFzIEhUTUxFbGVtZW50LCBvciB1bmRlZmluZWQgaWYgbm90IGFuIGVsZW1lbnRcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0RWxlbWVudCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLndhbGtlci5ub2RlKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICBpZiAodGhpcy53YWxrZXIubm9kZS5ub2RlVHlwZSAhPT0gMSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHRoaXMud2Fsa2VyLm5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFBhcmVudEVsZW1lbnQoKSB7XG4gICAgICAgIGlmICghdGhpcy53YWxrZXIubm9kZSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCByZXRWYWwgPSB0aGlzLmNsb25lKCk7XG4gICAgICAgIHJldFZhbC53YWxrZXIubm9kZSA9IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KHJldFZhbC53YWxrZXIubm9kZSk7XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSBjdXJzb3IgaXMgcG9zaXRpb25lZCBhdCBhbiBlbmQgdGFnXG4gICAgICogQHJldHVybnMgdHJ1ZSBpZiBhdCBhbiBlbmQgdGFnLCBmYWxzZSBpZiBhdCBhIHN0YXJ0IHRhZ1xuICAgICAqL1xuICAgIHB1YmxpYyBpc0VuZFRhZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud2Fsa2VyLmJFbmRUYWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSBjdXJzb3IgaXMgcG9zaXRpb25lZCBhdCBhbiBlbmQgdGFnXG4gICAgICogQHJldHVybnMgdHJ1ZSBpZiBhdCBhbiBlbmQgdGFnLCBmYWxzZSBpZiBhdCBhIHN0YXJ0IHRhZ1xuICAgICAqL1xuICAgIHB1YmxpYyBpc1N0YXJ0VGFnKCkge1xuICAgICAgICByZXR1cm4gIXRoaXMud2Fsa2VyLmJFbmRUYWc7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29tcGFyZXMgdGhlIGRvY3VtZW50IHBvc2l0aW9uIG9mIHR3byBjdXJzb3JzXG4gICAgICogQHBhcmFtIG9uZSAtIEZpcnN0IGN1cnNvciB0byBjb21wYXJlXG4gICAgICogQHBhcmFtIHR3byAtIFNlY29uZCBjdXJzb3IgdG8gY29tcGFyZVxuICAgICAqIEByZXR1cm5zIDAgaWYgZXF1YWwsIC0xIGlmIG9uZSBpcyBiZWZvcmUgdHdvLCAxIGlmIG9uZSBpcyBhZnRlciB0d29cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGNvbXBhcmUob25lOiBTUkN1cnNvciB8IG51bGwsIHR3bzogU1JDdXJzb3IgfCBudWxsKSB7XG4gICAgICAgIGNvbnN0IG5vZGVPbmUgPSBvbmU/LndhbGtlcj8ubm9kZTtcbiAgICAgICAgY29uc3Qgbm9kZVR3byA9IHR3bz8ud2Fsa2VyPy5ub2RlO1xuICAgICAgICBpZiAoIW5vZGVPbmUgJiYgIW5vZGVUd28pIHJldHVybiAwO1xuICAgICAgICBpZiAoIW5vZGVPbmUpIHJldHVybiAxO1xuICAgICAgICBpZiAoIW5vZGVUd28pIHJldHVybiAtMTtcbiAgICAgICAgXG4gICAgICAgIGxldCBkb2NQb3NpdGlvbiA9IG5vZGVPbmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24obm9kZVR3byk7XG4gICAgICAgIFxuICAgICAgICAvLyBIYW5kbGUgZGlzY29ubmVjdGVkIG5vZGVzIChkaWZmZXJlbnQgZG9jdW1lbnRzIG9yIHNoYWRvdyBET01zKVxuICAgICAgICBpZiAoZG9jUG9zaXRpb24gJiAweDEpIHtcbiAgICAgICAgICAgIC8vIE5vZGVzIGFyZSBkaXNjb25uZWN0ZWQgLSB0aGV5J3JlIGluIGRpZmZlcmVudCB0cmVlcyAoaWZyYW1lIG9yIHNoYWRvdyBET00pXG4gICAgICAgICAgICAvLyBCdWlsZCBhbmNlc3RvciBjaGFpbnMgdXNpbmcgRE9NV2Fsa2VyLnBhcmVudE5vZGUgKGhhbmRsZXMgc2hhZG93IERPTSAmIGlmcmFtZXMpXG4gICAgICAgICAgICBsZXQgYW5jZXN0b3JzT25lOiBOb2RlW10gPSBbbm9kZU9uZV07XG4gICAgICAgICAgICBsZXQgYW5jZXN0b3JzVHdvOiBOb2RlW10gPSBbbm9kZVR3b107XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGxldCBjdXJyZW50OiBOb2RlIHwgbnVsbCA9IG5vZGVPbmU7XG4gICAgICAgICAgICB3aGlsZSAoY3VycmVudCA9IERPTVdhbGtlci5wYXJlbnROb2RlKGN1cnJlbnQpKSB7XG4gICAgICAgICAgICAgICAgYW5jZXN0b3JzT25lLnB1c2goY3VycmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGN1cnJlbnQgPSBub2RlVHdvO1xuICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnQgPSBET01XYWxrZXIucGFyZW50Tm9kZShjdXJyZW50KSkge1xuICAgICAgICAgICAgICAgIGFuY2VzdG9yc1R3by5wdXNoKGN1cnJlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBSZXZlcnNlIHNvIHJvb3QgaXMgZmlyc3RcbiAgICAgICAgICAgIGFuY2VzdG9yc09uZS5yZXZlcnNlKCk7XG4gICAgICAgICAgICBhbmNlc3RvcnNUd28ucmV2ZXJzZSgpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBGaW5kIHdoZXJlIHRoZSBwYXRocyBkaXZlcmdlXG4gICAgICAgICAgICBsZXQgY29tbW9uRGVwdGggPSAwO1xuICAgICAgICAgICAgd2hpbGUgKGNvbW1vbkRlcHRoIDwgYW5jZXN0b3JzT25lLmxlbmd0aCAmJlxuICAgICAgICAgICAgICAgICAgIGNvbW1vbkRlcHRoIDwgYW5jZXN0b3JzVHdvLmxlbmd0aCAmJlxuICAgICAgICAgICAgICAgICAgIGFuY2VzdG9yc09uZVtjb21tb25EZXB0aF0gPT09IGFuY2VzdG9yc1R3b1tjb21tb25EZXB0aF0pIHtcbiAgICAgICAgICAgICAgICBjb21tb25EZXB0aCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBJZiBvbmUgcGF0aCBpcyBhIHByZWZpeCBvZiB0aGUgb3RoZXIsIGhhbmRsZSBjb250YWlubWVudFxuICAgICAgICAgICAgaWYgKGNvbW1vbkRlcHRoID09PSBhbmNlc3RvcnNPbmUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgLy8gbm9kZU9uZSBpcyBhbiBhbmNlc3RvciBvZiBub2RlVHdvXG4gICAgICAgICAgICAgICAgcmV0dXJuIG9uZS53YWxrZXIuYkVuZFRhZyA/IDEgOiAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjb21tb25EZXB0aCA9PT0gYW5jZXN0b3JzVHdvLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIC8vIG5vZGVUd28gaXMgYW4gYW5jZXN0b3Igb2Ygbm9kZU9uZVxuICAgICAgICAgICAgICAgIHJldHVybiB0d28ud2Fsa2VyLmJFbmRUYWcgPyAtMSA6IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIENvbXBhcmUgdGhlIG5vZGVzIHdoZXJlIHBhdGhzIGRpdmVyZ2VcbiAgICAgICAgICAgIGlmIChjb21tb25EZXB0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgY2hpbGRPbmUgPSBhbmNlc3RvcnNPbmVbY29tbW9uRGVwdGhdO1xuICAgICAgICAgICAgICAgIGxldCBjaGlsZFR3byA9IGFuY2VzdG9yc1R3b1tjb21tb25EZXB0aF07XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgbGV0IGNoaWxkUG9zaXRpb24gPSBjaGlsZE9uZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihjaGlsZFR3byk7XG4gICAgICAgICAgICAgICAgaWYgKGNoaWxkUG9zaXRpb24gJiAweDIpIHJldHVybiAxOyAgLy8gY2hpbGRUd28gcHJlY2VkZXMgY2hpbGRPbmVcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGRQb3NpdGlvbiAmIDB4NCkgcmV0dXJuIC0xOyAvLyBjaGlsZE9uZSBwcmVjZWRlcyBjaGlsZFR3b1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBObyBjb21tb24gYW5jZXN0b3IgZm91bmQgLSBzaG91bGRuJ3QgaGFwcGVuIGluIGEgd2VsbC1mb3JtZWQgZG9jdW1lbnRcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZiAoZG9jUG9zaXRpb24gJiAweDgpIHtcbiAgICAgICAgICAgIC8vIG9uZSBpcyBjb250YWluZWQgd2l0aGluIHR3b1xuICAgICAgICAgICAgLy8gaWYgdHdvIGlzIGFuIGVuZCB0YWcsIG9uZSBpcyBiZWZvcmUsIG90aGVyd2lzZSwgb25lIGlzIGFmdGVyXG4gICAgICAgICAgICByZXR1cm4gdHdvLndhbGtlci5iRW5kVGFnID8gLTEgOiAxO1xuICAgICAgICB9IGVsc2UgaWYgKGRvY1Bvc2l0aW9uICYgMHgxMCkge1xuICAgICAgICAgICAgLy8gdHdvIGlzIGNvbnRhaW5lZCB3aXRoaW4gb25lXG4gICAgICAgICAgICAvLyBpZiBvbmUgaXMgYW4gZW5kIHRhZywgb25lIGlzIGFmdGVyLCBvdGhlcndpc2UsIG9uZSBpcyBiZWZvcmVcbiAgICAgICAgICAgIHJldHVybiBvbmUud2Fsa2VyLmJFbmRUYWcgPyAxIDogLTE7XG4gICAgICAgIH0gZWxzZSBpZiAoZG9jUG9zaXRpb24gJiAweDIpIHtcbiAgICAgICAgICAgIC8vIHR3byBwcmVjZWRlcyBvbmUgaW4gdGhlIGRvY3VtZW50XG4gICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfSBlbHNlIGlmIChkb2NQb3NpdGlvbiAmIDB4NCkge1xuICAgICAgICAgICAgLy8gb25lIHByZWNlZGVzIHR3byBpbiB0aGUgZG9jdW1lbnRcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhpcyBjdXJzb3IncyBub2RlIGNvbnRhaW5zIGFub3RoZXIgY3Vyc29yJ3Mgbm9kZVxuICAgICAqIEBwYXJhbSBvdGhlciAtIFRoZSBvdGhlciBjdXJzb3IgdG8gY2hlY2tcbiAgICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoaXMgY3Vyc29yIGNvbnRhaW5zIChpcyBhIHBhcmVudC9hbmNlc3RvciBvZikgdGhlIG90aGVyIGN1cnNvcidzIG5vZGVcbiAgICAgKi9cbiAgICBwdWJsaWMgY29udGFpbnMob3RoZXI6IFNSQ3Vyc29yKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldE5vZGUoKS5jb250YWlucyhvdGhlci5nZXROb2RlKCkpXG4gICAgICAgICAgICAmJiAhdGhpcy5pc1NhbWVOb2RlKG90aGVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhpcyBjdXJzb3IgcG9pbnRzIHRvIHRoZSBzYW1lIG5vZGUgYXMgYW5vdGhlciBjdXJzb3JcbiAgICAgKiBAcGFyYW0gb3RoZXIgLSBUaGUgb3RoZXIgY3Vyc29yIHRvIGNvbXBhcmUgd2l0aFxuICAgICAqIEByZXR1cm5zIHRydWUgaWYgYm90aCBjdXJzb3JzIHBvaW50IHRvIHRoZSBzYW1lIG5vZGVcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNTYW1lTm9kZShvdGhlcjogU1JDdXJzb3IpIHtcbiAgICAgICAgaWYgKCFvdGhlcikgcmV0dXJuIGZhbHNlO1xuICAgICAgICByZXR1cm4gdGhpcy5nZXROb2RlKCkuaXNTYW1lTm9kZShvdGhlci5nZXROb2RlKCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiB0aGUgY3VycmVudCBub2RlIGhhcyBhIG5vbi1lbXB0eSBhY2Nlc3NpYmxlIG5hbWVcbiAgICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBub2RlIGhhcyBhIG5vbi1lbXB0eSBhY2Nlc3NpYmxlIG5hbWVcbiAgICAgKi9cbiAgICBwdWJsaWMgaGFzTm9uRW1wdHlOYW1lKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMuZ2V0TmFtZUluZm8oKT8ubmFtZSB8fCBcIlwiKS50cmltKCkubGVuZ3RoID4gMDtcbiAgICB9XG5cbn0iLCJpbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuaW1wb3J0IHsgQWNjTmFtZVV0aWwgfSBmcm9tIFwiLi4vdXRpbC9BY2NOYW1lVXRpbFwiO1xuaW1wb3J0IHsgTmF2aWdhdGlvbk1vZGUgfSBmcm9tIFwiLi9TUlR5cGVzXCI7XG5pbXBvcnQgeyBTUkN1cnNvciwgU1JDdXJzb3JNYXRjaEZ1bmMsIFNSQ3Vyc29yU2tpcEZ1bmMgfSBmcm9tIFwiLi9TUkN1cnNvclwiO1xuaW1wb3J0IHsgQ29tbW9uVXRpbCB9IGZyb20gXCIuLi91dGlsL0NvbW1vblV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5cbmV4cG9ydCBuYW1lc3BhY2UgU1JOYXZpZ2F0b3Ige1xuICAgIC8qKlxuICAgICAqIERldGVybWluZSBpZiBhIG5vZGUgaXMgYSBibG9jay1sZXZlbCBlbGVtZW50IGJhc2VkIG9uIGl0cyBkaXNwbGF5IHByb3BlcnR5XG4gICAgICogQHBhcmFtIG5vZGUgVGhlIERPTSBub2RlIHRvIGNoZWNrXG4gICAgICogQHJldHVybnMgdHJ1ZSBpZiB0aGUgbm9kZSBpcyBhIGJsb2NrLWxldmVsIGVsZW1lbnQsIGZhbHNlIG90aGVyd2lzZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzQmxvY2tFbGVtZW50KG5vZGU6IE5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgIT09IDEpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJiclwiKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgY29uc3QgZWxlbSA9IG5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGNvbnN0IG15d2luID0gZWxlbS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3O1xuICAgICAgICBjb25zdCBkaXNwID0gbXl3aW4uZ2V0Q29tcHV0ZWRTdHlsZShlbGVtKT8uZGlzcGxheTtcbiAgICAgICAgaWYgKGRpc3AgJiYgZGlzcC5zdGFydHNXaXRoKFwidGFibGVcIikpIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAoZGlzcCA9PT0gXCJibG9ja1wiICYmIGVsZW0uc3R5bGUuZGlzcGxheSAhPT0gXCJibG9ja1wiKSB7XG4gICAgICAgICAgICAvLyBJcyB0aGlzIGJsb2NrIGJlY2F1c2UgaXQncyBhIGZsZXggZWxlbT9cbiAgICAgICAgICAgIGlmIChlbGVtLnBhcmVudEVsZW1lbnQgJiYgbXl3aW4uZ2V0Q29tcHV0ZWRTdHlsZShlbGVtLnBhcmVudEVsZW1lbnQpLmRpc3BsYXkgPT09IFwiZmxleFwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUoZWxlbSwgdHJ1ZSkgPT09IFwibGlua1wiKSB7XG4gICAgICAgICAgICBsZXQgdGVtcCA9IG5ldyBET01XYWxrZXIobm9kZSwgZmFsc2UsIHVuZGVmaW5lZCwgZmFsc2UpO1xuICAgICAgICAgICAgdGVtcC5wcmV2Tm9kZSgpO1xuICAgICAgICAgICAgaWYgKCFpc0Jsb2NrRWxlbWVudCh0ZW1wLm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtcImJsb2NrXCIsIFwiZmxleFwiLCBcImdyaWRcIiwgXCJsaXN0LWl0ZW1cIl0uaW5jbHVkZXMoZGlzcCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0RXhwbGljaXRUYWJpbmRleChub2RlOiBOb2RlKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgICAgIGlmICghbm9kZSB8fCBub2RlLm5vZGVUeXBlICE9PSAxKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgZWxlbSA9IG5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgIGlmICghZWxlbS5oYXNBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGNvbnN0IHRhYmluZGV4VmFsdWUgPSBwYXJzZUludChlbGVtLmdldEF0dHJpYnV0ZShcInRhYmluZGV4XCIpLCAxMCk7XG4gICAgICAgIHJldHVybiBOdW1iZXIuaXNOYU4odGFiaW5kZXhWYWx1ZSkgPyBudWxsIDogdGFiaW5kZXhWYWx1ZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1Bvc2l0aXZlVGFiRm9jdXMobm9kZTogTm9kZSk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIW5vZGUgfHwgbm9kZS5ub2RlVHlwZSAhPT0gMSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjb25zdCBlbGVtID0gbm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgY29uc3QgZXhwbGljaXRUYWJpbmRleCA9IGdldEV4cGxpY2l0VGFiaW5kZXgoZWxlbSk7XG4gICAgICAgIHJldHVybiBleHBsaWNpdFRhYmluZGV4ICE9PSBudWxsICYmIGV4cGxpY2l0VGFiaW5kZXggPiAwICYmIENvbW1vblV0aWwuaXNUYWJiYWJsZShlbGVtKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0RlZmF1bHRPclplcm9UYWJGb2N1cyhub2RlOiBOb2RlKTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghbm9kZSB8fCBub2RlLm5vZGVUeXBlICE9PSAxKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IGVsZW0gPSBub2RlIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBjb25zdCBleHBsaWNpdFRhYmluZGV4ID0gZ2V0RXhwbGljaXRUYWJpbmRleChlbGVtKTtcbiAgICAgICAgcmV0dXJuIChleHBsaWNpdFRhYmluZGV4ID09PSBudWxsIHx8IGV4cGxpY2l0VGFiaW5kZXggPT09IDApICYmIENvbW1vblV0aWwuaXNUYWJiYWJsZShlbGVtKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRUYWJGb2N1c1N0YXJ0RnVuYyhpbmNsdWRlUG9zaXRpdmVUYWJpbmRleDogYm9vbGVhbiA9IHRydWUpOiBTUkN1cnNvck1hdGNoRnVuYyB7XG4gICAgICAgIHJldHVybiAoX3JvbGU6IHN0cmluZywgYlN0YXJ0VGFnOiBib29sZWFuLCBub2RlOiBOb2RlKSA9PiB7XG4gICAgICAgICAgICBpZiAoIShub2RlICYmIG5vZGUubm9kZVR5cGUgPT09IDEgJiYgYlN0YXJ0VGFnICYmIENvbW1vblV0aWwuaXNUYWJiYWJsZShub2RlKSkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiBpbmNsdWRlUG9zaXRpdmVUYWJpbmRleCB8fCBpc0RlZmF1bHRPclplcm9UYWJGb2N1cyhub2RlKTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb2xsZWN0IGFsbCB0YWJiYWJsZSBlbGVtZW50cyBpbiB0YWIgb3JkZXIgKHBvc2l0aXZlIHRhYmluZGV4IGZpcnN0LCB0aGVuIGRvY3VtZW50IG9yZGVyKVxuICAgICAqIEBwYXJhbSBtYXRjaEZ1bmMgRnVuY3Rpb24gdG8gbWF0Y2ggdGFiYmFibGUgZWxlbWVudHNcbiAgICAgKiBAcGFyYW0gcm9vdE5vZGUgT3B0aW9uYWwgcm9vdCBub2RlIHRvIHN0YXJ0IGNvbGxlY3Rpb24gZnJvbSAoZGVmYXVsdHMgdG8gZG9jdW1lbnQgYm9keSlcbiAgICAgKiBAcmV0dXJucyBBcnJheSBvZiBjdXJzb3JzIHBvaW50aW5nIHRvIHRhYmJhYmxlIGVsZW1lbnRzIGluIHRhYiBvcmRlclxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNvbGxlY3RUYWJGb2N1c0N1cnNvcnMobWF0Y2hGdW5jOiBTUkN1cnNvck1hdGNoRnVuYywgcm9vdE5vZGU/OiBOb2RlKTogU1JDdXJzb3JbXSB7XG4gICAgICAgIGNvbnN0IHJvb3QgPSAocm9vdE5vZGU/Lm93bmVyRG9jdW1lbnQgfHwgZG9jdW1lbnQpLmJvZHkgfHwgcm9vdE5vZGU7XG4gICAgICAgIGlmICghcm9vdCkgcmV0dXJuIFtdO1xuICAgICAgICBsZXQgd2Fsa2VyID0gbmV3IFNSQ3Vyc29yKHJvb3QsIGZhbHNlKTtcbiAgICAgICAgY29uc3Qgc2tpcEZ1bmMgPSBnZXRTa2lwRnVuYyhcInRhYl9mb2N1c1wiKTtcbiAgICAgICAgbGV0IHBvc2l0aXZlUmVzdWx0czogU1JDdXJzb3JbXSA9IFtdO1xuICAgICAgICBsZXQgbm9ybWFsUmVzdWx0czogU1JDdXJzb3JbXSA9IFtdO1xuXG4gICAgICAgIGNvbnN0IGFkZEN1cnNvciA9IChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICBpZiAoIW1hdGNoRnVuYyhjdXJzb3IuZ2V0Um9sZSgpLCAhY3Vyc29yLmlzRW5kVGFnKCksIGN1cnNvci5nZXROb2RlKCkpKSByZXR1cm47XG4gICAgICAgICAgICBpZiAoaXNQb3NpdGl2ZVRhYkZvY3VzKGN1cnNvci5nZXROb2RlKCkpKSB7XG4gICAgICAgICAgICAgICAgcG9zaXRpdmVSZXN1bHRzLnB1c2goY3Vyc29yLmNsb25lKCkpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpc0RlZmF1bHRPclplcm9UYWJGb2N1cyhjdXJzb3IuZ2V0Tm9kZSgpKSkge1xuICAgICAgICAgICAgICAgIG5vcm1hbFJlc3VsdHMucHVzaChjdXJzb3IuY2xvbmUoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgYWRkQ3Vyc29yKHdhbGtlcik7XG4gICAgICAgIHdoaWxlICh3YWxrZXIubmV4dCgoKSA9PiB0cnVlLCBza2lwRnVuYykpIHtcbiAgICAgICAgICAgIGFkZEN1cnNvcih3YWxrZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgcG9zaXRpdmVSZXN1bHRzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGFFbGVtID0gYS5nZXRFbGVtZW50KCk7XG4gICAgICAgICAgICBjb25zdCBiRWxlbSA9IGIuZ2V0RWxlbWVudCgpO1xuICAgICAgICAgICAgY29uc3QgYVRhYmluZGV4ID0gZ2V0RXhwbGljaXRUYWJpbmRleChhRWxlbSkgfHwgMDtcbiAgICAgICAgICAgIGNvbnN0IGJUYWJpbmRleCA9IGdldEV4cGxpY2l0VGFiaW5kZXgoYkVsZW0pIHx8IDA7XG4gICAgICAgICAgICBpZiAoYVRhYmluZGV4ICE9PSBiVGFiaW5kZXgpIHJldHVybiBiVGFiaW5kZXggLSBhVGFiaW5kZXg7XG4gICAgICAgICAgICByZXR1cm4gU1JDdXJzb3IuY29tcGFyZShhLCBiKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHBvc2l0aXZlUmVzdWx0cy5jb25jYXQobm9ybWFsUmVzdWx0cyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmluZCB0aGUgaW5kZXggb2YgYSBjdXJzb3IgaW4gYW4gYXJyYXkgb2YgdGFiIGZvY3VzIGN1cnNvcnNcbiAgICAgKiBAcGFyYW0gY3Vyc29ycyBBcnJheSBvZiBjdXJzb3JzIHRvIHNlYXJjaFxuICAgICAqIEBwYXJhbSB3YWxrZXIgVGhlIGN1cnNvciB0byBmaW5kXG4gICAgICogQHJldHVybnMgVGhlIGluZGV4IG9mIHRoZSBjdXJzb3IsIG9yIC0xIGlmIG5vdCBmb3VuZFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZpbmRUYWJGb2N1c0luZGV4KGN1cnNvcnM6IFNSQ3Vyc29yW10sIHdhbGtlcjogU1JDdXJzb3IpOiBudW1iZXIge1xuICAgICAgICByZXR1cm4gY3Vyc29ycy5maW5kSW5kZXgoY3Vyc29yID0+IFNSQ3Vyc29yLmNvbXBhcmUoY3Vyc29yLCB3YWxrZXIpID09PSAwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIG1hdGNoIGZ1bmN0aW9uIGZvciBpZGVudGlmeWluZyBzdGFydCBwb3NpdGlvbnMgaW4gYSBnaXZlbiBuYXZpZ2F0aW9uIG1vZGVcbiAgICAgKiBAcGFyYW0gbW9kZSBUaGUgbmF2aWdhdGlvbiBtb2RlIChlLmcuLCBcImxpbmtcIiwgXCJoZWFkaW5nXCIsIFwiYnV0dG9uXCIsIGV0Yy4pXG4gICAgICogQHJldHVybnMgQSBmdW5jdGlvbiB0aGF0IG1hdGNoZXMgZWxlbWVudHMgYXBwcm9wcmlhdGUgZm9yIHRoZSBuYXZpZ2F0aW9uIG1vZGVcbiAgICAgKi9cbiAgICBleHBvcnQgZnVuY3Rpb24gZ2V0U3RhcnRGdW5jKG1vZGU6IE5hdmlnYXRpb25Nb2RlKSA6IFNSQ3Vyc29yTWF0Y2hGdW5jIHtcbiAgICAgICAgc3dpdGNoIChtb2RlKSB7XG4gICAgICAgICAgICBjYXNlIFwibGlua1wiOlxuICAgICAgICAgICAgICAgIHJldHVybiAocm9sZTogc3RyaW5nLCBiU3RhcnRUYWc6IGJvb2xlYW4pID0+IChiU3RhcnRUYWcgJiYgcm9sZSA9PT0gXCJsaW5rXCIpO1xuICAgICAgICAgICAgY2FzZSBcInRhYl9mb2N1c1wiOlxuICAgICAgICAgICAgICAgIHJldHVybiBnZXRUYWJGb2N1c1N0YXJ0RnVuYyhmYWxzZSk7XG4gICAgICAgICAgICBjYXNlIFwiaGVhZGluZ1wiOlxuICAgICAgICAgICAgICAgIHJldHVybiAocm9sZTogc3RyaW5nLCBiU3RhcnRUYWc6IGJvb2xlYW4pID0+IChiU3RhcnRUYWcgJiYgcm9sZSA9PT0gXCJoZWFkaW5nXCIpO1xuICAgICAgICAgICAgY2FzZSBcImgxXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIChyb2xlOiBzdHJpbmcsIGJTdGFydFRhZzogYm9vbGVhbiwgbm9kZTogTm9kZSkgPT4gKGJTdGFydFRhZyAmJiByb2xlID09PSBcImhlYWRpbmdcIiAmJiAobm9kZSBhcyBIVE1MRWxlbWVudCkuYXJpYUxldmVsID09PSBcIjFcIik7XG4gICAgICAgICAgICBjYXNlIFwiaDJcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gKHJvbGU6IHN0cmluZywgYlN0YXJ0VGFnOiBib29sZWFuLCBub2RlOiBOb2RlKSA9PiAoYlN0YXJ0VGFnICYmIHJvbGUgPT09IFwiaGVhZGluZ1wiICYmIChub2RlIGFzIEhUTUxFbGVtZW50KS5hcmlhTGV2ZWwgPT09IFwiMlwiKTtcbiAgICAgICAgICAgIGNhc2UgXCJoM1wiOlxuICAgICAgICAgICAgICAgIHJldHVybiAocm9sZTogc3RyaW5nLCBiU3RhcnRUYWc6IGJvb2xlYW4sIG5vZGU6IE5vZGUpID0+IChiU3RhcnRUYWcgJiYgcm9sZSA9PT0gXCJoZWFkaW5nXCIgJiYgKG5vZGUgYXMgSFRNTEVsZW1lbnQpLmFyaWFMZXZlbCA9PT0gXCIzXCIpO1xuICAgICAgICAgICAgY2FzZSBcImg0XCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIChyb2xlOiBzdHJpbmcsIGJTdGFydFRhZzogYm9vbGVhbiwgbm9kZTogTm9kZSkgPT4gKGJTdGFydFRhZyAmJiByb2xlID09PSBcImhlYWRpbmdcIiAmJiAobm9kZSBhcyBIVE1MRWxlbWVudCkuYXJpYUxldmVsID09PSBcIjRcIik7XG4gICAgICAgICAgICBjYXNlIFwiaDVcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gKHJvbGU6IHN0cmluZywgYlN0YXJ0VGFnOiBib29sZWFuLCBub2RlOiBOb2RlKSA9PiAoYlN0YXJ0VGFnICYmIHJvbGUgPT09IFwiaGVhZGluZ1wiICYmIChub2RlIGFzIEhUTUxFbGVtZW50KS5hcmlhTGV2ZWwgPT09IFwiNVwiKTtcbiAgICAgICAgICAgIGNhc2UgXCJoNlwiOlxuICAgICAgICAgICAgICAgIHJldHVybiAocm9sZTogc3RyaW5nLCBiU3RhcnRUYWc6IGJvb2xlYW4sIG5vZGU6IE5vZGUpID0+IChiU3RhcnRUYWcgJiYgcm9sZSA9PT0gXCJoZWFkaW5nXCIgJiYgKG5vZGUgYXMgSFRNTEVsZW1lbnQpLmFyaWFMZXZlbCA9PT0gXCI2XCIpO1xuICAgICAgICAgICAgY2FzZSBcImltYWdlXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIChyb2xlOiBzdHJpbmcsIGJTdGFydFRhZzogYm9vbGVhbikgPT4gKGJTdGFydFRhZyAmJiBbXCJpbWdcIiwgXCJncmFwaGljcy1kb2N1bWVudFwiXS5pbmNsdWRlcyhyb2xlKSk7XG4gICAgICAgICAgICBjYXNlIFwicmFkaW9cIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gKHJvbGU6IHN0cmluZywgYlN0YXJ0VGFnOiBib29sZWFuKSA9PiAoYlN0YXJ0VGFnICYmIHJvbGUgPT09IFwicmFkaW9cIik7XG4gICAgICAgICAgICBjYXNlIFwiYnV0dG9uXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIChyb2xlOiBzdHJpbmcsIGJTdGFydFRhZzogYm9vbGVhbikgPT4gKGJTdGFydFRhZyAmJiByb2xlID09PSBcImJ1dHRvblwiKTtcbiAgICAgICAgICAgIGNhc2UgXCJjaGVja2JveFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiAocm9sZTogc3RyaW5nLCBiU3RhcnRUYWc6IGJvb2xlYW4pID0+IChiU3RhcnRUYWcgJiYgcm9sZSA9PT0gXCJjaGVja2JveFwiKTtcbiAgICAgICAgICAgIGNhc2UgXCJjb21ib1wiOiAgICAgICBcbiAgICAgICAgICAgICAgICByZXR1cm4gKHJvbGU6IHN0cmluZywgYlN0YXJ0VGFnOiBib29sZWFuKSA9PiAoYlN0YXJ0VGFnICYmIHJvbGUgPT09IFwiY29tYm9ib3hcIik7XG4gICAgICAgICAgICBjYXNlIFwibGlzdFwiOlxuICAgICAgICAgICAgICAgIHJldHVybiAocm9sZTogc3RyaW5nLCBiU3RhcnRUYWc6IGJvb2xlYW4pID0+IChiU3RhcnRUYWcgJiYgcm9sZSA9PT0gXCJsaXN0XCIpO1xuICAgICAgICAgICAgY2FzZSBcImxpc3RpdGVtXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIChyb2xlOiBzdHJpbmcsIGJTdGFydFRhZzogYm9vbGVhbikgPT4gKGJTdGFydFRhZyAmJiByb2xlID09PSBcImxpc3RpdGVtXCIpO1xuICAgICAgICAgICAgY2FzZSBcImFydGljbGVcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gKHJvbGU6IHN0cmluZywgYlN0YXJ0VGFnOiBib29sZWFuKSA9PiAoYlN0YXJ0VGFnICYmIHJvbGUgPT09IFwiYXJ0aWNsZVwiKTtcbiAgICAgICAgICAgIGNhc2UgXCJ0YWJsZVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiAocm9sZTogc3RyaW5nLCBiU3RhcnRUYWc6IGJvb2xlYW4pID0+IChiU3RhcnRUYWcgJiYgcm9sZSA9PT0gXCJ0YWJsZVwiKTtcbiAgICAgICAgICAgIGNhc2UgXCJwYXJhZ3JhcGhcIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gKF9yb2xlOiBzdHJpbmcsIGJTdGFydFRhZzogYm9vbGVhbiwgbm9kZTogTm9kZSkgPT4gKGJTdGFydFRhZyAmJiAobm9kZSBhcyBIVE1MRWxlbWVudCkubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJQXCIpO1xuICAgICAgICAgICAgY2FzZSBcImRvbVwiOlxuICAgICAgICAgICAgICAgIHJldHVybiAoKSA9PiB0cnVlO1xuICAgICAgICAgICAgY2FzZSBcIml0ZW1cIjpcbiAgICAgICAgICAgICAgICByZXR1cm4gKF9yb2xlOiBzdHJpbmcsIGJTdGFydFRhZzogYm9vbGVhbiwgbm9kZTogTm9kZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWJTdGFydFRhZykgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXNCbG9ja0VsZW1lbnQobm9kZSkpIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZW1wID0gbmV3IERPTVdhbGtlcihub2RlLCAhYlN0YXJ0VGFnKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXAucHJldk5vZGUoKSAmJiB0ZW1wLmJFbmRUYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpc0Jsb2NrRWxlbWVudCh0ZW1wLm5vZGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFwicmVnaW9uXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIChyb2xlOiBzdHJpbmcsIGJTdGFydFRhZzogYm9vbGVhbiwgbm9kZTogTm9kZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWJTdGFydFRhZykgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoW1wibWFpblwiLCBcIm5hdmlnYXRpb25cIiwgXCJmb3JtXCIsIFwiYmFubmVyXCIsIFwic2VhcmNoXCIsIFwiY29udGVudGluZm9cIl0uaW5jbHVkZXMocm9sZSkpIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBpZiAocm9sZSAhPT0gXCJyZWdpb25cIiB8fCBub2RlPy5ub2RlVHlwZSAhPT0gMSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gISFBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWUobm9kZSBhcyBIVE1MRWxlbWVudCk/Lm5hbWU/LnRyaW0oKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgY2FzZSBcImZvcm1jb250cm9sXCI6XG4gICAgICAgICAgICBjYXNlIFwiZWRpdGJveFwiOlxuICAgICAgICAgICAgY2FzZSBcImdyYXBoaWNcIjpcbiAgICAgICAgICAgIGNhc2UgXCJmcmFtZVwiOlxuICAgICAgICAgICAgY2FzZSBcImRpdmlzaW9uXCI6XG4gICAgICAgICAgICBjYXNlIFwidGFiY29udHJvbFwiOlxuICAgICAgICAgICAgY2FzZSBcInNlcGFyYXRvclwiOlxuICAgICAgICAgICAgY2FzZSBcImNsaWNrYWJsZVwiOlxuICAgICAgICAgICAgY2FzZSBcIm1vdXNlb3ZlclwiOlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIk5PVF9JTVBMRU1FTlRFRFwiKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiBhbiBlbGVtZW50IGlzIHdpdGhpbiBhIFNoYWRvdyBET01cbiAgICAgKiBAcGFyYW0gZWxlbWVudCBUaGUgZWxlbWVudCB0byBjaGVja1xuICAgICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIGVsZW1lbnQgaXMgaW4gYSBTaGFkb3cgRE9NLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgKi9cbiAgICBjb25zdCBpc0luU2hhZG93RE9NID0gKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IHJvb3QgPSBlbGVtZW50LmdldFJvb3ROb2RlKCk7XG4gICAgICAgIHJldHVybiByb290IGluc3RhbmNlb2YgU2hhZG93Um9vdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmUgc2tpcCBiZWhhdmlvciBmb3IgaXRlbSBuYXZpZ2F0aW9uIG1vZGVcbiAgICAgKiBIYW5kbGVzIGNvbXBsZXggdmlzaWJpbGl0eSBydWxlcyBpbmNsdWRpbmcgaGlkZGVuIGNvbnRlbnQgaW4gaGVhZGluZ3MvbGlua3NcbiAgICAgKiBAcGFyYW0gY3Vyc29yIFRoZSBjdXJzb3IgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb25cbiAgICAgKiBAcmV0dXJucyBPYmplY3QgaW5kaWNhdGluZyB3aGV0aGVyIHRvIHNraXAgY3VycmVudCBub2RlIGFuZC9vciBpdHMgY2hpbGRyZW4sIG9yIG51bGwgZm9yIGRlZmF1bHQgYmVoYXZpb3JcbiAgICAgKi9cbiAgICBjb25zdCBTS0lQX0lURU1fQkVIQVZJT1IgPSAoY3Vyc29yOiBTUkN1cnNvcikgOiB7IHNraXBDdXJyZW50OiBib29sZWFuLCBza2lwQ2hpbGRyZW46IGJvb2xlYW59IHwgbnVsbCA9PiB7XG4gICAgICAgIGNvbnN0IERFQlVHID0gZmFsc2U7XG4gICAgICAgIERFQlVHICYmIGNvbnNvbGUuZ3JvdXAoXCJTS0lQX0lURU1fQkVIQVZJT1JcIik7XG4gICAgICAgIGxldCByZXRWYWw6IHsgc2tpcEN1cnJlbnQ6IGJvb2xlYW4sIHNraXBDaGlsZHJlbjogYm9vbGVhbn0gfCBudWxsID0gbnVsbDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IG5vZGVUeXBlID0gY3Vyc29yLmdldE5vZGUoKS5ub2RlVHlwZTtcbiAgICAgICAgICAgIGxldCBlbGVtID0gY3Vyc29yLmdldEVsZW1lbnQoKTtcbiAgICAgICAgICAgIGNvbnN0IGN1cnNvclN0YXJ0ID0gY3Vyc29yLmNsb25lKCk7XG4gICAgICAgICAgICBjdXJzb3JTdGFydC5zZXRFbmRUYWcoZmFsc2UpO1xuXG4gICAgICAgICAgICBERUJVRyAmJiBjb25zb2xlLmxvZyhub2RlVHlwZSk7XG4gICAgICAgICAgICAvLyBTa2lwIENEQVRBIGFuZCBjb21tZW50cyBjb21wbGV0ZWx5XG4gICAgICAgICAgICBpZiAoWzQsIDhdLmluY2x1ZGVzKG5vZGVUeXBlKSkgcmV0dXJuIHJldFZhbCA9IHsgc2tpcEN1cnJlbnQ6IHRydWUsIHNraXBDaGlsZHJlbjogdHJ1ZSB9O1xuICAgICAgICAgICAgLy8gT25seSBwcm9jZXNzIGVsZW1lbnRzIGFuZCB0ZXh0XG4gICAgICAgICAgICBpZiAoIVsxLDNdLmluY2x1ZGVzKG5vZGVUeXBlKSkgcmV0dXJuIHJldFZhbCA9IHsgc2tpcEN1cnJlbnQ6IHRydWUsIHNraXBDaGlsZHJlbjogZmFsc2UgfTtcblxuICAgICAgICAgICAgLy8gRm9yIHRleHQgZWxlbWVudHMsIENvbnNpZGVyIHdpdGggcmVsYXRpb24gdG8gdGhlaXIgcGFyZW50IGVsZW1lbnRcbiAgICAgICAgICAgIGlmIChub2RlVHlwZSA9PT0gMykge1xuICAgICAgICAgICAgICAgIGVsZW0gPSBjdXJzb3IuZ2V0Tm9kZSgpLnBhcmVudEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgaWYgKCFlbGVtKSByZXR1cm4gcmV0VmFsID0gVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQoZWxlbSkgPyB7IHNraXBDdXJyZW50OiB0cnVlLCBza2lwQ2hpbGRyZW46IGZhbHNlIH0gOiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gaWYgKCFlbGVtKSBjb25zb2xlLmxvZyhjdXJzb3IuZ2V0Tm9kZSgpKTtcblxuICAgICAgICAgICAgLy8gV2UgaGF2ZSBhbiBlbGVtZW50XG5cbiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSdyZSB3aXRoaW4gdGhlIGJvZHkgZWxlbWVudFxuICAgICAgICAgICAgaWYgKCFlbGVtLmNsb3Nlc3QoXCJib2R5XCIpICYmICFpc0luU2hhZG93RE9NKGVsZW0pKSByZXR1cm4gcmV0VmFsID0geyBza2lwQ3VycmVudDogdHJ1ZSwgc2tpcENoaWxkcmVuOiBmYWxzZSB9O1xuXG4gICAgICAgICAgICAvLyBNYWtlIHN1cmUgd2UncmUgbm90IGluIGEgc2NyaXB0IG9yIHN0eWxlXG4gICAgICAgICAgICBpZiAoZWxlbS5jbG9zZXN0KFwic2NyaXB0LHN0eWxlXCIpKSByZXR1cm4gcmV0VmFsID0geyBza2lwQ3VycmVudDogdHJ1ZSwgc2tpcENoaWxkcmVuOiB0cnVlIH07XG5cbiAgICAgICAgICAgIC8vIEZvciB0ZXh0IG5vZGVzLCB3ZSBuZWVkIHRvIGNoZWNrIHZpc2liaWxpdHkgaW4gY29udGV4dCBvZiBwYXJlbnQgaGVhZGluZy9saW5rXG4gICAgICAgICAgICAvLyBTbyB3ZSdsbCBoYW5kbGUgdGV4dCBub2RlIHZpc2liaWxpdHkgY2hlY2tzIGJlbG93IHdpdGggdGhlIGVsZW1lbnQgdmlzaWJpbGl0eSBjaGVja3NcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gU2tpcCB0aGluZ3MgaGlkZGVuIGZyb20gdGhlIEFULCBVTkxFU1Mgd2UncmUgaW5zaWRlIGEgaGVhZGluZyBvciBsaW5rXG4gICAgICAgICAgICAvLyAoaGVhZGluZ3MgYW5kIGxpbmtzIHNob3VsZCBpbmNsdWRlIHRoZWlyIGZ1bGwgYWNjZXNzaWJsZSBuYW1lLCBpbmNsdWRpbmcgaGlkZGVuIHBhcnRzKVxuICAgICAgICAgICAgLy8gQlVUIG9ubHkgaWYgdGhlIGhlYWRpbmcvbGluayB1c2VzIG5hbWVGcm9tPVwiY29udGVudFwiIChub3QgYXJpYS1sYWJlbC9hcmlhLWxhYmVsbGVkYnkpXG4gICAgICAgICAgICBjb25zdCBwYXJlbnRIZWFkaW5nT3JMaW5rID0gY3Vyc29yU3RhcnQuZ2V0Q3VycmVudE9yUGFyZW50QnlSb2xlQ2xvbmUoW1wiaGVhZGluZ1wiLCBcImxpbmtcIl0pO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBTcGVjaWFsIGNhc2U6IGlmIGN1cnJlbnQgZWxlbWVudCBpdHNlbGYgaXMgYSBoZWFkaW5nIG9yIGxpbmsgQU5EIHdlJ3JlIE5PVCBpbnNpZGUgYW5vdGhlciBoZWFkaW5nL2xpbmssXG4gICAgICAgICAgICAvLyBhcHBseSBub3JtYWwgc2tpcCBydWxlc1xuICAgICAgICAgICAgY29uc3QgY3VycmVudFJvbGUgPSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUoZWxlbSk7XG4gICAgICAgICAgICBjb25zdCBpc0N1cnJlbnRIZWFkaW5nT3JMaW5rID0gY3VycmVudFJvbGUgPT09IFwiaGVhZGluZ1wiIHx8IGN1cnJlbnRSb2xlID09PSBcImxpbmtcIjtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKCFwYXJlbnRIZWFkaW5nT3JMaW5rKSB7XG4gICAgICAgICAgICAgICAgLy8gTm90IGluc2lkZSBhbnkgaGVhZGluZy9saW5rIC0gYXBwbHkgbm9ybWFsIHNraXAgcnVsZXNcbiAgICAgICAgICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQoZWxlbSkpIHJldHVybiByZXRWYWwgPSB7IHNraXBDdXJyZW50OiB0cnVlLCBza2lwQ2hpbGRyZW46IG5vZGVUeXBlID09PSAxIH07XG4gICAgICAgICAgICAgICAgaWYgKCFWaXNVdGlsLmlzTm9kZVZpc2libGUoZWxlbSkpIHJldHVybiByZXRWYWwgPSB7IHNraXBDdXJyZW50OiB0cnVlLCBza2lwQ2hpbGRyZW46IG5vZGVUeXBlID09PSAxIH07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBwYXJlbnQgaGVhZGluZy9saW5rIHVzZXMgYXJpYS1sYWJlbCBvciBhcmlhLWxhYmVsbGVkYnlcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRFbGVtID0gcGFyZW50SGVhZGluZ09yTGluay5nZXRFbGVtZW50KCk7XG4gICAgICAgICAgICAgICAgY29uc3QgbmFtZUluZm8gPSBwYXJlbnRIZWFkaW5nT3JMaW5rLmdldE5hbWVJbmZvKCk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gSWYgbmFtZUZyb20gaXMgTk9UIFwiY29udGVudFwiIG9yIFwidGV4dFwiLCBza2lwIGFsbCBjb250ZW50IChpdCdzIHVzaW5nIGFyaWEtbGFiZWwvYXJpYS1sYWJlbGxlZGJ5KVxuICAgICAgICAgICAgICAgIGlmIChuYW1lSW5mbyAmJiAhW1wiY29udGVudFwiLCBcInRleHRcIl0uaW5jbHVkZXMobmFtZUluZm8ubmFtZUZyb20pKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFBhcmVudCB1c2VzIGFyaWEtbGFiZWwvYXJpYS1sYWJlbGxlZGJ5IC0gc2tpcCBhbGwgY29udGVudCBpbmNsdWRpbmcgbmVzdGVkIGhlYWRpbmdzL2xpbmtzXG4gICAgICAgICAgICAgICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChlbGVtKSkgcmV0dXJuIHJldFZhbCA9IHsgc2tpcEN1cnJlbnQ6IHRydWUsIHNraXBDaGlsZHJlbjogdHJ1ZSB9O1xuICAgICAgICAgICAgICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShlbGVtKSkgcmV0dXJuIHJldFZhbCA9IHsgc2tpcEN1cnJlbnQ6IHRydWUsIHNraXBDaGlsZHJlbjogdHJ1ZSB9O1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNDdXJyZW50SGVhZGluZ09yTGluaykge1xuICAgICAgICAgICAgICAgICAgICAvLyBDdXJyZW50IGVsZW1lbnQgaXMgYSBoZWFkaW5nL2xpbmsgaW5zaWRlIGFub3RoZXIgaGVhZGluZy9saW5rIHdpdGggY29udGVudC1iYXNlZCBuYW1lXG4gICAgICAgICAgICAgICAgICAgIC8vIERvbid0IHNraXAgaXQgLSBsZXQgaXQgdGhyb3VnaCBzbyBpdHMgY29udGVudCBjYW4gYmUgcmVhZFxuICAgICAgICAgICAgICAgICAgICAvLyAoVGhlIGxvZ2ljIGF0IGxpbmUgMTgzIHdpbGwgaGFuZGxlIHdoZXRoZXIgdG8gc2tpcCBpdHMgY2hpbGRyZW4pXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbmFtZUZyb20gaXMgXCJjb250ZW50XCIsIHNvIGluY2x1ZGUgaGlkZGVuIGNvbnRlbnQgYnV0IHNraXAgaGlkZGVuIGltYWdlcy9ncmFwaGljc1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKGVsZW0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoKHJvbGUgPT09IFwiaW1nXCIgfHwgcm9sZSA9PT0gXCJncmFwaGljcy1kb2N1bWVudFwiKSAmJiBWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChlbGVtKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbCA9IHsgc2tpcEN1cnJlbnQ6IHRydWUsIHNraXBDaGlsZHJlbjogdHJ1ZSB9O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIERvbid0IHNraXAgb3RoZXIgaGlkZGVuIGNvbnRlbnQgLSBpdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIGFjY2Vzc2libGUgbmFtZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiQk9EWVwiKSByZXR1cm4gcmV0VmFsID0geyBza2lwQ3VycmVudDogZmFsc2UsIHNraXBDaGlsZHJlbjogZmFsc2UgfTtcblxuICAgICAgICAgICAgLy8gU2tpcCBsYWJlbHMgdGhhdCBhcmUgYXNzb2NpYXRlZCB3aXRoIGNvbnRyb2xzIC0gdGhleSdsbCBiZSByZWFkIHdpdGggdGhlIHJlbGF0ZWQgaW5wdXQuXG4gICAgICAgICAgICAvLyBLZWVwIGNoaWxkcmVuIHNvIGludGVyYWN0aXZlIGNvbnRlbnQgKGUuZy4gbGlua3MpIGluc2lkZSB0aGUgbGFiZWwgc3RpbGwgYXBwZWFycyBpblxuICAgICAgICAgICAgLy8gcmVhZGluZy90YWIgb3JkZXIuXG4gICAgICAgICAgICBpZiAoZWxlbS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIkxBQkVMXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGVsZW0uaGFzQXR0cmlidXRlKFwiZm9yXCIpXG4gICAgICAgICAgICAgICAgICAgICYmIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW0uZ2V0QXR0cmlidXRlKFwiZm9yXCIpKVxuICAgICAgICAgICAgICAgICAgICAmJiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChlbGVtLmdldEF0dHJpYnV0ZShcImZvclwiKSkuZ2V0QXR0cmlidXRlKFwidHlwZVwiKSAhPT0gXCJoaWRkZW5cIlxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0VmFsID0geyBza2lwQ3VycmVudDogdHJ1ZSwgc2tpcENoaWxkcmVuOiBmYWxzZSB9O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5lc3RlZENvbnRyb2wgPSBlbGVtLnF1ZXJ5U2VsZWN0b3IoXCJpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYSwgYnV0dG9uLCBbcm9sZT0nY2hlY2tib3gnXSwgW3JvbGU9J2NvbWJvYm94J10sIFtyb2xlPSdsaXN0Ym94J10sIFtyb2xlPSdtZW51aXRlbWNoZWNrYm94J10sIFtyb2xlPSdtZW51aXRlbXJhZGlvJ10sIFtyb2xlPSdyYWRpbyddLCBbcm9sZT0nc2VhcmNoYm94J10sIFtyb2xlPSdzbGlkZXInXSwgW3JvbGU9J3NwaW5idXR0b24nXSwgW3JvbGU9J3N3aXRjaCddLCBbcm9sZT0ndGV4dGJveCddXCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobmVzdGVkQ29udHJvbCAmJiAobmVzdGVkQ29udHJvbCBhcyBIVE1MRWxlbWVudCkuZ2V0QXR0cmlidXRlKFwidHlwZVwiKSAhPT0gXCJoaWRkZW5cIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbCA9IHsgc2tpcEN1cnJlbnQ6IHRydWUsIHNraXBDaGlsZHJlbjogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU2tpcCBub24taW50ZXJhY3RpdmUgY29udGVudCB0aGF0IGlzIGEgZGVzY2VuZGFudCBvZiBhIGZvci1saW5rZWQgbGFiZWwuXG4gICAgICAgICAgICAvLyBTdWNoIGNvbnRlbnQgaXMgYWxyZWFkeSBzdXJmYWNlZCBhcyBwYXJ0IG9mIHRoZSBhc3NvY2lhdGVkIGNvbnRyb2wncyBhbm5vdW5jZW1lbnQuXG4gICAgICAgICAgICAvLyBJbnRlcmFjdGl2ZSBkZXNjZW5kYW50cyAobGlua3MsIGJ1dHRvbnMsIGV0Yy4pIGFyZSBhbGxvd2VkIHRocm91Z2guXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGFiZWxGb3IgPSBlbGVtLmNsb3Nlc3QoXCJsYWJlbFtmb3JdXCIpIGFzIEhUTUxFbGVtZW50IHwgbnVsbDtcbiAgICAgICAgICAgICAgICBjb25zdCBsYWJlbEZvclRhcmdldCA9IGxhYmVsRm9yICYmIGxhYmVsRm9yLmdldEF0dHJpYnV0ZShcImZvclwiKTtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsRm9yXG4gICAgICAgICAgICAgICAgICAgICYmIGxhYmVsRm9yVGFyZ2V0XG4gICAgICAgICAgICAgICAgICAgICYmIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGxhYmVsRm9yVGFyZ2V0KVxuICAgICAgICAgICAgICAgICAgICAmJiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChsYWJlbEZvclRhcmdldCkuZ2V0QXR0cmlidXRlKFwidHlwZVwiKSAhPT0gXCJoaWRkZW5cIlxuICAgICAgICAgICAgICAgICAgICAmJiAhZWxlbS5jbG9zZXN0KFwiYVtocmVmXSwgW3JvbGU9J2xpbmsnXSwgYnV0dG9uLCBbcm9sZT0nYnV0dG9uJ11cIilcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbCA9IHsgc2tpcEN1cnJlbnQ6IHRydWUsIHNraXBDaGlsZHJlbjogbm9kZVR5cGUgPT09IDEgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHJvbGUgPSBjdXJzb3JTdGFydC5nZXRSb2xlKCk7XG5cbiAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgcHJlc2VudGF0aW9uYWwgY2hpbGRyZW4sIHJlYWQgdGhlIGVsZW1lbnQsIHNraXAgdGhlIGNoaWxkcmVuXG4gICAgICAgICAgICBpZiAoQXJpYVV0aWwuY29udGFpbnNQcmVzZW50YXRpb25hbENoaWxkcmVuT25seShlbGVtKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXRWYWwgPSB7IHNraXBDdXJyZW50OiBmYWxzZSwgc2tpcENoaWxkcmVuOiB0cnVlIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBTa2lwIGNoaWxkcmVuIG9mIGhlYWRpbmdzL2xpbmtzIHRoYXQgZG9uJ3QgdXNlIGNvbnRlbnQtYmFzZWQgbmFtZXNcbiAgICAgICAgICAgIC8vIFVOTEVTUyB3ZSdyZSBpbnNpZGUgYW5vdGhlciBoZWFkaW5nL2xpbmsgdGhhdCBET0VTIHVzZSBjb250ZW50LWJhc2VkIG5hbWVzXG4gICAgICAgICAgICBpZiAoW1wibGlua1wiLCBcImhlYWRpbmdcIl0uaW5jbHVkZXMocm9sZSkgJiYgKCFjdXJzb3JTdGFydC5nZXROYW1lKCkgfHwgKCFbXCJjb250ZW50XCIsIFwidGV4dFwiXS5pbmNsdWRlcyhjdXJzb3JTdGFydC5nZXROYW1lSW5mbygpLm5hbWVGcm9tKSkpKSB7XG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgd2UncmUgaW5zaWRlIGEgcGFyZW50IGhlYWRpbmcvbGluayB3aXRoIGNvbnRlbnQtYmFzZWQgbmFtZVxuICAgICAgICAgICAgICAgIGlmIChwYXJlbnRIZWFkaW5nT3JMaW5rICYmIHBhcmVudEhlYWRpbmdPckxpbmsuZ2V0TmFtZUluZm8oKSAmJiBbXCJjb250ZW50XCIsIFwidGV4dFwiXS5pbmNsdWRlcyhwYXJlbnRIZWFkaW5nT3JMaW5rLmdldE5hbWVJbmZvKCkubmFtZUZyb20pKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIERvbid0IHNraXAgY2hpbGRyZW4gLSB3ZSdyZSBuZXN0ZWQgaW5zaWRlIGEgY29udGVudC1iYXNlZCBoZWFkaW5nL2xpbmtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0VmFsID0geyBza2lwQ3VycmVudDogZmFsc2UsIHNraXBDaGlsZHJlbjogdHJ1ZSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGVsZW0ubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJMRUdFTkRcIikge1xuICAgICAgICAgICAgICAgIGxldCBwYXJlbnQgPSBET01XYWxrZXIucGFyZW50RWxlbWVudChjdXJzb3IuZ2V0Tm9kZSgpKTtcbiAgICAgICAgICAgICAgICB3aGlsZSAocGFyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnQubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gJ0ZJRUxEU0VUJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGVnZW5kIGlzIHdpdGhpbiBhIGZpZWxkc2V0LCBzdXBwcmVzcyBvdXRwdXRcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXRWYWwgPSB7IHNraXBDdXJyZW50OiBmYWxzZSwgc2tpcENoaWxkcmVuOiB0cnVlIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQocGFyZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZWxlbSAmJiBlbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiTVNVUFwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbCA9IHsgc2tpcEN1cnJlbnQ6IGZhbHNlLCBza2lwQ2hpbGRyZW46IHRydWUgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlbGVtLmNsb3Nlc3QoXCIuaWJtYS1zci1vdmVybGF5XCIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbCA9IHsgc2tpcEN1cnJlbnQ6IHRydWUsIHNraXBDaGlsZHJlbjogdHJ1ZSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJldFZhbCA9IG51bGw7XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBERUJVRyAmJiBjb25zb2xlLmxvZyhcIlNLSVBfSVRFTSByZXRWYWw6XCIsIHJldFZhbCk7XG4gICAgICAgICAgICBERUJVRyAmJiBjb25zb2xlLmdyb3VwRW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEZXRlcm1pbmUgc2tpcCBiZWhhdmlvciBmb3IgbmVzdGVkIG5hdmlnYXRpb24gbW9kZXMgKGxpbmssIGhlYWRpbmcsIGltYWdlLCBldGMuKVxuICAgICAqIFNpbXBsZXIgdGhhbiBTS0lQX0lURU1fQkVIQVZJT1IgYXMgaXQgZG9lc24ndCBuZWVkIGNvbXBsZXggaGVhZGluZy9saW5rIGNvbnRlbnQgcnVsZXNcbiAgICAgKiBAcGFyYW0gY3Vyc29yIFRoZSBjdXJzb3IgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb25cbiAgICAgKiBAcmV0dXJucyBPYmplY3QgaW5kaWNhdGluZyB3aGV0aGVyIHRvIHNraXAgY3VycmVudCBub2RlIGFuZC9vciBpdHMgY2hpbGRyZW4sIG9yIG51bGwgZm9yIGRlZmF1bHQgYmVoYXZpb3JcbiAgICAgKi9cbiAgICBjb25zdCBTS0lQX05FU1RFRF9CRUhBVklPUiA9IChjdXJzb3I6IFNSQ3Vyc29yKSA6IHsgc2tpcEN1cnJlbnQ6IGJvb2xlYW4sIHNraXBDaGlsZHJlbjogYm9vbGVhbn0gfCBudWxsID0+IHtcbiAgICAgICAgY29uc3Qgbm9kZVR5cGUgPSBjdXJzb3IuZ2V0Tm9kZSgpLm5vZGVUeXBlO1xuICAgICAgICBjb25zdCBlbGVtID0gY3Vyc29yLmdldEVsZW1lbnQoKTtcbiAgICAgICAgLy8gT25seSB2aXNpdCBlbGVtZW50cyBhbmQgdGV4dCBub2Rlc1xuICAgICAgICBpZiAobm9kZVR5cGUgIT09IDEgJiYgbm9kZVR5cGUgIT09IDMpIHJldHVybiB7IHNraXBDdXJyZW50OiB0cnVlLCBza2lwQ2hpbGRyZW46IGZhbHNlIH07XG4gICAgICAgIGlmIChub2RlVHlwZSA9PT0gMykgcmV0dXJuIFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKGVsZW0pID8geyBza2lwQ3VycmVudDogdHJ1ZSwgc2tpcENoaWxkcmVuOiBmYWxzZSB9IDogbnVsbDtcbiAgICAgICAgLy8gV2UgaGF2ZSBhbiBlbGVtZW5ldFxuICAgICAgICBpZiAoVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQoZWxlbSkpIHJldHVybiB7IHNraXBDdXJyZW50OiB0cnVlLCBza2lwQ2hpbGRyZW46IHRydWUgfTtcbiAgICAgICAgLy8gU2tpcCBsYWJlbCBmb3JzIC0gdGhleSdsbCBiZSByZWFkIHdpdGggdGhlIHJlbGF0ZWQgaW5wdXQuXG4gICAgICAgIC8vIEtlZXAgY2hpbGRyZW4gc28gaW50ZXJhY3RpdmUgY29udGVudCAoZS5nLiBsaW5rcykgaW5zaWRlIHRoZSBsYWJlbCBzdGlsbCBhcHBlYXJzIGluXG4gICAgICAgIC8vIHJlYWRpbmcvdGFiIG9yZGVyLlxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBlbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiTEFCRUxcIlxuICAgICAgICAgICAgJiYgZWxlbS5oYXNBdHRyaWJ1dGUoXCJmb3JcIilcbiAgICAgICAgICAgICYmIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW0uZ2V0QXR0cmlidXRlKFwiZm9yXCIpKVxuICAgICAgICAgICAgJiYgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxlbS5nZXRBdHRyaWJ1dGUoXCJmb3JcIikpLmdldEF0dHJpYnV0ZShcInR5cGVcIikgIT09IFwiaGlkZGVuXCJcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4geyBza2lwQ3VycmVudDogdHJ1ZSwgc2tpcENoaWxkcmVuOiBmYWxzZSB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2tpcCBub24taW50ZXJhY3RpdmUgY29udGVudCB0aGF0IGlzIGEgZGVzY2VuZGFudCBvZiBhIGZvci1saW5rZWQgbGFiZWwuXG4gICAgICAgIC8vIFN1Y2ggY29udGVudCBpcyBhbHJlYWR5IHN1cmZhY2VkIGFzIHBhcnQgb2YgdGhlIGFzc29jaWF0ZWQgY29udHJvbCdzIGFubm91bmNlbWVudC5cbiAgICAgICAgLy8gSW50ZXJhY3RpdmUgZGVzY2VuZGFudHMgKGxpbmtzLCBidXR0b25zLCBldGMuKSBhcmUgYWxsb3dlZCB0aHJvdWdoLlxuICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBsYWJlbEZvciA9IGVsZW0uY2xvc2VzdChcImxhYmVsW2Zvcl1cIikgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuICAgICAgICAgICAgY29uc3QgbGFiZWxGb3JUYXJnZXQgPSBsYWJlbEZvciAmJiBsYWJlbEZvci5nZXRBdHRyaWJ1dGUoXCJmb3JcIik7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgbGFiZWxGb3JcbiAgICAgICAgICAgICAgICAmJiBsYWJlbEZvclRhcmdldFxuICAgICAgICAgICAgICAgICYmIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGxhYmVsRm9yVGFyZ2V0KVxuICAgICAgICAgICAgICAgICYmIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGxhYmVsRm9yVGFyZ2V0KS5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpICE9PSBcImhpZGRlblwiXG4gICAgICAgICAgICAgICAgJiYgIWVsZW0uY2xvc2VzdChcImFbaHJlZl0sIFtyb2xlPSdsaW5rJ10sIGJ1dHRvbiwgW3JvbGU9J2J1dHRvbiddXCIpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyBza2lwQ3VycmVudDogdHJ1ZSwgc2tpcENoaWxkcmVuOiBub2RlVHlwZSA9PT0gMSB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgcm9sZSA9IGN1cnNvci5nZXRSb2xlKCk7XG5cbiAgICAgICAgLy8gSWYgd2UgaGF2ZSBwcmVzZW50YXRpb25hbCBjaGlsZHJlbiwgcmVhZCB0aGUgZWxlbWVudCwgc2tpcCB0aGUgY2hpbGRyZW5cbiAgICAgICAgaWYgKEFyaWFVdGlsLmNvbnRhaW5zUHJlc2VudGF0aW9uYWxDaGlsZHJlbk9ubHkoZWxlbSkpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHNraXBDdXJyZW50OiBmYWxzZSwgc2tpcENoaWxkcmVuOiB0cnVlIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsZW0gJiYgZWxlbS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIk1TVVBcIikge1xuICAgICAgICAgICAgcmV0dXJuIHsgc2tpcEN1cnJlbnQ6IHRydWUsIHNraXBDaGlsZHJlbjogdHJ1ZSB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChlbGVtLmNsb3Nlc3QoXCIuaWJtYS1zci1vdmVybGF5XCIpKSB7XG4gICAgICAgICAgICByZXR1cm4geyBza2lwQ3VycmVudDogdHJ1ZSwgc2tpcENoaWxkcmVuOiB0cnVlIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBza2lwIGZ1bmN0aW9uIGZvciBhIGdpdmVuIG5hdmlnYXRpb24gbW9kZVxuICAgICAqIEBwYXJhbSBtb2RlIFRoZSBuYXZpZ2F0aW9uIG1vZGVcbiAgICAgKiBAcmV0dXJucyBBIGZ1bmN0aW9uIHRoYXQgZGV0ZXJtaW5lcyB3aGljaCBub2RlcyB0byBza2lwIGR1cmluZyBuYXZpZ2F0aW9uXG4gICAgICovXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGdldFNraXBGdW5jKG1vZGU6IE5hdmlnYXRpb25Nb2RlKSA6IFNSQ3Vyc29yU2tpcEZ1bmMge1xuICAgICAgICBzd2l0Y2ggKG1vZGUpIHtcbiAgICAgICAgICAgIGNhc2UgXCJyZWdpb25cIjpcbiAgICAgICAgICAgIGNhc2UgXCJpdGVtXCI6IFxuICAgICAgICAgICAgICAgIHJldHVybiBTS0lQX0lURU1fQkVIQVZJT1I7XG4gICAgICAgICAgICBjYXNlIFwibGlua1wiOiBcbiAgICAgICAgICAgIGNhc2UgXCJ0YWJfZm9jdXNcIjogXG4gICAgICAgICAgICBjYXNlIFwiaGVhZGluZ1wiOlxuICAgICAgICAgICAgY2FzZSBcImgxXCI6XG4gICAgICAgICAgICBjYXNlIFwiaDJcIjpcbiAgICAgICAgICAgIGNhc2UgXCJoM1wiOlxuICAgICAgICAgICAgY2FzZSBcImg0XCI6XG4gICAgICAgICAgICBjYXNlIFwiaDVcIjpcbiAgICAgICAgICAgIGNhc2UgXCJoNlwiOlxuICAgICAgICAgICAgY2FzZSBcImltYWdlXCI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFNLSVBfTkVTVEVEX0JFSEFWSU9SO1xuICAgICAgICAgICAgY2FzZSBcInJhZGlvXCI6XG4gICAgICAgICAgICBjYXNlIFwiYnV0dG9uXCI6XG4gICAgICAgICAgICBjYXNlIFwiY2hlY2tib3hcIjpcbiAgICAgICAgICAgIGNhc2UgXCJjb21ib1wiOiAgICAgICBcbiAgICAgICAgICAgIGNhc2UgXCJsaXN0XCI6XG4gICAgICAgICAgICBjYXNlIFwibGlzdGl0ZW1cIjpcbiAgICAgICAgICAgIGNhc2UgXCJhcnRpY2xlXCI6XG4gICAgICAgICAgICBjYXNlIFwidGFibGVcIjpcbiAgICAgICAgICAgIGNhc2UgXCJwYXJhZ3JhcGhcIjpcbiAgICAgICAgICAgIGNhc2UgXCJkb21cIjpcbiAgICAgICAgICAgIGNhc2UgXCJmb3JtY29udHJvbFwiOlxuICAgICAgICAgICAgY2FzZSBcImVkaXRib3hcIjpcbiAgICAgICAgICAgIGNhc2UgXCJncmFwaGljXCI6XG4gICAgICAgICAgICBjYXNlIFwiZnJhbWVcIjpcbiAgICAgICAgICAgIGNhc2UgXCJkaXZpc2lvblwiOlxuICAgICAgICAgICAgY2FzZSBcInRhYmNvbnRyb2xcIjpcbiAgICAgICAgICAgIGNhc2UgXCJzZXBhcmF0b3JcIjpcbiAgICAgICAgICAgIGNhc2UgXCJjbGlja2FibGVcIjpcbiAgICAgICAgICAgIGNhc2UgXCJtb3VzZW92ZXJcIjpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJOT1RfSU1QTEVNRU5URURcIik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBcbiAgICAvKipcbiAgICAgKiBKdW1wIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uIG9yIHRoZSBwcmV2aW91cyBtYXRjaGluZyBlbGVtZW50IGlmIGN1cnJlbnQgZG9lc24ndCBtYXRjaFxuICAgICAqIEBwYXJhbSBtb2RlIFRoZSBuYXZpZ2F0aW9uIG1vZGVcbiAgICAgKiBAcGFyYW0gd2Fsa2VyIFRoZSBjdXJzb3IgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb25cbiAgICAgKiBAcmV0dXJucyBBIGN1cnNvciBhdCB0aGUgY3VycmVudCBvciBwcmV2aW91cyBtYXRjaGluZyBwb3NpdGlvblxuICAgICAqL1xuICAgIGV4cG9ydCBmdW5jdGlvbiBqdW1wQ3VycmVudChtb2RlOiBOYXZpZ2F0aW9uTW9kZSwgd2Fsa2VyOiBTUkN1cnNvcikgOiBTUkN1cnNvciB7XG4gICAgICAgIGNvbnN0IG1hdGNoRnVuYyA9IG1vZGUgPT09IFwidGFiX2ZvY3VzXCIgPyBnZXRUYWJGb2N1c1N0YXJ0RnVuYyh0cnVlKSA6IGdldFN0YXJ0RnVuYyhtb2RlKTtcbiAgICAgICAgaWYgKG1hdGNoRnVuYyh3YWxrZXIuZ2V0Um9sZSgpLCAhd2Fsa2VyLmlzRW5kVGFnKCksIHdhbGtlci5nZXROb2RlKCkpKSB7XG4gICAgICAgICAgICByZXR1cm4gd2Fsa2VyLmNsb25lKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4ganVtcFByZXZpb3VzKG1vZGUsIHdhbGtlcik7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogSnVtcCB0byB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IGVsZW1lbnQgYW5kIHJldHVybiBhbGwgaW50ZXJtZWRpYXRlIGl0ZW0gcG9zaXRpb25zXG4gICAgICogQHBhcmFtIG1vZGUgVGhlIG5hdmlnYXRpb24gbW9kZVxuICAgICAqIEBwYXJhbSB3YWxrZXIgVGhlIGN1cnNvciBhdCB0aGUgY3VycmVudCBwb3NpdGlvblxuICAgICAqIEByZXR1cm5zIEFycmF5IG9mIGN1cnNvcnMgcmVwcmVzZW50aW5nIHBvc2l0aW9ucyBmcm9tIGN1cnJlbnQgdG8gZW5kXG4gICAgICovXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGp1bXBDdXJyZW50RW5kKG1vZGU6IE5hdmlnYXRpb25Nb2RlLCB3YWxrZXI6IFNSQ3Vyc29yKSA6IFNSQ3Vyc29yW10ge1xuICAgICAgICBpZiAobW9kZSA9PT0gXCJpdGVtXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1FbmQgPSBqdW1wTmV4dChtb2RlLCB3YWxrZXIpO1xuICAgICAgICAgICAgcmV0dXJuIGl0ZW1FbmQgPyBbaXRlbUVuZF0gOiBbXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IG5hbWVJbmZvID0gd2Fsa2VyLmdldE5hbWVJbmZvKCk7XG4gICAgICAgICAgICBsZXQgcmV0VmFsID0gd2Fsa2VyLmNsb25lKCk7XG4gICAgICAgICAgICBpZiAobmFtZUluZm8gJiYgIVtcImNvbnRlbnRcIiwgXCJ0ZXh0XCJdLmluY2x1ZGVzKG5hbWVJbmZvLm5hbWVGcm9tKSkge1xuICAgICAgICAgICAgICAgIC8vIE5hbWUgaXMganVzdCBmcm9tIHRoZSBpdGVtIGl0c2VsZlxuICAgICAgICAgICAgICAgIHJldFZhbC5uZXh0KCgpID0+IHRydWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBOYW1lIGlzIGZyb20gdGhlIGNvbnRlbnRcbiAgICAgICAgICAgICAgICByZXRWYWwuc2V0RW5kVGFnKHRydWUpO1xuICAgICAgICAgICAgICAgIHJldFZhbC5uZXh0KCgpID0+IHRydWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBlbmRDdXJzb3JzOiBTUkN1cnNvcltdID0gW107XG4gICAgICAgICAgICBsZXQgaXRlbUVuZCA9IGp1bXBOZXh0KFwiaXRlbVwiLCB3YWxrZXIpO1xuICAgICAgICAgICAgd2hpbGUgKGl0ZW1FbmQgJiYgU1JDdXJzb3IuY29tcGFyZShpdGVtRW5kLCByZXRWYWwpIDwgMCkge1xuICAgICAgICAgICAgICAgIGVuZEN1cnNvcnMucHVzaChpdGVtRW5kKTtcbiAgICAgICAgICAgICAgICBpdGVtRW5kID0ganVtcE5leHQoXCJpdGVtXCIsIGl0ZW1FbmQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZW5kQ3Vyc29ycy5wdXNoKHJldFZhbCk7XG4gICAgICAgICAgICByZXR1cm4gbW9kZSA9PT0gXCJ0YWJfZm9jdXNcIiAmJiB3YWxrZXIuZ2V0Um9sZSgpID09PSBcImxpbmtcIiA/IFtlbmRDdXJzb3JzW2VuZEN1cnNvcnMubGVuZ3RoIC0gMV1dIDogZW5kQ3Vyc29ycztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEp1bXAgdG8gdGhlIG5leHQgbWF0Y2hpbmcgZWxlbWVudCBpbiB0aGUgZ2l2ZW4gbmF2aWdhdGlvbiBtb2RlXG4gICAgICogQHBhcmFtIG1vZGUgVGhlIG5hdmlnYXRpb24gbW9kZVxuICAgICAqIEBwYXJhbSB3YWxrZXIgVGhlIGN1cnNvciBhdCB0aGUgY3VycmVudCBwb3NpdGlvblxuICAgICAqIEByZXR1cm5zIEEgY3Vyc29yIGF0IHRoZSBuZXh0IG1hdGNoaW5nIHBvc2l0aW9uLCBvciBudWxsIGlmIG5vbmUgZm91bmRcbiAgICAgKi9cbiAgICBleHBvcnQgZnVuY3Rpb24ganVtcE5leHQobW9kZTogTmF2aWdhdGlvbk1vZGUsIHdhbGtlcjogU1JDdXJzb3IpIDogU1JDdXJzb3Ige1xuICAgICAgICBjb25zdCBERUJVRyA9IGZhbHNlO1xuICAgICAgICBERUJVRyAmJiBjb25zb2xlLmdyb3VwKFwiU1JOYXZpZ2F0b3I6Omp1bXBOZXh0XCIsIHdhbGtlci5pc0VuZFRhZygpP1wiL1wiOlwiXCIsIHdhbGtlci5nZXROb2RlKCkpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKG1vZGUgPT09IFwidGFiX2ZvY3VzXCIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0YWJGb2N1c01hdGNoRnVuYyA9IGdldFRhYkZvY3VzU3RhcnRGdW5jKHRydWUpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhYkZvY3VzQ3Vyc29ycyA9IGNvbGxlY3RUYWJGb2N1c0N1cnNvcnModGFiRm9jdXNNYXRjaEZ1bmMsIHdhbGtlci5nZXROb2RlKCkpO1xuICAgICAgICAgICAgICAgIGlmICh0YWJGb2N1c0N1cnNvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyh0YWJGb2N1c0N1cnNvcnMubWFwKGMgPT4gYy5nZXROb2RlKCkpKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFRhYkZvY3VzUGFyZW50Q3Vyc29yID0gd2Fsa2VyLmdldEN1cnJlbnRPclBhcmVudFRhYmJhYmxlQ2xvbmUoKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFRhYkZvY3VzQ3Vyc29yID0gY3VycmVudFRhYkZvY3VzUGFyZW50Q3Vyc29yICYmIGZpbmRUYWJGb2N1c0luZGV4KHRhYkZvY3VzQ3Vyc29ycywgY3VycmVudFRhYkZvY3VzUGFyZW50Q3Vyc29yKSA+PSAwID8gY3VycmVudFRhYkZvY3VzUGFyZW50Q3Vyc29yIDogd2Fsa2VyLmNsb25lKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IGZpbmRUYWJGb2N1c0luZGV4KHRhYkZvY3VzQ3Vyc29ycywgY3VycmVudFRhYkZvY3VzQ3Vyc29yKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRJbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudEluZGV4ICsgMSA8IHRhYkZvY3VzQ3Vyc29ycy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFiRm9jdXNDdXJzb3JzW2N1cnJlbnRJbmRleCArIDFdLmNsb25lKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFiRm9jdXNDdXJzb3JzWzBdLmNsb25lKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgcmV0VmFsID0gd2Fsa2VyLmNsb25lKCk7XG4gICAgICAgICAgICBjb25zdCBtYXRjaEZ1bmMgPSBnZXRTdGFydEZ1bmMobW9kZSk7XG4gICAgICAgICAgICBjb25zdCBza2lwRnVuYyA9IGdldFNraXBGdW5jKG1vZGUpO1xuICAgICAgICAgICAgaWYgKHJldFZhbC5uZXh0KG1hdGNoRnVuYywgc2tpcEZ1bmMpKSB7XG4gICAgICAgICAgICAgICAgREVCVUcgJiYgY29uc29sZS5sb2coXCJTUk5hdmlnYXRvcjo6anVtcE5leHQgcmVzdWx0XCIsIHJldFZhbCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICBjb25zb2xlLmdyb3VwRW5kKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBOYXZpZ2F0ZXMgdG8gdGhlIHByZXZpb3VzIGVsZW1lbnQgaW4gc2NyZWVuIHJlYWRlciBuYXZpZ2F0aW9uIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgbW9kZS5cbiAgICAgKlxuICAgICAqIEZvciB0YWJfZm9jdXMgbW9kZSwgdGhpcyBmdW5jdGlvbiBhdHRlbXB0cyB0byBtb3ZlIHRvIHRoZSBwcmV2aW91cyB0YWJiYWJsZSBlbGVtZW50IGJ5OlxuICAgICAqIDEuIEZpcnN0IHRyeWluZyB0byBtb3ZlIGJhY2t3YXJkIHVzaW5nIHRoZSBtb2RlJ3MgbWF0Y2ggYW5kIHNraXAgZnVuY3Rpb25zXG4gICAgICogMi4gSWYgdGhhdCBmYWlscywgY29sbGVjdGluZyBhbGwgdGFiIGZvY3VzIGN1cnNvcnMgYW5kIGZpbmRpbmcgdGhlIHByZXZpb3VzIG9uZSBpbiB0aGUgdGFiIG9yZGVyXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbW9kZSAtIFRoZSBuYXZpZ2F0aW9uIG1vZGUgKGUuZy4sIFwidGFiX2ZvY3VzXCIpIHRoYXQgZGV0ZXJtaW5lcyBob3cgdG8gbmF2aWdhdGVcbiAgICAgKiBAcGFyYW0gd2Fsa2VyIC0gVGhlIGN1cnJlbnQgY3Vyc29yIHBvc2l0aW9uIGluIHRoZSBzY3JlZW4gcmVhZGVyIG5hdmlnYXRpb25cbiAgICAgKiBAcmV0dXJucyBBIG5ldyBjdXJzb3IgcG9zaXRpb25lZCBhdCB0aGUgcHJldmlvdXMgZWxlbWVudCwgb3IgbnVsbCBpZiBubyBwcmV2aW91cyBlbGVtZW50IGV4aXN0c1xuICAgICAqL1xuICAgIGV4cG9ydCBmdW5jdGlvbiBqdW1wUHJldmlvdXMobW9kZTogTmF2aWdhdGlvbk1vZGUsIHdhbGtlcjogU1JDdXJzb3IpIDogU1JDdXJzb3Ige1xuICAgICAgICBpZiAobW9kZSA9PT0gXCJ0YWJfZm9jdXNcIikge1xuICAgICAgICAgICAgbGV0IHJldFZhbCA9IHdhbGtlci5jbG9uZSgpO1xuICAgICAgICAgICAgY29uc3QgbWF0Y2hGdW5jID0gZ2V0U3RhcnRGdW5jKG1vZGUpO1xuICAgICAgICAgICAgY29uc3Qgc2tpcEZ1bmMgPSBnZXRTa2lwRnVuYyhtb2RlKTtcbiAgICAgICAgICAgIGlmIChyZXRWYWwucHJldmlvdXMobWF0Y2hGdW5jLCBza2lwRnVuYykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCB0YWJGb2N1c01hdGNoRnVuYyA9IGdldFRhYkZvY3VzU3RhcnRGdW5jKHRydWUpO1xuICAgICAgICAgICAgY29uc3QgdGFiRm9jdXNDdXJzb3JzID0gY29sbGVjdFRhYkZvY3VzQ3Vyc29ycyh0YWJGb2N1c01hdGNoRnVuYywgd2Fsa2VyLmdldE5vZGUoKSk7XG4gICAgICAgICAgICBpZiAodGFiRm9jdXNDdXJzb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50VGFiRm9jdXNQYXJlbnRDdXJzb3IgPSB3YWxrZXIuZ2V0Q3VycmVudE9yUGFyZW50VGFiYmFibGVDbG9uZSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRUYWJGb2N1c0N1cnNvciA9IGN1cnJlbnRUYWJGb2N1c1BhcmVudEN1cnNvciAmJiBmaW5kVGFiRm9jdXNJbmRleCh0YWJGb2N1c0N1cnNvcnMsIGN1cnJlbnRUYWJGb2N1c1BhcmVudEN1cnNvcikgPj0gMCA/IGN1cnJlbnRUYWJGb2N1c1BhcmVudEN1cnNvciA6IHdhbGtlci5jbG9uZSgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRJbmRleCA9IGZpbmRUYWJGb2N1c0luZGV4KHRhYkZvY3VzQ3Vyc29ycywgY3VycmVudFRhYkZvY3VzQ3Vyc29yKTtcbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudEluZGV4ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFiRm9jdXNDdXJzb3JzW2N1cnJlbnRJbmRleCAtIDFdLmNsb25lKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmV0VmFsID0gd2Fsa2VyLmNsb25lKCk7XG4gICAgICAgIGNvbnN0IG1hdGNoRnVuYyA9IGdldFN0YXJ0RnVuYyhtb2RlKTtcbiAgICAgICAgY29uc3Qgc2tpcEZ1bmMgPSBnZXRTa2lwRnVuYyhtb2RlKTtcbiAgICAgICAgaWYgKHJldFZhbC5wcmV2aW91cyhtYXRjaEZ1bmMsIHNraXBGdW5jKSkge1xuICAgICAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG59XG4iLCJpbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBTUk5hdmlnYXRvciB9IGZyb20gXCIuL1NSTmF2aWdhdG9yXCI7XG5pbXBvcnQgeyBDb250YWluZXJDaGFuZ2VzLCBOYXZpZ2F0aW9uTW9kZSwgUmVuZGVyUmVzdWx0IH0gZnJvbSBcIi4vU1JUeXBlc1wiO1xuaW1wb3J0IHsgU1JDdXJzb3IgfSBmcm9tIFwiLi9TUkN1cnNvclwiO1xuaW1wb3J0IHsgU1JfUlVMRVMsIENPTlRBSU5FUl9FTlRFUl9SVUxFUywgQ09OVEFJTkVSX0VYSVRfUlVMRVMgfSBmcm9tIFwiLi9yZW5kZXJfcnVsZXNcIjtcbmltcG9ydCB7IGdldExpbmtBbm5vdW5jZW1lbnQgfSBmcm9tIFwiLi9yZW5kZXJfcnVsZXMvY29tbW9uXCI7XG5cbi8qKlxuICogU1JSZW5kZXJlciBuYW1lc3BhY2UgcHJvdmlkZXMgZnVuY3Rpb25hbGl0eSBmb3Igc2ltdWxhdGluZyBob3cgc2NyZWVuIHJlYWRlcnNcbiAqIGFubm91bmNlIGNvbnRlbnQgdG8gdXNlcnMuIEl0IGNvbnRhaW5zIHJ1bGVzIGZvciByZW5kZXJpbmcgZGlmZmVyZW50IHR5cGVzIG9mXG4gKiBlbGVtZW50cyBhbmQgQVJJQSByb2xlcyBpbiB2YXJpb3VzIG5hdmlnYXRpb24gbW9kZXMuXG4gKlxuICogVGhlIHJlbmRlcmVyIHVzZXMgYSBydWxlLWJhc2VkIHN5c3RlbSB0byBkZXRlcm1pbmUgd2hhdCB0ZXh0IHNob3VsZCBiZSBhbm5vdW5jZWRcbiAqIHdoZW4gbmF2aWdhdGluZyB0bywgd2l0aGluLCBvciBhd2F5IGZyb20gZWxlbWVudHMgYmFzZWQgb24gdGhlaXIgcm9sZXMgYW5kIHByb3BlcnRpZXMuXG4gKi9cbmV4cG9ydCBuYW1lc3BhY2UgU1JSZW5kZXJlciB7XG4gICAgLyoqXG4gICAgICogR2VuZXJhdGVzIHRoZSBhbm5vdW5jZW1lbnQgdGV4dCB3aGVuIGVudGVyaW5nIGFuIGVsZW1lbnRcbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gbG9va3MgdXAgdGhlIGFwcHJvcHJpYXRlIHJ1bGUgYmFzZWQgb24gdGhlIGVsZW1lbnQncyByb2xlIG9yIHRhZyBuYW1lXG4gICAgICogYW5kIGFwcGxpZXMgaXQgdG8gZ2VuZXJhdGUgdGhlIGFubm91bmNlbWVudCB0ZXh0LlxuICAgICAqXG4gICAgICogQHBhcmFtIG1vZGUgLSBUaGUgY3VycmVudCBuYXZpZ2F0aW9uIG1vZGVcbiAgICAgKiBAcGFyYW0gd2Fsa2VyIC0gQ3Vyc29yIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uXG4gICAgICogQHBhcmFtIG9sZFdhbGtlciAtIE9wdGlvbmFsIGN1cnNvciBhdCB0aGUgcHJldmlvdXMgcG9zaXRpb25cbiAgICAgKiBAcmV0dXJucyBBbm5vdW5jZW1lbnQgdGV4dCBmb3IgZW50ZXJpbmcgdGhlIGVsZW1lbnQsIG9yIG51bGwgaWYgbm8gcnVsZSBhcHBsaWVzXG4gICAgICovXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHJlbmRlckVudGVyKG1vZGU6IE5hdmlnYXRpb25Nb2RlIHwgXCJmb2N1c1wiLCB3YWxrZXI6IFNSQ3Vyc29yLCBvbGRXYWxrZXI/OiBTUkN1cnNvcik6IHN0cmluZyB8IG51bGwgeyAgICAgICAgXG4gICAgICAgIGNvbnN0IERFQlVHID0gZmFsc2U7XG4gICAgICAgIGZvciAoY29uc3QgcnVsZSBvZiBDT05UQUlORVJfRU5URVJfUlVMRVMpIHtcbiAgICAgICAgICAgIGxldCBzID0gcnVsZS50ZXN0KG1vZGUsIHdhbGtlciwgb2xkV2Fsa2VyKTtcbiAgICAgICAgICAgIERFQlVHICYmIGNvbnNvbGUubG9nKG1vZGUsIHdhbGtlciwgcnVsZSwgcyk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHMgIT09IFwidW5kZWZpbmVkXCIgJiYgcyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdlbmVyYXRlcyB0aGUgYW5ub3VuY2VtZW50IHRleHQgd2hlbiBsZWF2aW5nIGFuIGVsZW1lbnRcbiAgICAgKlxuICAgICAqIFNpbWlsYXIgdG8gcmVuZGVyRW50ZXIsIGJ1dCBhcHBsaWVzIHJ1bGVzIGZvciBsZWF2aW5nIGVsZW1lbnRzIGluc3RlYWQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbW9kZSAtIFRoZSBjdXJyZW50IG5hdmlnYXRpb24gbW9kZVxuICAgICAqIEBwYXJhbSB3YWxrZXIgLSBDdXJzb3IgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb25cbiAgICAgKiBAcGFyYW0gb2xkV2Fsa2VyIC0gT3B0aW9uYWwgY3Vyc29yIGF0IHRoZSBwcmV2aW91cyBwb3NpdGlvblxuICAgICAqIEByZXR1cm5zIEFubm91bmNlbWVudCB0ZXh0IGZvciBsZWF2aW5nIHRoZSBlbGVtZW50LCBvciBudWxsIGlmIG5vIHJ1bGUgYXBwbGllc1xuICAgICAqL1xuICAgIGV4cG9ydCBmdW5jdGlvbiByZW5kZXJMZWF2ZShtb2RlOiBOYXZpZ2F0aW9uTW9kZSwgd2Fsa2VyOiBTUkN1cnNvciwgb2xkV2Fsa2VyPzogU1JDdXJzb3IpOiBzdHJpbmcgfCBudWxsICB7XG4gICAgICAgIGZvciAoY29uc3QgcnVsZSBvZiBDT05UQUlORVJfRVhJVF9SVUxFUykge1xuICAgICAgICAgICAgbGV0IHMgPSBydWxlLnRlc3QobW9kZSwgd2Fsa2VyLCBvbGRXYWxrZXIpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBzICE9PSBcInVuZGVmaW5lZFwiICYmIHMgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW5kZXJzIHRoZSBjdXJyZW50IGVsZW1lbnQgYW5kIGFueSBjb250YWluZXIgY2hhbmdlc1xuICAgICAqXG4gICAgICogVGhpcyBmdW5jdGlvbiBjb21iaW5lcyBhbm5vdW5jZW1lbnRzIGZvcjpcbiAgICAgKiAtIENvbnRhaW5lcnMgYmVpbmcgbGVmdFxuICAgICAqIC0gQ29udGFpbmVycyBiZWluZyBlbnRlcmVkXG4gICAgICogLSBUaGUgY3VycmVudCBlbGVtZW50IGl0c2VsZlxuICAgICAqXG4gICAgICogQHBhcmFtIG1vZGUgLSBUaGUgY3VycmVudCBuYXZpZ2F0aW9uIG1vZGVcbiAgICAgKiBAcGFyYW0gd2Fsa2VyIC0gQ3Vyc29yIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uXG4gICAgICogQHBhcmFtIGNvbnRhaW5lckNoYW5nZXMgLSBJbmZvcm1hdGlvbiBhYm91dCBjb250YWluZXJzIGJlaW5nIGVudGVyZWQgb3IgbGVmdFxuICAgICAqIEByZXR1cm5zIENvbWJpbmVkIGFubm91bmNlbWVudCB0ZXh0XG4gICAgICovXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHJlbmRlckN1cnJlbnQobW9kZTogTmF2aWdhdGlvbk1vZGUsIHdhbGtlcjogU1JDdXJzb3IsIGNvbnRhaW5lckNoYW5nZXM6IENvbnRhaW5lckNoYW5nZXMpOiBSZW5kZXJSZXN1bHQgfCBudWxsIHtcbiAgICAgICAgY29uc3QgREVCVUcgPSBmYWxzZTsvL21vZGUgPT09IFwidGFiX2ZvY3VzXCIgJiYgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJmaXh0dXJlXCIpPy5nZXRBdHRyaWJ1dGUoXCJjbGFzc1wiKSA9PT0gXCJ0b210ZXN0XCI7XG4gICAgICAgIGxldCBzdGFydE9mUmVuZGVyID0gU1JOYXZpZ2F0b3IuanVtcEN1cnJlbnQobW9kZSwgd2Fsa2VyKTtcbiAgICAgICAgaWYgKCFzdGFydE9mUmVuZGVyKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgZW5kT2ZSZW5kZXJzID0gU1JOYXZpZ2F0b3IuanVtcEN1cnJlbnRFbmQobW9kZSwgc3RhcnRPZlJlbmRlcik7XG4gICAgICAgIGlmICghZW5kT2ZSZW5kZXJzIHx8IGVuZE9mUmVuZGVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGVuZE9mUmVuZGVycyA9IFtudWxsXTtcbiAgICAgICAgfVxuICAgICAgICBERUJVRyAmJiBjb25zb2xlLmxvZyhcIkFBQUFcIiwgc3RhcnRPZlJlbmRlci5pc1N0YXJ0VGFnKCksIHN0YXJ0T2ZSZW5kZXIuZ2V0Tm9kZSgpKTtcbiAgICAgICAgREVCVUcgJiYgY29uc29sZS5sb2coXCJCQkJCXCIsIGVuZE9mUmVuZGVycy5tYXAodmFsID0+IHZhbCAmJiB2YWwuaXNTdGFydFRhZygpKSwgZW5kT2ZSZW5kZXJzLm1hcCh2YWwgPT4gdmFsICYmIHZhbC5nZXROb2RlKCkpKTtcblxuICAgICAgICBsZXQgZW5kT2ZSZW5kZXIgPSBlbmRPZlJlbmRlcnNbZW5kT2ZSZW5kZXJzLmxlbmd0aCAtIDFdO1xuICAgICAgICBsZXQgcmVuZGVyU3RyID0gXCJcIjtcbiAgICAgICAgZm9yIChsZXQgY2FuZGlkYXRlRW5kIG9mIGVuZE9mUmVuZGVycykge1xuICAgICAgICAgICAgbGV0IGNhbmRpZGF0ZVJlbmRlclN0ciA9IFNSUmVuZGVyZXIucmVuZGVyUmFuZ2UobW9kZSwgc3RhcnRPZlJlbmRlciwgY2FuZGlkYXRlRW5kKTtcbiAgICAgICAgICAgIGlmIChjYW5kaWRhdGVSZW5kZXJTdHIudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBlbmRPZlJlbmRlciA9IGNhbmRpZGF0ZUVuZDtcbiAgICAgICAgICAgICAgICByZW5kZXJTdHIgPSBjYW5kaWRhdGVSZW5kZXJTdHI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlbmRlclN0ciA9PT0gXCJcIikge1xuICAgICAgICAgICAgcmVuZGVyU3RyID0gU1JSZW5kZXJlci5yZW5kZXJSYW5nZShtb2RlLCBzdGFydE9mUmVuZGVyLCBlbmRPZlJlbmRlcik7XG4gICAgICAgIH1cbiAgICAgICAgREVCVUcgJiYgY29uc29sZS5sb2coXCJDQ0NDXCIsIHJlbmRlclN0cik7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzdGFydDogc3RhcnRPZlJlbmRlcixcbiAgICAgICAgICAgIGVuZDogZW5kT2ZSZW5kZXIsXG4gICAgICAgICAgICBtZXNzYWdlOiAoY29udGFpbmVyQ2hhbmdlcy5sZWF2aW5nIHx8IFtdKS5jb25jYXQoY29udGFpbmVyQ2hhbmdlcy5lbnRlcmluZyB8fCBbXSkuY29uY2F0KFtyZW5kZXJTdHJdKS5qb2luKFwiIFwiKS5yZXBsYWNlKC9cXHMrL2csIFwiIFwiKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVuZGVycyBhIHJhbmdlIG9mIGVsZW1lbnRzIGJldHdlZW4gdHdvIGN1cnNvcnNcbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gdHJhdmVyc2VzIHRoZSBET00gZnJvbSBzdGFydE9mUmVuZGVyIHRvIGVuZE9mUmVuZGVyLFxuICAgICAqIGFwcGx5aW5nIHJlbmRlcmluZyBydWxlcyB0byBlYWNoIGVsZW1lbnQgYW5kIGNvbWJpbmluZyB0aGUgcmVzdWx0cy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBtb2RlIC0gVGhlIGN1cnJlbnQgbmF2aWdhdGlvbiBtb2RlXG4gICAgICogQHBhcmFtIHN0YXJ0T2ZSZW5kZXIgLSBDdXJzb3IgYXQgdGhlIHN0YXJ0IG9mIHRoZSByYW5nZVxuICAgICAqIEBwYXJhbSBlbmRPZlJlbmRlciAtIEN1cnNvciBhdCB0aGUgZW5kIG9mIHRoZSByYW5nZVxuICAgICAqIEByZXR1cm5zIENvbWJpbmVkIGFubm91bmNlbWVudCB0ZXh0IGZvciB0aGUgZW50aXJlIHJhbmdlXG4gICAgICovXG4gICAgZXhwb3J0IGZ1bmN0aW9uIHJlbmRlclJhbmdlKG1vZGU6IE5hdmlnYXRpb25Nb2RlLCBzdGFydE9mUmVuZGVyOiBTUkN1cnNvciwgZW5kT2ZSZW5kZXI6IFNSQ3Vyc29yKSA6IHN0cmluZyB7XG4gICAgICAgIGxldCBpdGVyV2Fsa2VyID0gc3RhcnRPZlJlbmRlci5jbG9uZSgpO1xuICAgICAgICBsZXQgZWxlbVN0cnM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGxldCBiQ29udGludWUgPSB0cnVlO1xuICAgICAgICBsZXQgY3VycmVudExpbms6IE5vZGUgPSBudWxsO1xuICAgICAgICB3aGlsZSAoYkNvbnRpbnVlKSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtID0gaXRlcldhbGtlci5nZXRFbGVtZW50KCk7XG4gICAgICAgICAgICBjb25zdCBub2RlID0gaXRlcldhbGtlci5nZXROb2RlKCk7XG4gICAgICAgICAgICBjb25zdCBub2RlVHlwZSA9IG5vZGUubm9kZVR5cGU7XG4gICAgICAgICAgICBsZXQgcmVuZGVyU3Ryczogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICAgIGxldCBsaW5rUGFyZW50ID0gQXJpYVV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShub2RlLCBcImxpbmtcIiwgdHJ1ZSk7XG4gICAgICAgICAgICBpZiAobGlua1BhcmVudCAmJiAhW1wiY29udGVudFwiLCBcInRleHRcIl0uaW5jbHVkZXMobmV3IFNSQ3Vyc29yKGxpbmtQYXJlbnQpLmdldE5hbWVJbmZvKCk/Lm5hbWVGcm9tKSkge1xuICAgICAgICAgICAgICAgIC8vIFdlIGRvbid0IGNvbnNpZGVyIGxpbmtzIHRoYXQgYW5ub3VuY2UgdGhlbXNlbHZlc1xuICAgICAgICAgICAgICAgIGxpbmtQYXJlbnQgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChjb25zdCBydWxlIG9mIFNSX1JVTEVTKSB7XG4gICAgICAgICAgICAgICAgbGV0IHMgPSBydWxlLnRlc3QobW9kZSwgaXRlcldhbGtlcik7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzICE9PSBcInVuZGVmaW5lZFwiICYmIHMgIT09IG51bGwgJiYgcy50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZVR5cGUgPT09IDEgJiYgIWl0ZXJXYWxrZXIuaXNFbmRUYWcoKSAmJiBlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtaGFzcG9wdXBcIikgPT09IFwibWVudVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzID0gXCJbc3ViTWVudV0gXCIrcztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyBIYW5kbGUgbGlua3NcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1vZGUgPT09IFwidGFiX2ZvY3VzXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlJ3JlIGluIGxpbmsgbW9kZVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRMaW5rICYmICghbGlua1BhcmVudCB8fCAobGlua1BhcmVudCAmJiBjdXJyZW50TGluayAhPT0gbGlua1BhcmVudCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UndmUgYWRkZWQgYSBzdHJpbmcgd2l0aGluIGEgbGluayAoY3VycmVudExpbmspLCBidXQgbm93IHdlJ3ZlIGxlZnQgdGhlIGxpbmsgb3IgbW92ZWQgdG8gYSBuZXcgbGlua1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBgJHtzfSAke2dldExpbmtBbm5vdW5jZW1lbnQobmV3IFNSQ3Vyc29yKGN1cnJlbnRMaW5rLCBmYWxzZSkpfWA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGlua1BhcmVudCAmJiAoIWN1cnJlbnRMaW5rIHx8IChjdXJyZW50TGluayAhPT0gbGlua1BhcmVudCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UncmUgaW4gYSBsaW5rLCBhbmQgd2UgaGF2ZW4ndCBhbm5vdW5jZWQgdGhpcyBsaW5rLCBvciB3ZSd2ZSBtb3ZlZCB0byBhIG5ldyBsaW5rXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcyA9IGAke2dldExpbmtBbm5vdW5jZW1lbnQobmV3IFNSQ3Vyc29yKGxpbmtQYXJlbnQsIGZhbHNlKSl9ICR7c31gO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBcblxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChzICE9PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50TGluayA9IGxpbmtQYXJlbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtU3Rycy5wdXNoKHMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsZW1TdHJzLnB1c2gocmVuZGVyU3Rycy5maWx0ZXIocyA9PiBzLnRyaW0oKS5sZW5ndGggPiAwKS5qb2luKFwiIFwiKSlcbiAgICAgICAgICAgIGJDb250aW51ZSA9IGl0ZXJXYWxrZXIubmV4dCgoKSA9PiB0cnVlLCBTUk5hdmlnYXRvci5nZXRTa2lwRnVuYyhtb2RlKSkgJiYgU1JDdXJzb3IuY29tcGFyZShpdGVyV2Fsa2VyLCBlbmRPZlJlbmRlcikgPCAwO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtb2RlID09PSBcInRhYl9mb2N1c1wiICYmIGN1cnJlbnRMaW5rKSB7XG4gICAgICAgICAgICBlbGVtU3Rycy5wdXNoKGAke2dldExpbmtBbm5vdW5jZW1lbnQobmV3IFNSQ3Vyc29yKGN1cnJlbnRMaW5rLCBmYWxzZSkpfWApO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZXRWYWwgPSBlbGVtU3Rycy5maWx0ZXIocyA9PiBzLnRyaW0oKS5sZW5ndGggPiAwKS5qb2luKFwiIFwiKTtcbiAgICAgICAgcmV0VmFsID0gcmV0VmFsLnJlcGxhY2UoLywgXFx1MDAwMShbXlxcdTAwMDJdKylcXHUwMDAyL2csIChtYXRjaCwgZGVzY3JpYmVkQnlUZXh0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBxdW90ZWRUZXh0ID0gYFwiJHtkZXNjcmliZWRCeVRleHR9XCJgO1xuICAgICAgICAgICAgY29uc3QgdW5tYXJrZWRSZXRWYWwgPSByZXRWYWwucmVwbGFjZShtYXRjaCwgXCJcIik7XG4gICAgICAgICAgICByZXR1cm4gdW5tYXJrZWRSZXRWYWwuaW5jbHVkZXMocXVvdGVkVGV4dCkgfHwgdW5tYXJrZWRSZXRWYWwuaW5jbHVkZXMoZGVzY3JpYmVkQnlUZXh0KSA/IFwiXCIgOiBgLCAke3F1b3RlZFRleHR9YDtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldFZhbCA9IHJldFZhbC5yZXBsYWNlKC9bXFx1MDAwMVxcdTAwMDJdL2csIFwiXCIpO1xuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxufVxuXG4iLCJpbXBvcnQgeyBTUkN1cnNvciB9IGZyb20gXCIuL1NSQ3Vyc29yXCI7XG5pbXBvcnQgeyBOYXZpZ2F0aW9uTW9kZSB9IGZyb20gXCIuL1NSVHlwZXNcIjtcblxuZXhwb3J0IGNsYXNzIFNSUmVuZGVyZXJSdWxlIHtcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJ1bGVEZWZpbml0aW9uOiB7XG4gICAgICAgIG1vZGVzOiBOYXZpZ2F0aW9uTW9kZVtdLFxuICAgICAgICByb2xlczogc3RyaW5nW10sXG4gICAgICAgIGVsZW1zOiBzdHJpbmdbXSxcbiAgICAgICAgdGVzdHM6IEFycmF5PChjdXJzb3I6IFNSQ3Vyc29yLCBvbGRDdXJzb3I/OiBTUkN1cnNvciwgbW9kZT86IE5hdmlnYXRpb25Nb2RlKSA9PiBzdHJpbmcgfCBudWxsPlxuICAgIH0pIHtcblxuICAgIH1cblxuICAgIHB1YmxpYyB0ZXN0KG1vZGU6IE5hdmlnYXRpb25Nb2RlLCBjdXJzb3I6IFNSQ3Vyc29yLCBvbGRDdXJzb3I/OiBTUkN1cnNvcik6IHN0cmluZyB8IG51bGwge1xuICAgICAgICBpZiAodGhpcy5ydWxlRGVmaW5pdGlvbi5tb2Rlcy5pbmNsdWRlcyhtb2RlKVxuICAgICAgICAgICAgJiYgKFxuICAgICAgICAgICAgICAgIHRoaXMucnVsZURlZmluaXRpb24ucm9sZXMuaW5jbHVkZXMoY3Vyc29yLmdldFJvbGUoKSlcbiAgICAgICAgICAgICAgICB8fCB0aGlzLnJ1bGVEZWZpbml0aW9uLmVsZW1zLmluY2x1ZGVzKGN1cnNvci5nZXROb2RlKCkubm9kZU5hbWUudG9VcHBlckNhc2UoKSlcbiAgICAgICAgICAgIClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHRlc3Qgb2YgdGhpcy5ydWxlRGVmaW5pdGlvbi50ZXN0cykge1xuICAgICAgICAgICAgICAgIGxldCBzID0gdGVzdChjdXJzb3IsIG9sZEN1cnNvciwgbW9kZSk7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzID09PSBcInN0cmluZ1wiKSByZXR1cm4gcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG59IiwiaW1wb3J0IHsgU1JDdXJzb3IgfSBmcm9tIFwiLi9TUkN1cnNvclwiO1xuXG4vKipcbiAqIFRhYmxlVXRpbCBuYW1lc3BhY2UgcHJvdmlkZXMgdXRpbGl0eSBmdW5jdGlvbnMgZm9yIGhhbmRsaW5nIEhUTUwgdGFibGVzIGluIHRoZSBhY2Nlc3NpYmlsaXR5IHNpbXVsYXRvci5cbiAqIFRoZXNlIGZ1bmN0aW9ucyBoZWxwIGRldGVybWluZSBjZWxsIHBvc2l0aW9ucywgcmVsYXRpb25zaGlwcywgYW5kIGV4dHJhY3QgaGVhZGVyIGluZm9ybWF0aW9uXG4gKiB0byBzaW11bGF0ZSBob3cgc2NyZWVuIHJlYWRlcnMgd291bGQgYW5ub3VuY2UgdGFibGUgbmF2aWdhdGlvbi5cbiAqL1xuZXhwb3J0IG5hbWVzcGFjZSBTUlRhYmxlVXRpbCB7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIHRhYmxlIGNlbGwgd2l0aCBpdHMgcG9zaXRpb24gYW5kIHNwYW5uaW5nIGluZm9ybWF0aW9uXG4gICAgICogQHByb3BlcnR5IHJvd0luZGV4U3RhcnQgLSBUaGUgc3RhcnRpbmcgcm93IGluZGV4ICgwLWJhc2VkKVxuICAgICAqIEBwcm9wZXJ0eSBjb2xJbmRleFN0YXJ0IC0gVGhlIHN0YXJ0aW5nIGNvbHVtbiBpbmRleCAoMC1iYXNlZClcbiAgICAgKiBAcHJvcGVydHkgcm93c3BhbiAtIE51bWJlciBvZiByb3dzIHRoaXMgY2VsbCBzcGFuc1xuICAgICAqIEBwcm9wZXJ0eSBjb2xzcGFuIC0gTnVtYmVyIG9mIGNvbHVtbnMgdGhpcyBjZWxsIHNwYW5zXG4gICAgICogQHByb3BlcnR5IGNlbGxDdXJzb3IgLSBTUkN1cnNvciBwb2ludGluZyB0byB0aGlzIGNlbGxcbiAgICAgKi9cbiAgICBleHBvcnQgdHlwZSBDZWxsTW9kZWwgPSB7IHJvd0luZGV4U3RhcnQ6IG51bWJlciwgY29sSW5kZXhTdGFydDogbnVtYmVyLCByb3dzcGFuOiBudW1iZXIsIGNvbHNwYW46IG51bWJlciwgY2VsbEN1cnNvcjogU1JDdXJzb3IgfVxuICAgIFxuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSByb3cgaW4gYSB0YWJsZSBhcyBhbiBhcnJheSBvZiBjZWxsIG1vZGVsc1xuICAgICAqL1xuICAgIGV4cG9ydCB0eXBlIFJvd01vZGVsID0gQ2VsbE1vZGVsW107XG4gICAgXG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIGNvbXBsZXRlIHRhYmxlIGFzIGFuIGFycmF5IG9mIHJvd3NcbiAgICAgKi9cbiAgICBleHBvcnQgdHlwZSBUYWJsZU1vZGVsID0gUm93TW9kZWxbXTtcblxuICAgIC8qKlxuICAgICAqIERldGVybWluZXMgaWYgdGhlIGN1cnNvciBpcyBwb2ludGluZyB0byBhIGNlbGwgZWxlbWVudCAoVEQgb3IgVEgpXG4gICAgICogb3IgaGFzIGEgY2VsbC1yZWxhdGVkIEFSSUEgcm9sZVxuICAgICAqIEBwYXJhbSBjdXJzb3IgLSBUaGUgU1JDdXJzb3IgdG8gY2hlY2tcbiAgICAgKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBjdXJzb3IgaXMgb24gYSBjZWxsLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgKi9cbiAgICBleHBvcnQgZnVuY3Rpb24gaXNDdXJzb3JDZWxsUm9sZShjdXJzb3I6IFNSQ3Vyc29yKSB7XG4gICAgICAgIGlmICghY3Vyc29yLmdldEVsZW1lbnQoKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBpZiAoW1wiY2VsbFwiLCBcInJvd2hlYWRlclwiLCBcImNvbHVtbmhlYWRlclwiXS5pbmNsdWRlcyhjdXJzb3IuZ2V0Um9sZSgpKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICFjdXJzb3IuZ2V0RWxlbWVudCgpLmhhc0F0dHJpYnV0ZShcInJvbGVcIikgJiYgW1wiVEhcIiwgXCJURFwiXS5pbmNsdWRlcyhjdXJzb3IuZ2V0RWxlbWVudCgpLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgYSBjdXJzb3IgcG9pbnRpbmcgdG8gdGhlIGN1cnJlbnQgY2VsbCBvciB0aGUgcGFyZW50IGNlbGwgaWYgdGhlIGN1cnNvclxuICAgICAqIGlzIGluc2lkZSBhIGNlbGwncyBjb250ZW50XG4gICAgICogQHBhcmFtIGN1cnNvciAtIFRoZSBTUkN1cnNvciB0byBjaGVja1xuICAgICAqIEByZXR1cm5zIEEgbmV3IFNSQ3Vyc29yIHBvaW50aW5nIHRvIHRoZSBjZWxsIG9yIG51bGwgaWYgbm90IGluIGEgY2VsbFxuICAgICAqL1xuICAgIGV4cG9ydCBmdW5jdGlvbiBnZXRDdXJyZW50T3JQYXJlbnRDZWxsQ3Vyc29yKGN1cnNvcjogU1JDdXJzb3IpIDogU1JDdXJzb3Ige1xuICAgICAgICByZXR1cm4gY3Vyc29yLmdldEN1cnJlbnRPclBhcmVudEJ5Um9sZUNsb25lKFtcImNlbGxcIiwgXCJyb3doZWFkZXJcIiwgXCJjb2x1bW5oZWFkZXJcIl0sIFtcIlREXCIsXCJUSFwiXSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBjb2xzcGFuIG9mIGEgY2VsbCBhdCBhIGdpdmVuIGxvY2F0aW9uXG4gICAgICogQHBhcmFtIGN1cnNvciBUaGUgY3Vyc29yIHRvIGdldCB0aGUgY29sc3BhbiBmcm9tXG4gICAgICogQHJldHVybnMgVGhlIGNvbHNwYW4gb2YgdGhlIGNlbGwgYXQgdGhlIGN1cnNvcidzIGxvY2F0aW9uIG9yIDAgaWYgbm90IGluIGEgY29sdW1uXG4gICAgICovXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGdldENvbFNwYW4oY3Vyc29yOiBTUkN1cnNvcik6IG51bWJlciB7XG4gICAgICAgIGlmICghaXNDdXJzb3JDZWxsUm9sZShjdXJzb3IpKSByZXR1cm4gMDtcbiAgICAgICAgbGV0IGNvbFNwYW4gPSBjdXJzb3IuZ2V0RWxlbWVudCgpLmdldEF0dHJpYnV0ZShcImNvbHNwYW5cIik7XG4gICAgICAgIGlmIChjb2xTcGFuKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQoY29sU3Bhbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSByb3dzcGFuIG9mIGEgY2VsbCBhdCBhIGdpdmVuIGxvY2F0aW9uXG4gICAgICogQHBhcmFtIGN1cnNvciBUaGUgY3Vyc29yIHRvIGdldCB0aGUgcm93c3BhbiBmcm9tXG4gICAgICogQHJldHVybnMgVGhlIHJvd3NwYW4gb2YgdGhlIGNlbGwgYXQgdGhlIGN1cnNvcidzIGxvY2F0aW9uIG9yIDAgaWYgbm90IGluIGEgY29sdW1uXG4gICAgICovXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGdldFJvd1NwYW4oY3Vyc29yOiBTUkN1cnNvcik6IG51bWJlciB7XG4gICAgICAgIGlmICghaXNDdXJzb3JDZWxsUm9sZShjdXJzb3IpKSByZXR1cm4gMDtcbiAgICAgICAgbGV0IHJvd1NwYW4gPSBjdXJzb3IuZ2V0RWxlbWVudCgpLmdldEF0dHJpYnV0ZShcInJvd3NwYW5cIik7XG4gICAgICAgIGlmIChyb3dTcGFuKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQocm93U3Bhbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIDE7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQnVpbGRzIGEgY29tcGxldGUgbW9kZWwgb2YgYSB0YWJsZSdzIHN0cnVjdHVyZSwgYWNjb3VudGluZyBmb3Igcm93c3BhbiBhbmQgY29sc3BhblxuICAgICAqXG4gICAgICogVGhpcyBmdW5jdGlvbiB0cmF2ZXJzZXMgdGhlIGVudGlyZSB0YWJsZSBhbmQgY3JlYXRlcyBhIGRhdGEgc3RydWN0dXJlIHRoYXQgcmVwcmVzZW50c1xuICAgICAqIHRoZSBsb2dpY2FsIGdyaWQgb2YgY2VsbHMsIHByb3Blcmx5IGhhbmRsaW5nIGNlbGxzIHRoYXQgc3BhbiBtdWx0aXBsZSByb3dzIG9yIGNvbHVtbnMuXG4gICAgICogVGhlIHJlc3VsdGluZyBtb2RlbCBtYWtlcyBpdCBlYXNpZXIgdG8gZGV0ZXJtaW5lIGNlbGwgcmVsYXRpb25zaGlwcyBhbmQgcG9zaXRpb25zLlxuICAgICAqXG4gICAgICogQHBhcmFtIGluVGFibGVDdXJzb3IgLSBBIGN1cnNvciB3aXRoaW4gdGhlIHRhYmxlXG4gICAgICogQHJldHVybnMgQSBUYWJsZU1vZGVsIHJlcHJlc2VudGluZyB0aGUgY29tcGxldGUgdGFibGUgc3RydWN0dXJlLCBvciBudWxsIGlmIG5vdCBpbiBhIHRhYmxlXG4gICAgICovXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGdldFRhYmxlTW9kZWwoaW5UYWJsZUN1cnNvcjogU1JDdXJzb3IpOiBUYWJsZU1vZGVsIHtcbiAgICAgICAgLy8gR2V0IGEgY3Vyc29yIHBvaW50aW5nIHRvIHRoZSB0YWJsZSBlbGVtZW50XG4gICAgICAgIGxldCB0YWJsZUN1cnNvciA9IGluVGFibGVDdXJzb3IuZ2V0Q3VycmVudE9yUGFyZW50QnlSb2xlQ2xvbmUoW1widGFibGVcIl0pO1xuICAgICAgICBpZiAoIXRhYmxlQ3Vyc29yKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IHdhbGtUYWJsZUN1cnNvciA9IHRhYmxlQ3Vyc29yLmNsb25lKCk7XG5cbiAgICAgICAgbGV0IHJldFZhbDogVGFibGVNb2RlbCA9IFtdOyAgLy8gVGhlIGNvbXBsZXRlIHRhYmxlIG1vZGVsIHdlJ3JlIGJ1aWxkaW5nXG4gICAgICAgIGxldCBjdXJSb3c6IFJvd01vZGVsID0gW107ICAgIC8vIFRoZSBjdXJyZW50IHJvdyBiZWluZyBwcm9jZXNzZWRcbiAgICAgICAgbGV0IHByZXZSb3c6IFJvd01vZGVsOyAgICAgICAgLy8gVGhlIHByZXZpb3VzIHJvdyAobmVlZGVkIGZvciByb3dzcGFuIGhhbmRsaW5nKVxuICAgICAgICBcbiAgICAgICAgLy8gV2FsayB0aHJvdWdoIHRoZSB0YWJsZSdzIERPTSBzdHJ1Y3R1cmVcbiAgICAgICAgd2hpbGUgKHdhbGtUYWJsZUN1cnNvci5uZXh0KCgpID0+IHRydWUpICYmICF3YWxrVGFibGVDdXJzb3IuZ2V0Tm9kZSgpLmlzU2FtZU5vZGUodGFibGVDdXJzb3IuZ2V0Tm9kZSgpKSkge1xuICAgICAgICAgICAgaWYgKHdhbGtUYWJsZUN1cnNvci5pc0VuZFRhZygpICYmIHdhbGtUYWJsZUN1cnNvci5nZXRSb2xlKCkgPT09IFwicm93XCIpIHtcbiAgICAgICAgICAgICAgICAvLyBSZWFjaGVkIHRoZSBlbmQgb2YgdGhlIHJvdywgcHVzaCB3aGF0IHdlIGhhdmUgYW5kIHJlc2V0XG4gICAgICAgICAgICAgICAgcmV0VmFsLnB1c2goY3VyUm93KTtcbiAgICAgICAgICAgICAgICBwcmV2Um93ID0gY3VyUm93O1xuICAgICAgICAgICAgICAgIGN1clJvdyA9IFtdO1xuXG4gICAgICAgICAgICAgICAgLy8gSGFuZGxlIGNlbGxzIHdpdGggcm93c3BhbiBmcm9tIHByZXZpb3VzIHJvd3MgdGhhdCBhZmZlY3QgdGhpcyByb3dcbiAgICAgICAgICAgICAgICAvLyBUaGlzIGVuc3VyZXMgY2VsbHMgc3Bhbm5pbmcgbXVsdGlwbGUgcm93cyBhcmUgcHJvcGVybHkgcmVwcmVzZW50ZWQgaW4gdGhlIG1vZGVsXG4gICAgICAgICAgICAgICAgd2hpbGUgKHByZXZSb3cgJiYgY3VyUm93Lmxlbmd0aCA8IHByZXZSb3cubGVuZ3RoICYmXG4gICAgICAgICAgICAgICAgICAgICAgKChwcmV2Um93W2N1clJvdy5sZW5ndGhdLnJvd0luZGV4U3RhcnQgKyBwcmV2Um93W2N1clJvdy5sZW5ndGhdLnJvd3NwYW4gLSAxKSA+PSByZXRWYWwubGVuZ3RoKSkge1xuICAgICAgICAgICAgICAgICAgICBjdXJSb3cucHVzaChwcmV2Um93W2N1clJvdy5sZW5ndGhdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIFByb2Nlc3MgZWFjaCBjZWxsIGluIHRoZSByb3dcbiAgICAgICAgICAgIGlmICghd2Fsa1RhYmxlQ3Vyc29yLmlzRW5kVGFnKCkgJiYgaXNDdXJzb3JDZWxsUm9sZSh3YWxrVGFibGVDdXJzb3IpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgY29sc3BhbiA9IGdldENvbFNwYW4od2Fsa1RhYmxlQ3Vyc29yKTtcbiAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBjZWxsIG1vZGVsIHdpdGggcG9zaXRpb24gYW5kIHNwYW5uaW5nIGluZm9ybWF0aW9uXG4gICAgICAgICAgICAgICAgY29uc3QgY2VsbEluZm86IENlbGxNb2RlbCA9IHtcbiAgICAgICAgICAgICAgICAgICAgcm93SW5kZXhTdGFydDogcmV0VmFsLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgY29sSW5kZXhTdGFydDogY3VyUm93Lmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgcm93c3BhbjogZ2V0Um93U3Bhbih3YWxrVGFibGVDdXJzb3IpLFxuICAgICAgICAgICAgICAgICAgICBjb2xzcGFuLFxuICAgICAgICAgICAgICAgICAgICBjZWxsQ3Vyc29yOiB3YWxrVGFibGVDdXJzb3IuY2xvbmUoKVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gRm9yIGNlbGxzIHdpdGggY29sc3BhbiwgYWRkIHRoZSBzYW1lIGNlbGwgaW5mbyB0byBtdWx0aXBsZSBjb2x1bW5zXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaWR4PTA7IGlkeDxjb2xzcGFuOyArK2lkeCkge1xuICAgICAgICAgICAgICAgICAgICBjdXJSb3cucHVzaChjZWxsSW5mbyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIENvbnRpbnVlIGhhbmRsaW5nIGNlbGxzIHdpdGggcm93c3BhbiBmcm9tIHByZXZpb3VzIHJvd3NcbiAgICAgICAgICAgICAgICB3aGlsZSAocHJldlJvdyAmJiBjdXJSb3cubGVuZ3RoIDwgcHJldlJvdy5sZW5ndGggJiZcbiAgICAgICAgICAgICAgICAgICAgICAoKHByZXZSb3dbY3VyUm93Lmxlbmd0aF0ucm93SW5kZXhTdGFydCArIHByZXZSb3dbY3VyUm93Lmxlbmd0aF0ucm93c3BhbiAtIDEpID49IHJldFZhbC5sZW5ndGgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGN1clJvdy5wdXNoKHByZXZSb3dbY3VyUm93Lmxlbmd0aF0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIGNlbGwgbW9kZWwgZm9yIGEgc3BlY2lmaWMgY2VsbCBpbiB0aGUgdGFibGVcbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gZmluZHMgdGhlIENlbGxNb2RlbCBvYmplY3QgdGhhdCByZXByZXNlbnRzIGEgc3BlY2lmaWMgY2VsbCxcbiAgICAgKiB3aGljaCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBpdHMgcG9zaXRpb24gYW5kIHNwYW5uaW5nLlxuICAgICAqXG4gICAgICogQHBhcmFtIGluQ2VsbEN1cnNvciAtIEEgY3Vyc29yIHBvaW50aW5nIHRvIGEgY2VsbCBvciBpdHMgY29udGVudHNcbiAgICAgKiBAcGFyYW0gdGFibGVNb2RlbCAtIE9wdGlvbmFsIHByZS1idWlsdCB0YWJsZSBtb2RlbCAod2lsbCBiZSBjcmVhdGVkIGlmIG5vdCBwcm92aWRlZClcbiAgICAgKiBAcmV0dXJucyBUaGUgQ2VsbE1vZGVsIGZvciB0aGUgc3BlY2lmaWVkIGNlbGwsIG9yIG51bGwgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGdldENlbGxNb2RlbChpbkNlbGxDdXJzb3I6IFNSQ3Vyc29yLCB0YWJsZU1vZGVsPzogVGFibGVNb2RlbCkgOiBDZWxsTW9kZWwge1xuICAgICAgICBsZXQgY2VsbEN1cnNvciA9IGdldEN1cnJlbnRPclBhcmVudENlbGxDdXJzb3IoaW5DZWxsQ3Vyc29yKTtcbiAgICAgICAgaWYgKCF0YWJsZU1vZGVsKSB7XG4gICAgICAgICAgICB0YWJsZU1vZGVsID0gZ2V0VGFibGVNb2RlbChpbkNlbGxDdXJzb3IpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNlYXJjaCB0aHJvdWdoIHRoZSB0YWJsZSBtb2RlbCB0byBmaW5kIHRoZSBtYXRjaGluZyBjZWxsXG4gICAgICAgIGZvciAobGV0IHJvd0luZGV4ID0gMDsgcm93SW5kZXggPCB0YWJsZU1vZGVsLmxlbmd0aDsgKytyb3dJbmRleCkge1xuICAgICAgICAgICAgZm9yIChsZXQgY29sSW5kZXggPSAwOyBjb2xJbmRleCA8IHRhYmxlTW9kZWxbcm93SW5kZXhdLmxlbmd0aDsgKytjb2xJbmRleCkge1xuICAgICAgICAgICAgICAgIGlmICh0YWJsZU1vZGVsW3Jvd0luZGV4XVtjb2xJbmRleF0uY2VsbEN1cnNvci5pc1NhbWVOb2RlKGNlbGxDdXJzb3IpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0YWJsZU1vZGVsW3Jvd0luZGV4XVtjb2xJbmRleF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENoZWNrcyBpZiBhIGNlbGwgc3BhbnMgYSBzcGVjaWZpYyBjb2x1bW5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBjZWxsTW9kZWwgLSBUaGUgY2VsbCBtb2RlbCB0byBjaGVja1xuICAgICAqIEBwYXJhbSBjb2xJZHggLSBUaGUgY29sdW1uIGluZGV4IHRvIGNoZWNrXG4gICAgICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgY2VsbCBjb250YWlucyB0aGUgc3BlY2lmaWVkIGNvbHVtblxuICAgICAqL1xuICAgIGV4cG9ydCBmdW5jdGlvbiBjZWxsTW9kZWxDb250YWluc0NvbHVtbihjZWxsTW9kZWw6IENlbGxNb2RlbCwgY29sSWR4OiBudW1iZXIpIHtcbiAgICAgICAgcmV0dXJuIGNvbElkeCA+PSBjZWxsTW9kZWwuY29sSW5kZXhTdGFydCAmJiBjb2xJZHggPCBjZWxsTW9kZWwuY29sSW5kZXhTdGFydCtjZWxsTW9kZWwuY29sc3BhbjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYSBjZWxsIHNwYW5zIGEgc3BlY2lmaWMgcm93XG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2VsbE1vZGVsIC0gVGhlIGNlbGwgbW9kZWwgdG8gY2hlY2tcbiAgICAgKiBAcGFyYW0gcm93SWR4IC0gVGhlIHJvdyBpbmRleCB0byBjaGVja1xuICAgICAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGNlbGwgY29udGFpbnMgdGhlIHNwZWNpZmllZCByb3dcbiAgICAgKi9cbiAgICBleHBvcnQgZnVuY3Rpb24gY2VsbE1vZGVsQ29udGFpbnNSb3coY2VsbE1vZGVsOiBDZWxsTW9kZWwsIHJvd0lkeDogbnVtYmVyKSB7XG4gICAgICAgIHJldHVybiByb3dJZHggPj0gY2VsbE1vZGVsLnJvd0luZGV4U3RhcnQgJiYgcm93SWR4IDwgY2VsbE1vZGVsLnJvd0luZGV4U3RhcnQrY2VsbE1vZGVsLnJvd3NwYW47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgcm93IGhlYWRlcnMgYXNzb2NpYXRlZCB3aXRoIGEgY2VsbFxuICAgICAqIEZpcnN0IGNoZWNrcyBmb3IgZXhwbGljaXQgaGVhZGVycyBhdHRyaWJ1dGUsIHRoZW4gbG9va3MgZm9yIHJvdyBoZWFkZXJzIGluIHRoZSBzYW1lIHJvd1xuICAgICAqIEBwYXJhbSBjdXJzb3IgLSBUaGUgU1JDdXJzb3IgcG9pbnRpbmcgdG8gYSBjZWxsXG4gICAgICogQHJldHVybnMgQSBzdHJpbmcgY29udGFpbmluZyB0aGUgY29uY2F0ZW5hdGVkIGhlYWRlciBuYW1lc1xuICAgICAqL1xuICAgIGV4cG9ydCBmdW5jdGlvbiBnZXRSb3dIZWFkZXJzKGN1cnNvcjogU1JDdXJzb3IpIHtcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0cyB0aGUgY29sdW1uIGhlYWRlcnMgYXNzb2NpYXRlZCB3aXRoIGEgY2VsbFxuICAgICAqIEZpcnN0IGNoZWNrcyBmb3IgZXhwbGljaXQgaGVhZGVycyBhdHRyaWJ1dGUsIHRoZW4gbG9va3MgZm9yIGNvbHVtbiBoZWFkZXJzIGluIHRoZSBzYW1lIGNvbHVtblxuICAgICAqIEBwYXJhbSBjdXJzb3IgLSBUaGUgU1JDdXJzb3IgcG9pbnRpbmcgdG8gYSBjZWxsXG4gICAgICogQHJldHVybnMgQSBzdHJpbmcgY29udGFpbmluZyB0aGUgY29uY2F0ZW5hdGVkIGhlYWRlciBuYW1lc1xuICAgICAqL1xuICAgIGV4cG9ydCBmdW5jdGlvbiBnZXRDb2x1bW5IZWFkZXJzRm9yQ3Vyc29yKGluQ2VsbEN1cnNvcjogU1JDdXJzb3IsIHRhYmxlTW9kZWw/OiBUYWJsZU1vZGVsKSB7XG4gICAgICAgIGlmICghdGFibGVNb2RlbCkge1xuICAgICAgICAgICAgdGFibGVNb2RlbCA9IGdldFRhYmxlTW9kZWwoaW5DZWxsQ3Vyc29yKTtcbiAgICAgICAgICAgIGlmICghdGFibGVNb2RlbCkgcmV0dXJuIFwiXCI7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2VsbE1vZGVsID0gZ2V0Q2VsbE1vZGVsKGluQ2VsbEN1cnNvciwgdGFibGVNb2RlbCk7XG4gICAgICAgIGlmICghY2VsbE1vZGVsKSByZXR1cm4gXCJcIjtcblxuICAgICAgICBjb25zdCBjZWxsQ3Vyc29yID0gY2VsbE1vZGVsLmNlbGxDdXJzb3I7XG4gICAgICAgIGlmICghY2VsbEN1cnNvcikgcmV0dXJuIFwiXCI7XG5cbiAgICAgICAgY29uc3QgY2VsbEVsZW0gPSBjZWxsQ3Vyc29yLmdldEVsZW1lbnQoKTtcbiAgICAgICAgaWYgKCFjZWxsRWxlbSkgcmV0dXJuIFwiXCI7XG5cbiAgICAgICAgY29uc3QgY29sRGF0YXM6IEFycmF5PHtcbiAgICAgICAgICAgIHBvdGVudGlhbENvbEhlYWRlcnM6IFNSQ3Vyc29yW10sXG4gICAgICAgICAgICBleGlzdHNEYXRhQ2VsbDogYm9vbGVhbixcbiAgICAgICAgICAgIGNvbElkeDogbnVtYmVyXG4gICAgICAgIH0+ID0gW107XG4gICAgICAgIGZvciAobGV0IGNvbElkeCA9IGNlbGxNb2RlbC5jb2xJbmRleFN0YXJ0OyBjb2xJZHggPCBjZWxsTW9kZWwuY29sSW5kZXhTdGFydCtjZWxsTW9kZWwuY29sc3BhbjsgKytjb2xJZHgpIHtcbiAgICAgICAgICAgIGNvbERhdGFzLnB1c2goe1xuICAgICAgICAgICAgICAgIHBvdGVudGlhbENvbEhlYWRlcnM6IFtdLFxuICAgICAgICAgICAgICAgIGV4aXN0c0RhdGFDZWxsOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBjb2xJZHhcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGxldCBwb3RlbnRpYWxIZWFkZXJzOiBTUkN1cnNvcltdID0gW107XG4gICAgICAgIGlmIChjZWxsRWxlbS5oYXNBdHRyaWJ1dGUoXCJoZWFkZXJzXCIpKSB7XG4gICAgICAgICAgICBwb3RlbnRpYWxIZWFkZXJzID0gY2VsbEVsZW0uZ2V0QXR0cmlidXRlKFwiaGVhZGVyc1wiKVxuICAgICAgICAgICAgICAgIC8vIFNwbGl0IHRoZSBoZWFkZXIgYXR0cmlidXRlIGludG8gaWRzXG4gICAgICAgICAgICAgICAgLnNwbGl0KFwiIFwiKVxuICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgbm9kZSBmb3IgZWFjaCBpZFxuICAgICAgICAgICAgICAgIC5tYXAoaWQgPT4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpKVxuICAgICAgICAgICAgICAgIC8vIEdldCByaWQgb2YgYmFkIG1hcHBpbmdzXG4gICAgICAgICAgICAgICAgLmZpbHRlcihub2RlID0+ICEhbm9kZSlcbiAgICAgICAgICAgICAgICAvLyBDb252ZXJ0IHRvIFNSQ3Vyc29ycyB0byB0aGF0IHdlIGNhbiBnZXQgYWNjZXNzaWJsZSBuYW1lc1xuICAgICAgICAgICAgICAgIC5tYXAobm9kZSA9PiBuZXcgU1JDdXJzb3Iobm9kZSkpXG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIGhlYWRlcnMgdGhhdCBhcmVuJ3QgaW4gdGhlIHNhbWUgY29sdW1uIChpZ25vcmUgY29sdW1uIGhlYWRlcnMpXG4gICAgICAgICAgICAgICAgLmZpbHRlcihjdXJzb3IgPT4gY29sRGF0YXMuc29tZShjb2xEYXRhID0+IGNlbGxNb2RlbENvbnRhaW5zQ29sdW1uKFNSVGFibGVVdGlsLmdldENlbGxNb2RlbChjdXJzb3IsIHRhYmxlTW9kZWwpLCBjb2xEYXRhLmNvbElkeCkpKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gR2V0IGFsbCBjZWxscyBpbiB0aGlzIGNvbHVtblxuICAgICAgICAgICAgLy8gTm90ZSAtIGlmIGV2ZXJ5dGhpbmcgaW4gdGhpcyBjb2x1bW4gaXMgZW1wdHkgb3IgYSBoZWFkZXIgY2VsbCwgdGhpcyBpcyBwcm9iYWJseSBub3QgYSBoZWFkaW5nXG4gICAgICAgICAgICBmb3IgKGxldCByb3dJZHg9MDsgcm93SWR4IDwgdGFibGVNb2RlbC5sZW5ndGg7ICsrcm93SWR4KSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBjb2xEYXRhIG9mIGNvbERhdGFzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbElkeCA9IGNvbERhdGEuY29sSWR4O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGVja0luZm8gPSB0YWJsZU1vZGVsW3Jvd0lkeF1bY29sSWR4XTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hlY2tDdXJzb3IgPSBjaGVja0luZm8uY2VsbEN1cnNvcjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hlY2tDdXJzb3JFbGVtID0gY2hlY2tDdXJzb3IuZ2V0RWxlbWVudCgpO1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIHJvdy9jb2wgaXNuJ3QgZm91bmQsIG9yIGlzIHRoZSBzYW1lIGN1cnNvciBhcyBvdXIgb3JpZ2luYWwgY2VsbCBtb2RlbCwgb3IgYWxyZWFkeSBpbiBvdXIgbGlzdCwgc2tpcCwgYnV0IGNoZWNrIGlmIGl0J3MgYSBkYXRhIGNlbGxcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGVja0luZm8gfHwgIWNoZWNrQ3Vyc29yIHx8IGNoZWNrQ3Vyc29yLmlzU2FtZU5vZGUoY2VsbEN1cnNvcikgfHwgcG90ZW50aWFsSGVhZGVycy5zb21lKGMgPT4gY2hlY2tDdXJzb3IuaXNTYW1lTm9kZShjKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbERhdGEuZXhpc3RzRGF0YUNlbGwgPSBjb2xEYXRhLmV4aXN0c0RhdGFDZWxsIHx8IChpc0RhdGFDZWxsKGNoZWNrQ3Vyc29yKSAmJiAoY2hlY2tDdXJzb3IuaGFzTm9uRW1wdHlOYW1lKCkgfHwgY29sRGF0YS5wb3RlbnRpYWxDb2xIZWFkZXJzLmxlbmd0aCA+IDApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYyA9IGNoZWNrQ3Vyc29yLmNsb25lKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGVja0N1cnNvci5nZXRSb2xlKCkgPT09IFwiY29sdW1uaGVhZGVyXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvdGVudGlhbEhlYWRlcnMucHVzaChjKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbERhdGEucG90ZW50aWFsQ29sSGVhZGVycy5wdXNoKGMpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFjaGVja0N1cnNvckVsZW0uaGFzQXR0cmlidXRlKFwicm9sZVwiKSAmJiBjaGVja0N1cnNvckVsZW0ubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJUSFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tDdXJzb3JFbGVtLmdldEF0dHJpYnV0ZShcInNjb3BlXCIpID09PSBcImNvbFwiIHx8IGNoZWNrQ3Vyc29yRWxlbS5nZXRBdHRyaWJ1dGUoXCJzY29wZVwiKSA9PT0gXCJheGlzXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3RlbnRpYWxIZWFkZXJzLnB1c2goYyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sRGF0YS5wb3RlbnRpYWxDb2xIZWFkZXJzLnB1c2goYyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFjaGVja0N1cnNvckVsZW0uaGFzQXR0cmlidXRlKFwic2NvcGVcIikgJiYgY2hlY2tDdXJzb3IuaGFzTm9uRW1wdHlOYW1lKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3RlbnRpYWxIZWFkZXJzLnB1c2goYyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sRGF0YS5wb3RlbnRpYWxDb2xIZWFkZXJzLnB1c2goYyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xEYXRhLmV4aXN0c0RhdGFDZWxsID0gY29sRGF0YS5leGlzdHNEYXRhQ2VsbCB8fCAoaXNEYXRhQ2VsbChjaGVja0N1cnNvcikgJiYgKGNoZWNrQ3Vyc29yLmhhc05vbkVtcHR5TmFtZSgpIHx8IGNvbERhdGEucG90ZW50aWFsQ29sSGVhZGVycy5sZW5ndGggPiAwKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNvbERhdGEgb2YgY29sRGF0YXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWNvbERhdGEuZXhpc3RzRGF0YUNlbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgY29sRGF0YS5wb3RlbnRpYWxDb2xIZWFkZXJzID0gW107XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcG90ZW50aWFsSGVhZGVycyA9IHBvdGVudGlhbEhlYWRlcnMuZmlsdGVyKG9uZSA9PiBjb2xEYXRhcy5zb21lKGNvbERhdGEgPT4gY29sRGF0YS5wb3RlbnRpYWxDb2xIZWFkZXJzLnNvbWUodHdvID0+IHR3by5pc1NhbWVOb2RlKG9uZSkpKSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcG90ZW50aWFsSGVhZGVyc1xuICAgICAgICAgICAgLy8gQW5kIHRoZW4gcmV0dXJuIHRoZSBuYW1lcyBvZiB0aGUgaGVhZGVyc1xuICAgICAgICAgICAgLm1hcChjdXJzb3IgPT4gY3Vyc29yLmdldE5hbWVJbmZvKCk/Lm5hbWUgfHwgXCJcIilcbiAgICAgICAgICAgIC5tYXAocyA9PiBzLnRyaW0oKSlcbiAgICAgICAgICAgIC5maWx0ZXIocyA9PiBzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAuam9pbihcIiwgXCIpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldHMgdGhlIHJvdyBoZWFkZXJzIGFzc29jaWF0ZWQgd2l0aCBhIGNlbGxcbiAgICAgKiBGaXJzdCBjaGVja3MgZm9yIGV4cGxpY2l0IGhlYWRlcnMgYXR0cmlidXRlLCB0aGVuIGxvb2tzIGZvciByb3cgaGVhZGVycyBpbiB0aGUgc2FtZSByb3dcbiAgICAgKiBAcGFyYW0gY3Vyc29yIC0gVGhlIFNSQ3Vyc29yIHBvaW50aW5nIHRvIGEgY2VsbFxuICAgICAqIEByZXR1cm5zIEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGNvbmNhdGVuYXRlZCBoZWFkZXIgbmFtZXNcbiAgICAgKi9cbiAgICBleHBvcnQgZnVuY3Rpb24gZ2V0Um93SGVhZGVyc0ZvckN1cnNvcihpbkNlbGxDdXJzb3I6IFNSQ3Vyc29yLCB0YWJsZU1vZGVsPzogVGFibGVNb2RlbCkge1xuICAgICAgICBpZiAoIXRhYmxlTW9kZWwpIHtcbiAgICAgICAgICAgIHRhYmxlTW9kZWwgPSBnZXRUYWJsZU1vZGVsKGluQ2VsbEN1cnNvcik7XG4gICAgICAgICAgICBpZiAoIXRhYmxlTW9kZWwpIHJldHVybiBcIlwiO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNlbGxNb2RlbCA9IGdldENlbGxNb2RlbChpbkNlbGxDdXJzb3IsIHRhYmxlTW9kZWwpO1xuICAgICAgICBpZiAoIWNlbGxNb2RlbCkgcmV0dXJuIFwiXCI7XG5cbiAgICAgICAgY29uc3QgY2VsbEN1cnNvciA9IGNlbGxNb2RlbC5jZWxsQ3Vyc29yO1xuICAgICAgICBpZiAoIWNlbGxDdXJzb3IpIHJldHVybiBcIlwiO1xuXG4gICAgICAgIGNvbnN0IGNlbGxFbGVtID0gY2VsbEN1cnNvci5nZXRFbGVtZW50KCk7XG4gICAgICAgIGlmICghY2VsbEVsZW0pIHJldHVybiBcIlwiO1xuXG4gICAgICAgIGNvbnN0IHJvd0RhdGFzOiBBcnJheTx7XG4gICAgICAgICAgICBwb3RlbnRpYWxSb3dIZWFkZXJzOiBTUkN1cnNvcltdLFxuICAgICAgICAgICAgZXhpc3RzRGF0YUNlbGw6IGJvb2xlYW4sXG4gICAgICAgICAgICByb3dJZHg6IG51bWJlclxuICAgICAgICB9PiA9IFtdO1xuICAgICAgICBmb3IgKGxldCByb3dJZHggPSBjZWxsTW9kZWwucm93SW5kZXhTdGFydDsgcm93SWR4IDwgY2VsbE1vZGVsLnJvd0luZGV4U3RhcnQrY2VsbE1vZGVsLnJvd3NwYW47ICsrcm93SWR4KSB7XG4gICAgICAgICAgICByb3dEYXRhcy5wdXNoKHtcbiAgICAgICAgICAgICAgICBwb3RlbnRpYWxSb3dIZWFkZXJzOiBbXSxcbiAgICAgICAgICAgICAgICBleGlzdHNEYXRhQ2VsbDogZmFsc2UsXG4gICAgICAgICAgICAgICAgcm93SWR4XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwb3RlbnRpYWxIZWFkZXJzOiBTUkN1cnNvcltdID0gW107XG4gICAgICAgIGlmIChjZWxsRWxlbS5oYXNBdHRyaWJ1dGUoXCJoZWFkZXJzXCIpKSB7XG4gICAgICAgICAgICBwb3RlbnRpYWxIZWFkZXJzID0gY2VsbEVsZW0uZ2V0QXR0cmlidXRlKFwiaGVhZGVyc1wiKVxuICAgICAgICAgICAgICAgIC8vIFNwbGl0IHRoZSBoZWFkZXIgYXR0cmlidXRlIGludG8gaWRzXG4gICAgICAgICAgICAgICAgLnNwbGl0KFwiIFwiKVxuICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgbm9kZSBmb3IgZWFjaCBpZFxuICAgICAgICAgICAgICAgIC5tYXAoaWQgPT4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpKVxuICAgICAgICAgICAgICAgIC8vIEdldCByaWQgb2YgYmFkIG1hcHBpbmdzXG4gICAgICAgICAgICAgICAgLmZpbHRlcihub2RlID0+ICEhbm9kZSlcbiAgICAgICAgICAgICAgICAvLyBDb252ZXJ0IHRvIFNSQ3Vyc29ycyB0byB0aGF0IHdlIGNhbiBnZXQgYWNjZXNzaWJsZSBuYW1lc1xuICAgICAgICAgICAgICAgIC5tYXAobm9kZSA9PiBuZXcgU1JDdXJzb3Iobm9kZSkpXG4gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIGhlYWRlcnMgdGhhdCBhcmVuJ3QgaW4gdGhlIHNhbWUgcm93IChpZ25vcmUgY29sdW1uIGhlYWRlcnMpXG4gICAgICAgICAgICAgICAgLmZpbHRlcihjdXJzb3IgPT4gcm93RGF0YXMuc29tZShyb3dEYXRhID0+IGNlbGxNb2RlbENvbnRhaW5zUm93KFNSVGFibGVVdGlsLmdldENlbGxNb2RlbChjdXJzb3IsIHRhYmxlTW9kZWwpLCByb3dEYXRhLnJvd0lkeCkpKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gR2V0IGFsbCBjZWxscyBpbiB0aGUgcm93c1xuICAgICAgICAgICAgLy8gTm90ZSAtIGlmIGV2ZXJ5dGhpbmcgaW4gdGhlIHJvdyBpcyBlbXB0eSBvciBhIGhlYWRlciBjZWxsLCB0aGlzIGlzIHByb2JhYmx5IG5vdCBhIGhlYWRpbmdcbiAgICAgICAgICAgIGxldCBsb25nZXN0Um93ID0gcm93RGF0YXMucmVkdWNlKChwcmV2LCBjdXIpID0+IE1hdGgubWF4KHByZXYsIHRhYmxlTW9kZWxbY3VyLnJvd0lkeF0ubGVuZ3RoKSwgMCk7XG4gICAgICAgICAgICBmb3IgKGxldCBjb2xJZHg9MDsgY29sSWR4IDwgbG9uZ2VzdFJvdzsgKytjb2xJZHgpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHJvd0RhdGEgb2Ygcm93RGF0YXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgcm93SWR4ID0gcm93RGF0YS5yb3dJZHg7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb2xJZHggPj0gdGFibGVNb2RlbFtyb3dJZHhdLmxlbmd0aCkgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoZWNrSW5mbyA9IHRhYmxlTW9kZWxbcm93SWR4XVtjb2xJZHhdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGVja0N1cnNvciA9IGNoZWNrSW5mby5jZWxsQ3Vyc29yO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGVja0N1cnNvckVsZW0gPSBjaGVja0N1cnNvci5nZXRFbGVtZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgcm93L2NvbCBpc24ndCBmb3VuZCwgb3IgaXMgdGhlIHNhbWUgY3Vyc29yIGFzIG91ciBvcmlnaW5hbCBjZWxsIG1vZGVsLCBvciBhbHJlYWR5IGluIG91ciBsaXN0LCBza2lwLCBidXQgY2hlY2sgaWYgaXQncyBhIGRhdGEgY2VsbFxuICAgICAgICAgICAgICAgICAgICBpZiAoIWNoZWNrSW5mbyB8fCAhY2hlY2tDdXJzb3IgfHwgY2hlY2tDdXJzb3IuaXNTYW1lTm9kZShjZWxsQ3Vyc29yKSB8fCBwb3RlbnRpYWxIZWFkZXJzLnNvbWUoYyA9PiBjaGVja0N1cnNvci5pc1NhbWVOb2RlKGMpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcm93RGF0YS5leGlzdHNEYXRhQ2VsbCA9IHJvd0RhdGEuZXhpc3RzRGF0YUNlbGwgfHwgKGlzRGF0YUNlbGwoY2hlY2tDdXJzb3IpICYmIChjaGVja0N1cnNvci5oYXNOb25FbXB0eU5hbWUoKSB8fCByb3dEYXRhLnBvdGVudGlhbFJvd0hlYWRlcnMubGVuZ3RoID4gMCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjID0gY2hlY2tDdXJzb3IuY2xvbmUoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoZWNrQ3Vyc29yLmdldFJvbGUoKSA9PT0gXCJyb3doZWFkZXJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcG90ZW50aWFsSGVhZGVycy5wdXNoKGMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcm93RGF0YS5wb3RlbnRpYWxSb3dIZWFkZXJzLnB1c2goYyk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWNoZWNrQ3Vyc29yRWxlbS5oYXNBdHRyaWJ1dGUoXCJyb2xlXCIpICYmIGNoZWNrQ3Vyc29yRWxlbS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIlRIXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGVja0N1cnNvckVsZW0uZ2V0QXR0cmlidXRlKFwic2NvcGVcIikgPT09IFwicm93XCIgfHwgY2hlY2tDdXJzb3JFbGVtLmdldEF0dHJpYnV0ZShcInNjb3BlXCIpID09PSBcImF4aXNcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvdGVudGlhbEhlYWRlcnMucHVzaChjKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dEYXRhLnBvdGVudGlhbFJvd0hlYWRlcnMucHVzaChjKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWNoZWNrQ3Vyc29yRWxlbS5oYXNBdHRyaWJ1dGUoXCJzY29wZVwiKSAmJiBjaGVja0N1cnNvci5oYXNOb25FbXB0eU5hbWUoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvdGVudGlhbEhlYWRlcnMucHVzaChjKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3dEYXRhLnBvdGVudGlhbFJvd0hlYWRlcnMucHVzaChjKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvd0RhdGEuZXhpc3RzRGF0YUNlbGwgPSByb3dEYXRhLmV4aXN0c0RhdGFDZWxsIHx8IChpc0RhdGFDZWxsKGNoZWNrQ3Vyc29yKSAmJiAoY2hlY2tDdXJzb3IuaGFzTm9uRW1wdHlOYW1lKCkgfHwgcm93RGF0YS5wb3RlbnRpYWxSb3dIZWFkZXJzLmxlbmd0aCA+IDApKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoY29uc3Qgcm93RGF0YSBvZiByb3dEYXRhcykge1xuICAgICAgICAgICAgICAgIGlmICghcm93RGF0YS5leGlzdHNEYXRhQ2VsbCkge1xuICAgICAgICAgICAgICAgICAgICByb3dEYXRhLnBvdGVudGlhbFJvd0hlYWRlcnMgPSBbXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwb3RlbnRpYWxIZWFkZXJzID0gcG90ZW50aWFsSGVhZGVycy5maWx0ZXIob25lID0+IHJvd0RhdGFzLnNvbWUocm93RGF0YSA9PiByb3dEYXRhLnBvdGVudGlhbFJvd0hlYWRlcnMuc29tZSh0d28gPT4gdHdvLmlzU2FtZU5vZGUob25lKSkpKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwb3RlbnRpYWxIZWFkZXJzXG4gICAgICAgICAgICAvLyBBbmQgdGhlbiByZXR1cm4gdGhlIG5hbWVzIG9mIHRoZSBoZWFkZXJzXG4gICAgICAgICAgICAubWFwKGN1cnNvciA9PiBjdXJzb3IuZ2V0TmFtZUluZm8oKT8ubmFtZSB8fCBcIlwiKVxuICAgICAgICAgICAgLm1hcChzID0+IHMudHJpbSgpKVxuICAgICAgICAgICAgLmZpbHRlcihzID0+IHMubGVuZ3RoID4gMClcbiAgICAgICAgICAgIC5qb2luKFwiLCBcIik7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGV0ZXJtaW5lcyBpZiBhIGNlbGwgaXMgYSBkYXRhIGNlbGwgKG5vdCBhIGhlYWRlciBjZWxsKVxuICAgICAqXG4gICAgICogQSBkYXRhIGNlbGwgaXMgb25lIHdpdGggZWl0aGVyOlxuICAgICAqIC0gQW4gZXhwbGljaXQgQVJJQSByb2xlIG9mIFwiY2VsbFwiXG4gICAgICogLSBBIFREIGVsZW1lbnQgd2l0aG91dCBhbiBvdmVycmlkaW5nIHJvbGUgYXR0cmlidXRlXG4gICAgICpcbiAgICAgKiBAcGFyYW0gY2hlY2tDdXJzb3IgLSBUaGUgY3Vyc29yIHRvIGNoZWNrXG4gICAgICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgY3Vyc29yIHBvaW50cyB0byBhIGRhdGEgY2VsbFxuICAgICAqL1xuICAgIGV4cG9ydCBmdW5jdGlvbiBpc0RhdGFDZWxsKGNoZWNrQ3Vyc29yOiBTUkN1cnNvcikge1xuICAgICAgICBjb25zdCBjaGVja0N1cnNvckVsZW0gPSBjaGVja0N1cnNvci5nZXRFbGVtZW50KCk7XG4gICAgICAgIGlmICghY2hlY2tDdXJzb3JFbGVtKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiBjaGVja0N1cnNvci5nZXRSb2xlKCkgPT09IFwiY2VsbFwiIHx8ICghY2hlY2tDdXJzb3JFbGVtLmhhc0F0dHJpYnV0ZShcInJvbGVcIikgJiYgY2hlY2tDdXJzb3JFbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiVERcIik7XG4gICAgfVxufSIsImltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4uL3V0aWwvQXJpYVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi4vdXRpbC9WaXNVdGlsXCI7XG5cbmV4cG9ydCBuYW1lc3BhY2UgU1JVdGlsIHtcbiAgICBleHBvcnQgZnVuY3Rpb24gaXNNb2RhbERpYWxvZ0VsZW1lbnQobm9kZTogTm9kZSkge1xuICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSAhPT0gMSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBjb25zdCBlbGVtID0gbm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgY29uc3Qgcm9sZSA9IEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZShlbGVtLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIHJvbGUgPT09IFwiZGlhbG9nXCIgJiYgZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLW1vZGFsXCIpID09PSBcInRydWVcIiAmJiBWaXNVdGlsLmlzTm9kZVZpc2libGUobm9kZSlcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZXMgYSB1bmlxdWUgQ1NTIHNlbGVjdG9yIGZvciBhIHNwZWNpZmljIEhUTUwgZWxlbWVudFxuICAgICAqIFRoZSBzZWxlY3RvciBpcyBidWlsdCB1c2luZyBhIGNvbWJpbmF0aW9uIG9mOlxuICAgICAqIDEuIEVsZW1lbnQgdGFnIG5hbWVcbiAgICAgKiAyLiBJRCAoaWYgYXZhaWxhYmxlKVxuICAgICAqIDMuIENsYXNzZXMgKGlmIGF2YWlsYWJsZSlcbiAgICAgKiA0LiBBdHRyaWJ1dGVzIChpZiBuZWVkZWQpXG4gICAgICogNS4gbnRoLWNoaWxkIHNlbGVjdG9ycyBmb3IgcG9zaXRpb24gaW4gcGFyZW50XG4gICAgICogXG4gICAgICogQHBhcmFtIGVsZW1lbnQgVGhlIEhUTUwgZWxlbWVudCB0byBnZW5lcmF0ZSBhIHNlbGVjdG9yIGZvclxuICAgICAqIEBwYXJhbSBvcHRpbWl6ZWQgSWYgdHJ1ZSwgY3JlYXRlcyBhIHNob3J0ZXIgYnV0IHBvc3NpYmx5IGxlc3Mgcm9idXN0IHNlbGVjdG9yXG4gICAgICogQHJldHVybiBBIENTUyBzZWxlY3RvciBzdHJpbmcgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIHRoZSBlbGVtZW50XG4gICAgICovXG4gICAgZXhwb3J0IGZ1bmN0aW9uIGdldFVuaXF1ZVNlbGVjdG9yKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBvcHRpbWl6ZWQ6IGJvb2xlYW4gPSBmYWxzZSk6IHN0cmluZyB7XG4gICAgICAgIC8vIElmIHRoZSBlbGVtZW50IGhhcyBhbiBJRCwgdGhhdCdzIHRoZSBtb3N0IGRpcmVjdCB3YXkgdG8gc2VsZWN0IGl0XG4gICAgICAgIGlmIChlbGVtZW50LmlkKSB7XG4gICAgICAgICAgICByZXR1cm4gYCMke0NTUy5lc2NhcGUoZWxlbWVudC5pZCl9YDtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gSWYgd2UncmUgYXQgdGhlIHJvb3Qgb3IgZG9jdW1lbnQgZWxlbWVudCwgcmV0dXJuIHRoZSB0YWcgbmFtZVxuICAgICAgICBpZiAoZWxlbWVudC5pc1NhbWVOb2RlKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkgfHwgZWxlbWVudC5pc1NhbWVOb2RlKGRvY3VtZW50LmJvZHkpKSB7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIFN0YXJ0IGJ1aWxkaW5nIHRoZSBzZWxlY3RvciB3aXRoIHRoZSB0YWcgbmFtZVxuICAgICAgICBsZXQgc2VsZWN0b3IgPSBlbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgXG4gICAgICAgIC8vIEFkZCBjbGFzc2VzIGlmIGF2YWlsYWJsZSBhbmQgd2UncmUgbm90IG9wdGltaXppbmcgZm9yIGJyZXZpdHlcbiAgICAgICAgaWYgKGVsZW1lbnQuY2xhc3NMaXN0Lmxlbmd0aCAmJiAhb3B0aW1pemVkKSB7XG4gICAgICAgICAgICAvLyBUYWtlIHVwIHRvIDMgY2xhc3NlcyB0byBhdm9pZCBvdmVybHkgc3BlY2lmaWMgc2VsZWN0b3JzXG4gICAgICAgICAgICBjb25zdCBjbGFzc2VzID0gQXJyYXkuZnJvbShlbGVtZW50LmNsYXNzTGlzdCkuc2xpY2UoMCwgMyk7XG4gICAgICAgICAgICBzZWxlY3RvciArPSBjbGFzc2VzLm1hcChjbHMgPT4gYC4ke0NTUy5lc2NhcGUoY2xzKX1gKS5qb2luKCcnKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gQWRkIGRpc3Rpbmd1aXNoaW5nIGF0dHJpYnV0ZXMgaWYgbmVlZGVkIGFuZCBub3Qgb3B0aW1pemluZ1xuICAgICAgICBpZiAoIW9wdGltaXplZCkge1xuICAgICAgICAgICAgLy8gQ29uc2lkZXIgYWRkaW5nIHJvbGUsIGFyaWEtbGFiZWwsIG9yIG90aGVyIGRpc3RpbmN0aXZlIGF0dHJpYnV0ZXNcbiAgICAgICAgICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZSgncm9sZScpKSB7XG4gICAgICAgICAgICAgICAgc2VsZWN0b3IgKz0gYFtyb2xlPVwiJHtDU1MuZXNjYXBlKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdyb2xlJykgfHwgJycpfVwiXWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZSgnYXJpYS1sYWJlbCcpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGFiZWwgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcpIHx8ICcnO1xuICAgICAgICAgICAgICAgIGlmIChsYWJlbC5sZW5ndGggPD0gMjApIHsgLy8gQXZvaWQgb3Zlcmx5IGxvbmcgc2VsZWN0b3JzXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yICs9IGBbYXJpYS1sYWJlbD1cIiR7Q1NTLmVzY2FwZShsYWJlbCl9XCJdYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIEZvciBpbnB1dHMsIGFkZCB0eXBlIGF0dHJpYnV0ZVxuICAgICAgICAgICAgaWYgKGVsZW1lbnQudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnaW5wdXQnICYmIGVsZW1lbnQuaGFzQXR0cmlidXRlKCd0eXBlJykpIHtcbiAgICAgICAgICAgICAgICBzZWxlY3RvciArPSBgW3R5cGU9XCIke0NTUy5lc2NhcGUoZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3R5cGUnKSB8fCAnJyl9XCJdYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gSWYgd2UgaGF2ZSBhIHBhcmVudCBub2RlLCBkZXRlcm1pbmUgcG9zaXRpb24gYW1vbmcgc2libGluZ3NcbiAgICAgICAgaWYgKGVsZW1lbnQucGFyZW50RWxlbWVudCkge1xuICAgICAgICAgICAgLy8gRmluZCBhbGwgc2libGluZ3Mgd2l0aCB0aGUgc2FtZSB0YWdcbiAgICAgICAgICAgIGNvbnN0IHNpYmxpbmdzID0gQXJyYXkuZnJvbShlbGVtZW50LnBhcmVudEVsZW1lbnQuY2hpbGRyZW4pXG4gICAgICAgICAgICAgICAgLmZpbHRlcihjaGlsZCA9PiBjaGlsZC50YWdOYW1lID09PSBlbGVtZW50LnRhZ05hbWUpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBJZiB0aGVyZSdzIG1vcmUgdGhhbiBvbmUgc2libGluZyB3aXRoIHRoZSBzYW1lIHRhZywgYWRkIG50aC1jaGlsZFxuICAgICAgICAgICAgaWYgKHNpYmxpbmdzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IHNpYmxpbmdzLmluZGV4T2YoZWxlbWVudCkgKyAxO1xuICAgICAgICAgICAgICAgIHNlbGVjdG9yICs9IGA6bnRoLW9mLXR5cGUoJHtpbmRleH0pYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gSWYgd2UncmUgbm90IGF0IHRoZSByb290LCByZWN1cnNpdmVseSBidWlsZCB0aGUgcGFyZW50IHNlbGVjdG9yXG4gICAgICAgICAgICAvLyBidXQgdXNlIG9wdGltaXplZCBzZWxlY3RvcnMgZm9yIGFuY2VzdG9ycyB0byBrZWVwIHRoZSBvdmVyYWxsIHNlbGVjdG9yIG1hbmFnZWFibGVcbiAgICAgICAgICAgIHJldHVybiBgJHtnZXRVbmlxdWVTZWxlY3RvcihlbGVtZW50LnBhcmVudEVsZW1lbnQsIHRydWUpfSA+ICR7c2VsZWN0b3J9YDtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHNlbGVjdG9yO1xuICAgIH1cbn0iLCJpbXBvcnQgeyBTUkNvbnRyb2xsZXIgfSBmcm9tIFwiLi9TUkNvbnRyb2xsZXJcIjtcbmltcG9ydCB7IE5hdmlnYXRpb25Nb2RlLCBOYXZpZ2F0aW9uUmVzdWx0IH0gZnJvbSBcIi4vU1JUeXBlc1wiO1xuXG4vKipcbiAqIFNST3ZlcmxheSBjbGFzcyBmb3IgY3JlYXRpbmcgYSBVSSB3aWRnZXQgdG8gY29udHJvbCBzY3JlZW4gcmVhZGVyIHNpbXVsYXRpb25cbiAqIFByb3ZpZGVzIGJ1dHRvbnMgZm9yIG5hdmlnYXRpb24gYW5kIGRpc3BsYXlzIHJlc3VsdHNcbiAqL1xuZXhwb3J0IGNsYXNzIFNST3ZlcmxheSB7XG4gICAgLyoqIFRoZSBjb250YWluZXIgZWxlbWVudCBmb3IgdGhlIG92ZXJsYXkgKi9cbiAgICBwcml2YXRlIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQ7XG4gICAgLyoqIFRoZSByZXN1bHRzIGRpc3BsYXkgZWxlbWVudCAqL1xuICAgIHByaXZhdGUgcmVzdWx0c0Rpc3BsYXk6IEhUTUxFbGVtZW50O1xuICAgIC8qKiBOYXZpZ2F0aW9uIG1vZGVzIGF2YWlsYWJsZSBpbiB0aGUgVUkgKi9cbiAgICBwcml2YXRlIG5hdmlnYXRpb25Nb2RlczogeyBtb2RlOiBOYXZpZ2F0aW9uTW9kZSwgbGFiZWw6IHN0cmluZyB9W10gPSBbXG4gICAgICAgIHsgbW9kZTogXCJpdGVtXCIsIGxhYmVsOiBcIkl0ZW1cIiB9LFxuICAgICAgICB7IG1vZGU6IFwidGFiX2ZvY3VzXCIsIGxhYmVsOiBcIlRhYmJhYmxlXCIgfSxcbiAgICAgICAgeyBtb2RlOiBcImhlYWRpbmdcIiwgbGFiZWw6IFwiSGVhZGluZ1wiIH0sXG4gICAgICAgIHsgbW9kZTogXCJyZWdpb25cIiwgbGFiZWw6IFwiUmVnaW9uXCIgfVxuICAgIF07XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IFNST3ZlcmxheVxuICAgICAqIEBwYXJhbSBjb250cm9sbGVyIFRoZSBTUkNvbnRyb2xsZXIgaW5zdGFuY2UgdG8gdXNlIGZvciBuYXZpZ2F0aW9uXG4gICAgICovXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBzclZpZXdlcjogU1JWaWV3ZXIpIHtcbiAgICAgICAgdGhpcy5jcmVhdGVPdmVybGF5KCk7XG4gICAgfVxuXG5cbiAgICBwcml2YXRlIGNyZWF0ZURPTUVsZW1lbnQoZWxlbU5hbWU6IHN0cmluZywgYXR0cnM6IHsgW2F0dHI6IHN0cmluZ106IHN0cmluZ30sIHN0eWxlczogUGFydGlhbDxDU1NTdHlsZURlY2xhcmF0aW9uPikge1xuICAgICAgICBsZXQgcmV0VmFsID0gdGhpcy5zclZpZXdlci52aWV3ZXJEb2MuY3JlYXRlRWxlbWVudChlbGVtTmFtZSk7XG4gICAgICAgIGlmIChhdHRycykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gYXR0cnMpIHtcbiAgICAgICAgICAgICAgICByZXRWYWxba2V5XSA9IGF0dHJzW2tleV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0eWxlcykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gc3R5bGVzKSB7XG4gICAgICAgICAgICAgICAgcmV0VmFsLnN0eWxlW2tleV0gPSBzdHlsZXNba2V5XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgdGhlIG92ZXJsYXkgVUkgZWxlbWVudHMgYW5kIGFkZHMgdGhlbSB0byB0aGUgRE9NXG4gICAgICovXG4gICAgcHJpdmF0ZSBjcmVhdGVPdmVybGF5KCk6IHZvaWQge1xuICAgICAgICAvLyBDcmVhdGUgbWFpbiBjb250YWluZXJcbiAgICAgICAgdGhpcy5jb250YWluZXIgPSB0aGlzLmNyZWF0ZURPTUVsZW1lbnQoXCJkaXZcIiwge1xuICAgICAgICAgICAgY2xhc3NOYW1lOiBcImlibWEtc3Itb3ZlcmxheVwiXG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIHBvc2l0aW9uOiAnZml4ZWQnLFxuICAgICAgICAgICAgYm90dG9tOiAnMCcsXG4gICAgICAgICAgICBsZWZ0OiAnMCcsXG4gICAgICAgICAgICB3aWR0aDogJzEwMCUnLFxuICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAncmdiYSgwLCAwLCAwLCAwLjgpJyxcbiAgICAgICAgICAgIGNvbG9yOiAnd2hpdGUnLFxuICAgICAgICAgICAgcGFkZGluZzogJzEwcHgnLFxuICAgICAgICAgICAgekluZGV4OiAnMTAwMDAnLFxuICAgICAgICAgICAgZGlzcGxheTogJ2ZsZXgnLFxuICAgICAgICAgICAgZmxleERpcmVjdGlvbjogJ2NvbHVtbicsXG4gICAgICAgICAgICBnYXA6ICcxMHB4J1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBDcmVhdGUgY29udHJvbHMgY29udGFpbmVyXG4gICAgICAgIGNvbnN0IGNvbnRyb2xzQ29udGFpbmVyID0gdGhpcy5jcmVhdGVET01FbGVtZW50KFwiZGl2XCIsIHt9LCB7IFxuICAgICAgICAgICAgZGlzcGxheTogXCJmbGV4XCIsIGZsZXhXcmFwOiBcIndyYXBcIiwgZ2FwOiBcIjEwcHhcIn0pO1xuXG4gICAgICAgIC8vIENyZWF0ZSBuYXZpZ2F0aW9uIG1vZGUgZ3JvdXBzXG4gICAgICAgIHRoaXMubmF2aWdhdGlvbk1vZGVzLmZvckVhY2gobmF2TW9kZSA9PiB7XG4gICAgICAgICAgICBjb25zdCBtb2RlR3JvdXAgPSB0aGlzLmNyZWF0ZURPTUVsZW1lbnQoJ2RpdicsIHt9LCB7XG4gICAgICAgICAgICAgICAgZGlzcGxheTogXCJmbGV4XCIsXG4gICAgICAgICAgICAgICAgYWxpZ25JdGVtczogJ2NlbnRlcicsXG4gICAgICAgICAgICAgICAgZ2FwOiAnNXB4JyxcbiAgICAgICAgICAgICAgICBtYXJnaW46ICcwIDEwcHgnXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgbW9kZUdyb3VwLmFwcGVuZENoaWxkKHRoaXMuY3JlYXRlRE9NRWxlbWVudCgnc3BhbicsIHtcbiAgICAgICAgICAgICAgICB0ZXh0Q29udGVudDogbmF2TW9kZS5sYWJlbCArIFwiOlwiXG4gICAgICAgICAgICB9LCB7fSkpO1xuXG4gICAgICAgICAgICAvLyBQcmV2aW91cyBidXR0b25cbiAgICAgICAgICAgIGNvbnN0IHByZXZCdXR0b24gPSB0aGlzLmNyZWF0ZURPTUVsZW1lbnQoJ2J1dHRvbicsIHtcbiAgICAgICAgICAgICAgICB0ZXh0Q29udGVudDogJ+KXgCBQcmV2J1xuICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgIHBhZGRpbmc6ICc1cHggMTBweCcsXG4gICAgICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAnIzQ0NCcsXG4gICAgICAgICAgICAgICAgY29sb3I6ICd3aGl0ZScsXG4gICAgICAgICAgICAgICAgYm9yZGVyOiAnbm9uZScsXG4gICAgICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiAnM3B4JyxcbiAgICAgICAgICAgICAgICBjdXJzb3I6ICdwb2ludGVyJ1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBwcmV2QnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5zclZpZXdlci5uYXZpZ2F0ZVByZXZpb3VzKG5hdk1vZGUubW9kZSkpO1xuICAgICAgICAgICAgbW9kZUdyb3VwLmFwcGVuZENoaWxkKHByZXZCdXR0b24pO1xuXG4gICAgICAgICAgICAvLyBOZXh0IGJ1dHRvblxuICAgICAgICAgICAgY29uc3QgbmV4dEJ1dHRvbiA9IHRoaXMuY3JlYXRlRE9NRWxlbWVudCgnYnV0dG9uJywge1xuICAgICAgICAgICAgICAgIHRleHRDb250ZW50OiAnTmV4dCDilrYnXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgcGFkZGluZzogJzVweCAxMHB4JyxcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICcjNDQ0JyxcbiAgICAgICAgICAgICAgICBjb2xvcjogJ3doaXRlJyxcbiAgICAgICAgICAgICAgICBib3JkZXI6ICdub25lJyxcbiAgICAgICAgICAgICAgICBib3JkZXJSYWRpdXM6ICczcHgnLFxuICAgICAgICAgICAgICAgIGN1cnNvcjogJ3BvaW50ZXInXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG5leHRCdXR0b24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB0aGlzLnNyVmlld2VyLm5hdmlnYXRlTmV4dChuYXZNb2RlLm1vZGUpKTtcbiAgICAgICAgICAgIG1vZGVHcm91cC5hcHBlbmRDaGlsZChuZXh0QnV0dG9uKTtcblxuICAgICAgICAgICAgY29udHJvbHNDb250YWluZXIuYXBwZW5kQ2hpbGQobW9kZUdyb3VwKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGxldCBvdGhlckJ1dHRvbkdyb3VwID0gdGhpcy5jcmVhdGVET01FbGVtZW50KCdkaXYnLCB7fSwge1xuICAgICAgICAgICAgZGlzcGxheTogXCJmbGV4XCIsXG4gICAgICAgICAgICBhbGlnbkl0ZW1zOiAnY2VudGVyJyxcbiAgICAgICAgICAgIGdhcDogJzVweCcsXG4gICAgICAgICAgICBtYXJnaW46ICcwIDEwcHgnXG4gICAgICAgIH0pXG4gICAgICAgIC8vIFNob3cgYWxsIGJ1dHRvblxuICAgICAgICBjb25zdCBzaG93QWxsQnV0dG9uID0gdGhpcy5jcmVhdGVET01FbGVtZW50KCdidXR0b24nLCB7XG4gICAgICAgICAgICB0ZXh0Q29udGVudDogJ1Nob3cgYWxsJ1xuICAgICAgICB9LCB7XG4gICAgICAgICAgICBwYWRkaW5nOiAnNXB4IDEwcHgnLFxuICAgICAgICAgICAgYmFja2dyb3VuZENvbG9yOiAnIzQ0NCcsXG4gICAgICAgICAgICBjb2xvcjogJ3doaXRlJyxcbiAgICAgICAgICAgIGJvcmRlcjogJ25vbmUnLFxuICAgICAgICAgICAgYm9yZGVyUmFkaXVzOiAnM3B4JyxcbiAgICAgICAgICAgIGN1cnNvcjogJ3BvaW50ZXInXG4gICAgICAgIH0pO1xuICAgICAgICBzaG93QWxsQnV0dG9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5zclZpZXdlci5zaG93QWxsKHRydWUpKTtcbiAgICAgICAgb3RoZXJCdXR0b25Hcm91cC5hcHBlbmRDaGlsZChzaG93QWxsQnV0dG9uKTtcblxuICAgICAgICAvLyBUb2dnbGUgU3BlZWNoIEJ1dHRvblxuICAgICAgICBjb25zdCB0b2dnbGVTcGVlY2ggPSB0aGlzLmNyZWF0ZURPTUVsZW1lbnQoJ2J1dHRvbicsIHtcbiAgICAgICAgICAgIHRleHRDb250ZW50OiAnVG9nZ2xlIHNwZWVjaCdcbiAgICAgICAgfSwge1xuICAgICAgICAgICAgcGFkZGluZzogJzVweCAxMHB4JyxcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJyM0NDQnLFxuICAgICAgICAgICAgY29sb3I6ICd3aGl0ZScsXG4gICAgICAgICAgICBib3JkZXI6ICdub25lJyxcbiAgICAgICAgICAgIGJvcmRlclJhZGl1czogJzNweCcsXG4gICAgICAgICAgICBjdXJzb3I6ICdwb2ludGVyJ1xuICAgICAgICB9KTtcbiAgICAgICAgdG9nZ2xlU3BlZWNoLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4gdGhpcy5zclZpZXdlci50b2dnbGVTcGVlY2goKSk7XG4gICAgICAgIG90aGVyQnV0dG9uR3JvdXAuYXBwZW5kQ2hpbGQodG9nZ2xlU3BlZWNoKTtcbiAgICAgICAgY29udHJvbHNDb250YWluZXIuYXBwZW5kQ2hpbGQob3RoZXJCdXR0b25Hcm91cCk7XG5cblxuICAgICAgICAvLyBDcmVhdGUgcmVzdWx0cyBkaXNwbGF5XG4gICAgICAgIHRoaXMucmVzdWx0c0Rpc3BsYXkgPSB0aGlzLmNyZWF0ZURPTUVsZW1lbnQoJ2RpdicsIHtcbiAgICAgICAgICAgIHRleHRDb250ZW50OiAnU2NyZWVuIHJlYWRlciBzaW11bGF0aW9uIHJlc3VsdHMgd2lsbCBhcHBlYXIgaGVyZS4nXG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIHBhZGRpbmc6ICcxMHB4JyxcbiAgICAgICAgICAgIGJhY2tncm91bmRDb2xvcjogJ3JnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKScsXG4gICAgICAgICAgICBib3JkZXJSYWRpdXM6ICczcHgnLFxuICAgICAgICAgICAgbWluSGVpZ2h0OiAnMTAwcHgnLFxuICAgICAgICAgICAgbWF4SGVpZ2h0OiAnNTB2aCcsXG4gICAgICAgICAgICBmb250RmFtaWx5OiAnbW9ub3NwYWNlJyxcbiAgICAgICAgICAgIG92ZXJmbG93OiAnYXV0bydcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gQWRkIGVsZW1lbnRzIHRvIGNvbnRhaW5lclxuICAgICAgICB0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZChjb250cm9sc0NvbnRhaW5lcik7XG4gICAgICAgIHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMucmVzdWx0c0Rpc3BsYXkpO1xuXG4gICAgICAgIC8vIEFkZCB0byBkb2N1bWVudFxuICAgICAgICB0aGlzLnNyVmlld2VyLnZpZXdlckRvYy5ib2R5LmFwcGVuZENoaWxkKHRoaXMuY29udGFpbmVyKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBEaXNwbGF5IHRoZSBuYXZpZ2F0aW9uIHJlc3VsdCBpbiB0aGUgb3ZlcmxheVxuICAgICAqIEBwYXJhbSByZXN1bHQgVGhlIG5hdmlnYXRpb24gcmVzdWx0XG4gICAgICogQHBhcmFtIG1vZGUgVGhlIG5hdmlnYXRpb24gbW9kZSB1c2VkXG4gICAgICogQHBhcmFtIGRpcmVjdGlvbiBUaGUgbmF2aWdhdGlvbiBkaXJlY3Rpb24gKCduZXh0JywgJ3ByZXZpb3VzJywgb3IgJ2ZvY3VzJylcbiAgICAgKi9cbiAgICBwdWJsaWMgZGlzcGxheVJlc3VsdChyZXN1bHQ6IE5hdmlnYXRpb25SZXN1bHQsIG1vZGU6IE5hdmlnYXRpb25Nb2RlLCBkaXJlY3Rpb246ICduZXh0JyB8ICdwcmV2aW91cycgfCAnZm9jdXMnKTogdm9pZCB7XG4gICAgICAgIGxldCBkaXNwbGF5VGV4dCA9ICcnO1xuICAgICAgICBcbiAgICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIj8/P1wiLCByZXN1bHQpO1xuICAgICAgICAgICAgZGlzcGxheVRleHQgPSBgJHtkaXJlY3Rpb24udG9VcHBlckNhc2UoKX0gJHttb2RlfTogJHtyZXN1bHQucmVuZGVyaW5nUmVzdWx0Lm1lc3NhZ2V9YDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRpc3BsYXlUZXh0ID0gYCR7ZGlyZWN0aW9uLnRvVXBwZXJDYXNlKCl9ICR7bW9kZX06ICR7cmVzdWx0LnJlbmRlcmluZ1Jlc3VsdC5tZXNzYWdlfWA7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0LnJlbmRlcmluZ1Jlc3VsdC5lbmQ/LmdldEVsZW1lbnQoKT8uc2Nyb2xsSW50b1ZpZXcoKTtcbiAgICAgICAgcmVzdWx0LnJlbmRlcmluZ1Jlc3VsdC5zdGFydD8uZ2V0RWxlbWVudCgpPy5zY3JvbGxJbnRvVmlldygpO1xuICAgICAgICB3aW5kb3cuc2Nyb2xsQnkoMCwgLTIwMCk7XG4gICAgICAgIFxuICAgICAgICB0aGlzLnJlc3VsdHNEaXNwbGF5LmlubmVySFRNTCA9IFwiXCI7XG4gICAgICAgIHRoaXMucmVzdWx0c0Rpc3BsYXkudGV4dENvbnRlbnQgPSBkaXNwbGF5VGV4dDtcbiAgICAgICAgbGV0IGluc3BlY3RCdXR0b24gPSB0aGlzLmNyZWF0ZURPTUVsZW1lbnQoXCJidXR0b25cIiwge1xuICAgICAgICAgICAgaW5uZXJUZXh0OiBcIkRlYnVnXCJcbiAgICAgICAgfSwge1xuICAgICAgICB9KTtcbiAgICAgICAgaW5zcGVjdEJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2cocmVzdWx0LnJlbmRlcmluZ1Jlc3VsdC5zdGFydD8uZ2V0Tm9kZSgpLCByZXN1bHQucmVuZGVyaW5nUmVzdWx0LmVuZD8uZ2V0Tm9kZSgpKTtcbiAgICAgICAgfSlcbiAgICAgICAgdGhpcy5yZXN1bHRzRGlzcGxheS5hcHBlbmRDaGlsZChpbnNwZWN0QnV0dG9uKVxuICAgIH1cblxuICAgIHB1YmxpYyBkaXNwbGF5QWxsKHJlc3VsdDogQXJyYXk8eyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfT4pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdGFibGUgPSB0aGlzLmNyZWF0ZURPTUVsZW1lbnQoXCJ0YWJsZVwiLCB7fSwge30pO1xuICAgICAgICBjb25zdCBoZWFkZXJSb3cgPSB0aGlzLmNyZWF0ZURPTUVsZW1lbnQoXCJ0clwiLCB7fSwge30pO1xuICAgICAgICBjb25zdCBoZWFkaW5nTGFiZWxzID0gW1wiUmVnaW9uXCIsIFwiSGVhZGluZ1wiLCBcIkl0ZW1cIiwgXCJUYWJiYWJsZVwiXTtcbiAgICAgICAgY29uc3QgaGVhZGluZ0ZpZWxkcyA9IFtcInJlZ2lvblwiLCBcImhlYWRpbmdcIiwgXCJpdGVtXCIsIFwidGFiX2ZvY3VzXCJdO1xuICAgICAgICBmb3IgKGNvbnN0IGhlYWRpbmdMYWJlbCBvZiBoZWFkaW5nTGFiZWxzKSB7XG4gICAgICAgICAgICBoZWFkZXJSb3cuYXBwZW5kQ2hpbGQodGhpcy5jcmVhdGVET01FbGVtZW50KFwidGhcIiwge1xuICAgICAgICAgICAgICAgIHNjb3BlOiBcImNvbFwiLFxuICAgICAgICAgICAgICAgIGlubmVyVGV4dDogaGVhZGluZ0xhYmVsXG4gICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgdGV4dEFsaWduOiBcImxlZnRcIixcbiAgICAgICAgICAgICAgICBwYWRkaW5nOiBcIi4yNXJlbVwiLFxuICAgICAgICAgICAgICAgIG1hcmdpbjogXCIwcmVtXCIsXG4gICAgICAgICAgICAgICAgY29sb3I6IFwid2hpdGVcIlxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgdGFibGUuYXBwZW5kQ2hpbGQoaGVhZGVyUm93KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoY29uc3QgbGluZSBvZiByZXN1bHQpIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGFSb3cgPSB0aGlzLmNyZWF0ZURPTUVsZW1lbnQoXCJ0clwiLCB7fSwge30pO1xuICAgICAgICAgICAgaGVhZGluZ0ZpZWxkcy5mb3JFYWNoKChmaWVsZCkgPT4ge1xuICAgICAgICAgICAgICAgIGRhdGFSb3cuYXBwZW5kQ2hpbGQodGhpcy5jcmVhdGVET01FbGVtZW50KFwidGRcIiwge1xuICAgICAgICAgICAgICAgICAgICBpbm5lclRleHQ6IGxpbmVbZmllbGRdXG4gICAgICAgICAgICAgICAgfSwge1xuICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbEFsaWduOiBcInRvcFwiLFxuICAgICAgICAgICAgICAgICAgICBib3JkZXI6IFwic29saWQgd2hpdGUgMXB4XCIsXG4gICAgICAgICAgICAgICAgICAgIHBhZGRpbmc6IFwiLjI1cmVtXCIsXG4gICAgICAgICAgICAgICAgICAgIG1hcmdpbjogXCIwcmVtXCIsXG4gICAgICAgICAgICAgICAgICAgIGNvbG9yOiBcIndoaXRlXCJcbiAgICAgICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgdGFibGUuYXBwZW5kQ2hpbGQoZGF0YVJvdyk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZXN1bHRzRGlzcGxheS5pbm5lckhUTUwgPSBcIlwiO1xuICAgICAgICB0aGlzLnJlc3VsdHNEaXNwbGF5LmFwcGVuZENoaWxkKHRhYmxlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZW1vdmUgdGhlIG92ZXJsYXkgZnJvbSB0aGUgRE9NXG4gICAgICovXG4gICAgcHVibGljIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmNvbnRhaW5lciAmJiB0aGlzLmNvbnRhaW5lci5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuY29udGFpbmVyKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuLyoqXG4gKiBTUlZpZXdlciBjbGFzcyBmb3IgbWFuYWdpbmcgc2NyZWVuIHJlYWRlciBzaW11bGF0aW9uIHdpdGggVUkgY29udHJvbHNcbiAqL1xuZXhwb3J0IGNsYXNzIFNSVmlld2VyIHtcbiAgICAvKiogVGhlIGNvbnRyb2xsZXIgaW5zdGFuY2UgKi9cbiAgICBwcml2YXRlIGNvbnRyb2xsZXI6IFNSQ29udHJvbGxlcjtcbiAgICAvKiogVGhlIG92ZXJsYXkgVUkgaW5zdGFuY2UgKi9cbiAgICBwcml2YXRlIG92ZXJsYXk6IFNST3ZlcmxheTtcbiAgICAvKiogRmxhZyB0byB0cmFjayBpZiBzcGVlY2ggaXMgYWN0aXZlICovXG4gICAgcHJpdmF0ZSBpc1N0cmVhbWluZzogYm9vbGVhbiA9IGZhbHNlO1xuICAgIC8qKiBGbGFnIHRvIHNldCBpZiBzaG93aW5nIGFsbCAqL1xuICAgIHByaXZhdGUgaXNTaG93aW5nQWxsOiBib29sZWFuID0gZmFsc2U7XG4gICAgLyoqIEZsYWcgdG8gc2V0IGlmIGl0IHNob3VsZCBiZSBzcGVha2luZyAqL1xuICAgIHByaXZhdGUgc3BlZWNoRW5hYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuICAgIC8qKiBLZXlib2FyZCBldmVudCBoYW5kbGVyICovXG4gICAgcHJpdmF0ZSBrZXlib2FyZEhhbmRsZXI6IChlOiBLZXlib2FyZEV2ZW50KSA9PiB2b2lkO1xuICAgIC8qKiBGb2N1cyBldmVudCBoYW5kbGVyICovXG4gICAgcHJpdmF0ZSBmb2N1c0hhbmRsZXI6IChlOiBGb2N1c0V2ZW50KSA9PiB2b2lkO1xuICAgIHZpZXdlckRvYzogSFRNTERvY3VtZW50O1xuXG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBTUlZpZXdlclxuICAgICAqIEBwYXJhbSByb290RWxlbWVudCBUaGUgcm9vdCBlbGVtZW50IHRvIHN0YXJ0IGZyb20gKGRlZmF1bHRzIHRvIGRvY3VtZW50LmJvZHkpXG4gICAgICovXG4gICAgY29uc3RydWN0b3Iocm9vdEVsZW1lbnQ6IE5vZGUgPSBkb2N1bWVudC5ib2R5KSB7XG4gICAgICAgIHRoaXMudmlld2VyRG9jID0gcm9vdEVsZW1lbnQub3duZXJEb2N1bWVudDtcbiAgICAgICAgLy8gQ3JlYXRlIGNvbnRyb2xsZXIgZm9yIHRoZSBkb2N1bWVudCBib2R5XG4gICAgICAgIHRoaXMuY29udHJvbGxlciA9IFNSQ29udHJvbGxlci5nZXRDb250cm9sbGVyKHRoaXMudmlld2VyRG9jKTtcbiAgICAgICAgXG4gICAgICAgIC8vIENyZWF0ZSBvdmVybGF5IFVJXG4gICAgICAgIHRoaXMub3ZlcmxheSA9IG5ldyBTUk92ZXJsYXkodGhpcyk7XG4gICAgICAgIFxuICAgICAgICAvLyBTZXQgdXAga2V5Ym9hcmQgaGFuZGxlcnNcbiAgICAgICAgdGhpcy5zZXR1cEtleWJvYXJkSGFuZGxlcnMoKTtcbiAgICAgICAgXG4gICAgICAgIC8vIFNldCB1cCBmb2N1cyB0cmFja2luZ1xuICAgICAgICB0aGlzLnNldHVwRm9jdXNUcmFja2luZygpO1xuXG4gICAgICAgIC8vIFNldCB1cCBtdXRhdGlvbiB0cmFja2luZ1xuICAgICAgICB0aGlzLnNldHVwTXV0YXRpb25UcmFja2luZygpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzaG93QWxsKGJFbmFibGVBbGxNb2RlPzogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICBpZiAoYkVuYWJsZUFsbE1vZGUpIHtcbiAgICAgICAgICAgIHRoaXMuaXNTaG93aW5nQWxsID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPSBTUkNvbnRyb2xsZXIucmVuZGVyU3RydWN0dXJlKHRoaXMudmlld2VyRG9jKTtcbiAgICAgICAgdGhpcy5vdmVybGF5LmRpc3BsYXlBbGwocmVzdWx0KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgdG9nZ2xlU3BlZWNoKCkge1xuICAgICAgICB0aGlzLnNwZWVjaEVuYWJsZWQgPSAhdGhpcy5zcGVlY2hFbmFibGVkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE5hdmlnYXRlIHRvIHRoZSBuZXh0IGVsZW1lbnQgdXNpbmcgdGhlIHNwZWNpZmllZCBtb2RlXG4gICAgICogQHBhcmFtIG1vZGUgVGhlIG5hdmlnYXRpb24gbW9kZSB0byB1c2VcbiAgICAgKi9cbiAgICBwdWJsaWMgbmF2aWdhdGVOZXh0KG1vZGU6IE5hdmlnYXRpb25Nb2RlKTogdm9pZCB7XG4gICAgICAgIHRoaXMuaXNTaG93aW5nQWxsID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuY29udHJvbGxlci5qdW1wTmV4dChtb2RlKTtcbiAgICAgICAgdGhpcy5vdmVybGF5LmRpc3BsYXlSZXN1bHQocmVzdWx0LCBtb2RlLCAnbmV4dCcpO1xuICAgICAgICB0aGlzLnNwZWFrUmVzdWx0KHJlc3VsdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTmF2aWdhdGUgdG8gdGhlIHByZXZpb3VzIGVsZW1lbnQgdXNpbmcgdGhlIHNwZWNpZmllZCBtb2RlXG4gICAgICogQHBhcmFtIG1vZGUgVGhlIG5hdmlnYXRpb24gbW9kZSB0byB1c2VcbiAgICAgKi9cbiAgICBwdWJsaWMgbmF2aWdhdGVQcmV2aW91cyhtb2RlOiBOYXZpZ2F0aW9uTW9kZSk6IHZvaWQge1xuICAgICAgICB0aGlzLmlzU2hvd2luZ0FsbCA9IGZhbHNlO1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmNvbnRyb2xsZXIuanVtcFByZXZpb3VzKG1vZGUpO1xuICAgICAgICB0aGlzLm92ZXJsYXkuZGlzcGxheVJlc3VsdChyZXN1bHQsIG1vZGUsICdwcmV2aW91cycpO1xuICAgICAgICB0aGlzLnNwZWFrUmVzdWx0KHJlc3VsdCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU2V0IHVwIGtleWJvYXJkIGV2ZW50IGhhbmRsZXJzIGZvciBzY3JlZW4gcmVhZGVyIG5hdmlnYXRpb25cbiAgICAgKi9cbiAgICBwcml2YXRlIHNldHVwS2V5Ym9hcmRIYW5kbGVycygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5rZXlib2FyZEhhbmRsZXIgPSAoZTogS2V5Ym9hcmRFdmVudCkgPT4ge1xuICAgICAgICAgICAgLy8gRG9uJ3QgY2FwdHVyZSBrZXlib2FyZCBldmVudHMgd2hlbiBmb2N1cyBpcyBpbiBmb3JtIGNvbnRyb2xzXG4gICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBlLnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgIGlmICh0YXJnZXQudGFnTmFtZSA9PT0gJ0lOUFVUJyB8fCB0YXJnZXQudGFnTmFtZSA9PT0gJ1RFWFRBUkVBJyB8fCB0YXJnZXQudGFnTmFtZSA9PT0gJ1NFTEVDVCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIEhhbmRsZSBrZXlib2FyZCBzaG9ydGN1dHNcbiAgICAgICAgICAgIGlmIChlLmN0cmxLZXkpIHtcbiAgICAgICAgICAgICAgICAvLyBDdHJsIGtleSBzdG9wcyBzcGVlY2hcbiAgICAgICAgICAgICAgICB0aGlzLnN0b3BTcGVlY2goKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZS5hbHRLZXkgfHwgZS5tZXRhS2V5KSByZXR1cm47XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhlLmtleSk7XG4gICAgICAgICAgICBzd2l0Y2ggKGUua2V5KSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnQXJyb3dVcCc6XG4gICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0ZVByZXZpb3VzKCdpdGVtJyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJyAnOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzU3RyZWFtaW5nID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjYXNlICdBcnJvd0Rvd24nOlxuICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGVOZXh0KCdpdGVtJyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ0VudGVyJzpcbiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGl2YXRlQ3VycmVudEVsZW1lbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyLnNldFBvaW50T2ZSZWdhcmQodGhpcy52aWV3ZXJEb2MuYWN0aXZlRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ0gnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ2gnOlxuICAgICAgICAgICAgICAgICAgICBpZiAoZS5zaGlmdEtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0ZVByZXZpb3VzKCdoZWFkaW5nJyk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5hdmlnYXRlTmV4dCgnaGVhZGluZycpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ1InOlxuICAgICAgICAgICAgICAgIGNhc2UgJ3InOlxuICAgICAgICAgICAgICAgICAgICBpZiAoZS5zaGlmdEtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0ZVByZXZpb3VzKCdyZWdpb24nKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGVOZXh0KCdyZWdpb24nKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdUYWInOlxuICAgICAgICAgICAgICAgICAgICBpZiAoZS5zaGlmdEtleSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0ZVByZXZpb3VzKCd0YWJfZm9jdXMnKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubmF2aWdhdGVOZXh0KCd0YWJfZm9jdXMnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgXG4gICAgICAgIC8vIEFkZCB0aGUgZXZlbnQgbGlzdGVuZXJcbiAgICAgICAgdGhpcy52aWV3ZXJEb2MuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMua2V5Ym9hcmRIYW5kbGVyKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHNwZWFrUmVzdWx0KHJlc3VsdCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuc3BlZWNoRW5hYmxlZCkgcmV0dXJuO1xuICAgICAgICBjb25zdCB1dHRlcmFuY2UgPSBuZXcgU3BlZWNoU3ludGhlc2lzVXR0ZXJhbmNlKHJlc3VsdC5yZW5kZXJpbmdSZXN1bHQubWVzc2FnZSk7XG4gICAgICAgIHV0dGVyYW5jZS5yYXRlID0gMS41O1xuICAgICAgICBsZXQgbXlUaGlzID0gdGhpcztcbiAgICAgICAgdXR0ZXJhbmNlLmFkZEV2ZW50TGlzdGVuZXIoXCJlbmRcIiwgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAobXlUaGlzLmlzU3RyZWFtaW5nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5uYXZpZ2F0ZU5leHQoJ2l0ZW0nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHNwZWVjaFN5bnRoZXNpcy5jYW5jZWwoKTtcbiAgICAgICAgc3BlZWNoU3ludGhlc2lzLnNwZWFrKHV0dGVyYW5jZSk7XG4gICAgfVxuICAgIFxuICAgIC8qKlxuICAgICAqIFN0b3Agc3BlZWNoIG91dHB1dFxuICAgICAqL1xuICAgIHByaXZhdGUgc3RvcFNwZWVjaCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pc1N0cmVhbWluZyA9IGZhbHNlO1xuICAgICAgICAvLyBDYW5jZWwgYW55IGFjdGl2ZSBzcGVlY2ggc3ludGhlc2lzXG4gICAgICAgIHNwZWVjaFN5bnRoZXNpcy5jYW5jZWwoKTtcbiAgICB9XG4gICAgXG4gICAgLyoqXG4gICAgICogU2V0IHVwIG11dGF0aW9uIHRyYWNraW5nXG4gICAgICovXG4gICAgcHJpdmF0ZSBzZXR1cE11dGF0aW9uVHJhY2tpbmcoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKG11dGF0aW9ucykgPT4ge1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2codGhpcy5pc1Nob3dpbmdBbGwsIG11dGF0aW9ucy5sZW5ndGgpO1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNTaG93aW5nQWxsKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3V0c2lkZU92ZXJsYXkgPSBtdXRhdGlvbnMuZmlsdGVyKG11dGF0aW9uID0+IG11dGF0aW9uLnRhcmdldC5ub2RlVHlwZSA9PT0gMSBcbiAgICAgICAgICAgICAgICAgICAgJiYgIShtdXRhdGlvbi50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLmNsb3Nlc3QoXCIuaWJtYS1zci1vdmVybGF5XCIpKVxuICAgICAgICAgICAgICAgIGlmIChvdXRzaWRlT3ZlcmxheS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiTXV0YXRpb25zXCIsb3V0c2lkZU92ZXJsYXkpO1xuICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBteVRoaXMgPSB0aGlzO1xuICAgICAgICAgICAgICAgICAgICBteVRoaXMuc2hvd0FsbCgpO1xuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG15VGhpcy5zaG93QWxsKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5vYnNlcnZlKHRoaXMudmlld2VyRG9jLmRvY3VtZW50RWxlbWVudCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXM6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRMaXN0OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnRyZWU6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIH0sIDEwMDApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIG9ic2VydmVyLm9ic2VydmUodGhpcy52aWV3ZXJEb2MuZG9jdW1lbnRFbGVtZW50LCB7XG4gICAgICAgICAgICBhdHRyaWJ1dGVzOiB0cnVlLFxuICAgICAgICAgICAgY2hpbGRMaXN0OiB0cnVlLFxuICAgICAgICAgICAgc3VidHJlZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTZXQgdXAgZm9jdXMgdHJhY2tpbmcgdG8gdXBkYXRlIHRoZSBwb2ludCBvZiByZWdhcmQgd2hlbiBmb2N1cyBjaGFuZ2VzXG4gICAgICovXG4gICAgcHJpdmF0ZSBzZXR1cEZvY3VzVHJhY2tpbmcoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZm9jdXNIYW5kbGVyID0gKGU6IEZvY3VzRXZlbnQpID0+IHtcbiAgICAgICAgICAgIC8vIFNraXAgaWYgdGhlIGZvY3VzIGlzIG9uIHRoZSBvdmVybGF5IGl0c2VsZlxuICAgICAgICAgICAgaWYgKGUudGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBlLnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vdmVybGF5ICYmIHRhcmdldC5jbG9zZXN0KCcuaWJtYS1zci1vdmVybGF5JykpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zb2xlLmdyb3VwKFwiZm9jdXNIYW5kbGVyXCIpO1xuICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgcG9pbnQgb2YgcmVnYXJkIHRvIHRoZSBuZXdseSBmb2N1c2VkIGVsZW1lbnRcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmNvbnRyb2xsZXIuc2V0UG9pbnRPZlJlZ2FyZCh0YXJnZXQpO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIEFubm91bmNlIHRoZSBmb2N1cyBjaGFuZ2VcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vdmVybGF5LmRpc3BsYXlSZXN1bHQocmVzdWx0LCAnZm9jdXMnLCAnZm9jdXMnKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zcGVha1Jlc3VsdChyZXN1bHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zb2xlLmdyb3VwRW5kKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIFxuICAgICAgICAvLyBBZGQgdGhlIGZvY3VzIGV2ZW50IGxpc3RlbmVyIHRvIHRoZSBkb2N1bWVudFxuICAgICAgICB0aGlzLnZpZXdlckRvYy5hZGRFdmVudExpc3RlbmVyKCdmb2N1c2luJywgdGhpcy5mb2N1c0hhbmRsZXIpO1xuICAgIH1cbiAgICBcbiAgICAvKipcbiAgICAgKiBBY3RpdmF0ZSAoY2xpY2spIHRoZSBlbGVtZW50IGF0IHRoZSBjdXJyZW50IHBvaW50IG9mIHJlZ2FyZFxuICAgICAqL1xuICAgIHByaXZhdGUgYWN0aXZhdGVDdXJyZW50RWxlbWVudCgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgY3VycmVudEVsZW1lbnQgPSB0aGlzLmNvbnRyb2xsZXIuZ2V0UG9pbnRPZlJlZ2FyZCgpLmdldEVsZW1lbnQoKTtcbiAgICAgICAgXG4gICAgICAgIGlmIChjdXJyZW50RWxlbWVudCkge1xuICAgICAgICAgICAgLy8gQW5ub3VuY2UgdGhhdCB3ZSdyZSBhY3RpdmF0aW5nIHRoZSBlbGVtZW50XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgICAgICAgICAgc3VjY2VzczogdHJ1ZSxcbiAgICAgICAgICAgICAgICByZW5kZXJpbmdSZXN1bHQ6IHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYEFjdGl2YXRpbmc6ICR7Y3VycmVudEVsZW1lbnQudGV4dENvbnRlbnQgfHwgY3VycmVudEVsZW1lbnQubm9kZU5hbWV9YCxcbiAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IHRoaXMuY29udHJvbGxlci5nZXRQb2ludE9mUmVnYXJkKCksXG4gICAgICAgICAgICAgICAgICAgIGVuZDogdGhpcy5jb250cm9sbGVyLmdldFBvaW50T2ZSZWdhcmQoKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLm92ZXJsYXkuZGlzcGxheVJlc3VsdChyZXN1bHQsICdmb2N1cycsICdmb2N1cycpO1xuICAgICAgICAgICAgdGhpcy5zcGVha1Jlc3VsdChyZXN1bHQpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBGb2N1cyB0aGUgZWxlbWVudCBmaXJzdFxuICAgICAgICAgICAgaWYgKGN1cnJlbnRFbGVtZW50LmZvY3VzKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudEVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gU2ltdWxhdGUgYSBjbGljayBvbiB0aGUgZWxlbWVudFxuICAgICAgICAgICAgY3VycmVudEVsZW1lbnQuY2xpY2soKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgY29udHJvbGxlciBpbnN0YW5jZVxuICAgICAqIEByZXR1cm5zIFRoZSBTUkNvbnRyb2xsZXIgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0Q29udHJvbGxlcigpOiBTUkNvbnRyb2xsZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250cm9sbGVyO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc3Ryb3kgdGhlIHZpZXdlciBhbmQgY2xlYW4gdXAgcmVzb3VyY2VzXG4gICAgICovXG4gICAgcHVibGljIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIC8vIFJlbW92ZSBldmVudCBsaXN0ZW5lcnNcbiAgICAgICAgdGhpcy52aWV3ZXJEb2MucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMua2V5Ym9hcmRIYW5kbGVyKTtcbiAgICAgICAgdGhpcy52aWV3ZXJEb2MucmVtb3ZlRXZlbnRMaXN0ZW5lcignZm9jdXNpbicsIHRoaXMuZm9jdXNIYW5kbGVyKTtcbiAgICAgICAgXG4gICAgICAgIC8vIFN0b3AgYW55IGFjdGl2ZSBzcGVlY2hcbiAgICAgICAgdGhpcy5zdG9wU3BlZWNoKCk7XG4gICAgICAgIFxuICAgICAgICAvLyBEZXN0cm95IG92ZXJsYXlcbiAgICAgICAgdGhpcy5vdmVybGF5LmRlc3Ryb3koKTtcbiAgICB9XG59IiwiaW1wb3J0IHsgU1JDdXJzb3IgfSBmcm9tIFwiLi4vU1JDdXJzb3JcIjtcbmltcG9ydCB7IFNSUmVuZGVyZXJSdWxlIH0gZnJvbSBcIi4uL1NSUmVuZGVyZXJSdWxlXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuLi8uLi91dGlsL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBBUklBRGVmaW5pdGlvbnMgfSBmcm9tIFwiLi4vLi4vLi4vdjIvYXJpYS9BUklBRGVmaW5pdGlvbnNcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4uLy4uL3V0aWwvVmlzVXRpbFwiO1xuaW1wb3J0IHsgTmF2aWdhdGlvbk1vZGUgfSBmcm9tIFwiLi4vU1JUeXBlc1wiO1xuXG4vKipcbiAqIFByb3ZpZGUgdGhlIG5hbWUsIHN1cnJvdW5kZWQgYnkgdGhlIHF1b3RlQ2hhckJlZm9yZSBhbmQgcXVvdGVDaGFyQWZ0ZXIgYW5kIGZvbGxvd2VkIGJ5IHRoZSBwYWRkaW5nIGlmIHRoZSBuYW1lIGV4aXN0c1xuICogQHBhcmFtIGN1cnNvciBUaGUgY3Vyc29yIGZvciB3aGljaCB0byBmZXRjaCB0aGUgbmFtZVxuICogQHBhcmFtIHBhZGRpbmcgU3RyaW5nIHRvIGFkZCBhZnRlciwgaWYgdGhlIG5hbWUgZXhpc3RzXG4gKiBAcGFyYW0gcXVvdGVDaGFyQmVmb3JlIFRoZSBzdHJpbmcgdG8gdXNlIGFzIHRoZSBsZWFkaW5nIHF1b3RlLCBpZiB0aGUgbmFtZSBleGlzdHNcbiAqIEBwYXJhbSBxdW90ZUNoYXJCZWZvcmUgVGhlIHN0cmluZyB0byB1c2UgYXMgdGhlIHRyYWlsaW5nIHF1b3RlLCBpZiB0aGUgbmFtZSBleGlzdHNcbiAqIEByZXR1cm5zIFxuICovXG5leHBvcnQgZnVuY3Rpb24gcXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yOiBTUkN1cnNvciwgcGFkZGluZz86IHN0cmluZywgcXVvdGVDaGFyQmVmb3JlPzogc3RyaW5nLCBxdW90ZUNoYXJBZnRlcj86IHN0cmluZykge1xuICAgIHJldHVybiBjdXJzb3IuZ2V0TmFtZSgpIFxuICAgICAgICA/IGAke3F1b3RlTmFtZShjdXJzb3IpfSR7cGFkZGluZyB8fCBcIiwgXCJ9YFxuICAgICAgICA6IFwiXCI7XG59XG5cbi8qKlxuICogUHJvdmlkZSB0aGUgbmFtZSwgc3Vycm91bmRlZCBieSBxdW90ZXMgYW5kIHByZWNlZGVkIGJ5IHRoZSBwYWRkaW5nIGlmIHRoZSBuYW1lIGV4aXN0c1xuICogQHBhcmFtIGN1cnNvciBUaGUgY3Vyc29yIGZvciB3aGljaCB0byBmZXRjaCB0aGUgbmFtZVxuICogQHBhcmFtIHBhZGRpbmcgU3RyaW5nIHRvIGFkZCBiZWZvcmUsIGlmIHRoZSBuYW1lIGV4aXN0cyAoZGVmYXVsdHMgdG8gXCIsIFwiKVxuICogQHJldHVybnMgVGhlIHF1b3RlZCBuYW1lIHdpdGggbGVhZGluZyBwYWRkaW5nLCBvciBlbXB0eSBzdHJpbmcgaWYgbm8gbmFtZSBleGlzdHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHF1b3RlTmFtZVBhZEJlZm9yZShjdXJzb3I6IFNSQ3Vyc29yLCBwYWRkaW5nPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGN1cnNvci5nZXROYW1lKClcbiAgICAgICAgPyBgJHtwYWRkaW5nIHx8IFwiLCBcIn0ke3F1b3RlTmFtZShjdXJzb3IpfWBcbiAgICAgICAgOiBcIlwiO1xufVxuXG4vKipcbiAqIFByb3ZpZGUgdGhlIG5hbWUgc3Vycm91bmRlZCBieSBxdW90ZSBjaGFyYWN0ZXJzXG4gKiBAcGFyYW0gY3Vyc29yIFRoZSBjdXJzb3IgZm9yIHdoaWNoIHRvIGZldGNoIHRoZSBuYW1lXG4gKiBAcGFyYW0gcXVvdGVDaGFyQmVmb3JlIFRoZSBzdHJpbmcgdG8gdXNlIGFzIHRoZSBsZWFkaW5nIHF1b3RlIChkZWZhdWx0cyB0byBcIilcbiAqIEBwYXJhbSBxdW90ZUNoYXJBZnRlciBUaGUgc3RyaW5nIHRvIHVzZSBhcyB0aGUgdHJhaWxpbmcgcXVvdGUgKGRlZmF1bHRzIHRvIFwiKVxuICogQHJldHVybnMgVGhlIHF1b3RlZCBuYW1lLCBvciBlbXB0eSBzdHJpbmcgaWYgbm8gbmFtZSBleGlzdHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHF1b3RlTmFtZShjdXJzb3I6IFNSQ3Vyc29yLCBxdW90ZUNoYXJCZWZvcmU/OiBzdHJpbmcsIHF1b3RlQ2hhckFmdGVyPzogc3RyaW5nKSB7XG4gICAgcmV0dXJuIGN1cnNvci5nZXROYW1lKClcbiAgICAgICAgPyBgJHtxdW90ZUNoYXJCZWZvcmUgfHwgJ1wiJ30ke2N1cnNvci5nZXROYW1lKCl9JHtxdW90ZUNoYXJBZnRlciB8fCAnXCInfWBcbiAgICAgICAgOiBcIlwiO1xufVxuXG4vKipcbiAqIEdldCB0aGUgcm9sZSBkZXNjcmlwdGlvbiBmb3IgYW4gZWxlbWVudCwgdXNpbmcgYXJpYS1yb2xlZGVzY3JpcHRpb24gaWYgcHJlc2VudFxuICogRmFsbHMgYmFjayB0byB0aGUgcHJvdmlkZWQgZGVmYXVsdCByb2xlIG5hbWUgaWYgYXJpYS1yb2xlZGVzY3JpcHRpb24gaXMgbm90IHNwZWNpZmllZCBvciBlbXB0eVxuICogQHBhcmFtIGN1cnNvciBUaGUgY3Vyc29yIHBvc2l0aW9uZWQgYXQgdGhlIGVsZW1lbnRcbiAqIEBwYXJhbSBkZWZhdWx0Um9sZSBUaGUgZGVmYXVsdCByb2xlIG5hbWUgdG8gdXNlIGlmIGFyaWEtcm9sZWRlc2NyaXB0aW9uIGlzIG5vdCBwcmVzZW50XG4gKiBAcmV0dXJucyBUaGUgcm9sZSBkZXNjcmlwdGlvbiAoZWl0aGVyIGN1c3RvbSBvciBkZWZhdWx0KVxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Um9sZURlc2NyaXB0aW9uKGN1cnNvcjogU1JDdXJzb3IsIGRlZmF1bHRSb2xlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGVsZW0gPSBjdXJzb3IuZ2V0RWxlbWVudCgpO1xuICAgIGlmICghZWxlbSkgcmV0dXJuIGRlZmF1bHRSb2xlO1xuICAgIFxuICAgIGNvbnN0IHJvbGVEZXNjcmlwdGlvbiA9IGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1yb2xlZGVzY3JpcHRpb25cIik7XG4gICAgaWYgKHJvbGVEZXNjcmlwdGlvbiAmJiByb2xlRGVzY3JpcHRpb24udHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIHJvbGVEZXNjcmlwdGlvbi50cmltKCk7XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBkZWZhdWx0Um9sZTtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZSB0aGUgc2NyZWVuIHJlYWRlciBhbm5vdW5jZW1lbnQgZm9yIGEgbGluayBlbGVtZW50XG4gKiBEaXN0aW5ndWlzaGVzIGJldHdlZW4gc2FtZS1wYWdlIGxpbmtzIChhbmNob3JzKSBhbmQgcmVndWxhciBsaW5rc1xuICogQHBhcmFtIGN1cnNvciBUaGUgY3Vyc29yIHBvc2l0aW9uZWQgYXQgdGhlIGxpbmsgZWxlbWVudFxuICogQHBhcmFtIG1vZGUgVGhlIG5hdmlnYXRpb24gbW9kZSAoYWZmZWN0cyBhbm5vdW5jZW1lbnQgb3JkZXIpXG4gKiBAcmV0dXJucyBUaGUgZm9ybWF0dGVkIGxpbmsgYW5ub3VuY2VtZW50IHN0cmluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TGlua0Fubm91bmNlbWVudChjdXJzb3I6IFNSQ3Vyc29yLCBtb2RlPzogTmF2aWdhdGlvbk1vZGUpOiBzdHJpbmcge1xuICAgIGxldCBocmVmOiBzdHJpbmcgPSAoKGN1cnNvci5nZXROb2RlKCkgYXMgYW55KS5ocmVmKSB8fCBcIlwiO1xuICAgIGxldCBhbm5vdW5jZVN0ciA9IFwiXCI7XG4gICAgaWYgKGhyZWYuc3RhcnRzV2l0aChkb2N1bWVudC5sb2NhdGlvbi5ocmVmKSAmJiBocmVmLmNoYXJBdChkb2N1bWVudC5sb2NhdGlvbi5ocmVmLmxlbmd0aCkgPT09IFwiI1wiKSB7XG4gICAgICAgIGFubm91bmNlU3RyID0gYHNhbWUgcGFnZSBsaW5rYDtcbiAgICB9IGVsc2Uge1xuICAgICAgICBhbm5vdW5jZVN0ciA9IGBsaW5rYDtcbiAgICB9XG4gICAgbGV0IG5hbWVJbmZvID0gY3Vyc29yLmdldE5hbWVJbmZvKCk7XG4gICAgaWYgKG5hbWVJbmZvICYmICFbXCJjb250ZW50XCIsIFwidGV4dFwiXS5pbmNsdWRlcyhuYW1lSW5mby5uYW1lRnJvbSkpIHtcbiAgICAgICAgaWYgKG1vZGUgPT09IFwidGFiX2ZvY3VzXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX0ke2Fubm91bmNlU3RyfV1gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGBbJHthbm5vdW5jZVN0cn0ke3F1b3RlTmFtZVBhZEJlZm9yZShjdXJzb3IpfV1gO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBgWyR7YW5ub3VuY2VTdHJ9XWA7XG59XG5cbi8qKlxuICogR2V0IHRoZSBkZXNjcmlwdGlvbiB0ZXh0IGZyb20gYXJpYS1kZXNjcmliZWRieSByZWZlcmVuY2VzXG4gKiBSZXNvbHZlcyBhbGwgSURzIGluIGFyaWEtZGVzY3JpYmVkYnkgYW5kIGNvbmNhdGVuYXRlcyB0aGVpciB0ZXh0IGNvbnRlbnRcbiAqIEBwYXJhbSBlbGVtIFRoZSBlbGVtZW50IHdpdGggYXJpYS1kZXNjcmliZWRieSBhdHRyaWJ1dGVcbiAqIEBwYXJhbSBtb2RlIFRoZSBuYXZpZ2F0aW9uIG1vZGUgKHJldHVybnMgZW1wdHkgc3RyaW5nIGluIFwiaXRlbVwiIG1vZGUpXG4gKiBAcmV0dXJucyBUaGUgZm9ybWF0dGVkIGRlc2NyaXB0aW9uIHRleHQgd2l0aCBsZWFkaW5nIGNvbW1hIGFuZCBxdW90ZXMsIG9yIGVtcHR5IHN0cmluZ1xuICovXG5mdW5jdGlvbiBnZXREZXNjcmliZWRCeUFubm91bmNlbWVudHMoZWxlbTogSFRNTEVsZW1lbnQsIG1vZGU/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRlc2NyaWJlZEJ5ID0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWRlc2NyaWJlZGJ5XCIpO1xuICAgIGlmICghZGVzY3JpYmVkQnkpIHJldHVybiBcIlwiO1xuICAgIGNvbnN0IGRlc2NyaXB0aW9uRWxlbXMgPSBkZXNjcmliZWRCeVxuICAgICAgICAuc3BsaXQoL1xccysvKVxuICAgICAgICAubWFwKGlkID0+IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKSlcbiAgICAgICAgLmZpbHRlcihkZXNjRWxlbSA9PiAhIWRlc2NFbGVtKSBhcyBIVE1MRWxlbWVudFtdO1xuXG4gICAgY29uc3QgZGVzY3JpcHRpb25UZXh0ID0gZGVzY3JpcHRpb25FbGVtc1xuICAgICAgICAubWFwKGRlc2NFbGVtID0+IGRlc2NFbGVtLnRleHRDb250ZW50Py50cmltKCkpXG4gICAgICAgIC5maWx0ZXIodGV4dCA9PiAhIXRleHQpXG4gICAgICAgIC5qb2luKFwiIFwiKTtcblxuICAgIGlmICghZGVzY3JpcHRpb25UZXh0IHx8IGRlc2NyaXB0aW9uVGV4dC5sZW5ndGggPT09IDApIHJldHVybiBcIlwiO1xuICAgIGlmIChtb2RlID09PSBcIml0ZW1cIikgcmV0dXJuIGAsIFxcdTAwMDEke2Rlc2NyaXB0aW9uVGV4dH1cXHUwMDAyYDtcbiAgICByZXR1cm4gYCwgXCIke2Rlc2NyaXB0aW9uVGV4dH1cImA7XG59XG5cbi8qKlxuICogR2V0IHN0YXRlIGFubm91bmNlbWVudHMgZm9yIGRpc2FibGVkLCByZWFkb25seSwgcmVxdWlyZWQsIGFuZCBpbnZhbGlkIGF0dHJpYnV0ZXNcbiAqIEBwYXJhbSBlbGVtIFRoZSBlbGVtZW50IHRvIGNoZWNrIGZvciBzdGF0ZSBhdHRyaWJ1dGVzXG4gKiBAcmV0dXJucyBBIHN0cmluZyB3aXRoIHN0YXRlIGFubm91bmNlbWVudHMgKGUuZy4sIFwiLCBkaXNhYmxlZFwiLCBcIiwgcmVhZCBvbmx5XCIsIFwiLCByZXF1aXJlZFwiLCBcIiwgaW52YWxpZFwiKVxuICovXG5mdW5jdGlvbiBnZXRTdGF0ZUFubm91bmNlbWVudHMoZWxlbTogSFRNTEVsZW1lbnQpOiBzdHJpbmcge1xuICAgIGxldCBzdGF0ZXMgPSBcIlwiO1xuICAgIFxuICAgIC8vIENoZWNrIGZvciBkaXNhYmxlZCBzdGF0ZSAoYm90aCBhdHRyaWJ1dGUgYW5kIGFyaWEtZGlzYWJsZWQpXG4gICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwiZGlzYWJsZWRcIikgfHwgZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWRpc2FibGVkXCIpID09PSBcInRydWVcIikge1xuICAgICAgICBzdGF0ZXMgKz0gXCIsIGRpc2FibGVkXCI7XG4gICAgfVxuICAgIFxuICAgIC8vIENoZWNrIGZvciByZWFkb25seSBzdGF0ZSAoYm90aCBhdHRyaWJ1dGUgYW5kIGFyaWEtcmVhZG9ubHkpXG4gICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwicmVhZG9ubHlcIikgfHwgZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLXJlYWRvbmx5XCIpID09PSBcInRydWVcIikge1xuICAgICAgICBzdGF0ZXMgKz0gXCIsIHJlYWQgb25seVwiO1xuICAgIH1cbiAgICBcbiAgICAvLyBDaGVjayBmb3IgcmVxdWlyZWQgc3RhdGUgKGJvdGggYXR0cmlidXRlIGFuZCBhcmlhLXJlcXVpcmVkKVxuICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcInJlcXVpcmVkXCIpIHx8IGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1yZXF1aXJlZFwiKSA9PT0gXCJ0cnVlXCIpIHtcbiAgICAgICAgc3RhdGVzICs9IFwiLCByZXF1aXJlZFwiO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciBpbnZhbGlkIHN0YXRlIChhcmlhLWludmFsaWQpXG4gICAgaWYgKGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1pbnZhbGlkXCIpID09PSBcInRydWVcIikge1xuICAgICAgICBzdGF0ZXMgKz0gXCIsIGludmFsaWRcIjtcbiAgICB9XG4gICAgXG4gICAgcmV0dXJuIHN0YXRlcztcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhIGxpc3RpdGVtIGNvbnRhaW5zIGludGVyYWN0aXZlL3dpZGdldCBlbGVtZW50c1xuICogU2NyZWVuIHJlYWRlcnMgdHlwaWNhbGx5IGRvbid0IHJlYWQgdGhlIGFjY2Vzc2libGUgbmFtZSBvZiBhIGxpc3RpdGVtIHdoZW4gaXQgY29udGFpbnMgaW50ZXJhY3RpdmUgZWxlbWVudHNcbiAqIFVzZXMgRE9NV2Fsa2VyIHRvIHByb3Blcmx5IHRyYXZlcnNlIHNoYWRvdyBET00gYW5kIG90aGVyIGNvbXBsZXggc3RydWN0dXJlc1xuICovXG5mdW5jdGlvbiBsaXN0aXRlbUNvbnRhaW5zSW50ZXJhY3RpdmVFbGVtZW50KGN1cnNvcjogU1JDdXJzb3IpOiBib29sZWFuIHtcbiAgICBjb25zdCBlbGVtID0gY3Vyc29yLmdldEVsZW1lbnQoKTtcbiAgICBpZiAoIWVsZW0pIHJldHVybiBmYWxzZTtcbiAgICBcbiAgICAvLyBVc2UgRE9NV2Fsa2VyIHRvIHRyYXZlcnNlIHRoZSBlbnRpcmUgc3VidHJlZSBpbmNsdWRpbmcgc2hhZG93IERPTVxuICAgIGNvbnN0IHdhbGtlciA9IG5ldyBET01XYWxrZXIoZWxlbSwgZmFsc2UsIGVsZW0sIGZhbHNlKTtcbiAgICBcbiAgICAvLyBXYWxrIHRocm91Z2ggYWxsIGRlc2NlbmRhbnRzXG4gICAgd2hpbGUgKHdhbGtlci5uZXh0Tm9kZSgpKSB7XG4gICAgICAgIC8vIE9ubHkgY2hlY2sgZWxlbWVudCBub2RlcyBhdCBzdGFydCB0YWdzXG4gICAgICAgIGlmICh3YWxrZXIubm9kZS5ub2RlVHlwZSA9PT0gMSAmJiAhd2Fsa2VyLmJFbmRUYWcpIHtcbiAgICAgICAgICAgIGNvbnN0IHJvbGUgPSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUod2Fsa2VyLm5vZGUgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgICAgICAgaWYgKHJvbGUgJiYgQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVdICYmIEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlXS5yb2xlVHlwZSA9PT0gJ3dpZGdldCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgYW4gaWZyYW1lJ3MgY29udGVudCBjYW4gYmUgYWNjZXNzZWQgKG5vdCBjcm9zcy1vcmlnaW4pXG4gKiBBdHRlbXB0cyB0byBhY2Nlc3MgdGhlIGlmcmFtZSdzIGRvY3VtZW50IHRvIGRldGVybWluZSBpZiBpdCdzIGFjY2Vzc2libGVcbiAqIEBwYXJhbSBpZnJhbWUgVGhlIGlmcmFtZSBlbGVtZW50IHRvIGNoZWNrXG4gKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBpZnJhbWUgY29udGVudCBpcyBhY2Nlc3NpYmxlLCBmYWxzZSBpZiBjcm9zcy1vcmlnaW4gb3IgYmxvY2tlZFxuICovXG5mdW5jdGlvbiBjYW5BY2Nlc3NGcmFtZShpZnJhbWUpIHtcbiAgICB0cnkge1xuICAgICAgICAvLyBUaGlzIHRocm93cyBhIERPTUV4Y2VwdGlvbiBmb3IgY3Jvc3Mtb3JpZ2luIGZyYW1lc1xuICAgICAgICBjb25zdCBkb2MgPSBpZnJhbWUuY29udGVudERvY3VtZW50IHx8IGlmcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50O1xuICAgICAgICByZXR1cm4gZG9jICE9PSBudWxsO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAvLyBpZiAoZSBpbnN0YW5jZW9mIERPTUV4Y2VwdGlvbiAmJiBlLm5hbWUgPT09ICdTZWN1cml0eUVycm9yJykge1xuICAgICAgICAvLyAgICAgcmV0dXJuIGZhbHNlOyAvLyBDcm9zcy1vcmlnaW4sIGFjY2VzcyBibG9ja2VkXG4gICAgICAgIC8vIH1cbiAgICAgICAgLy8gdGhyb3cgZTsgLy8gUmUtdGhyb3cgdW5leHBlY3RlZCBlcnJvcnNcbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBSVUxFUzogU1JSZW5kZXJlclJ1bGVbXSA9IFtcbiAgICAvLyBTaW5nbGUgcm9sZSBydWxlcyAtIGFscGhhYmV0aWNhbGx5IHNvcnRlZFxuICAgIFxuICAgIC8vIEJ1dHRvbiByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImJ1dHRvblwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcImJ1dHRvblwiLCBcInRhYl9mb2N1c1wiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yLCBfb2xkQ3Vyc29yPzogU1JDdXJzb3IsIG1vZGU/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWN1cnNvci5pc1N0YXJ0VGFnKCkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW0gPSBjdXJzb3IuZ2V0Tm9kZSgpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvbGVEZXNjID0gZ2V0Um9sZURlc2NyaXB0aW9uKGN1cnNvciwgXCJidXR0b25cIik7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1wcmVzc2VkXCIpID09PSBcInRydWVcIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFt0b2dnbGUgJHtyb2xlRGVzY30sIHByZXNzZWQke3F1b3RlTmFtZVBhZEJlZm9yZShjdXJzb3IpfSR7Z2V0RGVzY3JpYmVkQnlBbm5vdW5jZW1lbnRzKGVsZW0sIG1vZGUpfV1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvciwgX29sZEN1cnNvcj86IFNSQ3Vyc29yLCBtb2RlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFjdXJzb3IuaXNTdGFydFRhZygpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtID0gY3Vyc29yLmdldE5vZGUoKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICBjb25zdCByb2xlRGVzYyA9IGdldFJvbGVEZXNjcmlwdGlvbihjdXJzb3IsIFwiYnV0dG9uXCIpO1xuICAgICAgICAgICAgICAgIGlmIChlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtcHJlc3NlZFwiKSA9PT0gXCJmYWxzZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgW3RvZ2dsZSAke3JvbGVEZXNjfSwgbm90IHByZXNzZWQke3F1b3RlTmFtZVBhZEJlZm9yZShjdXJzb3IpfSR7Z2V0RGVzY3JpYmVkQnlBbm5vdW5jZW1lbnRzKGVsZW0sIG1vZGUpfV1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvciwgX29sZEN1cnNvcj86IFNSQ3Vyc29yLCBtb2RlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5pc0VuZFRhZygpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGxldCBleHBhbmRTdHIgPSBcIlwiO1xuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW0gPSBjdXJzb3IuZ2V0RWxlbWVudCgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvbGVEZXNjID0gZ2V0Um9sZURlc2NyaXB0aW9uKGN1cnNvciwgXCJidXR0b25cIik7XG4gICAgICAgICAgICAgICAgaWYgKFtcIm1lbnVcIiwgXCJ0cnVlXCJdLmluY2x1ZGVzKGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1oYXNwb3B1cFwiKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZXhwYW5kU3RyICs9IFwiLCBtZW51XCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcImFyaWEtZXhwYW5kZWRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgZXhwYW5kU3RyICs9IGAsICR7ZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWV4cGFuZGVkXCIpID09PSBcInRydWVcIiA/IFwiZXhwYW5kZWRcIiA6IFwiY29sbGFwc2VkXCJ9YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZXhwYW5kU3RyICs9IGdldFN0YXRlQW5ub3VuY2VtZW50cyhlbGVtKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYFske3F1b3RlTmFtZVBhZEFmdGVyKGN1cnNvcil9JHtyb2xlRGVzY30ke2V4cGFuZFN0cn0ke2dldERlc2NyaWJlZEJ5QW5ub3VuY2VtZW50cyhlbGVtLCBtb2RlKX1dYDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4geyBpZiAoY3Vyc29yLmlzRW5kVGFnKCkpIHJldHVybiBcIlwiOyB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIENoZWNrYm94IHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiY2hlY2tib3hcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJjaGVja2JveFwiLCBcInRhYl9mb2N1c1wiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yLCBfb2xkQ3Vyc29yPzogU1JDdXJzb3IsIG1vZGU/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmlzU3RhcnRUYWcoKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGVtID0gY3Vyc29yLmdldE5vZGUoKSBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByb2xlRGVzYyA9IGdldFJvbGVEZXNjcmlwdGlvbihjdXJzb3IsIFwiY2hlY2tib3hcIik7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzdGF0ZVN0ciA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtY2hlY2tlZFwiKSA9PT0gXCJtaXhlZFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZVN0ciA9IFwiaGFsZiBjaGVja2VkXCI7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgYkNoZWNrZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcImFyaWEtY2hlY2tlZFwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJDaGVja2VkID0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWNoZWNrZWRcIikgPT09IFwidHJ1ZVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiQ2hlY2tlZCA9IGVsZW0uY2hlY2tlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlU3RyID0gYkNoZWNrZWQgPyBcImNoZWNrZWRcIiA6IFwibm90IGNoZWNrZWRcIjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBzdGF0ZVN0ciArPSBnZXRTdGF0ZUFubm91bmNlbWVudHMoY3Vyc29yLmdldEVsZW1lbnQoKSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cm9sZURlc2N9LCAke3N0YXRlU3RyfSR7cXVvdGVOYW1lUGFkQmVmb3JlKGN1cnNvcil9JHtnZXREZXNjcmliZWRCeUFubm91bmNlbWVudHMoY3Vyc29yLmdldEVsZW1lbnQoKSwgbW9kZSl9XWBcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIENlbGwsIENvbHVtbmhlYWRlciwgYW5kIFJvd2hlYWRlciByb2xlc1xuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJjZWxsXCIsIFwiY29sdW1uaGVhZGVyXCIsIFwicm93aGVhZGVyXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwidGFibGVcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghY3Vyc29yLmlzU3RhcnRUYWcoKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBjZWxsIGVsZW1lbnRcbiAgICAgICAgICAgICAgICBjb25zdCBjZWxsRWxlbSA9IGN1cnNvci5nZXRFbGVtZW50KCk7XG4gICAgICAgICAgICAgICAgaWYgKCFjZWxsRWxlbSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGNlbGwgaGFzIGFueSB2aXNpYmxlIGNvbnRlbnQgYnkgY2hlY2tpbmc6XG4gICAgICAgICAgICAgICAgLy8gMS4gVGV4dCBjb250ZW50ICh0cmltbWVkKVxuICAgICAgICAgICAgICAgIC8vIDIuIENoaWxkIGVsZW1lbnRzIHdpdGggcm9sZXMgKGJ1dHRvbnMsIGxpbmtzLCBldGMuKVxuICAgICAgICAgICAgICAgIC8vIDMuIEltYWdlcyB3aXRoIGFsdCB0ZXh0XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgY29uc3QgdGV4dENvbnRlbnQgPSBjZWxsRWxlbS50ZXh0Q29udGVudD8udHJpbSgpIHx8IFwiXCI7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGNoaWxkIGVsZW1lbnRzIHdpdGggaW50ZXJhY3RpdmUgcm9sZXMgb3IgY29udGVudFxuICAgICAgICAgICAgICAgIGNvbnN0IHdhbGtlciA9IG5ldyBET01XYWxrZXIoY2VsbEVsZW0sIGZhbHNlLCBjZWxsRWxlbSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIGxldCBoYXNDb250ZW50ID0gdGV4dENvbnRlbnQubGVuZ3RoID4gMDtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBpZiAoIWhhc0NvbnRlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGVsZW1lbnRzIHRoYXQgd291bGQgaGF2ZSBjb250ZW50IChidXR0b25zLCBsaW5rcywgaW1hZ2VzLCBldGMuKVxuICAgICAgICAgICAgICAgICAgICB3aGlsZSAod2Fsa2VyLm5leHROb2RlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3YWxrZXIubm9kZS5ub2RlVHlwZSA9PT0gMSAmJiAhd2Fsa2VyLmJFbmRUYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGVtID0gd2Fsa2VyLm5vZGUgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgcm9sZSA9IEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZShlbGVtKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgaW50ZXJhY3RpdmUgZWxlbWVudHMgb3IgZWxlbWVudHMgd2l0aCBhY2Nlc3NpYmxlIG5hbWVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvbGUgJiYgQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0NvbnRlbnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGltYWdlcyB3aXRoIGFsdCB0ZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW0ubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJJTUdcIiAmJiBlbGVtLmhhc0F0dHJpYnV0ZShcImFsdFwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNDb250ZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIElmIHRoZSBjZWxsIGlzIGVtcHR5LCByZXR1cm4gXCJbYmxhbmtdXCJcbiAgICAgICAgICAgICAgICBpZiAoIWhhc0NvbnRlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiW2JsYW5rXVwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIHJldHVybiBudWxsIHRvIGxldCBkZWZhdWx0IHJlbmRlcmluZyBjb250aW51ZVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBDb21ib2JveCByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImNvbWJvYm94XCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwiY29tYm9cIiwgXCJ0YWJfZm9jdXNcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuaXNFbmRUYWcoKSkgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm9sZURlc2MgPSBnZXRSb2xlRGVzY3JpcHRpb24oY3Vyc29yLCBcImNvbWJvIGJveFwiKTtcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtID0gY3Vyc29yLmdldEVsZW1lbnQoKTtcbiAgICAgICAgICAgICAgICBsZXQgc3RhdGUgPSBcIlwiO1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuZ2V0Tm9kZSgpLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiU0VMRUNUXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBcIiwgY29sbGFwc2VkXCI7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0RWxlbSA9IGN1cnNvci5nZXRFbGVtZW50KCkgYXMgSFRNTFNlbGVjdEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZUVsZW0gPSBzZWxlY3RFbGVtLnNlbGVjdGVkSW5kZXggPj0gMCA/IHNlbGVjdEVsZW0ub3B0aW9uc1tzZWxlY3RFbGVtLnNlbGVjdGVkSW5kZXhdIDogbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlU3RyID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlRWxlbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRlbXAgPSBuZXcgU1JDdXJzb3IodmFsdWVFbGVtLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVN0ciA9IHF1b3RlTmFtZVBhZEJlZm9yZSh0ZW1wLCBcIiwgXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHN0YXRlICs9IGdldFN0YXRlQW5ub3VuY2VtZW50cyhlbGVtKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBbJHtxdW90ZU5hbWVQYWRBZnRlcihjdXJzb3IpfSR7cm9sZURlc2N9JHtzdGF0ZX0ke3ZhbHVlU3RyfV1gO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY3Vyc29yLmdldE5vZGUoKS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIklOUFVUXCIgJiYgIWN1cnNvci5nZXRFbGVtZW50KCkuaGFzQXR0cmlidXRlKFwicm9sZVwiKSkge1xuICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IGdldFN0YXRlQW5ub3VuY2VtZW50cyhlbGVtKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBbJHtxdW90ZU5hbWVQYWRBZnRlcihjdXJzb3IpfSR7cm9sZURlc2N9LCBoYXMgYXV0byBjb21wbGV0ZSwgZWRpdGFibGUsIG9wZW5zIGxpc3Qke3N0YXRlfV1gO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcImFyaWEtZXhwYW5kZWRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gYCwgJHtlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtZXhwYW5kZWRcIikgPT09IFwidHJ1ZVwiID8gXCJleHBhbmRlZFwiIDogXCJjb2xsYXBzZWRcIn1gO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwiYXJpYS1hdXRvY29tcGxldGVcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSArPSBgLCBoYXMgYXV0byBjb21wbGV0ZWA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSArPSBgLCBlZGl0YWJsZSwgb3BlbnMgbGlzdGBcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBzdGF0ZSArPSBnZXRTdGF0ZUFubm91bmNlbWVudHMoZWxlbSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX0ke3JvbGVEZXNjfSR7c3RhdGV9XWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBEZWZhdWx0IHJvbGUgKGZhbGxiYWNrKVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJkZWZhdWx0XCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IGN1cnNvci5pc1N0YXJ0VGFnKCkgP1xuICAgICAgICAgICAgICAgIGAhITwke2N1cnNvci5nZXRSb2xlKCl9PiR7KGN1cnNvci5nZXROYW1lSW5mbygpPy5uYW1lICsgXCJcIil9ISFgIDpcbiAgICAgICAgICAgICAgICBgISE8LyR7Y3Vyc29yLmdldFJvbGUoKX0+ISFgXG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIERlbGV0aW9uIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiZGVsZXRpb25cIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4gKGN1cnNvci5pc1N0YXJ0VGFnKCkgJiYgYFtkZWxldGVkXWAgfHwgXCJcIilcbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gRGlhbG9nIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiZGlhbG9nXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY3Vyc29yLmlzRW5kVGFnKCkgPyBgW0VuZCBvZiBkaWFsb2ddYCA6IGBbU3RhcnQgb2YgZGlhbG9nJHtxdW90ZU5hbWVQYWRCZWZvcmUoY3Vyc29yKX1gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBEb2N1bWVudCByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImRvY3VtZW50XCIsIFwiZ2VuZXJpY1wiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgICgpID0+IFwiXCJcbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gR3JhcGhpY3MgZG9jdW1lbnQgcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJncmFwaGljcy1kb2N1bWVudFwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcImltYWdlXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmlzU3RhcnRUYWcoKSAmJiAhY3Vyc29yLmdldE5hbWVJbmZvKCk/Lm5hbWUgJiYgY3Vyc29yLmdldE5hbWVJbmZvKCk/Lm5hbWUgIT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRG9uJ3QgYW5ub3VuY2UgdW5sYWJlbGVkIGdyYXBoaWNzIHRoYXQgYXJlIGhpZGRlbiBpbnNpZGUgbGlua3Mgb3IgaGVhZGluZ3NcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyZW50SGVhZGluZ09yTGluayA9IGN1cnNvci5nZXRDdXJyZW50T3JQYXJlbnRCeVJvbGVDbG9uZShbXCJoZWFkaW5nXCIsIFwibGlua1wiXSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnRIZWFkaW5nT3JMaW5rICYmIFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKGN1cnNvci5nZXRFbGVtZW50KCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJbVW5sYWJlbGVkIGdyYXBoaWNdXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiAoY3Vyc29yLmlzU3RhcnRUYWcoKSAmJiAoY3Vyc29yLmdldE5hbWVJbmZvKCk/Lm5hbWUgPT09IFwiXCIpKSA/IFwiXCIgOiBudWxsLFxuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IChjdXJzb3IuaXNTdGFydFRhZygpICYmIGN1cnNvci5nZXROYW1lSW5mbygpPy5uYW1lICYmIGBbZ3JhcGhpYyR7cXVvdGVOYW1lUGFkQmVmb3JlKGN1cnNvcil9XWApIHx8IG51bGwsXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4gKGN1cnNvci5pc0VuZFRhZygpKSA/IFwiXCIgOiBudWxsXG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIEhlYWRpbmcgcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJoZWFkaW5nXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwidGFiX2ZvY3VzXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IsIF9vbGRDdXJzb3I6IFNSQ3Vyc29yLCBtb2RlOiBOYXZpZ2F0aW9uTW9kZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChtb2RlID09PSBcInRhYl9mb2N1c1wiICYmIGN1cnNvci5pc1N0YXJ0VGFnKCkpIHJldHVybiBcIlwiO1xuICAgICAgICAgICAgICAgIGlmIChtb2RlID09PSBcIml0ZW1cIiAmJiBjdXJzb3IuaXNFbmRUYWcoKSkgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICAgICAgbGV0IGxldmVsOiBzdHJpbmc7XG4gICAgICAgICAgICAgICAgY29uc3Qgbm9kZSA9IGN1cnNvci5nZXRFbGVtZW50KCk7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUuYXJpYUxldmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEV4cGxpY2l0IGFyaWEtbGV2ZWwgYXR0cmlidXRlXG4gICAgICAgICAgICAgICAgICAgIGxldmVsID0gbm9kZS5hcmlhTGV2ZWw7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChub2RlLmdldEF0dHJpYnV0ZSgncm9sZScpID09PSAnaGVhZGluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gcm9sZT1cImhlYWRpbmdcIiB3aXRob3V0IGFyaWEtbGV2ZWwgZGVmYXVsdHMgdG8gMlxuICAgICAgICAgICAgICAgICAgICBsZXZlbCA9ICcyJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBOYXRpdmUgaGVhZGluZyBlbGVtZW50IChoMS1oNiksIGV4dHJhY3QgbnVtYmVyIGZyb20gdGFnIG5hbWVcbiAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSBub2RlLm5vZGVOYW1lLnN1YnN0cmluZygxKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgbmFtZUluZm8gPSBjdXJzb3IuZ2V0TmFtZUluZm8oKTtcbiAgICAgICAgICAgICAgICBpZiAoKCFuYW1lSW5mbyB8fCBbXCJjb250ZW50XCIsIFwidGV4dFwiXS5pbmNsdWRlcyhuYW1lSW5mby5uYW1lRnJvbSkpICYmICEobm9kZS50ZXh0Q29udGVudCB8fCBcIlwiKS50cmltKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKG5hbWVJbmZvICYmICFbXCJjb250ZW50XCIsIFwidGV4dFwiXS5pbmNsdWRlcyhuYW1lSW5mby5uYW1lRnJvbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBbaGVhZGluZyBsZXZlbCAke2xldmVsfSR7cXVvdGVOYW1lUGFkQmVmb3JlKGN1cnNvcil9XWA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBbaGVhZGluZyBsZXZlbCAke2xldmVsfV1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gLS0gaW4gaGVhZGluZyBtb2RlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImhlYWRpbmdcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcImhlYWRpbmdcIiwgXCJoMVwiLCBcImgyXCIsIFwiaDNcIiwgXCJoNFwiLCBcImg1XCIsIFwiaDZcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuaXNTdGFydFRhZygpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBjdXJzb3IuZ2V0Tm9kZSgpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICBsZXQgbGV2ZWw6IHN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIGlmIChub2RlLmFyaWFMZXZlbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXhwbGljaXQgYXJpYS1sZXZlbCBhdHRyaWJ1dGVcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsID0gbm9kZS5hcmlhTGV2ZWw7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobm9kZS5nZXRBdHRyaWJ1dGUoJ3JvbGUnKSA9PT0gJ2hlYWRpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByb2xlPVwiaGVhZGluZ1wiIHdpdGhvdXQgYXJpYS1sZXZlbCBkZWZhdWx0cyB0byAyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbCA9ICcyJztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5hdGl2ZSBoZWFkaW5nIGVsZW1lbnQgKGgxLWg2KSwgZXh0cmFjdCBudW1iZXIgZnJvbSB0YWcgbmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSBub2RlLm5vZGVOYW1lLnN1YnN0cmluZygxKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGxldCBuYW1lSW5mbyA9IGN1cnNvci5nZXROYW1lSW5mbygpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoKCFuYW1lSW5mbyB8fCBbXCJjb250ZW50XCIsIFwidGV4dFwiXS5pbmNsdWRlcyhuYW1lSW5mby5uYW1lRnJvbSkpICYmICEobm9kZS50ZXh0Q29udGVudCB8fCBcIlwiKS50cmltKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFske3F1b3RlTmFtZVBhZEFmdGVyKGN1cnNvcil9aGVhZGluZyBsZXZlbCAke2xldmVsfV1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gXCJcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gSW1hZ2Ugcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJpbWdcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJpbWFnZVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5pc0VuZFRhZygpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY3Vyc29yLmdldE5hbWVJbmZvKCk/Lm5hbWUgJiYgY3Vyc29yLmdldE5hbWVJbmZvKCk/Lm5hbWUgIT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvbid0IGFubm91bmNlIHVubGFiZWxlZCBncmFwaGljcyB0aGF0IGFyZSBoaWRkZW4gaW5zaWRlIGxpbmtzIG9yIGhlYWRpbmdzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAodGhlc2Ugd2VyZSBvbmx5IGluY2x1ZGVkIGJlY2F1c2Ugb2YgdGhlIFNLSVBfSVRFTV9CRUhBVklPUiBjaGFuZ2UpXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRIZWFkaW5nT3JMaW5rID0gY3Vyc29yLmdldEN1cnJlbnRPclBhcmVudEJ5Um9sZUNsb25lKFtcImhlYWRpbmdcIiwgXCJsaW5rXCJdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnRIZWFkaW5nT3JMaW5rICYmIFZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKGN1cnNvci5nZXRFbGVtZW50KCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJbVW5sYWJlbGVkIGdyYXBoaWNdXCJcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJzb3IuZ2V0TmFtZUluZm8oKT8ubmFtZSA9PT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFtncmFwaGljJHtxdW90ZU5hbWVQYWRCZWZvcmUoY3Vyc29yKX1dYFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBJbnNlcnRpb24gcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJpbnNlcnRpb25cIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4gKGN1cnNvci5pc1N0YXJ0VGFnKCkgJiYgYFtpbnNlcnRlZF1gIHx8IFwiXCIpXG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIExpbmsgcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJsaW5rXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwicmVnaW9uXCIsIFwibGlua1wiLCBcInRhYl9mb2N1c1wiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yLCBfb2xkQ3Vyc29yOiBTUkN1cnNvciwgbW9kZTogTmF2aWdhdGlvbk1vZGUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmlzU3RhcnRUYWcoKSAmJiAhW1wiY29udGVudFwiLCBcInRleHRcIl0uaW5jbHVkZXMoY3Vyc29yLmdldE5hbWVJbmZvKCk/Lm5hbWVGcm9tKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0TGlua0Fubm91bmNlbWVudChjdXJzb3IsIG1vZGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gTGlzdGl0ZW0gcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJsaXN0aXRlbVwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGlzT3JkZXJlZDogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBsZXQgcGFyZW50TGlzdEVsZW06IEhUTUxFbGVtZW50IHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGxldCB3YWxrUGFyZW50cyA9IERPTVdhbGtlci5wYXJlbnROb2RlKGN1cnNvci5nZXROb2RlKCkpO1xuICAgICAgICAgICAgICAgIHdoaWxlICh0eXBlb2YgaXNPcmRlcmVkID09PSBcInVuZGVmaW5lZFwiICYmIHdhbGtQYXJlbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh3YWxrUGFyZW50cy5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWxlbSA9IHdhbGtQYXJlbnRzIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwicm9sZVwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtLmdldEF0dHJpYnV0ZShcInJvbGVcIikgPT09IFwibGlzdFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzT3JkZXJlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRMaXN0RWxlbSA9IGVsZW07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiVUxcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzT3JkZXJlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudExpc3RFbGVtID0gZWxlbTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIk9MXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc09yZGVyZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudExpc3RFbGVtID0gZWxlbTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB3YWxrUGFyZW50cyA9IERPTVdhbGtlci5wYXJlbnROb2RlKHdhbGtQYXJlbnRzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgbGlzdGl0ZW0gY29udGFpbnMgaW50ZXJhY3RpdmUgZWxlbWVudHNcbiAgICAgICAgICAgICAgICAvLyBTY3JlZW4gcmVhZGVycyBkb24ndCByZWFkIHRoZSBhY2Nlc3NpYmxlIG5hbWUgd2hlbiBpbnRlcmFjdGl2ZSBlbGVtZW50cyBhcmUgcHJlc2VudFxuICAgICAgICAgICAgICAgIGNvbnN0IGhhc0ludGVyYWN0aXZlQ29udGVudCA9IGxpc3RpdGVtQ29udGFpbnNJbnRlcmFjdGl2ZUVsZW1lbnQoY3Vyc29yKTtcbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lVG9Vc2UgPSBoYXNJbnRlcmFjdGl2ZUNvbnRlbnQgPyBcIlwiIDogKGN1cnNvci5nZXROYW1lSW5mbygpPy5uYW1lIHx8IFwiXCIpO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGxldCByZXRTdHIgPSBcIlwiO1xuICAgICAgICAgICAgICAgIGlmICghaXNPcmRlcmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsZW0gPSBjdXJzb3IuZ2V0RWxlbWVudCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoKGVsZW0ubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJMSVwiICYmIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW0pLmxpc3RTdHlsZVR5cGUgPT09IFwibm9uZVwiKVxuICAgICAgICAgICAgICAgICAgICAgICAgfHwgZWxlbS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpICE9PSBcIkxJXCIpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldFN0ciA9IGN1cnNvci5pc1N0YXJ0VGFnKCkgPyBgJHtuYW1lVG9Vc2V9YCA6IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXRTdHIgPSBjdXJzb3IuaXNTdGFydFRhZygpID8gYFtidWxsZXRdICR7bmFtZVRvVXNlfWAgOiBcIlwiO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRm9yIG9yZGVyZWQgbGlzdHMsIGNvdW50IHNpYmxpbmcgbGlzdGl0ZW1zIGFuZCBhY2NvdW50IGZvciBzdGFydCBhdHRyaWJ1dGVcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvdW50ID0gMTsgLy8gU3RhcnQgYXQgMSBieSBkZWZhdWx0XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIHN0YXJ0IGF0dHJpYnV0ZSBpZiBpdCBleGlzdHMgb24gdGhlIDxvbD4gZWxlbWVudFxuICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50TGlzdEVsZW0gJiYgcGFyZW50TGlzdEVsZW0ubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gJ09MJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50TGlzdEVsZW0uaGFzQXR0cmlidXRlKCdzdGFydCcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFydFZhbHVlID0gcGFyc2VJbnQocGFyZW50TGlzdEVsZW0uZ2V0QXR0cmlidXRlKCdzdGFydCcpIHx8ICcxJywgMTApO1xuICAgICAgICAgICAgICAgICAgICAgICAgY291bnQgPSBpc05hTihzdGFydFZhbHVlKSA/IDEgOiBzdGFydFZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAvLyBDb3VudCBwcmV2aW91cyBzaWJsaW5nIGxpc3RpdGVtcyBhdCB0aGUgc2FtZSBsZXZlbCB1c2luZyBET01XYWxrZXJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudEVsZW0gPSBjdXJzb3IuZ2V0RWxlbWVudCgpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgc2libGluZyA9IERPTVdhbGtlci5wcmV2aW91c1NpYmxpbmdOb3RPd25lZEJ5U2xvdChjdXJyZW50RWxlbSk7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChzaWJsaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IGNvdW50IGRpcmVjdCBzaWJsaW5ncyB0aGF0IGFyZSBsaXN0aXRlbXMgKGVsZW1lbnQgbm9kZXMgb25seSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaWJsaW5nLm5vZGVUeXBlID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2libGluZ0VsZW0gPSBzaWJsaW5nIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaWJsaW5nRWxlbS5nZXRBdHRyaWJ1dGUoJ3JvbGUnKSA9PT0gJ2xpc3RpdGVtJyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWJsaW5nRWxlbS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSAnTEknKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50Kys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgc2libGluZyA9IERPTVdhbGtlci5wcmV2aW91c1NpYmxpbmdOb3RPd25lZEJ5U2xvdChzaWJsaW5nKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgcmV0U3RyID0gY3Vyc29yLmlzU3RhcnRUYWcoKSA/IGAke2NvdW50fS4gJHtuYW1lVG9Vc2V9YCA6IFwiXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXRTdHI7XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIE1hdGggcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJtYXRoXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IGN1cnNvci5pc0VuZFRhZygpID8gYFttYXRoIGNvbnRlbnRdYCA6IFwiXCJcbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gTGluayByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcIm1lbnVpdGVtXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwidGFiX2ZvY3VzXCIsIFwicmVnaW9uXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgcmV0VmFsID0gXCJcIjtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmlzU3RhcnRUYWcoKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBsZXQgaXNTdWJNZW51Q29udGFpbmVyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIC8vIGZvciAobGV0IGNoZWNrQ2hpbGRyZW49Y3Vyc29yLmdldE5vZGUoKS5maXJzdENoaWxkOyAhaXNTdWJNZW51Q29udGFpbmVyICYmIGNoZWNrQ2hpbGRyZW4gIT09IG51bGw7IGNoZWNrQ2hpbGRyZW4gPSBjaGVja0NoaWxkcmVuLm5leHRTaWJsaW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBpc1N1Yk1lbnVDb250YWluZXIgPSBjaGVja0NoaWxkcmVuLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiVUxcIjtcbiAgICAgICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgICAgICAvLyBpZiAoaXNTdWJNZW51Q29udGFpbmVyKSByZXR1cm4gXCJbPz8/P21lbnVdXCI7XG4gICAgICAgICAgICAgICAgICAgIGxldCBleHBhbmRTdHIgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGVtID0gY3Vyc29yLmdldEVsZW1lbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1oYXNwb3B1cFwiKSA9PT0gXCJ0cnVlXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4cGFuZFN0ciArPSBcIiwgc3ViLW1lbnVcIjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbS5oYXNBdHRyaWJ1dGUoXCJhcmlhLWV4cGFuZGVkXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBleHBhbmRTdHIgKz0gYCwgJHtlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtZXhwYW5kZWRcIikgPT09IFwidHJ1ZVwiID8gXCJleHBhbmRlZFwiIDogXCJjb2xsYXBzZWRcIn1gO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gYFttZW51JHtleHBhbmRTdHJ9YDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG5hbWVJbmZvID0gY3Vyc29yLmdldE5hbWVJbmZvKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lSW5mbyAmJiAhW1wiY29udGVudFwiLCBcInRleHRcIl0uaW5jbHVkZXMobmFtZUluZm8ubmFtZUZyb20pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwgKz0gcXVvdGVOYW1lUGFkQmVmb3JlKGN1cnNvcik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsICs9IFwiXVwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBNZXRlciByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcIm1ldGVyXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwidGFiX2ZvY3VzXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IGN1cnNvci5pc1N0YXJ0VGFnKCkgPyBgW3Byb2dyZXNzIGJhciwgJHsoKGN1cnNvci5nZXROb2RlKCkgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWUpfV1gIDogXCJcIlxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBQcm9ncmVzc2JhciByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcInByb2dyZXNzYmFyXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IGN1cnNvci5pc1N0YXJ0VGFnKCkgPyBgW3Byb2dyZXNzIGJhciwgJHsoKGN1cnNvci5nZXROb2RlKCkgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWUpfV1gIDogXCJcIlxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBSYWRpbyByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcInJhZGlvXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwidGFiX2ZvY3VzXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IsIF9vbGRDdXJzb3I/OiBTUkN1cnNvciwgbW9kZT86IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuaXNTdGFydFRhZygpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJvbGVEZXNjID0gZ2V0Um9sZURlc2NyaXB0aW9uKGN1cnNvciwgXCJyYWRpbyBidXR0b25cIik7XG4gICAgICAgICAgICAgICAgICAgIGxldCBiQ2hlY2tlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmdldEVsZW1lbnQoKS5oYXNBdHRyaWJ1dGUoXCJhcmlhLWNoZWNrZWRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJDaGVja2VkID0gY3Vyc29yLmdldEVsZW1lbnQoKS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWNoZWNrZWRcIikgPT09IFwidHJ1ZVwiO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgYkNoZWNrZWQgPSAoY3Vyc29yLmdldE5vZGUoKSBhcyBhbnkpLmNoZWNrZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGV0IHN0YXRlU3RyID0gZ2V0U3RhdGVBbm5vdW5jZW1lbnRzKGN1cnNvci5nZXRFbGVtZW50KCkpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFske3JvbGVEZXNjfSwgJHtiQ2hlY2tlZCA/IFwiY2hlY2tlZFwiIDogXCJub3QgY2hlY2tlZFwifSR7c3RhdGVTdHJ9JHtxdW90ZU5hbWVQYWRCZWZvcmUoY3Vyc29yKX0ke2dldERlc2NyaWJlZEJ5QW5ub3VuY2VtZW50cyhjdXJzb3IuZ2V0RWxlbWVudCgpLCBtb2RlKX1dYFxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gU2VhcmNoYm94IHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wic2VhcmNoYm94XCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwidGFiX2ZvY3VzXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IGN1cnNvci5pc1N0YXJ0VGFnKCkgPyBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX1lZGl0XWAgOiBcIlwiXG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIFNlcGFyYXRvciByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcInNlcGFyYXRvclwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiAoY3Vyc29yLmlzU3RhcnRUYWcoKSAmJiBgW3NlcGFyYXRvcl1gIHx8IFwiXCIpXG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIFNsaWRlciByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcInNsaWRlclwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInRhYl9mb2N1c1wiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yLCBfb2xkQ3Vyc29yPzogU1JDdXJzb3IsIG1vZGU/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWN1cnNvci5pc1N0YXJ0VGFnKCkpIHJldHVybiBcIlwiO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvbGVEZXNjID0gZ2V0Um9sZURlc2NyaXB0aW9uKGN1cnNvciwgXCJzbGlkZXJcIik7XG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbSA9IGN1cnNvci5nZXRFbGVtZW50KCk7XG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGFyaWEtdmFsdWVub3cgZmlyc3QsIHRoZW4gZmFsbCBiYWNrIHRvIG5hdGl2ZSB2YWx1ZSBwcm9wZXJ0eVxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZWxlbS5oYXNBdHRyaWJ1dGUoXCJhcmlhLXZhbHVlbm93XCIpXG4gICAgICAgICAgICAgICAgICAgID8gZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLXZhbHVlbm93XCIpXG4gICAgICAgICAgICAgICAgICAgIDogKGN1cnNvci5nZXROb2RlKCkgYXMgYW55KS52YWx1ZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYFske3F1b3RlTmFtZVBhZEFmdGVyKGN1cnNvcil9JHtyb2xlRGVzY30sICR7dmFsdWV9JHtnZXREZXNjcmliZWRCeUFubm91bmNlbWVudHMoY3Vyc29yLmdldEVsZW1lbnQoKSwgbW9kZSl9XWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIFNwaW5idXR0b24gcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJzcGluYnV0dG9uXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwidGFiX2ZvY3VzXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IsIF9vbGRDdXJzb3I/OiBTUkN1cnNvciwgbW9kZT86IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghY3Vyc29yLmlzU3RhcnRUYWcoKSkgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm9sZURlc2MgPSBnZXRSb2xlRGVzY3JpcHRpb24oY3Vyc29yLCBcInNwaW5idXR0b25cIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBbJHtxdW90ZU5hbWVQYWRBZnRlcihjdXJzb3IpfSR7cm9sZURlc2N9LCBlZGl0YWJsZSR7Z2V0RGVzY3JpYmVkQnlBbm5vdW5jZW1lbnRzKGN1cnNvci5nZXRFbGVtZW50KCksIG1vZGUpfV1gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBUYWIgcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJ0YWJcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJ0YWJfZm9jdXNcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghY3Vyc29yLmlzU3RhcnRUYWcoKSkgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm9sZURlc2MgPSBnZXRSb2xlRGVzY3JpcHRpb24oY3Vyc29yLCBcInRhYlwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYFske3JvbGVEZXNjfSR7KGN1cnNvci5nZXROb2RlKCkgYXMgSFRNTEVsZW1lbnQpLmdldEF0dHJpYnV0ZShcImFyaWEtc2VsZWN0ZWRcIikgPT09IFwidHJ1ZVwiID8gXCIsIHNlbGVjdGVkXCIgOiBcIlwifSR7cXVvdGVOYW1lUGFkQmVmb3JlKGN1cnNvcil9XWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIFRhYmxpc3Qgcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJ0YWJsaXN0XCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmdldE5hbWVJbmZvKCkgPT09IG51bGwpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuaXNTdGFydFRhZygpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgW2dyb3VwIHN0YXJ0JHtxdW90ZU5hbWVQYWRCZWZvcmUoY3Vyc29yKX1dYDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFtncm91cCBlbmQke3F1b3RlTmFtZVBhZEJlZm9yZShjdXJzb3IpfV1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gVGFicGFuZWwgcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJ0YWJwYW5lbFwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5nZXROYW1lSW5mbygpID09PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmlzU3RhcnRUYWcoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFtUYWIgcGFuZWwgc3RhcnQke3F1b3RlTmFtZVBhZEJlZm9yZShjdXJzb3IpfV1gO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgW1RhYiBwYW5lbCBlbmQke3F1b3RlTmFtZVBhZEJlZm9yZShjdXJzb3IpfV1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gVGV4dCByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcInRleHRcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJsaW5rXCIsIFwidGFiX2ZvY3VzXCIsIFwicmVnaW9uXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmlzRW5kVGFnKCkgfHwgIWN1cnNvci5nZXRQYXJlbnRFbGVtZW50KCk/LmdldEVsZW1lbnQoKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbSA9IGN1cnNvci5nZXRQYXJlbnRFbGVtZW50KCk/LmdldEVsZW1lbnQoKTtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUoZWxlbSkudGV4dERlY29yYXRpb25MaW5lID09PSBcImxpbmUtdGhyb3VnaFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgW3N0cmlrZXRocm91Z2hdICR7KGN1cnNvci5nZXROYW1lSW5mbygpPy5uYW1lICsgXCJcIil9IFtlbmQgc3RyaWtldGhyb3VnaF1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYCR7KGN1cnNvci5nZXROYW1lSW5mbygpPy5uYW1lICsgXCJcIil9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gLS0gaW4gaGVhZGluZyBtb2RlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcInRleHRcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcImhlYWRpbmdcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4gXCJcIlxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBUZXh0Ym94IHJvbGVcbiAgICAgICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgICAgIHJvbGVzOiBbXCJ0ZXh0Ym94XCJdLFxuICAgICAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJ0YWJfZm9jdXNcIl0sXG4gICAgICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yLCBfb2xkQ3Vyc29yPzogU1JDdXJzb3IsIG1vZGU/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZWxlbSA9IGN1cnNvci5nZXRFbGVtZW50KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuaXNFbmRUYWcoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vZGUgPT09IFwiaXRlbVwiICYmIGVsZW0ubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gXCJURVhUQVJFQVwiID8gXCJbb3V0IG9mIGVkaXRdXCIgOiBcIlwiO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgXG4gICAgICAgICAgICAgICAgICAgIGlmICghY3Vyc29yLmlzU3RhcnRUYWcoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICBcbiAgICAgICAgICAgICAgICAgICAgbGV0IGF0dHJpYnV0ZXMgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbS5oYXNBdHRyaWJ1dGUoXCJwbGFjZWhvbGRlclwiKSAmJiBlbGVtLmdldEF0dHJpYnV0ZShcInBsYWNlaG9sZGVyXCIpLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzICs9IGAsIHBsYWNlaG9sZGVyOiAke2VsZW0uZ2V0QXR0cmlidXRlKFwicGxhY2Vob2xkZXJcIil9YDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzICs9IGdldFN0YXRlQW5ub3VuY2VtZW50cyhlbGVtKTtcbiAgICBcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNNdWx0aWxpbmUgPSBlbGVtLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiVEVYVEFSRUFcIiB8fCBlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtbXVsdGlsaW5lXCIpID09PSBcInRydWVcIjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVzY3JpYmVkQnkgPSBnZXREZXNjcmliZWRCeUFubm91bmNlbWVudHMoZWxlbSwgbW9kZSk7XG4gICAgXG4gICAgICAgICAgICAgICAgICAgIGlmIChpc011bHRpbGluZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGV4dENvbnRlbnQgPSBtb2RlID09PSBcInRhYl9mb2N1c1wiID8gZWxlbS50ZXh0Q29udGVudD8udHJpbSgpIDogXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRTdWZmaXggPSB0ZXh0Q29udGVudCA/IGAgJHt0ZXh0Q29udGVudH1gIDogXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX1lZGl0LCBtdWx0aWxpbmUke2F0dHJpYnV0ZXN9JHtkZXNjcmliZWRCeX1dJHtjb250ZW50U3VmZml4fWA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICBcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBbJHtxdW90ZU5hbWVQYWRBZnRlcihjdXJzb3IpfWVkaXQke2F0dHJpYnV0ZXN9JHtkZXNjcmliZWRCeX1dYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdXG4gICAgICAgIH0pLFxuXG4gICAgLy8gVHJlZWl0ZW0gcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJ0cmVlaXRlbVwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInRhYl9mb2N1c1wiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5pc0VuZFRhZygpKSByZXR1cm4gXCJcIjtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtID0gY3Vyc29yLmdldEVsZW1lbnQoKTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBCdWlsZCB0aGUgYW5ub3VuY2VtZW50IHN0cmluZyB3aXRob3V0IHRoZSBuYW1lIChsZXQgY29udGVudCByZW5kZXIgc2VwYXJhdGVseSlcbiAgICAgICAgICAgICAgICBsZXQgYW5ub3VuY2VtZW50ID0gYFt0cmVldmlldyBpdGVtYDtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBBZGQgc2VsZWN0ZWQgc3RhdGUgaWYgcHJlc2VudFxuICAgICAgICAgICAgICAgIGlmIChlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtc2VsZWN0ZWRcIikgPT09IFwidHJ1ZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGFubm91bmNlbWVudCArPSBcIiwgc2VsZWN0ZWRcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gQWRkIGV4cGFuZGVkL2NvbGxhcHNlZCBzdGF0ZSBpZiBwcmVzZW50XG4gICAgICAgICAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwiYXJpYS1leHBhbmRlZFwiKSkge1xuICAgICAgICAgICAgICAgICAgICBhbm5vdW5jZW1lbnQgKz0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWV4cGFuZGVkXCIpID09PSBcInRydWVcIiA/IFwiLCBleHBhbmRlZFwiIDogXCIsIGNvbGxhcHNlZFwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBBZGQgbGV2ZWwgaWYgZXhwbGljaXRseSBzZXQgb3IgY2FsY3VsYXRlIGZyb20gbmVzdGluZ1xuICAgICAgICAgICAgICAgIGxldCBsZXZlbCA9IGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS1sZXZlbFwiKTtcbiAgICAgICAgICAgICAgICBpZiAobGV2ZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgYW5ub3VuY2VtZW50ICs9IGAsIGxldmVsICR7bGV2ZWx9YDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBDYWxjdWxhdGUgbGV2ZWwgYnkgY291bnRpbmcgcGFyZW50IHRyZWVpdGVtcyBvciBncm91cHMgdXNpbmcgRE9NV2Fsa2VyIGZvciBzaGFkb3cgRE9NIHN1cHBvcnRcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNhbGN1bGF0ZWRMZXZlbCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwYXJlbnQgPSBET01XYWxrZXIucGFyZW50RWxlbWVudChlbGVtKTtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHBhcmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyZW50Um9sZSA9IEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZShwYXJlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudFJvbGUgPT09IFwiZ3JvdXBcIiB8fCBwYXJlbnRSb2xlID09PSBcInRyZWVcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgZ3JvdXAgaXMgaW5zaWRlIGEgdHJlZWl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZ3JvdXBQYXJlbnQgPSBET01XYWxrZXIucGFyZW50RWxlbWVudChwYXJlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChncm91cFBhcmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBncm91cFBhcmVudFJvbGUgPSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUoZ3JvdXBQYXJlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ3JvdXBQYXJlbnRSb2xlID09PSBcInRyZWVpdGVtXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGN1bGF0ZWRMZXZlbCsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZ3JvdXBQYXJlbnRSb2xlID09PSBcInRyZWVcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBQYXJlbnQgPSBET01XYWxrZXIucGFyZW50RWxlbWVudChncm91cFBhcmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQocGFyZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoY2FsY3VsYXRlZExldmVsID4gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3VuY2VtZW50ICs9IGAsIGxldmVsICR7Y2FsY3VsYXRlZExldmVsfWA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gQWRkIHBvc2l0aW9uIGluZm9ybWF0aW9uIChhcmlhLXBvc2luc2V0L2FyaWEtc2V0c2l6ZSBvciBjYWxjdWxhdGUpXG4gICAgICAgICAgICAgICAgbGV0IHBvc2l0aW9uID0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLXBvc2luc2V0XCIpO1xuICAgICAgICAgICAgICAgIGxldCBzZXRTaXplID0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLXNldHNpemVcIik7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgaWYgKCFwb3NpdGlvbiB8fCAhc2V0U2l6ZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBDYWxjdWxhdGUgcG9zaXRpb24gYnkgY291bnRpbmcgc2libGluZ3Mgd2l0aCBzYW1lIHJvbGUgdXNpbmcgRE9NV2Fsa2VyIGZvciBzaGFkb3cgRE9NIHN1cHBvcnRcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBvcyA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0b3RhbCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KGVsZW0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJdGVyYXRlIHRocm91Z2ggY2hpbGRyZW4gdG8gY291bnQgdHJlZWl0ZW1zXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2hpbGQgPSBET01XYWxrZXIuZmlyc3RDaGlsZE5vdE93bmVkQnlTbG90KHBhcmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoY2hpbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGQubm9kZVR5cGUgPT09IDEpIHsgLy8gRWxlbWVudCBub2RlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkRWxlbSA9IGNoaWxkIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKGNoaWxkRWxlbSkgPT09IFwidHJlZWl0ZW1cIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWwrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZEVsZW0gPT09IGVsZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3MgPSB0b3RhbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZCA9IGNoaWxkLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIHNldFNpemUgPSB0b3RhbC50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBhbm5vdW5jZW1lbnQgKz0gYCwgJHtwb3NpdGlvbn0gb2YgJHtzZXRTaXplfV0gYDtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICByZXR1cm4gYW5ub3VuY2VtZW50O1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBIVE1MIEVsZW1lbnQgcnVsZXNcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW10sXG4gICAgICAgIGVsZW1zOiBbXCJCT0RZXCJdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInRhYl9mb2N1c1wiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgdGl0bGVTdHIgPSBjdXJzb3IuZ2V0Tm9kZSgpLm93bmVyRG9jdW1lbnQudGl0bGU7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGN1cnNvci5pc0VuZFRhZygpID8gYFtFbmQgb2YgZG9jdW1lbnQke3RpdGxlU3RyLnRyaW0oKS5sZW5ndGggPiAwID8gXCI6IFwiICsgdGl0bGVTdHIudHJpbSgpIDogXCJcIn1dYCA6IGBbU3RhcnQgb2YgZG9jdW1lbnQke3RpdGxlU3RyLnRyaW0oKS5sZW5ndGggPiAwID8gXCI6IFwiICsgdGl0bGVTdHIudHJpbSgpIDogXCJcIn1dYFxuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW10sXG4gICAgICAgIGVsZW1zOiBbXCJJRlJBTUVcIl0sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwidGFiX2ZvY3VzXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBhY2Nlc3NXYXJuaW5nID0gY2FuQWNjZXNzRnJhbWUoY3Vyc29yLmdldE5vZGUoKSkgPyBcIlwiIDogXCJ7RW11bGF0b3IgdW5hYmxlIHRvIGFjY2VzcyBmcmFtZX1cIlxuICAgICAgICAgICAgICAgIHJldHVybiBjdXJzb3IuaXNFbmRUYWcoKSA/IFwiXCIgOiBhY2Nlc3NXYXJuaW5nO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW10sXG4gICAgICAgIGVsZW1zOiBbXCJCUlwiXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB3YWxrID0gY3Vyc29yLmNsb25lKCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIFdhbGsgdW50aWwgd2UgaGl0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBhZ2UsIGZpbmQgYW5vdGhlciBCUiwgb3IgZmluZCBzb21ldGhpbmcgd2l0aCBhIG5hbWVcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHdhbGsucHJldmlvdXMoKCkgPT4gdHJ1ZSkgJiYgd2Fsay5nZXROb2RlKCkubm9kZU5hbWUudG9VcHBlckNhc2UoKSAhPT0gXCJCUlwiICYmIHdhbGsuZ2V0TmFtZUluZm8oKSAmJiB3YWxrLmdldE5hbWVJbmZvKCkubmFtZS50cmltKCkubGVuZ3RoID09PSAwKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdhbGsuZ2V0Tm9kZSgpLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiQlJcIiA/IFwiW2JsYW5rXVwiIDogbnVsbDtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtdLFxuICAgICAgICBlbGVtczogW1wiRExcIl0sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IFwiXCJcbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtdLFxuICAgICAgICBlbGVtczogW1wiSU5QVVRcIl0sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwidGFiX2ZvY3VzXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IsIF9vbGRDdXJzb3I/OiBTUkN1cnNvciwgbW9kZT86IHN0cmluZykgPT4gKGN1cnNvci5pc1N0YXJ0VGFnKCkgJiYgY3Vyc29yLmdldEVsZW1lbnQoKT8uZ2V0QXR0cmlidXRlKFwidHlwZVwiKSA9PT0gXCJwYXNzd29yZFwiICYmIGBbJHtxdW90ZU5hbWVQYWRBZnRlcihjdXJzb3IpfWVkaXQsIHByb3RlY3RlZCR7Z2V0RGVzY3JpYmVkQnlBbm5vdW5jZW1lbnRzKGN1cnNvci5nZXRFbGVtZW50KCksIG1vZGUpfV1gKSB8fCBudWxsLFxuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IsIF9vbGRDdXJzb3I/OiBTUkN1cnNvciwgbW9kZT86IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuaXNTdGFydFRhZygpICYmIGN1cnNvci5nZXRFbGVtZW50KCk/LmdldEF0dHJpYnV0ZShcInR5cGVcIikgPT09IFwiZmlsZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IChjdXJzb3IuZ2V0RWxlbWVudCgpIGFzIEhUTUxJbnB1dEVsZW1lbnQpPy52YWx1ZSB8fCBcIlwiO1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlID09PSBcIlwiID8gXCJObyBmaWxlIGNob3NlblwiIDogdmFsdWUuc3Vic3RyaW5nKFwiQzpcXFxcZmFrZXBhdGhcXFxcXCIubGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBbJHtxdW90ZU5hbWVQYWRBZnRlcihjdXJzb3IpfWJ1dHRvbiR7Z2V0RGVzY3JpYmVkQnlBbm5vdW5jZW1lbnRzKGN1cnNvci5nZXRFbGVtZW50KCksIG1vZGUpfV0gWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX0ke3ZhbHVlfV1gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvciwgX29sZEN1cnNvcj86IFNSQ3Vyc29yLCBtb2RlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5pc1N0YXJ0VGFnKCkgJiYgY3Vyc29yLmdldEVsZW1lbnQoKT8uZ2V0QXR0cmlidXRlKFwidHlwZVwiKSA9PT0gXCJjb2xvclwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IChjdXJzb3IuZ2V0RWxlbWVudCgpIGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByID0gKE51bWJlcihgMHgke3ZhbC5zdWJzdHJpbmcoMSwgMyl9YCkgKiAxMDAuMCAvIE51bWJlcihcIjB4ZmZcIikpLnRvRml4ZWQoMCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGcgPSAoTnVtYmVyKGAweCR7dmFsLnN1YnN0cmluZygzLCA1KX1gKSAqIDEwMC4wIC8gTnVtYmVyKFwiMHhmZlwiKSkudG9GaXhlZCgwKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYiA9IChOdW1iZXIoYDB4JHt2YWwuc3Vic3RyaW5nKDUpfWApICogMTAwLjAgLyBOdW1iZXIoXCIweGZmXCIpKS50b0ZpeGVkKDApO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFske3F1b3RlTmFtZVBhZEFmdGVyKGN1cnNvcil9Y2xpY2thYmxlJHtnZXREZXNjcmliZWRCeUFubm91bmNlbWVudHMoY3Vyc29yLmdldEVsZW1lbnQoKSwgbW9kZSl9XSBbJHtyfSUgcmVkICR7Z30lIGdyZWVuICR7Yn0lIGJsdWVdYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IsIF9vbGRDdXJzb3I/OiBTUkN1cnNvciwgbW9kZT86IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuaXNTdGFydFRhZygpICYmIGN1cnNvci5nZXRFbGVtZW50KCk/LmdldEF0dHJpYnV0ZShcInR5cGVcIikgPT09IFwibW9udGhcIikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSAoY3Vyc29yLmdldEVsZW1lbnQoKSBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHkgPSBcIjBcIjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG0gPSBcIjBcIjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbC50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGUgPSBuZXcgRGF0ZSh2YWwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgeSA9IFwiXCIgKyBkYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBtID0gXCJcIiArIChkYXRlLmdldE1vbnRoKCkgKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFske3F1b3RlTmFtZVBhZEFmdGVyKGN1cnNvcil9Y2xpY2thYmxlJHtnZXREZXNjcmliZWRCeUFubm91bmNlbWVudHMoY3Vyc29yLmdldEVsZW1lbnQoKSwgbW9kZSl9XSBbc3BpbiBidXR0b24sICR7bX1dIFtzcGluIGJ1dHRvbiwgJHt5fV0gW21lbnUgYnV0dG9uXSBbc3ViTWVudV0gU2hvdyBtb250aCBwaWNrZXJgO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvciwgX29sZEN1cnNvcj86IFNSQ3Vyc29yLCBtb2RlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5pc1N0YXJ0VGFnKCkgJiYgY3Vyc29yLmdldEVsZW1lbnQoKT8uZ2V0QXR0cmlidXRlKFwidHlwZVwiKSA9PT0gXCJkYXRlXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsID0gKGN1cnNvci5nZXRFbGVtZW50KCkgYXMgSFRNTElucHV0RWxlbWVudCkudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGxldCB5ID0gXCIwXCI7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtID0gXCIwXCI7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkYXkgPSBcIjBcIjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbC50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGUgPSBuZXcgRGF0ZSh2YWwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgeSA9IFwiXCIgKyBkYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBtID0gXCJcIiArIChkYXRlLmdldE1vbnRoKCkgKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRheSA9IFwiXCIgKyAoZGF0ZS5nZXREYXRlKCkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX1jbGlja2FibGUke2dldERlc2NyaWJlZEJ5QW5ub3VuY2VtZW50cyhjdXJzb3IuZ2V0RWxlbWVudCgpLCBtb2RlKX1dIFtzcGluIGJ1dHRvbiwgJHttfV0gLyBbc3BpbiBidXR0b24sICR7ZGF5fV0gLyBbc3BpbiBidXR0b24sICR7eX1dIFttZW51IGJ1dHRvbl0gW3N1Yk1lbnVdIFNob3cgZGF0ZSBwaWNrZXJgO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvciwgX29sZEN1cnNvcj86IFNSQ3Vyc29yLCBtb2RlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5pc1N0YXJ0VGFnKCkgJiYgY3Vyc29yLmdldEVsZW1lbnQoKT8uZ2V0QXR0cmlidXRlKFwidHlwZVwiKSA9PT0gXCJkYXRldGltZS1sb2NhbFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IChjdXJzb3IuZ2V0RWxlbWVudCgpIGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbHVlOyAvLyAyMDI1LTA5LTEyVDA0OjIwXG4gICAgICAgICAgICAgICAgICAgIGxldCB5ID0gXCIwXCI7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtID0gXCIwXCI7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkYXkgPSBcIjBcIjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGhvdXIgPSBcIjBcIjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1pbiA9IFwiMFwiO1xuICAgICAgICAgICAgICAgICAgICBsZXQgYW1wbSA9IFwiMFwiO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGF0ZSA9IG5ldyBEYXRlKHZhbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB5ID0gXCJcIiArIGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG0gPSBcIlwiICsgKGRhdGUuZ2V0TW9udGgoKSArIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF5ID0gXCJcIiArIChkYXRlLmdldERhdGUoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0ZS5nZXRIb3VycygpID09PSAwIHx8IGRhdGUuZ2V0SG91cnMoKSA9PT0gMTIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3VyID0gXCIxMlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRlLmdldEhvdXJzKCkgPCAxMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvdXIgPSBcIlwiICsgZGF0ZS5nZXRIb3VycygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3VyID0gXCJcIiArIChkYXRlLmdldEhvdXJzKCkgLSAxMik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBtaW4gPSBcIlwiICsgZGF0ZS5nZXRNaW51dGVzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbXBtID0gZGF0ZS5nZXRIb3VycygpID49IDEyID8gXCJwbVwiIDogXCJhbVwiO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX1jbGlja2FibGUke2dldERlc2NyaWJlZEJ5QW5ub3VuY2VtZW50cyhjdXJzb3IuZ2V0RWxlbWVudCgpLCBtb2RlKX1dIFtzcGluIGJ1dHRvbiwgJHttfV0gLyBbc3BpbiBidXR0b24sICR7ZGF5fV0gLyBbc3BpbiBidXR0b24sICR7eX1dIFtzcGluIGJ1dHRvbiwgJHtob3VyfV0gOiBbc3BpbiBidXR0b24sICR7bWlufV0gW3NwaW4gYnV0dG9uLCAke2FtcG19XSAgW21lbnUgYnV0dG9uXSBbc3ViTWVudV0gU2hvdyBsb2NhbCBkYXRlIGFuZCB0aW1lIHBpY2tlcmA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yLCBfb2xkQ3Vyc29yPzogU1JDdXJzb3IsIG1vZGU/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmlzU3RhcnRUYWcoKSAmJiBjdXJzb3IuZ2V0RWxlbWVudCgpPy5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpID09PSBcInRpbWVcIikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSAoY3Vyc29yLmdldEVsZW1lbnQoKSBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZTsgLy8gMjAyNS0wOS0xMlQwNDoyMFxuICAgICAgICAgICAgICAgICAgICBsZXQgaG91ciA9IFwiMFwiO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWluID0gXCIwXCI7XG4gICAgICAgICAgICAgICAgICAgIGxldCBhbXBtID0gXCIwXCI7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWwudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkYXRlID0gdmFsLnNwbGl0KFwiOlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBob3VycyA9IHBhcnNlSW50KGRhdGVbMF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhvdXJzID09PSAwIHx8IGhvdXJzID09PSAxMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvdXIgPSBcIjEyXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGhvdXJzIDwgMTIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3VyID0gXCJcIiArIGhvdXJzO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3VyID0gXCJcIiArIChob3VycyAtIDEyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbiA9IGRhdGVbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBhbXBtID0gaG91cnMgPj0gMTIgPyBcInBtXCIgOiBcImFtXCI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGBbJHtxdW90ZU5hbWVQYWRBZnRlcihjdXJzb3IpfWdyb3VwaW5nIGNsaWNrYWJsZSR7Z2V0RGVzY3JpYmVkQnlBbm5vdW5jZW1lbnRzKGN1cnNvci5nZXRFbGVtZW50KCksIG1vZGUpfSBbc3BpbiBidXR0b24sICR7aG91cn1dIDogW3NwaW4gYnV0dG9uLCAke21pbn1dIFtzcGluIGJ1dHRvbiwgJHthbXBtfV0gW21lbnUgYnV0dG9uXSBbc3ViTWVudV0gU2hvdyB0aW1lIHBpY2tlciBbb3V0IG9mIGdyb3VwaW5nXWA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yLCBfb2xkQ3Vyc29yPzogU1JDdXJzb3IsIG1vZGU/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmlzU3RhcnRUYWcoKSAmJiBjdXJzb3IuZ2V0RWxlbWVudCgpPy5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpID09PSBcIndlZWtcIikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSAoY3Vyc29yLmdldEVsZW1lbnQoKSBhcyBIVE1MSW5wdXRFbGVtZW50KS52YWx1ZTsgLy8gMjAyNS1XMzhcbiAgICAgICAgICAgICAgICAgICAgbGV0IHllYXIgPSBcIjBcIjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHdlZWsgPSBcIjBcIjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbC50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGUgPSB2YWwuc3BsaXQoLy1XLyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB5ZWFyID0gZGF0ZVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdlZWsgPSBkYXRlWzFdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX1jbGlja2FibGUke2dldERlc2NyaWJlZEJ5QW5ub3VuY2VtZW50cyhjdXJzb3IuZ2V0RWxlbWVudCgpLCBtb2RlKX1dIFtzcGluIGJ1dHRvbiwgJHt3ZWVrfV0sIFtzcGluIGJ1dHRvbiwgJHt5ZWFyfV0gW21lbnUgYnV0dG9uXSBbc3ViTWVudV0gU2hvdyB3ZWVrIHBpY2tlcmA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiBjdXJzb3IuZ2V0RWxlbWVudCgpPy5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpID09PSBcImhpZGRlblwiID8gXCJcIiA6IG51bGwsXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4gKGN1cnNvci5pc1N0YXJ0VGFnKCkgJiYgYCEhWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX1pbnB1dCEhXSR7Y3Vyc29yLmdldEVsZW1lbnQoKS5vdXRlckhUTUx9YCkgfHwgbnVsbFxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW10sXG4gICAgICAgIGVsZW1zOiBbXCJMSVwiXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIGxpc3RpdGVtIGNvbnRhaW5zIGludGVyYWN0aXZlIGVsZW1lbnRzXG4gICAgICAgICAgICAgICAgLy8gU2NyZWVuIHJlYWRlcnMgZG9uJ3QgcmVhZCB0aGUgYWNjZXNzaWJsZSBuYW1lIHdoZW4gaW50ZXJhY3RpdmUgZWxlbWVudHMgYXJlIHByZXNlbnRcbiAgICAgICAgICAgICAgICBjb25zdCBoYXNJbnRlcmFjdGl2ZUNvbnRlbnQgPSBsaXN0aXRlbUNvbnRhaW5zSW50ZXJhY3RpdmVFbGVtZW50KGN1cnNvcik7XG4gICAgICAgICAgICAgICAgY29uc3QgbmFtZVRvVXNlID0gaGFzSW50ZXJhY3RpdmVDb250ZW50ID8gXCJcIiA6IChjdXJzb3IuZ2V0TmFtZUluZm8oKT8ubmFtZSB8fCBcIlwiKTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBjb25zdCBlbGVtID0gY3Vyc29yLmdldEVsZW1lbnQoKTtcbiAgICAgICAgICAgICAgICBpZiAod2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbSkubGlzdFN0eWxlVHlwZSA9PT0gXCJub25lXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGN1cnNvci5pc1N0YXJ0VGFnKCkgPyBgJHtuYW1lVG9Vc2V9YCA6IFwiXCI7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGN1cnNvci5pc1N0YXJ0VGFnKCkgPyBgW2J1bGxldF0gJHtuYW1lVG9Vc2V9YCA6IFwiXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBNYXRoTUwgZWxlbWVudHNcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW10sXG4gICAgICAgIGVsZW1zOiBbXCJNRlJBQ1wiXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4gY3Vyc29yLmlzU3RhcnRUYWcoKSA/IGBbZnJhY3Rpb25dYCA6IGBbZW5kIGZyYWN0aW9uXWBcbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtdLFxuICAgICAgICBlbGVtczogW1wiTVJPV1wiXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIC8vIE9ubHkgYW5ub3VuY2Ugb3ZlciBvbiB0aGUgZW5kIHRhZ1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuaXNTdGFydFRhZygpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGxldCBmcmFjdGlvbiA9IGN1cnNvci5nZXRDdXJyZW50T3JQYXJlbnRCeVJvbGVDbG9uZShbXSwgW1wibWZyYWNcIl0pO1xuICAgICAgICAgICAgICAgIGlmIChmcmFjdGlvbiAmJiBmcmFjdGlvbi5nZXRFbGVtZW50KCkucXVlcnlTZWxlY3RvckFsbChcIm1yb3dcIilbMF0/LmlzU2FtZU5vZGUoY3Vyc29yLmdldE5vZGUoKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiW292ZXJdXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW10sXG4gICAgICAgIGVsZW1zOiBbXCJNU1FSVFwiXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4gY3Vyc29yLmlzU3RhcnRUYWcoKSA/IGBbc3F1YXJlIHJvb3RdYCA6IGBbZW5kIHJvb3RdYFxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW10sXG4gICAgICAgIGVsZW1zOiBbXCJNU1VQXCJdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5pc0VuZFRhZygpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1pID0gY3Vyc29yLmdldEVsZW1lbnQoKS5xdWVyeVNlbGVjdG9yKFwibWlcIik/LmlubmVySFRNTCB8fCBcIlwiO1xuICAgICAgICAgICAgICAgIGNvbnN0IG1uID0gY3Vyc29yLmdldEVsZW1lbnQoKS5xdWVyeVNlbGVjdG9yKFwibW5cIik/LmlubmVySFRNTCB8fCBcIlwiO1xuICAgICAgICAgICAgICAgIGlmIChtbiA9PT0gXCIyXCIpIHJldHVybiBgJHttaX0gW3NxdWFyZWRdYDtcbiAgICAgICAgICAgICAgICBpZiAobW4gPT09IFwiM1wiKSByZXR1cm4gYCR7bWl9IFtjdWJlZF1gO1xuICAgICAgICAgICAgICAgIHJldHVybiBgJHttaX0gW3RvIHRoZSAke21ufV1gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBNdWx0aXBsZSByb2xlcyBydWxlcyAtIHBsYWNlZCBhdCB0aGUgYm90dG9tXG4gICAgXG4gICAgLy8gRGVmYXVsdCBtb2RlIHJ1bGVzIC0gQ29udGFpbmVyIGVsZW1lbnRzIChtdWx0aXBsZSByb2xlcylcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiYXJ0aWNsZVwiLCBcImJhbm5lclwiLCBcImJsb2NrcXVvdGVcIiwgXCJjYXB0aW9uXCIsIFwiY2VsbFwiLCBcImNvZGVcIiwgXCJjb2x1bW5oZWFkZXJcIixcbiAgICAgICAgICAgIFwiY29tcGxlbWVudGFyeVwiLCBcImNvbnRlbnRpbmZvXCIsIFwiZmlndXJlXCIsIFwiZm9ybVwiLCBcImdyb3VwXCIsIFwibGlzdFwiLCBcIm1haW5cIixcbiAgICAgICAgICAgIFwibWFya1wiLCBcIm5hdmlnYXRpb25cIiwgXCJyZWdpb25cIiwgXCJyb3dcIiwgXCJyb3doZWFkZXJcIiwgXCJzZWFyY2hcIiwgXCJ0YWJsZVwiLCBcInRvb2xiYXJcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4gXCJcIlxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBEZWZhdWx0IG1vZGUgcnVsZXMgLSBFbGVtZW50cyB0aGF0IHNjcmVlbiByZWFkZXJzIHR5cGljYWxseSBpZ25vcmUgKG11bHRpcGxlIHJvbGVzKVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJwYXJhZ3JhcGhcIiwgXCJyb3dncm91cFwiLCBcInN0YXR1c1wiLCBcInN0cm9uZ1wiLCBcInN1YnNjcmlwdFwiLCBcInN1cGVyc2NyaXB0XCIsXG4gICAgICAgICAgICBcInRlcm1cIiwgXCJ0aW1lXCIsIFwibm9uZVwiLCBcInByZXNlbnRhdGlvblwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiBcIlwiXG4gICAgICAgIF1cbiAgICB9KSxcbl1cbiIsImltcG9ydCB7IFNSUmVuZGVyZXJSdWxlIH0gZnJvbSBcIi4uL1NSUmVuZGVyZXJSdWxlXCI7XG5pbXBvcnQgeyBTUkN1cnNvciB9IGZyb20gXCIuLi9TUkN1cnNvclwiO1xuaW1wb3J0IHsgU1JUYWJsZVV0aWwgfSBmcm9tIFwiLi4vU1JUYWJsZVV0aWxcIjtcbmltcG9ydCB7IHF1b3RlTmFtZVBhZEFmdGVyLCBxdW90ZU5hbWVQYWRCZWZvcmUsIGdldFJvbGVEZXNjcmlwdGlvbiB9IGZyb20gXCIuL2NvbW1vblwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi4vLi4vdXRpbC9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgQVJJQURlZmluaXRpb25zIH0gZnJvbSBcIi4uLy4uLy4uL3YyL2FyaWEvQVJJQURlZmluaXRpb25zXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4uLy4uL3V0aWwvQ29tbW9uVXRpbFwiO1xuXG4vKipcbiAqIEdlbmVyYXRlcyB0aGUgYW5ub3VuY2VtZW50IHRleHQgd2hlbiBlbnRlcmluZyBhIHRhYmxlIGNlbGxcbiAqL1xuZnVuY3Rpb24gcmVuZGVyRW50ZXJUYWJsZUNlbGwobmV3Q3Vyc29yOiBTUkN1cnNvciwgb2xkQ3Vyc29yOiBTUkN1cnNvcikge1xuICAgIC8vIFdlIHNlZW0gdG8gYmUgYXQgdGhlIG5ld2xpbmUgdGV4dCBub2RlIGFmdGVyIHRoZSBjZWxsXG4gICAgaWYgKG9sZEN1cnNvciAmJiBvbGRDdXJzb3IuZ2V0Tm9kZSgpPy5ub2RlTmFtZSA9PT0gXCIjdGV4dFwiKSB7XG4gICAgICAgIG9sZEN1cnNvciA9IG9sZEN1cnNvci5jbG9uZSgpO1xuICAgICAgICBvbGRDdXJzb3IucHJldmlvdXMoKCkgPT4gdHJ1ZSlcbiAgICB9XG4gICAgY29uc3QgbmV3VGFibGVNb2RlbCA9IFNSVGFibGVVdGlsLmdldFRhYmxlTW9kZWwobmV3Q3Vyc29yKTtcbiAgICBjb25zdCBvbGRDZWxsSW5mbyA9IFNSVGFibGVVdGlsLmdldENlbGxNb2RlbChvbGRDdXJzb3IsIG5ld1RhYmxlTW9kZWwpO1xuICAgIGNvbnN0IG5ld0NlbGxJbmZvID0gU1JUYWJsZVV0aWwuZ2V0Q2VsbE1vZGVsKG5ld0N1cnNvciwgbmV3VGFibGVNb2RlbCk7XG4gICAgaWYgKCFuZXdDZWxsSW5mbykgcmV0dXJuIFwiXCI7XG4gICAgbGV0IHJldFZhbDogc3RyaW5nW10gPSBbXTtcblxuICAgIC8vIEFubm91bmNlIHJvdyBpbmZvcm1hdGlvbiBpZiB3ZSd2ZSBtb3ZlZCB0byBhIGRpZmZlcmVudCByb3cgb3IgdGhlIHJvd3NwYW4gaGFzIGNoYW5nZWRcbiAgICBpZiAoIW9sZENlbGxJbmZvIHx8IG9sZENlbGxJbmZvLnJvd0luZGV4U3RhcnQgIT09IG5ld0NlbGxJbmZvLnJvd0luZGV4U3RhcnQgfHwgb2xkQ2VsbEluZm8ucm93c3BhbiAhPT0gbmV3Q2VsbEluZm8ucm93c3Bhbikge1xuICAgICAgICAvLyBJZiBhIGNoYW5nZSBpbiByb3cgb3IgYSBjaGFuZ2UgaW4gcm93U3BhblxuICAgICAgICBsZXQgcm93SGVhZGVycyA9IFNSVGFibGVVdGlsLmdldFJvd0hlYWRlcnNGb3JDdXJzb3IobmV3Q3Vyc29yLCBuZXdUYWJsZU1vZGVsKTtcbiAgICAgICAgbGV0IGhlYWRlckluZm9TdHIgPSByb3dIZWFkZXJzICYmIHJvd0hlYWRlcnMudHJpbSgpLmxlbmd0aCA+IDAgPyBgXCIke3Jvd0hlYWRlcnN9XCIsIGAgOiBcIlwiO1xuICAgICAgICByZXRWYWwucHVzaChgWyR7aGVhZGVySW5mb1N0cn1yb3cgJHsobmV3Q2VsbEluZm8ucm93SW5kZXhTdGFydCsxKX0ke25ld0NlbGxJbmZvLnJvd3NwYW4gPiAxID8gXCIgdGhyb3VnaCBcIiArIChuZXdDZWxsSW5mby5yb3dJbmRleFN0YXJ0K25ld0NlbGxJbmZvLnJvd3NwYW4pIDogXCJcIn1dYCk7XG4gICAgfVxuXG4gICAgLy8gQW5ub3VuY2UgY29sdW1uIGluZm9ybWF0aW9uIGlmIHdlJ3ZlIG1vdmVkIHRvIGEgZGlmZmVyZW50IGNvbHVtbiBvciB0aGUgY29sc3BhbiBoYXMgY2hhbmdlZFxuICAgIGlmICghb2xkQ2VsbEluZm8gfHwgb2xkQ2VsbEluZm8uY29sSW5kZXhTdGFydCAhPT0gbmV3Q2VsbEluZm8uY29sSW5kZXhTdGFydCB8fCBvbGRDZWxsSW5mby5jb2xzcGFuICE9PSBuZXdDZWxsSW5mby5jb2xzcGFuKSB7XG4gICAgICAgIC8vIElmIGEgY2hhbmdlIGluIGNvbHVtbiBvciBhIGNoYW5nZSBpbiBjb2xzcGFuXG4gICAgICAgIGxldCBjb2x1bW5IZWFkZXJzID0gU1JUYWJsZVV0aWwuZ2V0Q29sdW1uSGVhZGVyc0ZvckN1cnNvcihuZXdDdXJzb3IsIG5ld1RhYmxlTW9kZWwpO1xuICAgICAgICBsZXQgaGVhZGVySW5mb1N0ciA9IGNvbHVtbkhlYWRlcnMgJiYgY29sdW1uSGVhZGVycy50cmltKCkubGVuZ3RoID4gMCA/IGBcIiR7Y29sdW1uSGVhZGVyc31cIiwgYCA6IFwiXCI7XG4gICAgICAgIHJldFZhbC5wdXNoKGBbJHtoZWFkZXJJbmZvU3RyfWNvbHVtbiAkeyhuZXdDZWxsSW5mby5jb2xJbmRleFN0YXJ0KzEpfSR7bmV3Q2VsbEluZm8uY29sc3BhbiA+IDEgPyBcIiB0aHJvdWdoIFwiICsgKG5ld0NlbGxJbmZvLmNvbEluZGV4U3RhcnQrbmV3Q2VsbEluZm8uY29sc3BhbikgOiBcIlwifV1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmV0VmFsLmpvaW4oXCIgXCIpO1xufVxuXG5leHBvcnQgbGV0IFJVTEVTOiBTUlJlbmRlcmVyUnVsZVtdID0gW1xuICAgIC8vIFNpbmdsZSByb2xlIHJ1bGVzIC0gYWxwaGFiZXRpY2FsbHkgc29ydGVkXG5cbiAgICAvLyBBcnRpY2xlIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiYXJ0aWNsZVwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcImFydGljbGVcIiwgXCJ0YWJfZm9jdXNcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvciwgX29sZEN1cnNvcj86IFNSQ3Vyc29yLCBtb2RlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG1vZGUgPT09IFwidGFiX2ZvY3VzXCIgJiYgIUNvbW1vblV0aWwuaXNUYWJiYWJsZShjdXJzb3IuZ2V0Tm9kZSgpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm9sZURlc2MgPSBnZXRSb2xlRGVzY3JpcHRpb24oY3Vyc29yLCBcImFydGljbGVcIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBbJHtxdW90ZU5hbWVQYWRBZnRlcihjdXJzb3IpfSR7cm9sZURlc2N9XWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIEJhbm5lciByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImJhbm5lclwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInJlZ2lvblwiLCBcInRhYl9mb2N1c1wiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yLCBfb2xkQ3Vyc29yPzogU1JDdXJzb3IsIG1vZGU/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gXCJ0YWJfZm9jdXNcIiAmJiAhQ29tbW9uVXRpbC5pc1RhYmJhYmxlKGN1cnNvci5nZXROb2RlKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICBjb25zdCByb2xlRGVzYyA9IGdldFJvbGVEZXNjcmlwdGlvbihjdXJzb3IsIFwiYmFubmVyIHJlZ2lvblwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYFske3F1b3RlTmFtZVBhZEFmdGVyKGN1cnNvcil9JHtyb2xlRGVzY31dYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gQmxvY2txdW90ZSByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImJsb2NrcXVvdGVcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJyZWdpb25cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoX2N1cnNvcjogU1JDdXJzb3IpID0+IFwiW2Jsb2NrcXVvdGVdXCJcbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gQ2FwdGlvbiByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImNhcHRpb25cIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJyZWdpb25cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoX2N1cnNvcjogU1JDdXJzb3IpID0+IFwiW2NhcHRpb25dXCJcbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gQ2VsbCByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImNlbGxcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJ0YWJsZVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIHJlbmRlckVudGVyVGFibGVDZWxsXG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIENvbHVtbmhlYWRlciByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImNvbHVtbmhlYWRlclwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInRhYmxlXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgcmVuZGVyRW50ZXJUYWJsZUNlbGxcbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gQ29tcGxlbWVudGFyeSByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImNvbXBsZW1lbnRhcnlcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJyZWdpb25cIiwgXCJ0YWJfZm9jdXNcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvciwgX29sZEN1cnNvcj86IFNSQ3Vyc29yLCBtb2RlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG1vZGUgPT09IFwidGFiX2ZvY3VzXCIgJiYgIUNvbW1vblV0aWwuaXNUYWJiYWJsZShjdXJzb3IuZ2V0Tm9kZSgpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBbJHtxdW90ZU5hbWVQYWRBZnRlcihjdXJzb3IpfWNvbXBsZW1lbnRhcnkgcmVnaW9uXWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIENvbnRlbnRpbmZvIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiY29udGVudGluZm9cIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJyZWdpb25cIiwgXCJ0YWJfZm9jdXNcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvciwgX29sZEN1cnNvcj86IFNSQ3Vyc29yLCBtb2RlPzogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG1vZGUgPT09IFwidGFiX2ZvY3VzXCIgJiYgIUNvbW1vblV0aWwuaXNUYWJiYWJsZShjdXJzb3IuZ2V0Tm9kZSgpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBbJHtxdW90ZU5hbWVQYWRBZnRlcihjdXJzb3IpfWNvbnRlbnQgaW5mbyByZWdpb25dYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gRmlndXJlIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiZmlndXJlXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwicmVnaW9uXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKF9jdXJzb3I6IFNSQ3Vyc29yKSA9PiBcIltmaWd1cmVdXCJcbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gRm9ybSByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImZvcm1cIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJyZWdpb25cIiwgXCJmb3JtY29udHJvbFwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5nZXROYW1lSW5mbygpID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIltzZWN0aW9uXVwiO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX1mb3JtIHJlZ2lvbl1gXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBHcm91cCByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImdyb3VwXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwicmVnaW9uXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmdldE5hbWVJbmZvKCkgPT09IG51bGwpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuZ2V0Q3VycmVudE9yUGFyZW50QnlSb2xlQ2xvbmUoW1wiY29tYm9ib3hcIl0sIFtcInNlbGVjdFwiXSk/LmdldE5vZGUoKS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIlNFTEVDVFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmdldE5vZGUoKS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIkRFVEFJTFNcIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFtidXR0b24sICR7Y3Vyc29yLmdldEVsZW1lbnQoKS5oYXNBdHRyaWJ1dGUoXCJvcGVuXCIpID8gXCJleHBhbmRlZFwiOiBcImNvbGxhcHNlZFwifV1gO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgW2dyb3VwaW5nJHtxdW90ZU5hbWVQYWRCZWZvcmUoY3Vyc29yKX1dYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIC0tIHRhYl9mb2N1c1xuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJncm91cFwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1widGFiX2ZvY3VzXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmdldE5hbWVJbmZvKCkgPT09IG51bGwpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuZ2V0Q3VycmVudE9yUGFyZW50QnlSb2xlQ2xvbmUoW1wiY29tYm9ib3hcIl0sIFtcInNlbGVjdFwiXSk/LmdldE5vZGUoKS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIlNFTEVDVFwiKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmdldE5vZGUoKS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIkRFVEFJTFNcIikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYFtidXR0b24sICR7Y3Vyc29yLmdldEVsZW1lbnQoKS5oYXNBdHRyaWJ1dGUoXCJvcGVuXCIpID8gXCJleHBhbmRlZFwiOiBcImNvbGxhcHNlZFwifV1gO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIExpc3Qgcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJsaXN0XCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwibGlzdFwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgbm9kZSA9IGN1cnNvci5nZXROb2RlKCkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVzY2VuZGFudExpc3RJdGVtcyA9IGRvY3VtZW50LmV2YWx1YXRlKFwiLi8vbGkgfCAuLy8qW0Byb2xlPSdsaXN0aXRlbSddXCIsIG5vZGUsIG51bGwsIFhQYXRoUmVzdWx0Lk9SREVSRURfTk9ERV9TTkFQU0hPVF9UWVBFLCBudWxsKTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAvLyBDb3VudCBpdGVtcywgZXhjbHVkaW5nIHRob3NlIGluIG90aGVyIGxpc3RzIG9yIHdpdGhpbiBwcmVzZW50YXRpb25hbCBjb250YWluZXJzXG4gICAgICAgICAgICAgICAgbGV0IG51bUl0ZW1zID0gMDtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRlc2NlbmRhbnRMaXN0SXRlbXMuc25hcHNob3RMZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gZGVzY2VuZGFudExpc3RJdGVtcy5zbmFwc2hvdEl0ZW0oaSkgYXMgSFRNTEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAvLyBXYWxrIHVwIGFuY2VzdG9ycyB0byBjaGVjayBmb3IgYm90aCBuZXN0ZWQgbGlzdHMgYW5kIHByZXNlbnRhdGlvbmFsIGNvbnRhaW5lcnNcbiAgICAgICAgICAgICAgICAgICAgbGV0IGlzSW5PdGhlckxpc3QgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGhhc1ByZXNlbnRhdGlvbmFsQW5jZXN0b3IgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFuY2VzdG9yID0gaXRlbS5wYXJlbnRFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGFuY2VzdG9yICYmIGFuY2VzdG9yICE9PSBub2RlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiBhbmNlc3RvciBpcyBhbm90aGVyIGxpc3RcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFuY2VzdG9yUm9sZSA9IEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZShhbmNlc3Rvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYW5jZXN0b3JSb2xlID09PSBcImxpc3RcIiB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2VzdG9yLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiVUxcIiB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2VzdG9yLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiT0xcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzSW5PdGhlckxpc3QgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiBhbmNlc3RvciBoYXMgcHJlc2VudGF0aW9uYWwgY2hpbGRyZW5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbmNlc3RvclJvbGUgJiYgQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW2FuY2VzdG9yUm9sZV0/LnByZXNlbnRhdGlvbmFsQ2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNQcmVzZW50YXRpb25hbEFuY2VzdG9yID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgYW5jZXN0b3IgPSBhbmNlc3Rvci5wYXJlbnRFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBpZiAoIWlzSW5PdGhlckxpc3QgJiYgIWhhc1ByZXNlbnRhdGlvbmFsQW5jZXN0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG51bUl0ZW1zKys7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgaWYgKG51bUl0ZW1zID09PSAwKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICByZXR1cm4gYFske3F1b3RlTmFtZVBhZEFmdGVyKGN1cnNvcil9bGlzdCBvZiAke251bUl0ZW1zfSBpdGVtc11gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBNYWluIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wibWFpblwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInJlZ2lvblwiLCBcInRhYl9mb2N1c1wiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yLCBfb2xkQ3Vyc29yPzogU1JDdXJzb3IsIG1vZGU/OiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gXCJ0YWJfZm9jdXNcIiAmJiAhQ29tbW9uVXRpbC5pc1RhYmJhYmxlKGN1cnNvci5nZXROb2RlKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICByZXR1cm4gYFske3F1b3RlTmFtZVBhZEFmdGVyKGN1cnNvcil9bWFpbiByZWdpb25dYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gbWVudWJhciByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcIm1lbnViYXJcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIiwgXCJsaXN0XCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBub2RlID0gY3Vyc29yLmdldE5vZGUoKSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgICAgICAgICBjb25zdCBkZXNjZW5kYW50TGlzdEl0ZW1zID0gZG9jdW1lbnQuZXZhbHVhdGUoXCIuLy8qW0Byb2xlPSdtZW51aXRlbSddXCIsIG5vZGUsIG51bGwsIFhQYXRoUmVzdWx0Lk9SREVSRURfTk9ERV9TTkFQU0hPVF9UWVBFLCBudWxsKTtcbiAgICAgICAgICAgICAgICBjb25zdCBkZXNjZW5kYW50TGlzdEl0ZW1zSW5PdGhlckxpc3RzID0gZG9jdW1lbnQuZXZhbHVhdGUoXG4gICAgICAgICAgICAgICAgICAgIFwiLi8vKltAcm9sZT0nbWVudWJhciddLy8qW0Byb2xlPSdtZW51aXRlbSddfC4vLypbQHJvbGU9J21lbnUnXS8vKltAcm9sZT0nbWVudWl0ZW0nXVwiLFxuICAgICAgICAgICAgICAgICAgICBub2RlLCBudWxsLCBYUGF0aFJlc3VsdC5PUkRFUkVEX05PREVfU05BUFNIT1RfVFlQRSwgbnVsbCk7XG4gICAgICAgICAgICAgICAgLy8gY29uc3QgZGVzY2VuZGFudENvbnRhaW5lcnMgPSBkb2N1bWVudC5ldmFsdWF0ZShcIi4vLypbQHJvbGU9J21lbnVpdGVtJ10vKltAcm9sZT0nbWVudSddXCIsIG5vZGUsIG51bGwsIFhQYXRoUmVzdWx0Lk9SREVSRURfTk9ERV9TTkFQU0hPVF9UWVBFLCBudWxsKTtcbiAgICAgICAgICAgICAgICAvLyBjb25zdCBkZXNjZW5kYW50Q29udGFpbmVyczIgPSBkb2N1bWVudC5ldmFsdWF0ZShcIi4vLypbQHJvbGU9J21lbnViYXInXS8vKltAcm9sZT0nbWVudWl0ZW0nXS8qW0Byb2xlPSdtZW51J118Li8vKltAcm9sZT0nbWVudSddLy8qW0Byb2xlPSdtZW51aXRlbSddLypbQHJvbGU9J21lbnUnXVwiLCBub2RlLCBudWxsLCBYUGF0aFJlc3VsdC5PUkRFUkVEX05PREVfU05BUFNIT1RfVFlQRSwgbnVsbCk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJNRU5VQkFSXCIsIGN1cnNvci5pc0VuZFRhZygpP1wiL1wiOlwiXCIsIGN1cnNvci5nZXROb2RlKCkpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGRlc2NlbmRhbnRMaXN0SXRlbXMsIGRlc2NlbmRhbnRMaXN0SXRlbXNJbk90aGVyTGlzdHMpOy8vLCBkZXNjZW5kYW50Q29udGFpbmVycywgZGVzY2VuZGFudENvbnRhaW5lcnMyKVxuICAgICAgICAgICAgICAgIGxldCBudW1JdGVtcyA9IGRlc2NlbmRhbnRMaXN0SXRlbXMuc25hcHNob3RMZW5ndGgtZGVzY2VuZGFudExpc3RJdGVtc0luT3RoZXJMaXN0cy5zbmFwc2hvdExlbmd0aDsvLy1kZXNjZW5kYW50Q29udGFpbmVycy5zbmFwc2hvdExlbmd0aCtkZXNjZW5kYW50Q29udGFpbmVyczIuc25hcHNob3RMZW5ndGg7XG4gICAgICAgICAgICAgICAgaWYgKG51bUl0ZW1zID09PSAwKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICByZXR1cm4gYFske3F1b3RlTmFtZVBhZEFmdGVyKGN1cnNvcil9bWVudWJhciB3aXRoICR7bnVtSXRlbXN9IGl0ZW1zXWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIE5hdmlnYXRpb24gcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJuYXZpZ2F0aW9uXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwicmVnaW9uXCIsIFwidGFiX2ZvY3VzXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IsIF9vbGRDdXJzb3I/OiBTUkN1cnNvciwgbW9kZT86IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChtb2RlID09PSBcInRhYl9mb2N1c1wiICYmICFDb21tb25VdGlsLmlzVGFiYmFibGUoY3Vyc29yLmdldE5vZGUoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvbGVEZXNjID0gZ2V0Um9sZURlc2NyaXB0aW9uKGN1cnNvciwgXCJuYXZpZ2F0aW9uIHJlZ2lvblwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYFske3F1b3RlTmFtZVBhZEFmdGVyKGN1cnNvcil9JHtyb2xlRGVzY31dYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gUmFkaW8gZ3JvdXAgcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJyYWRpb2dyb3VwXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwicmVnaW9uXCIsIFwidGFiX2ZvY3VzXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmdldE5hbWVJbmZvKCkgPT09IG51bGwpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIHJldHVybiBgW2dyb3VwaW5nJHtxdW90ZU5hbWVQYWRCZWZvcmUoY3Vyc29yKX1dYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gUmVnaW9uIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wicmVnaW9uXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwicmVnaW9uXCIsIFwidGFiX2ZvY3VzXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IsIF9vbGRDdXJzb3I/OiBTUkN1cnNvciwgbW9kZT86IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuZ2V0TmFtZUluZm8oKSA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKG1vZGUgPT09IFwidGFiX2ZvY3VzXCIgJiYgIUNvbW1vblV0aWwuaXNUYWJiYWJsZShjdXJzb3IuZ2V0Tm9kZSgpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm9sZURlc2MgPSBnZXRSb2xlRGVzY3JpcHRpb24oY3Vyc29yLCBcInJlZ2lvblwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYFske3F1b3RlTmFtZVBhZEFmdGVyKGN1cnNvcil9JHtyb2xlRGVzY31dYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gUm93IHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wicm93XCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwidGFibGVcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoKSA9PiBcIlwiXG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIFJvd2hlYWRlciByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcInJvd2hlYWRlclwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInRhYmxlXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgcmVuZGVyRW50ZXJUYWJsZUNlbGxcbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gU2VhcmNoIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wic2VhcmNoXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwicmVnaW9uXCIsIFwidGFiX2ZvY3VzXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IsIF9vbGRDdXJzb3I/OiBTUkN1cnNvciwgbW9kZT86IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChtb2RlID09PSBcInRhYl9mb2N1c1wiICYmICFDb21tb25VdGlsLmlzVGFiYmFibGUoY3Vyc29yLmdldE5vZGUoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvbGVEZXNjID0gZ2V0Um9sZURlc2NyaXB0aW9uKGN1cnNvciwgXCJzZWFyY2ggcmVnaW9uXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX0ke3JvbGVEZXNjfV1gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBUYWJsZSByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcInRhYmxlXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwidGFibGVcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIGxldCB0YWJsZVdhbGtlciA9IGN1cnNvci5jbG9uZSgpO1xuICAgICAgICAgICAgICAgIC8vIEdldCB0byB0aGUgc3RhcnQgb2YgdGhlIHRhYmxlXG4gICAgICAgICAgICAgICAgd2hpbGUgKHRhYmxlV2Fsa2VyLmdldFJvbGUoKSAhPT0gXCJ0YWJsZVwiICYmIHRhYmxlV2Fsa2VyLnByZXZpb3VzKCgpID0+IHRydWUpKTtcbiAgICAgICAgICAgICAgICAvLyBTZXQgYW4gZW5kIHRvIHRoZSB0YWJsZVxuICAgICAgICAgICAgICAgIGxldCB0YWJsZU5vZGUgPSB0YWJsZVdhbGtlci5nZXROb2RlKCk7XG4gICAgICAgICAgICAgICAgbGV0IHJvd3MgPSAwO1xuICAgICAgICAgICAgICAgIGxldCBjb2xzID0gMDtcbiAgICAgICAgICAgICAgICAvLyBTYW5pdHkgY2hlY2sgdGhhdCB0aGUgdGFibGUgaGFzIGNvbnRlbnRcbiAgICAgICAgICAgICAgICBpZiAodGFibGVXYWxrZXIuZ2V0Tm9kZSgpLmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZpcnN0Um93Q29tcGxldGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRhYmxlV2Fsa2VyLm5leHQoKCkgPT4gdHJ1ZSkgJiYgIXRhYmxlV2Fsa2VyLmdldE5vZGUoKS5pc1NhbWVOb2RlKHRhYmxlTm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJvbGUgPSB0YWJsZVdhbGtlci5nZXRSb2xlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFibGVXYWxrZXIuaXNTdGFydFRhZygpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvbGUgPT09IFwicm93XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytyb3dzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmlyc3RSb3dDb21wbGV0ZSAmJiBbXCJjZWxsXCIsIFwicm93aGVhZGVyXCIsIFwiY29sdW1uaGVhZGVyXCJdLmluY2x1ZGVzKHJvbGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGVtID0gdGFibGVXYWxrZXIuZ2V0Tm9kZSgpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29scyArPSBwYXJzZUludChlbGVtLmdldEF0dHJpYnV0ZShcImNvbHNwYW5cIikgfHwgXCIxXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyb2xlID09PSBcInJvd1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RSb3dDb21wbGV0ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgcmV0dXJuIGBbdGFibGUgd2l0aCAke3Jvd3N9ICR7cm93cyA9PT0gMSA/IFwicm93XCIgOiBcInJvd3NcIn0gYW5kICR7Y29sc30gJHtjb2xzID09PSAxID8gXCJjb2x1bW5cIiA6IFwiY29sdW1uc1wifSR7cXVvdGVOYW1lUGFkQmVmb3JlKGN1cnNvcil9XWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIFRvb2xiYXIgcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJ0b29sYmFyXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCIsIFwicmVnaW9uXCIsIFwidGFiX2ZvY3VzXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IsIF9vbGRDdXJzb3I/OiBTUkN1cnNvciwgbW9kZT86IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChtb2RlID09PSBcInRhYl9mb2N1c1wiICYmICFDb21tb25VdGlsLmlzVGFiYmFibGUoY3Vyc29yLmdldE5vZGUoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX10b29sYmFyXWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIEhUTUwgRWxlbWVudCBydWxlc1xuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXSxcbiAgICAgICAgZWxlbXM6IFtcIkRMXCJdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcImxpc3RcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBjdXJzb3IuZ2V0Tm9kZSgpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlc2NlbmRhbnRMaXN0SXRlbXMgPSBkb2N1bWVudC5ldmFsdWF0ZShcIi4vL2R0XCIsIG5vZGUsIG51bGwsIFhQYXRoUmVzdWx0Lk9SREVSRURfTk9ERV9TTkFQU0hPVF9UWVBFLCBudWxsKTtcbiAgICAgICAgICAgICAgICBsZXQgbnVtSXRlbXMgPSBkZXNjZW5kYW50TGlzdEl0ZW1zLnNuYXBzaG90TGVuZ3RoO1xuICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX1kZWZpbml0aW9uIGxpc3Qgb2YgJHtudW1JdGVtc30gdGVybXNdYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtdLFxuICAgICAgICBlbGVtczogW1wiRklHQ0FQVElPTlwiXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoX2N1cnNvcjogU1JDdXJzb3IpID0+IFwiW2NhcHRpb25dXCJcbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtdLFxuICAgICAgICBlbGVtczogW1wiTUFSS1wiXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoX2N1cnNvcjogU1JDdXJzb3IpID0+IFwiW2hpZ2hsaWdodGVkXVwiXG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIE11bHRpcGxlIHJvbGVzIHJ1bGVzIC0gcGxhY2VkIGF0IHRoZSBib3R0b21cblxuICAgIC8vIEhlYWRpbmcgbW9kZSBydWxlcyAtIGlnbm9yZSBjb250YWluZXIgZWxlbWVudHMgaW4gaGVhZGluZyBtb2RlIChtdWx0aXBsZSByb2xlcylcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiYXJ0aWNsZVwiLCBcImJhbm5lclwiLCBcImJsb2NrcXVvdGVcIiwgXCJjYXB0aW9uXCIsIFwiY2VsbFwiLCBcImNvbHVtbmhlYWRlclwiLCBcbiAgICAgICAgICAgICAgICBcImNvbXBsZW1lbnRhcnlcIiwgXCJjb250ZW50aW5mb1wiLCBcImZpZ3VyZVwiLCBcImZvcm1cIiwgXCJncm91cFwiLCBcInJlZ2lvblwiLCBcbiAgICAgICAgICAgICAgICBcInJvd1wiLCBcInJvd2hlYWRlclwiLCBcInNlYXJjaFwiLCBcInRvb2xiYXJcIiwgXCJsaXN0XCIsIFwibWFpblwiLCBcIm5hdmlnYXRpb25cIiwgXCJ0YWJsZVwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaGVhZGluZ1wiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgICgpID0+IFwiXCJcbiAgICAgICAgXVxuICAgIH0pXG5dO1xuIiwiaW1wb3J0IHsgU1JSZW5kZXJlclJ1bGUgfSBmcm9tIFwiLi4vU1JSZW5kZXJlclJ1bGVcIjtcbmltcG9ydCB7IFNSQ3Vyc29yIH0gZnJvbSBcIi4uL1NSQ3Vyc29yXCI7XG5pbXBvcnQgeyBxdW90ZU5hbWVQYWRBZnRlciwgZ2V0Um9sZURlc2NyaXB0aW9uIH0gZnJvbSBcIi4vY29tbW9uXCI7XG5cbmV4cG9ydCBsZXQgUlVMRVM6IFNSUmVuZGVyZXJSdWxlW10gPSBbXG4gICAgLy8gU2luZ2xlIHJvbGUgcnVsZXMgLSBhbHBoYWJldGljYWxseSBzb3J0ZWRcbiAgICBcbiAgICAvLyBBcnRpY2xlIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiYXJ0aWNsZVwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm9sZURlc2MgPSBnZXRSb2xlRGVzY3JpcHRpb24oY3Vyc29yLCBcImFydGljbGVcIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBbb3V0IG9mICR7cm9sZURlc2N9XWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIEJhbm5lciByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImJhbm5lclwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm9sZURlc2MgPSBnZXRSb2xlRGVzY3JpcHRpb24oY3Vyc29yLCBcImJhbm5lciByZWdpb25cIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBbb3V0IG9mICR7cm9sZURlc2N9XWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIEJsb2NrcXVvdGUgcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJibG9ja3F1b3RlXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKF9jdXJzb3I6IFNSQ3Vyc29yKSA9PiBcIltvdXQgb2YgYmxvY2txdW90ZV1cIlxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBDYXB0aW9uIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiY2FwdGlvblwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChfY3Vyc29yOiBTUkN1cnNvcikgPT4gXCJbb3V0IG9mIGNhcHRpb25dXCJcbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gQ29tcGxlbWVudGFyeSByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImNvbXBsZW1lbnRhcnlcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvbGVEZXNjID0gZ2V0Um9sZURlc2NyaXB0aW9uKGN1cnNvciwgXCJjb21wbGVtZW50YXJ5IHJlZ2lvblwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gYFtvdXQgb2YgJHtyb2xlRGVzY31dYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gQ29udGVudGluZm8gcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJjb250ZW50aW5mb1wiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm9sZURlc2MgPSBnZXRSb2xlRGVzY3JpcHRpb24oY3Vyc29yLCBcImNvbnRlbnQgaW5mbyByZWdpb25cIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBbb3V0IG9mICR7cm9sZURlc2N9XWA7XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIEZpZ3VyZSByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImZpZ3VyZVwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInJlZ2lvblwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChfY3Vyc29yOiBTUkN1cnNvcikgPT4gXCJbb3V0IG9mIGZpZ3VyZV1cIlxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBGb3JtIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiZm9ybVwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInJlZ2lvblwiLCBcImZvcm1jb250cm9sXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKGN1cnNvcjogU1JDdXJzb3IpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoY3Vyc29yLmdldE5hbWVJbmZvKCkgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiW291dCBvZiBzZWN0aW9uXVwiO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgW291dCBvZiBmb3JtXWBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIEdyb3VwIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wiZ3JvdXBcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChjdXJzb3IuZ2V0TmFtZUluZm8oKSA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5nZXRDdXJyZW50T3JQYXJlbnRCeVJvbGVDbG9uZShbXCJjb21ib2JveFwiXSwgW1wic2VsZWN0XCJdKT8uZ2V0Tm9kZSgpLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkgPT09IFwiU0VMRUNUXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgcmV0dXJuIFwiW291dCBvZiBncm91cGluZ11cIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gTGlzdCByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImxpc3RcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBjdXJzb3IuZ2V0Tm9kZSgpIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlc2NlbmRhbnRMaXN0SXRlbXMgPSBkb2N1bWVudC5ldmFsdWF0ZShcIi4vL2xpIHwgLi8vKltAcm9sZT0nbGlzdGl0ZW0nXVwiLCBub2RlLCBudWxsLCBYUGF0aFJlc3VsdC5PUkRFUkVEX05PREVfU05BUFNIT1RfVFlQRSwgbnVsbCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVzY2VuZGFudExpc3RJdGVtc0luT3RoZXJMaXN0cyA9IGRvY3VtZW50LmV2YWx1YXRlKFxuICAgICAgICAgICAgICAgICAgICBcIi4vL3VsLy9saXwuLy91bC8vKltAcm9sZT0nbGlzdGl0ZW0nXXwuLy9vbC8vbGl8Li8vb2wvLypbQHJvbGU9J2xpc3RpdGVtJ118Li8vKltAcm9sZT0nbGlzdCddLy9saXwuLy8qW0Byb2xlPSdsaXN0J10vLypbQHJvbGU9J2xpc3RpdGVtJ11cIixcbiAgICAgICAgICAgICAgICAgICAgbm9kZSwgbnVsbCwgWFBhdGhSZXN1bHQuT1JERVJFRF9OT0RFX1NOQVBTSE9UX1RZUEUsIG51bGwpO1xuICAgICAgICAgICAgICAgIGxldCBudW1JdGVtcyA9IGRlc2NlbmRhbnRMaXN0SXRlbXMuc25hcHNob3RMZW5ndGgtZGVzY2VuZGFudExpc3RJdGVtc0luT3RoZXJMaXN0cy5zbmFwc2hvdExlbmd0aDtcbiAgICAgICAgICAgICAgICBpZiAobnVtSXRlbXMgPT09IDApIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIHJldHVybiBgWyR7cXVvdGVOYW1lUGFkQWZ0ZXIoY3Vyc29yKX1vdXQgb2YgbGlzdF1gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBNYWluIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wibWFpblwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm9sZURlc2MgPSBnZXRSb2xlRGVzY3JpcHRpb24oY3Vyc29yLCBcIm1haW4gcmVnaW9uXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBgW291dCBvZiAke3JvbGVEZXNjfV1gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBtZW51YmFyIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wibWVudWJhclwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcImxpc3RcIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoX2N1cnNvcjogU1JDdXJzb3IpID0+IGBbb3V0IG9mIG1lbnViYXJdYFxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBOYXZpZ2F0aW9uIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wibmF2aWdhdGlvblwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm9sZURlc2MgPSBnZXRSb2xlRGVzY3JpcHRpb24oY3Vyc29yLCBcIm5hdmlnYXRpb24gcmVnaW9uXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBgW291dCBvZiAke3JvbGVEZXNjfV1gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyByYWRpb2dyb3VwIHJvbGVcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW1wicmFkaW9ncm91cFwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiLCBcInJlZ2lvblwiLCBcInRhYl9mb2N1c1wiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChfY3Vyc29yOiBTUkN1cnNvcikgPT4gXCJbb3V0IG9mIGdyb3VwaW5nXVwiXG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIC8vIFJlZ2lvbiByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcInJlZ2lvblwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGN1cnNvci5nZXROYW1lSW5mbygpID09PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICBjb25zdCByb2xlRGVzYyA9IGdldFJvbGVEZXNjcmlwdGlvbihjdXJzb3IsIFwicmVnaW9uXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBgW291dCBvZiAke3JvbGVEZXNjfV1gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBTZWFyY2ggcm9sZVxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXCJzZWFyY2hcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoY3Vyc29yOiBTUkN1cnNvcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvbGVEZXNjID0gZ2V0Um9sZURlc2NyaXB0aW9uKGN1cnNvciwgXCJzZWFyY2ggcmVnaW9uXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBgW291dCBvZiAke3JvbGVEZXNjfV1gO1xuICAgICAgICAgICAgfVxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBUYWJsZSByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcInRhYmxlXCJdLFxuICAgICAgICBlbGVtczogW10sXG4gICAgICAgIG1vZGVzOiBbXCJpdGVtXCJdLFxuICAgICAgICB0ZXN0czogW1xuICAgICAgICAgICAgKF9jdXJzb3I6IFNSQ3Vyc29yKSA9PiBcIltvdXQgb2YgdGFibGVdXCJcbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgLy8gVG9vbGJhciByb2xlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcInRvb2xiYXJcIl0sXG4gICAgICAgIGVsZW1zOiBbXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoX2N1cnNvcjogU1JDdXJzb3IpID0+IGBbb3V0IG9mIHRvb2xiYXJdYFxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBIVE1MIEVsZW1lbnQgcnVsZXNcbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW10sXG4gICAgICAgIGVsZW1zOiBbXCJBQkJSXCJdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChjdXJzb3I6IFNSQ3Vyc29yKSA9PiBjdXJzb3IuZ2V0RWxlbWVudCgpLmhhc0F0dHJpYnV0ZShcInRpdGxlXCIpID8gXG4gICAgICAgICAgICAgICAgYFske2N1cnNvci5nZXRFbGVtZW50KCkuZ2V0QXR0cmlidXRlKFwidGl0bGVcIil9XWAgOiBudWxsXG4gICAgICAgIF1cbiAgICB9KSxcblxuICAgIG5ldyBTUlJlbmRlcmVyUnVsZSh7XG4gICAgICAgIHJvbGVzOiBbXSxcbiAgICAgICAgZWxlbXM6IFtcIkRMXCJdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChfY3Vyc29yOiBTUkN1cnNvcikgPT4gYFtvdXQgb2YgZGVmaW5pdGlvbiBsaXN0XWBcbiAgICAgICAgXVxuICAgIH0pLFxuXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtdLFxuICAgICAgICBlbGVtczogW1wiRklHQ0FQVElPTlwiXSxcbiAgICAgICAgbW9kZXM6IFtcIml0ZW1cIl0sXG4gICAgICAgIHRlc3RzOiBbXG4gICAgICAgICAgICAoX2N1cnNvcjogU1JDdXJzb3IpID0+IGBbb3V0IG9mIGNhcHRpb25dYFxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICBuZXcgU1JSZW5kZXJlclJ1bGUoe1xuICAgICAgICByb2xlczogW10sXG4gICAgICAgIGVsZW1zOiBbXCJNQVJLXCJdLFxuICAgICAgICBtb2RlczogW1wiaXRlbVwiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgIChfY3Vyc29yOiBTUkN1cnNvcikgPT4gYFtvdXQgb2YgaGlnaGxpZ2h0ZWRdYFxuICAgICAgICBdXG4gICAgfSksXG5cbiAgICAvLyBNdWx0aXBsZSByb2xlcyBydWxlcyAtIHBsYWNlZCBhdCB0aGUgYm90dG9tXG4gICAgXG4gICAgLy8gUmVnaW9uIG1vZGUgcnVsZXMgLSBpZ25vcmUgY29udGFpbmVyIGVsZW1lbnRzIGluIHJlZ2lvbiBhbmQgaGVhZGluZyBtb2RlXG4gICAgbmV3IFNSUmVuZGVyZXJSdWxlKHtcbiAgICAgICAgcm9sZXM6IFtcImdyb3VwXCIsIFwiYXJ0aWNsZVwiLCBcImJhbm5lclwiLCBcImJsb2NrcXVvdGVcIiwgXCJjYXB0aW9uXCIsIFwiY29tcGxlbWVudGFyeVwiLCBcbiAgICAgICAgICAgICAgICBcImNvbnRlbnRpbmZvXCIsIFwiZmlndXJlXCIsIFwiZm9ybVwiLCBcImxpc3RcIiwgXCJyZWdpb25cIiwgXCJtYWluXCIsIFwibmF2aWdhdGlvblwiLCBcbiAgICAgICAgICAgICAgICBcInNlYXJjaFwiLCBcInRhYmxlXCIsIFwidG9vbGJhclwiXSxcbiAgICAgICAgZWxlbXM6IFtdLFxuICAgICAgICBtb2RlczogW1wicmVnaW9uXCIsIFwiaGVhZGluZ1wiXSxcbiAgICAgICAgdGVzdHM6IFtcbiAgICAgICAgICAgICgpID0+IFwiXCJcbiAgICAgICAgXVxuICAgIH0pLFxuXTtcbiIsImltcG9ydCB7IFJVTEVTIGFzIFNSUnVsZXMgfSBmcm9tIFwiLi9jb21tb25cIjtcbmltcG9ydCB7IFJVTEVTIGFzIENvbnRhaW5lckVudGVyUnVsZXMgfSBmcm9tIFwiLi9jb250YWluZXJfZW50ZXJcIjtcbmltcG9ydCB7IFJVTEVTIGFzIENvbnRhaW5lckV4aXRSdWxlcyB9IGZyb20gXCIuL2NvbnRhaW50ZXJfZXhpdFwiO1xuZXhwb3J0IGxldCBTUl9SVUxFUyA9IFNSUnVsZXM7XG5leHBvcnQgbGV0IENPTlRBSU5FUl9FTlRFUl9SVUxFUyA9IENvbnRhaW5lckVudGVyUnVsZXM7XG5leHBvcnQgbGV0IENPTlRBSU5FUl9FWElUX1JVTEVTID0gQ29udGFpbmVyRXhpdFJ1bGVzO1xuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBBUklBRGVmaW5pdGlvbnMgfSBmcm9tIFwiLi4vLi4vdjIvYXJpYS9BUklBRGVmaW5pdGlvbnNcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi9Db21tb25VdGlsXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBWaXNVdGlsIH0gZnJvbSBcIi4vVmlzVXRpbFwiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4vQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuaW1wb3J0IHsgRE9NVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NVXRpbFwiO1xuXG50eXBlIEVsZW1DYWxjID0gKGVsZW06IEVsZW1lbnQpID0+IHN0cmluZztcbnR5cGUgTm9kZUNhbGMgPSAobm9kZTogTm9kZSkgPT4gc3RyaW5nO1xuXG5leHBvcnQgdHlwZSBBY2Nlc3NpYmxlTmFtZVJlc3VsdCA9IHtcbiAgICBuYW1lOiBzdHJpbmcsIFxuICAgIG5hbWVGcm9tOiBcImFyaWFMYWJlbFwiIHwgXCJ0aXRsZVwiIHwgXCJwbGFjZWhvbGRlclwiIHwgXCJsYWJlbFwiIFxuICAgICAgICB8IFwidmFsdWVcIiB8IFwiaW50ZXJuYWxcIiB8IFwiYWx0XCIgfCBcInRleHRcIiB8IFwibGVnZW5kXCIgXG4gICAgICAgIHwgXCJzdW1tYXJ5XCIgfCBcImZpZ2NhcHRpb25cIiB8IFwiY2FwdGlvblwiXG4gICAgICAgIHwgXCJzaGFkb3dcIiB8IFwic2xvdFwiIHwgXCJzaGFkb3ctaG9zdFwiIHwgXCJjb250ZW50LXNsb3RcIlxuICAgICAgICB8IFwiY29udGVudFwiXG4gICAgICAgIHwgXCJzdmdsaW5rVGl0bGVcIiB8IFwic3ZnVGl0bGVcIiB8IFwic3ZnVGV4dFwiIHwgXCJzdmdEZXNjXCJcbiAgICAgICAgfCBcImFyaWEtZGVzY3JpcHRpb25cIlxuICAgICAgICB8IHN0cmluZyAvLyBjc3MtKlxufVxuZXhwb3J0IGNsYXNzIEFjY05hbWVVdGlsIHtcbiAgICAvKipcbiAgICAgKiBDb21wdXRlcyB0aGUgYWNjZXNzaWJsZSBuYW1lIGZvciBhbiBTVkcgZWxlbWVudCBhY2NvcmRpbmcgdG8gVzNDIHNwZWNpZmljYXRpb25cbiAgICAgKiBGb2xsb3dpbmcgdGhlIEFjY2Vzc2libGUgTmFtZSBhbmQgRGVzY3JpcHRpb24gQ29tcHV0YXRpb24gMS4xIGFsZ29yaXRobVxuICAgICAqIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9hY2NuYW1lLTEuMS9cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gZWxlbSBUaGUgU1ZHIGVsZW1lbnRcbiAgICAgKiBAcmV0dXJucyBUaGUgYWNjZXNzaWJsZSBuYW1lIHJlc3VsdCBvciBudWxsIGlmIG5vIGFjY2Vzc2libGUgbmFtZSBpcyBmb3VuZFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgY29tcHV0ZUFjY2Vzc2libGVOYW1lRm9yU1ZHRWxlbWVudFczQyhlbGVtOiBFbGVtZW50KTogQWNjZXNzaWJsZU5hbWVSZXN1bHQgfCBudWxsIHtcbiAgICAgICAgaWYgKCFlbGVtIHx8IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gJ3N2ZycpIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIFN0ZXAgMTogQ2hlY2sgZm9yIGFyaWEtbGFiZWxsZWRieSAoYWxyZWFkeSBoYW5kbGVkIGJ5IG1haW4gY29tcHV0ZUFjY2Vzc2libGVOYW1lIGZ1bmN0aW9uKVxuICAgICAgICAvLyBTdGVwIDI6IENoZWNrIGZvciBhcmlhLWxhYmVsIChhbHJlYWR5IGhhbmRsZWQgYnkgbWFpbiBjb21wdXRlQWNjZXNzaWJsZU5hbWUgZnVuY3Rpb24pXG5cbiAgICAgICAgLy8gU3RlcCAzOiBDaGVjayBmb3IgdGl0bGUgZWxlbWVudFxuICAgICAgICBjb25zdCBzdmdUaXRsZXMgPSBlbGVtLnF1ZXJ5U2VsZWN0b3JBbGwoXCI6c2NvcGUgPiB0aXRsZVwiKTtcbiAgICAgICAgaWYgKHN2Z1RpdGxlcyAmJiBzdmdUaXRsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGV0IHRleHQgPSBcIlwiO1xuICAgICAgICAgICAgc3ZnVGl0bGVzLmZvckVhY2goc3ZnVGl0bGUgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChzdmdUaXRsZSAmJiAhVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQoc3ZnVGl0bGUpICYmICFWaXNVdGlsLmlzTm9kZVByZXNlbnRhdGlvbmFsKHN2Z1RpdGxlKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0aXRsZSA9IHN2Z1RpdGxlLnRleHRDb250ZW50O1xuICAgICAgICAgICAgICAgICAgICBpZiAodGl0bGUgJiYgdGl0bGUudHJpbSgpICE9PSAnJylcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgKz0gdGl0bGUudHJpbSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHRleHQgJiYgdGV4dC50cmltKCkgIT09ICcnKVxuICAgICAgICAgICAgICAgIHJldHVybiB7IFwibmFtZVwiOiB0ZXh0LnRyaW0oKSwgXCJuYW1lRnJvbVwiOiBcInN2Z1RpdGxlXCIgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0ZXAgNDogQ2hlY2sgZm9yIHRleHQgY29udGVudCBpbiBTVkcgdGV4dCBlbGVtZW50c1xuICAgICAgICBsZXQgdGV4dENvbnRlbnQgPSBcIlwiO1xuICAgICAgICBjb25zdCB0ZXh0RWxlbWVudHMgPSBlbGVtLnF1ZXJ5U2VsZWN0b3JBbGwoXCJ0ZXh0LCB0ZXh0UGF0aCwgdHNwYW5cIik7XG4gICAgICAgIGlmICh0ZXh0RWxlbWVudHMgJiYgdGV4dEVsZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRleHRFbGVtZW50cy5mb3JFYWNoKHRleHRFbGVtZW50ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIVZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKHRleHRFbGVtZW50KSAmJiAhVmlzVXRpbC5pc05vZGVQcmVzZW50YXRpb25hbCh0ZXh0RWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGVudCA9IHRleHRFbGVtZW50LnRleHRDb250ZW50O1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudCAmJiBjb250ZW50LnRyaW0oKSAhPT0gJycpXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0Q29udGVudCArPSBcIiBcIiArIGNvbnRlbnQudHJpbSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHRleHRDb250ZW50LnRyaW0oKSAhPT0gJycpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgXCJuYW1lXCI6IENvbW1vblV0aWwudHJ1bmNhdGVUZXh0KHRleHRDb250ZW50LnRyaW0oKSksIFwibmFtZUZyb21cIjogXCJzdmdUZXh0XCIgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0ZXAgNTogQ2hlY2sgZm9yIHhsaW5rOnRpdGxlIGF0dHJpYnV0ZSBvbiBsaW5rcyB3aXRoaW4gU1ZHXG4gICAgICAgIGNvbnN0IGxpbmtzID0gZWxlbS5xdWVyeVNlbGVjdG9yQWxsKFwiYVwiKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5rcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgbGluayA9IGxpbmtzW2ldO1xuICAgICAgICAgICAgaWYgKCFWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChsaW5rKSAmJiAhVmlzVXRpbC5pc05vZGVQcmVzZW50YXRpb25hbChsaW5rKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHhsaW5rVGl0bGUgPSBsaW5rLmdldEF0dHJpYnV0ZShcInhsaW5rOnRpdGxlXCIpO1xuICAgICAgICAgICAgICAgIGlmICh4bGlua1RpdGxlICYmIHhsaW5rVGl0bGUudHJpbSgpICE9PSAnJylcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgXCJuYW1lXCI6IENvbW1vblV0aWwudHJ1bmNhdGVUZXh0KHhsaW5rVGl0bGUpLCBcIm5hbWVGcm9tXCI6IFwic3ZnbGlua1RpdGxlXCIgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0ZXAgNjogQ2hlY2sgZm9yIGFyaWEtZGVzY3JpYmVkYnkgb3IgYXJpYS1kZXNjcmlwdGlvblxuICAgICAgICBsZXQgZGVzY3JpcHRpb24gPSBBcmlhVXRpbC5nZXRBcmlhRGVzY3JpcHRpb24oZWxlbSk7XG4gICAgICAgIGlmIChkZXNjcmlwdGlvbiAmJiBkZXNjcmlwdGlvbi50cmltKCkgIT09ICcnKVxuICAgICAgICAgICAgcmV0dXJuIHsgXCJuYW1lXCI6IENvbW1vblV0aWwudHJ1bmNhdGVUZXh0KGRlc2NyaXB0aW9uKSwgXCJuYW1lRnJvbVwiOiBcImFyaWEtZGVzY3JpcHRpb25cIiB9O1xuXG4gICAgICAgIC8vIFN0ZXAgNzogQ2hlY2sgZm9yIGRlc2MgZWxlbWVudFxuICAgICAgICBjb25zdCBkZXNjRWxlbWVudHMgPSBlbGVtLnF1ZXJ5U2VsZWN0b3JBbGwoXCI6c2NvcGUgPiBkZXNjXCIpO1xuICAgICAgICBpZiAoZGVzY0VsZW1lbnRzICYmIGRlc2NFbGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsZXQgZGVzY1RleHQgPSBcIlwiO1xuICAgICAgICAgICAgZGVzY0VsZW1lbnRzLmZvckVhY2goZGVzY0VsZW1lbnQgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQoZGVzY0VsZW1lbnQpICYmICFWaXNVdGlsLmlzTm9kZVByZXNlbnRhdGlvbmFsKGRlc2NFbGVtZW50KSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXNjID0gZGVzY0VsZW1lbnQudGV4dENvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkZXNjICYmIGRlc2MudHJpbSgpICE9PSAnJylcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NUZXh0ICs9IFwiIFwiICsgZGVzYy50cmltKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoZGVzY1RleHQudHJpbSgpICE9PSAnJylcbiAgICAgICAgICAgICAgICByZXR1cm4geyBcIm5hbWVcIjogZGVzY1RleHQudHJpbSgpLCBcIm5hbWVGcm9tXCI6IFwic3ZnRGVzY1wiIH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdGVwIDg6IENoZWNrIGZvciB0aXRsZSBhdHRyaWJ1dGVcbiAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwidGl0bGVcIikpIHtcbiAgICAgICAgICAgIGNvbnN0IHRpdGxlID0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJ0aXRsZVwiKTtcbiAgICAgICAgICAgIGlmICh0aXRsZSAmJiB0aXRsZS50cmltKCkgIT09ICcnKVxuICAgICAgICAgICAgICAgIHJldHVybiB7IFwibmFtZVwiOiBDb21tb25VdGlsLnRydW5jYXRlVGV4dCh0aXRsZSksIFwibmFtZUZyb21cIjogXCJ0aXRsZVwiIH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBObyBhY2Nlc3NpYmxlIG5hbWUgZm91bmRcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gY2FsY3VsYXRlIGFjY2Vzc2libGUgbmFtZSBmb3IgYSBnaXZlbiBub2RlXG4gICAgcHVibGljIHN0YXRpYyBjb21wdXRlQWNjZXNzaWJsZU5hbWUoZWxlbTogRWxlbWVudCkgOiBBY2Nlc3NpYmxlTmFtZVJlc3VsdCB8IG51bGwge1xuICAgICAgICBpZiAoIWVsZW0pIHJldHVybiBudWxsO1xuICAgICAgICBjb25zdCBub2RlTmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICBsZXQgbmFtZV9wYWlyID0gQ2FjaGVVdGlsLmdldENhY2hlKGVsZW0sIFwiRUxFTUVOVF9BQ0NFU1NCTEVfTkFNRVwiLCB1bmRlZmluZWQpO1xuICAgICAgICBpZiAobmFtZV9wYWlyICE9PSB1bmRlZmluZWQpIHJldHVybiBuYW1lX3BhaXI7XG5cbiAgICAgICAgLy8gMS4gbmFtZSBmcm9tIGF1dGhvciwgb3IgZWxlbWVudHMgd2l0aG91dCBhIHJvbGUgYnV0IHdpdGggYXJpYS1sYWJlbGxlZGJ5IG9yIGFyaWEtbGFiZWwgXG4gICAgICAgIC8vICAgZ2V0IGFyaWEgbGFiZWwgZXZlbiBmb3IgdGhlIHJvbGUgd2hlcmUgdGhlIG5hbWUgaXMgcHJvaGliaXRlZCBvciBpcyAncHJlc2VudGF0aW9uJyBvciAnbm9uZSdcbiAgICAgICAgbGV0IGFjY05hbWUgPSBBcmlhVXRpbC5nZXRBcmlhTGFiZWwoZWxlbSk7XG4gICAgICAgIGlmIChhY2NOYW1lICYmIGFjY05hbWUudHJpbSgpICE9PSBcIlwiKSB7XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJFTEVNRU5UX0FDQ0VTU0JMRV9OQU1FXCIsIHtcIm5hbWVcIjpDb21tb25VdGlsLnRydW5jYXRlVGV4dChhY2NOYW1lKSwgXCJuYW1lRnJvbVwiOiBcImFyaWFMYWJlbFwifSk7XG4gICAgICAgICAgICByZXR1cm4ge1wibmFtZVwiOkNvbW1vblV0aWwudHJ1bmNhdGVUZXh0KGFjY05hbWUpLCBcIm5hbWVGcm9tXCI6IFwiYXJpYUxhYmVsXCJ9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gMi4gYWNjZXNzaWJsZSBuYW1lIG1hcHBpbmcgZm9yIG5hdGl2ZSBodG1sIGVsZW1lbnRzXG4gICAgICAgIG5hbWVfcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZUZvck5hdGl2ZUVsZW1lbnQoZWxlbSk7XG4gICAgICAgIGlmIChuYW1lX3BhaXIpIHtcbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIkVMRU1FTlRfQUNDRVNTQkxFX05BTUVcIiwgbmFtZV9wYWlyKTtcbiAgICAgICAgICAgIHJldHVybiBuYW1lX3BhaXI7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIDMuIG5hbWUgZnJvbSBuYXRpdmUgb3IgYXJpYSBhdHRyaWJ1dGVcbiAgICAgICAgLyoqbmFtZV9wYWlyID0gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lRnJvbUF0dHJpYnV0ZShlbGVtKTtcbiAgICAgICAgaWYgKG5hbWVfcGFpcikge1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiRUxFTUVOVF9BQ0NFU1NCTEVfTkFNRVwiLCBuYW1lX3BhaXIpO1xuICAgICAgICAgICAgcmV0dXJuIG5hbWVfcGFpcjtcbiAgICAgICAgfSovXG5cbiAgICAgICAgLy8gNC4gbmFtZSBmcm9tIGNvbnRlbnQgZm9yIGN1c3RvbSBlbGVtZW50cyB3aXRoIGEgcm9sZVxuICAgICAgICBjb25zdCByb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKGVsZW0pO1xuICAgICAgICBpZiAoQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVdICYmIEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlXS5uYW1lRnJvbS5pbmNsdWRlcyhcImNvbnRlbnRzXCIpKSB7XG4gICAgICAgICAgICBuYW1lX3BhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWVGcm9tQ29udGVudChlbGVtKTtcbiAgICAgICAgICAgIGlmIChuYW1lX3BhaXIpIHtcbiAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJFTEVNRU5UX0FDQ0VTU0JMRV9OQU1FXCIsIG5hbWVfcGFpcik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5hbWVfcGFpcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIDUuIG5hbWUgZnJvbSB0aGUgZ2xvYmFsIGF0dHJpYnV0ZSBcInRpdGxlXCJcbiAgICAgICAgaWYgKGVsZW0uaGFzQXR0cmlidXRlKFwidGl0bGVcIikpIHtcbiAgICAgICAgICAgIGxldCB0aXRsZSA9IGVsZW0uZ2V0QXR0cmlidXRlKFwidGl0bGVcIikudHJpbSgpO1xuICAgICAgICAgICAgaWYgKHRpdGxlICYmIHRpdGxlLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdGl0bGUgPSBDb21tb25VdGlsLnRydW5jYXRlVGV4dCh0aXRsZSk7XG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiRUxFTUVOVF9BQ0NFU1NCTEVfTkFNRVwiLCB7XCJuYW1lXCI6dGl0bGUsIFwibmFtZUZyb21cIjogXCJ0aXRsZVwifSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjp0aXRsZSwgXCJuYW1lRnJvbVwiOiBcInRpdGxlXCJ9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyA2LiBuYW1lIGZyb20gdGhlIGF0dHJpYnV0ZSBcInBsYWNlaG9sZGVyXCJcbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSAndGV4dGFyZWEnIHx8IChub2RlTmFtZSA9PT0gJ2lucHV0JyAmJiAoIWVsZW0uaGFzQXR0cmlidXRlKFwidHlwZVwiKSB8fCBDb21tb25VdGlsLmlucHV0X3R5cGVfd2l0aF9wbGFjZWhvbGRlci5pbmNsdWRlcyhlbGVtLmdldEF0dHJpYnV0ZShcInR5cGVcIikpKSkpIHtcbiAgICAgICAgICAgIGxldCBwbGFjZWhvbGRlciA9IGVsZW0uZ2V0QXR0cmlidXRlKFwicGxhY2Vob2xkZXJcIik7XG4gICAgICAgICAgICBpZiAocGxhY2Vob2xkZXIgJiYgcGxhY2Vob2xkZXIudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlciA9IENvbW1vblV0aWwudHJ1bmNhdGVUZXh0KHBsYWNlaG9sZGVyKTtcbiAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJFTEVNRU5UX0FDQ0VTU0JMRV9OQU1FXCIsIHtcIm5hbWVcIjpwbGFjZWhvbGRlciwgXCJuYW1lRnJvbVwiOiBcInBsYWNlaG9sZGVyXCJ9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1wibmFtZVwiOnBsYWNlaG9sZGVyLCBcIm5hbWVGcm9tXCI6IFwicGxhY2Vob2xkZXJcIn07XG4gICAgICAgICAgICB9ICAgIFxuICAgICAgICB9XG5cbiAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiRUxFTUVOVF9BQ0NFU1NCTEVfTkFNRVwiLCBudWxsKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gY2FsY3VsYXRlIGFjY2Vzc2libGUgbmFtZSBmb3IgbmF0aXZlIGVsZW1lbnRzXG4gICAgcHVibGljIHN0YXRpYyBjb21wdXRlQWNjZXNzaWJsZU5hbWVGb3JOYXRpdmVFbGVtZW50KGVsZW06IEVsZW1lbnQpIDogQWNjZXNzaWJsZU5hbWVSZXN1bHQgfCBudWxsIHtcbiAgICAgICAgY29uc3Qgbm9kZU5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIFxuICAgICAgICAvLyBsYWJlbGxhYmxlIGZpZWxkc1xuICAgICAgICBpZiAoQ29tbW9uVXRpbC5mb3JtX2xhYmVsYWJsZV9lbGVtZW50cy5pbmNsdWRlcyhub2RlTmFtZSkpIHtcbiAgICAgICAgICAgIC8vIEdldCBvbmx5IHRoZSBub24taGlkZGVuIGxhYmVscyBmb3IgZWxlbWVudFxuICAgICAgICAgICAgY29uc3QgbGFiZWwgPSBDb21tb25VdGlsLmdldEZvcm1GaWVsZExhYmVsKGVsZW0pO1xuICAgICAgICAgICAgaWYgKGxhYmVsICYmIGxhYmVsLnRyaW0oKSAhPT0gJycpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjpDb21tb25VdGlsLnRydW5jYXRlVGV4dChsYWJlbCksIFwibmFtZUZyb21cIjogXCJsYWJlbFwifTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlucHV0IHR5cGVzOiBidXR0b24sIHJlc2V0LCBzdWJtaXQsIGltYWdlXG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJpbnB1dFwiICYmIGVsZW0uaGFzQXR0cmlidXRlKFwidHlwZVwiKSkgeyBcbiAgICAgICAgICAgIGlmIChDb21tb25VdGlsLmZvcm1fYnV0dG9uX3R5cGVzLmluY2x1ZGVzKGVsZW0uZ2V0QXR0cmlidXRlKFwidHlwZVwiKSkpIHtcbiAgICAgICAgICAgICAgICAvLyBpbnB1dCB0eXBlczogYnV0dG9uLCByZXNldCwgc3VibWl0XG4gICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBcInZhbHVlXCIgYXR0cmlidXRlIGZvciB0aGUgZWxlbWVudFxuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gQ29tbW9uVXRpbC5nZXRFbGVtZW50QXR0cmlidXRlKGVsZW0sIFwidmFsdWVcIik7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlICYmIHZhbHVlLnRyaW0oKSAhPT0gJycpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XCJuYW1lXCI6Q29tbW9uVXRpbC50cnVuY2F0ZVRleHQodmFsdWUpLCBcIm5hbWVGcm9tXCI6IFwidmFsdWVcIn07XG5cbiAgICAgICAgICAgICAgICAvLyBpbnB1dCAnc3VibWl0JyBhbmQgJ3Jlc2V0JyBoYXZlIHZpc2libGUgZGVmYXVsdHMgc28gcGFzcyBpZiB0aGVyZSBpcyBubyBleHBsaWNpdCAndmFsdWUnIGF0dHJpYnV0ZVxuICAgICAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBlbGVtLmdldEF0dHJpYnV0ZShcInR5cGVcIik7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdzdWJtaXQnIHx8IHR5cGUgPT09ICdyZXNldCcpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XCJuYW1lXCI6dHlwZSwgXCJuYW1lRnJvbVwiOiBcImludGVybmFsXCJ9O1xuXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW0uZ2V0QXR0cmlidXRlKFwidHlwZVwiKSA9PT0gJ2ltYWdlJykge1xuICAgICAgICAgICAgICAgIC8vIGlucHV0IHR5cGUgPSAnaW1hZ2UnXG4gICAgICAgICAgICAgICAgLy8gbm90ZSB0aGF0IHRob3VnaCBIVE1MIDUgc3BlYyBpbmRpY2F0ZXMgXCJUaGUgZWxlbWVudCdzIFt2YWx1ZV0gYXR0cmlidXRlIG11c3QgYmUgb21pdHRlZFwiLCBDaHJvbWUgdXNlcyB0aGUgdmFsdWUuXG4gICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBhY2Nlc3NpYmxlIG5hbWUgZm9yIHRoZSBhbHQgYXR0cmlidXRlXG4gICAgICAgICAgICAgICAgY29uc3QgYWx0ID0gQ29tbW9uVXRpbC5nZXRFbGVtZW50QXR0cmlidXRlKGVsZW0sIFwiYWx0XCIpO1xuICAgICAgICAgICAgICAgIGlmIChhbHQgJiYgYWx0LnRyaW0oKSAhPT0gJycpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XCJuYW1lXCI6Q29tbW9uVXRpbC50cnVuY2F0ZVRleHQoYWx0KSwgXCJuYW1lRnJvbVwiOiBcImFsdFwifTs7XG5cbiAgICAgICAgICAgICAgICAvLyB0aGUgdmlzaWJsZSBkZWZhdWx0IHRleHQgZm9yIHR5cGUgXCJpbWFnZVwiIGlzIFwiU3VibWl0XCIgc2FtZSB3aXRoIHRoZSB0eXBlIFwic3VibWl0XCJcbiAgICAgICAgICAgICAgICAvL3JldHVybiB7XCJuYW1lXCI6ZWxlbS5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpLCBcIm5hbWVGcm9tXCI6IFwiaW50ZXJuYWxcIn07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBidXR0b25cbiAgICAgICAgLy8gbm90ZSBidXR0b24gbWF5IGhhdmUgYSB2YWx1ZSBhdHRyaWJ1dGUsIGJ1dCBpdCdzIG5vdCBhIHZpc2libGUgdGV4dFxuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwiYnV0dG9uXCIpIHtcbiAgICAgICAgICAgIC8vIGZpcnN0IHVzZSB0aGUgYnV0dG9uIHRleHRcbiAgICAgICAgICAgIGNvbnN0IHRleHQgPSAoZWxlbSBhcyBIVE1MRWxlbWVudCkuaW5uZXJUZXh0O1xuICAgICAgICAgICAgaWYgKHRleHQgJiYgdGV4dC50cmltKCkgIT09ICcnKVxuICAgICAgICAgICAgICAgIHJldHVybiB7XCJuYW1lXCI6Q29tbW9uVXRpbC50cnVuY2F0ZVRleHQodGV4dCksIFwibmFtZUZyb21cIjogXCJ0ZXh0XCJ9O1xuXG4gICAgICAgICAgICAvLyBmb3IgaW1hZ2UgYnV0dG9uOiBnZXQgdGhlIGZpcnN0IGltYWdlIGlmIGV4aXN0c1xuICAgICAgICAgICAgY29uc3QgaW1hZ2UgPSBlbGVtLnF1ZXJ5U2VsZWN0b3IoJ2ltZycpO1xuICAgICAgICAgICAgaWYgKGltYWdlICYmICFWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChpbWFnZSkgJiYgIVZpc1V0aWwuaXNOb2RlUHJlc2VudGF0aW9uYWwoaW1hZ2UpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHBhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWUoaW1hZ2UpOyBcbiAgICAgICAgICAgICAgICBpZiAocGFpciAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwKSBcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhaXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIGZvciBhIGJ1dHRvbiB3aXRoIGEgc3ZnIGltYWdlXG4gICAgICAgICAgICBjb25zdCBzdmcgPSBlbGVtLnF1ZXJ5U2VsZWN0b3IoJ3N2ZycpO1xuICAgICAgICAgICAgaWYgKHN2ZyAmJiAhVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQoc3ZnKSAmJiAhVmlzVXRpbC5pc05vZGVQcmVzZW50YXRpb25hbChzdmcpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHBhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWUoc3ZnKTtcbiAgICAgICAgICAgICAgICBpZiAocGFpciAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwKSBcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhaXI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBmaWVsZHNldFxuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwiZmllbGRzZXRcIikge1xuICAgICAgICAgICAgLy8gaWYgdGhlIGZpZWxkc2V0IGVsZW1lbnQncyBmaXJzdCBjaGlsZCBpcyBhIGxlZ2VuZCBlbGVtZW50LCB0aGVuIHVzZSB0aGUgc3VidHJlZSBvZiB0aGUgbGVnZW5kXG4gICAgICAgICAgICBjb25zdCBmaXJzdCA9IGVsZW0uZmlyc3RFbGVtZW50Q2hpbGQ7XG4gICAgICAgICAgICBpZiAoZmlyc3QgJiYgZmlyc3Qubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2xlZ2VuZCcpIHtcbiAgICAgICAgICAgICAgICAvLyBsZWdlbmQgY2FuIGJlIG1peGVkIHRleHRcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXh0ID0gKGZpcnN0IGFzIEhUTUxFbGVtZW50KS5pbm5lclRleHQ7XG4gICAgICAgICAgICAgICAgaWYgKHRleHQgJiYgdGV4dC50cmltKCkubGVuZ3RoID4gMCkgXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XCJuYW1lXCI6Q29tbW9uVXRpbC50cnVuY2F0ZVRleHQodGV4dCksIFwibmFtZUZyb21cIjogXCJsZWdlbmRcIn07IFxuICAgICAgICAgICAgfSAgICAgICAgXG4gICAgICAgIH1cblxuICAgICAgICAvLyBvdXRwdXRcbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSBcIm91dHB1dFwiKSB7XG4gICAgICAgICAgICAvLyBpZiB0aGUgYXNzb2NpYXRlZCBsYWJlbCBlbGVtZW50IGV4aXN0cywgdXNlIGNvbmNhdGVuYXRlZCBhY2Nlc3NpYmxlIG5hbWUocykgZnJvbSBsYWJlbGxlZCBlbGVtZW50cy5cbiAgICAgICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcImZvclwiKSkge1xuICAgICAgICAgICAgICAgIGxldCBsYWJlbElEcyA9IGVsZW0uZ2V0QXR0cmlidXRlKFwiZm9yXCIpLnRyaW0oKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICAgICAgaWYgKGxhYmVsSURzICYmIGxhYmVsSURzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBsYWJlbElEcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsTm9kZSA9IGVsZW0ub3duZXJEb2N1bWVudC5nZXRFbGVtZW50QnlJZChsYWJlbElEc1tqXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFiZWxOb2RlICYmICFET01VdGlsLnNhbWVOb2RlKGxhYmVsTm9kZSwgZWxlbSkgJiYgIVZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKGxhYmVsTm9kZSkgJiYgIVZpc1V0aWwuaXNOb2RlUHJlc2VudGF0aW9uYWwobGFiZWxOb2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWUobGFiZWxOb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFpciAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwKSBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgKz0gXCIgXCIgKyBDb21tb25VdGlsLm5vcm1hbGl6ZVNwYWNpbmcocGFpci5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAobGFiZWwudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1wibmFtZVwiOkNvbW1vblV0aWwudHJ1bmNhdGVUZXh0KGxhYmVsKSwgXCJuYW1lRnJvbVwiOiBcImxhYmVsXCJ9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gICAgICAgXG4gICAgICAgIH1cblxuICAgICAgICAvLyBzdW1tYXJ5XG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJzdW1tYXJ5XCIpIHtcbiAgICAgICAgICAgIC8vIHVzZSBzdW1tYXJ5IGVsZW1lbnQgc3VidHJlZVxuICAgICAgICAgICAgY29uc3QgdGV4dCA9IChlbGVtIGFzIEhUTUxFbGVtZW50KS5pbm5lclRleHQ7XG4gICAgICAgICAgICBpZiAodGV4dCAmJiB0ZXh0LnRyaW0oKS5sZW5ndGggPiAwKSBcbiAgICAgICAgICAgICAgICByZXR1cm4ge1wibmFtZVwiOkNvbW1vblV0aWwudHJ1bmNhdGVUZXh0KHRleHQpLCBcIm5hbWVGcm9tXCI6IFwibGVnZW5kXCJ9OyAgICAgICAgIFxuICAgICAgICB9XG5cbiAgICAgICAgLy8gZGV0YWlsc1xuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwiZGV0YWlsc1wiKSB7XG4gICAgICAgICAgICBjb25zdCBmaXJzdCA9IGVsZW0uZmlyc3RFbGVtZW50Q2hpbGQ7XG4gICAgICAgICAgICBpZiAoZmlyc3QgJiYgZmlyc3Qubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ3N1bW1hcnknKSB7XG4gICAgICAgICAgICAgICAgLy8gZ2V0IGFjY2Vzc2libGUgbmFtZSBmcm9tIHN1bW1hcnlcbiAgICAgICAgICAgICAgICBjb25zdCBwYWlyID0gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lKGZpcnN0KTtcbiAgICAgICAgICAgICAgICBpZiAocGFpciAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwKSBcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjpDb21tb25VdGlsLnRydW5jYXRlVGV4dChwYWlyLm5hbWUudHJpbSgpKSwgXCJuYW1lRnJvbVwiOiBcInN1bW1hcnlcIn07IFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSWYgbm8gc3VtbWFyeSBlbGVtZW50IGFzIGEgZGlyZWN0IGNoaWxkIG9mIHRoZSBkZXRhaWxzIGVsZW1lbnQsIFxuICAgICAgICAgICAgLy8gdGhlIHVzZXIgYWdlbnQgc2hvdWxkIHByb3ZpZGUgb25lIHdpdGggYSBzdWJ0cmVlIGNvbnRhaW5pbmcgYSBsb2NhbGl6ZWQgc3RyaW5nIG9mIHRoZSB3b3JkIFwiZGV0YWlsc1wiLlxuICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjpcImRldGFpbHNcIiwgXCJuYW1lRnJvbVwiOiBcImludGVybmFsXCJ9OyAgICAgICAgIFxuICAgICAgICB9XG5cbiAgICAgICAgLy8gZmlndXJlXG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJmaWd1cmVcIikge1xuICAgICAgICAgICAgLy8gaWYgdGhlIGZpZ3VyZSBlbGVtZW50IGhhcyBhIGZpZ2NhcHRpb24gYXMgYSBjaGlsZFxuICAgICAgICAgICAgbGV0IGNhcHRpb24gPSBDb21tb25VdGlsLmdldENoaWxkQnlUYWdIaWRkZW4oZWxlbSwgXCJmaWdjYXB0aW9uXCIsIHRydWUsIGZhbHNlKTtcbiAgICAgICAgICAgIGlmIChjYXB0aW9uICYmIGNhcHRpb24ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIC8vIGZpZ2NhcHRpb24gY2FuIGJlIG1peGVkIHRleHRcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXh0ID0gKGNhcHRpb25bMF0gYXMgSFRNTEVsZW1lbnQpLmlubmVyVGV4dDtcbiAgICAgICAgICAgICAgICBpZiAodGV4dCAmJiB0ZXh0LnRyaW0oKS5sZW5ndGggPiAwKSBcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjpDb21tb25VdGlsLnRydW5jYXRlVGV4dCh0ZXh0KSwgXCJuYW1lRnJvbVwiOiBcImZpZ2NhcHRpb25cIn07ICBcbiAgICAgICAgICAgIH0gICAgICAgIFxuICAgICAgICB9XG5cbiAgICAgICAgLy8gaW1nIGVsZW1lbnRzOiB1c2UgYXR0cmlidXRlIFwiYWx0XCJcbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSBcImltZ1wiKSB7XG4gICAgICAgICAgICBpZiAoZWxlbS5oYXNBdHRyaWJ1dGUoXCJhbHRcIikpIHtcbiAgICAgICAgICAgICAgICBsZXQgYWx0ID0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJhbHRcIik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjpDb21tb25VdGlsLnRydW5jYXRlVGV4dChhbHQpLCBcIm5hbWVGcm9tXCI6IFwiYWx0XCJ9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gYXJlYSBlbGVtZW50czogdXNlIGF0dHJpYnV0ZSBcImFsdFwiXG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJhcmVhXCIpIHtcbiAgICAgICAgICAgIGlmIChlbGVtLmhhc0F0dHJpYnV0ZShcImFsdFwiKSkge1xuICAgICAgICAgICAgICAgIGxldCBhbHQgPSBlbGVtLmdldEF0dHJpYnV0ZShcImFsdFwiKTtcbiAgICAgICAgICAgICAgICBpZiAoYWx0ICYmIGFsdC50cmltKCkubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjpDb21tb25VdGlsLnRydW5jYXRlVGV4dChhbHQpLCBcIm5hbWVGcm9tXCI6IFwiYWx0XCJ9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gdGFibGUgZWxlbWVudFxuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwidGFibGVcIikge1xuICAgICAgICAgICAgLy8gaWYgdGhlIGZpZ3VyZSBlbGVtZW50IGhhcyBhIGNhcHRpb24gYXMgdGhlIGZpcnN0IGNoaWxkXG4gICAgICAgICAgICBsZXQgY2FwdGlvbkVsZW0gPSBlbGVtLmZpcnN0RWxlbWVudENoaWxkO1xuICAgICAgICAgICAgaWYgKGNhcHRpb25FbGVtICYmIGNhcHRpb25FbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdjYXB0aW9uJykge1xuICAgICAgICAgICAgICAgIC8vIGNhcHRpb24gY2FuIGJlIG1peGVkIHRleHRcbiAgICAgICAgICAgICAgICBjb25zdCBjYXB0aW9uID0gKGNhcHRpb25FbGVtIGFzIEhUTUxFbGVtZW50KS5pbm5lclRleHQ7XG4gICAgICAgICAgICAgICAgaWYgKGNhcHRpb24gJiYgY2FwdGlvbi50cmltKCkubGVuZ3RoID4gMCkgXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7XCJuYW1lXCI6Q29tbW9uVXRpbC50cnVuY2F0ZVRleHQoY2FwdGlvbiksIFwibmFtZUZyb21cIjogXCJjYXB0aW9uXCJ9OyBcbiAgICAgICAgICAgIH0gICAgICAgICBcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGEgZWxlbWVudFxuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwiYVwiKSB7XG4gICAgICAgICAgICAvLyBmaXJzdCB1c2UgdGhlIGxpbmsgdGV4dFxuICAgICAgICAgICAgY29uc3QgdGV4dCA9IChlbGVtIGFzIEhUTUxFbGVtZW50KS5pbm5lclRleHQ7XG4gICAgICAgICAgICBpZiAodGV4dCAmJiB0ZXh0LnRyaW0oKSAhPT0gJycpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjpDb21tb25VdGlsLnRydW5jYXRlVGV4dCh0ZXh0KSwgXCJuYW1lRnJvbVwiOiBcInRleHRcIn07XG4gICAgICAgICAgICAgXG4gICAgICAgICAgICAvL2ZvciBpbWFnZSBsaW5rOiBnZXQgdGhlIGltYWdlIG9yIHN2ZyBpZiBleGlzdHNcbiAgICAgICAgICAgIGNvbnN0IGltYWdlcyA9IGVsZW0ucXVlcnlTZWxlY3RvckFsbChcIjpzY29wZSA+IGltZywgOnNjb3BlID4gc3ZnXCIpO1xuICAgICAgICAgICAgaWYgKGltYWdlcyAmJiBpbWFnZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCB0ZXh0ID0gXCJcIjtcbiAgICAgICAgICAgICAgICBpbWFnZXMuZm9yRWFjaChpbWFnZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQoaW1hZ2UpICYmICFWaXNVdGlsLmlzTm9kZVByZXNlbnRhdGlvbmFsKGltYWdlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWUoaW1hZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhaXIgJiYgcGFpci5uYW1lICYmIHBhaXIubmFtZS50cmltKCkubGVuZ3RoID4gMCkgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCArPSBcIiBcIiArIHBhaXIubmFtZS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAodGV4dC50cmltKCkgIT09ICcnKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1wibmFtZVwiOnRleHQudHJpbSgpLCBcIm5hbWVGcm9tXCI6IFwiYWx0XCJ9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gb3B0Z3JvdXBcbiAgICAgICAgLy8gbGFiZWwgcGFydGljaXBhdGUgaW4gYWNjZXNzaWJsZSBuYW1lIGNhbGN1bGF0aW9uOiBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbC1hYW0tMS4wLyNhdHQtbGFiZWxcbiAgICAgICAgLy8gVGhlIGxhYmVsIGF0dHJpYnV0ZSBtdXN0IGJlIHNwZWNpZmllZC4gSXRzIHZhbHVlIGdpdmVzIHRoZSBuYW1lIG9mIHRoZSBncm91cFxuICAgICAgICAvLyB0aGUgdmFsdWUgaXMgZGlzYWJsZWQgaW4gdGhlIGludGVyZmFjZVxuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwib3B0Z3JvdXBcIiB8fCBub2RlTmFtZSA9PT0gXCJvcHRpb25cIiB8fCBub2RlTmFtZSA9PT0gXCJ0cmFja1wiKSB7XG4gICAgICAgICAgICBjb25zdCBsYWJlbCA9IGVsZW0uZ2V0QXR0cmlidXRlKFwibGFiZWxcIik7XG4gICAgICAgICAgICBpZiAobGFiZWwgJiYgbGFiZWwudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjpDb21tb25VdGlsLnRydW5jYXRlVGV4dChsYWJlbCksIFwibmFtZUZyb21cIjogXCJsYWJlbFwifTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHN2Z1xuICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwic3ZnXCIpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWVGb3JTVkdFbGVtZW50VzNDKGVsZW0pO1xuICAgICAgICAgICAgaWYgKHBhaXIgJiYgcGFpci5uYW1lICYmIHBhaXIubmFtZS50cmltKCkubGVuZ3RoID4gMCkgXG4gICAgICAgICAgICAgICAgcmV0dXJuIHBhaXI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gY2FsY3VsYXRlIGFjY2Vzc2libGUgbmFtZSBmb3IgbmF0aXZlIGVsZW1lbnRzXG4gICAgcHVibGljIHN0YXRpYyBjb21wdXRlQWNjZXNzaWJsZU5hbWVGb3JTVkdFbGVtZW50KGVsZW06IEVsZW1lbnQpIDogQWNjZXNzaWJsZU5hbWVSZXN1bHQgfCBudWxsIHtcbiAgICAgICAgLy8gMS4gYSBkaXJlY3QgY2hpbGQgb3IgZGVzY2VuZGFudCB0aXRsZSBlbGVtZW50IFxuICAgICAgICBjb25zdCBzdmdUaXRsZXMgPSBlbGVtLnF1ZXJ5U2VsZWN0b3JBbGwoXCI6c2NvcGUgPiB0aXRsZVwiKTtcbiAgICAgICAgaWYgKHN2Z1RpdGxlcyAmJiBzdmdUaXRsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGV0IHRleHQgPSBcIlwiO1xuICAgICAgICAgICAgc3ZnVGl0bGVzLmZvckVhY2goc3ZnVGl0bGUgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChzdmdUaXRsZSAmJiAhVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQoc3ZnVGl0bGUpICYmICFWaXNVdGlsLmlzTm9kZVByZXNlbnRhdGlvbmFsKHN2Z1RpdGxlKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0aXRsZSA9IHN2Z1RpdGxlLnRleHRDb250ZW50O1xuICAgICAgICAgICAgICAgICAgICBpZiAodGl0bGUgJiYgdGl0bGUudHJpbSgpICE9PSAnJylcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgKz0gdGl0bGUudHJpbSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHRleHQgJiYgdGV4dC50cmltKCkgIT09ICcnKVxuICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjp0ZXh0LnRyaW0oKSwgXCJuYW1lRnJvbVwiOiBcInN2Z1RpdGxlXCJ9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gMi4geGxpbms6dGl0bGUgYXR0cmlidXRlIG9uIGEgbGlua1xuICAgICAgICBsZXQgbGlua1RpdGxlID0gZWxlbS5xdWVyeVNlbGVjdG9yKFwiYVwiKTtcbiAgICAgICAgaWYgKGxpbmtUaXRsZSAmJiAhVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQobGlua1RpdGxlKSAmJiAhVmlzVXRpbC5pc05vZGVQcmVzZW50YXRpb25hbChsaW5rVGl0bGUpKSB7XG4gICAgICAgICAgICBsZXQgbGluayA9IGxpbmtUaXRsZS5nZXRBdHRyaWJ1dGUoXCJ4bGluazp0aXRsZVwiKTtcbiAgICAgICAgICAgIGlmIChsaW5rICYmIGxpbmsudHJpbSgpICE9PSAnJylcbiAgICAgICAgICAgICAgICByZXR1cm4ge1wibmFtZVwiOkNvbW1vblV0aWwudHJ1bmNhdGVUZXh0KGxpbmspLCBcIm5hbWVGcm9tXCI6IFwic3ZnbGlua1RpdGxlXCJ9O1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqIDMuIGZvciB0ZXh0IGNvbnRhaW5lciBlbGVtZW50cywgdGhlIHRleHQgY29udGVudC4gXG4gICAgICAgICAqIG5vdGUgdGhlIFNWRyB0ZXh0IGNvbnRlbnQgZWxlbWVudHMgYXJlOiDigJh0ZXh04oCZLCDigJh0ZXh0UGF0aOKAmSBhbmQg4oCYdHNwYW7igJkuXG4gICAgICAgICAqICBzdmcgZWxlbWVudCBjYW4gYmUgbmVzdGVkLiBPbmUgb2YgdGhlIHB1cnBvc2VzIGlzIHRvIHRvIGdyb3VwIFNWRyBzaGFwZXMgdG9nZXRoZXIgYXMgYSBjb2xsZWN0aW9uIGZvciByZXNwb25zaXZlIGRlc2lnbi5cbiAgICAgICAgICogXG4gICAgICAgICAqIHNlbGVjdCB0ZXh0IGNvbnRlbnQgZXhjbHVkZWQgdGhlIHRleHQgZnJvbSB0aGUgbmVzdGVkIHN2ZyBlbGVtZW50cyBhbmQgdGhlaXIgY2hpbGRyZW4gXG4gICAgICAgICAqLyBcbiAgICAgICAgbGV0IHRleHQgPSBcIlwiO1xuICAgICAgICBlbGVtLnF1ZXJ5U2VsZWN0b3JBbGwoXCI6c2NvcGUgPiAqXCIpLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGlmIChlbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgIT09ICdzdmcnICYmICFWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChlbGVtZW50KSAmJiAhVmlzVXRpbC5pc05vZGVQcmVzZW50YXRpb25hbChlbGVtZW50KSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gQ29tbW9uVXRpbC5nZXRJbm5lclRleHQoZWxlbWVudCk7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlICYmIHZhbHVlLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9IHZhbHVlO1xuICAgICAgICAgICAgfSAgICBcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICh0ZXh0LnRyaW0oKSAhPT0gJycpXG4gICAgICAgICAgICByZXR1cm4ge1wibmFtZVwiOkNvbW1vblV0aWwudHJ1bmNhdGVUZXh0KHRleHQpLCBcIm5hbWVGcm9tXCI6IFwic3ZnVGV4dFwifTsgXG5cbiAgICAgICAgLy8gNC4gZnJvbSBhcmlhLWRlc2NyaWJlZGJ5IG9yIGFyaWEtZGVzY3JpcHRpb24gXG4gICAgICAgIGxldCBkZXNjYnkgPSBBcmlhVXRpbC5nZXRBcmlhRGVzY3JpcHRpb24oZWxlbSk7XG4gICAgICAgIGlmIChkZXNjYnkgJiYgZGVzY2J5LnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjpDb21tb25VdGlsLnRydW5jYXRlVGV4dChkZXNjYnkpLCBcIm5hbWVGcm9tXCI6IFwiYXJpYS1kZXNjcmlwdGlvblwifTtcblxuICAgICAgICAvLyA1LiBhIGRpcmVjdCBjaGlsZCBvciBkZXNjZW5kYW50IGRlc2MgZWxlbWVudFxuICAgICAgICBsZXQgZGVzY0VsZW1zID0gZWxlbS5xdWVyeVNlbGVjdG9yQWxsKFwiOnNjb3BlID4gZGVzY1wiKTtcbiAgICAgICAgaWYgKGRlc2NFbGVtcyAmJiBkZXNjRWxlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGV0IHRleHQgPSBcIlwiO1xuICAgICAgICAgICAgZGVzY0VsZW1zLmZvckVhY2goZGVzY0VsZW0gPT4ge1xuICAgICAgICAgICAgICAgIGlmIChkZXNjRWxlbSAmJiAhVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQoZGVzY0VsZW0pICYmICFWaXNVdGlsLmlzTm9kZVByZXNlbnRhdGlvbmFsKGRlc2NFbGVtKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXNjID0gZGVzY0VsZW0udGV4dENvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkZXNjICYmIGRlc2MudHJpbSgpICE9PSAnJylcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgKz0gZGVzYy50cmltKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAodGV4dCAmJiB0ZXh0LnRyaW0oKSAhPT0gJycpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjp0ZXh0LnRyaW0oKSwgXCJuYW1lRnJvbVwiOiBcInN2Z0Rlc2NcIn07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBjYWxjdWxhdGUgYWNjZXNzaWJsZSBuYW1lIGZvciBjdXN0b20gZWxlbWVudHMgbWFya2VkIHdpdGggYXJpYVxuICAgIHB1YmxpYyBzdGF0aWMgY29tcHV0ZUFjY2Vzc2libGVOYW1lRnJvbUNvbnRlbnQoZWxlbTogRWxlbWVudCkgOiBBY2Nlc3NpYmxlTmFtZVJlc3VsdCB8IG51bGwge1xuICAgICAgICBjb25zdCBub2RlTmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgY29uc3Qgcm9sZSA9IEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZShlbGVtKTtcbiAgICAgICAgLyoqIGZvciBhY2MgbmFtZSBmcm9tIGNvbnRlbnQsIHRoZSBjb250ZW50IGZyb20gQ1NTIHBzZXVkby1lbGVtZW50cyBcbiAgICAgICAgICogIDpiZWZvcmUgYW5kIDphZnRlciBwc2V1ZG8gZWxlbWVudHMgW0NTUzJdIGNhbiBwcm92aWRlIHRleHR1YWwgY29udGVudCBmb3IgZWxlbWVudHMgdGhhdCBoYXZlIGEgY29udGVudCBtb2RlbC5cbiAgICAgICAgICogRm9yIDpiZWZvcmUgb3IgOmFmdGVyIHBzZXVkbyBlbGVtZW50cywgdXNlciBhZ2VudHMgbXVzdCBwcmVwZW5kIENTUyB0ZXh0dWFsIGNvbnRlbnQsIHdpdGhvdXQgYSBzcGFjZSwgXG4gICAgICAgICAqICAgdG8gdGhlIHRleHR1YWwgY29udGVudCBvZiB0aGUgY3VycmVudCBub2RlLlxuICAgICAgICAgKi9cbiAgICAgICAgbGV0IHBhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWVGb3JDU1NQc2V1ZG9FbGVtZW50KGVsZW0sIFwiYmVmb3JlXCIpO1xuICAgICAgICBpZiAocGFpciAhPT0gbnVsbCAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgcmV0dXJuIHBhaXI7XG5cbiAgICAgICAgcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZUZvckNTU1BzZXVkb0VsZW1lbnQoZWxlbSwgXCJhZnRlclwiKTtcbiAgICAgICAgaWYgKHBhaXIgJiYgcGFpci5uYW1lICYmIHBhaXIubmFtZS50cmltKCkubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHJldHVybiBwYWlyO1xuXG4gICAgICAgIC8vICBzaGFkb3cgaG9zdFxuICAgICAgICBpZiAoZWxlbS5zaGFkb3dSb290KSB7XG4gICAgICAgICAgICBwYWlyID0gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lRm9yU2hhZG93SG9zdChlbGVtKTtcbiAgICAgICAgICAgIGlmIChwYWlyICYmIHBhaXIubmFtZSAmJiBwYWlyLm5hbWUudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjogcGFpci5uYW1lLCBcIm5hbWVGcm9tXCI6IFwic2hhZG93XCJ9OztcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgLy8gc2xvdCBlbGVtZW50XG4gICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJzbG90XCIpIHtcbiAgICAgICAgICAgIHBhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWVGb3JTbG90RWxlbWVudChlbGVtKTtcbiAgICAgICAgICAgIGlmIChwYWlyICYmIHBhaXIubmFtZSAmJiBwYWlyLm5hbWUudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjogcGFpci5uYW1lLCBcIm5hbWVGcm9tXCI6IFwic2xvdFwifTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIG90aGVyd2lzZTogZ2V0IHRoZSB2YWx1ZSBmcm9tIHRoZSBlbGVtZW50XG4gICAgICAgIHBhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWVGcm9tQ2hpbGRyZW4oZWxlbSk7XG4gICAgICAgIGlmIChwYWlyICYmIHBhaXIubmFtZSAmJiBwYWlyLm5hbWUudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICByZXR1cm4ge1wibmFtZVwiOiBwYWlyLm5hbWUsIFwibmFtZUZyb21cIjogXCJjb250ZW50XCJ9O1xuXG4gICAgICAgIC8vIG5vIGFjY2Vzc2libGUgbmFtZSBleGlzdHNcbiAgICAgICAgcmV0dXJuIG51bGw7ICAgIFxuICAgIH1cblxuICAgIC8vIGNhbGN1bGF0ZSBhY2Nlc3NpYmxlIG5hbWUgZnJvbSBDU1MgZ2VuZXJhdGVkIGNvbnRlbnRcbiAgICBwdWJsaWMgc3RhdGljIGNvbXB1dGVBY2Nlc3NpYmxlTmFtZUZvckNTU1BzZXVkb0VsZW1lbnQoZWxlbTogRWxlbWVudCwgdHlwZTpzdHJpbmcpIDogQWNjZXNzaWJsZU5hbWVSZXN1bHQgfCBudWxsIHtcbiAgICAgICAgY29uc3QgY29udGVudEVsZW0gPSBlbGVtLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtLHR5cGUpO1xuICAgICAgICBpZiAoY29udGVudEVsZW0pIHtcbiAgICAgICAgICAgIGxldCBjb250ZW50ID0gY29udGVudEVsZW0uY29udGVudDtcbiAgICAgICAgICAgIGlmIChjb250ZW50ICYmIGNvbnRlbnQgIT09IFwibm9uZVwiICYmIGNvbnRlbnQgIT09IFwibm9cIiAmJiBjb250ZW50ICE9PSBcIm5vcm1hbFwiKSB7XG4gICAgICAgICAgICAgICAgY29udGVudCA9IGNvbnRlbnQucmVwbGFjZSgvXlwiLyxcIlwiKS5yZXBsYWNlKC9cIiQvLFwiXCIpO1xuICAgICAgICAgICAgICAgIGlmIChjb250ZW50LnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1wibmFtZVwiOiBDb21tb25VdGlsLnRydW5jYXRlVGV4dChjb250ZW50KSwgXCJuYW1lRnJvbVwiOiBcImNzcy1cIit0eXBlfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBjYWxjdWxhdGUgYWNjZXNzaWJsZSBuYW1lIGZvciBTTE9UIGVsZW1lbnRcbiAgICBwdWJsaWMgc3RhdGljIGNvbXB1dGVBY2Nlc3NpYmxlTmFtZUZvclNoYWRvd0hvc3QoZWxlbTogRWxlbWVudCkgOiBBY2Nlc3NpYmxlTmFtZVJlc3VsdCB8IG51bGwge1xuICAgICAgICBsZXQgdGV4dCA9IFwiXCI7XG4gICAgICAgIGNvbnN0IHNoYWRvd1Jvb3QgPSBlbGVtLnNoYWRvd1Jvb3Q7XG4gICAgICAgIGlmIChzaGFkb3dSb290KSB7XG4gICAgICAgICAgICBsZXQgY2hpbGRyZW4gPSBzaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGwoJyonKTsgICBcbiAgICAgICAgICAgIC8vIGNoZWNrIHRleHQgZnJvbSBhbGwgdGhlIGNoaWxkcmVuIGVsZW1lbnRzXG4gICAgICAgICAgICBjaGlsZHJlbi5mb3JFYWNoKGNoaWxkID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYWlyID0gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lKGNoaWxkKTtcbiAgICAgICAgICAgICAgICBpZiAocGFpciAmJiBwYWlyLm5hbWUgJiYgcGFpci5uYW1lLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9IFwiIFwiICsgcGFpci5uYW1lLnRyaW0oKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0ZXh0LnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgcmV0dXJuIHtcIm5hbWVcIjogQ29tbW9uVXRpbC50cnVuY2F0ZVRleHQodGV4dCksIFwibmFtZUZyb21cIjogXCJzaGFkb3ctaG9zdFwifTtcblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBjYWxjdWxhdGUgYWNjZXNzaWJsZSBuYW1lIGZvciBTTE9UIGVsZW1lbnRcbiAgICBwdWJsaWMgc3RhdGljIGNvbXB1dGVBY2Nlc3NpYmxlTmFtZUZvclNsb3RFbGVtZW50KGVsZW06IEVsZW1lbnQpIDogQWNjZXNzaWJsZU5hbWVSZXN1bHQgfCBudWxsIHtcbiAgICAgICAgLy9pZiBubyBhc3NpZ25lZE5vZGUsIGNoZWNrIGl0cyBvd24gdGV4dCBcbiAgICAgICAgbGV0IHRleHQgPSBcIlwiO1xuICAgICAgICBpZiAoIShlbGVtIGFzIEhUTUxTbG90RWxlbWVudCkuYXNzaWduZWROb2RlcygpIHx8IChlbGVtIGFzIEhUTUxTbG90RWxlbWVudCkuYXNzaWduZWROb2RlcygpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgY29uc3QgcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZShlbGVtKTtcbiAgICAgICAgICAgIGlmIChwYWlyICYmIHBhaXIubmFtZSAmJiBwYWlyLm5hbWUudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgdGV4dCArPSBcIiBcIiArIHBhaXIubmFtZS50cmltKCk7XG4gICAgICAgIH0gZWxzZSB7ICAgIFxuICAgICAgICAgICAgLy8gY2hlY2sgdGV4dCBmcm9tIGFsbCBhc3NpZ25lZCBub2Rlc1xuICAgICAgICAgICAgZm9yIChjb25zdCBzbG90Q2hpbGQgb2YgKGVsZW0gYXMgSFRNTFNsb3RFbGVtZW50KS5hc3NpZ25lZE5vZGVzKCkpIHtcbiAgICAgICAgICAgICAgICBsZXQgcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZShzbG90Q2hpbGQgYXMgRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgaWYgKHBhaXIgJiYgcGFpci5uYW1lICYmIHBhaXIubmFtZS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9IFwiIFwiICsgcGFpci5uYW1lLnRyaW0oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGV4dC50cmltKCkubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHJldHVybiB7XCJuYW1lXCI6IENvbW1vblV0aWwudHJ1bmNhdGVUZXh0KHRleHQpLCBcIm5hbWVGcm9tXCI6IFwiY29udGVudC1zbG90XCJ9O1xuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIGNhbGN1bGF0ZSBhY2Nlc3NpYmxlIG5hbWUgZnJvbSBjaGlsZHJlbiBjb250ZW50XG4gICAgcHVibGljIHN0YXRpYyBjb21wdXRlQWNjZXNzaWJsZU5hbWVGcm9tQ2hpbGRyZW4oZWxlbTogRWxlbWVudCkgOiBBY2Nlc3NpYmxlTmFtZVJlc3VsdCB8IG51bGwge1xuICAgICAgICBsZXQgdGV4dCA9IFwiXCI7XG5cbiAgICAgICAgLy9sZXQgd2Fsa0NoaWxkID0gZWxlbS5maXJzdENoaWxkO1xuICAgICAgICBsZXQgbncgPSBuZXcgRE9NV2Fsa2VyKGVsZW0pO1xuICAgICAgICAvLyBMb29wIG92ZXIgYWxsIHRoZSBjaGlsZHJlbnMgb2YgdGhlIGVsZW1lbnQgdG8gZ2V0IHRoZSB0ZXh0XG4gICAgICAgIHdoaWxlIChudy5uZXh0Tm9kZSgpICYmIG53Lm5vZGUgIT09IGVsZW0gJiYgbncubm9kZSAhPT0gZWxlbS5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICBpZiAobncuYkVuZFRhZykgY29udGludWU7XG4gICAgICAgIC8vd2hpbGUgKHdhbGtDaGlsZCkgeyBcbiAgICAgICAgICAgIGNvbnN0IHdhbGtDaGlsZCA9IG53Lm5vZGU7IFxuICAgICAgICAgICAgaWYgKHdhbGtDaGlsZC5ub2RlVHlwZSA9PT0gMykge1xuICAgICAgICAgICAgICAgIC8vIGZvciB0aGUgdGV4dCBub2RlLCBnZXQgdGhlIHBhcmVudG5vZGUgdG8gY2hlY2sgdmlzaWJpbGl0eVxuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IHdhbGtDaGlsZC5wYXJlbnRFbGVtZW50O1xuICAgICAgICAgICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQocGFyZW50KSAmJiAhVmlzVXRpbC5pc05vZGVQcmVzZW50YXRpb25hbChwYXJlbnQpICYmIHdhbGtDaGlsZC5ub2RlVmFsdWUgJiYgd2Fsa0NoaWxkLm5vZGVWYWx1ZS50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9IFwiIFwiICsgd2Fsa0NoaWxkLm5vZGVWYWx1ZS50cmltKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHdhbGtDaGlsZC5ub2RlVHlwZSA9PT0gMSAmJiAhVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQod2Fsa0NoaWxkIGFzIEhUTUxFbGVtZW50KSAmJiAhVmlzVXRpbC5pc05vZGVQcmVzZW50YXRpb25hbCh3YWxrQ2hpbGQgYXMgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZSh3YWxrQ2hpbGQgYXMgRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgaWYgKHBhaXIgJiYgcGFpci5uYW1lICYmIHBhaXIubmFtZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRleHQgKz0gXCIgXCIgKyBwYWlyLm5hbWUudHJpbSgpO1xuICAgICAgICAgICAgICAgICAgICBudy5iRW5kVGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gU2tpcCBjaGlsZHJlbiBpZiB0aGlzIGVsZW1lbnQgb25seSBoYXMgcHJlc2VudGF0aW9uYWwgY2hpbGRyZW5cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChBcmlhVXRpbC5jb250YWluc1ByZXNlbnRhdGlvbmFsQ2hpbGRyZW5Pbmx5KG53Lm5vZGUgYXMgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIG53LmJFbmRUYWcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGV4dC50cmltKCkubGVuZ3RoID4gMClcbiAgICAgICAgICAgIHJldHVybiB7XCJuYW1lXCI6IENvbW1vblV0aWwudHJ1bmNhdGVUZXh0KHRleHQpLCBcIm5hbWVGcm9tXCI6IFwiY29udGVudFwifTtcblxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBpZiBhY2Nlc3NpYmxlIG5hbWUgY2FuIGJlIGlnbm9yZWQgZm9yIGltYWdlIG9yIHN2Z1xuICAgIHB1YmxpYyBzdGF0aWMgaXNBY2Nlc3NpYmxlTmFtZUlnbm9yYWJsZShlbGVtOiBFbGVtZW50KSA6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIWVsZW0pIHJldHVybiBmYWxzZTtcblxuICAgICAgICBjb25zdCBub2RlTmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKG5vZGVOYW1lICE9PSAnaW1nJyAmJiBub2RlTmFtZSAhPT0gJ3N2ZycpIHJldHVybiBmYWxzZTtcbiAgICAgICAgXG4gICAgICAgIGxldCBwYXJlbnQgPSBlbGVtLnBhcmVudEVsZW1lbnQ7XG4gICAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgICAgIC8vIGlmIHRoZSBwYXJlbnQgaXMgYSB3aWRnZXQgYW5kIGhhcyBhbiBhcmlhIGxhYmVsLCB0aGVuIGltYWdlL3N2ZyBsYWJlbCBpcyBub3QgbmVjZXNzYXJ5XG4gICAgICAgICAgICBpZiAoKEFyaWFVdGlsLmlzV2lkZ2V0KHBhcmVudCkgfHwgQXJpYVV0aWwuY29udGFpbnNQcmVzZW50YXRpb25hbENoaWxkcmVuT25seShwYXJlbnQpKSAmJiBBcmlhVXRpbC5oYXNBcmlhTGFiZWwocGFyZW50KSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn0gXG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgIENvcHlyaWdodDo6IDIwMjAtIElCTSwgSW5jXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgQVJJQURlZmluaXRpb25zLCBJRG9jdW1lbnRDb25mb3JtYW5jZVJlcXVpcmVtZW50IH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQURlZmluaXRpb25zXCI7XG5pbXBvcnQgeyBBUklBTWFwcGVyIH0gZnJvbSBcIi4uLy4uL3YyL2FyaWEvQVJJQU1hcHBlclwiO1xuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01XYWxrZXJcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi9WaXNVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4vQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgQWNjTmFtZVV0aWwgfSBmcm9tIFwiLi9BY2NOYW1lVXRpbFwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG5pbXBvcnQgeyBET01VdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01VdGlsXCI7XG5cbmV4cG9ydCBjbGFzcyBBcmlhVXRpbCB7XG5cbiAgICAvLyBUaGlzIGxpc3QgY29udGFpbnMgYSBsaXN0IG9mIGVsZW1lbnRzIHRhZ3Mgd2hpY2ggaGF2ZSBkaXNwbGF5OiBub25lIGJ5IGRlZmF1bHQsIHNpbmNlIHdlIGhhdmUgcnVsZXMgdHJpZ2dlcmluZ1xuICAgIHB1YmxpYyBzdGF0aWMgbmF2TGlua0tleXdvcmRzID0gWydzdGFydCcsICduZXh0JywgJ3ByZXYnLCAncHJldmlvdXMnLCAnY29udGVudHMnLCAnaW5kZXgnXVxuXG4gICAgLy8gVGhpcyBsaXN0IGNvbnRhaW5zIGEgbGlzdCBvZiBydWxlIGlkcyBmb3IgdGhlIHJ1bGVzIHRoYXQgaGF2ZSB0byBjaGVjayBmb3IgaGlkZGVuIGNvbnRlbnQgcmVnYXJkbGVzcyBvZiB0aGUgQ2hlY2sgSGlkZGVuXG4gICAgLy8gQ29udGVudCBTZXR0aW5nLiBUaGlzIG1lYW5zIHRoYXQgd2hlbiB0aGUgZW5naW5lIGlzIGFjdHVhbGx5IGRldGVybWluZSB3aGljaCBlbGVtZW50cyB0byBtYXNzIHRvIHRoZSBydWxlcywgaXQgd2lsbCBhbHdheXNcbiAgICAvLyBwYXNzIHRoZXNlcyBydWxlcyBubyBtYXR0ZXIgd2hhdCB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgU2V0dGluZyBpcy5cbiAgICBwdWJsaWMgc3RhdGljIHJ1bGVzVGhhdEhhdmVUb0NoZWNrSGlkZGVuID0gWydSUFRfRWxlbV9VbmlxdWVJZCddXG5cbiAgICBwdWJsaWMgc3RhdGljIGlzRGVmaW5lZEFyaWFBdHRyaWJ1dGVBdEluZGV4KGVsZSwgaW5kZXgpIHtcbiAgICAgICAgbGV0IGF0dHJOYW1lID0gZWxlLmF0dHJpYnV0ZXNbaW5kZXhdLm5hbWU7XG4gICAgICAgIHJldHVybiBBcmlhVXRpbC5pc0RlZmluZWRBcmlhQXR0cmlidXRlKGVsZSwgYXR0ck5hbWUpO1xuICAgIH1cblxuICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93YWktYXJpYS0xLjEvI2ludHJvc3RhdGVzXG4gICAgcHVibGljIHN0YXRpYyBhcmlhQXR0cmlidXRlUm9sZURlZmF1bHRzID0ge1xuICAgICAgICBcImFsZXJ0XCI6IHtcbiAgICAgICAgICAgIFwiYXJpYS1saXZlXCI6IFwiYXNzZXJ0aXZlXCIsXG4gICAgICAgICAgICBcImFyaWEtYXRvbWljXCI6IFwidHJ1ZVwiXG4gICAgICAgIH0sXG4gICAgICAgIFwiY29tYm9ib3hcIjoge1xuICAgICAgICAgICAgXCJhcmlhLWhhc3BvcHVwXCI6IFwibGlzdGJveFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwibGlzdGJveFwiOiB7XG4gICAgICAgICAgICBcImFyaWEtb3JpZW50YXRpb25cIjogXCJ2ZXJ0aWNhbFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwibG9nXCI6IHtcbiAgICAgICAgICAgIFwiYXJpYS1saXZlXCI6IFwicG9saXRlXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJtZW51XCI6IHtcbiAgICAgICAgICAgIFwiYXJpYS1vcmllbnRhdGlvblwiOiBcInZlcnRpY2FsXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJtZW51YmFyXCI6IHtcbiAgICAgICAgICAgIFwiYXJpYS1vcmllbnRhdGlvblwiOiBcImhvcml6b250YWxcIlxuICAgICAgICB9LFxuICAgICAgICBcIm1ldGVyXCI6IHtcbiAgICAgICAgICAgIFwiYXJpYS12YWx1ZW1pblwiOiBcIjBcIixcbiAgICAgICAgICAgIFwiYXJpYS12YWx1ZW1heFwiOiBcIjEwMFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwib3B0aW9uXCI6IHtcbiAgICAgICAgICAgIFwiYXJpYS1zZWxlY3RlZFwiOiBcImZhbHNlXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJwcm9ncmVzc2JhclwiOiB7XG4gICAgICAgICAgICBcImFyaWEtdmFsdWVtaW5cIjogXCIwXCIsXG4gICAgICAgICAgICBcImFyaWEtdmFsdWVtYXhcIjogXCIxMDBcIlxuICAgICAgICB9LFxuICAgICAgICBcInNjcm9sbGJhclwiOiB7XG4gICAgICAgICAgICBcImFyaWEtb3JpZW50YXRpb25cIjogXCJ2ZXJ0aWNhbFwiLFxuICAgICAgICAgICAgXCJhcmlhLXZhbHVlbWluXCI6IFwiMFwiLFxuICAgICAgICAgICAgXCJhcmlhLXZhbHVlbWF4XCI6IFwiMTAwXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJzZXBhcmF0b3JcIjoge1xuICAgICAgICAgICAgXCJhcmlhLW9yaWVudGF0aW9uXCI6IFwiaG9yaXpvbnRhbFwiLFxuICAgICAgICAgICAgXCJhcmlhLXZhbHVlbWluXCI6IFwiMFwiLFxuICAgICAgICAgICAgXCJhcmlhLXZhbHVlbWF4XCI6IFwiMTAwXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJzbGlkZXJcIjoge1xuICAgICAgICAgICAgXCJhcmlhLW9yaWVudGF0aW9uXCI6IFwiaG9yaXpvbnRhbFwiLFxuICAgICAgICAgICAgXCJhcmlhLXZhbHVlbWluXCI6IFwiMFwiLFxuICAgICAgICAgICAgXCJhcmlhLXZhbHVlbWF4XCI6IFwiMTAwXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJzcGluYnV0dG9uXCI6IHtcbiAgICAgICAgICAgIC8vIE5vdCBzdXJlIGhvdyB0byBlbmNvZGUgbWluL21heCAob3Igbm93IGluIDEuMiAtIFwiaGFzIG5vIHZhbHVlXCIpXG4gICAgICAgICAgICAvL1wiYXJpYS12YWx1ZW5vd1wiOiBcIjBcIiBUT0RPOiBhdCByaXNrOiBtYXliZSBkZWxldGUgYWZ0ZXIgQVJJQSAxLjIgcmVhY2hlcyBwcm9wb3NlZCByZWNcbiAgICAgICAgICAgIC8vIFByb2JhYmx5IGp1c3QgZGVsZXRlIHNwaW5idXR0b24gZnJvbSB0aGlzIGxpc3QgY29tcGxldGVseSBhbmQgbGV0IHVzZXIgYWdlbnRzIGhhbmRsZSBcImRlZmF1bHRzXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJzdGF0dXNcIjoge1xuICAgICAgICAgICAgXCJhcmlhLWxpdmVcIjogXCJwb2xpdGVcIixcbiAgICAgICAgICAgIFwiYXJpYS1hdG9taWNcIjogXCJ0cnVlXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJ0YWJcIjoge1xuICAgICAgICAgICAgXCJhcmlhLXNlbGVjdGVkXCI6IFwiZmFsc2VcIlxuICAgICAgICB9LFxuICAgICAgICBcInRhYmxpc3RcIjoge1xuICAgICAgICAgICAgXCJhcmlhLW9yaWVudGF0aW9uXCI6IFwiaG9yaXpvbnRhbFwiXG4gICAgICAgIH0sXG4gICAgICAgIFwidG9vbGJhclwiOiB7XG4gICAgICAgICAgICBcImFyaWEtb3JpZW50YXRpb25cIjogXCJob3Jpem9udGFsXCJcbiAgICAgICAgfSxcbiAgICAgICAgXCJ0cmVlXCI6IHtcbiAgICAgICAgICAgIFwiYXJpYS1vcmllbnRhdGlvblwiOiBcInZlcnRpY2FsXCJcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93YWktYXJpYS0xLjEvI2FyaWEtYXRvbWljXG4gICAgcHVibGljIHN0YXRpYyBhcmlhQXR0cmlidXRlR2xvYmFsRGVmYXVsdHMgPSB7XG4gICAgICAgIFwiYXJpYS1hdG9taWNcIjogXCJmYWxzZVwiLFxuICAgICAgICBcImFyaWEtYXV0b2NvbXBsZXRlXCI6IFwibm9uZVwiLFxuICAgICAgICBcImFyaWEtYnVzeVwiOiBcImZhbHNlXCIsXG4gICAgICAgIFwiYXJpYS1jaGVja2VkXCI6IHVuZGVmaW5lZCxcbiAgICAgICAgXCJhcmlhLWN1cnJlbnRcIjogXCJmYWxzZVwiLFxuICAgICAgICBcImFyaWEtZGlzYWJsZWRcIjogXCJmYWxzZVwiLFxuICAgICAgICBcImFyaWEtZHJvcGVmZmVjdFwiOiBcIm5vbmVcIixcbiAgICAgICAgXCJhcmlhLWV4cGFuZGVkXCI6IHVuZGVmaW5lZCxcbiAgICAgICAgXCJhcmlhLWdyYWJiZWRcIjogdW5kZWZpbmVkLFxuICAgICAgICBcImFyaWEtaGFzcG9wdXBcIjogXCJmYWxzZVwiLFxuICAgICAgICBcImFyaWEtaGlkZGVuXCI6IHVuZGVmaW5lZCxcbiAgICAgICAgXCJhcmlhLWludmFsaWRcIjogXCJmYWxzZVwiLFxuICAgICAgICBcImFyaWEtbGl2ZVwiOiBcIm9mZlwiLFxuICAgICAgICBcImFyaWEtbW9kYWxcIjogXCJmYWxzZVwiLFxuICAgICAgICBcImFyaWEtbXVsdGlsaW5lXCI6IFwiZmFsc2VcIixcbiAgICAgICAgXCJhcmlhLW11bHRpc2VsZWN0YWJsZVwiOiBcImZhbHNlXCIsXG4gICAgICAgIFwiYXJpYS1vcmllbnRhdGlvblwiOiB1bmRlZmluZWQsXG4gICAgICAgIFwiYXJpYS1wcmVzc2VkXCI6IHVuZGVmaW5lZCxcbiAgICAgICAgXCJhcmlhLXJlYWRvbmx5XCI6IFwiZmFsc2VcIixcbiAgICAgICAgLy9cImFyaWEtcmVsZXZhbnRcIjogXCJhZGRpdGlvbnMgdGV4dFwiLCBUT0RPOiBhcmUgbXVsdGlwbGUgdmFsdWVzIHN1cHBvcnRlZD9cbiAgICAgICAgXCJhcmlhLXJlcXVpcmVkXCI6IFwiZmFsc2VcIixcbiAgICAgICAgXCJhcmlhLXNlbGVjdGVkXCI6IHVuZGVmaW5lZCxcbiAgICAgICAgXCJhcmlhLXNvcnRcIjogXCJub25lXCJcbiAgICB9XG5cbiAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbC1hYW0tMS4wLyNodG1sLWF0dHJpYnV0ZS1zdGF0ZS1hbmQtcHJvcGVydHktbWFwcGluZ3NcbiAgICBwdWJsaWMgc3RhdGljIGFyaWFBdHRyaWJ1dGVJbXBsaWNpdE1hcHBpbmdzID0ge1xuICAgICAgICBcImFyaWEtYXV0b2NvbXBsZXRlXCI6IHtcbiAgICAgICAgICAgIFwiZm9ybVwiOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcIm9mZlwiID09PSBlLmdldEF0dHJpYnV0ZShcImF1dG9jb21wbGV0ZVwiKSA/IFwibm9uZVwiIDogXCJib3RoXCI7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJpbnB1dFwiOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBcIm9mZlwiID09PSBlLmdldEF0dHJpYnV0ZShcImF1dG9jb21wbGV0ZVwiKSA/IFwibm9uZVwiIDogXCJib3RoXCI7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJzZWxlY3RcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJvZmZcIiA9PT0gZS5nZXRBdHRyaWJ1dGUoXCJhdXRvY29tcGxldGVcIikgPyBcIm5vbmVcIiA6IFwiYm90aFwiO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwidGV4dGFyZWFcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJvZmZcIiA9PT0gZS5nZXRBdHRyaWJ1dGUoXCJhdXRvY29tcGxldGVcIikgPyBcIm5vbmVcIiA6IFwiYm90aFwiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtY2hlY2tlZFwiOiB7XG4gICAgICAgICAgICBcImlucHV0XCI6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGUuaGFzQXR0cmlidXRlKFwiaW5kZXRlcm1pbmF0ZVwiKSkgcmV0dXJuIFwibWl4ZWRcIjtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJcIiArIGUuaGFzQXR0cmlidXRlKFwiY2hlY2tlZFwiKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm1lbnVpdGVtXCI6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGUuaGFzQXR0cmlidXRlKFwiaW5kZXRlcm1pbmF0ZVwiKSkgcmV0dXJuIFwibWl4ZWRcIjtcbiAgICAgICAgICAgICAgICByZXR1cm4gXCJcIiArIGUuaGFzQXR0cmlidXRlKFwiY2hlY2tlZFwiKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIipcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoZS5oYXNBdHRyaWJ1dGUoXCJpbmRldGVybWluYXRlXCIpKSByZXR1cm4gXCJtaXhlZFwiO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLWRpc2FibGVkXCI6IHtcbiAgICAgICAgICAgIFwiYnV0dG9uXCI6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGUuaGFzQXR0cmlidXRlKFwiZGlzYWJsZWRcIikgPyBcInRydWVcIiA6IFwiZmFsc2VcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwiZmllbGRzZXRcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5oYXNBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiKSA/IFwidHJ1ZVwiIDogXCJmYWxzZVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJpbnB1dFwiOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlLmhhc0F0dHJpYnV0ZShcImRpc2FibGVkXCIpID8gXCJ0cnVlXCIgOiBcImZhbHNlXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm9wdGdyb3VwXCI6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGUuaGFzQXR0cmlidXRlKFwiZGlzYWJsZWRcIikgPyBcInRydWVcIiA6IFwiZmFsc2VcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwib3B0aW9uXCI6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGUuaGFzQXR0cmlidXRlKFwiZGlzYWJsZWRcIikgPyBcInRydWVcIiA6IFwiZmFsc2VcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwic2VsZWN0XCI6IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGUuaGFzQXR0cmlidXRlKFwiZGlzYWJsZWRcIikgPyBcInRydWVcIiA6IFwiZmFsc2VcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwidGV4dGFyZWFcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5oYXNBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiKSA/IFwidHJ1ZVwiIDogXCJmYWxzZVwiXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1leHBhbmRlZFwiOiB7XG4gICAgICAgICAgICBcImRldGFpbHNcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5nZXRBdHRyaWJ1dGUoXCJvcGVuXCIpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJkaWFsb2dcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5nZXRBdHRyaWJ1dGUoXCJvcGVuXCIpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiYXJpYS1tdWx0aXNlbGVjdGFibGVcIjoge1xuICAgICAgICAgICAgXCJzZWxlY3RcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoZS5oYXNBdHRyaWJ1dGUoXCJtdWx0aXBsZVwiKSkgcmV0dXJuIFwidHJ1ZVwiO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmlhLXBsYWNlaG9sZGVyXCI6IHtcbiAgICAgICAgICAgIFwiaW5wdXRcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5nZXRBdHRyaWJ1dGUoXCJwbGFjZWhvbGRlclwiKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwidGV4dGFyZWFcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5nZXRBdHRyaWJ1dGUoXCJwbGFjZWhvbGRlclwiKVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcImFyaWEtcmVxdWlyZWRcIjoge1xuICAgICAgICAgICAgXCJpbnB1dFwiOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlLmdldEF0dHJpYnV0ZShcInJlcXVpcmVkXCIpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJzZWxlY3RcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5nZXRBdHRyaWJ1dGUoXCJyZXF1aXJlZFwiKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFwidGV4dGFyZWFcIjogZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZS5nZXRBdHRyaWJ1dGUoXCJyZXF1aXJlZFwiKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogdGhpcyBtZXRob2QgcmV0dXJucyB1c2VyLWRlZmluZWQgYXJpYSBhdHRyaWJ1dGUgbmFtZSBmcm9tIGRvbVxuICAgICAqIEBwYXJhbSBlbGUgIGVsZW1lbnRcbiAgICAgKiBAcmV0dXJucyB1c2VyIGRlZmluZWQgYXJpYSBhdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRVc2VyRGVmaW5lZEFyaWFBdHRyaWJ1dGVzKGVsZW0pIHtcbiAgICAgICAgbGV0IGFyaWFBdHRyaWJ1dGVzID0gW107XG4gICAgICAgIGxldCBkb21BdHRyaWJ1dGVzID0gZWxlbS5hdHRyaWJ1dGVzO1xuICAgICAgICBpZiAoZG9tQXR0cmlidXRlcykge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkb21BdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGF0dHJOYW1lID0gZG9tQXR0cmlidXRlc1tpXS5uYW1lLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIGxldCBpc0FyaWEgPSBhdHRyTmFtZS5zdWJzdHJpbmcoMCwgNSkgPT09ICdhcmlhLSc7XG4gICAgICAgICAgICAgICAgaWYgKGlzQXJpYSlcbiAgICAgICAgICAgICAgICAgICAgYXJpYUF0dHJpYnV0ZXMucHVzaChhdHRyTmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFyaWFBdHRyaWJ1dGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHRoaXMgbWV0aG9kIHJldHVybnMgdXNlci1kZWZpbmVkIGh0bWwgYXR0cmlidXRlIG5hbWUgZnJvbSBkb21cbiAgICAgKiBAcGFyYW0gZWxlICBlbGVtZW50XG4gICAgICogQHJldHVybnMgdXNlciBkZWZpbmVkIGh0bWwgYXR0cmlidXRlc1xuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0VXNlckRlZmluZWRIdG1sQXR0cmlidXRlcyhlbGVtKSB7XG4gICAgICAgIGxldCBodG1sQXR0cmlidXRlcyA9IFtdO1xuICAgICAgICBsZXQgZG9tQXR0cmlidXRlcyA9IGVsZW0uYXR0cmlidXRlcztcbiAgICAgICAgaWYgKGRvbUF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZG9tQXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBhdHRyTmFtZSA9IGRvbUF0dHJpYnV0ZXNbaV0ubmFtZS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBsZXQgaXNBcmlhID0gYXR0ck5hbWUuc3Vic3RyaW5nKDAsIDUpID09PSAnYXJpYS0nO1xuICAgICAgICAgICAgICAgIGlmICghaXNBcmlhKVxuICAgICAgICAgICAgICAgICAgICBodG1sQXR0cmlidXRlcy5wdXNoKGF0dHJOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaHRtbEF0dHJpYnV0ZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogdGhpcyBtZXRob2QgcmV0dXJucyB1c2VyLWRlZmluZWQgYXJpYSBhdHRyaWJ1dGUgbmFtZS12YWx1ZSBwYWlyIGZyb20gZG9tXG4gICAgICogQHBhcmFtIGVsZSAgZWxlbWVudFxuICAgICAqIEByZXR1cm5zIHVzZXIgZGVmaW5lZCBhcmlhIGF0dHJpYnV0ZXNcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldFVzZXJEZWZpbmVkQXJpYUF0dHJpYnV0ZU5hbWVWYWx1ZVBhaXJzKGVsZW0pIHtcbiAgICAgICAgbGV0IGFyaWFBdHRyaWJ1dGVzID0gW107XG4gICAgICAgIGxldCBkb21BdHRyaWJ1dGVzID0gZWxlbS5hdHRyaWJ1dGVzO1xuICAgICAgICBpZiAoZG9tQXR0cmlidXRlcykge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkb21BdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGF0dHJOYW1lID0gZG9tQXR0cmlidXRlc1tpXS5uYW1lLnRyaW0oKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIGxldCBhdHRyVmFsdWUgPSBlbGVtLmdldEF0dHJpYnV0ZShhdHRyTmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKGF0dHJWYWx1ZSA9PT0gJycpIGF0dHJWYWx1ZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgbGV0IGlzQXJpYSA9IGF0dHJOYW1lLnN1YnN0cmluZygwLCA1KSA9PT0gJ2FyaWEtJztcbiAgICAgICAgICAgICAgICBpZiAoaXNBcmlhKVxuICAgICAgICAgICAgICAgICAgICBhcmlhQXR0cmlidXRlcy5wdXNoKHsgbmFtZTogYXR0ck5hbWUsIHZhbHVlOiBhdHRyVmFsdWUgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFyaWFBdHRyaWJ1dGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHRoaXMgbWV0aG9kIHJldHVybnMgdXNlci1kZWZpbmVkIGh0bWwgYXR0cmlidXRlIG5hbWUtdmFsdWUgcGFpciBmcm9tIGRvbVxuICAgICAqIEBwYXJhbSBlbGUgIGVsZW1lbnRcbiAgICAgKiBAcmV0dXJucyB1c2VyIGRlZmluZWQgaHRtbCBhdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRVc2VyRGVmaW5lZEh0bWxBdHRyaWJ1dGVOYW1lVmFsdWVQYWlycyhlbGVtKSB7XG4gICAgICAgIGxldCBodG1sQXR0cmlidXRlcyA9IFtdO1xuICAgICAgICBsZXQgZG9tQXR0cmlidXRlcyA9IGVsZW0uYXR0cmlidXRlcztcbiAgICAgICAgaWYgKGRvbUF0dHJpYnV0ZXMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZG9tQXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBhdHRyTmFtZSA9IGRvbUF0dHJpYnV0ZXNbaV0ubmFtZS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBsZXQgYXR0clZhbHVlID0gZWxlbS5nZXRBdHRyaWJ1dGUoYXR0ck5hbWUpO1xuICAgICAgICAgICAgICAgIGlmIChhdHRyVmFsdWUgPT09ICcnKSBhdHRyVmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgICAgIGxldCBpc0FyaWEgPSBhdHRyTmFtZS5zdWJzdHJpbmcoMCwgNSkgPT09ICdhcmlhLSc7XG4gICAgICAgICAgICAgICAgaWYgKCFpc0FyaWEpXG4gICAgICAgICAgICAgICAgICAgIGh0bWxBdHRyaWJ1dGVzLnB1c2goeyBuYW1lOiBhdHRyTmFtZSwgdmFsdWU6IGF0dHJWYWx1ZSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaHRtbEF0dHJpYnV0ZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBtZXRob2QgaGFuZGxlcyBpbXBsaWNpdCBhcmlhIGRlZmluaXRpb25zLCBmb3IgZXhhbXBsZSwgYW4gaW5wdXQgd2l0aCBjaGVja2VkIGlzIGVxdWl2YWxlbnQgdG8gYXJpYS1jaGVja2VkPVwidHJ1ZVwiXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRBcmlhQXR0cmlidXRlKGVsZSwgYXR0cmlidXRlTmFtZSkge1xuICAgICAgICAvLyBJZiB0aGUgYXR0cmlidXRlIGlzIGRlZmluZWQsIGl0IHRha2VzIHByZWNlZGVuY2VcbiAgICAgICAgbGV0IHJldFZhbCA9IGVsZS5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7XG5cbiAgICAgICAgaWYgKGVsZS5oYXNBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSkgJiYgcmV0VmFsLnRyaW0oKSA9PT0gXCJcIikgeyAvL1wiXCIgaXMgdHJlYXRlZCBhcyBmYWxzZSwgc28gd2UgbmVlZCByZXR1cm4gaXQgYmVmb3JlIHRoZSBiZWxvdyBjaGVja1xuICAgICAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGVuIGRldGVybWluZSBpbXBsaWNpdCB2YWx1ZXMgZnJvbSBvdGhlciBhdHRyaWJ1dGVzXG4gICAgICAgIGlmICghcmV0VmFsKSB7XG4gICAgICAgICAgICBsZXQgdGFnID0gZWxlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBpZiAoYXR0cmlidXRlTmFtZSBpbiBBcmlhVXRpbC5hcmlhQXR0cmlidXRlSW1wbGljaXRNYXBwaW5ncykge1xuICAgICAgICAgICAgICAgIGlmICh0YWcgaW4gQXJpYVV0aWwuYXJpYUF0dHJpYnV0ZUltcGxpY2l0TWFwcGluZ3NbYXR0cmlidXRlTmFtZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gQXJpYVV0aWwuYXJpYUF0dHJpYnV0ZUltcGxpY2l0TWFwcGluZ3NbYXR0cmlidXRlTmFtZV1bdGFnXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiAocmV0VmFsKSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwgPSByZXRWYWwoZWxlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXCIqXCIgaW4gQXJpYVV0aWwuYXJpYUF0dHJpYnV0ZUltcGxpY2l0TWFwcGluZ3NbYXR0cmlidXRlTmFtZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gQXJpYVV0aWwuYXJpYUF0dHJpYnV0ZUltcGxpY2l0TWFwcGluZ3NbYXR0cmlidXRlTmFtZV1bXCIqXCJdO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIChyZXRWYWwpID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IHJldFZhbChlbGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgcm9sZS1iYXNlZCBkZWZhdWx0c1xuICAgICAgICBpZiAoIXJldFZhbCkge1xuICAgICAgICAgICAgbGV0IHJvbGUgPSBBUklBTWFwcGVyLm5vZGVUb1JvbGUoZWxlKTtcbiAgICAgICAgICAgIGlmIChyb2xlIGluIEFyaWFVdGlsLmFyaWFBdHRyaWJ1dGVSb2xlRGVmYXVsdHMgJiYgYXR0cmlidXRlTmFtZSBpbiBBcmlhVXRpbC5hcmlhQXR0cmlidXRlUm9sZURlZmF1bHRzW3JvbGVdKSB7XG4gICAgICAgICAgICAgICAgcmV0VmFsID0gQXJpYVV0aWwuYXJpYUF0dHJpYnV0ZVJvbGVEZWZhdWx0c1tyb2xlXVthdHRyaWJ1dGVOYW1lXTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIChyZXRWYWwpID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gcmV0VmFsKGVsZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3RpbGwgbm90IGRlZmluZWQ/IENoZWNrIGdsb2JhbCBkZWZhdWx0c1xuICAgICAgICBpZiAoIXJldFZhbCAmJiBhdHRyaWJ1dGVOYW1lIGluIEFyaWFVdGlsLmFyaWFBdHRyaWJ1dGVHbG9iYWxEZWZhdWx0cykge1xuICAgICAgICAgICAgcmV0VmFsID0gQXJpYVV0aWwuYXJpYUF0dHJpYnV0ZUdsb2JhbERlZmF1bHRzW2F0dHJpYnV0ZU5hbWVdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBpc0RlZmluZWRBcmlhQXR0cmlidXRlKGVsZSwgYXR0ck5hbWUpIHtcbiAgICAgICAgbGV0IGlzRGVmaW5lZEFyaWFBdHRyaWJ1dGUgPSBmYWxzZTtcbiAgICAgICAgaWYgKGF0dHJOYW1lLnN1YnN0cmluZygwLCA1KSA9PT0gJ2FyaWEtJykge1xuICAgICAgICAgICAgLy8gVXNlciBhZ2VudHMgU0hPVUxEIHRyZWF0IHN0YXRlIGFuZCBwcm9wZXJ0eSBhdHRyaWJ1dGVzIHdpdGggYSB2YWx1ZSBvZiBcIlwiIHRoZSBzYW1lIGFzIHRoZXkgdHJlYXQgYW4gYWJzZW50IGF0dHJpYnV0ZS5cbiAgICAgICAgICAgIGlzRGVmaW5lZEFyaWFBdHRyaWJ1dGUgPSBlbGUuaGFzQXR0cmlidXRlICYmIGVsZS5oYXNBdHRyaWJ1dGUoYXR0ck5hbWUpICYmIGVsZS5nZXRBdHRyaWJ1dGUoYXR0ck5hbWUpLmxlbmd0aCA+IDA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlzRGVmaW5lZEFyaWFBdHRyaWJ1dGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogV0FJLUFSSUHigJlzIHJvbGUgYXR0cmlidXRlIG1heSBoYXZlIGEgbGlzdCBvZiB2YWx1ZXMsIGJ1dCBvbmx5IHRoZSBmaXJzdCB2YWxpZCBhbmQgc3VwcG9ydGVkIFdBSS1BUklBIHJvbGUgaXMgdXNlZFxuICAgICAqIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93YWktYXJpYS1pbXBsZW1lbnRhdGlvbi8jbWFwcGluZ19yb2xlX3RhYmxlXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgcmV0cmlldmluZyB0aGUgcmVzb2xlZCByb2xlIGZvciBhbiBlbGVtZW50LlxuICAgICAqIEBwYXJtIHtIVE1MRWxlbWVudH0gZWxlIC0gZWxlbWVudCBmb3Igd2hpY2ggdG8gZmluZCByb2xlLlxuICAgICAqXG4gICAgICogQHJldHVybiBzdHJpbmcgLSByZXNvbHZlZCByb2xlIGZvciB0aGUgZWxlbWVudDpcbiAgICAgKiAgICAgICBleHBsaWNpdCByb2xlOiByZXNvbGVkIGZyb20gdGhlIGxpc3Qgb2YgdmFsdWVzXG4gICAgICogICAgICAgaW1wbGljaXQgcm9sZTogaWYgbm90IGV4cGxpY2l0ZWx5IHNwZWNpZmllZCwgb3Igbm9uZSBvZiB0aGUgc3BlY2lmaWVkIHJvbGUgdmFsdWVzIGlzIGFsbG93ZWQgZm9yIHRoZSBlbGVtZW50XG4gICAgICogICAgICAgbnVsbDogaWYgbm9uZSBvZiB0aGUgc3BlY2lmaWVkIHJvbGUgdmFsdWVzIGlzIGFsbG93ZWQgZm9yIHRoZSBlbGVtZW50LCBuZWl0aGVyIGltcGxpY2l0IHJvbGUgZXhpc3RzXG4gICAgICogICAgICAgXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRSZXNvbHZlZFJvbGUoZWxlbTogRWxlbWVudCwgY29uc2lkZXJJbXBsaWNpdFJvbGVzOiBib29sZWFuID0gdHJ1ZSk6IHN0cmluZyB7XG4gICAgICAgIGlmICghZWxlbSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCByb2xlID0gQ2FjaGVVdGlsLmdldENhY2hlKGVsZW0sIFwiUlBUVVRJTF9FTEVNRU5UX1JFU09MVkVEX1JPTEVcIiwgbnVsbCk7XG4gICAgICAgIGlmIChyb2xlID09PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCByb2xlcyA9IEFyaWFVdGlsLmdldFVzZXJEZWZpbmVkUm9sZXMoZWxlbSk7IFxuICAgICAgICAgICAgbGV0IHRhZ1Byb3BlcnR5ID0gQXJpYVV0aWwuZ2V0RWxlbWVudEFyaWFQcm9wZXJ0eShlbGVtKTtcbiAgICAgICAgICAgIGxldCBhbGxvd2VkUm9sZXMgPSBBcmlhVXRpbC5nZXRBbGxvd2VkQXJpYVJvbGVzKGVsZW0sIHRhZ1Byb3BlcnR5KTtcbiAgICAgICAgICAgIGxldCBjb250YWluc0dlbmVyaWMgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChyb2xlcyAmJiByb2xlcy5sZW5ndGggPiAwICYmIGFsbG93ZWRSb2xlcyAmJiBhbGxvd2VkUm9sZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm9sZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFsbG93ZWRSb2xlcy5pbmNsdWRlcyhcImFueVwiKSB8fCBhbGxvd2VkUm9sZXMuaW5jbHVkZXMocm9sZXNbaV0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWxsb3dlZFJvbGVzLmluY2x1ZGVzKFwiYW55XCIpICYmIHJvbGVzW2ldID09PSAnZ2VuZXJpYycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluc0dlbmVyaWMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICByb2xlID0gcm9sZXNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocm9sZSA9PT0gXCJwcmVzZW50YXRpb25cIiB8fCByb2xlID09PSBcIm5vbmVcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGVsZW1lbnQgaXMgZm9jdXNhYmxlLCB0aGVuIHByZXNlbnRhdGlvbiByb2xlcyBhcmUgdG8gYmUgaWdub3JlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDb21tb25VdGlsLmlzRm9jdXNhYmxlKGVsZW0pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcmVzZXQgcnVsZSB0byBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvbGUgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY29udGFpbnNHZW5lcmljKSByb2xlID0gJ2dlbmVyaWMnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAocm9sZSA9PT0gbnVsbCAmJiBjb25zaWRlckltcGxpY2l0Um9sZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbXBsaWNpdFJvbGUgPSBBcmlhVXRpbC5nZXRJbXBsaWNpdFJvbGUoZWxlbSk7XG4gICAgICAgICAgICAgICAgcm9sZSA9IGltcGxpY2l0Um9sZSAmJiBpbXBsaWNpdFJvbGUubGVuZ3RoID4gMCA/IGltcGxpY2l0Um9sZVswXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlJQVFVUSUxfRUxFTUVOVF9SRVNPTFZFRF9ST0xFXCIsIHJvbGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByb2xlICE9PSB1bmRlZmluZWQgPyByb2xlIDogbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciByZXRyaWV2aW5nIHVzZXIgZGVmaW5lZCBlbGVtZW50J3Mgcm9sZXMgZnJvbSBkb20uXG4gICAgICogQHBhcm0ge0hUTUxFbGVtZW50fSBlbGUgLSBlbGVtZW50IGZvciB3aGljaCB0byBmaW5kIHJvbGUuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtMaXN0fSByb2xlcyAtIGxpc3Qgb2YgdXNlciBkZWZpbmVkIHJvbGVzIGluIHRoZSBlbGVtZW50IHJvbGUgYXR0cmlidXRlLlxuICAgICAqXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRVc2VyRGVmaW5lZFJvbGVzKGVsZTogRWxlbWVudCk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIEFyaWFVdGlsLmdldFJvbGVzKGVsZSwgZmFsc2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIHJldHJpZXZpbmcgZWxlbWVudCdzIHJvbGVzLlxuICAgICAqIFRoaXMgZnVuY3Rpb24gYWxzbyBmaW5kcyBpbXBsaWNpdCByb2xlcy5cbiAgICAgKiBAcGFybSB7SFRNTEVsZW1lbnR9IGVsZSAtIGVsZW1lbnQgZm9yIHdoaWNoIHRvIGZpbmQgcm9sZS5cbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJJbXBsaWNpdFJvbGVzIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBpbXBsaWNpdCByb2xlcyBzZXR0aW5nIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAqXG4gICAgICogQHJldHVybiB7TGlzdH0gcm9sZXMgLSBsaXN0IG9mIGF0dHJpYnV0ZSByb2xlcyBhbmQgaW1wbGljaXQgcm9sZXMuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldFJvbGVzKGVsZTogRWxlbWVudCwgY29uc2lkZXJJbXBsaWNpdFJvbGVzOiBib29sZWFuKTogc3RyaW5nW10ge1xuICAgICAgICBsZXQgcm9sZXM6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGlmIChlbGUgJiYgZWxlLmhhc0F0dHJpYnV0ZSAmJiBlbGUuaGFzQXR0cmlidXRlKFwicm9sZVwiKSkge1xuICAgICAgICAgICAgbGV0IGF0dHJSb2xlcyA9IENvbW1vblV0aWwubm9ybWFsaXplU3BhY2luZyhlbGUuZ2V0QXR0cmlidXRlKFwicm9sZVwiKS50cmltKCkpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXR0clJvbGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgcm9sZXMucHVzaChhdHRyUm9sZXNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy9jaGVjayBpZiBpbXBsaWNpdCByb2xlcyBleGlzdC5cbiAgICAgICAgLy9Ob3RlOiBlbGVtZW50IGNhbiBoYXZlIG11bHRpcGxlIGltcGxpY2l0IHJvbGVzXG4gICAgICAgIGlmIChjb25zaWRlckltcGxpY2l0Um9sZXMpIHtcbiAgICAgICAgICAgIGxldCBpbXBsaWNpdFJvbGUgPSBBcmlhVXRpbC5nZXRJbXBsaWNpdFJvbGUoZWxlKTtcbiAgICAgICAgICAgIGlmIChpbXBsaWNpdFJvbGUgIT09IG51bGwgJiYgaW1wbGljaXRSb2xlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAvL2FkZCBpbXBsaWNpdCByb2xlcyB0byB0aGUgYXR0cmlidXRlcyByb2xlcy5cbiAgICAgICAgICAgICAgICBDb21tb25VdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QoaW1wbGljaXRSb2xlLCByb2xlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJvbGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGltcGxpY2l0IHJvbGUgb2YgdGhlIGVsZW1lbWVudFxuICAgICAqIEBwYXJtIHtIVE1MRWxlbWVudH0gZWxlIC0gZWxlbWVudCBmb3Igd2hpY2ggdG8gZmluZCByb2xlLlxuICAgICAqXG4gICAgICogQHJldHVybiB0aGUgaW1wbGljaXQgcm9sZSBvciBbXSBpZiBkb2Vzbid0IGV4aXN0XG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEltcGxpY2l0Um9sZShlbGUpOiBzdHJpbmdbXSB7XG4gICAgICAgIGlmICghZWxlIHx8IGVsZS5ub2RlVHlwZSAhPT0gMSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGxldCBpbXBsaWNpdFJvbGVzOiBzdHJpbmdbXSA9IENhY2hlVXRpbC5nZXRDYWNoZShlbGUsIFwiQXJpYVV0aWxfSW1wbGljaXRSb2xlXCIsIG51bGwpO1xuICAgICAgICBpZiAoIWltcGxpY2l0Um9sZXMpIHtcbiAgICAgICAgICAgIGxldCB0YWdQcm9wZXJ0eSA9IEFyaWFVdGlsLmdldEVsZW1lbnRBcmlhUHJvcGVydHkoZWxlKTtcbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZXJlIGFyZSBhbnkgaW1wbGljaXQgcm9sZXMgZm9yIHRoaXMgZWxlbWVudC5cbiAgICAgICAgICAgIGlmICh0YWdQcm9wZXJ0eSAmJiB0YWdQcm9wZXJ0eS5pbXBsaWNpdFJvbGUpIHtcbiAgICAgICAgICAgICAgICBpZiAodGFnUHJvcGVydHkuaW1wbGljaXRSb2xlLmluY2x1ZGVzKFwiZ2VuZXJpY1wiKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgJ2dlbmVyaWMnIHJvbGUgaXMgb25seSBhbGxvd2VkIGlmIGEgdmFsaWQgYXJpYSBhdHRyaWJ1dGUgZXhpc3RzLlxuICAgICAgICAgICAgICAgICAgICBsZXQgZG9tQXJpYUF0dHJpYnV0ZXMgPSBBcmlhVXRpbC5nZXRVc2VyRGVmaW5lZEFyaWFBdHRyaWJ1dGVzKGVsZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkb21BcmlhQXR0cmlidXRlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGUsIFwiQXJpYVV0aWxfSW1wbGljaXRSb2xlXCIsIFtdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZXQgcm9sZUF0dHJpYnV0ZXMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBhdHRlcm4gPSBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnNbJ2dlbmVyaWMnXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhdHRlcm4ucmVxUHJvcHMgJiYgcGF0dGVybi5yZXFQcm9wcy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KHBhdHRlcm4ucmVxUHJvcHMsIHJvbGVBdHRyaWJ1dGVzKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAodGFnUHJvcGVydHkuZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZClcbiAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdChBUklBRGVmaW5pdGlvbnMuZ2xvYmFsUHJvcGVydGllcywgcm9sZUF0dHJpYnV0ZXMpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXR0ZXJuLmRlcHJlY2F0ZWRQcm9wcyAmJiBwYXR0ZXJuLmRlcHJlY2F0ZWRQcm9wcy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5yZWR1Y2VBcnJheUl0ZW1MaXN0KHBhdHRlcm4uZGVwcmVjYXRlZFByb3BzLCByb2xlQXR0cmlidXRlcyk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlICdnZW5lcmljJyByb2xlIGlmIHJvbGVBdHRyaWJ1dGVzIGRvZXNuJ3QgY29udGFpbiBhbnkgb2YgZG9tQXJpYUF0dHJpYnV0ZXMgXG4gICAgICAgICAgICAgICAgICAgIGlmIChyb2xlQXR0cmlidXRlcy5sZW5ndGggPiAwICYmICFyb2xlQXR0cmlidXRlcy5zb21lKGF0dHIgPT4gZG9tQXJpYUF0dHJpYnV0ZXMuaW5jbHVkZXMoYXR0cikpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW1wbGljaXQgPSBDb21tb25VdGlsLnJlZHVjZUFycmF5SXRlbUxpc3QoWydnZW5lcmljJ10sIHRhZ1Byb3BlcnR5LmltcGxpY2l0Um9sZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlLCBcIkFyaWFVdGlsX0ltcGxpY2l0Um9sZVwiLCBpbXBsaWNpdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW1wbGljaXQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZSwgXCJBcmlhVXRpbF9JbXBsaWNpdFJvbGVcIiwgdGFnUHJvcGVydHkuaW1wbGljaXRSb2xlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGFnUHJvcGVydHkuaW1wbGljaXRSb2xlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZSwgXCJBcmlhVXRpbF9JbXBsaWNpdFJvbGVcIiwgW10pO1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbXBsaWNpdFJvbGVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHJlcXVpcmVkIHByb3BlcnRpZXMgb2YgdGhlIHJvbGVcbiAgICAgKiBAcGFybSB7c3RyaW5nfSByb2xlIC0gdGhlIHJvbGVcbiAgICAgKiBAcGFybSB7SFRNTEVsZW1lbnR9IGVsZSAtIGVsZW1lbnQgZm9yIHdoaWNoIHRvIGZpbmQgcm9sZS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0xpc3R9IHByb3BlcnRpZXMgLSBsaXN0IG9mIHByb3BlcnRpZXMgdGhhdCBhcmUgcmVxdWlyZWQgYnkgdGhlIHJvbGVcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Um9sZVJlcXVpcmVkUHJvcGVydGllcyhyb2xlLCBlbGUpIHtcbiAgICAgICAgaWYgKHJvbGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlXSkge1xuICAgICAgICAgICAgbGV0IHJlcXVpcmVkQXR0cmlidXRlcyA9IEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlXS5yZXFQcm9wcztcbiAgICAgICAgICAgIC8vIGhhbmRsZSBzcGVjaWFsIGNhc2Ugb2Ygc2VwYXJhdG9yXG4gICAgICAgICAgICBpZiAocm9sZS50b0xvd2VyQ2FzZSgpID09PSBcInNlcGFyYXRvclwiICYmIGVsZSAmJiBDb21tb25VdGlsLmlzRm9jdXNhYmxlKGVsZSkpIHtcbiAgICAgICAgICAgICAgICByZXF1aXJlZEF0dHJpYnV0ZXMgPSBDb21tb25VdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QoW1wiYXJpYS12YWx1ZW5vd1wiXSwgcmVxdWlyZWRBdHRyaWJ1dGVzIHx8IFtdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXF1aXJlZEF0dHJpYnV0ZXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGZpbmRpbmcgaWYgYSBlbGVtZW50IGhhcyBnaXZlbiByb2xlLlxuICAgICAqIFRoaXMgZnVuY3Rpb24gYXNsbyBmaW5kcyBpZiBlbGVtZW50IGhhcyBnaXZlbiByb2xlcyBhcyBpbXBsaWNpdCByb2xlLlxuICAgICAqIEBwYXJtIHtIVE1MRWxlbWVudH0gZWxlIC0gZWxlbWVudCBmb3Igd2hpY2ggdG8gZmluZCByb2xlLlxuICAgICAqIEBwYXJtIHtsaXN0IG9yIHN0cmluZ30gcm9sZXMgLSBMaXN0IG9yIHNpbmdsZSByb2xlIGZvciB3aGljaCB0byBmaW5kIGlmIGVsZW1lbnQgaGFzIHRoZXNlIHJvbGVzLlxuICAgICAqIEBwYXJtIHtib29sfSBjb25zaWRlckltcGxpY2l0Um9sZXMgLSB0cnVlIG9yIGZhbHNlIGJhc2VkIG9uIGlmIGltcGxpY2l0IHJvbGVzIHNldHRpbmcgc2hvdWxkIGJlIGNvbnNpZGVyZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtMaXN0fSByZXRWYWwgLSB0cnVlIG9yIGZhbHNlIGJhc2VkIG9uIGlmIHRoIGVsZW1lbnQgaGFzIHRoZSBzcGVjaWZpZWQgcm9sZS5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqXG4gICAgICogQ29uc2lkZXIgdG8gdXNlIGhhc1JvbGVJblNlbWFudGljcygpIGluc3RlYWQuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBoYXNSb2xlKGVsZSwgcm9sZSwgY29uc2lkZXJJbXBsaWNpdFJvbGVzPykgeyAgLy9Db25zaWRlciB0byB1c2UgaGFzUm9sZUluU2VtYW50aWNzKCkgaW5zdGVhZC5cbiAgICAgICAgbGV0IHJldFZhbCA9IGZhbHNlO1xuICAgICAgICBpZiAoZWxlICYmIGVsZS5oYXNBdHRyaWJ1dGUgJiYgZWxlLmhhc0F0dHJpYnV0ZShcInJvbGVcIikpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgKHJvbGUpICE9IHR5cGVvZiAoXCJcIikpIHtcbiAgICAgICAgICAgICAgICBsZXQgcm9sZXMgPSBlbGUuZ2V0QXR0cmlidXRlKFwicm9sZVwiKS50cmltKCkuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyAhcmV0VmFsICYmIGkgPCByb2xlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICByZXRWYWwgPSByb2xlc1tpXSBpbiByb2xlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHJvbGVzID0gZWxlLmdldEF0dHJpYnV0ZShcInJvbGVcIikudHJpbSgpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgIXJldFZhbCAmJiBpIDwgcm9sZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gcm9sZXNbaV0gPT09IHJvbGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vaWYgbm9uZSBvZiB0aGUgdGhlIGF0dHJpYnV0ZSByb2xlcyBtYXRjaGVkIHdpdGggZ2l2ZW4gcm9sZVxuICAgICAgICAvL2NoZWNrIGlmIGltcGxpY2l0IHJvbGVzIG1hdGNoZXMuXG4gICAgICAgIC8vTm90ZTogZWxlbWVudCBjYW4gaGF2ZSBtdWx0aXBsZSBpbXBsaWNpdCByb2xlc1xuICAgICAgICBpZiAoIXJldFZhbCAmJiBjb25zaWRlckltcGxpY2l0Um9sZXMpIHtcbiAgICAgICAgICAgIGxldCB3Um9sZXMgPSBbXTtcbiAgICAgICAgICAgIC8vY2hlY2sgaWYgdGhlcmUgYXJlIGFueSBpbXBsaWNpdCByb2xlcyBmb3IgdGhpcyBlbGVtZW50LlxuICAgICAgICAgICAgbGV0IGltcGxpY2l0Um9sZSA9IEFyaWFVdGlsLmdldEltcGxpY2l0Um9sZShlbGUpO1xuICAgICAgICAgICAgaWYgKGltcGxpY2l0Um9sZSAhPT0gbnVsbCAmJiBpbXBsaWNpdFJvbGUubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIENvbW1vblV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdChpbXBsaWNpdFJvbGUsIHdSb2xlcyk7XG4gICAgICAgICAgICAgICAgLy9pZiByb2xlIGlzIGFycmF5IGxvb3AgdGhydSBhbmQgc2VlIGlmIGFueSAgb2YgdGhlIGltcGxpY2l0IHJvbGUgcHJlc2VudCBpbiB0aGUgYXJyYXlcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIChyb2xlKSAhPSB0eXBlb2YgKFwiXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyAhcmV0VmFsICYmIGkgPCB3Um9sZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IHdSb2xlc1tpXSBpbiByb2xlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7ICFyZXRWYWwgJiYgaSA8IHdSb2xlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gd1JvbGVzW2ldID09PSByb2xlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIGlmIHRoZSBlbGVtZW50IGhhcyB0aGUgcm9sZSwgaW5jbHVkaW5nIHRoZSBpbXBsaWVkIHJvbGUgaWYgcm9sZSBpcyBub3QgZXhwbGljaXRseSBzcGVjaWZpZWQuXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlcGxhY2luZyB0aGUgaGFzUm9sZSBmdW5jdGlvblxuICAgICAqXG4gICAgICogQHBhcm0ge0hUTUxFbGVtZW50fSBlbGUgLSBlbGVtZW50IGZvciB3aGljaCB0byBmaW5kIHJvbGUuXG4gICAgICogQHBhcm0ge2xpc3Qgb3Igc3RyaW5nfSByb2xlcyAtIExpc3Qgb3Igc2luZ2xlIHJvbGUgZm9yIHdoaWNoIHRvIGZpbmQgaWYgZWxlbWVudCBoYXMgdGhlc2Ugcm9sZXMuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtMaXN0fSByZXRWYWwgLSB0cnVlIG9yIGZhbHNlIGJhc2VkIG9uIGlmIHRoZSBlbGVtZW50IGhhcyB0aGUgc3BlY2lmaWVkIHJvbGUuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGhhc1JvbGVJblNlbWFudGljcyhlbGUsIHJvbGUpIHtcbiAgICAgICAgbGV0IHJldFZhbCA9IGZhbHNlO1xuICAgICAgICBsZXQgcm9sZVNwZWNpZmllZCA9IGZhbHNlO1xuICAgICAgICBpZiAoZWxlICYmIGVsZS5oYXNBdHRyaWJ1dGUgJiYgZWxlLmhhc0F0dHJpYnV0ZShcInJvbGVcIikpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgKHJvbGUpICE9IHR5cGVvZiAoXCJcIikpIHtcbiAgICAgICAgICAgICAgICBsZXQgcm9sZXMgPSBlbGUuZ2V0QXR0cmlidXRlKFwicm9sZVwiKS50cmltKCkudG9Mb3dlckNhc2UoKS5zcGxpdCgvXFxzKy8pO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyAhcmV0VmFsICYmIGkgPCByb2xlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICByb2xlU3BlY2lmaWVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gcm9sZXNbaV0gaW4gcm9sZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCByb2xlcyA9IGVsZS5nZXRBdHRyaWJ1dGUoXCJyb2xlXCIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpLnNwbGl0KC9cXHMrLyk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7ICFyZXRWYWwgJiYgaSA8IHJvbGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJvbGVTcGVjaWZpZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZXRWYWwgPSByb2xlc1tpXSA9PT0gcm9sZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocm9sZVNwZWNpZmllZCkge1xuICAgICAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vY2hlY2sgaWYgaW1wbGljaXQgcm9sZXMgbWF0Y2hlcy5cbiAgICAgICAgLy9Ob3RlOiBlbGVtZW50IGNhbiBoYXZlIG11bHRpcGxlIGltcGxpY2l0IHJvbGVzXG4gICAgICAgIC8vY2hlY2sgaWYgdGhlcmUgYXJlIGFueSBpbXBsaWNpdCByb2xlcyBmb3IgdGhpcyBlbGVtZW50LlxuICAgICAgICBsZXQgaW1wUm9sZXMgPSBBcmlhVXRpbC5nZXRJbXBsaWNpdFJvbGUoZWxlKTtcbiAgICAgICAgaWYgKGltcFJvbGVzICE9PSBudWxsICYmIGltcFJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIC8vaWYgcm9sZSBpcyBhcnJheSBsb29wIHRocnUgYW5kIHNlZSBpZiBhbnkgIG9mIHRoZSBpbXBsaWNpdCByb2xlIHByZXNlbnQgaW4gdGhlIGFycmF5XG4gICAgICAgICAgICBpZiAodHlwZW9mIChyb2xlKSAhPSB0eXBlb2YgKFwiXCIpKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7ICFyZXRWYWwgJiYgaSA8IGltcFJvbGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IGltcFJvbGVzW2ldIGluIHJvbGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgIXJldFZhbCAmJiBpIDwgaW1wUm9sZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsID0gaW1wUm9sZXNbaV0gPT09IHJvbGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZmluZGluZyBpZiBhIGVsZW1lbnQgaGFzIGdpdmVuIHJvbGUuXG4gICAgICogVGhpcyBmdW5jdGlvbiBhbHNvIGNoZWNrcyBpZiBlbGVtZW50IGhhcyBnaXZlbiByb2xlcyBhcyBpbXBsaWNpdCByb2xlcy5cbiAgICAgKiBAcGFybSB7SFRNTEVsZW1lbnR9IGVsZSAtIGVsZW1lbnQgZm9yIHdoaWNoIHRvIGZpbmQgcm9sZS5cbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJJbXBsaWNpdFJvbGVzIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBpbXBsaWNpdCByb2xlcyBzZXR0aW5nIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAqXG4gICAgICogQHJldHVybiB7Ym9vbH0gcmV0VmFsIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiB0aGUgZWxlbWVudCBoYXMgdGhlIHNwZWNpZmllZCByb2xlLlxuICAgICAqXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBoYXNBbnlSb2xlKGVsZSwgY29uc2lkZXJJbXBsaWNpdFJvbGVzKSB7XG4gICAgICAgIGxldCByZXRWYWwgPSBmYWxzZTtcbiAgICAgICAgaWYgKGVsZSAmJiBlbGUuaGFzQXR0cmlidXRlICYmIGVsZS5oYXNBdHRyaWJ1dGUoXCJyb2xlXCIpKSB7XG4gICAgICAgICAgICByZXRWYWwgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9jaGVjayBpZiBpbXBsaWNpdCByb2xlcyBleGlzdC5cbiAgICAgICAgLy9Ob3RlOiBlbGVtZW50IGNhbiBoYXZlIG11bHRpcGxlIGltcGxpY2l0IHJvbGVzXG4gICAgICAgIGlmICghcmV0VmFsICYmIGNvbnNpZGVySW1wbGljaXRSb2xlcykge1xuICAgICAgICAgICAgLy9jaGVjayBpZiB0aGVyZSBhcmUgYW55IGltcGxpY2l0IHJvbGVzIGZvciB0aGlzIGVsZW1lbnQuXG4gICAgICAgICAgICBsZXQgaW1wUm9sZXMgPSBBcmlhVXRpbC5nZXRJbXBsaWNpdFJvbGUoZWxlKTtcbiAgICAgICAgICAgIGlmIChpbXBSb2xlcyAhPT0gbnVsbCAmJiBpbXBSb2xlcy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgIHJldFZhbCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGlzUHJlc2VudGF0aW9uYWxFbGVtZW50KG5vZGUpIHtcbiAgICAgICAgLy8gRWxlbWVudHMgZXh0cmFjdGVkIGZyb20gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vZG9jcy9XZWIvSFRNTC9FbGVtZW50I0lubGluZV90ZXh0X3NlbWFudGljcyxcbiAgICAgICAgLy8gaHR0cDovL2Rldi53My5vcmcvaHRtbDUvaHRtbC1hdXRob3IvI3RleHQtbGV2ZWwtc2VtYW50aWNzIGFuZCBodHRwczovL3dpa2kud2hhdHdnLm9yZy93aWtpL1ByZXNlbnRhdGlvbmFsX2VsZW1lbnRzX2FuZF9hdHRyaWJ1dGVzXG4gICAgICAgIGxldCBwcmVzZW50YXRpb25hbEVsZW1lbnRzID0gW1wiYWJiclwiLCBcImJcIiwgXCJiZGlcIiwgXCJiZG9cIiwgXCJiclwiLCBcImNpdGVcIiwgXCJjb2RlXCIsIFwiZGF0YVwiLCBcImRmblwiLFxuICAgICAgICAgICAgXCJlbVwiLCBcImlcIiwgXCJrYmRcIiwgXCJtYXJrXCIsIFwicVwiLCBcInJwXCIsIFwicnRcIiwgXCJydGNcIiwgXCJydWJ5XCIsIFwic1wiLFxuICAgICAgICAgICAgXCJzYW1wXCIsIFwic21hbGxcIiwgXCJzcGFuXCIsIFwic3Ryb25nXCIsIFwic3ViXCIsIFwic3VwXCIsIFwidGltZVwiLCBcInVcIixcbiAgICAgICAgICAgIFwidmFyXCIsIFwid2JyXCIsIFwiYVwiLCBcInByb2dyZXNzXCIsIFwibWV0ZXJcIiwgXCJiYXNlZm9udFwiLCBcImJpZ1wiLCBcImNlbnRlclwiLFxuICAgICAgICAgICAgXCJzdHJpa2VcIiwgXCJ0dFwiLCBcImZvbnRcIiwgXCJibGlua1wiLCBcImgxXCIsIFwiaDJcIiwgXCJoM1wiLCBcImg0XCIsIFwiaDVcIiwgXCJoNlwiLFxuICAgICAgICAgICAgXCJoclwiLCBcImJsb2NrcXVvdGVcIiwgXCJwXCJcbiAgICAgICAgXTtcbiAgICAgICAgcmV0dXJuIENvbW1vblV0aWwudmFsSW5BcnJheShub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksIHByZXNlbnRhdGlvbmFsRWxlbWVudHMpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHJldHVybiB0aGUgYW5jZXN0b3Igb2YgdGhlIGdpdmVuIGVsZW1lbnQgYW5kIHJvbGUuXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gZWxlbWVudCAtIFRoZSBlbGVtZW50IHRvIHN0YXJ0IHRoZSBub2RlIHdhbGsgb24gdG8gZmluZCBwYXJlbnQgbm9kZVxuICAgICAqIEBwYXJtIHtzdHJpbmd9IHJvbGUgLSBUaGUgcm9sZSB0byBzZWFyY2ggZm9yIG9uIGFuIGVsZW1lbnQgdW5kZXIgdGhlIHByb3ZpZGVkIGVsZW1lbnRcbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJJbXBsaWNpdFJvbGVzIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBpbXBsaWNpdCByb2xlcyBzZXR0aW5nIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAqXG4gICAgICogQHJldHVybiB7bm9kZX0gd2Fsa05vZGUgLSBBIHBhcmVudCBub2RlIG9mIHRoZSBlbGVtZW50IHBhc3NlZCBpbiwgd2hpY2ggaGFzIHRoZSBwcm92aWRlZCByb2xlXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEFuY2VzdG9yV2l0aFJvbGUoZWxlbWVudCwgcm9sZU5hbWUsIGNvbnNpZGVySW1wbGljaXRSb2xlcz8pIHtcbiAgICAgICAgbGV0IHdhbGtOb2RlID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUoZWxlbWVudCk7XG4gICAgICAgIHdoaWxlICh3YWxrTm9kZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGNvbnNpZGVySW1wbGljaXRSb2xlcykge1xuICAgICAgICAgICAgICAgIGlmIChBcmlhVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3Mod2Fsa05vZGUsIHJvbGVOYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChBcmlhVXRpbC5oYXNSb2xlKHdhbGtOb2RlLCByb2xlTmFtZSwgZmFsc2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdhbGtOb2RlID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUod2Fsa05vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3YWxrTm9kZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiByZXR1cm4gdGhlIGFuY2VzdG9yIG9mIHRoZSBnaXZlbiBlbGVtZW50IGFuZCByb2xlcy5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBlbGVtZW50IC0gVGhlIGVsZW1lbnQgdG8gc3RhcnQgdGhlIG5vZGUgd2FsayBvbiB0byBmaW5kIHBhcmVudCBub2RlXG4gICAgICogQHBhcm0ge2FycmF5fSByb2xlcyAtIHRoZSByb2xlIG5hbWVzIHRvIHNlYXJjaCBmb3JcbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJJbXBsaWNpdFJvbGVzIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBpbXBsaWNpdCByb2xlcyBzZXR0aW5nIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAqXG4gICAgICogQHJldHVybiB7bm9kZX0gd2Fsa05vZGUgLSBBIHBhcmVudCBub2RlIG9mIHRoZSBlbGVtZW50IHBhc3NlZCBpbiwgd2hpY2ggaGFzIHRoZSBwcm92aWRlZCByb2xlXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEFuY2VzdG9yV2l0aFJvbGVzKGVsZW1lbnQsIHJvbGVOYW1lcykge1xuICAgICAgICBpZiAoIWVsZW1lbnQgfHwgIXJvbGVOYW1lcyB8fCAhcm9sZU5hbWVzLmxlbmd0aCB8fCByb2xlTmFtZXMubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcbiAgICAgICAgbGV0IHdhbGtOb2RlID0gZWxlbWVudDtcbiAgICAgICAgd2hpbGUgKHdhbGtOb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgcm9sZSA9IEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZSh3YWxrTm9kZSk7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgcm9sZSAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgIChcbiAgICAgICAgICAgICAgICAgICAgcm9sZU5hbWVzLmluY2x1ZGVzKHJvbGUpIHx8XG4gICAgICAgICAgICAgICAgICAgIChyb2xlTmFtZXMuaW5jbHVkZXMoXCIqXCIpICYmICFbXCJwcmVzZW50YXRpb25cIiwgXCJub25lXCJdLmluY2x1ZGVzKHJvbGUpKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIHJldHVybiB3YWxrTm9kZTtcbiAgICAgICAgICAgIHdhbGtOb2RlID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUod2Fsa05vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHJldHVybiB0aGUgcm9sZXMgd2l0aCBnaXZlbiByb2xlIHR5cGUuXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gZWxlbWVudCAtIFRoZSBlbGVtZW50IHRvIHN0YXJ0IHRoZSBub2RlIHdhbGsgb24gdG8gZmluZCBwYXJlbnQgbm9kZVxuICAgICAqIEBwYXJtIHthcnJheX0gcm9sZVR5cGxlcyAtIHJvbGUgdHlwZXMsIHN1Y2ggYXMgJ3dpZGdldCcsICdzdHJ1Y3R1cmUnIGV0Yy5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge2FycmF5fSByb2xlcyAtIEEgcGFyZW50IG5vZGUgb2YgdGhlIGVsZW1lbnQgcGFzc2VkIGluLCB3aGljaCBoYXMgdGhlIHByb3ZpZGVkIHJvbGVcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Um9sZXNXaXRoVHlwZXMoZWxlbWVudCwgdHlwZXM6IHN0cmluZ1tdKSB7XG4gICAgICAgIGlmICghZWxlbWVudCB8fCAhdHlwZXMgfHwgIXR5cGVzLmxlbmd0aCB8fCB0eXBlcy5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCByb2xlcyA9IENhY2hlVXRpbC5nZXRDYWNoZShlbGVtZW50Lm93bmVyRG9jdW1lbnQsIFwicm9sZXNfd2l0aF9naXZlbl90eXBlc1wiLCBudWxsKTtcbiAgICAgICAgaWYgKCFyb2xlcyB8fCByb2xlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJvbGVzID0gW107XG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyhBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnMpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlcy5pbmNsdWRlcyh2YWx1ZS5yb2xlVHlwZSkpXG4gICAgICAgICAgICAgICAgICAgIHJvbGVzLnB1c2goa2V5KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW1lbnQub3duZXJEb2N1bWVudCwgXCJyb2xlc193aXRoX2dpdmVuX3R5cGVzXCIsIHJvbGVzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcm9sZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcmV0dXJuIHRoZSByb2xlcyB3aXRoIGdpdmVuIHJvbGUgdHlwZS5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBlbGVtZW50IC0gVGhlIGVsZW1lbnQgdG8gc3RhcnQgdGhlIG5vZGUgd2FsayBvbiB0byBmaW5kIHBhcmVudCBub2RlXG4gICAgICogQHBhcm0ge2FycmF5fSByb2xlVHlwbGVzIC0gcm9sZSB0eXBlcywgc3VjaCBhcyAnd2lkZ2V0JywgJ3N0cnVjdHVyZScgZXRjLlxuICAgICAqXG4gICAgICogQHJldHVybiB7YXJyYXl9IHJvbGVzIC0gQSBwYXJlbnQgbm9kZSBvZiB0aGUgZWxlbWVudCBwYXNzZWQgaW4sIHdoaWNoIGhhcyB0aGUgcHJvdmlkZWQgcm9sZVxuICAgICAqXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpc1dpZGdldChlbGVtZW50KSB7XG4gICAgICAgIGlmICghZWxlbWVudCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IHdpZGdldCA9IENhY2hlVXRpbC5nZXRDYWNoZShlbGVtZW50Lm93bmVyRG9jdW1lbnQsIFwiaXNfZWxlbWVudF93aWRnZXRcIiwgbnVsbCk7XG4gICAgICAgIGlmICh3aWRnZXQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIGxldCByZXQgPSBmYWxzZTtcbiAgICAgICAgICAgIGNvbnN0IHJvbGUgPSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUoZWxlbWVudCk7IFxuICAgICAgICAgICAgaWYgKHJvbGUgJiYgQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVdICYmIEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlXS5yb2xlVHlwZSA9PT0gJ3dpZGdldCcpXG4gICAgICAgICAgICAgICAgcmV0ID0gdHJ1ZTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW1lbnQub3duZXJEb2N1bWVudCwgXCJpc19lbGVtZW50X3dpZGdldFwiLCByZXQpO1xuICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gd2lkZ2V0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHJldHVybiBpZiB0aGUgZWxlbWVudCBpcyBvd25lZCBvciBjb250cm9sbGVkIGJ5IGFub3RoZXIgZWxlbWVudC4gXG4gICAgICogSWYgYW4gYW5jZXN0b3Igb2YgYW4gZWxlbWVudCBpcyBvd25lZCBvciBjb250cm9sbGVkIGJ5IGFub3RoZXIgZWxlbWVudCwgdGhlbiB0aGUgZWxlbWVudCBpcyBhbHNvIGNvbnNpZGVyZWQgYXMgb3duZWQgb3IgY29udHJvbGxlZC5cbiAgICAgKiBhbiBlbGVtZW50IGNhbiBiZSBvd25lZCBvciBjb250cm9sbGVkIGJ5IGFub3RoZXIgZWxlbWVudCB0aHJvdWdoIGFyaWEtb3ducyBvciBhcmlhLWNvbnRyb2xzXG4gICAgICogICB3aGVuIHRoZSBET00gaGllcmFyY2h5IGNhbm5vdCBiZSB1c2VkIHRvIHJlcHJlc2VudCB0aGUgcmVsYXRpb25zaGlwLlxuICAgICAqIGFyaWEtb3ducyBhdHRyaWJ1dGUgaXMgdXNlZCB0byBkZWZpbmUgY29udGV4dHVhbCByZWxhdGlvbnNoaXAgd2l0aCBhIG93bmluZyBwYXJlbnQgXG4gICAgICogYXJpYS1jb250cm9scyBhdHRyaWJ1dGUgaXMgdXNlZCB0byBhc3NvY2lhdGUgYW4gZWxlbWVudCB3aXRoIHRoZSBjb250cm9sbGluZyBlbGVtZW50LlxuICAgICAqICBleGFtcGxlIGVsZW1lbnRzIHdpdGggcm9sZXM6IGNvbWJvYm94LCBzY3JvbGxiYXIsIHRhYiwgYnV0dG9uLCBsaXN0Ym94LCBtZW51LCBtZW51YmFyLCByYWRpb2dyb3VwLCB0cmVlLCB0cmVlZ3JpZFxuICAgICAqIFxuICAgICAqIHdoZW4gYW4gZWxlbWVudCBpcyBvd25lZCBvciBjb250cm9sbGVkIGJ5IGFub3RoZXIgZWxlbWVudCwgaXRzIG5hdmlnYXRpb24gbWF5IGJlIGNvbnRyb2xsZWQgYnkgdGhlIHBhcmVudCBcbiAgICAgKiAgdGhyb3VnaCBhcmlhLWFjdGl2ZWRlc2NlbmRhbnRzIGF0dHJpYnV0ZSBvciByb3ZpbmcgdGFiaW5kZXhcbiAgICAgKiBcbiAgICAgKiBOb3RlIG5hdmlnYXRpb24gd2l0aCBuYXRpdmUgY29tYm9ib3ggKGlucHV0IHdpdGggYSBkYXRhbGlzdCkgaXMgaW4gbmF0aXZlIGZvY3VzIG5hdmlnYXRpb24sIG5vdCBjb25zaWRlcmVkIGhlcmUgICBcbiAgICAgKiBcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gZWxlbWVudCAtIFRoZSBlbGVtZW50IHRvIGluc3BlY3RcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgaXNOYXZpZ2F0aW9uT3duZWRPckNvbnRyb2xsZWQoZWxlbWVudCA6IEVsZW1lbnQpIHtcbiAgICAgICAgaWYgKCFlbGVtZW50KSByZXR1cm4gZmFsc2U7XG4gICAgICAgIFxuICAgICAgICBsZXQgb3duZXJFbGVtczogRWxlbWVudFtdID0gQ2FjaGVVdGlsLmdldENhY2hlKGVsZW1lbnQub3duZXJEb2N1bWVudCwgXCJBcmlhVXRpbF9OYXZpZ2F0aW9uT3duZWRPckNvbnRyb2xsZWRcIiwgbnVsbCk7XG4gICAgICAgIGlmIChvd25lckVsZW1zICE9PSBudWxsICYmIG93bmVyRWxlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgaWYgKENvbW1vblV0aWwuZ2V0QW5jZXN0b3IoZWxlbWVudCwgb3duZXJFbGVtcykpXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHJvbGUgPSBBcmlhVXRpbC5nZXRSZXNvbHZlZFJvbGUoZWxlbWVudCk7XG4gICAgICAgIGlmICghcm9sZSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBcbiAgICAgICAgbGV0IGlkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJpZFwiKTtcbiAgICAgICAgaWYgKCFpZCB8fCBpZC50cmltKCkubGVuZ3RoID09PSAwKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgY29uc3QgZWxlbSA9IGVsZW1lbnQub3duZXJEb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAqW2FyaWEtY29udHJvbHN+PScke2lkfSddLCAqW2FyaWEtb3duc349JyR7aWR9J11gKTtcbiAgICAgICAgaWYgKCFlbGVtKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgY29uc3QgY29udGFpbmVycyA9IFsnY29tYm9ib3gnLCAnc2Nyb2xsYmFyJywgJ2J1dHRvbicsICd0YWInLCAnbGlzdGJveCcsICdtZW51JywgJ21lbnViYXInLCAncmFkaW9ncm91cCcsICd0cmVlJywgJ3RyZWVncmlkJ107XG4gICAgICAgIGlmIChjb250YWluZXJzLmluY2x1ZGVzKHJvbGUpKSB7XG4gICAgICAgICAgICBpZiAob3duZXJFbGVtcyA9PT0gbnVsbClcbiAgICAgICAgICAgICAgICBvd25lckVsZW1zID0gW107XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIG93bmVyRWxlbXMucHVzaChlbGVtZW50KTtcbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtZW50Lm93bmVyRG9jdW1lbnQsIFwiQXJpYVV0aWxfTmF2aWdhdGlvbk93bmVkT3JDb250cm9sbGVkXCIsIG93bmVyRWxlbXMpOyAgICAgICAgICAgIFxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gICAgXG4gICAgICAgIFxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZmluZGluZyBhIG5vZGUgd2hpY2ggbWF0Y2hlcyB0aGUgcm9sZSBhbmQgaXMgYSBzaWJsaW5nIG9mIHRoZVxuICAgICAqIHByb3ZpZGVkIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGJ5IGRlZmF1bHQgd2lsbCBub3QgY29uc2lkZXIgQ2hlY2sgSGlkZGVuIFNldHRpbmcgYXQgYWxsLlxuICAgICAqXG4gICAgICogTm90ZTogVGhpcyBpcyBhIHdyYXBwZXIgZnVuY3Rpb24gdG86IEFyaWFVdGlsLmdldFNpYmxpbmdXaXRoUm9sZUhpZGRlblxuICAgICAqXG4gICAgICogQHBhcm0ge2VsZW1lbnR9IGVsZW1lbnQgLSBUaGUgZWxlbWVudCB0byBzdGFydCB0aGUgbm9kZSB3YWxrIG9uIHRvIGZpbmQgc2libGluZyBub2RlXG4gICAgICogQHBhcm0ge3N0cmluZ30gcm9sZSAtIFRoZSByb2xlIHRvIHNlYXJjaCBmb3Igb24gYW4gZWxlbWVudCB1bmRlciB0aGUgcHJvdmlkZWQgZWxlbWVudFxuICAgICAqXG4gICAgICogQHJldHVybiB7bm9kZX0gd2Fsa05vZGUgLSBBIHNpYmxpbmcgbm9kZSBvZiB0aGUgZWxlbWVudCBwYXNzZWQgaW4sIHdoaWNoIGhhcyB0aGUgcHJvdmlkZWQgcm9sZVxuICAgICAqXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRTaWJsaW5nV2l0aFJvbGUoZWxlbWVudCwgcm9sZSkge1xuICAgICAgICByZXR1cm4gQXJpYVV0aWwuZ2V0U2libGluZ1dpdGhSb2xlSGlkZGVuKGVsZW1lbnQsIHJvbGUsIGZhbHNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBmaW5kaW5nIGEgbm9kZSB3aGljaCBtYXRjaGVzIHRoZSByb2xlIGFuZCBpcyBhIHNpYmxpbmcgb2YgdGhlXG4gICAgICogcHJvdmlkZWQgZWxlbWVudC5cbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gYWxzbyBjb25zaWRlcnMgaW1wbGljaXQgcm9sZXMgZm9yIHRoZSBlbGVtZW50cy5cbiAgICAgKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gd2lsbCBhbHNvIGNvbnNpZGVyIGVsZW1lbnRzIHRoYXQgYXJlIGhpZGRlbiBiYXNlZCBvbiB0aGUgaWYgdGhlIENoZWNrXG4gICAgICogSGlkZGVuIENvbnRlbnQgc2V0dGluZ3Mgc2hvdWxkIGJlIGNvbnNpZGVyZWQgb3Igbm90LlxuICAgICAqXG4gICAgICogQHBhcm0ge2VsZW1lbnR9IGVsZW1lbnQgLSBUaGUgZWxlbWVudCB0byBzdGFydCB0aGUgbm9kZSB3YWxrIG9uIHRvIGZpbmQgc2libGluZyBub2RlXG4gICAgICogQHBhcm0ge3N0cmluZ30gcm9sZSAtIFRoZSByb2xlIHRvIHNlYXJjaCBmb3Igb24gYW4gZWxlbWVudCB1bmRlciB0aGUgcHJvdmlkZWQgZWxlbWVudFxuICAgICAqIEBwYXJtIHtib29sfSBjb25zaWRlckhpZGRlblNldHRpbmcgLSB0cnVlIG9yIGZhbHNlIGJhc2VkIG9uIGlmIGhpZGRlbiBzZXR0aW5nIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAqIEBwYXJtIHtib29sfSBjb25zaWRlckltcGxpY2l0IC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBJbXBsaWNpdCByb2xlcyBzaG91bGQgYmUgY29uc2lkZXJlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge25vZGV9IHdhbGtOb2RlIC0gQSBzaWJsaW5nIG5vZGUgb2YgdGhlIGVsZW1lbnQgcGFzc2VkIGluLCB3aGljaCBoYXMgdGhlIHByb3ZpZGVkIHJvbGVcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0U2libGluZ1dpdGhSb2xlSGlkZGVuKGVsZW1lbnQsIHJvbGUsIGNvbnNpZGVySGlkZGVuU2V0dGluZywgY29uc2lkZXJJbXBsaWNpdFJvbGU/KSB7XG5cbiAgICAgICAgLy8gVmFyaWFibGUgRGVjbGFyYXRpb25cbiAgICAgICAgbGV0IHdhbGtOb2RlID0gbnVsbDtcbiAgICAgICAgbGV0IGhhc1JvbGUgPSBmYWxzZTtcblxuICAgICAgICAvLyBPbmx5IHBlcmZvcm0gdGhlIGNoZWNrIGlmIGVsZW1lbnQgYW5kIHJvbGUgYXJlIGJvdGggcHJvdmlkZWRcbiAgICAgICAgaWYgKGVsZW1lbnQgJiYgcm9sZSkge1xuICAgICAgICAgICAgLy8gRmV0Y2ggdGhlIG5leHQgc2libGluZyBlbGVtZW50XG4gICAgICAgICAgICB3YWxrTm9kZSA9IGVsZW1lbnQubmV4dFNpYmxpbmc7XG5cbiAgICAgICAgICAgIC8vIEtlZXAgbG9vcGluZyBvdmVyIHRoZSBuZXh0IHNpYmxpbmdzIHRvIGZpbmQgZWxlbWVudCB3aGljaCBtYXRjaGVzXG4gICAgICAgICAgICAvLyB0aGUgcHJvdmlkZWQgcm9sZS5cbiAgICAgICAgICAgIHdoaWxlICh3YWxrTm9kZSAhPT0gbnVsbCAmJiAhaGFzUm9sZSkge1xuXG4gICAgICAgICAgICAgICAgLy8gRm9sbG93aW5nIGFyZSB0aGUgc3RlcHMgdGhhdCBhcmUgZXhlY3V0ZWQgYXQgdGhpcyBzdGFnZSB0byBkZXRlcm1pbmUgaWYgdGhlIG5vZGUgc2hvdWxkIGJlIGNsYXNzaWZpZWQgYXMgaGlkZGVuXG4gICAgICAgICAgICAgICAgLy8gb3Igbm90LlxuICAgICAgICAgICAgICAgIC8vICAxLiBJZiBjb25zaWRlckhpZGRlblNldHRpbmcgb3B0aW9uIGlzIHNldCB0byB0cnVlIHRoZW4gd2UgcGVyZm9ybSB0aGUgY2hlY2sgdG8gY29uc2lkZXIgdGhlXG4gICAgICAgICAgICAgICAgLy8gICAgIENoZWNrIEhpZGRlbiBDb250ZW50IHRoYXQgaXMgcHJvdmlkZWQuXG4gICAgICAgICAgICAgICAgLy8gIDIuIE9ubHkgcnVuIGlzTm9kZVZpc2libGUgY2hlY2sgaWYgaGlkZGVuIGNvbnRlbnQgc2hvdWxkIE5PVCBiZSBjaGVja2VkLiBJbiB0aGUgY2FzZSB0aGF0IGhpZGRlbiBjb250ZW50IGlzIHRvLFxuICAgICAgICAgICAgICAgIC8vICAgICBiZSBzY2FubmVkIHRoZW4gd2UgY2FuIGp1c3Qgc2NhbiBldmVyeXRoaW5nIGFzIG5vcm1hbC4gSW4gdGhlIGNhc2UgdGhhdCB0aGUgY3VycmVudCBub2RlIGlzIGhpZGRlbiB3ZSBkbyBub3RcbiAgICAgICAgICAgICAgICAvLyAgICAgYWRkIGl0IHRvIHRoZSByb2xlVG9FbGVtcyBoYXNoIGF0IGFsbCBvciBldmVuIGRvIGFueSBjaGVja2luZyBmb3IgaXQgYXQgYWxsLlxuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgLy8gTm90ZTogVGhlIGlmIGNvbmRpdGlvbnMgdXNlcyBzaG9ydC1jaXJjdWl0aW5nIHNvIGlmIHRoZSBmaXJzdCBjb25kaXRpb24gaXMgbm90IHRydWUgaXQgd2lsbCBub3QgY2hlY2sgdGhlIG5leHQgb25lLFxuICAgICAgICAgICAgICAgIC8vICAgICAgIHNvIG9uIGFuZCBzbyBmb3J0aC5cbiAgICAgICAgICAgICAgICBpZiAoY29uc2lkZXJIaWRkZW5TZXR0aW5nICYmIENvbW1vblV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbih3YWxrTm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTW92ZSBvbiB0byB0aGUgbmV4dCBub2RlXG4gICAgICAgICAgICAgICAgICAgIHdhbGtOb2RlID0gd2Fsa05vZGUubmV4dFNpYmxpbmc7XG5cbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBub2RlIGhhcyB0aGUgcm9sZSB0aGF0IHdlIG5lZWQgdG8gY2hlY2sgZXhpc3RzXG4gICAgICAgICAgICAgICAgaWYgKGNvbnNpZGVySW1wbGljaXRSb2xlKSB7XG4gICAgICAgICAgICAgICAgICAgIGhhc1JvbGUgPSBBcmlhVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3Mod2Fsa05vZGUsIHJvbGUpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGhhc1JvbGUgPSBBcmlhVXRpbC5oYXNSb2xlKHdhbGtOb2RlLCByb2xlLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gTW92ZSBvbiB0byB0aGUgbmV4dCBub2RlXG4gICAgICAgICAgICAgICAgd2Fsa05vZGUgPSB3YWxrTm9kZS5uZXh0U2libGluZztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSWYgd2Ugc3RpbGwgaGF2ZSBub3QgZm91bmQgYSBub2RlIHRoYXQgbWF0Y2hlcyB0aGUgcm9sZSwgc3RhcnQgYSByZXZlcnNlIGxvb2sgdXBcbiAgICAgICAgICAgIGlmICghd2Fsa05vZGUpIHtcbiAgICAgICAgICAgICAgICAvLyBGZXRjaCB0aGUgcHJldmlvdXMgU2libGluZyBvZiB0aGlzIGVsZW1lbnRcbiAgICAgICAgICAgICAgICB3YWxrTm9kZSA9IGVsZW1lbnQucHJldmlvdXNTaWJsaW5nO1xuXG4gICAgICAgICAgICAgICAgLy8gS2VlcCBsb29waW5nIG92ZXIgYWxsIHRoZSBwcmV2aW91cyBzaWJsaW5ncyB0byBzZWFyY2ggZm9yIGFuIGVsZW1lbnQgd2hpY2hcbiAgICAgICAgICAgICAgICAvLyBtYXRjaGVzIHRoZSBwcm92aWRlZCByb2xlLlxuICAgICAgICAgICAgICAgIHdoaWxlICh3YWxrTm9kZSAhPT0gbnVsbCAmJiAhaGFzUm9sZSkge1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIEZvbGxvd2luZyBhcmUgdGhlIHN0ZXBzIHRoYXQgYXJlIGV4ZWN1dGVkIGF0IHRoaXMgc3RhZ2UgdG8gZGV0ZXJtaW5lIGlmIHRoZSBub2RlIHNob3VsZCBiZSBjbGFzc2lmaWVkIGFzIGhpZGRlblxuICAgICAgICAgICAgICAgICAgICAvLyBvciBub3QuXG4gICAgICAgICAgICAgICAgICAgIC8vICAxLiBJZiBjb25zaWRlckhpZGRlblNldHRpbmcgb3B0aW9uIGlzIHNldCB0byB0cnVlIHRoZW4gd2UgcGVyZm9ybSB0aGUgY2hlY2sgdG8gY29uc2lkZXIgdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBDaGVjayBIaWRkZW4gQ29udGVudCB0aGF0IGlzIHByb3ZpZGVkLlxuICAgICAgICAgICAgICAgICAgICAvLyAgMi4gT25seSBydW4gaXNOb2RlVmlzaWJsZSBjaGVjayBpZiBoaWRkZW4gY29udGVudCBzaG91bGQgTk9UIGJlIGNoZWNrZWQuIEluIHRoZSBjYXNlIHRoYXQgaGlkZGVuIGNvbnRlbnQgaXMgdG8sXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBiZSBzY2FubmVkIHRoZW4gd2UgY2FuIGp1c3Qgc2NhbiBldmVyeXRoaW5nIGFzIG5vcm1hbC4gSW4gdGhlIGNhc2UgdGhhdCB0aGUgY3VycmVudCBub2RlIGlzIGhpZGRlbiB3ZSBkbyBub3RcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIGFkZCBpdCB0byB0aGUgcm9sZVRvRWxlbXMgaGFzaCBhdCBhbGwgb3IgZXZlbiBkbyBhbnkgY2hlY2tpbmcgZm9yIGl0IGF0IGFsbC5cbiAgICAgICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAgICAgLy8gTm90ZTogVGhlIGlmIGNvbmRpdGlvbnMgdXNlcyBzaG9ydC1jaXJjdWl0aW5nIHNvIGlmIHRoZSBmaXJzdCBjb25kaXRpb24gaXMgbm90IHRydWUgaXQgd2lsbCBub3QgY2hlY2sgdGhlIG5leHQgb25lLFxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgICBzbyBvbiBhbmQgc28gZm9ydGguXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb25zaWRlckhpZGRlblNldHRpbmcgJiYgQ29tbW9uVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKHdhbGtOb2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTW92ZSBvbiB0byB0aGUgbmV4dCBub2RlXG4gICAgICAgICAgICAgICAgICAgICAgICB3YWxrTm9kZSA9IHdhbGtOb2RlLnByZXZpb3VzU2libGluZztcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGlzIG5vZGUgaGFzIHRoZSByb2xlIHRoYXQgd2UgbmVlZCB0byBjaGVjayBleGlzdHNcbiAgICAgICAgICAgICAgICAgICAgaGFzUm9sZSA9IEFyaWFVdGlsLmhhc1JvbGUod2Fsa05vZGUsIHJvbGUsIGNvbnNpZGVySW1wbGljaXRSb2xlKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBNb3ZlIG9uIHRvIHRoZSBuZXh0IG5vZGVcbiAgICAgICAgICAgICAgICAgICAgd2Fsa05vZGUgPSB3YWxrTm9kZS5wcmV2aW91c1NpYmxpbmc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHdhbGtOb2RlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGdldHRpbmcgYSBkZXNjZW5kYW50IGVsZW1lbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHJvbGUsIHVuZGVyXG4gICAgICogdGhlIGVsZW1lbnQgdGhhdCB3YXMgcHJvdmlkZWQuXG4gICAgICpcbiAgICAgKiBOb3RlIGJ5IGRlZmF1bHQgdGhpcyBmdW5jdGlvbiB3aWxsIG5vdCBjb25zaWRlciB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgU2V0dGluZy5cbiAgICAgKlxuICAgICAqIE5vdGU6IFRoaXMgaXMgYSB3cmFwcGVyIGZ1bmN0aW9uIHRvOiBBcmlhVXRpbC5nZXREZXNjZW5kYW50V2l0aFJvbGVIaWRkZW5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBlbGVtZW50IC0gcGFyZW50IGVsZW1lbnQgZm9yIHdoaWNoIHdlIHdpbGwgYmUgY2hlY2tpbmcgZGVzY2VuZGFudHMgZm9yXG4gICAgICogQHBhcm0ge3N0cmluZ30gcm9sZU5hbWUgLSBUaGUgcm9sZSB0byBsb29rIGZvciBvbiB0aGUgZGVzY2VuZGFudCdzIGVsZW1lbnRzXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtub2RlfSAtIFRoZSBkZXNjZW5kYW50IGVsZW1lbnQgdGhhdCBtYXRjaGVzIHRoZSByb2xlIHNwZWNpZmllZCAob25seSBvbmUpXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldERlc2NlbmRhbnRXaXRoUm9sZShlbGVtZW50LCByb2xlTmFtZSkge1xuICAgICAgICByZXR1cm4gQXJpYVV0aWwuZ2V0RGVzY2VuZGFudFdpdGhSb2xlSGlkZGVuKGVsZW1lbnQsIHJvbGVOYW1lLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZ2V0dGluZyBhIGRlc2NlbmRhbnQgZWxlbWVudCB3aXRoIHRoZSBzcGVjaWZpZWQgcm9sZSwgdW5kZXJcbiAgICAgKiB0aGUgZWxlbWVudCB0aGF0IHdhcyBwcm92aWRlZC4gVGhpcyBmdW5jdGlvbiBhc2xvIGZpbmRzIGVsZW1lbnRzIHdpdGggaW1wbGljaXQgcm9sZXMuXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gZWxlbWVudCAtIHBhcmVudCBlbGVtZW50IGZvciB3aGljaCB3ZSB3aWxsIGJlIGNoZWNraW5nIGRlc2NlbmRhbnRzIGZvclxuICAgICAqIEBwYXJtIHtzdHJpbmd9IHJvbGVOYW1lIC0gVGhlIHJvbGUgdG8gbG9vayBmb3Igb24gdGhlIGRlc2NlbmRhbnQncyBlbGVtZW50c1xuICAgICAqIEBwYXJtIHtib29sfSBjb25zaWRlckhpZGRlblNldHRpbmcgLSB0cnVlIG9yIGZhbHNlIGJhc2VkIG9uIGlmIGhpZGRlbiBzZXR0aW5nIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAqIEBwYXJtIHtib29sfSBjb25zaWRlckltcGxpY2l0Um9sZXMgLSB0cnVlIG9yIGZhbHNlIGJhc2VkIG9uIGlmIGltcGxpY2l0IHJvbGVzIHNldHRpbmcgc2hvdWxkIGJlIGNvbnNpZGVyZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtub2RlfSAtIFRoZSBkZXNjZW5kYW50IGVsZW1lbnQgdGhhdCBtYXRjaGVzIHRoZSByb2xlIHNwZWNpZmllZCAob25seSBvbmUpXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldERlc2NlbmRhbnRXaXRoUm9sZUhpZGRlbihlbGVtZW50LCByb2xlTmFtZSwgY29uc2lkZXJIaWRkZW5TZXR0aW5nLCBjb25zaWRlckltcGxpY2l0Um9sZXM/KSB7XG4gICAgICAgIC8vIFZhcmlhYmxlIERlY2xlcmF0aW9uXG4gICAgICAgIGxldCBkZXNjZW5kYW50ID0gbnVsbDtcbiAgICAgICAgbGV0IG53ID0gbmV3IERPTVdhbGtlcihlbGVtZW50KTtcbiAgICAgICAgLy8gTG9vcCBvdmVyIGFsbCB0aGUgY2hpbGRyZW5zIG9mIHRoZSBlbGVtZW50IHByb3ZpZGVkIGFuZCBjaGVjayBpZiB0aGUgcm9sZW5hbWUgcHJvdmlkZWQgZXhpc3RzXG4gICAgICAgIHdoaWxlIChudy5uZXh0Tm9kZSgpICYmIG53Lm5vZGUgIT0gZWxlbWVudCAmJiBudy5ub2RlICE9IGVsZW1lbnQubmV4dFNpYmxpbmcpIHtcblxuICAgICAgICAgICAgLy8gRm9sbG93aW5nIGFyZSB0aGUgc3RlcHMgdGhhdCBhcmUgZXhlY3V0ZWQgYXQgdGhpcyBzdGFnZSB0byBkZXRlcm1pbmUgaWYgdGhlIG5vZGUgc2hvdWxkIGJlIGNsYXNzaWZpZWQgYXMgaGlkZGVuXG4gICAgICAgICAgICAvLyBvciBub3QuXG4gICAgICAgICAgICAvLyAgMS4gSWYgY29uc2lkZXJIaWRkZW5TZXR0aW5nIG9wdGlvbiBpcyBzZXQgdG8gdHJ1ZSB0aGVuIHdlIHBlcmZvcm0gdGhlIGNoZWNrIHRvIGNvbnNpZGVyIHRoZVxuICAgICAgICAgICAgLy8gICAgIENoZWNrIEhpZGRlbiBDb250ZW50IHRoYXQgaXMgcHJvdmlkZWQuXG4gICAgICAgICAgICAvLyAgMi4gT25seSBydW4gaXNOb2RlVmlzaWJsZSBjaGVjayBpZiBoaWRkZW4gY29udGVudCBzaG91bGQgTk9UIGJlIGNoZWNrZWQuIEluIHRoZSBjYXNlIHRoYXQgaGlkZGVuIGNvbnRlbnQgaXMgdG8sXG4gICAgICAgICAgICAvLyAgICAgYmUgc2Nhbm5lZCB0aGVuIHdlIGNhbiBqdXN0IHNjYW4gZXZlcnl0aGluZyBhcyBub3JtYWwuIEluIHRoZSBjYXNlIHRoYXQgdGhlIGN1cnJlbnQgbm9kZSBpcyBoaWRkZW4gd2UgZG8gbm90XG4gICAgICAgICAgICAvLyAgICAgYWRkIGl0IHRvIHRoZSByb2xlVG9FbGVtcyBoYXNoIGF0IGFsbCBvciBldmVuIGRvIGFueSBjaGVja2luZyBmb3IgaXQgYXQgYWxsLlxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIE5vdGU6IFRoZSBpZiBjb25kaXRpb25zIHVzZXMgc2hvcnQtY2lyY3VpdGluZyBzbyBpZiB0aGUgZmlyc3QgY29uZGl0aW9uIGlzIG5vdCB0cnVlIGl0IHdpbGwgbm90IGNoZWNrIHRoZSBuZXh0IG9uZSxcbiAgICAgICAgICAgIC8vICAgICAgIHNvIG9uIGFuZCBzbyBmb3J0aC5cbiAgICAgICAgICAgIGlmIChjb25zaWRlckhpZGRlblNldHRpbmcgJiYgQ29tbW9uVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKG53Lm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgbm9kZSBoYXMgdGhlIHJvbGUgc3BlY2lmaWVkLCBpZiBpdCBkb2VzIHRoZW4gc2V0IHRoaXMgYXMgdGhlIGRlc2NlbmRhbnQgYW5kIHN0b3AgY2hlY2tpbmcgdGhlIHJlc3Qgb2YgdGhlXG4gICAgICAgICAgICAvLyBub2Rlcy5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgbm9kZSBoYXMgdGhlIGltcGxpY2l0IHJvbGVzLCBpZiBpdCBkb2VzIHRoZW4gc2V0IHRoaXMgYXMgdGhlIGRlc2NlbmRhbnQgYW5kIHN0b3AgY2hlY2tpbmcgdGhlIHJlc3Qgb2YgdGhlXG4gICAgICAgICAgICAvLyBub2Rlcy5cbiAgICAgICAgICAgIGlmIChjb25zaWRlckltcGxpY2l0Um9sZXMgPyBBcmlhVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3Mobncubm9kZSwgcm9sZU5hbWUpIDogQXJpYVV0aWwuaGFzUm9sZShudy5ub2RlLCByb2xlTmFtZSwgZmFsc2UpKSB7XG4gICAgICAgICAgICAgICAgZGVzY2VuZGFudCA9IG53Lm5vZGU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGVzY2VuZGFudDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBnZXR0aW5nIEFsbCBkZXNjZW5kYW50IGVsZW1lbnRzIHdpdGggdGhlIHNwZWNpZmllZCByb2xlcywgdW5kZXJcbiAgICAgKiB0aGUgZWxlbWVudCB0aGF0IHdhcyBwcm92aWRlZC4gVGhpcyBmdW5jdGlvbiBhc2xvIGZpbmRzIGVsZW1lbnRzIHdpdGggaW1wbGljaXQgcm9sZXMuXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gZWxlbWVudCAtIHBhcmVudCBlbGVtZW50IGZvciB3aGljaCB3ZSB3aWxsIGJlIGNoZWNraW5nIGRlc2NlbmRhbnRzIGZvclxuICAgICAqIEBwYXJtIHtzdHJpbmdbXX0gcm9sZU5hbWVzIC0gVGhlIHJvbGVzIHRvIGxvb2sgZm9yIG9uIHRoZSBkZXNjZW5kYW50J3MgZWxlbWVudHNcbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJIaWRkZW5TZXR0aW5nIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBoaWRkZW4gc2V0dGluZyBzaG91bGQgYmUgY29uc2lkZXJlZC5cbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJJbXBsaWNpdFJvbGVzIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBpbXBsaWNpdCByb2xlcyBzZXR0aW5nIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAqXG4gICAgICogQHJldHVybiB7bm9kZVtdfSAtIGFsbCBkZXNjZW5kYW50IGVsZW1lbnRzIHRoYXQgbWF0Y2ggdGhlIHJvbGVzIHNwZWNpZmllZFxuICAgICAqXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRBbGxEZXNjZW5kYW50c1dpdGhSb2xlcyhlbGVtZW50LCByb2xlTmFtZXM6IHN0cmluZ1tdLCBjb25zaWRlckhpZGRlblNldHRpbmcsIGNvbnNpZGVySW1wbGljaXRSb2xlcykge1xuICAgICAgICBpZiAoIXJvbGVOYW1lcyB8fCByb2xlTmFtZXMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgICAgIC8vIFZhcmlhYmxlIERlY2xlcmF0aW9uXG4gICAgICAgIGxldCBkZXNjZW5kYW50cyA9IFtdO1xuXG4gICAgICAgIHJvbGVOYW1lcy5mb3JFYWNoKHJvbGVOYW1lID0+IHtcbiAgICAgICAgICAgIGxldCBraWRzID0gQXJpYVV0aWwuZ2V0QWxsRGVzY2VuZGFudHNXaXRoUm9sZUhpZGRlbihlbGVtZW50LCByb2xlTmFtZSwgY29uc2lkZXJIaWRkZW5TZXR0aW5nLCBjb25zaWRlckltcGxpY2l0Um9sZXMpO1xuICAgICAgICAgICAgaWYgKGtpZHMgJiYga2lkcy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgIGRlc2NlbmRhbnRzID0gZGVzY2VuZGFudHMuY29uY2F0KGtpZHMpO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGRlc2NlbmRhbnRzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGdldHRpbmcgQWxsIGRlc2NlbmRhbnQgZWxlbWVudHMgd2l0aCB0aGUgc3BlY2lmaWVkIHJvbGUsIHVuZGVyXG4gICAgICogdGhlIGVsZW1lbnQgdGhhdCB3YXMgcHJvdmlkZWQuIFRoaXMgZnVuY3Rpb24gYXNsbyBmaW5kcyBlbGVtZW50cyB3aXRoIGltcGxpY2l0IHJvbGVzLlxuICAgICAqXG4gICAgICogQHBhcm0ge2VsZW1lbnR9IGVsZW1lbnQgLSBwYXJlbnQgZWxlbWVudCBmb3Igd2hpY2ggd2Ugd2lsbCBiZSBjaGVja2luZyBkZXNjZW5kYW50cyBmb3JcbiAgICAgKiBAcGFybSB7c3RyaW5nfSByb2xlTmFtZSAtIFRoZSByb2xlIHRvIGxvb2sgZm9yIG9uIHRoZSBkZXNjZW5kYW50J3MgZWxlbWVudHNcbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJIaWRkZW5TZXR0aW5nIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBoaWRkZW4gc2V0dGluZyBzaG91bGQgYmUgY29uc2lkZXJlZC5cbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJJbXBsaWNpdFJvbGVzIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBpbXBsaWNpdCByb2xlcyBzZXR0aW5nIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAqXG4gICAgICogQHJldHVybiB7bm9kZVtdfSAtIFRoZSBkZXNjZW5kYW50IGVsZW1lbnRzIHRoYXQgbWF0Y2ggdGhlIHJvbGUgc3BlY2lmaWVkXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEFsbERlc2NlbmRhbnRzV2l0aFJvbGVIaWRkZW4oZWxlbWVudCwgcm9sZU5hbWU6IHN0cmluZywgY29uc2lkZXJIaWRkZW5TZXR0aW5nLCBjb25zaWRlckltcGxpY2l0Um9sZXMpIHtcbiAgICAgICAgLy8gVmFyaWFibGUgRGVjbGVyYXRpb25cbiAgICAgICAgbGV0IGRlc2NlbmRhbnRzID0gW107XG4gICAgICAgIGxldCBudyA9IG5ldyBET01XYWxrZXIoZWxlbWVudCk7XG4gICAgICAgIC8vIExvb3Agb3ZlciBhbGwgdGhlIGNoaWxkcmVucyBvZiB0aGUgZWxlbWVudCBwcm92aWRlZCBhbmQgY2hlY2sgaWYgdGhlIHJvbGVuYW1lIHByb3ZpZGVkIGV4aXN0c1xuICAgICAgICB3aGlsZSAobncubmV4dE5vZGUoKSAmJiBudy5ub2RlICE9IGVsZW1lbnQgJiYgbncubm9kZSAhPSBlbGVtZW50Lm5leHRTaWJsaW5nKSB7XG4gICAgICAgICAgICBpZiAobncuYkVuZFRhZykge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gRm9sbG93aW5nIGFyZSB0aGUgc3RlcHMgdGhhdCBhcmUgZXhlY3V0ZWQgYXQgdGhpcyBzdGFnZSB0byBkZXRlcm1pbmUgaWYgdGhlIG5vZGUgc2hvdWxkIGJlIGNsYXNzaWZpZWQgYXMgaGlkZGVuXG4gICAgICAgICAgICAvLyBvciBub3QuXG4gICAgICAgICAgICAvLyAgMS4gSWYgY29uc2lkZXJIaWRkZW5TZXR0aW5nIG9wdGlvbiBpcyBzZXQgdG8gdHJ1ZSB0aGVuIHdlIHBlcmZvcm0gdGhlIGNoZWNrIHRvIGNvbnNpZGVyIHRoZVxuICAgICAgICAgICAgLy8gICAgIENoZWNrIEhpZGRlbiBDb250ZW50IHRoYXQgaXMgcHJvdmlkZWQuXG4gICAgICAgICAgICAvLyAgMi4gT25seSBydW4gaXNOb2RlVmlzaWJsZSBjaGVjayBpZiBoaWRkZW4gY29udGVudCBzaG91bGQgTk9UIGJlIGNoZWNrZWQuIEluIHRoZSBjYXNlIHRoYXQgaGlkZGVuIGNvbnRlbnQgaXMgdG8sXG4gICAgICAgICAgICAvLyAgICAgYmUgc2Nhbm5lZCB0aGVuIHdlIGNhbiBqdXN0IHNjYW4gZXZlcnl0aGluZyBhcyBub3JtYWwuIEluIHRoZSBjYXNlIHRoYXQgdGhlIGN1cnJlbnQgbm9kZSBpcyBoaWRkZW4gd2UgZG8gbm90XG4gICAgICAgICAgICAvLyAgICAgYWRkIGl0IHRvIHRoZSByb2xlVG9FbGVtcyBoYXNoIGF0IGFsbCBvciBldmVuIGRvIGFueSBjaGVja2luZyBmb3IgaXQgYXQgYWxsLlxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIE5vdGU6IFRoZSBpZiBjb25kaXRpb25zIHVzZXMgc2hvcnQtY2lyY3VpdGluZyBzbyBpZiB0aGUgZmlyc3QgY29uZGl0aW9uIGlzIG5vdCB0cnVlIGl0IHdpbGwgbm90IGNoZWNrIHRoZSBuZXh0IG9uZSxcbiAgICAgICAgICAgIC8vICAgICAgIHNvIG9uIGFuZCBzbyBmb3J0aC5cbiAgICAgICAgICAgIGlmIChjb25zaWRlckhpZGRlblNldHRpbmcgJiYgQ29tbW9uVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKG53Lm5vZGUpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgbm9kZSBoYXMgdGhlIHJvbGUgc3BlY2lmaWVkLCBpZiBpdCBkb2VzIHRoZW4gc2V0IHRoaXMgYXMgdGhlIGRlc2NlbmRhbnQgYW5kIHN0b3AgY2hlY2tpbmcgdGhlIHJlc3Qgb2YgdGhlXG4gICAgICAgICAgICAvLyBub2Rlcy5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgbm9kZSBoYXMgdGhlIGltcGxpY2l0IHJvbGVzLCBpZiBpdCBkb2VzIHRoZW4gc2V0IHRoaXMgYXMgdGhlIGRlc2NlbmRhbnQgYW5kIHN0b3AgY2hlY2tpbmcgdGhlIHJlc3Qgb2YgdGhlXG4gICAgICAgICAgICAvLyBub2Rlcy5cbiAgICAgICAgICAgIGlmIChBcmlhVXRpbC5oYXNSb2xlKG53Lm5vZGUsIHJvbGVOYW1lLCBjb25zaWRlckltcGxpY2l0Um9sZXMpKSB7XG4gICAgICAgICAgICAgICAgZGVzY2VuZGFudHMucHVzaChudy5ub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkZXNjZW5kYW50cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBnZXR0aW5nIEFsbCBkaXJlY3QgY2hpbGRyZW4gaW4gQVQgdHJlZSB3aXRoIGEgcm9sZSAoZXhjbHVkZSBub25lIGFuZCBwcmVzZW50YXRpb24pXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gZWxlbWVudCAtIHBhcmVudCBlbGVtZW50IGZvciB3aGljaCB3ZSB3aWxsIGJlIGNoZWNraW5nIGNoaWxkcmVuIGZvclxuICAgICAqIEByZXR1cm4ge25vZGV9IC0gVGhlIGRpcmVjdCBjaGlsZCBlbGVtZW50cyBpbiBBVCB0cmVlIHRoYXQgaGFzIGEgcm9sZVxuICAgICAqXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXREaXJlY3RBVENoaWxkcmVuKGVsZW1lbnQpIHtcbiAgICAgICAgbGV0IHJlcXVpcmVkQ2hpbGRSb2xlcyA9IEFyaWFVdGlsLmdldFJlcXVpcmVkQ2hpbGRSb2xlcyhlbGVtZW50LCB0cnVlKTtcbiAgICAgICAgbGV0IGRpcmVjdDogQXJyYXk8SFRNTEVsZW1lbnQ+ID0gW107XG4gICAgICAgIEFyaWFVdGlsLnJldHJpZXZlRGlyZWN0QVRDaGlsZHJlbihlbGVtZW50LCByZXF1aXJlZENoaWxkUm9sZXMsIGRpcmVjdCk7XG4gICAgICAgIHJldHVybiBkaXJlY3Q7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgcmVjdXJzaXZlbHkgYW55IGNoaWxkIHBhdGggdGlsbCBlaXRoZXIgbm8gY2hpbGQgb3IgYSBjaGlsZCB3aXRoIGEgcm9sZSBpcyBmb3VuZCAoZXhjbHVkZSBub25lIGFuZCBwcmVzZW50YXRpb24pXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gZWxlbWVudCAtIHBhcmVudCBlbGVtZW50IGZvciB3aGljaCB3ZSB3aWxsIGJlIGNoZWNraW5nIGNoaWxkcmVuIGZvclxuICAgICAqIEByZXR1cm4ge25vZGV9IC0gVGhlIGRpcmVjdCBjaGlsZCBlbGVtZW50cyBpbiBBVCB0cmVlXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIHJldHJpZXZlRGlyZWN0QVRDaGlsZHJlbihlbGVtZW50LCByZXF1aXJlZENoaWxkUm9sZXMsIGRpcmVjdDogQXJyYXk8SFRNTEVsZW1lbnQ+KSB7XG4gICAgICAgIGxldCBjaGlsZHJlbjogSFRNTEVsZW1lbnRbXSA9IFtdO1xuICAgICAgICBpZiAoZWxlbWVudC5jaGlsZHJlbiAhPT0gbnVsbCAmJiBlbGVtZW50LmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWxlbWVudC5jaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goZWxlbWVudC5jaGlsZHJlbltpXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgdGhlIGVsZW1lbnQgY29udGFpbnMgXCJhcmlhLW93blwiIGF0dHJpYnV0ZSwgdGhlbiB0aGUgYXJpYS1vd25lZCBjaGlsZHJlbiBuZWVkIHRvIGJlIGluY2x1ZGVkIHRvb1xuICAgICAgICBsZXQgb3duZWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcImFyaWEtb3duc1wiKTtcbiAgICAgICAgaWYgKG93bmVkKSB7XG4gICAgICAgICAgICBsZXQgZG9jID0gZWxlbWVudC5vd25lckRvY3VtZW50O1xuICAgICAgICAgICAgaWYgKGRvYykge1xuICAgICAgICAgICAgICAgIGxldCBvd25lZElkcyA9IG93bmVkLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG93bmVkSWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBvd25lZEVsZW0gPSBkb2MuZ2V0RWxlbWVudEJ5SWQob3duZWRJZHNbaV0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAob3duZWRFbGVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbi5wdXNoKG93bmVkRWxlbSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAvL2lnbm9yZSBoaWRkZW4gYW5kIGludmlzaWJsZSBjaGlsZFxuICAgICAgICAgICAgICAgIGlmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChjaGlsZHJlbltpXSkgfHwgIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShjaGlsZHJlbltpXSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGxldCByb2xlcyA9IEFyaWFVdGlsLmdldFJvbGVzKGNoaWxkcmVuW2ldLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgaWYgKHJvbGVzID09PSBudWxsIHx8IHJvbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICByb2xlcyA9IEFyaWFVdGlsLmdldEltcGxpY2l0Um9sZShjaGlsZHJlbltpXSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKHJvbGVzICYmIHJvbGVzICE9PSBudWxsICYmIHJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgLy9yZW1vdmUgJ25vbmUnIGFuZCAncHJlc2VudGF0aW9uJ1xuICAgICAgICAgICAgICAgICAgICByb2xlcyA9IHJvbGVzLmZpbHRlcihmdW5jdGlvbiAocm9sZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJvbGUgIT09IFwibm9uZVwiICYmIHJvbGUgIT09IFwicHJlc2VudGF0aW9uXCI7XG4gICAgICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICAgICAgLy8gYSAnZ3JvdXAnIHJvbGUgaXMgYWxsb3dlZCBidXQgbm90IHJlcXVpcmVkIGZvciBzb21lIGVsZW1lbnRzIHNvIHJlbW92ZSBpdCBpZiBleGlzdHNcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJvbGVzLmluY2x1ZGVzKFwiZ3JvdXBcIikgJiYgcmVxdWlyZWRDaGlsZFJvbGVzICYmIHJlcXVpcmVkQ2hpbGRSb2xlcy5pbmNsdWRlcygnZ3JvdXAnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcm9sZXMgPSByb2xlcy5maWx0ZXIoZnVuY3Rpb24gKHJvbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcm9sZSAhPT0gJ2dyb3VwJztcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHJvbGVzICYmIHJvbGVzICE9PSBudWxsICYmIHJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZGlyZWN0LnB1c2goY2hpbGRyZW5baV0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHJlY3Vyc2l2ZSB1bnRpbCBnZXQgYSByZXR1cm4gdmFsdWUsIFxuICAgICAgICAgICAgICAgICAgICBBcmlhVXRpbC5yZXRyaWV2ZURpcmVjdEFUQ2hpbGRyZW4oY2hpbGRyZW5baV0sIHJlcXVpcmVkQ2hpbGRSb2xlcywgZGlyZWN0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgbnVsbCBvciByZXF1aXJlZCBjaGlsZCByb2xlcyBmb3IgYSBnaXZlbiBlbGVtZW50IHdpdGggb25lIG1vcmUgcm9sZXMsXG4gICAgICogcmV0dXJuIG51bGwgaWYgdGhlIHJvbGUgaXMgJ25vbmUnIG9yICdwcmVzZW50YXRpb24nXG4gICAgICogQHBhcmFtIGVsZW1lbnQgXG4gICAgICogQHBhcmFtIGluY2x1ZGVJbXBsaWNpdCBpbmNsdWRlIGltcGxpY2l0IHJvbGVzIGlmIG5vIHJvbGUgaXMgZXhwbGljaXRseSBwcm92aWRlZFxuICAgICAqIEByZXR1cm5zIFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0UmVxdWlyZWRDaGlsZFJvbGVzKGVsZW1lbnQsIGluY2x1ZGVJbXBsaWNpdDogYm9vbGVhbik6IHN0cmluZ1tdIHtcbiAgICAgICAgbGV0IHJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXMoZWxlbWVudCwgZmFsc2UpO1xuICAgICAgICAvLyBpZiBleHBsaWNpdCByb2xlIGRvZXNuJ3QgZXhpc3QsIGdldCB0aGUgaW1wbGljaXQgb25lXG4gICAgICAgIGlmICgoIXJvbGVzIHx8IHJvbGVzLmxlbmd0aCA9PT0gMCkgJiYgaW5jbHVkZUltcGxpY2l0KSB7XG4gICAgICAgICAgICByb2xlcyA9IEFyaWFVdGlsLmdldEltcGxpY2l0Um9sZShlbGVtZW50KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKiAgXG4gICAgICAgICAqIGlnbm9yZSBpZiB0aGUgZWxlbWVudCBkb2Vzbid0IGhhdmUgYW55IGV4cGxpY2l0IG9yIGltcGxpY2l0IHJvbGVcbiAgICAgICAgKi9cbiAgICAgICAgaWYgKCFyb2xlcyB8fCByb2xlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLyoqICBcbiAgICAgICAgICogaWdub3JlIGlmIHRoZSBlbGVtZW50IGNvbnRhaW5zIG5vbmUgb3IgcHJlc2VudGF0aW9uIHJvbGVcbiAgICAgICAgKi9cbiAgICAgICAgbGV0IHByZXNlbnRhdGlvblJvbGVzID0gW1wibm9uZVwiLCBcInByZXNlbnRhdGlvblwiXTtcbiAgICAgICAgY29uc3QgZm91bmQgPSByb2xlcy5zb21lKHIgPT4gcHJlc2VudGF0aW9uUm9sZXMuaW5jbHVkZXMocikpO1xuICAgICAgICBpZiAoZm91bmQpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCBkZXNpZ25QYXR0ZXJucyA9IEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJucztcbiAgICAgICAgbGV0IHJlcXVpcmVkQ2hpbGRSb2xlczogc3RyaW5nW10gPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByb2xlcy5sZW5ndGg7ICsraikge1xuICAgICAgICAgICAgaWYgKGRlc2lnblBhdHRlcm5zW3JvbGVzW2pdXSAmJiBkZXNpZ25QYXR0ZXJuc1tyb2xlc1tqXV0ucmVxQ2hpbGRyZW4gIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXF1aXJlZENoaWxkUm9sZXMgPSBDb21tb25VdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QoZGVzaWduUGF0dGVybnNbcm9sZXNbal1dLnJlcUNoaWxkcmVuLCByZXF1aXJlZENoaWxkUm9sZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXF1aXJlZENoaWxkUm9sZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZ2V0dGluZyBhbiBlbGVtZW50IHJlZmVyZW5jZWQgYnkgYXJpYS1vd25zIGFuZCBoYXMgdGhlXG4gICAgICogcm9sZSB0aGF0IHdhcyBzcGVjaWZpZWQuXG4gICAgICpcbiAgICAgKiBOb3RlIGJ5IGRlZmF1bHQgdGhpcyBmdW5jdGlvbiB3aWxsIG5vdCBjb25zaWRlciB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnQgU2V0dGluZy5cbiAgICAgKlxuICAgICAqIE5vdGU6IFRoaXMgaXMgYSB3cmFwcGVyIGZ1bmN0aW9uIHRvOiBBcmlhVXRpbC5nZXRBcmlhT3duc1dpdGhSb2xlSGlkZGVuXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gZWxlbWVudCAtIEVsZW1lbnQgdG8gY2hlY2sgZm9yIGFyaWEtb3duc1xuICAgICAqIEBwYXJtIHtzdHJpbmd9IHJvbGVOYW1lIC0gVGhlIHJvbGUgdG8gbG9vayBmb3Igb24gdGhlIGFyaWEtb3ducyBlbGVtZW50XG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtub2RlfSAtIFRoZSBlbGVtZW50IHRoYXQgaXMgcmVmZXJlbmNlZCBieSBhcmlhLW93bnMgYW5kIGhhcyByb2xlIHNwZWNpZmllZC5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0QXJpYU93bnNXaXRoUm9sZShlbGVtZW50LCByb2xlTmFtZSkge1xuICAgICAgICByZXR1cm4gQXJpYVV0aWwuZ2V0QXJpYU93bnNXaXRoUm9sZUhpZGRlbihlbGVtZW50LCByb2xlTmFtZSwgZmFsc2UpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGdldHRpbmcgYW4gZWxlbWVudCByZWZlcmVuY2VkIGJ5IGFyaWEtb3ducyBhbmQgaGFzIHRoZVxuICAgICAqIHJvbGUgdGhhdCB3YXMgc3BlY2lmaWVkLiBUaGlzIGZ1bmN0aW9uIGFzbG8gZmluZHMgZWxlbWVudHMgd2l0aCBpbXBsaWNpdCByb2xlcy5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBlbGVtZW50IC0gRWxlbWVudCB0byBjaGVjayBmb3IgYXJpYS1vd25zXG4gICAgICogQHBhcm0ge3N0cmluZ30gcm9sZU5hbWUgLSBUaGUgcm9sZSB0byBsb29rIGZvciBvbiB0aGUgYXJpYS1vd25zIGVsZW1lbnRcbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJIaWRkZW5TZXR0aW5nIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBoaWRkZW4gc2V0dGluZyBzaG91bGQgYmUgY29uc2lkZXJlZC5cbiAgICAgKiBAcGFybSB7Ym9vbH0gY29uc2lkZXJJbXBsaWNpdFJvbGVzIC0gdHJ1ZSBvciBmYWxzZSBiYXNlZCBvbiBpZiBpbXBsaWNpdCByb2xlcyBzZXR0aW5nIHNob3VsZCBiZSBjb25zaWRlcmVkLlxuICAgICAqXG4gICAgICogQHJldHVybiB7bm9kZX0gLSBUaGUgZWxlbWVudCB0aGF0IGlzIHJlZmVyZW5jZWQgYnkgYXJpYS1vd25zIGFuZCBoYXMgcm9sZSBzcGVjaWZpZWQuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEFyaWFPd25zV2l0aFJvbGVIaWRkZW4oZWxlbWVudCwgcm9sZU5hbWUsIGNvbnNpZGVySGlkZGVuU2V0dGluZywgY29uc2lkZXJJbXBsaWNpdFJvbGVzPykge1xuICAgICAgICAvLyBWYXJpYWJsZSBEZWNsZXJhdGlvblxuICAgICAgICBsZXQgcmVmZXJlbmNlZEVsZW1lbnQgPSBudWxsO1xuICAgICAgICBsZXQgcmVmZXJlbmNlZEVsZW1IYXNSb2xlID0gZmFsc2U7XG5cbiAgICAgICAgLy8gSW4gdGhlIGNhc2UgYXJpYS1vd25zIGlzIG5vdCBvbiB0aGUgZWxlbWVudCBqdXN0IGJyZWFrIG91dCBvZiB0aGlzIGZ1bmN0aW9uIHdpdGggbnVsbFxuICAgICAgICBpZiAoQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShlbGVtZW50LCBcImFyaWEtb3duc1wiKSkge1xuXG4gICAgICAgICAgICAvLyBHZXQgdGhlIHJlZmVyZW5jZSBJRFxuICAgICAgICAgICAgbGV0IHJlZmVyZW5jZUlEID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJhcmlhLW93bnNcIik7XG5cbiAgICAgICAgICAgIC8vIEdldCB0aGUgZWxlbWVudCBmb3IgdGhlIHJlZmVyZW5jZSBJRFxuICAgICAgICAgICAgcmVmZXJlbmNlZEVsZW1lbnQgPSBGcmFnbWVudFV0aWwuZ2V0QnlJZChlbGVtZW50LCByZWZlcmVuY2VJRCk7XG4gICAgICAgICAgICAvL2lnbm9yZSBpZiB0aGUgYXJpYS1vd25zIHBvaW50IHRvIHRoZSBlbGVtZW50IGl0c2VsZlxuICAgICAgICAgICAgaWYgKERPTVV0aWwuc2FtZU5vZGUoZWxlbWVudCwgcmVmZXJlbmNlZEVsZW1lbnQpKVxuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgICAgICAvLyBGb2xsb3dpbmcgYXJlIHRoZSBzdGVwcyB0aGF0IGFyZSBleGVjdXRlZCBhdCB0aGlzIHN0YWdlIHRvIGRldGVybWluZSBpZiB0aGUgbm9kZSBzaG91bGQgYmUgY2xhc3NpZmllZCBhcyBoaWRkZW5cbiAgICAgICAgICAgIC8vIG9yIG5vdC5cbiAgICAgICAgICAgIC8vICAxLiBJZiBjb25zaWRlckhpZGRlblNldHRpbmcgb3B0aW9uIGlzIHNldCB0byB0cnVlIHRoZW4gd2UgcGVyZm9ybSB0aGUgY2hlY2sgdG8gY29uc2lkZXIgdGhlXG4gICAgICAgICAgICAvLyAgICAgQ2hlY2sgSGlkZGVuIENvbnRlbnQgdGhhdCBpcyBwcm92aWRlZC5cbiAgICAgICAgICAgIC8vICAyLiBPbmx5IHJ1biBpc05vZGVWaXNpYmxlIGNoZWNrIGlmIGhpZGRlbiBjb250ZW50IHNob3VsZCBOT1QgYmUgY2hlY2tlZC4gSW4gdGhlIGNhc2UgdGhhdCBoaWRkZW4gY29udGVudCBpcyB0byxcbiAgICAgICAgICAgIC8vICAgICBiZSBzY2FubmVkIHRoZW4gd2UgY2FuIGp1c3Qgc2NhbiBldmVyeXRoaW5nIGFzIG5vcm1hbC4gSW4gdGhlIGNhc2UgdGhhdCB0aGUgY3VycmVudCBub2RlIGlzIGhpZGRlbiB3ZSBkbyBub3RcbiAgICAgICAgICAgIC8vICAgICBhZGQgaXQgdG8gdGhlIHJvbGVUb0VsZW1zIGhhc2ggYXQgYWxsIG9yIGV2ZW4gZG8gYW55IGNoZWNraW5nIGZvciBpdCBhdCBhbGwuXG4gICAgICAgICAgICBpZiAoY29uc2lkZXJIaWRkZW5TZXR0aW5nICYmIHJlZmVyZW5jZWRFbGVtZW50ICE9IG51bGwgJiYgQ29tbW9uVXRpbC5zaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKHJlZmVyZW5jZWRFbGVtZW50KSkge1xuICAgICAgICAgICAgICAgIHJlZmVyZW5jZWRFbGVtSGFzUm9sZSA9IG51bGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlZmVyZW5jZWRFbGVtSGFzUm9sZSA9IEFyaWFVdGlsLmhhc1JvbGUocmVmZXJlbmNlZEVsZW1lbnQsIHJvbGVOYW1lLCBjb25zaWRlckltcGxpY2l0Um9sZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZWZlcmVuY2VkRWxlbUhhc1JvbGUgPyByZWZlcmVuY2VkRWxlbWVudCA6IG51bGw7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHRydWUgaWYgdGhlIGVsZW1lbnQgaGFzIGFuIEFSSUEgbGFiZWxcbiAgICBwdWJsaWMgc3RhdGljIGhhc0FyaWFMYWJlbChlbGVtZW50KSB7XG5cbiAgICAgICAgLy8gUnB0X0FyaWFfVmFsaWRJZFJlZiBkZXRlcm1pbmVzIGlmIHRoZSBhcmlhLWxhYmVsbGVkYnkgaWQgcG9pbnRzIHRvIGEgdmFsaWQgZWxlbWVudFxuICAgICAgICByZXR1cm4gQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShlbGVtZW50LCBcImFyaWEtbGFiZWxcIikgfHwgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShlbGVtZW50LCBcImFyaWEtbGFiZWxsZWRieVwiKTtcbiAgICB9XG5cbiAgICAvLyBHaXZlbiBhbiBhcnJheSBvZiBlbGVtZW50cywgcmV0dXJuIHRydWUgaWYgdGhlIGVsZW1lbnRzIGhhdmUgdW5pcXVlIEFSSUEgbGFiZWxzXG4gICAgcHVibGljIHN0YXRpYyBoYXNVbmlxdWVBcmlhTGFiZWxzTG9jYWxseShlbGVtZW50cywgaXNHbG9iYWwpIHtcbiAgICAgICAgaWYgKGVsZW1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsZXQgZG9jID0gZWxlbWVudHNbMF0ub3duZXJEb2N1bWVudDtcbiAgICAgICAgbGV0IGhhc0R1cGxpY2F0ZUxhYmVscyA9IGZhbHNlO1xuICAgICAgICBsZXQgdW5pcXVlQXJpYUxhYmVscyA9IG51bGw7XG5cbiAgICAgICAgaWYgKGlzR2xvYmFsKSB7XG4gICAgICAgICAgICB1bmlxdWVBcmlhTGFiZWxzID0gQ2FjaGVVdGlsLmdldENhY2hlKGRvYywgXCJBcmlhVXRpbF9IQVNfVU5JUVVFX0FSSUFfTEFCRUxTXCIsIG51bGwpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1bmlxdWVBcmlhTGFiZWxzID09PSBudWxsKSB7XG4gICAgICAgICAgICB1bmlxdWVBcmlhTGFiZWxzID0ge307XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgIWhhc0R1cGxpY2F0ZUxhYmVscyAmJiBpIDwgZWxlbWVudHMubGVuZ3RoOyArK2kpIHtcblxuICAgICAgICAgICAgaWYgKGVsZW1lbnRzW2ldLmhhc0F0dHJpYnV0ZSkge1xuXG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnRzW2ldLmhhc0F0dHJpYnV0ZShcImFyaWEtbGFiZWxcIikpIHtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgYXJpYUxhYmVsID0gQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKGVsZW1lbnRzW2ldLmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxcIikpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgIGhhc0R1cGxpY2F0ZUxhYmVscyA9IGFyaWFMYWJlbCBpbiB1bmlxdWVBcmlhTGFiZWxzO1xuICAgICAgICAgICAgICAgICAgICB1bmlxdWVBcmlhTGFiZWxzW2FyaWFMYWJlbF0gPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50c1tpXS5oYXNBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsbGVkYnlcIikpIHtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgbGFiZWxJRCA9IGVsZW1lbnRzW2ldLmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsTm9kZSA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKGVsZW1lbnRzW2ldLCBsYWJlbElEKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhYmVsTm9kZSAmJiAhRE9NVXRpbC5zYW1lTm9kZShsYWJlbE5vZGUsIGVsZW1lbnRzW2ldKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBBcmlhVXRpbC5nZXRUZXh0Q29udGVudEV4Y2x1ZGluZ1NjcmlwdHMobGFiZWxOb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZXQgbm9ybWFsaXplZExhYmVsID0gQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKGxhYmVsKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICBoYXNEdXBsaWNhdGVMYWJlbHMgPSBub3JtYWxpemVkTGFiZWwgaW4gdW5pcXVlQXJpYUxhYmVscztcbiAgICAgICAgICAgICAgICAgICAgdW5pcXVlQXJpYUxhYmVsc1tub3JtYWxpemVkTGFiZWxdID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEhhcyBubyBsYWJlbCBhdCBhbGxcbiAgICAgICAgICAgICAgICAgICAgaGFzRHVwbGljYXRlTGFiZWxzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzR2xvYmFsKSB7XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZG9jLCBcIkFyaWFVdGlsX0hBU19VTklRVUVfQVJJQV9MQUJFTFNcIiwgdW5pcXVlQXJpYUxhYmVscyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICFoYXNEdXBsaWNhdGVMYWJlbHM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRleHQgY29udGVudCBmcm9tIGFuIGVsZW1lbnQsIGV4Y2x1ZGluZyBzY3JpcHQgYW5kIHN0eWxlIGVsZW1lbnRzXG4gICAgICogVGhpcyBpcyBhIHNpbXBsaWZpZWQgdmVyc2lvbiB0aGF0IGRvZXNuJ3QgZ28gdGhyb3VnaCBmdWxsIGFjY2Vzc2libGUgbmFtZSBjb21wdXRhdGlvblxuICAgICAqIHRvIGF2b2lkIGNpcmN1bGFyIGRlcGVuZGVuY2llcyB3aGVuIGNhbGxlZCBmcm9tIGdldEFyaWFMYWJlbFxuICAgICAqXG4gICAgICogTm90ZTogV2hlbiBhbiBlbGVtZW50IGlzIHJlZmVyZW5jZWQgYnkgYXJpYS1sYWJlbGxlZGJ5LCBpdHMgY29udGVudCBpcyBpbmNsdWRlZFxuICAgICAqIGV2ZW4gaWYgdGhlIGVsZW1lbnQgaXMgaGlkZGVuIChwZXIgQVJJQSBzcGVjKVxuICAgICAqL1xuICAgIHByaXZhdGUgc3RhdGljIGdldFRleHRDb250ZW50RXhjbHVkaW5nU2NyaXB0cyhlbGVtOiBFbGVtZW50KTogc3RyaW5nIHtcbiAgICAgICAgaWYgKCFlbGVtKSByZXR1cm4gXCJcIjtcbiAgICAgICAgXG4gICAgICAgIGxldCB0ZXh0ID0gXCJcIjtcbiAgICAgICAgbGV0IG53ID0gbmV3IERPTVdhbGtlcihlbGVtKTtcbiAgICAgICAgXG4gICAgICAgIHdoaWxlIChudy5uZXh0Tm9kZSgpICYmIG53Lm5vZGUgIT09IGVsZW0gJiYgbncubm9kZSAhPT0gZWxlbS5wYXJlbnROb2RlKSB7XG4gICAgICAgICAgICBpZiAobncuYkVuZFRhZykgY29udGludWU7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBudy5ub2RlO1xuICAgICAgICAgICAgY29uc3Qgbm9kZU5hbWUgPSBub2RlLm5vZGVOYW1lID8gbm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIDogXCJcIjtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gU2tpcCBzY3JpcHQgYW5kIHN0eWxlIGVsZW1lbnRzXG4gICAgICAgICAgICBpZiAobm9kZU5hbWUgPT09ICdzY3JpcHQnIHx8IG5vZGVOYW1lID09PSAnc3R5bGUnKSB7XG4gICAgICAgICAgICAgICAgbncuYkVuZFRhZyA9IHRydWU7IC8vIFNraXAgY2hpbGRyZW5cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDMpIHsgLy8gVGV4dCBub2RlXG4gICAgICAgICAgICAgICAgLy8gSW5jbHVkZSB0ZXh0IGV2ZW4gZnJvbSBoaWRkZW4gZWxlbWVudHMgd2hlbiByZWZlcmVuY2VkIGJ5IGFyaWEtbGFiZWxsZWRieVxuICAgICAgICAgICAgICAgIGlmIChub2RlLm5vZGVWYWx1ZSAmJiBub2RlLm5vZGVWYWx1ZS50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9IFwiIFwiICsgbm9kZS5ub2RlVmFsdWUudHJpbSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAobm9kZS5ub2RlVHlwZSA9PT0gMSkgeyAvLyBFbGVtZW50IG5vZGVcbiAgICAgICAgICAgICAgICAvLyBIYW5kbGUgaW1hZ2VzIC0gZ2V0IGFsdCB0ZXh0XG4gICAgICAgICAgICAgICAgaWYgKG5vZGVOYW1lID09PSAnaW1nJyAmJiAobm9kZSBhcyBFbGVtZW50KS5oYXNBdHRyaWJ1dGUoJ2FsdCcpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRleHQgKz0gXCIgXCIgKyAobm9kZSBhcyBFbGVtZW50KS5nZXRBdHRyaWJ1dGUoJ2FsdCcpLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgbncuYkVuZFRhZyA9IHRydWU7IC8vIFNraXAgY2hpbGRyZW4gb2YgaW1nXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIEhhbmRsZSBpbnB1dCB3aXRoIHR5cGU9XCJpbWFnZVwiIC0gZ2V0IGFsdCB0ZXh0XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAobm9kZU5hbWUgPT09ICdpbnB1dCcgJiYgKG5vZGUgYXMgRWxlbWVudCkuZ2V0QXR0cmlidXRlKCd0eXBlJykgPT09ICdpbWFnZScgJiYgKG5vZGUgYXMgRWxlbWVudCkuaGFzQXR0cmlidXRlKCdhbHQnKSkge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9IFwiIFwiICsgKG5vZGUgYXMgRWxlbWVudCkuZ2V0QXR0cmlidXRlKCdhbHQnKS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgIG53LmJFbmRUYWcgPSB0cnVlOyAvLyBTa2lwIGNoaWxkcmVuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gdGV4dC50cmltKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRBcmlhTGFiZWwoZWxlKSB7XG4gICAgICAgIGlmIChlbGUuaGFzQXR0cmlidXRlKSB7XG4gICAgICAgICAgICBpZiAoZWxlLmhhc0F0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKSkge1xuICAgICAgICAgICAgICAgIGxldCBsYWJlbElEcyA9IGVsZS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsbGVkYnlcIikudHJpbSgpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgICAgICBsZXQgbm9ybWFsaXplZExhYmVsID0gXCJcIjtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMCwgbGVuZ3RoID0gbGFiZWxJRHMubGVuZ3RoOyBqIDwgbGVuZ3RoOyArK2opIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsSUQgPSBsYWJlbElEc1tqXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsTm9kZSA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKGVsZSwgbGFiZWxJRCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsYWJlbE5vZGUgJiYgIURPTVV0aWwuc2FtZU5vZGUobGFiZWxOb2RlLCBlbGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2Ugb3VyIGhlbHBlciB0byBnZXQgdGV4dCBjb250ZW50IHdpdGhvdXQgY2lyY3VsYXIgZGVwZW5kZW5jeVxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsID0gQXJpYVV0aWwuZ2V0VGV4dENvbnRlbnRFeGNsdWRpbmdTY3JpcHRzKGxhYmVsTm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkTGFiZWwgKz0gQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKGxhYmVsKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gbm9ybWFsaXplZExhYmVsLnRyaW0oKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZWxlLmhhc0F0dHJpYnV0ZShcImFyaWEtbGFiZWxcIikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKGVsZS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsXCIpKS50cmltKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRBcmlhRGVzY3JpcHRpb24oZWxlKSB7XG4gICAgICAgIGlmICghZWxlKSByZXR1cm4gXCJcIjtcbiAgICAgICAgbGV0IG5vcm1hbGl6ZWRMYWJlbCA9IFwiXCI7XG4gICAgICAgIGxldCBkZXNjID0gZWxlLmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKTtcbiAgICAgICAgaWYgKGRlc2MgJiYgZGVzYy50cmltKCkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGV0IGxhYmVsSURzID0gZGVzYy50cmltKCkuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDAsIGxlbmd0aCA9IGxhYmVsSURzLmxlbmd0aDsgaiA8IGxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICAgICAgbGV0IGxhYmVsSUQgPSBsYWJlbElEc1tqXTtcbiAgICAgICAgICAgICAgICBsZXQgbGFiZWxOb2RlID0gRnJhZ21lbnRVdGlsLmdldEJ5SWQoZWxlLCBsYWJlbElEKTtcbiAgICAgICAgICAgICAgICBpZiAobGFiZWxOb2RlICYmICFET01VdGlsLnNhbWVOb2RlKGxhYmVsTm9kZSwgZWxlKSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbGFiZWwgPSBBcmlhVXRpbC5nZXRUZXh0Q29udGVudEV4Y2x1ZGluZ1NjcmlwdHMobGFiZWxOb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhYmVsICYmIGxhYmVsLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZExhYmVsICs9IENvbW1vblV0aWwubm9ybWFsaXplU3BhY2luZyhsYWJlbCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobm9ybWFsaXplZExhYmVsLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgIHJldHVybiBub3JtYWxpemVkTGFiZWwudHJpbSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVzYyA9IGVsZS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWRlc2NyaXB0aW9uXCIpO1xuICAgICAgICBpZiAoZGVzYyAmJiBkZXNjLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgcmV0dXJuIGRlc2MudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gXCJcIjtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGZpbmRBcmlhTGFiZWxEdXBlcyhlbGVtZW50cykge1xuICAgICAgICBsZXQgZHVwZU1hcCA9IHt9XG4gICAgICAgIGVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKGVsZSkge1xuICAgICAgICAgICAgZHVwZU1hcFtBcmlhVXRpbC5nZXRBcmlhTGFiZWwoZWxlKV0gPSAoZHVwZU1hcFtBcmlhVXRpbC5nZXRBcmlhTGFiZWwoZWxlKV0gfHwgMCkgKyAxO1xuICAgICAgICB9KVxuICAgICAgICByZXR1cm4gZHVwZU1hcDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiByZXR1cm4gYWNjZXNzaWJsZSBuYW1lcyBmb3IgYWxsIEFUIHZpc2libGUgbGFuZG1hcmsgZWxlbWVudHMgXG4gICAgICogQHBhcmFtIGRvYyBcbiAgICAgKiBAcmV0dXJucyBcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldExhbmRtYXJrQWNjTmFtZXMoZG9jKSB7XG4gICAgICAgIGxldCBuYW1lTWFwID0gQ2FjaGVVdGlsLmdldENhY2hlKGRvYywgXCJBcmlhVXRpbF9MYW5kbWFya19BY2NOYW1lc1wiLCBudWxsKTtcbiAgICAgICAgaWYgKG5hbWVNYXAgJiYgbmFtZU1hcC5sZW5ndGggIT09IDApIFxuICAgICAgICAgICAgcmV0dXJuIG5hbWVNYXA7XG5cbiAgICAgICAgbmFtZU1hcCA9IFtdO1xuICAgICAgICBsZXQgbGFuZG1hcmtFbGVtcyA9IGRvYy5xdWVyeVNlbGVjdG9yQWxsKFxuICAgICAgICAgICAgJ2FzaWRlLFtyb2xlPVwiY29tcGxlbWVudGFyeVwiXSwgZm9vdGVyLFtyb2xlPVwiY29udGVudGluZm9cIl0sIGhlYWRlcixbcm9sZT1cImJhbm5lclwiXSwgbWFpbixbcm9sZT1cIm1haW5cIl0sIG5hdixbcm9sZT1cIm5hdmlnYXRpb25cIl0sIGZvcm0sW3JvbGU9XCJmb3JtXCJdLCBzZWN0aW9uLFtyb2xlPVwicmVnaW9uXCJdLCBhcnRpY2xlLFtyb2xlPVwiYXJ0aWNsZVwiXSwgW3JvbGU9XCJzZWFyY2hcIl0sW3JvbGU9XCJhcHBsaWNhdGlvblwiXSxbcm9sZT1cImRvY3VtZW50XCJdJ1xuICAgICAgICApO1xuXG4gICAgICAgIGlmIChsYW5kbWFya0VsZW1zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGRvYywgXCJBcmlhVXRpbF9MYW5kbWFya19BY2NOYW1lc1wiLCBuYW1lTWFwKTtcbiAgICAgICAgICAgIHJldHVybiBuYW1lTWFwO1xuICAgICAgICB9XG5cbiAgICAgICAgbGFuZG1hcmtFbGVtcy5mb3JFYWNoKGZ1bmN0aW9uIChlbGVtOiBFbGVtZW50KSB7XG4gICAgICAgICAgICAvLyBpZ25vcmUgbm9kZSB0aGF0IGlzIEFUIGhpZGRlbiBvciBpbiBhIGRpYWxvZyB0aGF0IGlzIGNvbnNpZGVyZWQgYXMgYSBzZXBhcmF0ZSBsb2NhdGlvbiBmcm9tIHRoZSByZXN0IG9mIHRoZSBtYWluIHBhZ2VcbiAgICAgICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVIaWRkZW5Gcm9tQVQoZWxlbSkgJiYgQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihlbGVtLCBbXCJESUFMT0dcIl0pID09PSBudWxsICYmIEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUoZWxlbSwgXCJkaWFsb2dcIiwgdHJ1ZSkgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBsZXQgbmFtZSA9IFwiXCI7XG4gICAgICAgICAgICAgICAgbGV0IHBhaXIgPSBBY2NOYW1lVXRpbC5jb21wdXRlQWNjZXNzaWJsZU5hbWUoZWxlbSk7XG4gICAgICAgICAgICAgICAgaWYgKHBhaXIgJiYgcGFpci5uYW1lICYmIHBhaXIubmFtZS50cmltKCkubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHBhaXIubmFtZS50cmltKCk7XG5cbiAgICAgICAgICAgICAgICAvLyBjaGVjayBuZWVzdGVkIGxhbmRtYXJrIHRvIGNhbGN1bGF0ZSB0aGUgYWNjZXNzaWJsZSBuYW1lXG4gICAgICAgICAgICAgICAgY29uc3QgYW5jZXN0b3JzID0gWy4uLmxhbmRtYXJrRWxlbXNdLmZpbHRlcigoZSkgPT4gZS5jb250YWlucyhlbGVtKSAmJiBlICE9PSBlbGVtKTtcbiAgICAgICAgICAgICAgICBpZiAoYW5jZXN0b3JzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgYW5jZXN0b3JzLmZvckVhY2goKGFuY2VzdG9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbmNlc3Rvcl9wYWlyID0gQWNjTmFtZVV0aWwuY29tcHV0ZUFjY2Vzc2libGVOYW1lKGFuY2VzdG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbmNlc3Rvcl9wYWlyICYmIGFuY2VzdG9yX3BhaXIubmFtZSAmJiBhbmNlc3Rvcl9wYWlyLm5hbWUudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IGFuY2VzdG9yX3BhaXIubmFtZS50cmltKCkgKyBcIiBcIiArIG5hbWU7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBjb25zdCByb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKGVsZW0pO1xuICAgICAgICAgICAgICAgIG5hbWVNYXAucHVzaCh7XCJlbGVtXCIgOiBlbGVtLCBcInJvbGVcIiA6IHJvbGUsIFwibmFtZVwiOiBuYW1lfSk7ICAgIFxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZG9jLCBcIkFyaWFVdGlsX0xhbmRtYXJrX0FjY05hbWVzXCIsIG5hbWVNYXApO1xuICAgICAgICByZXR1cm4gbmFtZU1hcDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBjaGVjayBpZiB0aGUgZ2l2ZW4gZWxlbWVudCB3aXRoIHRoZSBsYW5kbWFyayByb2x3IGlzIHVuaXF1ZVxuICAgICAqIEBwYXJhbSBlbGVtZW50IFxuICAgICAqIEBwYXJhbSByb2xlOiBhIHNwZWNpZmljIGxhbmRtYXJrIHJvbGUsIG9yIFwiYW55XCIgZm9yIGFsbCBsYW5kbWFyayByb2xlICBcbiAgICAgKiBAcGFyYW0gY29uc2lkZXJOb25lTGFiZWw6IGlmIGNvbnNpZGVyIHRoZSBsYW5kbWFya3Mgd2l0aG91dCBhIGxhYmVsXG4gICAgICogQHJldHVybnMgXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpc0xhbmRtYXJrTmFtZVVuaXF1ZShlbGVtZW50LCByb2xlLCBjb25zaWRlck5vbmVMYWJlbDogYm9vbGVhbiA9IGZhbHNlKSB7XG4gICAgICAgIGNvbnN0IG5hbWVNYXAgPSBBcmlhVXRpbC5nZXRMYW5kbWFya0FjY05hbWVzKGVsZW1lbnQub3duZXJEb2N1bWVudCk7XG4gICAgICAgIGxldCBleGlzdCA9IG51bGw7XG4gICAgICAgIGlmIChyb2xlID09PSAnYW55JylcbiAgICAgICAgICAgIGV4aXN0ID0gbmFtZU1hcC5maW5kKGVudHJ5ID0+IGVudHJ5LmVsZW0gPT09IGVsZW1lbnQpOyAgICAgIFxuICAgICAgICBlbHNlICAgIFxuICAgICAgICAgICAgZXhpc3QgPSBuYW1lTWFwLmZpbmQoZW50cnkgPT4gZW50cnkuZWxlbSA9PT0gZWxlbWVudCAmJiBlbnRyeS5yb2xlID09PSByb2xlKTtcblxuICAgICAgICBpZiAoIWV4aXN0KSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCBuYW1lID0gZXhpc3QubmFtZTtcbiAgICAgICAgaWYgKCFjb25zaWRlck5vbmVMYWJlbCAmJiBuYW1lID09PSAnJykgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbmFtZU1hcC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKG5hbWVNYXBbaV0uZWxlbSA9PT0gZWxlbWVudCkgY29udGludWU7ICAgICBcbiAgICAgICAgICAgIGlmIChuYW1lID09PSBuYW1lTWFwW2ldLm5hbWUpIHtcbiAgICAgICAgICAgICAgICBpZiAocm9sZSA9PT0gJ2FueScpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5hbWVNYXBbaV0ucm9sZSA9PT0gcm9sZSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7IFxuICAgICAgICAgICAgfSAgICAgICAgXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIEdpdmVuIGFuIGFycmF5IG9mIGVsZW1lbnRzLCByZXR1cm4gdHJ1ZSBpZiB0aGUgZWxlbWVudHMgaGF2ZSB1bmlxdWUgQVJJQSBsYWJlbHMgZ2xvYmFsbHlcbiAgICBwdWJsaWMgc3RhdGljIGhhc1VuaXF1ZUFyaWFMYWJlbHMoZWxlbWVudHMpIHtcbiAgICAgICAgcmV0dXJuIEFyaWFVdGlsLmhhc1VuaXF1ZUFyaWFMYWJlbHNMb2NhbGx5KGVsZW1lbnRzLCB0cnVlKTtcbiAgICB9XG5cbiAgICAvLyBHaXZlbiBhbiBhcnJheSBvZiBlbGVtZW50cywgcmV0dXJuIHRydWUgaWYgdGhlIGVsZW1lbnRzIGhhdmUgdW5pcXVlIEFSSUEgbGFiZWxzXG4gICAgcHVibGljIHN0YXRpYyBoYXNEdXBsaWNhdGVBcmlhTGFiZWxzTG9jYWxseShlbGVtZW50cywgaXNHbG9iYWwpIHtcbiAgICAgICAgaWYgKGVsZW1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsZXQgZG9jID0gZWxlbWVudHNbMF0ub3duZXJEb2N1bWVudDtcblxuICAgICAgICBsZXQgaGFzRHVwbGljYXRlTGFiZWxzID0gZmFsc2U7XG4gICAgICAgIGxldCB1bmlxdWVBcmlhTGFiZWxzOiB7IFtrZXk6IHN0cmluZ106IGJvb2xlYW4gfSA9IG51bGw7XG4gICAgICAgIGxldCBkdXBsaWNhdGVMYWJlbE5hbWVBcnJheSA9IG5ldyBBcnJheSgpO1xuXG4gICAgICAgIGlmIChpc0dsb2JhbCkge1xuICAgICAgICAgICAgdW5pcXVlQXJpYUxhYmVscyA9IENhY2hlVXRpbC5nZXRDYWNoZShkb2MsIFwiQXJpYVV0aWxfSEFTX1VOSVFVRV9BUklBX0xBQkVMU1wiLCBudWxsKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodW5pcXVlQXJpYUxhYmVscyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdW5pcXVlQXJpYUxhYmVscyA9IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7ICsraSkge1xuXG4gICAgICAgICAgICBpZiAoZWxlbWVudHNbaV0uaGFzQXR0cmlidXRlKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudHNbaV0uaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKSkge1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBhcmlhTGFiZWwgPSBDb21tb25VdGlsLm5vcm1hbGl6ZVNwYWNpbmcoZWxlbWVudHNbaV0uZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbFwiKSkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgaGFzRHVwbGljYXRlTGFiZWxzID0gYXJpYUxhYmVsIGluIHVuaXF1ZUFyaWFMYWJlbHM7XG4gICAgICAgICAgICAgICAgICAgIHVuaXF1ZUFyaWFMYWJlbHNbYXJpYUxhYmVsXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGlmICghKGFyaWFMYWJlbCBpbiBkdXBsaWNhdGVMYWJlbE5hbWVBcnJheSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGR1cGxpY2F0ZUxhYmVsTmFtZUFycmF5W2FyaWFMYWJlbF0gPSBuZXcgQXJyYXkoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBkdXBsaWNhdGVMYWJlbE5hbWVBcnJheVthcmlhTGFiZWxdLnB1c2goZWxlbWVudHNbaV0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSk7XG5cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnRzW2ldLmhhc0F0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKSkge1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBsYWJlbElEcyA9IGVsZW1lbnRzW2ldLmdldEF0dHJpYnV0ZShcImFyaWEtbGFiZWxsZWRieVwiKS50cmltKCkuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbm9ybWFsaXplZExhYmVsID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDAsIGxlbmd0aCA9IGxhYmVsSURzLmxlbmd0aDsgaiA8IGxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGFiZWxJRCA9IGxhYmVsSURzW2pdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsTm9kZSA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKGVsZW1lbnRzW2ldLCBsYWJlbElEKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYWJlbE5vZGUgJiYgIURPTVV0aWwuc2FtZU5vZGUobGFiZWxOb2RlLCBlbGVtZW50c1tpXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGFiZWwgPSBBcmlhVXRpbC5nZXRUZXh0Q29udGVudEV4Y2x1ZGluZ1NjcmlwdHMobGFiZWxOb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkTGFiZWwgKz0gQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKGxhYmVsKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGhhc0R1cGxpY2F0ZUxhYmVscyA9IG5vcm1hbGl6ZWRMYWJlbCBpbiB1bmlxdWVBcmlhTGFiZWxzO1xuICAgICAgICAgICAgICAgICAgICB1bmlxdWVBcmlhTGFiZWxzW25vcm1hbGl6ZWRMYWJlbF0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIShub3JtYWxpemVkTGFiZWwgaW4gZHVwbGljYXRlTGFiZWxOYW1lQXJyYXkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkdXBsaWNhdGVMYWJlbE5hbWVBcnJheVtub3JtYWxpemVkTGFiZWxdID0gbmV3IEFycmF5KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZHVwbGljYXRlTGFiZWxOYW1lQXJyYXlbbm9ybWFsaXplZExhYmVsXS5wdXNoKGVsZW1lbnRzW2ldLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNHbG9iYWwpIHtcbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShkb2MsIFwiQXJpYVV0aWxfSEFTX1VOSVFVRV9BUklBX0xBQkVMU1wiLCB1bmlxdWVBcmlhTGFiZWxzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZHVwbGljYXRlTGFiZWxOYW1lQXJyYXk7XG4gICAgfVxuXG4gICAgLy8gR2l2ZW4gYW4gYXJyYXkgb2YgZWxlbWVudHMsIHJldHVybiB0cnVlIGlmIHRoZSBlbGVtZW50cyBoYXZlIHVuaXF1ZSBBUklBIGxhYmVscyBnbG9iYWxseVxuICAgIHB1YmxpYyBzdGF0aWMgaGFzRHVwbGljYXRlQXJpYUxhYmVscyhlbGVtZW50cykge1xuICAgICAgICByZXR1cm4gQXJpYVV0aWwuaGFzRHVwbGljYXRlQXJpYUxhYmVsc0xvY2FsbHkoZWxlbWVudHMsIHRydWUpO1xuICAgIH1cblxuICAgIC8vIEdpdmVuIGFuIGFycmF5IG9mIGVsZW1lbnRzLCByZXR1cm4gdHJ1ZSBpZiB0aGUgZWxlbWVudHMgaGF2ZSB1bmlxdWUgYXJpYS1sYWJlbGxlZGJ5IGF0dHJpYnV0ZXNcbiAgICBwdWJsaWMgc3RhdGljIGhhc1VuaXF1ZUFyaWFMYWJlbGxlZGJ5KGVsZW1lbnRzKSB7XG5cbiAgICAgICAgbGV0IGhhc0R1cGxpY2F0ZUxhYmVscyA9IGZhbHNlO1xuICAgICAgICBsZXQgbGFiZWxSZWZzID0ge307XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7ICFoYXNEdXBsaWNhdGVMYWJlbHMgJiYgaSA8IGVsZW1lbnRzLmxlbmd0aDsgKytpKSB7XG5cbiAgICAgICAgICAgIGlmIChlbGVtZW50c1tpXS5oYXNBdHRyaWJ1dGUgJiYgZWxlbWVudHNbaV0uaGFzQXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpICYmICFDb21tb25VdGlsLmlzSWRSZWZlclRvU2VsZihlbGVtZW50c1tpXSwgZWxlbWVudHNbaV0uZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpKSkge1xuICAgICAgICAgICAgICAgIGxldCBsYWJlbFJlZiA9IENvbW1vblV0aWwubm9ybWFsaXplU3BhY2luZyhlbGVtZW50c1tpXS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWxhYmVsbGVkYnlcIikpO1xuICAgICAgICAgICAgICAgIGhhc0R1cGxpY2F0ZUxhYmVscyA9IGxhYmVsUmVmIGluIGxhYmVsUmVmcztcbiAgICAgICAgICAgICAgICBsYWJlbFJlZnNbbGFiZWxSZWZdID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaGFzRHVwbGljYXRlTGFiZWxzID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gIWhhc0R1cGxpY2F0ZUxhYmVscztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB0aGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciByZXNvbHZpbmcgQVJJQSByZXF1aXJlbWVudHMgZm9yIGFuIEhUTUwgZWxlbWVudCBwZXIgQVJJQSBpbiBIVE1MXG4gICAgICogQHBhcmFtIHJ1bGVDb250ZXh0IHRoZSBIVE1MIGVsZW1lbnQgdG8gYmUgZXhhbWluZWRcbiAgICAgKiBAcmV0dXJucyBcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEVsZW1lbnRBcmlhUHJvcGVydHkocnVsZUNvbnRleHQpIHtcbiAgICAgICAgbGV0IHRhZ1Byb3BlcnR5OiBJRG9jdW1lbnRDb25mb3JtYW5jZVJlcXVpcmVtZW50ID0gQ2FjaGVVdGlsLmdldENhY2hlKHJ1bGVDb250ZXh0LCBcIkFyaWFVdGlsX0VsZW1lbnRBcmlhUHJvcGVydHlcIiwgbnVsbCk7XG4gICAgICAgIGlmICghdGFnUHJvcGVydHkpIHtcbiAgICAgICAgICAgIGxldCB0YWdOYW1lID0gbnVsbDtcbiAgICAgICAgICAgIGxldCBuYW1lID0gbnVsbDtcblxuICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0LnRhZ05hbWUpIHtcbiAgICAgICAgICAgICAgICB0YWdOYW1lID0gcnVsZUNvbnRleHQudGFnTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChydWxlQ29udGV4dC5ub2RlTmFtZSkge1xuICAgICAgICAgICAgICAgIHRhZ05hbWUgPSBydWxlQ29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBjaGVjayBpZiB0aGUgdGFnUHJvcGVydHkgZXhpc3RzIGluIHRoZSBkb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnQgaGFzaC5cbiAgICAgICAgICAgIHRhZ1Byb3BlcnR5ID0gQVJJQURlZmluaXRpb25zLmRvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudFt0YWdOYW1lXTtcblxuICAgICAgICAgICAgLy8gVGhlIHRhZyBuZWVkcyB0byBjaGVjayBzb21lIHNwZWNpYWwgYXR0cmlidXRlc1xuICAgICAgICAgICAgaWYgKHRhZ1Byb3BlcnR5ID09PSBudWxsIHx8IHRhZ1Byb3BlcnR5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBsZXQgc3BlY2lhbFRhZ1Byb3BlcnRpZXMgPSBBUklBRGVmaW5pdGlvbnMuZG9jdW1lbnRDb25mb3JtYW5jZVJlcXVpcmVtZW50U3BlY2lhbFRhZ3NbdGFnTmFtZV07XG4gICAgICAgICAgICAgICAgc3dpdGNoICh0YWdOYW1lKSB7IC8vIHNwZWNpYWwgY2FzZXNcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImFcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcImhyZWZcIikgPyB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wid2l0aC1ocmVmXCJdIDogdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcIndpdGhvdXQtaHJlZlwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiYXJlYVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwiaHJlZlwiKSA/IHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJ3aXRoLWhyZWZcIl0gOiB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wid2l0aG91dC1ocmVmXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJmaWd1cmVcIjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZjcyA9IENvbW1vblV0aWwuZ2V0Q2hpbGRCeVRhZyhydWxlQ29udGV4dCwgXCJmaWdjYXB0aW9uXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZmNzICE9PSBudWxsICYmIGZjcy5sZW5ndGggPiAwID8gdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcImNoaWxkLWZpZ2NhcHRpb25cIl0gOiB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wibm8tY2hpbGQtZmlnY2FwdGlvblwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJmb290ZXJcIjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImhlYWRlclwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUocnVsZUNvbnRleHQsIFwiYXJ0aWNsZVwiLCB0cnVlKSAhPT0gbnVsbCB8fCBBcmlhVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKHJ1bGVDb250ZXh0LCBcImNvbXBsZW1lbnRhcnlcIiwgdHJ1ZSkgIT09IG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBBcmlhVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKHJ1bGVDb250ZXh0LCBcIm5hdmlnYXRpb25cIiwgdHJ1ZSkgIT09IG51bGwgfHwgQXJpYVV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShydWxlQ29udGV4dCwgXCJyZWdpb25cIiwgdHJ1ZSkgIT09IG51bGxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBDb21tb25VdGlsLmdldEFuY2VzdG9yKHJ1bGVDb250ZXh0LCBbXCJhcnRpY2xlXCIsIFwiYXNpZGVcIiwgXCJtYWluXCIsIFwibmF2XCIsIFwic2VjdGlvblwiXSkgIT09IG51bGwpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcImRlcy1zZWN0aW9uLWFydGljbGUtYXNpZGUtbWFpbi1uYXZcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcIm90aGVyXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJpbWdcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhbHQgPSBydWxlQ29udGV4dC5oYXNBdHRyaWJ1dGUoXCJhbHRcIikgPyBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJhbHRcIikgOiBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRpdGxlID0gcnVsZUNvbnRleHQuaGFzQXR0cmlidXRlKFwidGl0bGVcIikgPyBydWxlQ29udGV4dC5nZXRBdHRyaWJ1dGUoXCJ0aXRsZVwiKSA6IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJpYVV0aWwuZ2V0QXJpYUxhYmVsKHJ1bGVDb250ZXh0KS50cmltKCkubGVuZ3RoICE9PSAwIHx8IChhbHQgIT09IG51bGwgJiYgYWx0Lmxlbmd0aCA+IDApIHx8ICh0aXRsZSAhPT0gbnVsbCAmJiB0aXRsZS5sZW5ndGggPiAwKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBpbWcgaGFzIG5vbi1lbXB0eSBhbHQgKGFsdD1cInNvbWUgdGV4dFwiIG9yIGFsdD1cIiAgXCIpIG9yIGFuIGFjY2Vzc2libGUgbmFtZSBpcyBwcm92aWRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJpbWctd2l0aC1hY2NuYW1lXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWx0ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBpbWcgaGFzIGFuIGVtcHR5IGFsdCAoYWx0PVwiXCIpIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiaW1nLXdpdGhvdXQtYWNjbmFtZS1lbXB0eS1hbHRcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGltZyBsYWNrcyBhbiBhbHQgYXR0cmlidXRlIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiaW1nLXdpdGhvdXQtYWNjbmFtZS1uby1hbHRcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJpbnB1dFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwidHlwZVwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0eXBlID0gcnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKFwidHlwZVwiKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW3R5cGVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YWdQcm9wZXJ0eSA9PT0gbnVsbCB8fCB0YWdQcm9wZXJ0eSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImNoZWNrYm94XCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJhcmlhLXByZXNzZWRcIikgPyB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiY2hlY2tib3gtd2l0aC1hcmlhLXByZXNzZWRcIl0gOiB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiY2hlY2tib3gtd2l0aG91dC1hcmlhLXByZXNzZWRcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiZW1haWxcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcImxpc3RcIikgPyB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiZW1haWwtd2l0aC1saXN0XCJdIDogdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcImVtYWlsLW5vLWxpc3RcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwic2VhcmNoXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJsaXN0XCIpID8gdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcInNlYXJjaC13aXRoLWxpc3RcIl0gOiB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wic2VhcmNoLW5vLWxpc3RcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwidGVsXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJsaXN0XCIpID8gdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcInRlbC13aXRoLWxpc3RcIl0gOiB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1widGVsLW5vLWxpc3RcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwidGV4dFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwibGlzdFwiKSA/IHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJ0ZXh0LXdpdGgtbGlzdFwiXSA6IHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJ0ZXh0LW5vLWxpc3RcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwidXJsXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJsaXN0XCIpID8gdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcInVybC13aXRoLWxpc3RcIl0gOiB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1widXJsLW5vLWxpc3RcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZmF1bHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KHJ1bGVDb250ZXh0LCBcImxpc3RcIikgPyB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiZGVmYXVsdC13aXRoLWxpc3RcIl0gOiB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiZGVmYXVsdC1uby1saXN0XCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IHR5cGUgaXMgdGhlIHNhbWUgYXMgdHlwZT10ZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJsaXN0XCIpID8gdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcInRleHQtd2l0aC1saXN0XCJdIDogdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcInRleHQtbm8tbGlzdFwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwibGlcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpYWxUYWdQcm9wZXJ0aWVzID0gQVJJQURlZmluaXRpb25zLmRvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudFNwZWNpYWxUYWdzW1wibGlcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZUNvbnRleHQucGFyZW50RWxlbWVudCAmJiBBcmlhVXRpbC5oYXNSb2xlSW5TZW1hbnRpY3MocnVsZUNvbnRleHQucGFyZW50RWxlbWVudCwgXCJsaXN0XCIpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJjaGlsZC1vZi1saXN0LXJvbGVcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcIm5vLWNoaWxkLW9mLWxpc3Qtcm9sZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIFwic2VjdGlvblwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgLy9uYW1lID0gQVJJQU1hcHBlci5jb21wdXRlTmFtZShydWxlQ29udGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL2lmIChuYW1lICYmIG5hbWUudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhYmVsID0gQXJpYVV0aWwuZ2V0QXJpYUxhYmVsKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobGFiZWwgJiYgbGFiZWwudHJpbSgpLmxlbmd0aCA+IDApIHx8IENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkocnVsZUNvbnRleHQsIFwidGl0bGVcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wid2l0aC1uYW1lXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wid2l0aG91dC1uYW1lXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJzZWxlY3RcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpYWxUYWdQcm9wZXJ0aWVzID0gQVJJQURlZmluaXRpb25zLmRvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudFNwZWNpYWxUYWdzW1wic2VsZWN0XCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0Lmhhc0F0dHJpYnV0ZShcIm11bHRpcGxlXCIpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShydWxlQ29udGV4dCwgXCJzaXplXCIpICYmIHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShcInNpemVcIikgPiAxKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJtdWx0aXBsZS1hdHRyLXNpemUtZ3QxXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJuby1tdWx0aXBsZS1hdHRyLXNpemUtZ3QxXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJzdW1tYXJ5XCI6XG4gICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWFsVGFnUHJvcGVydGllcyA9IEFSSUFEZWZpbml0aW9ucy5kb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnRTcGVjaWFsVGFnc1tcInN1bW1hcnlcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZUNvbnRleHQucGFyZW50RWxlbWVudCAmJiBydWxlQ29udGV4dC5wYXJlbnRFbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdkZXRhaWxzJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIERPTVV0aWwuc2FtZU5vZGUoWy4uLnJ1bGVDb250ZXh0LnBhcmVudEVsZW1lbnQuY2hpbGRyZW5dLmZpbHRlcihlbGVtID0+IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ3N1bW1hcnknKVswXSwgcnVsZUNvbnRleHQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJmaXJzdC1zdW1tYXJ5LW9mLWRldGFpbFwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wibm8tZmlyc3Qtc3VtbWFyeS1vZi1kZXRhaWxcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcInRib2R5XCI6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJ0ZFwiOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwidHJcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcmlhVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKHJ1bGVDb250ZXh0LCBcInRhYmxlXCIsIHRydWUpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcImRlcy10YWJsZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJpYVV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShydWxlQ29udGV4dCwgXCJncmlkXCIsIHRydWUpIHx8IEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUocnVsZUNvbnRleHQsIFwidHJlZWdyaWRcIiwgdHJ1ZSkgPyB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiZGVzLWdyaWRcIl0gOiB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiZGVzLW90aGVyXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJ0aFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2NvcGUgPSBDb21tb25VdGlsLmdldFNjb3BlRm9yVGgocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUocnVsZUNvbnRleHQsIFwidGFibGVcIiwgdHJ1ZSkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2NvcGUgPT09ICdjb2x1bW4nKSB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiZGVzLXRhYmxlLWNvbHVtbi1zY29wZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJkZXMtdGFibGUtcm93LXNjb3BlXCJdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChBcmlhVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKHJ1bGVDb250ZXh0LCBcImdyaWRcIiwgdHJ1ZSkgIT09IG51bGwgfHwgQXJpYVV0aWwuZ2V0QW5jZXN0b3JXaXRoUm9sZShydWxlQ29udGV4dCwgXCJ0cmVlZ3JpZFwiLCB0cnVlKSAhPT0gbnVsbCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNjb3BlID09PSAnY29sdW1uJykgdGFnUHJvcGVydHkgPSBzcGVjaWFsVGFnUHJvcGVydGllc1tcImRlcy1ncmlkLXRyZWVncmlkLWNvbHVtbi1zY29wZVwiXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHRhZ1Byb3BlcnR5ID0gc3BlY2lhbFRhZ1Byb3BlcnRpZXNbXCJkZXMtZ3JpZC10cmVlZ3JpZC1yb3ctc2NvcGVcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiZGVzLW90aGVyXCJdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImRpdlwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBydCA9IHJ1bGVDb250ZXh0LnBhcmVudEVsZW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcnQgIT09IG51bGwgJiYgcHJ0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdkbCcgPyB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wiY2hpbGQtZGxcIl0gOiB0YWdQcm9wZXJ0eSA9IHNwZWNpYWxUYWdQcm9wZXJ0aWVzW1wibm8tY2hpbGQtZGxcIl07XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1Byb3BlcnR5ID0gQVJJQURlZmluaXRpb25zLmRvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudFNwZWNpYWxUYWdzW1wiZGVmYXVsdFwiXSBhcyBJRG9jdW1lbnRDb25mb3JtYW5jZVJlcXVpcmVtZW50O1xuICAgICAgICAgICAgICAgIH0gLy9zd2l0Y2hcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUocnVsZUNvbnRleHQsIFwiQXJpYVV0aWxfRWxlbWVudEFyaWFQcm9wZXJ0eVwiLCB0YWdQcm9wZXJ0eSk7XG4gICAgICAgIHJldHVybiB0YWdQcm9wZXJ0eSB8fCBudWxsO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0QWxsb3dlZEFyaWFSb2xlcyhydWxlQ29udGV4dCwgcHJvcGVydGllczogSURvY3VtZW50Q29uZm9ybWFuY2VSZXF1aXJlbWVudCkge1xuICAgICAgICBsZXQgYWxsb3dlZFJvbGVzOiBzdHJpbmdbXSA9IENhY2hlVXRpbC5nZXRDYWNoZShydWxlQ29udGV4dCwgXCJBcmlhVXRpbF9BbGxvd2VkQXJpYVJvbGVzXCIsIG51bGwpO1xuICAgICAgICBpZiAoIWFsbG93ZWRSb2xlcykge1xuICAgICAgICAgICAgYWxsb3dlZFJvbGVzID0gW107XG4gICAgICAgICAgICBsZXQgdGFnUHJvcGVydHk6IElEb2N1bWVudENvbmZvcm1hbmNlUmVxdWlyZW1lbnQgPSBudWxsO1xuICAgICAgICAgICAgaWYgKHByb3BlcnRpZXMgIT09IG51bGwgJiYgcHJvcGVydGllcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGFnUHJvcGVydHkgPSBwcm9wZXJ0aWVzO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IEFyaWFVdGlsLmdldEVsZW1lbnRBcmlhUHJvcGVydHkocnVsZUNvbnRleHQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGFnUHJvcGVydHkgIT09IG51bGwgJiYgdGFnUHJvcGVydHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGlmICh0YWdQcm9wZXJ0eS5pbXBsaWNpdFJvbGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KHRhZ1Byb3BlcnR5LmltcGxpY2l0Um9sZSwgYWxsb3dlZFJvbGVzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRhZ1Byb3BlcnR5LnZhbGlkUm9sZXMgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KHRhZ1Byb3BlcnR5LnZhbGlkUm9sZXMsIGFsbG93ZWRSb2xlcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBpbXBsaWNpdFJvbGVzID0gQXJpYVV0aWwuZ2V0SW1wbGljaXRSb2xlKHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgICAgICBpZiAoaW1wbGljaXRSb2xlcyAmJiBpbXBsaWNpdFJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KHRhZ1Byb3BlcnR5LnZhbGlkUm9sZXMsIGFsbG93ZWRSb2xlcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKHJ1bGVDb250ZXh0LCBcIkFyaWFVdGlsX0FsbG93ZWRBcmlhUm9sZXNcIiwgYWxsb3dlZFJvbGVzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWxsb3dlZFJvbGVzO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0QWxsb3dlZEFyaWFBdHRyaWJ1dGVzKHJ1bGVDb250ZXh0LCByb2xlcywgcHJvcGVydGllcykge1xuICAgICAgICBsZXQgYWxsb3dlZEF0dHJpYnV0ZXM6IHN0cmluZ1tdID0gQ2FjaGVVdGlsLmdldENhY2hlKHJ1bGVDb250ZXh0LCBcIkFyaWFVdGlsX0FsbG93ZWRBcmlhQXR0cmlidXRlc1wiLCBudWxsKTtcbiAgICAgICAgaWYgKCFhbGxvd2VkQXR0cmlidXRlcykge1xuICAgICAgICAgICAgYWxsb3dlZEF0dHJpYnV0ZXMgPSBbXTtcbiAgICAgICAgICAgIGxldCBwZXJtaXR0ZWRSb2xlcyA9IFsuLi5yb2xlc107XG4gICAgICAgICAgICBsZXQgdGFnTmFtZSA9IHJ1bGVDb250ZXh0LnRhZ05hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAgICAgbGV0IHByb2hpYml0ZWRBdHRyaWJ1dGVzID0gW107XG4gICAgICAgICAgICAvLyBFbGVtZW50IHdpdGggYSBkaXNhYmxlZCBhdHRyaWJ1dGUgIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9kaXNhYmxlZC1lbGVtZW50cy5odG1sXG4gICAgICAgICAgICBpZiAoQVJJQURlZmluaXRpb25zLmVsZW1lbnRzQWxsb3dlZERpc2FibGVkLmluZGV4T2YodGFnTmFtZSkgPiAtMSkge1xuICAgICAgICAgICAgICAgIC8vIFVzZSB0aGUgYXJpYS1kaXNhYmxlZCBhdHRyaWJ1dGUgb24gYW55IGVsZW1lbnQgdGhhdCBpcyBhbGxvd2VkIHRoZSBkaXNhYmxlZCBhdHRyaWJ1dGUgaW4gSFRNTDUuXG4gICAgICAgICAgICAgICAgYWxsb3dlZEF0dHJpYnV0ZXMgPSBDb21tb25VdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbShcImFyaWEtZGlzYWJsZWRcIiwgYWxsb3dlZEF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gRWxlbWVudCB3aXRoIGEgcmVxdWlyZWQgYXR0cmlidXRlIGh0dHA6Ly93d3cudGhlLWFydC1vZi13ZWIuY29tL2h0bWwvaHRtbDUtZm9ybS12YWxpZGF0aW9uL1xuICAgICAgICAgICAgaWYgKEFSSUFEZWZpbml0aW9ucy5lbGVtZW50c0FsbG93ZWRSZXF1aXJlZC5pbmRleE9mKHRhZ05hbWUpID4gLTEpIHtcbiAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIGFyaWEtcmVxdWlyZWQgYXR0cmlidXRlIG9uIGFueSBlbGVtZW50IHRoYXQgaXMgYWxsb3dlZCB0aGUgcmVxdWlyZWQgYXR0cmlidXRlIGluIEhUTUw1LlxuICAgICAgICAgICAgICAgIGFsbG93ZWRBdHRyaWJ1dGVzID0gQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW0oXCJhcmlhLXJlcXVpcmVkXCIsIGFsbG93ZWRBdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKEFSSUFEZWZpbml0aW9ucy5lbGVtZW50c0FsbG93ZWRSZWFkT25seS5pbmRleE9mKHRhZ05hbWUpID4gLTEpIHtcbiAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIGFyaWEtcmVhZG9ubHkgYXR0cmlidXRlIG9uIGFueSBlbGVtZW50IHRoYXQgaXMgYWxsb3dlZCB0aGUgcmVhZG9ubHkgYXR0cmlidXRlIGluIEhUTUw1LlxuICAgICAgICAgICAgICAgIGFsbG93ZWRBdHRyaWJ1dGVzID0gQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW0oXCJhcmlhLXJlYWRvbmx5XCIsIGFsbG93ZWRBdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IHRhZ1Byb3BlcnR5ID0gbnVsbDtcbiAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzICE9IG51bGwgJiYgcHJvcGVydGllcyAhPT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgIHRhZ1Byb3BlcnR5ID0gcHJvcGVydGllcztcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICB0YWdQcm9wZXJ0eSA9IEFyaWFVdGlsLmdldEVsZW1lbnRBcmlhUHJvcGVydHkocnVsZUNvbnRleHQpO1xuXG4gICAgICAgICAgICBpZiAodGFnUHJvcGVydHkgIT09IG51bGwgJiYgdGFnUHJvcGVydHkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUgaW1wbGljaXQgcm9sZSBhbGxvd2VkIGF0dHJpYnV0ZXMgdG8gdGhlIGFsbG93ZWQgcm9sZSBsaXN0IGlmIHRoZXJlIGlzIG5vIHNwZWNpZmllZCByb2xlXG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIGlmIHRoZSBlbGVtZW50IGRvZXNuJ3QgYWxsb3cgdGhlIGF0dHJpYnV0ZXMgZnJvbSB0aGUgaW1wbGljaXQgcm9sZXNcbiAgICAgICAgICAgICAgICBpZiAodGFnUHJvcGVydHkuaW1wbGljaXRSb2xlICE9PSBudWxsICYmXG4gICAgICAgICAgICAgICAgICAgIChwZXJtaXR0ZWRSb2xlcyA9PT0gbnVsbCB8fCBwZXJtaXR0ZWRSb2xlcyA9PT0gdW5kZWZpbmVkIHx8IHBlcm1pdHRlZFJvbGVzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgJiYgdGFnUHJvcGVydHkuYWxsb3dBdHRyaWJ1dGVzRnJvbUltcGxpY2l0Um9sZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFnUHJvcGVydHkuaW1wbGljaXRSb2xlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcm9sZVByb3BlcnR5ID0gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3RhZ1Byb3BlcnR5LmltcGxpY2l0Um9sZVtpXV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocm9sZVByb3BlcnR5ICE9PSBudWxsICYmIHJvbGVQcm9wZXJ0eSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHByb3BlcnRpZXMgPSByb2xlUHJvcGVydHkucHJvcHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KHByb3BlcnRpZXMsIGFsbG93ZWRBdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzID0gQXJpYVV0aWwuZ2V0Um9sZVJlcXVpcmVkUHJvcGVydGllcyh0YWdQcm9wZXJ0eS5pbXBsaWNpdFJvbGVbaV0sIHJ1bGVDb250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tb25VdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QocHJvcGVydGllcywgYWxsb3dlZEF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwcm9oaWJpdGVkUHJvcHMgPSByb2xlUHJvcGVydHkucHJvaGliaXRlZFByb3BzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9oaWJpdGVkUHJvcHMgJiYgcHJvaGliaXRlZFByb3BzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdChwcm9oaWJpdGVkUHJvcHMsIHByb2hpYml0ZWRBdHRyaWJ1dGVzKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpYWwgY2FzZSBvZiBzZXBhcmF0b3JcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFnUHJvcGVydHkuaW1wbGljaXRSb2xlW2ldID09PSBcInNlcGFyYXRvclwiICYmIENvbW1vblV0aWwuaXNGb2N1c2FibGUocnVsZUNvbnRleHQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdChbXCJhcmlhLWRpc2FibGVkXCIsIFwiYXJpYS12YWx1ZW5vd1wiLCBcImFyaWEtdmFsdWVtYXhcIiwgXCJhcmlhLXZhbHVlbWluXCIsIFwiYXJpYS12YWx1ZXRleHRcIl0sIGFsbG93ZWRBdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gQWRkaW5nIHRoZSBnbG9iYWwgcHJvcGVydGllcyB0byB0aGUgdmFsaWQgYXR0cmlidXRlIGxpc3RcbiAgICAgICAgICAgICAgICBpZiAodGFnUHJvcGVydHkuZ2xvYmFsQXJpYUF0dHJpYnV0ZXNWYWxpZCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcHJvcGVydGllcyA9IEFSSUFEZWZpbml0aW9ucy5nbG9iYWxQcm9wZXJ0aWVzOyAvLyBnbG9iYWwgcHJvcGVydGllc1xuICAgICAgICAgICAgICAgICAgICBDb21tb25VdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QocHJvcGVydGllcywgYWxsb3dlZEF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGFkZGluZyB0aGUgb3RoZXIgcm9sZSB0byB0aGUgYWxsb3dlZCByb2xlcyBmb3IgdGhlIGF0dHJpYnV0ZXNcbiAgICAgICAgICAgIGlmICh0YWdQcm9wZXJ0eSAmJiB0YWdQcm9wZXJ0eS5vdGhlclJvbGVzRm9yQXR0cmlidXRlcyAmJiB0YWdQcm9wZXJ0eS5vdGhlclJvbGVzRm9yQXR0cmlidXRlcy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgIENvbW1vblV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdCh0YWdQcm9wZXJ0eS5vdGhlclJvbGVzRm9yQXR0cmlidXRlcywgcGVybWl0dGVkUm9sZXMpO1xuICAgICAgICAgICAgLy8gYWRkaW5nIHRoZSBzcGVjaWZpZWQgcm9sZSBwcm9wZXJ0aWVzIHRvIHRoZSBhbGxvd2VkIGF0dHJpYnV0ZSBsaXN0XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgcGVybWl0dGVkUm9sZXMgIT09IG51bGwgJiYgaSA8IHBlcm1pdHRlZFJvbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJvbGVQcm9wZXJ0aWVzID0gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3Blcm1pdHRlZFJvbGVzW2ldXTtcbiAgICAgICAgICAgICAgICBpZiAocm9sZVByb3BlcnRpZXMgIT09IG51bGwgJiYgcm9sZVByb3BlcnRpZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUgdGhlIHByb3BlcnRpZXMgaWYgdGhlIGVsZW1lbnQgZG9lc24ndCBhbGxvdyBhdHRyaWJ1dGVzIGZyb20gdGhlIGltcGxpY2l0IHJvbGVcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0YWdQcm9wZXJ0eSB8fCB0YWdQcm9wZXJ0eS5pbXBsaWNpdFJvbGUgPT09IG51bGwgfHwgIXRhZ1Byb3BlcnR5LmltcGxpY2l0Um9sZS5pbmNsdWRlcyhwZXJtaXR0ZWRSb2xlc1tpXSkgfHwgKHRhZ1Byb3BlcnR5LmltcGxpY2l0Um9sZS5pbmNsdWRlcyhwZXJtaXR0ZWRSb2xlc1tpXSkgJiYgdGFnUHJvcGVydHkuYWxsb3dBdHRyaWJ1dGVzRnJvbUltcGxpY2l0Um9sZSA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHByb3BlcnRpZXMgPSByb2xlUHJvcGVydGllcy5wcm9wczsgLy8gYWxsb3dlZCBwcm9wZXJ0aWVzXG4gICAgICAgICAgICAgICAgICAgICAgICBDb21tb25VdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QocHJvcGVydGllcywgYWxsb3dlZEF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcyA9IEFyaWFVdGlsLmdldFJvbGVSZXF1aXJlZFByb3BlcnRpZXMocGVybWl0dGVkUm9sZXNbaV0sIHJ1bGVDb250ZXh0KTsgLy8gcmVxdWlyZWQgcHJvcGVydGllc1xuICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KHByb3BlcnRpZXMsIGFsbG93ZWRBdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZXQgcHJvaGliaXRlZFByb3BzID0gcm9sZVByb3BlcnRpZXMucHJvaGliaXRlZFByb3BzO1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJvaGliaXRlZFByb3BzICYmIHByb2hpYml0ZWRQcm9wcy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KHByb2hpYml0ZWRQcm9wcywgcHJvaGliaXRlZEF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIHNlcGFyYXRvclxuICAgICAgICAgICAgICAgICAgICBpZiAocGVybWl0dGVkUm9sZXNbaV0gPT09IFwic2VwYXJhdG9yXCIgJiYgQ29tbW9uVXRpbC5pc0ZvY3VzYWJsZShydWxlQ29udGV4dCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdChbXCJhcmlhLWRpc2FibGVkXCIsIFwiYXJpYS12YWx1ZW1heFwiLCBcImFyaWEtdmFsdWVtaW5cIiwgXCJhcmlhLXZhbHVldGV4dFwiXSwgYWxsb3dlZEF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBpZ25vcmUgYXJpYS1sZXZlbCwgYXJpYS1zZXRzaXplIG9yIGFyaWEtcG9zaW5zZXQgaWYgXCJyb3dcIiBpcyBub3QgaW4gdHJlZWdyaWRcbiAgICAgICAgICAgIGlmIChwZXJtaXR0ZWRSb2xlcy5pbmNsdWRlcyhcInJvd1wiKSAmJiBBcmlhVXRpbC5nZXRBbmNlc3RvcldpdGhSb2xlKHJ1bGVDb250ZXh0LCBcInRyZWVncmlkXCIsIHRydWUpID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSAtMTtcbiAgICAgICAgICAgICAgICBpZiAoKGluZGV4ID0gYWxsb3dlZEF0dHJpYnV0ZXMuaW5kZXhPZihcImFyaWEtbGV2ZWxcIikpID4gLTEpXG4gICAgICAgICAgICAgICAgICAgIGFsbG93ZWRBdHRyaWJ1dGVzLnNwbGljZShpbmRleCwgMSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoKGluZGV4ID0gYWxsb3dlZEF0dHJpYnV0ZXMuaW5kZXhPZihcImFyaWEtc2V0c2l6ZVwiKSkgPiAtMSlcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dlZEF0dHJpYnV0ZXMuc3BsaWNlKGluZGV4LCAxKTtcblxuICAgICAgICAgICAgICAgIGlmICgoaW5kZXggPSBhbGxvd2VkQXR0cmlidXRlcy5pbmRleE9mKFwiYXJpYS1wb3NpbnNldFwiKSkgPiAtMSlcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dlZEF0dHJpYnV0ZXMuc3BsaWNlKGluZGV4LCAxKTtcblxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBhZGQgdGhlIG90aGVyIGFsbG93ZWQgYXR0cmlidXRlcyBmb3IgdGhlIGVsZW1lbnRcbiAgICAgICAgICAgIGlmICh0YWdQcm9wZXJ0eSAmJiB0YWdQcm9wZXJ0eS5vdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlcyAmJiB0YWdQcm9wZXJ0eS5vdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgLy8gY2hlY2sgYXR0cmlidXRlLXZhbHVlIHBhaXIgaWYgZXhpc3RzXG4gICAgICAgICAgICAgICAgbGV0IGFsbG93ZWQgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBwID0gMDsgcCA8IHRhZ1Byb3BlcnR5Lm90aGVyQWxsb3dlZEFyaWFBdHRyaWJ1dGVzLmxlbmd0aDsgcCsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGF0dHIgPSB0YWdQcm9wZXJ0eS5vdGhlckFsbG93ZWRBcmlhQXR0cmlidXRlc1twXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGF0dHIuaW5jbHVkZXMoXCI9XCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYWlyID0gYXR0ci5zcGxpdChcIj1cIik7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVsZUNvbnRleHQuZ2V0QXR0cmlidXRlKHBhaXJbMF0pID09PSBwYWlyWzFdKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWQucHVzaChwYWlyWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkLnB1c2goYXR0cik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChhbGxvd2VkLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwuY29uY2F0VW5pcXVlQXJyYXlJdGVtTGlzdChhbGxvd2VkLCBhbGxvd2VkQXR0cmlidXRlcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBhZGQgdGhlIG90aGVyIHByb2hpYml0dGVkIGF0dHJpYnV0ZXMgZm9yIHRoZSBlbGVtZW50XG4gICAgICAgICAgICBpZiAodGFnUHJvcGVydHkgJiYgdGFnUHJvcGVydHkub3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXMgJiYgdGFnUHJvcGVydHkub3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIC8vIGNoZWNrIGF0dHJpYnV0ZS12YWx1ZSBwYWlyIGlmIGV4aXN0c1xuICAgICAgICAgICAgICAgIGxldCBkaXNhbGxvd2VkID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgcCA9IDA7IHAgPCB0YWdQcm9wZXJ0eS5vdGhlckRpc2FsbG93ZWRBcmlhQXR0cmlidXRlcy5sZW5ndGg7IHArKykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhdHRyID0gdGFnUHJvcGVydHkub3RoZXJEaXNhbGxvd2VkQXJpYUF0dHJpYnV0ZXNbcF07XG4gICAgICAgICAgICAgICAgICAgIGlmIChhdHRyLmluY2x1ZGVzKFwiPVwiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFpciA9IGF0dHIuc3BsaXQoXCI9XCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGVDb250ZXh0LmdldEF0dHJpYnV0ZShwYWlyWzBdKSA9PT0gcGFpclsxXSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhbGxvd2VkLnB1c2gocGFpclswXSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWxsb3dlZC5wdXNoKGF0dHIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZGlzYWxsb3dlZC5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICBDb21tb25VdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QoZGlzYWxsb3dlZCwgcHJvaGliaXRlZEF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy9leGNsdWRlIHRoZSBwcm9oaWJpdGVkQXR0cmlidXRlcyBmcm9tIHRoZSBhbGxvd2VkQXR0cmlidXRlc1xuICAgICAgICAgICAgYWxsb3dlZEF0dHJpYnV0ZXMgPSBDb21tb25VdGlsLnJlZHVjZUFycmF5SXRlbUxpc3QocHJvaGliaXRlZEF0dHJpYnV0ZXMsIGFsbG93ZWRBdHRyaWJ1dGVzKTtcblxuICAgICAgICAgICAgLy9leGNsdWRlIGFyaWEgYXR0cmlidXRlIGZvciBlbGVtZW50cyB3aXRob3V0IGltcGxpY2l0IHJvbGUgYW5kIHdpdGggJ05hbWluZyBQcm9oaWJpdGVkJ1xuICAgICAgICAgICAgaWYgKCghcm9sZXMgfHwgcm9sZXMubGVuZ3RoID09PSAwKSAmJiB0YWdQcm9wZXJ0eS5pbXBsaWNpdFJvbGUgPT09IG51bGwgJiYgdGFnUHJvcGVydHkucHJvaGliaXRlZEFyaWFBdHRyaWJ1dGVzV2hlbk5vSW1wbGljaXRSb2xlKVxuICAgICAgICAgICAgICAgIGFsbG93ZWRBdHRyaWJ1dGVzID0gQ29tbW9uVXRpbC5yZWR1Y2VBcnJheUl0ZW1MaXN0KHRhZ1Byb3BlcnR5LnByb2hpYml0ZWRBcmlhQXR0cmlidXRlc1doZW5Ob0ltcGxpY2l0Um9sZSwgYWxsb3dlZEF0dHJpYnV0ZXMpO1xuXG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUocnVsZUNvbnRleHQsIFwiQXJpYVV0aWxfQWxsb3dlZEFyaWFBdHRyaWJ1dGVzXCIsIGFsbG93ZWRBdHRyaWJ1dGVzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWxsb3dlZEF0dHJpYnV0ZXM7XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFxuICAgICAqIEBwYXJhbSBhcmlhQXR0ciBcbiAgICAgKiBAcGFyYW0gaHRtbEF0dHJzIFxuICAgICAqIEB0eXBlOiBjb25mbGljdCBvciBvdmVybGFwcGluZ1xuICAgICAqIEByZXR1cm5zIGh0bWxBdHRyTmFtZSwgJ1Bhc3MnIG9yIG51bGxcbiAgICAgKiAgICAgICAgIGh0bWxBdHRyTmFtZSB0aGF0IGNvbmZsaWN0cyB3aXRoIHRoZSBhcmlhQXR0ciwgXG4gICAgICogICAgICAgICAnUGFzcycgd2l0aCBubyBjb25mbGljdCB3aXRoIHRoZSBhcmlhQXR0ciwgXG4gICAgICogICAgICAgICBvciBudWxsIHdoZXJlIGFyaWFBdHRyIHdvbid0IGNhdXNlIGNvbmZsaWN0XG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRDb25mbGljdE9yT3ZlcmxhcHBpbmdIdG1sQXR0cmlidXRlKGFyaWFBdHRyLCBodG1sQXR0cnMsIHR5cGUpOiBhbnlbXSB8IG51bGwge1xuICAgICAgICBsZXQgZXhpc3QgPSBBUklBRGVmaW5pdGlvbnMucmVsYXRlZEFyaWFIdG1sQXR0cmlidXRlc1thcmlhQXR0clsnbmFtZSddXTtcbiAgICAgICAgaWYgKGV4aXN0KSB7XG4gICAgICAgICAgICBpZiAoIWFyaWFBdHRyIHx8IGFyaWFBdHRyLmxlbmd0aCA9PSAwIHx8ICFodG1sQXR0cnMgfHwgaHRtbEF0dHJzLmxlbmd0aCA9PSAwKSByZXR1cm4gW107XG5cbiAgICAgICAgICAgIGxldCBleGFtaW5lZEh0bWxBdHJOYW1lcyA9IFtdO1xuICAgICAgICAgICAgbGV0IGNvbmNlcm5UeXBlcyA9IG51bGw7XG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gJ2NvbmZsaWN0Jykge1xuICAgICAgICAgICAgICAgIGlmICghZXhpc3QuY29uZmxpY3QgfHwgT2JqZWN0LmtleXMoZXhpc3QuY29uZmxpY3QpLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgY29uY2VyblR5cGVzID0gZXhpc3QuY29uZmxpY3Q7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdvdmVybGFwcGluZycpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWV4aXN0Lm92ZXJsYXBwaW5nIHx8IE9iamVjdC5rZXlzKGV4aXN0Lm92ZXJsYXBwaW5nKS5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIGNvbmNlcm5UeXBlcyA9IGV4aXN0Lm92ZXJsYXBwaW5nO1xuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgICAgIGxldCBhcHBsaWNhYmxlID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgZmFpbCA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBjb25jZXJuVHlwZXMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgY29uY2VybkFyaWFWYWx1ZSA9IGNvbmNlcm5UeXBlc1trXS5hcmlhQXR0cmlidXRlVmFsdWU7XG4gICAgICAgICAgICAgICAgbGV0IGNvbmNlcm5IdG1sTmFtZXMgPSBjb25jZXJuVHlwZXNba10uaHRtbEF0dHJpYnV0ZU5hbWVzO1xuICAgICAgICAgICAgICAgIGxldCBjb25jZXJuSHRtbFZhbHVlcyA9IGNvbmNlcm5UeXBlc1trXS5odG1sQXR0cmlidXRlVmFsdWVzO1xuXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBodG1sQXR0cnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gY29uY2Vybkh0bWxOYW1lcy5pbmRleE9mKGh0bWxBdHRyc1tpXVsnbmFtZSddKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYWJsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaHRtbFZhbHVlc0luQ29uY2VybiA9IChjb25jZXJuSHRtbFZhbHVlcyA9PT0gbnVsbCB8fCBjb25jZXJuSHRtbFZhbHVlc1tpbmRleF0gPT09IG51bGwpID8gbnVsbCA6IGNvbmNlcm5IdG1sVmFsdWVzW2luZGV4XS5zcGxpdChcIixcIik7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25jZXJuQXJpYVZhbHVlID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGh0bWxWYWx1ZXNJbkNvbmNlcm4gPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhhbWluZWRIdG1sQXRyTmFtZXMucHVzaCh7IHJlc3VsdDogJ0ZhaWxlZCcsICdhdHRyJzogaHRtbEF0dHJzW2ldWyduYW1lJ10gfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaHRtbFZhbHVlc0luQ29uY2Vybi5pbmNsdWRlcyhodG1sQXR0cnNbaV1bJ3ZhbHVlJ10pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4YW1pbmVkSHRtbEF0ck5hbWVzLnB1c2goeyByZXN1bHQ6ICdGYWlsZWQnLCAnYXR0cic6IGh0bWxBdHRyc1tpXVsnbmFtZSddIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGh0bWxWYWx1ZXNJbkNvbmNlcm4gPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uY2VybkFyaWFWYWx1ZSA9PT0gYXJpYUF0dHJbJ3ZhbHVlJ10pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhhbWluZWRIdG1sQXRyTmFtZXMucHVzaCh7IHJlc3VsdDogJ0ZhaWxlZCcsICdhdHRyJzogaHRtbEF0dHJzW2ldWyduYW1lJ10gfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uY2VybkFyaWFWYWx1ZSA9PT0gJ1ZBTFVFJyAmJiBodG1sVmFsdWVzSW5Db25jZXJuLmluY2x1ZGVzKCdWQUxVRScpICYmIGh0bWxWYWx1ZXNJbkNvbmNlcm5bMF0gIT09IGFyaWFBdHRyWyd2YWx1ZSddKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhhbWluZWRIdG1sQXRyTmFtZXMucHVzaCh7IHJlc3VsdDogJ0ZhaWxlZCcsICdhdHRyJzogaHRtbEF0dHJzW2ldWyduYW1lJ10gfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbmNlcm5BcmlhVmFsdWUgPT09IGFyaWFBdHRyWyd2YWx1ZSddICYmIGh0bWxWYWx1ZXNJbkNvbmNlcm4uaW5jbHVkZXMoaHRtbEF0dHJzW2ldWyd2YWx1ZSddKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4YW1pbmVkSHRtbEF0ck5hbWVzLnB1c2goeyByZXN1bHQ6ICdGYWlsZWQnLCAnYXR0cic6IGh0bWxBdHRyc1tpXVsnbmFtZSddIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoYXBwbGljYWJsZSAmJiAhZmFpbClcbiAgICAgICAgICAgICAgICBleGFtaW5lZEh0bWxBdHJOYW1lcy5wdXNoKHsgcmVzdWx0OiAnUGFzcycsICdhdHRyJzogJycgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiBleGFtaW5lZEh0bWxBdHJOYW1lcztcbiAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGNvbnRhaW5zUHJlc2VudGF0aW9uYWxDaGlsZHJlbk9ubHkoZWxlbTogSFRNTEVsZW1lbnQpOiBib29sZWFuIHtcbiAgICAgICAgbGV0IHJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXMoZWxlbSwgZmFsc2UpO1xuICAgICAgICAvLyBpZiBleHBsaWNpdCByb2xlIGRvZXNuJ3QgZXhpc3QsIGdldCB0aGUgaW1wbGljaXQgb25lXG4gICAgICAgIGlmICghcm9sZXMgfHwgcm9sZXMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcm9sZXMgPSBBcmlhVXRpbC5nZXRJbXBsaWNpdFJvbGUoZWxlbSk7XG5cbiAgICAgICAgLy9pZ25vcmUgaWYgdGhlIGVsZW1lbnQgZG9lc24ndCBoYXZlIGFueSBleHBsaWNpdCBvciBpbXBsaWNpdCByb2xlLCBzaG91bGRuJ3QgaGFwcGVuXG4gICAgICAgIGlmICghcm9sZXMgfHwgcm9sZXMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyByb2xlcyAhPT0gbnVsbCAmJiBpIDwgcm9sZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCByb2xlUHJvcGVydGllcyA9IEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJuc1tyb2xlc1tpXV07XG4gICAgICAgICAgICBpZiAocm9sZVByb3BlcnRpZXMgIT09IG51bGwgJiYgcm9sZVByb3BlcnRpZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGxldCBwcmVzZW50aW9uYWwgPSByb2xlUHJvcGVydGllcy5wcmVzZW50YXRpb25hbENoaWxkcmVuO1xuICAgICAgICAgICAgICAgIGlmIChwcmVzZW50aW9uYWwgPT09IHRydWUpXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHNob3VsZEJlUHJlc2VudGF0aW9uYWxDaGlsZChlbGVtZW50OiBIVE1MRWxlbWVudCk6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgd2Fsa05vZGU6IEVsZW1lbnQgPSBET01XYWxrZXIucGFyZW50RWxlbWVudChlbGVtZW50KTtcbiAgICAgICAgd2hpbGUgKHdhbGtOb2RlKSB7XG4gICAgICAgICAgICBpZiAoQXJpYVV0aWwuY29udGFpbnNQcmVzZW50YXRpb25hbENoaWxkcmVuT25seSh3YWxrTm9kZSBhcyBIVE1MRWxlbWVudCkpIHJldHVybiB0cnVlO1xuXG4gICAgICAgICAgICAvL2FyaWEtb3duIGNhc2U6IGlmIHRoZSBlbGVtZW50IGlzIHJlZmVycmVkIGJ5IGFuIGFyaWEtd29uXG4gICAgICAgICAgICB3YWxrTm9kZSA9IEFSSUFNYXBwZXIuZ2V0QXJpYU93bmVkQnkod2Fsa05vZGUgYXMgSFRNTEVsZW1lbnQpIHx8IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KHdhbGtOb2RlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyogXG4gKiBjaGVjayBpZiBhbnkgZXhwbGljaXQgcm9sZSBzcGVjaWZpZWQgZm9yIHRoZSBlbGVtZW50IGlzIGEgdmFsaWQgQVJJQSByb2xlXG4gKiByZXR1cm46IG51bGwgaWYgbm8gZXhwbGljaXQgcm9sZSBpcyBkZWZpbmVkLCBcbiAqICAgICAgICAgdHJ1ZSBpZiB0aGUgcm9sZShzKSBhcmUgZGVmaW5lZCBpbiBBUklBXG4gKiAgICAgICAgIGZhbHNlIGlmIGFueSByb2xlIGlzIG5vdCBkZWZpbmVkIGluIEFSSUFcbiovXG4gICAgcHVibGljIHN0YXRpYyBhcmVSb2xlc0RlZmluZWQocm9sZXM6IHN0cmluZ1tdKSB7XG4gICAgICAgIGlmICghcm9sZXMgfHwgcm9sZXMubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgZGVzaWduUGF0dGVybnMgPSBBUklBRGVmaW5pdGlvbnMuZGVzaWduUGF0dGVybnM7XG4gICAgICAgIGZvciAoY29uc3Qgcm9sZSBvZiByb2xlcylcbiAgICAgICAgICAgIGlmICghKHJvbGUudG9Mb3dlckNhc2UoKSBpbiBkZXNpZ25QYXR0ZXJucykpXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qIFxuICAgICAqIGNoZWNrIGlmIGFueSBleHBsaWNpdCByb2xlIHNwZWNpZmllZCBmb3IgdGhlIGVsZW1lbnQgaXMgYSB2YWxpZCBBUklBIHJvbGVcbiAgICAgKiByZXR1cm46IG51bGwgaWYgbm8gZXhwbGljaXQgcm9sZSBpcyBkZWZpbmVkLCBcbiAgICAgKiAgICAgICAgIHRydWUgaWYgdGhlIHJvbGUocykgYXJlIGRlZmluZWQgaW4gQVJJQVxuICAgICAqICAgICAgICAgZmFsc2UgaWYgYW55IHJvbGUgaXMgbm90IGRlZmluZWQgaW4gQVJJQVxuICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnZhbGlkUm9sZXMocnVsZUNvbnRleHQ6IEVsZW1lbnQpIHtcbiAgICAgICAgbGV0IGRvbVJvbGVzOiBzdHJpbmdbXSA9IEFyaWFVdGlsLmdldFVzZXJEZWZpbmVkUm9sZXMocnVsZUNvbnRleHQpO1xuXG4gICAgICAgIGlmICghZG9tUm9sZXMgfHwgZG9tUm9sZXMubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgLy8gY2hlY2sgdGhlICdnZW5lcmljJyByb2xlIGZpcnN0XG4gICAgICAgIGlmIChkb21Sb2xlcyAmJiBkb21Sb2xlcy5pbmNsdWRlcygnZ2VuZXJpYycpKVxuICAgICAgICAgICAgcmV0dXJuIFtcImdlbmVyaWNcIl07XG5cbiAgICAgICAgLy8gRmFpbGluZyByb2xlc1xuICAgICAgICBsZXQgZmFpbFJvbGVUb2tlbnMgPSBbXTtcbiAgICAgICAgLy8gUGFzc2luZyByb2xlc1xuICAgICAgICBsZXQgcGFzc1JvbGVUb2tlbnMgPSBbXTtcblxuICAgICAgICBsZXQgdGFnUHJvcGVydHkgPSBBcmlhVXRpbC5nZXRFbGVtZW50QXJpYVByb3BlcnR5KHJ1bGVDb250ZXh0KTtcbiAgICAgICAgbGV0IGFsbG93ZWRSb2xlcyA9IEFyaWFVdGlsLmdldEFsbG93ZWRBcmlhUm9sZXMocnVsZUNvbnRleHQsIHRhZ1Byb3BlcnR5KTtcbiAgICAgICAgaWYgKCFhbGxvd2VkUm9sZXMgfHwgYWxsb3dlZFJvbGVzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiBkb21Sb2xlcztcblxuICAgICAgICBsZXQgaW52YWxpZFJvbGVzID0gW107XG5cbiAgICAgICAgaWYgKGFsbG93ZWRSb2xlcy5pbmNsdWRlcygnYW55JykpXG4gICAgICAgICAgICByZXR1cm4gW107XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkb21Sb2xlcy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgIGlmICghYWxsb3dlZFJvbGVzLmluY2x1ZGVzKGRvbVJvbGVzW2ldKSAmJiAhaW52YWxpZFJvbGVzLmluY2x1ZGVzKGRvbVJvbGVzW2ldKSlcbiAgICAgICAgICAgICAgICBpbnZhbGlkUm9sZXMucHVzaChkb21Sb2xlc1tpXSk7XG5cbiAgICAgICAgcmV0dXJuIGludmFsaWRSb2xlcztcbiAgICB9XG5cbiAgICAvKiBcbiAgICAgKiBjaGVjayBpZiBhbnkgZXhwbGljaXQgcm9sZSBzcGVjaWZpZWQgZm9yIHRoZSBlbGVtZW50IGlzIG5vdCBkZWZpbmVkIGluIEFSSUFcbiAgICAgKiByZXR1cm46IGxpc3Qgb2Ygc3BlY2lmaWVkIHJvbGVzIG5vdCBkZWZpbmVkIGluIEFSSUFcbiAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Um9sZXNVbmRlZmluZWRCeUFyaWEoZWxlbWVudDogRWxlbWVudCkge1xuICAgICAgICBpZiAoIWVsZW1lbnQpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IHJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXMoZWxlbWVudCwgZmFsc2UpO1xuICAgICAgICBsZXQgdW5kZWZpbmVkUm9sZXMgPSBbXTtcbiAgICAgICAgaWYgKHJvbGVzICYmIHJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxldCBkZXNpZ25QYXR0ZXJucyA9IEFSSUFEZWZpbml0aW9ucy5kZXNpZ25QYXR0ZXJucztcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm9sZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoIShyb2xlc1tpXSBpbiBkZXNpZ25QYXR0ZXJucykpIHtcbiAgICAgICAgICAgICAgICAgICAgdW5kZWZpbmVkUm9sZXMucHVzaChyb2xlc1tpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1bmRlZmluZWRSb2xlcztcbiAgICB9XG5cbiAgICAvKiBcbiAgICAgKiB0aGlzIG1ldGhvZCBmaXJzdCBjaGVja3MgZXhwbGljaXQgcm9sZXMsIGlmIG5vIGV4cGxpY2l0IHJvbGUsIGl0IHdpbGwgY2hlY2sgdGhlIGltcGxpY2l0IHJvbGVcbiAgICAgKiByZXR1cm46IG51bGwgaWYgYW55IGV4cGxpY2l0IHJvbGUgaXMgaW52YWxpZCwgXG4gICAgICogICAgICAgICBhIGxpc3Qgb2YgaW52YWxpZCBhdHRyaWJ1dGVzXG4gICAgICogICAgICAgICBlbXB0eSBsaXN0IGlmIGFsbCBhdHRyaWJ1dGVzIGFyZSB2YWxpZCwgb3Igbm8gYXJpYSBhdHRyaWJ1dGVzIGFyZSBzcGVjaWZpZWRcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEludmFsaWRBcmlhQXR0cmlidXRlcyhydWxlQ29udGV4dDogRWxlbWVudCk6IHN0cmluZ1tdIHtcbiAgICAgICAgbGV0IHJvbGVzID0gQXJpYVV0aWwuZ2V0VXNlckRlZmluZWRSb2xlcyhydWxlQ29udGV4dCk7XG5cbiAgICAgICAgLy8gdGhlIGludmFsaWQgcm9sZSBjYXNlOiBoYW5kbGVkIGJ5IFJwdF9BcmlhX1ZhbGlkUm9sZS4gSWdub3JlIHRvIGF2b2lkIGR1cGxpY2F0ZWQgcmVwb3J0XG4gICAgICAgIC8vIGZvciBtdXRpcGxlIHJvbGVzLCBza2lwIGlmIGFueSByb2xlIGlzIGludmFsaWRcbiAgICAgICAgbGV0IGRlZmluZWQgPSBBcmlhVXRpbC5hcmVSb2xlc0RlZmluZWQocm9sZXMpO1xuICAgICAgICBpZiAoZGVmaW5lZCAhPT0gbnVsbCAmJiAhZGVmaW5lZClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCBhdHRycyA9IFtdO1xuICAgICAgICBpZiAoIXJvbGVzIHx8IHJvbGVzLmxlbmd0aCA9PSAwKVxuICAgICAgICAgICAgcm9sZXMgPSBBcmlhVXRpbC5nZXRJbXBsaWNpdFJvbGUocnVsZUNvbnRleHQpO1xuXG4gICAgICAgIGxldCBhcmlhX2F0dHJzOiBzdHJpbmdbXSA9IEFyaWFVdGlsLmdldFVzZXJEZWZpbmVkQXJpYUF0dHJpYnV0ZXMocnVsZUNvbnRleHQpO1xuXG4gICAgICAgIGxldCB0YWdQcm9wZXJ0eSA9IEFyaWFVdGlsLmdldEVsZW1lbnRBcmlhUHJvcGVydHkocnVsZUNvbnRleHQpO1xuICAgICAgICAvLyBBdHRyaWJ1dGVzIGFsbG93ZWQgb24gdGhpcyBub2RlXG4gICAgICAgIGxldCBhbGxvd2VkQXR0cmlidXRlcyA9IEFyaWFVdGlsLmdldEFsbG93ZWRBcmlhQXR0cmlidXRlcyhydWxlQ29udGV4dCwgcm9sZXMsIHRhZ1Byb3BlcnR5KTtcblxuICAgICAgICBpZiAoYXJpYV9hdHRycykge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmlhX2F0dHJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGF0dHJOYW1lID0gYXJpYV9hdHRyc1tpXS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICBpZiAoIWFsbG93ZWRBdHRyaWJ1dGVzLmluY2x1ZGVzKGF0dHJOYW1lKSAmJiAhYXR0cnMuaW5jbHVkZXMoYXR0ck5hbWUpKVxuICAgICAgICAgICAgICAgICAgICBhdHRycy5wdXNoKGF0dHJOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXR0cnM7XG4gICAgfVxuXG4gICAgLyogXG4gICAgICogZ2V0IGNvbmZsaWN0IEFyaWEgYW5kIEh0bWwgYXR0cmlidXRlc1xuICAgICAqIHJldHVybjogYSBsaXN0IG9mIEFyaWEgYW5kIEh0bWwgYXR0cmlidXRlIHBhaXJzIHRoYXQgYXJlIGNvbmZsaWN0XG4gICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldENvbmZsaWN0QXJpYUFuZEh0bWxBdHRyaWJ1dGVzKGVsZW06IEVsZW1lbnQpIHtcblxuICAgICAgICBsZXQgYXJpYUF0dHJzID0gQXJpYVV0aWwuZ2V0VXNlckRlZmluZWRBcmlhQXR0cmlidXRlTmFtZVZhbHVlUGFpcnMoZWxlbSk7XG4gICAgICAgIGxldCBodG1sQXR0cnMgPSBBcmlhVXRpbC5nZXRVc2VyRGVmaW5lZEh0bWxBdHRyaWJ1dGVOYW1lVmFsdWVQYWlycyhlbGVtKTtcblxuICAgICAgICBsZXQgcmV0ID0gW107XG4gICAgICAgIGlmIChhcmlhQXR0cnMgJiYgYXJpYUF0dHJzLmxlbmd0aCA+IDAgJiYgaHRtbEF0dHJzICYmIGh0bWxBdHRycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyaWFBdHRycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4YW1pbmVkSHRtbEF0ck5hbWVzID0gQXJpYVV0aWwuZ2V0Q29uZmxpY3RPck92ZXJsYXBwaW5nSHRtbEF0dHJpYnV0ZShhcmlhQXR0cnNbaV0sIGh0bWxBdHRycywgJ2NvbmZsaWN0Jyk7XG4gICAgICAgICAgICAgICAgaWYgKGV4YW1pbmVkSHRtbEF0ck5hbWVzID09PSBudWxsKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBleGFtaW5lZEh0bWxBdHJOYW1lcy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbVsncmVzdWx0J10gPT09ICdGYWlsZWQnKSAvL2ZhaWxlZFxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0LnB1c2goeyAnYXJpYUF0dHInOiBhcmlhQXR0cnNbaV1bJ25hbWUnXSwgJ2h0bWxBdHRyJzogaXRlbVsnYXR0ciddIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuXG4gICAgLyogXG4gICAgICogZ2V0IGRlcHJlY2F0ZWQgQXJpYSByb2xlc1xuICAgICAqIHJldHVybjogYSBsaXN0IG9mIGRlcHJlY2F0ZWQgQXJpYSByb2xlc1xuICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXREZXByZWNhdGVkQXJpYVJvbGVzKGVsZW1lbnQ6IEVsZW1lbnQpIHtcbiAgICAgICAgaWYgKCFlbGVtZW50KSByZXR1cm4gbnVsbDtcblxuICAgICAgICBjb25zdCByb2xlcyA9IEFyaWFVdGlsLmdldFJvbGVzKGVsZW1lbnQsIGZhbHNlKTtcbiAgICAgICAgbGV0IHJldCA9IFtdO1xuICAgICAgICBpZiAocm9sZXMgJiYgcm9sZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgZ2xvYmFsRGVwcmVjYXRlZFJvbGVzID0gQVJJQURlZmluaXRpb25zLmdsb2JhbERlcHJlY2F0ZWRSb2xlcztcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm9sZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoZ2xvYmFsRGVwcmVjYXRlZFJvbGVzLmluY2x1ZGVzKHJvbGVzW2ldKSlcbiAgICAgICAgICAgICAgICAgICAgcmV0LnB1c2gocm9sZXNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuXG4gICAgLyogXG4gICAgICogZ2V0IGRlcHJlY2F0ZWQgQXJpYSByb2xlLWF0dHJpYnV0ZXNcbiAgICAgKiByZXR1cm46IGEgbGlzdCBvZiBkZXByZWNhdGVkIEFyaWEgcm9sZS1hdHRyaWJ1dGVzIHBhcmlzXG4gICAgICogICAgICAgICBmb3IgZ2xvYmFsIHRoZSByb2xlIGlzIG1hcmtlZCBhcyAnYW55J1xuICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXREZXByZWNhdGVkQXJpYUF0dHJpYnV0ZXMoZWxlbWVudDogRWxlbWVudCkge1xuICAgICAgICBpZiAoIWVsZW1lbnQpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCBkb21BdHRyaWJ1dGVzID0gZWxlbWVudC5hdHRyaWJ1dGVzO1xuICAgICAgICBsZXQgYXJpYUF0dHJzID0gW107XG4gICAgICAgIGlmIChkb21BdHRyaWJ1dGVzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRvbUF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgYXR0ck5hbWUgPSBkb21BdHRyaWJ1dGVzW2ldLm5hbWU7XG4gICAgICAgICAgICAgICAgaWYgKGF0dHJOYW1lLnN1YnN0cmluZygwLCA1KSA9PT0gJ2FyaWEtJylcbiAgICAgICAgICAgICAgICAgICAgYXJpYUF0dHJzLnB1c2goYXR0ck5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChhcmlhQXR0cnMubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG5cbiAgICAgICAgbGV0IHJldCA9IFtdO1xuICAgICAgICBjb25zdCBnbG9iYWxEZXByZWNhdGVkQXR0cmlidXRlcyA9IEFSSUFEZWZpbml0aW9ucy5nbG9iYWxEZXByZWNhdGVkUHJvcGVydGllcztcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmlhQXR0cnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChnbG9iYWxEZXByZWNhdGVkQXR0cmlidXRlcy5pbmNsdWRlcyhhcmlhQXR0cnNbaV0pKVxuICAgICAgICAgICAgICAgIHJldC5wdXNoKHsgXCJyb2xlXCI6IFwiYW55XCIsIFwiYXR0cmlidXRlXCI6IGFyaWFBdHRyc1tpXSB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByb2xlcyA9IEFyaWFVdGlsLmdldFJvbGVzKGVsZW1lbnQsIGZhbHNlKTtcbiAgICAgICAgaWYgKHJvbGVzICYmIHJvbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm9sZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCByb2xlV2l0aERlcHJlY2F0ZWRBdHRyaWJ1dGVzID0gQVJJQURlZmluaXRpb25zLmRlc2lnblBhdHRlcm5zW3JvbGVzW2ldXTtcbiAgICAgICAgICAgICAgICBpZiAocm9sZVdpdGhEZXByZWNhdGVkQXR0cmlidXRlcykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXByZWNhdGVkQXR0cmlOYW1lcyA9IHJvbGVXaXRoRGVwcmVjYXRlZEF0dHJpYnV0ZXNbJ2RlcHJlY2F0ZWRQcm9wcyddO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGVwcmVjYXRlZEF0dHJpTmFtZXMgJiYgZGVwcmVjYXRlZEF0dHJpTmFtZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBhcmlhQXR0cnMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVwcmVjYXRlZEF0dHJpTmFtZXMuaW5jbHVkZXMoYXJpYUF0dHJzW2pdKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0LnB1c2goeyBcInJvbGVcIjogcm9sZXNbaV0sIFwiYXR0cmlidXRlXCI6IGFyaWFBdHRyc1tqXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmV0O1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaXNOb2RlSW5HcmlkKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIEFyaWFVdGlsLmdldEFuY2VzdG9yV2l0aFJvbGUobm9kZSwgXCJncmlkXCIpICE9IG51bGw7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4vQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBDb21tb25VdGlsIH0gZnJvbSBcIi4vQ29tbW9uVXRpbFwiO1xuaW1wb3J0IHsgQXJpYVV0aWwgfSBmcm9tIFwiLi9BcmlhVXRpbFwiO1xuaW1wb3J0IHsgRE9NTWFwcGVyIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01NYXBwZXJcIjtcbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5pbXBvcnQgeyBCb3VuZHMgfSBmcm9tIFwiLi4vYXBpL0lCb3VuZHNcIjtcblxudHlwZSBQc2V1ZG9DbGFzcyA9XG4gICAgfCBcIjpob3ZlclwiXG4gICAgfCBcIjphY3RpdmVcIlxuICAgIHwgXCI6Zm9jdXNcIlxuICAgIHwgXCI6Zm9jdXMtdmlzaWJsZVwiXG4gICAgfCBcIjpmb2N1cy13aXRoaW5cIjtcblxuZXhwb3J0IGNsYXNzIENTU1V0aWwge1xuICAgIHB1YmxpYyBzdGF0aWMgc2VsZWN0b3JNYXRjaGVzRWxlbShlbGVtZW50OiBFbGVtZW50LCBzZWxlY3Rvcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIC8vIEVhcmx5IHJldHVybiBmb3IgZW1wdHkgc2VsZWN0b3IgKGJlZm9yZSB0cnktY2F0Y2ggZm9yIHBlcmZvcm1hbmNlKVxuICAgICAgICBpZiAoIXNlbGVjdG9yIHx8IHNlbGVjdG9yLmxlbmd0aCA9PT0gMCB8fCBzZWxlY3Rvci50cmltKCkgPT09IFwiXCIpIHJldHVybiBmYWxzZTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gTW9kZXJuIHN0YW5kYXJkIG1ldGhvZFxuICAgICAgICAgICAgaWYgKHR5cGVvZiBlbGVtZW50Lm1hdGNoZXMgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50Lm1hdGNoZXMoc2VsZWN0b3IpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBWZW5kb3ItcHJlZml4ZWQgZmFsbGJhY2tzIChvbGRlciBicm93c2VycylcbiAgICAgICAgICAgIGlmICh0eXBlb2YgKGVsZW1lbnQgYXMgYW55KS53ZWJraXRNYXRjaGVzU2VsZWN0b3IgPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgICAgICAgICAgIHJldHVybiAoZWxlbWVudCBhcyBhbnkpLndlYmtpdE1hdGNoZXNTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgKGVsZW1lbnQgYXMgYW55KS5tc01hdGNoZXNTZWxlY3RvciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChlbGVtZW50IGFzIGFueSkubXNNYXRjaGVzU2VsZWN0b3Ioc2VsZWN0b3IpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBMZWdhY3kgbWV0aG9kIChkZXByZWNhdGVkIGJ1dCBrZXB0IGZvciBjb21wYXRpYmlsaXR5KVxuICAgICAgICAgICAgaWYgKHR5cGVvZiAoZWxlbWVudCBhcyBhbnkpLm1hdGNoZXNTZWxlY3RvciA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChlbGVtZW50IGFzIGFueSkubWF0Y2hlc1NlbGVjdG9yKHNlbGVjdG9yKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRmFsbGJhY2s6IHVzZSBxdWVyeVNlbGVjdG9yQWxsIGFuZCBjaGVjayBpZiBlbGVtZW50IGlzIGluIHJlc3VsdHNcbiAgICAgICAgICAgIGNvbnN0IGRvYyA9IGVsZW1lbnQub3duZXJEb2N1bWVudCB8fCAoZWxlbWVudCBhcyBhbnkpLmRvY3VtZW50O1xuICAgICAgICAgICAgaWYgKCFkb2MpIHJldHVybiBmYWxzZTtcblxuICAgICAgICAgICAgY29uc3QgbWF0Y2hlcyA9IGRvYy5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTtcbiAgICAgICAgICAgIC8vIFVzZSBBcnJheS5mcm9tIGZvciBiZXR0ZXIgcGVyZm9ybWFuY2Ugd2l0aCBtb2Rlcm4gZW5naW5lc1xuICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20obWF0Y2hlcykuaW5jbHVkZXMoZWxlbWVudCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgLy8gQmFkIHNlbGVjdG9yPyBEb2Vzbid0IG1hdGNoIHRoZW4uLi5cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHN0eWxlIGNvbXB1dGVkIGZvciB0aGlzIGVsZW1lbnRcbiAgICAgKiBAcGFyYW0gZWxlbVxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Q29tcHV0ZWRTdHlsZShlbGVtOiBIVE1MRWxlbWVudCwgcHNldWRvRWx0PzogUHNldWRvQ2xhc3MpIHtcbiAgICAgICAgaWYgKCFlbGVtKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY29uc3QgZG9jID0gZWxlbS5vd25lckRvY3VtZW50O1xuICAgICAgICBjb25zdCB3aW4gPSBkb2MuZGVmYXVsdFZpZXc7XG4gICAgICAgIHJldHVybiB3aW4uZ2V0Q29tcHV0ZWRTdHlsZShlbGVtLCBwc2V1ZG9FbHQpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFBhcnNlIGFuZCBjYWNoZSBhbGwgc3R5bGVzaGVldCBydWxlcyBhdCB0aGUgZG9jdW1lbnQgbGV2ZWxcbiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHBhcnNlZCBydWxlIG9iamVjdHMgd2l0aCBzZWxlY3RvciBhbmQgc3R5bGUgaW5mb3JtYXRpb25cbiAgICAgKi9cbiAgICBwcml2YXRlIHN0YXRpYyBnZXRQYXJzZWRTdHlsZXNoZWV0UnVsZXMob3duZXJEb2M6IERvY3VtZW50KTogQXJyYXk8e1xuICAgICAgICBmdWxsUnVsZVNlbGVjdG9yOiBzdHJpbmc7XG4gICAgICAgIGhhc1BzZXVkb0NsYXNzOiBib29sZWFuO1xuICAgICAgICBzZWxNYWluOiBzdHJpbmc7XG4gICAgICAgIHNlbFBzZXVkbzogc3RyaW5nO1xuICAgICAgICBzdHlsZTogQ1NTU3R5bGVEZWNsYXJhdGlvbjtcbiAgICB9PiB7XG4gICAgICAgIC8vIENoZWNrIGlmIHdlIGFscmVhZHkgaGF2ZSBjYWNoZWQgcGFyc2VkIHJ1bGVzIGZvciB0aGlzIGRvY3VtZW50XG4gICAgICAgIGNvbnN0IGNhY2hlZFJ1bGVzID0gQ2FjaGVVdGlsLmdldENhY2hlKG93bmVyRG9jLCBcIlJQVFV0aWxfUGFyc2VkU3R5bGVzaGVldFJ1bGVzXCIsIG51bGwpO1xuICAgICAgICBpZiAoY2FjaGVkUnVsZXMpIHtcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRSdWxlcztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHBhcnNlZFJ1bGVzID0gW107XG5cbiAgICAgICAgLy8gSXRlcmF0ZSB0aHJvdWdoIGFsbCBvZiB0aGUgc3R5bGVzaGVldHMgYW5kIHJ1bGVzXG4gICAgICAgIGZvciAobGV0IHNzSW5kZXggPSAwOyBzc0luZGV4IDwgb3duZXJEb2Muc3R5bGVTaGVldHMubGVuZ3RoOyArK3NzSW5kZXgpIHtcbiAgICAgICAgICAgIGNvbnN0IHNoZWV0ID0gb3duZXJEb2Muc3R5bGVTaGVldHNbc3NJbmRleF0gYXMgQ1NTU3R5bGVTaGVldDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKHNoZWV0ICYmIHNoZWV0LmNzc1J1bGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHJJbmRleCA9IDA7IHJJbmRleCA8IHNoZWV0LmNzc1J1bGVzLmxlbmd0aDsgKytySW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJ1bGUgPSBzaGVldC5jc3NSdWxlc1tySW5kZXhdIGFzIENTU1N0eWxlUnVsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZ1bGxSdWxlU2VsZWN0b3IgPSBydWxlLnNlbGVjdG9yVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmdWxsUnVsZVNlbGVjdG9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHNldWRvTWF0Y2ggPSBmdWxsUnVsZVNlbGVjdG9yLm1hdGNoKC9eKC4qKSg6W2EtekEtWi1dKikkLyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFzUHNldWRvQ2xhc3MgPSAhIXBzZXVkb01hdGNoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbE1haW4gPSBoYXNQc2V1ZG9DbGFzcyA/IHBzZXVkb01hdGNoWzFdIDogZnVsbFJ1bGVTZWxlY3RvcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxQc2V1ZG8gPSBoYXNQc2V1ZG9DbGFzcyA/IHBzZXVkb01hdGNoWzJdIDogXCJcIjtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlZFJ1bGVzLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxsUnVsZVNlbGVjdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNQc2V1ZG9DbGFzcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsTWFpbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsUHNldWRvLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZTogcnVsZS5zdHlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAhZXJyLnRvU3RyaW5nKCkuaW5jbHVkZXMoXCJDYW5ub3QgYWNjZXNzIHJ1bGVzXCIpICYmXG4gICAgICAgICAgICAgICAgICAgICFlcnIudG9TdHJpbmcoKS5pbmNsdWRlcyhcIlNlY3VyaXR5RXJyb3I6XCIpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYWNoZSB0aGUgcGFyc2VkIHJ1bGVzIGF0IHRoZSBkb2N1bWVudCBsZXZlbFxuICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUob3duZXJEb2MsIFwiUlBUVXRpbF9QYXJzZWRTdHlsZXNoZWV0UnVsZXNcIiwgcGFyc2VkUnVsZXMpO1xuICAgICAgICByZXR1cm4gcGFyc2VkUnVsZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUHJpdmF0ZSBoZWxwZXIgbWV0aG9kIHRvIGZpbGwgc3R5bGUgbWFwcyBmcm9tIGEgQ1NTU3R5bGVEZWNsYXJhdGlvblxuICAgICAqIEhhbmRsZXMgQ1NTIHByb3BlcnR5IHByaW9yaXRpZXMgYW5kIHRoZSBcImFsbFwiIHNob3J0aGFuZCBwcm9wZXJ0eVxuICAgICAqL1xuICAgIHByaXZhdGUgc3RhdGljIGZpbGxTdHlsZShtYXBzOiBhbnlbXSwgc3R5bGU6IENTU1N0eWxlRGVjbGFyYXRpb24pOiB2b2lkIHtcbiAgICAgICAgZm9yIChsZXQgc0luZGV4ID0gMDsgc0luZGV4IDwgc3R5bGUubGVuZ3RoOyArK3NJbmRleCkge1xuICAgICAgICAgICAgaWYgKHN0eWxlW3NJbmRleF0gPT09IFwiYWxsXCIgJiYgc3R5bGVbc3R5bGVbc0luZGV4XV0pIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IG1hcCBvZiBtYXBzKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IGluIG1hcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG1hcFtrZXldO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSBzdHlsZVtzSW5kZXhdO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbWFwIG9mIG1hcHMpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHByaW9yaXR5ID0gc3R5bGUuZ2V0UHJvcGVydHlQcmlvcml0eShrZXkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoa2V5IGluIG1hcCAmJiBtYXBba2V5XS5lbmRzV2l0aChcIiFpbXBvcnRhbnRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmlvcml0eSA9PT0gXCJpbXBvcnRhbnRcIiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICFtYXBba2V5XS5zdGFydHNXaXRoKFwiaW5oZXJpdFwiKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICFtYXBba2V5XS5zdGFydHNXaXRoKFwidW5zZXRcIilcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBba2V5XSA9IHN0eWxlW2tleV0gKyBcIiAhaW1wb3J0YW50XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcFtrZXldID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZVtrZXldICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHJpb3JpdHkgPT09IFwiaW1wb3J0YW50XCIgPyBcIiAhaW1wb3J0YW50XCIgOiBcIlwiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBQcml2YXRlIGhlbHBlciBtZXRob2QgdGhhdCBjb25zb2xpZGF0ZXMgdGhlIGxvZ2ljIGZvciBnZXR0aW5nIGRlZmluZWQgc3R5bGVzXG4gICAgICogVXNlZCBieSBib3RoIGdldERlZmluZWRTdHlsZXMgYW5kIGdldERlZmluZWRTdHlsZXNNdWx0aXBsZVxuICAgICAqL1xuICAgIHByaXZhdGUgc3RhdGljIGdldERlZmluZWRTdHlsZXNJbnRlcm5hbChcbiAgICAgICAgZWxlbTogSFRNTEVsZW1lbnQsXG4gICAgICAgIHByb3BzOiBzdHJpbmdbXSB8IG51bGwsXG4gICAgICAgIHBzZXVkb0NsYXNzZXM6IHN0cmluZ1tdXG4gICAgKTogeyBbcHNldWRvQ2xhc3M6IHN0cmluZ106IGFueSB9IHtcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IHt9O1xuICAgICAgICBjb25zdCBkZWZpbmVkU3R5bGVzTWFwID0ge307XG4gICAgICAgIGNvbnN0IGRlZmluZWRTdHlsZVBzZXVkb01hcCA9IHt9O1xuXG4gICAgICAgIC8vIEluaXRpYWxpemUgcmVzdWx0IG9iamVjdHMgZm9yIGFsbCBwc2V1ZG8tY2xhc3Nlc1xuICAgICAgICBmb3IgKGNvbnN0IHBzZXVkb0NsYXNzIG9mIHBzZXVkb0NsYXNzZXMpIHtcbiAgICAgICAgICAgIGRlZmluZWRTdHlsZXNNYXBbcHNldWRvQ2xhc3NdID0ge307XG4gICAgICAgICAgICBkZWZpbmVkU3R5bGVQc2V1ZG9NYXBbcHNldWRvQ2xhc3NdID0ge307XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgcHJlLXBhcnNlZCBzdHlsZXNoZWV0IHJ1bGVzIGZyb20gY2FjaGVcbiAgICAgICAgY29uc3QgcGFyc2VkUnVsZXMgPSBDU1NVdGlsLmdldFBhcnNlZFN0eWxlc2hlZXRSdWxlcyhlbGVtLm93bmVyRG9jdW1lbnQpO1xuICAgICAgICBcbiAgICAgICAgLy8gQ2hlY2sgb25jZSBpZiB3ZSBuZWVkIHRvIGhhbmRsZSA6Zm9jdXMgcHNldWRvLWNsYXNzXG4gICAgICAgIGNvbnN0IGhhc0ZvY3VzUHNldWRvID0gcHNldWRvQ2xhc3Nlcy5pbmNsdWRlcyhcIjpmb2N1c1wiKTtcblxuICAgICAgICAvLyBQcm9jZXNzIGVhY2ggY2FjaGVkIHJ1bGVcbiAgICAgICAgZm9yIChjb25zdCBwYXJzZWRSdWxlIG9mIHBhcnNlZFJ1bGVzKSB7XG4gICAgICAgICAgICBpZiAocHJvcHMgIT09IG51bGwgJiYgIXByb3BzLnNvbWUocHJvcCA9PiAhIXBhcnNlZFJ1bGUuc3R5bGVbcHJvcF0pKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBzZWxQc2V1ZG8gPSBwYXJzZWRSdWxlLnNlbFBzZXVkbztcbiAgICAgICAgICAgIGNvbnN0IGhhc1BzZXVkb0NsYXNzID0gcGFyc2VkUnVsZS5oYXNQc2V1ZG9DbGFzcztcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gSGFuZGxlIDpmb2N1cy13aXRoaW4gcmVwbGFjZW1lbnQgb25jZSBwZXIgcnVsZSBpZiBuZWVkZWRcbiAgICAgICAgICAgIGxldCBzZWxNYWluID0gcGFyc2VkUnVsZS5zZWxNYWluO1xuICAgICAgICAgICAgaWYgKGhhc0ZvY3VzUHNldWRvICYmIHNlbFBzZXVkbyA9PT0gXCI6Zm9jdXNcIikge1xuICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgZWxlbWVudCBoYXMgZm9jdXMsIHJlbW92ZSBmb2N1cy13aXRoaW4gZnJvbSBwYXJlbnRzXG4gICAgICAgICAgICAgICAgc2VsTWFpbiA9IHNlbE1haW4ucmVwbGFjZShcbiAgICAgICAgICAgICAgICAgICAgLyhbID5dW14rfiA+XSspOmZvY3VzLXdpdGhpbi9nLFxuICAgICAgICAgICAgICAgICAgICBcIiQxXCJcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBDYWNoZSBzZWxlY3RvciBtYXRjaGluZyByZXN1bHQgKG9ubHkgb25jZSBwZXIgcnVsZSwgbm90IHBlciBwc2V1ZG8tY2xhc3MpXG4gICAgICAgICAgICBjb25zdCBzZWxlY3Rvck1hdGNoZXMgPSBDU1NVdGlsLnNlbGVjdG9yTWF0Y2hlc0VsZW0oZWxlbSwgc2VsTWFpbik7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIE9ubHkgcHJvY2VzcyBpZiBzZWxlY3RvciBtYXRjaGVzXG4gICAgICAgICAgICBpZiAoc2VsZWN0b3JNYXRjaGVzKSB7XG4gICAgICAgICAgICAgICAgLy8gUHJvY2VzcyBmb3IgZWFjaCBwc2V1ZG8tY2xhc3NcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHBzZXVkb0NsYXNzIG9mIHBzZXVkb0NsYXNzZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2FjaGUgbWFwIHJlZmVyZW5jZXMgdG8gYXZvaWQgcmVwZWF0ZWQgbG9va3Vwc1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHlsZU1hcCA9IGRlZmluZWRTdHlsZXNNYXBbcHNldWRvQ2xhc3NdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwc2V1ZG9NYXAgPSBkZWZpbmVkU3R5bGVQc2V1ZG9NYXBbcHNldWRvQ2xhc3NdO1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHN0eWxlcyBvZiBub24tcHNldWRvIHNlbGVjdG9yc1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc1BzZXVkb0NsYXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBDU1NVdGlsLmZpbGxTdHlsZShbc3R5bGVNYXAsIHBzZXVkb01hcF0sIHBhcnNlZFJ1bGUuc3R5bGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gR2V0IHN0eWxlcyBmb3IgbWF0Y2hpbmcgcHNldWRvLWNsYXNzXG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWxQc2V1ZG8gPT09IHBzZXVkb0NsYXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBDU1NVdGlsLmZpbGxTdHlsZShbcHNldWRvTWFwXSwgcGFyc2VkUnVsZS5zdHlsZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBIYW5kbGUgZWxlbWVudCBzdHlsZXMgYW5kIGJ1aWxkIHJlc3VsdHMgaW4gb25lIHBhc3NcbiAgICAgICAgZm9yIChjb25zdCBwc2V1ZG9DbGFzcyBvZiBwc2V1ZG9DbGFzc2VzKSB7XG4gICAgICAgICAgICBjb25zdCBzdHlsZU1hcCA9IGRlZmluZWRTdHlsZXNNYXBbcHNldWRvQ2xhc3NdO1xuICAgICAgICAgICAgY29uc3QgcHNldWRvTWFwID0gZGVmaW5lZFN0eWxlUHNldWRvTWFwW3BzZXVkb0NsYXNzXTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gQWRkIGVsZW1lbnQncyBpbmxpbmUgc3R5bGVzXG4gICAgICAgICAgICBDU1NVdGlsLmZpbGxTdHlsZShbc3R5bGVNYXAsIHBzZXVkb01hcF0sIGVsZW0uc3R5bGUpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBCdWlsZCByZXN1bHRzXG4gICAgICAgICAgICBpZiAocHNldWRvQ2xhc3MgPT09IFwiXCIpIHtcbiAgICAgICAgICAgICAgICByZXN1bHRzW3BzZXVkb0NsYXNzXSA9IHN0eWxlTWFwO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBGb3IgcHNldWRvLWNsYXNzZXMsIHJldHVybiBvbmx5IHN0eWxlcyB0aGF0IGRpZmZlciBmcm9tIGRlZmF1bHRcbiAgICAgICAgICAgICAgICBjb25zdCBkaWZmU3R5bGVzID0ge307XG4gICAgICAgICAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHBzZXVkb01hcCk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IGtleXNbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChwc2V1ZG9NYXBba2V5XSAhPT0gc3R5bGVNYXBba2V5XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGlmZlN0eWxlc1trZXldID0gcHNldWRvTWFwW2tleV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzdWx0c1twc2V1ZG9DbGFzc10gPSBkaWZmU3R5bGVzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuXG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBzdHlsZSBkZWZpbmVkIGZvciB0aGlzIGVsZW1lbnQgZm9yIG11bHRpcGxlIHBzZXVkby1jbGFzc2VzIGluIGEgc2luZ2xlIHBhc3NcbiAgICAgKlxuICAgICAqIFRoaXMgaXMgbW9yZSBlZmZpY2llbnQgdGhhbiBjYWxsaW5nIGdldERlZmluZWRTdHlsZXMgbXVsdGlwbGUgdGltZXMgYXMgaXQgb25seVxuICAgICAqIGl0ZXJhdGVzIHRocm91Z2ggc3R5bGVzaGVldHMgb25jZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1cbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBwcm9wcyBQcm9wZXJ0aWVzIGZvciB3aGljaCB3ZSBhcmUgbG9va2luZyBmb3IgKGFsbG93cyB1cyB0byBza2lwIGVsZW0gbWF0Y2hpbmcgdW5uZWNlc3NhcmlseSlcbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBwc2V1ZG9DbGFzc2VzIC0gQXJyYXkgb2YgcHNldWRvLWNsYXNzZXMgdG8gcmV0cmlldmUuIFVzZSBcIlwiIGZvciBkZWZhdWx0IChubyBwc2V1ZG8tY2xhc3MpLlxuICAgICAqIEByZXR1cm5zIHtPYmplY3R9IE9iamVjdCBtYXBwaW5nIGVhY2ggcHNldWRvLWNsYXNzIHRvIGl0cyBkZWZpbmVkIHN0eWxlc1xuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0RGVmaW5lZFN0eWxlc011bHRpcGxlKGVsZW06IEhUTUxFbGVtZW50LCBwcm9wczogc3RyaW5nW10gfCBudWxsLCBwc2V1ZG9DbGFzc2VzOiBzdHJpbmdbXSkge1xuICAgICAgICBpZiAoIWVsZW0pIHJldHVybiBudWxsO1xuXG4gICAgICAgIGxldCByZXN1bHRzID0ge307XG5cbiAgICAgICAgLy8gQ3JlYXRlIGNhY2hlIGtleSB0aGF0IGluY2x1ZGVzIHByb3BzIGZpbHRlclxuICAgICAgICAvLyBVc2UgXCJhbGxcIiBmb3IgbnVsbCBwcm9wcywgb3Igc29ydGVkIGNvbW1hLXNlcGFyYXRlZCBsaXN0IGZvciBzcGVjaWZpYyBwcm9wc1xuICAgICAgICBjb25zdCBwcm9wc0tleSA9IHByb3BzID09PSBudWxsID8gXCJhbGxcIiA6IHByb3BzLnNsaWNlKCkuc29ydCgpLmpvaW4oXCIsXCIpO1xuICAgICAgICBcbiAgICAgICAgLy8gQ2hlY2sgY2FjaGUgZmlyc3QgLSBzZWUgaWYgd2UgaGF2ZSBhbGwgcmVxdWVzdGVkIHBzZXVkby1jbGFzc2VzIGNhY2hlZFxuICAgICAgICBsZXQgYWxsQ2FjaGVkU3R5bGVzID0gQ2FjaGVVdGlsLmdldENhY2hlKGVsZW0sIFwiUlBUVXRpbF9EZWZpbmVkU3R5bGVzXCIsIG51bGwpO1xuICAgICAgICBpZiAoIWFsbENhY2hlZFN0eWxlcykge1xuICAgICAgICAgICAgYWxsQ2FjaGVkU3R5bGVzID0ge307XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIC8vIEdldCBvciBjcmVhdGUgdGhlIGNhY2hlIGJ1Y2tldCBmb3IgdGhpcyBwcm9wcyBmaWx0ZXJcbiAgICAgICAgbGV0IGNhY2hlZFN0eWxlcyA9IGFsbENhY2hlZFN0eWxlc1twcm9wc0tleV07XG4gICAgICAgIGxldCBtaXNzaW5nUHNldWRvQ2xhc3NlcyA9IFtdO1xuICAgICAgICBcbiAgICAgICAgaWYgKGNhY2hlZFN0eWxlcykge1xuICAgICAgICAgICAgLy8gQ2hlY2sgd2hpY2ggcHNldWRvLWNsYXNzZXMgYXJlIGFscmVhZHkgY2FjaGVkXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHBzZXVkb0NsYXNzIG9mIHBzZXVkb0NsYXNzZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoY2FjaGVkU3R5bGVzW3BzZXVkb0NsYXNzXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdHNbcHNldWRvQ2xhc3NdID0gY2FjaGVkU3R5bGVzW3BzZXVkb0NsYXNzXTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBtaXNzaW5nUHNldWRvQ2xhc3Nlcy5wdXNoKHBzZXVkb0NsYXNzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIElmIGFsbCBhcmUgY2FjaGVkLCByZXR1cm4gaW1tZWRpYXRlbHlcbiAgICAgICAgICAgIGlmIChtaXNzaW5nUHNldWRvQ2xhc3Nlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNhY2hlZFN0eWxlcyA9IHt9O1xuICAgICAgICAgICAgbWlzc2luZ1BzZXVkb0NsYXNzZXMgPSBwc2V1ZG9DbGFzc2VzO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT25seSBwcm9jZXNzIG1pc3NpbmcgcHNldWRvLWNsYXNzZXMgdXNpbmcgdGhlIGludGVybmFsIGhlbHBlclxuICAgICAgICBpZiAobWlzc2luZ1BzZXVkb0NsYXNzZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgbmV3UmVzdWx0cyA9IENTU1V0aWwuZ2V0RGVmaW5lZFN0eWxlc0ludGVybmFsKGVsZW0sIHByb3BzLCBtaXNzaW5nUHNldWRvQ2xhc3Nlcyk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIE1lcmdlIG5ldyByZXN1bHRzIHdpdGggY2FjaGVkIHJlc3VsdHNcbiAgICAgICAgICAgIGZvciAoY29uc3QgcHNldWRvQ2xhc3Mgb2YgbWlzc2luZ1BzZXVkb0NsYXNzZXMpIHtcbiAgICAgICAgICAgICAgICByZXN1bHRzW3BzZXVkb0NsYXNzXSA9IG5ld1Jlc3VsdHNbcHNldWRvQ2xhc3NdO1xuICAgICAgICAgICAgICAgIGNhY2hlZFN0eWxlc1twc2V1ZG9DbGFzc10gPSBuZXdSZXN1bHRzW3BzZXVkb0NsYXNzXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gVXBkYXRlIGNhY2hlIHdpdGggYWxsIHN0eWxlcyAoZXhpc3RpbmcgKyBuZXcpXG4gICAgICAgICAgICBhbGxDYWNoZWRTdHlsZXNbcHJvcHNLZXldID0gY2FjaGVkU3R5bGVzO1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUlBUVXRpbF9EZWZpbmVkU3R5bGVzXCIsIGFsbENhY2hlZFN0eWxlcyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBzdHlsZSBkZWZpbmVkIGZvciB0aGlzIGVsZW1lbnRcbiAgICAgKlxuICAgICAqIFRoaXMgZGlmZmVycyBmcm9tIHRoZSBjb21wdXRlZCBzdHlsZSBpbiB0aGF0IHRoZSBjb21wdXRlZCBzdHlsZSB3aWxsIHJldHVyblxuICAgICAqIHN0eWxlcyBkZWZpbmVkIGJ5IHRoZSB1c2VyIGFnZW50LiBUaGlzIHdpbGwgb25seSByZXR1cm4gc3R5bGVzIGRlZmluZWQgYnkgdGhlXG4gICAgICogYXBwbGljYXRpb25cbiAgICAgKiBpZiByb3RhdGlvbiB0cmFuc2Zvcm0gaXMgdXNlZCwgdGhlIGNvbXB1dGVkIHN0eWxlIHJldHVybnMgdGhlIHJlc29sdmVkIG1hdHJpeFxuICAgICAqICB3aGlsZSB0aGUgZGVmaW5lZCBzdHlsZSByZXR1cm4gdGhlIHRyYW5zZm9ybSBmdW5jdGlvbihzKVxuICAgICAqIGZvciBleGFtcGxlLCBmb3IgJ3RyYW5zZm9ybTogcm90YXRlKDIuNWRlZyk7JywgdGhlIGNvbXB1dGVkIHN0eWxlIHJldHVybnMgJ21hdHJpeCgtMC4wNDM2MTk0LCAwLjk5OTA0OCwgLTAuOTk5MDQ4LCAtMC4wNDM2MTk0LCAwLCAwKSdcbiAgICAgKiAgYW5kIHRoZSBkZWZpbmVkIHN0eWxlIHJldHVybnMgJ3JvdGF0ZSgyLjVkZWcpJ1xuICAgICAqXG4gICAgICogY2hhbmdlIHRoZSB0eXBlIG9mIHRoZSBwYXJhbWV0ZXIgcHNldWRvQ2xhc3MgZnJvbSBQc2V1ZG9DbGFzcyB0byBzdHJpbmcgdG8gaW5jbHVkZSBib3RoIHBzZXVkbyBjbGFzc2VzIChlLmcuLCA6Zm9jdXMsIDpjaGVja2VkKVxuICAgICAqIGFuZCBwc2V1ZG8gZWxlbWVudHMgKGUuZy4sIDo6YmVmb3JlLCA6OmFmdGVyKS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1cbiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBwcm9wcyBQcm9wZXJ0aWVzIGZvciB3aGljaCB3ZSBhcmUgbG9va2luZyBmb3IgKGFsbG93cyB1cyB0byBza2lwIGVsZW0gbWF0Y2hpbmcgdW5uZWNlc3NhcmlseSlcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3BzZXVkb0NsYXNzXSBJZiBzcGVjaWZpZWQsIHdpbGwgcmV0dXJuIHZhbHVlcyB0aGF0IGFyZSBkaWZmZXJlbnRcbiAgICAgKiB0aGFuIHdoZW4gdGhlIHBzZXVkb0NsYXNzIGRvZXMgbm90IG1hdGNoLlxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0RGVmaW5lZFN0eWxlcyhlbGVtOiBIVE1MRWxlbWVudCwgcHJvcHM6IHN0cmluZ1tdLCBwc2V1ZG9DbGFzcz86IHN0cmluZykge1xuICAgICAgICBpZiAoIWVsZW0pIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIENyZWF0ZSBjYWNoZSBrZXkgdGhhdCBpbmNsdWRlcyBwcm9wcyBmaWx0ZXJcbiAgICAgICAgLy8gVXNlIFwiYWxsXCIgZm9yIG51bGwgcHJvcHMsIG9yIHNvcnRlZCBjb21tYS1zZXBhcmF0ZWQgbGlzdCBmb3Igc3BlY2lmaWMgcHJvcHNcbiAgICAgICAgY29uc3QgcHJvcHNLZXkgPSBwcm9wcyA9PT0gbnVsbCA/IFwiYWxsXCIgOiBwcm9wcy5zbGljZSgpLnNvcnQoKS5qb2luKFwiLFwiKTtcbiAgICAgICAgY29uc3QgcHNldWRvS2V5ID0gcHNldWRvQ2xhc3MgfHwgXCJcIjtcbiAgICAgICAgXG4gICAgICAgIC8vIENoZWNrIGNhY2hlIGZpcnN0IC0gdXNlIHNoYXJlZCBjYWNoZSBzdHJ1Y3R1cmUgd2l0aCBnZXREZWZpbmVkU3R5bGVzTXVsdGlwbGVcbiAgICAgICAgbGV0IGFsbENhY2hlZFN0eWxlcyA9IENhY2hlVXRpbC5nZXRDYWNoZShlbGVtLCBcIlJQVFV0aWxfRGVmaW5lZFN0eWxlc1wiLCBudWxsKTtcbiAgICAgICAgaWYgKCFhbGxDYWNoZWRTdHlsZXMpIHtcbiAgICAgICAgICAgIGFsbENhY2hlZFN0eWxlcyA9IHt9O1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBHZXQgb3IgY3JlYXRlIHRoZSBjYWNoZSBidWNrZXQgZm9yIHRoaXMgcHJvcHMgZmlsdGVyXG4gICAgICAgIGxldCBjYWNoZWRTdHlsZXMgPSBhbGxDYWNoZWRTdHlsZXNbcHJvcHNLZXldO1xuICAgICAgICBpZiAoIWNhY2hlZFN0eWxlcykge1xuICAgICAgICAgICAgY2FjaGVkU3R5bGVzID0ge307XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmIChjYWNoZWRTdHlsZXNbcHNldWRvS2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU3R5bGVzW3BzZXVkb0tleV07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVc2UgdGhlIGludGVybmFsIGhlbHBlciBtZXRob2Qgd2l0aCBhIHNpbmdsZSBwc2V1ZG8tY2xhc3NcbiAgICAgICAgY29uc3QgcmVzdWx0cyA9IENTU1V0aWwuZ2V0RGVmaW5lZFN0eWxlc0ludGVybmFsKGVsZW0sIHByb3BzLCBbcHNldWRvS2V5XSk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc3VsdHNbcHNldWRvS2V5XTtcbiAgICAgICAgXG4gICAgICAgIC8vIENhY2hlIHRoZSByZXN1bHRcbiAgICAgICAgY2FjaGVkU3R5bGVzW3BzZXVkb0tleV0gPSByZXN1bHQ7XG4gICAgICAgIGFsbENhY2hlZFN0eWxlc1twcm9wc0tleV0gPSBjYWNoZWRTdHlsZXM7XG4gICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlJQVFV0aWxfRGVmaW5lZFN0eWxlc1wiLCBhbGxDYWNoZWRTdHlsZXMpO1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSBtZWRpYSBxdWVyeSBkZWZpbmVkIGZvciB0aGUgZG9jdW1lbnRcbiAgICAgKiBHZXQgbWVkaWEgb3JpZW50YXRpb24gdHJhbnNmb3JtcyBmcm9tIHN0eWxlc2hlZXRzIHdpdGggY2FjaGluZ1xuICAgICAqIFJldHVybnMgdHJhbnNmb3JtL3JvdGF0ZSBwcm9wZXJ0aWVzIGZvciBlbGVtZW50cyB3aXRoaW4gbWVkaWEgcXVlcmllc1xuICAgICAqXG4gICAgICogQHBhcmFtIHtEb2N1bWVudH0gZG9jXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRNZWRpYU9yaWVudGF0aW9uVHJhbnNmb3JtKGRvYzogRG9jdW1lbnQpIHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgd2UgYWxyZWFkeSBoYXZlIGNhY2hlZCBtZWRpYSBvcmllbnRhdGlvbiB0cmFuc2Zvcm1zIGZvciB0aGlzIGRvY3VtZW50XG4gICAgICAgIGNvbnN0IGNhY2hlZFRyYW5zZm9ybXMgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUoZG9jLCBcIlJQVFV0aWxfTWVkaWFPcmllbnRhdGlvblRyYW5zZm9ybXNcIiwgbnVsbCk7XG4gICAgICAgIGlmIChjYWNoZWRUcmFuc2Zvcm1zKSB7XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkVHJhbnNmb3JtcztcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBvcmllbnRhdGlvblRyYW5zZm9ybXMgPSB7fVxuXG4gICAgICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCBhbGwgb2YgdGhlIHN0eWxlc2hlZXRzIGFuZCBydWxlc1xuICAgICAgICBmb3IgKGxldCBzc0luZGV4ID0gMDsgc3NJbmRleCA8IGRvYy5zdHlsZVNoZWV0cy5sZW5ndGg7ICsrc3NJbmRleCkge1xuICAgICAgICAgICAgY29uc3Qgc2hlZXQgPSBkb2Muc3R5bGVTaGVldHNbc3NJbmRleF0gYXMgQ1NTU3R5bGVTaGVldDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgaWYgKHNoZWV0ICYmIHNoZWV0LmNzc1J1bGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHJJbmRleCA9IDA7IHJJbmRleCA8IHNoZWV0LmNzc1J1bGVzLmxlbmd0aDsgKytySW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoZWV0UnVsZSA9IHNoZWV0LmNzc1J1bGVzW3JJbmRleF07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoNCAvKiBDU1NSdWxlLk1FRElBX1JVTEUgKi8gPT09IHNoZWV0UnVsZS5NRURJQV9SVUxFKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcnVsZSA9IHNoZWV0UnVsZSBhcyBDU1NNZWRpYVJ1bGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bGUgJiYgcnVsZS5tZWRpYSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZWRpYUxpc3QgPSBydWxlLm1lZGlhO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1lZGlhTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtZWRpYUxpc3QuaXRlbShpKSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZWRpYUtleSA9IG1lZGlhTGlzdC5pdGVtKGkpLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZWxlbV90cmFuc2Zvcm1zID0gb3JpZW50YXRpb25UcmFuc2Zvcm1zW21lZGlhS2V5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZWxlbV90cmFuc2Zvcm1zKSBlbGVtX3RyYW5zZm9ybXMgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzdHlsZVJ1bGVzID0gcnVsZS5jc3NSdWxlcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgc3R5bGVSdWxlcy5sZW5ndGg7ICsraikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgxIC8qIENTU1J1bGUuU1RZTEVfUlVMRSAqLyA9PT0gc3R5bGVSdWxlc1tqXS5TVFlMRV9SVUxFKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0eWxlUnVsZSA9IHN0eWxlUnVsZXNbal0gYXMgQ1NTU3R5bGVSdWxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWxlY3RvciA9IHN0eWxlUnVsZS5zZWxlY3RvclRleHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRyYW5zZm9ybXMgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0eWxlcyA9IHN0eWxlUnVsZS5zdHlsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHMgPSAwOyBzIDwgc3R5bGVzLmxlbmd0aDsgKytzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gc3R5bGVzW3NdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleUxvd2VyID0ga2V5LnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGtleUxvd2VyID09PSBcInRyYW5zZm9ybVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXkgPT09IFwiYWxsXCIgJiYgc3R5bGVzW2tleV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybXMgPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3Jtc1trZXldID0gc3R5bGVzW2tleV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleUxvd2VyID09PSBcInJvdGF0ZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZm9ybXNba2V5XSA9IHN0eWxlc1trZXldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyh0cmFuc2Zvcm1zKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbV90cmFuc2Zvcm1zW3NlbGVjdG9yXSA9IHRyYW5zZm9ybXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoZWxlbV90cmFuc2Zvcm1zKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZW50YXRpb25UcmFuc2Zvcm1zW21lZGlhS2V5XSA9IGVsZW1fdHJhbnNmb3JtcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgIWVyci50b1N0cmluZygpLmluY2x1ZGVzKFwiQ2Fubm90IGFjY2VzcyBydWxlc1wiKSAmJlxuICAgICAgICAgICAgICAgICAgICAhZXJyLnRvU3RyaW5nKCkuaW5jbHVkZXMoXCJTZWN1cml0eUVycm9yOlwiKVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBDYWNoZSB0aGUgbWVkaWEgb3JpZW50YXRpb24gdHJhbnNmb3JtcyBhdCB0aGUgZG9jdW1lbnQgbGV2ZWxcbiAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGRvYywgXCJSUFRVdGlsX01lZGlhT3JpZW50YXRpb25UcmFuc2Zvcm1zXCIsIG9yaWVudGF0aW9uVHJhbnNmb3Jtcyk7XG4gICAgICAgIHJldHVybiBvcmllbnRhdGlvblRyYW5zZm9ybXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogY29udmVydCBnaXZlbiByb3RhdGlvbiB0cmFuc2Zvcm0gZnVuY3Rpb25zIHRvIHRoZSBkZWdyZWUgdHJhbnNmb3JtZWQuXG4gICAgICogSWYgbXVsdGlwbGUgZnVuY3Rpb25zIGFyZSBnaXZlbiwgdGhlbiB0aGUgZnVuY3Rpb25zIGFyZSBhcHBsaWVkIGxpbmVhcmx5IGluIHRoZSBvcmRlci5cbiAgICAgKiAgIHJvdGF0aW9uX3RyYW5zZm9ybSBmdW5jdGlvbiBleGFtcGxlOiAgcm90YXRlKDQ1ZGVnKSwgcm90YXRlKDJ0dXJuKSwgcm90YXRlKDJyYWQpLCByb3RhdGUzZCgxLCAxLCAxLCA0NWRlZyksXG4gICAgICogICAgICAgIHJvdGF0ZSgycmFkKSByb3RhdGUzZCgxLCAxLCAxLCA0NWRlZylcbiAgICAgKiBAcGFyYW0gcm90YXRpb25fdHJhbnNmb3JtXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRSb3RhdGlvbkRlZ3JlZShyb3RhdGlvbl90cmFuc2Zvcm0pIHtcbiAgICAgICAgbGV0IGRlZ3JlZSA9IDA7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBpZiAoIXJvdGF0aW9uX3RyYW5zZm9ybSkgcmV0dXJuIGRlZ3JlZTtcbiAgICAgICAgICAgIC8vIG5vcm1hbGl6ZSB0aGUgcm90YXRpb25fdHJhbnNmb3JtXG4gICAgICAgICAgICByb3RhdGlvbl90cmFuc2Zvcm0gPSByb3RhdGlvbl90cmFuc2Zvcm0ucmVwbGFjZUFsbChcIiwgXCIsIFwiLFwiKTtcbiAgICAgICAgICAgIGNvbnN0IHRyYW5zZm9ybV9mdW5jdGlvbnMgPSByb3RhdGlvbl90cmFuc2Zvcm0uc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0cmFuc2Zvcm1fZnVuY3Rpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdHJhbnNmb3JtX2Z1bmN0aW9uID0gdHJhbnNmb3JtX2Z1bmN0aW9uc1tpXS50cmltKCk7XG4gICAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybV9mdW5jdGlvbiA9PT0gXCJcIikgY29udGludWU7XG4gICAgICAgICAgICAgICAgaWYgKHRyYW5zZm9ybV9mdW5jdGlvbi5zdGFydHNXaXRoKFwicm90YXRlM2RcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZXhhbXBsZTogcm90YXRlM2QoMSwgMSwgMSwgNDVkZWcpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsZWZ0ID0gdHJhbnNmb3JtX2Z1bmN0aW9uLmluZGV4T2YoXCIoXCIpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByaWdodCA9IHRyYW5zZm9ybV9mdW5jdGlvbi5pbmRleE9mKFwiKVwiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxlZnQgIT09IC0xICYmIHJpZ2h0ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1hdHJpeCA9IHRyYW5zZm9ybV9mdW5jdGlvbi5zdWJzdHJpbmcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCArIDEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHRcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hdHJpeCkgdmFsdWVzID0gbWF0cml4LnNwbGl0KFwiLFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZXMgJiYgdmFsdWVzLmxlbmd0aCA9PT0gNCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCByb3RhdGlvbiA9IHZhbHVlc1szXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJvdGF0aW9uKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3RhdGlvbiA9IHJvdGF0aW9uLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocm90YXRpb24uZW5kc1dpdGgoXCJ0dXJuXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBudW0gPSByb3RhdGlvbi5zdWJzdHJpbmcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRpb24ubGVuZ3RoIC0gNFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW0gPSBwYXJzZUZsb2F0KG51bSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNOYU4obnVtKSkgZGVncmVlID0gbnVtICogMzYwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocm90YXRpb24uZW5kc1dpdGgoXCJyYWRcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG51bSA9IHJvdGF0aW9uLnN1YnN0cmluZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3RhdGlvbi5sZW5ndGggLSAzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bSA9IHBhcnNlRmxvYXQobnVtKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc05hTihudW0pKSBkZWdyZWUgPSAobnVtICogMTgwKSAvIE1hdGguUEk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyb3RhdGlvbi5lbmRzV2l0aChcImRlZ1wiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbnVtID0gcm90YXRpb24uc3Vic3RyaW5nKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0aW9uLmxlbmd0aCAtIDNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtID0gcGFyc2VGbG9hdChudW0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTmFOKG51bSkpIGRlZ3JlZSArPSBudW07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtX2Z1bmN0aW9uLnN0YXJ0c1dpdGgoXCJyb3RhdGVcIikgfHxcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtX2Z1bmN0aW9uLnN0YXJ0c1dpdGgoXCJyb3RhdGVaXCIpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGV4YW1wbGU6IHJvdGF0ZSg0NWRlZyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxlZnQgPSB0cmFuc2Zvcm1fZnVuY3Rpb24uaW5kZXhPZihcIihcIik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJpZ2h0ID0gdHJhbnNmb3JtX2Z1bmN0aW9uLmluZGV4T2YoXCIpXCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobGVmdCAhPT0gLTEgJiYgcmlnaHQgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcm90YXRpb24gPSB0cmFuc2Zvcm1fZnVuY3Rpb24uc3Vic3RyaW5nKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgKyAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyb3RhdGlvbikgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICByb3RhdGlvbiA9IHJvdGF0aW9uLnRyaW0oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3RhdGlvbi5lbmRzV2l0aChcInR1cm5cIikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbnVtID0gcm90YXRpb24uc3Vic3RyaW5nKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3RhdGlvbi5sZW5ndGggLSA0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW0gPSBwYXJzZUZsb2F0KG51bSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc05hTihudW0pKSBkZWdyZWUgPSBudW0gKiAzNjA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJvdGF0aW9uLmVuZHNXaXRoKFwicmFkXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG51bSA9IHJvdGF0aW9uLnN1YnN0cmluZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm90YXRpb24ubGVuZ3RoIC0gM1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtID0gcGFyc2VGbG9hdChudW0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNOYU4obnVtKSkgZGVncmVlID0gKG51bSAqIDE4MCkgLyBNYXRoLlBJO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyb3RhdGlvbi5lbmRzV2l0aChcImRlZ1wiKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBudW0gPSByb3RhdGlvbi5zdWJzdHJpbmcoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdGF0aW9uLmxlbmd0aCAtIDNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bSA9IHBhcnNlRmxvYXQobnVtKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTmFOKG51bSkpIGRlZ3JlZSArPSBudW07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRyYW5zZm9ybV9mdW5jdGlvbi5zdGFydHNXaXRoKFwibWF0cml4M2RcIikpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY2FsY3VsYXRlIHRoZSB0aHJlZSBFdWxlciBhbmdsZXNcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGVmdCA9IHRyYW5zZm9ybV9mdW5jdGlvbi5pbmRleE9mKFwiKFwiKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmlnaHQgPSB0cmFuc2Zvcm1fZnVuY3Rpb24uaW5kZXhPZihcIilcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsZWZ0ICE9PSAtMSAmJiByaWdodCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtYXRyaXggPSB0cmFuc2Zvcm1fZnVuY3Rpb24uc3Vic3RyaW5nKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgKyAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlcyA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF0cml4KSB2YWx1ZXMgPSBtYXRyaXguc3BsaXQoXCIsXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlcyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHpfYW5nbGUgPSBNYXRoLmF0YW4yKHZhbHVlc1s0XSwgdmFsdWVzWzVdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWdyZWUgKz0gTWF0aC5yb3VuZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5yb3VuZCgoel9hbmdsZSAqIDE4MCkgLyBNYXRoLlBJKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRyYW5zZm9ybV9mdW5jdGlvbi5zdGFydHNXaXRoKFwibWF0cml4XCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgdGhyZWUgRXVsZXIgYW5nbGVzXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxlZnQgPSB0cmFuc2Zvcm1fZnVuY3Rpb24uaW5kZXhPZihcIihcIik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJpZ2h0ID0gdHJhbnNmb3JtX2Z1bmN0aW9uLmluZGV4T2YoXCIpXCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAobGVmdCAhPT0gLTEgJiYgcmlnaHQgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbWF0cml4ID0gdHJhbnNmb3JtX2Z1bmN0aW9uLnN1YnN0cmluZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0ICsgMSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZXMgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hdHJpeCkgdmFsdWVzID0gbWF0cml4LnNwbGl0KFwiLFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZXMgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB6X2FuZ2xlID0gTWF0aC5hdGFuMih2YWx1ZXNbMV0sIHZhbHVlc1swXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVncmVlICs9IE1hdGgucm91bmQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGgucm91bmQoKHpfYW5nbGUgKiAxODApIC8gTWF0aC5QSSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB3aGlsZSAoZGVncmVlID49IDM2MCkgZGVncmVlIC09IDM2MDtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIkNhbm5vdCByZXRyaWV2ZSByb3RhdGlvbiBkZWdyZWU6IFwiICsgZXJyKTtcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVncmVlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnQgQ1NTIHN0eWxlIHN0cmluZyB2YWx1ZXMgdG8gcGl4ZWxzLlxuICAgICAqXG4gICAgICogQHBhcmFtIHZhbHVlIHN0eWxlIHZhbHVlIGluIHN0cmluZywgc3VjaCBhcyAzcmVtLCAyMzBweCBldGMuXG4gICAgICogQHBhcmFtIHRhcmdldCBlbGVtZW50LlxuICAgICAqIEByZXR1cm4gdmFsdWUgaW4gcGl4ZWxzXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRQaXhlbHNGcm9tU3R5bGUodmFsdWUsIGVsZW0pIHtcbiAgICAgICAgaWYgKCF2YWx1ZSkgcmV0dXJuIDA7XG4gICAgICAgIGNvbnN0IHJlZ2V4ID0gLygtP1tcXGQuXSspKFthLXolXSopLztcbiAgICAgICAgbGV0IHBhcnNlZCA9IHZhbHVlLnRyaW0oKS5tYXRjaChyZWdleCk7XG4gICAgICAgIGlmIChwYXJzZWQgPT09IG51bGwpIHJldHVybiAwO1xuICAgICAgICBpZiAocGFyc2VkWzJdID09PSBcIlwiIHx8IHBhcnNlZFsxXSA9PT0gMClcbiAgICAgICAgICAgIC8vbm8gemVybyB2YWx1ZSB3aXRob3V0IHVuaXQgd2hpY2ggaXMgY29uc2lkZXJlZCBhcyBlcnJvciwgc28gaW1wbGljYWJsZVxuICAgICAgICAgICAgcmV0dXJuIDA7XG5cbiAgICAgICAgY29uc3QgcGl4ZWxzID0gQ1NTVXRpbC5jb252ZXJ0VmFsdWUyUGl4ZWxzKHBhcnNlZFsyXSwgcGFyc2VkWzFdLCBlbGVtKTtcbiAgICAgICAgcmV0dXJuIHBpeGVscyA9PT0gbnVsbCA/IHBpeGVscyA6IHBhcnNlRmxvYXQocGl4ZWxzKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDb252ZXJ0IGFic29sdXRlIENTUyBudW1lcmljYWwgdmFsdWVzIHRvIHBpeGVscy5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB1bml0VmFsdWUgaW4gc3RyaW5nXG4gICAgICogQHBhcmFtIHRhcmdldCBlbGVtZW50LlxuICAgICAqIEByZXR1cm4gdmFsdWUgaW4gcGl4ZWxzXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBjb252ZXJ0VmFsdWUyUGl4ZWxzKHVuaXQsIHVuaXRWYWx1ZSwgZWxlbSkge1xuICAgICAgICBpZiAodW5pdFZhbHVlID09PSAwKSByZXR1cm4gMDtcbiAgICAgICAgaWYgKCF1bml0KSB1bml0ID0gXCJweFwiO1xuICAgICAgICBjb25zdCBzdXBwb3J0ZWRVbml0cyA9IHtcbiAgICAgICAgICAgIC8vIGFic29sdXRlIHVuaXRcbiAgICAgICAgICAgIHB4OiAodmFsdWUpID0+IHZhbHVlLFxuICAgICAgICAgICAgY206ICh2YWx1ZSkgPT4gdmFsdWUgKiAzNy44LFxuICAgICAgICAgICAgbW06ICh2YWx1ZSkgPT4gdmFsdWUgKiAzLjc4LFxuICAgICAgICAgICAgcTogKHZhbHVlKSA9PiB2YWx1ZSAqIDAuOTUsXG4gICAgICAgICAgICBpbjogKHZhbHVlKSA9PiB2YWx1ZSAqIDk2LFxuICAgICAgICAgICAgcGM6ICh2YWx1ZSkgPT4gdmFsdWUgKiAxNixcbiAgICAgICAgICAgIHB0OiAodmFsdWUpID0+IHZhbHVlICogMS4zMyxcblxuICAgICAgICAgICAgLy8gcmVsYXRpdmUgdW5pdFxuICAgICAgICAgICAgcmVtOiAodmFsdWUpID0+XG4gICAgICAgICAgICAgICAgdmFsdWUgKlxuICAgICAgICAgICAgICAgIHBhcnNlRmxvYXQoXG4gICAgICAgICAgICAgICAgICAgIGdldENvbXB1dGVkU3R5bGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XG4gICAgICAgICAgICAgICAgICAgICkuZ2V0UHJvcGVydHlWYWx1ZShcImZvbnQtc2l6ZVwiKVxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICBlbTogKHZhbHVlKSA9PlxuICAgICAgICAgICAgICAgIHZhbHVlICpcbiAgICAgICAgICAgICAgICBwYXJzZUZsb2F0KFxuICAgICAgICAgICAgICAgICAgICBnZXRDb21wdXRlZFN0eWxlKGVsZW0pLmdldFByb3BlcnR5VmFsdWUoXCJmb250LXNpemVcIilcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgdnc6ICh2YWx1ZSkgPT5cbiAgICAgICAgICAgICAgICAodmFsdWUgLyAxMDApICogZWxlbS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LmlubmVyV2lkdGgsXG4gICAgICAgICAgICB2aDogKHZhbHVlKSA9PlxuICAgICAgICAgICAgICAgICh2YWx1ZSAvIDEwMCkgKiBlbGVtLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcuaW5uZXJIZWlnaHQsXG4gICAgICAgICAgICBcIiVcIjogKHZhbHVlKSA9PlxuICAgICAgICAgICAgICAgICh2YWx1ZSAvIDEwMCkgKlxuICAgICAgICAgICAgICAgIHBhcnNlRmxvYXQoXG4gICAgICAgICAgICAgICAgICAgIGdldENvbXB1dGVkU3R5bGUoZWxlbSkuZ2V0UHJvcGVydHlWYWx1ZShcImZvbnQtc2l6ZVwiKVxuICAgICAgICAgICAgICAgICksXG4gICAgICAgIH07XG4gICAgICAgIFxuICAgICAgICBpZiAodW5pdCBpbiBzdXBwb3J0ZWRVbml0cykgcmV0dXJuIHN1cHBvcnRlZFVuaXRzW3VuaXRdKHVuaXRWYWx1ZSk7XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8qXG4gICAgICogUmV0dXJucyBpZiB0aGUgZm9udCBmb3IgdmlzaWJsZSB0ZXh0IG9mIHRoZSBlbGVtZW50IGlzIGRlZmluZWQgYnkgbWF0ZXJpYWwgaWNvbnNcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzTWF0ZXJpYWxJY29uRm9udChlbGVtOiBIVE1MRWxlbWVudCkge1xuICAgICAgICAvLyBUT0RPOiBjaGVjayB0aGUgZXhpc3RlbmNlIG1hdGVyaWFsIGljb25zIHVzaW5nIGZldGNoIGluIG5vZGUgMTgrXG4gICAgICAgIC8vIGZvciBub3cgKG5vZGUgMTYpIGp1c3QgZGVydGVybWluZSBpZiB0aGUgc3R5bGVzaGVldCBmb3IgdGhlICdNYXRlcmlhbCBJY29ucycgZXhpc3RzIHN0YXRpY2FsbHkuIG5vdGUgdGhhdCB0aGUgbG9hZGluZyBvZiB0aGUgZm9udCBzdHlsZXNoZWV0IG9jY3VycyBhdCBydW4gdGltZS5cbiAgICAgICAgLy9saXN0IG9mIGtub3duIG1hdGVyaWFsIGljb25zIGFuZCBzdHlsZXNoZWV0IGxpbmtcbiAgICAgICAgY29uc3Qga25vd25faWNvbnMgPSB7XG4gICAgICAgICAgICBcIk1hdGVyaWFsIEljb25zXCI6XG4gICAgICAgICAgICAgICAgXCJodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2ljb24/ZmFtaWx5PU1hdGVyaWFsK0ljb25zXCIsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGtub3duX2Nzc19jbGFzc2VzID0ge1xuICAgICAgICAgICAgXCJtYXRlcmlhbC1pY29uc1wiOlxuICAgICAgICAgICAgICAgIFwiaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9pY29uP2ZhbWlseT1NYXRlcmlhbCtJY29uc1wiLFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIG1hdGVyaWFsIGljb24gZm9udCBjYW4gYmUgZGVmaW5lZCBlaXRoZXIgYnkgZm9udC1mYW1pbHk6ICdNYXRlcmlhbCBJY29ucycgb3IgYnkgY2xhc3M9XCJtYXRlcmlhbC1pY29uc1wiXG4gICAgICAgIGxldCBzdHlsZXMgPSBDU1NVdGlsLmdldERlZmluZWRTdHlsZXMoZWxlbSwgW1wiZm9udC1mYW1pbHlcIl0pO1xuICAgICAgICBsZXQgZm9udEZhbWlseSA9IHN0eWxlc1tcImZvbnQtZmFtaWx5XCJdO1xuXG4gICAgICAgIGxldCBmb3VuZCA9IGZhbHNlO1xuICAgICAgICAvLyBmb250LWZhbWlseSBzcGVjaWZpZXMgYSBwcmlvcml0aXplZCBsaXN0IG9mIG9uZSBvciBtb3JlIGZvbnQgZmFtaWx5IG5hbWVzXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGZvbnRGYW1pbHkgJiZcbiAgICAgICAgICAgIGZvbnRGYW1pbHkuc3BsaXQoXCIsXCIpWzBdLnJlcGxhY2UoL1snXCJdKy9nLCBcIlwiKS50cmltKCkgaW4ga25vd25faWNvbnNcbiAgICAgICAgKVxuICAgICAgICAgICAgZm91bmQgPSB0cnVlO1xuXG4gICAgICAgIGlmICghZm91bmQpIHtcbiAgICAgICAgICAgIGxldCBsaXN0ID0gZWxlbS5jbGFzc0xpc3Q7XG4gICAgICAgICAgICBmb3IgKGxldCBjc3NfY2xhc3MgaW4ga25vd25fY3NzX2NsYXNzZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAobGlzdC5jb250YWlucyhjc3NfY2xhc3MpKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghZm91bmQpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBsZXQgcGFzc2VkID0gZmFsc2U7XG4gICAgICAgIC8vIGNoZWNrIGlmIHRoZSBzdHlsZXNoZWV0IGZvciB0aGUgJ01hdGVyaWFsIEljb25zJyBleGlzdHMgc3RhdGljYWxseVxuICAgICAgICBsZXQgc2hlZXRzID0gZWxlbS5vd25lckRvY3VtZW50LnN0eWxlU2hlZXRzO1xuICAgICAgICBmb3IgKGxldCBzID0gMDsgcyA8IHNoZWV0cy5sZW5ndGg7IHMrKykge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIHNoZWV0cyAmJlxuICAgICAgICAgICAgICAgIHNoZWV0cy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICAgICAgT2JqZWN0LnZhbHVlcyhrbm93bl9pY29ucykuaW5kZXhPZihzaGVldHNbc10uaHJlZikgPiAtMVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcGFzc2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFzc2VkO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0V2VpZ2h0TnVtYmVyKHN0eWxlVmFsKSB7XG4gICAgICAgIGxldCBtYXAgPSB7XG4gICAgICAgICAgICBsaWdodDogMTAwLFxuICAgICAgICAgICAgYm9sZDogNzAwLFxuICAgICAgICB9O1xuICAgICAgICBsZXQgcmV0VmFsID0gcGFyc2VJbnQoc3R5bGVWYWwpO1xuICAgICAgICBpZiAocmV0VmFsKSByZXR1cm4gcmV0VmFsO1xuICAgICAgICBpZiAoc3R5bGVWYWwgaW4gbWFwKSByZXR1cm4gbWFwW3N0eWxlVmFsXTtcbiAgICAgICAgcmV0dXJuIDQwMDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldEZvbnRJblBpeGVscyhzdHlsZVZhbCwgZWxlbSkge1xuICAgICAgICBsZXQgbWFwID0ge1xuICAgICAgICAgICAgXCJ4eC1zbWFsbFwiOiAxNixcbiAgICAgICAgICAgIFwieC1zbWFsbFwiOiAxMCxcbiAgICAgICAgICAgIHNtYWxsOiAxMyxcbiAgICAgICAgICAgIG1lZGl1bTogMTYsXG4gICAgICAgICAgICBsYXJnZTogMTgsXG4gICAgICAgICAgICBcIngtbGFyZ2VcIjogMjQsXG4gICAgICAgICAgICBcInh4LWxhcmdlXCI6IDMyLFxuICAgICAgICB9O1xuICAgICAgICBsZXQgdmFsdWUgPSBwYXJzZUZsb2F0KHN0eWxlVmFsKTtcbiAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIG1hcFtzdHlsZVZhbF07XG4gICAgICAgIH1cbiAgICAgICAgbGV0IHVuaXRzID0gc3R5bGVWYWwuc3Vic3RyaW5nKChcIlwiICsgdmFsdWUpLmxlbmd0aCk7XG4gICAgICAgIC8qKlxuICAgICAgICBpZiAodW5pdHMgPT09IFwiXCIgfHwgdW5pdHMgPT09IFwicHhcIikgcmV0dXJuIHZhbHVlO1xuICAgICAgICBpZiAodW5pdHMgPT09IFwiZW1cIikgcmV0dXJuIHZhbHVlICogMTY7XG4gICAgICAgIGlmICh1bml0cyA9PT0gXCIlXCIpIHJldHVybiB2YWx1ZSAvIDEwMCAqIDE2O1xuICAgICAgICBpZiAodW5pdHMgPT09IFwicHRcIikgcmV0dXJuIHZhbHVlICogNCAvIDM7XG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKHZhbHVlKTtcbiAgICAqL1xuICAgICAgICByZXR1cm4gQ1NTVXRpbC5jb252ZXJ0VmFsdWUyUGl4ZWxzKHVuaXRzLCB2YWx1ZSwgZWxlbSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRDU1NTdHlsZShlbGVtZW50KSB7XG4gICAgICAgIGxldCBzdHlsZVRleHQgPSBcIlwiO1xuICAgICAgICBpZiAoZWxlbWVudCA9PT0gbnVsbCkgcmV0dXJuIFtdO1xuICAgICAgICBpZiAoZWxlbWVudC5JQk1fQ1NTX1RIQikgcmV0dXJuIGVsZW1lbnQuSUJNX0NTU19USEI7XG4gICAgICAgIGxldCBub2RlTmFtZSA9IGVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKG5vZGVOYW1lID09PSBcInN0eWxlXCIpIHtcbiAgICAgICAgICAgIHN0eWxlVGV4dCA9IGVsZW1lbnQuaW5uZXJUZXh0O1xuICAgICAgICAgICAgaWYgKHN0eWxlVGV4dCA9PT0gdW5kZWZpbmVkIHx8IHN0eWxlVGV4dC50cmltKCkgPT09IFwiXCIpXG4gICAgICAgICAgICAgICAgc3R5bGVUZXh0ID0gZWxlbWVudC50ZXh0Q29udGVudDtcbiAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZShcInN0eWxlXCIpKSB7XG4gICAgICAgICAgICBzdHlsZVRleHQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcInN0eWxlXCIpO1xuICAgICAgICB9IGVsc2UgcmV0dXJuIFtdO1xuICAgICAgICBpZiAoc3R5bGVUZXh0ID09PSBudWxsIHx8IHN0eWxlVGV4dC50cmltKCkubGVuZ3RoID09PSAwKSByZXR1cm4gW107XG4gICAgICAgIC8vcmVtb3ZlIGNvbW1lbnQgYmxvY2tzXG4gICAgICAgIGxldCByZSA9IC8oXFwvXFwqKyg/Oig/Oig/OlteXFwqXSkrKXwoPzpbXFwqXSsoPyFcXC8pKSlbKl0rXFwvKXxcXC9cXC8uKi9nO1xuICAgICAgICBsZXQgc3Vic3QgPSBcIiBcIjtcbiAgICAgICAgc3R5bGVUZXh0ID0gc3R5bGVUZXh0LnJlcGxhY2UocmUsIHN1YnN0KTtcbiAgICAgICAgLy8gRmluZCBhbGwgXCJrZXkgOiB2YWw7XCIgcGFpcnMgd2l0aCB2YXJpb3VzIHdoaXRlc3BhY2UgaW5iZXR3ZWVuXG4gICAgICAgIGxldCByS2V5VmFscyA9IC9cXHMqKFteOlxcc10rKVxccyo6XFxzKihbXjskfV0rKVxccyooO3wkKS9nO1xuICAgICAgICAvLyBGaW5kIGFsbCBcInNlbGVjdG9yIHsgY3Nza2V5dmFscyB9IHdpdGggdmFyaW91cyB3aGl0ZXNwYWNlIGluYmV0d2VlblxuICAgICAgICBsZXQgclNlbGVjdG9ycyA9IC9cXHMqKFtee10qKXsoW159XSopfS9nO1xuICAgICAgICBpZiAoc3R5bGVUZXh0LmluZGV4T2YoXCJ7XCIpID09PSAtMSkge1xuICAgICAgICAgICAgbGV0IGtleVZhbHMgPSB7fTtcbiAgICAgICAgICAgIGxldCBtO1xuICAgICAgICAgICAgd2hpbGUgKChtID0gcktleVZhbHMuZXhlYyhzdHlsZVRleHQpKSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAga2V5VmFsc1ttWzFdXSA9IG1bMl0udHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgcmV0VmFsID0gW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlczoga2V5VmFscyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGVsZW1lbnQuSUJNX0NTU19USEIgPSByZXRWYWw7XG4gICAgICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IHJldFZhbCA9IFtdO1xuICAgICAgICAgICAgbGV0IG07XG4gICAgICAgICAgICBsZXQgbTI7XG4gICAgICAgICAgICB3aGlsZSAoKG0gPSByU2VsZWN0b3JzLmV4ZWMoc3R5bGVUZXh0KSkgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGxldCBrZXlWYWxzID0ge307XG4gICAgICAgICAgICAgICAgbGV0IHNlbEtleSA9IG1bMV07XG4gICAgICAgICAgICAgICAgbGV0IHNlbFZhbCA9IG1bMl07XG5cbiAgICAgICAgICAgICAgICB3aGlsZSAoKG0yID0gcktleVZhbHMuZXhlYyhzZWxWYWwpKSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGtleVZhbHNbbTJbMV1dID0gbTJbMl0udHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldFZhbC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6IHNlbEtleSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWVzOiBrZXlWYWxzLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxlbWVudC5JQk1fQ1NTX1RIQiA9IHJldFZhbDtcbiAgICAgICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBhbiBcImlubGluZVwiIENTUyBkaXNwbGF5IHByb3BlcnR5IHRlbGxzIHRoZSBlbGVtZW50IHRvIGZpdCBpdHNlbGYgb24gdGhlIHNhbWUgbGluZS4gQW4gJ2lubGluZScgZWxlbWVudCdzIHdpZHRoIGFuZCBoZWlnaHQgYXJlIGlnbm9yZWQuXG4gICAgICogc29tZSBlbGVtZW50IGhhcyBkZWZhdWx0IGlubGluZSBwcm9wZXJ0eSwgc3VjaCBhcyA8c3Bhbj4sIDxhPlxuICAgICAqIG1vc3QgZm9ybWF0dGluZyBlbGVtZW50cyBpbmhlcmVudCBpbmxpbmUgcHJvcGVydHksIHN1Y2ggYXMgPGVtPiwgPHN0cm9uZz4sIDxpPiwgPHNtYWxsPlxuICAgICAqIG90aGVyIGlubGluZSBlbGVtZW50czogPGFiYnI+IDxhY3JvbnltPiA8Yj4gPGJkbz4gPGJpZz4gPGJyPiA8Y2l0ZT4gPGNvZGU+IDxkZm4+IDxlbT4gPGk+IDxpbnB1dD4gPGtiZD4gPGxhYmVsPlxuICAgICAqIDxtYXA+IDxvYmplY3Q+IDxvdXRwdXQ+IDxxPiA8c2FtcD4gPHNjcmlwdD4gPHNlbGVjdD4gPHNtYWxsPiA8c3Bhbj4gPHN0cm9uZz4gPHN1Yj4gPHN1cD4gPHRleHRhcmVhPiA8dGltZT4gPHR0PiA8dmFyPlxuICAgICAqIGFuIFwiaW5saW5lLWJsb2NrXCIgZWxlbWVudCBzdGlsbCBwbGFjZSBlbGVtZW50IGluIHRoZSBzYW1lIGxpbmUgd2l0aG91dCBicmVha2luZyB0aGUgbGluZSwgYnV0IHRoZSBlbGVtZW50J3Mgd2lkdGggYW5kIGhlaWdodCBhcmUgYXBwbGllZC5cbiAgICAgKiBpbmxpbmUtYmxvY2sgZWxlbWVudHM6IGltZywgYnV0dG9uLCBzZWxlY3QsIG1ldGVyLCBwcm9ncmVzcywgbWFyZ3VlZSwgYWxzbyBpbiBDaHJvbWU6IHRleHRhcmVhLCBpbnB1dFxuICAgICAqIEEgYmxvY2stbGV2ZWwgZWxlbWVudCBhbHdheXMgc3RhcnRzIG9uIGEgbmV3IGxpbmUsIGFuZCB0aGUgYnJvd3NlcnMgYXV0b21hdGljYWxseSBhZGQgc29tZSBzcGFjZSAoYSBtYXJnaW4pIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIGVsZW1lbnQuXG4gICAgICogYmxvY2stbGV2ZWwgZWxlbWVudHM6IDxhZGRyZXNzPiA8YXJ0aWNsZT4gPGFzaWRlPiA8YmxvY2txdW90ZT4gPGNhbnZhcz4gPGRkPiA8ZGl2PiA8ZGw+IDxkdD4gPGZpZWxkc2V0PiA8ZmlnY2FwdGlvbj4gPGZpZ3VyZT4gPGZvb3Rlcj4gPGZvcm0+XG4gICAgICogPGgxPi08aDY+IDxoZWFkZXI+IDxocj4gPGxpPiA8bWFpbj4gPG5hdj4gPG5vc2NyaXB0PiA8b2w+IDxwPiA8cHJlPiA8c2VjdGlvbj4gPHRhYmxlPiA8dGZvb3Q+IDx1bD4gPHZpZGVvPlxuICAgICAqXG4gICAgICogcmV0dXJuOiBpZiBpdCdzIGlubGluZSBlbGVtZW50IGFuZCB7IGlubGluZTogdHJ1ZSB8IGZhbHNlLCB0ZXh0OiB0cnVlIHwgZmFsc2UsIHZpb2xhdGlvbjogbnVsbCB8IHtub2RlfSB9XG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRJbmxpbmVTdGF0dXMoZWxlbWVudCkge1xuICAgICAgICBpZiAoIWVsZW1lbnQpIHJldHVybiBudWxsO1xuXG4gICAgICAgIGNvbnN0IGVsZW1fc3R5bCA9IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCk7XG4gICAgICAgIGlmICghZWxlbV9zdHlsKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBsZXQgc3RhdHVzID0geyBpbmxpbmU6IGZhbHNlLCB0ZXh0OiBmYWxzZSwgdmlvbGF0aW9uOiBudWxsIH07XG4gICAgICAgIGNvbnN0IHVkaXNwbGF5ID0gZWxlbV9zdHlsLmdldFByb3BlcnR5VmFsdWUoXCJkaXNwbGF5XCIpO1xuICAgICAgICAvLyBpbmxpbmUgZWxlbWVudCBvbmx5XG4gICAgICAgIGlmICh1ZGlzcGxheSAhPT0gXCJpbmxpbmVcIikgcmV0dXJuIHN0YXR1cztcblxuICAgICAgICBzdGF0dXMuaW5saW5lID0gdHJ1ZTtcbiAgICAgICAgY29uc3QgcGFyZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50O1xuICAgICAgICBpZiAoIXBhcmVudCkgcmV0dXJuIHN0YXR1cztcblxuICAgICAgICBjb25zdCBtYXBwZXI6IERPTU1hcHBlciA9IG5ldyBET01NYXBwZXIoKTtcbiAgICAgICAgY29uc3QgYm91bmRzID0gbWFwcGVyLmdldFVuYWRqdXN0ZWRCb3VuZHMoZWxlbWVudCk7XG4gICAgICAgIGNvbnN0IHN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShwYXJlbnQpO1xuICAgICAgICBjb25zdCBkaXNwbGF5ID0gc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShcImRpc3BsYXlcIik7XG4gICAgICAgIC8vIGFuIGlubGluZSBlbGVtZW50IGlzIGluc2lkZSBhIGJsb2NrLiBub3RlIDxib2R5PiBpcyBhIGJsb2NrIGVsZW1lbnQgdG9vXG4gICAgICAgIGlmIChkaXNwbGF5ICE9PSBcImJsb2NrXCIgJiYgZGlzcGxheSAhPT0gXCJpbmxpbmUtYmxvY2tcIikge1xuICAgICAgICAgICAgLy9wYXJlbnQgaXMgaW5saW5lIGVsZW1lbnRcbiAgICAgICAgICAgIGlmICghQ29tbW9uVXRpbC5pc0lubmVyVGV4dE9ubHlFbXB0eShwYXJlbnQpKVxuICAgICAgICAgICAgICAgIHN0YXR1cy50ZXh0ID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiBzdGF0dXM7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogQHJldHVybnMgXCJ5ZXNcIlwiOiBpbmxpbmUgd2l0aCB0ZXh0LCBcIm5vXCI6IGlubGluZSB3aXRob3V0IHRleHQsIFxuICAgICAgICAgKiAgICAgICAgICBcInZpb2xhdGlvblwiOiBub3Qgc3BhY2luZyBlbm91Z2ggdG8gbmVpYm9yaW5nIGlubGluZSB0YXJnZXRcbiAgICAgICAgICogICAgICAgICAgXCJibG9ja1wiOiBibG9jayBlbGVtZW50LCAgXG4gICAgICAgICAqL1xuICAgICAgICBmdW5jdGlvbiBpc0lubGluZVdpdGhUZXh0KG5vZGU6IE5vZGUsIGJlZm9yZTogYm9vbGVhbikgOiBzdHJpbmcgfCBudWxsIHtcbiAgICAgICAgICAgIC8vIG5vdGUgYnJvd3NlcnMgaW5zZXJ0IFRleHQgbm9kZXMgdG8gcmVwcmVzZW50IHdoaXRlc3BhY2VzLlxuICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUubm9kZVZhbHVlICYmIG5vZGUubm9kZVZhbHVlLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJ5ZXNcIjtcbiAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIm5vXCI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG5vZGUubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKSB7XG4gICAgICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlOiA8YnI+IGlzIHN0eWxlZCAnaW5saW5lJyBieSBkZWZhdWx0LCBidXQgY2hhbmdlIHRoZSBsaW5lXG4gICAgICAgICAgICAgICAgaWYgKG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJiclwiKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJibG9ja1wiO1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBjb25zdCBjU3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKG5vZGUgYXMgRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgY29uc3QgY0Rpc3BsYXkgPSBjU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShcImRpc3BsYXlcIik7XG4gICAgICAgICAgICAgICAgaWYgKGNEaXNwbGF5ID09PSBcImlubGluZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChDb21tb25VdGlsLmlzVGFyZ2V0KG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYm91bmRzLndpZHRoIDwgMjQpIHsgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlIGhvcml6b250YWwgc3BhY2luZyBpcyBzdWZmaWNpZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYm5kcyA9IG1hcHBlci5nZXRVbmFkanVzdGVkQm91bmRzKG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoYmVmb3JlICYmIChNYXRoLnJvdW5kKGJvdW5kcy53aWR0aCAvIDIpICsgYm91bmRzLmxlZnQgLSBibmRzLmxlZnQgPCAyNCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICghYmVmb3JlICYmIChNYXRoLnJvdW5kKGJvdW5kcy53aWR0aCAvIDIpICsgYm91bmRzLmxlZnQgLSAoYm5kcy5sZWZ0ICsgYm5kcy53aWR0aCkgPCAyNCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cy52aW9sYXRpb24gPSBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBcInZpb2xhdGlvblwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gXCJub1wiOyAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgfSBcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFDb21tb25VdGlsLmlzSW5uZXJUZXh0T25seUVtcHR5KG5vZGUpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFwieWVzXCI7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcIm5vXCI7XG4gICAgICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBcImJsb2NrXCI7XG4gICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgIHJldHVybiBcImJsb2NrXCI7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhbiBpbmxpbmUgZWxlbWVudCBpcyBpbnNpZGUgYSBibG9jay4gbm90ZSA8Ym9keT4gaXMgYSBibG9jayBlbGVtZW50IHRvb1xuICAgICAgICAvLyBvbmUgb3IgbW9yZSBpbmxpbmUgZWxlbWVudHMgd2l0aCB0ZXh0IGluIHRoZSBzYW1lIGxpbmU6IDx0YXJnZXQ+LCB0ZXh0PHRhcmdldD4sIDx0YXJnZXQ+dGV4dCwgPGlubGluZT4rdGV4dDx0YXJnZXQ+LCA8dGFyZ2V0PjxpbmxpbmU+K3RleHQsIHRleHQ8dGFyZ2V0PjxpbmxpbmU+K1xuICAgICAgICBsZXQgd2Fsa05vZGUgPSBlbGVtZW50Lm5leHRTaWJsaW5nO1xuICAgICAgICB3aGlsZSAod2Fsa05vZGUpIHtcbiAgICAgICAgICAgIGxldCBpbmxpbmVUZXh0ID0gaXNJbmxpbmVXaXRoVGV4dCh3YWxrTm9kZSwgdHJ1ZSk7XG4gICAgICAgICAgICBpZiAoaW5saW5lVGV4dCA9PT0gXCJ5ZXNcIikge1xuICAgICAgICAgICAgICAgIHN0YXR1cy50ZXh0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpbmxpbmVUZXh0ID09PSBcImJsb2NrXCIpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdhbGtOb2RlID0gd2Fsa05vZGUubmV4dFNpYmxpbmc7XG4gICAgICAgIH1cblxuICAgICAgICB3YWxrTm9kZSA9IGVsZW1lbnQucHJldmlvdXNTaWJsaW5nO1xuICAgICAgICB3aGlsZSAod2Fsa05vZGUpIHtcbiAgICAgICAgICAgIGxldCBpbmxpbmVUZXh0ID0gaXNJbmxpbmVXaXRoVGV4dCh3YWxrTm9kZSwgZmFsc2UpO1xuICAgICAgICAgICAgaWYgKGlubGluZVRleHQgPT09IFwieWVzXCIpIHtcbiAgICAgICAgICAgICAgICBzdGF0dXMudGV4dCA9IHRydWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaW5saW5lVGV4dCA9PT0gXCJibG9ja1wiKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB3YWxrTm9kZSA9IHdhbGtOb2RlLnByZXZpb3VzU2libGluZztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RhdHVzO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIGEgdGFyZ2V0IGlzIGVuIGVsZW1lbnQgdGhhdCBhY2NlcHQgYSBwb2ludGVyIGFjdGlvbiAoY2xpY2sgb3IgdG91Y2gpXG4gICAgICogYSB0YXJnZXQgaXMgYSBicm93c2VyIGRlZmF1bHQgaWYgaXQncyBhIG5hdGl2ZSB3aWRnZXQgKG5vIHVzZXIgZGVmaW5lZCByb2xlKSB3aXRob3V0IHVzZXIgc3R5bGVcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzVGFyZ2V0QnJvd3NlckRlZmF1bHQoZWxlbWVudCkge1xuICAgICAgICBpZiAoIWVsZW1lbnQpIHJldHVybiBmYWxzZTtcblxuICAgICAgICAvLyB1c2VyIGRlZmluZWQgd2lkZ2V0XG4gICAgICAgIGNvbnN0IHJvbGVzID0gQXJpYVV0aWwuZ2V0Um9sZXMoZWxlbWVudCwgZmFsc2UpO1xuICAgICAgICBpZiAocm9sZXMgJiYgcm9sZXMubGVuZ3RoID4gMCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIC8vIG5vIHVzZXIgc3R5bGUgdG8gc3BhY2UgY29udHJvbCBzaXplLCBpbmNsdWRpbmcgdXNlIG9mIGZvbnRcbiAgICAgICAgY29uc3Qgc3R5bGVzID0gQ1NTVXRpbC5nZXREZWZpbmVkU3R5bGVzKGVsZW1lbnQsIFtcbiAgICAgICAgICAgIFwibGluZS1oZWlnaHRcIiwgXCJoZWlnaHRcIiwgXCJ3aWR0aFwiLFwibWluLWhlaWdodFwiLCBcIm1pbi13aWR0aFwiLFxuICAgICAgICAgICAgXCJmb250LXNpemVcIixcIm1hcmdpbi10b3BcIixcIm1hcmdpbi1ib3R0b21cIiwgXCJtYXJnaW4tbGVmdFwiLCBcIm1hcmdpbi1yaWdodFwiXG4gICAgICAgIF0pO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICBzdHlsZXNbXCJsaW5lLWhlaWdodFwiXSB8fFxuICAgICAgICAgICAgc3R5bGVzW1wiaGVpZ2h0XCJdIHx8XG4gICAgICAgICAgICBzdHlsZXNbXCJ3aWR0aFwiXSB8fFxuICAgICAgICAgICAgc3R5bGVzW1wibWluLWhlaWdodFwiXSB8fFxuICAgICAgICAgICAgc3R5bGVzW1wibWluLXdpZHRoXCJdIHx8XG4gICAgICAgICAgICBzdHlsZXNbXCJmb250LXNpemVcIl0gfHxcbiAgICAgICAgICAgIHN0eWxlc1tcIm1hcmdpbi10b3BcIl0gfHxcbiAgICAgICAgICAgIHN0eWxlc1tcIm1hcmdpbi1ib3R0b21cIl0gfHxcbiAgICAgICAgICAgIHN0eWxlc1tcIm1hcmdpbi1sZWZ0XCJdIHx8XG4gICAgICAgICAgICBzdHlsZXNbXCJtYXJnaW4tcmlnaHRcIl1cbiAgICAgICAgKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8qXG4gICAgICogc3RyaW5nIGNvbnRhaW5zIENKSyAoY2hpbmVzZSwgamFwYW5lc2VzLCBvciBrb3JlYSlcbiAgICAgKiByZXR1cm46IGJvb2xlYW5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGNvbnRhaW5zQ0tKKHRleHQ6IHN0cmluZykge1xuICAgICAgICBpZiAoIXRleHQpIHJldHVybiBmYWxzZTtcblxuICAgICAgICAvLyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9DSktfVW5pZmllZF9JZGVvZ3JhcGhzICBodHRwczovL2F5YWthLnNobi5oay9oYW5yZWdleC9cbiAgICAgICAgbGV0IHJlZ2V4ID0gLyg/OltcXHU0ZTAwLVxcdTlmZmZcXHUzNDAwLVxcdTRkYmZdKSsvZztcblxuICAgICAgICBjb25zdCByZXBsYWNlZCA9IHRleHQudHJpbSgpLnJlcGxhY2UocmVnZXgsIFwiXCIpO1xuICAgICAgICBpZiAocmVwbGFjZWQubGVuZ3RoID09PSB0ZXh0LnRyaW0oKS5sZW5ndGgpIHJldHVybiBmYWxzZTtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gdGhlIGFuY2VzdG9yIHdpdGggdGhlIGdpdmVuIHN0eWxlIHByb3BlcnRpZXMuXG4gICAgICogU2VhcmNoZXMgdXAgdGhlIERPTSB0cmVlIHRvIGZpbmQgYW4gYW5jZXN0b3IgdGhhdCBoYXMgQUxMIHNwZWNpZmllZCBzdHlsZSBwcm9wZXJ0aWVzXG4gICAgICogd2l0aCB2YWx1ZXMgbWF0Y2hpbmcgdGhlIGNyaXRlcmlhLlxuICAgICAqXG4gICAgICogQHBhcmFtIHtlbGVtZW50fSBlbGVtIC0gVGhlIGVsZW1lbnQgdG8gc3RhcnQgdGhlIG5vZGUgd2FsayBvbiB0byBmaW5kIHBhcmVudCBub2RlXG4gICAgICogQHBhcmFtIHtPYmplY3R9IHN0eWxlUHJvcHMgLSBUaGUgc3R5bGUgcHJvcGVydGllcyBhbmQgdmFsdWVzIG9mIHRoZSBwYXJlbnQgdG8gc2VhcmNoIGZvci5cbiAgICAgKiAgICAgICAgIHN1Y2ggYXMge1wib3ZlcmZsb3dcIjpbJ2F1dG8nLCAnc2Nyb2xsJ10sIFwib3ZlcmZsb3cteFwiOlsnYXV0bycsICdzY3JvbGwnXX1cbiAgICAgKiAgICAgICAgICBvciB7XCJvdmVyZmxvd1wiOlsnKiddLCBcIm92ZXJmbG93LXhcIjpbJyonXX0sIFRoZSAnKicgZm9yIGFueSB2YWx1ZSB0byBjaGVjayB0aGUgZXhpc3RlbmNlIG9mIHRoZSBzdHlsZSBwcm9wLlxuICAgICAqIEBwYXJhbSB7QXJyYXl9IGV4Y2x1ZGVkVmFsdWVzIC0gc3R5bGUgdmFsdWVzIHRoYXQgc2hvdWxkIGJlIGlnbm9yZWQuXG4gICAgICogQHJldHVybiB7RWxlbWVudHxudWxsfSAtIEFuIGFuY2VzdG9yIGVsZW1lbnQgdGhhdCBoYXMgYWxsIHRoZSBzcGVjaWZpZWQgc3R5bGUgcHJvcGVydGllcywgb3IgbnVsbCBpZiBub25lIGZvdW5kXG4gICAgICogQG1lbWJlck9mIENTU1V0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEFuY2VzdG9yV2l0aFN0eWxlcyhlbGVtLCBzdHlsZVByb3BzLCBleGNsdWRlZFZhbHVlcyA9IFtdKSB7XG4gICAgICAgIC8vIENyZWF0ZSBhIGNhY2hlIGtleSB0aGF0IGluY2x1ZGVzIHRoZSBzdHlsZSBwcm9wZXJ0aWVzIGJlaW5nIHNlYXJjaGVkIGZvclxuICAgICAgICBjb25zdCBjYWNoZUtleSA9IFwiQXJpYVV0aWxfQW5jZXN0b3JXaXRoU3R5bGVzX1wiICsgSlNPTi5zdHJpbmdpZnkoc3R5bGVQcm9wcykgKyBcIl9cIiArIEpTT04uc3RyaW5naWZ5KGV4Y2x1ZGVkVmFsdWVzKTtcbiAgICAgICAgXG4gICAgICAgIC8vIENoZWNrIGlmIHdlIGFscmVhZHkgaGF2ZSBhIGNhY2hlZCByZXN1bHQgZm9yIHRoaXMgc3BlY2lmaWMgcXVlcnlcbiAgICAgICAgY29uc3QgY2FjaGVkUmVzdWx0ID0gQ2FjaGVVdGlsLmdldENhY2hlKGVsZW0sIGNhY2hlS2V5LCBudWxsKTtcbiAgICAgICAgaWYgKGNhY2hlZFJlc3VsdCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFJlc3VsdCA9PT0gXCJOT1RfRk9VTkRcIiA/IG51bGwgOiBjYWNoZWRSZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdGFydCB3aXRoIHRoZSBlbGVtZW50IGl0c2VsZiAobm90IGp1c3QgcGFyZW50KSB0byBtYWludGFpbiBiYWNrd2FyZCBjb21wYXRpYmlsaXR5XG4gICAgICAgIGxldCB3YWxrTm9kZSA9IGVsZW07XG4gICAgICAgIHdoaWxlICh3YWxrTm9kZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gU2tpcCBpZiBub3QgYW4gSFRNTEVsZW1lbnQgKGUuZy4sIFNWR0VsZW1lbnQpXG4gICAgICAgICAgICAvLyBVc2Ugbm9kZVR5cGUgY2hlY2sgaW5zdGVhZCBvZiBpbnN0YW5jZW9mIHRvIHdvcmsgYWNyb3NzIGRpZmZlcmVudCBkb2N1bWVudCBjb250ZXh0c1xuICAgICAgICAgICAgaWYgKHdhbGtOb2RlLm5vZGVUeXBlICE9PSAxIHx8IHdhbGtOb2RlLm5hbWVzcGFjZVVSSSA9PT0gXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiKSB7XG4gICAgICAgICAgICAgICAgd2Fsa05vZGUgPSBET01XYWxrZXIucGFyZW50RWxlbWVudCh3YWxrTm9kZSk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGNvbnN0IHN0eWxlcyA9IENTU1V0aWwuZ2V0RGVmaW5lZFN0eWxlcyh3YWxrTm9kZSwgT2JqZWN0LmtleXMoc3R5bGVQcm9wcykpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyBDaGVjayBpZiBBTlkgc3BlY2lmaWVkIHN0eWxlIHByb3BlcnR5IG1hdGNoZXMgdGhlIGNyaXRlcmlhIChPUiBsb2dpYylcbiAgICAgICAgICAgIGZvciAoY29uc3Qgc3R5bGVQcm9wIGluIHN0eWxlUHJvcHMpIHtcbiAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSBzdHlsZXNbc3R5bGVQcm9wXTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBpZiAoIXZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFByb3BlcnR5IG5vdCBkZWZpbmVkIG9uIHRoaXMgZWxlbWVudCwgdHJ5IG5leHQgcHJvcGVydHlcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIFJlbW92ZSAhaW1wb3J0YW50IHN1ZmZpeCBmb3IgY29tcGFyaXNvblxuICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuc3BsaXQoXCIgXCIpWzBdO1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHZhbHVlIHNob3VsZCBiZSBleGNsdWRlZFxuICAgICAgICAgICAgICAgIGlmIChleGNsdWRlZFZhbHVlcy5pbmNsdWRlcyh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHZhbHVlIG1hdGNoZXMgdGhlIGNyaXRlcmlhXG4gICAgICAgICAgICAgICAgY29uc3QgYWNjZXB0ZWRWYWx1ZXMgPSBzdHlsZVByb3BzW3N0eWxlUHJvcF07XG4gICAgICAgICAgICAgICAgaWYgKGFjY2VwdGVkVmFsdWVzLmluY2x1ZGVzKCcqJykpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQW55IHZhbHVlIGlzIGFjY2VwdGFibGUgKGp1c3QgY2hlY2tpbmcgZXhpc3RlbmNlKVxuICAgICAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgY2FjaGVLZXksIHdhbGtOb2RlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdhbGtOb2RlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWNjZXB0ZWRWYWx1ZXMuaW5jbHVkZXModmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFZhbHVlIG1hdGNoZXMgb25lIG9mIHRoZSBhY2NlcHRlZCB2YWx1ZXNcbiAgICAgICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIGNhY2hlS2V5LCB3YWxrTm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB3YWxrTm9kZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIHdhbGtOb2RlID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQod2Fsa05vZGUpO1xuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvLyBObyBtYXRjaGluZyBlbGVtZW50IG9yIGFuY2VzdG9yIGZvdW5kIC0gY2FjaGUgdGhpcyByZXN1bHQgdG8gYXZvaWQgcmUtc2VhcmNoaW5nXG4gICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBjYWNoZUtleSwgXCJOT1RfRk9VTkRcIik7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHJldHVybiBhbiBhcnJheSBbdmFsdWUsIFVuaXRdIGZyb20gYSB2YWx1ZS11bml0IGNvbWJvIHN0cmluZ1xuICAgICAqIEBwYXJhbSB2YWx1ZVVuaXRDb21ibywgc3VjaCBhcyAyMHB4LCAycmVtIFxuICAgICAqIEByZXR1cm5zIFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0VmFsdWVVbml0UGFpcih2YWx1ZVVuaXRDb21ibykge1xuICAgICAgICBpZiAoIXZhbHVlVW5pdENvbWJvKSByZXR1cm4gbnVsbDtcblxuICAgICAgICBpZiAoTnVtYmVyLmlzSW50ZWdlcih2YWx1ZVVuaXRDb21ibykpIHJldHVybiBbXCJweFwiLCB2YWx1ZVVuaXRDb21ib107XG5cbiAgICAgICAgY29uc3QgdmFsdWUgPSBwYXJzZUludCh2YWx1ZVVuaXRDb21ibyk7XG4gICAgICAgIGlmIChpc05hTih2YWx1ZSkpIHJldHVybiBudWxsO1xuXG4gICAgICAgIHZhbHVlVW5pdENvbWJvID0gdmFsdWVVbml0Q29tYm8udHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGxldCBtYXRjaCA9IHZhbHVlVW5pdENvbWJvLnRyaW0oKS5tYXRjaCgvKFthLXpdKykkLyk7XG4gICAgICAgIGxldCB1bml0ID0gJ3B4JztcbiAgICAgICAgaWYgKG1hdGNoKSB1bml0ID0gbWF0Y2hbMV07XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gW3VuaXQsIHZhbHVlXTtcbiAgICB9XG5cbn1cbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIENhY2hlRG9jdW1lbnQgZXh0ZW5kcyBEb2N1bWVudCB7XG4gICAgYWNlQ2FjaGU6IHsgW2tleTogc3RyaW5nXTogYW55IH1cbn1cbmV4cG9ydCBpbnRlcmZhY2UgQ2FjaGVFbGVtZW50IGV4dGVuZHMgRWxlbWVudCB7XG4gICAgYWNlQ2FjaGU6IHsgW2tleTogc3RyaW5nXTogYW55IH1cbn1cblxuZXhwb3J0IGNsYXNzIENhY2hlVXRpbCB7XG4gICAgLyogUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgZ2l2ZW4gZ2xvYmFsIHZhcmlhYmxlXG4gICAgICAgICAqIHdpdGggaXRzIGluaXRpYWwgdmFsdWUgYXMgZ2l2ZW4gKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldENhY2hlKGNhY2hlU3BvdDogRWxlbWVudCB8IERvY3VtZW50IHwgRG9jdW1lbnRGcmFnbWVudCwga2V5TmFtZSwgaW5pdFZhbHVlKSB7XG4gICAgICAgIGlmICghY2FjaGVTcG90KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICBsZXQgY2FjaGVPYmogPSAoY2FjaGVTcG90Lm5vZGVUeXBlID09PSA5IC8qIE5vZGUuRE9DVU1FTlRfTk9ERSAqLyB8fCBjYWNoZVNwb3Qubm9kZVR5cGUgPT09IDExIC8qIE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSAqLykgPyBjYWNoZVNwb3QgYXMgQ2FjaGVEb2N1bWVudCA6IGNhY2hlU3BvdCBhcyBDYWNoZUVsZW1lbnQ7XG4gICAgICAgIGlmIChjYWNoZU9iai5hY2VDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjYWNoZU9iai5hY2VDYWNoZSA9IHt9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNhY2hlT2JqLmFjZUNhY2hlW2tleU5hbWVdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNhY2hlT2JqLmFjZUNhY2hlW2tleU5hbWVdID0gaW5pdFZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYWNoZU9iai5hY2VDYWNoZVtrZXlOYW1lXVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgc2V0Q2FjaGUoY2FjaGVTcG90OiBEb2N1bWVudCB8IEVsZW1lbnQgfCBEb2N1bWVudEZyYWdtZW50IHwgU2hhZG93Um9vdCwgZ2xvYmFsTmFtZSwgdmFsdWUpOiBhbnkge1xuICAgICAgICBpZiAoIWNhY2hlU3BvdCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IGNhY2hlT2JqID0gKGNhY2hlU3BvdC5ub2RlVHlwZSA9PT0gOSAvKiBOb2RlLkRPQ1VNRU5UX05PREUgKi8gfHwgY2FjaGVTcG90Lm5vZGVUeXBlID09PSAxMSAvKiBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUgKi8pID8gY2FjaGVTcG90IGFzIENhY2hlRG9jdW1lbnQgOiBjYWNoZVNwb3QgYXMgQ2FjaGVFbGVtZW50O1xuICAgICAgICBpZiAoY2FjaGVPYmouYWNlQ2FjaGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY2FjaGVPYmouYWNlQ2FjaGUgPSB7fVxuICAgICAgICB9XG4gICAgICAgIGNhY2hlT2JqLmFjZUNhY2hlW2dsb2JhbE5hbWVdID0gdmFsdWU7XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldFNldENhY2hlKGNhY2hlU3BvdDogRWxlbWVudCB8IERvY3VtZW50IHwgRG9jdW1lbnRGcmFnbWVudCwga2V5TmFtZSwgaW5pdEZ1bmM6ICgpID0+IGFueSkge1xuICAgICAgICBpZiAoIWNhY2hlU3BvdCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IGNhY2hlT2JqID0gKGNhY2hlU3BvdC5ub2RlVHlwZSA9PT0gOSAvKiBOb2RlLkRPQ1VNRU5UX05PREUgKi8gfHwgY2FjaGVTcG90Lm5vZGVUeXBlID09PSAxMSAvKiBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUgKi8pID8gY2FjaGVTcG90IGFzIENhY2hlRG9jdW1lbnQgOiBjYWNoZVNwb3QgYXMgQ2FjaGVFbGVtZW50O1xuICAgICAgICBpZiAoY2FjaGVPYmouYWNlQ2FjaGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY2FjaGVPYmouYWNlQ2FjaGUgPSB7fVxuICAgICAgICB9XG4gICAgICAgIGlmIChjYWNoZU9iai5hY2VDYWNoZVtrZXlOYW1lXSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBjYWNoZU9iai5hY2VDYWNoZVtrZXlOYW1lXSA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICAgICAgY2FjaGVPYmouYWNlQ2FjaGVba2V5TmFtZV0gPSBpbml0RnVuYygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYWNoZU9iai5hY2VDYWNoZVtrZXlOYW1lXVxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY2xlYXJDYWNoZXMoY2FjaGVSb290OiBOb2RlKTogbnVtYmVyIHtcbiAgICAgICAgbGV0IG51bU5vZGVzVmlzaXRlZCA9IDA7XG4gICAgICAgIGRlbGV0ZSAoY2FjaGVSb290Lm93bmVyRG9jdW1lbnQgYXMgQ2FjaGVEb2N1bWVudCkuYWNlQ2FjaGU7XG4gICAgICAgIGxldCBudyA9IG5ldyBET01XYWxrZXIoY2FjaGVSb290LCBmYWxzZSwgY2FjaGVSb290LCB0cnVlKTtcbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgKytudW1Ob2Rlc1Zpc2l0ZWQ7XG4gICAgICAgICAgICBkZWxldGUgKG53Lm5vZGUgYXMgQ2FjaGVFbGVtZW50KS5hY2VDYWNoZTtcbiAgICAgICAgICAgIG53Lm5vZGUub3duZXJEb2N1bWVudCAmJiBkZWxldGUgKG53Lm5vZGUub3duZXJEb2N1bWVudCBhcyBDYWNoZURvY3VtZW50KS5hY2VDYWNoZTtcbiAgICAgICAgfSB3aGlsZSAobncubmV4dE5vZGUoKSk7XG4gICAgICAgIHJldHVybiBudW1Ob2Rlc1Zpc2l0ZWQ7XG4gICAgfVxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgQ29weXJpZ2h0OjogMjAyMi0gSUJNLCBJbmNcbiAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBDYWNoZVV0aWwgfSBmcm9tIFwiLi9DYWNoZVV0aWxcIjtcbmltcG9ydCB7IENTU1V0aWwgfSBmcm9tIFwiLi9DU1NVdGlsXCI7XG5cbmV4cG9ydCBjbGFzcyBDbGlwUGF0aFV0aWwge1xuICAgIFxuICAgIHByaXZhdGUgc3RhdGljIFRIUkVTSE9MRCA6IG51bWJlciA9IDU7ICAvLyA1cHhcbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBjaGVja2luZyBpZiB0aGUgbm9kZSB0aGF0IGlzIHZpc3VhbGx5IGhpZGRlbiBieSBjc3MgY2xpcC1wYXRoOlxuICAgICAqXG4gICAgICogTm90ZSAxOiBJZiBlaXRoZXIgY3VycmVudCBub2RlIG9yIGFueSBvZiB0aGUgcGFyZW50IG5vZGVzIGFyZSB2aXN1YWxseSBoaWRkZW4gdGhlbiB0aGlzXG4gICAgICogICAgICAgICAgZnVuY3Rpb24gd2lsbCByZXR1cm4gdHJ1ZSAobm9kZSBpcyBub3QgdmlzdWFsbHkgaGlkZGVuKS5cbiAgICAgKlxuICAgICAqIE5vdGUgMjogbm9kZXMgd2l0aCBDU1MgcHJvcGVydGllcyBjbGlwLXBhdGgsIHRoZSBjb250ZW50IGlzIG5vdCBjb25zaWRlcmVkIGhpZGRlbiB0byBhbiBBVC4gVGV4dCBoaWRkZW4gd2l0aCB0aGVzZSBtZXRob2RzIFxuICAgICAqICAgICAgY2FuIHN0aWxsIGJlIHJlZWRhYmxlIGJ5IHNjcmVlbiByZWFkZXJzLiBcbiAgICAgKiBOb3RlIDM6IGlmIGEgbGluaywgZm9ybSBjb250cm9sLCBvciBvdGhlciBmb2N1c2FibGUgZWxlbWVudCBpcyBnaXZlbiB0aGlzIHN0eWxlLCB0aGUgZWxlbWVudCB3b3VsZCBiZSBmb2N1c2FibGUgYnV0IG5vdCB2aXNpYmxlLCBcbiAgICAgKiAgICAgIGtleWJvYXJkIHVzZXJzIG1pZ2h0IGJlIGNvbmZ1c2VkLiAgICBcbiAgICAgKiBcbiAgICAgKiBAcGFybSB7Tm9kZX0gbm9kZSBUaGUgbm9kZSB3aGljaCBzaG91bGQgYmUgY2hlY2tlZCBpZiBpdCBpcyB2aXN1YWxseSBoaWRkZW4gb3Igbm90LlxuICAgICAqIEByZXR1cm4ge2Jvb2x9IHRydWUgaWYgdGhlIG5vZGUgaXMgdmlzdWFsbHkgaGlkZGVuLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBWaXNVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpc05vZGVWaXN1YWxseUhpZGRlbkJ5Q2xpcFBhdGgobm9kZTogTm9kZSkgOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCFub2RlIHx8IG5vZGUubm9kZVR5cGUgIT09IDEpIHJldHVybiBmYWxzZTtcbiAgICAgICAgXG4gICAgICAgIGxldCBlbGVtID0gbm9kZSBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IGhpZGRlbiA9IENhY2hlVXRpbC5nZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIHVuZGVmaW5lZCk7XG4gICAgICAgIGlmIChoaWRkZW4gIT09IHVuZGVmaW5lZClcbiAgICAgICAgICAgIHJldHVybiBoaWRkZW47XG4gICAgICAgICAgICBcbiAgICAgICAgY29uc3Qgc3R5bGUgPSBDU1NVdGlsLmdldENvbXB1dGVkU3R5bGUoZWxlbSk7XG4gICAgICAgIGNvbnN0IHdpZHRoID0gcGFyc2VJbnQoc3R5bGUud2lkdGgpOyAgLy9hbHdheXMgaW4gcHhcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gcGFyc2VJbnQoc3R5bGUuaGVpZ2h0KTsgLy9hbHdheXMgaW4gcHhcblxuICAgICAgICBsZXQgcGF0aCA9IHN0eWxlWydjbGlwLXBhdGgnXTsgXG4gICAgICAgIGlmICghcGF0aCB8fCBwYXRoLnRyaW0oKSA9PT0gJ25vbmUnIHx8IHBhdGgudHJpbSgpID09PSAnJykgIHtcbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIGZhbHNlKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgcGF0aCA9IHBhdGgudHJpbSgpLnJlcGxhY2UoL1xccysvZywgJyAnKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBcbiAgICAgICAgbGV0IGluZGV4ID0gcGF0aC5pbmRleE9mKFwiaW5zZXQoXCIpO1xuICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7IFxuICAgICAgICAgICAgbGV0IHJvdW5kX2luZGV4ID0gcGF0aC5pbmRleE9mKFwicm91bmRcIik7XG4gICAgICAgICAgICBsZXQgc3RyID0gcGF0aC5zdWJzdHJpbmcocGF0aC5pbmRleE9mKFwiKFwiKSsxLCBwYXRoLmluZGV4T2YoXCIpXCIpKTtcbiAgICAgICAgICAgIGlmIChyb3VuZF9pbmRleCAhPT0gLTEpXG4gICAgICAgICAgICAgICAgc3RyID0gcGF0aC5zdWJzdHJpbmcocGF0aC5pbmRleE9mKFwiKFwiKSsxLCByb3VuZF9pbmRleCk7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGxldCBudW1iZXJzID0gc3RyLnRyaW0oKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICAvLyBXaGVuIG9uZSB2YWx1ZSBpcyBzcGVjaWZpZWQsIGl0IGFwcGxpZXMgdGhlIHNhbWUgaW5zZXQgdG8gYWxsIGZvdXIgc2lkZXNcbiAgICAgICAgICAgIGlmIChudW1iZXJzLmxlbmd0aCA9PT0gMSkgIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXQgPSBDbGlwUGF0aFV0aWwuaXNDbGlwcGVkQnlJbnNldChlbGVtLCBudW1iZXJzWzBdLCBudW1iZXJzWzBdLCBudW1iZXJzWzBdLCBudW1iZXJzWzBdKTtcbiAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCByZXQpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFdoZW4gdHdvIHZhbHVlcyBhcmUgc3BlY2lmaWVkLCB0aGUgZmlyc3QgdmFsdWUgYXBwbGllcyB0byB0aGUgdG9wIGFuZCBib3R0b20sIHRoZSBzZWNvbmQgdG8gdGhlIGxlZnQgYW5kIHJpZ2h0LlxuICAgICAgICAgICAgaWYgKG51bWJlcnMubGVuZ3RoID09PSAyKSB7IFxuICAgICAgICAgICAgICAgIGNvbnN0IHJldCA9IENsaXBQYXRoVXRpbC5pc0NsaXBwZWRCeUluc2V0KGVsZW0sIG51bWJlcnNbMF0sIG51bWJlcnNbMV0sIG51bWJlcnNbMF0sIG51bWJlcnNbMV0pO1xuICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIHJldCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldDsgICAgICAgICBcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gV2hlbiB0aHJlZSB2YWx1ZXMgYXJlIHNwZWNpZmllZCwgdGhlIGZpcnN0IGFwcGxpZXMgdG8gdGhlIHRvcCwgdGhlIHNlY29uZCB0byB0aGUgcmlnaHQgYW5kIGxlZnQsIHRoZSB0aGlyZCB0byB0aGUgYm90dG9tLlxuICAgICAgICAgICAgaWYgKG51bWJlcnMubGVuZ3RoID09PSAzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmV0ID0gQ2xpcFBhdGhVdGlsLmlzQ2xpcHBlZEJ5SW5zZXQoZWxlbSwgbnVtYmVyc1swXSwgbnVtYmVyc1sxXSwgbnVtYmVyc1sxXSwgbnVtYmVyc1syXSk7IFxuICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIHJldCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldDsgXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFdoZW4gZm91ciB2YWx1ZXMgYXJlIHNwZWNpZmllZCwgdGhlIHZhbHVlcyBhcHBseSB0byB0aGUgdG9wLCByaWdodCwgYm90dG9tLCBhbmQgbGVmdCBpbiB0aGF0IG9yZGVyIChjbG9ja3dpc2UpLlxuICAgICAgICAgICAgaWYgKG51bWJlcnMubGVuZ3RoID09PSA0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmV0ID0gQ2xpcFBhdGhVdGlsLmlzQ2xpcHBlZEJ5SW5zZXQoZWxlbSwgbnVtYmVyc1swXSwgbnVtYmVyc1sxXSwgbnVtYmVyc1syXSwgbnVtYmVyc1szXSk7IFxuICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIHJldCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgICAgICAgIH0gICAgIFxuXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGluZGV4ID0gcGF0aC5pbmRleE9mKFwicmVjdChcIik7XG4gICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgIGxldCByb3VuZF9pbmRleCA9IHBhdGguaW5kZXhPZihcInJvdW5kXCIpO1xuICAgICAgICAgICAgbGV0IHN0ciA9IHBhdGguc3Vic3RyaW5nKHBhdGguaW5kZXhPZihcIihcIikrMSwgcGF0aC5pbmRleE9mKFwiKVwiKSk7XG4gICAgICAgICAgICBpZiAocm91bmRfaW5kZXggIT09IC0xKVxuICAgICAgICAgICAgICAgIHN0ciA9IHBhdGguc3Vic3RyaW5nKHBhdGguaW5kZXhPZihcIihcIikrMSwgcm91bmRfaW5kZXgpO1xuXG4gICAgICAgICAgICBsZXQgbnVtYmVycyA9IHN0ci50cmltKCkuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAqIFRoZSBmaXJzdCAodG9wKSBhbmQgdGhpcmQgKGJvdHRvbSkgdmFsdWVzIGFyZSBkaXN0YW5jZXMgZnJvbSB0aGUgdG9wIGVkZ2Ugb2YgdGhlIGNvbnRhaW5pbmcgYmxvY2ssIFxuICAgICAgICAgICAgICogYW5kIHRoZSBzZWNvbmQgKHJpZ2h0KSBhbmQgZm91cnRoIChsZWZ0KSB2YWx1ZXMgYXJlIGRpc3RhbmNlcyBmcm9tIHRoZSBsZWZ0IGVkZ2Ugb2YgdGhlIGNvbnRhaW5pbmcgYmxvY2suIFxuICAgICAgICAgICAgICogVGhlIHNlY29uZCAocmlnaHQpIGFuZCB0aGlyZCAoYm90dG9tKSB2YWx1ZXMgYXJlIGNsYW1wZWQgYnkgdGhlIGZvdXJ0aCAobGVmdCkgYW5kIGZpcnN0ICh0b3ApIHZhbHVlcywgcmVzcGVjdGl2ZWx5LCBcbiAgICAgICAgICAgICAqXG4gICAgICAgICAgICAgKiBJZiBhdXRvIGlzIHVzZWQgZm9yIHRoZSBmaXJzdCAodG9wKSBvciBmb3VydGggKGxlZnQpIHZhbHVlLCB0aGUgdmFsdWUgb2YgYXV0byBpcyAwLCBcbiAgICAgICAgICAgICAqIGFuZCBpZiB1c2VkIGZvciB0aGUgc2Vjb25kIChyaWdodCkgb3IgdGhpcmQgKGJvdHRvbSkgdmFsdWUsIHRoZSB2YWx1ZSBvZiBhdXRvIGlzIDEwMCUuXG4gICAgICAgICAgICAqL1xuICAgICAgICAgICAgaWYgKG51bWJlcnNbMF09PT0nYXV0bycpIG51bWJlcnNbMF0gPSAnMHB4JztcbiAgICAgICAgICAgIGlmIChudW1iZXJzWzNdPT09J2F1dG8nKSBudW1iZXJzWzNdID0gJzBweCc7XG4gICAgICAgICAgICBpZiAobnVtYmVyc1sxXT09PSdhdXRvJykgbnVtYmVyc1sxXSA9ICcxMDAlJztcbiAgICAgICAgICAgIGlmIChudW1iZXJzWzJdPT09J2F1dG8nKSBudW1iZXJzWzJdID0gJzEwMCUnO1xuXG4gICAgICAgICAgICAvLyB0byBwcmV2ZW50IHRoZSBib3R0b20gZWRnZSBmcm9tIGNyb3NzaW5nIG92ZXIgdGhlIHRvcCBlZGdlIGFuZCByaWdodCBlZGdlIGZyb20gY3Jvc3Npbmcgb3ZlciB0aGUgbGVmdCBlZGdlLiBcbiAgICAgICAgICAgIC8vIGZvciBleGFtcGxlLCByZWN0KDEwcHggMCAwIDIwcHgpIGlzIGNsYW1wZWQgdG8gcmVjdCgxMHB4IDIwcHggMTBweCAyMHB4KVxuICAgICAgICAgICAgbnVtYmVyc1syXSA9IE1hdGgubWF4KG51bWJlcnNbMF0sIG51bWJlcnNbMl0pO1xuICAgICAgICAgICAgbnVtYmVyc1sxXSA9IE1hdGgubWF4KG51bWJlcnNbMV0sIG51bWJlcnNbM10pXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGxldCB0b3AgPSBwYXJzZUludChudW1iZXJzWzBdKTtcbiAgICAgICAgICAgIGlmIChpc05hTih0b3ApKSB7XG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG51bWJlcnNbMF0uZW5kc1dpdGgoXCIlXCIpKVxuICAgICAgICAgICAgICAgIHRvcCA9IHRvcCAqIGhlaWdodC8xMDA7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgcGFpciA9IENTU1V0aWwuZ2V0VmFsdWVVbml0UGFpcih0b3ApO1xuICAgICAgICAgICAgICAgIGlmICghcGFpcikge1xuICAgICAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdG9wID0gQ1NTVXRpbC5jb252ZXJ0VmFsdWUyUGl4ZWxzKHBhaXJbMF0sIHBhaXJbMV0sIGVsZW0pO1xuICAgICAgICAgICAgfSBcbiAgICAgICAgICAgIGlmICh0b3AgPj0gaGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgbGV0IGxlZnQgPSBwYXJzZUludChudW1iZXJzWzNdKTtcbiAgICAgICAgICAgIGlmIChpc05hTihsZWZ0KSkge1xuICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChudW1iZXJzWzNdLmVuZHNXaXRoKFwiJVwiKSlcbiAgICAgICAgICAgICAgICBsZWZ0ID0gbGVmdCAqIHdpZHRoLzEwMDtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBwYWlyID0gQ1NTVXRpbC5nZXRWYWx1ZVVuaXRQYWlyKGxlZnQpO1xuICAgICAgICAgICAgICAgIGlmICghcGFpcikge1xuICAgICAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGVmdCA9IENTU1V0aWwuY29udmVydFZhbHVlMlBpeGVscyhwYWlyWzBdLCBwYWlyWzFdLCBlbGVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChsZWZ0ID49IHdpZHRoKSB7XG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IHJpZ2h0ID0gcGFyc2VJbnQobnVtYmVyc1sxXSk7XG4gICAgICAgICAgICBpZiAoaXNOYU4ocmlnaHQpKSB7XG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG51bWJlcnNbMV0uZW5kc1dpdGgoXCIlXCIpKVxuICAgICAgICAgICAgICAgIHJpZ2h0ID0gcmlnaHQgKiB3aWR0aC8xMDA7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgcGFpciA9IENTU1V0aWwuZ2V0VmFsdWVVbml0UGFpcihyaWdodCk7XG4gICAgICAgICAgICAgICAgaWYgKCFwYWlyKSB7XG4gICAgICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByaWdodCA9IENTU1V0aWwuY29udmVydFZhbHVlMlBpeGVscyhwYWlyWzBdLCBwYWlyWzFdLCBlbGVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgbGV0IGJvdHRvbSA9IHBhcnNlSW50KG51bWJlcnNbMl0pO1xuICAgICAgICAgICAgaWYgKGlzTmFOKGJvdHRvbSkpIHtcbiAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobnVtYmVyc1syXS5lbmRzV2l0aChcIiVcIikpXG4gICAgICAgICAgICAgICAgYm90dG9tID0gYm90dG9tICogaGVpZ2h0LzEwMDtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBwYWlyID0gQ1NTVXRpbC5nZXRWYWx1ZVVuaXRQYWlyKGJvdHRvbSk7XG4gICAgICAgICAgICAgICAgaWYgKCFwYWlyKSB7XG4gICAgICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBib3R0b20gPSBDU1NVdGlsLmNvbnZlcnRWYWx1ZTJQaXhlbHMocGFpclswXSwgcGFpclsxXSwgZWxlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmICgoYm90dG9tIC0gdG9wKSA8PSBDbGlwUGF0aFV0aWwuVEhSRVNIT0xEICB8fCAocmlnaHQgLSBsZWZ0KSA8PSBDbGlwUGF0aFV0aWwuVEhSRVNIT0xEKSB7XG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIGZhbHNlKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTsgICAgICAgICAgICAgICAgXG4gICAgICAgIH1cblxuICAgICAgICBpbmRleCA9IHBhdGguaW5kZXhPZihcInh5d2goXCIpO1xuICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICBsZXQgcm91bmRfaW5kZXggPSBwYXRoLmluZGV4T2YoXCJyb3VuZFwiKTtcbiAgICAgICAgICAgIGxldCBzdHIgPSBwYXRoLnN1YnN0cmluZyhwYXRoLmluZGV4T2YoXCIoXCIpKzEsIHBhdGguaW5kZXhPZihcIilcIikpO1xuICAgICAgICAgICAgaWYgKHJvdW5kX2luZGV4ICE9PSAtMSlcbiAgICAgICAgICAgICAgICBzdHIgPSBwYXRoLnN1YnN0cmluZyhwYXRoLmluZGV4T2YoXCIoXCIpKzEsIHJvdW5kX2luZGV4KTtcblxuICAgICAgICAgICAgbGV0IG51bWJlcnMgPSBzdHIudHJpbSgpLnNwbGl0KFwiIFwiKTtcblxuICAgICAgICAgICAgbGV0IHggPSBwYXJzZUludChudW1iZXJzWzBdKTtcbiAgICAgICAgICAgIGlmIChpc05hTih4KSkge1xuICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChudW1iZXJzWzBdLmVuZHNXaXRoKFwiJVwiKSlcbiAgICAgICAgICAgICAgICB4ID0geCAqIHdpZHRoLzEwMDtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBwYWlyID0gQ1NTVXRpbC5nZXRWYWx1ZVVuaXRQYWlyKHRvcCk7XG4gICAgICAgICAgICAgICAgaWYgKCFwYWlyKSB7XG4gICAgICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB4ID0gQ1NTVXRpbC5jb252ZXJ0VmFsdWUyUGl4ZWxzKHBhaXJbMF0sIHBhaXJbMV0sIGVsZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHggPj0gd2lkdGgpIHtcbiAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBsZXQgeSA9IHBhcnNlSW50KG51bWJlcnNbMV0pO1xuICAgICAgICAgICAgaWYgKGlzTmFOKHkpKSB7XG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYgKG51bWJlcnNbMV0uZW5kc1dpdGgoXCIlXCIpKVxuICAgICAgICAgICAgICAgIHkgPSB5ICogaGVpZ2h0LzEwMDtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBwYWlyID0gQ1NTVXRpbC5nZXRWYWx1ZVVuaXRQYWlyKHkpO1xuICAgICAgICAgICAgICAgIGlmICghcGFpcikge1xuICAgICAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc2Nyb2xsWSA9IENTU1V0aWwuY29udmVydFZhbHVlMlBpeGVscyhwYWlyWzBdLCBwYWlyWzFdLCBlbGVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh5ID49IGhlaWdodCkge1xuICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCB3ID0gcGFyc2VJbnQobnVtYmVyc1syXSk7XG4gICAgICAgICAgICBpZiAoaXNOYU4odykpIHtcbiAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobnVtYmVyc1syXS5lbmRzV2l0aChcIiVcIikpXG4gICAgICAgICAgICAgICAgdyA9IHcgKiB3aWR0aC8xMDA7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgcGFpciA9IENTU1V0aWwuZ2V0VmFsdWVVbml0UGFpcih3KTtcbiAgICAgICAgICAgICAgICBpZiAoIXBhaXIpIHtcbiAgICAgICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHcgPSBDU1NVdGlsLmNvbnZlcnRWYWx1ZTJQaXhlbHMocGFpclswXSwgcGFpclsxXSwgZWxlbSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodyA8PSBDbGlwUGF0aFV0aWwuVEhSRVNIT0xEKSB7XG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGxldCBoID0gcGFyc2VJbnQobnVtYmVyc1szXSk7XG4gICAgICAgICAgICBpZiAoaXNOYU4oaCkpIHtcbiAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobnVtYmVyc1szXS5lbmRzV2l0aChcIiVcIikpXG4gICAgICAgICAgICAgICAgaCA9IGggKiBoZWlnaHQvMTAwO1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHBhaXIgPSBDU1NVdGlsLmdldFZhbHVlVW5pdFBhaXIoaCk7XG4gICAgICAgICAgICAgICAgaWYgKCFwYWlyKSB7XG4gICAgICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBoID0gQ1NTVXRpbC5jb252ZXJ0VmFsdWUyUGl4ZWxzKHBhaXJbMF0sIHBhaXJbMV0sIGVsZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAoaCA8PSBDbGlwUGF0aFV0aWwuVEhSRVNIT0xEKSB7XG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCBmYWxzZSk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7ICAgICAgICAgICAgICAgIFxuICAgICAgICB9XG5cbiAgICAgICAgaW5kZXggPSBwYXRoLmluZGV4T2YoXCJjaXJjbGUoXCIpO1xuICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICBsZXQgc3RyID0gcGF0aC5zdWJzdHJpbmcocGF0aC5pbmRleE9mKFwiKFwiKSsxLCBwYXRoLmluZGV4T2YoXCIpXCIpKTtcbiAgICAgICAgICAgIGxldCBudW1iZXJzID0gc3RyLnRyaW0oKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGxldCByYWRpdXMgPSBwYXJzZUludChudW1iZXJzWzBdKTtcbiAgICAgICAgICAgIGlmIChpc05hTihyYWRpdXMpKSB7XG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG51bWJlcnNbMF0uZW5kc1dpdGgoXCIlXCIpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNob3J0ID0gd2lkdGggPiBoZWlnaHQgPyBoZWlnaHQgOiB3aWR0aDtcbiAgICAgICAgICAgICAgICByYWRpdXMgPSByYWRpdXMgKiBzaG9ydC8xMDA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhaXIgPSBDU1NVdGlsLmdldFZhbHVlVW5pdFBhaXIocmFkaXVzKTtcbiAgICAgICAgICAgICAgICBpZiAoIXBhaXIpIHtcbiAgICAgICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJhZGl1cyA9IENTU1V0aWwuY29udmVydFZhbHVlMlBpeGVscyhwYWlyWzBdLCBwYWlyWzFdLCBlbGVtKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHJhZGl1cyA8PSBDbGlwUGF0aFV0aWwuVEhSRVNIT0xEKSB7XG4gICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIGZhbHNlKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTsgIFxuICAgICAgICB9ICAgIFxuICAgICAgICBcbiAgICAgICAgaW5kZXggPSBwYXRoLmluZGV4T2YoXCJlbGxpcHNlKFwiKTtcbiAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgbGV0IHN0ciA9IHBhdGguc3Vic3RyaW5nKHBhdGguaW5kZXhPZihcIihcIikrMSwgcGF0aC5pbmRleE9mKFwiKVwiKSk7XG4gICAgICAgICAgICBsZXQgbnVtYmVycyA9IHN0ci50cmltKCkuc3BsaXQoXCIgXCIpO1xuXG4gICAgICAgICAgICAvLyBlbGxpcHNlKGNsb3Nlc3Qtc2lkZSBmYXJ0aGVzdC1zaWRlIGF0IDMwJSA0MCUpO1xuICAgICAgICAgICAgaWYgKG51bWJlcnMubGVuZ3RoID4gMyAmJiBudW1iZXJzWzBdID09PSAnY2xvc2VzdC1zaWRlJyAmJiBudW1iZXJzWzFdID09PSAnZmFydGhlc3Qtc2lkZScgJiYgbnVtYmVyc1syXSA9PT0gJ2F0Jykge1xuICAgICAgICAgICAgICAgIGxldCByYWRpdXMgPSBwYXJzZUludChudW1iZXJzWzNdKTtcbiAgICAgICAgICAgICAgICBpZiAobnVtYmVycy5sZW5ndGggPT09IDQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG51bWJlcnNbM10uZW5kc1dpdGgoXCIlXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSB3aWR0aCA+IGhlaWdodCA/IGhlaWdodCA6IHdpZHRoO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmFkaXVzID0gcmFkaXVzICogdmFsdWUvMTAwO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFpciA9IENTU1V0aWwuZ2V0VmFsdWVVbml0UGFpcihyYWRpdXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYWlyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJhZGl1cyA9IENTU1V0aWwuY29udmVydFZhbHVlMlBpeGVscyhwYWlyWzBdLCBwYWlyWzFdLCBlbGVtKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAocmFkaXVzIDw9IENsaXBQYXRoVXRpbC5USFJFU0hPTEQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobnVtYmVycy5sZW5ndGggPT09IDUpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaT0zOyBpIDwgbnVtYmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJhZGl1cyA9IHBhcnNlSW50KG51bWJlcnNbaV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bWJlcnNbaV0uZW5kc1dpdGgoXCIlXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gKGkgPT09IDMpID8gd2lkdGggOiBoZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFkaXVzID0gcmFkaXVzICogdmFsdWUvMTAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYWlyID0gQ1NTVXRpbC5nZXRWYWx1ZVVuaXRQYWlyKHJhZGl1cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYWlyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWRpdXMgPSBDU1NVdGlsLmNvbnZlcnRWYWx1ZTJQaXhlbHMocGFpclswXSwgcGFpclsxXSwgZWxlbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmFkaXVzIDw9IENsaXBQYXRoVXRpbC5USFJFU0hPTEQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB9ICAgICBcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBlbGxpcHNlKDQwJSA1MCUgYXQgbGVmdCk7XG4gICAgICAgICAgICBsZXQgYXRfaW5kZXggPSBwYXRoLmluZGV4T2YoXCJhdFwiKTtcbiAgICAgICAgICAgIHN0ciA9IHBhdGguc3Vic3RyaW5nKHBhdGguaW5kZXhPZihcIihcIikrMSwgcGF0aC5pbmRleE9mKFwiKVwiKSk7XG4gICAgICAgICAgICBpZiAoYXRfaW5kZXggIT09IC0xKVxuICAgICAgICAgICAgICAgIHN0ciA9IHBhdGguc3Vic3RyaW5nKHBhdGguaW5kZXhPZihcIihcIikrMSwgYXRfaW5kZXgpO1xuXG4gICAgICAgICAgICBudW1iZXJzID0gc3RyLnRyaW0oKS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICBpZiAobnVtYmVycy5sZW5ndGggIT09IDIpIHtcbiAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBudW1iZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJhZGl1cyA9IHBhcnNlSW50KG51bWJlcnNbaV0pO1xuICAgICAgICAgICAgICAgIGlmIChudW1iZXJzW2ldLmVuZHNXaXRoKFwiJVwiKSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSAoaSA9PT0gMCkgPyB3aWR0aCA6IGhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgcmFkaXVzID0gcmFkaXVzICogdmFsdWUvMTAwO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhaXIgPSBDU1NVdGlsLmdldFZhbHVlVW5pdFBhaXIocmFkaXVzKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFwYWlyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmFkaXVzID0gQ1NTVXRpbC5jb252ZXJ0VmFsdWUyUGl4ZWxzKHBhaXJbMF0sIHBhaXJbMV0sIGVsZW0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocmFkaXVzIDw9IENsaXBQYXRoVXRpbC5USFJFU0hPTEQpIHtcbiAgICAgICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfSAgICAgICAgICAgIFxuICAgICAgICAgICBcbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOX0NMSVBQQVRIXCIsIGZhbHNlKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGluZGV4ID0gcGF0aC5pbmRleE9mKFwicG9seWdvbihcIik7XG4gICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgIGxldCBzdHIgPSBwYXRoLnN1YnN0cmluZyhwYXRoLmluZGV4T2YoXCIoXCIpKzEsIHBhdGguaW5kZXhPZihcIilcIikpO1xuICAgICAgICAgICAgbGV0IG51bWJlcnMgPSBzdHIudHJpbSgpLnNwbGl0KFwiLFwiKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gcG9seWdvbihub256ZXJvfGV2ZW5vZGQsIDAlIDAlLCA1MCUgNTAlLCAwJSAxMDAlKVxuICAgICAgICAgICAgaWYgKG51bWJlcnNbMF0gPT09ICdub256ZXJvJyB8fCBudW1iZXJzWzBdID09PSAnZXZlbm9kZCcpXG4gICAgICAgICAgICAgICAgbnVtYmVycy5zaGlmdCgpO1xuXG4gICAgICAgICAgICBsZXQgeSA9IDA7XG4gICAgICAgICAgICBsZXQgeCA9IDA7XG4gICAgICAgICAgICBsZXQgY2hhbmdlZF94ID0gZmFsc2U7XG4gICAgICAgICAgICBsZXQgY2hhbmdlZF95ID0gZmFsc2U7XG4gICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBudW1iZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNvb3JkaW5hdGVzID0gbnVtYmVyc1tpXS50cmltKCkuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgICAgIGlmIChjb29yZGluYXRlcy5sZW5ndGggIT0gMiApIHtcbiAgICAgICAgICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IGNvb3JkaW5hdGVfeHkgPSBbMCwgMF07XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9MDsgaSA8IDI7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSBwYXJzZUludChjb29yZGluYXRlc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpc05hTih2YWx1ZSkpIHJldHVybiBmYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoY29vcmRpbmF0ZXNbaV0uZW5kc1dpdGgoXCIlXCIpKVxuICAgICAgICAgICAgICAgICAgICAgICAgY29vcmRpbmF0ZV94eVtpXSA9IChpID09PSAwKSA/IHZhbHVlICogd2lkdGgvMTAwIDogdmFsdWUgKiBoZWlnaHQvMTAwO1xuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhaXIgPSBDU1NVdGlsLmdldFZhbHVlVW5pdFBhaXIoY29vcmRpbmF0ZXNbaV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYWlyKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb29yZGluYXRlX3h5W2ldID0gQ1NTVXRpbC5jb252ZXJ0VmFsdWUyUGl4ZWxzKHBhaXJbMF0sIHBhaXJbMV0sIGVsZW0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChpID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHggPSBjb29yZGluYXRlX3h5WzBdO1xuICAgICAgICAgICAgICAgICAgICB5ID0gY29vcmRpbmF0ZV94eVsxXTtcbiAgICAgICAgICAgICAgICB9IFxuXG4gICAgICAgICAgICAgICAgaWYgKE1hdGguYWJzKGNvb3JkaW5hdGVfeHlbMF0gLSB4KSA+PSBDbGlwUGF0aFV0aWwuVEhSRVNIT0xEKSBcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlZF94ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBpZiAoTWF0aC5hYnMoY29vcmRpbmF0ZV94eVsxXSAtIHkpID49IENsaXBQYXRoVXRpbC5USFJFU0hPTEQpIFxuICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkX3kgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNoYW5nZWRfeCAmJiBjaGFuZ2VkX3kpIHtcbiAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfSAgXG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTl9DTElQUEFUSFwiLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9ICAgICAgXG5cbiAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGVsZW0sIFwiUFRfTk9ERV9WSVNVQUxMWV9ISURERU5fQ0xJUFBBVEhcIiwgZmFsc2UpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaXNDbGlwcGVkQnlJbnNldChlbGVtLCB0b3AsIHJpZ2h0ID0gJzBweCcsIGJvdHRvbSA9ICcwcHgnLCBsZWZ0ID0gJzBweCcpIHtcbiAgICAgICAgY29uc3Qgc3R5bGUgPSBDU1NVdGlsLmdldENvbXB1dGVkU3R5bGUoZWxlbSk7XG4gICAgICAgIGNvbnN0IHdpZHRoID0gcGFyc2VJbnQoc3R5bGUud2lkdGgpOyAgLy9hbHdheXMgaW4gcHhcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gcGFyc2VJbnQoc3R5bGUuaGVpZ2h0KTsgLy9hbHdheXMgaW4gcHhcbiAgICAgICAgXG4gICAgICAgIC8vIHRvcFxuICAgICAgICBsZXQgdG9wX3ZhbHVlID0gcGFyc2VJbnQodG9wKTtcbiAgICAgICAgaWYgKGlzTmFOKHRvcF92YWx1ZSkpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBpZiAodG9wLmVuZHNXaXRoKFwiJVwiKSlcbiAgICAgICAgICAgIHRvcF92YWx1ZSA9IHRvcF92YWx1ZSAqIGhlaWdodC8xMDA7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcGFpciA9IENTU1V0aWwuZ2V0VmFsdWVVbml0UGFpcih0b3ApO1xuICAgICAgICAgICAgaWYgKCFwYWlyKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB0b3BfdmFsdWUgPSBDU1NVdGlsLmNvbnZlcnRWYWx1ZTJQaXhlbHMocGFpclswXSwgcGFpclsxXSwgZWxlbSk7XG4gICAgICAgIH1cblxuICAgICAgICAvL2luc2V0IG91dHNpZGUgb2YgdGhlIGNvbnRhaW5lclxuICAgICAgICBpZiAodG9wX3ZhbHVlID4gaGVpZ2h0KSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgLy8gcmlnaHRcbiAgICAgICAgbGV0IHJpZ2h0X3ZhbHVlID0gcGFyc2VJbnQocmlnaHQpO1xuICAgICAgICBpZiAoaXNOYU4ocmlnaHRfdmFsdWUpKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgaWYgKHJpZ2h0LmVuZHNXaXRoKFwiJVwiKSlcbiAgICAgICAgICAgIHJpZ2h0X3ZhbHVlID0gcmlnaHRfdmFsdWUgKiB3aWR0aC8xMDA7XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcGFpciA9IENTU1V0aWwuZ2V0VmFsdWVVbml0UGFpcihyaWdodCk7XG4gICAgICAgICAgICBpZiAoIXBhaXIpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIHJpZ2h0X3ZhbHVlID0gQ1NTVXRpbC5jb252ZXJ0VmFsdWUyUGl4ZWxzKHBhaXJbMF0sIHBhaXJbMV0sIGVsZW0pO1xuICAgICAgICB9XG4gICAgICAgIC8vaW5zZXQgb3V0c2lkZSBvZiB0aGUgY29udGFpbmVyXG4gICAgICAgIGlmIChyaWdodF92YWx1ZSA+IHdpZHRoKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgLy8gYm90dG9tXG4gICAgICAgIGxldCBib3R0b21fdmFsdWUgPSBwYXJzZUludChib3R0b20pO1xuICAgICAgICBpZiAoaXNOYU4oYm90dG9tX3ZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGlmIChib3R0b20uZW5kc1dpdGgoXCIlXCIpKVxuICAgICAgICAgICAgYm90dG9tX3ZhbHVlID0gYm90dG9tX3ZhbHVlICogaGVpZ2h0LzEwMDtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBwYWlyID0gQ1NTVXRpbC5nZXRWYWx1ZVVuaXRQYWlyKGJvdHRvbSk7XG4gICAgICAgICAgICBpZiAoIXBhaXIpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGJvdHRvbV92YWx1ZSA9IENTU1V0aWwuY29udmVydFZhbHVlMlBpeGVscyhwYWlyWzBdLCBwYWlyWzFdLCBlbGVtKTtcbiAgICAgICAgfVxuICAgICAgICAvL2luc2V0IG91dHNpZGUgb2YgdGhlIGNvbnRhaW5lclxuICAgICAgICBpZiAoYm90dG9tX3ZhbHVlID4gaGVpZ2h0KSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgLy8gbGVmdFxuICAgICAgICBsZXQgbGVmdF92YWx1ZSA9IHBhcnNlSW50KGxlZnQpO1xuICAgICAgICBpZiAoaXNOYU4obGVmdF92YWx1ZSkpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBpZiAobGVmdC5lbmRzV2l0aChcIiVcIikpXG4gICAgICAgICAgICBsZWZ0X3ZhbHVlID0gbGVmdF92YWx1ZSAqIHdpZHRoLzEwMDtcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBwYWlyID0gQ1NTVXRpbC5nZXRWYWx1ZVVuaXRQYWlyKGxlZnQpO1xuICAgICAgICAgICAgaWYgKCFwYWlyKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBsZWZ0X3ZhbHVlID0gQ1NTVXRpbC5jb252ZXJ0VmFsdWUyUGl4ZWxzKHBhaXJbMF0sIHBhaXJbMV0sIGVsZW0pO1xuICAgICAgICB9XG4gICAgICAgIC8vaW5zZXQgb3V0c2lkZSBvZiB0aGUgY29udGFpbmVyXG4gICAgICAgIGlmIChsZWZ0X3ZhbHVlID4gd2lkdGgpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBpZiAoaGVpZ2h0IC0gKHRvcF92YWx1ZSArIGJvdHRvbV92YWx1ZSkgPD0gQ2xpcFBhdGhVdGlsLlRIUkVTSE9MRCAgfHwgd2lkdGggLSAocmlnaHRfdmFsdWUgKyBsZWZ0X3ZhbHVlKSA8PSBDbGlwUGF0aFV0aWwuVEhSRVNIT0xEKSBcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICBcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn0iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAgIENvcHlyaWdodDo6IDIwMjAtIElCTSwgSW5jXG5cbiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG4gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IERPTVdhbGtlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5cbmV4cG9ydCBjbGFzcyBDb2xvclV0aWwge1xuXG4gICAgcHVibGljIHN0YXRpYyBDU1NDb2xvckxvb2t1cCA9IHtcbiAgICAgICAgXCJhbGljZWJsdWVcIjogXCIjZjBmOGZmXCIsXG4gICAgICAgIFwiYW50aXF1ZXdoaXRlXCI6IFwiI2ZhZWJkN1wiLFxuICAgICAgICBcImFxdWFcIjogXCIjMDBmZmZmXCIsXG4gICAgICAgIFwiYXF1YW1hcmluZVwiOiBcIiM3ZmZmZDRcIixcbiAgICAgICAgXCJhenVyZVwiOiBcIiNmMGZmZmZcIixcbiAgICAgICAgXCJiZWlnZVwiOiBcIiNmNWY1ZGNcIixcbiAgICAgICAgXCJiaXNxdWVcIjogXCIjZmZlNGM0XCIsXG4gICAgICAgIFwiYmxhY2tcIjogXCIjMDAwMDAwXCIsXG4gICAgICAgIFwiYmxhbmNoZWRhbG1vbmRcIjogXCIjZmZlYmNkXCIsXG4gICAgICAgIFwiYmx1ZVwiOiBcIiMwMDAwZmZcIixcbiAgICAgICAgXCJibHVldmlvbGV0XCI6IFwiIzhhMmJlMlwiLFxuICAgICAgICBcImJyb3duXCI6IFwiI2E1MmEyYVwiLFxuICAgICAgICBcImJ1cmx5d29vZFwiOiBcIiNkZWI4ODdcIixcbiAgICAgICAgXCJjYWRldGJsdWVcIjogXCIjNWY5ZWEwXCIsXG4gICAgICAgIFwiY2hhcnRyZXVzZVwiOiBcIiM3ZmZmMDBcIixcbiAgICAgICAgXCJjaG9jb2xhdGVcIjogXCIjZDI2OTFlXCIsXG4gICAgICAgIFwiY29yYWxcIjogXCIjZmY3ZjUwXCIsXG4gICAgICAgIFwiY29ybmZsb3dlcmJsdWVcIjogXCIjNjQ5NWVkXCIsXG4gICAgICAgIFwiY29ybnNpbGtcIjogXCIjZmZmOGRjXCIsXG4gICAgICAgIFwiY3JpbXNvblwiOiBcIiNkYzE0M2NcIixcbiAgICAgICAgXCJjeWFuXCI6IFwiIzAwZmZmZlwiLFxuICAgICAgICBcImRhcmtibHVlXCI6IFwiIzAwMDA4YlwiLFxuICAgICAgICBcImRhcmtjeWFuXCI6IFwiIzAwOGI4YlwiLFxuICAgICAgICBcImRhcmtnb2xkZW5yb2RcIjogXCIjYjg4NjBiXCIsXG4gICAgICAgIFwiZGFya2dyYXlcIjogXCIjYTlhOWE5XCIsXG4gICAgICAgIFwiZGFya2dyZWVuXCI6IFwiIzAwNjQwMFwiLFxuICAgICAgICBcImRhcmtraGFraVwiOiBcIiNiZGI3NmJcIixcbiAgICAgICAgXCJkYXJrbWFnZW50YVwiOiBcIiM4YjAwOGJcIixcbiAgICAgICAgXCJkYXJrb2xpdmVncmVlblwiOiBcIiM1NTZiMmZcIixcbiAgICAgICAgXCJkYXJrb3JhbmdlXCI6IFwiI2ZmOGMwMFwiLFxuICAgICAgICBcImRhcmtvcmNoaWRcIjogXCIjOTkzMmNjXCIsXG4gICAgICAgIFwiZGFya3JlZFwiOiBcIiM4YjAwMDBcIixcbiAgICAgICAgXCJkYXJrc2FsbW9uXCI6IFwiI2U5OTY3YVwiLFxuICAgICAgICBcImRhcmtzZWFncmVlblwiOiBcIiM4ZmJjOGZcIixcbiAgICAgICAgXCJkYXJrc2xhdGVibHVlXCI6IFwiIzQ4M2Q4YlwiLFxuICAgICAgICBcImRhcmtzbGF0ZWdyYXlcIjogXCIjMmY0ZjRmXCIsXG4gICAgICAgIFwiZGFya3R1cnF1b2lzZVwiOiBcIiMwMGNlZDFcIixcbiAgICAgICAgXCJkYXJrdmlvbGV0XCI6IFwiIzk0MDBkM1wiLFxuICAgICAgICBcImRlZXBwaW5rXCI6IFwiI2ZmMTQ5M1wiLFxuICAgICAgICBcImRlZXBza3libHVlXCI6IFwiIzAwYmZmZlwiLFxuICAgICAgICBcImRpbWdyYXlcIjogXCIjNjk2OTY5XCIsXG4gICAgICAgIFwiZG9kZ2VyYmx1ZVwiOiBcIiMxZTkwZmZcIixcbiAgICAgICAgXCJmaXJlYnJpY2tcIjogXCIjYjIyMjIyXCIsXG4gICAgICAgIFwiZmxvcmFsd2hpdGVcIjogXCIjZmZmYWYwXCIsXG4gICAgICAgIFwiZm9yZXN0Z3JlZW5cIjogXCIjMjI4YjIyXCIsXG4gICAgICAgIFwiZnVjaHNpYVwiOiBcIiNmZjAwZmZcIixcbiAgICAgICAgXCJnYWluc2Jvcm9cIjogXCIjZGNkY2RjXCIsXG4gICAgICAgIFwiZ2hvc3R3aGl0ZVwiOiBcIiNmOGY4ZmZcIixcbiAgICAgICAgXCJnb2xkXCI6IFwiI2ZmZDcwMFwiLFxuICAgICAgICBcImdvbGRlbnJvZFwiOiBcIiNkYWE1MjBcIixcbiAgICAgICAgXCJncmF5XCI6IFwiIzgwODA4MFwiLFxuICAgICAgICBcImdyZWVuXCI6IFwiIzAwODAwMFwiLFxuICAgICAgICBcImdyZWVueWVsbG93XCI6IFwiI2FkZmYyZlwiLFxuICAgICAgICBcImhvbmV5ZGV3XCI6IFwiI2YwZmZmMFwiLFxuICAgICAgICBcImhvdHBpbmtcIjogXCIjZmY2OWI0XCIsXG4gICAgICAgIFwiaW5kaWFucmVkXCI6IFwiI2NkNWM1Y1wiLFxuICAgICAgICBcImluZGlnb1wiOiBcIiM0YjAwODJcIixcbiAgICAgICAgXCJpdm9yeVwiOiBcIiNmZmZmZjBcIixcbiAgICAgICAgXCJraGFraVwiOiBcIiNmMGU2OGNcIixcbiAgICAgICAgXCJsYXZlbmRlclwiOiBcIiNlNmU2ZmFcIixcbiAgICAgICAgXCJsYXZlbmRlcmJsdXNoXCI6IFwiI2ZmZjBmNVwiLFxuICAgICAgICBcImxhd25ncmVlblwiOiBcIiM3Y2ZjMDBcIixcbiAgICAgICAgXCJsZW1vbmNoaWZmb25cIjogXCIjZmZmYWNkXCIsXG4gICAgICAgIFwibGlnaHRibHVlXCI6IFwiI2FkZDhlNlwiLFxuICAgICAgICBcImxpZ2h0Y29yYWxcIjogXCIjZjA4MDgwXCIsXG4gICAgICAgIFwibGlnaHRjeWFuXCI6IFwiI2UwZmZmZlwiLFxuICAgICAgICBcImxpZ2h0Z29sZGVucm9keWVsbG93XCI6IFwiI2ZhZmFkMlwiLFxuICAgICAgICBcImxpZ2h0Z3JleVwiOiBcIiNkM2QzZDNcIixcbiAgICAgICAgXCJsaWdodGdyZWVuXCI6IFwiIzkwZWU5MFwiLFxuICAgICAgICBcImxpZ2h0cGlua1wiOiBcIiNmZmI2YzFcIixcbiAgICAgICAgXCJsaWdodHNhbG1vblwiOiBcIiNmZmEwN2FcIixcbiAgICAgICAgXCJsaWdodHNlYWdyZWVuXCI6IFwiIzIwYjJhYVwiLFxuICAgICAgICBcImxpZ2h0c2t5Ymx1ZVwiOiBcIiM4N2NlZmFcIixcbiAgICAgICAgXCJsaWdodHNsYXRlZ3JheVwiOiBcIiM3Nzg4OTlcIixcbiAgICAgICAgXCJsaWdodHN0ZWVsYmx1ZVwiOiBcIiNiMGM0ZGVcIixcbiAgICAgICAgXCJsaWdodHllbGxvd1wiOiBcIiNmZmZmZTBcIixcbiAgICAgICAgXCJsaW1lXCI6IFwiIzAwZmYwMFwiLFxuICAgICAgICBcImxpbWVncmVlblwiOiBcIiMzMmNkMzJcIixcbiAgICAgICAgXCJsaW5lblwiOiBcIiNmYWYwZTZcIixcbiAgICAgICAgXCJtYWdlbnRhXCI6IFwiI2ZmMDBmZlwiLFxuICAgICAgICBcIm1hcm9vblwiOiBcIiM4MDAwMDBcIixcbiAgICAgICAgXCJtZWRpdW1hcXVhbWFyaW5lXCI6IFwiIzY2Y2RhYVwiLFxuICAgICAgICBcIm1lZGl1bWJsdWVcIjogXCIjMDAwMGNkXCIsXG4gICAgICAgIFwibWVkaXVtb3JjaGlkXCI6IFwiI2JhNTVkM1wiLFxuICAgICAgICBcIm1lZGl1bXB1cnBsZVwiOiBcIiM5MzcwZDhcIixcbiAgICAgICAgXCJtZWRpdW1zZWFncmVlblwiOiBcIiMzY2IzNzFcIixcbiAgICAgICAgXCJtZWRpdW1zbGF0ZWJsdWVcIjogXCIjN2I2OGVlXCIsXG4gICAgICAgIFwibWVkaXVtc3ByaW5nZ3JlZW5cIjogXCIjMDBmYTlhXCIsXG4gICAgICAgIFwibWVkaXVtdHVycXVvaXNlXCI6IFwiIzQ4ZDFjY1wiLFxuICAgICAgICBcIm1lZGl1bXZpb2xldHJlZFwiOiBcIiNjNzE1ODVcIixcbiAgICAgICAgXCJtaWRuaWdodGJsdWVcIjogXCIjMTkxOTcwXCIsXG4gICAgICAgIFwibWludGNyZWFtXCI6IFwiI2Y1ZmZmYVwiLFxuICAgICAgICBcIm1pc3R5cm9zZVwiOiBcIiNmZmU0ZTFcIixcbiAgICAgICAgXCJtb2NjYXNpblwiOiBcIiNmZmU0YjVcIixcbiAgICAgICAgXCJuYXZham93aGl0ZVwiOiBcIiNmZmRlYWRcIixcbiAgICAgICAgXCJuYXZ5XCI6IFwiIzAwMDA4MFwiLFxuICAgICAgICBcIm9sZGxhY2VcIjogXCIjZmRmNWU2XCIsXG4gICAgICAgIFwib2xpdmVcIjogXCIjODA4MDAwXCIsXG4gICAgICAgIFwib2xpdmVkcmFiXCI6IFwiIzZiOGUyM1wiLFxuICAgICAgICBcIm9yYW5nZVwiOiBcIiNmZmE1MDBcIixcbiAgICAgICAgXCJvcmFuZ2VyZWRcIjogXCIjZmY0NTAwXCIsXG4gICAgICAgIFwib3JjaGlkXCI6IFwiI2RhNzBkNlwiLFxuICAgICAgICBcInBhbGVnb2xkZW5yb2RcIjogXCIjZWVlOGFhXCIsXG4gICAgICAgIFwicGFsZWdyZWVuXCI6IFwiIzk4ZmI5OFwiLFxuICAgICAgICBcInBhbGV0dXJxdW9pc2VcIjogXCIjYWZlZWVlXCIsXG4gICAgICAgIFwicGFsZXZpb2xldHJlZFwiOiBcIiNkODcwOTNcIixcbiAgICAgICAgXCJwYXBheWF3aGlwXCI6IFwiI2ZmZWZkNVwiLFxuICAgICAgICBcInBlYWNocHVmZlwiOiBcIiNmZmRhYjlcIixcbiAgICAgICAgXCJwZXJ1XCI6IFwiI2NkODUzZlwiLFxuICAgICAgICBcInBpbmtcIjogXCIjZmZjMGNiXCIsXG4gICAgICAgIFwicGx1bVwiOiBcIiNkZGEwZGRcIixcbiAgICAgICAgXCJwb3dkZXJibHVlXCI6IFwiI2IwZTBlNlwiLFxuICAgICAgICBcInB1cnBsZVwiOiBcIiM4MDAwODBcIixcbiAgICAgICAgXCJyZWRcIjogXCIjZmYwMDAwXCIsXG4gICAgICAgIFwicm9zeWJyb3duXCI6IFwiI2JjOGY4ZlwiLFxuICAgICAgICBcInJveWFsYmx1ZVwiOiBcIiM0MTY5ZTFcIixcbiAgICAgICAgXCJzYWRkbGVicm93blwiOiBcIiM4YjQ1MTNcIixcbiAgICAgICAgXCJzYWxtb25cIjogXCIjZmE4MDcyXCIsXG4gICAgICAgIFwic2FuZHlicm93blwiOiBcIiNmNGE0NjBcIixcbiAgICAgICAgXCJzZWFncmVlblwiOiBcIiMyZThiNTdcIixcbiAgICAgICAgXCJzZWFzaGVsbFwiOiBcIiNmZmY1ZWVcIixcbiAgICAgICAgXCJzaWVubmFcIjogXCIjYTA1MjJkXCIsXG4gICAgICAgIFwic2lsdmVyXCI6IFwiI2MwYzBjMFwiLFxuICAgICAgICBcInNreWJsdWVcIjogXCIjODdjZWViXCIsXG4gICAgICAgIFwic2xhdGVibHVlXCI6IFwiIzZhNWFjZFwiLFxuICAgICAgICBcInNsYXRlZ3JheVwiOiBcIiM3MDgwOTBcIixcbiAgICAgICAgXCJzbm93XCI6IFwiI2ZmZmFmYVwiLFxuICAgICAgICBcInNwcmluZ2dyZWVuXCI6IFwiIzAwZmY3ZlwiLFxuICAgICAgICBcInN0ZWVsYmx1ZVwiOiBcIiM0NjgyYjRcIixcbiAgICAgICAgXCJ0YW5cIjogXCIjZDJiNDhjXCIsXG4gICAgICAgIFwidGVhbFwiOiBcIiMwMDgwODBcIixcbiAgICAgICAgXCJ0aGlzdGxlXCI6IFwiI2Q4YmZkOFwiLFxuICAgICAgICBcInRvbWF0b1wiOiBcIiNmZjYzNDdcIixcbiAgICAgICAgXCJ0dXJxdW9pc2VcIjogXCIjNDBlMGQwXCIsXG4gICAgICAgIFwidmlvbGV0XCI6IFwiI2VlODJlZVwiLFxuICAgICAgICBcIndoZWF0XCI6IFwiI2Y1ZGViM1wiLFxuICAgICAgICBcIndoaXRlXCI6IFwiI2ZmZmZmZlwiLFxuICAgICAgICBcIndoaXRlc21va2VcIjogXCIjZjVmNWY1XCIsXG4gICAgICAgIFwieWVsbG93XCI6IFwiI2ZmZmYwMFwiLFxuICAgICAgICBcInllbGxvd2dyZWVuXCI6IFwiIzlhY2QzMlwiLFxuICAgICAgICBcImJ1dHRvbnRleHRcIjogXCJyZ2JhKDAsIDAsIDAsIDAuODQ3KVwiLFxuICAgICAgICBcImJ1dHRvbmZhY2VcIjogXCIjZmZmZmZmXCIsXG4gICAgICAgIFwiZ3JheXRleHRcIjogXCJyZ2JhKDAsIDAsIDAsIDAuMjQ3KVwiXG4gICAgfVxuXG5cbiAgICAvLyBSZXdyaXRlIHRoZSBjb2xvciBvYmplY3QgdG8gYWNjb3VudCBmb3IgYWxwaGFcbiAgICBwdWJsaWMgc3RhdGljIENvbG9yKGNzc1N0eWxlQ29sb3IpIHtcbiAgICAgICAgaWYgKCFjc3NTdHlsZUNvbG9yKSByZXR1cm4gbnVsbDtcbiAgICAgICAgY3NzU3R5bGVDb2xvciA9IGNzc1N0eWxlQ29sb3IudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKGNzc1N0eWxlQ29sb3IgPT09IFwidHJhbnNwYXJlbnRcIikgcmV0dXJuIG5ldyBDb2xvck9iaigyNTUsIDI1NSwgMjU1LCAwKTtcbiAgICAgICAgaWYgKGNzc1N0eWxlQ29sb3IgaW4gQ29sb3JVdGlsLkNTU0NvbG9yTG9va3VwKVxuICAgICAgICAgICAgY3NzU3R5bGVDb2xvciA9IENvbG9yVXRpbC5DU1NDb2xvckxvb2t1cFtjc3NTdHlsZUNvbG9yXTtcbiAgICAgICAgaWYgKGNzc1N0eWxlQ29sb3Iuc3RhcnRzV2l0aChcInJnYihcIikpIHtcbiAgICAgICAgICAgIGxldCByZ2JSZWdleCA9IC9cXHMqcmdiXFxzKlxcKFxccyooXFxkKylcXHMqLFxccyooXFxkKylcXHMqLFxccyooXFxkKylcXHMqXFwpLztcbiAgICAgICAgICAgIGxldCBtID0gY3NzU3R5bGVDb2xvci5tYXRjaChyZ2JSZWdleCk7XG4gICAgICAgICAgICBpZiAobSA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbG9yT2JqKG1bMV0sIG1bMl0sIG1bM10pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGNzc1N0eWxlQ29sb3Iuc3RhcnRzV2l0aChcInJnYmEoXCIpKSB7XG4gICAgICAgICAgICBsZXQgcmdiUmVnZXggPSAvXFxzKnJnYmFcXHMqXFwoXFxzKihcXGQrKVxccyosXFxzKihcXGQrKVxccyosXFxzKihcXGQrKVxccyosXFxzKiguKylcXHMqXFwpLztcbiAgICAgICAgICAgIGxldCBtID0gY3NzU3R5bGVDb2xvci5tYXRjaChyZ2JSZWdleCk7XG4gICAgICAgICAgICBpZiAobSA9PT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbG9yT2JqKG1bMV0sIG1bMl0sIG1bM10sIG1bNF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGNzc1N0eWxlQ29sb3IuY2hhckF0KDApICE9IFwiI1wiKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChjc3NTdHlsZUNvbG9yLmxlbmd0aCA9PT0gNCkge1xuICAgICAgICAgICAgICAgIC8vIFRoZSB0aHJlZS1kaWdpdCBSR0IgKCNyZ2IpIGlzIGNvbnZlcnRlZCB0byBzaXgtZGlnaXQgZm9ybSAoI3JyZ2diYikgYnkgcmVwbGljYXRpbmcgZGlnaXRzXG4gICAgICAgICAgICAgICAgLy8gKGh0dHBzOi8vd3d3LnczLm9yZy9UUi9jc3MtY29sb3ItMy8jcmdiLWNvbG9yKVxuICAgICAgICAgICAgICAgIGNzc1N0eWxlQ29sb3IgPSBcIiNcIiArIGNzc1N0eWxlQ29sb3IuY2hhckF0KDEpLnJlcGVhdCgyKSArXG4gICAgICAgICAgICAgICAgICAgIGNzc1N0eWxlQ29sb3IuY2hhckF0KDIpLnJlcGVhdCgyKSArXG4gICAgICAgICAgICAgICAgICAgIGNzc1N0eWxlQ29sb3IuY2hhckF0KDMpLnJlcGVhdCgyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCB0aGlzUmVkID0gcGFyc2VJbnQoY3NzU3R5bGVDb2xvci5zdWJzdHJpbmcoMSwgMyksIDE2KTtcbiAgICAgICAgICAgIGxldCB0aGlzR3JlZW4gPSBwYXJzZUludChjc3NTdHlsZUNvbG9yLnN1YnN0cmluZygzLCA1KSwgMTYpO1xuICAgICAgICAgICAgbGV0IHRoaXNCbHVlID0gcGFyc2VJbnQoY3NzU3R5bGVDb2xvci5zdWJzdHJpbmcoNSwgNyksIDE2KTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQ29sb3JPYmoodGhpc1JlZCwgdGhpc0dyZWVuLCB0aGlzQmx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gICAgcmV0dXJuIG51bGw7IC8vIFVucmVhY2hhYmxlXG4gICAgfTtcblxuIHB1YmxpYyBzdGF0aWMgQ29sb3JDb21ibyhydWxlQ29udGV4dCA6IEhUTUxFbGVtZW50KSB7XG4gICAgdHJ5IHsgXG4gICAgICAgIHZhciBkb2MgPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50O1xuICAgICAgICBpZiAoIWRvYykge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHdpbiA9IGRvYy5kZWZhdWx0VmlldztcbiAgICAgICAgaWYgKCF3aW4pIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGFuY2VzdG9ycyA9IFtdO1xuICAgICAgICBsZXQgd2Fsa05vZGUgOiBFbGVtZW50ID0gcnVsZUNvbnRleHQ7XG4gICAgICAgIHdoaWxlICh3YWxrTm9kZSkge1xuICAgICAgICAgICAgaWYgKHdhbGtOb2RlLm5vZGVUeXBlID09PSAxKSBcbiAgICAgICAgICAgICAgICBhbmNlc3RvcnMucHVzaCh3YWxrTm9kZSk7XG4gICAgICAgICAgICB3YWxrTm9kZSA9IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KHdhbGtOb2RlKTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgdmFyIHJldFZhbCA9IHtcbiAgICAgICAgICAgIFwiaGFzR3JhZGllbnRcIjogZmFsc2UsXG4gICAgICAgICAgICBcImhhc0JHSW1hZ2VcIjogZmFsc2UsXG4gICAgICAgICAgICBcInRleHRTaGFkb3dcIjogZmFsc2UsXG4gICAgICAgICAgICBcImZnXCI6IG51bGwsXG4gICAgICAgICAgICBcImJnXCI6IG51bGxcbiAgICAgICAgfTtcbiAgICAgICAgXG4gICAgICAgIC8vIHN0YXJ0XG4gICAgICAgIHZhciBjU3R5bGUgPSB3aW4uZ2V0Q29tcHV0ZWRTdHlsZShydWxlQ29udGV4dCk7XG4gICAgICAgIHZhciBjb21wU3R5bGVDb2xvciA9IGNTdHlsZS5jb2xvcjtcbiAgICAgICAgaWYgKCFjb21wU3R5bGVDb2xvcilcbiAgICAgICAgICAgIGNvbXBTdHlsZUNvbG9yID0gXCJibGFja1wiO1xuICAgICAgICB2YXIgZmcgPSBDb2xvclV0aWwuQ29sb3IoY29tcFN0eWxlQ29sb3IpO1xuICAgICAgICB2YXIgcmVDb2xvciA9IC90cmFuc3BhcmVudHxyZ2JhP1xcKFteKV0rXFwpL2dpO1xuICAgICAgICB2YXIgZ3Vlc3NHcmFkQ29sb3IgPSBmdW5jdGlvbiAoZ3JhZExpc3QsIGJnQ29sb3IsIGZnQ29sb3IpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUncyBvbmx5IG9uZSBjb2xvciwgcmV0dXJuIHRoYXRcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGdyYWRMaXN0Lmxlbmd0aCA9PT0gXCJ1bmRlZmluZWRcIilcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdyYWRMaXN0O1xuXG4gICAgICAgICAgICAgICAgdmFyIG92ZXJhbGxXb3JzdCA9IG51bGw7XG4gICAgICAgICAgICAgICAgdmFyIG92ZXJhbGxXb3JzdFJhdGlvID0gbnVsbDtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpR3JhZCA9IDE7IGlHcmFkIDwgZ3JhZExpc3QubGVuZ3RoOyArK2lHcmFkKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB3b3JzdENvbG9yID0gZ3JhZExpc3RbaUdyYWQgLSAxXTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHdvcnN0UmF0aW8gPSBmZ0NvbG9yLmNvbnRyYXN0UmF0aW8oZ3JhZExpc3RbaUdyYWQgLSAxXSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzdGVwID0gLjE7XG4gICAgICAgICAgICAgICAgICAgIHZhciBpZHggPSAwO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoc3RlcCA+IC4wMDAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaWR4ICsgc3RlcCA8PSAxICYmIHdvcnN0UmF0aW8gPiBmZ0NvbG9yLmNvbnRyYXN0UmF0aW8oZ3JhZExpc3RbaUdyYWRdLm1peChncmFkTGlzdFtpR3JhZCAtIDFdLCBpZHggKyBzdGVwKS5nZXRPdmVybGF5Q29sb3IoYmdDb2xvcikpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yc3RDb2xvciA9IGdyYWRMaXN0W2lHcmFkXS5taXgoZ3JhZExpc3RbaUdyYWQgLSAxXSwgaWR4ICsgc3RlcCkuZ2V0T3ZlcmxheUNvbG9yKGJnQ29sb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcnN0UmF0aW8gPSBmZ0NvbG9yLmNvbnRyYXN0UmF0aW8od29yc3RDb2xvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWR4ID0gaWR4ICsgc3RlcDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChpZHggLSBzdGVwID49IDAgJiYgd29yc3RSYXRpbyA+IGZnQ29sb3IuY29udHJhc3RSYXRpbyhncmFkTGlzdFtpR3JhZF0ubWl4KGdyYWRMaXN0W2lHcmFkIC0gMV0sIGlkeCAtIHN0ZXApLmdldE92ZXJsYXlDb2xvcihiZ0NvbG9yKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JzdENvbG9yID0gZ3JhZExpc3RbaUdyYWRdLm1peChncmFkTGlzdFtpR3JhZCAtIDFdLCBpZHggLSBzdGVwKS5nZXRPdmVybGF5Q29sb3IoYmdDb2xvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd29yc3RSYXRpbyA9IGZnQ29sb3IuY29udHJhc3RSYXRpbyh3b3JzdENvbG9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZHggPSBpZHggLSBzdGVwO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgc3RlcCA9IHN0ZXAgLyAxMDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAob3ZlcmFsbFdvcnN0UmF0aW8gPT09IG51bGwgfHwgb3ZlcmFsbFdvcnN0UmF0aW8gPiB3b3JzdFJhdGlvKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvdmVyYWxsV29yc3RSYXRpbyA9IHdvcnN0UmF0aW87XG4gICAgICAgICAgICAgICAgICAgICAgICBvdmVyYWxsV29yc3QgPSB3b3JzdENvbG9yO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBvdmVyYWxsV29yc3Q7IC8vIHJldHVybiB0aGUgZGFya2VzdCBjb2xvclxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGJnQ29sb3I7XG4gICAgICAgIH07XG5cbiAgICAgICAgdmFyIHByaW9yU3RhY2tCRyA9IENvbG9yVXRpbC5Db2xvcihcIndoaXRlXCIpO1xuICAgICAgICB2YXIgdGhpc1N0YWNrT3BhY2l0eSA9IG51bGw7XG4gICAgICAgIHZhciB0aGlzU3RhY2tBbHBoYSA9IG51bGw7XG4gICAgICAgIHZhciB0aGlzU3RhY2tCRyA9IG51bGw7XG4gICAgICAgIC8vIEFuY2VzdG9ycyBwcm9jZXNzZWQgZnJvbSB0aGUgdG9wbW9zdCBwYXJlbnQgdG93YXJkIHRoZSBjaGlsZFxuICAgICAgICB3aGlsZSAoYW5jZXN0b3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHZhciBwcm9jTmV4dCA9IGFuY2VzdG9ycy5wb3AoKTtcbiAgICAgICAgICAgIC8vdmFyIHByb2NOZXh0ID0gYW5jZXN0b3JzLnNwbGljZSgwLCAxKVswXTtcbiAgICAgICAgICAgIC8vIGNTdHlsZSBpcyB0aGUgY29tcHV0ZWQgc3R5bGUgb2YgdGhpcyBsYXllclxuICAgICAgICAgICAgdmFyIGNTdHlsZSA9IHdpbi5nZXRDb21wdXRlZFN0eWxlKHByb2NOZXh0KTtcbiAgICAgICAgICAgIGlmIChjU3R5bGUgPT09IG51bGwpIGNvbnRpbnVlO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICAvLyB0aGlzQmdDb2xvciBpcyB0aGUgY29sb3Igb2YgdGhpcyBsYXllciBvciBudWxsIGlmIHRoZSBsYXllciBpcyB0cmFuc3BhcmVudFxuICAgICAgICAgICAgdmFyIHRoaXNCZ0NvbG9yID0gbnVsbDtcbiAgICAgICAgICAgIGlmIChjU3R5bGUuYmFja2dyb3VuZENvbG9yICYmIGNTdHlsZS5iYWNrZ3JvdW5kQ29sb3IgIT0gXCJ0cmFuc3BhcmVudFwiICYmIGNTdHlsZS5iYWNrZ3JvdW5kQ29sb3IgIT0gXCJyZ2JhKDAsIDAsIDAsIDApXCIpIHtcbiAgICAgICAgICAgICAgICB0aGlzQmdDb2xvciA9IENvbG9yVXRpbC5Db2xvcihjU3R5bGUuYmFja2dyb3VuZENvbG9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIGEgZ3JhZGllbnQgaW52b2x2ZWQsIHNldCB0aGlzQmdDb2xvciB0byB0aGUgd29yc3QgY29sb3IgY29tYmluYXRpb24gYXZhaWxhYmxlIGFnYWluc3QgdGhlIGZvcmVncm91bmRcbiAgICAgICAgICAgIGlmIChjU3R5bGUuYmFja2dyb3VuZEltYWdlICYmIGNTdHlsZS5iYWNrZ3JvdW5kSW1hZ2UuaW5kZXhPZiAmJiBjU3R5bGUuYmFja2dyb3VuZEltYWdlLmluZGV4T2YoXCJncmFkaWVudFwiKSAhPSAtMSkge1xuICAgICAgICAgICAgICAgIHZhciBncmFkQ29sb3JzIDogc3RyaW5nW10gPSBjU3R5bGUuYmFja2dyb3VuZEltYWdlLm1hdGNoKHJlQ29sb3IpO1xuICAgICAgICAgICAgICAgIGlmIChncmFkQ29sb3JzKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBncmFkQ29sb3JDb21wIDogQ29sb3JPYmpbXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGdyYWRDb2xvcnMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZ3JhZENvbG9yc1tpXS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFkQ29sb3JzLnNwbGljZShpLS0sIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29sb3JDb21wID0gQ29sb3JVdGlsLkNvbG9yKGdyYWRDb2xvcnNbaV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2xvckNvbXAuYWxwaGEgIT09IHVuZGVmaW5lZCAmJiBjb2xvckNvbXAuYWxwaGEgPCAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1peCB0aGUgZ3JkaWVudCBiZyBjb2xvciB3aXQgcGFyZW50IGJnIGlmIGFscGhhIDwgMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29tcFN0YWNrQmcgPSB0aGlzU3RhY2tCRyB8fCBwcmlvclN0YWNrQkc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yQ29tcCA9IGNvbG9yQ29tcC5nZXRPdmVybGF5Q29sb3IoY29tcFN0YWNrQmcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFkQ29sb3JDb21wLnB1c2goY29sb3JDb21wKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzQmdDb2xvciA9IGd1ZXNzR3JhZENvbG9yKGdyYWRDb2xvckNvbXAsIHRoaXNTdGFja0JHIHx8IHByaW9yU3RhY2tCRywgZmcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gSGFuZGxlIG5vbi1zb2xpZCBvcGFjaXR5XG4gICAgICAgICAgICBpZiAodGhpc1N0YWNrT3BhY2l0eSA9PT0gbnVsbCB8fCAoY1N0eWxlLm9wYWNpdHkgJiYgY1N0eWxlLm9wYWNpdHkubGVuZ3RoID4gMCAmJiBwYXJzZUZsb2F0KGNTdHlsZS5vcGFjaXR5KSA8IDEpKSB7XG4gICAgICAgICAgICAgICAgLy8gTmV3IHN0YWNrLCByZXNldFxuICAgICAgICAgICAgICAgIGlmICh0aGlzU3RhY2tCRyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIE92ZXJsYXlcbiAgICAgICAgICAgICAgICAgICAgdGhpc1N0YWNrQkcuYWxwaGEgPSB0aGlzU3RhY2tPcGFjaXR5ICogdGhpc1N0YWNrQWxwaGE7XG4gICAgICAgICAgICAgICAgICAgIHByaW9yU3RhY2tCRyA9IHRoaXNTdGFja0JHLmdldE92ZXJsYXlDb2xvcihwcmlvclN0YWNrQkcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzU3RhY2tPcGFjaXR5ID0gMS4wO1xuICAgICAgICAgICAgICAgIHRoaXNTdGFja0FscGhhID0gbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzU3RhY2tCRyA9IG51bGw7XG4gICAgICAgICAgICAgICAgaWYgKGNTdHlsZS5vcGFjaXR5ICYmIGNTdHlsZS5vcGFjaXR5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpc1N0YWNrT3BhY2l0eSA9IHBhcnNlRmxvYXQoY1N0eWxlLm9wYWNpdHkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGhpc0JnQ29sb3IgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzU3RhY2tCRyA9IHRoaXNCZ0NvbG9yO1xuICAgICAgICAgICAgICAgICAgICB0aGlzU3RhY2tBbHBoYSA9IHRoaXNTdGFja0JHLmFscGhhIHx8IDEuMDtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXNTdGFja0JHLmFscGhhO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpc1N0YWNrT3BhY2l0eSA9PT0gMS4wICYmIHRoaXNTdGFja0FscGhhID09PSAxLjApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5oYXNCR0ltYWdlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwuaGFzR3JhZGllbnQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEhhbmRsZSBzb2xpZCBjb2xvciBiYWNrZ3JvdW5kcyBhbmQgZ3JhZGllbnQgY29sb3IgYmFja2dyb3VuZHNcbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXNCZ0NvbG9yICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIHN0YWNrIGFscmVhZHkgaGFzIGEgYmFja2dyb3VuZCBjb2xvciwgYmxlbmQgaXRcbiAgICAgICAgICAgICAgICBpZiAodGhpc1N0YWNrQkcgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpc1N0YWNrQkcgPSB0aGlzQmdDb2xvcjtcbiAgICAgICAgICAgICAgICAgICAgdGhpc1N0YWNrQWxwaGEgPSB0aGlzU3RhY2tCRy5hbHBoYSB8fCAxLjA7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzU3RhY2tCRy5hbHBoYTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzU3RhY2tCRyA9IHRoaXNCZ0NvbG9yLmdldE92ZXJsYXlDb2xvcih0aGlzU3RhY2tCRyk7XG4gICAgICAgICAgICAgICAgICAgIC8vdGhpc1N0YWNrQWxwaGEgPSB0aGlzQmdDb2xvci5hbHBoYSB8fCAxLjA7XG4gICAgICAgICAgICAgICAgICAgIHRoaXNTdGFja0FscGhhID0gdGhpc1N0YWNrQkcuYWxwaGEgfHwgMS4wO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyAjNTI2OiBJZiB0aGlzQmdDb2xvciBoYWQgYW4gYWxwaGEgdmFsdWUsIGl0IG1heSBub3QgZXhwb3NlIHRocm91Z2ggdGhpc1N0YWNrQkcgaW4gdGhlIGFib3ZlIGNvZGVcbiAgICAgICAgICAgICAgICAvLyBXZSBjYW4ndCB3aXBlIG91dCB0aGUgZ3JhZGllbnQgaW5mbyBpZiB0aGlzIGxheWVyIHdhcyB0cmFuc3BhcmVudFxuICAgICAgICAgICAgICAgIGlmICh0aGlzU3RhY2tPcGFjaXR5ID09PSAxLjAgJiYgdGhpc1N0YWNrQWxwaGEgPT09IDEuMCAmJiAodGhpc1N0YWNrQkcuYWxwaGEgfHwgMS4wKSA9PT0gMS4wICYmICh0aGlzQmdDb2xvci5hbHBoYSB8fCAxLjApID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbC5oYXNCR0ltYWdlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbC5oYXNHcmFkaWVudCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjU3R5bGUuYmFja2dyb3VuZEltYWdlICYmIGNTdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgIT0gXCJub25lXCIpIHtcbiAgICAgICAgICAgICAgICBpZiAoY1N0eWxlLmJhY2tncm91bmRJbWFnZS5pbmRleE9mICYmIGNTdHlsZS5iYWNrZ3JvdW5kSW1hZ2UuaW5kZXhPZihcImdyYWRpZW50XCIpICE9IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldFZhbC5oYXNHcmFkaWVudCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0VmFsLmhhc0JHSW1hZ2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpc1N0YWNrQkcgIT0gbnVsbCkge1xuICAgICAgICAgICAgZmcgPSBmZy5nZXRPdmVybGF5Q29sb3IodGhpc1N0YWNrQkcpO1xuICAgICAgICAgICAgZGVsZXRlIGZnLmFscGhhO1xuICAgICAgICB9XG4gICAgICAgIGZnLmFscGhhID0gKGZnLmFscGhhIHx8IDEpICogdGhpc1N0YWNrT3BhY2l0eTtcbiAgICAgICAgZmcgPSBmZy5nZXRPdmVybGF5Q29sb3IocHJpb3JTdGFja0JHKTtcbiAgICAgICAgaWYgKHRoaXNTdGFja0JHICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXNTdGFja0JHLmFscGhhID0gdGhpc1N0YWNrT3BhY2l0eSAqIHRoaXNTdGFja0FscGhhO1xuICAgICAgICAgICAgcHJpb3JTdGFja0JHID0gdGhpc1N0YWNrQkcuZ2V0T3ZlcmxheUNvbG9yKHByaW9yU3RhY2tCRyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0VmFsLmZnID0gZmc7XG4gICAgICAgIHJldFZhbC5iZyA9IHByaW9yU3RhY2tCRztcblxuICAgICAgICBpZiAoY1N0eWxlLnRleHRTaGFkb3cgJiYgY1N0eWxlLnRleHRTaGFkb3cgIT09ICdub25lJylcbiAgICAgICAgICAgIHJldFZhbC50ZXh0U2hhZG93ID0gdHJ1ZTtcblxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAvLyBzb21ldGhpbmcgaGFwcGVuZWQsIHRoZW4uLi5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuIH07XG59XG5cbmV4cG9ydCBjbGFzcyBDb2xvck9iaiB7XG4gICAgcmVkIDogbnVtYmVyO1xuICAgIGdyZWVuIDogbnVtYmVyO1xuICAgIGJsdWUgOiBudW1iZXI7XG4gICAgYWxwaGEgOiBudW1iZXI7XG5cbiAgICBjb25zdHJ1Y3RvcihyZWQgOiBzdHJpbmcgfCBudW1iZXIsIGdyZWVuIDogc3RyaW5nIHwgbnVtYmVyLCBibHVlIDogc3RyaW5nIHwgbnVtYmVyLCBhbHBoYT8gOiBzdHJpbmcgfCBudW1iZXIpIHtcbiAgICAgICAgZnVuY3Rpb24gZml4Q29tcG9uZW50KGNvbXAgOiBzdHJpbmcgfCBudW1iZXIpIDogbnVtYmVyIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgKGNvbXApICE9IHR5cGVvZiAoXCJcIikpIHJldHVybiBjb21wIGFzIG51bWJlcjtcbiAgICAgICAgICAgIGxldCBjb21wU3RyID0gY29tcCBhcyBzdHJpbmc7XG4gICAgICAgICAgICBjb21wU3RyID0gY29tcFN0ci50cmltKCk7XG4gICAgICAgICAgICBpZiAoY29tcFN0cltjb21wU3RyLmxlbmd0aCAtIDFdICE9IFwiJVwiKSByZXR1cm4gcGFyc2VJbnQoY29tcFN0cik7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChwYXJzZUZsb2F0KGNvbXBTdHIuc3Vic3RyaW5nKDAsIGNvbXBTdHIubGVuZ3RoIC0gMSkpICogMi41NSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5yZWQgPSBmaXhDb21wb25lbnQocmVkKTtcbiAgICAgICAgdGhpcy5ncmVlbiA9IGZpeENvbXBvbmVudChncmVlbik7XG4gICAgICAgIHRoaXMuYmx1ZSA9IGZpeENvbXBvbmVudChibHVlKTtcbiAgICAgICAgaWYgKHR5cGVvZiAoYWxwaGEpICE9IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHRoaXMuYWxwaGEgPSAodHlwZW9mIChhbHBoYSkgPT09IHR5cGVvZiAoXCJcIikpID8gcGFyc2VGbG9hdChhbHBoYSBhcyBzdHJpbmcpIDogYWxwaGEgYXMgbnVtYmVyO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdG9IZXhIZWxwKHZhbHVlIDogbnVtYmVyKSA6IHN0cmluZyB7XG4gICAgICAgIGxldCByZXRWYWwgPSBNYXRoLnJvdW5kKHZhbHVlKS50b1N0cmluZygxNik7XG4gICAgICAgIGlmIChyZXRWYWwubGVuZ3RoID09PSAxKVxuICAgICAgICAgICAgcmV0dXJuIFwiMFwiICsgcmV0VmFsO1xuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH07XG5cbiAgICB0b0hleCgpIDogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIFwiI1wiICsgdGhpcy50b0hleEhlbHAodGhpcy5yZWQpICsgdGhpcy50b0hleEhlbHAodGhpcy5ncmVlbikgKyB0aGlzLnRvSGV4SGVscCh0aGlzLmJsdWUpO1xuICAgIH07XG5cbiAgICBjb250cmFzdFJhdGlvKGJnQ29sb3IgOiBDb2xvck9iaikgeyBcbiAgICAgICAgbGV0IGZnQ29sb3I6IENvbG9yT2JqID0gdGhpcztcbiAgICAgICAgXG4gICAgICAgIGlmICh0eXBlb2YgKHRoaXMuYWxwaGEpICE9IFwidW5kZWZpbmVkXCIpXG4gICAgICAgICAgICBmZ0NvbG9yID0gdGhpcy5nZXRPdmVybGF5Q29sb3IoYmdDb2xvcik7XG4gICAgICAgICAgICAgXG4gICAgICAgIGxldCBsdW0xID0gZmdDb2xvci5yZWxhdGl2ZUx1bWluYW5jZSgpO1xuICAgICAgICBpZiAoIWJnQ29sb3IucmVsYXRpdmVMdW1pbmFuY2UpIHtcbiAgICAgICAgICAgIGxldCBzID0gXCJcIjtcbiAgICAgICAgICAgIGZvciAobGV0IGtleSBpbiBiZ0NvbG9yKSB7XG4gICAgICAgICAgICAgICAgcyArPSBrZXkgKyBcIlxcblwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYWxlcnQoYmdDb2xvcik7XG4gICAgICAgICAgICBhbGVydChzKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbHVtMiA9IGJnQ29sb3IucmVsYXRpdmVMdW1pbmFuY2UoKTtcbiAgICAgICAgbGV0IHJhdGlvID0gKGx1bTEgPiBsdW0yKSA/IChsdW0xICsgLjA1KSAvIChsdW0yICsgLjA1KSA6IChsdW0yICsgLjA1KSAvIChsdW0xICsgLjA1KTtcbiAgICAgICAgcmV0dXJuIHJhdGlvO1xuICAgIH07XG5cbiAgICByZWxhdGl2ZUx1bWluYW5jZSgpIDogbnVtYmVyIHtcbiAgICAgICAgbGV0IFIgPSB0aGlzLnJlZCAvIDI1NS4wO1xuICAgICAgICBsZXQgRyA9IHRoaXMuZ3JlZW4gLyAyNTUuMDtcbiAgICAgICAgbGV0IEIgPSB0aGlzLmJsdWUgLyAyNTUuMDtcbiAgICAgICAgUiA9IFIgPD0gLjA0MDQ1ID8gUiAvIDEyLjkyIDogTWF0aC5wb3coKFIgKyAuMDU1KSAvIDEuMDU1LCAyLjQpO1xuICAgICAgICBHID0gRyA8PSAuMDQwNDUgPyBHIC8gMTIuOTIgOiBNYXRoLnBvdygoRyArIC4wNTUpIC8gMS4wNTUsIDIuNCk7XG4gICAgICAgIEIgPSBCIDw9IC4wNDA0NSA/IEIgLyAxMi45MiA6IE1hdGgucG93KChCICsgLjA1NSkgLyAxLjA1NSwgMi40KTtcbiAgICAgICAgcmV0dXJuIDAuMjEyNiAqIFIgKyAwLjcxNTIgKiBHICsgMC4wNzIyICogQjtcbiAgICB9O1xuXG4gICAgbWl4KGNvbG9yMiA6IENvbG9yT2JqLCBwZXJjVGhpcyA6IG51bWJlcikge1xuICAgICAgICBpZiAodHlwZW9mICh0aGlzLmFscGhhKSA9PT0gXCJ1bmRlZmluZWRcIiAmJiB0eXBlb2YgKGNvbG9yMi5hbHBoYSkgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgQ29sb3JPYmooXG4gICAgICAgICAgICAgICAgcGVyY1RoaXMgKiB0aGlzLnJlZCArICgxIC0gcGVyY1RoaXMpICogY29sb3IyLnJlZCxcbiAgICAgICAgICAgICAgICBwZXJjVGhpcyAqIHRoaXMuZ3JlZW4gKyAoMSAtIHBlcmNUaGlzKSAqIGNvbG9yMi5ncmVlbixcbiAgICAgICAgICAgICAgICBwZXJjVGhpcyAqIHRoaXMuYmx1ZSArICgxIC0gcGVyY1RoaXMpICogY29sb3IyLmJsdWVcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgYWxwaGFUaGlzID0gdGhpcy5hbHBoYSA/IHRoaXMuYWxwaGEgOiAxO1xuICAgICAgICAgICAgbGV0IGFscGhhT3RoZXIgPSBjb2xvcjIuYWxwaGEgPyBjb2xvcjIuYWxwaGEgOiAxO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBDb2xvck9iaihcbiAgICAgICAgICAgICAgICBwZXJjVGhpcyAqIHRoaXMucmVkICsgKDEgLSBwZXJjVGhpcykgKiBjb2xvcjIucmVkLFxuICAgICAgICAgICAgICAgIHBlcmNUaGlzICogdGhpcy5ncmVlbiArICgxIC0gcGVyY1RoaXMpICogY29sb3IyLmdyZWVuLFxuICAgICAgICAgICAgICAgIHBlcmNUaGlzICogdGhpcy5ibHVlICsgKDEgLSBwZXJjVGhpcykgKiBjb2xvcjIuYmx1ZSxcbiAgICAgICAgICAgICAgICBwZXJjVGhpcyAqIGFscGhhVGhpcyArICgxIC0gcGVyY1RoaXMpICogYWxwaGFPdGhlclxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBnZXRPdmVybGF5Q29sb3IoYmdDb2xvciA6IENvbG9yT2JqKSB7XG4gICAgICAgIGlmICh0eXBlb2YgKHRoaXMuYWxwaGEpID09PSBcInVuZGVmaW5lZFwiIHx8IHRoaXMuYWxwaGEgPj0gMSkge1xuICAgICAgICAgICAgLy8gTm8gbWl4aW5nIHJlcXVpcmVkIC0gaXQncyBvcGFxdWVcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmFscGhhIDwgMCkge1xuICAgICAgICAgICAgLy9cdFx0SGFhYy5FcnJvci5sb2dFcnJvcihcIkludmFsaWQgYWxwaGEgdmFsdWVcIik7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIChiZ0NvbG9yLmFscGhhKSAhPSBcInVuZGVmaW5lZFwiICYmIGJnQ29sb3IuYWxwaGEgPCAxKSB7XG4gICAgICAgICAgICAvL1x0XHRIYWFjLkVycm9yLmxvZ0Vycm9yKFwiQ2Fubm90IG1peCB3aXRoIGEgYmFja2dyb3VuZCBhbHBoYVwiKTtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZXRWYWwgPSB0aGlzLm1peChiZ0NvbG9yLCB0aGlzLmFscGhhKTtcbiAgICAgICAgZGVsZXRlIHJldFZhbC5hbHBoYTsgXG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBmcm9tQ1NTQ29sb3IoY3NzU3R5bGVDb2xvcikge1xuICAgICAgICBsZXQgdGhpc1JlZCA9IC0xO1xuICAgICAgICBsZXQgdGhpc0dyZWVuID0gLTE7XG4gICAgICAgIGxldCB0aGlzQmx1ZSA9IC0xO1xuXG4gICAgICAgIGNzc1N0eWxlQ29sb3IgPSBjc3NTdHlsZUNvbG9yLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmIChjc3NTdHlsZUNvbG9yLnN0YXJ0c1dpdGgoXCJyZ2IoXCIpKSB7XG4gICAgICAgICAgICBsZXQgcmdiUmVnZXggPSAvXFxzKnJnYlxccypcXChcXHMqKFxcZCspXFxzKixcXHMqKFxcZCspXFxzKixcXHMqKFxcZCspXFxzKlxcKS87XG4gICAgICAgICAgICBsZXQgbSA9IGNzc1N0eWxlQ29sb3IubWF0Y2gocmdiUmVnZXgpO1xuICAgICAgICAgICAgaWYgKG0gPT09IG51bGwpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpc1JlZCA9IG1bMV07XG4gICAgICAgICAgICAgICAgdGhpc0dyZWVuID0gbVsyXTtcbiAgICAgICAgICAgICAgICB0aGlzQmx1ZSA9IG1bM107XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoY3NzU3R5bGVDb2xvci5zdGFydHNXaXRoKFwicmdiYShcIikpIHtcbiAgICAgICAgICAgIGxldCByZ2JSZWdleCA9IC9cXHMqcmdiYVxccypcXChcXHMqKFxcZCspXFxzKixcXHMqKFxcZCspXFxzKixcXHMqKFxcZCspXFxzKixcXHMqKC4rKVxccypcXCkvO1xuICAgICAgICAgICAgbGV0IG0gPSBjc3NTdHlsZUNvbG9yLm1hdGNoKHJnYlJlZ2V4KTtcbiAgICAgICAgICAgIGlmIChtID09PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXNSZWQgPSBtWzFdO1xuICAgICAgICAgICAgICAgIHRoaXNHcmVlbiA9IG1bMl07XG4gICAgICAgICAgICAgICAgdGhpc0JsdWUgPSBtWzNdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGNzc1N0eWxlQ29sb3IuY2hhckF0KDApICE9IFwiI1wiKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNzc1N0eWxlQ29sb3IgaW4gQ29sb3JVdGlsLkNTU0NvbG9yTG9va3VwKVxuICAgICAgICAgICAgICAgICAgICBjc3NTdHlsZUNvbG9yID0gQ29sb3JVdGlsLkNTU0NvbG9yTG9va3VwW2Nzc1N0eWxlQ29sb3JdO1xuICAgICAgICAgICAgICAgIGVsc2UgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgZnJvbUhleCA9IGZ1bmN0aW9uICh2YWwpIHtcbiAgICAgICAgICAgICAgICBsZXQgbG9va3VwID0ge1xuICAgICAgICAgICAgICAgICAgICBcImFcIjogMTAsXG4gICAgICAgICAgICAgICAgICAgIFwiYlwiOiAxMSxcbiAgICAgICAgICAgICAgICAgICAgXCJjXCI6IDEyLFxuICAgICAgICAgICAgICAgICAgICBcImRcIjogMTMsXG4gICAgICAgICAgICAgICAgICAgIFwiZVwiOiAxNCxcbiAgICAgICAgICAgICAgICAgICAgXCJmXCI6IDE1XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBsZXQgcmV0VmFsID0gMDtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbC5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICByZXRWYWwgPSByZXRWYWwgKiAxNiArXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJzZUludCh2YWwuY2hhckF0KGkpIGluIGxvb2t1cCA/IGxvb2t1cFt2YWwuY2hhckF0KGkpXSA6IHZhbC5jaGFyQXQoaSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNzc1N0eWxlQ29sb3IubGVuZ3RoID09PSA0KSB7XG4gICAgICAgICAgICAgICAgLy8gVGhlIHRocmVlLWRpZ2l0IFJHQiAoI3JnYikgaXMgY29udmVydGVkIHRvIHNpeC1kaWdpdCBmb3JtICgjcnJnZ2JiKSBieSByZXBsaWNhdGluZyBkaWdpdHNcbiAgICAgICAgICAgICAgICAvLyAoaHR0cHM6Ly93d3cudzMub3JnL1RSL2Nzcy1jb2xvci0zLyNyZ2ItY29sb3IpXG4gICAgICAgICAgICAgICAgY3NzU3R5bGVDb2xvciA9IFwiI1wiICsgY3NzU3R5bGVDb2xvci5jaGFyQXQoMSkucmVwZWF0KDIpICtcbiAgICAgICAgICAgICAgICAgICAgY3NzU3R5bGVDb2xvci5jaGFyQXQoMikucmVwZWF0KDIpICtcbiAgICAgICAgICAgICAgICAgICAgY3NzU3R5bGVDb2xvci5jaGFyQXQoMykucmVwZWF0KDIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpc1JlZCA9IGZyb21IZXgoY3NzU3R5bGVDb2xvci5zdWJzdHJpbmcoMSwgMykpO1xuICAgICAgICAgICAgdGhpc0dyZWVuID0gZnJvbUhleChjc3NTdHlsZUNvbG9yLnN1YnN0cmluZygzLCA1KSk7XG4gICAgICAgICAgICB0aGlzQmx1ZSA9IGZyb21IZXgoY3NzU3R5bGVDb2xvci5zdWJzdHJpbmcoNSwgNykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXcgQ29sb3JPYmoodGhpc1JlZCwgdGhpc0dyZWVuLCB0aGlzQmx1ZSk7XG4gICAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IEFSSUFEZWZpbml0aW9ucyB9IGZyb20gXCIuLi8uLi92Mi9hcmlhL0FSSUFEZWZpbml0aW9uc1wiO1xuaW1wb3J0IHsgQ2FjaGVVdGlsIH0gZnJvbSBcIi4vQ2FjaGVVdGlsXCI7XG5pbXBvcnQgeyBSdWxlQ29udGV4dEhpZXJhcmNoeSB9IGZyb20gXCIuLi9hcGkvSVJ1bGVcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4vQXJpYVV0aWxcIjtcbmltcG9ydCB7IEFjY05hbWVVdGlsIH0gZnJvbSBcIi4vQWNjTmFtZVV0aWxcIjtcbmltcG9ydCB7IFZpc1V0aWwgfSBmcm9tIFwiLi9WaXNVdGlsXCI7XG5pbXBvcnQgeyBET01VdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01VdGlsXCI7XG5pbXBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi4vLi4vdjIvZG9tL0RPTVdhbGtlclwiO1xuaW1wb3J0IHsgRnJhZ21lbnRVdGlsIH0gZnJvbSBcIi4uLy4uL3YyL2NoZWNrZXIvYWNjZXNzaWJpbGl0eS91dGlsL2ZyYWdtZW50XCI7XG5cbmV4cG9ydCBjbGFzcyBDb21tb25VdGlsIHtcblxuICAgIHB1YmxpYyBzdGF0aWMgaW5wdXRfdHlwZV93aXRoX3BsYWNlaG9sZGVyID0gW1widGV4dFwiLCBcInNlYXJjaFwiLCBcInRlbFwiLCBcInVybFwiLCBcImVtYWlsXCIsIFwicGFzc3dvcmRcIiwgXCJudW1iZXJcIl07XG4gICAgcHVibGljIHN0YXRpYyBpbnB1dF90ZXh0X3R5cGVzID0gW1xuICAgICAgICBcInRleHRcIiwgXCJmaWxlXCIsIFwicGFzc3dvcmRcIixcbiAgICAgICAgXCJjaGVja2JveFwiLCBcInJhZGlvXCIsXG4gICAgICAgIFwic2VhcmNoXCIsIFwidGVsXCIsIFwidXJsXCIsIFwiZW1haWxcIiwgIC8vSFRNTCA1LiBOb3RlOiB0eXBlID0gXCJoaWRkZW5cIiBkb2Vzbid0IHJlcXVpcmUgdGV4dFxuICAgICAgICBcImRhdGVcIiwgXCJudW1iZXJcIiwgXCJyYW5nZVwiLFxuICAgICAgICBcInRpbWVcIiwgXCJjb2xvclwiXG4gICAgXTtcbiAgICBwdWJsaWMgc3RhdGljIGlucHV0X3RpbWVfdHlwZXMgPSBbXG4gICAgICAgIFwiZGF0ZVwiLCBcIm1vbnRoXCIsIFwid2Vla1wiLCBcInRpbWVcIiwgXCJkYXRldGltZS1sb2NhbFwiXG4gICAgXTtcbiAgICBwdWJsaWMgc3RhdGljIGlucHV0X290aGVyX3R5cGVzID0gW1xuICAgICAgICBcInJhbmdlXCIsIFwiY29sb3JcIiwgXCJjaGVja2JveFwiLCBcInJhZGlvXCIsIFwiZmlsZVwiLCBcImltYWdlXCJcbiAgICBdO1xuICAgIHB1YmxpYyBzdGF0aWMgZm9ybV9idXR0b25fdHlwZXMgPSBbXG4gICAgICAgIFwiYnV0dG9uXCIsIFwicmVzZXRcIiwgXCJzdWJtaXRcIlxuICAgIF07XG5cbiAgICBwdWJsaWMgc3RhdGljIGZvcm1fbGFiZWxhYmxlX2VsZW1lbnRzID0gW1wiaW5wdXRcIiwgIFwidGV4dGFyZWFcIiwgXCJzZWxlY3RcIiwgXCJrZXlnZW5cIiwgXCJwcm9ncmVzc1wiLCBcIm1ldGVyXCIsIFwib3V0cHV0XCIsIFwiYnV0dG9uXCJdO1xuXG4gICAgcHVibGljIHN0YXRpYyB0YWJUYWdNYXAgPSB7XG4gICAgICAgIFwiYnV0dG9uXCI6IGZ1bmN0aW9uIChlbGVtZW50KTogYm9vbGVhbiB7XG4gICAgICAgICAgICByZXR1cm4gIWVsZW1lbnQuaGFzQXR0cmlidXRlKFwiZGlzYWJsZWRcIik7XG4gICAgICAgIH0sXG4gICAgICAgIFwiaWZyYW1lXCI6IHRydWUsXG4gICAgICAgIFwiaW5wdXRcIjogZnVuY3Rpb24gKGVsZW1lbnQpOiBib29sZWFuIHtcbiAgICAgICAgICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZShcImRpc2FibGVkXCIpIHx8IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwidHlwZVwiKSA9PT0gXCJoaWRkZW5cIikgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgaWYgKGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwidHlwZVwiKSA9PT0gXCJyYWRpb1wiKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwibmFtZVwiKTtcbiAgICAgICAgICAgICAgICBpZiAoIW5hbWUgfHwgbmFtZS50cmltKCkubGVuZ3RoID09PSAwKSByZXR1cm4gdHJ1ZTsgLy9zaW5nbGUgcmFkaW8sIG5vIGdyb3VwXG4gICAgICAgICAgICAgICAgbGV0IGRvYyA9IGVsZW1lbnQub3duZXJEb2N1bWVudDtcbiAgICAgICAgICAgICAgICBjb25zdCBncm91cCA9IGRvYy5xdWVyeVNlbGVjdG9yQWxsKFwiaW5wdXRbdHlwZT0ncmFkaW8nXVtuYW1lPSdcIiArIG5hbWUudHJpbSgpICtcIiddXCIpO1xuICAgICAgICAgICAgICAgIGlmIChncm91cC5sZW5ndGggPT09IDAgfHwgZ3JvdXAubGVuZ3RoID09PSAxKSByZXR1cm4gdHJ1ZTsgIC8vc2luZ2xlIHJhZGlvIHdpdGggdGhlIG5hbWUsIG5vIG90aGVycyBpbiBncm91cFxuXG4gICAgICAgICAgICAgICAgbGV0IGNoZWNrZWQgPSBudWxsO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZ3JvdXAubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKChncm91cFtpXSBhcyBIVE1MSW5wdXRFbGVtZW50KS5jaGVja2VkKVxuICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tlZCA9IGdyb3VwW2ldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvL29ubHkgbGFzdCBvbmUgYXBwbGllcyBpZiBtdWx0aXBsZSByYWRpb3Mgd2l0aCAnY2hlY2tlZCcgYXR0cmlidXRlc1xuICAgICAgICAgICAgICAgIGlmIChjaGVja2VkICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChET01VdGlsLnNhbWVOb2RlKGNoZWNrZWQsIGVsZW1lbnQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiBub3RoaW5nIGNoZWNrZWQgeWV0LCByZXR1cm4gdHJ1ZSBpZiBpdCdzIHRoZSBmaXJzdCBlbGVtZW50XG4gICAgICAgICAgICAgICAgICAgIGlmIChET01VdGlsLnNhbWVOb2RlKGdyb3VwWzBdLCBlbGVtZW50KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlICAgXG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0sXG4gICAgICAgIFwic2VsZWN0XCI6IGZ1bmN0aW9uIChlbGVtZW50KTogYm9vbGVhbiB7XG4gICAgICAgICAgICByZXR1cm4gIWVsZW1lbnQuaGFzQXR0cmlidXRlKFwiZGlzYWJsZWRcIik7XG4gICAgICAgIH0sXG4gICAgICAgIFwidGV4dGFyZWFcIjogZnVuY3Rpb24gKGVsZW1lbnQpOiBib29sZWFuIHtcbiAgICAgICAgICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZShcImRpc2FibGVkXCIpIHx8IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwidHlwZVwiKSA9PT0gXCJoaWRkZW5cIikgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlwiZGl2XCI6IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJjb250ZW50ZWRpdGFibGVcIik7XG4gICAgICAgIH0sKi9cbiAgICAgICAgXCJhXCI6IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgICAgICAvLyB4bGluazpocmVmPz8gc2VlIHN2Z1xuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuaGFzQXR0cmlidXRlKFwiaHJlZlwiKTtcbiAgICAgICAgfSxcbiAgICAgICAgXCJhcmVhXCI6IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJocmVmXCIpO1xuICAgICAgICB9LFxuICAgICAgICBcImF1ZGlvXCI6IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJjb250cm9sc1wiKTtcbiAgICAgICAgfSxcbiAgICAgICAgXCJ2aWRlb1wiOiBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuaGFzQXR0cmlidXRlKFwiY29udHJvbHNcIik7XG4gICAgICAgIH0sXG4gICAgICAgIFwic3VtbWFyeVwiOiBmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgICAgLy8gZmlyc3Qgc3VtbWFyeSBjaGlsZCBvZiBhIGRldGFpbHMgZWxlbWVudCBpcyBhdXRvbWF0aWNhbGx5IGZvY3VzYWJsZSBcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50LnBhcmVudEVsZW1lbnQgJiYgZWxlbWVudC5wYXJlbnRFbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdkZXRhaWxzJ1xuICAgICAgICAgICAgICAgICYmIERPTVV0aWwuc2FtZU5vZGUoWy4uLmVsZW1lbnQucGFyZW50RWxlbWVudC5jaGlsZHJlbl0uZmlsdGVyKGVsZW0gPT4gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnc3VtbWFyeScpWzBdLCBlbGVtZW50KTtcbiAgICAgICAgfSxcbiAgICAgICAgXCJkZXRhaWxzXCI6IGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgICAgICAvL2RldGFpbHMgZWxlbWVudCB3aXRob3V0IGEgZGlyZWN0IHN1bW1hcnkgY2hpbGQgaXMgYXV0b21hdGljYWxseSBmb2N1c2FibGVcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50LmNoaWxkcmVuICYmIFsuLi5lbGVtZW50LmNoaWxkcmVuXS5maWx0ZXIoZWxlbSA9PiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdzdW1tYXJ5JykubGVuZ3RoID09PSAwO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyB3b3JkQ291bnQoc3RyKTogbnVtYmVyIHtcbiAgICAgICAgc3RyID0gc3RyLnRyaW0oKTtcbiAgICAgICAgaWYgKHN0ci5sZW5ndGggPT09IDApIHJldHVybiAwO1xuICAgICAgICByZXR1cm4gc3RyLnNwbGl0KC9cXHMrL2cpLmxlbmd0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBOb3RlIHRoYXQgdGhpcyBvbmx5IGRldGVjdHMgaWYgdGhlIGVsZW1lbnQgaXRzZWxmIGlzIGluIHRoZSB0YWIgb3JkZXIuXG4gICAgICogSG93ZXZlciwgdGhpcyBlbGVtZW50IG1heSBkZWxlZ2F0ZSBmb2N1cyB0byBhbm90aGVyIGVsZW1lbnQgdmlhIGFyaWEtYWN0aXZlZGVzY2VuZGFudC5cbiAgICAgKiBBbHNvLCBmb2N1cyB2YXJpZXMgYnkgYnJvd3Nlci4uLiBzdGlja2luZyB0byB0aGluZ3MgdGhhdCBhcmUgZm9jdXNhYmxlIG9uIENocm9tZSBhbmQgRmlyZWZveC5cbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzVGFiYmFibGUoZWxlbWVudCkge1xuICAgICAgICAvLyBVc2luZyBodHRwczovL2FsbHlqcy5pby9kYXRhLXRhYmxlcy9mb2N1c2FibGUuaHRtbFxuICAgICAgICAvLyBIYW5kbGUgdGhlIGV4cGxpY2l0IGNhc2VzIGZpcnN0XG4gICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKGVsZW1lbnQpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZShcImluZXJ0XCIpIHx8IERPTVV0aWwuZ2V0QW5jZXN0b3JXaXRoQXR0cmlidXRlKGVsZW1lbnQsIFwiaW5lcnRcIiwgXCJcIikpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKFwidGFiaW5kZXhcIikpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJzZUludChlbGVtZW50LmdldEF0dHJpYnV0ZShcInRhYmluZGV4XCIpKSA+PSAwO1xuICAgICAgICB9XG4gICAgICAgIC8vIEV4cGxpY2l0IGNhc2VzIGhhbmRsZWQgLSBub3cgdGhlIGltcGxpY2l0XG4gICAgICAgIGxldCBub2RlTmFtZSA9IGVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgaWYgKG5vZGVOYW1lIGluIENvbW1vblV0aWwudGFiVGFnTWFwKSB7XG4gICAgICAgICAgICBsZXQgcmV0VmFsID0gQ29tbW9uVXRpbC50YWJUYWdNYXBbbm9kZU5hbWVdO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiAocmV0VmFsKSA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgcmV0VmFsID0gcmV0VmFsKGVsZW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZShcImNvbnRlbnRlZGl0YWJsZVwiKSkgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUZXN0IGlmIHRoZSBlbGUgbm9kZSBpcyBmb2N1c2FibGVcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzRm9jdXNhYmxlKGVsZSkge1xuICAgICAgICBpZiAoZWxlID09PSBcInVuZGVmaW5lZFwiIHx8IGVsZSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBDb21tb25VdGlsLmlzVGFiYmFibGUoZWxlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBOb3RlIHRoYXQgdGhpcyBvbmx5IGRldGVjdHMgaWYgdGhlIGVsZW1lbnQgaXRzZWxmIGlzIGludGVyYWN0aXZlLCBidXQgbm90IG9uY2xpY2sgZXZlbnQuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpc0NsaWNrYWJsZShlbGVtZW50KSB7XG4gICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKGVsZW1lbnQpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIFxuICAgICAgICAvLyBuYXRpdmUgZm9jdXNhYmxlIGVsZW1lbnRcbiAgICAgICAgbGV0IG5vZGVOYW1lID0gZWxlbWVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAobm9kZU5hbWUgaW4gQ29tbW9uVXRpbC50YWJUYWdNYXApIHtcbiAgICAgICAgICAgIGxldCByZXRWYWwgPSBDb21tb25VdGlsLnRhYlRhZ01hcFtub2RlTmFtZV07XG4gICAgICAgICAgICBpZiAodHlwZW9mIChyZXRWYWwpID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICByZXRWYWwgPSByZXRWYWwoZWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgICAgICB9IGVsc2UgeyBcbiAgICAgICAgICAgIC8vY3VzdG9tIHdpZGdldFxuICAgICAgICAgICAgaWYgKEFyaWFVdGlsLmlzV2lkZ2V0KGVsZW1lbnQpICYmIGVsZW1lbnQuaGFzQXR0cmlidXRlKFwidGFiaW5kZXhcIikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0gXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlOyAgXG4gICAgfVxuXG4gICAgLyogXG4gICAgICogZ2V0IGNvbmZsaWN0IEFyaWEgYW5kIEh0bWwgYXR0cmlidXRlc1xuICAgICAqIHJldHVybjogYSBsaXN0IG9mIEFyaWEgYW5kIEh0bWwgYXR0cmlidXRlIHBhaXJzIHRoYXQgYXJlIGNvbmZsaWN0XG4gICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzVGFibGVEZXNjZW5kYW50KGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KSB7XG4gICAgICAgIGlmICghY29udGV4dEhpZXJhcmNoaWVzKSByZXR1cm4gbnVsbDtcblxuICAgICAgICByZXR1cm4gY29udGV4dEhpZXJhcmNoaWVzW1wiYXJpYVwiXS5maWx0ZXIoaGllciA9PiBbXCJ0YWJsZVwiLCBcImdyaWRcIiwgXCJ0cmVlZ3JpZFwiXS5pbmNsdWRlcyhoaWVyLnJvbGUpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHRhYkluZGV4TEVaZXJvKGVsZW0pIHtcbiAgICAgICAgaWYgKENvbW1vblV0aWwuaGFzQXR0cmlidXRlKGVsZW0sIFwidGFiaW5kZXhcIikpIHtcbiAgICAgICAgICAgIGlmIChlbGVtLmdldEF0dHJpYnV0ZShcInRhYmluZGV4XCIpLm1hdGNoKC9eLT9cXGQrJC8pKSB7XG4gICAgICAgICAgICAgICAgbGV0IHRhYmluZGV4VmFsdWUgPSBwYXJzZUludChlbGVtLmdldEF0dHJpYnV0ZShcInRhYmluZGV4XCIpKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGFiaW5kZXhWYWx1ZSA9PT0gMCB8fCB0YWJpbmRleFZhbHVlID09PSAtMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogZ2V0IG51bWJlciBvZiB0YWJiYWJsZSBjaGlsZHJlblxuICAgICAqIEBwYXJhbSBlbGVtZW50IFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0VGFiYmFibGVDaGlsZHJlbihlbGVtZW50KSB7XG4gICAgICAgIGxldCBjb3VudCA9IDA7XG4gICAgICAgIC8vIElmIG5vZGUgaGFzIGNoaWxkcmVuLCBsb29rIGZvciB0YWIgc3RvcHMgaW4gdGhlIGNoaWxkcmVuXG4gICAgICAgIGlmIChlbGVtZW50LmZpcnN0Q2hpbGQgfHwgZWxlbWVudC5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09PSBcIklGUkFNRVwiKSB7XG4gICAgICAgICAgICBsZXQgbncgPSBuZXcgRE9NV2Fsa2VyKGVsZW1lbnQpO1xuICAgICAgICAgICAgd2hpbGUgKG53Lm5leHROb2RlKCkgJiYgbncubm9kZSAhPSBlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgaWYgKG53Lm5vZGUubm9kZVR5cGUgPT0gMSAmJiAhbncuYkVuZFRhZyAmJiBDb21tb25VdGlsLmlzVGFiYmFibGUobncubm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgKytjb3VudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvdW50O1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgbm9ybWFsaXplU3BhY2luZyhzKSB7XG4gICAgICAgIGlmICghcykgcmV0dXJuICcnO1xuICAgICAgICByZXR1cm4gcy50cmltKCkucmVwbGFjZSgvXFxzKy9nLCAnICcpO1xuICAgIH07XG5cbiAgICAvL1RPRE86IGZ1bmN0aW9uIGRvZXMgbm90IGhhbmRsZSBlcXVpdmFsZW50cyBmb3Igcm9sZXM6IHJvdywgbGluaywgaGVhZGVyLCBidXR0b25cbiAgICAvLyBCdXQgaXQgbWF5IG5vdCBoYXZlIHRvLiBCdWcgcmVwb3J0cyBoYXZlIGJlZW4gYWJvdXQgcmFkaW8gYnV0dG9ucyBhbmQgY2hlY2tib3hlcy5cbiAgICBwdWJsaWMgc3RhdGljIGlzSHRtbEVxdWl2KG5vZGUsIGh0bWxFcXVpdikge1xuICAgICAgICBsZXQgcmV0VmFsID0gZmFsc2U7XG4gICAgICAgIGlmIChub2RlKSB7XG4gICAgICAgICAgICBsZXQgbm9kZU5hbWUgPSBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBpZiAobm9kZU5hbWUgPT09IFwiaW5wdXRcIikge1xuICAgICAgICAgICAgICAgIGxldCB0eXBlID0gbm9kZS5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGh0bWxFcXVpdi5pbmRleE9mKFwiY2hlY2tib3hcIikgIT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbCA9IHR5cGUgPT09IFwiY2hlY2tib3hcIjtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChodG1sRXF1aXYuaW5kZXhPZihcInJhZGlvXCIpICE9IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXRWYWwgPSB0eXBlID09PSBcInJhZGlvXCI7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIG5vbkV4aXN0YW50SURzKG5vZGUsIHRhcmdldGlkcykge1xuICAgICAgICBsZXQgcmV0dXJubm90Zm91bmRpZHMgPSAnJztcbiAgICAgICAgaWYgKENvbW1vblV0aWwubm9ybWFsaXplU3BhY2luZyh0YXJnZXRpZHMpLmxlbmd0aCA8IDEpIHJldHVybiByZXR1cm5ub3Rmb3VuZGlkcztcblxuICAgICAgICBsZXQgdGFyZ2V0QXJyYXkgPSB0YXJnZXRpZHMuc3BsaXQoXCIgXCIpO1xuICAgICAgICBsZXQgZG9jID0gbm9kZS5vd25lckRvY3VtZW50O1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhcmdldEFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgeHAgPSBcIi8vKltAaWQ9J1wiICsgdGFyZ2V0QXJyYXlbaV0gKyBcIiddXCI7XG4gICAgICAgICAgICBsZXQgeHBhdGhSZXN1bHQgPSBkb2MuZXZhbHVhdGUoeHAsIG5vZGUsIGRvYy5kZWZhdWx0TlNSZXNvbHZlciwgMCAvKiBYUGF0aFJlc3VsdC5BTllfVFlQRSAqLywgbnVsbCk7XG4gICAgICAgICAgICBsZXQgciA9IHhwYXRoUmVzdWx0Lml0ZXJhdGVOZXh0KCk7XG4gICAgICAgICAgICBpZiAoIXIpIHJldHVybm5vdGZvdW5kaWRzICs9IHRhcmdldEFycmF5W2ldICsgJywgJztcbiAgICAgICAgfVxuICAgICAgICBpZiAoQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKHJldHVybm5vdGZvdW5kaWRzKS5sZW5ndGggPj0gMilcbiAgICAgICAgICAgIHJldHVybm5vdGZvdW5kaWRzID0gcmV0dXJubm90Zm91bmRpZHMuc3Vic3RyaW5nKDAsIHJldHVybm5vdGZvdW5kaWRzLmxlbmd0aCAtIDIpO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgICByZXR1cm5ub3Rmb3VuZGlkcyA9ICcnO1xuICAgICAgICByZXR1cm4gcmV0dXJubm90Zm91bmRpZHM7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXREb2NFbGVtZW50c0J5VGFnKGVsZW0sIHRhZ05hbWUpIHtcbiAgICAgICAgbGV0IGRvYyA9IEZyYWdtZW50VXRpbC5nZXRPd25lckZyYWdtZW50KGVsZW0pIGFzIGFueTtcbiAgICAgICAgdGFnTmFtZSA9IHRhZ05hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgbGV0IGNhY2hlID0gQ2FjaGVVdGlsLmdldENhY2hlKGRvYywgXCJSUFRfRE9DRUxFTVNCWVRBR1wiLCB7fSk7XG4gICAgICAgIGlmICghKHRhZ05hbWUgaW4gY2FjaGUpKSB7XG4gICAgICAgICAgICBjYWNoZVt0YWdOYW1lXSA9IGRvYy5xdWVyeVNlbGVjdG9yQWxsKHRhZ05hbWUpO1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGRvYywgXCJSUFRfRE9DRUxFTVNCWVRBR1wiLCBjYWNoZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNhY2hlW3RhZ05hbWVdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGdldCBhIGxpc3Qgb2YgYWxsIHRoZSBjaGlsZCBlbGVtbnRzIHdoaWNoIG1hdGNoIHRoZSB0YWdcbiAgICAgKiBuYW1lIHByb3ZpZGVkLlxuICAgICAqXG4gICAgICogTm90ZTogVGhpcyBpcyBhIHdyYXBwZXIgZnVuY3Rpb24gdG86IEFyaWFVdGlsLmdldENoaWxkQnlUYWdIaWRkZW5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBwYXJlbnRFbGVtIC0gVGhlIHBhcmVudCBlbGVtZW50XG4gICAgICogQHBhcm0ge3N0cmluZ30gdGFnTmFtZSAtIFRoZSB0YWcgdG8gc2VhcmNoIGZvciB1bmRlciB0aGUgcGFyZW50IGVsZW1lbnRcbiAgICAgKiBAcGFybSB7Ym9vbGVhbn0gaWdub3JlSGlkZGVuIC0gdHJ1ZSBpZiBoaWRkZW4gZWxlbWVudHMgd2l0aCB0aGUgdGFnIHNob3VsZCBpZ25vcmVkIGZyb20gdGhlIGxpc3RcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgaWYgdGhlIGhpZGRlbiBlbGVtZW50cyBzaG91bGQgYmUgYWRkZWRcbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0xpc3R9IHJldFZhbCAtIGxpc3Qgb2YgYWxsIHRoZSBlbGVtZW50cyB3aGljaCBtYXRjaGVkIHRoZSB0YWcgdW5kZXIgdGhlIHBhcmVudCB0aGF0IHdlcmUgcHJvdmlkZWQuXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldENoaWxkQnlUYWcocGFyZW50RWxlbSwgdGFnTmFtZSkge1xuICAgICAgICByZXR1cm4gQ29tbW9uVXRpbC5nZXRDaGlsZEJ5VGFnSGlkZGVuKHBhcmVudEVsZW0sIHRhZ05hbWUsIGZhbHNlLCBmYWxzZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZ2V0IGEgbGlzdCBvZiBhbGwgdGhlIGNoaWxkIGVsZW1udHMgd2hpY2ggbWF0Y2ggdGhlIHRhZ1xuICAgICAqIG5hbWUgcHJvdmlkZWQuXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gcGFyZW50RWxlbSAtIFRoZSBwYXJlbnQgZWxlbWVudFxuICAgICAqIEBwYXJtIHtzdHJpbmd9IHRhZ05hbWUgLSBUaGUgdGFnIHRvIHNlYXJjaCBmb3IgdW5kZXIgdGhlIHBhcmVudCBlbGVtZW50XG4gICAgICogQHBhcm0ge2Jvb2xlYW59IGlnbm9yZUhpZGRlbiAtIHRydWUgaWYgaGlkZGVuIGVsZW1lbnRzIHdpdGggdGhlIHRhZyBzaG91bGQgaWdub3JlZCBmcm9tIHRoZSBsaXN0XG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIGlmIHRoZSBoaWRkZW4gZWxlbWVudHMgc2hvdWxkIGJlIGFkZGVkXG4gICAgICogQHBhcm0ge2Jvb2x9IGNvbnNpZGVySGlkZGVuU2V0dGluZyAtIHRydWUgb3IgZmFsc2UgYmFzZWQgb24gaWYgaGlkZGVuIHNldHRpbmcgc2hvdWxkIGJlIGNvbnNpZGVyZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtMaXN0fSByZXRWYWwgLSBsaXN0IG9mIGFsbCB0aGUgZWxlbWVudHMgd2hpY2ggbWF0Y2hlZCB0aGUgdGFnIHVuZGVyIHRoZSBwYXJlbnQgdGhhdCB3ZXJlIHByb3ZpZGVkLlxuICAgICAqXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRDaGlsZEJ5VGFnSGlkZGVuKHBhcmVudEVsZW0sIHRhZ05hbWUsIGlnbm9yZUhpZGRlbiwgY29uc2lkZXJIaWRkZW5TZXR0aW5nKSB7XG4gICAgICAgIC8vIFZhcmlhYmxlIERlY2xlcmF0aW9uXG4gICAgICAgIGxldCByZXRWYWwgPSBbXTtcbiAgICAgICAgbGV0IGNoaWxkID0gcGFyZW50RWxlbS5maXJzdENoaWxkO1xuXG4gICAgICAgIC8vIExvb3Agb3ZlciBhbGwgdGhlIGNoaWxkIGVsZW1lbnRzIG9mIHRoZSBwYXJlbnQgdG8gYnVpbGQgYSBsaXN0IG9mIGFsbCB0aGUgZWxlbWVudHMgdGhhdFxuICAgICAgICAvLyBtYXRjaCB0aGUgdGFnTmFtZSBwcm92aWRlZFxuICAgICAgICB3aGlsZSAoY2hpbGQgIT0gbnVsbCkge1xuXG4gICAgICAgICAgICAvLyBPbmx5IGluY2x1ZGUgdGhlIGNoaWxkcmVuIGludG8gdGhlIHJldHVybiBhcnJheSBpZiB0aGV5IG1hdGNoIHdpdGggdGFnbmFtZS5cbiAgICAgICAgICAgIGlmIChjaGlsZC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSB0YWdOYW1lKSB7XG5cbiAgICAgICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IGlnbm9yZWhpZGRlbiB3YXMgc2V0IHRvIHRydWUsIHRoZW4gcGVyZm9ybSBhIGlzTm9kZVZpc2libGUgY2hlY2tcbiAgICAgICAgICAgICAgICAvLyBhbmQgaW4gdGhlIGNhc2UgdGhlIG5vZGUgaXMgbm90IHZpc2lsYmxlIHdlIG1vcmUgdG8gdGhlc2VzIHRoZW4gbW92ZSB0byB0aGUgbmV4dCBub2RlLlxuICAgICAgICAgICAgICAgIC8vIFBlcmZvcm0gYSBjb3VwbGUgb2YgY2hlY2tzIHRvIGRldGVybWluZSBpZiBoaWRkZW4gZWxlbWVudHMgc2hvdWxkIGJlIGlnbm9yZWQgb3Igbm90LlxuICAgICAgICAgICAgICAgIC8vICAxLiBXaGVuIGlnbm9yZUhpZGRlbiBpcyBzZXQgdG8gdHJ1ZSB1cGZyb250LCB0aGVuIHBlcmZvcm0gYSBpc05vZGVWaXNpYmxlXG4gICAgICAgICAgICAgICAgLy8gIDIuIElmIGNvbnNpZGVySGlkZGVuU2V0dGluZyBvcHRpb24gaXMgc2V0IHRvIHRydWUgdGhlbiB3ZSBwZXJmb3JtIHRoZSBjaGVjayB0byBjb25zaWRlciB0aGVcbiAgICAgICAgICAgICAgICAvLyAgICAgQ2hlY2sgSGlkZGVuIENvbnRlbnQgdGhhdCBpcyBwcm92aWRlZC5cbiAgICAgICAgICAgICAgICAvLyAgMi4xLiBPbmx5IHJ1biBpc05vZGVWaXNpYmxlIGNoZWNrIGlmIGhpZGRlbiBjb250ZW50IHNob3VsZCBOT1QgYmUgY2hlY2tlZC4gSW4gdGhlIGNhc2UgdGhhdCBoaWRkZW4gY29udGVudCBpcyB0byxcbiAgICAgICAgICAgICAgICAvLyAgICAgICBiZSBzY2FubmVkIHRoZW4gd2UgY2FuIGp1c3Qgc2NhbiBldmVyeXRoaW5nIGFzIG5vcm1hbC4gSW4gdGhlIGNhc2UgdGhhdCB0aGUgY3VycmVudCBub2RlIGlzIGhpZGRlbiB3ZSBkbyBub3RcbiAgICAgICAgICAgICAgICAvLyAgICAgICBhZGQgaXQgdG8gdGhlIHJvbGVUb0VsZW1zIGhhc2ggYXQgYWxsIG9yIGV2ZW4gZG8gYW55IGNoZWNraW5nIGZvciBpdCBhdCBhbGwuXG4gICAgICAgICAgICAgICAgaWYgKChpZ25vcmVIaWRkZW4gfHwgKGNvbnNpZGVySGlkZGVuU2V0dGluZyAmJiAhQ29tbW9uVXRpbC5zaG91bGRDaGVja0hpZGRlbkNvbnRlbnQoY2hpbGQpKSkgJiYgIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShjaGlsZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gTW92ZSBvbiB0byB0aGUgbmV4dCBlbGVtZW50XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkID0gY2hpbGQubmV4dFNpYmxpbmc7XG5cbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gUHVzaCB0aGUgZWxlbWVudFxuICAgICAgICAgICAgICAgIHJldFZhbC5wdXNoKGNoaWxkKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gTW92ZSB0byB0aGUgbmV4dCBzaWJsaW5nIGVsZW1lbnRcbiAgICAgICAgICAgIGNoaWxkID0gY2hpbGQubmV4dFNpYmxpbmc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJldFZhbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZmluZGluZyBhIGxpc3Qgb2YgZWxlbWVudHMgdGhhdCBtYXRjaCBnaXZlbiByb2xlcyhzKS5cbiAgICAgICAgICogVGhpcyBmdW5jdGlvbiBieSBkZWZhdWx5IHdpbGwgbm90IGNvbnNpZGVyIENoZWNrIEhpZGRlbiBTZXR0aW5nIGF0IGFsbC5cbiAgICAgICAgICogVGhpcyBmdW5jdGlvbiBieSBkZWZhdWx5IHdpbGwgbm90IGNvbnNpZGVyIGltcGxpY2l0IHJvbGVzLlxuICAgICAgICAgKiBOb3RlOiBUaGlzIGlzIGEgd3JhcHBlciBmdW5jdGlvbiB0bzogQXJpYVV0aWwuZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW5cbiAgICAgICAgICpcbiAgICAgICAgICogQHBhcm0ge2RvY3VtZW50fSBkb2MgLSBUaGUgZG9jdW1lbnQgbm9kZVxuICAgICAgICAgKiBAcGFybSB7bGlzdCBvciBzdHJpbmd9IHJvbGVzIC0gTGlzdCBvciBzaW5nbGUgcm9sZSBmb3Igd2hpY2ggdG8gcmV0dXJuIGVsZW1lbnRzIGJhc2VkIG9uLlxuICAgICAgICAgKlxuICAgICAgICAgKiBAcmV0dXJuIHtMaXN0fSByZXRWYWwgLSBsaXN0IG9mIGFsbCB0aGUgZWxlbWVudHMgd2hpY2ggbWF0Y2hlZCB0aGUgcm9sZShzKSB0aGF0IHdlcmUgcHJvdmlkZWQuXG4gICAgICAgICAqXG4gICAgICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldEVsZW1lbnRzQnlSb2xlKGRvYywgcm9sZXMpIHtcbiAgICAgICAgcmV0dXJuIENvbW1vblV0aWwuZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW4oZG9jLCByb2xlcywgZmFsc2UsIGZhbHNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBmaW5kaW5nIGEgbGlzdCBvZiBlbGVtZW50cyB0aGF0IG1hdGNoIGdpdmVuIHJvbGVzKHMpLlxuICAgICAqIFRoaXMgZnVuY3Rpb24gYXNsbyBmaW5kcyBlbGVtZW50cyB3aXRoIGltcGxpY2l0IHJvbGVzLlxuICAgICAqIFRoaXMgZnVuY3Rpb24gd2lsbCBhbHNvIGNvbnNpZGVyIGVsZW1lbnRzIHRoYXQgYXJlIGhpZGRlbiBiYXNlZCBvbiB0aGUgaWYgdGhlIENoZWNrXG4gICAgICogSGlkZGVuIENvbnRlbnQgc2V0dGluZ3Mgc2hvdWxkIGJlIGNvbnNpZGVyZWQgb3Igbm90LlxuICAgICAqXG4gICAgICogQHBhcm0ge2RvY3VtZW50fSBkb2MgLSBUaGUgZG9jdW1lbnQgbm9kZVxuICAgICAqIEBwYXJtIHtsaXN0IG9yIHN0cmluZ30gcm9sZXMgLSBMaXN0IG9yIHNpbmdsZSByb2xlIGZvciB3aGljaCB0byByZXR1cm4gZWxlbWVudHMgYmFzZWQgb24uXG4gICAgICogQHBhcm0ge2Jvb2x9IGNvbnNpZGVySGlkZGVuU2V0dGluZyAtIHRydWUgb3IgZmFsc2UgYmFzZWQgb24gaWYgaGlkZGVuIHNldHRpbmcgc2hvdWxkIGJlIGNvbnNpZGVyZWQuXG4gICAgICogQHBhcm0ge2Jvb2x9IGNvbnNpZGVySW1wbGljaXRSb2xlcyAtIHRydWUgb3IgZmFsc2UgYmFzZWQgb24gaWYgaW1wbGljaXQgcm9sZXMgc2V0dGluZyBzaG91bGQgYmUgY29uc2lkZXJlZC5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge0xpc3R9IHJldFZhbCAtIGxpc3Qgb2YgYWxsIHRoZSBlbGVtZW50cyB3aGljaCBtYXRjaGVkIHRoZSByb2xlKHMpIHRoYXQgd2VyZSBwcm92aWRlZC5cbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0RWxlbWVudHNCeVJvbGVIaWRkZW4oZG9jLCByb2xlcywgY29uc2lkZXJIaWRkZW5TZXR0aW5nLCBjb25zaWRlckltcGxpY2l0Um9sZXM/KSB7XG4gICAgICAgIFxuICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IHRoZSByb2xlIHRvIGVsZW1lbnQgYXNzb2ljYXRpb24gaXMgYWxyZWFkeSBtYWRlLCBhbmQgYXZhaWxhYmxlIGluIHRoZSBnbG9iYWwgaGFzQXR0cmlidXRlXG4gICAgICAgIC8vIHdlIGNhbiBqdXN0IHVzZSB0aGF0IG9uZSBpbnN0ZWFkIG9mIGJ1aWxkaW5nIGEgbmV3IG9uZS5cbiAgICAgICAgbGV0IHJvbGVUb0VsZW1zID0gbnVsbDtcbiAgICAgICAgaWYgKGNvbnNpZGVySW1wbGljaXRSb2xlcykge1xuICAgICAgICAgICAgcm9sZVRvRWxlbXMgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUoZG9jLCBcIkFyaWFVdGlsX0dFVEVMRU1FTlRTQllfUk9MRV9JTVBMSUNJVFwiLCBudWxsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJvbGVUb0VsZW1zID0gQ2FjaGVVdGlsLmdldENhY2hlKGRvYywgXCJBcmlhVXRpbF9HRVRFTEVNRU5UU0JZX1JPTEVcIiwgbnVsbCk7XG4gICAgICAgIH1cblxuXG4gICAgICAgIC8vIEJ1aWxkIHRoZSBuZXcgcm9sZSB0byBlbGVtZW50LCB0aGlzIGlzIHdoZXJlIHdlIGxvb3AgdGhyb3VnaCBhbGwgdGhlIGVsZW1lbnRzIGFuZCBleHRyYWN0IGFsbCB0aGVcbiAgICAgICAgLy8gZWxlbWVudHMgYnNhZWQgb24gcm9sZXMuXG4gICAgICAgIGlmIChyb2xlVG9FbGVtcyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gUmUtaW5pdGlhbGl6ZSB0aGUgcm9sZVRvRWxlbXMgaGFzaFxuICAgICAgICAgICAgcm9sZVRvRWxlbXMgPSB7fTtcblxuICAgICAgICAgICAgLy8gR2V0IHRoZSBib2R5IG9mIHRoZSBkb2NcbiAgICAgICAgICAgIGxldCByb290ID0gZG9jLmJvZHk7XG5cbiAgICAgICAgICAgIC8vIEtlZXAgbG9vcGluZyB1bnRpbCB3ZSBhcmUgYXQgdGhlIHZlcnkgcGFyZW50IG5vZGUgb2YgdGhlIGVudGlyZSBwYWdlLCBzbyB0aGF0IHdlIGNhbiBsb29wIHRocm91Z2hcbiAgICAgICAgICAgIC8vIGFsbCB0aGUgbm9kZXMuXG4gICAgICAgICAgICB3aGlsZSAoRE9NV2Fsa2VyLnBhcmVudE5vZGUocm9vdCkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIHBhcmVudE5vZGVcbiAgICAgICAgICAgICAgICByb290ID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUocm9vdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBCdWlsZCBhIG5vZGV3YWx0ZXIgYmFzZWQgb2YgdGhlIHJvb3Qgbm9kZSwgdGhpcyBub2RlIHdhbHRlciB3aWxsIGJlIHVzZSBsb29wIG92ZXIgYWxsIHRoZSBub2Rlc1xuICAgICAgICAgICAgLy8gYW5kIGJ1aWxkIHRoZSByb2xlcyB0byBFbGVtZW50IGNvcmFsYXRpb25cbiAgICAgICAgICAgIGxldCBudyA9IG5ldyBET01XYWxrZXIocm9vdCk7XG4gICAgICAgICAgICAvLyBMb29wIG92ZXIgdGhlIGVudGlyZSBkb2MvbGlzdCBvZiBub2RlcyB0byBidWlsZCB0aGUgcm9sZSB0byBlbGVtZW50IG1hcFxuICAgICAgICAgICAgLy8gTm90ZTogVGhpcyB3aWxsIGJ1aWxkIGFuIHJvbGVUb0VsZW1zIGhhc2ggd2hpY2ggaXMgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQuXG4gICAgICAgICAgICAvLyByb2xlVG9FbGVtcyA9IHtcbiAgICAgICAgICAgIC8vICAgIGRvY3VtZW50OiBbe2Rpdn0se2FiYnJ9LHt2YXJ9XSxcbiAgICAgICAgICAgIC8vICAgIG1haW46IFt7ZGl2fV0sXG4gICAgICAgICAgICAvLyAgICBuYXZpZ2F0aW9uOiBbe2Rpdn1dXG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICB3aGlsZSAobncubmV4dE5vZGUoKSkge1xuICAgICAgICAgICAgICAgIGlmICghbncuZWxlbSgpKSBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAvLyBPbmx5IGNoZWNrIHRoZSBlbGVtZW50cyB3aGljaCBoYXZlIHRoZSByb2xlIGF0dHJpYnV0ZSBhc3NpY2lhdGVkIHRvIHRoZW1cbiAgICAgICAgICAgICAgICBpZiAoIW53LmJFbmRUYWcpIHtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgd1JvbGVzID0gW107XG4gICAgICAgICAgICAgICAgICAgIC8vY2hlY2sgaWYgdGhlIG5vZGUgaGFzIHJvbGUgYXR0cmlidXRlc1xuICAgICAgICAgICAgICAgICAgICBpZiAobncuZWxlbSgpICYmIG53LmVsZW0oKS5oYXNBdHRyaWJ1dGUoXCJyb2xlXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBFeHRyYWN0IGFsbCB0aGUgcm9sZXMgdGhhdCBhcmUgYXNzaWduZWQgdG8gdGhpcyBlbGVtZW50LCBjYW4gaGF2ZSBtdWx0aXBsZSByb2xlcyBvbiBvbmVcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVsZW1lbnQgc3BsaXQgYnkgc3BhY2UsIHNvIHdlIG5lZWQgdG8gZXh0cmFjdCBhbGwgb2YgdGhlbSBpbnRvIGFuIGFycmF5LlxuICAgICAgICAgICAgICAgICAgICAgICAgd1JvbGVzID0gbncuZWxlbSgpLmdldEF0dHJpYnV0ZShcInJvbGVcIikuc3BsaXQoXCIgXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKG53LmVsZW0oKSAmJiB3Um9sZXMubGVuZ3RoID09PSAwICYmIGNvbnNpZGVySW1wbGljaXRSb2xlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9jaGVjayBpZiB0aGVyZSBhcmUgYW55IGltcGxpY2l0IHJvbGVzIGZvciB0aGlzIGVsZW1lbnQuXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW1wbGljaXRSb2xlID0gQXJpYVV0aWwuZ2V0SW1wbGljaXRSb2xlKG53Lm5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGltcGxpY2l0Um9sZSAhPT0gbnVsbCAmJiBpbXBsaWNpdFJvbGUubGVuZ3RoID4gMClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3Um9sZXMgPSBpbXBsaWNpdFJvbGU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAod1JvbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBGb2xsb3dpbmcgYXJlIHRoZSBzdGVwcyB0aGF0IGFyZSBleGVjdXRlZCBhdCB0aGlzIHN0YWdlIHRvIGRldGVybWluZSBpZiB0aGUgbm9kZSBzaG91bGQgYmUgY2xhc3NpZmllZCBhcyBoaWRkZW5cbiAgICAgICAgICAgICAgICAgICAgLy8gb3Igbm90LlxuICAgICAgICAgICAgICAgICAgICAvLyAgMS4gSWYgY29uc2lkZXJIaWRkZW5TZXR0aW5nIG9wdGlvbiBpcyBzZXQgdG8gdHJ1ZSB0aGVuIHdlIHBlcmZvcm0gdGhlIGNoZWNrIHRvIGNvbnNpZGVyIHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgQ2hlY2sgSGlkZGVuIENvbnRlbnQgdGhhdCBpcyBwcm92aWRlZC5cbiAgICAgICAgICAgICAgICAgICAgLy8gIDIuIE9ubHkgcnVuIGlzTm9kZVZpc2libGUgY2hlY2sgaWYgaGlkZGVuIGNvbnRlbnQgc2hvdWxkIE5PVCBiZSBjaGVja2VkLiBJbiB0aGUgY2FzZSB0aGF0IGhpZGRlbiBjb250ZW50IGlzIHRvLFxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgYmUgc2Nhbm5lZCB0aGVuIHdlIGNhbiBqdXN0IHNjYW4gZXZlcnl0aGluZyBhcyBub3JtYWwuIEluIHRoZSBjYXNlIHRoYXQgdGhlIGN1cnJlbnQgbm9kZSBpcyBoaWRkZW4gd2UgZG8gbm90XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBhZGQgaXQgdG8gdGhlIHJvbGVUb0VsZW1zIGhhc2ggYXQgYWxsIG9yIGV2ZW4gZG8gYW55IGNoZWNraW5nIGZvciBpdCBhdCBhbGwuXG4gICAgICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgICAgIC8vIE5vdGU6IFRoZSBpZiBjb25kaXRpb25zIHVzZXMgc2hvcnQtY2lyY3VpdGluZyBzbyBpZiB0aGUgZmlyc3QgY29uZGl0aW9uIGlzIG5vdCB0cnVlIGl0IHdpbGwgbm90IGNoZWNrIHRoZSBuZXh0IG9uZSxcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgc28gb24gYW5kIHNvIGZvcnRoLlxuICAgICAgICAgICAgICAgICAgICBpZiAoY29uc2lkZXJIaWRkZW5TZXR0aW5nICYmIENvbW1vblV0aWwuc2hvdWxkTm9kZUJlU2tpcHBlZEhpZGRlbihudy5ub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBMb29wIHRocm91Z2ggYWxsIHRoZSByb2xlcyBhbmQgYXNzaWduZWQgdGhpcyBub2RlIHRvIGFsbCB0aGVzIHJvbGVzXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgd1JvbGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IHRoZSByb2xlIGtleSBpcyBub3QgYWxyZWFkeSBpbiB0aGUgcm9sZVRvRWxlbXMgaGFzaCwgY29uc3RydWN0IHRoZVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkIHRoZSBrZXkgYW5kIGFzc2lnbiBlbXB0eSBhcnJheS5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHdSb2xlc1tpXSBpbiByb2xlVG9FbGVtcykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlVG9FbGVtc1t3Um9sZXNbaV1dID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgbm9kZSB0byB0aGUgYXJyYXkgZm9yIHRoZSByb2xlXG4gICAgICAgICAgICAgICAgICAgICAgICByb2xlVG9FbGVtc1t3Um9sZXNbaV1dLnB1c2gobncubm9kZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFNldCB0aGUgcm9sZVRvRWxlbXMgaGFzaCBtYXAgYXMgYSBnbG9iYWwgdmFyaWFibGVcbiAgICAgICAgICAgIGlmIChjb25zaWRlckltcGxpY2l0Um9sZXMpIHtcbiAgICAgICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUoZG9jLCBcIkFyaWFVdGlsX0dFVEVMRU1FTlRTQllfUk9MRV9JTVBMSUNJVFwiLCByb2xlVG9FbGVtcyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShkb2MsIFwiQXJpYVV0aWxfR0VURUxFTUVOVFNCWV9ST0xFXCIsIHJvbGVUb0VsZW1zKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW5pdGlsaXplIHRoZSByZXR1cm4gdmFsdWVcbiAgICAgICAgbGV0IHJldFZhbCA9IFtdO1xuXG4gICAgICAgIC8vIEhhbmRsZSB0aGUgY2FzZXMgd2hlcmUgdGhlIHByb3ZpZGVkIHJvbGUgaXMgYSBzdHJpbmcgYW5kIG5vdCBhbiBhcnJheSxcbiAgICAgICAgLy8gZm9yIHRoaXMgY2FzZSB3ZSB0YWtlIHRoZSBzdHJpbmcgYW5kIHB1dCBpdCBpbnRvIGFuIGFycmF5XG4gICAgICAgIGlmICh0eXBlb2YgKHJvbGVzKSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgbGV0IHJvbGUgPSByb2xlcztcbiAgICAgICAgICAgIHJvbGVzID0gW107XG4gICAgICAgICAgICByb2xlcy5wdXNoKHJvbGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTG9vcCB0aHJvdWdoIHRoZSByb2xlcyB0aGF0IHdlcmUgcHJvdmlkZWQgYW5kIGZpbmQgdGhlIGxpc3Qgb2YgZWxlbWVudHMgZm9yIHRoaXMgcm9sZXNcbiAgICAgICAgLy8gYW5kIGFkZCB0aGVtIHRvIHRoZSByZXR1cm4gdmFsdWUuXG4gICAgICAgIGlmIChyb2xlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIC8vIGxvb3Agb3ZlciBhbGwgdGhlIHJvbGVzXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJvbGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgLy8gRXh0cmFjdCB0aGUgcm9sZSBmcm9tIHRoZSBhcnJheVxuICAgICAgICAgICAgICAgIGxldCBuZXh0Um9sZSA9IHJvbGVzW2ldO1xuICAgICAgICAgICAgICAgIC8vIEZldGNoIHRoZSBsaXN0IG9mIGFsbCB0aGUgZWxlbWVudHMgZm9yIHRoaXMgcm9sZVxuICAgICAgICAgICAgICAgIGxldCBjb3B5Um9sZXMgPSByb2xlVG9FbGVtc1tuZXh0Um9sZV07XG5cbiAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSBhcmUgZWxlbWVudHMgdG8gY29weSB0byBhbm90aGVyIGFycmF5LCB0aGVuIHBlcmZvcm0gdGhlIGNvcHlcbiAgICAgICAgICAgICAgICBpZiAoY29weVJvbGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIExvb3Agb3ZlciBhbGwgdGhlIGVsZW1lbnRzIHdoaWNoIGFyZSB0byBiZSBjb3BpZWRcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBjb3B5Um9sZXMubGVuZ3RoOyArK2opIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFkZCB0aGlzIGVsZW1lbnQgdG8gdGhlIHJldHVybiB2YWxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldFZhbC5wdXNoKGNvcHlSb2xlc1tqXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAgICAgKiBhIHRhcmdldCBpcyBlbiBlbGVtZW50IHRoYXQgYWNjZXB0IGEgcG9pbnRlciBhY3Rpb24gKGNsaWNrIG9yIHRvdWNoKVxuICAgICAgICAgKiBcbiAgICAgICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpc1RhcmdldChlbGVtZW50KSB7IFxuICAgICAgICBpZiAoIWVsZW1lbnQgfHwgZWxlbWVudC5ub2RlVHlwZSAhPT0gMSBcbiAgICAgICAgICAgIHx8IFtcImh0bWxcIiwgXCJib2R5XCJdLmluY2x1ZGVzKGVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSlcbiAgICAgICAgICAgIHx8IENvbW1vblV0aWwuZ2V0QW5jZXN0b3IoZWxlbWVudCwgW1wic3ZnXCIsIFwicHJlXCIsIFwiY29kZVwiLCBcInNjcmlwdFwiLCBcIm1ldGFcIiwgJ2hlYWQnXSkgIT09IG51bGwgXG4gICAgICAgICAgICB8fCAhVmlzVXRpbC5pc05vZGVWaXNpYmxlKGVsZW1lbnQpIHx8IFZpc1V0aWwuaXNOb2RlVmlzdWFsbHlIaWRkZW4oZWxlbWVudCkgXG4gICAgICAgICAgICB8fCBDb21tb25VdGlsLmlzTm9kZURpc2FibGVkKGVsZW1lbnQpIHx8IFZpc1V0aWwuaXNFbGVtZW50T2Zmc2NyZWVuKGVsZW1lbnQpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBcbiAgICAgICAgaWYgKENvbW1vblV0aWwuaXNDbGlja2FibGUoZWxlbWVudCkpIFxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICAgICAgY29uc3Qgcm9sZSA9IEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZShlbGVtZW50KTtcbiAgICAgICAgaWYgKCFyb2xlKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgY29uc3QgdGFyZ2V0X3JvbGVzID0gW1wibGlzdGl0ZW1cIiwgXCJtZW51aXRlbVwiLCBcIm1lbnVpdGVtY2hlY2tib3hcIiwgXCJtZW51aXRlbXJhZGlvXCIsIFwib3B0aW9uXCIsIFwicmFkaW9cIiwgXCJzd2l0Y2hcIiwgXCJ0cmVlaXRlbVwiXTtcbiAgICAgICAgaWYgKHRhcmdldF9yb2xlcy5pbmNsdWRlcyhyb2xlKSkge1xuICAgICAgICAgICAgLy8gZmluZCB0aGUgcHJvcGVyIHBhcmVudCBlbGVtZW50c1xuICAgICAgICAgICAgbGV0IHBhcmVudCA9IGVsZW1lbnQucGFyZW50RWxlbWVudDtcbiAgICAgICAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRfcm9sZSA9IEFyaWFVdGlsLmdldFJlc29sdmVkUm9sZShwYXJlbnQpO1xuICAgICAgICAgICAgICAgIC8vIGRhdGFsaXN0LCBmaWVsZHNldCwgb3B0Z3JvdXAsIGV0Yy4gbWF5IGJlIGp1c3QgdXNlZCBmb3IgZ3JvdXBpbmcgcHVycG9zZSwgc28gZ28gdXAgdG8gdGhlIHBhcmVudFxuICAgICAgICAgICAgICAgIGlmIChwYXJlbnRfcm9sZSA9PT0gJ2dyb3VwJylcbiAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudEVsZW1lbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgICAgICAgICAgIGlmIChwYXJlbnQgJiYgQ29tbW9uVXRpbC5pc1RhcmdldChwYXJlbnQpKVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9ICAgIFxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRGaWxlRXh0KHVybCkge1xuICAgICAgICBsZXQgbSA9IHVybC5tYXRjaCgvXFwuKChbXjs/I1xcLl18XiQpKykoWzs/I118JCkvKTtcbiAgICAgICAgaWYgKG0gIT0gbnVsbCAmJiBtLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgICAgICByZXR1cm4gXCIuXCIgKyBtWzFdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGdldEZpbGVBbmNob3IodXJsKSB7XG4gICAgICAgIGxldCBtID0gdXJsLm1hdGNoKC8jKChbXjs/XFwuXXxeJCkrKShbOz9dfCQpLyk7XG4gICAgICAgIGlmIChtICE9IG51bGwgJiYgbS5sZW5ndGggPj0gMikge1xuICAgICAgICAgICAgcmV0dXJuIG1bMV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgY2hlY2tPYmpFbWJlZChub2RlLCBleHRUZXN0LCBtaW1lVGVzdCkge1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgaWYgKG5vZGVOYW1lICE9IFwib2JqZWN0XCIgJiYgbm9kZU5hbWUgIT0gXCJlbWJlZFwiICYmXG4gICAgICAgICAgICBub2RlTmFtZSAhPSBcImFcIiAmJiBub2RlTmFtZSAhPSBcImFyZWFcIikgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsZXQgcmV0VmFsID0gZmFsc2U7XG4gICAgICAgIC8vIENoZWNrIG1pbWUgdHlwZVxuICAgICAgICBpZiAoIXJldFZhbCAmJiBub2RlLmhhc0F0dHJpYnV0ZShcInR5cGVcIikpIHtcbiAgICAgICAgICAgIGxldCBtaW1lID0gbm9kZS5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICByZXRWYWwgPSBtaW1lVGVzdChtaW1lKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXJldFZhbCAmJiBub2RlLmhhc0F0dHJpYnV0ZShcImNvZGV0eXBlXCIpKSB7XG4gICAgICAgICAgICBsZXQgbWltZSA9IG5vZGUuZ2V0QXR0cmlidXRlKFwiY29kZXR5cGVcIik7XG4gICAgICAgICAgICByZXRWYWwgPSBtaW1lVGVzdChtaW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIHRoZSBmaWxlbmFtZVxuICAgICAgICBpZiAoIXJldFZhbCkge1xuICAgICAgICAgICAgbGV0IGZpbGVuYW1lID0gXCJcIjtcbiAgICAgICAgICAgIGlmIChub2RlTmFtZSA9PT0gXCJlbWJlZFwiKSB7XG4gICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBub2RlLmdldEF0dHJpYnV0ZShcInNyY1wiKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobm9kZU5hbWUgPT09IFwiYVwiIHx8IG5vZGVOYW1lID09PSBcImFyZWFcIikge1xuICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gbm9kZS5nZXRBdHRyaWJ1dGUoXCJocmVmXCIpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChub2RlLmhhc0F0dHJpYnV0ZShcImRhdGFcIikpIHtcbiAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IG5vZGUuZ2V0QXR0cmlidXRlKFwiZGF0YVwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmaWxlbmFtZSA9PT0gbnVsbCkgZmlsZW5hbWUgPSBcIlwiO1xuICAgICAgICAgICAgbGV0IGV4dCA9IENvbW1vblV0aWwuZ2V0RmlsZUV4dChmaWxlbmFtZSk7XG4gICAgICAgICAgICByZXRWYWwgPSBleHRUZXN0KGV4dCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBmb3IgZmlsZW5hbWVzIGluIHRoZSBwYXJhbXNcbiAgICAgICAgaWYgKCFyZXRWYWwgJiYgbm9kZU5hbWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIC8vIEluIHRoZSBjYXNlIHRoYXQgQ2hlY2sgSGlkZGVuIE9wdGlvbiBpcyBzZXQgdGhlbiBjb21wbHkgd2l0aCB0aGF0IHNldHRpbmdcbiAgICAgICAgICAgIGxldCBwYXJhbXMgPSBDb21tb25VdGlsLmdldENoaWxkQnlUYWdIaWRkZW4obm9kZSwgXCJwYXJhbVwiLCBmYWxzZSwgdHJ1ZSk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgIXJldFZhbCAmJiBwYXJhbXMgIT0gbnVsbCAmJiBpIDwgcGFyYW1zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgcmV0VmFsID0gcGFyYW1zW2ldLmhhc0F0dHJpYnV0ZShcInZhbHVlXCIpICYmXG4gICAgICAgICAgICAgICAgICAgIGV4dFRlc3QoQ29tbW9uVXRpbC5nZXRGaWxlRXh0KHBhcmFtc1tpXS5nZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXRWYWw7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgaXNBdWRpb09iakVtYmVkTGluayhub2RlKSB7XG4gICAgICAgIHJldHVybiBDb21tb25VdGlsLmNoZWNrT2JqRW1iZWQobm9kZSwgQ29tbW9uVXRpbC5pc0F1ZGlvRXh0LCBmdW5jdGlvbiAobWltZSkge1xuICAgICAgICAgICAgcmV0dXJuIG1pbWUuc3RhcnRzV2l0aChcImF1ZGlvXCIpXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGlzQXVkaW9FeHQoZXh0KSB7XG4gICAgICAgIGxldCBhdWRpb19leHRlbnNpb25zID0gW1wiLmFpZlwiLCBcIi5haWZjXCIsIFwiLmFpZmZcIiwgXCIuYWlyXCIsIFwiLmFzZlwiLCBcIi5hdVwiLCBcIi5jZGFcIixcbiAgICAgICAgICAgIFwiLmRzbVwiLCBcIi5kc3NcIiwgXCIuZHdkXCIsIFwiLmlmZlwiLCBcIi5rYXJcIiwgXCIubTFhXCIsIFwiLm1lZFwiLFxuICAgICAgICAgICAgXCIubXAyXCIsIFwiLm1wM1wiLCBcIi5tcGFcIiwgXCIucGNtXCIsIFwiLnJhXCIsIFwiLnJhbVwiLCBcIi5ybVwiLFxuICAgICAgICAgICAgXCIuc2FtXCIsIFwiLnNmXCIsIFwiLnNmMlwiLCBcIi5zbXBcIiwgXCIuc25kXCIsIFwiLnN2eFwiLCBcIi51bFwiLFxuICAgICAgICAgICAgXCIudm9jXCIsIFwiLndhdlwiLCBcIi53bWFcIiwgXCIud3ZlXCJcbiAgICAgICAgXTtcbiAgICAgICAgcmV0dXJuIENvbW1vblV0aWwudmFsSW5BcnJheShleHQudG9Mb3dlckNhc2UoKSwgYXVkaW9fZXh0ZW5zaW9ucyk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgaXNWaWRlb09iakVtYmVkTGluayhub2RlKSB7XG4gICAgICAgIHJldHVybiBDb21tb25VdGlsLmNoZWNrT2JqRW1iZWQobm9kZSwgQ29tbW9uVXRpbC5pc1ZpZGVvRXh0LCBmdW5jdGlvbiAobWltZSkge1xuICAgICAgICAgICAgcmV0dXJuIG1pbWUuc3RhcnRzV2l0aChcInZpZGVvXCIpIHx8XG4gICAgICAgICAgICAgICAgbWltZS5zdGFydHNXaXRoKFwiYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2hcIik7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGlzVmlkZW9FeHQoZXh0KSB7XG4gICAgICAgIGxldCB2aWRlb19leHRlbnNpb25zID0gW1wiLmFzZlwiLCBcIi5hdmlcIiwgXCIuZGl2eFwiLCBcIi5kdlwiLCBcIi5tMXZcIiwgXCIubTJwXCIsIFwiLm0ydlwiLCBcIi5tb292XCIsXG4gICAgICAgICAgICBcIi5tb3ZcIiwgXCIubXA0XCIsIFwiLm1wZWdcIiwgXCIubXBnXCIsIFwiLm1wdlwiLCBcIi5vZ21cIiwgXCIub21mXCIsIFwiLnF0XCIsXG4gICAgICAgICAgICBcIi5ybVwiLCBcIi5ydlwiLCBcIi5zbWlcIiwgXCIuc21pbFwiLCBcIi5zd2ZcIiwgXCIudm9iXCIsIFwiLndtdlwiLCBcIi5ybXZiXCIsXG4gICAgICAgICAgICBcIi5tdmJcIlxuICAgICAgICBdO1xuICAgICAgICByZXR1cm4gQ29tbW9uVXRpbC52YWxJbkFycmF5KGV4dC50b0xvd2VyQ2FzZSgpLCB2aWRlb19leHRlbnNpb25zKTtcbiAgICB9XG4gICAgcHVibGljIHN0YXRpYyBpc0ltYWdlT2JqRW1iZWRMaW5rKG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIENvbW1vblV0aWwuY2hlY2tPYmpFbWJlZChub2RlLCBDb21tb25VdGlsLmlzSW1nRXh0LCBmdW5jdGlvbiAobWltZSkge1xuICAgICAgICAgICAgcmV0dXJuIG1pbWUuc3RhcnRzV2l0aChcImltYWdlXCIpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGltYWdlX2V4dGVuc2lvbnMgPSBbXCIuYm1wXCIsIFwiLmdpZlwiLCBcIi5qcGdcIiwgXCIuanBlZ1wiLCBcIi5wY3hcIiwgXCIucG5nXCJdO1xuICAgICAgICBcbiAgICBwdWJsaWMgc3RhdGljIGlzSW1nRXh0KGV4dCkge1xuICAgICAgICByZXR1cm4gQ29tbW9uVXRpbC52YWxJbkFycmF5KGV4dC50b0xvd2VyQ2FzZSgpLCBDb21tb25VdGlsLmltYWdlX2V4dGVuc2lvbnMpO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGlzSHRtbEV4dChleHQpIHtcbiAgICAgICAgbGV0IGh0bWxfZXh0ZW5zaW9ucyA9IFtcIi5hc3BcIiwgXCIuYXNweFwiLCBcIi5jZm1cIiwgXCIuY2ZtbFwiLCBcIi5jZ2lcIiwgXCIuaHRtXCIsIFwiLmh0bWxcIiwgXCIuc2h0bVwiLFxuICAgICAgICAgICAgXCIuc2h0bWxcIiwgXCIucGhwXCIsIFwiLnBsXCIsIFwiLnB5XCIsIFwiLnNodG1cIiwgXCIuc2h0bWxcIiwgXCIueGh0bWxcIlxuICAgICAgICBdO1xuICAgICAgICByZXR1cm4gQ29tbW9uVXRpbC52YWxJbkFycmF5KGV4dC50b0xvd2VyQ2FzZSgpLCBodG1sX2V4dGVuc2lvbnMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaGFzVHJpZ2dlcmVkKGRvYywgaWQpIHtcbiAgICAgICAgcmV0dXJuIENhY2hlVXRpbC5nZXRDYWNoZShkb2MsIGlkLCBmYWxzZSk7XG4gICAgfVxuICAgIHB1YmxpYyBzdGF0aWMgdHJpZ2dlck9uY2UoZG9jLCBpZCwgcGFzc2VkKSB7XG4gICAgICAgIGlmIChwYXNzZWQpIHJldHVybiB0cnVlO1xuICAgICAgICBsZXQgdHJpZ2dlcmVkID0gQ2FjaGVVdGlsLmdldENhY2hlKGRvYywgaWQsIGZhbHNlKTtcbiAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKGRvYywgaWQsIHRydWUpO1xuICAgICAgICByZXR1cm4gdHJpZ2dlcmVkO1xuICAgIH1cblxuICAgIC8qIGRldGVybWluZSBpZiB0aGUgZ2l2ZW4gdmFsdWUgZXhpc3RzIGluIHRoZSBnaXZlbiBhcnJheSAqL1xuICAgIHB1YmxpYyBzdGF0aWMgdmFsSW5BcnJheSh2YWx1ZSwgYXJyKSB7XG4gICAgICAgIGZvciAobGV0IGlkeCBpbiBhcnIpIHtcbiAgICAgICAgICAgIGlmIChhcnJbaWR4XSA9PT0gdmFsdWUpIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiByZXR1cm4gdGhlIGFuY2VzdG9yIG9mIHRoZSBnaXZlbiBlbGVtZW50XG4gICAgICogQHBhcmFtIHRhZ05hbWVzIHN0cmluZywgYXJyYXksIG9yIGRpY3Rpb25hcnkgY29udGFpbmluZyB0aGUgdGFncyB0byBzZWFyY2ggZm9yXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRBbmNlc3RvcihlbGVtZW50LCB0YWdOYW1lcykge1xuICAgICAgICBsZXQgd2Fsa05vZGUgPSBlbGVtZW50O1xuICAgICAgICB3aGlsZSAod2Fsa05vZGUgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGxldCB0aGlzVGFnID0gd2Fsa05vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgKHRhZ05hbWVzKSA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzVGFnID09PSB0YWdOYW1lcy50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGFnTmFtZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaWR4IGluIHRhZ05hbWVzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWdOYW1lc1tpZHhdID09PSB0aGlzVGFnKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdhbGtOb2RlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpc1RhZyBpbiB0YWdOYW1lcykge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2Fsa05vZGUgPSBET01XYWxrZXIucGFyZW50Tm9kZSh3YWxrTm9kZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdhbGtOb2RlO1xuICAgIH1cblxuICAgIC8vIHJldHVybiB0cnVlIGlmIGVsZW1lbnQxIGFuZCBlbGVtZW50MiBhcmUgc2libGluZ3NcbiAgICBwdWJsaWMgc3RhdGljIGlzU2libGluZyhlbGVtZW50MSwgZWxlbWVudDIpIHtcbiAgICAgICAgaWYgKGVsZW1lbnQxICYmIGVsZW1lbnQyKSB7XG4gICAgICAgICAgICBsZXQgbm9kZSA9IG51bGw7XG4gICAgICAgICAgICBpZiAoRE9NV2Fsa2VyLnBhcmVudE5vZGUoZWxlbWVudDEpICYmIERPTVdhbGtlci5wYXJlbnROb2RlKGVsZW1lbnQxKS5maXJzdENoaWxkKSB7XG4gICAgICAgICAgICAgICAgbm9kZSA9IERPTVdhbGtlci5wYXJlbnROb2RlKGVsZW1lbnQxKS5maXJzdENoaWxkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB3aGlsZSAobm9kZSkge1xuICAgICAgICAgICAgICAgIGlmIChub2RlID09PSBlbGVtZW50MikgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaXNEZXNjZW5kYW50KHBhcmVudCwgY2hpbGQpIHtcbiAgICAgICAgbGV0IG5vZGUgPSBET01XYWxrZXIucGFyZW50Tm9kZShjaGlsZCk7XG4gICAgICAgIHdoaWxlIChub2RlICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChub2RlID09PSBwYXJlbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG5vZGUgPSBET01XYWxrZXIucGFyZW50Tm9kZShub2RlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy9jaGVjayBpZiB0aGUgZmlyc3QgZm9ybSBjb250cm9sIGNoaWxkIGlzIGRpc2FibGVkXG4gICAgcHVibGljIHN0YXRpYyBpc0Rpc2FibGVkQnlGaXJzdENoaWxkRm9ybUVsZW1lbnQoZWxlbWVudCkge1xuICAgICAgICBsZXQgZm9ybUVsZW1lbnRzID0gW1wiaW5wdXRcIiwgXCJ0ZXh0YXJlYVwiLCBcInNlbGVjdFwiLCBcImtleWdlblwiLCBcInByb2dyZXNzXCIsIFwibWV0ZXJcIiwgXCJvdXRwdXRcIl07XG4gICAgICAgIGlmIChlbGVtZW50LmZpcnN0Q2hpbGQgIT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IG53ID0gbmV3IERPTVdhbGtlcihlbGVtZW50KTtcbiAgICAgICAgICAgIHdoaWxlIChudy5uZXh0Tm9kZSgpKSB7XG4gICAgICAgICAgICAgICAgaWYgKGZvcm1FbGVtZW50cy5pbmNsdWRlcyhudy5ub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChDb21tb25VdGlsLmlzTm9kZURpc2FibGVkKG53Lm5vZGUpKVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaXNEaXNhYmxlZEJ5UmVmZXJyaW5nRWxlbWVudChlbGVtZW50KSB7XG4gICAgICAgIGxldCBpZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiaWRcIik7XG4gICAgICAgIGxldCBkb2MgPSBlbGVtZW50Lm93bmVyRG9jdW1lbnQ7XG4gICAgICAgIGxldCByb290ID0gZG9jLmJvZHk7XG4gICAgICAgIHdoaWxlIChET01XYWxrZXIucGFyZW50Tm9kZShyb290KSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gR2V0IHRoZSBwYXJlbnROb2RlXG4gICAgICAgICAgICByb290ID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUocm9vdCk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG53ID0gbmV3IERPTVdhbGtlcihyb290KTtcbiAgICAgICAgd2hpbGUgKG53Lm5leHROb2RlKCkpIHtcbiAgICAgICAgICAgIC8vIGNoZWNrIHRoZSBlbGVtZW50IHdob3NlICdhcmlhLWRlc2NyaWJlZGJ5JyBlcXVhbHMgdG8gdGhlIGlkXG4gICAgICAgICAgICBpZiAobncubm9kZSAmJiBudy5ub2RlLm5vZGVUeXBlID09PSAxICYmIG53LmVsZW0oKSkge1xuICAgICAgICAgICAgICAgIGxldCBBcmlhRGVzY3JpYmVkYnlJREFycmF5ID0gKG53LmVsZW0oKS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWRlc2NyaWJlZGJ5XCIpIHx8IFwiXCIpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgICAgICAgICBpZiAoQXJpYURlc2NyaWJlZGJ5SURBcnJheS5pbmNsdWRlcyhpZCkgJiYgQ29tbW9uVXRpbC5pc05vZGVEaXNhYmxlZChudy5ub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBnZXQgZWxlbWVudCBjb250YWluaW5nIGxhYmVsIGZvciB0aGUgZ2l2ZW4gZWxlbWVudFxuICAgICAgICAgKiBAZGVwcmVjYXRlZCBEZXByZWNhdGVkIGJlY2F1c2UgdGhlIGZ1bmN0aW9uIG5hbWUgaXMgbWlzbGVhZGluZy4gVXNlIGdldExhYmVsRm9yRWxlbWVudChlbGVtZW50KSBpbnN0ZWFkXG4gICAgICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SW5wdXRMYWJlbChlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBDb21tb25VdGlsLmdldExhYmVsRm9yRWxlbWVudChlbGVtZW50KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBnZXR0aW5nIHRoZSBlbGVtZW50IGNvbnRhaW5pbmcgdGhlIGxhYmVsIGZvciB0aGUgZ2l2ZW4gZWxlbWVudC5cbiAgICAgKlxuICAgICAqIE5vdGU6IFRoaXMgaXMgYSB3cmFwcGVyIGZ1bmN0aW9uIHRvOiBBcmlhVXRpbC5nZXRMYWJlbEZvckVsZW1lbnRIaWRkZW5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBlbGVtZW50IC0gVGhlIGVsZW1lbnQgZm9yIHdoaWNoIHRvIGdldCB0aGUgbGFiZWwgZWxlbWVudCBmb3IuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtlbGVtZW50fSBlbGVtZW50IC0gcmV0dXJuIHRoZSBlbGVtZW50IGZvciB0aGUgbGFiZWwsIG90aGVyd2lzZSBudWxsXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldExhYmVsRm9yRWxlbWVudChlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBDb21tb25VdGlsLmdldExhYmVsRm9yRWxlbWVudEhpZGRlbihlbGVtZW50LCBmYWxzZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgZ2V0dGluZyB0aGUgZWxlbWVudCBjb250YWluaW5nIHRoZSBsYWJlbCBmb3IgdGhlIGdpdmVuIGVsZW1lbnQuXG4gICAgICpcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIG51bGwgaWYgdGhlIGNvbnRhaW5pbmcgbGFibGUgZWxlbWVudCBpcyBoaWRkZW4sIHdoZW4gdGhlIGlnbm9yZUhpZGRlbiBvcHRpb25cbiAgICAgKiBpcyBzZXQgdG8gdHJ1ZS5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBlbGVtZW50IC0gVGhlIGVsZW1lbnQgZm9yIHdoaWNoIHRvIGdldCB0aGUgbGFiZWwgZWxlbWVudCBmb3IuXG4gICAgICogQHBhcm0ge2Jvb2xlYW59IGlnbm9yZUhpZGRlbiAtIHRydWUgaWYgaGlkZGVuIGVsZW1lbnRzIHdpdGggbGFiZWwgc2hvdWxkIGJlIGlnbm9yZWQgZnJvbSB0aGUgbGlzdFxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSBpZiB0aGUgaGlkZGVuIGVsZW1lbnRzIHNob3VsZCBiZSBhZGRlZFxuICAgICAqXG4gICAgICogQHJldHVybiB7ZWxlbWVudH0gZWxlbWVudCAtIHJldHVybiB0aGUgZWxlbWVudCBmb3IgdGhlIGxhYmVsLCBvdGhlcndpc2UgbnVsbFxuICAgICAqXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRMYWJlbEZvckVsZW1lbnRIaWRkZW4oZWxlbWVudDogRWxlbWVudCwgaWdub3JlSGlkZGVuKSB7XG4gICAgICAgIC8vIENoZWNrIGlmIHRoZSBnbG9iYWwgQXJpYVV0aWxfTEFCRUxTIGhhc2ggaXMgYXZhaWxhYmxlLCBhcyB0aGlzIHdpbGwgY29udGFpbiB0aGUgbGFiZWwgbm9kZXMgYmFzZWQgb25cbiAgICAgICAgLy8gZm9yIGF0dHJpYnV0ZS5cbiAgICAgICAgLy9pZiAoIWdldENhY2hlKGVsZW1lbnQub3duZXJEb2N1bWVudCxcIkFyaWFVdGlsX0xBQkVMU1wiLCBudWxsKSkge1xuICAgICAgICBsZXQgcm9vdCA9IGVsZW1lbnQuZ2V0Um9vdE5vZGUoKTtcbiAgICAgICAgaWYgKCFDYWNoZVV0aWwuZ2V0Q2FjaGUoKHJvb3Qubm9kZVR5cGUgPT09IDExKSA/IDxTaGFkb3dSb290PnJvb3QgOiA8RG9jdW1lbnQ+cm9vdCwgXCJBcmlhVXRpbF9MQUJFTFNcIiwgbnVsbCkpIHtcbiAgICAgICAgICAgIC8vIFZhcmlhYmxlIERlY2xlcmF0aW9uXG4gICAgICAgICAgICBsZXQgaWRUb0xhYmVsID0ge31cblxuICAgICAgICAgICAgLy8gR2V0IGFsbCB0aGUgbGFiZWwgZWxlbWVudHMgaW4gdGhlIGVudGlyZSBkb2NcbiAgICAgICAgICAgIGxldCBsYWJlbE5vZGVzID0gQ29tbW9uVXRpbC5nZXREb2NFbGVtZW50c0J5VGFnKGVsZW1lbnQsIFwibGFiZWxcIik7XG4gICAgICAgICAgICAvLyBMb29wIG92ZXIgYWxsIHRoZSBsYWJlbCBub2RlcywgaW4gdGhlIGNhc2UgdGhlIGxhYmVsIG5vZGUgaGFzIGEgZm9yIGF0dHJpYnV0ZSxcbiAgICAgICAgICAgIC8vIGV4dHJhY3QgdGhhdCBhdHRyaWJ1dGUgYW5kIGFkZCB0aGlzIG5vZGUgdG8gdGhlIGhhc2ggaWYgaXQgaXMgdmlzaWJsZS5cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGFiZWxOb2Rlcy5sZW5ndGg7ICsraSkge1xuXG4gICAgICAgICAgICAgICAgaWYgKGxhYmVsTm9kZXNbaV0uaGFzQXR0cmlidXRlKFwiZm9yXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIElmIGlnbm9yZSBoaWRkZW4gaXMgc3BlY2lmaWVkIGFuZCB0aGUgbm9kZSBpcyBub3QgdmlzaWJsZSB3ZSBkbyBub3QgYWRkIGl0IHRvIHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyBsYWJlbE5vZGVzIGhhc2guXG4gICAgICAgICAgICAgICAgICAgIGlmIChpZ25vcmVIaWRkZW4gJiYgIVZpc1V0aWwuaXNOb2RlVmlzaWJsZShsYWJlbE5vZGVzW2ldKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZFRvTGFiZWxbbGFiZWxOb2Rlc1tpXS5nZXRBdHRyaWJ1dGUoXCJmb3JcIildID0gbGFiZWxOb2Rlc1tpXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEFkZCB0aGUgYnVpbHQgaGFzaCB0byB0aGUgb3duZXJEb2N1bWVudCAoZG9jdW1lbnQpLCB0byBiZSB1c2VkIGxhdGVyIHRvIGZhc3QgcmV0cml2YWxcbiAgICAgICAgICAgIC8vc2V0Q2FjaGUoZWxlbWVudC5vd25lckRvY3VtZW50LCBcIkFyaWFVdGlsX0xBQkVMU1wiLCBpZFRvTGFiZWwpO1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKChyb290Lm5vZGVUeXBlID09PSAxMSkgPyA8U2hhZG93Um9vdD5yb290IDogPERvY3VtZW50PnJvb3QsIFwiQXJpYVV0aWxfTEFCRUxTXCIsIGlkVG9MYWJlbCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiB0aGlzIGVsZW1lbnQgaGFzIGFuIGlkIGF0dHJpYnV0ZSwgZ2V0IHRoZSBjb3Jvc3BvbmRpbmcgbGFiZWwgZWxlbWVudFxuICAgICAgICBpZiAoZWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJpZFwiKSkge1xuICAgICAgICAgICAgLy8gRmV0Y2ggdGhlIGlkIGF0dHJpYnV0ZVxuICAgICAgICAgICAgbGV0IGN0cmxJZCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiaWRcIik7XG4gICAgICAgICAgICAvLyBSZXR1cm4gdGhlIGNvcm9zcG9uZGluZyBsYWJlbCBlbGVtZW50LlxuICAgICAgICAgICAgLy8gTm90ZTogaW4gdGhlIGNhc2UgdGhhdCB0aGUgdGhlIGlkIGlzIG5vdCBmb3VuZCBpbiB0aGUgaGFzaCB0aGF0IG1lYW5zLCBpdCBkb2VzIG5vdCBleGlzdHMgb3IgaXMgaGlkZGVuXG4gICAgICAgICAgICBpZiAoY3RybElkLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgLy9yZXR1cm4gZ2V0Q2FjaGUoZWxlbWVudC5nZXRSb290Tm9kZSgpLm93bmVyRG9jdW1lbnQsXCJBcmlhVXRpbF9MQUJFTFNcIix7fSlbY3RybElkXTtcbiAgICAgICAgICAgICAgICByZXR1cm4gQ2FjaGVVdGlsLmdldENhY2hlKChyb290Lm5vZGVUeXBlID09PSAxMSkgPyA8U2hhZG93Um9vdD5yb290IDogPERvY3VtZW50PnJvb3QsIFwiQXJpYVV0aWxfTEFCRUxTXCIsIHt9KVtjdHJsSWRdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qIFJldHVybiBzcGVjaWZpZWQgZWxlbWVudCBhdHRyaWJ1dGUgaWYgcHJlc2VudCBlbHNlIHJldHVybiBudWxsICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRFbGVtZW50QXR0cmlidXRlKGVsZW1lbnQsIGF0dHIpIHtcbiAgICAgICAgLy9yZXR1cm4gKGVsZW1lbnQgJiYgZWxlbWVudC5oYXNBdHRyaWJ1dGUgJiYgZWxlbWVudC5oYXNBdHRyaWJ1dGUoYXR0cikpID8gZWxlbWVudC5nZXRBdHRyaWJ1dGUoYXR0cikgOiBudWxsO1xuICAgICAgICBpZiAoIWF0dHIgfHwgIWVsZW1lbnQgfHwgIWVsZW1lbnQuaGFzQXR0cmlidXRlIHx8ICFlbGVtZW50Lmhhc0F0dHJpYnV0ZShhdHRyKSkgcmV0dXJuIG51bGw7XG4gICAgICAgIGNvbnN0IGF0clZhbHVlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoYXR0cilcbiAgICAgICAgaWYgKCFBUklBRGVmaW5pdGlvbnMucmVmZXJlbmNlUHJvcGVydGllcy5pbmNsdWRlcyhhdHRyKSlcbiAgICAgICAgICAgIHJldHVybiBhdHJWYWx1ZTtcblxuICAgICAgICAvL2F0dHIgaXMgYSByZWZlcmVuY2UgdG8gb3RoZXIgZWxlbWVudHMocylcbiAgICAgICAgY29uc3QgdmFsdWVzID0gYXRyVmFsdWUuc3BsaXQoLyArL2cpO1xuICAgICAgICAvL2lnbm9yZSBpZiBub25lIG9mIHRoZSByZWZlcnJlZCBlbGVtZW50KHMpIGV4aXN0IG9yIGFsbCBwb2ludCB0byB0aGUgZWxlbWVudCBpdHNlbGZcbiAgICAgICAgbGV0IGV4aXN0ID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGlkID0gMDsgdmFsdWVzIDwgdmFsdWVzLmxlbmd0aDsgKytpZCkge1xuICAgICAgICAgICAgY29uc3QgcmVmZXJyZWQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh2YWx1ZXNbaWRdKTtcbiAgICAgICAgICAgIGlmIChyZWZlcnJlZCAmJiAhRE9NVXRpbC5zYW1lTm9kZShyZWZlcnJlZCwgZWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICBleGlzdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGV4aXN0ID8gYXRyVmFsdWUgOiBudWxsO1xuICAgIH1cblxuICAgIC8vIFJldHVybiB0cnVlIGlmIGVsZW1lbnQgaGFzIHZhbGlkIGltcGxpY2l0IGxhYmVsXG4gICAgcHVibGljIHN0YXRpYyBoYXNJbXBsaWNpdExhYmVsKGVsZW1lbnQpIHtcbiAgICAgICAgbGV0IHBhcmVudE5vZGUgPSBDb21tb25VdGlsLmdldEFuY2VzdG9yKGVsZW1lbnQsIFwibGFiZWxcIik7XG4gICAgICAgIC8vIFRlc3QgIGEpIGlmIHRoZSBwYXJlbnQgaXMgYSBsYWJlbCB3aGljaCBpcyB0aGUgaW1wbGljaXQgbGFiZWxcbiAgICAgICAgLy8gICAgICAgYikgaWYgdGhlIGZvcm0gZWxlbWVudCBpcyB0aGUgZmlyc3QgY2hpbGQgb2YgdGhlIGxhYmVsXG4gICAgICAgIC8vICAgICAgIGMpIGlmIHRoZSBmb3JtIGVsZW1lbnQgcmVxdWlyZXMgYW4gaW1wbGljaXQgb3IgZXhwbGljaXQgbGFiZWwgOiBcImlucHV0XCIsICBcInRleHRhcmVhXCIsIFwic2VsZWN0XCIsIFwia2V5Z2VuXCIsIFwicHJvZ3Jlc3NcIiwgXCJtZXRlclwiLCBcIm91dHB1dFwiXG4gICAgICAgIC8vICAgICAgIGQpIGZvcm0gZWxlbWVudHMgd2hpY2ggbWF5IGhhdmUgYSBsYWJlbDogYnV0dG9uXG4gICAgICAgIC8vIGZvcm0gZWxlbWVudHMgdGhhdCBkbyBub3QgcmVxdWlyZSBpbXBsaWNpdCBvciBleHBsaWNpdCBsYWJlbCBlbGVtZW50IGFyZTpcbiAgICAgICAgLy8gXCJvcHRncm91cFwiLCBcIm9wdGlvblwiLCBcImRhdGFsaXN0XCIoYWRkZWQgbGF0ZXIpLiBUaGVzZSB3ZXJlIGhhbmRsZWQgZGlmZmVyZW50bHkgaW4gdGhlIG1haW4gcnVsZSwgbWlnaHQgbmVlZCB0byByZWZhY3RvciB0aGUgY29kZSBsYXRlclxuXG4gICAgICAgIGlmIChwYXJlbnROb2RlICYmIHBhcmVudE5vZGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImxhYmVsXCIgJiYgQ29tbW9uVXRpbC5pc0ZpcnN0Rm9ybUVsZW1lbnQocGFyZW50Tm9kZSwgZWxlbWVudCkpIHtcbiAgICAgICAgICAgIGxldCBwYXJlbnRDbG9uZSA9IHBhcmVudE5vZGUuY2xvbmVOb2RlKHRydWUpO1xuICAgICAgICAgICAgLy8gZXhjbHVkZSBhbGwgZm9ybSBlbGVtZW50cyBmcm9tIHRoZSBsYWJlbCBzaW5jZSB0aGV5IG1pZ2h0IGFsc28gaGF2ZSBpbm5lciBjb250ZW50XG4gICAgICAgICAgICBwYXJlbnRDbG9uZSA9IENvbW1vblV0aWwucmVtb3ZlQWxsRm9ybUVsZW1lbnRzRnJvbUxhYmVsKHBhcmVudENsb25lKTtcbiAgICAgICAgICAgIHJldHVybiBDb21tb25VdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbihwYXJlbnRDbG9uZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gdGhlIGltcGxpY2l0IGxhYmVsIG9mIHRoZSBnaXZlbiBmb3JtIGZpZWxkXG4gICAgcHVibGljIHN0YXRpYyBnZXRJbXBsaWNpdExhYmVsKGVsZW1lbnQpIHtcbiAgICAgICAgbGV0IHBhcmVudE5vZGUgPSBDb21tb25VdGlsLmdldEFuY2VzdG9yKGVsZW1lbnQsIFwibGFiZWxcIik7XG4gICAgICAgIC8vIFRlc3QgIGEpIGlmIHRoZSBwYXJlbnQgaXMgYSBsYWJlbCB3aGljaCBpcyB0aGUgaW1wbGljaXQgbGFiZWxcbiAgICAgICAgLy8gICAgICAgYikgaWYgdGhlIGZvcm0gZWxlbWVudCBpcyB0aGUgZmlyc3QgY2hpbGQgb2YgdGhlIGxhYmVsXG4gICAgICAgIC8vICAgICAgIGMpIGlmIHRoZSBmb3JtIGVsZW1lbnQgcmVxdWlyZXMgYW4gaW1wbGljaXQgb3IgZXhwbGljaXQgbGFiZWwgOiBcImlucHV0XCIsICBcInRleHRhcmVhXCIsIFwic2VsZWN0XCIsIFwia2V5Z2VuXCIsIFwicHJvZ3Jlc3NcIiwgXCJtZXRlclwiLCBcIm91dHB1dFwiXG4gICAgICAgIC8vICAgICAgIGQpIGZvcm0gZWxlbWVudHMgd2hpY2ggbWF5IGhhdmUgYSBsYWJlbDogYnV0dG9uXG4gICAgICAgIC8vIGZvcm0gZWxlbWVudHMgdGhhdCBkbyBub3QgcmVxdWlyZSBpbXBsaWNpdCBvciBleHBsaWNpdCBsYWJlbCBlbGVtZW50IGFyZTpcbiAgICAgICAgLy8gXCJvcHRncm91cFwiLCBcIm9wdGlvblwiLCBcImRhdGFsaXN0XCIoYWRkZWQgbGF0ZXIpLiBUaGVzZSB3ZXJlIGhhbmRsZWQgZGlmZmVyZW50bHkgaW4gdGhlIG1haW4gcnVsZSwgbWlnaHQgbmVlZCB0byByZWZhY3RvciB0aGUgY29kZSBsYXRlclxuXG4gICAgICAgIGlmIChwYXJlbnROb2RlICYmIHBhcmVudE5vZGUudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImxhYmVsXCIgJiYgQ29tbW9uVXRpbC5pc0ZpcnN0Rm9ybUVsZW1lbnQocGFyZW50Tm9kZSwgZWxlbWVudCkpIHtcbiAgICAgICAgICAgIGxldCBwYXJlbnRDbG9uZSA9IHBhcmVudE5vZGUuY2xvbmVOb2RlKHRydWUpO1xuICAgICAgICAgICAgLy8gZXhjbHVkZSBhbGwgZm9ybSBlbGVtZW50cyBmcm9tIHRoZSBsYWJlbCBzaW5jZSB0aGV5IG1pZ2h0IGFsc28gaGF2ZSBpbm5lciBjb250ZW50XG4gICAgICAgICAgICBwYXJlbnRDbG9uZSA9IENvbW1vblV0aWwucmVtb3ZlQWxsRm9ybUVsZW1lbnRzRnJvbUxhYmVsKHBhcmVudENsb25lKTtcbiAgICAgICAgICAgIGNvbnN0IGxhYmVsID0gQ29tbW9uVXRpbC5nZXRJbm5lclRleHQocGFyZW50Q2xvbmUpO1xuICAgICAgICAgICAgcmV0dXJuIGxhYmVsICYmIGxhYmVsLnRyaW0oKSAhPT0gJycgPyBsYWJlbC50cmltKCkgOiBudWxsO1xuICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGdldHRpbmcgdGhlIGxhYmVsIGZvciBhIGZvcm0gZmllbGQgZWxlbWVudC5cbiAgICAgKlxuICAgICAqXG4gICAgICogQHBhcm0ge2VsZW1lbnR9IGVsZW1lbnQgLSBUaGUgZWxlbWVudCBmcm9tIHdoaWNoIHRvIGdldCB0aGUgbGFiZWwuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IHRleHQgLSByZXR1cm4gdGhlIGxhYmVsIHRleHQgb3IgbnVsbFxuICAgICAqXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRGb3JtRmllbGRMYWJlbChlbGVtKSA6IHN0cmluZyB8IG51bGwge1xuICAgICAgICAvLyBnZXQgdGhlIGxhYmVsIGZyb20gdGhlIGF0dHJpYnV0ZSBcImZvclwiIG9mIHRoZSBsYWJlbCBlbGVtZW50XG4gICAgICAgIC8vIEdldCBvbmx5IHRoZSBub24taGlkZGVuIGxhYmVscyBmb3IgZWxlbWVudFxuICAgICAgICBsZXQgdmFsdWUgPSBcIlwiO1xuICAgICAgICBsZXQgbGFiZWwgPSBudWxsO1xuICAgICAgICBsZXQgbGFiZWxFbGVtID0gQ29tbW9uVXRpbC5nZXRMYWJlbEZvckVsZW1lbnRIaWRkZW4oZWxlbSwgdHJ1ZSk7XG4gICAgICAgIGlmIChsYWJlbEVsZW0pIHtcbiAgICAgICAgICAgIC8vIHZhbHVlIGRpcmVjdGx5IGZyb20gZWxlbWVudCB0ZXh0XG4gICAgICAgICAgICBsYWJlbCA9IGxhYmVsRWxlbS5pbm5lclRleHQ7IC8vIGlnbm9yZSBoaWRkZW4gdGV4dFxuICAgICAgICB9IGVsc2UgeyAgICBcbiAgICAgICAgICAgIC8qKiBpZiBpdCdzIG5vdCBsYWJlbCB3aXRoIGZvciBhdHRyaWJ1dGUsIHRoZW4gZmluZCBpbXBsaWNpdCBsYWJlbFxuICAgICAgICAgICAgICogY2FzZXMgZm9yIGV4cGxpY3QgbGFiZWw6IFxuICAgICAgICAgICAgICogICA8bGFiZWwgZm9yPSdteSc+PC9sYWJlbD48aW5wdXQgaWQ9J215Jy8+XG4gICAgICAgICAgICAgKiAgIDxsYWJlbCBmb3I9J215Jz48aW5wdXQgaWQ9J215Jy8+PC9sYWJlbD4gICBcbiAgICAgICAgICAgICAqIGNhc2VzIGZvciBpbXBsaWNpdCBsYWJlbDogXG4gICAgICAgICAgICAgKiAgICA8bGFiZWw+PGlucHV0IC8+PC9sYWJlbD5cbiAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgbGFiZWxFbGVtID0gQ29tbW9uVXRpbC5nZXRBbmNlc3RvcihlbGVtLCBcImxhYmVsXCIpO1xuICAgICAgICAgICAgaWYgKGxhYmVsRWxlbSAmJiBsYWJlbEVsZW0udGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImxhYmVsXCIgJiYgQ29tbW9uVXRpbC5pc0ZpcnN0Rm9ybUVsZW1lbnQobGFiZWxFbGVtLCBlbGVtKSkge1xuICAgICAgICAgICAgICAgIGxldCBwYXJlbnRDbG9uZSA9IGxhYmVsRWxlbS5jbG9uZU5vZGUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgLy8gZXhjbHVkZSBhbGwgdGhlIHRleHQgZnJvbSB0aGUgZmlyc3QgZm9ybSBlbGVtZW50IHNpbmNlIHRoZXkgbWlnaHQgYWxzbyBcbiAgICAgICAgICAgICAgICAvLyBoYXZlIGlubmVyIGNvbnRlbnQgdGhhdCBpcyBwYXJ0IG9mIGlubmVyVGV4dFxuICAgICAgICAgICAgICAgIHBhcmVudENsb25lID0gQ29tbW9uVXRpbC5yZW1vdmVBbGxGb3JtRWxlbWVudHNGcm9tTGFiZWwocGFyZW50Q2xvbmUpO1xuICAgICAgICAgICAgICAgIGxhYmVsID0gQ29tbW9uVXRpbC5nZXRJbm5lclRleHQocGFyZW50Q2xvbmUpO1xuICAgICAgICAgICAgfSBlbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7ICAgXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmIChsYWJlbCAmJiBsYWJlbC50cmltKCkgIT09IFwiXCIpXG4gICAgICAgICAgICB2YWx1ZSArPSBsYWJlbC50cmltKCk7XG4gICAgICAgIFxuICAgICAgICAvLyB2YWx1ZSBmcm9tIGNoaWxkIGVsZW1lbnQgYXR0cmlidXRlXG4gICAgICAgIGxhYmVsID0gQ29tbW9uVXRpbC5nZXRMYWJlbFRleHRGcm9tQXR0cmlidXRlKGxhYmVsRWxlbSwgdHJ1ZSk7XG4gICAgICAgIGlmIChsYWJlbCAmJiBsYWJlbC50cmltKCkgIT09IFwiXCIpXG4gICAgICAgICAgICB2YWx1ZSArPSBsYWJlbC50cmltKCk7XG5cbiAgICAgICAgLy8gd2lyZWQgY2FzZTogZ2V0IGFyaWEgbGFiZWwgZnJvbSBsYWJlbCBlbGVtZW50IGl0c2VsZiBqdXN0IGluIGNhc2UgKHRob3VnaCBuYW1lIHByb2hpYml0ZWQgZnJvbSBhcmlhIGluIGh0bWwpXG4gICAgICAgIGxhYmVsID0gQXJpYVV0aWwuZ2V0QXJpYUxhYmVsKGxhYmVsRWxlbSk7XG4gICAgICAgIGlmIChsYWJlbCAmJiBsYWJlbC50cmltKCkgIT09IFwiXCIpXG4gICAgICAgICAgICB2YWx1ZSArPSBsYWJlbC50cmltKCk7XG5cbiAgICAgICAgcmV0dXJuIHZhbHVlLnRyaW0oKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBjYWxjdWxhdGUgbGFiZWwgZnJvbSBlbWJlZGRlZCBjb250cm9sOiBodHRwczovL3czYy5naXRodWIuaW8vYWNjbmFtZS9cbiAgICAgKiBAcGFyYW0ge2VsZW1lbnR9IGxhYmVsRWxlbSBsYWJlbCBlbGVtZW50XG4gICAgICogQHBhcmFtIHtib29sZWFufSBpZ25vcmVIaWRkZW4gLSB0cnVlIGlmIGhpZGRlbiBlbGVtZW50cyB3aXRoIGxhYmVsIHNob3VsZCBiZSBpZ25vcmVkIGZyb20gdGhlIGxpc3RcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgaWYgdGhlIGhpZGRlbiBlbGVtZW50cyBzaG91bGQgYmUgYWRkZWQgIFxuICAgICAqIEByZXR1cm5zIGxhYmVsIHRleHQgb3IgJydcbiAgICAgKiBcbiAgICAgKiBub3RlIHRoZSBhc3N1bXB0aW9uIGlzIHRoZSBsYWJlbEVsZW0gcmVmZXJzIGVpdGhlciB0byBhIGxhYmVsbGVkIGVsZW1lbnQgYnkgJ2ZvcicgYXR0cmlidXRlIFxuICAgICAqICBvciBpdHMgZmlyc3QgZm9ybSBmaWVsZCBpcyBsYWJiZWxsZWQgZWxlbWVudFxuICAgICAqLyBcbiAgICBwdWJsaWMgc3RhdGljIGdldExhYmVsVGV4dEZyb21BdHRyaWJ1dGUobGFiZWxFbGVtOiBFbGVtZW50LCBpZ25vcmVIaWRkZW46IGJvb2xlYW4pIDogc3RyaW5nIHtcbiAgICAgICAgLy8gbGFiZWwgZWl0aGVyIHBvaW50cyB0byBhIGxhYmVsYWJsZSBlbGVtZW50IGJ5IGl0cyBmb3IgYXR0cmlidXRlIG9yIHRoZSBmaXJzdCBlbGVtZW50IGNoaWxkXG4gICAgICAgIC8vIGdldCB0aGUgbGFiZWxsZWQgZWxtZW50IGlmIGl0J3MgYW4gaW1wbGljaXQgbGFiZWxcbiAgICAgICAgbGV0IGxhYmVsZWRFbGVtID0gbnVsbDtcbiAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbGFiZWxFbGVtLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBjaGlsZDogRWxlbWVudCA9IGxhYmVsRWxlbS5jaGlsZHJlbi5pdGVtKGkpO1xuICAgICAgICAgICAgaWYgKENvbW1vblV0aWwuZm9ybV9sYWJlbGFibGVfZWxlbWVudHMuaW5jbHVkZXMoY2hpbGQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgICAgICAgICAgICBsYWJlbGVkRWxlbSA9IGNoaWxkO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBsZXQgbncgPSBuZXcgRE9NV2Fsa2VyKGxhYmVsRWxlbSk7XG4gICAgICAgIGxldCB0ZXh0ID0gJyc7XG4gICAgICAgIHdoaWxlIChudy5uZXh0Tm9kZSgpICYmIG53Lm5vZGUgIT09IGxhYmVsRWxlbSkge1xuICAgICAgICAgICAgLy8gb25seSBjaGVjayBlbGVtZW50IGNoaWxkcmVuXG4gICAgICAgICAgICBpZiAobncubm9kZSAmJiBudy5ub2RlLm5vZGVUeXBlID09PSAxICYmIG53LmVsZW0oKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW0gPSBudy5lbGVtKCk7XG4gICAgICAgICAgICAgICAgLy8gaWdub3JlIGlmIGl0J3MgaGlkZGVuLCBvciBsYWJlbGxlZCBlbGVtZW50LCBvciBmaXJzdCBmb3JtIGVsZW1lbnQgaWYgbm90IGxhYmVsZWQgYnkgZm9yIGF0dHJpYnV0ZVxuICAgICAgICAgICAgICAgIGlmICgoaWdub3JlSGlkZGVuICYmIChWaXNVdGlsLmlzTm9kZUhpZGRlbkZyb21BVChlbGVtKSB8fCBWaXNVdGlsLmlzTm9kZVByZXNlbnRhdGlvbmFsKGVsZW0pKSlcbiAgICAgICAgICAgICAgICAgICAgfHwgKGxhYmVsZWRFbGVtICYmIGxhYmVsZWRFbGVtLmNvbnRhaW5zKGVsZW0pKSlcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG5cbiAgICAgICAgICAgICAgICBjb25zdCByb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKGVsZW0pO1xuICAgICAgICAgICAgICAgIC8vIHRleHRib3ggZXRjLiByZXR1cm4gaXRzIHRleHQgdmFsdWVcbiAgICAgICAgICAgICAgICBpZiAocm9sZSA9PT0gXCJ0ZXh0Ym94XCIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IGVsZW0uZ2V0QXR0cmlidXRlKFwidmFsdWVcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lICYmIG5hbWUudHJpbSgpLmxlbmd0aCA+IDApXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9ICcgJyArIG5hbWUudHJpbSgpO1xuXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyb2xlID09PSBcImNvbWJvYm94XCIgfHwgcm9sZSA9PT0gXCJsaXN0Ym94XCIpIHsgXG4gICAgICAgICAgICAgICAgICAgIC8vIGZvciBjb21ib2JveCBvciBsaXN0Ym94IHJvbGVzLCByZXR1cm4gdGhlIHRleHQgYWx0ZXJuYXRpdmUgb2YgdGhlIGNob3NlbiBvcHRpb24uXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkSWQgPSBlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiKSB8fCBlbGVtLmdldEF0dHJpYnV0ZShcImFyaWEtc2VsZWN0ZWRcIikgfHwgZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWNoZWNrZWRcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZElkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2VsZWN0ZWRPcHRpb24gPSBlbGVtLm93bmVyRG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoc2VsZWN0ZWRJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRPcHRpb24gJiYgIURPTVV0aWwuc2FtZU5vZGUoZWxlbSwgc2VsZWN0ZWRPcHRpb24pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFpciA9IEFjY05hbWVVdGlsLmNvbXB1dGVBY2Nlc3NpYmxlTmFtZShzZWxlY3RlZE9wdGlvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhaXIgJiYgcGFpci5uYW1lKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9ICcgJyArIHBhaXIubmFtZS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFtcInByb2dyZXNzYmFyXCIsIFwic2Nyb2xsYmFyXCIsIFwic2xpZGVyXCIsIFwic3BpbmJ1dHRvblwiLCBcIm1ldGVyXCJdLmluY2x1ZGVzKHJvbGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGZvciByYW5nZSByb2xlIHR5cGUsIGluY2x1ZGluZyBcInByb2dyZXNzYmFyXCIsIFwic2Nyb2xsYmFyXCIsIFwic2xpZGVyXCIsIFwic3BpbmJ1dHRvblwiIHJvbGVzXG4gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBhcmlhLXZhbHVldGV4dCBwcm9wZXJ0eSBpcyBwcmVzZW50LCByZXR1cm4gaXRzIHZhbHVlXG4gICAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IGVsZW0uZ2V0QXR0cmlidXRlKFwiYXJpYS12YWx1ZXRleHRcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZS50cmltKCkubGVuZ3RoID4gMCkgXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9ICcgJyArIHZhbHVlLnRyaW0oKTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIGlmIHRoZSBhcmlhLXZhbHVlbm93IHByb3BlcnR5IGlzIHByZXNlbnQsIHJldHVybiBpdHMgdmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJhcmlhLXZhbHVlbm93XCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgJiYgdmFsdWUudHJpbSgpLmxlbmd0aCA+IDApIFxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCArPSAnICcgKyB2YWx1ZS50cmltKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gZmluYWxseSB1c2UgbmF0aXZlIHZhbHVlIGF0dHJpYnV0ZVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGVsZW0uZ2V0QXR0cmlidXRlKFwidmFsdWVcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZS50cmltKCkubGVuZ3RoID4gMCkgXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ICs9ICcgJyArIHZhbHVlLnRyaW0oKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBnZXQgYXJpYSBsYWJlbCBmcm9tIHRoZSBlbGVtZW50XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBBcmlhVXRpbC5nZXRBcmlhTGFiZWwoZWxlbSk7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlICYmIHZhbHVlLnRyaW0oKSAhPT0gXCJcIilcbiAgICAgICAgICAgICAgICAgICAgdGV4dCArPSAnICcgKyB2YWx1ZS50cmltKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGV4dC50cmltKCk7ICAgIFxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaXNGaXJzdEZvcm1FbGVtZW50KHBhcmVudE5vZGUsIGVsZW1lbnQpIHtcbiAgICAgICAgLy9sZXQgZm9ybUVsZW1lbnRzUmVxdWlyaW5nTGFiZWwgPSBbXCJpbnB1dFwiLCBcInRleHRhcmVhXCIsIFwic2VsZWN0XCIsIFwia2V5Z2VuXCIsIFwicHJvZ3Jlc3NcIiwgXCJtZXRlclwiLCBcIm91dHB1dFwiXTtcbiAgICAgICAgaWYgKHBhcmVudE5vZGUuZmlyc3RDaGlsZCAhPSBudWxsKSB7XG4gICAgICAgICAgICBsZXQgbncgPSBuZXcgRE9NV2Fsa2VyKHBhcmVudE5vZGUpO1xuICAgICAgICAgICAgd2hpbGUgKG53Lm5leHROb2RlKCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoQ29tbW9uVXRpbC5mb3JtX2xhYmVsYWJsZV9lbGVtZW50cy5pbmRleE9mKG53Lm5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudy5ub2RlID09PSBlbGVtZW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gY2hlY2sgaWYgdGhlIGVsZW1lbnQgaXMgYSBzaGFkb3cgaG9zdCBvciBkZXNjZW5kYW50IG9mIGEgc2hhZG93IGhvc3QsIGJ1dCBub3QgYSBkZXNjZWRhbnQgb2YgdGhlIHNoYWRvdyByb290IG9mIHRoZSBob3N0ICh0byBiZSBhc3NpZ25lZCB0byBzaGFkb3cgc2xvdCBvciBpZ25vcmVkKSAgXG4gICAgcHVibGljIHN0YXRpYyBpc1NoYWRvd0hvc3RFbGVtZW50KGVsZW1lbnQ6IEVsZW1lbnQpIHtcbiAgICAgICAgaWYgKENvbW1vblV0aWwuaXNTaGFkb3dFbGVtZW50KGVsZW1lbnQpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsZXQgd2Fsa05vZGU6IEVsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgICB3aGlsZSAod2Fsa05vZGUpIHtcbiAgICAgICAgICAgIGlmICh3YWxrTm9kZS5zaGFkb3dSb290KSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIHdhbGtOb2RlID0gRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQod2Fsa05vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvL2NoZWNrIGlmIGFuIGVsZW1lbnQgaXMgaW4gYSBzaGFkb3cgdHJlZVxuICAgIHB1YmxpYyBzdGF0aWMgaXNTaGFkb3dFbGVtZW50KGVsZW1lbnQ6IEVsZW1lbnQpIHtcbiAgICAgICAgbGV0IHJvb3QgPSBlbGVtZW50LmdldFJvb3ROb2RlKCk7XG4gICAgICAgIGlmIChyb290LnRvU3RyaW5nKCkgPT09IFwiW29iamVjdCBTaGFkb3dSb290XVwiKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIHJlbW92ZUFsbEZvcm1FbGVtZW50c0Zyb21MYWJlbChlbGVtZW50KSB7XG4gICAgICAgIGxldCBmb3JtRWxlbWVudHMgPSBbXCJpbnB1dFwiLCBcInRleHRhcmVhXCIsIFwic2VsZWN0XCIsIFwiYnV0dG9uXCIsIFwiZGF0YWxpc3RcIiwgXCJvcHRncm91cFwiLCBcIm9wdGlvblwiLCBcImtleWdlblwiLCBcIm91dHB1dFwiLCBcInByb2dyZXNzXCIsIFwibWV0ZXJcIl07XG4gICAgICAgIGxldCBjaGlsZE5vZGVzID0gZWxlbWVudC5jaGlsZE5vZGVzO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkTm9kZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChmb3JtRWxlbWVudHMuaW5kZXhPZihjaGlsZE5vZGVzW2ldLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkpID4gLTEpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZUNoaWxkKGNoaWxkTm9kZXNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAgICAgKiBAcGFyYW0gZWxlbWVudCBcbiAgICAgICAgICogQHBhcmFtIGlkU3RyIFxuICAgICAgICAgKiBAcmV0dXJucyB0cnVlIGlmIGFueSBvbmUgKGlmIG11bHRpcGxlIElkcykgaWQgcG9pbnRzIHRvIGl0c2VsZlxuICAgICAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzSWRSZWZlclRvU2VsZihlbGVtZW50LCBpZFN0cjogU3RyaW5nKSB7XG4gICAgICAgIGlmICghaWRTdHIgfHwgaWRTdHIudHJpbSgpID09PSAnJykgcmV0dXJuIGZhbHNlO1xuICAgICAgICBsZXQgaWRzID0gaWRTdHIudHJpbSgpLnNwbGl0KFwiIFwiKTtcbiAgICAgICAgZm9yIChsZXQgaiA9IDAsIGxlbmd0aCA9IGlkcy5sZW5ndGg7IGogPCBsZW5ndGg7ICsraikge1xuICAgICAgICAgICAgbGV0IHJlZmVycmVkTm9kZSA9IEZyYWdtZW50VXRpbC5nZXRCeUlkKGVsZW1lbnQsIGlkc1tqXSk7XG4gICAgICAgICAgICBpZiAocmVmZXJyZWROb2RlICYmIERPTVV0aWwuc2FtZU5vZGUocmVmZXJyZWROb2RlLCBlbGVtZW50KSkgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qIERldGVybWluZSB0aGUgbm9kZSBkZXB0aCBvZiB0aGUgZ2l2ZW4gZWxlbWVudCAqL1xuICAgIHB1YmxpYyBzdGF0aWMgbm9kZURlcHRoKGVsZW1lbnQpIHtcbiAgICAgICAgbGV0IGRlcHRoID0gMDtcbiAgICAgICAgbGV0IHdhbGtOb2RlID0gZWxlbWVudDtcbiAgICAgICAgd2hpbGUgKHdhbGtOb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgICB3YWxrTm9kZSA9IERPTVdhbGtlci5wYXJlbnROb2RlKHdhbGtOb2RlKTtcbiAgICAgICAgICAgIGRlcHRoID0gZGVwdGggKyAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZXB0aDtcbiAgICB9XG5cbiAgICAvKiBjb21wYXJlIG5vZGUgb3JkZXIgb2YgdGhlIDIgZ2l2ZW4gbm9kZXMgKi9cbiAgICAvKiByZXR1cm5zXG4gICAgICogICAwIGlmIHRoZSBub2RlcyBhcmUgZXF1YWxcbiAgICAgKiAgIDEgaWYgbm9kZSBiIGlzIGJlZm9yZSBub2RlIGFcbiAgICAgKiAgLTEgaWYgbm9kZSBhIGlzIGJlZm9yZSBub2RlIGJcbiAgICAgKiAgIDIgaWYgbm9kZSBhIGlzIG5lc3RlZCBpbiBub2RlIGJcbiAgICAgKiAgLTIgaWYgbm9kZSBiIGlzIG5lc3RlZCBpbiBub2RlIGFcbiAgICAgKiAgIG51bGwgaWYgZWl0aGVyIG5vZGUgaXMgbnVsbCBvciB0aGVpciBwYXJlbnQgbm9kZXMgYXJlIG5vdCBlcXVhbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgY29tcGFyZU5vZGVPcmRlcihub2RlQSwgbm9kZUIpIHtcbiAgICAgICAgaWYgKG5vZGVBID09PSBub2RlQikgcmV0dXJuIDA7XG5cbiAgICAgICAgbGV0IGFEZXB0aCA9IENvbW1vblV0aWwubm9kZURlcHRoKG5vZGVBKTtcbiAgICAgICAgbGV0IGJEZXB0aCA9IENvbW1vblV0aWwubm9kZURlcHRoKG5vZGVCKTtcbiAgICAgICAgaWYgKGJEZXB0aCA+IGFEZXB0aCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBiRGVwdGggLSBhRGVwdGg7ICsraSlcbiAgICAgICAgICAgICAgICBub2RlQiA9IERPTVdhbGtlci5wYXJlbnROb2RlKG5vZGVCKTtcbiAgICAgICAgICAgIGlmIChub2RlQSA9PT0gbm9kZUIpIC8vIE5vZGUgQiBuZXN0ZWQgaW4gTm9kZSBBXG4gICAgICAgICAgICAgICAgcmV0dXJuIC0yO1xuICAgICAgICB9IGVsc2UgaWYgKGFEZXB0aCA+IGJEZXB0aCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhRGVwdGggLSBiRGVwdGg7ICsraSlcbiAgICAgICAgICAgICAgICBub2RlQSA9IERPTVdhbGtlci5wYXJlbnROb2RlKG5vZGVBKTtcbiAgICAgICAgICAgIGlmIChub2RlQSA9PT0gbm9kZUIpIC8vIE5vZGUgQSBuZXN0ZWQgaW4gTm9kZSBCXG4gICAgICAgICAgICAgICAgcmV0dXJuIDI7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKG5vZGVBICE9IG51bGwgJiYgbm9kZUIgIT0gbnVsbCAmJiBET01XYWxrZXIucGFyZW50Tm9kZShub2RlQSkgIT0gRE9NV2Fsa2VyLnBhcmVudE5vZGUobm9kZUIpKSB7XG4gICAgICAgICAgICBub2RlQSA9IERPTVdhbGtlci5wYXJlbnROb2RlKG5vZGVBKTtcbiAgICAgICAgICAgIG5vZGVCID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUobm9kZUIpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlQSA9PT0gbnVsbCB8fCBub2RlQiA9PT0gbnVsbCB8fCBET01XYWxrZXIucGFyZW50Tm9kZShub2RlQSkgIT0gRE9NV2Fsa2VyLnBhcmVudE5vZGUobm9kZUIpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgd2hpbGUgKG5vZGVCICE9IG51bGwgJiYgbm9kZUIgIT0gbm9kZUEpXG4gICAgICAgICAgICBub2RlQiA9IG5vZGVCLnByZXZpb3VzU2libGluZztcbiAgICAgICAgaWYgKG5vZGVCID09PSBudWxsKSAvLyBub2RlQiBiZWZvcmUgbm9kZUFcbiAgICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICBlbHNlIHJldHVybiAtMTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiAgRGV0ZXJtaW5lIGlmIHRoZSBnaXZlbiBhdHRyaWJ1dGUgb2YgdGhlIGdpdmVuIGVsZW1lbnQgaXMgbm90IGVtcHR5XG4gICAgICogIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgYXR0cmlidXRlTm9uRW1wdHkoZWxlbWVudCwgYXR0clN0cikge1xuICAgICAgICByZXR1cm4gZWxlbWVudC5oYXNBdHRyaWJ1dGUoYXR0clN0cikgJiYgZWxlbWVudC5nZXRBdHRyaWJ1dGUoYXR0clN0cikudHJpbSgpLmxlbmd0aCA+IDA7XG4gICAgfVxuXG4gICAgLyogUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgZ2l2ZW4gZnJhbWUsIG51bGwgaWYgbm90IGZvdW5kICovXG4gICAgcHVibGljIHN0YXRpYyBnZXRGcmFtZUJ5TmFtZShydWxlQ29udGV4dCwgZnJhbWVOYW1lKSB7XG4gICAgICAgIGxldCB3aW5kb3cgPSBydWxlQ29udGV4dC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3O1xuICAgICAgICBsZXQgZnJhbWVMaXN0ID0gW3dpbmRvd107XG4gICAgICAgIGxldCBpZHggPSAwO1xuICAgICAgICB3aGlsZSAoaWR4IDwgZnJhbWVMaXN0Lmxlbmd0aCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoZnJhbWVMaXN0W2lkeF0ubmFtZSA9PT0gZnJhbWVOYW1lKSByZXR1cm4gZnJhbWVMaXN0W2lkeF07XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmcmFtZUxpc3RbaWR4XS5mcmFtZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEVuc3VyZSBpdCdzIGEgcmVhbCBmcmFtZSBhbmQgYXZvaWQgcmVjdXJzaW9uXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnJhbWVMaXN0W2lkeF0uZnJhbWVzW2ldICYmICFmcmFtZUxpc3QuaW5jbHVkZXMoZnJhbWVMaXN0W2lkeF0uZnJhbWVzW2ldKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lTGlzdC5wdXNoKGZyYW1lTGlzdFtpZHhdLmZyYW1lc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsgfVxuICAgICAgICAgICAgKytpZHg7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBkZWZhdWx0TlNSZXNvbHZlcihwcmVmaXgpIHtcbiAgICAgICAgbGV0IHVyaTtcbiAgICAgICAgc3dpdGNoIChwcmVmaXgpIHtcbiAgICAgICAgICAgIGNhc2UgJ2h0bWwnOlxuICAgICAgICAgICAgICAgIHVyaSA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJztcbiAgICAgICAgICAgIGNhc2UgJ3gyJzpcbiAgICAgICAgICAgICAgICB1cmkgPSAnaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwyJztcbiAgICAgICAgICAgIGNhc2UgJ3gnOlxuICAgICAgICAgICAgICAgIHVyaSA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJztcbiAgICAgICAgICAgIGNhc2UgJ3hodG1sJzpcbiAgICAgICAgICAgICAgICB1cmkgPSAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCc7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHVyaSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHVyaTtcbiAgICB9XG5cbiAgICAvL2NoZWNraW5nIGlmIG9ubHkgdGhlIGlubmVyIHRleHQgaXMgZW1wdHkgb3Igbm90XG4gICAgcHVibGljIHN0YXRpYyBpc0lubmVyVGV4dE9ubHlFbXB0eShlbGVtZW50KSB7XG4gICAgICAgIC8vIEdldCB0aGUgaW5uZXJUZXh0IG9mIHRoZSBlbGVtZW50XG4gICAgICAgIGxldCB0ZXh0ID0gZWxlbWVudC5pbm5lclRleHQ7XG5cbiAgICAgICAgaWYgKCh0ZXh0ID09PSB1bmRlZmluZWQgfHwgdGV4dCA9PT0gbnVsbCB8fCB0ZXh0LnRyaW0oKS5sZW5ndGggPT09IDApICYmIGVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gJ3Nsb3QnICYmIGVsZW1lbnQudGV4dENvbnRlbnQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy9pZ25vcmUgc2xvdCBiZWNhdXNlIGl0cyB0ZXh0IHdpbGwgYmUgZmlsbGVkIGJ5IHRoZSBjb3JyZXNwb25kaW5nIGNvbnRlbnQgaW4gdGhlIGxpZ2h0IERPTSBcbiAgICAgICAgICAgIC8vIGlubmVyVGV4dCBpcyBzb21ldGltZXMgJ3VuZGVmaW5lZCcgaW4gaGVhZGxlc3MgbW9kZSwgb3IgbnVsbCBpZiB0aGUgZWxlbWVudCBpcyBpbnZpc2libGUgb3Igbm90IGVyeHBhbmRlZCBcbiAgICAgICAgICAgIC8vIHNvIHdlIHRyeSB0ZXh0Q29udGVudCBhcyBhIHdvcmthcm91bmRcbiAgICAgICAgICAgIHRleHQgPSBlbGVtZW50LnRleHRDb250ZW50XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmV0VmFsID0gISh0ZXh0ICE9PSBudWxsICYmIHRleHQudHJpbSgpLmxlbmd0aCA+IDApO1xuICAgICAgICBpZiAoZWxlbWVudC5ub2RlVHlwZSA9PT0gMSAmJiBlbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwic2xvdFwiKSB7XG4gICAgICAgICAgICAvL1RPRE86IG5lZWQgdG8gY29uc2lkZSBpdHMgb3duIGNvbnRlbnQsIGEgc2xvdCBtYXkgaGF2ZSBpdHMgb3duIGNvbnRlbnQgb3IgYXNzaWduZWQgY29udGVudFxuICAgICAgICAgICAgZm9yIChjb25zdCBzbG90RWxlbSBvZiBlbGVtZW50LmFzc2lnbmVkTm9kZXMoKSkge1xuICAgICAgICAgICAgICAgIHJldFZhbCA9IHJldFZhbCAmJiBDb21tb25VdGlsLmlzSW5uZXJUZXh0RW1wdHkoc2xvdEVsZW0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVHJpbSB0aGUgaW5uZXIgdGV4dCBhbmQgdmVyaWZ5IHRoYXQgaXQgaXMgbm90IGVtcHR5LlxuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIC8qIFJldHVybiB0aGUgaW5uZXIgdGV4dCBvZiB0aGUgZ2l2ZW4gZWxlbWVudCAqL1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SW5uZXJUZXh0KGVsZW1lbnQpIHtcbiAgICAgICAgbGV0IHJldFZhbCA9IGVsZW1lbnQuaW5uZXJUZXh0O1xuICAgICAgICBpZiAocmV0VmFsID09PSB1bmRlZmluZWQgfHwgcmV0VmFsID09PSBudWxsIHx8IHJldFZhbC50cmltKCkgPT09IFwiXCIpXG4gICAgICAgICAgICByZXRWYWwgPSBlbGVtZW50LnRleHRDb250ZW50O1xuICAgICAgICByZXR1cm4gcmV0VmFsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHJldHVybiBvbnNjcmVlbiBpbm5lclRleHQgb25seS5cbiAgICAgKiBUaGlzIGZ1bmN0aW9uIHNob3VsZCByZXR1cm4gdGhlIHNhbWUgcmVzdWx0IGFzIGlubmVyVGV4dCBpZiBubyBvZmZzY3JlZW4gY29udGVudCBleGlzdHNcbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBub2RlIFRoZSBub2RlIHdoaWNoIHNob3VsZCBiZSBjaGVja2VkIGl0IGhhcyBpbm5lciB0ZXh0IG9yIG5vdC5cbiAgICAgKiBAcmV0dXJuIHtudWxsIHwgc3RyaW5nfSBudWxsIGlmIGVsZW1lbnQgaGFzIGVtcHR5IGlubmVyIHRleHQsIHRleHQgb3RoZXJ3aXNlXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGdldE9uU2NyZWVuSW5uZXJUZXh0KGVsZW1lbnQpIHtcbiAgICAgICAgaWYgKCFlbGVtZW50KSByZXR1cm4gbnVsbDtcbiAgICAgICAgaWYgKGVsZW1lbnQubm9kZVR5cGUgPT09IDMpIHJldHVybiBlbGVtZW50Lm5vZGVWYWx1ZSgpO1xuXG4gICAgICAgIGxldCB0ZXh0ID0gXCJcIjtcbiAgICAgICAgbGV0IG53ID0gbmV3IERPTVdhbGtlcihlbGVtZW50KTtcbiAgICAgICAgLy8gTG9vcCBvdmVyIGFsbCB0aGUgY2hpbGRyZW5zIG9mIHRoZSBlbGVtZW50IHRvIGdldCB0aGUgdGV4dFxuICAgICAgICB3aGlsZSAobncubmV4dE5vZGUoKSAmJiBudy5ub2RlICE9PSBlbGVtZW50ICYmIG53Lm5vZGUgIT09IGVsZW1lbnQucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgaWYgKG53LmJFbmRUYWcpIGNvbnRpbnVlO1xuICAgICAgICAgICAgaWYgKG53Lm5vZGUubm9kZVR5cGUgPT09IDEgJiYgKFZpc1V0aWwuaGlkZGVuQnlEZWZhdWx0RWxlbWVudHMuaW5jbHVkZXMobncubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSB8fCAhVmlzVXRpbC5pc05vZGVWaXNpYmxlKG53Lm5vZGUpIHx8IFZpc1V0aWwuaXNFbGVtZW50T2Zmc2NyZWVuKG53Lm5vZGUgYXMgSFRNTEVsZW1lbnQpKSkgeyBcbiAgICAgICAgICAgICAgICAvKiogc3BlY2lhbCBjYXNlIGZvciBzdmcgPHRpdGxlPiBlbGVtZW50OiBcbiAgICAgICAgICAgICAgICAgKiAgICAgdGV4dCBpbiBhIDx0aXRsZT4gZWxlbWVudCBpcyBub3QgcmVuZGVyZWQgYXMgcGFydCBvZiB0aGUgZ3JhcGhpYywgYnV0IGJyb3dzZXJzIHVzdWFsbHkgZGlzcGxheSBpdCBhcyBhIHRvb2x0aXBcbiAgICAgICAgICAgICAgICAgKiAgICAgbm90ZSBzb21lIHN2ZyBlbGVtZW50cywgc3VjaCBhcyB0aXRsZSwgZGVzYywgaGF2ZSBhIGJvdW5kcyB7XCJsZWZ0XCI6MCxcInRvcFwiOjAsXCJoZWlnaHRcIjowLFwid2lkdGhcIjowfVxuICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgaWYgKG53Lm5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ3RpdGxlJyAmJiBDb21tb25VdGlsLmdldEFuY2VzdG9yKG53Lm5vZGUsIFwic3ZnXCIpKSBcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBpZiAobncubm9kZS5uZXh0U2libGluZykge1xuICAgICAgICAgICAgICAgICAgICBpZiAobncubm9kZS5uZXh0U2libGluZy5ub2RlVHlwZSA9PT0gMyAmJiBudy5ub2RlLm5leHRTaWJsaW5nLm5vZGVWYWx1ZSAmJiBudy5ub2RlLm5leHRTaWJsaW5nLm5vZGVWYWx1ZS50cmltKCkgIT09ICcnKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCArPSAnICcgKyBudy5ub2RlLm5leHRTaWJsaW5nLm5vZGVWYWx1ZS50cmltKCk7XG4gICAgICAgICAgICAgICAgICAgIG53Lm5vZGUgPSBudy5ub2RlLm5leHRTaWJsaW5nO1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2VcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobncubm9kZS5ub2RlVHlwZSA9PT0gMyAmJiBudy5ub2RlLm5vZGVWYWx1ZSAmJiBudy5ub2RlLm5vZGVWYWx1ZS50cmltKCkgIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgdGV4dCArPSAnICcgKyBudy5ub2RlLm5vZGVWYWx1ZS50cmltKCk7IFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0ZXh0LnRyaW0oKTtcbiAgICB9XG5cbiAgICAvKiogUmV0dXJuIHRoZSB0ZXh0IGNvbnRlbnQgb2YgdGhlIGdpdmVuIG5vZGUgXG4gICAgICogIHRoaXMgaXMgZGlmZmVyZW50IHRoYW4gaW5uZXJUZXh0IG9yIHRleHRDb250ZW50IHRoYXQgcmV0dXJuIHRleHQgY29udGVudCBvZiBhIG5vZGUgYW5kIGl0cyBkZXNjZW5kYW50c1xuICAgICovXG4gICAgcHVibGljIHN0YXRpYyBnZXROb2RlVGV4dChlbGVtZW50KSB7XG4gICAgICAgIGlmICghZWxlbWVudCkgcmV0dXJuIFwiXCI7XG4gICAgICAgIGxldCB0ZXh0ID0gXCJcIjtcbiAgICAgICAgbGV0IGNoaWxkTm9kZXMgPSBlbGVtZW50LmNoaWxkTm9kZXM7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGROb2Rlcy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgaWYgKGNoaWxkTm9kZXNbaV0ubm9kZVR5cGUgPT0gMykge1xuICAgICAgICAgICAgICAgIHRleHQgKz0gY2hpbGROb2Rlc1tpXS5ub2RlVmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgY2hlY2tpbmcgaWYgZWxlbWVudHMgaW5uZXIgdGV4dCBpcyBlbXB0eSBvciBub3QuXG4gICAgICpcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gbm9kZSBUaGUgbm9kZSB3aGljaCBzaG91bGQgYmUgY2hlY2tlZCBpdCBoYXMgaW5uZXIgdGV4dCBvciBub3QuXG4gICAgICogQHJldHVybiB7Ym9vbH0gdHJ1ZSBpZiBlbGVtZW50IGhhcyBlbXB0eSBpbm5lciB0ZXh0LCBmYWxzZSBvdGhlcndpc2VcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgaXNJbm5lclRleHRFbXB0eShlbGVtZW50KSB7XG4gICAgICAgIC8vIEdldCB0aGUgaW5uZXJUZXh0IG9mIHRoZSBlbGVtZW50XG4gICAgICAgIGxldCB0ZXh0ID0gQ29tbW9uVXRpbC5nZXRJbm5lclRleHQoZWxlbWVudCk7XG5cbiAgICAgICAgLy8gVHJpbSB0aGUgaW5uZXIgdGV4dCBhbmQgdmVyaWZ5IHRoYXQgaXQgaXMgbm90IGVtcHR5LlxuICAgICAgICByZXR1cm4gISh0ZXh0ICE9IG51bGwgJiYgdGV4dC50cmltKCkubGVuZ3RoID4gMCk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBoYXNJbm5lckNvbnRlbnQoZWxlbWVudCkge1xuICAgICAgICBsZXQgdGV4dCA9IENvbW1vblV0aWwuZ2V0SW5uZXJUZXh0KGVsZW1lbnQpO1xuICAgICAgICBsZXQgaGFzQ29udGVudCA9ICh0ZXh0ICE9PSBudWxsICYmIHRleHQudHJpbSgpLmxlbmd0aCA+IDApO1xuXG4gICAgICAgIGlmIChlbGVtZW50LmZpcnN0Q2hpbGQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIGxldCBudyA9IG5ldyBET01XYWxrZXIoZWxlbWVudCk7XG4gICAgICAgICAgICB3aGlsZSAoIWhhc0NvbnRlbnQgJiYgbncubmV4dE5vZGUoKSkge1xuICAgICAgICAgICAgICAgIGhhc0NvbnRlbnQgPSAobncubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImltZ1wiICYmXG4gICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkobncubm9kZSwgXCJhbHRcIikpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoYXNDb250ZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGRldGVybWluZSBpZiBhbiBlbGVtZW50IGhhcyBpbm5lciBjb250ZW50LlxuICAgICAqIFRoaXMgZnVuY3Rpb24gYWxzbyBjb25zaWRlcnMgY2FzZXMgd2hlcmUgaW5uZXIgdGV4dCBpcyBoaWRkZW4sIHdoaWNoIG5vdyB3aWxsXG4gICAgICogYmUgY2xhc3NpZmllZCBhcyBkb2VzIG5vdCBoYXZlIGhpZGRlbiBjb250ZW50LlxuICAgICAqXG4gICAgICogQHBhcm0ge2VsZW1lbnR9IG5vZGUgVGhlIG5vZGUgd2hpY2ggc2hvdWxkIGJlIGNoZWNrZWQgaXQgaGFzIGlubmVyIHRleHQgb3Igbm90LlxuICAgICAqIEByZXR1cm4ge2Jvb2x9IHRydWUgaWYgZWxlbWVudCBoYXMgZW1wdHkgaW5uZXIgdGV4dCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgICpcbiAgICAgKiBAbWVtYmVyT2YgQXJpYVV0aWxcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGhhc0lubmVyQ29udGVudEhpZGRlbihlbGVtZW50KSB7XG4gICAgICAgIHJldHVybiBDb21tb25VdGlsLmhhc0lubmVyQ29udGVudEhpZGRlbkh5cGVyTGluayhlbGVtZW50LCBmYWxzZSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBzdmdIYXNOYW1lKGVsZW1lbnQ6IFNWR0VsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkoZWxlbWVudCwgXCJhcmlhLWxhYmVsXCIpXG4gICAgICAgICAgICB8fCBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KGVsZW1lbnQsIFwiYXJpYS1sYWJlbGxlZGJ5XCIpXG4gICAgICAgICAgICB8fCAhIWVsZW1lbnQucXVlcnlTZWxlY3RvcihcIjpzY29wZSA+IHRpdGxlXCIpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgaGFzSW5uZXJDb250ZW50SGlkZGVuSHlwZXJMaW5rKGVsZW1lbnQsIGh5cGVybGlua19mbGFnKSB7XG4gICAgICAgIGlmICghZWxlbWVudCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAvLyBWYXJpYWJsZSBEZWNsZXJhdGlvblxuICAgICAgICBsZXQgY2hpbGRFbGVtZW50ID0gZWxlbWVudC5maXJzdEVsZW1lbnRDaGlsZDtcbiAgICAgICAgbGV0IGhhc0NvbnRlbnQgPSBmYWxzZTtcblxuICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IHRoZSBjaGlsZEVsZW1lbnQgaXMgbm90IG51bGwgdGhlbiB3ZSBuZWVkIHRvIGNoZWNrIGVhY2ggb2YgdGhlIGVsZW1lbnRzXG4gICAgICAgIC8vIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBlbGVtZW50cyBhcmUgbm90IGFsbCBoaWRkZW4uXG4gICAgICAgIGlmIChjaGlsZEVsZW1lbnQgIT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gR2V0IHRoZSBub2Rld2FsdGVyIG9mIHRoZSBlbGVtZW50IG5vZGUsIHNvIHRoYXQgd2UgY2FuIGxvb3Agb3ZlciBpdCBhbmQgdmVyaWZ5XG4gICAgICAgICAgICAvLyB0aGF0IHRoZSBlbGVtZW50cyB1bmRlciB0aGUgZWxlbWVudCBhcmUgbm90IGNvbXBsZXRseSBoaWRkZW4uXG4gICAgICAgICAgICBsZXQgbncgPSBuZXcgRE9NV2Fsa2VyKGVsZW1lbnQpO1xuICAgICAgICAgICAgLy8gTG9vcCBvdmVyIGFsbCB0aGUgbm9kZXMgdW50aWwgdGhlcmUgYXJlIG5vIG1vcmUgbm9kZXMgb3Igd2UgaGF2ZSBkZXRlcm1pbmUgdGhhdCB0aGVyZSBpcyBjb250ZW50IHVuZGVyXG4gICAgICAgICAgICAvLyB0aGlzIHBhcmVudCBlbGVtZW50LlxuICAgICAgICAgICAgd2hpbGUgKCFoYXNDb250ZW50ICYmIG53Lm5leHROb2RlKCkgJiYgbncubm9kZSAhPSBlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBuZXh0IG5vZGVcbiAgICAgICAgICAgICAgICBsZXQgbm9kZSA9IG53Lm5vZGU7XG5cbiAgICAgICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSBhbiBpbWcgZWxlbWVudCBpcyBwcmVzZW50IHdpdGggYWx0IHRoZW4gd2UgY2FuIG1hcmsgdGhpcyBhcyBwYXNzXG4gICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIGtlZXAgY2hlY2tpbmcgYWxsIHRoZSBvdGhlciBlbGVtZW50cy4gTWFrZSBzdXJlIHRoYXQgdGhpcyBpbWFnZSBlbGVtZW50IGlzIG5vdCBoaWRkZW4uXG4gICAgICAgICAgICAgICAgaGFzQ29udGVudCA9IChcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImltZ1wiXG4gICAgICAgICAgICAgICAgICAgICYmIChDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KG5vZGUsIFwiYWx0XCIpIHx8IENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkobm9kZSwgXCJ0aXRsZVwiKSlcbiAgICAgICAgICAgICAgICAgICAgJiYgIVZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKG5vZGUgYXMgSFRNTEVsZW1lbnQpICYmICFWaXNVdGlsLmlzTm9kZVByZXNlbnRhdGlvbmFsKG5vZGUgYXMgSFRNTEVsZW1lbnQpXG4gICAgICAgICAgICAgICAgKSB8fCAoXG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwic3ZnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICYmIENvbW1vblV0aWwuc3ZnSGFzTmFtZShub2RlIGFzIGFueSlcbiAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIC8vIE5vdyB3ZSBjaGVjayBpZiB0aGlzIG5vZGUgaXMgb2YgdHlwZSBlbGVtZW50LCB2aXNpYmxlXG4gICAgICAgICAgICAgICAgaWYgKCFoYXNDb250ZW50ICYmIG5vZGUubm9kZVR5cGUgPT09IDEgJiYgIVZpc1V0aWwuaXNOb2RlSGlkZGVuRnJvbUFUKG5vZGUgYXMgSFRNTEVsZW1lbnQpICYmICFWaXNVdGlsLmlzTm9kZVByZXNlbnRhdGlvbmFsKG5vZGUgYXMgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBpbm5lclRleHQgb2YgdGhlIGVsZW1lbnQgaXMgZW1wdHkgb3Igbm90XG4gICAgICAgICAgICAgICAgICAgIGhhc0NvbnRlbnQgPSAhQ29tbW9uVXRpbC5pc0lubmVyVGV4dE9ubHlFbXB0eShub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNDb250ZW50ICYmIGh5cGVybGlua19mbGFnID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBoYXNDb250ZW50ID0gQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShub2RlLCBcImFyaWEtbGFiZWxcIikgfHwgQ29tbW9uVXRpbC5hdHRyaWJ1dGVOb25FbXB0eShub2RlLCBcImFyaWEtbGFiZWxsZWRieVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkb2MgPSBub2RlLm93bmVyRG9jdW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG9jKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHdpbiA9IGRvYy5kZWZhdWx0VmlldztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod2luKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjU3R5bGUgPSB3aW4uZ2V0Q29tcHV0ZWRTdHlsZShub2RlIGFzIGFueSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaGFzQ29udGVudCAmJiBjU3R5bGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhjU3R5bGUuYmFja2dyb3VuZEltYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coY1N0eWxlLmNvbnRlbnQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNDb250ZW50ID0gKChjU3R5bGUuYmFja2dyb3VuZEltYWdlICYmIGNTdHlsZS5iYWNrZ3JvdW5kSW1hZ2UuaW5kZXhPZikgfHwgY1N0eWxlLmNvbnRlbnQpICYmIENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkobm9kZSwgXCJhbHRcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBjYXNlcyB3aGVyZSB0aGVyZSBpcyB0ZXh0IG5vZGUgYWZ0ZXIgYW4gZWxlbWVudCB1bmRlciB0aGUgcGFyZW50XG4gICAgICAgICAgICAgICAgLy8gSW4gdGhlIGNhc2Ugd2UgZGV0ZWN0IG5vZGV0eXBlIGFzIHRleHQgbm9kZSBhbmQgdGhlIHBhdGVudCBvZiB0aGUgdGV4dCBub2RlIGlzXG4gICAgICAgICAgICAgICAgLy8gdGhlIHNhbWUgZWxlbWVudCB3ZSBhcmUgY2hlY2tpbmcgaGFzIElubmVyIGNvbnRlbnQgZm9yIHRoZW4gZ2V0IHRoZSBpbm5lciBjb250ZW50IG9mIHRoaXNcbiAgICAgICAgICAgICAgICAvLyB0ZXh0IG5vZGUuXG4gICAgICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDMgJiYgRE9NV2Fsa2VyLnBhcmVudEVsZW1lbnQobm9kZSkgPT09IGVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGlubmVyVGV4dCBvZiB0aGUgZWxlbWVudCBpcyBlbXB0eSBvciBub3RcbiAgICAgICAgICAgICAgICAgICAgaGFzQ29udGVudCA9ICFDb21tb25VdGlsLmlzSW5uZXJUZXh0RW1wdHkobm9kZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEluIHRoZSBjYXNlIHRoZXJlIGFyZSBubyBjaGlsZCBlbGVtZW50cyB0aGVuIHdlIGNhbiBzaW1wbHkgcGVyZm9ybSB0aGUgY2hlY2sgZm9yIG9ubHkgaW5uZXJ0ZXh0XG4gICAgICAgIC8vIHRoZSBpbWcgd2l0aCBhbHQgY2FzZSB3aWxsIGJlIGNvdmVyZWQgaW4gdGhlIGFib3ZlIGlmLCBhcyBpbWcgaXMgY29uc2lkZXJzIGFzIGFuIGVsZW1lbnQuXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGlubmVyVGV4dCBvZiB0aGUgZWxlbWVudCBpcyBlbXB0eSBvciBub3RcbiAgICAgICAgICAgIGhhc0NvbnRlbnQgPSAhQ29tbW9uVXRpbC5pc0lubmVyVGV4dEVtcHR5KGVsZW1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGhhc0NvbnRlbnQ7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBoYXNJbm5lckNvbnRlbnRPckFsdChlbGVtZW50KSB7XG4gICAgICAgIGxldCB0ZXh0ID0gQ29tbW9uVXRpbC5nZXRJbm5lclRleHQoZWxlbWVudCk7XG4gICAgICAgIGxldCBoYXNDb250ZW50ID0gKHRleHQgIT0gbnVsbCAmJiB0ZXh0LnRyaW0oKS5sZW5ndGggPiAwKSB8fCBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KGVsZW1lbnQsIFwiYWx0XCIpO1xuXG4gICAgICAgIGlmIChlbGVtZW50LmZpcnN0Q2hpbGQgIT0gbnVsbCkge1xuICAgICAgICAgICAgbGV0IG53ID0gbmV3IERPTVdhbGtlcihlbGVtZW50KTtcbiAgICAgICAgICAgIHdoaWxlICghaGFzQ29udGVudCAmJiBudy5uZXh0Tm9kZSgpICYmIG53Lm5vZGUgIT0gZWxlbWVudCkge1xuICAgICAgICAgICAgICAgIGhhc0NvbnRlbnQgPSAobncubm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImltZ1wiICYmXG4gICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwuYXR0cmlidXRlTm9uRW1wdHkobncubm9kZSwgXCJhbHRcIikpO1xuICAgICAgICAgICAgICAgIGlmICghaGFzQ29udGVudFxuICAgICAgICAgICAgICAgICAgICAmJiAoQXJpYVV0aWwuaGFzUm9sZShudy5ub2RlLCBcImJ1dHRvblwiLCB0cnVlKSB8fCBBcmlhVXRpbC5oYXNSb2xlKG53Lm5vZGUsIFwidGV4dGJveFwiKSlcbiAgICAgICAgICAgICAgICAgICAgJiYgKEFyaWFVdGlsLmhhc0FyaWFMYWJlbChudy5ub2RlKSB8fCBDb21tb25VdGlsLmF0dHJpYnV0ZU5vbkVtcHR5KG53Lm5vZGUsIFwidGl0bGVcIikgfHwgQ29tbW9uVXRpbC5nZXRMYWJlbEZvckVsZW1lbnRIaWRkZW4obncuZWxlbSgpLCB0cnVlKSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaGFzQ29udGVudCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGhhc0NvbnRlbnQ7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjb25jYXRVbmlxdWVBcnJheUl0ZW0oaXRlbTogc3RyaW5nLCBhcnI6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICAgICAgICBhcnIuaW5kZXhPZihpdGVtKSA9PT0gLTEgJiYgaXRlbSAhPT0gbnVsbCA/IGFyci5wdXNoKGl0ZW0pIDogZmFsc2U7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBjb25jYXRVbmlxdWVBcnJheUl0ZW1MaXN0KGl0ZW1MaXN0OiBzdHJpbmdbXSwgYXJyOiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGl0ZW1MaXN0ICE9PSBudWxsICYmIGkgPCBpdGVtTGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJyID0gQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW0oaXRlbUxpc3RbaV0sIGFycik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiByZW1vdmUgYXJyYXkgaXRlbXMgZnJvbSBhIGdpdmVuIGFycmF5XG4gICAgICogQHBhcmFtIGl0ZW1MaXN0IGl0ZW1zIHRvIGJlIHJlbW92ZWQgZnJvbSBhcnJcbiAgICAgKiBAcGFyYW0gYXJyIHRoZSBhcnJheVxuICAgICAqIEByZXR1cm5zIFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgcmVkdWNlQXJyYXlJdGVtTGlzdChpdGVtTGlzdDogc3RyaW5nW10sIGFycjogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gICAgICAgIGlmIChhcnIgJiYgYXJyLmxlbmd0aCA+IDAgJiYgaXRlbUxpc3QgJiYgaXRlbUxpc3QubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGFyci5maWx0ZXIoKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICFpdGVtTGlzdC5pbmNsdWRlcyh2YWx1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldFNjb3BlRm9yVGgoZWxlbWVudCkge1xuICAgICAgICAvKiogaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L3RhYnVsYXItZGF0YS5odG1sI2hlYWRlci1hbmQtZGF0YS1jZWxsLXNlbWFudGljc1xuICAgICAgICAgKiBBIGhlYWRlciBjZWxsIGFuY2hvcmVkIGF0IHRoZSBzbG90IHdpdGggY29vcmRpbmF0ZSAoeCwgeSkgd2l0aCB3aWR0aCB3aWR0aCBhbmQgaGVpZ2h0IGhlaWdodCBpcyBcbiAgICAgICAgICogc2FpZCB0byBiZSBhIGNvbHVtbiBoZWFkZXIgaWYgYW55IG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgdHJ1ZTpcbiAgICAgICAgICogKiBUaGUgY2VsbCdzIHNjb3BlIGF0dHJpYnV0ZSBpcyBpbiB0aGUgY29sdW1uIHN0YXRlLCBvclxuICAgICAgICAgKiAqIFRoZSBjZWxsJ3Mgc2NvcGUgYXR0cmlidXRlIGlzIGluIHRoZSBhdXRvIHN0YXRlLCBhbmQgdGhlcmUgYXJlIG5vIGRhdGEgY2VsbHMgaW4gYW55IG9mIFxuICAgICAgICAgKiAgIHRoZSBjZWxscyBjb3ZlcmluZyBzbG90cyB3aXRoIHktY29vcmRpbmF0ZXMgeSAuLiB5K2hlaWdodC0xLlxuICAgICAgICAgKiBBIGhlYWRlciBjZWxsIGFuY2hvcmVkIGF0IHRoZSBzbG90IHdpdGggY29vcmRpbmF0ZSAoeCwgeSkgd2l0aCB3aWR0aCB3aWR0aCBhbmQgaGVpZ2h0IGhlaWdodCBpc1xuICAgICAgICAgKiBzYWlkIHRvIGJlIGEgcm93IGhlYWRlciBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSB0cnVlOlxuICAgICAgICAgKiAqIFRoZSBjZWxsJ3Mgc2NvcGUgYXR0cmlidXRlIGlzIGluIHRoZSByb3cgc3RhdGUsIG9yXG4gICAgICAgICAqICogVGhlIGNlbGwncyBzY29wZSBhdHRyaWJ1dGUgaXMgaW4gdGhlIGF1dG8gc3RhdGUsIHRoZSBjZWxsIGlzIG5vdCBhIGNvbHVtbiBoZWFkZXIsIGFuZCB0aGVyZSBhcmVcbiAgICAgICAgICogICBubyBkYXRhIGNlbGxzIGluIGFueSBvZiB0aGUgY2VsbHMgY292ZXJpbmcgc2xvdHMgd2l0aCB4LWNvb3JkaW5hdGVzIHggLi4geCt3aWR0aC0xLlxuICAgICAgICAgKi9cbiAgICAgICAgLy8gTm90ZTogYXV0byBpcyBkZWZhdWx0IHNjb3BlXG5cbiAgICAgICAgLy8gRWFzaWVzdCBhbnN3ZXIgaXMgaWYgc2NvcGUgaXMgc3BlY2lmaWVkXG4gICAgICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZShcInNjb3BlXCIpKSB7XG4gICAgICAgICAgICBsZXQgc2NvcGUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShcInNjb3BlXCIpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICBpZiAoc2NvcGUgPT09IFwicm93XCIgfHwgc2NvcGUgPT09ICdyb3dncm91cCcpIHJldHVybiBcInJvd1wiO1xuICAgICAgICAgICAgaWYgKHNjb3BlID09PSBcImNvbFwiIHx8IHNjb3BlID09PSAnY29sZ3JvdXAnKSByZXR1cm4gXCJjb2x1bW5cIjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNjb3BlIGlzIGF1dG8sIGRlZmF1bHQgKHdpdGhvdXQgYSBzY29wZSkgb3IgaW52YWxpZCB2YWx1ZS5cbiAgICAgICAgLy8gaWYgYWxsIHRoZSBzaWJsaW5nIGVsZW1lbnRzIGFyZSB0aCwgdGhlbiByZXR1cm4gXCJjb2x1bW5oZWFkZXJcIiBcbiAgICAgICAgdmFyIHNpYmxpbmdzID0gWy4uLmVsZW1lbnQucGFyZW50RWxlbWVudC5jaGlsZHJlbl0uZmlsdGVyKG5vZGUgPT4gbm9kZS5ub2RlVHlwZSA9PT0gMSAmJiBub2RlLnRhZ05hbWUudG9Mb3dlckNhc2UoKSAhPSBcInRoXCIpO1xuICAgICAgICBpZiAoc2libGluZ3MgPT09IG51bGwgfHwgc2libGluZ3MubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIFwiY29sdW1uXCI7XG4gICAgICAgIGVsc2UgcmV0dXJuIFwicm93XCI7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBnZXRDb250cm9sT2ZMYWJlbChub2RlOiBOb2RlKSB7XG4gICAgICAgIC8vIEhhbmRsZSB0aGUgZWFzeSBjYXNlIG9mIGxhYmVsIC0+IGZvclxuICAgICAgICBjb25zdCBsYWJlbEFuY2VzdG9yID0gQ29tbW9uVXRpbC5nZXRBbmNlc3Rvcihub2RlLCBcImxhYmVsXCIpO1xuICAgICAgICBpZiAobGFiZWxBbmNlc3RvciAmJiBsYWJlbEFuY2VzdG9yLmhhc0F0dHJpYnV0ZShcImZvclwiKSkge1xuICAgICAgICAgICAgcmV0dXJuIEZyYWdtZW50VXRpbC5nZXRCeUlkKG5vZGUsIGxhYmVsQW5jZXN0b3IuZ2V0QXR0cmlidXRlKFwiZm9yXCIpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENyZWF0ZSBhIGRpY3Rpb25hcnkgY29udGFpbmluZyBpZHMgb2YgcGFyZW50IG5vZGVzXG4gICAgICAgIGNvbnN0IGlkRGljdCA9IHt9O1xuICAgICAgICBsZXQgcGFyZW50V2FsayA9IG5vZGU7XG4gICAgICAgIHdoaWxlIChwYXJlbnRXYWxrKSB7XG4gICAgICAgICAgICBpZiAocGFyZW50V2Fsay5ub2RlVHlwZSA9PT0gMSAvKiBOb2RlLkVMRU1FTlRfTk9ERSAqLykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGFuY2VzdG9yID0gcGFyZW50V2FsayBhcyBFbGVtZW50O1xuICAgICAgICAgICAgICAgIGlmIChhbmNlc3Rvci5oYXNBdHRyaWJ1dGUoXCJpZFwiKSkge1xuICAgICAgICAgICAgICAgICAgICBpZERpY3RbYW5jZXN0b3IuZ2V0QXR0cmlidXRlKFwiaWRcIildID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBwYXJlbnRXYWxrID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUocGFyZW50V2Fsayk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFYXJseSByZXR1cm4gaWYgbm8gYW5jZXN0b3IgSURzIGZvdW5kXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhpZERpY3QpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYWNoZSBhcmlhLWxhYmVsbGVkYnkgYXR0cmlidXRlIGlmIG5vZGUgaXMgYW4gZWxlbWVudFxuICAgICAgICBjb25zdCBub2RlQXJpYUxhYmVsbGVkQnkgPSBub2RlLm5vZGVUeXBlID09PSAxID8gKG5vZGUgYXMgRWxlbWVudCkuZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpIDogbnVsbDtcblxuICAgICAgICAvLyBJdGVyYXRlIHRocm91Z2ggY29udHJvbHMgdGhhdCB1c2UgYXJpYS1sYWJlbGxlZGJ5IGFuZCBzZWUgaWYgYW55IG9mIHRoZW0gcmVmZXJlbmNlIG9uZSBvZiBteSBhbmNlc3RvciBpZHNcbiAgICAgICAgY29uc3QgaW5wdXRzVXNpbmdMYWJlbGxlZEJ5ID0gQ2FjaGVVdGlsLmdldFNldENhY2hlKFxuICAgICAgICAgICAgbm9kZS5vd25lckRvY3VtZW50LCBcbiAgICAgICAgICAgIFwiQ29tbW9uVXRpbDo6Z2V0Q29udHJvbE9mTGFiZWxcIiwgXG4gICAgICAgICAgICAoKSA9PiAgbm9kZS5vd25lckRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCIqW2FyaWEtbGFiZWxsZWRieV1cIilcbiAgICAgICAgKTtcblxuICAgICAgICBmb3IgKGxldCBpZHggPSAwOyBpZHggPCBpbnB1dHNVc2luZ0xhYmVsbGVkQnkubGVuZ3RoOyArK2lkeCkge1xuICAgICAgICAgICAgY29uc3QgaW5wdXRVc2luZ0xhYmVsbGVkQnkgPSBpbnB1dHNVc2luZ0xhYmVsbGVkQnlbaWR4XTtcbiAgICAgICAgICAgIGNvbnN0IGFyaWFMYWJlbGxlZEJ5ID0gaW5wdXRVc2luZ0xhYmVsbGVkQnkuZ2V0QXR0cmlidXRlKFwiYXJpYS1sYWJlbGxlZGJ5XCIpO1xuICAgICAgICAgICAgY29uc3Qgc3AgPSBhcmlhTGFiZWxsZWRCeS5zcGxpdChcIiBcIik7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIHNwKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlkIGluIGlkRGljdCAmJiAhQ29tbW9uVXRpbC5pc0lkUmVmZXJUb1NlbGYobm9kZSwgbm9kZUFyaWFMYWJlbGxlZEJ5KSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5wdXRVc2luZ0xhYmVsbGVkQnk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRmluZCB0aGUgY2FzZXMgd2hlcmUgd2UncmUgd2l0aGluIGFuIGFyaWEgbGFiZWxsZWRieVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBjaGVja2luZyBpZiB0aGUgbm9kZSB0aGF0IGlzIHByb3ZpZWQgaXNcbiAgICAgKiBkaXNhYmxlZCBvciBub3QuIEZvbGxvd2luZyBpcyBob3cgdGhlIGNoZWNrIGlzIHBlcmZvcm1lZDpcbiAgICAgKiAgICAxLiBDaGVjayBpZiB0aGUgY3VycmVudCBub2RlIGlzIGRpc2FibGVkIHdpdGggdGhlIGZvbGxvd2luZyBvcHRpb25zOlxuICAgICAqICAgICAgIGF0dHJpYnV0ZSAtLT4gZGlzYWJsZWRcbiAgICAgKiAgICAgICAgIEFsc28gbmVlZHMgdG8gYmUgXCJidXR0b25cIiwgXCJpbnB1dFwiLCBcInNlbGVjdFwiLCBcInRleHRhcmVhXCIsIFwib3B0Z3JvdXBcIiwgXCJvcHRpb25cIixcbiAgICAgKiAgICAgICAgIFwibWVudWl0ZW1cIiwgXCJmaWVsZHNldFwiIG5vZGVzIChpbiBhcnJheSBlbGVtZW50c0FsbG93ZWREaXNhYmxlZClcbiAgICAgKiAgICAgICBhdHRyaWJ1dGUgLS0+IGFyaWEtZGlzYWJsZWQ9XCJ0cnVlXCJcbiAgICAgKiAgICAyLiBDaGVjayBpZiBhbnkgb2YgdGhlIGN1cnJlbnQgbm9kZXMgcGFyZW50cyBhcmUgZGlzYWJsZWQgd2l0aCB0aGUgc2FtZVxuICAgICAqICAgICAgIG9wdGlvbnMgbGlzdGVkIGluIDEuXG4gICAgICpcbiAgICAgKiAgICBOb3RlOiBJZiBlaXRoZXIgY3VycmVudCBub2RlIG9yIGFueSBvZiB0aGUgcGFyZW50IG5vZGVzIGFyZSBkaXNhYmxlZCB0aGVuIHRoaXNcbiAgICAgKiAgICAgICAgICBmdW5jdGlvbiB3aWxsIHJldHVybiB0cnVlIChub2RlIGlzIGRpc2FibGVkKS5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtIVE1MRWxlbWVudH0gbm9kZSAtIFRoZSBub2RlIHdoaWNoIHNob3VsZCBiZSBjaGVja2VkIGlmIGl0IGlzIGRpc2FibGVkIG9yIG5vdC5cbiAgICAgKiBAcmV0dXJuIHtib29sfSB0cnVlIGlmIHRoZSBub2RlIGlzIGRpc2FibGVkLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgaXNOb2RlRGlzYWJsZWQobm9kZSkge1xuXG4gICAgICAgIC8vIFNldCBQVF9OT0RFX0RJU0FCTEVEIHRvIGZhbHNlIGZvciBhbGwgdGhlIG5vZGVzLCBiZWZvcmUgdGhlIGNoZWNrIGFuZCB0aGlzIHdpbGwgYmUgY2hhbmdlZCB0b1xuICAgICAgICAvLyB0cnVlIHdoZW4gd2UgZGV0ZWN0IHRoYXQgdGhlIG5vZGUgaXMgZGlzYWJsZWQuIFdlIGhhdmUgdG8gc2V0IGl0IHRvIGZhbHNlIHNvIHRoYXQgd2Uga25vd1xuICAgICAgICAvLyB0aGUgbm9kZSBoYXMgYWxyZWFkeSBiZWVuIGNoZWNrZWQuIE9ubHkgc2V0IGl0IHRvIGZhbHNlIGlmIHRoZSBzZXR0aW5nIGlzIHVuZGVmaW5lZCBvciBudWxsXG4gICAgICAgIC8vIGFzIGlmIGl0IGlzIGRlZmluZWQgd2UgZG8gbm90IHduYXQgdG8gcmVzZXQgaXQuIEFzIGlmIGl0IGlzIHRydWUgdGhlbiB3ZSBzaG91bGQgbWFrZSB1c2Ugb2YgaXRcbiAgICAgICAgLy8gdG8gc3BlZWQgdXAgdGhlIGNoZWNrLlxuICAgICAgICBsZXQgUFRfTk9ERV9ESVNBQkxFRCA9IENhY2hlVXRpbC5nZXRDYWNoZShub2RlLCBcIlBUX05PREVfRElTQUJMRURcIiwgdW5kZWZpbmVkKTtcbiAgICAgICAgaWYgKHR5cGVvZiBQVF9OT0RFX0RJU0FCTEVEICE9PSBcInVuZGVmaW5lZFwiKSByZXR1cm4gUFRfTk9ERV9ESVNBQkxFRDtcbiAgICAgICAgUFRfTk9ERV9ESVNBQkxFRCA9IGZhbHNlO1xuXG4gICAgICAgIC8vIENoZWNrIHRoZSBub2RlVHlwZSBvZiB0aGlzIG5vZGUsIGlmIHRoaXMgbm9kZSBpcyBhIHRleHQgbm9kZSB0aGVuXG4gICAgICAgIC8vIHdlIGdldCB0aGUgcGFyZW50bm9kZSBhbmQgc2V0IHRoYXQgYXMgdGhlIG5vZGUgYXMgYSB0ZXh0IG5vZGVzLFxuICAgICAgICAvLyBkaXNhYmxlZCBpcyBkaXJlY3RseSByZWxhdGVkIHRvIHRoZSBwYXJlbnQgbm9kZS5cbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDMpIHtcbiAgICAgICAgICAgIG5vZGUgPSBET01XYWxrZXIucGFyZW50Tm9kZShub2RlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFZhcmlhYmxlIERlY2xhcmF0aW9uXG4gICAgICAgIGxldCBub2RlTmFtZSA9IG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAvLyBHZXQgdGhlIGRpc2FibGVkIGVsZW1lbnQgcHJvcGVydHksIGRpc2FibGVkIGFuZCBhcmlhLWRpc2FibGVkIGF0dHJpYnV0ZSBhbmQgY2hlY2sgdGhhdCBpdCBpcyB0cnVlXG4gICAgICAgIGxldCBkaXNhYmxlZEF0dHJpYnV0ZSA9IG5vZGUuaGFzQXR0cmlidXRlKFwiZGlzYWJsZWRcIik7XG4gICAgICAgIGxldCBkaXNhYmxlZFByb3BlcnR5Q3VzdG9tID0gUFRfTk9ERV9ESVNBQkxFRDtcbiAgICAgICAgbGV0IGFyaWFEaXNhYmxlZEF0dHJpYnV0ZSA9IG5vZGUuaGFzQXR0cmlidXRlKCdhcmlhLWRpc2FibGVkJykgJiYgbm9kZS5nZXRBdHRyaWJ1dGUoXCJhcmlhLWRpc2FibGVkXCIpID09PSAndHJ1ZSc7XG5cbiAgICAgICAgLy8gSWYgdGhpcyBub2RlIGhhcyBkaXNhYmxlZCBhdHRyaWJ1dGUgYW5kIHRoZSBub2RlIGFsbG93cyBkaXNhYmxlZCBhdHRyaWJ1dGUsIHRoZW4gcmV0dXJuIHRydWUuXG4gICAgICAgIC8vIERpc2FibGVkIGF0dHJpYnV0ZSBpcyBvbmx5IGFsbG93ZWQgb24gXCJidXR0b25cIiwgXCJpbnB1dFwiLCBcInNlbGVjdFwiLCBcInRleHRhcmVhXCIsIFwib3B0Z3JvdXBcIiwgXCJvcHRpb25cIiwgXCJtZW51aXRlbVwiLCBcImZpZWxkc2V0XCJcbiAgICAgICAgLy8gSW4gdGhlIGNhc2UgYXJpYS1kaXNhYmxlZCBpcyBzZXQgdG8gdHJ1ZSwgdGhlbiBhbHNvIHJldHVybiB0cnVlXG4gICAgICAgIGlmIChkaXNhYmxlZFByb3BlcnR5Q3VzdG9tIHx8IChkaXNhYmxlZEF0dHJpYnV0ZSAmJiBBUklBRGVmaW5pdGlvbnMuZWxlbWVudHNBbGxvd2VkRGlzYWJsZWQuaW5kZXhPZihub2RlTmFtZSkgPiAtMSkgfHwgYXJpYURpc2FibGVkQXR0cmlidXRlKSB7XG4gICAgICAgICAgICBQVF9OT0RFX0RJU0FCTEVEID0gdHJ1ZTtcbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShub2RlLCBcIlBUX05PREVfRElTQUJMRURcIiwgUFRfTk9ERV9ESVNBQkxFRCk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdldCB0aGUgcGFyZW50Tm9kZSBmb3IgdGhpcyBub2RlLCBiZWN1YXNlIHdlIGhhdmUgdG8gY2hlY2sgYWxsIHBhcmVudHMgdG8gbWFrZSBzdXJlIHRoZXkgZG8gbm90IGhhdmVcbiAgICAgICAgLy8gZGlzYWJsZWQgYXR0cmlidXRlLiBPbmx5IGtlZXAgY2hlY2tpbmcgdW50aWwgd2UgYXJlIGFsbCB0aGUgd2F5IGJhY2sgdG8gdGhlIHBhcmVudE5vZGVcbiAgICAgICAgLy8gZWxlbWVudC5cbiAgICAgICAgbGV0IHBhcmVudEVsZW1lbnQgPSBET01XYWxrZXIucGFyZW50Tm9kZShub2RlKTtcblxuICAgICAgICAvLyBJZiB0aGUgcGFyZW50IG5vZGUgZXhpc3RzIGFuZCB0aGUgbm9kZXR5cGUgaXMgZWxlbWVudCAoMSksIHRoZW4gcnVuIHJlY3Vyc2l2ZSBjYWxsIHRvIHBlcmZvcm0gdGhlIGNoZWNrXG4gICAgICAgIC8vIGFsbCB0aGUgd2F5IHVwIHRvIHRoZSB2ZXJ5IHBhcmVudCBub2RlLiBVc2UgcmVjdXJzaXZlIGNhbGwgaGVyZSBpbnN0ZWFkIG9mIGEgd2hpbGUgbG9vcCBzbyB0aGF0IHdlIGRvIG5vdFxuICAgICAgICAvLyBoYXZlIHRvIGR1cGxpY2F0ZSB0aGUgbG9naWMgZm9yIGNoZWNraW5nIGlmIHRoZSBub2RlIGlzIGRpc2FibGVkIG9yIG5vdCBmb3IgYWxsIHRoZSBwYXJlbnRzIHN0YXJ0aW5nIHdpdGhcbiAgICAgICAgLy8gY2hpbGQgbm9kZS5cbiAgICAgICAgaWYgKHBhcmVudEVsZW1lbnQgIT0gbnVsbCAmJiBwYXJlbnRFbGVtZW50Lm5vZGVUeXBlID09PSAxKSB7XG4gICAgICAgICAgICAvLyBDaGVjayB1cHdhcmRzIHJlY3Vyc2l2ZWx5LCBhbmQgc2F2ZSB0aGUgcmVzdWx0cyBpbiBhbiB2YXJpYWJsZVxuICAgICAgICAgICAgbGV0IG5vZGVEaXNhYmxlZCA9IENvbW1vblV0aWwuaXNOb2RlRGlzYWJsZWQocGFyZW50RWxlbWVudCk7XG5cbiAgICAgICAgICAgIC8vIElmIHRoZSBub2RlIGlzIGZvdW5kIHRvIGJlIGRpc2FibGVkIHRoZW4gYWRkIHRoZSBjdXN0b20gUFRfTk9ERV9ESVNBQkxFRCB0byB0cnVlLlxuICAgICAgICAgICAgLy8gc28gdGhhdCB3ZSBjYW4gdXNlIHRoaXMgbmV4dCB0aW1lLCB0byBxdWlja2x5IGRldGVybWluZSBpZiBub2RlIGlzIGRpc2FibGVkIG9yIG5vdC5cbiAgICAgICAgICAgIC8vIFRoaXMgaXMgZXh0cmEgcGVyY2F1dGlvbiwgdGhlIGlzTm9kZURpc2FibGVkIGZ1bmN0aW9uIGFscmVhZHkgc2V0cyB0aGlzLlxuICAgICAgICAgICAgaWYgKG5vZGVEaXNhYmxlZCkge1xuICAgICAgICAgICAgICAgIFBUX05PREVfRElTQUJMRUQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBDaGVjayB1cHdhcmRzIHJlY3Vyc2l2ZWx5XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0RJU0FCTEVEXCIsIFBUX05PREVfRElTQUJMRUQpO1xuICAgICAgICAgICAgcmV0dXJuIG5vZGVEaXNhYmxlZDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJldHVybiBmYWxzZSAobm9kZSBpcyBub3QgZGlzYWJsZWQpXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmUgaWYgaGlkZGVuIGNvbnRlbnQgc2hvdWxkIGJlIGNoZWNrZWRcbiAgICAgKiBpbiBydWxlcy5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBub2RlIC0gQSBub2RlIHNvIHRoYXQgdGhlIGRvY3VtZW50IGNhbiBiZSBhY2Nlc3NlZCB0byBjaGVjayBmb3IgdGhlXG4gICAgICogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb24uIENhbiBiZSBkb2N1bWVudCBlbGVtZW50IG9yIGEgc2ltcGxlIG5vZGUgZWxlbWVudC5cbiAgICAgKiBAcmV0dXJuIHtib29sfSB0cnVlIGlmIGhpZGRlbiBjb250ZW50IHNob3VsZCBiZSBjaGVja2VkLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBBcmlhVXRpbFxuICAgICAqL1xuICAgIHB1YmxpYyBzdGF0aWMgc2hvdWxkQ2hlY2tIaWRkZW5Db250ZW50KG5vZGUpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIGlmIG5vZGUgc2hvdWxkIGJlIHNraXBwZWQgZnJvbSBjaGVja2luZyBvciBub3QsIGJhc2VkXG4gICAgICogb24gdGhlIENoZWNrIEhpZGRlbiBDb250ZW50IHNldHRpbmdzIGFuZCBpZiB0aGUgbm9kZSBpcyB2aXNpYmxlIG9yIG5vdC5cbiAgICAgKlxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBub2RlIC0gTm9kZSB0byBjaGVjayBpZiBpdCBpcyB2aXNpYmxlIG9yIG5vdCBiYXNlZCBvbiB0aGUgQ2hlY2sgSGlkZGVuIENvbnRlbnRcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmcuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHtib29sfSB0cnVlIGlmIG5vZGUgc2hvdWxkIGJlIHNraXBwZWQsIGZhbHNlIG90aGVyd2lzZVxuICAgICAqXG4gICAgICogQG1lbWJlck9mIEFyaWFVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBzaG91bGROb2RlQmVTa2lwcGVkSGlkZGVuKG5vZGUpIHtcbiAgICAgICAgLy8gRm9sbG93aW5nIGFyZSB0aGUgc3RlcHMgdGhhdCBhcmUgZXhlY3V0ZWQgYXQgdGhpcyBzdGFnZSB0byBkZXRlcm1pbmUgaWYgdGhlIG5vZGUgc2hvdWxkIGJlIGNsYXNzaWZpZWQgYXMgaGlkZGVuXG4gICAgICAgIC8vIG9yIG5vdC5cbiAgICAgICAgLy8gIDEuIE9ubHkgcnVuIGlzTm9kZVZpc2libGUgY2hlY2sgaWYgaGlkZGVuIGNvbnRlbnQgc2hvdWxkIE5PVCBiZSBjaGVja2VkLiBJbiB0aGUgY2FzZSB0aGF0IGhpZGRlbiBjb250ZW50IGlzIHRvLFxuICAgICAgICAvLyAgICAgYmUgc2Nhbm5lZCB0aGVuIHdlIGNhbiBqdXN0IHNjYW4gZXZlcnl0aGluZyBhcyBub3JtYWwuIEluIHRoZSBjYXNlIHRoYXQgdGhlIGN1cnJlbnQgbm9kZSBpcyBoaWRkZW4gd2VcbiAgICAgICAgLy8gICAgIHJldHVybiB0cnVlIHRvIGlkZW50aWZ5IHRoYXQgdGhlIG5vZGUgc2hvdWxkIG5vdCBiZSBzY2FubmVkL2FkZGVkIHRvIGFueSBoYXNoL2FycmF5LlxuICAgICAgICAvL1xuICAgICAgICAvLyBOb3RlOiBUaGUgaWYgY29uZGl0aW9ucyB1c2VzIHNob3J0LWNpcmN1aXRpbmcgc28gaWYgdGhlIGZpcnN0IGNvbmRpdGlvbiBpcyBub3QgdHJ1ZSBpdCB3aWxsIG5vdCBjaGVjayB0aGUgbmV4dCBvbmUsXG4gICAgICAgIC8vICAgICAgIHNvIG9uIGFuZCBzbyBmb3J0aC5cbiAgICAgICAgaWYgKCFDb21tb25VdGlsLnNob3VsZENoZWNrSGlkZGVuQ29udGVudChub2RlKSAmJiAhVmlzVXRpbC5pc05vZGVWaXNpYmxlKG5vZGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGlzZm9jdXNhYmxlQnlEZWZhdWx0KG5vZGUpIHtcbiAgICAgICAgdmFyIGZvY3VzYWJsZUVsZW1lbnRzID0gWydpbnB1dCcsICdzZWxlY3QnLCAnYnV0dG9uJywgJ3RleHRhcmVhJywgJ29wdGlvbicsICdhcmVhJ107XG4gICAgICAgIGlmIChub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiYVwiICYmIENvbW1vblV0aWwuaGFzQXR0cmlidXRlKG5vZGUsICdocmVmJykpIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAobm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImFyZWFcIiAmJiBDb21tb25VdGlsLmhhc0F0dHJpYnV0ZShub2RlLCAnaHJlZicpKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgaWYgKGZvY3VzYWJsZUVsZW1lbnRzLmluZGV4T2Yobm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSAhPT0gLTEpIHJldHVybiB0cnVlO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyBmdW5jdGlvbiBjaGVjayBpZiBhIG5vbi10YWJhYmxlIG5vZGUgaGFzIHZhbGlkIHRhYmFibGUgY29udGVudC5cbiAgICAgKiBJZiBpdCBpcyB0YWJhYmxlICh0aGUgdGFiaW5kZXggaXMgbm90IHNwZWljaWZpZWQgb3IgaXMgbm90IC0xKSwgcmV0dXJucyBmYWxzZTtcbiAgICAgKiBJZiBpdCBpcyBub24tdGFiYWJsZSwgYnV0IGEgY2hpbGQgaXMgdGFiYWJsZSBhbmQgZG9lcyBub3QgaGF2ZSBlbGVtZW50IGNvbnRlbnQsIHJldHVybnMgZmFsc2U7XG4gICAgICogT3RoZXJ3aXNlLCByZXR1cm5zIHRydWUuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBub25UYWJhYmxlQ2hpbGRDaGVjayhlbGVtZW50OiBFbGVtZW50KTogYm9vbGVhbiB7XG4gICAgICAgIGlmICghZWxlbWVudC5oYXNBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSB8fFxuICAgICAgICAgICAgKHBhcnNlSW50KGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwidGFiaW5kZXhcIikpICE9IC0xKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGxldCBudyA9IG5ldyBET01XYWxrZXIoZWxlbWVudCk7XG4gICAgICAgIHdoaWxlIChudy5uZXh0Tm9kZSgpKSB7XG4gICAgICAgICAgICBsZXQgY2hpbGQgPSBudy5lbGVtKCk7XG4gICAgICAgICAgICBpZiAoY2hpbGQgPT09IG51bGwpIHsgLy8gVGV4dCBub2RlLiB1c3VhbGx5IGlzIGEgY2FydHJpZGdlIHJldHVybi5cbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjaGlsZC5oYXNBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSAmJlxuICAgICAgICAgICAgICAgIChwYXJzZUludChjaGlsZC5nZXRBdHRyaWJ1dGUoXCJ0YWJpbmRleFwiKSkgIT0gLTEpICYmXG4gICAgICAgICAgICAgICAgIUNvbW1vblV0aWwuaGFzSW5uZXJDb250ZW50KGNoaWxkKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGhhc0F0dHJpYnV0ZShlbGVtZW50LCBhdHRyaWJ1dGVOYW1lKSB7XG4gICAgICAgIHZhciBoYXNBdHRyaWJ1dGUgPSBmYWxzZTtcbiAgICAgICAgaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKSB7XG4gICAgICAgICAgICBoYXNBdHRyaWJ1dGUgPSBlbGVtZW50Lmhhc0F0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTtcbiAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50LmF0dHJpYnV0ZXMgJiYgZWxlbWVudC5hdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSkge1xuICAgICAgICAgICAgdmFyIGF0dHIgPSBlbGVtZW50LmF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKGF0dHJpYnV0ZU5hbWUpO1xuICAgICAgICAgICAgaGFzQXR0cmlidXRlID0gYXR0ciAmJiBhdHRyLnNwZWNpZmllZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaGFzQXR0cmlidXRlO1xuICAgIH1cblxuICAgIC8vIHRydW5jYXRlIHRoZSBnaXZlbiB0ZXh0IHRvIGEgZ2l2ZW4gbnVtYmVyIG9mIGNoYXJhY3RlcnNcbiAgICAvLyByZXR1cm4gdHJ1bmNhdGVkIHRleHQgdG8gMTUwIGNoYXJzLCBzYW1lIHdpdGggdGhlIG1lZGlhX2FsdF9icmllZiBydWxlXG4gICAgcHVibGljIHN0YXRpYyB0cnVuY2F0ZVRleHQodGV4dDogc3RyaW5nLCBsZW4gPSAxNTApIHtcbiAgICAgICAgaWYgKCF0ZXh0KSByZXR1cm4gdGV4dDtcbiAgICAgICAgdGV4dCA9IHRleHQudHJpbSgpO1xuICAgICAgICBpZiAodGV4dC5sZW5ndGggPiBsZW4pXG4gICAgICAgICAgICByZXR1cm4gdGV4dC5zdWJzdHJpbmcoMCwgbGVuLTEpICtcIi4uLlwiO1xuICAgICAgICByZXR1cm4gdGV4dDtcblxuICAgIH1cblxufSIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiAgICAgQ29weXJpZ2h0OjogMjAyMC0gSUJNLCBJbmNcblxuICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cbiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgVmlzVXRpbCB9IGZyb20gXCIuL1Zpc1V0aWxcIjtcbmltcG9ydCB7IEFyaWFVdGlsIH0gZnJvbSBcIi4vQXJpYVV0aWxcIjtcbmltcG9ydCB7IENvbW1vblV0aWwgfSBmcm9tIFwiLi9Db21tb25VdGlsXCI7XG5pbXBvcnQge1J1bGVDb250ZXh0SGllcmFyY2h5IH0gZnJvbSBcIi4uL2FwaS9JUnVsZVwiO1xuXG5leHBvcnQgY2xhc3MgVGFibGVVdGlsIHtcblxuICAgIHB1YmxpYyBzdGF0aWMgaXNEYXRhVGFibGUodGFibGVOb2RlKSB7XG4gICAgICAgIHJldHVybiAhKEFyaWFVdGlsLmhhc1JvbGUodGFibGVOb2RlLCBcIm5vbmVcIikgfHwgQXJpYVV0aWwuaGFzUm9sZSh0YWJsZU5vZGUsIFwicHJlc2VudGF0aW9uXCIpKTtcbiAgICB9XG5cbiAgICAvKlxuICAgICAqIEEgY29tcGxleCBkYXRhIHRhYmxlIGlzIGEgZGF0YSB0YWJsZSB3aXRoIGFueSBvZiB0aGUgZm9sbG93aW5nIGNoYXJhY3RlcmlzdGljczpcbiAgICAgKlxuICAgICAqIGEgdGhlYWQgZWxlbWVudCB0aGF0IGNvbnRhaW5zIHR3byBvciBtb3JlIHRyIGVsZW1lbnRzXG4gICAgICogYSB0YWJsZSB3aXRoIG1vcmUgdGhhbiBvbmUgdGhlYWQgZWxlbWVudFxuICAgICAqIGEgdGFibGUgd2l0aCB0d28gb3IgbW9yZSB0ciBlbGVtZW50cyB0aGF0IGNvbnRhaW4gb25seSB0aCBlbGVtZW50c1xuICAgICAqIGEgdGggb3IgdGQgZWxlbWVudCB3aXRoIGEgcm93c3BhbiBvciBjb2xzcGFuIGF0dHJpYnV0ZVxuICAgICAqIGEgdHIgZWxlbWVudCB0aGF0IGNvbnRhaW5zIGF0IGxlYXN0IG9uZSB0ZCBlbGVtZW50IGFuZCB0d28gb3IgbW9yZSB0aCBlbGVtZW50c1xuICAgICAqIGEgdGFibGUgd2l0aCBoZWFkZXJzIG5vdCBsb2NhdGVkIGluIHRoZSBmaXJzdCByb3cgb3IgZmlyc3QgY29sdW1uXG4gICAgICogYSB0ZCBlbGVtZW50IHdpdGggYSBoZWFkZXJzIGF0dHJpYnV0ZSB2YWx1ZSB0aGF0IGNvbnRhaW5zIG1vcmUgdGhhbiB0d28gSURSRUZzXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpc0NvbXBsZXhEYXRhVGFibGUodGFibGUpIHtcblxuICAgICAgICBpZiAoXCJBcmlhVXRpbF9pc0NvbXBsZXhEYXRhVGFibGVcIiBpbiB0YWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuICEhdGFibGUuQXJpYVV0aWxfaXNDb21wbGV4RGF0YVRhYmxlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGlzQ29tcGxleFRhYmxlID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKHRhYmxlICYmIFRhYmxlVXRpbC5pc0RhdGFUYWJsZSh0YWJsZSkpIHtcblxuICAgICAgICAgICAgbGV0IHRoTm9kZXMgPSBudWxsLFxuICAgICAgICAgICAgICAgIHRkTm9kZXMgPSBudWxsO1xuICAgICAgICAgICAgbGV0IHRyTm9kZXMgPSB0YWJsZS5nZXRFbGVtZW50c0J5VGFnTmFtZShcInRyXCIpO1xuICAgICAgICAgICAgbGV0IHRyTm9kZUNvdW50ID0gdHJOb2Rlcy5sZW5ndGg7XG4gICAgICAgICAgICBsZXQgdGROb2RlQ291bnQgPSAwLFxuICAgICAgICAgICAgICAgIHRoTm9kZUNvdW50ID0gMCxcbiAgICAgICAgICAgICAgICB0ck5vZGVzSGF2aW5nT25seVRoTm9kZXMgPSAwO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgIWlzQ29tcGxleFRhYmxlICYmIGkgPCB0ck5vZGVDb3VudDsgKytpKSB7XG5cbiAgICAgICAgICAgICAgICB0aE5vZGVzID0gdHJOb2Rlc1tpXS5nZXRFbGVtZW50c0J5VGFnTmFtZShcInRoXCIpO1xuICAgICAgICAgICAgICAgIHRkTm9kZXMgPSB0ck5vZGVzW2ldLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwidGRcIik7XG4gICAgICAgICAgICAgICAgdGhOb2RlQ291bnQgPSB0aE5vZGVzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICB0ZE5vZGVDb3VudCA9IHRkTm9kZXMubGVuZ3RoO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRkTm9kZUNvdW50ICE9PSAwKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gYSB0ciBlbGVtZW50IHRoYXQgY29udGFpbnMgYXQgbGVhc3Qgb25lIHRkIGVsZW1lbnQgYW5kIHR3byBvciBtb3JlIHRoIGVsZW1lbnRzO1xuICAgICAgICAgICAgICAgICAgICBpc0NvbXBsZXhUYWJsZSA9IHRoTm9kZUNvdW50ID4gMTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBhIHRoIGVsZW1lbnQgd2l0aCBhIHJvd3NwYW4gb3IgY29sc3BhbiBhdHRyaWJ1dGVcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7ICFpc0NvbXBsZXhUYWJsZSAmJiBqIDwgdGhOb2RlQ291bnQ7ICsraikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNDb21wbGV4VGFibGUgPSAoKHRoTm9kZXNbal0uaGFzQXR0cmlidXRlKFwicm93c3BhblwiKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoTm9kZXNbal0uaGFzQXR0cmlidXRlKFwiY29sc3BhblwiKSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21tb25VdGlsLmdldEFuY2VzdG9yKHRoTm9kZXNbal0sIFwidGFibGVcIikgPT09IHRhYmxlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIGEgdGQgZWxlbWVudCB3aXRoIGEgcm93c3BhbiBvciBjb2xzcGFuIGF0dHJpYnV0ZVxuICAgICAgICAgICAgICAgICAgICAvLyBhIHRkIGVsZW1lbnQgd2l0aCBhIGhlYWRlcnMgYXR0cmlidXRlIHZhbHVlIHRoYXQgY29udGFpbnMgbW9yZSB0aGFuIHR3byBJRFJFRnNcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7ICFpc0NvbXBsZXhUYWJsZSAmJiBrIDwgdGROb2RlQ291bnQ7ICsraykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNDb21wbGV4VGFibGUgPSAoKHRkTm9kZXNba10uaGFzQXR0cmlidXRlKFwicm93c3BhblwiKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRkTm9kZXNba10uaGFzQXR0cmlidXRlKFwiY29sc3BhblwiKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0ZE5vZGVzW2tdLmhhc0F0dHJpYnV0ZShcImhlYWRlcnNcIikgJiYgQ29tbW9uVXRpbC5ub3JtYWxpemVTcGFjaW5nKHRkTm9kZXNba10uZ2V0QXR0cmlidXRlKFwiaGVhZGVyc1wiKSkuc3BsaXQoXCIgXCIpLmxlbmd0aCA+IDIpKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vblV0aWwuZ2V0QW5jZXN0b3IodGROb2Rlc1trXSwgXCJ0YWJsZVwiKSA9PT0gdGFibGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIHR3byBvciBtb3JlIHRyIGVsZW1lbnRzIHRoYXQgY29udGFpbiBvbmx5IHRoIGVsZW1lbnRzXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aE5vZGVDb3VudCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICsrdHJOb2Rlc0hhdmluZ09ubHlUaE5vZGVzO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlzQ29tcGxleFRhYmxlID0gdHJOb2Rlc0hhdmluZ09ubHlUaE5vZGVzID09PSAyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFpc0NvbXBsZXhUYWJsZSkge1xuXG4gICAgICAgICAgICAgICAgbGV0IHRoZWFkTm9kZXMgPSB0YWJsZS5nZXRFbGVtZW50c0J5VGFnTmFtZShcInRoZWFkXCIpO1xuICAgICAgICAgICAgICAgIGxldCB0aGVhZE5vZGVzTGVuZ3RoID0gdGhlYWROb2Rlcy5sZW5ndGg7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhlYWROb2Rlc0xlbmd0aCA+IDApIHtcblxuICAgICAgICAgICAgICAgICAgICAvLyB0YWJsZSBoYXMgbW9yZSB0aGFuIG9uZSB0aGVhZCBlbGVtZW50XG4gICAgICAgICAgICAgICAgICAgIGlzQ29tcGxleFRhYmxlID0gdGhlYWROb2Rlc0xlbmd0aCA+IDE7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gYSB0aGVhZCBlbGVtZW50IHRoYXQgY29udGFpbnMgdHdvIG9yIG1vcmUgdHIgZWxlbWVudHNcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0NvbXBsZXhUYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNDb21wbGV4VGFibGUgPSB0aGVhZE5vZGVzWzBdLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwidHJcIikubGVuZ3RoID4gMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghaXNDb21wbGV4VGFibGUgJiYgdHJOb2RlQ291bnQgIT09IDApIHtcbiAgICAgICAgICAgICAgICAvLyBhIHRhYmxlIHdpdGggaGVhZGVycyBub3QgbG9jYXRlZCBpbiB0aGUgZmlyc3Qgcm93IG9yIGZpcnN0IGNvbHVtblxuICAgICAgICAgICAgICAgIGlzQ29tcGxleFRhYmxlID0gdGhOb2RlQ291bnQgPiAwICYmICFUYWJsZVV0aWwudGFibGVIZWFkZXJFeGlzdHModGFibGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRhYmxlLkFyaWFVdGlsX2lzQ29tcGxleERhdGFUYWJsZSA9IGlzQ29tcGxleFRhYmxlO1xuXG4gICAgICAgIHJldHVybiBpc0NvbXBsZXhUYWJsZTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gdHJ1ZSBpZiBhIHRhYmxlIGNlbGwgaXMgaGlkZGVuIG9yIGNvbnRhaW4gbm8gZGF0YTogPHRkPjwvdGQ+XG4gICAgcHVibGljIHN0YXRpYyBpc1RhYmxlQ2VsbEVtcHR5KGNlbGwpIHtcbiAgICAgICAgaWYgKCFjZWxsIHx8ICFWaXNVdGlsLmlzTm9kZVZpc2libGUoY2VsbCkgfHwgY2VsbC5pbm5lckhUTUwucmVwbGFjZSgvJm5ic3A7L2csJyAnKS50cmltKCkubGVuZ3RoID09PSAwKVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgIFxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHRydWUgaWYgYSB0YWJsZSByb3cgaXMgaGlkZGVuIG9yIGNvbnRhaW4gbm8gZGF0YTogPHRyIC8+IG9yIDx0cj48dGQ+PC90ZD48dGQ+PC90ZD48L3RyPiBcbiAgICBwdWJsaWMgc3RhdGljIGlzVGFibGVSb3dFbXB0eShyb3cpIHtcbiAgICAgICAgaWYgKCFyb3cgfHwgIXJvdy5jZWxscyB8fCByb3cuY2VsbHMubGVuZ3RoID09PSAwIHx8ICFWaXNVdGlsLmlzTm9kZVZpc2libGUocm93KSlcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICBcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7IC8vZW1wdHlcbiAgICAgICAgZm9yIChsZXQgYz0wOyBwYXNzZWQgJiYgYyA8IHJvdy5jZWxscy5sZW5ndGg7IGMrKykge1xuICAgICAgICAgICAgbGV0IGNlbGwgPSByb3cuY2VsbHNbY107XG4gICAgICAgICAgICBwYXNzZWQgPSBUYWJsZVV0aWwuaXNUYWJsZUNlbGxFbXB0eShjZWxsKTsgICAgICAgICAgXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiBwYXNzZWQ7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHRydWUgaWYgYSB0YWJsZSdzIGhlYWRlciBpcyBpbiB0aGUgZmlyc3Qgcm93IG9yIGNvbHVtblxuICAgIHB1YmxpYyBzdGF0aWMgdGFibGVIZWFkZXJFeGlzdHMocnVsZUNvbnRleHQpIHtcblxuICAgICAgICBsZXQgcm93cyA9IHJ1bGVDb250ZXh0LnJvd3M7XG4gICAgICAgIGlmICghcm93cyB8fCByb3dzLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuXG4gICAgICAgIC8vIG5vdGUgdGhhdCB0YWJsZS5yb3dzIHJldHVybiBhbGwgYWxsIHRoZSByb3dzIGluIHRoZSB0YWJsZSwgXG4gICAgICAgIC8vIGluY2x1ZGluZyB0aGUgcm93cyBjb250YWluZWQgd2l0aGluIDx0aGVhZD4sIDx0Zm9vdD4sIGFuZCA8dGJvZHk+IGVsZW1lbnRzLiBcbiAgICAgICAgXG4gICAgICAgIC8vY2FzZSAxOiBoZWFkZXJzIGFyZSBpbiB0aGUgdmVyeSBmaXJzdCByb3cgd2l0aCBkYXRhIGluIHRib2R5IG9yIHRoZWFkLCBidXQgbm90IGluIHRmb290ICAgXG4gICAgICAgIC8vZ2V0IHRoZSBmaXJzdCByb3cgd2l0aCBkYXRhLCBpZ25vcmluZyB0aGUgcm93cyB3aXRoIG5vIGRhdGFcbiAgICAgICAgbGV0IHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGxldCBmaXJzdFJvdyA9IHJvd3NbMF07XG4gICAgICAgIGZvciAobGV0IHI9MDsgcGFzc2VkICYmIHIgPCByb3dzLmxlbmd0aDsgcisrKSB7XG4gICAgICAgICAgICBmaXJzdFJvdyA9IHJvd3Nbcl07XG4gICAgICAgICAgICAvLyBpZ25vcmUgdGhlIHJvd3MgZnJvbSB0Zm9vdFxuICAgICAgICAgICAgaWYgKGZpcnN0Um93LnBhcmVudE5vZGUgJiYgZmlyc3RSb3cucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAndGZvb3QnKSBjb250aW51ZTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgcGFzc2VkID0gVGFibGVVdGlsLmlzVGFibGVSb3dFbXB0eShmaXJzdFJvdyk7ICAgICAgICAgIFxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAvL3RhYmxlIGNvbnRhaW4gbm8gZGF0YTogIDx0YWJsZT48dHI+PHRkPjwvdGQ+PHRkPjwvdGQ+PC90cj48L3RhYmxlPiBcbiAgICAgICAgaWYgKHBhc3NlZClcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICBcbiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGNlbGxzIHdpdGggZGF0YSBpbiB0aGUgZmlyc3QgZGF0YSByb3cgYXJlIGFsbCBUSCdzXG4gICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGZvciAobGV0IHI9MDsgcGFzc2VkICYmIHIgPCBmaXJzdFJvdy5jZWxscy5sZW5ndGg7IHIrKykge1xuICAgICAgICAgICAgbGV0IGNlbGwgPSBmaXJzdFJvdy5jZWxsc1tyXTtcbiAgICAgICAgICAgIHBhc3NlZCA9IFRhYmxlVXRpbC5pc1RhYmxlQ2VsbEVtcHR5KGNlbGwpIHx8IGNlbGwubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ3RoJzsgICAgICAgICAgXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmIChwYXNzZWQpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcblxuICAgICAgICAvLyBDYXNlIDI6IGhlYWRlcnMgYXJlIGluIHRoZSBmaXJzdCBjb2x1bW4gd2l0aCBkYXRhXG4gICAgICAgIC8vIEFzc3VtZSB0aGF0IHRoZSBmaXJzdCBjb2x1bW4gaGFzIGFsbCBUSCdzIG9yIGEgVEQgd2l0aG91dCBkYXRhIGluIHRoZSBmaXJzdCBjb2x1bW4uXG4gICAgICAgIHBhc3NlZCA9IHRydWU7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBwYXNzZWQgJiYgaSA8IHJvd3MubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIC8vIGlnbm9yZSB0aGUgcm93cyBmcm9tIHRmb290XG4gICAgICAgICAgICBpZiAocm93c1tpXS5wYXJlbnROb2RlICYmIHJvd3NbaV0ucGFyZW50Tm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAndGZvb3QnKSBjb250aW51ZTtcblxuICAgICAgICAgICAgLy8gSWYgbm8gY2VsbHMgaW4gdGhpcyByb3csIG9yIG5vIGRhdGEgYXQgYWxsLCB0aGF0J3Mgb2theSB0b28uXG4gICAgICAgICAgICBwYXNzZWQgPSAhcm93c1tpXS5jZWxscyB8fFxuICAgICAgICAgICAgICAgIHJvd3NbaV0uY2VsbHMubGVuZ3RoID09PSAwIHx8XG4gICAgICAgICAgICAgICAgcm93c1tpXS5jZWxsc1swXS5pbm5lckhUTUwudHJpbSgpLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgICAgICAgICAgIHJvd3NbaV0uY2VsbHNbMF0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPSBcInRkXCI7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmIChwYXNzZWQpXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIFxuICAgICAgICAvL2Nhc2UgMzogYWxsIHRkIGRhdGEgY2VsbHMgaGF2ZSBoZWFkZXJzIGF0dHJpYnV0ZXMgdGhhdCBwb2ludCB0byB0aGUgaWQgb2YgYSB0aCBlbGVtZW50IGluIHRoZSBzYW1lIHRhYmxlLiBcbiAgICAgICAgLy8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvdGFibGVzLmh0bWwjYXR0cmlidXRlcy1jb21tb24tdG8tdGQtYW5kLXRoLWVsZW1lbnRzXG4gICAgICAgIHBhc3NlZCA9IHRydWU7IFxuICAgICAgICBsZXQgdGhJZHMgPSBbXTtcbiAgICAgICAgbGV0IHRkSGVhZGVycyA9IFtdO1xuICAgICAgICBmb3IgKGxldCByPTA7IHBhc3NlZCAmJiByIDwgcm93cy5sZW5ndGg7IHIrKykge1xuICAgICAgICAgICAgbGV0IHJvdyA9IHJvd3Nbcl07IFxuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGNlbGxzIHdpdGggZGF0YSBpbiB0aGUgbGFzdCBkYXRhIHJvdyBhcmUgYWxsIFRIJ3NcbiAgICAgICAgICAgIGZvciAobGV0IGM9MDsgYyA8IHJvdy5jZWxscy5sZW5ndGg7IGMrKykge1xuICAgICAgICAgICAgICAgIGxldCBjZWxsID0gcm93LmNlbGxzW2NdO1xuICAgICAgICAgICAgICAgIGlmIChUYWJsZVV0aWwuaXNUYWJsZUNlbGxFbXB0eShjZWxsKSkgY29udGludWU7IFxuICAgICAgICAgICAgICAgIGlmIChjZWxsLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICd0ZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjZWxsLmdldEF0dHJpYnV0ZSgnaGVhZGVycycpIHx8IGNlbGwuZ2V0QXR0cmlidXRlKCdoZWFkZXJzJykudHJpbSgpLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICBDb21tb25VdGlsLmNvbmNhdFVuaXF1ZUFycmF5SXRlbUxpc3QoY2VsbC5nZXRBdHRyaWJ1dGUoJ2hlYWRlcnMnKS50cmltKCkuc3BsaXQoXCIgXCIpLCB0ZEhlYWRlcnMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2VsbC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAndGgnICYmIGNlbGwuZ2V0QXR0cmlidXRlKCdpZCcpICYmIGNlbGwuZ2V0QXR0cmlidXRlKCdpZCcpLnRyaW0oKS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uVXRpbC5jb25jYXRVbmlxdWVBcnJheUl0ZW0oY2VsbC5nZXRBdHRyaWJ1dGUoJ2lkJykudHJpbSgpLCB0aElkcyk7ICAgIFxuICAgICAgICAgICAgfSAgICAgIFxuICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICBpZiAocGFzc2VkKSB7IC8vIGFsbCB0ZCBlbGVtZW50cyBoYXZlIGhlYWRlcnMsIHRvIGV4YW0gaWYgdGhlIGhlYWRlcnMgcG9pbnQgdG8gYSB0aCBpZFxuICAgICAgICAgICAgaWYgKHRoSWRzLmxlbmd0aCA+IDAgJiYgdGRIZWFkZXJzLmV2ZXJ5KGhlYWRlciA9PiB0aElkcy5pbmNsdWRlcyhoZWFkZXIpKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgXG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGlzTGF5b3V0VGFibGUodGFibGVOb2RlKSB7XG4gICAgICAgIHJldHVybiBBcmlhVXRpbC5oYXNSb2xlKHRhYmxlTm9kZSwgXCJwcmVzZW50YXRpb25cIikgfHwgQXJpYVV0aWwuaGFzUm9sZSh0YWJsZU5vZGUsIFwibm9uZVwiKTtcbiAgICB9XG5cbi8qIFxuICogZ2V0IGNvbmZsaWN0IEFyaWEgYW5kIEh0bWwgYXR0cmlidXRlc1xuICogcmV0dXJuOiBhIGxpc3Qgb2YgQXJpYSBhbmQgSHRtbCBhdHRyaWJ1dGUgcGFpcnMgdGhhdCBhcmUgY29uZmxpY3RcbiovXG5wdWJsaWMgc3RhdGljIGlzVGFibGVEZXNjZW5kYW50KGNvbnRleHRIaWVyYXJjaGllcz86IFJ1bGVDb250ZXh0SGllcmFyY2h5KSB7XG4gICAgaWYgKCFjb250ZXh0SGllcmFyY2hpZXMpIHJldHVybiBudWxsO1xuICAgIFxuICAgIHJldHVybiBjb250ZXh0SGllcmFyY2hpZXNbXCJhcmlhXCJdLmZpbHRlcihoaWVyID0+IFtcInRhYmxlXCIsIFwiZ3JpZFwiLCBcInRyZWVncmlkXCJdLmluY2x1ZGVzKGhpZXIucm9sZSkpO1xufVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICBDb3B5cmlnaHQ6OiAyMDIyLSBJQk0sIEluY1xuICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IENhY2hlVXRpbCB9IGZyb20gXCIuL0NhY2hlVXRpbFwiO1xuaW1wb3J0IHsgRE9NVXRpbCB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NVXRpbFwiO1xuaW1wb3J0IHsgRE9NV2Fsa2VyIH0gZnJvbSBcIi4uLy4uL3YyL2RvbS9ET01XYWxrZXJcIjtcbmltcG9ydCB7IERPTU1hcHBlciB9IGZyb20gXCIuLi8uLi92Mi9kb20vRE9NTWFwcGVyXCI7XG5pbXBvcnQgeyBBcmlhVXRpbCB9IGZyb20gXCIuL0FyaWFVdGlsXCI7XG5pbXBvcnQgeyBDU1NVdGlsIH0gZnJvbSBcIi4vQ1NTVXRpbFwiO1xuaW1wb3J0IHsgQ2xpcFBhdGhVdGlsIH0gZnJvbSBcIi4vQ2xpcFBhdGhVdGlsXCI7XG5cbmV4cG9ydCBjbGFzcyBWaXNVdGlsIHtcbiAgICAvLyBUaGlzIGxpc3QgY29udGFpbnMgYSBsaXN0IG9mIGVsZW1lbnQgdGFncyB3aGljaCBjYW4gbm90IGJlIGhpZGRlbiwgd2hlbiBoaWRkZW4gaXNcbiAgICAvLyBhZGRlZCB0byB0aGVzZXMgZWxlbWVudHMgaXQgZG9lcyBub3QgZG8gYW55dGhpbmcgYXQgYWxsLlxuICAgIC8vICBhcmVhIC0tPiBhcmVhIGVsZW1lbnQgaXMgcGFydCBvZiBhIG1hcCBlbGVtZW50IGFuZCBpdCBjYW4gbm90IGJlIGhpZGRlbiBiZWNhdXNlIGl0IGlzIHVzZWQgdG9cbiAgICAvLyAgICAgICAgICAgbWFrZSBhbiBjZXJ0aWFuIHBhcnRzIG9mIGFuIG1hcCBpbnRlcmFjdGl2ZS5cbiAgICAvLyAgcGFyYW0gLS0+IGVsZW1lbnQgY2FuIG9ubHkgYmUgcGFydCBvZiBvYmplY3QgZWxtZW50IGFuZCBpdCBjYW5ub3QgYmUgaGlkZGVuIGRpcmVjdGx5LCBpdFxuICAgIC8vICAgICAgICAgICAgY2FuIG9ubHkgYmUgaGlkZGVuIGlmIHRoZSBwYXJlbnQgaXMgaGlkZGVuLlxuICAgIC8vICBhdWRpbyAtLT4gSWYgdGhpcyBlbGVtZW50IGlzIGhpZGRlbiBpdCB3aWxsIHN0aWxsIHBsYXkgdGhlIG11c2ljLCBzbyB3ZSBzaG91bGQgc3RpbGwgdHJpZ2dlclxuICAgIC8vICAgICAgICAgICAgdmlvbGF0aW9ucyBmb3IgdGhpcyBlbGVtZW50LlxuICAgIC8vIE5vdGU6IEFsbCBlbGVtZW50IHRhZ3MgdGhhdCBhcmUgYWRkZWQgaGVyZSBzaG91bGQgYmUgYWRkZWQgYXMgbG93ZXJjYXNlLCBhcyB3ZSBhcmUgdXNpbmcgaW5kZXhPZiB0byBkbyB0aGUgY2hlY2suXG4gICAgcHVibGljIHN0YXRpYyB1bmhpZGVhYmxlRWxlbWVudHMgPSBbJ2FyZWEnLCAncGFyYW0nLCAnYXVkaW8nXTtcblxuICAgIC8vIFRoaXMgbGlzdCBjb250YWlucyBhIGxpc3Qgb2YgZWxlbWVudHMgdGFncyB3aGljaCBoYXZlIGRpc3BsYXk6IG5vbmUgYnkgZGVmYXVsdCwgc2luY2Ugd2UgaGF2ZSBydWxlcyB0cmlnZ2VyaW5nXG4gICAgLy8gb24gdGhlc2VzIGVsZW1lbnRzIHdlIG5lZWQgdG8gbWFrZSB0aGVuIHZpc2libGUgYnkgZGVmYXVsdCBzbyB0aGF0IHRoZSBydWxlcyBjYW4gdHJpZ2dlciByZWdhcmRsZXNzIG9mIHRoZVxuICAgIC8vIENoZWNrIEhpZGRlbiBDb250ZW50IG9wdGlvbiBpbiB0aGUgdG9vbHMuXG4gICAgLy8gIHNjcmlwdCAtLT4gc2NyaXB0IGVsZW1lbnRzIGhhdmUgZGlzcGxheTogbm9uZSBieSBkZWZhdWx0XG4gICAgLy8gIGxpbmsgLS0+IGxpbmsgZWxlbWVudHMgaGF2ZSBkaXNwbGF5OiBub25lIGJ5IGRlZmF1bHQsIGJ1dCB0aGUgYWN0dWFsbHkgQ1NTIHNjcmlwdCBpcyBzdGlsbCBleGVjdXRlZCBzbyB3ZSBoYXZlIHRvXG4gICAgLy8gICAgICAgICAgICBtYXJrIHRoaXMgZWxlbWVudCBhcyB2aXNpYmxlIGF0IGFsbCB0aW1lcy5cbiAgICAvLyAgc3R5bGUgLS0+IHN0eWxlIGVsZW1lbnRzIGhhdmUgZGlzcGxheTogbm9uZSBieSBkZWZhdWx0LCBidXQgdGhlIGFjdHVhbGx5IENTUyBzY3JpcHQgaXMgc3RpbGwgZXhlY3V0ZWQgc28gd2UgaGF2ZSB0b1xuICAgIC8vICAgICAgICAgICAgbWFyayB0aGlzIGVsZW1lbnQgYXMgdmlzaWJsZSBhdCBhbGwgdGltZXMuXG4gICAgLy8gIGhlYWQgLS0+IGhlYWQgZWxlbWVudHMgaGF2ZSBkaXNwbGF5OiBub25lIGJ5IGRlZmF1bHQsIGJ1dCBpdCB3aWxsIHN0aWxsIGJlaGF2ZSBjb3JyZWN0XG4gICAgLy8gIHRpdGxlIC0tPiB0aXRsZSBlbGVtZW50cyBoYXZlIGRpc3BsYXk6IG5vbmUgYnkgZGVmYXVsdCwgYnV0IGl0IHdpbGwgc3RpbGwgZGlzcGxheSB0aGUgdGl0bGUuIHJlbW92ZSB0aXRsZSBmcm9tIHRoZSBsaXN0IGJlY2F1c2UgYSB0aXRsZSBjYW4gYmUgYSBjaGlsZCBvZiBhIHN2ZyBlbGVtZW50IHRvb1xuICAgIC8vICBtZXRhIC0tPiBtZXRhIGVsZW1lbnRzIGhhdmUgZGlzcGxheTogbm9uZSBieSBkZWZhdWx0LCBidXQgaXQgd2lsbCBzdGlsbCBwZXJmb3JtIHRoZSBhY3Rpb24gdGhhdCBtZXRhIGlzIHN1cHBvc2UgdG9cbiAgICAvLyAgYmFzZSAtLT4gYmFzZSBlbGVtZW50cyBoYXZlIGRpc3BsYXk6IG5vbmUgYnkgZGVmYXVsdCwgYnV0IGl0IHdpbGwgc3RpbGwgcGVyZm9ybSB0aGUgYWN0aW9uIHRoYXQgbWV0YSBpcyBzdXBwb3NlIHRvXG4gICAgLy8gIG5vc2NyaXB0IC0tPiBub3NjcmlwdCBlbGVtZW50cyBoYXZlIGRpc3BsYXk6IG5vbmUgYnkgZGVmYXVsdCwgYnV0IGl0IHdpbGwgc3RpbGwgcGVyZm9ybSB0aGUgYWN0aW9uIHRoYXQgbWV0YSBpcyBzdXBwb3NlIHRvXG4gICAgLy8gIHRlbXBsYXRlIC0tPiB0ZW1wbGF0ZSBlbGVtZW50cyBoYXZlIGRpc3BsYXk6IG5vbmUgYnkgZGVmYXVsdCwgYmVjYXVzZSB0aGV5IGFyZSBqdXN0IGEgbWVjaGFuaXNtIGZvciBob2xkaW5nIGNsaWVudC1zaWRlIGNvbnRlbnRcbiAgICAvLyAgICAgICAgICAgICAgIHRoYXQgaXMgbm90IHRvIGJlIHJlbmRlcmVkIHdoZW4gYSBwYWdlIGlzIGxvYWRlZC4gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vZG9jcy9XZWIvSFRNTC9FbGVtZW50L3RlbXBsYXRlXG4gICAgLy8gIGRhdGFsaXN0IC0tPiBkYXRhbGlzdCBlbGVtZW50cyBoYXZlIGRpc3BsYXk6IG5vbmUgYnkgZGVmYXVsdCxcbiAgICBwdWJsaWMgc3RhdGljIGhpZGRlbkJ5RGVmYXVsdEVsZW1lbnRzID0gWydzY3JpcHQnLCAnbGluaycsICdzdHlsZScsICdoZWFkJywgJ21ldGEnLCAnYmFzZScsICdub3NjcmlwdCcsICd0ZW1wbGF0ZScsICdkYXRhbGlzdCddXG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBjaGVja2luZyBpZiB0aGUgbm9kZSB0aGF0IGlzIHByb3ZpZWQgaXNcbiAgICAgKiB2aXNpYmxlIG9yIG5vdC4gRm9sbG93aW5nIGlzIGhvdyB0aGUgY2hlY2sgaXMgcGVyZm9ybWVkOlxuICAgICAqICAgIDEuIENoZWNrIGlmIHRoZSBjdXJyZW50IG5vZGUgaXMgaGlkZGVuIHdpdGggdGhlIGZvbGxvd2luZyBvcHRpb25zOlxuICAgICAqICAgICAgIENTUyAtLT4gZGlzbGF5OiBub25lXG4gICAgICogICAgICAgQ1NTIC0tPiB2aXNpYmlsaXR5OiBoaWRkZW5cbiAgICAgKiAgICAgICBhdHRyaWJ1dGUgLS0+IGhpZGRlblxuICAgICAqICAgIDIuIENoZWNrIGlmIHRoZSBhbnkgb2YgdGhlIGN1cnJlbnQgbm9kZXMgcGFyZW50cyBhcmUgaGlkZGVuIHdpdGggdGhlIHNhbWVcbiAgICAgKiAgICAgICBvcHRpb25zIGxpc3RlZCBpbiAxLlxuICAgICAqXG4gICAgICogICAgTm90ZTogSWYgZWl0aGVyIGN1cnJlbnQgbm9kZSBvciBhbnkgb2YgdGhlIHBhcmVudCBub2RlcyBhcmUgaGlkZGVuIHRoZW4gdGhpc1xuICAgICAqICAgICAgICAgIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIGZhbHNlIChub2RlIGlzIG5vdCB2aXNpYmxlKS5cbiAgICAgKlxuICAgICAqICAgIE5vdGU6IG5vZGVzIHdpdGggQ1NTIHByb3BlcnRpZXMgb3BhY2l0eTowIG9yIGZpbHRlcjpvcGFjaXR5KDAlKSwgb3Igc2ltaWxhciBTVkcgbWVjaGFuaXNtczogXG4gICAgICogICAgICBUaGV5IGFyZSBub3QgY29uc2lkZXJlZCBoaWRkZW4uIFRleHQgaGlkZGVuIHdpdGggdGhlc2UgbWV0aG9kcyBjYW4gc3RpbGwgYmUgc2VsZWN0ZWQgb3IgY29waWVkLCBcbiAgICAgKiAgICAgIGFuZCB1c2VyIGFnZW50cyBzdGlsbCBleHBvc2UgaXQgaW4gdGhlaXIgYWNjZXNzaWJpbGl0eSB0cmVlcy4gIFxuICAgICAqIFxuICAgICAqICAgIE5vdGU6IG5vZGVzIGhpZGRlbiBvZmYgc2NyZWVuIG9yIGJlaGluZCBhbm90aGVyIG9iamVjdDogdGhleSBhcmUgbm90IGNvbnNpZGVyZWQgaGlkZGVuLiBcbiAgICAgKiAgICAgIFRoZXkgYXJlIGV4cG9zZWQgaW4gdGhlIGFjY2Vzc2liaWxpdHkgdHJlZSBhbmQgdGhleSBjYW4gZXZlbiBuYW1lIG9uLXNjcmVlbiBvYmplY3RzLlxuICAgICAqIFxuICAgICAqIEBwYXJtIHtlbGVtZW50fSBub2RlIFRoZSBub2RlIHdoaWNoIHNob3VsZCBiZSBjaGVja2VkIGlmIGl0IGlzIHZpc2libGUgb3Igbm90LlxuICAgICAqIEByZXR1cm4ge2Jvb2x9IGZhbHNlIGlmIHRoZSBub2RlIGlzIE5PVCB2aXNpYmxlLCB0cnVlIG90aGVyd2lzZVxuICAgICAqXG4gICAgICogQG1lbWJlck9mIFZpc1V0aWxcbiAgICAgKi9cbiAgICAgcHVibGljIHN0YXRpYyBpc05vZGVWaXNpYmxlKG5vZGVJbjogTm9kZSkgOiBib29sZWFuIHtcblxuICAgICAgICAvLyBDaGVjayB0aGUgbm9kZVR5cGUgaWYgdGhpcyBub2RlLCBpZiB0aGlzIG5vZGUgaXMgYSB0ZXh0IG5vZGUgdGhlblxuICAgICAgICAvLyB3ZSBnZXQgdGhlIHBhcmVudG5vZGUgYW5kIHNldCB0aGF0IGFzIHRoZSBub2RlIGFzIGEgdGV4dCBub2RlcyxcbiAgICAgICAgLy8gdmlzaWJpbGl0eSBpcyBkaXJlY3RseSByZWxhdGVkIHRvIHRoZSBwYXJlbnQgbm9kZS5cbiAgICAgICAgaWYgKG5vZGVJbi5ub2RlVHlwZSA9PT0gMykge1xuICAgICAgICAgICAgbm9kZUluID0gRE9NV2Fsa2VyLnBhcmVudE5vZGUobm9kZUluKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbm9kZSA9IG5vZGVJbiBhcyBFbGVtZW50O1xuXG4gICAgICAgIC8vIFdlIHNob3VsZCBvbmx5IGFsbG93IG5vZGVUeXBlIGVsZW1lbnQsIGFuZCBUZXh0Tm9kZSBhbGwgb3RoZXIgbm9kZXNUeXBlc1xuICAgICAgICAvLyB3ZSBjYW4gcmV0dXJuIHRoZSB2aXNpYmlsaXR5IGFzIHZpc2libGUuXG4gICAgICAgIC8vIEZvbGxvd2luZyBub2RlcyB3aWxsIGJlIHJldHVybmVkIGFzIHZpc2FibGUgYnkgZGVmYXVsdCwgc2luY2Ugd2UgY2FuIG5vdFxuICAgICAgICAvLyBhY3R1YWxseSBjaGFuZ2UgdGhlaXIgdmlzaWJpbGl0eS5cbiAgICAgICAgLy8gIE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFIC0tPiA3XG4gICAgICAgIC8vICBOb2RlLkNPTU1FTlRfTk9ERSAgICAgICAgICAgICAgICAtLT4gOFxuICAgICAgICAvLyAgOSAvKiBOb2RlLkRPQ1VNRU5UX05PREUgKi8gICAgICAgICAgICAgICAtLT4gOVxuICAgICAgICAvLyAgTm9kZS5ET0NVTUVOVF9UWVBFX05PREUgICAgICAgICAgLS0+IDEwXG4gICAgICAgIC8vICBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUgICAgICAtLT4gMTFcbiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgIT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIG93bmVyRG9jdW1lbnQgaXMgcHJlc2VudCBiZWZvcmUgbW92aW5nIGZvcndhcmRcbiAgICAgICAgLy8gaW4gZGV0ZWN0aW5nIGlmIHRoZSBub2RlIGlzIHZpc2libGUgb3Igbm90LiBJbiB0aGUgY2FzZSB0aGF0IG93bmVyRG9jdW1lbnRcbiAgICAgICAgLy8gZG9lcyBub3QgZXhpc3QgdGhlbiB3ZSBzaW1wbHkgcmV0dXJuIG5vZGUgaXMgdmlzaWJsZSBieSBkZWZhdWx0LlxuICAgICAgICBpZiAoIW5vZGUub3duZXJEb2N1bWVudCkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBWYXJpYWJsZSBEZWNsYXJhdGlvblxuICAgICAgICBsZXQgY29tcFN0eWxlO1xuICAgICAgICBsZXQgbm9kZU5hbWUgPSBub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAgICAgLy8gSW4gdGhlIGNhc2UgdGhpcyBub2RlIGlzIGEgc2NyaXB0LCBsaW5rIG9yIHN0eWxlIG5vZGUsIHJpZ2h0IGF3YXkgcmV0dXJuIG5vZGUgaXMgdmlzaWJsZVxuICAgICAgICAvLyBiZWNhdXNlIHNjcmlwdHMsIGxpbmtzIGFuZCBzdHlsZSBub2RlcyBjYW4gbm90IGJlIGhpZGRlbiBieSBIVE1MIGF0dHJpYnV0ZSBvciBDU1Mgb3IgYXJlIGhpZGRlbiBieSBkZWZhdWx0LiBCdXQgd2Ugd2FudCB0byBzY2FuXG4gICAgICAgIC8vIHRoZSBlbGVtZW50cyBldmVyeXRpbWUgYXMgdGhleSByZW5kZXIgY29udGVudCBzdGlsbCB3aGljaCBpcyBzdGlsbCB2aXNpYmxlIHRvIHVzZXJzLlxuICAgICAgICAvLyAgc2NyaXB0IC0tPiBzY3JpcHQgZWxlbWVudHMgaGF2ZSBkaXNwbGF5OiBub25lIGJ5IGRlZmF1bHRcbiAgICAgICAgLy8gIGxpbmsgLS0+IGxpbmsgZWxlbWVudHMgaGF2ZSBkaXNwbGF5OiBub25lIGJ5IGRlZmF1bHQsIGJ1dCB0aGUgYWN0dWFsbHkgQ1NTIHNjcmlwdCBpcyBzdGlsbCBleGVjdXRlZCBzbyB3ZSBoYXZlIHRvXG4gICAgICAgIC8vICAgICAgICAgICAgbWFyayB0aGlzIGVsZW1lbnQgYXMgdmlzaWJsZSBhdCBhbGwgdGltZXMuXG4gICAgICAgIC8vICBzdHlsZSAtLT4gc3R5bGUgZWxlbWVudHMgaGF2ZSBkaXNwbGF5OiBub25lIGJ5IGRlZmF1bHQsIGJ1dCB0aGUgYWN0dWFsbHkgQ1NTIHNjcmlwdCBpcyBzdGlsbCBleGVjdXRlZCBzbyB3ZSBoYXZlIHRvXG4gICAgICAgIC8vICAgICAgICAgICAgbWFyayB0aGlzIGVsZW1lbnQgYXMgdmlzaWJsZSBhdCBhbGwgdGltZXMuXG4gICAgICAgIC8vIGRhdGFsaXN0IC0tPiBJbiB0aGUgcmVuZGVyaW5nLCB0aGUgZGF0YWxpc3QgZWxlbWVudCByZXByZXNlbnRzIG5vdGhpbmcgYW5kIGl0LCBhbG9uZyB3aXRoIGl0cyBjaGlsZHJlbiwgc2hvdWxkIGJlIGhpZGRlbi5cbiAgICAgICAgaWYgKFZpc1V0aWwuaGlkZGVuQnlEZWZhdWx0RWxlbWVudHMgIT0gbnVsbCAmJiBWaXNVdGlsLmhpZGRlbkJ5RGVmYXVsdEVsZW1lbnRzICE9IHVuZGVmaW5lZCAmJiBWaXNVdGlsLmhpZGRlbkJ5RGVmYXVsdEVsZW1lbnRzLmluZGV4T2Yobm9kZU5hbWUpID4gLTEpIHtcbiAgICAgICAgICAgIC8vcmV0dXJuIHRydWU7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgY2FjaGVWYWwgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0hJRERFTlwiLCB1bmRlZmluZWQpO1xuICAgICAgICBpZiAoY2FjaGVWYWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGNhY2hlVmFsO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNldCBQVF9OT0RFX0hJRERFTiB0byBmYWxzZSBmb3IgYWxsIHRoZSBub2RlcywgYmVmb3JlIHRoZSBjaGVjayBhbmQgdGhpcyB3aWxsIGJlIGNoYW5nZWQgdG9cbiAgICAgICAgLy8gdHJ1ZSB3aGVuIHdlIGRldGVjdCB0aGF0IHRoZSBub2RlIGlzIGhpZGRlbi4gV2UgaGF2ZSB0byBzZXQgaXQgdG8gZmFsc2Ugc28gdGhhdCB3ZSBrbm93XG4gICAgICAgIC8vIHRoZSBydWxlcyBoYXMgYWxyZWFkeSBiZWVuIGNoZWNrZWQuXG4gICAgICAgIGNhY2hlVmFsID0gQ2FjaGVVdGlsLnNldENhY2hlKG5vZGUsIFwiUFRfTk9ERV9ISURERU5cIiwgZmFsc2UpO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIHRoaXMgbm9kZSBpcyB2aXNpYmxlLCB3ZSBjaGVjayBjb3VwbGUgb2YgQ1NTIHByb3BlcnRpZXMgYW5kIGhpZGRlbiBhdHRyaWJ1dGUuXG4gICAgICAgIC8vIGFyZWEsIHBhcmFtIGFuZCBhdWRpbyBlbGVtZW50cyB3ZSBkbyBub3QgY2hlY2sgaWYgdGhleSBhcmUgaGlkZGVuIGFzIGl0IGRvZXMgbm90IGFwcGx5IHRvIHRoZW0uXG4gICAgICAgIC8vIENoZWNrIHRoZSB1bmhpZGVhYmxlRWxlbWVudHMgYXJyYXkgd2hpY2ggaXMgcGFydCBvZiB0aGUgcnVsZXMsIHRvIGNoZWNrIGlmIHRoaXMgZWxlbWVudCBpcyBhbGxvd2VkIHRvIGJlIGhpZGRlbiBvciBub3RcbiAgICAgICAgLy8gaW4gdGhlIGNhc2UgdGhhdCB0aGUgZWxlbWVudCBpcyBwYXJ0IG9mIHRoZSB1bmhpZGVhYmxlRWxlbWVudHMgYXJyYXkgdGhlbiB3ZSBkbyBub3QgcnVuIHRoZSBoaWRkZW4gY2hlY2sgb24gdGhpcyBlbGVtZW50LFxuICAgICAgICAvLyBhbmQgZ28gc3RyaWdodCB0byB0aGUgcGFyZW50IG5vZGUuXG4gICAgICAgIC8vIEFycmF5IGNoZWNrIGVsZW1lbnRzIGxpa2U6XG4gICAgICAgIC8vICBhcmVhIC0tPiBhcmVhIGVsZW1lbnQgaXMgcGFydCBvZiBhIG1hcCBlbGVtZW50IGFuZCBpdCBjYW4gbm90IGJlIGhpZGRlbiBiZWNhdXNlIGl0IGlzIHVzZWQgdG9cbiAgICAgICAgLy8gICAgICAgICAgIG1ha2UgYW4gY2VydGlhbiBwYXJ0cyBvZiBhbiBtYXAgaW50ZXJhY3RpdmUuXG4gICAgICAgIC8vICBwYXJhbSAtLT4gZWxlbWVudCBjYW4gb25seSBiZSBwYXJ0IG9mIG9iamVjdCBlbG1lbnQgYW5kIGl0IGNhbm5vdCBiZSBoaWRkZW4gZGlyZWN0bHksIGl0XG4gICAgICAgIC8vICAgICAgICAgICAgY2FuIG9ubHkgYmUgaGlkZGVuIGlmIHRoZSBwYXJlbnQgaXMgaGlkZGVuLlxuICAgICAgICAvLyAgYXVkaW8gLS0+IElmIHRoaXMgZWxlbWVudCBpcyBoaWRkZW4gaXQgd2lsbCBzdGlsbCBwbGF5IHRoZSBtdXNpYywgc28gd2Ugc2hvdWxkIHN0aWxsIHRyaWdnZXJcbiAgICAgICAgLy8gICAgICAgICAgICB2aW9sYXRpb25zIGZvciB0aGlzIGVsZW1lbnQuXG4gICAgICAgIC8vIEluIHRoZSBjYXNlIHRoYXQgdW5oaWRlYWJsZUVsZW1lbnRzIGFycmF5IGlzIG5vdCBkZWZpbmVkIHRoZW4gd2UganVzdCBzY2FuIGFsbCBlbGVtZW50cyBhbmQgZG8gbm8gZmlsdGVyaW5nIGF0IGFsbC5cbiAgICAgICAgaWYgKFZpc1V0aWwudW5oaWRlYWJsZUVsZW1lbnRzID09PSBudWxsIHx8IFZpc1V0aWwudW5oaWRlYWJsZUVsZW1lbnRzID09PSB1bmRlZmluZWQgfHwgVmlzVXRpbC51bmhpZGVhYmxlRWxlbWVudHMuaW5kZXhPZihub2RlTmFtZSkgPT09IC0xKSB7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiBkZWZhdWx0VmlldyBleGlzdHMgZm9yIHRoaXMgbm9kZSwgaWYgaXQgZG9lcyB0aGVuIHVzZSB0aGlzIHRvIHJ1biB0aGUgZ2V0Q29tcHV0ZWRTdHlsZVxuICAgICAgICAgICAgLy8gZnVuY3Rpb24gdG8gZ2V0IHRoZSBDU1Mgc3R5bGUgZm9yIHRoZSBub2RlLlxuICAgICAgICAgICAgaWYgKG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldykge1xuICAgICAgICAgICAgICAgIC8vIFJ1biB0aGUgZ2V0Q29tcHV0ZWRTdHlsZSBvbiB0aGlzIG5vZGUgdG8gZmV0Y2ggdGhlIENTUyBjb21wdWF0aW9uIG9mIHRoZSBub2RlXG4gICAgICAgICAgICAgICAgY29tcFN0eWxlID0gbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LmdldENvbXB1dGVkU3R5bGUobm9kZSwgbnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IGRlZmF1bHRWaWV3IGRvZXMgbm90IGV4aXN0cyByZXR1cm4gdHJ1ZSB0byBpZGVudGlmeSB0aGF0IHRoaXNcbiAgICAgICAgICAgIC8vIG5vZGUgaXMgdmlzaWJsZSwgYmVjYXVzZSB3ZXJlIG5vdCBhYmxlIHRvIGRldGVjdCBpZiBpdCB3YXMgbm90LlxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIENhY2hlVXRpbC5zZXRDYWNoZShub2RlLCBcIlBUX05PREVfSElEREVOXCIsIHRydWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBHZXQgdGhlIGhpZGRlbiBlbGVtZW50IHByb3BlcnR5IGFuZCBoaWRkZW4gYXR0cmlidXRlXG4gICAgICAgICAgICBsZXQgaGlkZGVuQXR0cmlidXRlID0gbm9kZS5nZXRBdHRyaWJ1dGUoXCJoaWRkZW5cIik7XG4gICAgICAgICAgICBsZXQgaGlkZGVuUHJvcGVydHlDdXN0b20gPSBjYWNoZVZhbDtcbiAgICAgICAgICAgIC8vIFRvIGdldCB0aGUgaGlkZGVuIHByb3BlcnR5IHdlIG5lZWQgdG8gcGVyZm9ybSBhIHNwZWNpYWwgY2hlY2sgYXMgaW4gc29tZSBjYXNlcyB0aGUgaGlkZGVuIHByb3BlcnR5IHdpbGwgbm90IGJlXG4gICAgICAgICAgICAvLyBhIGJvb2xlYW4sIGZvciB0aGVzZXMgY2FzZXMgd2Ugc2V0IGl0IHRvIGZhbHNlIGFzIHdlIGFyZSBub3QgYWJsZSB0byBkZXRlcm1pbmUgdGhlIHRydWUgaGlkZGVuIGNvbmRpdGlvbi5cbiAgICAgICAgICAgIC8vIFRoZSByZWFzb24gZm9yIHRoaXMgaXMgYmVjYXVzZSBmb3JtIGVsZW1lbnRzIGFyZSBhYmxlIHRvIHBlcmZvcm0gYW4gb3ZlcnJpZGUsIHNvIHdoZW4gd2UgaGF2ZSBpZD1cImhpZGRlblwiIGZvciBhbiBlbGVtZW50XG4gICAgICAgICAgICAvLyB3aGljaCBpcyB1bmRlciB0aGUgZm9ybSBlbGVtZW50IHRoZW4sIG5vZGUuaGlkZGVuIGdpdmVzIHRoZSBlbGVtZW50L2xpc3Qgb2YgZWxlbWVudHMgd2hpY2ggaGF2ZSBpZD1cImhpZGRlblwiLiBSZWZlciB0b1xuICAgICAgICAgICAgLy8gbW96aWxsYSBidWc6IGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTEyNjczNTZcbiAgICAgICAgICAgIGxldCBoaWRkZW5Qcm9wZXJ0eSA9IHR5cGVvZiAobm9kZSBhcyBhbnkpLmhpZGRlbiA9PT0gXCJib29sZWFuXCIgPyAobm9kZSBhcyBhbnkpLmhpZGRlbiA6IGZhbHNlO1xuICAgICAgICAgICAgLy8gSWYgY29tcFN0eWxlIG9iamVjdCBpcyBlbXB0eSwgbm9kZSBkb2VzJ3QgaGF2ZSBoaWRkZW4gcHJvcGVydHksIG5vZGUgZG9lcyd0IGhhdmUgaGlkZGVuIGF0dHJpYnV0ZSBhbmQgZG9lcyd0IGhhdmUgY3VzdG9tIFBUXG4gICAgICAgICAgICAvLyBoaWRkZW4gcHJvcGVydHkgdGhlbiB3ZSBjYW4ganVzdCByZXR1cm4gdHJ1ZSAobm9kZSB2aXNpYmxlKSBhdCB0aGlzIHBvaW50LlxuICAgICAgICAgICAgaWYgKCFjb21wU3R5bGUgJiZcbiAgICAgICAgICAgICAgICAhaGlkZGVuUHJvcGVydHkgJiYgLy8gdGhpcyBjb3ZlcnMgZmFsc2UsIG51bGwsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIChoaWRkZW5BdHRyaWJ1dGUgPT09IG51bGwgfHwgaGlkZGVuQXR0cmlidXRlID09PSB1bmRlZmluZWQpICYmXG4gICAgICAgICAgICAgICAgIWhpZGRlblByb3BlcnR5Q3VzdG9tIC8vIFRoaXMgY292ZXJzIGZhbHNlLCBudWxsIG9yIHVuZGVmaW5lZFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIENhY2hlVXRpbC5zZXRDYWNoZShub2RlLCBcIlBUX05PREVfSElEREVOXCIsIHRydWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IHRoZSBjb21wU3R5bGUgaXMgZGVmaW5lZCB3ZSBjaGVjayB0aGUgZm9sbG93aW5nOlxuICAgICAgICAgICAgLy8gIENTUyBzdHlsZSBkaXNwbGF5IHNldCB0byBub25lXG4gICAgICAgICAgICAvLyAgQ1NTIHN0eWxlIHZpc2liaWxpdHkgc2V0IHRvIGhpZGRlblxuICAgICAgICAgICAgLy8gICAgTm90ZTogRm9yIHRoaXMgcHJvcGVydHkgc2luY2UgaXQgaXMgaW5oZXJpdGVkLCBuZWVkIHRvIHNraXAgdGhlIGNoZWNrIG9uIHBhcmVudHMgYXNcbiAgICAgICAgICAgIC8vICAgICAgICAgIHRoZSBwYXJlbnQgY2FuIGhhdmUgaGlkZGVuIGJ1dCB0aGUgY2hpbGQgY2FuIGJlIHZpc2libGUuIFNvIHdlIG9ubHkgY2hlY2sgdGhpcyBwcm9wZXJ0eVxuICAgICAgICAgICAgLy8gICAgICAgICAgb24gY2hpbGQgZWxlbWVudHMvZWxlbWVudHMgdGhhdCBhcmUgcGFzc2VkIHRvIHRoaXMgZnVuY3Rpb24gdGhlIGZpcnN0IHRpbWUuXG4gICAgICAgICAgICAvLyAgbm9kZSBoaWRkZW4gcHJvcGVydHkgc2V0IChub2RlLmhpZGRlbilcbiAgICAgICAgICAgIC8vICBub2RlIGF0dHJpYnV0ZSBoaWRkZW4gc2V0ICh0byBhbnkgdmFsdWUpXG4gICAgICAgICAgICAvLyAgbm9kZSBjdXN0b20gaGlkZGVuIHByb3BlcnR5IHNlciAobm9kZS5QVF9OT0RFX0hJRERFTilcbiAgICAgICAgICAgIC8vIElmIGFueSBvZiB0aGUgYWJvdmUgY29uZGl0aW9ucyBhcmUgdHJ1ZSB0aGVuIHdlIHJldHVybiBmYWxzZSBhcyB0aGlzIGVsZW1lbnQgaXMgbm90IHZpc2libGVcbiAgICAgICAgICAgIGlmICgoY29tcFN0eWxlICE9PSBudWxsICYmICgoY29tcFN0eWxlLmdldFByb3BlcnR5VmFsdWUoJ2Rpc3BsYXknKSA9PT0gJ25vbmUnIHx8XG4gICAgICAgICAgICAgICAgKCFDYWNoZVV0aWwuZ2V0Q2FjaGUobm9kZSwgXCJWaXNpYmlsaXR5X0NoZWNrX1BhcmVudFwiLCBudWxsKSAmJiBjb21wU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgndmlzaWJpbGl0eScpID09PSAnaGlkZGVuJykpKSB8fFxuICAgICAgICAgICAgICAgIChjb21wU3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgnZGlzcGxheScpICE9PSAnYmxvY2snICAmJiAoaGlkZGVuUHJvcGVydHkgfHwgaGlkZGVuQXR0cmlidXRlICE9IG51bGwgfHwgaGlkZGVuUHJvcGVydHlDdXN0b20pKSkpIHtcbiAgICAgICAgICAgICAgICAvLyBTZXQgYSBjdXN0b20gZXhwYW5kb3MgcHJvcGVydHkgb24gdGhlIHRoZSBub2RlIHRvIGlkZW50aWZ5IHRoYXQgaXQgaXMgaGlkZGVuLCBzbyB0aGF0IHdlIGNhbiB1c2VzXG4gICAgICAgICAgICAgICAgLy8gdXNlIHRoaXMgaW4gdGhlIHJ1bGVzIHRvIGRldGVybWluZSBpZiB0aGUgbm9kZSBpcyBoaWRkZW4gb3Igbm90LCBpZiB3ZSBuZWVkIHRvLlxuICAgICAgICAgICAgICAgIC8vIFVzZSBleHBhbmRvcyBwcm9wZXJ0eSBpbnN0ZWFkIG9mIGEgaGFzaCBtYXAgd2hpY2ggc3RvcmVzIHRoZSBlbGVtZW50cywgYWRkaW5nL2NoZWNraW5nIGV4cGFuZG9zXG4gICAgICAgICAgICAgICAgLy8gcHJvcGVydGllcyBpcyBhIGxvdCBmYXN0ZXIgcGVyZm9ybWFuY2Ugd2hpc2UuIEZvciBIYXNoIG1hcCB3ZSBuZWVkIHRvIHN0b3JlIGJhc2VkIG9uIHhwYXRoLCBhbmQgdG8gY2FsY3VsYXRlXG4gICAgICAgICAgICAgICAgLy8geHBhdGggaXQgaXMgbW9yZSBwZXJmb3JtYW5jZSBpbXBhY3QuXG4gICAgICAgICAgICAgICAgcmV0dXJuIENhY2hlVXRpbC5zZXRDYWNoZShub2RlLCBcIlBUX05PREVfSElEREVOXCIsIGZhbHNlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gY2hlY2sgY29udGVudC12aXNpYmlsaXR5OiBpZiB0aGUgY29udGVudC12aXNpYmlsaXR5IGlzIGhpZGRlbiwgdGhlbiwgcmV0dXJuIGZhbHNlIGFzIHRoZSBlbGVtZW50IGlzIG5vdCB2aXNpYmxlXG4gICAgICAgICAgICBpZiAoVmlzVXRpbC5pc0NvbnRlbnRIaWRkZW4obm9kZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gQ2FjaGVVdGlsLnNldENhY2hlKG5vZGUsIFwiUFRfTk9ERV9ISURERU5cIiwgZmFsc2UpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBjaGVjayBoaWRkZW4gYnkgY2xpcC1wYXRoXG4gICAgICAgICAgICAvLyBUT0RPOiBuZWVkIHRvIGNoZWNrIGlmIGhpZGRlbiBjb250ZW50IGNvbnRhaW5zIGZvY3VzYWJsZSBlbGVtZW50cywgc2ltaWxhcmx5IHRvIG9mZnNjcmVlbiBjb250ZW50XG4gICAgICAgICAgICBpZiAoQ2xpcFBhdGhVdGlsLmlzTm9kZVZpc3VhbGx5SGlkZGVuQnlDbGlwUGF0aChub2RlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0hJRERFTlwiLCBmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBHZXQgdGhlIHBhcmVudE5vZGUgZm9yIHRoaXMgbm9kZSwgYmVjdWFzZSB3ZSBoYXZlIHRvIGNoZWNrIGFsbCBwYXJlbnRzIHRvIG1ha2Ugc3VyZSB0aGV5IGRvIG5vdCBoYXZlXG4gICAgICAgIC8vIHRoZSBoaWRkZW4gQ1NTLCBwcm9wZXJ0eSBvciBhdHRyaWJ1dGUuIE9ubHkga2VlcCBjaGVja2luZyB1bnRpbCB3ZSBhcmUgYWxsIHRoZSB3YXkgYmFjayB0byB0aGUgcGFyZW50Tm9kZVxuICAgICAgICAvLyBlbGVtZW50LlxuICAgICAgICBsZXQgcGFyZW50RWxlbWVudCA9IERPTVdhbGtlci5wYXJlbnROb2RlKG5vZGUpO1xuXG4gICAgICAgIC8vIElmIHRoZSBwYXJlbnQgbm9kZSBleGlzdHMgYW5kIHRoZSBub2RldHlwZSBpcyBlbGVtZW50ICgxKSwgdGhlbiBydW4gcmVjdXJzaXZlIGNhbGwgdG8gcGVyZm9ybSB0aGUgY2hlY2tcbiAgICAgICAgLy8gYWxsIHRoZSB3YXkgdXAgdG8gdGhlIHZlcnkgcGFyZW50IG5vZGUuIFVzZSByZWN1cnNpdmUgY2FsbCBoZXJlIGluc3RlYWQgb2YgYSB3aGlsZSBsb29wIHNvIHRoYXQgd2UgZG8gbm90XG4gICAgICAgIC8vIGhhdmUgdG8gZHVwbGljYXRlIHRoZSBsb2dpYyBmb3IgY2hlY2tpbmcgaWYgdGhlIG5vZGUgaXMgdmlzaWJsZSBvciBub3QgZm9yIGFsbCB0aGUgcGFyZW50cyBzdGFydGluZyB3aXRoXG4gICAgICAgIC8vIGNoaWxkIG5vZGUuXG4gICAgICAgIGlmIChwYXJlbnRFbGVtZW50ICE9IG51bGwgJiYgcGFyZW50RWxlbWVudC5ub2RlVHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBoYXZlIGEgcGFyZW50IGVsZW1lbnQgZ29pbmcgdGhyb3VnaCB0aGUgaXNOb2RlVmlzaWJsZSBmdW5jdGlvbiB3ZSBoYXZlIHRvIG1hcmsgaXQgYXMgc3VjaFxuICAgICAgICAgICAgLy8gc28gdGhhdCBpbiB0aGUgZnVuY3Rpb24gd2UgY2FuIHNraXAgY2hlY2tpbmcgdmlzaWJpbGl0eTogaGlkZGVuIGZvciBwYXJlbnQgZWxlbWVudHMgc2luY2UgdmlzaWJpbGl0eTogaGlkZGVuXG4gICAgICAgICAgICAvLyBpcyBpbmhlcml0ZWQsIHdoaWNoIGFsbG93cyBhIGNoaWxkIHRvIGhhdmUgYSBkaWZmZXJlbnQgc2V0dGluZyB0aGVuIHRoZSBjaGlsZC4gVGhpcyBwcm9wZXJ0eSBvbmx5IG5lZWRzIHRvIGJlIGNoZWNrZWRcbiAgICAgICAgICAgIC8vIG9uY2UgZm9yIHRoZSBmaXJzdCBlbGVtZW50IHRoYXQgaXMgcGFzc2VkIGRvd24gYW5kIHRoYXQgaXMgYWxsLiBJZ25vcmUgaXQgZm9yIGFsbCB0aGUgcGFyZW50cyB0aGF0IHdlIGl0ZXJhdGUgb3Zlci5cbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShwYXJlbnRFbGVtZW50IGFzIEVsZW1lbnQsIFwiVmlzaWJpbGl0eV9DaGVja19QYXJlbnRcIiwgdHJ1ZSk7XG5cbiAgICAgICAgICAgIC8vIENoZWNrIHVwd2FyZHMgcmVjdXJzaXZlbHksIGFuZCBzYXZlIHRoZSByZXN1bHRzIGluIGFuIHZhcmlhYmxlXG4gICAgICAgICAgICBsZXQgbm9kZVZpc2libGUgPSBWaXNVdGlsLmlzTm9kZVZpc2libGUocGFyZW50RWxlbWVudCk7XG5cbiAgICAgICAgICAgIC8vIElmIHRoZSBub2RlIGlzIGZvdW5kIHRvIG5vdCBiZSB2aXNpYmxlIHRoZW4gYWRkIHRoZSBjdXN0b20gUFRfTk9ERV9ISURERU4gdG8gdHJ1ZS5cbiAgICAgICAgICAgIC8vIHNvIHRoYXQgd2UgY2FuIHVzZSB0aGlzIGluIHRoZSBydWxlcy5cbiAgICAgICAgICAgIC8vIGlmICghbm9kZVZpc2libGUpIHtcbiAgICAgICAgICAgIC8vICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0hJRERFTlwiLCB0cnVlKTtcbiAgICAgICAgICAgIC8vIH1cblxuICAgICAgICAgICAgLy8gQ2hlY2sgdXB3YXJkcyByZWN1cnNpdmVseVxuICAgICAgICAgICAgcmV0dXJuIENhY2hlVXRpbC5zZXRDYWNoZShub2RlLCBcIlBUX05PREVfSElEREVOXCIsIG5vZGVWaXNpYmxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJldHVybiB0cnVlIChub2RlIGlzIHZpc2libGUpXG4gICAgICAgIHJldHVybiBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0hJRERFTlwiLCB0cnVlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHJlc3BvbnNpYmxlIGZvciBjaGVja2luZyBpZiB0aGUgbm9kZSB0aGF0IGlzIHZpc3VhbGx5IGhpZGRlbiBieSBjbGlwcGluZyBvciBvcGFxOlxuICAgICAqICAgIDEuIENoZWNrIGlmIHRoZSBjdXJyZW50IG5vZGUgaXMgdmlzdWFsbHkgaGlkZGVuOlxuICAgICAqICAgICAgIENTUyAtLT4gY2xpcDogcmVjdCgwcHgsIDBweCwgMHB4LCAwcHgpXG4gICAgICogICAgICAgQ1NTIC0tPiBvcGFjaXR5OiAwXG4gICAgICpcbiAgICAgKiAgICBOb3RlOiBJZiBlaXRoZXIgY3VycmVudCBub2RlIG9yIGFueSBvZiB0aGUgcGFyZW50IG5vZGVzIGFyZSB2aXN1YWxseSBoaWRkZW4gdGhlbiB0aGlzXG4gICAgICogICAgICAgICAgZnVuY3Rpb24gd2lsbCByZXR1cm4gdHJ1ZSAobm9kZSBpcyBub3QgdmlzdWFsbHkgaGlkZGVuKS5cbiAgICAgKlxuICAgICAqICAgIE5vdGU6IG5vZGVzIHdpdGggQ1NTIHByb3BlcnRpZXMgY2xpcDogcmVjdCgwcHgsIDBweCwgMHB4LCAwcHgpIG9yIG9wYWNpdHk6MCBvciBmaWx0ZXI6b3BhY2l0eSgwJSksIG9yIHNpbWlsYXIgU1ZHIG1lY2hhbmlzbXM6IFxuICAgICAqICAgICAgVGhleSBhcmUgbm90IGNvbnNpZGVyZWQgaGlkZGVuIHRvIGFuIEFULiBUZXh0IGhpZGRlbiB3aXRoIHRoZXNlIG1ldGhvZHMgY2FuIHN0aWxsIGJlIHNlbGVjdGVkIG9yIGNvcGllZCwgXG4gICAgICogICAgICBhbmQgdXNlciBhZ2VudHMgc3RpbGwgZXhwb3NlIGl0IGluIHRoZWlyIGFjY2Vzc2liaWxpdHkgdHJlZXMuICBcbiAgICAgKiBcbiAgICAgKiBAcGFybSB7ZWxlbWVudH0gbm9kZSBUaGUgbm9kZSB3aGljaCBzaG91bGQgYmUgY2hlY2tlZCBpZiBpdCBpcyB2aXN1YWxseSBoaWRkZW4gb3Igbm90LlxuICAgICAqIEByZXR1cm4ge2Jvb2x9IHRydWUgaWYgdGhlIG5vZGUgaXMgdmlzdWFsbHkgaGlkZGVuLCBmYWxzZSBvdGhlcndpc2VcbiAgICAgKlxuICAgICAqIEBtZW1iZXJPZiBWaXNVdGlsXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpc05vZGVWaXN1YWxseUhpZGRlbihub2RlOiBOb2RlKSA6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIW5vZGUgfHwgbm9kZS5ub2RlVHlwZSAhPT0gMSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBcbiAgICAgICAgbGV0IGVsZW0gPSBub2RlIGFzIEhUTUxFbGVtZW50O1xuICAgICAgICAvLyBTZXQgUFRfTk9ERV9ISURERU4gdG8gZmFsc2UgZm9yIGFsbCB0aGUgbm9kZXMsIGJlZm9yZSB0aGUgY2hlY2sgYW5kIHRoaXMgd2lsbCBiZSBjaGFuZ2VkIHRvXG4gICAgICAgIC8vIHRydWUgd2hlbiB3ZSBkZXRlY3QgdGhhdCB0aGUgbm9kZSBpcyBoaWRkZW4uIFdlIGhhdmUgdG8gc2V0IGl0IHRvIGZhbHNlIHNvIHRoYXQgd2Uga25vd1xuICAgICAgICAvLyB0aGUgcnVsZXMgaGFzIGFscmVhZHkgYmVlbiBjaGVja2VkLlxuICAgICAgICBjb25zdCBoaWRkZW4gPSBDYWNoZVV0aWwuZ2V0Q2FjaGUoZWxlbSwgXCJQVF9OT0RFX1ZJU1VBTExZX0hJRERFTlwiLCB1bmRlZmluZWQpO1xuICAgICAgICBpZiAoaGlkZGVuID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIGRlZmluZWQgc3R5bGVzIG9ubHkgZ2l2ZSB0aGUgc3R5bGVzIHRoYXQgY2hhbmdlZFxuICAgICAgICAgICAgY29uc3QgY29tcF9zdHlsZXMgPSBDU1NVdGlsLmdldENvbXB1dGVkU3R5bGUoZWxlbSk7XG4gICAgICAgICAgICBpZiAoKGNvbXBfc3R5bGVzWydwb3NpdGlvbiddPT09J2Fic29sdXRlJyAmJiBjb21wX3N0eWxlc1snY2xpcCddICYmIChjb21wX3N0eWxlc1snY2xpcCddIGFzIGFueSkucmVwbGFjZUFsbCgnICcsICcnKT09PSdyZWN0KDBweCwwcHgsMHB4LDBweCknKVxuICAgICAgICAgICAgICAgIHx8IChjb21wX3N0eWxlc1snb3BhY2l0eSddICYmIHBhcnNlRmxvYXQoY29tcF9zdHlsZXNbJ29wYWNpdHknXSkgPCAwLjEpKSAge1xuICAgICAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOXCIsIHRydWUpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBHZXQgdGhlIHBhcmVudE5vZGUgZm9yIHRoaXMgbm9kZSwgYmVjdWFzZSB3ZSBoYXZlIHRvIGNoZWNrIGFsbCBwYXJlbnRzIHRvIG1ha2Ugc3VyZSB0aGV5IGRvIG5vdCBoYXZlXG4gICAgICAgICAgICAvLyB0aGUgaGlkZGVuIENTUywgcHJvcGVydHkgb3IgYXR0cmlidXRlLiBPbmx5IGtlZXAgY2hlY2tpbmcgdW50aWwgd2UgYXJlIGFsbCB0aGUgd2F5IGJhY2sgdG8gdGhlIHBhcmVudE5vZGVcbiAgICAgICAgICAgIC8vIGVsZW1lbnQuXG4gICAgICAgICAgICBsZXQgcGFyZW50RWxlbWVudCA9IERPTVdhbGtlci5wYXJlbnRFbGVtZW50KGVsZW0pO1xuICAgICAgICAgICAgaWYgKCFwYXJlbnRFbGVtZW50KVxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcblxuICAgICAgICAgICAgLy8gQ2hlY2sgdXB3YXJkcyByZWN1cnNpdmVseVxuICAgICAgICAgICAgY29uc3QgaGlkID0gVmlzVXRpbC5pc05vZGVWaXN1YWxseUhpZGRlbihwYXJlbnRFbGVtZW50KTtcbiAgICAgICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShlbGVtLCBcIlBUX05PREVfVklTVUFMTFlfSElEREVOXCIsIGhpZCk7XG4gICAgICAgICAgICByZXR1cm4gaGlkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoaWRkZW47XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcmV0dXJuIHRydWUgaWYgdGhlIG5vZGUgb3IgaXRzIGFuY2VzdG9yIGlzIGhpZGRlbiBieSBDU1MgY29udGVudC12aXNpYmlsaXR5OmhpZGRlblxuICAgICAqIEF0IHRoaXMgdGltZSwgQ1NTIGNvbnRlbnQtdmlzaWJpbGl0eSBpcyBwYXJ0aWFsbHkgc3VwcG9ydGVkIGJ5IENocm9tZSAmIEVkZ2UsIGJ1dCBub3Qgc3VwcG9ydGVkIGJ5IEZpcmVmb3hcbiAgICAgKiBUaGUgaW1wbGVtZW50YXRpb24gVEVNUE9SQVJJTFkgZm9sbG93cyB0aGUgQ2hyb21lIHRlc3QgcmVzdWx0czpcbiAgICAgKiAgIGlmIGNvbnRlbnQtdmlzaWJpbGl0eTpoaWRkZW5cbiAgICAgKiAgICAgIGlmIHRoZSBlbGVtZW50IGlzIGJsb2NrLWxldmVsIChkZWZhdWx0IG9yIHNwZWNpZmllZCBieSB0aGUgdXNlciksIHRoZW4gdGhlIGVsZW1lbnQgYW5kIGl0cyBjaGlsZHJlbiBhcmUgbm9ybWFsbHkgaGlkZGVuO1xuICAgICAqICAgICAgaWYgdGhlIGVsZW1lbnQgaXMgaW5saW5lIChkZWZhdWx0IG9yIHNwZWNpZmllZCBieSB0aGUgdXNlciksIHRoZW4gdGhlIGVsZW1lbnQgYW5kIGl0cyBjaGlsZHJlbiBhcmUgbm9ybWFsbHkgTk9UIGhpZGRlbjsgXG4gICAgICogXG4gICAgICogQHBhcmFtIG5vZGVcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzQ29udGVudEhpZGRlbihub2RlOiBFbGVtZW50KSA6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBjb25zdCB2aXMgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0NvbnRlbnRIaWRkZW5cIiwgdW5kZWZpbmVkKTtcbiAgICAgICAgaWYgKHZpcyAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdmlzOyAgICBcblxuICAgICAgICBjb25zdCBzdHlsZSA9ICBnZXRDb21wdXRlZFN0eWxlKG5vZGUpO1xuICAgICAgICBpZiAoIXN0eWxlKSB7XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0NvbnRlbnRIaWRkZW5cIiwgZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbnRlbnRfdmlzaWJpbGl0eSA9IHN0eWxlLmdldFByb3BlcnR5VmFsdWUoXCJjb250ZW50LXZpc2liaWxpdHlcIik7XG4gICAgICAgIGlmIChjb250ZW50X3Zpc2liaWxpdHkgIT09ICdoaWRkZW4nKSB7XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0NvbnRlbnRIaWRkZW5cIiwgZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgXG4gICAgICAgIH0gXG4gICAgICAgIGNvbnN0IGRpc3BsYXkgPSBzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKFwiZGlzcGxheVwiKTsgXG4gICAgICAgIC8vIGlubGluZSBlbGVtZW50IG9ubHlcbiAgICAgICAgaWYgKGRpc3BsYXkgPT09ICdpbmxpbmUnKSB7XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0NvbnRlbnRIaWRkZW5cIiwgZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9ICBcbiAgICAgICAgXG4gICAgICAgIENhY2hlVXRpbC5zZXRDYWNoZShub2RlLCBcIlBUX05PREVfQ29udGVudEhpZGRlblwiLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcmV0dXJuIHRydWUgaWYgdGhlIG5vZGUgaXMgb2Zmc2NyZWVuIGJ5IENTUyBwb3NpdGlvblxuICAgICAqIEBwYXJhbSBub2RlXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpc0VsZW1lbnRPZmZzY3JlZW4obm9kZTogSFRNTEVsZW1lbnQpIDogYm9vbGVhbiB7XG4gICAgICAgIGlmICghbm9kZSkgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmIChub2RlLm5vZGVUeXBlICE9PSAxKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIFxuICAgICAgICBjb25zdCB2aXMgPSBDYWNoZVV0aWwuZ2V0Q2FjaGUobm9kZSAsIFwiUFRfTk9ERV9PZmZzY3JlZW5cIiwgdW5kZWZpbmVkKTtcbiAgICAgICAgaWYgKHZpcyAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdmlzOyAgXG5cbiAgICAgICAgY29uc3QgbWFwcGVyIDogRE9NTWFwcGVyID0gbmV3IERPTU1hcHBlcigpO1xuICAgICAgICBjb25zdCBib3VuZHMgPSBtYXBwZXIuZ2V0VW5hZGp1c3RlZEJvdW5kcyhub2RlKTsgXG4gICAgICAgIGlmICghYm91bmRzKSB7XG4gICAgICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX09mZnNjcmVlblwiLCB0cnVlKTsgXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgaWYgKGJvdW5kc1snaGVpZ2h0J10gPT09IDAgfHwgYm91bmRzWyd3aWR0aCddID09PSAwIHx8IChib3VuZHNbJ3RvcCddK2JvdW5kc1snaGVpZ2h0J10pIDw9IDAgfHwgKGJvdW5kc1snbGVmdCddK2JvdW5kc1snd2lkdGgnXSkgPD0gMCkge1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKG5vZGUsIFwiUFRfTk9ERV9PZmZzY3JlZW5cIiwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBcblxuICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX09mZnNjcmVlblwiLCBmYWxzZSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiByZXR1cm4gdHJ1ZSBpZiB0aGUgbm9kZSBvciBpdHMgYW5jZXN0b3IgaXMgbmF0aXZlbHkgaGlkZGVuIG9yIGFyaWEtaGlkZGVuID0gJ3RydWUnXG4gICAgICogQHBhcmFtIG5vZGVcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzTm9kZUhpZGRlbkZyb21BVChub2RlOiBFbGVtZW50KSA6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIW5vZGUpIHJldHVybiBmYWxzZTtcbiAgICAgICAgY29uc3QgdmlzID0gQ2FjaGVVdGlsLmdldENhY2hlKG5vZGUsIFwiUFRfTk9ERV9IaWRkZW5Gcm9tQVRcIiwgdW5kZWZpbmVkKTtcbiAgICAgICAgaWYgKHZpcyAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdmlzOyAgIFxuXG4gICAgICAgIGlmICghVmlzVXRpbC5pc05vZGVWaXNpYmxlKG5vZGUpIHx8IG5vZGUuZ2V0QXR0cmlidXRlKFwiYXJpYS1oaWRkZW5cIikgPT09ICd0cnVlJykge1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKG5vZGUsIFwiUFRfTk9ERV9IaWRkZW5Gcm9tQVRcIiwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSAgICBcbiAgICAgICAgbGV0IGFuY2VzdG9yID0gRE9NVXRpbC5nZXRBbmNlc3RvcldpdGhBdHRyaWJ1dGUobm9kZSwgXCJhcmlhLWhpZGRlblwiLCBcInRydWVcIik7XG4gICAgICAgIGlmIChhbmNlc3Rvcikge1xuICAgICAgICAgICAgQ2FjaGVVdGlsLnNldENhY2hlKG5vZGUsIFwiUFRfTk9ERV9IaWRkZW5Gcm9tQVRcIiwgdHJ1ZSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBDYWNoZVV0aWwuc2V0Q2FjaGUobm9kZSwgXCJQVF9OT0RFX0hpZGRlbkZyb21BVFwiLCBmYWxzZSk7ICAgIFxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcmV0dXJuIHRydWUgaWYgdGhlIG5vZGUgb3IgaXRzIGFuY2VzdG9yIGlzIG5hdGl2ZWx5IGhpZGRlbiBvciBhcmlhLWhpZGRlbiA9ICd0cnVlJ1xuICAgICAqIEBwYXJhbSBub2RlXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBpc05vZGVQcmVzZW50YXRpb25hbChub2RlOiBFbGVtZW50KSA6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCByb2xlID0gQXJpYVV0aWwuZ2V0UmVzb2x2ZWRSb2xlKG5vZGUpO1xuICAgICAgICBpZiAocm9sZSAmJiAocm9sZSA9PT0gJ25vbmUnIHx8IHJvbGUgPT09ICdwcmVzZW50YXRpb24nKSkgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiByZXR1cm4gdHJ1ZSBpZiB0aGUgZWxlbWVudCBpcyBzY3JvbGxhYmxlXG4gICAgICogQHBhcmFtIG5vZGVcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGlzRWxlbWVudFNjcm9sbGFibGUoZWxlbTogSFRNTEVsZW1lbnQpIDogYm9vbGVhbiB7XG4gICAgICAgIGlmICghZWxlbSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IHN0eWxlcyA9IENTU1V0aWwuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtKTtcbiAgICAgICAgaWYgKCFzdHlsZXMpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBsZXQgeF9zY3JvbGwgPSBzdHlsZXMuZ2V0UHJvcGVydHlWYWx1ZSgnb3ZlcmZsb3cteCcpO1xuICAgICAgICBsZXQgeV9zY3JvbGwgPSBzdHlsZXMuZ2V0UHJvcGVydHlWYWx1ZSgnb3ZlcmZsb3cteScpO1xuICAgICAgICAvL2NvbnNvbGUubG9nKFwiYmVmb3JlIG5vZGU9XCIrIGVsZW0ubm9kZU5hbWUgK1wiLCBpZD1cIitlbGVtLmdldEF0dHJpYnV0ZShcImlkXCIpICtcIiwgeF9zY3JvbGw9XCIreF9zY3JvbGwgKyBcIiwgeV9zY3JvbGw9XCIreV9zY3JvbGwpO1xuIFxuICAgICAgICAvLyBJZiBvdmVyZmxvdy15IGlzIGhpZGRlbiwgc2Nyb2xsLCBvciBhdXRvLCBhbmQgdGhlIG92ZXJmbG93LXggcHJvcGVydHkgaXMgdmlzaWJsZSAoZGVmYXVsdCksIHRoZSB2YWx1ZSB3aWxsIGJlIGltcGxpY2l0bHkgY29tcHV0ZWQgYXMgYXV0by5cbiAgICAgICAgaWYgKHhfc2Nyb2xsID09PSAndmlzaWJsZScgJiYgKHlfc2Nyb2xsID09PSAnaGlkZGVuJyB8fCB5X3Njcm9sbCA9PT0gJ3Njcm9sbCcgfHwgeV9zY3JvbGwgPT09ICdhdXRvJykpXG4gICAgICAgICAgICB4X3Njcm9sbCA9ICdhdXRvJztcblxuICAgICAgICAvLyBJZiBvdmVyZmxvdy14IGlzIGhpZGRlbiwgc2Nyb2xsLCBvciBhdXRvIGFuZCB0aGUgb3ZlcmZsb3cteSBwcm9wZXJ0eSBpcyB2aXNpYmxlIChkZWZhdWx0KSwgdGhlIHZhbHVlIHdpbGwgYmUgaW1wbGljaXRseSBjb21wdXRlZCBhcyBhdXRvLlxuICAgICAgICBpZiAoeV9zY3JvbGwgPT09ICd2aXNpYmxlJyAmJiAoeF9zY3JvbGwgPT09ICdoaWRkZW4nIHx8IHhfc2Nyb2xsID09PSAnc2Nyb2xsJyB8fCB4X3Njcm9sbCA9PT0gJ2F1dG8nKSlcbiAgICAgICAgICAgIHlfc2Nyb2xsID0gJ2F1dG8nO1xuXG4gICAgICAgIC8vIHNldHRpbmcgb3ZlcmZsb3cgdG8gY2xpcCBpbiBvbmUgZGlyZWN0aW9uIHdoZW4gaXQgaXNuJ3Qgc2V0IHRvIHZpc2libGUgb3IgY2xpcCBpbiB0aGUgb3RoZXIgZGlyZWN0aW9uIHJlc3VsdHMgaW4gdGhlIGNsaXAgdmFsdWUgYmVoYXZpbmcgYXMgaGlkZGVuLiBcbiAgICAgICAgaWYgKHhfc2Nyb2xsID09PSAnY2xpcCcgJiYgeV9zY3JvbGwgIT09ICd2aXNpYmxlJyAmJiB5X3Njcm9sbCAhPT0gJ2NsaXAnKVxuICAgICAgICAgICAgeF9zY3JvbGwgPSAnaGlkZGVuJztcbiAgICAgICAgaWYgKHlfc2Nyb2xsID09PSAnY2xpcCcgJiYgeF9zY3JvbGwgIT09ICd2aXNpYmxlJyAmJiB4X3Njcm9sbCAhPT0gJ2NsaXAnKVxuICAgICAgICAgICAgeV9zY3JvbGwgPSAnaGlkZGVuJztcblxuICAgICAgICAvLyBub3Qgc2Nyb2xsYWJsZTogbm8gc2Nyb2xsIGJhcnNcbiAgICAgICAgaWYgKCh4X3Njcm9sbCA9PT0gJ3Zpc2libGUnIHx8IHhfc2Nyb2xsID09PSAnaGlkZGVuJyB8fCB4X3Njcm9sbCA9PT0gJ2NsaXAnKVxuICAgICAgICAgICAgJiYgKHlfc2Nyb2xsID09PSAndmlzaWJsZScgfHwgeV9zY3JvbGwgPT09ICdoaWRkZW4nIHx8IHlfc2Nyb2xsID09PSAnY2xpcCcpKVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIC8vIGZhbHNlIGlmIHRoZSBvdmVyYWxsIHNjcm9sbGFibGUgZWxlbWVudCAoY2xpZW50V2lkdGggKyBzY3JvbGxiYXJXaWR0aCBhbmQgY2xpZW50SGVpZ2h0ICsgc2Nyb2xsYmFySGVpZ2h0KSBpcyB0b28gc21hbGwgdG8gYmUgdmlzaWJsZSBvbiBzY3JlZW5cbiAgICAgICAgaWYgKE1hdGgubWF4KGVsZW0ub2Zmc2V0V2lkdGgsIGVsZW0ub2Zmc2V0SGVpZ2h0KSA8IDMwIHx8IE1hdGgubWluKGVsZW0ub2Zmc2V0V2lkdGgsIGVsZW0ub2Zmc2V0SGVpZ2h0KSA8IDE1KSAgXG4gICAgICAgICAgIHJldHVybiBmYWxzZTsgXG5cbiAgICAgICAgLy8gZmFsc2UgaWYgY29udGVudCBpcyBzbWFsbGVyIHRoYW4gdGhlIHNjcm9sbGFibGUgY29udGFpbmVyOiBib3RoIHggYW5kIHkgc2Nyb2xsIGRpc3RhbmNlcyA8IGVsZW1lbnQncyBob3Jpem9udGFsL3ZlcnRpY2FsIHBhZGRpbmdcbiAgICAgICAgY29uc3QgcGFkZGluZ194ID0gQ1NTVXRpbC5nZXRQaXhlbHNGcm9tU3R5bGUoc3R5bGVzLnBhZGRpbmdMZWZ0LCBlbGVtKSArIENTU1V0aWwuZ2V0UGl4ZWxzRnJvbVN0eWxlKHN0eWxlcy5wYWRkaW5nUmlnaHQsIGVsZW0pO1xuICAgICAgICBjb25zdCBwYWRkaW5nX3kgPSBDU1NVdGlsLmdldFBpeGVsc0Zyb21TdHlsZShzdHlsZXMucGFkZGluZ1RvcCwgZWxlbSkgKyBDU1NVdGlsLmdldFBpeGVsc0Zyb21TdHlsZShzdHlsZXMucGFkZGluZ0JvdHRvbSwgZWxlbSk7XG4gICAgICAgIGlmIChlbGVtLnNjcm9sbFdpZHRoIC0gIGVsZW0uY2xpZW50V2lkdGggPCAxICsgcGFkZGluZ194IFxuICAgICAgICAgICAgJiYgZWxlbS5zY3JvbGxIZWlnaHQgLSAgZWxlbS5jbGllbnRIZWlnaHQgPCAxKyBwYWRkaW5nX3kpXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxufSIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbmNvbnN0IF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0Y29uc3QgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdGNvbnN0IG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0aWYgKCEobW9kdWxlSWQgaW4gX193ZWJwYWNrX21vZHVsZXNfXykpIHtcblx0XHRkZWxldGUgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0XHRjb25zdCBlID0gbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIiArIG1vZHVsZUlkICsgXCInXCIpO1xuXHRcdGUuY29kZSA9ICdNT0RVTEVfTk9UX0ZPVU5EJztcblx0XHR0aHJvdyBlO1xuXHR9XG5cdF9fd2VicGFja19tb2R1bGVzX19bbW9kdWxlSWRdLmNhbGwobW9kdWxlLmV4cG9ydHMsIG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pO1xuXG5cdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG5cdHJldHVybiBtb2R1bGUuZXhwb3J0cztcbn1cblxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuICAgICBDb3B5cmlnaHQ6OiAyMDIwLSBJQk0sIEluY1xuXG4gICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5leHBvcnQgeyBDb250ZXh0IH0gZnJvbSBcIi4vdjIvY29tbW9uL0NvbnRleHRcIlxuLy8gaW1wb3J0IHsgU2ltdWxhdG9yIH0gZnJvbSBcIi4vdjIvc2ltdWxhdG9yXCJcbmltcG9ydCB7IENoZWNrZXIgfSBmcm9tIFwiLi92NC9jaGVja2VyL0NoZWNrZXJcIlxuZXhwb3J0IHsgQ2hlY2tlciB9XG5leHBvcnQgeyBBUklBTWFwcGVyIH0gZnJvbSBcIi4vdjIvYXJpYS9BUklBTWFwcGVyXCI7XG5leHBvcnQgeyBDb25maWcgfSBmcm9tIFwiLi92Mi9jb25maWcvQ29uZmlnXCI7XG5leHBvcnQgeyBET01XYWxrZXIgfSBmcm9tIFwiLi92Mi9kb20vRE9NV2Fsa2VyXCI7XG5leHBvcnQgeyBTUkNvbnRyb2xsZXIgfSBmcm9tIFwiLi92NC9zaW11bGF0b3IvU1JDb250cm9sbGVyXCI7XG5leHBvcnQgeyBTUkN1cnNvciB9IGZyb20gXCIuL3Y0L3NpbXVsYXRvci9TUkN1cnNvclwiO1xuZXhwb3J0IHsgU1JWaWV3ZXIgfSBmcm9tIFwiLi92NC9zaW11bGF0b3IvU1JWaWV3ZXJcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrRGVtbyh0aW1lb3V0PzogbnVtYmVyKSB7XG4gICAgaWYgKCF0aW1lb3V0KSB0aW1lb3V0ID0gMDtcbiAgICBsZXQgY2hlY2tlciA9IG5ldyBDaGVja2VyKCk7XG4gICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgY2hlY2tlci5jaGVjayhkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIFtcIklCTV9BY2Nlc3NpYmlsaXR5XCIsIFwiSUJNX0Rlc2lnblwiXSlcbiAgICAgICAgLnRoZW4oZnVuY3Rpb24ocmVwb3J0KSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhyZXBvcnQpO1xuICAgICAgICAgICAgY29uc3QgdmFscyA9IHtcbiAgICAgICAgICAgICAgICBcIkZBSUxcIjogMCxcbiAgICAgICAgICAgICAgICBcIlBPVEVOVElBTFwiOiAxLFxuICAgICAgICAgICAgICAgIFwiTUFOVUFMXCI6IDIsXG4gICAgICAgICAgICAgICAgXCJQQVNTXCI6IDNcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IGlkeD0wOyBpZHg8cmVwb3J0LnJlc3VsdHMubGVuZ3RoOyArK2lkeCkge1xuICAgICAgICAgICAgICAgIGlmIChyZXBvcnQucmVzdWx0c1tpZHhdLnZhbHVlWzFdID09PSBcIlBBU1NcIikge1xuICAgICAgICAgICAgICAgICAgICByZXBvcnQucmVzdWx0cy5zcGxpY2UoaWR4LS0sMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVwb3J0LnJlc3VsdHMuc29ydCgoYSxiKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGEuY2F0ZWdvcnkgIT0gYi5jYXRlZ29yeSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYS5jYXRlZ29yeS5sb2NhbGVDb21wYXJlKGIuY2F0ZWdvcnkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoYS5wYXRoW1wiYXJpYVwiXSA9PT0gYi5wYXRoW1wiYXJpYVwiXSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsc1thLnZhbHVlWzFdXS12YWxzW2IudmFsdWVbMV1dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gYS5wYXRoW1wiYXJpYVwiXS5sb2NhbGVDb21wYXJlKGIucGF0aFtcImFyaWFcIl0pO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIGxldCBsYXN0UGF0aCA9IG51bGw7XG4gICAgICAgICAgICBsZXQgY2F0ZWdvcnkgPSBudWxsO1xuICAgICAgICAgICAgZm9yIChjb25zdCByZXN1bHQgb2YgcmVwb3J0LnJlc3VsdHMpIHtcbiAgICAgICAgICAgICAgICBpZiAoY2F0ZWdvcnkgIT09IHJlc3VsdC5jYXRlZ29yeSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2F0ZWdvcnkgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RQYXRoID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeSA9IHJlc3VsdC5jYXRlZ29yeTtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5ncm91cChyZXN1bHQuY2F0ZWdvcnkpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQucGF0aFtcImFyaWFcIl0gIT0gbGFzdFBhdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3RQYXRoICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmdyb3VwRW5kKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGFzdFBhdGggPSByZXN1bHQucGF0aFtcImFyaWFcIl07XG4gICAgICAgICAgICAgICAgICAgIGlmIChsYXN0UGF0aCA9PT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5ncm91cChcInBhZ2VcIik7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmdyb3VwKGxhc3RQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhyZXN1bHQudmFsdWUsIHJlc3VsdC5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZ3JvdXBFbmQoKTtcbiAgICAgICAgfSk7XG4gICAgfSwgdGltZW91dCk7XG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0= +(function(window) { + window.ace_ibma = ace; +})(typeof window === 'object' ? window : this); \ No newline at end of file diff --git a/rule-server/src/static/archives/2026.07.13/js/ace-window.js b/rule-server/src/static/archives/2026.07.13/js/ace-window.js new file mode 100644 index 000000000..6cc706713 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/js/ace-window.js @@ -0,0 +1,5 @@ +/*! For license information please see ace.js.LICENSE.txt */ +var ace;(()=>{"use strict";var e={9910(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.ARIADefinitions=void 0;var i=function(){function e(){}return e.nameFromContent=function(t){return t in e.designPatterns&&e.designPatterns[t].nameFrom&&e.designPatterns[t].nameFrom.includes("contents")},e.globalProperties=["aria-atomic","aria-busy","aria-controls","aria-current","aria-describedby","aria-details","aria-flowto","aria-hidden","aria-keyshortcuts","aria-label","aria-labelledby","aria-live","aria-owns","aria-relevant","aria-roledescription","aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"],e.referenceProperties=["aria-owns","aria-controls","aria-describedby","aria-labelledby","aria-flowto","aria-activedescendant"],e.globalDeprecatedRoles=["directory","doc-biblioentry","doc-endnote"],e.globalDeprecatedProperties=["aria-grabbed","aria-dropeffect"],e.propertyDataTypes={"aria-activedescendant":{type:"http://www.w3.org/2001/XMLSchema#idref",hiddenIDRefSupported:!0},"aria-atomic":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-autocomplete":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["inline","list","both","none","undefined"]},"aria-busy":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-checked":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","mixed","undefined"]},"aria-colcount":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-colindex":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-colspan":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-controls":{type:"http://www.w3.org/2001/XMLSchema#idrefs",hiddenIDRefSupported:!0},"aria-current":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["page","step","location","date","time","true","false","undefined"]},"aria-describedby":{type:"http://www.w3.org/2001/XMLSchema#idrefs",hiddenIDRefSupported:!0},"aria-details":{type:"http://www.w3.org/2001/XMLSchema#idrefs"},"aria-disabled":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-dropeffect":{type:"http://www.w3.org/2001/XMLSchema#nmtokens",values:["copy","move","link","execute","popup","none"]},"aria-errormessage":{type:"http://www.w3.org/2001/XMLSchema#idref",hiddenIDRefSupported:!0},"aria-expanded":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","undefined"]},"aria-flowto":{type:"http://www.w3.org/2001/XMLSchema#idrefs",hiddenIDRefSupported:!1},"aria-grabbed":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","undefined"]},"aria-haspopup":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","menu","listbox","tree","grid","dialog"]},"aria-hidden":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","undefined"]},"aria-invalid":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","spelling","grammar","undefined"]},"aria-keyshortcuts":{type:"http://www.w3.org/2001/XMLSchema#string"},"aria-label":{type:"http://www.w3.org/2001/XMLSchema#string"},"aria-labelledby":{type:"http://www.w3.org/2001/XMLSchema#idrefs",hiddenIDRefSupported:!0},"aria-level":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-live":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["off","polite","assertive"]},"aria-modal":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-multiline":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-multiselectable":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-orientation":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["horizontal","vertical","undefined"]},"aria-owns":{type:"http://www.w3.org/2001/XMLSchema#idrefs",hiddenIDRefSupported:!0},"aria-placeholder":{type:"http://www.w3.org/2001/XMLSchema#string"},"aria-posinset":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-pressed":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","mixed","undefined"]},"aria-readonly":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-relevant":{type:"http://www.w3.org/2001/XMLSchema#nmtokens",values:["additions","removals","text","all"]},"aria-required":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-roledescription":{type:"http://www.w3.org/2001/XMLSchema#string"},"aria-rowcount":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-rowindex":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-rowspan":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-selected":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","undefined"]},"aria-setsize":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-sort":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["ascending","descending","other","none"]},"aria-valuemax":{type:"http://www.w3.org/2001/XMLSchema#decimal"},"aria-valuemin":{type:"http://www.w3.org/2001/XMLSchema#decimal"},"aria-valuenow":{type:"http://www.w3.org/2001/XMLSchema#decimal"},"aria-valuetext":{type:"http://www.w3.org/2001/XMLSchema#string"}},e.designPatterns={alert:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"liveRegion",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},alertdialog:{container:null,props:["aria-modal"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"window",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},application:{container:null,props:["aria-activedescendant","aria-expanded"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!0,nameFrom:["author"]},article:{container:null,props:["aria-posinset","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},banner:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},blockquote:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},button:{container:null,props:["aria-expanded","aria-pressed"],reqProps:null,reqChildren:null,htmlEquiv:"button | input[@type='button']",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-invalid"]},caption:{container:["figure","grid","table","treegrid"],props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},cell:{container:["row"],props:["aria-colindex","aria-colspan","aria-rowindex","aria-rowspan"],reqProps:null,reqChildren:null,htmlEquiv:"td",roleType:"structure",nameFrom:["author","contents"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},checkbox:{container:null,props:["aria-expanded","aria-readonly","aria-required"],reqProps:["aria-checked"],reqChildren:null,htmlEquiv:"input[@type='checkbox']",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-haspopup"]},code:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},columnheader:{container:["row"],props:["aria-colindex","aria-colspan","aria-expanded","aria-readonly","aria-required","aria-rowindex","aria-rowspan","aria-selected","aria-sort"],reqProps:null,reqChildren:null,htmlEquiv:"th[@scope='col']",roleType:"structure",nameRequired:!0,nameFrom:["author","contents"]},combobox:{container:null,props:["aria-controls","aria-activedescendant","aria-autocomplete","aria-readonly","aria-required"],reqProps:["aria-expanded"],reqChildren:[],htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"]},complementary:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},comment:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author","contents"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},contentinfo:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},definition:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},deletion:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},dialog:{container:null,props:["aria-modal"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"window",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},directory:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecated:!0,deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},"doc-abstract":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-acknowledgments":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-afterword":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-appendix":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-backlink":{container:null,props:["aria-disabled","aria-expanded","aria-haspopup"],reqProps:null,reqChildren:null,htmlEquiv:"a | link",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"]},"doc-biblioentry":{container:["list"],props:["aria-level","aria-posinset","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:"li",roleType:"structure",nameRequired:!0,nameFrom:["author"]},"doc-bibliography":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-biblioref":{container:null,props:["aria-disabled","aria-expanded","aria-haspopup"],reqProps:null,reqChildren:null,htmlEquiv:"a | link",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"]},"doc-chapter":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-colophon":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!0,nameFrom:["author"]},"doc-conclusion":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-cover":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"img",roleType:"structure",nameRequired:!1,nameFrom:["author"],presentationalChildren:!0},"doc-credit":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-credits":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-dedication":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-endnote":{container:["list"],props:["aria-level","aria-posinset","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:"li",roleType:"structure",nameRequired:!1,nameFrom:["author"]},"doc-endnotes":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!0,nameFrom:["author"]},"doc-epigraph":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-epilogue":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-errata":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-example":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-footnote":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-foreword":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-glossary":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-glossref":{container:null,props:["aria-disabled","aria-expanded","aria-haspopup"],reqProps:null,reqChildren:null,htmlEquiv:"a | link",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"]},"doc-index":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-introduction":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-noteref":{container:null,props:["aria-disabled","aria-expanded","aria-haspopup"],reqProps:null,reqChildren:null,htmlEquiv:"a | link",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"]},"doc-notice":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author"]},"doc-pagebreak":{container:null,props:["aria-orientation"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0},"doc-pagelist":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-pagefooter":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"]},"doc-pageheader":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"]},"doc-part":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-preface":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-prologue":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-pullquote":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author"]},"doc-qna":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-subtitle":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author","contents"]},"doc-tip":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author"]},"doc-toc":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},document:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},emphasis:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},feed:{container:null,props:null,reqProps:null,reqChildren:["article"],htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},figure:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},form:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"form",roleType:"landmark",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},generic:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"div | span",roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby","aria-roledescription"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},"graphics-document":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,nameRequired:!0,nameFrom:["author"]},"graphics-object":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,nameRequired:!1,nameFrom:["author"]},"graphics-symbol":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,nameRequired:!0,nameFrom:["author"],presentationalChildren:!0},grid:{container:null,props:["aria-activedescendant","aria-colcount","aria-multiselectable","aria-readonly","aria-rowcount"],reqProps:null,reqChildren:["row","rowgroup"],htmlEquiv:"table",roleType:"widget",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},gridcell:{container:["row"],props:["aria-colindex","aria-colspan","aria-disabled","aria-errormessage","aria-expanded","aria-haspopup","aria-invalid","aria-readonly","aria-required","aria-rowindex","aria-rowspan","aria-selected"],reqProps:null,reqChildren:null,htmlEquiv:"td",roleType:"widget",nameFrom:["author","contents"]},group:{container:null,props:["aria-activedescendant"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},heading:{container:null,props:null,reqProps:["aria-level"],reqChildren:null,htmlEquiv:"h1 | h2 | h3 | h4 | h5 | h6",roleType:"structure",nameRequired:!0,nameFrom:["author","contents"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},img:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"img",roleType:"structure",nameRequired:!0,nameFrom:["author"],presentationalChildren:!0,deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},image:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"img",roleType:"structure",nameRequired:!0,nameFrom:["author"],presentationalChildren:!0,deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},insertion:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},link:{container:null,props:["aria-expanded"],reqProps:null,reqChildren:null,htmlEquiv:"a | link",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],deprecatedProps:["aria-errormessage","aria-invalid"]},list:{container:null,props:null,reqProps:null,reqChildren:["listitem"],htmlEquiv:"ol | ul",roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},listbox:{container:null,props:["aria-activedescendant","aria-expanded","aria-multiselectable","aria-orientation","aria-readonly","aria-required"],reqProps:null,reqChildren:["group","option"],htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-haspopup"]},listitem:{container:["list"],props:["aria-level","aria-posinset","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:"li",roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},log:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"liveRegion",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},main:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},mark:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"mark",roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},marquee:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"liveRegion",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},math:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],presentationalChildren:!1,deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},menu:{container:null,props:["aria-activedescendant","aria-orientation"],reqProps:null,reqChildren:["group","menuitem","menuitemcheckbox","menuitemradio"],htmlEquiv:null,roleType:"widget",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},menubar:{container:null,props:["aria-activedescendant","aria-orientation"],reqProps:null,reqChildren:["group","menuitem","menuitemcheckbox","menuitemradio"],htmlEquiv:null,roleType:"widget",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},menuitem:{container:["group","menu","menubar"],props:["aria-expanded","aria-posinset","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],deprecatedProps:["aria-errormessage","aria-invalid"]},menuitemcheckbox:{container:["group","menu","menubar"],props:["aria-expanded","aria-posinset","aria-setsize"],reqProps:["aria-checked"],reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-invalid"]},menuitemradio:{container:["group","menu","menubar"],props:["aria-expanded","aria-posinset","aria-setsize"],reqProps:["aria-checked"],reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-invalid"]},meter:{container:null,props:["aria-valuemax","aria-valuemin","aria-valuetext"],reqProps:["aria-valuenow"],reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!0,nameFrom:["author"],presentationalChildren:!0,deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},navigation:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},none:{container:null,props:[],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},note:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},option:{container:["group","listbox"],props:["aria-selected","aria-checked","aria-posinset","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:"option",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},paragraph:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},presentation:{container:null,props:[],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},progressbar:{container:null,props:["aria-valuemax","aria-valuemin","aria-valuenow","aria-valuetext"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],presentationalChildren:!0,deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},radio:{container:null,props:["aria-posinset","aria-setsize"],reqProps:["aria-checked"],reqChildren:null,htmlEquiv:"input[@type='radio']",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},radiogroup:{container:null,props:["aria-activedescendant","aria-orientation","aria-readonly","aria-required"],reqProps:null,reqChildren:["radio"],htmlEquiv:null,roleType:"widget",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-haspopup"]},region:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},row:{container:["grid","rowgroup","table","treegrid"],props:["aria-activedescendant","aria-colindex","aria-expanded","aria-level","aria-posinset","aria-rowindex","aria-selected","aria-setsize"],reqProps:null,reqChildren:["cell","columnheader","gridcell","rowheader"],htmlEquiv:"tr",roleType:"structure",nameFrom:["author","contents"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},rowgroup:{container:["grid","table","treegrid"],props:[],reqProps:null,reqChildren:["row"],htmlEquiv:"tbody | tfoot | thead",roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},rowheader:{container:["row"],props:["aria-colindex","aria-colspan","aria-expanded","aria-readonly","aria-required","aria-rowindex","aria-rowspan","aria-selected","aria-sort"],reqProps:null,reqChildren:null,htmlEquiv:"th[@scope='row']",roleType:"structure",nameRequired:!0,nameFrom:["author","contents"]},scrollbar:{container:null,props:["aria-orientation","aria-valuemax","aria-valuemin","aria-valuetext"],reqProps:["aria-controls","aria-valuenow"],reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!1,nameFrom:["author"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},search:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},searchbox:{container:null,props:["aria-activedescendant","aria-autocomplete","aria-multiline","aria-placeholder","aria-readonly","aria-required"],reqProps:null,reqChildren:null,htmlEquiv:"input[@type='search']",roleType:"widget",nameRequired:!0,nameFrom:["author"]},separator:{container:null,props:["aria-orientation"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},slider:{container:null,props:["aria-orientation","aria-readonly","aria-valuemax","aria-valuemin","aria-valuetext"],reqProps:["aria-valuenow"],reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],presentationalChildren:!0},spinbutton:{container:null,props:["aria-activedescendant","aria-readonly","aria-required","aria-valuemax","aria-valuemin","aria-valuenow","aria-valuetext"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-haspopup"]},status:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"liveRegion",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},strong:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},subscript:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},suggestion:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},superscript:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},switch:{container:null,props:["aria-expanded","aria-readonly","aria-required"],reqProps:["aria-checked"],reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-haspopup"]},tab:{container:["tablist"],props:["aria-expanded","aria-posinset","aria-selected","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-invalid"]},table:{container:null,props:["aria-colcount","aria-rowcount"],reqProps:null,reqChildren:["row","rowgroup","caption"],htmlEquiv:"table",roleType:"structure",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},tablist:{container:null,props:["aria-activedescendant","aria-multiselectable","aria-orientation"],reqProps:null,reqChildren:["tab"],htmlEquiv:null,roleType:"widget",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},tabpanel:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},term:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"dfn",roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},textbox:{container:null,props:["aria-activedescendant","aria-autocomplete","aria-multiline","aria-placeholder","aria-readonly","aria-required"],reqProps:null,reqChildren:null,htmlEquiv:"input[@type='text']",roleType:"widget",nameRequired:!0,nameFrom:["author"]},time:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},timer:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"liveRegion",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},toolbar:{container:null,props:["aria-activedescendant","aria-orientation"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},tooltip:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author","contents"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},tree:{container:null,props:["aria-activedescendant","aria-multiselectable","aria-orientation","aria-required"],reqProps:null,reqChildren:["group","treeitem"],htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-haspopup"]},treegrid:{container:null,props:["aria-activedescendant","aria-colcount","aria-multiselectable","aria-orientation","aria-readonly","aria-required","aria-rowcount"],reqProps:null,reqChildren:["row","rowgroup"],htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-haspopup"]},treeitem:{container:["group","tree"],props:["aria-checked","aria-expanded","aria-level","aria-posinset","aria-selected","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],deprecatedProps:["aria-errormessage","aria-invalid"]}},e.elementsAllowedDisabled=["button","input","select","textarea","optgroup","option","fieldset"],e.elementsAllowedRequired=["select","textarea"],e.elementsAllowedReadOnly=["textarea"],e.documentConformanceRequirement={abbr:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},address:{implicitRole:["group"],validRoles:["any"],globalAriaAttributesValid:!0},article:{implicitRole:["article"],validRoles:["application","document","feed","main","none","presentation","region"],globalAriaAttributesValid:!0},aside:{implicitRole:["complementary"],validRoles:["doc-dedication","doc-example","doc-footnote","doc-glossary","doc-pullquote","doc-tip","feed","none","note","presentation","region","search"],globalAriaAttributesValid:!0},audio:{implicitRole:null,validRoles:["application"],globalAriaAttributesValid:!0},b:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},base:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},bdi:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},bdo:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},blockquote:{implicitRole:["blockquote"],validRoles:["any"],globalAriaAttributesValid:!0},body:{implicitRole:["generic"],validRoles:null,otherDisallowedAriaAttributes:["aria-hidden"],globalAriaAttributesValid:!0},br:{implicitRole:null,validRoles:["none","presentation"],globalAriaAttributesValid:!1,otherAllowedAriaAttributes:["aria-hidden"]},button:{implicitRole:["button"],validRoles:["checkbox","combobox","gridcell","link","menuitem","menuitemcheckbox","menuitemradio","option","radio","separator","slider","switch","tab","treeitem"],globalAriaAttributesValid:!0},canvas:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0},caption:{implicitRole:["caption"],validRoles:null,globalAriaAttributesValid:!0,allowAttributesFromImplicitRole:!1},cite:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},code:{implicitRole:["code"],validRoles:["any"],globalAriaAttributesValid:!0},col:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},colgroup:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},data:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},datalist:{implicitRole:["listbox"],validRoles:null,globalAriaAttributesValid:!1,allowAttributesFromImplicitRole:!1},dd:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0},del:{implicitRole:["deletion"],validRoles:["any"],globalAriaAttributesValid:!0},details:{implicitRole:["group"],validRoles:null,globalAriaAttributesValid:!0},dfn:{implicitRole:["term"],validRoles:["any"],globalAriaAttributesValid:!0},dialog:{implicitRole:["dialog"],validRoles:["alertdialog"],globalAriaAttributesValid:!0},dl:{implicitRole:null,validRoles:["group","list","none","presentation"],globalAriaAttributesValid:!0},dt:{implicitRole:["term"],validRoles:["listitem"],globalAriaAttributesValid:!0},em:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0},embed:{implicitRole:null,validRoles:["application","document","img","none","presentation"],globalAriaAttributesValid:!0},fieldset:{implicitRole:["group"],validRoles:["none","presentation","radiogroup"],globalAriaAttributesValid:!0},figcaption:{implicitRole:null,validRoles:["group","none","presentation"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},form:{implicitRole:["form"],validRoles:["none","presentation","search"],globalAriaAttributesValid:!0},head:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},hgroup:{implicitRole:["group"],validRoles:["any"],globalAriaAttributesValid:!0},h1:{implicitRole:["heading"],validRoles:["doc-subtitle","none","presentation","tab"],globalAriaAttributesValid:!0},h2:{implicitRole:["heading"],validRoles:["doc-subtitle","none","presentation","tab"],globalAriaAttributesValid:!0},h3:{implicitRole:["heading"],validRoles:["doc-subtitle","none","presentation","tab"],globalAriaAttributesValid:!0},h4:{implicitRole:["heading"],validRoles:["doc-subtitle","none","presentation","tab"],globalAriaAttributesValid:!0},h5:{implicitRole:["heading"],validRoles:["doc-subtitle","none","presentation","tab"],globalAriaAttributesValid:!0},h6:{implicitRole:["heading"],validRoles:["doc-subtitle","none","presentation","tab"],globalAriaAttributesValid:!0},hr:{implicitRole:["separator"],validRoles:["doc-pagebreak","none","presentation"],globalAriaAttributesValid:!0},html:{implicitRole:["document"],validRoles:null,globalAriaAttributesValid:!1,allowAttributesFromImplicitRole:!1},i:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},iframe:{implicitRole:null,validRoles:["application","document","img","none","presentation"],globalAriaAttributesValid:!0},ins:{implicitRole:["insertion"],validRoles:["any"],globalAriaAttributesValid:!0},kbd:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},label:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},legend:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},link:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},main:{implicitRole:["main"],validRoles:null,globalAriaAttributesValid:!0},map:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},mark:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},math:{implicitRole:["math"],validRoles:null,globalAriaAttributesValid:!0},menu:{implicitRole:["list"],validRoles:["group","listbox","menu","menubar","none","presentation","radiogroup","tablist","toolbar","tree"],globalAriaAttributesValid:!0},meta:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},meter:{implicitRole:["meter"],validRoles:null,globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-valuemax","aria-valuemin"],allowAttributesFromImplicitRole:!1},nav:{implicitRole:["navigation"],validRoles:["doc-index","doc-pagelist","doc-toc","menu","menubar","tablist","none","presentation"],globalAriaAttributesValid:!0},noscript:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},object:{implicitRole:null,validRoles:["application","document","img"],globalAriaAttributesValid:!0},ol:{implicitRole:["list"],validRoles:["group","listbox","menu","menubar","none","presentation","radiogroup","tablist","toolbar","tree"],globalAriaAttributesValid:!0},optgroup:{implicitRole:["group"],validRoles:null,globalAriaAttributesValid:!0},option:{implicitRole:["option"],validRoles:null,globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-selected"]},output:{implicitRole:["status"],validRoles:["any"],globalAriaAttributesValid:!0},p:{implicitRole:["paragraph"],validRoles:["any"],globalAriaAttributesValid:!0},param:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},picture:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1,otherAllowedAriaAttributes:["aria-hidden"]},pre:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},progress:{implicitRole:["progressbar"],validRoles:null,globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-valuemax"]},q:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},rp:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0},rt:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},ruby:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0},s:{implicitRole:["deletion"],validRoles:["any"],globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-label","aria-labelledby"]},samp:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},script:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},search:{implicitRole:["search"],validRoles:["search","form","group","none","presentation","region"],globalAriaAttributesValid:!0},slot:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},small:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},source:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},span:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},strong:{implicitRole:["strong"],validRoles:["any"],globalAriaAttributesValid:!0},style:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},sub:{implicitRole:["subscript"],validRoles:["any"],globalAriaAttributesValid:!0},sup:{implicitRole:["superscript"],validRoles:["any"],globalAriaAttributesValid:!0},svg:{implicitRole:["graphics-document"],validRoles:["any"],globalAriaAttributesValid:!0},table:{implicitRole:["table"],validRoles:["any"],globalAriaAttributesValid:!0},template:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},textarea:{implicitRole:["textbox"],validRoles:null,globalAriaAttributesValid:!0},tfoot:{implicitRole:["rowgroup"],validRoles:["any"],globalAriaAttributesValid:!0},thead:{implicitRole:["rowgroup"],validRoles:["any"],globalAriaAttributesValid:!0},time:{implicitRole:["time"],validRoles:["any"],globalAriaAttributesValid:!0},title:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},track:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},u:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},ul:{implicitRole:["list"],validRoles:["group","listbox","menu","menubar","none","presentation","radiogroup","tablist","toolbar","tree"],globalAriaAttributesValid:!0},var:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},video:{implicitRole:null,validRoles:["application"],globalAriaAttributesValid:!0},wbr:{implicitRole:null,validRoles:["none","presentation"],globalAriaAttributesValid:!1,otherAllowedAriaAttributes:["aria-hidden"]}},e.documentConformanceRequirementSpecialTags={a:{"with-href":{implicitRole:["link"],validRoles:["button","checkbox","doc-backlink","doc-biblioref","doc-glossref","doc-noteref","menuitem","menuitemcheckbox","menuitemradio","option","radio","switch","tab","treeitem"],globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-disabled=true"]},"without-href":{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0}},area:{"with-href":{implicitRole:["link"],validRoles:null,globalAriaAttributesValid:!0},"without-href":{implicitRole:["generic"],validRoles:["button","link"],globalAriaAttributesValid:!0}},div:{"child-dl":{implicitRole:["generic"],validRoles:["presentation","none"],globalAriaAttributesValid:!0},"no-child-dl":{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0}},figure:{"child-figcaption":{implicitRole:["figure"],validRoles:["doc-example"],globalAriaAttributesValid:!0},"no-child-figcaption":{implicitRole:["figure"],validRoles:["any"],globalAriaAttributesValid:!0}},footer:{"des-section-article-aside-main-nav":{implicitRole:["generic"],validRoles:["doc-footnote","group","none","presentation"],globalAriaAttributesValid:!0},other:{implicitRole:["contentinfo"],validRoles:["doc-footnote","group","none","presentation"],globalAriaAttributesValid:!0}},header:{"des-section-article-aside-main-nav":{implicitRole:["generic"],validRoles:["group","none","presentation"],globalAriaAttributesValid:!0},other:{implicitRole:["banner"],validRoles:["group","none","presentation"],globalAriaAttributesValid:!0}},img:{"img-with-accname":{implicitRole:["img"],validRoles:["button","checkbox","doc-cover","link","menuitem","menuitemcheckbox","menuitemradio","meter","option","progressbar","radio","scrollbar","separator","slider","switch","tab","treeitem"],globalAriaAttributesValid:!0},"img-without-accname-empty-alt":{implicitRole:["presentation","none"],validRoles:null,globalAriaAttributesValid:!1,otherAllowedAriaAttributes:["aria-hidden=true"]},"img-without-accname-no-alt":{implicitRole:["img"],validRoles:["presentation","none"],globalAriaAttributesValid:!1,otherAllowedAriaAttributes:["aria-hidden=true"]}},input:{button:{implicitRole:["button"],validRoles:["checkbox","combobox","gridcell","link","menuitem","menuitemcheckbox","menuitemradio","option","radio","slider","switch","tab","treeitem"],globalAriaAttributesValid:!0},"checkbox-with-aria-pressed":{implicitRole:["checkbox"],validRoles:["menuitemcheckbox","option","switch","button"],globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-required"],otherDisallowedAriaAttributes:["aria-checked"]},"checkbox-without-aria-pressed":{implicitRole:["checkbox"],validRoles:["menuitemcheckbox","option","switch"],globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-required"],otherDisallowedAriaAttributes:["aria-checked"]},color:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0},date:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-required","aria-readonly"],otherRolesForAttributes:["textbox"]},"datetime-local":{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-required","aria-readonly"],otherRolesForAttributes:["textbox"]},"email-no-list":{implicitRole:["textbox"],validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"],otherRolesForAttributes:["textbox"]},"email-with-list":{implicitRole:["combobox"],validRoles:null,globalAriaAttributesValid:!0},file:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-required"]},hidden:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},image:{implicitRole:["button"],validRoles:["checkbox","gridcell","link","menuitem","menuitemcheckbox","menuitemradio","option","radio","slider","switch","tab","treeitem"],globalAriaAttributesValid:!0},month:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-readonly"],otherRolesForAttributes:["textbox"]},number:{implicitRole:["spinbutton"],validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"]},password:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"],otherRolesForAttributes:["textbox"]},radio:{implicitRole:["radio"],validRoles:["menuitemradio"],globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-required"],otherDisallowedAriaAttributes:["aria-checked"]},range:{implicitRole:["slider"],validRoles:null,globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-valuemax","aria-valuemin"]},reset:{implicitRole:["button"],validRoles:["checkbox","combobox","gridcell","link","menuitem","menuitemcheckbox","menuitemradio","option","radio","slider","switch","tab","treeitem"],globalAriaAttributesValid:!0},"search-no-list":{implicitRole:["searchbox"],validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"]},"search-with-list":{implicitRole:["combobox"],validRoles:null,globalAriaAttributesValid:!0},submit:{implicitRole:["button"],validRoles:["checkbox","combobox","gridcell","link","menuitem","menuitemcheckbox","menuitemradio","option","radio","slider","switch","tab","treeitem"],globalAriaAttributesValid:!0},"tel-no-list":{implicitRole:["textbox"],validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"]},"tel-with-list":{implicitRole:["combobox"],validRoles:null,globalAriaAttributesValid:!0},"text-no-list":{implicitRole:["textbox"],validRoles:["combobox","searchbox","spinbutton"],globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"]},"text-with-list":{implicitRole:["combobox"],validRoles:null,globalAriaAttributesValid:!0},time:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-readonly"],otherRolesForAttributes:["textbox"]},"url-no-list":{implicitRole:["textbox"],validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"]},"url-with-list":{implicitRole:["combobox"],validRoles:null,globalAriaAttributesValid:!0},week:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-readonly"],otherRolesForAttributes:["textbox"]},"default-with-list":{implicitRole:["combobox"],validRoles:null,globalAriaAttributesValid:!0},"default-no-list":{implicitRole:["textbox"],validRoles:null,globalAriaAttributesValid:!0}},li:{"child-of-list-role":{implicitRole:["listitem"],validRoles:null,globalAriaAttributesValid:!0},"no-child-of-list-role":{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0}},section:{"with-name":{implicitRole:["region"],validRoles:["alert","alertdialog","application","banner","complementary","contentinfo","dialog","doc-abstract","doc-acknowledgments","doc-afterword","doc-appendix","doc-bibliography","doc-chapter","doc-colophon","doc-conclusion","doc-credit","doc-credits","doc-dedication","doc-endnotes","doc-epigraph","doc-epilogue","doc-errata","doc-example","doc-foreword","doc-glossary","doc-index","doc-introduction","doc-notice","doc-pagelist","doc-part","doc-preface","doc-prologue","doc-pullquote","doc-qna","doc-toc","document","feed","group","log","main","marquee","navigation","none","note","presentation","search","status","tabpanel"],globalAriaAttributesValid:!0},"without-name":{implicitRole:null,validRoles:["alert","alertdialog","application","banner","complementary","contentinfo","dialog","doc-abstract","doc-acknowledgments","doc-afterword","doc-appendix","doc-bibliography","doc-chapter","doc-colophon","doc-conclusion","doc-credit","doc-credits","doc-dedication","doc-endnotes","doc-epigraph","doc-epilogue","doc-errata","doc-example","doc-foreword","doc-glossary","doc-index","doc-introduction","doc-notice","doc-pagelist","doc-part","doc-preface","doc-prologue","doc-pullquote","doc-qna","doc-toc","document","feed","group","log","main","marquee","navigation","none","note","presentation","search","status","tabpanel"],globalAriaAttributesValid:!0}},select:{"no-multiple-attr-size-gt1":{implicitRole:["combobox"],validRoles:["menu"],globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-multiselectable"]},"multiple-attr-size-gt1":{implicitRole:["listbox"],validRoles:null,globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-multiselectable"]}},summary:{"first-summary-of-detail":{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-disabled","aria-haspopup"]},"no-first-summary-of-detail":{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0}},tbody:{"des-table":{implicitRole:["rowgroup"],validRoles:["any"],globalAriaAttributesValid:!0},"des-grid":{implicitRole:["rowgroup"],validRoles:["any"],globalAriaAttributesValid:!0},"des-treegrid":{implicitRole:["rowgroup"],validRoles:["any"],globalAriaAttributesValid:!0},"des-other":{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0}},td:{"des-table":{implicitRole:["cell"],validRoles:null,globalAriaAttributesValid:!0},"des-grid":{implicitRole:["gridcell"],validRoles:null,globalAriaAttributesValid:!0},"des-treegrid":{implicitRole:["gridcell"],validRoles:null,globalAriaAttributesValid:!0},"des-other":{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0}},th:{"des-table-row-scope":{implicitRole:["rowheader","cell"],validRoles:null,globalAriaAttributesValid:!0},"des-table-column-scope":{implicitRole:["columnheader","cell"],validRoles:null,globalAriaAttributesValid:!0},"des-grid-treegrid-row-scope":{implicitRole:["rowheader","gridcell"],validRoles:null,globalAriaAttributesValid:!0},"des-grid-treegrid-column-scope":{implicitRole:["columnheader","gridcell"],validRoles:null,globalAriaAttributesValid:!0},"des-other":{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0}},tr:{"des-table":{implicitRole:["row"],validRoles:null,globalAriaAttributesValid:!0},"des-grid":{implicitRole:["row"],validRoles:null,globalAriaAttributesValid:!0},"des-treegrid":{implicitRole:["row"],validRoles:null,globalAriaAttributesValid:!0},"des-other":{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0}},default:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0}},e.relatedAriaHtmlAttributes={"aria-checked":{conflict:[{ariaAttributeValue:"false",htmlAttributeNames:["checked"],htmlAttributeValues:null}],overlapping:[{ariaAttributeValue:"true",htmlAttributeNames:["checked"],htmlAttributeValues:null}]},"aria-disabled":{conflict:[{ariaAttributeValue:"false",htmlAttributeNames:["disabled"],htmlAttributeValues:null}],overlapping:[{ariaAttributeValue:"true",htmlAttributeNames:["disabled"],htmlAttributeValues:null}]},"aria-hidden":{conflict:[{ariaAttributeValue:"false",htmlAttributeNames:["hidden"],htmlAttributeValues:["hidden,null"]},{ariaAttributeValue:"true",htmlAttributeNames:["hidden"],htmlAttributeValues:["until-found"]}],overlapping:[{ariaAttributeValue:"true",htmlAttributeNames:["hidden"],htmlAttributeValues:["hidden,null"]}]},"aria-placeholder":{conflict:[{ariaAttributeValue:null,htmlAttributeNames:["placeholder"],htmlAttributeValues:null}]},"aria-valuemax":{conflict:[{ariaAttributeValue:null,htmlAttributeNames:["max"],htmlAttributeValues:null}]},"aria-valuemin":{conflict:[{ariaAttributeValue:null,htmlAttributeNames:["min"],htmlAttributeValues:null}]},"aria-readonly":{conflict:[{ariaAttributeValue:"false",htmlAttributeNames:["readonly","contenteditable","iscontenteditable"],htmlAttributeValues:[null,"false","false"]}],overlapping:[{ariaAttributeValue:"true",htmlAttributeNames:["readonly","contenteditable","iscontenteditable"],htmlAttributeValues:[null,"true","true"]}]},"aria-required":{conflict:[{ariaAttributeValue:"false",htmlAttributeNames:["required"],htmlAttributeValues:null}],overlapping:[{ariaAttributeValue:"true",htmlAttributeNames:["required"],htmlAttributeValues:null}]},"aria-colspan":{conflict:[{ariaAttributeValue:"VALUE",htmlAttributeNames:["colspan"],htmlAttributeValues:["VALUE"]}],overlapping:[{ariaAttributeValue:null,htmlAttributeNames:["colspan"],htmlAttributeValues:null}]},"aria-rowspan":{conflict:[{ariaAttributeValue:"VALUE",htmlAttributeNames:["rowspan"],htmlAttributeValues:["VALUE"]}],overlapping:[{ariaAttributeValue:null,htmlAttributeNames:["rowspan"],htmlAttributeValues:null}]}},e.containers=[],e}();t.ARIADefinitions=i;var a=[];for(var n in i.designPatterns){var l=i.designPatterns[n].container;if(null!==l)for(var r=0,o=l;r<o.length;r++){var s=o[r];-1==a.indexOf(s)&&a.push(s)}}i.containers=a},9955(e,t,i){var a,n=this&&this.__extends||(a=function(e,t){return a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i])},a(e,t)},function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function i(){this.constructor=e}a(e,t),e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)});Object.defineProperty(t,"__esModule",{value:!0}),t.ARIAMapper=void 0;var l=i(9910),r=i(3103),o=i(1686),s=i(7139),u=i(7011),d=i(5279),c=i(1560),m=i(4566),p=i(3864),h=i(1950),g=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.childrenCanHaveRole=function(e,t){return!(t in l.ARIADefinitions.designPatterns&&l.ARIADefinitions.designPatterns[t].presentationalChildren)},t.prototype.getRole=function(e){return t.nodeToRole(e)},t.prototype.getNamespace=function(){return"aria"},t.prototype.getAttributes=function(e){var i={};if(1===e.nodeType){var a=m.CacheUtil.getCache(e,"ARIAMapper::getAttributes",void 0);if(void 0!==a)return a;for(var n=e,l=0;l<n.attributes.length;++l){var r=n.attributes[l],o=r.name.toLowerCase();o.startsWith("aria-")&&(i[o.substring(5)]=r.nodeValue)}var s=e.nodeName.toLowerCase();t.applyAttrRole(n,"global",i),t.applyAttrRole(n,s,i),m.CacheUtil.setCache(e,"ARIAMapper::getAttributes",i)}else if(3===e.nodeType){var u=t.textAttrValueCalculators;for(var d in u){var c=u[d](e);null!=c&&(i[d]=c)}}return i},t.applyAttrRole=function(e,i,a){var n=t.elemAttrValueCalculators;if(i in n)for(var l in n[i])if(!(l in a)){var r=n[i][l];null!=r&&("string"!=typeof r&&(r=r(e)),a[l]=r)}},t.getAriaOwnedBy=function(e){var t=d.FragmentUtil.getOwnerFragment(e);if(!m.CacheUtil.getCache(t,"ARIAMapper::precalcOwned",!1)){for(var i=t.querySelectorAll("[aria-owns]"),a=0;a<i.length;++a)for(var n=i[a],l=n.getAttribute("aria-owns").split(/ +/g),r=function(e){var i=t.getElementById(l[e]);if(i&&!o.DOMUtil.sameNode(n,i)){for(var a=[],r=i.querySelectorAll("[aria-owns]"),s=0;s<r.length;++s)for(var u=r[s].getAttribute("aria-owns").split(/ +/g),d=0;d<u.length;++d){var c=t.getElementById(u[d]);c&&a.push(c)}if(0===a.length)return m.CacheUtil.setCache(i,"aria-owned",n),"continue";for(var h=n,g=!1;null!==h;){if(a.some(function(e){return o.DOMUtil.sameNode(h,e)})){g=!0;break}h=p.DOMWalker.parentElement(h)}g||m.CacheUtil.setCache(i,"aria-owned",n)}},s=0;s<l.length;++s)r(s);m.CacheUtil.setCache(t,"ARIAMapper::precalcOwned",!0)}return m.CacheUtil.getCache(e,"aria-owned",null)},t.prototype.getNodeHierarchy=function(e){if(!e)return[];if(1!==e.nodeType){for(var i=(s=this.getNodeHierarchy(p.DOMWalker.parentElement(e))).length>0?s[s.length-1]:{role:"",rolePath:"",roleCount:{},childrenCanHaveRole:!0},a=[],n=0,l=s;n<l.length;n++){var r=l[n];a.push(r)}return a.push({attributes:{},bounds:this.getBounds(e),namespace:this.getNamespace(),node:e,role:this.getRole(e)||null,rolePath:i.rolePath+"/"+(this.getRole(e)||null),roleCount:{},childrenCanHaveRole:i.childrenCanHaveRole}),a}var o=e;if(!(a=m.CacheUtil.getCache(o,"ARIAMapper::getNodeHierarchy",null))){var s,u=t.getAriaOwnedBy(o);for(u||(u=p.DOMWalker.parentElement(o));u&&1!==u.nodeType;)u=p.DOMWalker.parentElement(o);for(i=(s=u?this.getNodeHierarchy(u):[]).length>0?s[s.length-1]:{role:"",rolePath:"",roleCount:{},childrenCanHaveRole:!0};null===i.role;)i=(s=(u=t.getAriaOwnedBy(u)||p.DOMWalker.parentElement(u))?this.getNodeHierarchy(u):[])[s.length-1];var d={attributes:1===o.nodeType?this.getAttributes(o):{},bounds:this.getBounds(o),namespace:this.getNamespace(),node:o,role:this.getRole(o)||null,rolePath:"",roleCount:{},childrenCanHaveRole:!0};i.childrenCanHaveRole?d.childrenCanHaveRole=i.childrenCanHaveRole&&this.childrenCanHaveRole(o,d.role):d.role=null,null!==d.role?(i.roleCount[d.role]=(i.roleCount[d.role]||0)+1,d.rolePath=i.rolePath+"/"+d.role+"["+i.roleCount[d.role]+"]"):d.rolePath=i.rolePath,a=[];for(var c=0,h=s;c<h.length;c++)r=h[c],a.push(r);a.push(d),m.CacheUtil.setCache(o,"ARIAMapper::getNodeHierarchy",a)}return a},t.prototype.reset=function(e){t.nameComputationId=0,this.hierarchyRole=[],this.hierarchyResults=[],this.hierarchyPath=[{rolePath:"",roleCount:{}}];for(var i,a=e;i=p.DOMWalker.parentNode(a);)a=i;var n=new c.ARIAWalker(a,!1,a);do{1===n.node.nodeType&&this.getNodeHierarchy(n.node)}while(n.nextNode())},t.prototype.openScope=function(e){null===this.hierarchyRole&&this.reset(e),this.pushHierarchy(e);for(var t=0;t<this.hierarchyResults.length;++t)this.hierarchyResults[t].role&&"/"===this.hierarchyResults[t].role[0]&&(this.hierarchyResults[t].role=this.hierarchyResults[t].role?this.hierarchyResults[t].role.substring(1):null);return this.hierarchyResults},t.prototype.pushHierarchy=function(e){var t,i=(t=this.getNodeHierarchy(e))[t.length-1];this.hierarchyRole.push(i.role),null!==i.role&&this.hierarchyPath.push(i),this.hierarchyResults=t},t.prototype.closeScope=function(e){for(var t=[],i=0,a=this.hierarchyResults;i<a.length;i++){var n=a[i];t.push(n)}if(t.length>0){t[t.length-1].role="/"+t[t.length-1].role;var l=p.DOMWalker.parentElement(e);this.hierarchyResults=l?m.CacheUtil.getCache(l,"ARIAMapper::getNodeInfo",[]):[]}return t},t.nodeToRole=function(e){if(3===e.nodeType)return"text";if(1!==e.nodeType)return null;var t=e;if(!t||1!==t.nodeType)return null;if(t.hasAttribute("role")&&t.getAttribute("role").trim().length>0)for(var i=0,a=t.getAttribute("role").trim().split(" ");i<a.length;i++){var n=a[i];if("presentation"===n||"none"===n){if(!s.CommonUtil.isFocusable(t))return null}else if(n in l.ARIADefinitions.designPatterns)return n}var r=u.AriaUtil.getImplicitRole(t),o=r&&0!==r.length?r[0]:null;return"presentation"===o||"none"===o?null:o},t.elemAttrValueCalculators={global:{name:function(e){var t;return null===(t=h.AccNameUtil.computeAccessibleName(e))||void 0===t?void 0:t.name}},datalist:{multiselectable:function(e){var t=e.getAttribute("id");return t&&t.length>0?(e.ownerDocument.querySelector("input[list='"+t+"']"),""+(e.getAttribute("multiple")&&("true"==e.getAttribute("multiple")||""==e.getAttribute("multiple")))):null}},h1:{level:"1"},h2:{level:"2"},h3:{level:"3"},h4:{level:"4"},h5:{level:"5"},h6:{level:"6"},input:{checked:function(e){var t=e.getAttribute("type");return"checkbox"===t||"radio"===t?""+e.checked:null},setsize:function(e){return null},posinset:function(e){return null},owns:function(e){return null}},keygen:{multiselectable:"false"},li:{setsize:function(e){var t=o.DOMUtil.getAncestor(e,["ol","ul","menu"]);if(!t)return null;var i=m.CacheUtil.getSetCache(t,"elemAttrValueCalculators::lis",function(){return t.querySelectorAll("li")}),a=m.CacheUtil.getSetCache(t,"elemAttrValueCalculators::otherlis",function(){return t.querySelectorAll("ol li, ul li, menu li")});return""+(i.length-a.length)},posinset:function(e){var t=o.DOMUtil.getAncestor(e,["ol","ul","menu"]);if(!t)return null;for(var i=m.CacheUtil.getSetCache(t,"elemAttrValueCalculators::lis",function(){return t.querySelectorAll("li")}),a=0,n=0;n<i.length;++n){var l=i[n];if(o.DOMUtil.sameNode(t,o.DOMUtil.getAncestor(l,["ol","ul","menu"])))return""+a;++a}return null}},menuitem:{checked:function(e){return""+!(!e.getAttribute("checked")||"true"!=e.getAttribute("checked")&&""!=e.getAttribute("checked"))}},option:{selected:function(e){return""+!(!e.getAttribute("selected")||"true"!=e.getAttribute("selected")&&""!=e.getAttribute("selected"))}},progress:{valuemax:function(e){return e.getAttribute("max")||"1"},valuemin:function(e){return"0"},valuenow:function(e){return e.getAttribute("value")}}},t.textAttrValueCalculators={name:function(e){return e.nodeValue}},t.nameComputationId=0,t}(r.CommonMapper);t.ARIAMapper=g},1560(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.ARIAWalker=void 0;var a=i(5279),n=i(9955),l=i(3946),r=i(3864),o=function(){function e(e,t,i){this.root=i||e,9===this.root.nodeType&&(this.root=this.root.documentElement),this.node=e,this.bEndTag=null!=t&&1==t}return e.prototype.atRoot=function(){return!this.ownerElement&&(this.root===this.node||(this.root.isSameNode?this.root.isSameNode(this.node):this.root.compareDocumentPosition?0===this.root.compareDocumentPosition(this.node):null===this.node.parentNode))},e.prototype.nextNode=function(){var e=!1;do{if(e=!1,this.bEndTag){if(this.atRoot())return!1;if(this.node.slotOwner){var t=this.node.slotOwner,i=this.node.slotIndex+1;i<t.assignedNodes().length?(this.node=t.assignedNodes()[i],this.bEndTag=!1):(this.node=t,this.bEndTag=!0)}else if(this.node.ownerElement)this.node=this.node.ownerElement,this.bEndTag=!0;else if(r.DOMWalker.nextSiblingNotOwnedBySlot(this.node))this.node=r.DOMWalker.nextSiblingNotOwnedBySlot(this.node),this.bEndTag=!1,e=!0;else{if(!this.node.parentNode)return!1;if(1===this.node.parentNode.nodeType&&this.node.parentNode.hasAttribute("aria-owns")){var o=this.node.parentNode.getAttribute("aria-owns").split(/ +/g);if(1===this.node.nodeType&&this.node.hasAttribute("id")){var s=o.indexOf(this.node.getAttribute("id"));s===o.length-1?(this.node=this.node.parentNode,this.bEndTag=!0):(this.node=a.FragmentUtil.getOwnerFragment(this.node).getElementById(o[s+1]),this.bEndTag=!1)}else this.node=a.FragmentUtil.getOwnerFragment(this.node).getElementById(o[0]),this.bEndTag=!1}this.node=this.node.parentNode,this.bEndTag=!0}}else{var u=this.node,d=this.node,c=this.node;if(1===this.node.nodeType&&"IFRAME"===this.node.nodeName.toUpperCase()&&l.VisUtil.isNodeVisible(u)&&u.contentDocument&&u.contentDocument.documentElement){var m=this.node;this.node=u.contentDocument.documentElement,this.node.ownerElement=m}else 1===this.node.nodeType&&l.VisUtil.isNodeVisible(d)&&d.shadowRoot&&d.shadowRoot.firstChild?(m=this.node,this.node=d.shadowRoot,this.node.ownerElement=m,r.DOMWalker.assignSlots(this.node)):1===this.node.nodeType&&"slot"===d.nodeName.toLowerCase()&&c.assignedNodes().length>0?this.node=c.assignedNodes()[0]:1!==this.node.nodeType&&11!==this.node.nodeType||!r.DOMWalker.firstChildNotOwnedBySlot(this.node)?this.bEndTag=!0:this.node=r.DOMWalker.firstChildNotOwnedBySlot(this.node)}}while(1!==this.node.nodeType&&11!==this.node.nodeType&&3!==this.node.nodeType||1===this.node.nodeType&&"ACE"===this.node.getAttribute("aChecker")||e&&1===this.node.nodeType&&n.ARIAMapper.getAriaOwnedBy(this.node));return!0},e.prototype.prevNode=function(){var e=!1;do{if(e=!1,this.bEndTag){var t=this.node,i=this.node;if(1===this.node.nodeType&&"IFRAME"===this.node.nodeName.toUpperCase()&&l.VisUtil.isNodeVisible(t)&&t.contentDocument&&t.contentDocument.documentElement){var o=this.node;this.node=t.contentDocument.documentElement,this.node.ownerElement=o}else 1===this.node.nodeType&&l.VisUtil.isNodeVisible(i)&&i.shadowRoot&&i.shadowRoot.lastChild?(o=this.node,this.node=i.shadowRoot,this.node.ownerElement=o,r.DOMWalker.assignSlots(this.node)):1!==this.node.nodeType&&11!==this.node.nodeType||!r.DOMWalker.lastChildNotOwnedBySlot(this.node)?this.bEndTag=!1:this.node=r.DOMWalker.lastChildNotOwnedBySlot(this.node)}else{if(this.atRoot())return!1;if(r.DOMWalker.previousSiblingNotOwnedBySlot(this.node))this.node=r.DOMWalker.previousSiblingNotOwnedBySlot(this.node),this.bEndTag=!0;else if(this.node.ownerElement)this.node=this.node.ownerElement,this.bEndTag=!1,e=!0;else{if(!this.node.parentNode)return!1;if(1===this.node.parentNode.nodeType&&this.node.parentNode.hasAttribute("aria-owns")){var s=this.node.parentNode.getAttribute("aria-owns").split(/ +/g);if(1===this.node.nodeType&&this.node.hasAttribute("id")){var u=s.indexOf(this.node.getAttribute("id"));u===s.length-1?(this.node=this.node.parentNode,this.bEndTag=!0):(this.node=a.FragmentUtil.getOwnerFragment(this.node).getElementById(s[u+1]),this.bEndTag=!1)}else this.node=a.FragmentUtil.getOwnerFragment(this.node).getElementById(s[0]),this.bEndTag=!1}this.node=this.node.parentNode,this.bEndTag=!1}}}while(1!==this.node.nodeType&&11!==this.node.nodeType||1===this.node.nodeType&&"ACE"===this.node.getAttribute("aChecker")||e&&1===this.node.nodeType&&n.ARIAMapper.getAriaOwnedBy(this.node));return!0},e}();t.ARIAWalker=o},6858(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.AncestorUtil=void 0;var i=function(){function e(){}return e.isPresentationFrame=function(e){if(e&&e.dom)for(var t=e.dom.length-2;t>=0;--t){var i=e.dom[t].node;if(1===i.nodeType&&"iframe"===i.nodeName.toLowerCase()&&("presentation"===i.getAttribute("role")||"true"===i.getAttribute("aria-hidden")))return!0}return!1},e.isFrame=function(e){if(e&&e.dom)for(var t=e.dom.length-2;t>=0;--t){var i=e.dom[t].node;if(1===i.nodeType&&"iframe"===i.nodeName.toLowerCase())return!0}return!1},e}();t.AncestorUtil=i},5279(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.FragmentUtil=void 0;var i=function(){function e(){}return e.getOwnerFragment=function(e){for(var t=e;t.parentNode&&(t=t.parentNode);)if(11===t.nodeType)return t;return e.ownerDocument},e.getById=function(e,t){return this.getOwnerFragment(e).getElementById(t)},e.getAncestor=function(e,t){var i=e.dom.filter(function(e){return e.role===t});return i.length>0&&i[0].node||null},e.getAncestorWithRole=function(e,t){var i=e.aria.filter(function(e){return e.role===t});return i.length>0&&i[0].node||null},e}();t.FragmentUtil=i},1043(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.LangUtil=void 0;var i=[["aa","ab","ae","af","ak","am","an","ar","as","av","ay","az","aaa","aab","aac","aad","aae","aaf","aag","aah","aai","aak","aal","aam","aan","aao","aap","aaq","aas","aat","aau","aav","aaw","aax","aaz","aba","abb","abc","abd","abe","abf","abg","abh","abi","abj","abl","abm","abn","abo","abp","abq","abr","abs","abt","abu","abv","abw","abx","aby","abz","aca","acb","acd","ace","acf","ach","aci","ack","acl","acm","acn","acp","acq","acr","acs","act","acu","acv","acw","acx","acy","acz","ada","adb","add","ade","adf","adg","adh","adi","adj","adl","adn","ado","adp","adq","adr","ads","adt","adu","adw","adx","ady","adz","aea","aeb","aec","aed","aee","aek","ael","aem","aen","aeq","aer","aes","aeu","aew","aey","aez","afa","afb","afd","afe","afg","afh","afi","afk","afn","afo","afp","afs","aft","afu","afz","aga","agb","agc","agd","age","agf","agg","agh","agi","agj","agk","agl","agm","agn","ago","agp","agq","agr","ags","agt","agu","agv","agw","agx","agy","agz","aha","ahb","ahg","ahh","ahi","ahk","ahl","ahm","ahn","aho","ahp","ahr","ahs","aht","aia","aib","aic","aid","aie","aif","aig","aih","aii","aij","aik","ail","aim","ain","aio","aip","aiq","air","ais","ait","aiw","aix","aiy","aja","ajg","aji","ajn","ajp","ajt","aju","ajw","ajz","akb","akc","akd","ake","akf","akg","akh","aki","akj","akk","akl","akm","ako","akp","akq","akr","aks","akt","aku","akv","akw","akx","aky","akz","ala","alc","ald","ale","alf","alg","alh","ali","alj","alk","all","alm","aln","alo","alp","alq","alr","als","alt","alu","alv","alw","alx","aly","alz","ama","amb","amc","ame","amf","amg","ami","amj","amk","aml","amm","amn","amo","amp","amq","amr","ams","amt","amu","amv","amw","amx","amy","amz","ana","anb","anc","and","ane","anf","ang","anh","ani","anj","ank","anl","anm","ann","ano","anp","anq","anr","ans","ant","anu","anv","anw","anx","any","anz","aoa","aob","aoc","aod","aoe","aof","aog","aoh","aoi","aoj","aok","aol","aom","aon","aor","aos","aot","aou","aox","aoz","apa","apb","apc","apd","ape","apf","apg","aph","api","apj","apk","apl","apm","apn","apo","app","apq","apr","aps","apt","apu","apv","apw","apx","apy","apz","aqa","aqc","aqd","aqg","aqk","aql","aqm","aqn","aqp","aqr","aqt","aqz","arb","arc","ard","are","arh","ari","arj","ark","arl","arn","aro","arp","arq","arr","ars","art","aru","arv","arw","arx","ary","arz","asa","asb","asc","asd","ase","asf","asg","ash","asi","asj","ask","asl","asn","aso","asp","asq","asr","ass","ast","asu","asv","asw","asx","asy","asz","ata","atb","atc","atd","ate","atg","ath","ati","atj","atk","atl","atm","atn","ato","atp","atq","atr","ats","att","atu","atv","atw","atx","aty","atz","aua","aub","auc","aud","aue","auf","aug","auh","aui","auj","auk","aul","aum","aun","auo","aup","auq","aur","aus","aut","auu","auw","aux","auy","auz","avb","avd","avi","avk","avl","avm","avn","avo","avs","avt","avu","avv","awa","awb","awc","awd","awe","awg","awh","awi","awk","awm","awn","awo","awr","aws","awt","awu","awv","aww","awx","awy","axb","axe","axg","axk","axl","axm","axx","aya","ayb","ayc","ayd","aye","ayg","ayh","ayi","ayk","ayl","ayn","ayo","ayp","ayq","ayr","ays","ayt","ayu","ayx","ayy","ayz","aza","azb","azc","azd","azg","azj","azm","azn","azo","azt","azz"],["ba","be","bg","bh","bi","bm","bn","bo","br","bs","baa","bab","bac","bad","bae","baf","bag","bah","bai","baj","bal","ban","bao","bap","bar","bas","bat","bau","bav","baw","bax","bay","baz","bba","bbb","bbc","bbd","bbe","bbf","bbg","bbh","bbi","bbj","bbk","bbl","bbm","bbn","bbo","bbp","bbq","bbr","bbs","bbt","bbu","bbv","bbw","bbx","bby","bbz","bca","bcb","bcc","bcd","bce","bcf","bcg","bch","bci","bcj","bck","bcl","bcm","bcn","bco","bcp","bcq","bcr","bcs","bct","bcu","bcv","bcw","bcy","bcz","bda","bdb","bdc","bdd","bde","bdf","bdg","bdh","bdi","bdj","bdk","bdl","bdm","bdn","bdo","bdp","bdq","bdr","bds","bdt","bdu","bdv","bdw","bdx","bdy","bdz","bea","beb","bec","bed","bee","bef","beg","beh","bei","bej","bek","bem","beo","bep","beq","ber","bes","bet","beu","bev","bew","bex","bey","bez","bfa","bfb","bfc","bfd","bfe","bff","bfg","bfh","bfi","bfj","bfk","bfl","bfm","bfn","bfo","bfp","bfq","bfr","bfs","bft","bfu","bfw","bfx","bfy","bfz","bga","bgb","bgc","bgd","bge","bgf","bgg","bgi","bgj","bgk","bgl","bgm","bgn","bgo","bgp","bgq","bgr","bgs","bgt","bgu","bgv","bgw","bgx","bgy","bgz","bha","bhb","bhc","bhd","bhe","bhf","bhg","bhh","bhi","bhj","bhk","bhl","bhm","bhn","bho","bhp","bhq","bhr","bhs","bht","bhu","bhv","bhw","bhx","bhy","bhz","bia","bib","bic","bid","bie","bif","big","bij","bik","bil","bim","bin","bio","bip","biq","bir","bit","biu","biv","biw","bix","biy","biz","bja","bjb","bjc","bjd","bje","bjf","bjg","bjh","bji","bjj","bjk","bjl","bjm","bjn","bjo","bjp","bjq","bjr","bjs","bjt","bju","bjv","bjw","bjx","bjy","bjz","bka","bkb","bkc","bkd","bkf","bkg","bkh","bki","bkj","bkk","bkl","bkm","bkn","bko","bkp","bkq","bkr","bks","bkt","bku","bkv","bkw","bkx","bky","bkz","bla","blb","blc","bld","ble","blf","blg","blh","bli","blj","blk","bll","blm","bln","blo","blp","blq","blr","bls","blt","blv","blw","blx","bly","blz","bma","bmb","bmc","bmd","bme","bmf","bmg","bmh","bmi","bmj","bmk","bml","bmm","bmn","bmo","bmp","bmq","bmr","bms","bmt","bmu","bmv","bmw","bmx","bmy","bmz","bna","bnb","bnc","bnd","bne","bnf","bng","bni","bnj","bnk","bnl","bnm","bnn","bno","bnp","bnq","bnr","bns","bnt","bnu","bnv","bnw","bnx","bny","bnz","boa","bob","boe","bof","bog","boh","boi","boj","bok","bol","bom","bon","boo","bop","boq","bor","bot","bou","bov","bow","box","boy","boz","bpa","bpb","bpd","bpe","bpg","bph","bpi","bpj","bpk","bpl","bpm","bpn","bpo","bpp","bpq","bpr","bps","bpt","bpu","bpv","bpw","bpx","bpy","bpz","bqa","bqb","bqc","bqd","bqf","bqg","bqh","bqi","bqj","bqk","bql","bqm","bqn","bqo","bqp","bqq","bqr","bqs","bqt","bqu","bqv","bqw","bqx","bqy","bqz","bra","brb","brc","brd","brf","brg","brh","bri","brj","brk","brl","brm","brn","bro","brp","brq","brr","brs","brt","bru","brv","brw","brx","bry","brz","bsa","bsb","bsc","bse","bsf","bsg","bsh","bsi","bsj","bsk","bsl","bsm","bsn","bso","bsp","bsq","bsr","bss","bst","bsu","bsv","bsw","bsx","bsy","bta","btb","btc","btd","bte","btf","btg","bth","bti","btj","btk","btl","btm","btn","bto","btp","btq","btr","bts","btt","btu","btv","btw","btx","bty","btz","bua","bub","buc","bud","bue","buf","bug","buh","bui","buj","buk","bum","bun","buo","bup","buq","bus","but","buu","buv","buw","bux","buy","buz","bva","bvb","bvc","bvd","bve","bvf","bvg","bvh","bvi","bvj","bvk","bvl","bvm","bvn","bvo","bvp","bvq","bvr","bvt","bvu","bvv","bvw","bvx","bvy","bvz","bwa","bwb","bwc","bwd","bwe","bwf","bwg","bwh","bwi","bwj","bwk","bwl","bwm","bwn","bwo","bwp","bwq","bwr","bws","bwt","bwu","bww","bwx","bwy","bwz","bxa","bxb","bxc","bxd","bxe","bxf","bxg","bxh","bxi","bxj","bxk","bxl","bxm","bxn","bxo","bxp","bxq","bxr","bxs","bxu","bxv","bxw","bxx","bxz","bya","byb","byc","byd","bye","byf","byg","byh","byi","byj","byk","byl","bym","byn","byo","byp","byq","byr","bys","byt","byv","byw","byx","byy","byz","bza","bzb","bzc","bzd","bze","bzf","bzg","bzh","bzi","bzj","bzk","bzl","bzm","bzn","bzo","bzp","bzq","bzr","bzs","bzt","bzu","bzv","bzw","bzx","bzy","bzz"],["ca","ce","ch","co","cr","cs","cu","cv","cy","caa","cab","cac","cad","cae","caf","cag","cah","cai","caj","cak","cal","cam","can","cao","cap","caq","car","cas","cau","cav","caw","cax","cay","caz","cba","cbb","cbc","cbd","cbe","cbg","cbh","cbi","cbj","cbk","cbl","cbn","cbo","cbq","cbr","cbs","cbt","cbu","cbv","cbw","cby","cca","ccc","ccd","cce","ccg","cch","ccj","ccl","ccm","ccn","cco","ccp","ccq","ccr","ccs","cda","cdc","cdd","cde","cdf","cdg","cdh","cdi","cdj","cdm","cdn","cdo","cdr","cds","cdy","cdz","cea","ceb","ceg","cek","cel","cen","cet","cey","cfa","cfd","cfg","cfm","cga","cgc","cgg","cgk","chb","chc","chd","chf","chg","chh","chj","chk","chl","chm","chn","cho","chp","chq","chr","cht","chw","chx","chy","chz","cia","cib","cic","cid","cie","cih","cik","cim","cin","cip","cir","ciw","ciy","cja","cje","cjh","cji","cjk","cjm","cjn","cjo","cjp","cjr","cjs","cjv","cjy","cka","ckb","ckh","ckl","ckm","ckn","cko","ckq","ckr","cks","ckt","cku","ckv","ckx","cky","ckz","cla","clc","cld","cle","clh","cli","clj","clk","cll","clm","clo","clt","clu","clw","cly","cma","cmc","cme","cmg","cmi","cmk","cml","cmm","cmn","cmo","cmr","cms","cmt","cna","cnb","cnc","cng","cnh","cni","cnk","cnl","cno","cnp","cnr","cns","cnt","cnu","cnw","cnx","coa","cob","coc","cod","coe","cof","cog","coh","coj","cok","col","com","con","coo","cop","coq","cot","cou","cov","cow","cox","coy","coz","cpa","cpb","cpc","cpe","cpf","cpg","cpi","cpn","cpo","cpp","cps","cpu","cpx","cpy","cqd","cqu","cra","crb","crc","crd","crf","crg","crh","cri","crj","crk","crl","crm","crn","cro","crp","crq","crr","crs","crt","crv","crw","crx","cry","crz","csa","csb","csc","csd","cse","csf","csg","csh","csi","csj","csk","csl","csm","csn","cso","csp","csq","csr","css","cst","csu","csv","csw","csx","csy","csz","cta","ctc","ctd","cte","ctg","cth","ctl","ctm","ctn","cto","ctp","cts","ctt","ctu","cty","ctz","cua","cub","cuc","cug","cuh","cui","cuj","cuk","cul","cum","cuo","cup","cuq","cur","cus","cut","cuu","cuv","cuw","cux","cuy","cvg","cvn","cwa","cwb","cwd","cwe","cwg","cwt","cya","cyb","cyo","czh","czk","czn","czo","czt"],["da","de","dv","dz","daa","dac","dad","dae","daf","dag","dah","dai","daj","dak","dal","dam","dao","dap","daq","dar","das","dau","dav","daw","dax","day","daz","dba","dbb","dbd","dbe","dbf","dbg","dbi","dbj","dbl","dbm","dbn","dbo","dbp","dbq","dbr","dbt","dbu","dbv","dbw","dby","dcc","dcr","dda","ddd","dde","ddg","ddi","ddj","ddn","ddo","ddr","dds","ddw","dec","ded","dee","def","deg","deh","dei","dek","del","dem","den","dep","deq","der","des","dev","dez","dga","dgb","dgc","dgd","dge","dgg","dgh","dgi","dgk","dgl","dgn","dgo","dgr","dgs","dgt","dgu","dgw","dgx","dgz","dha","dhd","dhg","dhi","dhl","dhm","dhn","dho","dhr","dhs","dhu","dhv","dhw","dhx","dia","dib","dic","did","dif","dig","dih","dii","dij","dik","dil","dim","din","dio","dip","diq","dir","dis","dit","diu","diw","dix","diy","diz","dja","djb","djc","djd","dje","djf","dji","djj","djk","djl","djm","djn","djo","djr","dju","djw","dka","dkg","dkk","dkl","dkr","dks","dkx","dlg","dlk","dlm","dln","dma","dmb","dmc","dmd","dme","dmf","dmg","dmk","dml","dmm","dmn","dmo","dmr","dms","dmu","dmv","dmw","dmx","dmy","dna","dnd","dne","dng","dni","dnj","dnk","dnn","dno","dnr","dnt","dnu","dnv","dnw","dny","doa","dob","doc","doe","dof","doh","doi","dok","dol","don","doo","dop","doq","dor","dos","dot","dov","dow","dox","doy","doz","dpp","dra","drb","drc","drd","dre","drg","drh","dri","drl","drn","dro","drq","drr","drs","drt","dru","drw","dry","dsb","dse","dsh","dsi","dsl","dsn","dso","dsq","dta","dtb","dtd","dth","dti","dtk","dtm","dtn","dto","dtp","dtr","dts","dtt","dtu","dty","dua","dub","duc","dud","due","duf","dug","duh","dui","duj","duk","dul","dum","dun","duo","dup","duq","dur","dus","duu","duv","duw","dux","duy","duz","dva","dwa","dwk","dwl","dwr","dws","dwu","dww","dwy","dwz","dya","dyb","dyd","dyg","dyi","dym","dyn","dyo","dyu","dyy","dza","dzd","dze","dzg","dzl","dzn"],["ee","el","en","eo","es","et","eu","eaa","ebc","ebg","ebk","ebo","ebr","ebu","ecr","ecs","ecy","eee","efa","efe","efi","ega","egl","ego","egx","egy","ehs","ehu","eip","eit","eiv","eja","eka","ekc","eke","ekg","eki","ekk","ekl","ekm","eko","ekp","ekr","eky","ele","elh","eli","elk","elm","elo","elp","elu","elx","ema","emb","eme","emg","emi","emk","emm","emn","emo","emp","emq","ems","emu","emw","emx","emy","emz","ena","enb","enc","end","enf","enh","enl","enm","enn","eno","enq","enr","enu","env","enw","enx","eot","epi","era","erg","erh","eri","erk","ero","err","ers","ert","erw","ese","esg","esh","esi","esk","esl","esm","esn","eso","esq","ess","esu","esx","esy","etb","etc","eth","etn","eto","etr","ets","ett","etu","etx","etz","euq","eve","evh","evn","ewo","ext","eya","eyo","eza","eze"],["fa","ff","fi","fj","fo","fr","fy","faa","fab","fad","faf","fag","fah","fai","faj","fak","fal","fam","fan","fap","far","fat","fau","fax","fay","faz","fbl","fcs","fer","ffi","ffm","fgr","fia","fie","fif","fil","fip","fir","fit","fiu","fiw","fkk","fkv","fla","flh","fli","fll","fln","flr","fly","fmp","fmu","fnb","fng","fni","fod","foi","fom","fon","for","fos","fox","fpe","fqs","frc","frd","frk","frm","fro","frp","frq","frr","frs","frt","fse","fsl","fss","fub","fuc","fud","fue","fuf","fuh","fui","fuj","fum","fun","fuq","fur","fut","fuu","fuv","fuy","fvr","fwa","fwe"],["ga","gd","gl","gn","gu","gv","gaa","gab","gac","gad","gae","gaf","gag","gah","gai","gaj","gak","gal","gam","gan","gao","gap","gaq","gar","gas","gat","gau","gav","gaw","gax","gay","gaz","gba","gbb","gbc","gbd","gbe","gbf","gbg","gbh","gbi","gbj","gbk","gbl","gbm","gbn","gbo","gbp","gbq","gbr","gbs","gbu","gbv","gbw","gbx","gby","gbz","gcc","gcd","gce","gcf","gcl","gcn","gcr","gct","gda","gdb","gdc","gdd","gde","gdf","gdg","gdh","gdi","gdj","gdk","gdl","gdm","gdn","gdo","gdq","gdr","gds","gdt","gdu","gdx","gea","geb","gec","ged","gef","geg","geh","gei","gej","gek","gel","gem","geq","ges","gev","gew","gex","gey","gez","gfk","gft","gfx","gga","ggb","ggd","gge","ggg","ggk","ggl","ggn","ggo","ggr","ggt","ggu","ggw","gha","ghc","ghe","ghh","ghk","ghl","ghn","gho","ghr","ghs","ght","gia","gib","gic","gid","gie","gig","gih","gii","gil","gim","gin","gio","gip","giq","gir","gis","git","giu","giw","gix","giy","giz","gji","gjk","gjm","gjn","gjr","gju","gka","gkd","gke","gkn","gko","gkp","gku","glb","glc","gld","glh","gli","glj","glk","gll","glo","glr","glu","glw","gly","gma","gmb","gmd","gme","gmg","gmh","gml","gmm","gmn","gmq","gmr","gmu","gmv","gmw","gmx","gmy","gmz","gna","gnb","gnc","gnd","gne","gng","gnh","gni","gnj","gnk","gnl","gnm","gnn","gno","gnq","gnr","gnt","gnu","gnw","gnz","goa","gob","goc","god","goe","gof","gog","goh","goi","goj","gok","gol","gom","gon","goo","gop","goq","gor","gos","got","gou","gow","gox","goy","goz","gpa","gpe","gpn","gqa","gqi","gqn","gqr","gqu","gra","grb","grc","grd","grg","grh","gri","grj","grk","grm","gro","grq","grr","grs","grt","gru","grv","grw","grx","gry","grz","gse","gsg","gsl","gsm","gsn","gso","gsp","gss","gsw","gta","gti","gtu","gua","gub","guc","gud","gue","guf","gug","guh","gui","guk","gul","gum","gun","guo","gup","guq","gur","gus","gut","guu","guv","guw","gux","guz","gva","gvc","gve","gvf","gvj","gvl","gvm","gvn","gvo","gvp","gvr","gvs","gvy","gwa","gwb","gwc","gwd","gwe","gwf","gwg","gwi","gwj","gwm","gwn","gwr","gwt","gwu","gww","gwx","gxx","gya","gyb","gyd","gye","gyf","gyg","gyi","gyl","gym","gyn","gyo","gyr","gyy","gyz","gza","gzi","gzn"],["ha","he","hi","ho","hr","ht","hu","hy","hz","haa","hab","hac","had","hae","haf","hag","hah","hai","haj","hak","hal","ham","han","hao","hap","haq","har","has","hav","haw","hax","hay","haz","hba","hbb","hbn","hbo","hbu","hca","hch","hdn","hds","hdy","hea","hed","heg","heh","hei","hem","hgm","hgw","hhi","hhr","hhy","hia","hib","hid","hif","hig","hih","hii","hij","hik","hil","him","hio","hir","hit","hiw","hix","hji","hka","hke","hkh","hkk","hkn","hks","hla","hlb","hld","hle","hlt","hlu","hma","hmb","hmc","hmd","hme","hmf","hmg","hmh","hmi","hmj","hmk","hml","hmm","hmn","hmp","hmq","hmr","hms","hmt","hmu","hmv","hmw","hmx","hmy","hmz","hna","hnd","hne","hng","hnh","hni","hnj","hnn","hno","hns","hnu","hoa","hob","hoc","hod","hoe","hoh","hoi","hoj","hok","hol","hom","hoo","hop","hor","hos","hot","hov","how","hoy","hoz","hpo","hps","hra","hrc","hre","hrk","hrm","hro","hrp","hrr","hrt","hru","hrw","hrx","hrz","hsb","hsh","hsl","hsn","hss","hti","hto","hts","htu","htx","hub","huc","hud","hue","huf","hug","huh","hui","huj","huk","hul","hum","huo","hup","huq","hur","hus","hut","huu","huv","huw","hux","huy","huz","hvc","hve","hvk","hvn","hvv","hwa","hwc","hwo","hya","hyw","hyx"],["ia","id","ie","ig","ii","ik","in","io","is","it","iu","iw","iai","ian","iap","iar","iba","ibb","ibd","ibe","ibg","ibh","ibi","ibl","ibm","ibn","ibr","ibu","iby","ica","ich","icl","icr","ida","idb","idc","idd","ide","idi","idr","ids","idt","idu","ifa","ifb","ife","iff","ifk","ifm","ifu","ify","igb","ige","igg","igl","igm","ign","igo","igs","igw","ihb","ihi","ihp","ihw","iin","iir","ijc","ije","ijj","ijn","ijo","ijs","ike","iki","ikk","ikl","iko","ikp","ikr","iks","ikt","ikv","ikw","ikx","ikz","ila","ilb","ilg","ili","ilk","ill","ilm","ilo","ilp","ils","ilu","ilv","ilw","ima","ime","imi","iml","imn","imo","imr","ims","imy","inb","inc","ine","ing","inh","inj","inl","inm","inn","ino","inp","ins","int","inz","ior","iou","iow","ipi","ipo","iqu","iqw","ira","ire","irh","iri","irk","irn","iro","irr","iru","irx","iry","isa","isc","isd","ise","isg","ish","isi","isk","ism","isn","iso","isr","ist","isu","itb","itc","itd","ite","iti","itk","itl","itm","ito","itr","its","itt","itv","itw","itx","ity","itz","ium","ivb","ivv","iwk","iwm","iwo","iws","ixc","ixl","iya","iyo","iyx","izh","izi","izr","izz"],["ja","ji","jv","jw","jaa","jab","jac","jad","jae","jaf","jah","jaj","jak","jal","jam","jan","jao","jaq","jar","jas","jat","jau","jax","jay","jaz","jbe","jbi","jbj","jbk","jbm","jbn","jbo","jbr","jbt","jbu","jbw","jcs","jct","jda","jdg","jdt","jeb","jee","jeg","jeh","jei","jek","jel","jen","jer","jet","jeu","jgb","jge","jgk","jgo","jhi","jhs","jia","jib","jic","jid","jie","jig","jih","jii","jil","jim","jio","jiq","jit","jiu","jiv","jiy","jje","jjr","jka","jkm","jko","jkp","jkr","jks","jku","jle","jls","jma","jmb","jmc","jmd","jmi","jml","jmn","jmr","jms","jmw","jmx","jna","jnd","jng","jni","jnj","jnl","jns","job","jod","jog","jor","jos","jow","jpa","jpr","jpx","jqr","jra","jrb","jrr","jrt","jru","jsl","jua","jub","juc","jud","juh","jui","juk","jul","jum","jun","juo","jup","jur","jus","jut","juu","juw","juy","jvd","jvn","jwi","jya","jye","jyy"],["ka","kg","ki","kj","kk","kl","km","kn","ko","kr","ks","ku","kv","kw","ky","kaa","kab","kac","kad","kae","kaf","kag","kah","kai","kaj","kak","kam","kao","kap","kaq","kar","kav","kaw","kax","kay","kba","kbb","kbc","kbd","kbe","kbf","kbg","kbh","kbi","kbj","kbk","kbl","kbm","kbn","kbo","kbp","kbq","kbr","kbs","kbt","kbu","kbv","kbw","kbx","kby","kbz","kca","kcb","kcc","kcd","kce","kcf","kcg","kch","kci","kcj","kck","kcl","kcm","kcn","kco","kcp","kcq","kcr","kcs","kct","kcu","kcv","kcw","kcx","kcy","kcz","kda","kdc","kdd","kde","kdf","kdg","kdh","kdi","kdj","kdk","kdl","kdm","kdn","kdo","kdp","kdq","kdr","kdt","kdu","kdv","kdw","kdx","kdy","kdz","kea","keb","kec","ked","kee","kef","keg","keh","kei","kej","kek","kel","kem","ken","keo","kep","keq","ker","kes","ket","keu","kev","kew","kex","key","kez","kfa","kfb","kfc","kfd","kfe","kff","kfg","kfh","kfi","kfj","kfk","kfl","kfm","kfn","kfo","kfp","kfq","kfr","kfs","kft","kfu","kfv","kfw","kfx","kfy","kfz","kga","kgb","kgc","kgd","kge","kgf","kgg","kgh","kgi","kgj","kgk","kgl","kgm","kgn","kgo","kgp","kgq","kgr","kgs","kgt","kgu","kgv","kgw","kgx","kgy","kha","lyg","khb","khc","khd","khe","khf","khg","khh","khi","khj","khk","khl","khn","kho","khp","khq","khr","khs","kht","khu","khv","khw","khx","khy","khz","kia","kib","kic","kid","kie","kif","kig","kih","kii","kij","kil","kim","kio","kip","kiq","kis","kit","kiu","kiv","kiw","kix","kiy","kiz","kja","kjb","kjc","kjd","kje","kjf","kjg","kjh","kji","kjj","kjk","kjl","kjm","kjn","kjo","kjp","kjq","kjr","kjs","kjt","kju","kjv","kjx","kjy","kjz","kka","kkb","kkc","kkd","kke","kkf","kkg","kkh","kki","kkj","kkk","kkl","kkm","kkn","kko","kkp","kkq","kkr","kks","kkt","kku","kkv","kkw","kkx","kky","kkz","kla","klb","klc","kld","kle","klf","klg","klh","kli","klj","klk","kll","klm","kln","klo","klp","klq","klr","kls","klt","klu","klv","klw","klx","kly","klz","kma","kmb","kmc","kmd","kme","kmf","kmg","kmh","kmi","kmj","kmk","kml","kmm","kmn","kmo","kmp","kmq","kmr","kms","kmt","kmu","kmv","kmw","kmx","kmy","kmz","kna","knb","knc","knd","kne","knf","kng","kni","knj","knk","knl","knm","knn","kno","knp","knq","knr","kns","knt","knu","knv","knw","knx","kny","knz","koa","koc","kod","koe","kof","kog","koh","koi","koj","kok","kol","koo","kop","koq","kos","kot","kou","kov","kow","kox","koy","koz","kpa","kpb","kpc","kpd","kpe","kpf","kpg","kph","kpi","kpj","kpk","kpl","kpm","kpn","kpo","kpp","kpq","kpr","kps","kpt","kpu","kpv","kpw","kpx","kpy","kpz","kqa","kqb","kqc","kqd","kqe","kqf","kqg","kqh","kqi","kqj","kqk","kql","kqm","kqn","kqo","kqp","kqq","kqr","kqs","kqt","kqu","kqv","kqw","kqx","kqy","kqz","kra","krb","krc","krd","kre","krf","krh","kri","krj","krk","krl","krm","krn","kro","krp","krr","krs","krt","kru","krv","krw","krx","kry","krz","ksa","ksb","ksc","ksd","kse","ksf","ksg","ksh","ksi","ksj","ksk","ksl","ksm","ksn","kso","ksp","ksq","ksr","kss","kst","ksu","ksv","ksw","ksx","ksy","ksz","kta","ktb","ktc","ktd","kte","ktf","ktg","kth","kti","ktj","ktk","ktl","ktm","ktn","kto","ktp","ktq","ktr","kts","ktt","ktu","ktv","ktw","ktx","kty","ktz","kub","kuc","kud","kue","kuf","kug","kuh","kui","kuj","kuk","kul","kum","kun","kuo","kup","kuq","kus","kut","kuu","kuv","kuw","kux","kuy","kuz","kva","kvb","kvc","kvd","kve","kvf","kvg","kvh","kvi","kvj","kvk","kvl","kvm","kvn","kvo","kvp","kvq","kvr","kvs","kvt","kvu","kvv","kvw","kvx","kvy","kvz","kwa","kwb","kwc","kwd","kwe","kwf","kwg","kwh","kwi","kwj","kwk","kwl","kwm","kwn","kwo","kwp","kwq","kwr","kws","kwt","kwu","kwv","kww","kwx","kwy","kwz","kxa","kxb","kxc","kxd","kxe","kxf","kxh","kxi","kxj","kxk","kxl","kxm","kxn","kxo","kxp","kxq","kxr","kxs","kxt","kxu","kxv","kxw","kxx","kxy","kxz","kya","kyb","kyc","kyd","kye","kyf","kyg","kyh","kyi","kyj","kyk","kyl","kym","kyn","kyo","kyp","kyq","kyr","kys","kyt","kyu","kyv","kyw","kyx","kyy","kyz","kza","kzb","kzc","kzd","kze","kzf","kzg","kzh","kzi","kzj","kzk","kzl","kzm","kzn","kzo","kzp","kzq","kzr","kzs","kzt","kzu","kzv","kzw","kzx","kzy","kzz"],["la","lb","lg","li","ln","lo","lt","lu","lv","laa","lab","lac","lad","lae","laf","lag","lah","lai","laj","lak","lal","lam","lan","lap","laq","lar","las","lau","law","lax","lay","laz","lba","lbb","lbc","lbe","lbf","lbg","lbi","lbj","lbk","lbl","lbm","lbn","lbo","lbq","lbr","lbs","lbt","lbu","lbv","lbw","lbx","lby","lbz","lcc","lcd","lce","lcf","lch","lcl","lcm","lcp","lcq","lcs","lda","ldb","ldd","ldg","ldh","ldi","ldj","ldk","ldl","ldm","ldn","ldo","ldp","ldq","lea","leb","lec","led","lee","lef","leg","leh","lei","lej","lek","lel","lem","len","leo","lep","leq","ler","les","let","leu","lev","lew","lex","ley","lez","lfa","lfn","lga","lgb","lgg","lgh","lgi","lgk","lgl","lgm","lgn","lgq","lgr","lgt","lgu","lgz","lha","lhh","lhi","lhl","lhm","lhn","lhp","lhs","lht","lhu","lia","lib","lic","lid","lie","lif","lig","lih","lii","lij","lik","lil","lio","lip","liq","lir","lis","liu","liv","liw","lix","liy","liz","lja","lje","lji","ljl","ljp","ljw","ljx","lka","lkb","lkc","lkd","lke","lkh","lki","lkj","lkl","lkm","lkn","lko","lkr","lks","lkt","lku","lky","lla","llb","llc","lld","lle","llf","llg","llh","lli","llj","llk","lll","llm","lln","llo","llp","llq","lls","llu","llx","lma","lmb","lmc","lmd","lme","lmf","lmg","lmh","lmi","lmj","lmk","lml","lmm","lmn","lmo","lmp","lmq","lmr","lmu","lmv","lmw","lmx","lmy","lmz","lna","lnb","lnd","lng","lnh","lni","lnj","lnl","lnm","lnn","lno","lns","lnu","lnw","lnz","loa","lob","loc","loe","lof","log","loh","loi","loj","lok","lol","lom","lon","loo","lop","loq","lor","los","lot","lou","lov","low","lox","loy","loz","lpa","lpe","lpn","lpo","lpx","lra","lrc","lre","lrg","lri","lrk","lrl","lrm","lrn","lro","lrr","lrt","lrv","lrz","lsa","lsb","lsd","lse","lsg","lsh","lsi","lsl","lsm","lsn","lso","lsp","lsr","lss","lst","lsv","lsy","ltc","ltg","lth","lti","ltn","lto","lts","ltu","lua","luc","lud","lue","luf","lui","luj","luk","lul","lum","lun","luo","lup","luq","lur","lus","lut","luu","luv","luw","luy","luz","lva","lvi","lvk","lvs","lvu","lwa","lwe","lwg","lwh","lwl","lwm","lwo","lws","lwt","lwu","lww","lxm","lya","lyg","lyn","lzh","lzl","lzn","lzz"],["mg","mh","mi","mk","ml","mn","mo","mr","ms","mt","my","maa","mab","mad","mae","maf","mag","mai","maj","mak","mam","man","map","maq","mas","mat","mau","mav","maw","max","maz","mba","mbb","mbc","mbd","mbe","mbf","mbh","mbi","mbj","mbk","mbl","mbm","mbn","mbo","mbp","mbq","mbr","mbs","mbt","mbu","mbv","mbw","mbx","mby","mbz","mca","mcb","mcc","mcd","mce","mcf","mcg","mch","mci","mcj","mck","mcl","mcm","mcn","mco","mcp","mcq","mcr","mcs","mct","mcu","mcv","mcw","mcx","mcy","mcz","mda","mdb","mdc","mdd","mde","mdf","mdg","mdh","mdi","mdj","mdk","mdl","mdm","mdn","mdp","mdq","mdr","mds","mdt","mdu","mdv","mdw","mdx","mdy","mdz","mea","meb","mec","med","mee","mef","meg","meh","mei","mej","mek","mel","mem","men","meo","mep","meq","mer","mes","met","meu","mev","mew","mey","mez","mfa","mfb","mfc","mfd","mfe","mff","mfg","mfh","mfi","mfj","mfk","mfl","mfm","mfn","mfo","mfp","mfq","mfr","mfs","mft","mfu","mfv","mfw","mfx","mfy","mfz","mga","mgb","mgc","mgd","mge","mgf","mgg","mgh","mgi","mgj","mgk","mgl","mgm","mgn","mgo","mgp","mgq","mgr","mgs","mgt","mgu","mgv","mgw","mgx","mgy","mgz","mha","mhb","mhc","mhd","mhe","mhf","mhg","mhh","mhi","mhj","mhk","mhl","mhm","mhn","mho","mhp","mhq","mhr","mhs","mht","mhu","mhw","mhx","mhy","mhz","mia","mib","mic","mid","mie","mif","mig","mih","mii","mij","mik","mil","mim","min","mio","mip","miq","mir","mis","mit","miu","miw","mix","miy","miz","mja","mjb","mjc","mjd","mje","mjg","mjh","mji","mjj","mjk","mjl","mjm","mjn","mjo","mjp","mjq","mjr","mjs","mjt","mju","mjv","mjw","mjx","mjy","mjz","mka","mkb","mkc","mke","mkf","mkg","mkh","mki","mkj","mkk","mkl","mkm","mkn","mko","mkp","mkq","mkr","mks","mkt","mku","mkv","mkw","mkx","mky","mkz","mla","mlb","mlc","mld","mle","mlf","mlh","mli","mlj","mlk","mll","mlm","mln","mlo","mlp","mlq","mlr","mls","mlu","mlv","mlw","mlx","mlz","mma","mmb","mmc","mmd","mme","mmf","mmg","mmh","mmi","mmj","mmk","mml","mmm","mmn","mmo","mmp","mmq","mmr","mmt","mmu","mmv","mmw","mmx","mmy","mmz","mna","mnb","mnc","mnd","mne","mnf","mng","mnh","mni","mnj","mnk","mnl","mnm","mnn","mno","mnp","mnq","mnr","mns","mnt","mnu","mnv","mnw","mnx","mny","mnz","moa","moc","mod","moe","mof","mog","moh","moi","moj","mok","mom","moo","mop","moq","mor","mos","mot","mou","mov","mow","mox","moy","moz","mpa","mpb","mpc","mpd","mpe","mpg","mph","mpi","mpj","mpk","mpl","mpm","mpn","mpo","mpp","mpq","mpr","mps","mpt","mpu","mpv","mpw","mpx","mpy","mpz","mqa","mqb","mqc","mqe","mqf","mqg","mqh","mqi","mqj","mqk","mql","mqm","mqn","mqo","mqp","mqq","mqr","mqs","mqt","mqu","mqv","mqw","mqx","mqy","mqz","mra","mrb","mrc","mrd","mre","mrf","mrg","mrh","mrj","mrk","mrl","mrm","mrn","mro","mrp","mrq","mrr","mrs","mrt","mru","mrv","mrw","mrx","mry","mrz","msb","msc","msd","mse","msf","msg","msh","msi","msj","msk","msl","msm","msn","mso","msp","msq","msr","mss","mst","msu","msv","msw","msx","msy","msz","mta","mtb","mtc","mtd","mte","mtf","mtg","mth","mti","mtj","mtk","mtl","mtm","mtn","mto","mtp","mtq","mtr","mts","mtt","mtu","mtv","mtw","mtx","mty","mua","mub","muc","mud","mue","mug","muh","mui","muj","muk","mul","mum","mun","muo","mup","muq","mur","mus","mut","muu","muv","mux","muy","muz","mva","mvb","mvd","mve","mvf","mvg","mvh","mvi","mvk","mvl","mvm","mvn","mvo","mvp","mvq","mvr","mvs","mvt","mvu","mvv","mvw","mvx","mvy","mvz","mwa","mwb","mwc","mwd","mwe","mwf","mwg","mwh","mwi","mwj","mwk","mwl","mwm","mwn","mwo","mwp","mwq","mwr","mws","mwt","mwu","mwv","mww","mwx","mwy","mwz","mxa","mxb","mxc","mxd","mxe","mxf","mxg","mxh","mxi","mxj","mxk","mxl","mxm","mxn","mxo","mxp","mxq","mxr","mxs","mxt","mxu","mxv","mxw","mxx","mxy","mxz","myb","myc","myd","mye","myf","myg","myh","myi","myj","myk","myl","mym","myn","myo","myp","myq","myr","mys","myt","myu","myv","myw","myx","myy","myz","mza","mzb","mzc","mzd","mze","mzg","mzh","mzi","mzj","mzk","mzl","mzm","mzn","mzo","mzp","mzq","mzr","mzs","mzt","mzu","mzv","mzw","mzx","mzy","mzz"],["na","nb","nd","ne","ng","nl","nn","no","nr","nv","ny","naa","nab","nac","nad","nae","naf","nag","nah","nai","naj","nak","nal","nam","nan","nao","nap","naq","nar","nas","nat","naw","nax","nay","naz","nba","nbb","nbc","nbd","nbe","nbf","nbg","nbh","nbi","nbj","nbk","nbm","nbn","nbo","nbp","nbq","nbr","nbs","nbt","nbu","nbv","nbw","nbx","nby","nca","ncb","ncc","ncd","nce","ncf","ncg","nch","nci","ncj","nck","ncl","ncm","ncn","nco","ncp","ncq","ncr","ncs","nct","ncu","ncx","ncz","nda","ndb","ndc","ndd","ndf","ndg","ndh","ndi","ndj","ndk","ndl","ndm","ndn","ndp","ndq","ndr","nds","ndt","ndu","ndv","ndw","ndx","ndy","ndz","nea","neb","nec","ned","nee","nef","neg","neh","nei","nej","nek","nem","nen","neo","neq","ner","nes","net","neu","nev","new","nex","ney","nez","nfa","nfd","nfl","nfr","nfu","nga","ngb","ngc","ngd","nge","ngf","ngg","ngh","ngi","ngj","ngk","ngl","ngm","ngn","ngo","ngp","ngq","ngr","ngs","ngt","ngu","ngv","ngw","ngx","ngy","ngz","nha","nhb","nhc","nhd","nhe","nhf","nhg","nhh","nhi","nhk","nhm","nhn","nho","nhp","nhq","nhr","nht","nhu","nhv","nhw","nhx","nhy","nhz","nia","nib","nic","nid","nie","nif","nig","nih","nii","nij","nik","nil","nim","nin","nio","niq","nir","nis","nit","niu","niv","niw","nix","niy","niz","nja","njb","njd","njh","nji","njj","njl","njm","njn","njo","njr","njs","njt","nju","njx","njy","njz","nka","nkb","nkc","nkd","nke","nkf","nkg","nkh","nki","nkj","nkk","nkm","nkn","nko","nkp","nkq","nkr","nks","nkt","nku","nkv","nkw","nkx","nkz","nla","nlc","nle","nlg","nli","nlj","nlk","nll","nlm","nln","nlo","nlq","nlr","nlu","nlv","nlw","nlx","nly","nlz","nma","nmb","nmc","nmd","nme","nmf","nmg","nmh","nmi","nmj","nmk","nml","nmm","nmn","nmo","nmp","nmq","nmr","nms","nmt","nmu","nmv","nmw","nmx","nmy","nmz","nna","nnb","nnc","nnd","nne","nnf","nng","nnh","nni","nnj","nnk","nnl","nnm","nnn","nnp","nnq","nnr","nns","nnt","nnu","nnv","nnw","nnx","nny","nnz","noa","noc","nod","noe","nof","nog","noh","noi","noj","nok","nol","nom","non","noo","nop","noq","nos","not","nou","nov","now","noy","noz","npa","npb","npg","nph","npi","npl","npn","npo","nps","npu","npx","npy","nqg","nqk","nql","nqm","nqn","nqo","nqq","nqt","nqy","nra","nrb","nrc","nre","nrf","nrg","nri","nrk","nrl","nrm","nrn","nrp","nrr","nrt","nru","nrx","nrz","nsa","nsb","nsc","nsd","nse","nsf","nsg","nsh","nsi","nsk","nsl","nsm","nsn","nso","nsp","nsq","nsr","nss","nst","nsu","nsv","nsw","nsx","nsy","nsz","ntd","nte","ntg","nti","ntj","ntk","ntm","nto","ntp","ntr","nts","ntu","ntw","ntx","nty","ntz","nua","nub","nuc","nud","nue","nuf","nug","nuh","nui","nuj","nuk","nul","num","nun","nuo","nup","nuq","nur","nus","nut","nuu","nuv","nuw","nux","nuy","nuz","nvh","nvm","nvo","nwa","nwb","nwc","nwe","nwg","nwi","nwm","nwo","nwr","nwx","nwy","nxa","nxd","nxe","nxg","nxi","nxk","nxl","nxm","nxn","nxo","nxq","nxr","nxu","nxx","nyb","nyc","nyd","nye","nyf","nyg","nyh","nyi","nyj","nyk","nyl","nym","nyn","nyo","nyp","nyq","nyr","nys","nyt","nyu","nyv","nyw","nyx","nyy","nza","nzb","nzd","nzi","nzk","nzm","nzs","nzu","nzy","nzz"],["oc","oj","om","or","os","oaa","oac","oar","oav","obi","obk","obl","obm","obo","obr","obt","obu","oca","och","ocm","oco","ocu","oda","odk","odt","odu","ofo","ofs","ofu","ogb","ogc","oge","ogg","ogo","ogu","oht","ohu","oia","oin","ojb","ojc","ojg","ojp","ojs","ojv","ojw","oka","okb","okc","okd","oke","okg","okh","oki","okj","okk","okl","okm","okn","oko","okr","oks","oku","okv","okx","okz","ola","old","ole","olk","olm","olo","olr","olt","olu","oma","omb","omc","ome","omg","omi","omk","oml","omn","omo","omp","omq","omr","omt","omu","omv","omw","omx","omy","ona","onb","one","ong","oni","onj","onk","onn","ono","onp","onr","ons","ont","onu","onw","onx","ood","oog","oon","oor","oos","opa","opk","opm","opo","opt","opy","ora","orc","ore","org","orh","orn","oro","orr","ors","ort","oru","orv","orw","orx","ory","orz","osa","osc","osi","osn","oso","osp","ost","osu","osx","ota","otb","otd","ote","oti","otk","otl","otm","otn","oto","otq","otr","ots","ott","otu","otw","otx","oty","otz","oua","oub","oue","oui","oum","oun","ovd","owi","owl","oyb","oyd","oym","oyy","ozm"],["pa","pi","pl","ps","pt","paa","pab","pac","pad","pae","paf","pag","pah","pai","pak","pal","pam","pao","pap","paq","par","pas","pat","pau","pav","paw","pax","pay","paz","pbb","pbc","pbe","pbf","pbg","pbh","pbi","pbl","pbm","pbn","pbo","pbp","pbr","pbs","pbt","pbu","pbv","pby","pbz","pca","pcb","pcc","pcd","pce","pcf","pcg","pch","pci","pcj","pck","pcl","pcm","pcn","pcp","pcr","pcw","pda","pdc","pdi","pdn","pdo","pdt","pdu","pea","peb","ped","pee","pef","peg","peh","pei","pej","pek","pel","pem","peo","pep","peq","pes","pev","pex","pey","pez","pfa","pfe","pfl","pga","pgd","pgg","pgi","pgk","pgl","pgn","pgs","pgu","pgy","pgz","pha","phd","phg","phh","phi","phk","phl","phm","phn","pho","phq","phr","pht","phu","phv","phw","pia","pib","pic","pid","pie","pif","pig","pih","pii","pij","pil","pim","pin","pio","pip","pir","pis","pit","piu","piv","piw","pix","piy","piz","pjt","pka","pkb","pkc","pkg","pkh","pkn","pko","pkp","pkr","pks","pkt","pku","pla","plb","plc","pld","ple","plf","plg","plh","plj","plk","pll","pln","plo","plp","plq","plr","pls","plt","plu","plv","plw","ply","plz","pma","pmb","pmc","pmd","pme","pmf","pmh","pmi","pmj","pmk","pml","pmm","pmn","pmo","pmq","pmr","pms","pmt","pmu","pmw","pmx","pmy","pmz","pna","pnb","pnc","pnd","pne","png","pnh","pni","pnj","pnk","pnl","pnm","pnn","pno","pnp","pnq","pnr","pns","pnt","pnu","pnv","pnw","pnx","pny","pnz","poc","pod","poe","pof","pog","poh","poi","pok","pom","pon","poo","pop","poq","pos","pot","pov","pow","pox","poy","poz","ppa","ppe","ppi","ppk","ppl","ppm","ppn","ppo","ppp","ppq","ppr","pps","ppt","ppu","pqa","pqe","pqm","pqw","pra","prb","prc","prd","pre","prf","prg","prh","pri","prk","prl","prm","prn","pro","prp","prq","prr","prs","prt","pru","prw","prx","pry","prz","psa","psc","psd","pse","psg","psh","psi","psl","psm","psn","pso","psp","psq","psr","pss","pst","psu","psw","psy","pta","pth","pti","ptn","pto","ptp","ptq","ptr","ptt","ptu","ptv","ptw","pty","pua","pub","puc","pud","pue","puf","pug","pui","puj","puk","pum","puo","pup","puq","pur","put","puu","puw","pux","puy","puz","pwa","pwb","pwg","pwi","pwm","pwn","pwo","pwr","pww","pxm","pye","pym","pyn","pys","pyu","pyx","pyy","pzn"],["qu","qua","qub","quc","qud","quf","qug","quh","qui","quk","qul","qum","qun","qup","quq","qur","qus","quv","quw","qux","quy","quz","qva","qvc","qve","qvh","qvi","qvj","qvl","qvm","qvn","qvo","qvp","qvs","qvw","qvy","qvz","qwa","qwc","qwe","qwh","qwm","qws","qwt","qxa","qxc","qxh","qxl","qxn","qxo","qxp","qxq","qxr","qxs","qxt","qxu","qxw","qya","qyp"],["rm","rn","ro","ru","rw","raa","rab","rac","rad","raf","rag","rah","rai","raj","rak","ral","ram","ran","rao","rap","raq","rar","ras","rat","rau","rav","raw","rax","ray","raz","rbb","rbk","rbl","rbp","rcf","rdb","rea","reb","ree","reg","rei","rej","rel","rem","ren","rer","res","ret","rey","rga","rge","rgk","rgn","rgr","rgs","rgu","rhg","rhp","ria","rie","rif","ril","rim","rin","rir","rit","riu","rjg","rji","rjs","rka","rkb","rkh","rki","rkm","rkt","rkw","rma","rmb","rmc","rmd","rme","rmf","rmg","rmh","rmi","rmk","rml","rmm","rmn","rmo","rmp","rmq","rmr","rms","rmt","rmu","rmv","rmw","rmx","rmy","rmz","rna","rnd","rng","rnl","rnn","rnp","rnr","rnw","roa","rob","roc","rod","roe","rof","rog","rol","rom","roo","rop","ror","rou","row","rpn","rpt","rri","rro","rrt","rsb","rsi","rsl","rsm","rtc","rth","rtm","rts","rtw","rub","ruc","rue","ruf","rug","ruh","rui","ruk","ruo","rup","ruq","rut","ruu","ruy","ruz","rwa","rwk","rwl","rwm","rwo","rwr","rxd","rxw","ryn","rys","ryu","rzh"],["sa","sc","sd","se","sg","sh","si","sk","sl","sm","sn","so","sq","sr","ss","st","su","sv","sw","saa","sab","sac","sad","sae","saf","sah","sai","saj","sak","sal","sam","sao","sap","saq","sar","sas","sat","sau","sav","saw","sax","say","saz","sba","sbb","sbc","sbd","sbe","sbf","sbg","sbh","sbi","sbj","sbk","sbl","sbm","sbn","sbo","sbp","sbq","sbr","sbs","sbt","sbu","sbv","sbw","sbx","sby","sbz","sca","scb","sce","scf","scg","sch","sci","sck","scl","scn","sco","scp","scq","scs","sct","scu","scv","scw","scx","sda","sdb","sdc","sde","sdf","sdg","sdh","sdj","sdk","sdl","sdm","sdn","sdo","sdp","sdq","sdr","sds","sdt","sdu","sdv","sdx","sdz","sea","seb","sec","sed","see","sef","seg","seh","sei","sej","sek","sel","sem","sen","seo","sep","seq","ser","ses","set","seu","sev","sew","sey","sez","sfb","sfe","sfm","sfs","sfw","sga","sgb","sgc","sgd","sge","sgg","sgh","sgi","sgj","sgk","sgl","sgm","sgn","sgo","sgp","sgr","sgs","sgt","sgu","sgw","sgx","sgy","sgz","sha","shb","shc","shd","she","shg","shh","shi","shj","shk","shl","shm","shn","sho","shp","shq","shr","shs","sht","shu","shv","shw","shx","shy","shz","sia","sib","sid","sie","sif","sig","sih","sii","sij","sik","sil","sim","sio","sip","siq","sir","sis","sit","siu","siv","siw","six","siy","siz","sja","sjb","sjd","sje","sjg","sjk","sjl","sjm","sjn","sjo","sjp","sjr","sjs","sjt","sju","sjw","ska","skb","skc","skd","ske","skf","skg","skh","ski","skj","skk","skm","skn","sko","skp","skq","skr","sks","skt","sku","skv","skw","skx","sky","skz","sla","slc","sld","sle","slf","slg","slh","sli","slj","sll","slm","sln","slp","slq","slr","sls","slt","slu","slw","slx","sly","slz","sma","smb","smc","smd","smf","smg","smh","smi","smj","smk","sml","smm","smn","smp","smq","smr","sms","smt","smu","smv","smw","smx","smy","smz","snb","snc","sne","snf","sng","snh","sni","snj","snk","snl","snm","snn","sno","snp","snq","snr","sns","snu","snv","snw","snx","sny","snz","soa","sob","soc","sod","soe","sog","soh","soi","soj","sok","sol","son","soo","sop","soq","sor","sos","sou","sov","sow","sox","soy","soz","spb","spc","spd","spe","spg","spi","spk","spl","spm","spn","spo","spp","spq","spr","sps","spt","spu","spv","spx","spy","sqa","sqh","sqj","sqk","sqm","sqn","sqo","sqq","sqr","sqs","sqt","squ","sqx","sra","srb","src","sre","srf","srg","srh","sri","srk","srl","srm","srn","sro","srq","srr","srs","srt","sru","srv","srw","srx","sry","srz","ssa","ssb","ssc","ssd","sse","ssf","ssg","ssh","ssi","ssj","ssk","ssl","ssm","ssn","sso","ssp","ssq","ssr","sss","sst","ssu","ssv","ssx","ssy","ssz","sta","stb","std","ste","stf","stg","sth","sti","stj","stk","stl","stm","stn","sto","stp","stq","str","sts","stt","stu","stv","stw","sty","sua","sub","suc","sue","sug","sui","suj","suk","sul","sum","suo","suq","sur","sus","sut","suv","suw","sux","suy","suz","sva","svb","svc","sve","svk","svm","svr","svs","svx","swb","swc","swf","swg","swh","swi","swj","swk","swl","swm","swn","swo","swp","swq","swr","sws","swt","swu","swv","sww","swx","swy","sxb","sxc","sxe","sxg","sxk","sxl","sxm","sxn","sxo","sxr","sxs","sxu","sxw","sya","syb","syc","syd","syi","syk","syl","sym","syn","syo","syr","sys","syw","syx","syy","sza","szb","szc","szd","sze","szg","szl","szn","szp","szs","szv","szw","szy"],["ta","te","tg","th","ti","tk","tl","tn","to","tr","ts","tt","tw","ty","taa","tab","tac","tad","tae","taf","tag","tai","taj","tak","tal","tan","tao","tap","taq","tar","tas","tau","tav","taw","tax","tay","taz","tba","tbb","tbc","tbd","tbe","tbf","tbg","tbh","tbi","tbj","tbk","tbl","tbm","tbn","tbo","tbp","tbq","tbr","tbs","tbt","tbu","tbv","tbw","tbx","tby","tbz","tca","tcb","tcc","tcd","tce","tcf","tcg","tch","tci","tck","tcl","tcm","tcn","tco","tcp","tcq","tcs","tct","tcu","tcw","tcx","tcy","tcz","tda","tdb","tdc","tdd","tde","tdf","tdg","tdh","tdi","tdj","tdk","tdl","tdm","tdn","tdo","tdq","tdr","tds","tdt","tdu","tdv","tdx","tdy","tea","teb","tec","ted","tee","tef","teg","teh","tei","tek","tem","ten","teo","tep","teq","ter","tes","tet","teu","tev","tew","tex","tey","tez","tfi","tfn","tfo","tfr","tft","tga","tgb","tgc","tgd","tge","tgf","tgg","tgh","tgi","tgj","tgn","tgo","tgp","tgq","tgr","tgs","tgt","tgu","tgv","tgw","tgx","tgy","tgz","thc","thd","the","thf","thh","thi","thk","thl","thm","thn","thp","thq","thr","ths","tht","thu","thv","thw","thx","thy","thz","tia","tic","tid","tie","tif","tig","tih","tii","tij","tik","til","tim","tin","tio","tip","tiq","tis","tit","tiu","tiv","tiw","tix","tiy","tiz","tja","tjg","tji","tjj","tjl","tjm","tjn","tjo","tjp","tjs","tju","tjw","tka","tkb","tkd","tke","tkf","tkg","tkk","tkl","tkm","tkn","tkp","tkq","tkr","tks","tkt","tku","tkv","tkw","tkx","tkz","tla","tlb","tlc","tld","tlf","tlg","tlh","tli","tlj","tlk","tll","tlm","tln","tlo","tlp","tlq","tlr","tls","tlt","tlu","tlv","tlw","tlx","tly","tma","tmb","tmc","tmd","tme","tmf","tmg","tmh","tmi","tmj","tmk","tml","tmm","tmn","tmo","tmp","tmq","tmr","tms","tmt","tmu","tmv","tmw","tmy","tmz","tna","tnb","tnc","tnd","tne","tnf","tng","tnh","tni","tnk","tnl","tnm","tnn","tno","tnp","tnq","tnr","tns","tnt","tnu","tnv","tnw","tnx","tny","tnz","tob","toc","tod","toe","tof","tog","toh","toi","toj","tol","tom","too","top","toq","tor","tos","tou","tov","tow","tox","toy","toz","tpa","tpc","tpe","tpf","tpg","tpi","tpj","tpk","tpl","tpm","tpn","tpo","tpp","tpq","tpr","tpt","tpu","tpv","tpw","tpx","tpy","tpz","tqb","tql","tqm","tqn","tqo","tqp","tqq","tqr","tqt","tqu","tqw","tra","trb","trc","trd","tre","trf","trg","trh","tri","trj","trk","trl","trm","trn","tro","trp","trq","trr","trs","trt","tru","trv","trw","trx","try","trz","tsa","tsb","tsc","tsd","tse","tsf","tsg","tsh","tsi","tsj","tsk","tsl","tsm","tsp","tsq","tsr","tss","tst","tsu","tsv","tsw","tsx","tsy","tsz","tta","ttb","ttc","ttd","tte","ttf","ttg","tth","tti","ttj","ttk","ttl","ttm","ttn","tto","ttp","ttq","ttr","tts","ttt","ttu","ttv","ttw","tty","ttz","tua","tub","tuc","tud","tue","tuf","tug","tuh","tui","tuj","tul","tum","tun","tuo","tup","tuq","tus","tut","tuu","tuv","tuw","tux","tuy","tuz","tva","tvd","tve","tvk","tvl","tvm","tvn","tvo","tvs","tvt","tvu","tvw","tvx","tvy","twa","twb","twc","twd","twe","twf","twg","twh","twl","twm","twn","two","twp","twq","twr","twt","twu","tww","twx","twy","txa","txb","txc","txe","txg","txh","txi","txj","txm","txn","txo","txq","txr","txs","txt","txu","txx","txy","tya","tye","tyh","tyi","tyj","tyl","tyn","typ","tyr","tys","tyt","tyu","tyv","tyx","tyy","tyz","tza","tzh","tzj","tzl","tzm","tzn","tzo","tzx"],["ug","uk","ur","uz","uam","uan","uar","uba","ubi","ubl","ubr","ubu","uby","uda","ude","udg","udi","udj","udl","udm","udu","ues","ufi","uga","ugb","uge","ugn","ugo","ugy","uha","uhn","uis","uiv","uji","uka","ukg","ukh","uki","ukk","ukl","ukp","ukq","uks","uku","ukv","ukw","uky","ula","ulb","ulc","ule","ulf","uli","ulk","ull","ulm","uln","ulu","ulw","uma","umb","umc","umd","umg","umi","umm","umn","umo","ump","umr","ums","umu","una","und","une","ung","uni","unk","unm","unn","unp","unr","unu","unx","unz","uok","upi","upv","ura","urb","urc","ure","urf","urg","urh","uri","urj","urk","url","urm","urn","uro","urp","urr","urt","uru","urv","urw","urx","ury","urz","usa","ush","usi","usk","usp","uss","usu","uta","ute","uth","utp","utr","utu","uum","uun","uur","uuu","uve","uvh","uvl","uwa","uya","uzn","uzs"],["ve","vi","vo","vaa","vae","vaf","vag","vah","vai","vaj","val","vam","van","vao","vap","var","vas","vau","vav","vay","vbb","vbk","vec","ved","vel","vem","veo","vep","ver","vgr","vgt","vic","vid","vif","vig","vil","vin","vis","vit","viv","vka","vki","vkj","vkk","vkl","vkm","vkn","vko","vkp","vkt","vku","vkz","vlp","vls","vma","vmb","vmc","vmd","vme","vmf","vmg","vmh","vmi","vmj","vmk","vml","vmm","vmp","vmq","vmr","vms","vmu","vmv","vmw","vmx","vmy","vmz","vnk","vnm","vnp","vor","vot","vra","vro","vrs","vrt","vsi","vsl","vsv","vto","vum","vun","vut","vwa"],["wa","wo","waa","wab","wac","wad","wae","waf","wag","wah","wai","waj","wak","wal","wam","wan","wao","wap","waq","war","was","wat","wau","wav","waw","wax","way","waz","wba","wbb","wbe","wbf","wbh","wbi","wbj","wbk","wbl","wbm","wbp","wbq","wbr","wbs","wbt","wbv","wbw","wca","wci","wdd","wdg","wdj","wdk","wdu","wdy","wea","wec","wed","weg","weh","wei","wem","wen","weo","wep","wer","wes","wet","weu","wew","wfg","wga","wgb","wgg","wgi","wgo","wgu","wgw","wgy","wha","whg","whk","whu","wib","wic","wie","wif","wig","wih","wii","wij","wik","wil","wim","win","wir","wit","wiu","wiv","wiw","wiy","wja","wji","wka","wkb","wkd","wkl","wkr","wku","wkw","wky","wla","wlc","wle","wlg","wlh","wli","wlk","wll","wlm","wlo","wlr","wls","wlu","wlv","wlw","wlx","wly","wma","wmb","wmc","wmd","wme","wmg","wmh","wmi","wmm","wmn","wmo","wms","wmt","wmw","wmx","wnb","wnc","wnd","wne","wng","wni","wnk","wnm","wnn","wno","wnp","wnu","wnw","wny","woa","wob","woc","wod","woe","wof","wog","woi","wok","wom","won","woo","wor","wos","wow","woy","wpc","wra","wrb","wrd","wrg","wrh","wri","wrk","wrl","wrm","wrn","wro","wrp","wrr","wrs","wru","wrv","wrw","wrx","wry","wrz","wsa","wsg","wsi","wsk","wsr","wss","wsu","wsv","wtf","wth","wti","wtk","wtm","wtw","wua","wub","wud","wuh","wul","wum","wun","wur","wut","wuu","wuv","wux","wuy","wwa","wwb","wwo","wwr","www","wxa","wxw","wya","wyb","wyi","wym","wyr","wyy"],["xh","xaa","xab","xac","xad","xae","xag","xai","xaj","xak","xal","xam","xan","xao","xap","xaq","xar","xas","xat","xau","xav","xaw","xay","xba","xbb","xbc","xbd","xbe","xbg","xbi","xbj","xbm","xbn","xbo","xbp","xbr","xbw","xbx","xby","xcb","xcc","xce","xcg","xch","xcl","xcm","xcn","xco","xcr","xct","xcu","xcv","xcw","xcy","xda","xdc","xdk","xdm","xdo","xdy","xeb","xed","xeg","xel","xem","xep","xer","xes","xet","xeu","xfa","xga","xgb","xgd","xgf","xgg","xgi","xgl","xgm","xgn","xgr","xgu","xgw","xha","xhc","xhd","xhe","xhr","xht","xhu","xhv","xia","xib","xii","xil","xin","xip","xir","xis","xiv","xiy","xjb","xjt","xka","xkb","xkc","xkd","xke","xkf","xkg","xkh","xki","xkj","xkk","xkl","xkn","xko","xkp","xkq","xkr","xks","xkt","xku","xkv","xkw","xkx","xky","xkz","xla","xlb","xlc","xld","xle","xlg","xli","xln","xlo","xlp","xls","xlu","xly","xma","xmb","xmc","xmd","xme","xmf","xmg","xmh","xmj","xmk","xml","xmm","xmn","xmo","xmp","xmq","xmr","xms","xmt","xmu","xmv","xmw","xmx","xmy","xmz","xna","xnb","xnd","xng","xnh","xni","xnj","xnk","xnm","xnn","xno","xnq","xnr","xns","xnt","xnu","xny","xnz","xoc","xod","xog","xoi","xok","xom","xon","xoo","xop","xor","xow","xpa","xpb","xpc","xpd","xpe","xpf","xpg","xph","xpi","xpj","xpk","xpl","xpm","xpn","xpo","xpp","xpq","xpr","xps","xpt","xpu","xpv","xpw","xpx","xpy","xpz","xqa","xqt","xra","xrb","xrd","xre","xrg","xri","xrm","xrn","xrq","xrr","xrt","xru","xrw","xsa","xsb","xsc","xsd","xse","xsh","xsi","xsj","xsl","xsm","xsn","xso","xsp","xsq","xsr","xss","xsu","xsv","xsy","xta","xtb","xtc","xtd","xte","xtg","xth","xti","xtj","xtl","xtm","xtn","xto","xtp","xtq","xtr","xts","xtt","xtu","xtv","xtw","xty","xtz","xua","xub","xud","xug","xuj","xul","xum","xun","xuo","xup","xur","xut","xuu","xve","xvi","xvn","xvo","xvs","xwa","xwc","xwd","xwe","xwg","xwj","xwk","xwl","xwo","xwr","xwt","xww","xxb","xxk","xxm","xxr","xxt","xya","xyb","xyj","xyk","xyl","xyt","xyy","xzh","xzm","xzp"],["yi","yo","yaa","yab","yac","yad","yae","yaf","yag","yah","yai","yaj","yak","yal","yam","yan","yao","yap","yaq","yar","yas","yat","yau","yav","yaw","yax","yay","yaz","yba","ybb","ybd","ybe","ybh","ybi","ybj","ybk","ybl","ybm","ybn","ybo","ybx","yby","ych","ycl","ycn","ycp","yda","ydd","yde","ydg","ydk","yds","yea","yec","yee","yei","yej","yel","yen","yer","yes","yet","yeu","yev","yey","yga","ygi","ygl","ygm","ygp","ygr","ygs","ygu","ygw","yha","yhd","yhl","yhs","yia","yif","yig","yih","yii","yij","yik","yil","yim","yin","yip","yiq","yir","yis","yit","yiu","yiv","yix","yiy","yiz","yka","ykg","yki","ykk","ykl","ykm","ykn","yko","ykr","ykt","yku","yky","yla","ylb","yle","ylg","yli","yll","ylm","yln","ylo","ylr","ylu","yly","yma","ymb","ymc","ymd","yme","ymg","ymh","ymi","ymk","yml","ymm","ymn","ymo","ymp","ymq","ymr","yms","ymt","ymx","ymz","yna","ynd","yne","yng","ynh","ynk","ynl","ynn","yno","ynq","yns","ynu","yob","yog","yoi","yok","yol","yom","yon","yos","yot","yox","yoy","ypa","ypb","ypg","yph","ypk","ypm","ypn","ypo","ypp","ypz","yra","yrb","yre","yri","yrk","yrl","yrm","yrn","yro","yrs","yrw","yry","ysc","ysd","ysg","ysl","ysm","ysn","yso","ysp","ysr","yss","ysy","yta","ytl","ytp","ytw","yty","yua","yub","yuc","yud","yue","yuf","yug","yui","yuj","yuk","yul","yum","yun","yup","yuq","yur","yut","yuu","yuw","yux","yuy","yuz","yva","yvt","ywa","ywg","ywl","ywn","ywq","ywr","ywt","ywu","yww","yxa","yxg","yxl","yxm","yxu","yxy","yyr","yyu","yyz","yzg","yzk"],["za","zh","zu","zaa","zab","zac","zad","zae","zaf","zag","zah","zai","zaj","zak","zal","zam","zao","zap","zaq","zar","zas","zat","zau","zav","zaw","zax","zay","zaz","zba","zbc","zbe","zbl","zbt","zbu","zbw","zca","zch","zdj","zea","zeg","zeh","zen","zga","zgb","zgh","zgm","zgn","zgr","zhb","zhd","zhi","zhn","zhw","zhx","zia","zib","zik","zil","zim","zin","zir","ziw","ziz","zka","zkb","zkd","zkg","zkh","zkk","zkn","zko","zkp","zkr","zkt","zku","zkv","zkz","zla","zle","zlj","zlm","zln","zlq","zls","zlw","zma","zmb","zmc","zmd","zme","zmf","zmg","zmh","zmi","zmj","zmk","zml","zmm","zmn","zmo","zmp","zmq","zmr","zms","zmt","zmu","zmv","zmw","zmx","zmy","zmz","zna","znd","zne","zng","znk","zns","zoc","zoh","zom","zoo","zoq","zor","zos","zpa","zpb","zpc","zpd","zpe","zpf","zpg","zph","zpi","zpj","zpk","zpl","zpm","zpn","zpo","zpp","zpq","zpr","zps","zpt","zpu","zpv","zpw","zpx","zpy","zpz","zqe","zra","zrg","zrn","zro","zrp","zrs","zsa","zsk","zsl","zsm","zsr","zsu","zte","ztg","ztl","ztm","ztn","ztp","ztq","zts","ztt","ztu","ztx","zty","zua","zuh","zum","zun","zuy","zwa","zxx","zyb","zyg","zyj","zyn","zyp","zza","zzj"]],a=function(){function e(){}return e.isBcp47=function(e){return/^(([a-zA-Z]{2,3}(-[a-zA-Z](-[a-zA-Z]{3}){0,2})?|[a-zA-Z]{4}|[a-zA-Z]{5,8})(-[a-zA-Z]{4})?(-([a-zA-Z]{2}|[0-9]{3}))?(-([0-9a-zA-Z]{5,8}|[0-9][a-zA-Z]{3}))*(-[0-9a-wy-zA-WY-Z](-[a-zA-Z0-9]{2,8})+)*(-x(-[a-zA-Z0-9]{1,8})+)?|x(-[a-zA-Z0-9]{1,8})+|(en-GB-oed|i-ami|i-bnn|i-default|i-enochian|i-hak|i-klingon|i-lux|i-mingo|i-navajo|i-pwn|i-tao|i-tay|i-tsu|sgn-BE-FR|sgn-BE-NL|sgn-CH-DE|art-lojban|cel-gaulish|no-bok|no-nyn|zh-guoyu|zh-hakka|zh-min|zh-min-nan|zh-xiang))$/.test(e)},e.validPrimaryLang=function(e){var t=e.toLowerCase();return t.includes("-")&&(t=t.split("-")[0]),!!t.match(/[a-z]{2,3}/)&&(3===t.length&&"q"===t.charAt(0)&&t.charCodeAt(1)>=97&&t.charCodeAt(1)<=116&&t.charCodeAt(2)>=97&&t.charCodeAt(2),i[t.charCodeAt(0)-97].includes(t))},e.matchPrimaryLang=function(e,t){var i=e;i.includes("-")&&(i=i.split("-")[0]);var a=t;return a.includes("-")&&(a=a.split("-")[0]),i.toLowerCase()===a.toLowerCase()},e}();t.LangUtil=a},3103(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.CommonMapper=void 0;var a=i(3864),n=function(){function e(){this.hierarchyRole=null,this.hierarchyPath=null,this.hierarchyResults=null}return e.prototype.getBounds=function(e){return null},e.prototype.reset=function(e){this.hierarchyRole=[],this.hierarchyResults=[],this.hierarchyPath=[{rolePath:"",roleCount:{}}];for(var t=[],i=a.DOMWalker.parentNode(e);i&&9!=i.nodeType;)t.push(i),i=a.DOMWalker.parentNode(i);for(var n=0,l=t=t.reverse();n<l.length;n++){for(var r=l[n],o=[],s=r.previousSibling;s;)o.push(s),s=s.previousSibling;for(var u=0,d=o=o.reverse();u<d.length;u++){var c=d[u];this.pushHierarchy(c),this.popHierarchy()}this.pushHierarchy(r)}},e.prototype.pushHierarchy=function(e){var t=this.getRole(e)||null;if(this.hierarchyRole.push(t),null!==t){var i=this.hierarchyPath[this.hierarchyPath.length-1];i.roleCount[t]=(i.roleCount[t]||0)+1,this.hierarchyPath.push({rolePath:i.rolePath+"/"+t+"["+i.roleCount[t]+"]",roleCount:{}})}var a={};1===e.nodeType&&(a=this.getAttributes(e)),this.hierarchyResults.push({node:e,namespace:this.getNamespace(),role:t,attributes:a,rolePath:this.hierarchyPath[this.hierarchyPath.length-1].rolePath,bounds:this.getBounds(e)})},e.prototype.popHierarchy=function(){null!==this.hierarchyRole.pop()&&this.hierarchyPath.pop(),this.hierarchyResults.pop()},e.prototype.openScope=function(e){return null===this.hierarchyRole&&this.reset(e),this.pushHierarchy(e),this.hierarchyResults},e.prototype.closeScope=function(e){for(var t=[],i=0,a=this.hierarchyResults;i<a.length;i++){var n=a[i];t.push(n)}return t[t.length-1].role="/"+t[t.length-1].role,this.popHierarchy(),t},e}();t.CommonMapper=n},920(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.Context=t.PartInfo=t.AttrInfo=void 0;var i=function(){function e(e,t,i,a){if(this.inclusive=e,this.attr=t,this.eq=i,this.value=a,!e&&void 0!==i&&i.length>0)throw new Error("Cannot have !attr"+i+" context");if(e&&void 0!==i&&i.length>0&&(void 0===a||0===a.length))throw new Error("Cannot have equivalence check without a value")}return e.prototype.matches=function(e){var t=this,i=e.attributes;if(t.attr in i){if(t.inclusive){if(t.eq){var a=i[t.attr];if("="===t.eq)return t.value===a;if("!="===t.eq)return t.value!==a;if("~"===t.eq)return t.value===a;if("!~"===t.eq)return t.value!==a;throw new Error("Context equivalence operator not supported")}return!0}return!1}return!t.inclusive},e}();t.AttrInfo=i;var a=function(){function e(e,t,i,a,n){if(this.inclusive=e,this.namespace=t,this.role=i,this.attrs=a,this.connector=n,"*"===i&&!e)throw new Error("!* context not supported")}return e.prototype.matches=function(e,t){var i=this,a=i.namespace in e&&e[i.namespace][t]&&(e[i.namespace][t].role===i.role||"none"!==e[i.namespace][t].role&&"*"===i.role);if(!a||"*"!==i.role||"dom"!==i.namespace||"#text"!==e[i.namespace][t].role&&"/#text"!==e[i.namespace][t].role||(a=!1),i.inclusive&&!a)return!1;if(!i.inclusive&&!a)return!0;for(var n=i.attrs,l=e[i.namespace][t],r=!0,o=0,s=n;o<s.length;o++){var u=s[o];r=r&&u.matches(l)}return i.inclusive||(r=!r),r},e}();t.PartInfo=a;var n=function(){function e(e){this.contextInfo=[];for(var t=[],n=0,l=e.match(/!?[/a-zA-Z:0-9*\-_]+(\[[^\]]+\])*[ >+~]?/g);n<l.length;n++){for(var r=l[n].match(/(!?)([/a-zA-Z:0-9*\-_]+)((\[[^\]]+\])*)([ >+~]?)/),o=[],s=0,u=r[3].match(/\[([^\]]+)\]/g)||[];s<u.length;s++){var d=u[s].match(/\[(!?)([a-z:A-Z*\-_]+)(!?[=~])?([^\]]+)?\]/);o.push(new i("!"!==d[1],d[2].toLowerCase(),d[3],d[4]))}r[2]=r[2].toLowerCase();var c=r[2].split(":"),m="!"!==r[1],p=c.shift(),h=c.join(":"),g=new a(m,p,h,o,r[r.length-1]);t.push(g)}this.contextInfo=t}return e.cleanContext=function(e){return(e=(e=(e=(e=(e=e.toLowerCase().trim()).replace(/ +!/g," !")).replace(/ +([>+~,])/g,"$1")).replace(/([>+~,]) +/g,"$1")).replace(/ +/g," ")).trim()},e.parse=function(t){for(var i=e.splitMultiple(e.cleanContext(t)),a=[],n=0;n<i.length;++n){var l=new e(i[n]);a.push(l)}return a},e.splitMultiple=function(e){var t=[];if(e)if(-1===e.indexOf(","))t.push(e);else for(var i=0,a=e.split(",");i<a.length;i++){var n=a[i];t.push(n)}return t},e}();t.Context=n},7301(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.Engine=void 0;var a=i(3864),n=i(920),l=i(4516),r=i(7507),o=i(1686),s=i(4566),u=i(461),d=i(3946),c=function(){function e(e,t){this.rule=e,this.parsedInfo=t,this.ns=this.parsedInfo.contextInfo[this.parsedInfo.contextInfo.length-1].namespace,l.Config.DEBUG&&console.log("Added Rule:",e.id,JSON.stringify(this.parsedInfo))}return e.convertNodeToSnippet=function(e){var t="";t+="<"+e.nodeName.toLowerCase();var i=e.attributes;if(null!=i)for(var a=i.length-1;a>=0;a--)"data-namewalk"!==i[a].name&&(t+=" "+i[a].name+'="'+i[a].value+'"');return t+">"},e.convertNodeToSource=function(e,t){if(void 0===t&&(t=!1),!t||!e)return null;var i="ibm-a11y-debug",n=function(e){return e&&"end"!==e.toLowerCase()?{found:!0,stop:!1,source:e}:{found:!0,stop:!0}},l=function(e){if(!e)return{found:!1};var t=null;if(e.nodeType===Node.COMMENT_NODE)t=e.nodeValue;else if(e.nodeType===Node.ELEMENT_NODE)for(var a=e.firstChild;a;){if(a.nodeType!==Node.TEXT_NODE){if(a.nodeType===Node.COMMENT_NODE){t=a.nodeValue;break}break}if(a.nodeValue&&a.nodeValue.trim().length>0)break;a=a.nextSibling}if(null!==t){var l=t.trim();if(l===i||l.startsWith(i+":")||l.startsWith(i+" ")||l.startsWith(i+"\t")){var r=l.substring(14).trimStart(),o=r.startsWith(":")?r.substring(1).trim():r.trim();return n(o)}}return{found:!1}},r=function(e){if(e.nodeType!==Node.ELEMENT_NODE)return{found:!1};var t=e.getAttribute(i);return null===t?{found:!1}:n(t.trim())},o=r(e);return o.found?o.stop?null:o.source:function(e){for(var t=e;t;){for(var i=a.DOMWalker.previousSiblingNotOwnedBySlot(t);i;){var n=l(i);if(n.found)return n.stop?null:n.source;i=a.DOMWalker.previousSiblingNotOwnedBySlot(i)}var o=a.DOMWalker.parentNode(t);if(!o||o.nodeType===Node.DOCUMENT_NODE)return null;var s=r(o);if(s.found)return s.stop?null:s.source;t=o}return null}(e)},e.prototype.run=function(t,i,a,n){var l,r=(new Date).getTime();try{l=this.rule.run(i,a,n)}catch(e){var o=e;throw console.error("RULE EXCEPTION:",this.rule.id,i.dom.rolePath,o.stack),e}var s=(new Date).getTime();l||(l=[]),l instanceof Array||(l=[l]);for(var u=[],d=0,c=l;d<c.length;d++){var m=c[d],p=t.getMessage(this.rule.id,m.reasonId,m.messageArgs),h={};for(var g in i)h[g]=i[g].rolePath;var b=this.rule.id.replace(/^(.*)\$\$\d+$/,"$1");u.push({ruleId:b,value:m.value,node:i.dom.node,path:h,ruleTime:s-r,reasonId:m.reasonId,message:p,messageArgs:m.messageArgs,apiArgs:m.apiArgs,bounds:i.dom.bounds,snippet:e.convertNodeToSnippet(i.dom.node),source:e.convertNodeToSource(i.dom.node,t.isSourceMapEnabled())})}return u},e}(),m=function(){function e(){this.mappers={},this.ruleMap={},this.wrappedRuleMap={},this.nlsMap={},this.helpMap={},this.sourceMapEnabled=!1,this.inclRules={},this.exclRules={},this.addMapper(new r.DOMMapper)}return e.getLanguages=function(){var e="undefined"!=typeof process&&void 0===process.nodeType&&process.env,t="en-US";return e&&(t=(t=e.LANG||e.LANGUAGE||e.LC_ALL||e.LC_MESSAGES)&&t.length>0?t.split(".")[0].replace(/_/g,"-"):"en-US"),"undefined"!=typeof navigator&&navigator.languages||[t]},e.prototype.run=function(e,t){if(null===e)return Promise.reject("null document");9===e.nodeType&&(e=e.documentElement),e.ownerDocument&&(e.ownerDocument.PT_CHECK_HIDDEN_CONTENT=!1);var i=s.CacheUtil.clearCaches(e),n=new a.DOMWalker(e,!1,e,!0),l={results:[],numExecuted:0,ruleTime:0,totalTime:0},r=(new Date).getTime();for(var c in this.mappers)this.mappers[c].reset(e);var m=0,p=-1;do{m++;var h=Math.floor(m/i*100);h>p&&(i>1e4&&console.log("Progress: ".concat(h,"% (").concat(m,"/").concat(i," nodes)")),p=h);var g={};for(var c in this.mappers)n.bEndTag?g[c]=this.mappers[c].closeScope(n.node):g[c]=this.mappers[c].openScope(n.node);if(11!==n.node.nodeType&&(d.VisUtil.isNodeVisible(n.node)||"meta"===n.node.nodeName.toLowerCase()||"style"===n.node.nodeName.toLowerCase()||"datalist"===n.node.nodeName.toLowerCase()||"param"===n.node.nodeName.toLowerCase()||!o.DOMUtil.getAncestor(n.node,["body"]))){var b={};for(var _ in g){var f=g[_],v=f[f.length-1];b[_]=v}for(var A={},w=0,y=this.getMatchingRules(g);w<y.length;w++){for(var C=y[w],k=!0,R=0,x=C.rule.dependencies||[];R<x.length;R++)A[x[R]]||(k=!1);if(k){var P=[];(new Date).getTime();try{P=C.run(this,b,t,g)}catch(e){}0===P.length&&(A[C.rule.id]=!0);for(var T=0,U=P;T<U.length;T++){var I=U[T];l.results.push(I),l.ruleTime+=I.ruleTime,l.numExecuted++,I.value[1]===u.eRuleConfidence.PASS&&(A[I.ruleId]=!0)}}}}}while(n.nextNode());return s.CacheUtil.clearCaches(e),l.totalTime=(new Date).getTime()-r,Promise.resolve(l)},e.prototype.enableRules=function(e){for(var t in this.ruleMap)this.ruleMap[t].enabled=!1;for(var i=0,a=e||[];i<a.length;i++)(t=a[i])in this.ruleMap?this.ruleMap[t].enabled=!0:console.warn("WARNING: Rule Id",t,"could not be enabled.")},e.prototype.getRule=function(e){return this.ruleMap[e]},e.prototype.getRulesIds=function(){var e=[];for(var t in this.ruleMap)e.push(t);return e},e.prototype.addRules=function(e){for(var t=0,i=e;t<i.length;t++){var a=i[t];this.addRule(a,!0)}this._sortRules()},e.prototype.addRule=function(e,t){var i=n.Context.parse(e.context),a=0,l=e.id;if(l in this.ruleMap)console.log("WARNING: Rule",l,"already added to engine. Ignoring...");else{this.ruleMap[l]=e;for(var r=0,o=i;r<o.length;r++){var s=o[r],u=l;a>=1&&(u=l+"$$"+a),++a;var d=new c(e,s);this.wrappedRuleMap[u]=d;var m=d.parsedInfo.contextInfo,p=m[m.length-1],h=p.namespace+":"+p.role;p.inclusive?(this.inclRules[h]=this.inclRules[h]||[],this.inclRules[h].push(d)):(this.exclRules[h]=this.exclRules[h]||[],this.exclRules[h].push(d))}t||this._sortRules()}},e.prototype.enableSourceMap=function(e){this.sourceMapEnabled=e},e.prototype.isSourceMapEnabled=function(){return this.sourceMapEnabled},e.prototype._sortRules=function(){for(var e in this.inclRules)this.inclRules[e].sort(function(e,t){var i=e.rule.dependencies&&e.rule.dependencies.length>0;return t.rule.dependencies&&t.rule.dependencies.length>0&&t.rule.dependencies.includes(e.rule.id)?-1:i&&e.rule.dependencies.includes(t.rule.id)?1:0});for(var e in this.exclRules)this.exclRules[e].sort(function(e,t){var i=e.rule.dependencies&&e.rule.dependencies.length>0;return t.rule.dependencies&&t.rule.dependencies.length>0&&t.rule.dependencies.includes(e.rule.id)?-1:i&&e.rule.dependencies.includes(t.rule.id)?1:0})},e.prototype.addNlsMap=function(e){for(var t in e)this.nlsMap[t]=e[t]},e.prototype.addHelpMap=function(e){for(var t in e)this.helpMap[t]=e[t]},e.prototype.getMessage=function(e,t,i){var a=e.indexOf("$$");if(a>=0&&(e=e.substring(0,a)),!(e in this.nlsMap))return e;var n=this.nlsMap[e][t||0];return n?n.replace(/\{(\d+)\}/g,function(e,t,a){return i[t]}):e+"_"+t},e.prototype.getHelp=function(e,t,i){return i||(i="latest"),"".concat(l.Config.helpRoot,"/").concat(i,"/doc").concat(this.getHelpRel(e,t))},e.prototype.getHelpRel=function(e,t){var i=e.indexOf("$$");return i>=0&&(e=e.substring(0,i)),e in this.helpMap?((t=t||0)in this.helpMap[e]?this.helpMap[e][t||0]:this.helpMap[e][0])||e+"_"+t:e},e.prototype.addMapper=function(e){this.mappers[e.getNamespace()]=e},e.match=function(e,t){var i=e.parsedInfo.contextInfo,a=i.length-1,n=i[a].namespace,l=t[n][t[n].length-1],r=l.node;if(!i[a].matches(t,t[n].length-1))return!1;if(1===i.length)return!0;if(l=t[n=i[0].namespace][t[n].length-1],--a,i.slice(0,i.length-1).some(function(e){return e.namespace!==n}))return console.error("[ERROR] Rule ".concat(e.rule.id," has inconsitent parent namespaces")),!1;for(var o=t[n].length-(l.node.isSameNode(r)?2:1);o>=0&&a>=0;){var s=i[a],u=i[a].matches(t,o);if(">"===s.connector){if(!u)return!1;--a,--o}else{if(" "!==s.connector)throw new Error("Context connector "+s.connector+" is not supported");if(s.inclusive)u&&--a,--o;else{if(!u)return!1;for(var d=!1,c=o-1;!d&&c>=0;--c)d=!i[a].matches(t,c);if(d)return!1;--a}}}return-1===a},e.prototype.getMatchingRules=function(t){var i=[];function a(a){for(var n=0,l=a;n<l.length;n++){var r=l[n];r.rule.enabled&&e.match(r,t)&&i.push(r)}}for(var n in t){var l=n+":"+(t[n].length>0?t[n][t[n].length-1].role:"none");for(var r in l in this.inclRules&&a(this.inclRules[l]),this.exclRules)r!==l&&a(this.exclRules[r]);l!==n+":none"&&(l.startsWith(n+":/")?n+":/*"in this.inclRules&&a(this.inclRules[n+":/*"]):n+":*"in this.inclRules&&a(this.inclRules[n+":*"]))}return this.sortDeps(i)},e.prototype.sortDeps=function(e){for(var t=[],i=0,a=e;i<a.length;i++){var n=a[i];t.push(n)}var l=[],r={},o=!1;do{o=!1;for(var s=0;s<t.length;++s){var u=t[s];if(!(u.rule.id in r)){var d=!0;if(u.rule.dependencies&&u.rule.dependencies.length>0)for(var c=0,m=u.rule.dependencies;c<m.length;c++)m[c]in r||(d=!1);d&&(o=!0,l.push(u),r[u.rule.id]=!0,t.splice(s--,1))}}}while(o);return l},e}();t.Engine=m},4516(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.Config=void 0;var i=function(){function e(){}return e.DEBUG=!1,e.helpRoot="https://able.ibm.com/rules/archives",e}();t.Config=i},7507(e,t,i){var a,n=this&&this.__extends||(a=function(e,t){return a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i])},a(e,t)},function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function i(){this.constructor=e}a(e,t),e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)});Object.defineProperty(t,"__esModule",{value:!0}),t.DOMMapper=void 0;var l=i(3103),r=i(4566),o=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.getRole=function(e){return e.nodeName.toLowerCase()},t.prototype.getNamespace=function(){return"dom"},t.prototype.getAttributes=function(e){var t={};if(1===e.nodeType)for(var i=e,a=0;a<i.attributes.length;++a){var n=i.attributes[a];t[n.name.toLowerCase()]=n.nodeValue}return t},t.prototype.getBounds=function(e){if(1!==e.nodeType)return null;var t=r.CacheUtil.getCache(e,"DOMMapper_Bounds",void 0);if(void 0!==t)return t;var i=1;e.ownerDocument&&e.ownerDocument.defaultView&&e.ownerDocument.defaultView.devicePixelRatio&&(i=e.ownerDocument.defaultView.devicePixelRatio);var a=e.getBoundingClientRect();if(a){var n=e&&e.ownerDocument&&e.ownerDocument.defaultView&&e.ownerDocument.defaultView.scrollX||0,l=e&&e.ownerDocument&&e.ownerDocument.defaultView&&e.ownerDocument.defaultView.scrollY||0,o={left:Math.ceil((a.left+n)*i),top:Math.ceil((a.top+l)*i),height:Math.ceil(a.height*i),width:Math.ceil(a.width*i)};return r.CacheUtil.setCache(e,"DOMMapper_Bounds",o),o}return null},t.prototype.getUnadjustedBounds=function(e){if(1!==e.nodeType)return null;var t=r.CacheUtil.getCache(e,"DOMMapper_UnadjustedBounds",void 0);if(void 0!==t)return t;var i=e.getBoundingClientRect();if(i){var a=e&&e.ownerDocument&&e.ownerDocument.defaultView&&e.ownerDocument.defaultView.scrollX||0,n=e&&e.ownerDocument&&e.ownerDocument.defaultView&&e.ownerDocument.defaultView.scrollY||0,l={left:Math.ceil(i.left+a),top:Math.ceil(i.top+n),height:Math.ceil(i.height),width:Math.ceil(i.width)};return r.CacheUtil.setCache(e,"DOMMapper_UnadjustedBounds",l),l}return null},t}(l.CommonMapper);t.DOMMapper=o},1686(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.DOMUtil=void 0;var a=i(3864),n=function(){function e(){}return e.hasParent=function(e,t){for(var i=a.DOMWalker.parentElement(e);i&&!t.includes(i.nodeName);)i=a.DOMWalker.parentElement(i);return!!i},e.getAncestor=function(e,t){for(var i=a.DOMWalker.parentElement(e);i&&!t.includes(i.nodeName.toLowerCase());)i=a.DOMWalker.parentElement(i);return i},e.sameNode=function(e,t){return e===t||(e.isSameNode?e.isSameNode(t):!e.compareDocumentPosition||0===e.compareDocumentPosition(t))},e.cleanWhitespace=function(e){return e.replace(/[ \t\r\n]/g," ").replace(/ +/g," ")},e.cleanSpace=function(e){return e.replace(/ +/g," ")},e.isInSameTable=function(t,i){if(t&&i){var a=["table"],n=e.getAncestor(t,a),l=e.getAncestor(i,a);if(null!==n&&null!=l&&e.sameNode(n,l))return!0}return!1},e.shadowRootNode=function(e){for(var t=e;null!=t&&11!==t.nodeType;)t=t.parentNode;return t},e.objectCopyWithNodeRefs=function(e){if(!e)return e;if("object"!=typeof e)return"function"==typeof e?e:JSON.parse(JSON.stringify(e));if(e instanceof Node||e.nodeType)return e;var t=void 0;if("Array"===e.constructor.name){t=[];for(var i=0,a=e;i<a.length;i++){var n=a[i];t.push(this.objectCopyWithNodeRefs(n))}}else for(var l in t={},e)t[l]=this.objectCopyWithNodeRefs(e[l]);return t},e.getAncestorWithAttribute=function(e,t,i){for(var n=a.DOMWalker.parentNode(e);null!==n;){if(1===n.nodeType&&n.getAttribute(t)===i)return n;n=a.DOMWalker.parentNode(n)}return null},e}();t.DOMUtil=n},3864(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.DOMWalker=void 0;var a=i(3946),n=function(){function e(e,t,i,a,n){this.DEBUGIDX=0,this.indent=0,this.DEBUG=!!n,this.root=i||(e&&e.ownerDocument?e.ownerDocument.documentElement:e),9===this.root.nodeType&&(this.root=this.root.documentElement),this.node=e,9===this.node.nodeType&&(this.node=this.node.documentElement),this.bEndTag=null!=t&&1==t,this.considerHidden=a||!1}return e.prototype.elem=function(){return 1===this.node.nodeType&&this.node||null},e.parentNode=function(e){if(null===e)return null;var t=e.parentNode;return e.slotOwner?t=e.slotOwner:e.ownerElement?t=e.ownerElement:t&&11===t.nodeType&&(t=t.host?t.host:null),t},e.parentElement=function(t){var i=t;do{i=e.parentNode(i)}while(i&&1!==i.nodeType);return i},e.assignSlots=function(e){for(var t=e.querySelectorAll("slot"),i=0;i<t.length;++i)for(var a=t[i],n=a.assignedNodes(),l=0;l<n.length;++l)n[l].slotOwner=a,n[l].slotIndex=l},e.firstChildNotOwnedBySlot=function(e){for(var t=e.firstChild;t&&t.slotOwner;)t=t.nextSibling;return t},e.lastChildNotOwnedBySlot=function(e){for(var t=e.lastChild;t&&t.slotOwner;)t=t.previousSibling;return t},e.nextSiblingNotOwnedBySlot=function(e){for(var t=e.nextSibling;t&&t.slotOwner;)t=t.nextSibling;return t},e.previousSiblingNotOwnedBySlot=function(e){for(var t=e.previousSibling;t&&t.slotOwner;)t=t.previousSibling;return t},e.prototype.atRoot=function(){return!this.node.ownerElement&&(this.root===this.node||(this.root.isSameNode?this.root.isSameNode(this.node):this.root.compareDocumentPosition?0===this.root.compareDocumentPosition(this.node):null===this.node.parentNode))},e.prototype.nextNode=function(){var t=this,i=function(){for(var e="",i=0;i<t.indent;++i)e+=" ";return e},n=this.node.nodeName;if(!this.node)return this.bEndTag=!1,!1;do{if(this.bEndTag){if(this.atRoot())return!1;if(this.node.slotOwner){var l=this.node.slotOwner,r=this.node.slotIndex+1;r<l.assignedNodes().length?(this.node=l.assignedNodes()[r],this.bEndTag=!1):(this.node=l,this.bEndTag=!0)}else if(this.node.ownerElement)this.node=this.node.ownerElement,this.bEndTag=!0;else if(e.nextSiblingNotOwnedBySlot(this.node))this.node=e.nextSiblingNotOwnedBySlot(this.node),this.bEndTag=!1;else{if(!this.node.parentNode)return!1;this.node=this.node.parentNode,this.bEndTag=!0}}else{var o=this.node,s=this.node,u=this.node;if(1===this.node.nodeType&&"IFRAME"===this.node.nodeName.toUpperCase()&&(!this.considerHidden||a.VisUtil.isNodeVisible(o))&&o.contentDocument&&o.contentDocument.documentElement){var d=this.node;this.node=o.contentDocument.documentElement,this.node.ownerElement=d}else 1===this.node.nodeType&&(!this.considerHidden||a.VisUtil.isNodeVisible(s))&&s.shadowRoot&&s.shadowRoot.firstChild?(d=this.node,this.node=s.shadowRoot,this.node.ownerElement=d,e.assignSlots(this.node)):1===this.node.nodeType&&"slot"===s.nodeName.toLowerCase()&&u.assignedNodes().length>0?this.node=u.assignedNodes()[0]:1!==this.node.nodeType&&11!==this.node.nodeType||!e.firstChildNotOwnedBySlot(this.node)?this.bEndTag=!0:this.node=e.firstChildNotOwnedBySlot(this.node)}}while(1!==this.node.nodeType&&11!==this.node.nodeType&&3!==this.node.nodeType||1===this.node.nodeType&&"ACE"===this.node.getAttribute("aChecker"));return this.bEndTag&&(this.indent-=2),this.DEBUG&&console.log(i()+"<".concat(this.bEndTag?"/":"").concat(this.node.nodeName,"> (from ").concat(n,") ").concat(this.DEBUGIDX++)),this.DEBUG&&this.node.slotOwner&&console.log(i()+"slotOwner: ".concat(this.node.slotOwner.nodeName)),this.DEBUG&&this.node.slotIndex&&console.log(i()+"slotIndex: ".concat(this.node.slotIndex)),this.DEBUG&&this.node.ownerElement&&console.log(i()+"ownerElement: ".concat(this.node.ownerElement.nodeName)),this.bEndTag||(this.indent+=2),!0},e.prototype.prevNode=function(){do{if(this.bEndTag){var t=this.node,i=this.node;if(1===this.node.nodeType&&"IFRAME"===this.node.nodeName.toUpperCase()&&(!this.considerHidden||a.VisUtil.isNodeVisible(t))&&t.contentDocument&&t.contentDocument.documentElement){var n=this.node;this.node=t.contentDocument.documentElement,this.node.ownerElement=n}else if(1===this.node.nodeType&&(!this.considerHidden||a.VisUtil.isNodeVisible(i))&&i.shadowRoot&&i.shadowRoot.lastChild)n=this.node,this.node=i.shadowRoot,this.node.ownerElement=n,e.assignSlots(this.node);else if(1===this.node.nodeType&&"slot"===i.nodeName.toLowerCase()&&i.assignedNodes().length>0){var l=i;this.node=l.assignedNodes()[l.assignedNodes().length-1]}else 1!==this.node.nodeType&&11!==this.node.nodeType||!e.lastChildNotOwnedBySlot(this.node)?this.bEndTag=!1:this.node=e.lastChildNotOwnedBySlot(this.node)}else{if(this.atRoot())return!1;if(this.node.slotOwner){var r=this.node.slotOwner,o=this.node.slotIndex-1;o>=0?(this.node=r.assignedNodes()[o],this.bEndTag=!0):(this.node=r,this.bEndTag=!1)}else if(e.previousSiblingNotOwnedBySlot(this.node))this.node=e.previousSiblingNotOwnedBySlot(this.node),this.bEndTag=!0;else if(this.node.ownerElement)this.node=this.node.ownerElement,this.bEndTag=!1;else{if(!this.node.parentNode)return!1;this.node=this.node.parentNode,this.bEndTag=!1}}}while(1!==this.node.nodeType&&11!==this.node.nodeType&&3!==this.node.nodeType||1===this.node.nodeType&&"ACE"===this.node.getAttribute("aChecker"));return!0},e}();t.DOMWalker=n},8601(e,t){var i,a,n;Object.defineProperty(t,"__esModule",{value:!0}),t.eGuidelineType=t.eGuidelineCategory=t.eToolkitLevel=void 0,(n=t.eToolkitLevel||(t.eToolkitLevel={})).LEVEL_ONE="1",n.LEVEL_TWO="2",n.LEVEL_THREE="3",n.LEVEL_FOUR="4",(a=t.eGuidelineCategory||(t.eGuidelineCategory={})).ACCESSIBILITY="Accessibility",a.DESIGN="Design",a.OTHER="Other",(i=t.eGuidelineType||(t.eGuidelineType={})).DEFAULT="default",i.EXTENSION="extension"},461(e,t,i){var a,n;Object.defineProperty(t,"__esModule",{value:!0}),t.eRulesetType=t.eRuleCategory=t.eToolkitLevel=t.RuleManual=t.RulePotential=t.RuleFail=t.RuleRender=t.RulePass=t.eRulePolicy=t.eRuleConfidence=void 0,function(e){e.PASS="PASS",e.FAIL="FAIL",e.POTENTIAL="POTENTIAL",e.MANUAL="MANUAL"}(a=t.eRuleConfidence||(t.eRuleConfidence={})),function(e){e.VIOLATION="VIOLATION",e.RECOMMENDATION="RECOMMENDATION",e.INFORMATION="INFORMATION"}(n=t.eRulePolicy||(t.eRulePolicy={})),t.RulePass=function(e,t,i){if(null==e)throw new Error("Reason ID must be defined");return{value:[n.INFORMATION,a.PASS],reasonId:e,messageArgs:t||[],apiArgs:i||[]}},t.RuleRender=function(e,t,i){if(null==e)throw new Error("Reason ID must be defined");return{value:[n.INFORMATION,a.PASS],reasonId:0,messageArgs:t||[],apiArgs:i||[]}},t.RuleFail=function(e,t,i){if(null==e)throw new Error("Reason ID must be defined");return{value:[n.INFORMATION,a.FAIL],reasonId:e,messageArgs:t||[],apiArgs:i||[]}},t.RulePotential=function(e,t,i){if(null==e)throw new Error("Reason ID must be defined");return{value:[n.INFORMATION,a.POTENTIAL],reasonId:e,messageArgs:t||[],apiArgs:i||[]}},t.RuleManual=function(e,t,i){if(null==e)throw new Error("Reason ID must be defined");return{value:[n.INFORMATION,a.MANUAL],reasonId:e,messageArgs:t||[],apiArgs:i||[]}};var l=i(8601);Object.defineProperty(t,"eToolkitLevel",{enumerable:!0,get:function(){return l.eToolkitLevel}});var r=i(8601);Object.defineProperty(t,"eRuleCategory",{enumerable:!0,get:function(){return r.eGuidelineCategory}});var o=i(8601);Object.defineProperty(t,"eRulesetType",{enumerable:!0,get:function(){return o.eGuidelineType}})},7412(e,t,i){var a=this&&this.__createBinding||(Object.create?function(e,t,i,a){void 0===a&&(a=i);var n=Object.getOwnPropertyDescriptor(t,i);n&&!("get"in n?!t.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,a,n)}:function(e,t,i,a){void 0===a&&(a=i),e[a]=t[i]}),n=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),l=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&a(t,e,i);return n(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.Checker=void 0;var r=i(461),o=i(7301),s=i(9955),u=i(6160),d=l(i(591)),c=i(8601),m=[],p={},h={};!function(){var e=JSON.parse(JSON.stringify(o.Engine.getLanguages()));for(var t in e.push("en-US"),d){var i=d[t];m.push(i);for(var a=e.length-1;a>=0;--a){var n=e[a];if(n in i.messages&&(p[i.id]=i.messages[n],p[i.id][0]=p[i.id].group),n in i.help){for(var l in h[i.id]={},i.help[n])h[i.id][l]="/".concat(n,"/").concat(i.help[n][l]);p[i.id][0]=p[i.id].group}}for(var r=0,s=i.rulesets;r<s.length;r++)for(var c=s[r],g=0,b=u.a11yRulesets;g<b.length;g++){var _=b[g];if(("string"==typeof c.id?[c.id]:c.id).includes(_.id))for(var f=0,v=_.checkpoints;f<v.length;f++){var A=v[f];("string"==typeof c.num?[c.num]:c.num).includes(A.num)&&(A.rules=A.rules||[],A.rules.push({id:i.id,reasonCodes:c.reasonCodes,level:c.level,toolkitLevel:c.toolkitLevel}))}}}}();var g=function(){function e(){this.guidelines=[],this.rulesets=this.guidelines,this.rulesetIds=[],this.rulesetRules={},this.ruleLevels={},this.ruleReasonLevels={},this.ruleCategory={};var e=this.engine=new o.Engine;e.addMapper(new s.ARIAMapper),e.addRules(m),e.addNlsMap(p),e.addHelpMap(h);for(var t=0,i=u.a11yRulesets;t<i.length;t++){var a=i[t];this.addRuleset(a)}}return e.prototype.addGuideline=function(e){e.id in this.rulesetRules&&this.removeGuideline(e.id),this.guidelines.push(e),this.rulesetIds.push(e.id);for(var t=[],i=0,a=e.checkpoints;i<a.length;i++){var n=a[i];n.rules=n.rules||[];for(var l=0,r=n.rules;l<r.length;l++){var o=r[l];if(!1!==o.enabled){t.push(o.id),this.ruleReasonLevels[o.id]=this.ruleReasonLevels[o.id]||{},this.ruleReasonLevels[o.id][e.id]=this.ruleReasonLevels[o.id][e.id]||{};var s=o.reasonCodes?o.reasonCodes.join("--"):"None";this.ruleReasonLevels[o.id][e.id][s]=o.level,this.ruleCategory[o.id]=this.ruleCategory[o.id]||{},this.ruleCategory[o.id][e.id]=e.category}}}this.rulesetRules[e.id]=t},e.prototype.enableRule=function(e){for(var t=0,i=this.getGuidelines();t<i.length;t++){for(var a=i[t],n=!1,l=0,r=a.checkpoints;l<r.length;l++)for(var o=0,s=r[l].rules;o<s.length;o++){var u=s[o];!1===u.enabled&&(n=!0,delete u.enabled)}n&&this.addGuideline(a)}},e.prototype.disableRule=function(e){for(var t=0,i=this.getGuidelines();t<i.length;t++){for(var a=i[t],n=!1,l=0,r=a.checkpoints;l<r.length;l++)for(var o=0,s=r[l].rules;o<s.length;o++){var u=s[o];!1!==u.enabled&&(n=!0,u.enabled=!1)}n&&this.addGuideline(a)}},e.prototype.removeGuideline=function(e){e in this.rulesetRules&&(delete this.rulesetRules[e],this.rulesets=this.guidelines=this.guidelines.filter(function(t){return t.id!==e}),this.rulesetIds=this.getGuidelineIds())},e.prototype.getGuidelines=function(){return JSON.parse(JSON.stringify(this.guidelines))},e.prototype.getGuidelineIds=function(){return this.guidelines.map(function(e){return e.id})},e.prototype.addRuleset=function(e){this.addGuideline(e)},e.prototype.enableSourceMap=function(e){this.engine.enableSourceMap(e)},e.prototype.isSourceMapEnabled=function(){return this.engine.isSourceMapEnabled()},e.prototype.check=function(e,t){var i=[];if(t){"string"==typeof t&&(t=[t]);for(var a=0,n=t;a<n.length;a++){var l=n[a];l in this.rulesetRules&&(i=i.concat(this.rulesetRules[l]))}}else i=this.engine.getRulesIds();this.engine.enableRules(i);var r=this;return this.engine.run(e).then(function(e){e.nls={};for(var i=0,a=e.results;i<a.length;i++){var n=a[i];n.ruleId in p&&(e.nls[n.ruleId]=e.nls[n.ruleId]||{0:p[n.ruleId][0]},n.reasonId in p[n.ruleId]&&(e.nls[n.ruleId][n.reasonId]=p[n.ruleId][n.reasonId]));var l=n.reasonId?n.reasonId:"None";n.value[0]=r.getReasonLevel(t,n.ruleId,l),n.category=r.getCategory(t,n.ruleId),delete n.path.css}return e})},e.prototype.getLevel=function(e,t){if(!e)return r.eRulePolicy.INFORMATION;var i=this.ruleLevels[t],a=null;if(e){if(!(t in this.ruleLevels))throw new Error("Rule triggered for which we have no rule level information: "+t);for(var n=0,l=e;n<l.length;n++){var o=l[n];o in i&&(i[o]===r.eRulePolicy.VIOLATION?a=r.eRulePolicy.VIOLATION:i[o]===r.eRulePolicy.RECOMMENDATION&&null===a?a=r.eRulePolicy.RECOMMENDATION:null===a&&(a=r.eRulePolicy.INFORMATION))}}if(null===a)throw new Error("Rule triggered for which we have no rule level information: "+t);return a},e.prototype.getReasonLevel=function(e,t,i){if(!e)return r.eRulePolicy.INFORMATION;var a=this.ruleReasonLevels[t],n=null;if(e){if(!(t in this.ruleReasonLevels))throw new Error("Rule triggered for which we have no rule level information "+t);for(var l=function(e){if(e in a){var t=new RegExp("(^|--)".concat(i,"($|--)"));Object.keys(a[e]).forEach(function(i){var l=null;"None"===i?l=a[e].None:t.test(i)&&(l=a[e][i]),null!==l&&(l===r.eRulePolicy.VIOLATION?n=r.eRulePolicy.VIOLATION:l===r.eRulePolicy.RECOMMENDATION&&null===n?n=r.eRulePolicy.RECOMMENDATION:null===n&&(n=r.eRulePolicy.INFORMATION))}),null===n&&(n=r.eRulePolicy.INFORMATION)}},o=0,s=e;o<s.length;o++)l(s[o])}if(null===n)throw new Error("Rule triggered for which we have no rule level information: "+t);return n},e.prototype.getCategory=function(e,t){var i=this.ruleCategory[t];if(!(t in this.ruleCategory))return c.eGuidelineCategory.OTHER;e||(e=this.getGuidelineIds());for(var a=0,n=e;a<n.length;a++){var l=n[a];if(l in i)return i[l]}return c.eGuidelineCategory.OTHER},e}();t.Checker=g},2297(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.a_target_warning=void 0;var a=i(7139),n=i(3946),l=i(5279),r=i(461),o=i(461);t.a_target_warning={id:"a_target_warning",context:"dom:a[target],dom:area[target],dom:base[target]",refactor:{WCAG20_A_TargetAndText:{Pass_0:"pass",Potential_1:"potential_warn"}},help:{"en-US":{group:"a_target_warning.html",pass:"a_target_warning.html",potential_warn:"a_target_warning.html"}},messages:{"en-US":{group:"Users should be warned in advance if their input action will open a new window",pass:"The user is warned in advance that the input action opens a new window",potential_warn:"Inform the user when their input action will open a new window"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"3.2.2",level:o.eRulePolicy.RECOMMENDATION,toolkitLevel:o.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var o=e.dom.node;if(n.VisUtil.isNodeHiddenFromAT(o)&&!a.CommonUtil.isTabbable(o))return null;var s={paramWinText:{value:["new window","new tab"],type:"array"}},u=o.getAttribute("target"),d="_parent"==u||"_self"==u||"_top"==u||null!=a.CommonUtil.getFrameByName(o,u);if(!d){var c=a.CommonUtil.getInnerText(o);if(o.hasAttribute("title")&&(c+=" "+o.getAttribute("title")),o.hasAttribute("aria-describedby"))for(var m=0,p=o.getAttribute("aria-describedby").trim().split(/\s+/);m<p.length;m++){var h=p[m],g=l.FragmentUtil.getById(o,h);if(g){var b=a.CommonUtil.getInnerText(g);b&&b.trim().length>0&&(c+=" "+b)}}for(var _=0;!d&&_<s.paramWinText.value.length;++_)-1!=c.indexOf(s.paramWinText.value[_])&&(d=!0)}return d?(0,r.RulePass)("pass"):(0,r.RulePotential)("potential_warn")}}},4401(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.a_text_purpose=void 0;var a=i(461),n=i(7139),l=i(3946),r=i(461),o=i(1950);t.a_text_purpose={id:"a_text_purpose",context:"aria:link,aria:doc-biblioref",refactor:{WCAG20_A_HasText:{Pass_0:"pass",Fail_1:"fail_acc_name"}},help:{"en-US":{group:"a_text_purpose.html",pass:"a_text_purpose.html",fail_acc_name:"a_text_purpose.html"}},messages:{"en-US":{group:"Hyperlinks must have an accessible name for their purpose",pass:"Hyperlink has a description of its purpose",fail_acc_name:"Hyperlink has no link text, label or image with a text alternative"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:["2.4.4","4.1.2"],level:r.eRulePolicy.VIOLATION,toolkitLevel:r.eToolkitLevel.LEVEL_TWO}],act:"c487ae",run:function(e,t){var i=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(i)||n.CommonUtil.isNodeDisabled(i))return null;var r=o.AccNameUtil.computeAccessibleName(i);return r&&r.name&&r.name.trim().length>0||n.CommonUtil.nonTabableChildCheck(i)?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_acc_name")}}},4546(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.applet_alt_exists=void 0;var a=i(7139),n=i(3946),l=i(461),r=i(461);t.applet_alt_exists={id:"applet_alt_exists",context:"dom:applet",refactor:{WCAG20_Applet_HasAlt:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{group:"applet_alt_exists.html",Pass_0:"applet_alt_exists.html",Fail_1:"applet_alt_exists.html",Fail_2:"applet_alt_exists.html",Fail_3:"applet_alt_exists.html"}},messages:{"en-US":{group:"<applet> elements must provide an 'alt' attribute and an alternative description",Pass_0:"Rule Passed",Fail_1:"An <applet> element does not have an 'alt' attribute that provides a short text alternative",Fail_2:"The 'alt' attribute value for an <applet> element duplicates the 'code' attribute",Fail_3:"An <applet> element provides alternative text, but does not provide inner content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"1.1.1",level:r.eRulePolicy.VIOLATION,toolkitLevel:r.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var r=e.dom.node;if(n.VisUtil.isNodeHiddenFromAT(r))return null;if(a.CommonUtil.attributeNonEmpty(r,"alt")){var o=r.getAttribute("alt").trim();return r.hasAttribute("code")&&o==r.getAttribute("code").trim()?(0,l.RuleFail)("Fail_2"):a.CommonUtil.hasInnerContentHidden(r)?(0,l.RulePass)("Pass_0"):(0,l.RuleFail)("Fail_3")}return(0,l.RuleFail)("Fail_1")}}},9292(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.application_content_accessible=void 0;var a=i(7011),n=i(3946),l=i(461),r=i(461);t.application_content_accessible={id:"application_content_accessible",context:"aria:application",refactor:{HAAC_Application_Role_Text:{0:"HAAC_Application_Role_Text.html",Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{0:"application_content_accessible.html",Pass_0:"application_content_accessible.html",Potential_1:"application_content_accessible.html"}},messages:{"en-US":{group:'Non-decorative static text and image content within an element with "application" role must be accessible',Pass_0:"Rule Passed",Potential_1:'Verify that the non-decorative static text and image content within an element with "application" role are accessible'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:["1.1.1","2.1.1"],level:r.eRulePolicy.VIOLATION,toolkitLevel:r.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){for(var r=!0,o=e.dom.node.childNodes,s=0;r&&s<o.length;s++)1===o[s].nodeType?n.VisUtil.isNodeVisible(o[s])&&(r=a.AriaUtil.hasRoleInSemantics(o[s],"document")||a.AriaUtil.hasRoleInSemantics(o[s],"article")):3===o[s].nodeType&&(r=0===o[s].nodeValue.trim().length);return r?(0,l.RulePass)("Pass_0"):(0,l.RulePotential)("Potential_1")}}},9605(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.area_alt_exists=void 0;var a=i(7139),n=i(3946),l=i(461),r=i(461);t.area_alt_exists={id:"area_alt_exists",context:"dom:area",refactor:{WCAG20_Area_HasAlt:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"area_alt_exists.html",Pass_0:"area_alt_exists.html",Fail_1:"area_alt_exists.html"}},messages:{"en-US":{group:"<area> elements in an image map must have a text alternative",Pass_0:"Rule Passed",Fail_1:"<area> element in an image map has no text alternative"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"1.1.1",level:r.eRulePolicy.VIOLATION,toolkitLevel:r.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var r=e.dom.node;return n.VisUtil.isNodeHiddenFromAT(r)?null:a.CommonUtil.attributeNonEmpty(r,"alt")?(0,l.RulePass)("Pass_0"):(0,l.RuleFail)("Fail_1")}}},3987(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_accessiblename_exists=void 0;var a=i(461),n=i(461),l=i(7011),r=i(3946),o=i(1950),s=i(9910);t.aria_accessiblename_exists={id:"aria_accessiblename_exists",context:"aria:columnheader, aria:heading, aria:rowheader, aria:graphics-document,aria:graphics-symbol, aria:img,aria:image, doc-backlink, doc-biblioentry, doc-biblioref, doc-glossref, doc-noteref, doc-pagebreak, doc-example",help:{"en-US":{pass:"aria_accessiblename_exists.html",fail_no_accessible_name:"aria_accessiblename_exists.html",fail_no_accessible_name_image:"aria_accessiblename_exists.html",group:"aria_accessiblename_exists.html"}},messages:{"en-US":{pass:"An accessible name is provided for the element",fail_no_accessible_name:'Element <{0}> with "{1}" role has no accessible name',fail_no_accessible_name_image:'Element <{0}> with "{1}" role has no accessible name',group:"Elements with certain roles should have accessible names"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE,reasonCodes:["fail_no_accessible_name"]},{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["ARIA"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE,reasonCodes:["fail_no_accessible_name_image"]}],act:[{"23a2a8":{fail_no_accessible_name_image:"fail"}}],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var u=n.nodeName.toLocaleLowerCase();if("svg"!==u&&"img"!==u){if("table"===u&&n.firstElementChild&&"caption"===n.firstElementChild.nodeName.toLowerCase()&&n.firstElementChild.textContent&&n.firstElementChild.textContent.trim().length>0)return(0,a.RulePass)("pass");var d=l.AriaUtil.getRolesUndefinedByAria(n);if(d&&d.length>0)return null;var c=l.AriaUtil.getDeprecatedAriaRoles(n);if(c&&c.length>0)return null;var m=l.AriaUtil.getDeprecatedAriaAttributes(n);if(m&&m.length>0)return null;var p=l.AriaUtil.getResolvedRole(n);if(!p||!s.ARIADefinitions.designPatterns[p]||!s.ARIADefinitions.designPatterns[p].nameRequired)return null;var h=o.AccNameUtil.computeAccessibleName(n);return h&&h.name&&0!==h.name.trim().length?(0,a.RulePass)("pass"):"img"===p||"image"===p?(0,a.RuleFail)("fail_no_accessible_name_image",[n.nodeName.toLowerCase(),p]):(0,a.RuleFail)("fail_no_accessible_name",[n.nodeName.toLowerCase(),p])}}}},8631(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_activedescendant_tabindex_valid=void 0;var a=i(461),n=i(461),l=i(7139);t.aria_activedescendant_tabindex_valid={id:"aria_activedescendant_tabindex_valid",context:"dom:*[aria-activedescendant]",refactor:{Rpt_Aria_InvalidTabindexForActivedescendant:{pass:"pass",Fail_1:"Fail_1"}},help:{"en-US":{pass:"aria_activedescendant_tabindex_valid.html",Fail_1:"aria_activedescendant_tabindex_valid.html",group:"aria_activedescendant_tabindex_valid.html"}},messages:{"en-US":{pass:"Rule Passed",Fail_1:"The <{0}> element using 'aria-activedescendant' set to \"{1}\" is not tabbable",group:"Element using 'aria-activedescendant' property should be tabbable"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,r=!1,o=n.nodeName.toLowerCase();if(n.hasAttribute("class")&&"mbl"==n.getAttribute("class").substring(0,3))return null;if(l.CommonUtil.isNodeDisabled(n))return null;if(0!==n.getAttribute("aria-activedescendant").trim().length){(r=l.CommonUtil.isTabbable(n))||(r=l.CommonUtil.getTabbableChildren(n)>0);var s=new Array;s.push(o);var u=new Array;return u.push(n.getAttribute("aria-activedescendant").split(" ").join(", ")),r?(0,a.RulePass)("pass"):(0,a.RuleFail)("Fail_1",[s.toString(),u.toString()])}}}},8025(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_activedescendant_valid=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(5279),s=i(3946),u=i(1686);t.aria_activedescendant_valid={id:"aria_activedescendant_valid",context:"dom:*[aria-activedescendant]",refactor:{HAAC_ActiveDescendantCheck:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{Pass_0:"aria_activedescendant_valid.html",Fail_1:"aria_activedescendant_valid.html",Fail_2:"aria_activedescendant_valid.html",Fail_3:"aria_activedescendant_valid.html",group:"aria_activedescendant_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The 'aria-activedescendant' property is empty",Fail_2:"The 'aria-activedescendant' property references a hidden node",Fail_3:"Element is not a combobox, and the referenced active-descendant element is not a valid descendant",group:"The 'aria-activedescendant' property must reference the 'id' of a non-empty, non-hidden active child element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.AriaUtil.hasRoleInSemantics(n,"combobox"))return null;var d=l.AriaUtil.getAriaAttribute(n,"aria-activedescendant");if(!d||""===d.trim())return(0,a.RuleFail)("Fail_1");var c=o.FragmentUtil.getById(n,d.trim());if(!c||u.DOMUtil.sameNode(d,n))return null;if(!s.VisUtil.isNodeVisible(c))return(0,a.RuleFail)("Fail_2");if(n.contains(c))return(0,a.RulePass)("Pass_0");var m=2;if(n.hasAttribute("aria-owns"))for(var p=r.CommonUtil.normalizeSpacing(n.getAttribute("aria-owns").trim()).split(" "),h=0;h<p.length;h++)if((v=o.FragmentUtil.getById(n,p[h]))&&!u.DOMUtil.sameNode(v,n)&&v.contains(c))return(0,a.RulePass)("Pass_0");if(l.AriaUtil.hasRoleInSemantics(n,"textbox")&&n.hasAttribute("aria-controls")){m=3;var g=r.CommonUtil.normalizeSpacing(n.getAttribute("aria-controls").trim()).split(" ");for(h=0;h<g.length;h++){var b=o.FragmentUtil.getById(n,g[h]);if(b&&!u.DOMUtil.sameNode(b,n)&&b.contains(c))return(0,a.RulePass)("Pass_0");if(b.hasAttribute("aria-owns"))for(var _=r.CommonUtil.normalizeSpacing(b.getAttribute("aria-owns").trim()).split(" "),f=0;f<_.length;f++){var v;if((v=o.FragmentUtil.getById(n,_[f]))&&!u.DOMUtil.sameNode(v,n)&&v.contains(c))return(0,a.RulePass)("Pass_0")}}}return 3==m?(0,a.RuleFail)("Fail_3"):null}}},1198(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_application_label_unique=void 0;var a=i(461),n=i(461),l=i(7011),r=i(3946);t.aria_application_label_unique={id:"aria_application_label_unique",context:"aria:application",refactor:{Rpt_Aria_MultipleApplicationLandmarks:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_application_label_unique.html",fail_label_not_unique:"aria_application_label_unique.html",group:"aria_application_label_unique.html"}},messages:{"en-US":{pass:'The element with "application" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "application" role do not have unique labels',group:'Each element with "application" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var o=l.AriaUtil.isLandmarkNameUnique(n,"application");return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},8001(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_application_labelled=void 0;var a=i(461),n=i(461),l=i(1950),r=i(3946);t.aria_application_labelled={id:"aria_application_labelled",context:"aria:application",refactor:{Rpt_Aria_ApplicationLandmarkLabel:{Pass_0:"pass",Fail_1:"fail_no_label"}},help:{"en-US":{pass:"aria_application_labelled.html",fail_no_label:"aria_application_labelled.html",group:"aria_application_labelled.html"}},messages:{"en-US":{pass:'The element with "application" role has a label that describes its purpose',fail_no_label:'Element with "application" role does not have a label',group:'Each element with "application" role must have a label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;return r.VisUtil.isNodeHiddenFromAT(n)?null:l.AccNameUtil.computeAccessibleName(n)?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_no_label")}}},5778(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_article_label_unique=void 0;var a=i(461),n=i(461),l=i(3946),r=i(7011);t.aria_article_label_unique={id:"aria_article_label_unique",context:"aria:article",refactor:{Rpt_Aria_MultipleArticleRoles_Implicit:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_article_label_unique.html",fail_label_not_unique:"aria_article_label_unique.html",group:"aria_article_label_unique.html"}},messages:{"en-US":{pass:'The element with "article" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "article" role do not have unique labels',group:'Each element with "article" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var o=r.AriaUtil.isLandmarkNameUnique(n,"article");return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},8118(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_allowed=void 0;var a=i(461),n=i(461),l=i(9910),r=i(7011);t.aria_attribute_allowed={id:"aria_attribute_allowed",context:"dom:*",refactor:{Rpt_Aria_ValidProperty:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"aria_attribute_allowed.html",Pass_0:"aria_attribute_allowed.html",Fail_1:"aria_attribute_allowed.html"}},messages:{"en-US":{group:"ARIA attributes must be valid for the element's role",Pass_0:"Rule Passed",Fail_1:"The attribute(s) '{0}' referenced by the element <{1}> is not a valid ARIA state or property"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"4.1.2",level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:"5f99a7",run:function(e,t,i){var n=e.dom.node,o=n.attributes;if(o){for(var s=l.ARIADefinitions.propertyDataTypes,u="",d=0,c=0,m=o.length;c<m;c++){var p=o[c].name;r.AriaUtil.isDefinedAriaAttribute(n,p)&&(d++,s[p]||(u=0==u.length?p:u+", "+p))}return 0==d?null:0!=u.length?(0,a.RuleFail)("Fail_1",[u,n.nodeName.toLowerCase()]):(0,a.RulePass)("Pass_0")}return null}}},2242(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_conflict=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139);t.aria_attribute_conflict={id:"aria_attribute_conflict",context:"dom:*[aria-required], dom:*[aria-autocomplete], dom:*[aria-readonly], dom:*[aria-disabled], dom:*[aria-placeholder], dom:*[aria-checked], dom:*[aria-hidden], dom:*[aria-valuemax], dom:*[aria-valuemin], dom:*[aria-colspan], dom:*[aria-rowspan]",help:{"en-US":{fail_conflict:"aria_attribute_conflict.html",group:"aria_attribute_conflict.html"}},messages:{"en-US":{fail_conflict:'The ARIA attribute "{0}" is in conflict with the corresponding HTML attribute "{1}"',group:"An ARIA attribute must not conflict with the corresponding HTML attribute"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,o=l.AriaUtil.getInvalidAriaAttributes(n);if(o&&o.length>0)return null;var s=[],u=l.AriaUtil.getUserDefinedAriaAttributes(n);if(!u||0===u.length)return null;for(var d=l.AriaUtil.getConflictAriaAndHtmlAttributes(n),c=0;c<d.length;c++)s.push((0,a.RuleFail)("fail_conflict",[d[c].ariaAttr,d[c].htmlAttr])),u.includes(d[c].ariaAttr)&&r.CommonUtil.reduceArrayItemList([d[c].ariaAttr],u);return s.length>0?s:null}}},3673(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_deprecated=void 0;var a=i(461),n=i(461),l=i(7011);t.aria_attribute_deprecated={id:"aria_attribute_deprecated",context:"dom:*",help:{"en-US":{fail_aria_role:"aria_attribute_deprecated.html",fail_aria_attr:"aria_attribute_deprecated.html",fail_role_attr:"aria_attribute_deprecated.html",group:"aria_attribute_deprecated.html"}},messages:{"en-US":{fail_aria_role:'The ARIA role "{0}" is deprecated in the ARIA specification',fail_aria_attr:'The ARIA attributes "{0}" are deprecated in the ARIA specification',fail_role_attr:'The ARIA attributes "{0}" are deprecated for the role "{1}" in the ARIA specification',group:"No deprecated ARIA role or attribute should be used"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["ARIA"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,r=[],o=l.AriaUtil.getDeprecatedAriaRoles(n);if(o&&o.length>0)for(var s=0;s<o.length;s++)r.push((0,a.RuleFail)("fail_aria_role",[o[s]]));var u=l.AriaUtil.getDeprecatedAriaAttributes(n);if(u&&u.length>0)for(s=0;s<u.length;s++)"any"===u[s].role?r.push((0,a.RuleFail)("fail_aria_attr",[u[s].attribute])):r.push((0,a.RuleFail)("fail_role_attr",[u[s].attribute,u[s].role]));return r.length>0?r:null}}},5080(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_exists=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(9910),s=i(3946);t.aria_attribute_exists={id:"aria_attribute_exists",context:"dom:*[role]",dependencies:["aria_role_allowed"],refactor:{Rpt_Aria_EmptyPropertyValue:{pass:"pass",fail_empty_attribute:"fail_empty_attribute"}},help:{"en-US":{pass:"aria_attribute_exists.html",fail_empty_attribute:"aria_attribute_exists.html",group:"aria_attribute_exists.html"}},messages:{"en-US":{pass:"Rule Passed",fail_empty_attribute:"The element attribute(s): '{0}' value is empty",group:"When specifying a required ARIA attribute, the value must not be empty"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:["6a7281"],run:function(e,t,i){var n=e.dom.node;if(!s.VisUtil.isNodeHiddenFromAT(n)){var u=new Array,d=o.ARIADefinitions.designPatterns,c=r.CommonUtil.hasAttribute,m=0,p=l.AriaUtil.getResolvedRole(n);if(p){if(d[p]&&null!=l.AriaUtil.getRoleRequiredProperties(p,n))for(var h=l.AriaUtil.getRoleRequiredProperties(p,n),g=0,b=h.length;g<b;g++)c(n,w=h[g])?(m++,0==r.CommonUtil.normalizeSpacing(n.getAttribute(h[g])).length&&u.push(h[g])):"aria-labelledby"==h[g]?"radiogroup"==p&&c(n,"aria-label")&&(m++,0==r.CommonUtil.normalizeSpacing(n.getAttribute("aria-label")).length&&u.push("aria-label")):"aria-valuenow"==h[g]&&"progressbar"==p&&c(n,"aria-valuetext")&&(m++,0==r.CommonUtil.normalizeSpacing(n.getAttribute("aria-valuetext")).length&&u.push("aria-valuetext"));if(d[p]){var _=l.AriaUtil.getElementAriaProperty(n),f=[];f.push(p);for(var v=l.AriaUtil.getAllowedAriaAttributes(n,f,_),A=(g=0,v.length);g<A;g++){var w;"aria-checked"!=(w=v[g])&&"aria-selected"!=w&&"aria-expanded"!=w&&"aria-orientation"!=w&&"aria-level"!=w||c(n,w)&&(m++,0!=r.CommonUtil.normalizeSpacing(n.getAttribute(w)).length||u.includes(w)||u.push(w))}}var y=new Array,C=0==u.length;return y.push(u.join(", ")),0==m?null:C?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_empty_attribute",y)}}}}},183(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_redundant=void 0;var a=i(461),n=i(461),l=i(7011);t.aria_attribute_redundant={id:"aria_attribute_redundant",context:"dom:*[aria-required], dom:*[aria-autocomplete], dom:*[aria-readonly], dom:*[aria-disabled], dom:*[aria-placeholder], dom:*[aria-checked], dom:*[aria-hidden], dom:*[aria-valuemax], dom:*[aria-valuemin], dom:*[aria-colspan], dom:*[aria-rowspan]",help:{"en-US":{pass:"aria_attribute_redundant.html",fail_redundant:"aria_attribute_redundant.html",group:"aria_attribute_redundant.html"}},messages:{"en-US":{pass:"The ARIA attribute is not redundant with a corresponding HTML attribute",fail_redundant:'The ARIA attribute "{0}" is redundant with the HTML attribute "{1}"',group:"An ARIA attribute should not be redundant with a corresponding HTML attribute"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,r=l.AriaUtil.getInvalidAriaAttributes(n);if(r&&r.length>0)return null;var o=l.AriaUtil.getConflictAriaAndHtmlAttributes(n);if(o&&o.length>0)return null;var s=n.attributes,u=[],d=[];if(s)for(var c=0;c<s.length;c++){var m=s[c].name.trim().toLowerCase(),p=n.getAttribute(m);""===p&&(p=null),"aria-"===m.substring(0,5)?u.push({name:m,value:p}):d.push({name:m,value:p})}var h=[],g=function(e){var t=l.AriaUtil.getConflictOrOverlappingHtmlAttribute(u[e],d,"overlapping");if(null===t)return"continue";t.forEach(function(t){"Pass"===t.result?h.push((0,a.RulePass)("pass")):"Failed"===t.result&&h.push((0,a.RuleFail)("fail_redundant",[u[e].name,t.attr]))})};for(c=0;c<u.length;c++)g(c);return h.length>0?h:null}}},6805(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_required=void 0;var a=i(9910),n=i(7011),l=i(7139),r=i(461),o=i(461);t.aria_attribute_required={id:"aria_attribute_required",context:"dom:*[role]",dependencies:["aria_role_allowed"],refactor:{Rpt_Aria_RequiredProperties:{Pass_0:"pass",Fail_1:"fail_missing"}},help:{"en-US":{group:"aria_attribute_required.html",pass:"aria_attribute_required.html",fail_missing:"aria_attribute_required.html"}},messages:{"en-US":{group:"The required attributes for the element with a role must be defined",pass:"The required attributes for the element with the role are defined",fail_missing:"Element with '{0}' role does not have the required ARIA attribute(s): '{1}'"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"4.1.2",level:o.eRulePolicy.VIOLATION,toolkitLevel:o.eToolkitLevel.LEVEL_ONE}],act:"4e8ab6",run:function(e,t,i){var o=e.dom.node,s=new Array,u=new Array,d=a.ARIADefinitions.designPatterns,c=l.CommonUtil.hasAttribute,m=n.AriaUtil.getElementAriaProperty(o),p=n.AriaUtil.getResolvedRole(o);if(p){var h=n.AriaUtil.getRoleRequiredProperties(p,o);if(d[p]&&null!==h){for(var g=n.AriaUtil.getAllowedAriaAttributes(o,p,m),b=!1,_=0,f=h.length;_<f;_++)g.includes(h[_])&&(c(o,h[_])||("aria-labelledby"==h[_]?c(o,"aria-label")&&"radiogroup"==p||(s.push(h[_]),b=!0):"aria-valuenow"==h[_]?c(o,"aria-valuetext")&&"progressbar"==p||(s.push(h[_]),b=!0):"aria-controls"==h[_]&&"combobox"==p||(s.push(h[_]),b=!0)));1==b&&u.push(p)}if(0==u.length||0==s.length)return(0,r.RulePass)("pass");var v=new Array;return v.push(u.join(", ")),v.push(s.join(", ")),(0,r.RuleFail)("fail_missing",v)}}}},1886(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_value_valid=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(9910);t.aria_attribute_value_valid={id:"aria_attribute_value_valid",context:"dom:*",dependencies:["aria_attribute_allowed"],refactor:{Rpt_Aria_ValidPropertyValue:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"aria_attribute_value_valid.html",Pass_0:"aria_attribute_value_valid.html",Fail_1:"aria_attribute_value_valid.html"}},messages:{"en-US":{group:"ARIA property values must be valid",Pass_0:"Rule Passed",Fail_1:"The value \"{0}\" specified for attribute '{1}' on element <{2}> is not valid"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:"6a7281",run:function(e,t,i){var n=e.dom.node,s=new Array,u=new Array,d=new Array,c=o.ARIADefinitions.propertyDataTypes,m=n.attributes,p=0;if(m)for(var h=0,g=m.length;h<g;h++){var b=m[h].name;if(l.AriaUtil.isDefinedAriaAttribute(n,b)){var _=c[b],f=r.CommonUtil.normalizeSpacing(m[h].nodeValue);if(p++,_&&_.values){if(-1==_.values.indexOf(f))if(-1!=_.values.indexOf("undefined")&&0==f.length);else if("http://www.w3.org/2001/XMLSchema#nmtokens"===_.type){var v=m[h].nodeValue.trim().split(" ");if(v.length>1&&v.includes("all"))s.push(m[h].nodeValue.split(" ")),u.push(b),d.push(_.values.toString());else for(var A={},w=0;w<v.length;w++)""==v[w]||_.values.includes(v[w])||(A.hasOwnProperty(b)||(A[b]=!0,u.push(b)),s.push(v[w]),d.push(_.values.toString()))}else s.push(m[h].nodeValue.split(" ")),u.push(b),d.push(_.values.toString())}else if(_&&_.type&&"http://www.w3.org/2001/XMLSchema#int"===_.type){var y=parseInt(f);(isNaN(y)||""+y!==f)&&(s.push(f),u.push(b))}else if(_&&_.type&&"http://www.w3.org/2001/XMLSchema#decimal"==_.type){var C=parseFloat(f);isNaN(C)&&(s.push(f),u.push(b))}else if(_&&_.type&&"http://www.w3.org/2001/XMLSchema#boolean"==_.type){var k=f.trim().toLowerCase();"true"!==k&&"false"!==k&&(s.push(f),u.push(b))}else _&&_.type&&"http://www.w3.org/2001/XMLSchema#string"==_.type||p--}}var R=new Array,x=0==u.length;return R.push(s.join(", ")),R.push(u.join(", ")),R.push(n.nodeName.toLowerCase()),0==p?null:x?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",R)}}},4078(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_banner_label_unique=void 0;var a=i(461),n=i(461),l=i(7011),r=i(3946);t.aria_banner_label_unique={id:"aria_banner_label_unique",context:"aria:banner",refactor:{Rpt_Aria_MultipleBannerLandmarks_Implicit:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_banner_label_unique.html",fail_label_not_unique:"aria_banner_label_unique.html",group:"aria_banner_label_unique.html"}},messages:{"en-US":{pass:'The element with "banner" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "banner" role do not have unique labels',group:'Each element with "banner" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var o=l.AriaUtil.isLandmarkNameUnique(n,"banner",!0);return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},5750(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_banner_single=void 0;var a=i(461),n=i(461),l=i(7011),r=i(3946);t.aria_banner_single={id:"aria_banner_single",context:"dom:*[role], dom:header",refactor:{Rpt_Aria_OneBannerInSiblingSet_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_banner_single.html",Fail_1:"aria_banner_single.html",group:"aria_banner_single.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "banner" role found on the page',group:'A page, document, or application should only have one element with "banner" role'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;return r.VisUtil.isNodeHiddenFromAT(n)?null:l.AriaUtil.hasRoleInSemantics(n,"banner")?null===l.AriaUtil.getSiblingWithRoleHidden(n,"banner",!0,!0)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1"):null}}},85(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_child_tabbable=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(9910),s=i(3946);t.aria_child_tabbable={id:"aria_child_tabbable",context:"dom:*[role]",dependencies:["aria_role_allowed"],refactor:{Rpt_Aria_MissingFocusableChild:{pass:"pass",fail_missing_child:"fail_missing_child"}},help:{"en-US":{pass:"aria_child_tabbable.html",fail_missing_child:"aria_child_tabbable.html",group:"aria_child_tabbable.html"}},messages:{"en-US":{pass:"Rule Passed",fail_missing_child:'None of the descendent elements with "{1}" role is tabbable',group:"UI component must have at least one tabbable descendant for keyboard access"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(!(s.VisUtil.isNodeHiddenFromAT(n)||r.CommonUtil.isNodeDisabled(n)||l.AriaUtil.containsPresentationalChildrenOnly(n)||l.AriaUtil.shouldBePresentationalChild(n))){if(l.AriaUtil.hasRole(n,{list:!0,row:!0,rowgroup:!0,table:!0,grid:!0}))return null;if(n.hasAttribute("class")&&"mbl"==n.getAttribute("class").substring(0,3))return null;if("datalist"===n.nodeName.toLowerCase())return null;if(l.AriaUtil.isNavigationOwnedOrControlled(n))return null;var u=l.AriaUtil.getResolvedRole(n),d=!0,c=n.ownerDocument,m=r.CommonUtil.hasAttribute,p=new Array,h="",g=!1;if(o.ARIADefinitions.containers.includes(u)&&"true"!=(m(n,"aria-disabled")?n.getAttribute("aria-disabled"):"")&&!m(n,"aria-activedescendant")&&!r.CommonUtil.isTabbable(n)){var b=o.ARIADefinitions.designPatterns[u].reqChildren;if(b){g=!0,d=!1;for(var _="descendant::*[",f=0;f<b.length;f++)_+="@role='"+b[f]+"' or ";_=_.substring(0,_.length-4)+"]";for(var v=c.evaluate(_,n,r.CommonUtil.defaultNSResolver,0,null),A=v.iterateNext();A&&!d;)if(r.CommonUtil.shouldNodeBeSkippedHidden(A))A=v.iterateNext();else{if(!(d=r.CommonUtil.isTabbable(A)))for(var w=c.evaluate("descendant::*",A,r.CommonUtil.defaultNSResolver,0,null),y=w.iterateNext();y&&!d;)r.CommonUtil.shouldNodeBeSkippedHidden(y)||(d=r.CommonUtil.isTabbable(A)),y=w.iterateNext();d||(p=A.getAttribute("role").trim().split(" "),h=A.nodeName.toLowerCase()),A=v.iterateNext()}}}var C=new Array,k=new Array;return h.length>0&&p.length>0?(C.push(h),k.push(p.join(", "))):d=!0,g?d?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_missing_child",[C.toString(),k.toString()]):null}}}},514(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_child_valid=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(3946);t.aria_child_valid={id:"aria_child_valid",context:"dom:*",dependencies:["aria_role_valid","aria_descendant_valid"],help:{"en-US":{group:"aria_child_valid.html",Pass:"aria_child_valid.html",Fail_no_child:"aria_child_valid.html",Fail_invalid_child:"aria_child_valid.html"}},messages:{"en-US":{group:"An element with an ARIA role must own a required child",Pass:"An element with an ARIA role owns a required child",Fail_no_child:'The element with role "{0}" does not own any child element with any of the following role(s): "{1}"',Fail_invalid_child:'The element with role "{0}" owns the child element with the role "{1}" that is not one of the allowed role(s): "{2}"'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:["bc4a75"],run:function(e,t,i){var n=e.dom.node;if(!o.VisUtil.isNodeHiddenFromAT(n)&&!r.CommonUtil.isNodeDisabled(n)&&!l.AriaUtil.containsPresentationalChildrenOnly(n)){var s=l.AriaUtil.getRoles(n,!1);if(s&&0!==s.length||(s=l.AriaUtil.getImplicitRole(n)),!s||0===s.length)return null;var u=["none","presentation"];if(s.some(function(e){return u.includes(e)}))return null;if(s.includes("combobox"))return null;var d=l.AriaUtil.getRequiredChildRoles(n,!0);if(d.includes("group")){var c=d.indexOf("group");c>-1&&d.splice(c,1)}if(0==d.length)return null;var m=l.AriaUtil.getDirectATChildren(n);if(!m||0==m.length){var p=n.getAttribute("aria-busy");return p&&"true"===p?null:((v=new Array).push(s.join(", ")),v.push(d.join(", ")),(0,a.RuleFail)("Fail_no_child",v))}for(var h=new Array,g=0;g<m.length;g++){var b=l.AriaUtil.getRoles(m[g],!1);b&&0!=b.length||(b=l.AriaUtil.getImplicitRole(m[g])),b&&b.length>0&&(b.some(function(e){return d.includes(e)})||h.push(b.join(", ")))}if(h.length>0){for(var _=[],f=0;f<h.length;f++){var v;(v=new Array).push(s.join(", ")),v.push(h[f]),v.push(d.join(", ")),_.push((0,a.RuleFail)("Fail_invalid_child",v))}return _}return(0,a.RulePass)("Pass")}}}},5310(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_complementary_label_unique=void 0;var a=i(461),n=i(461),l=i(7011),r=i(3946);t.aria_complementary_label_unique={id:"aria_complementary_label_unique",context:"aria:complementary",refactor:{Rpt_Aria_MultipleComplementaryLandmarks_Implicit:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_complementary_label_unique.html",fail_label_not_unique:"aria_complementary_label_unique.html",group:"aria_complementary_label_unique.html"}},messages:{"en-US":{pass:'The element with "complementary" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "complementary" role do not have unique labels',group:'Each element with "complementary" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var o=l.AriaUtil.isLandmarkNameUnique(n,"complementary");return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},9083(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_complementary_label_visible=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(3946);t.aria_complementary_label_visible={id:"aria_complementary_label_visible",context:"dom:*[role], dom:aside",dependencies:["aria_complementary_labelled"],refactor:{Rpt_Aria_ComplementaryLandmarkLabel_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_complementary_label_visible.html",Fail_1:"aria_complementary_label_visible.html",group:"aria_complementary_label_visible.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Element with "complementary" role does not have a visible label',group:'Each element with "complementary" role should have a visible label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;return o.VisUtil.isNodeHiddenFromAT(n)?null:l.AriaUtil.hasRoleInSemantics(n,"complementary")?r.CommonUtil.attributeNonEmpty(n,"aria-labelledby")?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1"):null}}},6049(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_complementary_labelled=void 0;var a=i(461),n=i(461),l=i(1950),r=i(3946);t.aria_complementary_labelled={id:"aria_complementary_labelled",context:"aria:complementary",refactor:{Rpt_Aria_ComplementaryRequiredLabel_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_complementary_labelled.html",Fail_1:"aria_complementary_labelled.html",group:"aria_complementary_labelled.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Element with "complementary" role does not have a label',group:'Each element with "complementary" role must have a label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;return r.VisUtil.isNodeHiddenFromAT(n)?null:l.AccNameUtil.computeAccessibleName(n)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},5099(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_content_in_landmark=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(4566),s=i(3864),u=i(3946),d=i(9196);t.aria_content_in_landmark={id:"aria_content_in_landmark",context:"dom:*",refactor:{Rpt_Aria_OrphanedContent_Native_Host_Sematics:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_content_in_landmark.html",Fail_1:"aria_content_in_landmark.html",group:"aria_content_in_landmark.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Content is not within a landmark element",group:"All content must reside within an element with a landmark role"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE},{id:["WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=o.CacheUtil.getCache(e.dom.node.ownerDocument,"aria_content_in_landmark",null);if(!n){(n={landmarks:{value:["banner","complementary","contentinfo","form","main","navigation","region","search"],type:"array"},possibleOrphanedWidgets:{value:["button","combobox","checkbox","grid","heading","link","list","listbox","menu","menubar","progressbar","radio","tablist","textbox","toolbar","tree","treegrid"],type:"array"},possibleOrphanedElements:{value:["p","table","input","textarea","select","button","a","ol","ul","dl","h1","h2","h3","h4","h5","h6","embed","object","area"],type:"array"},noLandmarkedRoles:{value:["alert","alertdialog","dialog","tooltip"],type:"array"},mapLandmarks:{},mapPossibleOrphanedWidgets:{},mapPossibleOrphanedElements:{},mapNoLandmarkedRoles:{}}).mapLandmarks={};for(var c=0;c<n.landmarks.value.length;++c)n.mapLandmarks[n.landmarks.value[c]]=!0;for(n.mapPossibleOrphanedWidgets={},c=0;c<n.possibleOrphanedWidgets.value.length;++c)n.mapPossibleOrphanedWidgets[n.possibleOrphanedWidgets.value[c]]=!0;for(n.mapPossibleOrphanedElements={},c=0;c<n.possibleOrphanedElements.value.length;++c)n.mapPossibleOrphanedElements[n.possibleOrphanedElements.value[c]]=!0;for(n.mapNoLandmarkedRoles={},c=0;c<n.noLandmarkedRoles.value.length;++c)n.mapNoLandmarkedRoles[n.noLandmarkedRoles.value[c]]=!0;o.CacheUtil.setCache(e.dom.node.ownerDocument,"aria_content_in_landmark",n)}var m=e.dom.node,p=m.nodeName.toLowerCase();if(!u.VisUtil.isNodeVisible(m)||null!=u.VisUtil.hiddenByDefaultElements&&null!=u.VisUtil.hiddenByDefaultElements&&u.VisUtil.hiddenByDefaultElements.indexOf(p)>-1)return(0,a.RulePass)("Pass_0");if(!r.CommonUtil.hasInnerContentHidden(m)&&-1===["area","input","embed","button","textarea","select"].indexOf(p))return(0,a.RulePass)("Pass_0");if("table"==p&&d.TableUtil.isLayoutTable(m))return null;var h=!0,g=l.AriaUtil.hasRole(m,n.mapPossibleOrphanedWidgets,!0);"link"===p&&(g=!1);var b=p in n.mapPossibleOrphanedElements;if(!g&&!b)return null;if(!(h=i.aria.map(function(e){return e.role}).filter(function(e){return e in n.mapLandmarks}).length>0)){for(var _=s.DOMWalker.parentElement(m);!h&&null!=_;)h=o.CacheUtil.getCache(_,"Rpt_Aria_OrphanedContent",!1),_=s.DOMWalker.parentElement(_);for(_=m.nextElementSibling;!h&&null!=_;)h=o.CacheUtil.getCache(_,"Rpt_Aria_OrphanedContent",!1),_=_.nextElementSibling;for(_=m.previousElementSibling;!h&&null!=_;)h=o.CacheUtil.getCache(_,"Rpt_Aria_OrphanedContent",!1),_=_.previousElementSibling;if(h)return null;if(o.CacheUtil.setCache(m,"Rpt_Aria_OrphanedContent",!0),h=o.CacheUtil.getCache(m,"Rpt_Aria_OrphanedContent_NoTrigger",!1)||l.AriaUtil.hasRole(m,n.mapNoLandmarkedRoles,!0)||l.AriaUtil.getAncestorWithRole(m,n.mapNoLandmarkedRoles,!0))return o.CacheUtil.setCache(m,"Rpt_Aria_OrphanedContent_NoTrigger",!0),null}return h?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},2759(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_contentinfo_label_unique=void 0;var a=i(461),n=i(461),l=i(7011),r=i(3946);t.aria_contentinfo_label_unique={id:"aria_contentinfo_label_unique",context:"aria:contentinfo",refactor:{Rpt_Aria_MultipleContentinfoLandmarks_Implicit:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_contentinfo_label_unique.html",fail_label_not_unique:"aria_contentinfo_label_unique.html",group:"aria_contentinfo_label_unique.html"}},messages:{"en-US":{pass:'The element with "contentinfo" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "contentinfo" role do not have unique labels',group:'Each element with "contentinfo" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var o=l.AriaUtil.isLandmarkNameUnique(n,"contentinfo",!0);return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},3141(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_contentinfo_misuse=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(3946);t.aria_contentinfo_misuse={id:"aria_contentinfo_misuse",context:"dom:*[role], dom:footer, dom:address",refactor:{Rpt_Aria_ContentinfoWithNoMain_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_contentinfo_misuse.html",Fail_1:"aria_contentinfo_misuse.html",group:"aria_contentinfo_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Element with "contentinfo" role is present without an element with "main" role',group:'Each element with "contentinfo" role is only permitted with an element with "main" role'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;return o.VisUtil.isNodeHiddenFromAT(n)?null:l.AriaUtil.hasRoleInSemantics(n,"contentinfo")?r.CommonUtil.getElementsByRoleHidden(n.ownerDocument,"main",!0,!0).length>0?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1"):null}}},5131(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_contentinfo_single=void 0;var a=i(461),n=i(461),l=i(7011),r=i(3946);t.aria_contentinfo_single={id:"aria_contentinfo_single",context:"dom:*[role], dom:footer, dom:address",refactor:{Rpt_Aria_MultipleContentinfoInSiblingSet_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_contentinfo_single.html",Fail_1:"aria_contentinfo_single.html",group:"aria_contentinfo_single.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "contentinfo" role found on the page',group:'A page, document, or application should only have one element with "contentinfo" role'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;return r.VisUtil.isNodeHiddenFromAT(n)?null:l.AriaUtil.hasRoleInSemantics(n,"contentinfo")?l.AriaUtil.getSiblingWithRoleHidden(n,"contentinfo",!0,!0)?(0,a.RuleFail)("Fail_1"):(0,a.RulePass)("Pass_0"):null}}},5167(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_descendant_valid=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(3946);t.aria_descendant_valid={id:"aria_descendant_valid",context:"dom:*",dependencies:["aria_role_valid"],help:{"en-US":{group:"aria_descendant_valid.html",pass:"aria_descendant_valid.html",potential_child_implicit_role:"aria_descendant_valid.html",recommendation_no_impact_role:"aria_descendant_valid.html",fail_child_explicit_role:"aria_descendant_valid.html"}},messages:{"en-US":{group:"Browsers ignore the explicit and implicit ARIA roles of the descendants of certain elements",pass:"The element contains valid descendants",potential_child_implicit_role:'The element with role "{0}" contains descendants with implicit roles "{1}" which are ignored by browsers',recommendation_no_impact_role:'The element with role "{0}" contains descendants with roles "{1}" which are ignored by browsers',fail_child_explicit_role:'The element with role "{0}" contains descendants with roles "{1}" which are ignored by browsers'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE,reasonCodes:["pass","potential_child_implicit_role","fail_child_explicit_role"]},{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE,reasonCodes:["recommendation_no_impact_role"]}],act:["307n5z"],run:function(e,t,i){var n=e.dom.node;if(!o.VisUtil.isNodeHiddenFromAT(n)&&!r.CommonUtil.isNodeDisabled(n)&&l.AriaUtil.containsPresentationalChildrenOnly(n)){var s=l.AriaUtil.getRoles(n,!1);if(s&&0!==s.length||(s=l.AriaUtil.getImplicitRole(n)),!s||0===s.length)return null;var u=l.AriaUtil.getDirectATChildren(n);if(!(u&&u.length>0))return(0,a.RulePass)("pass");for(var d=new Array,c=new Array,m=new Array,p=0;p<u.length;p++){var h=u[p].nodeName.toLowerCase();if("img"!==h&&"svg"!==h){var g=l.AriaUtil.getRoles(u[p],!1);g&&g.length>0?(g.includes("code")&&m.push(g.filter(function(e){return"code"===e}).join(", ")),d.push(g.filter(function(e){return"code"!==e}).join(", "))):((g=l.AriaUtil.getImplicitRole(u[p])).includes("code")&&m.push(g.filter(function(e){return"code"===e}).join(", ")),g&&g.length>0&&c.push(g.filter(function(e){return"code"!==e}).join(", ")))}}if(d.length>0){for(var b=[],_=0;_<d.length;_++)(f=new Array).push(s.join(", ")),f.push(d[_]),b.push((0,a.RuleFail)("fail_child_explicit_role",f));return b}if(c.length>0){for(b=[],_=0;_<c.length;_++)(f=new Array).push(s.join(", ")),f.push(c[_]),b.push((0,a.RulePotential)("potential_child_implicit_role",f));return b}if(m.length>0){for(b=[],_=0;_<m.length;_++){var f;(f=new Array).push(s.join(", ")),f.push(m[_]),b.push((0,a.RulePotential)("recommendation_no_impact_role",f))}return b}}}}},8115(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_document_label_unique=void 0;var a=i(461),n=i(461),l=i(7011),r=i(3946);t.aria_document_label_unique={id:"aria_document_label_unique",context:"aria:document",refactor:{Rpt_Aria_MultipleDocumentRoles:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_document_label_unique.html",fail_label_not_unique:"aria_document_label_unique.html",group:"aria_document_label_unique.html"}},messages:{"en-US":{pass:'The element with "document" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "document" roles do not have unique labels',group:'Each element with "document" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var o=l.AriaUtil.isLandmarkNameUnique(n,"document",!0);return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},5733(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_eventhandler_role_valid=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139);t.aria_eventhandler_role_valid={id:"aria_eventhandler_role_valid",context:"dom:*[onclick],dom:*[onblur], dom:*[ondblclick], dom:*[onfocus], dom:*[onkeydown],dom:*[onkeypress], dom:*[onkeyup], dom:*[onmousedown], dom:*[onmouseup], dom:*[onmousemove], dom:*[onmouseout], dom:*[onmouseover], dom:*[onresize], dom:*[onchange]",refactor:{Rpt_Aria_EventHandlerMissingRole_Native_Host_Sematics:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_eventhandler_role_valid.html",Fail_1:"aria_eventhandler_role_valid.html",group:"aria_eventhandler_role_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The <{0}> element with '{1}' does not have a valid ARIA role specified",group:"Elements with event handlers must have a valid ARIA role"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.CommonUtil.getAncestor(n,"svg"))return null;if(l.AriaUtil.hasAnyRole(n,!0))return(0,a.RulePass)("Pass_0");if(r.CommonUtil.isfocusableByDefault(n))return(0,a.RulePass)("Pass_0");var o=new Array;o.push(n.nodeName.toLowerCase());for(var s=new Array,u=["onblur","onfocus","onchange","onclick","ondblclick","onkeydown","onkeypress","onkeyup","onmousedown","onmouseup","onmousemove","onmouseout","onmouseover","onresize"],d=0;d<u.length;++d)n.hasAttribute(u[d])&&s.push(u[d]);var c=new Array;return c.push(s.join(", ")),(0,a.RuleFail)("Fail_1",[o.toString(),c.toString()])}}},5782(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_form_label_unique=void 0;var a=i(461),n=i(461),l=i(7011),r=i(3946);t.aria_form_label_unique={id:"aria_form_label_unique",context:"aria:form",refactor:{Rpt_Aria_MultipleFormLandmarks_Implicit:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_form_label_unique.html",fail_label_not_unique:"aria_form_label_unique.html",group:"aria_form_label_unique.html"}},messages:{"en-US":{pass:'The element with "form" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "form" role do not have unique labels',group:'Each element with "form" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var o=l.AriaUtil.isLandmarkNameUnique(n,"form",!0);return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},6731(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_graphic_labelled=void 0;var a=i(461),n=i(7011),l=i(7139),r=i(3946);t.aria_graphic_labelled={id:"aria_graphic_labelled",context:"aria:graphics-document,aria:graphics-symbol",refactor:{HAAC_Aria_SvgAlt:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{group:"aria_graphic_labelled.html",Pass_0:"aria_graphic_labelled.html",Fail_1:"aria_graphic_labelled.html",Fail_2:"aria_graphic_labelled.html",Fail_3:"aria_graphic_labelled.html"}},messages:{"en-US":{group:"An element with a graphics role must have a non-empty label",Pass_0:"Rule Passed",Fail_1:'Element with "{0}" graphics role has no label',Fail_2:'Element with "{0}" graphics role has no label or an empty label',Fail_3:"Element with \"{0}\" graphics role missing non-empty 'aria-label' or 'aria-labelledby'"}},rulesets:[],act:[{"7d6734":{Pass_0:"pass",Fail_1:"inapplicable",Fail_2:"fail",Fail_3:"inapplicable"}}],run:function(e,t,i){var o=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(o))return null;if(!o.hasAttribute("role")||!o.getAttribute("role").includes("graphics-"))return null;var s=n.AriaUtil.getAriaLabel(o).length>0;if(!s&&"svg"===o.nodeName.toLowerCase()){var u=o.querySelector("title");s=u&&l.CommonUtil.hasInnerContent(u)}return s||(s=l.CommonUtil.attributeNonEmpty(o,"title")),s?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_2",[o.getAttribute("role")])}}},390(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_hidden_nontabbable=void 0;var a=i(7139),n=i(461),l=i(461);t.aria_hidden_nontabbable={id:"aria_hidden_nontabbable",context:"dom:*[aria-hidden=true], dom:*[aria-hidden=true] dom:*",refactor:{aria_hidden_focus_misuse:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"aria_hidden_nontabbable.html",Pass_0:"aria_hidden_nontabbable.html",Fail_1:"aria_hidden_nontabbable.html"}},messages:{"en-US":{group:"A hidden element should not contain any tabbable elements",Pass_0:"Rule Passed",Fail_1:"Element \"{0}\" should not be focusable within the subtree of an element with an 'aria-hidden' attribute with value 'true'"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:["1.3.1","4.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_TWO}],act:"6cfa84",run:function(e,t,i){var l=e.dom.node,r=l.nodeName.toLowerCase();return a.CommonUtil.isTabbable(l)?(0,n.RuleFail)("Fail_1",[r]):(0,n.RulePass)("Pass_0")}}},3900(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_id_unique=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(5279),s=i(9910),u=i(3946);t.aria_id_unique={id:"aria_id_unique",context:"dom:*",refactor:{Rpt_Aria_ValidIdRef:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_id_unique.html",Fail_1:"aria_id_unique.html",group:"aria_id_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The 'id' \"{0}\" specified for the ARIA property '{1}' value is not valid",group:"The ARIA property must reference a non-empty unique id of an existing element that is visible"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:["59796f","6a7281"],run:function(e,t,i){var n=e.dom.node,d=!0,c=new Array,m=(new Array,o.FragmentUtil.getOwnerFragment(n)),p=n.attributes,h=new Array,g=0;if(p)for(var b=0,_=p.length;b<_;b++){d=!0;var f=p[b].name;if(l.AriaUtil.isDefinedAriaAttribute(n,f)){var v=s.ARIADefinitions.propertyDataTypes[f];if(v&&v.type){var A="http://www.w3.org/2001/XMLSchema#idref"==v.type;if(A||"http://www.w3.org/2001/XMLSchema#idrefs"==v.type){g++;var w=r.CommonUtil.normalizeSpacing(p[b].nodeValue).length,y=p[b].nodeValue.split(" ");if(w<1)d=!1,h.push('"'+p[b].nodeValue+'"');else if(A&&w>=1&&y.length>1){d=!1;for(var C=0,k=y.length;C<k;++C)""!=y[C]&&h.push(y[C])}if(d&&w>=1)for(var R=0,x=y.length;R<x;++R)if(y[R].length>0){var P=m.getElementById(y[R]);if((d=null!=P)&&!v.hiddenIDRefSupported&&(d=u.VisUtil.isNodeVisible(P)),d)break;""!=y[R]&&h.push(y[R])}}}d||c.push(f)}}var T=0==c.length,U=new Array,I=new Array,E=new Array;return T||(I.push(c.join(", ")),E.push(n.nodeName.toLowerCase()),h.length>0&&U.push(h.join(", "))),0==g?null:T?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[U.toString(),I.toString(),E.toString()])}}},1218(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_img_labelled=void 0;var a=i(461),n=i(7011),l=i(7139),r=i(3946);t.aria_img_labelled={id:"aria_img_labelled",context:"aria:img, aria:image",refactor:{HAAC_Aria_ImgAlt:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{group:"aria_img_labelled.html",Pass_0:"aria_img_labelled.html",Fail_1:"aria_img_labelled.html",Fail_2:"aria_img_labelled.html",Fail_3:"aria_img_labelled.html"}},messages:{"en-US":{group:'An element with "img" role must have a non-empty label',Pass_0:"Rule Passed",Fail_1:'Element with "img" role has no label',Fail_2:'Element with "img" role has no label or an empty label',Fail_3:"Element with \"img\" role missing non-empty 'aria-label' or 'aria-labelledby'"}},rulesets:[],act:["23a2a8",{"7d6734":{Pass_0:"pass",Fail_1:"inapplicable",Fail_2:"fail",Fail_3:"inapplicable"}}],run:function(e,t,i){var o=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(o))return null;if(!o.hasAttribute("role"))return null;var s=o.nodeName.toLocaleLowerCase();if("svg"!==s&&"img"!==s){var u=n.AriaUtil.getAriaLabel(o).length>0;if(!u&&"svg"===o.nodeName.toLowerCase()){var d=o.querySelector("title");u=d&&l.CommonUtil.hasInnerContent(d)}return u||(u=l.CommonUtil.attributeNonEmpty(o,"title")),u?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_2")}}}},6734(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_keyboard_handler_exists=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(9910),s=i(3946);t.aria_keyboard_handler_exists={id:"aria_keyboard_handler_exists",context:"dom:*[role]",dependencies:["aria_role_allowed"],refactor:{Rpt_Aria_MissingKeyboardHandler:{pass:"pass",potential_no_keyboard_access:"potential_no_keyboard_access"}},help:{"en-US":{pass:"aria_keyboard_handler_exists.html",potential_no_keyboard_access:"aria_keyboard_handler_exists.html",group:"aria_keyboard_handler_exists.html"}},messages:{"en-US":{pass:"Rule Passed",potential_no_keyboard_access:'Verify the <{0}> element with "{1}" role has keyboard access',group:"Interactive WAI_ARIA UI components must provide keyboard access"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(!s.VisUtil.isNodeHiddenFromAT(n)&&!r.CommonUtil.isNodeDisabled(n)){var u=!0,d=u,c=n.ownerDocument,m=o.ARIADefinitions.designPatterns,p=l.AriaUtil.getRoles(n,!1);if("datalist"===n.nodeName.toLowerCase()&&p&&p.includes("listbox"))return null;for(var h=["combobox","grid","listbox","menu","menubar","radiogroup","tablist","tree","treegrid"],g=0,b=h;g<b.length;g++){var _=b[g];if(null!=l.AriaUtil.getAncestorWithRole(n,_,!0))return null}for(var f=r.CommonUtil.hasAttribute,v=new Array,A=0;A<p.length;++A){if(m[p[A]],h.indexOf(p[A])>=0&&!(f(n,"aria-disabled")&&n.getAttribute("aria-disabled")||(u=n.hasAttribute("onkeydown")||n.hasAttribute("onkeypress")||n.hasAttribute("onkeyup"))))if(f(n,"aria-activedescendant"))u=!0;else{var w,y=o.ARIADefinitions.designPatterns[p[A]].reqChildren;if(y)for(var C=0,k=y.length;C<k;C++)for(var R="*[contains(@role,'"+y[C]+"')]",x=c.evaluate(R,n,r.CommonUtil.defaultNSResolver,0,null),P=x.iterateNext();P;){if(!(u=P.hasAttribute("onkeydown")||P.hasAttribute("onkeypress")))for(var T="descendant::*",U=(w=c.evaluate(T,P,r.CommonUtil.defaultNSResolver,0,null)).iterateNext();U&&!u;)r.CommonUtil.shouldNodeBeSkippedHidden(U)||(u=r.CommonUtil.isTabbable(U)&&(U.hasAttribute("onkeydown")||U.hasAttribute("onkeypress")))||"a"==U.nodeName.toLowerCase()&&U.hasAttribute("href")&&(u=(I=U.getAttribute("href")).startsWith("javascript:")&&-1==I.indexOf("void")&&I.length>11),U=w.iterateNext();if(!u)break;P=x.iterateNext()}else for(T="descendant::*",U=(w=c.evaluate(T,n,r.CommonUtil.defaultNSResolver,0,null)).iterateNext();U&&!u;)if(r.CommonUtil.shouldNodeBeSkippedHidden(U))U=w.iterateNext();else{var I;(u=r.CommonUtil.isTabbable(U)&&(U.hasAttribute("onkeydown")||U.hasAttribute("onkeypress")))||"a"==U.nodeName.toLowerCase()&&U.hasAttribute("href")&&(u=(I=U.getAttribute("href")).startsWith("javascript:")&&-1==I.indexOf("void")&&I.length>11),U=w.iterateNext()}}u||v.push(p[A]),!u&&d&&(d=u)}var E=new Array;E.push(n.nodeName.toLowerCase());var N=new Array;N.push(v.join(", "));var L=n.getAttribute("id");return L&&L.trim().length>0&&n.ownerDocument.querySelector("*[aria-controls='".concat(L,"'][role='combobox']"))?null:d?(0,a.RulePass)("pass"):(0,a.RulePotential)("potential_no_keyboard_access",[E.toString(),N.toString()])}}}},9973(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_landmark_name_unique=void 0;var a=i(461),n=i(461),l=i(9955),r=i(1686),o=i(5279),s=i(4566),u=i(1950),d=i(3946),c=i(7139),m=i(7011);t.aria_landmark_name_unique={id:"aria_landmark_name_unique",context:"aria:complementary, aria:banner, aria:contentinfo, aria:main, aria:navigation, aria:region, aria:search, aria:form",refactor:{landmark_name_unique:{Pass_0:"pass",Fail_0:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_landmark_name_unique.html",fail_label_not_unique:"aria_landmark_name_unique.html",group:"aria_landmark_name_unique.html"}},messages:{"en-US":{pass:"Multiple elements with \"{0}\" landmarks within the same parent region are distinguished by unique 'aria-label' or 'aria-labelledby'",fail_label_not_unique:'Multiple elements with "{0}" landmarks within the same parent region are not distinguished from one another because they have the same "{1}" label',group:"Each landmark should have a unique 'aria-labelledby' or 'aria-label' or be nested in a different parent region"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE},{id:["WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(d.VisUtil.isNodeHiddenFromAT(n))return null;if(null!==c.CommonUtil.getAncestor(n,["DIALOG"])||null!==m.AriaUtil.getAncestorWithRole(n,"dialog",!0))return null;var p=o.FragmentUtil.getOwnerFragment(n),h=s.CacheUtil.getCache(n.ownerDocument,"aria_landmark_name_unique",null);if(!h){h={navigationNodes:[],navigationNodesComputedLabels:[],navigationNodesParents:[],navigationNodesMatchFound:[]};for(var g=p.querySelectorAll('aside,[role="complementary"], footer,[role="contentinfo"], header,[role="banner"], main,[role="main"], nav,[role="navigation"], form,[role="form"], section,[role="region"],[role="search"]'),b=Array.from(g),_=[],f=[],v=[],A=0;A<b.length;A++)d.VisUtil.isNodeHiddenFromAT(b[A])||null!==c.CommonUtil.getAncestor(b[A],["DIALOG"])||null!==m.AriaUtil.getAncestorWithRole(b[A],"dialog",!0)||v.push(b[A]);for(b=v,A=0;A<b.length;A++){for(var w=[],y=b[A].parentElement;y;)w.push(y),y=y.parentElement;for(var C=0;C<w.length;C++){var k=["ASIDE","FOOTER","FORM","HEADER","MAIN","NAV","SECTION"].includes(w[C].tagName),R=!1;if(w[C].hasAttribute("role")&&(R=["complementary","contentinfo","form","banner","main","navigation","region","search"].includes(w[C].getAttribute("role"))),k||R){_.push(w[C]);break}if(C===w.length-1){_.push(null);break}}}var x=[];for(A=0;A<b.length;A++){var P=u.AccNameUtil.computeAccessibleName(b[A]);x.push(P&&P.name&&P.name.trim().length>0?P.name.trim():"")}for(A=0;A<_.length;A++){var T=!1,U=!1;for(C=0;C<_.length;C++)if(C!==A){if(null===_[A]&&null===_[C]){if(l.ARIAMapper.nodeToRole(b[A])===l.ARIAMapper.nodeToRole(b[C])){if(x[A]===x[C]){f.push("fail_label_not_unique"),T=!0;break}U=!0}}else if(null===_[A]||null===_[C])continue;if(r.DOMUtil.sameNode(_[A],_[C])&&l.ARIAMapper.nodeToRole(b[A])===l.ARIAMapper.nodeToRole(b[C])){if(x[A]===x[C]){f.push("fail_label_not_unique"),T=!0;break}U=!0}}T||(U?f.push("pass"):f.push("null"))}h.navigationNodesComputedLabels=x,h.navigationNodes=b,h.navigationNodesParents=_,h.navigationNodesMatchFound=f,s.CacheUtil.setCache(n.ownerDocument,"aria_landmark_name_unique",h)}var I=-1;for(A=0;A<h.navigationNodes.length;A++)n.isSameNode(h.navigationNodes[A])&&(I=A);return-1===I?null:"pass"===h.navigationNodesMatchFound[I]?(0,a.RulePass)("pass",[l.ARIAMapper.nodeToRole(h.navigationNodes[I])]):"fail_label_not_unique"===h.navigationNodesMatchFound[I]?(0,a.RuleFail)("fail_label_not_unique",[l.ARIAMapper.nodeToRole(h.navigationNodes[I]),h.navigationNodesComputedLabels[I]]):null}}},5711(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_main_label_unique=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(3946);t.aria_main_label_unique={id:"aria_main_label_unique",context:"aria:main",refactor:{Rpt_Aria_MultipleMainsRequireLabel_Implicit_2:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_main_label_unique.html",Fail_1:"aria_main_label_unique.html",group:"aria_main_label_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "main" role do not have unique labels',group:'Each element with "main" role must have unique label that describes its purposes'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(o.VisUtil.isNodeHiddenFromAT(n))return null;for(var s=l.AriaUtil.getAriaLabel(n),u=l.AriaUtil.getAncestorWithRole(n,"document",!0),d=r.CommonUtil.getElementsByRoleHidden(n.ownerDocument,"main",!0,!0),c=null,m=0;m<d.length;++m)if(d[m]!==n&&(c=(0,a.RulePass)("Pass_0"),l.AriaUtil.getAncestorWithRole(d[m],"document",!0)===u&&l.AriaUtil.getAriaLabel(d[m])===s)){c=(0,a.RuleFail)("Fail_1");break}return c}}},3384(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_main_label_visible=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(3946);t.aria_main_label_visible={id:"aria_main_label_visible",context:"dom:body",refactor:{Rpt_Aria_MultipleMainsVisibleLabel_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_main_label_visible.html",Fail_1:"aria_main_label_visible.html",group:"aria_main_label_visible.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "main" role do not have unique visible labels',group:'Each element with "main" role should have a unique visible label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(o.VisUtil.isNodeHiddenFromAT(n))return null;var s=r.CommonUtil.getElementsByRoleHidden(n.ownerDocument,"main",!0,!0);return 0===s.length||1===s.length?null:l.AriaUtil.hasUniqueAriaLabelledby(s)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},2762(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_navigation_label_unique=void 0;var a=i(461),n=i(461),l=i(7011),r=i(3946);t.aria_navigation_label_unique={id:"aria_navigation_label_unique",context:"aria:navigation",refactor:{Rpt_Aria_MultipleNavigationLandmarks_Implicit:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_navigation_label_unique.html",fail_label_not_unique:"aria_navigation_label_unique.html",group:"aria_navigation_label_unique.html"}},messages:{"en-US":{pass:'The element with "navigation" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "navigation" role do not have unique labels',group:'Each element with "navigation" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var o=l.AriaUtil.isLandmarkNameUnique(n,"navigation",!0);return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},5757(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_parent_required=void 0;var a=i(461),n=i(461),l=i(9910),r=i(7011),o=i(7139),s=i(3946);t.aria_parent_required={id:"aria_parent_required",context:"dom:*[role]",dependencies:["aria_role_allowed"],refactor:{Rpt_Aria_RequiredParent_Native_Host_Sematics:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"aria_parent_required.html",Pass_0:"aria_parent_required.html",Fail_1:"aria_parent_required.html"}},messages:{"en-US":{group:"Each element with an implicit or explicit role must be contained within a valid element",Pass_0:"Rule Passed",Fail_1:'Element with "{0}" role is not contained in or owned by an element with one of the following roles: "{1}"'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:"ff89c9",run:function(e,t,i){var n=e.dom.node;if(!(s.VisUtil.isNodeHiddenFromAT(n)||o.CommonUtil.isNodeDisabled(n)||r.AriaUtil.shouldBePresentationalChild(n)||s.VisUtil.isNodePresentational(n))){for(var u=!0,d=l.ARIADefinitions.designPatterns,c=new Array,m=new Array,p=0,h=i.aria.map(function(e){return e.role}),g=h[h.length-2],b=2;"none"===g;)b++,g=h[h.length-b];var _=r.AriaUtil.getResolvedRole(n);if(d[_]&&null!=d[_].container){p++,u=!1;for(var f=0,v=(m=d[_].container).length;!u&&f<v&&!(u=g===m[f]);f++);0==u&&c.push(_)}var A=new Array;A.push(c.join(", "));var w=new Array;return w.push(m.join(", ")),0==p?null:u?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[A.toString(),w.toString()])}}}},5232(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_region_label_unique=void 0;var a=i(461),n=i(461),l=i(7011),r=i(3946);t.aria_region_label_unique={id:"aria_region_label_unique",context:"aria:region",refactor:{Rpt_Aria_MultipleRegionsUniqueLabel_Implicit:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_region_label_unique.html",fail_label_not_unique:"aria_region_label_unique.html",group:"aria_region_label_unique.html"}},messages:{"en-US":{pass:'The element with "region" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "region" role do not have unique labels',group:'Each element with "region" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var o=l.AriaUtil.isLandmarkNameUnique(n,"region");return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},1891(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_region_labelled=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(3946);t.aria_region_labelled={id:"aria_region_labelled",context:"aria:region",refactor:{Rpt_Aria_RegionLabel_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_region_labelled.html",Fail_1:"aria_region_labelled.html",group:"aria_region_labelled.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Element with "region" role does not have a label',group:'Each element with "region" role must have a label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;return o.VisUtil.isNodeHiddenFromAT(n)?null:l.AriaUtil.hasAriaLabel(n)||r.CommonUtil.attributeNonEmpty(n,"title")?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},6142(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_role_allowed=void 0;var a=i(461),n=i(461),l=i(7011);t.aria_role_allowed={id:"aria_role_allowed",context:"dom:*[role]",refactor:{Rpt_Aria_ValidRole:{Pass_0:"Pass_0",Fail_2:"Fail_2",Potential_1:"Potential_1"}},help:{"en-US":{group:"aria_role_allowed.html",Pass_0:"aria_role_allowed.html",Fail_2:"aria_role_allowed.html",Potential_1:"aria_role_allowed.html"}},messages:{"en-US":{group:"Elements must have a valid 'role' per ARIA specification",Pass_0:"Rule Passed",Fail_2:"The role '{0}' defined on the element is not valid per ARIA specification",Potential_1:"Some of the roles, '{0}', defined on the element are not valid per ARIA specification"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"4.1.2",level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:"674b10",run:function(e,t,i){var n=e.dom.node,r=n.getAttribute("role").trim().toLowerCase();if(0===r.length)return null;if(n.hasAttribute("aria-hidden")&&"true"===n.getAttribute("aria-hidden").toLowerCase())return null;var o=l.AriaUtil.getRolesUndefinedByAria(n);if(!o||0===o.length)return(0,a.RulePass)("Pass_0");var s=r.split(/\s+/);return o.length===s.length?(0,a.RuleFail)("Fail_2",[o.join(",")]):o.length>0?(0,a.RulePotential)("Potential_1",[o.join(",")]):void 0}}},4863(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_role_redundant=void 0;var a=i(461),n=i(461),l=i(7011);t.aria_role_redundant={id:"aria_role_redundant",context:"dom:*[role]",help:{"en-US":{pass:"aria_role_redundant.html",fail_redundant:"aria_role_redundant.html",group:"aria_role_redundant.html"}},messages:{"en-US":{pass:"An explicitly-assigned ARIA role is not redundant with the implicit role of the element",fail_redundant:'The explicitly-assigned ARIA role "{0}" is redundant with the implicit role of the element <{1}>',group:"An explicitly-assigned ARIA role should not be redundant with the implicit role of the element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["ARIA"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,r=n.tagName.toLowerCase(),o=l.AriaUtil.getRoles(n,!1);if(o&&0!==o.length){if(!l.AriaUtil.areRolesDefined(o))return null;var s=l.AriaUtil.getImplicitRole(n);if(!s||0===s.length)return(0,a.RulePass)("pass");for(var u=[],d=0;d<o.length;d++)s.includes(o[d])?u.push((0,a.RuleFail)("fail_redundant",[o[d],r])):u.push((0,a.RulePass)("pass"));return u.length>0?u:null}}}},1440(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_search_label_unique=void 0;var a=i(461),n=i(461),l=i(7011),r=i(3946);t.aria_search_label_unique={id:"aria_search_label_unique",context:"aria:search",refactor:{Rpt_Aria_MultipleSearchLandmarks:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_search_label_unique.html",fail_label_not_unique:"aria_search_label_unique.html",group:"aria_search_label_unique.html"}},messages:{"en-US":{pass:'The element with "search" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "search" role do not have unique labels',group:'Each element with "search" role must have a unique label that describes its purpose'}},rulesets:[{id:[],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var o=l.AriaUtil.isLandmarkNameUnique(n,"search",!0);return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},1968(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_valid=t.aria_role_valid=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139);t.aria_role_valid={id:"aria_role_valid",context:"dom:*",dependencies:["aria_attribute_allowed"],refactor:{aria_semantics_role:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_0:"aria_role_valid.html",Fail_1:"aria_role_valid.html",Fail_2:"aria_role_valid.html",group:"aria_role_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The ARIA role '{0}' is not valid for the element <{1}>",Fail_2:"The ARIA role '{0}' is not valid for the element <{1}> and may be ignored by the browser since the element is focusable",group:"ARIA roles must be valid for the element to which they are assigned"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,o=n.tagName.toLowerCase();if(1!==n.nodeType)return null;var s=l.AriaUtil.getRolesUndefinedByAria(n);if(s&&s.length>0)return null;var u=l.AriaUtil.getDeprecatedAriaRoles(n);if(u&&u.length>0)return null;var d=l.AriaUtil.getDeprecatedAriaAttributes(n);if(d&&d.length>0)return null;if(["td","th","tr"].includes(o)){var c=r.CommonUtil.isTableDescendant(i);if(null!==c&&c.length>0)return null}var m=l.AriaUtil.getUserDefinedRoles(n);if(!m||0===m.length)return null;if(m.includes("generic"))return(0,a.RuleFail)("Fail_1",["generic",o]);var p=l.AriaUtil.getInvalidRoles(n);return null===p||0===p.length?(0,a.RulePass)("Pass_0",[m.join(", "),o]):p.includes("presentation")||p.includes("none")&&r.CommonUtil.isTabbable(n)?(0,a.RuleFail)("Fail_2",[p.join(", "),o]):p.length>0?(0,a.RuleFail)("Fail_1",[p.join(", "),o]):m.length>0?(0,a.RulePass)("Pass_0",[m.join(", "),o]):null}},t.aria_attribute_valid={id:"aria_attribute_valid",context:"dom:*",dependencies:["aria_attribute_deprecated","aria_role_valid"],refactor:{aria_attribute_allowed:{Pass:"Pass",Fail_invalid_role_attr:"Fail_invalid_role_attr",Fail_invalid_implicit_role_attr:"Fail_invalid_implicit_role_attr"}},help:{"en-US":{group:"aria_attribute_valid.html",Pass:"aria_attribute_valid.html",Fail_invalid_role_attr:"aria_attribute_valid.html",Fail_invalid_implicit_role_attr:"aria_attribute_valid.html"}},messages:{"en-US":{group:"ARIA attributes should be valid for the element and ARIA role to which they are assigned",Pass:"ARIA attributes are valid for the element and ARIA role",Fail_invalid_role_attr:'The ARIA attributes "{0}" are not valid for the element <{1}> with ARIA role "{2}"',Fail_invalid_implicit_role_attr:'The ARIA attributes "{0}" are not valid for the element <{1}> with implicit ARIA role "{2}"'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["ARIA"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:["5c01ea",{"46ca7f":{Pass:"pass",Fail_invalid_role_attr:"fail",Fail_invalid_implicit_role_attr:"fail"}}],run:function(e,t,i){var n=e.dom.node;if(1!==n.nodeType)return null;var r=l.AriaUtil.getUserDefinedAriaAttributes(n);if(null===r||0===r.length)return null;var o=l.AriaUtil.getUserDefinedRoles(n),s=!0;if(o&&o.length>0){if(!l.AriaUtil.areRolesDefined(o))return null}else o=l.AriaUtil.getImplicitRole(n),s=!1;var u=n.tagName.toLowerCase(),d=l.AriaUtil.getInvalidAriaAttributes(n);return d&&0!==d.length?o.length>0?s?(0,a.RuleFail)("Fail_invalid_role_attr",[d.join(", "),u,o.join(", ")]):(0,a.RuleFail)("Fail_invalid_implicit_role_attr",[d.join(", "),u,o.join(", ")]):(0,a.RuleFail)("Fail_invalid_role_attr",[d.join(", "),u,"none"]):(0,a.RulePass)("Pass",[r.join(", "),u,o.join(", ")])}}},1617(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_toolbar_label_unique=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(4566);t.aria_toolbar_label_unique={id:"aria_toolbar_label_unique",context:"aria:toolbar",refactor:{Rpt_Aria_MultipleToolbarUniqueLabel:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_toolbar_label_unique.html",Fail_1:"aria_toolbar_label_unique.html",group:"aria_toolbar_label_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "toolbar" roles do not have unique labels',group:'Each element with "toolbar" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,s=r.CommonUtil.getElementsByRoleHidden(n.ownerDocument,"toolbar",!0,!0);if(0===s.length||1===s.length)return null;var u=o.CacheUtil.getCache(n.ownerDocument,"aria_toolbar_label_unique",null);u||(u=l.AriaUtil.findAriaLabelDupes(s),o.CacheUtil.setCache(n.ownerDocument,"aria_toolbar_label_unique",u));var d=l.AriaUtil.getAriaLabel(n);return""!==d&&(!(d in u)||u[d]<=1)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[d])}}},3475(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_widget_labelled=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(9955),s=i(5279),u=i(9910),d=i(1686);t.aria_widget_labelled={id:"aria_widget_labelled",context:"dom:*",refactor:{Rpt_Aria_WidgetLabels_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"aria_widget_labelled.html",Pass_0:"aria_widget_labelled.html",Fail_1:"aria_widget_labelled.html"}},messages:{"en-US":{group:"Interactive component must have a programmatically associated name",Pass_0:"Rule Passed",Fail_1:"Interactive component with ARIA role '{0}' does not have a programmatically associated name"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:"m6b1q3",run:function(e,t,i){var n=e.dom.node;if(n.hasAttribute("type")&&"hidden"===n.getAttribute("type")||l.AriaUtil.getAncestorWithRole(n,"combobox")&&!l.AriaUtil.hasRoleInSemantics(n,"textbox")&&!l.AriaUtil.hasRoleInSemantics(n,"searchbox"))return null;var c=o.ARIAMapper.nodeToRole(n),m=n.nodeName.toLowerCase();if(["button","checkbox","combobox","listbox","menuitemcheckbox","menuitemradio","radio","searchbox","slider","spinbutton","switch","textbox","progressbar","link"].includes(c))return null;if("output"===m||"input"===m&&n.getAttribute("type"),!n.hasAttribute("role")&&-1!=["input","textarea","select","button","datalist","optgroup","option","keygen","output","progress","meter"].indexOf(n.nodeName.toLowerCase()))return null;for(var p=["listbox","tree","grid","dialog"],h=0;h<p.length;h++)if(l.AriaUtil.hasRoleInSemantics(n,p[h]))for(var g=r.CommonUtil.getElementsByRoleHidden(n.ownerDocument,"combobox",!0,!0),b=0;b<g.length;b++){var _=g[b],f=r.CommonUtil.getElementAttribute(_,"aria-owns");if(f)for(var v=r.CommonUtil.normalizeSpacing(f.trim()).split(" "),A=0;A<v.length;A++)if(s.FragmentUtil.getById(n,v[A])===n)return null}for(var w=!0,y=u.ARIADefinitions.designPatterns,C=l.AriaUtil.getRoles(n,!0),k=0,R=["widget","liveRegion","window"],x=(A=0,C.length);w&&A<x;++A){var P=y[C[A]];P&&P.nameRequired&&P.roleType&&R.includes(P.roleType)&&(++k,!(w=l.AriaUtil.hasAriaLabel(n)||r.CommonUtil.attributeNonEmpty(n,"title")||r.CommonUtil.getLabelForElementHidden(n,!0))&&P.nameFrom&&P.nameFrom.indexOf("contents")>=0&&(w=r.CommonUtil.hasInnerContentOrAlt(n)),w||(w=r.CommonUtil.hasImplicitLabel(n)),w||"img"!==n.tagName.toLowerCase()||n.hasAttribute("role")||!n.hasAttribute("alt")||(w=d.DOMUtil.cleanWhitespace(n.getAttribute("alt")).trim().length>0),P.nameFrom.indexOf("prohibited"))}return 0===k?null:w?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[c])}}},3370(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.asciiart_alt_exists=void 0;var a=i(461),n=i(7139);t.asciiart_alt_exists={id:"asciiart_alt_exists",context:"dom:pre, dom:listing, dom:xmp, dom:plaintext",refactor:{RPT_Pre_ASCIIArt:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"asciiart_alt_exists.html",Potential_1:"asciiart_alt_exists.html",group:"asciiart_alt_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that ASCII art has a text alternative",group:"ASCII art must have a text alternative"}},rulesets:[],act:[],run:function(e,t,i){var l=e.dom.node;if("pre"==l.nodeName.toLowerCase()&&(l.previousSibling&&"code"==l.previousSibling.nodeName.toLowerCase()||l.getElementsByTagName("code").length>0||n.CommonUtil.getAncestor(l,"code")))return(0,a.RulePass)("Pass_0");for(var r=!0,o=n.CommonUtil.getInnerText(l),s=0,u=0,d="",c=0;r&&c<o.length;++c){var m=o.substr(c,1);/[\w!@#$%&\*().,?\[\]{}<>=":\/\\-]/.test(m)?d==m?u+=1:u=0:(/\s/.test(m)||(s+=1),u=0),d=m,(s>=5||u>=4)&&(r=!1)}return r?(0,a.RulePass)("Pass_0"):r?void 0:(0,a.RulePotential)("Potential_1")}}},9272(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.blink_css_review=void 0;var a=i(461),n=i(461),l=i(7139);t.blink_css_review={id:"blink_css_review",context:"dom:style, dom:*[style]",refactor:{RPT_Blink_CSSTrigger1:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{group:"blink_css_review.html",Pass_0:"blink_css_review.html",Potential_1:"blink_css_review.html"}},messages:{"en-US":{group:"Do not use the \"blink\" value of the 'text-decoration' property for longer than five seconds",Pass_0:"Rule Passed",Potential_1:"Check the \"blink\" value of the CSS 'text-decoration' property is not used for more than than five seconds"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"2.2.2",level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node,r=l.CommonUtil.getInnerText(n);n.hasAttribute("style")&&(r=n.getAttribute("style"));var o=-1==r.toLowerCase().indexOf("text-decoration:blink");return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},7735(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.blink_elem_deprecated=void 0;var a=i(461),n=i(461);t.blink_elem_deprecated={id:"blink_elem_deprecated",context:"dom:blink",refactor:{WCAG20_Blink_AlwaysTrigger:{Fail_1:"Fail_1"}},help:{"en-US":{group:"blink_elem_deprecated.html",Fail_1:"blink_elem_deprecated.html"}},messages:{"en-US":{group:"Content that blinks persistently must not be used",Fail_1:"Content found that blinks persistently"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"2.2.2",level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){return(0,a.RuleFail)("Fail_1")}}},3923(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.blockquote_cite_exists=void 0;var a=i(461),n=i(461),l=i(7139);t.blockquote_cite_exists={id:"blockquote_cite_exists",context:"dom:blockquote",refactor:{RPT_Blockquote_HasCite:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"blockquote_cite_exists.html",Potential_1:"blockquote_cite_exists.html",group:"blockquote_cite_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that <blockquote> should have a 'cite' attribute and not be used for indentation only",group:"Use <blockquote> only for quotations, not indentation"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,r=l.CommonUtil.attributeNonEmpty(n,"cite");if(!r){var o=l.CommonUtil.getDocElementsByTag(n,"cite");r=null!=o&&o.length>0}return r?(0,a.RulePass)("Pass_0"):r?void 0:(0,a.RulePotential)("Potential_1")}}},7521(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.canvas_content_described=void 0;var a=i(461),n=i(461),l=i(3946);t.canvas_content_described={id:"canvas_content_described",context:"dom:canvas",refactor:{HAAC_Canvas:{Pass_0:"Pass_0",Manual_1:"Manual_1"}},help:{"en-US":{Pass_0:"canvas_content_described.html",Manual_1:"canvas_content_described.html",group:"canvas_content_described.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Manual_1:"Verify accessibility of the <canvas> element",group:"The <canvas> element may not be accessible"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1","2.1.1","4.1.2"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var r=n.innerHTML.trim().length>0;return r?(0,a.RulePass)("Pass_0"):r?void 0:(0,a.RuleManual)("Manual_1")}}},1852(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.caption_track_exists=void 0;var a=i(461),n=i(461);t.caption_track_exists={id:"caption_track_exists",context:"dom:video",refactor:{HAAC_Video_HasNoTrack:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"caption_track_exists.html",Potential_1:"caption_track_exists.html",group:"caption_track_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that captions are available for any meaningful audio or provide a caption track for the <video> element",group:"A <video> element must have a text alternative for any meaningful audio content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.2.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,l=!1;if("true"===n.getAttribute("aria-hidden"))return null;for(var r=n.getElementsByTagName("track"),o=0;o<r.length;++o)l=l||"captions"===r[o].getAttribute("kind");if(n.textTracks&&n.textTracks.length>0)for(o=0;o<n.textTracks.length;o++)l=l||"captions"===n.textTracks[o].kind;return l?(0,a.RulePass)("Pass_0"):(0,a.RulePotential)("Potential_1")}}},799(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.combobox_active_descendant=void 0;var a=i(461),n=i(461),l=i(7011),r=i(5279),o=i(3864),s=i(4566),u=i(3946);t.combobox_active_descendant={id:"combobox_active_descendant",context:"aria:combobox",dependencies:["combobox_popup_reference"],help:{"en-US":{Pass:"combobox_active_descendant.html",Fail_missing:"combobox_active_descendant.html",Fail_not_in_popup:"combobox_active_descendant.html",Fail_active_role_invalid:"combobox_active_descendant.html",Fail_active_not_selected:"combobox_active_descendant.html",group:"combobox_active_descendant.html"}},messages:{"en-US":{Pass:"'aria-activedescendant' is used appropriately for this combobox",Fail_missing:"The element referenced by 'aria-activedescendant' \"{0}\" does not exist",Fail_not_in_popup:"The element referenced by 'aria-activedescendant' \"{0}\" does not exist within the popup referenced by 'id' \"{1}\"",Fail_active_role_invalid:"The 'aria-activedescendant' \"{0}\" references an element with the roles \"{1}\", which does not have a valid ARIA role of 'option', 'gridcell', 'row', or 'treeitem'",Fail_active_not_selected:"The 'aria-activedescendant' \"{0}\" references an element that does not have 'aria-selected' set to true",group:"'aria-activedescendant' must be used to define focus within the combobox popup, except when using a dialog popup"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,d=s.CacheUtil.getCache(n.ownerDocument,"combobox",{});if(!d)return null;var c=d[e.dom.rolePath];if(!c)return null;var m=c.popupElement,p=c.popupId;if(!m)return null;var h=n.getAttribute("aria-activedescendant");if(!h||0===h.trim().length)return null;var g=r.FragmentUtil.getById(n,h);if(!g)return(0,a.RuleFail)("Fail_missing",[h]);var b=!1;if(m)for(var _=new o.DOMWalker(m);!b&&_.nextNode()&&_.node!=m&&_.node!=m.nextSibling;)1===_.node.nodeType&&u.VisUtil.isNodeVisible(_.node)&&(b=_.elem().getAttribute("id")===h);var f=[];b||f.push((0,a.RulePass)("Fail_not_in_popup",[h,p]));var v=l.AriaUtil.getRoles(g,!0);return 0===["option","gridcell","row","treeitem"].filter(function(e){return v.includes(e)}).length&&f.push((0,a.RuleFail)("Fail_active_role_invalid",[h,v.join(",")])),"true"!==g.getAttribute("aria-selected")&&f.push((0,a.RuleFail)("Fail_active_not_selected",[h])),0===f.length?(0,a.RulePass)("Pass"):f}}},4614(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.combobox_autocomplete_valid=void 0;var a=i(461),n=i(461),l=i(3864),r=i(4566),o=i(3946);t.combobox_autocomplete_valid={id:"combobox_autocomplete_valid",context:"aria:combobox",dependencies:["combobox_popup_reference"],refactor:{combobox_autocomplete:{Pass:"Pass",Fail_1:"Fail_1",Fail_inline:"Fail_inline"}},help:{"en-US":{Pass:"combobox_autocomplete_valid.html",Fail_1:"combobox_autocomplete_valid.html",Fail_inline:"combobox_autocomplete_valid.html",group:"combobox_autocomplete_valid.html"}},messages:{"en-US":{Pass:"The combobox does not use 'aria-autocomplete' value '\"inline\"' nor does it have 'aria-autocomplete' defined within the popup",Fail_1:"The combobox has the 'aria-autocomplete' attribute incorrectly set on an element within the popup referenced by \"{0}\"",Fail_inline:"The combobox does not support an 'aria-autocomplete' attribute value set to '\"inline\"' ",group:"A combobox that supports autocompletion behavior must have the 'aria-autocomplete' attribute only on its text input element with a valid value; a value of '\"inline\"' is not supported"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,s=r.CacheUtil.getCache(n.ownerDocument,"combobox",{});if(!s)return null;var u=s[e.dom.rolePath];if(!u)return null;var d=u.popupId,c=u.popupElement,m=[];"inline"===n.getAttribute("aria-autocomplete")&&m.push((0,a.RuleFail)("Fail_inline"));var p=!0;if(c&&o.VisUtil.isNodeVisible(c)&&(p=!c.hasAttribute("aria-autocomplete"))&&c.children&&c.children.length>0)for(var h=new l.DOMWalker(c);p&&h.nextNode()&&(1!==h.node.nodeType||!o.VisUtil.isNodeVisible(h.node)||(p=!h.elem().hasAttribute("aria-autocomplete"),!h.bEndTag||h.node!==c.lastElementChild)););return p||m.push((0,a.RuleFail)("Fail_1",[d])),m.length>0?m:(0,a.RulePass)("Pass")}}},5952(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.combobox_design_valid=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(3946),s=i(4566);t.combobox_design_valid={id:"combobox_design_valid",context:"aria:combobox",refactor:{combobox_version:{"Pass_1.0":"Pass_1.0","Fail_1.1":"Fail_1.1","Pass_1.2":"Pass_1.2"}},help:{"en-US":{"Pass_1.0":"combobox_design_valid.html","Fail_1.1":"combobox_design_valid.html","Pass_1.2":"combobox_design_valid.html",group:"combobox_design_valid.html"}},messages:{"en-US":{"Pass_1.0":"The combobox design pattern is detected as ARIA 1.0, which is allowed by ARIA 1.2","Fail_1.1":"The combobox design pattern is detected as ARIA 1.1, which is not allowed by ARIA 1.2","Pass_1.2":"The combobox design pattern is detected as ARIA 1.2",group:"The combobox design pattern must be valid for ARIA 1.2"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(!o.VisUtil.isNodeVisible(n)||r.CommonUtil.isNodeDisabled(n))return null;var u,d="select"===(u=n).tagName.toLowerCase()&&"combobox"!==u.getAttribute("role")?"implicit":"input"!==u.nodeName.toLowerCase()||u.hasAttribute("type")&&"text"!==u.getAttribute("type")||!u.hasAttribute("aria-owns")||u.hasAttribute("aria-controls")?"input"!==u.nodeName.toLowerCase()&&u.hasAttribute("aria-owns")&&!u.hasAttribute("aria-controls")?"1.1":"1.2":"1.0";if("implicit"===d)return null;var c=n.tagName.toLowerCase(),m="true"===(l.AriaUtil.getAriaAttribute(n,"aria-expanded")||"").trim().toLowerCase(),p="input"===c&&(!n.hasAttribute("type")||"text"===n.getAttribute("type").toLowerCase()),h=e.dom.rolePath;if(!h)return null;var g=s.CacheUtil.getCache(n.ownerDocument,"combobox",{});return g?(g[h]={inputElement:p?n:null,pattern:d,expanded:m},s.CacheUtil.setCache(n.ownerDocument,"combobox",g),"1.0"===d?(0,a.RulePass)("Pass_1.0"):"1.1"===d?(0,a.RuleFail)("Fail_1.1"):"1.2"===d?(0,a.RulePass)("Pass_1.2"):void 0):null}}},5395(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.combobox_focusable_elements=void 0;var a=i(461),n=i(461),l=i(3864),r=i(7011),o=i(7139),s=i(4566),u=i(3946);t.combobox_focusable_elements={id:"combobox_focusable_elements",context:"aria:combobox",dependencies:["combobox_popup_reference"],help:{"en-US":{Pass:"combobox_focusable_elements.html",Fail_not_tabbable:"combobox_focusable_elements.html",Fail_tabbable_child:"combobox_focusable_elements.html",group:"combobox_focusable_elements.html"}},messages:{"en-US":{Pass:"DOM focus is allowed only on the combobox element as required",Fail_not_tabbable:"The combobox element does not allow DOM focus as required",Fail_tabbable_child:"The popup of the combobox has DOM focus or has 'aria-activedescendant' defined, which is not allowed",group:"Tabbable focus for the combobox must be allowed only on the text input, except when using a dialog popup"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,d=s.CacheUtil.getCache(n.ownerDocument,"combobox",{});if(!d)return null;var c=d[e.dom.rolePath];if(!c)return null;var m=c.popupElement,p=c.expanded;if(!m)return null;var h=r.AriaUtil.getRoles(m,!0)[0],g=[];if(o.CommonUtil.isTabbable(n)||g.push((0,a.RuleFail)("Fail_not_tabbable")),!1===p||"dialog"===h)return(0,a.RulePass)("Pass");var b=!0;if(m&&u.VisUtil.isNodeVisible(m)&&(b=!o.CommonUtil.isTabbable(m)&&!r.AriaUtil.getAriaAttribute(m,"aria-activedescendant"))&&m.children&&m.children.length>0)for(var _=new l.DOMWalker(m);b&&_.nextNode()&&(1!==_.node.nodeType||!u.VisUtil.isNodeVisible(_.node)||(b=!o.CommonUtil.isTabbable(_.node)&&!r.AriaUtil.getAriaAttribute(_.node,"aria-activedescendant"),!_.bEndTag||_.node!==m.lastElementChild)););return b||g.push((0,a.RuleFail)("Fail_tabbable_child")),0===g.length?(0,a.RulePass)("Pass"):g}}},1992(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.combobox_haspopup_valid=void 0;var a=i(461),n=i(461),l=i(7011),r=i(4566);t.combobox_haspopup_valid={id:"combobox_haspopup_valid",context:"aria:combobox",dependencies:["combobox_popup_reference"],refactor:{combobox_haspopup:{Pass:"Pass",Fail_popup_role_invalid:"Fail_popup_role_invalid",Fail_combobox_popup_role_mismatch:"Fail_combobox_popup_role_mismatch"}},help:{"en-US":{Pass:"combobox_haspopup_valid.html",Fail_popup_role_invalid:"combobox_haspopup_valid.html",Fail_combobox_popup_role_mismatch:"combobox_haspopup_valid.html",group:"combobox_haspopup_valid.html"}},messages:{"en-US":{Pass:"The 'aria-controls' (ARIA 1.2) or 'aria-owns' (ARIA 1.0) appropriately references a valid popup 'id' value",Fail_popup_role_invalid:'The \'role\' value "{0}" of the popup element "{1}" should be one of "listbox", "grid", "tree" or "dialog"',Fail_combobox_popup_role_mismatch:"The value of the combobox 'aria-haspopup' attribute \"{0}\" does not match the 'role' value of the popup element \"{1}\"",group:"The combobox attribute 'aria-haspopup' value must be appropriate for the role of the element referenced by 'aria-controls' (ARIA 1.2) or 'aria-owns' (ARIA 1.0)"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,o=r.CacheUtil.getCache(n.ownerDocument,"combobox",{});if(!o)return null;var s=o[e.dom.rolePath];if(!s)return null;var u=s.popupElement,d=s.popupId;if(!u)return null;var c=l.AriaUtil.getRoles(u,!0),m=["listbox","grid","tree","dialog"].filter(function(e){return c.includes(e)});if(0===m.length)return(0,a.RuleFail)("Fail_popup_role_invalid",[c.join(","),d]);var p=m[0],h=n.getAttribute("aria-haspopup")||"listbox";return h===p||"listbox"===p&&!n.hasAttribute("aria-haspopup")?(0,a.RulePass)("Pass"):(0,a.RuleFail)("Fail_combobox_popup_role_mismatch",[h,p])}}},7955(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.combobox_popup_reference=void 0;var a=i(461),n=i(461),l=i(5279),r=i(4566),o=i(3946);t.combobox_popup_reference={id:"combobox_popup_reference",context:"aria:combobox",dependencies:["combobox_design_valid"],help:{"en-US":{group:"combobox_popup_reference.html","Pass_1.0_expanded":"combobox_popup_reference.html","Pass_1.0_collapsed":"combobox_popup_reference.html","Pass_1.2_expanded":"combobox_popup_reference.html","Pass_1.2_collapsed":"combobox_popup_reference.html","Fail_1.0_missing_owns":"combobox_popup_reference.html","Fail_1.2_missing_controls":"combobox_popup_reference.html","Fail_1.0_popup_reference_missing":"combobox_popup_reference.html","Fail_1.2_popup_reference_missing":"combobox_popup_reference.html",Fail_combobox_expanded_hidden:"combobox_popup_reference.html",Fail_combobox_collapsed_visible:"combobox_popup_reference.html"}},messages:{"en-US":{group:"The 'aria-controls' (for ARIA 1.2) or the 'aria-owns' (for ARIA 1.0) attribute of the expanded combobox must reference a valid popup 'id' value","Pass_1.0_expanded":"The combobox popup referenced by 'aria-owns' (ARIA 1.0) exists and is visible","Pass_1.0_collapsed":"The combobox popup in its collapsed state does not reference any visible popup as required","Pass_1.2_expanded":"The combobox popup referenced by 'aria-controls' (ARIA 1.2) exists and is visible","Pass_1.2_collapsed":"The combobox popup in its collapsed state does not reference any visible popup as required","Fail_1.0_missing_owns":"The 'aria-owns' attribute of the expanded combobox is missing","Fail_1.2_missing_controls":"The 'aria-controls' attribute of the expanded combobox is missing","Fail_1.0_popup_reference_missing":"The 'aria-owns' attribute \"{0}\" of the expanded combobox does not reference a valid popup 'id' value","Fail_1.2_popup_reference_missing":"The 'aria-controls' attribute \"{0}\" of the expanded combobox does not reference a valid popup 'id' value",Fail_combobox_expanded_hidden:"The combobox 'aria-expanded' attribute is true, but the combobox popup is not visible",Fail_combobox_collapsed_visible:"The combobox 'aria-expanded' attribute is false, but the combobox popup is visible"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[{"4e8ab6":{"Pass_1.0_expanded":"fail","Pass_1.0_collapsed":"fail","Pass_1.2_expanded":"pass","Pass_1.2_collapsed":"pass","Fail_1.0_missing_owns":"inapplicable","Fail_1.2_missing_controls":"fail","Fail_1.0_popup_reference_missing":"inapplicable","Fail_1.2_popup_reference_missing":"fail",Fail_combobox_expanded_hidden:"inapplicable",Fail_combobox_collapsed_visible:"inapplicable"}}],run:function(e,t,i){var n=e.dom.node,s=r.CacheUtil.getCache(n.ownerDocument,"combobox",{});if(!s)return null;var u=s[e.dom.rolePath];if(!u)return null;var d,c,m=u.pattern,p=u.expanded;if("1.0"===m){if(!n.hasAttribute("aria-owns"))return p?(0,a.RuleFail)("Fail_1.0_missing_owns"):null;if(d=n.getAttribute("aria-owns"),!(c=l.FragmentUtil.getById(n,d)))return p?(0,a.RuleFail)("Fail_1.0_popup_reference_missing",[d]):null}else{if("1.2"!==m)return null;if(!n.hasAttribute("aria-controls"))return p?(0,a.RuleFail)("Fail_1.2_missing_controls"):null;if(d=n.getAttribute("aria-controls"),!(c=l.FragmentUtil.getById(n,d)))return p?(0,a.RuleFail)("Fail_1.2_popup_reference_missing",[d]):null}return u.popupId=d,u.popupElement=c,p&&!o.VisUtil.isNodeVisible(c)?(0,a.RuleFail)("Fail_combobox_expanded_hidden"):!p&&o.VisUtil.isNodeVisible(c)?(0,a.RuleFail)("Fail_combobox_collapsed_visible"):"1.0"===m?p?(0,a.RulePass)("Pass_1.0_expanded"):(0,a.RulePass)("Pass_1.0_collapsed"):p?(0,a.RulePass)("Pass_1.2_expanded"):(0,a.RulePass)("Pass_1.2_collapsed")}}},9531(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.debug_paths=void 0;var a=i(461);t.debug_paths={id:"debug_paths",context:"dom:*",help:{"en-US":{group:"",Pass_0:""}},messages:{"en-US":{group:"",Pass_0:""}},rulesets:[{id:["DEBUG"],num:"1",level:a.eRulePolicy.INFORMATION,toolkitLevel:a.eToolkitLevel.LEVEL_FOUR}],act:[],run:function(e,t,i){var a=e.dom.node;return a.setAttribute("domPath",e.dom.rolePath),a.setAttribute("ariaPath",e.aria.rolePath),null}}},891(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.detector_tabbable=void 0;var a=i(7139),n=i(461),l=i(461);t.detector_tabbable={id:"detector_tabbable",context:"dom:*",help:{"en-US":{group:"",Pass_0:""}},messages:{"en-US":{group:"",Pass_0:""}},rulesets:[{id:["EXTENSIONS"],num:"1",level:l.eRulePolicy.INFORMATION,toolkitLevel:l.eToolkitLevel.LEVEL_FOUR}],act:[],run:function(e,t,i){var l=e.dom.node;if(!a.CommonUtil.isTabbable(l))return null;var r=i.aria[i.aria.length-1];return(0,n.RulePass)("Pass_0",[],[{name:r.attributes.name,role:r.role,tabindex:parseInt(l.getAttribute("tabindex")||"0")}])}}},7446(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.dir_attribute_valid=void 0;var a=i(461),n=i(461);t.dir_attribute_valid={id:"dir_attribute_valid",context:"dom:*[dir]",refactor:{Valerie_Elem_DirValid:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"dir_attribute_valid.html",Fail_1:"dir_attribute_valid.html",group:"dir_attribute_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Invalid value used for the 'dir' attribute",group:'\'dir\' attribute value must be "ltr", "rtl", or "auto"'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node.getAttribute("dir").toLowerCase();return"ltr"==n||"rtl"==n||"auto"==n?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},6137(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.download_keyboard_controllable=void 0;var a=i(461),n=i(461),l=i(7139),r=i(3946);t.download_keyboard_controllable={id:"download_keyboard_controllable",context:"dom:a[href],dom:area[href]",refactor:{HAAC_Media_DocumentTrigger2:{Manual_1:"Manual_1"}},help:{"en-US":{Manual_1:"download_keyboard_controllable.html",group:"download_keyboard_controllable.html"}},messages:{"en-US":{Manual_1:"Verify that the file download mechanism does not cause a keyboard trap",group:"File download mechanisms should be keyboard-operable and preserve page focus location"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.2"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var o=n.getAttribute("href"),s=l.CommonUtil.getFileExt(o),u=![".docx",".doc",".pdf",".odt"].includes(s);return u?null:u?void 0:(0,a.RuleManual)("Manual_1")}}},6839(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.draggable_alternative_exists=void 0;var a=i(7139),n=i(461),l=i(461),r=i(3946);t.draggable_alternative_exists={id:"draggable_alternative_exists",context:"dom:*[draggable]",dependencies:[],help:{"en-US":{group:"draggable_alternative_exists.html",pass_undraggable:"draggable_alternative_exists.html",potential_alternative:"draggable_alternative_exists.html"}},messages:{"en-US":{group:'A draggable element must have a "single pointer" alternative',pass_undraggable:'The element "{0}" is not draggable',potential_alternative:'Ensure the draggable element "{0}" has a "single pointer" alternative'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_2"],num:["2.5.7"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node;if(!r.VisUtil.isNodeVisible(l))return null;var o=l.nodeName.toLocaleLowerCase();return null!==a.CommonUtil.getAncestor(l,["pre","code","script","meta"])||"body"===o||"html"===o?null:"true"===l.getAttribute("draggable")?(0,n.RulePotential)("potential_alternative",[o]):"false"===l.getAttribute("draggable")?(0,n.RulePass)("pass_undraggable",[o]):null}}},8135(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_accesskey_labelled=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(3946),s=i(9910),u=i(1950);t.element_accesskey_labelled={id:"element_accesskey_labelled",context:"dom:*[accesskey]",refactor:{HAAC_Accesskey_NeedLabel:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"element_accesskey_labelled.html",Potential_1:"element_accesskey_labelled.html",group:"element_accesskey_labelled.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"The element with an assigned 'accesskey' attribute does not have an associated label",group:"An element with an assigned 'accesskey' attribute must have an associated label"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.3.2"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(o.VisUtil.isNodeVisible(n)&&!r.CommonUtil.isNodeDisabled(n)&&!r.CommonUtil.isTabbable(n)){var d=l.AriaUtil.getRoles(n,!0);if(d&&0!==d.length){var c=s.ARIADefinitions.designPatterns[d[0]];if(c&&c.nameFrom&&!c.nameRequired&&c.nameFrom&&!c.nameFrom.includes("prohibited")&&(!n.parentElement||"fieldset"!==n.parentElement.nodeName.toLowerCase())){var m=u.AccNameUtil.computeAccessibleName(n);return m&&m.name&&m.name.trim().length>0?(0,a.RulePass)("Pass_0"):(0,a.RulePotential)("Potential_1")}}}}}},507(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_accesskey_unique=void 0;var a=i(461),n=i(461),l=i(4566);t.element_accesskey_unique={id:"element_accesskey_unique",context:"dom:*[accesskey]",refactor:{WCAG20_Elem_UniqueAccessKey:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"element_accesskey_unique.html",Fail_1:"element_accesskey_unique.html",group:"element_accesskey_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"'accesskey' attribute value on the element is not unique",group:"'accesskey' attribute values on each element must be unique for the page"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["HTML"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,r=l.CacheUtil.getCache(n.ownerDocument,"element_accesskey_unique",{}),o=n.getAttribute("accesskey"),s=!(o in r);return r[o]=!0,s?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},3566(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_attribute_deprecated=void 0;var a=i(461),n=i(461),l=["applet","basefont","center","dir","font","isindex","listing","plaintext","spacer","s","strike","u","xmp","acronym","frame","frameset","noframes","noembed","big","blink","marquee","tt"],r=["align","link","archive","background","bgcolor","clear","code","color","compact","face","hspace","language","link","noshade","nowrap","object","prompt","start","text","version","vlink","vspace"],o={td:["height","width","abbr","axis","char","charoff","height","nowrap","valign","width","align","bgcolor"],th:["height","width","abbr","axis","charoff","height","bgcolor","align","nowrap","char","valign","width"],li:["type","value","type"],ul:["type","compact"],pre:["width"],meta:["http-equiv"],a:["charset","coords","shape","rev","scheme"],link:["rev","charset","target"],img:["name","longdesc","align","hspace","vspace","border"],area:["nohref"],head:["profile"],html:["version"],iframe:["longdesc","align","frameborder","marginheight","marginwidth","scrolling"],object:["archive","code","codebase","codetype","declare","standby","align","hspace","vspace","border"],param:["type","valuetype"],script:["language"],body:["alink","background","bgcolor","link","text","vlink"],br:["clear"],caption:["align"],col:["align","char","charoff","valign","width"],div:["align"],dl:["compact"],hr:["align","noshade","size","width","align"],h2:["align"],h3:["align"],h4:["align"],h5:["align"],h6:["align"],input:["align","usemap"],legend:["align"],menu:["compact"],ol:["compact","type","type"],p:["align"],table:["bgcolor","cellpadding","cellspacing","frame","rules","width","align"],tbody:["align","char","valign","charoff"],tfoot:["align","charoff","char","valign"],thead:["char","charoff","valign","align"],tr:["align","bgcolor","char","charoff","valign"]};t.element_attribute_deprecated={id:"element_attribute_deprecated",context:"dom:applet, dom:basefont, dom:center, dom:dir, dom:font, dom:isindex, dom:listing, dom:menu, dom:plaintext, dom:spacer, dom:s, dom:strike, dom:u, dom:xmp, dom:acronym, dom:frame, dom:frameset, dom:noframes, dom:noembed, dom:big, dom:blink, dom:marquee, dom:ttNaNdom:*[align], dom:*[link], dom:*[archive], dom:*[background], dom:*[bgcolor], dom:*[clear], dom:*[code], dom:*[color], dom:*[compact], dom:*[face], dom:*[hspace], dom:*[language], dom:*[link], dom:*[noshade], dom:*[nowrap], dom:*[object], dom:*[prompt], dom:*[start], dom:*[text], dom:*[version], dom:*[vlink], dom:*[vspace]NaNdom:td[height], dom:td[width], dom:td[abbr], dom:td[axis], dom:td[char], dom:td[charoff], dom:td[height], dom:td[nowrap], dom:td[valign], dom:td[width], dom:td[align], dom:td[bgcolor], dom:th[height], dom:th[width], dom:th[abbr], dom:th[axis], dom:th[charoff], dom:th[height], dom:th[bgcolor], dom:th[align], dom:th[nowrap], dom:th[char], dom:th[valign], dom:th[width], dom:li[type], dom:li[value], dom:li[type], dom:ul[type], dom:ul[compact], dom:pre[width], dom:meta[http-equiv], dom:a[charset], dom:a[coords], dom:a[shape], dom:a[rev], dom:a[scheme], dom:link[rev], dom:link[charset], dom:link[target], dom:img[name], dom:img[longdesc], dom:img[align], dom:img[hspace], dom:img[vspace], dom:img[border], dom:area[nohref], dom:head[profile], dom:html[version], dom:iframe[longdesc], dom:iframe[align], dom:iframe[frameborder], dom:iframe[marginheight], dom:iframe[marginwidth], dom:iframe[scrolling], dom:object[archive], dom:object[code], dom:object[codebase], dom:object[codetype], dom:object[declare], dom:object[standby], dom:object[align], dom:object[hspace], dom:object[vspace], dom:object[border], dom:param[type], dom:param[valuetype], dom:script[language], dom:body[alink], dom:body[background], dom:body[bgcolor], dom:body[link], dom:body[text], dom:body[vlink], dom:br[clear], dom:caption[align], dom:col[align], dom:col[char], dom:col[charoff], dom:col[valign], dom:col[width], dom:div[align], dom:dl[compact], dom:hr[align], dom:hr[noshade], dom:hr[size], dom:hr[width], dom:hr[align], dom:h2[align], dom:h3[align], dom:h4[align], dom:h5[align], dom:h6[align], dom:input[align], dom:input[usemap], dom:legend[align], dom:menu[compact], dom:ol[compact], dom:ol[type], dom:ol[type], dom:p[align], dom:table[bgcolor], dom:table[cellpadding], dom:table[cellspacing], dom:table[frame], dom:table[rules], dom:table[width], dom:table[align], dom:tbody[align], dom:tbody[char], dom:tbody[valign], dom:tbody[charoff], dom:tfoot[align], dom:tfoot[charoff], dom:tfoot[char], dom:tfoot[valign], dom:thead[char], dom:thead[charoff], dom:thead[valign], dom:thead[align], dom:tr[align], dom:tr[bgcolor], dom:tr[char], dom:tr[charoff], dom:tr[valign]",help:{"en-US":{pass:"element_attribute_deprecated.html",fail_elem:"element_attribute_deprecated.html",fail_attr:"element_attribute_deprecated.html",fail_elem_attr:"element_attribute_deprecated.html",group:"element_attribute_deprecated.html"}},messages:{"en-US":{pass:"Rule Passed",fail_elem:"The <{0}> element is deprecated in HTML 5",fail_attr:'The HTML attribute(s) "{0}" is deprecated in HTML 5',fail_elem_attr:'The HTML attribute(s) "{0}" is deprecated for the <{1}> element in HTML 5',group:"Avoid use of obsolete features if possible"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["HTML"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if("tbody"===n.nodeName.toLowerCase()&&n.hasAttribute("align"))return(0,a.RulePass)("pass");if(n.nodeName.includes("-"))return null;var s=n.nodeName.toLowerCase();if(l.includes(s))return(0,a.RuleFail)("fail_elem",[s]);for(var u=n.getAttributeNames(),d="",c=0,m=u;c<m.length;c++){var p=m[c];r.includes(p)&&(""!==d&&(d+=", "),d+=p)}if(""!==d)return(0,a.RuleFail)("fail_attr",[d]);if(d="",s in o){for(var h=0,g=u;h<g.length;h++)p=g[h],o[s]&&o[s].includes(p)&&(""!==d&&(d+=", "),d+=p);if(""!==d)return(0,a.RuleFail)("fail_elem_attr",[d,s])}return(0,a.RulePass)("pass")}}},5173(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_id_unique=void 0;var a=i(461),n=i(461),l=i(5279);t.element_id_unique={id:"element_id_unique",context:"dom:*[id]",refactor:{RPT_Elem_UniqueId:{Pass_0:"pass",Fail_1:"potential_empty",Fail_2:"potential_in_use"}},help:{"en-US":{group:"element_id_unique.html",pass:"element_id_unique.html",potential_empty:"element_id_unique.html",potential_in_use:"element_id_unique.html"}},messages:{"en-US":{group:"Element 'id' attribute values must be unique within a document",pass:"Rule Passed",potential_empty:'The <{0}> element has the id "{1}" that is empty',potential_in_use:'The <{0}> element has the id "{1}" that is already in use'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["HTML"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[{"3ea0c8":{pass:"pass",potential_empty:"pass",potential_in_use:"fail"}}],run:function(e,t,i){var n=e.dom.node,r=n.getAttribute("id");return""===r?(0,a.RulePotential)("potential_empty",[n.nodeName.toLowerCase(),r]):l.FragmentUtil.getById(n,r)===n?(0,a.RulePass)("pass"):(0,a.RulePotential)("potential_in_use",[n.nodeName.toLowerCase(),r])}}},6027(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_lang_valid=t.html_lang_valid=void 0;var a=i(461),n=i(461),l=i(1043),r=i(3946),o=i(3864),s=i(1950),u=function(e){var t=e.dom.node,i=t.nodeName.toLowerCase();if(t.hasAttribute("lang"))if("html"!==i&&""===t.getAttribute("lang"));else{var a=t.getAttribute("lang");if(!l.LangUtil.validPrimaryLang(a))return 1;if(!l.LangUtil.isBcp47(a))return 2}if(t.hasAttribute("xml:lang"))if("html"!==i&&""===t.getAttribute("xml:lang"));else{if(a=t.getAttribute("xml:lang"),!l.LangUtil.validPrimaryLang(a))return 3;if(!l.LangUtil.isBcp47(a))return 4}return 0};t.html_lang_valid={id:"html_lang_valid",context:"dom:html[lang], dom:html[xml:lang]",help:{"en-US":{Pass_0:"html_lang_valid.html",Fail_1:"html_lang_valid.html",Fail_2:"html_lang_valid.html",Fail_3:"html_lang_valid.html",Fail_4:"html_lang_valid.html",group:"html_lang_valid.html"}},messages:{"en-US":{Pass_0:"Lang has a valid primary lang and conforms to BCP 47",Fail_1:"Specified 'lang' attribute does not include a valid primary language",Fail_2:"Specified 'lang' attribute does not conform to BCP 47",Fail_3:"Specified 'xml:lang' attribute does not include a valid primary language",Fail_4:"Specified 'xml:lang' attribute does not conform to BCP 47",group:"The default human language of the page must be valid and specified in accordance with BCP 47"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[{b5c3f8:{Pass_0:"pass",Fail_1:"fail",Fail_2:"inapplicable",Fail_3:"inapplicable",Fail_4:"inapplicable"},bf051a:{Pass_0:"pass",Fail_1:"fail",Fail_2:"pass",Fail_3:"fail",Fail_4:"inapplicable"}}],run:function(e,t,i){var n=u(e);return[(0,a.RulePass)("Pass_0"),(0,a.RuleFail)("Fail_1"),(0,a.RuleFail)("Fail_2"),(0,a.RuleFail)("Fail_3"),(0,a.RuleFail)("Fail_4")][n]}},t.element_lang_valid={id:"element_lang_valid",context:"dom:*[lang], dom:*[xml:lang]",help:{"en-US":{Pass_0:"element_lang_valid.html",Fail_1:"element_lang_valid.html",Fail_2:"element_lang_valid.html",Fail_3:"element_lang_valid.html",Fail_4:"element_lang_valid.html",group:"element_lang_valid.html"}},messages:{"en-US":{Pass_0:"Lang has a valid primary lang and conforms to BCP 47",Fail_1:"Specified 'lang' attribute does not include a valid primary language",Fail_2:"Specified 'lang' attribute does not conform to BCP 47",Fail_3:"Specified 'xml:lang' attribute does not include a valid primary language",Fail_4:"Specified 'xml:lang' attribute does not conform to BCP 47",group:"The change in language of specific content must be valid and specified in accordance with BCP 47"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[{de46e4:{Pass_0:"pass",Fail_1:"fail",Fail_2:"pass",Fail_3:"inapplicable",Fail_4:"inapplicable"}}],run:function(e,t,i){var n=e.dom.node;if("html"===n.nodeName.toLowerCase())return null;var l=u(e),d=[(0,a.RulePass)("Pass_0"),(0,a.RuleFail)("Fail_1"),(0,a.RuleFail)("Fail_2"),(0,a.RuleFail)("Fail_3"),(0,a.RuleFail)("Fail_4")][l];if(d.value[1]!==a.eRuleConfidence.PASS){var c=!1;if(null!==n.firstChild)for(var m=new o.DOMWalker(n,!1,n,!0);!c&&m.nextNode();)if(1===m.node.nodeType){var p=m.node;if(!r.VisUtil.isNodeVisible(p)||p.hasAttribute("lang"))m.bEndTag=!0;else{var h=s.AccNameUtil.computeAccessibleName(p);c=c||"img"===p.nodeName.toLowerCase()&&h&&h.name&&h.name.trim().length>0}}else c=c||3===m.node.nodeType&&m.node.nodeValue.trim().length>0;if(!c)return null}return d}}},7515(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_mouseevent_keyboard=void 0;var a=i(461),n=i(461);t.element_mouseevent_keyboard={id:"element_mouseevent_keyboard",context:"dom:*[ondblclick], dom:*[onmousemove], dom:*[onmousedown], dom:*[onmouseup], dom:*[onmouseover], dom:*[onmouseout], dom:*[onclick]",refactor:{RPT_Elem_EventMouseAndKey:{Pass_0:"Pass_0",Manual_1:"Manual_1"}},help:{"en-US":{Pass_0:"element_mouseevent_keyboard.html",Manual_1:"element_mouseevent_keyboard.html",group:"element_mouseevent_keyboard.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Manual_1:"Confirm the <{0}> element with mouse event handler(s) '{1}' has a corresponding keyboard handler(s)",group:"All interactive content with mouse event handlers must have equivalent keyboard access"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,l=n.nodeName.toLowerCase(),r=n.hasAttribute("href")||!n.hasAttribute("ondblclick")&&!n.hasAttribute("onmousemove")&&(!n.hasAttribute("onmousedown")||n.hasAttribute("onkeydown"))&&(!n.hasAttribute("onmouseup")||n.hasAttribute("onkeyup"))&&(!n.hasAttribute("onmouseover")||n.hasAttribute("onfocus"))&&(!n.hasAttribute("onmouseout")||n.hasAttribute("onblur"))&&(!n.hasAttribute("onclick")||n.hasAttribute("onkeypress")||"a"==l||"button"==l),o=new Array;return r||(n.hasAttribute("ondblclick")&&o.push("ondblclick"),n.hasAttribute("onmousemove")&&o.push("onmousemove"),n.hasAttribute("onmousedown")&&!n.hasAttribute("onkeydown")&&o.push("onmousedown"),n.hasAttribute("onmouseup")&&!n.hasAttribute("onkeyup")&&o.push("onmouseup"),n.hasAttribute("onmouseover")&&!n.hasAttribute("onfocus")&&o.push("onmouseover"),n.hasAttribute("onmouseout")&&!n.hasAttribute("onblur")&&o.push("onmouseout"),n.hasAttribute("onclick")&&!n.hasAttribute("onkeypress")&&"a"!=l&&"button"!=l&&o.push("onclick")),r?(0,a.RulePass)("Pass_0"):(0,a.RuleManual)("Manual_1",[l,o.join(", ")])}}},1704(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_orientation_unlocked=void 0;var a=i(461),n=i(461),l=i(4919),r=i(3946),o=i(4566),s=i(5279),u=i(7139);t.element_orientation_unlocked={id:"element_orientation_unlocked",context:"dom:*",help:{"en-US":{pass:"element_orientation_unlocked.html",fail_locked:"element_orientation_unlocked.html",group:"element_orientation_unlocked.html"}},messages:{"en-US":{pass:"The element is not restricted to either landscape or portrait orientation using CSS transform property",fail_locked:"The element <{0}> is restricted to either landscape or portrait orientation using CSS transform property",group:"Elements should not be restricted to either landscape or portrait orientation using CSS transform property"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.4"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:["b33eff"],run:function(e,t,i){var n=e.dom.node;if(!r.VisUtil.isNodeVisible(n))return null;if(u.CommonUtil.getAncestor(n,["script","meta","title"]))return null;var d=n.nodeName.toLowerCase(),c=s.FragmentUtil.getOwnerFragment(n),m=o.CacheUtil.getCache(c,"RPTUtil_MEDIA_ORIENTATION_TRANSFROM",null);m||(m=l.CSSUtil.getMediaOrientationTransform(c),o.CacheUtil.setCache(c,"RPTUtil_MEDIA_ORIENTATION_TRANSFROM",m));var p=[];if(Object.keys(m).forEach(function(e){Object.keys(m[e]).forEach(function(t){Object.keys(m[e][t]).length>0&&l.CSSUtil.selectorMatchesElem(n,t)&&(m[e][t].transform?p.push(m[e][t].transform):p.push(m[e][t]))})}),0===p.length)return null;for(var h=[],g=function(e){var t=p[e];if("object"==typeof t)for(var i in t)t=i+"("+t[i]+")";var r=!1;if(["rotate","rotate3d","rotateZ","matrix","matrix3d"].forEach(function(e){t.includes(e)&&(r=!0)}),!r)return"continue";var o=l.CSSUtil.getRotationDegree(t);if(0===o)return h.push((0,a.RulePass)("pass")),"continue";var s=l.CSSUtil.getDefinedStyles(n,["transform"]);s.transform&&(o+=l.CSSUtil.getRotationDegree(s.transform)),Math.abs(o-360)%360>1?h.push((0,a.RuleFail)("fail_locked",[d])):h.push((0,a.RulePass)("pass"))},b=0;b<p.length;b++)g(b);return h.length>0?h:null}}},5053(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_scrollable_tabbable=void 0;var a=i(7139),n=i(461),l=i(3946),r=i(7011);t.element_scrollable_tabbable={id:"element_scrollable_tabbable",context:"dom:*",dependencies:[],help:{"en-US":{group:"element_scrollable_tabbable.html",pass_tabbable:"element_scrollable_tabbable.html",pass_interactive:"element_scrollable_tabbable.html",fail_scrollable:"element_scrollable_tabbable.html"}},messages:{"en-US":{group:"Scrollable elements should be tabbable or contain tabbable content",pass_tabbable:"The scrollable element is tabbable",pass_interactive:"The scrollable element has tabbable content",fail_scrollable:"The scrollable element <{0}> with non-interactive content is not tabbable"}},rulesets:[],act:["0ssw9k"],run:function(e,t,i){var o=e.dom.node;if(l.VisUtil.isNodeVisible(o)&&!a.CommonUtil.isNodeDisabled(o))return a.CommonUtil.getAncestor(o,["iframe","svg","script","meta","style"])?null:a.CommonUtil.hasInnerContent(o)?r.AriaUtil.isNavigationOwnedOrControlled(o)?null:l.VisUtil.isElementScrollable(o)?a.CommonUtil.isTabbable(o)?(0,n.RulePass)("pass_tabbable"):a.CommonUtil.getTabbableChildren(o)>0?(0,n.RulePass)("pass_interactive"):!o.hasAttribute("tabindex")&&navigator.userAgent.indexOf("Firefox")>-1?null:(0,n.RuleFail)("fail_scrollable",[o.nodeName.toLowerCase()]):null:null}}},4681(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_tabbable_role_valid=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(9910),s=i(3864),u=i(3946);t.element_tabbable_role_valid={id:"element_tabbable_role_valid",context:"dom:*",help:{"en-US":{pass:"element_tabbable_role_valid.html",fail_invalid_role:"element_tabbable_role_valid.html",fail_no_valid_role:"element_tabbable_role_valid.html",group:"element_tabbable_role_valid.html"}},messages:{"en-US":{pass:"The tabbable element has a widget role",fail_invalid_role:"The tabbable element's role '{0}' is not a widget role",fail_no_valid_role:"The tabbable element does not have a valid widget role",group:"A tabbable element must have a valid widget role"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE},{id:["WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.CommonUtil.isNodeDisabled(n)||u.VisUtil.isNodeHiddenFromAT(n))return null;var d=n.nodeName.toLowerCase();if(d in r.CommonUtil.tabTagMap){var c=r.CommonUtil.tabTagMap[d];if("function"==typeof c&&(c=c(n)),c)return null}if(!n.hasAttribute("tabindex")||parseInt(n.getAttribute("tabindex"))<0)return null;if(l.AriaUtil.isNavigationOwnedOrControlled(n))return null;if(u.VisUtil.isElementScrollable(n))return null;var m=s.DOMWalker.parentNode(n),p=l.AriaUtil.getResolvedRole(m);if(["button","checkbox","img","link","menuitem","menuitemcheckbox","menuitemradio","option","radio","switch","tab"].includes(p))return null;var h=l.AriaUtil.getResolvedRole(n);return h?"application"===h?null:"row"===h||"separator"===h||"widget"===o.ARIADefinitions.designPatterns[h].roleType?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_invalid_role",[h]):(0,a.RuleFail)("fail_no_valid_role")}}},8050(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_tabbable_unobscured=void 0;var a=i(7139),n=i(461),l=i(461),r=i(3946),o=i(7507),s=i(3883);t.element_tabbable_unobscured={id:"element_tabbable_unobscured",context:"dom:*",dependencies:[],help:{"en-US":{group:"element_tabbable_unobscured.html",pass:"element_tabbable_unobscured.html",potential_obscured:"element_tabbable_unobscured.html"}},messages:{"en-US":{group:"When an element receives focus, it is not entirely covered by other content",pass:"The element is not entirely covered by other content",potential_obscured:"Confirm that when the element receives focus, it is not covered or, if covered by user action, can be uncovered without moving focus"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_2"],num:["2.4.11"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node;if(!r.VisUtil.isNodeVisible(l)||!a.CommonUtil.isTabbable(l))return null;var u=l.nodeName.toLocaleLowerCase();if(null!==a.CommonUtil.getAncestor(l,["pre","code","script","meta"])||"body"===u||"html"===u)return null;var d=l.ownerDocument;if(!d)return null;var c=d.defaultView;if(!c)return null;var m=new o.DOMMapper,p=m.getUnadjustedBounds(l);if(!p||0===p.height||0===p.width)return null;var h=c.getComputedStyle(l);if(!h)return null;var g=parseInt("auto"!==h.zIndex&&h.zIndex?h.zIndex:"0"),b=d.querySelectorAll("body *:not(script):not(style):not(meta):not(link)");if(!b||0===b.length)return null;for(var _=!0,f=p.left+p.width,v=p.top+p.height,A=0;A<b.length;A++){var w=b[A],y=l.compareDocumentPosition(w);if(0===y||y&Node.DOCUMENT_POSITION_CONTAINED_BY)_=!1;else if(!(y&Node.DOCUMENT_POSITION_CONTAINS)&&r.VisUtil.isNodeVisible(w)){var C=m.getUnadjustedBounds(w);if(C&&0!==C.height&&0!==C.width&&!(C.top>p.top||C.left>p.left)){var k=C.left+C.width,R=C.top+C.height;if(!(k<f||R<v)){var x=c.getComputedStyle(w);if(x){var P=parseInt("auto"===x.zIndex||!x.zIndex||isNaN(Number(x.zIndex))?"0":x.zIndex);if(_&&P>g||!_&&P>=g){var T,U=!1;if(x.background&&"none"!==x.background&&(U=(T=s.ColorUtil.Color(x.background))&&(void 0===T.alpha||T.alpha>0)),!U&&x.backgroundColor&&(U=(T=s.ColorUtil.Color(x.backgroundColor))&&(void 0===T.alpha||T.alpha>0)),!a.CommonUtil.hasInnerContentHidden(w)&&!U)continue;return(0,n.RulePotential)("potential_obscured",[])}}}}}}return(0,n.RulePass)("pass")}}},2644(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_tabbable_visible=void 0;var a=i(7139),n=i(4919),l=i(461),r=i(461),o=i(7507);t.element_tabbable_visible={id:"element_tabbable_visible",context:"dom:*",dependencies:[],help:{"en-US":{group:"element_tabbable_visible.html",pass:"element_tabbable_visible.html",potential_visible:"element_tabbable_visible.html"}},messages:{"en-US":{group:"A tabbable element should be visible on the screen when it has keyboard focus",pass:"The tabbable element is visible on the screen",potential_visible:"Confirm the element should be tabbable and if so, it becomes visible when it has keyboard focus"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.7"],level:r.eRulePolicy.VIOLATION,toolkitLevel:r.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var r=e.dom.node;if(!a.CommonUtil.isTabbable(r))return null;var s=r.nodeName.toLocaleLowerCase(),u=(new o.DOMMapper).getUnadjustedBounds(r);if(!u)return null;var d=n.CSSUtil.getDefinedStylesMultiple(r,["position","clip"],["",":focus"]),c=d[""],m=d[":focus"];if(0===u.height||0===u.width)return(0,l.RulePotential)("potential_visible",[]);if("absolute"===c.position&&c.clip&&"rect(0px,0px,0px,0px)"===c.clip.replaceAll(" ","")&&!m.clip){if("input"===s&&("checkbox"===r.getAttribute("type")||"radio"===r.getAttribute("type"))){var p=a.CommonUtil.getLabelForElement(r);if(p&&!a.CommonUtil.isInnerTextEmpty(p)){var h=n.CSSUtil.getDefinedStylesMultiple(r,null,[":focus-visible",":focus-within",":checked",":focus"]),g=h[":focus-visible"],b=h[":focus-within"],_=h[":checked"];if(h[":focus"]||g||b||_)return(0,l.RulePass)("pass")}}return(0,l.RulePotential)("potential_visible",[])}if(u.top>=0&&u.left>=0)return(0,l.RulePass)("pass");var f=getComputedStyle(r),v=u.top,A=u.left;if(0===Object.keys(m).length)return(0,l.RulePotential)("potential_visible",[]);var w=["absolute","fixed"];return void 0!==m.top&&(v=w.includes(m.position)||void 0===m.position&&w.includes(f.position)?m.top.replace(/\D/g,""):Number.MIN_VALUE),void 0!==m.left&&(A=w.includes(m.position)||void 0===m.position&&w.includes(f.position)?m.left.replace(/\D/g,""):Number.MIN_VALUE),v>=0&&A>=0?(0,l.RulePass)("pass"):(0,l.RulePotential)("potential_visible",[])}}},429(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.embed_alt_exists=void 0;var a=i(461),n=i(461),l=i(7139),r=i(3946);t.embed_alt_exists={id:"embed_alt_exists",context:"dom:embed",refactor:{RPT_Embed_HasAlt:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"embed_alt_exists.html",Potential_1:"embed_alt_exists.html",group:"embed_alt_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that the <embed> element has alternative content",group:"Provide alternative content for <embed> elements"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_FOUR}],act:[],run:function(e,t,i){var n=e.dom.node;return r.VisUtil.isNodeHiddenFromAT(n)?null:l.CommonUtil.attributeNonEmpty(n,"alt")?(0,a.RulePass)("Pass_0"):(0,a.RulePotential)("Potential_1")}}},4617(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.emoticons_alt_exists=void 0;var a=i(461),n=i(7139);t.emoticons_alt_exists={id:"emoticons_alt_exists",context:"dom:*",refactor:{WCAG20_Text_Emoticons:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"emoticons_alt_exists.html",Potential_1:"emoticons_alt_exists.html",group:"emoticons_alt_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that emoticons have a text alternative",group:"Emoticons must have a short text alternative that describes their purpose"}},rulesets:[],act:[],run:function(e,t,i){for(var l=e.dom.node,r=[":-)",":)",":o)",":]",":3",":c)",":>","=]","8)","=)",":D","C:",":-D",":D","8D","XD","=D","=3","<=3","<=8","--!--",":-(",":(",":c",":<",":[","D:","D8","D;","D=","DX","v.v",":-9",";-)",";)","*)",";]",";D",":-P",":P",":-p",":p","=p",":-Þ",":Þ",":-b",":b",":-O",":O","O_O","o_o","8O","OwO","O-O","0_o","O_o","O3O","o0o ;o_o;","o...o","0w0",":-/",":/",":\\","=/","=\\",":S",":|","d:-)","qB-)",":)~",":-)>....",":-X",":X",":-#",":#","O:-)","0:3","O:)",":'(",";*(","T_T","TT_TT","T.T",":-*",":*","^o)",">:)",">;)",">:-)","B)","B-)","8)","8-)","^>.>^","^<.<^","^>_>^","^<_<^","D:<",">:(","D-:<",">:-(",":-@[1]",";(","`_´","D<","<3","<333","=^_^=","=>.>=","=<_<=","=>.<=","\\,,/","\\m/","\\m/\\>.</\\m/","\\o/","\\o o/","o/\\o",":&",":u"],o=!0,s="",u=l.firstChild;u;)"#text"==u.nodeName&&(s+=" "+u.nodeValue),u=u.nextSibling;if(s.trim().length>0)for(var d=0;o&&d<r.length;++d)for(var c=s.indexOf(r[d]),m=r[d].length;o&&-1!=c;)o=(o=(o=c>0&&!/\s/.test(s.substring(c-1,c))||c<s.length-m&&!/\s/.test(s.substring(c+m,c+m+1))&&!/[.,!'"?]/.test(s.substring(c+m,c+m+1)))||(":)"==r[d]||"(:"==r[d])&&/\(\:.*\:\)/.test(s))||(";)"==r[d]||"(;"==r[d])&&/\(\;.*\;\)/.test(s),c=s.indexOf(r[d],c+1);if(!o){var p=n.CommonUtil.getAncestor(l,["pre","code","script","body"]);o=null==p||"body"!=p.nodeName.toLowerCase()}return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},5460(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.error_message_exists=void 0;var a=i(461),n=i(461),l=i(7011),r=i(5279),o=i(3946);t.error_message_exists={id:"error_message_exists",context:"dom:*[aria-invalid=true]",refactor:{HAAC_Aria_ErrorMessage:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_0:"error_message_exists.html",Fail_1:"error_message_exists.html",Fail_2:"error_message_exists.html",group:"error_message_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Custom error message has invalid reference 'id' value",Fail_2:"Custom error message is not visible",group:"A custom error message must reference a valid 'id' value and when triggered the message must be appropriately exposed"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,s=l.AriaUtil.getAriaAttribute(n,"aria-errormessage");if(!s)return null;var u=r.FragmentUtil.getById(n,s);return u?o.VisUtil.isNodeVisible(u)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_2"):(0,a.RuleFail)("Fail_1")}}},3399(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.fieldset_label_valid=void 0;var a=i(461),n=i(461),l=i(5279),r=i(4566),o=i(7139),s=i(3946),u=i(1950);t.fieldset_label_valid={id:"fieldset_label_valid",context:"aria:group",refactor:{group_withInputs_hasName:{Pass_1:"Pass_1",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_1:"fieldset_label_valid.html",Fail_1:"fieldset_label_valid.html",Fail_2:"fieldset_label_valid.html",group:"fieldset_label_valid.html"}},messages:{"en-US":{Pass_1:'Group/Fieldset "{0}" with an input has a unique name',Fail_1:"Group/Fieldset does not have an accessible name",Fail_2:'Group/Fieldset "{0}" has a duplicate name to another group',group:"Groups with nested inputs must have unique accessible name"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1","3.3.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(!s.VisUtil.isNodeHiddenFromAT(n)&&!o.CommonUtil.isNodeDisabled(n)){var d=l.FragmentUtil.getOwnerFragment(n),c=r.CacheUtil.getCache(n.ownerDocument,"landmark_group_input",null);if(!c){c={groupsWithInputs:[],groupsWithInputsComputedLabels:[]};for(var m=d.querySelectorAll('fieldset,[role="group"]'),p=Array.from(m),h=[],g=0;g<p.length;g++)p[g].querySelector("input")&&h.push(p[g]);var b=[];for(g=0;g<h.length;g++){var _=u.AccNameUtil.computeAccessibleName(h[g]);b.push(_&&_.name&&_.name.trim().length>0?_.name.trim():"")}c.groupsWithInputs=h,c.groupsWithInputsComputedLabels=b,r.CacheUtil.setCache(n.ownerDocument,"landmark_group_input",c)}var f=!1,v="";if(!c.groupsWithInputs)return null;for(g=0;g<c.groupsWithInputs.length;g++)if(n.isSameNode(c.groupsWithInputs[g])){if(f=!0,""===c.groupsWithInputsComputedLabels[g]||null===c.groupsWithInputsComputedLabels[g])return(0,a.RuleFail)("Fail_1");for(var A=!1,w=0;w<c.groupsWithInputsComputedLabels.length;w++)g!=w&&c.groupsWithInputsComputedLabels[g]===c.groupsWithInputsComputedLabels[w]&&(A=!0);if(A)return(0,a.RuleFail)("Fail_2",[c.groupsWithInputsComputedLabels[g]]);v=c.groupsWithInputsComputedLabels[g]}return f?(0,a.RulePass)("Pass_1",[v]):null}}}},3498(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.fieldset_legend_valid=void 0;var a=i(461),n=i(461),l=i(7139),r=i(3946);t.fieldset_legend_valid={id:"fieldset_legend_valid",context:"dom:fieldset",refactor:{WCAG20_Fieldset_HasLegend:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{Pass_0:"fieldset_legend_valid.html",Fail_1:"fieldset_legend_valid.html",Fail_2:"fieldset_legend_valid.html",Fail_3:"fieldset_legend_valid.html",group:"fieldset_legend_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"<fieldset> element does not have a <legend>",Fail_2:"<fieldset> element has more than one <legend>",Fail_3:"<fieldset> element <legend> is empty",group:" <fieldset> elements should have a single, non-empty <legend> as a label"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n)||l.CommonUtil.isNodeDisabled(n))return null;var o=l.CommonUtil.getChildByTagHidden(n,"legend",!0,!1);return 0===o.length?(0,a.RuleFail)("Fail_1"):o.length>1?(0,a.RuleFail)("Fail_2"):0===l.CommonUtil.getInnerText(o[0]).trim().length?(0,a.RuleFail)("Fail_3"):(0,a.RulePass)("Pass_0")}}},9629(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.figure_label_exists=void 0;var a=i(461),n=i(461),l=i(3946),r=i(1950);t.figure_label_exists={id:"figure_label_exists",context:"dom:figure",refactor:{HAAC_Figure_label:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"figure_label_exists.html",Fail_1:"figure_label_exists.html",group:"figure_label_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The <figure> element does not have an associated label",group:"A <figure> element must have an associated label"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;if(n.getAttribute("role"))return null;var o=r.AccNameUtil.computeAccessibleName(n);return o&&o.name&&o.name.trim().length>0?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[])}}},733(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.form_font_color=void 0;var a=i(461),n=i(461);t.form_font_color={id:"form_font_color",context:"dom:form",refactor:{RPT_Font_ColorInForm:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"form_font_color.html",Potential_1:"form_font_color.html",group:"form_font_color.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Check color is not used as the only visual means to convey which fields are required",group:"Combine color and descriptive markup to indicate required form fields"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.4.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=!0,l=e.dom.node.getElementsByTagName("font");if(null!=l)for(var r=0;r<l.length;++r)n=!l[r].hasAttribute("color");return n?(0,a.RulePass)("Pass_0"):n?void 0:(0,a.RulePotential)("Potential_1")}}},9797(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.form_interaction_review=void 0;var a=i(461),n=i(461),l=i(7139);t.form_interaction_review={id:"form_interaction_review",context:"dom:form[target]",refactor:{WCAG20_Form_TargetAndText:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"form_interaction_review.html",Potential_1:"form_interaction_review.html",group:"form_interaction_review.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that interacting with content will not open pop-up windows or change the active window without informing the user",group:"User should be informed in advance when interacting with content causes a change of context"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.2.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n={paramWinText:{value:["new window"],type:"array"}},r=e.dom.node,o=r.getAttribute("target"),s="_parent"===o||"_self"===o||"_top"===o||null!=l.CommonUtil.getFrameByName(r,o);if(!s){var u=l.CommonUtil.getInnerText(r);r.hasAttribute("title")&&(u+=" "+r.getAttribute("title"));for(var d=0;!s&&d<n.paramWinText.value.length;++d)-1!=u.indexOf(n.paramWinText.value[d])&&(s=!0)}return s?(0,a.RulePass)("Pass_0"):s?void 0:(0,a.RulePotential)("Potential_1")}}},7156(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.form_label_unique=void 0;var a=i(461),n=i(461),l=i(5279),r=i(4566);t.form_label_unique={id:"form_label_unique",context:"dom:label[for]",refactor:{RPT_Label_UniqueFor:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"form_label_unique.html",Fail_1:"form_label_unique.html",group:"form_label_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Form control has more than one label",group:"Form controls should have exactly one label"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,o=r.CacheUtil.getCache(l.FragmentUtil.getOwnerFragment(n),"RPT_Label_Single",{}),s=n.getAttribute("for"),u=!(s in o);return o[s]=!0,u?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},3062(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.form_submit_button_exists=void 0;var a=i(461),n=i(461),l=i(7011),r=i(3864);t.form_submit_button_exists={id:"form_submit_button_exists",context:"dom:form",refactor:{WCAG20_Form_HasSubmit:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"form_submit_button_exists.html",Potential_1:"form_submit_button_exists.html",group:"form_submit_button_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify the <form> element has a submit button or an image button",group:"A <form> element should have a submit button or an image button"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.2.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,o=!1;if(n.firstChild)for(var s=new r.DOMWalker(n,!0);!o&&s.prevNode()&&s.node!=n;)if(!s.bEndTag){var u=s.node.nodeName.toLowerCase();if("input"===u){var d=s.elem().getAttribute("type");d&&(d=d.toLowerCase()),o="submit"===d||"image"===d}else"button"===u?o=s.elem().hasAttribute("type")&&"submit"===s.elem().getAttribute("type").toLowerCase():1===s.node.nodeType&&(o=l.AriaUtil.hasRole(s.node,"button"))}return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},3827(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.form_submit_review=void 0;var a=i(461);t.form_submit_review={id:"form_submit_review",context:"dom:select[onchange], dom:input[onchange]",refactor:{RPT_Form_ChangeEmpty:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"form_submit_review.html",Potential_1:"form_submit_review.html",group:"form_submit_review.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Confirm the form does not submit automatically without warning",group:"A form should not be submitted automatically without warning the user"}},rulesets:[],act:[],run:function(e,t,i){var n=0===e.dom.node.getAttribute("onchange").trim().length;return n?null:n?void 0:(0,a.RulePotential)("Potential_1")}}},5498(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.frame_src_valid=void 0;var a=i(461),n=i(461),l=i(7139);t.frame_src_valid={id:"frame_src_valid",context:"dom:frame, dom:iframe",refactor:{Valerie_Frame_SrcHtml:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"frame_src_valid.html",Potential_1:"frame_src_valid.html",group:"frame_src_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify <frame> content is accessible",group:"A <frame> containing non-HTML content must be made accessible"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,r=l.CommonUtil.attributeNonEmpty(n,"src")&&l.CommonUtil.isHtmlExt(l.CommonUtil.getFileExt(n.getAttribute("src")));return r?(0,a.RulePass)("Pass_0"):r?void 0:(0,a.RulePotential)("Potential_1")}}},510(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.frame_title_exists=void 0;var a=i(461),n=i(461),l=i(1950),r=i(3946);t.frame_title_exists={id:"frame_title_exists",context:"dom:frame, dom:iframe",refactor:{WCAG20_Frame_HasTitle:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"frame_title_exists.html",Pass_0:"frame_title_exists.html",Fail_1:"frame_title_exists.html"}},messages:{"en-US":{group:"Inline frames must have a unique, non-empty 'title' attribute",Pass_0:"Rule Passed",Fail_1:"Inline frame does not have a 'title' attribute"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:"cae760",run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;if(n.getAttribute("role"))return null;var o=l.AccNameUtil.computeAccessibleName(n);return o&&o.name&&o.name.trim().length>0?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},7722(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.heading_content_exists=void 0;var a=i(461),n=i(461),l=i(7139);t.heading_content_exists={id:"heading_content_exists",context:"dom:h1, dom:h2, dom:h3, dom:h4, dom:h5, dom:h6",refactor:{RPT_Header_HasContent:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"heading_content_exists.html",Fail_1:"heading_content_exists.html",group:"heading_content_exists.html"}},messages:{"en-US":{Pass_0:"Heading element has descriptive text",Fail_1:"Heading element has no descriptive content",group:"Heading elements must provide descriptive text"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.6"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;return l.CommonUtil.hasInnerContentHidden(n)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},4597(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.heading_markup_misuse=void 0;var a=i(461),n=i(461),l=i(7139);t.heading_markup_misuse={id:"heading_markup_misuse",context:"dom:h1, dom:h2, dom:h3, dom:h4, dom:h5, dom:h6",dependencies:["heading_content_exists"],refactor:{RPT_Headers_FewWords:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"heading_markup_misuse.html",Potential_1:"heading_markup_misuse.html",group:"heading_markup_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that the heading element is a genuine heading",group:"Heading elements must not be used for presentation"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node,r=l.CommonUtil.wordCount(l.CommonUtil.getInnerText(n))<=20;return r?(0,a.RulePass)("Pass_0"):r?void 0:(0,a.RulePotential)("Potential_1")}}},2104(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.html_lang_exists=void 0;var a=i(461),n=i(461),l=i(6858),r=i(1043);t.html_lang_exists={id:"html_lang_exists",context:"dom:html",refactor:{WCAG20_Html_HasLang:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3",Fail_4:"Fail_4",Fail_5:"Fail_5",Potential_5:"Potential_5",Potential_6:"Potential_6"}},help:{"en-US":{group:"html_lang_exists.html",Pass_0:"html_lang_exists.html",Fail_1:"html_lang_exists.html",Fail_2:"html_lang_exists.html",Fail_3:"html_lang_exists.html",Fail_4:"html_lang_exists.html",Fail_5:"html_lang_exists.html",Potential_5:"html_lang_exists.html",Potential_6:"html_lang_exists.html"}},messages:{"en-US":{group:"Page must identify the default language of the document with a 'lang' attribute",Pass_0:'Page language detected as "{0}"',Fail_1:"Page detected as XHTML 1.0, but has neither 'lang' nor 'xml:lang' attributes",Fail_2:"Page detected as XHTML, but does not have an 'xml:lang' attribute",Fail_3:"Page detected as HTML, but does not have a 'lang' attribute",Fail_4:"Page detected with 'lang' and 'xml:lang' attributes and primary languages do not match: \"{0}\", \"{1}\"",Fail_5:"Page detected with 'lang' and 'xml:lang' attributes that do not match: \"{0}\", \"{1}\"",Potential_5:"Page detected as XHTML 1.0 with only a 'lang' attribute. Confirm that page is only delivered via text/html mime type",Potential_6:"Page detected as XHTML 1.0 with only an 'xml:lang' attribute. Confirm that page is only delivered via xml mime type"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"3.1.1",level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[{b5c3f8:{Pass_0:"pass",Fail_1:"inapplicable",Fail_2:"inapplicable",Fail_3:"fail",Fail_4:"inapplicable",Fail_5:"inapplicable",Potential_5:"inapplicable",Potential_6:"inapplicable"},"5b7ae0":{Pass_0:"pass",Fail_1:"inapplicable",Fail_2:"inapplicable",Fail_3:"inapplicable",Fail_4:"fail",Fail_5:"pass",Potential_5:"inapplicable",Potential_6:"inapplicable"}}],run:function(e,t,i){if(l.AncestorUtil.isPresentationFrame(i))return null;var n=e.dom.node,o=n.ownerDocument.doctype?n.ownerDocument.doctype.publicId:"";o||(o="");var s=n.getAttribute("lang"),u=n.getAttribute("xml:lang");return o.includes("XHTML")&&!o.includes("1.0")?u?(0,a.RulePass)("Pass_0",[u]):(0,a.RuleFail)("Fail_2"):o.includes("XHTML")&&o.includes("1.0")?s||u?s&&u?s!==u?r.LangUtil.validPrimaryLang(s)&&r.LangUtil.validPrimaryLang(u)?r.LangUtil.matchPrimaryLang(s,u)?(0,a.RuleFail)("Fail_5",[s,u],[]):(0,a.RuleFail)("Fail_4",[s,u],[]):null:(0,a.RulePass)("Pass_0",[s]):s?(0,a.RulePotential)("Potential_5"):(0,a.RulePotential)("Potential_6"):(0,a.RuleFail)("Fail_1"):s?s&&u&&s!==u?r.LangUtil.validPrimaryLang(s)&&r.LangUtil.validPrimaryLang(u)?r.LangUtil.matchPrimaryLang(s,u)?(0,a.RuleFail)("Fail_5",[s,u],[]):(0,a.RuleFail)("Fail_4",[s,u],[]):null:(0,a.RulePass)("Pass_0",[s]):(0,a.RuleFail)("Fail_3")}}},8260(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.html_skipnav_exists=void 0;var a=i(461),n=i(461),l=i(7139),r=i(5279);t.html_skipnav_exists={id:"html_skipnav_exists",context:"dom:html",refactor:{RPT_Html_SkipNav:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{group:"html_skipnav_exists.html",Pass_0:"html_skipnav_exists.html",Potential_1:"html_skipnav_exists.html"}},messages:{"en-US":{group:"Provide a way to bypass blocks of content that are repeated on multiple Web pages",Pass_0:"Rule Passed",Potential_1:"Verify there is a way to bypass blocks of content that are repeated on multiple Web pages"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"2.4.1",level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,o=!1,s=l.CommonUtil.getDocElementsByTag(n,"frame"),u=l.CommonUtil.getDocElementsByTag(n,"h1");if(null!=s&&s.length>0||null!=u&&u.length>0)o=!0;else for(var d=l.CommonUtil.getDocElementsByTag(n,"a"),c={},m=0;!o&&m<d.length;++m)if(d[m].hasAttribute("href")){var p=d[m].href;"string"!=typeof p&&(p=p.baseVal?p.baseVal:"");var h,g="";if((h=void 0!==n.ownerDocument.locationFromDAP&&null!=n.ownerDocument.locationFromDAP?n.ownerDocument.locationFromDAP:n.ownerDocument.location)&&(g=h.href),p.startsWith("file:///")&&(p="file:/"+p.substring(8)),g.startsWith("file:///")&&(g="file:/"+g.substring(8)),"#"==p.charAt(0)||p.startsWith(g+"#")){var b=l.CommonUtil.getFileAnchor(p);null!=r.FragmentUtil.getById(n,b)?o=!0:c[b]=!0}}else if(d[m].hasAttribute("name")){var _=d[m].getAttribute("name");-1!=_.indexOf("#")&&(_=l.CommonUtil.getFileAnchor(_)),o=_ in c}return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},8920(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.iframe_interactive_tabbable=void 0;var a=i(7139),n=i(461),l=i(461),r=i(3946),o=i(7507);t.iframe_interactive_tabbable={id:"iframe_interactive_tabbable",context:"dom:iframe",dependencies:[],help:{"en-US":{group:"iframe_interactive_tabbable.html",pass:"iframe_interactive_tabbable.html",fail_invalid:"iframe_interactive_tabbable.html"}},messages:{"en-US":{group:"Iframe with interactive content should not be excluded from tab order using tabindex",pass:"The iframe with interactive content is not excluded from the tab order using tabindex",fail_invalid:"The <iframe> with interactive content is excluded from tab order using tabindex"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:["akn7bn"],run:function(e,t,i){var l=e.dom.node;if(!r.VisUtil.isNodeHiddenFromAT(l)&&!a.CommonUtil.isNodeDisabled(l)){var s=(new o.DOMMapper).getUnadjustedBounds(l);if(!s)return null;if(Math.max(s.height,s.width)<30||Math.min(s.height,s.width)<15)return null;if(!l.hasAttribute("tabindex")||parseInt(l.getAttribute("tabindex"))>=0)return(0,n.RulePass)("pass");var u=l;return u&&u.contentDocument&&u.contentDocument.documentElement&&a.CommonUtil.getTabbableChildren(l)>0?(0,n.RuleFail)("fail_invalid"):null}}}},1237(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.imagebutton_alt_exists=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139);t.imagebutton_alt_exists={id:"imagebutton_alt_exists",context:"dom:input",refactor:{WCAG20_Input_ExplicitLabelImage:{Pass_0:"Pass_0",Pass_1:"Pass_1",Pass_2:"Pass_2",Fail:"Fail"}},help:{"en-US":{Pass_0:"imagebutton_alt_exists.html",Pass_1:"imagebutton_alt_exists.html",Pass_2:"imagebutton_alt_exists.html",Fail:"imagebutton_alt_exists.html",group:"imagebutton_alt_exists.html"}},messages:{"en-US":{Pass_0:"Image button provides alternative text using the 'alt' attribute",Pass_1:"Image button provides alternative text using an ARIA label",Pass_2:"Image button provides alternative text using the 'title' attribute",Fail:'The <input> element of type "image" has no text alternative',group:'The <input> element of type "image" should have a text alternative'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:"59796f",run:function(e,t,i){var n=e.dom.node;return n.hasAttribute("type")&&"image"==n.getAttribute("type").toLowerCase()?r.CommonUtil.attributeNonEmpty(n,"alt")?(0,a.RulePass)("Pass_0"):l.AriaUtil.hasAriaLabel(n)?(0,a.RulePass)("Pass_1"):n.hasAttribute("title")&&n.getAttribute("title").length>0?(0,a.RulePass)("Pass_2"):(0,a.RuleFail)("Fail"):null}}},4101(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.imagemap_alt_exists=void 0;var a=i(461),n=i(461),l=i(7139),r=i(3946);t.imagemap_alt_exists={id:"imagemap_alt_exists",context:"dom:img[usemap], dom:img[ismap]",refactor:{HAAC_Img_UsemapAlt:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"imagemap_alt_exists.html",Fail_1:"imagemap_alt_exists.html",group:"imagemap_alt_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Image map or child <area> has no text alternative",group:"An image map and each <area> element in an image map must have text alternative(s)"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;return r.VisUtil.isNodeHiddenFromAT(n)?null:l.CommonUtil.attributeNonEmpty(n,"alt")||!n.hasAttribute("ismap")&&!l.CommonUtil.attributeNonEmpty(n,"usemap")?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},275(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.img_alt_background=void 0;var a=i(461),n=i(461),l=i(3946);t.img_alt_background={id:"img_alt_background",context:"dom:*",refactor:{HAAC_BackgroundImg_HasTextOrTitle:{Pass_0:"Pass_0",Manual_1:"Manual_1"}},help:{"en-US":{Pass_0:"img_alt_background.html",Manual_1:"img_alt_background.html",group:"img_alt_background.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Manual_1:"Verify important background image information has a text alternative in system high contrast mode",group:"Background images that convey important information must have a text alternative that describes the image"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var r=n.ownerDocument.defaultView.getComputedStyle(n);if(null==r)return(0,a.RulePass)("Pass_0");var o=r.backgroundImage,s=!0;if(null!=o&&""!=o&&"none"!=o&&"inherit"!=o)if(null!=n.innerHTML&&0!=n.innerHTML.trim().length)s=!1;else{var u=n.getAttribute("title");null!=u&&0!=u.length&&(s=!1)}return s?(0,a.RulePass)("Pass_0"):s?void 0:(0,a.RuleManual)("Manual_1")}}},7601(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.img_alt_decorative=void 0;var a=i(461),n=i(461),l=i(7011),r=i(3946);t.img_alt_decorative={id:"img_alt_decorative",context:"dom:img[alt]",refactor:{WCAG20_Img_PresentationImgHasNonNullAlt:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"img_alt_decorative.html",Fail_1:"img_alt_decorative.html",group:"img_alt_decorative.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Image designated as decorative has non-null 'alt' attribute",group:'Image designated as decorative must have \'alt=""'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var o=!0;return(l.AriaUtil.hasRole(n,"presentation")||l.AriaUtil.hasRole(n,"none"))&&(o=0==n.getAttribute("alt").length),o?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},7541(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.img_alt_misuse=void 0;var a=i(461),n=i(461),l=i(3946);t.img_alt_misuse={id:"img_alt_misuse",context:"dom:img, dom:area, dom:input",refactor:{RPT_Img_AltCommonMisuse:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"img_alt_misuse.html",Potential_1:"img_alt_misuse.html",group:"img_alt_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that the file name serves as a good inline replacement for the image",group:"'alt' attribute value must be a good inline replacement for the image"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var r=n.nodeName.toLowerCase(),o=!0;if(n.hasAttribute("alt")){var s=n.getAttribute("alt").trim();if(s.length>0){for(var u=["short description"],d=0;o&&d<u.length;++d)o=-1==s.indexOf(u[d]);if(o){var c=n.getAttribute("area"==r?"href":"src");null!=c&&(o=c.trim()!=s&&(-1==s.indexOf(".")||-1==s.indexOf(c)&&-1==c.indexOf(s)))}}}return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},8274(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.img_alt_null=void 0;var a=i(461),n=i(461),l=i(3946),r=i(7011),o=i(7139);t.img_alt_null={id:"img_alt_null",context:"dom:img[alt]",refactor:{WCAG20_Img_TitleEmptyWhenAltNull:{Pass_0:"pass",Fail_1:"fail_decorative"}},help:{"en-US":{pass:"img_alt_null.html",fail_decorative:"img_alt_null.html",potential_aria_override:"img_alt_null.html",group:"img_alt_null.html"}},messages:{"en-US":{pass:"Neither 'aria' nor 'title' attributes are used for the decorative image",fail_decorative:"The image 'alt' attribute is empty, but the 'title' attribute is not empty",potential_aria_override:"The image 'alt' attribute is empty, but the 'aria' label is not empty and overrides the 'alt' attribute",group:"When the intent is to mark an image as decorative with an empty 'alt' attribute, the 'aria' or 'title' attributes should not be used"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE,reasonCodes:["fail_decorative"]},{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["ARIA"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE,reasonCodes:["potential_aria_override"]}],act:[{"46ca7f":{potential_aria_override:"fail"}}],run:function(e,t,i){var n=e.dom.node;return l.VisUtil.isNodeHiddenFromAT(n)||n.getAttribute("alt").trim().length>0?null:r.AriaUtil.getAriaLabel(n).length>0?(0,a.RulePotential)("potential_aria_override"):o.CommonUtil.attributeNonEmpty(n,"title")?(0,a.RuleFail)("fail_decorative"):(0,a.RulePass)("pass")}}},590(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.img_alt_redundant=void 0;var a=i(461),n=i(461),l=i(3864),r=i(7139);t.img_alt_redundant={id:"img_alt_redundant",context:"dom:img[alt]",refactor:{WCAG20_Img_LinkTextNotRedundant:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{Pass_0:"img_alt_redundant.html",Fail_1:"img_alt_redundant.html",Fail_2:"img_alt_redundant.html",Fail_3:"img_alt_redundant.html",group:"img_alt_redundant.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Link text is repeated in an image 'alt' value within the same link",Fail_2:"Link text of previous link is repeated in image 'alt' value of a link",Fail_3:"Image 'alt' value within a link is repeated in link text of the link after",group:"The text alternative for an image within a link should not repeat the link text or adjacent link text"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1","2.4.4"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node,o=r.CommonUtil.getAncestor(n,"a");if(null==o)return null;var s=n.getAttribute("alt").trim().toLowerCase();if(0==s.length)return null;var u=o.innerText,d="";if(null!=u&&(d=u.trim().toLowerCase()),!(d.length>0)){for(var c=!0,m=new l.DOMWalker(o);c&&m.prevNode()&&!("#text"==(h=(p=m.node).nodeName.toLowerCase())&&p.nodeValue.length>0||"img"==h&&r.CommonUtil.attributeNonEmpty(p,"alt"));)"a"!==h||r.CommonUtil.shouldNodeBeSkippedHidden(p)||(c=(p.innerText||p.textContent||"").trim().toLowerCase()!=s);if(!c)return(0,a.RuleFail)("Fail_2");for(m=new l.DOMWalker(o,!0);c&&m.nextNode();){var p,h;if("#text"==(h=(p=m.node).nodeName.toLowerCase())&&p.nodeValue.length>0||"img"==h&&r.CommonUtil.attributeNonEmpty(p,"alt"))break;"a"!=h||r.CommonUtil.shouldNodeBeSkippedHidden(p)||(c=p.innerText.trim().toLowerCase()!=s)}return c?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_3")}return s==d?(0,a.RuleFail)("Fail_1"):void 0}}},8925(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.img_alt_valid=void 0;var a=i(461),n=i(461),l=i(7011),r=i(3946),o=i(1950);t.img_alt_valid={id:"img_alt_valid",context:"dom:img",refactor:{WCAG20_Img_HasAlt:{pass:"pass",fail_blank_alt:"fail_blank_alt",fail_no_alt:"fail_no_alt",fail_blank_title:"fail_blank_title"}},help:{"en-US":{pass:"img_alt_valid.html",fail_blank_alt:"img_alt_valid.html",fail_no_alt:"img_alt_valid.html",fail_blank_title:"img_alt_valid.html",group:"img_alt_valid.html"}},messages:{"en-US":{pass:"The image has an accessible name or is correctly marked as decorative or redundant",fail_blank_alt:"Image 'alt' attribute value consists only of blank space(s)",fail_no_alt:"The image has neither an accessible name nor is marked as decorative or redundant",fail_blank_title:"The image does not have an 'alt' attribute or ARIA label, and the 'title' attribute value consists only of blank space(s)",group:"Images must have accessible names unless they are decorative or redundant"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:"23a2a8",run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n)||o.AccNameUtil.isAccessibleNameIgnorable(n))return null;if(0!==l.AriaUtil.getAriaLabel(n).trim().length)return(0,a.RulePass)("pass");var s=n.hasAttribute("alt")?n.getAttribute("alt"):null;if(null!==s)return 0===s.length||s.trim().length>0?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_blank_alt");var u=n.hasAttribute("title")?n.getAttribute("title"):null;if(null!==u&&0!==u.length)return 0===u.trim().length?(0,a.RuleFail)("fail_blank_title"):(0,a.RulePass)("pass");if(null===s){var d=l.AriaUtil.getResolvedRole(n,!1);return"presentation"===d||"none"===d?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_no_alt")}return 0===s.length?(0,a.RulePass)("pass"):void 0}}},9234(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.img_ismap_misuse=void 0;var a=i(461),n=i(461),l=i(7139),r=i(3946);t.img_ismap_misuse={id:"img_ismap_misuse",context:"dom:img[ismap]",refactor:{RPT_Img_UsemapValid:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"img_ismap_misuse.html",Potential_1:"img_ismap_misuse.html",group:"img_ismap_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Server-side image map hot-spots do not have duplicate text links",group:"Server-side image map hot-spots must have duplicate text links"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var o=!1;if(n.hasAttribute("usemap")){var s=n.getAttribute("usemap"),u=(s=s.trim().toLowerCase()).indexOf("#");if(-1!=u&&(s=s.substr(u+1)),s.length>0)for(var d=l.CommonUtil.getDocElementsByTag(n,"map"),c=0;!o&&c<d.length;++c)o=d[c].hasAttribute("name")&&d[c].getAttribute("name").toLowerCase()==s}return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},8617(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.img_longdesc_misuse=void 0;var a=i(461),n=i(461),l=i(7139),r=i(3946);t.img_longdesc_misuse={id:"img_longdesc_misuse",context:"dom:img[longdesc]",refactor:{RPT_Img_LongDescription2:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"img_longdesc_misuse.html",Potential_1:"img_longdesc_misuse.html",group:"img_longdesc_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that the file designated by the 'longdesc' attribute contains valid HTML content (file extension not recognized)",group:" The 'longdesc' attribute must reference HTML content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var o=n.getAttribute("longdesc"),s=l.CommonUtil.getFileExt(o),u=0!=s.length&&l.CommonUtil.isHtmlExt(s)||o.startsWith("#")||o.startsWith("http://")||o.startsWith("https://")||o.startsWith("data:");return u?(0,a.RulePass)("Pass_0"):u?void 0:(0,a.RulePotential)("Potential_1")}}},591(e,t,i){var a=this&&this.__createBinding||(Object.create?function(e,t,i,a){void 0===a&&(a=i);var n=Object.getOwnPropertyDescriptor(t,i);n&&!("get"in n?!t.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,a,n)}:function(e,t,i,a){void 0===a&&(a=i),e[a]=t[i]}),n=this&&this.__exportStar||function(e,t){for(var i in e)"default"===i||Object.prototype.hasOwnProperty.call(t,i)||a(t,e,i)};Object.defineProperty(t,"__esModule",{value:!0}),n(i(2297),t),n(i(4401),t),n(i(4546),t),n(i(9292),t),n(i(9605),t),n(i(3987),t),n(i(8631),t),n(i(8025),t),n(i(1198),t),n(i(8001),t),n(i(5778),t),n(i(8118),t),n(i(2242),t),n(i(3673),t),n(i(5080),t),n(i(183),t),n(i(6805),t),n(i(1886),t),n(i(4078),t),n(i(5750),t),n(i(85),t),n(i(514),t),n(i(5310),t),n(i(9083),t),n(i(6049),t),n(i(5099),t),n(i(2759),t),n(i(3141),t),n(i(5131),t),n(i(5167),t),n(i(8115),t),n(i(5733),t),n(i(5782),t),n(i(6731),t),n(i(390),t),n(i(3900),t),n(i(1218),t),n(i(6734),t),n(i(9973),t),n(i(5711),t),n(i(3384),t),n(i(2762),t),n(i(5757),t),n(i(5232),t),n(i(1891),t),n(i(6142),t),n(i(4863),t),n(i(1440),t),n(i(1968),t),n(i(1617),t),n(i(3475),t),n(i(3370),t),n(i(9272),t),n(i(7735),t),n(i(3923),t),n(i(7521),t),n(i(1852),t),n(i(799),t),n(i(4614),t),n(i(5952),t),n(i(5395),t),n(i(1992),t),n(i(7955),t),n(i(9531),t),n(i(891),t),n(i(7446),t),n(i(6137),t),n(i(6839),t),n(i(8135),t),n(i(507),t),n(i(3566),t),n(i(5173),t),n(i(6027),t),n(i(7515),t),n(i(1704),t),n(i(5053),t),n(i(4681),t),n(i(8050),t),n(i(2644),t),n(i(429),t),n(i(4617),t),n(i(5460),t),n(i(3399),t),n(i(3498),t),n(i(9629),t),n(i(733),t),n(i(9797),t),n(i(7156),t),n(i(3062),t),n(i(3827),t),n(i(5498),t),n(i(510),t),n(i(7722),t),n(i(4597),t),n(i(2104),t),n(i(8260),t),n(i(8920),t),n(i(1237),t),n(i(4101),t),n(i(275),t),n(i(7601),t),n(i(7541),t),n(i(8274),t),n(i(590),t),n(i(8925),t),n(i(9234),t),n(i(8617),t),n(i(1939),t),n(i(7726),t),n(i(3142),t),n(i(1353),t),n(i(2631),t),n(i(8550),t),n(i(8853),t),n(i(3180),t),n(i(1382),t),n(i(953),t),n(i(2222),t),n(i(4678),t),n(i(7578),t),n(i(9964),t),n(i(6401),t),n(i(1174),t),n(i(9907),t),n(i(6032),t),n(i(5622),t),n(i(2240),t),n(i(4019),t),n(i(361),t),n(i(5960),t),n(i(5515),t),n(i(8752),t),n(i(8834),t),n(i(1025),t),n(i(9116),t),n(i(435),t),n(i(6640),t),n(i(2068),t),n(i(7322),t),n(i(5702),t),n(i(1961),t),n(i(3022),t),n(i(375),t),n(i(4658),t),n(i(4605),t),n(i(5294),t),n(i(3506),t),n(i(7475),t),n(i(8064),t),n(i(7942),t),n(i(2219),t),n(i(1473),t),n(i(1912),t),n(i(6539),t),n(i(4),t),n(i(5334),t),n(i(2173),t),n(i(8349),t),n(i(8142),t),n(i(3980),t),n(i(4701),t),n(i(18),t),n(i(9314),t),n(i(1667),t),n(i(9599),t),n(i(4672),t),n(i(4353),t),n(i(7147),t),n(i(1419),t),n(i(855),t),n(i(3420),t),n(i(408),t)},1939(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_autocomplete_valid=void 0;var a=i(461),n=i(461),l=i(7139),r=i(3946);t.input_autocomplete_valid={id:"input_autocomplete_valid",context:"dom:input[autocomplete], dom:textarea[autocomplete], dom:select[autocomplete]",refactor:{WCAG21_Input_Autocomplete:{Pass_0:"pass",Fail_1:"fail_inappropriate",Fail_2:"fail_invalid",Fail_attribute_incorrect:"fail_incorrect"}},help:{"en-US":{group:"input_autocomplete_valid.html",pass:"input_autocomplete_valid.html",fail_inappropriate:"input_autocomplete_valid.html",fail_invalid:"input_autocomplete_valid.html",fail_incorrect:"input_autocomplete_valid.html"}},messages:{"en-US":{group:"The 'autocomplete' attribute's token(s) must be appropriate for the input form field",pass:"The 'autocomplete' attribute's token(s) is appropriate for the input form field",fail_inappropriate:"The 'autocomplete' attribute's token(s) are not appropriate for the input form field",fail_invalid:"The 'autocomplete' attribute's token(s) are not appropriate for an input form field of any type",fail_incorrect:"The 'autocomplete' attribute has an incorrect value"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.5"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[{"73f2c2":{pass:"pass",fail_inappropriate:"fail",fail_invalid:"pass",fail_incorrect:"fail"}}],run:function(e,t,i){var n=e.dom.node;if(!r.VisUtil.isNodeVisible(n)||l.CommonUtil.isNodeDisabled(n))return null;var o=n.getAttribute("autocomplete").trim().toLowerCase(),s=o.split(/\s+/);if(0===s.length||0===o.length)return null;var u={tokensOnOff:["on","off"],tokenOptionalSection:"section-",tokensOptionalPurpose:["shipping","billing"],tokensMandatoryGroup1_password:["new-password","current-password","one-time-code"],tokensMandatoryGroup1_multiline:["street-address"],tokensMandatoryGroup1_month:["cc-exp"],tokensMandatoryGroup1_numeric:["cc-exp-month","cc-exp-year","transaction-amount","bday-day","bday-month","bday-year"],tokensMandatoryGroup1_date:["bday"],tokensMandatoryGroup1_url:["url","photo"],tokensMandatoryGroup1_text:["name","honorific-prefix","given-name","additional-name","family-name","honorific-suffix","nickname","username","organization-title","organization","address-line1","address-line2","address-line3","address-level4","address-level3","address-level2","address-level1","country","country-name","postal-code","cc-name","cc-given-name","cc-additional-name","cc-family-name","cc-number","cc-csc","cc-type","transaction-currency","language","sex"],tokensMandatoryGroup1_all:["name","honorific-prefix","given-name","additional-name","family-name","honorific-suffix","nickname","username","new-password","current-password","organization-title","organization","street-address","address-line1","address-line2","address-line3","address-level4","address-level3","address-level2","address-level1","country","country-name","postal-code","cc-name","cc-given-name","cc-additional-name","cc-family-name","cc-number","cc-exp","cc-exp-month","cc-exp-year","cc-csc","cc-type","transaction-currency","transaction-amount","language","bday","bday-day","bday-month","bday-year","sex","url","photo"],tokensOptionalGroup2:["home","work","mobile","fax","pager"],tokensMandatoryGroup2_tel:["tel"],tokensMandatoryGroup2_email:["email"],tokensMandatoryGroup2_url:["impp"],tokensMandatoryGroup2_text:["tel-country-code","tel-national","tel-area-code","tel-local","tel-local-prefix","tel-local-suffix","tel-extension"],tokensMandatoryGroup2_all:["tel","tel-country-code","tel-national","tel-area-code","tel-local","tel-local-prefix","tel-local-suffix","tel-extension","email","impp"],tokensOptionGroup1_webauthn:["webauthn"]},d=[];for(var c in u)d=d.concat(u[c]);var m=!1,p=!0,h=n.nodeName.toLowerCase();if(!s.every(function(e){return d.includes(e)||e.startsWith(u.tokenOptionalSection)}))return(0,a.RuleFail)("fail_incorrect");var g=n.hasAttribute("type")?n.getAttribute("type").trim().toLowerCase():"text",b=[],_=[],f=[];if("textarea"===h||"select"===h)b=u.tokensMandatoryGroup1_all,_=u.tokensMandatoryGroup2_all,"textarea"===h&&(f=u.tokensOptionGroup1_webauthn);else{if("input"!==h)return null;switch(f=u.tokensOptionGroup1_webauthn,g){case"text":case"search":b=u.tokensMandatoryGroup1_text.concat(u.tokensMandatoryGroup1_password,u.tokensMandatoryGroup1_url,u.tokensMandatoryGroup1_numeric,u.tokensMandatoryGroup1_month,u.tokensMandatoryGroup1_date),_=u.tokensMandatoryGroup2_all;break;case"password":b=u.tokensMandatoryGroup1_password;break;case"url":b=u.tokensMandatoryGroup1_url,_=u.tokensMandatoryGroup2_url;break;case"email":_=u.tokensMandatoryGroup2_email;break;case"tel":_=u.tokensMandatoryGroup2_tel;break;case"number":b=u.tokensMandatoryGroup1_numeric;break;case"month":b=u.tokensMandatoryGroup1_month;break;case"date":b=u.tokensMandatoryGroup1_date;break;default:return null}}if(s.includes("on")||s.includes("off"))return 1===s.length?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_invalid");var v=0,A=0;return s[v].startsWith(u.tokenOptionalSection)&&s[v].length>8&&(v++,A++),s.length>v&&u.tokensOptionalPurpose.includes(s[v])&&(v++,A++),s.length>v&&(b.includes(s[v])?(m=!0,v++):(u.tokensOptionalGroup2.includes(s[v])&&v++,_.includes(s[v])&&(m=!0,v++))),s.length>A&&(u.tokensMandatoryGroup1_all.includes(s[A])?(p=!0,A++):(u.tokensOptionalGroup2.includes(s[A])&&A++,u.tokensMandatoryGroup2_all.includes(s[A])&&(p=!0,A++))),s.length>v+A&&f.includes(s[v+A])&&v++,(s.length>v&&f.includes(s[v])||s.length>A&&f.includes(s[A]))&&(v++,A++),m&&s.length===v?(0,a.RulePass)("pass"):p&&s.length===A?(0,a.RuleFail)("fail_incorrect"):(0,a.RuleFail)("fail_inappropriate")}}},7726(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_checkboxes_grouped=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(3864),s=i(4566),u=i(3946),d=i(9196);t.input_checkboxes_grouped={id:"input_checkboxes_grouped",context:"dom:input[type=radio], dom:input[type=checkbox]",refactor:{WCAG20_Input_RadioChkInFieldSet:{Pass_LoneNogroup:"pass_lonenogroup",Pass_Grouped:"pass_grouped",Pass_RadioNoName:"pass_radioNoName",Fail_ControlNameMismatch:"fail_controlnamemismatch",Fail_NotGroupedOtherGrouped:"fail_notgroupedothergrouped",Fail_NotGroupedOtherNotGrouped:"fail_notgroupedothernotgrouped",Fail_NotSameGroup:"fail_notsamegroup",Potential_LoneCheckbox:"potential_lonecheckbox",Potential_UnnamedCheckbox:"potential_unnamedcheckbox"}},help:{"en-US":{group:"input_checkboxes_grouped.html",pass_lonenogroup:"input_checkboxes_grouped.html",pass_grouped:"input_checkboxes_grouped.html",pass_radiononame:"input_checkboxes_grouped.html",fail_controlnamemismatch:"input_checkboxes_grouped.html",fail_notgroupedothergrouped:"input_checkboxes_grouped.html",fail_notgroupedothernotgrouped:"input_checkboxes_grouped.html",fail_notsamegroup:"input_checkboxes_grouped.html",potential_lonecheckbox:"input_checkboxes_grouped.html",potential_unnamedcheckbox:"input_checkboxes_grouped.html"}},messages:{"en-US":{group:"Related sets of radio buttons or checkboxes should be programmatically grouped",pass_lonenogroup:"{0} grouping not required for a control of this type",pass_grouped:"{0} input is grouped with other related controls with the same name",pass_radiononame:"Radio input is not grouped, but passes because it has no name to group with other radio inputs",fail_controlnamemismatch:'{0} input found that has the same name, "{2}" as a {1} input',fail_notgroupedothergrouped:'{0} input is not in the group with another {0} with the name "{1}"',fail_notgroupedothernotgrouped:'{0} input and others with the name "{1}" are not grouped together',fail_notsamegroup:'{0} input is in a different group than another {0} with the name "{1}"',potential_lonecheckbox:"Verify that this ungrouped checkbox input is not related to other checkboxes",potential_unnamedcheckbox:"Verify that this un-named, ungrouped checkbox input is not related to other checkboxes"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node;if(u.VisUtil.isNodeHiddenFromAT(n))return null;var c=function(e){var t=r.CommonUtil.getAncestor(e,"fieldset")||l.AriaUtil.getAncestorWithRole(e,"radiogroup")||l.AriaUtil.getAncestorWithRole(e,"group")||l.AriaUtil.getAncestorWithRole(e,"grid")||l.AriaUtil.getAncestorWithRole(e,"table");return t||(t=r.CommonUtil.getAncestor(e,"table"))&&!d.TableUtil.isDataTable(t)&&(t=null),t},m=n.getAttribute("type").toLowerCase(),p=l.AriaUtil.getAncestorWithRole(n,"form")||r.CommonUtil.getAncestor(n,"html")||n.ownerDocument.documentElement,h=s.CacheUtil.getCache(p,"input_checkboxes_grouped",null);if(!h){h={checkboxByName:{},radiosByName:{},nameToGroup:{},numCheckboxes:0,numRadios:0};for(var g=new o.DOMWalker(p,!1,p,!0),b=[],_=[];g.nextNode();)if(!g.bEndTag&&1===g.node.nodeType&&"input"===g.node.nodeName.toLowerCase()&&u.VisUtil.isNodeVisible(g.node)){var f=g.node.getAttribute("type");"checkbox"===f?b.push(g.node):"radio"===f&&_.push(g.node)}for(var v=0;v<b.length;++v){var A=b[v];if((l.AriaUtil.getAncestorWithRole(A,"form")||r.CommonUtil.getAncestor(n,"html")||n.ownerDocument.documentElement)===p&&!r.CommonUtil.shouldNodeBeSkippedHidden(A)){var w=A.getAttribute("name")||"";(h.checkboxByName[w]=h.checkboxByName[w]||[]).push(A),h.nameToGroup[w]=h.nameToGroup[w]||c(A),++h.numCheckboxes}}for(v=0;v<_.length;++v){var y=_[v];if((l.AriaUtil.getAncestorWithRole(y,"form")||r.CommonUtil.getAncestor(n,"html")||n.ownerDocument.documentElement)===p&&!r.CommonUtil.shouldNodeBeSkippedHidden(y)){var C=y.getAttribute("name")||"";(h.radiosByName[C]=h.radiosByName[C]||[]).push(y),h.nameToGroup[C]=h.nameToGroup[C]||c(y),++h.numRadios}}s.CacheUtil.setCache(p,"input_checkboxes_grouped",h)}var k=n.getAttribute("name"),R=c(n);if(m="radio"===m?"Radio":"Checkbox",k&&""!==k){var x=(h.radiosByName[k]||[]).length,P=(h.checkboxByName[k]||[]).length;return x>0&&P>0?(0,a.RuleFail)("fail_controlnamemismatch",[m,"checkbox"===m?"radio":"checkbox",k]):"Radio"===m&&(1===h.numRadios||1===x)||"Checkbox"===m&&1===h.numCheckboxes?null===R?(0,a.RulePass)("pass_lonenogroup",[m]):(0,a.RulePass)("pass_grouped",[m]):"Checkbox"===m&&h.numCheckboxes>1&&1===P?null===R?(0,a.RulePotential)("potential_lonecheckbox",[m]):(0,a.RulePass)("pass_grouped",[m]):null===R?null!==h.nameToGroup[k]?(0,a.RuleFail)("fail_notgroupedothergrouped",[m,k]):(0,a.RuleFail)("fail_notgroupedothernotgrouped",[m,k]):h.nameToGroup[k]!==R?(0,a.RuleFail)("fail_notsamegroup",[m,k]):(0,a.RulePass)("pass_grouped",[m])}return"Radio"===m?null===R?(0,a.RulePass)("pass_radiononame",[m]):(0,a.RulePass)("pass_grouped",[m]):null===R?(h.checkboxByName[""]||[]).length>1?(0,a.RulePotential)("potential_unnamedcheckbox",[m]):(0,a.RulePass)("pass_lonenogroup",[m]):(0,a.RulePass)("pass_grouped",[m])}}},3142(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_fields_grouped=void 0;var a=i(461),n=i(461),l=i(7139);t.input_fields_grouped={id:"input_fields_grouped",context:"dom:input, dom:textarea, dom:select",refactor:{WCAG20_Input_InFieldSet:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"input_fields_grouped.html",Potential_1:"input_fields_grouped.html",group:"input_fields_grouped.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Use the <fieldset> element to group logically related input elements",group:"Groups of logically related input elements should be contained within a <fieldset> element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node;if("input"==n.nodeName.toLowerCase()&&n.hasAttribute("type")&&"text"!=(m=n.getAttribute("type").toLowerCase())&&"file"!=m&&"password"!=m)return(0,a.RulePass)("Pass_0");if(null!=l.CommonUtil.getAncestor(n,"fieldset"))return(0,a.RulePass)("Pass_0");for(var r=l.CommonUtil.getAncestor(n,["form","body"]),o=["input","textarea","select"],s=!0,u=0;s&&u<o.length;++u)for(var d=r.getElementsByTagName(o[u]),c=0;s&&c<d.length;++c)if(!l.CommonUtil.shouldNodeBeSkippedHidden(d[c])){var m=d[c].hasAttribute("type")?d[c].getAttribute("type").toLowerCase():"text";s=d[c]==n||"text"!=m&&"password"!=m&&"file"!=m}return s?(0,a.RulePass)("Pass_0"):s?void 0:(0,a.RulePotential)("Potential_1")}}},1353(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_haspopup_conflict=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(3946);t.input_haspopup_conflict={id:"input_haspopup_conflict",context:"dom:input[list][aria-haspopup]",refactor:{input_haspopup_invalid:{Potential_1:"potential_type_misuse",Potential_2:"potential_misuse"}},help:{"en-US":{group:"input_haspopup_conflict.html",potential_type_misuse:"input_haspopup_conflict.html",potential_misuse:"input_haspopup_conflict.html",potential_list_notexist:"input_haspopup_conflict.html",fail_invalid_list_type:"input_haspopup_conflict.html",fail_invalid_list_elem:"input_haspopup_conflict.html"}},messages:{"en-US":{group:"<input> element with a 'list' attribute should not use an explicit 'aria-haspopup' attribute",potential_type_misuse:"The <input> element with type \"{0}\" and 'list' attribute uses an explicit 'aria-haspopup' attribute",potential_misuse:"The <input> element with a missing or invalid type and 'list' attribute uses an explicit 'aria-haspopup' attribute",potential_list_notexist:"The list attribute for the <input> element is invalid",fail_invalid_list_type:'The list attribute for the <input> element with the type "{0}" is invalid',fail_invalid_list_elem:"The list attribute for the <input> element does not reference a datalist element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(o.VisUtil.isNodeHiddenFromAT(n)||r.CommonUtil.isNodeDisabled(n))return null;var s=l.AriaUtil.getUserDefinedRoles(n);if(s&&s.length>0&&!s.includes("combobox"))return null;var u=["text","search","tel","url","email","date","month","week","time","datetime-local","number","range","color"],d=["file","password","checkbox","radio","submit","reset","image","hidden","button"],c=n.getAttribute("type");if(!c||0===c.trim().length)return(0,a.RulePotential)("potential_misuse");if(c=c.trim().toLowerCase(),!u.includes(c)&&!d.includes(c))return(0,a.RulePotential)("potential_misuse");if(c&&d.includes(c))return(0,a.RuleFail)("fail_invalid_list_type");var m=n.getAttribute("list");if(!m||0===m.trim().length)return(0,a.RulePotential)("potential_list_notexist");var p=n.ownerDocument.getElementById(m);return p?"datalist"!==p.nodeName.toLowerCase()?(0,a.RuleFail)("fail_invalid_list_elem"):u.includes(c)?(0,a.RulePotential)("potential_type_misuse",[c]):void 0:(0,a.RuleFail)("potential_list_notexist")}}},2631(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_label_after=void 0;var a=i(461),n=i(461),l=i(3864),r=i(7139);t.input_label_after={id:"input_label_after",context:"dom:input",refactor:{WCAG20_Input_LabelAfter:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_0:"input_label_after.html",Fail_1:"input_label_after.html",Fail_2:"input_label_after.html",group:"input_label_after.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Checkbox or radio button is nested in label, so label is not after the input control",Fail_2:"Label text is located before its associated checkbox or radio button element",group:"Checkboxes and radio buttons must have a label after the input control"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.3.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,o="";if(n.hasAttribute("type")&&(o=n.getAttribute("type").toLowerCase()),"checkbox"!=o&&"radio"!=o)return null;var s=r.CommonUtil.getLabelForElementHidden(n,!0);if(null===s||!r.CommonUtil.hasInnerContentHidden(s))return null;var u,d=r.CommonUtil.compareNodeOrder(s,n);if(-2===d){u=!1;var c=new l.DOMWalker(s);for(c.node=n;!u&&c.nextNode();)u="#text"===c.node.nodeName.toLowerCase()&&c.node.nodeValue.trim().length>0||"span"===c.node.nodeName.toLowerCase()&&c.node.textContent.trim().length>0;if(!u)return(0,a.RuleFail)("Fail_1")}else if(1!=d)return(0,a.RuleFail)("Fail_2");return(0,a.RulePass)("Pass_0")}}},8550(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_label_before=void 0;var a=i(461),n=i(461),l=i(7139);t.input_label_before={id:"input_label_before",context:"dom:input, dom:textarea, dom:select",refactor:{WCAG20_Input_LabelBefore:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_0:"input_label_before.html",Fail_1:"input_label_before.html",Fail_2:"input_label_before.html",group:"input_label_before.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Text input is nested in label such that input precedes the label text",Fail_2:"Label text is located after its associated text input or <select> element",group:"Text inputs and <select> elements must have a label before the input control"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.3.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if("input"==n.nodeName.toLowerCase()&&n.hasAttribute("type")){var r=n.getAttribute("type").toLowerCase();if("text"!=r&&"file"!=r&&"password"!=r)return null}var o=l.CommonUtil.getLabelForElementHidden(n,!0);if(null==o||!l.CommonUtil.hasInnerContentHidden(o))return null;var s=l.CommonUtil.compareNodeOrder(o,n);if(-2===s){var u=l.CommonUtil.getInnerText(n);if(u&&u.trim().length>0&&l.CommonUtil.getInnerText(n).trim()===u.trim())return null;for(var d=!1,c=n.previousSibling;!d&&null!==c;)d="#text"==c.nodeName.toLowerCase()&&c.nodeValue.trim().length>0||"span"==c.nodeName.toLowerCase()&&c.textContent.trim().length>0,c=c.previousSibling;if(!d)return(0,a.RuleFail)("Fail_1")}else if(-1!=s)return(0,a.RuleFail)("Fail_2");return(0,a.RulePass)("Pass_0")}}},8853(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_label_exists=void 0;var a=i(461),n=i(461),l=i(7011),r=i(3946),o=i(1950);t.input_label_exists={id:"input_label_exists",context:"aria:button,aria:checkbox,aria:combobox,aria:listbox,aria:menuitemcheckbox,aria:menuitemradio,aria:radio,aria:searchbox,aria:slider,aria:spinbutton,aria:switch,aria:textbox,aria:progressbar,dom:input[type=file],dom:output,dom:meter,dom:input[type=password]",refactor:{WCAG20_Input_ExplicitLabel:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_0:"input_label_exists.html",Fail_1:"input_label_exists.html",Fail_2:"input_label_exists.html",group:"input_label_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Form control element <{0}> has no associated label",Fail_2:'Form control with "{0}" role has no associated label',group:"Each form control must have an associated label"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:["97a4e1","e086e5"],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var s=n.nodeName.toLowerCase();if("datalist"===s)return null;var u="text";if("input"==s&&n.hasAttribute("type")?u=n.getAttribute("type").toLowerCase():("button"===s||l.AriaUtil.hasRoleInSemantics(n,"button"))&&(u="buttonelem"),"input"==s&&""==u&&(u="text"),"image"===u)return null;var d=o.AccNameUtil.computeAccessibleName(n);return d&&d.name&&d.name.trim().length>0?(0,a.RulePass)("Pass_0"):n.hasAttribute("role")&&n.getAttribute("role").trim().length>0?(0,a.RuleFail)("Fail_2",n.getAttribute("role").split(" ")):(0,a.RuleFail)("Fail_1",[s])}}},3180(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_label_visible=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(5279),s=i(3946),u=i(1686),d=i(1950);t.input_label_visible={id:"input_label_visible",context:"aria:button,aria:checkbox,aria:combobox,aria:listbox,aria:menuitemcheckbox,aria:menuitemradio,aria:radio,aria:searchbox,aria:slider,aria:spinbutton,aria:switch,aria:textbox",dependencies:["input_label_exists"],refactor:{WCAG20_Input_VisibleLabel:{Pass_0:"pass",Potential_1:"potential_no_label",potential_placeholder_only:"potential_placeholder_only"}},help:{"en-US":{pass:"input_label_visible.html",potential_placeholder_only:"input_label_visible.html",potential_no_label:"input_label_visible.html",group:"input_label_visible.html"}},messages:{"en-US":{pass:"The input element has an associated visible label",potential_placeholder_only:"The ‘placeholder’ is the only visible label",potential_no_label:"The input element does not have an associated visible label",group:"An input element must have an associated visible label"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.5.3","3.3.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,c=n.nodeName.toLowerCase();if("datalist"===c)return null;if(!s.VisUtil.isNodeVisible(n)||r.CommonUtil.isNodeDisabled(n))return null;if(r.CommonUtil.getAncestor(n,"table"))return null;var m=l.AriaUtil.getResolvedRole(n);if(m&&"button"===m&&"input"!==c&&"button"!==c&&!r.CommonUtil.getAncestor(n,"form"))return null;if(l.AriaUtil.getAncestorWithRole(n,"combobox")&&!(l.AriaUtil.hasRoleInSemantics(n,"textbox")||l.AriaUtil.hasRoleInSemantics(n,"searchbox")||"input"===c||"select"===c&&l.AriaUtil.hasRoleInSemantics(n,"combobox")))return null;for(var p=["listbox","tree","grid","dialog"],h=0;h<p.length;h++)if(l.AriaUtil.hasRoleInSemantics(n,p[h]))for(var g=r.CommonUtil.getElementsByRoleHidden(n.ownerDocument,"combobox",!0,!0),b=0;b<g.length;b++){var _=g[b],f=r.CommonUtil.getElementAttribute(_,"aria-owns");if(f)for(var v=r.CommonUtil.normalizeSpacing(f.trim()).split(" "),A=0;A<v.length;A++)if(o.FragmentUtil.getById(n,v[A])===n)return null}var w=d.AccNameUtil.computeAccessibleName(n);if(("input"===c||"button"===c)&&w&&w.name&&w.name.trim().length>0&&("label"===w.nameFrom||"internal"===w.nameFrom||"alt"===w.nameFrom))return(0,a.RulePass)("pass");if(w&&w.name&&w.name.trim().length>0&&("text"===w.nameFrom||"title"===w.nameFrom))return(0,a.RulePass)("pass");var y=r.CommonUtil.getOnScreenInnerText(n);if(y&&0!==y.length)return(0,a.RulePass)("pass");var C=l.AriaUtil.getAllDescendantsWithRoles(n,["img","graphics-document","graphics-object","graphics-symbol"],!1,!0);if(C&&C.length>0)for(var k=0;k<C.length;k++)if(r.CommonUtil.attributeNonEmpty(C[k],"title")||r.CommonUtil.attributeNonEmpty(C[k],"alt"))return(0,a.RulePass)("pass");if(r.CommonUtil.attributeNonEmpty(n,"aria-labelledby")){var R=n.getAttribute("aria-labelledby").split(/\s+/);for(h=0;h<R.length;++h){var x=o.FragmentUtil.getById(n,R[h]);if(x&&!u.DOMUtil.sameNode(x,n)&&s.VisUtil.isNodeVisible(x)&&r.CommonUtil.hasInnerContentHidden(x))return(0,a.RulePass)("pass")}}if(("optgroup"===c||"option"==c)&&w&&w.name&&w.name.trim().length>0&&("label"===w.nameFrom||"content"===w.nameFrom))return(0,a.RulePass)("pass");var P=n.getAttribute("id");return P&&P.trim().length>0&&n.ownerDocument.querySelector("*[aria-controls='".concat(P,"'][role='combobox']"))?null:r.CommonUtil.attributeNonEmpty(n,"placeholder")?(0,a.RulePotential)("potential_placeholder_only"):(0,a.RulePotential)("potential_no_label")}}},1382(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_onchange_review=void 0;var a=i(461),n=i(461);t.input_onchange_review={id:"input_onchange_review",context:"dom:input[onchange], dom:textarea[onchange], dom:select[onchange]",refactor:{WCAG20_Input_HasOnchange:{Potential_1:"potential_warning"}},help:{"en-US":{potential_warning:"input_onchange_review.html",group:"input_onchange_review.html"}},messages:{"en-US":{group:"Users must be advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs",potential_warning:"Confirm that the user is advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.2.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if("input"==n.nodeName.toLowerCase()&&n.hasAttribute("type")){var l=n.getAttribute("type").toLowerCase();if("hidden"===l||"submit"===l||"image"===l||"button"===l||"reset"===l)return null}return(0,a.RulePotential)("potential_warning")}}},953(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_placeholder_label_visible=void 0;var a=i(461);t.input_placeholder_label_visible={id:"input_placeholder_label_visible",context:"dom:input[placeholder], dom:textarea[placeholder]",refactor:{HAAC_Input_Placeholder:{Pass_0:"Pass_0",Potential_1:"Potential_1",Potential_2:"Potential_2"}},help:{"en-US":{Pass_0:"input_placeholder_label_visible.html",Potential_1:"input_placeholder_label_visible.html",Potential_2:"input_placeholder_label_visible.html",group:"input_placeholder_label_visible.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"HTML5 placeholder is the only visible label",Potential_2:"Additional visible label referenced by 'aria-labelledby' is not valid",group:"HTML5 'placeholder' attribute must not be used as a visible label replacement"}},rulesets:[],act:[],run:function(e,t,i){var n=e.dom.node;if(n.hasAttribute("type")){var l=n.getAttribute("type").toLowerCase();if("hidden"==l||"button"==l)return(0,a.RulePass)("Pass_0")}if(n.hasAttribute("hidden")){var r=n.getAttribute("hidden");if(""==r||"hidden"==r.toLowerCase())return(0,a.RulePass)("Pass_0")}if(n.hasAttribute("aria-label"))return(0,a.RulePotential)("Potential_1");if(n.hasAttribute("aria-labelledby")&&n.hasAttribute("id")){var o=n.getAttribute("id").trim();return n.getAttribute("aria-labelledby").trim().split(/\s+/).includes(o)?(0,a.RulePotential)("Potential_2"):(0,a.RulePass)("Pass_0")}return(0,a.RulePass)("Pass_0")}}},2222(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.label_content_exists=void 0;var a=i(461),n=i(461),l=i(7139),r=i(5279),o=i(1686);t.label_content_exists={id:"label_content_exists",context:"dom:label",refactor:{Valerie_Label_HasContent:{Pass_Regular:"Pass_Regular",Pass_AriaLabel:"Pass_AriaLabel",Pass_LabelledBy:"Pass_LabelledBy",Fail_1:"Fail_1"}},help:{"en-US":{Pass_Regular:"label_content_exists.html",Pass_AriaLabel:"label_content_exists.html",Pass_LabelledBy:"label_content_exists.html",Fail_1:"label_content_exists.html",group:"label_content_exists.html"}},messages:{"en-US":{Pass_Regular:"<label> element has accessible name with inner content",Pass_AriaLabel:"<label> element has accessible name via 'aria-label'",Pass_LabelledBy:"<label> element has accessible name via 'aria-labelledby'",Fail_1:"The <label> element does not have descriptive text that identifies the expected input",group:"A <label> element must have non-empty descriptive text that identifies the purpose of the interactive component"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.CommonUtil.hasInnerContentHidden(n))return(0,a.RulePass)("Pass_Regular");if((n.getAttribute("aria-label")||"").trim().length>0)return(0,a.RulePass)("Pass_AriaLabel");if(n.hasAttribute("aria-labelledby")){var s=r.FragmentUtil.getById(n,n.getAttribute("aria-labelledby"));if(s&&!o.DOMUtil.sameNode(s,n)&&l.CommonUtil.hasInnerContent(s))return(0,a.RulePass)("Pass_LabelledBy")}return(0,a.RuleFail)("Fail_1")}}},4678(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.label_name_visible=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(5279),s=i(3946),u=i(4919),d=i(3864);t.label_name_visible={id:"label_name_visible",context:"aria:button,aria:checkbox,aria:gridcell,aria:link,aria:menuitem,aria:menuitemcheckbox,aria:menuitemradio,aria:option,aria:radio,aria:switch,aria:tab,aria:treeitem,dom:input,dom:textarea,dom:select,dom:output,dom:meter",refactor:{WCAG21_Label_Accessible:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"label_name_visible.html",Fail_1:"label_name_visible.html",group:"label_name_visible.html"}},messages:{"en-US":{Pass_0:"Accessible name matches or contains the visible label text",Fail_1:"Accessible name does not match or contain the visible label text",group:"Accessible name must match or contain the visible label text"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_2"],num:["2.5.3"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:"2ee8b8",run:function(e,t,i){var n=e.dom.node;if(!s.VisUtil.isNodeVisible(n)||r.CommonUtil.isNodeDisabled(n))return null;if(u.CSSUtil.isMaterialIconFont(n))return(0,a.RulePass)("Pass_0");var c=!0,m=n.nodeName.toLowerCase(),p=!1,h=null;"input"===m&&n.hasAttribute("type")&&(h=n.getAttribute("type").toLowerCase(),-1!==r.CommonUtil.form_button_types.indexOf(h)&&(p=!0));var g=l.AriaUtil.getAriaAttribute(n,"aria-labelledby");if(!g||r.CommonUtil.isIdReferToSelf(n,g)||p){var b=null;if(g&&!r.CommonUtil.isIdReferToSelf(n,g))for(var _=g.split(/\s+/),f=0;f<_.length;++f){var v=o.FragmentUtil.getById(n,_[f]);if(v){b=r.CommonUtil.getInnerText(v);break}}else b=l.AriaUtil.getAriaAttribute(n,"aria-label");if(!b)return null;var A=null;if(p&&(n.hasAttribute("value")?A=n.getAttribute("value"):"submit"===h?A="submit":"reset"===h&&(A="reset")),!A){var w=r.CommonUtil.getLabelForElementHidden(n,!0);if(!w){var y=d.DOMWalker.parentNode(n);if("label"===y.nodeName.toLowerCase()){var C=y.cloneNode(!0);w=r.CommonUtil.removeAllFormElementsFromLabel(C)}}var k=w||n;A=w||-1===["meter","output","progress","select","textarea"].indexOf(m)?r.CommonUtil.getOnScreenInnerText(k):""}var R=/[^a-zA-Z0-9]/g;A=A.replace(R," ");var x=r.CommonUtil.normalizeSpacing(A).toLowerCase();b=b.replace(R," ");var P=r.CommonUtil.normalizeSpacing(b).toLowerCase();if(x.length>1){var T=P.indexOf(x);if(T>=0&&P.length>x.length){var U=/^[0-9a-zA-Z]+$/;T+x.length<P.length&&P.charAt(T+x.length).match(U)&&(c=!1),c&&T>0&&P.charAt(T-1).match(U)&&(c=!1)}-1===T&&(c=!1)}}return c?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},7578(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.label_ref_valid=void 0;var a=i(461),n=i(461),l=i(5279),r=i(3946);t.label_ref_valid={id:"label_ref_valid",context:"dom:label[for]",refactor:{WCAG20_Label_RefValid:{Pass_0:"pass",Fail_1:"fail_invalid"}},help:{"en-US":{pass:"label_ref_valid.html",fail_invalid:"label_ref_valid.html",group:"label_ref_valid.html"}},messages:{"en-US":{pass:"The 'for' attribute for a label referencea a unique non-empty 'id' attribute of a valid element",fail_invalid:"The value \"{0}\" of the 'for' attribute is not the 'id' of a valid element",group:"The 'for' attribute for a label should reference a non-empty, unique 'id' attribute of a valid element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,o=n.getAttribute("for"),s=!1,u=l.FragmentUtil.getById(n,o);if(u){if(!r.VisUtil.isNodeVisible(u)&&!r.VisUtil.isNodeVisible(n))return null;if(s=!0,!u.hasAttribute("role")){var d=u.nodeName.toLowerCase();if(s="input"==d||"select"==d||"textarea"==d||"button"==d||"datalist"==d||"optgroup"==d||"option"==d||"keygen"==d||"output"==d||"progress"==d||"meter"==d||"fieldset"==d||"legend"==d,"input"==u.nodeName.toLowerCase()&&u.hasAttribute("type")){var c=u.getAttribute("type").toLowerCase();s="text"==c||"password"==c||"file"==c||"checkbox"==c||"radio"==c||"hidden"==c||"search"==c||"tel"==c||"url"==c||"email"==c||"date"==c||"number"==c||"range"==c||"image"==c||"time"==c||"color"==c||"datetime-local"==c||"month"==c||"week"==c}}s&&!r.VisUtil.isNodeVisible(u)&&(s=!1)}var m=[];return s||m.push(o),s?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_invalid",m)}}},9964(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.list_children_valid=void 0;var a=i(461),n=i(461),l=i(7011),r=i(3864);t.list_children_valid={id:"list_children_valid",context:"aria:group",refactor:{HAAC_List_Group_ListItem:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"list_children_valid.html",Fail_1:"list_children_valid.html",group:"list_children_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'List component with "group" role has children that are not <listitem> elements',group:'List component with "group" role must limit children to <listitem> elements'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,o=r.DOMWalker.parentElement(n);if(!l.AriaUtil.hasRoleInSemantics(o,"list"))return null;for(var s=!0,u=n.children,d=0;s&&d<u.length;d++)s=l.AriaUtil.hasRoleInSemantics(u[d],"listitem");return s?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},6401(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.list_markup_review=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(3864),s=i(3946);t.list_markup_review={id:"list_markup_review",context:"dom:*",refactor:{RPT_List_UseMarkup:{Potential_1:"Potential_1"}},help:{"en-US":{potential_list:"list_markup_review.html",group:"list_markup_review.html"}},messages:{"en-US":{potential_list:"Verify this is a list and if so, modify to use proper HTML elements for the list",group:"Proper HTML elements should be used to create a list"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,u=n.nodeName.toLowerCase();if(r.CommonUtil.isNodeDisabled(n)||s.VisUtil.hiddenByDefaultElements.includes(u))return null;if(null===r.CommonUtil.getAncestor(n,["body"]))return null;if(null!==r.CommonUtil.getAncestor(n,["script","label"]))return null;var d=l.AriaUtil.getRolesWithTypes(n,["widget"]);if(r.CommonUtil.concatUniqueArrayItemList(["caption","code","columnheader","figure","list","listitem","math","meter","columnheader","rowheader"],d),null!==l.AriaUtil.getAncestorWithRoles(n,d))return null;for(var c=!0,m=n.firstChild;c&&m;){if("#text"==m.nodeName){var p=m.nodeValue;if(!(c=!/^[ \t\r\n]*[( ]*[1-9]*[\*\-).][ \t][A-Z,a-z]+/.test(p)))for(var h=new o.DOMWalker(m);!c&&h.prevNode();){var g=h.node.nodeName.toLowerCase();if(["blockquote","center","dir","div","form","h1","h2","h3","h4","h5","h6","hr","br","menu","p","pre"].includes(g))break;if("#text"==g){var b=h.node.nodeValue;c=b.length>0&&![" ","\t","\n"].includes(b.charAt(b.length-1))}}}m=m.nextSibling}return c?null:c?void 0:(0,a.RulePotential)("potential_list")}}},1174(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.list_structure_proper=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139);t.list_structure_proper={id:"list_structure_proper",context:"dom:dl, dom:ul, dom:ol, dom:dir, dom:menu, dom:li, dom:dd, dom:dt",refactor:{RPT_List_Misuse:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"list_structure_proper.html",Potential_1:"list_structure_proper.html",group:"list_structure_proper.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"List element is missing or improperly structured",group:"List elements should only be used for lists of related items"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n,o=e.dom.node,s=o.nodeName.toLowerCase();if(o.children,"dl"==s){var u="",d="",c=o.firstChild;n=!0;var m=!1;if(o.children&&0!=o.children.length){for(;n&&null!=c;){if(1==c.nodeType){var p=c.nodeName.toLowerCase();if(l.AriaUtil.isPresentationalElement(c)){m=!0,c=c.nextSibling;continue}n="dd"==p||"dt"==p,""==u&&(u=p),d=p}c=c.nextSibling}n=n&&"dt"==u&&"dd"==d||n&&m}else n=!0}else if("li"==s)n=null!=r.CommonUtil.getAncestor(o,["ul","ol","dir","menu"]);else if("dd"==s||"dt"==s)n=null!=r.CommonUtil.getAncestor(o,"dl");else if(c=o.firstChild,"ul"!=s&&"ol"!=s&&"menu"!=s||o.children&&0!=o.children.length){var h=!1;for(m=!1,n=!0;n&&null!=c;)l.AriaUtil.isPresentationalElement(c)?(m=!0,c=c.nextSibling):(n=1!=c.nodeType||"li"==c.nodeName.toLowerCase()||"template"==c.nodeName.toLowerCase()&&("ul"==s||"ol"==s),h=h||1==c.nodeType&&"li"==c.nodeName.toLowerCase(),c=c.nextSibling);n=n&&h||n&&m}else n=!0;return n?(0,a.RulePass)("Pass_0"):n?void 0:(0,a.RulePotential)("Potential_1")}}},9907(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.marquee_elem_avoid=void 0;var a=i(461),n=i(461);t.marquee_elem_avoid={id:"marquee_elem_avoid",context:"dom:marquee",refactor:{RPT_Marquee_Trigger:{Fail_1:"Fail_1"}},help:{"en-US":{Fail_1:"marquee_elem_avoid.html",group:"marquee_elem_avoid.html"}},messages:{"en-US":{Fail_1:"Scrolling content found that uses the obsolete <marquee> element",group:"The <marquee> element is obsolete and should not be used"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.2.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){return e.dom.node,(0,a.RuleFail)("Fail_1")}}},6032(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.media_alt_brief=void 0;var a=i(461),n=i(461),l=i(3946);t.media_alt_brief={id:"media_alt_brief",context:"dom:img[alt], dom:applet[alt], dom:area[alt], dom:embed[alt], dom:input[type][alt]",refactor:{RPT_Media_AltBrief:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"media_alt_brief.html",Potential_1:"media_alt_brief.html",group:"media_alt_brief.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Text alternative is more than 150 characters",group:"Alternative text in 'alt' attribute should be brief (<150 characters)"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var r=n.getAttribute("alt").trim().length<=150;return r?(0,a.RulePass)("Pass_0"):r?void 0:(0,a.RulePotential)("Potential_1")}}},5622(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.media_alt_exists=void 0;var a=i(461),n=i(461),l=i(7139),r=i(3946);t.media_alt_exists={id:"media_alt_exists",context:"dom:area[alt], dom:embed[alt]",refactor:{RPT_Media_AudioVideoAltFilename:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"media_alt_exists.html",Potential_1:"media_alt_exists.html",group:"media_alt_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Filename used as label for embedded audio or video",group:"Audio or video on the page must have a short text alternative that describes the media content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var o="";null==(o="area"==n.nodeName.toLowerCase()?n.getAttribute("href"):n.getAttribute("src"))&&(o="");var s=l.CommonUtil.getFileExt(o),u=0!=s.length&&(l.CommonUtil.isAudioExt(s)||l.CommonUtil.isVideoExt(s)),d=n.getAttribute("alt"),c=!u||d.length>0&&-1==d.indexOf(s);return c?(0,a.RulePass)("Pass_0"):c?void 0:(0,a.RulePotential)("Potential_1")}}},2240(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.media_audio_transcribed=void 0;var a=i(461),n=i(461),l=i(7139),r=i(3946);t.media_audio_transcribed={id:"media_audio_transcribed",context:"dom:bgsound, dom:a[href], dom:area[href], dom:embed, dom:object",refactor:{RPT_Media_AudioTrigger:{Manual_1:"Manual_1"}},help:{"en-US":{Manual_1:"media_audio_transcribed.html",group:"media_audio_transcribed.html"}},messages:{"en-US":{Manual_1:"Provide transcripts for audio files",group:"Audio information should also be available in text form"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.2.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n,o=e.dom.node;return r.VisUtil.isNodeHiddenFromAT(o)||(n="bgsound"!=o.nodeName.toLowerCase()&&!l.CommonUtil.isAudioObjEmbedLink(o))?null:n?void 0:(0,a.RuleManual)("Manual_1")}}},4019(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.media_autostart_controllable=void 0;var a=i(461),n=i(461);t.media_autostart_controllable={id:"media_autostart_controllable",context:"dom:param[name=autoplay], dom:param[name=autostart], dom:embed[flashvars], dom:embed[src], dom:*[autostart=true], dom:*[autostart=1], dom:bgsound",refactor:{RPT_Embed_AutoStart:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"media_autostart_controllable.html",Potential_1:"media_autostart_controllable.html",group:"media_autostart_controllable.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify there is a mechanism to pause or stop and control the volume for the audio that plays automatically",group:"Mechanism must be available to pause or stop and control the volume of the audio that plays automatically"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.4.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n,l=e.dom.node,r=l.nodeName.toLowerCase();if("bgsound"==r)n=!1;else if("param"==r){var o="";l.hasAttribute("value")&&(o=l.getAttribute("value").toLowerCase()),n=0==o.indexOf("0;")||!(-1!=o.indexOf("true")||-1!=o.indexOf("1"))}else if("embed"==r){var s;n=!0,l.hasAttribute("flashvars")&&(n=-1==(s=l.getAttribute("flashvars")).indexOf("autostart=true")&&-1==s.indexOf("autostart=1")),n&&l.hasAttribute("src")&&(n=-1==(s=l.getAttribute("src")).indexOf("autostart=true")&&-1==s.indexOf("autostart=1"))}if(n&&l.hasAttribute("autostart")){var u=l.getAttribute("autostart").toLowerCase();n="true"!=u&&"1"!=u}return n?(0,a.RulePass)("Pass_0"):(0,a.RulePotential)("Potential_1")}}},361(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.media_keyboard_controllable=void 0;var a=i(461),n=i(461),l=i(3946);t.media_keyboard_controllable={id:"media_keyboard_controllable",context:"dom:audio, dom:video",refactor:{HAAC_Audio_Video_Trigger:{Pass_0:"Pass_0",Manual_1:"Manual_1"}},help:{"en-US":{Pass_0:"media_keyboard_controllable.html",Manual_1:"media_keyboard_controllable.html",group:"media_keyboard_controllable.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Manual_1:"Verify media using <audio> and/or <video> elements have keyboard accessible controls",group:"Media using <audio> and/or <video> elements must have keyboard accessible controls"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var r=!0,o=n.nodeName.toLowerCase();return"audio"!=o&&"video"!==o||(r=!1),r?(0,a.RulePass)("Pass_0"):(0,a.RuleManual)("Manual_1")}}},5960(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.media_live_captioned=void 0;var a=i(461),n=i(461),l=i(7139);t.media_live_captioned={id:"media_live_captioned",context:"dom:embed, dom:object",refactor:{RPT_Media_VideoObjectTrigger:{Manual_1:"Manual_1"}},help:{"en-US":{Manual_1:"media_live_captioned.html",group:"media_live_captioned.html"}},messages:{"en-US":{Manual_1:"Verify captions are provided for live media (streaming video with audio)",group:"Live media (streaming video with audio) should have captions for audio content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.2.4"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,r=!l.CommonUtil.isVideoObjEmbedLink(n);return r?null:r?void 0:(0,a.RuleManual)("Manual_1")}}},5515(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.media_track_available=void 0;var a=i(461),n=i(461),l=i(7139),r=i(3946);t.media_track_available={id:"media_track_available",context:"dom:a[href], dom:area[href], dom:applet, dom:embed, dom:object",refactor:{RPT_Media_VideoReferenceTrigger:{Manual_1:"Manual_1"}},help:{"en-US":{Manual_1:"media_track_available.html",group:"media_track_available.html"}},messages:{"en-US":{Manual_1:"Verify availability of a user-selectable audio track with description of visual content",group:"Pre-recorded media should have an audio track that describes visual information"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.2.3","1.2.5"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var o;return(o="applet"!=n.nodeName.toLowerCase()&&!l.CommonUtil.isVideoObjEmbedLink(n))?null:o?void 0:(0,a.RuleManual)("Manual_1")}}},8752(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.meta_redirect_optional=void 0;var a=i(461),n=i(461),l=i(4566);t.meta_redirect_optional={id:"meta_redirect_optional",context:"dom:meta[http-equiv][content]",refactor:{WCAG20_Meta_RedirectZero:{pass:"pass",fail:"fail",fail_longrefresh:"fail_longrefresh"}},help:{"en-US":{group:"meta_redirect_optional.html",pass:"meta_redirect_optional.html",fail:"meta_redirect_optional.html",fail_longrefresh:"meta_redirect_optional.html"}},messages:{"en-US":{group:"Page should not automatically refresh without warning or option to turn it off or adjust the time limit",pass:"Rule Passed",fail:"Check page does not automatically refresh without warning or options",fail_longrefresh:"Check page does not automatically refresh without warning or options"}},rulesets:[{id:[],num:["2.2.4","3.2.5"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:["bisz58"],run:function(e,t,i){var n=e.dom.node;if("refresh"!==n.getAttribute("http-equiv").toLowerCase())return null;var r=n.ownerDocument;if(r){if(l.CacheUtil.getCache(r,"meta_redirect_optional_done",!1))return null;var o=n.getAttribute("content").toLowerCase();if(!o||0===o.trim().length)return null;var s=-1;if(o.match(/^\d+$/))s=parseInt(o);else if(o.match(/^\d+;/)){var u=o.indexOf(";");s=parseInt(o.substring(0,u))}return-1===s?null:(l.CacheUtil.setCache(r,"meta_redirect_optional_done",!0),0===s?(0,a.RulePass)("pass"):s<72001?(0,a.RuleFail)("fail"):(0,a.RuleFail)("fail_longrefresh"))}}}},8834(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.meta_refresh_delay=void 0;var a=i(461),n=i(461),l=i(4566);t.meta_refresh_delay={id:"meta_refresh_delay",context:"dom:meta[http-equiv][content]",refactor:{RPT_Meta_Refresh:{Pass_0:"pass",Potential_1:"potential_refresh"}},help:{"en-US":{group:"meta_refresh_delay.html",pass:"meta_refresh_delay.html",potential_refresh:"meta_refresh_delay.html"}},messages:{"en-US":{group:"Pages should not refresh automatically",pass:"Pages do not refresh automatically",potential_refresh:"Verify page is not being caused to refresh automatically"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.2.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:["bc659a"],run:function(e,t,i){var n=e.dom.node;if("refresh"!==n.getAttribute("http-equiv").toLowerCase())return null;var r=n.ownerDocument;if(r){if(l.CacheUtil.getCache(r,"meta_refresh_delay_done",!1))return null;var o=n.getAttribute("content").toLowerCase();if(!o||0===o.trim().length)return null;var s=-1;if(o.match(/^\d+$/))s=parseInt(o);else if(o.match(/^\d+;/)){var u=o.indexOf(";");s=parseInt(o.substring(0,u))}return-1===s?null:(l.CacheUtil.setCache(r,"meta_refresh_delay_done",!0),0===s?(0,a.RulePass)("pass"):(0,a.RulePotential)("potential_refresh"))}}}},1025(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.meta_viewport_zoomable=void 0;var a=i(461),n=i(461);t.meta_viewport_zoomable={id:"meta_viewport_zoomable",context:"dom:meta[name][content]",refactor:{meta_viewport_zoom:{Pass_0:"pass",Potential_1:"potential_zoomable"}},help:{"en-US":{group:"meta_viewport_zoomable.html",pass:"meta_viewport_zoomable.html",potential_zoomable:"meta_viewport_zoomable.html"}},messages:{"en-US":{group:"The 'meta[name=viewport]' should not prevent the browser zooming the content",pass:"The 'meta[name=viewport]' does not prevent the browser zooming the content",potential_zoomable:"Confirm the 'meta[name=viewport]' with \"{0}\" can be zoomed by user"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.4.4"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[{b4f0c3:{pass:"pass",potential_zoomable:"fail"}}],run:function(e,t,i){var n=e.dom.node;if("viewport"!==n.getAttribute("name").toLowerCase())return null;var l=n.getAttribute("content").toLowerCase();if(!l||""===l.trim()||!l.includes("maximum-scale")&&!l.includes("user-scalable"))return null;for(var r=null,o=null,s="yes",u="2.0",d=0,c=l.split(",");d<c.length;d++){var m=c[d],p=m.trim().split("=");p.length<2||(m.includes("user-scalable")?(r=m,((s=p[1].trim()).startsWith("'")||s.startsWith('"'))&&(s=s.substring(1,s.length-1))):m.includes("maximum-scale")&&(o=m,((u=p[1].trim()).startsWith("'")||u.startsWith('"'))&&(u=u.substring(1,u.length-1).trim())))}var h=Number(s);isNaN(h)||(h>=1||h<=-1)&&(s="yes");var g;return h=Number(u),g=isNaN(h)?"yes"===u?1:.1:h<0?2:h,"yes"!==s?(0,a.RulePotential)("potential_zoomable",[r]):g<2?(0,a.RulePotential)("potential_zoomable",[o]):(0,a.RulePass)("pass")}}},9116(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.noembed_content_exists=void 0;var a=i(461),n=i(461),l=i(7139),r=i(3946);t.noembed_content_exists={id:"noembed_content_exists",context:"dom:noembed",refactor:{Valerie_Noembed_HasContent:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"noembed_content_exists.html",Potential_1:"noembed_content_exists.html",group:"noembed_content_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Add descriptive text to the <noembed> element",group:"<noembed> elements should contain descriptive text"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_FOUR}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var o=l.CommonUtil.hasInnerContentHidden(n);return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},435(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.object_text_exists=void 0;var a=i(461),n=i(461),l=i(3946),r=i(1950);t.object_text_exists={id:"object_text_exists",context:"dom:object",refactor:{WCAG20_Object_HasText:{pass:"pass",fail_no_text_alternative:"fail_no_text_alternative"}},help:{"en-US":{group:"object_text_exists.html",pass:"object_text_exists.html",fail_no_text_alternative:"object_text_exists.html"}},messages:{"en-US":{group:"<object> element must have a text alternative for the content rendered by the object",pass:"<object> element has a text alternative",fail_no_text_alternative:"An <object> element does not have a text alternative"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:"8fc3b6",run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;if(n.hasAttribute("type")&&-1!==n.getAttribute("type").indexOf("text"))return null;if(n.getAttribute("role"))return null;var o=n.getAttribute("data"),s=o&&"string"==typeof o?o.substring(o.lastIndexOf(".")):"";if(".html"===s||".htm"===s)return null;var u=r.AccNameUtil.computeAccessibleName(n);return u&&u.name&&u.name.trim().length>0?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_no_text_alternative")}}},6640(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.page_title_exists=void 0;var a=i(461),n=i(461),l=i(7139),r=i(6858);t.page_title_exists={id:"page_title_exists",context:"dom:html",refactor:{WCAG20_Doc_HasTitle:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{group:"page_title_exists.html",Pass_0:"page_title_exists.html",Fail_1:"page_title_exists.html",Fail_2:"page_title_exists.html",Fail_3:"page_title_exists.html"}},messages:{"en-US":{group:"The page should have a title that correctly identifies the subject of the page",Pass_0:"Rule Passed",Fail_1:"Missing <head> element so there can be no <title> element present",Fail_2:"Missing <title> element in <head> element",Fail_3:"The <title> element is empty (no innerHTML)"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[{"2779a5":{Pass_0:"pass",Fail_1:"pass",Fail_2:"fail",Fail_3:"fail"}}],run:function(e,t,i){if(r.AncestorUtil.isFrame(i))return null;for(var n=e.dom.node,o=n.firstChild,s=null;null!=o&&"head"!=o.nodeName.toLowerCase();)o=o.nextSibling;for(var u=n.querySelectorAll("title"),d=0;d<u.length;++d)if(!l.CommonUtil.getAncestor(u[d],["svg"])){s=u[d];break}return null!==o||s?null===s?(0,a.RuleFail)("Fail_2"):null!=s&&l.CommonUtil.getInnerText(s).trim().length>0?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_3"):(0,a.RuleFail)("Fail_1")}}},2068(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.page_title_valid=void 0;var a=i(461),n=i(461),l=i(7139);t.page_title_valid={id:"page_title_valid",context:"dom:head dom:title",refactor:{RPT_Title_Valid:{Pass_0:"Pass_0",Potential_2:"Potential_2"}},help:{"en-US":{Pass_0:"page_title_valid.html",Potential_2:"page_title_valid.html",group:"page_title_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_2:"Verify that using the filename as the page <title> value is descriptive",group:"Page <title> should be a descriptive title, rather than a filename"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,r=l.CommonUtil.getInnerText(n).trim(),o=r.toLowerCase();return o.includes(".com")||o.includes(".net")||o.includes(".org")?(0,a.RulePass)("Pass_0",[r]):0===r.length?null:/^\S*\.[a-zA-Z]{1,4}(?!.)|^https?:\/\/\S*/i.test(r)?(0,a.RulePotential)("Potential_2"):(0,a.RulePass)("Pass_0",[r])}}},7322(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.script_focus_blur_review=void 0;var a=i(461),n=i(461);t.script_focus_blur_review={id:"script_focus_blur_review",context:"dom:*[onfocus]",refactor:{WCAG20_Script_FocusBlurs:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"script_focus_blur_review.html",Potential_1:"script_focus_blur_review.html",group:"script_focus_blur_review.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify script does not remove focus from content that normally receives focus",group:"Scripting must not remove focus from content that normally receives focus"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1","2.4.7","3.2.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=-1==e.dom.node.getAttribute("onfocus").indexOf(".blur(");return n?(0,a.RulePass)("Pass_0"):n?void 0:(0,a.RulePotential)("Potential_1")}}},5702(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.script_onclick_avoid=void 0;var a=i(461),n=i(461),l=i(7139);t.script_onclick_avoid={id:"script_onclick_avoid",context:"dom:*[onclick]",dependencies:["script_onclick_misuse"],refactor:{RPT_Script_OnclickHTML2:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"script_onclick_avoid.html",Potential_1:"script_onclick_avoid.html",group:"script_onclick_avoid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that 'onclick' events are not used in script to emulate a link",group:"Scripts should not be used to emulate links"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_FOUR}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.CommonUtil.getAncestor(n,"svg"))return(0,a.RulePass)("Pass_0");if(l.CommonUtil.attributeNonEmpty(n,"role"))return(0,a.RulePass)("Pass_0");var r=n.nodeName.toLowerCase(),o="a"==r||"area"==r||"input"==r;return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},1961(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.script_onclick_misuse=void 0;var a=i(461),n=i(461),l=i(7139);t.script_onclick_misuse={id:"script_onclick_misuse",context:"dom:*[onclick]",refactor:{RPT_Script_OnclickHTML1:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"script_onclick_misuse.html",Potential_1:"script_onclick_misuse.html",group:"script_onclick_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Possible use of a script to emulate a link",group:"Scripts should not be used to emulate links"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,r=l.CommonUtil.attributeNonEmpty(n,"role"),o=n.nodeName.toLowerCase();if(!(r=r||("a"==o||"area"==o)&&l.CommonUtil.attributeNonEmpty(n,"href"))){var s=[".asp",".aspx",".cfm",".cfml",".cgi",".htm",".html",".shtm",".shtml",".php",".pl",".py",".shtm",".shtml",".xhtml","location.href"],u=n.getAttribute("onclick").toLowerCase();r=!0;for(var d=0;r&&d<s.length;++d)r=-1==u.indexOf(s[d])}return r?(0,a.RulePass)("Pass_0"):r?void 0:(0,a.RulePotential)("Potential_1")}}},3022(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.script_select_review=void 0;var a=i(461),n=i(461);t.script_select_review={id:"script_select_review",context:"dom:select",refactor:{WCAG20_Select_NoChangeAction:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"script_select_review.html",Potential_1:"script_select_review.html",group:"script_select_review.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that no change of context or action occurs when selection options in this component receive focus",group:"No changes of context should occur when a selection value receives focus"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.2.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,l=!n.hasAttribute("onchange")&&!n.hasAttribute("onfocus");return l?(0,a.RulePass)("Pass_0"):l?void 0:(0,a.RulePotential)("Potential_1")}}},375(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.select_options_grouped=void 0;var a=i(461),n=i(461),l=i(7139);t.select_options_grouped={id:"select_options_grouped",context:"dom:select",refactor:{WCAG20_Select_HasOptGroup:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"select_options_grouped.html",Potential_1:"select_options_grouped.html",group:"select_options_grouped.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Group of related options may need <optgroup>",group:"Groups of related options within a selection list should be grouped with <optgroup>"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,r=l.CommonUtil.getChildByTagHidden(n,"optgroup",!1,!0).length>0||l.CommonUtil.getChildByTagHidden(n,"option",!1,!0).length<=10;return r?(0,a.RulePass)("Pass_0"):r?void 0:(0,a.RulePotential)("Potential_1")}}},4658(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.skip_main_described=void 0;var a=i(461),n=i(461),l=i(7139),r=i(4566),o=i(3946);t.skip_main_described={id:"skip_main_described",context:"dom:body",dependencies:["skip_main_exists"],refactor:{WCAG20_Body_FirstAContainsSkipText_Native_Host_Sematics:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"skip_main_described.html",Potential_1:"skip_main_described.html",group:"skip_main_described.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that if this hyperlink skips content, the description communicates where it links to",group:"The description of a hyperlink used to skip content must communicate where it links to"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n,s={paramSkipText:{value:["skip","jump"],type:"[string]"}},u=e.dom.node,d=u.ownerDocument;if(null===r.CacheUtil.getCache(u,"IBM_hasLandmarks_Implicit",null)&&r.CacheUtil.setCache(u,"IBM_hasLandmarks_Implicit",l.CommonUtil.getElementsByRoleHidden(u.ownerDocument,["application","banner","complementary","contentinfo","form","main","navigation","search"],!0,!0).length>0),!(n=r.CacheUtil.getCache(u,"IBM_hasLandmarks_Implicit",!1))){var c=d.links;if(c&&c.length>0&&o.VisUtil.isNodeVisible(c[0]))for(var m=l.CommonUtil.getInnerText(d.links[0]).toLowerCase(),p=0;!n&&p<s.paramSkipText.value.length;++p)n=-1!=m.indexOf(s.paramSkipText.value[p]);else n=!1}return n?(0,a.RulePass)("Pass_0"):n?void 0:(0,a.RulePotential)("Potential_1")}}},4605(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.skip_main_exists=void 0;var a=i(461),n=i(461),l=i(7139),r=i(6858),o=i(4566),s=i(3946);t.skip_main_exists={id:"skip_main_exists",context:"dom:body",refactor:{WCAG20_Body_FirstASkips_Native_Host_Sematics:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"skip_main_exists.html",Fail_1:"skip_main_exists.html",group:"skip_main_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'The page does not provide a way to quickly navigate to the main content (ARIA "main" landmark or a skip link)',group:"Pages must provide a way to skip directly to the main content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){if(r.AncestorUtil.isPresentationFrame(i))return null;var n,u=e.dom.node,d=u.ownerDocument;if(null===o.CacheUtil.getCache(u,"IBM_hasLandmarks_Implicit",null)&&o.CacheUtil.setCache(u,"IBM_hasLandmarks_Implicit",l.CommonUtil.getElementsByRoleHidden(u.ownerDocument,["application","banner","complementary","contentinfo","form","main","navigation","search"],!0,!0).length>0),!(n=o.CacheUtil.getCache(u,"IBM_hasLandmarks_Implicit",!1))){for(var c=l.CommonUtil.getDocElementsByTag(u,"a"),m=null,p=0;p<c.length;++p)if(c[p].hasAttribute("href")&&s.VisUtil.isNodeVisible(c[p])){m=c[p];break}var h=null;if(null!=m){var g=m.getAttribute("href"),b=g.indexOf("#");-1!=b&&(h=g.substring(b+1))}if(null!=h)for(n=null!=d.getElementById(h),p=0;!n&&p<c.length;++p)!c[p].hasAttribute("href")&&c[p].hasAttribute("name")&&c[p].getAttribute("name")==h&&(n=!0)}return n?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},5294(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.style_background_decorative=void 0;var a=i(461),n=i(461),l=i(7139);t.style_background_decorative={id:"style_background_decorative",context:"dom:style, dom:*[style]",refactor:{RPT_Style_BackgroundImage:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"style_background_decorative.html",Potential_1:"style_background_decorative.html",group:"style_background_decorative.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify the CSS background image does not convey important information",group:"Images included by using CSS alone must not convey important information"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,r=n.nodeName.toLowerCase(),o=!0;if("link"===r&&n.hasAttribute("rel")&&"stylesheet"===n.getAttribute("rel").toLowerCase()&&(o=l.CommonUtil.triggerOnce(n,"style_background_decorative",!1)),o&&"style"===r||n.hasAttribute("style")){var s=("style"===r?l.CommonUtil.getInnerText(n):n.getAttribute("style")).match(/background:[^;]*/g);if(null!==s)for(var u=0;o&&u<s.length;++u)o=-1===s[u].indexOf("url(")}return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},3506(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.style_before_after_review=void 0;var a=i(461),n=i(461),l=i(4919);t.style_before_after_review={id:"style_before_after_review",context:"dom:style, dom:link",refactor:{WCAG20_Style_BeforeAfter:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{group:"style_before_after_review.html",Pass_0:"style_before_after_review.html",Potential_1:"style_before_after_review.html"}},messages:{"en-US":{group:"Do not use CSS '::before' and '::after' pseudo-elements to insert non-decorative content",Pass_0:"Rule Passed",Potential_1:"Verify the '::before' and '::after' pseudo-elements do not insert non-decorative content"}},rulesets:[{id:[],num:"1.3.1",level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,r=!0;if("style"===n.nodeName.toLowerCase()){for(var o=l.CSSUtil.getCSSStyle(n),s=0;r&&s<o.length;++s)o[s].selector&&(r=-1===o[s].selector.indexOf(":before")&&-1===o[s].selector.indexOf(":after")||!("content"in o[s].values)||0===o[s].values.content.trim().length||'""'===o[s].values.content.trim()||"''"===o[s].values.content.trim()||"none"===o[s].values.content.trim()||"attr(x)"===o[s].values.content.trim()||"attr(y)"===o[s].values.content.trim());if(r)for(var u=0;u<n.ownerDocument.styleSheets.length;u++)if((_=n.ownerDocument.styleSheets[u]).ownerNode===n)try{var d=_.cssRules?_.cssRules:_.rules;if(d)for(var c=0;r&&c<d.length;c++){var m=d[c],p=void 0;if(m.type&&4===m.type){if(v=m.cssRules)for(var h=0;r&&h<v.length;h++)null!==(w=v[h]).selectorText&&void 0!==w.selectorText&&(-1===(C=w.selectorText.toLowerCase()).indexOf(":before")&&-1===C.indexOf(":after")||(k=w.style.content)&&k.trim().length&&'""'!==k.trim()&&"''"!==k.trim()&&"none"!==k.trim()&&"attr(x)"!==k.trim()&&"attr(y)"!==k.trim()&&(r=!1))}else if(m.type&&3===m.type&&(p=m).styleSheet&&(f=p.styleSheet.cssRules?p.styleSheet.cssRules:p.styleSheet.rules))for(h=0;r&&h<f.length;h++){var g=f[h];if(g.type&&4===g.type){if(v=g.cssRules)for(var b=0;b<v.length;b++)null!==(w=v[b]).selectorText&&void 0!==w.selectorText&&(-1===(C=w.selectorText.toLowerCase()).indexOf(":before")&&-1===C.indexOf(":after")||(k=w.style.content)&&k.trim().length&&'""'!==k.trim()&&"''"!==k.trim()&&"none"!==k.trim()&&"attr(x)"!==k.trim()&&"attr(y)"!==k.trim()&&(r=!1))}else null!==g.selectorText&&void 0!==g.selectorText&&(-1===(C=g.selectorText.toLowerCase()).indexOf(":before")&&-1===C.indexOf(":after")||(k=g.style.content)&&k.trim().length&&'""'!==k.trim()&&"''"!==k.trim()&&"none"!==k.trim()&&"attr(x)"!==k.trim()&&"attr(y)"!==k.trim()&&(r=!1))}}}catch(e){}}if("link"===n.nodeName.toLowerCase()&&n.hasAttribute("rel")&&"stylesheet"===n.getAttribute("rel").toLowerCase()&&n.hasAttribute("href")&&0!==n.getAttribute("href").trim().length)for(u=0;u<n.ownerDocument.styleSheets.length;u++){var _;if((_=n.ownerDocument.styleSheets[u])&&_.ownerNode===n)try{var f;if(f=_.cssRules?_.cssRules:_.rules)for(h=0;r&&h<f.length;h++){var v,A=f[h];if(A.type&&4===A.type){if(v=A.cssRules)for(b=0;r&&b<v.length;b++){var w;if(null!==(w=v[b]).selectorText&&void 0!==w.selectorText){var y=w.selectorText.toLowerCase();-1===y.indexOf(":before")&&-1===y.indexOf(":after")||(k=w.style.content)&&k.trim().length&&'""'!==k.trim()&&"''"!==k.trim()&&"none"!==k.trim()&&"attr(x)"!==k.trim()&&"attr(y)"!==k.trim()&&(r=!1)}}}else if(null!==f[h].selectorText&&void 0!==f[h].selectorText){var C,k;-1===(C=f[h].selectorText.toLowerCase()).indexOf(":before")&&-1===C.indexOf(":after")||(k=f[h].style.content)&&k.trim().length&&'""'!==k.trim()&&"''"!==k.trim()&&"none"!==k.trim()&&"attr(x)"!==k.trim()&&"attr(y)"!==k.trim()&&(r=!1)}}}catch(e){}}return r?(0,a.RulePass)("Pass_0"):r?void 0:(0,a.RulePotential)("Potential_1")}}},7475(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.style_color_misuse=void 0;var a=i(7139),n=i(461),l=i(461),r=i(3864),o=i(4566);t.style_color_misuse={id:"style_color_misuse",context:"dom:style, dom:*[style], dom:font[color], dom:link",refactor:{RPT_Style_ColorSemantics1:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{group:"style_color_misuse.html",Pass_0:"style_color_misuse.html",Potential_1:"style_color_misuse.html"}},messages:{"en-US":{group:"Combine color and descriptive markup to convey information",Pass_0:"Rule Passed",Potential_1:"Verify color is not used as the only visual means of conveying information"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"1.4.1",level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var l=e.dom.node,s=l.nodeName.toLowerCase(),u="";if("style"===s){u=a.CommonUtil.getInnerText(l).toLowerCase();for(var d=0;d<l.ownerDocument.styleSheets.length;d++)if((_=l.ownerDocument.styleSheets[d])&&_.ownerNode===l)try{for(var c=_.cssRules?_.cssRules:_.rules,m=0;m<c.length;m++){var p=c[m],h=void 0;if(p.type&&3===p.type&&(h=p).styleSheet)for(var g=h.styleSheet.cssRules?h.styleSheet.cssRules:h.styleSheet.rules,b=0;b<g.length;b++)u+=g[b].cssText}}catch(e){}}else if(l.hasAttribute("style"))u=l.getAttribute("style").toLowerCase();else if("link"===s&&l.hasAttribute("rel")&&"stylesheet"===l.getAttribute("rel").toLowerCase()&&l.hasAttribute("href")&&0!==l.getAttribute("href").trim().length)for(d=0;d<l.ownerDocument.styleSheets.length;d++){var _;if((_=l.ownerDocument.styleSheets[d])&&_.ownerNode===l)try{var f=_.cssRules?_.cssRules:_.rules;for(b=0;b<f.length;b++)u+=f[b].cssText}catch(e){}}var v=!0,A=u.match(/\bbackground\b/i),w=u.replace(/-color/g,"").match(/\bcolor\b/i);if(l.hasAttribute("color")||w||A){var y={em:"",strong:"",cite:"",dfn:"",code:"",samp:"",kbd:"",var:"",abbr:"",acronym:""};if(!(v=s in y||null!==a.CommonUtil.getAncestor(l,y))&&l.hasChildNodes())for(var C=new r.DOMWalker(l);!v&&C.nextNode()&&C.node!==l;)v=C.node.nodeName.toLowerCase()in y}return v||(v=o.CacheUtil.getCache(l.ownerDocument,"style_color_misuse",!1),o.CacheUtil.setCache(l.ownerDocument,"style_color_misuse",!0)),v?(0,n.RulePass)("Pass_0"):v?void 0:(0,n.RulePotential)("Potential_1")}}},8064(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.style_focus_visible=void 0;var a=i(7139),n=i(461),l=i(461),r=i(4919),o=i(3883);t.style_focus_visible={id:"style_focus_visible",context:"dom:*",refactor:{RPT_Style_HinderFocus1:{Potential_1:"potential_focus_not_visible"}},help:{"en-US":{group:"style_focus_visible.html",potential_focus_not_visible:"style_focus_visible.html",pass_focus_visible:"style_focus_visible.html"}},messages:{"en-US":{group:"The keyboard focus indicator should be visible when default border or outline is modified by CSS",potential_focus_not_visible:"Check the keyboard focus indicator is visible when using CSS declaration for 'border' or 'outline'",pass_focus_visible:"The keyboard focus indicator is visible or is not changed from the browser default"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"2.4.7",level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l={skipNodes:{value:["table"],type:"[string]"},checkParams:{value:["border","border-width","border-style","border-top-width","border-right-width","border-bottom-width","border-left-width","border-top-color","border-right-color","border-bottom-color","border-left-color","border-top-style","border-right-style","border-bottom-style","border-left-style","outline","outline-width","outline-color","outline-style"],type:"[string]"}},s=e.dom.node;if(!a.CommonUtil.isTabbable(s)||l.skipNodes.value.includes(s.nodeName.toLowerCase()))return null;var u=r.CSSUtil.getDefinedStylesMultiple(s,null,["",":focus",":focus-visible",":focus-within"]),d=u[""],c=[];c.push(u[":focus"]),c.push(u[":focus-visible"]),c.push(u[":focus-within"]);var m=c[0];if(Object.keys(m).length>0){if(!((d["outline-width"]||d["outline-style"])&&"0px"!==d["outline-width"]&&"none"!==d["outline-style"]||m["outline-style"]&&"none"===m["outline-style"]))return(0,n.RulePass)("pass_focus_visible");var p=!1,h=0;for(var g in m)if(l.checkParams.value.includes(g)){var b=m[g],_=d[g];if(g.includes("style")){if(p="none"===b,_&&"none"!==b&&b===_)return(0,n.RulePotential)("potential_focus_not_visible")}else if(g.includes("width")){if(h++,"initial"===b?b="2px":"thin"===b?b="1px":"medium"===b?b="2px":"thick"===b&&(b="3px"),_&&("initial"===_?_="2px":"thin"===_?_="1px":"medium"===_?_="2px":"thick"===_&&(_="3px")),b=r.CSSUtil.getPixelsFromStyle(b,s),_=r.CSSUtil.getPixelsFromStyle(_,s),0==b||b<=_)return(0,n.RulePotential)("potential_focus_not_visible")}else if(g.includes("color")){h++;var f=o.ColorUtil.ColorCombo(s);if(null===f)continue;var v=f.bg;if(!v)continue;if("initial"===b&&(b="black"),_&&"initial"===_&&(_="black"),b=o.ColorUtil.Color(b),_=o.ColorUtil.Color(_),null===b||null===_)continue;var A=b.contrastRatio(v),w=_.contrastRatio(v);if(A<3||A<=w)return(0,n.RulePotential)("potential_focus_not_visible")}else if(h++,null!=_&&b===_)return(0,n.RulePotential)("potential_focus_not_visible")}if(p&&0===h)return(0,n.RulePotential)("potential_focus_not_visible")}else for(var y in d)if(l.checkParams.value.includes(y)&&"none"!==(_=d[y]))return(0,n.RulePotential)("potential_focus_not_visible");return(0,n.RulePass)("pass_focus_visible")}}},7942(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.style_highcontrast_visible=void 0;var a=i(461),n=i(461),l=i(4566);t.style_highcontrast_visible={id:"style_highcontrast_visible",context:"dom:style, dom:link, dom:*[style]",refactor:{RPT_Style_Trigger2:{Pass_0:"Pass_0",Manual_1:"Manual_1"}},help:{"en-US":{Pass_0:"style_highcontrast_visible.html",Manual_1:"style_highcontrast_visible.html",group:"style_highcontrast_visible.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Manual_1:"Confirm Windows high contrast mode is supported when using CSS to include, position or alter non-decorative content",group:"Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["1.1.1","1.3.2","1.4.11"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE},{id:["WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1","1.3.2","1.4.11"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,r=n.nodeName.toLowerCase();if("link"===r&&(!n.hasAttribute("rel")||"stylesheet"!==n.getAttribute("rel").toLowerCase()))return(0,a.RulePass)("Pass_0");if("style"!==r&&"link"!==r&&n.hasAttribute("style")&&0===n.getAttribute("style").trim().length)return(0,a.RulePass)("Pass_0");var o=l.CacheUtil.getCache(n.ownerDocument,"style_highcontrast_visible",!1);return l.CacheUtil.setCache(n.ownerDocument,"style_highcontrast_visible",!0),o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RuleManual)("Manual_1")}}},2219(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.style_hover_persistent=void 0;var a=i(461),n=i(461),l=i(7139);t.style_hover_persistent={id:"style_hover_persistent",context:"dom:style, dom:*[style], dom:*",help:{"en-US":{Pass_0:"style_hover_persistent.html",Pass_2:"style_hover_persistent.html",Potential_1:"style_hover_persistent.html",Potential_2:"style_hover_persistent.html",Potential_3:"style_hover_persistent.html",group:"style_hover_persistent.html"}},messages:{"en-US":{Pass_0:"the hover: pseudo-class is not used to display content",Pass_2:"content displayed via the :hover pseudo-class is the adjacent sibling of the trigger element",Potential_1:"Confirm the pointer can be positioned over the displayed element, not just the trigger",Potential_2:"Confirm the pointer can be positioned over all the information displayed on hover",Potential_3:"Confirm the margin style attribute has not prevented the pointer from hovering over the displayed element, not just the trigger",group:"The pointer should be able to move over content displayed on hover"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_2"],num:["1.4.13"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=!1,r=!1,o=!1,s=e.dom.node;if("style"===s.nodeName.toLowerCase()){l.CommonUtil.getInnerText(s).toLowerCase();for(var u=0;u<s.ownerDocument.styleSheets.length;++u){var d=s.ownerDocument.styleSheets[u];if(d&&d.ownerNode===s)try{for(var c=d.cssRules?d.cssRules:d.rules,m=0;m<c.length;m++){var p="",h=!1,g=!1,b="",_=!1,f=!1,v=!1,A=(c[m],c[m].cssText);if(A.match(/:hover/g)){p=A.split(":")[0];var w=A.substring(A.indexOf("+")+1);if(w=w.trim(),(A.match(/:hover \+/g)||A.match(/:hover\+/g))&&(h=!0,b=w.split(" ")[0]),A.match(/:hover \~/g)||A.match(/:hover\~/g)){g=!0;var y=A.substring(A.indexOf("~")+1);b=(y=y.trim()).split(" ")[0]}if(!h&&!g)return(0,a.RulePass)("Pass_0");if(b&&(I=w.indexOf("display:"))&&"none;"!==w.slice(I+8).trim().split(" ")[0]&&d&&d.ownerNode===s)try{for(var C=d.cssRules?d.cssRules:d.rules,k=0;k<C.length;k++){var R=c[k].cssText,x=b+" {",P=R.trim(),T=P.indexOf(x);if(P.slice(T).trim(),P.match(/margin/g)){if(!o)return o=!0,(0,a.RulePotential)("Potential_3")}else{var U=R.split(":")[0];if((U=U.split(" ")[0])===b&&R.match(/:hover/g)){var I;if(_=!0,I=R.indexOf("display:"))if(f=!0,"none;"!==w.slice(I+8).trim().split(" ")[0]){if(v=!0,""!==p&&h){var E=s.ownerDocument.getElementsByTagName(p.toUpperCase());if(b.toUpperCase()===E[0].nextElementSibling.tagName){n=!0;continue}}else if(h){if(!r){r=!0;break}continue}if(""!==p&&g){E=s.ownerDocument.getElementsByTagName(p.toUpperCase());var N=[],L=E[0].nextElementSibling;do{if(L.tagName!==b.toUpperCase())break;N.push(L)}while(L=L.nextElementSibling);var S=N.length;if(1===S)return(0,a.RulePass)("Pass_2");if(S>1)return(0,a.RulePotential)("Potential_2")}}else{if(h){if(k===C.length-1&&!1===v)return(0,a.RulePotential)("Potential_1");continue}if(g){if(k===C.length-1&&!1===v)return(0,a.RulePotential)("Potential_1");continue}}else{if(h){if(k===C.length-1&&!1===f)return(0,a.RulePotential)("Potential_1");continue}if(g){if(k===C.length-1&&!1===f)return(0,a.RulePotential)("Potential_1");continue}}}else{if(h){if(k===C.length-1&&!1===_)return(0,a.RulePotential)("Potential_1");continue}if(g){if(k===C.length-1&&!1===_)return(0,a.RulePotential)("Potential_2");continue}}}}}catch(e){}}}}catch(e){}}}return n?(0,a.RulePass)("Pass_0"):r?(0,a.RulePotential)("Potential_1"):o?(0,a.RulePotential)("Potential_3"):void 0}}},1473(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.style_viewport_resizable=void 0;var a=i(461),n=i(461);t.style_viewport_resizable={id:"style_viewport_resizable",context:"dom:link, dom:style, dom:*[style]",refactor:{WCAG21_Style_Viewport:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{group:"style_viewport_resizable.html",Pass_0:"style_viewport_resizable.html",Potential_1:"style_viewport_resizable.html"}},messages:{"en-US":{group:"Text must scale up to 200% without loss of content or functionality",Pass_0:"Rule Passed",Potential_1:"Verify that text sized using viewport units can be resized up to 200%"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:["1.4.4","1.4.10"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,l=!0,r=/\d+(vw|vh|vmin|vmax)/gi,o=n.nodeName.toLowerCase();if("style"===o){for(var s=0;s<n.ownerDocument.styleSheets.length;s++)if((_=n.ownerDocument.styleSheets[s]).ownerNode===n)try{var u=_.cssRules?_.cssRules:_.rules;if(u)for(var d=0;l&&d<u.length;d++){var c=u[d];if(c.type&&1===c.type){var m=c;if(m.style.fontSize){var p=(v=m.style.fontSize.trim()).match(r);v.length&&p&&(l=!1)}}else if(c.type&&3===c.type&&c.styleSheet){var h=c;if(f=h.styleSheet.cssRules?h.styleSheet.cssRules:h.styleSheet.rules)for(var g=0;l&&g<f.length;g++){var b=f[g];b.type&&1===b.type&&b.style.fontSize&&(p=(v=b.style.fontSize.trim()).match(r),v.length&&p&&(l=!1))}}}}catch(e){}}else if("link"===o)for(s=0;s<n.ownerDocument.styleSheets.length;s++){var _;if((_=n.ownerDocument.styleSheets[s])&&_.ownerNode===n)try{var f;if(f=_.cssRules?_.cssRules:_.rules)for(g=0;l&&g<f.length;g++){var v,A=f[g];if(A.type&&1===A.type&&A.style.fontSize)p=(v=A.style.fontSize.trim()).match(r),v.length&&p&&(l=!1)}}catch(e){}}else{var w=n.getAttribute("style");w&&(p=w.match(/font-size:\s*\d+(vw|vh|vmin|vmax)/gi))&&(l=!1)}return l?(0,a.RulePass)("Pass_0"):(0,a.RulePotential)("Potential_1")}}},1912(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.svg_graphics_labelled=void 0;var a=i(461),n=i(461),l=i(1950),r=i(3946);t.svg_graphics_labelled={id:"svg_graphics_labelled",context:"dom:svg",help:{"en-US":{group:"svg_graphics_labelled.html",pass:"svg_graphics_labelled.html",fail_acc_name:"svg_graphics_labelled.html"}},messages:{"en-US":{group:"A non-decorative SVG element must have an accessible name",pass:"The SVG element has an accessible name",fail_acc_name:"The SVG element has no accessible name"}},rulesets:[{id:["IBM_Accessibility","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[{"7d6734":{pass:"pass",fail_acc_name:"fail"}}],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n)||r.VisUtil.isNodePresentational(n)||l.AccNameUtil.isAccessibleNameIgnorable(n))return null;var o=l.AccNameUtil.computeAccessibleName(n);return o&&o.name&&o.name.trim().length>0?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_acc_name")}}},6539(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_aria_descendants=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139);t.table_aria_descendants={id:"table_aria_descendants",context:"aria:table dom:tr[role], aria:table dom:th[role], aria:table dom:td[role], aria:grid dom:tr[role], aria:grid dom:th[role], aria:grid dom:td[role], aria:treegrid dom:tr[role], aria:treegrid dom:th[role], aria:treegrid dom:td[role]",help:{"en-US":{group:"table_aria_descendants.html",explicit_role:"table_aria_descendants.html"}},messages:{"en-US":{group:"Table structure elements cannot specify an explicit 'role' within table containers",explicit_role:"An explicit ARIA 'role' is not valid for <{0}> element within an ARIA role '{1}' per the ARIA in HTML specification"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,o=r.CommonUtil.isTableDescendant(i);if(null!==o&&0!==o.length){var s=l.AriaUtil.getImplicitRole(n),u=l.AriaUtil.getRoles(n,!1);if(!(s&&s.length>0&&u&&u.length>0&&u.some(function(e){return s.includes(e)})))return(0,a.RuleFail)("explicit_role",[e.dom.node.nodeName.toLowerCase(),o[0].role])}}}},4(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_caption_empty=void 0;var a=i(461),n=i(461),l=i(7139);t.table_caption_empty={id:"table_caption_empty",context:"dom:caption",refactor:{Valerie_Caption_HasContent:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"table_caption_empty.html",Fail_1:"table_caption_empty.html",group:"table_caption_empty.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The <table> element has an empty <caption> element",group:"A <caption> element for a <table> element must contain descriptive text"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;return l.CommonUtil.hasInnerContentHidden(n)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},5334(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_caption_nested=void 0;var a=i(461),n=i(461),l=i(7139);t.table_caption_nested={id:"table_caption_nested",context:"dom:caption",refactor:{Valerie_Caption_InTable:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"table_caption_nested.html",Fail_1:"table_caption_nested.html",group:"table_caption_nested.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"<caption> element is not nested inside a <table> element",group:"The <caption> element must be nested inside the associated <table> element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;return null!=l.CommonUtil.getAncestor(n,"table")?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},2173(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_headers_exists=void 0;var a=i(461),n=i(461),l=i(9196);t.table_headers_exists={id:"table_headers_exists",context:"dom:table",refactor:{RPT_Table_DataHeadingsAria:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"table_headers_exists.html",Fail_1:"table_headers_exists.html",group:"table_headers_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Table has no headers identified",group:"Data table must identify headers"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,r=n.rows;if(!l.TableUtil.isDataTable(n)||null===r||0===r.length)return null;var o=l.TableUtil.tableHeaderExists(n);return null!==o?o?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1"):void 0}}},8349(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_headers_ref_valid=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(1686),s=i(3946),u=i(9955);t.table_headers_ref_valid={id:"table_headers_ref_valid",context:"dom:td[headers], dom:th[headers]",help:{"en-US":{Pass_0:"table_headers_ref_valid.html",Fail_1:"table_headers_ref_valid.html",Fail_2:"table_headers_ref_valid.html",Fail_3:"table_headers_ref_valid.html",Fail_4:"table_headers_ref_valid.html",group:"table_headers_ref_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The 'headers' attribute value \"{0}\" does not reference a valid 'id' in this document",Fail_2:"The 'headers' attribute value \"{0}\" refers to itself",Fail_3:"The 'headers' attribute value \"{0}\" does not refer to a cell in the same table",Fail_4:'The \'headers\' attribute value "{0}" does not refer to a cell indicated with <th> or a role of "columnheader" or "rowheader"',group:"The 'headers' attribute should refer to a valid cell in the same table"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:["a25f45"],run:function(e,t,i){var n=e.dom.node,d=r.CommonUtil.getAncestor(n,"table"),c=u.ARIAMapper.nodeToRole(d);if(null==d||!s.VisUtil.isNodeVisible(d)||!["table","grid"].includes(c))return null;n.nodeName.toLowerCase();var m=n.ownerDocument,p=n.getAttribute("headers");if(!p)return null;for(var h=p.split(" "),g=[],b=[],_=[],f=[],v=0;v<h.length;v++){var A=h[v];if(""!==A.trim()){var w=m.getElementById(A);if(w)if(o.DOMUtil.sameNode(w,n))b.push(A);else if(o.DOMUtil.isInSameTable(w,n)){if("th"!==w.nodeName.toLowerCase()){var y=l.AriaUtil.getRoles(w,!0);y.includes("columnheader")||y.includes("rowheader")||f.push(A)}}else _.push(A);else g.push(A)}}var C=[];return 0!=g.length&&C.push((0,a.RuleFail)("Fail_1",[g.toString()])),0!=b.length&&C.push((0,a.RuleFail)("Fail_2",[b.toString()])),0!=_.length&&C.push((0,a.RuleFail)("Fail_3",[_.toString()])),0!=f.length&&C.push((0,a.RuleFail)("Fail_4",[f.toString()])),0==C.length?(0,a.RulePass)("Pass_0"):C}}},8142(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_headers_related=void 0;var a=i(461),n=i(461),l=i(7139),r=i(4566),o=i(9196);t.table_headers_related={id:"table_headers_related",context:"dom:td, dom:th",refactor:{Valerie_Table_DataCellRelationships:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"table_headers_related.html",Fail_1:"table_headers_related.html",group:"table_headers_related.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Complex table does not have headers for each cell properly defined with 'header' or 'scope'",group:"For a complex data table, all <th> and <td> elements must be related via 'header' or 'scope' attributes"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node,s=l.CommonUtil.getAncestor(n,"table");if(null==s||!o.TableUtil.isComplexDataTable(s))return null;if(null===r.CacheUtil.getCache(n,"table_headers_related",null)){for(var u=[],d=0;d<s.rows.length;++d){var c=s.rows[d];u[d]||(u[d]=[]);for(var m=0;m<c.cells.length;++m){var p=c.cells[m];r.CacheUtil.setCache(p,"table_headers_related",d+":"+m);var h=parseInt(p.getAttribute("colspan"));h||(h=1);var g=parseInt(p.getAttribute("rowspan"));g||(g=1);for(var b=0;u[d][b];)b+=1;for(var _=0;_<g;++_){u[d+_]||(u[d+_]=[]);for(var f=0;f<h;++f)u[d+_][b+f]=p}}}var v=n.ownerDocument,A={},w={};for(d=0;d<u.length;++d){var y=!1;for(m=0;m<u[d].length;++m){var C=u[d][m],k=C.nodeName.toLowerCase();if("th"==k){if("row"==C.getAttribute("scope")?(y=!0,l.CommonUtil.attributeNonEmpty(C,"axis")||(A[r.CacheUtil.getCache(C,"table_headers_related",null)]=!0)):"col"==C.getAttribute("scope")&&(w[m]=!0,l.CommonUtil.attributeNonEmpty(C,"axis")||(A[r.CacheUtil.getCache(C,"table_headers_related",null)]=!0)),l.CommonUtil.attributeNonEmpty(C,"headers")){var R=C.getAttribute("headers").split(" ");for(_=0;_<R.length;++_)(x=v.getElementById(R[_].trim()))&&l.CommonUtil.getAncestor(x,"table")==s&&(A[r.CacheUtil.getCache(x,"table_headers_related",null)]=!0)}}else if("td"==k)if(y||w[m])A[r.CacheUtil.getCache(C,"table_headers_related",null)]=!0;else if(l.CommonUtil.attributeNonEmpty(C,"headers"))for(R=C.getAttribute("headers").split(" "),_=0;_<R.length;++_){var x;(x=v.getElementById(R[_].trim()))&&l.CommonUtil.getAncestor(x,"table")==s&&(A[r.CacheUtil.getCache(C,"table_headers_related",null)]=!0,A[r.CacheUtil.getCache(x,"table_headers_related",null)]=!0)}}}r.CacheUtil.setCache(s,"table_headers_related",A)}var P=r.CacheUtil.getCache(n,"table_headers_related",null),T=r.CacheUtil.getCache(s,"table_headers_related",null),U=P&&T&&P in T;return U||"0:0"!==P||0!=l.CommonUtil.getInnerText(n).trim().length?(U||0!=s.getElementsByTagName("th").length||(!0===r.CacheUtil.getCache(s,"table_headers_related_TrigOnce",!1)?U=!0:r.CacheUtil.setCache(s,"table_headers_related_TrigOnce",!0)),U?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")):null}}},3980(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_layout_linearized=void 0;var a=i(461),n=i(461),l=i(3946),r=i(9196);t.table_layout_linearized={id:"table_layout_linearized",context:"dom:table",refactor:{RPT_Table_LayoutTrigger:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"table_layout_linearized.html",Potential_1:"table_layout_linearized.html",group:"table_layout_linearized.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify table is not being used to format text content in columns unless the table can be linearized",group:"Avoid using tables to format text documents in columns unless the table can be linearized"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_FOUR}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var o=!r.TableUtil.isLayoutTable(n);return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},4701(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_scope_valid=void 0;var a=i(461),n=i(461);t.table_scope_valid={id:"table_scope_valid",context:"dom:td[scope], dom:th[scope]",refactor:{WCAG20_Table_Scope_Valid:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_0:"table_scope_valid.html",Fail_1:"table_scope_valid.html",Fail_2:"table_scope_valid.html",group:"table_scope_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Value provided is invalid for the 'scope' attribute",Fail_2:"The 'scope' attribute should only be used on a <th> element",group:'Value for \'scope\' attribute must be "row", "col", "rowgroup", or "colgroup"'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node;if("td"===n.nodeName.toLowerCase())return(0,a.RuleFail)("Fail_2");var l=n.getAttribute("scope").trim().toLowerCase();return/^(row|col|rowgroup|colgroup)$/.test(l)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},18(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_structure_misuse=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(3946),s=i(9196);t.table_structure_misuse={id:"table_structure_misuse",context:"dom:table",refactor:{WCAG20_Table_Structure:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"table_structure_misuse.html",Fail_1:"table_structure_misuse.html",group:"table_structure_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'The <{0}> element with "presentation" role or "none" role has structural element(s) and/or attribute(s) \'{1}\'',group:'Table elements with \'role="presentation" or \'role="none" should not have structural elements or attributes'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node;if(o.VisUtil.isNodeHiddenFromAT(n))return null;if(s.TableUtil.isDataTable(n))return null;if(l.AriaUtil.isNodeInGrid(n))return null;var u=[];r.CommonUtil.attributeNonEmpty(n,"summary")&&u.push(n);for(var d=n.getElementsByTagName("caption"),c=0;c<d.length;++c)if(r.CommonUtil.getAncestor(d[c],"table")==n){if(r.CommonUtil.shouldNodeBeSkippedHidden(d[c]))continue;u.push(d[c]);break}var m=n.getElementsByTagName("th");for(c=0;c<m.length;++c)if(r.CommonUtil.getAncestor(m[c],"table")==n){if(r.CommonUtil.shouldNodeBeSkippedHidden(m[c]))continue;u.push(m[c]);break}var p=n.getElementsByTagName("td");for(c=0;c<p.length;++c)if((p[c].hasAttribute("scope")||p[c].hasAttribute("headers"))&&r.CommonUtil.getAncestor(p[c],"table")==n){if(r.CommonUtil.shouldNodeBeSkippedHidden(p[c]))continue;u.push(p[c]);break}var h=n.nodeName.toLowerCase(),g=new Array,b={};for(c=0;c<u.length;c++){var _=u[c].nodeName.toLowerCase();b.hasOwnProperty(_)||("table"!=_||b.hasOwnProperty.summary?(b[_]=!0,g.push(_)):(b.summary=!0,g.push("summary")))}var f=g.join(", ");return 0==u.length?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[h,f])}}},9314(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_summary_redundant=void 0;var a=i(461),n=i(461),l=i(7139),r=i(5279),o=i(1686);t.table_summary_redundant={id:"table_summary_redundant",context:"dom:table",refactor:{WCAG20_Table_CapSummRedundant:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"table_summary_redundant.html",Fail_1:"table_summary_redundant.html",group:"table_summary_redundant.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The table summary duplicates the caption",group:"The table summary must not duplicate the caption"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n,s=e.dom.node;if(s.hasAttribute("summary"))n=s.getAttribute("summary").trim().toLowerCase();else if(s.hasAttribute("aria-describedby")){for(var u=s.getAttribute("aria-describedby").split(" "),d="",c=0;c<u.length;c++){var m=u[c];if(m){var p=r.FragmentUtil.getById(s,m);p&&!o.DOMUtil.sameNode(p,s)&&(d+=" "+l.CommonUtil.getInnerText(p).trim().toLowerCase())}}n=d}if(!n)return null;var h=s.getElementsByTagName("caption");if(0===h.length)return null;if(n.length>0){var g=l.CommonUtil.getInnerText(h[0]).trim().toLowerCase();return n.includes(g)?(0,a.RuleFail)("Fail_1"):(0,a.RulePass)("Pass_0")}}}},1667(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.target_spacing_sufficient=void 0;var a=i(7139),n=i(461),l=i(461),r=i(7507),o=i(4919),s=i(4566);t.target_spacing_sufficient={id:"target_spacing_sufficient",context:"dom:*",dependencies:[],help:{"en-US":{group:"target_spacing_sufficient.html",pass_spacing:"target_spacing_sufficient.html",pass_sized:"target_spacing_sufficient.html",pass_inline:"target_spacing_sufficient.html",pass_default:"target_spacing_sufficient.html",violation_spacing:"target_spacing_sufficient.html",recommendation_inline:"target_spacing_sufficient.html",potential_overlap:"target_spacing_sufficient.html"}},messages:{"en-US":{group:"The target must be sufficiently sized or spaced from other targets",pass_spacing:"The target's spacing from other targets is sufficient",pass_sized:"The target’s size is more than 24 CSS pixels",pass_inline:"The target is in a sentence or its size is otherwise constrained by the line-height of non-target text",pass_default:"The target's size is determined by the user agent and is not modified by the author",violation_spacing:'Undersized target "{0}" does not have sufficient spacing of 12 CSS pixels from another target "{1}"',recommendation_inline:'Confirm the inline target "{0}" is sufficiently spaced from another inline target "{1}"',potential_overlap:'Ensure the overlapped target "{0}" meets a minimum target size or has sufficient spacing from the overlapping target "{1}"'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_2"],num:["2.5.8"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE,reasonCodes:["pass_spacing","pass_sized","pass_inline","pass_default","violation_spacing","potential_overlap"]},{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_2"],num:["2.5.8"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE,reasonCodes:["recommendation_inline"]}],act:[],run:function(e,t,i){var l=e.dom.node,u=l.nodeName.toLocaleLowerCase(),d=new r.DOMMapper,c=d.getUnadjustedBounds(l);if(!c)return null;if(!a.CommonUtil.isTarget(l))return null;if(c.height>=24&&c.width>=24)return(0,n.RulePass)("pass_sized");var m=o.CSSUtil.getInlineStatus(l);if(null===m)return null;if(m.inline)return m.text?null===m.violation?(0,n.RulePass)("pass_inline"):(0,n.RulePotential)("recommendation_inline",[u,m.violation]):null===m.violation?(0,n.RulePass)("pass_default"):(0,n.RulePotential)("recommendation_inline",[u,m.violation]);if(o.CSSUtil.isTargetBrowserDefault(l))return(0,n.RulePass)("pass_default");var p=l.ownerDocument;if(!p)return null;var h=getComputedStyle(l);if(null===h)return null;var g=h.zIndex;g&&!isNaN(Number(g))||(g="0");var b=s.CacheUtil.getCache(p.documentElement,"target_spacing_sufficient::targets",void 0);if(void 0===b){b=[];for(var _=p.querySelectorAll("body *:not(script):not(style)"),f=0;f<_.length;f++){var v=_[f];a.CommonUtil.isTarget(v)&&b.push(v)}s.CacheUtil.setCache(p.documentElement,"target_spacing_sufficient::targets",b)}if(b&&0!==b.length){var A=!0,w=24,y=24,C=null,k=null,R=[],x=function(e){var t=b[e],i=l.compareDocumentPosition(t);if(0===i||i&Node.DOCUMENT_POSITION_CONTAINED_BY)return A=!1,"continue";if(i&Node.DOCUMENT_POSITION_CONTAINS||R.some(function(e){return e.contains(t)}))return"continue";var a=d.getUnadjustedBounds(t);if(!a)return"continue";var r=getComputedStyle(t),o="0";if(r&&((o=r.zIndex)&&!isNaN(Number(o))||(o="0")),a.top<=c.top&&a.left<=c.left&&a.top+a.height>=c.top+c.height&&a.left+a.width>=c.left+c.width)return(A?parseInt(g)<parseInt(o):parseInt(g)<=parseInt(o))?{value:null}:{value:(0,n.RulePotential)("potential_overlap",[u,t.nodeName.toLowerCase()])};if(c.top<=a.top&&c.left<=a.left&&c.top+c.height>=a.top+a.height&&c.left+c.width>=a.left+a.width)return(A?parseInt(g)<parseInt(o):parseInt(g)<=parseInt(o))?{value:(0,n.RulePotential)("potential_overlap",[u,t.nodeName.toLowerCase()])}:{value:(0,n.RuleFail)("violation_spacing",[u,t.nodeName.toLowerCase()])};if((c.top>=a.top&&c.top<=a.top+a.height||c.top+c.height<=a.top&&c.top+c.height>=a.top+a.height)&&(c.left>a.left&&c.left<a.left+a.width||a.left>c.left&&a.left<c.left+c.width)||(c.top>a.top&&c.top<a.top+a.height||a.top>c.top&&a.top<c.top+c.height)&&(c.left>=a.left&&c.left<=a.left+a.width||c.left+c.width>=a.left&&c.left+c.width<=a.left+a.width))return{value:(0,n.RulePotential)("potential_overlap",[u,t.nodeName.toLowerCase()])};var s=24,m=24;c.width<24&&(c.top>=a.top&&c.top<=a.top+a.height||c.top<=a.top&&c.top+c.height>a.top)&&(s=Math.min(Math.abs(c.left-a.left),Math.abs(c.left-(a.left+a.width)),Math.abs(c.left+c.width-(a.left+a.width)),Math.abs(c.left+c.width-a.left))),c.height<24&&(c.left>=a.left&&c.left<=a.left+a.width||c.left<=a.left&&c.left+c.width>a.left)&&(m=Math.min(Math.abs(c.top-a.top),Math.abs(c.top-(a.top+a.height)),Math.abs(c.top+c.height-(a.top+a.height)),Math.abs(c.top+c.height-a.top))),s<w&&(w=s,C=t),m<y&&(y=m,k=t),R.push(t)};for(f=0;f<b.length;f++){var P=x(f);if("object"==typeof P)return P.value}return Math.round(c.width/2)+w<12||Math.round(c.height/2)+y<12?Math.round(c.width/2)+w<Math.round(c.height/2)+y?(0,n.RuleFail)("violation_spacing",[u,C.nodeName.toLowerCase()]):(0,n.RuleFail)("violation_spacing",[u,k.nodeName.toLowerCase()]):(0,n.RulePass)("pass_spacing")}}}},9599(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.text_block_heading=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(3864),s=i(4919),u=i(3946);t.text_block_heading={id:"text_block_heading",context:"dom:p, dom:div, dom:br",refactor:{RPT_Block_ShouldBeHeading:{Potential_1:"potential_heading"}},help:{"en-US":{potential_heading:"text_block_heading.html",group:"text_block_heading.html"}},messages:{"en-US":{potential_heading:"Confirm this text '{0}' is used as a heading and if so, modify to use a heading element or role",group:"Heading text should use a heading element or role"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.CommonUtil.isNodeDisabled(n)||!u.VisUtil.isNodeVisible(n))return null;if(null===r.CommonUtil.getAncestor(n,["body"])||null!==r.CommonUtil.getAncestor(n,["script"]))return null;var d=0,c=n.ownerDocument.getElementsByTagName("body");if(null!=c){var m=getComputedStyle(c[0]);m&&(d=s.CSSUtil.getPixelsFromStyle(m["font-size"],c))}var p=0,h=[],g=new o.DOMWalker(n);g.nextNode();for(var b=!1;!b&&g.nextNode()&&g.node!==n&&g.node!==o.DOMWalker.parentNode(n)&&!["br","div","p"].includes(g.node.nodeName.toLowerCase());)if(g.node!==n&&!r.CommonUtil.shouldNodeBeSkippedHidden(g.node)){var _=g.node.nodeName.toLowerCase();if(3===g.node.nodeType){if(g.node.nodeValue.trim().length>0&&g.node.parentElement){var f=getComputedStyle(g.node.parentElement);if(f&&("bold"===f["font-weight"]||f["font-weight"]>=700||f["font-size"]&&f["font-size"].includes("large")||f["font-size"]&&0!==d&&s.CSSUtil.getPixelsFromStyle(f["font-size"],g.node.parentElement)>d)){var v=g.node.nodeValue.trim();(A=r.CommonUtil.wordCount(v))>0&&(h.push(v),p+=A),b=p>10,g.bEndTag=!0}else b=!0}}else if(1===g.node.nodeType)if("b"===_||"strong"===_||"u"===_||"font"===_){var A;v=r.CommonUtil.getInnerText(g.node),(A=r.CommonUtil.wordCount(v))>0&&(h.push(v),p+=A),b=p>10,g.bEndTag=!0}else{var w=l.AriaUtil.getResolvedRole(g.node);b=null!==w&&"generic"!==w&&"paragraph"!==w&&"strong"!==w||"applet"===_}}return 0==p&&(b=!0),b||(b=/[:,;\-\.]$/.test(h.join(" ").trim())),b?null:(0,a.RulePotential)("potential_heading",[h.join(" ")])}}},4672(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.text_contrast_sufficient=void 0;var a=i(7139),n=i(3946),l=i(3883),r=i(461),o=i(461),s=i(4919);t.text_contrast_sufficient={id:"text_contrast_sufficient",context:"dom:*",refactor:{IBMA_Color_Contrast_WCAG2AA:{Pass_0:"pass",Fail_1:"fail_contrast",Potential_1:"potential_same_color"},IBMA_Color_Contrast_WCAG2AA_PV:{pass_0:"pass",potential_1:"potential_graphic_background"}},help:{"en-US":{group:"text_contrast_sufficient.html",pass:"text_contrast_sufficient.html",fail_contrast:"text_contrast_sufficient.html",potential_same_color:"text_contrast_sufficient.html",potential_graphic_background:"text_contrast_sufficient.html",potential_text_shadow:"text_contrast_sufficient.html"}},messages:{"en-US":{group:"The contrast ratio of text with its background must meet WCAG AA requirements",pass:"The contrast ratio of text with its background meets WCAG AA requirements",fail_contrast:"Text contrast of {0} with its background is less than the WCAG AA minimum requirements for text of size {1}px and weight of {2}",potential_same_color:"The foreground text and its background color are both detected as {3}. Verify the text meets the WCAG AA requirements for minimum contrast",potential_graphic_background:"Verify the contrast ratio of the text against the lightest and the darkest colors of the background meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}",potential_text_shadow:"Verify the contrast ratio of the text with shadow meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"1.4.3",level:o.eRulePolicy.VIOLATION,toolkitLevel:o.eToolkitLevel.LEVEL_ONE}],act:["afw4f7"],run:function(e,t,i){var o=e.dom.node,u=o.nodeName.toLowerCase();if(!n.VisUtil.isNodeVisible(o)||null!=n.VisUtil.hiddenByDefaultElements&&null!=n.VisUtil.hiddenByDefaultElements&&n.VisUtil.hiddenByDefaultElements.indexOf(u)>-1)return null;if(a.CommonUtil.isNodeDisabled(o))return null;if(a.CommonUtil.getAncestor(o,["svg","script","meta","style"]))return null;var d=o.ownerDocument;if(!d)return null;var c=d.defaultView;if(!c)return null;var m=a.CommonUtil.getNodeText(o);if(!a.CommonUtil.isShadowHostElement(o)||a.CommonUtil.isShadowHostElement(o)&&""===a.CommonUtil.getNodeText(o.shadowRoot)){if(0==m.trim().length)return null;if(0===(m=m.trim().replace(/[^(a-zA-Z\d\s)\^(\u4e00-\u9fff\u3400-\u4dbf)\u0000-\u0008\u000B-\u001F\u007F-\u009F\u2000-\u200F\u2028-\u202F\u205F-\u206F\u3000\uFEFF]+/g,"")).trim().length)return null}var p=o;if(a.CommonUtil.isShadowHostElement(o)){if(o.shadowRoot)for(var h=o.firstChild;h;h=h.nextSibling)if(3==h.nodeType){p=h.assignedSlot;break}if(null===p)return}var g=c.getComputedStyle(p);if(!1==("0"!==g.width&&"0"!==g.height&&"0"!==g.opacity&&"none"!==g.display&&"hidden"!==g.visibility&&"hidden"!==g.overflow&&("auto"===g.left||"absolute"===g.position&&parseInt(g.left.replace(/[^0-9.+-]/,""))>0)&&("auto"===g.left||"absolute"===g.position&&parseInt(g.top.replace(/[^0-9.+-]/,""))>0)))return null;var b=-1;if("auto"!==g.clip){var _=g.clip.toString();if(_.includes("rect"))for(var f=[],v=/\((.*)\)/g.exec(_)[1].split(", "),A=0;A<v.length;A++)f.push(v[A]);b=parseInt(f[0].replace(/px/g,""))-parseInt(f[2].replace(/px/g,"")),b=Math.abs(b)}if("absolute"===g.position&&b<7&&-1!==b)return null;var w=l.ColorUtil.ColorCombo(p);if(null!==w){var y=w.fg,C=w.bg,k=y.contrastRatio(C),R=s.CSSUtil.getWeightNumber(g.fontWeight),x=s.CSSUtil.getFontInPixels(g.fontSize,p),P=x>=24||x>=18.6&&R>=700;s.CSSUtil.containsCKJ(m)&&(P=x>=29.3||x>=24&&R>=700);var T=k>=4.5||k>=3&&P,U=w.hasBGImage||w.hasGradient,I=w.textShadow,E=a.CommonUtil.isNodeDisabled(p);if(!E){var N=a.CommonUtil.getControlOfLabel(p);N&&(E=a.CommonUtil.isNodeDisabled(N))}return!E&&"label"===u&&a.CommonUtil.isDisabledByFirstChildFormElement(p)&&(E=!0),!E&&o.hasAttribute("id")&&a.CommonUtil.isDisabledByReferringElement(p)&&(E=!0),!T&&E&&(T=!0),T?(0,r.RulePass)("pass",[k.toFixed(2),x,R,y.toHex(),C.toHex(),w.hasBGImage,w.hasGradient]):U?(0,r.RulePotential)("potential_graphic_background",[k.toFixed(2),x,R]):I?(0,r.RulePotential)("potential_text_shadow",[k.toFixed(2),x,R]):y.toHex()===C.toHex()?(0,r.RulePotential)("potential_same_color",[k.toFixed(2),x,R,y.toHex(),C.toHex(),w.hasBGImage,w.hasGradient]):(0,r.RuleFail)("fail_contrast",[k.toFixed(2),x,R,y.toHex(),C.toHex(),w.hasBGImage,w.hasGradient])}console.log("unable to get color combo for element: "+p.nodeName)}}},4353(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.text_quoted_correctly=void 0;var a=i(461),n=i(461),l=i(7139),r=i(3946);t.text_quoted_correctly={id:"text_quoted_correctly",context:"dom:*",help:{"en-US":{Pass_0:"text_quoted_correctly.html",Potential_1:"text_quoted_correctly.html",group:"text_quoted_correctly.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"If the following text is a quotation, mark it as a <q> or <blockquote> element: {0}",group:"Quotations should be marked with <q> or <blockquote> elements"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(!r.VisUtil.isNodeVisible(n))return null;if(null===l.CommonUtil.getAncestor(n,["body"]))return null;for(var o=!0,s=n.firstChild,u=null,d=["blockquote","q","script","style","pre","code","ruby","samp"];o&&s;){if("#text"===s.nodeName){var c=s.nodeValue,m=(c=c.replace(/(\S)'(\S)/g,"$1$2")).match(/("[^"]+")/g),p=c.match(/('[^']+')/g);if((null!==m||null!==p)&&null===l.CommonUtil.getAncestor(s,d)){if(null!=m)for(var h=0;o&&h<m.length;++h)o=l.CommonUtil.wordCount(m[h])<3;if(null!=p)for(h=0;o&&h<p.length;++h)o=l.CommonUtil.wordCount(p[h])<3;u=null===m?p.join(", ").replace(new RegExp("\\r?\\n|\\r","g"),""):null===p?m.join(", ").replace(new RegExp("\\r?\\n|\\r","g"),""):m.concat(p).join(", ").replace(new RegExp("\\r?\\n|\\r","g"),"")}}s=s.nextSibling}return!o&&u.length&&u.length>69&&(u=u.substring(0,32)+" ... "+u.substring(u.length-32)),o?(0,a.RulePass)("Pass_0"):(0,a.RulePotential)("Potential_1",[u])}}},7147(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.text_sensory_misuse=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(4566),s=i(3946);t.text_sensory_misuse={id:"text_sensory_misuse",context:"dom:body, dom:body dom:*",refactor:{RPT_Text_SensoryReference:{Potential_1:"potential_position, potential_other"}},help:{"en-US":{potential_position:"text_sensory_misuse.html",potential_other:"text_sensory_misuse.html",group:"text_sensory_misuse.html"}},messages:{"en-US":{potential_position:"Confirm the word(s) '{0}' of the user instruction is used to indicate a logical rather than visual position",potential_other:"Confirm the user instruction is still understandable without the word(s) '{0}'",group:"Instructions should be meaningful without relying solely on shape, size, or location words"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.3"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node,c=n.nodeName.toLowerCase();if(!s.VisUtil.isNodeVisible(n)||r.CommonUtil.isNodeDisabled(n)||s.VisUtil.hiddenByDefaultElements.includes(c))return null;if(null===r.CommonUtil.getAncestor(n,["body"]))return null;if(null!==r.CommonUtil.getAncestor(n,["script","a","label"]))return null;var m=l.AriaUtil.getResolvedRole(n);if(m){var p=l.AriaUtil.getRolesWithTypes(n,["landmark"]);if(p&&p.includes(m))return null}var h=l.AriaUtil.getRolesWithTypes(n,["widget","heading"]);if(r.CommonUtil.concatUniqueArrayItemList(["caption","cell","code","columnheader","definition","figure","list","listitem","math","meter","row","rowgroup","rowheader","term"],h),null!==l.AriaUtil.getAncestorWithRoles(n,h))return null;for(var g="",b="",_=n.firstChild,f="";_;){if("#text"===_.nodeName){var v=_.nodeValue.trim();v.length>0&&(f+=f.length>0?", "+v:v)}_=_.nextSibling}if(f.length>0){var A=function(e,t){if(!u[t])return"";var i=o.CacheUtil.getCache(e,t+"_sensory_misuse",null);if(null==i){for(var a=u[t].value,n="(ss+|"+a[0],l=1;l<a.length;++l){var r=a[l].trim().split(" ");if(n+="|"+r[0],r.length>1)for(var s=1;s<r.length;++s)n+=" +"+r[s]}n+=")",i=new RegExp(n,"gi"),o.CacheUtil.setCache(e,t+"_sensory_misuse",i)}return i}(n.ownerDocument,"exemptText");f=f.replace(A," "),g=d(n.ownerDocument,"positionText",f),b=d(n.ownerDocument,"otherText",f)}var w=[];return g&&w.push((0,a.RulePotential)("potential_position",[g])),b&&w.push((0,a.RulePotential)("potential_other",[b])),0==w.length?null:w}};var u={positionText:{value:["top-left","top-right","bottom-right","bottom-left","top-to-bottom","left-to-right","bottom-to-top","right-to-left","right","left","above","below","top","bottom","upper","lower","corner","beside"],type:"[string]"},otherText:{value:["round","square","shape","rectangle","triangle","size","large","small","medium","big","huge","tiny","extra","larger","smaller","bigger","little","largest","smallest","biggest"],type:"[string]"},exemptText:{value:["right-click","left-click","right-clicking","right-clicks","left-clicking","left-clicks","square root","right now","off the top"],type:"[string]"}};function d(e,t,i){if(!i)return"";var a=u[t].value,n={},l=[];return i.split(/\s+/).reduce(function(e,t){for(var i=t.replace(/[.?!:;()'",`\]]+$/,""),r=t.toLowerCase().replace(/[.?!:;()'",`\]]/g,""),o=0;o<a.length;o++){var s=r.indexOf(a[o]),u=a[o].length,d=r.charAt(u+s);if(!(s<0)){var c="."==d||"?"==d||"!"==d||":"==d||";"==d||"("==d||")"==d||"'"==d||'"'==d||","==d||".`"==d||"\\"==d||"]"==d,m=!1;if(s>0){var p=r.charAt(s-1);m="-"==p||"."==p||"?"==p||"!"==p||":"==p||";"==p||"("==p||")"==p||"'"==p||'"'==p||","==p||".`"==p||"\\"==p||"]"==p}r.length!=u&&1!=c&&1!=m||(n.hasOwnProperty(i)||(n[i]=!0,l.push(i)),o=a.length)}}return e[i]=(e[i]||0)+1,e},Object.create(null)),l.join(", ")}},1419(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.text_spacing_valid=void 0;var a=i(461),n=i(7139),l=i(3946),r=i(4919),o=i(7507),s=/(-?[\d.]+)([a-z%]*)/;function u(e,t,i){var a;if(i.startsWith("inherit")||i.startsWith("unset")){var n=r.CSSUtil.getAncestorWithStyles(e.parentElement,((a={})[t]=["*"],a),["inherit","unset"]);if(null!==n)return r.CSSUtil.getDefinedStyles(n,[t])[t];if(i.startsWith("unset"))return"initial"}return i}function d(e,t,i,a,n,l){if(void 0===l&&(l=!1),"important"!==e.style.getPropertyPriority(t))return!0;var o=function(e){return e.substring(0,e.length-11)}(i);if("initial"===o||"normal"===o)return!1;var u=parseFloat(o);if(isNaN(u))return!0;var d=o.trim().match(s);if(!d)return!0;var c=d[1],m=d[2];if(""===m){if(l)return!(parseFloat(c)<n);if(0===parseFloat(c))return null}if(""===m&&0!==parseFloat(c))return null;var p=r.CSSUtil.convertValue2Pixels(m,c,e);return!(null!==p&&p/a<n)}t.text_spacing_valid={id:"text_spacing_valid",context:"dom:*",help:{"en-US":{pass:"text_spacing_valid.html",group:"text_spacing_valid.html",fail_letter_spacing_style:"text_spacing_valid.html",fail_word_spacing_style:"text_spacing_valid.html",fail_line_height_style:"text_spacing_valid.html"}},messages:{"en-US":{pass:"CSS !important is not used in inline style to control letter or word spacing or line height",group:"CSS !important should not be used in inline style to control letter or word spacing or line height",fail_letter_spacing_style:"CSS !important should not be used in inline ‘letter-spacing’ style",fail_word_spacing_style:"CSS !important should not be used in inline ‘word-spacing’ style",fail_line_height_style:"CSS !important should not be used in inline ‘line-height’ style"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.4.12"],level:a.eRulePolicy.VIOLATION,toolkitLevel:a.eToolkitLevel.LEVEL_THREE}],act:["9e45ec","24afc2","78fd32"],run:function(e,t,i){for(var c=e.dom.node,m="",p=c.childNodes,h=0;h<p.length;++h)3===p[h].nodeType&&(m+=p[h].nodeValue);if(0===m.trim().length)return null;if(l.VisUtil.isNodeHiddenFromAT(c)||n.CommonUtil.isNodeDisabled(c))return null;var g=(new o.DOMMapper).getUnadjustedBounds(c);if(!g||g.top<0||g.left<0)return null;if(n.CommonUtil.getAncestor(c,"svg"))return null;var b=getComputedStyle(c),_=parseFloat(b.getPropertyValue("font-size")),f=b.getPropertyValue("word-spacing"),v=b.getPropertyValue("letter-spacing"),A=b.getPropertyValue("line-height"),w=!0,y=!0,C=!0;if(f){var k=parseFloat(f);if(!isNaN(k)){var R=r.CSSUtil.convertValue2Pixels("px",k.toString(),c);null!==R&&R/_<.16&&(w=!1)}}if(v){var x=parseFloat(v);if(!isNaN(x)){var P=r.CSSUtil.convertValue2Pixels("px",x.toString(),c);null!==P&&P/_<.12&&(y=!1)}}if(A){var T=parseFloat(A);if(!isNaN(T)){var U=A.match(s);if(U){var I=U[1],E=U[2];""!==E&&"px"!==E||(""===E?parseFloat(I):parseFloat(I)/_)<1.5&&(C=!1)}}}if(w&&y&&C)return null;var N=r.CSSUtil.getDefinedStyles(c,["word-spacing","letter-spacing","line-height"]);if(0===Object.keys(N).length)return null;var L=[],S=N["word-spacing"];if(S){var O=d(c,"word-spacing",S=u(c,"word-spacing",S),_,.16);L.push(O?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_word_spacing_style"))}var q=N["letter-spacing"];q&&(O=d(c,"letter-spacing",q=u(c,"letter-spacing",q),_,.12),L.push(O?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_letter_spacing_style")));var W=N["line-height"];return W&&null===r.CSSUtil.getAncestorWithStyles(c,{overflow:["auto","scroll"],"overflow-x":["auto","scroll"],"overflow-y":["auto","scroll"]})&&(O=d(c,"line-height",W=u(c,"line-height",W),_,1.5,!0),L.push(O?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_line_height_style"))),L.length>0?L:null}}},855(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.text_whitespace_valid=void 0;var a=i(461),n=i(461),l=i(7139);t.text_whitespace_valid={id:"text_whitespace_valid",context:"dom:*",help:{"en-US":{pass:"text_whitespace_valid.html",potential_text:"text_whitespace_valid.html",group:"text_whitespace_valid.html"}},messages:{"en-US":{pass:"Rule Passed",potential_text:"Space characters should not be used to create space between the letters of a word",group:"Space characters should not be used to control spacing within a word"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,r=l.CommonUtil.getAncestor(n,["body","script","code"]);if(null==r||"body"!=r.nodeName.toLowerCase())return null;for(var o=!0,s=n.firstChild;o&&s;){if("#text"==s.nodeName){var u=s.nodeValue;o=!/(^|\s)[a-zA-Z] [a-zA-Z] [a-zA-Z]($|\s)/.test(u)}s=s.nextSibling}return o?(0,a.RulePass)("pass"):(0,a.RulePotential)("potential_text")}}},3420(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.widget_tabbable_exists=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(9955),s=i(3864),u=i(3946);t.widget_tabbable_exists={id:"widget_tabbable_exists",context:"aria:button,aria:link,aria:spinbutton,aria:tablist,aria:combobox,aria:listbox,aria:menu,aria:radiogroup,aria:tree,aria:menubar, aria:grid, aria:treegrid, aria:checkbox,aria:slider,aria:spinbutton,aria:textbox,aria:scrollbar,aria:slider,aria:spinbutton",refactor:{IBMA_Focus_Tabbable:{pass:"pass",fail_no_tabbable:"fail_no_tabbable"}},help:{"en-US":{pass:"widget_tabbable_exists.html",fail_no_tabbable:"widget_tabbable_exists.html",group:"widget_tabbable_exists.html"}},messages:{"en-US":{pass:"Rule Passed",fail_no_tabbable:'Component with "{0}" role does not have a tabbable element',group:"Component must have at least one tabbable element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(!u.VisUtil.isNodeHiddenFromAT(n)&&!r.CommonUtil.isNodeDisabled(n)&&!l.AriaUtil.shouldBePresentationalChild(n)){if("datalist"===n.nodeName.toLowerCase())return null;for(var d=0,c=["combobox","grid","listbox","menu","menubar","radiogroup","tablist","tree","treegrid"];d<c.length;d++){var m=c[d];if(null!=l.AriaUtil.getAncestorWithRole(n,m,!0))return null}var p=o.ARIAMapper.nodeToRole(n),h=0;if(r.CommonUtil.isTabbable(n)&&++h,h<1&&!l.AriaUtil.containsPresentationalChildrenOnly(n)&&n.firstChild)for(var g=new s.DOMWalker(n);h<1&&g.nextNode()&&g.node!=n;)1==g.node.nodeType&&!g.bEndTag&&r.CommonUtil.isTabbable(g.node)&&++h;return h>=1?(0,a.RulePass)("pass"):(0,a.RulePotential)("fail_no_tabbable",[p])}}}},408(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.widget_tabbable_single=void 0;var a=i(461),n=i(461),l=i(3864),r=i(7011),o=i(7139),s=i(9955),u=i(4566),d=i(3946);t.widget_tabbable_single={id:"widget_tabbable_single",context:"aria:button,aria:link,aria:menuitem,aria:spinbutton,aria:tablist,aria:combobox,aria:listbox,aria:menu,aria:radiogroup,aria:tree,aria:checkbox,aria:option,aria:radio,aria:slider,aria:spinbutton,aria:textbox,aria:columnheader,aria:rowheader,aria:slider,aria:tab",refactor:{IBMA_Focus_MultiTab:{pass:"pass",potential_multiple_tabbable:"potential_multiple_tabbable"}},help:{"en-US":{pass:"widget_tabbable_single.html",potential_multiple_tabbable:"widget_tabbable_single.html",group:"widget_tabbable_single.html"}},messages:{"en-US":{pass:"Components with a widget role should have no more than one tabbable element",potential_multiple_tabbable:'Component with "{0}" role has more than one tabbable element',group:"Components with a widget role must have no more than one tabbable element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1","2.4.3"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(!d.VisUtil.isNodeHiddenFromAT(n)&&!o.CommonUtil.isNodeDisabled(n)&&!r.AriaUtil.shouldBePresentationalChild(n)){var c=s.ARIAMapper.nodeToRole(n),m=0;if(o.CommonUtil.isTabbable(n)&&++m,m<2&&!r.AriaUtil.containsPresentationalChildrenOnly(n)&&n.firstChild)for(var p=new l.DOMWalker(n);m<2&&p.nextNode()&&p.node!=n;)1==p.node.nodeType&&!p.bEndTag&&o.CommonUtil.isTabbable(p.node)&&++m;var h=m<2;return h||u.CacheUtil.setCache(n,"widget_tabbable_single","potential_multiple_tabbable"),h?(0,a.RulePass)("pass"):(0,a.RulePotential)("potential_multiple_tabbable",[c])}}}},6160(e,t,i){var a=this&&this.__createBinding||(Object.create?function(e,t,i,a){void 0===a&&(a=i);var n=Object.getOwnPropertyDescriptor(t,i);n&&!("get"in n?!t.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,a,n)}:function(e,t,i,a){void 0===a&&(a=i),e[a]=t[i]}),n=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),l=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&a(t,e,i);return n(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.a11yRulesets=void 0;var r=l(i(8855)),o=i(8601),s=[];for(var u in r)s.push(r[u]);var d={"1.1.1":"All non-text content that is presented to the user has a text alternative that serves the equivalent purpose.","1.2.1":"For prerecorded audio-only or video-only media, an alternative provides equivalent information.","1.2.2":"Captions are provided for all prerecorded audio content in synchronized media.","1.2.3":"An alternative for time-based media or audio description of the prerecorded video content is provided for synchronized media.","1.2.4":"Captions are provided for all live audio content in synchronized media.","1.2.5":"Audio description is provided for all prerecorded video content in synchronized media.","1.3.1":"Information, structure, and relationships conveyed through presentation can be programmatically determined or are available in text.","1.3.2":"When the sequence in which content is presented affects its meaning, a correct reading sequence can be programmatically determined.","1.3.3":"Instructions provided for understanding and operating content do not rely solely on sensory characteristics of components such as shape, size, visual location, orientation, or sound.","1.3.4":"Content does not restrict its view and operation to a single display orientation, such as portrait or landscape.","1.3.5":"The purpose of each input field that collects information about the user can be programmatically determined when the field serves a common purpose.","1.4.1":"Color is not used as the only visual means of conveying information, indicating an action, prompting a response, or distinguishing a visual element.","1.4.2":"If any audio plays automatically for more than 3 seconds, either a mechanism is available to pause or stop the audio, or a mechanism is available to control audio volume independently from the overall system volume level.","1.4.3":"The visual presentation of text and images of text has a contrast ratio of at least 4.5:1, with a 3:1 ratio for large-scale text.","1.4.4":"Text can be resized without assistive technology up to 200 percent without loss of content or functionality.","1.4.5":"If the technologies being used can achieve the visual presentation, text should not be used to convey information rather than images of text.","1.4.10":"Content can reflow without loss of information or functionality, and without requiring scrolling in two dimensions.","1.4.11":"The parts of graphical objects required to understand the content, and the visual information required to identify UI components and states, have a contrast ratio of at least 3:1 against adjacent colors.","1.4.12":"No loss of content or functionality occurs when users change letter, word and paragraph spacing, as well as line height.","1.4.13":"Where hover or focus actions cause additional content to become visible and hidden, the additional content is dismissable, hoverable and persistent.","2.1.1":"All functionality of the content is operable through a keyboard interface without requiring specific timings for individual keystrokes.","2.1.2":"If keyboard focus can be moved to a component using a keyboard interface, then focus can be moved away from that component using only a keyboard interface, and, if it requires more than unmodified arrow or tab keys or other standard exit methods, the user is advised of the method for moving focus away.","2.1.4":"If a keyboard shortcut is implemented using only letter, punctuation, number or symbol characters, then the shortcut can be turned off, remapped or activated only on focus.","2.2.1":"For each time limit that is set by the content, the user can turn off, adjust, or extend the limit.","2.2.2":"For moving, blinking, scrolling, or auto-updating information, the user can pause, stop, hide or adjust the information.","2.3.1":"Content does not contain anything that flashes more than three times in any one second period, or the flash is below the general flash and red flash thresholds.","2.4.1":"A mechanism is available to bypass blocks of content that are repeated on multiple Web pages.","2.4.2":"Web pages, non-web documents, and software have titles that describe topic or purpose.","2.4.3":"If content can be navigated sequentially and the navigation sequences affect meaning or operation, focusable components receive focus in an order that preserves meaning and operability.","2.4.4":"The purpose of each link can be determined from the link text alone or from the link text together with its programmatically determined link content.","2.4.5":"More than one way is available to locate a Web page within a set of Web pages, except where the Web Page is the result of, or a step in, a process.","2.4.6":"Headings and labels describe topic or purpose.","2.4.7":"Any keyboard operable user interface has a mode of operation where the keyboard focus indicator is visible.","2.4.11":"When an element receives focus, it is not entirely covered by other content.","2.5.1":"All functionality that uses multipoint or path-based gestures for operation can be operated with a single pointer without a path-based gesture.","2.5.2":"For functionality that can be operated using a single pointer, completion of the function is on the up-event with an ability to abort, undo or reverse the outcome.","2.5.3":"For user interface components with labels that include text or images of text, the accessible name contains the text that is presented visually.","2.5.4":"Functionality that can be operated by motion can also be operated by user interface components, and the motion trigger can be disabled.","2.5.8":"The size of the target for pointer inputs is at least 24 by 24 CSS pixels.","2.5.7":"All functionality that uses a dragging movement for operation can be achieved by a single pointer without dragging.","3.1.1":"The default human language of Web pages, non-Web documents, or software can be programmatically determined.","3.1.2":"The human language of each passage or phrase in the content can be programmatically determined.","3.2.1":"When any component receives focus, it does not initiate a change of context.","3.2.2":"Changing the setting of any user interface component does not automatically cause a change of context unless the user has been advised of the behavior before using the component.","3.2.3":"Navigational mechanisms that are repeated on multiple Web pages within a set of Web pages occur in the same relative order each time they are repeated, unless a change is initiated by the user.","3.2.4":"Components that have the same functionality within a set of Web pages are identified consistently.","3.2.6":"Make it easier to find help and support. If a Web page contains help mechanisms they occur in the same order relative to other page content, unless a change is initiated by the user.","3.3.1":"If an input error is automatically detected, the item that is in error is identified and the error is described to the user in text.","3.3.2":"Labels or instructions are provided when content requires user input.","3.3.3":"If an input error is automatically detected and suggestions for correction are known, then the suggestions are provided to the user, unless it would jeopardize the security or purpose of the content.","3.3.4":"For content that cause legal commitments or financial transactions for the user to occur, that modify or delete user-controllable data in data storage systems, or that submit user test responses, the user can reverse, correct, or confirm the action.","3.3.7":"Make it easier for users to complete multi-step processes. Don't ask for the same information twice in the same session.","3.3.8":"Make logins possible with less mental effort. Don't make people solve, recall, or transcribe something to log in.","4.1.1":"(Obsolete and removed) This requirement was originally adopted to address problems that assistive technology (AT) had directly parsing HTML. AT no longer has any need to directly parse HTML. Consequently, these problems either no longer exist or are addressed by other requirements.","4.1.2":"For all user interface components (including, but not limited to: form elements, links and components generated by scripts), the name and role can be programmatically determined; states, properties, and values that can be set by the user can be programmatically set; and notification of changes to these items is available to user agents, including assistive technologies.","4.1.3":"In content implemented using markup languages, status messages can be programmatically determined through role or properties such that they can be presented to the user by assistive technologies without receiving focus.",HTML:"The HTML specification issues that cause accessibility issues may be covered by other rules and will be reported under those accessibility requirements. However, some non-conforming HTML specification issues are still reported.",ARIA:"The ARIA specification issues that cause accessibility issues may be covered by other rules and will be reported under those accessibility requirements. However, some non-conforming ARIA specification issues are still reported."};t.a11yRulesets=[{id:"EXTENSIONS",name:"Extension Rules",category:o.eGuidelineCategory.ACCESSIBILITY,description:"Rules for enabling the browser extensions",type:o.eGuidelineType.EXTENSION,checkpoints:[{num:"1",name:"Extension CP 1",wcagLevel:"A",summary:"Rules for Extension"}]},{id:"IBM_Accessibility",name:"IBM Accessibility 7.3",category:o.eGuidelineCategory.ACCESSIBILITY,description:"Rules for WCAG 2.0, 2.1, 2.2 A and AA plus additional IBM supplemental requirements.",checkpoints:s.filter(function(e){return!("A"!==e.level&&"AA"!==e.level&&"NA"!==e.level||"2.0"!==e.wcagType&&"2.1"!==e.wcagType&&"2.2"!==e.wcagType&&"NA"!==e.wcagType)}).map(function(e){return{num:e.num,scId:e.scId,name:e.handle,wcagLevel:e.level,summary:d[e.num]}})},{id:"IBM_Accessibility_next",name:"IBM Accessibility next",category:o.eGuidelineCategory.ACCESSIBILITY,description:"Rules for WCAG 2.0, 2.1, 2.2 A and AA plus additional IBM supplemental requirements.",checkpoints:s.filter(function(e){return!("A"!==e.level&&"AA"!==e.level&&"NA"!==e.level||"2.0"!==e.wcagType&&"2.1"!==e.wcagType&&"2.2"!==e.wcagType&&"NA"!==e.wcagType)}).map(function(e){return{num:e.num,scId:e.scId,name:e.handle,wcagLevel:e.level,summary:d[e.num]}})},{id:"WCAG_2_2",name:"WCAG 2.2 (A, AA)",category:o.eGuidelineCategory.ACCESSIBILITY,description:"Rules for WCAG 2.2 A & AA. This is the current W3C recommendation (specification). Content that conforms to WCAG 2.2 also conforms to WCAG 2.1.",checkpoints:s.filter(function(e){return!("A"!==e.level&&"AA"!==e.level||"2.0"!==e.wcagType&&"2.1"!==e.wcagType&&"2.2"!==e.wcagType)}).map(function(e){return{num:e.num,scId:e.scId,name:e.handle,wcagLevel:e.level,summary:d[e.num]}})},{id:"WCAG_2_1",name:"WCAG 2.1 (A, AA)",category:o.eGuidelineCategory.ACCESSIBILITY,description:"Rules for WCAG 2.1 A & AA. Content that conforms to WCAG 2.1 also conforms to WCAG 2.0.",checkpoints:s.filter(function(e){return!("A"!==e.level&&"AA"!==e.level||"2.0"!==e.wcagType&&"2.1"!==e.wcagType)}).map(function(e){return{num:e.num,scId:e.scId,name:e.handle,wcagLevel:e.level,summary:d[e.num]}})},{id:"WCAG_2_0",name:"WCAG 2.0 (A, AA)",category:o.eGuidelineCategory.ACCESSIBILITY,description:"Rules for WCAG 2.0 A & AA. Referenced by US Section 508, but not the latest W3C recommendation.",checkpoints:s.filter(function(e){return("A"===e.level||"AA"===e.level)&&"2.0"===e.wcagType}).map(function(e){return{num:e.num,scId:e.scId,name:e.handle,wcagLevel:e.level,summary:d[e.num]}})}]},5233(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.SRController=void 0;var a=i(8195),n=i(7014),l=i(248),r=i(4566),o=i(2165),s=i(3946),u=function(){function e(e){void 0===e&&(e=document.body),this.rootElement=e,this.liveListeners=[],this.ctrlDoc=e.ownerDocument,this.setPointOfRegard(e),this.setupMutationTracking(),console.info('[WARNING] The SRController is a new feature that is not yet "stable". What this means:\n* API subject to change, even between minor versions of the checker\n* Results should be considered experimental. There are a variety of known issues, but making this available for early experimentation / feedback.')}return e.getController=function(t){return void 0===t&&(t=document),this.singleton||(this.singleton=new e(t.body)),this.singleton},e.prototype.disconnect=function(){this.mutationObserver&&this.mutationObserver.disconnect()},e.prototype.findAllShadowRoots=function(e){void 0===e&&(e=document);for(var t,i=[],a=this.ctrlDoc.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,null);t=a.nextNode();){var n=t;if(n.shadowRoot){i.push(n.shadowRoot);var l=this.findAllShadowRoots(n.shadowRoot);i.push.apply(i,l)}}return i},e.prototype.setupMutationTracking=function(){var e=this;this.mutationObserver&&this.mutationObserver.disconnect();var t=this,i=new MutationObserver(function(l){for(var r=t.pointOfRegard.getNode(),o=function(e){e.removedNodes.forEach(function(t){(t.isSameNode(r)||t.contains(r))&&(console.info("Adjusting PoR due to DOM mutation removing PoR"),r=e.target)})},u=0,d=l.filter(function(e){var t;return(null===(t=e.removedNodes)||void 0===t?void 0:t.length)>0});u<d.length;u++)o(d[u]);e.setPointOfRegard(r);for(var c=function(t){t.addedNodes&&t.addedNodes.forEach(function(t){for(var a=0,n=e.findAllShadowRoots(t);a<n.length;a++){var l=n[a];i.observe(l,{childList:!0,subtree:!0,characterData:!0})}});var l=t.target,r=1===l.nodeType?l:l.parentElement;if(r&&!r.closest('[aria-busy="true"]')&&"true"!==r.getAttribute("aria-busy")){var o=(["polite","assertive"].includes(r.getAttribute("aria-live"))||"OUTPUT"===r.nodeName.toUpperCase()||["status","log","progressbar","alert","timer"].includes(r.getAttribute("role")))&&r||r.closest('[aria-live="polite"],[aria-live="assertive"],output,[role="status"],[role="log"],[role="progressbar"],[role="alert"],[role="timer"]'),u=!1,d=["additions","text"];if(o){var c=r.closest("[aria-relevant]");c&&(d=c.getAttribute("aria-relevant").split(/ +/g)),"log"===o.getAttribute("role")&&(d=["additions"]),o.hasAttribute("aria-relevant")&&(d=o.getAttribute("aria-relevant").split(/ +/g)),d.includes("all")&&(d=["additions","removals","text"]),u=3===t.target.nodeType&&d.includes("text")||t.addedNodes.length>0&&d.includes("additions")||t.removedNodes.length>0&&d.includes("removals")}if(o&&u){var m="true"===o.getAttribute("aria-atomic")||["alert","status","timer","marquee"].includes(o.getAttribute("role"));if(m||"characterData"!==t.type||3!==t.target.nodeType||s.VisUtil.isNodeHiddenFromAT(t.target.parentElement)){var p=m?o:t.target;p.liveAnnounce&&clearTimeout(p.liveAnnounce),p.liveAnnounce=setTimeout(function(){var i=[],l=d.includes("removals")&&t.removedNodes.length>0;if(m||l){var r=new a.SRCursor(p,!1),o=new a.SRCursor(p,!0);o.next(function(){return!0}),i.push((l?"[removed] ":"")+n.SRRenderer.renderRange("item",r,o))}else d.includes("additions")&&t.addedNodes.length>0&&t.addedNodes.forEach(function(e){var t=new a.SRCursor(e,!1),l=new a.SRCursor(e,!0);l.next(function(){return!0}),i.push(n.SRRenderer.renderRange("item",t,l))});for(var s=0,u=e.liveListeners;s<u.length;s++)(0,u[s])(i.join("\n"))},100)}else for(var h=0,g=e.liveListeners;h<g.length;h++)(0,g[h])(t.target.nodeValue)}}},m=0,p=l;m<p.length;m++)c(p[m])}),l=this.findAllShadowRoots(this.ctrlDoc.documentElement);l.push(this.ctrlDoc.documentElement);for(var r=0,o=l;r<o.length;r++){var u=o[r];i.observe(u,{childList:!0,subtree:!0,characterData:!0})}},e.prototype.addLiveListener=function(e){this.liveListeners.push(e)},e.prototype.removeLiveListener=function(e){this.liveListeners=this.liveListeners.filter(function(t){return t!==e})},e.prototype.getPointOfRegard=function(){return this.pointOfRegard},e.prototype.setPointOfRegard=function(t){var i;try{this.pointOfRegard=new a.SRCursor(t);var l=e.diffContainers("focus",this.pointOfRegard),r=this.pointOfRegard.getRole(),o=null===(i=this.pointOfRegard.getNameInfo())||void 0===i?void 0:i.name;return{success:!0,renderingResult:n.SRRenderer.renderCurrent("focus",this.pointOfRegard,l),role:r,name:o}}catch(e){return{success:!1,renderingResult:{start:this.pointOfRegard.clone(),end:this.pointOfRegard.clone(),message:"Failed to set point of regard: ".concat(e.message)}}}},e.prototype.jumpNext=function(t){var i;r.CacheUtil.clearCaches(this.ctrlDoc.documentElement);var a=this.pointOfRegard.clone();try{for(var o=!0,s=this.pointOfRegard.clone(),u=void 0;o&&s;){var d=s.clone();if(s=l.SRNavigator.jumpNext(t,s)){var c=e.diffContainers(t,s,d);"item"!==t||l.SRNavigator.getStartFunc(t)(s.getRole(),!s.isEndTag(),s.getNode())||(c={entering:[],leaving:[]}),o=0===(u=n.SRRenderer.renderCurrent(t,s,c)).message.trim().length&&!["region"].includes(t)}}if(s)return this.pointOfRegard=s,{success:!0,renderingResult:u,role:this.pointOfRegard.getRole(),name:null===(i=this.pointOfRegard.getNameInfo())||void 0===i?void 0:i.name};this.pointOfRegard=a;var m=n.SRRenderer.renderCurrent(t,a,{leaving:[],entering:[]});return{success:!1,renderingResult:{start:a.clone(),end:a.clone(),message:"No next ".concat(t,". ").concat((null==m?void 0:m.message)||"")}}}catch(e){return console.error(e),this.pointOfRegard=a,{success:!1,renderingResult:{start:a.clone(),end:a.clone(),message:"Navigation error: ".concat(e.message)}}}finally{console.groupEnd()}},e.prototype.jumpPrevious=function(t){var i;r.CacheUtil.clearCaches(this.ctrlDoc.documentElement);var a=this.pointOfRegard.clone();try{for(var o=!0,s=this.pointOfRegard.clone(),u=void 0;o&&s;){var d=s.clone();if(s=l.SRNavigator.jumpPrevious(t,s)){var c=e.diffContainers(t,s,d);"item"!==t||l.SRNavigator.getStartFunc(t)(s.getRole(),!s.isEndTag(),s.getNode())||(c={entering:[],leaving:[]}),o=0===(u=n.SRRenderer.renderCurrent(t,s,c)).message.trim().length&&!["region"].includes(t)}}if(s)return this.pointOfRegard=s,{success:!0,renderingResult:u,role:this.pointOfRegard.getRole(),name:null===(i=this.pointOfRegard.getNameInfo())||void 0===i?void 0:i.name};this.pointOfRegard=a;var m=n.SRRenderer.renderCurrent(t,a,{leaving:[],entering:[]});return{success:!1,renderingResult:{start:a.clone(),end:a.clone(),message:"No previous ".concat(t,". ").concat((null==m?void 0:m.message)||"")}}}catch(e){return console.error(e),this.pointOfRegard=a,{success:!1,renderingResult:{start:a.clone(),end:a.clone(),message:"Navigation error: ".concat(e.message)}}}},e.diffContainers=function(t,i,l){var r=[],o=[];try{var s=i?i.getNode().ownerDocument.body||i.getNode().ownerDocument.documentElement:l?l.getNode().ownerDocument.body||l.getNode().ownerDocument.documentElement:document.body||document.documentElement,u=i?i.clone():new a.SRCursor(s),d=l?l.clone():new a.SRCursor(s);if(!u.getNode().isSameNode(d.getNode())){var c=e.commonParent(u,d);if(c){for(;c.contains(u);)o.push(n.SRRenderer.renderEnter(t,u,d)),u.parent();for(o.reverse(),o=o.filter(function(e){return e&&e.trim().length>0}).map(function(e){return e.trim()});c.contains(d);)r.push(n.SRRenderer.renderLeave(t,d,d)),d.parent();r=r.filter(function(e){return e&&e.trim().length>0}).map(function(e){return e.trim()})}}}catch(e){console.error(e)}return{leaving:r,entering:o}},e.commonParent=function(e,t){if(e.contains(t))return e.clone();if(t.contains(e))return t.clone();for(var i=e.clone();!i.contains(t)&&i.parent(););return i.contains(e)&&i.contains(t)?i:null},e.renderAll=function(t){var i=e.getController();i.ctrlDoc.body.querySelectorAll("dialog,[role='dialog']").forEach(function(e){o.SRUtil.isModalDialogElement(e)&&i.setPointOfRegard(e)});var a=[],l=n.SRRenderer.renderCurrent(t,i.getPointOfRegard(),{entering:[],leaving:[]});l&&a.push(l.message);for(var r=!0;r;){var s=i.jumpNext(t);s.success?a.push(s.renderingResult.message):r=!1}return a},e.renderAllDetail=function(t,i){var a=e.getController(t);a.setPointOfRegard(t.body),t.body.querySelectorAll("dialog,[role='dialog']").forEach(function(e){o.SRUtil.isModalDialogElement(e)&&a.setPointOfRegard(e)});var l=[],r=n.SRRenderer.renderCurrent(i,a.getPointOfRegard(),{entering:[],leaving:[]});r&&l.push(r);for(var s=!0;s;){var u=a.jumpNext(i);u.success?l.push(u.renderingResult):s=!1}return l},e.renderStructure=function(t){for(var i,n=["region","heading","item","tab_focus","image"],l=n.map(function(i){return e.renderAllDetail(t,i)}),r=[],s=function(){var e=null===(i=l[0][0])||void 0===i?void 0:i.start;n.forEach(function(t,i){l[i].length>0&&(!e||a.SRCursor.compare(l[i][0].start,e)<0)&&(e=l[i][0].start)});var s={},u=!1;if(n.forEach(function(t,i){s[t]="",l[i].length>0&&0===a.SRCursor.compare(l[i][0].start,e)&&(s[t]=l[i].shift().message,u=""!==s[t])}),u){var d=e.getElement(),c=d&&o.SRUtil.getUniqueSelector(d);c&&t.querySelector(c)&&(s.selector=c),r.push(s)}};l.some(function(e){return e.length>0});)s();return r},e}();t.SRController=u},8195(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.SRCursor=void 0;var a=i(3864),n=i(1950),l=i(7011),r=i(7139),o=i(2165),s=function(){function e(e,t){this.walker=new a.DOMWalker(e,t,void 0,!1),e&&this.refreshName()}return e.prototype.clone=function(){var t=new e(this.walker.node,this.walker.bEndTag);return t.role=this.role,t.name=this.name,t},e.prototype.refreshName=function(){1===this.walker.node.nodeType?(this.role=l.AriaUtil.getResolvedRole(this.walker.node,!0),this.name=n.AccNameUtil.computeAccessibleName(this.walker.node)):3===this.walker.node.nodeType?(this.role="text",this.name={name:this.walker.node.textContent,nameFrom:"text"}):(this.role=void 0,this.name=void 0)},e.prototype.next=function(e,t){var i,a=!1;this.refreshName();var n=t&&t(this)||{skipCurrent:!1,skipChildren:!1},r=n.skipCurrent,s=n.skipChildren;do{if(s&&!this.walker.bEndTag)this.walker.bEndTag=!0;else if(!this.walker.nextNode())break;if(this.refreshName(),r=(i=t&&t(this)||{skipCurrent:!1,skipChildren:!1}).skipCurrent,s=i.skipChildren,1===this.walker.node.nodeType?this.role=l.AriaUtil.getResolvedRole(this.walker.node,!0):3===this.walker.node.nodeType&&(this.role="text"),o.SRUtil.isModalDialogElement(this.getNode())&&this.isEndTag())break;r||(a=e(this.role,!this.walker.bEndTag,this.walker.node))}while(!a);return a?this.refreshName():(this.role=void 0,this.name=void 0),a},e.prototype.previous=function(e,t){var i,a=!1;this.refreshName();var n=t&&t(this)||{skipCurrent:!1,skipChildren:!1},r=n.skipCurrent,s=n.skipChildren;do{if(s&&this.walker.bEndTag)this.walker.bEndTag=!1;else if(!this.walker.prevNode())break;if(this.refreshName(),r=(i=t&&t(this)||{skipCurrent:!1,skipChildren:!1}).skipCurrent,s=i.skipChildren,1===this.walker.node.nodeType?this.role=l.AriaUtil.getResolvedRole(this.walker.node,!0):3===this.walker.node.nodeType&&(this.role="text"),o.SRUtil.isModalDialogElement(this.getNode())&&!this.isEndTag())break;r||(a=e(this.role,!this.walker.bEndTag,this.walker.node))}while(!a);return a?this.refreshName():(this.role=void 0,this.name=void 0),a},e.prototype.parent=function(e){return!!this.walker.node.parentNode&&(this.walker.node=this.walker.node.parentNode,this.walker.bEndTag=!0===e,1===this.walker.node.nodeType?(this.role=l.AriaUtil.getResolvedRole(this.walker.node,!0),this.name=n.AccNameUtil.computeAccessibleName(this.walker.node)):3===this.walker.node.nodeType?(this.role="text",this.name={name:this.walker.node.textContent,nameFrom:"text"}):(this.role=void 0,this.name=void 0),!0)},e.prototype.getCurrentOrParentByRole=function(e,t){for(var i=this,a=t?t.map(function(e){return e.toUpperCase()}):[],n=function(t){var n=t.getElement();return e.includes(i.getRole())||n&&!n.hasAttribute("role")&&a.includes(n.nodeName.toUpperCase())};!n(this)&&this.parent(););return n(this)},e.prototype.getCurrentOrParentByRoleClone=function(e,t){var i=this.clone();return i.getCurrentOrParentByRole(e,t)?i:null},e.prototype.getCurrentOrParentTabbableClone=function(){for(var e=this.clone();e;){var t=e.getElement();if(e.isStartTag()&&t&&r.CommonUtil.isTabbable(t))return e;if(!e.parent(!1))break}return null},e.prototype.getRole=function(){return this.role},e.prototype.getNameInfo=function(){return this.name},e.prototype.getName=function(){var e=this.getNameInfo();if(e&&e.name)return e.name;var t=this.getElement();if(t){var i=r.CommonUtil.getLabelForElementHidden(t,!0);if(i)return i.innerText||i.textContent}},e.prototype.setEndTag=function(e){this.walker.bEndTag=e},e.prototype.getNode=function(){return this.walker.node},e.prototype.getElement=function(){if(this.walker.node&&1===this.walker.node.nodeType)return this.walker.node},e.prototype.getParentElement=function(){if(!this.walker.node)return null;var e=this.clone();return e.walker.node=a.DOMWalker.parentElement(e.walker.node),e},e.prototype.isEndTag=function(){return this.walker.bEndTag},e.prototype.isStartTag=function(){return!this.walker.bEndTag},e.compare=function(e,t){var i,n,l=null===(i=null==e?void 0:e.walker)||void 0===i?void 0:i.node,r=null===(n=null==t?void 0:t.walker)||void 0===n?void 0:n.node;if(!l&&!r)return 0;if(!l)return 1;if(!r)return-1;var o=l.compareDocumentPosition(r);if(1&o){for(var s=[l],u=[r],d=l;d=a.DOMWalker.parentNode(d);)s.push(d);for(d=r;d=a.DOMWalker.parentNode(d);)u.push(d);s.reverse(),u.reverse();for(var c=0;c<s.length&&c<u.length&&s[c]===u[c];)c++;if(c===s.length)return e.walker.bEndTag?1:-1;if(c===u.length)return t.walker.bEndTag?-1:1;if(c>0){var m=s[c],p=u[c],h=m.compareDocumentPosition(p);if(2&h)return 1;if(4&h)return-1}return 0}return 8&o?t.walker.bEndTag?-1:1:16&o?e.walker.bEndTag?1:-1:2&o?1:4&o?-1:0},e.prototype.contains=function(e){return this.getNode().contains(e.getNode())&&!this.isSameNode(e)},e.prototype.isSameNode=function(e){return!!e&&this.getNode().isSameNode(e.getNode())},e.prototype.hasNonEmptyName=function(){var e;return((null===(e=this.getNameInfo())||void 0===e?void 0:e.name)||"").trim().length>0},e}();t.SRCursor=s},248(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.SRNavigator=void 0;var a=i(3864),n=i(1950),l=i(8195),r=i(7139),o=i(3946),s=i(7011);!function(e){function t(e){var i;if(1!==e.nodeType)return!1;if("br"===e.nodeName.toLowerCase())return!0;var n=e,l=n.ownerDocument.defaultView,r=null===(i=l.getComputedStyle(n))||void 0===i?void 0:i.display;if(r&&r.startsWith("table"))return!0;if("block"===r&&"block"!==n.style.display&&n.parentElement&&"flex"===l.getComputedStyle(n.parentElement).display)return!1;if("link"===s.AriaUtil.getResolvedRole(n,!0)){var o=new a.DOMWalker(e,!1,void 0,!1);if(o.prevNode(),!t(o.node))return!0}return["block","flex","grid","list-item"].includes(r)}function i(e){if(!e||1!==e.nodeType)return null;var t=e;if(!t.hasAttribute("tabindex"))return null;var i=parseInt(t.getAttribute("tabindex"),10);return Number.isNaN(i)?null:i}function u(e){if(!e||1!==e.nodeType)return!1;var t=e,a=i(t);return(null===a||0===a)&&r.CommonUtil.isTabbable(t)}function d(e){return void 0===e&&(e=!0),function(t,i,a){return!!(a&&1===a.nodeType&&i&&r.CommonUtil.isTabbable(a))&&(e||u(a))}}function c(e,t){var a=((null==t?void 0:t.ownerDocument)||document).body||t;if(!a)return[];var n=new l.SRCursor(a,!1),o=b("tab_focus"),s=[],d=[],c=function(t){e(t.getRole(),!t.isEndTag(),t.getNode())&&(function(e){if(!e||1!==e.nodeType)return!1;var t=e,a=i(t);return null!==a&&a>0&&r.CommonUtil.isTabbable(t)}(t.getNode())?s.push(t.clone()):u(t.getNode())&&d.push(t.clone()))};for(c(n);n.next(function(){return!0},o);)c(n);return s.sort(function(e,t){var a=e.getElement(),n=t.getElement(),r=i(a)||0,o=i(n)||0;return r!==o?o-r:l.SRCursor.compare(e,t)}),s.concat(d)}function m(e,t){return e.findIndex(function(e){return 0===l.SRCursor.compare(e,t)})}function p(e){switch(e){case"link":return function(e,t){return t&&"link"===e};case"tab_focus":return d(!1);case"heading":return function(e,t){return t&&"heading"===e};case"h1":return function(e,t,i){return t&&"heading"===e&&"1"===i.ariaLevel};case"h2":return function(e,t,i){return t&&"heading"===e&&"2"===i.ariaLevel};case"h3":return function(e,t,i){return t&&"heading"===e&&"3"===i.ariaLevel};case"h4":return function(e,t,i){return t&&"heading"===e&&"4"===i.ariaLevel};case"h5":return function(e,t,i){return t&&"heading"===e&&"5"===i.ariaLevel};case"h6":return function(e,t,i){return t&&"heading"===e&&"6"===i.ariaLevel};case"image":return function(e,t){return t&&["img","graphics-document"].includes(e)};case"radio":return function(e,t){return t&&"radio"===e};case"button":return function(e,t){return t&&"button"===e};case"checkbox":return function(e,t){return t&&"checkbox"===e};case"combo":return function(e,t){return t&&"combobox"===e};case"list":return function(e,t){return t&&"list"===e};case"listitem":return function(e,t){return t&&"listitem"===e};case"article":return function(e,t){return t&&"article"===e};case"table":return function(e,t){return t&&"table"===e};case"paragraph":return function(e,t,i){return t&&"P"===i.nodeName.toUpperCase()};case"dom":return function(){return!0};case"item":return function(e,i,n){if(!i)return!1;if(t(n))return!0;var l=new a.DOMWalker(n,!i);return!(!l.prevNode()||!l.bEndTag)&&t(l.node)};case"region":return function(e,t,i){var a,l;return!!t&&(!!["main","navigation","form","banner","search","contentinfo"].includes(e)||"region"===e&&1===(null==i?void 0:i.nodeType)&&!!(null===(l=null===(a=n.AccNameUtil.computeAccessibleName(i))||void 0===a?void 0:a.name)||void 0===l?void 0:l.trim()))};case"formcontrol":case"editbox":case"graphic":case"frame":case"division":case"tabcontrol":case"separator":case"clickable":case"mouseover":throw new Error("NOT_IMPLEMENTED")}}e.getStartFunc=p;var h=function(e){var t;try{var i=e.getNode().nodeType,n=e.getElement(),l=e.clone();if(l.setEndTag(!1),[4,8].includes(i))return{skipCurrent:!0,skipChildren:!0};if(![1,3].includes(i))return{skipCurrent:!0,skipChildren:!1};if(3===i&&!(n=e.getNode().parentElement))return o.VisUtil.isNodeHiddenFromAT(n)?{skipCurrent:!0,skipChildren:!1}:null;if(!(n.closest("body")||(t=n,t.getRootNode()instanceof ShadowRoot)))return{skipCurrent:!0,skipChildren:!1};if(n.closest("script,style"))return{skipCurrent:!0,skipChildren:!0};var r=l.getCurrentOrParentByRoleClone(["heading","link"]),u=s.AriaUtil.getResolvedRole(n),d="heading"===u||"link"===u;if(r){r.getElement();var c=r.getNameInfo();if(c&&!["content","text"].includes(c.nameFrom)){if(o.VisUtil.isNodeHiddenFromAT(n))return{skipCurrent:!0,skipChildren:!0};if(!o.VisUtil.isNodeVisible(n))return{skipCurrent:!0,skipChildren:!0}}else if(d);else{var m=s.AriaUtil.getResolvedRole(n);if(("img"===m||"graphics-document"===m)&&o.VisUtil.isNodeHiddenFromAT(n))return{skipCurrent:!0,skipChildren:!0}}}else{if(o.VisUtil.isNodeHiddenFromAT(n))return{skipCurrent:!0,skipChildren:1===i};if(!o.VisUtil.isNodeVisible(n))return{skipCurrent:!0,skipChildren:1===i}}if("BODY"===n.nodeName.toUpperCase())return{skipCurrent:!1,skipChildren:!1};if("LABEL"===n.nodeName.toUpperCase()){if(n.hasAttribute("for")&&document.getElementById(n.getAttribute("for"))&&"hidden"!==document.getElementById(n.getAttribute("for")).getAttribute("type"))return{skipCurrent:!0,skipChildren:!1};var p=n.querySelector("input, select, textarea, button, [role='checkbox'], [role='combobox'], [role='listbox'], [role='menuitemcheckbox'], [role='menuitemradio'], [role='radio'], [role='searchbox'], [role='slider'], [role='spinbutton'], [role='switch'], [role='textbox']");if(p&&"hidden"!==p.getAttribute("type"))return{skipCurrent:!0,skipChildren:!1}}var h=n.closest("label[for]"),g=h&&h.getAttribute("for");if(h&&g&&document.getElementById(g)&&"hidden"!==document.getElementById(g).getAttribute("type")&&!n.closest("a[href], [role='link'], button, [role='button']"))return{skipCurrent:!0,skipChildren:1===i};var b=l.getRole();if(s.AriaUtil.containsPresentationalChildrenOnly(n))return{skipCurrent:!1,skipChildren:!0};if(["link","heading"].includes(b)&&(!l.getName()||!["content","text"].includes(l.getNameInfo().nameFrom))&&!(r&&r.getNameInfo()&&["content","text"].includes(r.getNameInfo().nameFrom)))return{skipCurrent:!1,skipChildren:!0};if("LEGEND"===n.nodeName.toUpperCase())for(var _=a.DOMWalker.parentElement(e.getNode());_;){if("FIELDSET"===_.nodeName.toUpperCase())return{skipCurrent:!1,skipChildren:!0};_=a.DOMWalker.parentElement(_)}return n&&"MSUP"===n.nodeName.toUpperCase()?{skipCurrent:!1,skipChildren:!0}:n.closest(".ibma-sr-overlay")?{skipCurrent:!0,skipChildren:!0}:null}finally{}},g=function(e){var t=e.getNode().nodeType,i=e.getElement();if(1!==t&&3!==t)return{skipCurrent:!0,skipChildren:!1};if(3===t)return o.VisUtil.isNodeHiddenFromAT(i)?{skipCurrent:!0,skipChildren:!1}:null;if(o.VisUtil.isNodeHiddenFromAT(i))return{skipCurrent:!0,skipChildren:!0};if("LABEL"===i.nodeName.toUpperCase()&&i.hasAttribute("for")&&document.getElementById(i.getAttribute("for"))&&"hidden"!==document.getElementById(i.getAttribute("for")).getAttribute("type"))return{skipCurrent:!0,skipChildren:!1};var a=i.closest("label[for]"),n=a&&a.getAttribute("for");return a&&n&&document.getElementById(n)&&"hidden"!==document.getElementById(n).getAttribute("type")&&!i.closest("a[href], [role='link'], button, [role='button']")?{skipCurrent:!0,skipChildren:1===t}:(e.getRole(),s.AriaUtil.containsPresentationalChildrenOnly(i)?{skipCurrent:!1,skipChildren:!0}:i&&"MSUP"===i.nodeName.toUpperCase()||i.closest(".ibma-sr-overlay")?{skipCurrent:!0,skipChildren:!0}:null)};function b(e){switch(e){case"region":case"item":return h;case"link":case"tab_focus":case"heading":case"h1":case"h2":case"h3":case"h4":case"h5":case"h6":case"image":return g;case"radio":case"button":case"checkbox":case"combo":case"list":case"listitem":case"article":case"table":case"paragraph":case"dom":case"formcontrol":case"editbox":case"graphic":case"frame":case"division":case"tabcontrol":case"separator":case"clickable":case"mouseover":throw new Error("NOT_IMPLEMENTED")}}function _(e,t){try{if("tab_focus"===e){var i=c(d(!0),t.getNode());if(i.length>0){var a=t.getCurrentOrParentTabbableClone(),n=a&&m(i,a)>=0?a:t.clone(),l=m(i,n);return l>=0?l+1<i.length?i[l+1].clone():null:i[0].clone()}}var r=t.clone(),o=p(e),s=b(e);return r.next(o,s)?r:null}finally{console.groupEnd()}}function f(e,t){if("tab_focus"===e){var i=t.clone(),a=p(e),n=b(e);if(i.previous(a,n))return i;var l=c(d(!0),t.getNode());if(l.length>0){var r=t.getCurrentOrParentTabbableClone(),o=r&&m(l,r)>=0?r:t.clone(),s=m(l,o);if(s>0)return l[s-1].clone()}return null}var u=t.clone(),h=p(e),g=b(e);return u.previous(h,g)?u:null}e.getSkipFunc=b,e.jumpCurrent=function(e,t){return("tab_focus"===e?d(!0):p(e))(t.getRole(),!t.isEndTag(),t.getNode())?t.clone():f(e,t)},e.jumpCurrentEnd=function(e,t){if("item"===e)return(r=_(e,t))?[r]:[];var i=t.getNameInfo(),a=t.clone();i&&!["content","text"].includes(i.nameFrom)||a.setEndTag(!0),a.next(function(){return!0});for(var n=[],r=_("item",t);r&&l.SRCursor.compare(r,a)<0;)n.push(r),r=_("item",r);return n.push(a),"tab_focus"===e&&"link"===t.getRole()?[n[n.length-1]]:n},e.jumpNext=_,e.jumpPrevious=f}(t.SRNavigator||(t.SRNavigator={}))},7014(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.SRRenderer=void 0;var a,n=i(7011),l=i(248),r=i(8195),o=i(2151),s=i(7242);(a=t.SRRenderer||(t.SRRenderer={})).renderEnter=function(e,t,i){for(var a=0,n=o.CONTAINER_ENTER_RULES;a<n.length;a++){var l=n[a].test(e,t,i);if(null!=l)return l}return null},a.renderLeave=function(e,t,i){for(var a=0,n=o.CONTAINER_EXIT_RULES;a<n.length;a++){var l=n[a].test(e,t,i);if(null!=l)return l}return null},a.renderCurrent=function(e,t,i){var n=l.SRNavigator.jumpCurrent(e,t);if(!n)return null;var r=l.SRNavigator.jumpCurrentEnd(e,n);r&&0!==r.length||(r=[null]);for(var o=r[r.length-1],s="",u=0,d=r;u<d.length;u++){var c=d[u],m=a.renderRange(e,n,c);if(m.trim().length>0){o=c,s=m;break}}return""===s&&(s=a.renderRange(e,n,o)),{start:n,end:o,message:(i.leaving||[]).concat(i.entering||[]).concat([s]).join(" ").replace(/\s+/g," ")}},a.renderRange=function(e,t,i){for(var a,u=t.clone(),d=[],c=!0,m=null;c;){var p=u.getElement(),h=u.getNode(),g=h.nodeType,b=n.AriaUtil.getAncestorWithRole(h,"link",!0);b&&!["content","text"].includes(null===(a=new r.SRCursor(b).getNameInfo())||void 0===a?void 0:a.nameFrom)&&(b=null);for(var _=0,f=o.SR_RULES;_<f.length;_++){var v=f[_].test(e,u);if(null!=v&&v.trim().length>0){1!==g||u.isEndTag()||"menu"!==p.getAttribute("aria-haspopup")||(v="[subMenu] "+v),"tab_focus"===e?m&&(!b||b&&m!==b)&&(v="".concat(v," ").concat((0,s.getLinkAnnouncement)(new r.SRCursor(m,!1)))):!b||m&&m===b||(v="".concat((0,s.getLinkAnnouncement)(new r.SRCursor(b,!1))," ").concat(v)),""!==v&&(m=b,d.push(v));break}}d.push([].filter(function(e){return e.trim().length>0}).join(" ")),c=u.next(function(){return!0},l.SRNavigator.getSkipFunc(e))&&r.SRCursor.compare(u,i)<0}"tab_focus"===e&&m&&d.push("".concat((0,s.getLinkAnnouncement)(new r.SRCursor(m,!1))));var A=d.filter(function(e){return e.trim().length>0}).join(" ");return A=(A=A.replace(/, \u0001([^\u0002]+)\u0002/g,function(e,t){var i='"'.concat(t,'"'),a=A.replace(e,"");return a.includes(i)||a.includes(t)?"":", ".concat(i)})).replace(/[\u0001\u0002]/g,"")}},328(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.SRRendererRule=void 0;var i=function(){function e(e){this.ruleDefinition=e}return e.prototype.test=function(e,t,i){if(this.ruleDefinition.modes.includes(e)&&(this.ruleDefinition.roles.includes(t.getRole())||this.ruleDefinition.elems.includes(t.getNode().nodeName.toUpperCase())))for(var a=0,n=this.ruleDefinition.tests;a<n.length;a++){var l=(0,n[a])(t,i,e);if("string"==typeof l)return l}return null},e}();t.SRRendererRule=i},369(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.SRTableUtil=void 0;var a=i(8195);!function(e){function t(e){return!!e.getElement()&&(!!["cell","rowheader","columnheader"].includes(e.getRole())||!e.getElement().hasAttribute("role")&&["TH","TD"].includes(e.getElement().nodeName.toUpperCase()))}function i(e){return e.getCurrentOrParentByRoleClone(["cell","rowheader","columnheader"],["TD","TH"])}function n(e){if(!t(e))return 0;var i=e.getElement().getAttribute("colspan");return i?parseInt(i):1}function l(e){if(!t(e))return 0;var i=e.getElement().getAttribute("rowspan");return i?parseInt(i):1}function r(e){var i=e.getCurrentOrParentByRoleClone(["table"]);if(!i)return null;for(var a,r=i.clone(),o=[],s=[];r.next(function(){return!0})&&!r.getNode().isSameNode(i.getNode());){if(r.isEndTag()&&"row"===r.getRole())for(o.push(s),a=s,s=[];a&&s.length<a.length&&a[s.length].rowIndexStart+a[s.length].rowspan-1>=o.length;)s.push(a[s.length]);if(!r.isEndTag()&&t(r)){for(var u=n(r),d={rowIndexStart:o.length,colIndexStart:s.length,rowspan:l(r),colspan:u,cellCursor:r.clone()},c=0;c<u;++c)s.push(d);for(;a&&s.length<a.length&&a[s.length].rowIndexStart+a[s.length].rowspan-1>=o.length;)s.push(a[s.length])}}return o}function o(e,t){var a=i(e);t||(t=r(e));for(var n=0;n<t.length;++n)for(var l=0;l<t[n].length;++l)if(t[n][l].cellCursor.isSameNode(a))return t[n][l];return null}function s(e,t){return t>=e.colIndexStart&&t<e.colIndexStart+e.colspan}function u(e,t){return t>=e.rowIndexStart&&t<e.rowIndexStart+e.rowspan}function d(e){var t=e.getElement();return!!t&&("cell"===e.getRole()||!t.hasAttribute("role")&&"TD"===t.nodeName.toUpperCase())}e.isCursorCellRole=t,e.getCurrentOrParentCellCursor=i,e.getColSpan=n,e.getRowSpan=l,e.getTableModel=r,e.getCellModel=o,e.cellModelContainsColumn=s,e.cellModelContainsRow=u,e.getRowHeaders=function(e){return""},e.getColumnHeadersForCursor=function(t,i){if(!i&&!(i=r(t)))return"";var n=o(t,i);if(!n)return"";var l=n.cellCursor;if(!l)return"";var u=l.getElement();if(!u)return"";for(var c=[],m=n.colIndexStart;m<n.colIndexStart+n.colspan;++m)c.push({potentialColHeaders:[],existsDataCell:!1,colIdx:m});var p=[];if(u.hasAttribute("headers"))p=u.getAttribute("headers").split(" ").map(function(e){return document.getElementById(e)}).filter(function(e){return!!e}).map(function(e){return new a.SRCursor(e)}).filter(function(t){return c.some(function(a){return s(e.getCellModel(t,i),a.colIdx)})});else{for(var h=0;h<i.length;++h)for(var g=function(e){var t=e.colIdx,a=i[h][t],n=a.cellCursor,r=n.getElement();if(!a||!n||n.isSameNode(l)||p.some(function(e){return n.isSameNode(e)}))return e.existsDataCell=e.existsDataCell||d(n)&&(n.hasNonEmptyName()||e.potentialColHeaders.length>0),"continue";var o=n.clone();"columnheader"===n.getRole()?(p.push(o),e.potentialColHeaders.push(o)):r.hasAttribute("role")||"TH"!==r.nodeName.toUpperCase()?e.existsDataCell=e.existsDataCell||d(n)&&(n.hasNonEmptyName()||e.potentialColHeaders.length>0):("col"===r.getAttribute("scope")||"axis"===r.getAttribute("scope")||!r.hasAttribute("scope")&&n.hasNonEmptyName())&&(p.push(o),e.potentialColHeaders.push(o))},b=0,_=c;b<_.length;b++)g(A=_[b]);for(var f=0,v=c;f<v.length;f++){var A;(A=v[f]).existsDataCell||(A.potentialColHeaders=[])}p=p.filter(function(e){return c.some(function(t){return t.potentialColHeaders.some(function(t){return t.isSameNode(e)})})})}return p.map(function(e){var t;return(null===(t=e.getNameInfo())||void 0===t?void 0:t.name)||""}).map(function(e){return e.trim()}).filter(function(e){return e.length>0}).join(", ")},e.getRowHeadersForCursor=function(t,i){if(!i&&!(i=r(t)))return"";var n=o(t,i);if(!n)return"";var l=n.cellCursor;if(!l)return"";var s=l.getElement();if(!s)return"";for(var c=[],m=n.rowIndexStart;m<n.rowIndexStart+n.rowspan;++m)c.push({potentialRowHeaders:[],existsDataCell:!1,rowIdx:m});var p=[];if(s.hasAttribute("headers"))p=s.getAttribute("headers").split(" ").map(function(e){return document.getElementById(e)}).filter(function(e){return!!e}).map(function(e){return new a.SRCursor(e)}).filter(function(t){return c.some(function(a){return u(e.getCellModel(t,i),a.rowIdx)})});else{for(var h=c.reduce(function(e,t){return Math.max(e,i[t.rowIdx].length)},0),g=0;g<h;++g)for(var b=function(e){var t=e.rowIdx;if(g>=i[t].length)return"continue";var a=i[t][g],n=a.cellCursor,r=n.getElement();if(!a||!n||n.isSameNode(l)||p.some(function(e){return n.isSameNode(e)}))return e.existsDataCell=e.existsDataCell||d(n)&&(n.hasNonEmptyName()||e.potentialRowHeaders.length>0),"continue";var o=n.clone();"rowheader"===n.getRole()?(p.push(o),e.potentialRowHeaders.push(o)):r.hasAttribute("role")||"TH"!==r.nodeName.toUpperCase()?e.existsDataCell=e.existsDataCell||d(n)&&(n.hasNonEmptyName()||e.potentialRowHeaders.length>0):("row"===r.getAttribute("scope")||"axis"===r.getAttribute("scope")||!r.hasAttribute("scope")&&n.hasNonEmptyName())&&(p.push(o),e.potentialRowHeaders.push(o))},_=0,f=c;_<f.length;_++)b(w=f[_]);for(var v=0,A=c;v<A.length;v++){var w;(w=A[v]).existsDataCell||(w.potentialRowHeaders=[])}p=p.filter(function(e){return c.some(function(t){return t.potentialRowHeaders.some(function(t){return t.isSameNode(e)})})})}return p.map(function(e){var t;return(null===(t=e.getNameInfo())||void 0===t?void 0:t.name)||""}).map(function(e){return e.trim()}).filter(function(e){return e.length>0}).join(", ")},e.isDataCell=d}(t.SRTableUtil||(t.SRTableUtil={}))},2165(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.SRUtil=void 0;var a,n=i(7011),l=i(3946);(a=t.SRUtil||(t.SRUtil={})).isModalDialogElement=function(e){if(1!==e.nodeType)return!1;var t=e;return"dialog"===n.AriaUtil.getResolvedRole(t,!0)&&"true"===t.getAttribute("aria-modal")&&l.VisUtil.isNodeVisible(e)},a.getUniqueSelector=function e(t,i){if(void 0===i&&(i=!1),t.id)return"#".concat(CSS.escape(t.id));if(t.isSameNode(document.documentElement)||t.isSameNode(document.body))return t.tagName.toLowerCase();var a=t.tagName.toLowerCase();if(t.classList.length&&!i&&(a+=Array.from(t.classList).slice(0,3).map(function(e){return".".concat(CSS.escape(e))}).join("")),!i){if(t.hasAttribute("role")&&(a+='[role="'.concat(CSS.escape(t.getAttribute("role")||""),'"]')),t.hasAttribute("aria-label")){var n=t.getAttribute("aria-label")||"";n.length<=20&&(a+='[aria-label="'.concat(CSS.escape(n),'"]'))}"input"===t.tagName.toLowerCase()&&t.hasAttribute("type")&&(a+='[type="'.concat(CSS.escape(t.getAttribute("type")||""),'"]'))}if(t.parentElement){var l=Array.from(t.parentElement.children).filter(function(e){return e.tagName===t.tagName});if(l.length>1){var r=l.indexOf(t)+1;a+=":nth-of-type(".concat(r,")")}return"".concat(e(t.parentElement,!0)," > ").concat(a)}return a}},8107(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.SRViewer=t.SROverlay=void 0;var a=i(5233),n=function(){function e(e){this.srViewer=e,this.navigationModes=[{mode:"item",label:"Item"},{mode:"tab_focus",label:"Tabbable"},{mode:"heading",label:"Heading"},{mode:"region",label:"Region"}],this.createOverlay()}return e.prototype.createDOMElement=function(e,t,i){var a=this.srViewer.viewerDoc.createElement(e);if(t)for(var n in t)a[n]=t[n];if(i)for(var n in i)a.style[n]=i[n];return a},e.prototype.createOverlay=function(){var e=this;this.container=this.createDOMElement("div",{className:"ibma-sr-overlay"},{position:"fixed",bottom:"0",left:"0",width:"100%",backgroundColor:"rgba(0, 0, 0, 0.8)",color:"white",padding:"10px",zIndex:"10000",display:"flex",flexDirection:"column",gap:"10px"});var t=this.createDOMElement("div",{},{display:"flex",flexWrap:"wrap",gap:"10px"});this.navigationModes.forEach(function(i){var a=e.createDOMElement("div",{},{display:"flex",alignItems:"center",gap:"5px",margin:"0 10px"});a.appendChild(e.createDOMElement("span",{textContent:i.label+":"},{}));var n=e.createDOMElement("button",{textContent:"◀ Prev"},{padding:"5px 10px",backgroundColor:"#444",color:"white",border:"none",borderRadius:"3px",cursor:"pointer"});n.addEventListener("click",function(){return e.srViewer.navigatePrevious(i.mode)}),a.appendChild(n);var l=e.createDOMElement("button",{textContent:"Next ▶"},{padding:"5px 10px",backgroundColor:"#444",color:"white",border:"none",borderRadius:"3px",cursor:"pointer"});l.addEventListener("click",function(){return e.srViewer.navigateNext(i.mode)}),a.appendChild(l),t.appendChild(a)});var i=this.createDOMElement("div",{},{display:"flex",alignItems:"center",gap:"5px",margin:"0 10px"}),a=this.createDOMElement("button",{textContent:"Show all"},{padding:"5px 10px",backgroundColor:"#444",color:"white",border:"none",borderRadius:"3px",cursor:"pointer"});a.addEventListener("click",function(){return e.srViewer.showAll(!0)}),i.appendChild(a);var n=this.createDOMElement("button",{textContent:"Toggle speech"},{padding:"5px 10px",backgroundColor:"#444",color:"white",border:"none",borderRadius:"3px",cursor:"pointer"});n.addEventListener("click",function(){return e.srViewer.toggleSpeech()}),i.appendChild(n),t.appendChild(i),this.resultsDisplay=this.createDOMElement("div",{textContent:"Screen reader simulation results will appear here."},{padding:"10px",backgroundColor:"rgba(255, 255, 255, 0.1)",borderRadius:"3px",minHeight:"100px",maxHeight:"50vh",fontFamily:"monospace",overflow:"auto"}),this.container.appendChild(t),this.container.appendChild(this.resultsDisplay),this.srViewer.viewerDoc.body.appendChild(this.container)},e.prototype.displayResult=function(e,t,i){var a,n,l,r,o="";e.success,o="".concat(i.toUpperCase()," ").concat(t,": ").concat(e.renderingResult.message),null===(n=null===(a=e.renderingResult.end)||void 0===a?void 0:a.getElement())||void 0===n||n.scrollIntoView(),null===(r=null===(l=e.renderingResult.start)||void 0===l?void 0:l.getElement())||void 0===r||r.scrollIntoView(),window.scrollBy(0,-200),this.resultsDisplay.innerHTML="",this.resultsDisplay.textContent=o;var s=this.createDOMElement("button",{innerText:"Debug"},{});s.addEventListener("click",function(){var t,i;console.log(null===(t=e.renderingResult.start)||void 0===t?void 0:t.getNode(),null===(i=e.renderingResult.end)||void 0===i?void 0:i.getNode())}),this.resultsDisplay.appendChild(s)},e.prototype.displayAll=function(e){for(var t=this,i=this.createDOMElement("table",{},{}),a=this.createDOMElement("tr",{},{}),n=["region","heading","item","tab_focus"],l=0,r=["Region","Heading","Item","Tabbable"];l<r.length;l++){var o=r[l];a.appendChild(this.createDOMElement("th",{scope:"col",innerText:o},{textAlign:"left",padding:".25rem",margin:"0rem",color:"white"})),i.appendChild(a)}for(var s=function(e){var a=u.createDOMElement("tr",{},{});n.forEach(function(i){a.appendChild(t.createDOMElement("td",{innerText:e[i]},{verticalAlign:"top",border:"solid white 1px",padding:".25rem",margin:"0rem",color:"white"}))}),i.appendChild(a)},u=this,d=0,c=e;d<c.length;d++)s(c[d]);this.resultsDisplay.innerHTML="",this.resultsDisplay.appendChild(i)},e.prototype.destroy=function(){this.container&&this.container.parentNode&&this.container.parentNode.removeChild(this.container)},e}();t.SROverlay=n;var l=function(){function e(e){void 0===e&&(e=document.body),this.isStreaming=!1,this.isShowingAll=!1,this.speechEnabled=!1,this.viewerDoc=e.ownerDocument,this.controller=a.SRController.getController(this.viewerDoc),this.overlay=new n(this),this.setupKeyboardHandlers(),this.setupFocusTracking(),this.setupMutationTracking()}return e.prototype.showAll=function(e){e&&(this.isShowingAll=!0);var t=a.SRController.renderStructure(this.viewerDoc);this.overlay.displayAll(t)},e.prototype.toggleSpeech=function(){this.speechEnabled=!this.speechEnabled},e.prototype.navigateNext=function(e){this.isShowingAll=!1;var t=this.controller.jumpNext(e);this.overlay.displayResult(t,e,"next"),this.speakResult(t)},e.prototype.navigatePrevious=function(e){this.isShowingAll=!1;var t=this.controller.jumpPrevious(e);this.overlay.displayResult(t,e,"previous"),this.speakResult(t)},e.prototype.setupKeyboardHandlers=function(){var e=this;this.keyboardHandler=function(t){var i=t.target;if("INPUT"!==i.tagName&&"TEXTAREA"!==i.tagName&&"SELECT"!==i.tagName)if(t.ctrlKey)e.stopSpeech();else if(!t.altKey&&!t.metaKey)switch(t.key){case"ArrowUp":t.preventDefault(),e.navigatePrevious("item");break;case" ":e.isStreaming=!0;case"ArrowDown":t.preventDefault(),e.navigateNext("item");break;case"Enter":t.preventDefault(),e.activateCurrentElement(),e.controller.setPointOfRegard(e.viewerDoc.activeElement);break;case"H":case"h":t.shiftKey?(t.preventDefault(),e.navigatePrevious("heading")):(t.preventDefault(),e.navigateNext("heading"));break;case"R":case"r":t.shiftKey?(t.preventDefault(),e.navigatePrevious("region")):(t.preventDefault(),e.navigateNext("region"));break;case"Tab":t.shiftKey?(t.preventDefault(),e.navigatePrevious("tab_focus")):(t.preventDefault(),e.navigateNext("tab_focus"))}},this.viewerDoc.addEventListener("keydown",this.keyboardHandler)},e.prototype.speakResult=function(e){var t=this;if(this.speechEnabled){var i=new SpeechSynthesisUtterance(e.renderingResult.message);i.rate=1.5;var a=this;i.addEventListener("end",function(e){a.isStreaming&&t.navigateNext("item")}),speechSynthesis.cancel(),speechSynthesis.speak(i)}},e.prototype.stopSpeech=function(){this.isStreaming=!1,speechSynthesis.cancel()},e.prototype.setupMutationTracking=function(){var e=this,t=new MutationObserver(function(i){if(e.isShowingAll&&i.filter(function(e){return 1===e.target.nodeType&&!e.target.closest(".ibma-sr-overlay")}).length>0){t.disconnect();var a=e;a.showAll(),setTimeout(function(){a.showAll(),t.observe(e.viewerDoc.documentElement,{attributes:!0,childList:!0,subtree:!0})},1e3)}});t.observe(this.viewerDoc.documentElement,{attributes:!0,childList:!0,subtree:!0})},e.prototype.setupFocusTracking=function(){var e=this;this.focusHandler=function(t){if(t.target instanceof HTMLElement){var i=t.target;if(e.overlay&&i.closest(".ibma-sr-overlay"))return;console.group("focusHandler");var a=e.controller.setPointOfRegard(i);a.success&&(e.overlay.displayResult(a,"focus","focus"),e.speakResult(a)),console.groupEnd()}},this.viewerDoc.addEventListener("focusin",this.focusHandler)},e.prototype.activateCurrentElement=function(){var e=this.controller.getPointOfRegard().getElement();if(e){var t={success:!0,renderingResult:{message:"Activating: ".concat(e.textContent||e.nodeName),start:this.controller.getPointOfRegard(),end:this.controller.getPointOfRegard()}};this.overlay.displayResult(t,"focus","focus"),this.speakResult(t),e.focus&&e.focus(),e.click()}},e.prototype.getController=function(){return this.controller},e.prototype.destroy=function(){this.viewerDoc.removeEventListener("keydown",this.keyboardHandler),this.viewerDoc.removeEventListener("focusin",this.focusHandler),this.stopSpeech(),this.overlay.destroy()},e}();t.SRViewer=l},7242(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.RULES=t.getLinkAnnouncement=t.getRoleDescription=t.quoteName=t.quoteNamePadBefore=t.quoteNamePadAfter=void 0;var a=i(8195),n=i(328),l=i(7011),r=i(9910),o=i(3864),s=i(3946);function u(e,t,i,a){return e.getName()?"".concat(c(e)).concat(t||", "):""}function d(e,t){return e.getName()?"".concat(t||", ").concat(c(e)):""}function c(e,t,i){return e.getName()?"".concat(t||'"').concat(e.getName()).concat(i||'"'):""}function m(e,t){var i=e.getElement();if(!i)return t;var a=i.getAttribute("aria-roledescription");return a&&a.trim().length>0?a.trim():t}function p(e,t){var i,a=e.getNode().href||"";i=a.startsWith(document.location.href)&&"#"===a.charAt(document.location.href.length)?"same page link":"link";var n=e.getNameInfo();return n&&!["content","text"].includes(n.nameFrom)?"tab_focus"===t?"[".concat(u(e)).concat(i,"]"):"[".concat(i).concat(d(e),"]"):"[".concat(i,"]")}function h(e,t){var i=e.getAttribute("aria-describedby");if(!i)return"";var a=i.split(/\s+/).map(function(e){return document.getElementById(e)}).filter(function(e){return!!e}).map(function(e){var t;return null===(t=e.textContent)||void 0===t?void 0:t.trim()}).filter(function(e){return!!e}).join(" ");return a&&0!==a.length?"item"===t?", ".concat(a,""):', "'.concat(a,'"'):""}function g(e){var t="";return(e.hasAttribute("disabled")||"true"===e.getAttribute("aria-disabled"))&&(t+=", disabled"),(e.hasAttribute("readonly")||"true"===e.getAttribute("aria-readonly"))&&(t+=", read only"),(e.hasAttribute("required")||"true"===e.getAttribute("aria-required"))&&(t+=", required"),"true"===e.getAttribute("aria-invalid")&&(t+=", invalid"),t}function b(e){var t=e.getElement();if(!t)return!1;for(var i=new o.DOMWalker(t,!1,t,!1);i.nextNode();)if(1===i.node.nodeType&&!i.bEndTag){var a=l.AriaUtil.getResolvedRole(i.node);if(a&&r.ARIADefinitions.designPatterns[a]&&"widget"===r.ARIADefinitions.designPatterns[a].roleType)return!0}return!1}t.quoteNamePadAfter=u,t.quoteNamePadBefore=d,t.quoteName=c,t.getRoleDescription=m,t.getLinkAnnouncement=p,t.RULES=[new n.SRRendererRule({roles:["button"],elems:[],modes:["item","button","tab_focus"],tests:[function(e,t,i){if(!e.isStartTag())return null;var a=e.getNode(),n=m(e,"button");return"true"===a.getAttribute("aria-pressed")?"[toggle ".concat(n,", pressed").concat(d(e)).concat(h(a,i),"]"):null},function(e,t,i){if(!e.isStartTag())return null;var a=e.getNode(),n=m(e,"button");return"false"===a.getAttribute("aria-pressed")?"[toggle ".concat(n,", not pressed").concat(d(e)).concat(h(a,i),"]"):null},function(e,t,i){if(!e.isEndTag()){var a="",n=e.getElement(),l=m(e,"button");return["menu","true"].includes(n.getAttribute("aria-haspopup"))&&(a+=", menu"),n.hasAttribute("aria-expanded")&&(a+=", ".concat("true"===n.getAttribute("aria-expanded")?"expanded":"collapsed")),a+=g(n),"[".concat(u(e)).concat(l).concat(a).concat(h(n,i),"]")}},function(e){if(e.isEndTag())return""}]}),new n.SRRendererRule({roles:["checkbox"],elems:[],modes:["item","checkbox","tab_focus"],tests:[function(e,t,i){if(e.isStartTag()){var a=e.getNode(),n=m(e,"checkbox"),l="";return l="mixed"===a.getAttribute("aria-checked")?"half checked":(a.hasAttribute("aria-checked")?"true"===a.getAttribute("aria-checked"):a.checked)?"checked":"not checked",l+=g(e.getElement()),"[".concat(n,", ").concat(l).concat(d(e)).concat(h(e.getElement(),i),"]")}return""}]}),new n.SRRendererRule({roles:["cell","columnheader","rowheader"],elems:[],modes:["item","table"],tests:[function(e){var t;if(!e.isStartTag())return null;var i=e.getElement();if(!i)return null;var a=(null===(t=i.textContent)||void 0===t?void 0:t.trim())||"",n=new o.DOMWalker(i,!1,i,!1),s=a.length>0;if(!s)for(;n.nextNode();)if(1===n.node.nodeType&&!n.bEndTag){var u=n.node,d=l.AriaUtil.getResolvedRole(u);if(d&&r.ARIADefinitions.designPatterns[d]){s=!0;break}if("IMG"===u.nodeName.toUpperCase()&&u.hasAttribute("alt")){s=!0;break}}return s?null:"[blank]"}]}),new n.SRRendererRule({roles:["combobox"],elems:[],modes:["item","combo","tab_focus"],tests:[function(e){if(e.isEndTag())return"";var t=m(e,"combo box"),i=e.getElement(),n="";if("SELECT"===e.getNode().nodeName.toUpperCase()){n=", collapsed";var l=e.getElement(),r=l.selectedIndex>=0?l.options[l.selectedIndex]:null,o="";return r&&(o=d(new a.SRCursor(r,!1),", ")),n+=g(i),"[".concat(u(e)).concat(t).concat(n).concat(o,"]")}return"INPUT"!==e.getNode().nodeName.toUpperCase()||e.getElement().hasAttribute("role")?(i.hasAttribute("aria-expanded")&&(n=", ".concat("true"===i.getAttribute("aria-expanded")?"expanded":"collapsed"),i.hasAttribute("aria-autocomplete")&&(n+=", has auto complete"),n+=", editable, opens list"),n+=g(i),"[".concat(u(e)).concat(t).concat(n,"]")):(n=g(i),"[".concat(u(e)).concat(t,", has auto complete, editable, opens list").concat(n,"]"))}]}),new n.SRRendererRule({roles:["default"],elems:[],modes:["item"],tests:[function(e){var t;return e.isStartTag()?"!!<".concat(e.getRole(),">").concat((null===(t=e.getNameInfo())||void 0===t?void 0:t.name)+"","!!"):"!!</".concat(e.getRole(),">!!")}]}),new n.SRRendererRule({roles:["deletion"],elems:[],modes:["item"],tests:[function(e){return e.isStartTag()?"[deleted]":""}]}),new n.SRRendererRule({roles:["dialog"],elems:[],modes:["item"],tests:[function(e){return e.isEndTag()?"[End of dialog]":"[Start of dialog".concat(d(e))}]}),new n.SRRendererRule({roles:["document","generic"],elems:[],modes:["item"],tests:[function(){return""}]}),new n.SRRendererRule({roles:["graphics-document"],elems:[],modes:["item","image"],tests:[function(e){var t,i;return e.isStartTag()&&!(null===(t=e.getNameInfo())||void 0===t?void 0:t.name)&&""!==(null===(i=e.getNameInfo())||void 0===i?void 0:i.name)?e.getCurrentOrParentByRoleClone(["heading","link"])&&s.VisUtil.isNodeHiddenFromAT(e.getElement())?"":"[Unlabeled graphic]":null},function(e){var t;return e.isStartTag()&&""===(null===(t=e.getNameInfo())||void 0===t?void 0:t.name)?"":null},function(e){var t;return e.isStartTag()&&(null===(t=e.getNameInfo())||void 0===t?void 0:t.name)&&"[graphic".concat(d(e),"]")||null},function(e){return e.isEndTag()?"":null}]}),new n.SRRendererRule({roles:["heading"],elems:[],modes:["item","tab_focus"],tests:[function(e,t,i){if("tab_focus"===i&&e.isStartTag())return"";if("item"===i&&e.isEndTag())return"";var a,n=e.getElement();a=n.ariaLevel?n.ariaLevel:"heading"===n.getAttribute("role")?"2":n.nodeName.substring(1);var l=e.getNameInfo();return l&&!["content","text"].includes(l.nameFrom)||(n.textContent||"").trim()?l&&!["content","text"].includes(l.nameFrom)?"[heading level ".concat(a).concat(d(e),"]"):"[heading level ".concat(a,"]"):""}]}),new n.SRRendererRule({roles:["heading"],elems:[],modes:["heading","h1","h2","h3","h4","h5","h6"],tests:[function(e){if(e.isStartTag()){var t,i=e.getNode();t=i.ariaLevel?i.ariaLevel:"heading"===i.getAttribute("role")?"2":i.nodeName.substring(1);var a=e.getNameInfo();return a&&!["content","text"].includes(a.nameFrom)||(i.textContent||"").trim()?"[".concat(u(e),"heading level ").concat(t,"]"):""}return""}]}),new n.SRRendererRule({roles:["img"],elems:[],modes:["item","image"],tests:[function(e){var t,i,a;return e.isEndTag()?"":(null===(t=e.getNameInfo())||void 0===t?void 0:t.name)||""===(null===(i=e.getNameInfo())||void 0===i?void 0:i.name)?""===(null===(a=e.getNameInfo())||void 0===a?void 0:a.name)?"":"[graphic".concat(d(e),"]"):e.getCurrentOrParentByRoleClone(["heading","link"])&&s.VisUtil.isNodeHiddenFromAT(e.getElement())?"":"[Unlabeled graphic]"}]}),new n.SRRendererRule({roles:["insertion"],elems:[],modes:["item"],tests:[function(e){return e.isStartTag()?"[inserted]":""}]}),new n.SRRendererRule({roles:["link"],elems:[],modes:["item","region","link","tab_focus"],tests:[function(e,t,i){var a;return e.isStartTag()&&!["content","text"].includes(null===(a=e.getNameInfo())||void 0===a?void 0:a.nameFrom)?p(e,i):null}]}),new n.SRRendererRule({roles:["listitem"],elems:[],modes:["item"],tests:[function(e){for(var t,i,a,n=o.DOMWalker.parentNode(e.getNode());void 0===i&&n;)1===n.nodeType&&((p=n).hasAttribute("role")?"list"===p.getAttribute("role")&&(i=!1,a=p):"UL"===p.nodeName.toUpperCase()?(i=!1,a=p):"OL"===p.nodeName.toUpperCase()&&(i=!0,a=p)),n=o.DOMWalker.parentNode(n);var l=b(e)?"":(null===(t=e.getNameInfo())||void 0===t?void 0:t.name)||"",r="";if(i){var s=1;if(a&&"OL"===a.nodeName.toUpperCase()&&a.hasAttribute("start")){var u=parseInt(a.getAttribute("start")||"1",10);s=isNaN(u)?1:u}for(var d=e.getElement(),c=o.DOMWalker.previousSiblingNotOwnedBySlot(d);c;){if(1===c.nodeType){var m=c;"listitem"!==m.getAttribute("role")&&"LI"!==m.nodeName.toUpperCase()||s++}c=o.DOMWalker.previousSiblingNotOwnedBySlot(c)}r=e.isStartTag()?"".concat(s,". ").concat(l):""}else{var p;r="LI"===(p=e.getElement()).nodeName.toUpperCase()&&"none"===window.getComputedStyle(p).listStyleType||"LI"!==p.nodeName.toUpperCase()?e.isStartTag()?"".concat(l):"":e.isStartTag()?"[bullet] ".concat(l):""}return r}]}),new n.SRRendererRule({roles:["math"],elems:[],modes:["item"],tests:[function(e){return e.isEndTag()?"[math content]":""}]}),new n.SRRendererRule({roles:["menuitem"],elems:[],modes:["item","tab_focus","region"],tests:[function(e){var t="";if(e.isStartTag()){var i="",a=e.getElement();"true"===a.getAttribute("aria-haspopup")&&(i+=", sub-menu"),a.hasAttribute("aria-expanded")&&(i+=", ".concat("true"===a.getAttribute("aria-expanded")?"expanded":"collapsed")),t="[menu".concat(i);var n=e.getNameInfo();n&&!["content","text"].includes(n.nameFrom)&&(t+=d(e)),t+="]"}return t}]}),new n.SRRendererRule({roles:["meter"],elems:[],modes:["item","tab_focus"],tests:[function(e){return e.isStartTag()?"[progress bar, ".concat(e.getNode().value,"]"):""}]}),new n.SRRendererRule({roles:["progressbar"],elems:[],modes:["item"],tests:[function(e){return e.isStartTag()?"[progress bar, ".concat(e.getNode().value,"]"):""}]}),new n.SRRendererRule({roles:["radio"],elems:[],modes:["item","tab_focus"],tests:[function(e,t,i){if(e.isStartTag()){var a,n=m(e,"radio button");a=e.getElement().hasAttribute("aria-checked")?"true"===e.getElement().getAttribute("aria-checked"):e.getNode().checked;var l=g(e.getElement());return"[".concat(n,", ").concat(a?"checked":"not checked").concat(l).concat(d(e)).concat(h(e.getElement(),i),"]")}return""}]}),new n.SRRendererRule({roles:["searchbox"],elems:[],modes:["item","tab_focus"],tests:[function(e){return e.isStartTag()?"[".concat(u(e),"edit]"):""}]}),new n.SRRendererRule({roles:["separator"],elems:[],modes:["item"],tests:[function(e){return e.isStartTag()?"[separator]":""}]}),new n.SRRendererRule({roles:["slider"],elems:[],modes:["item","tab_focus"],tests:[function(e,t,i){if(!e.isStartTag())return"";var a=m(e,"slider"),n=e.getElement(),l=n.hasAttribute("aria-valuenow")?n.getAttribute("aria-valuenow"):e.getNode().value;return"[".concat(u(e)).concat(a,", ").concat(l).concat(h(e.getElement(),i),"]")}]}),new n.SRRendererRule({roles:["spinbutton"],elems:[],modes:["item","tab_focus"],tests:[function(e,t,i){if(!e.isStartTag())return"";var a=m(e,"spinbutton");return"[".concat(u(e)).concat(a,", editable").concat(h(e.getElement(),i),"]")}]}),new n.SRRendererRule({roles:["tab"],elems:[],modes:["item","tab_focus"],tests:[function(e){if(!e.isStartTag())return"";var t=m(e,"tab");return"[".concat(t).concat("true"===e.getNode().getAttribute("aria-selected")?", selected":"").concat(d(e),"]")}]}),new n.SRRendererRule({roles:["tablist"],elems:[],modes:["item"],tests:[function(e){return null===e.getNameInfo()?null:e.isStartTag()?"[group start".concat(d(e),"]"):"[group end".concat(d(e),"]")}]}),new n.SRRendererRule({roles:["tabpanel"],elems:[],modes:["item"],tests:[function(e){return null===e.getNameInfo()?null:e.isStartTag()?"[Tab panel start".concat(d(e),"]"):"[Tab panel end".concat(d(e),"]")}]}),new n.SRRendererRule({roles:["text"],elems:[],modes:["item","link","tab_focus","region"],tests:[function(e){var t,i,a,n;if(e.isEndTag()||!(null===(t=e.getParentElement())||void 0===t?void 0:t.getElement()))return null;var l=null===(i=e.getParentElement())||void 0===i?void 0:i.getElement();return"line-through"===l.ownerDocument.defaultView.getComputedStyle(l).textDecorationLine?"[strikethrough] ".concat((null===(a=e.getNameInfo())||void 0===a?void 0:a.name)+""," [end strikethrough]"):"".concat((null===(n=e.getNameInfo())||void 0===n?void 0:n.name)+"")}]}),new n.SRRendererRule({roles:["text"],elems:[],modes:["heading"],tests:[function(e){return""}]}),new n.SRRendererRule({roles:["textbox"],elems:[],modes:["item","tab_focus"],tests:[function(e,t,i){var a,n=e.getElement();if(e.isEndTag())return"item"===i&&"TEXTAREA"===n.nodeName.toUpperCase()?"[out of edit]":"";if(!e.isStartTag())return"";var l="";n.hasAttribute("placeholder")&&n.getAttribute("placeholder").trim().length>0&&(l+=", placeholder: ".concat(n.getAttribute("placeholder"))),l+=g(n);var r="TEXTAREA"===n.nodeName.toUpperCase()||"true"===n.getAttribute("aria-multiline"),o=h(n,i);if(r){var s="tab_focus"===i?null===(a=n.textContent)||void 0===a?void 0:a.trim():"",d=s?" ".concat(s):"";return"[".concat(u(e),"edit, multiline").concat(l).concat(o,"]").concat(d)}return"[".concat(u(e),"edit").concat(l).concat(o,"]")}]}),new n.SRRendererRule({roles:["treeitem"],elems:[],modes:["item","tab_focus"],tests:[function(e){if(e.isEndTag())return"";var t=e.getElement(),i="[treeview item";"true"===t.getAttribute("aria-selected")&&(i+=", selected"),t.hasAttribute("aria-expanded")&&(i+="true"===t.getAttribute("aria-expanded")?", expanded":", collapsed");var a=t.getAttribute("aria-level");if(a)i+=", level ".concat(a);else{for(var n=1,r=o.DOMWalker.parentElement(t);r;){var s=l.AriaUtil.getResolvedRole(r);if("group"===s||"tree"===s)for(var u=o.DOMWalker.parentElement(r);u;){var d=l.AriaUtil.getResolvedRole(u);if("treeitem"===d){n++;break}if("tree"===d)break;u=o.DOMWalker.parentElement(u)}r=o.DOMWalker.parentElement(r)}n>1&&(i+=", level ".concat(n))}var c=t.getAttribute("aria-posinset"),m=t.getAttribute("aria-setsize");if(!c||!m){var p=0,h=0,g=o.DOMWalker.parentElement(t);if(g)for(var b=o.DOMWalker.firstChildNotOwnedBySlot(g);b;){if(1===b.nodeType){var _=b;"treeitem"===l.AriaUtil.getResolvedRole(_)&&(h++,_===t&&(p=h))}b=b.nextSibling}c=p.toString(),m=h.toString()}return i+", ".concat(c," of ").concat(m,"] ")}]}),new n.SRRendererRule({roles:[],elems:["BODY"],modes:["item","tab_focus"],tests:[function(e){var t=e.getNode().ownerDocument.title;return e.isEndTag()?"[End of document".concat(t.trim().length>0?": "+t.trim():"","]"):"[Start of document".concat(t.trim().length>0?": "+t.trim():"","]")}]}),new n.SRRendererRule({roles:[],elems:["IFRAME"],modes:["item","tab_focus"],tests:[function(e){var t=function(e){try{return null!==(e.contentDocument||e.contentWindow.document)}catch(e){return!1}}(e.getNode())?"":"{Emulator unable to access frame}";return e.isEndTag()?"":t}]}),new n.SRRendererRule({roles:[],elems:["BR"],modes:["item"],tests:[function(e){try{for(var t=e.clone();t.previous(function(){return!0})&&"BR"!==t.getNode().nodeName.toUpperCase()&&t.getNameInfo()&&0===t.getNameInfo().name.trim().length;);return"BR"===t.getNode().nodeName.toUpperCase()?"[blank]":null}catch(e){console.error(e)}}]}),new n.SRRendererRule({roles:[],elems:["DL"],modes:["item"],tests:[function(e){return""}]}),new n.SRRendererRule({roles:[],elems:["INPUT"],modes:["item","tab_focus"],tests:[function(e,t,i){var a;return e.isStartTag()&&"password"===(null===(a=e.getElement())||void 0===a?void 0:a.getAttribute("type"))&&"[".concat(u(e),"edit, protected").concat(h(e.getElement(),i),"]")||null},function(e,t,i){var a,n;if(e.isStartTag()&&"file"===(null===(a=e.getElement())||void 0===a?void 0:a.getAttribute("type"))){var l=(null===(n=e.getElement())||void 0===n?void 0:n.value)||"";return l=""===l?"No file chosen":l.substring(12),"[".concat(u(e),"button").concat(h(e.getElement(),i),"] [").concat(u(e)).concat(l,"]")}return null},function(e,t,i){var a;if(e.isStartTag()&&"color"===(null===(a=e.getElement())||void 0===a?void 0:a.getAttribute("type"))){var n=e.getElement().value,l=(100*Number("0x".concat(n.substring(1,3)))/Number("0xff")).toFixed(0),r=(100*Number("0x".concat(n.substring(3,5)))/Number("0xff")).toFixed(0),o=(100*Number("0x".concat(n.substring(5)))/Number("0xff")).toFixed(0);return"[".concat(u(e),"clickable").concat(h(e.getElement(),i),"] [").concat(l,"% red ").concat(r,"% green ").concat(o,"% blue]")}return null},function(e,t,i){var a;if(e.isStartTag()&&"month"===(null===(a=e.getElement())||void 0===a?void 0:a.getAttribute("type"))){var n=e.getElement().value,l="0",r="0";if(n.trim().length>0){var o=new Date(n);l=""+o.getFullYear(),r=""+(o.getMonth()+1)}return"[".concat(u(e),"clickable").concat(h(e.getElement(),i),"] [spin button, ").concat(r,"] [spin button, ").concat(l,"] [menu button] [subMenu] Show month picker")}return null},function(e,t,i){var a;if(e.isStartTag()&&"date"===(null===(a=e.getElement())||void 0===a?void 0:a.getAttribute("type"))){var n=e.getElement().value,l="0",r="0",o="0";if(n.trim().length>0){var s=new Date(n);l=""+s.getFullYear(),r=""+(s.getMonth()+1),o=""+s.getDate()}return"[".concat(u(e),"clickable").concat(h(e.getElement(),i),"] [spin button, ").concat(r,"] / [spin button, ").concat(o,"] / [spin button, ").concat(l,"] [menu button] [subMenu] Show date picker")}return null},function(e,t,i){var a;if(e.isStartTag()&&"datetime-local"===(null===(a=e.getElement())||void 0===a?void 0:a.getAttribute("type"))){var n=e.getElement().value,l="0",r="0",o="0",s="0",d="0",c="0";if(n.trim().length>0){var m=new Date(n);l=""+m.getFullYear(),r=""+(m.getMonth()+1),o=""+m.getDate(),s=0===m.getHours()||12===m.getHours()?"12":m.getHours()<12?""+m.getHours():""+(m.getHours()-12),d=""+m.getMinutes(),c=m.getHours()>=12?"pm":"am"}return"[".concat(u(e),"clickable").concat(h(e.getElement(),i),"] [spin button, ").concat(r,"] / [spin button, ").concat(o,"] / [spin button, ").concat(l,"] [spin button, ").concat(s,"] : [spin button, ").concat(d,"] [spin button, ").concat(c,"] [menu button] [subMenu] Show local date and time picker")}return null},function(e,t,i){var a;if(e.isStartTag()&&"time"===(null===(a=e.getElement())||void 0===a?void 0:a.getAttribute("type"))){var n=e.getElement().value,l="0",r="0",o="0";if(n.trim().length>0){var s=n.split(":"),d=parseInt(s[0]);l=0===d||12===d?"12":d<12?""+d:""+(d-12),r=s[1],o=d>=12?"pm":"am"}return"[".concat(u(e),"grouping clickable").concat(h(e.getElement(),i)," [spin button, ").concat(l,"] : [spin button, ").concat(r,"] [spin button, ").concat(o,"] [menu button] [subMenu] Show time picker [out of grouping]")}return null},function(e,t,i){var a;if(e.isStartTag()&&"week"===(null===(a=e.getElement())||void 0===a?void 0:a.getAttribute("type"))){var n=e.getElement().value,l="0",r="0";if(n.trim().length>0){var o=n.split(/-W/);l=o[0],r=o[1]}return"[".concat(u(e),"clickable").concat(h(e.getElement(),i),"] [spin button, ").concat(r,"], [spin button, ").concat(l,"] [menu button] [subMenu] Show week picker")}return null},function(e){var t;return"hidden"===(null===(t=e.getElement())||void 0===t?void 0:t.getAttribute("type"))?"":null},function(e){return e.isStartTag()&&"!![".concat(u(e),"input!!]").concat(e.getElement().outerHTML)||null}]}),new n.SRRendererRule({roles:[],elems:["LI"],modes:["item"],tests:[function(e){var t,i=b(e)?"":(null===(t=e.getNameInfo())||void 0===t?void 0:t.name)||"",a=e.getElement();return"none"===window.getComputedStyle(a).listStyleType?e.isStartTag()?"".concat(i):"":e.isStartTag()?"[bullet] ".concat(i):""}]}),new n.SRRendererRule({roles:[],elems:["MFRAC"],modes:["item"],tests:[function(e){return e.isStartTag()?"[fraction]":"[end fraction]"}]}),new n.SRRendererRule({roles:[],elems:["MROW"],modes:["item"],tests:[function(e){var t;if(!e.isStartTag()){var i=e.getCurrentOrParentByRoleClone([],["mfrac"]);return i&&(null===(t=i.getElement().querySelectorAll("mrow")[0])||void 0===t?void 0:t.isSameNode(e.getNode()))?"[over]":void 0}}]}),new n.SRRendererRule({roles:[],elems:["MSQRT"],modes:["item"],tests:[function(e){return e.isStartTag()?"[square root]":"[end root]"}]}),new n.SRRendererRule({roles:[],elems:["MSUP"],modes:["item"],tests:[function(e){var t,i;if(!e.isEndTag()){var a=(null===(t=e.getElement().querySelector("mi"))||void 0===t?void 0:t.innerHTML)||"",n=(null===(i=e.getElement().querySelector("mn"))||void 0===i?void 0:i.innerHTML)||"";return"2"===n?"".concat(a," [squared]"):"3"===n?"".concat(a," [cubed]"):"".concat(a," [to the ").concat(n,"]")}}]}),new n.SRRendererRule({roles:["article","banner","blockquote","caption","cell","code","columnheader","complementary","contentinfo","figure","form","group","list","main","mark","navigation","region","row","rowheader","search","table","toolbar"],elems:[],modes:["item"],tests:[function(e){return""}]}),new n.SRRendererRule({roles:["paragraph","rowgroup","status","strong","subscript","superscript","term","time","none","presentation"],elems:[],modes:["item"],tests:[function(e){return""}]})]},8485(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.RULES=void 0;var a=i(328),n=i(369),l=i(7242),r=i(7011),o=i(9910),s=i(7139);function u(e,t){var i;t&&"#text"===(null===(i=t.getNode())||void 0===i?void 0:i.nodeName)&&(t=t.clone()).previous(function(){return!0});var a=n.SRTableUtil.getTableModel(e),l=n.SRTableUtil.getCellModel(t,a),r=n.SRTableUtil.getCellModel(e,a);if(!r)return"";var o=[];if(!l||l.rowIndexStart!==r.rowIndexStart||l.rowspan!==r.rowspan){var s=n.SRTableUtil.getRowHeadersForCursor(e,a),u=s&&s.trim().length>0?'"'.concat(s,'", '):"";o.push("[".concat(u,"row ").concat(r.rowIndexStart+1).concat(r.rowspan>1?" through "+(r.rowIndexStart+r.rowspan):"","]"))}if(!l||l.colIndexStart!==r.colIndexStart||l.colspan!==r.colspan){var d=n.SRTableUtil.getColumnHeadersForCursor(e,a);u=d&&d.trim().length>0?'"'.concat(d,'", '):"",o.push("[".concat(u,"column ").concat(r.colIndexStart+1).concat(r.colspan>1?" through "+(r.colIndexStart+r.colspan):"","]"))}return o.join(" ")}t.RULES=[new a.SRRendererRule({roles:["article"],elems:[],modes:["item","article","tab_focus"],tests:[function(e,t,i){if("tab_focus"===i&&!s.CommonUtil.isTabbable(e.getNode()))return null;var a=(0,l.getRoleDescription)(e,"article");return"[".concat((0,l.quoteNamePadAfter)(e)).concat(a,"]")}]}),new a.SRRendererRule({roles:["banner"],elems:[],modes:["item","region","tab_focus"],tests:[function(e,t,i){if("tab_focus"===i&&!s.CommonUtil.isTabbable(e.getNode()))return null;var a=(0,l.getRoleDescription)(e,"banner region");return"[".concat((0,l.quoteNamePadAfter)(e)).concat(a,"]")}]}),new a.SRRendererRule({roles:["blockquote"],elems:[],modes:["item","region"],tests:[function(e){return"[blockquote]"}]}),new a.SRRendererRule({roles:["caption"],elems:[],modes:["item","region"],tests:[function(e){return"[caption]"}]}),new a.SRRendererRule({roles:["cell"],elems:[],modes:["item","table"],tests:[u]}),new a.SRRendererRule({roles:["columnheader"],elems:[],modes:["item","table"],tests:[u]}),new a.SRRendererRule({roles:["complementary"],elems:[],modes:["item","region","tab_focus"],tests:[function(e,t,i){return"tab_focus"!==i||s.CommonUtil.isTabbable(e.getNode())?"[".concat((0,l.quoteNamePadAfter)(e),"complementary region]"):null}]}),new a.SRRendererRule({roles:["contentinfo"],elems:[],modes:["item","region","tab_focus"],tests:[function(e,t,i){return"tab_focus"!==i||s.CommonUtil.isTabbable(e.getNode())?"[".concat((0,l.quoteNamePadAfter)(e),"content info region]"):null}]}),new a.SRRendererRule({roles:["figure"],elems:[],modes:["item","region"],tests:[function(e){return"[figure]"}]}),new a.SRRendererRule({roles:["form"],elems:[],modes:["item","region","formcontrol"],tests:[function(e){return null===e.getNameInfo()?"[section]":"[".concat((0,l.quoteNamePadAfter)(e),"form region]")}]}),new a.SRRendererRule({roles:["group"],elems:[],modes:["item","region"],tests:[function(e){var t;return null===e.getNameInfo()?null:"SELECT"===(null===(t=e.getCurrentOrParentByRoleClone(["combobox"],["select"]))||void 0===t?void 0:t.getNode().nodeName.toUpperCase())?"":"DETAILS"===e.getNode().nodeName.toUpperCase()?"[button, ".concat(e.getElement().hasAttribute("open")?"expanded":"collapsed","]"):"[grouping".concat((0,l.quoteNamePadBefore)(e),"]")}]}),new a.SRRendererRule({roles:["group"],elems:[],modes:["tab_focus"],tests:[function(e){var t;return null===e.getNameInfo()?null:"SELECT"===(null===(t=e.getCurrentOrParentByRoleClone(["combobox"],["select"]))||void 0===t?void 0:t.getNode().nodeName.toUpperCase())?"":"DETAILS"===e.getNode().nodeName.toUpperCase()?"[button, ".concat(e.getElement().hasAttribute("open")?"expanded":"collapsed","]"):""}]}),new a.SRRendererRule({roles:["list"],elems:[],modes:["item","list"],tests:[function(e){for(var t,i=e.getNode(),a=document.evaluate(".//li | .//*[@role='listitem']",i,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null),n=0,s=0;s<a.snapshotLength;s++){for(var u=!1,d=!1,c=a.snapshotItem(s).parentElement;c&&c!==i;){var m=r.AriaUtil.getResolvedRole(c);if("list"===m||"UL"===c.nodeName.toUpperCase()||"OL"===c.nodeName.toUpperCase()){u=!0;break}if(m&&(null===(t=o.ARIADefinitions.designPatterns[m])||void 0===t?void 0:t.presentationalChildren)){d=!0;break}c=c.parentElement}u||d||n++}return 0===n?null:"[".concat((0,l.quoteNamePadAfter)(e),"list of ").concat(n," items]")}]}),new a.SRRendererRule({roles:["main"],elems:[],modes:["item","region","tab_focus"],tests:[function(e,t,i){return"tab_focus"!==i||s.CommonUtil.isTabbable(e.getNode())?"[".concat((0,l.quoteNamePadAfter)(e),"main region]"):null}]}),new a.SRRendererRule({roles:["menubar"],elems:[],modes:["item","list"],tests:[function(e){var t=e.getNode(),i=document.evaluate(".//*[@role='menuitem']",t,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null),a=document.evaluate(".//*[@role='menubar']//*[@role='menuitem']|.//*[@role='menu']//*[@role='menuitem']",t,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null);console.log("MENUBAR",e.isEndTag()?"/":"",e.getNode()),console.log(i,a);var n=i.snapshotLength-a.snapshotLength;return 0===n?null:"[".concat((0,l.quoteNamePadAfter)(e),"menubar with ").concat(n," items]")}]}),new a.SRRendererRule({roles:["navigation"],elems:[],modes:["item","region","tab_focus"],tests:[function(e,t,i){if("tab_focus"===i&&!s.CommonUtil.isTabbable(e.getNode()))return null;var a=(0,l.getRoleDescription)(e,"navigation region");return"[".concat((0,l.quoteNamePadAfter)(e)).concat(a,"]")}]}),new a.SRRendererRule({roles:["radiogroup"],elems:[],modes:["item","region","tab_focus"],tests:[function(e){return null===e.getNameInfo()?null:"[grouping".concat((0,l.quoteNamePadBefore)(e),"]")}]}),new a.SRRendererRule({roles:["region"],elems:[],modes:["item","region","tab_focus"],tests:[function(e,t,i){if(null===e.getNameInfo())return null;if("tab_focus"===i&&!s.CommonUtil.isTabbable(e.getNode()))return null;var a=(0,l.getRoleDescription)(e,"region");return"[".concat((0,l.quoteNamePadAfter)(e)).concat(a,"]")}]}),new a.SRRendererRule({roles:["row"],elems:[],modes:["item","table"],tests:[function(){return""}]}),new a.SRRendererRule({roles:["rowheader"],elems:[],modes:["item","table"],tests:[u]}),new a.SRRendererRule({roles:["search"],elems:[],modes:["item","region","tab_focus"],tests:[function(e,t,i){if("tab_focus"===i&&!s.CommonUtil.isTabbable(e.getNode()))return null;var a=(0,l.getRoleDescription)(e,"search region");return"[".concat((0,l.quoteNamePadAfter)(e)).concat(a,"]")}]}),new a.SRRendererRule({roles:["table"],elems:[],modes:["item","table"],tests:[function(e){for(var t=e.clone();"table"!==t.getRole()&&t.previous(function(){return!0}););var i=t.getNode(),a=0,n=0;if(t.getNode().firstChild)for(var r=!1;t.next(function(){return!0})&&!t.getNode().isSameNode(i);){var o=t.getRole();if(t.isStartTag()){if("row"===o)++a;else if(!r&&["cell","rowheader","columnheader"].includes(o)){var s=t.getNode();n+=parseInt(s.getAttribute("colspan")||"1")}}else"row"===o&&(r=!0)}return"[table with ".concat(a," ").concat(1===a?"row":"rows"," and ").concat(n," ").concat(1===n?"column":"columns").concat((0,l.quoteNamePadBefore)(e),"]")}]}),new a.SRRendererRule({roles:["toolbar"],elems:[],modes:["item","region","tab_focus"],tests:[function(e,t,i){return"tab_focus"!==i||s.CommonUtil.isTabbable(e.getNode())?"[".concat((0,l.quoteNamePadAfter)(e),"toolbar]"):null}]}),new a.SRRendererRule({roles:[],elems:["DL"],modes:["item","list"],tests:[function(e){var t=e.getNode(),i=document.evaluate(".//dt",t,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null).snapshotLength;return"[".concat((0,l.quoteNamePadAfter)(e),"definition list of ").concat(i," terms]")}]}),new a.SRRendererRule({roles:[],elems:["FIGCAPTION"],modes:["item"],tests:[function(e){return"[caption]"}]}),new a.SRRendererRule({roles:[],elems:["MARK"],modes:["item"],tests:[function(e){return"[highlighted]"}]}),new a.SRRendererRule({roles:["article","banner","blockquote","caption","cell","columnheader","complementary","contentinfo","figure","form","group","region","row","rowheader","search","toolbar","list","main","navigation","table"],elems:[],modes:["heading"],tests:[function(){return""}]})]},2099(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.RULES=void 0;var a=i(328),n=i(7242);t.RULES=[new a.SRRendererRule({roles:["article"],elems:[],modes:["item"],tests:[function(e){var t=(0,n.getRoleDescription)(e,"article");return"[out of ".concat(t,"]")}]}),new a.SRRendererRule({roles:["banner"],elems:[],modes:["item"],tests:[function(e){var t=(0,n.getRoleDescription)(e,"banner region");return"[out of ".concat(t,"]")}]}),new a.SRRendererRule({roles:["blockquote"],elems:[],modes:["item"],tests:[function(e){return"[out of blockquote]"}]}),new a.SRRendererRule({roles:["caption"],elems:[],modes:["item"],tests:[function(e){return"[out of caption]"}]}),new a.SRRendererRule({roles:["complementary"],elems:[],modes:["item"],tests:[function(e){var t=(0,n.getRoleDescription)(e,"complementary region");return"[out of ".concat(t,"]")}]}),new a.SRRendererRule({roles:["contentinfo"],elems:[],modes:["item"],tests:[function(e){var t=(0,n.getRoleDescription)(e,"content info region");return"[out of ".concat(t,"]")}]}),new a.SRRendererRule({roles:["figure"],elems:[],modes:["item","region"],tests:[function(e){return"[out of figure]"}]}),new a.SRRendererRule({roles:["form"],elems:[],modes:["item","region","formcontrol"],tests:[function(e){return null===e.getNameInfo()?"[out of section]":"[out of form]"}]}),new a.SRRendererRule({roles:["group"],elems:[],modes:["item"],tests:[function(e){var t;return null===e.getNameInfo()?null:"SELECT"===(null===(t=e.getCurrentOrParentByRoleClone(["combobox"],["select"]))||void 0===t?void 0:t.getNode().nodeName.toUpperCase())?"":"[out of grouping]"}]}),new a.SRRendererRule({roles:["list"],elems:[],modes:["item"],tests:[function(e){var t=e.getNode(),i=document.evaluate(".//li | .//*[@role='listitem']",t,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null),a=document.evaluate(".//ul//li|.//ul//*[@role='listitem']|.//ol//li|.//ol//*[@role='listitem']|.//*[@role='list']//li|.//*[@role='list']//*[@role='listitem']",t,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null);return 0===i.snapshotLength-a.snapshotLength?null:"[".concat((0,n.quoteNamePadAfter)(e),"out of list]")}]}),new a.SRRendererRule({roles:["main"],elems:[],modes:["item"],tests:[function(e){var t=(0,n.getRoleDescription)(e,"main region");return"[out of ".concat(t,"]")}]}),new a.SRRendererRule({roles:["menubar"],elems:[],modes:["item","list"],tests:[function(e){return"[out of menubar]"}]}),new a.SRRendererRule({roles:["navigation"],elems:[],modes:["item"],tests:[function(e){var t=(0,n.getRoleDescription)(e,"navigation region");return"[out of ".concat(t,"]")}]}),new a.SRRendererRule({roles:["radiogroup"],elems:[],modes:["item","region","tab_focus"],tests:[function(e){return"[out of grouping]"}]}),new a.SRRendererRule({roles:["region"],elems:[],modes:["item"],tests:[function(e){if(null===e.getNameInfo())return null;var t=(0,n.getRoleDescription)(e,"region");return"[out of ".concat(t,"]")}]}),new a.SRRendererRule({roles:["search"],elems:[],modes:["item"],tests:[function(e){var t=(0,n.getRoleDescription)(e,"search region");return"[out of ".concat(t,"]")}]}),new a.SRRendererRule({roles:["table"],elems:[],modes:["item"],tests:[function(e){return"[out of table]"}]}),new a.SRRendererRule({roles:["toolbar"],elems:[],modes:["item"],tests:[function(e){return"[out of toolbar]"}]}),new a.SRRendererRule({roles:[],elems:["ABBR"],modes:["item"],tests:[function(e){return e.getElement().hasAttribute("title")?"[".concat(e.getElement().getAttribute("title"),"]"):null}]}),new a.SRRendererRule({roles:[],elems:["DL"],modes:["item"],tests:[function(e){return"[out of definition list]"}]}),new a.SRRendererRule({roles:[],elems:["FIGCAPTION"],modes:["item"],tests:[function(e){return"[out of caption]"}]}),new a.SRRendererRule({roles:[],elems:["MARK"],modes:["item"],tests:[function(e){return"[out of highlighted]"}]}),new a.SRRendererRule({roles:["group","article","banner","blockquote","caption","complementary","contentinfo","figure","form","list","region","main","navigation","search","table","toolbar"],elems:[],modes:["region","heading"],tests:[function(){return""}]})]},2151(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.CONTAINER_EXIT_RULES=t.CONTAINER_ENTER_RULES=t.SR_RULES=void 0;var a=i(7242),n=i(8485),l=i(2099);t.SR_RULES=a.RULES,t.CONTAINER_ENTER_RULES=n.RULES,t.CONTAINER_EXIT_RULES=l.RULES},1950(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.AccNameUtil=void 0;var a=i(9910),n=i(7139),l=i(7011),r=i(3946),o=i(4566),s=i(3864),u=i(1686),d=function(){function e(){}return e.computeAccessibleNameForSVGElementW3C=function(e){if(!e||"svg"!==e.nodeName.toLowerCase())return null;var t=e.querySelectorAll(":scope > title");if(t&&t.length>0){var i="";if(t.forEach(function(e){if(e&&!r.VisUtil.isNodeHiddenFromAT(e)&&!r.VisUtil.isNodePresentational(e)){var t=e.textContent;t&&""!==t.trim()&&(i+=t.trim())}}),i&&""!==i.trim())return{name:i.trim(),nameFrom:"svgTitle"}}var a="",o=e.querySelectorAll("text, textPath, tspan");if(o&&o.length>0&&(o.forEach(function(e){if(!r.VisUtil.isNodeHiddenFromAT(e)&&!r.VisUtil.isNodePresentational(e)){var t=e.textContent;t&&""!==t.trim()&&(a+=" "+t.trim())}}),""!==a.trim()))return{name:n.CommonUtil.truncateText(a.trim()),nameFrom:"svgText"};for(var s=e.querySelectorAll("a"),u=0;u<s.length;u++){var d=s[u];if(!r.VisUtil.isNodeHiddenFromAT(d)&&!r.VisUtil.isNodePresentational(d)){var c=d.getAttribute("xlink:title");if(c&&""!==c.trim())return{name:n.CommonUtil.truncateText(c),nameFrom:"svglinkTitle"}}}var m=l.AriaUtil.getAriaDescription(e);if(m&&""!==m.trim())return{name:n.CommonUtil.truncateText(m),nameFrom:"aria-description"};var p=e.querySelectorAll(":scope > desc");if(p&&p.length>0){var h="";if(p.forEach(function(e){if(!r.VisUtil.isNodeHiddenFromAT(e)&&!r.VisUtil.isNodePresentational(e)){var t=e.textContent;t&&""!==t.trim()&&(h+=" "+t.trim())}}),""!==h.trim())return{name:h.trim(),nameFrom:"svgDesc"}}if(e.hasAttribute("title")){var g=e.getAttribute("title");if(g&&""!==g.trim())return{name:n.CommonUtil.truncateText(g),nameFrom:"title"}}return null},e.computeAccessibleName=function(t){if(!t)return null;var i=t.nodeName.toLowerCase(),r=o.CacheUtil.getCache(t,"ELEMENT_ACCESSBLE_NAME",void 0);if(void 0!==r)return r;var s=l.AriaUtil.getAriaLabel(t);if(s&&""!==s.trim())return o.CacheUtil.setCache(t,"ELEMENT_ACCESSBLE_NAME",{name:n.CommonUtil.truncateText(s),nameFrom:"ariaLabel"}),{name:n.CommonUtil.truncateText(s),nameFrom:"ariaLabel"};if(r=e.computeAccessibleNameForNativeElement(t))return o.CacheUtil.setCache(t,"ELEMENT_ACCESSBLE_NAME",r),r;var u=l.AriaUtil.getResolvedRole(t);if(a.ARIADefinitions.designPatterns[u]&&a.ARIADefinitions.designPatterns[u].nameFrom.includes("contents")&&(r=e.computeAccessibleNameFromContent(t)))return o.CacheUtil.setCache(t,"ELEMENT_ACCESSBLE_NAME",r),r;if(t.hasAttribute("title")){var d=t.getAttribute("title").trim();if(d&&d.trim().length>0)return d=n.CommonUtil.truncateText(d),o.CacheUtil.setCache(t,"ELEMENT_ACCESSBLE_NAME",{name:d,nameFrom:"title"}),{name:d,nameFrom:"title"}}if("textarea"===i||"input"===i&&(!t.hasAttribute("type")||n.CommonUtil.input_type_with_placeholder.includes(t.getAttribute("type")))){var c=t.getAttribute("placeholder");if(c&&c.trim().length>0)return c=n.CommonUtil.truncateText(c),o.CacheUtil.setCache(t,"ELEMENT_ACCESSBLE_NAME",{name:c,nameFrom:"placeholder"}),{name:c,nameFrom:"placeholder"}}return o.CacheUtil.setCache(t,"ELEMENT_ACCESSBLE_NAME",null),null},e.computeAccessibleNameForNativeElement=function(t){var i,a,l=t.nodeName.toLowerCase();if(n.CommonUtil.form_labelable_elements.includes(l)&&(p=n.CommonUtil.getFormFieldLabel(t))&&""!==p.trim())return{name:n.CommonUtil.truncateText(p),nameFrom:"label"};if("input"===l&&t.hasAttribute("type"))if(n.CommonUtil.form_button_types.includes(t.getAttribute("type"))){var o=n.CommonUtil.getElementAttribute(t,"value");if(o&&""!==o.trim())return{name:n.CommonUtil.truncateText(o),nameFrom:"value"};var s=t.getAttribute("type");if("submit"===s||"reset"===s)return{name:s,nameFrom:"internal"}}else if("image"===t.getAttribute("type")&&(b=n.CommonUtil.getElementAttribute(t,"alt"))&&""!==b.trim())return{name:n.CommonUtil.truncateText(b),nameFrom:"alt"};if("button"===l){if((v=t.innerText)&&""!==v.trim())return{name:n.CommonUtil.truncateText(v),nameFrom:"text"};var d=t.querySelector("img");if(d&&!r.VisUtil.isNodeHiddenFromAT(d)&&!r.VisUtil.isNodePresentational(d)&&(a=e.computeAccessibleName(d))&&a.name&&a.name.trim().length>0)return a;var c=t.querySelector("svg");if(c&&!r.VisUtil.isNodeHiddenFromAT(c)&&!r.VisUtil.isNodePresentational(c)&&(a=e.computeAccessibleName(c))&&a.name&&a.name.trim().length>0)return a}if("fieldset"===l&&(i=t.firstElementChild)&&"legend"===i.nodeName.toLowerCase()&&(v=i.innerText)&&v.trim().length>0)return{name:n.CommonUtil.truncateText(v),nameFrom:"legend"};if("output"===l&&t.hasAttribute("for")){var m=t.getAttribute("for").trim().split(" ");if(m&&m.length>0){for(var p="",h=0;h<m.length;h++){var g=t.ownerDocument.getElementById(m[h]);!g||u.DOMUtil.sameNode(g,t)||r.VisUtil.isNodeHiddenFromAT(g)||r.VisUtil.isNodePresentational(g)||(a=e.computeAccessibleName(g))&&a.name&&a.name.trim().length>0&&(p+=" "+n.CommonUtil.normalizeSpacing(a.name))}if(p.trim().length>0)return{name:n.CommonUtil.truncateText(p),nameFrom:"label"}}}if("summary"===l&&(v=t.innerText)&&v.trim().length>0)return{name:n.CommonUtil.truncateText(v),nameFrom:"legend"};if("details"===l)return(i=t.firstElementChild)&&"summary"===i.nodeName.toLowerCase()&&(a=e.computeAccessibleName(i))&&a.name&&a.name.trim().length>0?{name:n.CommonUtil.truncateText(a.name.trim()),nameFrom:"summary"}:{name:"details",nameFrom:"internal"};if("figure"===l&&(_=n.CommonUtil.getChildByTagHidden(t,"figcaption",!0,!1))&&_.length>0&&(v=_[0].innerText)&&v.trim().length>0)return{name:n.CommonUtil.truncateText(v),nameFrom:"figcaption"};if("img"===l&&t.hasAttribute("alt")){var b=t.getAttribute("alt");return{name:n.CommonUtil.truncateText(b),nameFrom:"alt"}}if("area"===l&&t.hasAttribute("alt")&&(b=t.getAttribute("alt"))&&b.trim().length>0)return{name:n.CommonUtil.truncateText(b),nameFrom:"alt"};if("table"===l){var _,f=t.firstElementChild;if(f&&"caption"===f.nodeName.toLowerCase()&&(_=f.innerText)&&_.trim().length>0)return{name:n.CommonUtil.truncateText(_),nameFrom:"caption"}}if("a"===l){var v;if((v=t.innerText)&&""!==v.trim())return{name:n.CommonUtil.truncateText(v),nameFrom:"text"};var A=t.querySelectorAll(":scope > img, :scope > svg");if(A&&A.length>0){var w="";if(A.forEach(function(t){if(!r.VisUtil.isNodeHiddenFromAT(t)&&!r.VisUtil.isNodePresentational(t)){var i=e.computeAccessibleName(t);i&&i.name&&i.name.trim().length>0&&(w+=" "+i.name.trim())}}),""!==w.trim())return{name:w.trim(),nameFrom:"alt"}}}return("optgroup"===l||"option"===l||"track"===l)&&(p=t.getAttribute("label"))&&p.trim().length>0?{name:n.CommonUtil.truncateText(p),nameFrom:"label"}:"svg"===l&&(a=e.computeAccessibleNameForSVGElementW3C(t))&&a.name&&a.name.trim().length>0?a:null},e.computeAccessibleNameForSVGElement=function(e){var t=e.querySelectorAll(":scope > title");if(t&&t.length>0){var i="";if(t.forEach(function(e){if(e&&!r.VisUtil.isNodeHiddenFromAT(e)&&!r.VisUtil.isNodePresentational(e)){var t=e.textContent;t&&""!==t.trim()&&(i+=t.trim())}}),i&&""!==i.trim())return{name:i.trim(),nameFrom:"svgTitle"}}var a=e.querySelector("a");if(a&&!r.VisUtil.isNodeHiddenFromAT(a)&&!r.VisUtil.isNodePresentational(a)){var o=a.getAttribute("xlink:title");if(o&&""!==o.trim())return{name:n.CommonUtil.truncateText(o),nameFrom:"svglinkTitle"}}var s="";if(e.querySelectorAll(":scope > *").forEach(function(e){if("svg"!==e.nodeName.toLowerCase()&&!r.VisUtil.isNodeHiddenFromAT(e)&&!r.VisUtil.isNodePresentational(e)){var t=n.CommonUtil.getInnerText(e);t&&t.trim().length>0&&(s+=t)}}),""!==s.trim())return{name:n.CommonUtil.truncateText(s),nameFrom:"svgText"};var u=l.AriaUtil.getAriaDescription(e);if(u&&u.trim().length>0)return{name:n.CommonUtil.truncateText(u),nameFrom:"aria-description"};var d=e.querySelectorAll(":scope > desc");if(d&&d.length>0){var c="";if(d.forEach(function(e){if(e&&!r.VisUtil.isNodeHiddenFromAT(e)&&!r.VisUtil.isNodePresentational(e)){var t=e.textContent;t&&""!==t.trim()&&(c+=t.trim())}}),c&&""!==c.trim())return{name:c.trim(),nameFrom:"svgDesc"}}},e.computeAccessibleNameFromContent=function(t){var i=t.nodeName.toLowerCase(),a=(l.AriaUtil.getResolvedRole(t),e.computeAccessibleNameForCSSPseudoElement(t,"before"));return null!==a&&a.name&&a.name.trim().length>0||(a=e.computeAccessibleNameForCSSPseudoElement(t,"after"))&&a.name&&a.name.trim().length>0?a:t.shadowRoot&&(a=e.computeAccessibleNameForShadowHost(t))&&a.name&&a.name.trim().length>0?{name:a.name,nameFrom:"shadow"}:"slot"===i&&(a=e.computeAccessibleNameForSlotElement(t))&&a.name&&a.name.trim().length>0?{name:a.name,nameFrom:"slot"}:(a=e.computeAccessibleNameFromChildren(t))&&a.name&&a.name.trim().length>0?{name:a.name,nameFrom:"content"}:null},e.computeAccessibleNameForCSSPseudoElement=function(e,t){var i=e.ownerDocument.defaultView.getComputedStyle(e,t);if(i){var a=i.content;if(a&&"none"!==a&&"no"!==a&&"normal"!==a&&(a=a.replace(/^"/,"").replace(/"$/,"")).trim().length>0)return{name:n.CommonUtil.truncateText(a),nameFrom:"css-"+t}}return null},e.computeAccessibleNameForShadowHost=function(t){var i="",a=t.shadowRoot;return a&&a.querySelectorAll("*").forEach(function(t){var a=e.computeAccessibleName(t);a&&a.name&&a.name.trim().length>0&&(i+=" "+a.name.trim())}),i.trim().length>0?{name:n.CommonUtil.truncateText(i),nameFrom:"shadow-host"}:null},e.computeAccessibleNameForSlotElement=function(t){var i="";if(t.assignedNodes()&&0!==t.assignedNodes().length)for(var a=0,l=t.assignedNodes();a<l.length;a++){var r,o=l[a];(r=e.computeAccessibleName(o))&&r.name&&r.name.length>0&&(i+=" "+r.name.trim())}else(r=e.computeAccessibleName(t))&&r.name&&r.name.trim().length>0&&(i+=" "+r.name.trim());return i.trim().length>0?{name:n.CommonUtil.truncateText(i),nameFrom:"content-slot"}:null},e.computeAccessibleNameFromChildren=function(t){for(var i="",a=new s.DOMWalker(t);a.nextNode()&&a.node!==t&&a.node!==t.parentNode;)if(!a.bEndTag){var o=a.node;if(3===o.nodeType){var u=o.parentElement;!r.VisUtil.isNodeHiddenFromAT(u)&&!r.VisUtil.isNodePresentational(u)&&o.nodeValue&&o.nodeValue.trim().length>0&&(i+=" "+o.nodeValue.trim())}else if(1===o.nodeType&&!r.VisUtil.isNodeHiddenFromAT(o)&&!r.VisUtil.isNodePresentational(o)){var d=e.computeAccessibleName(o);d&&d.name&&d.name.length>0?(i+=" "+d.name.trim(),a.bEndTag=!0):l.AriaUtil.containsPresentationalChildrenOnly(a.node)&&(a.bEndTag=!0)}}return i.trim().length>0?{name:n.CommonUtil.truncateText(i),nameFrom:"content"}:null},e.isAccessibleNameIgnorable=function(e){if(!e)return!1;var t=e.nodeName.toLowerCase();if("img"!==t&&"svg"!==t)return!1;var i=e.parentElement;return!(!i||!l.AriaUtil.isWidget(i)&&!l.AriaUtil.containsPresentationalChildrenOnly(i)||!l.AriaUtil.hasAriaLabel(i))},e}();t.AccNameUtil=d},7011(e,t,i){var a=this&&this.__spreadArray||function(e,t,i){if(i||2===arguments.length)for(var a,n=0,l=t.length;n<l;n++)!a&&n in t||(a||(a=Array.prototype.slice.call(t,0,n)),a[n]=t[n]);return e.concat(a||Array.prototype.slice.call(t))};Object.defineProperty(t,"__esModule",{value:!0}),t.AriaUtil=void 0;var n=i(4566),l=i(9910),r=i(9955),o=i(3864),s=i(3946),u=i(7139),d=i(1950),c=i(5279),m=i(1686),p=function(){function e(){}return e.isDefinedAriaAttributeAtIndex=function(t,i){var a=t.attributes[i].name;return e.isDefinedAriaAttribute(t,a)},e.getUserDefinedAriaAttributes=function(e){var t=[],i=e.attributes;if(i)for(var a=0;a<i.length;a++){var n=i[a].name.trim().toLowerCase();"aria-"===n.substring(0,5)&&t.push(n)}return t},e.getUserDefinedHtmlAttributes=function(e){var t=[],i=e.attributes;if(i)for(var a=0;a<i.length;a++){var n=i[a].name.trim().toLowerCase();"aria-"===n.substring(0,5)||t.push(n)}return t},e.getUserDefinedAriaAttributeNameValuePairs=function(e){var t=[],i=e.attributes;if(i)for(var a=0;a<i.length;a++){var n=i[a].name.trim().toLowerCase(),l=e.getAttribute(n);""===l&&(l=null),"aria-"===n.substring(0,5)&&t.push({name:n,value:l})}return t},e.getUserDefinedHtmlAttributeNameValuePairs=function(e){var t=[],i=e.attributes;if(i)for(var a=0;a<i.length;a++){var n=i[a].name.trim().toLowerCase(),l=e.getAttribute(n);""===l&&(l=null),"aria-"===n.substring(0,5)||t.push({name:n,value:l})}return t},e.getAriaAttribute=function(t,i){var a=t.getAttribute(i);if(t.hasAttribute(i)&&""===a.trim())return a;if(!a){var n=t.nodeName.toLowerCase();i in e.ariaAttributeImplicitMappings&&(n in e.ariaAttributeImplicitMappings[i]?"function"==typeof(a=e.ariaAttributeImplicitMappings[i][n])&&(a=a(t)):"*"in e.ariaAttributeImplicitMappings[i]&&"function"==typeof(a=e.ariaAttributeImplicitMappings[i]["*"])&&(a=a(t)))}if(!a){var l=r.ARIAMapper.nodeToRole(t);l in e.ariaAttributeRoleDefaults&&i in e.ariaAttributeRoleDefaults[l]&&"function"==typeof(a=e.ariaAttributeRoleDefaults[l][i])&&(a=a(t))}return!a&&i in e.ariaAttributeGlobalDefaults&&(a=e.ariaAttributeGlobalDefaults[i]),a},e.isDefinedAriaAttribute=function(e,t){var i=!1;return"aria-"===t.substring(0,5)&&(i=e.hasAttribute&&e.hasAttribute(t)&&e.getAttribute(t).length>0),i},e.getResolvedRole=function(t,i){if(void 0===i&&(i=!0),!t)return null;var a=n.CacheUtil.getCache(t,"RPTUTIL_ELEMENT_RESOLVED_ROLE",null);if(null===a){var l=e.getUserDefinedRoles(t),r=e.getElementAriaProperty(t),o=e.getAllowedAriaRoles(t,r),s=!1;if(l&&l.length>0&&o&&o.length>0){for(var d=0;d<l.length;d++)if(o.includes("any")||o.includes(l[d])){if(o.includes("any")&&"generic"===l[d]){s=!0;continue}if(("presentation"===(a=l[d])||"none"===a)&&u.CommonUtil.isFocusable(t)){a=null;continue}break}s&&(a="generic")}if(null===a&&i){var c=e.getImplicitRole(t);a=c&&c.length>0?c[0]:void 0}n.CacheUtil.setCache(t,"RPTUTIL_ELEMENT_RESOLVED_ROLE",a)}return void 0!==a?a:null},e.getUserDefinedRoles=function(t){return e.getRoles(t,!1)},e.getRoles=function(t,i){var a=[];if(t&&t.hasAttribute&&t.hasAttribute("role"))for(var n=u.CommonUtil.normalizeSpacing(t.getAttribute("role").trim()).split(" "),l=0;l<n.length;++l)a.push(n[l]);if(i){var r=e.getImplicitRole(t);null!==r&&r.length>0&&u.CommonUtil.concatUniqueArrayItemList(r,a)}return a},e.getImplicitRole=function(t){if(!t||1!==t.nodeType)return null;var i=n.CacheUtil.getCache(t,"AriaUtil_ImplicitRole",null);if(!i){var a=e.getElementAriaProperty(t);if(a&&a.implicitRole){if(a.implicitRole.includes("generic")){var r=e.getUserDefinedAriaAttributes(t);if(0===r.length)return n.CacheUtil.setCache(t,"AriaUtil_ImplicitRole",[]),[];var o=[],s=l.ARIADefinitions.designPatterns.generic;if(s.reqProps&&s.reqProps.length>0&&u.CommonUtil.concatUniqueArrayItemList(s.reqProps,o),a.globalAriaAttributesValid&&u.CommonUtil.concatUniqueArrayItemList(l.ARIADefinitions.globalProperties,o),s.deprecatedProps&&s.deprecatedProps.length>0&&u.CommonUtil.reduceArrayItemList(s.deprecatedProps,o),o.length>0&&!o.some(function(e){return r.includes(e)})){var d=u.CommonUtil.reduceArrayItemList(["generic"],a.implicitRole);return n.CacheUtil.setCache(t,"AriaUtil_ImplicitRole",d),d}}return n.CacheUtil.setCache(t,"AriaUtil_ImplicitRole",a.implicitRole),a.implicitRole}return n.CacheUtil.setCache(t,"AriaUtil_ImplicitRole",[]),[]}return i},e.getRoleRequiredProperties=function(e,t){if(null===e)return null;if(l.ARIADefinitions.designPatterns[e]){var i=l.ARIADefinitions.designPatterns[e].reqProps;return"separator"===e.toLowerCase()&&t&&u.CommonUtil.isFocusable(t)&&(i=u.CommonUtil.concatUniqueArrayItemList(["aria-valuenow"],i||[])),i}return null},e.hasRole=function(t,i,a){var n=!1;if(t&&t.hasAttribute&&t.hasAttribute("role"))if("string"!=typeof i)for(var l=t.getAttribute("role").trim().split(" "),r=0;!n&&r<l.length;++r)n=l[r]in i;else for(l=t.getAttribute("role").trim().split(" "),r=0;!n&&r<l.length;++r)n=l[r]===i;if(!n&&a){var o=[],s=e.getImplicitRole(t);if(null!==s&&s.length>0)if(u.CommonUtil.concatUniqueArrayItemList(s,o),"string"!=typeof i)for(r=0;!n&&r<o.length;++r)n=o[r]in i;else for(r=0;!n&&r<o.length;++r)n=o[r]===i}return n},e.hasRoleInSemantics=function(t,i){var a=!1,n=!1;if(t&&t.hasAttribute&&t.hasAttribute("role"))if("string"!=typeof i)for(var l=t.getAttribute("role").trim().toLowerCase().split(/\s+/),r=0;!a&&r<l.length;++r)n=!0,a=l[r]in i;else for(l=t.getAttribute("role").trim().toLowerCase().split(/\s+/),r=0;!a&&r<l.length;++r)n=!0,a=l[r]===i;if(n)return a;var o=e.getImplicitRole(t);if(null!==o&&o.length>0)if("string"!=typeof i)for(r=0;!a&&r<o.length;++r)a=o[r]in i;else for(r=0;!a&&r<o.length;++r)a=o[r]===i;return a},e.hasAnyRole=function(t,i){var a=!1;if(t&&t.hasAttribute&&t.hasAttribute("role")&&(a=!0),!a&&i){var n=e.getImplicitRole(t);null!==n&&n.length>0&&(a=!0)}return a},e.isPresentationalElement=function(e){return u.CommonUtil.valInArray(e.nodeName.toLowerCase(),["abbr","b","bdi","bdo","br","cite","code","data","dfn","em","i","kbd","mark","q","rp","rt","rtc","ruby","s","samp","small","span","strong","sub","sup","time","u","var","wbr","a","progress","meter","basefont","big","center","strike","tt","font","blink","h1","h2","h3","h4","h5","h6","hr","blockquote","p"])},e.getAncestorWithRole=function(t,i,a){for(var n=o.DOMWalker.parentNode(t);null!==n;){if(a){if(e.hasRoleInSemantics(n,i))break}else if(e.hasRole(n,i,!1))break;n=o.DOMWalker.parentNode(n)}return n},e.getAncestorWithRoles=function(t,i){if(!t||!i||!i.length||0===i.length)return null;for(var a=t;null!==a;){var n=e.getResolvedRole(a);if(null!==n&&(i.includes(n)||i.includes("*")&&!["presentation","none"].includes(n)))return a;a=o.DOMWalker.parentNode(a)}return null},e.getRolesWithTypes=function(e,t){if(!e||!t||!t.length||0===t.length)return null;var i=n.CacheUtil.getCache(e.ownerDocument,"roles_with_given_types",null);return i&&0!==i.length||(i=[],Object.entries(l.ARIADefinitions.designPatterns).forEach(function(e){var a=e[0],n=e[1];t.includes(n.roleType)&&i.push(a)}),n.CacheUtil.setCache(e.ownerDocument,"roles_with_given_types",i)),i},e.isWidget=function(t){if(!t)return!1;var i=n.CacheUtil.getCache(t.ownerDocument,"is_element_widget",null);if(null===i){var a=!1,r=e.getResolvedRole(t);return r&&l.ARIADefinitions.designPatterns[r]&&"widget"===l.ARIADefinitions.designPatterns[r].roleType&&(a=!0),n.CacheUtil.setCache(t.ownerDocument,"is_element_widget",a),a}return i},e.isNavigationOwnedOrControlled=function(t){if(!t)return!1;var i=n.CacheUtil.getCache(t.ownerDocument,"AriaUtil_NavigationOwnedOrControlled",null);if(null!==i&&i.length>0&&u.CommonUtil.getAncestor(t,i))return!0;var a=e.getResolvedRole(t);if(!a)return!1;var l=t.getAttribute("id");return!(!l||0===l.trim().length)&&(!!t.ownerDocument.querySelector("*[aria-controls~='".concat(l,"'], *[aria-owns~='").concat(l,"']"))&&(!!["combobox","scrollbar","button","tab","listbox","menu","menubar","radiogroup","tree","treegrid"].includes(a)&&(null===i&&(i=[]),i.push(t),n.CacheUtil.setCache(t.ownerDocument,"AriaUtil_NavigationOwnedOrControlled",i),!0)))},e.getSiblingWithRole=function(t,i){return e.getSiblingWithRoleHidden(t,i,!1)},e.getSiblingWithRoleHidden=function(t,i,a,n){var l=null,r=!1;if(t&&i){for(l=t.nextSibling;null!==l&&!r;)a&&u.CommonUtil.shouldNodeBeSkippedHidden(l)||(r=n?e.hasRoleInSemantics(l,i):e.hasRole(l,i,!1)),l=l.nextSibling;if(!l)for(l=t.previousSibling;null!==l&&!r;)a&&u.CommonUtil.shouldNodeBeSkippedHidden(l)||(r=e.hasRole(l,i,n)),l=l.previousSibling}return l},e.getDescendantWithRole=function(t,i){return e.getDescendantWithRoleHidden(t,i,!1)},e.getDescendantWithRoleHidden=function(t,i,a,n){for(var l=null,r=new o.DOMWalker(t);r.nextNode()&&r.node!=t&&r.node!=t.nextSibling;)if((!a||!u.CommonUtil.shouldNodeBeSkippedHidden(r.node))&&(n?e.hasRoleInSemantics(r.node,i):e.hasRole(r.node,i,!1))){l=r.node;break}return l},e.getAllDescendantsWithRoles=function(t,i,a,n){if(i&&0!==i.length){var l=[];return i.forEach(function(i){var r=e.getAllDescendantsWithRoleHidden(t,i,a,n);r&&r.length>0&&(l=l.concat(r))}),l}},e.getAllDescendantsWithRoleHidden=function(t,i,a,n){for(var l=[],r=new o.DOMWalker(t);r.nextNode()&&r.node!=t&&r.node!=t.nextSibling;)r.bEndTag||a&&u.CommonUtil.shouldNodeBeSkippedHidden(r.node)||e.hasRole(r.node,i,n)&&l.push(r.node);return l},e.getDirectATChildren=function(t){var i=e.getRequiredChildRoles(t,!0),a=[];return e.retrieveDirectATChildren(t,i,a),a},e.retrieveDirectATChildren=function(t,i,a){var n=[];if(null!==t.children&&t.children.length>0)for(var l=0;l<t.children.length;l++)n.push(t.children[l]);var r=t.getAttribute("aria-owns");if(r){var o=t.ownerDocument;if(o){var u=r.split(" ");for(l=0;l<u.length;l++){var d=o.getElementById(u[l]);d&&n.push(d)}}}if(n.length>0){for(l=0;l<n.length;l++)if(!s.VisUtil.isNodeHiddenFromAT(n[l])&&s.VisUtil.isNodeVisible(n[l])){var c=e.getRoles(n[l],!1);null!==c&&0!==c.length||(c=e.getImplicitRole(n[l])),c&&null!==c&&c.length>0&&(c=c.filter(function(e){return"none"!==e&&"presentation"!==e})).includes("group")&&i&&i.includes("group")&&(c=c.filter(function(e){return"group"!==e})),c&&null!==c&&c.length>0?a.push(n[l]):e.retrieveDirectATChildren(n[l],i,a)}return null}return null},e.getRequiredChildRoles=function(t,i){var a=e.getRoles(t,!1);if(a&&0!==a.length||!i||(a=e.getImplicitRole(t)),!a||0===a.length)return null;var n=["none","presentation"];if(a.some(function(e){return n.includes(e)}))return null;for(var r=l.ARIADefinitions.designPatterns,o=new Array,s=0;s<a.length;++s)r[a[s]]&&null!==r[a[s]].reqChildren&&(o=u.CommonUtil.concatUniqueArrayItemList(r[a[s]].reqChildren,o));return o},e.getAriaOwnsWithRole=function(t,i){return e.getAriaOwnsWithRoleHidden(t,i,!1)},e.getAriaOwnsWithRoleHidden=function(t,i,a,n){var l=null,r=!1;if(u.CommonUtil.attributeNonEmpty(t,"aria-owns")){var o=t.getAttribute("aria-owns");if(l=c.FragmentUtil.getById(t,o),m.DOMUtil.sameNode(t,l))return null;r=a&&null!=l&&u.CommonUtil.shouldNodeBeSkippedHidden(l)?null:e.hasRole(l,i,n)}return r?l:null},e.hasAriaLabel=function(e){return u.CommonUtil.attributeNonEmpty(e,"aria-label")||u.CommonUtil.attributeNonEmpty(e,"aria-labelledby")},e.hasUniqueAriaLabelsLocally=function(t,i){if(0===t.length)return!1;var a=t[0].ownerDocument,l=!1,r=null;i&&(r=n.CacheUtil.getCache(a,"AriaUtil_HAS_UNIQUE_ARIA_LABELS",null)),null===r&&(r={});for(var o=0;!l&&o<t.length;++o)if(t[o].hasAttribute)if(t[o].hasAttribute("aria-label")){var s=u.CommonUtil.normalizeSpacing(t[o].getAttribute("aria-label")).toLowerCase();l=s in r,r[s]=!0}else if(t[o].hasAttribute("aria-labelledby")){var d=t[o].getAttribute("aria-labelledby"),p=c.FragmentUtil.getById(t[o],d),h="";p&&!m.DOMUtil.sameNode(p,t[o])&&(h=e.getTextContentExcludingScripts(p));var g=u.CommonUtil.normalizeSpacing(h).toLowerCase();l=g in r,r[g]=!0}else l=!0;return i&&n.CacheUtil.setCache(a,"AriaUtil_HAS_UNIQUE_ARIA_LABELS",r),!l},e.getTextContentExcludingScripts=function(e){if(!e)return"";for(var t="",i=new o.DOMWalker(e);i.nextNode()&&i.node!==e&&i.node!==e.parentNode;)if(!i.bEndTag){var a=i.node,n=a.nodeName?a.nodeName.toLowerCase():"";"script"!==n&&"style"!==n?3===a.nodeType?a.nodeValue&&a.nodeValue.trim().length>0&&(t+=" "+a.nodeValue.trim()):1===a.nodeType&&("img"===n&&a.hasAttribute("alt")||"input"===n&&"image"===a.getAttribute("type")&&a.hasAttribute("alt"))&&(t+=" "+a.getAttribute("alt").trim(),i.bEndTag=!0):i.bEndTag=!0}return t.trim()},e.getAriaLabel=function(t){if(t.hasAttribute){if(t.hasAttribute("aria-labelledby")){for(var i=t.getAttribute("aria-labelledby").trim().split(" "),a="",n=0,l=i.length;n<l;++n){var r=i[n],o=c.FragmentUtil.getById(t,r);if(o&&!m.DOMUtil.sameNode(o,t)){var s=e.getTextContentExcludingScripts(o);a+=u.CommonUtil.normalizeSpacing(s)}}return a.trim()}if(t.hasAttribute("aria-label"))return u.CommonUtil.normalizeSpacing(t.getAttribute("aria-label")).trim()}return""},e.getAriaDescription=function(t){if(!t)return"";var i="",a=t.getAttribute("aria-labelledby");if(a&&a.trim().length>0){for(var n=a.trim().split(" "),l=0,r=n.length;l<r;++l){var o=n[l],s=c.FragmentUtil.getById(t,o);if(s&&!m.DOMUtil.sameNode(s,t)){var d=e.getTextContentExcludingScripts(s);d&&d.trim().length>0&&(i+=u.CommonUtil.normalizeSpacing(d).toLowerCase())}}if(i.trim().length>0)return i.trim()}return(a=t.getAttribute("aria-description"))&&a.trim().length>0?a.trim().toLowerCase():""},e.findAriaLabelDupes=function(t){var i={};return t.forEach(function(t){i[e.getAriaLabel(t)]=(i[e.getAriaLabel(t)]||0)+1}),i},e.getLandmarkAccNames=function(t){var i=n.CacheUtil.getCache(t,"AriaUtil_Landmark_AccNames",null);if(i&&0!==i.length)return i;i=[];var l=t.querySelectorAll('aside,[role="complementary"], footer,[role="contentinfo"], header,[role="banner"], main,[role="main"], nav,[role="navigation"], form,[role="form"], section,[role="region"], article,[role="article"], [role="search"],[role="application"],[role="document"]');return 0===l.length?(n.CacheUtil.setCache(t,"AriaUtil_Landmark_AccNames",i),i):(l.forEach(function(t){if(!s.VisUtil.isNodeHiddenFromAT(t)&&null===u.CommonUtil.getAncestor(t,["DIALOG"])&&null===e.getAncestorWithRole(t,"dialog",!0)){var n="",r=d.AccNameUtil.computeAccessibleName(t);r&&r.name&&r.name.trim().length>0&&(n=r.name.trim());var o=a([],l,!0).filter(function(e){return e.contains(t)&&e!==t});o.length>1&&o.forEach(function(e){var t=d.AccNameUtil.computeAccessibleName(e);t&&t.name&&t.name.trim().length>0&&(n=t.name.trim()+" "+n)});var c=e.getResolvedRole(t);i.push({elem:t,role:c,name:n})}}),n.CacheUtil.setCache(t,"AriaUtil_Landmark_AccNames",i),i)},e.isLandmarkNameUnique=function(t,i,a){void 0===a&&(a=!1);var n,l=e.getLandmarkAccNames(t.ownerDocument);if(!(n="any"===i?l.find(function(e){return e.elem===t}):l.find(function(e){return e.elem===t&&e.role===i})))return null;var r=n.name;if(!a&&""===r)return null;for(var o=0;o<l.length;o++)if(l[o].elem!==t&&r===l[o].name){if("any"===i)return!0;if(l[o].role===i)return!0}return!1},e.hasUniqueAriaLabels=function(t){return e.hasUniqueAriaLabelsLocally(t,!0)},e.hasDuplicateAriaLabelsLocally=function(t,i){if(0===t.length)return!1;var a=t[0].ownerDocument,l=null,r=new Array;i&&(l=n.CacheUtil.getCache(a,"AriaUtil_HAS_UNIQUE_ARIA_LABELS",null)),null===l&&(l={});for(var o=0;o<t.length;++o)if(t[o].hasAttribute)if(t[o].hasAttribute("aria-label")){var s=u.CommonUtil.normalizeSpacing(t[o].getAttribute("aria-label")).toLowerCase();l[s]=!0,s in r||(r[s]=new Array),r[s].push(t[o].nodeName.toLowerCase())}else if(t[o].hasAttribute("aria-labelledby")){for(var d=t[o].getAttribute("aria-labelledby").trim().split(" "),p="",h=0,g=d.length;h<g;++h){var b=d[h],_=c.FragmentUtil.getById(t[o],b);if(_&&!m.DOMUtil.sameNode(_,t[o])){var f=e.getTextContentExcludingScripts(_);p+=u.CommonUtil.normalizeSpacing(f).toLowerCase()}}l[p]=!0,p in r||(r[p]=new Array),r[p].push(t[o].nodeName.toLowerCase())}return i&&n.CacheUtil.setCache(a,"AriaUtil_HAS_UNIQUE_ARIA_LABELS",l),r},e.hasDuplicateAriaLabels=function(t){return e.hasDuplicateAriaLabelsLocally(t,!0)},e.hasUniqueAriaLabelledby=function(e){for(var t=!1,i={},a=0;!t&&a<e.length;++a)if(e[a].hasAttribute&&e[a].hasAttribute("aria-labelledby")&&!u.CommonUtil.isIdReferToSelf(e[a],e[a].getAttribute("aria-labelledby"))){var n=u.CommonUtil.normalizeSpacing(e[a].getAttribute("aria-labelledby"));t=n in i,i[n]=!0}else t=!0;return!t},e.getElementAriaProperty=function(t){var i=n.CacheUtil.getCache(t,"AriaUtil_ElementAriaProperty",null);if(!i){var r=null;if(t.tagName?r=t.tagName.toLowerCase():t.nodeName&&(r=t.nodeName.toLowerCase()),null==(i=l.ARIADefinitions.documentConformanceRequirement[r])){var o=l.ARIADefinitions.documentConformanceRequirementSpecialTags[r];switch(r){case"a":case"area":i=t.hasAttribute("href")?o["with-href"]:o["without-href"];break;case"figure":var s=u.CommonUtil.getChildByTag(t,"figcaption");i=null!==s&&s.length>0?o["child-figcaption"]:o["no-child-figcaption"];break;case"footer":case"header":i=null!==e.getAncestorWithRole(t,"article",!0)||null!==e.getAncestorWithRole(t,"complementary",!0)||null!==e.getAncestorWithRole(t,"navigation",!0)||null!==e.getAncestorWithRole(t,"region",!0)||null!==u.CommonUtil.getAncestor(t,["article","aside","main","nav","section"])?o["des-section-article-aside-main-nav"]:o.other;break;case"img":var d=t.hasAttribute("alt")?t.getAttribute("alt"):null,c=t.hasAttribute("title")?t.getAttribute("title"):null;i=0!==e.getAriaLabel(t).trim().length||null!==d&&d.length>0||null!==c&&c.length>0?o["img-with-accname"]:null!==d?o["img-without-accname-empty-alt"]:o["img-without-accname-no-alt"];break;case"input":if(u.CommonUtil.attributeNonEmpty(t,"type")){var p=t.getAttribute("type").trim().toLowerCase();if(null==(i=o[p]))switch(p){case"checkbox":i=u.CommonUtil.attributeNonEmpty(t,"aria-pressed")?o["checkbox-with-aria-pressed"]:o["checkbox-without-aria-pressed"];break;case"email":i=u.CommonUtil.attributeNonEmpty(t,"list")?o["email-with-list"]:o["email-no-list"];break;case"search":i=u.CommonUtil.attributeNonEmpty(t,"list")?o["search-with-list"]:o["search-no-list"];break;case"tel":i=u.CommonUtil.attributeNonEmpty(t,"list")?o["tel-with-list"]:o["tel-no-list"];break;case"text":i=u.CommonUtil.attributeNonEmpty(t,"list")?o["text-with-list"]:o["text-no-list"];break;case"url":i=u.CommonUtil.attributeNonEmpty(t,"list")?o["url-with-list"]:o["url-no-list"];break;default:i=u.CommonUtil.attributeNonEmpty(t,"list")?o["default-with-list"]:o["default-no-list"]}}else i=u.CommonUtil.attributeNonEmpty(t,"list")?o["text-with-list"]:o["text-no-list"];break;case"li":o=l.ARIADefinitions.documentConformanceRequirementSpecialTags.li,i=t.parentElement&&e.hasRoleInSemantics(t.parentElement,"list")?o["child-of-list-role"]:o["no-child-of-list-role"];break;case"section":var h=e.getAriaLabel(t);i=h&&h.trim().length>0||u.CommonUtil.attributeNonEmpty(t,"title")?o["with-name"]:o["without-name"];break;case"select":o=l.ARIADefinitions.documentConformanceRequirementSpecialTags.select,i=t.hasAttribute("multiple")||u.CommonUtil.attributeNonEmpty(t,"size")&&t.getAttribute("size")>1?o["multiple-attr-size-gt1"]:o["no-multiple-attr-size-gt1"];break;case"summary":o=l.ARIADefinitions.documentConformanceRequirementSpecialTags.summary,i=t.parentElement&&"details"===t.parentElement.nodeName.toLowerCase()&&m.DOMUtil.sameNode(a([],t.parentElement.children,!0).filter(function(e){return"summary"===e.nodeName.toLowerCase()})[0],t)?o["first-summary-of-detail"]:o["no-first-summary-of-detail"];break;case"tbody":case"td":case"tr":i=null!==e.getAncestorWithRole(t,"table",!0)?o["des-table"]:e.getAncestorWithRole(t,"grid",!0)||e.getAncestorWithRole(t,"treegrid",!0)?o["des-grid"]:o["des-other"];break;case"th":var g=u.CommonUtil.getScopeForTh(t);i=null!==e.getAncestorWithRole(t,"table",!0)?"column"===g?o["des-table-column-scope"]:o["des-table-row-scope"]:null!==e.getAncestorWithRole(t,"grid",!0)||null!==e.getAncestorWithRole(t,"treegrid",!0)?"column"===g?o["des-grid-treegrid-column-scope"]:o["des-grid-treegrid-row-scope"]:o["des-other"];break;case"div":var b=t.parentElement;i=null!==b&&"dl"===b.nodeName.toLowerCase()?o["child-dl"]:o["no-child-dl"];break;default:i=l.ARIADefinitions.documentConformanceRequirementSpecialTags.default}}}return n.CacheUtil.setCache(t,"AriaUtil_ElementAriaProperty",i),i||null},e.getAllowedAriaRoles=function(t,i){var a=n.CacheUtil.getCache(t,"AriaUtil_AllowedAriaRoles",null);if(!a){a=[];var l;if(null!=(l=null!=i?i:e.getElementAriaProperty(t))){null!==l.implicitRole&&u.CommonUtil.concatUniqueArrayItemList(l.implicitRole,a),null!==l.validRoles&&u.CommonUtil.concatUniqueArrayItemList(l.validRoles,a);var r=e.getImplicitRole(t);r&&r.length>0&&u.CommonUtil.concatUniqueArrayItemList(l.validRoles,a)}n.CacheUtil.setCache(t,"AriaUtil_AllowedAriaRoles",a)}return a},e.getAllowedAriaAttributes=function(t,i,r){var o=n.CacheUtil.getCache(t,"AriaUtil_AllowedAriaAttributes",null);if(!o){o=[];var s=a([],i,!0),d=t.tagName.toLowerCase(),c=[];l.ARIADefinitions.elementsAllowedDisabled.indexOf(d)>-1&&(o=u.CommonUtil.concatUniqueArrayItem("aria-disabled",o)),l.ARIADefinitions.elementsAllowedRequired.indexOf(d)>-1&&(o=u.CommonUtil.concatUniqueArrayItem("aria-required",o)),l.ARIADefinitions.elementsAllowedReadOnly.indexOf(d)>-1&&(o=u.CommonUtil.concatUniqueArrayItem("aria-readonly",o));var m=null;if(null!=(m=null!=r&&void 0!==r?r:e.getElementAriaProperty(t))){if(null!==m.implicitRole&&(null==s||0===s.length)&&void 0===m.allowAttributesFromImplicitRole)for(var p=0;p<m.implicitRole.length;p++){var h=l.ARIADefinitions.designPatterns[m.implicitRole[p]];if(null!=h){var g=h.props;u.CommonUtil.concatUniqueArrayItemList(g,o),g=e.getRoleRequiredProperties(m.implicitRole[p],t),u.CommonUtil.concatUniqueArrayItemList(g,o),(v=h.prohibitedProps)&&v.length>0&&u.CommonUtil.concatUniqueArrayItemList(v,c),"separator"===m.implicitRole[p]&&u.CommonUtil.isFocusable(t)&&u.CommonUtil.concatUniqueArrayItemList(["aria-disabled","aria-valuenow","aria-valuemax","aria-valuemin","aria-valuetext"],o)}}if(m.globalAriaAttributesValid){var b=l.ARIADefinitions.globalProperties;u.CommonUtil.concatUniqueArrayItemList(b,o)}}for(m&&m.otherRolesForAttributes&&m.otherRolesForAttributes.length>0&&u.CommonUtil.concatUniqueArrayItemList(m.otherRolesForAttributes,s),p=0;null!==s&&p<s.length;p++){var _=l.ARIADefinitions.designPatterns[s[p]];if(null!=_){if(!m||null===m.implicitRole||!m.implicitRole.includes(s[p])||m.implicitRole.includes(s[p])&&void 0===m.allowAttributesFromImplicitRole){var f=_.props;u.CommonUtil.concatUniqueArrayItemList(f,o),f=e.getRoleRequiredProperties(s[p],t),u.CommonUtil.concatUniqueArrayItemList(f,o)}var v;(v=_.prohibitedProps)&&v.length>0&&u.CommonUtil.concatUniqueArrayItemList(v,c),"separator"===s[p]&&u.CommonUtil.isFocusable(t)&&u.CommonUtil.concatUniqueArrayItemList(["aria-disabled","aria-valuemax","aria-valuemin","aria-valuetext"],o)}}if(s.includes("row")&&null==e.getAncestorWithRole(t,"treegrid",!0)){var A=-1;(A=o.indexOf("aria-level"))>-1&&o.splice(A,1),(A=o.indexOf("aria-setsize"))>-1&&o.splice(A,1),(A=o.indexOf("aria-posinset"))>-1&&o.splice(A,1)}if(m&&m.otherAllowedAriaAttributes&&m.otherAllowedAriaAttributes.length>0){for(var w=[],y=0;y<m.otherAllowedAriaAttributes.length;y++)if((R=m.otherAllowedAriaAttributes[y]).includes("=")){var C=R.split("=");t.getAttribute(C[0])===C[1]&&w.push(C[0])}else w.push(R);w.length>0&&u.CommonUtil.concatUniqueArrayItemList(w,o)}if(m&&m.otherDisallowedAriaAttributes&&m.otherDisallowedAriaAttributes.length>0){var k=[];for(y=0;y<m.otherDisallowedAriaAttributes.length;y++){var R;(R=m.otherDisallowedAriaAttributes[y]).includes("=")?(C=R.split("="),t.getAttribute(C[0])===C[1]&&k.push(C[0])):k.push(R)}k.length>0&&u.CommonUtil.concatUniqueArrayItemList(k,c)}o=u.CommonUtil.reduceArrayItemList(c,o),i&&0!==i.length||null!==m.implicitRole||!m.prohibitedAriaAttributesWhenNoImplicitRole||(o=u.CommonUtil.reduceArrayItemList(m.prohibitedAriaAttributesWhenNoImplicitRole,o)),n.CacheUtil.setCache(t,"AriaUtil_AllowedAriaAttributes",o)}return o},e.getConflictOrOverlappingHtmlAttribute=function(e,t,i){var a=l.ARIADefinitions.relatedAriaHtmlAttributes[e.name];if(a){if(!e||0==e.length||!t||0==t.length)return[];var n=[],r=null;if("conflict"===i){if(!a.conflict||0===Object.keys(a.conflict).length)return null;r=a.conflict}else{if("overlapping"!==i)return null;if(!a.overlapping||0===Object.keys(a.overlapping).length)return null;r=a.overlapping}for(var o=!1,s=!1,u=0;u<r.length;u++)for(var d=r[u].ariaAttributeValue,c=r[u].htmlAttributeNames,m=r[u].htmlAttributeValues,p=0;p<t.length;p++){var h=c.indexOf(t[p].name);if(-1!==h){o=!0;var g=null===m||null===m[h]?null:m[h].split(",");null===d?(null===g||g.includes(t[p].value))&&(n.push({result:"Failed",attr:t[p].name}),s=!0):null===g?d===e.value&&(n.push({result:"Failed",attr:t[p].name}),s=!0):("VALUE"===d&&g.includes("VALUE")&&g[0]!==e.value||d===e.value&&g.includes(t[p].value))&&(n.push({result:"Failed",attr:t[p].name}),s=!0)}}return o&&!s&&n.push({result:"Pass",attr:""}),n}return null},e.containsPresentationalChildrenOnly=function(t){var i=e.getRoles(t,!1);if(i&&0!==i.length||(i=e.getImplicitRole(t)),!i||0===i.length)return!1;for(var a=0;null!==i&&a<i.length;a++){var n=l.ARIADefinitions.designPatterns[i[a]];if(null!=n&&!0===n.presentationalChildren)return!0}return!1},e.shouldBePresentationalChild=function(t){for(var i=o.DOMWalker.parentElement(t);i;){if(e.containsPresentationalChildrenOnly(i))return!0;i=r.ARIAMapper.getAriaOwnedBy(i)||o.DOMWalker.parentElement(i)}return!1},e.areRolesDefined=function(e){if(!e||0===e.length)return null;for(var t=l.ARIADefinitions.designPatterns,i=0,a=e;i<a.length;i++)if(!(a[i].toLowerCase()in t))return!1;return!0},e.getInvalidRoles=function(t){var i=e.getUserDefinedRoles(t);if(!i||0===i.length)return null;if(i&&i.includes("generic"))return["generic"];var a=e.getElementAriaProperty(t),n=e.getAllowedAriaRoles(t,a);if(!n||0===n.length)return i;var l=[];if(n.includes("any"))return[];for(var r=0;r<i.length;r++)n.includes(i[r])||l.includes(i[r])||l.push(i[r]);return l},e.getRolesUndefinedByAria=function(t){if(!t)return null;var i=e.getRoles(t,!1),a=[];if(i&&i.length>0)for(var n=l.ARIADefinitions.designPatterns,r=0;r<i.length;r++)i[r]in n||a.push(i[r]);return a},e.getInvalidAriaAttributes=function(t){var i=e.getUserDefinedRoles(t),a=e.areRolesDefined(i);if(null!==a&&!a)return null;var n=[];i&&0!=i.length||(i=e.getImplicitRole(t));var l=e.getUserDefinedAriaAttributes(t),r=e.getElementAriaProperty(t),o=e.getAllowedAriaAttributes(t,i,r);if(l)for(var s=0;s<l.length;s++){var u=l[s].trim().toLowerCase();o.includes(u)||n.includes(u)||n.push(u)}return n},e.getConflictAriaAndHtmlAttributes=function(t){var i=e.getUserDefinedAriaAttributeNameValuePairs(t),a=e.getUserDefinedHtmlAttributeNameValuePairs(t),n=[];if(i&&i.length>0&&a&&a.length>0)for(var l=function(t){var l=e.getConflictOrOverlappingHtmlAttribute(i[t],a,"conflict");if(null===l)return"continue";l.forEach(function(e){"Failed"===e.result&&n.push({ariaAttr:i[t].name,htmlAttr:e.attr})})},r=0;r<i.length;r++)l(r);return n},e.getDeprecatedAriaRoles=function(t){if(!t)return null;var i=e.getRoles(t,!1),a=[];if(i&&i.length>0)for(var n=l.ARIADefinitions.globalDeprecatedRoles,r=0;r<i.length;r++)n.includes(i[r])&&a.push(i[r]);return a},e.getDeprecatedAriaAttributes=function(t){if(!t)return null;var i=t.attributes,a=[];if(i)for(var n=0;n<i.length;n++){var r=i[n].name;"aria-"===r.substring(0,5)&&a.push(r)}if(0===a.length)return[];var o=[],s=l.ARIADefinitions.globalDeprecatedProperties;for(n=0;n<a.length;n++)s.includes(a[n])&&o.push({role:"any",attribute:a[n]});var u=e.getRoles(t,!1);if(u&&u.length>0)for(n=0;n<u.length;n++){var d=l.ARIADefinitions.designPatterns[u[n]];if(d){var c=d.deprecatedProps;if(c&&c.length>0)for(var m=0;m<a.length;m++)c.includes(a[m])&&o.push({role:u[n],attribute:a[m]})}}return o},e.isNodeInGrid=function(t){return null!=e.getAncestorWithRole(t,"grid")},e.navLinkKeywords=["start","next","prev","previous","contents","index"],e.rulesThatHaveToCheckHidden=["RPT_Elem_UniqueId"],e.ariaAttributeRoleDefaults={alert:{"aria-live":"assertive","aria-atomic":"true"},combobox:{"aria-haspopup":"listbox"},listbox:{"aria-orientation":"vertical"},log:{"aria-live":"polite"},menu:{"aria-orientation":"vertical"},menubar:{"aria-orientation":"horizontal"},meter:{"aria-valuemin":"0","aria-valuemax":"100"},option:{"aria-selected":"false"},progressbar:{"aria-valuemin":"0","aria-valuemax":"100"},scrollbar:{"aria-orientation":"vertical","aria-valuemin":"0","aria-valuemax":"100"},separator:{"aria-orientation":"horizontal","aria-valuemin":"0","aria-valuemax":"100"},slider:{"aria-orientation":"horizontal","aria-valuemin":"0","aria-valuemax":"100"},spinbutton:{},status:{"aria-live":"polite","aria-atomic":"true"},tab:{"aria-selected":"false"},tablist:{"aria-orientation":"horizontal"},toolbar:{"aria-orientation":"horizontal"},tree:{"aria-orientation":"vertical"}},e.ariaAttributeGlobalDefaults={"aria-atomic":"false","aria-autocomplete":"none","aria-busy":"false","aria-checked":void 0,"aria-current":"false","aria-disabled":"false","aria-dropeffect":"none","aria-expanded":void 0,"aria-grabbed":void 0,"aria-haspopup":"false","aria-hidden":void 0,"aria-invalid":"false","aria-live":"off","aria-modal":"false","aria-multiline":"false","aria-multiselectable":"false","aria-orientation":void 0,"aria-pressed":void 0,"aria-readonly":"false","aria-required":"false","aria-selected":void 0,"aria-sort":"none"},e.ariaAttributeImplicitMappings={"aria-autocomplete":{form:function(e){return"off"===e.getAttribute("autocomplete")?"none":"both"},input:function(e){return"off"===e.getAttribute("autocomplete")?"none":"both"},select:function(e){return"off"===e.getAttribute("autocomplete")?"none":"both"},textarea:function(e){return"off"===e.getAttribute("autocomplete")?"none":"both"}},"aria-checked":{input:function(e){return e.hasAttribute("indeterminate")?"mixed":""+e.hasAttribute("checked")},menuitem:function(e){return e.hasAttribute("indeterminate")?"mixed":""+e.hasAttribute("checked")},"*":function(e){if(e.hasAttribute("indeterminate"))return"mixed"}},"aria-disabled":{button:function(e){return e.hasAttribute("disabled")?"true":"false"},fieldset:function(e){return e.hasAttribute("disabled")?"true":"false"},input:function(e){return e.hasAttribute("disabled")?"true":"false"},optgroup:function(e){return e.hasAttribute("disabled")?"true":"false"},option:function(e){return e.hasAttribute("disabled")?"true":"false"},select:function(e){return e.hasAttribute("disabled")?"true":"false"},textarea:function(e){return e.hasAttribute("disabled")?"true":"false"}},"aria-expanded":{details:function(e){return e.getAttribute("open")},dialog:function(e){return e.getAttribute("open")}},"aria-multiselectable":{select:function(e){if(e.hasAttribute("multiple"))return"true"}},"aria-placeholder":{input:function(e){return e.getAttribute("placeholder")},textarea:function(e){return e.getAttribute("placeholder")}},"aria-required":{input:function(e){return e.getAttribute("required")},select:function(e){return e.getAttribute("required")},textarea:function(e){return e.getAttribute("required")}}},e}();t.AriaUtil=p},4919(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.CSSUtil=void 0;var a=i(4566),n=i(7139),l=i(7011),r=i(7507),o=i(3864),s=function(){function e(){}return e.selectorMatchesElem=function(e,t){if(!t||0===t.length||""===t.trim())return!1;try{if("function"==typeof e.matches)return e.matches(t);if("function"==typeof e.webkitMatchesSelector)return e.webkitMatchesSelector(t);if("function"==typeof e.msMatchesSelector)return e.msMatchesSelector(t);if("function"==typeof e.matchesSelector)return e.matchesSelector(t);var i=e.ownerDocument||e.document;if(!i)return!1;var a=i.querySelectorAll(t);return Array.from(a).includes(e)}catch(e){return!1}},e.getComputedStyle=function(e,t){return e?e.ownerDocument.defaultView.getComputedStyle(e,t):null},e.getParsedStylesheetRules=function(e){var t=a.CacheUtil.getCache(e,"RPTUtil_ParsedStylesheetRules",null);if(t)return t;for(var i=[],n=0;n<e.styleSheets.length;++n){var l=e.styleSheets[n];try{if(l&&l.cssRules)for(var r=0;r<l.cssRules.length;++r){var o=l.cssRules[r],s=o.selectorText;if(s){var u=s.match(/^(.*)(:[a-zA-Z-]*)$/),d=!!u,c=d?u[1]:s,m=d?u[2]:"";i.push({fullRuleSelector:s,hasPseudoClass:d,selMain:c,selPseudo:m,style:o.style})}}}catch(e){if(!e.toString().includes("Cannot access rules")&&!e.toString().includes("SecurityError:"))throw e}}return a.CacheUtil.setCache(e,"RPTUtil_ParsedStylesheetRules",i),i},e.fillStyle=function(e,t){for(var i=0;i<t.length;++i){if("all"===t[i]&&t[t[i]]){for(var a=0,n=e;a<n.length;a++){var l=n[a];for(var r in l)delete l[r]}break}r=t[i];for(var o=0,s=e;o<s.length;o++){l=s[o];var u=t.getPropertyPriority(r);if(r in l&&l[r].endsWith("!important")){if("important"!==u||l[r].startsWith("inherit")||l[r].startsWith("unset"))continue;l[r]=t[r]+" !important"}else l[r]=t[r]+("important"===u?" !important":"")}}},e.getDefinedStylesInternal=function(t,i,a){for(var n={},l={},r={},o=0,s=a;o<s.length;o++){var u=s[o];l[u]={},r[u]={}}for(var d=e.getParsedStylesheetRules(t.ownerDocument),c=a.includes(":focus"),m=function(n){if(null!==i&&!i.some(function(e){return!!n.style[e]}))return"continue";var o=n.selPseudo,s=n.hasPseudoClass,u=n.selMain;if(c&&":focus"===o&&(u=u.replace(/([ >][^+~ >]+):focus-within/g,"$1")),e.selectorMatchesElem(t,u))for(var d=0,m=a;d<m.length;d++){var p=m[d],h=l[p],g=r[p];s||e.fillStyle([h,g],n.style),o===p&&e.fillStyle([g],n.style)}},p=0,h=d;p<h.length;p++)m(h[p]);for(var g=0,b=a;g<b.length;g++){u=b[g];var _=l[u],f=r[u];if(e.fillStyle([_,f],t.style),""===u)n[u]=_;else{for(var v={},A=Object.keys(f),w=0;w<A.length;w++){var y=A[w];f[y]!==_[y]&&(v[y]=f[y])}n[u]=v}}return n},e.getDefinedStylesMultiple=function(t,i,n){if(!t)return null;var l={},r=null===i?"all":i.slice().sort().join(","),o=a.CacheUtil.getCache(t,"RPTUtil_DefinedStyles",null);o||(o={});var s=o[r],u=[];if(s){for(var d=0,c=n;d<c.length;d++)void 0!==s[g=c[d]]?l[g]=s[g]:u.push(g);if(0===u.length)return l}else s={},u=n;if(u.length>0){for(var m=e.getDefinedStylesInternal(t,i,u),p=0,h=u;p<h.length;p++){var g;l[g=h[p]]=m[g],s[g]=m[g]}o[r]=s,a.CacheUtil.setCache(t,"RPTUtil_DefinedStyles",o)}return l},e.getDefinedStyles=function(t,i,n){if(!t)return null;var l=null===i?"all":i.slice().sort().join(","),r=n||"",o=a.CacheUtil.getCache(t,"RPTUtil_DefinedStyles",null);o||(o={});var s=o[l];if(s||(s={}),void 0!==s[r])return s[r];var u=e.getDefinedStylesInternal(t,i,[r])[r];return s[r]=u,o[l]=s,a.CacheUtil.setCache(t,"RPTUtil_DefinedStyles",o),u},e.getMediaOrientationTransform=function(e){var t=a.CacheUtil.getCache(e,"RPTUtil_MediaOrientationTransforms",null);if(t)return t;for(var i={},n=0;n<e.styleSheets.length;++n){var l=e.styleSheets[n];try{if(l&&l.cssRules)for(var r=0;r<l.cssRules.length;++r){var o=l.cssRules[r];if(4===o.MEDIA_RULE){var s=o;if(s&&s.media)for(var u=s.media,d=0;d<u.length;d++)if(u.item(d)){var c=u.item(d).toLocaleLowerCase(),m=i[c];m||(m={});for(var p=s.cssRules,h=0;h<p.length;++h)if(1===p[h].STYLE_RULE){var g=p[h],b=g.selectorText;if(b){for(var _={},f=g.style,v=0;v<f.length;++v){var A=f[v],w=A.toLocaleLowerCase();if("transform"===w){if("all"===A&&f[A]){_={};break}_[A]=f[A]}else"rotate"===w&&(_[A]=f[A])}Object.keys(_).length>0&&(m[b]=_)}}Object.keys(m).length>0&&(i[c]=m)}}}}catch(e){if(!e.toString().includes("Cannot access rules")&&!e.toString().includes("SecurityError:"))throw e}}return a.CacheUtil.setCache(e,"RPTUtil_MediaOrientationTransforms",i),i},e.getRotationDegree=function(e){var t=0;try{if(!e)return t;for(var i=(e=e.replaceAll(", ",",")).split(" "),a=0;a<i.length;a++){var n=i[a].trim();if(""!==n)if(n.startsWith("rotate3d")){var l=n.indexOf("("),r=n.indexOf(")");if(-1!==l&&-1!==r){var o=n.substring(l+1,r),s=void 0;if(o&&(s=o.split(",")),s&&4===s.length){if(!(d=s[3]))continue;if((d=d.trim()).endsWith("turn")){var u=d.substring(0,d.length-4);u=parseFloat(u),isNaN(u)||(t=360*u)}else d.endsWith("rad")?(u=d.substring(0,d.length-3),u=parseFloat(u),isNaN(u)||(t=180*u/Math.PI)):d.endsWith("deg")&&(u=d.substring(0,d.length-3),u=parseFloat(u),isNaN(u)||(t+=u))}}}else if(n.startsWith("rotate")||n.startsWith("rotateZ")){if(l=n.indexOf("("),r=n.indexOf(")"),-1!==l&&-1!==r){var d;if(!(d=n.substring(l+1,r)))continue;(d=d.trim()).endsWith("turn")?(u=d.substring(0,d.length-4),u=parseFloat(u),isNaN(u)||(t=360*u)):d.endsWith("rad")?(u=d.substring(0,d.length-3),u=parseFloat(u),isNaN(u)||(t=180*u/Math.PI)):d.endsWith("deg")&&(u=d.substring(0,d.length-3),u=parseFloat(u),isNaN(u)||(t+=u))}}else if(n.startsWith("matrix3d")){if(l=n.indexOf("("),r=n.indexOf(")"),-1!==l&&-1!==r&&(o=n.substring(l+1,r),s=null,o&&(s=o.split(",")),null!==s)){var c=Math.atan2(s[4],s[5]);t+=Math.round(Math.round(180*c/Math.PI))}}else n.startsWith("matrix")&&(l=n.indexOf("("),r=n.indexOf(")"),-1!==l&&-1!==r&&(o=n.substring(l+1,r),s=null,o&&(s=o.split(",")),null!==s&&(c=Math.atan2(s[1],s[0]),t+=Math.round(Math.round(180*c/Math.PI)))))}for(;t>=360;)t-=360}catch(e){throw console.log("Cannot retrieve rotation degree: "+e),e}return t},e.getPixelsFromStyle=function(t,i){if(!t)return 0;var a=t.trim().match(/(-?[\d.]+)([a-z%]*)/);if(null===a)return 0;if(""===a[2]||0===a[1])return 0;var n=e.convertValue2Pixels(a[2],a[1],i);return null===n?n:parseFloat(n)},e.convertValue2Pixels=function(e,t,i){if(0===t)return 0;e||(e="px");var a={px:function(e){return e},cm:function(e){return 37.8*e},mm:function(e){return 3.78*e},q:function(e){return.95*e},in:function(e){return 96*e},pc:function(e){return 16*e},pt:function(e){return 1.33*e},rem:function(e){return e*parseFloat(getComputedStyle(i.ownerDocument.documentElement).getPropertyValue("font-size"))},em:function(e){return e*parseFloat(getComputedStyle(i).getPropertyValue("font-size"))},vw:function(e){return e/100*i.ownerDocument.defaultView.innerWidth},vh:function(e){return e/100*i.ownerDocument.defaultView.innerHeight},"%":function(e){return e/100*parseFloat(getComputedStyle(i).getPropertyValue("font-size"))}};return e in a?a[e](t):null},e.isMaterialIconFont=function(t){var i={"Material Icons":"https://fonts.googleapis.com/icon?family=Material+Icons"},a=e.getDefinedStyles(t,["font-family"])["font-family"],n=!1;if(a&&a.split(",")[0].replace(/['"]+/g,"").trim()in i&&(n=!0),!n){var l=t.classList;for(var r in{"material-icons":"https://fonts.googleapis.com/icon?family=Material+Icons"})if(l.contains(r)){n=!0;break}}if(!n)return!1;for(var o=!1,s=t.ownerDocument.styleSheets,u=0;u<s.length;u++)if(s&&s.length>0&&Object.values(i).indexOf(s[u].href)>-1){o=!0;break}return o},e.getWeightNumber=function(e){var t={light:100,bold:700};return parseInt(e)||(e in t?t[e]:400)},e.getFontInPixels=function(t,i){var a=parseFloat(t);if(!a)return{"xx-small":16,"x-small":10,small:13,medium:16,large:18,"x-large":24,"xx-large":32}[t];var n=t.substring((""+a).length);return e.convertValue2Pixels(n,a,i)},e.getCSSStyle=function(e){var t="";if(null===e)return[];if(e.IBM_CSS_THB)return e.IBM_CSS_THB;if("style"===e.nodeName.toLowerCase())void 0!==(t=e.innerText)&&""!==t.trim()||(t=e.textContent);else{if(!e.hasAttribute("style"))return[];t=e.getAttribute("style")}if(null===t||0===t.trim().length)return[];var i=/\s*([^:\s]+)\s*:\s*([^;$}]+)\s*(;|$)/g,a=/\s*([^{]*){([^}]*)}/g;if(-1===(t=t.replace(/(\/\*+(?:(?:(?:[^\*])+)|(?:[\*]+(?!\/)))[*]+\/)|\/\/.*/g," ")).indexOf("{")){for(var n={},l=void 0;null!=(l=i.exec(t));)n[l[1]]=l[2].trim().toLowerCase();var r=[{selector:null,values:n}];return e.IBM_CSS_THB=r,r}r=[],l=void 0;for(var o=void 0;null!=(l=a.exec(t));){n={};for(var s=l[1],u=l[2];null!=(o=i.exec(u));)n[o[1]]=o[2].trim().toLowerCase();r.push({selector:s,values:n})}return e.IBM_CSS_THB=r,r},e.getInlineStatus=function(e){if(!e)return null;var t=getComputedStyle(e);if(!t)return null;var i={inline:!1,text:!1,violation:null};if("inline"!==t.getPropertyValue("display"))return i;i.inline=!0;var a=e.parentElement;if(!a)return i;var l=new r.DOMMapper,o=l.getUnadjustedBounds(e),s=getComputedStyle(a).getPropertyValue("display");if("block"!==s&&"inline-block"!==s)return n.CommonUtil.isInnerTextOnlyEmpty(a)||(i.text=!0),i;function u(e,t){if(e.nodeType===Node.TEXT_NODE)return e.nodeValue&&e.nodeValue.trim().length>0?"yes":"no";if(e.nodeType===Node.ELEMENT_NODE){if("br"===e.nodeName.toLowerCase())return"block";if("inline"===getComputedStyle(e).getPropertyValue("display")){if(n.CommonUtil.isTarget(e)&&o.width<24){var a=l.getUnadjustedBounds(e);return t&&Math.round(o.width/2)+o.left-a.left<24||!t&&Math.round(o.width/2)+o.left-(a.left+a.width)<24?(i.violation=e.nodeName.toLowerCase(),"violation"):"no"}return n.CommonUtil.isInnerTextOnlyEmpty(e)?"no":"yes"}return"block"}return"block"}for(var d=e.nextSibling;d;){if("yes"===(c=u(d,!0))){i.text=!0;break}if("block"===c)break;d=d.nextSibling}for(d=e.previousSibling;d;){var c;if("yes"===(c=u(d,!1))){i.text=!0;break}if("block"===c)break;d=d.previousSibling}return i},e.isTargetBrowserDefault=function(t){if(!t)return!1;var i=l.AriaUtil.getRoles(t,!1);if(i&&i.length>0)return!1;var a=e.getDefinedStyles(t,["line-height","height","width","min-height","min-width","font-size","margin-top","margin-bottom","margin-left","margin-right"]);return!(a["line-height"]||a.height||a.width||a["min-height"]||a["min-width"]||a["font-size"]||a["margin-top"]||a["margin-bottom"]||a["margin-left"]||a["margin-right"])},e.containsCKJ=function(e){return!!e&&e.trim().replace(/(?:[\u4e00-\u9fff\u3400-\u4dbf])+/g,"").length!==e.trim().length},e.getAncestorWithStyles=function(t,i,n){void 0===n&&(n=[]);var l="AriaUtil_AncestorWithStyles_"+JSON.stringify(i)+"_"+JSON.stringify(n),r=a.CacheUtil.getCache(t,l,null);if(null!==r)return"NOT_FOUND"===r?null:r;for(var s=t;null!==s;)if(1===s.nodeType&&"http://www.w3.org/2000/svg"!==s.namespaceURI){var u=e.getDefinedStyles(s,Object.keys(i));for(var d in i){var c=u[d];if(c&&(c=c.split(" ")[0],!n.includes(c))){var m=i[d];if(m.includes("*"))return a.CacheUtil.setCache(t,l,s),s;if(m.includes(c))return a.CacheUtil.setCache(t,l,s),s}}s=o.DOMWalker.parentElement(s)}else s=o.DOMWalker.parentElement(s);return a.CacheUtil.setCache(t,l,"NOT_FOUND"),null},e.getValueUnitPair=function(e){if(!e)return null;if(Number.isInteger(e))return["px",e];var t=parseInt(e);if(isNaN(t))return null;var i=(e=e.trim().toLowerCase()).trim().match(/([a-z]+)$/),a="px";return i&&(a=i[1]),[a,t]},e}();t.CSSUtil=s},4566(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.CacheUtil=void 0;var a=i(3864),n=function(){function e(){}return e.getCache=function(e,t,i){if(e){var a=(9===e.nodeType||e.nodeType,e);return void 0===a.aceCache&&(a.aceCache={}),void 0===a.aceCache[t]&&(a.aceCache[t]=i),a.aceCache[t]}},e.setCache=function(e,t,i){if(e){var a=(9===e.nodeType||e.nodeType,e);return void 0===a.aceCache&&(a.aceCache={}),a.aceCache[t]=i,i}},e.getSetCache=function(e,t,i){if(e){var a=(9===e.nodeType||e.nodeType,e);return void 0===a.aceCache&&(a.aceCache={}),void 0!==a.aceCache[t]&&void 0!==a.aceCache[t]||(a.aceCache[t]=i()),a.aceCache[t]}},e.clearCaches=function(e){var t=0;delete e.ownerDocument.aceCache;var i=new a.DOMWalker(e,!1,e,!0);do{++t,delete i.node.aceCache,i.node.ownerDocument&&delete i.node.ownerDocument.aceCache}while(i.nextNode());return t},e}();t.CacheUtil=n},167(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.ClipPathUtil=void 0;var a=i(4566),n=i(4919),l=function(){function e(){}return e.isNodeVisuallyHiddenByClipPath=function(t){if(!t||1!==t.nodeType)return!1;var i=t,l=a.CacheUtil.getCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",void 0);if(void 0!==l)return l;var r=n.CSSUtil.getComputedStyle(i),o=parseInt(r.width),s=parseInt(r.height),u=r["clip-path"];if(!u||"none"===u.trim()||""===u.trim())return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;var d=(u=u.trim().replace(/\s+/g," ").toLowerCase()).indexOf("inset(");if(-1!==d){var c=u.indexOf("round"),m=u.substring(u.indexOf("(")+1,u.indexOf(")"));if(-1!==c&&(m=u.substring(u.indexOf("(")+1,c)),1===(f=m.trim().split(" ")).length){var p=e.isClippedByInset(i,f[0],f[0],f[0],f[0]);return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",p),p}if(2===f.length)return p=e.isClippedByInset(i,f[0],f[1],f[0],f[1]),a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",p),p;if(3===f.length)return p=e.isClippedByInset(i,f[0],f[1],f[1],f[2]),a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",p),p;if(4===f.length)return p=e.isClippedByInset(i,f[0],f[1],f[2],f[3]),a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",p),p}if(-1!==(d=u.indexOf("rect("))){c=u.indexOf("round"),m=u.substring(u.indexOf("(")+1,u.indexOf(")")),-1!==c&&(m=u.substring(u.indexOf("(")+1,c)),"auto"===(f=m.trim().split(" "))[0]&&(f[0]="0px"),"auto"===f[3]&&(f[3]="0px"),"auto"===f[1]&&(f[1]="100%"),"auto"===f[2]&&(f[2]="100%"),f[2]=Math.max(f[0],f[2]),f[1]=Math.max(f[1],f[3]);var h=parseInt(f[0]);if(isNaN(h))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;if(f[0].endsWith("%"))h=h*s/100;else{if(!(L=n.CSSUtil.getValueUnitPair(h)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;h=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}if(h>=s)return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;var g=parseInt(f[3]);if(isNaN(g))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;if(f[3].endsWith("%"))g=g*o/100;else{if(!(L=n.CSSUtil.getValueUnitPair(g)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;g=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}if(g>=o)return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;var b=parseInt(f[1]);if(isNaN(b))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;if(f[1].endsWith("%"))b=b*o/100;else{if(!(L=n.CSSUtil.getValueUnitPair(b)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;b=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}var _=parseInt(f[2]);if(isNaN(_))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;if(f[2].endsWith("%"))_=_*s/100;else{if(!(L=n.CSSUtil.getValueUnitPair(_)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;_=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}return _-h<=e.THRESHOLD||b-g<=e.THRESHOLD?(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!0),!0):(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1)}if(-1!==(d=u.indexOf("xywh("))){c=u.indexOf("round"),m=u.substring(u.indexOf("(")+1,u.indexOf(")")),-1!==c&&(m=u.substring(u.indexOf("(")+1,c));var f=m.trim().split(" "),v=parseInt(f[0]);if(isNaN(v))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;if(f[0].endsWith("%"))v=v*o/100;else{if(!(L=n.CSSUtil.getValueUnitPair(top)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;v=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}if(v>=o)return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;var A=parseInt(f[1]);if(isNaN(A))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;if(f[1].endsWith("%"))A=A*s/100;else{if(!(L=n.CSSUtil.getValueUnitPair(A)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;scrollY=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}if(A>=s)return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;var w=parseInt(f[2]);if(isNaN(w))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;if(f[2].endsWith("%"))w=w*o/100;else{if(!(L=n.CSSUtil.getValueUnitPair(w)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;w=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}if(w<=e.THRESHOLD)return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!0),!0;var y=parseInt(f[3]);if(isNaN(y))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;if(f[3].endsWith("%"))y=y*s/100;else{if(!(L=n.CSSUtil.getValueUnitPair(y)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;y=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}return y<=e.THRESHOLD?(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!0),!0):(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1)}if(-1!==(d=u.indexOf("circle("))){f=(m=u.substring(u.indexOf("(")+1,u.indexOf(")"))).trim().split(" ");var C=parseInt(f[0]);if(isNaN(C))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;if(f[0].endsWith("%"))C=C*(o>s?s:o)/100;else{if(!(L=n.CSSUtil.getValueUnitPair(C)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;C=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}return C<=e.THRESHOLD?(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!0),!0):(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1)}if(-1!==(d=u.indexOf("ellipse("))){if((f=(m=u.substring(u.indexOf("(")+1,u.indexOf(")"))).trim().split(" ")).length>3&&"closest-side"===f[0]&&"farthest-side"===f[1]&&"at"===f[2]){if(C=parseInt(f[3]),4===f.length){if(f[3].endsWith("%"))C=C*(N=o>s?s:o)/100;else{if(!(L=n.CSSUtil.getValueUnitPair(C)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;C=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}return C<=e.THRESHOLD?(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!0),!0):(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1)}if(5===f.length)for(var k=3;k<f.length;k++){var R=parseInt(f[k]);if(f[k].endsWith("%"))R=R*(N=3===k?o:s)/100;else{if(!(L=n.CSSUtil.getValueUnitPair(R)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;R=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}return R<=e.THRESHOLD?(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!0),!0):(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1)}return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1}var x=u.indexOf("at");if(m=u.substring(u.indexOf("(")+1,u.indexOf(")")),-1!==x&&(m=u.substring(u.indexOf("(")+1,x)),2!==(f=m.trim().split(" ")).length)return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;for(k=0;k<f.length;k++){if(C=parseInt(f[k]),f[k].endsWith("%"))C=C*(N=0===k?o:s)/100;else{if(!(L=n.CSSUtil.getValueUnitPair(C)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;C=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}return C<=e.THRESHOLD?(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!0),!0):(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1)}return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1}if(-1!==(d=u.indexOf("polygon("))){"nonzero"!==(f=(m=u.substring(u.indexOf("(")+1,u.indexOf(")"))).trim().split(","))[0]&&"evenodd"!==f[0]||f.shift(),A=0,v=0;var P=!1,T=!1;for(k=0;k<f.length;k++){var U=f[k].trim().split(" ");if(2!=U.length)return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;for(var I=[0,0],E=0;E<2;E++){var N=parseInt(U[E]);if(isNaN(N))return!1;if(U[E].endsWith("%"))I[E]=0===E?N*o/100:N*s/100;else{var L;if(!(L=n.CSSUtil.getValueUnitPair(U[E])))return!1;I[E]=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}}0===k&&(v=I[0],A=I[1]),Math.abs(I[0]-v)>=e.THRESHOLD&&(P=!0),Math.abs(I[1]-A)>=e.THRESHOLD&&(T=!0)}return P&&T?(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1):(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!0),!0)}return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1},e.isClippedByInset=function(t,i,a,l,r){void 0===a&&(a="0px"),void 0===l&&(l="0px"),void 0===r&&(r="0px");var o=n.CSSUtil.getComputedStyle(t),s=parseInt(o.width),u=parseInt(o.height),d=parseInt(i);if(isNaN(d))return!1;if(i.endsWith("%"))d=d*u/100;else{if(!(h=n.CSSUtil.getValueUnitPair(i)))return!1;d=n.CSSUtil.convertValue2Pixels(h[0],h[1],t)}if(d>u)return!1;var c=parseInt(a);if(isNaN(c))return!1;if(a.endsWith("%"))c=c*s/100;else{if(!(h=n.CSSUtil.getValueUnitPair(a)))return!1;c=n.CSSUtil.convertValue2Pixels(h[0],h[1],t)}if(c>s)return!1;var m=parseInt(l);if(isNaN(m))return!1;if(l.endsWith("%"))m=m*u/100;else{if(!(h=n.CSSUtil.getValueUnitPair(l)))return!1;m=n.CSSUtil.convertValue2Pixels(h[0],h[1],t)}if(m>u)return!1;var p=parseInt(r);if(isNaN(p))return!1;if(r.endsWith("%"))p=p*s/100;else{var h;if(!(h=n.CSSUtil.getValueUnitPair(r)))return!1;p=n.CSSUtil.convertValue2Pixels(h[0],h[1],t)}return!(p>s)&&(u-(d+m)<=e.THRESHOLD||s-(c+p)<=e.THRESHOLD)},e.THRESHOLD=5,e}();t.ClipPathUtil=l},3883(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.ColorObj=t.ColorUtil=void 0;var a=i(3864),n=function(){function e(){}return e.Color=function(t){if(!t)return null;if("transparent"===(t=t.toLowerCase()))return new l(255,255,255,0);if(t in e.CSSColorLookup&&(t=e.CSSColorLookup[t]),t.startsWith("rgb(")){var i=/\s*rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/;return null===(a=t.match(i))?null:new l(a[1],a[2],a[3])}var a;if(t.startsWith("rgba("))return i=/\s*rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(.+)\s*\)/,null===(a=t.match(i))?null:new l(a[1],a[2],a[3],a[4]);if("#"!=t.charAt(0))return null;4===t.length&&(t="#"+t.charAt(1).repeat(2)+t.charAt(2).repeat(2)+t.charAt(3).repeat(2));var n=parseInt(t.substring(1,3),16),r=parseInt(t.substring(3,5),16),o=parseInt(t.substring(5,7),16);return new l(n,r,o)},e.ColorCombo=function(t){try{var i=t.ownerDocument;if(!i)return null;var n=i.defaultView;if(!n)return null;for(var l=[],r=t;r;)1===r.nodeType&&l.push(r),r=a.DOMWalker.parentElement(r);var o={hasGradient:!1,hasBGImage:!1,textShadow:!1,fg:null,bg:null},s=(b=n.getComputedStyle(t)).color;s||(s="black");for(var u=e.Color(s),d=/transparent|rgba?\([^)]+\)/gi,c=function(e,t,i){try{if(void 0===e.length)return e;for(var a=null,n=null,l=1;l<e.length;++l){for(var r=e[l-1],o=i.contrastRatio(e[l-1]),s=.1,u=0;s>1e-4;){for(;u+s<=1&&o>i.contrastRatio(e[l].mix(e[l-1],u+s).getOverlayColor(t));)r=e[l].mix(e[l-1],u+s).getOverlayColor(t),o=i.contrastRatio(r),u+=s;for(;u-s>=0&&o>i.contrastRatio(e[l].mix(e[l-1],u-s).getOverlayColor(t));)r=e[l].mix(e[l-1],u-s).getOverlayColor(t),o=i.contrastRatio(r),u-=s;s/=10}(null===n||n>o)&&(n=o,a=r)}return a}catch(e){console.log(e)}return t},m=e.Color("white"),p=null,h=null,g=null;l.length>0;){var b,_=l.pop();if(null!==(b=n.getComputedStyle(_))){var f=null;if(b.backgroundColor&&"transparent"!=b.backgroundColor&&"rgba(0, 0, 0, 0)"!=b.backgroundColor&&(f=e.Color(b.backgroundColor)),b.backgroundImage&&b.backgroundImage.indexOf&&-1!=b.backgroundImage.indexOf("gradient")){var v=b.backgroundImage.match(d);if(v){for(var A=[],w=0;w<v.length;++w)if(v[w].length){var y=e.Color(v[w]);if(void 0!==y.alpha&&y.alpha<1){var C=g||m;y=y.getOverlayColor(C)}A.push(y)}else v.splice(w--,1);f=c(A,g||m,u)}}null===p||b.opacity&&b.opacity.length>0&&parseFloat(b.opacity)<1?(null!=g&&(g.alpha=p*h,m=g.getOverlayColor(m)),p=1,h=null,g=null,b.opacity&&b.opacity.length>0&&(p=parseFloat(b.opacity)),null!=f&&(h=(g=f).alpha||1,delete g.alpha,1===p&&1===h&&(o.hasBGImage=!1,o.hasGradient=!1))):null!=f&&(null===g?(h=(g=f).alpha||1,delete g.alpha):h=(g=f.getOverlayColor(g)).alpha||1,1===p&&1===h&&1===(g.alpha||1)&&f.alpha),b.backgroundImage&&"none"!=b.backgroundImage&&(b.backgroundImage.indexOf&&-1!=b.backgroundImage.indexOf("gradient")?o.hasGradient=!0:o.hasBGImage=!0)}}return null!=g&&delete(u=u.getOverlayColor(g)).alpha,u.alpha=(u.alpha||1)*p,u=u.getOverlayColor(m),null!=g&&(g.alpha=p*h,m=g.getOverlayColor(m)),o.fg=u,o.bg=m,b.textShadow&&"none"!==b.textShadow&&(o.textShadow=!0),o}catch(e){return null}},e.CSSColorLookup={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",green:"#008000",greenyellow:"#adff2f",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgrey:"#d3d3d3",lightgreen:"#90ee90",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370d8",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#d87093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32",buttontext:"rgba(0, 0, 0, 0.847)",buttonface:"#ffffff",graytext:"rgba(0, 0, 0, 0.247)"},e}();t.ColorUtil=n;var l=function(){function e(e,t,i,a){function n(e){if("string"!=typeof e)return e;var t=e;return"%"!=(t=t.trim())[t.length-1]?parseInt(t):Math.round(2.55*parseFloat(t.substring(0,t.length-1)))}this.red=n(e),this.green=n(t),this.blue=n(i),void 0!==a&&(this.alpha="string"==typeof a?parseFloat(a):a)}return e.prototype.toHexHelp=function(e){var t=Math.round(e).toString(16);return 1===t.length?"0"+t:t},e.prototype.toHex=function(){return"#"+this.toHexHelp(this.red)+this.toHexHelp(this.green)+this.toHexHelp(this.blue)},e.prototype.contrastRatio=function(e){var t=this;void 0!==this.alpha&&(t=this.getOverlayColor(e));var i=t.relativeLuminance();if(!e.relativeLuminance){var a="";for(var n in e)a+=n+"\n";alert(e),alert(a)}var l=e.relativeLuminance();return i>l?(i+.05)/(l+.05):(l+.05)/(i+.05)},e.prototype.relativeLuminance=function(){var e=this.red/255,t=this.green/255,i=this.blue/255;return.2126*(e=e<=.04045?e/12.92:Math.pow((e+.055)/1.055,2.4))+.7152*(t=t<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4))+.0722*(i<=.04045?i/12.92:Math.pow((i+.055)/1.055,2.4))},e.prototype.mix=function(t,i){if(void 0===this.alpha&&void 0===t.alpha)return new e(i*this.red+(1-i)*t.red,i*this.green+(1-i)*t.green,i*this.blue+(1-i)*t.blue);var a=this.alpha?this.alpha:1,n=t.alpha?t.alpha:1;return new e(i*this.red+(1-i)*t.red,i*this.green+(1-i)*t.green,i*this.blue+(1-i)*t.blue,i*a+(1-i)*n)},e.prototype.getOverlayColor=function(e){if(void 0===this.alpha||this.alpha>=1)return this;if(this.alpha<0)return null;if(void 0!==e.alpha&&e.alpha<1)return null;var t=this.mix(e,this.alpha);return delete t.alpha,t},e.fromCSSColor=function(t){var i=-1,a=-1,l=-1;if((t=t.toLowerCase()).startsWith("rgb(")){var r=/\s*rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/;if(null===(o=t.match(r)))return null;i=o[1],a=o[2],l=o[3]}else if(t.startsWith("rgba(")){var o;if(r=/\s*rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(.+)\s*\)/,null===(o=t.match(r)))return null;i=o[1],a=o[2],l=o[3]}else{if("#"!=t.charAt(0)){if(!(t in n.CSSColorLookup))return null;t=n.CSSColorLookup[t]}var s=function(e){for(var t={a:10,b:11,c:12,d:13,e:14,f:15},i=0,a=0;a<e.length;++a)i=16*i+parseInt(e.charAt(a)in t?t[e.charAt(a)]:e.charAt(a));return i};4===t.length&&(t="#"+t.charAt(1).repeat(2)+t.charAt(2).repeat(2)+t.charAt(3).repeat(2)),i=s(t.substring(1,3)),a=s(t.substring(3,5)),l=s(t.substring(5,7))}return new e(i,a,l)},e}();t.ColorObj=l},7139(e,t,i){var a=this&&this.__spreadArray||function(e,t,i){if(i||2===arguments.length)for(var a,n=0,l=t.length;n<l;n++)!a&&n in t||(a||(a=Array.prototype.slice.call(t,0,n)),a[n]=t[n]);return e.concat(a||Array.prototype.slice.call(t))};Object.defineProperty(t,"__esModule",{value:!0}),t.CommonUtil=void 0;var n=i(9910),l=i(4566),r=i(7011),o=i(1950),s=i(3946),u=i(1686),d=i(3864),c=i(5279),m=function(){function e(){}return e.wordCount=function(e){return 0===(e=e.trim()).length?0:e.split(/\s+/g).length},e.isTabbable=function(t){if(!s.VisUtil.isNodeVisible(t))return!1;if(t.hasAttribute("inert")||u.DOMUtil.getAncestorWithAttribute(t,"inert",""))return!1;if(t.hasAttribute("tabindex"))return parseInt(t.getAttribute("tabindex"))>=0;var i=t.nodeName.toLowerCase();if(i in e.tabTagMap){var a=e.tabTagMap[i];return"function"==typeof a&&(a=a(t)),a}return!!t.hasAttribute("contenteditable")},e.isFocusable=function(t){return"undefined"!==t&&null!==t&&e.isTabbable(t)},e.isClickable=function(t){if(!s.VisUtil.isNodeVisible(t))return!1;var i=t.nodeName.toLowerCase();if(i in e.tabTagMap){var a=e.tabTagMap[i];return"function"==typeof a&&(a=a(t)),a}return!(!r.AriaUtil.isWidget(t)||!t.hasAttribute("tabindex"))},e.isTableDescendant=function(e){return e?e.aria.filter(function(e){return["table","grid","treegrid"].includes(e.role)}):null},e.tabIndexLEZero=function(t){if(e.hasAttribute(t,"tabindex")&&t.getAttribute("tabindex").match(/^-?\d+$/)){var i=parseInt(t.getAttribute("tabindex"));return 0===i||-1===i}return!1},e.getTabbableChildren=function(t){var i=0;if(t.firstChild||"IFRAME"===t.nodeName.toUpperCase())for(var a=new d.DOMWalker(t);a.nextNode()&&a.node!=t;)1==a.node.nodeType&&!a.bEndTag&&e.isTabbable(a.node)&&++i;return i},e.normalizeSpacing=function(e){return e?e.trim().replace(/\s+/g," "):""},e.isHtmlEquiv=function(e,t){var i=!1;if(e&&"input"===e.nodeName.toLowerCase()){var a=e.getAttribute("type").toLowerCase();a&&(-1!=t.indexOf("checkbox")?i="checkbox"===a:-1!=t.indexOf("radio")&&(i="radio"===a))}return i},e.nonExistantIDs=function(t,i){var a="";if(e.normalizeSpacing(i).length<1)return a;for(var n=i.split(" "),l=t.ownerDocument,r=0;r<n.length;r++){var o="//*[@id='"+n[r]+"']";l.evaluate(o,t,l.defaultNSResolver,0,null).iterateNext()||(a+=n[r]+", ")}return e.normalizeSpacing(a).length>=2?a.substring(0,a.length-2):""},e.getDocElementsByTag=function(e,t){var i=c.FragmentUtil.getOwnerFragment(e);t=t.toLowerCase();var a=l.CacheUtil.getCache(i,"RPT_DOCELEMSBYTAG",{});return t in a||(a[t]=i.querySelectorAll(t),l.CacheUtil.setCache(i,"RPT_DOCELEMSBYTAG",a)),a[t]},e.getChildByTag=function(t,i){return e.getChildByTagHidden(t,i,!1,!1)},e.getChildByTagHidden=function(t,i,a,n){for(var l=[],r=t.firstChild;null!=r;){if(r.nodeName.toLowerCase()===i){if((a||n&&!e.shouldCheckHiddenContent(r))&&!s.VisUtil.isNodeVisible(r)){r=r.nextSibling;continue}l.push(r)}r=r.nextSibling}return l},e.getElementsByRole=function(t,i){return e.getElementsByRoleHidden(t,i,!1,!1)},e.getElementsByRoleHidden=function(t,i,a,n){var o=null;if(null===(o=n?l.CacheUtil.getCache(t,"AriaUtil_GETELEMENTSBY_ROLE_IMPLICIT",null):l.CacheUtil.getCache(t,"AriaUtil_GETELEMENTSBY_ROLE",null))){o={};for(var s=t.body;null!==d.DOMWalker.parentNode(s);)s=d.DOMWalker.parentNode(s);for(var u=new d.DOMWalker(s);u.nextNode();)if(u.elem()&&!u.bEndTag){var c=[];if(u.elem()&&u.elem().hasAttribute("role")&&(c=u.elem().getAttribute("role").split(" ")),u.elem()&&0===c.length&&n){var m=r.AriaUtil.getImplicitRole(u.node);null!==m&&m.length>0&&(c=m)}if(0===c.length)continue;if(a&&e.shouldNodeBeSkippedHidden(u.node))continue;for(var p=0;p<c.length;++p)c[p]in o||(o[c[p]]=[]),o[c[p]].push(u.node)}n?l.CacheUtil.setCache(t,"AriaUtil_GETELEMENTSBY_ROLE_IMPLICIT",o):l.CacheUtil.setCache(t,"AriaUtil_GETELEMENTSBY_ROLE",o)}var h=[];if("string"==typeof i){var g=i;(i=[]).push(g)}if(i.length)for(p=0;p<i.length;++p){var b=o[i[p]];if(b)for(var _=0;_<b.length;++_)h.push(b[_])}return h},e.isTarget=function(t){if(!t||1!==t.nodeType||["html","body"].includes(t.nodeName.toLowerCase())||null!==e.getAncestor(t,["svg","pre","code","script","meta","head"])||!s.VisUtil.isNodeVisible(t)||s.VisUtil.isNodeVisuallyHidden(t)||e.isNodeDisabled(t)||s.VisUtil.isElementOffscreen(t))return!1;if(e.isClickable(t))return!0;var i=r.AriaUtil.getResolvedRole(t);if(!i)return!1;if(["listitem","menuitem","menuitemcheckbox","menuitemradio","option","radio","switch","treeitem"].includes(i)){var a=t.parentElement;if(a&&"group"===r.AriaUtil.getResolvedRole(a)&&(a=a.parentElement),a&&e.isTarget(a))return!0}return!1},e.getFileExt=function(e){var t=e.match(/\.(([^;?#\.]|^$)+)([;?#]|$)/);return null!=t&&t.length>=2?"."+t[1]:""},e.getFileAnchor=function(e){var t=e.match(/#(([^;?\.]|^$)+)([;?]|$)/);return null!=t&&t.length>=2?t[1]:""},e.checkObjEmbed=function(t,i,a){var n=t.nodeName.toLowerCase();if("object"!=n&&"embed"!=n&&"a"!=n&&"area"!=n)return!1;var l=!1;if(!l&&t.hasAttribute("type")&&(l=a(t.getAttribute("type").toLowerCase())),!l&&t.hasAttribute("codetype")&&(l=a(t.getAttribute("codetype"))),!l){var r="";"embed"===n?r=t.getAttribute("src"):"a"===n||"area"===n?r=t.getAttribute("href"):t.hasAttribute("data")&&(r=t.getAttribute("data")),null===r&&(r=""),l=i(e.getFileExt(r))}if(!l&&"object"===n)for(var o=e.getChildByTagHidden(t,"param",!1,!0),s=0;!l&&null!=o&&s<o.length;++s)l=o[s].hasAttribute("value")&&i(e.getFileExt(o[s].getAttribute("value")));return l},e.isAudioObjEmbedLink=function(t){return e.checkObjEmbed(t,e.isAudioExt,function(e){return e.startsWith("audio")})},e.isAudioExt=function(t){return e.valInArray(t.toLowerCase(),[".aif",".aifc",".aiff",".air",".asf",".au",".cda",".dsm",".dss",".dwd",".iff",".kar",".m1a",".med",".mp2",".mp3",".mpa",".pcm",".ra",".ram",".rm",".sam",".sf",".sf2",".smp",".snd",".svx",".ul",".voc",".wav",".wma",".wve"])},e.isVideoObjEmbedLink=function(t){return e.checkObjEmbed(t,e.isVideoExt,function(e){return e.startsWith("video")||e.startsWith("application/x-shockwave-flash")})},e.isVideoExt=function(t){return e.valInArray(t.toLowerCase(),[".asf",".avi",".divx",".dv",".m1v",".m2p",".m2v",".moov",".mov",".mp4",".mpeg",".mpg",".mpv",".ogm",".omf",".qt",".rm",".rv",".smi",".smil",".swf",".vob",".wmv",".rmvb",".mvb"])},e.isImageObjEmbedLink=function(t){return e.checkObjEmbed(t,e.isImgExt,function(e){return e.startsWith("image")})},e.isImgExt=function(t){return e.valInArray(t.toLowerCase(),e.image_extensions)},e.isHtmlExt=function(t){return e.valInArray(t.toLowerCase(),[".asp",".aspx",".cfm",".cfml",".cgi",".htm",".html",".shtm",".shtml",".php",".pl",".py",".shtm",".shtml",".xhtml"])},e.hasTriggered=function(e,t){return l.CacheUtil.getCache(e,t,!1)},e.triggerOnce=function(e,t,i){if(i)return!0;var a=l.CacheUtil.getCache(e,t,!1);return l.CacheUtil.setCache(e,t,!0),a},e.valInArray=function(e,t){for(var i in t)if(t[i]===e)return!0;return!1},e.getAncestor=function(e,t){for(var i=e;null!==i;){var a=i.nodeName.toLowerCase();if("string"==typeof t){if(a===t.toLowerCase())break}else if(t.length){for(var n in t)if(t[n]===a)return i}else if(a in t)break;i=d.DOMWalker.parentNode(i)}return i},e.isSibling=function(e,t){if(e&&t){var i=null;for(d.DOMWalker.parentNode(e)&&d.DOMWalker.parentNode(e).firstChild&&(i=d.DOMWalker.parentNode(e).firstChild);i;){if(i===t)return!0;i=i.nextSibling}}return!1},e.isDescendant=function(e,t){for(var i=d.DOMWalker.parentNode(t);null!=i;){if(i===e)return!0;i=d.DOMWalker.parentNode(i)}return!1},e.isDisabledByFirstChildFormElement=function(t){var i=["input","textarea","select","keygen","progress","meter","output"];if(null!=t.firstChild)for(var a=new d.DOMWalker(t);a.nextNode();)if(i.includes(a.node.nodeName.toLowerCase()))return!!e.isNodeDisabled(a.node);return!1},e.isDisabledByReferringElement=function(t){for(var i=t.getAttribute("id"),a=t.ownerDocument.body;null!==d.DOMWalker.parentNode(a);)a=d.DOMWalker.parentNode(a);for(var n=new d.DOMWalker(a);n.nextNode();)if(n.node&&1===n.node.nodeType&&n.elem()&&(n.elem().getAttribute("aria-describedby")||"").split(" ").includes(i)&&e.isNodeDisabled(n.node))return!0},e.getInputLabel=function(t){return e.getLabelForElement(t)},e.getLabelForElement=function(t){return e.getLabelForElementHidden(t,!1)},e.getLabelForElementHidden=function(t,i){var a=t.getRootNode();if(!l.CacheUtil.getCache((a.nodeType,a),"AriaUtil_LABELS",null)){for(var n={},r=e.getDocElementsByTag(t,"label"),o=0;o<r.length;++o)if(r[o].hasAttribute("for")){if(i&&!s.VisUtil.isNodeVisible(r[o]))continue;n[r[o].getAttribute("for")]=r[o]}l.CacheUtil.setCache((a.nodeType,a),"AriaUtil_LABELS",n)}if(t.hasAttribute("id")){var u=t.getAttribute("id");if(u.trim().length>0)return l.CacheUtil.getCache((a.nodeType,a),"AriaUtil_LABELS",{})[u]}return null},e.getElementAttribute=function(e,t){if(!(t&&e&&e.hasAttribute&&e.hasAttribute(t)))return null;var i=e.getAttribute(t);if(!n.ARIADefinitions.referenceProperties.includes(t))return i;for(var a=i.split(/ +/g),l=!1,r=0;a<a.length;++r){var o=document.getElementById(a[r]);if(o&&!u.DOMUtil.sameNode(o,e)){l=!0;break}}return l?i:null},e.hasImplicitLabel=function(t){var i=e.getAncestor(t,"label");if(i&&"label"===i.tagName.toLowerCase()&&e.isFirstFormElement(i,t)){var a=i.cloneNode(!0);return a=e.removeAllFormElementsFromLabel(a),e.hasInnerContentHidden(a)}return!1},e.getImplicitLabel=function(t){var i=e.getAncestor(t,"label");if(i&&"label"===i.tagName.toLowerCase()&&e.isFirstFormElement(i,t)){var a=i.cloneNode(!0);a=e.removeAllFormElementsFromLabel(a);var n=e.getInnerText(a);return n&&""!==n.trim()?n.trim():null}return null},e.getFormFieldLabel=function(t){var i="",a=null,n=e.getLabelForElementHidden(t,!0);if(n)a=n.innerText;else{if(!(n=e.getAncestor(t,"label"))||"label"!==n.tagName.toLowerCase()||!e.isFirstFormElement(n,t))return null;var l=n.cloneNode(!0);l=e.removeAllFormElementsFromLabel(l),a=e.getInnerText(l)}return a&&""!==a.trim()&&(i+=a.trim()),(a=e.getLabelTextFromAttribute(n,!0))&&""!==a.trim()&&(i+=a.trim()),(a=r.AriaUtil.getAriaLabel(n))&&""!==a.trim()&&(i+=a.trim()),i.trim()},e.getLabelTextFromAttribute=function(t,i){for(var a=null,n=0;n<t.children.length;n++){var l=t.children.item(n);if(e.form_labelable_elements.includes(l.nodeName.toLowerCase())){a=l;break}}for(var c=new d.DOMWalker(t),m="";c.nextNode()&&c.node!==t;)if(c.node&&1===c.node.nodeType&&c.elem()){var p=c.elem();if(i&&(s.VisUtil.isNodeHiddenFromAT(p)||s.VisUtil.isNodePresentational(p))||a&&a.contains(p))continue;var h=r.AriaUtil.getResolvedRole(p);if("textbox"===h){var g=p.getAttribute("value");g&&g.trim().length>0&&(m+=" "+g.trim())}else if("combobox"===h||"listbox"===h){var b=p.getAttribute("aria-activedescendant")||p.getAttribute("aria-selected")||p.getAttribute("aria-checked");if(b){var _=p.ownerDocument.getElementById(b);if(_&&!u.DOMUtil.sameNode(p,_)){var f=o.AccNameUtil.computeAccessibleName(_);f&&f.name&&(m+=" "+f.name.trim())}}}else if(["progressbar","scrollbar","slider","spinbutton","meter"].includes(h)){var v=p.getAttribute("aria-valuetext");v&&v.trim().length>0&&(m+=" "+v.trim()),(v=p.getAttribute("aria-valuenow"))&&v.trim().length>0&&(m+=" "+v.trim()),(v=p.getAttribute("value"))&&v.trim().length>0&&(m+=" "+v.trim())}var A=r.AriaUtil.getAriaLabel(p);A&&""!==A.trim()&&(m+=" "+A.trim())}return m.trim()},e.isFirstFormElement=function(t,i){if(null!=t.firstChild)for(var a=new d.DOMWalker(t);a.nextNode();)if(-1!==e.form_labelable_elements.indexOf(a.node.nodeName.toLowerCase()))return a.node===i;return!1},e.isShadowHostElement=function(t){if(e.isShadowElement(t))return!1;for(var i=t;i;){if(i.shadowRoot)return!0;i=d.DOMWalker.parentElement(i)}return!1},e.isShadowElement=function(e){return"[object ShadowRoot]"===e.getRootNode().toString()},e.removeAllFormElementsFromLabel=function(e){for(var t=["input","textarea","select","button","datalist","optgroup","option","keygen","output","progress","meter"],i=e.childNodes,a=0;a<i.length;a++)t.indexOf(i[a].nodeName.toLowerCase())>-1&&e.removeChild(i[a]);return e},e.isIdReferToSelf=function(e,t){if(!t||""===t.trim())return!1;for(var i=t.trim().split(" "),a=0,n=i.length;a<n;++a){var l=c.FragmentUtil.getById(e,i[a]);if(l&&u.DOMUtil.sameNode(l,e))return!0}return!1},e.nodeDepth=function(e){for(var t=0,i=e;null!==i;)i=d.DOMWalker.parentNode(i),t+=1;return t},e.compareNodeOrder=function(t,i){if(t===i)return 0;var a=e.nodeDepth(t),n=e.nodeDepth(i);if(n>a){for(var l=0;l<n-a;++l)i=d.DOMWalker.parentNode(i);if(t===i)return-2}else if(a>n){for(l=0;l<a-n;++l)t=d.DOMWalker.parentNode(t);if(t===i)return 2}for(;null!=t&&null!=i&&d.DOMWalker.parentNode(t)!=d.DOMWalker.parentNode(i);)t=d.DOMWalker.parentNode(t),i=d.DOMWalker.parentNode(i);if(null===t||null===i||d.DOMWalker.parentNode(t)!=d.DOMWalker.parentNode(i))return null;for(;null!=i&&i!=t;)i=i.previousSibling;return null===i?1:-1},e.attributeNonEmpty=function(e,t){return e.hasAttribute(t)&&e.getAttribute(t).trim().length>0},e.getFrameByName=function(e,t){for(var i=[e.ownerDocument.defaultView],a=0;a<i.length;){try{if(i[a].name===t)return i[a];for(var n=0;n<i[a].frames.length;++n)try{i[a].frames[n]&&!i.includes(i[a].frames[n])&&i.push(i[a].frames[n])}catch(e){}}catch(e){}++a}return null},e.defaultNSResolver=function(e){var t;switch(e){case"html":t="http://www.w3.org/1999/xhtml";case"x2":t="http://www.w3.org/TR/xhtml2";case"x":t="http://www.w3.org/1999/xhtml";case"xhtml":t="http://www.w3.org/1999/xhtml";default:t=null}return t},e.isInnerTextOnlyEmpty=function(t){var i=t.innerText;null!=i&&0!==i.trim().length||"slot"===t.nodeName.toLowerCase()||void 0===t.textContent||(i=t.textContent);var a=!(null!==i&&i.trim().length>0);if(1===t.nodeType&&"slot"===t.nodeName.toLowerCase())for(var n=0,l=t.assignedNodes();n<l.length;n++){var r=l[n];a=a&&e.isInnerTextEmpty(r)}return a},e.getInnerText=function(e){var t=e.innerText;return null!=t&&""!==t.trim()||(t=e.textContent),t},e.getOnScreenInnerText=function(t){if(!t)return null;if(3===t.nodeType)return t.nodeValue();for(var i="",a=new d.DOMWalker(t);a.nextNode()&&a.node!==t&&a.node!==t.parentNode;)if(!a.bEndTag){if(1===a.node.nodeType&&(s.VisUtil.hiddenByDefaultElements.includes(a.node.nodeName.toLowerCase())||!s.VisUtil.isNodeVisible(a.node)||s.VisUtil.isElementOffscreen(a.node))){if("title"===a.node.nodeName.toLowerCase()&&e.getAncestor(a.node,"svg"))continue;if(a.node.nextSibling){3===a.node.nextSibling.nodeType&&a.node.nextSibling.nodeValue&&""!==a.node.nextSibling.nodeValue.trim()&&(i+=" "+a.node.nextSibling.nodeValue.trim()),a.node=a.node.nextSibling;continue}break}3===a.node.nodeType&&a.node.nodeValue&&""!==a.node.nodeValue.trim()&&(i+=" "+a.node.nodeValue.trim())}return i.trim()},e.getNodeText=function(e){if(!e)return"";for(var t="",i=e.childNodes,a=0;a<i.length;++a)3==i[a].nodeType&&(t+=i[a].nodeValue);return t},e.isInnerTextEmpty=function(t){var i=e.getInnerText(t);return!(null!=i&&i.trim().length>0)},e.hasInnerContent=function(t){var i=e.getInnerText(t),a=null!==i&&i.trim().length>0;if(null!==t.firstChild)for(var n=new d.DOMWalker(t);!a&&n.nextNode();)a="img"===n.node.nodeName.toLowerCase()&&e.attributeNonEmpty(n.node,"alt");return a},e.hasInnerContentHidden=function(t){return e.hasInnerContentHiddenHyperLink(t,!1)},e.svgHasName=function(t){return e.attributeNonEmpty(t,"aria-label")||e.attributeNonEmpty(t,"aria-labelledby")||!!t.querySelector(":scope > title")},e.hasInnerContentHiddenHyperLink=function(t,i){if(!t)return!1;var a=!1;if(null!=t.firstElementChild)for(var n=new d.DOMWalker(t);!a&&n.nextNode()&&n.node!=t;){var l=n.node;if(!((a="img"===l.nodeName.toLowerCase()&&(e.attributeNonEmpty(l,"alt")||e.attributeNonEmpty(l,"title"))&&!s.VisUtil.isNodeHiddenFromAT(l)&&!s.VisUtil.isNodePresentational(l)||"svg"===l.nodeName.toLowerCase()&&e.svgHasName(l))||1!==l.nodeType||s.VisUtil.isNodeHiddenFromAT(l)||s.VisUtil.isNodePresentational(l)||(a=!e.isInnerTextOnlyEmpty(l))||!0!==i)){a=e.attributeNonEmpty(l,"aria-label")||e.attributeNonEmpty(l,"aria-labelledby");var r=l.ownerDocument;if(r){var o=r.defaultView;if(o){var u=o.getComputedStyle(l);a||null==u||(a=(u.backgroundImage&&u.backgroundImage.indexOf||u.content)&&e.attributeNonEmpty(l,"alt"))}}}3===l.nodeType&&d.DOMWalker.parentElement(l)===t&&(a=!e.isInnerTextEmpty(l))}else a=!e.isInnerTextEmpty(t);return a},e.hasInnerContentOrAlt=function(t){var i=e.getInnerText(t),a=null!=i&&i.trim().length>0||e.attributeNonEmpty(t,"alt");if(null!=t.firstChild)for(var n=new d.DOMWalker(t);!a&&n.nextNode()&&n.node!=t;)!(a="img"===n.node.nodeName.toLowerCase()&&e.attributeNonEmpty(n.node,"alt"))&&(r.AriaUtil.hasRole(n.node,"button",!0)||r.AriaUtil.hasRole(n.node,"textbox"))&&(r.AriaUtil.hasAriaLabel(n.node)||e.attributeNonEmpty(n.node,"title")||e.getLabelForElementHidden(n.elem(),!0))&&(a=!0);return a},e.concatUniqueArrayItem=function(e,t){return-1===t.indexOf(e)&&null!==e&&t.push(e),t},e.concatUniqueArrayItemList=function(t,i){for(var a=0;null!==t&&a<t.length;a++)i=e.concatUniqueArrayItem(t[a],i);return i},e.reduceArrayItemList=function(e,t){return t&&t.length>0&&e&&e.length>0?t.filter(function(t){return!e.includes(t)}):t},e.getScopeForTh=function(e){if(e.hasAttribute("scope")){var t=e.getAttribute("scope").toLowerCase();if("row"===t||"rowgroup"===t)return"row";if("col"===t||"colgroup"===t)return"column"}var i=a([],e.parentElement.children,!0).filter(function(e){return 1===e.nodeType&&"th"!=e.tagName.toLowerCase()});return null===i||0===i.length?"column":"row"},e.getControlOfLabel=function(t){var i=e.getAncestor(t,"label");if(i&&i.hasAttribute("for"))return c.FragmentUtil.getById(t,i.getAttribute("for"));for(var a={},n=t;n;){if(1===n.nodeType){var r=n;r.hasAttribute("id")&&(a[r.getAttribute("id")]=!0)}n=d.DOMWalker.parentNode(n)}if(0===Object.keys(a).length)return null;for(var o=1===t.nodeType?t.getAttribute("aria-labelledby"):null,s=l.CacheUtil.getSetCache(t.ownerDocument,"CommonUtil::getControlOfLabel",function(){return t.ownerDocument.querySelectorAll("*[aria-labelledby]")}),u=0;u<s.length;++u)for(var m=s[u],p=0,h=m.getAttribute("aria-labelledby").split(" ");p<h.length;p++)if(h[p]in a&&!e.isIdReferToSelf(t,o))return m;return null},e.isNodeDisabled=function(t){var i=l.CacheUtil.getCache(t,"PT_NODE_DISABLED",void 0);if(void 0!==i)return i;i=!1,3===t.nodeType&&(t=d.DOMWalker.parentNode(t));var a=t.nodeName.toLowerCase(),r=t.hasAttribute("disabled"),o=i,s=t.hasAttribute("aria-disabled")&&"true"===t.getAttribute("aria-disabled");if(o||r&&n.ARIADefinitions.elementsAllowedDisabled.indexOf(a)>-1||s)return i=!0,l.CacheUtil.setCache(t,"PT_NODE_DISABLED",i),!0;var u=d.DOMWalker.parentNode(t);if(null!=u&&1===u.nodeType){var c=e.isNodeDisabled(u);return c&&(i=!0),l.CacheUtil.setCache(t,"PT_NODE_DISABLED",i),c}return!1},e.shouldCheckHiddenContent=function(e){return!1},e.shouldNodeBeSkippedHidden=function(t){return!e.shouldCheckHiddenContent(t)&&!s.VisUtil.isNodeVisible(t)},e.isfocusableByDefault=function(t){return!("a"!==t.nodeName.toLowerCase()||!e.hasAttribute(t,"href"))||!("area"!==t.nodeName.toLowerCase()||!e.hasAttribute(t,"href"))||-1!==["input","select","button","textarea","option","area"].indexOf(t.nodeName.toLowerCase())},e.nonTabableChildCheck=function(t){if(!t.hasAttribute("tabindex")||-1!=parseInt(t.getAttribute("tabindex")))return!1;for(var i=new d.DOMWalker(t);i.nextNode();){var a=i.elem();if(null!==a&&a.hasAttribute("tabindex")&&-1!=parseInt(a.getAttribute("tabindex"))&&!e.hasInnerContent(a))return!1}return!0},e.hasAttribute=function(e,t){var i=!1;if(e.hasAttribute)i=e.hasAttribute(t);else if(e.attributes&&e.attributes.getNamedItem){var a=e.attributes.getNamedItem(t);i=a&&a.specified}return i},e.truncateText=function(e,t){return void 0===t&&(t=150),e&&(e=e.trim()).length>t?e.substring(0,t-1)+"...":e},e.input_type_with_placeholder=["text","search","tel","url","email","password","number"],e.input_text_types=["text","file","password","checkbox","radio","search","tel","url","email","date","number","range","time","color"],e.input_time_types=["date","month","week","time","datetime-local"],e.input_other_types=["range","color","checkbox","radio","file","image"],e.form_button_types=["button","reset","submit"],e.form_labelable_elements=["input","textarea","select","keygen","progress","meter","output","button"],e.tabTagMap={button:function(e){return!e.hasAttribute("disabled")},iframe:!0,input:function(e){if(e.hasAttribute("disabled")||"hidden"===e.getAttribute("type"))return!1;if("radio"===e.getAttribute("type")){var t=e.getAttribute("name");if(!t||0===t.trim().length)return!0;var i=e.ownerDocument.querySelectorAll("input[type='radio'][name='"+t.trim()+"']");if(0===i.length||1===i.length)return!0;for(var a=null,n=0;n<i.length;n++)i[n].checked&&(a=i[n]);return null!==a?!!u.DOMUtil.sameNode(a,e):!!u.DOMUtil.sameNode(i[0],e)}return!0},select:function(e){return!e.hasAttribute("disabled")},textarea:function(e){return!e.hasAttribute("disabled")&&"hidden"!==e.getAttribute("type")},a:function(e){return e.hasAttribute("href")},area:function(e){return e.hasAttribute("href")},audio:function(e){return e.hasAttribute("controls")},video:function(e){return e.hasAttribute("controls")},summary:function(e){return e.parentElement&&"details"===e.parentElement.nodeName.toLowerCase()&&u.DOMUtil.sameNode(a([],e.parentElement.children,!0).filter(function(e){return"summary"===e.nodeName.toLowerCase()})[0],e)},details:function(e){return e.children&&0===a([],e.children,!0).filter(function(e){return"summary"===e.nodeName.toLowerCase()}).length}},e.image_extensions=[".bmp",".gif",".jpg",".jpeg",".pcx",".png"],e}();t.CommonUtil=m},9196(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.TableUtil=void 0;var a=i(3946),n=i(7011),l=i(7139),r=function(){function e(){}return e.isDataTable=function(e){return!(n.AriaUtil.hasRole(e,"none")||n.AriaUtil.hasRole(e,"presentation"))},e.isComplexDataTable=function(t){if("AriaUtil_isComplexDataTable"in t)return!!t.AriaUtil_isComplexDataTable;var i=!1;if(t&&e.isDataTable(t)){for(var a=null,n=null,r=t.getElementsByTagName("tr"),o=r.length,s=0,u=0,d=0,c=0;!i&&c<o;++c)if(a=r[c].getElementsByTagName("th"),n=r[c].getElementsByTagName("td"),u=a.length,0!==(s=n.length)){i=u>1;for(var m=0;!i&&m<u;++m)i=(a[m].hasAttribute("rowspan")||a[m].hasAttribute("colspan"))&&l.CommonUtil.getAncestor(a[m],"table")===t;for(var p=0;!i&&p<s;++p)i=(n[p].hasAttribute("rowspan")||n[p].hasAttribute("colspan")||n[p].hasAttribute("headers")&&l.CommonUtil.normalizeSpacing(n[p].getAttribute("headers")).split(" ").length>2)&&l.CommonUtil.getAncestor(n[p],"table")===t}else u>0&&++d,i=2===d;if(!i){var h=t.getElementsByTagName("thead"),g=h.length;g>0&&((i=g>1)||(i=h[0].getElementsByTagName("tr").length>1))}i||0===o||(i=u>0&&!e.tableHeaderExists(t))}return t.AriaUtil_isComplexDataTable=i,i},e.isTableCellEmpty=function(e){return!e||!a.VisUtil.isNodeVisible(e)||0===e.innerHTML.replace(/&nbsp;/g," ").trim().length},e.isTableRowEmpty=function(t){if(!t||!t.cells||0===t.cells.length||!a.VisUtil.isNodeVisible(t))return!0;for(var i=!0,n=0;i&&n<t.cells.length;n++){var l=t.cells[n];i=e.isTableCellEmpty(l)}return i},e.tableHeaderExists=function(t){var i=t.rows;if(!i||0===i.length)return null;for(var a=!0,n=i[0],r=0;a&&r<i.length;r++)(n=i[r]).parentNode&&"tfoot"===n.parentNode.nodeName.toLowerCase()||(a=e.isTableRowEmpty(n));if(a)return null;for(a=!0,r=0;a&&r<n.cells.length;r++){var o=n.cells[r];a=e.isTableCellEmpty(o)||"th"===o.nodeName.toLowerCase()}if(a)return!0;a=!0;for(var s=0;a&&s<i.length;++s)i[s].parentNode&&"tfoot"===i[s].parentNode.nodeName.toLowerCase()||(a=!i[s].cells||0===i[s].cells.length||0===i[s].cells[0].innerHTML.trim().length||"td"!=i[s].cells[0].nodeName.toLowerCase());if(a)return!0;a=!0;var u=[],d=[];for(r=0;a&&r<i.length;r++)for(var c=i[r],m=0;m<c.cells.length;m++)o=c.cells[m],e.isTableCellEmpty(o)||("td"===o.nodeName.toLowerCase()?o.getAttribute("headers")&&0!==o.getAttribute("headers").trim().length?l.CommonUtil.concatUniqueArrayItemList(o.getAttribute("headers").trim().split(" "),d):a=!1:"th"===o.nodeName.toLowerCase()&&o.getAttribute("id")&&o.getAttribute("id").trim().length>0&&l.CommonUtil.concatUniqueArrayItem(o.getAttribute("id").trim(),u));return!!(a&&u.length>0&&d.every(function(e){return u.includes(e)}))},e.isLayoutTable=function(e){return n.AriaUtil.hasRole(e,"presentation")||n.AriaUtil.hasRole(e,"none")},e.isTableDescendant=function(e){return e?e.aria.filter(function(e){return["table","grid","treegrid"].includes(e.role)}):null},e}();t.TableUtil=r},3946(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.VisUtil=void 0;var a=i(4566),n=i(1686),l=i(3864),r=i(7507),o=i(7011),s=i(4919),u=i(167),d=function(){function e(){}return e.isNodeVisible=function(t){3===t.nodeType&&(t=l.DOMWalker.parentNode(t));var i,n=t;if(1!==n.nodeType)return!0;if(!n.ownerDocument)return!0;var r=n.nodeName.toLowerCase();if(null!=e.hiddenByDefaultElements&&null!=e.hiddenByDefaultElements&&e.hiddenByDefaultElements.indexOf(r)>-1)return!1;var o=a.CacheUtil.getCache(n,"PT_NODE_HIDDEN",void 0);if(void 0!==o)return o;if(o=a.CacheUtil.setCache(n,"PT_NODE_HIDDEN",!1),null===e.unhideableElements||void 0===e.unhideableElements||-1===e.unhideableElements.indexOf(r)){if(!n.ownerDocument.defaultView)return a.CacheUtil.setCache(n,"PT_NODE_HIDDEN",!0);i=n.ownerDocument.defaultView.getComputedStyle(n,null);var s=n.getAttribute("hidden"),d=o,c="boolean"==typeof n.hidden&&n.hidden;if(!i&&!c&&null==s&&!d)return a.CacheUtil.setCache(n,"PT_NODE_HIDDEN",!0);if(null!==i&&("none"===i.getPropertyValue("display")||!a.CacheUtil.getCache(n,"Visibility_Check_Parent",null)&&"hidden"===i.getPropertyValue("visibility"))||"block"!==i.getPropertyValue("display")&&(c||null!=s||d))return a.CacheUtil.setCache(n,"PT_NODE_HIDDEN",!1);if(e.isContentHidden(n))return a.CacheUtil.setCache(n,"PT_NODE_HIDDEN",!1);if(u.ClipPathUtil.isNodeVisuallyHiddenByClipPath(n))return a.CacheUtil.setCache(n,"PT_NODE_HIDDEN",!1)}var m=l.DOMWalker.parentNode(n);if(null!=m&&1===m.nodeType){a.CacheUtil.setCache(m,"Visibility_Check_Parent",!0);var p=e.isNodeVisible(m);return a.CacheUtil.setCache(n,"PT_NODE_HIDDEN",p)}return a.CacheUtil.setCache(n,"PT_NODE_HIDDEN",!0)},e.isNodeVisuallyHidden=function(t){if(!t||1!==t.nodeType)return!1;var i=t,n=a.CacheUtil.getCache(i,"PT_NODE_VISUALLY_HIDDEN",void 0);if(void 0===n){var r=s.CSSUtil.getComputedStyle(i);if("absolute"===r.position&&r.clip&&"rect(0px,0px,0px,0px)"===r.clip.replaceAll(" ","")||r.opacity&&parseFloat(r.opacity)<.1)return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN",!0),!0;var o=l.DOMWalker.parentElement(i);if(!o)return!1;var u=e.isNodeVisuallyHidden(o);return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN",u),u}return n},e.isContentHidden=function(e){if(!e)return!1;var t=a.CacheUtil.getCache(e,"PT_NODE_ContentHidden",void 0);if(void 0!==t)return t;var i=getComputedStyle(e);return i?"hidden"!==i.getPropertyValue("content-visibility")||"inline"===i.getPropertyValue("display")?(a.CacheUtil.setCache(e,"PT_NODE_ContentHidden",!1),!1):(a.CacheUtil.setCache(e,"PT_NODE_ContentHidden",!0),!0):(a.CacheUtil.setCache(e,"PT_NODE_ContentHidden",!1),!1)},e.isElementOffscreen=function(e){if(!e)return!0;if(1!==e.nodeType)return!1;var t=a.CacheUtil.getCache(e,"PT_NODE_Offscreen",void 0);if(void 0!==t)return t;var i=(new r.DOMMapper).getUnadjustedBounds(e);return i?0===i.height||0===i.width||i.top+i.height<=0||i.left+i.width<=0?(a.CacheUtil.setCache(e,"PT_NODE_Offscreen",!0),!0):(a.CacheUtil.setCache(e,"PT_NODE_Offscreen",!1),!1):(a.CacheUtil.setCache(e,"PT_NODE_Offscreen",!0),!0)},e.isNodeHiddenFromAT=function(t){if(!t)return!1;var i=a.CacheUtil.getCache(t,"PT_NODE_HiddenFromAT",void 0);return void 0!==i?i:e.isNodeVisible(t)&&"true"!==t.getAttribute("aria-hidden")?n.DOMUtil.getAncestorWithAttribute(t,"aria-hidden","true")?(a.CacheUtil.setCache(t,"PT_NODE_HiddenFromAT",!0),!0):(a.CacheUtil.setCache(t,"PT_NODE_HiddenFromAT",!1),!1):(a.CacheUtil.setCache(t,"PT_NODE_HiddenFromAT",!0),!0)},e.isNodePresentational=function(e){var t=o.AriaUtil.getResolvedRole(e);return!(!t||"none"!==t&&"presentation"!==t)},e.isElementScrollable=function(e){if(!e)return!1;var t=s.CSSUtil.getComputedStyle(e);if(!t)return!1;var i=t.getPropertyValue("overflow-x"),a=t.getPropertyValue("overflow-y");if("visible"!==i||"hidden"!==a&&"scroll"!==a&&"auto"!==a||(i="auto"),"visible"!==a||"hidden"!==i&&"scroll"!==i&&"auto"!==i||(a="auto"),"clip"===i&&"visible"!==a&&"clip"!==a&&(i="hidden"),"clip"===a&&"visible"!==i&&"clip"!==i&&(a="hidden"),!("visible"!==i&&"hidden"!==i&&"clip"!==i||"visible"!==a&&"hidden"!==a&&"clip"!==a))return!1;if(Math.max(e.offsetWidth,e.offsetHeight)<30||Math.min(e.offsetWidth,e.offsetHeight)<15)return!1;var n=s.CSSUtil.getPixelsFromStyle(t.paddingLeft,e)+s.CSSUtil.getPixelsFromStyle(t.paddingRight,e),l=s.CSSUtil.getPixelsFromStyle(t.paddingTop,e)+s.CSSUtil.getPixelsFromStyle(t.paddingBottom,e);return!(e.scrollWidth-e.clientWidth<1+n&&e.scrollHeight-e.clientHeight<1+l)},e.unhideableElements=["area","param","audio"],e.hiddenByDefaultElements=["script","link","style","head","meta","base","noscript","template","datalist"],e}();t.VisUtil=d},8855(e){e.exports=JSON.parse('{"1.1.1":{"num":"1.1.1","url":"https://www.w3.org/TR/WCAG22/#non-text-content","scId":"WCAG2:non-text-content","scAltId":["text-equiv-all"],"test":"WCAG2:text-equiv-all","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#non-text-content","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/non-text-content.html","handle":"Non-text Content","level":"A","wcagType":"2.0"},"1.2.1":{"num":"1.2.1","url":"https://www.w3.org/TR/WCAG22/#audio-only-and-video-only-prerecorded","scId":"WCAG2:audio-only-and-video-only-prerecorded","scAltId":["media-equiv-av-only-alt"],"test":"WCAG2:media-equiv-av-only-alt","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-only-and-video-only-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-only-and-video-only-prerecorded.html","handle":"Audio-only and Video-only (Prerecorded)","level":"A","wcagType":"2.0"},"1.2.2":{"num":"1.2.2","url":"https://www.w3.org/TR/WCAG22/#captions-prerecorded","scId":"WCAG2:captions-prerecorded","scAltId":["media-equiv-captions"],"test":"WCAG2:media-equiv-captions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#captions-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/captions-prerecorded.html","handle":"Captions (Prerecorded)","level":"A","wcagType":"2.0"},"1.2.3":{"num":"1.2.3","url":"https://www.w3.org/TR/WCAG22/#audio-description-or-media-alternative-prerecorded","scId":"WCAG2:audio-description-or-media-alternative-prerecorded","scAltId":["media-equiv-audio-desc"],"test":"WCAG2:media-equiv-audio-desc","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-description-or-media-alternative-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-description-or-media-alternative-prerecorded.html","handle":"Audio Description or Media Alternative (Prerecorded)","level":"A","wcagType":"2.0"},"1.2.4":{"num":"1.2.4","url":"https://www.w3.org/TR/WCAG22/#captions-live","scId":"WCAG2:captions-live","scAltId":["media-equiv-real-time-captions"],"test":"WCAG2:media-equiv-real-time-captions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#captions-live","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/captions-live.html","handle":"Captions (Live)","level":"AA","wcagType":"2.0"},"1.2.5":{"num":"1.2.5","url":"https://www.w3.org/TR/WCAG22/#audio-description-prerecorded","scId":"WCAG2:audio-description-prerecorded","scAltId":["media-equiv-audio-desc-only"],"test":"WCAG2:media-equiv-audio-desc-only","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-description-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-description-prerecorded.html","handle":"Audio Description (Prerecorded)","level":"AA","wcagType":"2.0"},"1.2.6":{"num":"1.2.6","url":"https://www.w3.org/TR/WCAG22/#sign-language-prerecorded","scId":"WCAG2:sign-language-prerecorded","scAltId":["media-equiv-sign"],"test":"WCAG2:media-equiv-sign","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#sign-language-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/sign-language-prerecorded.html","handle":"Sign Language (Prerecorded)","level":"AAA","wcagType":"2.0"},"1.2.7":{"num":"1.2.7","url":"https://www.w3.org/TR/WCAG22/#extended-audio-description-prerecorded","scId":"WCAG2:extended-audio-description-prerecorded","scAltId":["media-equiv-extended-ad"],"test":"WCAG2:media-equiv-extended-ad","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#extended-audio-description-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/extended-audio-description-prerecorded.html","handle":"Extended Audio Description (Prerecorded)","level":"AAA","wcagType":"2.0"},"1.2.8":{"num":"1.2.8","url":"https://www.w3.org/TR/WCAG22/#media-alternative-prerecorded","scId":"WCAG2:media-alternative-prerecorded","scAltId":["media-equiv-text-doc"],"test":"WCAG2:media-equiv-text-doc","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#media-alternative-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/media-alternative-prerecorded.html","handle":"Media Alternative (Prerecorded)","level":"AAA","wcagType":"2.0"},"1.2.9":{"num":"1.2.9","url":"https://www.w3.org/TR/WCAG22/#audio-only-live","scId":"WCAG2:audio-only-live","scAltId":["media-equiv-live-audio-only"],"test":"WCAG2:media-equiv-live-audio-only","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-only-live","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-only-live.html","handle":"Audio-only (Live)","level":"AAA","wcagType":"2.0"},"1.3.1":{"num":"1.3.1","url":"https://www.w3.org/TR/WCAG22/#info-and-relationships","scId":"WCAG2:info-and-relationships","scAltId":["content-structure-separation-programmatic"],"test":"WCAG2:content-structure-separation-programmatic","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#info-and-relationships","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/info-and-relationships.html","handle":"Info and Relationships","level":"A","wcagType":"2.0"},"1.3.2":{"num":"1.3.2","url":"https://www.w3.org/TR/WCAG22/#meaningful-sequence","scId":"WCAG2:meaningful-sequence","scAltId":["content-structure-separation-sequence"],"test":"WCAG2:content-structure-separation-sequence","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#meaningful-sequence","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/meaningful-sequence.html","handle":"Meaningful Sequence","level":"A","wcagType":"2.0"},"1.3.3":{"num":"1.3.3","url":"https://www.w3.org/TR/WCAG22/#sensory-characteristics","scId":"WCAG2:sensory-characteristics","scAltId":["content-structure-separation-understanding"],"test":"WCAG2:content-structure-separation-understanding","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#sensory-characteristics","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/sensory-characteristics.html","handle":"Sensory Characteristics","level":"A","wcagType":"2.0"},"1.3.4":{"num":"1.3.4","url":"https://www.w3.org/TR/WCAG22/#orientation","scId":"WCAG2:orientation","scAltId":[],"test":"WCAG2:orientation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#orientation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/orientation.html","handle":"Orientation","level":"AA","wcagType":"2.1"},"1.3.5":{"num":"1.3.5","url":"https://www.w3.org/TR/WCAG22/#identify-input-purpose","scId":"WCAG2:identify-input-purpose","scAltId":[],"test":"WCAG2:identify-input-purpose","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#identify-input-purpose","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/identify-input-purpose.html","handle":"Identify Input Purpose","level":"AA","wcagType":"2.1"},"1.3.6":{"num":"1.3.6","url":"https://www.w3.org/TR/WCAG22/#identify-purpose","scId":"WCAG2:identify-purpose","scAltId":[],"test":"WCAG2:identify-purpose","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#identify-purpose","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/identify-purpose.html","handle":"Identify Purpose","level":"AAA","wcagType":"2.1"},"1.4.1":{"num":"1.4.1","url":"https://www.w3.org/TR/WCAG22/#use-of-color","scId":"WCAG2:use-of-color","scAltId":["visual-audio-contrast-without-color"],"test":"WCAG2:visual-audio-contrast-without-color","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#use-of-color","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/use-of-color.html","handle":"Use of Color","level":"A","wcagType":"2.0"},"1.4.2":{"num":"1.4.2","url":"https://www.w3.org/TR/WCAG22/#audio-control","scId":"WCAG2:audio-control","scAltId":["visual-audio-contrast-dis-audio"],"test":"WCAG2:visual-audio-contrast-dis-audio","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-control","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-control.html","handle":"Audio Control","level":"A","wcagType":"2.0"},"1.4.3":{"num":"1.4.3","url":"https://www.w3.org/TR/WCAG22/#contrast-minimum","scId":"WCAG2:contrast-minimum","scAltId":["visual-audio-contrast-contrast"],"test":"WCAG2:visual-audio-contrast-contrast","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#contrast-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/contrast-minimum.html","handle":"Contrast (Minimum)","level":"AA","wcagType":"2.0"},"1.4.4":{"num":"1.4.4","url":"https://www.w3.org/TR/WCAG22/#resize-text","scId":"WCAG2:resize-text","scAltId":["visual-audio-contrast-scale"],"test":"WCAG2:visual-audio-contrast-scale","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#resize-text","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/resize-text.html","handle":"Resize text","level":"AA","wcagType":"2.0"},"1.4.5":{"num":"1.4.5","url":"https://www.w3.org/TR/WCAG22/#images-of-text","scId":"WCAG2:images-of-text","scAltId":["visual-audio-contrast-text-presentation"],"test":"WCAG2:visual-audio-contrast-text-presentation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#images-of-text","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/images-of-text.html","handle":"Images of Text","level":"AA","wcagType":"2.0"},"1.4.6":{"num":"1.4.6","url":"https://www.w3.org/TR/WCAG22/#contrast-enhanced","scId":"WCAG2:contrast-enhanced","scAltId":["visual-audio-contrast7"],"test":"WCAG2:visual-audio-contrast7","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#contrast-enhanced","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/contrast-enhanced.html","handle":"Contrast (Enhanced)","level":"AAA","wcagType":"2.0"},"1.4.7":{"num":"1.4.7","url":"https://www.w3.org/TR/WCAG22/#low-or-no-background-audio","scId":"WCAG2:low-or-no-background-audio","scAltId":["visual-audio-contrast-noaudio"],"test":"WCAG2:visual-audio-contrast-noaudio","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#low-or-no-background-audio","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/low-or-no-background-audio.html","handle":"Low or No Background Audio","level":"AAA","wcagType":"2.0"},"1.4.8":{"num":"1.4.8","url":"https://www.w3.org/TR/WCAG22/#visual-presentation","scId":"WCAG2:visual-presentation","scAltId":["visual-audio-contrast-visual-presentation"],"test":"WCAG2:visual-audio-contrast-visual-presentation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#visual-presentation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/visual-presentation.html","handle":"Visual Presentation","level":"AAA","wcagType":"2.0"},"1.4.9":{"num":"1.4.9","url":"https://www.w3.org/TR/WCAG22/#images-of-text-no-exception","scId":"WCAG2:images-of-text-no-exception","scAltId":["visual-audio-contrast-text-images"],"test":"WCAG2:visual-audio-contrast-text-images","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#images-of-text-no-exception","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/images-of-text-no-exception.html","handle":"Images of Text (No Exception)","level":"AAA","wcagType":"2.0"},"1.4.10":{"num":"1.4.10","url":"https://www.w3.org/TR/WCAG22/#reflow","scId":"WCAG2:reflow","scAltId":[],"test":"WCAG2:reflow","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#reflow","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/reflow.html","handle":"Reflow","level":"AA","wcagType":"2.1"},"1.4.11":{"num":"1.4.11","url":"https://www.w3.org/TR/WCAG22/#non-text-contrast","scId":"WCAG2:non-text-contrast","scAltId":[],"test":"WCAG2:non-text-contrast","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#non-text-contrast","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/non-text-contrast.html","handle":"Non-text Contrast","level":"AA","wcagType":"2.1"},"1.4.12":{"num":"1.4.12","url":"https://www.w3.org/TR/WCAG22/#text-spacing","scId":"WCAG2:text-spacing","scAltId":[],"test":"WCAG2:text-spacing","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#text-spacing","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/text-spacing.html","handle":"Text Spacing","level":"AA","wcagType":"2.1"},"1.4.13":{"num":"1.4.13","url":"https://www.w3.org/TR/WCAG22/#content-on-hover-or-focus","scId":"WCAG2:content-on-hover-or-focus","scAltId":[],"test":"WCAG2:content-on-hover-or-focus","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#content-on-hover-or-focus","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/content-on-hover-or-focus.html","handle":"Content on Hover or Focus","level":"AA","wcagType":"2.1"},"2.1.1":{"num":"2.1.1","url":"https://www.w3.org/TR/WCAG22/#keyboard","scId":"WCAG2:keyboard","scAltId":["keyboard-operation-keyboard-operable"],"test":"WCAG2:keyboard-operation-keyboard-operable","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#keyboard","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/keyboard.html","handle":"Keyboard","level":"A","wcagType":"2.0"},"2.1.2":{"num":"2.1.2","url":"https://www.w3.org/TR/WCAG22/#no-keyboard-trap","scId":"WCAG2:no-keyboard-trap","scAltId":["keyboard-operation-trapping"],"test":"WCAG2:keyboard-operation-trapping","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#no-keyboard-trap","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/no-keyboard-trap.html","handle":"No Keyboard Trap","level":"A","wcagType":"2.0"},"2.1.3":{"num":"2.1.3","url":"https://www.w3.org/TR/WCAG22/#keyboard-no-exception","scId":"WCAG2:keyboard-no-exception","scAltId":["keyboard-operation-all-funcs"],"test":"WCAG2:keyboard-operation-all-funcs","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#keyboard-no-exception","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/keyboard-no-exception.html","handle":"Keyboard (No Exception)","level":"AAA","wcagType":"2.0"},"2.1.4":{"num":"2.1.4","url":"https://www.w3.org/TR/WCAG22/#character-key-shortcuts","scId":"WCAG2:character-key-shortcuts","scAltId":[],"test":"WCAG2:WCAG2:character-key-shortcuts","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#character-key-shortcuts","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/character-key-shortcuts.html","handle":"Character Key Shortcuts","level":"A","wcagType":"2.1"},"2.2.1":{"num":"2.2.1","url":"https://www.w3.org/TR/WCAG22/#timing-adjustable","scId":"WCAG2:timing-adjustable","scAltId":["time-limits-required-behaviors"],"test":"WCAG2:time-limits-required-behaviors","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#timing-adjustable","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/timing-adjustable.html","handle":"Timing Adjustable","level":"A","wcagType":"2.0"},"2.2.2":{"num":"2.2.2","url":"https://www.w3.org/TR/WCAG22/#pause-stop-hide","scId":"WCAG2:pause-stop-hide","scAltId":["time-limits-pause"],"test":"WCAG2:time-limits-pause","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pause-stop-hide","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pause-stop-hide.html","handle":"Pause, Stop, Hide","level":"A","wcagType":"2.0"},"2.2.3":{"num":"2.2.3","url":"https://www.w3.org/TR/WCAG22/#no-timing","scId":"WCAG2:no-timing","scAltId":["time-limits-no-exceptions"],"test":"WCAG2:time-limits-no-exceptions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#no-timing","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/no-timing.html","handle":"No Timing","level":"AAA","wcagType":"2.0"},"2.2.4":{"num":"2.2.4","url":"https://www.w3.org/TR/WCAG22/#interruptions","scId":"WCAG2:interruptions","scAltId":["time-limits-postponed"],"test":"WCAG2:time-limits-postponed","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#interruptions","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/interruptions.html","handle":"Interruptions","level":"AAA","wcagType":"2.0"},"2.2.5":{"num":"2.2.5","url":"https://www.w3.org/TR/WCAG22/#re-authenticating","scId":"WCAG2:re-authenticating","scAltId":["time-limits-server-timeout"],"test":"WCAG2:time-limits-server-timeout","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#re-authenticating","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/re-authenticating.html","handle":"Re-authenticating","level":"AAA","wcagType":"2.0"},"2.2.6":{"num":"2.2.6","url":"https://www.w3.org/TR/WCAG22/#timeouts","scId":"WCAG2:timeouts","scAltId":[],"test":"WCAG2:WCAG2:timeouts","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#timeouts","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/timeouts.html","handle":"Timeouts","level":"AAA","wcagType":"2.1"},"2.3.1":{"num":"2.3.1","url":"https://www.w3.org/TR/WCAG22/#three-flashes-or-below-threshold","scId":"WCAG2:three-flashes-or-below-threshold","scAltId":["seizure-does-not-violate"],"test":"WCAG2:seizure-does-not-violate","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#three-flashes-or-below-threshold","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/three-flashes-or-below-threshold.html","handle":"Three Flashes or Below Threshold","level":"A","wcagType":"2.0"},"2.3.2":{"num":"2.3.2","url":"https://www.w3.org/TR/WCAG22/#three-flashes","scId":"WCAG2:three-flashes","scAltId":["seizure-three-times"],"test":"WCAG2:seizure-three-times","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#three-flashes","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/three-flashes.html","handle":"Three Flashes","level":"AAA","wcagType":"2.0"},"2.3.3":{"num":"2.3.3","url":"https://www.w3.org/TR/WCAG22/#animation-from-interactions","scId":"WCAG2:animation-from-interactions","scAltId":[],"test":"WCAG2:WCAG2:animation-from-interactions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#animation-from-interactions","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/animation-from-interactions.html","handle":"Animation from Interactions","level":"AAA","wcagType":"2.1"},"2.4.1":{"num":"2.4.1","url":"https://www.w3.org/TR/WCAG22/#bypass-blocks","scId":"WCAG2:bypass-blocks","scAltId":["navigation-mechanisms-skip"],"test":"WCAG2:navigation-mechanisms-skip","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#bypass-blocks","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/bypass-blocks.html","handle":"Bypass Blocks","level":"A","wcagType":"2.0"},"2.4.2":{"num":"2.4.2","url":"https://www.w3.org/TR/WCAG22/#page-titled","scId":"WCAG2:page-titled","scAltId":["navigation-mechanisms-title"],"test":"WCAG2:navigation-mechanisms-title","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#page-titled","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/page-titled.html","handle":"Page Titled","level":"A","wcagType":"2.0"},"2.4.3":{"num":"2.4.3","url":"https://www.w3.org/TR/WCAG22/#focus-order","scId":"WCAG2:focus-order","scAltId":["navigation-mechanisms-focus-order"],"test":"WCAG2:navigation-mechanisms-focus-order","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-order","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-order.html","handle":"Focus Order","level":"A","wcagType":"2.0"},"2.4.4":{"num":"2.4.4","url":"https://www.w3.org/TR/WCAG22/#link-purpose-in-context","scId":"WCAG2:link-purpose-in-context","scAltId":["navigation-mechanisms-refs"],"test":"WCAG2:navigation-mechanisms-refs","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#link-purpose-in-context","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/link-purpose-in-context.html","handle":"Link Purpose (In Context)","level":"A","wcagType":"2.0"},"2.4.5":{"num":"2.4.5","url":"https://www.w3.org/TR/WCAG22/#multiple-ways","scId":"WCAG2:multiple-ways","scAltId":["navigation-mechanisms-mult-loc"],"test":"WCAG2:navigation-mechanisms-mult-loc","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#multiple-ways","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/multiple-ways.html","handle":"Multiple Ways","level":"AA","wcagType":"2.0"},"2.4.6":{"num":"2.4.6","url":"https://www.w3.org/TR/WCAG22/#headings-and-labels","scId":"WCAG2:headings-and-labels","scAltId":["navigation-mechanisms-descriptive"],"test":"WCAG2:navigation-mechanisms-descriptive","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#headings-and-labels","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/headings-and-labels.html","handle":"Headings and Labels","level":"AA","wcagType":"2.0"},"2.4.7":{"num":"2.4.7","url":"https://www.w3.org/TR/WCAG22/#focus-visible","scId":"WCAG2:focus-visible","scAltId":["navigation-mechanisms-focus-visible"],"test":"WCAG2:navigation-mechanisms-focus-visible","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-visible","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-visible.html","handle":"Focus Visible","level":"AA","wcagType":"2.0"},"2.4.8":{"num":"2.4.8","url":"https://www.w3.org/TR/WCAG22/#location","scId":"WCAG2:location","scAltId":["navigation-mechanisms-location"],"test":"WCAG2:navigation-mechanisms-location","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#location","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/location.html","handle":"Location","level":"AAA","wcagType":"2.0"},"2.4.9":{"num":"2.4.9","url":"https://www.w3.org/TR/WCAG22/#link-purpose-link-only","scId":"WCAG2:link-purpose-link-only","scAltId":["navigation-mechanisms-link"],"test":"WCAG2:navigation-mechanisms-link","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#link-purpose-link-only","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/link-purpose-link-only.html","handle":"Link Purpose (Link Only)","level":"AAA","wcagType":"2.0"},"2.4.10":{"num":"2.4.10","url":"https://www.w3.org/TR/WCAG22/#section-headings","scId":"WCAG2:section-headings","scAltId":["navigation-mechanisms-headings"],"test":"WCAG2:navigation-mechanisms-headings","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#section-headings","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/section-headings.html","handle":"Section Headings","level":"AAA","wcagType":"2.0"},"2.4.11":{"num":"2.4.11","url":"https://www.w3.org/TR/WCAG22/#focus-not-obscured-minimum","scId":"WCAG2:focus-not-obscured-minimum","scAltId":["focus-not-obscured-minimum-alt"],"test":"WCAG2:focus-not-obscured-minimum-test","howToMeetUrl":"https://www.w3.org/TR/WCAG22/#focus-not-obscured-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-not-obscured-minimum.html","handle":"Focus Not Obscured (Minimum)","level":"AA","wcagType":"2.2"},"2.4.12":{"num":"2.4.12","url":"https://www.w3.org/TR/WCAG22/#focus-not-obscured-enhanced","scId":"WCAG2:focus-not-obscured-enhanced","scAltId":[],"test":"WCAG2:focus-not-obscured-enhanced-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-not-obscured-enhanced","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-not-obscured-enhanced.html","handle":"Focus Not Obscured (Enhanced)","level":"AAA","wcagType":"2.2"},"2.4.13":{"num":"2.4.13","url":"https://www.w3.org/TR/WCAG22/#focus-appearance","scId":"WCAG2:focus-appearance","scAltId":[],"test":"WCAG2:focus-appearance","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-appearance","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-appearance.html","handle":"Focus Appearance","level":"AAA","wcagType":"2.2"},"2.5.1":{"num":"2.5.1","url":"https://www.w3.org/TR/WCAG22/#pointer-gestures","scId":"WCAG2:pointer-gestures","scAltId":[],"test":"WCAG2:pointer-gestures-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pointer-gestures","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pointer-gestures.html","handle":"Pointer Gestures","level":"A","wcagType":"2.1"},"2.5.2":{"num":"2.5.2","url":"https://www.w3.org/TR/WCAG22/#pointer-cancellation","scId":"WCAG2:pointer-cancellation","scAltId":[],"test":"WCAG2:WCAG2:pointer-cancellation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pointer-cancellation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pointer-cancellation.html","handle":"Pointer Cancellation","level":"A","wcagType":"2.1"},"2.5.3":{"num":"2.5.3","url":"https://www.w3.org/TR/WCAG22/#label-in-name","scId":"WCAG2:label-in-name","scAltId":[],"test":"WCAG2:WCAG2:label-in-name","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#label-in-name","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/label-in-name.html","handle":"Label in Name","level":"A","wcagType":"2.1"},"2.5.4":{"num":"2.5.4","url":"https://www.w3.org/TR/WCAG22/#motion-actuation","scId":"WCAG2:motion-actuation","scAltId":[],"test":"WCAG2:WCAG2:motion-actuation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#motion-actuation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/motion-actuation.html","handle":"Motion Actuation","level":"A","wcagType":"2.1"},"2.5.5":{"num":"2.5.5","url":"https://www.w3.org/TR/WCAG22/#target-size","scId":"WCAG2:target-size","scAltId":[],"test":"WCAG2:WCAG2:target-size","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#target-size","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/target-size.html","handle":"Target Size","level":"AAA","wcagType":"2.1"},"2.5.6":{"num":"2.5.6","url":"https://www.w3.org/TR/WCAG22/#concurrent-input-mechanisms","scId":"WCAG2:concurrent-input-mechanisms","scAltId":[],"test":"WCAG2:WCAG2:concurrent-input-mechanisms","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#concurrent-input-mechanisms","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/concurrent-input-mechanisms.html","handle":"Concurrent Input Mechanisms","level":"AAA","wcagType":"2.1"},"2.5.7":{"num":"2.5.7","url":"https://www.w3.org/TR/WCAG22/#dragging-movements","scId":"WCAG2:dragging-movement","scAltId":["dragging-movement-alt"],"test":"WCAG2:dragging-movement-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/Understanding/dragging-movements.html","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/dragging-movements.html","handle":"Dragging Movement","level":"AA","wcagType":"2.2"},"2.5.8":{"num":"2.5.8","url":"https://www.w3.org/TR/WCAG22/#target-size-minimum","scId":"WCAG2:minimum-target-size","scAltId":["minimum-target-size-alt"],"test":"WCAG2:minimum-target-size-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#target-size-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/target-size-minimum.html","handle":"Minimum Target Size","level":"AA","wcagType":"2.2"},"3.1.1":{"num":"3.1.1","url":"https://www.w3.org/TR/WCAG22/#language-of-page","scId":"WCAG2:language-of-page","scAltId":["meaning-doc-lang-id"],"test":"WCAG2:meaning-doc-lang-id","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#language-of-page","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/language-of-page.html","handle":"Language of Page","level":"A","wcagType":"2.0"},"3.1.2":{"num":"3.1.2","url":"https://www.w3.org/TR/WCAG22/#language-of-parts","scId":"WCAG2:language-of-parts","scAltId":["meaning-other-lang-id"],"test":"WCAG2:meaning-other-lang-id","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#language-of-parts","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/language-of-parts.html","handle":"Language of Parts","level":"AA","wcagType":"2.0"},"3.1.3":{"num":"3.1.3","url":"https://www.w3.org/TR/WCAG22/#unusual-words","scId":"WCAG2:unusual-words","scAltId":["meaning-idioms"],"test":"WCAG2:meaning-idioms","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#unusual-words","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/unusual-words.html","handle":"Unusual Words","level":"AAA","wcagType":"2.0"},"3.1.4":{"num":"3.1.4","url":"https://www.w3.org/TR/WCAG22/#abbreviations","scId":"WCAG2:abbreviations","scAltId":["meaning-located"],"test":"WCAG2:meaning-located","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#abbreviations","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/abbreviations.html","handle":"Abbreviations","level":"AAA","wcagType":"2.0"},"3.1.5":{"num":"3.1.5","url":"https://www.w3.org/TR/WCAG22/#reading-level","scId":"WCAG2:reading-level","scAltId":["meaning-supplements"],"test":"WCAG2:meaning-supplements","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#reading-level","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/reading-level.html","handle":"Reading Level","level":"AAA","wcagType":"2.0"},"3.1.6":{"num":"3.1.6","url":"https://www.w3.org/TR/WCAG22/#pronunciation","scId":"WCAG2:pronunciation","scAltId":["meaning-pronunciation"],"test":"WCAG2:meaning-pronunciation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pronunciation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pronunciation.html","handle":"Pronunciation","level":"AAA","wcagType":"2.0"},"3.2.1":{"num":"3.2.1","url":"https://www.w3.org/TR/WCAG22/#on-focus","scId":"WCAG2:on-focus","scAltId":["consistent-behavior-receive-focus"],"test":"WCAG2:consistent-behavior-receive-focus","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#on-focus","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/on-focus.html","handle":"On Focus","level":"A","wcagType":"2.0"},"3.2.2":{"num":"3.2.2","url":"https://www.w3.org/TR/WCAG22/#on-input","scId":"WCAG2:on-input","scAltId":["consistent-behavior-unpredictable-change"],"test":"WCAG2:consistent-behavior-unpredictable-change","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#on-input","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/on-input.html","handle":"On Input","level":"A","wcagType":"2.0"},"3.2.3":{"num":"3.2.3","url":"https://www.w3.org/TR/WCAG22/#consistent-navigation","scId":"WCAG2:consistent-navigation","scAltId":["consistent-behavior-consistent-locations"],"test":"WCAG2:consistent-behavior-consistent-locations","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#consistent-navigation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/consistent-navigation.html","handle":"Consistent Navigation","level":"AA","wcagType":"2.0"},"3.2.4":{"num":"3.2.4","url":"https://www.w3.org/TR/WCAG22/#consistent-identification","scId":"WCAG2:consistent-identification","scAltId":["consistent-behavior-consistent-functionality"],"test":"WCAG2:consistent-behavior-consistent-functionality","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#consistent-identification","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/consistent-identification.html","handle":"Consistent Identification","level":"AA","wcagType":"2.0"},"3.2.5":{"num":"3.2.5","url":"https://www.w3.org/TR/WCAG22/#change-on-request","scId":"WCAG2:change-on-request","scAltId":["consistent-behavior-no-extreme-changes-context"],"test":"WCAG2:consistent-behavior-no-extreme-changes-context","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#change-on-request","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/change-on-request.html","handle":"Change on Request","level":"AAA","wcagType":"2.0"},"3.2.6":{"num":"3.2.6","url":"https://www.w3.org/TR/WCAG22/#consistent-help","scId":"WCAG2:consistent-help","scAltId":["consistent-help-alt"],"test":"WCAG2:consistent-help-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#consistent-help","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/consistent-help.html","handle":"Consistent Help","level":"AA","wcagType":"2.2"},"3.3.1":{"num":"3.3.1","url":"https://www.w3.org/TR/WCAG22/#error-identification","scId":"WCAG2:error-identification","scAltId":["minimize-error-identified"],"test":"WCAG2:minimize-error-identified","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-identification","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-identification.html","handle":"Error Identification","level":"A","wcagType":"2.0"},"3.3.2":{"num":"3.3.2","url":"https://www.w3.org/TR/WCAG22/#labels-or-instructions","scId":"WCAG2:labels-or-instructions","scAltId":["minimize-error-cues"],"test":"WCAG2:minimize-error-cues","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#labels-or-instructions","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/labels-or-instructions.html","handle":"Labels or Instructions","level":"A","wcagType":"2.0"},"3.3.3":{"num":"3.3.3","url":"https://www.w3.org/TR/WCAG22/#error-suggestion","scId":"WCAG2:error-suggestion","scAltId":["minimize-error-suggestions"],"test":"WCAG2:minimize-error-suggestions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-suggestion","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-suggestion.html","handle":"Error Suggestion","level":"AA","wcagType":"2.0"},"3.3.4":{"num":"3.3.4","url":"https://www.w3.org/TR/WCAG22/#error-prevention-legal-financial-data","scId":"WCAG2:error-prevention-legal-financial-data","scAltId":["minimize-error-reversible"],"test":"WCAG2:minimize-error-reversible","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-prevention-legal-financial-data","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-prevention-legal-financial-data.html","handle":"Error Prevention (Legal, Financial, Data)","level":"AA","wcagType":"2.0"},"3.3.5":{"num":"3.3.5","url":"https://www.w3.org/TR/WCAG22/#help","scId":"WCAG2:help","scAltId":["minimize-error-context-help"],"test":"WCAG2:minimize-error-context-help","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#help","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/help.html","handle":"Help","level":"AAA","wcagType":"2.0"},"3.3.6":{"num":"3.3.6","url":"https://www.w3.org/TR/WCAG22/#error-prevention-all","scId":"WCAG2:error-prevention-all","scAltId":["minimize-error-reversible-all"],"test":"WCAG2:minimize-error-reversible-all","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-prevention-all","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-prevention-all.html","handle":"Error Prevention (All)","level":"AAA","wcagType":"2.0"},"3.3.7":{"num":"3.3.7","url":"https://www.w3.org/TR/WCAG22/#redundant-entry","scId":"WCAG2:redundant-entry","scAltId":["redundant-entry-alt"],"test":"WCAG2:redundant-entry-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#redundant-entry","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/redundant-entry.html","handle":"Redundant Entry","level":"AA","wcagType":"2.2"},"3.3.8":{"num":"3.3.8","url":"https://www.w3.org/TR/WCAG22/#accessible-authentication-minimum","scId":"WCAG2:accessible-authentication-minimum","scAltId":["accessible-authentication-minimum-alt"],"test":"WCAG2:accessible-authentication-minimum-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#accessible-authentication-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/accessible-authentication-minimum.html","handle":"Accessible Authentication (Minimum)","level":"AA","wcagType":"2.2"},"3.3.9":{"num":"3.3.9","url":"https://www.w3.org/TR/WCAG22/#accessible-authentication-enhanced","scId":"WCAG2:accessible-authentication-enhanced","scAltId":[],"test":"WCAG2:accessible-authentication-enhanced","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#accessible-authentication-enhanced","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/accessible-authentication-enhanced.html","handle":"Accessible Authentication (Enhanced)","level":"AAA","wcagType":"2.2"},"4.1.1":{"num":"4.1.1","url":"https://www.w3.org/TR/WCAG22/#parsing","scId":"WCAG2:parsing","scAltId":["ensure-compat-parses"],"test":"WCAG2:ensure-compat-parses","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/?versions=2.1#parsing","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/parsing.html","handle":"Parsing","level":"A","wcagType":"2.0"},"4.1.2":{"num":"4.1.2","url":"https://www.w3.org/TR/WCAG22/#name-role-value","scId":"WCAG2:name-role-value","scAltId":["ensure-compat-rsv"],"test":"WCAG2:ensure-compat-rsv","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#name-role-value","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/name-role-value.html","handle":"Name, Role, Value","level":"A","wcagType":"2.0"},"4.1.3":{"num":"4.1.3","url":"https://www.w3.org/TR/WCAG22/#status-messages","scId":"WCAG2:status-messages","scAltId":[],"test":"WCAG2:status-messages","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#status-messages","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/status-messages.html","handle":"Status Messages","level":"AA","wcagType":"2.1"},"HTML":{"num":"HTML","url":"https://html.spec.whatwg.org/multipage/","scId":"","scAltId":[],"test":"","howToMeetUrl":"https://html.spec.whatwg.org/multipage/","understandingUrl":"https://html.spec.whatwg.org/multipage/","handle":"specification","level":"NA","wcagType":"NA"},"ARIA":{"num":"ARIA","url":"https://www.w3.org/TR/wai-aria-1.2/","scId":"","scAltId":[],"test":"","howToMeetUrl":"https://www.w3.org/TR/wai-aria-1.2/","understandingUrl":"https://www.w3.org/TR/wai-aria-1.2/","handle":"specification","level":"NA","wcagType":"NA"}}')}};const t={};function i(a){const n=t[a];if(void 0!==n)return n.exports;const l=t[a]={exports:{}};return e[a].call(l.exports,l,l.exports,i),l.exports}let a={};(()=>{let e=a;Object.defineProperty(e,"__esModule",{value:!0}),e.checkDemo=e.SRViewer=e.SRCursor=e.SRController=e.DOMWalker=e.Config=e.ARIAMapper=e.Checker=e.Context=void 0;var t=i(920);Object.defineProperty(e,"Context",{enumerable:!0,get:function(){return t.Context}});var n=i(7412);Object.defineProperty(e,"Checker",{enumerable:!0,get:function(){return n.Checker}});var l=i(9955);Object.defineProperty(e,"ARIAMapper",{enumerable:!0,get:function(){return l.ARIAMapper}});var r=i(4516);Object.defineProperty(e,"Config",{enumerable:!0,get:function(){return r.Config}});var o=i(3864);Object.defineProperty(e,"DOMWalker",{enumerable:!0,get:function(){return o.DOMWalker}});var s=i(5233);Object.defineProperty(e,"SRController",{enumerable:!0,get:function(){return s.SRController}});var u=i(8195);Object.defineProperty(e,"SRCursor",{enumerable:!0,get:function(){return u.SRCursor}});var d=i(8107);Object.defineProperty(e,"SRViewer",{enumerable:!0,get:function(){return d.SRViewer}}),e.checkDemo=function(e){e||(e=0);var t=new n.Checker;setTimeout(function(){t.check(document.documentElement,["IBM_Accessibility","IBM_Design"]).then(function(e){console.log(e);for(var t={FAIL:0,POTENTIAL:1,MANUAL:2,PASS:3},i=0;i<e.results.length;++i)"PASS"===e.results[i].value[1]&&e.results.splice(i--,1);e.results.sort(function(e,i){return e.category!=i.category?e.category.localeCompare(i.category):e.path.aria===i.path.aria?t[e.value[1]]-t[i.value[1]]:e.path.aria.localeCompare(i.path.aria)});for(var a=null,n=null,l=0,r=e.results;l<r.length;l++){var o=r[l];n!==o.category&&(null!==n&&(console.groupEnd(),console.groupEnd(),a=null),n=o.category,console.group(o.category)),o.path.aria!=a&&(null!==a&&console.groupEnd(),""===(a=o.path.aria)?console.group("page"):console.group(a)),console.log(o.value,o.message)}console.groupEnd(),console.groupEnd()})},e)}})(),ace=a})(); +(function(window) { + window.ace_ibma = ace; +})(typeof window === 'object' ? window : this); \ No newline at end of file diff --git a/rule-server/src/static/archives/2026.07.13/js/ace.js b/rule-server/src/static/archives/2026.07.13/js/ace.js new file mode 100644 index 000000000..3e92884c7 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/js/ace.js @@ -0,0 +1,2 @@ +/*! For license information please see ace.js.LICENSE.txt */ +var ace;(()=>{"use strict";var e={9910(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.ARIADefinitions=void 0;var i=function(){function e(){}return e.nameFromContent=function(t){return t in e.designPatterns&&e.designPatterns[t].nameFrom&&e.designPatterns[t].nameFrom.includes("contents")},e.globalProperties=["aria-atomic","aria-busy","aria-controls","aria-current","aria-describedby","aria-details","aria-flowto","aria-hidden","aria-keyshortcuts","aria-label","aria-labelledby","aria-live","aria-owns","aria-relevant","aria-roledescription","aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"],e.referenceProperties=["aria-owns","aria-controls","aria-describedby","aria-labelledby","aria-flowto","aria-activedescendant"],e.globalDeprecatedRoles=["directory","doc-biblioentry","doc-endnote"],e.globalDeprecatedProperties=["aria-grabbed","aria-dropeffect"],e.propertyDataTypes={"aria-activedescendant":{type:"http://www.w3.org/2001/XMLSchema#idref",hiddenIDRefSupported:!0},"aria-atomic":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-autocomplete":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["inline","list","both","none","undefined"]},"aria-busy":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-checked":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","mixed","undefined"]},"aria-colcount":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-colindex":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-colspan":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-controls":{type:"http://www.w3.org/2001/XMLSchema#idrefs",hiddenIDRefSupported:!0},"aria-current":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["page","step","location","date","time","true","false","undefined"]},"aria-describedby":{type:"http://www.w3.org/2001/XMLSchema#idrefs",hiddenIDRefSupported:!0},"aria-details":{type:"http://www.w3.org/2001/XMLSchema#idrefs"},"aria-disabled":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-dropeffect":{type:"http://www.w3.org/2001/XMLSchema#nmtokens",values:["copy","move","link","execute","popup","none"]},"aria-errormessage":{type:"http://www.w3.org/2001/XMLSchema#idref",hiddenIDRefSupported:!0},"aria-expanded":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","undefined"]},"aria-flowto":{type:"http://www.w3.org/2001/XMLSchema#idrefs",hiddenIDRefSupported:!1},"aria-grabbed":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","undefined"]},"aria-haspopup":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","menu","listbox","tree","grid","dialog"]},"aria-hidden":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","undefined"]},"aria-invalid":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","spelling","grammar","undefined"]},"aria-keyshortcuts":{type:"http://www.w3.org/2001/XMLSchema#string"},"aria-label":{type:"http://www.w3.org/2001/XMLSchema#string"},"aria-labelledby":{type:"http://www.w3.org/2001/XMLSchema#idrefs",hiddenIDRefSupported:!0},"aria-level":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-live":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["off","polite","assertive"]},"aria-modal":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-multiline":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-multiselectable":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-orientation":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["horizontal","vertical","undefined"]},"aria-owns":{type:"http://www.w3.org/2001/XMLSchema#idrefs",hiddenIDRefSupported:!0},"aria-placeholder":{type:"http://www.w3.org/2001/XMLSchema#string"},"aria-posinset":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-pressed":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","mixed","undefined"]},"aria-readonly":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-relevant":{type:"http://www.w3.org/2001/XMLSchema#nmtokens",values:["additions","removals","text","all"]},"aria-required":{type:"http://www.w3.org/2001/XMLSchema#boolean"},"aria-roledescription":{type:"http://www.w3.org/2001/XMLSchema#string"},"aria-rowcount":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-rowindex":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-rowspan":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-selected":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["true","false","undefined"]},"aria-setsize":{type:"http://www.w3.org/2001/XMLSchema#int"},"aria-sort":{type:"http://www.w3.org/2001/XMLSchema#nmtoken",values:["ascending","descending","other","none"]},"aria-valuemax":{type:"http://www.w3.org/2001/XMLSchema#decimal"},"aria-valuemin":{type:"http://www.w3.org/2001/XMLSchema#decimal"},"aria-valuenow":{type:"http://www.w3.org/2001/XMLSchema#decimal"},"aria-valuetext":{type:"http://www.w3.org/2001/XMLSchema#string"}},e.designPatterns={alert:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"liveRegion",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},alertdialog:{container:null,props:["aria-modal"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"window",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},application:{container:null,props:["aria-activedescendant","aria-expanded"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!0,nameFrom:["author"]},article:{container:null,props:["aria-posinset","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},banner:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},blockquote:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},button:{container:null,props:["aria-expanded","aria-pressed"],reqProps:null,reqChildren:null,htmlEquiv:"button | input[@type='button']",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-invalid"]},caption:{container:["figure","grid","table","treegrid"],props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},cell:{container:["row"],props:["aria-colindex","aria-colspan","aria-rowindex","aria-rowspan"],reqProps:null,reqChildren:null,htmlEquiv:"td",roleType:"structure",nameFrom:["author","contents"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},checkbox:{container:null,props:["aria-expanded","aria-readonly","aria-required"],reqProps:["aria-checked"],reqChildren:null,htmlEquiv:"input[@type='checkbox']",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-haspopup"]},code:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},columnheader:{container:["row"],props:["aria-colindex","aria-colspan","aria-expanded","aria-readonly","aria-required","aria-rowindex","aria-rowspan","aria-selected","aria-sort"],reqProps:null,reqChildren:null,htmlEquiv:"th[@scope='col']",roleType:"structure",nameRequired:!0,nameFrom:["author","contents"]},combobox:{container:null,props:["aria-controls","aria-activedescendant","aria-autocomplete","aria-readonly","aria-required"],reqProps:["aria-expanded"],reqChildren:[],htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"]},complementary:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},comment:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author","contents"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},contentinfo:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},definition:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},deletion:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},dialog:{container:null,props:["aria-modal"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"window",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},directory:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecated:!0,deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},"doc-abstract":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-acknowledgments":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-afterword":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-appendix":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-backlink":{container:null,props:["aria-disabled","aria-expanded","aria-haspopup"],reqProps:null,reqChildren:null,htmlEquiv:"a | link",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"]},"doc-biblioentry":{container:["list"],props:["aria-level","aria-posinset","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:"li",roleType:"structure",nameRequired:!0,nameFrom:["author"]},"doc-bibliography":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-biblioref":{container:null,props:["aria-disabled","aria-expanded","aria-haspopup"],reqProps:null,reqChildren:null,htmlEquiv:"a | link",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"]},"doc-chapter":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-colophon":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!0,nameFrom:["author"]},"doc-conclusion":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-cover":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"img",roleType:"structure",nameRequired:!1,nameFrom:["author"],presentationalChildren:!0},"doc-credit":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-credits":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-dedication":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-endnote":{container:["list"],props:["aria-level","aria-posinset","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:"li",roleType:"structure",nameRequired:!1,nameFrom:["author"]},"doc-endnotes":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!0,nameFrom:["author"]},"doc-epigraph":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-epilogue":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-errata":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-example":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-footnote":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-foreword":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-glossary":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-glossref":{container:null,props:["aria-disabled","aria-expanded","aria-haspopup"],reqProps:null,reqChildren:null,htmlEquiv:"a | link",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"]},"doc-index":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-introduction":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-noteref":{container:null,props:["aria-disabled","aria-expanded","aria-haspopup"],reqProps:null,reqChildren:null,htmlEquiv:"a | link",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"]},"doc-notice":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author"]},"doc-pagebreak":{container:null,props:["aria-orientation"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0},"doc-pagelist":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-pagefooter":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"]},"doc-pageheader":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"]},"doc-part":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-preface":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-prologue":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-pullquote":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author"]},"doc-qna":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},"doc-subtitle":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author","contents"]},"doc-tip":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author"]},"doc-toc":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!1,nameFrom:["author"]},document:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},emphasis:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},feed:{container:null,props:null,reqProps:null,reqChildren:["article"],htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},figure:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},form:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"form",roleType:"landmark",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},generic:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"div | span",roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby","aria-roledescription"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},"graphics-document":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,nameRequired:!0,nameFrom:["author"]},"graphics-object":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,nameRequired:!1,nameFrom:["author"]},"graphics-symbol":{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,nameRequired:!0,nameFrom:["author"],presentationalChildren:!0},grid:{container:null,props:["aria-activedescendant","aria-colcount","aria-multiselectable","aria-readonly","aria-rowcount"],reqProps:null,reqChildren:["row","rowgroup"],htmlEquiv:"table",roleType:"widget",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},gridcell:{container:["row"],props:["aria-colindex","aria-colspan","aria-disabled","aria-errormessage","aria-expanded","aria-haspopup","aria-invalid","aria-readonly","aria-required","aria-rowindex","aria-rowspan","aria-selected"],reqProps:null,reqChildren:null,htmlEquiv:"td",roleType:"widget",nameFrom:["author","contents"]},group:{container:null,props:["aria-activedescendant"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},heading:{container:null,props:null,reqProps:["aria-level"],reqChildren:null,htmlEquiv:"h1 | h2 | h3 | h4 | h5 | h6",roleType:"structure",nameRequired:!0,nameFrom:["author","contents"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},img:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"img",roleType:"structure",nameRequired:!0,nameFrom:["author"],presentationalChildren:!0,deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},image:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"img",roleType:"structure",nameRequired:!0,nameFrom:["author"],presentationalChildren:!0,deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},insertion:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},link:{container:null,props:["aria-expanded"],reqProps:null,reqChildren:null,htmlEquiv:"a | link",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],deprecatedProps:["aria-errormessage","aria-invalid"]},list:{container:null,props:null,reqProps:null,reqChildren:["listitem"],htmlEquiv:"ol | ul",roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},listbox:{container:null,props:["aria-activedescendant","aria-expanded","aria-multiselectable","aria-orientation","aria-readonly","aria-required"],reqProps:null,reqChildren:["group","option"],htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-haspopup"]},listitem:{container:["list"],props:["aria-level","aria-posinset","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:"li",roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},log:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"liveRegion",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},main:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},mark:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"mark",roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},marquee:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"liveRegion",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},math:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],presentationalChildren:!1,deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},menu:{container:null,props:["aria-activedescendant","aria-orientation"],reqProps:null,reqChildren:["group","menuitem","menuitemcheckbox","menuitemradio"],htmlEquiv:null,roleType:"widget",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},menubar:{container:null,props:["aria-activedescendant","aria-orientation"],reqProps:null,reqChildren:["group","menuitem","menuitemcheckbox","menuitemradio"],htmlEquiv:null,roleType:"widget",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},menuitem:{container:["group","menu","menubar"],props:["aria-expanded","aria-posinset","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],deprecatedProps:["aria-errormessage","aria-invalid"]},menuitemcheckbox:{container:["group","menu","menubar"],props:["aria-expanded","aria-posinset","aria-setsize"],reqProps:["aria-checked"],reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-invalid"]},menuitemradio:{container:["group","menu","menubar"],props:["aria-expanded","aria-posinset","aria-setsize"],reqProps:["aria-checked"],reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-invalid"]},meter:{container:null,props:["aria-valuemax","aria-valuemin","aria-valuetext"],reqProps:["aria-valuenow"],reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!0,nameFrom:["author"],presentationalChildren:!0,deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},navigation:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},none:{container:null,props:[],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},note:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},option:{container:["group","listbox"],props:["aria-selected","aria-checked","aria-posinset","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:"option",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},paragraph:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},presentation:{container:null,props:[],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},progressbar:{container:null,props:["aria-valuemax","aria-valuemin","aria-valuenow","aria-valuetext"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],presentationalChildren:!0,deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},radio:{container:null,props:["aria-posinset","aria-setsize"],reqProps:["aria-checked"],reqChildren:null,htmlEquiv:"input[@type='radio']",roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},radiogroup:{container:null,props:["aria-activedescendant","aria-orientation","aria-readonly","aria-required"],reqProps:null,reqChildren:["radio"],htmlEquiv:null,roleType:"widget",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-haspopup"]},region:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},row:{container:["grid","rowgroup","table","treegrid"],props:["aria-activedescendant","aria-colindex","aria-expanded","aria-level","aria-posinset","aria-rowindex","aria-selected","aria-setsize"],reqProps:null,reqChildren:["cell","columnheader","gridcell","rowheader"],htmlEquiv:"tr",roleType:"structure",nameFrom:["author","contents"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},rowgroup:{container:["grid","table","treegrid"],props:[],reqProps:null,reqChildren:["row"],htmlEquiv:"tbody | tfoot | thead",roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},rowheader:{container:["row"],props:["aria-colindex","aria-colspan","aria-expanded","aria-readonly","aria-required","aria-rowindex","aria-rowspan","aria-selected","aria-sort"],reqProps:null,reqChildren:null,htmlEquiv:"th[@scope='row']",roleType:"structure",nameRequired:!0,nameFrom:["author","contents"]},scrollbar:{container:null,props:["aria-orientation","aria-valuemax","aria-valuemin","aria-valuetext"],reqProps:["aria-controls","aria-valuenow"],reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!1,nameFrom:["author"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},search:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"landmark",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},searchbox:{container:null,props:["aria-activedescendant","aria-autocomplete","aria-multiline","aria-placeholder","aria-readonly","aria-required"],reqProps:null,reqChildren:null,htmlEquiv:"input[@type='search']",roleType:"widget",nameRequired:!0,nameFrom:["author"]},separator:{container:null,props:["aria-orientation"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},slider:{container:null,props:["aria-orientation","aria-readonly","aria-valuemax","aria-valuemin","aria-valuetext"],reqProps:["aria-valuenow"],reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],presentationalChildren:!0},spinbutton:{container:null,props:["aria-activedescendant","aria-readonly","aria-required","aria-valuemax","aria-valuemin","aria-valuenow","aria-valuetext"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-haspopup"]},status:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"liveRegion",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},strong:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},subscript:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},suggestion:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},superscript:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},switch:{container:null,props:["aria-expanded","aria-readonly","aria-required"],reqProps:["aria-checked"],reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-haspopup"]},tab:{container:["tablist"],props:["aria-expanded","aria-posinset","aria-selected","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],presentationalChildren:!0,deprecatedProps:["aria-errormessage","aria-invalid"]},table:{container:null,props:["aria-colcount","aria-rowcount"],reqProps:null,reqChildren:["row","rowgroup","caption"],htmlEquiv:"table",roleType:"structure",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},tablist:{container:null,props:["aria-activedescendant","aria-multiselectable","aria-orientation"],reqProps:null,reqChildren:["tab"],htmlEquiv:null,roleType:"widget",nameRequired:!1,nameFrom:["author"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},tabpanel:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},term:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:"dfn",roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},textbox:{container:null,props:["aria-activedescendant","aria-autocomplete","aria-multiline","aria-placeholder","aria-readonly","aria-required"],reqProps:null,reqChildren:null,htmlEquiv:"input[@type='text']",roleType:"widget",nameRequired:!0,nameFrom:["author"]},time:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["prohibited"],prohibitedProps:["aria-label","aria-labelledby"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},timer:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"liveRegion",nameFrom:["author"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},toolbar:{container:null,props:["aria-activedescendant","aria-orientation"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameFrom:["author"],deprecatedProps:["aria-errormessage","aria-haspopup","aria-invalid"]},tooltip:{container:null,props:null,reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"structure",nameRequired:!1,nameFrom:["author","contents"],deprecatedProps:["aria-disabled","aria-errormessage","aria-haspopup","aria-invalid"]},tree:{container:null,props:["aria-activedescendant","aria-multiselectable","aria-orientation","aria-required"],reqProps:null,reqChildren:["group","treeitem"],htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-haspopup"]},treegrid:{container:null,props:["aria-activedescendant","aria-colcount","aria-multiselectable","aria-orientation","aria-readonly","aria-required","aria-rowcount"],reqProps:null,reqChildren:["row","rowgroup"],htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author"],deprecatedProps:["aria-haspopup"]},treeitem:{container:["group","tree"],props:["aria-checked","aria-expanded","aria-level","aria-posinset","aria-selected","aria-setsize"],reqProps:null,reqChildren:null,htmlEquiv:null,roleType:"widget",nameRequired:!0,nameFrom:["author","contents"],deprecatedProps:["aria-errormessage","aria-invalid"]}},e.elementsAllowedDisabled=["button","input","select","textarea","optgroup","option","fieldset"],e.elementsAllowedRequired=["select","textarea"],e.elementsAllowedReadOnly=["textarea"],e.documentConformanceRequirement={abbr:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},address:{implicitRole:["group"],validRoles:["any"],globalAriaAttributesValid:!0},article:{implicitRole:["article"],validRoles:["application","document","feed","main","none","presentation","region"],globalAriaAttributesValid:!0},aside:{implicitRole:["complementary"],validRoles:["doc-dedication","doc-example","doc-footnote","doc-glossary","doc-pullquote","doc-tip","feed","none","note","presentation","region","search"],globalAriaAttributesValid:!0},audio:{implicitRole:null,validRoles:["application"],globalAriaAttributesValid:!0},b:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},base:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},bdi:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},bdo:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},blockquote:{implicitRole:["blockquote"],validRoles:["any"],globalAriaAttributesValid:!0},body:{implicitRole:["generic"],validRoles:null,otherDisallowedAriaAttributes:["aria-hidden"],globalAriaAttributesValid:!0},br:{implicitRole:null,validRoles:["none","presentation"],globalAriaAttributesValid:!1,otherAllowedAriaAttributes:["aria-hidden"]},button:{implicitRole:["button"],validRoles:["checkbox","combobox","gridcell","link","menuitem","menuitemcheckbox","menuitemradio","option","radio","separator","slider","switch","tab","treeitem"],globalAriaAttributesValid:!0},canvas:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0},caption:{implicitRole:["caption"],validRoles:null,globalAriaAttributesValid:!0,allowAttributesFromImplicitRole:!1},cite:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},code:{implicitRole:["code"],validRoles:["any"],globalAriaAttributesValid:!0},col:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},colgroup:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},data:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},datalist:{implicitRole:["listbox"],validRoles:null,globalAriaAttributesValid:!1,allowAttributesFromImplicitRole:!1},dd:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0},del:{implicitRole:["deletion"],validRoles:["any"],globalAriaAttributesValid:!0},details:{implicitRole:["group"],validRoles:null,globalAriaAttributesValid:!0},dfn:{implicitRole:["term"],validRoles:["any"],globalAriaAttributesValid:!0},dialog:{implicitRole:["dialog"],validRoles:["alertdialog"],globalAriaAttributesValid:!0},dl:{implicitRole:null,validRoles:["group","list","none","presentation"],globalAriaAttributesValid:!0},dt:{implicitRole:["term"],validRoles:["listitem"],globalAriaAttributesValid:!0},em:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0},embed:{implicitRole:null,validRoles:["application","document","img","none","presentation"],globalAriaAttributesValid:!0},fieldset:{implicitRole:["group"],validRoles:["none","presentation","radiogroup"],globalAriaAttributesValid:!0},figcaption:{implicitRole:null,validRoles:["group","none","presentation"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},form:{implicitRole:["form"],validRoles:["none","presentation","search"],globalAriaAttributesValid:!0},head:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},hgroup:{implicitRole:["group"],validRoles:["any"],globalAriaAttributesValid:!0},h1:{implicitRole:["heading"],validRoles:["doc-subtitle","none","presentation","tab"],globalAriaAttributesValid:!0},h2:{implicitRole:["heading"],validRoles:["doc-subtitle","none","presentation","tab"],globalAriaAttributesValid:!0},h3:{implicitRole:["heading"],validRoles:["doc-subtitle","none","presentation","tab"],globalAriaAttributesValid:!0},h4:{implicitRole:["heading"],validRoles:["doc-subtitle","none","presentation","tab"],globalAriaAttributesValid:!0},h5:{implicitRole:["heading"],validRoles:["doc-subtitle","none","presentation","tab"],globalAriaAttributesValid:!0},h6:{implicitRole:["heading"],validRoles:["doc-subtitle","none","presentation","tab"],globalAriaAttributesValid:!0},hr:{implicitRole:["separator"],validRoles:["doc-pagebreak","none","presentation"],globalAriaAttributesValid:!0},html:{implicitRole:["document"],validRoles:null,globalAriaAttributesValid:!1,allowAttributesFromImplicitRole:!1},i:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},iframe:{implicitRole:null,validRoles:["application","document","img","none","presentation"],globalAriaAttributesValid:!0},ins:{implicitRole:["insertion"],validRoles:["any"],globalAriaAttributesValid:!0},kbd:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},label:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},legend:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},link:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},main:{implicitRole:["main"],validRoles:null,globalAriaAttributesValid:!0},map:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},mark:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},math:{implicitRole:["math"],validRoles:null,globalAriaAttributesValid:!0},menu:{implicitRole:["list"],validRoles:["group","listbox","menu","menubar","none","presentation","radiogroup","tablist","toolbar","tree"],globalAriaAttributesValid:!0},meta:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},meter:{implicitRole:["meter"],validRoles:null,globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-valuemax","aria-valuemin"],allowAttributesFromImplicitRole:!1},nav:{implicitRole:["navigation"],validRoles:["doc-index","doc-pagelist","doc-toc","menu","menubar","tablist","none","presentation"],globalAriaAttributesValid:!0},noscript:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},object:{implicitRole:null,validRoles:["application","document","img"],globalAriaAttributesValid:!0},ol:{implicitRole:["list"],validRoles:["group","listbox","menu","menubar","none","presentation","radiogroup","tablist","toolbar","tree"],globalAriaAttributesValid:!0},optgroup:{implicitRole:["group"],validRoles:null,globalAriaAttributesValid:!0},option:{implicitRole:["option"],validRoles:null,globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-selected"]},output:{implicitRole:["status"],validRoles:["any"],globalAriaAttributesValid:!0},p:{implicitRole:["paragraph"],validRoles:["any"],globalAriaAttributesValid:!0},param:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},picture:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1,otherAllowedAriaAttributes:["aria-hidden"]},pre:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},progress:{implicitRole:["progressbar"],validRoles:null,globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-valuemax"]},q:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},rp:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0},rt:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},ruby:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0},s:{implicitRole:["deletion"],validRoles:["any"],globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-label","aria-labelledby"]},samp:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},script:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},search:{implicitRole:["search"],validRoles:["search","form","group","none","presentation","region"],globalAriaAttributesValid:!0},slot:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},small:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},source:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},span:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},strong:{implicitRole:["strong"],validRoles:["any"],globalAriaAttributesValid:!0},style:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},sub:{implicitRole:["subscript"],validRoles:["any"],globalAriaAttributesValid:!0},sup:{implicitRole:["superscript"],validRoles:["any"],globalAriaAttributesValid:!0},svg:{implicitRole:["graphics-document"],validRoles:["any"],globalAriaAttributesValid:!0},table:{implicitRole:["table"],validRoles:["any"],globalAriaAttributesValid:!0},template:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},textarea:{implicitRole:["textbox"],validRoles:null,globalAriaAttributesValid:!0},tfoot:{implicitRole:["rowgroup"],validRoles:["any"],globalAriaAttributesValid:!0},thead:{implicitRole:["rowgroup"],validRoles:["any"],globalAriaAttributesValid:!0},time:{implicitRole:["time"],validRoles:["any"],globalAriaAttributesValid:!0},title:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},track:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},u:{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0},ul:{implicitRole:["list"],validRoles:["group","listbox","menu","menubar","none","presentation","radiogroup","tablist","toolbar","tree"],globalAriaAttributesValid:!0},var:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0,prohibitedAriaAttributesWhenNoImplicitRole:["aria-label","aria-labelledby"]},video:{implicitRole:null,validRoles:["application"],globalAriaAttributesValid:!0},wbr:{implicitRole:null,validRoles:["none","presentation"],globalAriaAttributesValid:!1,otherAllowedAriaAttributes:["aria-hidden"]}},e.documentConformanceRequirementSpecialTags={a:{"with-href":{implicitRole:["link"],validRoles:["button","checkbox","doc-backlink","doc-biblioref","doc-glossref","doc-noteref","menuitem","menuitemcheckbox","menuitemradio","option","radio","switch","tab","treeitem"],globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-disabled=true"]},"without-href":{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0}},area:{"with-href":{implicitRole:["link"],validRoles:null,globalAriaAttributesValid:!0},"without-href":{implicitRole:["generic"],validRoles:["button","link"],globalAriaAttributesValid:!0}},div:{"child-dl":{implicitRole:["generic"],validRoles:["presentation","none"],globalAriaAttributesValid:!0},"no-child-dl":{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0}},figure:{"child-figcaption":{implicitRole:["figure"],validRoles:["doc-example"],globalAriaAttributesValid:!0},"no-child-figcaption":{implicitRole:["figure"],validRoles:["any"],globalAriaAttributesValid:!0}},footer:{"des-section-article-aside-main-nav":{implicitRole:["generic"],validRoles:["doc-footnote","group","none","presentation"],globalAriaAttributesValid:!0},other:{implicitRole:["contentinfo"],validRoles:["doc-footnote","group","none","presentation"],globalAriaAttributesValid:!0}},header:{"des-section-article-aside-main-nav":{implicitRole:["generic"],validRoles:["group","none","presentation"],globalAriaAttributesValid:!0},other:{implicitRole:["banner"],validRoles:["group","none","presentation"],globalAriaAttributesValid:!0}},img:{"img-with-accname":{implicitRole:["img"],validRoles:["button","checkbox","doc-cover","link","menuitem","menuitemcheckbox","menuitemradio","meter","option","progressbar","radio","scrollbar","separator","slider","switch","tab","treeitem"],globalAriaAttributesValid:!0},"img-without-accname-empty-alt":{implicitRole:["presentation","none"],validRoles:null,globalAriaAttributesValid:!1,otherAllowedAriaAttributes:["aria-hidden=true"]},"img-without-accname-no-alt":{implicitRole:["img"],validRoles:["presentation","none"],globalAriaAttributesValid:!1,otherAllowedAriaAttributes:["aria-hidden=true"]}},input:{button:{implicitRole:["button"],validRoles:["checkbox","combobox","gridcell","link","menuitem","menuitemcheckbox","menuitemradio","option","radio","slider","switch","tab","treeitem"],globalAriaAttributesValid:!0},"checkbox-with-aria-pressed":{implicitRole:["checkbox"],validRoles:["menuitemcheckbox","option","switch","button"],globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-required"],otherDisallowedAriaAttributes:["aria-checked"]},"checkbox-without-aria-pressed":{implicitRole:["checkbox"],validRoles:["menuitemcheckbox","option","switch"],globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-required"],otherDisallowedAriaAttributes:["aria-checked"]},color:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0},date:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-required","aria-readonly"],otherRolesForAttributes:["textbox"]},"datetime-local":{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-required","aria-readonly"],otherRolesForAttributes:["textbox"]},"email-no-list":{implicitRole:["textbox"],validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"],otherRolesForAttributes:["textbox"]},"email-with-list":{implicitRole:["combobox"],validRoles:null,globalAriaAttributesValid:!0},file:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-required"]},hidden:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!1},image:{implicitRole:["button"],validRoles:["checkbox","gridcell","link","menuitem","menuitemcheckbox","menuitemradio","option","radio","slider","switch","tab","treeitem"],globalAriaAttributesValid:!0},month:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-readonly"],otherRolesForAttributes:["textbox"]},number:{implicitRole:["spinbutton"],validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"]},password:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"],otherRolesForAttributes:["textbox"]},radio:{implicitRole:["radio"],validRoles:["menuitemradio"],globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-required"],otherDisallowedAriaAttributes:["aria-checked"]},range:{implicitRole:["slider"],validRoles:null,globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-valuemax","aria-valuemin"]},reset:{implicitRole:["button"],validRoles:["checkbox","combobox","gridcell","link","menuitem","menuitemcheckbox","menuitemradio","option","radio","slider","switch","tab","treeitem"],globalAriaAttributesValid:!0},"search-no-list":{implicitRole:["searchbox"],validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"]},"search-with-list":{implicitRole:["combobox"],validRoles:null,globalAriaAttributesValid:!0},submit:{implicitRole:["button"],validRoles:["checkbox","combobox","gridcell","link","menuitem","menuitemcheckbox","menuitemradio","option","radio","slider","switch","tab","treeitem"],globalAriaAttributesValid:!0},"tel-no-list":{implicitRole:["textbox"],validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"]},"tel-with-list":{implicitRole:["combobox"],validRoles:null,globalAriaAttributesValid:!0},"text-no-list":{implicitRole:["textbox"],validRoles:["combobox","searchbox","spinbutton"],globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"]},"text-with-list":{implicitRole:["combobox"],validRoles:null,globalAriaAttributesValid:!0},time:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-readonly"],otherRolesForAttributes:["textbox"]},"url-no-list":{implicitRole:["textbox"],validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-placeholder","aria-required","aria-readonly"]},"url-with-list":{implicitRole:["combobox"],validRoles:null,globalAriaAttributesValid:!0},week:{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-readonly"],otherRolesForAttributes:["textbox"]},"default-with-list":{implicitRole:["combobox"],validRoles:null,globalAriaAttributesValid:!0},"default-no-list":{implicitRole:["textbox"],validRoles:null,globalAriaAttributesValid:!0}},li:{"child-of-list-role":{implicitRole:["listitem"],validRoles:null,globalAriaAttributesValid:!0},"no-child-of-list-role":{implicitRole:["generic"],validRoles:["any"],globalAriaAttributesValid:!0}},section:{"with-name":{implicitRole:["region"],validRoles:["alert","alertdialog","application","banner","complementary","contentinfo","dialog","doc-abstract","doc-acknowledgments","doc-afterword","doc-appendix","doc-bibliography","doc-chapter","doc-colophon","doc-conclusion","doc-credit","doc-credits","doc-dedication","doc-endnotes","doc-epigraph","doc-epilogue","doc-errata","doc-example","doc-foreword","doc-glossary","doc-index","doc-introduction","doc-notice","doc-pagelist","doc-part","doc-preface","doc-prologue","doc-pullquote","doc-qna","doc-toc","document","feed","group","log","main","marquee","navigation","none","note","presentation","search","status","tabpanel"],globalAriaAttributesValid:!0},"without-name":{implicitRole:null,validRoles:["alert","alertdialog","application","banner","complementary","contentinfo","dialog","doc-abstract","doc-acknowledgments","doc-afterword","doc-appendix","doc-bibliography","doc-chapter","doc-colophon","doc-conclusion","doc-credit","doc-credits","doc-dedication","doc-endnotes","doc-epigraph","doc-epilogue","doc-errata","doc-example","doc-foreword","doc-glossary","doc-index","doc-introduction","doc-notice","doc-pagelist","doc-part","doc-preface","doc-prologue","doc-pullquote","doc-qna","doc-toc","document","feed","group","log","main","marquee","navigation","none","note","presentation","search","status","tabpanel"],globalAriaAttributesValid:!0}},select:{"no-multiple-attr-size-gt1":{implicitRole:["combobox"],validRoles:["menu"],globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-multiselectable"]},"multiple-attr-size-gt1":{implicitRole:["listbox"],validRoles:null,globalAriaAttributesValid:!0,otherDisallowedAriaAttributes:["aria-multiselectable"]}},summary:{"first-summary-of-detail":{implicitRole:null,validRoles:null,globalAriaAttributesValid:!0,otherAllowedAriaAttributes:["aria-disabled","aria-haspopup"]},"no-first-summary-of-detail":{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0}},tbody:{"des-table":{implicitRole:["rowgroup"],validRoles:["any"],globalAriaAttributesValid:!0},"des-grid":{implicitRole:["rowgroup"],validRoles:["any"],globalAriaAttributesValid:!0},"des-treegrid":{implicitRole:["rowgroup"],validRoles:["any"],globalAriaAttributesValid:!0},"des-other":{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0}},td:{"des-table":{implicitRole:["cell"],validRoles:null,globalAriaAttributesValid:!0},"des-grid":{implicitRole:["gridcell"],validRoles:null,globalAriaAttributesValid:!0},"des-treegrid":{implicitRole:["gridcell"],validRoles:null,globalAriaAttributesValid:!0},"des-other":{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0}},th:{"des-table-row-scope":{implicitRole:["rowheader","cell"],validRoles:null,globalAriaAttributesValid:!0},"des-table-column-scope":{implicitRole:["columnheader","cell"],validRoles:null,globalAriaAttributesValid:!0},"des-grid-treegrid-row-scope":{implicitRole:["rowheader","gridcell"],validRoles:null,globalAriaAttributesValid:!0},"des-grid-treegrid-column-scope":{implicitRole:["columnheader","gridcell"],validRoles:null,globalAriaAttributesValid:!0},"des-other":{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0}},tr:{"des-table":{implicitRole:["row"],validRoles:null,globalAriaAttributesValid:!0},"des-grid":{implicitRole:["row"],validRoles:null,globalAriaAttributesValid:!0},"des-treegrid":{implicitRole:["row"],validRoles:null,globalAriaAttributesValid:!0},"des-other":{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0}},default:{implicitRole:null,validRoles:["any"],globalAriaAttributesValid:!0}},e.relatedAriaHtmlAttributes={"aria-checked":{conflict:[{ariaAttributeValue:"false",htmlAttributeNames:["checked"],htmlAttributeValues:null}],overlapping:[{ariaAttributeValue:"true",htmlAttributeNames:["checked"],htmlAttributeValues:null}]},"aria-disabled":{conflict:[{ariaAttributeValue:"false",htmlAttributeNames:["disabled"],htmlAttributeValues:null}],overlapping:[{ariaAttributeValue:"true",htmlAttributeNames:["disabled"],htmlAttributeValues:null}]},"aria-hidden":{conflict:[{ariaAttributeValue:"false",htmlAttributeNames:["hidden"],htmlAttributeValues:["hidden,null"]},{ariaAttributeValue:"true",htmlAttributeNames:["hidden"],htmlAttributeValues:["until-found"]}],overlapping:[{ariaAttributeValue:"true",htmlAttributeNames:["hidden"],htmlAttributeValues:["hidden,null"]}]},"aria-placeholder":{conflict:[{ariaAttributeValue:null,htmlAttributeNames:["placeholder"],htmlAttributeValues:null}]},"aria-valuemax":{conflict:[{ariaAttributeValue:null,htmlAttributeNames:["max"],htmlAttributeValues:null}]},"aria-valuemin":{conflict:[{ariaAttributeValue:null,htmlAttributeNames:["min"],htmlAttributeValues:null}]},"aria-readonly":{conflict:[{ariaAttributeValue:"false",htmlAttributeNames:["readonly","contenteditable","iscontenteditable"],htmlAttributeValues:[null,"false","false"]}],overlapping:[{ariaAttributeValue:"true",htmlAttributeNames:["readonly","contenteditable","iscontenteditable"],htmlAttributeValues:[null,"true","true"]}]},"aria-required":{conflict:[{ariaAttributeValue:"false",htmlAttributeNames:["required"],htmlAttributeValues:null}],overlapping:[{ariaAttributeValue:"true",htmlAttributeNames:["required"],htmlAttributeValues:null}]},"aria-colspan":{conflict:[{ariaAttributeValue:"VALUE",htmlAttributeNames:["colspan"],htmlAttributeValues:["VALUE"]}],overlapping:[{ariaAttributeValue:null,htmlAttributeNames:["colspan"],htmlAttributeValues:null}]},"aria-rowspan":{conflict:[{ariaAttributeValue:"VALUE",htmlAttributeNames:["rowspan"],htmlAttributeValues:["VALUE"]}],overlapping:[{ariaAttributeValue:null,htmlAttributeNames:["rowspan"],htmlAttributeValues:null}]}},e.containers=[],e}();t.ARIADefinitions=i;var a=[];for(var n in i.designPatterns){var l=i.designPatterns[n].container;if(null!==l)for(var r=0,o=l;r<o.length;r++){var s=o[r];-1==a.indexOf(s)&&a.push(s)}}i.containers=a},9955(e,t,i){var a,n=this&&this.__extends||(a=function(e,t){return a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i])},a(e,t)},function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function i(){this.constructor=e}a(e,t),e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)});Object.defineProperty(t,"__esModule",{value:!0}),t.ARIAMapper=void 0;var l=i(9910),r=i(3103),o=i(1686),s=i(7139),u=i(7011),d=i(5279),c=i(1560),m=i(4566),p=i(3864),h=i(1950),g=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.childrenCanHaveRole=function(e,t){return!(t in l.ARIADefinitions.designPatterns&&l.ARIADefinitions.designPatterns[t].presentationalChildren)},t.prototype.getRole=function(e){return t.nodeToRole(e)},t.prototype.getNamespace=function(){return"aria"},t.prototype.getAttributes=function(e){var i={};if(1===e.nodeType){var a=m.CacheUtil.getCache(e,"ARIAMapper::getAttributes",void 0);if(void 0!==a)return a;for(var n=e,l=0;l<n.attributes.length;++l){var r=n.attributes[l],o=r.name.toLowerCase();o.startsWith("aria-")&&(i[o.substring(5)]=r.nodeValue)}var s=e.nodeName.toLowerCase();t.applyAttrRole(n,"global",i),t.applyAttrRole(n,s,i),m.CacheUtil.setCache(e,"ARIAMapper::getAttributes",i)}else if(3===e.nodeType){var u=t.textAttrValueCalculators;for(var d in u){var c=u[d](e);null!=c&&(i[d]=c)}}return i},t.applyAttrRole=function(e,i,a){var n=t.elemAttrValueCalculators;if(i in n)for(var l in n[i])if(!(l in a)){var r=n[i][l];null!=r&&("string"!=typeof r&&(r=r(e)),a[l]=r)}},t.getAriaOwnedBy=function(e){var t=d.FragmentUtil.getOwnerFragment(e);if(!m.CacheUtil.getCache(t,"ARIAMapper::precalcOwned",!1)){for(var i=t.querySelectorAll("[aria-owns]"),a=0;a<i.length;++a)for(var n=i[a],l=n.getAttribute("aria-owns").split(/ +/g),r=function(e){var i=t.getElementById(l[e]);if(i&&!o.DOMUtil.sameNode(n,i)){for(var a=[],r=i.querySelectorAll("[aria-owns]"),s=0;s<r.length;++s)for(var u=r[s].getAttribute("aria-owns").split(/ +/g),d=0;d<u.length;++d){var c=t.getElementById(u[d]);c&&a.push(c)}if(0===a.length)return m.CacheUtil.setCache(i,"aria-owned",n),"continue";for(var h=n,g=!1;null!==h;){if(a.some(function(e){return o.DOMUtil.sameNode(h,e)})){g=!0;break}h=p.DOMWalker.parentElement(h)}g||m.CacheUtil.setCache(i,"aria-owned",n)}},s=0;s<l.length;++s)r(s);m.CacheUtil.setCache(t,"ARIAMapper::precalcOwned",!0)}return m.CacheUtil.getCache(e,"aria-owned",null)},t.prototype.getNodeHierarchy=function(e){if(!e)return[];if(1!==e.nodeType){for(var i=(s=this.getNodeHierarchy(p.DOMWalker.parentElement(e))).length>0?s[s.length-1]:{role:"",rolePath:"",roleCount:{},childrenCanHaveRole:!0},a=[],n=0,l=s;n<l.length;n++){var r=l[n];a.push(r)}return a.push({attributes:{},bounds:this.getBounds(e),namespace:this.getNamespace(),node:e,role:this.getRole(e)||null,rolePath:i.rolePath+"/"+(this.getRole(e)||null),roleCount:{},childrenCanHaveRole:i.childrenCanHaveRole}),a}var o=e;if(!(a=m.CacheUtil.getCache(o,"ARIAMapper::getNodeHierarchy",null))){var s,u=t.getAriaOwnedBy(o);for(u||(u=p.DOMWalker.parentElement(o));u&&1!==u.nodeType;)u=p.DOMWalker.parentElement(o);for(i=(s=u?this.getNodeHierarchy(u):[]).length>0?s[s.length-1]:{role:"",rolePath:"",roleCount:{},childrenCanHaveRole:!0};null===i.role;)i=(s=(u=t.getAriaOwnedBy(u)||p.DOMWalker.parentElement(u))?this.getNodeHierarchy(u):[])[s.length-1];var d={attributes:1===o.nodeType?this.getAttributes(o):{},bounds:this.getBounds(o),namespace:this.getNamespace(),node:o,role:this.getRole(o)||null,rolePath:"",roleCount:{},childrenCanHaveRole:!0};i.childrenCanHaveRole?d.childrenCanHaveRole=i.childrenCanHaveRole&&this.childrenCanHaveRole(o,d.role):d.role=null,null!==d.role?(i.roleCount[d.role]=(i.roleCount[d.role]||0)+1,d.rolePath=i.rolePath+"/"+d.role+"["+i.roleCount[d.role]+"]"):d.rolePath=i.rolePath,a=[];for(var c=0,h=s;c<h.length;c++)r=h[c],a.push(r);a.push(d),m.CacheUtil.setCache(o,"ARIAMapper::getNodeHierarchy",a)}return a},t.prototype.reset=function(e){t.nameComputationId=0,this.hierarchyRole=[],this.hierarchyResults=[],this.hierarchyPath=[{rolePath:"",roleCount:{}}];for(var i,a=e;i=p.DOMWalker.parentNode(a);)a=i;var n=new c.ARIAWalker(a,!1,a);do{1===n.node.nodeType&&this.getNodeHierarchy(n.node)}while(n.nextNode())},t.prototype.openScope=function(e){null===this.hierarchyRole&&this.reset(e),this.pushHierarchy(e);for(var t=0;t<this.hierarchyResults.length;++t)this.hierarchyResults[t].role&&"/"===this.hierarchyResults[t].role[0]&&(this.hierarchyResults[t].role=this.hierarchyResults[t].role?this.hierarchyResults[t].role.substring(1):null);return this.hierarchyResults},t.prototype.pushHierarchy=function(e){var t,i=(t=this.getNodeHierarchy(e))[t.length-1];this.hierarchyRole.push(i.role),null!==i.role&&this.hierarchyPath.push(i),this.hierarchyResults=t},t.prototype.closeScope=function(e){for(var t=[],i=0,a=this.hierarchyResults;i<a.length;i++){var n=a[i];t.push(n)}if(t.length>0){t[t.length-1].role="/"+t[t.length-1].role;var l=p.DOMWalker.parentElement(e);this.hierarchyResults=l?m.CacheUtil.getCache(l,"ARIAMapper::getNodeInfo",[]):[]}return t},t.nodeToRole=function(e){if(3===e.nodeType)return"text";if(1!==e.nodeType)return null;var t=e;if(!t||1!==t.nodeType)return null;if(t.hasAttribute("role")&&t.getAttribute("role").trim().length>0)for(var i=0,a=t.getAttribute("role").trim().split(" ");i<a.length;i++){var n=a[i];if("presentation"===n||"none"===n){if(!s.CommonUtil.isFocusable(t))return null}else if(n in l.ARIADefinitions.designPatterns)return n}var r=u.AriaUtil.getImplicitRole(t),o=r&&0!==r.length?r[0]:null;return"presentation"===o||"none"===o?null:o},t.elemAttrValueCalculators={global:{name:function(e){var t;return null===(t=h.AccNameUtil.computeAccessibleName(e))||void 0===t?void 0:t.name}},datalist:{multiselectable:function(e){var t=e.getAttribute("id");return t&&t.length>0?(e.ownerDocument.querySelector("input[list='"+t+"']"),""+(e.getAttribute("multiple")&&("true"==e.getAttribute("multiple")||""==e.getAttribute("multiple")))):null}},h1:{level:"1"},h2:{level:"2"},h3:{level:"3"},h4:{level:"4"},h5:{level:"5"},h6:{level:"6"},input:{checked:function(e){var t=e.getAttribute("type");return"checkbox"===t||"radio"===t?""+e.checked:null},setsize:function(e){return null},posinset:function(e){return null},owns:function(e){return null}},keygen:{multiselectable:"false"},li:{setsize:function(e){var t=o.DOMUtil.getAncestor(e,["ol","ul","menu"]);if(!t)return null;var i=m.CacheUtil.getSetCache(t,"elemAttrValueCalculators::lis",function(){return t.querySelectorAll("li")}),a=m.CacheUtil.getSetCache(t,"elemAttrValueCalculators::otherlis",function(){return t.querySelectorAll("ol li, ul li, menu li")});return""+(i.length-a.length)},posinset:function(e){var t=o.DOMUtil.getAncestor(e,["ol","ul","menu"]);if(!t)return null;for(var i=m.CacheUtil.getSetCache(t,"elemAttrValueCalculators::lis",function(){return t.querySelectorAll("li")}),a=0,n=0;n<i.length;++n){var l=i[n];if(o.DOMUtil.sameNode(t,o.DOMUtil.getAncestor(l,["ol","ul","menu"])))return""+a;++a}return null}},menuitem:{checked:function(e){return""+!(!e.getAttribute("checked")||"true"!=e.getAttribute("checked")&&""!=e.getAttribute("checked"))}},option:{selected:function(e){return""+!(!e.getAttribute("selected")||"true"!=e.getAttribute("selected")&&""!=e.getAttribute("selected"))}},progress:{valuemax:function(e){return e.getAttribute("max")||"1"},valuemin:function(e){return"0"},valuenow:function(e){return e.getAttribute("value")}}},t.textAttrValueCalculators={name:function(e){return e.nodeValue}},t.nameComputationId=0,t}(r.CommonMapper);t.ARIAMapper=g},1560(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.ARIAWalker=void 0;var a=i(5279),n=i(9955),l=i(3946),r=i(3864),o=function(){function e(e,t,i){this.root=i||e,9===this.root.nodeType&&(this.root=this.root.documentElement),this.node=e,this.bEndTag=null!=t&&1==t}return e.prototype.atRoot=function(){return!this.ownerElement&&(this.root===this.node||(this.root.isSameNode?this.root.isSameNode(this.node):this.root.compareDocumentPosition?0===this.root.compareDocumentPosition(this.node):null===this.node.parentNode))},e.prototype.nextNode=function(){var e=!1;do{if(e=!1,this.bEndTag){if(this.atRoot())return!1;if(this.node.slotOwner){var t=this.node.slotOwner,i=this.node.slotIndex+1;i<t.assignedNodes().length?(this.node=t.assignedNodes()[i],this.bEndTag=!1):(this.node=t,this.bEndTag=!0)}else if(this.node.ownerElement)this.node=this.node.ownerElement,this.bEndTag=!0;else if(r.DOMWalker.nextSiblingNotOwnedBySlot(this.node))this.node=r.DOMWalker.nextSiblingNotOwnedBySlot(this.node),this.bEndTag=!1,e=!0;else{if(!this.node.parentNode)return!1;if(1===this.node.parentNode.nodeType&&this.node.parentNode.hasAttribute("aria-owns")){var o=this.node.parentNode.getAttribute("aria-owns").split(/ +/g);if(1===this.node.nodeType&&this.node.hasAttribute("id")){var s=o.indexOf(this.node.getAttribute("id"));s===o.length-1?(this.node=this.node.parentNode,this.bEndTag=!0):(this.node=a.FragmentUtil.getOwnerFragment(this.node).getElementById(o[s+1]),this.bEndTag=!1)}else this.node=a.FragmentUtil.getOwnerFragment(this.node).getElementById(o[0]),this.bEndTag=!1}this.node=this.node.parentNode,this.bEndTag=!0}}else{var u=this.node,d=this.node,c=this.node;if(1===this.node.nodeType&&"IFRAME"===this.node.nodeName.toUpperCase()&&l.VisUtil.isNodeVisible(u)&&u.contentDocument&&u.contentDocument.documentElement){var m=this.node;this.node=u.contentDocument.documentElement,this.node.ownerElement=m}else 1===this.node.nodeType&&l.VisUtil.isNodeVisible(d)&&d.shadowRoot&&d.shadowRoot.firstChild?(m=this.node,this.node=d.shadowRoot,this.node.ownerElement=m,r.DOMWalker.assignSlots(this.node)):1===this.node.nodeType&&"slot"===d.nodeName.toLowerCase()&&c.assignedNodes().length>0?this.node=c.assignedNodes()[0]:1!==this.node.nodeType&&11!==this.node.nodeType||!r.DOMWalker.firstChildNotOwnedBySlot(this.node)?this.bEndTag=!0:this.node=r.DOMWalker.firstChildNotOwnedBySlot(this.node)}}while(1!==this.node.nodeType&&11!==this.node.nodeType&&3!==this.node.nodeType||1===this.node.nodeType&&"ACE"===this.node.getAttribute("aChecker")||e&&1===this.node.nodeType&&n.ARIAMapper.getAriaOwnedBy(this.node));return!0},e.prototype.prevNode=function(){var e=!1;do{if(e=!1,this.bEndTag){var t=this.node,i=this.node;if(1===this.node.nodeType&&"IFRAME"===this.node.nodeName.toUpperCase()&&l.VisUtil.isNodeVisible(t)&&t.contentDocument&&t.contentDocument.documentElement){var o=this.node;this.node=t.contentDocument.documentElement,this.node.ownerElement=o}else 1===this.node.nodeType&&l.VisUtil.isNodeVisible(i)&&i.shadowRoot&&i.shadowRoot.lastChild?(o=this.node,this.node=i.shadowRoot,this.node.ownerElement=o,r.DOMWalker.assignSlots(this.node)):1!==this.node.nodeType&&11!==this.node.nodeType||!r.DOMWalker.lastChildNotOwnedBySlot(this.node)?this.bEndTag=!1:this.node=r.DOMWalker.lastChildNotOwnedBySlot(this.node)}else{if(this.atRoot())return!1;if(r.DOMWalker.previousSiblingNotOwnedBySlot(this.node))this.node=r.DOMWalker.previousSiblingNotOwnedBySlot(this.node),this.bEndTag=!0;else if(this.node.ownerElement)this.node=this.node.ownerElement,this.bEndTag=!1,e=!0;else{if(!this.node.parentNode)return!1;if(1===this.node.parentNode.nodeType&&this.node.parentNode.hasAttribute("aria-owns")){var s=this.node.parentNode.getAttribute("aria-owns").split(/ +/g);if(1===this.node.nodeType&&this.node.hasAttribute("id")){var u=s.indexOf(this.node.getAttribute("id"));u===s.length-1?(this.node=this.node.parentNode,this.bEndTag=!0):(this.node=a.FragmentUtil.getOwnerFragment(this.node).getElementById(s[u+1]),this.bEndTag=!1)}else this.node=a.FragmentUtil.getOwnerFragment(this.node).getElementById(s[0]),this.bEndTag=!1}this.node=this.node.parentNode,this.bEndTag=!1}}}while(1!==this.node.nodeType&&11!==this.node.nodeType||1===this.node.nodeType&&"ACE"===this.node.getAttribute("aChecker")||e&&1===this.node.nodeType&&n.ARIAMapper.getAriaOwnedBy(this.node));return!0},e}();t.ARIAWalker=o},6858(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.AncestorUtil=void 0;var i=function(){function e(){}return e.isPresentationFrame=function(e){if(e&&e.dom)for(var t=e.dom.length-2;t>=0;--t){var i=e.dom[t].node;if(1===i.nodeType&&"iframe"===i.nodeName.toLowerCase()&&("presentation"===i.getAttribute("role")||"true"===i.getAttribute("aria-hidden")))return!0}return!1},e.isFrame=function(e){if(e&&e.dom)for(var t=e.dom.length-2;t>=0;--t){var i=e.dom[t].node;if(1===i.nodeType&&"iframe"===i.nodeName.toLowerCase())return!0}return!1},e}();t.AncestorUtil=i},5279(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.FragmentUtil=void 0;var i=function(){function e(){}return e.getOwnerFragment=function(e){for(var t=e;t.parentNode&&(t=t.parentNode);)if(11===t.nodeType)return t;return e.ownerDocument},e.getById=function(e,t){return this.getOwnerFragment(e).getElementById(t)},e.getAncestor=function(e,t){var i=e.dom.filter(function(e){return e.role===t});return i.length>0&&i[0].node||null},e.getAncestorWithRole=function(e,t){var i=e.aria.filter(function(e){return e.role===t});return i.length>0&&i[0].node||null},e}();t.FragmentUtil=i},1043(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.LangUtil=void 0;var i=[["aa","ab","ae","af","ak","am","an","ar","as","av","ay","az","aaa","aab","aac","aad","aae","aaf","aag","aah","aai","aak","aal","aam","aan","aao","aap","aaq","aas","aat","aau","aav","aaw","aax","aaz","aba","abb","abc","abd","abe","abf","abg","abh","abi","abj","abl","abm","abn","abo","abp","abq","abr","abs","abt","abu","abv","abw","abx","aby","abz","aca","acb","acd","ace","acf","ach","aci","ack","acl","acm","acn","acp","acq","acr","acs","act","acu","acv","acw","acx","acy","acz","ada","adb","add","ade","adf","adg","adh","adi","adj","adl","adn","ado","adp","adq","adr","ads","adt","adu","adw","adx","ady","adz","aea","aeb","aec","aed","aee","aek","ael","aem","aen","aeq","aer","aes","aeu","aew","aey","aez","afa","afb","afd","afe","afg","afh","afi","afk","afn","afo","afp","afs","aft","afu","afz","aga","agb","agc","agd","age","agf","agg","agh","agi","agj","agk","agl","agm","agn","ago","agp","agq","agr","ags","agt","agu","agv","agw","agx","agy","agz","aha","ahb","ahg","ahh","ahi","ahk","ahl","ahm","ahn","aho","ahp","ahr","ahs","aht","aia","aib","aic","aid","aie","aif","aig","aih","aii","aij","aik","ail","aim","ain","aio","aip","aiq","air","ais","ait","aiw","aix","aiy","aja","ajg","aji","ajn","ajp","ajt","aju","ajw","ajz","akb","akc","akd","ake","akf","akg","akh","aki","akj","akk","akl","akm","ako","akp","akq","akr","aks","akt","aku","akv","akw","akx","aky","akz","ala","alc","ald","ale","alf","alg","alh","ali","alj","alk","all","alm","aln","alo","alp","alq","alr","als","alt","alu","alv","alw","alx","aly","alz","ama","amb","amc","ame","amf","amg","ami","amj","amk","aml","amm","amn","amo","amp","amq","amr","ams","amt","amu","amv","amw","amx","amy","amz","ana","anb","anc","and","ane","anf","ang","anh","ani","anj","ank","anl","anm","ann","ano","anp","anq","anr","ans","ant","anu","anv","anw","anx","any","anz","aoa","aob","aoc","aod","aoe","aof","aog","aoh","aoi","aoj","aok","aol","aom","aon","aor","aos","aot","aou","aox","aoz","apa","apb","apc","apd","ape","apf","apg","aph","api","apj","apk","apl","apm","apn","apo","app","apq","apr","aps","apt","apu","apv","apw","apx","apy","apz","aqa","aqc","aqd","aqg","aqk","aql","aqm","aqn","aqp","aqr","aqt","aqz","arb","arc","ard","are","arh","ari","arj","ark","arl","arn","aro","arp","arq","arr","ars","art","aru","arv","arw","arx","ary","arz","asa","asb","asc","asd","ase","asf","asg","ash","asi","asj","ask","asl","asn","aso","asp","asq","asr","ass","ast","asu","asv","asw","asx","asy","asz","ata","atb","atc","atd","ate","atg","ath","ati","atj","atk","atl","atm","atn","ato","atp","atq","atr","ats","att","atu","atv","atw","atx","aty","atz","aua","aub","auc","aud","aue","auf","aug","auh","aui","auj","auk","aul","aum","aun","auo","aup","auq","aur","aus","aut","auu","auw","aux","auy","auz","avb","avd","avi","avk","avl","avm","avn","avo","avs","avt","avu","avv","awa","awb","awc","awd","awe","awg","awh","awi","awk","awm","awn","awo","awr","aws","awt","awu","awv","aww","awx","awy","axb","axe","axg","axk","axl","axm","axx","aya","ayb","ayc","ayd","aye","ayg","ayh","ayi","ayk","ayl","ayn","ayo","ayp","ayq","ayr","ays","ayt","ayu","ayx","ayy","ayz","aza","azb","azc","azd","azg","azj","azm","azn","azo","azt","azz"],["ba","be","bg","bh","bi","bm","bn","bo","br","bs","baa","bab","bac","bad","bae","baf","bag","bah","bai","baj","bal","ban","bao","bap","bar","bas","bat","bau","bav","baw","bax","bay","baz","bba","bbb","bbc","bbd","bbe","bbf","bbg","bbh","bbi","bbj","bbk","bbl","bbm","bbn","bbo","bbp","bbq","bbr","bbs","bbt","bbu","bbv","bbw","bbx","bby","bbz","bca","bcb","bcc","bcd","bce","bcf","bcg","bch","bci","bcj","bck","bcl","bcm","bcn","bco","bcp","bcq","bcr","bcs","bct","bcu","bcv","bcw","bcy","bcz","bda","bdb","bdc","bdd","bde","bdf","bdg","bdh","bdi","bdj","bdk","bdl","bdm","bdn","bdo","bdp","bdq","bdr","bds","bdt","bdu","bdv","bdw","bdx","bdy","bdz","bea","beb","bec","bed","bee","bef","beg","beh","bei","bej","bek","bem","beo","bep","beq","ber","bes","bet","beu","bev","bew","bex","bey","bez","bfa","bfb","bfc","bfd","bfe","bff","bfg","bfh","bfi","bfj","bfk","bfl","bfm","bfn","bfo","bfp","bfq","bfr","bfs","bft","bfu","bfw","bfx","bfy","bfz","bga","bgb","bgc","bgd","bge","bgf","bgg","bgi","bgj","bgk","bgl","bgm","bgn","bgo","bgp","bgq","bgr","bgs","bgt","bgu","bgv","bgw","bgx","bgy","bgz","bha","bhb","bhc","bhd","bhe","bhf","bhg","bhh","bhi","bhj","bhk","bhl","bhm","bhn","bho","bhp","bhq","bhr","bhs","bht","bhu","bhv","bhw","bhx","bhy","bhz","bia","bib","bic","bid","bie","bif","big","bij","bik","bil","bim","bin","bio","bip","biq","bir","bit","biu","biv","biw","bix","biy","biz","bja","bjb","bjc","bjd","bje","bjf","bjg","bjh","bji","bjj","bjk","bjl","bjm","bjn","bjo","bjp","bjq","bjr","bjs","bjt","bju","bjv","bjw","bjx","bjy","bjz","bka","bkb","bkc","bkd","bkf","bkg","bkh","bki","bkj","bkk","bkl","bkm","bkn","bko","bkp","bkq","bkr","bks","bkt","bku","bkv","bkw","bkx","bky","bkz","bla","blb","blc","bld","ble","blf","blg","blh","bli","blj","blk","bll","blm","bln","blo","blp","blq","blr","bls","blt","blv","blw","blx","bly","blz","bma","bmb","bmc","bmd","bme","bmf","bmg","bmh","bmi","bmj","bmk","bml","bmm","bmn","bmo","bmp","bmq","bmr","bms","bmt","bmu","bmv","bmw","bmx","bmy","bmz","bna","bnb","bnc","bnd","bne","bnf","bng","bni","bnj","bnk","bnl","bnm","bnn","bno","bnp","bnq","bnr","bns","bnt","bnu","bnv","bnw","bnx","bny","bnz","boa","bob","boe","bof","bog","boh","boi","boj","bok","bol","bom","bon","boo","bop","boq","bor","bot","bou","bov","bow","box","boy","boz","bpa","bpb","bpd","bpe","bpg","bph","bpi","bpj","bpk","bpl","bpm","bpn","bpo","bpp","bpq","bpr","bps","bpt","bpu","bpv","bpw","bpx","bpy","bpz","bqa","bqb","bqc","bqd","bqf","bqg","bqh","bqi","bqj","bqk","bql","bqm","bqn","bqo","bqp","bqq","bqr","bqs","bqt","bqu","bqv","bqw","bqx","bqy","bqz","bra","brb","brc","brd","brf","brg","brh","bri","brj","brk","brl","brm","brn","bro","brp","brq","brr","brs","brt","bru","brv","brw","brx","bry","brz","bsa","bsb","bsc","bse","bsf","bsg","bsh","bsi","bsj","bsk","bsl","bsm","bsn","bso","bsp","bsq","bsr","bss","bst","bsu","bsv","bsw","bsx","bsy","bta","btb","btc","btd","bte","btf","btg","bth","bti","btj","btk","btl","btm","btn","bto","btp","btq","btr","bts","btt","btu","btv","btw","btx","bty","btz","bua","bub","buc","bud","bue","buf","bug","buh","bui","buj","buk","bum","bun","buo","bup","buq","bus","but","buu","buv","buw","bux","buy","buz","bva","bvb","bvc","bvd","bve","bvf","bvg","bvh","bvi","bvj","bvk","bvl","bvm","bvn","bvo","bvp","bvq","bvr","bvt","bvu","bvv","bvw","bvx","bvy","bvz","bwa","bwb","bwc","bwd","bwe","bwf","bwg","bwh","bwi","bwj","bwk","bwl","bwm","bwn","bwo","bwp","bwq","bwr","bws","bwt","bwu","bww","bwx","bwy","bwz","bxa","bxb","bxc","bxd","bxe","bxf","bxg","bxh","bxi","bxj","bxk","bxl","bxm","bxn","bxo","bxp","bxq","bxr","bxs","bxu","bxv","bxw","bxx","bxz","bya","byb","byc","byd","bye","byf","byg","byh","byi","byj","byk","byl","bym","byn","byo","byp","byq","byr","bys","byt","byv","byw","byx","byy","byz","bza","bzb","bzc","bzd","bze","bzf","bzg","bzh","bzi","bzj","bzk","bzl","bzm","bzn","bzo","bzp","bzq","bzr","bzs","bzt","bzu","bzv","bzw","bzx","bzy","bzz"],["ca","ce","ch","co","cr","cs","cu","cv","cy","caa","cab","cac","cad","cae","caf","cag","cah","cai","caj","cak","cal","cam","can","cao","cap","caq","car","cas","cau","cav","caw","cax","cay","caz","cba","cbb","cbc","cbd","cbe","cbg","cbh","cbi","cbj","cbk","cbl","cbn","cbo","cbq","cbr","cbs","cbt","cbu","cbv","cbw","cby","cca","ccc","ccd","cce","ccg","cch","ccj","ccl","ccm","ccn","cco","ccp","ccq","ccr","ccs","cda","cdc","cdd","cde","cdf","cdg","cdh","cdi","cdj","cdm","cdn","cdo","cdr","cds","cdy","cdz","cea","ceb","ceg","cek","cel","cen","cet","cey","cfa","cfd","cfg","cfm","cga","cgc","cgg","cgk","chb","chc","chd","chf","chg","chh","chj","chk","chl","chm","chn","cho","chp","chq","chr","cht","chw","chx","chy","chz","cia","cib","cic","cid","cie","cih","cik","cim","cin","cip","cir","ciw","ciy","cja","cje","cjh","cji","cjk","cjm","cjn","cjo","cjp","cjr","cjs","cjv","cjy","cka","ckb","ckh","ckl","ckm","ckn","cko","ckq","ckr","cks","ckt","cku","ckv","ckx","cky","ckz","cla","clc","cld","cle","clh","cli","clj","clk","cll","clm","clo","clt","clu","clw","cly","cma","cmc","cme","cmg","cmi","cmk","cml","cmm","cmn","cmo","cmr","cms","cmt","cna","cnb","cnc","cng","cnh","cni","cnk","cnl","cno","cnp","cnr","cns","cnt","cnu","cnw","cnx","coa","cob","coc","cod","coe","cof","cog","coh","coj","cok","col","com","con","coo","cop","coq","cot","cou","cov","cow","cox","coy","coz","cpa","cpb","cpc","cpe","cpf","cpg","cpi","cpn","cpo","cpp","cps","cpu","cpx","cpy","cqd","cqu","cra","crb","crc","crd","crf","crg","crh","cri","crj","crk","crl","crm","crn","cro","crp","crq","crr","crs","crt","crv","crw","crx","cry","crz","csa","csb","csc","csd","cse","csf","csg","csh","csi","csj","csk","csl","csm","csn","cso","csp","csq","csr","css","cst","csu","csv","csw","csx","csy","csz","cta","ctc","ctd","cte","ctg","cth","ctl","ctm","ctn","cto","ctp","cts","ctt","ctu","cty","ctz","cua","cub","cuc","cug","cuh","cui","cuj","cuk","cul","cum","cuo","cup","cuq","cur","cus","cut","cuu","cuv","cuw","cux","cuy","cvg","cvn","cwa","cwb","cwd","cwe","cwg","cwt","cya","cyb","cyo","czh","czk","czn","czo","czt"],["da","de","dv","dz","daa","dac","dad","dae","daf","dag","dah","dai","daj","dak","dal","dam","dao","dap","daq","dar","das","dau","dav","daw","dax","day","daz","dba","dbb","dbd","dbe","dbf","dbg","dbi","dbj","dbl","dbm","dbn","dbo","dbp","dbq","dbr","dbt","dbu","dbv","dbw","dby","dcc","dcr","dda","ddd","dde","ddg","ddi","ddj","ddn","ddo","ddr","dds","ddw","dec","ded","dee","def","deg","deh","dei","dek","del","dem","den","dep","deq","der","des","dev","dez","dga","dgb","dgc","dgd","dge","dgg","dgh","dgi","dgk","dgl","dgn","dgo","dgr","dgs","dgt","dgu","dgw","dgx","dgz","dha","dhd","dhg","dhi","dhl","dhm","dhn","dho","dhr","dhs","dhu","dhv","dhw","dhx","dia","dib","dic","did","dif","dig","dih","dii","dij","dik","dil","dim","din","dio","dip","diq","dir","dis","dit","diu","diw","dix","diy","diz","dja","djb","djc","djd","dje","djf","dji","djj","djk","djl","djm","djn","djo","djr","dju","djw","dka","dkg","dkk","dkl","dkr","dks","dkx","dlg","dlk","dlm","dln","dma","dmb","dmc","dmd","dme","dmf","dmg","dmk","dml","dmm","dmn","dmo","dmr","dms","dmu","dmv","dmw","dmx","dmy","dna","dnd","dne","dng","dni","dnj","dnk","dnn","dno","dnr","dnt","dnu","dnv","dnw","dny","doa","dob","doc","doe","dof","doh","doi","dok","dol","don","doo","dop","doq","dor","dos","dot","dov","dow","dox","doy","doz","dpp","dra","drb","drc","drd","dre","drg","drh","dri","drl","drn","dro","drq","drr","drs","drt","dru","drw","dry","dsb","dse","dsh","dsi","dsl","dsn","dso","dsq","dta","dtb","dtd","dth","dti","dtk","dtm","dtn","dto","dtp","dtr","dts","dtt","dtu","dty","dua","dub","duc","dud","due","duf","dug","duh","dui","duj","duk","dul","dum","dun","duo","dup","duq","dur","dus","duu","duv","duw","dux","duy","duz","dva","dwa","dwk","dwl","dwr","dws","dwu","dww","dwy","dwz","dya","dyb","dyd","dyg","dyi","dym","dyn","dyo","dyu","dyy","dza","dzd","dze","dzg","dzl","dzn"],["ee","el","en","eo","es","et","eu","eaa","ebc","ebg","ebk","ebo","ebr","ebu","ecr","ecs","ecy","eee","efa","efe","efi","ega","egl","ego","egx","egy","ehs","ehu","eip","eit","eiv","eja","eka","ekc","eke","ekg","eki","ekk","ekl","ekm","eko","ekp","ekr","eky","ele","elh","eli","elk","elm","elo","elp","elu","elx","ema","emb","eme","emg","emi","emk","emm","emn","emo","emp","emq","ems","emu","emw","emx","emy","emz","ena","enb","enc","end","enf","enh","enl","enm","enn","eno","enq","enr","enu","env","enw","enx","eot","epi","era","erg","erh","eri","erk","ero","err","ers","ert","erw","ese","esg","esh","esi","esk","esl","esm","esn","eso","esq","ess","esu","esx","esy","etb","etc","eth","etn","eto","etr","ets","ett","etu","etx","etz","euq","eve","evh","evn","ewo","ext","eya","eyo","eza","eze"],["fa","ff","fi","fj","fo","fr","fy","faa","fab","fad","faf","fag","fah","fai","faj","fak","fal","fam","fan","fap","far","fat","fau","fax","fay","faz","fbl","fcs","fer","ffi","ffm","fgr","fia","fie","fif","fil","fip","fir","fit","fiu","fiw","fkk","fkv","fla","flh","fli","fll","fln","flr","fly","fmp","fmu","fnb","fng","fni","fod","foi","fom","fon","for","fos","fox","fpe","fqs","frc","frd","frk","frm","fro","frp","frq","frr","frs","frt","fse","fsl","fss","fub","fuc","fud","fue","fuf","fuh","fui","fuj","fum","fun","fuq","fur","fut","fuu","fuv","fuy","fvr","fwa","fwe"],["ga","gd","gl","gn","gu","gv","gaa","gab","gac","gad","gae","gaf","gag","gah","gai","gaj","gak","gal","gam","gan","gao","gap","gaq","gar","gas","gat","gau","gav","gaw","gax","gay","gaz","gba","gbb","gbc","gbd","gbe","gbf","gbg","gbh","gbi","gbj","gbk","gbl","gbm","gbn","gbo","gbp","gbq","gbr","gbs","gbu","gbv","gbw","gbx","gby","gbz","gcc","gcd","gce","gcf","gcl","gcn","gcr","gct","gda","gdb","gdc","gdd","gde","gdf","gdg","gdh","gdi","gdj","gdk","gdl","gdm","gdn","gdo","gdq","gdr","gds","gdt","gdu","gdx","gea","geb","gec","ged","gef","geg","geh","gei","gej","gek","gel","gem","geq","ges","gev","gew","gex","gey","gez","gfk","gft","gfx","gga","ggb","ggd","gge","ggg","ggk","ggl","ggn","ggo","ggr","ggt","ggu","ggw","gha","ghc","ghe","ghh","ghk","ghl","ghn","gho","ghr","ghs","ght","gia","gib","gic","gid","gie","gig","gih","gii","gil","gim","gin","gio","gip","giq","gir","gis","git","giu","giw","gix","giy","giz","gji","gjk","gjm","gjn","gjr","gju","gka","gkd","gke","gkn","gko","gkp","gku","glb","glc","gld","glh","gli","glj","glk","gll","glo","glr","glu","glw","gly","gma","gmb","gmd","gme","gmg","gmh","gml","gmm","gmn","gmq","gmr","gmu","gmv","gmw","gmx","gmy","gmz","gna","gnb","gnc","gnd","gne","gng","gnh","gni","gnj","gnk","gnl","gnm","gnn","gno","gnq","gnr","gnt","gnu","gnw","gnz","goa","gob","goc","god","goe","gof","gog","goh","goi","goj","gok","gol","gom","gon","goo","gop","goq","gor","gos","got","gou","gow","gox","goy","goz","gpa","gpe","gpn","gqa","gqi","gqn","gqr","gqu","gra","grb","grc","grd","grg","grh","gri","grj","grk","grm","gro","grq","grr","grs","grt","gru","grv","grw","grx","gry","grz","gse","gsg","gsl","gsm","gsn","gso","gsp","gss","gsw","gta","gti","gtu","gua","gub","guc","gud","gue","guf","gug","guh","gui","guk","gul","gum","gun","guo","gup","guq","gur","gus","gut","guu","guv","guw","gux","guz","gva","gvc","gve","gvf","gvj","gvl","gvm","gvn","gvo","gvp","gvr","gvs","gvy","gwa","gwb","gwc","gwd","gwe","gwf","gwg","gwi","gwj","gwm","gwn","gwr","gwt","gwu","gww","gwx","gxx","gya","gyb","gyd","gye","gyf","gyg","gyi","gyl","gym","gyn","gyo","gyr","gyy","gyz","gza","gzi","gzn"],["ha","he","hi","ho","hr","ht","hu","hy","hz","haa","hab","hac","had","hae","haf","hag","hah","hai","haj","hak","hal","ham","han","hao","hap","haq","har","has","hav","haw","hax","hay","haz","hba","hbb","hbn","hbo","hbu","hca","hch","hdn","hds","hdy","hea","hed","heg","heh","hei","hem","hgm","hgw","hhi","hhr","hhy","hia","hib","hid","hif","hig","hih","hii","hij","hik","hil","him","hio","hir","hit","hiw","hix","hji","hka","hke","hkh","hkk","hkn","hks","hla","hlb","hld","hle","hlt","hlu","hma","hmb","hmc","hmd","hme","hmf","hmg","hmh","hmi","hmj","hmk","hml","hmm","hmn","hmp","hmq","hmr","hms","hmt","hmu","hmv","hmw","hmx","hmy","hmz","hna","hnd","hne","hng","hnh","hni","hnj","hnn","hno","hns","hnu","hoa","hob","hoc","hod","hoe","hoh","hoi","hoj","hok","hol","hom","hoo","hop","hor","hos","hot","hov","how","hoy","hoz","hpo","hps","hra","hrc","hre","hrk","hrm","hro","hrp","hrr","hrt","hru","hrw","hrx","hrz","hsb","hsh","hsl","hsn","hss","hti","hto","hts","htu","htx","hub","huc","hud","hue","huf","hug","huh","hui","huj","huk","hul","hum","huo","hup","huq","hur","hus","hut","huu","huv","huw","hux","huy","huz","hvc","hve","hvk","hvn","hvv","hwa","hwc","hwo","hya","hyw","hyx"],["ia","id","ie","ig","ii","ik","in","io","is","it","iu","iw","iai","ian","iap","iar","iba","ibb","ibd","ibe","ibg","ibh","ibi","ibl","ibm","ibn","ibr","ibu","iby","ica","ich","icl","icr","ida","idb","idc","idd","ide","idi","idr","ids","idt","idu","ifa","ifb","ife","iff","ifk","ifm","ifu","ify","igb","ige","igg","igl","igm","ign","igo","igs","igw","ihb","ihi","ihp","ihw","iin","iir","ijc","ije","ijj","ijn","ijo","ijs","ike","iki","ikk","ikl","iko","ikp","ikr","iks","ikt","ikv","ikw","ikx","ikz","ila","ilb","ilg","ili","ilk","ill","ilm","ilo","ilp","ils","ilu","ilv","ilw","ima","ime","imi","iml","imn","imo","imr","ims","imy","inb","inc","ine","ing","inh","inj","inl","inm","inn","ino","inp","ins","int","inz","ior","iou","iow","ipi","ipo","iqu","iqw","ira","ire","irh","iri","irk","irn","iro","irr","iru","irx","iry","isa","isc","isd","ise","isg","ish","isi","isk","ism","isn","iso","isr","ist","isu","itb","itc","itd","ite","iti","itk","itl","itm","ito","itr","its","itt","itv","itw","itx","ity","itz","ium","ivb","ivv","iwk","iwm","iwo","iws","ixc","ixl","iya","iyo","iyx","izh","izi","izr","izz"],["ja","ji","jv","jw","jaa","jab","jac","jad","jae","jaf","jah","jaj","jak","jal","jam","jan","jao","jaq","jar","jas","jat","jau","jax","jay","jaz","jbe","jbi","jbj","jbk","jbm","jbn","jbo","jbr","jbt","jbu","jbw","jcs","jct","jda","jdg","jdt","jeb","jee","jeg","jeh","jei","jek","jel","jen","jer","jet","jeu","jgb","jge","jgk","jgo","jhi","jhs","jia","jib","jic","jid","jie","jig","jih","jii","jil","jim","jio","jiq","jit","jiu","jiv","jiy","jje","jjr","jka","jkm","jko","jkp","jkr","jks","jku","jle","jls","jma","jmb","jmc","jmd","jmi","jml","jmn","jmr","jms","jmw","jmx","jna","jnd","jng","jni","jnj","jnl","jns","job","jod","jog","jor","jos","jow","jpa","jpr","jpx","jqr","jra","jrb","jrr","jrt","jru","jsl","jua","jub","juc","jud","juh","jui","juk","jul","jum","jun","juo","jup","jur","jus","jut","juu","juw","juy","jvd","jvn","jwi","jya","jye","jyy"],["ka","kg","ki","kj","kk","kl","km","kn","ko","kr","ks","ku","kv","kw","ky","kaa","kab","kac","kad","kae","kaf","kag","kah","kai","kaj","kak","kam","kao","kap","kaq","kar","kav","kaw","kax","kay","kba","kbb","kbc","kbd","kbe","kbf","kbg","kbh","kbi","kbj","kbk","kbl","kbm","kbn","kbo","kbp","kbq","kbr","kbs","kbt","kbu","kbv","kbw","kbx","kby","kbz","kca","kcb","kcc","kcd","kce","kcf","kcg","kch","kci","kcj","kck","kcl","kcm","kcn","kco","kcp","kcq","kcr","kcs","kct","kcu","kcv","kcw","kcx","kcy","kcz","kda","kdc","kdd","kde","kdf","kdg","kdh","kdi","kdj","kdk","kdl","kdm","kdn","kdo","kdp","kdq","kdr","kdt","kdu","kdv","kdw","kdx","kdy","kdz","kea","keb","kec","ked","kee","kef","keg","keh","kei","kej","kek","kel","kem","ken","keo","kep","keq","ker","kes","ket","keu","kev","kew","kex","key","kez","kfa","kfb","kfc","kfd","kfe","kff","kfg","kfh","kfi","kfj","kfk","kfl","kfm","kfn","kfo","kfp","kfq","kfr","kfs","kft","kfu","kfv","kfw","kfx","kfy","kfz","kga","kgb","kgc","kgd","kge","kgf","kgg","kgh","kgi","kgj","kgk","kgl","kgm","kgn","kgo","kgp","kgq","kgr","kgs","kgt","kgu","kgv","kgw","kgx","kgy","kha","lyg","khb","khc","khd","khe","khf","khg","khh","khi","khj","khk","khl","khn","kho","khp","khq","khr","khs","kht","khu","khv","khw","khx","khy","khz","kia","kib","kic","kid","kie","kif","kig","kih","kii","kij","kil","kim","kio","kip","kiq","kis","kit","kiu","kiv","kiw","kix","kiy","kiz","kja","kjb","kjc","kjd","kje","kjf","kjg","kjh","kji","kjj","kjk","kjl","kjm","kjn","kjo","kjp","kjq","kjr","kjs","kjt","kju","kjv","kjx","kjy","kjz","kka","kkb","kkc","kkd","kke","kkf","kkg","kkh","kki","kkj","kkk","kkl","kkm","kkn","kko","kkp","kkq","kkr","kks","kkt","kku","kkv","kkw","kkx","kky","kkz","kla","klb","klc","kld","kle","klf","klg","klh","kli","klj","klk","kll","klm","kln","klo","klp","klq","klr","kls","klt","klu","klv","klw","klx","kly","klz","kma","kmb","kmc","kmd","kme","kmf","kmg","kmh","kmi","kmj","kmk","kml","kmm","kmn","kmo","kmp","kmq","kmr","kms","kmt","kmu","kmv","kmw","kmx","kmy","kmz","kna","knb","knc","knd","kne","knf","kng","kni","knj","knk","knl","knm","knn","kno","knp","knq","knr","kns","knt","knu","knv","knw","knx","kny","knz","koa","koc","kod","koe","kof","kog","koh","koi","koj","kok","kol","koo","kop","koq","kos","kot","kou","kov","kow","kox","koy","koz","kpa","kpb","kpc","kpd","kpe","kpf","kpg","kph","kpi","kpj","kpk","kpl","kpm","kpn","kpo","kpp","kpq","kpr","kps","kpt","kpu","kpv","kpw","kpx","kpy","kpz","kqa","kqb","kqc","kqd","kqe","kqf","kqg","kqh","kqi","kqj","kqk","kql","kqm","kqn","kqo","kqp","kqq","kqr","kqs","kqt","kqu","kqv","kqw","kqx","kqy","kqz","kra","krb","krc","krd","kre","krf","krh","kri","krj","krk","krl","krm","krn","kro","krp","krr","krs","krt","kru","krv","krw","krx","kry","krz","ksa","ksb","ksc","ksd","kse","ksf","ksg","ksh","ksi","ksj","ksk","ksl","ksm","ksn","kso","ksp","ksq","ksr","kss","kst","ksu","ksv","ksw","ksx","ksy","ksz","kta","ktb","ktc","ktd","kte","ktf","ktg","kth","kti","ktj","ktk","ktl","ktm","ktn","kto","ktp","ktq","ktr","kts","ktt","ktu","ktv","ktw","ktx","kty","ktz","kub","kuc","kud","kue","kuf","kug","kuh","kui","kuj","kuk","kul","kum","kun","kuo","kup","kuq","kus","kut","kuu","kuv","kuw","kux","kuy","kuz","kva","kvb","kvc","kvd","kve","kvf","kvg","kvh","kvi","kvj","kvk","kvl","kvm","kvn","kvo","kvp","kvq","kvr","kvs","kvt","kvu","kvv","kvw","kvx","kvy","kvz","kwa","kwb","kwc","kwd","kwe","kwf","kwg","kwh","kwi","kwj","kwk","kwl","kwm","kwn","kwo","kwp","kwq","kwr","kws","kwt","kwu","kwv","kww","kwx","kwy","kwz","kxa","kxb","kxc","kxd","kxe","kxf","kxh","kxi","kxj","kxk","kxl","kxm","kxn","kxo","kxp","kxq","kxr","kxs","kxt","kxu","kxv","kxw","kxx","kxy","kxz","kya","kyb","kyc","kyd","kye","kyf","kyg","kyh","kyi","kyj","kyk","kyl","kym","kyn","kyo","kyp","kyq","kyr","kys","kyt","kyu","kyv","kyw","kyx","kyy","kyz","kza","kzb","kzc","kzd","kze","kzf","kzg","kzh","kzi","kzj","kzk","kzl","kzm","kzn","kzo","kzp","kzq","kzr","kzs","kzt","kzu","kzv","kzw","kzx","kzy","kzz"],["la","lb","lg","li","ln","lo","lt","lu","lv","laa","lab","lac","lad","lae","laf","lag","lah","lai","laj","lak","lal","lam","lan","lap","laq","lar","las","lau","law","lax","lay","laz","lba","lbb","lbc","lbe","lbf","lbg","lbi","lbj","lbk","lbl","lbm","lbn","lbo","lbq","lbr","lbs","lbt","lbu","lbv","lbw","lbx","lby","lbz","lcc","lcd","lce","lcf","lch","lcl","lcm","lcp","lcq","lcs","lda","ldb","ldd","ldg","ldh","ldi","ldj","ldk","ldl","ldm","ldn","ldo","ldp","ldq","lea","leb","lec","led","lee","lef","leg","leh","lei","lej","lek","lel","lem","len","leo","lep","leq","ler","les","let","leu","lev","lew","lex","ley","lez","lfa","lfn","lga","lgb","lgg","lgh","lgi","lgk","lgl","lgm","lgn","lgq","lgr","lgt","lgu","lgz","lha","lhh","lhi","lhl","lhm","lhn","lhp","lhs","lht","lhu","lia","lib","lic","lid","lie","lif","lig","lih","lii","lij","lik","lil","lio","lip","liq","lir","lis","liu","liv","liw","lix","liy","liz","lja","lje","lji","ljl","ljp","ljw","ljx","lka","lkb","lkc","lkd","lke","lkh","lki","lkj","lkl","lkm","lkn","lko","lkr","lks","lkt","lku","lky","lla","llb","llc","lld","lle","llf","llg","llh","lli","llj","llk","lll","llm","lln","llo","llp","llq","lls","llu","llx","lma","lmb","lmc","lmd","lme","lmf","lmg","lmh","lmi","lmj","lmk","lml","lmm","lmn","lmo","lmp","lmq","lmr","lmu","lmv","lmw","lmx","lmy","lmz","lna","lnb","lnd","lng","lnh","lni","lnj","lnl","lnm","lnn","lno","lns","lnu","lnw","lnz","loa","lob","loc","loe","lof","log","loh","loi","loj","lok","lol","lom","lon","loo","lop","loq","lor","los","lot","lou","lov","low","lox","loy","loz","lpa","lpe","lpn","lpo","lpx","lra","lrc","lre","lrg","lri","lrk","lrl","lrm","lrn","lro","lrr","lrt","lrv","lrz","lsa","lsb","lsd","lse","lsg","lsh","lsi","lsl","lsm","lsn","lso","lsp","lsr","lss","lst","lsv","lsy","ltc","ltg","lth","lti","ltn","lto","lts","ltu","lua","luc","lud","lue","luf","lui","luj","luk","lul","lum","lun","luo","lup","luq","lur","lus","lut","luu","luv","luw","luy","luz","lva","lvi","lvk","lvs","lvu","lwa","lwe","lwg","lwh","lwl","lwm","lwo","lws","lwt","lwu","lww","lxm","lya","lyg","lyn","lzh","lzl","lzn","lzz"],["mg","mh","mi","mk","ml","mn","mo","mr","ms","mt","my","maa","mab","mad","mae","maf","mag","mai","maj","mak","mam","man","map","maq","mas","mat","mau","mav","maw","max","maz","mba","mbb","mbc","mbd","mbe","mbf","mbh","mbi","mbj","mbk","mbl","mbm","mbn","mbo","mbp","mbq","mbr","mbs","mbt","mbu","mbv","mbw","mbx","mby","mbz","mca","mcb","mcc","mcd","mce","mcf","mcg","mch","mci","mcj","mck","mcl","mcm","mcn","mco","mcp","mcq","mcr","mcs","mct","mcu","mcv","mcw","mcx","mcy","mcz","mda","mdb","mdc","mdd","mde","mdf","mdg","mdh","mdi","mdj","mdk","mdl","mdm","mdn","mdp","mdq","mdr","mds","mdt","mdu","mdv","mdw","mdx","mdy","mdz","mea","meb","mec","med","mee","mef","meg","meh","mei","mej","mek","mel","mem","men","meo","mep","meq","mer","mes","met","meu","mev","mew","mey","mez","mfa","mfb","mfc","mfd","mfe","mff","mfg","mfh","mfi","mfj","mfk","mfl","mfm","mfn","mfo","mfp","mfq","mfr","mfs","mft","mfu","mfv","mfw","mfx","mfy","mfz","mga","mgb","mgc","mgd","mge","mgf","mgg","mgh","mgi","mgj","mgk","mgl","mgm","mgn","mgo","mgp","mgq","mgr","mgs","mgt","mgu","mgv","mgw","mgx","mgy","mgz","mha","mhb","mhc","mhd","mhe","mhf","mhg","mhh","mhi","mhj","mhk","mhl","mhm","mhn","mho","mhp","mhq","mhr","mhs","mht","mhu","mhw","mhx","mhy","mhz","mia","mib","mic","mid","mie","mif","mig","mih","mii","mij","mik","mil","mim","min","mio","mip","miq","mir","mis","mit","miu","miw","mix","miy","miz","mja","mjb","mjc","mjd","mje","mjg","mjh","mji","mjj","mjk","mjl","mjm","mjn","mjo","mjp","mjq","mjr","mjs","mjt","mju","mjv","mjw","mjx","mjy","mjz","mka","mkb","mkc","mke","mkf","mkg","mkh","mki","mkj","mkk","mkl","mkm","mkn","mko","mkp","mkq","mkr","mks","mkt","mku","mkv","mkw","mkx","mky","mkz","mla","mlb","mlc","mld","mle","mlf","mlh","mli","mlj","mlk","mll","mlm","mln","mlo","mlp","mlq","mlr","mls","mlu","mlv","mlw","mlx","mlz","mma","mmb","mmc","mmd","mme","mmf","mmg","mmh","mmi","mmj","mmk","mml","mmm","mmn","mmo","mmp","mmq","mmr","mmt","mmu","mmv","mmw","mmx","mmy","mmz","mna","mnb","mnc","mnd","mne","mnf","mng","mnh","mni","mnj","mnk","mnl","mnm","mnn","mno","mnp","mnq","mnr","mns","mnt","mnu","mnv","mnw","mnx","mny","mnz","moa","moc","mod","moe","mof","mog","moh","moi","moj","mok","mom","moo","mop","moq","mor","mos","mot","mou","mov","mow","mox","moy","moz","mpa","mpb","mpc","mpd","mpe","mpg","mph","mpi","mpj","mpk","mpl","mpm","mpn","mpo","mpp","mpq","mpr","mps","mpt","mpu","mpv","mpw","mpx","mpy","mpz","mqa","mqb","mqc","mqe","mqf","mqg","mqh","mqi","mqj","mqk","mql","mqm","mqn","mqo","mqp","mqq","mqr","mqs","mqt","mqu","mqv","mqw","mqx","mqy","mqz","mra","mrb","mrc","mrd","mre","mrf","mrg","mrh","mrj","mrk","mrl","mrm","mrn","mro","mrp","mrq","mrr","mrs","mrt","mru","mrv","mrw","mrx","mry","mrz","msb","msc","msd","mse","msf","msg","msh","msi","msj","msk","msl","msm","msn","mso","msp","msq","msr","mss","mst","msu","msv","msw","msx","msy","msz","mta","mtb","mtc","mtd","mte","mtf","mtg","mth","mti","mtj","mtk","mtl","mtm","mtn","mto","mtp","mtq","mtr","mts","mtt","mtu","mtv","mtw","mtx","mty","mua","mub","muc","mud","mue","mug","muh","mui","muj","muk","mul","mum","mun","muo","mup","muq","mur","mus","mut","muu","muv","mux","muy","muz","mva","mvb","mvd","mve","mvf","mvg","mvh","mvi","mvk","mvl","mvm","mvn","mvo","mvp","mvq","mvr","mvs","mvt","mvu","mvv","mvw","mvx","mvy","mvz","mwa","mwb","mwc","mwd","mwe","mwf","mwg","mwh","mwi","mwj","mwk","mwl","mwm","mwn","mwo","mwp","mwq","mwr","mws","mwt","mwu","mwv","mww","mwx","mwy","mwz","mxa","mxb","mxc","mxd","mxe","mxf","mxg","mxh","mxi","mxj","mxk","mxl","mxm","mxn","mxo","mxp","mxq","mxr","mxs","mxt","mxu","mxv","mxw","mxx","mxy","mxz","myb","myc","myd","mye","myf","myg","myh","myi","myj","myk","myl","mym","myn","myo","myp","myq","myr","mys","myt","myu","myv","myw","myx","myy","myz","mza","mzb","mzc","mzd","mze","mzg","mzh","mzi","mzj","mzk","mzl","mzm","mzn","mzo","mzp","mzq","mzr","mzs","mzt","mzu","mzv","mzw","mzx","mzy","mzz"],["na","nb","nd","ne","ng","nl","nn","no","nr","nv","ny","naa","nab","nac","nad","nae","naf","nag","nah","nai","naj","nak","nal","nam","nan","nao","nap","naq","nar","nas","nat","naw","nax","nay","naz","nba","nbb","nbc","nbd","nbe","nbf","nbg","nbh","nbi","nbj","nbk","nbm","nbn","nbo","nbp","nbq","nbr","nbs","nbt","nbu","nbv","nbw","nbx","nby","nca","ncb","ncc","ncd","nce","ncf","ncg","nch","nci","ncj","nck","ncl","ncm","ncn","nco","ncp","ncq","ncr","ncs","nct","ncu","ncx","ncz","nda","ndb","ndc","ndd","ndf","ndg","ndh","ndi","ndj","ndk","ndl","ndm","ndn","ndp","ndq","ndr","nds","ndt","ndu","ndv","ndw","ndx","ndy","ndz","nea","neb","nec","ned","nee","nef","neg","neh","nei","nej","nek","nem","nen","neo","neq","ner","nes","net","neu","nev","new","nex","ney","nez","nfa","nfd","nfl","nfr","nfu","nga","ngb","ngc","ngd","nge","ngf","ngg","ngh","ngi","ngj","ngk","ngl","ngm","ngn","ngo","ngp","ngq","ngr","ngs","ngt","ngu","ngv","ngw","ngx","ngy","ngz","nha","nhb","nhc","nhd","nhe","nhf","nhg","nhh","nhi","nhk","nhm","nhn","nho","nhp","nhq","nhr","nht","nhu","nhv","nhw","nhx","nhy","nhz","nia","nib","nic","nid","nie","nif","nig","nih","nii","nij","nik","nil","nim","nin","nio","niq","nir","nis","nit","niu","niv","niw","nix","niy","niz","nja","njb","njd","njh","nji","njj","njl","njm","njn","njo","njr","njs","njt","nju","njx","njy","njz","nka","nkb","nkc","nkd","nke","nkf","nkg","nkh","nki","nkj","nkk","nkm","nkn","nko","nkp","nkq","nkr","nks","nkt","nku","nkv","nkw","nkx","nkz","nla","nlc","nle","nlg","nli","nlj","nlk","nll","nlm","nln","nlo","nlq","nlr","nlu","nlv","nlw","nlx","nly","nlz","nma","nmb","nmc","nmd","nme","nmf","nmg","nmh","nmi","nmj","nmk","nml","nmm","nmn","nmo","nmp","nmq","nmr","nms","nmt","nmu","nmv","nmw","nmx","nmy","nmz","nna","nnb","nnc","nnd","nne","nnf","nng","nnh","nni","nnj","nnk","nnl","nnm","nnn","nnp","nnq","nnr","nns","nnt","nnu","nnv","nnw","nnx","nny","nnz","noa","noc","nod","noe","nof","nog","noh","noi","noj","nok","nol","nom","non","noo","nop","noq","nos","not","nou","nov","now","noy","noz","npa","npb","npg","nph","npi","npl","npn","npo","nps","npu","npx","npy","nqg","nqk","nql","nqm","nqn","nqo","nqq","nqt","nqy","nra","nrb","nrc","nre","nrf","nrg","nri","nrk","nrl","nrm","nrn","nrp","nrr","nrt","nru","nrx","nrz","nsa","nsb","nsc","nsd","nse","nsf","nsg","nsh","nsi","nsk","nsl","nsm","nsn","nso","nsp","nsq","nsr","nss","nst","nsu","nsv","nsw","nsx","nsy","nsz","ntd","nte","ntg","nti","ntj","ntk","ntm","nto","ntp","ntr","nts","ntu","ntw","ntx","nty","ntz","nua","nub","nuc","nud","nue","nuf","nug","nuh","nui","nuj","nuk","nul","num","nun","nuo","nup","nuq","nur","nus","nut","nuu","nuv","nuw","nux","nuy","nuz","nvh","nvm","nvo","nwa","nwb","nwc","nwe","nwg","nwi","nwm","nwo","nwr","nwx","nwy","nxa","nxd","nxe","nxg","nxi","nxk","nxl","nxm","nxn","nxo","nxq","nxr","nxu","nxx","nyb","nyc","nyd","nye","nyf","nyg","nyh","nyi","nyj","nyk","nyl","nym","nyn","nyo","nyp","nyq","nyr","nys","nyt","nyu","nyv","nyw","nyx","nyy","nza","nzb","nzd","nzi","nzk","nzm","nzs","nzu","nzy","nzz"],["oc","oj","om","or","os","oaa","oac","oar","oav","obi","obk","obl","obm","obo","obr","obt","obu","oca","och","ocm","oco","ocu","oda","odk","odt","odu","ofo","ofs","ofu","ogb","ogc","oge","ogg","ogo","ogu","oht","ohu","oia","oin","ojb","ojc","ojg","ojp","ojs","ojv","ojw","oka","okb","okc","okd","oke","okg","okh","oki","okj","okk","okl","okm","okn","oko","okr","oks","oku","okv","okx","okz","ola","old","ole","olk","olm","olo","olr","olt","olu","oma","omb","omc","ome","omg","omi","omk","oml","omn","omo","omp","omq","omr","omt","omu","omv","omw","omx","omy","ona","onb","one","ong","oni","onj","onk","onn","ono","onp","onr","ons","ont","onu","onw","onx","ood","oog","oon","oor","oos","opa","opk","opm","opo","opt","opy","ora","orc","ore","org","orh","orn","oro","orr","ors","ort","oru","orv","orw","orx","ory","orz","osa","osc","osi","osn","oso","osp","ost","osu","osx","ota","otb","otd","ote","oti","otk","otl","otm","otn","oto","otq","otr","ots","ott","otu","otw","otx","oty","otz","oua","oub","oue","oui","oum","oun","ovd","owi","owl","oyb","oyd","oym","oyy","ozm"],["pa","pi","pl","ps","pt","paa","pab","pac","pad","pae","paf","pag","pah","pai","pak","pal","pam","pao","pap","paq","par","pas","pat","pau","pav","paw","pax","pay","paz","pbb","pbc","pbe","pbf","pbg","pbh","pbi","pbl","pbm","pbn","pbo","pbp","pbr","pbs","pbt","pbu","pbv","pby","pbz","pca","pcb","pcc","pcd","pce","pcf","pcg","pch","pci","pcj","pck","pcl","pcm","pcn","pcp","pcr","pcw","pda","pdc","pdi","pdn","pdo","pdt","pdu","pea","peb","ped","pee","pef","peg","peh","pei","pej","pek","pel","pem","peo","pep","peq","pes","pev","pex","pey","pez","pfa","pfe","pfl","pga","pgd","pgg","pgi","pgk","pgl","pgn","pgs","pgu","pgy","pgz","pha","phd","phg","phh","phi","phk","phl","phm","phn","pho","phq","phr","pht","phu","phv","phw","pia","pib","pic","pid","pie","pif","pig","pih","pii","pij","pil","pim","pin","pio","pip","pir","pis","pit","piu","piv","piw","pix","piy","piz","pjt","pka","pkb","pkc","pkg","pkh","pkn","pko","pkp","pkr","pks","pkt","pku","pla","plb","plc","pld","ple","plf","plg","plh","plj","plk","pll","pln","plo","plp","plq","plr","pls","plt","plu","plv","plw","ply","plz","pma","pmb","pmc","pmd","pme","pmf","pmh","pmi","pmj","pmk","pml","pmm","pmn","pmo","pmq","pmr","pms","pmt","pmu","pmw","pmx","pmy","pmz","pna","pnb","pnc","pnd","pne","png","pnh","pni","pnj","pnk","pnl","pnm","pnn","pno","pnp","pnq","pnr","pns","pnt","pnu","pnv","pnw","pnx","pny","pnz","poc","pod","poe","pof","pog","poh","poi","pok","pom","pon","poo","pop","poq","pos","pot","pov","pow","pox","poy","poz","ppa","ppe","ppi","ppk","ppl","ppm","ppn","ppo","ppp","ppq","ppr","pps","ppt","ppu","pqa","pqe","pqm","pqw","pra","prb","prc","prd","pre","prf","prg","prh","pri","prk","prl","prm","prn","pro","prp","prq","prr","prs","prt","pru","prw","prx","pry","prz","psa","psc","psd","pse","psg","psh","psi","psl","psm","psn","pso","psp","psq","psr","pss","pst","psu","psw","psy","pta","pth","pti","ptn","pto","ptp","ptq","ptr","ptt","ptu","ptv","ptw","pty","pua","pub","puc","pud","pue","puf","pug","pui","puj","puk","pum","puo","pup","puq","pur","put","puu","puw","pux","puy","puz","pwa","pwb","pwg","pwi","pwm","pwn","pwo","pwr","pww","pxm","pye","pym","pyn","pys","pyu","pyx","pyy","pzn"],["qu","qua","qub","quc","qud","quf","qug","quh","qui","quk","qul","qum","qun","qup","quq","qur","qus","quv","quw","qux","quy","quz","qva","qvc","qve","qvh","qvi","qvj","qvl","qvm","qvn","qvo","qvp","qvs","qvw","qvy","qvz","qwa","qwc","qwe","qwh","qwm","qws","qwt","qxa","qxc","qxh","qxl","qxn","qxo","qxp","qxq","qxr","qxs","qxt","qxu","qxw","qya","qyp"],["rm","rn","ro","ru","rw","raa","rab","rac","rad","raf","rag","rah","rai","raj","rak","ral","ram","ran","rao","rap","raq","rar","ras","rat","rau","rav","raw","rax","ray","raz","rbb","rbk","rbl","rbp","rcf","rdb","rea","reb","ree","reg","rei","rej","rel","rem","ren","rer","res","ret","rey","rga","rge","rgk","rgn","rgr","rgs","rgu","rhg","rhp","ria","rie","rif","ril","rim","rin","rir","rit","riu","rjg","rji","rjs","rka","rkb","rkh","rki","rkm","rkt","rkw","rma","rmb","rmc","rmd","rme","rmf","rmg","rmh","rmi","rmk","rml","rmm","rmn","rmo","rmp","rmq","rmr","rms","rmt","rmu","rmv","rmw","rmx","rmy","rmz","rna","rnd","rng","rnl","rnn","rnp","rnr","rnw","roa","rob","roc","rod","roe","rof","rog","rol","rom","roo","rop","ror","rou","row","rpn","rpt","rri","rro","rrt","rsb","rsi","rsl","rsm","rtc","rth","rtm","rts","rtw","rub","ruc","rue","ruf","rug","ruh","rui","ruk","ruo","rup","ruq","rut","ruu","ruy","ruz","rwa","rwk","rwl","rwm","rwo","rwr","rxd","rxw","ryn","rys","ryu","rzh"],["sa","sc","sd","se","sg","sh","si","sk","sl","sm","sn","so","sq","sr","ss","st","su","sv","sw","saa","sab","sac","sad","sae","saf","sah","sai","saj","sak","sal","sam","sao","sap","saq","sar","sas","sat","sau","sav","saw","sax","say","saz","sba","sbb","sbc","sbd","sbe","sbf","sbg","sbh","sbi","sbj","sbk","sbl","sbm","sbn","sbo","sbp","sbq","sbr","sbs","sbt","sbu","sbv","sbw","sbx","sby","sbz","sca","scb","sce","scf","scg","sch","sci","sck","scl","scn","sco","scp","scq","scs","sct","scu","scv","scw","scx","sda","sdb","sdc","sde","sdf","sdg","sdh","sdj","sdk","sdl","sdm","sdn","sdo","sdp","sdq","sdr","sds","sdt","sdu","sdv","sdx","sdz","sea","seb","sec","sed","see","sef","seg","seh","sei","sej","sek","sel","sem","sen","seo","sep","seq","ser","ses","set","seu","sev","sew","sey","sez","sfb","sfe","sfm","sfs","sfw","sga","sgb","sgc","sgd","sge","sgg","sgh","sgi","sgj","sgk","sgl","sgm","sgn","sgo","sgp","sgr","sgs","sgt","sgu","sgw","sgx","sgy","sgz","sha","shb","shc","shd","she","shg","shh","shi","shj","shk","shl","shm","shn","sho","shp","shq","shr","shs","sht","shu","shv","shw","shx","shy","shz","sia","sib","sid","sie","sif","sig","sih","sii","sij","sik","sil","sim","sio","sip","siq","sir","sis","sit","siu","siv","siw","six","siy","siz","sja","sjb","sjd","sje","sjg","sjk","sjl","sjm","sjn","sjo","sjp","sjr","sjs","sjt","sju","sjw","ska","skb","skc","skd","ske","skf","skg","skh","ski","skj","skk","skm","skn","sko","skp","skq","skr","sks","skt","sku","skv","skw","skx","sky","skz","sla","slc","sld","sle","slf","slg","slh","sli","slj","sll","slm","sln","slp","slq","slr","sls","slt","slu","slw","slx","sly","slz","sma","smb","smc","smd","smf","smg","smh","smi","smj","smk","sml","smm","smn","smp","smq","smr","sms","smt","smu","smv","smw","smx","smy","smz","snb","snc","sne","snf","sng","snh","sni","snj","snk","snl","snm","snn","sno","snp","snq","snr","sns","snu","snv","snw","snx","sny","snz","soa","sob","soc","sod","soe","sog","soh","soi","soj","sok","sol","son","soo","sop","soq","sor","sos","sou","sov","sow","sox","soy","soz","spb","spc","spd","spe","spg","spi","spk","spl","spm","spn","spo","spp","spq","spr","sps","spt","spu","spv","spx","spy","sqa","sqh","sqj","sqk","sqm","sqn","sqo","sqq","sqr","sqs","sqt","squ","sqx","sra","srb","src","sre","srf","srg","srh","sri","srk","srl","srm","srn","sro","srq","srr","srs","srt","sru","srv","srw","srx","sry","srz","ssa","ssb","ssc","ssd","sse","ssf","ssg","ssh","ssi","ssj","ssk","ssl","ssm","ssn","sso","ssp","ssq","ssr","sss","sst","ssu","ssv","ssx","ssy","ssz","sta","stb","std","ste","stf","stg","sth","sti","stj","stk","stl","stm","stn","sto","stp","stq","str","sts","stt","stu","stv","stw","sty","sua","sub","suc","sue","sug","sui","suj","suk","sul","sum","suo","suq","sur","sus","sut","suv","suw","sux","suy","suz","sva","svb","svc","sve","svk","svm","svr","svs","svx","swb","swc","swf","swg","swh","swi","swj","swk","swl","swm","swn","swo","swp","swq","swr","sws","swt","swu","swv","sww","swx","swy","sxb","sxc","sxe","sxg","sxk","sxl","sxm","sxn","sxo","sxr","sxs","sxu","sxw","sya","syb","syc","syd","syi","syk","syl","sym","syn","syo","syr","sys","syw","syx","syy","sza","szb","szc","szd","sze","szg","szl","szn","szp","szs","szv","szw","szy"],["ta","te","tg","th","ti","tk","tl","tn","to","tr","ts","tt","tw","ty","taa","tab","tac","tad","tae","taf","tag","tai","taj","tak","tal","tan","tao","tap","taq","tar","tas","tau","tav","taw","tax","tay","taz","tba","tbb","tbc","tbd","tbe","tbf","tbg","tbh","tbi","tbj","tbk","tbl","tbm","tbn","tbo","tbp","tbq","tbr","tbs","tbt","tbu","tbv","tbw","tbx","tby","tbz","tca","tcb","tcc","tcd","tce","tcf","tcg","tch","tci","tck","tcl","tcm","tcn","tco","tcp","tcq","tcs","tct","tcu","tcw","tcx","tcy","tcz","tda","tdb","tdc","tdd","tde","tdf","tdg","tdh","tdi","tdj","tdk","tdl","tdm","tdn","tdo","tdq","tdr","tds","tdt","tdu","tdv","tdx","tdy","tea","teb","tec","ted","tee","tef","teg","teh","tei","tek","tem","ten","teo","tep","teq","ter","tes","tet","teu","tev","tew","tex","tey","tez","tfi","tfn","tfo","tfr","tft","tga","tgb","tgc","tgd","tge","tgf","tgg","tgh","tgi","tgj","tgn","tgo","tgp","tgq","tgr","tgs","tgt","tgu","tgv","tgw","tgx","tgy","tgz","thc","thd","the","thf","thh","thi","thk","thl","thm","thn","thp","thq","thr","ths","tht","thu","thv","thw","thx","thy","thz","tia","tic","tid","tie","tif","tig","tih","tii","tij","tik","til","tim","tin","tio","tip","tiq","tis","tit","tiu","tiv","tiw","tix","tiy","tiz","tja","tjg","tji","tjj","tjl","tjm","tjn","tjo","tjp","tjs","tju","tjw","tka","tkb","tkd","tke","tkf","tkg","tkk","tkl","tkm","tkn","tkp","tkq","tkr","tks","tkt","tku","tkv","tkw","tkx","tkz","tla","tlb","tlc","tld","tlf","tlg","tlh","tli","tlj","tlk","tll","tlm","tln","tlo","tlp","tlq","tlr","tls","tlt","tlu","tlv","tlw","tlx","tly","tma","tmb","tmc","tmd","tme","tmf","tmg","tmh","tmi","tmj","tmk","tml","tmm","tmn","tmo","tmp","tmq","tmr","tms","tmt","tmu","tmv","tmw","tmy","tmz","tna","tnb","tnc","tnd","tne","tnf","tng","tnh","tni","tnk","tnl","tnm","tnn","tno","tnp","tnq","tnr","tns","tnt","tnu","tnv","tnw","tnx","tny","tnz","tob","toc","tod","toe","tof","tog","toh","toi","toj","tol","tom","too","top","toq","tor","tos","tou","tov","tow","tox","toy","toz","tpa","tpc","tpe","tpf","tpg","tpi","tpj","tpk","tpl","tpm","tpn","tpo","tpp","tpq","tpr","tpt","tpu","tpv","tpw","tpx","tpy","tpz","tqb","tql","tqm","tqn","tqo","tqp","tqq","tqr","tqt","tqu","tqw","tra","trb","trc","trd","tre","trf","trg","trh","tri","trj","trk","trl","trm","trn","tro","trp","trq","trr","trs","trt","tru","trv","trw","trx","try","trz","tsa","tsb","tsc","tsd","tse","tsf","tsg","tsh","tsi","tsj","tsk","tsl","tsm","tsp","tsq","tsr","tss","tst","tsu","tsv","tsw","tsx","tsy","tsz","tta","ttb","ttc","ttd","tte","ttf","ttg","tth","tti","ttj","ttk","ttl","ttm","ttn","tto","ttp","ttq","ttr","tts","ttt","ttu","ttv","ttw","tty","ttz","tua","tub","tuc","tud","tue","tuf","tug","tuh","tui","tuj","tul","tum","tun","tuo","tup","tuq","tus","tut","tuu","tuv","tuw","tux","tuy","tuz","tva","tvd","tve","tvk","tvl","tvm","tvn","tvo","tvs","tvt","tvu","tvw","tvx","tvy","twa","twb","twc","twd","twe","twf","twg","twh","twl","twm","twn","two","twp","twq","twr","twt","twu","tww","twx","twy","txa","txb","txc","txe","txg","txh","txi","txj","txm","txn","txo","txq","txr","txs","txt","txu","txx","txy","tya","tye","tyh","tyi","tyj","tyl","tyn","typ","tyr","tys","tyt","tyu","tyv","tyx","tyy","tyz","tza","tzh","tzj","tzl","tzm","tzn","tzo","tzx"],["ug","uk","ur","uz","uam","uan","uar","uba","ubi","ubl","ubr","ubu","uby","uda","ude","udg","udi","udj","udl","udm","udu","ues","ufi","uga","ugb","uge","ugn","ugo","ugy","uha","uhn","uis","uiv","uji","uka","ukg","ukh","uki","ukk","ukl","ukp","ukq","uks","uku","ukv","ukw","uky","ula","ulb","ulc","ule","ulf","uli","ulk","ull","ulm","uln","ulu","ulw","uma","umb","umc","umd","umg","umi","umm","umn","umo","ump","umr","ums","umu","una","und","une","ung","uni","unk","unm","unn","unp","unr","unu","unx","unz","uok","upi","upv","ura","urb","urc","ure","urf","urg","urh","uri","urj","urk","url","urm","urn","uro","urp","urr","urt","uru","urv","urw","urx","ury","urz","usa","ush","usi","usk","usp","uss","usu","uta","ute","uth","utp","utr","utu","uum","uun","uur","uuu","uve","uvh","uvl","uwa","uya","uzn","uzs"],["ve","vi","vo","vaa","vae","vaf","vag","vah","vai","vaj","val","vam","van","vao","vap","var","vas","vau","vav","vay","vbb","vbk","vec","ved","vel","vem","veo","vep","ver","vgr","vgt","vic","vid","vif","vig","vil","vin","vis","vit","viv","vka","vki","vkj","vkk","vkl","vkm","vkn","vko","vkp","vkt","vku","vkz","vlp","vls","vma","vmb","vmc","vmd","vme","vmf","vmg","vmh","vmi","vmj","vmk","vml","vmm","vmp","vmq","vmr","vms","vmu","vmv","vmw","vmx","vmy","vmz","vnk","vnm","vnp","vor","vot","vra","vro","vrs","vrt","vsi","vsl","vsv","vto","vum","vun","vut","vwa"],["wa","wo","waa","wab","wac","wad","wae","waf","wag","wah","wai","waj","wak","wal","wam","wan","wao","wap","waq","war","was","wat","wau","wav","waw","wax","way","waz","wba","wbb","wbe","wbf","wbh","wbi","wbj","wbk","wbl","wbm","wbp","wbq","wbr","wbs","wbt","wbv","wbw","wca","wci","wdd","wdg","wdj","wdk","wdu","wdy","wea","wec","wed","weg","weh","wei","wem","wen","weo","wep","wer","wes","wet","weu","wew","wfg","wga","wgb","wgg","wgi","wgo","wgu","wgw","wgy","wha","whg","whk","whu","wib","wic","wie","wif","wig","wih","wii","wij","wik","wil","wim","win","wir","wit","wiu","wiv","wiw","wiy","wja","wji","wka","wkb","wkd","wkl","wkr","wku","wkw","wky","wla","wlc","wle","wlg","wlh","wli","wlk","wll","wlm","wlo","wlr","wls","wlu","wlv","wlw","wlx","wly","wma","wmb","wmc","wmd","wme","wmg","wmh","wmi","wmm","wmn","wmo","wms","wmt","wmw","wmx","wnb","wnc","wnd","wne","wng","wni","wnk","wnm","wnn","wno","wnp","wnu","wnw","wny","woa","wob","woc","wod","woe","wof","wog","woi","wok","wom","won","woo","wor","wos","wow","woy","wpc","wra","wrb","wrd","wrg","wrh","wri","wrk","wrl","wrm","wrn","wro","wrp","wrr","wrs","wru","wrv","wrw","wrx","wry","wrz","wsa","wsg","wsi","wsk","wsr","wss","wsu","wsv","wtf","wth","wti","wtk","wtm","wtw","wua","wub","wud","wuh","wul","wum","wun","wur","wut","wuu","wuv","wux","wuy","wwa","wwb","wwo","wwr","www","wxa","wxw","wya","wyb","wyi","wym","wyr","wyy"],["xh","xaa","xab","xac","xad","xae","xag","xai","xaj","xak","xal","xam","xan","xao","xap","xaq","xar","xas","xat","xau","xav","xaw","xay","xba","xbb","xbc","xbd","xbe","xbg","xbi","xbj","xbm","xbn","xbo","xbp","xbr","xbw","xbx","xby","xcb","xcc","xce","xcg","xch","xcl","xcm","xcn","xco","xcr","xct","xcu","xcv","xcw","xcy","xda","xdc","xdk","xdm","xdo","xdy","xeb","xed","xeg","xel","xem","xep","xer","xes","xet","xeu","xfa","xga","xgb","xgd","xgf","xgg","xgi","xgl","xgm","xgn","xgr","xgu","xgw","xha","xhc","xhd","xhe","xhr","xht","xhu","xhv","xia","xib","xii","xil","xin","xip","xir","xis","xiv","xiy","xjb","xjt","xka","xkb","xkc","xkd","xke","xkf","xkg","xkh","xki","xkj","xkk","xkl","xkn","xko","xkp","xkq","xkr","xks","xkt","xku","xkv","xkw","xkx","xky","xkz","xla","xlb","xlc","xld","xle","xlg","xli","xln","xlo","xlp","xls","xlu","xly","xma","xmb","xmc","xmd","xme","xmf","xmg","xmh","xmj","xmk","xml","xmm","xmn","xmo","xmp","xmq","xmr","xms","xmt","xmu","xmv","xmw","xmx","xmy","xmz","xna","xnb","xnd","xng","xnh","xni","xnj","xnk","xnm","xnn","xno","xnq","xnr","xns","xnt","xnu","xny","xnz","xoc","xod","xog","xoi","xok","xom","xon","xoo","xop","xor","xow","xpa","xpb","xpc","xpd","xpe","xpf","xpg","xph","xpi","xpj","xpk","xpl","xpm","xpn","xpo","xpp","xpq","xpr","xps","xpt","xpu","xpv","xpw","xpx","xpy","xpz","xqa","xqt","xra","xrb","xrd","xre","xrg","xri","xrm","xrn","xrq","xrr","xrt","xru","xrw","xsa","xsb","xsc","xsd","xse","xsh","xsi","xsj","xsl","xsm","xsn","xso","xsp","xsq","xsr","xss","xsu","xsv","xsy","xta","xtb","xtc","xtd","xte","xtg","xth","xti","xtj","xtl","xtm","xtn","xto","xtp","xtq","xtr","xts","xtt","xtu","xtv","xtw","xty","xtz","xua","xub","xud","xug","xuj","xul","xum","xun","xuo","xup","xur","xut","xuu","xve","xvi","xvn","xvo","xvs","xwa","xwc","xwd","xwe","xwg","xwj","xwk","xwl","xwo","xwr","xwt","xww","xxb","xxk","xxm","xxr","xxt","xya","xyb","xyj","xyk","xyl","xyt","xyy","xzh","xzm","xzp"],["yi","yo","yaa","yab","yac","yad","yae","yaf","yag","yah","yai","yaj","yak","yal","yam","yan","yao","yap","yaq","yar","yas","yat","yau","yav","yaw","yax","yay","yaz","yba","ybb","ybd","ybe","ybh","ybi","ybj","ybk","ybl","ybm","ybn","ybo","ybx","yby","ych","ycl","ycn","ycp","yda","ydd","yde","ydg","ydk","yds","yea","yec","yee","yei","yej","yel","yen","yer","yes","yet","yeu","yev","yey","yga","ygi","ygl","ygm","ygp","ygr","ygs","ygu","ygw","yha","yhd","yhl","yhs","yia","yif","yig","yih","yii","yij","yik","yil","yim","yin","yip","yiq","yir","yis","yit","yiu","yiv","yix","yiy","yiz","yka","ykg","yki","ykk","ykl","ykm","ykn","yko","ykr","ykt","yku","yky","yla","ylb","yle","ylg","yli","yll","ylm","yln","ylo","ylr","ylu","yly","yma","ymb","ymc","ymd","yme","ymg","ymh","ymi","ymk","yml","ymm","ymn","ymo","ymp","ymq","ymr","yms","ymt","ymx","ymz","yna","ynd","yne","yng","ynh","ynk","ynl","ynn","yno","ynq","yns","ynu","yob","yog","yoi","yok","yol","yom","yon","yos","yot","yox","yoy","ypa","ypb","ypg","yph","ypk","ypm","ypn","ypo","ypp","ypz","yra","yrb","yre","yri","yrk","yrl","yrm","yrn","yro","yrs","yrw","yry","ysc","ysd","ysg","ysl","ysm","ysn","yso","ysp","ysr","yss","ysy","yta","ytl","ytp","ytw","yty","yua","yub","yuc","yud","yue","yuf","yug","yui","yuj","yuk","yul","yum","yun","yup","yuq","yur","yut","yuu","yuw","yux","yuy","yuz","yva","yvt","ywa","ywg","ywl","ywn","ywq","ywr","ywt","ywu","yww","yxa","yxg","yxl","yxm","yxu","yxy","yyr","yyu","yyz","yzg","yzk"],["za","zh","zu","zaa","zab","zac","zad","zae","zaf","zag","zah","zai","zaj","zak","zal","zam","zao","zap","zaq","zar","zas","zat","zau","zav","zaw","zax","zay","zaz","zba","zbc","zbe","zbl","zbt","zbu","zbw","zca","zch","zdj","zea","zeg","zeh","zen","zga","zgb","zgh","zgm","zgn","zgr","zhb","zhd","zhi","zhn","zhw","zhx","zia","zib","zik","zil","zim","zin","zir","ziw","ziz","zka","zkb","zkd","zkg","zkh","zkk","zkn","zko","zkp","zkr","zkt","zku","zkv","zkz","zla","zle","zlj","zlm","zln","zlq","zls","zlw","zma","zmb","zmc","zmd","zme","zmf","zmg","zmh","zmi","zmj","zmk","zml","zmm","zmn","zmo","zmp","zmq","zmr","zms","zmt","zmu","zmv","zmw","zmx","zmy","zmz","zna","znd","zne","zng","znk","zns","zoc","zoh","zom","zoo","zoq","zor","zos","zpa","zpb","zpc","zpd","zpe","zpf","zpg","zph","zpi","zpj","zpk","zpl","zpm","zpn","zpo","zpp","zpq","zpr","zps","zpt","zpu","zpv","zpw","zpx","zpy","zpz","zqe","zra","zrg","zrn","zro","zrp","zrs","zsa","zsk","zsl","zsm","zsr","zsu","zte","ztg","ztl","ztm","ztn","ztp","ztq","zts","ztt","ztu","ztx","zty","zua","zuh","zum","zun","zuy","zwa","zxx","zyb","zyg","zyj","zyn","zyp","zza","zzj"]],a=function(){function e(){}return e.isBcp47=function(e){return/^(([a-zA-Z]{2,3}(-[a-zA-Z](-[a-zA-Z]{3}){0,2})?|[a-zA-Z]{4}|[a-zA-Z]{5,8})(-[a-zA-Z]{4})?(-([a-zA-Z]{2}|[0-9]{3}))?(-([0-9a-zA-Z]{5,8}|[0-9][a-zA-Z]{3}))*(-[0-9a-wy-zA-WY-Z](-[a-zA-Z0-9]{2,8})+)*(-x(-[a-zA-Z0-9]{1,8})+)?|x(-[a-zA-Z0-9]{1,8})+|(en-GB-oed|i-ami|i-bnn|i-default|i-enochian|i-hak|i-klingon|i-lux|i-mingo|i-navajo|i-pwn|i-tao|i-tay|i-tsu|sgn-BE-FR|sgn-BE-NL|sgn-CH-DE|art-lojban|cel-gaulish|no-bok|no-nyn|zh-guoyu|zh-hakka|zh-min|zh-min-nan|zh-xiang))$/.test(e)},e.validPrimaryLang=function(e){var t=e.toLowerCase();return t.includes("-")&&(t=t.split("-")[0]),!!t.match(/[a-z]{2,3}/)&&(3===t.length&&"q"===t.charAt(0)&&t.charCodeAt(1)>=97&&t.charCodeAt(1)<=116&&t.charCodeAt(2)>=97&&t.charCodeAt(2),i[t.charCodeAt(0)-97].includes(t))},e.matchPrimaryLang=function(e,t){var i=e;i.includes("-")&&(i=i.split("-")[0]);var a=t;return a.includes("-")&&(a=a.split("-")[0]),i.toLowerCase()===a.toLowerCase()},e}();t.LangUtil=a},3103(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.CommonMapper=void 0;var a=i(3864),n=function(){function e(){this.hierarchyRole=null,this.hierarchyPath=null,this.hierarchyResults=null}return e.prototype.getBounds=function(e){return null},e.prototype.reset=function(e){this.hierarchyRole=[],this.hierarchyResults=[],this.hierarchyPath=[{rolePath:"",roleCount:{}}];for(var t=[],i=a.DOMWalker.parentNode(e);i&&9!=i.nodeType;)t.push(i),i=a.DOMWalker.parentNode(i);for(var n=0,l=t=t.reverse();n<l.length;n++){for(var r=l[n],o=[],s=r.previousSibling;s;)o.push(s),s=s.previousSibling;for(var u=0,d=o=o.reverse();u<d.length;u++){var c=d[u];this.pushHierarchy(c),this.popHierarchy()}this.pushHierarchy(r)}},e.prototype.pushHierarchy=function(e){var t=this.getRole(e)||null;if(this.hierarchyRole.push(t),null!==t){var i=this.hierarchyPath[this.hierarchyPath.length-1];i.roleCount[t]=(i.roleCount[t]||0)+1,this.hierarchyPath.push({rolePath:i.rolePath+"/"+t+"["+i.roleCount[t]+"]",roleCount:{}})}var a={};1===e.nodeType&&(a=this.getAttributes(e)),this.hierarchyResults.push({node:e,namespace:this.getNamespace(),role:t,attributes:a,rolePath:this.hierarchyPath[this.hierarchyPath.length-1].rolePath,bounds:this.getBounds(e)})},e.prototype.popHierarchy=function(){null!==this.hierarchyRole.pop()&&this.hierarchyPath.pop(),this.hierarchyResults.pop()},e.prototype.openScope=function(e){return null===this.hierarchyRole&&this.reset(e),this.pushHierarchy(e),this.hierarchyResults},e.prototype.closeScope=function(e){for(var t=[],i=0,a=this.hierarchyResults;i<a.length;i++){var n=a[i];t.push(n)}return t[t.length-1].role="/"+t[t.length-1].role,this.popHierarchy(),t},e}();t.CommonMapper=n},920(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.Context=t.PartInfo=t.AttrInfo=void 0;var i=function(){function e(e,t,i,a){if(this.inclusive=e,this.attr=t,this.eq=i,this.value=a,!e&&void 0!==i&&i.length>0)throw new Error("Cannot have !attr"+i+" context");if(e&&void 0!==i&&i.length>0&&(void 0===a||0===a.length))throw new Error("Cannot have equivalence check without a value")}return e.prototype.matches=function(e){var t=this,i=e.attributes;if(t.attr in i){if(t.inclusive){if(t.eq){var a=i[t.attr];if("="===t.eq)return t.value===a;if("!="===t.eq)return t.value!==a;if("~"===t.eq)return t.value===a;if("!~"===t.eq)return t.value!==a;throw new Error("Context equivalence operator not supported")}return!0}return!1}return!t.inclusive},e}();t.AttrInfo=i;var a=function(){function e(e,t,i,a,n){if(this.inclusive=e,this.namespace=t,this.role=i,this.attrs=a,this.connector=n,"*"===i&&!e)throw new Error("!* context not supported")}return e.prototype.matches=function(e,t){var i=this,a=i.namespace in e&&e[i.namespace][t]&&(e[i.namespace][t].role===i.role||"none"!==e[i.namespace][t].role&&"*"===i.role);if(!a||"*"!==i.role||"dom"!==i.namespace||"#text"!==e[i.namespace][t].role&&"/#text"!==e[i.namespace][t].role||(a=!1),i.inclusive&&!a)return!1;if(!i.inclusive&&!a)return!0;for(var n=i.attrs,l=e[i.namespace][t],r=!0,o=0,s=n;o<s.length;o++){var u=s[o];r=r&&u.matches(l)}return i.inclusive||(r=!r),r},e}();t.PartInfo=a;var n=function(){function e(e){this.contextInfo=[];for(var t=[],n=0,l=e.match(/!?[/a-zA-Z:0-9*\-_]+(\[[^\]]+\])*[ >+~]?/g);n<l.length;n++){for(var r=l[n].match(/(!?)([/a-zA-Z:0-9*\-_]+)((\[[^\]]+\])*)([ >+~]?)/),o=[],s=0,u=r[3].match(/\[([^\]]+)\]/g)||[];s<u.length;s++){var d=u[s].match(/\[(!?)([a-z:A-Z*\-_]+)(!?[=~])?([^\]]+)?\]/);o.push(new i("!"!==d[1],d[2].toLowerCase(),d[3],d[4]))}r[2]=r[2].toLowerCase();var c=r[2].split(":"),m="!"!==r[1],p=c.shift(),h=c.join(":"),g=new a(m,p,h,o,r[r.length-1]);t.push(g)}this.contextInfo=t}return e.cleanContext=function(e){return(e=(e=(e=(e=(e=e.toLowerCase().trim()).replace(/ +!/g," !")).replace(/ +([>+~,])/g,"$1")).replace(/([>+~,]) +/g,"$1")).replace(/ +/g," ")).trim()},e.parse=function(t){for(var i=e.splitMultiple(e.cleanContext(t)),a=[],n=0;n<i.length;++n){var l=new e(i[n]);a.push(l)}return a},e.splitMultiple=function(e){var t=[];if(e)if(-1===e.indexOf(","))t.push(e);else for(var i=0,a=e.split(",");i<a.length;i++){var n=a[i];t.push(n)}return t},e}();t.Context=n},7301(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.Engine=void 0;var a=i(3864),n=i(920),l=i(4516),r=i(7507),o=i(1686),s=i(4566),u=i(461),d=i(3946),c=function(){function e(e,t){this.rule=e,this.parsedInfo=t,this.ns=this.parsedInfo.contextInfo[this.parsedInfo.contextInfo.length-1].namespace,l.Config.DEBUG&&console.log("Added Rule:",e.id,JSON.stringify(this.parsedInfo))}return e.convertNodeToSnippet=function(e){var t="";t+="<"+e.nodeName.toLowerCase();var i=e.attributes;if(null!=i)for(var a=i.length-1;a>=0;a--)"data-namewalk"!==i[a].name&&(t+=" "+i[a].name+'="'+i[a].value+'"');return t+">"},e.convertNodeToSource=function(e,t){if(void 0===t&&(t=!1),!t||!e)return null;var i="ibm-a11y-debug",n=function(e){return e&&"end"!==e.toLowerCase()?{found:!0,stop:!1,source:e}:{found:!0,stop:!0}},l=function(e){if(!e)return{found:!1};var t=null;if(e.nodeType===Node.COMMENT_NODE)t=e.nodeValue;else if(e.nodeType===Node.ELEMENT_NODE)for(var a=e.firstChild;a;){if(a.nodeType!==Node.TEXT_NODE){if(a.nodeType===Node.COMMENT_NODE){t=a.nodeValue;break}break}if(a.nodeValue&&a.nodeValue.trim().length>0)break;a=a.nextSibling}if(null!==t){var l=t.trim();if(l===i||l.startsWith(i+":")||l.startsWith(i+" ")||l.startsWith(i+"\t")){var r=l.substring(14).trimStart(),o=r.startsWith(":")?r.substring(1).trim():r.trim();return n(o)}}return{found:!1}},r=function(e){if(e.nodeType!==Node.ELEMENT_NODE)return{found:!1};var t=e.getAttribute(i);return null===t?{found:!1}:n(t.trim())},o=r(e);return o.found?o.stop?null:o.source:function(e){for(var t=e;t;){for(var i=a.DOMWalker.previousSiblingNotOwnedBySlot(t);i;){var n=l(i);if(n.found)return n.stop?null:n.source;i=a.DOMWalker.previousSiblingNotOwnedBySlot(i)}var o=a.DOMWalker.parentNode(t);if(!o||o.nodeType===Node.DOCUMENT_NODE)return null;var s=r(o);if(s.found)return s.stop?null:s.source;t=o}return null}(e)},e.prototype.run=function(t,i,a,n){var l,r=(new Date).getTime();try{l=this.rule.run(i,a,n)}catch(e){var o=e;throw console.error("RULE EXCEPTION:",this.rule.id,i.dom.rolePath,o.stack),e}var s=(new Date).getTime();l||(l=[]),l instanceof Array||(l=[l]);for(var u=[],d=0,c=l;d<c.length;d++){var m=c[d],p=t.getMessage(this.rule.id,m.reasonId,m.messageArgs),h={};for(var g in i)h[g]=i[g].rolePath;var b=this.rule.id.replace(/^(.*)\$\$\d+$/,"$1");u.push({ruleId:b,value:m.value,node:i.dom.node,path:h,ruleTime:s-r,reasonId:m.reasonId,message:p,messageArgs:m.messageArgs,apiArgs:m.apiArgs,bounds:i.dom.bounds,snippet:e.convertNodeToSnippet(i.dom.node),source:e.convertNodeToSource(i.dom.node,t.isSourceMapEnabled())})}return u},e}(),m=function(){function e(){this.mappers={},this.ruleMap={},this.wrappedRuleMap={},this.nlsMap={},this.helpMap={},this.sourceMapEnabled=!1,this.inclRules={},this.exclRules={},this.addMapper(new r.DOMMapper)}return e.getLanguages=function(){var e="undefined"!=typeof process&&void 0===process.nodeType&&process.env,t="en-US";return e&&(t=(t=e.LANG||e.LANGUAGE||e.LC_ALL||e.LC_MESSAGES)&&t.length>0?t.split(".")[0].replace(/_/g,"-"):"en-US"),"undefined"!=typeof navigator&&navigator.languages||[t]},e.prototype.run=function(e,t){if(null===e)return Promise.reject("null document");9===e.nodeType&&(e=e.documentElement),e.ownerDocument&&(e.ownerDocument.PT_CHECK_HIDDEN_CONTENT=!1);var i=s.CacheUtil.clearCaches(e),n=new a.DOMWalker(e,!1,e,!0),l={results:[],numExecuted:0,ruleTime:0,totalTime:0},r=(new Date).getTime();for(var c in this.mappers)this.mappers[c].reset(e);var m=0,p=-1;do{m++;var h=Math.floor(m/i*100);h>p&&(i>1e4&&console.log("Progress: ".concat(h,"% (").concat(m,"/").concat(i," nodes)")),p=h);var g={};for(var c in this.mappers)n.bEndTag?g[c]=this.mappers[c].closeScope(n.node):g[c]=this.mappers[c].openScope(n.node);if(11!==n.node.nodeType&&(d.VisUtil.isNodeVisible(n.node)||"meta"===n.node.nodeName.toLowerCase()||"style"===n.node.nodeName.toLowerCase()||"datalist"===n.node.nodeName.toLowerCase()||"param"===n.node.nodeName.toLowerCase()||!o.DOMUtil.getAncestor(n.node,["body"]))){var b={};for(var _ in g){var f=g[_],v=f[f.length-1];b[_]=v}for(var A={},w=0,y=this.getMatchingRules(g);w<y.length;w++){for(var C=y[w],k=!0,R=0,x=C.rule.dependencies||[];R<x.length;R++)A[x[R]]||(k=!1);if(k){var P=[];(new Date).getTime();try{P=C.run(this,b,t,g)}catch(e){}0===P.length&&(A[C.rule.id]=!0);for(var T=0,U=P;T<U.length;T++){var I=U[T];l.results.push(I),l.ruleTime+=I.ruleTime,l.numExecuted++,I.value[1]===u.eRuleConfidence.PASS&&(A[I.ruleId]=!0)}}}}}while(n.nextNode());return s.CacheUtil.clearCaches(e),l.totalTime=(new Date).getTime()-r,Promise.resolve(l)},e.prototype.enableRules=function(e){for(var t in this.ruleMap)this.ruleMap[t].enabled=!1;for(var i=0,a=e||[];i<a.length;i++)(t=a[i])in this.ruleMap?this.ruleMap[t].enabled=!0:console.warn("WARNING: Rule Id",t,"could not be enabled.")},e.prototype.getRule=function(e){return this.ruleMap[e]},e.prototype.getRulesIds=function(){var e=[];for(var t in this.ruleMap)e.push(t);return e},e.prototype.addRules=function(e){for(var t=0,i=e;t<i.length;t++){var a=i[t];this.addRule(a,!0)}this._sortRules()},e.prototype.addRule=function(e,t){var i=n.Context.parse(e.context),a=0,l=e.id;if(l in this.ruleMap)console.log("WARNING: Rule",l,"already added to engine. Ignoring...");else{this.ruleMap[l]=e;for(var r=0,o=i;r<o.length;r++){var s=o[r],u=l;a>=1&&(u=l+"$$"+a),++a;var d=new c(e,s);this.wrappedRuleMap[u]=d;var m=d.parsedInfo.contextInfo,p=m[m.length-1],h=p.namespace+":"+p.role;p.inclusive?(this.inclRules[h]=this.inclRules[h]||[],this.inclRules[h].push(d)):(this.exclRules[h]=this.exclRules[h]||[],this.exclRules[h].push(d))}t||this._sortRules()}},e.prototype.enableSourceMap=function(e){this.sourceMapEnabled=e},e.prototype.isSourceMapEnabled=function(){return this.sourceMapEnabled},e.prototype._sortRules=function(){for(var e in this.inclRules)this.inclRules[e].sort(function(e,t){var i=e.rule.dependencies&&e.rule.dependencies.length>0;return t.rule.dependencies&&t.rule.dependencies.length>0&&t.rule.dependencies.includes(e.rule.id)?-1:i&&e.rule.dependencies.includes(t.rule.id)?1:0});for(var e in this.exclRules)this.exclRules[e].sort(function(e,t){var i=e.rule.dependencies&&e.rule.dependencies.length>0;return t.rule.dependencies&&t.rule.dependencies.length>0&&t.rule.dependencies.includes(e.rule.id)?-1:i&&e.rule.dependencies.includes(t.rule.id)?1:0})},e.prototype.addNlsMap=function(e){for(var t in e)this.nlsMap[t]=e[t]},e.prototype.addHelpMap=function(e){for(var t in e)this.helpMap[t]=e[t]},e.prototype.getMessage=function(e,t,i){var a=e.indexOf("$$");if(a>=0&&(e=e.substring(0,a)),!(e in this.nlsMap))return e;var n=this.nlsMap[e][t||0];return n?n.replace(/\{(\d+)\}/g,function(e,t,a){return i[t]}):e+"_"+t},e.prototype.getHelp=function(e,t,i){return i||(i="latest"),"".concat(l.Config.helpRoot,"/").concat(i,"/doc").concat(this.getHelpRel(e,t))},e.prototype.getHelpRel=function(e,t){var i=e.indexOf("$$");return i>=0&&(e=e.substring(0,i)),e in this.helpMap?((t=t||0)in this.helpMap[e]?this.helpMap[e][t||0]:this.helpMap[e][0])||e+"_"+t:e},e.prototype.addMapper=function(e){this.mappers[e.getNamespace()]=e},e.match=function(e,t){var i=e.parsedInfo.contextInfo,a=i.length-1,n=i[a].namespace,l=t[n][t[n].length-1],r=l.node;if(!i[a].matches(t,t[n].length-1))return!1;if(1===i.length)return!0;if(l=t[n=i[0].namespace][t[n].length-1],--a,i.slice(0,i.length-1).some(function(e){return e.namespace!==n}))return console.error("[ERROR] Rule ".concat(e.rule.id," has inconsitent parent namespaces")),!1;for(var o=t[n].length-(l.node.isSameNode(r)?2:1);o>=0&&a>=0;){var s=i[a],u=i[a].matches(t,o);if(">"===s.connector){if(!u)return!1;--a,--o}else{if(" "!==s.connector)throw new Error("Context connector "+s.connector+" is not supported");if(s.inclusive)u&&--a,--o;else{if(!u)return!1;for(var d=!1,c=o-1;!d&&c>=0;--c)d=!i[a].matches(t,c);if(d)return!1;--a}}}return-1===a},e.prototype.getMatchingRules=function(t){var i=[];function a(a){for(var n=0,l=a;n<l.length;n++){var r=l[n];r.rule.enabled&&e.match(r,t)&&i.push(r)}}for(var n in t){var l=n+":"+(t[n].length>0?t[n][t[n].length-1].role:"none");for(var r in l in this.inclRules&&a(this.inclRules[l]),this.exclRules)r!==l&&a(this.exclRules[r]);l!==n+":none"&&(l.startsWith(n+":/")?n+":/*"in this.inclRules&&a(this.inclRules[n+":/*"]):n+":*"in this.inclRules&&a(this.inclRules[n+":*"]))}return this.sortDeps(i)},e.prototype.sortDeps=function(e){for(var t=[],i=0,a=e;i<a.length;i++){var n=a[i];t.push(n)}var l=[],r={},o=!1;do{o=!1;for(var s=0;s<t.length;++s){var u=t[s];if(!(u.rule.id in r)){var d=!0;if(u.rule.dependencies&&u.rule.dependencies.length>0)for(var c=0,m=u.rule.dependencies;c<m.length;c++)m[c]in r||(d=!1);d&&(o=!0,l.push(u),r[u.rule.id]=!0,t.splice(s--,1))}}}while(o);return l},e}();t.Engine=m},4516(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.Config=void 0;var i=function(){function e(){}return e.DEBUG=!1,e.helpRoot="https://able.ibm.com/rules/archives",e}();t.Config=i},7507(e,t,i){var a,n=this&&this.__extends||(a=function(e,t){return a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var i in t)Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i])},a(e,t)},function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function i(){this.constructor=e}a(e,t),e.prototype=null===t?Object.create(t):(i.prototype=t.prototype,new i)});Object.defineProperty(t,"__esModule",{value:!0}),t.DOMMapper=void 0;var l=i(3103),r=i(4566),o=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.getRole=function(e){return e.nodeName.toLowerCase()},t.prototype.getNamespace=function(){return"dom"},t.prototype.getAttributes=function(e){var t={};if(1===e.nodeType)for(var i=e,a=0;a<i.attributes.length;++a){var n=i.attributes[a];t[n.name.toLowerCase()]=n.nodeValue}return t},t.prototype.getBounds=function(e){if(1!==e.nodeType)return null;var t=r.CacheUtil.getCache(e,"DOMMapper_Bounds",void 0);if(void 0!==t)return t;var i=1;e.ownerDocument&&e.ownerDocument.defaultView&&e.ownerDocument.defaultView.devicePixelRatio&&(i=e.ownerDocument.defaultView.devicePixelRatio);var a=e.getBoundingClientRect();if(a){var n=e&&e.ownerDocument&&e.ownerDocument.defaultView&&e.ownerDocument.defaultView.scrollX||0,l=e&&e.ownerDocument&&e.ownerDocument.defaultView&&e.ownerDocument.defaultView.scrollY||0,o={left:Math.ceil((a.left+n)*i),top:Math.ceil((a.top+l)*i),height:Math.ceil(a.height*i),width:Math.ceil(a.width*i)};return r.CacheUtil.setCache(e,"DOMMapper_Bounds",o),o}return null},t.prototype.getUnadjustedBounds=function(e){if(1!==e.nodeType)return null;var t=r.CacheUtil.getCache(e,"DOMMapper_UnadjustedBounds",void 0);if(void 0!==t)return t;var i=e.getBoundingClientRect();if(i){var a=e&&e.ownerDocument&&e.ownerDocument.defaultView&&e.ownerDocument.defaultView.scrollX||0,n=e&&e.ownerDocument&&e.ownerDocument.defaultView&&e.ownerDocument.defaultView.scrollY||0,l={left:Math.ceil(i.left+a),top:Math.ceil(i.top+n),height:Math.ceil(i.height),width:Math.ceil(i.width)};return r.CacheUtil.setCache(e,"DOMMapper_UnadjustedBounds",l),l}return null},t}(l.CommonMapper);t.DOMMapper=o},1686(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.DOMUtil=void 0;var a=i(3864),n=function(){function e(){}return e.hasParent=function(e,t){for(var i=a.DOMWalker.parentElement(e);i&&!t.includes(i.nodeName);)i=a.DOMWalker.parentElement(i);return!!i},e.getAncestor=function(e,t){for(var i=a.DOMWalker.parentElement(e);i&&!t.includes(i.nodeName.toLowerCase());)i=a.DOMWalker.parentElement(i);return i},e.sameNode=function(e,t){return e===t||(e.isSameNode?e.isSameNode(t):!e.compareDocumentPosition||0===e.compareDocumentPosition(t))},e.cleanWhitespace=function(e){return e.replace(/[ \t\r\n]/g," ").replace(/ +/g," ")},e.cleanSpace=function(e){return e.replace(/ +/g," ")},e.isInSameTable=function(t,i){if(t&&i){var a=["table"],n=e.getAncestor(t,a),l=e.getAncestor(i,a);if(null!==n&&null!=l&&e.sameNode(n,l))return!0}return!1},e.shadowRootNode=function(e){for(var t=e;null!=t&&11!==t.nodeType;)t=t.parentNode;return t},e.objectCopyWithNodeRefs=function(e){if(!e)return e;if("object"!=typeof e)return"function"==typeof e?e:JSON.parse(JSON.stringify(e));if(e instanceof Node||e.nodeType)return e;var t=void 0;if("Array"===e.constructor.name){t=[];for(var i=0,a=e;i<a.length;i++){var n=a[i];t.push(this.objectCopyWithNodeRefs(n))}}else for(var l in t={},e)t[l]=this.objectCopyWithNodeRefs(e[l]);return t},e.getAncestorWithAttribute=function(e,t,i){for(var n=a.DOMWalker.parentNode(e);null!==n;){if(1===n.nodeType&&n.getAttribute(t)===i)return n;n=a.DOMWalker.parentNode(n)}return null},e}();t.DOMUtil=n},3864(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.DOMWalker=void 0;var a=i(3946),n=function(){function e(e,t,i,a,n){this.DEBUGIDX=0,this.indent=0,this.DEBUG=!!n,this.root=i||(e&&e.ownerDocument?e.ownerDocument.documentElement:e),9===this.root.nodeType&&(this.root=this.root.documentElement),this.node=e,9===this.node.nodeType&&(this.node=this.node.documentElement),this.bEndTag=null!=t&&1==t,this.considerHidden=a||!1}return e.prototype.elem=function(){return 1===this.node.nodeType&&this.node||null},e.parentNode=function(e){if(null===e)return null;var t=e.parentNode;return e.slotOwner?t=e.slotOwner:e.ownerElement?t=e.ownerElement:t&&11===t.nodeType&&(t=t.host?t.host:null),t},e.parentElement=function(t){var i=t;do{i=e.parentNode(i)}while(i&&1!==i.nodeType);return i},e.assignSlots=function(e){for(var t=e.querySelectorAll("slot"),i=0;i<t.length;++i)for(var a=t[i],n=a.assignedNodes(),l=0;l<n.length;++l)n[l].slotOwner=a,n[l].slotIndex=l},e.firstChildNotOwnedBySlot=function(e){for(var t=e.firstChild;t&&t.slotOwner;)t=t.nextSibling;return t},e.lastChildNotOwnedBySlot=function(e){for(var t=e.lastChild;t&&t.slotOwner;)t=t.previousSibling;return t},e.nextSiblingNotOwnedBySlot=function(e){for(var t=e.nextSibling;t&&t.slotOwner;)t=t.nextSibling;return t},e.previousSiblingNotOwnedBySlot=function(e){for(var t=e.previousSibling;t&&t.slotOwner;)t=t.previousSibling;return t},e.prototype.atRoot=function(){return!this.node.ownerElement&&(this.root===this.node||(this.root.isSameNode?this.root.isSameNode(this.node):this.root.compareDocumentPosition?0===this.root.compareDocumentPosition(this.node):null===this.node.parentNode))},e.prototype.nextNode=function(){var t=this,i=function(){for(var e="",i=0;i<t.indent;++i)e+=" ";return e},n=this.node.nodeName;if(!this.node)return this.bEndTag=!1,!1;do{if(this.bEndTag){if(this.atRoot())return!1;if(this.node.slotOwner){var l=this.node.slotOwner,r=this.node.slotIndex+1;r<l.assignedNodes().length?(this.node=l.assignedNodes()[r],this.bEndTag=!1):(this.node=l,this.bEndTag=!0)}else if(this.node.ownerElement)this.node=this.node.ownerElement,this.bEndTag=!0;else if(e.nextSiblingNotOwnedBySlot(this.node))this.node=e.nextSiblingNotOwnedBySlot(this.node),this.bEndTag=!1;else{if(!this.node.parentNode)return!1;this.node=this.node.parentNode,this.bEndTag=!0}}else{var o=this.node,s=this.node,u=this.node;if(1===this.node.nodeType&&"IFRAME"===this.node.nodeName.toUpperCase()&&(!this.considerHidden||a.VisUtil.isNodeVisible(o))&&o.contentDocument&&o.contentDocument.documentElement){var d=this.node;this.node=o.contentDocument.documentElement,this.node.ownerElement=d}else 1===this.node.nodeType&&(!this.considerHidden||a.VisUtil.isNodeVisible(s))&&s.shadowRoot&&s.shadowRoot.firstChild?(d=this.node,this.node=s.shadowRoot,this.node.ownerElement=d,e.assignSlots(this.node)):1===this.node.nodeType&&"slot"===s.nodeName.toLowerCase()&&u.assignedNodes().length>0?this.node=u.assignedNodes()[0]:1!==this.node.nodeType&&11!==this.node.nodeType||!e.firstChildNotOwnedBySlot(this.node)?this.bEndTag=!0:this.node=e.firstChildNotOwnedBySlot(this.node)}}while(1!==this.node.nodeType&&11!==this.node.nodeType&&3!==this.node.nodeType||1===this.node.nodeType&&"ACE"===this.node.getAttribute("aChecker"));return this.bEndTag&&(this.indent-=2),this.DEBUG&&console.log(i()+"<".concat(this.bEndTag?"/":"").concat(this.node.nodeName,"> (from ").concat(n,") ").concat(this.DEBUGIDX++)),this.DEBUG&&this.node.slotOwner&&console.log(i()+"slotOwner: ".concat(this.node.slotOwner.nodeName)),this.DEBUG&&this.node.slotIndex&&console.log(i()+"slotIndex: ".concat(this.node.slotIndex)),this.DEBUG&&this.node.ownerElement&&console.log(i()+"ownerElement: ".concat(this.node.ownerElement.nodeName)),this.bEndTag||(this.indent+=2),!0},e.prototype.prevNode=function(){do{if(this.bEndTag){var t=this.node,i=this.node;if(1===this.node.nodeType&&"IFRAME"===this.node.nodeName.toUpperCase()&&(!this.considerHidden||a.VisUtil.isNodeVisible(t))&&t.contentDocument&&t.contentDocument.documentElement){var n=this.node;this.node=t.contentDocument.documentElement,this.node.ownerElement=n}else if(1===this.node.nodeType&&(!this.considerHidden||a.VisUtil.isNodeVisible(i))&&i.shadowRoot&&i.shadowRoot.lastChild)n=this.node,this.node=i.shadowRoot,this.node.ownerElement=n,e.assignSlots(this.node);else if(1===this.node.nodeType&&"slot"===i.nodeName.toLowerCase()&&i.assignedNodes().length>0){var l=i;this.node=l.assignedNodes()[l.assignedNodes().length-1]}else 1!==this.node.nodeType&&11!==this.node.nodeType||!e.lastChildNotOwnedBySlot(this.node)?this.bEndTag=!1:this.node=e.lastChildNotOwnedBySlot(this.node)}else{if(this.atRoot())return!1;if(this.node.slotOwner){var r=this.node.slotOwner,o=this.node.slotIndex-1;o>=0?(this.node=r.assignedNodes()[o],this.bEndTag=!0):(this.node=r,this.bEndTag=!1)}else if(e.previousSiblingNotOwnedBySlot(this.node))this.node=e.previousSiblingNotOwnedBySlot(this.node),this.bEndTag=!0;else if(this.node.ownerElement)this.node=this.node.ownerElement,this.bEndTag=!1;else{if(!this.node.parentNode)return!1;this.node=this.node.parentNode,this.bEndTag=!1}}}while(1!==this.node.nodeType&&11!==this.node.nodeType&&3!==this.node.nodeType||1===this.node.nodeType&&"ACE"===this.node.getAttribute("aChecker"));return!0},e}();t.DOMWalker=n},8601(e,t){var i,a,n;Object.defineProperty(t,"__esModule",{value:!0}),t.eGuidelineType=t.eGuidelineCategory=t.eToolkitLevel=void 0,(n=t.eToolkitLevel||(t.eToolkitLevel={})).LEVEL_ONE="1",n.LEVEL_TWO="2",n.LEVEL_THREE="3",n.LEVEL_FOUR="4",(a=t.eGuidelineCategory||(t.eGuidelineCategory={})).ACCESSIBILITY="Accessibility",a.DESIGN="Design",a.OTHER="Other",(i=t.eGuidelineType||(t.eGuidelineType={})).DEFAULT="default",i.EXTENSION="extension"},461(e,t,i){var a,n;Object.defineProperty(t,"__esModule",{value:!0}),t.eRulesetType=t.eRuleCategory=t.eToolkitLevel=t.RuleManual=t.RulePotential=t.RuleFail=t.RuleRender=t.RulePass=t.eRulePolicy=t.eRuleConfidence=void 0,function(e){e.PASS="PASS",e.FAIL="FAIL",e.POTENTIAL="POTENTIAL",e.MANUAL="MANUAL"}(a=t.eRuleConfidence||(t.eRuleConfidence={})),function(e){e.VIOLATION="VIOLATION",e.RECOMMENDATION="RECOMMENDATION",e.INFORMATION="INFORMATION"}(n=t.eRulePolicy||(t.eRulePolicy={})),t.RulePass=function(e,t,i){if(null==e)throw new Error("Reason ID must be defined");return{value:[n.INFORMATION,a.PASS],reasonId:e,messageArgs:t||[],apiArgs:i||[]}},t.RuleRender=function(e,t,i){if(null==e)throw new Error("Reason ID must be defined");return{value:[n.INFORMATION,a.PASS],reasonId:0,messageArgs:t||[],apiArgs:i||[]}},t.RuleFail=function(e,t,i){if(null==e)throw new Error("Reason ID must be defined");return{value:[n.INFORMATION,a.FAIL],reasonId:e,messageArgs:t||[],apiArgs:i||[]}},t.RulePotential=function(e,t,i){if(null==e)throw new Error("Reason ID must be defined");return{value:[n.INFORMATION,a.POTENTIAL],reasonId:e,messageArgs:t||[],apiArgs:i||[]}},t.RuleManual=function(e,t,i){if(null==e)throw new Error("Reason ID must be defined");return{value:[n.INFORMATION,a.MANUAL],reasonId:e,messageArgs:t||[],apiArgs:i||[]}};var l=i(8601);Object.defineProperty(t,"eToolkitLevel",{enumerable:!0,get:function(){return l.eToolkitLevel}});var r=i(8601);Object.defineProperty(t,"eRuleCategory",{enumerable:!0,get:function(){return r.eGuidelineCategory}});var o=i(8601);Object.defineProperty(t,"eRulesetType",{enumerable:!0,get:function(){return o.eGuidelineType}})},7412(e,t,i){var a=this&&this.__createBinding||(Object.create?function(e,t,i,a){void 0===a&&(a=i);var n=Object.getOwnPropertyDescriptor(t,i);n&&!("get"in n?!t.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,a,n)}:function(e,t,i,a){void 0===a&&(a=i),e[a]=t[i]}),n=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),l=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&a(t,e,i);return n(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.Checker=void 0;var r=i(461),o=i(7301),s=i(9955),u=i(6160),d=l(i(591)),c=i(8601),m=[],p={},h={};!function(){var e=JSON.parse(JSON.stringify(o.Engine.getLanguages()));for(var t in e.push("en-US"),d){var i=d[t];m.push(i);for(var a=e.length-1;a>=0;--a){var n=e[a];if(n in i.messages&&(p[i.id]=i.messages[n],p[i.id][0]=p[i.id].group),n in i.help){for(var l in h[i.id]={},i.help[n])h[i.id][l]="/".concat(n,"/").concat(i.help[n][l]);p[i.id][0]=p[i.id].group}}for(var r=0,s=i.rulesets;r<s.length;r++)for(var c=s[r],g=0,b=u.a11yRulesets;g<b.length;g++){var _=b[g];if(("string"==typeof c.id?[c.id]:c.id).includes(_.id))for(var f=0,v=_.checkpoints;f<v.length;f++){var A=v[f];("string"==typeof c.num?[c.num]:c.num).includes(A.num)&&(A.rules=A.rules||[],A.rules.push({id:i.id,reasonCodes:c.reasonCodes,level:c.level,toolkitLevel:c.toolkitLevel}))}}}}();var g=function(){function e(){this.guidelines=[],this.rulesets=this.guidelines,this.rulesetIds=[],this.rulesetRules={},this.ruleLevels={},this.ruleReasonLevels={},this.ruleCategory={};var e=this.engine=new o.Engine;e.addMapper(new s.ARIAMapper),e.addRules(m),e.addNlsMap(p),e.addHelpMap(h);for(var t=0,i=u.a11yRulesets;t<i.length;t++){var a=i[t];this.addRuleset(a)}}return e.prototype.addGuideline=function(e){e.id in this.rulesetRules&&this.removeGuideline(e.id),this.guidelines.push(e),this.rulesetIds.push(e.id);for(var t=[],i=0,a=e.checkpoints;i<a.length;i++){var n=a[i];n.rules=n.rules||[];for(var l=0,r=n.rules;l<r.length;l++){var o=r[l];if(!1!==o.enabled){t.push(o.id),this.ruleReasonLevels[o.id]=this.ruleReasonLevels[o.id]||{},this.ruleReasonLevels[o.id][e.id]=this.ruleReasonLevels[o.id][e.id]||{};var s=o.reasonCodes?o.reasonCodes.join("--"):"None";this.ruleReasonLevels[o.id][e.id][s]=o.level,this.ruleCategory[o.id]=this.ruleCategory[o.id]||{},this.ruleCategory[o.id][e.id]=e.category}}}this.rulesetRules[e.id]=t},e.prototype.enableRule=function(e){for(var t=0,i=this.getGuidelines();t<i.length;t++){for(var a=i[t],n=!1,l=0,r=a.checkpoints;l<r.length;l++)for(var o=0,s=r[l].rules;o<s.length;o++){var u=s[o];!1===u.enabled&&(n=!0,delete u.enabled)}n&&this.addGuideline(a)}},e.prototype.disableRule=function(e){for(var t=0,i=this.getGuidelines();t<i.length;t++){for(var a=i[t],n=!1,l=0,r=a.checkpoints;l<r.length;l++)for(var o=0,s=r[l].rules;o<s.length;o++){var u=s[o];!1!==u.enabled&&(n=!0,u.enabled=!1)}n&&this.addGuideline(a)}},e.prototype.removeGuideline=function(e){e in this.rulesetRules&&(delete this.rulesetRules[e],this.rulesets=this.guidelines=this.guidelines.filter(function(t){return t.id!==e}),this.rulesetIds=this.getGuidelineIds())},e.prototype.getGuidelines=function(){return JSON.parse(JSON.stringify(this.guidelines))},e.prototype.getGuidelineIds=function(){return this.guidelines.map(function(e){return e.id})},e.prototype.addRuleset=function(e){this.addGuideline(e)},e.prototype.enableSourceMap=function(e){this.engine.enableSourceMap(e)},e.prototype.isSourceMapEnabled=function(){return this.engine.isSourceMapEnabled()},e.prototype.check=function(e,t){var i=[];if(t){"string"==typeof t&&(t=[t]);for(var a=0,n=t;a<n.length;a++){var l=n[a];l in this.rulesetRules&&(i=i.concat(this.rulesetRules[l]))}}else i=this.engine.getRulesIds();this.engine.enableRules(i);var r=this;return this.engine.run(e).then(function(e){e.nls={};for(var i=0,a=e.results;i<a.length;i++){var n=a[i];n.ruleId in p&&(e.nls[n.ruleId]=e.nls[n.ruleId]||{0:p[n.ruleId][0]},n.reasonId in p[n.ruleId]&&(e.nls[n.ruleId][n.reasonId]=p[n.ruleId][n.reasonId]));var l=n.reasonId?n.reasonId:"None";n.value[0]=r.getReasonLevel(t,n.ruleId,l),n.category=r.getCategory(t,n.ruleId),delete n.path.css}return e})},e.prototype.getLevel=function(e,t){if(!e)return r.eRulePolicy.INFORMATION;var i=this.ruleLevels[t],a=null;if(e){if(!(t in this.ruleLevels))throw new Error("Rule triggered for which we have no rule level information: "+t);for(var n=0,l=e;n<l.length;n++){var o=l[n];o in i&&(i[o]===r.eRulePolicy.VIOLATION?a=r.eRulePolicy.VIOLATION:i[o]===r.eRulePolicy.RECOMMENDATION&&null===a?a=r.eRulePolicy.RECOMMENDATION:null===a&&(a=r.eRulePolicy.INFORMATION))}}if(null===a)throw new Error("Rule triggered for which we have no rule level information: "+t);return a},e.prototype.getReasonLevel=function(e,t,i){if(!e)return r.eRulePolicy.INFORMATION;var a=this.ruleReasonLevels[t],n=null;if(e){if(!(t in this.ruleReasonLevels))throw new Error("Rule triggered for which we have no rule level information "+t);for(var l=function(e){if(e in a){var t=new RegExp("(^|--)".concat(i,"($|--)"));Object.keys(a[e]).forEach(function(i){var l=null;"None"===i?l=a[e].None:t.test(i)&&(l=a[e][i]),null!==l&&(l===r.eRulePolicy.VIOLATION?n=r.eRulePolicy.VIOLATION:l===r.eRulePolicy.RECOMMENDATION&&null===n?n=r.eRulePolicy.RECOMMENDATION:null===n&&(n=r.eRulePolicy.INFORMATION))}),null===n&&(n=r.eRulePolicy.INFORMATION)}},o=0,s=e;o<s.length;o++)l(s[o])}if(null===n)throw new Error("Rule triggered for which we have no rule level information: "+t);return n},e.prototype.getCategory=function(e,t){var i=this.ruleCategory[t];if(!(t in this.ruleCategory))return c.eGuidelineCategory.OTHER;e||(e=this.getGuidelineIds());for(var a=0,n=e;a<n.length;a++){var l=n[a];if(l in i)return i[l]}return c.eGuidelineCategory.OTHER},e}();t.Checker=g},2297(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.a_target_warning=void 0;var a=i(7139),n=i(3946),l=i(5279),r=i(461),o=i(461);t.a_target_warning={id:"a_target_warning",context:"dom:a[target],dom:area[target],dom:base[target]",refactor:{WCAG20_A_TargetAndText:{Pass_0:"pass",Potential_1:"potential_warn"}},help:{"en-US":{group:"a_target_warning.html",pass:"a_target_warning.html",potential_warn:"a_target_warning.html"}},messages:{"en-US":{group:"Users should be warned in advance if their input action will open a new window",pass:"The user is warned in advance that the input action opens a new window",potential_warn:"Inform the user when their input action will open a new window"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"3.2.2",level:o.eRulePolicy.RECOMMENDATION,toolkitLevel:o.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var o=e.dom.node;if(n.VisUtil.isNodeHiddenFromAT(o)&&!a.CommonUtil.isTabbable(o))return null;var s={paramWinText:{value:["new window","new tab"],type:"array"}},u=o.getAttribute("target"),d="_parent"==u||"_self"==u||"_top"==u||null!=a.CommonUtil.getFrameByName(o,u);if(!d){var c=a.CommonUtil.getInnerText(o);if(o.hasAttribute("title")&&(c+=" "+o.getAttribute("title")),o.hasAttribute("aria-describedby"))for(var m=0,p=o.getAttribute("aria-describedby").trim().split(/\s+/);m<p.length;m++){var h=p[m],g=l.FragmentUtil.getById(o,h);if(g){var b=a.CommonUtil.getInnerText(g);b&&b.trim().length>0&&(c+=" "+b)}}for(var _=0;!d&&_<s.paramWinText.value.length;++_)-1!=c.indexOf(s.paramWinText.value[_])&&(d=!0)}return d?(0,r.RulePass)("pass"):(0,r.RulePotential)("potential_warn")}}},4401(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.a_text_purpose=void 0;var a=i(461),n=i(7139),l=i(3946),r=i(461),o=i(1950);t.a_text_purpose={id:"a_text_purpose",context:"aria:link,aria:doc-biblioref",refactor:{WCAG20_A_HasText:{Pass_0:"pass",Fail_1:"fail_acc_name"}},help:{"en-US":{group:"a_text_purpose.html",pass:"a_text_purpose.html",fail_acc_name:"a_text_purpose.html"}},messages:{"en-US":{group:"Hyperlinks must have an accessible name for their purpose",pass:"Hyperlink has a description of its purpose",fail_acc_name:"Hyperlink has no link text, label or image with a text alternative"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:["2.4.4","4.1.2"],level:r.eRulePolicy.VIOLATION,toolkitLevel:r.eToolkitLevel.LEVEL_TWO}],act:"c487ae",run:function(e,t){var i=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(i)||n.CommonUtil.isNodeDisabled(i))return null;var r=o.AccNameUtil.computeAccessibleName(i);return r&&r.name&&r.name.trim().length>0||n.CommonUtil.nonTabableChildCheck(i)?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_acc_name")}}},4546(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.applet_alt_exists=void 0;var a=i(7139),n=i(3946),l=i(461),r=i(461);t.applet_alt_exists={id:"applet_alt_exists",context:"dom:applet",refactor:{WCAG20_Applet_HasAlt:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{group:"applet_alt_exists.html",Pass_0:"applet_alt_exists.html",Fail_1:"applet_alt_exists.html",Fail_2:"applet_alt_exists.html",Fail_3:"applet_alt_exists.html"}},messages:{"en-US":{group:"<applet> elements must provide an 'alt' attribute and an alternative description",Pass_0:"Rule Passed",Fail_1:"An <applet> element does not have an 'alt' attribute that provides a short text alternative",Fail_2:"The 'alt' attribute value for an <applet> element duplicates the 'code' attribute",Fail_3:"An <applet> element provides alternative text, but does not provide inner content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"1.1.1",level:r.eRulePolicy.VIOLATION,toolkitLevel:r.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var r=e.dom.node;if(n.VisUtil.isNodeHiddenFromAT(r))return null;if(a.CommonUtil.attributeNonEmpty(r,"alt")){var o=r.getAttribute("alt").trim();return r.hasAttribute("code")&&o==r.getAttribute("code").trim()?(0,l.RuleFail)("Fail_2"):a.CommonUtil.hasInnerContentHidden(r)?(0,l.RulePass)("Pass_0"):(0,l.RuleFail)("Fail_3")}return(0,l.RuleFail)("Fail_1")}}},9292(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.application_content_accessible=void 0;var a=i(7011),n=i(3946),l=i(461),r=i(461);t.application_content_accessible={id:"application_content_accessible",context:"aria:application",refactor:{HAAC_Application_Role_Text:{0:"HAAC_Application_Role_Text.html",Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{0:"application_content_accessible.html",Pass_0:"application_content_accessible.html",Potential_1:"application_content_accessible.html"}},messages:{"en-US":{group:'Non-decorative static text and image content within an element with "application" role must be accessible',Pass_0:"Rule Passed",Potential_1:'Verify that the non-decorative static text and image content within an element with "application" role are accessible'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:["1.1.1","2.1.1"],level:r.eRulePolicy.VIOLATION,toolkitLevel:r.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){for(var r=!0,o=e.dom.node.childNodes,s=0;r&&s<o.length;s++)1===o[s].nodeType?n.VisUtil.isNodeVisible(o[s])&&(r=a.AriaUtil.hasRoleInSemantics(o[s],"document")||a.AriaUtil.hasRoleInSemantics(o[s],"article")):3===o[s].nodeType&&(r=0===o[s].nodeValue.trim().length);return r?(0,l.RulePass)("Pass_0"):(0,l.RulePotential)("Potential_1")}}},9605(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.area_alt_exists=void 0;var a=i(7139),n=i(3946),l=i(461),r=i(461);t.area_alt_exists={id:"area_alt_exists",context:"dom:area",refactor:{WCAG20_Area_HasAlt:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"area_alt_exists.html",Pass_0:"area_alt_exists.html",Fail_1:"area_alt_exists.html"}},messages:{"en-US":{group:"<area> elements in an image map must have a text alternative",Pass_0:"Rule Passed",Fail_1:"<area> element in an image map has no text alternative"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"1.1.1",level:r.eRulePolicy.VIOLATION,toolkitLevel:r.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var r=e.dom.node;return n.VisUtil.isNodeHiddenFromAT(r)?null:a.CommonUtil.attributeNonEmpty(r,"alt")?(0,l.RulePass)("Pass_0"):(0,l.RuleFail)("Fail_1")}}},3987(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_accessiblename_exists=void 0;var a=i(461),n=i(461),l=i(7011),r=i(3946),o=i(1950),s=i(9910);t.aria_accessiblename_exists={id:"aria_accessiblename_exists",context:"aria:columnheader, aria:heading, aria:rowheader, aria:graphics-document,aria:graphics-symbol, aria:img,aria:image, doc-backlink, doc-biblioentry, doc-biblioref, doc-glossref, doc-noteref, doc-pagebreak, doc-example",help:{"en-US":{pass:"aria_accessiblename_exists.html",fail_no_accessible_name:"aria_accessiblename_exists.html",fail_no_accessible_name_image:"aria_accessiblename_exists.html",group:"aria_accessiblename_exists.html"}},messages:{"en-US":{pass:"An accessible name is provided for the element",fail_no_accessible_name:'Element <{0}> with "{1}" role has no accessible name',fail_no_accessible_name_image:'Element <{0}> with "{1}" role has no accessible name',group:"Elements with certain roles should have accessible names"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE,reasonCodes:["fail_no_accessible_name"]},{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["ARIA"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE,reasonCodes:["fail_no_accessible_name_image"]}],act:[{"23a2a8":{fail_no_accessible_name_image:"fail"}}],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var u=n.nodeName.toLocaleLowerCase();if("svg"!==u&&"img"!==u){if("table"===u&&n.firstElementChild&&"caption"===n.firstElementChild.nodeName.toLowerCase()&&n.firstElementChild.textContent&&n.firstElementChild.textContent.trim().length>0)return(0,a.RulePass)("pass");var d=l.AriaUtil.getRolesUndefinedByAria(n);if(d&&d.length>0)return null;var c=l.AriaUtil.getDeprecatedAriaRoles(n);if(c&&c.length>0)return null;var m=l.AriaUtil.getDeprecatedAriaAttributes(n);if(m&&m.length>0)return null;var p=l.AriaUtil.getResolvedRole(n);if(!p||!s.ARIADefinitions.designPatterns[p]||!s.ARIADefinitions.designPatterns[p].nameRequired)return null;var h=o.AccNameUtil.computeAccessibleName(n);return h&&h.name&&0!==h.name.trim().length?(0,a.RulePass)("pass"):"img"===p||"image"===p?(0,a.RuleFail)("fail_no_accessible_name_image",[n.nodeName.toLowerCase(),p]):(0,a.RuleFail)("fail_no_accessible_name",[n.nodeName.toLowerCase(),p])}}}},8631(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_activedescendant_tabindex_valid=void 0;var a=i(461),n=i(461),l=i(7139);t.aria_activedescendant_tabindex_valid={id:"aria_activedescendant_tabindex_valid",context:"dom:*[aria-activedescendant]",refactor:{Rpt_Aria_InvalidTabindexForActivedescendant:{pass:"pass",Fail_1:"Fail_1"}},help:{"en-US":{pass:"aria_activedescendant_tabindex_valid.html",Fail_1:"aria_activedescendant_tabindex_valid.html",group:"aria_activedescendant_tabindex_valid.html"}},messages:{"en-US":{pass:"Rule Passed",Fail_1:"The <{0}> element using 'aria-activedescendant' set to \"{1}\" is not tabbable",group:"Element using 'aria-activedescendant' property should be tabbable"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,r=!1,o=n.nodeName.toLowerCase();if(n.hasAttribute("class")&&"mbl"==n.getAttribute("class").substring(0,3))return null;if(l.CommonUtil.isNodeDisabled(n))return null;if(0!==n.getAttribute("aria-activedescendant").trim().length){(r=l.CommonUtil.isTabbable(n))||(r=l.CommonUtil.getTabbableChildren(n)>0);var s=new Array;s.push(o);var u=new Array;return u.push(n.getAttribute("aria-activedescendant").split(" ").join(", ")),r?(0,a.RulePass)("pass"):(0,a.RuleFail)("Fail_1",[s.toString(),u.toString()])}}}},8025(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_activedescendant_valid=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(5279),s=i(3946),u=i(1686);t.aria_activedescendant_valid={id:"aria_activedescendant_valid",context:"dom:*[aria-activedescendant]",refactor:{HAAC_ActiveDescendantCheck:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{Pass_0:"aria_activedescendant_valid.html",Fail_1:"aria_activedescendant_valid.html",Fail_2:"aria_activedescendant_valid.html",Fail_3:"aria_activedescendant_valid.html",group:"aria_activedescendant_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The 'aria-activedescendant' property is empty",Fail_2:"The 'aria-activedescendant' property references a hidden node",Fail_3:"Element is not a combobox, and the referenced active-descendant element is not a valid descendant",group:"The 'aria-activedescendant' property must reference the 'id' of a non-empty, non-hidden active child element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.AriaUtil.hasRoleInSemantics(n,"combobox"))return null;var d=l.AriaUtil.getAriaAttribute(n,"aria-activedescendant");if(!d||""===d.trim())return(0,a.RuleFail)("Fail_1");var c=o.FragmentUtil.getById(n,d.trim());if(!c||u.DOMUtil.sameNode(d,n))return null;if(!s.VisUtil.isNodeVisible(c))return(0,a.RuleFail)("Fail_2");if(n.contains(c))return(0,a.RulePass)("Pass_0");var m=2;if(n.hasAttribute("aria-owns"))for(var p=r.CommonUtil.normalizeSpacing(n.getAttribute("aria-owns").trim()).split(" "),h=0;h<p.length;h++)if((v=o.FragmentUtil.getById(n,p[h]))&&!u.DOMUtil.sameNode(v,n)&&v.contains(c))return(0,a.RulePass)("Pass_0");if(l.AriaUtil.hasRoleInSemantics(n,"textbox")&&n.hasAttribute("aria-controls")){m=3;var g=r.CommonUtil.normalizeSpacing(n.getAttribute("aria-controls").trim()).split(" ");for(h=0;h<g.length;h++){var b=o.FragmentUtil.getById(n,g[h]);if(b&&!u.DOMUtil.sameNode(b,n)&&b.contains(c))return(0,a.RulePass)("Pass_0");if(b.hasAttribute("aria-owns"))for(var _=r.CommonUtil.normalizeSpacing(b.getAttribute("aria-owns").trim()).split(" "),f=0;f<_.length;f++){var v;if((v=o.FragmentUtil.getById(n,_[f]))&&!u.DOMUtil.sameNode(v,n)&&v.contains(c))return(0,a.RulePass)("Pass_0")}}}return 3==m?(0,a.RuleFail)("Fail_3"):null}}},1198(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_application_label_unique=void 0;var a=i(461),n=i(461),l=i(7011),r=i(3946);t.aria_application_label_unique={id:"aria_application_label_unique",context:"aria:application",refactor:{Rpt_Aria_MultipleApplicationLandmarks:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_application_label_unique.html",fail_label_not_unique:"aria_application_label_unique.html",group:"aria_application_label_unique.html"}},messages:{"en-US":{pass:'The element with "application" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "application" role do not have unique labels',group:'Each element with "application" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var o=l.AriaUtil.isLandmarkNameUnique(n,"application");return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},8001(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_application_labelled=void 0;var a=i(461),n=i(461),l=i(1950),r=i(3946);t.aria_application_labelled={id:"aria_application_labelled",context:"aria:application",refactor:{Rpt_Aria_ApplicationLandmarkLabel:{Pass_0:"pass",Fail_1:"fail_no_label"}},help:{"en-US":{pass:"aria_application_labelled.html",fail_no_label:"aria_application_labelled.html",group:"aria_application_labelled.html"}},messages:{"en-US":{pass:'The element with "application" role has a label that describes its purpose',fail_no_label:'Element with "application" role does not have a label',group:'Each element with "application" role must have a label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;return r.VisUtil.isNodeHiddenFromAT(n)?null:l.AccNameUtil.computeAccessibleName(n)?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_no_label")}}},5778(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_article_label_unique=void 0;var a=i(461),n=i(461),l=i(3946),r=i(7011);t.aria_article_label_unique={id:"aria_article_label_unique",context:"aria:article",refactor:{Rpt_Aria_MultipleArticleRoles_Implicit:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_article_label_unique.html",fail_label_not_unique:"aria_article_label_unique.html",group:"aria_article_label_unique.html"}},messages:{"en-US":{pass:'The element with "article" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "article" role do not have unique labels',group:'Each element with "article" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var o=r.AriaUtil.isLandmarkNameUnique(n,"article");return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},8118(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_allowed=void 0;var a=i(461),n=i(461),l=i(9910),r=i(7011);t.aria_attribute_allowed={id:"aria_attribute_allowed",context:"dom:*",refactor:{Rpt_Aria_ValidProperty:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"aria_attribute_allowed.html",Pass_0:"aria_attribute_allowed.html",Fail_1:"aria_attribute_allowed.html"}},messages:{"en-US":{group:"ARIA attributes must be valid for the element's role",Pass_0:"Rule Passed",Fail_1:"The attribute(s) '{0}' referenced by the element <{1}> is not a valid ARIA state or property"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"4.1.2",level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:"5f99a7",run:function(e,t,i){var n=e.dom.node,o=n.attributes;if(o){for(var s=l.ARIADefinitions.propertyDataTypes,u="",d=0,c=0,m=o.length;c<m;c++){var p=o[c].name;r.AriaUtil.isDefinedAriaAttribute(n,p)&&(d++,s[p]||(u=0==u.length?p:u+", "+p))}return 0==d?null:0!=u.length?(0,a.RuleFail)("Fail_1",[u,n.nodeName.toLowerCase()]):(0,a.RulePass)("Pass_0")}return null}}},2242(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_conflict=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139);t.aria_attribute_conflict={id:"aria_attribute_conflict",context:"dom:*[aria-required], dom:*[aria-autocomplete], dom:*[aria-readonly], dom:*[aria-disabled], dom:*[aria-placeholder], dom:*[aria-checked], dom:*[aria-hidden], dom:*[aria-valuemax], dom:*[aria-valuemin], dom:*[aria-colspan], dom:*[aria-rowspan]",help:{"en-US":{fail_conflict:"aria_attribute_conflict.html",group:"aria_attribute_conflict.html"}},messages:{"en-US":{fail_conflict:'The ARIA attribute "{0}" is in conflict with the corresponding HTML attribute "{1}"',group:"An ARIA attribute must not conflict with the corresponding HTML attribute"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,o=l.AriaUtil.getInvalidAriaAttributes(n);if(o&&o.length>0)return null;var s=[],u=l.AriaUtil.getUserDefinedAriaAttributes(n);if(!u||0===u.length)return null;for(var d=l.AriaUtil.getConflictAriaAndHtmlAttributes(n),c=0;c<d.length;c++)s.push((0,a.RuleFail)("fail_conflict",[d[c].ariaAttr,d[c].htmlAttr])),u.includes(d[c].ariaAttr)&&r.CommonUtil.reduceArrayItemList([d[c].ariaAttr],u);return s.length>0?s:null}}},3673(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_deprecated=void 0;var a=i(461),n=i(461),l=i(7011);t.aria_attribute_deprecated={id:"aria_attribute_deprecated",context:"dom:*",help:{"en-US":{fail_aria_role:"aria_attribute_deprecated.html",fail_aria_attr:"aria_attribute_deprecated.html",fail_role_attr:"aria_attribute_deprecated.html",group:"aria_attribute_deprecated.html"}},messages:{"en-US":{fail_aria_role:'The ARIA role "{0}" is deprecated in the ARIA specification',fail_aria_attr:'The ARIA attributes "{0}" are deprecated in the ARIA specification',fail_role_attr:'The ARIA attributes "{0}" are deprecated for the role "{1}" in the ARIA specification',group:"No deprecated ARIA role or attribute should be used"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["ARIA"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,r=[],o=l.AriaUtil.getDeprecatedAriaRoles(n);if(o&&o.length>0)for(var s=0;s<o.length;s++)r.push((0,a.RuleFail)("fail_aria_role",[o[s]]));var u=l.AriaUtil.getDeprecatedAriaAttributes(n);if(u&&u.length>0)for(s=0;s<u.length;s++)"any"===u[s].role?r.push((0,a.RuleFail)("fail_aria_attr",[u[s].attribute])):r.push((0,a.RuleFail)("fail_role_attr",[u[s].attribute,u[s].role]));return r.length>0?r:null}}},5080(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_exists=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(9910),s=i(3946);t.aria_attribute_exists={id:"aria_attribute_exists",context:"dom:*[role]",dependencies:["aria_role_allowed"],refactor:{Rpt_Aria_EmptyPropertyValue:{pass:"pass",fail_empty_attribute:"fail_empty_attribute"}},help:{"en-US":{pass:"aria_attribute_exists.html",fail_empty_attribute:"aria_attribute_exists.html",group:"aria_attribute_exists.html"}},messages:{"en-US":{pass:"Rule Passed",fail_empty_attribute:"The element attribute(s): '{0}' value is empty",group:"When specifying a required ARIA attribute, the value must not be empty"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:["6a7281"],run:function(e,t,i){var n=e.dom.node;if(!s.VisUtil.isNodeHiddenFromAT(n)){var u=new Array,d=o.ARIADefinitions.designPatterns,c=r.CommonUtil.hasAttribute,m=0,p=l.AriaUtil.getResolvedRole(n);if(p){if(d[p]&&null!=l.AriaUtil.getRoleRequiredProperties(p,n))for(var h=l.AriaUtil.getRoleRequiredProperties(p,n),g=0,b=h.length;g<b;g++)c(n,w=h[g])?(m++,0==r.CommonUtil.normalizeSpacing(n.getAttribute(h[g])).length&&u.push(h[g])):"aria-labelledby"==h[g]?"radiogroup"==p&&c(n,"aria-label")&&(m++,0==r.CommonUtil.normalizeSpacing(n.getAttribute("aria-label")).length&&u.push("aria-label")):"aria-valuenow"==h[g]&&"progressbar"==p&&c(n,"aria-valuetext")&&(m++,0==r.CommonUtil.normalizeSpacing(n.getAttribute("aria-valuetext")).length&&u.push("aria-valuetext"));if(d[p]){var _=l.AriaUtil.getElementAriaProperty(n),f=[];f.push(p);for(var v=l.AriaUtil.getAllowedAriaAttributes(n,f,_),A=(g=0,v.length);g<A;g++){var w;"aria-checked"!=(w=v[g])&&"aria-selected"!=w&&"aria-expanded"!=w&&"aria-orientation"!=w&&"aria-level"!=w||c(n,w)&&(m++,0!=r.CommonUtil.normalizeSpacing(n.getAttribute(w)).length||u.includes(w)||u.push(w))}}var y=new Array,C=0==u.length;return y.push(u.join(", ")),0==m?null:C?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_empty_attribute",y)}}}}},183(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_redundant=void 0;var a=i(461),n=i(461),l=i(7011);t.aria_attribute_redundant={id:"aria_attribute_redundant",context:"dom:*[aria-required], dom:*[aria-autocomplete], dom:*[aria-readonly], dom:*[aria-disabled], dom:*[aria-placeholder], dom:*[aria-checked], dom:*[aria-hidden], dom:*[aria-valuemax], dom:*[aria-valuemin], dom:*[aria-colspan], dom:*[aria-rowspan]",help:{"en-US":{pass:"aria_attribute_redundant.html",fail_redundant:"aria_attribute_redundant.html",group:"aria_attribute_redundant.html"}},messages:{"en-US":{pass:"The ARIA attribute is not redundant with a corresponding HTML attribute",fail_redundant:'The ARIA attribute "{0}" is redundant with the HTML attribute "{1}"',group:"An ARIA attribute should not be redundant with a corresponding HTML attribute"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,r=l.AriaUtil.getInvalidAriaAttributes(n);if(r&&r.length>0)return null;var o=l.AriaUtil.getConflictAriaAndHtmlAttributes(n);if(o&&o.length>0)return null;var s=n.attributes,u=[],d=[];if(s)for(var c=0;c<s.length;c++){var m=s[c].name.trim().toLowerCase(),p=n.getAttribute(m);""===p&&(p=null),"aria-"===m.substring(0,5)?u.push({name:m,value:p}):d.push({name:m,value:p})}var h=[],g=function(e){var t=l.AriaUtil.getConflictOrOverlappingHtmlAttribute(u[e],d,"overlapping");if(null===t)return"continue";t.forEach(function(t){"Pass"===t.result?h.push((0,a.RulePass)("pass")):"Failed"===t.result&&h.push((0,a.RuleFail)("fail_redundant",[u[e].name,t.attr]))})};for(c=0;c<u.length;c++)g(c);return h.length>0?h:null}}},6805(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_required=void 0;var a=i(9910),n=i(7011),l=i(7139),r=i(461),o=i(461);t.aria_attribute_required={id:"aria_attribute_required",context:"dom:*[role]",dependencies:["aria_role_allowed"],refactor:{Rpt_Aria_RequiredProperties:{Pass_0:"pass",Fail_1:"fail_missing"}},help:{"en-US":{group:"aria_attribute_required.html",pass:"aria_attribute_required.html",fail_missing:"aria_attribute_required.html"}},messages:{"en-US":{group:"The required attributes for the element with a role must be defined",pass:"The required attributes for the element with the role are defined",fail_missing:"Element with '{0}' role does not have the required ARIA attribute(s): '{1}'"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"4.1.2",level:o.eRulePolicy.VIOLATION,toolkitLevel:o.eToolkitLevel.LEVEL_ONE}],act:"4e8ab6",run:function(e,t,i){var o=e.dom.node,s=new Array,u=new Array,d=a.ARIADefinitions.designPatterns,c=l.CommonUtil.hasAttribute,m=n.AriaUtil.getElementAriaProperty(o),p=n.AriaUtil.getResolvedRole(o);if(p){var h=n.AriaUtil.getRoleRequiredProperties(p,o);if(d[p]&&null!==h){for(var g=n.AriaUtil.getAllowedAriaAttributes(o,p,m),b=!1,_=0,f=h.length;_<f;_++)g.includes(h[_])&&(c(o,h[_])||("aria-labelledby"==h[_]?c(o,"aria-label")&&"radiogroup"==p||(s.push(h[_]),b=!0):"aria-valuenow"==h[_]?c(o,"aria-valuetext")&&"progressbar"==p||(s.push(h[_]),b=!0):"aria-controls"==h[_]&&"combobox"==p||(s.push(h[_]),b=!0)));1==b&&u.push(p)}if(0==u.length||0==s.length)return(0,r.RulePass)("pass");var v=new Array;return v.push(u.join(", ")),v.push(s.join(", ")),(0,r.RuleFail)("fail_missing",v)}}}},1886(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_value_valid=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(9910);t.aria_attribute_value_valid={id:"aria_attribute_value_valid",context:"dom:*",dependencies:["aria_attribute_allowed"],refactor:{Rpt_Aria_ValidPropertyValue:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"aria_attribute_value_valid.html",Pass_0:"aria_attribute_value_valid.html",Fail_1:"aria_attribute_value_valid.html"}},messages:{"en-US":{group:"ARIA property values must be valid",Pass_0:"Rule Passed",Fail_1:"The value \"{0}\" specified for attribute '{1}' on element <{2}> is not valid"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:"6a7281",run:function(e,t,i){var n=e.dom.node,s=new Array,u=new Array,d=new Array,c=o.ARIADefinitions.propertyDataTypes,m=n.attributes,p=0;if(m)for(var h=0,g=m.length;h<g;h++){var b=m[h].name;if(l.AriaUtil.isDefinedAriaAttribute(n,b)){var _=c[b],f=r.CommonUtil.normalizeSpacing(m[h].nodeValue);if(p++,_&&_.values){if(-1==_.values.indexOf(f))if(-1!=_.values.indexOf("undefined")&&0==f.length);else if("http://www.w3.org/2001/XMLSchema#nmtokens"===_.type){var v=m[h].nodeValue.trim().split(" ");if(v.length>1&&v.includes("all"))s.push(m[h].nodeValue.split(" ")),u.push(b),d.push(_.values.toString());else for(var A={},w=0;w<v.length;w++)""==v[w]||_.values.includes(v[w])||(A.hasOwnProperty(b)||(A[b]=!0,u.push(b)),s.push(v[w]),d.push(_.values.toString()))}else s.push(m[h].nodeValue.split(" ")),u.push(b),d.push(_.values.toString())}else if(_&&_.type&&"http://www.w3.org/2001/XMLSchema#int"===_.type){var y=parseInt(f);(isNaN(y)||""+y!==f)&&(s.push(f),u.push(b))}else if(_&&_.type&&"http://www.w3.org/2001/XMLSchema#decimal"==_.type){var C=parseFloat(f);isNaN(C)&&(s.push(f),u.push(b))}else if(_&&_.type&&"http://www.w3.org/2001/XMLSchema#boolean"==_.type){var k=f.trim().toLowerCase();"true"!==k&&"false"!==k&&(s.push(f),u.push(b))}else _&&_.type&&"http://www.w3.org/2001/XMLSchema#string"==_.type||p--}}var R=new Array,x=0==u.length;return R.push(s.join(", ")),R.push(u.join(", ")),R.push(n.nodeName.toLowerCase()),0==p?null:x?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",R)}}},4078(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_banner_label_unique=void 0;var a=i(461),n=i(461),l=i(7011),r=i(3946);t.aria_banner_label_unique={id:"aria_banner_label_unique",context:"aria:banner",refactor:{Rpt_Aria_MultipleBannerLandmarks_Implicit:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_banner_label_unique.html",fail_label_not_unique:"aria_banner_label_unique.html",group:"aria_banner_label_unique.html"}},messages:{"en-US":{pass:'The element with "banner" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "banner" role do not have unique labels',group:'Each element with "banner" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var o=l.AriaUtil.isLandmarkNameUnique(n,"banner",!0);return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},5750(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_banner_single=void 0;var a=i(461),n=i(461),l=i(7011),r=i(3946);t.aria_banner_single={id:"aria_banner_single",context:"dom:*[role], dom:header",refactor:{Rpt_Aria_OneBannerInSiblingSet_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_banner_single.html",Fail_1:"aria_banner_single.html",group:"aria_banner_single.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "banner" role found on the page',group:'A page, document, or application should only have one element with "banner" role'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;return r.VisUtil.isNodeHiddenFromAT(n)?null:l.AriaUtil.hasRoleInSemantics(n,"banner")?null===l.AriaUtil.getSiblingWithRoleHidden(n,"banner",!0,!0)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1"):null}}},85(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_child_tabbable=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(9910),s=i(3946);t.aria_child_tabbable={id:"aria_child_tabbable",context:"dom:*[role]",dependencies:["aria_role_allowed"],refactor:{Rpt_Aria_MissingFocusableChild:{pass:"pass",fail_missing_child:"fail_missing_child"}},help:{"en-US":{pass:"aria_child_tabbable.html",fail_missing_child:"aria_child_tabbable.html",group:"aria_child_tabbable.html"}},messages:{"en-US":{pass:"Rule Passed",fail_missing_child:'None of the descendent elements with "{1}" role is tabbable',group:"UI component must have at least one tabbable descendant for keyboard access"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(!(s.VisUtil.isNodeHiddenFromAT(n)||r.CommonUtil.isNodeDisabled(n)||l.AriaUtil.containsPresentationalChildrenOnly(n)||l.AriaUtil.shouldBePresentationalChild(n))){if(l.AriaUtil.hasRole(n,{list:!0,row:!0,rowgroup:!0,table:!0,grid:!0}))return null;if(n.hasAttribute("class")&&"mbl"==n.getAttribute("class").substring(0,3))return null;if("datalist"===n.nodeName.toLowerCase())return null;if(l.AriaUtil.isNavigationOwnedOrControlled(n))return null;var u=l.AriaUtil.getResolvedRole(n),d=!0,c=n.ownerDocument,m=r.CommonUtil.hasAttribute,p=new Array,h="",g=!1;if(o.ARIADefinitions.containers.includes(u)&&"true"!=(m(n,"aria-disabled")?n.getAttribute("aria-disabled"):"")&&!m(n,"aria-activedescendant")&&!r.CommonUtil.isTabbable(n)){var b=o.ARIADefinitions.designPatterns[u].reqChildren;if(b){g=!0,d=!1;for(var _="descendant::*[",f=0;f<b.length;f++)_+="@role='"+b[f]+"' or ";_=_.substring(0,_.length-4)+"]";for(var v=c.evaluate(_,n,r.CommonUtil.defaultNSResolver,0,null),A=v.iterateNext();A&&!d;)if(r.CommonUtil.shouldNodeBeSkippedHidden(A))A=v.iterateNext();else{if(!(d=r.CommonUtil.isTabbable(A)))for(var w=c.evaluate("descendant::*",A,r.CommonUtil.defaultNSResolver,0,null),y=w.iterateNext();y&&!d;)r.CommonUtil.shouldNodeBeSkippedHidden(y)||(d=r.CommonUtil.isTabbable(A)),y=w.iterateNext();d||(p=A.getAttribute("role").trim().split(" "),h=A.nodeName.toLowerCase()),A=v.iterateNext()}}}var C=new Array,k=new Array;return h.length>0&&p.length>0?(C.push(h),k.push(p.join(", "))):d=!0,g?d?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_missing_child",[C.toString(),k.toString()]):null}}}},514(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_child_valid=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(3946);t.aria_child_valid={id:"aria_child_valid",context:"dom:*",dependencies:["aria_role_valid","aria_descendant_valid"],help:{"en-US":{group:"aria_child_valid.html",Pass:"aria_child_valid.html",Fail_no_child:"aria_child_valid.html",Fail_invalid_child:"aria_child_valid.html"}},messages:{"en-US":{group:"An element with an ARIA role must own a required child",Pass:"An element with an ARIA role owns a required child",Fail_no_child:'The element with role "{0}" does not own any child element with any of the following role(s): "{1}"',Fail_invalid_child:'The element with role "{0}" owns the child element with the role "{1}" that is not one of the allowed role(s): "{2}"'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:["bc4a75"],run:function(e,t,i){var n=e.dom.node;if(!o.VisUtil.isNodeHiddenFromAT(n)&&!r.CommonUtil.isNodeDisabled(n)&&!l.AriaUtil.containsPresentationalChildrenOnly(n)){var s=l.AriaUtil.getRoles(n,!1);if(s&&0!==s.length||(s=l.AriaUtil.getImplicitRole(n)),!s||0===s.length)return null;var u=["none","presentation"];if(s.some(function(e){return u.includes(e)}))return null;if(s.includes("combobox"))return null;var d=l.AriaUtil.getRequiredChildRoles(n,!0);if(d.includes("group")){var c=d.indexOf("group");c>-1&&d.splice(c,1)}if(0==d.length)return null;var m=l.AriaUtil.getDirectATChildren(n);if(!m||0==m.length){var p=n.getAttribute("aria-busy");return p&&"true"===p?null:((v=new Array).push(s.join(", ")),v.push(d.join(", ")),(0,a.RuleFail)("Fail_no_child",v))}for(var h=new Array,g=0;g<m.length;g++){var b=l.AriaUtil.getRoles(m[g],!1);b&&0!=b.length||(b=l.AriaUtil.getImplicitRole(m[g])),b&&b.length>0&&(b.some(function(e){return d.includes(e)})||h.push(b.join(", ")))}if(h.length>0){for(var _=[],f=0;f<h.length;f++){var v;(v=new Array).push(s.join(", ")),v.push(h[f]),v.push(d.join(", ")),_.push((0,a.RuleFail)("Fail_invalid_child",v))}return _}return(0,a.RulePass)("Pass")}}}},5310(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_complementary_label_unique=void 0;var a=i(461),n=i(461),l=i(7011),r=i(3946);t.aria_complementary_label_unique={id:"aria_complementary_label_unique",context:"aria:complementary",refactor:{Rpt_Aria_MultipleComplementaryLandmarks_Implicit:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_complementary_label_unique.html",fail_label_not_unique:"aria_complementary_label_unique.html",group:"aria_complementary_label_unique.html"}},messages:{"en-US":{pass:'The element with "complementary" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "complementary" role do not have unique labels',group:'Each element with "complementary" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var o=l.AriaUtil.isLandmarkNameUnique(n,"complementary");return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},9083(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_complementary_label_visible=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(3946);t.aria_complementary_label_visible={id:"aria_complementary_label_visible",context:"dom:*[role], dom:aside",dependencies:["aria_complementary_labelled"],refactor:{Rpt_Aria_ComplementaryLandmarkLabel_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_complementary_label_visible.html",Fail_1:"aria_complementary_label_visible.html",group:"aria_complementary_label_visible.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Element with "complementary" role does not have a visible label',group:'Each element with "complementary" role should have a visible label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;return o.VisUtil.isNodeHiddenFromAT(n)?null:l.AriaUtil.hasRoleInSemantics(n,"complementary")?r.CommonUtil.attributeNonEmpty(n,"aria-labelledby")?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1"):null}}},6049(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_complementary_labelled=void 0;var a=i(461),n=i(461),l=i(1950),r=i(3946);t.aria_complementary_labelled={id:"aria_complementary_labelled",context:"aria:complementary",refactor:{Rpt_Aria_ComplementaryRequiredLabel_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_complementary_labelled.html",Fail_1:"aria_complementary_labelled.html",group:"aria_complementary_labelled.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Element with "complementary" role does not have a label',group:'Each element with "complementary" role must have a label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;return r.VisUtil.isNodeHiddenFromAT(n)?null:l.AccNameUtil.computeAccessibleName(n)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},5099(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_content_in_landmark=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(4566),s=i(3864),u=i(3946),d=i(9196);t.aria_content_in_landmark={id:"aria_content_in_landmark",context:"dom:*",refactor:{Rpt_Aria_OrphanedContent_Native_Host_Sematics:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_content_in_landmark.html",Fail_1:"aria_content_in_landmark.html",group:"aria_content_in_landmark.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Content is not within a landmark element",group:"All content must reside within an element with a landmark role"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE},{id:["WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=o.CacheUtil.getCache(e.dom.node.ownerDocument,"aria_content_in_landmark",null);if(!n){(n={landmarks:{value:["banner","complementary","contentinfo","form","main","navigation","region","search"],type:"array"},possibleOrphanedWidgets:{value:["button","combobox","checkbox","grid","heading","link","list","listbox","menu","menubar","progressbar","radio","tablist","textbox","toolbar","tree","treegrid"],type:"array"},possibleOrphanedElements:{value:["p","table","input","textarea","select","button","a","ol","ul","dl","h1","h2","h3","h4","h5","h6","embed","object","area"],type:"array"},noLandmarkedRoles:{value:["alert","alertdialog","dialog","tooltip"],type:"array"},mapLandmarks:{},mapPossibleOrphanedWidgets:{},mapPossibleOrphanedElements:{},mapNoLandmarkedRoles:{}}).mapLandmarks={};for(var c=0;c<n.landmarks.value.length;++c)n.mapLandmarks[n.landmarks.value[c]]=!0;for(n.mapPossibleOrphanedWidgets={},c=0;c<n.possibleOrphanedWidgets.value.length;++c)n.mapPossibleOrphanedWidgets[n.possibleOrphanedWidgets.value[c]]=!0;for(n.mapPossibleOrphanedElements={},c=0;c<n.possibleOrphanedElements.value.length;++c)n.mapPossibleOrphanedElements[n.possibleOrphanedElements.value[c]]=!0;for(n.mapNoLandmarkedRoles={},c=0;c<n.noLandmarkedRoles.value.length;++c)n.mapNoLandmarkedRoles[n.noLandmarkedRoles.value[c]]=!0;o.CacheUtil.setCache(e.dom.node.ownerDocument,"aria_content_in_landmark",n)}var m=e.dom.node,p=m.nodeName.toLowerCase();if(!u.VisUtil.isNodeVisible(m)||null!=u.VisUtil.hiddenByDefaultElements&&null!=u.VisUtil.hiddenByDefaultElements&&u.VisUtil.hiddenByDefaultElements.indexOf(p)>-1)return(0,a.RulePass)("Pass_0");if(!r.CommonUtil.hasInnerContentHidden(m)&&-1===["area","input","embed","button","textarea","select"].indexOf(p))return(0,a.RulePass)("Pass_0");if("table"==p&&d.TableUtil.isLayoutTable(m))return null;var h=!0,g=l.AriaUtil.hasRole(m,n.mapPossibleOrphanedWidgets,!0);"link"===p&&(g=!1);var b=p in n.mapPossibleOrphanedElements;if(!g&&!b)return null;if(!(h=i.aria.map(function(e){return e.role}).filter(function(e){return e in n.mapLandmarks}).length>0)){for(var _=s.DOMWalker.parentElement(m);!h&&null!=_;)h=o.CacheUtil.getCache(_,"Rpt_Aria_OrphanedContent",!1),_=s.DOMWalker.parentElement(_);for(_=m.nextElementSibling;!h&&null!=_;)h=o.CacheUtil.getCache(_,"Rpt_Aria_OrphanedContent",!1),_=_.nextElementSibling;for(_=m.previousElementSibling;!h&&null!=_;)h=o.CacheUtil.getCache(_,"Rpt_Aria_OrphanedContent",!1),_=_.previousElementSibling;if(h)return null;if(o.CacheUtil.setCache(m,"Rpt_Aria_OrphanedContent",!0),h=o.CacheUtil.getCache(m,"Rpt_Aria_OrphanedContent_NoTrigger",!1)||l.AriaUtil.hasRole(m,n.mapNoLandmarkedRoles,!0)||l.AriaUtil.getAncestorWithRole(m,n.mapNoLandmarkedRoles,!0))return o.CacheUtil.setCache(m,"Rpt_Aria_OrphanedContent_NoTrigger",!0),null}return h?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},2759(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_contentinfo_label_unique=void 0;var a=i(461),n=i(461),l=i(7011),r=i(3946);t.aria_contentinfo_label_unique={id:"aria_contentinfo_label_unique",context:"aria:contentinfo",refactor:{Rpt_Aria_MultipleContentinfoLandmarks_Implicit:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_contentinfo_label_unique.html",fail_label_not_unique:"aria_contentinfo_label_unique.html",group:"aria_contentinfo_label_unique.html"}},messages:{"en-US":{pass:'The element with "contentinfo" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "contentinfo" role do not have unique labels',group:'Each element with "contentinfo" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var o=l.AriaUtil.isLandmarkNameUnique(n,"contentinfo",!0);return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},3141(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_contentinfo_misuse=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(3946);t.aria_contentinfo_misuse={id:"aria_contentinfo_misuse",context:"dom:*[role], dom:footer, dom:address",refactor:{Rpt_Aria_ContentinfoWithNoMain_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_contentinfo_misuse.html",Fail_1:"aria_contentinfo_misuse.html",group:"aria_contentinfo_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Element with "contentinfo" role is present without an element with "main" role',group:'Each element with "contentinfo" role is only permitted with an element with "main" role'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;return o.VisUtil.isNodeHiddenFromAT(n)?null:l.AriaUtil.hasRoleInSemantics(n,"contentinfo")?r.CommonUtil.getElementsByRoleHidden(n.ownerDocument,"main",!0,!0).length>0?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1"):null}}},5131(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_contentinfo_single=void 0;var a=i(461),n=i(461),l=i(7011),r=i(3946);t.aria_contentinfo_single={id:"aria_contentinfo_single",context:"dom:*[role], dom:footer, dom:address",refactor:{Rpt_Aria_MultipleContentinfoInSiblingSet_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_contentinfo_single.html",Fail_1:"aria_contentinfo_single.html",group:"aria_contentinfo_single.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "contentinfo" role found on the page',group:'A page, document, or application should only have one element with "contentinfo" role'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;return r.VisUtil.isNodeHiddenFromAT(n)?null:l.AriaUtil.hasRoleInSemantics(n,"contentinfo")?l.AriaUtil.getSiblingWithRoleHidden(n,"contentinfo",!0,!0)?(0,a.RuleFail)("Fail_1"):(0,a.RulePass)("Pass_0"):null}}},5167(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_descendant_valid=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(3946);t.aria_descendant_valid={id:"aria_descendant_valid",context:"dom:*",dependencies:["aria_role_valid"],help:{"en-US":{group:"aria_descendant_valid.html",pass:"aria_descendant_valid.html",potential_child_implicit_role:"aria_descendant_valid.html",recommendation_no_impact_role:"aria_descendant_valid.html",fail_child_explicit_role:"aria_descendant_valid.html"}},messages:{"en-US":{group:"Browsers ignore the explicit and implicit ARIA roles of the descendants of certain elements",pass:"The element contains valid descendants",potential_child_implicit_role:'The element with role "{0}" contains descendants with implicit roles "{1}" which are ignored by browsers',recommendation_no_impact_role:'The element with role "{0}" contains descendants with roles "{1}" which are ignored by browsers',fail_child_explicit_role:'The element with role "{0}" contains descendants with roles "{1}" which are ignored by browsers'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE,reasonCodes:["pass","potential_child_implicit_role","fail_child_explicit_role"]},{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE,reasonCodes:["recommendation_no_impact_role"]}],act:["307n5z"],run:function(e,t,i){var n=e.dom.node;if(!o.VisUtil.isNodeHiddenFromAT(n)&&!r.CommonUtil.isNodeDisabled(n)&&l.AriaUtil.containsPresentationalChildrenOnly(n)){var s=l.AriaUtil.getRoles(n,!1);if(s&&0!==s.length||(s=l.AriaUtil.getImplicitRole(n)),!s||0===s.length)return null;var u=l.AriaUtil.getDirectATChildren(n);if(!(u&&u.length>0))return(0,a.RulePass)("pass");for(var d=new Array,c=new Array,m=new Array,p=0;p<u.length;p++){var h=u[p].nodeName.toLowerCase();if("img"!==h&&"svg"!==h){var g=l.AriaUtil.getRoles(u[p],!1);g&&g.length>0?(g.includes("code")&&m.push(g.filter(function(e){return"code"===e}).join(", ")),d.push(g.filter(function(e){return"code"!==e}).join(", "))):((g=l.AriaUtil.getImplicitRole(u[p])).includes("code")&&m.push(g.filter(function(e){return"code"===e}).join(", ")),g&&g.length>0&&c.push(g.filter(function(e){return"code"!==e}).join(", ")))}}if(d.length>0){for(var b=[],_=0;_<d.length;_++)(f=new Array).push(s.join(", ")),f.push(d[_]),b.push((0,a.RuleFail)("fail_child_explicit_role",f));return b}if(c.length>0){for(b=[],_=0;_<c.length;_++)(f=new Array).push(s.join(", ")),f.push(c[_]),b.push((0,a.RulePotential)("potential_child_implicit_role",f));return b}if(m.length>0){for(b=[],_=0;_<m.length;_++){var f;(f=new Array).push(s.join(", ")),f.push(m[_]),b.push((0,a.RulePotential)("recommendation_no_impact_role",f))}return b}}}}},8115(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_document_label_unique=void 0;var a=i(461),n=i(461),l=i(7011),r=i(3946);t.aria_document_label_unique={id:"aria_document_label_unique",context:"aria:document",refactor:{Rpt_Aria_MultipleDocumentRoles:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_document_label_unique.html",fail_label_not_unique:"aria_document_label_unique.html",group:"aria_document_label_unique.html"}},messages:{"en-US":{pass:'The element with "document" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "document" roles do not have unique labels',group:'Each element with "document" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var o=l.AriaUtil.isLandmarkNameUnique(n,"document",!0);return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},5733(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_eventhandler_role_valid=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139);t.aria_eventhandler_role_valid={id:"aria_eventhandler_role_valid",context:"dom:*[onclick],dom:*[onblur], dom:*[ondblclick], dom:*[onfocus], dom:*[onkeydown],dom:*[onkeypress], dom:*[onkeyup], dom:*[onmousedown], dom:*[onmouseup], dom:*[onmousemove], dom:*[onmouseout], dom:*[onmouseover], dom:*[onresize], dom:*[onchange]",refactor:{Rpt_Aria_EventHandlerMissingRole_Native_Host_Sematics:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_eventhandler_role_valid.html",Fail_1:"aria_eventhandler_role_valid.html",group:"aria_eventhandler_role_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The <{0}> element with '{1}' does not have a valid ARIA role specified",group:"Elements with event handlers must have a valid ARIA role"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.CommonUtil.getAncestor(n,"svg"))return null;if(l.AriaUtil.hasAnyRole(n,!0))return(0,a.RulePass)("Pass_0");if(r.CommonUtil.isfocusableByDefault(n))return(0,a.RulePass)("Pass_0");var o=new Array;o.push(n.nodeName.toLowerCase());for(var s=new Array,u=["onblur","onfocus","onchange","onclick","ondblclick","onkeydown","onkeypress","onkeyup","onmousedown","onmouseup","onmousemove","onmouseout","onmouseover","onresize"],d=0;d<u.length;++d)n.hasAttribute(u[d])&&s.push(u[d]);var c=new Array;return c.push(s.join(", ")),(0,a.RuleFail)("Fail_1",[o.toString(),c.toString()])}}},5782(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_form_label_unique=void 0;var a=i(461),n=i(461),l=i(7011),r=i(3946);t.aria_form_label_unique={id:"aria_form_label_unique",context:"aria:form",refactor:{Rpt_Aria_MultipleFormLandmarks_Implicit:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_form_label_unique.html",fail_label_not_unique:"aria_form_label_unique.html",group:"aria_form_label_unique.html"}},messages:{"en-US":{pass:'The element with "form" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "form" role do not have unique labels',group:'Each element with "form" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var o=l.AriaUtil.isLandmarkNameUnique(n,"form",!0);return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},6731(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_graphic_labelled=void 0;var a=i(461),n=i(7011),l=i(7139),r=i(3946);t.aria_graphic_labelled={id:"aria_graphic_labelled",context:"aria:graphics-document,aria:graphics-symbol",refactor:{HAAC_Aria_SvgAlt:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{group:"aria_graphic_labelled.html",Pass_0:"aria_graphic_labelled.html",Fail_1:"aria_graphic_labelled.html",Fail_2:"aria_graphic_labelled.html",Fail_3:"aria_graphic_labelled.html"}},messages:{"en-US":{group:"An element with a graphics role must have a non-empty label",Pass_0:"Rule Passed",Fail_1:'Element with "{0}" graphics role has no label',Fail_2:'Element with "{0}" graphics role has no label or an empty label',Fail_3:"Element with \"{0}\" graphics role missing non-empty 'aria-label' or 'aria-labelledby'"}},rulesets:[],act:[{"7d6734":{Pass_0:"pass",Fail_1:"inapplicable",Fail_2:"fail",Fail_3:"inapplicable"}}],run:function(e,t,i){var o=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(o))return null;if(!o.hasAttribute("role")||!o.getAttribute("role").includes("graphics-"))return null;var s=n.AriaUtil.getAriaLabel(o).length>0;if(!s&&"svg"===o.nodeName.toLowerCase()){var u=o.querySelector("title");s=u&&l.CommonUtil.hasInnerContent(u)}return s||(s=l.CommonUtil.attributeNonEmpty(o,"title")),s?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_2",[o.getAttribute("role")])}}},390(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_hidden_nontabbable=void 0;var a=i(7139),n=i(461),l=i(461);t.aria_hidden_nontabbable={id:"aria_hidden_nontabbable",context:"dom:*[aria-hidden=true], dom:*[aria-hidden=true] dom:*",refactor:{aria_hidden_focus_misuse:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"aria_hidden_nontabbable.html",Pass_0:"aria_hidden_nontabbable.html",Fail_1:"aria_hidden_nontabbable.html"}},messages:{"en-US":{group:"A hidden element should not contain any tabbable elements",Pass_0:"Rule Passed",Fail_1:"Element \"{0}\" should not be focusable within the subtree of an element with an 'aria-hidden' attribute with value 'true'"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:["1.3.1","4.1.2"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_TWO}],act:"6cfa84",run:function(e,t,i){var l=e.dom.node,r=l.nodeName.toLowerCase();return a.CommonUtil.isTabbable(l)?(0,n.RuleFail)("Fail_1",[r]):(0,n.RulePass)("Pass_0")}}},3900(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_id_unique=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(5279),s=i(9910),u=i(3946);t.aria_id_unique={id:"aria_id_unique",context:"dom:*",refactor:{Rpt_Aria_ValidIdRef:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_id_unique.html",Fail_1:"aria_id_unique.html",group:"aria_id_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The 'id' \"{0}\" specified for the ARIA property '{1}' value is not valid",group:"The ARIA property must reference a non-empty unique id of an existing element that is visible"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:["59796f","6a7281"],run:function(e,t,i){var n=e.dom.node,d=!0,c=new Array,m=(new Array,o.FragmentUtil.getOwnerFragment(n)),p=n.attributes,h=new Array,g=0;if(p)for(var b=0,_=p.length;b<_;b++){d=!0;var f=p[b].name;if(l.AriaUtil.isDefinedAriaAttribute(n,f)){var v=s.ARIADefinitions.propertyDataTypes[f];if(v&&v.type){var A="http://www.w3.org/2001/XMLSchema#idref"==v.type;if(A||"http://www.w3.org/2001/XMLSchema#idrefs"==v.type){g++;var w=r.CommonUtil.normalizeSpacing(p[b].nodeValue).length,y=p[b].nodeValue.split(" ");if(w<1)d=!1,h.push('"'+p[b].nodeValue+'"');else if(A&&w>=1&&y.length>1){d=!1;for(var C=0,k=y.length;C<k;++C)""!=y[C]&&h.push(y[C])}if(d&&w>=1)for(var R=0,x=y.length;R<x;++R)if(y[R].length>0){var P=m.getElementById(y[R]);if((d=null!=P)&&!v.hiddenIDRefSupported&&(d=u.VisUtil.isNodeVisible(P)),d)break;""!=y[R]&&h.push(y[R])}}}d||c.push(f)}}var T=0==c.length,U=new Array,I=new Array,E=new Array;return T||(I.push(c.join(", ")),E.push(n.nodeName.toLowerCase()),h.length>0&&U.push(h.join(", "))),0==g?null:T?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[U.toString(),I.toString(),E.toString()])}}},1218(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_img_labelled=void 0;var a=i(461),n=i(7011),l=i(7139),r=i(3946);t.aria_img_labelled={id:"aria_img_labelled",context:"aria:img, aria:image",refactor:{HAAC_Aria_ImgAlt:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{group:"aria_img_labelled.html",Pass_0:"aria_img_labelled.html",Fail_1:"aria_img_labelled.html",Fail_2:"aria_img_labelled.html",Fail_3:"aria_img_labelled.html"}},messages:{"en-US":{group:'An element with "img" role must have a non-empty label',Pass_0:"Rule Passed",Fail_1:'Element with "img" role has no label',Fail_2:'Element with "img" role has no label or an empty label',Fail_3:"Element with \"img\" role missing non-empty 'aria-label' or 'aria-labelledby'"}},rulesets:[],act:["23a2a8",{"7d6734":{Pass_0:"pass",Fail_1:"inapplicable",Fail_2:"fail",Fail_3:"inapplicable"}}],run:function(e,t,i){var o=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(o))return null;if(!o.hasAttribute("role"))return null;var s=o.nodeName.toLocaleLowerCase();if("svg"!==s&&"img"!==s){var u=n.AriaUtil.getAriaLabel(o).length>0;if(!u&&"svg"===o.nodeName.toLowerCase()){var d=o.querySelector("title");u=d&&l.CommonUtil.hasInnerContent(d)}return u||(u=l.CommonUtil.attributeNonEmpty(o,"title")),u?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_2")}}}},6734(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_keyboard_handler_exists=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(9910),s=i(3946);t.aria_keyboard_handler_exists={id:"aria_keyboard_handler_exists",context:"dom:*[role]",dependencies:["aria_role_allowed"],refactor:{Rpt_Aria_MissingKeyboardHandler:{pass:"pass",potential_no_keyboard_access:"potential_no_keyboard_access"}},help:{"en-US":{pass:"aria_keyboard_handler_exists.html",potential_no_keyboard_access:"aria_keyboard_handler_exists.html",group:"aria_keyboard_handler_exists.html"}},messages:{"en-US":{pass:"Rule Passed",potential_no_keyboard_access:'Verify the <{0}> element with "{1}" role has keyboard access',group:"Interactive WAI_ARIA UI components must provide keyboard access"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(!s.VisUtil.isNodeHiddenFromAT(n)&&!r.CommonUtil.isNodeDisabled(n)){var u=!0,d=u,c=n.ownerDocument,m=o.ARIADefinitions.designPatterns,p=l.AriaUtil.getRoles(n,!1);if("datalist"===n.nodeName.toLowerCase()&&p&&p.includes("listbox"))return null;for(var h=["combobox","grid","listbox","menu","menubar","radiogroup","tablist","tree","treegrid"],g=0,b=h;g<b.length;g++){var _=b[g];if(null!=l.AriaUtil.getAncestorWithRole(n,_,!0))return null}for(var f=r.CommonUtil.hasAttribute,v=new Array,A=0;A<p.length;++A){if(m[p[A]],h.indexOf(p[A])>=0&&!(f(n,"aria-disabled")&&n.getAttribute("aria-disabled")||(u=n.hasAttribute("onkeydown")||n.hasAttribute("onkeypress")||n.hasAttribute("onkeyup"))))if(f(n,"aria-activedescendant"))u=!0;else{var w,y=o.ARIADefinitions.designPatterns[p[A]].reqChildren;if(y)for(var C=0,k=y.length;C<k;C++)for(var R="*[contains(@role,'"+y[C]+"')]",x=c.evaluate(R,n,r.CommonUtil.defaultNSResolver,0,null),P=x.iterateNext();P;){if(!(u=P.hasAttribute("onkeydown")||P.hasAttribute("onkeypress")))for(var T="descendant::*",U=(w=c.evaluate(T,P,r.CommonUtil.defaultNSResolver,0,null)).iterateNext();U&&!u;)r.CommonUtil.shouldNodeBeSkippedHidden(U)||(u=r.CommonUtil.isTabbable(U)&&(U.hasAttribute("onkeydown")||U.hasAttribute("onkeypress")))||"a"==U.nodeName.toLowerCase()&&U.hasAttribute("href")&&(u=(I=U.getAttribute("href")).startsWith("javascript:")&&-1==I.indexOf("void")&&I.length>11),U=w.iterateNext();if(!u)break;P=x.iterateNext()}else for(T="descendant::*",U=(w=c.evaluate(T,n,r.CommonUtil.defaultNSResolver,0,null)).iterateNext();U&&!u;)if(r.CommonUtil.shouldNodeBeSkippedHidden(U))U=w.iterateNext();else{var I;(u=r.CommonUtil.isTabbable(U)&&(U.hasAttribute("onkeydown")||U.hasAttribute("onkeypress")))||"a"==U.nodeName.toLowerCase()&&U.hasAttribute("href")&&(u=(I=U.getAttribute("href")).startsWith("javascript:")&&-1==I.indexOf("void")&&I.length>11),U=w.iterateNext()}}u||v.push(p[A]),!u&&d&&(d=u)}var E=new Array;E.push(n.nodeName.toLowerCase());var N=new Array;N.push(v.join(", "));var L=n.getAttribute("id");return L&&L.trim().length>0&&n.ownerDocument.querySelector("*[aria-controls='".concat(L,"'][role='combobox']"))?null:d?(0,a.RulePass)("pass"):(0,a.RulePotential)("potential_no_keyboard_access",[E.toString(),N.toString()])}}}},9973(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_landmark_name_unique=void 0;var a=i(461),n=i(461),l=i(9955),r=i(1686),o=i(5279),s=i(4566),u=i(1950),d=i(3946),c=i(7139),m=i(7011);t.aria_landmark_name_unique={id:"aria_landmark_name_unique",context:"aria:complementary, aria:banner, aria:contentinfo, aria:main, aria:navigation, aria:region, aria:search, aria:form",refactor:{landmark_name_unique:{Pass_0:"pass",Fail_0:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_landmark_name_unique.html",fail_label_not_unique:"aria_landmark_name_unique.html",group:"aria_landmark_name_unique.html"}},messages:{"en-US":{pass:"Multiple elements with \"{0}\" landmarks within the same parent region are distinguished by unique 'aria-label' or 'aria-labelledby'",fail_label_not_unique:'Multiple elements with "{0}" landmarks within the same parent region are not distinguished from one another because they have the same "{1}" label',group:"Each landmark should have a unique 'aria-labelledby' or 'aria-label' or be nested in a different parent region"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE},{id:["WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(d.VisUtil.isNodeHiddenFromAT(n))return null;if(null!==c.CommonUtil.getAncestor(n,["DIALOG"])||null!==m.AriaUtil.getAncestorWithRole(n,"dialog",!0))return null;var p=o.FragmentUtil.getOwnerFragment(n),h=s.CacheUtil.getCache(n.ownerDocument,"aria_landmark_name_unique",null);if(!h){h={navigationNodes:[],navigationNodesComputedLabels:[],navigationNodesParents:[],navigationNodesMatchFound:[]};for(var g=p.querySelectorAll('aside,[role="complementary"], footer,[role="contentinfo"], header,[role="banner"], main,[role="main"], nav,[role="navigation"], form,[role="form"], section,[role="region"],[role="search"]'),b=Array.from(g),_=[],f=[],v=[],A=0;A<b.length;A++)d.VisUtil.isNodeHiddenFromAT(b[A])||null!==c.CommonUtil.getAncestor(b[A],["DIALOG"])||null!==m.AriaUtil.getAncestorWithRole(b[A],"dialog",!0)||v.push(b[A]);for(b=v,A=0;A<b.length;A++){for(var w=[],y=b[A].parentElement;y;)w.push(y),y=y.parentElement;for(var C=0;C<w.length;C++){var k=["ASIDE","FOOTER","FORM","HEADER","MAIN","NAV","SECTION"].includes(w[C].tagName),R=!1;if(w[C].hasAttribute("role")&&(R=["complementary","contentinfo","form","banner","main","navigation","region","search"].includes(w[C].getAttribute("role"))),k||R){_.push(w[C]);break}if(C===w.length-1){_.push(null);break}}}var x=[];for(A=0;A<b.length;A++){var P=u.AccNameUtil.computeAccessibleName(b[A]);x.push(P&&P.name&&P.name.trim().length>0?P.name.trim():"")}for(A=0;A<_.length;A++){var T=!1,U=!1;for(C=0;C<_.length;C++)if(C!==A){if(null===_[A]&&null===_[C]){if(l.ARIAMapper.nodeToRole(b[A])===l.ARIAMapper.nodeToRole(b[C])){if(x[A]===x[C]){f.push("fail_label_not_unique"),T=!0;break}U=!0}}else if(null===_[A]||null===_[C])continue;if(r.DOMUtil.sameNode(_[A],_[C])&&l.ARIAMapper.nodeToRole(b[A])===l.ARIAMapper.nodeToRole(b[C])){if(x[A]===x[C]){f.push("fail_label_not_unique"),T=!0;break}U=!0}}T||(U?f.push("pass"):f.push("null"))}h.navigationNodesComputedLabels=x,h.navigationNodes=b,h.navigationNodesParents=_,h.navigationNodesMatchFound=f,s.CacheUtil.setCache(n.ownerDocument,"aria_landmark_name_unique",h)}var I=-1;for(A=0;A<h.navigationNodes.length;A++)n.isSameNode(h.navigationNodes[A])&&(I=A);return-1===I?null:"pass"===h.navigationNodesMatchFound[I]?(0,a.RulePass)("pass",[l.ARIAMapper.nodeToRole(h.navigationNodes[I])]):"fail_label_not_unique"===h.navigationNodesMatchFound[I]?(0,a.RuleFail)("fail_label_not_unique",[l.ARIAMapper.nodeToRole(h.navigationNodes[I]),h.navigationNodesComputedLabels[I]]):null}}},5711(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_main_label_unique=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(3946);t.aria_main_label_unique={id:"aria_main_label_unique",context:"aria:main",refactor:{Rpt_Aria_MultipleMainsRequireLabel_Implicit_2:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_main_label_unique.html",Fail_1:"aria_main_label_unique.html",group:"aria_main_label_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "main" role do not have unique labels',group:'Each element with "main" role must have unique label that describes its purposes'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(o.VisUtil.isNodeHiddenFromAT(n))return null;for(var s=l.AriaUtil.getAriaLabel(n),u=l.AriaUtil.getAncestorWithRole(n,"document",!0),d=r.CommonUtil.getElementsByRoleHidden(n.ownerDocument,"main",!0,!0),c=null,m=0;m<d.length;++m)if(d[m]!==n&&(c=(0,a.RulePass)("Pass_0"),l.AriaUtil.getAncestorWithRole(d[m],"document",!0)===u&&l.AriaUtil.getAriaLabel(d[m])===s)){c=(0,a.RuleFail)("Fail_1");break}return c}}},3384(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_main_label_visible=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(3946);t.aria_main_label_visible={id:"aria_main_label_visible",context:"dom:body",refactor:{Rpt_Aria_MultipleMainsVisibleLabel_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_main_label_visible.html",Fail_1:"aria_main_label_visible.html",group:"aria_main_label_visible.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "main" role do not have unique visible labels',group:'Each element with "main" role should have a unique visible label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(o.VisUtil.isNodeHiddenFromAT(n))return null;var s=r.CommonUtil.getElementsByRoleHidden(n.ownerDocument,"main",!0,!0);return 0===s.length||1===s.length?null:l.AriaUtil.hasUniqueAriaLabelledby(s)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},2762(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_navigation_label_unique=void 0;var a=i(461),n=i(461),l=i(7011),r=i(3946);t.aria_navigation_label_unique={id:"aria_navigation_label_unique",context:"aria:navigation",refactor:{Rpt_Aria_MultipleNavigationLandmarks_Implicit:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_navigation_label_unique.html",fail_label_not_unique:"aria_navigation_label_unique.html",group:"aria_navigation_label_unique.html"}},messages:{"en-US":{pass:'The element with "navigation" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "navigation" role do not have unique labels',group:'Each element with "navigation" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var o=l.AriaUtil.isLandmarkNameUnique(n,"navigation",!0);return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},5757(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_parent_required=void 0;var a=i(461),n=i(461),l=i(9910),r=i(7011),o=i(7139),s=i(3946);t.aria_parent_required={id:"aria_parent_required",context:"dom:*[role]",dependencies:["aria_role_allowed"],refactor:{Rpt_Aria_RequiredParent_Native_Host_Sematics:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"aria_parent_required.html",Pass_0:"aria_parent_required.html",Fail_1:"aria_parent_required.html"}},messages:{"en-US":{group:"Each element with an implicit or explicit role must be contained within a valid element",Pass_0:"Rule Passed",Fail_1:'Element with "{0}" role is not contained in or owned by an element with one of the following roles: "{1}"'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:"ff89c9",run:function(e,t,i){var n=e.dom.node;if(!(s.VisUtil.isNodeHiddenFromAT(n)||o.CommonUtil.isNodeDisabled(n)||r.AriaUtil.shouldBePresentationalChild(n)||s.VisUtil.isNodePresentational(n))){for(var u=!0,d=l.ARIADefinitions.designPatterns,c=new Array,m=new Array,p=0,h=i.aria.map(function(e){return e.role}),g=h[h.length-2],b=2;"none"===g;)b++,g=h[h.length-b];var _=r.AriaUtil.getResolvedRole(n);if(d[_]&&null!=d[_].container){p++,u=!1;for(var f=0,v=(m=d[_].container).length;!u&&f<v&&!(u=g===m[f]);f++);0==u&&c.push(_)}var A=new Array;A.push(c.join(", "));var w=new Array;return w.push(m.join(", ")),0==p?null:u?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[A.toString(),w.toString()])}}}},5232(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_region_label_unique=void 0;var a=i(461),n=i(461),l=i(7011),r=i(3946);t.aria_region_label_unique={id:"aria_region_label_unique",context:"aria:region",refactor:{Rpt_Aria_MultipleRegionsUniqueLabel_Implicit:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_region_label_unique.html",fail_label_not_unique:"aria_region_label_unique.html",group:"aria_region_label_unique.html"}},messages:{"en-US":{pass:'The element with "region" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "region" role do not have unique labels',group:'Each element with "region" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var o=l.AriaUtil.isLandmarkNameUnique(n,"region");return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},1891(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_region_labelled=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(3946);t.aria_region_labelled={id:"aria_region_labelled",context:"aria:region",refactor:{Rpt_Aria_RegionLabel_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_region_labelled.html",Fail_1:"aria_region_labelled.html",group:"aria_region_labelled.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Element with "region" role does not have a label',group:'Each element with "region" role must have a label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;return o.VisUtil.isNodeHiddenFromAT(n)?null:l.AriaUtil.hasAriaLabel(n)||r.CommonUtil.attributeNonEmpty(n,"title")?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},6142(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_role_allowed=void 0;var a=i(461),n=i(461),l=i(7011);t.aria_role_allowed={id:"aria_role_allowed",context:"dom:*[role]",refactor:{Rpt_Aria_ValidRole:{Pass_0:"Pass_0",Fail_2:"Fail_2",Potential_1:"Potential_1"}},help:{"en-US":{group:"aria_role_allowed.html",Pass_0:"aria_role_allowed.html",Fail_2:"aria_role_allowed.html",Potential_1:"aria_role_allowed.html"}},messages:{"en-US":{group:"Elements must have a valid 'role' per ARIA specification",Pass_0:"Rule Passed",Fail_2:"The role '{0}' defined on the element is not valid per ARIA specification",Potential_1:"Some of the roles, '{0}', defined on the element are not valid per ARIA specification"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"4.1.2",level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:"674b10",run:function(e,t,i){var n=e.dom.node,r=n.getAttribute("role").trim().toLowerCase();if(0===r.length)return null;if(n.hasAttribute("aria-hidden")&&"true"===n.getAttribute("aria-hidden").toLowerCase())return null;var o=l.AriaUtil.getRolesUndefinedByAria(n);if(!o||0===o.length)return(0,a.RulePass)("Pass_0");var s=r.split(/\s+/);return o.length===s.length?(0,a.RuleFail)("Fail_2",[o.join(",")]):o.length>0?(0,a.RulePotential)("Potential_1",[o.join(",")]):void 0}}},4863(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_role_redundant=void 0;var a=i(461),n=i(461),l=i(7011);t.aria_role_redundant={id:"aria_role_redundant",context:"dom:*[role]",help:{"en-US":{pass:"aria_role_redundant.html",fail_redundant:"aria_role_redundant.html",group:"aria_role_redundant.html"}},messages:{"en-US":{pass:"An explicitly-assigned ARIA role is not redundant with the implicit role of the element",fail_redundant:'The explicitly-assigned ARIA role "{0}" is redundant with the implicit role of the element <{1}>',group:"An explicitly-assigned ARIA role should not be redundant with the implicit role of the element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["ARIA"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,r=n.tagName.toLowerCase(),o=l.AriaUtil.getRoles(n,!1);if(o&&0!==o.length){if(!l.AriaUtil.areRolesDefined(o))return null;var s=l.AriaUtil.getImplicitRole(n);if(!s||0===s.length)return(0,a.RulePass)("pass");for(var u=[],d=0;d<o.length;d++)s.includes(o[d])?u.push((0,a.RuleFail)("fail_redundant",[o[d],r])):u.push((0,a.RulePass)("pass"));return u.length>0?u:null}}}},1440(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_search_label_unique=void 0;var a=i(461),n=i(461),l=i(7011),r=i(3946);t.aria_search_label_unique={id:"aria_search_label_unique",context:"aria:search",refactor:{Rpt_Aria_MultipleSearchLandmarks:{Pass_0:"pass",Fail_1:"fail_label_not_unique"}},help:{"en-US":{pass:"aria_search_label_unique.html",fail_label_not_unique:"aria_search_label_unique.html",group:"aria_search_label_unique.html"}},messages:{"en-US":{pass:'The element with "search" role has a unique label that describes its purpose',fail_label_not_unique:'Multiple elements with "search" role do not have unique labels',group:'Each element with "search" role must have a unique label that describes its purpose'}},rulesets:[{id:[],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var o=l.AriaUtil.isLandmarkNameUnique(n,"search",!0);return null==o?null:o?(0,a.RuleFail)("fail_label_not_unique"):(0,a.RulePass)("pass")}}},1968(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_attribute_valid=t.aria_role_valid=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139);t.aria_role_valid={id:"aria_role_valid",context:"dom:*",dependencies:["aria_attribute_allowed"],refactor:{aria_semantics_role:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_0:"aria_role_valid.html",Fail_1:"aria_role_valid.html",Fail_2:"aria_role_valid.html",group:"aria_role_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The ARIA role '{0}' is not valid for the element <{1}>",Fail_2:"The ARIA role '{0}' is not valid for the element <{1}> and may be ignored by the browser since the element is focusable",group:"ARIA roles must be valid for the element to which they are assigned"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,o=n.tagName.toLowerCase();if(1!==n.nodeType)return null;var s=l.AriaUtil.getRolesUndefinedByAria(n);if(s&&s.length>0)return null;var u=l.AriaUtil.getDeprecatedAriaRoles(n);if(u&&u.length>0)return null;var d=l.AriaUtil.getDeprecatedAriaAttributes(n);if(d&&d.length>0)return null;if(["td","th","tr"].includes(o)){var c=r.CommonUtil.isTableDescendant(i);if(null!==c&&c.length>0)return null}var m=l.AriaUtil.getUserDefinedRoles(n);if(!m||0===m.length)return null;if(m.includes("generic"))return(0,a.RuleFail)("Fail_1",["generic",o]);var p=l.AriaUtil.getInvalidRoles(n);return null===p||0===p.length?(0,a.RulePass)("Pass_0",[m.join(", "),o]):p.includes("presentation")||p.includes("none")&&r.CommonUtil.isTabbable(n)?(0,a.RuleFail)("Fail_2",[p.join(", "),o]):p.length>0?(0,a.RuleFail)("Fail_1",[p.join(", "),o]):m.length>0?(0,a.RulePass)("Pass_0",[m.join(", "),o]):null}},t.aria_attribute_valid={id:"aria_attribute_valid",context:"dom:*",dependencies:["aria_attribute_deprecated","aria_role_valid"],refactor:{aria_attribute_allowed:{Pass:"Pass",Fail_invalid_role_attr:"Fail_invalid_role_attr",Fail_invalid_implicit_role_attr:"Fail_invalid_implicit_role_attr"}},help:{"en-US":{group:"aria_attribute_valid.html",Pass:"aria_attribute_valid.html",Fail_invalid_role_attr:"aria_attribute_valid.html",Fail_invalid_implicit_role_attr:"aria_attribute_valid.html"}},messages:{"en-US":{group:"ARIA attributes should be valid for the element and ARIA role to which they are assigned",Pass:"ARIA attributes are valid for the element and ARIA role",Fail_invalid_role_attr:'The ARIA attributes "{0}" are not valid for the element <{1}> with ARIA role "{2}"',Fail_invalid_implicit_role_attr:'The ARIA attributes "{0}" are not valid for the element <{1}> with implicit ARIA role "{2}"'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["ARIA"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:["5c01ea",{"46ca7f":{Pass:"pass",Fail_invalid_role_attr:"fail",Fail_invalid_implicit_role_attr:"fail"}}],run:function(e,t,i){var n=e.dom.node;if(1!==n.nodeType)return null;var r=l.AriaUtil.getUserDefinedAriaAttributes(n);if(null===r||0===r.length)return null;var o=l.AriaUtil.getUserDefinedRoles(n),s=!0;if(o&&o.length>0){if(!l.AriaUtil.areRolesDefined(o))return null}else o=l.AriaUtil.getImplicitRole(n),s=!1;var u=n.tagName.toLowerCase(),d=l.AriaUtil.getInvalidAriaAttributes(n);return d&&0!==d.length?o.length>0?s?(0,a.RuleFail)("Fail_invalid_role_attr",[d.join(", "),u,o.join(", ")]):(0,a.RuleFail)("Fail_invalid_implicit_role_attr",[d.join(", "),u,o.join(", ")]):(0,a.RuleFail)("Fail_invalid_role_attr",[d.join(", "),u,"none"]):(0,a.RulePass)("Pass",[r.join(", "),u,o.join(", ")])}}},1617(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_toolbar_label_unique=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(4566);t.aria_toolbar_label_unique={id:"aria_toolbar_label_unique",context:"aria:toolbar",refactor:{Rpt_Aria_MultipleToolbarUniqueLabel:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"aria_toolbar_label_unique.html",Fail_1:"aria_toolbar_label_unique.html",group:"aria_toolbar_label_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'Multiple elements with "toolbar" roles do not have unique labels',group:'Each element with "toolbar" role must have a unique label that describes its purpose'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,s=r.CommonUtil.getElementsByRoleHidden(n.ownerDocument,"toolbar",!0,!0);if(0===s.length||1===s.length)return null;var u=o.CacheUtil.getCache(n.ownerDocument,"aria_toolbar_label_unique",null);u||(u=l.AriaUtil.findAriaLabelDupes(s),o.CacheUtil.setCache(n.ownerDocument,"aria_toolbar_label_unique",u));var d=l.AriaUtil.getAriaLabel(n);return""!==d&&(!(d in u)||u[d]<=1)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[d])}}},3475(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.aria_widget_labelled=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(9955),s=i(5279),u=i(9910),d=i(1686);t.aria_widget_labelled={id:"aria_widget_labelled",context:"dom:*",refactor:{Rpt_Aria_WidgetLabels_Implicit:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"aria_widget_labelled.html",Pass_0:"aria_widget_labelled.html",Fail_1:"aria_widget_labelled.html"}},messages:{"en-US":{group:"Interactive component must have a programmatically associated name",Pass_0:"Rule Passed",Fail_1:"Interactive component with ARIA role '{0}' does not have a programmatically associated name"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:"m6b1q3",run:function(e,t,i){var n=e.dom.node;if(n.hasAttribute("type")&&"hidden"===n.getAttribute("type")||l.AriaUtil.getAncestorWithRole(n,"combobox")&&!l.AriaUtil.hasRoleInSemantics(n,"textbox")&&!l.AriaUtil.hasRoleInSemantics(n,"searchbox"))return null;var c=o.ARIAMapper.nodeToRole(n),m=n.nodeName.toLowerCase();if(["button","checkbox","combobox","listbox","menuitemcheckbox","menuitemradio","radio","searchbox","slider","spinbutton","switch","textbox","progressbar","link"].includes(c))return null;if("output"===m||"input"===m&&n.getAttribute("type"),!n.hasAttribute("role")&&-1!=["input","textarea","select","button","datalist","optgroup","option","keygen","output","progress","meter"].indexOf(n.nodeName.toLowerCase()))return null;for(var p=["listbox","tree","grid","dialog"],h=0;h<p.length;h++)if(l.AriaUtil.hasRoleInSemantics(n,p[h]))for(var g=r.CommonUtil.getElementsByRoleHidden(n.ownerDocument,"combobox",!0,!0),b=0;b<g.length;b++){var _=g[b],f=r.CommonUtil.getElementAttribute(_,"aria-owns");if(f)for(var v=r.CommonUtil.normalizeSpacing(f.trim()).split(" "),A=0;A<v.length;A++)if(s.FragmentUtil.getById(n,v[A])===n)return null}for(var w=!0,y=u.ARIADefinitions.designPatterns,C=l.AriaUtil.getRoles(n,!0),k=0,R=["widget","liveRegion","window"],x=(A=0,C.length);w&&A<x;++A){var P=y[C[A]];P&&P.nameRequired&&P.roleType&&R.includes(P.roleType)&&(++k,!(w=l.AriaUtil.hasAriaLabel(n)||r.CommonUtil.attributeNonEmpty(n,"title")||r.CommonUtil.getLabelForElementHidden(n,!0))&&P.nameFrom&&P.nameFrom.indexOf("contents")>=0&&(w=r.CommonUtil.hasInnerContentOrAlt(n)),w||(w=r.CommonUtil.hasImplicitLabel(n)),w||"img"!==n.tagName.toLowerCase()||n.hasAttribute("role")||!n.hasAttribute("alt")||(w=d.DOMUtil.cleanWhitespace(n.getAttribute("alt")).trim().length>0),P.nameFrom.indexOf("prohibited"))}return 0===k?null:w?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[c])}}},3370(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.asciiart_alt_exists=void 0;var a=i(461),n=i(7139);t.asciiart_alt_exists={id:"asciiart_alt_exists",context:"dom:pre, dom:listing, dom:xmp, dom:plaintext",refactor:{RPT_Pre_ASCIIArt:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"asciiart_alt_exists.html",Potential_1:"asciiart_alt_exists.html",group:"asciiart_alt_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that ASCII art has a text alternative",group:"ASCII art must have a text alternative"}},rulesets:[],act:[],run:function(e,t,i){var l=e.dom.node;if("pre"==l.nodeName.toLowerCase()&&(l.previousSibling&&"code"==l.previousSibling.nodeName.toLowerCase()||l.getElementsByTagName("code").length>0||n.CommonUtil.getAncestor(l,"code")))return(0,a.RulePass)("Pass_0");for(var r=!0,o=n.CommonUtil.getInnerText(l),s=0,u=0,d="",c=0;r&&c<o.length;++c){var m=o.substr(c,1);/[\w!@#$%&\*().,?\[\]{}<>=":\/\\-]/.test(m)?d==m?u+=1:u=0:(/\s/.test(m)||(s+=1),u=0),d=m,(s>=5||u>=4)&&(r=!1)}return r?(0,a.RulePass)("Pass_0"):r?void 0:(0,a.RulePotential)("Potential_1")}}},9272(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.blink_css_review=void 0;var a=i(461),n=i(461),l=i(7139);t.blink_css_review={id:"blink_css_review",context:"dom:style, dom:*[style]",refactor:{RPT_Blink_CSSTrigger1:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{group:"blink_css_review.html",Pass_0:"blink_css_review.html",Potential_1:"blink_css_review.html"}},messages:{"en-US":{group:"Do not use the \"blink\" value of the 'text-decoration' property for longer than five seconds",Pass_0:"Rule Passed",Potential_1:"Check the \"blink\" value of the CSS 'text-decoration' property is not used for more than than five seconds"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"2.2.2",level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node,r=l.CommonUtil.getInnerText(n);n.hasAttribute("style")&&(r=n.getAttribute("style"));var o=-1==r.toLowerCase().indexOf("text-decoration:blink");return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},7735(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.blink_elem_deprecated=void 0;var a=i(461),n=i(461);t.blink_elem_deprecated={id:"blink_elem_deprecated",context:"dom:blink",refactor:{WCAG20_Blink_AlwaysTrigger:{Fail_1:"Fail_1"}},help:{"en-US":{group:"blink_elem_deprecated.html",Fail_1:"blink_elem_deprecated.html"}},messages:{"en-US":{group:"Content that blinks persistently must not be used",Fail_1:"Content found that blinks persistently"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"2.2.2",level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){return(0,a.RuleFail)("Fail_1")}}},3923(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.blockquote_cite_exists=void 0;var a=i(461),n=i(461),l=i(7139);t.blockquote_cite_exists={id:"blockquote_cite_exists",context:"dom:blockquote",refactor:{RPT_Blockquote_HasCite:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"blockquote_cite_exists.html",Potential_1:"blockquote_cite_exists.html",group:"blockquote_cite_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that <blockquote> should have a 'cite' attribute and not be used for indentation only",group:"Use <blockquote> only for quotations, not indentation"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,r=l.CommonUtil.attributeNonEmpty(n,"cite");if(!r){var o=l.CommonUtil.getDocElementsByTag(n,"cite");r=null!=o&&o.length>0}return r?(0,a.RulePass)("Pass_0"):r?void 0:(0,a.RulePotential)("Potential_1")}}},7521(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.canvas_content_described=void 0;var a=i(461),n=i(461),l=i(3946);t.canvas_content_described={id:"canvas_content_described",context:"dom:canvas",refactor:{HAAC_Canvas:{Pass_0:"Pass_0",Manual_1:"Manual_1"}},help:{"en-US":{Pass_0:"canvas_content_described.html",Manual_1:"canvas_content_described.html",group:"canvas_content_described.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Manual_1:"Verify accessibility of the <canvas> element",group:"The <canvas> element may not be accessible"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1","2.1.1","4.1.2"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var r=n.innerHTML.trim().length>0;return r?(0,a.RulePass)("Pass_0"):r?void 0:(0,a.RuleManual)("Manual_1")}}},1852(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.caption_track_exists=void 0;var a=i(461),n=i(461);t.caption_track_exists={id:"caption_track_exists",context:"dom:video",refactor:{HAAC_Video_HasNoTrack:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"caption_track_exists.html",Potential_1:"caption_track_exists.html",group:"caption_track_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that captions are available for any meaningful audio or provide a caption track for the <video> element",group:"A <video> element must have a text alternative for any meaningful audio content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.2.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,l=!1;if("true"===n.getAttribute("aria-hidden"))return null;for(var r=n.getElementsByTagName("track"),o=0;o<r.length;++o)l=l||"captions"===r[o].getAttribute("kind");if(n.textTracks&&n.textTracks.length>0)for(o=0;o<n.textTracks.length;o++)l=l||"captions"===n.textTracks[o].kind;return l?(0,a.RulePass)("Pass_0"):(0,a.RulePotential)("Potential_1")}}},799(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.combobox_active_descendant=void 0;var a=i(461),n=i(461),l=i(7011),r=i(5279),o=i(3864),s=i(4566),u=i(3946);t.combobox_active_descendant={id:"combobox_active_descendant",context:"aria:combobox",dependencies:["combobox_popup_reference"],help:{"en-US":{Pass:"combobox_active_descendant.html",Fail_missing:"combobox_active_descendant.html",Fail_not_in_popup:"combobox_active_descendant.html",Fail_active_role_invalid:"combobox_active_descendant.html",Fail_active_not_selected:"combobox_active_descendant.html",group:"combobox_active_descendant.html"}},messages:{"en-US":{Pass:"'aria-activedescendant' is used appropriately for this combobox",Fail_missing:"The element referenced by 'aria-activedescendant' \"{0}\" does not exist",Fail_not_in_popup:"The element referenced by 'aria-activedescendant' \"{0}\" does not exist within the popup referenced by 'id' \"{1}\"",Fail_active_role_invalid:"The 'aria-activedescendant' \"{0}\" references an element with the roles \"{1}\", which does not have a valid ARIA role of 'option', 'gridcell', 'row', or 'treeitem'",Fail_active_not_selected:"The 'aria-activedescendant' \"{0}\" references an element that does not have 'aria-selected' set to true",group:"'aria-activedescendant' must be used to define focus within the combobox popup, except when using a dialog popup"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,d=s.CacheUtil.getCache(n.ownerDocument,"combobox",{});if(!d)return null;var c=d[e.dom.rolePath];if(!c)return null;var m=c.popupElement,p=c.popupId;if(!m)return null;var h=n.getAttribute("aria-activedescendant");if(!h||0===h.trim().length)return null;var g=r.FragmentUtil.getById(n,h);if(!g)return(0,a.RuleFail)("Fail_missing",[h]);var b=!1;if(m)for(var _=new o.DOMWalker(m);!b&&_.nextNode()&&_.node!=m&&_.node!=m.nextSibling;)1===_.node.nodeType&&u.VisUtil.isNodeVisible(_.node)&&(b=_.elem().getAttribute("id")===h);var f=[];b||f.push((0,a.RulePass)("Fail_not_in_popup",[h,p]));var v=l.AriaUtil.getRoles(g,!0);return 0===["option","gridcell","row","treeitem"].filter(function(e){return v.includes(e)}).length&&f.push((0,a.RuleFail)("Fail_active_role_invalid",[h,v.join(",")])),"true"!==g.getAttribute("aria-selected")&&f.push((0,a.RuleFail)("Fail_active_not_selected",[h])),0===f.length?(0,a.RulePass)("Pass"):f}}},4614(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.combobox_autocomplete_valid=void 0;var a=i(461),n=i(461),l=i(3864),r=i(4566),o=i(3946);t.combobox_autocomplete_valid={id:"combobox_autocomplete_valid",context:"aria:combobox",dependencies:["combobox_popup_reference"],refactor:{combobox_autocomplete:{Pass:"Pass",Fail_1:"Fail_1",Fail_inline:"Fail_inline"}},help:{"en-US":{Pass:"combobox_autocomplete_valid.html",Fail_1:"combobox_autocomplete_valid.html",Fail_inline:"combobox_autocomplete_valid.html",group:"combobox_autocomplete_valid.html"}},messages:{"en-US":{Pass:"The combobox does not use 'aria-autocomplete' value '\"inline\"' nor does it have 'aria-autocomplete' defined within the popup",Fail_1:"The combobox has the 'aria-autocomplete' attribute incorrectly set on an element within the popup referenced by \"{0}\"",Fail_inline:"The combobox does not support an 'aria-autocomplete' attribute value set to '\"inline\"' ",group:"A combobox that supports autocompletion behavior must have the 'aria-autocomplete' attribute only on its text input element with a valid value; a value of '\"inline\"' is not supported"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,s=r.CacheUtil.getCache(n.ownerDocument,"combobox",{});if(!s)return null;var u=s[e.dom.rolePath];if(!u)return null;var d=u.popupId,c=u.popupElement,m=[];"inline"===n.getAttribute("aria-autocomplete")&&m.push((0,a.RuleFail)("Fail_inline"));var p=!0;if(c&&o.VisUtil.isNodeVisible(c)&&(p=!c.hasAttribute("aria-autocomplete"))&&c.children&&c.children.length>0)for(var h=new l.DOMWalker(c);p&&h.nextNode()&&(1!==h.node.nodeType||!o.VisUtil.isNodeVisible(h.node)||(p=!h.elem().hasAttribute("aria-autocomplete"),!h.bEndTag||h.node!==c.lastElementChild)););return p||m.push((0,a.RuleFail)("Fail_1",[d])),m.length>0?m:(0,a.RulePass)("Pass")}}},5952(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.combobox_design_valid=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(3946),s=i(4566);t.combobox_design_valid={id:"combobox_design_valid",context:"aria:combobox",refactor:{combobox_version:{"Pass_1.0":"Pass_1.0","Fail_1.1":"Fail_1.1","Pass_1.2":"Pass_1.2"}},help:{"en-US":{"Pass_1.0":"combobox_design_valid.html","Fail_1.1":"combobox_design_valid.html","Pass_1.2":"combobox_design_valid.html",group:"combobox_design_valid.html"}},messages:{"en-US":{"Pass_1.0":"The combobox design pattern is detected as ARIA 1.0, which is allowed by ARIA 1.2","Fail_1.1":"The combobox design pattern is detected as ARIA 1.1, which is not allowed by ARIA 1.2","Pass_1.2":"The combobox design pattern is detected as ARIA 1.2",group:"The combobox design pattern must be valid for ARIA 1.2"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(!o.VisUtil.isNodeVisible(n)||r.CommonUtil.isNodeDisabled(n))return null;var u,d="select"===(u=n).tagName.toLowerCase()&&"combobox"!==u.getAttribute("role")?"implicit":"input"!==u.nodeName.toLowerCase()||u.hasAttribute("type")&&"text"!==u.getAttribute("type")||!u.hasAttribute("aria-owns")||u.hasAttribute("aria-controls")?"input"!==u.nodeName.toLowerCase()&&u.hasAttribute("aria-owns")&&!u.hasAttribute("aria-controls")?"1.1":"1.2":"1.0";if("implicit"===d)return null;var c=n.tagName.toLowerCase(),m="true"===(l.AriaUtil.getAriaAttribute(n,"aria-expanded")||"").trim().toLowerCase(),p="input"===c&&(!n.hasAttribute("type")||"text"===n.getAttribute("type").toLowerCase()),h=e.dom.rolePath;if(!h)return null;var g=s.CacheUtil.getCache(n.ownerDocument,"combobox",{});return g?(g[h]={inputElement:p?n:null,pattern:d,expanded:m},s.CacheUtil.setCache(n.ownerDocument,"combobox",g),"1.0"===d?(0,a.RulePass)("Pass_1.0"):"1.1"===d?(0,a.RuleFail)("Fail_1.1"):"1.2"===d?(0,a.RulePass)("Pass_1.2"):void 0):null}}},5395(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.combobox_focusable_elements=void 0;var a=i(461),n=i(461),l=i(3864),r=i(7011),o=i(7139),s=i(4566),u=i(3946);t.combobox_focusable_elements={id:"combobox_focusable_elements",context:"aria:combobox",dependencies:["combobox_popup_reference"],help:{"en-US":{Pass:"combobox_focusable_elements.html",Fail_not_tabbable:"combobox_focusable_elements.html",Fail_tabbable_child:"combobox_focusable_elements.html",group:"combobox_focusable_elements.html"}},messages:{"en-US":{Pass:"DOM focus is allowed only on the combobox element as required",Fail_not_tabbable:"The combobox element does not allow DOM focus as required",Fail_tabbable_child:"The popup of the combobox has DOM focus or has 'aria-activedescendant' defined, which is not allowed",group:"Tabbable focus for the combobox must be allowed only on the text input, except when using a dialog popup"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,d=s.CacheUtil.getCache(n.ownerDocument,"combobox",{});if(!d)return null;var c=d[e.dom.rolePath];if(!c)return null;var m=c.popupElement,p=c.expanded;if(!m)return null;var h=r.AriaUtil.getRoles(m,!0)[0],g=[];if(o.CommonUtil.isTabbable(n)||g.push((0,a.RuleFail)("Fail_not_tabbable")),!1===p||"dialog"===h)return(0,a.RulePass)("Pass");var b=!0;if(m&&u.VisUtil.isNodeVisible(m)&&(b=!o.CommonUtil.isTabbable(m)&&!r.AriaUtil.getAriaAttribute(m,"aria-activedescendant"))&&m.children&&m.children.length>0)for(var _=new l.DOMWalker(m);b&&_.nextNode()&&(1!==_.node.nodeType||!u.VisUtil.isNodeVisible(_.node)||(b=!o.CommonUtil.isTabbable(_.node)&&!r.AriaUtil.getAriaAttribute(_.node,"aria-activedescendant"),!_.bEndTag||_.node!==m.lastElementChild)););return b||g.push((0,a.RuleFail)("Fail_tabbable_child")),0===g.length?(0,a.RulePass)("Pass"):g}}},1992(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.combobox_haspopup_valid=void 0;var a=i(461),n=i(461),l=i(7011),r=i(4566);t.combobox_haspopup_valid={id:"combobox_haspopup_valid",context:"aria:combobox",dependencies:["combobox_popup_reference"],refactor:{combobox_haspopup:{Pass:"Pass",Fail_popup_role_invalid:"Fail_popup_role_invalid",Fail_combobox_popup_role_mismatch:"Fail_combobox_popup_role_mismatch"}},help:{"en-US":{Pass:"combobox_haspopup_valid.html",Fail_popup_role_invalid:"combobox_haspopup_valid.html",Fail_combobox_popup_role_mismatch:"combobox_haspopup_valid.html",group:"combobox_haspopup_valid.html"}},messages:{"en-US":{Pass:"The 'aria-controls' (ARIA 1.2) or 'aria-owns' (ARIA 1.0) appropriately references a valid popup 'id' value",Fail_popup_role_invalid:'The \'role\' value "{0}" of the popup element "{1}" should be one of "listbox", "grid", "tree" or "dialog"',Fail_combobox_popup_role_mismatch:"The value of the combobox 'aria-haspopup' attribute \"{0}\" does not match the 'role' value of the popup element \"{1}\"",group:"The combobox attribute 'aria-haspopup' value must be appropriate for the role of the element referenced by 'aria-controls' (ARIA 1.2) or 'aria-owns' (ARIA 1.0)"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,o=r.CacheUtil.getCache(n.ownerDocument,"combobox",{});if(!o)return null;var s=o[e.dom.rolePath];if(!s)return null;var u=s.popupElement,d=s.popupId;if(!u)return null;var c=l.AriaUtil.getRoles(u,!0),m=["listbox","grid","tree","dialog"].filter(function(e){return c.includes(e)});if(0===m.length)return(0,a.RuleFail)("Fail_popup_role_invalid",[c.join(","),d]);var p=m[0],h=n.getAttribute("aria-haspopup")||"listbox";return h===p||"listbox"===p&&!n.hasAttribute("aria-haspopup")?(0,a.RulePass)("Pass"):(0,a.RuleFail)("Fail_combobox_popup_role_mismatch",[h,p])}}},7955(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.combobox_popup_reference=void 0;var a=i(461),n=i(461),l=i(5279),r=i(4566),o=i(3946);t.combobox_popup_reference={id:"combobox_popup_reference",context:"aria:combobox",dependencies:["combobox_design_valid"],help:{"en-US":{group:"combobox_popup_reference.html","Pass_1.0_expanded":"combobox_popup_reference.html","Pass_1.0_collapsed":"combobox_popup_reference.html","Pass_1.2_expanded":"combobox_popup_reference.html","Pass_1.2_collapsed":"combobox_popup_reference.html","Fail_1.0_missing_owns":"combobox_popup_reference.html","Fail_1.2_missing_controls":"combobox_popup_reference.html","Fail_1.0_popup_reference_missing":"combobox_popup_reference.html","Fail_1.2_popup_reference_missing":"combobox_popup_reference.html",Fail_combobox_expanded_hidden:"combobox_popup_reference.html",Fail_combobox_collapsed_visible:"combobox_popup_reference.html"}},messages:{"en-US":{group:"The 'aria-controls' (for ARIA 1.2) or the 'aria-owns' (for ARIA 1.0) attribute of the expanded combobox must reference a valid popup 'id' value","Pass_1.0_expanded":"The combobox popup referenced by 'aria-owns' (ARIA 1.0) exists and is visible","Pass_1.0_collapsed":"The combobox popup in its collapsed state does not reference any visible popup as required","Pass_1.2_expanded":"The combobox popup referenced by 'aria-controls' (ARIA 1.2) exists and is visible","Pass_1.2_collapsed":"The combobox popup in its collapsed state does not reference any visible popup as required","Fail_1.0_missing_owns":"The 'aria-owns' attribute of the expanded combobox is missing","Fail_1.2_missing_controls":"The 'aria-controls' attribute of the expanded combobox is missing","Fail_1.0_popup_reference_missing":"The 'aria-owns' attribute \"{0}\" of the expanded combobox does not reference a valid popup 'id' value","Fail_1.2_popup_reference_missing":"The 'aria-controls' attribute \"{0}\" of the expanded combobox does not reference a valid popup 'id' value",Fail_combobox_expanded_hidden:"The combobox 'aria-expanded' attribute is true, but the combobox popup is not visible",Fail_combobox_collapsed_visible:"The combobox 'aria-expanded' attribute is false, but the combobox popup is visible"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[{"4e8ab6":{"Pass_1.0_expanded":"fail","Pass_1.0_collapsed":"fail","Pass_1.2_expanded":"pass","Pass_1.2_collapsed":"pass","Fail_1.0_missing_owns":"inapplicable","Fail_1.2_missing_controls":"fail","Fail_1.0_popup_reference_missing":"inapplicable","Fail_1.2_popup_reference_missing":"fail",Fail_combobox_expanded_hidden:"inapplicable",Fail_combobox_collapsed_visible:"inapplicable"}}],run:function(e,t,i){var n=e.dom.node,s=r.CacheUtil.getCache(n.ownerDocument,"combobox",{});if(!s)return null;var u=s[e.dom.rolePath];if(!u)return null;var d,c,m=u.pattern,p=u.expanded;if("1.0"===m){if(!n.hasAttribute("aria-owns"))return p?(0,a.RuleFail)("Fail_1.0_missing_owns"):null;if(d=n.getAttribute("aria-owns"),!(c=l.FragmentUtil.getById(n,d)))return p?(0,a.RuleFail)("Fail_1.0_popup_reference_missing",[d]):null}else{if("1.2"!==m)return null;if(!n.hasAttribute("aria-controls"))return p?(0,a.RuleFail)("Fail_1.2_missing_controls"):null;if(d=n.getAttribute("aria-controls"),!(c=l.FragmentUtil.getById(n,d)))return p?(0,a.RuleFail)("Fail_1.2_popup_reference_missing",[d]):null}return u.popupId=d,u.popupElement=c,p&&!o.VisUtil.isNodeVisible(c)?(0,a.RuleFail)("Fail_combobox_expanded_hidden"):!p&&o.VisUtil.isNodeVisible(c)?(0,a.RuleFail)("Fail_combobox_collapsed_visible"):"1.0"===m?p?(0,a.RulePass)("Pass_1.0_expanded"):(0,a.RulePass)("Pass_1.0_collapsed"):p?(0,a.RulePass)("Pass_1.2_expanded"):(0,a.RulePass)("Pass_1.2_collapsed")}}},9531(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.debug_paths=void 0;var a=i(461);t.debug_paths={id:"debug_paths",context:"dom:*",help:{"en-US":{group:"",Pass_0:""}},messages:{"en-US":{group:"",Pass_0:""}},rulesets:[{id:["DEBUG"],num:"1",level:a.eRulePolicy.INFORMATION,toolkitLevel:a.eToolkitLevel.LEVEL_FOUR}],act:[],run:function(e,t,i){var a=e.dom.node;return a.setAttribute("domPath",e.dom.rolePath),a.setAttribute("ariaPath",e.aria.rolePath),null}}},891(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.detector_tabbable=void 0;var a=i(7139),n=i(461),l=i(461);t.detector_tabbable={id:"detector_tabbable",context:"dom:*",help:{"en-US":{group:"",Pass_0:""}},messages:{"en-US":{group:"",Pass_0:""}},rulesets:[{id:["EXTENSIONS"],num:"1",level:l.eRulePolicy.INFORMATION,toolkitLevel:l.eToolkitLevel.LEVEL_FOUR}],act:[],run:function(e,t,i){var l=e.dom.node;if(!a.CommonUtil.isTabbable(l))return null;var r=i.aria[i.aria.length-1];return(0,n.RulePass)("Pass_0",[],[{name:r.attributes.name,role:r.role,tabindex:parseInt(l.getAttribute("tabindex")||"0")}])}}},7446(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.dir_attribute_valid=void 0;var a=i(461),n=i(461);t.dir_attribute_valid={id:"dir_attribute_valid",context:"dom:*[dir]",refactor:{Valerie_Elem_DirValid:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"dir_attribute_valid.html",Fail_1:"dir_attribute_valid.html",group:"dir_attribute_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Invalid value used for the 'dir' attribute",group:'\'dir\' attribute value must be "ltr", "rtl", or "auto"'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node.getAttribute("dir").toLowerCase();return"ltr"==n||"rtl"==n||"auto"==n?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},6137(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.download_keyboard_controllable=void 0;var a=i(461),n=i(461),l=i(7139),r=i(3946);t.download_keyboard_controllable={id:"download_keyboard_controllable",context:"dom:a[href],dom:area[href]",refactor:{HAAC_Media_DocumentTrigger2:{Manual_1:"Manual_1"}},help:{"en-US":{Manual_1:"download_keyboard_controllable.html",group:"download_keyboard_controllable.html"}},messages:{"en-US":{Manual_1:"Verify that the file download mechanism does not cause a keyboard trap",group:"File download mechanisms should be keyboard-operable and preserve page focus location"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.2"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var o=n.getAttribute("href"),s=l.CommonUtil.getFileExt(o),u=![".docx",".doc",".pdf",".odt"].includes(s);return u?null:u?void 0:(0,a.RuleManual)("Manual_1")}}},6839(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.draggable_alternative_exists=void 0;var a=i(7139),n=i(461),l=i(461),r=i(3946);t.draggable_alternative_exists={id:"draggable_alternative_exists",context:"dom:*[draggable]",dependencies:[],help:{"en-US":{group:"draggable_alternative_exists.html",pass_undraggable:"draggable_alternative_exists.html",potential_alternative:"draggable_alternative_exists.html"}},messages:{"en-US":{group:'A draggable element must have a "single pointer" alternative',pass_undraggable:'The element "{0}" is not draggable',potential_alternative:'Ensure the draggable element "{0}" has a "single pointer" alternative'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_2"],num:["2.5.7"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node;if(!r.VisUtil.isNodeVisible(l))return null;var o=l.nodeName.toLocaleLowerCase();return null!==a.CommonUtil.getAncestor(l,["pre","code","script","meta"])||"body"===o||"html"===o?null:"true"===l.getAttribute("draggable")?(0,n.RulePotential)("potential_alternative",[o]):"false"===l.getAttribute("draggable")?(0,n.RulePass)("pass_undraggable",[o]):null}}},8135(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_accesskey_labelled=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(3946),s=i(9910),u=i(1950);t.element_accesskey_labelled={id:"element_accesskey_labelled",context:"dom:*[accesskey]",refactor:{HAAC_Accesskey_NeedLabel:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"element_accesskey_labelled.html",Potential_1:"element_accesskey_labelled.html",group:"element_accesskey_labelled.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"The element with an assigned 'accesskey' attribute does not have an associated label",group:"An element with an assigned 'accesskey' attribute must have an associated label"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.3.2"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(o.VisUtil.isNodeVisible(n)&&!r.CommonUtil.isNodeDisabled(n)&&!r.CommonUtil.isTabbable(n)){var d=l.AriaUtil.getRoles(n,!0);if(d&&0!==d.length){var c=s.ARIADefinitions.designPatterns[d[0]];if(c&&c.nameFrom&&!c.nameRequired&&c.nameFrom&&!c.nameFrom.includes("prohibited")&&(!n.parentElement||"fieldset"!==n.parentElement.nodeName.toLowerCase())){var m=u.AccNameUtil.computeAccessibleName(n);return m&&m.name&&m.name.trim().length>0?(0,a.RulePass)("Pass_0"):(0,a.RulePotential)("Potential_1")}}}}}},507(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_accesskey_unique=void 0;var a=i(461),n=i(461),l=i(4566);t.element_accesskey_unique={id:"element_accesskey_unique",context:"dom:*[accesskey]",refactor:{WCAG20_Elem_UniqueAccessKey:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"element_accesskey_unique.html",Fail_1:"element_accesskey_unique.html",group:"element_accesskey_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"'accesskey' attribute value on the element is not unique",group:"'accesskey' attribute values on each element must be unique for the page"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["HTML"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,r=l.CacheUtil.getCache(n.ownerDocument,"element_accesskey_unique",{}),o=n.getAttribute("accesskey"),s=!(o in r);return r[o]=!0,s?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},3566(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_attribute_deprecated=void 0;var a=i(461),n=i(461),l=["applet","basefont","center","dir","font","isindex","listing","plaintext","spacer","s","strike","u","xmp","acronym","frame","frameset","noframes","noembed","big","blink","marquee","tt"],r=["align","link","archive","background","bgcolor","clear","code","color","compact","face","hspace","language","link","noshade","nowrap","object","prompt","start","text","version","vlink","vspace"],o={td:["height","width","abbr","axis","char","charoff","height","nowrap","valign","width","align","bgcolor"],th:["height","width","abbr","axis","charoff","height","bgcolor","align","nowrap","char","valign","width"],li:["type","value","type"],ul:["type","compact"],pre:["width"],meta:["http-equiv"],a:["charset","coords","shape","rev","scheme"],link:["rev","charset","target"],img:["name","longdesc","align","hspace","vspace","border"],area:["nohref"],head:["profile"],html:["version"],iframe:["longdesc","align","frameborder","marginheight","marginwidth","scrolling"],object:["archive","code","codebase","codetype","declare","standby","align","hspace","vspace","border"],param:["type","valuetype"],script:["language"],body:["alink","background","bgcolor","link","text","vlink"],br:["clear"],caption:["align"],col:["align","char","charoff","valign","width"],div:["align"],dl:["compact"],hr:["align","noshade","size","width","align"],h2:["align"],h3:["align"],h4:["align"],h5:["align"],h6:["align"],input:["align","usemap"],legend:["align"],menu:["compact"],ol:["compact","type","type"],p:["align"],table:["bgcolor","cellpadding","cellspacing","frame","rules","width","align"],tbody:["align","char","valign","charoff"],tfoot:["align","charoff","char","valign"],thead:["char","charoff","valign","align"],tr:["align","bgcolor","char","charoff","valign"]};t.element_attribute_deprecated={id:"element_attribute_deprecated",context:"dom:applet, dom:basefont, dom:center, dom:dir, dom:font, dom:isindex, dom:listing, dom:menu, dom:plaintext, dom:spacer, dom:s, dom:strike, dom:u, dom:xmp, dom:acronym, dom:frame, dom:frameset, dom:noframes, dom:noembed, dom:big, dom:blink, dom:marquee, dom:ttNaNdom:*[align], dom:*[link], dom:*[archive], dom:*[background], dom:*[bgcolor], dom:*[clear], dom:*[code], dom:*[color], dom:*[compact], dom:*[face], dom:*[hspace], dom:*[language], dom:*[link], dom:*[noshade], dom:*[nowrap], dom:*[object], dom:*[prompt], dom:*[start], dom:*[text], dom:*[version], dom:*[vlink], dom:*[vspace]NaNdom:td[height], dom:td[width], dom:td[abbr], dom:td[axis], dom:td[char], dom:td[charoff], dom:td[height], dom:td[nowrap], dom:td[valign], dom:td[width], dom:td[align], dom:td[bgcolor], dom:th[height], dom:th[width], dom:th[abbr], dom:th[axis], dom:th[charoff], dom:th[height], dom:th[bgcolor], dom:th[align], dom:th[nowrap], dom:th[char], dom:th[valign], dom:th[width], dom:li[type], dom:li[value], dom:li[type], dom:ul[type], dom:ul[compact], dom:pre[width], dom:meta[http-equiv], dom:a[charset], dom:a[coords], dom:a[shape], dom:a[rev], dom:a[scheme], dom:link[rev], dom:link[charset], dom:link[target], dom:img[name], dom:img[longdesc], dom:img[align], dom:img[hspace], dom:img[vspace], dom:img[border], dom:area[nohref], dom:head[profile], dom:html[version], dom:iframe[longdesc], dom:iframe[align], dom:iframe[frameborder], dom:iframe[marginheight], dom:iframe[marginwidth], dom:iframe[scrolling], dom:object[archive], dom:object[code], dom:object[codebase], dom:object[codetype], dom:object[declare], dom:object[standby], dom:object[align], dom:object[hspace], dom:object[vspace], dom:object[border], dom:param[type], dom:param[valuetype], dom:script[language], dom:body[alink], dom:body[background], dom:body[bgcolor], dom:body[link], dom:body[text], dom:body[vlink], dom:br[clear], dom:caption[align], dom:col[align], dom:col[char], dom:col[charoff], dom:col[valign], dom:col[width], dom:div[align], dom:dl[compact], dom:hr[align], dom:hr[noshade], dom:hr[size], dom:hr[width], dom:hr[align], dom:h2[align], dom:h3[align], dom:h4[align], dom:h5[align], dom:h6[align], dom:input[align], dom:input[usemap], dom:legend[align], dom:menu[compact], dom:ol[compact], dom:ol[type], dom:ol[type], dom:p[align], dom:table[bgcolor], dom:table[cellpadding], dom:table[cellspacing], dom:table[frame], dom:table[rules], dom:table[width], dom:table[align], dom:tbody[align], dom:tbody[char], dom:tbody[valign], dom:tbody[charoff], dom:tfoot[align], dom:tfoot[charoff], dom:tfoot[char], dom:tfoot[valign], dom:thead[char], dom:thead[charoff], dom:thead[valign], dom:thead[align], dom:tr[align], dom:tr[bgcolor], dom:tr[char], dom:tr[charoff], dom:tr[valign]",help:{"en-US":{pass:"element_attribute_deprecated.html",fail_elem:"element_attribute_deprecated.html",fail_attr:"element_attribute_deprecated.html",fail_elem_attr:"element_attribute_deprecated.html",group:"element_attribute_deprecated.html"}},messages:{"en-US":{pass:"Rule Passed",fail_elem:"The <{0}> element is deprecated in HTML 5",fail_attr:'The HTML attribute(s) "{0}" is deprecated in HTML 5',fail_elem_attr:'The HTML attribute(s) "{0}" is deprecated for the <{1}> element in HTML 5',group:"Avoid use of obsolete features if possible"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["HTML"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if("tbody"===n.nodeName.toLowerCase()&&n.hasAttribute("align"))return(0,a.RulePass)("pass");if(n.nodeName.includes("-"))return null;var s=n.nodeName.toLowerCase();if(l.includes(s))return(0,a.RuleFail)("fail_elem",[s]);for(var u=n.getAttributeNames(),d="",c=0,m=u;c<m.length;c++){var p=m[c];r.includes(p)&&(""!==d&&(d+=", "),d+=p)}if(""!==d)return(0,a.RuleFail)("fail_attr",[d]);if(d="",s in o){for(var h=0,g=u;h<g.length;h++)p=g[h],o[s]&&o[s].includes(p)&&(""!==d&&(d+=", "),d+=p);if(""!==d)return(0,a.RuleFail)("fail_elem_attr",[d,s])}return(0,a.RulePass)("pass")}}},5173(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_id_unique=void 0;var a=i(461),n=i(461),l=i(5279);t.element_id_unique={id:"element_id_unique",context:"dom:*[id]",refactor:{RPT_Elem_UniqueId:{Pass_0:"pass",Fail_1:"potential_empty",Fail_2:"potential_in_use"}},help:{"en-US":{group:"element_id_unique.html",pass:"element_id_unique.html",potential_empty:"element_id_unique.html",potential_in_use:"element_id_unique.html"}},messages:{"en-US":{group:"Element 'id' attribute values must be unique within a document",pass:"Rule Passed",potential_empty:'The <{0}> element has the id "{1}" that is empty',potential_in_use:'The <{0}> element has the id "{1}" that is already in use'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["HTML"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[{"3ea0c8":{pass:"pass",potential_empty:"pass",potential_in_use:"fail"}}],run:function(e,t,i){var n=e.dom.node,r=n.getAttribute("id");return""===r?(0,a.RulePotential)("potential_empty",[n.nodeName.toLowerCase(),r]):l.FragmentUtil.getById(n,r)===n?(0,a.RulePass)("pass"):(0,a.RulePotential)("potential_in_use",[n.nodeName.toLowerCase(),r])}}},6027(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_lang_valid=t.html_lang_valid=void 0;var a=i(461),n=i(461),l=i(1043),r=i(3946),o=i(3864),s=i(1950),u=function(e){var t=e.dom.node,i=t.nodeName.toLowerCase();if(t.hasAttribute("lang"))if("html"!==i&&""===t.getAttribute("lang"));else{var a=t.getAttribute("lang");if(!l.LangUtil.validPrimaryLang(a))return 1;if(!l.LangUtil.isBcp47(a))return 2}if(t.hasAttribute("xml:lang"))if("html"!==i&&""===t.getAttribute("xml:lang"));else{if(a=t.getAttribute("xml:lang"),!l.LangUtil.validPrimaryLang(a))return 3;if(!l.LangUtil.isBcp47(a))return 4}return 0};t.html_lang_valid={id:"html_lang_valid",context:"dom:html[lang], dom:html[xml:lang]",help:{"en-US":{Pass_0:"html_lang_valid.html",Fail_1:"html_lang_valid.html",Fail_2:"html_lang_valid.html",Fail_3:"html_lang_valid.html",Fail_4:"html_lang_valid.html",group:"html_lang_valid.html"}},messages:{"en-US":{Pass_0:"Lang has a valid primary lang and conforms to BCP 47",Fail_1:"Specified 'lang' attribute does not include a valid primary language",Fail_2:"Specified 'lang' attribute does not conform to BCP 47",Fail_3:"Specified 'xml:lang' attribute does not include a valid primary language",Fail_4:"Specified 'xml:lang' attribute does not conform to BCP 47",group:"The default human language of the page must be valid and specified in accordance with BCP 47"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[{b5c3f8:{Pass_0:"pass",Fail_1:"fail",Fail_2:"inapplicable",Fail_3:"inapplicable",Fail_4:"inapplicable"},bf051a:{Pass_0:"pass",Fail_1:"fail",Fail_2:"pass",Fail_3:"fail",Fail_4:"inapplicable"}}],run:function(e,t,i){var n=u(e);return[(0,a.RulePass)("Pass_0"),(0,a.RuleFail)("Fail_1"),(0,a.RuleFail)("Fail_2"),(0,a.RuleFail)("Fail_3"),(0,a.RuleFail)("Fail_4")][n]}},t.element_lang_valid={id:"element_lang_valid",context:"dom:*[lang], dom:*[xml:lang]",help:{"en-US":{Pass_0:"element_lang_valid.html",Fail_1:"element_lang_valid.html",Fail_2:"element_lang_valid.html",Fail_3:"element_lang_valid.html",Fail_4:"element_lang_valid.html",group:"element_lang_valid.html"}},messages:{"en-US":{Pass_0:"Lang has a valid primary lang and conforms to BCP 47",Fail_1:"Specified 'lang' attribute does not include a valid primary language",Fail_2:"Specified 'lang' attribute does not conform to BCP 47",Fail_3:"Specified 'xml:lang' attribute does not include a valid primary language",Fail_4:"Specified 'xml:lang' attribute does not conform to BCP 47",group:"The change in language of specific content must be valid and specified in accordance with BCP 47"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[{de46e4:{Pass_0:"pass",Fail_1:"fail",Fail_2:"pass",Fail_3:"inapplicable",Fail_4:"inapplicable"}}],run:function(e,t,i){var n=e.dom.node;if("html"===n.nodeName.toLowerCase())return null;var l=u(e),d=[(0,a.RulePass)("Pass_0"),(0,a.RuleFail)("Fail_1"),(0,a.RuleFail)("Fail_2"),(0,a.RuleFail)("Fail_3"),(0,a.RuleFail)("Fail_4")][l];if(d.value[1]!==a.eRuleConfidence.PASS){var c=!1;if(null!==n.firstChild)for(var m=new o.DOMWalker(n,!1,n,!0);!c&&m.nextNode();)if(1===m.node.nodeType){var p=m.node;if(!r.VisUtil.isNodeVisible(p)||p.hasAttribute("lang"))m.bEndTag=!0;else{var h=s.AccNameUtil.computeAccessibleName(p);c=c||"img"===p.nodeName.toLowerCase()&&h&&h.name&&h.name.trim().length>0}}else c=c||3===m.node.nodeType&&m.node.nodeValue.trim().length>0;if(!c)return null}return d}}},7515(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_mouseevent_keyboard=void 0;var a=i(461),n=i(461);t.element_mouseevent_keyboard={id:"element_mouseevent_keyboard",context:"dom:*[ondblclick], dom:*[onmousemove], dom:*[onmousedown], dom:*[onmouseup], dom:*[onmouseover], dom:*[onmouseout], dom:*[onclick]",refactor:{RPT_Elem_EventMouseAndKey:{Pass_0:"Pass_0",Manual_1:"Manual_1"}},help:{"en-US":{Pass_0:"element_mouseevent_keyboard.html",Manual_1:"element_mouseevent_keyboard.html",group:"element_mouseevent_keyboard.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Manual_1:"Confirm the <{0}> element with mouse event handler(s) '{1}' has a corresponding keyboard handler(s)",group:"All interactive content with mouse event handlers must have equivalent keyboard access"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,l=n.nodeName.toLowerCase(),r=n.hasAttribute("href")||!n.hasAttribute("ondblclick")&&!n.hasAttribute("onmousemove")&&(!n.hasAttribute("onmousedown")||n.hasAttribute("onkeydown"))&&(!n.hasAttribute("onmouseup")||n.hasAttribute("onkeyup"))&&(!n.hasAttribute("onmouseover")||n.hasAttribute("onfocus"))&&(!n.hasAttribute("onmouseout")||n.hasAttribute("onblur"))&&(!n.hasAttribute("onclick")||n.hasAttribute("onkeypress")||"a"==l||"button"==l),o=new Array;return r||(n.hasAttribute("ondblclick")&&o.push("ondblclick"),n.hasAttribute("onmousemove")&&o.push("onmousemove"),n.hasAttribute("onmousedown")&&!n.hasAttribute("onkeydown")&&o.push("onmousedown"),n.hasAttribute("onmouseup")&&!n.hasAttribute("onkeyup")&&o.push("onmouseup"),n.hasAttribute("onmouseover")&&!n.hasAttribute("onfocus")&&o.push("onmouseover"),n.hasAttribute("onmouseout")&&!n.hasAttribute("onblur")&&o.push("onmouseout"),n.hasAttribute("onclick")&&!n.hasAttribute("onkeypress")&&"a"!=l&&"button"!=l&&o.push("onclick")),r?(0,a.RulePass)("Pass_0"):(0,a.RuleManual)("Manual_1",[l,o.join(", ")])}}},1704(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_orientation_unlocked=void 0;var a=i(461),n=i(461),l=i(4919),r=i(3946),o=i(4566),s=i(5279),u=i(7139);t.element_orientation_unlocked={id:"element_orientation_unlocked",context:"dom:*",help:{"en-US":{pass:"element_orientation_unlocked.html",fail_locked:"element_orientation_unlocked.html",group:"element_orientation_unlocked.html"}},messages:{"en-US":{pass:"The element is not restricted to either landscape or portrait orientation using CSS transform property",fail_locked:"The element <{0}> is restricted to either landscape or portrait orientation using CSS transform property",group:"Elements should not be restricted to either landscape or portrait orientation using CSS transform property"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.4"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:["b33eff"],run:function(e,t,i){var n=e.dom.node;if(!r.VisUtil.isNodeVisible(n))return null;if(u.CommonUtil.getAncestor(n,["script","meta","title"]))return null;var d=n.nodeName.toLowerCase(),c=s.FragmentUtil.getOwnerFragment(n),m=o.CacheUtil.getCache(c,"RPTUtil_MEDIA_ORIENTATION_TRANSFROM",null);m||(m=l.CSSUtil.getMediaOrientationTransform(c),o.CacheUtil.setCache(c,"RPTUtil_MEDIA_ORIENTATION_TRANSFROM",m));var p=[];if(Object.keys(m).forEach(function(e){Object.keys(m[e]).forEach(function(t){Object.keys(m[e][t]).length>0&&l.CSSUtil.selectorMatchesElem(n,t)&&(m[e][t].transform?p.push(m[e][t].transform):p.push(m[e][t]))})}),0===p.length)return null;for(var h=[],g=function(e){var t=p[e];if("object"==typeof t)for(var i in t)t=i+"("+t[i]+")";var r=!1;if(["rotate","rotate3d","rotateZ","matrix","matrix3d"].forEach(function(e){t.includes(e)&&(r=!0)}),!r)return"continue";var o=l.CSSUtil.getRotationDegree(t);if(0===o)return h.push((0,a.RulePass)("pass")),"continue";var s=l.CSSUtil.getDefinedStyles(n,["transform"]);s.transform&&(o+=l.CSSUtil.getRotationDegree(s.transform)),Math.abs(o-360)%360>1?h.push((0,a.RuleFail)("fail_locked",[d])):h.push((0,a.RulePass)("pass"))},b=0;b<p.length;b++)g(b);return h.length>0?h:null}}},5053(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_scrollable_tabbable=void 0;var a=i(7139),n=i(461),l=i(3946),r=i(7011);t.element_scrollable_tabbable={id:"element_scrollable_tabbable",context:"dom:*",dependencies:[],help:{"en-US":{group:"element_scrollable_tabbable.html",pass_tabbable:"element_scrollable_tabbable.html",pass_interactive:"element_scrollable_tabbable.html",fail_scrollable:"element_scrollable_tabbable.html"}},messages:{"en-US":{group:"Scrollable elements should be tabbable or contain tabbable content",pass_tabbable:"The scrollable element is tabbable",pass_interactive:"The scrollable element has tabbable content",fail_scrollable:"The scrollable element <{0}> with non-interactive content is not tabbable"}},rulesets:[],act:["0ssw9k"],run:function(e,t,i){var o=e.dom.node;if(l.VisUtil.isNodeVisible(o)&&!a.CommonUtil.isNodeDisabled(o))return a.CommonUtil.getAncestor(o,["iframe","svg","script","meta","style"])?null:a.CommonUtil.hasInnerContent(o)?r.AriaUtil.isNavigationOwnedOrControlled(o)?null:l.VisUtil.isElementScrollable(o)?a.CommonUtil.isTabbable(o)?(0,n.RulePass)("pass_tabbable"):a.CommonUtil.getTabbableChildren(o)>0?(0,n.RulePass)("pass_interactive"):!o.hasAttribute("tabindex")&&navigator.userAgent.indexOf("Firefox")>-1?null:(0,n.RuleFail)("fail_scrollable",[o.nodeName.toLowerCase()]):null:null}}},4681(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_tabbable_role_valid=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(9910),s=i(3864),u=i(3946);t.element_tabbable_role_valid={id:"element_tabbable_role_valid",context:"dom:*",help:{"en-US":{pass:"element_tabbable_role_valid.html",fail_invalid_role:"element_tabbable_role_valid.html",fail_no_valid_role:"element_tabbable_role_valid.html",group:"element_tabbable_role_valid.html"}},messages:{"en-US":{pass:"The tabbable element has a widget role",fail_invalid_role:"The tabbable element's role '{0}' is not a widget role",fail_no_valid_role:"The tabbable element does not have a valid widget role",group:"A tabbable element must have a valid widget role"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE},{id:["WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.CommonUtil.isNodeDisabled(n)||u.VisUtil.isNodeHiddenFromAT(n))return null;var d=n.nodeName.toLowerCase();if(d in r.CommonUtil.tabTagMap){var c=r.CommonUtil.tabTagMap[d];if("function"==typeof c&&(c=c(n)),c)return null}if(!n.hasAttribute("tabindex")||parseInt(n.getAttribute("tabindex"))<0)return null;if(l.AriaUtil.isNavigationOwnedOrControlled(n))return null;if(u.VisUtil.isElementScrollable(n))return null;var m=s.DOMWalker.parentNode(n),p=l.AriaUtil.getResolvedRole(m);if(["button","checkbox","img","link","menuitem","menuitemcheckbox","menuitemradio","option","radio","switch","tab"].includes(p))return null;var h=l.AriaUtil.getResolvedRole(n);return h?"application"===h?null:"row"===h||"separator"===h||"widget"===o.ARIADefinitions.designPatterns[h].roleType?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_invalid_role",[h]):(0,a.RuleFail)("fail_no_valid_role")}}},8050(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_tabbable_unobscured=void 0;var a=i(7139),n=i(461),l=i(461),r=i(3946),o=i(7507),s=i(3883);t.element_tabbable_unobscured={id:"element_tabbable_unobscured",context:"dom:*",dependencies:[],help:{"en-US":{group:"element_tabbable_unobscured.html",pass:"element_tabbable_unobscured.html",potential_obscured:"element_tabbable_unobscured.html"}},messages:{"en-US":{group:"When an element receives focus, it is not entirely covered by other content",pass:"The element is not entirely covered by other content",potential_obscured:"Confirm that when the element receives focus, it is not covered or, if covered by user action, can be uncovered without moving focus"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_2"],num:["2.4.11"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var l=e.dom.node;if(!r.VisUtil.isNodeVisible(l)||!a.CommonUtil.isTabbable(l))return null;var u=l.nodeName.toLocaleLowerCase();if(null!==a.CommonUtil.getAncestor(l,["pre","code","script","meta"])||"body"===u||"html"===u)return null;var d=l.ownerDocument;if(!d)return null;var c=d.defaultView;if(!c)return null;var m=new o.DOMMapper,p=m.getUnadjustedBounds(l);if(!p||0===p.height||0===p.width)return null;var h=c.getComputedStyle(l);if(!h)return null;var g=parseInt("auto"!==h.zIndex&&h.zIndex?h.zIndex:"0"),b=d.querySelectorAll("body *:not(script):not(style):not(meta):not(link)");if(!b||0===b.length)return null;for(var _=!0,f=p.left+p.width,v=p.top+p.height,A=0;A<b.length;A++){var w=b[A],y=l.compareDocumentPosition(w);if(0===y||y&Node.DOCUMENT_POSITION_CONTAINED_BY)_=!1;else if(!(y&Node.DOCUMENT_POSITION_CONTAINS)&&r.VisUtil.isNodeVisible(w)){var C=m.getUnadjustedBounds(w);if(C&&0!==C.height&&0!==C.width&&!(C.top>p.top||C.left>p.left)){var k=C.left+C.width,R=C.top+C.height;if(!(k<f||R<v)){var x=c.getComputedStyle(w);if(x){var P=parseInt("auto"===x.zIndex||!x.zIndex||isNaN(Number(x.zIndex))?"0":x.zIndex);if(_&&P>g||!_&&P>=g){var T,U=!1;if(x.background&&"none"!==x.background&&(U=(T=s.ColorUtil.Color(x.background))&&(void 0===T.alpha||T.alpha>0)),!U&&x.backgroundColor&&(U=(T=s.ColorUtil.Color(x.backgroundColor))&&(void 0===T.alpha||T.alpha>0)),!a.CommonUtil.hasInnerContentHidden(w)&&!U)continue;return(0,n.RulePotential)("potential_obscured",[])}}}}}}return(0,n.RulePass)("pass")}}},2644(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.element_tabbable_visible=void 0;var a=i(7139),n=i(4919),l=i(461),r=i(461),o=i(7507);t.element_tabbable_visible={id:"element_tabbable_visible",context:"dom:*",dependencies:[],help:{"en-US":{group:"element_tabbable_visible.html",pass:"element_tabbable_visible.html",potential_visible:"element_tabbable_visible.html"}},messages:{"en-US":{group:"A tabbable element should be visible on the screen when it has keyboard focus",pass:"The tabbable element is visible on the screen",potential_visible:"Confirm the element should be tabbable and if so, it becomes visible when it has keyboard focus"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.7"],level:r.eRulePolicy.VIOLATION,toolkitLevel:r.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var r=e.dom.node;if(!a.CommonUtil.isTabbable(r))return null;var s=r.nodeName.toLocaleLowerCase(),u=(new o.DOMMapper).getUnadjustedBounds(r);if(!u)return null;var d=n.CSSUtil.getDefinedStylesMultiple(r,["position","clip"],["",":focus"]),c=d[""],m=d[":focus"];if(0===u.height||0===u.width)return(0,l.RulePotential)("potential_visible",[]);if("absolute"===c.position&&c.clip&&"rect(0px,0px,0px,0px)"===c.clip.replaceAll(" ","")&&!m.clip){if("input"===s&&("checkbox"===r.getAttribute("type")||"radio"===r.getAttribute("type"))){var p=a.CommonUtil.getLabelForElement(r);if(p&&!a.CommonUtil.isInnerTextEmpty(p)){var h=n.CSSUtil.getDefinedStylesMultiple(r,null,[":focus-visible",":focus-within",":checked",":focus"]),g=h[":focus-visible"],b=h[":focus-within"],_=h[":checked"];if(h[":focus"]||g||b||_)return(0,l.RulePass)("pass")}}return(0,l.RulePotential)("potential_visible",[])}if(u.top>=0&&u.left>=0)return(0,l.RulePass)("pass");var f=getComputedStyle(r),v=u.top,A=u.left;if(0===Object.keys(m).length)return(0,l.RulePotential)("potential_visible",[]);var w=["absolute","fixed"];return void 0!==m.top&&(v=w.includes(m.position)||void 0===m.position&&w.includes(f.position)?m.top.replace(/\D/g,""):Number.MIN_VALUE),void 0!==m.left&&(A=w.includes(m.position)||void 0===m.position&&w.includes(f.position)?m.left.replace(/\D/g,""):Number.MIN_VALUE),v>=0&&A>=0?(0,l.RulePass)("pass"):(0,l.RulePotential)("potential_visible",[])}}},429(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.embed_alt_exists=void 0;var a=i(461),n=i(461),l=i(7139),r=i(3946);t.embed_alt_exists={id:"embed_alt_exists",context:"dom:embed",refactor:{RPT_Embed_HasAlt:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"embed_alt_exists.html",Potential_1:"embed_alt_exists.html",group:"embed_alt_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that the <embed> element has alternative content",group:"Provide alternative content for <embed> elements"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_FOUR}],act:[],run:function(e,t,i){var n=e.dom.node;return r.VisUtil.isNodeHiddenFromAT(n)?null:l.CommonUtil.attributeNonEmpty(n,"alt")?(0,a.RulePass)("Pass_0"):(0,a.RulePotential)("Potential_1")}}},4617(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.emoticons_alt_exists=void 0;var a=i(461),n=i(7139);t.emoticons_alt_exists={id:"emoticons_alt_exists",context:"dom:*",refactor:{WCAG20_Text_Emoticons:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"emoticons_alt_exists.html",Potential_1:"emoticons_alt_exists.html",group:"emoticons_alt_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that emoticons have a text alternative",group:"Emoticons must have a short text alternative that describes their purpose"}},rulesets:[],act:[],run:function(e,t,i){for(var l=e.dom.node,r=[":-)",":)",":o)",":]",":3",":c)",":>","=]","8)","=)",":D","C:",":-D",":D","8D","XD","=D","=3","<=3","<=8","--!--",":-(",":(",":c",":<",":[","D:","D8","D;","D=","DX","v.v",":-9",";-)",";)","*)",";]",";D",":-P",":P",":-p",":p","=p",":-Þ",":Þ",":-b",":b",":-O",":O","O_O","o_o","8O","OwO","O-O","0_o","O_o","O3O","o0o ;o_o;","o...o","0w0",":-/",":/",":\\","=/","=\\",":S",":|","d:-)","qB-)",":)~",":-)>....",":-X",":X",":-#",":#","O:-)","0:3","O:)",":'(",";*(","T_T","TT_TT","T.T",":-*",":*","^o)",">:)",">;)",">:-)","B)","B-)","8)","8-)","^>.>^","^<.<^","^>_>^","^<_<^","D:<",">:(","D-:<",">:-(",":-@[1]",";(","`_´","D<","<3","<333","=^_^=","=>.>=","=<_<=","=>.<=","\\,,/","\\m/","\\m/\\>.</\\m/","\\o/","\\o o/","o/\\o",":&",":u"],o=!0,s="",u=l.firstChild;u;)"#text"==u.nodeName&&(s+=" "+u.nodeValue),u=u.nextSibling;if(s.trim().length>0)for(var d=0;o&&d<r.length;++d)for(var c=s.indexOf(r[d]),m=r[d].length;o&&-1!=c;)o=(o=(o=c>0&&!/\s/.test(s.substring(c-1,c))||c<s.length-m&&!/\s/.test(s.substring(c+m,c+m+1))&&!/[.,!'"?]/.test(s.substring(c+m,c+m+1)))||(":)"==r[d]||"(:"==r[d])&&/\(\:.*\:\)/.test(s))||(";)"==r[d]||"(;"==r[d])&&/\(\;.*\;\)/.test(s),c=s.indexOf(r[d],c+1);if(!o){var p=n.CommonUtil.getAncestor(l,["pre","code","script","body"]);o=null==p||"body"!=p.nodeName.toLowerCase()}return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},5460(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.error_message_exists=void 0;var a=i(461),n=i(461),l=i(7011),r=i(5279),o=i(3946);t.error_message_exists={id:"error_message_exists",context:"dom:*[aria-invalid=true]",refactor:{HAAC_Aria_ErrorMessage:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_0:"error_message_exists.html",Fail_1:"error_message_exists.html",Fail_2:"error_message_exists.html",group:"error_message_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Custom error message has invalid reference 'id' value",Fail_2:"Custom error message is not visible",group:"A custom error message must reference a valid 'id' value and when triggered the message must be appropriately exposed"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,s=l.AriaUtil.getAriaAttribute(n,"aria-errormessage");if(!s)return null;var u=r.FragmentUtil.getById(n,s);return u?o.VisUtil.isNodeVisible(u)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_2"):(0,a.RuleFail)("Fail_1")}}},3399(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.fieldset_label_valid=void 0;var a=i(461),n=i(461),l=i(5279),r=i(4566),o=i(7139),s=i(3946),u=i(1950);t.fieldset_label_valid={id:"fieldset_label_valid",context:"aria:group",refactor:{group_withInputs_hasName:{Pass_1:"Pass_1",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_1:"fieldset_label_valid.html",Fail_1:"fieldset_label_valid.html",Fail_2:"fieldset_label_valid.html",group:"fieldset_label_valid.html"}},messages:{"en-US":{Pass_1:'Group/Fieldset "{0}" with an input has a unique name',Fail_1:"Group/Fieldset does not have an accessible name",Fail_2:'Group/Fieldset "{0}" has a duplicate name to another group',group:"Groups with nested inputs must have unique accessible name"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1","3.3.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(!s.VisUtil.isNodeHiddenFromAT(n)&&!o.CommonUtil.isNodeDisabled(n)){var d=l.FragmentUtil.getOwnerFragment(n),c=r.CacheUtil.getCache(n.ownerDocument,"landmark_group_input",null);if(!c){c={groupsWithInputs:[],groupsWithInputsComputedLabels:[]};for(var m=d.querySelectorAll('fieldset,[role="group"]'),p=Array.from(m),h=[],g=0;g<p.length;g++)p[g].querySelector("input")&&h.push(p[g]);var b=[];for(g=0;g<h.length;g++){var _=u.AccNameUtil.computeAccessibleName(h[g]);b.push(_&&_.name&&_.name.trim().length>0?_.name.trim():"")}c.groupsWithInputs=h,c.groupsWithInputsComputedLabels=b,r.CacheUtil.setCache(n.ownerDocument,"landmark_group_input",c)}var f=!1,v="";if(!c.groupsWithInputs)return null;for(g=0;g<c.groupsWithInputs.length;g++)if(n.isSameNode(c.groupsWithInputs[g])){if(f=!0,""===c.groupsWithInputsComputedLabels[g]||null===c.groupsWithInputsComputedLabels[g])return(0,a.RuleFail)("Fail_1");for(var A=!1,w=0;w<c.groupsWithInputsComputedLabels.length;w++)g!=w&&c.groupsWithInputsComputedLabels[g]===c.groupsWithInputsComputedLabels[w]&&(A=!0);if(A)return(0,a.RuleFail)("Fail_2",[c.groupsWithInputsComputedLabels[g]]);v=c.groupsWithInputsComputedLabels[g]}return f?(0,a.RulePass)("Pass_1",[v]):null}}}},3498(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.fieldset_legend_valid=void 0;var a=i(461),n=i(461),l=i(7139),r=i(3946);t.fieldset_legend_valid={id:"fieldset_legend_valid",context:"dom:fieldset",refactor:{WCAG20_Fieldset_HasLegend:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{Pass_0:"fieldset_legend_valid.html",Fail_1:"fieldset_legend_valid.html",Fail_2:"fieldset_legend_valid.html",Fail_3:"fieldset_legend_valid.html",group:"fieldset_legend_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"<fieldset> element does not have a <legend>",Fail_2:"<fieldset> element has more than one <legend>",Fail_3:"<fieldset> element <legend> is empty",group:" <fieldset> elements should have a single, non-empty <legend> as a label"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n)||l.CommonUtil.isNodeDisabled(n))return null;var o=l.CommonUtil.getChildByTagHidden(n,"legend",!0,!1);return 0===o.length?(0,a.RuleFail)("Fail_1"):o.length>1?(0,a.RuleFail)("Fail_2"):0===l.CommonUtil.getInnerText(o[0]).trim().length?(0,a.RuleFail)("Fail_3"):(0,a.RulePass)("Pass_0")}}},9629(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.figure_label_exists=void 0;var a=i(461),n=i(461),l=i(3946),r=i(1950);t.figure_label_exists={id:"figure_label_exists",context:"dom:figure",refactor:{HAAC_Figure_label:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"figure_label_exists.html",Fail_1:"figure_label_exists.html",group:"figure_label_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The <figure> element does not have an associated label",group:"A <figure> element must have an associated label"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;if(n.getAttribute("role"))return null;var o=r.AccNameUtil.computeAccessibleName(n);return o&&o.name&&o.name.trim().length>0?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[])}}},733(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.form_font_color=void 0;var a=i(461),n=i(461);t.form_font_color={id:"form_font_color",context:"dom:form",refactor:{RPT_Font_ColorInForm:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"form_font_color.html",Potential_1:"form_font_color.html",group:"form_font_color.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Check color is not used as the only visual means to convey which fields are required",group:"Combine color and descriptive markup to indicate required form fields"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.4.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=!0,l=e.dom.node.getElementsByTagName("font");if(null!=l)for(var r=0;r<l.length;++r)n=!l[r].hasAttribute("color");return n?(0,a.RulePass)("Pass_0"):n?void 0:(0,a.RulePotential)("Potential_1")}}},9797(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.form_interaction_review=void 0;var a=i(461),n=i(461),l=i(7139);t.form_interaction_review={id:"form_interaction_review",context:"dom:form[target]",refactor:{WCAG20_Form_TargetAndText:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"form_interaction_review.html",Potential_1:"form_interaction_review.html",group:"form_interaction_review.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that interacting with content will not open pop-up windows or change the active window without informing the user",group:"User should be informed in advance when interacting with content causes a change of context"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.2.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n={paramWinText:{value:["new window"],type:"array"}},r=e.dom.node,o=r.getAttribute("target"),s="_parent"===o||"_self"===o||"_top"===o||null!=l.CommonUtil.getFrameByName(r,o);if(!s){var u=l.CommonUtil.getInnerText(r);r.hasAttribute("title")&&(u+=" "+r.getAttribute("title"));for(var d=0;!s&&d<n.paramWinText.value.length;++d)-1!=u.indexOf(n.paramWinText.value[d])&&(s=!0)}return s?(0,a.RulePass)("Pass_0"):s?void 0:(0,a.RulePotential)("Potential_1")}}},7156(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.form_label_unique=void 0;var a=i(461),n=i(461),l=i(5279),r=i(4566);t.form_label_unique={id:"form_label_unique",context:"dom:label[for]",refactor:{RPT_Label_UniqueFor:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"form_label_unique.html",Fail_1:"form_label_unique.html",group:"form_label_unique.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Form control has more than one label",group:"Form controls should have exactly one label"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,o=r.CacheUtil.getCache(l.FragmentUtil.getOwnerFragment(n),"RPT_Label_Single",{}),s=n.getAttribute("for"),u=!(s in o);return o[s]=!0,u?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},3062(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.form_submit_button_exists=void 0;var a=i(461),n=i(461),l=i(7011),r=i(3864);t.form_submit_button_exists={id:"form_submit_button_exists",context:"dom:form",refactor:{WCAG20_Form_HasSubmit:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"form_submit_button_exists.html",Potential_1:"form_submit_button_exists.html",group:"form_submit_button_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify the <form> element has a submit button or an image button",group:"A <form> element should have a submit button or an image button"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.2.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,o=!1;if(n.firstChild)for(var s=new r.DOMWalker(n,!0);!o&&s.prevNode()&&s.node!=n;)if(!s.bEndTag){var u=s.node.nodeName.toLowerCase();if("input"===u){var d=s.elem().getAttribute("type");d&&(d=d.toLowerCase()),o="submit"===d||"image"===d}else"button"===u?o=s.elem().hasAttribute("type")&&"submit"===s.elem().getAttribute("type").toLowerCase():1===s.node.nodeType&&(o=l.AriaUtil.hasRole(s.node,"button"))}return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},3827(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.form_submit_review=void 0;var a=i(461);t.form_submit_review={id:"form_submit_review",context:"dom:select[onchange], dom:input[onchange]",refactor:{RPT_Form_ChangeEmpty:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"form_submit_review.html",Potential_1:"form_submit_review.html",group:"form_submit_review.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Confirm the form does not submit automatically without warning",group:"A form should not be submitted automatically without warning the user"}},rulesets:[],act:[],run:function(e,t,i){var n=0===e.dom.node.getAttribute("onchange").trim().length;return n?null:n?void 0:(0,a.RulePotential)("Potential_1")}}},5498(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.frame_src_valid=void 0;var a=i(461),n=i(461),l=i(7139);t.frame_src_valid={id:"frame_src_valid",context:"dom:frame, dom:iframe",refactor:{Valerie_Frame_SrcHtml:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"frame_src_valid.html",Potential_1:"frame_src_valid.html",group:"frame_src_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify <frame> content is accessible",group:"A <frame> containing non-HTML content must be made accessible"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,r=l.CommonUtil.attributeNonEmpty(n,"src")&&l.CommonUtil.isHtmlExt(l.CommonUtil.getFileExt(n.getAttribute("src")));return r?(0,a.RulePass)("Pass_0"):r?void 0:(0,a.RulePotential)("Potential_1")}}},510(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.frame_title_exists=void 0;var a=i(461),n=i(461),l=i(1950),r=i(3946);t.frame_title_exists={id:"frame_title_exists",context:"dom:frame, dom:iframe",refactor:{WCAG20_Frame_HasTitle:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{group:"frame_title_exists.html",Pass_0:"frame_title_exists.html",Fail_1:"frame_title_exists.html"}},messages:{"en-US":{group:"Inline frames must have a unique, non-empty 'title' attribute",Pass_0:"Rule Passed",Fail_1:"Inline frame does not have a 'title' attribute"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:"cae760",run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;if(n.getAttribute("role"))return null;var o=l.AccNameUtil.computeAccessibleName(n);return o&&o.name&&o.name.trim().length>0?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},7722(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.heading_content_exists=void 0;var a=i(461),n=i(461),l=i(7139);t.heading_content_exists={id:"heading_content_exists",context:"dom:h1, dom:h2, dom:h3, dom:h4, dom:h5, dom:h6",refactor:{RPT_Header_HasContent:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"heading_content_exists.html",Fail_1:"heading_content_exists.html",group:"heading_content_exists.html"}},messages:{"en-US":{Pass_0:"Heading element has descriptive text",Fail_1:"Heading element has no descriptive content",group:"Heading elements must provide descriptive text"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.6"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;return l.CommonUtil.hasInnerContentHidden(n)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},4597(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.heading_markup_misuse=void 0;var a=i(461),n=i(461),l=i(7139);t.heading_markup_misuse={id:"heading_markup_misuse",context:"dom:h1, dom:h2, dom:h3, dom:h4, dom:h5, dom:h6",dependencies:["heading_content_exists"],refactor:{RPT_Headers_FewWords:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"heading_markup_misuse.html",Potential_1:"heading_markup_misuse.html",group:"heading_markup_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that the heading element is a genuine heading",group:"Heading elements must not be used for presentation"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node,r=l.CommonUtil.wordCount(l.CommonUtil.getInnerText(n))<=20;return r?(0,a.RulePass)("Pass_0"):r?void 0:(0,a.RulePotential)("Potential_1")}}},2104(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.html_lang_exists=void 0;var a=i(461),n=i(461),l=i(6858),r=i(1043);t.html_lang_exists={id:"html_lang_exists",context:"dom:html",refactor:{WCAG20_Html_HasLang:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3",Fail_4:"Fail_4",Fail_5:"Fail_5",Potential_5:"Potential_5",Potential_6:"Potential_6"}},help:{"en-US":{group:"html_lang_exists.html",Pass_0:"html_lang_exists.html",Fail_1:"html_lang_exists.html",Fail_2:"html_lang_exists.html",Fail_3:"html_lang_exists.html",Fail_4:"html_lang_exists.html",Fail_5:"html_lang_exists.html",Potential_5:"html_lang_exists.html",Potential_6:"html_lang_exists.html"}},messages:{"en-US":{group:"Page must identify the default language of the document with a 'lang' attribute",Pass_0:'Page language detected as "{0}"',Fail_1:"Page detected as XHTML 1.0, but has neither 'lang' nor 'xml:lang' attributes",Fail_2:"Page detected as XHTML, but does not have an 'xml:lang' attribute",Fail_3:"Page detected as HTML, but does not have a 'lang' attribute",Fail_4:"Page detected with 'lang' and 'xml:lang' attributes and primary languages do not match: \"{0}\", \"{1}\"",Fail_5:"Page detected with 'lang' and 'xml:lang' attributes that do not match: \"{0}\", \"{1}\"",Potential_5:"Page detected as XHTML 1.0 with only a 'lang' attribute. Confirm that page is only delivered via text/html mime type",Potential_6:"Page detected as XHTML 1.0 with only an 'xml:lang' attribute. Confirm that page is only delivered via xml mime type"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"3.1.1",level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[{b5c3f8:{Pass_0:"pass",Fail_1:"inapplicable",Fail_2:"inapplicable",Fail_3:"fail",Fail_4:"inapplicable",Fail_5:"inapplicable",Potential_5:"inapplicable",Potential_6:"inapplicable"},"5b7ae0":{Pass_0:"pass",Fail_1:"inapplicable",Fail_2:"inapplicable",Fail_3:"inapplicable",Fail_4:"fail",Fail_5:"pass",Potential_5:"inapplicable",Potential_6:"inapplicable"}}],run:function(e,t,i){if(l.AncestorUtil.isPresentationFrame(i))return null;var n=e.dom.node,o=n.ownerDocument.doctype?n.ownerDocument.doctype.publicId:"";o||(o="");var s=n.getAttribute("lang"),u=n.getAttribute("xml:lang");return o.includes("XHTML")&&!o.includes("1.0")?u?(0,a.RulePass)("Pass_0",[u]):(0,a.RuleFail)("Fail_2"):o.includes("XHTML")&&o.includes("1.0")?s||u?s&&u?s!==u?r.LangUtil.validPrimaryLang(s)&&r.LangUtil.validPrimaryLang(u)?r.LangUtil.matchPrimaryLang(s,u)?(0,a.RuleFail)("Fail_5",[s,u],[]):(0,a.RuleFail)("Fail_4",[s,u],[]):null:(0,a.RulePass)("Pass_0",[s]):s?(0,a.RulePotential)("Potential_5"):(0,a.RulePotential)("Potential_6"):(0,a.RuleFail)("Fail_1"):s?s&&u&&s!==u?r.LangUtil.validPrimaryLang(s)&&r.LangUtil.validPrimaryLang(u)?r.LangUtil.matchPrimaryLang(s,u)?(0,a.RuleFail)("Fail_5",[s,u],[]):(0,a.RuleFail)("Fail_4",[s,u],[]):null:(0,a.RulePass)("Pass_0",[s]):(0,a.RuleFail)("Fail_3")}}},8260(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.html_skipnav_exists=void 0;var a=i(461),n=i(461),l=i(7139),r=i(5279);t.html_skipnav_exists={id:"html_skipnav_exists",context:"dom:html",refactor:{RPT_Html_SkipNav:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{group:"html_skipnav_exists.html",Pass_0:"html_skipnav_exists.html",Potential_1:"html_skipnav_exists.html"}},messages:{"en-US":{group:"Provide a way to bypass blocks of content that are repeated on multiple Web pages",Pass_0:"Rule Passed",Potential_1:"Verify there is a way to bypass blocks of content that are repeated on multiple Web pages"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"2.4.1",level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,o=!1,s=l.CommonUtil.getDocElementsByTag(n,"frame"),u=l.CommonUtil.getDocElementsByTag(n,"h1");if(null!=s&&s.length>0||null!=u&&u.length>0)o=!0;else for(var d=l.CommonUtil.getDocElementsByTag(n,"a"),c={},m=0;!o&&m<d.length;++m)if(d[m].hasAttribute("href")){var p=d[m].href;"string"!=typeof p&&(p=p.baseVal?p.baseVal:"");var h,g="";if((h=void 0!==n.ownerDocument.locationFromDAP&&null!=n.ownerDocument.locationFromDAP?n.ownerDocument.locationFromDAP:n.ownerDocument.location)&&(g=h.href),p.startsWith("file:///")&&(p="file:/"+p.substring(8)),g.startsWith("file:///")&&(g="file:/"+g.substring(8)),"#"==p.charAt(0)||p.startsWith(g+"#")){var b=l.CommonUtil.getFileAnchor(p);null!=r.FragmentUtil.getById(n,b)?o=!0:c[b]=!0}}else if(d[m].hasAttribute("name")){var _=d[m].getAttribute("name");-1!=_.indexOf("#")&&(_=l.CommonUtil.getFileAnchor(_)),o=_ in c}return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},8920(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.iframe_interactive_tabbable=void 0;var a=i(7139),n=i(461),l=i(461),r=i(3946),o=i(7507);t.iframe_interactive_tabbable={id:"iframe_interactive_tabbable",context:"dom:iframe",dependencies:[],help:{"en-US":{group:"iframe_interactive_tabbable.html",pass:"iframe_interactive_tabbable.html",fail_invalid:"iframe_interactive_tabbable.html"}},messages:{"en-US":{group:"Iframe with interactive content should not be excluded from tab order using tabindex",pass:"The iframe with interactive content is not excluded from the tab order using tabindex",fail_invalid:"The <iframe> with interactive content is excluded from tab order using tabindex"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:["akn7bn"],run:function(e,t,i){var l=e.dom.node;if(!r.VisUtil.isNodeHiddenFromAT(l)&&!a.CommonUtil.isNodeDisabled(l)){var s=(new o.DOMMapper).getUnadjustedBounds(l);if(!s)return null;if(Math.max(s.height,s.width)<30||Math.min(s.height,s.width)<15)return null;if(!l.hasAttribute("tabindex")||parseInt(l.getAttribute("tabindex"))>=0)return(0,n.RulePass)("pass");var u=l;return u&&u.contentDocument&&u.contentDocument.documentElement&&a.CommonUtil.getTabbableChildren(l)>0?(0,n.RuleFail)("fail_invalid"):null}}}},1237(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.imagebutton_alt_exists=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139);t.imagebutton_alt_exists={id:"imagebutton_alt_exists",context:"dom:input",refactor:{WCAG20_Input_ExplicitLabelImage:{Pass_0:"Pass_0",Pass_1:"Pass_1",Pass_2:"Pass_2",Fail:"Fail"}},help:{"en-US":{Pass_0:"imagebutton_alt_exists.html",Pass_1:"imagebutton_alt_exists.html",Pass_2:"imagebutton_alt_exists.html",Fail:"imagebutton_alt_exists.html",group:"imagebutton_alt_exists.html"}},messages:{"en-US":{Pass_0:"Image button provides alternative text using the 'alt' attribute",Pass_1:"Image button provides alternative text using an ARIA label",Pass_2:"Image button provides alternative text using the 'title' attribute",Fail:'The <input> element of type "image" has no text alternative',group:'The <input> element of type "image" should have a text alternative'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:"59796f",run:function(e,t,i){var n=e.dom.node;return n.hasAttribute("type")&&"image"==n.getAttribute("type").toLowerCase()?r.CommonUtil.attributeNonEmpty(n,"alt")?(0,a.RulePass)("Pass_0"):l.AriaUtil.hasAriaLabel(n)?(0,a.RulePass)("Pass_1"):n.hasAttribute("title")&&n.getAttribute("title").length>0?(0,a.RulePass)("Pass_2"):(0,a.RuleFail)("Fail"):null}}},4101(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.imagemap_alt_exists=void 0;var a=i(461),n=i(461),l=i(7139),r=i(3946);t.imagemap_alt_exists={id:"imagemap_alt_exists",context:"dom:img[usemap], dom:img[ismap]",refactor:{HAAC_Img_UsemapAlt:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"imagemap_alt_exists.html",Fail_1:"imagemap_alt_exists.html",group:"imagemap_alt_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Image map or child <area> has no text alternative",group:"An image map and each <area> element in an image map must have text alternative(s)"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;return r.VisUtil.isNodeHiddenFromAT(n)?null:l.CommonUtil.attributeNonEmpty(n,"alt")||!n.hasAttribute("ismap")&&!l.CommonUtil.attributeNonEmpty(n,"usemap")?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},275(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.img_alt_background=void 0;var a=i(461),n=i(461),l=i(3946);t.img_alt_background={id:"img_alt_background",context:"dom:*",refactor:{HAAC_BackgroundImg_HasTextOrTitle:{Pass_0:"Pass_0",Manual_1:"Manual_1"}},help:{"en-US":{Pass_0:"img_alt_background.html",Manual_1:"img_alt_background.html",group:"img_alt_background.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Manual_1:"Verify important background image information has a text alternative in system high contrast mode",group:"Background images that convey important information must have a text alternative that describes the image"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var r=n.ownerDocument.defaultView.getComputedStyle(n);if(null==r)return(0,a.RulePass)("Pass_0");var o=r.backgroundImage,s=!0;if(null!=o&&""!=o&&"none"!=o&&"inherit"!=o)if(null!=n.innerHTML&&0!=n.innerHTML.trim().length)s=!1;else{var u=n.getAttribute("title");null!=u&&0!=u.length&&(s=!1)}return s?(0,a.RulePass)("Pass_0"):s?void 0:(0,a.RuleManual)("Manual_1")}}},7601(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.img_alt_decorative=void 0;var a=i(461),n=i(461),l=i(7011),r=i(3946);t.img_alt_decorative={id:"img_alt_decorative",context:"dom:img[alt]",refactor:{WCAG20_Img_PresentationImgHasNonNullAlt:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"img_alt_decorative.html",Fail_1:"img_alt_decorative.html",group:"img_alt_decorative.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Image designated as decorative has non-null 'alt' attribute",group:'Image designated as decorative must have \'alt=""'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var o=!0;return(l.AriaUtil.hasRole(n,"presentation")||l.AriaUtil.hasRole(n,"none"))&&(o=0==n.getAttribute("alt").length),o?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},7541(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.img_alt_misuse=void 0;var a=i(461),n=i(461),l=i(3946);t.img_alt_misuse={id:"img_alt_misuse",context:"dom:img, dom:area, dom:input",refactor:{RPT_Img_AltCommonMisuse:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"img_alt_misuse.html",Potential_1:"img_alt_misuse.html",group:"img_alt_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that the file name serves as a good inline replacement for the image",group:"'alt' attribute value must be a good inline replacement for the image"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var r=n.nodeName.toLowerCase(),o=!0;if(n.hasAttribute("alt")){var s=n.getAttribute("alt").trim();if(s.length>0){for(var u=["short description"],d=0;o&&d<u.length;++d)o=-1==s.indexOf(u[d]);if(o){var c=n.getAttribute("area"==r?"href":"src");null!=c&&(o=c.trim()!=s&&(-1==s.indexOf(".")||-1==s.indexOf(c)&&-1==c.indexOf(s)))}}}return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},8274(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.img_alt_null=void 0;var a=i(461),n=i(461),l=i(3946),r=i(7011),o=i(7139);t.img_alt_null={id:"img_alt_null",context:"dom:img[alt]",refactor:{WCAG20_Img_TitleEmptyWhenAltNull:{Pass_0:"pass",Fail_1:"fail_decorative"}},help:{"en-US":{pass:"img_alt_null.html",fail_decorative:"img_alt_null.html",potential_aria_override:"img_alt_null.html",group:"img_alt_null.html"}},messages:{"en-US":{pass:"Neither 'aria' nor 'title' attributes are used for the decorative image",fail_decorative:"The image 'alt' attribute is empty, but the 'title' attribute is not empty",potential_aria_override:"The image 'alt' attribute is empty, but the 'aria' label is not empty and overrides the 'alt' attribute",group:"When the intent is to mark an image as decorative with an empty 'alt' attribute, the 'aria' or 'title' attributes should not be used"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE,reasonCodes:["fail_decorative"]},{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["ARIA"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE,reasonCodes:["potential_aria_override"]}],act:[{"46ca7f":{potential_aria_override:"fail"}}],run:function(e,t,i){var n=e.dom.node;return l.VisUtil.isNodeHiddenFromAT(n)||n.getAttribute("alt").trim().length>0?null:r.AriaUtil.getAriaLabel(n).length>0?(0,a.RulePotential)("potential_aria_override"):o.CommonUtil.attributeNonEmpty(n,"title")?(0,a.RuleFail)("fail_decorative"):(0,a.RulePass)("pass")}}},590(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.img_alt_redundant=void 0;var a=i(461),n=i(461),l=i(3864),r=i(7139);t.img_alt_redundant={id:"img_alt_redundant",context:"dom:img[alt]",refactor:{WCAG20_Img_LinkTextNotRedundant:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{Pass_0:"img_alt_redundant.html",Fail_1:"img_alt_redundant.html",Fail_2:"img_alt_redundant.html",Fail_3:"img_alt_redundant.html",group:"img_alt_redundant.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Link text is repeated in an image 'alt' value within the same link",Fail_2:"Link text of previous link is repeated in image 'alt' value of a link",Fail_3:"Image 'alt' value within a link is repeated in link text of the link after",group:"The text alternative for an image within a link should not repeat the link text or adjacent link text"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1","2.4.4"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node,o=r.CommonUtil.getAncestor(n,"a");if(null==o)return null;var s=n.getAttribute("alt").trim().toLowerCase();if(0==s.length)return null;var u=o.innerText,d="";if(null!=u&&(d=u.trim().toLowerCase()),!(d.length>0)){for(var c=!0,m=new l.DOMWalker(o);c&&m.prevNode()&&!("#text"==(h=(p=m.node).nodeName.toLowerCase())&&p.nodeValue.length>0||"img"==h&&r.CommonUtil.attributeNonEmpty(p,"alt"));)"a"!==h||r.CommonUtil.shouldNodeBeSkippedHidden(p)||(c=(p.innerText||p.textContent||"").trim().toLowerCase()!=s);if(!c)return(0,a.RuleFail)("Fail_2");for(m=new l.DOMWalker(o,!0);c&&m.nextNode();){var p,h;if("#text"==(h=(p=m.node).nodeName.toLowerCase())&&p.nodeValue.length>0||"img"==h&&r.CommonUtil.attributeNonEmpty(p,"alt"))break;"a"!=h||r.CommonUtil.shouldNodeBeSkippedHidden(p)||(c=p.innerText.trim().toLowerCase()!=s)}return c?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_3")}return s==d?(0,a.RuleFail)("Fail_1"):void 0}}},8925(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.img_alt_valid=void 0;var a=i(461),n=i(461),l=i(7011),r=i(3946),o=i(1950);t.img_alt_valid={id:"img_alt_valid",context:"dom:img",refactor:{WCAG20_Img_HasAlt:{pass:"pass",fail_blank_alt:"fail_blank_alt",fail_no_alt:"fail_no_alt",fail_blank_title:"fail_blank_title"}},help:{"en-US":{pass:"img_alt_valid.html",fail_blank_alt:"img_alt_valid.html",fail_no_alt:"img_alt_valid.html",fail_blank_title:"img_alt_valid.html",group:"img_alt_valid.html"}},messages:{"en-US":{pass:"The image has an accessible name or is correctly marked as decorative or redundant",fail_blank_alt:"Image 'alt' attribute value consists only of blank space(s)",fail_no_alt:"The image has neither an accessible name nor is marked as decorative or redundant",fail_blank_title:"The image does not have an 'alt' attribute or ARIA label, and the 'title' attribute value consists only of blank space(s)",group:"Images must have accessible names unless they are decorative or redundant"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:"23a2a8",run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n)||o.AccNameUtil.isAccessibleNameIgnorable(n))return null;if(0!==l.AriaUtil.getAriaLabel(n).trim().length)return(0,a.RulePass)("pass");var s=n.hasAttribute("alt")?n.getAttribute("alt"):null;if(null!==s)return 0===s.length||s.trim().length>0?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_blank_alt");var u=n.hasAttribute("title")?n.getAttribute("title"):null;if(null!==u&&0!==u.length)return 0===u.trim().length?(0,a.RuleFail)("fail_blank_title"):(0,a.RulePass)("pass");if(null===s){var d=l.AriaUtil.getResolvedRole(n,!1);return"presentation"===d||"none"===d?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_no_alt")}return 0===s.length?(0,a.RulePass)("pass"):void 0}}},9234(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.img_ismap_misuse=void 0;var a=i(461),n=i(461),l=i(7139),r=i(3946);t.img_ismap_misuse={id:"img_ismap_misuse",context:"dom:img[ismap]",refactor:{RPT_Img_UsemapValid:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"img_ismap_misuse.html",Potential_1:"img_ismap_misuse.html",group:"img_ismap_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Server-side image map hot-spots do not have duplicate text links",group:"Server-side image map hot-spots must have duplicate text links"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var o=!1;if(n.hasAttribute("usemap")){var s=n.getAttribute("usemap"),u=(s=s.trim().toLowerCase()).indexOf("#");if(-1!=u&&(s=s.substr(u+1)),s.length>0)for(var d=l.CommonUtil.getDocElementsByTag(n,"map"),c=0;!o&&c<d.length;++c)o=d[c].hasAttribute("name")&&d[c].getAttribute("name").toLowerCase()==s}return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},8617(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.img_longdesc_misuse=void 0;var a=i(461),n=i(461),l=i(7139),r=i(3946);t.img_longdesc_misuse={id:"img_longdesc_misuse",context:"dom:img[longdesc]",refactor:{RPT_Img_LongDescription2:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"img_longdesc_misuse.html",Potential_1:"img_longdesc_misuse.html",group:"img_longdesc_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that the file designated by the 'longdesc' attribute contains valid HTML content (file extension not recognized)",group:" The 'longdesc' attribute must reference HTML content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var o=n.getAttribute("longdesc"),s=l.CommonUtil.getFileExt(o),u=0!=s.length&&l.CommonUtil.isHtmlExt(s)||o.startsWith("#")||o.startsWith("http://")||o.startsWith("https://")||o.startsWith("data:");return u?(0,a.RulePass)("Pass_0"):u?void 0:(0,a.RulePotential)("Potential_1")}}},591(e,t,i){var a=this&&this.__createBinding||(Object.create?function(e,t,i,a){void 0===a&&(a=i);var n=Object.getOwnPropertyDescriptor(t,i);n&&!("get"in n?!t.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,a,n)}:function(e,t,i,a){void 0===a&&(a=i),e[a]=t[i]}),n=this&&this.__exportStar||function(e,t){for(var i in e)"default"===i||Object.prototype.hasOwnProperty.call(t,i)||a(t,e,i)};Object.defineProperty(t,"__esModule",{value:!0}),n(i(2297),t),n(i(4401),t),n(i(4546),t),n(i(9292),t),n(i(9605),t),n(i(3987),t),n(i(8631),t),n(i(8025),t),n(i(1198),t),n(i(8001),t),n(i(5778),t),n(i(8118),t),n(i(2242),t),n(i(3673),t),n(i(5080),t),n(i(183),t),n(i(6805),t),n(i(1886),t),n(i(4078),t),n(i(5750),t),n(i(85),t),n(i(514),t),n(i(5310),t),n(i(9083),t),n(i(6049),t),n(i(5099),t),n(i(2759),t),n(i(3141),t),n(i(5131),t),n(i(5167),t),n(i(8115),t),n(i(5733),t),n(i(5782),t),n(i(6731),t),n(i(390),t),n(i(3900),t),n(i(1218),t),n(i(6734),t),n(i(9973),t),n(i(5711),t),n(i(3384),t),n(i(2762),t),n(i(5757),t),n(i(5232),t),n(i(1891),t),n(i(6142),t),n(i(4863),t),n(i(1440),t),n(i(1968),t),n(i(1617),t),n(i(3475),t),n(i(3370),t),n(i(9272),t),n(i(7735),t),n(i(3923),t),n(i(7521),t),n(i(1852),t),n(i(799),t),n(i(4614),t),n(i(5952),t),n(i(5395),t),n(i(1992),t),n(i(7955),t),n(i(9531),t),n(i(891),t),n(i(7446),t),n(i(6137),t),n(i(6839),t),n(i(8135),t),n(i(507),t),n(i(3566),t),n(i(5173),t),n(i(6027),t),n(i(7515),t),n(i(1704),t),n(i(5053),t),n(i(4681),t),n(i(8050),t),n(i(2644),t),n(i(429),t),n(i(4617),t),n(i(5460),t),n(i(3399),t),n(i(3498),t),n(i(9629),t),n(i(733),t),n(i(9797),t),n(i(7156),t),n(i(3062),t),n(i(3827),t),n(i(5498),t),n(i(510),t),n(i(7722),t),n(i(4597),t),n(i(2104),t),n(i(8260),t),n(i(8920),t),n(i(1237),t),n(i(4101),t),n(i(275),t),n(i(7601),t),n(i(7541),t),n(i(8274),t),n(i(590),t),n(i(8925),t),n(i(9234),t),n(i(8617),t),n(i(1939),t),n(i(7726),t),n(i(3142),t),n(i(1353),t),n(i(2631),t),n(i(8550),t),n(i(8853),t),n(i(3180),t),n(i(1382),t),n(i(953),t),n(i(2222),t),n(i(4678),t),n(i(7578),t),n(i(9964),t),n(i(6401),t),n(i(1174),t),n(i(9907),t),n(i(6032),t),n(i(5622),t),n(i(2240),t),n(i(4019),t),n(i(361),t),n(i(5960),t),n(i(5515),t),n(i(8752),t),n(i(8834),t),n(i(1025),t),n(i(9116),t),n(i(435),t),n(i(6640),t),n(i(2068),t),n(i(7322),t),n(i(5702),t),n(i(1961),t),n(i(3022),t),n(i(375),t),n(i(4658),t),n(i(4605),t),n(i(5294),t),n(i(3506),t),n(i(7475),t),n(i(8064),t),n(i(7942),t),n(i(2219),t),n(i(1473),t),n(i(1912),t),n(i(6539),t),n(i(4),t),n(i(5334),t),n(i(2173),t),n(i(8349),t),n(i(8142),t),n(i(3980),t),n(i(4701),t),n(i(18),t),n(i(9314),t),n(i(1667),t),n(i(9599),t),n(i(4672),t),n(i(4353),t),n(i(7147),t),n(i(1419),t),n(i(855),t),n(i(3420),t),n(i(408),t)},1939(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_autocomplete_valid=void 0;var a=i(461),n=i(461),l=i(7139),r=i(3946);t.input_autocomplete_valid={id:"input_autocomplete_valid",context:"dom:input[autocomplete], dom:textarea[autocomplete], dom:select[autocomplete]",refactor:{WCAG21_Input_Autocomplete:{Pass_0:"pass",Fail_1:"fail_inappropriate",Fail_2:"fail_invalid",Fail_attribute_incorrect:"fail_incorrect"}},help:{"en-US":{group:"input_autocomplete_valid.html",pass:"input_autocomplete_valid.html",fail_inappropriate:"input_autocomplete_valid.html",fail_invalid:"input_autocomplete_valid.html",fail_incorrect:"input_autocomplete_valid.html"}},messages:{"en-US":{group:"The 'autocomplete' attribute's token(s) must be appropriate for the input form field",pass:"The 'autocomplete' attribute's token(s) is appropriate for the input form field",fail_inappropriate:"The 'autocomplete' attribute's token(s) are not appropriate for the input form field",fail_invalid:"The 'autocomplete' attribute's token(s) are not appropriate for an input form field of any type",fail_incorrect:"The 'autocomplete' attribute has an incorrect value"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.5"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[{"73f2c2":{pass:"pass",fail_inappropriate:"fail",fail_invalid:"pass",fail_incorrect:"fail"}}],run:function(e,t,i){var n=e.dom.node;if(!r.VisUtil.isNodeVisible(n)||l.CommonUtil.isNodeDisabled(n))return null;var o=n.getAttribute("autocomplete").trim().toLowerCase(),s=o.split(/\s+/);if(0===s.length||0===o.length)return null;var u={tokensOnOff:["on","off"],tokenOptionalSection:"section-",tokensOptionalPurpose:["shipping","billing"],tokensMandatoryGroup1_password:["new-password","current-password","one-time-code"],tokensMandatoryGroup1_multiline:["street-address"],tokensMandatoryGroup1_month:["cc-exp"],tokensMandatoryGroup1_numeric:["cc-exp-month","cc-exp-year","transaction-amount","bday-day","bday-month","bday-year"],tokensMandatoryGroup1_date:["bday"],tokensMandatoryGroup1_url:["url","photo"],tokensMandatoryGroup1_text:["name","honorific-prefix","given-name","additional-name","family-name","honorific-suffix","nickname","username","organization-title","organization","address-line1","address-line2","address-line3","address-level4","address-level3","address-level2","address-level1","country","country-name","postal-code","cc-name","cc-given-name","cc-additional-name","cc-family-name","cc-number","cc-csc","cc-type","transaction-currency","language","sex"],tokensMandatoryGroup1_all:["name","honorific-prefix","given-name","additional-name","family-name","honorific-suffix","nickname","username","new-password","current-password","organization-title","organization","street-address","address-line1","address-line2","address-line3","address-level4","address-level3","address-level2","address-level1","country","country-name","postal-code","cc-name","cc-given-name","cc-additional-name","cc-family-name","cc-number","cc-exp","cc-exp-month","cc-exp-year","cc-csc","cc-type","transaction-currency","transaction-amount","language","bday","bday-day","bday-month","bday-year","sex","url","photo"],tokensOptionalGroup2:["home","work","mobile","fax","pager"],tokensMandatoryGroup2_tel:["tel"],tokensMandatoryGroup2_email:["email"],tokensMandatoryGroup2_url:["impp"],tokensMandatoryGroup2_text:["tel-country-code","tel-national","tel-area-code","tel-local","tel-local-prefix","tel-local-suffix","tel-extension"],tokensMandatoryGroup2_all:["tel","tel-country-code","tel-national","tel-area-code","tel-local","tel-local-prefix","tel-local-suffix","tel-extension","email","impp"],tokensOptionGroup1_webauthn:["webauthn"]},d=[];for(var c in u)d=d.concat(u[c]);var m=!1,p=!0,h=n.nodeName.toLowerCase();if(!s.every(function(e){return d.includes(e)||e.startsWith(u.tokenOptionalSection)}))return(0,a.RuleFail)("fail_incorrect");var g=n.hasAttribute("type")?n.getAttribute("type").trim().toLowerCase():"text",b=[],_=[],f=[];if("textarea"===h||"select"===h)b=u.tokensMandatoryGroup1_all,_=u.tokensMandatoryGroup2_all,"textarea"===h&&(f=u.tokensOptionGroup1_webauthn);else{if("input"!==h)return null;switch(f=u.tokensOptionGroup1_webauthn,g){case"text":case"search":b=u.tokensMandatoryGroup1_text.concat(u.tokensMandatoryGroup1_password,u.tokensMandatoryGroup1_url,u.tokensMandatoryGroup1_numeric,u.tokensMandatoryGroup1_month,u.tokensMandatoryGroup1_date),_=u.tokensMandatoryGroup2_all;break;case"password":b=u.tokensMandatoryGroup1_password;break;case"url":b=u.tokensMandatoryGroup1_url,_=u.tokensMandatoryGroup2_url;break;case"email":_=u.tokensMandatoryGroup2_email;break;case"tel":_=u.tokensMandatoryGroup2_tel;break;case"number":b=u.tokensMandatoryGroup1_numeric;break;case"month":b=u.tokensMandatoryGroup1_month;break;case"date":b=u.tokensMandatoryGroup1_date;break;default:return null}}if(s.includes("on")||s.includes("off"))return 1===s.length?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_invalid");var v=0,A=0;return s[v].startsWith(u.tokenOptionalSection)&&s[v].length>8&&(v++,A++),s.length>v&&u.tokensOptionalPurpose.includes(s[v])&&(v++,A++),s.length>v&&(b.includes(s[v])?(m=!0,v++):(u.tokensOptionalGroup2.includes(s[v])&&v++,_.includes(s[v])&&(m=!0,v++))),s.length>A&&(u.tokensMandatoryGroup1_all.includes(s[A])?(p=!0,A++):(u.tokensOptionalGroup2.includes(s[A])&&A++,u.tokensMandatoryGroup2_all.includes(s[A])&&(p=!0,A++))),s.length>v+A&&f.includes(s[v+A])&&v++,(s.length>v&&f.includes(s[v])||s.length>A&&f.includes(s[A]))&&(v++,A++),m&&s.length===v?(0,a.RulePass)("pass"):p&&s.length===A?(0,a.RuleFail)("fail_incorrect"):(0,a.RuleFail)("fail_inappropriate")}}},7726(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_checkboxes_grouped=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(3864),s=i(4566),u=i(3946),d=i(9196);t.input_checkboxes_grouped={id:"input_checkboxes_grouped",context:"dom:input[type=radio], dom:input[type=checkbox]",refactor:{WCAG20_Input_RadioChkInFieldSet:{Pass_LoneNogroup:"pass_lonenogroup",Pass_Grouped:"pass_grouped",Pass_RadioNoName:"pass_radioNoName",Fail_ControlNameMismatch:"fail_controlnamemismatch",Fail_NotGroupedOtherGrouped:"fail_notgroupedothergrouped",Fail_NotGroupedOtherNotGrouped:"fail_notgroupedothernotgrouped",Fail_NotSameGroup:"fail_notsamegroup",Potential_LoneCheckbox:"potential_lonecheckbox",Potential_UnnamedCheckbox:"potential_unnamedcheckbox"}},help:{"en-US":{group:"input_checkboxes_grouped.html",pass_lonenogroup:"input_checkboxes_grouped.html",pass_grouped:"input_checkboxes_grouped.html",pass_radiononame:"input_checkboxes_grouped.html",fail_controlnamemismatch:"input_checkboxes_grouped.html",fail_notgroupedothergrouped:"input_checkboxes_grouped.html",fail_notgroupedothernotgrouped:"input_checkboxes_grouped.html",fail_notsamegroup:"input_checkboxes_grouped.html",potential_lonecheckbox:"input_checkboxes_grouped.html",potential_unnamedcheckbox:"input_checkboxes_grouped.html"}},messages:{"en-US":{group:"Related sets of radio buttons or checkboxes should be programmatically grouped",pass_lonenogroup:"{0} grouping not required for a control of this type",pass_grouped:"{0} input is grouped with other related controls with the same name",pass_radiononame:"Radio input is not grouped, but passes because it has no name to group with other radio inputs",fail_controlnamemismatch:'{0} input found that has the same name, "{2}" as a {1} input',fail_notgroupedothergrouped:'{0} input is not in the group with another {0} with the name "{1}"',fail_notgroupedothernotgrouped:'{0} input and others with the name "{1}" are not grouped together',fail_notsamegroup:'{0} input is in a different group than another {0} with the name "{1}"',potential_lonecheckbox:"Verify that this ungrouped checkbox input is not related to other checkboxes",potential_unnamedcheckbox:"Verify that this un-named, ungrouped checkbox input is not related to other checkboxes"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node;if(u.VisUtil.isNodeHiddenFromAT(n))return null;var c=function(e){var t=r.CommonUtil.getAncestor(e,"fieldset")||l.AriaUtil.getAncestorWithRole(e,"radiogroup")||l.AriaUtil.getAncestorWithRole(e,"group")||l.AriaUtil.getAncestorWithRole(e,"grid")||l.AriaUtil.getAncestorWithRole(e,"table");return t||(t=r.CommonUtil.getAncestor(e,"table"))&&!d.TableUtil.isDataTable(t)&&(t=null),t},m=n.getAttribute("type").toLowerCase(),p=l.AriaUtil.getAncestorWithRole(n,"form")||r.CommonUtil.getAncestor(n,"html")||n.ownerDocument.documentElement,h=s.CacheUtil.getCache(p,"input_checkboxes_grouped",null);if(!h){h={checkboxByName:{},radiosByName:{},nameToGroup:{},numCheckboxes:0,numRadios:0};for(var g=new o.DOMWalker(p,!1,p,!0),b=[],_=[];g.nextNode();)if(!g.bEndTag&&1===g.node.nodeType&&"input"===g.node.nodeName.toLowerCase()&&u.VisUtil.isNodeVisible(g.node)){var f=g.node.getAttribute("type");"checkbox"===f?b.push(g.node):"radio"===f&&_.push(g.node)}for(var v=0;v<b.length;++v){var A=b[v];if((l.AriaUtil.getAncestorWithRole(A,"form")||r.CommonUtil.getAncestor(n,"html")||n.ownerDocument.documentElement)===p&&!r.CommonUtil.shouldNodeBeSkippedHidden(A)){var w=A.getAttribute("name")||"";(h.checkboxByName[w]=h.checkboxByName[w]||[]).push(A),h.nameToGroup[w]=h.nameToGroup[w]||c(A),++h.numCheckboxes}}for(v=0;v<_.length;++v){var y=_[v];if((l.AriaUtil.getAncestorWithRole(y,"form")||r.CommonUtil.getAncestor(n,"html")||n.ownerDocument.documentElement)===p&&!r.CommonUtil.shouldNodeBeSkippedHidden(y)){var C=y.getAttribute("name")||"";(h.radiosByName[C]=h.radiosByName[C]||[]).push(y),h.nameToGroup[C]=h.nameToGroup[C]||c(y),++h.numRadios}}s.CacheUtil.setCache(p,"input_checkboxes_grouped",h)}var k=n.getAttribute("name"),R=c(n);if(m="radio"===m?"Radio":"Checkbox",k&&""!==k){var x=(h.radiosByName[k]||[]).length,P=(h.checkboxByName[k]||[]).length;return x>0&&P>0?(0,a.RuleFail)("fail_controlnamemismatch",[m,"checkbox"===m?"radio":"checkbox",k]):"Radio"===m&&(1===h.numRadios||1===x)||"Checkbox"===m&&1===h.numCheckboxes?null===R?(0,a.RulePass)("pass_lonenogroup",[m]):(0,a.RulePass)("pass_grouped",[m]):"Checkbox"===m&&h.numCheckboxes>1&&1===P?null===R?(0,a.RulePotential)("potential_lonecheckbox",[m]):(0,a.RulePass)("pass_grouped",[m]):null===R?null!==h.nameToGroup[k]?(0,a.RuleFail)("fail_notgroupedothergrouped",[m,k]):(0,a.RuleFail)("fail_notgroupedothernotgrouped",[m,k]):h.nameToGroup[k]!==R?(0,a.RuleFail)("fail_notsamegroup",[m,k]):(0,a.RulePass)("pass_grouped",[m])}return"Radio"===m?null===R?(0,a.RulePass)("pass_radiononame",[m]):(0,a.RulePass)("pass_grouped",[m]):null===R?(h.checkboxByName[""]||[]).length>1?(0,a.RulePotential)("potential_unnamedcheckbox",[m]):(0,a.RulePass)("pass_lonenogroup",[m]):(0,a.RulePass)("pass_grouped",[m])}}},3142(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_fields_grouped=void 0;var a=i(461),n=i(461),l=i(7139);t.input_fields_grouped={id:"input_fields_grouped",context:"dom:input, dom:textarea, dom:select",refactor:{WCAG20_Input_InFieldSet:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"input_fields_grouped.html",Potential_1:"input_fields_grouped.html",group:"input_fields_grouped.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Use the <fieldset> element to group logically related input elements",group:"Groups of logically related input elements should be contained within a <fieldset> element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node;if("input"==n.nodeName.toLowerCase()&&n.hasAttribute("type")&&"text"!=(m=n.getAttribute("type").toLowerCase())&&"file"!=m&&"password"!=m)return(0,a.RulePass)("Pass_0");if(null!=l.CommonUtil.getAncestor(n,"fieldset"))return(0,a.RulePass)("Pass_0");for(var r=l.CommonUtil.getAncestor(n,["form","body"]),o=["input","textarea","select"],s=!0,u=0;s&&u<o.length;++u)for(var d=r.getElementsByTagName(o[u]),c=0;s&&c<d.length;++c)if(!l.CommonUtil.shouldNodeBeSkippedHidden(d[c])){var m=d[c].hasAttribute("type")?d[c].getAttribute("type").toLowerCase():"text";s=d[c]==n||"text"!=m&&"password"!=m&&"file"!=m}return s?(0,a.RulePass)("Pass_0"):s?void 0:(0,a.RulePotential)("Potential_1")}}},1353(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_haspopup_conflict=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(3946);t.input_haspopup_conflict={id:"input_haspopup_conflict",context:"dom:input[list][aria-haspopup]",refactor:{input_haspopup_invalid:{Potential_1:"potential_type_misuse",Potential_2:"potential_misuse"}},help:{"en-US":{group:"input_haspopup_conflict.html",potential_type_misuse:"input_haspopup_conflict.html",potential_misuse:"input_haspopup_conflict.html",potential_list_notexist:"input_haspopup_conflict.html",fail_invalid_list_type:"input_haspopup_conflict.html",fail_invalid_list_elem:"input_haspopup_conflict.html"}},messages:{"en-US":{group:"<input> element with a 'list' attribute should not use an explicit 'aria-haspopup' attribute",potential_type_misuse:"The <input> element with type \"{0}\" and 'list' attribute uses an explicit 'aria-haspopup' attribute",potential_misuse:"The <input> element with a missing or invalid type and 'list' attribute uses an explicit 'aria-haspopup' attribute",potential_list_notexist:"The list attribute for the <input> element is invalid",fail_invalid_list_type:'The list attribute for the <input> element with the type "{0}" is invalid',fail_invalid_list_elem:"The list attribute for the <input> element does not reference a datalist element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(o.VisUtil.isNodeHiddenFromAT(n)||r.CommonUtil.isNodeDisabled(n))return null;var s=l.AriaUtil.getUserDefinedRoles(n);if(s&&s.length>0&&!s.includes("combobox"))return null;var u=["text","search","tel","url","email","date","month","week","time","datetime-local","number","range","color"],d=["file","password","checkbox","radio","submit","reset","image","hidden","button"],c=n.getAttribute("type");if(!c||0===c.trim().length)return(0,a.RulePotential)("potential_misuse");if(c=c.trim().toLowerCase(),!u.includes(c)&&!d.includes(c))return(0,a.RulePotential)("potential_misuse");if(c&&d.includes(c))return(0,a.RuleFail)("fail_invalid_list_type");var m=n.getAttribute("list");if(!m||0===m.trim().length)return(0,a.RulePotential)("potential_list_notexist");var p=n.ownerDocument.getElementById(m);return p?"datalist"!==p.nodeName.toLowerCase()?(0,a.RuleFail)("fail_invalid_list_elem"):u.includes(c)?(0,a.RulePotential)("potential_type_misuse",[c]):void 0:(0,a.RuleFail)("potential_list_notexist")}}},2631(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_label_after=void 0;var a=i(461),n=i(461),l=i(3864),r=i(7139);t.input_label_after={id:"input_label_after",context:"dom:input",refactor:{WCAG20_Input_LabelAfter:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_0:"input_label_after.html",Fail_1:"input_label_after.html",Fail_2:"input_label_after.html",group:"input_label_after.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Checkbox or radio button is nested in label, so label is not after the input control",Fail_2:"Label text is located before its associated checkbox or radio button element",group:"Checkboxes and radio buttons must have a label after the input control"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.3.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,o="";if(n.hasAttribute("type")&&(o=n.getAttribute("type").toLowerCase()),"checkbox"!=o&&"radio"!=o)return null;var s=r.CommonUtil.getLabelForElementHidden(n,!0);if(null===s||!r.CommonUtil.hasInnerContentHidden(s))return null;var u,d=r.CommonUtil.compareNodeOrder(s,n);if(-2===d){u=!1;var c=new l.DOMWalker(s);for(c.node=n;!u&&c.nextNode();)u="#text"===c.node.nodeName.toLowerCase()&&c.node.nodeValue.trim().length>0||"span"===c.node.nodeName.toLowerCase()&&c.node.textContent.trim().length>0;if(!u)return(0,a.RuleFail)("Fail_1")}else if(1!=d)return(0,a.RuleFail)("Fail_2");return(0,a.RulePass)("Pass_0")}}},8550(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_label_before=void 0;var a=i(461),n=i(461),l=i(7139);t.input_label_before={id:"input_label_before",context:"dom:input, dom:textarea, dom:select",refactor:{WCAG20_Input_LabelBefore:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_0:"input_label_before.html",Fail_1:"input_label_before.html",Fail_2:"input_label_before.html",group:"input_label_before.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Text input is nested in label such that input precedes the label text",Fail_2:"Label text is located after its associated text input or <select> element",group:"Text inputs and <select> elements must have a label before the input control"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.3.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if("input"==n.nodeName.toLowerCase()&&n.hasAttribute("type")){var r=n.getAttribute("type").toLowerCase();if("text"!=r&&"file"!=r&&"password"!=r)return null}var o=l.CommonUtil.getLabelForElementHidden(n,!0);if(null==o||!l.CommonUtil.hasInnerContentHidden(o))return null;var s=l.CommonUtil.compareNodeOrder(o,n);if(-2===s){var u=l.CommonUtil.getInnerText(n);if(u&&u.trim().length>0&&l.CommonUtil.getInnerText(n).trim()===u.trim())return null;for(var d=!1,c=n.previousSibling;!d&&null!==c;)d="#text"==c.nodeName.toLowerCase()&&c.nodeValue.trim().length>0||"span"==c.nodeName.toLowerCase()&&c.textContent.trim().length>0,c=c.previousSibling;if(!d)return(0,a.RuleFail)("Fail_1")}else if(-1!=s)return(0,a.RuleFail)("Fail_2");return(0,a.RulePass)("Pass_0")}}},8853(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_label_exists=void 0;var a=i(461),n=i(461),l=i(7011),r=i(3946),o=i(1950);t.input_label_exists={id:"input_label_exists",context:"aria:button,aria:checkbox,aria:combobox,aria:listbox,aria:menuitemcheckbox,aria:menuitemradio,aria:radio,aria:searchbox,aria:slider,aria:spinbutton,aria:switch,aria:textbox,aria:progressbar,dom:input[type=file],dom:output,dom:meter,dom:input[type=password]",refactor:{WCAG20_Input_ExplicitLabel:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_0:"input_label_exists.html",Fail_1:"input_label_exists.html",Fail_2:"input_label_exists.html",group:"input_label_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Form control element <{0}> has no associated label",Fail_2:'Form control with "{0}" role has no associated label',group:"Each form control must have an associated label"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:["97a4e1","e086e5"],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var s=n.nodeName.toLowerCase();if("datalist"===s)return null;var u="text";if("input"==s&&n.hasAttribute("type")?u=n.getAttribute("type").toLowerCase():("button"===s||l.AriaUtil.hasRoleInSemantics(n,"button"))&&(u="buttonelem"),"input"==s&&""==u&&(u="text"),"image"===u)return null;var d=o.AccNameUtil.computeAccessibleName(n);return d&&d.name&&d.name.trim().length>0?(0,a.RulePass)("Pass_0"):n.hasAttribute("role")&&n.getAttribute("role").trim().length>0?(0,a.RuleFail)("Fail_2",n.getAttribute("role").split(" ")):(0,a.RuleFail)("Fail_1",[s])}}},3180(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_label_visible=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(5279),s=i(3946),u=i(1686),d=i(1950);t.input_label_visible={id:"input_label_visible",context:"aria:button,aria:checkbox,aria:combobox,aria:listbox,aria:menuitemcheckbox,aria:menuitemradio,aria:radio,aria:searchbox,aria:slider,aria:spinbutton,aria:switch,aria:textbox",dependencies:["input_label_exists"],refactor:{WCAG20_Input_VisibleLabel:{Pass_0:"pass",Potential_1:"potential_no_label",potential_placeholder_only:"potential_placeholder_only"}},help:{"en-US":{pass:"input_label_visible.html",potential_placeholder_only:"input_label_visible.html",potential_no_label:"input_label_visible.html",group:"input_label_visible.html"}},messages:{"en-US":{pass:"The input element has an associated visible label",potential_placeholder_only:"The ‘placeholder’ is the only visible label",potential_no_label:"The input element does not have an associated visible label",group:"An input element must have an associated visible label"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.5.3","3.3.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,c=n.nodeName.toLowerCase();if("datalist"===c)return null;if(!s.VisUtil.isNodeVisible(n)||r.CommonUtil.isNodeDisabled(n))return null;if(r.CommonUtil.getAncestor(n,"table"))return null;var m=l.AriaUtil.getResolvedRole(n);if(m&&"button"===m&&"input"!==c&&"button"!==c&&!r.CommonUtil.getAncestor(n,"form"))return null;if(l.AriaUtil.getAncestorWithRole(n,"combobox")&&!(l.AriaUtil.hasRoleInSemantics(n,"textbox")||l.AriaUtil.hasRoleInSemantics(n,"searchbox")||"input"===c||"select"===c&&l.AriaUtil.hasRoleInSemantics(n,"combobox")))return null;for(var p=["listbox","tree","grid","dialog"],h=0;h<p.length;h++)if(l.AriaUtil.hasRoleInSemantics(n,p[h]))for(var g=r.CommonUtil.getElementsByRoleHidden(n.ownerDocument,"combobox",!0,!0),b=0;b<g.length;b++){var _=g[b],f=r.CommonUtil.getElementAttribute(_,"aria-owns");if(f)for(var v=r.CommonUtil.normalizeSpacing(f.trim()).split(" "),A=0;A<v.length;A++)if(o.FragmentUtil.getById(n,v[A])===n)return null}var w=d.AccNameUtil.computeAccessibleName(n);if(("input"===c||"button"===c)&&w&&w.name&&w.name.trim().length>0&&("label"===w.nameFrom||"internal"===w.nameFrom||"alt"===w.nameFrom))return(0,a.RulePass)("pass");if(w&&w.name&&w.name.trim().length>0&&("text"===w.nameFrom||"title"===w.nameFrom))return(0,a.RulePass)("pass");var y=r.CommonUtil.getOnScreenInnerText(n);if(y&&0!==y.length)return(0,a.RulePass)("pass");var C=l.AriaUtil.getAllDescendantsWithRoles(n,["img","graphics-document","graphics-object","graphics-symbol"],!1,!0);if(C&&C.length>0)for(var k=0;k<C.length;k++)if(r.CommonUtil.attributeNonEmpty(C[k],"title")||r.CommonUtil.attributeNonEmpty(C[k],"alt"))return(0,a.RulePass)("pass");if(r.CommonUtil.attributeNonEmpty(n,"aria-labelledby")){var R=n.getAttribute("aria-labelledby").split(/\s+/);for(h=0;h<R.length;++h){var x=o.FragmentUtil.getById(n,R[h]);if(x&&!u.DOMUtil.sameNode(x,n)&&s.VisUtil.isNodeVisible(x)&&r.CommonUtil.hasInnerContentHidden(x))return(0,a.RulePass)("pass")}}if(("optgroup"===c||"option"==c)&&w&&w.name&&w.name.trim().length>0&&("label"===w.nameFrom||"content"===w.nameFrom))return(0,a.RulePass)("pass");var P=n.getAttribute("id");return P&&P.trim().length>0&&n.ownerDocument.querySelector("*[aria-controls='".concat(P,"'][role='combobox']"))?null:r.CommonUtil.attributeNonEmpty(n,"placeholder")?(0,a.RulePotential)("potential_placeholder_only"):(0,a.RulePotential)("potential_no_label")}}},1382(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_onchange_review=void 0;var a=i(461),n=i(461);t.input_onchange_review={id:"input_onchange_review",context:"dom:input[onchange], dom:textarea[onchange], dom:select[onchange]",refactor:{WCAG20_Input_HasOnchange:{Potential_1:"potential_warning"}},help:{"en-US":{potential_warning:"input_onchange_review.html",group:"input_onchange_review.html"}},messages:{"en-US":{group:"Users must be advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs",potential_warning:"Confirm that the user is advised if, due to a change of element value, a form automatically submits, a new window opens, or a change in focus occurs"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.2.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if("input"==n.nodeName.toLowerCase()&&n.hasAttribute("type")){var l=n.getAttribute("type").toLowerCase();if("hidden"===l||"submit"===l||"image"===l||"button"===l||"reset"===l)return null}return(0,a.RulePotential)("potential_warning")}}},953(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.input_placeholder_label_visible=void 0;var a=i(461);t.input_placeholder_label_visible={id:"input_placeholder_label_visible",context:"dom:input[placeholder], dom:textarea[placeholder]",refactor:{HAAC_Input_Placeholder:{Pass_0:"Pass_0",Potential_1:"Potential_1",Potential_2:"Potential_2"}},help:{"en-US":{Pass_0:"input_placeholder_label_visible.html",Potential_1:"input_placeholder_label_visible.html",Potential_2:"input_placeholder_label_visible.html",group:"input_placeholder_label_visible.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"HTML5 placeholder is the only visible label",Potential_2:"Additional visible label referenced by 'aria-labelledby' is not valid",group:"HTML5 'placeholder' attribute must not be used as a visible label replacement"}},rulesets:[],act:[],run:function(e,t,i){var n=e.dom.node;if(n.hasAttribute("type")){var l=n.getAttribute("type").toLowerCase();if("hidden"==l||"button"==l)return(0,a.RulePass)("Pass_0")}if(n.hasAttribute("hidden")){var r=n.getAttribute("hidden");if(""==r||"hidden"==r.toLowerCase())return(0,a.RulePass)("Pass_0")}if(n.hasAttribute("aria-label"))return(0,a.RulePotential)("Potential_1");if(n.hasAttribute("aria-labelledby")&&n.hasAttribute("id")){var o=n.getAttribute("id").trim();return n.getAttribute("aria-labelledby").trim().split(/\s+/).includes(o)?(0,a.RulePotential)("Potential_2"):(0,a.RulePass)("Pass_0")}return(0,a.RulePass)("Pass_0")}}},2222(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.label_content_exists=void 0;var a=i(461),n=i(461),l=i(7139),r=i(5279),o=i(1686);t.label_content_exists={id:"label_content_exists",context:"dom:label",refactor:{Valerie_Label_HasContent:{Pass_Regular:"Pass_Regular",Pass_AriaLabel:"Pass_AriaLabel",Pass_LabelledBy:"Pass_LabelledBy",Fail_1:"Fail_1"}},help:{"en-US":{Pass_Regular:"label_content_exists.html",Pass_AriaLabel:"label_content_exists.html",Pass_LabelledBy:"label_content_exists.html",Fail_1:"label_content_exists.html",group:"label_content_exists.html"}},messages:{"en-US":{Pass_Regular:"<label> element has accessible name with inner content",Pass_AriaLabel:"<label> element has accessible name via 'aria-label'",Pass_LabelledBy:"<label> element has accessible name via 'aria-labelledby'",Fail_1:"The <label> element does not have descriptive text that identifies the expected input",group:"A <label> element must have non-empty descriptive text that identifies the purpose of the interactive component"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.CommonUtil.hasInnerContentHidden(n))return(0,a.RulePass)("Pass_Regular");if((n.getAttribute("aria-label")||"").trim().length>0)return(0,a.RulePass)("Pass_AriaLabel");if(n.hasAttribute("aria-labelledby")){var s=r.FragmentUtil.getById(n,n.getAttribute("aria-labelledby"));if(s&&!o.DOMUtil.sameNode(s,n)&&l.CommonUtil.hasInnerContent(s))return(0,a.RulePass)("Pass_LabelledBy")}return(0,a.RuleFail)("Fail_1")}}},4678(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.label_name_visible=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(5279),s=i(3946),u=i(4919),d=i(3864);t.label_name_visible={id:"label_name_visible",context:"aria:button,aria:checkbox,aria:gridcell,aria:link,aria:menuitem,aria:menuitemcheckbox,aria:menuitemradio,aria:option,aria:radio,aria:switch,aria:tab,aria:treeitem,dom:input,dom:textarea,dom:select,dom:output,dom:meter",refactor:{WCAG21_Label_Accessible:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"label_name_visible.html",Fail_1:"label_name_visible.html",group:"label_name_visible.html"}},messages:{"en-US":{Pass_0:"Accessible name matches or contains the visible label text",Fail_1:"Accessible name does not match or contain the visible label text",group:"Accessible name must match or contain the visible label text"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_2"],num:["2.5.3"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:"2ee8b8",run:function(e,t,i){var n=e.dom.node;if(!s.VisUtil.isNodeVisible(n)||r.CommonUtil.isNodeDisabled(n))return null;if(u.CSSUtil.isMaterialIconFont(n))return(0,a.RulePass)("Pass_0");var c=!0,m=n.nodeName.toLowerCase(),p=!1,h=null;"input"===m&&n.hasAttribute("type")&&(h=n.getAttribute("type").toLowerCase(),-1!==r.CommonUtil.form_button_types.indexOf(h)&&(p=!0));var g=l.AriaUtil.getAriaAttribute(n,"aria-labelledby");if(!g||r.CommonUtil.isIdReferToSelf(n,g)||p){var b=null;if(g&&!r.CommonUtil.isIdReferToSelf(n,g))for(var _=g.split(/\s+/),f=0;f<_.length;++f){var v=o.FragmentUtil.getById(n,_[f]);if(v){b=r.CommonUtil.getInnerText(v);break}}else b=l.AriaUtil.getAriaAttribute(n,"aria-label");if(!b)return null;var A=null;if(p&&(n.hasAttribute("value")?A=n.getAttribute("value"):"submit"===h?A="submit":"reset"===h&&(A="reset")),!A){var w=r.CommonUtil.getLabelForElementHidden(n,!0);if(!w){var y=d.DOMWalker.parentNode(n);if("label"===y.nodeName.toLowerCase()){var C=y.cloneNode(!0);w=r.CommonUtil.removeAllFormElementsFromLabel(C)}}var k=w||n;A=w||-1===["meter","output","progress","select","textarea"].indexOf(m)?r.CommonUtil.getOnScreenInnerText(k):""}var R=/[^a-zA-Z0-9]/g;A=A.replace(R," ");var x=r.CommonUtil.normalizeSpacing(A).toLowerCase();b=b.replace(R," ");var P=r.CommonUtil.normalizeSpacing(b).toLowerCase();if(x.length>1){var T=P.indexOf(x);if(T>=0&&P.length>x.length){var U=/^[0-9a-zA-Z]+$/;T+x.length<P.length&&P.charAt(T+x.length).match(U)&&(c=!1),c&&T>0&&P.charAt(T-1).match(U)&&(c=!1)}-1===T&&(c=!1)}}return c?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},7578(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.label_ref_valid=void 0;var a=i(461),n=i(461),l=i(5279),r=i(3946);t.label_ref_valid={id:"label_ref_valid",context:"dom:label[for]",refactor:{WCAG20_Label_RefValid:{Pass_0:"pass",Fail_1:"fail_invalid"}},help:{"en-US":{pass:"label_ref_valid.html",fail_invalid:"label_ref_valid.html",group:"label_ref_valid.html"}},messages:{"en-US":{pass:"The 'for' attribute for a label referencea a unique non-empty 'id' attribute of a valid element",fail_invalid:"The value \"{0}\" of the 'for' attribute is not the 'id' of a valid element",group:"The 'for' attribute for a label should reference a non-empty, unique 'id' attribute of a valid element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,o=n.getAttribute("for"),s=!1,u=l.FragmentUtil.getById(n,o);if(u){if(!r.VisUtil.isNodeVisible(u)&&!r.VisUtil.isNodeVisible(n))return null;if(s=!0,!u.hasAttribute("role")){var d=u.nodeName.toLowerCase();if(s="input"==d||"select"==d||"textarea"==d||"button"==d||"datalist"==d||"optgroup"==d||"option"==d||"keygen"==d||"output"==d||"progress"==d||"meter"==d||"fieldset"==d||"legend"==d,"input"==u.nodeName.toLowerCase()&&u.hasAttribute("type")){var c=u.getAttribute("type").toLowerCase();s="text"==c||"password"==c||"file"==c||"checkbox"==c||"radio"==c||"hidden"==c||"search"==c||"tel"==c||"url"==c||"email"==c||"date"==c||"number"==c||"range"==c||"image"==c||"time"==c||"color"==c||"datetime-local"==c||"month"==c||"week"==c}}s&&!r.VisUtil.isNodeVisible(u)&&(s=!1)}var m=[];return s||m.push(o),s?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_invalid",m)}}},9964(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.list_children_valid=void 0;var a=i(461),n=i(461),l=i(7011),r=i(3864);t.list_children_valid={id:"list_children_valid",context:"aria:group",refactor:{HAAC_List_Group_ListItem:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"list_children_valid.html",Fail_1:"list_children_valid.html",group:"list_children_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'List component with "group" role has children that are not <listitem> elements',group:'List component with "group" role must limit children to <listitem> elements'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,o=r.DOMWalker.parentElement(n);if(!l.AriaUtil.hasRoleInSemantics(o,"list"))return null;for(var s=!0,u=n.children,d=0;s&&d<u.length;d++)s=l.AriaUtil.hasRoleInSemantics(u[d],"listitem");return s?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},6401(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.list_markup_review=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(3864),s=i(3946);t.list_markup_review={id:"list_markup_review",context:"dom:*",refactor:{RPT_List_UseMarkup:{Potential_1:"Potential_1"}},help:{"en-US":{potential_list:"list_markup_review.html",group:"list_markup_review.html"}},messages:{"en-US":{potential_list:"Verify this is a list and if so, modify to use proper HTML elements for the list",group:"Proper HTML elements should be used to create a list"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,u=n.nodeName.toLowerCase();if(r.CommonUtil.isNodeDisabled(n)||s.VisUtil.hiddenByDefaultElements.includes(u))return null;if(null===r.CommonUtil.getAncestor(n,["body"]))return null;if(null!==r.CommonUtil.getAncestor(n,["script","label"]))return null;var d=l.AriaUtil.getRolesWithTypes(n,["widget"]);if(r.CommonUtil.concatUniqueArrayItemList(["caption","code","columnheader","figure","list","listitem","math","meter","columnheader","rowheader"],d),null!==l.AriaUtil.getAncestorWithRoles(n,d))return null;for(var c=!0,m=n.firstChild;c&&m;){if("#text"==m.nodeName){var p=m.nodeValue;if(!(c=!/^[ \t\r\n]*[( ]*[1-9]*[\*\-).][ \t][A-Z,a-z]+/.test(p)))for(var h=new o.DOMWalker(m);!c&&h.prevNode();){var g=h.node.nodeName.toLowerCase();if(["blockquote","center","dir","div","form","h1","h2","h3","h4","h5","h6","hr","br","menu","p","pre"].includes(g))break;if("#text"==g){var b=h.node.nodeValue;c=b.length>0&&![" ","\t","\n"].includes(b.charAt(b.length-1))}}}m=m.nextSibling}return c?null:c?void 0:(0,a.RulePotential)("potential_list")}}},1174(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.list_structure_proper=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139);t.list_structure_proper={id:"list_structure_proper",context:"dom:dl, dom:ul, dom:ol, dom:dir, dom:menu, dom:li, dom:dd, dom:dt",refactor:{RPT_List_Misuse:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"list_structure_proper.html",Potential_1:"list_structure_proper.html",group:"list_structure_proper.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"List element is missing or improperly structured",group:"List elements should only be used for lists of related items"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n,o=e.dom.node,s=o.nodeName.toLowerCase();if(o.children,"dl"==s){var u="",d="",c=o.firstChild;n=!0;var m=!1;if(o.children&&0!=o.children.length){for(;n&&null!=c;){if(1==c.nodeType){var p=c.nodeName.toLowerCase();if(l.AriaUtil.isPresentationalElement(c)){m=!0,c=c.nextSibling;continue}n="dd"==p||"dt"==p,""==u&&(u=p),d=p}c=c.nextSibling}n=n&&"dt"==u&&"dd"==d||n&&m}else n=!0}else if("li"==s)n=null!=r.CommonUtil.getAncestor(o,["ul","ol","dir","menu"]);else if("dd"==s||"dt"==s)n=null!=r.CommonUtil.getAncestor(o,"dl");else if(c=o.firstChild,"ul"!=s&&"ol"!=s&&"menu"!=s||o.children&&0!=o.children.length){var h=!1;for(m=!1,n=!0;n&&null!=c;)l.AriaUtil.isPresentationalElement(c)?(m=!0,c=c.nextSibling):(n=1!=c.nodeType||"li"==c.nodeName.toLowerCase()||"template"==c.nodeName.toLowerCase()&&("ul"==s||"ol"==s),h=h||1==c.nodeType&&"li"==c.nodeName.toLowerCase(),c=c.nextSibling);n=n&&h||n&&m}else n=!0;return n?(0,a.RulePass)("Pass_0"):n?void 0:(0,a.RulePotential)("Potential_1")}}},9907(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.marquee_elem_avoid=void 0;var a=i(461),n=i(461);t.marquee_elem_avoid={id:"marquee_elem_avoid",context:"dom:marquee",refactor:{RPT_Marquee_Trigger:{Fail_1:"Fail_1"}},help:{"en-US":{Fail_1:"marquee_elem_avoid.html",group:"marquee_elem_avoid.html"}},messages:{"en-US":{Fail_1:"Scrolling content found that uses the obsolete <marquee> element",group:"The <marquee> element is obsolete and should not be used"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.2.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){return e.dom.node,(0,a.RuleFail)("Fail_1")}}},6032(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.media_alt_brief=void 0;var a=i(461),n=i(461),l=i(3946);t.media_alt_brief={id:"media_alt_brief",context:"dom:img[alt], dom:applet[alt], dom:area[alt], dom:embed[alt], dom:input[type][alt]",refactor:{RPT_Media_AltBrief:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"media_alt_brief.html",Potential_1:"media_alt_brief.html",group:"media_alt_brief.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Text alternative is more than 150 characters",group:"Alternative text in 'alt' attribute should be brief (<150 characters)"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var r=n.getAttribute("alt").trim().length<=150;return r?(0,a.RulePass)("Pass_0"):r?void 0:(0,a.RulePotential)("Potential_1")}}},5622(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.media_alt_exists=void 0;var a=i(461),n=i(461),l=i(7139),r=i(3946);t.media_alt_exists={id:"media_alt_exists",context:"dom:area[alt], dom:embed[alt]",refactor:{RPT_Media_AudioVideoAltFilename:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"media_alt_exists.html",Potential_1:"media_alt_exists.html",group:"media_alt_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Filename used as label for embedded audio or video",group:"Audio or video on the page must have a short text alternative that describes the media content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var o="";null==(o="area"==n.nodeName.toLowerCase()?n.getAttribute("href"):n.getAttribute("src"))&&(o="");var s=l.CommonUtil.getFileExt(o),u=0!=s.length&&(l.CommonUtil.isAudioExt(s)||l.CommonUtil.isVideoExt(s)),d=n.getAttribute("alt"),c=!u||d.length>0&&-1==d.indexOf(s);return c?(0,a.RulePass)("Pass_0"):c?void 0:(0,a.RulePotential)("Potential_1")}}},2240(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.media_audio_transcribed=void 0;var a=i(461),n=i(461),l=i(7139),r=i(3946);t.media_audio_transcribed={id:"media_audio_transcribed",context:"dom:bgsound, dom:a[href], dom:area[href], dom:embed, dom:object",refactor:{RPT_Media_AudioTrigger:{Manual_1:"Manual_1"}},help:{"en-US":{Manual_1:"media_audio_transcribed.html",group:"media_audio_transcribed.html"}},messages:{"en-US":{Manual_1:"Provide transcripts for audio files",group:"Audio information should also be available in text form"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.2.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n,o=e.dom.node;return r.VisUtil.isNodeHiddenFromAT(o)||(n="bgsound"!=o.nodeName.toLowerCase()&&!l.CommonUtil.isAudioObjEmbedLink(o))?null:n?void 0:(0,a.RuleManual)("Manual_1")}}},4019(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.media_autostart_controllable=void 0;var a=i(461),n=i(461);t.media_autostart_controllable={id:"media_autostart_controllable",context:"dom:param[name=autoplay], dom:param[name=autostart], dom:embed[flashvars], dom:embed[src], dom:*[autostart=true], dom:*[autostart=1], dom:bgsound",refactor:{RPT_Embed_AutoStart:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"media_autostart_controllable.html",Potential_1:"media_autostart_controllable.html",group:"media_autostart_controllable.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify there is a mechanism to pause or stop and control the volume for the audio that plays automatically",group:"Mechanism must be available to pause or stop and control the volume of the audio that plays automatically"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.4.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n,l=e.dom.node,r=l.nodeName.toLowerCase();if("bgsound"==r)n=!1;else if("param"==r){var o="";l.hasAttribute("value")&&(o=l.getAttribute("value").toLowerCase()),n=0==o.indexOf("0;")||!(-1!=o.indexOf("true")||-1!=o.indexOf("1"))}else if("embed"==r){var s;n=!0,l.hasAttribute("flashvars")&&(n=-1==(s=l.getAttribute("flashvars")).indexOf("autostart=true")&&-1==s.indexOf("autostart=1")),n&&l.hasAttribute("src")&&(n=-1==(s=l.getAttribute("src")).indexOf("autostart=true")&&-1==s.indexOf("autostart=1"))}if(n&&l.hasAttribute("autostart")){var u=l.getAttribute("autostart").toLowerCase();n="true"!=u&&"1"!=u}return n?(0,a.RulePass)("Pass_0"):(0,a.RulePotential)("Potential_1")}}},361(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.media_keyboard_controllable=void 0;var a=i(461),n=i(461),l=i(3946);t.media_keyboard_controllable={id:"media_keyboard_controllable",context:"dom:audio, dom:video",refactor:{HAAC_Audio_Video_Trigger:{Pass_0:"Pass_0",Manual_1:"Manual_1"}},help:{"en-US":{Pass_0:"media_keyboard_controllable.html",Manual_1:"media_keyboard_controllable.html",group:"media_keyboard_controllable.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Manual_1:"Verify media using <audio> and/or <video> elements have keyboard accessible controls",group:"Media using <audio> and/or <video> elements must have keyboard accessible controls"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var r=!0,o=n.nodeName.toLowerCase();return"audio"!=o&&"video"!==o||(r=!1),r?(0,a.RulePass)("Pass_0"):(0,a.RuleManual)("Manual_1")}}},5960(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.media_live_captioned=void 0;var a=i(461),n=i(461),l=i(7139);t.media_live_captioned={id:"media_live_captioned",context:"dom:embed, dom:object",refactor:{RPT_Media_VideoObjectTrigger:{Manual_1:"Manual_1"}},help:{"en-US":{Manual_1:"media_live_captioned.html",group:"media_live_captioned.html"}},messages:{"en-US":{Manual_1:"Verify captions are provided for live media (streaming video with audio)",group:"Live media (streaming video with audio) should have captions for audio content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.2.4"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,r=!l.CommonUtil.isVideoObjEmbedLink(n);return r?null:r?void 0:(0,a.RuleManual)("Manual_1")}}},5515(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.media_track_available=void 0;var a=i(461),n=i(461),l=i(7139),r=i(3946);t.media_track_available={id:"media_track_available",context:"dom:a[href], dom:area[href], dom:applet, dom:embed, dom:object",refactor:{RPT_Media_VideoReferenceTrigger:{Manual_1:"Manual_1"}},help:{"en-US":{Manual_1:"media_track_available.html",group:"media_track_available.html"}},messages:{"en-US":{Manual_1:"Verify availability of a user-selectable audio track with description of visual content",group:"Pre-recorded media should have an audio track that describes visual information"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.2.3","1.2.5"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var o;return(o="applet"!=n.nodeName.toLowerCase()&&!l.CommonUtil.isVideoObjEmbedLink(n))?null:o?void 0:(0,a.RuleManual)("Manual_1")}}},8752(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.meta_redirect_optional=void 0;var a=i(461),n=i(461),l=i(4566);t.meta_redirect_optional={id:"meta_redirect_optional",context:"dom:meta[http-equiv][content]",refactor:{WCAG20_Meta_RedirectZero:{pass:"pass",fail:"fail",fail_longrefresh:"fail_longrefresh"}},help:{"en-US":{group:"meta_redirect_optional.html",pass:"meta_redirect_optional.html",fail:"meta_redirect_optional.html",fail_longrefresh:"meta_redirect_optional.html"}},messages:{"en-US":{group:"Page should not automatically refresh without warning or option to turn it off or adjust the time limit",pass:"Rule Passed",fail:"Check page does not automatically refresh without warning or options",fail_longrefresh:"Check page does not automatically refresh without warning or options"}},rulesets:[{id:[],num:["2.2.4","3.2.5"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:["bisz58"],run:function(e,t,i){var n=e.dom.node;if("refresh"!==n.getAttribute("http-equiv").toLowerCase())return null;var r=n.ownerDocument;if(r){if(l.CacheUtil.getCache(r,"meta_redirect_optional_done",!1))return null;var o=n.getAttribute("content").toLowerCase();if(!o||0===o.trim().length)return null;var s=-1;if(o.match(/^\d+$/))s=parseInt(o);else if(o.match(/^\d+;/)){var u=o.indexOf(";");s=parseInt(o.substring(0,u))}return-1===s?null:(l.CacheUtil.setCache(r,"meta_redirect_optional_done",!0),0===s?(0,a.RulePass)("pass"):s<72001?(0,a.RuleFail)("fail"):(0,a.RuleFail)("fail_longrefresh"))}}}},8834(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.meta_refresh_delay=void 0;var a=i(461),n=i(461),l=i(4566);t.meta_refresh_delay={id:"meta_refresh_delay",context:"dom:meta[http-equiv][content]",refactor:{RPT_Meta_Refresh:{Pass_0:"pass",Potential_1:"potential_refresh"}},help:{"en-US":{group:"meta_refresh_delay.html",pass:"meta_refresh_delay.html",potential_refresh:"meta_refresh_delay.html"}},messages:{"en-US":{group:"Pages should not refresh automatically",pass:"Pages do not refresh automatically",potential_refresh:"Verify page is not being caused to refresh automatically"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.2.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:["bc659a"],run:function(e,t,i){var n=e.dom.node;if("refresh"!==n.getAttribute("http-equiv").toLowerCase())return null;var r=n.ownerDocument;if(r){if(l.CacheUtil.getCache(r,"meta_refresh_delay_done",!1))return null;var o=n.getAttribute("content").toLowerCase();if(!o||0===o.trim().length)return null;var s=-1;if(o.match(/^\d+$/))s=parseInt(o);else if(o.match(/^\d+;/)){var u=o.indexOf(";");s=parseInt(o.substring(0,u))}return-1===s?null:(l.CacheUtil.setCache(r,"meta_refresh_delay_done",!0),0===s?(0,a.RulePass)("pass"):(0,a.RulePotential)("potential_refresh"))}}}},1025(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.meta_viewport_zoomable=void 0;var a=i(461),n=i(461);t.meta_viewport_zoomable={id:"meta_viewport_zoomable",context:"dom:meta[name][content]",refactor:{meta_viewport_zoom:{Pass_0:"pass",Potential_1:"potential_zoomable"}},help:{"en-US":{group:"meta_viewport_zoomable.html",pass:"meta_viewport_zoomable.html",potential_zoomable:"meta_viewport_zoomable.html"}},messages:{"en-US":{group:"The 'meta[name=viewport]' should not prevent the browser zooming the content",pass:"The 'meta[name=viewport]' does not prevent the browser zooming the content",potential_zoomable:"Confirm the 'meta[name=viewport]' with \"{0}\" can be zoomed by user"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.4.4"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[{b4f0c3:{pass:"pass",potential_zoomable:"fail"}}],run:function(e,t,i){var n=e.dom.node;if("viewport"!==n.getAttribute("name").toLowerCase())return null;var l=n.getAttribute("content").toLowerCase();if(!l||""===l.trim()||!l.includes("maximum-scale")&&!l.includes("user-scalable"))return null;for(var r=null,o=null,s="yes",u="2.0",d=0,c=l.split(",");d<c.length;d++){var m=c[d],p=m.trim().split("=");p.length<2||(m.includes("user-scalable")?(r=m,((s=p[1].trim()).startsWith("'")||s.startsWith('"'))&&(s=s.substring(1,s.length-1))):m.includes("maximum-scale")&&(o=m,((u=p[1].trim()).startsWith("'")||u.startsWith('"'))&&(u=u.substring(1,u.length-1).trim())))}var h=Number(s);isNaN(h)||(h>=1||h<=-1)&&(s="yes");var g;return h=Number(u),g=isNaN(h)?"yes"===u?1:.1:h<0?2:h,"yes"!==s?(0,a.RulePotential)("potential_zoomable",[r]):g<2?(0,a.RulePotential)("potential_zoomable",[o]):(0,a.RulePass)("pass")}}},9116(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.noembed_content_exists=void 0;var a=i(461),n=i(461),l=i(7139),r=i(3946);t.noembed_content_exists={id:"noembed_content_exists",context:"dom:noembed",refactor:{Valerie_Noembed_HasContent:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"noembed_content_exists.html",Potential_1:"noembed_content_exists.html",group:"noembed_content_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Add descriptive text to the <noembed> element",group:"<noembed> elements should contain descriptive text"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_FOUR}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n))return null;var o=l.CommonUtil.hasInnerContentHidden(n);return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},435(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.object_text_exists=void 0;var a=i(461),n=i(461),l=i(3946),r=i(1950);t.object_text_exists={id:"object_text_exists",context:"dom:object",refactor:{WCAG20_Object_HasText:{pass:"pass",fail_no_text_alternative:"fail_no_text_alternative"}},help:{"en-US":{group:"object_text_exists.html",pass:"object_text_exists.html",fail_no_text_alternative:"object_text_exists.html"}},messages:{"en-US":{group:"<object> element must have a text alternative for the content rendered by the object",pass:"<object> element has a text alternative",fail_no_text_alternative:"An <object> element does not have a text alternative"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:"8fc3b6",run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;if(n.hasAttribute("type")&&-1!==n.getAttribute("type").indexOf("text"))return null;if(n.getAttribute("role"))return null;var o=n.getAttribute("data"),s=o&&"string"==typeof o?o.substring(o.lastIndexOf(".")):"";if(".html"===s||".htm"===s)return null;var u=r.AccNameUtil.computeAccessibleName(n);return u&&u.name&&u.name.trim().length>0?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_no_text_alternative")}}},6640(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.page_title_exists=void 0;var a=i(461),n=i(461),l=i(7139),r=i(6858);t.page_title_exists={id:"page_title_exists",context:"dom:html",refactor:{WCAG20_Doc_HasTitle:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2",Fail_3:"Fail_3"}},help:{"en-US":{group:"page_title_exists.html",Pass_0:"page_title_exists.html",Fail_1:"page_title_exists.html",Fail_2:"page_title_exists.html",Fail_3:"page_title_exists.html"}},messages:{"en-US":{group:"The page should have a title that correctly identifies the subject of the page",Pass_0:"Rule Passed",Fail_1:"Missing <head> element so there can be no <title> element present",Fail_2:"Missing <title> element in <head> element",Fail_3:"The <title> element is empty (no innerHTML)"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[{"2779a5":{Pass_0:"pass",Fail_1:"pass",Fail_2:"fail",Fail_3:"fail"}}],run:function(e,t,i){if(r.AncestorUtil.isFrame(i))return null;for(var n=e.dom.node,o=n.firstChild,s=null;null!=o&&"head"!=o.nodeName.toLowerCase();)o=o.nextSibling;for(var u=n.querySelectorAll("title"),d=0;d<u.length;++d)if(!l.CommonUtil.getAncestor(u[d],["svg"])){s=u[d];break}return null!==o||s?null===s?(0,a.RuleFail)("Fail_2"):null!=s&&l.CommonUtil.getInnerText(s).trim().length>0?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_3"):(0,a.RuleFail)("Fail_1")}}},2068(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.page_title_valid=void 0;var a=i(461),n=i(461),l=i(7139);t.page_title_valid={id:"page_title_valid",context:"dom:head dom:title",refactor:{RPT_Title_Valid:{Pass_0:"Pass_0",Potential_2:"Potential_2"}},help:{"en-US":{Pass_0:"page_title_valid.html",Potential_2:"page_title_valid.html",group:"page_title_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_2:"Verify that using the filename as the page <title> value is descriptive",group:"Page <title> should be a descriptive title, rather than a filename"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,r=l.CommonUtil.getInnerText(n).trim(),o=r.toLowerCase();return o.includes(".com")||o.includes(".net")||o.includes(".org")?(0,a.RulePass)("Pass_0",[r]):0===r.length?null:/^\S*\.[a-zA-Z]{1,4}(?!.)|^https?:\/\/\S*/i.test(r)?(0,a.RulePotential)("Potential_2"):(0,a.RulePass)("Pass_0",[r])}}},7322(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.script_focus_blur_review=void 0;var a=i(461),n=i(461);t.script_focus_blur_review={id:"script_focus_blur_review",context:"dom:*[onfocus]",refactor:{WCAG20_Script_FocusBlurs:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"script_focus_blur_review.html",Potential_1:"script_focus_blur_review.html",group:"script_focus_blur_review.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify script does not remove focus from content that normally receives focus",group:"Scripting must not remove focus from content that normally receives focus"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1","2.4.7","3.2.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=-1==e.dom.node.getAttribute("onfocus").indexOf(".blur(");return n?(0,a.RulePass)("Pass_0"):n?void 0:(0,a.RulePotential)("Potential_1")}}},5702(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.script_onclick_avoid=void 0;var a=i(461),n=i(461),l=i(7139);t.script_onclick_avoid={id:"script_onclick_avoid",context:"dom:*[onclick]",dependencies:["script_onclick_misuse"],refactor:{RPT_Script_OnclickHTML2:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"script_onclick_avoid.html",Potential_1:"script_onclick_avoid.html",group:"script_onclick_avoid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that 'onclick' events are not used in script to emulate a link",group:"Scripts should not be used to emulate links"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_FOUR}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.CommonUtil.getAncestor(n,"svg"))return(0,a.RulePass)("Pass_0");if(l.CommonUtil.attributeNonEmpty(n,"role"))return(0,a.RulePass)("Pass_0");var r=n.nodeName.toLowerCase(),o="a"==r||"area"==r||"input"==r;return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},1961(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.script_onclick_misuse=void 0;var a=i(461),n=i(461),l=i(7139);t.script_onclick_misuse={id:"script_onclick_misuse",context:"dom:*[onclick]",refactor:{RPT_Script_OnclickHTML1:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"script_onclick_misuse.html",Potential_1:"script_onclick_misuse.html",group:"script_onclick_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Possible use of a script to emulate a link",group:"Scripts should not be used to emulate links"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,r=l.CommonUtil.attributeNonEmpty(n,"role"),o=n.nodeName.toLowerCase();if(!(r=r||("a"==o||"area"==o)&&l.CommonUtil.attributeNonEmpty(n,"href"))){var s=[".asp",".aspx",".cfm",".cfml",".cgi",".htm",".html",".shtm",".shtml",".php",".pl",".py",".shtm",".shtml",".xhtml","location.href"],u=n.getAttribute("onclick").toLowerCase();r=!0;for(var d=0;r&&d<s.length;++d)r=-1==u.indexOf(s[d])}return r?(0,a.RulePass)("Pass_0"):r?void 0:(0,a.RulePotential)("Potential_1")}}},3022(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.script_select_review=void 0;var a=i(461),n=i(461);t.script_select_review={id:"script_select_review",context:"dom:select",refactor:{WCAG20_Select_NoChangeAction:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"script_select_review.html",Potential_1:"script_select_review.html",group:"script_select_review.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that no change of context or action occurs when selection options in this component receive focus",group:"No changes of context should occur when a selection value receives focus"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["3.2.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,l=!n.hasAttribute("onchange")&&!n.hasAttribute("onfocus");return l?(0,a.RulePass)("Pass_0"):l?void 0:(0,a.RulePotential)("Potential_1")}}},375(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.select_options_grouped=void 0;var a=i(461),n=i(461),l=i(7139);t.select_options_grouped={id:"select_options_grouped",context:"dom:select",refactor:{WCAG20_Select_HasOptGroup:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"select_options_grouped.html",Potential_1:"select_options_grouped.html",group:"select_options_grouped.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Group of related options may need <optgroup>",group:"Groups of related options within a selection list should be grouped with <optgroup>"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,r=l.CommonUtil.getChildByTagHidden(n,"optgroup",!1,!0).length>0||l.CommonUtil.getChildByTagHidden(n,"option",!1,!0).length<=10;return r?(0,a.RulePass)("Pass_0"):r?void 0:(0,a.RulePotential)("Potential_1")}}},4658(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.skip_main_described=void 0;var a=i(461),n=i(461),l=i(7139),r=i(4566),o=i(3946);t.skip_main_described={id:"skip_main_described",context:"dom:body",dependencies:["skip_main_exists"],refactor:{WCAG20_Body_FirstAContainsSkipText_Native_Host_Sematics:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"skip_main_described.html",Potential_1:"skip_main_described.html",group:"skip_main_described.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify that if this hyperlink skips content, the description communicates where it links to",group:"The description of a hyperlink used to skip content must communicate where it links to"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n,s={paramSkipText:{value:["skip","jump"],type:"[string]"}},u=e.dom.node,d=u.ownerDocument;if(null===r.CacheUtil.getCache(u,"IBM_hasLandmarks_Implicit",null)&&r.CacheUtil.setCache(u,"IBM_hasLandmarks_Implicit",l.CommonUtil.getElementsByRoleHidden(u.ownerDocument,["application","banner","complementary","contentinfo","form","main","navigation","search"],!0,!0).length>0),!(n=r.CacheUtil.getCache(u,"IBM_hasLandmarks_Implicit",!1))){var c=d.links;if(c&&c.length>0&&o.VisUtil.isNodeVisible(c[0]))for(var m=l.CommonUtil.getInnerText(d.links[0]).toLowerCase(),p=0;!n&&p<s.paramSkipText.value.length;++p)n=-1!=m.indexOf(s.paramSkipText.value[p]);else n=!1}return n?(0,a.RulePass)("Pass_0"):n?void 0:(0,a.RulePotential)("Potential_1")}}},4605(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.skip_main_exists=void 0;var a=i(461),n=i(461),l=i(7139),r=i(6858),o=i(4566),s=i(3946);t.skip_main_exists={id:"skip_main_exists",context:"dom:body",refactor:{WCAG20_Body_FirstASkips_Native_Host_Sematics:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"skip_main_exists.html",Fail_1:"skip_main_exists.html",group:"skip_main_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'The page does not provide a way to quickly navigate to the main content (ARIA "main" landmark or a skip link)',group:"Pages must provide a way to skip directly to the main content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.4.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){if(r.AncestorUtil.isPresentationFrame(i))return null;var n,u=e.dom.node,d=u.ownerDocument;if(null===o.CacheUtil.getCache(u,"IBM_hasLandmarks_Implicit",null)&&o.CacheUtil.setCache(u,"IBM_hasLandmarks_Implicit",l.CommonUtil.getElementsByRoleHidden(u.ownerDocument,["application","banner","complementary","contentinfo","form","main","navigation","search"],!0,!0).length>0),!(n=o.CacheUtil.getCache(u,"IBM_hasLandmarks_Implicit",!1))){for(var c=l.CommonUtil.getDocElementsByTag(u,"a"),m=null,p=0;p<c.length;++p)if(c[p].hasAttribute("href")&&s.VisUtil.isNodeVisible(c[p])){m=c[p];break}var h=null;if(null!=m){var g=m.getAttribute("href"),b=g.indexOf("#");-1!=b&&(h=g.substring(b+1))}if(null!=h)for(n=null!=d.getElementById(h),p=0;!n&&p<c.length;++p)!c[p].hasAttribute("href")&&c[p].hasAttribute("name")&&c[p].getAttribute("name")==h&&(n=!0)}return n?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},5294(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.style_background_decorative=void 0;var a=i(461),n=i(461),l=i(7139);t.style_background_decorative={id:"style_background_decorative",context:"dom:style, dom:*[style]",refactor:{RPT_Style_BackgroundImage:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"style_background_decorative.html",Potential_1:"style_background_decorative.html",group:"style_background_decorative.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify the CSS background image does not convey important information",group:"Images included by using CSS alone must not convey important information"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,r=n.nodeName.toLowerCase(),o=!0;if("link"===r&&n.hasAttribute("rel")&&"stylesheet"===n.getAttribute("rel").toLowerCase()&&(o=l.CommonUtil.triggerOnce(n,"style_background_decorative",!1)),o&&"style"===r||n.hasAttribute("style")){var s=("style"===r?l.CommonUtil.getInnerText(n):n.getAttribute("style")).match(/background:[^;]*/g);if(null!==s)for(var u=0;o&&u<s.length;++u)o=-1===s[u].indexOf("url(")}return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},3506(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.style_before_after_review=void 0;var a=i(461),n=i(461),l=i(4919);t.style_before_after_review={id:"style_before_after_review",context:"dom:style, dom:link",refactor:{WCAG20_Style_BeforeAfter:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{group:"style_before_after_review.html",Pass_0:"style_before_after_review.html",Potential_1:"style_before_after_review.html"}},messages:{"en-US":{group:"Do not use CSS '::before' and '::after' pseudo-elements to insert non-decorative content",Pass_0:"Rule Passed",Potential_1:"Verify the '::before' and '::after' pseudo-elements do not insert non-decorative content"}},rulesets:[{id:[],num:"1.3.1",level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,r=!0;if("style"===n.nodeName.toLowerCase()){for(var o=l.CSSUtil.getCSSStyle(n),s=0;r&&s<o.length;++s)o[s].selector&&(r=-1===o[s].selector.indexOf(":before")&&-1===o[s].selector.indexOf(":after")||!("content"in o[s].values)||0===o[s].values.content.trim().length||'""'===o[s].values.content.trim()||"''"===o[s].values.content.trim()||"none"===o[s].values.content.trim()||"attr(x)"===o[s].values.content.trim()||"attr(y)"===o[s].values.content.trim());if(r)for(var u=0;u<n.ownerDocument.styleSheets.length;u++)if((_=n.ownerDocument.styleSheets[u]).ownerNode===n)try{var d=_.cssRules?_.cssRules:_.rules;if(d)for(var c=0;r&&c<d.length;c++){var m=d[c],p=void 0;if(m.type&&4===m.type){if(v=m.cssRules)for(var h=0;r&&h<v.length;h++)null!==(w=v[h]).selectorText&&void 0!==w.selectorText&&(-1===(C=w.selectorText.toLowerCase()).indexOf(":before")&&-1===C.indexOf(":after")||(k=w.style.content)&&k.trim().length&&'""'!==k.trim()&&"''"!==k.trim()&&"none"!==k.trim()&&"attr(x)"!==k.trim()&&"attr(y)"!==k.trim()&&(r=!1))}else if(m.type&&3===m.type&&(p=m).styleSheet&&(f=p.styleSheet.cssRules?p.styleSheet.cssRules:p.styleSheet.rules))for(h=0;r&&h<f.length;h++){var g=f[h];if(g.type&&4===g.type){if(v=g.cssRules)for(var b=0;b<v.length;b++)null!==(w=v[b]).selectorText&&void 0!==w.selectorText&&(-1===(C=w.selectorText.toLowerCase()).indexOf(":before")&&-1===C.indexOf(":after")||(k=w.style.content)&&k.trim().length&&'""'!==k.trim()&&"''"!==k.trim()&&"none"!==k.trim()&&"attr(x)"!==k.trim()&&"attr(y)"!==k.trim()&&(r=!1))}else null!==g.selectorText&&void 0!==g.selectorText&&(-1===(C=g.selectorText.toLowerCase()).indexOf(":before")&&-1===C.indexOf(":after")||(k=g.style.content)&&k.trim().length&&'""'!==k.trim()&&"''"!==k.trim()&&"none"!==k.trim()&&"attr(x)"!==k.trim()&&"attr(y)"!==k.trim()&&(r=!1))}}}catch(e){}}if("link"===n.nodeName.toLowerCase()&&n.hasAttribute("rel")&&"stylesheet"===n.getAttribute("rel").toLowerCase()&&n.hasAttribute("href")&&0!==n.getAttribute("href").trim().length)for(u=0;u<n.ownerDocument.styleSheets.length;u++){var _;if((_=n.ownerDocument.styleSheets[u])&&_.ownerNode===n)try{var f;if(f=_.cssRules?_.cssRules:_.rules)for(h=0;r&&h<f.length;h++){var v,A=f[h];if(A.type&&4===A.type){if(v=A.cssRules)for(b=0;r&&b<v.length;b++){var w;if(null!==(w=v[b]).selectorText&&void 0!==w.selectorText){var y=w.selectorText.toLowerCase();-1===y.indexOf(":before")&&-1===y.indexOf(":after")||(k=w.style.content)&&k.trim().length&&'""'!==k.trim()&&"''"!==k.trim()&&"none"!==k.trim()&&"attr(x)"!==k.trim()&&"attr(y)"!==k.trim()&&(r=!1)}}}else if(null!==f[h].selectorText&&void 0!==f[h].selectorText){var C,k;-1===(C=f[h].selectorText.toLowerCase()).indexOf(":before")&&-1===C.indexOf(":after")||(k=f[h].style.content)&&k.trim().length&&'""'!==k.trim()&&"''"!==k.trim()&&"none"!==k.trim()&&"attr(x)"!==k.trim()&&"attr(y)"!==k.trim()&&(r=!1)}}}catch(e){}}return r?(0,a.RulePass)("Pass_0"):r?void 0:(0,a.RulePotential)("Potential_1")}}},7475(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.style_color_misuse=void 0;var a=i(7139),n=i(461),l=i(461),r=i(3864),o=i(4566);t.style_color_misuse={id:"style_color_misuse",context:"dom:style, dom:*[style], dom:font[color], dom:link",refactor:{RPT_Style_ColorSemantics1:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{group:"style_color_misuse.html",Pass_0:"style_color_misuse.html",Potential_1:"style_color_misuse.html"}},messages:{"en-US":{group:"Combine color and descriptive markup to convey information",Pass_0:"Rule Passed",Potential_1:"Verify color is not used as the only visual means of conveying information"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"1.4.1",level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var l=e.dom.node,s=l.nodeName.toLowerCase(),u="";if("style"===s){u=a.CommonUtil.getInnerText(l).toLowerCase();for(var d=0;d<l.ownerDocument.styleSheets.length;d++)if((_=l.ownerDocument.styleSheets[d])&&_.ownerNode===l)try{for(var c=_.cssRules?_.cssRules:_.rules,m=0;m<c.length;m++){var p=c[m],h=void 0;if(p.type&&3===p.type&&(h=p).styleSheet)for(var g=h.styleSheet.cssRules?h.styleSheet.cssRules:h.styleSheet.rules,b=0;b<g.length;b++)u+=g[b].cssText}}catch(e){}}else if(l.hasAttribute("style"))u=l.getAttribute("style").toLowerCase();else if("link"===s&&l.hasAttribute("rel")&&"stylesheet"===l.getAttribute("rel").toLowerCase()&&l.hasAttribute("href")&&0!==l.getAttribute("href").trim().length)for(d=0;d<l.ownerDocument.styleSheets.length;d++){var _;if((_=l.ownerDocument.styleSheets[d])&&_.ownerNode===l)try{var f=_.cssRules?_.cssRules:_.rules;for(b=0;b<f.length;b++)u+=f[b].cssText}catch(e){}}var v=!0,A=u.match(/\bbackground\b/i),w=u.replace(/-color/g,"").match(/\bcolor\b/i);if(l.hasAttribute("color")||w||A){var y={em:"",strong:"",cite:"",dfn:"",code:"",samp:"",kbd:"",var:"",abbr:"",acronym:""};if(!(v=s in y||null!==a.CommonUtil.getAncestor(l,y))&&l.hasChildNodes())for(var C=new r.DOMWalker(l);!v&&C.nextNode()&&C.node!==l;)v=C.node.nodeName.toLowerCase()in y}return v||(v=o.CacheUtil.getCache(l.ownerDocument,"style_color_misuse",!1),o.CacheUtil.setCache(l.ownerDocument,"style_color_misuse",!0)),v?(0,n.RulePass)("Pass_0"):v?void 0:(0,n.RulePotential)("Potential_1")}}},8064(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.style_focus_visible=void 0;var a=i(7139),n=i(461),l=i(461),r=i(4919),o=i(3883);t.style_focus_visible={id:"style_focus_visible",context:"dom:*",refactor:{RPT_Style_HinderFocus1:{Potential_1:"potential_focus_not_visible"}},help:{"en-US":{group:"style_focus_visible.html",potential_focus_not_visible:"style_focus_visible.html",pass_focus_visible:"style_focus_visible.html"}},messages:{"en-US":{group:"The keyboard focus indicator should be visible when default border or outline is modified by CSS",potential_focus_not_visible:"Check the keyboard focus indicator is visible when using CSS declaration for 'border' or 'outline'",pass_focus_visible:"The keyboard focus indicator is visible or is not changed from the browser default"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"2.4.7",level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var l={skipNodes:{value:["table"],type:"[string]"},checkParams:{value:["border","border-width","border-style","border-top-width","border-right-width","border-bottom-width","border-left-width","border-top-color","border-right-color","border-bottom-color","border-left-color","border-top-style","border-right-style","border-bottom-style","border-left-style","outline","outline-width","outline-color","outline-style"],type:"[string]"}},s=e.dom.node;if(!a.CommonUtil.isTabbable(s)||l.skipNodes.value.includes(s.nodeName.toLowerCase()))return null;var u=r.CSSUtil.getDefinedStylesMultiple(s,null,["",":focus",":focus-visible",":focus-within"]),d=u[""],c=[];c.push(u[":focus"]),c.push(u[":focus-visible"]),c.push(u[":focus-within"]);var m=c[0];if(Object.keys(m).length>0){if(!((d["outline-width"]||d["outline-style"])&&"0px"!==d["outline-width"]&&"none"!==d["outline-style"]||m["outline-style"]&&"none"===m["outline-style"]))return(0,n.RulePass)("pass_focus_visible");var p=!1,h=0;for(var g in m)if(l.checkParams.value.includes(g)){var b=m[g],_=d[g];if(g.includes("style")){if(p="none"===b,_&&"none"!==b&&b===_)return(0,n.RulePotential)("potential_focus_not_visible")}else if(g.includes("width")){if(h++,"initial"===b?b="2px":"thin"===b?b="1px":"medium"===b?b="2px":"thick"===b&&(b="3px"),_&&("initial"===_?_="2px":"thin"===_?_="1px":"medium"===_?_="2px":"thick"===_&&(_="3px")),b=r.CSSUtil.getPixelsFromStyle(b,s),_=r.CSSUtil.getPixelsFromStyle(_,s),0==b||b<=_)return(0,n.RulePotential)("potential_focus_not_visible")}else if(g.includes("color")){h++;var f=o.ColorUtil.ColorCombo(s);if(null===f)continue;var v=f.bg;if(!v)continue;if("initial"===b&&(b="black"),_&&"initial"===_&&(_="black"),b=o.ColorUtil.Color(b),_=o.ColorUtil.Color(_),null===b||null===_)continue;var A=b.contrastRatio(v),w=_.contrastRatio(v);if(A<3||A<=w)return(0,n.RulePotential)("potential_focus_not_visible")}else if(h++,null!=_&&b===_)return(0,n.RulePotential)("potential_focus_not_visible")}if(p&&0===h)return(0,n.RulePotential)("potential_focus_not_visible")}else for(var y in d)if(l.checkParams.value.includes(y)&&"none"!==(_=d[y]))return(0,n.RulePotential)("potential_focus_not_visible");return(0,n.RulePass)("pass_focus_visible")}}},7942(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.style_highcontrast_visible=void 0;var a=i(461),n=i(461),l=i(4566);t.style_highcontrast_visible={id:"style_highcontrast_visible",context:"dom:style, dom:link, dom:*[style]",refactor:{RPT_Style_Trigger2:{Pass_0:"Pass_0",Manual_1:"Manual_1"}},help:{"en-US":{Pass_0:"style_highcontrast_visible.html",Manual_1:"style_highcontrast_visible.html",group:"style_highcontrast_visible.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Manual_1:"Confirm Windows high contrast mode is supported when using CSS to include, position or alter non-decorative content",group:"Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next"],num:["1.1.1","1.3.2","1.4.11"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE},{id:["WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1","1.3.2","1.4.11"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,r=n.nodeName.toLowerCase();if("link"===r&&(!n.hasAttribute("rel")||"stylesheet"!==n.getAttribute("rel").toLowerCase()))return(0,a.RulePass)("Pass_0");if("style"!==r&&"link"!==r&&n.hasAttribute("style")&&0===n.getAttribute("style").trim().length)return(0,a.RulePass)("Pass_0");var o=l.CacheUtil.getCache(n.ownerDocument,"style_highcontrast_visible",!1);return l.CacheUtil.setCache(n.ownerDocument,"style_highcontrast_visible",!0),o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RuleManual)("Manual_1")}}},2219(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.style_hover_persistent=void 0;var a=i(461),n=i(461),l=i(7139);t.style_hover_persistent={id:"style_hover_persistent",context:"dom:style, dom:*[style], dom:*",help:{"en-US":{Pass_0:"style_hover_persistent.html",Pass_2:"style_hover_persistent.html",Potential_1:"style_hover_persistent.html",Potential_2:"style_hover_persistent.html",Potential_3:"style_hover_persistent.html",group:"style_hover_persistent.html"}},messages:{"en-US":{Pass_0:"the hover: pseudo-class is not used to display content",Pass_2:"content displayed via the :hover pseudo-class is the adjacent sibling of the trigger element",Potential_1:"Confirm the pointer can be positioned over the displayed element, not just the trigger",Potential_2:"Confirm the pointer can be positioned over all the information displayed on hover",Potential_3:"Confirm the margin style attribute has not prevented the pointer from hovering over the displayed element, not just the trigger",group:"The pointer should be able to move over content displayed on hover"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_2"],num:["1.4.13"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=!1,r=!1,o=!1,s=e.dom.node;if("style"===s.nodeName.toLowerCase()){l.CommonUtil.getInnerText(s).toLowerCase();for(var u=0;u<s.ownerDocument.styleSheets.length;++u){var d=s.ownerDocument.styleSheets[u];if(d&&d.ownerNode===s)try{for(var c=d.cssRules?d.cssRules:d.rules,m=0;m<c.length;m++){var p="",h=!1,g=!1,b="",_=!1,f=!1,v=!1,A=(c[m],c[m].cssText);if(A.match(/:hover/g)){p=A.split(":")[0];var w=A.substring(A.indexOf("+")+1);if(w=w.trim(),(A.match(/:hover \+/g)||A.match(/:hover\+/g))&&(h=!0,b=w.split(" ")[0]),A.match(/:hover \~/g)||A.match(/:hover\~/g)){g=!0;var y=A.substring(A.indexOf("~")+1);b=(y=y.trim()).split(" ")[0]}if(!h&&!g)return(0,a.RulePass)("Pass_0");if(b&&(I=w.indexOf("display:"))&&"none;"!==w.slice(I+8).trim().split(" ")[0]&&d&&d.ownerNode===s)try{for(var C=d.cssRules?d.cssRules:d.rules,k=0;k<C.length;k++){var R=c[k].cssText,x=b+" {",P=R.trim(),T=P.indexOf(x);if(P.slice(T).trim(),P.match(/margin/g)){if(!o)return o=!0,(0,a.RulePotential)("Potential_3")}else{var U=R.split(":")[0];if((U=U.split(" ")[0])===b&&R.match(/:hover/g)){var I;if(_=!0,I=R.indexOf("display:"))if(f=!0,"none;"!==w.slice(I+8).trim().split(" ")[0]){if(v=!0,""!==p&&h){var E=s.ownerDocument.getElementsByTagName(p.toUpperCase());if(b.toUpperCase()===E[0].nextElementSibling.tagName){n=!0;continue}}else if(h){if(!r){r=!0;break}continue}if(""!==p&&g){E=s.ownerDocument.getElementsByTagName(p.toUpperCase());var N=[],L=E[0].nextElementSibling;do{if(L.tagName!==b.toUpperCase())break;N.push(L)}while(L=L.nextElementSibling);var S=N.length;if(1===S)return(0,a.RulePass)("Pass_2");if(S>1)return(0,a.RulePotential)("Potential_2")}}else{if(h){if(k===C.length-1&&!1===v)return(0,a.RulePotential)("Potential_1");continue}if(g){if(k===C.length-1&&!1===v)return(0,a.RulePotential)("Potential_1");continue}}else{if(h){if(k===C.length-1&&!1===f)return(0,a.RulePotential)("Potential_1");continue}if(g){if(k===C.length-1&&!1===f)return(0,a.RulePotential)("Potential_1");continue}}}else{if(h){if(k===C.length-1&&!1===_)return(0,a.RulePotential)("Potential_1");continue}if(g){if(k===C.length-1&&!1===_)return(0,a.RulePotential)("Potential_2");continue}}}}}catch(e){}}}}catch(e){}}}return n?(0,a.RulePass)("Pass_0"):r?(0,a.RulePotential)("Potential_1"):o?(0,a.RulePotential)("Potential_3"):void 0}}},1473(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.style_viewport_resizable=void 0;var a=i(461),n=i(461);t.style_viewport_resizable={id:"style_viewport_resizable",context:"dom:link, dom:style, dom:*[style]",refactor:{WCAG21_Style_Viewport:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{group:"style_viewport_resizable.html",Pass_0:"style_viewport_resizable.html",Potential_1:"style_viewport_resizable.html"}},messages:{"en-US":{group:"Text must scale up to 200% without loss of content or functionality",Pass_0:"Rule Passed",Potential_1:"Verify that text sized using viewport units can be resized up to 200%"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:["1.4.4","1.4.10"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,l=!0,r=/\d+(vw|vh|vmin|vmax)/gi,o=n.nodeName.toLowerCase();if("style"===o){for(var s=0;s<n.ownerDocument.styleSheets.length;s++)if((_=n.ownerDocument.styleSheets[s]).ownerNode===n)try{var u=_.cssRules?_.cssRules:_.rules;if(u)for(var d=0;l&&d<u.length;d++){var c=u[d];if(c.type&&1===c.type){var m=c;if(m.style.fontSize){var p=(v=m.style.fontSize.trim()).match(r);v.length&&p&&(l=!1)}}else if(c.type&&3===c.type&&c.styleSheet){var h=c;if(f=h.styleSheet.cssRules?h.styleSheet.cssRules:h.styleSheet.rules)for(var g=0;l&&g<f.length;g++){var b=f[g];b.type&&1===b.type&&b.style.fontSize&&(p=(v=b.style.fontSize.trim()).match(r),v.length&&p&&(l=!1))}}}}catch(e){}}else if("link"===o)for(s=0;s<n.ownerDocument.styleSheets.length;s++){var _;if((_=n.ownerDocument.styleSheets[s])&&_.ownerNode===n)try{var f;if(f=_.cssRules?_.cssRules:_.rules)for(g=0;l&&g<f.length;g++){var v,A=f[g];if(A.type&&1===A.type&&A.style.fontSize)p=(v=A.style.fontSize.trim()).match(r),v.length&&p&&(l=!1)}}catch(e){}}else{var w=n.getAttribute("style");w&&(p=w.match(/font-size:\s*\d+(vw|vh|vmin|vmax)/gi))&&(l=!1)}return l?(0,a.RulePass)("Pass_0"):(0,a.RulePotential)("Potential_1")}}},1912(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.svg_graphics_labelled=void 0;var a=i(461),n=i(461),l=i(1950),r=i(3946);t.svg_graphics_labelled={id:"svg_graphics_labelled",context:"dom:svg",help:{"en-US":{group:"svg_graphics_labelled.html",pass:"svg_graphics_labelled.html",fail_acc_name:"svg_graphics_labelled.html"}},messages:{"en-US":{group:"A non-decorative SVG element must have an accessible name",pass:"The SVG element has an accessible name",fail_acc_name:"The SVG element has no accessible name"}},rulesets:[{id:["IBM_Accessibility","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[{"7d6734":{pass:"pass",fail_acc_name:"fail"}}],run:function(e,t,i){var n=e.dom.node;if(r.VisUtil.isNodeHiddenFromAT(n)||r.VisUtil.isNodePresentational(n)||l.AccNameUtil.isAccessibleNameIgnorable(n))return null;var o=l.AccNameUtil.computeAccessibleName(n);return o&&o.name&&o.name.trim().length>0?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_acc_name")}}},6539(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_aria_descendants=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139);t.table_aria_descendants={id:"table_aria_descendants",context:"aria:table dom:tr[role], aria:table dom:th[role], aria:table dom:td[role], aria:grid dom:tr[role], aria:grid dom:th[role], aria:grid dom:td[role], aria:treegrid dom:tr[role], aria:treegrid dom:th[role], aria:treegrid dom:td[role]",help:{"en-US":{group:"table_aria_descendants.html",explicit_role:"table_aria_descendants.html"}},messages:{"en-US":{group:"Table structure elements cannot specify an explicit 'role' within table containers",explicit_role:"An explicit ARIA 'role' is not valid for <{0}> element within an ARIA role '{1}' per the ARIA in HTML specification"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["4.1.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,o=r.CommonUtil.isTableDescendant(i);if(null!==o&&0!==o.length){var s=l.AriaUtil.getImplicitRole(n),u=l.AriaUtil.getRoles(n,!1);if(!(s&&s.length>0&&u&&u.length>0&&u.some(function(e){return s.includes(e)})))return(0,a.RuleFail)("explicit_role",[e.dom.node.nodeName.toLowerCase(),o[0].role])}}}},4(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_caption_empty=void 0;var a=i(461),n=i(461),l=i(7139);t.table_caption_empty={id:"table_caption_empty",context:"dom:caption",refactor:{Valerie_Caption_HasContent:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"table_caption_empty.html",Fail_1:"table_caption_empty.html",group:"table_caption_empty.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The <table> element has an empty <caption> element",group:"A <caption> element for a <table> element must contain descriptive text"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;return l.CommonUtil.hasInnerContentHidden(n)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},5334(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_caption_nested=void 0;var a=i(461),n=i(461),l=i(7139);t.table_caption_nested={id:"table_caption_nested",context:"dom:caption",refactor:{Valerie_Caption_InTable:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"table_caption_nested.html",Fail_1:"table_caption_nested.html",group:"table_caption_nested.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"<caption> element is not nested inside a <table> element",group:"The <caption> element must be nested inside the associated <table> element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;return null!=l.CommonUtil.getAncestor(n,"table")?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},2173(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_headers_exists=void 0;var a=i(461),n=i(461),l=i(9196);t.table_headers_exists={id:"table_headers_exists",context:"dom:table",refactor:{RPT_Table_DataHeadingsAria:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"table_headers_exists.html",Fail_1:"table_headers_exists.html",group:"table_headers_exists.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Table has no headers identified",group:"Data table must identify headers"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node,r=n.rows;if(!l.TableUtil.isDataTable(n)||null===r||0===r.length)return null;var o=l.TableUtil.tableHeaderExists(n);return null!==o?o?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1"):void 0}}},8349(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_headers_ref_valid=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(1686),s=i(3946),u=i(9955);t.table_headers_ref_valid={id:"table_headers_ref_valid",context:"dom:td[headers], dom:th[headers]",help:{"en-US":{Pass_0:"table_headers_ref_valid.html",Fail_1:"table_headers_ref_valid.html",Fail_2:"table_headers_ref_valid.html",Fail_3:"table_headers_ref_valid.html",Fail_4:"table_headers_ref_valid.html",group:"table_headers_ref_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The 'headers' attribute value \"{0}\" does not reference a valid 'id' in this document",Fail_2:"The 'headers' attribute value \"{0}\" refers to itself",Fail_3:"The 'headers' attribute value \"{0}\" does not refer to a cell in the same table",Fail_4:'The \'headers\' attribute value "{0}" does not refer to a cell indicated with <th> or a role of "columnheader" or "rowheader"',group:"The 'headers' attribute should refer to a valid cell in the same table"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:["a25f45"],run:function(e,t,i){var n=e.dom.node,d=r.CommonUtil.getAncestor(n,"table"),c=u.ARIAMapper.nodeToRole(d);if(null==d||!s.VisUtil.isNodeVisible(d)||!["table","grid"].includes(c))return null;n.nodeName.toLowerCase();var m=n.ownerDocument,p=n.getAttribute("headers");if(!p)return null;for(var h=p.split(" "),g=[],b=[],_=[],f=[],v=0;v<h.length;v++){var A=h[v];if(""!==A.trim()){var w=m.getElementById(A);if(w)if(o.DOMUtil.sameNode(w,n))b.push(A);else if(o.DOMUtil.isInSameTable(w,n)){if("th"!==w.nodeName.toLowerCase()){var y=l.AriaUtil.getRoles(w,!0);y.includes("columnheader")||y.includes("rowheader")||f.push(A)}}else _.push(A);else g.push(A)}}var C=[];return 0!=g.length&&C.push((0,a.RuleFail)("Fail_1",[g.toString()])),0!=b.length&&C.push((0,a.RuleFail)("Fail_2",[b.toString()])),0!=_.length&&C.push((0,a.RuleFail)("Fail_3",[_.toString()])),0!=f.length&&C.push((0,a.RuleFail)("Fail_4",[f.toString()])),0==C.length?(0,a.RulePass)("Pass_0"):C}}},8142(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_headers_related=void 0;var a=i(461),n=i(461),l=i(7139),r=i(4566),o=i(9196);t.table_headers_related={id:"table_headers_related",context:"dom:td, dom:th",refactor:{Valerie_Table_DataCellRelationships:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"table_headers_related.html",Fail_1:"table_headers_related.html",group:"table_headers_related.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Complex table does not have headers for each cell properly defined with 'header' or 'scope'",group:"For a complex data table, all <th> and <td> elements must be related via 'header' or 'scope' attributes"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node,s=l.CommonUtil.getAncestor(n,"table");if(null==s||!o.TableUtil.isComplexDataTable(s))return null;if(null===r.CacheUtil.getCache(n,"table_headers_related",null)){for(var u=[],d=0;d<s.rows.length;++d){var c=s.rows[d];u[d]||(u[d]=[]);for(var m=0;m<c.cells.length;++m){var p=c.cells[m];r.CacheUtil.setCache(p,"table_headers_related",d+":"+m);var h=parseInt(p.getAttribute("colspan"));h||(h=1);var g=parseInt(p.getAttribute("rowspan"));g||(g=1);for(var b=0;u[d][b];)b+=1;for(var _=0;_<g;++_){u[d+_]||(u[d+_]=[]);for(var f=0;f<h;++f)u[d+_][b+f]=p}}}var v=n.ownerDocument,A={},w={};for(d=0;d<u.length;++d){var y=!1;for(m=0;m<u[d].length;++m){var C=u[d][m],k=C.nodeName.toLowerCase();if("th"==k){if("row"==C.getAttribute("scope")?(y=!0,l.CommonUtil.attributeNonEmpty(C,"axis")||(A[r.CacheUtil.getCache(C,"table_headers_related",null)]=!0)):"col"==C.getAttribute("scope")&&(w[m]=!0,l.CommonUtil.attributeNonEmpty(C,"axis")||(A[r.CacheUtil.getCache(C,"table_headers_related",null)]=!0)),l.CommonUtil.attributeNonEmpty(C,"headers")){var R=C.getAttribute("headers").split(" ");for(_=0;_<R.length;++_)(x=v.getElementById(R[_].trim()))&&l.CommonUtil.getAncestor(x,"table")==s&&(A[r.CacheUtil.getCache(x,"table_headers_related",null)]=!0)}}else if("td"==k)if(y||w[m])A[r.CacheUtil.getCache(C,"table_headers_related",null)]=!0;else if(l.CommonUtil.attributeNonEmpty(C,"headers"))for(R=C.getAttribute("headers").split(" "),_=0;_<R.length;++_){var x;(x=v.getElementById(R[_].trim()))&&l.CommonUtil.getAncestor(x,"table")==s&&(A[r.CacheUtil.getCache(C,"table_headers_related",null)]=!0,A[r.CacheUtil.getCache(x,"table_headers_related",null)]=!0)}}}r.CacheUtil.setCache(s,"table_headers_related",A)}var P=r.CacheUtil.getCache(n,"table_headers_related",null),T=r.CacheUtil.getCache(s,"table_headers_related",null),U=P&&T&&P in T;return U||"0:0"!==P||0!=l.CommonUtil.getInnerText(n).trim().length?(U||0!=s.getElementsByTagName("th").length||(!0===r.CacheUtil.getCache(s,"table_headers_related_TrigOnce",!1)?U=!0:r.CacheUtil.setCache(s,"table_headers_related_TrigOnce",!0)),U?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")):null}}},3980(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_layout_linearized=void 0;var a=i(461),n=i(461),l=i(3946),r=i(9196);t.table_layout_linearized={id:"table_layout_linearized",context:"dom:table",refactor:{RPT_Table_LayoutTrigger:{Pass_0:"Pass_0",Potential_1:"Potential_1"}},help:{"en-US":{Pass_0:"table_layout_linearized.html",Potential_1:"table_layout_linearized.html",group:"table_layout_linearized.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"Verify table is not being used to format text content in columns unless the table can be linearized",group:"Avoid using tables to format text documents in columns unless the table can be linearized"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.RECOMMENDATION,toolkitLevel:n.eToolkitLevel.LEVEL_FOUR}],act:[],run:function(e,t,i){var n=e.dom.node;if(l.VisUtil.isNodeHiddenFromAT(n))return null;var o=!r.TableUtil.isLayoutTable(n);return o?(0,a.RulePass)("Pass_0"):o?void 0:(0,a.RulePotential)("Potential_1")}}},4701(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_scope_valid=void 0;var a=i(461),n=i(461);t.table_scope_valid={id:"table_scope_valid",context:"dom:td[scope], dom:th[scope]",refactor:{WCAG20_Table_Scope_Valid:{Pass_0:"Pass_0",Fail_1:"Fail_1",Fail_2:"Fail_2"}},help:{"en-US":{Pass_0:"table_scope_valid.html",Fail_1:"table_scope_valid.html",Fail_2:"table_scope_valid.html",group:"table_scope_valid.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"Value provided is invalid for the 'scope' attribute",Fail_2:"The 'scope' attribute should only be used on a <th> element",group:'Value for \'scope\' attribute must be "row", "col", "rowgroup", or "colgroup"'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node;if("td"===n.nodeName.toLowerCase())return(0,a.RuleFail)("Fail_2");var l=n.getAttribute("scope").trim().toLowerCase();return/^(row|col|rowgroup|colgroup)$/.test(l)?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1")}}},18(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_structure_misuse=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(3946),s=i(9196);t.table_structure_misuse={id:"table_structure_misuse",context:"dom:table",refactor:{WCAG20_Table_Structure:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"table_structure_misuse.html",Fail_1:"table_structure_misuse.html",group:"table_structure_misuse.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:'The <{0}> element with "presentation" role or "none" role has structural element(s) and/or attribute(s) \'{1}\'',group:'Table elements with \'role="presentation" or \'role="none" should not have structural elements or attributes'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node;if(o.VisUtil.isNodeHiddenFromAT(n))return null;if(s.TableUtil.isDataTable(n))return null;if(l.AriaUtil.isNodeInGrid(n))return null;var u=[];r.CommonUtil.attributeNonEmpty(n,"summary")&&u.push(n);for(var d=n.getElementsByTagName("caption"),c=0;c<d.length;++c)if(r.CommonUtil.getAncestor(d[c],"table")==n){if(r.CommonUtil.shouldNodeBeSkippedHidden(d[c]))continue;u.push(d[c]);break}var m=n.getElementsByTagName("th");for(c=0;c<m.length;++c)if(r.CommonUtil.getAncestor(m[c],"table")==n){if(r.CommonUtil.shouldNodeBeSkippedHidden(m[c]))continue;u.push(m[c]);break}var p=n.getElementsByTagName("td");for(c=0;c<p.length;++c)if((p[c].hasAttribute("scope")||p[c].hasAttribute("headers"))&&r.CommonUtil.getAncestor(p[c],"table")==n){if(r.CommonUtil.shouldNodeBeSkippedHidden(p[c]))continue;u.push(p[c]);break}var h=n.nodeName.toLowerCase(),g=new Array,b={};for(c=0;c<u.length;c++){var _=u[c].nodeName.toLowerCase();b.hasOwnProperty(_)||("table"!=_||b.hasOwnProperty.summary?(b[_]=!0,g.push(_)):(b.summary=!0,g.push("summary")))}var f=g.join(", ");return 0==u.length?(0,a.RulePass)("Pass_0"):(0,a.RuleFail)("Fail_1",[h,f])}}},9314(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.table_summary_redundant=void 0;var a=i(461),n=i(461),l=i(7139),r=i(5279),o=i(1686);t.table_summary_redundant={id:"table_summary_redundant",context:"dom:table",refactor:{WCAG20_Table_CapSummRedundant:{Pass_0:"Pass_0",Fail_1:"Fail_1"}},help:{"en-US":{Pass_0:"table_summary_redundant.html",Fail_1:"table_summary_redundant.html",group:"table_summary_redundant.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Fail_1:"The table summary duplicates the caption",group:"The table summary must not duplicate the caption"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n,s=e.dom.node;if(s.hasAttribute("summary"))n=s.getAttribute("summary").trim().toLowerCase();else if(s.hasAttribute("aria-describedby")){for(var u=s.getAttribute("aria-describedby").split(" "),d="",c=0;c<u.length;c++){var m=u[c];if(m){var p=r.FragmentUtil.getById(s,m);p&&!o.DOMUtil.sameNode(p,s)&&(d+=" "+l.CommonUtil.getInnerText(p).trim().toLowerCase())}}n=d}if(!n)return null;var h=s.getElementsByTagName("caption");if(0===h.length)return null;if(n.length>0){var g=l.CommonUtil.getInnerText(h[0]).trim().toLowerCase();return n.includes(g)?(0,a.RuleFail)("Fail_1"):(0,a.RulePass)("Pass_0")}}}},1667(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.target_spacing_sufficient=void 0;var a=i(7139),n=i(461),l=i(461),r=i(7507),o=i(4919),s=i(4566);t.target_spacing_sufficient={id:"target_spacing_sufficient",context:"dom:*",dependencies:[],help:{"en-US":{group:"target_spacing_sufficient.html",pass_spacing:"target_spacing_sufficient.html",pass_sized:"target_spacing_sufficient.html",pass_inline:"target_spacing_sufficient.html",pass_default:"target_spacing_sufficient.html",violation_spacing:"target_spacing_sufficient.html",recommendation_inline:"target_spacing_sufficient.html",potential_overlap:"target_spacing_sufficient.html"}},messages:{"en-US":{group:"The target must be sufficiently sized or spaced from other targets",pass_spacing:"The target's spacing from other targets is sufficient",pass_sized:"The target’s size is more than 24 CSS pixels",pass_inline:"The target is in a sentence or its size is otherwise constrained by the line-height of non-target text",pass_default:"The target's size is determined by the user agent and is not modified by the author",violation_spacing:'Undersized target "{0}" does not have sufficient spacing of 12 CSS pixels from another target "{1}"',recommendation_inline:'Confirm the inline target "{0}" is sufficiently spaced from another inline target "{1}"',potential_overlap:'Ensure the overlapped target "{0}" meets a minimum target size or has sufficient spacing from the overlapping target "{1}"'}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_2"],num:["2.5.8"],level:l.eRulePolicy.VIOLATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE,reasonCodes:["pass_spacing","pass_sized","pass_inline","pass_default","violation_spacing","potential_overlap"]},{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_2"],num:["2.5.8"],level:l.eRulePolicy.RECOMMENDATION,toolkitLevel:l.eToolkitLevel.LEVEL_THREE,reasonCodes:["recommendation_inline"]}],act:[],run:function(e,t,i){var l=e.dom.node,u=l.nodeName.toLocaleLowerCase(),d=new r.DOMMapper,c=d.getUnadjustedBounds(l);if(!c)return null;if(!a.CommonUtil.isTarget(l))return null;if(c.height>=24&&c.width>=24)return(0,n.RulePass)("pass_sized");var m=o.CSSUtil.getInlineStatus(l);if(null===m)return null;if(m.inline)return m.text?null===m.violation?(0,n.RulePass)("pass_inline"):(0,n.RulePotential)("recommendation_inline",[u,m.violation]):null===m.violation?(0,n.RulePass)("pass_default"):(0,n.RulePotential)("recommendation_inline",[u,m.violation]);if(o.CSSUtil.isTargetBrowserDefault(l))return(0,n.RulePass)("pass_default");var p=l.ownerDocument;if(!p)return null;var h=getComputedStyle(l);if(null===h)return null;var g=h.zIndex;g&&!isNaN(Number(g))||(g="0");var b=s.CacheUtil.getCache(p.documentElement,"target_spacing_sufficient::targets",void 0);if(void 0===b){b=[];for(var _=p.querySelectorAll("body *:not(script):not(style)"),f=0;f<_.length;f++){var v=_[f];a.CommonUtil.isTarget(v)&&b.push(v)}s.CacheUtil.setCache(p.documentElement,"target_spacing_sufficient::targets",b)}if(b&&0!==b.length){var A=!0,w=24,y=24,C=null,k=null,R=[],x=function(e){var t=b[e],i=l.compareDocumentPosition(t);if(0===i||i&Node.DOCUMENT_POSITION_CONTAINED_BY)return A=!1,"continue";if(i&Node.DOCUMENT_POSITION_CONTAINS||R.some(function(e){return e.contains(t)}))return"continue";var a=d.getUnadjustedBounds(t);if(!a)return"continue";var r=getComputedStyle(t),o="0";if(r&&((o=r.zIndex)&&!isNaN(Number(o))||(o="0")),a.top<=c.top&&a.left<=c.left&&a.top+a.height>=c.top+c.height&&a.left+a.width>=c.left+c.width)return(A?parseInt(g)<parseInt(o):parseInt(g)<=parseInt(o))?{value:null}:{value:(0,n.RulePotential)("potential_overlap",[u,t.nodeName.toLowerCase()])};if(c.top<=a.top&&c.left<=a.left&&c.top+c.height>=a.top+a.height&&c.left+c.width>=a.left+a.width)return(A?parseInt(g)<parseInt(o):parseInt(g)<=parseInt(o))?{value:(0,n.RulePotential)("potential_overlap",[u,t.nodeName.toLowerCase()])}:{value:(0,n.RuleFail)("violation_spacing",[u,t.nodeName.toLowerCase()])};if((c.top>=a.top&&c.top<=a.top+a.height||c.top+c.height<=a.top&&c.top+c.height>=a.top+a.height)&&(c.left>a.left&&c.left<a.left+a.width||a.left>c.left&&a.left<c.left+c.width)||(c.top>a.top&&c.top<a.top+a.height||a.top>c.top&&a.top<c.top+c.height)&&(c.left>=a.left&&c.left<=a.left+a.width||c.left+c.width>=a.left&&c.left+c.width<=a.left+a.width))return{value:(0,n.RulePotential)("potential_overlap",[u,t.nodeName.toLowerCase()])};var s=24,m=24;c.width<24&&(c.top>=a.top&&c.top<=a.top+a.height||c.top<=a.top&&c.top+c.height>a.top)&&(s=Math.min(Math.abs(c.left-a.left),Math.abs(c.left-(a.left+a.width)),Math.abs(c.left+c.width-(a.left+a.width)),Math.abs(c.left+c.width-a.left))),c.height<24&&(c.left>=a.left&&c.left<=a.left+a.width||c.left<=a.left&&c.left+c.width>a.left)&&(m=Math.min(Math.abs(c.top-a.top),Math.abs(c.top-(a.top+a.height)),Math.abs(c.top+c.height-(a.top+a.height)),Math.abs(c.top+c.height-a.top))),s<w&&(w=s,C=t),m<y&&(y=m,k=t),R.push(t)};for(f=0;f<b.length;f++){var P=x(f);if("object"==typeof P)return P.value}return Math.round(c.width/2)+w<12||Math.round(c.height/2)+y<12?Math.round(c.width/2)+w<Math.round(c.height/2)+y?(0,n.RuleFail)("violation_spacing",[u,C.nodeName.toLowerCase()]):(0,n.RuleFail)("violation_spacing",[u,k.nodeName.toLowerCase()]):(0,n.RulePass)("pass_spacing")}}}},9599(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.text_block_heading=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(3864),s=i(4919),u=i(3946);t.text_block_heading={id:"text_block_heading",context:"dom:p, dom:div, dom:br",refactor:{RPT_Block_ShouldBeHeading:{Potential_1:"potential_heading"}},help:{"en-US":{potential_heading:"text_block_heading.html",group:"text_block_heading.html"}},messages:{"en-US":{potential_heading:"Confirm this text '{0}' is used as a heading and if so, modify to use a heading element or role",group:"Heading text should use a heading element or role"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(r.CommonUtil.isNodeDisabled(n)||!u.VisUtil.isNodeVisible(n))return null;if(null===r.CommonUtil.getAncestor(n,["body"])||null!==r.CommonUtil.getAncestor(n,["script"]))return null;var d=0,c=n.ownerDocument.getElementsByTagName("body");if(null!=c){var m=getComputedStyle(c[0]);m&&(d=s.CSSUtil.getPixelsFromStyle(m["font-size"],c))}var p=0,h=[],g=new o.DOMWalker(n);g.nextNode();for(var b=!1;!b&&g.nextNode()&&g.node!==n&&g.node!==o.DOMWalker.parentNode(n)&&!["br","div","p"].includes(g.node.nodeName.toLowerCase());)if(g.node!==n&&!r.CommonUtil.shouldNodeBeSkippedHidden(g.node)){var _=g.node.nodeName.toLowerCase();if(3===g.node.nodeType){if(g.node.nodeValue.trim().length>0&&g.node.parentElement){var f=getComputedStyle(g.node.parentElement);if(f&&("bold"===f["font-weight"]||f["font-weight"]>=700||f["font-size"]&&f["font-size"].includes("large")||f["font-size"]&&0!==d&&s.CSSUtil.getPixelsFromStyle(f["font-size"],g.node.parentElement)>d)){var v=g.node.nodeValue.trim();(A=r.CommonUtil.wordCount(v))>0&&(h.push(v),p+=A),b=p>10,g.bEndTag=!0}else b=!0}}else if(1===g.node.nodeType)if("b"===_||"strong"===_||"u"===_||"font"===_){var A;v=r.CommonUtil.getInnerText(g.node),(A=r.CommonUtil.wordCount(v))>0&&(h.push(v),p+=A),b=p>10,g.bEndTag=!0}else{var w=l.AriaUtil.getResolvedRole(g.node);b=null!==w&&"generic"!==w&&"paragraph"!==w&&"strong"!==w||"applet"===_}}return 0==p&&(b=!0),b||(b=/[:,;\-\.]$/.test(h.join(" ").trim())),b?null:(0,a.RulePotential)("potential_heading",[h.join(" ")])}}},4672(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.text_contrast_sufficient=void 0;var a=i(7139),n=i(3946),l=i(3883),r=i(461),o=i(461),s=i(4919);t.text_contrast_sufficient={id:"text_contrast_sufficient",context:"dom:*",refactor:{IBMA_Color_Contrast_WCAG2AA:{Pass_0:"pass",Fail_1:"fail_contrast",Potential_1:"potential_same_color"},IBMA_Color_Contrast_WCAG2AA_PV:{pass_0:"pass",potential_1:"potential_graphic_background"}},help:{"en-US":{group:"text_contrast_sufficient.html",pass:"text_contrast_sufficient.html",fail_contrast:"text_contrast_sufficient.html",potential_same_color:"text_contrast_sufficient.html",potential_graphic_background:"text_contrast_sufficient.html",potential_text_shadow:"text_contrast_sufficient.html"}},messages:{"en-US":{group:"The contrast ratio of text with its background must meet WCAG AA requirements",pass:"The contrast ratio of text with its background meets WCAG AA requirements",fail_contrast:"Text contrast of {0} with its background is less than the WCAG AA minimum requirements for text of size {1}px and weight of {2}",potential_same_color:"The foreground text and its background color are both detected as {3}. Verify the text meets the WCAG AA requirements for minimum contrast",potential_graphic_background:"Verify the contrast ratio of the text against the lightest and the darkest colors of the background meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}",potential_text_shadow:"Verify the contrast ratio of the text with shadow meets the WCAG AA minimum requirements for text of size {1}px and weight of {2}"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_0","WCAG_2_1","WCAG_2_2"],num:"1.4.3",level:o.eRulePolicy.VIOLATION,toolkitLevel:o.eToolkitLevel.LEVEL_ONE}],act:["afw4f7"],run:function(e,t,i){var o=e.dom.node,u=o.nodeName.toLowerCase();if(!n.VisUtil.isNodeVisible(o)||null!=n.VisUtil.hiddenByDefaultElements&&null!=n.VisUtil.hiddenByDefaultElements&&n.VisUtil.hiddenByDefaultElements.indexOf(u)>-1)return null;if(a.CommonUtil.isNodeDisabled(o))return null;if(a.CommonUtil.getAncestor(o,["svg","script","meta","style"]))return null;var d=o.ownerDocument;if(!d)return null;var c=d.defaultView;if(!c)return null;var m=a.CommonUtil.getNodeText(o);if(!a.CommonUtil.isShadowHostElement(o)||a.CommonUtil.isShadowHostElement(o)&&""===a.CommonUtil.getNodeText(o.shadowRoot)){if(0==m.trim().length)return null;if(0===(m=m.trim().replace(/[^(a-zA-Z\d\s)\^(\u4e00-\u9fff\u3400-\u4dbf)\u0000-\u0008\u000B-\u001F\u007F-\u009F\u2000-\u200F\u2028-\u202F\u205F-\u206F\u3000\uFEFF]+/g,"")).trim().length)return null}var p=o;if(a.CommonUtil.isShadowHostElement(o)){if(o.shadowRoot)for(var h=o.firstChild;h;h=h.nextSibling)if(3==h.nodeType){p=h.assignedSlot;break}if(null===p)return}var g=c.getComputedStyle(p);if(!1==("0"!==g.width&&"0"!==g.height&&"0"!==g.opacity&&"none"!==g.display&&"hidden"!==g.visibility&&"hidden"!==g.overflow&&("auto"===g.left||"absolute"===g.position&&parseInt(g.left.replace(/[^0-9.+-]/,""))>0)&&("auto"===g.left||"absolute"===g.position&&parseInt(g.top.replace(/[^0-9.+-]/,""))>0)))return null;var b=-1;if("auto"!==g.clip){var _=g.clip.toString();if(_.includes("rect"))for(var f=[],v=/\((.*)\)/g.exec(_)[1].split(", "),A=0;A<v.length;A++)f.push(v[A]);b=parseInt(f[0].replace(/px/g,""))-parseInt(f[2].replace(/px/g,"")),b=Math.abs(b)}if("absolute"===g.position&&b<7&&-1!==b)return null;var w=l.ColorUtil.ColorCombo(p);if(null!==w){var y=w.fg,C=w.bg,k=y.contrastRatio(C),R=s.CSSUtil.getWeightNumber(g.fontWeight),x=s.CSSUtil.getFontInPixels(g.fontSize,p),P=x>=24||x>=18.6&&R>=700;s.CSSUtil.containsCKJ(m)&&(P=x>=29.3||x>=24&&R>=700);var T=k>=4.5||k>=3&&P,U=w.hasBGImage||w.hasGradient,I=w.textShadow,E=a.CommonUtil.isNodeDisabled(p);if(!E){var N=a.CommonUtil.getControlOfLabel(p);N&&(E=a.CommonUtil.isNodeDisabled(N))}return!E&&"label"===u&&a.CommonUtil.isDisabledByFirstChildFormElement(p)&&(E=!0),!E&&o.hasAttribute("id")&&a.CommonUtil.isDisabledByReferringElement(p)&&(E=!0),!T&&E&&(T=!0),T?(0,r.RulePass)("pass",[k.toFixed(2),x,R,y.toHex(),C.toHex(),w.hasBGImage,w.hasGradient]):U?(0,r.RulePotential)("potential_graphic_background",[k.toFixed(2),x,R]):I?(0,r.RulePotential)("potential_text_shadow",[k.toFixed(2),x,R]):y.toHex()===C.toHex()?(0,r.RulePotential)("potential_same_color",[k.toFixed(2),x,R,y.toHex(),C.toHex(),w.hasBGImage,w.hasGradient]):(0,r.RuleFail)("fail_contrast",[k.toFixed(2),x,R,y.toHex(),C.toHex(),w.hasBGImage,w.hasGradient])}console.log("unable to get color combo for element: "+p.nodeName)}}},4353(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.text_quoted_correctly=void 0;var a=i(461),n=i(461),l=i(7139),r=i(3946);t.text_quoted_correctly={id:"text_quoted_correctly",context:"dom:*",help:{"en-US":{Pass_0:"text_quoted_correctly.html",Potential_1:"text_quoted_correctly.html",group:"text_quoted_correctly.html"}},messages:{"en-US":{Pass_0:"Rule Passed",Potential_1:"If the following text is a quotation, mark it as a <q> or <blockquote> element: {0}",group:"Quotations should be marked with <q> or <blockquote> elements"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node;if(!r.VisUtil.isNodeVisible(n))return null;if(null===l.CommonUtil.getAncestor(n,["body"]))return null;for(var o=!0,s=n.firstChild,u=null,d=["blockquote","q","script","style","pre","code","ruby","samp"];o&&s;){if("#text"===s.nodeName){var c=s.nodeValue,m=(c=c.replace(/(\S)'(\S)/g,"$1$2")).match(/("[^"]+")/g),p=c.match(/('[^']+')/g);if((null!==m||null!==p)&&null===l.CommonUtil.getAncestor(s,d)){if(null!=m)for(var h=0;o&&h<m.length;++h)o=l.CommonUtil.wordCount(m[h])<3;if(null!=p)for(h=0;o&&h<p.length;++h)o=l.CommonUtil.wordCount(p[h])<3;u=null===m?p.join(", ").replace(new RegExp("\\r?\\n|\\r","g"),""):null===p?m.join(", ").replace(new RegExp("\\r?\\n|\\r","g"),""):m.concat(p).join(", ").replace(new RegExp("\\r?\\n|\\r","g"),"")}}s=s.nextSibling}return!o&&u.length&&u.length>69&&(u=u.substring(0,32)+" ... "+u.substring(u.length-32)),o?(0,a.RulePass)("Pass_0"):(0,a.RulePotential)("Potential_1",[u])}}},7147(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.text_sensory_misuse=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(4566),s=i(3946);t.text_sensory_misuse={id:"text_sensory_misuse",context:"dom:body, dom:body dom:*",refactor:{RPT_Text_SensoryReference:{Potential_1:"potential_position, potential_other"}},help:{"en-US":{potential_position:"text_sensory_misuse.html",potential_other:"text_sensory_misuse.html",group:"text_sensory_misuse.html"}},messages:{"en-US":{potential_position:"Confirm the word(s) '{0}' of the user instruction is used to indicate a logical rather than visual position",potential_other:"Confirm the user instruction is still understandable without the word(s) '{0}'",group:"Instructions should be meaningful without relying solely on shape, size, or location words"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.3"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_TWO}],act:[],run:function(e,t,i){var n=e.dom.node,c=n.nodeName.toLowerCase();if(!s.VisUtil.isNodeVisible(n)||r.CommonUtil.isNodeDisabled(n)||s.VisUtil.hiddenByDefaultElements.includes(c))return null;if(null===r.CommonUtil.getAncestor(n,["body"]))return null;if(null!==r.CommonUtil.getAncestor(n,["script","a","label"]))return null;var m=l.AriaUtil.getResolvedRole(n);if(m){var p=l.AriaUtil.getRolesWithTypes(n,["landmark"]);if(p&&p.includes(m))return null}var h=l.AriaUtil.getRolesWithTypes(n,["widget","heading"]);if(r.CommonUtil.concatUniqueArrayItemList(["caption","cell","code","columnheader","definition","figure","list","listitem","math","meter","row","rowgroup","rowheader","term"],h),null!==l.AriaUtil.getAncestorWithRoles(n,h))return null;for(var g="",b="",_=n.firstChild,f="";_;){if("#text"===_.nodeName){var v=_.nodeValue.trim();v.length>0&&(f+=f.length>0?", "+v:v)}_=_.nextSibling}if(f.length>0){var A=function(e,t){if(!u[t])return"";var i=o.CacheUtil.getCache(e,t+"_sensory_misuse",null);if(null==i){for(var a=u[t].value,n="(ss+|"+a[0],l=1;l<a.length;++l){var r=a[l].trim().split(" ");if(n+="|"+r[0],r.length>1)for(var s=1;s<r.length;++s)n+=" +"+r[s]}n+=")",i=new RegExp(n,"gi"),o.CacheUtil.setCache(e,t+"_sensory_misuse",i)}return i}(n.ownerDocument,"exemptText");f=f.replace(A," "),g=d(n.ownerDocument,"positionText",f),b=d(n.ownerDocument,"otherText",f)}var w=[];return g&&w.push((0,a.RulePotential)("potential_position",[g])),b&&w.push((0,a.RulePotential)("potential_other",[b])),0==w.length?null:w}};var u={positionText:{value:["top-left","top-right","bottom-right","bottom-left","top-to-bottom","left-to-right","bottom-to-top","right-to-left","right","left","above","below","top","bottom","upper","lower","corner","beside"],type:"[string]"},otherText:{value:["round","square","shape","rectangle","triangle","size","large","small","medium","big","huge","tiny","extra","larger","smaller","bigger","little","largest","smallest","biggest"],type:"[string]"},exemptText:{value:["right-click","left-click","right-clicking","right-clicks","left-clicking","left-clicks","square root","right now","off the top"],type:"[string]"}};function d(e,t,i){if(!i)return"";var a=u[t].value,n={},l=[];return i.split(/\s+/).reduce(function(e,t){for(var i=t.replace(/[.?!:;()'",`\]]+$/,""),r=t.toLowerCase().replace(/[.?!:;()'",`\]]/g,""),o=0;o<a.length;o++){var s=r.indexOf(a[o]),u=a[o].length,d=r.charAt(u+s);if(!(s<0)){var c="."==d||"?"==d||"!"==d||":"==d||";"==d||"("==d||")"==d||"'"==d||'"'==d||","==d||".`"==d||"\\"==d||"]"==d,m=!1;if(s>0){var p=r.charAt(s-1);m="-"==p||"."==p||"?"==p||"!"==p||":"==p||";"==p||"("==p||")"==p||"'"==p||'"'==p||","==p||".`"==p||"\\"==p||"]"==p}r.length!=u&&1!=c&&1!=m||(n.hasOwnProperty(i)||(n[i]=!0,l.push(i)),o=a.length)}}return e[i]=(e[i]||0)+1,e},Object.create(null)),l.join(", ")}},1419(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.text_spacing_valid=void 0;var a=i(461),n=i(7139),l=i(3946),r=i(4919),o=i(7507),s=/(-?[\d.]+)([a-z%]*)/;function u(e,t,i){var a;if(i.startsWith("inherit")||i.startsWith("unset")){var n=r.CSSUtil.getAncestorWithStyles(e.parentElement,((a={})[t]=["*"],a),["inherit","unset"]);if(null!==n)return r.CSSUtil.getDefinedStyles(n,[t])[t];if(i.startsWith("unset"))return"initial"}return i}function d(e,t,i,a,n,l){if(void 0===l&&(l=!1),"important"!==e.style.getPropertyPriority(t))return!0;var o=function(e){return e.substring(0,e.length-11)}(i);if("initial"===o||"normal"===o)return!1;var u=parseFloat(o);if(isNaN(u))return!0;var d=o.trim().match(s);if(!d)return!0;var c=d[1],m=d[2];if(""===m){if(l)return!(parseFloat(c)<n);if(0===parseFloat(c))return null}if(""===m&&0!==parseFloat(c))return null;var p=r.CSSUtil.convertValue2Pixels(m,c,e);return!(null!==p&&p/a<n)}t.text_spacing_valid={id:"text_spacing_valid",context:"dom:*",help:{"en-US":{pass:"text_spacing_valid.html",group:"text_spacing_valid.html",fail_letter_spacing_style:"text_spacing_valid.html",fail_word_spacing_style:"text_spacing_valid.html",fail_line_height_style:"text_spacing_valid.html"}},messages:{"en-US":{pass:"CSS !important is not used in inline style to control letter or word spacing or line height",group:"CSS !important should not be used in inline style to control letter or word spacing or line height",fail_letter_spacing_style:"CSS !important should not be used in inline ‘letter-spacing’ style",fail_word_spacing_style:"CSS !important should not be used in inline ‘word-spacing’ style",fail_line_height_style:"CSS !important should not be used in inline ‘line-height’ style"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.4.12"],level:a.eRulePolicy.VIOLATION,toolkitLevel:a.eToolkitLevel.LEVEL_THREE}],act:["9e45ec","24afc2","78fd32"],run:function(e,t,i){for(var c=e.dom.node,m="",p=c.childNodes,h=0;h<p.length;++h)3===p[h].nodeType&&(m+=p[h].nodeValue);if(0===m.trim().length)return null;if(l.VisUtil.isNodeHiddenFromAT(c)||n.CommonUtil.isNodeDisabled(c))return null;var g=(new o.DOMMapper).getUnadjustedBounds(c);if(!g||g.top<0||g.left<0)return null;if(n.CommonUtil.getAncestor(c,"svg"))return null;var b=getComputedStyle(c),_=parseFloat(b.getPropertyValue("font-size")),f=b.getPropertyValue("word-spacing"),v=b.getPropertyValue("letter-spacing"),A=b.getPropertyValue("line-height"),w=!0,y=!0,C=!0;if(f){var k=parseFloat(f);if(!isNaN(k)){var R=r.CSSUtil.convertValue2Pixels("px",k.toString(),c);null!==R&&R/_<.16&&(w=!1)}}if(v){var x=parseFloat(v);if(!isNaN(x)){var P=r.CSSUtil.convertValue2Pixels("px",x.toString(),c);null!==P&&P/_<.12&&(y=!1)}}if(A){var T=parseFloat(A);if(!isNaN(T)){var U=A.match(s);if(U){var I=U[1],E=U[2];""!==E&&"px"!==E||(""===E?parseFloat(I):parseFloat(I)/_)<1.5&&(C=!1)}}}if(w&&y&&C)return null;var N=r.CSSUtil.getDefinedStyles(c,["word-spacing","letter-spacing","line-height"]);if(0===Object.keys(N).length)return null;var L=[],S=N["word-spacing"];if(S){var O=d(c,"word-spacing",S=u(c,"word-spacing",S),_,.16);L.push(O?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_word_spacing_style"))}var q=N["letter-spacing"];q&&(O=d(c,"letter-spacing",q=u(c,"letter-spacing",q),_,.12),L.push(O?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_letter_spacing_style")));var W=N["line-height"];return W&&null===r.CSSUtil.getAncestorWithStyles(c,{overflow:["auto","scroll"],"overflow-x":["auto","scroll"],"overflow-y":["auto","scroll"]})&&(O=d(c,"line-height",W=u(c,"line-height",W),_,1.5,!0),L.push(O?(0,a.RulePass)("pass"):(0,a.RuleFail)("fail_line_height_style"))),L.length>0?L:null}}},855(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.text_whitespace_valid=void 0;var a=i(461),n=i(461),l=i(7139);t.text_whitespace_valid={id:"text_whitespace_valid",context:"dom:*",help:{"en-US":{pass:"text_whitespace_valid.html",potential_text:"text_whitespace_valid.html",group:"text_whitespace_valid.html"}},messages:{"en-US":{pass:"Rule Passed",potential_text:"Space characters should not be used to create space between the letters of a word",group:"Space characters should not be used to control spacing within a word"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["1.3.2"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_THREE}],act:[],run:function(e,t,i){var n=e.dom.node,r=l.CommonUtil.getAncestor(n,["body","script","code"]);if(null==r||"body"!=r.nodeName.toLowerCase())return null;for(var o=!0,s=n.firstChild;o&&s;){if("#text"==s.nodeName){var u=s.nodeValue;o=!/(^|\s)[a-zA-Z] [a-zA-Z] [a-zA-Z]($|\s)/.test(u)}s=s.nextSibling}return o?(0,a.RulePass)("pass"):(0,a.RulePotential)("potential_text")}}},3420(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.widget_tabbable_exists=void 0;var a=i(461),n=i(461),l=i(7011),r=i(7139),o=i(9955),s=i(3864),u=i(3946);t.widget_tabbable_exists={id:"widget_tabbable_exists",context:"aria:button,aria:link,aria:spinbutton,aria:tablist,aria:combobox,aria:listbox,aria:menu,aria:radiogroup,aria:tree,aria:menubar, aria:grid, aria:treegrid, aria:checkbox,aria:slider,aria:spinbutton,aria:textbox,aria:scrollbar,aria:slider,aria:spinbutton",refactor:{IBMA_Focus_Tabbable:{pass:"pass",fail_no_tabbable:"fail_no_tabbable"}},help:{"en-US":{pass:"widget_tabbable_exists.html",fail_no_tabbable:"widget_tabbable_exists.html",group:"widget_tabbable_exists.html"}},messages:{"en-US":{pass:"Rule Passed",fail_no_tabbable:'Component with "{0}" role does not have a tabbable element',group:"Component must have at least one tabbable element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(!u.VisUtil.isNodeHiddenFromAT(n)&&!r.CommonUtil.isNodeDisabled(n)&&!l.AriaUtil.shouldBePresentationalChild(n)){if("datalist"===n.nodeName.toLowerCase())return null;for(var d=0,c=["combobox","grid","listbox","menu","menubar","radiogroup","tablist","tree","treegrid"];d<c.length;d++){var m=c[d];if(null!=l.AriaUtil.getAncestorWithRole(n,m,!0))return null}var p=o.ARIAMapper.nodeToRole(n),h=0;if(r.CommonUtil.isTabbable(n)&&++h,h<1&&!l.AriaUtil.containsPresentationalChildrenOnly(n)&&n.firstChild)for(var g=new s.DOMWalker(n);h<1&&g.nextNode()&&g.node!=n;)1==g.node.nodeType&&!g.bEndTag&&r.CommonUtil.isTabbable(g.node)&&++h;return h>=1?(0,a.RulePass)("pass"):(0,a.RulePotential)("fail_no_tabbable",[p])}}}},408(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.widget_tabbable_single=void 0;var a=i(461),n=i(461),l=i(3864),r=i(7011),o=i(7139),s=i(9955),u=i(4566),d=i(3946);t.widget_tabbable_single={id:"widget_tabbable_single",context:"aria:button,aria:link,aria:menuitem,aria:spinbutton,aria:tablist,aria:combobox,aria:listbox,aria:menu,aria:radiogroup,aria:tree,aria:checkbox,aria:option,aria:radio,aria:slider,aria:spinbutton,aria:textbox,aria:columnheader,aria:rowheader,aria:slider,aria:tab",refactor:{IBMA_Focus_MultiTab:{pass:"pass",potential_multiple_tabbable:"potential_multiple_tabbable"}},help:{"en-US":{pass:"widget_tabbable_single.html",potential_multiple_tabbable:"widget_tabbable_single.html",group:"widget_tabbable_single.html"}},messages:{"en-US":{pass:"Components with a widget role should have no more than one tabbable element",potential_multiple_tabbable:'Component with "{0}" role has more than one tabbable element',group:"Components with a widget role must have no more than one tabbable element"}},rulesets:[{id:["IBM_Accessibility","IBM_Accessibility_next","WCAG_2_1","WCAG_2_0","WCAG_2_2"],num:["2.1.1","2.4.3"],level:n.eRulePolicy.VIOLATION,toolkitLevel:n.eToolkitLevel.LEVEL_ONE}],act:[],run:function(e,t,i){var n=e.dom.node;if(!d.VisUtil.isNodeHiddenFromAT(n)&&!o.CommonUtil.isNodeDisabled(n)&&!r.AriaUtil.shouldBePresentationalChild(n)){var c=s.ARIAMapper.nodeToRole(n),m=0;if(o.CommonUtil.isTabbable(n)&&++m,m<2&&!r.AriaUtil.containsPresentationalChildrenOnly(n)&&n.firstChild)for(var p=new l.DOMWalker(n);m<2&&p.nextNode()&&p.node!=n;)1==p.node.nodeType&&!p.bEndTag&&o.CommonUtil.isTabbable(p.node)&&++m;var h=m<2;return h||u.CacheUtil.setCache(n,"widget_tabbable_single","potential_multiple_tabbable"),h?(0,a.RulePass)("pass"):(0,a.RulePotential)("potential_multiple_tabbable",[c])}}}},6160(e,t,i){var a=this&&this.__createBinding||(Object.create?function(e,t,i,a){void 0===a&&(a=i);var n=Object.getOwnPropertyDescriptor(t,i);n&&!("get"in n?!t.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return t[i]}}),Object.defineProperty(e,a,n)}:function(e,t,i,a){void 0===a&&(a=i),e[a]=t[i]}),n=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),l=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var i in e)"default"!==i&&Object.prototype.hasOwnProperty.call(e,i)&&a(t,e,i);return n(t,e),t};Object.defineProperty(t,"__esModule",{value:!0}),t.a11yRulesets=void 0;var r=l(i(8855)),o=i(8601),s=[];for(var u in r)s.push(r[u]);var d={"1.1.1":"All non-text content that is presented to the user has a text alternative that serves the equivalent purpose.","1.2.1":"For prerecorded audio-only or video-only media, an alternative provides equivalent information.","1.2.2":"Captions are provided for all prerecorded audio content in synchronized media.","1.2.3":"An alternative for time-based media or audio description of the prerecorded video content is provided for synchronized media.","1.2.4":"Captions are provided for all live audio content in synchronized media.","1.2.5":"Audio description is provided for all prerecorded video content in synchronized media.","1.3.1":"Information, structure, and relationships conveyed through presentation can be programmatically determined or are available in text.","1.3.2":"When the sequence in which content is presented affects its meaning, a correct reading sequence can be programmatically determined.","1.3.3":"Instructions provided for understanding and operating content do not rely solely on sensory characteristics of components such as shape, size, visual location, orientation, or sound.","1.3.4":"Content does not restrict its view and operation to a single display orientation, such as portrait or landscape.","1.3.5":"The purpose of each input field that collects information about the user can be programmatically determined when the field serves a common purpose.","1.4.1":"Color is not used as the only visual means of conveying information, indicating an action, prompting a response, or distinguishing a visual element.","1.4.2":"If any audio plays automatically for more than 3 seconds, either a mechanism is available to pause or stop the audio, or a mechanism is available to control audio volume independently from the overall system volume level.","1.4.3":"The visual presentation of text and images of text has a contrast ratio of at least 4.5:1, with a 3:1 ratio for large-scale text.","1.4.4":"Text can be resized without assistive technology up to 200 percent without loss of content or functionality.","1.4.5":"If the technologies being used can achieve the visual presentation, text should not be used to convey information rather than images of text.","1.4.10":"Content can reflow without loss of information or functionality, and without requiring scrolling in two dimensions.","1.4.11":"The parts of graphical objects required to understand the content, and the visual information required to identify UI components and states, have a contrast ratio of at least 3:1 against adjacent colors.","1.4.12":"No loss of content or functionality occurs when users change letter, word and paragraph spacing, as well as line height.","1.4.13":"Where hover or focus actions cause additional content to become visible and hidden, the additional content is dismissable, hoverable and persistent.","2.1.1":"All functionality of the content is operable through a keyboard interface without requiring specific timings for individual keystrokes.","2.1.2":"If keyboard focus can be moved to a component using a keyboard interface, then focus can be moved away from that component using only a keyboard interface, and, if it requires more than unmodified arrow or tab keys or other standard exit methods, the user is advised of the method for moving focus away.","2.1.4":"If a keyboard shortcut is implemented using only letter, punctuation, number or symbol characters, then the shortcut can be turned off, remapped or activated only on focus.","2.2.1":"For each time limit that is set by the content, the user can turn off, adjust, or extend the limit.","2.2.2":"For moving, blinking, scrolling, or auto-updating information, the user can pause, stop, hide or adjust the information.","2.3.1":"Content does not contain anything that flashes more than three times in any one second period, or the flash is below the general flash and red flash thresholds.","2.4.1":"A mechanism is available to bypass blocks of content that are repeated on multiple Web pages.","2.4.2":"Web pages, non-web documents, and software have titles that describe topic or purpose.","2.4.3":"If content can be navigated sequentially and the navigation sequences affect meaning or operation, focusable components receive focus in an order that preserves meaning and operability.","2.4.4":"The purpose of each link can be determined from the link text alone or from the link text together with its programmatically determined link content.","2.4.5":"More than one way is available to locate a Web page within a set of Web pages, except where the Web Page is the result of, or a step in, a process.","2.4.6":"Headings and labels describe topic or purpose.","2.4.7":"Any keyboard operable user interface has a mode of operation where the keyboard focus indicator is visible.","2.4.11":"When an element receives focus, it is not entirely covered by other content.","2.5.1":"All functionality that uses multipoint or path-based gestures for operation can be operated with a single pointer without a path-based gesture.","2.5.2":"For functionality that can be operated using a single pointer, completion of the function is on the up-event with an ability to abort, undo or reverse the outcome.","2.5.3":"For user interface components with labels that include text or images of text, the accessible name contains the text that is presented visually.","2.5.4":"Functionality that can be operated by motion can also be operated by user interface components, and the motion trigger can be disabled.","2.5.8":"The size of the target for pointer inputs is at least 24 by 24 CSS pixels.","2.5.7":"All functionality that uses a dragging movement for operation can be achieved by a single pointer without dragging.","3.1.1":"The default human language of Web pages, non-Web documents, or software can be programmatically determined.","3.1.2":"The human language of each passage or phrase in the content can be programmatically determined.","3.2.1":"When any component receives focus, it does not initiate a change of context.","3.2.2":"Changing the setting of any user interface component does not automatically cause a change of context unless the user has been advised of the behavior before using the component.","3.2.3":"Navigational mechanisms that are repeated on multiple Web pages within a set of Web pages occur in the same relative order each time they are repeated, unless a change is initiated by the user.","3.2.4":"Components that have the same functionality within a set of Web pages are identified consistently.","3.2.6":"Make it easier to find help and support. If a Web page contains help mechanisms they occur in the same order relative to other page content, unless a change is initiated by the user.","3.3.1":"If an input error is automatically detected, the item that is in error is identified and the error is described to the user in text.","3.3.2":"Labels or instructions are provided when content requires user input.","3.3.3":"If an input error is automatically detected and suggestions for correction are known, then the suggestions are provided to the user, unless it would jeopardize the security or purpose of the content.","3.3.4":"For content that cause legal commitments or financial transactions for the user to occur, that modify or delete user-controllable data in data storage systems, or that submit user test responses, the user can reverse, correct, or confirm the action.","3.3.7":"Make it easier for users to complete multi-step processes. Don't ask for the same information twice in the same session.","3.3.8":"Make logins possible with less mental effort. Don't make people solve, recall, or transcribe something to log in.","4.1.1":"(Obsolete and removed) This requirement was originally adopted to address problems that assistive technology (AT) had directly parsing HTML. AT no longer has any need to directly parse HTML. Consequently, these problems either no longer exist or are addressed by other requirements.","4.1.2":"For all user interface components (including, but not limited to: form elements, links and components generated by scripts), the name and role can be programmatically determined; states, properties, and values that can be set by the user can be programmatically set; and notification of changes to these items is available to user agents, including assistive technologies.","4.1.3":"In content implemented using markup languages, status messages can be programmatically determined through role or properties such that they can be presented to the user by assistive technologies without receiving focus.",HTML:"The HTML specification issues that cause accessibility issues may be covered by other rules and will be reported under those accessibility requirements. However, some non-conforming HTML specification issues are still reported.",ARIA:"The ARIA specification issues that cause accessibility issues may be covered by other rules and will be reported under those accessibility requirements. However, some non-conforming ARIA specification issues are still reported."};t.a11yRulesets=[{id:"EXTENSIONS",name:"Extension Rules",category:o.eGuidelineCategory.ACCESSIBILITY,description:"Rules for enabling the browser extensions",type:o.eGuidelineType.EXTENSION,checkpoints:[{num:"1",name:"Extension CP 1",wcagLevel:"A",summary:"Rules for Extension"}]},{id:"IBM_Accessibility",name:"IBM Accessibility 7.3",category:o.eGuidelineCategory.ACCESSIBILITY,description:"Rules for WCAG 2.0, 2.1, 2.2 A and AA plus additional IBM supplemental requirements.",checkpoints:s.filter(function(e){return!("A"!==e.level&&"AA"!==e.level&&"NA"!==e.level||"2.0"!==e.wcagType&&"2.1"!==e.wcagType&&"2.2"!==e.wcagType&&"NA"!==e.wcagType)}).map(function(e){return{num:e.num,scId:e.scId,name:e.handle,wcagLevel:e.level,summary:d[e.num]}})},{id:"IBM_Accessibility_next",name:"IBM Accessibility next",category:o.eGuidelineCategory.ACCESSIBILITY,description:"Rules for WCAG 2.0, 2.1, 2.2 A and AA plus additional IBM supplemental requirements.",checkpoints:s.filter(function(e){return!("A"!==e.level&&"AA"!==e.level&&"NA"!==e.level||"2.0"!==e.wcagType&&"2.1"!==e.wcagType&&"2.2"!==e.wcagType&&"NA"!==e.wcagType)}).map(function(e){return{num:e.num,scId:e.scId,name:e.handle,wcagLevel:e.level,summary:d[e.num]}})},{id:"WCAG_2_2",name:"WCAG 2.2 (A, AA)",category:o.eGuidelineCategory.ACCESSIBILITY,description:"Rules for WCAG 2.2 A & AA. This is the current W3C recommendation (specification). Content that conforms to WCAG 2.2 also conforms to WCAG 2.1.",checkpoints:s.filter(function(e){return!("A"!==e.level&&"AA"!==e.level||"2.0"!==e.wcagType&&"2.1"!==e.wcagType&&"2.2"!==e.wcagType)}).map(function(e){return{num:e.num,scId:e.scId,name:e.handle,wcagLevel:e.level,summary:d[e.num]}})},{id:"WCAG_2_1",name:"WCAG 2.1 (A, AA)",category:o.eGuidelineCategory.ACCESSIBILITY,description:"Rules for WCAG 2.1 A & AA. Content that conforms to WCAG 2.1 also conforms to WCAG 2.0.",checkpoints:s.filter(function(e){return!("A"!==e.level&&"AA"!==e.level||"2.0"!==e.wcagType&&"2.1"!==e.wcagType)}).map(function(e){return{num:e.num,scId:e.scId,name:e.handle,wcagLevel:e.level,summary:d[e.num]}})},{id:"WCAG_2_0",name:"WCAG 2.0 (A, AA)",category:o.eGuidelineCategory.ACCESSIBILITY,description:"Rules for WCAG 2.0 A & AA. Referenced by US Section 508, but not the latest W3C recommendation.",checkpoints:s.filter(function(e){return("A"===e.level||"AA"===e.level)&&"2.0"===e.wcagType}).map(function(e){return{num:e.num,scId:e.scId,name:e.handle,wcagLevel:e.level,summary:d[e.num]}})}]},5233(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.SRController=void 0;var a=i(8195),n=i(7014),l=i(248),r=i(4566),o=i(2165),s=i(3946),u=function(){function e(e){void 0===e&&(e=document.body),this.rootElement=e,this.liveListeners=[],this.ctrlDoc=e.ownerDocument,this.setPointOfRegard(e),this.setupMutationTracking(),console.info('[WARNING] The SRController is a new feature that is not yet "stable". What this means:\n* API subject to change, even between minor versions of the checker\n* Results should be considered experimental. There are a variety of known issues, but making this available for early experimentation / feedback.')}return e.getController=function(t){return void 0===t&&(t=document),this.singleton||(this.singleton=new e(t.body)),this.singleton},e.prototype.disconnect=function(){this.mutationObserver&&this.mutationObserver.disconnect()},e.prototype.findAllShadowRoots=function(e){void 0===e&&(e=document);for(var t,i=[],a=this.ctrlDoc.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,null);t=a.nextNode();){var n=t;if(n.shadowRoot){i.push(n.shadowRoot);var l=this.findAllShadowRoots(n.shadowRoot);i.push.apply(i,l)}}return i},e.prototype.setupMutationTracking=function(){var e=this;this.mutationObserver&&this.mutationObserver.disconnect();var t=this,i=new MutationObserver(function(l){for(var r=t.pointOfRegard.getNode(),o=function(e){e.removedNodes.forEach(function(t){(t.isSameNode(r)||t.contains(r))&&(console.info("Adjusting PoR due to DOM mutation removing PoR"),r=e.target)})},u=0,d=l.filter(function(e){var t;return(null===(t=e.removedNodes)||void 0===t?void 0:t.length)>0});u<d.length;u++)o(d[u]);e.setPointOfRegard(r);for(var c=function(t){t.addedNodes&&t.addedNodes.forEach(function(t){for(var a=0,n=e.findAllShadowRoots(t);a<n.length;a++){var l=n[a];i.observe(l,{childList:!0,subtree:!0,characterData:!0})}});var l=t.target,r=1===l.nodeType?l:l.parentElement;if(r&&!r.closest('[aria-busy="true"]')&&"true"!==r.getAttribute("aria-busy")){var o=(["polite","assertive"].includes(r.getAttribute("aria-live"))||"OUTPUT"===r.nodeName.toUpperCase()||["status","log","progressbar","alert","timer"].includes(r.getAttribute("role")))&&r||r.closest('[aria-live="polite"],[aria-live="assertive"],output,[role="status"],[role="log"],[role="progressbar"],[role="alert"],[role="timer"]'),u=!1,d=["additions","text"];if(o){var c=r.closest("[aria-relevant]");c&&(d=c.getAttribute("aria-relevant").split(/ +/g)),"log"===o.getAttribute("role")&&(d=["additions"]),o.hasAttribute("aria-relevant")&&(d=o.getAttribute("aria-relevant").split(/ +/g)),d.includes("all")&&(d=["additions","removals","text"]),u=3===t.target.nodeType&&d.includes("text")||t.addedNodes.length>0&&d.includes("additions")||t.removedNodes.length>0&&d.includes("removals")}if(o&&u){var m="true"===o.getAttribute("aria-atomic")||["alert","status","timer","marquee"].includes(o.getAttribute("role"));if(m||"characterData"!==t.type||3!==t.target.nodeType||s.VisUtil.isNodeHiddenFromAT(t.target.parentElement)){var p=m?o:t.target;p.liveAnnounce&&clearTimeout(p.liveAnnounce),p.liveAnnounce=setTimeout(function(){var i=[],l=d.includes("removals")&&t.removedNodes.length>0;if(m||l){var r=new a.SRCursor(p,!1),o=new a.SRCursor(p,!0);o.next(function(){return!0}),i.push((l?"[removed] ":"")+n.SRRenderer.renderRange("item",r,o))}else d.includes("additions")&&t.addedNodes.length>0&&t.addedNodes.forEach(function(e){var t=new a.SRCursor(e,!1),l=new a.SRCursor(e,!0);l.next(function(){return!0}),i.push(n.SRRenderer.renderRange("item",t,l))});for(var s=0,u=e.liveListeners;s<u.length;s++)(0,u[s])(i.join("\n"))},100)}else for(var h=0,g=e.liveListeners;h<g.length;h++)(0,g[h])(t.target.nodeValue)}}},m=0,p=l;m<p.length;m++)c(p[m])}),l=this.findAllShadowRoots(this.ctrlDoc.documentElement);l.push(this.ctrlDoc.documentElement);for(var r=0,o=l;r<o.length;r++){var u=o[r];i.observe(u,{childList:!0,subtree:!0,characterData:!0})}},e.prototype.addLiveListener=function(e){this.liveListeners.push(e)},e.prototype.removeLiveListener=function(e){this.liveListeners=this.liveListeners.filter(function(t){return t!==e})},e.prototype.getPointOfRegard=function(){return this.pointOfRegard},e.prototype.setPointOfRegard=function(t){var i;try{this.pointOfRegard=new a.SRCursor(t);var l=e.diffContainers("focus",this.pointOfRegard),r=this.pointOfRegard.getRole(),o=null===(i=this.pointOfRegard.getNameInfo())||void 0===i?void 0:i.name;return{success:!0,renderingResult:n.SRRenderer.renderCurrent("focus",this.pointOfRegard,l),role:r,name:o}}catch(e){return{success:!1,renderingResult:{start:this.pointOfRegard.clone(),end:this.pointOfRegard.clone(),message:"Failed to set point of regard: ".concat(e.message)}}}},e.prototype.jumpNext=function(t){var i;r.CacheUtil.clearCaches(this.ctrlDoc.documentElement);var a=this.pointOfRegard.clone();try{for(var o=!0,s=this.pointOfRegard.clone(),u=void 0;o&&s;){var d=s.clone();if(s=l.SRNavigator.jumpNext(t,s)){var c=e.diffContainers(t,s,d);"item"!==t||l.SRNavigator.getStartFunc(t)(s.getRole(),!s.isEndTag(),s.getNode())||(c={entering:[],leaving:[]}),o=0===(u=n.SRRenderer.renderCurrent(t,s,c)).message.trim().length&&!["region"].includes(t)}}if(s)return this.pointOfRegard=s,{success:!0,renderingResult:u,role:this.pointOfRegard.getRole(),name:null===(i=this.pointOfRegard.getNameInfo())||void 0===i?void 0:i.name};this.pointOfRegard=a;var m=n.SRRenderer.renderCurrent(t,a,{leaving:[],entering:[]});return{success:!1,renderingResult:{start:a.clone(),end:a.clone(),message:"No next ".concat(t,". ").concat((null==m?void 0:m.message)||"")}}}catch(e){return console.error(e),this.pointOfRegard=a,{success:!1,renderingResult:{start:a.clone(),end:a.clone(),message:"Navigation error: ".concat(e.message)}}}finally{console.groupEnd()}},e.prototype.jumpPrevious=function(t){var i;r.CacheUtil.clearCaches(this.ctrlDoc.documentElement);var a=this.pointOfRegard.clone();try{for(var o=!0,s=this.pointOfRegard.clone(),u=void 0;o&&s;){var d=s.clone();if(s=l.SRNavigator.jumpPrevious(t,s)){var c=e.diffContainers(t,s,d);"item"!==t||l.SRNavigator.getStartFunc(t)(s.getRole(),!s.isEndTag(),s.getNode())||(c={entering:[],leaving:[]}),o=0===(u=n.SRRenderer.renderCurrent(t,s,c)).message.trim().length&&!["region"].includes(t)}}if(s)return this.pointOfRegard=s,{success:!0,renderingResult:u,role:this.pointOfRegard.getRole(),name:null===(i=this.pointOfRegard.getNameInfo())||void 0===i?void 0:i.name};this.pointOfRegard=a;var m=n.SRRenderer.renderCurrent(t,a,{leaving:[],entering:[]});return{success:!1,renderingResult:{start:a.clone(),end:a.clone(),message:"No previous ".concat(t,". ").concat((null==m?void 0:m.message)||"")}}}catch(e){return console.error(e),this.pointOfRegard=a,{success:!1,renderingResult:{start:a.clone(),end:a.clone(),message:"Navigation error: ".concat(e.message)}}}},e.diffContainers=function(t,i,l){var r=[],o=[];try{var s=i?i.getNode().ownerDocument.body||i.getNode().ownerDocument.documentElement:l?l.getNode().ownerDocument.body||l.getNode().ownerDocument.documentElement:document.body||document.documentElement,u=i?i.clone():new a.SRCursor(s),d=l?l.clone():new a.SRCursor(s);if(!u.getNode().isSameNode(d.getNode())){var c=e.commonParent(u,d);if(c){for(;c.contains(u);)o.push(n.SRRenderer.renderEnter(t,u,d)),u.parent();for(o.reverse(),o=o.filter(function(e){return e&&e.trim().length>0}).map(function(e){return e.trim()});c.contains(d);)r.push(n.SRRenderer.renderLeave(t,d,d)),d.parent();r=r.filter(function(e){return e&&e.trim().length>0}).map(function(e){return e.trim()})}}}catch(e){console.error(e)}return{leaving:r,entering:o}},e.commonParent=function(e,t){if(e.contains(t))return e.clone();if(t.contains(e))return t.clone();for(var i=e.clone();!i.contains(t)&&i.parent(););return i.contains(e)&&i.contains(t)?i:null},e.renderAll=function(t){var i=e.getController();i.ctrlDoc.body.querySelectorAll("dialog,[role='dialog']").forEach(function(e){o.SRUtil.isModalDialogElement(e)&&i.setPointOfRegard(e)});var a=[],l=n.SRRenderer.renderCurrent(t,i.getPointOfRegard(),{entering:[],leaving:[]});l&&a.push(l.message);for(var r=!0;r;){var s=i.jumpNext(t);s.success?a.push(s.renderingResult.message):r=!1}return a},e.renderAllDetail=function(t,i){var a=e.getController(t);a.setPointOfRegard(t.body),t.body.querySelectorAll("dialog,[role='dialog']").forEach(function(e){o.SRUtil.isModalDialogElement(e)&&a.setPointOfRegard(e)});var l=[],r=n.SRRenderer.renderCurrent(i,a.getPointOfRegard(),{entering:[],leaving:[]});r&&l.push(r);for(var s=!0;s;){var u=a.jumpNext(i);u.success?l.push(u.renderingResult):s=!1}return l},e.renderStructure=function(t){for(var i,n=["region","heading","item","tab_focus","image"],l=n.map(function(i){return e.renderAllDetail(t,i)}),r=[],s=function(){var e=null===(i=l[0][0])||void 0===i?void 0:i.start;n.forEach(function(t,i){l[i].length>0&&(!e||a.SRCursor.compare(l[i][0].start,e)<0)&&(e=l[i][0].start)});var s={},u=!1;if(n.forEach(function(t,i){s[t]="",l[i].length>0&&0===a.SRCursor.compare(l[i][0].start,e)&&(s[t]=l[i].shift().message,u=""!==s[t])}),u){var d=e.getElement(),c=d&&o.SRUtil.getUniqueSelector(d);c&&t.querySelector(c)&&(s.selector=c),r.push(s)}};l.some(function(e){return e.length>0});)s();return r},e}();t.SRController=u},8195(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.SRCursor=void 0;var a=i(3864),n=i(1950),l=i(7011),r=i(7139),o=i(2165),s=function(){function e(e,t){this.walker=new a.DOMWalker(e,t,void 0,!1),e&&this.refreshName()}return e.prototype.clone=function(){var t=new e(this.walker.node,this.walker.bEndTag);return t.role=this.role,t.name=this.name,t},e.prototype.refreshName=function(){1===this.walker.node.nodeType?(this.role=l.AriaUtil.getResolvedRole(this.walker.node,!0),this.name=n.AccNameUtil.computeAccessibleName(this.walker.node)):3===this.walker.node.nodeType?(this.role="text",this.name={name:this.walker.node.textContent,nameFrom:"text"}):(this.role=void 0,this.name=void 0)},e.prototype.next=function(e,t){var i,a=!1;this.refreshName();var n=t&&t(this)||{skipCurrent:!1,skipChildren:!1},r=n.skipCurrent,s=n.skipChildren;do{if(s&&!this.walker.bEndTag)this.walker.bEndTag=!0;else if(!this.walker.nextNode())break;if(this.refreshName(),r=(i=t&&t(this)||{skipCurrent:!1,skipChildren:!1}).skipCurrent,s=i.skipChildren,1===this.walker.node.nodeType?this.role=l.AriaUtil.getResolvedRole(this.walker.node,!0):3===this.walker.node.nodeType&&(this.role="text"),o.SRUtil.isModalDialogElement(this.getNode())&&this.isEndTag())break;r||(a=e(this.role,!this.walker.bEndTag,this.walker.node))}while(!a);return a?this.refreshName():(this.role=void 0,this.name=void 0),a},e.prototype.previous=function(e,t){var i,a=!1;this.refreshName();var n=t&&t(this)||{skipCurrent:!1,skipChildren:!1},r=n.skipCurrent,s=n.skipChildren;do{if(s&&this.walker.bEndTag)this.walker.bEndTag=!1;else if(!this.walker.prevNode())break;if(this.refreshName(),r=(i=t&&t(this)||{skipCurrent:!1,skipChildren:!1}).skipCurrent,s=i.skipChildren,1===this.walker.node.nodeType?this.role=l.AriaUtil.getResolvedRole(this.walker.node,!0):3===this.walker.node.nodeType&&(this.role="text"),o.SRUtil.isModalDialogElement(this.getNode())&&!this.isEndTag())break;r||(a=e(this.role,!this.walker.bEndTag,this.walker.node))}while(!a);return a?this.refreshName():(this.role=void 0,this.name=void 0),a},e.prototype.parent=function(e){return!!this.walker.node.parentNode&&(this.walker.node=this.walker.node.parentNode,this.walker.bEndTag=!0===e,1===this.walker.node.nodeType?(this.role=l.AriaUtil.getResolvedRole(this.walker.node,!0),this.name=n.AccNameUtil.computeAccessibleName(this.walker.node)):3===this.walker.node.nodeType?(this.role="text",this.name={name:this.walker.node.textContent,nameFrom:"text"}):(this.role=void 0,this.name=void 0),!0)},e.prototype.getCurrentOrParentByRole=function(e,t){for(var i=this,a=t?t.map(function(e){return e.toUpperCase()}):[],n=function(t){var n=t.getElement();return e.includes(i.getRole())||n&&!n.hasAttribute("role")&&a.includes(n.nodeName.toUpperCase())};!n(this)&&this.parent(););return n(this)},e.prototype.getCurrentOrParentByRoleClone=function(e,t){var i=this.clone();return i.getCurrentOrParentByRole(e,t)?i:null},e.prototype.getCurrentOrParentTabbableClone=function(){for(var e=this.clone();e;){var t=e.getElement();if(e.isStartTag()&&t&&r.CommonUtil.isTabbable(t))return e;if(!e.parent(!1))break}return null},e.prototype.getRole=function(){return this.role},e.prototype.getNameInfo=function(){return this.name},e.prototype.getName=function(){var e=this.getNameInfo();if(e&&e.name)return e.name;var t=this.getElement();if(t){var i=r.CommonUtil.getLabelForElementHidden(t,!0);if(i)return i.innerText||i.textContent}},e.prototype.setEndTag=function(e){this.walker.bEndTag=e},e.prototype.getNode=function(){return this.walker.node},e.prototype.getElement=function(){if(this.walker.node&&1===this.walker.node.nodeType)return this.walker.node},e.prototype.getParentElement=function(){if(!this.walker.node)return null;var e=this.clone();return e.walker.node=a.DOMWalker.parentElement(e.walker.node),e},e.prototype.isEndTag=function(){return this.walker.bEndTag},e.prototype.isStartTag=function(){return!this.walker.bEndTag},e.compare=function(e,t){var i,n,l=null===(i=null==e?void 0:e.walker)||void 0===i?void 0:i.node,r=null===(n=null==t?void 0:t.walker)||void 0===n?void 0:n.node;if(!l&&!r)return 0;if(!l)return 1;if(!r)return-1;var o=l.compareDocumentPosition(r);if(1&o){for(var s=[l],u=[r],d=l;d=a.DOMWalker.parentNode(d);)s.push(d);for(d=r;d=a.DOMWalker.parentNode(d);)u.push(d);s.reverse(),u.reverse();for(var c=0;c<s.length&&c<u.length&&s[c]===u[c];)c++;if(c===s.length)return e.walker.bEndTag?1:-1;if(c===u.length)return t.walker.bEndTag?-1:1;if(c>0){var m=s[c],p=u[c],h=m.compareDocumentPosition(p);if(2&h)return 1;if(4&h)return-1}return 0}return 8&o?t.walker.bEndTag?-1:1:16&o?e.walker.bEndTag?1:-1:2&o?1:4&o?-1:0},e.prototype.contains=function(e){return this.getNode().contains(e.getNode())&&!this.isSameNode(e)},e.prototype.isSameNode=function(e){return!!e&&this.getNode().isSameNode(e.getNode())},e.prototype.hasNonEmptyName=function(){var e;return((null===(e=this.getNameInfo())||void 0===e?void 0:e.name)||"").trim().length>0},e}();t.SRCursor=s},248(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.SRNavigator=void 0;var a=i(3864),n=i(1950),l=i(8195),r=i(7139),o=i(3946),s=i(7011);!function(e){function t(e){var i;if(1!==e.nodeType)return!1;if("br"===e.nodeName.toLowerCase())return!0;var n=e,l=n.ownerDocument.defaultView,r=null===(i=l.getComputedStyle(n))||void 0===i?void 0:i.display;if(r&&r.startsWith("table"))return!0;if("block"===r&&"block"!==n.style.display&&n.parentElement&&"flex"===l.getComputedStyle(n.parentElement).display)return!1;if("link"===s.AriaUtil.getResolvedRole(n,!0)){var o=new a.DOMWalker(e,!1,void 0,!1);if(o.prevNode(),!t(o.node))return!0}return["block","flex","grid","list-item"].includes(r)}function i(e){if(!e||1!==e.nodeType)return null;var t=e;if(!t.hasAttribute("tabindex"))return null;var i=parseInt(t.getAttribute("tabindex"),10);return Number.isNaN(i)?null:i}function u(e){if(!e||1!==e.nodeType)return!1;var t=e,a=i(t);return(null===a||0===a)&&r.CommonUtil.isTabbable(t)}function d(e){return void 0===e&&(e=!0),function(t,i,a){return!!(a&&1===a.nodeType&&i&&r.CommonUtil.isTabbable(a))&&(e||u(a))}}function c(e,t){var a=((null==t?void 0:t.ownerDocument)||document).body||t;if(!a)return[];var n=new l.SRCursor(a,!1),o=b("tab_focus"),s=[],d=[],c=function(t){e(t.getRole(),!t.isEndTag(),t.getNode())&&(function(e){if(!e||1!==e.nodeType)return!1;var t=e,a=i(t);return null!==a&&a>0&&r.CommonUtil.isTabbable(t)}(t.getNode())?s.push(t.clone()):u(t.getNode())&&d.push(t.clone()))};for(c(n);n.next(function(){return!0},o);)c(n);return s.sort(function(e,t){var a=e.getElement(),n=t.getElement(),r=i(a)||0,o=i(n)||0;return r!==o?o-r:l.SRCursor.compare(e,t)}),s.concat(d)}function m(e,t){return e.findIndex(function(e){return 0===l.SRCursor.compare(e,t)})}function p(e){switch(e){case"link":return function(e,t){return t&&"link"===e};case"tab_focus":return d(!1);case"heading":return function(e,t){return t&&"heading"===e};case"h1":return function(e,t,i){return t&&"heading"===e&&"1"===i.ariaLevel};case"h2":return function(e,t,i){return t&&"heading"===e&&"2"===i.ariaLevel};case"h3":return function(e,t,i){return t&&"heading"===e&&"3"===i.ariaLevel};case"h4":return function(e,t,i){return t&&"heading"===e&&"4"===i.ariaLevel};case"h5":return function(e,t,i){return t&&"heading"===e&&"5"===i.ariaLevel};case"h6":return function(e,t,i){return t&&"heading"===e&&"6"===i.ariaLevel};case"image":return function(e,t){return t&&["img","graphics-document"].includes(e)};case"radio":return function(e,t){return t&&"radio"===e};case"button":return function(e,t){return t&&"button"===e};case"checkbox":return function(e,t){return t&&"checkbox"===e};case"combo":return function(e,t){return t&&"combobox"===e};case"list":return function(e,t){return t&&"list"===e};case"listitem":return function(e,t){return t&&"listitem"===e};case"article":return function(e,t){return t&&"article"===e};case"table":return function(e,t){return t&&"table"===e};case"paragraph":return function(e,t,i){return t&&"P"===i.nodeName.toUpperCase()};case"dom":return function(){return!0};case"item":return function(e,i,n){if(!i)return!1;if(t(n))return!0;var l=new a.DOMWalker(n,!i);return!(!l.prevNode()||!l.bEndTag)&&t(l.node)};case"region":return function(e,t,i){var a,l;return!!t&&(!!["main","navigation","form","banner","search","contentinfo"].includes(e)||"region"===e&&1===(null==i?void 0:i.nodeType)&&!!(null===(l=null===(a=n.AccNameUtil.computeAccessibleName(i))||void 0===a?void 0:a.name)||void 0===l?void 0:l.trim()))};case"formcontrol":case"editbox":case"graphic":case"frame":case"division":case"tabcontrol":case"separator":case"clickable":case"mouseover":throw new Error("NOT_IMPLEMENTED")}}e.getStartFunc=p;var h=function(e){var t;try{var i=e.getNode().nodeType,n=e.getElement(),l=e.clone();if(l.setEndTag(!1),[4,8].includes(i))return{skipCurrent:!0,skipChildren:!0};if(![1,3].includes(i))return{skipCurrent:!0,skipChildren:!1};if(3===i&&!(n=e.getNode().parentElement))return o.VisUtil.isNodeHiddenFromAT(n)?{skipCurrent:!0,skipChildren:!1}:null;if(!(n.closest("body")||(t=n,t.getRootNode()instanceof ShadowRoot)))return{skipCurrent:!0,skipChildren:!1};if(n.closest("script,style"))return{skipCurrent:!0,skipChildren:!0};var r=l.getCurrentOrParentByRoleClone(["heading","link"]),u=s.AriaUtil.getResolvedRole(n),d="heading"===u||"link"===u;if(r){r.getElement();var c=r.getNameInfo();if(c&&!["content","text"].includes(c.nameFrom)){if(o.VisUtil.isNodeHiddenFromAT(n))return{skipCurrent:!0,skipChildren:!0};if(!o.VisUtil.isNodeVisible(n))return{skipCurrent:!0,skipChildren:!0}}else if(d);else{var m=s.AriaUtil.getResolvedRole(n);if(("img"===m||"graphics-document"===m)&&o.VisUtil.isNodeHiddenFromAT(n))return{skipCurrent:!0,skipChildren:!0}}}else{if(o.VisUtil.isNodeHiddenFromAT(n))return{skipCurrent:!0,skipChildren:1===i};if(!o.VisUtil.isNodeVisible(n))return{skipCurrent:!0,skipChildren:1===i}}if("BODY"===n.nodeName.toUpperCase())return{skipCurrent:!1,skipChildren:!1};if("LABEL"===n.nodeName.toUpperCase()){if(n.hasAttribute("for")&&document.getElementById(n.getAttribute("for"))&&"hidden"!==document.getElementById(n.getAttribute("for")).getAttribute("type"))return{skipCurrent:!0,skipChildren:!1};var p=n.querySelector("input, select, textarea, button, [role='checkbox'], [role='combobox'], [role='listbox'], [role='menuitemcheckbox'], [role='menuitemradio'], [role='radio'], [role='searchbox'], [role='slider'], [role='spinbutton'], [role='switch'], [role='textbox']");if(p&&"hidden"!==p.getAttribute("type"))return{skipCurrent:!0,skipChildren:!1}}var h=n.closest("label[for]"),g=h&&h.getAttribute("for");if(h&&g&&document.getElementById(g)&&"hidden"!==document.getElementById(g).getAttribute("type")&&!n.closest("a[href], [role='link'], button, [role='button']"))return{skipCurrent:!0,skipChildren:1===i};var b=l.getRole();if(s.AriaUtil.containsPresentationalChildrenOnly(n))return{skipCurrent:!1,skipChildren:!0};if(["link","heading"].includes(b)&&(!l.getName()||!["content","text"].includes(l.getNameInfo().nameFrom))&&!(r&&r.getNameInfo()&&["content","text"].includes(r.getNameInfo().nameFrom)))return{skipCurrent:!1,skipChildren:!0};if("LEGEND"===n.nodeName.toUpperCase())for(var _=a.DOMWalker.parentElement(e.getNode());_;){if("FIELDSET"===_.nodeName.toUpperCase())return{skipCurrent:!1,skipChildren:!0};_=a.DOMWalker.parentElement(_)}return n&&"MSUP"===n.nodeName.toUpperCase()?{skipCurrent:!1,skipChildren:!0}:n.closest(".ibma-sr-overlay")?{skipCurrent:!0,skipChildren:!0}:null}finally{}},g=function(e){var t=e.getNode().nodeType,i=e.getElement();if(1!==t&&3!==t)return{skipCurrent:!0,skipChildren:!1};if(3===t)return o.VisUtil.isNodeHiddenFromAT(i)?{skipCurrent:!0,skipChildren:!1}:null;if(o.VisUtil.isNodeHiddenFromAT(i))return{skipCurrent:!0,skipChildren:!0};if("LABEL"===i.nodeName.toUpperCase()&&i.hasAttribute("for")&&document.getElementById(i.getAttribute("for"))&&"hidden"!==document.getElementById(i.getAttribute("for")).getAttribute("type"))return{skipCurrent:!0,skipChildren:!1};var a=i.closest("label[for]"),n=a&&a.getAttribute("for");return a&&n&&document.getElementById(n)&&"hidden"!==document.getElementById(n).getAttribute("type")&&!i.closest("a[href], [role='link'], button, [role='button']")?{skipCurrent:!0,skipChildren:1===t}:(e.getRole(),s.AriaUtil.containsPresentationalChildrenOnly(i)?{skipCurrent:!1,skipChildren:!0}:i&&"MSUP"===i.nodeName.toUpperCase()||i.closest(".ibma-sr-overlay")?{skipCurrent:!0,skipChildren:!0}:null)};function b(e){switch(e){case"region":case"item":return h;case"link":case"tab_focus":case"heading":case"h1":case"h2":case"h3":case"h4":case"h5":case"h6":case"image":return g;case"radio":case"button":case"checkbox":case"combo":case"list":case"listitem":case"article":case"table":case"paragraph":case"dom":case"formcontrol":case"editbox":case"graphic":case"frame":case"division":case"tabcontrol":case"separator":case"clickable":case"mouseover":throw new Error("NOT_IMPLEMENTED")}}function _(e,t){try{if("tab_focus"===e){var i=c(d(!0),t.getNode());if(i.length>0){var a=t.getCurrentOrParentTabbableClone(),n=a&&m(i,a)>=0?a:t.clone(),l=m(i,n);return l>=0?l+1<i.length?i[l+1].clone():null:i[0].clone()}}var r=t.clone(),o=p(e),s=b(e);return r.next(o,s)?r:null}finally{console.groupEnd()}}function f(e,t){if("tab_focus"===e){var i=t.clone(),a=p(e),n=b(e);if(i.previous(a,n))return i;var l=c(d(!0),t.getNode());if(l.length>0){var r=t.getCurrentOrParentTabbableClone(),o=r&&m(l,r)>=0?r:t.clone(),s=m(l,o);if(s>0)return l[s-1].clone()}return null}var u=t.clone(),h=p(e),g=b(e);return u.previous(h,g)?u:null}e.getSkipFunc=b,e.jumpCurrent=function(e,t){return("tab_focus"===e?d(!0):p(e))(t.getRole(),!t.isEndTag(),t.getNode())?t.clone():f(e,t)},e.jumpCurrentEnd=function(e,t){if("item"===e)return(r=_(e,t))?[r]:[];var i=t.getNameInfo(),a=t.clone();i&&!["content","text"].includes(i.nameFrom)||a.setEndTag(!0),a.next(function(){return!0});for(var n=[],r=_("item",t);r&&l.SRCursor.compare(r,a)<0;)n.push(r),r=_("item",r);return n.push(a),"tab_focus"===e&&"link"===t.getRole()?[n[n.length-1]]:n},e.jumpNext=_,e.jumpPrevious=f}(t.SRNavigator||(t.SRNavigator={}))},7014(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.SRRenderer=void 0;var a,n=i(7011),l=i(248),r=i(8195),o=i(2151),s=i(7242);(a=t.SRRenderer||(t.SRRenderer={})).renderEnter=function(e,t,i){for(var a=0,n=o.CONTAINER_ENTER_RULES;a<n.length;a++){var l=n[a].test(e,t,i);if(null!=l)return l}return null},a.renderLeave=function(e,t,i){for(var a=0,n=o.CONTAINER_EXIT_RULES;a<n.length;a++){var l=n[a].test(e,t,i);if(null!=l)return l}return null},a.renderCurrent=function(e,t,i){var n=l.SRNavigator.jumpCurrent(e,t);if(!n)return null;var r=l.SRNavigator.jumpCurrentEnd(e,n);r&&0!==r.length||(r=[null]);for(var o=r[r.length-1],s="",u=0,d=r;u<d.length;u++){var c=d[u],m=a.renderRange(e,n,c);if(m.trim().length>0){o=c,s=m;break}}return""===s&&(s=a.renderRange(e,n,o)),{start:n,end:o,message:(i.leaving||[]).concat(i.entering||[]).concat([s]).join(" ").replace(/\s+/g," ")}},a.renderRange=function(e,t,i){for(var a,u=t.clone(),d=[],c=!0,m=null;c;){var p=u.getElement(),h=u.getNode(),g=h.nodeType,b=n.AriaUtil.getAncestorWithRole(h,"link",!0);b&&!["content","text"].includes(null===(a=new r.SRCursor(b).getNameInfo())||void 0===a?void 0:a.nameFrom)&&(b=null);for(var _=0,f=o.SR_RULES;_<f.length;_++){var v=f[_].test(e,u);if(null!=v&&v.trim().length>0){1!==g||u.isEndTag()||"menu"!==p.getAttribute("aria-haspopup")||(v="[subMenu] "+v),"tab_focus"===e?m&&(!b||b&&m!==b)&&(v="".concat(v," ").concat((0,s.getLinkAnnouncement)(new r.SRCursor(m,!1)))):!b||m&&m===b||(v="".concat((0,s.getLinkAnnouncement)(new r.SRCursor(b,!1))," ").concat(v)),""!==v&&(m=b,d.push(v));break}}d.push([].filter(function(e){return e.trim().length>0}).join(" ")),c=u.next(function(){return!0},l.SRNavigator.getSkipFunc(e))&&r.SRCursor.compare(u,i)<0}"tab_focus"===e&&m&&d.push("".concat((0,s.getLinkAnnouncement)(new r.SRCursor(m,!1))));var A=d.filter(function(e){return e.trim().length>0}).join(" ");return A=(A=A.replace(/, \u0001([^\u0002]+)\u0002/g,function(e,t){var i='"'.concat(t,'"'),a=A.replace(e,"");return a.includes(i)||a.includes(t)?"":", ".concat(i)})).replace(/[\u0001\u0002]/g,"")}},328(e,t){Object.defineProperty(t,"__esModule",{value:!0}),t.SRRendererRule=void 0;var i=function(){function e(e){this.ruleDefinition=e}return e.prototype.test=function(e,t,i){if(this.ruleDefinition.modes.includes(e)&&(this.ruleDefinition.roles.includes(t.getRole())||this.ruleDefinition.elems.includes(t.getNode().nodeName.toUpperCase())))for(var a=0,n=this.ruleDefinition.tests;a<n.length;a++){var l=(0,n[a])(t,i,e);if("string"==typeof l)return l}return null},e}();t.SRRendererRule=i},369(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.SRTableUtil=void 0;var a=i(8195);!function(e){function t(e){return!!e.getElement()&&(!!["cell","rowheader","columnheader"].includes(e.getRole())||!e.getElement().hasAttribute("role")&&["TH","TD"].includes(e.getElement().nodeName.toUpperCase()))}function i(e){return e.getCurrentOrParentByRoleClone(["cell","rowheader","columnheader"],["TD","TH"])}function n(e){if(!t(e))return 0;var i=e.getElement().getAttribute("colspan");return i?parseInt(i):1}function l(e){if(!t(e))return 0;var i=e.getElement().getAttribute("rowspan");return i?parseInt(i):1}function r(e){var i=e.getCurrentOrParentByRoleClone(["table"]);if(!i)return null;for(var a,r=i.clone(),o=[],s=[];r.next(function(){return!0})&&!r.getNode().isSameNode(i.getNode());){if(r.isEndTag()&&"row"===r.getRole())for(o.push(s),a=s,s=[];a&&s.length<a.length&&a[s.length].rowIndexStart+a[s.length].rowspan-1>=o.length;)s.push(a[s.length]);if(!r.isEndTag()&&t(r)){for(var u=n(r),d={rowIndexStart:o.length,colIndexStart:s.length,rowspan:l(r),colspan:u,cellCursor:r.clone()},c=0;c<u;++c)s.push(d);for(;a&&s.length<a.length&&a[s.length].rowIndexStart+a[s.length].rowspan-1>=o.length;)s.push(a[s.length])}}return o}function o(e,t){var a=i(e);t||(t=r(e));for(var n=0;n<t.length;++n)for(var l=0;l<t[n].length;++l)if(t[n][l].cellCursor.isSameNode(a))return t[n][l];return null}function s(e,t){return t>=e.colIndexStart&&t<e.colIndexStart+e.colspan}function u(e,t){return t>=e.rowIndexStart&&t<e.rowIndexStart+e.rowspan}function d(e){var t=e.getElement();return!!t&&("cell"===e.getRole()||!t.hasAttribute("role")&&"TD"===t.nodeName.toUpperCase())}e.isCursorCellRole=t,e.getCurrentOrParentCellCursor=i,e.getColSpan=n,e.getRowSpan=l,e.getTableModel=r,e.getCellModel=o,e.cellModelContainsColumn=s,e.cellModelContainsRow=u,e.getRowHeaders=function(e){return""},e.getColumnHeadersForCursor=function(t,i){if(!i&&!(i=r(t)))return"";var n=o(t,i);if(!n)return"";var l=n.cellCursor;if(!l)return"";var u=l.getElement();if(!u)return"";for(var c=[],m=n.colIndexStart;m<n.colIndexStart+n.colspan;++m)c.push({potentialColHeaders:[],existsDataCell:!1,colIdx:m});var p=[];if(u.hasAttribute("headers"))p=u.getAttribute("headers").split(" ").map(function(e){return document.getElementById(e)}).filter(function(e){return!!e}).map(function(e){return new a.SRCursor(e)}).filter(function(t){return c.some(function(a){return s(e.getCellModel(t,i),a.colIdx)})});else{for(var h=0;h<i.length;++h)for(var g=function(e){var t=e.colIdx,a=i[h][t],n=a.cellCursor,r=n.getElement();if(!a||!n||n.isSameNode(l)||p.some(function(e){return n.isSameNode(e)}))return e.existsDataCell=e.existsDataCell||d(n)&&(n.hasNonEmptyName()||e.potentialColHeaders.length>0),"continue";var o=n.clone();"columnheader"===n.getRole()?(p.push(o),e.potentialColHeaders.push(o)):r.hasAttribute("role")||"TH"!==r.nodeName.toUpperCase()?e.existsDataCell=e.existsDataCell||d(n)&&(n.hasNonEmptyName()||e.potentialColHeaders.length>0):("col"===r.getAttribute("scope")||"axis"===r.getAttribute("scope")||!r.hasAttribute("scope")&&n.hasNonEmptyName())&&(p.push(o),e.potentialColHeaders.push(o))},b=0,_=c;b<_.length;b++)g(A=_[b]);for(var f=0,v=c;f<v.length;f++){var A;(A=v[f]).existsDataCell||(A.potentialColHeaders=[])}p=p.filter(function(e){return c.some(function(t){return t.potentialColHeaders.some(function(t){return t.isSameNode(e)})})})}return p.map(function(e){var t;return(null===(t=e.getNameInfo())||void 0===t?void 0:t.name)||""}).map(function(e){return e.trim()}).filter(function(e){return e.length>0}).join(", ")},e.getRowHeadersForCursor=function(t,i){if(!i&&!(i=r(t)))return"";var n=o(t,i);if(!n)return"";var l=n.cellCursor;if(!l)return"";var s=l.getElement();if(!s)return"";for(var c=[],m=n.rowIndexStart;m<n.rowIndexStart+n.rowspan;++m)c.push({potentialRowHeaders:[],existsDataCell:!1,rowIdx:m});var p=[];if(s.hasAttribute("headers"))p=s.getAttribute("headers").split(" ").map(function(e){return document.getElementById(e)}).filter(function(e){return!!e}).map(function(e){return new a.SRCursor(e)}).filter(function(t){return c.some(function(a){return u(e.getCellModel(t,i),a.rowIdx)})});else{for(var h=c.reduce(function(e,t){return Math.max(e,i[t.rowIdx].length)},0),g=0;g<h;++g)for(var b=function(e){var t=e.rowIdx;if(g>=i[t].length)return"continue";var a=i[t][g],n=a.cellCursor,r=n.getElement();if(!a||!n||n.isSameNode(l)||p.some(function(e){return n.isSameNode(e)}))return e.existsDataCell=e.existsDataCell||d(n)&&(n.hasNonEmptyName()||e.potentialRowHeaders.length>0),"continue";var o=n.clone();"rowheader"===n.getRole()?(p.push(o),e.potentialRowHeaders.push(o)):r.hasAttribute("role")||"TH"!==r.nodeName.toUpperCase()?e.existsDataCell=e.existsDataCell||d(n)&&(n.hasNonEmptyName()||e.potentialRowHeaders.length>0):("row"===r.getAttribute("scope")||"axis"===r.getAttribute("scope")||!r.hasAttribute("scope")&&n.hasNonEmptyName())&&(p.push(o),e.potentialRowHeaders.push(o))},_=0,f=c;_<f.length;_++)b(w=f[_]);for(var v=0,A=c;v<A.length;v++){var w;(w=A[v]).existsDataCell||(w.potentialRowHeaders=[])}p=p.filter(function(e){return c.some(function(t){return t.potentialRowHeaders.some(function(t){return t.isSameNode(e)})})})}return p.map(function(e){var t;return(null===(t=e.getNameInfo())||void 0===t?void 0:t.name)||""}).map(function(e){return e.trim()}).filter(function(e){return e.length>0}).join(", ")},e.isDataCell=d}(t.SRTableUtil||(t.SRTableUtil={}))},2165(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.SRUtil=void 0;var a,n=i(7011),l=i(3946);(a=t.SRUtil||(t.SRUtil={})).isModalDialogElement=function(e){if(1!==e.nodeType)return!1;var t=e;return"dialog"===n.AriaUtil.getResolvedRole(t,!0)&&"true"===t.getAttribute("aria-modal")&&l.VisUtil.isNodeVisible(e)},a.getUniqueSelector=function e(t,i){if(void 0===i&&(i=!1),t.id)return"#".concat(CSS.escape(t.id));if(t.isSameNode(document.documentElement)||t.isSameNode(document.body))return t.tagName.toLowerCase();var a=t.tagName.toLowerCase();if(t.classList.length&&!i&&(a+=Array.from(t.classList).slice(0,3).map(function(e){return".".concat(CSS.escape(e))}).join("")),!i){if(t.hasAttribute("role")&&(a+='[role="'.concat(CSS.escape(t.getAttribute("role")||""),'"]')),t.hasAttribute("aria-label")){var n=t.getAttribute("aria-label")||"";n.length<=20&&(a+='[aria-label="'.concat(CSS.escape(n),'"]'))}"input"===t.tagName.toLowerCase()&&t.hasAttribute("type")&&(a+='[type="'.concat(CSS.escape(t.getAttribute("type")||""),'"]'))}if(t.parentElement){var l=Array.from(t.parentElement.children).filter(function(e){return e.tagName===t.tagName});if(l.length>1){var r=l.indexOf(t)+1;a+=":nth-of-type(".concat(r,")")}return"".concat(e(t.parentElement,!0)," > ").concat(a)}return a}},8107(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.SRViewer=t.SROverlay=void 0;var a=i(5233),n=function(){function e(e){this.srViewer=e,this.navigationModes=[{mode:"item",label:"Item"},{mode:"tab_focus",label:"Tabbable"},{mode:"heading",label:"Heading"},{mode:"region",label:"Region"}],this.createOverlay()}return e.prototype.createDOMElement=function(e,t,i){var a=this.srViewer.viewerDoc.createElement(e);if(t)for(var n in t)a[n]=t[n];if(i)for(var n in i)a.style[n]=i[n];return a},e.prototype.createOverlay=function(){var e=this;this.container=this.createDOMElement("div",{className:"ibma-sr-overlay"},{position:"fixed",bottom:"0",left:"0",width:"100%",backgroundColor:"rgba(0, 0, 0, 0.8)",color:"white",padding:"10px",zIndex:"10000",display:"flex",flexDirection:"column",gap:"10px"});var t=this.createDOMElement("div",{},{display:"flex",flexWrap:"wrap",gap:"10px"});this.navigationModes.forEach(function(i){var a=e.createDOMElement("div",{},{display:"flex",alignItems:"center",gap:"5px",margin:"0 10px"});a.appendChild(e.createDOMElement("span",{textContent:i.label+":"},{}));var n=e.createDOMElement("button",{textContent:"◀ Prev"},{padding:"5px 10px",backgroundColor:"#444",color:"white",border:"none",borderRadius:"3px",cursor:"pointer"});n.addEventListener("click",function(){return e.srViewer.navigatePrevious(i.mode)}),a.appendChild(n);var l=e.createDOMElement("button",{textContent:"Next ▶"},{padding:"5px 10px",backgroundColor:"#444",color:"white",border:"none",borderRadius:"3px",cursor:"pointer"});l.addEventListener("click",function(){return e.srViewer.navigateNext(i.mode)}),a.appendChild(l),t.appendChild(a)});var i=this.createDOMElement("div",{},{display:"flex",alignItems:"center",gap:"5px",margin:"0 10px"}),a=this.createDOMElement("button",{textContent:"Show all"},{padding:"5px 10px",backgroundColor:"#444",color:"white",border:"none",borderRadius:"3px",cursor:"pointer"});a.addEventListener("click",function(){return e.srViewer.showAll(!0)}),i.appendChild(a);var n=this.createDOMElement("button",{textContent:"Toggle speech"},{padding:"5px 10px",backgroundColor:"#444",color:"white",border:"none",borderRadius:"3px",cursor:"pointer"});n.addEventListener("click",function(){return e.srViewer.toggleSpeech()}),i.appendChild(n),t.appendChild(i),this.resultsDisplay=this.createDOMElement("div",{textContent:"Screen reader simulation results will appear here."},{padding:"10px",backgroundColor:"rgba(255, 255, 255, 0.1)",borderRadius:"3px",minHeight:"100px",maxHeight:"50vh",fontFamily:"monospace",overflow:"auto"}),this.container.appendChild(t),this.container.appendChild(this.resultsDisplay),this.srViewer.viewerDoc.body.appendChild(this.container)},e.prototype.displayResult=function(e,t,i){var a,n,l,r,o="";e.success,o="".concat(i.toUpperCase()," ").concat(t,": ").concat(e.renderingResult.message),null===(n=null===(a=e.renderingResult.end)||void 0===a?void 0:a.getElement())||void 0===n||n.scrollIntoView(),null===(r=null===(l=e.renderingResult.start)||void 0===l?void 0:l.getElement())||void 0===r||r.scrollIntoView(),window.scrollBy(0,-200),this.resultsDisplay.innerHTML="",this.resultsDisplay.textContent=o;var s=this.createDOMElement("button",{innerText:"Debug"},{});s.addEventListener("click",function(){var t,i;console.log(null===(t=e.renderingResult.start)||void 0===t?void 0:t.getNode(),null===(i=e.renderingResult.end)||void 0===i?void 0:i.getNode())}),this.resultsDisplay.appendChild(s)},e.prototype.displayAll=function(e){for(var t=this,i=this.createDOMElement("table",{},{}),a=this.createDOMElement("tr",{},{}),n=["region","heading","item","tab_focus"],l=0,r=["Region","Heading","Item","Tabbable"];l<r.length;l++){var o=r[l];a.appendChild(this.createDOMElement("th",{scope:"col",innerText:o},{textAlign:"left",padding:".25rem",margin:"0rem",color:"white"})),i.appendChild(a)}for(var s=function(e){var a=u.createDOMElement("tr",{},{});n.forEach(function(i){a.appendChild(t.createDOMElement("td",{innerText:e[i]},{verticalAlign:"top",border:"solid white 1px",padding:".25rem",margin:"0rem",color:"white"}))}),i.appendChild(a)},u=this,d=0,c=e;d<c.length;d++)s(c[d]);this.resultsDisplay.innerHTML="",this.resultsDisplay.appendChild(i)},e.prototype.destroy=function(){this.container&&this.container.parentNode&&this.container.parentNode.removeChild(this.container)},e}();t.SROverlay=n;var l=function(){function e(e){void 0===e&&(e=document.body),this.isStreaming=!1,this.isShowingAll=!1,this.speechEnabled=!1,this.viewerDoc=e.ownerDocument,this.controller=a.SRController.getController(this.viewerDoc),this.overlay=new n(this),this.setupKeyboardHandlers(),this.setupFocusTracking(),this.setupMutationTracking()}return e.prototype.showAll=function(e){e&&(this.isShowingAll=!0);var t=a.SRController.renderStructure(this.viewerDoc);this.overlay.displayAll(t)},e.prototype.toggleSpeech=function(){this.speechEnabled=!this.speechEnabled},e.prototype.navigateNext=function(e){this.isShowingAll=!1;var t=this.controller.jumpNext(e);this.overlay.displayResult(t,e,"next"),this.speakResult(t)},e.prototype.navigatePrevious=function(e){this.isShowingAll=!1;var t=this.controller.jumpPrevious(e);this.overlay.displayResult(t,e,"previous"),this.speakResult(t)},e.prototype.setupKeyboardHandlers=function(){var e=this;this.keyboardHandler=function(t){var i=t.target;if("INPUT"!==i.tagName&&"TEXTAREA"!==i.tagName&&"SELECT"!==i.tagName)if(t.ctrlKey)e.stopSpeech();else if(!t.altKey&&!t.metaKey)switch(t.key){case"ArrowUp":t.preventDefault(),e.navigatePrevious("item");break;case" ":e.isStreaming=!0;case"ArrowDown":t.preventDefault(),e.navigateNext("item");break;case"Enter":t.preventDefault(),e.activateCurrentElement(),e.controller.setPointOfRegard(e.viewerDoc.activeElement);break;case"H":case"h":t.shiftKey?(t.preventDefault(),e.navigatePrevious("heading")):(t.preventDefault(),e.navigateNext("heading"));break;case"R":case"r":t.shiftKey?(t.preventDefault(),e.navigatePrevious("region")):(t.preventDefault(),e.navigateNext("region"));break;case"Tab":t.shiftKey?(t.preventDefault(),e.navigatePrevious("tab_focus")):(t.preventDefault(),e.navigateNext("tab_focus"))}},this.viewerDoc.addEventListener("keydown",this.keyboardHandler)},e.prototype.speakResult=function(e){var t=this;if(this.speechEnabled){var i=new SpeechSynthesisUtterance(e.renderingResult.message);i.rate=1.5;var a=this;i.addEventListener("end",function(e){a.isStreaming&&t.navigateNext("item")}),speechSynthesis.cancel(),speechSynthesis.speak(i)}},e.prototype.stopSpeech=function(){this.isStreaming=!1,speechSynthesis.cancel()},e.prototype.setupMutationTracking=function(){var e=this,t=new MutationObserver(function(i){if(e.isShowingAll&&i.filter(function(e){return 1===e.target.nodeType&&!e.target.closest(".ibma-sr-overlay")}).length>0){t.disconnect();var a=e;a.showAll(),setTimeout(function(){a.showAll(),t.observe(e.viewerDoc.documentElement,{attributes:!0,childList:!0,subtree:!0})},1e3)}});t.observe(this.viewerDoc.documentElement,{attributes:!0,childList:!0,subtree:!0})},e.prototype.setupFocusTracking=function(){var e=this;this.focusHandler=function(t){if(t.target instanceof HTMLElement){var i=t.target;if(e.overlay&&i.closest(".ibma-sr-overlay"))return;console.group("focusHandler");var a=e.controller.setPointOfRegard(i);a.success&&(e.overlay.displayResult(a,"focus","focus"),e.speakResult(a)),console.groupEnd()}},this.viewerDoc.addEventListener("focusin",this.focusHandler)},e.prototype.activateCurrentElement=function(){var e=this.controller.getPointOfRegard().getElement();if(e){var t={success:!0,renderingResult:{message:"Activating: ".concat(e.textContent||e.nodeName),start:this.controller.getPointOfRegard(),end:this.controller.getPointOfRegard()}};this.overlay.displayResult(t,"focus","focus"),this.speakResult(t),e.focus&&e.focus(),e.click()}},e.prototype.getController=function(){return this.controller},e.prototype.destroy=function(){this.viewerDoc.removeEventListener("keydown",this.keyboardHandler),this.viewerDoc.removeEventListener("focusin",this.focusHandler),this.stopSpeech(),this.overlay.destroy()},e}();t.SRViewer=l},7242(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.RULES=t.getLinkAnnouncement=t.getRoleDescription=t.quoteName=t.quoteNamePadBefore=t.quoteNamePadAfter=void 0;var a=i(8195),n=i(328),l=i(7011),r=i(9910),o=i(3864),s=i(3946);function u(e,t,i,a){return e.getName()?"".concat(c(e)).concat(t||", "):""}function d(e,t){return e.getName()?"".concat(t||", ").concat(c(e)):""}function c(e,t,i){return e.getName()?"".concat(t||'"').concat(e.getName()).concat(i||'"'):""}function m(e,t){var i=e.getElement();if(!i)return t;var a=i.getAttribute("aria-roledescription");return a&&a.trim().length>0?a.trim():t}function p(e,t){var i,a=e.getNode().href||"";i=a.startsWith(document.location.href)&&"#"===a.charAt(document.location.href.length)?"same page link":"link";var n=e.getNameInfo();return n&&!["content","text"].includes(n.nameFrom)?"tab_focus"===t?"[".concat(u(e)).concat(i,"]"):"[".concat(i).concat(d(e),"]"):"[".concat(i,"]")}function h(e,t){var i=e.getAttribute("aria-describedby");if(!i)return"";var a=i.split(/\s+/).map(function(e){return document.getElementById(e)}).filter(function(e){return!!e}).map(function(e){var t;return null===(t=e.textContent)||void 0===t?void 0:t.trim()}).filter(function(e){return!!e}).join(" ");return a&&0!==a.length?"item"===t?", ".concat(a,""):', "'.concat(a,'"'):""}function g(e){var t="";return(e.hasAttribute("disabled")||"true"===e.getAttribute("aria-disabled"))&&(t+=", disabled"),(e.hasAttribute("readonly")||"true"===e.getAttribute("aria-readonly"))&&(t+=", read only"),(e.hasAttribute("required")||"true"===e.getAttribute("aria-required"))&&(t+=", required"),"true"===e.getAttribute("aria-invalid")&&(t+=", invalid"),t}function b(e){var t=e.getElement();if(!t)return!1;for(var i=new o.DOMWalker(t,!1,t,!1);i.nextNode();)if(1===i.node.nodeType&&!i.bEndTag){var a=l.AriaUtil.getResolvedRole(i.node);if(a&&r.ARIADefinitions.designPatterns[a]&&"widget"===r.ARIADefinitions.designPatterns[a].roleType)return!0}return!1}t.quoteNamePadAfter=u,t.quoteNamePadBefore=d,t.quoteName=c,t.getRoleDescription=m,t.getLinkAnnouncement=p,t.RULES=[new n.SRRendererRule({roles:["button"],elems:[],modes:["item","button","tab_focus"],tests:[function(e,t,i){if(!e.isStartTag())return null;var a=e.getNode(),n=m(e,"button");return"true"===a.getAttribute("aria-pressed")?"[toggle ".concat(n,", pressed").concat(d(e)).concat(h(a,i),"]"):null},function(e,t,i){if(!e.isStartTag())return null;var a=e.getNode(),n=m(e,"button");return"false"===a.getAttribute("aria-pressed")?"[toggle ".concat(n,", not pressed").concat(d(e)).concat(h(a,i),"]"):null},function(e,t,i){if(!e.isEndTag()){var a="",n=e.getElement(),l=m(e,"button");return["menu","true"].includes(n.getAttribute("aria-haspopup"))&&(a+=", menu"),n.hasAttribute("aria-expanded")&&(a+=", ".concat("true"===n.getAttribute("aria-expanded")?"expanded":"collapsed")),a+=g(n),"[".concat(u(e)).concat(l).concat(a).concat(h(n,i),"]")}},function(e){if(e.isEndTag())return""}]}),new n.SRRendererRule({roles:["checkbox"],elems:[],modes:["item","checkbox","tab_focus"],tests:[function(e,t,i){if(e.isStartTag()){var a=e.getNode(),n=m(e,"checkbox"),l="";return l="mixed"===a.getAttribute("aria-checked")?"half checked":(a.hasAttribute("aria-checked")?"true"===a.getAttribute("aria-checked"):a.checked)?"checked":"not checked",l+=g(e.getElement()),"[".concat(n,", ").concat(l).concat(d(e)).concat(h(e.getElement(),i),"]")}return""}]}),new n.SRRendererRule({roles:["cell","columnheader","rowheader"],elems:[],modes:["item","table"],tests:[function(e){var t;if(!e.isStartTag())return null;var i=e.getElement();if(!i)return null;var a=(null===(t=i.textContent)||void 0===t?void 0:t.trim())||"",n=new o.DOMWalker(i,!1,i,!1),s=a.length>0;if(!s)for(;n.nextNode();)if(1===n.node.nodeType&&!n.bEndTag){var u=n.node,d=l.AriaUtil.getResolvedRole(u);if(d&&r.ARIADefinitions.designPatterns[d]){s=!0;break}if("IMG"===u.nodeName.toUpperCase()&&u.hasAttribute("alt")){s=!0;break}}return s?null:"[blank]"}]}),new n.SRRendererRule({roles:["combobox"],elems:[],modes:["item","combo","tab_focus"],tests:[function(e){if(e.isEndTag())return"";var t=m(e,"combo box"),i=e.getElement(),n="";if("SELECT"===e.getNode().nodeName.toUpperCase()){n=", collapsed";var l=e.getElement(),r=l.selectedIndex>=0?l.options[l.selectedIndex]:null,o="";return r&&(o=d(new a.SRCursor(r,!1),", ")),n+=g(i),"[".concat(u(e)).concat(t).concat(n).concat(o,"]")}return"INPUT"!==e.getNode().nodeName.toUpperCase()||e.getElement().hasAttribute("role")?(i.hasAttribute("aria-expanded")&&(n=", ".concat("true"===i.getAttribute("aria-expanded")?"expanded":"collapsed"),i.hasAttribute("aria-autocomplete")&&(n+=", has auto complete"),n+=", editable, opens list"),n+=g(i),"[".concat(u(e)).concat(t).concat(n,"]")):(n=g(i),"[".concat(u(e)).concat(t,", has auto complete, editable, opens list").concat(n,"]"))}]}),new n.SRRendererRule({roles:["default"],elems:[],modes:["item"],tests:[function(e){var t;return e.isStartTag()?"!!<".concat(e.getRole(),">").concat((null===(t=e.getNameInfo())||void 0===t?void 0:t.name)+"","!!"):"!!</".concat(e.getRole(),">!!")}]}),new n.SRRendererRule({roles:["deletion"],elems:[],modes:["item"],tests:[function(e){return e.isStartTag()?"[deleted]":""}]}),new n.SRRendererRule({roles:["dialog"],elems:[],modes:["item"],tests:[function(e){return e.isEndTag()?"[End of dialog]":"[Start of dialog".concat(d(e))}]}),new n.SRRendererRule({roles:["document","generic"],elems:[],modes:["item"],tests:[function(){return""}]}),new n.SRRendererRule({roles:["graphics-document"],elems:[],modes:["item","image"],tests:[function(e){var t,i;return e.isStartTag()&&!(null===(t=e.getNameInfo())||void 0===t?void 0:t.name)&&""!==(null===(i=e.getNameInfo())||void 0===i?void 0:i.name)?e.getCurrentOrParentByRoleClone(["heading","link"])&&s.VisUtil.isNodeHiddenFromAT(e.getElement())?"":"[Unlabeled graphic]":null},function(e){var t;return e.isStartTag()&&""===(null===(t=e.getNameInfo())||void 0===t?void 0:t.name)?"":null},function(e){var t;return e.isStartTag()&&(null===(t=e.getNameInfo())||void 0===t?void 0:t.name)&&"[graphic".concat(d(e),"]")||null},function(e){return e.isEndTag()?"":null}]}),new n.SRRendererRule({roles:["heading"],elems:[],modes:["item","tab_focus"],tests:[function(e,t,i){if("tab_focus"===i&&e.isStartTag())return"";if("item"===i&&e.isEndTag())return"";var a,n=e.getElement();a=n.ariaLevel?n.ariaLevel:"heading"===n.getAttribute("role")?"2":n.nodeName.substring(1);var l=e.getNameInfo();return l&&!["content","text"].includes(l.nameFrom)||(n.textContent||"").trim()?l&&!["content","text"].includes(l.nameFrom)?"[heading level ".concat(a).concat(d(e),"]"):"[heading level ".concat(a,"]"):""}]}),new n.SRRendererRule({roles:["heading"],elems:[],modes:["heading","h1","h2","h3","h4","h5","h6"],tests:[function(e){if(e.isStartTag()){var t,i=e.getNode();t=i.ariaLevel?i.ariaLevel:"heading"===i.getAttribute("role")?"2":i.nodeName.substring(1);var a=e.getNameInfo();return a&&!["content","text"].includes(a.nameFrom)||(i.textContent||"").trim()?"[".concat(u(e),"heading level ").concat(t,"]"):""}return""}]}),new n.SRRendererRule({roles:["img"],elems:[],modes:["item","image"],tests:[function(e){var t,i,a;return e.isEndTag()?"":(null===(t=e.getNameInfo())||void 0===t?void 0:t.name)||""===(null===(i=e.getNameInfo())||void 0===i?void 0:i.name)?""===(null===(a=e.getNameInfo())||void 0===a?void 0:a.name)?"":"[graphic".concat(d(e),"]"):e.getCurrentOrParentByRoleClone(["heading","link"])&&s.VisUtil.isNodeHiddenFromAT(e.getElement())?"":"[Unlabeled graphic]"}]}),new n.SRRendererRule({roles:["insertion"],elems:[],modes:["item"],tests:[function(e){return e.isStartTag()?"[inserted]":""}]}),new n.SRRendererRule({roles:["link"],elems:[],modes:["item","region","link","tab_focus"],tests:[function(e,t,i){var a;return e.isStartTag()&&!["content","text"].includes(null===(a=e.getNameInfo())||void 0===a?void 0:a.nameFrom)?p(e,i):null}]}),new n.SRRendererRule({roles:["listitem"],elems:[],modes:["item"],tests:[function(e){for(var t,i,a,n=o.DOMWalker.parentNode(e.getNode());void 0===i&&n;)1===n.nodeType&&((p=n).hasAttribute("role")?"list"===p.getAttribute("role")&&(i=!1,a=p):"UL"===p.nodeName.toUpperCase()?(i=!1,a=p):"OL"===p.nodeName.toUpperCase()&&(i=!0,a=p)),n=o.DOMWalker.parentNode(n);var l=b(e)?"":(null===(t=e.getNameInfo())||void 0===t?void 0:t.name)||"",r="";if(i){var s=1;if(a&&"OL"===a.nodeName.toUpperCase()&&a.hasAttribute("start")){var u=parseInt(a.getAttribute("start")||"1",10);s=isNaN(u)?1:u}for(var d=e.getElement(),c=o.DOMWalker.previousSiblingNotOwnedBySlot(d);c;){if(1===c.nodeType){var m=c;"listitem"!==m.getAttribute("role")&&"LI"!==m.nodeName.toUpperCase()||s++}c=o.DOMWalker.previousSiblingNotOwnedBySlot(c)}r=e.isStartTag()?"".concat(s,". ").concat(l):""}else{var p;r="LI"===(p=e.getElement()).nodeName.toUpperCase()&&"none"===window.getComputedStyle(p).listStyleType||"LI"!==p.nodeName.toUpperCase()?e.isStartTag()?"".concat(l):"":e.isStartTag()?"[bullet] ".concat(l):""}return r}]}),new n.SRRendererRule({roles:["math"],elems:[],modes:["item"],tests:[function(e){return e.isEndTag()?"[math content]":""}]}),new n.SRRendererRule({roles:["menuitem"],elems:[],modes:["item","tab_focus","region"],tests:[function(e){var t="";if(e.isStartTag()){var i="",a=e.getElement();"true"===a.getAttribute("aria-haspopup")&&(i+=", sub-menu"),a.hasAttribute("aria-expanded")&&(i+=", ".concat("true"===a.getAttribute("aria-expanded")?"expanded":"collapsed")),t="[menu".concat(i);var n=e.getNameInfo();n&&!["content","text"].includes(n.nameFrom)&&(t+=d(e)),t+="]"}return t}]}),new n.SRRendererRule({roles:["meter"],elems:[],modes:["item","tab_focus"],tests:[function(e){return e.isStartTag()?"[progress bar, ".concat(e.getNode().value,"]"):""}]}),new n.SRRendererRule({roles:["progressbar"],elems:[],modes:["item"],tests:[function(e){return e.isStartTag()?"[progress bar, ".concat(e.getNode().value,"]"):""}]}),new n.SRRendererRule({roles:["radio"],elems:[],modes:["item","tab_focus"],tests:[function(e,t,i){if(e.isStartTag()){var a,n=m(e,"radio button");a=e.getElement().hasAttribute("aria-checked")?"true"===e.getElement().getAttribute("aria-checked"):e.getNode().checked;var l=g(e.getElement());return"[".concat(n,", ").concat(a?"checked":"not checked").concat(l).concat(d(e)).concat(h(e.getElement(),i),"]")}return""}]}),new n.SRRendererRule({roles:["searchbox"],elems:[],modes:["item","tab_focus"],tests:[function(e){return e.isStartTag()?"[".concat(u(e),"edit]"):""}]}),new n.SRRendererRule({roles:["separator"],elems:[],modes:["item"],tests:[function(e){return e.isStartTag()?"[separator]":""}]}),new n.SRRendererRule({roles:["slider"],elems:[],modes:["item","tab_focus"],tests:[function(e,t,i){if(!e.isStartTag())return"";var a=m(e,"slider"),n=e.getElement(),l=n.hasAttribute("aria-valuenow")?n.getAttribute("aria-valuenow"):e.getNode().value;return"[".concat(u(e)).concat(a,", ").concat(l).concat(h(e.getElement(),i),"]")}]}),new n.SRRendererRule({roles:["spinbutton"],elems:[],modes:["item","tab_focus"],tests:[function(e,t,i){if(!e.isStartTag())return"";var a=m(e,"spinbutton");return"[".concat(u(e)).concat(a,", editable").concat(h(e.getElement(),i),"]")}]}),new n.SRRendererRule({roles:["tab"],elems:[],modes:["item","tab_focus"],tests:[function(e){if(!e.isStartTag())return"";var t=m(e,"tab");return"[".concat(t).concat("true"===e.getNode().getAttribute("aria-selected")?", selected":"").concat(d(e),"]")}]}),new n.SRRendererRule({roles:["tablist"],elems:[],modes:["item"],tests:[function(e){return null===e.getNameInfo()?null:e.isStartTag()?"[group start".concat(d(e),"]"):"[group end".concat(d(e),"]")}]}),new n.SRRendererRule({roles:["tabpanel"],elems:[],modes:["item"],tests:[function(e){return null===e.getNameInfo()?null:e.isStartTag()?"[Tab panel start".concat(d(e),"]"):"[Tab panel end".concat(d(e),"]")}]}),new n.SRRendererRule({roles:["text"],elems:[],modes:["item","link","tab_focus","region"],tests:[function(e){var t,i,a,n;if(e.isEndTag()||!(null===(t=e.getParentElement())||void 0===t?void 0:t.getElement()))return null;var l=null===(i=e.getParentElement())||void 0===i?void 0:i.getElement();return"line-through"===l.ownerDocument.defaultView.getComputedStyle(l).textDecorationLine?"[strikethrough] ".concat((null===(a=e.getNameInfo())||void 0===a?void 0:a.name)+""," [end strikethrough]"):"".concat((null===(n=e.getNameInfo())||void 0===n?void 0:n.name)+"")}]}),new n.SRRendererRule({roles:["text"],elems:[],modes:["heading"],tests:[function(e){return""}]}),new n.SRRendererRule({roles:["textbox"],elems:[],modes:["item","tab_focus"],tests:[function(e,t,i){var a,n=e.getElement();if(e.isEndTag())return"item"===i&&"TEXTAREA"===n.nodeName.toUpperCase()?"[out of edit]":"";if(!e.isStartTag())return"";var l="";n.hasAttribute("placeholder")&&n.getAttribute("placeholder").trim().length>0&&(l+=", placeholder: ".concat(n.getAttribute("placeholder"))),l+=g(n);var r="TEXTAREA"===n.nodeName.toUpperCase()||"true"===n.getAttribute("aria-multiline"),o=h(n,i);if(r){var s="tab_focus"===i?null===(a=n.textContent)||void 0===a?void 0:a.trim():"",d=s?" ".concat(s):"";return"[".concat(u(e),"edit, multiline").concat(l).concat(o,"]").concat(d)}return"[".concat(u(e),"edit").concat(l).concat(o,"]")}]}),new n.SRRendererRule({roles:["treeitem"],elems:[],modes:["item","tab_focus"],tests:[function(e){if(e.isEndTag())return"";var t=e.getElement(),i="[treeview item";"true"===t.getAttribute("aria-selected")&&(i+=", selected"),t.hasAttribute("aria-expanded")&&(i+="true"===t.getAttribute("aria-expanded")?", expanded":", collapsed");var a=t.getAttribute("aria-level");if(a)i+=", level ".concat(a);else{for(var n=1,r=o.DOMWalker.parentElement(t);r;){var s=l.AriaUtil.getResolvedRole(r);if("group"===s||"tree"===s)for(var u=o.DOMWalker.parentElement(r);u;){var d=l.AriaUtil.getResolvedRole(u);if("treeitem"===d){n++;break}if("tree"===d)break;u=o.DOMWalker.parentElement(u)}r=o.DOMWalker.parentElement(r)}n>1&&(i+=", level ".concat(n))}var c=t.getAttribute("aria-posinset"),m=t.getAttribute("aria-setsize");if(!c||!m){var p=0,h=0,g=o.DOMWalker.parentElement(t);if(g)for(var b=o.DOMWalker.firstChildNotOwnedBySlot(g);b;){if(1===b.nodeType){var _=b;"treeitem"===l.AriaUtil.getResolvedRole(_)&&(h++,_===t&&(p=h))}b=b.nextSibling}c=p.toString(),m=h.toString()}return i+", ".concat(c," of ").concat(m,"] ")}]}),new n.SRRendererRule({roles:[],elems:["BODY"],modes:["item","tab_focus"],tests:[function(e){var t=e.getNode().ownerDocument.title;return e.isEndTag()?"[End of document".concat(t.trim().length>0?": "+t.trim():"","]"):"[Start of document".concat(t.trim().length>0?": "+t.trim():"","]")}]}),new n.SRRendererRule({roles:[],elems:["IFRAME"],modes:["item","tab_focus"],tests:[function(e){var t=function(e){try{return null!==(e.contentDocument||e.contentWindow.document)}catch(e){return!1}}(e.getNode())?"":"{Emulator unable to access frame}";return e.isEndTag()?"":t}]}),new n.SRRendererRule({roles:[],elems:["BR"],modes:["item"],tests:[function(e){try{for(var t=e.clone();t.previous(function(){return!0})&&"BR"!==t.getNode().nodeName.toUpperCase()&&t.getNameInfo()&&0===t.getNameInfo().name.trim().length;);return"BR"===t.getNode().nodeName.toUpperCase()?"[blank]":null}catch(e){console.error(e)}}]}),new n.SRRendererRule({roles:[],elems:["DL"],modes:["item"],tests:[function(e){return""}]}),new n.SRRendererRule({roles:[],elems:["INPUT"],modes:["item","tab_focus"],tests:[function(e,t,i){var a;return e.isStartTag()&&"password"===(null===(a=e.getElement())||void 0===a?void 0:a.getAttribute("type"))&&"[".concat(u(e),"edit, protected").concat(h(e.getElement(),i),"]")||null},function(e,t,i){var a,n;if(e.isStartTag()&&"file"===(null===(a=e.getElement())||void 0===a?void 0:a.getAttribute("type"))){var l=(null===(n=e.getElement())||void 0===n?void 0:n.value)||"";return l=""===l?"No file chosen":l.substring(12),"[".concat(u(e),"button").concat(h(e.getElement(),i),"] [").concat(u(e)).concat(l,"]")}return null},function(e,t,i){var a;if(e.isStartTag()&&"color"===(null===(a=e.getElement())||void 0===a?void 0:a.getAttribute("type"))){var n=e.getElement().value,l=(100*Number("0x".concat(n.substring(1,3)))/Number("0xff")).toFixed(0),r=(100*Number("0x".concat(n.substring(3,5)))/Number("0xff")).toFixed(0),o=(100*Number("0x".concat(n.substring(5)))/Number("0xff")).toFixed(0);return"[".concat(u(e),"clickable").concat(h(e.getElement(),i),"] [").concat(l,"% red ").concat(r,"% green ").concat(o,"% blue]")}return null},function(e,t,i){var a;if(e.isStartTag()&&"month"===(null===(a=e.getElement())||void 0===a?void 0:a.getAttribute("type"))){var n=e.getElement().value,l="0",r="0";if(n.trim().length>0){var o=new Date(n);l=""+o.getFullYear(),r=""+(o.getMonth()+1)}return"[".concat(u(e),"clickable").concat(h(e.getElement(),i),"] [spin button, ").concat(r,"] [spin button, ").concat(l,"] [menu button] [subMenu] Show month picker")}return null},function(e,t,i){var a;if(e.isStartTag()&&"date"===(null===(a=e.getElement())||void 0===a?void 0:a.getAttribute("type"))){var n=e.getElement().value,l="0",r="0",o="0";if(n.trim().length>0){var s=new Date(n);l=""+s.getFullYear(),r=""+(s.getMonth()+1),o=""+s.getDate()}return"[".concat(u(e),"clickable").concat(h(e.getElement(),i),"] [spin button, ").concat(r,"] / [spin button, ").concat(o,"] / [spin button, ").concat(l,"] [menu button] [subMenu] Show date picker")}return null},function(e,t,i){var a;if(e.isStartTag()&&"datetime-local"===(null===(a=e.getElement())||void 0===a?void 0:a.getAttribute("type"))){var n=e.getElement().value,l="0",r="0",o="0",s="0",d="0",c="0";if(n.trim().length>0){var m=new Date(n);l=""+m.getFullYear(),r=""+(m.getMonth()+1),o=""+m.getDate(),s=0===m.getHours()||12===m.getHours()?"12":m.getHours()<12?""+m.getHours():""+(m.getHours()-12),d=""+m.getMinutes(),c=m.getHours()>=12?"pm":"am"}return"[".concat(u(e),"clickable").concat(h(e.getElement(),i),"] [spin button, ").concat(r,"] / [spin button, ").concat(o,"] / [spin button, ").concat(l,"] [spin button, ").concat(s,"] : [spin button, ").concat(d,"] [spin button, ").concat(c,"] [menu button] [subMenu] Show local date and time picker")}return null},function(e,t,i){var a;if(e.isStartTag()&&"time"===(null===(a=e.getElement())||void 0===a?void 0:a.getAttribute("type"))){var n=e.getElement().value,l="0",r="0",o="0";if(n.trim().length>0){var s=n.split(":"),d=parseInt(s[0]);l=0===d||12===d?"12":d<12?""+d:""+(d-12),r=s[1],o=d>=12?"pm":"am"}return"[".concat(u(e),"grouping clickable").concat(h(e.getElement(),i)," [spin button, ").concat(l,"] : [spin button, ").concat(r,"] [spin button, ").concat(o,"] [menu button] [subMenu] Show time picker [out of grouping]")}return null},function(e,t,i){var a;if(e.isStartTag()&&"week"===(null===(a=e.getElement())||void 0===a?void 0:a.getAttribute("type"))){var n=e.getElement().value,l="0",r="0";if(n.trim().length>0){var o=n.split(/-W/);l=o[0],r=o[1]}return"[".concat(u(e),"clickable").concat(h(e.getElement(),i),"] [spin button, ").concat(r,"], [spin button, ").concat(l,"] [menu button] [subMenu] Show week picker")}return null},function(e){var t;return"hidden"===(null===(t=e.getElement())||void 0===t?void 0:t.getAttribute("type"))?"":null},function(e){return e.isStartTag()&&"!![".concat(u(e),"input!!]").concat(e.getElement().outerHTML)||null}]}),new n.SRRendererRule({roles:[],elems:["LI"],modes:["item"],tests:[function(e){var t,i=b(e)?"":(null===(t=e.getNameInfo())||void 0===t?void 0:t.name)||"",a=e.getElement();return"none"===window.getComputedStyle(a).listStyleType?e.isStartTag()?"".concat(i):"":e.isStartTag()?"[bullet] ".concat(i):""}]}),new n.SRRendererRule({roles:[],elems:["MFRAC"],modes:["item"],tests:[function(e){return e.isStartTag()?"[fraction]":"[end fraction]"}]}),new n.SRRendererRule({roles:[],elems:["MROW"],modes:["item"],tests:[function(e){var t;if(!e.isStartTag()){var i=e.getCurrentOrParentByRoleClone([],["mfrac"]);return i&&(null===(t=i.getElement().querySelectorAll("mrow")[0])||void 0===t?void 0:t.isSameNode(e.getNode()))?"[over]":void 0}}]}),new n.SRRendererRule({roles:[],elems:["MSQRT"],modes:["item"],tests:[function(e){return e.isStartTag()?"[square root]":"[end root]"}]}),new n.SRRendererRule({roles:[],elems:["MSUP"],modes:["item"],tests:[function(e){var t,i;if(!e.isEndTag()){var a=(null===(t=e.getElement().querySelector("mi"))||void 0===t?void 0:t.innerHTML)||"",n=(null===(i=e.getElement().querySelector("mn"))||void 0===i?void 0:i.innerHTML)||"";return"2"===n?"".concat(a," [squared]"):"3"===n?"".concat(a," [cubed]"):"".concat(a," [to the ").concat(n,"]")}}]}),new n.SRRendererRule({roles:["article","banner","blockquote","caption","cell","code","columnheader","complementary","contentinfo","figure","form","group","list","main","mark","navigation","region","row","rowheader","search","table","toolbar"],elems:[],modes:["item"],tests:[function(e){return""}]}),new n.SRRendererRule({roles:["paragraph","rowgroup","status","strong","subscript","superscript","term","time","none","presentation"],elems:[],modes:["item"],tests:[function(e){return""}]})]},8485(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.RULES=void 0;var a=i(328),n=i(369),l=i(7242),r=i(7011),o=i(9910),s=i(7139);function u(e,t){var i;t&&"#text"===(null===(i=t.getNode())||void 0===i?void 0:i.nodeName)&&(t=t.clone()).previous(function(){return!0});var a=n.SRTableUtil.getTableModel(e),l=n.SRTableUtil.getCellModel(t,a),r=n.SRTableUtil.getCellModel(e,a);if(!r)return"";var o=[];if(!l||l.rowIndexStart!==r.rowIndexStart||l.rowspan!==r.rowspan){var s=n.SRTableUtil.getRowHeadersForCursor(e,a),u=s&&s.trim().length>0?'"'.concat(s,'", '):"";o.push("[".concat(u,"row ").concat(r.rowIndexStart+1).concat(r.rowspan>1?" through "+(r.rowIndexStart+r.rowspan):"","]"))}if(!l||l.colIndexStart!==r.colIndexStart||l.colspan!==r.colspan){var d=n.SRTableUtil.getColumnHeadersForCursor(e,a);u=d&&d.trim().length>0?'"'.concat(d,'", '):"",o.push("[".concat(u,"column ").concat(r.colIndexStart+1).concat(r.colspan>1?" through "+(r.colIndexStart+r.colspan):"","]"))}return o.join(" ")}t.RULES=[new a.SRRendererRule({roles:["article"],elems:[],modes:["item","article","tab_focus"],tests:[function(e,t,i){if("tab_focus"===i&&!s.CommonUtil.isTabbable(e.getNode()))return null;var a=(0,l.getRoleDescription)(e,"article");return"[".concat((0,l.quoteNamePadAfter)(e)).concat(a,"]")}]}),new a.SRRendererRule({roles:["banner"],elems:[],modes:["item","region","tab_focus"],tests:[function(e,t,i){if("tab_focus"===i&&!s.CommonUtil.isTabbable(e.getNode()))return null;var a=(0,l.getRoleDescription)(e,"banner region");return"[".concat((0,l.quoteNamePadAfter)(e)).concat(a,"]")}]}),new a.SRRendererRule({roles:["blockquote"],elems:[],modes:["item","region"],tests:[function(e){return"[blockquote]"}]}),new a.SRRendererRule({roles:["caption"],elems:[],modes:["item","region"],tests:[function(e){return"[caption]"}]}),new a.SRRendererRule({roles:["cell"],elems:[],modes:["item","table"],tests:[u]}),new a.SRRendererRule({roles:["columnheader"],elems:[],modes:["item","table"],tests:[u]}),new a.SRRendererRule({roles:["complementary"],elems:[],modes:["item","region","tab_focus"],tests:[function(e,t,i){return"tab_focus"!==i||s.CommonUtil.isTabbable(e.getNode())?"[".concat((0,l.quoteNamePadAfter)(e),"complementary region]"):null}]}),new a.SRRendererRule({roles:["contentinfo"],elems:[],modes:["item","region","tab_focus"],tests:[function(e,t,i){return"tab_focus"!==i||s.CommonUtil.isTabbable(e.getNode())?"[".concat((0,l.quoteNamePadAfter)(e),"content info region]"):null}]}),new a.SRRendererRule({roles:["figure"],elems:[],modes:["item","region"],tests:[function(e){return"[figure]"}]}),new a.SRRendererRule({roles:["form"],elems:[],modes:["item","region","formcontrol"],tests:[function(e){return null===e.getNameInfo()?"[section]":"[".concat((0,l.quoteNamePadAfter)(e),"form region]")}]}),new a.SRRendererRule({roles:["group"],elems:[],modes:["item","region"],tests:[function(e){var t;return null===e.getNameInfo()?null:"SELECT"===(null===(t=e.getCurrentOrParentByRoleClone(["combobox"],["select"]))||void 0===t?void 0:t.getNode().nodeName.toUpperCase())?"":"DETAILS"===e.getNode().nodeName.toUpperCase()?"[button, ".concat(e.getElement().hasAttribute("open")?"expanded":"collapsed","]"):"[grouping".concat((0,l.quoteNamePadBefore)(e),"]")}]}),new a.SRRendererRule({roles:["group"],elems:[],modes:["tab_focus"],tests:[function(e){var t;return null===e.getNameInfo()?null:"SELECT"===(null===(t=e.getCurrentOrParentByRoleClone(["combobox"],["select"]))||void 0===t?void 0:t.getNode().nodeName.toUpperCase())?"":"DETAILS"===e.getNode().nodeName.toUpperCase()?"[button, ".concat(e.getElement().hasAttribute("open")?"expanded":"collapsed","]"):""}]}),new a.SRRendererRule({roles:["list"],elems:[],modes:["item","list"],tests:[function(e){for(var t,i=e.getNode(),a=document.evaluate(".//li | .//*[@role='listitem']",i,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null),n=0,s=0;s<a.snapshotLength;s++){for(var u=!1,d=!1,c=a.snapshotItem(s).parentElement;c&&c!==i;){var m=r.AriaUtil.getResolvedRole(c);if("list"===m||"UL"===c.nodeName.toUpperCase()||"OL"===c.nodeName.toUpperCase()){u=!0;break}if(m&&(null===(t=o.ARIADefinitions.designPatterns[m])||void 0===t?void 0:t.presentationalChildren)){d=!0;break}c=c.parentElement}u||d||n++}return 0===n?null:"[".concat((0,l.quoteNamePadAfter)(e),"list of ").concat(n," items]")}]}),new a.SRRendererRule({roles:["main"],elems:[],modes:["item","region","tab_focus"],tests:[function(e,t,i){return"tab_focus"!==i||s.CommonUtil.isTabbable(e.getNode())?"[".concat((0,l.quoteNamePadAfter)(e),"main region]"):null}]}),new a.SRRendererRule({roles:["menubar"],elems:[],modes:["item","list"],tests:[function(e){var t=e.getNode(),i=document.evaluate(".//*[@role='menuitem']",t,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null),a=document.evaluate(".//*[@role='menubar']//*[@role='menuitem']|.//*[@role='menu']//*[@role='menuitem']",t,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null);console.log("MENUBAR",e.isEndTag()?"/":"",e.getNode()),console.log(i,a);var n=i.snapshotLength-a.snapshotLength;return 0===n?null:"[".concat((0,l.quoteNamePadAfter)(e),"menubar with ").concat(n," items]")}]}),new a.SRRendererRule({roles:["navigation"],elems:[],modes:["item","region","tab_focus"],tests:[function(e,t,i){if("tab_focus"===i&&!s.CommonUtil.isTabbable(e.getNode()))return null;var a=(0,l.getRoleDescription)(e,"navigation region");return"[".concat((0,l.quoteNamePadAfter)(e)).concat(a,"]")}]}),new a.SRRendererRule({roles:["radiogroup"],elems:[],modes:["item","region","tab_focus"],tests:[function(e){return null===e.getNameInfo()?null:"[grouping".concat((0,l.quoteNamePadBefore)(e),"]")}]}),new a.SRRendererRule({roles:["region"],elems:[],modes:["item","region","tab_focus"],tests:[function(e,t,i){if(null===e.getNameInfo())return null;if("tab_focus"===i&&!s.CommonUtil.isTabbable(e.getNode()))return null;var a=(0,l.getRoleDescription)(e,"region");return"[".concat((0,l.quoteNamePadAfter)(e)).concat(a,"]")}]}),new a.SRRendererRule({roles:["row"],elems:[],modes:["item","table"],tests:[function(){return""}]}),new a.SRRendererRule({roles:["rowheader"],elems:[],modes:["item","table"],tests:[u]}),new a.SRRendererRule({roles:["search"],elems:[],modes:["item","region","tab_focus"],tests:[function(e,t,i){if("tab_focus"===i&&!s.CommonUtil.isTabbable(e.getNode()))return null;var a=(0,l.getRoleDescription)(e,"search region");return"[".concat((0,l.quoteNamePadAfter)(e)).concat(a,"]")}]}),new a.SRRendererRule({roles:["table"],elems:[],modes:["item","table"],tests:[function(e){for(var t=e.clone();"table"!==t.getRole()&&t.previous(function(){return!0}););var i=t.getNode(),a=0,n=0;if(t.getNode().firstChild)for(var r=!1;t.next(function(){return!0})&&!t.getNode().isSameNode(i);){var o=t.getRole();if(t.isStartTag()){if("row"===o)++a;else if(!r&&["cell","rowheader","columnheader"].includes(o)){var s=t.getNode();n+=parseInt(s.getAttribute("colspan")||"1")}}else"row"===o&&(r=!0)}return"[table with ".concat(a," ").concat(1===a?"row":"rows"," and ").concat(n," ").concat(1===n?"column":"columns").concat((0,l.quoteNamePadBefore)(e),"]")}]}),new a.SRRendererRule({roles:["toolbar"],elems:[],modes:["item","region","tab_focus"],tests:[function(e,t,i){return"tab_focus"!==i||s.CommonUtil.isTabbable(e.getNode())?"[".concat((0,l.quoteNamePadAfter)(e),"toolbar]"):null}]}),new a.SRRendererRule({roles:[],elems:["DL"],modes:["item","list"],tests:[function(e){var t=e.getNode(),i=document.evaluate(".//dt",t,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null).snapshotLength;return"[".concat((0,l.quoteNamePadAfter)(e),"definition list of ").concat(i," terms]")}]}),new a.SRRendererRule({roles:[],elems:["FIGCAPTION"],modes:["item"],tests:[function(e){return"[caption]"}]}),new a.SRRendererRule({roles:[],elems:["MARK"],modes:["item"],tests:[function(e){return"[highlighted]"}]}),new a.SRRendererRule({roles:["article","banner","blockquote","caption","cell","columnheader","complementary","contentinfo","figure","form","group","region","row","rowheader","search","toolbar","list","main","navigation","table"],elems:[],modes:["heading"],tests:[function(){return""}]})]},2099(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.RULES=void 0;var a=i(328),n=i(7242);t.RULES=[new a.SRRendererRule({roles:["article"],elems:[],modes:["item"],tests:[function(e){var t=(0,n.getRoleDescription)(e,"article");return"[out of ".concat(t,"]")}]}),new a.SRRendererRule({roles:["banner"],elems:[],modes:["item"],tests:[function(e){var t=(0,n.getRoleDescription)(e,"banner region");return"[out of ".concat(t,"]")}]}),new a.SRRendererRule({roles:["blockquote"],elems:[],modes:["item"],tests:[function(e){return"[out of blockquote]"}]}),new a.SRRendererRule({roles:["caption"],elems:[],modes:["item"],tests:[function(e){return"[out of caption]"}]}),new a.SRRendererRule({roles:["complementary"],elems:[],modes:["item"],tests:[function(e){var t=(0,n.getRoleDescription)(e,"complementary region");return"[out of ".concat(t,"]")}]}),new a.SRRendererRule({roles:["contentinfo"],elems:[],modes:["item"],tests:[function(e){var t=(0,n.getRoleDescription)(e,"content info region");return"[out of ".concat(t,"]")}]}),new a.SRRendererRule({roles:["figure"],elems:[],modes:["item","region"],tests:[function(e){return"[out of figure]"}]}),new a.SRRendererRule({roles:["form"],elems:[],modes:["item","region","formcontrol"],tests:[function(e){return null===e.getNameInfo()?"[out of section]":"[out of form]"}]}),new a.SRRendererRule({roles:["group"],elems:[],modes:["item"],tests:[function(e){var t;return null===e.getNameInfo()?null:"SELECT"===(null===(t=e.getCurrentOrParentByRoleClone(["combobox"],["select"]))||void 0===t?void 0:t.getNode().nodeName.toUpperCase())?"":"[out of grouping]"}]}),new a.SRRendererRule({roles:["list"],elems:[],modes:["item"],tests:[function(e){var t=e.getNode(),i=document.evaluate(".//li | .//*[@role='listitem']",t,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null),a=document.evaluate(".//ul//li|.//ul//*[@role='listitem']|.//ol//li|.//ol//*[@role='listitem']|.//*[@role='list']//li|.//*[@role='list']//*[@role='listitem']",t,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null);return 0===i.snapshotLength-a.snapshotLength?null:"[".concat((0,n.quoteNamePadAfter)(e),"out of list]")}]}),new a.SRRendererRule({roles:["main"],elems:[],modes:["item"],tests:[function(e){var t=(0,n.getRoleDescription)(e,"main region");return"[out of ".concat(t,"]")}]}),new a.SRRendererRule({roles:["menubar"],elems:[],modes:["item","list"],tests:[function(e){return"[out of menubar]"}]}),new a.SRRendererRule({roles:["navigation"],elems:[],modes:["item"],tests:[function(e){var t=(0,n.getRoleDescription)(e,"navigation region");return"[out of ".concat(t,"]")}]}),new a.SRRendererRule({roles:["radiogroup"],elems:[],modes:["item","region","tab_focus"],tests:[function(e){return"[out of grouping]"}]}),new a.SRRendererRule({roles:["region"],elems:[],modes:["item"],tests:[function(e){if(null===e.getNameInfo())return null;var t=(0,n.getRoleDescription)(e,"region");return"[out of ".concat(t,"]")}]}),new a.SRRendererRule({roles:["search"],elems:[],modes:["item"],tests:[function(e){var t=(0,n.getRoleDescription)(e,"search region");return"[out of ".concat(t,"]")}]}),new a.SRRendererRule({roles:["table"],elems:[],modes:["item"],tests:[function(e){return"[out of table]"}]}),new a.SRRendererRule({roles:["toolbar"],elems:[],modes:["item"],tests:[function(e){return"[out of toolbar]"}]}),new a.SRRendererRule({roles:[],elems:["ABBR"],modes:["item"],tests:[function(e){return e.getElement().hasAttribute("title")?"[".concat(e.getElement().getAttribute("title"),"]"):null}]}),new a.SRRendererRule({roles:[],elems:["DL"],modes:["item"],tests:[function(e){return"[out of definition list]"}]}),new a.SRRendererRule({roles:[],elems:["FIGCAPTION"],modes:["item"],tests:[function(e){return"[out of caption]"}]}),new a.SRRendererRule({roles:[],elems:["MARK"],modes:["item"],tests:[function(e){return"[out of highlighted]"}]}),new a.SRRendererRule({roles:["group","article","banner","blockquote","caption","complementary","contentinfo","figure","form","list","region","main","navigation","search","table","toolbar"],elems:[],modes:["region","heading"],tests:[function(){return""}]})]},2151(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.CONTAINER_EXIT_RULES=t.CONTAINER_ENTER_RULES=t.SR_RULES=void 0;var a=i(7242),n=i(8485),l=i(2099);t.SR_RULES=a.RULES,t.CONTAINER_ENTER_RULES=n.RULES,t.CONTAINER_EXIT_RULES=l.RULES},1950(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.AccNameUtil=void 0;var a=i(9910),n=i(7139),l=i(7011),r=i(3946),o=i(4566),s=i(3864),u=i(1686),d=function(){function e(){}return e.computeAccessibleNameForSVGElementW3C=function(e){if(!e||"svg"!==e.nodeName.toLowerCase())return null;var t=e.querySelectorAll(":scope > title");if(t&&t.length>0){var i="";if(t.forEach(function(e){if(e&&!r.VisUtil.isNodeHiddenFromAT(e)&&!r.VisUtil.isNodePresentational(e)){var t=e.textContent;t&&""!==t.trim()&&(i+=t.trim())}}),i&&""!==i.trim())return{name:i.trim(),nameFrom:"svgTitle"}}var a="",o=e.querySelectorAll("text, textPath, tspan");if(o&&o.length>0&&(o.forEach(function(e){if(!r.VisUtil.isNodeHiddenFromAT(e)&&!r.VisUtil.isNodePresentational(e)){var t=e.textContent;t&&""!==t.trim()&&(a+=" "+t.trim())}}),""!==a.trim()))return{name:n.CommonUtil.truncateText(a.trim()),nameFrom:"svgText"};for(var s=e.querySelectorAll("a"),u=0;u<s.length;u++){var d=s[u];if(!r.VisUtil.isNodeHiddenFromAT(d)&&!r.VisUtil.isNodePresentational(d)){var c=d.getAttribute("xlink:title");if(c&&""!==c.trim())return{name:n.CommonUtil.truncateText(c),nameFrom:"svglinkTitle"}}}var m=l.AriaUtil.getAriaDescription(e);if(m&&""!==m.trim())return{name:n.CommonUtil.truncateText(m),nameFrom:"aria-description"};var p=e.querySelectorAll(":scope > desc");if(p&&p.length>0){var h="";if(p.forEach(function(e){if(!r.VisUtil.isNodeHiddenFromAT(e)&&!r.VisUtil.isNodePresentational(e)){var t=e.textContent;t&&""!==t.trim()&&(h+=" "+t.trim())}}),""!==h.trim())return{name:h.trim(),nameFrom:"svgDesc"}}if(e.hasAttribute("title")){var g=e.getAttribute("title");if(g&&""!==g.trim())return{name:n.CommonUtil.truncateText(g),nameFrom:"title"}}return null},e.computeAccessibleName=function(t){if(!t)return null;var i=t.nodeName.toLowerCase(),r=o.CacheUtil.getCache(t,"ELEMENT_ACCESSBLE_NAME",void 0);if(void 0!==r)return r;var s=l.AriaUtil.getAriaLabel(t);if(s&&""!==s.trim())return o.CacheUtil.setCache(t,"ELEMENT_ACCESSBLE_NAME",{name:n.CommonUtil.truncateText(s),nameFrom:"ariaLabel"}),{name:n.CommonUtil.truncateText(s),nameFrom:"ariaLabel"};if(r=e.computeAccessibleNameForNativeElement(t))return o.CacheUtil.setCache(t,"ELEMENT_ACCESSBLE_NAME",r),r;var u=l.AriaUtil.getResolvedRole(t);if(a.ARIADefinitions.designPatterns[u]&&a.ARIADefinitions.designPatterns[u].nameFrom.includes("contents")&&(r=e.computeAccessibleNameFromContent(t)))return o.CacheUtil.setCache(t,"ELEMENT_ACCESSBLE_NAME",r),r;if(t.hasAttribute("title")){var d=t.getAttribute("title").trim();if(d&&d.trim().length>0)return d=n.CommonUtil.truncateText(d),o.CacheUtil.setCache(t,"ELEMENT_ACCESSBLE_NAME",{name:d,nameFrom:"title"}),{name:d,nameFrom:"title"}}if("textarea"===i||"input"===i&&(!t.hasAttribute("type")||n.CommonUtil.input_type_with_placeholder.includes(t.getAttribute("type")))){var c=t.getAttribute("placeholder");if(c&&c.trim().length>0)return c=n.CommonUtil.truncateText(c),o.CacheUtil.setCache(t,"ELEMENT_ACCESSBLE_NAME",{name:c,nameFrom:"placeholder"}),{name:c,nameFrom:"placeholder"}}return o.CacheUtil.setCache(t,"ELEMENT_ACCESSBLE_NAME",null),null},e.computeAccessibleNameForNativeElement=function(t){var i,a,l=t.nodeName.toLowerCase();if(n.CommonUtil.form_labelable_elements.includes(l)&&(p=n.CommonUtil.getFormFieldLabel(t))&&""!==p.trim())return{name:n.CommonUtil.truncateText(p),nameFrom:"label"};if("input"===l&&t.hasAttribute("type"))if(n.CommonUtil.form_button_types.includes(t.getAttribute("type"))){var o=n.CommonUtil.getElementAttribute(t,"value");if(o&&""!==o.trim())return{name:n.CommonUtil.truncateText(o),nameFrom:"value"};var s=t.getAttribute("type");if("submit"===s||"reset"===s)return{name:s,nameFrom:"internal"}}else if("image"===t.getAttribute("type")&&(b=n.CommonUtil.getElementAttribute(t,"alt"))&&""!==b.trim())return{name:n.CommonUtil.truncateText(b),nameFrom:"alt"};if("button"===l){if((v=t.innerText)&&""!==v.trim())return{name:n.CommonUtil.truncateText(v),nameFrom:"text"};var d=t.querySelector("img");if(d&&!r.VisUtil.isNodeHiddenFromAT(d)&&!r.VisUtil.isNodePresentational(d)&&(a=e.computeAccessibleName(d))&&a.name&&a.name.trim().length>0)return a;var c=t.querySelector("svg");if(c&&!r.VisUtil.isNodeHiddenFromAT(c)&&!r.VisUtil.isNodePresentational(c)&&(a=e.computeAccessibleName(c))&&a.name&&a.name.trim().length>0)return a}if("fieldset"===l&&(i=t.firstElementChild)&&"legend"===i.nodeName.toLowerCase()&&(v=i.innerText)&&v.trim().length>0)return{name:n.CommonUtil.truncateText(v),nameFrom:"legend"};if("output"===l&&t.hasAttribute("for")){var m=t.getAttribute("for").trim().split(" ");if(m&&m.length>0){for(var p="",h=0;h<m.length;h++){var g=t.ownerDocument.getElementById(m[h]);!g||u.DOMUtil.sameNode(g,t)||r.VisUtil.isNodeHiddenFromAT(g)||r.VisUtil.isNodePresentational(g)||(a=e.computeAccessibleName(g))&&a.name&&a.name.trim().length>0&&(p+=" "+n.CommonUtil.normalizeSpacing(a.name))}if(p.trim().length>0)return{name:n.CommonUtil.truncateText(p),nameFrom:"label"}}}if("summary"===l&&(v=t.innerText)&&v.trim().length>0)return{name:n.CommonUtil.truncateText(v),nameFrom:"legend"};if("details"===l)return(i=t.firstElementChild)&&"summary"===i.nodeName.toLowerCase()&&(a=e.computeAccessibleName(i))&&a.name&&a.name.trim().length>0?{name:n.CommonUtil.truncateText(a.name.trim()),nameFrom:"summary"}:{name:"details",nameFrom:"internal"};if("figure"===l&&(_=n.CommonUtil.getChildByTagHidden(t,"figcaption",!0,!1))&&_.length>0&&(v=_[0].innerText)&&v.trim().length>0)return{name:n.CommonUtil.truncateText(v),nameFrom:"figcaption"};if("img"===l&&t.hasAttribute("alt")){var b=t.getAttribute("alt");return{name:n.CommonUtil.truncateText(b),nameFrom:"alt"}}if("area"===l&&t.hasAttribute("alt")&&(b=t.getAttribute("alt"))&&b.trim().length>0)return{name:n.CommonUtil.truncateText(b),nameFrom:"alt"};if("table"===l){var _,f=t.firstElementChild;if(f&&"caption"===f.nodeName.toLowerCase()&&(_=f.innerText)&&_.trim().length>0)return{name:n.CommonUtil.truncateText(_),nameFrom:"caption"}}if("a"===l){var v;if((v=t.innerText)&&""!==v.trim())return{name:n.CommonUtil.truncateText(v),nameFrom:"text"};var A=t.querySelectorAll(":scope > img, :scope > svg");if(A&&A.length>0){var w="";if(A.forEach(function(t){if(!r.VisUtil.isNodeHiddenFromAT(t)&&!r.VisUtil.isNodePresentational(t)){var i=e.computeAccessibleName(t);i&&i.name&&i.name.trim().length>0&&(w+=" "+i.name.trim())}}),""!==w.trim())return{name:w.trim(),nameFrom:"alt"}}}return("optgroup"===l||"option"===l||"track"===l)&&(p=t.getAttribute("label"))&&p.trim().length>0?{name:n.CommonUtil.truncateText(p),nameFrom:"label"}:"svg"===l&&(a=e.computeAccessibleNameForSVGElementW3C(t))&&a.name&&a.name.trim().length>0?a:null},e.computeAccessibleNameForSVGElement=function(e){var t=e.querySelectorAll(":scope > title");if(t&&t.length>0){var i="";if(t.forEach(function(e){if(e&&!r.VisUtil.isNodeHiddenFromAT(e)&&!r.VisUtil.isNodePresentational(e)){var t=e.textContent;t&&""!==t.trim()&&(i+=t.trim())}}),i&&""!==i.trim())return{name:i.trim(),nameFrom:"svgTitle"}}var a=e.querySelector("a");if(a&&!r.VisUtil.isNodeHiddenFromAT(a)&&!r.VisUtil.isNodePresentational(a)){var o=a.getAttribute("xlink:title");if(o&&""!==o.trim())return{name:n.CommonUtil.truncateText(o),nameFrom:"svglinkTitle"}}var s="";if(e.querySelectorAll(":scope > *").forEach(function(e){if("svg"!==e.nodeName.toLowerCase()&&!r.VisUtil.isNodeHiddenFromAT(e)&&!r.VisUtil.isNodePresentational(e)){var t=n.CommonUtil.getInnerText(e);t&&t.trim().length>0&&(s+=t)}}),""!==s.trim())return{name:n.CommonUtil.truncateText(s),nameFrom:"svgText"};var u=l.AriaUtil.getAriaDescription(e);if(u&&u.trim().length>0)return{name:n.CommonUtil.truncateText(u),nameFrom:"aria-description"};var d=e.querySelectorAll(":scope > desc");if(d&&d.length>0){var c="";if(d.forEach(function(e){if(e&&!r.VisUtil.isNodeHiddenFromAT(e)&&!r.VisUtil.isNodePresentational(e)){var t=e.textContent;t&&""!==t.trim()&&(c+=t.trim())}}),c&&""!==c.trim())return{name:c.trim(),nameFrom:"svgDesc"}}},e.computeAccessibleNameFromContent=function(t){var i=t.nodeName.toLowerCase(),a=(l.AriaUtil.getResolvedRole(t),e.computeAccessibleNameForCSSPseudoElement(t,"before"));return null!==a&&a.name&&a.name.trim().length>0||(a=e.computeAccessibleNameForCSSPseudoElement(t,"after"))&&a.name&&a.name.trim().length>0?a:t.shadowRoot&&(a=e.computeAccessibleNameForShadowHost(t))&&a.name&&a.name.trim().length>0?{name:a.name,nameFrom:"shadow"}:"slot"===i&&(a=e.computeAccessibleNameForSlotElement(t))&&a.name&&a.name.trim().length>0?{name:a.name,nameFrom:"slot"}:(a=e.computeAccessibleNameFromChildren(t))&&a.name&&a.name.trim().length>0?{name:a.name,nameFrom:"content"}:null},e.computeAccessibleNameForCSSPseudoElement=function(e,t){var i=e.ownerDocument.defaultView.getComputedStyle(e,t);if(i){var a=i.content;if(a&&"none"!==a&&"no"!==a&&"normal"!==a&&(a=a.replace(/^"/,"").replace(/"$/,"")).trim().length>0)return{name:n.CommonUtil.truncateText(a),nameFrom:"css-"+t}}return null},e.computeAccessibleNameForShadowHost=function(t){var i="",a=t.shadowRoot;return a&&a.querySelectorAll("*").forEach(function(t){var a=e.computeAccessibleName(t);a&&a.name&&a.name.trim().length>0&&(i+=" "+a.name.trim())}),i.trim().length>0?{name:n.CommonUtil.truncateText(i),nameFrom:"shadow-host"}:null},e.computeAccessibleNameForSlotElement=function(t){var i="";if(t.assignedNodes()&&0!==t.assignedNodes().length)for(var a=0,l=t.assignedNodes();a<l.length;a++){var r,o=l[a];(r=e.computeAccessibleName(o))&&r.name&&r.name.length>0&&(i+=" "+r.name.trim())}else(r=e.computeAccessibleName(t))&&r.name&&r.name.trim().length>0&&(i+=" "+r.name.trim());return i.trim().length>0?{name:n.CommonUtil.truncateText(i),nameFrom:"content-slot"}:null},e.computeAccessibleNameFromChildren=function(t){for(var i="",a=new s.DOMWalker(t);a.nextNode()&&a.node!==t&&a.node!==t.parentNode;)if(!a.bEndTag){var o=a.node;if(3===o.nodeType){var u=o.parentElement;!r.VisUtil.isNodeHiddenFromAT(u)&&!r.VisUtil.isNodePresentational(u)&&o.nodeValue&&o.nodeValue.trim().length>0&&(i+=" "+o.nodeValue.trim())}else if(1===o.nodeType&&!r.VisUtil.isNodeHiddenFromAT(o)&&!r.VisUtil.isNodePresentational(o)){var d=e.computeAccessibleName(o);d&&d.name&&d.name.length>0?(i+=" "+d.name.trim(),a.bEndTag=!0):l.AriaUtil.containsPresentationalChildrenOnly(a.node)&&(a.bEndTag=!0)}}return i.trim().length>0?{name:n.CommonUtil.truncateText(i),nameFrom:"content"}:null},e.isAccessibleNameIgnorable=function(e){if(!e)return!1;var t=e.nodeName.toLowerCase();if("img"!==t&&"svg"!==t)return!1;var i=e.parentElement;return!(!i||!l.AriaUtil.isWidget(i)&&!l.AriaUtil.containsPresentationalChildrenOnly(i)||!l.AriaUtil.hasAriaLabel(i))},e}();t.AccNameUtil=d},7011(e,t,i){var a=this&&this.__spreadArray||function(e,t,i){if(i||2===arguments.length)for(var a,n=0,l=t.length;n<l;n++)!a&&n in t||(a||(a=Array.prototype.slice.call(t,0,n)),a[n]=t[n]);return e.concat(a||Array.prototype.slice.call(t))};Object.defineProperty(t,"__esModule",{value:!0}),t.AriaUtil=void 0;var n=i(4566),l=i(9910),r=i(9955),o=i(3864),s=i(3946),u=i(7139),d=i(1950),c=i(5279),m=i(1686),p=function(){function e(){}return e.isDefinedAriaAttributeAtIndex=function(t,i){var a=t.attributes[i].name;return e.isDefinedAriaAttribute(t,a)},e.getUserDefinedAriaAttributes=function(e){var t=[],i=e.attributes;if(i)for(var a=0;a<i.length;a++){var n=i[a].name.trim().toLowerCase();"aria-"===n.substring(0,5)&&t.push(n)}return t},e.getUserDefinedHtmlAttributes=function(e){var t=[],i=e.attributes;if(i)for(var a=0;a<i.length;a++){var n=i[a].name.trim().toLowerCase();"aria-"===n.substring(0,5)||t.push(n)}return t},e.getUserDefinedAriaAttributeNameValuePairs=function(e){var t=[],i=e.attributes;if(i)for(var a=0;a<i.length;a++){var n=i[a].name.trim().toLowerCase(),l=e.getAttribute(n);""===l&&(l=null),"aria-"===n.substring(0,5)&&t.push({name:n,value:l})}return t},e.getUserDefinedHtmlAttributeNameValuePairs=function(e){var t=[],i=e.attributes;if(i)for(var a=0;a<i.length;a++){var n=i[a].name.trim().toLowerCase(),l=e.getAttribute(n);""===l&&(l=null),"aria-"===n.substring(0,5)||t.push({name:n,value:l})}return t},e.getAriaAttribute=function(t,i){var a=t.getAttribute(i);if(t.hasAttribute(i)&&""===a.trim())return a;if(!a){var n=t.nodeName.toLowerCase();i in e.ariaAttributeImplicitMappings&&(n in e.ariaAttributeImplicitMappings[i]?"function"==typeof(a=e.ariaAttributeImplicitMappings[i][n])&&(a=a(t)):"*"in e.ariaAttributeImplicitMappings[i]&&"function"==typeof(a=e.ariaAttributeImplicitMappings[i]["*"])&&(a=a(t)))}if(!a){var l=r.ARIAMapper.nodeToRole(t);l in e.ariaAttributeRoleDefaults&&i in e.ariaAttributeRoleDefaults[l]&&"function"==typeof(a=e.ariaAttributeRoleDefaults[l][i])&&(a=a(t))}return!a&&i in e.ariaAttributeGlobalDefaults&&(a=e.ariaAttributeGlobalDefaults[i]),a},e.isDefinedAriaAttribute=function(e,t){var i=!1;return"aria-"===t.substring(0,5)&&(i=e.hasAttribute&&e.hasAttribute(t)&&e.getAttribute(t).length>0),i},e.getResolvedRole=function(t,i){if(void 0===i&&(i=!0),!t)return null;var a=n.CacheUtil.getCache(t,"RPTUTIL_ELEMENT_RESOLVED_ROLE",null);if(null===a){var l=e.getUserDefinedRoles(t),r=e.getElementAriaProperty(t),o=e.getAllowedAriaRoles(t,r),s=!1;if(l&&l.length>0&&o&&o.length>0){for(var d=0;d<l.length;d++)if(o.includes("any")||o.includes(l[d])){if(o.includes("any")&&"generic"===l[d]){s=!0;continue}if(("presentation"===(a=l[d])||"none"===a)&&u.CommonUtil.isFocusable(t)){a=null;continue}break}s&&(a="generic")}if(null===a&&i){var c=e.getImplicitRole(t);a=c&&c.length>0?c[0]:void 0}n.CacheUtil.setCache(t,"RPTUTIL_ELEMENT_RESOLVED_ROLE",a)}return void 0!==a?a:null},e.getUserDefinedRoles=function(t){return e.getRoles(t,!1)},e.getRoles=function(t,i){var a=[];if(t&&t.hasAttribute&&t.hasAttribute("role"))for(var n=u.CommonUtil.normalizeSpacing(t.getAttribute("role").trim()).split(" "),l=0;l<n.length;++l)a.push(n[l]);if(i){var r=e.getImplicitRole(t);null!==r&&r.length>0&&u.CommonUtil.concatUniqueArrayItemList(r,a)}return a},e.getImplicitRole=function(t){if(!t||1!==t.nodeType)return null;var i=n.CacheUtil.getCache(t,"AriaUtil_ImplicitRole",null);if(!i){var a=e.getElementAriaProperty(t);if(a&&a.implicitRole){if(a.implicitRole.includes("generic")){var r=e.getUserDefinedAriaAttributes(t);if(0===r.length)return n.CacheUtil.setCache(t,"AriaUtil_ImplicitRole",[]),[];var o=[],s=l.ARIADefinitions.designPatterns.generic;if(s.reqProps&&s.reqProps.length>0&&u.CommonUtil.concatUniqueArrayItemList(s.reqProps,o),a.globalAriaAttributesValid&&u.CommonUtil.concatUniqueArrayItemList(l.ARIADefinitions.globalProperties,o),s.deprecatedProps&&s.deprecatedProps.length>0&&u.CommonUtil.reduceArrayItemList(s.deprecatedProps,o),o.length>0&&!o.some(function(e){return r.includes(e)})){var d=u.CommonUtil.reduceArrayItemList(["generic"],a.implicitRole);return n.CacheUtil.setCache(t,"AriaUtil_ImplicitRole",d),d}}return n.CacheUtil.setCache(t,"AriaUtil_ImplicitRole",a.implicitRole),a.implicitRole}return n.CacheUtil.setCache(t,"AriaUtil_ImplicitRole",[]),[]}return i},e.getRoleRequiredProperties=function(e,t){if(null===e)return null;if(l.ARIADefinitions.designPatterns[e]){var i=l.ARIADefinitions.designPatterns[e].reqProps;return"separator"===e.toLowerCase()&&t&&u.CommonUtil.isFocusable(t)&&(i=u.CommonUtil.concatUniqueArrayItemList(["aria-valuenow"],i||[])),i}return null},e.hasRole=function(t,i,a){var n=!1;if(t&&t.hasAttribute&&t.hasAttribute("role"))if("string"!=typeof i)for(var l=t.getAttribute("role").trim().split(" "),r=0;!n&&r<l.length;++r)n=l[r]in i;else for(l=t.getAttribute("role").trim().split(" "),r=0;!n&&r<l.length;++r)n=l[r]===i;if(!n&&a){var o=[],s=e.getImplicitRole(t);if(null!==s&&s.length>0)if(u.CommonUtil.concatUniqueArrayItemList(s,o),"string"!=typeof i)for(r=0;!n&&r<o.length;++r)n=o[r]in i;else for(r=0;!n&&r<o.length;++r)n=o[r]===i}return n},e.hasRoleInSemantics=function(t,i){var a=!1,n=!1;if(t&&t.hasAttribute&&t.hasAttribute("role"))if("string"!=typeof i)for(var l=t.getAttribute("role").trim().toLowerCase().split(/\s+/),r=0;!a&&r<l.length;++r)n=!0,a=l[r]in i;else for(l=t.getAttribute("role").trim().toLowerCase().split(/\s+/),r=0;!a&&r<l.length;++r)n=!0,a=l[r]===i;if(n)return a;var o=e.getImplicitRole(t);if(null!==o&&o.length>0)if("string"!=typeof i)for(r=0;!a&&r<o.length;++r)a=o[r]in i;else for(r=0;!a&&r<o.length;++r)a=o[r]===i;return a},e.hasAnyRole=function(t,i){var a=!1;if(t&&t.hasAttribute&&t.hasAttribute("role")&&(a=!0),!a&&i){var n=e.getImplicitRole(t);null!==n&&n.length>0&&(a=!0)}return a},e.isPresentationalElement=function(e){return u.CommonUtil.valInArray(e.nodeName.toLowerCase(),["abbr","b","bdi","bdo","br","cite","code","data","dfn","em","i","kbd","mark","q","rp","rt","rtc","ruby","s","samp","small","span","strong","sub","sup","time","u","var","wbr","a","progress","meter","basefont","big","center","strike","tt","font","blink","h1","h2","h3","h4","h5","h6","hr","blockquote","p"])},e.getAncestorWithRole=function(t,i,a){for(var n=o.DOMWalker.parentNode(t);null!==n;){if(a){if(e.hasRoleInSemantics(n,i))break}else if(e.hasRole(n,i,!1))break;n=o.DOMWalker.parentNode(n)}return n},e.getAncestorWithRoles=function(t,i){if(!t||!i||!i.length||0===i.length)return null;for(var a=t;null!==a;){var n=e.getResolvedRole(a);if(null!==n&&(i.includes(n)||i.includes("*")&&!["presentation","none"].includes(n)))return a;a=o.DOMWalker.parentNode(a)}return null},e.getRolesWithTypes=function(e,t){if(!e||!t||!t.length||0===t.length)return null;var i=n.CacheUtil.getCache(e.ownerDocument,"roles_with_given_types",null);return i&&0!==i.length||(i=[],Object.entries(l.ARIADefinitions.designPatterns).forEach(function(e){var a=e[0],n=e[1];t.includes(n.roleType)&&i.push(a)}),n.CacheUtil.setCache(e.ownerDocument,"roles_with_given_types",i)),i},e.isWidget=function(t){if(!t)return!1;var i=n.CacheUtil.getCache(t.ownerDocument,"is_element_widget",null);if(null===i){var a=!1,r=e.getResolvedRole(t);return r&&l.ARIADefinitions.designPatterns[r]&&"widget"===l.ARIADefinitions.designPatterns[r].roleType&&(a=!0),n.CacheUtil.setCache(t.ownerDocument,"is_element_widget",a),a}return i},e.isNavigationOwnedOrControlled=function(t){if(!t)return!1;var i=n.CacheUtil.getCache(t.ownerDocument,"AriaUtil_NavigationOwnedOrControlled",null);if(null!==i&&i.length>0&&u.CommonUtil.getAncestor(t,i))return!0;var a=e.getResolvedRole(t);if(!a)return!1;var l=t.getAttribute("id");return!(!l||0===l.trim().length)&&(!!t.ownerDocument.querySelector("*[aria-controls~='".concat(l,"'], *[aria-owns~='").concat(l,"']"))&&(!!["combobox","scrollbar","button","tab","listbox","menu","menubar","radiogroup","tree","treegrid"].includes(a)&&(null===i&&(i=[]),i.push(t),n.CacheUtil.setCache(t.ownerDocument,"AriaUtil_NavigationOwnedOrControlled",i),!0)))},e.getSiblingWithRole=function(t,i){return e.getSiblingWithRoleHidden(t,i,!1)},e.getSiblingWithRoleHidden=function(t,i,a,n){var l=null,r=!1;if(t&&i){for(l=t.nextSibling;null!==l&&!r;)a&&u.CommonUtil.shouldNodeBeSkippedHidden(l)||(r=n?e.hasRoleInSemantics(l,i):e.hasRole(l,i,!1)),l=l.nextSibling;if(!l)for(l=t.previousSibling;null!==l&&!r;)a&&u.CommonUtil.shouldNodeBeSkippedHidden(l)||(r=e.hasRole(l,i,n)),l=l.previousSibling}return l},e.getDescendantWithRole=function(t,i){return e.getDescendantWithRoleHidden(t,i,!1)},e.getDescendantWithRoleHidden=function(t,i,a,n){for(var l=null,r=new o.DOMWalker(t);r.nextNode()&&r.node!=t&&r.node!=t.nextSibling;)if((!a||!u.CommonUtil.shouldNodeBeSkippedHidden(r.node))&&(n?e.hasRoleInSemantics(r.node,i):e.hasRole(r.node,i,!1))){l=r.node;break}return l},e.getAllDescendantsWithRoles=function(t,i,a,n){if(i&&0!==i.length){var l=[];return i.forEach(function(i){var r=e.getAllDescendantsWithRoleHidden(t,i,a,n);r&&r.length>0&&(l=l.concat(r))}),l}},e.getAllDescendantsWithRoleHidden=function(t,i,a,n){for(var l=[],r=new o.DOMWalker(t);r.nextNode()&&r.node!=t&&r.node!=t.nextSibling;)r.bEndTag||a&&u.CommonUtil.shouldNodeBeSkippedHidden(r.node)||e.hasRole(r.node,i,n)&&l.push(r.node);return l},e.getDirectATChildren=function(t){var i=e.getRequiredChildRoles(t,!0),a=[];return e.retrieveDirectATChildren(t,i,a),a},e.retrieveDirectATChildren=function(t,i,a){var n=[];if(null!==t.children&&t.children.length>0)for(var l=0;l<t.children.length;l++)n.push(t.children[l]);var r=t.getAttribute("aria-owns");if(r){var o=t.ownerDocument;if(o){var u=r.split(" ");for(l=0;l<u.length;l++){var d=o.getElementById(u[l]);d&&n.push(d)}}}if(n.length>0){for(l=0;l<n.length;l++)if(!s.VisUtil.isNodeHiddenFromAT(n[l])&&s.VisUtil.isNodeVisible(n[l])){var c=e.getRoles(n[l],!1);null!==c&&0!==c.length||(c=e.getImplicitRole(n[l])),c&&null!==c&&c.length>0&&(c=c.filter(function(e){return"none"!==e&&"presentation"!==e})).includes("group")&&i&&i.includes("group")&&(c=c.filter(function(e){return"group"!==e})),c&&null!==c&&c.length>0?a.push(n[l]):e.retrieveDirectATChildren(n[l],i,a)}return null}return null},e.getRequiredChildRoles=function(t,i){var a=e.getRoles(t,!1);if(a&&0!==a.length||!i||(a=e.getImplicitRole(t)),!a||0===a.length)return null;var n=["none","presentation"];if(a.some(function(e){return n.includes(e)}))return null;for(var r=l.ARIADefinitions.designPatterns,o=new Array,s=0;s<a.length;++s)r[a[s]]&&null!==r[a[s]].reqChildren&&(o=u.CommonUtil.concatUniqueArrayItemList(r[a[s]].reqChildren,o));return o},e.getAriaOwnsWithRole=function(t,i){return e.getAriaOwnsWithRoleHidden(t,i,!1)},e.getAriaOwnsWithRoleHidden=function(t,i,a,n){var l=null,r=!1;if(u.CommonUtil.attributeNonEmpty(t,"aria-owns")){var o=t.getAttribute("aria-owns");if(l=c.FragmentUtil.getById(t,o),m.DOMUtil.sameNode(t,l))return null;r=a&&null!=l&&u.CommonUtil.shouldNodeBeSkippedHidden(l)?null:e.hasRole(l,i,n)}return r?l:null},e.hasAriaLabel=function(e){return u.CommonUtil.attributeNonEmpty(e,"aria-label")||u.CommonUtil.attributeNonEmpty(e,"aria-labelledby")},e.hasUniqueAriaLabelsLocally=function(t,i){if(0===t.length)return!1;var a=t[0].ownerDocument,l=!1,r=null;i&&(r=n.CacheUtil.getCache(a,"AriaUtil_HAS_UNIQUE_ARIA_LABELS",null)),null===r&&(r={});for(var o=0;!l&&o<t.length;++o)if(t[o].hasAttribute)if(t[o].hasAttribute("aria-label")){var s=u.CommonUtil.normalizeSpacing(t[o].getAttribute("aria-label")).toLowerCase();l=s in r,r[s]=!0}else if(t[o].hasAttribute("aria-labelledby")){var d=t[o].getAttribute("aria-labelledby"),p=c.FragmentUtil.getById(t[o],d),h="";p&&!m.DOMUtil.sameNode(p,t[o])&&(h=e.getTextContentExcludingScripts(p));var g=u.CommonUtil.normalizeSpacing(h).toLowerCase();l=g in r,r[g]=!0}else l=!0;return i&&n.CacheUtil.setCache(a,"AriaUtil_HAS_UNIQUE_ARIA_LABELS",r),!l},e.getTextContentExcludingScripts=function(e){if(!e)return"";for(var t="",i=new o.DOMWalker(e);i.nextNode()&&i.node!==e&&i.node!==e.parentNode;)if(!i.bEndTag){var a=i.node,n=a.nodeName?a.nodeName.toLowerCase():"";"script"!==n&&"style"!==n?3===a.nodeType?a.nodeValue&&a.nodeValue.trim().length>0&&(t+=" "+a.nodeValue.trim()):1===a.nodeType&&("img"===n&&a.hasAttribute("alt")||"input"===n&&"image"===a.getAttribute("type")&&a.hasAttribute("alt"))&&(t+=" "+a.getAttribute("alt").trim(),i.bEndTag=!0):i.bEndTag=!0}return t.trim()},e.getAriaLabel=function(t){if(t.hasAttribute){if(t.hasAttribute("aria-labelledby")){for(var i=t.getAttribute("aria-labelledby").trim().split(" "),a="",n=0,l=i.length;n<l;++n){var r=i[n],o=c.FragmentUtil.getById(t,r);if(o&&!m.DOMUtil.sameNode(o,t)){var s=e.getTextContentExcludingScripts(o);a+=u.CommonUtil.normalizeSpacing(s)}}return a.trim()}if(t.hasAttribute("aria-label"))return u.CommonUtil.normalizeSpacing(t.getAttribute("aria-label")).trim()}return""},e.getAriaDescription=function(t){if(!t)return"";var i="",a=t.getAttribute("aria-labelledby");if(a&&a.trim().length>0){for(var n=a.trim().split(" "),l=0,r=n.length;l<r;++l){var o=n[l],s=c.FragmentUtil.getById(t,o);if(s&&!m.DOMUtil.sameNode(s,t)){var d=e.getTextContentExcludingScripts(s);d&&d.trim().length>0&&(i+=u.CommonUtil.normalizeSpacing(d).toLowerCase())}}if(i.trim().length>0)return i.trim()}return(a=t.getAttribute("aria-description"))&&a.trim().length>0?a.trim().toLowerCase():""},e.findAriaLabelDupes=function(t){var i={};return t.forEach(function(t){i[e.getAriaLabel(t)]=(i[e.getAriaLabel(t)]||0)+1}),i},e.getLandmarkAccNames=function(t){var i=n.CacheUtil.getCache(t,"AriaUtil_Landmark_AccNames",null);if(i&&0!==i.length)return i;i=[];var l=t.querySelectorAll('aside,[role="complementary"], footer,[role="contentinfo"], header,[role="banner"], main,[role="main"], nav,[role="navigation"], form,[role="form"], section,[role="region"], article,[role="article"], [role="search"],[role="application"],[role="document"]');return 0===l.length?(n.CacheUtil.setCache(t,"AriaUtil_Landmark_AccNames",i),i):(l.forEach(function(t){if(!s.VisUtil.isNodeHiddenFromAT(t)&&null===u.CommonUtil.getAncestor(t,["DIALOG"])&&null===e.getAncestorWithRole(t,"dialog",!0)){var n="",r=d.AccNameUtil.computeAccessibleName(t);r&&r.name&&r.name.trim().length>0&&(n=r.name.trim());var o=a([],l,!0).filter(function(e){return e.contains(t)&&e!==t});o.length>1&&o.forEach(function(e){var t=d.AccNameUtil.computeAccessibleName(e);t&&t.name&&t.name.trim().length>0&&(n=t.name.trim()+" "+n)});var c=e.getResolvedRole(t);i.push({elem:t,role:c,name:n})}}),n.CacheUtil.setCache(t,"AriaUtil_Landmark_AccNames",i),i)},e.isLandmarkNameUnique=function(t,i,a){void 0===a&&(a=!1);var n,l=e.getLandmarkAccNames(t.ownerDocument);if(!(n="any"===i?l.find(function(e){return e.elem===t}):l.find(function(e){return e.elem===t&&e.role===i})))return null;var r=n.name;if(!a&&""===r)return null;for(var o=0;o<l.length;o++)if(l[o].elem!==t&&r===l[o].name){if("any"===i)return!0;if(l[o].role===i)return!0}return!1},e.hasUniqueAriaLabels=function(t){return e.hasUniqueAriaLabelsLocally(t,!0)},e.hasDuplicateAriaLabelsLocally=function(t,i){if(0===t.length)return!1;var a=t[0].ownerDocument,l=null,r=new Array;i&&(l=n.CacheUtil.getCache(a,"AriaUtil_HAS_UNIQUE_ARIA_LABELS",null)),null===l&&(l={});for(var o=0;o<t.length;++o)if(t[o].hasAttribute)if(t[o].hasAttribute("aria-label")){var s=u.CommonUtil.normalizeSpacing(t[o].getAttribute("aria-label")).toLowerCase();l[s]=!0,s in r||(r[s]=new Array),r[s].push(t[o].nodeName.toLowerCase())}else if(t[o].hasAttribute("aria-labelledby")){for(var d=t[o].getAttribute("aria-labelledby").trim().split(" "),p="",h=0,g=d.length;h<g;++h){var b=d[h],_=c.FragmentUtil.getById(t[o],b);if(_&&!m.DOMUtil.sameNode(_,t[o])){var f=e.getTextContentExcludingScripts(_);p+=u.CommonUtil.normalizeSpacing(f).toLowerCase()}}l[p]=!0,p in r||(r[p]=new Array),r[p].push(t[o].nodeName.toLowerCase())}return i&&n.CacheUtil.setCache(a,"AriaUtil_HAS_UNIQUE_ARIA_LABELS",l),r},e.hasDuplicateAriaLabels=function(t){return e.hasDuplicateAriaLabelsLocally(t,!0)},e.hasUniqueAriaLabelledby=function(e){for(var t=!1,i={},a=0;!t&&a<e.length;++a)if(e[a].hasAttribute&&e[a].hasAttribute("aria-labelledby")&&!u.CommonUtil.isIdReferToSelf(e[a],e[a].getAttribute("aria-labelledby"))){var n=u.CommonUtil.normalizeSpacing(e[a].getAttribute("aria-labelledby"));t=n in i,i[n]=!0}else t=!0;return!t},e.getElementAriaProperty=function(t){var i=n.CacheUtil.getCache(t,"AriaUtil_ElementAriaProperty",null);if(!i){var r=null;if(t.tagName?r=t.tagName.toLowerCase():t.nodeName&&(r=t.nodeName.toLowerCase()),null==(i=l.ARIADefinitions.documentConformanceRequirement[r])){var o=l.ARIADefinitions.documentConformanceRequirementSpecialTags[r];switch(r){case"a":case"area":i=t.hasAttribute("href")?o["with-href"]:o["without-href"];break;case"figure":var s=u.CommonUtil.getChildByTag(t,"figcaption");i=null!==s&&s.length>0?o["child-figcaption"]:o["no-child-figcaption"];break;case"footer":case"header":i=null!==e.getAncestorWithRole(t,"article",!0)||null!==e.getAncestorWithRole(t,"complementary",!0)||null!==e.getAncestorWithRole(t,"navigation",!0)||null!==e.getAncestorWithRole(t,"region",!0)||null!==u.CommonUtil.getAncestor(t,["article","aside","main","nav","section"])?o["des-section-article-aside-main-nav"]:o.other;break;case"img":var d=t.hasAttribute("alt")?t.getAttribute("alt"):null,c=t.hasAttribute("title")?t.getAttribute("title"):null;i=0!==e.getAriaLabel(t).trim().length||null!==d&&d.length>0||null!==c&&c.length>0?o["img-with-accname"]:null!==d?o["img-without-accname-empty-alt"]:o["img-without-accname-no-alt"];break;case"input":if(u.CommonUtil.attributeNonEmpty(t,"type")){var p=t.getAttribute("type").trim().toLowerCase();if(null==(i=o[p]))switch(p){case"checkbox":i=u.CommonUtil.attributeNonEmpty(t,"aria-pressed")?o["checkbox-with-aria-pressed"]:o["checkbox-without-aria-pressed"];break;case"email":i=u.CommonUtil.attributeNonEmpty(t,"list")?o["email-with-list"]:o["email-no-list"];break;case"search":i=u.CommonUtil.attributeNonEmpty(t,"list")?o["search-with-list"]:o["search-no-list"];break;case"tel":i=u.CommonUtil.attributeNonEmpty(t,"list")?o["tel-with-list"]:o["tel-no-list"];break;case"text":i=u.CommonUtil.attributeNonEmpty(t,"list")?o["text-with-list"]:o["text-no-list"];break;case"url":i=u.CommonUtil.attributeNonEmpty(t,"list")?o["url-with-list"]:o["url-no-list"];break;default:i=u.CommonUtil.attributeNonEmpty(t,"list")?o["default-with-list"]:o["default-no-list"]}}else i=u.CommonUtil.attributeNonEmpty(t,"list")?o["text-with-list"]:o["text-no-list"];break;case"li":o=l.ARIADefinitions.documentConformanceRequirementSpecialTags.li,i=t.parentElement&&e.hasRoleInSemantics(t.parentElement,"list")?o["child-of-list-role"]:o["no-child-of-list-role"];break;case"section":var h=e.getAriaLabel(t);i=h&&h.trim().length>0||u.CommonUtil.attributeNonEmpty(t,"title")?o["with-name"]:o["without-name"];break;case"select":o=l.ARIADefinitions.documentConformanceRequirementSpecialTags.select,i=t.hasAttribute("multiple")||u.CommonUtil.attributeNonEmpty(t,"size")&&t.getAttribute("size")>1?o["multiple-attr-size-gt1"]:o["no-multiple-attr-size-gt1"];break;case"summary":o=l.ARIADefinitions.documentConformanceRequirementSpecialTags.summary,i=t.parentElement&&"details"===t.parentElement.nodeName.toLowerCase()&&m.DOMUtil.sameNode(a([],t.parentElement.children,!0).filter(function(e){return"summary"===e.nodeName.toLowerCase()})[0],t)?o["first-summary-of-detail"]:o["no-first-summary-of-detail"];break;case"tbody":case"td":case"tr":i=null!==e.getAncestorWithRole(t,"table",!0)?o["des-table"]:e.getAncestorWithRole(t,"grid",!0)||e.getAncestorWithRole(t,"treegrid",!0)?o["des-grid"]:o["des-other"];break;case"th":var g=u.CommonUtil.getScopeForTh(t);i=null!==e.getAncestorWithRole(t,"table",!0)?"column"===g?o["des-table-column-scope"]:o["des-table-row-scope"]:null!==e.getAncestorWithRole(t,"grid",!0)||null!==e.getAncestorWithRole(t,"treegrid",!0)?"column"===g?o["des-grid-treegrid-column-scope"]:o["des-grid-treegrid-row-scope"]:o["des-other"];break;case"div":var b=t.parentElement;i=null!==b&&"dl"===b.nodeName.toLowerCase()?o["child-dl"]:o["no-child-dl"];break;default:i=l.ARIADefinitions.documentConformanceRequirementSpecialTags.default}}}return n.CacheUtil.setCache(t,"AriaUtil_ElementAriaProperty",i),i||null},e.getAllowedAriaRoles=function(t,i){var a=n.CacheUtil.getCache(t,"AriaUtil_AllowedAriaRoles",null);if(!a){a=[];var l;if(null!=(l=null!=i?i:e.getElementAriaProperty(t))){null!==l.implicitRole&&u.CommonUtil.concatUniqueArrayItemList(l.implicitRole,a),null!==l.validRoles&&u.CommonUtil.concatUniqueArrayItemList(l.validRoles,a);var r=e.getImplicitRole(t);r&&r.length>0&&u.CommonUtil.concatUniqueArrayItemList(l.validRoles,a)}n.CacheUtil.setCache(t,"AriaUtil_AllowedAriaRoles",a)}return a},e.getAllowedAriaAttributes=function(t,i,r){var o=n.CacheUtil.getCache(t,"AriaUtil_AllowedAriaAttributes",null);if(!o){o=[];var s=a([],i,!0),d=t.tagName.toLowerCase(),c=[];l.ARIADefinitions.elementsAllowedDisabled.indexOf(d)>-1&&(o=u.CommonUtil.concatUniqueArrayItem("aria-disabled",o)),l.ARIADefinitions.elementsAllowedRequired.indexOf(d)>-1&&(o=u.CommonUtil.concatUniqueArrayItem("aria-required",o)),l.ARIADefinitions.elementsAllowedReadOnly.indexOf(d)>-1&&(o=u.CommonUtil.concatUniqueArrayItem("aria-readonly",o));var m=null;if(null!=(m=null!=r&&void 0!==r?r:e.getElementAriaProperty(t))){if(null!==m.implicitRole&&(null==s||0===s.length)&&void 0===m.allowAttributesFromImplicitRole)for(var p=0;p<m.implicitRole.length;p++){var h=l.ARIADefinitions.designPatterns[m.implicitRole[p]];if(null!=h){var g=h.props;u.CommonUtil.concatUniqueArrayItemList(g,o),g=e.getRoleRequiredProperties(m.implicitRole[p],t),u.CommonUtil.concatUniqueArrayItemList(g,o),(v=h.prohibitedProps)&&v.length>0&&u.CommonUtil.concatUniqueArrayItemList(v,c),"separator"===m.implicitRole[p]&&u.CommonUtil.isFocusable(t)&&u.CommonUtil.concatUniqueArrayItemList(["aria-disabled","aria-valuenow","aria-valuemax","aria-valuemin","aria-valuetext"],o)}}if(m.globalAriaAttributesValid){var b=l.ARIADefinitions.globalProperties;u.CommonUtil.concatUniqueArrayItemList(b,o)}}for(m&&m.otherRolesForAttributes&&m.otherRolesForAttributes.length>0&&u.CommonUtil.concatUniqueArrayItemList(m.otherRolesForAttributes,s),p=0;null!==s&&p<s.length;p++){var _=l.ARIADefinitions.designPatterns[s[p]];if(null!=_){if(!m||null===m.implicitRole||!m.implicitRole.includes(s[p])||m.implicitRole.includes(s[p])&&void 0===m.allowAttributesFromImplicitRole){var f=_.props;u.CommonUtil.concatUniqueArrayItemList(f,o),f=e.getRoleRequiredProperties(s[p],t),u.CommonUtil.concatUniqueArrayItemList(f,o)}var v;(v=_.prohibitedProps)&&v.length>0&&u.CommonUtil.concatUniqueArrayItemList(v,c),"separator"===s[p]&&u.CommonUtil.isFocusable(t)&&u.CommonUtil.concatUniqueArrayItemList(["aria-disabled","aria-valuemax","aria-valuemin","aria-valuetext"],o)}}if(s.includes("row")&&null==e.getAncestorWithRole(t,"treegrid",!0)){var A=-1;(A=o.indexOf("aria-level"))>-1&&o.splice(A,1),(A=o.indexOf("aria-setsize"))>-1&&o.splice(A,1),(A=o.indexOf("aria-posinset"))>-1&&o.splice(A,1)}if(m&&m.otherAllowedAriaAttributes&&m.otherAllowedAriaAttributes.length>0){for(var w=[],y=0;y<m.otherAllowedAriaAttributes.length;y++)if((R=m.otherAllowedAriaAttributes[y]).includes("=")){var C=R.split("=");t.getAttribute(C[0])===C[1]&&w.push(C[0])}else w.push(R);w.length>0&&u.CommonUtil.concatUniqueArrayItemList(w,o)}if(m&&m.otherDisallowedAriaAttributes&&m.otherDisallowedAriaAttributes.length>0){var k=[];for(y=0;y<m.otherDisallowedAriaAttributes.length;y++){var R;(R=m.otherDisallowedAriaAttributes[y]).includes("=")?(C=R.split("="),t.getAttribute(C[0])===C[1]&&k.push(C[0])):k.push(R)}k.length>0&&u.CommonUtil.concatUniqueArrayItemList(k,c)}o=u.CommonUtil.reduceArrayItemList(c,o),i&&0!==i.length||null!==m.implicitRole||!m.prohibitedAriaAttributesWhenNoImplicitRole||(o=u.CommonUtil.reduceArrayItemList(m.prohibitedAriaAttributesWhenNoImplicitRole,o)),n.CacheUtil.setCache(t,"AriaUtil_AllowedAriaAttributes",o)}return o},e.getConflictOrOverlappingHtmlAttribute=function(e,t,i){var a=l.ARIADefinitions.relatedAriaHtmlAttributes[e.name];if(a){if(!e||0==e.length||!t||0==t.length)return[];var n=[],r=null;if("conflict"===i){if(!a.conflict||0===Object.keys(a.conflict).length)return null;r=a.conflict}else{if("overlapping"!==i)return null;if(!a.overlapping||0===Object.keys(a.overlapping).length)return null;r=a.overlapping}for(var o=!1,s=!1,u=0;u<r.length;u++)for(var d=r[u].ariaAttributeValue,c=r[u].htmlAttributeNames,m=r[u].htmlAttributeValues,p=0;p<t.length;p++){var h=c.indexOf(t[p].name);if(-1!==h){o=!0;var g=null===m||null===m[h]?null:m[h].split(",");null===d?(null===g||g.includes(t[p].value))&&(n.push({result:"Failed",attr:t[p].name}),s=!0):null===g?d===e.value&&(n.push({result:"Failed",attr:t[p].name}),s=!0):("VALUE"===d&&g.includes("VALUE")&&g[0]!==e.value||d===e.value&&g.includes(t[p].value))&&(n.push({result:"Failed",attr:t[p].name}),s=!0)}}return o&&!s&&n.push({result:"Pass",attr:""}),n}return null},e.containsPresentationalChildrenOnly=function(t){var i=e.getRoles(t,!1);if(i&&0!==i.length||(i=e.getImplicitRole(t)),!i||0===i.length)return!1;for(var a=0;null!==i&&a<i.length;a++){var n=l.ARIADefinitions.designPatterns[i[a]];if(null!=n&&!0===n.presentationalChildren)return!0}return!1},e.shouldBePresentationalChild=function(t){for(var i=o.DOMWalker.parentElement(t);i;){if(e.containsPresentationalChildrenOnly(i))return!0;i=r.ARIAMapper.getAriaOwnedBy(i)||o.DOMWalker.parentElement(i)}return!1},e.areRolesDefined=function(e){if(!e||0===e.length)return null;for(var t=l.ARIADefinitions.designPatterns,i=0,a=e;i<a.length;i++)if(!(a[i].toLowerCase()in t))return!1;return!0},e.getInvalidRoles=function(t){var i=e.getUserDefinedRoles(t);if(!i||0===i.length)return null;if(i&&i.includes("generic"))return["generic"];var a=e.getElementAriaProperty(t),n=e.getAllowedAriaRoles(t,a);if(!n||0===n.length)return i;var l=[];if(n.includes("any"))return[];for(var r=0;r<i.length;r++)n.includes(i[r])||l.includes(i[r])||l.push(i[r]);return l},e.getRolesUndefinedByAria=function(t){if(!t)return null;var i=e.getRoles(t,!1),a=[];if(i&&i.length>0)for(var n=l.ARIADefinitions.designPatterns,r=0;r<i.length;r++)i[r]in n||a.push(i[r]);return a},e.getInvalidAriaAttributes=function(t){var i=e.getUserDefinedRoles(t),a=e.areRolesDefined(i);if(null!==a&&!a)return null;var n=[];i&&0!=i.length||(i=e.getImplicitRole(t));var l=e.getUserDefinedAriaAttributes(t),r=e.getElementAriaProperty(t),o=e.getAllowedAriaAttributes(t,i,r);if(l)for(var s=0;s<l.length;s++){var u=l[s].trim().toLowerCase();o.includes(u)||n.includes(u)||n.push(u)}return n},e.getConflictAriaAndHtmlAttributes=function(t){var i=e.getUserDefinedAriaAttributeNameValuePairs(t),a=e.getUserDefinedHtmlAttributeNameValuePairs(t),n=[];if(i&&i.length>0&&a&&a.length>0)for(var l=function(t){var l=e.getConflictOrOverlappingHtmlAttribute(i[t],a,"conflict");if(null===l)return"continue";l.forEach(function(e){"Failed"===e.result&&n.push({ariaAttr:i[t].name,htmlAttr:e.attr})})},r=0;r<i.length;r++)l(r);return n},e.getDeprecatedAriaRoles=function(t){if(!t)return null;var i=e.getRoles(t,!1),a=[];if(i&&i.length>0)for(var n=l.ARIADefinitions.globalDeprecatedRoles,r=0;r<i.length;r++)n.includes(i[r])&&a.push(i[r]);return a},e.getDeprecatedAriaAttributes=function(t){if(!t)return null;var i=t.attributes,a=[];if(i)for(var n=0;n<i.length;n++){var r=i[n].name;"aria-"===r.substring(0,5)&&a.push(r)}if(0===a.length)return[];var o=[],s=l.ARIADefinitions.globalDeprecatedProperties;for(n=0;n<a.length;n++)s.includes(a[n])&&o.push({role:"any",attribute:a[n]});var u=e.getRoles(t,!1);if(u&&u.length>0)for(n=0;n<u.length;n++){var d=l.ARIADefinitions.designPatterns[u[n]];if(d){var c=d.deprecatedProps;if(c&&c.length>0)for(var m=0;m<a.length;m++)c.includes(a[m])&&o.push({role:u[n],attribute:a[m]})}}return o},e.isNodeInGrid=function(t){return null!=e.getAncestorWithRole(t,"grid")},e.navLinkKeywords=["start","next","prev","previous","contents","index"],e.rulesThatHaveToCheckHidden=["RPT_Elem_UniqueId"],e.ariaAttributeRoleDefaults={alert:{"aria-live":"assertive","aria-atomic":"true"},combobox:{"aria-haspopup":"listbox"},listbox:{"aria-orientation":"vertical"},log:{"aria-live":"polite"},menu:{"aria-orientation":"vertical"},menubar:{"aria-orientation":"horizontal"},meter:{"aria-valuemin":"0","aria-valuemax":"100"},option:{"aria-selected":"false"},progressbar:{"aria-valuemin":"0","aria-valuemax":"100"},scrollbar:{"aria-orientation":"vertical","aria-valuemin":"0","aria-valuemax":"100"},separator:{"aria-orientation":"horizontal","aria-valuemin":"0","aria-valuemax":"100"},slider:{"aria-orientation":"horizontal","aria-valuemin":"0","aria-valuemax":"100"},spinbutton:{},status:{"aria-live":"polite","aria-atomic":"true"},tab:{"aria-selected":"false"},tablist:{"aria-orientation":"horizontal"},toolbar:{"aria-orientation":"horizontal"},tree:{"aria-orientation":"vertical"}},e.ariaAttributeGlobalDefaults={"aria-atomic":"false","aria-autocomplete":"none","aria-busy":"false","aria-checked":void 0,"aria-current":"false","aria-disabled":"false","aria-dropeffect":"none","aria-expanded":void 0,"aria-grabbed":void 0,"aria-haspopup":"false","aria-hidden":void 0,"aria-invalid":"false","aria-live":"off","aria-modal":"false","aria-multiline":"false","aria-multiselectable":"false","aria-orientation":void 0,"aria-pressed":void 0,"aria-readonly":"false","aria-required":"false","aria-selected":void 0,"aria-sort":"none"},e.ariaAttributeImplicitMappings={"aria-autocomplete":{form:function(e){return"off"===e.getAttribute("autocomplete")?"none":"both"},input:function(e){return"off"===e.getAttribute("autocomplete")?"none":"both"},select:function(e){return"off"===e.getAttribute("autocomplete")?"none":"both"},textarea:function(e){return"off"===e.getAttribute("autocomplete")?"none":"both"}},"aria-checked":{input:function(e){return e.hasAttribute("indeterminate")?"mixed":""+e.hasAttribute("checked")},menuitem:function(e){return e.hasAttribute("indeterminate")?"mixed":""+e.hasAttribute("checked")},"*":function(e){if(e.hasAttribute("indeterminate"))return"mixed"}},"aria-disabled":{button:function(e){return e.hasAttribute("disabled")?"true":"false"},fieldset:function(e){return e.hasAttribute("disabled")?"true":"false"},input:function(e){return e.hasAttribute("disabled")?"true":"false"},optgroup:function(e){return e.hasAttribute("disabled")?"true":"false"},option:function(e){return e.hasAttribute("disabled")?"true":"false"},select:function(e){return e.hasAttribute("disabled")?"true":"false"},textarea:function(e){return e.hasAttribute("disabled")?"true":"false"}},"aria-expanded":{details:function(e){return e.getAttribute("open")},dialog:function(e){return e.getAttribute("open")}},"aria-multiselectable":{select:function(e){if(e.hasAttribute("multiple"))return"true"}},"aria-placeholder":{input:function(e){return e.getAttribute("placeholder")},textarea:function(e){return e.getAttribute("placeholder")}},"aria-required":{input:function(e){return e.getAttribute("required")},select:function(e){return e.getAttribute("required")},textarea:function(e){return e.getAttribute("required")}}},e}();t.AriaUtil=p},4919(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.CSSUtil=void 0;var a=i(4566),n=i(7139),l=i(7011),r=i(7507),o=i(3864),s=function(){function e(){}return e.selectorMatchesElem=function(e,t){if(!t||0===t.length||""===t.trim())return!1;try{if("function"==typeof e.matches)return e.matches(t);if("function"==typeof e.webkitMatchesSelector)return e.webkitMatchesSelector(t);if("function"==typeof e.msMatchesSelector)return e.msMatchesSelector(t);if("function"==typeof e.matchesSelector)return e.matchesSelector(t);var i=e.ownerDocument||e.document;if(!i)return!1;var a=i.querySelectorAll(t);return Array.from(a).includes(e)}catch(e){return!1}},e.getComputedStyle=function(e,t){return e?e.ownerDocument.defaultView.getComputedStyle(e,t):null},e.getParsedStylesheetRules=function(e){var t=a.CacheUtil.getCache(e,"RPTUtil_ParsedStylesheetRules",null);if(t)return t;for(var i=[],n=0;n<e.styleSheets.length;++n){var l=e.styleSheets[n];try{if(l&&l.cssRules)for(var r=0;r<l.cssRules.length;++r){var o=l.cssRules[r],s=o.selectorText;if(s){var u=s.match(/^(.*)(:[a-zA-Z-]*)$/),d=!!u,c=d?u[1]:s,m=d?u[2]:"";i.push({fullRuleSelector:s,hasPseudoClass:d,selMain:c,selPseudo:m,style:o.style})}}}catch(e){if(!e.toString().includes("Cannot access rules")&&!e.toString().includes("SecurityError:"))throw e}}return a.CacheUtil.setCache(e,"RPTUtil_ParsedStylesheetRules",i),i},e.fillStyle=function(e,t){for(var i=0;i<t.length;++i){if("all"===t[i]&&t[t[i]]){for(var a=0,n=e;a<n.length;a++){var l=n[a];for(var r in l)delete l[r]}break}r=t[i];for(var o=0,s=e;o<s.length;o++){l=s[o];var u=t.getPropertyPriority(r);if(r in l&&l[r].endsWith("!important")){if("important"!==u||l[r].startsWith("inherit")||l[r].startsWith("unset"))continue;l[r]=t[r]+" !important"}else l[r]=t[r]+("important"===u?" !important":"")}}},e.getDefinedStylesInternal=function(t,i,a){for(var n={},l={},r={},o=0,s=a;o<s.length;o++){var u=s[o];l[u]={},r[u]={}}for(var d=e.getParsedStylesheetRules(t.ownerDocument),c=a.includes(":focus"),m=function(n){if(null!==i&&!i.some(function(e){return!!n.style[e]}))return"continue";var o=n.selPseudo,s=n.hasPseudoClass,u=n.selMain;if(c&&":focus"===o&&(u=u.replace(/([ >][^+~ >]+):focus-within/g,"$1")),e.selectorMatchesElem(t,u))for(var d=0,m=a;d<m.length;d++){var p=m[d],h=l[p],g=r[p];s||e.fillStyle([h,g],n.style),o===p&&e.fillStyle([g],n.style)}},p=0,h=d;p<h.length;p++)m(h[p]);for(var g=0,b=a;g<b.length;g++){u=b[g];var _=l[u],f=r[u];if(e.fillStyle([_,f],t.style),""===u)n[u]=_;else{for(var v={},A=Object.keys(f),w=0;w<A.length;w++){var y=A[w];f[y]!==_[y]&&(v[y]=f[y])}n[u]=v}}return n},e.getDefinedStylesMultiple=function(t,i,n){if(!t)return null;var l={},r=null===i?"all":i.slice().sort().join(","),o=a.CacheUtil.getCache(t,"RPTUtil_DefinedStyles",null);o||(o={});var s=o[r],u=[];if(s){for(var d=0,c=n;d<c.length;d++)void 0!==s[g=c[d]]?l[g]=s[g]:u.push(g);if(0===u.length)return l}else s={},u=n;if(u.length>0){for(var m=e.getDefinedStylesInternal(t,i,u),p=0,h=u;p<h.length;p++){var g;l[g=h[p]]=m[g],s[g]=m[g]}o[r]=s,a.CacheUtil.setCache(t,"RPTUtil_DefinedStyles",o)}return l},e.getDefinedStyles=function(t,i,n){if(!t)return null;var l=null===i?"all":i.slice().sort().join(","),r=n||"",o=a.CacheUtil.getCache(t,"RPTUtil_DefinedStyles",null);o||(o={});var s=o[l];if(s||(s={}),void 0!==s[r])return s[r];var u=e.getDefinedStylesInternal(t,i,[r])[r];return s[r]=u,o[l]=s,a.CacheUtil.setCache(t,"RPTUtil_DefinedStyles",o),u},e.getMediaOrientationTransform=function(e){var t=a.CacheUtil.getCache(e,"RPTUtil_MediaOrientationTransforms",null);if(t)return t;for(var i={},n=0;n<e.styleSheets.length;++n){var l=e.styleSheets[n];try{if(l&&l.cssRules)for(var r=0;r<l.cssRules.length;++r){var o=l.cssRules[r];if(4===o.MEDIA_RULE){var s=o;if(s&&s.media)for(var u=s.media,d=0;d<u.length;d++)if(u.item(d)){var c=u.item(d).toLocaleLowerCase(),m=i[c];m||(m={});for(var p=s.cssRules,h=0;h<p.length;++h)if(1===p[h].STYLE_RULE){var g=p[h],b=g.selectorText;if(b){for(var _={},f=g.style,v=0;v<f.length;++v){var A=f[v],w=A.toLocaleLowerCase();if("transform"===w){if("all"===A&&f[A]){_={};break}_[A]=f[A]}else"rotate"===w&&(_[A]=f[A])}Object.keys(_).length>0&&(m[b]=_)}}Object.keys(m).length>0&&(i[c]=m)}}}}catch(e){if(!e.toString().includes("Cannot access rules")&&!e.toString().includes("SecurityError:"))throw e}}return a.CacheUtil.setCache(e,"RPTUtil_MediaOrientationTransforms",i),i},e.getRotationDegree=function(e){var t=0;try{if(!e)return t;for(var i=(e=e.replaceAll(", ",",")).split(" "),a=0;a<i.length;a++){var n=i[a].trim();if(""!==n)if(n.startsWith("rotate3d")){var l=n.indexOf("("),r=n.indexOf(")");if(-1!==l&&-1!==r){var o=n.substring(l+1,r),s=void 0;if(o&&(s=o.split(",")),s&&4===s.length){if(!(d=s[3]))continue;if((d=d.trim()).endsWith("turn")){var u=d.substring(0,d.length-4);u=parseFloat(u),isNaN(u)||(t=360*u)}else d.endsWith("rad")?(u=d.substring(0,d.length-3),u=parseFloat(u),isNaN(u)||(t=180*u/Math.PI)):d.endsWith("deg")&&(u=d.substring(0,d.length-3),u=parseFloat(u),isNaN(u)||(t+=u))}}}else if(n.startsWith("rotate")||n.startsWith("rotateZ")){if(l=n.indexOf("("),r=n.indexOf(")"),-1!==l&&-1!==r){var d;if(!(d=n.substring(l+1,r)))continue;(d=d.trim()).endsWith("turn")?(u=d.substring(0,d.length-4),u=parseFloat(u),isNaN(u)||(t=360*u)):d.endsWith("rad")?(u=d.substring(0,d.length-3),u=parseFloat(u),isNaN(u)||(t=180*u/Math.PI)):d.endsWith("deg")&&(u=d.substring(0,d.length-3),u=parseFloat(u),isNaN(u)||(t+=u))}}else if(n.startsWith("matrix3d")){if(l=n.indexOf("("),r=n.indexOf(")"),-1!==l&&-1!==r&&(o=n.substring(l+1,r),s=null,o&&(s=o.split(",")),null!==s)){var c=Math.atan2(s[4],s[5]);t+=Math.round(Math.round(180*c/Math.PI))}}else n.startsWith("matrix")&&(l=n.indexOf("("),r=n.indexOf(")"),-1!==l&&-1!==r&&(o=n.substring(l+1,r),s=null,o&&(s=o.split(",")),null!==s&&(c=Math.atan2(s[1],s[0]),t+=Math.round(Math.round(180*c/Math.PI)))))}for(;t>=360;)t-=360}catch(e){throw console.log("Cannot retrieve rotation degree: "+e),e}return t},e.getPixelsFromStyle=function(t,i){if(!t)return 0;var a=t.trim().match(/(-?[\d.]+)([a-z%]*)/);if(null===a)return 0;if(""===a[2]||0===a[1])return 0;var n=e.convertValue2Pixels(a[2],a[1],i);return null===n?n:parseFloat(n)},e.convertValue2Pixels=function(e,t,i){if(0===t)return 0;e||(e="px");var a={px:function(e){return e},cm:function(e){return 37.8*e},mm:function(e){return 3.78*e},q:function(e){return.95*e},in:function(e){return 96*e},pc:function(e){return 16*e},pt:function(e){return 1.33*e},rem:function(e){return e*parseFloat(getComputedStyle(i.ownerDocument.documentElement).getPropertyValue("font-size"))},em:function(e){return e*parseFloat(getComputedStyle(i).getPropertyValue("font-size"))},vw:function(e){return e/100*i.ownerDocument.defaultView.innerWidth},vh:function(e){return e/100*i.ownerDocument.defaultView.innerHeight},"%":function(e){return e/100*parseFloat(getComputedStyle(i).getPropertyValue("font-size"))}};return e in a?a[e](t):null},e.isMaterialIconFont=function(t){var i={"Material Icons":"https://fonts.googleapis.com/icon?family=Material+Icons"},a=e.getDefinedStyles(t,["font-family"])["font-family"],n=!1;if(a&&a.split(",")[0].replace(/['"]+/g,"").trim()in i&&(n=!0),!n){var l=t.classList;for(var r in{"material-icons":"https://fonts.googleapis.com/icon?family=Material+Icons"})if(l.contains(r)){n=!0;break}}if(!n)return!1;for(var o=!1,s=t.ownerDocument.styleSheets,u=0;u<s.length;u++)if(s&&s.length>0&&Object.values(i).indexOf(s[u].href)>-1){o=!0;break}return o},e.getWeightNumber=function(e){var t={light:100,bold:700};return parseInt(e)||(e in t?t[e]:400)},e.getFontInPixels=function(t,i){var a=parseFloat(t);if(!a)return{"xx-small":16,"x-small":10,small:13,medium:16,large:18,"x-large":24,"xx-large":32}[t];var n=t.substring((""+a).length);return e.convertValue2Pixels(n,a,i)},e.getCSSStyle=function(e){var t="";if(null===e)return[];if(e.IBM_CSS_THB)return e.IBM_CSS_THB;if("style"===e.nodeName.toLowerCase())void 0!==(t=e.innerText)&&""!==t.trim()||(t=e.textContent);else{if(!e.hasAttribute("style"))return[];t=e.getAttribute("style")}if(null===t||0===t.trim().length)return[];var i=/\s*([^:\s]+)\s*:\s*([^;$}]+)\s*(;|$)/g,a=/\s*([^{]*){([^}]*)}/g;if(-1===(t=t.replace(/(\/\*+(?:(?:(?:[^\*])+)|(?:[\*]+(?!\/)))[*]+\/)|\/\/.*/g," ")).indexOf("{")){for(var n={},l=void 0;null!=(l=i.exec(t));)n[l[1]]=l[2].trim().toLowerCase();var r=[{selector:null,values:n}];return e.IBM_CSS_THB=r,r}r=[],l=void 0;for(var o=void 0;null!=(l=a.exec(t));){n={};for(var s=l[1],u=l[2];null!=(o=i.exec(u));)n[o[1]]=o[2].trim().toLowerCase();r.push({selector:s,values:n})}return e.IBM_CSS_THB=r,r},e.getInlineStatus=function(e){if(!e)return null;var t=getComputedStyle(e);if(!t)return null;var i={inline:!1,text:!1,violation:null};if("inline"!==t.getPropertyValue("display"))return i;i.inline=!0;var a=e.parentElement;if(!a)return i;var l=new r.DOMMapper,o=l.getUnadjustedBounds(e),s=getComputedStyle(a).getPropertyValue("display");if("block"!==s&&"inline-block"!==s)return n.CommonUtil.isInnerTextOnlyEmpty(a)||(i.text=!0),i;function u(e,t){if(e.nodeType===Node.TEXT_NODE)return e.nodeValue&&e.nodeValue.trim().length>0?"yes":"no";if(e.nodeType===Node.ELEMENT_NODE){if("br"===e.nodeName.toLowerCase())return"block";if("inline"===getComputedStyle(e).getPropertyValue("display")){if(n.CommonUtil.isTarget(e)&&o.width<24){var a=l.getUnadjustedBounds(e);return t&&Math.round(o.width/2)+o.left-a.left<24||!t&&Math.round(o.width/2)+o.left-(a.left+a.width)<24?(i.violation=e.nodeName.toLowerCase(),"violation"):"no"}return n.CommonUtil.isInnerTextOnlyEmpty(e)?"no":"yes"}return"block"}return"block"}for(var d=e.nextSibling;d;){if("yes"===(c=u(d,!0))){i.text=!0;break}if("block"===c)break;d=d.nextSibling}for(d=e.previousSibling;d;){var c;if("yes"===(c=u(d,!1))){i.text=!0;break}if("block"===c)break;d=d.previousSibling}return i},e.isTargetBrowserDefault=function(t){if(!t)return!1;var i=l.AriaUtil.getRoles(t,!1);if(i&&i.length>0)return!1;var a=e.getDefinedStyles(t,["line-height","height","width","min-height","min-width","font-size","margin-top","margin-bottom","margin-left","margin-right"]);return!(a["line-height"]||a.height||a.width||a["min-height"]||a["min-width"]||a["font-size"]||a["margin-top"]||a["margin-bottom"]||a["margin-left"]||a["margin-right"])},e.containsCKJ=function(e){return!!e&&e.trim().replace(/(?:[\u4e00-\u9fff\u3400-\u4dbf])+/g,"").length!==e.trim().length},e.getAncestorWithStyles=function(t,i,n){void 0===n&&(n=[]);var l="AriaUtil_AncestorWithStyles_"+JSON.stringify(i)+"_"+JSON.stringify(n),r=a.CacheUtil.getCache(t,l,null);if(null!==r)return"NOT_FOUND"===r?null:r;for(var s=t;null!==s;)if(1===s.nodeType&&"http://www.w3.org/2000/svg"!==s.namespaceURI){var u=e.getDefinedStyles(s,Object.keys(i));for(var d in i){var c=u[d];if(c&&(c=c.split(" ")[0],!n.includes(c))){var m=i[d];if(m.includes("*"))return a.CacheUtil.setCache(t,l,s),s;if(m.includes(c))return a.CacheUtil.setCache(t,l,s),s}}s=o.DOMWalker.parentElement(s)}else s=o.DOMWalker.parentElement(s);return a.CacheUtil.setCache(t,l,"NOT_FOUND"),null},e.getValueUnitPair=function(e){if(!e)return null;if(Number.isInteger(e))return["px",e];var t=parseInt(e);if(isNaN(t))return null;var i=(e=e.trim().toLowerCase()).trim().match(/([a-z]+)$/),a="px";return i&&(a=i[1]),[a,t]},e}();t.CSSUtil=s},4566(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.CacheUtil=void 0;var a=i(3864),n=function(){function e(){}return e.getCache=function(e,t,i){if(e){var a=(9===e.nodeType||e.nodeType,e);return void 0===a.aceCache&&(a.aceCache={}),void 0===a.aceCache[t]&&(a.aceCache[t]=i),a.aceCache[t]}},e.setCache=function(e,t,i){if(e){var a=(9===e.nodeType||e.nodeType,e);return void 0===a.aceCache&&(a.aceCache={}),a.aceCache[t]=i,i}},e.getSetCache=function(e,t,i){if(e){var a=(9===e.nodeType||e.nodeType,e);return void 0===a.aceCache&&(a.aceCache={}),void 0!==a.aceCache[t]&&void 0!==a.aceCache[t]||(a.aceCache[t]=i()),a.aceCache[t]}},e.clearCaches=function(e){var t=0;delete e.ownerDocument.aceCache;var i=new a.DOMWalker(e,!1,e,!0);do{++t,delete i.node.aceCache,i.node.ownerDocument&&delete i.node.ownerDocument.aceCache}while(i.nextNode());return t},e}();t.CacheUtil=n},167(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.ClipPathUtil=void 0;var a=i(4566),n=i(4919),l=function(){function e(){}return e.isNodeVisuallyHiddenByClipPath=function(t){if(!t||1!==t.nodeType)return!1;var i=t,l=a.CacheUtil.getCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",void 0);if(void 0!==l)return l;var r=n.CSSUtil.getComputedStyle(i),o=parseInt(r.width),s=parseInt(r.height),u=r["clip-path"];if(!u||"none"===u.trim()||""===u.trim())return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;var d=(u=u.trim().replace(/\s+/g," ").toLowerCase()).indexOf("inset(");if(-1!==d){var c=u.indexOf("round"),m=u.substring(u.indexOf("(")+1,u.indexOf(")"));if(-1!==c&&(m=u.substring(u.indexOf("(")+1,c)),1===(f=m.trim().split(" ")).length){var p=e.isClippedByInset(i,f[0],f[0],f[0],f[0]);return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",p),p}if(2===f.length)return p=e.isClippedByInset(i,f[0],f[1],f[0],f[1]),a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",p),p;if(3===f.length)return p=e.isClippedByInset(i,f[0],f[1],f[1],f[2]),a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",p),p;if(4===f.length)return p=e.isClippedByInset(i,f[0],f[1],f[2],f[3]),a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",p),p}if(-1!==(d=u.indexOf("rect("))){c=u.indexOf("round"),m=u.substring(u.indexOf("(")+1,u.indexOf(")")),-1!==c&&(m=u.substring(u.indexOf("(")+1,c)),"auto"===(f=m.trim().split(" "))[0]&&(f[0]="0px"),"auto"===f[3]&&(f[3]="0px"),"auto"===f[1]&&(f[1]="100%"),"auto"===f[2]&&(f[2]="100%"),f[2]=Math.max(f[0],f[2]),f[1]=Math.max(f[1],f[3]);var h=parseInt(f[0]);if(isNaN(h))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;if(f[0].endsWith("%"))h=h*s/100;else{if(!(L=n.CSSUtil.getValueUnitPair(h)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;h=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}if(h>=s)return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;var g=parseInt(f[3]);if(isNaN(g))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;if(f[3].endsWith("%"))g=g*o/100;else{if(!(L=n.CSSUtil.getValueUnitPair(g)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;g=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}if(g>=o)return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;var b=parseInt(f[1]);if(isNaN(b))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;if(f[1].endsWith("%"))b=b*o/100;else{if(!(L=n.CSSUtil.getValueUnitPair(b)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;b=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}var _=parseInt(f[2]);if(isNaN(_))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;if(f[2].endsWith("%"))_=_*s/100;else{if(!(L=n.CSSUtil.getValueUnitPair(_)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;_=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}return _-h<=e.THRESHOLD||b-g<=e.THRESHOLD?(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!0),!0):(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1)}if(-1!==(d=u.indexOf("xywh("))){c=u.indexOf("round"),m=u.substring(u.indexOf("(")+1,u.indexOf(")")),-1!==c&&(m=u.substring(u.indexOf("(")+1,c));var f=m.trim().split(" "),v=parseInt(f[0]);if(isNaN(v))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;if(f[0].endsWith("%"))v=v*o/100;else{if(!(L=n.CSSUtil.getValueUnitPair(top)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;v=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}if(v>=o)return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;var A=parseInt(f[1]);if(isNaN(A))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;if(f[1].endsWith("%"))A=A*s/100;else{if(!(L=n.CSSUtil.getValueUnitPair(A)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;scrollY=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}if(A>=s)return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;var w=parseInt(f[2]);if(isNaN(w))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;if(f[2].endsWith("%"))w=w*o/100;else{if(!(L=n.CSSUtil.getValueUnitPair(w)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;w=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}if(w<=e.THRESHOLD)return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!0),!0;var y=parseInt(f[3]);if(isNaN(y))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;if(f[3].endsWith("%"))y=y*s/100;else{if(!(L=n.CSSUtil.getValueUnitPair(y)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;y=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}return y<=e.THRESHOLD?(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!0),!0):(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1)}if(-1!==(d=u.indexOf("circle("))){f=(m=u.substring(u.indexOf("(")+1,u.indexOf(")"))).trim().split(" ");var C=parseInt(f[0]);if(isNaN(C))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;if(f[0].endsWith("%"))C=C*(o>s?s:o)/100;else{if(!(L=n.CSSUtil.getValueUnitPair(C)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;C=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}return C<=e.THRESHOLD?(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!0),!0):(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1)}if(-1!==(d=u.indexOf("ellipse("))){if((f=(m=u.substring(u.indexOf("(")+1,u.indexOf(")"))).trim().split(" ")).length>3&&"closest-side"===f[0]&&"farthest-side"===f[1]&&"at"===f[2]){if(C=parseInt(f[3]),4===f.length){if(f[3].endsWith("%"))C=C*(N=o>s?s:o)/100;else{if(!(L=n.CSSUtil.getValueUnitPair(C)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;C=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}return C<=e.THRESHOLD?(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!0),!0):(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1)}if(5===f.length)for(var k=3;k<f.length;k++){var R=parseInt(f[k]);if(f[k].endsWith("%"))R=R*(N=3===k?o:s)/100;else{if(!(L=n.CSSUtil.getValueUnitPair(R)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;R=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}return R<=e.THRESHOLD?(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!0),!0):(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1)}return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1}var x=u.indexOf("at");if(m=u.substring(u.indexOf("(")+1,u.indexOf(")")),-1!==x&&(m=u.substring(u.indexOf("(")+1,x)),2!==(f=m.trim().split(" ")).length)return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;for(k=0;k<f.length;k++){if(C=parseInt(f[k]),f[k].endsWith("%"))C=C*(N=0===k?o:s)/100;else{if(!(L=n.CSSUtil.getValueUnitPair(C)))return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;C=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}return C<=e.THRESHOLD?(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!0),!0):(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1)}return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1}if(-1!==(d=u.indexOf("polygon("))){"nonzero"!==(f=(m=u.substring(u.indexOf("(")+1,u.indexOf(")"))).trim().split(","))[0]&&"evenodd"!==f[0]||f.shift(),A=0,v=0;var P=!1,T=!1;for(k=0;k<f.length;k++){var U=f[k].trim().split(" ");if(2!=U.length)return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1;for(var I=[0,0],E=0;E<2;E++){var N=parseInt(U[E]);if(isNaN(N))return!1;if(U[E].endsWith("%"))I[E]=0===E?N*o/100:N*s/100;else{var L;if(!(L=n.CSSUtil.getValueUnitPair(U[E])))return!1;I[E]=n.CSSUtil.convertValue2Pixels(L[0],L[1],i)}}0===k&&(v=I[0],A=I[1]),Math.abs(I[0]-v)>=e.THRESHOLD&&(P=!0),Math.abs(I[1]-A)>=e.THRESHOLD&&(T=!0)}return P&&T?(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1):(a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!0),!0)}return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN_CLIPPATH",!1),!1},e.isClippedByInset=function(t,i,a,l,r){void 0===a&&(a="0px"),void 0===l&&(l="0px"),void 0===r&&(r="0px");var o=n.CSSUtil.getComputedStyle(t),s=parseInt(o.width),u=parseInt(o.height),d=parseInt(i);if(isNaN(d))return!1;if(i.endsWith("%"))d=d*u/100;else{if(!(h=n.CSSUtil.getValueUnitPair(i)))return!1;d=n.CSSUtil.convertValue2Pixels(h[0],h[1],t)}if(d>u)return!1;var c=parseInt(a);if(isNaN(c))return!1;if(a.endsWith("%"))c=c*s/100;else{if(!(h=n.CSSUtil.getValueUnitPair(a)))return!1;c=n.CSSUtil.convertValue2Pixels(h[0],h[1],t)}if(c>s)return!1;var m=parseInt(l);if(isNaN(m))return!1;if(l.endsWith("%"))m=m*u/100;else{if(!(h=n.CSSUtil.getValueUnitPair(l)))return!1;m=n.CSSUtil.convertValue2Pixels(h[0],h[1],t)}if(m>u)return!1;var p=parseInt(r);if(isNaN(p))return!1;if(r.endsWith("%"))p=p*s/100;else{var h;if(!(h=n.CSSUtil.getValueUnitPair(r)))return!1;p=n.CSSUtil.convertValue2Pixels(h[0],h[1],t)}return!(p>s)&&(u-(d+m)<=e.THRESHOLD||s-(c+p)<=e.THRESHOLD)},e.THRESHOLD=5,e}();t.ClipPathUtil=l},3883(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.ColorObj=t.ColorUtil=void 0;var a=i(3864),n=function(){function e(){}return e.Color=function(t){if(!t)return null;if("transparent"===(t=t.toLowerCase()))return new l(255,255,255,0);if(t in e.CSSColorLookup&&(t=e.CSSColorLookup[t]),t.startsWith("rgb(")){var i=/\s*rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/;return null===(a=t.match(i))?null:new l(a[1],a[2],a[3])}var a;if(t.startsWith("rgba("))return i=/\s*rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(.+)\s*\)/,null===(a=t.match(i))?null:new l(a[1],a[2],a[3],a[4]);if("#"!=t.charAt(0))return null;4===t.length&&(t="#"+t.charAt(1).repeat(2)+t.charAt(2).repeat(2)+t.charAt(3).repeat(2));var n=parseInt(t.substring(1,3),16),r=parseInt(t.substring(3,5),16),o=parseInt(t.substring(5,7),16);return new l(n,r,o)},e.ColorCombo=function(t){try{var i=t.ownerDocument;if(!i)return null;var n=i.defaultView;if(!n)return null;for(var l=[],r=t;r;)1===r.nodeType&&l.push(r),r=a.DOMWalker.parentElement(r);var o={hasGradient:!1,hasBGImage:!1,textShadow:!1,fg:null,bg:null},s=(b=n.getComputedStyle(t)).color;s||(s="black");for(var u=e.Color(s),d=/transparent|rgba?\([^)]+\)/gi,c=function(e,t,i){try{if(void 0===e.length)return e;for(var a=null,n=null,l=1;l<e.length;++l){for(var r=e[l-1],o=i.contrastRatio(e[l-1]),s=.1,u=0;s>1e-4;){for(;u+s<=1&&o>i.contrastRatio(e[l].mix(e[l-1],u+s).getOverlayColor(t));)r=e[l].mix(e[l-1],u+s).getOverlayColor(t),o=i.contrastRatio(r),u+=s;for(;u-s>=0&&o>i.contrastRatio(e[l].mix(e[l-1],u-s).getOverlayColor(t));)r=e[l].mix(e[l-1],u-s).getOverlayColor(t),o=i.contrastRatio(r),u-=s;s/=10}(null===n||n>o)&&(n=o,a=r)}return a}catch(e){console.log(e)}return t},m=e.Color("white"),p=null,h=null,g=null;l.length>0;){var b,_=l.pop();if(null!==(b=n.getComputedStyle(_))){var f=null;if(b.backgroundColor&&"transparent"!=b.backgroundColor&&"rgba(0, 0, 0, 0)"!=b.backgroundColor&&(f=e.Color(b.backgroundColor)),b.backgroundImage&&b.backgroundImage.indexOf&&-1!=b.backgroundImage.indexOf("gradient")){var v=b.backgroundImage.match(d);if(v){for(var A=[],w=0;w<v.length;++w)if(v[w].length){var y=e.Color(v[w]);if(void 0!==y.alpha&&y.alpha<1){var C=g||m;y=y.getOverlayColor(C)}A.push(y)}else v.splice(w--,1);f=c(A,g||m,u)}}null===p||b.opacity&&b.opacity.length>0&&parseFloat(b.opacity)<1?(null!=g&&(g.alpha=p*h,m=g.getOverlayColor(m)),p=1,h=null,g=null,b.opacity&&b.opacity.length>0&&(p=parseFloat(b.opacity)),null!=f&&(h=(g=f).alpha||1,delete g.alpha,1===p&&1===h&&(o.hasBGImage=!1,o.hasGradient=!1))):null!=f&&(null===g?(h=(g=f).alpha||1,delete g.alpha):h=(g=f.getOverlayColor(g)).alpha||1,1===p&&1===h&&1===(g.alpha||1)&&f.alpha),b.backgroundImage&&"none"!=b.backgroundImage&&(b.backgroundImage.indexOf&&-1!=b.backgroundImage.indexOf("gradient")?o.hasGradient=!0:o.hasBGImage=!0)}}return null!=g&&delete(u=u.getOverlayColor(g)).alpha,u.alpha=(u.alpha||1)*p,u=u.getOverlayColor(m),null!=g&&(g.alpha=p*h,m=g.getOverlayColor(m)),o.fg=u,o.bg=m,b.textShadow&&"none"!==b.textShadow&&(o.textShadow=!0),o}catch(e){return null}},e.CSSColorLookup={aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",green:"#008000",greenyellow:"#adff2f",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgrey:"#d3d3d3",lightgreen:"#90ee90",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370d8",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#d87093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32",buttontext:"rgba(0, 0, 0, 0.847)",buttonface:"#ffffff",graytext:"rgba(0, 0, 0, 0.247)"},e}();t.ColorUtil=n;var l=function(){function e(e,t,i,a){function n(e){if("string"!=typeof e)return e;var t=e;return"%"!=(t=t.trim())[t.length-1]?parseInt(t):Math.round(2.55*parseFloat(t.substring(0,t.length-1)))}this.red=n(e),this.green=n(t),this.blue=n(i),void 0!==a&&(this.alpha="string"==typeof a?parseFloat(a):a)}return e.prototype.toHexHelp=function(e){var t=Math.round(e).toString(16);return 1===t.length?"0"+t:t},e.prototype.toHex=function(){return"#"+this.toHexHelp(this.red)+this.toHexHelp(this.green)+this.toHexHelp(this.blue)},e.prototype.contrastRatio=function(e){var t=this;void 0!==this.alpha&&(t=this.getOverlayColor(e));var i=t.relativeLuminance();if(!e.relativeLuminance){var a="";for(var n in e)a+=n+"\n";alert(e),alert(a)}var l=e.relativeLuminance();return i>l?(i+.05)/(l+.05):(l+.05)/(i+.05)},e.prototype.relativeLuminance=function(){var e=this.red/255,t=this.green/255,i=this.blue/255;return.2126*(e=e<=.04045?e/12.92:Math.pow((e+.055)/1.055,2.4))+.7152*(t=t<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4))+.0722*(i<=.04045?i/12.92:Math.pow((i+.055)/1.055,2.4))},e.prototype.mix=function(t,i){if(void 0===this.alpha&&void 0===t.alpha)return new e(i*this.red+(1-i)*t.red,i*this.green+(1-i)*t.green,i*this.blue+(1-i)*t.blue);var a=this.alpha?this.alpha:1,n=t.alpha?t.alpha:1;return new e(i*this.red+(1-i)*t.red,i*this.green+(1-i)*t.green,i*this.blue+(1-i)*t.blue,i*a+(1-i)*n)},e.prototype.getOverlayColor=function(e){if(void 0===this.alpha||this.alpha>=1)return this;if(this.alpha<0)return null;if(void 0!==e.alpha&&e.alpha<1)return null;var t=this.mix(e,this.alpha);return delete t.alpha,t},e.fromCSSColor=function(t){var i=-1,a=-1,l=-1;if((t=t.toLowerCase()).startsWith("rgb(")){var r=/\s*rgb\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/;if(null===(o=t.match(r)))return null;i=o[1],a=o[2],l=o[3]}else if(t.startsWith("rgba(")){var o;if(r=/\s*rgba\s*\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(.+)\s*\)/,null===(o=t.match(r)))return null;i=o[1],a=o[2],l=o[3]}else{if("#"!=t.charAt(0)){if(!(t in n.CSSColorLookup))return null;t=n.CSSColorLookup[t]}var s=function(e){for(var t={a:10,b:11,c:12,d:13,e:14,f:15},i=0,a=0;a<e.length;++a)i=16*i+parseInt(e.charAt(a)in t?t[e.charAt(a)]:e.charAt(a));return i};4===t.length&&(t="#"+t.charAt(1).repeat(2)+t.charAt(2).repeat(2)+t.charAt(3).repeat(2)),i=s(t.substring(1,3)),a=s(t.substring(3,5)),l=s(t.substring(5,7))}return new e(i,a,l)},e}();t.ColorObj=l},7139(e,t,i){var a=this&&this.__spreadArray||function(e,t,i){if(i||2===arguments.length)for(var a,n=0,l=t.length;n<l;n++)!a&&n in t||(a||(a=Array.prototype.slice.call(t,0,n)),a[n]=t[n]);return e.concat(a||Array.prototype.slice.call(t))};Object.defineProperty(t,"__esModule",{value:!0}),t.CommonUtil=void 0;var n=i(9910),l=i(4566),r=i(7011),o=i(1950),s=i(3946),u=i(1686),d=i(3864),c=i(5279),m=function(){function e(){}return e.wordCount=function(e){return 0===(e=e.trim()).length?0:e.split(/\s+/g).length},e.isTabbable=function(t){if(!s.VisUtil.isNodeVisible(t))return!1;if(t.hasAttribute("inert")||u.DOMUtil.getAncestorWithAttribute(t,"inert",""))return!1;if(t.hasAttribute("tabindex"))return parseInt(t.getAttribute("tabindex"))>=0;var i=t.nodeName.toLowerCase();if(i in e.tabTagMap){var a=e.tabTagMap[i];return"function"==typeof a&&(a=a(t)),a}return!!t.hasAttribute("contenteditable")},e.isFocusable=function(t){return"undefined"!==t&&null!==t&&e.isTabbable(t)},e.isClickable=function(t){if(!s.VisUtil.isNodeVisible(t))return!1;var i=t.nodeName.toLowerCase();if(i in e.tabTagMap){var a=e.tabTagMap[i];return"function"==typeof a&&(a=a(t)),a}return!(!r.AriaUtil.isWidget(t)||!t.hasAttribute("tabindex"))},e.isTableDescendant=function(e){return e?e.aria.filter(function(e){return["table","grid","treegrid"].includes(e.role)}):null},e.tabIndexLEZero=function(t){if(e.hasAttribute(t,"tabindex")&&t.getAttribute("tabindex").match(/^-?\d+$/)){var i=parseInt(t.getAttribute("tabindex"));return 0===i||-1===i}return!1},e.getTabbableChildren=function(t){var i=0;if(t.firstChild||"IFRAME"===t.nodeName.toUpperCase())for(var a=new d.DOMWalker(t);a.nextNode()&&a.node!=t;)1==a.node.nodeType&&!a.bEndTag&&e.isTabbable(a.node)&&++i;return i},e.normalizeSpacing=function(e){return e?e.trim().replace(/\s+/g," "):""},e.isHtmlEquiv=function(e,t){var i=!1;if(e&&"input"===e.nodeName.toLowerCase()){var a=e.getAttribute("type").toLowerCase();a&&(-1!=t.indexOf("checkbox")?i="checkbox"===a:-1!=t.indexOf("radio")&&(i="radio"===a))}return i},e.nonExistantIDs=function(t,i){var a="";if(e.normalizeSpacing(i).length<1)return a;for(var n=i.split(" "),l=t.ownerDocument,r=0;r<n.length;r++){var o="//*[@id='"+n[r]+"']";l.evaluate(o,t,l.defaultNSResolver,0,null).iterateNext()||(a+=n[r]+", ")}return e.normalizeSpacing(a).length>=2?a.substring(0,a.length-2):""},e.getDocElementsByTag=function(e,t){var i=c.FragmentUtil.getOwnerFragment(e);t=t.toLowerCase();var a=l.CacheUtil.getCache(i,"RPT_DOCELEMSBYTAG",{});return t in a||(a[t]=i.querySelectorAll(t),l.CacheUtil.setCache(i,"RPT_DOCELEMSBYTAG",a)),a[t]},e.getChildByTag=function(t,i){return e.getChildByTagHidden(t,i,!1,!1)},e.getChildByTagHidden=function(t,i,a,n){for(var l=[],r=t.firstChild;null!=r;){if(r.nodeName.toLowerCase()===i){if((a||n&&!e.shouldCheckHiddenContent(r))&&!s.VisUtil.isNodeVisible(r)){r=r.nextSibling;continue}l.push(r)}r=r.nextSibling}return l},e.getElementsByRole=function(t,i){return e.getElementsByRoleHidden(t,i,!1,!1)},e.getElementsByRoleHidden=function(t,i,a,n){var o=null;if(null===(o=n?l.CacheUtil.getCache(t,"AriaUtil_GETELEMENTSBY_ROLE_IMPLICIT",null):l.CacheUtil.getCache(t,"AriaUtil_GETELEMENTSBY_ROLE",null))){o={};for(var s=t.body;null!==d.DOMWalker.parentNode(s);)s=d.DOMWalker.parentNode(s);for(var u=new d.DOMWalker(s);u.nextNode();)if(u.elem()&&!u.bEndTag){var c=[];if(u.elem()&&u.elem().hasAttribute("role")&&(c=u.elem().getAttribute("role").split(" ")),u.elem()&&0===c.length&&n){var m=r.AriaUtil.getImplicitRole(u.node);null!==m&&m.length>0&&(c=m)}if(0===c.length)continue;if(a&&e.shouldNodeBeSkippedHidden(u.node))continue;for(var p=0;p<c.length;++p)c[p]in o||(o[c[p]]=[]),o[c[p]].push(u.node)}n?l.CacheUtil.setCache(t,"AriaUtil_GETELEMENTSBY_ROLE_IMPLICIT",o):l.CacheUtil.setCache(t,"AriaUtil_GETELEMENTSBY_ROLE",o)}var h=[];if("string"==typeof i){var g=i;(i=[]).push(g)}if(i.length)for(p=0;p<i.length;++p){var b=o[i[p]];if(b)for(var _=0;_<b.length;++_)h.push(b[_])}return h},e.isTarget=function(t){if(!t||1!==t.nodeType||["html","body"].includes(t.nodeName.toLowerCase())||null!==e.getAncestor(t,["svg","pre","code","script","meta","head"])||!s.VisUtil.isNodeVisible(t)||s.VisUtil.isNodeVisuallyHidden(t)||e.isNodeDisabled(t)||s.VisUtil.isElementOffscreen(t))return!1;if(e.isClickable(t))return!0;var i=r.AriaUtil.getResolvedRole(t);if(!i)return!1;if(["listitem","menuitem","menuitemcheckbox","menuitemradio","option","radio","switch","treeitem"].includes(i)){var a=t.parentElement;if(a&&"group"===r.AriaUtil.getResolvedRole(a)&&(a=a.parentElement),a&&e.isTarget(a))return!0}return!1},e.getFileExt=function(e){var t=e.match(/\.(([^;?#\.]|^$)+)([;?#]|$)/);return null!=t&&t.length>=2?"."+t[1]:""},e.getFileAnchor=function(e){var t=e.match(/#(([^;?\.]|^$)+)([;?]|$)/);return null!=t&&t.length>=2?t[1]:""},e.checkObjEmbed=function(t,i,a){var n=t.nodeName.toLowerCase();if("object"!=n&&"embed"!=n&&"a"!=n&&"area"!=n)return!1;var l=!1;if(!l&&t.hasAttribute("type")&&(l=a(t.getAttribute("type").toLowerCase())),!l&&t.hasAttribute("codetype")&&(l=a(t.getAttribute("codetype"))),!l){var r="";"embed"===n?r=t.getAttribute("src"):"a"===n||"area"===n?r=t.getAttribute("href"):t.hasAttribute("data")&&(r=t.getAttribute("data")),null===r&&(r=""),l=i(e.getFileExt(r))}if(!l&&"object"===n)for(var o=e.getChildByTagHidden(t,"param",!1,!0),s=0;!l&&null!=o&&s<o.length;++s)l=o[s].hasAttribute("value")&&i(e.getFileExt(o[s].getAttribute("value")));return l},e.isAudioObjEmbedLink=function(t){return e.checkObjEmbed(t,e.isAudioExt,function(e){return e.startsWith("audio")})},e.isAudioExt=function(t){return e.valInArray(t.toLowerCase(),[".aif",".aifc",".aiff",".air",".asf",".au",".cda",".dsm",".dss",".dwd",".iff",".kar",".m1a",".med",".mp2",".mp3",".mpa",".pcm",".ra",".ram",".rm",".sam",".sf",".sf2",".smp",".snd",".svx",".ul",".voc",".wav",".wma",".wve"])},e.isVideoObjEmbedLink=function(t){return e.checkObjEmbed(t,e.isVideoExt,function(e){return e.startsWith("video")||e.startsWith("application/x-shockwave-flash")})},e.isVideoExt=function(t){return e.valInArray(t.toLowerCase(),[".asf",".avi",".divx",".dv",".m1v",".m2p",".m2v",".moov",".mov",".mp4",".mpeg",".mpg",".mpv",".ogm",".omf",".qt",".rm",".rv",".smi",".smil",".swf",".vob",".wmv",".rmvb",".mvb"])},e.isImageObjEmbedLink=function(t){return e.checkObjEmbed(t,e.isImgExt,function(e){return e.startsWith("image")})},e.isImgExt=function(t){return e.valInArray(t.toLowerCase(),e.image_extensions)},e.isHtmlExt=function(t){return e.valInArray(t.toLowerCase(),[".asp",".aspx",".cfm",".cfml",".cgi",".htm",".html",".shtm",".shtml",".php",".pl",".py",".shtm",".shtml",".xhtml"])},e.hasTriggered=function(e,t){return l.CacheUtil.getCache(e,t,!1)},e.triggerOnce=function(e,t,i){if(i)return!0;var a=l.CacheUtil.getCache(e,t,!1);return l.CacheUtil.setCache(e,t,!0),a},e.valInArray=function(e,t){for(var i in t)if(t[i]===e)return!0;return!1},e.getAncestor=function(e,t){for(var i=e;null!==i;){var a=i.nodeName.toLowerCase();if("string"==typeof t){if(a===t.toLowerCase())break}else if(t.length){for(var n in t)if(t[n]===a)return i}else if(a in t)break;i=d.DOMWalker.parentNode(i)}return i},e.isSibling=function(e,t){if(e&&t){var i=null;for(d.DOMWalker.parentNode(e)&&d.DOMWalker.parentNode(e).firstChild&&(i=d.DOMWalker.parentNode(e).firstChild);i;){if(i===t)return!0;i=i.nextSibling}}return!1},e.isDescendant=function(e,t){for(var i=d.DOMWalker.parentNode(t);null!=i;){if(i===e)return!0;i=d.DOMWalker.parentNode(i)}return!1},e.isDisabledByFirstChildFormElement=function(t){var i=["input","textarea","select","keygen","progress","meter","output"];if(null!=t.firstChild)for(var a=new d.DOMWalker(t);a.nextNode();)if(i.includes(a.node.nodeName.toLowerCase()))return!!e.isNodeDisabled(a.node);return!1},e.isDisabledByReferringElement=function(t){for(var i=t.getAttribute("id"),a=t.ownerDocument.body;null!==d.DOMWalker.parentNode(a);)a=d.DOMWalker.parentNode(a);for(var n=new d.DOMWalker(a);n.nextNode();)if(n.node&&1===n.node.nodeType&&n.elem()&&(n.elem().getAttribute("aria-describedby")||"").split(" ").includes(i)&&e.isNodeDisabled(n.node))return!0},e.getInputLabel=function(t){return e.getLabelForElement(t)},e.getLabelForElement=function(t){return e.getLabelForElementHidden(t,!1)},e.getLabelForElementHidden=function(t,i){var a=t.getRootNode();if(!l.CacheUtil.getCache((a.nodeType,a),"AriaUtil_LABELS",null)){for(var n={},r=e.getDocElementsByTag(t,"label"),o=0;o<r.length;++o)if(r[o].hasAttribute("for")){if(i&&!s.VisUtil.isNodeVisible(r[o]))continue;n[r[o].getAttribute("for")]=r[o]}l.CacheUtil.setCache((a.nodeType,a),"AriaUtil_LABELS",n)}if(t.hasAttribute("id")){var u=t.getAttribute("id");if(u.trim().length>0)return l.CacheUtil.getCache((a.nodeType,a),"AriaUtil_LABELS",{})[u]}return null},e.getElementAttribute=function(e,t){if(!(t&&e&&e.hasAttribute&&e.hasAttribute(t)))return null;var i=e.getAttribute(t);if(!n.ARIADefinitions.referenceProperties.includes(t))return i;for(var a=i.split(/ +/g),l=!1,r=0;a<a.length;++r){var o=document.getElementById(a[r]);if(o&&!u.DOMUtil.sameNode(o,e)){l=!0;break}}return l?i:null},e.hasImplicitLabel=function(t){var i=e.getAncestor(t,"label");if(i&&"label"===i.tagName.toLowerCase()&&e.isFirstFormElement(i,t)){var a=i.cloneNode(!0);return a=e.removeAllFormElementsFromLabel(a),e.hasInnerContentHidden(a)}return!1},e.getImplicitLabel=function(t){var i=e.getAncestor(t,"label");if(i&&"label"===i.tagName.toLowerCase()&&e.isFirstFormElement(i,t)){var a=i.cloneNode(!0);a=e.removeAllFormElementsFromLabel(a);var n=e.getInnerText(a);return n&&""!==n.trim()?n.trim():null}return null},e.getFormFieldLabel=function(t){var i="",a=null,n=e.getLabelForElementHidden(t,!0);if(n)a=n.innerText;else{if(!(n=e.getAncestor(t,"label"))||"label"!==n.tagName.toLowerCase()||!e.isFirstFormElement(n,t))return null;var l=n.cloneNode(!0);l=e.removeAllFormElementsFromLabel(l),a=e.getInnerText(l)}return a&&""!==a.trim()&&(i+=a.trim()),(a=e.getLabelTextFromAttribute(n,!0))&&""!==a.trim()&&(i+=a.trim()),(a=r.AriaUtil.getAriaLabel(n))&&""!==a.trim()&&(i+=a.trim()),i.trim()},e.getLabelTextFromAttribute=function(t,i){for(var a=null,n=0;n<t.children.length;n++){var l=t.children.item(n);if(e.form_labelable_elements.includes(l.nodeName.toLowerCase())){a=l;break}}for(var c=new d.DOMWalker(t),m="";c.nextNode()&&c.node!==t;)if(c.node&&1===c.node.nodeType&&c.elem()){var p=c.elem();if(i&&(s.VisUtil.isNodeHiddenFromAT(p)||s.VisUtil.isNodePresentational(p))||a&&a.contains(p))continue;var h=r.AriaUtil.getResolvedRole(p);if("textbox"===h){var g=p.getAttribute("value");g&&g.trim().length>0&&(m+=" "+g.trim())}else if("combobox"===h||"listbox"===h){var b=p.getAttribute("aria-activedescendant")||p.getAttribute("aria-selected")||p.getAttribute("aria-checked");if(b){var _=p.ownerDocument.getElementById(b);if(_&&!u.DOMUtil.sameNode(p,_)){var f=o.AccNameUtil.computeAccessibleName(_);f&&f.name&&(m+=" "+f.name.trim())}}}else if(["progressbar","scrollbar","slider","spinbutton","meter"].includes(h)){var v=p.getAttribute("aria-valuetext");v&&v.trim().length>0&&(m+=" "+v.trim()),(v=p.getAttribute("aria-valuenow"))&&v.trim().length>0&&(m+=" "+v.trim()),(v=p.getAttribute("value"))&&v.trim().length>0&&(m+=" "+v.trim())}var A=r.AriaUtil.getAriaLabel(p);A&&""!==A.trim()&&(m+=" "+A.trim())}return m.trim()},e.isFirstFormElement=function(t,i){if(null!=t.firstChild)for(var a=new d.DOMWalker(t);a.nextNode();)if(-1!==e.form_labelable_elements.indexOf(a.node.nodeName.toLowerCase()))return a.node===i;return!1},e.isShadowHostElement=function(t){if(e.isShadowElement(t))return!1;for(var i=t;i;){if(i.shadowRoot)return!0;i=d.DOMWalker.parentElement(i)}return!1},e.isShadowElement=function(e){return"[object ShadowRoot]"===e.getRootNode().toString()},e.removeAllFormElementsFromLabel=function(e){for(var t=["input","textarea","select","button","datalist","optgroup","option","keygen","output","progress","meter"],i=e.childNodes,a=0;a<i.length;a++)t.indexOf(i[a].nodeName.toLowerCase())>-1&&e.removeChild(i[a]);return e},e.isIdReferToSelf=function(e,t){if(!t||""===t.trim())return!1;for(var i=t.trim().split(" "),a=0,n=i.length;a<n;++a){var l=c.FragmentUtil.getById(e,i[a]);if(l&&u.DOMUtil.sameNode(l,e))return!0}return!1},e.nodeDepth=function(e){for(var t=0,i=e;null!==i;)i=d.DOMWalker.parentNode(i),t+=1;return t},e.compareNodeOrder=function(t,i){if(t===i)return 0;var a=e.nodeDepth(t),n=e.nodeDepth(i);if(n>a){for(var l=0;l<n-a;++l)i=d.DOMWalker.parentNode(i);if(t===i)return-2}else if(a>n){for(l=0;l<a-n;++l)t=d.DOMWalker.parentNode(t);if(t===i)return 2}for(;null!=t&&null!=i&&d.DOMWalker.parentNode(t)!=d.DOMWalker.parentNode(i);)t=d.DOMWalker.parentNode(t),i=d.DOMWalker.parentNode(i);if(null===t||null===i||d.DOMWalker.parentNode(t)!=d.DOMWalker.parentNode(i))return null;for(;null!=i&&i!=t;)i=i.previousSibling;return null===i?1:-1},e.attributeNonEmpty=function(e,t){return e.hasAttribute(t)&&e.getAttribute(t).trim().length>0},e.getFrameByName=function(e,t){for(var i=[e.ownerDocument.defaultView],a=0;a<i.length;){try{if(i[a].name===t)return i[a];for(var n=0;n<i[a].frames.length;++n)try{i[a].frames[n]&&!i.includes(i[a].frames[n])&&i.push(i[a].frames[n])}catch(e){}}catch(e){}++a}return null},e.defaultNSResolver=function(e){var t;switch(e){case"html":t="http://www.w3.org/1999/xhtml";case"x2":t="http://www.w3.org/TR/xhtml2";case"x":t="http://www.w3.org/1999/xhtml";case"xhtml":t="http://www.w3.org/1999/xhtml";default:t=null}return t},e.isInnerTextOnlyEmpty=function(t){var i=t.innerText;null!=i&&0!==i.trim().length||"slot"===t.nodeName.toLowerCase()||void 0===t.textContent||(i=t.textContent);var a=!(null!==i&&i.trim().length>0);if(1===t.nodeType&&"slot"===t.nodeName.toLowerCase())for(var n=0,l=t.assignedNodes();n<l.length;n++){var r=l[n];a=a&&e.isInnerTextEmpty(r)}return a},e.getInnerText=function(e){var t=e.innerText;return null!=t&&""!==t.trim()||(t=e.textContent),t},e.getOnScreenInnerText=function(t){if(!t)return null;if(3===t.nodeType)return t.nodeValue();for(var i="",a=new d.DOMWalker(t);a.nextNode()&&a.node!==t&&a.node!==t.parentNode;)if(!a.bEndTag){if(1===a.node.nodeType&&(s.VisUtil.hiddenByDefaultElements.includes(a.node.nodeName.toLowerCase())||!s.VisUtil.isNodeVisible(a.node)||s.VisUtil.isElementOffscreen(a.node))){if("title"===a.node.nodeName.toLowerCase()&&e.getAncestor(a.node,"svg"))continue;if(a.node.nextSibling){3===a.node.nextSibling.nodeType&&a.node.nextSibling.nodeValue&&""!==a.node.nextSibling.nodeValue.trim()&&(i+=" "+a.node.nextSibling.nodeValue.trim()),a.node=a.node.nextSibling;continue}break}3===a.node.nodeType&&a.node.nodeValue&&""!==a.node.nodeValue.trim()&&(i+=" "+a.node.nodeValue.trim())}return i.trim()},e.getNodeText=function(e){if(!e)return"";for(var t="",i=e.childNodes,a=0;a<i.length;++a)3==i[a].nodeType&&(t+=i[a].nodeValue);return t},e.isInnerTextEmpty=function(t){var i=e.getInnerText(t);return!(null!=i&&i.trim().length>0)},e.hasInnerContent=function(t){var i=e.getInnerText(t),a=null!==i&&i.trim().length>0;if(null!==t.firstChild)for(var n=new d.DOMWalker(t);!a&&n.nextNode();)a="img"===n.node.nodeName.toLowerCase()&&e.attributeNonEmpty(n.node,"alt");return a},e.hasInnerContentHidden=function(t){return e.hasInnerContentHiddenHyperLink(t,!1)},e.svgHasName=function(t){return e.attributeNonEmpty(t,"aria-label")||e.attributeNonEmpty(t,"aria-labelledby")||!!t.querySelector(":scope > title")},e.hasInnerContentHiddenHyperLink=function(t,i){if(!t)return!1;var a=!1;if(null!=t.firstElementChild)for(var n=new d.DOMWalker(t);!a&&n.nextNode()&&n.node!=t;){var l=n.node;if(!((a="img"===l.nodeName.toLowerCase()&&(e.attributeNonEmpty(l,"alt")||e.attributeNonEmpty(l,"title"))&&!s.VisUtil.isNodeHiddenFromAT(l)&&!s.VisUtil.isNodePresentational(l)||"svg"===l.nodeName.toLowerCase()&&e.svgHasName(l))||1!==l.nodeType||s.VisUtil.isNodeHiddenFromAT(l)||s.VisUtil.isNodePresentational(l)||(a=!e.isInnerTextOnlyEmpty(l))||!0!==i)){a=e.attributeNonEmpty(l,"aria-label")||e.attributeNonEmpty(l,"aria-labelledby");var r=l.ownerDocument;if(r){var o=r.defaultView;if(o){var u=o.getComputedStyle(l);a||null==u||(a=(u.backgroundImage&&u.backgroundImage.indexOf||u.content)&&e.attributeNonEmpty(l,"alt"))}}}3===l.nodeType&&d.DOMWalker.parentElement(l)===t&&(a=!e.isInnerTextEmpty(l))}else a=!e.isInnerTextEmpty(t);return a},e.hasInnerContentOrAlt=function(t){var i=e.getInnerText(t),a=null!=i&&i.trim().length>0||e.attributeNonEmpty(t,"alt");if(null!=t.firstChild)for(var n=new d.DOMWalker(t);!a&&n.nextNode()&&n.node!=t;)!(a="img"===n.node.nodeName.toLowerCase()&&e.attributeNonEmpty(n.node,"alt"))&&(r.AriaUtil.hasRole(n.node,"button",!0)||r.AriaUtil.hasRole(n.node,"textbox"))&&(r.AriaUtil.hasAriaLabel(n.node)||e.attributeNonEmpty(n.node,"title")||e.getLabelForElementHidden(n.elem(),!0))&&(a=!0);return a},e.concatUniqueArrayItem=function(e,t){return-1===t.indexOf(e)&&null!==e&&t.push(e),t},e.concatUniqueArrayItemList=function(t,i){for(var a=0;null!==t&&a<t.length;a++)i=e.concatUniqueArrayItem(t[a],i);return i},e.reduceArrayItemList=function(e,t){return t&&t.length>0&&e&&e.length>0?t.filter(function(t){return!e.includes(t)}):t},e.getScopeForTh=function(e){if(e.hasAttribute("scope")){var t=e.getAttribute("scope").toLowerCase();if("row"===t||"rowgroup"===t)return"row";if("col"===t||"colgroup"===t)return"column"}var i=a([],e.parentElement.children,!0).filter(function(e){return 1===e.nodeType&&"th"!=e.tagName.toLowerCase()});return null===i||0===i.length?"column":"row"},e.getControlOfLabel=function(t){var i=e.getAncestor(t,"label");if(i&&i.hasAttribute("for"))return c.FragmentUtil.getById(t,i.getAttribute("for"));for(var a={},n=t;n;){if(1===n.nodeType){var r=n;r.hasAttribute("id")&&(a[r.getAttribute("id")]=!0)}n=d.DOMWalker.parentNode(n)}if(0===Object.keys(a).length)return null;for(var o=1===t.nodeType?t.getAttribute("aria-labelledby"):null,s=l.CacheUtil.getSetCache(t.ownerDocument,"CommonUtil::getControlOfLabel",function(){return t.ownerDocument.querySelectorAll("*[aria-labelledby]")}),u=0;u<s.length;++u)for(var m=s[u],p=0,h=m.getAttribute("aria-labelledby").split(" ");p<h.length;p++)if(h[p]in a&&!e.isIdReferToSelf(t,o))return m;return null},e.isNodeDisabled=function(t){var i=l.CacheUtil.getCache(t,"PT_NODE_DISABLED",void 0);if(void 0!==i)return i;i=!1,3===t.nodeType&&(t=d.DOMWalker.parentNode(t));var a=t.nodeName.toLowerCase(),r=t.hasAttribute("disabled"),o=i,s=t.hasAttribute("aria-disabled")&&"true"===t.getAttribute("aria-disabled");if(o||r&&n.ARIADefinitions.elementsAllowedDisabled.indexOf(a)>-1||s)return i=!0,l.CacheUtil.setCache(t,"PT_NODE_DISABLED",i),!0;var u=d.DOMWalker.parentNode(t);if(null!=u&&1===u.nodeType){var c=e.isNodeDisabled(u);return c&&(i=!0),l.CacheUtil.setCache(t,"PT_NODE_DISABLED",i),c}return!1},e.shouldCheckHiddenContent=function(e){return!1},e.shouldNodeBeSkippedHidden=function(t){return!e.shouldCheckHiddenContent(t)&&!s.VisUtil.isNodeVisible(t)},e.isfocusableByDefault=function(t){return!("a"!==t.nodeName.toLowerCase()||!e.hasAttribute(t,"href"))||!("area"!==t.nodeName.toLowerCase()||!e.hasAttribute(t,"href"))||-1!==["input","select","button","textarea","option","area"].indexOf(t.nodeName.toLowerCase())},e.nonTabableChildCheck=function(t){if(!t.hasAttribute("tabindex")||-1!=parseInt(t.getAttribute("tabindex")))return!1;for(var i=new d.DOMWalker(t);i.nextNode();){var a=i.elem();if(null!==a&&a.hasAttribute("tabindex")&&-1!=parseInt(a.getAttribute("tabindex"))&&!e.hasInnerContent(a))return!1}return!0},e.hasAttribute=function(e,t){var i=!1;if(e.hasAttribute)i=e.hasAttribute(t);else if(e.attributes&&e.attributes.getNamedItem){var a=e.attributes.getNamedItem(t);i=a&&a.specified}return i},e.truncateText=function(e,t){return void 0===t&&(t=150),e&&(e=e.trim()).length>t?e.substring(0,t-1)+"...":e},e.input_type_with_placeholder=["text","search","tel","url","email","password","number"],e.input_text_types=["text","file","password","checkbox","radio","search","tel","url","email","date","number","range","time","color"],e.input_time_types=["date","month","week","time","datetime-local"],e.input_other_types=["range","color","checkbox","radio","file","image"],e.form_button_types=["button","reset","submit"],e.form_labelable_elements=["input","textarea","select","keygen","progress","meter","output","button"],e.tabTagMap={button:function(e){return!e.hasAttribute("disabled")},iframe:!0,input:function(e){if(e.hasAttribute("disabled")||"hidden"===e.getAttribute("type"))return!1;if("radio"===e.getAttribute("type")){var t=e.getAttribute("name");if(!t||0===t.trim().length)return!0;var i=e.ownerDocument.querySelectorAll("input[type='radio'][name='"+t.trim()+"']");if(0===i.length||1===i.length)return!0;for(var a=null,n=0;n<i.length;n++)i[n].checked&&(a=i[n]);return null!==a?!!u.DOMUtil.sameNode(a,e):!!u.DOMUtil.sameNode(i[0],e)}return!0},select:function(e){return!e.hasAttribute("disabled")},textarea:function(e){return!e.hasAttribute("disabled")&&"hidden"!==e.getAttribute("type")},a:function(e){return e.hasAttribute("href")},area:function(e){return e.hasAttribute("href")},audio:function(e){return e.hasAttribute("controls")},video:function(e){return e.hasAttribute("controls")},summary:function(e){return e.parentElement&&"details"===e.parentElement.nodeName.toLowerCase()&&u.DOMUtil.sameNode(a([],e.parentElement.children,!0).filter(function(e){return"summary"===e.nodeName.toLowerCase()})[0],e)},details:function(e){return e.children&&0===a([],e.children,!0).filter(function(e){return"summary"===e.nodeName.toLowerCase()}).length}},e.image_extensions=[".bmp",".gif",".jpg",".jpeg",".pcx",".png"],e}();t.CommonUtil=m},9196(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.TableUtil=void 0;var a=i(3946),n=i(7011),l=i(7139),r=function(){function e(){}return e.isDataTable=function(e){return!(n.AriaUtil.hasRole(e,"none")||n.AriaUtil.hasRole(e,"presentation"))},e.isComplexDataTable=function(t){if("AriaUtil_isComplexDataTable"in t)return!!t.AriaUtil_isComplexDataTable;var i=!1;if(t&&e.isDataTable(t)){for(var a=null,n=null,r=t.getElementsByTagName("tr"),o=r.length,s=0,u=0,d=0,c=0;!i&&c<o;++c)if(a=r[c].getElementsByTagName("th"),n=r[c].getElementsByTagName("td"),u=a.length,0!==(s=n.length)){i=u>1;for(var m=0;!i&&m<u;++m)i=(a[m].hasAttribute("rowspan")||a[m].hasAttribute("colspan"))&&l.CommonUtil.getAncestor(a[m],"table")===t;for(var p=0;!i&&p<s;++p)i=(n[p].hasAttribute("rowspan")||n[p].hasAttribute("colspan")||n[p].hasAttribute("headers")&&l.CommonUtil.normalizeSpacing(n[p].getAttribute("headers")).split(" ").length>2)&&l.CommonUtil.getAncestor(n[p],"table")===t}else u>0&&++d,i=2===d;if(!i){var h=t.getElementsByTagName("thead"),g=h.length;g>0&&((i=g>1)||(i=h[0].getElementsByTagName("tr").length>1))}i||0===o||(i=u>0&&!e.tableHeaderExists(t))}return t.AriaUtil_isComplexDataTable=i,i},e.isTableCellEmpty=function(e){return!e||!a.VisUtil.isNodeVisible(e)||0===e.innerHTML.replace(/&nbsp;/g," ").trim().length},e.isTableRowEmpty=function(t){if(!t||!t.cells||0===t.cells.length||!a.VisUtil.isNodeVisible(t))return!0;for(var i=!0,n=0;i&&n<t.cells.length;n++){var l=t.cells[n];i=e.isTableCellEmpty(l)}return i},e.tableHeaderExists=function(t){var i=t.rows;if(!i||0===i.length)return null;for(var a=!0,n=i[0],r=0;a&&r<i.length;r++)(n=i[r]).parentNode&&"tfoot"===n.parentNode.nodeName.toLowerCase()||(a=e.isTableRowEmpty(n));if(a)return null;for(a=!0,r=0;a&&r<n.cells.length;r++){var o=n.cells[r];a=e.isTableCellEmpty(o)||"th"===o.nodeName.toLowerCase()}if(a)return!0;a=!0;for(var s=0;a&&s<i.length;++s)i[s].parentNode&&"tfoot"===i[s].parentNode.nodeName.toLowerCase()||(a=!i[s].cells||0===i[s].cells.length||0===i[s].cells[0].innerHTML.trim().length||"td"!=i[s].cells[0].nodeName.toLowerCase());if(a)return!0;a=!0;var u=[],d=[];for(r=0;a&&r<i.length;r++)for(var c=i[r],m=0;m<c.cells.length;m++)o=c.cells[m],e.isTableCellEmpty(o)||("td"===o.nodeName.toLowerCase()?o.getAttribute("headers")&&0!==o.getAttribute("headers").trim().length?l.CommonUtil.concatUniqueArrayItemList(o.getAttribute("headers").trim().split(" "),d):a=!1:"th"===o.nodeName.toLowerCase()&&o.getAttribute("id")&&o.getAttribute("id").trim().length>0&&l.CommonUtil.concatUniqueArrayItem(o.getAttribute("id").trim(),u));return!!(a&&u.length>0&&d.every(function(e){return u.includes(e)}))},e.isLayoutTable=function(e){return n.AriaUtil.hasRole(e,"presentation")||n.AriaUtil.hasRole(e,"none")},e.isTableDescendant=function(e){return e?e.aria.filter(function(e){return["table","grid","treegrid"].includes(e.role)}):null},e}();t.TableUtil=r},3946(e,t,i){Object.defineProperty(t,"__esModule",{value:!0}),t.VisUtil=void 0;var a=i(4566),n=i(1686),l=i(3864),r=i(7507),o=i(7011),s=i(4919),u=i(167),d=function(){function e(){}return e.isNodeVisible=function(t){3===t.nodeType&&(t=l.DOMWalker.parentNode(t));var i,n=t;if(1!==n.nodeType)return!0;if(!n.ownerDocument)return!0;var r=n.nodeName.toLowerCase();if(null!=e.hiddenByDefaultElements&&null!=e.hiddenByDefaultElements&&e.hiddenByDefaultElements.indexOf(r)>-1)return!1;var o=a.CacheUtil.getCache(n,"PT_NODE_HIDDEN",void 0);if(void 0!==o)return o;if(o=a.CacheUtil.setCache(n,"PT_NODE_HIDDEN",!1),null===e.unhideableElements||void 0===e.unhideableElements||-1===e.unhideableElements.indexOf(r)){if(!n.ownerDocument.defaultView)return a.CacheUtil.setCache(n,"PT_NODE_HIDDEN",!0);i=n.ownerDocument.defaultView.getComputedStyle(n,null);var s=n.getAttribute("hidden"),d=o,c="boolean"==typeof n.hidden&&n.hidden;if(!i&&!c&&null==s&&!d)return a.CacheUtil.setCache(n,"PT_NODE_HIDDEN",!0);if(null!==i&&("none"===i.getPropertyValue("display")||!a.CacheUtil.getCache(n,"Visibility_Check_Parent",null)&&"hidden"===i.getPropertyValue("visibility"))||"block"!==i.getPropertyValue("display")&&(c||null!=s||d))return a.CacheUtil.setCache(n,"PT_NODE_HIDDEN",!1);if(e.isContentHidden(n))return a.CacheUtil.setCache(n,"PT_NODE_HIDDEN",!1);if(u.ClipPathUtil.isNodeVisuallyHiddenByClipPath(n))return a.CacheUtil.setCache(n,"PT_NODE_HIDDEN",!1)}var m=l.DOMWalker.parentNode(n);if(null!=m&&1===m.nodeType){a.CacheUtil.setCache(m,"Visibility_Check_Parent",!0);var p=e.isNodeVisible(m);return a.CacheUtil.setCache(n,"PT_NODE_HIDDEN",p)}return a.CacheUtil.setCache(n,"PT_NODE_HIDDEN",!0)},e.isNodeVisuallyHidden=function(t){if(!t||1!==t.nodeType)return!1;var i=t,n=a.CacheUtil.getCache(i,"PT_NODE_VISUALLY_HIDDEN",void 0);if(void 0===n){var r=s.CSSUtil.getComputedStyle(i);if("absolute"===r.position&&r.clip&&"rect(0px,0px,0px,0px)"===r.clip.replaceAll(" ","")||r.opacity&&parseFloat(r.opacity)<.1)return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN",!0),!0;var o=l.DOMWalker.parentElement(i);if(!o)return!1;var u=e.isNodeVisuallyHidden(o);return a.CacheUtil.setCache(i,"PT_NODE_VISUALLY_HIDDEN",u),u}return n},e.isContentHidden=function(e){if(!e)return!1;var t=a.CacheUtil.getCache(e,"PT_NODE_ContentHidden",void 0);if(void 0!==t)return t;var i=getComputedStyle(e);return i?"hidden"!==i.getPropertyValue("content-visibility")||"inline"===i.getPropertyValue("display")?(a.CacheUtil.setCache(e,"PT_NODE_ContentHidden",!1),!1):(a.CacheUtil.setCache(e,"PT_NODE_ContentHidden",!0),!0):(a.CacheUtil.setCache(e,"PT_NODE_ContentHidden",!1),!1)},e.isElementOffscreen=function(e){if(!e)return!0;if(1!==e.nodeType)return!1;var t=a.CacheUtil.getCache(e,"PT_NODE_Offscreen",void 0);if(void 0!==t)return t;var i=(new r.DOMMapper).getUnadjustedBounds(e);return i?0===i.height||0===i.width||i.top+i.height<=0||i.left+i.width<=0?(a.CacheUtil.setCache(e,"PT_NODE_Offscreen",!0),!0):(a.CacheUtil.setCache(e,"PT_NODE_Offscreen",!1),!1):(a.CacheUtil.setCache(e,"PT_NODE_Offscreen",!0),!0)},e.isNodeHiddenFromAT=function(t){if(!t)return!1;var i=a.CacheUtil.getCache(t,"PT_NODE_HiddenFromAT",void 0);return void 0!==i?i:e.isNodeVisible(t)&&"true"!==t.getAttribute("aria-hidden")?n.DOMUtil.getAncestorWithAttribute(t,"aria-hidden","true")?(a.CacheUtil.setCache(t,"PT_NODE_HiddenFromAT",!0),!0):(a.CacheUtil.setCache(t,"PT_NODE_HiddenFromAT",!1),!1):(a.CacheUtil.setCache(t,"PT_NODE_HiddenFromAT",!0),!0)},e.isNodePresentational=function(e){var t=o.AriaUtil.getResolvedRole(e);return!(!t||"none"!==t&&"presentation"!==t)},e.isElementScrollable=function(e){if(!e)return!1;var t=s.CSSUtil.getComputedStyle(e);if(!t)return!1;var i=t.getPropertyValue("overflow-x"),a=t.getPropertyValue("overflow-y");if("visible"!==i||"hidden"!==a&&"scroll"!==a&&"auto"!==a||(i="auto"),"visible"!==a||"hidden"!==i&&"scroll"!==i&&"auto"!==i||(a="auto"),"clip"===i&&"visible"!==a&&"clip"!==a&&(i="hidden"),"clip"===a&&"visible"!==i&&"clip"!==i&&(a="hidden"),!("visible"!==i&&"hidden"!==i&&"clip"!==i||"visible"!==a&&"hidden"!==a&&"clip"!==a))return!1;if(Math.max(e.offsetWidth,e.offsetHeight)<30||Math.min(e.offsetWidth,e.offsetHeight)<15)return!1;var n=s.CSSUtil.getPixelsFromStyle(t.paddingLeft,e)+s.CSSUtil.getPixelsFromStyle(t.paddingRight,e),l=s.CSSUtil.getPixelsFromStyle(t.paddingTop,e)+s.CSSUtil.getPixelsFromStyle(t.paddingBottom,e);return!(e.scrollWidth-e.clientWidth<1+n&&e.scrollHeight-e.clientHeight<1+l)},e.unhideableElements=["area","param","audio"],e.hiddenByDefaultElements=["script","link","style","head","meta","base","noscript","template","datalist"],e}();t.VisUtil=d},8855(e){e.exports=JSON.parse('{"1.1.1":{"num":"1.1.1","url":"https://www.w3.org/TR/WCAG22/#non-text-content","scId":"WCAG2:non-text-content","scAltId":["text-equiv-all"],"test":"WCAG2:text-equiv-all","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#non-text-content","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/non-text-content.html","handle":"Non-text Content","level":"A","wcagType":"2.0"},"1.2.1":{"num":"1.2.1","url":"https://www.w3.org/TR/WCAG22/#audio-only-and-video-only-prerecorded","scId":"WCAG2:audio-only-and-video-only-prerecorded","scAltId":["media-equiv-av-only-alt"],"test":"WCAG2:media-equiv-av-only-alt","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-only-and-video-only-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-only-and-video-only-prerecorded.html","handle":"Audio-only and Video-only (Prerecorded)","level":"A","wcagType":"2.0"},"1.2.2":{"num":"1.2.2","url":"https://www.w3.org/TR/WCAG22/#captions-prerecorded","scId":"WCAG2:captions-prerecorded","scAltId":["media-equiv-captions"],"test":"WCAG2:media-equiv-captions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#captions-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/captions-prerecorded.html","handle":"Captions (Prerecorded)","level":"A","wcagType":"2.0"},"1.2.3":{"num":"1.2.3","url":"https://www.w3.org/TR/WCAG22/#audio-description-or-media-alternative-prerecorded","scId":"WCAG2:audio-description-or-media-alternative-prerecorded","scAltId":["media-equiv-audio-desc"],"test":"WCAG2:media-equiv-audio-desc","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-description-or-media-alternative-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-description-or-media-alternative-prerecorded.html","handle":"Audio Description or Media Alternative (Prerecorded)","level":"A","wcagType":"2.0"},"1.2.4":{"num":"1.2.4","url":"https://www.w3.org/TR/WCAG22/#captions-live","scId":"WCAG2:captions-live","scAltId":["media-equiv-real-time-captions"],"test":"WCAG2:media-equiv-real-time-captions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#captions-live","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/captions-live.html","handle":"Captions (Live)","level":"AA","wcagType":"2.0"},"1.2.5":{"num":"1.2.5","url":"https://www.w3.org/TR/WCAG22/#audio-description-prerecorded","scId":"WCAG2:audio-description-prerecorded","scAltId":["media-equiv-audio-desc-only"],"test":"WCAG2:media-equiv-audio-desc-only","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-description-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-description-prerecorded.html","handle":"Audio Description (Prerecorded)","level":"AA","wcagType":"2.0"},"1.2.6":{"num":"1.2.6","url":"https://www.w3.org/TR/WCAG22/#sign-language-prerecorded","scId":"WCAG2:sign-language-prerecorded","scAltId":["media-equiv-sign"],"test":"WCAG2:media-equiv-sign","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#sign-language-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/sign-language-prerecorded.html","handle":"Sign Language (Prerecorded)","level":"AAA","wcagType":"2.0"},"1.2.7":{"num":"1.2.7","url":"https://www.w3.org/TR/WCAG22/#extended-audio-description-prerecorded","scId":"WCAG2:extended-audio-description-prerecorded","scAltId":["media-equiv-extended-ad"],"test":"WCAG2:media-equiv-extended-ad","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#extended-audio-description-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/extended-audio-description-prerecorded.html","handle":"Extended Audio Description (Prerecorded)","level":"AAA","wcagType":"2.0"},"1.2.8":{"num":"1.2.8","url":"https://www.w3.org/TR/WCAG22/#media-alternative-prerecorded","scId":"WCAG2:media-alternative-prerecorded","scAltId":["media-equiv-text-doc"],"test":"WCAG2:media-equiv-text-doc","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#media-alternative-prerecorded","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/media-alternative-prerecorded.html","handle":"Media Alternative (Prerecorded)","level":"AAA","wcagType":"2.0"},"1.2.9":{"num":"1.2.9","url":"https://www.w3.org/TR/WCAG22/#audio-only-live","scId":"WCAG2:audio-only-live","scAltId":["media-equiv-live-audio-only"],"test":"WCAG2:media-equiv-live-audio-only","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-only-live","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-only-live.html","handle":"Audio-only (Live)","level":"AAA","wcagType":"2.0"},"1.3.1":{"num":"1.3.1","url":"https://www.w3.org/TR/WCAG22/#info-and-relationships","scId":"WCAG2:info-and-relationships","scAltId":["content-structure-separation-programmatic"],"test":"WCAG2:content-structure-separation-programmatic","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#info-and-relationships","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/info-and-relationships.html","handle":"Info and Relationships","level":"A","wcagType":"2.0"},"1.3.2":{"num":"1.3.2","url":"https://www.w3.org/TR/WCAG22/#meaningful-sequence","scId":"WCAG2:meaningful-sequence","scAltId":["content-structure-separation-sequence"],"test":"WCAG2:content-structure-separation-sequence","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#meaningful-sequence","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/meaningful-sequence.html","handle":"Meaningful Sequence","level":"A","wcagType":"2.0"},"1.3.3":{"num":"1.3.3","url":"https://www.w3.org/TR/WCAG22/#sensory-characteristics","scId":"WCAG2:sensory-characteristics","scAltId":["content-structure-separation-understanding"],"test":"WCAG2:content-structure-separation-understanding","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#sensory-characteristics","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/sensory-characteristics.html","handle":"Sensory Characteristics","level":"A","wcagType":"2.0"},"1.3.4":{"num":"1.3.4","url":"https://www.w3.org/TR/WCAG22/#orientation","scId":"WCAG2:orientation","scAltId":[],"test":"WCAG2:orientation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#orientation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/orientation.html","handle":"Orientation","level":"AA","wcagType":"2.1"},"1.3.5":{"num":"1.3.5","url":"https://www.w3.org/TR/WCAG22/#identify-input-purpose","scId":"WCAG2:identify-input-purpose","scAltId":[],"test":"WCAG2:identify-input-purpose","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#identify-input-purpose","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/identify-input-purpose.html","handle":"Identify Input Purpose","level":"AA","wcagType":"2.1"},"1.3.6":{"num":"1.3.6","url":"https://www.w3.org/TR/WCAG22/#identify-purpose","scId":"WCAG2:identify-purpose","scAltId":[],"test":"WCAG2:identify-purpose","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#identify-purpose","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/identify-purpose.html","handle":"Identify Purpose","level":"AAA","wcagType":"2.1"},"1.4.1":{"num":"1.4.1","url":"https://www.w3.org/TR/WCAG22/#use-of-color","scId":"WCAG2:use-of-color","scAltId":["visual-audio-contrast-without-color"],"test":"WCAG2:visual-audio-contrast-without-color","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#use-of-color","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/use-of-color.html","handle":"Use of Color","level":"A","wcagType":"2.0"},"1.4.2":{"num":"1.4.2","url":"https://www.w3.org/TR/WCAG22/#audio-control","scId":"WCAG2:audio-control","scAltId":["visual-audio-contrast-dis-audio"],"test":"WCAG2:visual-audio-contrast-dis-audio","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#audio-control","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/audio-control.html","handle":"Audio Control","level":"A","wcagType":"2.0"},"1.4.3":{"num":"1.4.3","url":"https://www.w3.org/TR/WCAG22/#contrast-minimum","scId":"WCAG2:contrast-minimum","scAltId":["visual-audio-contrast-contrast"],"test":"WCAG2:visual-audio-contrast-contrast","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#contrast-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/contrast-minimum.html","handle":"Contrast (Minimum)","level":"AA","wcagType":"2.0"},"1.4.4":{"num":"1.4.4","url":"https://www.w3.org/TR/WCAG22/#resize-text","scId":"WCAG2:resize-text","scAltId":["visual-audio-contrast-scale"],"test":"WCAG2:visual-audio-contrast-scale","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#resize-text","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/resize-text.html","handle":"Resize text","level":"AA","wcagType":"2.0"},"1.4.5":{"num":"1.4.5","url":"https://www.w3.org/TR/WCAG22/#images-of-text","scId":"WCAG2:images-of-text","scAltId":["visual-audio-contrast-text-presentation"],"test":"WCAG2:visual-audio-contrast-text-presentation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#images-of-text","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/images-of-text.html","handle":"Images of Text","level":"AA","wcagType":"2.0"},"1.4.6":{"num":"1.4.6","url":"https://www.w3.org/TR/WCAG22/#contrast-enhanced","scId":"WCAG2:contrast-enhanced","scAltId":["visual-audio-contrast7"],"test":"WCAG2:visual-audio-contrast7","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#contrast-enhanced","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/contrast-enhanced.html","handle":"Contrast (Enhanced)","level":"AAA","wcagType":"2.0"},"1.4.7":{"num":"1.4.7","url":"https://www.w3.org/TR/WCAG22/#low-or-no-background-audio","scId":"WCAG2:low-or-no-background-audio","scAltId":["visual-audio-contrast-noaudio"],"test":"WCAG2:visual-audio-contrast-noaudio","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#low-or-no-background-audio","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/low-or-no-background-audio.html","handle":"Low or No Background Audio","level":"AAA","wcagType":"2.0"},"1.4.8":{"num":"1.4.8","url":"https://www.w3.org/TR/WCAG22/#visual-presentation","scId":"WCAG2:visual-presentation","scAltId":["visual-audio-contrast-visual-presentation"],"test":"WCAG2:visual-audio-contrast-visual-presentation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#visual-presentation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/visual-presentation.html","handle":"Visual Presentation","level":"AAA","wcagType":"2.0"},"1.4.9":{"num":"1.4.9","url":"https://www.w3.org/TR/WCAG22/#images-of-text-no-exception","scId":"WCAG2:images-of-text-no-exception","scAltId":["visual-audio-contrast-text-images"],"test":"WCAG2:visual-audio-contrast-text-images","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#images-of-text-no-exception","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/images-of-text-no-exception.html","handle":"Images of Text (No Exception)","level":"AAA","wcagType":"2.0"},"1.4.10":{"num":"1.4.10","url":"https://www.w3.org/TR/WCAG22/#reflow","scId":"WCAG2:reflow","scAltId":[],"test":"WCAG2:reflow","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#reflow","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/reflow.html","handle":"Reflow","level":"AA","wcagType":"2.1"},"1.4.11":{"num":"1.4.11","url":"https://www.w3.org/TR/WCAG22/#non-text-contrast","scId":"WCAG2:non-text-contrast","scAltId":[],"test":"WCAG2:non-text-contrast","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#non-text-contrast","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/non-text-contrast.html","handle":"Non-text Contrast","level":"AA","wcagType":"2.1"},"1.4.12":{"num":"1.4.12","url":"https://www.w3.org/TR/WCAG22/#text-spacing","scId":"WCAG2:text-spacing","scAltId":[],"test":"WCAG2:text-spacing","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#text-spacing","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/text-spacing.html","handle":"Text Spacing","level":"AA","wcagType":"2.1"},"1.4.13":{"num":"1.4.13","url":"https://www.w3.org/TR/WCAG22/#content-on-hover-or-focus","scId":"WCAG2:content-on-hover-or-focus","scAltId":[],"test":"WCAG2:content-on-hover-or-focus","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#content-on-hover-or-focus","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/content-on-hover-or-focus.html","handle":"Content on Hover or Focus","level":"AA","wcagType":"2.1"},"2.1.1":{"num":"2.1.1","url":"https://www.w3.org/TR/WCAG22/#keyboard","scId":"WCAG2:keyboard","scAltId":["keyboard-operation-keyboard-operable"],"test":"WCAG2:keyboard-operation-keyboard-operable","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#keyboard","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/keyboard.html","handle":"Keyboard","level":"A","wcagType":"2.0"},"2.1.2":{"num":"2.1.2","url":"https://www.w3.org/TR/WCAG22/#no-keyboard-trap","scId":"WCAG2:no-keyboard-trap","scAltId":["keyboard-operation-trapping"],"test":"WCAG2:keyboard-operation-trapping","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#no-keyboard-trap","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/no-keyboard-trap.html","handle":"No Keyboard Trap","level":"A","wcagType":"2.0"},"2.1.3":{"num":"2.1.3","url":"https://www.w3.org/TR/WCAG22/#keyboard-no-exception","scId":"WCAG2:keyboard-no-exception","scAltId":["keyboard-operation-all-funcs"],"test":"WCAG2:keyboard-operation-all-funcs","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#keyboard-no-exception","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/keyboard-no-exception.html","handle":"Keyboard (No Exception)","level":"AAA","wcagType":"2.0"},"2.1.4":{"num":"2.1.4","url":"https://www.w3.org/TR/WCAG22/#character-key-shortcuts","scId":"WCAG2:character-key-shortcuts","scAltId":[],"test":"WCAG2:WCAG2:character-key-shortcuts","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#character-key-shortcuts","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/character-key-shortcuts.html","handle":"Character Key Shortcuts","level":"A","wcagType":"2.1"},"2.2.1":{"num":"2.2.1","url":"https://www.w3.org/TR/WCAG22/#timing-adjustable","scId":"WCAG2:timing-adjustable","scAltId":["time-limits-required-behaviors"],"test":"WCAG2:time-limits-required-behaviors","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#timing-adjustable","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/timing-adjustable.html","handle":"Timing Adjustable","level":"A","wcagType":"2.0"},"2.2.2":{"num":"2.2.2","url":"https://www.w3.org/TR/WCAG22/#pause-stop-hide","scId":"WCAG2:pause-stop-hide","scAltId":["time-limits-pause"],"test":"WCAG2:time-limits-pause","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pause-stop-hide","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pause-stop-hide.html","handle":"Pause, Stop, Hide","level":"A","wcagType":"2.0"},"2.2.3":{"num":"2.2.3","url":"https://www.w3.org/TR/WCAG22/#no-timing","scId":"WCAG2:no-timing","scAltId":["time-limits-no-exceptions"],"test":"WCAG2:time-limits-no-exceptions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#no-timing","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/no-timing.html","handle":"No Timing","level":"AAA","wcagType":"2.0"},"2.2.4":{"num":"2.2.4","url":"https://www.w3.org/TR/WCAG22/#interruptions","scId":"WCAG2:interruptions","scAltId":["time-limits-postponed"],"test":"WCAG2:time-limits-postponed","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#interruptions","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/interruptions.html","handle":"Interruptions","level":"AAA","wcagType":"2.0"},"2.2.5":{"num":"2.2.5","url":"https://www.w3.org/TR/WCAG22/#re-authenticating","scId":"WCAG2:re-authenticating","scAltId":["time-limits-server-timeout"],"test":"WCAG2:time-limits-server-timeout","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#re-authenticating","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/re-authenticating.html","handle":"Re-authenticating","level":"AAA","wcagType":"2.0"},"2.2.6":{"num":"2.2.6","url":"https://www.w3.org/TR/WCAG22/#timeouts","scId":"WCAG2:timeouts","scAltId":[],"test":"WCAG2:WCAG2:timeouts","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#timeouts","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/timeouts.html","handle":"Timeouts","level":"AAA","wcagType":"2.1"},"2.3.1":{"num":"2.3.1","url":"https://www.w3.org/TR/WCAG22/#three-flashes-or-below-threshold","scId":"WCAG2:three-flashes-or-below-threshold","scAltId":["seizure-does-not-violate"],"test":"WCAG2:seizure-does-not-violate","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#three-flashes-or-below-threshold","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/three-flashes-or-below-threshold.html","handle":"Three Flashes or Below Threshold","level":"A","wcagType":"2.0"},"2.3.2":{"num":"2.3.2","url":"https://www.w3.org/TR/WCAG22/#three-flashes","scId":"WCAG2:three-flashes","scAltId":["seizure-three-times"],"test":"WCAG2:seizure-three-times","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#three-flashes","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/three-flashes.html","handle":"Three Flashes","level":"AAA","wcagType":"2.0"},"2.3.3":{"num":"2.3.3","url":"https://www.w3.org/TR/WCAG22/#animation-from-interactions","scId":"WCAG2:animation-from-interactions","scAltId":[],"test":"WCAG2:WCAG2:animation-from-interactions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#animation-from-interactions","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/animation-from-interactions.html","handle":"Animation from Interactions","level":"AAA","wcagType":"2.1"},"2.4.1":{"num":"2.4.1","url":"https://www.w3.org/TR/WCAG22/#bypass-blocks","scId":"WCAG2:bypass-blocks","scAltId":["navigation-mechanisms-skip"],"test":"WCAG2:navigation-mechanisms-skip","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#bypass-blocks","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/bypass-blocks.html","handle":"Bypass Blocks","level":"A","wcagType":"2.0"},"2.4.2":{"num":"2.4.2","url":"https://www.w3.org/TR/WCAG22/#page-titled","scId":"WCAG2:page-titled","scAltId":["navigation-mechanisms-title"],"test":"WCAG2:navigation-mechanisms-title","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#page-titled","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/page-titled.html","handle":"Page Titled","level":"A","wcagType":"2.0"},"2.4.3":{"num":"2.4.3","url":"https://www.w3.org/TR/WCAG22/#focus-order","scId":"WCAG2:focus-order","scAltId":["navigation-mechanisms-focus-order"],"test":"WCAG2:navigation-mechanisms-focus-order","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-order","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-order.html","handle":"Focus Order","level":"A","wcagType":"2.0"},"2.4.4":{"num":"2.4.4","url":"https://www.w3.org/TR/WCAG22/#link-purpose-in-context","scId":"WCAG2:link-purpose-in-context","scAltId":["navigation-mechanisms-refs"],"test":"WCAG2:navigation-mechanisms-refs","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#link-purpose-in-context","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/link-purpose-in-context.html","handle":"Link Purpose (In Context)","level":"A","wcagType":"2.0"},"2.4.5":{"num":"2.4.5","url":"https://www.w3.org/TR/WCAG22/#multiple-ways","scId":"WCAG2:multiple-ways","scAltId":["navigation-mechanisms-mult-loc"],"test":"WCAG2:navigation-mechanisms-mult-loc","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#multiple-ways","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/multiple-ways.html","handle":"Multiple Ways","level":"AA","wcagType":"2.0"},"2.4.6":{"num":"2.4.6","url":"https://www.w3.org/TR/WCAG22/#headings-and-labels","scId":"WCAG2:headings-and-labels","scAltId":["navigation-mechanisms-descriptive"],"test":"WCAG2:navigation-mechanisms-descriptive","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#headings-and-labels","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/headings-and-labels.html","handle":"Headings and Labels","level":"AA","wcagType":"2.0"},"2.4.7":{"num":"2.4.7","url":"https://www.w3.org/TR/WCAG22/#focus-visible","scId":"WCAG2:focus-visible","scAltId":["navigation-mechanisms-focus-visible"],"test":"WCAG2:navigation-mechanisms-focus-visible","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-visible","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-visible.html","handle":"Focus Visible","level":"AA","wcagType":"2.0"},"2.4.8":{"num":"2.4.8","url":"https://www.w3.org/TR/WCAG22/#location","scId":"WCAG2:location","scAltId":["navigation-mechanisms-location"],"test":"WCAG2:navigation-mechanisms-location","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#location","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/location.html","handle":"Location","level":"AAA","wcagType":"2.0"},"2.4.9":{"num":"2.4.9","url":"https://www.w3.org/TR/WCAG22/#link-purpose-link-only","scId":"WCAG2:link-purpose-link-only","scAltId":["navigation-mechanisms-link"],"test":"WCAG2:navigation-mechanisms-link","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#link-purpose-link-only","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/link-purpose-link-only.html","handle":"Link Purpose (Link Only)","level":"AAA","wcagType":"2.0"},"2.4.10":{"num":"2.4.10","url":"https://www.w3.org/TR/WCAG22/#section-headings","scId":"WCAG2:section-headings","scAltId":["navigation-mechanisms-headings"],"test":"WCAG2:navigation-mechanisms-headings","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#section-headings","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/section-headings.html","handle":"Section Headings","level":"AAA","wcagType":"2.0"},"2.4.11":{"num":"2.4.11","url":"https://www.w3.org/TR/WCAG22/#focus-not-obscured-minimum","scId":"WCAG2:focus-not-obscured-minimum","scAltId":["focus-not-obscured-minimum-alt"],"test":"WCAG2:focus-not-obscured-minimum-test","howToMeetUrl":"https://www.w3.org/TR/WCAG22/#focus-not-obscured-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-not-obscured-minimum.html","handle":"Focus Not Obscured (Minimum)","level":"AA","wcagType":"2.2"},"2.4.12":{"num":"2.4.12","url":"https://www.w3.org/TR/WCAG22/#focus-not-obscured-enhanced","scId":"WCAG2:focus-not-obscured-enhanced","scAltId":[],"test":"WCAG2:focus-not-obscured-enhanced-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-not-obscured-enhanced","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-not-obscured-enhanced.html","handle":"Focus Not Obscured (Enhanced)","level":"AAA","wcagType":"2.2"},"2.4.13":{"num":"2.4.13","url":"https://www.w3.org/TR/WCAG22/#focus-appearance","scId":"WCAG2:focus-appearance","scAltId":[],"test":"WCAG2:focus-appearance","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#focus-appearance","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/focus-appearance.html","handle":"Focus Appearance","level":"AAA","wcagType":"2.2"},"2.5.1":{"num":"2.5.1","url":"https://www.w3.org/TR/WCAG22/#pointer-gestures","scId":"WCAG2:pointer-gestures","scAltId":[],"test":"WCAG2:pointer-gestures-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pointer-gestures","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pointer-gestures.html","handle":"Pointer Gestures","level":"A","wcagType":"2.1"},"2.5.2":{"num":"2.5.2","url":"https://www.w3.org/TR/WCAG22/#pointer-cancellation","scId":"WCAG2:pointer-cancellation","scAltId":[],"test":"WCAG2:WCAG2:pointer-cancellation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pointer-cancellation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pointer-cancellation.html","handle":"Pointer Cancellation","level":"A","wcagType":"2.1"},"2.5.3":{"num":"2.5.3","url":"https://www.w3.org/TR/WCAG22/#label-in-name","scId":"WCAG2:label-in-name","scAltId":[],"test":"WCAG2:WCAG2:label-in-name","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#label-in-name","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/label-in-name.html","handle":"Label in Name","level":"A","wcagType":"2.1"},"2.5.4":{"num":"2.5.4","url":"https://www.w3.org/TR/WCAG22/#motion-actuation","scId":"WCAG2:motion-actuation","scAltId":[],"test":"WCAG2:WCAG2:motion-actuation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#motion-actuation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/motion-actuation.html","handle":"Motion Actuation","level":"A","wcagType":"2.1"},"2.5.5":{"num":"2.5.5","url":"https://www.w3.org/TR/WCAG22/#target-size","scId":"WCAG2:target-size","scAltId":[],"test":"WCAG2:WCAG2:target-size","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#target-size","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/target-size.html","handle":"Target Size","level":"AAA","wcagType":"2.1"},"2.5.6":{"num":"2.5.6","url":"https://www.w3.org/TR/WCAG22/#concurrent-input-mechanisms","scId":"WCAG2:concurrent-input-mechanisms","scAltId":[],"test":"WCAG2:WCAG2:concurrent-input-mechanisms","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#concurrent-input-mechanisms","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/concurrent-input-mechanisms.html","handle":"Concurrent Input Mechanisms","level":"AAA","wcagType":"2.1"},"2.5.7":{"num":"2.5.7","url":"https://www.w3.org/TR/WCAG22/#dragging-movements","scId":"WCAG2:dragging-movement","scAltId":["dragging-movement-alt"],"test":"WCAG2:dragging-movement-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/Understanding/dragging-movements.html","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/dragging-movements.html","handle":"Dragging Movement","level":"AA","wcagType":"2.2"},"2.5.8":{"num":"2.5.8","url":"https://www.w3.org/TR/WCAG22/#target-size-minimum","scId":"WCAG2:minimum-target-size","scAltId":["minimum-target-size-alt"],"test":"WCAG2:minimum-target-size-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#target-size-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/target-size-minimum.html","handle":"Minimum Target Size","level":"AA","wcagType":"2.2"},"3.1.1":{"num":"3.1.1","url":"https://www.w3.org/TR/WCAG22/#language-of-page","scId":"WCAG2:language-of-page","scAltId":["meaning-doc-lang-id"],"test":"WCAG2:meaning-doc-lang-id","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#language-of-page","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/language-of-page.html","handle":"Language of Page","level":"A","wcagType":"2.0"},"3.1.2":{"num":"3.1.2","url":"https://www.w3.org/TR/WCAG22/#language-of-parts","scId":"WCAG2:language-of-parts","scAltId":["meaning-other-lang-id"],"test":"WCAG2:meaning-other-lang-id","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#language-of-parts","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/language-of-parts.html","handle":"Language of Parts","level":"AA","wcagType":"2.0"},"3.1.3":{"num":"3.1.3","url":"https://www.w3.org/TR/WCAG22/#unusual-words","scId":"WCAG2:unusual-words","scAltId":["meaning-idioms"],"test":"WCAG2:meaning-idioms","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#unusual-words","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/unusual-words.html","handle":"Unusual Words","level":"AAA","wcagType":"2.0"},"3.1.4":{"num":"3.1.4","url":"https://www.w3.org/TR/WCAG22/#abbreviations","scId":"WCAG2:abbreviations","scAltId":["meaning-located"],"test":"WCAG2:meaning-located","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#abbreviations","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/abbreviations.html","handle":"Abbreviations","level":"AAA","wcagType":"2.0"},"3.1.5":{"num":"3.1.5","url":"https://www.w3.org/TR/WCAG22/#reading-level","scId":"WCAG2:reading-level","scAltId":["meaning-supplements"],"test":"WCAG2:meaning-supplements","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#reading-level","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/reading-level.html","handle":"Reading Level","level":"AAA","wcagType":"2.0"},"3.1.6":{"num":"3.1.6","url":"https://www.w3.org/TR/WCAG22/#pronunciation","scId":"WCAG2:pronunciation","scAltId":["meaning-pronunciation"],"test":"WCAG2:meaning-pronunciation","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#pronunciation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/pronunciation.html","handle":"Pronunciation","level":"AAA","wcagType":"2.0"},"3.2.1":{"num":"3.2.1","url":"https://www.w3.org/TR/WCAG22/#on-focus","scId":"WCAG2:on-focus","scAltId":["consistent-behavior-receive-focus"],"test":"WCAG2:consistent-behavior-receive-focus","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#on-focus","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/on-focus.html","handle":"On Focus","level":"A","wcagType":"2.0"},"3.2.2":{"num":"3.2.2","url":"https://www.w3.org/TR/WCAG22/#on-input","scId":"WCAG2:on-input","scAltId":["consistent-behavior-unpredictable-change"],"test":"WCAG2:consistent-behavior-unpredictable-change","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#on-input","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/on-input.html","handle":"On Input","level":"A","wcagType":"2.0"},"3.2.3":{"num":"3.2.3","url":"https://www.w3.org/TR/WCAG22/#consistent-navigation","scId":"WCAG2:consistent-navigation","scAltId":["consistent-behavior-consistent-locations"],"test":"WCAG2:consistent-behavior-consistent-locations","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#consistent-navigation","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/consistent-navigation.html","handle":"Consistent Navigation","level":"AA","wcagType":"2.0"},"3.2.4":{"num":"3.2.4","url":"https://www.w3.org/TR/WCAG22/#consistent-identification","scId":"WCAG2:consistent-identification","scAltId":["consistent-behavior-consistent-functionality"],"test":"WCAG2:consistent-behavior-consistent-functionality","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#consistent-identification","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/consistent-identification.html","handle":"Consistent Identification","level":"AA","wcagType":"2.0"},"3.2.5":{"num":"3.2.5","url":"https://www.w3.org/TR/WCAG22/#change-on-request","scId":"WCAG2:change-on-request","scAltId":["consistent-behavior-no-extreme-changes-context"],"test":"WCAG2:consistent-behavior-no-extreme-changes-context","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#change-on-request","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/change-on-request.html","handle":"Change on Request","level":"AAA","wcagType":"2.0"},"3.2.6":{"num":"3.2.6","url":"https://www.w3.org/TR/WCAG22/#consistent-help","scId":"WCAG2:consistent-help","scAltId":["consistent-help-alt"],"test":"WCAG2:consistent-help-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#consistent-help","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/consistent-help.html","handle":"Consistent Help","level":"AA","wcagType":"2.2"},"3.3.1":{"num":"3.3.1","url":"https://www.w3.org/TR/WCAG22/#error-identification","scId":"WCAG2:error-identification","scAltId":["minimize-error-identified"],"test":"WCAG2:minimize-error-identified","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-identification","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-identification.html","handle":"Error Identification","level":"A","wcagType":"2.0"},"3.3.2":{"num":"3.3.2","url":"https://www.w3.org/TR/WCAG22/#labels-or-instructions","scId":"WCAG2:labels-or-instructions","scAltId":["minimize-error-cues"],"test":"WCAG2:minimize-error-cues","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#labels-or-instructions","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/labels-or-instructions.html","handle":"Labels or Instructions","level":"A","wcagType":"2.0"},"3.3.3":{"num":"3.3.3","url":"https://www.w3.org/TR/WCAG22/#error-suggestion","scId":"WCAG2:error-suggestion","scAltId":["minimize-error-suggestions"],"test":"WCAG2:minimize-error-suggestions","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-suggestion","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-suggestion.html","handle":"Error Suggestion","level":"AA","wcagType":"2.0"},"3.3.4":{"num":"3.3.4","url":"https://www.w3.org/TR/WCAG22/#error-prevention-legal-financial-data","scId":"WCAG2:error-prevention-legal-financial-data","scAltId":["minimize-error-reversible"],"test":"WCAG2:minimize-error-reversible","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-prevention-legal-financial-data","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-prevention-legal-financial-data.html","handle":"Error Prevention (Legal, Financial, Data)","level":"AA","wcagType":"2.0"},"3.3.5":{"num":"3.3.5","url":"https://www.w3.org/TR/WCAG22/#help","scId":"WCAG2:help","scAltId":["minimize-error-context-help"],"test":"WCAG2:minimize-error-context-help","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#help","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/help.html","handle":"Help","level":"AAA","wcagType":"2.0"},"3.3.6":{"num":"3.3.6","url":"https://www.w3.org/TR/WCAG22/#error-prevention-all","scId":"WCAG2:error-prevention-all","scAltId":["minimize-error-reversible-all"],"test":"WCAG2:minimize-error-reversible-all","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#error-prevention-all","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/error-prevention-all.html","handle":"Error Prevention (All)","level":"AAA","wcagType":"2.0"},"3.3.7":{"num":"3.3.7","url":"https://www.w3.org/TR/WCAG22/#redundant-entry","scId":"WCAG2:redundant-entry","scAltId":["redundant-entry-alt"],"test":"WCAG2:redundant-entry-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#redundant-entry","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/redundant-entry.html","handle":"Redundant Entry","level":"AA","wcagType":"2.2"},"3.3.8":{"num":"3.3.8","url":"https://www.w3.org/TR/WCAG22/#accessible-authentication-minimum","scId":"WCAG2:accessible-authentication-minimum","scAltId":["accessible-authentication-minimum-alt"],"test":"WCAG2:accessible-authentication-minimum-test","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#accessible-authentication-minimum","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/accessible-authentication-minimum.html","handle":"Accessible Authentication (Minimum)","level":"AA","wcagType":"2.2"},"3.3.9":{"num":"3.3.9","url":"https://www.w3.org/TR/WCAG22/#accessible-authentication-enhanced","scId":"WCAG2:accessible-authentication-enhanced","scAltId":[],"test":"WCAG2:accessible-authentication-enhanced","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#accessible-authentication-enhanced","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/accessible-authentication-enhanced.html","handle":"Accessible Authentication (Enhanced)","level":"AAA","wcagType":"2.2"},"4.1.1":{"num":"4.1.1","url":"https://www.w3.org/TR/WCAG22/#parsing","scId":"WCAG2:parsing","scAltId":["ensure-compat-parses"],"test":"WCAG2:ensure-compat-parses","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/?versions=2.1#parsing","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/parsing.html","handle":"Parsing","level":"A","wcagType":"2.0"},"4.1.2":{"num":"4.1.2","url":"https://www.w3.org/TR/WCAG22/#name-role-value","scId":"WCAG2:name-role-value","scAltId":["ensure-compat-rsv"],"test":"WCAG2:ensure-compat-rsv","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#name-role-value","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/name-role-value.html","handle":"Name, Role, Value","level":"A","wcagType":"2.0"},"4.1.3":{"num":"4.1.3","url":"https://www.w3.org/TR/WCAG22/#status-messages","scId":"WCAG2:status-messages","scAltId":[],"test":"WCAG2:status-messages","howToMeetUrl":"https://www.w3.org/WAI/WCAG22/quickref/#status-messages","understandingUrl":"https://www.w3.org/WAI/WCAG22/Understanding/status-messages.html","handle":"Status Messages","level":"AA","wcagType":"2.1"},"HTML":{"num":"HTML","url":"https://html.spec.whatwg.org/multipage/","scId":"","scAltId":[],"test":"","howToMeetUrl":"https://html.spec.whatwg.org/multipage/","understandingUrl":"https://html.spec.whatwg.org/multipage/","handle":"specification","level":"NA","wcagType":"NA"},"ARIA":{"num":"ARIA","url":"https://www.w3.org/TR/wai-aria-1.2/","scId":"","scAltId":[],"test":"","howToMeetUrl":"https://www.w3.org/TR/wai-aria-1.2/","understandingUrl":"https://www.w3.org/TR/wai-aria-1.2/","handle":"specification","level":"NA","wcagType":"NA"}}')}};const t={};function i(a){const n=t[a];if(void 0!==n)return n.exports;const l=t[a]={exports:{}};return e[a].call(l.exports,l,l.exports,i),l.exports}let a={};(()=>{let e=a;Object.defineProperty(e,"__esModule",{value:!0}),e.checkDemo=e.SRViewer=e.SRCursor=e.SRController=e.DOMWalker=e.Config=e.ARIAMapper=e.Checker=e.Context=void 0;var t=i(920);Object.defineProperty(e,"Context",{enumerable:!0,get:function(){return t.Context}});var n=i(7412);Object.defineProperty(e,"Checker",{enumerable:!0,get:function(){return n.Checker}});var l=i(9955);Object.defineProperty(e,"ARIAMapper",{enumerable:!0,get:function(){return l.ARIAMapper}});var r=i(4516);Object.defineProperty(e,"Config",{enumerable:!0,get:function(){return r.Config}});var o=i(3864);Object.defineProperty(e,"DOMWalker",{enumerable:!0,get:function(){return o.DOMWalker}});var s=i(5233);Object.defineProperty(e,"SRController",{enumerable:!0,get:function(){return s.SRController}});var u=i(8195);Object.defineProperty(e,"SRCursor",{enumerable:!0,get:function(){return u.SRCursor}});var d=i(8107);Object.defineProperty(e,"SRViewer",{enumerable:!0,get:function(){return d.SRViewer}}),e.checkDemo=function(e){e||(e=0);var t=new n.Checker;setTimeout(function(){t.check(document.documentElement,["IBM_Accessibility","IBM_Design"]).then(function(e){console.log(e);for(var t={FAIL:0,POTENTIAL:1,MANUAL:2,PASS:3},i=0;i<e.results.length;++i)"PASS"===e.results[i].value[1]&&e.results.splice(i--,1);e.results.sort(function(e,i){return e.category!=i.category?e.category.localeCompare(i.category):e.path.aria===i.path.aria?t[e.value[1]]-t[i.value[1]]:e.path.aria.localeCompare(i.path.aria)});for(var a=null,n=null,l=0,r=e.results;l<r.length;l++){var o=r[l];n!==o.category&&(null!==n&&(console.groupEnd(),console.groupEnd(),a=null),n=o.category,console.group(o.category)),o.path.aria!=a&&(null!==a&&console.groupEnd(),""===(a=o.path.aria)?console.group("page"):console.group(a)),console.log(o.value,o.message)}console.groupEnd(),console.groupEnd()})},e)}})(),ace=a})(); \ No newline at end of file diff --git a/rule-server/src/static/archives/2026.07.13/js/ace.js.LICENSE.txt b/rule-server/src/static/archives/2026.07.13/js/ace.js.LICENSE.txt new file mode 100644 index 000000000..614ccacb5 --- /dev/null +++ b/rule-server/src/static/archives/2026.07.13/js/ace.js.LICENSE.txt @@ -0,0 +1,15 @@ +/*! + * Copyright:: 2016,2017,2019,2020- IBM, Inc + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */